Index: /main/tags/2.38/gsdl/Install.txt
===================================================================
--- /main/tags/2.38/gsdl/Install.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/Install.txt	(revision 21083)
@@ -0,0 +1,64 @@
+Note: more up-to-date notes may be available on our website, at
+http://www.cs.waikato.ac.nz/~nzdl/gsdl-docs/compiling.html 
+
+-- Compiling and installing on Unix --
+
+cd to the top level gsdl directory (i.e. the directory where this file
+lives) and perform the following three steps.
+
+1. ./configure
+2. make
+3. make install
+
+This will install the library executable to gsdl/cgi-bin. If you want to
+run Greenstone from a system cgi-bin directory you'll need to move the
+library executable and gsdlsite.cfg from gsdl/cgi-bin to your system
+cgi-bin.
+
+Note that the Greenstone directory structure is important to the operation
+of the software. Therefore the --prefix, --bindir etc. options to configure
+make no sense and will have no effect. If you want Greenstone to be
+installed somewhere specific (say /usr/local) you'll need to move the
+entire gsdl directory there.
+
+-- Compiling on Windows --
+
+Greenstone has been successfully compiled using Microsoft Visual C++
+versions 4.2 and 6.0. If anyone succeeds in compiling Greenstone with
+another compiler (or another version of VC++) we'd appreciate hearing about
+it at greenstone@cs.waikato.ac.nz.
+
+The major difference between compiling with VC++ 4.2 compared with VC++ 6.0
+is that 4.2 must use the STLport standard template library (packaged with
+Greenstone) while VC++ 6.0 may use its own built in STL implementation.
+
+Perform the following steps to compile and install Greenstone. Note that
+some parts of the process described are specific to one or other of the two
+compilation options mentioned above (STLport or non-STLport). These steps
+are marked as such.
+
+1. Unzip the following zip archives (into the directories in which the
+   zip files themselves are contained).
+
+   * gsdl\packages\windows\gdbm\gdbm.zip
+   * gsdl\packages\windows\crypt\crypt.zip
+   * gsdl\packages\windows\stlport\stlport.zip (STLport version only)
+
+2. To use VC++ command line tools you may need to execute the
+   MSDEV\BIN\VCVARS32.BAT batch file to set up your environment.
+
+3. cd to the top level gsdl directory (i.e. the directory where this file
+   lives).
+
+4. compile the web library (library.exe) with 
+   "nmake /f win32.mak USE_STLPORT=1" (STLport version) 
+   or 
+   "nmake /f win32.mak" (non-STLport version).
+
+5. compile the local library (server.exe) with
+   "nmake /f win32.mak USE_STLPORT=1 LOCAL_LIBRARY=1" (STLport version)
+   or
+   "nmake /f win32.mak LOCAL_LIBRARY=1" (non-STLport version)
+
+This will install library.exe to the gsdl\cgi-bin directory and server.exe
+to the top level gsdl directory.
Index: /main/tags/2.38/gsdl/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/Makefile.in	(revision 21083)
@@ -0,0 +1,107 @@
+###########################################################################
+#
+# Makefile -- gsdl
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+srcdir = @srcdir@
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+@SET_MAKE@
+CC = @CC@
+CXX = @CXX@
+CFLAGS = @CFLAGS@
+CXXFLAGS = @CXXFLAGS@
+LIBS   = @LIBS@
+MDEFINES =
+TOPSRC = `pwd`
+
+GSDLOS = @gsdlos@
+
+COMPILE = $(CC) -c
+
+SOURCES = 
+
+OBJECTS = 
+
+ALLFILES = $(OBJECTS)
+
+INSTALLDIRS = src/recpt src/txt2db src/db2txt src/hashfile src/getpw packages/mg src/phind/generate packages src/mgpp
+
+MODULEDIRS = @MODULEDIRS@
+
+OTHERDIRS = packages packages/mg lib src/mgpp src/colservr src/recpt src/txt2db src/db2txt src/hashfile src/getpw src/phind/generate
+
+all:
+	for odir in $(OTHERDIRS); do \
+	  echo making $@ in $$odir; \
+	  (cd $$odir && $(MAKE) $(MDEFINES) $@) || exit 1; \
+	done
+
+#	for odir in $(MODULEDIRS); do \
+#	  echo making $@ in $$odir; \
+#	  (cd $$odir && $(MAKE) $(MDEFINES) $@) || exit 1; \
+#	done
+
+install: all
+
+	for idir in $(INSTALLDIRS); do \
+	  echo installing $$idir; \
+	  (cd $$idir && $(MAKE) install) || exit 1; \
+	done
+
+# added test to check existence of Makefile, as src/recpt is in
+# both INSTALLDIRS and OTHERDIRS - can't make distclean twice!
+distclean: clean
+	rm -f Makefile config.cache config.h config.log stamp-h config.status
+	for subdir in $(INSTALLDIRS) $(OTHERDIRS); do \
+	  echo cleaning $@ in $$subdir; \
+	  (cd $$subdir && if test -e Makefile; then $(MAKE) distclean;fi) || exit 1; \
+	done
+
+clean:
+	for subdir in $(INSTALLDIRS) $(OTHERDIRS); do \
+	  echo cleaning $@ in $$subdir; \
+	  (cd $$subdir && $(MAKE) clean) || exit 1; \
+	done
+
+# For an explanation of the following Makefile rules, see node
+# `Automatic Remaking' in GNU Autoconf documentation.
+Makefile: Makefile.in config.status
+	CONFIG_FILES=$@ CONFIG_HEADERS= ./config.status
+config.status: configure
+	./config.status --recheck
+configure: configure.in aclocal.m4
+	cd $(srcdir) && autoconf
+
+config.h: stamp-h
+stamp-h: config.h.in config.status
+	CONFIG_FILES= CONFIG_HEADERS=config.h ./config.status
+config.h.in: stamp-h.in
+stamp-h.in: configure.in aclocal.m4 acconfig.h
+	cd $(srcdir) && autoheader
+	$(TOUCH) $(srcdir)/stamp-h.in
+
+
+
Index: /main/tags/2.38/gsdl/WIN32cfg.h
===================================================================
--- /main/tags/2.38/gsdl/WIN32cfg.h	(revision 21083)
+++ /main/tags/2.38/gsdl/WIN32cfg.h	(revision 21083)
@@ -0,0 +1,163 @@
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+/* #undef _ALL_SOURCE */
+#endif
+
+/* 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.  */
+#define HAVE_ALLOCA 1
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have the vprintf function.  */
+#define HAVE_VPRINTF 1
+
+/* Define if on MINIX.  */
+/* #undef _MINIX */
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+/* #undef _POSIX_1_SOURCE */
+
+/* Define if you need to in order for stat and other things to work.  */
+/* #undef _POSIX_SOURCE */
+
+/* Define as the return type of signal handlers (int or void).  */
+#define RETSIGTYPE void
+
+/* 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.  */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+/* #define TIME_WITH_SYS_TIME 1 */
+
+/* Define if your <sys/time.h> declares struct tm.  */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define to the name of the distribution.  */
+#define PACKAGE "mg"
+
+/* Define to the version of the distribution.  */
+#define VERSION "1.2"
+
+/* Define to 1 if you have the valloc function.  */
+/* #define HAVE_VALLOC 1 */
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#define PROTOTYPES 1
+
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+/* #undef WITH_DMALLOC */
+
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+/* #undef WITH_REGEX */
+
+/* Some braindead header files do not have the requ'd function declarations */
+#define HAVE_FGETC_DECL 1
+#define HAVE_FREAD_DECL 1
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+/* #define HAVE_PR_BRKSIZE 1 */
+
+/* Define if you have the ftime function.  */
+/* #undef HAVE_FTIME */
+
+/* Define if you have the getpagesize function.  */
+/* #undef HAVE_GETPAGESIZE */
+
+/* Define if you have the getrusage function.  */
+/* #undef HAVE_GETRUSAGE */
+
+/* Define if you have the mallinfo function.  */
+/* #undef HAVE_MALLINFO */
+
+/* Define if you have the select function.  */
+#define HAVE_SELECT 1
+
+/* Define if you have the setbuffer function.  */
+/* #undef HAVE_SETBUFFER */
+
+/* Define if you have the strftime function.  */
+#define HAVE_STRFTIME 1
+
+/* Define if you have the strtol function.  */
+#define HAVE_STRTOL 1
+
+/* Define if you have the times function.  */
+/* #define HAVE_TIMES 1 */
+
+/* Define if you have the valloc function.  */
+/* #define HAVE_VALLOC 1 */
+
+/* Define if you have the <dirent.h> header file.  */
+/* #define HAVE_DIRENT_H 1 */
+
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <limits.h> header file.  */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <memory.h> header file.  */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the <ndir.h> header file.  */
+/* #undef HAVE_NDIR_H */
+
+/* Define if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <sys/dir.h> header file.  */
+/* #undef HAVE_SYS_DIR_H */
+
+/* Define if you have the <sys/ndir.h> header file.  */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define if you have the <sys/procfs.h> header file.  */
+/* #define HAVE_SYS_PROCFS_H 1 */
+
+/* Define if you have the <sys/time.h> header file.  */
+/* #define HAVE_SYS_TIME_H 1 */
+
+/* Define if you have the <unistd.h> header file.  */
+/* #define HAVE_UNISTD_H 1 */
+
+/* Define if you have the m library (-lm).  */
+#define HAVE_LIBM 1
Index: /main/tags/2.38/gsdl/acconfig.h
===================================================================
--- /main/tags/2.38/gsdl/acconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/acconfig.h	(revision 21083)
@@ -0,0 +1,50 @@
+/* Special definitions for mg, processed by autoheader.
+   Created by [TS:Aug/95] 
+   by grepping for AC_DEFINE on configure.in and using the appropriate defs 
+   of acconfig.h used by GNU tar.
+*/
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define if `union wait' is the type of the first arg to wait functions.  */
+#undef HAVE_UNION_WAIT
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
+
+/* Define FASTCGI if needsbe */
+#undef USE_FASTCGI
+
+/* Define USE_CORBA if needsbe */
+#undef USE_CORBA
+
+/* Define MICO_DIR if needsbe */
+#undef MICO_DIR
+
+/* Define MICO_VERSION if required */
+#undef MICO_VERSION
+
+
+
Index: /main/tags/2.38/gsdl/aclocal.m4
===================================================================
--- /main/tags/2.38/gsdl/aclocal.m4	(revision 21083)
+++ /main/tags/2.38/gsdl/aclocal.m4	(revision 21083)
@@ -0,0 +1,141 @@
+# Local additions to Autoconf macros.
+# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+# François Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# [TS:Aug/95] - chopped out the NLS stuff which I don't support
+
+## ------------------------------- ##
+## Check for function prototypes.  ##
+## ------------------------------- ##
+
+AC_DEFUN(fp_C_PROTOTYPES,
+[AC_REQUIRE([fp_PROG_CC_STDC])
+AC_MSG_CHECKING([for function prototypes])
+if test "$ac_cv_prog_cc_stdc" != no; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(PROTOTYPES)
+  U= ANSI2KNR=
+else
+  AC_MSG_RESULT(no)
+  U=_ ANSI2KNR=ansi2knr
+fi
+AC_SUBST(U)dnl
+AC_SUBST(ANSI2KNR)dnl
+])
+
+## ----------------------------------------- ##
+## ANSIfy the C compiler whenever possible.  ##
+## ----------------------------------------- ##
+
+# @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 defines @code{__STDC__} to 1 and
+# 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{ac_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(fp_PROG_CC_STDC,
+[AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(ac_cv_prog_cc_stdc,
+[ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  AC_TRY_COMPILE(
+[#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+], [int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};],
+[ac_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CFLAGS="$ac_save_CFLAGS"
+])
+AC_MSG_RESULT($ac_cv_prog_cc_stdc)
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+])
+
+## --------------------------------------------------------- ##
+## Use AC_PROG_INSTALL, supplementing it with INSTALL_SCRIPT ##
+## substitution.					     ##
+## --------------------------------------------------------- ##
+
+AC_DEFUN(fp_PROG_INSTALL,
+[AC_PROG_INSTALL
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL} -m 755'
+AC_SUBST(INSTALL_SCRIPT)dnl
+])
+
+## ----------------------------------- ##
+## Check if --with-dmalloc was given.  ##
+## ----------------------------------- ##
+
+# I just checked, and GNU rx seems to work fine with a slightly
+# modified GNU m4.  So, I put out the test below in my aclocal.m4,
+# and will try to use it in my things.  The idea is to distribute
+# rx.[hc] and regex.[hc] together, for a while.  The WITH_REGEX symbol
+# (which should also be documented in acconfig.h) is used to decide
+# which of regex.h or rx.h should be included in the application.
+#
+# If `./configure --with-regex' is given, the package will use
+# the older regex.  Else, a check is made to see if rx is already
+# installed, as with newer Linux'es.  If not found, the package will
+# use the rx from the distribution.  If found, the package will use
+# the system's rx which, on Linux at least, will result in a smaller
+# executable file.
+
+AC_DEFUN(fp_WITH_DMALLOC,
+[AC_MSG_CHECKING(if malloc debugging is wanted)
+AC_ARG_WITH(dmalloc,
+[  --with-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz],
+[if test "$withval" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(WITH_DMALLOC)
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  AC_MSG_RESULT(no)
+fi], [AC_MSG_RESULT(no)])
+])
+
+## --------------------------------- ##
+## Check if --with-regex was given.  ##
+## --------------------------------- ##
+
+AC_DEFUN(fp_WITH_REGEX,
+[AC_MSG_CHECKING(which of rx or regex is wanted)
+AC_ARG_WITH(regex,
+[  --with-regex            use older regex in lieu of GNU rx for matching],
+[if test "$withval" = yes; then
+  ac_with_regex=1
+  AC_MSG_RESULT(regex)
+  AC_DEFINE(WITH_REGEX)
+  LIBOBJS="$LIBOBJS regex.o"
+fi])
+if test -z "$ac_with_regex"; then
+  AC_MSG_RESULT(rx)
+  AC_CHECK_FUNC(re_rx_search, , [LIBOBJS="$LIBOBJS rx.o"])
+fi
+AC_SUBST(LIBOBJS)dnl
+])
Index: /main/tags/2.38/gsdl/bin/script/build
===================================================================
--- /main/tags/2.38/gsdl/bin/script/build	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/build	(revision 21083)
@@ -0,0 +1,625 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# build --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# 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 perl script may be called directly or by running build.bat on
+# windows (build.bat is in bin\windows)
+
+# Note that this script has grown over time and now has many options for
+# use when called from within the collector. If it appears to
+# over-complicate things a little, that's why.
+
+package build;
+
+use FileHandle;
+use File::Copy;
+
+BEGIN {
+
+    die "GSDLHOME not set - did you remember to source setup.bash (unix) or " .
+	"run setup.bat (windows)?\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set - did you remember to source setup.bash (unix) or " .
+	"run setup.bat (windows)?\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+
+    STDOUT->autoflush(1);
+    STDERR->autoflush(1);
+}
+
+use lib qq($ENV{'GSDLHOME'}/perllib/cpan);
+use Mail::Sendmail;
+use parsargv;
+use util;
+use cfgread;
+
+# set up path - this allows for paths not to be supplied to system calls
+# and overcomes problems when GSDLHOME contains spaces (double quoting
+# the call doesn't work on win2k and probably other variants of winnt)
+my $path_separator = ":";
+$path_separator = ";" if $ENV{'GSDLOS'} =~ /^windows$/;
+$ENV{'PATH'} = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}) .
+    $path_separator . &util::filename_cat($ENV{'GSDLHOME'}, "bin", "script") .
+    $path_separator . $ENV{'PATH'};
+
+&parse_args (\@ARGV);
+
+my ($collection) = @ARGV;
+
+if (!defined $collection || $collection !~ /\w/) {
+    print STDERR "You must specify a collection to build\n";
+    &print_usage();
+    die "\n";
+}
+
+if ($optionfile =~ /\w/) {
+    open (OPTIONS, $optionfile) || die "Couldn't open $optionfile\n";
+    my $line = [];
+    my $options = [];
+    while (defined ($line = &cfgread::read_cfg_line ('build::OPTIONS'))) {
+	push (@$options, @$line);
+    }
+    close OPTIONS;
+    &parse_args ($options);
+}
+
+if ($maxdocs == -1) {
+    $maxdocs = "";
+} else {
+    $maxdocs = "-maxdocs $maxdocs";
+}
+
+my $cdir = $collectdir;
+$cdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect") unless $collectdir =~ /\w/;
+my $importdir = &util::filename_cat ($cdir, $collection, "import");
+my $archivedir = &util::filename_cat ($cdir, $collection, "archives");
+my $buildingdir = &util::filename_cat ($cdir, $collection, "building");
+my $indexdir = &util::filename_cat ($cdir, $collection, "index");
+my $bindir = &util::filename_cat ($ENV{'GSDLHOME'}, "bin");
+
+my $use_out = 0;
+my $outfile = $out;
+if ($out !~ /^(STDERR|STDOUT)$/i) {
+    open (OUT, ">$out") || die "Couldn't open output file $out\n";
+    $out = "OUT";
+    
+    # delete any existing .final file
+    &util::rm ("$outfile.final") if -e "$outfile.final";
+
+    $use_out = 1;
+}
+$out->autoflush(1);
+
+# delete any .kill file left laying around from a previously aborted build
+if (-e &util::filename_cat ($cdir, $collection, ".kill")) {
+    &util::rm (&util::filename_cat ($cdir, $collection, ".kill"));
+}
+
+# get maintainer email address from main.cfg
+my $maintainer = "NULL";
+my $main_cfg = &util::filename_cat ($ENV{'GSDLHOME'}, "etc", "main.cfg");
+my $cfgdata = &cfgread::read_cfg_file ($main_cfg, "maintainer");
+if (defined $cfgdata->{'maintainer'} && $cfgdata->{'maintainer'} =~ /\w/) {
+    $maintainer = $cfgdata->{'maintainer'};
+}
+# if maintainer is "NULL" email_events should be disabled
+if ($maintainer =~ /^NULL$/i) {
+    $email_events = "";
+}
+
+&main();
+
+if ($use_out) {
+    close OUT;
+
+    # if we've created a build log we'll copy it to the collection's etc
+    # directory
+    my ($etcdir);
+    if ($dontinstall) {
+	$etcdir = &util::filename_cat($collectdir, "etc", "build.log");
+    } else {
+	$etcdir = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection, "etc", "build.log");
+    }
+    
+    &util::cp($outfile, $etcdir);
+}
+
+sub print_usage {
+    print STDOUT "\n";
+    print STDOUT "build: Builds a Greenstone collection (i.e. runs import.pl and buildcol.pl\n";
+    print STDOUT "       then copies the resulting indexes to the correct place).\n\n";
+    print STDOUT "  usage: $0 [options] collection-name\n\n";
+    print STDOUT "  options:\n";
+    print STDOUT "   -optionfile file        Get options from file, useful on systems where\n";
+    print STDOUT "                           long command lines may cause problems\n";
+    print STDOUT "   -append                 Add new files to existing collection\n";
+    print STDOUT "   -remove_archives        Remove archives directory after successfully\n";
+    print STDOUT "                           building the collection.\n";
+    print STDOUT "   -remove_import          Remove import directory after successfully\n";
+    print STDOUT "                           importing the collection.\n";
+    print STDOUT "   -buildtype build|import If 'build' attempt to build directly\n";
+    print STDOUT "                           from archives directory (bypassing import\n";
+    print STDOUT "                           stage). Defaults to 'import'\n";
+    print STDOUT "   -maxdocs number         Maximum number of documents to build\n";
+    print STDOUT "   -download directory     Directory (or file) to get import documents from.\n";
+    print STDOUT "                           There may be multiple download directories and they\n";
+    print STDOUT "                           may be of type http://, ftp://, or file://\n";
+    print STDOUT "                           Note that any existing import directory will be\n";
+    print STDOUT "                           deleted to make way for the downloaded data if\n";
+    print STDOUT "                           a -download option is supplied\n";
+    print STDOUT "   -collectdir directory   Collection directory (defaults to " .
+	&util::filename_cat ($ENV{'GSDLHOME'}, "collect") . ")\n";
+    print STDOUT "   -dontinstall            Only applicable if -collectdir is set to something\n";
+    print STDOUT "                           other than the default. -dontinstall will suppress\n";
+    print STDOUT "                           the default behaviour which is to install the\n";
+    print STDOUT "                           collection to the gsdl/collect directory once it has\n";
+    print STDOUT "                           been built.\n";
+    print STDOUT "   -save_archives          Create a copy of the existing archives directory\n";
+    print STDOUT "                           called archives.org\n";
+    print STDOUT "   -out                    Filename or handle to print output status to.\n";
+    print STDOUT "                           The default is STDERR\n";
+    print STDOUT "   -statsfile name         Filename or handle to print import statistics to.\n";
+    print STDOUT "                           The default is STDERR\n";
+    print STDOUT "   -make_writable          If set build will make the collection and any\n";
+    print STDOUT "                           temporary files it created globally writable after\n";
+    print STDOUT "                           it finishes\n";
+    print STDOUT "   -log_events             Log important events (collection built successfully\n";
+    print STDOUT "                           etc.) to event_log_file\n";
+    print STDOUT "   -event_log_file file    File to append important events to (defaults to\n";
+    print STDOUT "                           " . &util::filename_cat ($ENV{'GSDLHOME'}, "etc", "events.txt") . "\n";
+    print STDOUT "   -email_events addr      Comma separated list of email addresses to mail\n";
+    print STDOUT "                           details of important collection building events\n";
+    print STDOUT "   -mail_server server     The outgoing (SMTP) mail server to be used by\n";
+    print STDOUT "                           email_events. email_events will be disabled if\n";
+    print STDOUT "                           mail_server isn't set\n";
+    print STDOUT "   -event_header file      File containing a header to go on any event\n";
+    print STDOUT "                           messages. If not specified build will create a\n";
+    print STDOUT "                           generic header\n\n";
+    print STDOUT "  [Type \"build | more\" if this help text scrolled off your screen]";
+    print STDOUT "\n" unless $ENV{'GSDLOS'} =~ /^windows$/i;
+}
+
+sub main {
+
+    if ($save_archives && -d $archivedir) {
+	print $out "caching original archives to ${archivedir}.org\n";
+	&util::cp_r ($archivedir, "${archivedir}.org");
+    }
+
+    # do the download thing if we have any -download options
+    if (scalar (@download)) {
+	# remove any existing import data
+	if (&has_content ($importdir)) {
+	    print $out "build: WARNING: removing contents of $importdir\n";
+	    &util::rm_r ($importdir);
+	}
+	
+	foreach $download_dir (@download) {
+
+	    # remove any leading or trailing whitespace from filenames (just in case)
+	    $download_dir =~ s/^\s+//;
+	    $download_dir =~ s/\s+$//;
+	    
+	    if ($download_dir =~ /^(http|ftp):\/\//) {
+		# use wget to mirror http or ftp urls
+		# options used are:
+		#  -P = the directory to download documents to
+		#  -np = don't ascend to parent directories. this means that only documents
+		#        that live in the same directory or below on the same server as
+		#        the given url will be downloaded
+		#  -nv = not too verbose
+		#  -r = recursively mirror
+		#  -N = use time-stamping to see if an up-to-date local copy of each 
+		#       file already exists. this may be useful if wget fails and 
+		#       is restarted
+		#  -l inf = infinite recursion depth
+		#  -R "*\?*" = don't download cgi based urls
+		#  -o = the output file to write download status to (only used if the -out
+		#       option was given to build)
+
+		my $download_cmd = "perl -S gsWget.pl -P \"$importdir\" -np -nv";
+		$download_cmd .= " -r -N -l inf -R \"*\\?*\"";
+		$download_cmd .= " -o \"$outfile.download\"" if $use_out;
+		$download_cmd .= " \"$download_dir\"";
+		system ($download_cmd);
+
+		# note that wget obeys the robot rules. this means that it will have
+		# downloaded a robots.txt file if one was present. since it's unlikely 
+		# anyone really wants to include it in a collection we'll delete it.
+		# robots.txt shouldn't be more than two directories deep (I think it will 
+		# always be exactly two deep but will look for it in the top directory too)
+		# so that's as far as we'll go looking for it.
+		if (opendir (DIR, $importdir)) {
+		    my @files = readdir DIR;
+		    closedir DIR;
+		    foreach my $file (@files) {
+			next if $file =~ /^\.\.?$/;
+			if ($file =~ /^robots.txt$/i) {
+			    &util::rm (&util::filename_cat ($importdir, $file));
+			    last;
+			} else {
+			    $file = &util::filename_cat ($importdir, $file);
+			    if (-d $file) {
+				if (opendir (DIR, $file)) {
+				    my @files2 = readdir DIR;
+				    closedir DIR;
+				    foreach my $file2 (@files2) {
+					if ($file2 =~ /^robots.txt$/i) {
+					    &util::rm (&util::filename_cat ($file, $file2));
+					    last;
+					}
+				    }
+				}
+			    }
+			}
+		    }
+		}
+
+		# if using output directory append the file download output to it
+		&append_file ($out, "$outfile.download");
+		
+	    } else {
+		# we assume anything not beginning with http:// or ftp://
+		# is a file or directory on the local file system.
+		$download_dir =~ s/^file:(\/\/)?//;
+		$download_dir =~ s/^\s+//; # may be whitespace between "file://" and the rest
+		
+		if (-e $download_dir) {
+		    # copy download_dir and all it contains to the import directory
+		    my $download_cmd = "perl -S filecopy.pl";
+		    $download_cmd .= " -collectdir \"$collectdir\"" if $collectdir =~ /\w/;
+		    $download_cmd .= " -out \"$outfile.download\"" if $use_out;
+		    $download_cmd .= " \"" . $download_dir . "\" " . $collection;
+		    system ($download_cmd);
+		    # if using output directory append the file download output to it
+		    &append_file ($out, "$outfile.download");
+		} else {
+		    print $out "WARNING: '$download_dir' does not exist\n";
+		}
+	    }
+	}
+    }
+
+    if (-e &util::filename_cat ($archivedir, "archives.inf")) {
+	if (&has_content ($importdir)) {
+	    if ($buildtype eq "build") {
+		&gsdl_build();
+	    } else {
+		&gsdl_import();
+		&gsdl_build();
+	    }
+	} else {
+	    # there are archives but no import, build directly from archives
+	    print $out "build: no import material was found, building directly\n";
+	    print $out "       from archives\n";
+	    &gsdl_build();
+	}
+    } else {
+	if (&has_content ($importdir)) {
+	    if ($buildtype eq "build") {
+		print $out "build: can't build directly from archives as no\n";
+		print $out "       imported archives exist (did you forget to\n";
+		print $out "       move the contents of $collection/import to\n";
+		print $out "       collection/archives?)\n";
+	    }
+	    &gsdl_import();
+	    if (&has_content ($archivedir, "^archives.inf\$")) {
+		&gsdl_build();
+	    } else {
+		my $msg = "build: ERROR: The collection could not be built as no\n";
+		$msg .=   "       valid data was imported. Are at least some of\n";
+		$msg .=   "       the files you imported in a format that can be\n";
+		$msg .=   "       processed by the specified Greenstone plugins?\n";
+		print $out $msg;
+		&log_event ($msg);
+		&final_out (6) if $use_out;
+		die "\n";
+	    }
+	} else {
+	    # no import or archives
+	    my $msg = "build: ERROR: The collection could not be built as it contains no data.\n";
+	    print $out $msg;
+	    &log_event ($msg);
+	    &final_out (1) if $use_out;
+	    die "\n";
+	}
+    }
+
+    if ($collectdir ne "" && !$dontinstall) {
+	my $install_collectdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect");
+	if (!&util::filenames_equal ($collectdir, $install_collectdir)) {
+	    
+	    # install collection to gsdl/collect
+	    print $out "installing the $collection collection\n";
+	    my $newdir = &util::filename_cat ($install_collectdir, $collection);
+	    my $olddir = &util::filename_cat ($collectdir, $collection);
+	    if (-d $newdir) {
+		my $msg = "build: Could not install collection as $newdir\n" .
+		    "       already exists. Collection will remain at\n$olddir\n";
+
+		print $out $msg;
+		&log_event ($msg);
+		&final_out (4) if $use_out;
+		die "\n";
+	    }
+	    if (!&File::Copy::move ($olddir, $newdir)) {
+		my $msg = "build: Failed to install collection to $newdir\n" .
+		    "       Collection will remain at $olddir\n";
+		print $out $msg;
+		&log_event ($msg);
+		&final_out (5) if $use_out;
+		die "\n";
+	    }
+	}
+    }
+
+    &log_event ("The $collection collection was built successfully\n");
+    &final_out (0) if $use_out;
+}
+
+sub gsdl_import {
+
+    print $out "importing the $collection collection\n\n";
+
+    my $import_cmd = "perl -S import.pl";
+    $import_cmd .= " -out \"$outfile.import\"" if $use_out;
+    $import_cmd .= " -removeold" unless $append;
+    $import_cmd .= " -collectdir \"$collectdir\"" if $collectdir =~ /\w/;
+    $import_cmd .= " -statsfile \"$statsfile\"" if $statsfile =~ /\w/;
+    $import_cmd .= " $maxdocs $collection";
+
+    system ($import_cmd);
+    # if using output directory append the import output to it
+    &append_file ($out, "$outfile.import");
+
+    if (-e &util::filename_cat ($archivedir, "archives.inf")) {
+	print $out "$collection collection imported successfully\n\n";
+	if ($remove_import) {
+	    print $out "removing import directory ($importdir)\n";
+	    &util::rm_r ($importdir);
+	}
+    } else {
+	my $msg = "build: ERROR: import.pl failed\n";
+	print $out "\n$msg";
+	&log_event ($msg);
+	&final_out (2) if $use_out;
+	die "\n";
+    }
+}
+
+sub gsdl_build {
+
+    print $out "building the $collection collection\n\n";
+
+    my $build_cmd = "perl -S buildcol.pl";
+    $build_cmd .= " -out \"$outfile.build\"" if $use_out;
+    $build_cmd .= " -collectdir \"$collectdir\"" if $collectdir =~ /\w/;
+    $build_cmd .= " $maxdocs $collection";
+    system ($build_cmd);
+    # if using output directory append the buildcol output to it
+    &append_file ($out, "$outfile.build");
+
+    if (-e &util::filename_cat ($buildingdir, "text", "$collection.ldb") ||
+	-e &util::filename_cat ($buildingdir, "text", "$collection.bdb")) {
+	print $out "$collection collection built successfully\n\n";
+	if ($remove_archives) {
+	    print $out "removing archives directory ($archivedir)\n";
+	    &util::rm_r ($archivedir);
+	}
+    } else {
+	my $msg = "build: ERROR: buildcol.pl failed\n";
+	print $out "\n$msg";
+	&log_event ($msg);
+	&final_out (3) if $use_out;
+	die "\n";
+    }
+
+    # replace old indexes with new ones
+    if (&has_content ($indexdir)) {
+	print $out "removing old indexes\n";
+	&util::rm_r ($indexdir);
+    }
+    rmdir ($indexdir) if -d $indexdir;
+    &File::Copy::move ($buildingdir, $indexdir);
+
+    # remove the cached arhives
+    if ($save_archives && -d "${archivedir}.org") {
+	&util::rm_r ("${archivedir}.org");
+    }
+}
+
+# return 1 if $dir directory contains any files or sub-directories (other
+# than those specified in the $ignore regular expression)
+sub has_content {
+    my ($dir, $ignore) = @_;
+
+    if (!-d $dir) {return 0;}
+    
+    opendir (DIR, $dir) || return 0;
+    my @files = readdir DIR;
+    closedir DIR;
+    
+    foreach my $file (@files) {
+	if ($file !~ /^\.{1,2}$/) {
+	    return 1 unless (defined $ignore && $file =~ /$ignore/);
+	}
+    }
+    return 0;
+}
+
+sub append_file {
+    my ($handle, $file) = @_;
+
+    open (FILE, $file) || return;
+    undef $/;
+    print $handle <FILE>;
+    $/ = "\n";
+    close FILE;
+    &util::rm ($file);
+}
+
+# creates a file called $outfile.final and writes an output code to it.
+# An output code of 0 specifies that there was no error
+sub final_out {
+    my ($exit_code) = @_;
+
+    if ($use_out && (!-e "$outfile.final")) {
+
+	if (open (FINAL, ">$outfile.final")) {
+	    print FINAL $exit_code;
+	    close FINAL;
+	}
+    }
+}
+
+sub log_event {
+    my ($msg) = @_;
+
+    return unless ($log_events || $email_events);
+
+    # get the event header
+    my $eheader = "[Build Event]\n";
+    $eheader .= "Date: " . scalar localtime() . "\n";
+    if ($event_header ne "" && open (HEADER, $event_header)) {
+	undef $/;
+	$eheader .= <HEADER>;
+	$/ = "\n";
+	close HEADER;
+    } else {
+	$eheader .= "Collection: $collection\n";
+	$eheader .= "GSDLHOME: $ENV{'GSDLHOME'}\n";
+	$eheader .= "Build Location: $collectdir\n";
+    }
+    
+    if ($log_events) {
+	my $fail = 0;
+	# append the event to the event log file
+	if ($event_log_file eq "" || !open (LOG, ">>$event_log_file")) {
+	    # log file defaults to $GSDLHOME/etc/events.txt
+	    $event_log_file = &util::filename_cat ($ENV{'GSDLHOME'}, "etc", "events.txt");
+	    if (!open (LOG, ">>$event_log_file")) {
+		print $out "build: ERROR: Couldn't open event log file $event_log_file\n";
+		$fail = 1;
+	    }
+	}
+	if (!$fail) {
+	    print LOG $eheader;
+	    print LOG $msg;
+	    print LOG "\n";
+	    close LOG;
+	}
+    }
+    
+    if ($email_events) {
+	# if mail_server isn't set email_events does nothing
+	if ($mail_server eq "") {
+	    print $out "build: WARNING: mail_server was not set - email_events option was ignored\n";
+	    return;
+	}
+	
+	my %mail = ('SMTP' => $mail_server, 
+		    'To' => $email_events,
+		    'From' => $maintainer,
+		    'Subject' => 'Greenstone Build Event'
+		    );
+	$mail{'Message'} = $eheader . $msg;
+	
+	if (!sendmail %mail) {
+	    print $out "build: ERROR sending mail to $email_events\n";
+	    print $out "'$Mail::Sendmail::error'\n";
+	}
+    }
+}
+
+
+sub parse_args {
+    my ($argref) = @_;
+
+    if (!parsargv::parse($argref, 
+			 'optionfile/.*/', \$optionfile,
+			 'append', \$append,
+			 'remove_archives', \$remove_archives,
+			 'remove_import', \$remove_import,
+			 'buildtype/^(build|import)$/import', \$buildtype,
+			 'maxdocs/^\-?\d+/-1', \$maxdocs,
+			 'download/.+', \@download,
+			 'collectdir/.*/', \$collectdir,
+			 'dontinstall', \$dontinstall,
+			 'save_archives', \$save_archives,
+			 'out/.*/STDERR', \$out,
+			 'make_writable', \$make_writable,
+			 'log_events', \$log_events,
+			 'event_log_file/.*/', \$event_log_file,
+			 'email_events/.*/', \$email_events,
+			 'mail_server/.*/', \$mail_server,
+			 'statsfile/.*/STDERR', \$statsfile,
+			 'event_header/.*/', \$event_header)) {
+	
+	&print_usage();
+	die "\n";
+    }
+}
+
+
+END {
+
+    if ($make_writable) {
+	# chmod a+rw new collection
+	my $installed_collection = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection);
+	&recursive_chmod($installed_collection);
+
+	# chmod a+rw anything we've left laying about in the tmp directory
+	if (($collectdir ne "") && 	
+	    (!&util::filenames_equal ($collectdir, &util::filename_cat($ENV{'GSDLHOME'}, "collect")))) {
+	    &recursive_chmod($collectdir);
+	}
+    }
+
+    # this will produce a .final file if one doesn't exist yet - that
+    # should only happen if there's been an error somewhere in the perl
+    # code
+    &final_out(7);
+
+    sub recursive_chmod {
+	my ($dir) = @_;
+	return unless -d $dir;
+
+	chmod (0777, $dir);
+
+	opendir (DIR, $dir) || die;
+	my @files = readdir DIR;
+	closedir DIR;
+	
+	foreach my $file (@files) {
+	    next if $file =~ /^\.\.?$/;
+	    $file = &util::filename_cat($dir, $file);
+	    if (-d $file) {
+		&recursive_chmod ($file);
+	    } else {
+		chmod (0777, $file);
+	    }
+	}
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/buildcol.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/buildcol.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/buildcol.pl	(revision 21083)
@@ -0,0 +1,372 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# buildcol.pl -- This program will build a particular collection
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package buildcol;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use colcfg;
+use parsargv;
+use util;
+use FileHandle;
+
+&main();
+
+sub print_usage {
+    print STDOUT "\n";
+    print STDOUT "buildcol.pl: Builds the indexes of a Greenstone collection.\n\n";
+    print STDOUT "  usage: $0 [options] collection-name\n\n";
+    print STDOUT "  options:\n";
+    print STDOUT "   -verbosity number     0=none, 3=lots\n";
+    print STDOUT "   -archivedir directory Where the archives live\n";
+    print STDOUT "   -builddir directory   Where to put the built indexes\n";
+    print STDOUT "   -maxdocs number       Maximum number of documents to build\n";
+    print STDOUT "   -debug                Print output to STDOUT\n";
+    print STDOUT "   -mode all|compress_text|build_index|infodb\n";
+    print STDOUT "   -index indexname      Index to build (will build all in\n"; 
+    print STDOUT "                         config file if not set)\n";
+    print STDOUT "   -keepold              will not destroy the current contents of the\n";
+    print STDOUT "                         building directory\n";
+    print STDOUT "   -no_text              Don't store compressed text. This option is\n";
+    print STDOUT "                         useful for minimizing the size of the built\n";
+    print STDOUT "                         indexes if you intend always to display the\n";
+    print STDOUT "                         original documents at run time (i.e. you won't\n";
+    print STDOUT "                         be able to retrieve the compressed text version)\n";
+    print STDOUT "   -allclassifications   Don't remove empty classifications\n";
+    print STDOUT "   -create_images        Attempt to create default images for new\n";
+    print STDOUT "                         collection. This relies on the Gimp being\n";
+    print STDOUT "                         installed along with relevant perl modules\n";
+    print STDOUT "                         to allow scripting from perl\n";
+    print STDOUT "   -collectdir directory Collection directory (defaults to " .
+	&util::filename_cat ($ENV{'GSDLHOME'}, "collect") . ")\n";
+    print STDOUT "   -out                  Filename or handle to print output status to.\n";
+    print STDOUT "                         The default is STDERR\n";
+    print STDOUT "   -buildtype mg|mgpp    This will override the config file setting.\n";
+    print STDOUT "                         (default is mg)\n";
+    print STDOUT "   -no_strip_html        Do not strip the html tags from the indexed text\n";
+    print STDOUT "                         (only used for mgpp collections).\n\n";
+    print STDOUT "   -faillog name         Fail log filename. This log receives the filenames\n";
+    print STDOUT "                         of any files which fail to be processed (defaults.\n";
+    print STDOUT "                         to " . 
+	&util::filename_cat("<collectdir>", "colname", "etc", "fail.log") . ")\n";
+    print STDOUT "  [Type \"perl -S buildcol.pl | more\" if this help text scrolled off your screen]";
+    print STDOUT "\n" unless $ENV{'GSDLOS'} =~ /^windows$/i;
+}
+
+
+sub main
+{
+    my ($verbosity, $archivedir, $cachedir, $builddir, $maxdocs, 
+	$debug, $mode, $indexname, $keepold, $allclassifications,
+	$create_images, $collectdir, $out, $buildtype, $textindex,
+	$no_strip_html, $no_text, $faillog);
+
+    # note that no defaults are passed for most options as they're set
+    # later (after we check the collect.cfg file)
+    if (!parsargv::parse(\@ARGV, 
+			 'verbosity/\d+/', \$verbosity,
+			 'archivedir/.*/', \$archivedir,
+			 'cachedir/.*/', \$cachedir,
+			 'builddir/.*/', \$builddir,
+			 'maxdocs/^\-?\d+/', \$maxdocs,
+			 'debug', \$debug,
+			 'mode/^(all|compress_text|build_index|infodb)$/', \$mode,
+			 'index/.*/', \$indexname,
+			 'no_text', \$no_text,
+			 'keepold', \$keepold,
+			 'allclassifications', \$allclassifications,
+			 'create_images', \$create_images,
+			 'collectdir/.*/', \$collectdir,
+			 'out/.*/STDERR', \$out,
+			 'no_strip_html', \$no_strip_html,
+			 'buildtype/^(mg|mgpp)$/', \$buildtype,
+			 'faillog/.*/', \$faillog)) {
+	&print_usage();
+	die "\n";
+    }
+
+    $textindex = "";
+    my $close_out = 0;
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") || die "Couldn't open output file $out\n";
+	$out = "buildcol::OUT";
+	$close_out = 1;
+    }
+    $out->autoflush(1);
+
+    # get and check the collection
+    if (($collection = &util::use_collection(@ARGV, $collectdir)) eq "") {
+	&print_usage();
+	die "\n";
+    }
+
+    if ($faillog eq "") {
+	$faillog = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "etc", "fail.log");
+    }
+    # note that we're appending to the faillog here (import.pl clears it each time)
+    # this could potentially create a situation where the faillog keeps being added 
+    # to over multiple builds (if the import process is being skipped)
+    open (FAILLOG, ">>$faillog") || die "Couldn't open fail log $faillog\n";
+    $faillog = 'buildcol::FAILLOG';
+    $faillog->autoflush(1);
+
+    # read the configuration file
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc", "collect.cfg");
+    if (-e $configfilename) {
+	$collectcfg = &colcfg::read_collect_cfg ($configfilename);
+
+	if ($verbosity !~ /\d+/) {
+	    if (defined $collectcfg->{'verbosity'} && $collectcfg->{'verbosity'} =~ /\d+/) {
+		$verbosity = $collectcfg->{'verbosity'};
+	    } else {
+		$verbosity = 2; # the default
+	    }
+	}
+	if (defined $collectcfg->{'buildtype'} && $buildtype eq "") {
+	    $buildtype = $collectcfg->{'buildtype'};
+	}
+	if ($buildtype eq "") {
+	    $buildtype = "mg"; # mg is the default
+	}
+	if (defined $collectcfg->{'archivedir'} && $archivedir eq "") {
+	    $archivedir = $collectcfg->{'archivedir'};
+	}
+	if (defined $collectcfg->{'cachedir'} && $cachedir eq "") {
+	    $cachedir = $collectcfg->{'cachedir'};
+	}
+	if (defined $collectcfg->{'builddir'} && $builddir eq "") {
+	    $builddir = $collectcfg->{'builddir'};
+	}
+	if ($maxdocs !~ /\-?\d+/) {
+	    if (defined $collectcfg->{'maxdocs'} && $collectcfg->{'maxdocs'} =~ /\-?\d+/) {
+		$maxdocs = $collectcfg->{'maxdocs'};
+	    } else {
+		$maxdocs = -1; # the default
+	    }
+	}
+	if (defined $collectcfg->{'debug'} && $collectcfg->{'debug'} =~ /^true$/i) {
+	    $debug = 1;
+	}
+	if ($mode !~ /^(all|compress_text|build_index|infodb)$/) {
+	    if (defined $collectcfg->{'mode'} && $collectcfg->{'mode'} =~ /^(all|compress_text|build_index|infodb)$/) {
+		$mode = $collectcfg->{'mode'};
+	    } else {
+		$mode = "all"; # the default
+	    }
+	}
+	if (defined $collectcfg->{'index'} && $indexname eq "") {
+	    $indexname = $collectcfg->{'index'};
+	}
+	if (defined $collectcfg->{'no_text'} && $no_text == 0) {
+	    if ($collectcfg->{'no_text'} =~ /^true$/i) {
+		$no_text = 1;
+	    }
+	}
+	if (defined $collectcfg->{'allclassifications'} && $allclassifications == 0) {
+	    if ($collectcfg->{'allclassifications'} =~ /^true$/i) {
+		$allclassifications = 1;
+	    }
+	}
+	if (defined $collectcfg->{'keepold'} && $collectcfg->{'keepold'} =~ /^true$/i) {
+	    $keepold = 1;
+	}
+	if (defined $collectcfg->{'create_images'} && $collectcfg->{'create_images'} =~ /^true$/i) {
+	    $create_images = 1;
+	}
+	if ($buildtype eq "mgpp" && defined $collectcfg->{'textcompress'}) {
+	    $textindex = $collectcfg->{'textcompress'};
+	}
+	
+    } else {
+	die "Couldn't find the configuration file $configfilename\n";
+    }
+        
+    #set the text index
+    if ($buildtype eq "mgpp") {
+	if ($textindex eq "") {
+	    $textindex = "text";
+	}
+    }
+    else {
+	$textindex = "section:text";
+    }
+
+    # create default images if required
+    if ($create_images) {
+	my $collection_name = $collection;
+	$collection_name = $collectcfg->{'collectionmeta'}->{'collectionname'} 
+	if defined $collectcfg->{'collectionmeta'}->{'collectionname'};
+	
+	&create_images ($collection_name);
+    }
+
+    # fill in the default archives and building directories if none
+    # were supplied, turn all \ into / and remove trailing /
+    $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives") if $archivedir eq "";
+    $archivedir =~ s/[\\\/]+/\//g;
+    $archivedir =~ s/\/$//;
+    $builddir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "building") if $builddir eq "";
+    $builddir =~ s/[\\\/]+/\//g;
+    $builddir =~ s/\/$//;
+
+    # update the archive cache if needed
+    if ($cachedir) {
+	print $out "Updating archive cache\n" if ($verbosity >= 1);
+
+	$cachedir =~ s/[\\\/]+$//;
+	$cachedir .= "/collect/$collection" unless 
+	    $cachedir =~ /collect\/$collection/;
+
+	$realarchivedir = "$cachedir/archives";
+	$realbuilddir = "$cachedir/building";
+	&util::mk_all_dir ($realarchivedir);
+	&util::mk_all_dir ($realbuilddir);
+	&util::cachedir ($archivedir, $realarchivedir, $verbosity);
+
+    } else {
+	$realarchivedir = $archivedir;
+	$realbuilddir = $builddir;
+    }
+
+    # build it in realbuilddir
+    &util::mk_all_dir ($realbuilddir);
+
+
+    # if a builder class has been created for this collection, use it
+    # otherwise, use the mg or mgpp builder
+    if (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/${collection}builder.pm") {
+	$builderdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildertype = "${collection}builder";
+    } else {
+	$builderdir = "$ENV{'GSDLHOME'}/perllib";
+	if ($buildtype eq "mgpp") {
+	    $buildertype = "mgppbuilder";
+	}
+	else {
+	    $buildertype = "mgbuilder";
+	}
+    }
+	
+    require "$builderdir/$buildertype.pm";
+
+    eval("\$builder = new $buildertype(\$collection, " .
+	 "\$realarchivedir, \$realbuilddir, \$verbosity, " .
+	 "\$maxdocs, \$debug, \$keepold, \$allclassifications, " .
+	 "\$out, \$no_text, \$faillog)");
+    die "$@" if $@;
+
+    $builder->init();
+
+    if ($buildertype eq "mgppbuilder" && $no_strip_html) {
+	$builder->set_strip_html(0);
+    }
+    if ($mode =~ /^all$/i) {
+	$builder->compress_text($textindex);
+	$builder->build_indexes($indexname);
+	$builder->make_infodatabase();
+	$builder->collect_specific();
+    } elsif ($mode =~ /^compress_text$/i) {
+	$builder->compress_text($textindex);
+    } elsif ($mode =~ /^build_index$/i) {
+	$builder->build_indexes($indexname);	
+    } elsif ($mode =~ /^infodb$/i) {
+	$builder->make_infodatabase();
+    } else {
+	die "unknown mode: $mode\n";
+    }
+
+    $builder->make_auxiliary_files() if !$debug;
+    $builder->deinit();
+    
+    if (($realbuilddir ne $builddir) && !$debug) {
+	print $out "Copying back the cached build\n" if ($verbosity >= 1);
+	&util::rm_r ($builddir);
+	&util::cp_r ($realbuilddir, $builddir);
+    }
+
+    close OUT if $close_out;
+    close FAILLOG;
+}
+
+sub create_images {
+    my ($collection_name) = @_;
+
+    my $image_script = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "script", "gimp", "title_icon.pl");
+    if (!-e $image_script) {
+	print $out "WARNING: Image making script ($image_script) could not be found\n";
+	print $out "         Default images will not be generated\n\n";
+	return;
+    }
+
+    my $imagedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "images");
+
+    &util::mk_all_dir ($imagedir);
+
+    # create the images
+    system ("$image_script -size 1.5 -image_dir \"$imagedir\" -filename $collection.gif -text \"$collection_name\"");
+    system ("$image_script -image_dir \"$imagedir\" -filename ${collection}sm.gif -text \"$collection_name\"");
+
+    # update the collect.cfg configuration file (this will need
+    # to be changed when the config file format changes)
+    if (!open (CFGFILE, $configfilename)) {
+	print $out "WARNING: Couldn't open config file ($configfilename)\n";
+	print $out "         for updating so collection images may not be linked correctly\n";
+	return;
+    }
+
+    my $line = ""; my $file = "";
+    my $found = 0; my $foundsm = 0;
+    while (defined ($line = <CFGFILE>)) {
+	if ($line =~ /collectionmeta\s+iconcollection\s+/) {
+	    $line = "collectionmeta iconcollection _httpprefix_/collect/$collection/images/$collection.gif\n";
+	    $found = 1;
+	} elsif ($line =~ /collectionmeta\s+iconcollectionsmall\s+/) {
+	    $line = "collectionmeta iconcollectionsmall _httpprefix_/collect/$collection/images/${collection}sm.gif\n";
+	    $foundsm = 1;
+	}
+	$file .= $line;
+    }
+    close CFGFILE;
+
+    $file .= "collectionmeta iconcollection _httpprefix_/collect/$collection/images/$collection.gif\n" if !$found;
+    $file .= "collectionmeta iconcollectionsmall _httpprefix_/collect/$collection/images/${collection}sm.gif\n" if !$foundsm;
+
+    if (!open (CFGFILE, ">$configfilename")) {
+	print $out "WARNING: Couldn't open config file ($configfilename)\n";
+	print $out "         for updating so collection images may not be linked correctly\n";
+	return;
+    }
+    print CFGFILE $file;
+    close CFGFILE;
+}
+
Index: /main/tags/2.38/gsdl/bin/script/cancel_build.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/cancel_build.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/cancel_build.pl	(revision 21083)
@@ -0,0 +1,123 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# cancel_build.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# 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 program will create a .kill file within the GSDLCOLLECTDIR/collect-name
+# directory which will cause any import.pl or buildcol.pl processes running
+# on that collection to abort.
+# It then cleans any mess left laying around the collection (including the
+# import directory !!).
+# cancel_build.pl is really only intended to be called from within the 
+# library's collectoraction and isn't much use for anything else. As such it
+# should be rewritten in C++ one day and included in the collectoraction 
+# itself.
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+use parsargv;
+use File::Copy;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "cancel_build.pl: Cancel a build in progress. This script is\n";
+    print STDERR "                 called from the collector and is not intended\n";
+    print STDERR "                 for general use.\n\n";
+    print STDERR "  usage: $0 [options] collection-name\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -collectdir directory  Collection directory (defaults to " .
+	&util::filename_cat ($ENV{'GSDLHOME'}, "collect") . ")\n\n";
+}
+
+&main();
+
+sub main {
+    if (!parsargv::parse(\@ARGV, 'collectdir/.*/', \$collectdir)) {
+	&print_usage();
+	die "\n";
+    }
+
+    my $collection = pop @ARGV;
+    if (!defined $collection || $collection !~ /\w/) {
+	print STDERR "no collection specified\n";
+	&print_usage();
+	die "\n";
+    }
+
+    my $cdir = &util::filename_cat ($collectdir, $collection);
+    if ($collectdir eq "") {
+	$collectdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect");
+	$cdir = &util::filename_cat ($collectdir, $collection);
+    } elsif (!-d $cdir) {
+	$cdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collection);
+    }
+
+    if (! -d $cdir) {
+	print STDERR "Collection does not exist ($cdir)\n";
+	exit (1);
+    }
+
+    # create .kill file
+    my $killfile = &util::filename_cat ($cdir, ".kill");
+    if (!open (KILLFILE, ">$killfile")) {
+	print STDERR "Couldn't create .kill file ($killfile)\n";
+	exit (1);
+    }
+    print KILLFILE "kill $collection\n";
+    close KILLFILE;
+
+    sleep (2); # just give it a chance to die gracefully;
+
+    # remove archives, building, and import directories
+    &util::rm_r (&util::filename_cat ($cdir, "import"));
+    &util::rm_r (&util::filename_cat ($cdir, "building"));
+    &util::rm_r (&util::filename_cat ($cdir, "archives"));
+
+    # remove any other temporary files that may have been left laying around
+    # by the build
+    my $buildfile = &util::filename_cat ($collectdir, ".build");
+    &util::rm ($buildfile) if -e $buildfile;
+    my $bldfile = &util::filename_cat ($collectdir, "$collection.bld");
+    &util::rm ($bldfile) if -e $bldfile;
+    my $bldfile_d = &util::filename_cat ($collectdir, "$collection.bld.download");
+    &util::rm ($bldfile_d) if -e $bldfile_d;
+    my $bldfile_i = &util::filename_cat ($collectdir, "$collection.bld.import");
+    &util::rm ($bldfile_i) if -e $bldfile_i;
+    my $bldfile_b = &util::filename_cat ($collectdir, "$collection.bld.build");
+    &util::rm ($bldfile_b) if -e $bldfile_b;
+    my $bldfile_f = &util::filename_cat ($collectdir, "$collection.bld.final");
+    &util::rm ($bldfile_f) if -e $bldfile_f;
+    
+    # if there's an archives.org directory, rename it back to archives
+    if (-d &util::filename_cat ($cdir, "archives.org")) {
+	&File::Copy::move (&util::filename_cat ($cdir, "archives.org"),
+			   &util::filename_cat ($cdir, "archives"));
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/classinfo.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/classinfo.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/classinfo.pl	(revision 21083)
@@ -0,0 +1,107 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# classinfo.pl -- provide information about classifiers
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use classify;
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "classinfo.pl: Prints information about a classifier.\n\n";
+    print STDERR "  usage: $0 [options] classifier\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -collect collection-name  Giving a collection name will make\n";
+    print STDERR "         classinfo.pl look in collect/collection-name/perllib/classify\n";
+    print STDERR "         first. If it doesn't find it there it will look in the general\n";
+    print STDERR "         perllib/classify directory.\n\n";
+}
+
+&main ();
+
+sub main {
+    my $collect = "";
+
+    # Parse command line
+    if (!parsargv::parse(\@ARGV, 'collect.*/', \$collect)) {
+	&print_usage();
+	die "\n";
+    }
+
+    # Get classifier
+    my $classifier = shift (@ARGV);
+    if (!defined $classifier || $classifier eq "") {
+	print STDERR "You must provide a classifier name\n";
+	&print_usage();
+	die "\n";
+    }
+
+    # make sure the classifier is loaded from the correct location - a hack.
+    if ($collect ne "") {
+	$ENV{'GSDLCOLLECTDIR'} = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collect);
+    } else {
+	$ENV{'GSDLCOLLECTDIR'} = $ENV{'GSDLHOME'};
+    }
+
+    my $classinfo = &classify::load_classifiers ([[$classifier]]);
+    my $classobj = shift @$classinfo;
+
+    print STDERR "
+$classifier info:
+
+Options may be passed to any classifier by including them in your collect.cfg
+configuration file.
+
+Classifiers may take two types of options:
+
+General options are defined within the base class (BasClas.pm) and are
+inherited by any classifier that has been correctly derived from BasClas.
+
+Specific options are defined within the classifier itself and are available
+only to this particular classifier.
+
+$classifier takes the following specific options:
+";
+    $classobj->print_usage();
+
+    print STDERR "$classifier takes the following general options
+";
+    &BasClas::print_general_usage($classifier);
+
+}
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/cleantmp.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/cleantmp.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/cleantmp.pl	(revision 21083)
@@ -0,0 +1,80 @@
+#!/usr/bin/perl
+
+###########################################################################
+#
+# cleantmp.pl
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+# cleantmp.pl cleans up the gsdl/tmp directory
+# it's intended mainly for use by the collectoraction
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use util;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "cleantmp.pl: Cleans up the Greenstone tmp directory by deleting anything\n";
+    print STDERR "             more than -expire_days days old.\n\n";
+    print STDERR "\n  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -expire_days number   The number of days old information in the tmp\n";
+    print STDERR "                         directory must be before it is removed (defaults\n";
+    print STDERR "                         to 7 days)\n\n";
+}
+
+&main ();
+
+sub main {
+    
+    if (!parsargv::parse(\@ARGV, 'expire_days/\d/7', \$expire_days)) {
+	&print_usage();
+	die "\n";
+    }
+
+    my $current_time = time;
+    my $expire_time = ($current_time - ($expire_days*60*60*24));
+
+    my $tmpdir = &util::filename_cat ($ENV{'GSDLHOME'}, "tmp");
+
+    opendir (TMP, $tmpdir) || die "cleantmp.pl: couldn't open $tmpdir\n";
+    my @files = readdir TMP;
+    closedir TMP;
+
+    foreach $file (@files) {
+	next if ($file =~ /^\.\.$/);
+
+	if ($file =~ /^tbuild/) {
+	    my $thisfile = &util::filename_cat ($tmpdir, $file);
+	    my @stats = stat ($thisfile);
+	    if ($stats[9] < $expire_time) {
+		&util::rm_r ($thisfile);
+	    }
+	}
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/convert_collection.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/convert_collection.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/convert_collection.pl	(revision 21083)
@@ -0,0 +1,112 @@
+#! /usr/bin/perl -w
+
+# converts an old style humanity collection which uses an index.txt file to
+# use a single metadata.xml file instead
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+use cfgread;
+
+my $collection = $ARGV[0];
+my $collectdir = &util::filename_cat($ENV{'GSDLHOME'}, "collect", $collection);
+my $importdir = &util::filename_cat($collectdir, "import");
+
+die unless -d $importdir;
+
+# new import structure will be created in "import.new" directory
+my $importnewdir = $importdir . ".new";
+`mkdir $importnewdir`;
+
+
+# read in index.txt file and generate metadata.xml, in the process
+# converting the html files and copying them across to the import.new
+# directory
+
+my $metadata_xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n";
+$metadata_xml .= "<!DOCTYPE GreenstoneDirectoryMetadata SYSTEM " .
+    "\"http://greenstone.org/dtd/GreenstoneDirectoryMetadata/1.0/GreenstoneDirectoryMetadata.dtd\">\n";
+$metadata_xml .= "<DirectoryMetadata>\n\n";
+
+my $index_txt = &util::filename_cat($importdir, "index.txt");
+
+open (INDEXTXT, $index_txt) || die;
+
+my $line = [];
+my @fields = ();
+my $count = 0;
+while (defined ($line = cfgread::read_cfg_line("main::INDEXTXT"))) {
+
+#    last if $count > 10;
+
+    if ($line->[0] eq "key:") {
+	shift @$line;
+	@fields = @$line;
+    } else {
+	
+	my $jobnumber = shift @$line;
+	&new_document($jobnumber);
+	$count ++;
+
+	my $i = 0;
+	for ($i = 0; $i < scalar(@$line); $i++) {
+	    if ($line->[$i] =~ /^<([^>]+)>(.*)$/) {
+		&set_metadata($1, $2);
+	    } else {
+		if (defined ($fields[$i])) {
+		    &set_metadata($fields[$i], $line->[$i]);
+		} else {
+		    print STDERR "error 1\n";
+		}
+	    }
+	}
+
+	$metadata_xml .= "    </Description>\n";
+	$metadata_xml .= "  </FileSet>\n\n";
+    }
+}
+close INDEXTXT;
+
+$metadata_xml .= "</DirectoryMetadata>\n";
+
+my $metafile = &util::filename_cat($importnewdir, "metadata.xml");
+open (META, ">$metafile") || die;
+print META $metadata_xml;
+close META;
+
+
+sub new_document {
+    my ($jobnumber) = @_;
+
+    print STDERR "creating new document ($jobnumber)\n";
+
+    my $docdir = &util::filename_cat($importdir, $jobnumber);
+    die unless -d $docdir;
+
+    # copy whole directory across to import.new
+    $jobnumber =~ s/^.*?\///;
+    my $newdocdir = &util::filename_cat($importnewdir, $jobnumber);
+    die if -e $newdocdir;
+    `cp -r $docdir $newdocdir`;
+
+    # convert the htm file to use the new syntax
+    my $htmfile = &util::filename_cat($newdocdir, "$jobnumber.htm");
+    die unless -e $htmfile;
+    `convert_toc.pl < $htmfile > $htmfile.new`;
+    `mv $htmfile.new $htmfile`;
+
+    # update metadata.xml
+    $metadata_xml .= "  <FileSet>\n";
+    $metadata_xml .= "    <FileName>$jobnumber</FileName>\n";
+    $metadata_xml .= "    <Description>\n";
+}
+
+sub set_metadata {
+    my ($key, $value) = @_;
+
+    $metadata_xml .= "      <Metadata name=\"$key\" mode=\"accumulate\">$value</Metadata>\n";
+}
Index: /main/tags/2.38/gsdl/bin/script/convert_toc.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/convert_toc.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/convert_toc.pl	(revision 21083)
@@ -0,0 +1,124 @@
+#! /usr/bin/perl -w
+
+# convert_toc.pl converts old <<TOC>> marked up files to use the new
+# <Section> syntax (suitable for processing by HTMLPlug -description_tags
+
+use File::Basename;
+
+my $level = 0;
+
+sub main {
+  open STDIN, "<$ARGV[0]" or die "$ARGV[0]: $!\n";
+  open STDOUT, ">$ARGV[1]" or die "$ARGV[1]: $!\n";
+
+  my $dirname = &File::Basename::dirname($ARGV[0]);
+
+  my $content = "";
+  
+  while (<STDIN>) {
+    $_ =~ s/[\cJ\cM]+$/\n/;
+    $content .= $_;
+  }
+
+  # fix images
+  $content =~ s/&lt;&lt;I&gt;&gt;\s*(\w+\.(?:png|jpe?g|gif))\s*(.*?)<\/p>/rename_image_old($1, $2, $dirname)/iegs;
+  $content =~ s/<img\s+src=\"?(\w+\.(?:png|jpe?g|gif))\"?/rename_image($1, $dirname)/iegs;
+
+  # process section title
+  $content =~ s/(?:<P[^>]*>|<BR>)(?:\s*<\/?[^>]*>)*?&lt;&lt;TOC(\d+)&gt;&gt;(.*?)(?=<\/?P[^>]*>|<BR>)/
+      process_toc ($1, $2)/sige;
+
+  # close the remaining sections
+  my $section_ending = "<!--\n";
+  for (my $j = 0; $j < $level; $j++) {
+    $section_ending .= "</Section>\n";
+  }
+  $section_ending .= "-->\n";
+  $content =~ s/(<\/body>)/$section_ending.$1/sie;
+
+  print STDOUT $content;
+  close STDOUT; close STDIN;
+}
+
+sub process_toc {
+  my ($thislevel, $title) = @_;
+  my $toc = '';
+ 
+  $title =~ s/<[^>]+>//sg;
+  $title =~ s/^\s+//s;
+  $title =~ s/\s+$//s;
+  $title =~ s/\n/ /sg;
+
+  $toc .= "\n<!--\n";
+
+  if ($thislevel <= $level) {
+    for (my $i = 0; $i < ($level-$thislevel+1); $i++) {
+	$toc .= "</Section>\n";
+    }
+  }
+
+  $toc .= "<Section>\n".
+	"  <Description>\n".
+	"    <Metadata name=\"Title\">$title</Metadata>\n".
+	"  </Description>\n".
+	"-->\n";
+
+  $level = $thislevel;
+
+  return $toc;
+}
+
+sub rename_image_old {
+    my ($image_name, $following_text, $dirname) = @_;
+
+    &rename_image($image_name, $dirname);
+
+    return "<center><img src=\"$image_name\"><br>$following_text<\/center><\/p>\n";
+}
+
+
+# may need to rename image files if case isn't consistent
+# (i.e. collections prepared on windows may have images named
+# AAA.GIF which are linked into the HTML as aaa.gif)
+sub rename_image {
+    my ($image_name, $dirname) = @_;
+
+
+    if (!-e "$dirname/$image_name") {
+
+	my ($pre, $ext) = $image_name =~ /^([^\.]+)\.(.*)$/;
+	my $image_name_uc = uc($image_name);
+	my $image_name_lc = lc($image_name);
+	my $image_name_ul = uc($pre) . "." . lc($ext);
+	my $image_name_lu = lc($pre) . "." . uc($ext);
+
+	if (-e "$dirname/$image_name_uc") {
+	    print STDERR "renaming $dirname/$image_name_uc --> $dirname/$image_name\n";
+	    rename ("$dirname/$image_name_uc", "$dirname/$image_name");
+
+	} elsif (-e "$dirname/$image_name_lc") {
+	    print STDERR "renaming $dirname/$image_name_lc --> $dirname/$image_name\n";
+	    rename ("$dirname/$image_name_lc", "$dirname/$image_name");
+	
+	} elsif (-e "$dirname/$image_name_ul") {
+	    print STDERR "renaming $dirname/$image_name_ul --> $dirname/$image_name\n";
+	    rename ("$dirname/$image_name_ul", "$dirname/$image_name");
+	
+	} elsif (-e "$dirname/$image_name_lu") {
+	    print STDERR "renaming $dirname/$image_name_lu --> $dirname/$image_name\n";
+	    rename ("$dirname/$image_name_lu", "$dirname/$image_name");
+	
+	} else {
+	    print STDERR "ERROR**** $dirname/$image_name could not be found\n";
+	    if (open (ERROR, ">>error.txt")) {
+		print ERROR "ERROR**** $dirname/$image_name could not be found\n";
+		close ERROR;
+	    }
+	}
+    }
+    return "<img src=\"$image_name\"";
+}
+
+
+
+&main;
Index: /main/tags/2.38/gsdl/bin/script/convert_toc_dir.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/convert_toc_dir.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/convert_toc_dir.pl	(revision 21083)
@@ -0,0 +1,41 @@
+#! /usr/bin/perl -w
+
+# run convert_toc.pl on any html files found in the directory passed in on
+# the command line (or any subdirs).
+
+die "\$GSDLOS not set !\n" if (!defined $ENV{GSDLOS});
+my ($move, $separator);
+if ($ENV{GSDLOS} eq "windows") {
+  $move = "move";
+  $separator = "\\";
+} else {
+  $move = "mv";
+  $separator = "/";
+}
+
+&recurse($ARGV[0]);
+
+sub recurse {
+    my ($dir) = @_;
+
+    if (!-d $dir) {
+	print STDERR "ERROR: $dir isn't a directory\n";
+	return;
+    }
+
+    opendir (DIR, $dir) || die;
+    my @files = readdir DIR;
+    closedir DIR;
+
+    foreach my $file (@files) {
+	next if $file =~ /^\.\.?$/;
+	my $fullpath = "$dir$separator$file";
+	if (-d $fullpath) {
+	    &recurse($fullpath);
+	} elsif ($file =~ /\.html?$/i) {
+	    print STDERR "converting $fullpath\n";
+	    `convert_toc.pl $fullpath $fullpath.new`;
+	    `$move $fullpath.new $fullpath`;
+	}
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/create_distributions.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/create_distributions.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/create_distributions.pl	(revision 21083)
@@ -0,0 +1,794 @@
+#!/usr/bin/perl -w
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+
+# create_distributions.pl creates the following distributions from the gsdl
+# directory pointed to by $GSDLHOME (although it uses the main CVS
+# repository to get the latest source code distribution).
+
+# Windows distribution - gsdl-x.xx-win32.exe
+# Creates directory structure for this - use installshield and
+# packagefortheweb to create self-extracting executable
+
+# Linux distribution - gsdl-x.xx-linux.tgz
+
+# Source distribution - gsdl-x.xx.tgz
+
+# cd-rom distribution = gsdl-x.xx-cdrom.tgz
+# Creates directory structure - use installshield to create media
+# for writing to cd-rom
+
+# all collections in $GSDLHOME/collect (except modelcol and those
+# explicitly ignored by -ignorecol options):
+#  pre-built (collname-prebuilt) .tgz .zip
+#  unbuilt (collname) .tgz .zip
+
+
+#    creates ChangeLog using `cvs2cl.pl -P -F trunk -r -S -l "-d'date<tomorrow'"
+#    where date of last distribution is read from the last line of 
+#    $GSDLHOME/DistDates or from -ChangeLogDate command line option
+#    should use something like cvs2cl.pl ... -l "-r'last_tag' -r'this_tag'" but
+#    I can't get cvs to ignore files which contain neither last_tag or this_tag
+#    so ChangeLog contains lots of ancient stuff 
+
+#    sets a cvs tag called gsdl-x_xx-distribution (unless -cvs_tag is set
+#    in which case it uses that)
+
+#    creates a copy of everything in cvs repository in $tmpdir
+
+#    edits /tmp/gsdl/etc/VERSION, /tmp/gsdl/src/w32server/fnord.cpp
+#    and /tmp/gsdl/cgi-bin/gsdlsite.cfg to use new version number
+#    and default GSDLHOME
+
+# temporary working directory
+my $tmpdir = '/tmp/sjboddie';
+
+# docs directory - up-to-date copy of everything to go in the docs directory 
+# (including the README.txt) is expected to live here
+my $docdir = '/home/nzdl/gsdl-docs';
+
+# where the windows binaries live (including library.exe and server.exe)
+# this currently relies on being a directory ending in "windows"
+my $winbin = "$ENV{'GSDLHOME'}/bin/windows";
+
+# ditto for linux binaries (don't forget getpw)
+my $linuxbin = "$ENV{'GSDLHOME'}/bin/linux";
+
+my $cvsroot = ':ext:sjboddie@cvs.scms.waikato.ac.nz:/usr/local/global-cvs/gsdl-src';
+
+use parsargv;
+use util;
+
+use Cwd;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "create_distributions.pl: Packages up Greenstone distributions.\n\n";
+    print STDERR "  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -version_num           version number of distribution (x.xx)\n";
+    print STDERR "   -cvs_tag               cvs tag from which to create distributions\n";
+    print STDERR "                          - if not set latest versions will be used and\n";
+    print STDERR "                          a tag will be set\n";
+    print STDERR "   -no_cdrom              don't create cd-rom version\n";
+    print STDERR "   -no_cols               don't attempt to create any collection distributions\n";
+    print STDERR "   -only_cols             create collection distributions only\n";
+    print STDERR "   -includecol            collection to include (by default all collections in\n";
+    print STDERR "                          $ENV{'GSDLHOME'}/collect will be included\n";
+    print STDERR "   -ignorecol             directory in $ENV{'GSDLHOME'}/collect to ignore (i.e.\n";
+    print STDERR "                          don't include as collection in distribution)\n";
+    print STDERR "   -output_dir            directory to output distributions to\n";
+    print STDERR "   -NoChangeLog           don't create ChangeLog\n";
+    print STDERR "   -UseExistingLog        use $ENV{'GSDLHOME'}/ChangeLog rather than creating one\n";
+    print STDERR "   -ChangeLogDate         date from which to begin ChangeLog - note that ChangeLog\n";
+    print STDERR "                          will always run from date to most recent commits, even if\n";
+    print STDERR "                          cvs_tag is for a previous revision\n\n";
+}
+
+&main ();
+
+sub main {
+    if (!parsargv::parse(\@ARGV, 
+			 'version_num/\d\.\d\d[a-z]?', \$version_num,
+			 'cvs_tag/.*/', \$cvs_tag,
+			 'no_cdrom', \$no_cdrom,
+			 'no_cols', \$no_cols,
+			 'only_cols', \$only_cols,
+			 'includecol/.*', \@includecols,
+			 'ignorecol/.*', \@ignorecols,
+			 'NoChangeLog', \$nochangelog,
+			 'UseExistingLog', \$useexistinglog,
+			 'ChangeLogDate/.*/', \$changelogdate,
+			 'output_dir/.*/', \$output_dir)) {
+	&print_usage();
+	die "\n";
+    }
+    
+    $output_dir = "." unless $output_dir =~ /\w/;
+    mkdir ($output_dir, 0777) unless -d $output_dir;
+
+    my $have_tag = 1;
+    if ($cvs_tag !~ /\w/) {
+	$cvs_tag = $version_num;
+	$cvs_tag =~ s/\./\_/g;
+	$cvs_tag = "gsdl-" . $cvs_tag . "-distribution";
+	$have_tag = 0;
+    }
+    
+    &create_changelog() unless ($nochangelog || $useexistinglog);
+    
+    if (!$only_cols) {
+
+	# tag repository
+	if (!$have_tag) {
+	    print STDERR "\ntagging with $cvs_tag\n";
+	    chdir ($ENV{'GSDLHOME'});
+	    `cvs tag $cvs_tag`;
+	}
+	
+	# cvs export gsdl to $tmpdir
+	print STDERR "\nexporting gsdl ($cvs_tag) to $tmpdir\n\n";
+	chdir ($tmpdir);
+	`cvs -d $cvsroot export -r $cvs_tag gsdl`;
+	
+	# copy ChangeLog into $tmpdir/gsdl
+	&util::cp (&util::filename_cat($ENV{'GSDLHOME'}, "ChangeLog"), 
+		   &util::filename_cat($tmpdir, "gsdl")) unless $nochangelog;
+
+	# edit the VERSION and fnord.cpp files
+	&edit_files();
+	
+	&create_windows_distribution();
+	&create_linux_distribution();
+	&create_src_distribution();
+	&create_cdrom_distribution() unless $no_cdrom;
+    }
+
+    &create_collection_distributions() unless $no_cols;
+}
+
+sub create_windows_distribution {
+    my $windows_dist_dir = &util::filename_cat ($output_dir, "gsdl-" . $version_num . "-win32");
+    mkdir ($windows_dist_dir, 0777);
+
+    # docs directory and README.TXT
+#    &install_docs ($windows_dist_dir, 1); -- just README.TXT for windows web installation
+    &util::cp (&util::filename_cat($docdir, "README.TXT"), $windows_dist_dir);
+
+    # gsdl directory
+    &install_gsdl ($windows_dist_dir);
+
+    # src directory
+    &install_src ($windows_dist_dir, "windows");
+
+    # Windows directory
+    &install_windows_specific ($windows_dist_dir, 0);
+
+    # we want to include the unbuilt bits of the demo collection too
+    my $demodir = &util::filename_cat($windows_dist_dir, "gsdl", "collect", "demo");
+    my $demoetc = &util::filename_cat($demodir, "etc");
+    my $tmpdemo = &util::filename_cat($tmpdir, "gsdl", "collect", "demo");
+    die "oops, no demo dir\n" unless -d $demodir;
+    &util::cp_r (&util::filename_cat ($tmpdemo, "import"), $demodir);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "org.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "sub.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "title.txt"), $demoetc);
+    &remove_cvs_dirs ($demodir);
+}
+
+sub create_linux_distribution {
+    my $linux_dir = "gsdl-" . $version_num . "-linux";
+    my $linux_dist_dir = &util::filename_cat ($output_dir, $linux_dir);
+    mkdir ($linux_dist_dir, 0777);
+
+    # empty "collect" directory
+    mkdir (&util::filename_cat($linux_dist_dir, "collect"), 0777);
+
+    # docs directory, README.TXT, COPYING and Support.htm
+    &install_docs ($linux_dist_dir, 1);
+
+    # gsdl directory
+    &install_gsdl ($linux_dist_dir);
+
+    # src directory
+    &install_src ($linux_dist_dir, "unix");
+
+    # Unix directory
+    &install_unix_specific ($linux_dist_dir);
+
+    # we want to include the unbuilt bits of the demo collection too
+    my $demodir = &util::filename_cat($linux_dist_dir, "gsdl", "collect", "demo");
+    my $demoetc = &util::filename_cat($demodir, "etc");
+    my $tmpdemo = &util::filename_cat($tmpdir, "gsdl", "collect", "demo");
+    die "oops, no demo dir\n" unless -d $demodir;
+    &util::cp_r (&util::filename_cat ($tmpdemo, "import"), $demodir);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "org.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "sub.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "title.txt"), $demoetc);
+    &remove_cvs_dirs ($demodir);
+
+    # tar and gzip it
+    &zip ($linux_dir, $linux_dir, $output_dir, 2);
+    &util::rm_r ($linux_dist_dir);
+}
+
+sub create_src_distribution {
+    my $src_zip = "gsdl-" . $version_num . "-src";
+    # we want the COPYING file in the source distribution too
+    &util::cp (&util::filename_cat($docdir, "COPYING"),
+	       &util::filename_cat($tmpdir, "gsdl"));
+#    &edit_gsdlsite("/home/gsdl");
+    &zip ($src_zip, "gsdl", $tmpdir, 2);
+    &util::cp (&util::filename_cat($tmpdir, "$src_zip.tgz"), $output_dir);
+    # remove the COPYING file again to avoid confusion (it's copied to the right 
+    # places by install_docs() for other distributions)
+    &util::rm (&util::filename_cat($tmpdir, "COPYING"));
+}
+
+sub create_cdrom_distribution {
+    my $cdrom_dist_dir = &util::filename_cat ($output_dir, "gsdl-" . $version_num . "-cdrom");
+    mkdir ($cdrom_dist_dir, 0777);
+
+    # collect directory (empty for now. we'll add collections manually)
+    mkdir (&util::filename_cat ($cdrom_dist_dir, "collect"), 0777);
+
+    # docs directory and README.TXT
+    &install_docs ($cdrom_dist_dir, 0);
+
+    # gsdl directory
+    &install_gsdl ($cdrom_dist_dir);
+
+    # src directory
+    &install_src ($cdrom_dist_dir, "cdrom");
+
+    # Windows directory
+    &install_windows_specific ($cdrom_dist_dir, 1);
+
+    # Unix directory
+    &install_unix_specific ($cdrom_dist_dir);
+
+    # for the cd-rom we want to include the unbuilt bits of the demo collection too
+    my $demodir = &util::filename_cat($cdrom_dist_dir, "gsdl", "collect", "demo");
+    my $demoetc = &util::filename_cat($demodir, "etc");
+    my $tmpdemo = &util::filename_cat($tmpdir, "gsdl", "collect", "demo");
+    die "oops, no demo dir\n" unless -d $demodir;
+    &util::cp_r (&util::filename_cat ($tmpdemo, "import"), $demodir);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "org.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "sub.txt"), $demoetc);
+    &util::cp (&util::filename_cat ($tmpdemo, "etc", "title.txt"), $demoetc);
+    &remove_cvs_dirs ($demodir);
+    
+}
+
+# isweb is 1 if it's one of the web distributions (i.e. if we don't
+# want to install the manual) - this shouldn't be called at all for
+# windows web installation as it doesn't use docs at all (not much 
+# point for self-extracting exe).
+sub install_docs {
+    my ($install_dir, $isweb) = @_;
+
+    # docs directory, README.TXT, COPYING and Support.htm
+    &util::cp_r (&util::filename_cat($docdir, "docs"), $install_dir);
+    &util::cp (&util::filename_cat($docdir, "README.TXT"), $install_dir);
+    &util::cp (&util::filename_cat($docdir, "COPYING"), $install_dir);
+    &util::cp (&util::filename_cat($docdir, "Support.htm"), $install_dir);
+    # don't want manuals for web distributions
+    if ($isweb) {
+	my $manfile = &util::filename_cat ($install_dir, "docs", "User.pdf");
+	&util::rm ($manfile) if -e $manfile;
+	$manfile = &util::filename_cat ($install_dir, "docs", "Install.pdf");
+	&util::rm ($manfile) if -e $manfile;
+	$manfile = &util::filename_cat ($install_dir, "docs", "Developer.pdf");
+	&util::rm ($manfile) if -e $manfile;
+    }
+}
+
+sub install_gsdl {
+    my ($install_dir) = @_;
+
+    my $gsdldir = &util::filename_cat ($install_dir, "gsdl");
+    my $gsdlbindir = &util::filename_cat ($gsdldir, "bin");
+    mkdir ($gsdldir, 0777);
+    mkdir ($gsdlbindir, 0777);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "bin", "script"), $gsdlbindir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "bin", "java"), $gsdlbindir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "cgi-bin"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "collect"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "etc"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "images"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "macros"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "perllib"), $gsdldir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "mappings"), $gsdldir);
+
+    # untar Ping.tgz
+    my $wd = cwd;
+    chdir (&util::filename_cat($gsdldir, "perllib", "cpan"));
+    `tar xvzf Ping.tgz`;
+    unlink ("Ping.tgz");
+    chdir ($wd);
+
+    # make sure that modelcol collection contains all the right 
+    # empty directories
+    my $modelindex = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "index");
+    &util::mk_all_dir ($modelindex) unless -d $modelindex;
+    my $modelbuilding = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "building");
+    &util::mk_all_dir ($modelbuilding) unless -d $modelbuilding;
+    my $modelarchives = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "archives");
+    &util::mk_all_dir ($modelarchives) unless -d $modelarchives;
+    my $modelimport = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "import");
+    &util::mk_all_dir ($modelimport) unless -d $modelimport;
+    my $modelperllib = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "perllib");
+    &util::mk_all_dir ($modelperllib) unless -d $modelperllib;
+    my $modelimages = &util::filename_cat ($tmpdir, "gsdl", "collect", "modelcol", "images");
+    &util::mk_all_dir ($modelimages) unless -d $modelimages;
+
+    # demo collection needs to be pre-built
+    my $collectdir = &util::filename_cat ($gsdldir, "collect");
+    &util::rm_r (&util::filename_cat($collectdir, "demo"));
+    if (!&get_built_collection ("demo", $collectdir)) {
+	die "Couldn't get built version of demo collection\n";
+    }
+}
+
+sub install_src {
+    my ($install_dir, $type) = @_;
+
+    my $srcdir = &util::filename_cat ($install_dir, "src");
+    my $srcwindir = &util::filename_cat ($srcdir, "Windows");
+    my $srcunixdir = &util::filename_cat ($srcdir, "Unix");
+    mkdir ($srcdir, 0777);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "lib"), $srcdir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "packages"), $srcdir);
+    &util::cp_r (&util::filename_cat ($tmpdir, "gsdl", "src"), $srcdir);
+    &util::cp (&util::filename_cat ($tmpdir, "gsdl", "Install.txt"), $srcdir);
+
+    if ($type ne "unix") {
+	mkdir ($srcwindir, 0777);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "setup.bat"), $srcwindir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "win32.mak"), $srcwindir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "WIN32cfg.h"), $srcwindir);
+    }
+
+    if ($type ne "windows") {
+	mkdir ($srcunixdir, 0777);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "Makefile.in"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "acconfig.h"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "aclocal.m4"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "config.h.in"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "configtest.pl"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "configure"), $srcunixdir);
+	# make sure configure script is executable
+	my $configure_script = &util::filename_cat ($srcunixdir , "configure");
+	`chmod a+x $configure_script`;
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "configure.in"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "config.sub"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "config.guess"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "install-sh"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "setup.bash"), $srcunixdir);
+	&util::cp (&util::filename_cat ($tmpdir, "gsdl", "setup.csh"), $srcunixdir);
+    }
+}
+
+# if $cd_rom is not true then we don't want to include the net16, net32,
+# Win32s or netscape directories in the bin/windows directory (note that
+# this currently means exportcol.pl will fail for all but cd-rom installed
+# distributions)
+sub install_windows_specific {
+    my ($install_dir, $cd_rom) = @_;
+
+    my $windir = &util::filename_cat ($install_dir, "Windows");
+    my $winbindir = &util::filename_cat ($windir, "bin");
+    mkdir ($windir, 0777);
+    mkdir ($winbindir, 0777);
+    &util::cp_r ($winbin, $winbindir);
+
+    if (!$cd_rom) {
+	&util::rm_r (&util::filename_cat ($winbindir, "windows", "net16"));
+	&util::rm_r (&util::filename_cat ($winbindir, "windows", "net32"));
+	&util::rm_r (&util::filename_cat ($winbindir, "windows", "Win32s"));
+	&util::rm_r (&util::filename_cat ($winbindir, "windows", "netscape"));
+    }
+
+    # make sure there aren't any CVS directories laying around
+    &remove_cvs_dirs ($windir);
+}
+
+sub install_unix_specific {
+    my ($install_dir) = @_;
+
+    my $unixdir = &util::filename_cat ($install_dir, "Unix");
+    my $unixbindir = &util::filename_cat ($unixdir, "bin");
+    mkdir ($unixdir, 0777);
+    mkdir ($unixbindir, 0777);
+    &util::cp (&util::filename_cat($tmpdir, "gsdl", "Install.sh"), $unixdir);
+
+    # make sure Install.sh is executable
+    my $install_sh = &util::filename_cat ($unixdir, "Install.sh");
+    `chmod a+x $install_sh`;
+    &util::cp_r ($linuxbin, $unixbindir);
+
+    # make sure there aren't any CVS directories laying around
+    &remove_cvs_dirs ($unixdir);
+}
+
+sub create_collection_distributions {
+    
+    # work out which collections we want
+    my @cols = ();
+    if (scalar @includecols) {
+	@cols = @includecols;
+    } else {
+	my $collectdir = &util::filename_cat($ENV{'GSDLHOME'}, "collect");
+
+	opendir (COLLECTDIR, $collectdir) || die;
+	my @cdirs = readdir COLLECTDIR;
+	closedir COLLECTDIR;
+	my %ignore = ();
+	map { $ignore{$_} = ""; } @ignorecols;
+	foreach $d (@cdirs) {
+	    if ((-d &util::filename_cat($collectdir, $d)) && ($d ne ".") && ($d ne "..") && 
+		($d ne "modelcol") && ($d ne "CVS") && (!defined $ignore{$d})) {
+		push (@cols, $d);
+	    }
+	}
+    }
+    
+    return unless scalar @cols;
+
+    # create distributions
+    foreach $collection (@cols) {
+	if (&get_built_collection ($collection, $tmpdir)) {
+	    &zip ("$collection-prebuilt", $collection, $tmpdir, 0);
+	    &util::cp (&util::filename_cat($tmpdir, "$collection-prebuilt.tgz"), $output_dir);
+	    &util::cp (&util::filename_cat($tmpdir, "$collection-prebuilt.zip"), $output_dir);
+	} else {
+	    print STDERR "ERROR: Couldn't create pre-built $collection collection\n";
+	}
+	&util::rm_r (&util::filename_cat ($tmpdir, $collection)) 
+	    if -d &util::filename_cat ($tmpdir, $collection);
+
+	if (&get_unbuilt_collection ($collection, $tmpdir)) {
+	    &zip ($collection, $collection, $tmpdir, 0);
+	    &util::cp (&util::filename_cat($tmpdir, "$collection.tgz"), $output_dir);
+	    &util::cp (&util::filename_cat($tmpdir, "$collection.zip"), $output_dir);
+	} else {
+	    print STDERR "ERROR: Couldn't create unbuilt $collection collection\n";
+	}
+	&util::rm_r (&util::filename_cat ($tmpdir, $collection)) 
+	    if -d &util::filename_cat ($tmpdir, $collection);
+    }
+}
+
+# gets all the right bits of a built collection from 
+# $GSDLHOME/collect and copies them to $collect_dir
+# returns 1 if successful, 0 if not
+sub get_built_collection {
+    my ($colname, $collect_dir) = @_;
+
+    my $from_dir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $colname);
+    if (!-d $from_dir) {
+	print STDERR "\nERROR: No collection at $from_dir\n";
+	return 0;
+    }
+    
+    my $to_dir = &util::filename_cat ($collect_dir, $colname);
+    mkdir ($to_dir, 0777) unless -d $to_dir;
+    
+    # get the built indexes
+    my $index_dir = &util::filename_cat ($from_dir, "index");
+    if (-d $index_dir) {
+	# if build.cfg exists we'll assume collection is built ok
+	if (-e &util::filename_cat ($index_dir, "build.cfg")) {
+	    &util::cp_r ($index_dir, $to_dir);
+	} else {
+	    print STDERR "\nERROR: no build.cfg at $index_dir (collection not built?)\n";
+	    rmdir ($to_dir);
+	    return 0;
+	}
+    } else {
+	print STDERR "\nERROR: collection at $from_dir appears unbuilt (no index directory)\n";
+	return 0;
+    }
+    &util::cp_r ($index_dir, $to_dir);
+    
+    # get the collect.cfg file
+    mkdir (&util::filename_cat($to_dir, "etc"), 0777);
+    &util::cp (&util::filename_cat($from_dir, "etc", "collect.cfg"),
+	       &util::filename_cat($to_dir, "etc"));
+
+    # get the images directory
+    my $from_images = &util::filename_cat ($from_dir, "images");
+    &util::cp_r ($from_images, $to_dir) if -d $from_images;
+    
+    # make sure there aren't any CVS directories laying around
+    &remove_cvs_dirs ($to_dir);
+
+    &edit_collect_cfg (&util::filename_cat($to_dir, "etc", "collect.cfg"), $colname);
+    &create_version_file (&util::filename_cat($to_dir, "etc", "VERSION"), 0);
+
+    return 1;
+}
+
+# gets all the right bits of an unbuilt collection from 
+# $GSDLHOME/collect and copies them to $collect_dir
+# returns 1 if successful, 0 if not
+sub get_unbuilt_collection {
+    my ($colname, $collect_dir) = @_;
+
+    my $from_dir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $colname);
+    if (!-d $from_dir) {
+	print STDERR "\nERROR: No collection at $from_dir\n";
+	return 0;
+    }
+    
+    my $to_dir = &util::filename_cat ($collect_dir, $colname);
+    mkdir ($to_dir, 0777) unless -d $to_dir;
+
+    # get the unbuilt data (either import or archives)
+    my $have_import = 0;
+    my $import_dir = &util::filename_cat ($from_dir, "import");
+    if (-d $import_dir && opendir (IMPORTDIR, $import_dir)) {
+	my @importfiles = readdir IMPORTDIR;
+	closedir IMPORTDIR;
+	# if the import directory isn't empty we'll assume everything's ok
+	if (scalar @importfiles) {
+	    $have_import = 1;
+	    &util::cp_r ($import_dir, $to_dir);
+	    mkdir (&util::filename_cat ($to_dir, "archives"), 0777);
+	}
+    }
+    if (!$have_import) {
+	# see if we've got archives then (check for archives.inf)
+	if (-e &util::filename_cat ($from_dir, "archives", "archives.inf")) {
+	    &util::cp_r (&util::filename_cat($from_dir, "archives"), $to_dir);
+	} else {
+
+	    print STDERR "$collection collection appears to have no valid\n";
+	    print STDERR "import or archives data\n";
+	    &util::rm_r ($to_dir);
+	    return 0;
+	}
+    }
+    
+    # get the etc directory
+    &util::cp_r (&util::filename_cat ($from_dir, "etc"), $to_dir);
+
+    # get the perllib directory
+    &util::cp_r (&util::filename_cat ($from_dir, "perllib"), $to_dir);
+
+    # get the images
+    &util::cp_r (&util::filename_cat ($from_dir, "images"), $to_dir);
+    
+    mkdir (&util::filename_cat ($to_dir, "building"), 0777);
+    mkdir (&util::filename_cat ($to_dir, "index"), 0777);
+
+    # make sure there aren't any CVS directories laying around
+    &remove_cvs_dirs ($to_dir);
+
+    &edit_collect_cfg (&util::filename_cat($to_dir, "etc", "collect.cfg"), $colname);
+    my $preimported = 0;
+    $preimported = 1 unless $have_import;
+    &create_version_file (&util::filename_cat($to_dir, "etc", "VERSION"), $preimported);
+
+    return 1;
+}
+
+sub create_changelog {
+
+    my ($tag, $date, $file);
+
+    my $datefile = &util::filename_cat ($ENV{'GSDLHOME'}, "DistDates");
+    if ($changelogdate !~ /\w/) {
+	# get date from $GSDLHOME/DistDates (and update DistDates)
+	open (DATES, $datefile) || die "can't open $datefile\n";
+	my $line = "";
+	while (defined ($line = <DATES>)) {
+	    if ($line =~ /\w/) {
+		($tag, $date) = $line =~ /^(\S+)\t(.*)$/;
+		$changelogdate = $date unless ($tag eq $cvs_tag);
+	    }
+	    $file .= $line;
+	}
+	close DATES;
+    }
+
+    if ((!defined $tag) || ($tag ne $cvs_tag)) {
+	open (DATES, ">$datefile") || die;
+	print DATES $file if defined $file;
+	print DATES "$cvs_tag\t" . `date`;
+	close DATES;
+    }
+
+    print STDERR "Creating ChangeLog from $changelogdate to most recent\n";
+
+    chdir($ENV{'GSDLHOME'});
+    my $cmd = "cvs2cl.pl -P -F trunk -r -S -l \"-d'$changelogdate<tomorrow'\"";
+    system ($cmd);
+}
+
+# edits the gsdlsite.cfg file to set GSDLHOME
+# makes a copy of the initial version of gsdlsite.cfg in
+# /tmp (if it doesn't exist already).
+sub edit_gsdlsite {
+    my ($gsdlhome) = @_;
+
+    my $gsdlsite_file = &util::filename_cat ($tmpdir, "gsdl", "cgi-bin", "gsdlsite.cfg");
+    my $tmp_gsdlsite_file = &util::filename_cat ($tmpdir, "gsdlsite.cfg");
+
+    if (-e $tmp_gsdlsite_file) {
+	&util::cp ($tmp_gsdlsite_file, $gsdlsite_file);
+    } else {
+	&util::cp ($gsdlsite_file, $tmp_gsdlsite_file);
+    }
+
+    open (GSDLSITE, $gsdlsite_file) || die;
+    my $line = ""; my $file = ""; my $found = 0;
+    while (defined ($line = <GSDLSITE>)) {
+	if ($line =~ s/\*\*GSDLHOME\*\*/$gsdlhome/g) {
+	    $found = 1;
+	}
+	$file .= $line;
+    }
+    close GSDLSITE;
+
+    if (!$found) {
+	die "ERROR: $gsdlsite_file contains no **GSDLHOME** string\n";
+    }
+
+    open (GSDLSITE, ">$gsdlsite_file") || die;
+    print GSDLSITE $file;
+    close GSDLSITE;
+}
+
+# currently just checks that iconcollection fields are correct and that
+# creator and maintainer fields are set to greenstone@cs.waikato.ac.nz
+sub edit_collect_cfg {
+    my ($collect_cfg_file, $collname) = @_;
+
+    open (FILE, $collect_cfg_file) || die "couldn't open $collect_cfg_file\n";
+    my $line = ""; my $file = "";
+    while (defined ($line = <FILE>)) {
+	$line =~ s/^((?:creator|maintainer)\s+\"?)\w+@\w+(\"?)/$1greenstone\@cs.waikato.ac.nz$2/ix;
+	$line =~ s/^(collectionmeta\s+\"?iconcollection(?:small)?\"?\s+\"?).*?($collname\/images\/)/$1_httpprefix_\/collect\/$2/ix;
+	$file .= $line;
+    }
+    close FILE;
+
+    open (FILE, ">$collect_cfg_file") || die;
+    print FILE $file;
+    close FILE;
+}
+
+# the "collection release" is the version of the content - it should only change if the 
+# collections content is changed in some way
+# the "build version" is the build version of Greenstone when the collection distribution
+# was created
+
+# recent build version changes were:
+# 2.0 - 2.1: plugins were altered to take input_encoding (and other) options. GB plugins
+#            were removed. numwords and numsections statistics were added.
+#            All build version 2.0 collections other than those that suddenly required
+#            the input_encoding option (i.e. Arabic and Chinese) may still be built and
+#            viewed using build verion 2.1 software (numwords and numsections won't be
+#            available though).
+
+sub create_version_file {
+    my ($version_file, $preimported) = @_;
+    
+    open (FILE, ">$version_file") || die;
+    
+    print FILE "collection release: 1.1\n";
+    print FILE "build version: 2.1\n";
+    print FILE "pre-imported\n" if $preimported;
+
+    close FILE;
+}
+
+# simply recurses directory structure beginning at $dir
+# and deletes any CVS administrative directories it comes 
+# across
+sub remove_cvs_dirs {
+    my ($dir) = @_;
+
+    if (!-d $dir) {return;}
+
+    opendir (DIR, $dir) || die;
+    my @files = readdir DIR;
+    closedir DIR;
+
+    foreach $file (@files) {
+	next if $file =~ /^\.\.?$/;
+	my $fullpath = &util::filename_cat ($dir, $file);
+	if (-d $fullpath) {
+	    if ($file eq "CVS") {
+		&util::rm_r ($fullpath);
+	    } else {
+		&remove_cvs_dirs ($fullpath);
+	    }
+	}
+    }
+}
+
+# mode is 0 to create .zip and .tgz, 1 to create .zip only, and 2 to create
+# .tgz only
+sub zip {
+    my ($zip_to, $zip_from, $dir, $mode) = @_; 
+
+    chdir ($dir);
+
+    if ($mode != 2) {
+	my $to = $zip_to . ".zip";
+	unlink ($to) if -e $to;
+	print STDERR "zipping up $to\n";
+	`zip -r $to $zip_from`;
+    }
+    if ($mode != 1) {
+	my $to = $zip_to . ".tgz";
+	unlink ($to) if -e $to;
+	print STDERR "tarring and gzipping $to\n";
+	print STDERR "tar cvzf $to $zip_from\n";
+	system ("tar cvzf $to $zip_from");
+    }
+}
+
+sub edit_files {
+    # edit VERSION file
+    my $version_file = &util::filename_cat ($tmpdir, "gsdl", "etc" , "VERSION");
+    open (VERSION, $version_file) || die "failed to open $version_file\n";
+    my $found = 0; my $line = ""; my $file = "";
+    while (defined ($line = <VERSION>)) {
+	if ($line =~ s/(gsdl version: )x\.xx/$1$version_num/) {
+	    $found ++;
+	} elsif ($line =~ s/(cvs tag: )gsdl-x_xx-distribution/$1$cvs_tag/) {
+	    $found ++;
+	}
+	$file .= $line;
+    }
+    close VERSION;
+    if ($found != 2) {
+	die "error while editing $version_file\n";
+    } 
+    
+    open (VERSION, ">$version_file") || die;
+    print VERSION $file;
+    close VERSION;
+    
+    # edit gsdlconf.h
+    my $gsdlconf_file = &util::filename_cat ($tmpdir, "gsdl", "lib", "gsdlconf.h");
+    open (GSDLCONF, $gsdlconf_file) || die;
+    $found = 0; $line = ""; $file = "";
+    while (defined ($line = <GSDLCONF>)) {
+	if ($line =~ s/(\#define GSDL_VERSION \")x\.xx(\")/$1$version_num$2/) {
+	    $found ++;
+	}
+	$file .= $line;
+    }
+    close GSDLCONF;
+    if (!$found) {
+	die "error while editing $gsdlconf_file\n";
+    } 
+    
+    open (GSDLCONF, ">$gsdlconf_file") || die;
+    print GSDLCONF $file;
+    close GSDLCONF;
+}
+
+END {
+    # remove any temporary files we created
+    print STDERR "\ndeleting temporary files\n";
+    my $tmp_gsdlsite_file = &util::filename_cat ($tmpdir, "gsdlsite.cfg");
+    if (-e $tmp_gsdlsite_file) {
+	print STDERR "$tmp_gsdlsite_file\n";
+	unlink($tmp_gsdlsite_file);
+    }
+    my $tmp_gsdlhome = &util::filename_cat ($tmpdir, "gsdl");
+    if (-d $tmp_gsdlhome) {
+	print STDERR "$tmp_gsdlhome\n";
+	&util::rm_r ($tmp_gsdlhome);
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/delcol.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/delcol.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/delcol.pl	(revision 21083)
@@ -0,0 +1,87 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# delcol.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "delcol.pl: Deletes (forever) a collection.\n\n";
+    print STDERR "  usage: $0 [options] collection-name\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -f                     Force deletion of collection without prompting\n\n";
+}
+
+&main();
+
+sub main {
+    my $force = 0;
+    if (!parsargv::parse(\@ARGV, 'f', \$force)) {
+	&print_usage();
+	die "\n";
+    }
+
+    # get and check the collection name
+    if (($collection = &util::use_collection(@ARGV)) eq "") {
+	&print_usage();
+	exit (1);
+    }
+
+    if (!$force) {
+	print STDOUT "Are you sure you want to completely remove the $collection collection?\n";
+	print STDOUT "(the $ENV{'GSDLCOLLECTDIR'} directory will be deleted). [y/n]\n";
+	my $in = <STDIN>;
+	if ($in !~ /^y(es)?$/i) {
+	    print STDOUT "Deletion of $collection collection cancelled\n";
+	    exit (0);
+	}
+    }
+    # delete any temporary files that are laying around
+    my $tmpdir = &util::filename_cat ($ENV{'GSDLHOME'}, "tmp");
+    if (opendir (TMPDIR, $tmpdir)) {
+	my @tmpfiles = readdir (TMPDIR);
+	closedir TMPDIR;
+	map { &util::rm(&util::filename_cat($tmpdir, $_)) if $_ =~ /^$collection/; } @tmpfiles;
+    }
+
+    &util::rm_r ($ENV{'GSDLCOLLECTDIR'});
+
+    # check if everything was deleted successfully
+    if (-d $ENV{'GSDLCOLLECTDIR'}) {
+	print STDERR "\ndelcol.pl WARNING: Not all files in $ENV{'GSDLCOLLECTDIR'} could\n";
+	print STDERR "be deleted\n";
+	exit (2);
+    }
+
+    print STDERR "$collection collection successfully deleted\n";
+    exit (0);
+}
Index: /main/tags/2.38/gsdl/bin/script/exportcol.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/exportcol.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/exportcol.pl	(revision 21083)
@@ -0,0 +1,180 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# exportcol.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "exportcol.pl: Exports a collection for writing to CD-ROM.\n\n";
+    print STDERR "  usage: $0 [options] collection-name\n\n";
+    print STDERR "   -out   Filename or handle to print debug info to.\n";
+    print STDERR "          The default is STDERR\n\n";
+}
+
+&main();
+
+sub main {
+    my ($out, $collection);
+    if (!parsargv::parse(\@ARGV, 'out/.*/STDERR', \$out)) {
+	&print_usage();
+	die "\n";
+    }
+
+    # get and check the collection name
+    if (($collection = &util::use_collection(@ARGV)) eq "") {
+	&print_usage();
+	exit (1);
+    }
+
+    my $close_out = 0;
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") || die "Couldn't open output file $out\n";
+	$out = OUT;
+	$close_out = 1;
+    }
+
+    # make sure the collection is built (or at least contains all the
+    # directories we expect it to) - we expect that it should contain an
+    # index and an etc directory and will also copy across an images
+    # directory if it exists
+    my $colindexdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collection, "index");
+    my $colimagesdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collection, "images");
+    my $coletcdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collection, "etc");
+    if ((!-d $colindexdir) || (!-d $coletcdir)) {
+	print $out "exportcol.pl failed: One or more the the following necessary\n";
+	print $out "directories does not exist\n\n";
+	print $out "  $colindexdir\n";
+	print $out "  $coletcdir\n";
+    }
+
+    # create exported directory
+    my $topdir = &util::filename_cat ($ENV{'GSDLHOME'}, "tmp", "exported_$collection");
+    &util::mk_all_dir ($topdir);
+    if (!-d $topdir) {
+	print $out "exportcol.pl failed: couldn't create directory $topdir\n";
+	die "\n";
+    }
+
+    # make other directories (we'll assume that if we created topdir
+    # successfully there'll be no problems creating these)
+    my $gsdldir = &util::filename_cat ($topdir, "gsdl");
+    &util::mk_all_dir ($gsdldir);
+    my $collectdir = &util::filename_cat ($gsdldir, "collect");
+    &util::mk_all_dir ($collectdir);
+    my $etcdir = &util::filename_cat ($gsdldir, "etc");
+    &util::mk_all_dir ($etcdir);
+
+    # create the install.cfg file
+    my $installcfg = &util::filename_cat ($topdir, "install.cfg");
+    if (!open (INSTALLCFG, ">$installcfg")) {
+	print $out "exportcol.pl failed: Could not create $installcfg\n";
+	die "\n";
+    }
+    print INSTALLCFG "CompanyName:New Zealand Digital Library\n";
+    print INSTALLCFG "CollectionName:$collection\n";
+    print INSTALLCFG "CollectionDirName:$collection\n";
+    print INSTALLCFG "CollectionVersion:1.0\n";
+    print INSTALLCFG "CollectionVolume:1\n";
+    print INSTALLCFG "ProgramGroupName:Greenstone\n";
+    close INSTALLCFG;
+
+    # create the manifest.cfg file
+    my $manifestcfg = &util::filename_cat ($topdir, "manifest.cfg");
+    if (!open (MANIFESTCFG, ">$manifestcfg")) {
+	print $out "exportcol.pl failed: Could not create $manifestcfg\n";
+	die "\n";
+    }
+    print MANIFESTCFG "all:\n";
+    print MANIFESTCFG "  {library} {collection}\n\n";
+    print MANIFESTCFG "library:\n";
+    print MANIFESTCFG "  net32 net16 server.exe\n\n";
+    print MANIFESTCFG "database:\n";
+    print MANIFESTCFG '  etc collect\$(COLDIRNAME)\index\text\$(COLDIRNAME).ldb' . "\n\n";
+    print MANIFESTCFG "collection:\n";
+    print MANIFESTCFG "  collect etc images macros mappings\n";
+    close MANIFESTCFG;
+
+    # copy the necessary stuff from GSDLHOME
+    my $imagesdir = &util::filename_cat ($ENV{'GSDLHOME'}, "images");
+    my $macrosdir = &util::filename_cat ($ENV{'GSDLHOME'}, "macros");
+    my $mappingsdir = &util::filename_cat ($ENV{'GSDLHOME'}, "mappings");
+    my $maincfg = &util::filename_cat ($ENV{'GSDLHOME'}, "etc", "main.cfg");
+    my $serverexe = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "server.exe");
+    my $gssetupexe = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "gssetup.exe");
+    my $setupexe = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "Setup.exe");
+    my $net32dir = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "net32");
+    my $net16dir = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "net16");
+    my $netscapedir = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "netscape");
+    my $win32sdir = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", "windows", "Win32s");
+
+    if ((!-d $imagesdir) || (!-d $macrosdir) || (!-d $mappingsdir) || (!-e $maincfg) ||
+	(!-e $serverexe) || (!-e $gssetupexe) || (!-e $setupexe) || (!-d $net32dir) ||
+	(!-d $net16dir) || (!-d $netscapedir) || (!-d $win32sdir)) {
+	print $out "exportcol.pl failed: One or more the the following necessary\n";
+	print $out "files and directories does not exist\n\n";
+	print $out "  $imagesdir\n";
+	print $out "  $macrosdir\n";
+	print $out "  $mappingsdir\n";
+	print $out "  $maincfg\n";
+	print $out "  $serverexe\n";
+	print $out "  $gssetupexe\n";
+	print $out "  $setupexe\n";
+	print $out "  $net32dir\n";
+	print $out "  $net16dir\n";
+	print $out "  $netscapedir\n";
+	print $out "  $win32sdir\n";
+	die "\n";
+    }
+
+    &util::cp_r ($imagesdir, $gsdldir);
+    &util::cp_r ($macrosdir, $gsdldir);
+    &util::cp_r ($mappingsdir, $gsdldir);
+    &util::cp ($maincfg, $etcdir);
+    &util::cp ($serverexe, $gsdldir);
+    &util::cp ($gssetupexe, $topdir);
+    &util::cp ($setupexe, $topdir);
+    &util::cp_r ($net32dir, $gsdldir);
+    &util::cp_r ($net16dir, $gsdldir);
+    &util::cp_r ($netscapedir, $topdir);
+    &util::cp_r ($win32sdir, $topdir);
+
+    # copy the collection itself
+    my $thiscoldir = &util::filename_cat ($collectdir, $collection);
+    &util::mk_all_dir ($thiscoldir);
+    &util::cp_r ($colindexdir, $thiscoldir);
+    &util::cp_r ($coletcdir, $thiscoldir);
+    &util::cp_r ($colimagesdir, $thiscoldir) if (-e $colimagesdir);
+
+    print $out "exportcol.pl succeeded: The exported collection is in $topdir\n";
+    close OUT if $close_out;
+}
Index: /main/tags/2.38/gsdl/bin/script/extract_text.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/extract_text.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/extract_text.pl	(revision 21083)
@@ -0,0 +1,147 @@
+#! /usr/bin/perl -w
+
+# extract_text.pl extracts the text from macro files, install scripts
+# etc. for translation.
+
+# output is currently to a tab separated list, suitable for importing into
+# excel.
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+}
+
+my $installsh = "$ENV{'GSDLHOME'}/Install.sh";
+my $macrosdir = "$ENV{'GSDLHOME'}/macros";
+my $installshield = 'C:/My Installations/is_gsdl_cdrom/String Tables/0009-English/value.shl';
+
+my $texthash = {};
+
+# first extract all the itextn variables from Install.sh
+open (INSTALLSH, $installsh) || die;
+undef $/;
+my $file = <INSTALLSH>;
+$/ = "\n";
+close INSTALLSH;
+
+$texthash->{'install_sh'} = {};
+while ($file =~ s/^(itext\d+)=\"(.*?)(?<!\\)\"//sm) {
+    my $key = $1;
+    my $value = $2;
+    $value =~ s/\n/\\n/gs;
+    $value =~ s/\t/\\t/gs;
+    if (defined ($texthash->{'install_sh'}->{$key})) {
+	print STDERR "ERROR: $1 already defined\n";
+    }
+    $texthash->{'install_sh'}->{$key} = $value;
+}
+
+
+# now grab the text from the macro files
+$texthash->{'macros'} = {};
+
+# english.dm
+&grab_macros("$macrosdir/english.dm");
+# english2.dm
+&grab_macros("$macrosdir/english2.dm");
+
+
+# text from installshield installation
+$texthash->{'installshield'} = {};
+open (ISHIELD, $installshield) || die;
+my $line = "";
+my $textserver = {};
+while (defined ($line = <ISHIELD>)) {
+    next unless ($line =~ /\w/);
+    last if $line =~ /^\[General\]/;
+    next if $line =~ /^\[/;
+
+    $line =~ s/\n/\\n/gs;
+    $line =~ s/\t/\\t/gs;
+
+    if ($line =~ /^(TEXT_SERVERTXT_\d+)=(.*)$/) {
+	$textserver->{$1} = $2;
+    } else {
+	$line =~ /^([^=]+)=(.*)$/;
+	$texthash->{'installshield'}->{$1} = $2;
+    }
+}
+close ISHIELD;
+my $tserver = "";
+foreach my $stext (sort keys %{$textserver}) {
+    $tserver .= $textserver->{$stext};
+}
+$texthash->{'installshield'}->{'TEXT_SERVERTXT'} = $tserver;
+
+# print out the result
+foreach my $type (keys (%$texthash)) {
+    print STDOUT "type:\t$type\n";
+    foreach my $key (sort keys (%{$texthash->{$type}})) {
+	print STDOUT "$key\t$texthash->{$type}->{$key}\n";
+    }
+}
+
+sub grab_macros {
+    my ($filename) = @_;
+
+    my $line = "";
+    my $pack = "Global";
+    my $macroname = "";
+    my $macrovalue = "";
+    open (FILE, $filename) || die;
+    while (defined ($line = <FILE>)) {
+	if ($line =~ /^package (\w+)/) {
+	    $pack = $1;
+	    $macroname = "";
+	    $macrovalue = "";
+	    next;
+	}
+
+	if ($line =~ /^_([^_\s]+)_\s*(?:\[[^\]]*\])?\s*\{(.*)$/s) {
+	    die "ERROR 1\n" if ($macroname ne "" || $macrovalue ne "");
+	    $macroname = $1;
+	    $macrovalue = $2 if defined $2;
+	    if ($macrovalue =~ s/^(.*?)(?<!\\)\}/$1/) {
+		&addmacro($pack, \$macroname, \$macrovalue);
+	    }		
+	} elsif ($macroname ne "") {
+	    if ($line =~ /^(.*?)(?<!\\)\}/) {
+		$macrovalue .= $1 if defined $1;
+		&addmacro($pack, \$macroname, \$macrovalue);
+	    } else {
+		$macrovalue .= $line;
+	    }
+	} elsif ($line =~ /^\#\# \"([^\"]+)\" \#\# \w+ \#\# (\w+) \#\#/) {
+	    my $imagename = "image:$2";
+	    my $imagetext = $1;
+	    &addmacro($pack, \$imagename, \$imagetext);
+	}
+    }
+    close FILE;
+}
+
+sub addmacro {
+    my ($pack, $nameref, $valref) = @_;
+
+    if ($$nameref !~ /^(httpicon|width|height)/) {
+
+	my $name = "$pack:$$nameref";
+	
+	if (defined ($texthash->{'macros'}->{$name})) {
+	    print STDERR "ERROR: $name already defined\n";	
+	}
+
+
+	$$valref =~ s/\n/\\n/gs;
+	$$valref =~ s/\t/\\t/gs;
+
+	$texthash->{'macros'}->{$name} = $$valref;
+    }
+
+    else {
+#	print STDERR "ignoring $$nameref\n";
+    }
+
+    $$nameref = "";
+    $$valref = "";
+}
Index: /main/tags/2.38/gsdl/bin/script/filecopy.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/filecopy.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/filecopy.pl	(revision 21083)
@@ -0,0 +1,184 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# filecopy.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will "download" the specified files/directories
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+use parsargv;
+use File::stat;
+use File::Basename;
+use FileHandle;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "filecopy.pl: Recursively copies files into a collections import directory.\n\n";
+    print STDERR "\n  usage: $0 [options] [directories] collection-name\n\n";
+
+    print STDERR "  options:\n";
+    print STDERR "   -follow_links           Follow symbolic links when recursing directory\n";
+    print STDERR "                           structure\n";
+    print STDERR "   -collectdir directory   Collection directory (defaults to " .
+	&util::filename_cat ($ENV{'GSDLHOME'}, "collect") . ")\n";
+    print STDERR "   -out                    Filename or handle to print output status to.\n";
+    print STDERR "                           The default is STDERR\n\n";
+}
+
+sub get_file_list {
+    my $dirhash = shift @_;
+    my $filehash = shift @_;
+    my $dirname = shift @_;
+
+    my $full_importname 
+	= &util::filename_cat($collectdir, $dirname, "import");
+
+    # check for .kill file
+    if (-e &util::filename_cat($collectdir, $dirname, ".kill")) {
+	print $out "filecopy.pl killed by .kill file\n";
+	die "\n";
+    }
+
+    foreach my $file (@_) {
+
+	$file =~ s/^\"//;
+	$file =~ s/\"$//;
+
+	if (!$follow_links && -l $file) {
+	    # do nothing as we don't want to follow symbolic links
+
+	} elsif (-d $file) {
+	    my $dst_dir = &get_dst_dir ($full_importname, $file);
+	    # add this directory to the list to be created
+	    $dirhash->{$dst_dir} = 1;
+
+	    # read in dir
+            if (!opendir (DIR, $file)) {
+                print $out "Error: Could not open directory $file\n";
+            } else {
+                my @sub_files = grep (!/^\.\.?$/, readdir (DIR));
+                closedir DIR;
+		map { $_ = &util::filename_cat($file, $_); } @sub_files;
+		&get_file_list($dirhash, $filehash, $dirname, @sub_files);
+	    }
+
+	} else {
+	    my $dst_file = &get_dst_dir ($full_importname, $file);
+
+	    # make sure files directory is included in dirhash
+	    $dirhash->{File::Basename::dirname($dst_file)} = 1;
+
+	    if (-e $dst_file) {
+		# if destination file exists already we'll only copy it if
+		# the source file is newer
+		my $src_stat = stat($file);
+		my $dst_stat = stat($dst_file);
+		$filehash->{$file} = $dst_file if ($src_stat->mtime > $dst_stat->mtime);
+	    } else {
+		$filehash->{$file} = $dst_file;
+	    }
+	}
+    }
+}
+
+
+sub main {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'follow_links', \$follow_links,
+			 'collectdir/.*/', \$collectdir,
+			 'out/.*/STDERR', \$out)) {
+	&print_usage();
+	die "\n";
+    }
+
+    if ($collectdir !~ /\w/) {
+	$collectdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect");
+    }
+
+    my $collection = pop @ARGV;
+
+    my $close_out = 0;
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") || die "Couldn't open output file $out\n";
+	$out = OUT;
+	$close_out = 1;
+    }
+    $out->autoflush(1);
+
+    # first compile a list of all the files we want to copy (we do it this
+    # way rather than simply copying the files as we recurse the directory
+    # structure to avoid nasty infinite recursion if the directory we're
+    # copying to happens to be a subdirectory of one of the directories
+    # we're copying from)
+    my $dirhash = {};
+    my $filehash = {};
+    &get_file_list($dirhash, $filehash, $collection, @ARGV);
+
+    # create all the required destination directories
+    my $count = 0;
+    foreach my $dir (keys %$dirhash) {
+	# check for .kill file
+	if (($count ++ % 20 == 0) &&
+	    (-e &util::filename_cat($collectdir, $collection, ".kill"))) {
+	    print $out "filecopy.pl killed by .kill file\n";
+	    die "\n";
+	}
+	&util::mk_all_dir($dir);
+    }
+
+    # copy all the files
+    foreach my $file (keys %$filehash) {
+	# check for .kill file
+	if (($count ++ % 20 == 0) &&
+	    (-e &util::filename_cat($collectdir, $collection, ".kill"))) {
+	    print $out "filecopy.pl killed by .kill file\n";
+	    die "\n";
+	}
+	print $out "copying $file --> $filehash->{$file}\n";
+	&util::cp($file, $filehash->{$file});
+    }
+
+    close OUT if $close_out;
+    return 0;
+}
+
+sub get_dst_dir {
+    my ($full_importname, $dir) = @_;
+
+    if ($ENV{'GSDLOS'} eq "windows") {
+	# don't want windows filenames like c:\gsdl\...\import\c:\dir
+	$dir =~ s/^[a-z]:[\\\/]//i;
+    }
+    return &util::filename_cat($full_importname, $dir);
+}
+
+&main();
Index: /main/tags/2.38/gsdl/bin/script/gimp/flash_button-1.2.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/flash_button-1.2.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/flash_button-1.2.pl	(revision 21083)
@@ -0,0 +1,344 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# flash_button.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Modified by Rachid Ben Kaddour <qben@oce.nl> for gimp1.2
+
+# flash_button.pl generates all the flashy javascript type
+# buttons used by Greenstone
+# these are the buttons described in macro files as:
+# top_nav_button
+# nav_bar_button
+# document_button
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp qw/:auto :DEFAULT/;
+use parsargv;
+use util;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_yellow = "#D2B464";
+my $black = "#000000";
+
+my ($cfg_file, $width, $height, $text, $filenamestem, $fixed_width,
+    $width_space, $whitespace, $dont_center, $bgcolor, $fontcolor, 
+    $fontsize, $fontname, $fontweight, $fontslant, $fontwidth, 
+    $fontspacing, $fontregistry, $fontencoding, $image_dir);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file        configuration file containing one or more\n";
+    print STDERR "                         sets of the following options - use to create\n";
+    print STDERR "                         batches of images\n";
+    print STDERR "   -image_dir directory  directory to create images in [`pwd`]\n";
+    print STDERR "                         this should be full path to existing directory\n";
+    print STDERR "   -width number         width of button [65]\n";
+    print STDERR "   -height number        height of button [30]\n";
+    print STDERR "   -text string          button text\n";
+    print STDERR "   -filenamestem string  filename - two images will be produced -\n";
+    print STDERR "                         filenamestemon.gif and filenamestemof.gif\n";
+    print STDERR "   -fixed_width          fix width of image - if this isn't set\n";
+    print STDERR "                         image will be cropped with with width_space\n";
+    print STDERR "                         space at each side of text\n";
+    print STDERR "   -width_space number   width in pixels of blank space to leave at left\n";
+    print STDERR "                         and right edges of text [1]\n";
+    print STDERR "   -whitespace           add 1 pixel of white space at left and right edges\n";
+    print STDERR "                         of image\n";
+    print STDERR "   -dont_center          don't center text horizontally (only applicable if\n";
+    print STDERR "                         image is fixed width\n";
+    print STDERR "   -bgcolor hex_value    background color of button [$gsdl_yellow]\n";
+    print STDERR "   -fontcolor hex_value  text color [$black]\n";
+    print STDERR "   -fontsize number      font point size [10]\n";
+    print STDERR "   -fontname string      [lucida]\n";
+    print STDERR "   -fontweight string    [medium]\n";
+    print STDERR "   -fontslant            [r]\n";
+    print STDERR "   -fontwidth            [*]\n";
+    print STDERR "   -fontspacing          [*]\n\n";
+    print STDERR "   -fontregistry         [*]\n\n";
+    print STDERR "   -fontencoding         [*]\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $width = 65;
+    $height = 30;
+    $text = "";
+    $filenamestem = "";
+    $fixed_width = 0;
+    $width_space = 1;
+    $whitespace = 0;
+    $dont_center = 0;
+    $bgcolor = $gsdl_yellow;
+    $fontcolor = $black;
+    $fontsize = 10;
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+    $fontregistry = "*";
+    $fontencoding = "*";
+}
+
+sub gsdl_flash_button {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'image_dir/.*/./', \$image_dir,
+			 'width/^\d+$/65', \$width,
+			 'height/^\d+$/30', \$height,
+			 'text/.*/', \$text,
+			 'filenamestem/.*', \$filenamestem,
+			 'fixed_width', \$fixed_width,
+			 'width_space/^\d+$/1', \$width_space,
+			 'whitespace', \$whitespace,
+			 'dont_center', \$dont_center,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_yellow", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/10', \$fontsize,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontspacing/.*/*', \$fontspacing,
+			 'fontsregistry/.*/*', \$fontregistry,
+			 'fontsencoding/.*/*', \$fontencoding)) {
+	&print_usage();
+	die "flash_button.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+
+    # replace any '\n' occurring in text with carriage return
+    $text =~ s/\\n/\n/gi;
+    
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filenamestem !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_images (0);
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_images (0);
+
+    }
+}
+
+sub produce_images {
+    my ($off_img) = @_;
+    
+    # create image, set background color etc.
+    my ($image, $backlayer) = &create_image ($off_img);
+    
+    # set the text if there is any
+    if (length($text)) {
+
+	my $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				   $fontsize, PIXELS, "*", $fontname, $fontweight, 
+				   $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding);
+	
+
+	my $textwidth = gimp_drawable_width($textlayer);
+	my $textheight = gimp_drawable_height($textlayer);
+
+	# check that text fits within image
+	if ($textheight > $height) {
+	    die "'$text' at fontsize of $fontsize pixels does not fit within image\n" . 
+		"$height pixels high. Decrease fontsize or increase image height\n";
+	}
+
+	my $spacers = $width_space * 2;
+	$spacers += 2 if $whitespace;
+
+	if (!$fixed_width || $textwidth > $width) {
+
+	    if ($fixed_width) {
+		print STDERR "WARNING (flash_button.pl): '$text' does not fit within $width pixel fixed width ";
+		print STDERR "image. Image width was increased to ",$textwidth + $spacers, " pixels\n";
+	    }
+	    
+	    $width = $textwidth + $spacers;
+
+	    # recreate image in new size
+	    ($image, $backlayer) = &create_image ($off_img);
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				    $fontsize, PIXELS, "*", $fontname, $fontweight, 
+				    $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding);
+	    
+	}
+
+	my $y_offset = ($height-$textheight)-int($fontsize/5);
+	if ($text =~ /[gjpqyJ]/) { ## capital J is a descender in lucida font
+	    # descenders - put text at bottom of image, otherwise 
+	    # go for fontsize/5 pixels above bottom. This is kind of hacky 
+	    # and may need some playing with for different fonts/fontsizes
+	    $y_offset = $height-$textheight;
+	}
+
+	if ($fixed_width) {
+	    if ($dont_center) {
+		# don't center text horizontally (start it width_space pixels from left edge)
+		my $x_offset = $width_space;
+		$x_offset += 1 if $whitespace;
+		gimp_layer_set_offsets ($textlayer, $x_offset, $y_offset);
+	    } else {
+		gimp_layer_set_offsets ($textlayer, ($width-$textwidth)/2, $y_offset);
+	    }
+	} else {
+	    gimp_layer_set_offsets ($textlayer, $spacers / 2, $y_offset); 
+	}
+    }
+    
+    # add pixel of whitespace to each edge if required
+    if ($whitespace) {
+	gimp_rect_select ($image, 0, 0, 1, $height, 0, 0, 0);
+	gimp_edit_clear ($image, $backlayer);
+	gimp_selection_none ($image);
+	gimp_rect_select ($image, $width-1, 0, 1, $height, 0, 0, 0);
+	gimp_edit_clear ($image, $backlayer);
+	gimp_selection_none ($image);
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+    
+    # make indexed colour 
+    gimp_convert_indexed ($image, NO_DITHER, MAKE_PALETTE, 256, 0, 1,"");
+    
+    # save image
+    my $filename = $filenamestem . "on.gif";
+    $filename = $filenamestem . "of.gif" if $off_img;
+    $filename = &util::filename_cat ($image_dir, $filename);
+
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+
+    &produce_images (1) unless $off_img;    
+}
+
+sub create_image {
+    my ($off_img) = @_;
+
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+    
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+    
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+    
+    # set colour of background
+    gimp_palette_set_foreground ($bgcolor);
+    
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($backlayer);
+    gimp_selection_none ($image);
+    
+    # create the gradient background
+    gimp_blend ($backlayer, 0, NORMAL_MODE, LINEAR, 70, 0, REPEAT_NONE, 0, 0, 0, 5, $height-3, 5, 0);
+    
+    # adjust lightness of "off" gif
+    gimp_hue_saturation ($backlayer, 0, 0, 100, 0) if $off_img;
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+
+    return ($image, $backlayer);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_flash_button", "create flashy javascript buttons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_flash_button", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+Gimp::on_net { gsdl_flash_button; };
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/gimp/flash_button.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/flash_button.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/flash_button.pl	(revision 21083)
@@ -0,0 +1,351 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# flash_button.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# flash_button.pl generates all the flashy javascript type
+# buttons used by Greenstone
+# these are the buttons described in macro files as:
+# top_nav_button
+# nav_bar_button
+# document_button
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp;
+use parsargv;
+use util;
+use unicode;
+
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_yellow = "#D2B464";
+my $black = "#000000";
+
+my ($cfg_file, $width, $height, $text, $filenamestem, $fixed_width,
+    $width_space, $whitespace, $dont_center, $bgcolor, $fontcolor, 
+    $fontsize, $foundry, $fontname, $fontweight, $fontslant, $fontwidth, 
+    $fontspacing, $image_dir);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file        configuration file containing one or more\n";
+    print STDERR "                         sets of the following options - use to create\n";
+    print STDERR "                         batches of images\n";
+    print STDERR "   -image_dir directory  directory to create images in [`pwd`]\n";
+    print STDERR "                         this should be full path to existing directory\n";
+    print STDERR "   -width number         width of button [65]\n";
+    print STDERR "   -height number        height of button [30]\n";
+    print STDERR "   -text string          button text\n";
+    print STDERR "   -filenamestem string  filename - two images will be produced -\n";
+    print STDERR "                         filenamestemon.gif and filenamestemof.gif\n";
+    print STDERR "   -fixed_width          fix width of image - if this isn't set\n";
+    print STDERR "                         image will be cropped with with width_space\n";
+    print STDERR "                         space at each side of text\n";
+    print STDERR "   -width_space number   width in pixels of blank space to leave at left\n";
+    print STDERR "                         and right edges of text [1]\n";
+    print STDERR "   -whitespace           add 1 pixel of white space at left and right edges\n";
+    print STDERR "                         of image\n";
+    print STDERR "   -dont_center          don't center text horizontally (only applicable if\n";
+    print STDERR "                         image is fixed width\n";
+    print STDERR "   -bgcolor hex_value    background color of button [$gsdl_yellow]\n";
+    print STDERR "   -fontcolor hex_value  text color [$black]\n";
+    print STDERR "   -fontsize number      font point size [10]\n";
+    print STDERR "   -foundry string       [*]\n";
+    print STDERR "   -fontname string      [lucida]\n";
+    print STDERR "   -fontweight string    [medium]\n";
+    print STDERR "   -fontslant            [r]\n";
+    print STDERR "   -fontwidth            [*]\n";
+    print STDERR "   -fontspacing          [*]\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $width = 65;
+    $height = 30;
+    $text = "";
+    $filenamestem = "";
+    $fixed_width = 0;
+    $width_space = 1;
+    $whitespace = 0;
+    $dont_center = 0;
+    $bgcolor = $gsdl_yellow;
+    $fontcolor = $black;
+    $fontsize = 10;
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+}
+
+sub gsdl_flash_button {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'image_dir/.*/./', \$image_dir,
+			 'width/^\d+$/65', \$width,
+			 'height/^\d+$/30', \$height,
+			 'text/.*/', \$text,
+			 'filenamestem/.*', \$filenamestem,
+			 'fixed_width', \$fixed_width,
+			 'width_space/^\d+$/1', \$width_space,
+			 'whitespace', \$whitespace,
+			 'dont_center', \$dont_center,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_yellow", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/10', \$fontsize,
+			 'foundry/.*/*', \$foundry,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontspacing/.*/*', \$fontspacing)) {
+	&print_usage();
+	die "flash_button.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+
+    # replace any '\n' occurring in text with carriage return
+    $text =~ s/\\n/\n/gi;
+
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filenamestem !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_images (0);
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_images (0);
+
+    }
+}
+
+sub produce_images {
+    my ($off_img) = @_;
+    
+    # create image, set background color etc.
+    my ($image, $backlayer) = &create_image ($off_img);
+    
+    # set the text if there is any
+    if (length($text)) {
+
+	my $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				   $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				   $fontslant, $fontwidth, $fontspacing);
+	
+
+	my $textwidth = gimp_drawable_width($textlayer);
+	my $textheight = gimp_drawable_height($textlayer);
+
+	# check that text fits within image
+	if ($textheight > $height) {
+	    die "'$text' at fontsize of $fontsize pixels does not fit within image\n" . 
+		"$height pixels high. Decrease fontsize or increase image height\n";
+	}
+
+	my $spacers = $width_space * 2;
+	$spacers += 2 if $whitespace;
+
+	if (!$fixed_width || $textwidth > $width) {
+
+	    if ($fixed_width) {
+		print STDERR "WARNING (flash_button.pl): '$text' does not fit within $width pixel fixed width ";
+		print STDERR "image. Image width was increased to ",$textwidth + $spacers, " pixels\n";
+	    }
+	    
+	    $width = $textwidth + $spacers;
+
+	    # recreate image in new size
+	    ($image, $backlayer) = &create_image ($off_img);
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				    $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				    $fontslant, $fontwidth, $fontspacing);
+	    
+	}
+
+	my $y_offset = ($height-$textheight)-int($fontsize/5);
+
+	my $descenders = "";
+
+	# russian descenders (KOI8-R)
+	# $descenders .= chr(0xD2);
+	# $descenders .= chr(0xD5);
+
+	if ($text =~ /[gjpqyJ$descenders]/) { ## capital J is a descender in lucida font
+	    # descenders - put text at bottom of image, otherwise 
+	    # go for fontsize/5 pixels above bottom. This is kind of hacky 
+	    # and may need some playing with for different fonts/fontsizes
+	    $y_offset = $height-$textheight;
+	}
+
+	if ($fixed_width) {
+	    if ($dont_center) {
+		# don't center text horizontally (start it width_space pixels from left edge)
+		my $x_offset = $width_space;
+		$x_offset += 1 if $whitespace;
+		gimp_layer_set_offsets ($textlayer, $x_offset, $y_offset);
+	    } else {
+		gimp_layer_set_offsets ($textlayer, ($width-$textwidth)/2, $y_offset);
+	    }
+	} else {
+	    gimp_layer_set_offsets ($textlayer, $spacers / 2, $y_offset); 
+	}
+    }
+    
+    # add pixel of whitespace to each edge if required
+    if ($whitespace) {
+	gimp_rect_select ($image, 0, 0, 1, $height, 0, 0, 0);
+	gimp_edit_clear ($image, $backlayer);
+	gimp_selection_none ($image);
+	gimp_rect_select ($image, $width-1, 0, 1, $height, 0, 0, 0);
+	gimp_edit_clear ($image, $backlayer);
+	gimp_selection_none ($image);
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+    
+    # make indexed colour 
+    gimp_convert_indexed ($image, 0, 256);
+    
+    # save image
+    my $filename = $filenamestem . "on.gif";
+    $filename = $filenamestem . "of.gif" if $off_img;
+    $filename = &util::filename_cat ($image_dir, $filename);
+
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+
+    &produce_images (1) unless $off_img;    
+}
+
+sub create_image {
+    my ($off_img) = @_;
+
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+    
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+    
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+    
+    # set colour of background
+    gimp_palette_set_foreground ($bgcolor);
+    
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($image, $backlayer);
+    gimp_selection_none ($image);
+    
+    # create the gradient background
+    gimp_blend ($image, $backlayer, 0, NORMAL_MODE, LINEAR, 70, 0, REPEAT_NONE, 0, 0, 0, 5, $height-3, 5, 0);
+    
+    # adjust lightness of "off" gif
+    gimp_hue_saturation ($image, $backlayer, 0, 0, 100, 0) if $off_img;
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+
+    return ($image, $backlayer);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_flash_button", "create flashy javascript buttons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_flash_button", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+sub net {
+  gsdl_flash_button;
+}
+
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/gimp/green_bar-1.2.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/green_bar-1.2.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/green_bar-1.2.pl	(revision 21083)
@@ -0,0 +1,312 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# green_bar.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Modified by Rachid Ben Kaddour <qben@oce.nl> for gimp1.2
+
+# green_bar.pl generates all the black on green gradient background
+# images used by Greenstone. 
+# these are the icons described in macro files as:
+# green version of nav_bar_button
+# green_bar_left_aligned
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp qw/:auto :DEFAULT/;
+use parsargv;
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black = "#000000";
+
+my ($cfg_file, $width, $height, $text, $filename, $width_space, 
+    $dont_center, $bgcolor, $fontcolor, $fontsize, $foundry, $fontname, 
+    $fontweight, $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding, $image_dir);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options] macrofile\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file        configuration file containing one or more\n";
+    print STDERR "                         sets of the following options - use to create\n";
+    print STDERR "                         batches of images\n";
+    print STDERR "   -image_dir directory  directory to create images in [`pwd`]\n";
+    print STDERR "                         this should be full path to existing directory\n";
+    print STDERR "   -width number         width of bar [87]\n";
+    print STDERR "   -height number        height of bar [17]\n";
+    print STDERR "   -text string          icon text\n";
+    print STDERR "   -filename string      filename of resulting image\n";
+    print STDERR "   -width_space number   width in pixels of blank space to leave at left\n";
+    print STDERR "                         and right edges of text [1]\n";
+    print STDERR "   -dont_center          don't center text horizontally\n";
+    print STDERR "   -bgcolor hex_value    background color of bar [$gsdl_green]\n";
+    print STDERR "   -fontcolor hex_value  text color [$black]\n";
+    print STDERR "   -fontsize number      font point size [17]\n";
+    print STDERR "   -foundry string       [*]\n";
+    print STDERR "   -fontname string      [lucida]\n";
+    print STDERR "   -fontweight string    [medium]\n";
+    print STDERR "   -fontslant            [r]\n";
+    print STDERR "   -fontwidth            [*]\n";
+    print STDERR "   -fontspacing          [*]\n";
+    print STDERR "   -fontregistry         [*]\n";
+    print STDERR "   -fontencoding         [*]\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $width = 87;
+    $height = 17;
+    $text = "";
+    $filename = "";
+    $width_space = 1;
+    $dont_center = 0;
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = 17;
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+    $fontregistry = "*";
+    $fontencoding = "*";
+}
+
+sub gsdl_green_bar {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'image_dir/.*/./', \$image_dir,
+			 'width/^\d+$/87', \$width,
+			 'height/^\d+$/17', \$height,
+			 'text/.*/', \$text,
+			 'filename/.*', \$filename,
+			 'width_space/^\d+$/1', \$width_space,
+			 'dont_center', \$dont_center,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/17', \$fontsize,
+			 'foundry/.*/*', \$foundry,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontregistry/.*/*', \$fontregistry,
+			 'fontencoding/.*/*', \$fontencoding,
+			 'fontspacing/.*/*', \$fontspacing)) {
+	&print_usage();
+	die "green_bar.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+    
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_image ();
+
+    }
+}
+
+sub produce_image {
+    
+    # create image, set background color etc.
+    my ($image, $backlayer) = &create_image ();
+    
+    # set the text if there is any
+    if (length($text)) {
+
+	my $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				   $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				   $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding);
+	
+
+	my $textwidth = gimp_drawable_width($textlayer);
+	my $textheight = gimp_drawable_height($textlayer);
+
+	# check that text fits within image
+	if ($textheight > $height) {
+	    die "'$text' at fontsize of $fontsize pixels does not fit within image\n" . 
+		"$height pixels high. Decrease fontsize or increase image height\n";
+	}
+
+	my $spacers = $width_space * 2;
+
+	if ($textwidth > $width) {
+
+	    print STDERR "WARNING (green_bar.pl): '$text' does not fit within $width pixel fixed width ";
+	    print STDERR "image. Image width was increased to ",$textwidth + $spacers, " pixels\n";
+	    
+	    $width = $textwidth + $spacers;
+
+	    # recreate image in new size
+	    ($image, $backlayer) = &create_image ();
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				    $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				    $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding);
+	    
+	}
+
+	my $y_offset = ($height-$textheight)-int($fontsize/5);
+
+	my $descenders = "";
+
+	# russian descenders (KOI8-R)
+	# $descenders .= chr(0xD2);
+	# $descenders .= chr(0xD5);
+
+	if ($text =~ /[gjpqyJ$descenders]/) { ## capital J is a descender in lucida font
+	    # descenders - put text at bottom of image, otherwise 
+	    # go for fontsize/5 pixels above bottom. This is kind of hacky 
+	    # and may need some playing with for different fonts/fontsizes
+	    $y_offset = $height-$textheight;
+	}
+
+	if ($dont_center) {
+	    # don't center text horizontally (start it width_space pixels from left edge)
+	    my $x_offset = $width_space;
+	    gimp_layer_set_offsets ($textlayer, $x_offset, $y_offset);
+	} else {
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)/2, $y_offset);
+	}
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+    
+    # make indexed colour 
+    gimp_convert_indexed ($image, NO_DITHER, MAKE_PALETTE, 256, 0, 1,"");
+    
+    # save image
+    $filename = &util::filename_cat ($image_dir, $filename);
+
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+
+}
+
+sub create_image {
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+    
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+    
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+    
+    # set colour of background
+    gimp_palette_set_foreground ($bgcolor);
+    
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($backlayer);
+    gimp_selection_none ($image);
+    
+    # create the gradient background
+    gimp_blend ($backlayer, 0, NORMAL_MODE, LINEAR, 70, 0, REPEAT_NONE, 0, 0, 0, 5, $height-3, 5, 0);
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+
+    return ($image, $backlayer);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_green_bar", "create green bar icons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_green_bar", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+Gimp::on_net { gsdl_green_bar; };
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/gimp/green_bar.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/green_bar.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/green_bar.pl	(revision 21083)
@@ -0,0 +1,307 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# green_bar.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# green_bar.pl generates all the black on green gradient background
+# images used by Greenstone. 
+# these are the icons described in macro files as:
+# green version of nav_bar_button
+# green_bar_left_aligned
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp;
+use parsargv;
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black = "#000000";
+
+my ($cfg_file, $width, $height, $text, $filename, $width_space, 
+    $dont_center, $bgcolor, $fontcolor, $fontsize, $foundry, $fontname, 
+    $fontweight, $fontslant, $fontwidth, $fontspacing, $image_dir);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options] macrofile\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file        configuration file containing one or more\n";
+    print STDERR "                         sets of the following options - use to create\n";
+    print STDERR "                         batches of images\n";
+    print STDERR "   -image_dir directory  directory to create images in [`pwd`]\n";
+    print STDERR "                         this should be full path to existing directory\n";
+    print STDERR "   -width number         width of bar [87]\n";
+    print STDERR "   -height number        height of bar [17]\n";
+    print STDERR "   -text string          icon text\n";
+    print STDERR "   -filename string      filename of resulting image\n";
+    print STDERR "   -width_space number   width in pixels of blank space to leave at left\n";
+    print STDERR "                         and right edges of text [1]\n";
+    print STDERR "   -dont_center          don't center text horizontally\n";
+    print STDERR "   -bgcolor hex_value    background color of bar [$gsdl_green]\n";
+    print STDERR "   -fontcolor hex_value  text color [$black]\n";
+    print STDERR "   -fontsize number      font point size [17]\n";
+    print STDERR "   -foundry string       [*]\n";
+    print STDERR "   -fontname string      [lucida]\n";
+    print STDERR "   -fontweight string    [medium]\n";
+    print STDERR "   -fontslant            [r]\n";
+    print STDERR "   -fontwidth            [*]\n";
+    print STDERR "   -fontspacing          [*]\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $width = 87;
+    $height = 17;
+    $text = "";
+    $filename = "";
+    $width_space = 1;
+    $dont_center = 0;
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = 17;
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+}
+
+sub gsdl_green_bar {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'image_dir/.*/./', \$image_dir,
+			 'width/^\d+$/87', \$width,
+			 'height/^\d+$/17', \$height,
+			 'text/.*/', \$text,
+			 'filename/.*', \$filename,
+			 'width_space/^\d+$/1', \$width_space,
+			 'dont_center', \$dont_center,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/17', \$fontsize,
+			 'foundry/.*/*', \$foundry,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontspacing/.*/*', \$fontspacing)) {
+	&print_usage();
+	die "green_bar.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+    
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_image ();
+
+    }
+}
+
+sub produce_image {
+    
+    # create image, set background color etc.
+    my ($image, $backlayer) = &create_image ();
+    
+    # set the text if there is any
+    if (length($text)) {
+
+	my $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				   $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				   $fontslant, $fontwidth, $fontspacing);
+	
+
+	my $textwidth = gimp_drawable_width($textlayer);
+	my $textheight = gimp_drawable_height($textlayer);
+
+	# check that text fits within image
+	if ($textheight > $height) {
+	    die "'$text' at fontsize of $fontsize pixels does not fit within image\n" . 
+		"$height pixels high. Decrease fontsize or increase image height\n";
+	}
+
+	my $spacers = $width_space * 2;
+
+	if ($textwidth > $width) {
+
+	    print STDERR "WARNING (green_bar.pl): '$text' does not fit within $width pixel fixed width ";
+	    print STDERR "image. Image width was increased to ",$textwidth + $spacers, " pixels\n";
+	    
+	    $width = $textwidth + $spacers;
+
+	    # recreate image in new size
+	    ($image, $backlayer) = &create_image ();
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				    $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				    $fontslant, $fontwidth, $fontspacing);
+	    
+	}
+
+	my $y_offset = ($height-$textheight)-int($fontsize/5);
+
+	my $descenders = "";
+
+	# russian descenders (KOI8-R)
+	# $descenders .= chr(0xD2);
+	# $descenders .= chr(0xD5);
+
+	if ($text =~ /[gjpqyJ$descenders]/) { ## capital J is a descender in lucida font
+	    # descenders - put text at bottom of image, otherwise 
+	    # go for fontsize/5 pixels above bottom. This is kind of hacky 
+	    # and may need some playing with for different fonts/fontsizes
+	    $y_offset = $height-$textheight;
+	}
+
+	if ($dont_center) {
+	    # don't center text horizontally (start it width_space pixels from left edge)
+	    my $x_offset = $width_space;
+	    gimp_layer_set_offsets ($textlayer, $x_offset, $y_offset);
+	} else {
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)/2, $y_offset);
+	}
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+    
+    # make indexed colour 
+    gimp_convert_indexed ($image, 0, 256);
+    
+    # save image
+    $filename = &util::filename_cat ($image_dir, $filename);
+
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+
+}
+
+sub create_image {
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+    
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+    
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+    
+    # set colour of background
+    gimp_palette_set_foreground ($bgcolor);
+    
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($image, $backlayer);
+    gimp_selection_none ($image);
+    
+    # create the gradient background
+    gimp_blend ($image, $backlayer, 0, NORMAL_MODE, LINEAR, 70, 0, REPEAT_NONE, 0, 0, 0, 5, $height-3, 5, 0);
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+
+    return ($image, $backlayer);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_green_bar", "create green bar icons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_green_bar", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+sub net {
+  gsdl_green_bar;
+}
+
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/gimp/green_bar_g12.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/green_bar_g12.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/green_bar_g12.pl	(revision 21083)
@@ -0,0 +1,309 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# green_bar.pl 
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# green_bar.pl 
+#
+# This script generates the black on green gradient background images
+# used by Greenstone.  these are the icons described in macro files as:
+# green version of nav_bar_button green_bar_left_aligned
+#
+# This version has been rewritten for the GIMP Version 1.2.  You
+# should be able to run it if you install gimp 1.2 with perl support.
+# In Debian this means running "apt-get install gimp1.2 gimp1.2perl"
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp ":auto";
+use Gimp::Fu; 
+
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black      = "#000000";
+my $white      = "#FFFFFF";
+
+my ($current_dir) = `pwd`;
+chomp($current_dir);
+
+my ($cfg_file, $width, $height, $text, $filename, $width_space, 
+    $alignment, $fgcolor, $bgcolor, $fontcolor, $fontsize, $foundry, $fontname, 
+    $fontweight, $fontslant, $fontwidth, $fontspacing, $image_dir);
+
+sub reset_options {
+    $image_dir = "./";
+    $width = 87;
+    $height = 17;
+    $text = "";
+    $filename = "";
+    $width_space = 1;
+    $alignment = "eft";
+    $fgcolor = $white;
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = 17;
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+}
+
+sub gsdl_green_bar {
+
+    ($text, $filename, $image_dir, $width, $height, $fgcolor, $bgcolor,
+    $fontcolor, $fontsize, $alignment, , $width_space, $foundry,
+    $fontname, $fontweight, $fontslant, $fontwidth, $fontspacing,
+    $cfg_file) = @_;
+
+    # Read a configuration file
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    }
+
+    # Produce an image based onlyon command-line parameters
+    else {
+
+	&produce_image ();
+
+    }
+}
+
+
+sub produce_image {
+
+    # Create background image
+    my ($image, $backlayer) = &create_image ();
+
+    # set the text if there is any
+    if (length($text)) {
+
+	my $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, 
+				   $fontsize, PIXELS, $foundry, $fontname, $fontweight, 
+				   $fontslant, $fontwidth, $fontspacing, "*", "*");
+	
+
+	my $textwidth = gimp_drawable_width($textlayer);
+	my $textheight = gimp_drawable_height($textlayer);
+
+	# check that text fits within image
+	if ($textheight > $height) {
+	    die "'$text' at fontsize of $fontsize pixels does not fit within image\n" . 
+		"$height pixels high. Decrease fontsize or increase image height\n";
+	}
+
+	my $spacers = $width_space * 2;
+
+	if ($textwidth > $width) {
+
+	    print STDERR "WARNING (green_bar.pl): '$text' does not fit within $width pixel fixed width ";
+	    print STDERR "image. Image width was increased to ",$textwidth + $spacers, " pixels\n";
+	
+	    $width = $textwidth + $spacers;
+
+	    # recreate image in new size
+	    ($image, $backlayer) = &create_image ();
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1,
+				    $fontsize, PIXELS, $foundry, $fontname, $fontweight,
+				    $fontslant, $fontwidth, $fontspacing, "*", "*");
+	
+	}
+
+	my $y_offset = ($height-$textheight)-int($fontsize/5);
+
+	my $descenders = "";
+
+	# russian descenders (KOI8-R)
+	# $descenders .= chr(0xD2);
+	# $descenders .= chr(0xD5);
+
+	if ($text =~ /[gjpqyJ$descenders]/) { ## capital J is a descender in lucida font
+	    # descenders - put text at bottom of image, otherwise 
+	    # go for fontsize/5 pixels above bottom. This is kind of hacky 
+	    # and may need some playing with for different fonts/fontsizes
+	    $y_offset = $height-$textheight;
+	}
+
+	if ($alignment =~ /^l/i) {
+	    # align text to the left
+	    my $x_offset = $width_space;
+	    gimp_layer_set_offsets ($textlayer, $x_offset, $y_offset);
+	} elsif ($alignment =~ /^r/i) {
+	    # right alignment
+	    gimp_layer_set_offsets ($textlayer, ($width-($textwidth+$width_space)), $y_offset);
+	} else {
+	    # center alignment (the default)
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)/2, $y_offset);
+	}
+    }
+
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+
+    # make indexed colour 
+    if ($filename =~ /\.gif$/i) {
+        # make indexed colour (may need to do this for 
+        # other formats as well as gif)
+        gimp_convert_indexed ($image, 0, MAKE_PALETTE, 256, 0, 0, "");
+    }
+
+    # save image
+    $filename = &util::filename_cat ($image_dir, $filename);
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+}
+
+
+sub create_image {
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+
+    # set colour of background
+    gimp_palette_set_foreground ($bgcolor);
+    gimp_palette_set_background ($fgcolor);
+
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($backlayer);
+    gimp_selection_none ($image);
+
+    # create the gradient background
+    gimp_blend ($backlayer, 0, NORMAL_MODE, LINEAR, 70, 0, REPEAT_NONE, 0, 0, 0, 5, $height-3, 5, 0);
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+
+    return ($image, $backlayer);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+
+
+register("gsdl_green_bar", 
+	 "Create green bar icons for gsdl (gimp version 1.2)",
+	 "",
+	 "Stefan Boddie (1.0) and Gordon Paynter (1.2)",
+	 "Copyright 2000 Stefan Boddie and The New Zealand Digital Library Project",
+	 "2000-07-05",
+	 "<Toolbox>/Xtns/gsdl_green_bar", 
+	 "*",
+	 [
+           [PF_STRING, "text",        "Text appearing on bar", "greenstone"],
+
+           [PF_STRING, "filename",    "Output file", "green_bar.png"],
+           [PF_STRING, "image_dir",   "Directory to create images in", $current_dir],
+
+           [PF_INT,    "width",      "Width of the bar",  640],
+           [PF_INT,    "height",     "Height of the bar", 17],
+           [PF_STRING, "fgcolor",   "Foreground colour (top) of bar", $white],
+           [PF_STRING, "bgcolor",   "Background colour (bottom) of bar", $gsdl_green],
+           [PF_STRING, "fontcolor", "Colour of text on bar", $black],
+           [PF_INT,    "fontsize",  "Font size",    17],
+
+           [PF_STRING, "alignment",     "Alignment of text on the bar (left, center or right)", "left"],
+           [PF_INT,    "padding_space", "Space around the text",                   5],
+
+           [PF_STRING, "foundry",     "Font foundry", "*"],
+           [PF_STRING, "fontname",    "Font name",    "lucida"],
+           [PF_STRING, "fontweight",  "Font weight",  "medium"],
+           [PF_STRING, "fontslant",   "Font slant",   "r"],
+           [PF_STRING, "fontwidth",   "Font width",   "*"],
+           [PF_STRING, "fontspacing", "Font spacing", "*"],
+
+           [PF_STRING, "cfg_file",    "Configuration file", ""]
+
+         ], 
+         \&gsdl_green_bar);
+
+
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/gimp/title_icon-1.2.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/title_icon-1.2.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/title_icon-1.2.pl	(revision 21083)
@@ -0,0 +1,404 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# title_icon.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Modified by Rachid Ben Kaddour <qben@oce.nl> for gimp1.2
+
+# title_icon.pl generates all the green_title type icons and 
+# collection icons for Greenstone
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp qw/:auto :DEFAULT/;
+use parsargv;
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black = "#000000";
+
+
+local ($cfg_file, $size, $imagefile, $width, $height, $imageheight, $stripecolor, $stripewidth, 
+       $stripe_alignment, $i_transparency, $text, $text_alignment, $filename, $textspace_x, 
+       $textspace_y, $bgcolor, $fontcolor, $fontsize, $minfontsize, $foundry, $fontname, 
+       $fontweight, $fontslant, $fontwidth, $fontspacing, $fontregistry, $fontencoding, $image_dir, $dont_wrap);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options] macrofile\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file         configuration file containing one or more\n";
+    print STDERR "                          sets of the following options - use to create\n";
+    print STDERR "                          batches of images\n";
+    print STDERR "   -size number           the overall size ratio of the image (i.e. a size\n";
+    print STDERR "                          of 2 will create an image twice the default size)\n";
+    print STDERR "   -image_dir directory   directory to create images in [`pwd`]\n";
+    print STDERR "                          this should be full path to existing directory\n";
+    print STDERR "   -imagefile             filename of image to embed within new icon\n";
+    print STDERR "   -width number          width of icon [150]\n";
+    print STDERR "   -height number         height of icon [44]\n";
+    print STDERR "   -imageheight number    this is the height of the image if the image contains\n";
+    print STDERR "                          an image (like collection icons) [110]\n";
+    print STDERR "   -stripecolor hex_value color of vertical stripe [$gsdl_green]\n";
+    print STDERR "   -stripewidth           width of vertical stripe [40]\n";
+    print STDERR "   -stripe_alignment      alignment of vertical stripe (left or right) [left]\n";
+    print STDERR "   -i_transparency number transparency of image within icon (0 > transparent > 100) [60]\n"; 
+    print STDERR "   -text string           image text\n";
+    print STDERR "   -text_alignment        alignment of text (left or right) [left]\n";
+    print STDERR "   -filename string       filename of resulting image\n";
+    print STDERR "   -textspace_x number    space in pixels between left/right edge of image and\n";
+    print STDERR "                          left/right edge of text [3]\n";
+    print STDERR "   -textspace_y number    space in pixels between top of image and top of\n";
+    print STDERR "                          text [3]\n";
+    print STDERR "   -bgcolor hex_value     background color of icon [$gsdl_green]\n";
+    print STDERR "   -fontcolor hex_value   text color [$black]\n";
+    print STDERR "   -fontsize number       font point size [17]\n";
+    print STDERR "   -minfontsize number    minimum point size font will be reduced to fit image [10]\n";
+    print STDERR "   -foundry string        [*]\n";
+    print STDERR "   -fontname string       [lucida]\n";
+    print STDERR "   -fontweight string     [medium]\n";
+    print STDERR "   -fontslant             [r]\n";
+    print STDERR "   -fontwidth             [*]\n";
+    print STDERR "   -fontspacing           [*]\n";
+    print STDERR "   -fontregistry          [*]\n";
+    print STDERR "   -fontencoding          [*]\n";
+    print STDERR "   -dont_wrap             don't attempt to wrap text\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $imagefile = "";
+    $width = int (150 * $size);
+    $height = int (44 * $size);
+    $imageheight = int (110 * $size);
+    $stripecolor = $gsdl_green;
+    $stripewidth = int (40 * $size);
+    $stripe_alignment = "left";
+    $i_transparency = 60;
+    $text = "";
+    $text_alignment = "left";
+    $filename = "";
+    $textspace_x = int (3 * $size);
+    $textspace_y = int (3 * $size);
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = int (17 * $size);
+    $minfontsize = int (10 * $size);
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+    $fontregistry = "*";
+    $fontencoding = "*";
+}
+
+sub gsdl_title_icon {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'size/\d+/1', \$size,
+			 'image_dir/.*/./', \$image_dir,
+			 'imagefile/.*/', \$imagefile,
+			 'width/^\d+$/150', \$width,
+			 'height/^\d+$/44', \$height,
+			 'imageheight/^\d+$/110', \$imageheight,
+			 "stripecolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$stripecolor,
+			 'stripewidth/^\d+$/40', \$stripewidth,
+			 'stripe_alignment/^(left|right)$/left', \$stripe_alignment,
+			 'i_transparency/^\d+$/60', \$i_transparency,
+			 'text/.*/', \$text,
+			 'text_alignment/^(left|right)$/left', \$text_alignment,
+			 'filename/.*', \$filename,
+			 'textspace_x/^\d+$/3', \$textspace_x,
+			 'textspace_y/^\d+$/3', \$textspace_y,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/17', \$fontsize,
+			 'minfontsize/^\d+$/10', \$minfontsize,
+			 'foundry/.*/*', \$foundry,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontspacing/.*/*', \$fontspacing,
+			 'fontregistry/.*/*', \$fontregistry,
+			 'fontencoding/.*/*', \$fontencoding,
+			 'dont_wrap', \$dont_wrap)) {
+	&print_usage();
+	die "title_icon.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_image ();
+
+    }
+}
+
+sub produce_image {
+
+    &adjust_args ();
+    &wrap_text () unless $dont_wrap;
+
+    my $use_image = 0;
+    if ($imagefile =~ /\w/) {
+	if (!-r $imagefile) {
+	    print STDERR "WARNING (title_icon.pl): imagefile '$imagefile cannot be ";
+	    print STDERR "read - $filename will be created without the use of an image file\n";
+	} else {
+	    $use_image = 1;
+	    $height = $imageheight;
+	}
+    }
+
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+	
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+	
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+	
+    # set colour of stripe
+    gimp_palette_set_foreground ($stripecolor);
+	
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($backlayer);
+    gimp_selection_none ($image);
+	
+    # fill in stripe
+    if ($stripe_alignment eq "left") {
+	gimp_rect_select ($image, 0, 0, $stripewidth, $height, 0, 0, 0);
+    } else {
+	gimp_rect_select ($image, $width-$stripewidth, 0, $stripewidth, $height, 0, 0, 0);
+    }
+    gimp_bucket_fill ($backlayer, FG_BUCKET_FILL, NORMAL_MODE, 100, 0, 1, 0, 0);
+    gimp_selection_none ($image);
+	
+    # get image file (image goes on opposite side to stripe)
+    if ($use_image) {
+	my $rimage = gimp_file_load (RUN_NONINTERACTIVE, $imagefile, $imagefile);
+	my $rdraw = gimp_image_active_drawable ($rimage);
+	gimp_scale ($rimage, $rdraw, 1, 0, 0, $width-$stripewidth, $height);
+	gimp_edit_copy ($rimage, $rdraw);
+	
+	my $imagelayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+					 "ImageLayer", $i_transparency, NORMAL_MODE);
+	
+	gimp_image_add_layer ($image, $imagelayer, 0);
+	
+	# clear the new layer
+	gimp_selection_all ($image);
+	gimp_edit_clear ($image, $imagelayer);
+	gimp_selection_none ($image);
+	
+	my $flayer = gimp_edit_paste ($image, $imagelayer, 1); 
+	if ($stripe_alignment eq "left") {
+	    gimp_layer_set_offsets($flayer, $stripewidth, 0);
+	    gimp_layer_set_offsets($imagelayer, $stripewidth, 0);
+	} else {
+	    gimp_layer_set_offsets($flayer, 0, 0);
+	    gimp_layer_set_offsets($imagelayer, 0, 0);
+	}
+    }
+	
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+	
+    # set the text if there is any
+    my ($textlayer, $textheight, $textwidth);
+    my $fsize = $fontsize;
+    if (length($text)) {
+	$text =~ s/\\n/\n/gi;
+
+	while (1) {
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, $fsize, 
+				    PIXELS, $foundry, $fontname, $fontweight, $fontslant, 
+				    $fontwidth, $fontspacing, $fontregistry, $fontencoding);
+	    
+	    # check that text fits within image
+	    $textwidth = gimp_drawable_width($textlayer);
+	    $textheight = gimp_drawable_height($textlayer);
+	    if ((($textwidth + $textspace_x) > $width) || 
+		(($textheight + $textspace_y) > $height)) {
+		if ($fsize < $minfontsize) {
+		    die "Error (title_icon.pl): text '$text' doesn't fit on ${width}x${height} image " .
+			"(minimum font size tried: $minfontsize\n";
+		} else {
+		    gimp_selection_all ($image);
+		    gimp_edit_clear ($image, $textlayer);
+		    gimp_selection_none ($image);
+		    $fsize --;
+		    print STDERR "WARNING (title_icon.pl): '$text' doesn't fit: reducing font size to $fsize\n";
+		}
+	    } else {
+		last;
+	    }
+	}
+	
+	# align text
+	if ($text_alignment eq "left") {
+	    gimp_layer_set_offsets ($textlayer, $textspace_x, $textspace_y);
+	} else {
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)-$textspace_x, $textspace_y);
+	}
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+	
+    if ($filename =~ /\.gif$/i) {
+	# make indexed colour (may need to do this for 
+	# other formats as well as gif)
+	gimp_convert_indexed ($image, NO_DITHER, MAKE_PALETTE, 256, 0, 1, "");
+    }
+	
+    # save image
+    my $filename = &util::filename_cat ($image_dir, $filename);
+    if ($filename =~ /\.jpe?g$/i) {
+	# gimp_file_save doesn't appear to work properly for jpegs
+	file_jpeg_save (RUN_NONINTERACTIVE, $image, $finishedlayer, 
+			$filename, $filename, 0.8, 0, 1);
+    } else {
+	gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, 
+			$filename, $filename);
+    }
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+
+# adjust arguments that are effected by the size argument
+sub adjust_args {    
+
+    if ($size != 1) {
+	my @size_args = ('width', 'height', 'imageheight', 'stripewidth',
+			 'textspace_x', 'textspace_y', 'fontsize', 'minfontsize');
+	foreach $arg (@size_args) {
+	    $$arg = int ($$arg * $size);
+	}
+    }
+}
+
+sub wrap_text {
+
+    # don't wrap text if it already contains carriage returns
+    return if $text =~ /\n/;
+
+    # the following assumes that all words are less than $wrap_length long
+    my $wrap_length = 14;
+
+    my $new_text = "";
+    while (length ($text) >= $wrap_length) {
+	my $line = substr ($text, 0, $wrap_length);
+	$text =~ s/^$line//;
+	$line =~ s/\s([^\s]*)$/\n/;
+	$text = $1 . $text;
+	$new_text .= $line;
+    }
+    $new_text .= $text;
+    $text = $new_text;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_title_icon", "create title icons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_title_icon", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+Gimp::on_net { gsdl_title_icon; };
+exit main;
+
Index: /main/tags/2.38/gsdl/bin/script/gimp/title_icon.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/title_icon.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/title_icon.pl	(revision 21083)
@@ -0,0 +1,399 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# title_icon.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# title_icon.pl generates all the green_title type icons and 
+# collection icons for Greenstone
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp;
+use parsargv;
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black = "#000000";
+
+
+local ($cfg_file, $size, $imagefile, $width, $height, $imageheight, $stripecolor, $stripewidth, 
+       $stripe_alignment, $i_transparency, $text, $text_alignment, $filename, $textspace_x, 
+       $textspace_y, $bgcolor, $fontcolor, $fontsize, $minfontsize, $foundry, $fontname, 
+       $fontweight, $fontslant, $fontwidth, $fontspacing, $image_dir, $dont_wrap);
+
+sub print_usage {
+    print STDERR "\n  usage: $0 [options] macrofile\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -cfg_file file         configuration file containing one or more\n";
+    print STDERR "                          sets of the following options - use to create\n";
+    print STDERR "                          batches of images\n";
+    print STDERR "   -size number           the overall size ratio of the image (i.e. a size\n";
+    print STDERR "                          of 2 will create an image twice the default size)\n";
+    print STDERR "   -image_dir directory   directory to create images in [`pwd`]\n";
+    print STDERR "                          this should be full path to existing directory\n";
+    print STDERR "   -imagefile             filename of image to embed within new icon\n";
+    print STDERR "   -width number          width of icon [150]\n";
+    print STDERR "   -height number         height of icon [44]\n";
+    print STDERR "   -imageheight number    this is the height of the image if the image contains\n";
+    print STDERR "                          an image (like collection icons) [110]\n";
+    print STDERR "   -stripecolor hex_value color of vertical stripe [$gsdl_green]\n";
+    print STDERR "   -stripewidth           width of vertical stripe [40]\n";
+    print STDERR "   -stripe_alignment      alignment of vertical stripe (left or right) [left]\n";
+    print STDERR "   -i_transparency number transparency of image within icon (0 > transparent > 100) [60]\n"; 
+    print STDERR "   -text string           image text\n";
+    print STDERR "   -text_alignment        alignment of text (left or right) [left]\n";
+    print STDERR "   -filename string       filename of resulting image\n";
+    print STDERR "   -textspace_x number    space in pixels between left/right edge of image and\n";
+    print STDERR "                          left/right edge of text [3]\n";
+    print STDERR "   -textspace_y number    space in pixels between top of image and top of\n";
+    print STDERR "                          text [3]\n";
+    print STDERR "   -bgcolor hex_value     background color of icon [$gsdl_green]\n";
+    print STDERR "   -fontcolor hex_value   text color [$black]\n";
+    print STDERR "   -fontsize number       font point size [17]\n";
+    print STDERR "   -minfontsize number    minimum point size font will be reduced to fit image [10]\n";
+    print STDERR "   -foundry string        [*]\n";
+    print STDERR "   -fontname string       [lucida]\n";
+    print STDERR "   -fontweight string     [medium]\n";
+    print STDERR "   -fontslant             [r]\n";
+    print STDERR "   -fontwidth             [*]\n";
+    print STDERR "   -fontspacing           [*]\n";
+    print STDERR "   -dont_wrap             don't attempt to wrap text\n\n";
+}
+
+sub reset_options {
+    $image_dir = "./";
+    $imagefile = "";
+    $width = int (150 * $size);
+    $height = int (44 * $size);
+    $imageheight = int (110 * $size);
+    $stripecolor = $gsdl_green;
+    $stripewidth = int (40 * $size);
+    $stripe_alignment = "left";
+    $i_transparency = 60;
+    $text = "";
+    $text_alignment = "left";
+    $filename = "";
+    $textspace_x = int (3 * $size);
+    $textspace_y = int (3 * $size);
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = int (17 * $size);
+    $minfontsize = int (10 * $size);
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+}
+
+sub gsdl_title_icon {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'cfg_file/.*/', \$cfg_file,
+			 'size/\d+/1', \$size,
+			 'image_dir/.*/./', \$image_dir,
+			 'imagefile/.*/', \$imagefile,
+			 'width/^\d+$/150', \$width,
+			 'height/^\d+$/44', \$height,
+			 'imageheight/^\d+$/110', \$imageheight,
+			 "stripecolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$stripecolor,
+			 'stripewidth/^\d+$/40', \$stripewidth,
+			 'stripe_alignment/^(left|right)$/left', \$stripe_alignment,
+			 'i_transparency/^\d+$/60', \$i_transparency,
+			 'text/.*/', \$text,
+			 'text_alignment/^(left|right)$/left', \$text_alignment,
+			 'filename/.*', \$filename,
+			 'textspace_x/^\d+$/3', \$textspace_x,
+			 'textspace_y/^\d+$/3', \$textspace_y,
+			 "bgcolor/#[0-9A-Fa-f]{6}/$gsdl_green", \$bgcolor,
+			 "fontcolor/#[0-9A-Fa-f]{6}/$black", \$fontcolor,
+			 'fontsize/^\d+$/17', \$fontsize,
+			 'minfontsize/^\d+$/10', \$minfontsize,
+			 'foundry/.*/*', \$foundry,
+			 'fontname/.*/lucida', \$fontname,
+			 'fontweight/.*/medium', \$fontweight,
+			 'fontslant/.*/r', \$fontslant,
+			 'fontwidth/.*/*', \$fontwidth,
+			 'fontspacing/.*/*', \$fontspacing,
+			 'dont_wrap', \$dont_wrap)) {
+	&print_usage();
+	die "title_icon.pl: incorrect options\n";
+    }
+
+    # will create wherever gimp was started up from if we don't do this
+    if ($image_dir eq "./") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+    }
+
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+
+	close CONF;
+
+    } else {
+
+	&produce_image ();
+
+    }
+}
+
+sub produce_image {
+
+    &adjust_args ();
+    &wrap_text () unless $dont_wrap;
+
+    my $use_image = 0;
+    if ($imagefile =~ /\w/) {
+	if (!-r $imagefile) {
+	    print STDERR "WARNING (title_icon.pl): imagefile '$imagefile cannot be ";
+	    print STDERR "read - $filename will be created without the use of an image file\n";
+	} else {
+	    $use_image = 1;
+	    $height = $imageheight;
+	}
+    }
+
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+	
+    # background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+	
+    # add the background layer
+    gimp_image_add_layer ($image, $backlayer, 0);
+	
+    # set colour of stripe
+    gimp_palette_set_foreground ($stripecolor);
+	
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($image, $backlayer);
+    gimp_selection_none ($image);
+	
+    # fill in stripe
+    if ($stripe_alignment eq "left") {
+	gimp_rect_select ($image, 0, 0, $stripewidth, $height, 0, 0, 0);
+    } else {
+	gimp_rect_select ($image, $width-$stripewidth, 0, $stripewidth, $height, 0, 0, 0);
+    }
+    gimp_bucket_fill ($image, $backlayer, FG_BUCKET_FILL, NORMAL_MODE, 100, 0, 1, 0, 0);
+    gimp_selection_none ($image);
+	
+    # get image file (image goes on opposite side to stripe)
+    if ($use_image) {
+	my $rimage = gimp_file_load (RUN_NONINTERACTIVE, $imagefile, $imagefile);
+	my $rdraw = gimp_image_active_drawable ($rimage);
+	gimp_scale ($rimage, $rdraw, 1, 0, 0, $width-$stripewidth, $height);
+	gimp_edit_copy ($rimage, $rdraw);
+	
+	my $imagelayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+					 "ImageLayer", $i_transparency, NORMAL_MODE);
+	
+	gimp_image_add_layer ($image, $imagelayer, 0);
+	
+	# clear the new layer
+	gimp_selection_all ($image);
+	gimp_edit_clear ($image, $imagelayer);
+	gimp_selection_none ($image);
+	
+	my $flayer = gimp_edit_paste ($image, $imagelayer, 1); 
+	if ($stripe_alignment eq "left") {
+	    gimp_layer_set_offsets($flayer, $stripewidth, 0);
+	    gimp_layer_set_offsets($imagelayer, $stripewidth, 0);
+	} else {
+	    gimp_layer_set_offsets($flayer, 0, 0);
+	    gimp_layer_set_offsets($imagelayer, 0, 0);
+	}
+    }
+	
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+	
+    # set the text if there is any
+    my ($textlayer, $textheight, $textwidth);
+    my $fsize = $fontsize;
+    if (length($text)) {
+	$text =~ s/\\n/\n/gi;
+
+	while (1) {
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, $fsize, 
+				    PIXELS, $foundry, $fontname, $fontweight, $fontslant, 
+				    $fontwidth, $fontspacing);
+	    
+	    # check that text fits within image
+	    $textwidth = gimp_drawable_width($textlayer);
+	    $textheight = gimp_drawable_height($textlayer);
+	    if ((($textwidth + $textspace_x) > $width) || 
+		(($textheight + $textspace_y) > $height)) {
+		if ($fsize < $minfontsize) {
+		    die "Error (title_icon.pl): text '$text' doesn't fit on ${width}x${height} image " .
+			"(minimum font size tried: $minfontsize\n";
+		} else {
+		    gimp_selection_all ($image);
+		    gimp_edit_clear ($image, $textlayer);
+		    gimp_selection_none ($image);
+		    $fsize --;
+		    print STDERR "WARNING (title_icon.pl): '$text' doesn't fit: reducing font size to $fsize\n";
+		}
+	    } else {
+		last;
+	    }
+	}
+	
+	# align text
+	if ($text_alignment eq "left") {
+	    gimp_layer_set_offsets ($textlayer, $textspace_x, $textspace_y);
+	} else {
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)-$textspace_x, $textspace_y);
+	}
+    }
+    
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+	
+    if ($filename =~ /\.gif$/i) {
+	# make indexed colour (may need to do this for 
+	# other formats as well as gif)
+	gimp_convert_indexed ($image, 0, 256);
+    }
+	
+    # save image
+    my $filename = &util::filename_cat ($image_dir, $filename);
+    if ($filename =~ /\.jpe?g$/i) {
+	# gimp_file_save doesn't appear to work properly for jpegs
+	file_jpeg_save (RUN_NONINTERACTIVE, $image, $finishedlayer, 
+			$filename, $filename, 0.8, 0, 1);
+    } else {
+	gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, 
+			$filename, $filename);
+    }
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+
+# adjust arguments that are effected by the size argument
+sub adjust_args {    
+
+    if ($size != 1) {
+	my @size_args = ('width', 'height', 'imageheight', 'stripewidth',
+			 'textspace_x', 'textspace_y', 'fontsize', 'minfontsize');
+	foreach $arg (@size_args) {
+	    $$arg = int ($$arg * $size);
+	}
+    }
+}
+
+sub wrap_text {
+
+    # don't wrap text if it already contains carriage returns
+    return if $text =~ /\n/;
+
+    # the following assumes that all words are less than $wrap_length long
+    my $wrap_length = 14;
+
+    my $new_text = "";
+    while (length ($text) >= $wrap_length) {
+	my $line = substr ($text, 0, $wrap_length);
+	$text =~ s/^$line//;
+	$line =~ s/\s([^\s]*)$/\n/;
+	$text = $1 . $text;
+	$new_text .= $line;
+    }
+    $new_text .= $text;
+    $text = $new_text;
+}
+    
+sub query {
+
+  gimp_install_procedure("gsdl_title_icon", "create title icons for gsdl",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-10",
+                        "<Toolbox>/Xtns/gsdl_title_icon", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+sub net {
+  gsdl_title_icon;
+}
+
+exit main;
+
Index: /main/tags/2.38/gsdl/bin/script/gimp/title_icon_g12.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gimp/title_icon_g12.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gimp/title_icon_g12.pl	(revision 21083)
@@ -0,0 +1,380 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# title_icon.pl
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# title_icon.pl
+#
+# This script generates collection title icons for greenstone.
+#
+# This version has been rewritten for the GIMP Version 1.2.  You
+# should be able to run it if you install gimp 1.2 with perl support.
+# In Debian this means running "apt-get install gimp1.2 gimp1.2perl"
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp ":auto";
+use Gimp::Fu; 
+
+use util;
+use unicode;
+
+# set trace level to watch functions as they are executed
+#Gimp::set_trace(TRACE_ALL);
+#Gimp::set_trace(TRACE_CALL);
+
+my $gsdl_green = "#96c19b";
+my $black = "#000000";
+my $white      = "#FFFFFF";
+
+my ($current_dir) = `pwd`;
+chomp($current_dir);
+
+
+my ($text, $filename, $image_dir, $size, $width, $height,
+    $stripecolor, $stripewidth, $stripe_alignment, $textspace_x,
+    $textspace_y, $dont_wrap, $imagefile, $imageheight, $i_transparency,
+    $bgcolor, $fontcolor, $fontsize, $minfontsize, $text_alignment,
+    $foundry, $fontname, $fontweight, $fontslant, $fontwidth,
+    $fontspacing, $cfg_file);
+
+sub reset_options {
+    $image_dir = "./";
+    $imagefile = "";
+    $width = int (150 * $size);
+    $height = int (44 * $size);
+    $imageheight = int (110 * $size);
+    $stripecolor = $gsdl_green;
+    $stripewidth = int (40 * $size);
+    $stripe_alignment = "left";
+    $i_transparency = 60;
+    $text = "";
+    $text_alignment = "left";
+    $filename = "";
+    $textspace_x = int (3 * $size);
+    $textspace_y = int (3 * $size);
+    $bgcolor = $gsdl_green;
+    $fontcolor = $black;
+    $fontsize = int (17 * $size);
+    $minfontsize = int (10 * $size);
+    $foundry = "*";
+    $fontname = "lucida";
+    $fontweight = "medium";
+    $fontslant = "r";
+    $fontwidth = "*";
+    $fontspacing = "*";
+}
+
+sub gsdl_title_icon {
+
+    ($text, $filename, $image_dir, $size, $width, $height,
+     $stripecolor, $stripewidth, $stripe_alignment, $textspace_x,
+     $textspace_y, $dont_wrap, $imagefile, $imageheight, $i_transparency,
+     $bgcolor, $fontcolor, $fontsize, $minfontsize, $text_alignment,
+     $foundry, $fontname, $fontweight, $fontslant, $fontwidth,
+     $fontspacing, $cfg_file) = @_;
+
+    # Create images using a configuration file
+    if ($cfg_file =~ /\w/) {
+	
+	open (CONF, $cfg_file) || die "couldn't open cfg_file $cfg_file\n";
+	while (1) {
+
+	    &reset_options ();
+	
+	    # read image configuration entry
+	    my $status = &read_config_entry (CONF);
+	    if ($filename !~ /\w/) {
+		if ($status) {last;}
+		else {next;}
+	    }
+	    &produce_image ();
+	    if ($status) {last;}
+	}
+	close CONF;
+    }
+
+    # Create a single image from the parameters we have
+    else {
+	&produce_image ();
+    }
+
+}
+
+sub produce_image {
+
+    &adjust_args ();
+    &wrap_text () unless $dont_wrap;
+
+    my $use_image = 0;
+    if ($imagefile =~ /\w/) {
+	if (!-r $imagefile) {
+	    print STDERR "WARNING (title_icon.pl): imagefile '$imagefile cannot be ";
+	    print STDERR "read - $filename will be created without the use of an image file\n";
+	} else {
+	    $use_image = 1;
+	    $height = $imageheight;
+	}
+    }
+
+    # create the image
+    my $image = gimp_image_new ($width, $height, RGB_IMAGE);
+	
+    # create and add the background layer
+    my $backlayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+				    "BGLayer", 100, NORMAL_MODE);
+    gimp_image_add_layer ($image, $backlayer, 0);
+	
+    # clear the background
+    gimp_selection_all ($image);
+    gimp_edit_clear ($backlayer);
+    gimp_selection_none ($image);
+	
+    # fill in stripe
+    if ($stripewidth > 0) {
+        gimp_palette_set_foreground ($stripecolor);
+	if ($stripe_alignment eq "left") {
+	  gimp_rect_select ($image, 0, 0, $stripewidth, $height, 0, 0, 0);
+	} else {
+	  gimp_rect_select ($image, $width-$stripewidth, 0, $stripewidth, $height, 0, 0, 0);
+	}
+	gimp_bucket_fill ($backlayer, FG_BUCKET_FILL, NORMAL_MODE, 100, 0, 1, 0, 0);
+	gimp_selection_none ($image);
+    }
+
+    # get image file (image goes on opposite side to stripe)
+    if ($use_image) {
+	my $rimage = gimp_file_load (RUN_NONINTERACTIVE, $imagefile, $imagefile);
+	my $rdraw = gimp_image_active_drawable ($rimage);
+	gimp_scale ($rdraw, 1, 0, 0, $width-$stripewidth, $height);
+	gimp_edit_copy ($rdraw);
+	
+	# add the background image layer
+	my $imagelayer = gimp_layer_new ($image, $width, $height, RGB_IMAGE, 
+					 "ImageLayer", $i_transparency, NORMAL_MODE);
+	gimp_image_add_layer ($image, $imagelayer, 0);
+	
+	# clear the new layer
+	gimp_selection_all ($image);
+	gimp_edit_clear ($imagelayer);
+	gimp_selection_none ($image);
+	
+	my $flayer = gimp_edit_paste ($imagelayer, 1); 
+	if ($stripe_alignment eq "left") {
+	    gimp_layer_set_offsets($flayer, $stripewidth, 0);
+	    gimp_layer_set_offsets($imagelayer, $stripewidth, 0);
+	} else {
+	    gimp_layer_set_offsets($flayer, 0, 0);
+	    gimp_layer_set_offsets($imagelayer, 0, 0);
+	}
+    }
+
+    # flatten the image (otherwise the text will be "behind" the image)
+    $backlayer = gimp_image_flatten ($image);
+
+    # set colour of text
+    gimp_palette_set_foreground ($fontcolor);
+	
+    # set the text if there is any
+    my ($textlayer, $textheight, $textwidth);
+    my $fsize = $fontsize;
+    if (length($text)) {
+	$text =~ s/\\n/\n/gi;
+
+	while (1) {
+	    $textlayer = gimp_text ($image, $backlayer, 0, 0, $text, 0, 1, $fsize, 
+				    PIXELS, $foundry, $fontname, $fontweight, $fontslant, 
+				    $fontwidth, $fontspacing, "*", "*");
+	
+	    # check that text fits within image
+	    $textwidth = gimp_drawable_width($textlayer);
+	    $textheight = gimp_drawable_height($textlayer);
+	    if ((($textwidth + $textspace_x) > $width) || 
+		(($textheight + $textspace_y) > $height)) {
+		if ($fsize < $minfontsize) {
+		    die "Error (title_icon.pl): text '$text' doesn't fit on ${width}x${height} image " .
+			"(minimum font size tried: $minfontsize\n";
+		} else {
+		    gimp_selection_all ($image);
+		    gimp_edit_clear ($image, $textlayer);
+		    gimp_selection_none ($image);
+		    $fsize --;
+		    print STDERR "WARNING (title_icon.pl): '$text' doesn't fit: reducing font size to $fsize\n";
+		}
+	    } else {
+		last;
+	    }
+	}
+	
+	# align text
+	if ($text_alignment eq "left") {
+	    gimp_layer_set_offsets ($textlayer, $textspace_x, $textspace_y);
+	} else {
+	    gimp_layer_set_offsets ($textlayer, ($width-$textwidth)-$textspace_x, $textspace_y);
+	}
+    }
+
+    # flatten the image
+    my $finishedlayer = gimp_image_flatten ($image);
+	
+    if ($filename =~ /\.gif$/i) {
+	# make indexed colour (may need to do this for 
+	# other formats as well as gif)
+	gimp_convert_indexed ($image, 0, 256);
+    }
+	
+    # save image
+    my $filename = &util::filename_cat ($image_dir, $filename);
+    gimp_file_save (RUN_NONINTERACTIVE, $image, $finishedlayer, $filename, $filename);
+}
+
+# returns 1 if this is the last entry,
+sub read_config_entry {
+    my ($handle) = @_;
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	next unless $line =~ /\w/;
+	my @line = ();
+	if ($line =~ /^\-+/) {return 0;}
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute any environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+		
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+	if (scalar (@line) == 2 && defined ${$line[0]}) {
+	    ${$line[0]} = $line[1];
+	}
+    }
+    return 1;
+}
+
+# adjust arguments that are effected by the size argument
+sub adjust_args {
+
+    if ($size != 1) {
+        $width *= $size;
+        $height *= $size;
+	$imageheight *= $size;
+	$stripewidth *= $size;
+	$textspace_x *= $size;
+	$textspace_y *= $size;
+	$fontsize *= $size;
+	$minfontsize *= $size;
+    }
+}
+
+sub wrap_text {
+
+    # don't wrap text if it already contains carriage returns
+    return if $text =~ /\n/;
+
+    # the following assumes that all words are less than $wrap_length long
+    my $wrap_length = 14;
+
+    my $new_text = "";
+    while (length ($text) >= $wrap_length) {
+	my $line = substr ($text, 0, $wrap_length);
+	$text =~ s/^$line//;
+	$line =~ s/\s([^\s]*)$/\n/;
+	$text = $1 . $text;
+	$new_text .= $line;
+    }
+    $new_text .= $text;
+    $text = $new_text;
+}
+
+
+register("gsdl_title_icon", 
+	 "Create title icons for gsdl (gimp version 1.2)",
+	 "", 
+	 "Stefan Boddie (1.0) and Gordon Paynter (1.2)",
+	 "Copyright 1999-2001 The New Zealand Digital Library Project",
+	 "2000-03-10",
+	 "<Toolbox>/Xtns/gsdl_title_icon", 
+	 "*",
+	 [
+           [PF_STRING, "text",      "Text appearing on icon", "greenstone collection"],
+
+           [PF_STRING, "filename",  "Output file", "title_icon.png"],
+           [PF_STRING, "image_dir", "Directory to create images in", $current_dir],
+
+           [PF_INT,    "size_ratio", "Size factor: a factor of 2 doulbles image size",  1],
+           [PF_INT,    "width",      "Width of the icon",  150],
+           [PF_INT,    "height",     "Height of the icon", 44],
+
+           [PF_STRING, "stripecolor", "Colour of the stripe", $gsdl_green],
+           [PF_INT,    "stripewidth", "Width of the stripe",  40],
+           [PF_STRING, "stripealign", "Alignment of stripe (left or right)", "left"],
+
+           [PF_INT,    "text_x_offset",    "Distance from left of image to text", 3],
+           [PF_INT,    "text_y_offset",    "Distance from top of image to text",  3],
+           [PF_STRING, "dont_wrap",        "don't attempt to wrap text", ""],
+
+           [PF_STRING, "imagefile",   "Filename of background image", ""],
+           [PF_INT,    "imageheight", "Height of background image", 110],
+           [PF_INT,    "imagetransp", "Transparency of background image (1-100)", 60],
+
+#           [PF_STRING, "fgcolor",     "Foreground colour (top) of bar", $white],
+           [PF_STRING, "bgcolor",     "Background colour (bottom) of bar", $gsdl_green],
+           [PF_STRING, "fontcolor",   "Colour of text on bar", $black],
+           [PF_INT,    "fontsize",    "Font size",    17],
+           [PF_INT,    "minfontsize", "Minimum font size if scaling required",    10],
+
+           [PF_STRING, "alignment",     "Alignment of text on the icon (left or right)", "left"],
+
+           [PF_STRING, "foundry",     "Font foundry", "*"],
+           [PF_STRING, "fontname",    "Font name",    "lucida"],
+           [PF_STRING, "fontweight",  "Font weight",  "medium"],
+           [PF_STRING, "fontslant",   "Font slant",   "r"],
+           [PF_STRING, "fontwidth",   "Font width",   "*"],
+           [PF_STRING, "fontspacing", "Font spacing", "*"],
+
+           [PF_STRING, "cfg_file",    "Configuration file", ""]
+
+         ], 
+         \&gsdl_title_icon);
+
+
+exit main;
+
+
Index: /main/tags/2.38/gsdl/bin/script/grab_collection.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/grab_collection.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/grab_collection.pl	(revision 21083)
@@ -0,0 +1,570 @@
+#!/usr/bin/perl -w
+
+
+# Both this script and its associated process_html.pl were written by
+# Marcel ?, while a student at Waikato University. Unfortunately he
+# was very new to perl at the time so the code is neither as clean nor
+# as fast as it could be (I've cleaned up a few of the more serious
+# bottlenecks -- it could do with alot more work though).  The code
+# does work though, if a little slowly. It's not ready for primetime
+# however and is included in the Greenstone source tree mostly so that
+# I don't lose it. -- Stefan - 24 Jul 2001
+
+
+# This script will download an entire collection (and its associated pictures and files) 
+# and store them in a temporary directory ($outputdir). 
+# A second script (process_html.pl) can be then be used to 'rebuild' the collection and link all the
+# downloaded pages and pictures together into a usable static collection.
+
+# This script will generate a number of text files required by the second script
+# and for possible recovery, namely:
+# - links.txt        - contains all the http links that were downloaded
+# - images.txt       - contains a list of all the images that were downloaded  
+# - image_dirs.txt   - contains a list of all the image-prefixes that need to be wiped from the html files
+#                      (otherwise you won't get to see any pictures)
+
+# Both this script and the html processing script have a recovery feature built in, they can continue from wherever
+# they left off, but this only works if $outputdir and $finaldir are set to different values.
+   
+# This is where all the downloaded html files end up, eg. 'temp_html/'
+my $outputdir  = 'temp_html/';
+# This is where all the processed html files (and the pictures) will end up eg. 'my_static_collection/'
+my $finaldir   = 'envl_collection/';
+
+# This is where we start our mirroring
+$address = 'http://nowhere.com/cgi-bin/library?a=p&p=about&c=demo&u=1';
+
+
+# whatever is specified in $option will be attached to the end of each html link before it is downloaded.
+# eg. "&u=1" to disable various features in the greenstone collections that are not needed with a static
+#            collection.
+# another example : "&l=nl" to set the entire collection to dutch (NetherLands :)  
+my $option = "&u=1";
+
+# Most OS have a limit on the maximum amount of files per directory (or folder).
+# A static collection can easily contain >3000 html files. Putting all those files
+# into one single directory is just asking for trouble. It's also very unwieldy ;^)
+# Hence...this value will set how much html files will be stored in one directory. 
+# These directories themselves will be numbered, 
+# so if $dir_entries = 500 then the directories will be "0/", "500/", "1000/", "1500/", "2000/", etc. 
+my $dir_entries = 250;
+
+# Occasionally a page occurs which contains no data (because &cl is not set) This option fixes that. 
+my $fix_empty_pages = "&cl=CL1";
+
+# These are the files that wget will download.
+# more can be added if necessary.
+my @graphic_formats = ('.gif','.jpg','.bmp','.png','.pdf','.mov','.mpeg','.jpeg','.rm');
+
+# ---------------------------------------[ System specific options ]----------------------------------------------------
+
+# The lynx variable specifies the command line for the lynx web browser
+# -- This is what I use under dos/win32
+# my $lynx = 'e:\lynx_w32\lynx -cfg=e:\lynx_w32\lynx.cfg';
+
+# -- This is what I use under linux
+my $lynx = 'lynx';
+
+# and the same for the wget utility
+my $wget = 'wget';
+
+# NB: There is one other linux specific command all the way at the end of this script, where I've used 'cp' to copy a file.       
+
+# Another NB: When saving the dl-ed html files to disk, I've set lynx to dump the html-source to the standard output,
+#             which I then simply redirect to a target file, BUT
+#             this does not work under DOS/win32. Redirecting standard output in a script causes it to be displayed on
+#             the screen instead. The easiest way to get around this I found was by doing the actual redirection in a simple
+#             batch file (say grab.bat), which contains the following line:
+#             @e:\lynx_w32\lynx -cfg=e:\lynx_w32\lynx.cfg -dump -source "%1" > %2 
+#
+#             Then replace line nr 326 -> 'system ("$kommand > $target");' with 'system("grab.bat $address $target");'
+#             Not a very elegant solution, but it works :) 
+
+#------------------------------------------------------------------------------------------------------------------------
+
+my %image_list;
+my $image_pointer = 0;
+
+my %linkz_list;
+my %short_linkz_list;
+my $linkz_pointer = 0;
+
+my %image_dirs_list;
+my $image_dirs_pointer = 0;
+
+my $numberdir = 0;
+
+my $start_time = (times)[0];
+
+# check if directories exist and create them if necessary..
+if ((-e $outputdir)&&(-d $outputdir)) 
+{ 
+    print " ** ",$outputdir," directory already exists..\n"; 
+}
+else
+{
+    print " ** Creating ",$outputdir," directory..\n";
+    mkdir($outputdir, 0777) or die " Cannot create output directory: $!\n";
+}
+
+if ((-e $finaldir)&&(-d $finaldir))
+{ 
+    print " ** ",$finaldir," directory already exists..\n";
+}
+else
+{
+    print " ** Creating ",$finaldir," directory..\n";
+    mkdir($finaldir, 0777) or die " Cannot create final directory: $!\n";
+}
+
+#-----------------------------------------------------------------------------------------------
+# No need to start from scratch everytime, we can recover/continue from wherever we left off
+# simply by checking which html files have been created
+#-----------------------------------------------------------------------------------------------
+
+$linknumber    = 0;                    # used to name/number the dl-ed html files
+
+my $failed     = 0;
+while ($failed == 0)
+{
+    if ($linknumber % $dir_entries == 0) 
+	{
+	    if (!((-e $outputdir.$linknumber)&&(-d $outputdir.$linknumber)))
+	    {
+		$failed++;
+		mkdir($outputdir.$linknumber, 0777) or print " ** Cannot create ",$outputdir.$linknumber, "!: $!\n";
+	    }
+	    $numberdir = $linknumber;
+	}
+
+    $check_file = $outputdir.$numberdir."/".$linknumber.".html";
+    if ((-e $check_file)&&($failed == 0)) 
+    { 
+	$linknumber++;
+    } 
+    else
+    {
+	$failed++;
+	# I'm subtracting 1 from the starting link, 
+	# just in case it only loaded half the page ;^)
+	if($linknumber>0) 
+	{ 
+	    $linknumber--; 
+	}
+	print " Will start downloading at number $linknumber \n";
+    }
+}
+
+# if we're starting from scratch, then we might as well nuke the links file
+#if ($linknumber == 0) 
+#{ 
+#    print " Starting from scratch - clobbering the old text files...\n";
+#    if (-e 'links.txt')
+#    {
+#	print "   Removing links.txt...\n";   
+#	unlink <links.txt> or print " ** Cannot delete links textfile: $!\n";
+#    }
+#    if (-e 'images.txt')
+#    {
+#	print "   Removing images.txt...\n";
+#	unlink <images.txt> or print " ** Cannot delete images textfile: $!\n";
+#    }
+#    if (-e 'image_dirs.txt')
+#    {
+#	print "   Removing image_dirs.txt...\n";
+#	unlink <image_dirs.txt> or print " ** Cannot delete image_dirs textfile: $!\n";
+#    }
+#}
+
+# if we're NOT starting from scratch, then read in old links from links text file
+# and grab the old image-links as well...
+if ($linknumber != 0)
+{
+    # load the old links from links.txt, if it doesn't exist, then give up :(
+    my $this = "";
+    my $that = "";
+    open (CHECK, "links.txt") or die " ** Cannot find/open links.txt file!: $! **\n";
+    while(eof CHECK == 0)
+    {
+	while($this ne "\n")
+	{
+	    read CHECK, $this ,1;
+	    $that = $that.$this;   
+	}
+	$linkz_list[$linkz_pointer] = $that;
+	
+	for my $search(0 .. (length($that) - 3))
+	{
+	    if((substr($that, $search, 3) eq '?a=')||(substr($that, $search, 3) eq '&a='))
+	    {
+		$short_linkz_list[$linkz_pointer] = substr($that, $search);
+		last;
+	    }
+	}
+	$linkz_pointer++;
+	$that = ""; $this = "";
+    }
+    close(CHECK);
+    print "- I found ",($#linkz_list + 1)," links in links.txt -\n";
+    
+    #make sure that we start dl-ing the correct first page 
+    $address = $linkz_list[$linknumber];
+
+    # load the old image links from image.txt (if it doesn't exist, no big deal ;)
+    my $im_this = "";
+    my $im_that = "";
+    open (IMAGES, "images.txt") || print " ** Cannot find/open images.txt file! : $! **\n";
+    while(eof IMAGES == 0)
+    {
+	while($im_this ne "\n")
+	{
+	    read IMAGES, $im_this ,1;
+	    $im_that = $im_that.$im_this;   
+	}
+	$image_list[$image_pointer] = $im_that;
+	$image_pointer++;
+	$im_that = ""; $im_this = "";
+    }
+    close(IMAGES);
+    print "- I found ",($#image_list + 1)," picture-links in images.txt -\n";
+
+    #..and last but not least, load any image_dirs from image_dirs.txt
+    # again, if its not there, no big deal :)
+    my $imd_this = "";
+    my $imd_that = "";
+    open (IMAGE_DIR, "image_dirs.txt") || print " ** Cannot find/open image_dirs.txt file!: $! **\n";
+    while(eof IMAGE_DIR == 0)
+    {
+	while($imd_this ne "\n")
+	{
+	    read IMAGE_DIR, $imd_this ,1;
+	    $imd_that = $imd_that.$imd_this;   
+	}
+	$image_dirs_list[$image_dirs_pointer] = $imd_that;
+	$image_dirs_pointer++;
+	$imd_that = ""; $imd_this = "";
+    }
+    close(IMAGE_DIR);
+    print "- I found ",($#image_dirs_list + 1)," picture directories in image_dirs.txt -\n";
+}
+
+#  Just keep going till we can find no more new links
+while(($#linkz_list < 0)||($#linkz_list+1 > $linknumber)) 
+{
+
+    # This line specifies the command line for the lynx web browser
+    my $kommand = $lynx.' -dump -image_links "'.$address.'"';
+
+    # dump page into text-array and find starting-point of the references/links
+    chomp(@data=`$kommand`);
+    for my $i(0 .. $#data)
+    {
+	if ($data[$i] eq "References") {
+	    $here = $i;}
+    }
+    $here = $here+2;
+
+    # process references/links
+    for $i($here .. $#data){
+
+	$its_an_image = 0;	     	
+    
+	#chop-off refs leading number&spaces (eg. '1. http://www.cs.waikato.ac.nz')
+	#                                          ^^^
+	
+#	$temp = substr($data[$i],3);
+#	@temp = split(/ /, $temp, 2);
+    
+	#check if the last 4 characters of the link equal .gif .jpg .png .bmp .pdf .mov .mpeg etc etc
+    
+#	for my $g(0 .. $#graphic_formats)
+#	{
+#	    if(substr($temp[1],(length($graphic_formats[$g]) * -1)) eq $graphic_formats[$g])
+#	    {
+#		$its_an_image = 1;
+#	    }
+#	}
+
+	$data[$i] =~ s/^\s*\d+\.\s+//;
+	if ($data[$i] =~ /\.(gif|jpe?g|png|bmp|pdf|mov|mpe?g|rm)$/i) {
+	    $its_an_image = 1;
+	}
+
+	# ignore mailto urls
+	if ($data[$i] !~ /mailto:/i) {
+	
+	    #----------- the link is NOT an image ----------------		
+	    if ($its_an_image == 0)
+	    { 
+		&its_a_link($data[$i], $outputdir);
+	    }
+
+	    #----------- the link IS an image ----------------
+	    if ($its_an_image != 0)
+	    { 
+		&its_an_image($data[$i], $finaldir); 
+	    }
+	}
+    }	
+
+    # save the web page to disk (in the appropriate numbered directory)
+    $kommand = $lynx.' -dump -source "'.$address.'"';
+
+    if ($linknumber % $dir_entries == 0) 
+    {
+	if ((-e $outputdir.$linknumber)&&(-d $outputdir.$linknumber))
+	{
+	    print " ** ",$outputdir.$linknumber, " - Directory allready exists.\n";
+	}
+	else
+	{
+	    mkdir($outputdir.$linknumber, 0777) or print " ** Cannot create ",$outputdir.$linknumber, "!: $!\n";
+	    mkdir($finaldir.$linknumber, 0777)  or print " ** Cannot create ",$outputdir.$linknumber, "!: $!\n";
+	}
+	$numberdir = $linknumber;
+    }
+    my $target = $outputdir.$numberdir."/".$linknumber.".html";
+
+    #---------------------------------------------------------------------------------------------------------------
+    # NOTE: This next command will NOT work under win32/dos, as redirecting standard output in a script causes it to
+    #       be dumped straight to the screen as opposed to into the target file.
+    #---------------------------------------------------------------------------------------------------------------
+    system ("$kommand > $target");
+    #---------------------------------------------------------------------------------------------------------------
+
+    print " Saved $target\n";
+
+    $linknumber++;
+
+    $address = $linkz_list[$linknumber];
+}
+
+my $end_time = (times)[0];
+
+print "\n\n\n *----------------------------*\n";
+print " |  Whew! Task completed! :-D |\n";
+print " *----------------------------*\n";
+printf"  Script took %.2f CPU seconds to complete ;^)\n", $end_time - $start_time;
+print "\n\n"; 
+print "  Now execute the  process_html.pl  script to link the downloaded collection together.\n";
+print "  Please do make sure that it is executed with the same options as this script ;-)\n";
+
+sub its_a_link 
+{
+    local($found) = @_;
+#    local($ok = 0, $kommand);
+    local($kommand);
+    local $short_link = "";
+
+    return if ($found =~ /\#.*$/);
+
+    # attach the custom options
+    $found .= $option;
+    
+    #little bit of trickery here - check if there is a &d= option present in the link
+    #if there is, then wipe the &cl= option!
+    #This should cut down multiple copies by 75%!!
+    
+    #but, if there is no &d option, and the &cl option is not set, then we have to set the &cl option to something
+    #otherwise we get pages which contain no data :\
+
+    if ($found =~ /[&\?]a=d/) {
+	if ($found =~ /[&\?]d=/) {
+	    $found =~ s/[&\?]cl=[^&]*//;
+	} elsif ($found !~ /[&\?]cl=/) {
+	    $found .= $fix_empty_pages;
+	}
+    }
+
+    # we also want to sort out any xxx.pr OIDs that we come across
+    $found =~ s/([&\?](cl|d)=.*?)\.\d+\.pr/$1/g;
+
+    # attach the EOL character.
+    $found = $found."\n";
+
+
+    # the hard way !!!
+#    for my $search(0 .. (length($found) - 3))
+#    {
+#	if((substr($found, $search, 3) eq '?d=')||(substr($found, $search, 3) eq '&d='))
+#	{
+#	    for my $second_search(0 .. (length($found) - 4))  
+#	    {
+#		if((substr($found, $second_search, 4) eq '?cl=')||(substr($found, $second_search, 4) eq '&cl='))
+#		{
+#		    for my $third_search(($second_search + 3) .. (length($found) - 1))
+#		    {
+#			if((substr($found, $third_search, 1)) eq '&')
+#			{
+#			    substr($found, $second_search, $third_search - $second_search) = ""; 
+#			    last;
+#			}
+#		    }
+#		    last;
+#		}
+#	    } 
+#	    last;
+#	}
+#	else
+#	{
+#	    if( $search == (length($found) - 3))
+#	    {
+#		for my $second_search(0 .. (length($found) - 4))  
+#		{
+#		    if((substr($found, $second_search, 4) eq '?cl=')||(substr($found, $second_search, 4) eq '&cl='))
+#		    {
+#			for my $third_search(($second_search + 3) .. (length($found) - 1))
+#			{
+#			    if((substr($found, $third_search, 1)) eq '&')
+#			    {
+#				if (substr($found, $second_search, $third_search - $second_search) eq '&cl=')
+#				{
+#				    substr($found, $second_search, $third_search - $second_search) = $fix_empty_pages;	
+#				}
+#				last;
+#			    }
+#			}
+#			last;
+#		    }
+#		} 
+#	    }
+#	}
+#    }
+    
+    # grab the last part of the link (ignoring the start and the &e option)
+#    for my $search(0 .. (length($found) - 3))
+#    {
+#	if((substr($found, $search, 3) eq '?a=')||(substr($found, $search, 3) eq '&a='))
+#	{
+#	    $short_link = substr($found, $search);
+#	    last;
+#	}
+#    }
+
+    ($short_link) = $found =~ /\?(.*)$/;
+    $short_link =~ s/(^|&)e=[^&]*/$1/;
+
+    
+    # this filters out multiple copies of for example the help page, which has #something at the end of its links
+    # now do this first with regular expression above -- Stefan
+
+#    for my $search(0 .. length($found))
+#    {
+#	if ((substr($found, $search, 1)) eq '#')
+#	{
+#	    $ok++;
+#	    last;
+#	}
+#    }
+ 
+
+   
+    # compare the found link to the links we've stored in the arrays (compares both full link and partial link)
+    for my $search(0 .. $#linkz_list)
+    {
+	return if ($found eq $linkz_list[$search]);
+	return if ($short_link eq $short_linkz_list[$search]);
+    }
+		    
+    # if found link is not in links array, add it
+    open (DUMP, ">>links.txt") or die " ** Can't open links.txt!: $!\n";
+    print DUMP $found;
+    close(DUMP);
+    
+    $linkz_list[$linkz_pointer] = $found;
+    $short_linkz_list[$linkz_pointer] = $short_link;
+    $linkz_pointer++;
+}
+
+sub do_image_dirs
+{
+    local($found) = @_;
+    my $count = 0;
+    my @br_index;
+    my $image_dir = "";
+    my $new_dir = 0;
+
+    for my $search(1 .. (length($found) - 1 ))
+    {
+	$bracket = substr($found, ($search * - 1), 1);
+	if ($bracket eq '/')
+	{
+	    $count++;
+	    $br_index[$count] = $search;
+	}
+	if($count == 2) 
+	{
+	    $image_dir = substr($found, ($br_index[2] * -1) , ($br_index[2] - $br_index[1]));
+	}
+    }
+    
+    my $dirs_to_wipe = substr($found, $br_index[$#br_index - 2] * - 1, $br_index[$#br_index - 2] - $br_index[2] + 1)."\n";
+    
+    for my $counter(0 .. $#image_dirs_list)
+    {
+	if($dirs_to_wipe eq $image_dirs_list[$counter])
+	{
+	    $new_dir++;
+	}
+    }
+    
+    if ($new_dir == 0)
+    {
+	open (IMAGE_DIRS, ">>image_dirs.txt") or die " ** Can't open image_dirs.txt!: $!\n";
+	print IMAGE_DIRS $dirs_to_wipe;
+	close(IMAGE_DIRS);
+	$image_dirs_list[$image_dirs_pointer] = $dirs_to_wipe;
+	$image_dirs_pointer++;
+    }
+
+    print "   ",substr($finaldir, 0 ,length($finaldir) - 1).$image_dir.substr($found, ($br_index[1] * - 1), length($found) - (length($found) - $br_index[1])),"\n";	    
+    
+    return $image_dir;
+}
+
+sub its_an_image 
+{
+    local($found, $outpdir) = @_;
+    local($kommand);
+    my $new = 0;
+    
+    my $temp_found = $found . "\n";
+
+    # check if the image is in the list
+    for my $counter(0 .. $#image_list)
+    {
+	if($temp_found eq $image_list[$counter])
+	{
+	    $new++;
+	}
+    }
+    
+    # only download the image if its not in the list..
+    if($new == 0)
+    {    
+	my $image_dir = &do_image_dirs;
+	my $temp_outputdir = $outpdir;
+	if (substr($temp_outputdir, -1, 1) eq "/")
+	{
+	    substr($temp_outputdir, -1, 1) = "";
+	}
+	
+	# wget is set to 'q - quiet' and 'nc - dont clobber existing files'
+	$kommand = $wget.' -qnc --directory-prefix='.$temp_outputdir.$image_dir.' "'.$found.'"';
+	system ("$kommand");
+        
+	open (IMAGES, ">>images.txt") or die " ** Can't open images.txt!: $!\n";
+	print IMAGES $temp_found;
+	close(IMAGES);
+	
+	$image_list[$image_pointer] = $temp_found;
+	$image_pointer++;
+	
+        # grab corresponding ON pictures for navigation bar if we've just dl-ed the OFF picture
+	if(substr($found , -6) eq "of.gif") 
+	{
+	    substr($found, -6, 6) = "on.gif";
+	    &its_an_image($found, $outpdir);
+	}
+    }    
+}
Index: /main/tags/2.38/gsdl/bin/script/gsConvert.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gsConvert.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gsConvert.pl	(revision 21083)
@@ -0,0 +1,997 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# gsConvert.pl -- convert documents to HTML or TEXT format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2002 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# gsConvert.pl converts documents in a range of formats to HTML or TEXT
+# by exploiting third-party programs.  The sources of these are usually found
+# in the $GSDLHOME/packages directory, and the executables should live in
+# $GSDLHOME/bin/$GSDLOS (which is on the search path).
+#
+# Currently, we can convert the following formats by using external
+# conversion utilities:
+# Microsoft Word (versions 2,6,7 [==95?], 8[==97?], 9[==2000?]), RTF,
+# Adobe PDF, PostScript, MS PowerPoint (95 and 97), and MS Excel (95 and 97).
+#
+# We can try to convert any file to text with a perl implementation of the
+# UNIX strings command.
+#
+# We try to convert Postscript files to text using "gs" which is often on
+# *nix machines. We fall back to performing weak text extraction by using
+# regular expressions.
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use util;
+use Cwd;
+use File::Basename;
+
+# Are we running on WinNT or Win2000 (or later)?
+my $is_winnt_2000=eval {require Win32; return (Win32::IsWinNT()); return 0;};
+if (!defined($is_winnt_2000)) {$is_winnt_2000=0;}
+
+sub print_usage
+{
+    print STDERR "\n";
+    print STDERR "gsConvert.pl: Converts documents in a range of formats to html\n";
+    print STDERR "              or text using third-party programs.\n\n";
+    print STDERR "  usage: $0 [options] filename\n";
+    print STDERR "  options:\n\t-type\tdoc|pdf|ps|ppt|rtf|xls\t(input file type)\n";
+    print STDERR "\t-errlog\t<filename>\t(append err messages)\n";
+    print STDERR "\t-output\thtml|text\n";
+    print STDERR "\t-timeout\t<max cpu seconds>\t(ulimit on unix systems)\n";
+    exit(1);
+}
+
+my $faillogfile="";
+
+sub main
+{
+    my (@ARGV) = @_;
+    my ($input_type,$output_type,$verbose,$timeout);
+
+    $timeout = 0;
+    # read command-line arguments
+    if (!parsargv::parse(\@ARGV,
+			 'type/(doc|pdf|ps|ppt|rtf|xls)/', \$input_type,
+			 '/errlog/.*/', \$faillogfile,
+			 'output/(html|text)/', \$output_type,
+			 'timeout/\d+/0',\$timeout,
+			 'verbose/\d+/0',   \$verbose))
+    {
+	print_usage();
+    }
+
+    # Make sure the input file exists and can be opened for reading
+    if (scalar(@ARGV!=1)) {
+	print_usage();
+    }
+
+    my $input_filename = $ARGV[0];
+    if (!-r $input_filename) {
+	print STDERR "Error: unable to open $input_filename for reading\n";
+	exit(1);
+    }
+
+    # Deduce filenames
+    my ($tailname,$dirname,$suffix) 
+	= File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+    my $output_filestem = &util::filename_cat($dirname, "$tailname");
+
+    if ($input_type eq "")
+    {
+	$input_type = lc (substr($suffix,1,length($suffix)-1));
+    }
+    
+    # Change to temporary working directory
+    my $stored_dir = cwd();
+    chdir ($dirname) || die "Unable to change to directory $dirname";
+    
+    # Select convert utility
+    if (!defined $input_type) {
+	print STDERR "Error: No filename extension or input type defined\n";
+	exit(1);
+    } 
+    elsif ($input_type eq "doc") {
+	print &convertDOC($input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    elsif ($input_type eq "rtf") {
+	print &convertRTF($input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    elsif ($input_type eq "pdf") {
+	print &convertPDF($dirname, $input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    elsif ($input_type eq "ps") {
+	print &convertPS($input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    elsif ($input_type eq "ppt") {
+	print &convertPPT($input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    elsif ($input_type eq "xls") {
+	print &convertXLS($input_filename, $output_filestem, $output_type);
+	print "\n";
+    } 
+    else {
+	print STDERR "Error: Unable to convert type '$input_type'\n";
+	exit(1);
+    }
+    
+    # restore to original working directory
+    chdir ($stored_dir) || die "Unable to return to directory $stored_dir";
+
+}
+
+&main(@ARGV);
+
+
+
+# Document-type conversion functions
+#
+# The following functions attempt to convert documents from their
+# input type to the specified output type.  If no output type was
+# given, then they first attempt HTML, and then TEXT.
+#
+# Each returns the output type ("html" or "text") or "fail" if no 
+# conversion is possible.
+
+# Convert a Microsoft word document
+
+sub convertDOC {
+    ($input_filename, $output_filestem, $output_type) = @_;
+
+    # Many .doc files are not in fact word documents!
+    my $realtype = &find_docfile_type($input_filename);
+
+    if ($realtype eq "word6" || $realtype eq "word7" || $realtype eq "word8") {
+	return &convertWord678($input_filename, $output_filestem, $output_type);
+    } elsif ($realtype eq "rtf") {
+	return &convertRTF($input_filename, $output_filestem, $output_type);
+    } else {
+	return &convertAnything($input_filename, $output_filestem, $output_type);
+    }
+}
+
+# Convert a Microsoft word 6/7/8 document
+
+sub convertWord678 {
+    ($input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt specialised conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	$success = &doc_to_html($input_filename, $output_filestem);
+	if ($success) {
+	    return "html";
+	}
+    }
+
+    return &convertAnything($input_filename, $output_filestem, $output_type);
+}
+
+
+# Convert a Rich Text Format (RTF) file
+
+sub convertRTF {
+    ($input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt specialised conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	$success = &rtf_to_html($input_filename, $output_filestem);
+	if ($success) {
+	    return "html";
+	}
+    }
+
+# rtf is so ugly that's it's not worth running strings over.
+# One day I'll write some quick'n'dirty regexps to try to extract text - jrm21
+#    return &convertAnything($input_filename, $output_filestem, $output_type);
+    return "fail";
+}
+
+
+# Convert an unidentified file
+
+sub convertAnything {
+    ($input_filename, $output_filestem, $output_type) = @_;
+    
+    my $success = 0;
+    
+    # Attempt simple conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	$success = &any_to_html($input_filename, $output_filestem);
+	if ($success) {
+	    return "html";
+	}
+    }
+
+    # Convert to text
+    if (!$output_type || ($output_type =~ /text/i)) {
+	$success = &any_to_text($input_filename, $output_filestem);
+	if ($success) {
+	    return "text";
+	}
+    }
+    return "fail";
+}
+
+
+
+# Convert an Adobe PDF document
+
+sub convertPDF {
+    my ($dirname, $input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	$success = &pdf_to_html($dirname, $input_filename, $output_filestem);
+	if ($success) {
+	    return "html";
+	}
+    }
+
+    # Attempt conversion to TEXT
+    if (!$output_type || ($output_type =~ /text/i)) {
+	$success = &pdf_to_text($dirname, $input_filename, $output_filestem);
+	if ($success) {
+	    return "text";
+	}
+    }
+
+    return "fail";
+
+}
+
+
+# Convert an Adobe PostScript document
+
+sub convertPS {
+    ($input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt conversion to TEXT
+    if (!$output_type || ($output_type =~ /text/i)) {
+	$success = &ps_to_text($input_filename, $output_filestem);
+	if ($success) {
+	    return "text";
+	}
+    }
+
+    return "fail";
+
+}
+
+
+sub convertPPT {
+    my ($input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	# formulate the command
+	$cmd = "";
+	$cmd .= "perl -S ppttohtml.pl ";
+	$cmd .= " \"$input_filename\" \"$output_filestem.html\"";
+	$cmd .= " 2>\"$output_filestem.err\""
+	    if ($ENV{'GSDLOS'} !~ /^windows$/i || $is_winnt_2000);
+	
+	
+	# execute the command
+	$!=0;
+	if (system($cmd)!=0)
+	{
+	    print STDERR "Powerpoint 95/97 converter failed $!\n";
+	} else {
+	    return "html";
+	}
+    }
+
+    $success = &any_to_text($input_filename, $output_filestem);
+    if ($success) {
+	return "text";
+    }
+
+    return "fail";
+}
+
+
+sub convertXLS {
+    my ($input_filename, $output_filestem, $output_type) = @_;
+
+    my $success = 0;
+
+    # Attempt conversion to HTML
+    if (!$output_type || ($output_type =~ /html/i)) {
+	# formulate the command
+	$cmd = "";
+	$cmd .= "perl -S xlstohtml.pl ";
+	$cmd .= " \"$input_filename\" \"$output_filestem.html\"";
+	$cmd .= " 2>\"$output_filestem.err\""
+	    if ($ENV{'GSDLOS'} !~ /^windows$/i || $is_winnt_2000);
+	
+	
+	# execute the command
+	$!=0;
+	if (system($cmd)!=0)
+	{
+	    print STDERR "Excel 95/97 converter failed $!\n";
+	} else {
+	    return "html";
+	}
+    }
+
+    $success = &any_to_text($input_filename, $output_filestem);
+    if ($success) {
+	return "text";
+    }
+
+    return "fail";
+}
+
+
+
+
+
+# Find the real type of a .doc file
+#
+# We seem to have a lot of files with a .doc extension that are .rtf 
+# files or Word 5 files.  This function attempts to tell the difference.
+
+sub find_docfile_type {
+    ($input_filename) = @_;
+    
+    open(CHK, "<$input_filename");
+    binmode(CHK);
+    my $line = "";
+    my $first = 1;
+
+    while (<CHK>) {
+    
+	$line = $_;
+
+	if ($first) {
+	    # check to see if this is an rtf file
+	    if ($line =~ /^\{\\rtf/) {
+		close(CHK);
+		return "rtf";
+	    }
+	    $first = 0;
+	}
+	
+	# is this is a word 6/7/8 document?
+	if ($line =~ /Word\.Document\.([678])/) {
+	    close(CHK);
+	    return "word$1";
+	}
+
+    }
+
+    return "unknown";
+}
+
+
+
+# Specific type-to-type conversions
+#
+# Each of the following functions attempts to convert a document from 
+# a specific format to another.  If they succeed they return 1 and leave 
+# the output document(s) in the appropriate place; if they fail they 
+# return 0 and delete any working files.
+
+
+# Attempt to convert a word document to html with the wv program
+
+sub doc_to_html {
+    ($input_filename, $output_filestem) = @_;
+
+    my $wvWare = &util::filename_cat($ENV{'GSDLHOME'}, "bin", 
+				     $ENV{'GSDLOS'}, "wvWare");
+
+    # don't include path on windows (to avoid having to play about
+    # with quoting when GSDLHOME might contain spaces) but assume
+    # that the PATH is set up correctly
+    $wvWare = "wvWare" if ($ENV{'GSDLOS'} =~ /^windows$/i);
+
+    my $wv_conf = &util::filename_cat($ENV{'GSDLHOME'}, "etc", 
+				      "packages", "wv", "wvHtml.xml");
+    
+    my $cmd = "";
+    if ($timeout) {$cmd = "ulimit -t $timeout;";}
+    $cmd .= "$wvWare --charset utf-8 --config \"$wv_conf\"";
+    $cmd .= " \"$input_filename\" > \"$output_filestem.html\"";
+    
+    # redirecting STDERR is a bad idea on windows 95/98
+    $cmd .= " 2> \"$output_filestem.err\""
+	if ($ENV{'GSDLOS'} !~ /^windows$/i || $is_winnt_2000);
+
+    # execute the command
+    $!=0;
+    if (system($cmd)!=0)
+    {
+	print STDERR "Error executing wv converter:$!\n";
+	if (-s "$output_filestem.err") {
+	    open (ERRFILE, "<$output_filestem.err");
+
+	    my $write_to_fail_log=0;
+	    if ($faillogfile ne "" && defined(open(FAILLOG,">>$faillogfile")))
+	    {$write_to_fail_log=1;}
+
+	    my $line;
+	    while ($line=<ERRFILE>) {
+		if ($line =~ /\w/) {
+		    print STDERR "$line";
+		    print FAILLOG "$line" if ($write_to_fail_log);
+		}
+		if ($line !~ m/startup error/) {next;}
+		print STDERR " (given an invalid .DOC file?)\n";
+		print FAILLOG " (given an invalid .DOC file?)\n"
+		if ($write_to_fail_log);
+		
+	    } # while ERRFILE
+	    close FAILLOG if ($write_to_fail_log);
+	}
+	print STDERR "Continuing...\n";
+	return 0; # we can try any_to_text
+    }
+
+    # Was the conversion successful?
+
+    if (-s "$output_filestem.html") {
+	open(TMP, "$output_filestem.html");
+	$line = <TMP>;
+	close(TMP);
+	if ($line && $line =~ /DOCTYPE HTML/) {
+	    &util::rm("$output_filestem.err") if -e "$output_filestem.err";
+	    return 1;
+	}
+    }
+	
+    # If here, an error of some sort occurred
+    &util::rm("$output_filestem.html") if -e "$output_filestem.html";
+    if (-e "$output_filestem.err") {
+	if ($faillogfile ne "" && defined(open(FAILLOG,">>$faillogfile"))) {
+	    open (ERRLOG,"$output_filestem.err");
+	    while (<ERRLOG>) {print FAILLOG $_;}
+	    close FAILLOG;
+	    close ERRLOG;
+	}
+	&util::rm("$output_filestem.err");
+    }
+    
+    return 0;
+}
+
+
+# Attempt to convert an RTF document to html with rtftohtml
+
+sub rtf_to_html {
+    my ($input_filename, $output_filestem) = @_;
+
+    # formulate the command
+    $cmd = "";
+    if ($timeout) {$cmd = "ulimit -t $timeout;";}
+    $cmd .= "rtftohtml";
+
+    # it automatically uses $output_filestem.html
+    $cmd .= " \"$input_filename\"";
+
+    $cmd .= " 2>\"$output_filestem.err\""
+        if ($ENV{'GSDLOS'} !~ /^windows$/i || $is_winnt_2000);
+
+
+    # execute the command
+    $!=0;
+    if (system($cmd)!=0)
+    {
+	print STDERR "Error executing rtf converter $!\n";
+	# don't currently bother printing out error log...
+	# keep going, in case it still created an HTML file...
+    }
+
+    # Was the conversion successful?
+    my $was_successful=0;
+    if (-s "$output_filestem.html") {
+	# make sure we have some content other than header
+	open (HTML, "$output_filestem.html"); # what to do if fail?
+	my $line;
+	my $past_header=0;
+	while ($line=<HTML>) {
+
+	    if ($past_header == 0) {
+		if ($line =~ /<body>/) {$past_header=1;}
+		next;
+	    }
+
+	    $line =~ s/<[^>]+>//g;
+	    if ($line =~ /\w/ && $past_header) {  # we found some content...
+		$was_successful=1;
+		last;
+	    }
+	}
+	close HTML;
+    }
+
+    if ($was_successful) {
+	&util::rm("$output_filestem.err")
+	    if (-e "$output_filestem.err");
+	# insert the (modified) table of contents, if it exists.
+	if (-e "${output_filestem}_ToC.html") {
+	    &util::mv("$output_filestem.html","$output_filestem.src");
+	    my $open_failed=0;
+	    open HTMLSRC, "$output_filestem.src" || ++$open_failed;
+	    open TOC, "${output_filestem}_ToC.html" || ++$open_failed;
+	    open HTML, ">$output_filestem.html" || ++$open_failed;
+	    
+	    if ($open_failed) {
+		close HTMLSRC;
+		close TOC;
+		close HTML;
+		&util::mv("$output_filestem.src","$output_filestem.html");
+		return 1;
+	    }
+
+	    # print out header info from src html.
+	    while (($_ = <HTMLSRC>) =~ /\w/) {
+		print HTML "$_";
+	    }
+
+	    # print out table of contents, making links relative
+	    <TOC>; <TOC>; # ignore first 2 lines
+	    print HTML scalar(<TOC>); # line 3 = "<ol>\n"
+	    my $line;
+	    while ($line=<TOC>) {
+		$line =~ s@</body></html>$@@ ; # only last line has this
+		# make link relative
+		$line =~ s@href=\"[^\#]+@href=\"@;
+		print HTML $line;
+	    }
+	    close TOC;
+
+	    # rest of html src
+	    while (<HTMLSRC>) {
+		print HTML $_;
+	    }
+	    close HTMLSRC;
+	    close HTML;
+
+	    &util::rm("${output_filestem}_ToC.html");
+	    &util::rm("${output_filestem}.src");
+	}
+	# we don't yet do anything with footnotes ($output_filestem_fn.html) :(
+	return 1; # success
+    }
+
+    if (-e "$output_filestem.err") {
+	if ($faillogfile ne "" && defined(open(FAILLOG,">>$faillogfile")))
+	{
+	    print FAILLOG "Error - rtftohtml - couldn't extract text\n";
+	    print FAILLOG " (rtf file might be too recent):\n";
+	    open (ERRLOG, "$output_filestem.err");
+	    while (<ERRLOG>) {print FAILLOG $_;}
+	    close ERRLOG;
+	    close FAILLOG;
+	}
+	&util::rm("$output_filestem.err");
+    }
+
+    &util::rm("$output_filestem.html") if (-e "$output_filestem.html");
+
+    return 0;
+}
+
+
+# Convert a pdf file to html with the pdftohtml command
+
+sub pdf_to_html {
+    my ($dirname, $input_filename, $output_filestem) = @_;
+
+    $cmd = "";
+    if ($timeout) {$cmd = "ulimit -t $timeout;";}
+    $cmd .= "perl -S pdftohtml.pl ";
+    $cmd .= " \"$input_filename\" \"$output_filestem\"";
+    
+    if ($ENV{'GSDLOS'} !~ /^windows$/i || $is_winnt_2000) {
+	$cmd .= " > \"$output_filestem.out\" 2> \"$output_filestem.err\"";
+    } else {
+	$cmd .= " > \"$output_filestem.err\"";
+    }
+
+    $!=0;
+
+    my $retval=system($cmd);
+    if ($retval!=0)
+    {
+	print STDERR "Error executing pdftohtml.pl";
+	if ($!) {print STDERR ": $!";} 
+	print STDERR "\n";
+    }
+
+    # make sure the converter made something
+    if ($retval!=0 || ! -s "$output_filestem.html")
+    {
+	&util::rm("$output_filestem.out") if (-e "$output_filestem.out");
+	# print out the converter's std err, if any
+	if (-s "$output_filestem.err") {
+	    open (ERRLOG, "$output_filestem.err") || die "$!";
+	    print STDERR "pdftohtml error log:\n";
+	    while (<ERRLOG>) {
+		print STDERR "$_";
+	    }
+	    close ERRLOG;
+	}
+	&util::rm("$output_filestem.html") if (-e "$output_filestem.html");
+	if (-e "$output_filestem.err") {
+	    if ($faillogfile ne "" && defined(open(FAILLOG,">>$faillogfile")))
+	    {
+		open (ERRLOG, "$output_filestem.err");
+		while (<ERRLOG>) {print FAILLOG $_;}
+		close ERRLOG;
+		close FAILLOG;
+	    }	
+    &util::rm("$output_filestem.err");
+	}
+	return 0;
+    }
+
+    &util::rm("$output_filestem.err") if (-e "$output_filestem.err");
+    &util::rm("$output_filestem.out") if (-e "$output_filestem.out");
+    return 1;
+}
+
+# Convert a PDF file to text with the pdftotext command
+
+sub pdf_to_text {
+    my ($dirname, $input_filename, $output_filestem) = @_;
+
+    my $cmd = "pdftotext \"$input_filename\" \"$output_filestem.text\"";
+
+    if ($ENV{'GSDLOS'} !~ /^windows$/i) {
+	$cmd .= " > \"$output_filestem.out\" 2> \"$output_filestem.err\"";
+    } else {
+	$cmd .= " > \"$output_filestem.err\"";
+    }
+    
+    if (system($cmd)!=0)
+    {
+	print STDERR "Error executing $cmd: $!\n";
+	&util::rm("$output_filestem.text") if (-e "$output_filestem.text");
+    }
+
+    # make sure there is some extracted text.
+    if (-e "$output_filestem.text") {
+	open (EXTR_TEXT, "$output_filestem.text") || warn "open: $!";
+	binmode(EXTR_TEXT); # just in case...
+	my $line="";
+	my $seen_text=0;
+	while (($seen_text==0) && ($line=<EXTR_TEXT>)) {
+	    if ($line=~ /\w/) {$seen_text=1;}
+	}
+	close EXTR_TEXT;
+	if ($seen_text==0) { # no text was extracted
+	    print STDERR "Error: pdftotext found no text\n";
+	    &util::rm("$output_filestem.text");
+	}
+    }
+
+    # make sure the converter made something
+    if (! -s "$output_filestem.text")
+    {
+	# print out the converters std err, if any
+	if (-s "$output_filestem.err") {
+	    open (ERRLOG, "$output_filestem.err") || die "$!";
+	    print STDERR "pdftotext error log:\n";
+	    while (<ERRLOG>) {
+		print STDERR "$_";
+	    }
+	    close ERRLOG;
+	}
+	# does this converter create a .out file?
+	&util::rm("$output_filestem.out") if (-e "$output_filestem.out");
+	&util::rm("$output_filestem.text") if (-e "$output_filestem.text");
+	if (-e "$output_filestem.err") {
+	    if ($faillogfile ne "" && defined(open(FAILLOG,">>$faillogfile")))
+	    {
+		open (ERRLOG,"$output_filestem.err");
+		while (<ERRLOG>) {print FAILLOG $_;}
+		close ERRLOG;
+		close FAILLOG;
+	    }
+	    &util::rm("$output_filestem.err");
+	}
+	return 0;
+    }
+    &util::rm("$output_filestem.err") if (-e "$output_filestem.err");
+    return 1;
+}
+
+# Convert a PostScript document to text
+# note - just using "ps2ascii" isn't good enough, as it
+# returns 0 for a postscript interpreter error. ps2ascii is just
+# a wrapper to "gs" anyway, so we use that cmd here.
+
+sub ps_to_text {
+    my ($input_filename, $output_filestem) = @_;
+
+    my $error = "";
+
+    # if we're on windows we'll fall straight through without attempting
+    # to use gs
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$error = "Windows does not support gs";
+
+    } else {
+	my $cmd = "gs -q -dNODISPLAY -dNOBIND -dWRITESYSTEMDICT -dSIMPLE -c save ";
+	$cmd .= "-f ps2ascii.ps \"$input_filename\" -c quit > \"$output_filestem.text\"";
+	$cmd .= " 2> $output_filestem.err";
+	$!=0;
+
+	my $retcode=system($cmd);
+	$retcode = $? >> 8;  # see man perlfunc - system for this...
+	# if system returns -1 | 127 (couldn't start program), look at $! for message
+
+	if ($retcode!=0) {if ($!) {$error=$!;} else {$error="couldn't run.\n";}}
+	elsif (! -e "$output_filestem.text") {
+	    $error="did not create output file.\n";
+	}
+	else 
+	{   # make sure the interpreter didn't get an error. It is technically
+	    # possible for the actual text to start with this, but....
+	    open PSOUT, "$output_filestem.text";
+	    if (<PSOUT> =~ /^Error: (.*)/) {
+		$error="interpreter error - \"$1\"";
+	    }
+	    close PSOUT;
+	}
+    }
+
+    if ($error ne "")
+    {
+	print STDERR "Warning: Error executing gs: $error\n";
+	&util::rm("$output_filestem.text") if (-e "$output_filestem.text");
+
+	if ("$faillogfile" ne "" && defined(open (FAILLOG, ">>$faillogfile")))
+	{
+	    print FAILLOG "gs - $error\n";
+	    if (-e "$output_filestem.err") {
+		open(ERRLOG, "$output_filestem.err");
+		while (<ERRLOG>) {print FAILLOG $_;}
+		close ERRLOG;
+	    }
+	    close FAILLOG;
+	}
+	&util::rm("$output_filestem.err") if (-e "$output_filestem.err");
+
+
+	# Fine then. We'll just do a lousy job by ourselves...
+	# Based on 5-line regexp sed script found at:
+	# http://snark.ptc.spbu.ru/mail-archives/lout/brown/msg00003.html
+	# 
+	print STDERR "Stripping text from postscript\n";
+	my $errorcode=0;
+	open (IN, "$input_filename") 
+	    ||  ($errorcode=1, warn "Couldn't read file: $!");
+	open (OUT, ">$output_filestem.text") 
+	    ||  ($errorcode=1, warn "Couldn't write file: $!");
+	if ($errorcode) {print STDERR "errors\n";return 0;}
+	
+	my $text="";  # this is for whole .ps file...
+	$text = join('', <IN>); # see man perlport, under "System Resources"
+	close IN;
+
+	# Make sure this is a ps file...
+	if ($text !~ /^%!/) {
+	    print STDERR "Bad postscript header: not '%!'\n";
+	    if ($faillogfile ne "" && defined(open(FAILLOG, ">>$faillogfile")))
+	    {
+		print FAILLOG "Bad postscript header: not '%!'\n";
+		close FAILLOG;
+	    }
+	    return 0;
+	}
+
+	# if ps has Page data, then use it to delete all stuff before it.
+	$text =~ s/^.*?%%Page:.*?\n//s; # treat string as single line
+	
+	# remove all leading non-data stuff
+	$text =~ s/^.*?\(//s;
+
+	# remove all newline chars for easier processing
+	$text =~ s/\n//g;
+	
+	# Big assumption here - assume that if any co-ordinates are
+	# given, then we are at the end of a sentence.
+	$text =~ s/\)-?\d+\ -?\d+/\) \(\n\)/g;
+
+	# special characters--
+	$text =~ s/\(\|\)/\(\ - \)/g; # j -> em-dash?
+
+	# ? ps text formatting (eg italics?) ?
+	$text =~ s/Fn\(f\)/\(\{\)/g; # f -> {
+	$text =~ s/Fn\(g\)/\(\}\)/g; # g -> }
+	$text =~ s/Fn\(j\)/\(\|\)/g; # j -> |
+	# default - remove the rest
+	$text =~ s/\ ?F.\((.+?)\)/\($1\)/g;
+
+	# attempt to add whitespace between words... 
+	# this is based purely on observation, and may be completely wrong...
+	$text =~ s/([^F])[defghijkuy]\(/$1 \( /g;
+	# eg I notice "b(" is sometimes NOT a space if preceded by a 
+	# negative number.
+	$text =~ s/\)\d+ ?b\(/\) \( /g;
+
+	# change quoted braces to brackets
+	$text =~ s/([^\\])\\\(/$1\{/g;
+	$text =~ s/([^\\])\\\)/$1\}/g ;
+
+	# remove everything that is not between braces
+	$text =~ s/\)([^\(\)])+?\(//sg ;
+	
+	# remove any Trailer eof stuff.
+	$text =~ s/\)[^\)]*$//sg;
+
+	### ligatures have special characters...
+	$text =~ s/\\013/ff/g;
+	$text =~ s/\\014/fi/g;
+	$text =~ s/\\015/fl/g;
+	$text =~ s/\\016/ffi/g;
+	$text =~ s/\\214/fi/g;
+	$text =~ s/\\215/fl/g;
+	$text =~ s/\\017/\n\* /g; # asterisk?
+	$text =~ s/\\023/\023/g;  # e acute ('e)
+	$text =~ s/\\177/\252/g;  # u"
+#	$text =~ s/ ?? /\344/g;  # a"
+
+	print OUT "$text";
+	close OUT;
+    }
+    # wrap the text - use a minimum length. ie, first space after this length.
+    my $wrap_length=72;
+    &util::mv("$output_filestem.text", "$output_filestem.text.tmp");
+    open INFILE, "$output_filestem.text.tmp" ||
+	die "Couldn't open file: $!";
+    open OUTFILE, ">$output_filestem.text" ||
+	die "Couldn't open file for writing: $!";
+    my $line="";
+    while ($line=<INFILE>) {
+	while (length($line)>0) {
+	    if (length($line)>$wrap_length) {
+		$line =~ s/^(.{$wrap_length}[^\s]*)\s*//;
+		print OUTFILE "$1\n";
+	    } else {
+		print OUTFILE "$line";
+		$line="";
+	    }
+	}
+    }
+    close INFILE;
+    close OUTFILE;
+    &util::rm("$output_filestem.text.tmp");
+
+    &util::rm("$output_filestem.err") if (-e "$output_filestem.err");
+    return 1;
+}
+
+
+# Convert any file to HTML with a crude perl implementation of the
+# UNIX strings command.
+
+sub any_to_html {
+    ($input_filename, $output_filestem) = @_;
+
+    # First generate a text file
+    return 0 unless (&any_to_text($input_filename, $output_filestem));
+
+    # create an HTML file from the text file
+    open(TEXT, "<$output_filestem.text");
+    open(HTML, ">$output_filestem.html");
+
+    print HTML "<html><head>\n";
+    print HTML "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html\">\n";
+    print HTML "<META NAME=\"GENERATOR\" CONTENT=\"Greenstone any_to_html\">\n";
+    print HTML "</head><body>\n\n";
+
+    my $line;
+    while ($line=<TEXT>) { 
+	$line =~ s/</&lt;/g;
+	$line =~ s/>/&gt;/g;
+	if ($line =~ /^\s*$/) {
+	    print HTML "<p>";
+	} else {
+	    print HTML "<br> ", $line;
+	}
+    }
+    print HTML "\n</body></html>\n";
+
+    close HTML;
+    close TEXT;
+
+    &util::rm("$output_filestem.text") if (-e "$output_filestem.text");
+    return 1;
+}
+
+# Convert any file to TEXT with a crude perl implementation of the
+# UNIX strings command.
+# Note - this assumes ascii charsets :(		(jrm21)
+
+sub any_to_text {
+    ($input_filename, $output_filestem) = @_;
+
+    open(IN, "<$input_filename") || return 0;
+    binmode(IN);
+    open(OUT, ">$output_filestem.text") || return 0;
+
+    my ($line);
+    my $output_line_count = 0;
+    while (<IN>) { 
+	$line = $_;
+
+	# delete anything that isn't a printable character
+	$line =~ s/[^\040-\176]+/\n/sg;
+
+	# delete any string less than 10 characters long
+	$line =~ s/^.{0,9}$/\n/mg;
+	while ($line =~ /^.{1,9}$/m) {
+	    $line =~ s/^.{0,9}$/\n/mg;
+	    $line =~ s/\n+/\n/sg;
+	}
+
+	# remove extraneous whitespace
+	$line =~ s/\n+/\n/gs;
+	$line =~ s/^\n//gs;
+
+	# output whatever is left
+	if ($line =~ /[^\n ]/) {
+	    print OUT $line;
+	    ++$output_line_count;
+	}
+    }
+
+    close OUT;
+    close IN;
+
+    if ($output_line_count) { # try to protect against binary only formats
+	return 1;
+    }
+
+    &util::rm("$output_filestem.text");
+    return 0;
+
+}
Index: /main/tags/2.38/gsdl/bin/script/gsWget.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gsWget.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gsWget.pl	(revision 21083)
@@ -0,0 +1,72 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will download the specified urls (http:, ftp: and file:)
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use util;
+
+# wget should live in the Greenstone directory structure
+# we'll bail if we can't find it
+my $exe = &util::get_os_exe ();
+my $cmd = &util::filename_cat ($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "wget");
+$cmd .= $exe;
+if (! -e "$cmd") {
+    die "gsWget.pl failed: $cmd doesn't exist\n";
+}
+
+# if on windows we expect wget to already be on the path -
+# this allows us to avoid problems when GSDLHOME contains spaces
+# (double quoting the call doesn't work on win2000)
+if ($ENV{'GSDLOS'} =~ /^windows$/) {
+    $cmd = "wget";
+}
+
+# command-line parameters
+my @quoted_argv = map { "\"$_\"" } @ARGV;
+my $args = join(' ', @quoted_argv);
+$cmd .= " $args";
+
+# run the command
+my $status = system($cmd);
+
+# We should check the error status of wget; unfortunately this
+# is set to 1 even when we exit successfully, so we ignore it.
+#
+#$status /= 256;
+#if ($status != 0) {
+#    print STDERR "Error executing $cmd: $!\n";
+#    exit($status);
+#}
+
+print "\nDone: $cmd\n";
Index: /main/tags/2.38/gsdl/bin/script/gsdlinfo.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gsdlinfo.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gsdlinfo.pl	(revision 21083)
@@ -0,0 +1,142 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# gsdlinfo.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will look to see what collections are installed
+# under this file system
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use colcfg;
+
+if (scalar(@ARGV) && $ARGV[0] eq "--help") {
+    print STDERR "\n";
+    print STDERR "gsdlinfo.pl: Prints information on any Greenstone collections\n";
+    print STDERR "             found on the local file system.\n\n";
+    exit;
+}
+
+
+# the collection information is stored as an array of hashes
+# (one hash for each collection). The hash contains all the 
+# information in the collect and build configuration files
+
+
+# read in all the collection configuration information
+
+opendir (DIR, "$ENV{'GSDLHOME'}/collect") ||
+    die "ERROR - couldn't read the directory $ENV{'GSDLHOME'}/collect\n";
+@dir = readdir (DIR);
+closedir (DIR);
+
+@collections = ();
+foreach $dir (@dir) {
+    if ($dir =~ /^(\..*|modelcol|CVS)$/) {
+	# do nothing
+
+    } else {
+	# read in the collection configuration file
+	my $collectcfg = {};
+	if (-e "$ENV{'GSDLHOME'}/collect/$dir/etc/collect.cfg") {
+	    $collectcfg = &colcfg::read_collect_cfg ("$ENV{'GSDLHOME'}/collect/$dir/etc/collect.cfg");
+	}
+	$collectcfg->{'collection'} = $dir;
+
+	# read in the build configuration file
+	my $buildcfg = {};
+	if (-e "$ENV{'GSDLHOME'}/collect/$dir/index/build.cfg") {
+	    $buildcfg = &colcfg::read_build_cfg ("$ENV{'GSDLHOME'}/collect/$dir/index/build.cfg");
+	}
+
+	# add the merged configuration files to the current list of collections
+	push (@collections, {%$collectcfg, %$buildcfg});
+    }
+}
+
+
+# do any sorting requested
+
+
+# print out the collection information
+
+# {'creator'}->string
+# {'maintainer'}->array of strings
+# {'public'}->string
+# {'beta'}->string
+# {'key'}->string
+# {'indexes'}->array of strings
+# {'defaultindex'}->string
+# {'builddate'}->string
+# {'metadata'}->array of strings
+# {'languages'}->array of strings
+# {'numdocs'}->string
+# {'numwords'}->string
+# {'numbytes'}->string
+
+print "\n";
+foreach $info (@collections) {
+    if (defined $info->{'collection'}) {
+	$collection = $info->{'collection'};
+	if (defined $info->{'public'}) {
+	    $public = $info->{'public'};
+	} else {
+	    $public = "?";
+	}
+	if (defined $info->{'beta'}) {
+	    $beta = $info->{'beta'};
+	} else {
+	    $beta = "?";
+	}
+	if (defined $info->{'numdocs'}) {
+	    $numdocs = $info->{'numdocs'};
+	} else {
+	    $numdocs = "?";
+	}
+	if (defined $info->{'numbytes'}) {
+	    $numMbytes = int(($info->{'numbytes'}/1024.0/1024.0)*1000)/1000.0;
+	} else {
+	    $numMbytes = "?";
+	}
+	write;
+    }
+}
+print "\n";
+
+exit;
+
+format STDOUT_TOP = 
+  name   public  beta   documents  size (Mbytes)
+-------- ------ ------ ----------- -------------
+.
+
+format STDOUT = 
+@>>>>>>> @>>>>> @>>>>> @>>>>>>>>>> @>>>>>>>>>>>>
+$collection, $public, $beta, $numdocs, $numMbytes
+.
Index: /main/tags/2.38/gsdl/bin/script/gsw3mir.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/gsw3mir.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/gsw3mir.pl	(revision 21083)
@@ -0,0 +1,52 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# urldownload.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will download the specified urls (http:, ftp: and file:)
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/lib");
+    $ENV{'PATH'} = "$ENV{'GSDLHOME'}/perllib/cpan/bin:$ENV{'PATH'}";
+}
+
+my @quoted_argv = map { "\"$_\"" } @ARGV;
+
+my $args = join(' ', @quoted_argv);
+$cmd = "w3mir $args";
+
+my $status = system($cmd);
+$status /= 256;
+if ($status != 0)
+{
+    print STDERR "Error: failed to execute $cmd\n";
+    exit($status);
+}
+
Index: /main/tags/2.38/gsdl/bin/script/import.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/import.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/import.pl	(revision 21083)
@@ -0,0 +1,314 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# import.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will import a number of files into a particular collection
+
+package import;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use arcinfo;
+use colcfg;
+use plugin;
+use docprint;
+use util;
+use parsargv;
+use FileHandle;
+
+sub print_usage {
+    print STDOUT "\n";
+    print STDOUT "import.pl: Converts documents in collections -importdir directory into\n";
+    print STDOUT "           xml documents which are written to the -archivedir directory.\n\n";
+    print STDOUT "  usage: $0 [options] collection-name\n\n";
+    print STDOUT "  options:\n";
+    print STDOUT "   -verbosity number      0=none, 3=lots\n";
+    print STDOUT "   -importdir directory   Where the original material lives\n";
+    print STDOUT "   -archivedir directory  Where the converted material ends up\n";
+    print STDOUT "   -keepold               Will not destroy the current contents of the\n";
+    print STDOUT "                          archives directory (the default)\n";
+    print STDOUT "   -removeold             Will remove the old contents of the archives\n";
+    print STDOUT "                          directory -- use with care\n";
+    print STDOUT "   -gzip                  Use gzip to compress resulting xml documents\n";
+    print STDOUT "                          (don't forget to include ZIPPlug in your plugin\n";
+    print STDOUT "                          list when building from compressed documents)\n";
+    print STDOUT "   -maxdocs number        Maximum number of documents to import\n";
+    print STDOUT "   -groupsize number      Number of import documents to group into one XML file\n";
+    print STDOUT "   -OIDtype hash|incremental The method to use when generating unique\n";
+    print STDOUT "                          identifiers for each document. \"hash\" (the\n";
+    print STDOUT "                          default) hashes the contents of the file and so\n";
+    print STDOUT "                          will be the same every time the collection is\n";
+    print STDOUT "                          imported. \"incremental\" is a simple document\n";
+    print STDOUT "                          count and so will be significantly faster than\n";
+    print STDOUT "                          \"hash\". It is not guaranteed to always assign\n";
+    print STDOUT "                          the same identifier to a given document though\n";
+    print STDOUT "                          and does not allow further documents to be added\n";
+    print STDOUT "                          to existing xml archives\n";
+    print STDOUT "   -sortmeta metadata     Sort documents alphabetically by metadata for\n";
+    print STDOUT "                          building. This will be disabled if groupsize > 1\n";
+    print STDOUT "   -debug                 Print imported text to STDOUT\n";
+    print STDOUT "   -collectdir directory  Collection directory (defaults to " .
+	&util::filename_cat ($ENV{'GSDLHOME'}, "collect") . ")\n";
+    print STDOUT "   -out name              Filename or handle to print output status to.\n";
+    print STDOUT "                          The default is STDERR\n";
+    print STDOUT "   -statsfile name        Filename or handle to print import statistics to.\n";
+    print STDOUT "                          The default is STDERR\n";
+    print STDOUT "   -faillog name          Fail log filename. This log receives the filenames\n";
+    print STDOUT "                          of any files which fail to be processed (defaults\n";
+    print STDOUT "                          to " . 
+	&util::filename_cat("<collectdir>", "colname", "etc", "fail.log") . ")\n";
+    print STDOUT "  [Type \"perl -S import.pl | more\" if this help text scrolled off your screen]";
+    print STDOUT "\n" unless $ENV{'GSDLOS'} =~ /^windows$/i;
+}
+
+&main();
+
+sub main {
+    my ($verbosity, $importdir, $archivedir, $keepold, 
+	$removeold, $gzip, $groupsize, $OIDtype, $debug, 
+	$maxdocs, $collection, $configfilename, $collectcfg, 
+	$pluginfo, $sortmeta, $archive_info_filename, $statsfile,
+	$archive_info, $processor, $out, $faillog, $collectdir);
+
+    # note that no defaults are passed for most options as they're set
+    # later (after we check the collect.cfg file)
+    if (!parsargv::parse(\@ARGV,
+			 'verbosity/\d+/', \$verbosity,
+			 'importdir/.*/', \$importdir,
+			 'archivedir/.*/', \$archivedir, 
+			 'keepold', \$keepold, 
+			 'removeold', \$removeold, 
+			 'gzip', \$gzip, 
+			 'groupsize/\d+/1', \$groupsize, 
+			 'OIDtype/^(hash|incremental)$/', \$OIDtype,
+			 'sortmeta/.*/', \$sortmeta, 
+			 'debug', \$debug,
+			 'maxdocs/^\-?\d+/', \$maxdocs,
+			 'collectdir/.*/', \$collectdir,
+			 'out/.*/STDERR', \$out,
+			 'statsfile/.*/STDERR', \$statsfile,
+			 'faillog/.*/', \$faillog)) {
+	&print_usage();
+	die "\n";
+    }
+
+    my $close_out = 0;
+    if ($out !~ /^(STDERR|STDOUT)$/i) {
+	open (OUT, ">$out") || die "Couldn't open output file $out\n";
+	$out = 'import::OUT';
+	$close_out = 1;
+    }
+    $out->autoflush(1);
+
+    # set removeold to false if it has been defined
+    $removeold = 0 if ($keepold);
+
+    # get and check the collection name
+    if (($collection = &util::use_collection(@ARGV, $collectdir)) eq "") {
+	&print_usage();
+	die "\n";
+    }
+
+    if ($faillog eq "") {
+	$faillog = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "etc", "fail.log");
+    }
+    open (FAILLOG, ">$faillog") || die "Couldn't open fail log $faillog\n";
+    $faillog = 'import::FAILLOG';
+    $faillog->autoflush(1);
+
+    # check sortmeta
+    $sortmeta = undef unless defined $sortmeta && $sortmeta =~ /\S/;
+    if (defined $sortmeta && $groupsize > 1) {
+	print $out "WARNING: import.pl cannot sort documents when groupsize > 1\n";
+	print $out "         sortmeta option will be ignored\n\n";
+	$sortmeta = undef;
+    }
+
+    # dynamically load 'docsave' module so it can pick up on a collection
+    # specific docsave.pm is specified.
+
+    unshift (@INC, "$ENV{'GSDLCOLLECTDIR'}/perllib");
+    require docsave;
+
+
+    # get the list of plugins for this collection and set any options that
+    # were specified in the collect.cfg (all import.pl options except
+    # -collectdir, -out and -faillog may be specified in the collect.cfg (these
+    # options must be known before we read the collect.cfg))
+    my $plugins = [];
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc", "collect.cfg");
+    if (-e $configfilename) {
+	$collectcfg = &colcfg::read_collect_cfg ($configfilename);
+	if (defined $collectcfg->{'plugin'}) {
+	    $plugins = $collectcfg->{'plugin'};
+	}
+
+	if ($verbosity !~ /\d+/) {
+	    if (defined $collectcfg->{'verbosity'} && $collectcfg->{'verbosity'} =~ /\d+/) {
+		$verbosity = $collectcfg->{'verbosity'};
+	    } else {
+		$verbosity = 2; # the default
+	    }
+	}
+	if (defined $collectcfg->{'importdir'} && $importdir eq "") {
+	    $importdir = $collectcfg->{'importdir'};
+	}
+	if (defined $collectcfg->{'archivedir'} && $archivedir eq "") {
+	    $archivedir = $collectcfg->{'archivedir'};
+	}
+	if (defined $collectcfg->{'removeold'}) {
+	    if ($collectcfg->{'removeold'} =~ /^true$/i && !$keepold) {
+		$removeold = 1;
+	    }
+	    if ($collectcfg->{'removeold'} =~ /^false$/i && !$removeold) {
+		$removeold = 0;
+	    }
+	}
+	if (defined $collectcfg->{'keepold'}) {
+	    if ($collectcfg->{'keepold'} =~ /^false$/i && !$keepold) {
+		$removeold = 1;
+	    }
+	}
+	if (defined $collectcfg->{'gzip'} && !$gzip) {
+	    if ($collectcfg->{'gzip'} =~ /^true$/i) {
+		$gzip = 1;
+	    }
+	}
+	if ($maxdocs !~ /\-?\d+/) {
+	    if (defined $collectcfg->{'maxdocs'} && $collectcfg->{'maxdocs'} =~ /\-?\d+/) {
+		$maxdocs = $collectcfg->{'maxdocs'};
+	    } else {
+		$maxdocs = -1; # the default
+	    }
+	}
+	if ($groupsize == 1) {
+	    if (defined $collectcfg->{'groupsize'} && $collectcfg->{'groupsize'} =~ /\d+/) {
+		$groupsize = $collectcfg->{'groupsize'};
+	    }
+	}
+	if ($OIDtype !~ /^(hash|incremental)$/) {
+	    if (defined $collectcfg->{'OIDtype'} && $collectcfg->{'OIDtype'} =~ /^(hash|incremental)$/) {
+		$OIDtype = $collectcfg->{'OIDtype'};
+	    } else {
+		$OIDtype = "hash"; # the default
+	    }
+	}
+	if (defined $collectcfg->{'sortmeta'} && $sortmeta eq "") {
+	    $sortmeta = $collectcfg->{'sortmeta'};
+	}
+	if (defined $collectcfg->{'debug'} && $collectcfg->{'debug'} =~ /^true$/i) {
+	    $debug = 1;
+	}
+
+    } else {
+	die "Couldn't find the configuration file $configfilename\n";
+    }
+    
+    # fill in the default import and archives directories if none
+    # were supplied, turn all \ into / and remove trailing /
+    $importdir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "import") if $importdir eq "";
+    $importdir =~ s/[\\\/]+/\//g;
+    $importdir =~ s/\/$//;
+    $archivedir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives") if $archivedir eq "";
+    $archivedir =~ s/[\\\/]+/\//g;
+    $archivedir =~ s/\/$//;
+
+    # load all the plugins
+    $pluginfo = &plugin::load_plugins ($plugins, $verbosity, $out, $faillog);
+    if (scalar(@$pluginfo) == 0) {
+	print $out "No plugins were loaded.\n";
+	die "\n";
+    }
+	
+    # remove the old contents of the archives directory if needed
+    if ($removeold && -e $archivedir) {
+	print $out "Removing current contents of the archives directory\n";
+	sleep(3); # just in case...
+	&util::rm_r ($archivedir);
+    }
+    
+    # read the archive information file
+    if (!$debug) {
+	$archive_info_filename = &util::filename_cat ($archivedir, "archives.inf");
+	$archive_info = new arcinfo ();
+	$archive_info->load_info ($archive_info_filename);
+
+	# create a docsave object to process the documents
+	$processor = new docsave ($collection, $archive_info, $verbosity, $gzip, $groupsize, $out);
+	$processor->setarchivedir ($archivedir);
+	$processor->set_sortmeta ($sortmeta) if defined $sortmeta;
+	$processor->set_OIDtype ($OIDtype);
+    } else {
+	$processor = new docprint ();
+    }
+
+    &plugin::begin($pluginfo, $importdir, $processor, $maxdocs);
+
+    # process the import directory
+    &plugin::read ($pluginfo, $importdir, "", {}, $processor, $maxdocs);
+    
+    &plugin::end($pluginfo, $processor);
+
+    # write out the archive information file
+    if (!$debug) {
+	$processor->close_file_output() if $groupsize > 1;
+	$archive_info->save_info($archive_info_filename);
+    }
+    
+    # write out import stats
+    my $close_stats = 0;
+    if ($statsfile !~ /^(STDERR|STDOUT)$/i) {
+	if (open (STATS, ">$statsfile")) {
+	    $statsfile = 'import::STATS';
+	    $close_stats = 1;
+	} else {
+	    print $out "WARNING: couldn't open stats file $statsfile\n";
+	    print $out "         will print stats to STDERR instead\n";
+	    $statsfile = 'STDERR';
+	}
+    }
+
+    print $out "\n";
+    print $out "*********************************************\n";
+    print $out "Import Complete\n";
+    print $out "*********************************************\n";
+
+    &plugin::write_stats($pluginfo, $statsfile);
+    if ($close_stats) {
+	close STATS;
+    }
+
+    close OUT if $close_out;
+    close FAILLOG;
+}
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/Core.pm
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/Core.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/Core.pm	(revision 21083)
@@ -0,0 +1,895 @@
+#
+# PDF::Core.pm, version 1.11 February 2000 antro
+#
+# Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+#
+# Free usage under the same Perl Licence condition.
+#
+
+package PDF::Core;
+
+$PDF::Core::VERSION = "1.11";
+
+=pod
+
+=head1 NAME
+
+PDF::Core - Core Library for PDF library
+
+=head1 SYNOPSIS
+
+  use PDF::Core;
+
+  $pdf=PDF::Core->new ;
+  $pdf=PDF->new(filename);
+
+  $res= $pdf->GetObject($ref);
+
+  $name = UnQuoteName($pdfname);							  
+  $string = UnQuoteString($pdfstring);							  
+
+  $pdfname = QuoteName($name);							  
+  $pdfhexstring = QuoteHexString($string);
+  $pdfstring = QuoteString($string);
+
+  $obj = PDFGetPrimitive (filehandle, \$offset);
+  $line = PDFGetLine (filehandle, \$offset);
+  
+
+=head1 DESCRIPTION
+
+The main purpose of the PDF::Core library is to provide the data structure
+and the constructor for the more general PDF library.
+
+=cut
+
+require 5.005;
+use strict;
+use Carp;
+use Exporter ();
+
+use vars qw(@ISA @EXPORT_OK $UseObjectCache);
+
+@ISA = qw(Exporter);
+
+@EXPORT_OK = qw( GetObject );
+
+#
+# Object caching
+#
+# If this variable is true, all processed objects will be added to the
+# object cache. If only header information of a PDF are read or very
+# big PDF are processed, turning off the cache reduces the memory usage.
+#
+$UseObjectCache = 1;
+
+
+#################################################################
+#
+# Helper functions
+#
+#################################################################
+
+=pod
+
+=head1 Helper functions
+
+This functions are not part of the class, but perform useful services.
+
+=cut
+
+#
+# Modification by johi: 18.12.1999
+#
+
+#################################################################
+=pod
+
+=head2 UnQuoteName ( string )
+
+This function processes quoted characters in a PDF-name. PDF-names returned by
+B<GetObject> are already processed by this function.
+
+Returns a string.
+
+=cut
+
+sub UnQuoteName ($)
+	{
+	my $value = shift;
+	$value =~ s/#([\da-f]{2})/chr(hex($1))/ige;
+	return $value;
+	}
+
+#################################################################
+=pod
+
+=head2 UnQuoteString ( string )
+
+This function extracts the text from PDF-strings and PDF-hexstrings.
+It will process all quoted characters and remove the enclosing braces.
+
+WARNING: The current version doesn't handle unicode strings properly.
+
+Returns a string.
+
+=cut
+
+sub UnQuoteString ($)
+	{
+#
+# Translate quoted character. 
+#
+	my $param = shift;
+	my $value;
+	if (($value) = $param =~ m/^<(.*)>$/)
+		{
+		$value =~ tr/0-9A-Fa-f//cd;
+		$value .= "0" if (length ($value) % 2);
+		$value =~ s/([\da-f]{2})/chr(hex($1))/ige;
+		}
+	elsif (($value) = $param =~ m/^\((.*)\)$/)
+		{
+		my %quoted = ("n" => "\n", "r" => "\r",
+					  "t" => "\t", "b" => "\b",
+					  "f" => "\f", "\\" => "\\",
+					  "(" => "(", ")" => ")");
+		$value =~ s/\\([nrtbf\\()]|[0-7]{1,3})/
+		defined ($quoted{$1}) ? $quoted{$1} : chr(oct($1))/gex;
+		}
+	else
+		{
+		$value = $param;
+		}
+
+	return $value;
+	}
+
+#################################################################
+=pod
+
+=head2 QuoteName ( string )
+
+This function quotes problematic characters in a PDF-name. This
+function should be used before writing a PDF-name back to a PDF-file.
+
+Returns a string.
+
+=cut
+
+sub QuoteName ($)
+	{
+	my $value = shift;
+	$value =~ s/(?<!\A)([\x00-\x20\x7f-\xff%()\[\]<>\/{}#])/
+						 sprintf ("#%2.2X", ord($1))/gex;
+	return $value;
+	}
+
+#################################################################
+=pod
+
+=head2 QuoteHexString ( string )
+
+This function translates a string into a PDF-hexstring. 
+
+Returns a string.
+
+=cut
+
+sub QuoteHexString ($)
+	{
+	my $value = shift;
+
+	$value =~ s/(.)/sprintf ("%2.2X", ord($1))/ge;
+	return ("<" . $value . ">");
+	}
+
+#################################################################
+=pod
+
+=head2 QuoteString ( string )
+
+This function translates a string into a PDF-string. Problematic
+character will be quoted.
+
+WARNING: The current version doesn't handle unicode strings properly.
+
+Returns a string.
+
+=cut
+
+sub QuoteString ($)
+	{
+	#
+	# Only \character style quotes will be added. The really important
+	# characters to quote are: ()\
+	# 
+	my $value = shift;
+
+	my %quote = ("\n" => "\\n", "\r" => "\\r",
+				  "\t" => "\\t", "\b" => "\\b",
+				  "\f" => "\\f", "\\" => "\\\\",
+				  "(" => "\\(", ")" => "\\)");
+	$value =~ s/([\n\r\t\b\f\\()])/$quote{$1}/g;
+	return ("(" . $value . ")");
+	}
+
+#################################################################
+=pod
+
+=head2 PDFGetPrimitive ( filehandle, offset )
+
+This internal function is used while parsing a PDF-file. If you are
+not writing extentions for this library and are parsing some special
+parts of the PDF-file, stay away and use B<GetObject> instead.
+
+This function has many quirks and limitations. Check the source for details.
+
+=cut
+
+sub PDFGetPrimitive (*\$)
+	{
+	my $fd = shift;
+	my $offset = shift;
+
+	binmode $fd;
+	seek $fd, $$offset, 0;
+
+	my $state = 0;
+	my $buffer;
+	my @collector;
+	my $lastchar;
+
+	while ()
+		{
+		# File offset is positioned on start of stream.
+		last if ($state == -4);
+
+		$state = 0;
+
+		# Process last element
+		if ($#collector >= 0)
+			{
+			my $lastvalue = $collector[$#collector];
+			
+			if ($lastvalue eq "R")
+				{
+				# Process references
+				if ($#collector >= 2
+					&& $collector[$#collector - 1] =~ m/\d+/
+					&& $collector[$#collector - 2] =~ m/\d+/)
+					{
+					$collector[$#collector - 2] .= join (" ", 
+						"", @collector[$#collector - 1, $#collector]);
+					$#collector -= 2; 
+					}
+				else
+					{
+					carp "Bad reference at offset ", $$offset;
+					}
+				}
+			elsif ($lastvalue eq "endobj")
+				{
+				# End of object
+				last;
+				}
+			elsif ($lastvalue eq "stream")
+				{
+				# End of object
+				$state = -4;
+				}
+			}
+		
+		# Set state for next element
+		if ($buffer eq "[") 
+			{
+			# Read array
+			$buffer = "";
+			push @collector, [ PDFGetPrimitive ($fd, $offset) ];
+			}
+		elsif ($buffer eq "<<")
+			{
+			# Read dictionary
+			$buffer = "";
+			push @collector, { PDFGetPrimitive ($fd, $offset) };
+			}
+		elsif ($buffer eq "(") 
+			{
+			# Here comes a string
+			$state = 1;
+			$lastchar = "";
+			}
+		elsif ($buffer eq "<") 
+			{
+			# Here comes a hex string
+			$state = -1;
+			}
+		elsif ($buffer eq ">")
+			{
+			# Wait for next > to terminate dictionary
+			$state = -2;
+			}
+		elsif ($buffer eq "%")
+			{
+			# Skip comments
+			$state = -3;
+			$buffer = "";
+			}
+		elsif ($buffer eq "]")
+			{
+			last;
+			}
+		elsif ($buffer eq ">>")
+			{
+			last;
+			}
+
+		# Read next item
+		while (read ($fd, $_, 1))
+			{
+			$$offset++;
+
+			if ($state == 0)
+				{
+				# Normal mode
+				if (m/[^\x00-\x20\x7f-\xff%()\[\]<>\/]/)
+					{
+					# Normal character inside a name or number
+					$buffer .= $_;
+					}
+				elsif (m/[\/\(\[\]\<\>%]/)
+					{
+					if ($buffer ne "")
+						{
+						# A new item starts
+						if ($buffer =~ m/^\//)
+							{
+							push @collector, UnQuoteName ($buffer);
+							}
+						else
+							{
+							push @collector, $buffer;
+							}
+						}
+					$buffer = $_;
+					last;
+					}
+				elsif (m/\s/)
+					{
+					# All kind of whitespaces are ignored
+					if ($buffer ne "")
+						{
+						# The old item is done starts
+						if ($buffer =~ m/^\//)
+							{
+							push @collector, UnQuoteName ($buffer);
+							}
+						else
+							{
+							push @collector, $buffer;
+							}
+						$buffer = "";
+						last;
+						}
+					}
+				else
+					{
+					# Strange character. Should not exist.
+					# Complain and move on.
+					carp "Strange character '", $_, "' at offset ",
+					$$offset, " in mode ", $state, " detected";
+					$buffer .= $_;
+					}
+				}
+			elsif ($state > 0)
+				{
+				# We have a string
+
+				if ($lastchar =~ m/\\[\r\n]+/ && m/[^\r\n]/)
+					{
+					# Clean up after line continuation
+					$lastchar = "";
+					}
+
+				if ($lastchar =~ m/\\[\r\n]*/)
+					{
+					# Process character after backslash
+					if (m/[\r\n]/)
+						{
+						# end of line
+						$lastchar .= $_;
+						}
+					else
+						{
+						# Just a quote
+						$buffer .= $lastchar . $_;
+						$lastchar = "";
+						}
+					}
+				else
+					{
+					if ($_ eq "\\")
+						{
+						# Quoted string starts
+						$lastchar = $_;
+						}
+					elsif ($_ eq "(")
+						{
+						# Count braces
+						$buffer .= $_;
+						$state ++;
+						}
+					elsif ($_ eq ")")
+						{
+						# End of string
+						$buffer .= $_;
+						unless (-- $state)
+							{
+							push @collector, $buffer;
+							$buffer = "";
+							last;
+							}
+						}
+					else
+						{
+						$buffer .= $_;
+						}
+					}
+				}
+			elsif ($state == -1)
+				{
+				if (m/[0-9a-f\s]/i)
+					{
+					# Hex character
+					$buffer .= $_;
+					}
+				elsif ($_ eq ">")
+					{
+					# End of string
+					$buffer .= $_;
+					push @collector, $buffer;
+					$buffer = "";
+					last;
+					}
+				elsif ($_ eq "<" && $buffer eq "<")
+					{
+					# This is not a string, but a dictionary instead
+					$buffer .= $_;
+					last;
+					}
+				else
+					{
+					# Should not be there. Complain and add it to the $buffer
+					carp "Bad character '", $_ , "' in hex string";
+					$buffer .= $_;
+					}
+				}
+			elsif ($state == -2)
+				{
+				# Wait for second > to terminate dictionary
+
+				# Some sanity checks
+				carp "Character '", $_, "' appeared while waiting for '>'" 
+				if ($_ ne ">");
+				carp "Buffer contains '", $buffer, "' and not '>'" 
+				if ($buffer ne ">");
+
+				$buffer = ">>";
+				last;
+				}
+			elsif ($state == -3)
+				{
+				# Skip comments;
+				last if (m/[\r\n]/);
+				}
+			elsif ($state == -4)
+				{
+				# Wait for newline to start stream
+
+				if ($_ eq "\n")
+					{
+					# Some sanity checks
+					carp "Text '", $buffer, 
+					"' appeared while waiting for start of stream" 
+					if ($buffer ne "");
+
+					$buffer = "";
+					last;
+					}
+				elsif (m/\S/)
+					{
+					$buffer .= $_;
+					}
+				}
+			else
+				{
+				# Unhandled status. Complain and reset
+				carp "Unhandled status ", $state;
+				}
+			}
+		if ($_ eq "")
+			{
+			# Unhandled status. Complain and reset
+			carp "Premature end of file reached";
+			
+			if ($buffer ne "")
+				{
+				push @collector, $buffer;
+				$buffer = "";
+				}
+			last;
+			}
+		}
+
+	return @collector;
+	}
+
+#################################################################
+=pod
+
+=head2 PDFGetline ( filehandle, offset )
+
+This internal function was used to read a line from a PDF-file. It has
+many limitations and you should stay away from it, if you don't know
+what you are doing. Use B<GetObject> or B<PDFGetPrimitive> instead.
+
+=cut
+
+sub PDFGetline {
+#
+# BUG WARNING:
+#
+# This function returns only one line, which doesn't mean anything most of the
+# time. Except for the fileheader and the xref-table, linebreaks can (and will!)
+# occur everywhere in a PDF and are just whitespace. You may find only part of a
+# PDF-primitve on one line, or more than one of them.
+#
+# If you want to read PDF-Primitves, use the function PDFGetPrimitive instead.
+#
+    my $fd = shift;
+    my $offset=shift;
+
+    my $buffer;
+    my $endflag=1;
+
+    binmode $fd;
+    seek $fd, $$offset, 0;
+
+    read($fd,$buffer,2);
+    $buffer =~ s/^\r?\n?// ;
+
+    $$offset +=2;
+
+    while ($endflag) {
+      read($fd,$_,1);
+      $$offset++;
+      $endflag = 0 if ( $_ eq "\r" || $_ eq "\n");
+      $buffer = $buffer . $_ ;
+    }
+    return $buffer;
+	}
+
+#################################################################
+#
+# Constructors
+#
+#################################################################
+
+=pod
+
+=head1 Constructor
+
+=cut
+
+#################################################################
+=pod
+
+=head2 new ( [ filename ] )
+
+This is the constructor of a new PDF object. If the filename is
+missing, it returns an empty PDF descriptor ( can be filled with
+$pdf->TargetFile). Otherwise, It acts as the B<PDF::Parse::TargetFile>
+method.
+
+=cut
+
+sub new {
+
+	my %PDF_Fields = (
+		  File_Name => undef, # Name of file
+		  File_Handler => undef, # Open handle to file
+		  Header => undef, # Identification string
+
+		  Objects => [], # Offset of objects
+		  Gen_Num => [], # Genereation number of objects
+		  Object_Length => [],	# Length of processed objects
+		  Object_Cache => {}, # Cache for objects.
+		  Page => [], # Information about all pages. Useful.
+
+		  Updated => 0,	# Is the PDF updated 
+		  Last_XRef_Offset => undef, # File offset of active Xref table
+		  Trailer => {}, # Content of active trailer
+		  Info => {}, # Content of active info object
+		  Catalog => {}, # Content of catalog
+		  PageTree => {}, # Content of root page
+		  );
+my $that = shift;
+my $class=ref($that) || $that ;
+  my $self = \%PDF_Fields ;
+  my $buf2=bless $self, $class;
+  if ( @_ ) { 			# I have the filename
+    $buf2->TargetFile($_[0]) ; 
+  }
+  return bless $self, $class;
+};
+
+#################################################################
+sub DESTROY {
+#
+# Close the file if not empty
+#
+  my $self = shift;
+  close ( $self->{File_Handler} ) if $self->{File_Handler} ;
+}
+
+#################################################################
+#
+# Methods
+#
+#################################################################
+
+=pod
+
+=head1 Methods
+
+The available methods are:
+
+=cut
+
+#################################################################
+=pod
+
+=head2 GetObject (reference)
+
+This methods returns the PDF-object for B<reference>. The string
+B<reference> must match the regular expression /^\d+ \d+ R$/,
+where the first number is the object number, the second number the
+generation number.
+
+The return value is a PDF-primitive, the type depends on the content
+of the object:
+
+=over
+
+=item B<undef>
+
+The object could not be found or an error. Not all referenced objects
+need to be present in a PDF-file. This value can be ignored.
+
+=item B<Hash Reference>
+
+If (UNIVERSAL::isa ($retval, "HASH") is true, the object is a
+PDF-dictionary. The keys of the hash should be either a PDF name (eg:
+/MediaBox) or a generated value like Stream_Offset. Everything else is
+an error.
+
+The values of the hash can be any PDF-primitive, including PDF-arrays
+and other dictionaries.
+
+This is the most common value returned by GetObject. If the key
+Stream_Offset exists, the dictionary is followed by stream data,
+starting at the file offeset indicated by this value.
+
+=item B<Array Reference>
+
+If (UNIVERSAL::isa ($retval, "ARRAY") is true, the object is a
+PDF-array. Each element may be of a different type, and may contain
+further references to arrays or any other PDF-primitive.
+
+=item B<String matching /^\d+ \d+ R$/>
+
+This is a reference to another PDF-Object. This value can be passed to
+GetObject. This kind of value may appear instead of most other types.
+Some PDF-writing programs seem to have special fun writing references
+when a simple number is expected. If the final number is need, use
+code like this to resolve references:
+
+while ($len =~ m/^\d+ \d+ R$/) {$len = $self->GetObject ($len);	}
+
+Example: 22 0 R
+
+=item B<String matching /^\//>
+
+This is a Name in a PDF dictionary. This string is already processed
+by B<UnQuotName> and may differ from the value in the PDF-file. In
+some very old andstrange non-standard PDF-files, this may lead to
+confusion.
+
+Example: /MediaBox
+
+=item B<String matching /^\(.*\)$/>
+
+This is a string. It may contain newlines, quoted characters und other
+strange stuff. Use PDF::UnQuoteString to extract the text.
+
+Example: (This is\na string with two \(2\) lines.)
+
+=item B<String matching /^E<lt>.*E<gt>$/>
+
+This is a hex encoded string. Use PDF::UnQuoteString to extract the text.
+
+Example: E<lt>48 45 4c4C4 F1cE<gt>
+
+=item B<String matching /^[\d.\+\-]+$/>
+
+This is probably a number.
+
+Example: 611
+
+=item B<String matching none of the above>
+
+this is either a PDF bareword (eg. true, false, ...) or a value
+generated by this method like Stream_Offset.
+
+Example: true
+
+=back
+
+To improve performance GetObject uses an internal cache for objects.
+Repeated requests for the same objects are not read form the file but
+satisfied from the cache. With the Variable B<$PDF::Core::UseObjectCache>,
+the caching mechanism can be turned off.
+
+B<WARNING>
+
+Special care must be taken, when returned objects are modified. If the
+object contains sub-objects, the sub-objects are not duplicated and
+all changes affect all other copies of this object. Use your own copy,
+if you need to modify those values.
+
+=cut
+
+sub GetObject (\*$;$)
+	{
+	my $self = shift;
+	my $ref = shift;
+	my $force = shift;
+
+#
+# Is PDF file open?
+#
+	croak "PDF-file not open." unless ($self->{"File_Handler"});
+
+#
+# Check reference
+#
+	my ($ind, $gen);
+	unless (($ind,$gen) = $ref =~ m/^(\d+) (\d+) R$/)
+		{
+		carp "Bad object reference '", $_, "'";
+		return undef;
+		}
+	if ($ind > $#{$self->{"Gen_Num"}} || $self->{"Gen_Num"}[$ind] != $gen)
+		{
+		#
+		# The page does not exist. According to the PDF specification,
+		# this is not an error.
+		#
+		return undef;
+		}
+
+	# Remove leading zero for cache key.
+	$ind += 0;
+	# Check cache
+	if ($UseObjectCache && ! $force
+		&& defined($self->{"Object_Cache"}{$ind}))
+		{
+		return $self->{"Object_Cache"}{$ind};
+		}
+
+	my $offset = $self->{"Objects"}[$ind];
+	my @data = PDFGetPrimitive ($self->{"File_Handler"}, $offset);
+
+	unless ($#data == 4  && $data[0] == $ind 
+		&& $data[1] == $gen && $data[2] eq "obj")
+		{
+		carp "Object mismatch: Got '", join (" ", @data[0..2]),
+		"' instead of '", join (" ", $ind, $gen, "obj"), "'";
+		return;
+		}
+
+	#
+	# An object is not always a dictionary. In such cases,
+	# adding additional keys breaks the content.
+	#
+	if (UNIVERSAL::isa ($data[3], "HASH"))
+		{
+		if ($data[4] eq "stream")
+			{
+			#
+			# Find end of a stream object
+			#
+			$data[3]{"Stream_Offset"} = $offset;
+			my $len = $data[3]{"/Length"};
+
+			# Length can be a reference to another object. 
+			# Resolve references in this case till something else appears.
+			while ($len =~ m/^\d+ \d+ R$/)
+				{
+				$len = $self->GetObject ($len);
+				}
+
+			# Skip stream
+			if ($len =~ m/^\d+$/)
+				{
+				$offset += $len;
+				}
+			else
+				{
+				carp "Strange: /Length resolves to '", $len, "' in object ", 
+				join (" ", @data[0..2]);
+				}
+
+			my @enddata = PDFGetPrimitive ($self->{"File_Handler"}, $offset);
+			$data[4] = $enddata[$#enddata];
+			}
+		}
+
+	#
+	# Save length of object.
+	#
+	$self->{"Object_Length"}[$ind] = $offset - $self->{"Objects"}[$ind];
+
+	carp "Bad object termination '", $data[4], "' in object ", 
+	join (" ", @data[0..2]) if ($data[4] ne "endobj");
+	
+
+	# Update cache
+	$self->{"Object_Cache"}{$ind} = $data[3] if ($UseObjectCache);
+
+	return $data[3];
+	}
+
+#
+# End of Modification by johi: 18.12.1999
+#
+#################################################################
+
+
+1;
+__END__
+
+=pod
+
+=head1 Variables
+
+Available variables are:
+
+=over 4
+
+=item B<$PDF::Core::VERSION>
+
+Contains the version of the library installed
+
+=item B<$PDF::Core::UseObjectCache>
+
+If this variable is true, all processed objects will be added to the
+object cache. If only header information of a PDF are read or very big
+PDF are processed, turning off the cache reduces the memory usage.
+
+=back 4
+
+=head1 Copyright
+
+  Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 Availability
+
+The latest version of this library is likely to be available from:
+
+http://www.geocities.com/CapeCanaveral/Hangar/4794/
+
+=cut
Index: /main/tags/2.38/gsdl/bin/script/indexes/PDF.pm
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/PDF.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/PDF.pm	(revision 21083)
@@ -0,0 +1,153 @@
+#
+# PDF.pm, version 1.11 February 2000 antro
+#
+# Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+#
+# Free usage under the same Perl Licence condition.
+#
+
+package PDF;
+
+$PDF::VERSION = "1.11";
+
+require 5.005;
+
+#require PDF::Core;  
+#require PDF::Parse; 
+require Core;  
+require Parse;
+ 
+use strict;
+use Carp;
+use Exporter ();
+
+use vars qw(@ISA $Verbose);
+
+#
+# Verbose off by default
+#
+$Verbose = 0;
+
+@ISA = qw(Exporter PDF::Core PDF::Parse);
+
+1;
+
+__END__
+
+=head1 NAME
+
+PDF - Library for PDF access and manipulation in Perl
+
+=head1 SYNOPSIS
+
+  use PDF;
+
+  $pdf=PDF->new ;
+  $pdf=PDF->new(filename);
+
+  $result=$pdf->TargetFile( filename );
+
+  print "is a pdf file\n" if ( $pdf->IsaPDF ) ;
+  print "Has ",$pdf->Pages," Pages \n";
+  print "Use a PDF Version  ",$pdf->Version ," \n";
+  print "and it is crypted  " if ( $pdf->IscryptedPDF) ;
+
+  print "filename with title",$pdf->GetInfo("Title"),"\n";
+  print "and with subject ",$pdf->GetInfo("Subject"),"\n";
+  print "was written by ",$pdf->GetInfo("Author"),"\n";
+  print "in date ",$pdf->GetInfo("CreationDate"),"\n";
+  print "using ",$pdf->GetInfo("Creator"),"\n";
+  print "and converted with ",$pdf->GetInfo("Producer"),"\n";
+  print "The last modification occurred ",$pdf->GetInfo("ModDate"),"\n";
+  print "The associated keywords are ",$pdf->GetInfo("Keywords"),"\n";
+
+  my (startx,starty, endx,endy) = $pdf->PageSize ($page) ;
+
+=head1 DESCRIPTION
+
+The main purpose of the PDF library is to provide classes and
+functions that allow to read and manipulate PDF files with perl. PDF
+stands for Portable Document Format and is a format proposed by Adobe.
+A full description of this format can be found in the B<Portable
+Document Reference Manual> by B<Adobe Systems Inc.>. For more details
+about PDF, refer to:
+
+B<http://www.adobe.com/>
+
+The main idea is to provide some "basic" modules for access 
+the information contained in a PDF file. Even if at this
+moment is in an early development stage, the scripts in the 
+example directory show that it is usable. 
+
+B<is_pdf> script test a list of files in order divide the PDF file
+from the non PDF using the info provided by the files 
+themselves. It doesn't use the I<.pdf> extension, it uses the information
+contained in the file.
+
+B<pdf_version> returns the PDF level used for writing a file.
+
+B<pdf_pages> gives the number of pages of a PDF file. 
+
+B<pagedump.pl> prints some information about individual pages in a
+PDF-file. Although the information as such are not very useful, it
+demontrates well some more complex aspects of the library. Check the
+function B<doprint> in this program on how to handle all possible data
+occuring in a PDF.
+
+The library is now splitted in 2 section :
+
+B<PDF::Core> that contains the data structure, the constructor and low
+level access fuctions;
+
+B<PDF::Parse> all kind of functions to parse the PDF-files and
+provide information about the content.
+
+Check the help-files of these modules for more details.
+
+=head1 Variables
+
+There are 2 variables that can be accessed:
+
+=over 4
+
+`=item B<$PDF::VERSION>
+
+Contain the version of the library installed.
+
+=item B<$PDF::Verbose>
+
+This variable is false by default. Change the value if you want 
+more verbose output messages from library.
+
+=back 4
+
+=head1 Copyright
+
+  Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 Availability
+
+The latest version of this library is likely to be available from:
+
+http://www.geocities.com/CapeCanaveral/Hangar/4794/
+
+and at any CPAN mirror
+
+=head1 Greetings
+
+Fabrizio Pivari ( pivari@geocities.com ) for all the suggestions about life, the universe and everything.
+Brad Appleton ( bradapp@enteract.com ) for his suggestions about the module organization.
+Thomas Drillich for the iso latin1 support 
+Ross Moore ( ross@ics.mq.edu.au ) for ReadInfo fix
+
+=cut
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/Parse.pm
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/Parse.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/Parse.pm	(revision 21083)
@@ -0,0 +1,513 @@
+#
+# PDF::Parse.pm, version 1.11 February 2000 antro
+#
+# Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+#
+# Free usage under the same Perl Licence condition.
+#
+
+package PDF::Parse;
+
+$PDF::Parse::VERSION = "1.11";
+
+=pod
+
+=head1 NAME
+
+PDF::Parse - Library with parsing functions for PDF library
+
+=head1 SYNOPSIS
+
+  use PDF::Parse;
+
+  $pdf->TargetFile($filename);
+  $pdf->LoadPageInfo;
+
+  $version = $pdf->Version;
+  $bool = $pdf->IsaPDF;
+  $bool = $pdf->IscryptPDF;
+
+  $info = $pdf->GetInfo ($key);
+  $pagenum = $pdf->Pages;
+
+  @size = $pdf->PageSize ($page);
+  # or
+  @size = $pdf->PageSize;
+
+  $rotation = $pdf->PageRotation ($page);
+  # or
+  $rotation = $pdf->PageRotation;
+
+=head1 DESCRIPTION
+
+The main purpose of the PDF::Parse library is to provide parsing functions
+for the more general PDF library.
+
+=head1 Methods
+
+The available methods are:
+
+=cut
+
+require 5.005;
+#require PDF::Core;
+require Core;
+
+use strict;
+use Carp;
+use Exporter ();
+
+use vars qw(@ISA @EXPORT_OK);
+
+@ISA = qw(Exporter PDF::Core);
+
+@EXPORT_OK = qw( LoadPageInfo GetInfo TargetFile
+				 Pages PageSize PageRotation IsaPDF
+				 Version IscryptPDF );
+
+#################################################################
+sub ReadCrossReference_pass1 {
+  my $fd = shift;
+  my $offset=shift;
+  my $self=shift;
+
+  my $initial_number;
+  my $obj_counter=0;
+  my $global_obj_counter=0;
+  my $buf;
+
+  binmode $fd;
+
+  $_=PDF::Core::PDFGetline ($fd,\$offset);
+
+  die "Can't read cross-reference section, according to trailer\n" if ! /xref\r?\n?/  ;
+
+  while () {
+    $_=PDF::Core::PDFGetline ($fd,\$offset);
+    s/^\n//;
+    s/^\r//;
+    last if (m/\btrailer\b/) ;
+#
+# An Object
+#
+    /^\d+\s+\d+\s+n\r?\n?/ && do { my $buf =$_;
+	       my $ind = $initial_number + ($obj_counter++);
+               ( not defined $self->{Objects}[$ind] )&& 
+		  do { $self->{Objects}[$ind] = int substr($buf,0,10);
+		       $self->{Gen_Num}[$ind] = int substr($buf,11,5);
+		     };
+	       $_=$buf;
+	       s/^.{18}//; 
+	       next ;
+   }; 
+#
+# A Freed Object
+#
+    /^\d+\s+\d+\s+f\r?\n?/ && do { my $buf =$_;
+   	       my $objects_generation_nr = substr($buf,11,5);
+	       my $Num=substr($buf,0,10);
+	       my $ind = $initial_number + ($obj_counter++);
+	       # $ind = $ind . "_" . $objects_generation_nr;
+		       $self->{Objects}[$ind] = - $Num;
+		       $self->{Gen_Num}[$ind] = $objects_generation_nr;
+		       $_=$buf;
+		       s/^.{18}//; 
+		       next ;
+     };
+#
+# A subsection
+#
+    /^\d+\s+\d+\r?\n?/  && do { 
+ 	my $buf = $_ ; 
+ 	 $initial_number = $buf; 
+ 	 $initial_number=~ s/^(\d+)\s+\d+\r?\n?.*/$1/; 
+	 $global_obj_counter += $obj_counter;
+ 	 $obj_counter=0; 
+	 next ;
+    };
+  }
+
+  $global_obj_counter +=$obj_counter;
+#
+# Now the trailer for updates 
+#
+
+#
+# Skip to start of dictionary.
+#
+    until (m/<</)
+		{
+		$_=PDF::Core::PDFGetline ($fd,\$offset);
+		}
+
+#
+# Read the dictionary
+#
+    my %trailer = ( PDF::Core::PDFGetPrimitive ($fd, $offset) );
+
+    if ($self->{"Trailer"}{"/Root"} eq "")
+		{
+		$self->{"Trailer"} = \%trailer;
+		#
+		# This code is here for backward compatibility only. If the content
+		# of the root trailer is needed, use $self->{"Trailer"} instead.
+		#
+		$self->{"Cross_Reference_Size"} = $trailer{"/Size"};
+		$self->{"Root_Object"} = $trailer{"/Root"};
+		$self->{"Crypt_Object"} = $trailer{"/Encrypt"};
+		}
+	if ($trailer{"/Prev"} =~ m/^\d+$/)
+		{  
+  		$self->{"Updated"} = 1;
+		my $old_seek = tell $fd;
+		$global_obj_counter += ReadCrossReference_pass1 ($fd,
+            $trailer{"/Prev"}, $self );
+		seek $fd, $old_seek, 0;
+		}
+
+
+  return $global_obj_counter;
+}
+
+#################################################################
+sub LoadPageSubtree (\*$;%)
+	{
+	my $self = shift;
+	my $ref = shift;
+	my %inheritance = @_ ;
+
+	my $data = $self->GetObject ($ref);
+
+	# Check which attributes are inherited. Adobe did not add any new
+	# inherited attributes in version 1.2 or later, so this list is
+	# complete.
+
+	# Do simple values.
+	foreach my $key ("/Rotate", "/Dur", "/Hid", "/Trans", 
+			 "/MediaBox", "/CropBox") {
+
+	    if (defined ($data->{$key})){
+
+		# Check if it is an indirect reference
+		if ($data->{$key} =~ m/^\d+ \d+ R$/) {
+		    
+		    my $dataref = $data->{$key};
+
+		    do {
+
+			$dataref = $self->GetObject ($dataref);
+
+		    } while ($dataref =~ m/^\d+ \d+ R$/);
+
+		    if (UNIVERSAL::isa ($data, "ARRAY")){
+
+			$inheritance{$key} = [];
+
+			foreach my $i (@{$data}){
+			    # Each element may be a reference.
+			    while ($i =~ m/^\d+ \d+ R$/){
+				$i = $self->GetObject ($i);
+			    }
+			    
+			    push @{$inheritance{$key}}, $i;
+			}
+		    } else {
+			$inheritance{$key} = $dataref;
+		    }
+		} else { #not an indirect reference
+		    $inheritance{$key} = $data->{$key};
+		}
+	    }
+	}
+	
+	# If this objects contains ressources, replace information in inheritance
+	$inheritance{"Resource_Object"} = $data->{"/Resources"}
+	    if (defined ($data->{"/Resources"}));
+
+	if ($data->{"/Type"} eq "/Pages")
+		{
+		# It's just an intermediate Node
+		foreach my $kid (@{$data->{"/Kids"}})
+			{
+			$self->LoadPageSubtree ($kid, %inheritance);
+			}
+		}
+	elsif ($data->{"/Type"} eq "/Page")
+		{
+		# We have a real page!
+		$inheritance{"Page_Object"} = $ref;
+		push @{$self->{"Page"}}, +{ %inheritance };
+		}
+	else
+		{
+		# Strange stuff. Complain and discard.
+		carp "While loading pages got object of type '", $data->{"/Type"}, "'";
+		}
+	}
+
+#################################################################
+=pod
+
+=head2 TargetFile ( filename )
+
+This method links the filename to the pdf descriptor and parses all
+kind of header information.
+
+=cut
+
+sub TargetFile {
+  my $self = shift;
+  my $file = shift;
+
+  croak "Already linked to the file ",$self->{File_Name},"\n" 
+      if $self->{File_Name} ;
+  
+  my $offset;
+
+  if ( $file ) {
+    open(FILE, "< $file") or croak "can't open $file: $!";
+    binmode FILE;
+    $self->{File_Name} = $file ;
+    $self->{File_Handler} = \*FILE;
+    my $buf;
+    read(FILE,$buf,4);
+    if ( $buf ne "%PDF" ) {
+     print "File $_[0] is not PDF compliant !\n" if $PDF::Verbose ;
+     return 0 ;
+    }
+    read(FILE,$buf,4);
+    $buf =~ s/-//;
+    $self->{Header}= $buf;
+    seek FILE,-50,2;
+    read( FILE, $offset, 50 );
+    $offset =~ s/[^s]*startxref\r?\n?(\d*)\r?\n?%%EOF\r?\n?/$1/;
+
+	$self->{"Last_XRef_Offset"} = $offset;
+    ReadCrossReference_pass1 (\*FILE, $offset, $self);
+	$self->{"Info"} = $self->GetObject ($self->{"Trailer"}{"/Info"});
+	$self->{"Catalog"} = $self->GetObject ($self->{"Trailer"}{"/Root"});
+	$self->{"PageTree"} = $self->GetObject ($self->{"Catalog"}{"/Pages"});
+    return 1;
+  } else {
+    croak "I need a file name (!)";
+	}
+}
+
+#################################################################
+=pod
+
+=head2 LoadPageInfo
+
+This function loads the information for all pages. This process can
+take some time for big PDF-files.
+
+=cut
+
+sub LoadPageInfo (\*)
+	{
+	my $self = shift;
+
+	# Reset Page Array
+	$#{$self->{"Page"}} = -1;
+
+	# Recurse
+	$self->LoadPageSubtree ($self->{"Catalog"}{"/Pages"});
+	}								
+
+
+
+#################################################################
+=pod
+
+=head2 Version
+
+Returns the PDF version used for writing the object file.
+
+=cut
+
+sub Version { 
+  return ($_[0]->{Header}); 
+}
+
+#################################################################
+=pod
+
+=head2 IsaPDF
+
+Returns true, if the file could be parsed and is a PDF-file.
+
+=cut
+
+sub IsaPDF { 
+  return ($_[0]->{Header} != undef) ; 
+}
+
+#################################################################
+=pod
+
+=head2 IscryptPDF
+
+Returns true if the PDF contains a crypt object. This indicates that
+the data of the PDF-File is encrypted. In this case, not all function
+work as expected.
+
+=cut
+
+sub IscryptPDF { 
+  return ($_[0]->{Crypt_Object} != undef) ; 
+}
+
+#################################################################
+=pod
+
+=head2 GetInfo ( key )
+
+Returns the various information contained in the info section of a PDF
+file (if present). A PDF file can have:
+
+  a title ==> GetInfo ("Title")
+  a subject ==> GetInfo ("Subject")
+  an author ==> GetInfo("Author")
+  a creation date ==> GetInfo("CreationDate")
+  a creator ==> GetInfo("Creator")
+  a producer ==> GetInfo("Producer")
+  a modification date ==> GetInfo("ModDate")
+  some keywords ==> GetInfo("Keywords")
+
+=cut
+
+sub GetInfo (\*$)
+	{
+	my $self = shift;
+	my $type = shift;
+
+	return PDF::Core::UnQuoteString ($self->{"Info"}{"/" . $type})
+	}
+
+#################################################################
+=pod
+
+=head2 Pages
+
+Returns the number of pages of the PDF-file.
+
+=cut
+
+sub Pages 
+	{
+	my $self = shift;
+
+	return $self->{"PageTree"}{"/Count"};
+	}
+
+
+
+#################################################################
+=pod
+
+=head2 PageSize ( [ page ] )
+
+Returns the size of a page in the PDF-file. If no parameter is given,
+the default size of the root page will be returned. This value may be
+overridden for any page.
+
+If the size of an individual page is requested and the page data is
+not already loaded, the method B<LoadPageInfo> will be executed. This
+may take some time for large PDF-files. The size of the root page is
+always available and will never execute B<LoadPageInfo>.
+
+=cut
+
+sub PageSize (;$)
+	{
+	my $self = shift;
+	my $page = shift;
+
+	if ($page > 0)
+		{
+		return undef if ($page > $self->{"PageTree"}{"/Count"});
+		$self->LoadPageInfo unless ($#{$self->{"Page"}} >= 0);
+		
+		return @{$self->{"Page"}[$page - 1]{"/MediaBox"}}
+		if (defined $self->{"Page"}[$page - 1]{"/MediaBox"});
+		}
+	else
+		{
+		return @{$self->{"PageTree"}{"/MediaBox"}}
+		if (defined $self->{"PageTree"}{"/MediaBox"});
+		}
+
+	return undef;
+	}
+
+
+#################################################################
+=pod
+
+=head2 PageRotation ( [ page ] )
+
+Returns the rotation of a page in the PDF-file. If no parameter is given,
+the default rotation of the root page will be returned. This value may be
+overridden for any page.
+
+If the rotation of an individual page is requested and the page data is
+not already loaded, the method B<LoadPageInfo> will be executed. This
+may take some time for large PDF-files. The rotation of the root page is
+always available and will never execute B<LoadPageInfo>.
+
+=cut
+sub PageRotation (;$)
+	{
+	my $self = shift;
+	my $page = shift;
+
+	my $rotate = 0;
+
+	if ($page > 0)
+		{
+		return undef if ($page > $self->{"PageTree"}{"/Count"});
+		$self->LoadPageInfo unless ($#{$self->{"Page"}} >= 0);
+		
+		$rotate = $self->{"Page"}[$page - 1]{"/Rotate"};
+		}
+	else
+		{
+		$rotate = $self->{"PageTree"}{"/Rotate"};
+		}
+
+	print "Rotation ", 0 + $rotate if ($PDF::Verbose);
+
+	return 0 + $rotate;
+	}
+#################################################################
+1;
+__END__
+
+=head1 Variables
+
+The only available variable is :
+
+=over
+
+=item B<$PDF::Parse::VERSION>
+
+Contains the version of the library installed
+
+=back
+
+
+=head1 Copyright
+
+  Copyright (c) 1998 - 2000 Antonio Rosella Italy antro@tiscalinet.it, Johannes Blach dw235@yahoo.com 
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 Availability
+
+The latest version of this library is likely to be available from:
+
+http://www.geocities.com/CapeCanaveral/Hangar/4794/
+
+=cut
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/amend_pdf.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/amend_pdf.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/amend_pdf.pl	(revision 21083)
@@ -0,0 +1,682 @@
+#!/usr/bin/perl
+#Jessica Thurston
+#usage: perl amend_pdf.pl filename
+#This program takes a pdf file 'filename'
+#and modifys it to include outline entries
+#(bookmarks).  
+#This is achieved using a pdf library which
+#parses the pdf file into objects allowing 
+#this script to more easily manipulate the pdf
+#objects and then modify the file by means
+#of incremental updates. (modifys the necessary
+#pdf objects and appends them to the end of 
+#the file, then updates the xreference table and
+#trailer). This library can be downloaded at
+# http://www.sanface.com/PDF-lib/
+#A file url.txt stored in the same
+#directory is read containing two columns of data:
+#title of related pdf document     url of related pdf document
+#The pdf document is modified so that the title of the
+#related pdf documents are displayed as bookmarks and
+#when the user clicks on it the web browser opens at
+#the url stored in the same column of url.txt.
+#
+#This program was designed to be used with the Greenstone
+#digital library in the following ways:
+#-When a user has built a collection containing
+# pdf documents, they have a choice of either displaying
+# the page in the web browser in gml form or saving the
+# original pdf document to view in an acrobat pdf reader.
+#-The related document file url.txt can be downloaded
+# in the same way if the user has included in the format
+# string for that page (ie search list) in the collection 
+# configuration file [urllink] related documents [/urllink].  
+# This will create a html link 'related documents' which 
+# when clicked on will enable the user to save a file url.txt 
+# containing the related documents for that particular document. 
+#-This file has been written upon running the perl script
+# relationPDF.pl which will also amend the gml documents to 
+# include the 'urllink' information enabling the user to 
+# include the related document links in config file format 
+# strings.
+#-So once this related doc info has been included the user
+# can download both the pdf file (doc.pdf) and the related
+# document file for that particluar document (url.txt).
+#-perl amend_pdf.pl doc.pdf is then run in the command line
+# modifying the pdf document to the desired effect.  
+#bugs:
+#-cannot be run more than once on the same file
+#-doesn't make use of free objects (free objects
+# are quite unlikely though, I didn't come across
+# any while looking through pdfs)
+#-many other things I haven't bothered testing
+
+use Carp;
+use Getopt::Long;
+use PDF;
+
+$objects = 0;
+$offsets = 1;
+
+
+#for each command line argument add the outlines
+#contained in url.txt
+#foreach (@ARGV) {
+#    create_outlines($_); 
+#}
+
+if(defined $ARGV[0]){
+    $pdf_document = $ARGV[0];
+} else {
+    print STDERR "You must supply pdf document filename\n";
+    return;
+}
+if(defined $ARGV[1]){
+    $related_docs = $ARGV[1];
+} else {
+print STDERR "You must supply related document filename\n";
+return;
+}
+create_outlines($pdf_document); 
+
+exit(1);
+
+
+#this function first checks to see is the file is indeed
+#a pdf file - if not then exits. If it is a pdf then it
+#checks to see if it is encrypted. If it is then exits.
+#Next we check if the outlines dictionary exists in the
+#document catalog. 
+#-If the outline entry exists but there are no actual outlines
+# present then call add_outlines but pass on the existing
+# outline dictionary.
+#-otherwise call modify_outlines to modify the existing outline
+# structure to include new outlines.
+#If outlines dictionary doesn't exist call add_outlines.
+sub create_outlines {
+
+  my $filename = shift;
+
+  #parse pdf filename
+  my @filelist = split("/", $filename);
+  my $file = pop @filelist;
+
+  print STDERR "pdf file to be manipulated: $file\n";
+  print STDERR "pdf file to be saved: tmp_$file\n";
+
+  #make a copy of that file in this directory
+  print STDERR "cp $filename $file\n"; 
+  `cp $filename $file\n`; 
+  `cp $filename tmp_$file\n`; 
+
+  #create and parse a new 'pdf' object
+  my $PDFfile = PDF->new($file);  
+
+  #if it is a pdf file
+  if ($PDFfile->{"Header"}){
+
+      if($PDFfile->IscryptPDF){
+	  #an encrypted file so cannot continue with
+	  #adding the related doc outlines to it 
+	  print STDERR "file \"$file\" is encrypted \n"; 
+	  return;
+      }
+
+      #display some relevant information about the document
+      print STDERR "Author: ", $PDFfile->GetInfo ("Author"), "\n"; 
+      print STDERR "Title: ", $PDFfile->GetInfo ("Title"), "\n"; 
+      print STDERR "Subject: ", $PDFfile->GetInfo ("Subject"), "\n"; 
+      print STDERR "Updated: ", $PDFfile->{"Updated"}, "\n";
+     
+      #if the pdf document already includes an outline dictionary
+      if (defined $PDFfile->{"Catalog"}{"/Outlines"}) {
+
+	  #get the outline object from the indirect ref
+	  my $outline_data = $PDFfile->GetObject($PDFfile->{"Catalog"}{"/Outlines"});
+	  #obtain the number of existing outlines
+	  $PDFfile->{"Outlines"}{"/Count"} = $outline_data->{"/Count"};
+	  print STDERR "number of existing outlines: $PDFfile->{\"Outlines\"}{\"/Count\"}\n";
+
+	  #this means that the pdf file had an outline dictionary but
+	  #did not actually include any outlines.
+	  if($PDFfile->{"Outlines"}{"/Count"} == 0){
+	      #obtain object number of outline dictionary and pass to add_outlines
+	      my $dictionary = split(/\s/, $PDFfile->{"Catalog"}{"/Outlines"});
+	     
+	      add_outlines($PDFfile, $file, $dictionary);
+	  } else { 
+	      #collect other outline data to pass to modify_outlines
+	      $PDFfile->{"Outlines"}{"/First"} = $outline_data->{"/First"};
+	      $PDFfile->{"Outlines"}{"/Last"} = $outline_data->{"/Last"};
+
+	      #modify last outline entry
+	      modify_outlines($outline_data, $PDFfile, $file);
+	  }
+      } else { #there was no outline dictionary thus no outlines so add some
+	  print STDERR "no bookmarks in \"$file\" \n"; 
+	  add_outlines($PDFfile, $file, 0);
+      }
+  } else { #the file was not a pdf file
+      print STDERR "$file is not a pdf file!!\n"; 
+  }
+
+
+  #copy back the file we modified and the saved copy 
+  my $copypath = join("/", @filelist);
+  print STDERR "cp $file $filename\n"; 
+  print STDERR "cp tmp_$file $copypath/tmp_$file\n"; 
+  `cp $file $filename\n`; 
+  `cp tmp_$file $copypath/tmp_$file\n`; 
+
+  #remove the copy of that file in this directory
+  #print STDERR "rm $file\n"; 
+  `rm $file\n`;  
+  `rm tmp_$file\n`; 
+}
+
+
+#add_outlines function recieves following params
+#PDF file information, filename of pdf file, outline dictionary
+#(if outline dict. is 0 that means it must be created).
+#First the function decides if we are to create new dictionary
+#or not. Next read in the url file. Open up the pdf document.
+#Modify the catalog so that it includes the outline dictionary
+#(this is done even if the catalog doesn't need modifying 
+# so that the objects in the objects/offset table will not
+# be all mucked up when it comes time to write the xreference
+# table)
+#Then append outline dictionary to end of file (either modified
+#or created). Then append the top heirarchy related document
+#outline.  Then the new file url bookmarks. Call  xref_table
+#to write new xreference table. Call trailer to write new trailer.
+
+#table[0][0] - document catalog
+#table[0][1] - document catalog offset
+#table[1][0] - outline dictionary
+#table[1][1] - outline dictionary offset
+#table[2][0] - related document outline
+#table[2][1] - related document outline offset
+#table[3][0] etc - url outlines, read from file
+#table[3][1] etc - url outlines offset, read from file
+
+sub add_outlines (*\$){
+    
+ my $PDFfile = shift; 
+ my $file = shift; 
+
+ my @table;
+ $table[1][$objects] = shift;
+
+ #read in file of url's
+ my @urls = read_file(); 
+ my $url_num = $#urls + 1;
+ 
+ #if outline dictionary was not present in catalog
+ if ($table[1][$objects] == 0){ #get new object number for new dictionary
+     $table[1][$objects] = $PDFfile->{"Trailer"}{"/Size"}; #outline dictionary to be created
+     $table[2][$objects] = $table[1][$objects] + 1; #related document outline
+ } else { #else get object number for related doc outline to be appended
+     $table[2][$objects] = $PDFfile->{"Trailer"}{"/Size"}; #related document outline
+ }
+ 
+ #open up pdf file for appending
+ open(FILE, ">> $file") or croak "can't open $file: $!"; 
+ binmode \*FILE;
+ 
+ #obtain object number and offset for the document catalog
+ $table[0][$objects] = split(/\s/, $PDFfile->{"Trailer"}{"/Root"});
+ $table[0][$offsets] = tell \*FILE;
+
+ #print the modified or original catalog back to the file (appended)
+ print FILE "$table[0][$objects] 0 obj
+";
+ print FILE "<<
+";
+ print FILE "/Pages $PDFfile->{\"Catalog\"}{\"/Pages\"}
+";
+ print FILE "/Outlines $table[1][$objects] 0 R
+"; #only line actually added
+ print FILE "/Type /Catalog
+";
+ print FILE "/DefaultGray $PDFfile->{\"Catalog\"}{\"/DefaultGray\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/DefaultGray"}));
+ print FILE "/DefaultRGB $PDFfile->{\"Catalog\"}{\"/DefaultRGB\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/DefaultRGB"}));
+ print FILE "/PageLabels $PDFfile->{\"Catalog\"}{\"/PageLabels\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/PageLabels"}));
+ print FILE "/Names $PDFfile->{\"Catalog\"}{\"/Names\"}
+" 
+     if (defined ($PDFfile->{"Catalog"}{"/Names"}));
+ print FILE "/Dests $PDFfile->{\"Catalog\"}{\"/Dests\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/Dests"}));
+ print FILE "/ViewerPreferences $PDFfile->{\"Catalog\"}{\"/ViewerPreferences\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/ViewerPreferences"}));
+ print FILE "/PageLayout $PDFfile->{\"Catalog\"}{\"/PageLayout\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/PageLayout"}));
+ print FILE "/PageMode $PDFfile->{\"Catalog\"}{\"/PageMode\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/PageMode"}));
+ print FILE "/Threads $PDFfile->{\"Catalog\"}{\"/Threads\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/Threads"}));
+ print FILE "/OpenAction $PDFfile->{\"Catalog\"}{\"/OpenAction\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/OpenAction"}));
+ print FILE "/URI $PDFfile->{\"Catalog\"}{\"/URI\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/URI"}));
+ print FILE "/Acroform $PDFfile->{\"Catalog\"}{\"/Acroform\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/Acroform"}));
+ print FILE "/StructTreeRoot $PDFfile->{\"Catalog\"}{\"/StructTreeRoot\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/StructTreeRoot"}));
+ print FILE "/SpiderInfo $PDFfile->{\"Catalog\"}{\"/SpiderInfo\"}
+"
+     if (defined ($PDFfile->{"Catalog"}{"/SpiderInfo"}));
+ print FILE ">>
+";
+ print FILE "endobj
+";
+ 
+ #obtain offset for outline dictionary
+ $table[1][$offsets] = tell \*FILE;
+
+ #append newly created outline dictionary
+ print FILE "$table[1][$objects] 0 obj
+";
+ print FILE "<<
+";
+ print FILE "/Type /Outlines
+";
+ print FILE "/Count ", $url_num + 1, "
+";
+ print FILE "/First $table[2][$objects] 0 R
+";
+ print FILE "/Last $table[2][$objects] 0 R
+";
+ print FILE ">>
+";
+ print FILE "endobj
+";
+
+
+ #get the related document outline object num and offset
+ my $obj = $table[2][$objects]; 
+ $table[2][$offsets] = tell \*FILE;
+
+ #append the top heirarchy related document outline to file 
+ print FILE "$table[2][$objects] 0 obj
+";
+ print FILE "<<
+";
+ print FILE "/Title (Related Documents)
+";
+ print FILE "/Parent $table[1][$objects] 0 R
+";
+ print FILE "/Count ", $url_num, "
+";
+ print FILE "/First ", $obj + 1, " 0 R
+";
+ print FILE "/Last ", $table[2][$objects] + $url_num, " 0 R
+";
+ print FILE ">>
+";
+ print FILE "endobj
+";
+
+ my $ind = 3;
+ $obj++;
+
+ 
+ #store the object nums and offsets of the new related document
+ #outlines and write them to the file (must be outline with
+ #an action eg go to specific url)
+ for $i ( 0 .. $#urls ) {
+     $table[$ind][$offsets] = tell \*FILE; 
+     $table[$ind][$objects] = $obj; 
+     print FILE "$obj 0 obj
+";
+     print FILE "<<
+";
+     print FILE "/Title ($urls[$i][0])
+"; 
+     print FILE "/Parent $table[2][$objects] 0 R
+";
+     print FILE "/Next ", $obj + 1, " 0 R
+" if (($obj + 1) <= ($table[2][$objects] + $url_num)); 
+     print FILE "/Prev ", $obj - 1, " 0 R
+" if(($obj - 1) != ($table[2][$objects]));
+     print FILE "/A << /Type /Action
+";
+     print FILE "/S /URI
+"; 
+     print FILE "/URI ($urls[$i][1])
+"; 
+     print FILE ">>
+";
+     print FILE ">>
+";
+     print FILE "endobj
+";
+     $obj++;
+     $ind++; 
+ }
+
+
+ #append new X-reference table 
+ my $xref_offset = tell \*FILE;
+ xref_table(\*FILE, $url_num, @table);
+
+ #print trailer 
+ trailer(\*FILE, $PDFfile, $obj); 
+ print FILE "$xref_offset
+";
+ print FILE "%%EOF
+"; 
+
+ #close FILE;
+}
+
+#modify_outlines function recieves following params
+#PDF file information, outline data, pdf filename
+#First the function obtains the object data for the
+#last outline entry. Next read in the url file. 
+#Open up the pdf document.Then append the modified 
+#outline dictionary to end of file. Next append the
+#modified last outline.  Then append the 
+#top heirarchy related document outline.  Then the 
+#new file url bookmarks. Call  xref_table
+#to write new xreference table. 
+#Call trailer to write new trailer.
+
+#table[0][0] - outline dictionary
+#table[0][1] - outline dictionary offset
+#table[1][0] - last outline
+#table[1][1] - last outline offset
+#table[2][0] - related document outline
+#table[2][1] - related document outline offset
+#table[3][0] etc - url outlines, read from file
+#table[3][1] etc - url outlines offset, read from file
+
+sub modify_outlines (*\$){
+
+    my ($outline_data, $PDFfile, $file) = @_;
+
+    #collect the data for the last outline (which must be modified)
+    $PDFfile->{"Outlines"}{"/Last"} = $outline_data->{"/Last"};
+    my $last_data = $PDFfile->GetObject($PDFfile->{"Outlines"}{"/Last"});  
+
+    #read in file of url's
+    my @urls = read_file(); 
+    my $url_num = $#urls + 1;
+ 
+    my @table;
+
+    #This number is the number to use for the next created object
+    #eg the related doc heirarchy
+    $table[2][$objects] = $PDFfile->{"Trailer"}{"/Size"};
+  
+    #open up the pdf file for appending
+    open(FILE, ">> $file") or croak "can't open $file: $!"; 
+    binmode \*FILE;
+    
+    #store the object number and offset of the outline dictionary
+    $table[0][$objects] = split(/\s/, $PDFfile->{"Catalog"}{"/Outlines"});
+    $table[0][$offsets] = tell \*FILE;
+   
+    #write the outline dictionary back to the file (appending)
+    print FILE "$table[0][$objects] 0 obj
+";
+    print FILE "<<
+";
+    print FILE "/Type /Outlines
+";
+    print FILE "/Count ", $PDFfile->{"Outlines"}{"/Count"} + 1, "
+"
+	if (defined ($PDFfile->{"Outlines"}{"/Count"}));
+    print FILE "/First $PDFfile->{\"Outlines\"}{\"/First\"}
+"
+	if (defined ($PDFfile->{"Outlines"}{"/First"}));
+    print FILE "/Last $table[2][$objects] 0 R
+";
+    print FILE ">>
+";
+    print FILE "endobj
+";
+    
+    #store the last outline entry object num and file offset
+    my @last_entry = split(/\s/, $PDFfile->{"Outlines"}{"/Last"});
+    $table[1][$objects] = $last_entry[0]; 
+    $table[1][$offsets] = tell \*FILE; 
+
+    #append modified last outline entry
+    print FILE "$table[1][$objects] 0 obj
+";
+    print FILE "<<
+";
+    print FILE "/Title $last_data->{\"/Title\"}
+";
+    print FILE "/Dest $last_data->{\"/Dest\"}
+" if(defined $last_data->{"/Dest"});
+    print FILE "/Parent $last_data->{\"/Parent\"}
+";
+    print FILE "/Prev $last_data->{\"/Prev\"}
+";
+    print FILE "/Next $table[2][$objects] 0 R
+";
+    print FILE "/First $last_data->{\"/First\"}
+" if(defined $last_data->{"/First"});
+    print FILE "/Last $last_data->{\"/Last\"}
+" if(defined $last_data->{"/Last"});
+    print FILE "/Count $last_data->{\"/Count\"}
+"if(defined $last_data->{"/Count"});
+    print FILE "/A $last_data->{\"/A\"}
+" if(defined $last_data->{"/A"});
+    print FILE "/SE $last_data->{\"/SE\"}
+" if(defined $last_data->{"/SE"});
+    print FILE ">>
+";
+    print FILE "endobj
+";
+    
+    #store the object num and offset of the related
+    #document top level outline
+    my $obj = $table[2][$objects] + 1;
+    $table[2][$offsets] = tell \*FILE;
+
+    #append related document top level outline
+    print FILE "$table[2][$objects] 0 obj
+";
+    print FILE "<<
+";
+    print FILE "/Title (Related Documents)
+"; 
+    print FILE "/Parent $last_data->{\"/Parent\"}
+";
+    print FILE "/Count ", $url_num, "
+";
+    print FILE "/First $obj 0 R
+";
+    print FILE "/Last ", $table[2][$objects] + $url_num , " 0 R
+";
+    print FILE ">>
+";
+    print FILE "endobj
+";
+    
+   
+    my $ind = 3;
+
+    #store the object nums and offsets of the new related document
+    #outlines and write them to the file (must be outline with
+    #an action eg go to specific url)
+    for $i ( 0 .. $#urls ) { 
+	$table[$ind][$objects] = $obj;  
+	$table[$ind][$offsets] = tell \*FILE; 
+	print FILE "$obj 0 obj
+";
+	print FILE "<<
+";
+	print FILE "/Title ($urls[$i][0])
+"; 
+	print FILE "/Parent $table[2][$objects] 0 R
+";
+	print FILE "/Next ", $obj + 1, " 0 R
+" if (($obj + 1) <= ($table[2][$objects] + $url_num)); 
+	print FILE "/Prev ", $obj - 1, " 0 R
+" if (($obj - 1) != ($table[2][$objects]));
+	print FILE "/A << /Type /Action
+";
+	print FILE "/S /URI
+"; 
+	print FILE "/URI ($urls[$i][1])
+"; 
+	print FILE ">>
+";
+	print FILE ">>
+";
+	print FILE "endobj
+";
+	$obj++;
+	$ind++;
+    }
+    
+    #append new X-reference table
+    my $xref_offset = tell \*FILE;   
+    xref_table(\*FILE, $url_num, @table); 
+  
+    #print trailer  
+    trailer(\*FILE, $PDFfile, $obj);
+    print FILE "$xref_offset
+";
+    print FILE "%%EOF
+"; 
+
+    close FILE;
+
+}
+
+
+#This function reads a file 'url.txt' which contains
+#two columns of data in the following format:
+#related document title    related document url
+#each array of title, url is stored in an array
+#(to obtain the title of the first related  
+#document in the file)
+#eg table[1st related document][title] 
+#(to obtain the url of the second related 
+#document in the file)
+#eg table[2nd related document][url]
+#this table is then returned to the calling 
+#function.
+sub read_file {
+
+    #create two-dimensional array for urls
+    my @urls;
+
+    #open up url.txt to start reading
+    open(URL, "$related_docs") or croak "Can't open $related_docs: $!"; 
+
+    my $counter = 0;
+
+    #read in url.txt and store into the arry
+    while (<URL>){
+	chomp;
+	if(/([^\t]*)\t(.*)/){ 
+	    push @urls, [ split ]; #split on /s into arrays of arrays
+	}
+    }
+
+    close URL;
+
+    return (@urls);
+
+}
+
+ 
+#this function takes as parameters the filehandle
+#to the pdf document, the number of related documents
+#to this pdf doc and a table of object numbers and
+#their offsets. Using this information it writes
+#(appends) a new xreference table to the pdf 
+#document. 
+
+sub xref_table  (*\$) {
+    
+    my ($fd, $num, @table) = @_;
+    my $offset;
+
+    #print the new xref table (append to file)
+    print $fd "xref
+";
+    print $fd "0 1 
+";
+    print $fd "0000000000 65535 f 
+";
+    print $fd "$table[0][$objects] 1 
+";
+    $offset = '0'x(10-length($table[0][$offsets])).$table[0][$offsets];
+    print $fd "$offset 00000 n 
+";
+    print $fd "$table[1][$objects] 1 
+"; 
+    $offset = '0'x(10-length($table[1][$offsets])).$table[1][$offsets];
+    print $fd "$offset 00000 n 
+";
+    print $fd "$table[2][$objects] ", $num + 1, " 
+"; 
+    for $i ( 2 .. ($num + 2) ) { #add 2 on because already written 2 to file
+	$offset = '0'x(10-length($table[$i][$offsets])).$table[$i][$offsets];
+	print $fd "$offset 00000 n 
+";
+    }
+    
+}
+
+
+#This function recieves as parameters the filehandle
+#to the pdf document, parsed information about the
+#document and the new size (last object number + 1)
+#of the pdf file.  Using this information it appends
+#a new trailer to the end of the pdf document.
+
+sub trailer  (*\$) {
+
+    my ($fd, $PDFfile, $new_size) = @_;
+
+    #append the new trailer to the end of the file
+    print $fd "trailer
+";
+    print $fd "<<
+";
+    print $fd "/Size ", $new_size, "
+";
+    print $fd "/Root $PDFfile->{\"Trailer\"}{\"/Root\"}
+";
+    print $fd "/Info $PDFfile->{\"Trailer\"}{\"/Info\"}
+" 
+	if (defined ($PDFfile->{"Trailer"}{"/Info"}));
+    print $fd "/ID [$PDFfile->{\"Trailer\"}{\"/ID\"}[0]$PDFfile->{\"Trailer\"}{\"/ID\"}[1]]
+"
+	if (defined ($PDFfile->{"Trailer"}{"/ID"}));
+    print $fd "/Prev $PDFfile->{\"Last_XRef_Offset\"}
+";
+    print $fd "/Encrypt $PDFfile->{\"Trailer\"}{\"/Encrypt\"}
+"
+	if (defined ($PDFfile->{"Trailer"}{"/Encrypt"}));
+    print $fd ">>
+";
+    print $fd "startxref
+";
+   
+}
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/buildkpi.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/buildkpi.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/buildkpi.pl	(revision 21083)
@@ -0,0 +1,491 @@
+#! /user/bin/perl 
+
+#usage: perl buildkpi.pl [-R] [collection] [collection] etc
+#
+#-r or -R will remove previous index files so that you may build new ones
+#
+#The program performs the following tasks:
+#-gathers the specified collections on the command line OR
+#-gathers the directories of all the collections in the collect directory, this is all
+# the directories apart from CVS, modelcol, . and .. which are not collections.
+#-It then retrieves the archive.inf file from the archive directory of each collection
+# to obtain the unique file ID and filepath of every document in the collection
+#-Then parse through each doc.gml stored in filepath to gather information
+#-From each file collect kea phrases and/or stems
+#-Determine the number of kea phrases and stems for each document 
+#-Search for the kea phrases in the numbered phrase index. If a phrase is not there then 
+# the program will write the kea phrase to the phrase index . 
+#-Search for the kea phrases in the keyphrase to document index. If the phrase is there, 
+# it will increment the number of documents that the keyphrase appears in and replace that
+# then append the hash ID to the list of documents in the entry. If the phrase is not there 
+# then the program will write the kea phrase to the phrase index.
+#-Then write document ID, no of phrase, phrase number from index followed by number of times 
+# phrase appears into the document_keyphrase index
+
+$gsdlhome = $ENV{'GSDLHOME'};
+
+require "getopts.pl";
+&Getopts('R'); #process option arguments
+
+
+#collections may be specified in the command line
+#otherwise, all collections will be used to build
+#the indexes.  
+if(@ARGV){
+
+    @directories = @ARGV;
+
+} else { #open collect directory and get a list of all collections
+    opendir(DIR, "$gsdlhome/collect");
+    @directories = grep(!/(^\.|(CVS)|(modelcol))/, readdir(DIR));
+    closedir(DIR);
+}
+
+
+#directory to store indexes in using collection names
+$dirname = "";
+foreach $collection (sort @directories){
+    $dirname .= $collection."_";
+}
+$dirname .= "indexes";
+print STDERR "directory name: $dirname\n";
+
+#if option R remove all previous indexes
+if($opt_R == 1){ #remove indexes
+    print STDERR "\nremoving $gsdlhome/bin/script/indexes/$dirname/keyphrase_index.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt\n";
+    system("rm $gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt");   
+    system("rm $gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt"); 
+    system("rm $gsdlhome/bin/script/indexes/$dirname/keyphrase_index.txt");
+} 
+
+#create the new directory, display an error message if the directory
+#already exists.
+`mkdir --verbose $gsdlhome/bin/script/indexes/$dirname`;
+
+#for each collection specified to build indexes for
+foreach $collection (@directories){
+
+    print STDERR "\nBUILDING INDEXES FOR COLLECTION $collection\n\n";
+
+    my @filelist;
+
+    #archives.inf contains a list of unique hash ID's of each file and file paths
+    open(INFO, "$gsdlhome/collect/$collection/archives/archives.inf")
+	or die "$gsdlhome/collect/$collection/archives/archives.inf could not be opened.";
+
+    while(<INFO>){ #get each line of text from archives.inf (OID \t filepath)
+	chomp;
+	push(@filelist, $_);
+    }
+
+    foreach $file (@filelist){ #add each document to the indexes
+	build_index($file, $collection);
+    }
+}
+
+#This function opens the file in the filepath sent as an argument.  From this it obtains 
+#the kea and/or stem data, and then searches for these phrases in the file, counting and storing 
+#how many times each phrase appears. The data is then sent to function keyphrase_document 
+#with arguments hash ID, kea phrases and stem phrases to build the keyphrase_document index.
+#The function which builds the document_keyphrase index is then passed the hash ID, the kea 
+#phrases and/or the stemmed phrases and the array/s which hold the number of times each phrase
+#appears in the document so that the data it has collected can be written to document_ keyphrase
+#index.
+
+sub build_index {
+
+    my $args = shift(@_);
+    my $collection = shift(@_);
+    my ($ID, $filepath) = split(/\t/, $args);
+    my $keaS = "";
+    my $stemsS = "";
+    my @kea_phrase_counts = 0;
+    my @stem_phrase_counts = 0;
+    my $text = "";
+
+    print STDERR "\nID: $ID\n";
+    print STDERR "filepath: $filepath\n";
+
+    #open file to extract keyphrase information
+    open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+
+    #patterns to search for so that we can extract the kea information
+    my $kea_search = ".* kea=\"([^\"]*)\"";
+    my $stem_search = "stems=\"([^\"]*)\"";
+
+    while(<FILE>){ #get kea and stem data and store
+	chomp;
+	$keaS = $1 if (/$kea_search/);
+	$stemsS = $1 if (/$stem_search/);
+    }
+
+    close(FILE);
+    
+    print STDERR "Kea: $keaS\n";
+    print STDERR "stems: $stemsS\n";
+
+    my @kea = split(", ", $keaS);
+    my @stems = split(", ", $stemsS);
+
+    if(@kea && @stems){ #if the data exists
+	
+	#open the filepath to the current document
+	open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	    or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+	
+	while(<FILE>){ #get the text
+	    chomp;
+	    $text .= $_;
+	}
+ 
+	#chop out all things in angled brackets
+	$text =~ s/(<[^>]*>)//g;
+
+	#initilise counts
+	for($i=0; $i<=$#kea; $i++){
+	    $kea_phrase_counts[$i] = 0;
+	}
+	
+	for($i=0; $i<=$#stems; $i++){
+	    $stem_phrase_counts[$i] = 0;
+	}
+
+	print STDERR "counting number of kea phrases in document...\n";
+
+	#using regular expressions generated from kea-reg and stem-reg
+	#count how many of each phrase appear in the document
+	$text_copy = $text;
+	for($i=0; $i<=$#kea; $i++){ #search for text with kea phrases
+	    my $phrase = $kea[$i];
+	    $reg = &kea_reg(split(/\s+/, $phrase));
+	    while($text_copy =~ s/$reg//i){
+		$kea_phrase_counts[$i]++; #count the number of kea phrases 
+	    } 
+	    $text_copy = $text;
+	}  
+
+	print STDERR "counting number of stemmed phrases in document...\n";
+
+	$text_copy = $text;
+	for($i=0; $i<=$#stems; $i++){ #search for text with stem phrases
+	    my $stem = $stems[$i];
+	    $reg = &stem_reg(split(/\s+/, $stem));
+	    while($text_copy =~ s/$reg//i){
+		$stem_phrase_counts[$i]++; #count the number of stem phrases
+	    } 
+	    $text_copy = $text;
+	}
+
+	
+	#write data to keyphrase_document index
+	&keyphrase_document($ID, $keaS, $stemsS); 
+	
+	#write data to document_keyphrase index
+	$kea_counts = join(", ", @kea_phrase_counts);
+	$stem_counts = join(", ", @stem_phrase_counts);
+	&document_keyphrase($ID, $keaS, $stemsS, $kea_counts, $stem_counts);
+	
+    } else { 
+	print STDERR "No kea data was found in file $filepath\n";
+    }
+
+}
+
+#returns a regular expression designed to 
+#search for stems in text
+#eg 'agri cari'
+#    agri followed by 0 or more non-whitespace characters
+#         followed by one or more whitespace OR 0 or 1 non-whitespace characters
+#    cari followed by 0 or more non-whitespace characters
+#modified from original by Stephen Lundy 
+
+sub stem_reg {
+   
+    $regexp = "";
+
+    $l = @_;
+
+    if ($l > 0) {
+        $s = shift;
+        $regexp = "$s\\S*";
+
+        if ($l-1 > 0) {
+            foreach $s (@_) {
+                $regexp .= "(\\s+|\\S?)$s\\S*";
+            }
+        }
+    }
+
+    return $regexp;
+}
+
+#returns a regular expression designed to 
+#search for phrases in text
+#eg 'agris caris'
+#    agris followed by 0 or 1 non-whitespace characters OR
+#          followed by one or more whitespace 
+#    caris followed by 0 or 1 non-whitespace characters
+#modified from original by Stephen Lundy 
+
+sub kea_reg {
+    $regexp = "";
+
+    $l = @_;
+
+    if ($l > 0) {
+        $s = shift;
+        #$regexp = "$s(\\S?)";
+	$regexp = "$s(\\s+|\\S?)";
+
+        if ($l-1 > 0) {
+            foreach $s (@_) {
+                $regexp .= "$s(\\s+|\\S?)";
+            }
+        }
+    }
+
+    return $regexp;
+}
+
+
+#This function is passed as arguments a list of kea phrases and/or stems. Its purpose is to 
+#check in the keyphrase index file for each phrase and determine whether or not an entry has
+#been made for that phrase and an index number assigned to it. If there has not been an entry
+#made then an index number is assigned to the phrase and it is written to the file.  This 
+#function is called by document_keyphrase and keyphrase_document.  Each line in the file has
+#this form:
+#-phrase index number:phrase
+#This function then returns a table of pairs of the phrases that were sent as arguments to it
+#{phrase => phrase index number}.
+ 
+sub keyphrase_index_search {
+
+    my $phrases = shift(@_); 
+    my @phrases = split(", ", $phrases);
+    my %table;
+    my $index = 1;
+    my $create_new_index = 0;
+
+    print STDERR "searching keyphrase index...\n";
+
+    #initilise table of phrases and index numbers
+    foreach $phrase (@phrases){
+	$table{"$phrase"} = "0";
+    }
+
+    #open keyphrase index for appending data and for reading
+    open(INDEX_OUT, ">>$gsdlhome/bin/script/indexes/$dirname/keyphrase_index.txt");
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/$dirname/keyphrase_index.txt")
+	or $create_new_index = 1;
+
+    if($create_new_index == 0){
+	#if the index already exists read in the phrases
+	while(<INDEX_IN>){
+	    chomp;
+	    foreach $phrase (@phrases){
+		if(/(\d+):$phrase/){
+		    $index = $1;
+		    $table{"$phrase"} = "$index";
+		}
+	    }
+	    $index++; #new starting index (one + the last index)
+	}
+
+	close(INDEX_IN);
+
+    }
+
+    #add new phrases to the phrase index
+    foreach $phrase (keys %table){
+	if($table{"$phrase"} eq "0"){
+	    print INDEX_OUT "$index:$phrase\n";
+	    $table{"$phrase"} = "$index"; 
+	    $index++;
+	}
+    }
+
+    close(INDEX_OUT);
+    return %table;
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrases and/or stems
+#that exist for that particular file.  Its purpose is to write to the keyphrase_document
+#index a line for the document it has been sent:
+#-phrase index number:number of documents it appears in|ID
+sub keyphrase_document{
+
+    my ($ID, $kea, $stems) = @_;
+    my $text = ""; 
+    my @textlist;
+    my $create_new_index = 0;
+
+    print STDERR "writing to keyphrase_document.txt...\n";
+
+    #get table of phrases and phrase indexes 
+    my %table = keyphrase_index_search($kea.", ".$stems); 
+    
+  
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt")
+	or $create_new_index = 1;
+
+    #read in document if file exists
+    if($create_new_index == 0){
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    } 
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt");
+
+    if($create_new_index == 0){ #amend existing index
+	
+	foreach $line (@textlist){
+	    foreach $phrase (keys %table){
+		if($line =~ /(\d+):(\d+)(.*)/){ #all lines of this form
+		    $index = $1;
+		    if($table{"$phrase"} eq "$index") { #if phrase exists in index
+			$ids = $3; #get all doc IDs for that keyphrase
+			if($ids !~ /$ID/){ #if doc ID not already included
+			    $num_docs = $2;
+			    $num_docs++; #increment number of docs
+			    $line = "$index:$num_docs$3|$ID"; #line to append to index
+			    $table{"$phrase"} = "0"; 
+			}
+		    }
+		}
+	    }
+	    print INDEX_OUT "$line\n";
+	}
+    }
+
+    #add new phrases to the index
+    foreach $phrase (keys %table){ #write 'phrase index:1:file ID
+	if($table{"$phrase"} ne "0"){
+	    my $line = "$table{$phrase}:1:$ID";
+	    print INDEX_OUT "$line\n"; 
+	}
+    }
+
+    close(INDEX_OUT);
+
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrases and/or stems
+#that exist for that particular file and a list of the number of times each kea and/or stem
+#phrase appear in that document.  Its purpose is to write to the document_keyphrase
+#index a line for the document it has been sent:
+#-file ID:number of phrases and/or stems appear in the document
+#      |pairs of 'phrase index,number of times the phrase appears in the document' 
+sub document_keyphrase {
+
+    my ($ID, $keaS, $stemsS, $kea_c, $stem_c) = @_;
+    my $text = "";
+    my @textlist;
+    my %phrases;
+    my $create_new_index = 0;
+
+    print STDERR "writing to document_keyphrase.txt...\n";
+
+    #split phrase counts into arrays
+    my @kea_counts = split(", ", $kea_c);
+    my @stem_counts = split(", ", $stem_c);
+  
+    #get table of phrases and phrase indexes
+    my %table = keyphrase_index_search($keaS.", ".$stemsS);
+
+    #split phrases into arrays
+    my @kea = split(", ", $keaS);
+    my @stems = split(", ", $stemsS);
+
+    #build new phrases dictionary
+    for($i=0; $i<=$#kea; $i++){
+	my $phrase = $table{"$kea[$i]"};
+	if($kea_counts[$i] > 0){
+	    $phrases{"$phrase"} = "$kea_counts[$i]";
+	} else {
+	    $phrases{"$phrase"} = 1;
+	}
+    } 
+    for($i=0; $i<=$#stems; $i++){
+	my $phrase = $table{"$stems[$i]"};
+	if($stem_counts[$i] > 0){
+	    $phrases{"$phrase"} = "$stem_counts[$i]";
+	} else {
+	    $phrases{"$phrase"} = 1;
+	}
+    }   
+    my @num = keys %phrases;
+    my $phrasenum = $#num + 1; #number of phrases in doc
+
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt")
+	or $create_new_index = 1;
+
+     
+    if($create_new_index == 0){ #index doesn't need to be created
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+	
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    }  
+
+
+    #must write this line to the file
+    #document ID:num of phrases|phrase index, number of times phrases appears
+    my $newline = "$ID:$phrasenum";
+    foreach $phrase (keys %phrases){
+	$newline .= "|$phrase,$phrases{$phrase}";
+    }
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt");
+
+    if($create_new_index == 1){ #create a new index
+
+	print INDEX_OUT "$newline\n";
+
+    } else {
+
+	#if ID is already in the file write line overtop incase
+	#someone has modified the file.  Otherwise add the line
+	#to the end of the file
+	my $found = 0;
+
+	foreach $line (@textlist){
+	    if($line =~ /([^:]+):(.*)/){ #all lines should follow this pattern
+		$id = $1;
+		if($ID eq $id){ #id is already in the file
+		    print INDEX_OUT "$newline\n"; #print line overtop
+		    $found = 1;
+		} else {
+		    print INDEX_OUT "$line\n"; #print old line out
+		}
+	    }
+	}
+
+	print INDEX_OUT "$newline\n" if ($found == 0); #append new line to end of file 
+
+    }
+
+    close(INDEX_OUT);
+
+}
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/buildkpiK.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/buildkpiK.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/buildkpiK.pl	(revision 21083)
@@ -0,0 +1,411 @@
+#! /user/bin/perl 
+
+#usage: perl buildkpiK.pl [-R] [collection] [collection] etc
+#
+#-r or -R will remove previous index files so that you may build new ones
+#
+#The program performs the following tasks:
+#-gathers the specified collections on the command line OR
+#-gathers the directories of all the collections in the collect directory, this is all
+# the directories apart from CVS, modelcol, . and .. which are not collections.
+#-It then retrieves the archive.inf file from the archive directory of each collection
+# to obtain the unique file ID and filepath of every document in the collection
+#-Then parse through each doc.gml stored in filepath to gather information
+#-From each file collect kea phrases. 
+#-Determine the number of kea phrases for each document 
+#-Search for the kea phrases in the numbered phrase index. If a phrase is not there then 
+# the program will write the kea phrase to the phrase index . 
+#-Search for the kea phrases in the keyphrase to document index. If the phrase is there, 
+# it will increment the number of documents that the keyphrase appears in and replace that
+# then append the hash ID to the list of documents in the entry. If the phrase is not there 
+# then the program will write the kea phrase to the phrase index.
+#-Then write document ID, no of phrase, phrase number from index followed by number of times 
+# phrase appears into the document_keyphrase index
+
+$gsdlhome = $ENV{'GSDLHOME'};
+$collection;
+
+require "getopts.pl";
+&Getopts('R'); #process option arguments
+
+#if option R remove all previous indexes
+if($opt_R == 1){ #remove indexes
+    print STDERR "\nremoving $gsdlhome/bin/script/indexes/keyphrase_index.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/keyphrase_document.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/document_keyphrase.txt\n";
+    system("rm $gsdlhome/bin/script/indexes/keyphrase_document.txt");   
+    system("rm $gsdlhome/bin/script/indexes/document_keyphrase.txt"); 
+    system("rm $gsdlhome/bin/script/indexes/keyphrase_index.txt");
+}
+
+#collections may be specified in the command line
+#otherwise, all collections will be used to build
+#the indexes.  
+if(@ARGV){
+
+    @directories = @ARGV;
+
+} else { #open collect directory and get a list of all collections
+    opendir(DIR, "$gsdlhome/collect");
+    @directories = grep(!/(^\.|(CVS)|(modelcol))/, readdir(DIR));
+    closedir(DIR);
+}
+
+#for each collection specified to build indexes for
+foreach $collection (@directories){
+
+    my @filelist;
+
+    #archives.inf contains a list of unique hash ID's of each file and file paths
+    open(INFO, "$gsdlhome/collect/$collection/archives/archives.inf")
+	or die "$gsdlhome/collect/$collection/archives/archives.inf could not be opened.";
+
+    while(<INFO>){ #get each line of text from archives.inf (OID \t filepath)
+	chomp;
+	push(@filelist, $_);
+    }
+
+    foreach $file (@filelist){ #add each document to the indexes
+	build_index($file, $collection);
+    }
+}
+
+#This function opens the file in the filepath sent as an argument.  From this it obtains 
+#the kea data, and then searches for these phrases in the file, counting and storing 
+#how many times each phrase appears. The data is then sent to function keyphrase_document 
+#with arguments hash ID, kea phrases to build the keyphrase_document index.
+#The function which builds the document_keyphrase index is then passed the hash ID, the kea 
+#phrases and the array/s which hold the number of times each phrase
+#appears in the document so that the data it has collected can be written to document_ keyphrase
+#index.
+
+sub build_index {
+
+    my $args = shift(@_);
+    my $collection = shift(@_);
+    my ($ID, $filepath) = split(/\t/, $args);
+    my $keaS = "";
+    my @kea_phrase_counts = 0;
+    my $text = "";
+
+    print STDERR "\nID: $ID\n";
+    print STDERR "filepath: $filepath\n";
+
+    #open file to extract keyphrase information
+    open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+
+    #patterns to search for so that we can extract the kea information
+    my $kea_search = ".* kea=\"([^\"]*)\"";
+
+    while(<FILE>){ #get kea and stem data and store
+	chomp;
+	$keaS = $1 if (/$kea_search/);
+    }
+
+    close(FILE);
+    
+    print STDERR "Kea: $keaS\n";
+
+    my @kea = split(", ", $keaS);
+
+    if(@kea){ #if the data exists
+	
+	#open the filepath to the current document
+	open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	    or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+	
+	while(<FILE>){ #get the text
+	    chomp;
+	    $text .= $_;
+	}
+ 
+	#chop out all things in angled brackets
+	$text =~ s/(<[^>]*>)//g;
+
+	#initilise counts
+	for($i=0; $i<=$#kea; $i++){
+	    $kea_phrase_counts[$i] = 0;
+	}
+	
+	
+	#using regular expressions generated from kea-reg 
+	#count how many of each phrase appear in the document
+	$text_copy = $text;
+	for($i=0; $i<=$#kea; $i++){ #search for text with kea phrases
+	    my $phrase = $kea[$i];
+	    $reg = &kea_reg(split(/\s+/, $phrase));
+	    while($text_copy =~ s/$reg//i){
+		$kea_phrase_counts[$i]++; #count the number of kea phrases 
+	    } 
+	    $text_copy = $text;
+	}  
+	
+	#write data to keyphrase_document index
+	&keyphrase_document($ID, $keaS); 
+	
+	#write data to document_keyphrase index
+	$kea_counts = join(", ", @kea_phrase_counts);
+	&document_keyphrase($ID, $keaS, $kea_counts);
+	
+    } else { 
+	print STDERR "No kea data was found in file $filepath\n";
+    }
+
+}
+
+
+#returns a regular expression designed to 
+#search for phrases in text
+#eg 'agris caris'
+#    agris followed by 0 or 1 non-whitespace characters OR
+#          followed by one or more whitespace 
+#    caris followed by 0 or 1 non-whitespace characters
+#modified from original by Stephen Lundy 
+
+sub kea_reg {
+    $regexp = "";
+
+    $l = @_;
+
+    if ($l > 0) {
+        $s = shift;
+        #$regexp = "$s(\\S?)";
+	$regexp = "$s(\\s+|\\S?)";
+
+        if ($l-1 > 0) {
+            foreach $s (@_) {
+                $regexp .= "$s(\\s+|\\S?)";
+            }
+        }
+    }
+
+    return $regexp;
+}
+
+
+#This function is passed as arguments a list of kea phrases and/or stems. Its purpose is to 
+#check in the keyphrase index file for each phrase and determine whether or not an entry has
+#been made for that phrase and an index number assigned to it. If there has not been an entry
+#made then an index number is assigned to the phrase and it is written to the file.  This 
+#function is called by document_keyphrase and keyphrase_document.  Each line in the file has
+#this form:
+#-phrase index number:phrase
+#This function then returns a table of pairs of the phrases that were sent as arguments to it
+#{phrase => phrase index number}.
+ 
+sub keyphrase_index_search {
+
+    my $phrases = shift(@_);
+    my @phrases = split(", ", $phrases);
+    my %table;
+    my $index = 1;
+    my $create_new_index = 0;
+
+    print STDERR "searching keyphrase index...\n";
+
+    #initilise table of phrases and index numbers
+    foreach $phrase (@phrases){
+	$table{"$phrase"} = "0";
+    }
+
+    #open keyphrase index for appending data and for reading
+    open(INDEX_OUT, ">>$gsdlhome/bin/script/indexes/keyphrase_index.txt");
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/keyphrase_index.txt")
+	or $create_new_index = 1;
+
+    if($create_new_index == 0){
+	#if the index already exists read in the phrases
+	while(<INDEX_IN>){
+	    chomp;
+	    foreach $phrase (@phrases){
+		if(/(\d+):$phrase/){
+		    $index = $1;
+		    $table{"$phrase"} = "$index";
+		}
+	    }
+	    $index++; #new starting index (one + the last index)
+	}
+
+	close(INDEX_IN);
+
+    }
+
+    #add new phrases to the phrase index
+    foreach $phrase (keys %table){
+	if($table{"$phrase"} eq "0"){
+	    print INDEX_OUT "$index:$phrase\n";
+	    $table{"$phrase"} = "$index"; 
+	    $index++;
+	}
+    }
+
+    close(INDEX_OUT);
+    return %table;
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrases
+#that exist for that particular file.  Its purpose is to write to the keyphrase_document
+#index a line for the document it has been sent:
+#-phrase index number:number of documents it appears in|ID
+sub keyphrase_document{
+
+    my ($ID, $kea) = @_;
+    my $text = ""; 
+    my @textlist;
+    my $create_new_index = 0;
+
+    print STDERR "writing to keyphrase_document.txt...\n";
+
+    #get table of phrases and phrase indexes 
+    my %table = keyphrase_index_search($kea); 
+    
+  
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/keyphrase_document.txt")
+	or $create_new_index = 1;
+
+    #read in document if file exists
+    if($create_new_index == 0){
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    } 
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/keyphrase_document.txt");
+
+    if($create_new_index == 0){ #amend existing index
+	
+	foreach $line (@textlist){
+	    foreach $phrase (keys %table){
+		if($line =~ /(\d+):(\d+)(.*)/){ #all lines of this form
+		    $index = $1;
+		    if($table{"$phrase"} eq "$index") { #if phrase exists in index
+			$ids = $3; #get all doc IDs for that keyphrase
+			if($ids !~ /$ID/){ #if doc ID not already included
+			    $num_docs = $2;
+			    $num_docs++; #increment number of docs
+			    $line = "$index:$num_docs$3|$ID"; #line to append to index
+			    $table{"$phrase"} = "0"; 
+			}
+		    }
+		}
+	    }
+	    print INDEX_OUT "$line\n";
+	}
+    }
+
+    #add new phrases to the index
+    foreach $phrase (keys %table){ #write 'phrase index:1:file ID
+	if($table{"$phrase"} ne "0"){
+	    my $line = "$table{$phrase}:1:$ID";
+	    print INDEX_OUT "$line\n"; 
+	}
+    }
+
+    close(INDEX_OUT);
+
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrases and/or stems
+#that exist for that particular file and a list of the number of times each kea and/or stem
+#phrase appear in that document.  Its purpose is to write to the document_keyphrase
+#index a line for the document it has been sent:
+#-file ID:number of phrases and/or stems appear in the document
+#      |pairs of 'phrase index,number of times the phrase appears in the document' 
+sub document_keyphrase {
+
+    my ($ID, $keaS, $kea_c) = @_;
+    my $text = "";
+    my @textlist;
+    my %phrases;
+    my $create_new_index = 0;
+
+    print STDERR "writing to document_keyphrase.txt...\n";
+
+    #split phrase counts into arrays
+    my @kea_counts = split(", ", $kea_c);
+  
+    #get table of phrases and phrase indexes
+    my %table = keyphrase_index_search($keaS);
+
+    #split phrases into arrays
+    my @kea = split(", ", $keaS);
+
+    #build new phrases dictionary
+    for($i=0; $i<=$#kea; $i++){
+	my $phrase = $table{"$kea[$i]"};
+	$phrases{"$phrase"} = "$kea_counts[$i]";
+    } 
+   
+    my @num = keys %phrases;
+    my $phrasenum = $#num + 1; #number of phrases in doc
+
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/document_keyphrase.txt")
+	or $create_new_index = 1;
+
+     
+    if($create_new_index == 0){ #index doesn't need to be created
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+	
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    }  
+
+
+    #must write this line to the file
+    #'document ID:num of phrases|phrase index, number of times phrases appears
+    my $newline = "$ID:$phrasenum";
+    foreach $phrase (keys %phrases){
+	$newline .= "|$phrase,$phrases{$phrase}";
+    }
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/document_keyphrase.txt");
+
+    if($create_new_index == 1){ #create a new index
+
+	print INDEX_OUT "$newline\n";
+
+    } else {
+
+	#if ID is already in the file write line overtop incase
+	#someone has modified the file.  Otherwise add the line
+	#to the end of the file
+	my $found = 0;
+
+	foreach $line (@textlist){
+	    if($line =~ /([^:]+):(.*)/){ #all lines should follow this pattern
+		$id = $1;
+		if($ID eq $id){ #id is already in the file
+		    print INDEX_OUT "$newline\n"; #print line overtop
+		    $found = 1;
+		} else {
+		    print INDEX_OUT "$line\n"; #print old line out
+		}
+	    }
+	}
+
+	print INDEX_OUT "$newline\n" if ($found == 0); #append new line to end of file 
+
+    }
+
+    close(INDEX_OUT);
+
+}
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/buildkpiS.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/buildkpiS.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/buildkpiS.pl	(revision 21083)
@@ -0,0 +1,420 @@
+#! /user/bin/perl 
+
+#usage: perl buildkpiS.pl [-R] [collection] [collection] etc
+#
+#-r or -R will remove previous index files so that you may build new ones
+#
+#The program performs the following tasks:
+#-gathers the specified collections on the command line OR
+#-gathers the directories of all the collections in the collect directory, this is all
+# the directories apart from CVS, modelcol, . and .. which are not collections.
+#-It then retrieves the archive.inf file from the archive directory of each collection
+# to obtain the unique file ID and filepath of every document in the collection
+#-Then parse through each doc.gml stored in filepath to gather information
+#-From each file collect stems of kea keyphrases.
+#-Determine the number of keyphrase stems for each document 
+#-Search for the keyphrase stems in the numbered phrase index. If a phrase is not there then 
+# the program will write the keyphrase stem to the phrase index . 
+#-Search for the keyphrase stem in the keyphrase to document index. If the stem is there, 
+# it will increment the number of documents that the keyphrase stem appears in and replace that
+# then append the hash ID to the list of documents in the entry. If the stem is not there 
+# then the program will write the stem to the phrase index.
+#-Then write document ID, no of phrase, phrase number from index followed by number of times 
+# phrase appears into the document_keyphrase index
+
+$gsdlhome = $ENV{'GSDLHOME'};
+$collection;
+
+require "getopts.pl";
+&Getopts('R'); #process option arguments
+
+#if option R remove all previous indexes
+if($opt_R == 1){ #remove indexes
+    print STDERR "\nremoving $gsdlhome/bin/script/indexes/keyphrase_index.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/keyphrase_document.txt\n";
+    print STDERR "removing $gsdlhome/bin/script/indexes/document_keyphrase.txt\n";
+    system("rm $gsdlhome/bin/script/indexes/keyphrase_document.txt");   
+    system("rm $gsdlhome/bin/script/indexes/document_keyphrase.txt"); 
+    system("rm $gsdlhome/bin/script/indexes/keyphrase_index.txt");
+}
+
+#collections may be specified in the command line
+#otherwise, all collections will be used to build
+#the indexes.  
+if(@ARGV){
+
+    @directories = @ARGV;
+
+} else { #open collect directory and get a list of all collections
+    opendir(DIR, "$gsdlhome/collect");
+    @directories = grep(!/(^\.|(CVS)|(modelcol))/, readdir(DIR));
+    closedir(DIR);
+}
+
+#for each collection specified to build indexes for
+foreach $collection (@directories){
+
+    my @filelist;
+
+    #archives.inf contains a list of unique hash ID's of each file and file paths
+    open(INFO, "$gsdlhome/collect/$collection/archives/archives.inf")
+	or die "$gsdlhome/collect/$collection/archives/archives.inf could not be opened.";
+
+    while(<INFO>){ #get each line of text from archives.inf (OID \t filepath)
+	chomp;
+	push(@filelist, $_);
+    }
+
+    foreach $file (@filelist){ #add each document to the indexes
+	build_index($file, $collection);
+    }
+}
+
+#This function opens the file in the filepath sent as an argument.  From this it obtains 
+#the kea and/or stem data, and then searches for these phrases in the file, counting and storing 
+#how many times each phrase appears. The data is then sent to function keyphrase_document 
+#with arguments hash ID, kea phrases and stem phrases to build the keyphrase_document index.
+#The function which builds the document_keyphrase index is then passed the hash ID, the kea 
+#phrases and/or the stemmed phrases and the array/s which hold the number of times each phrase
+#appears in the document so that the data it has collected can be written to document_ keyphrase
+#index.
+
+sub build_index {
+
+    my $args = shift(@_);
+    my $collection = shift(@_);
+    my ($ID, $filepath) = split(/\t/, $args);
+    my $stemsS = "";
+    my @stem_phrase_counts = 0;
+    my $text = "";
+
+    print STDERR "\nID: $ID\n";
+    print STDERR "filepath: $filepath\n";
+
+    #open file to extract keyphrase information
+    open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+
+    #patterns to search for so that we can extract the kea information
+    my $stem_search = "stems=\"([^\"]*)\"";
+
+    while(<FILE>){ #get kea and stem data and store
+	chomp;
+	$stemsS = $1 if (/$stem_search/);
+    }
+
+    close(FILE);
+    
+    print STDERR "stems: $stemsS\n";
+
+    my @stems = split(", ", $stemsS);
+
+    if(@stems){ #if the data exists
+	
+	#open the filepath to the current document
+	open(FILE, "$gsdlhome/collect/$collection/archives/$filepath")
+	    or die "$gsdlhome/collect/$collection/archives/$filepath could not be opened.";
+	
+	while(<FILE>){ #get the text
+	    chomp;
+	    $text .= $_;
+	}
+ 
+	#chop out all things in angled brackets
+	$text =~ s/(<[^>]*>)//g;
+
+	#initilise counts
+	for($i=0; $i<=$#stems; $i++){
+	    $stem_phrase_counts[$i] = 0;
+	}
+	
+	#using regular expressions generated from stem-reg
+	#count how many of each phrase appear in the document
+	
+	$text_copy = $text;
+	for($i=0; $i<=$#stems; $i++){ #search for text with stem phrases
+	    my $stem = $stems[$i];
+	    $reg = &stem_reg(split(/\s+/, $stem));
+	    while($text_copy =~ s/$reg//i){
+		$stem_phrase_counts[$i]++; #count the number of stem phrases
+	    } 
+	    $text_copy = $text;
+	}
+
+	
+	#write data to keyphrase_document index
+	&keyphrase_document($ID, $stemsS); 
+	
+	#write data to document_keyphrase index
+	$stem_counts = join(", ", @stem_phrase_counts);
+	&document_keyphrase($ID, $stemsS, $stem_counts);
+	
+    } else { 
+	print STDERR "No stem data was found in file $filepath\n";
+    }
+
+}
+
+#returns a regular expression designed to 
+#search for stems in text
+#eg 'agri cari'
+#    agri followed by 0 or more non-whitespace characters
+#         followed by one or more whitespace OR 0 or 1 non-whitespace characters
+#    cari followed by 0 or more non-whitespace characters
+#modified from original by Stephen Lundy 
+
+sub stem_reg {
+   
+    $regexp = "";
+
+    $l = @_;
+
+    if ($l > 0) {
+        $s = shift;
+        $regexp = "$s\\S*";
+
+        if ($l-1 > 0) {
+            foreach $s (@_) {
+                $regexp .= "(\\s+|\\S?)$s\\S*";
+            }
+        }
+    }
+
+    return $regexp;
+}
+
+
+
+#This function is passed as arguments a list of kea phrase stems. Its purpose is to 
+#check in the keyphrase index file for each phrase and determine whether or not an entry has
+#been made for that phrase and an index number assigned to it. If there has not been an entry
+#made then an index number is assigned to the phrase and it is written to the file.  This 
+#function is called by document_keyphrase and keyphrase_document.  Each line in the file has
+#this form:
+#-phrase index number:phrase
+#This function then returns a table of pairs of the phrases that were sent as arguments to it
+#{phrase => phrase index number}.
+ 
+sub keyphrase_index_search {
+
+    my $phrases = shift(@_);
+    my @phrases = split(", ", $phrases);
+    my %table;
+    my $index = 1;
+    my $create_new_index = 0;
+
+    print STDERR "searching keyphrase index...\n";
+
+    #initilise table of phrases and index numbers
+    foreach $phrase (@phrases){
+	$table{"$phrase"} = "0";
+    }
+
+    #open keyphrase index for appending data and for reading
+    open(INDEX_OUT, ">>$gsdlhome/bin/script/indexes/keyphrase_index.txt");
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/keyphrase_index.txt")
+	or $create_new_index = 1;
+
+    if($create_new_index == 0){
+	#if the index already exists read in the phrases
+	while(<INDEX_IN>){
+	    chomp;
+	    foreach $phrase (@phrases){
+		if(/(\d+):$phrase/){
+		    $index = $1;
+		    $table{"$phrase"} = "$index";
+		}
+	    }
+	    $index++; #new starting index (one + the last index)
+	}
+
+	close(INDEX_IN);
+
+    }
+
+    #add new phrases to the phrase index
+    foreach $phrase (keys %table){
+	if($table{"$phrase"} eq "0"){
+	    print INDEX_OUT "$index:$phrase\n";
+	    $table{"$phrase"} = "$index"; 
+	    $index++;
+	}
+    }
+
+    close(INDEX_OUT);
+    return %table;
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrases and/or stems
+#that exist for that particular file.  Its purpose is to write to the keyphrase_document
+#index a line for the document it has been sent:
+#-phrase index number:number of documents it appears in|ID
+sub keyphrase_document{
+
+    my ($ID, $stems) = @_;
+    my $text = ""; 
+    my @textlist;
+    my $create_new_index = 0;
+
+    print STDERR "writing to keyphrase_document.txt...\n";
+
+    #get table of phrases and phrase indexes 
+    my %table = keyphrase_index_search($stems); 
+    
+  
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/keyphrase_document.txt")
+	or $create_new_index = 1;
+
+    #read in document if file exists
+    if($create_new_index == 0){
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    } 
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/keyphrase_document.txt");
+
+    if($create_new_index == 0){ #amend existing index
+	
+	foreach $line (@textlist){
+	    foreach $phrase (keys %table){
+		if($line =~ /(\d+):(\d+)(.*)/){ #all lines of this form
+		    $index = $1;
+		    if($table{"$phrase"} eq "$index") { #if phrase exists in index
+			$ids = $3; #get all doc IDs for that keyphrase
+			if($ids !~ /$ID/){ #if doc ID not already included
+			    $num_docs = $2;
+			    $num_docs++; #increment number of docs
+			    $line = "$index:$num_docs$3|$ID"; #line to append to index
+			    $table{"$phrase"} = "0"; 
+			}
+		    }
+		}
+	    }
+	    print INDEX_OUT "$line\n";
+	}
+    }
+
+    #add new phrases to the index
+    foreach $phrase (keys %table){ #write 'phrase index:1:file ID
+	if($table{"$phrase"} ne "0"){
+	    my $line = "$table{$phrase}:1:$ID";
+	    print INDEX_OUT "$line\n"; 
+	}
+    }
+
+    close(INDEX_OUT);
+
+}
+
+#This function is passed as arguments file hash ID and a list of kea phrase stems
+#that exist for that particular file and a list of the number of times each stem
+#phrase appear in that document.  Its purpose is to write to the document_keyphrase
+#index a line for the document it has been sent:
+#-file ID:number of phrases and/or stems appear in the document
+#      |pairs of 'phrase index,number of times the phrase appears in the document' 
+sub document_keyphrase {
+
+    my ($ID, $stemsS, $stem_c) = @_;
+    my $text = "";
+    my @textlist;
+    my %phrases;
+    my $create_new_index = 0;
+
+    print STDERR "writing to document_keyphrase.txt...\n";
+
+    #split phrase counts into arrays
+    my @stem_counts = split(", ", $stem_c);
+  
+    #get table of phrases and phrase indexes
+    my %table = keyphrase_index_search($stemsS);
+
+    #split phrases into arrays
+    my @stems = split(", ", $stemsS);
+
+    #build new phrases dictionary
+    for($i=0; $i<=$#stems; $i++){
+	my $phrase = $table{"$stems[$i]"};
+	$phrases{"$phrase"} = "$stem_counts[$i]";
+    }   
+    my @num = keys %phrases;
+    my $phrasenum = $#num + 1; #number of phrases in doc
+
+    #open index for reading
+    open(INDEX_IN, "$gsdlhome/bin/script/indexes/document_keyphrase.txt")
+	or $create_new_index = 1;
+
+     
+    if($create_new_index == 0){ #index doesn't need to be created
+
+	while(<INDEX_IN>){
+	    $text .= $_;
+	}
+
+	close(INDEX_IN);
+	
+	#split text into lines
+	@textlist = split(/\n/, $text);
+
+    }  
+
+
+    #must write this line to the file
+    #'document ID:num of phrases|phrase index, number of times phrases appears
+    my $newline = "$ID:$phrasenum";
+    foreach $phrase (keys %phrases){
+	$newline .= "|$phrase,$phrases{$phrase}";
+    }
+
+    #open index for output
+    open(INDEX_OUT, ">$gsdlhome/bin/script/indexes/document_keyphrase.txt");
+
+    if($create_new_index == 1){ #create a new index
+
+	print INDEX_OUT "$newline\n";
+
+    } else {
+
+	#if ID is already in the file write line overtop incase
+	#someone has modified the file.  Otherwise add the line
+	#to the end of the file
+	my $found = 0;
+
+	foreach $line (@textlist){
+	    if($line =~ /([^:]+):(.*)/){ #all lines should follow this pattern
+		$id = $1;
+		if($ID eq $id){ #id is already in the file
+		    print INDEX_OUT "$newline\n"; #print line overtop
+		    $found = 1;
+		} else {
+		    print INDEX_OUT "$line\n"; #print old line out
+		}
+	    }
+	}
+
+	print INDEX_OUT "$newline\n" if ($found == 0); #append new line to end of file 
+
+    }
+
+    close(INDEX_OUT);
+
+}
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/indexes/relation.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/indexes/relation.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/indexes/relation.pl	(revision 21083)
@@ -0,0 +1,414 @@
+#!/usr/bin/perl
+
+#data structures used:
+#-document_keyphrase
+#%document_phrases = ("hashID" => {"phrase" => "number of occurrences"})
+#-keyphrase_document 
+#%phrases_document = ("phrase" => "no. of docs phrase occurs in")
+
+#after calculation relational data, it will amend gml files
+#to include this data while writing to a file ID_relatedlinks.txt
+#the html links of the related files
+#if option p is set then the user wishes to add the related documents
+#as bookmarks to the pdf file
+
+require "getopts.pl";
+&Getopts('N:P'); #process option arguments
+
+
+$gsdlhome = $ENV{'GSDLHOME'};
+@directories; #list of directories for the collections
+%phrases_document; #hash storing phrase index => no. of documents with phrase in it
+%document_phrases; #hash of hashes ID => {phrase number => no. of phrases in ID}
+$N = 0; #number of documents in the index (presumably in the collection)
+%cosine_matrix; #2-dimensional matrix, for each pair of documents stores a cosine measure
+$number_of_files = 1; #by default the top related file is returned
+$do_pdfs = 0;
+
+if($opt_N =~ /(\d)+/){ #if flag is set then return top N docs
+    $number_of_files = $opt_N;
+}
+
+#get server name and httpprefix
+$httpprefix;
+$servername = "nzdl2.cs.waikato.ac.nz"; #should be localhost
+
+if($opt_P == 1){ #if flag is set 
+    $do_pdfs = 1;
+    
+    #get the httpprefix from gsdlsite.cfg
+    open(CFG, "$gsdlhome/cgi-bin/gsdlsite.cfg") 
+	or die "$gsdlhome/cgi-bin/gsdlsite.cfg could not be opened";
+    
+    while(<CFG>){
+	chomp;
+	if(/httpprefix \/(.+)/){
+	    $httpprefix = $1; 
+	}
+    }
+    close CFG;
+}
+
+if(@ARGV){
+
+    @directories = @ARGV;
+
+} else { #open collect directory and get a list of all collections
+    opendir(DIR, "$gsdlhome/collect");
+    @directories = grep(!/(^\.|(CVS)|(modelcol))/, readdir(DIR));
+    closedir(DIR);
+}
+
+
+
+#get the name of the directory the index will be stored in
+$dirname = "";
+foreach $collection (sort @directories){
+    $dirname .= $collection."_";
+}
+$dirname .= "indexes";
+print STDERR "directory name: $dirname\n";
+
+#open keyphrases_document.txt
+open(KEY_FILE, "$gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt") 
+    or die "$gsdlhome/bin/script/indexes/$dirname/keyphrase_document.txt could not be opened";
+
+print STDERR "\nreading keyphrase_document.txt...\n";
+
+#read a list of phrase indexes and number of documents that phrase appears in 
+while(<KEY_FILE>){
+    chomp;
+    if(/(\d+)\:(\d+)(.*)/){ #all lines should be of this form
+	my $phrase_index = $1;
+	my $doc_num = $2;
+	$phrases_document{"$phrase_index"} = "$doc_num"; #build keyphrase hash
+    }
+}
+
+close(KEY_FILE); 
+
+print STDERR "\nreading document_keyphrase.txt...\n";
+
+#open document_keyphrases.txt
+open(DOC_FILE, "$gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt") 
+    or die "$gsdlhome/bin/script/indexes/$dirname/document_keyphrase.txt could not be opened";
+
+#read a list of documents and the phrases that appear in them (& how many times they appear)
+while(<DOC_FILE>){
+    chomp;
+    my %document;
+    if(/(\w+)\:(\d+)((\|\d+,\d+)+)/){ #every line in the index of this form
+	my $ID = $1;
+	my $pairs = $3;
+	while ($pairs =~ s/\|(\d+),(\d+)//) { #this is the list of keyphrases and numbers
+	    my $phrase_index = $1;
+	    my $num_phrase = $2;
+	    $document{"$phrase_index"} = "$num_phrase"; #table to be stored in another table
+	}
+	$document_phrases{"$ID"} = ({%document});	  
+	$N++; #number of documents in the collection (which have kea metadata)
+    }
+}
+
+close(DOC_FILE);
+ 
+#we do not want to recalculate measures ie if we have already calculated
+#doc1 & doc2 we do not then want to calculate doc2 & doc1
+#to achieve this we must first sort the list of ids so that both lists
+#of documents will be in the same order (otherwise hash tables return values in 
+#no particular order). We then compare each document in the left 
+#column below against the documents in the right column:
+
+#doc0 -> 
+#doc1 -> doc0 
+#doc2 -> doc0, doc 1 
+#doc3 -> doc0, doc 1, doc 2 
+#doc4 -> doc0, doc 1, doc 2, doc 3 
+#doc5 -> doc0, doc 1, doc 2, doc 3, doc 4 
+#etc
+
+#this way we are not recalculating the same value and also not
+#comparing each document to itself (which would result in the
+#value 1) thus more than halving the processing time.
+
+print STDERR "\ncalculating cosine measures for $N documents...\n";
+
+$count = 0;
+@ids = sort keys(%document_phrases);
+
+#repeat for all pairs of documents
+foreach $id1 (sort keys(%document_phrases)) { 
+    my %table;
+   
+    for($i=0; $i<$count; $i++){ #calculate the cosine measure and store
+	my $cosine_measure = &compare_docs($id1, $ids[$i]); 
+	$table{"$ids[$i]"} = "$cosine_measure";  	
+    }
+    $cosine_matrix{"$id1"} = ({%table});
+    $count++; #each iteration the number of documents to compare against expands by 1
+}
+
+&addtogml(); #add the relational data we have just gathered to the documents gml files
+
+   
+#this function takes as an argument two document IDs and uses these to extract the
+#keyphrases from the document_keyphrase data structure.  It then calculates a 
+#'measure of relativity' [0-1] with which we can establish how similar the two
+#documents are to each other. (0-not related, 1-same document).  The equation 
+#used to establish this similarity:
+#
+#                     for all phrases 
+#                     in both d1, d2 (fd1p * loge(N/fp) (fd2p * loge(N/fp) 
+#  cosine(d1, d2) = --------------------------------------------------------------
+#                     sqrt(sum of phrases in d1(fd1p * loge(N/fp))) * 
+#                     sqrt(sum of phrases in d2(fd2p * loge(N/fp))) 
+#
+#where d1 and d2 are lists of keyphrase and represent documents
+#fd1p is the frequency that phrase p occurs in document d1
+#fd2p is the frequency that phrase p occurs in document d2
+#fp is the number of documents that have p as a keyphrase
+#N is the number of documents in the collection 
+sub compare_docs {
+
+  
+    my $ID1 = shift(@_); #ID for document one 
+    my $ID2 = shift(@_); #ID for document two
+  
+    my @phrases; #a list of phrases in document 1 and document 2
+    my @phrases1; #a list of phrases in document 1
+    my @phrases2; #a list of phrases in document 2
+    
+    
+    foreach $phrase (keys %{ $document_phrases{$ID1}}) { #list of phrases in doc1
+	push(@phrases1, $phrase);
+    } 
+    foreach $phrase (keys %{ $document_phrases{$ID2}}) { #list of phrases in doc2
+	push(@phrases2, $phrase);
+    }
+    foreach $phrase1 (@phrases1) { #list holds intersection of doc1 and doc2
+	foreach $phrase2 (@phrases2) {
+	    push(@phrases, $phrase1) if ($phrase1 == $phrase2);
+	}
+    }
+ 
+#COSINE MEASURE
+    my $wqtwdt= 0; 
+   
+    foreach $phrase (@phrases){ #for all phrases ocurring in d1 and d2
+	#the frequency that phrase occurs in document d1
+	$fd1p = $document_phrases{$ID1}{$phrase}; 
+	
+	#log base e(N/the number of documents that have phrase as a keyphrase)
+	$log_freq = log($N/$phrases_document{$phrase});
+	
+	#the frequency that phrase occurs in document d2
+	$fd2p = $document_phrases{$ID2}{$phrase};
+	$sum = ($fd1p * $log_freq) * ($fd2p * $log_freq);
+	$wqtwdt += $sum;
+    }
+  
+   
+    my $wd = 0; #stores the calculation for wd
+
+    foreach $phrase (@phrases1){ #for all phrases ocurring in d1 and d2
+	#the frequency that phrase occurs in document d1
+	$fd1p = $document_phrases{$ID1}{$phrase};
+	
+	#log base e($N/the number of documents that have phrase as a keyphrase)
+	$log_freq = log($N/$phrases_document{$phrase});
+	$sum = $fd1p * $log_freq;
+	$wd += ($sum * $sum); #sum squared
+    }
+
+   
+    my $wq = 0; #stores the calculation for wq
+ 
+    foreach $phrase (@phrases2){ #for all phrases ocurring in d2
+	#the frequency that phrase occurs in document d2
+	$fd2p = $document_phrases{$ID2}{$phrase};
+
+	#log base e($N/the number of documents that have phrase as a keyphrase)
+	$log_freq = log($N/$phrases_document{$phrase});
+	$sum = $fd2p * $log_freq;
+	$wq += ($sum * $sum); #sum squared 
+    }
+   
+    my $wdwq = sqrt($wq)  * sqrt($wd);  
+    my $cosine = $wqtwdt / $wdwq;
+    
+    return $cosine;
+	
+}
+   
+#this function adds the relational data we have collected to the gml files
+sub addtogml {
+
+ print STDERR "\nadding relational data to $N gml documents...\n\n";
+ my @doclist;
+ my %filetable;
+ my $pattern = "kea="; #pattern to search for to find where to insert relation data
+
+ #open archive info for each collecticollection
+ foreach $collection (@directories){
+
+     open(INFO, "$gsdlhome/collect/$collection/archives/archives.inf") 
+	 or die "$gsdlhome/collect/$collection/archives/archives.inf could not be opened";
+     
+     #read a list of ID's and pathnames into a file table
+     while(<INFO>){
+	 chomp;
+	 my %idtable;
+	 my $ID;
+	 if(/(\w+)(\s+)([\w\.\/]+)/){ #format of the line
+	     $ID = $1;
+	     $path = $3;
+	     $idtable{"$path"} = "$collection";
+	 }
+	 $filetable{"$ID"} = ({%idtable});
+     } 
+  
+     close(INFO);
+ }
+
+ 
+
+ #for each id in the matrix calculate a list of related documents
+ foreach $id (keys %cosine_matrix){    
+    
+     @doclist = &calculate_list($id); #gets list of documents with most relevant scores
+
+     my @path = keys %{$filetable{$id}}; #get filepath for document
+     my $collection = $filetable{$id}{$path[0]};
+     
+     #open gml file to amend for each collection
+     open(FILE, "$gsdlhome/collect/$collection/archives/$path[0]") 
+	 or die "$gsdlhome/collect/$collection/archives/$path[0] could not be opened";
+     
+     #read the gml file into text
+     $text = ""; 
+     while(<FILE>){
+	 $text .= $_;
+     }
+     
+     close(FILE);
+     
+     #delete previous relational data and urllinks to files storing rel doc links
+     $text =~ s/(\s)+relation=\"([^\"]*)\"//g;
+     $text =~ s/(\s)+urllink=\"([^\"]*)\"//g;
+     $text =~ s/(\s)+\/urllink=\"([^\"]*)\"//g;
+     
+     #if we want to insert each relation item as 'relation1="id" relation2="id"'
+     #$count = 1; #insert each item in the list
+     #foreach $item (@doclist){ #insert list into text
+     #	 $text =~ s/(\s)($pattern)/ relation$count=\"$item\" $2/g;
+     #	 $count++;
+     #} 
+     
+     #or relation="id, id, id"
+     #my $relation = join(",", @doclist);
+
+     #if pdf flag is set then delete pdf url document
+     if($do_pdfs == 1){ 
+	 my $dirpath = $path[0];
+	 $dirpath =~ s/(^(\/doc\.gml))*\/doc\.(gml)/$1/;
+ 	 `rm $gsdlhome/collect/$collection/index/assoc/$dirpath/url.txt`; 
+     }
+
+     my $title = "related document";
+     $title = $2 if($text =~ /(\s)+Title=\"([^\"]*)\"/g);
+   
+     #relation="collection,id collection,id"
+     my @relationlist;
+     my $relation = "";
+     foreach $doc (@doclist){
+	 my @p = keys %{$filetable{$doc}};
+	 my $collect = $filetable{$doc}{$p[0]};
+	 push(@relationlist, "$collect,$doc");
+
+	 #write pdf docs to file
+	 if($do_pdfs == 1){
+	     my @rel_path = keys %{$filetable{$doc}};
+	     &write_related_urls($title, $collection, $path[0], $collect, $rel_path[0]);
+	 }
+     }
+  
+     #modify the text to include relation data
+     $relation = join(" ", @relationlist); 
+     $text =~ s/($pattern)/ relation=\"$relation\" $1/g;
+
+     #open gml file to write back new text
+     open(FILE, ">$gsdlhome/collect/$collection/archives/$path[0]") or print STDERR "NO!!!!\n";
+     print FILE "$text"; #write back text
+     close(FILE);
+
+     #amend the pdf file 
+     if($do_pdfs == 1){
+	 my $pdf_path = $path[0];
+	 $pdf_path =~ s/(^(\/doc\.gml))*\/doc\.(gml)/$1/;
+	 `perl amend_pdf.pl $gsdlhome/collect/$collection/index/assoc/$pdf_path/doc.pdf $gsdlhome/collect/$collection/index/assoc/$pdf_path/url.txt\n`;
+     }
+ } 
+}
+
+#this function builds a list of cosine measures for each
+#document and sorts the list of ids each measure belongs to
+#in reverse order (ie docs with greatest cosine measure first)
+#returns the list calculated
+sub calculate_list {
+   
+    my $document = shift(@_);
+    my %measures;
+    my @doclist;
+    
+    
+    #find the top $number_of_files for $document  
+    foreach $id (keys %{$cosine_matrix{$document}}){ 
+	    $measures{"$cosine_matrix{$document}{$id}"} = "$id";
+    }
+    
+    my @list = reverse sort {$a<=>$b} keys %measures;
+
+    #list is as big as specified in command line (default is 1)
+    for($i = 0; $i<$number_of_files; $i++){ 
+	my $id = $measures{$list[$i]};
+	push(@doclist, $id) if($id ne "");
+    }
+
+    return @doclist;
+}
+
+
+sub write_related_urls {
+
+    
+ #need server name eg nzdl2.cs.waikato.ac.nz
+ #localhost should work but doesn't on this computer?
+ #open up config file to read httpprefix
+ #get collection name of related document
+ #get hash directory of related document
+ #write http://nzdl2.cs.waikato.ac.nz/httpprefix/collectionname/index/assoc/directory/doc.pdf
+
+ my ($title, $collection, $path, $collect, $rel_path) = @_;
+
+ $rel_path =~ s/(^(\/doc\.gml))*\/doc\.(gml)/$1/;
+ $path =~ s/(^(\/doc\.gml))*\/doc\.(gml)/$1/;
+ 
+ print STDERR "writing related pdf urls to file ";
+ print STDERR "$gsdlhome/collect/$collection/index/assoc/$path/url.txt...\n";
+ 
+ open(URL, ">>$gsdlhome/collect/$collection/index/assoc/$path/url.txt") 
+     or open(URL, ">$gsdlhome/collect/$collection/index/assoc/$path/url.txt")
+	 or print STDERR "This file $title is not a pdf file\n";
+
+ print URL "$title\t"; 
+ print URL "http://$servername/$httpprefix/collect/$collect/index/assoc/$rel_path/doc.pdf\n";
+ close URL;
+
+}
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/makemapfile.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/makemapfile.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/makemapfile.pl	(revision 21083)
@@ -0,0 +1,188 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# makemapfile.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use util;
+
+# %translations is of the form:
+#
+# encodings{encodingname-encodingname}->blocktranslation
+# blocktranslation->[[0-255],[256-511], ..., [65280-65535]]
+#
+# Any of the top translation blocks can point to an undefined
+# value. This data structure aims to allow fast translation and 
+# efficient storage.
+%translations = ();
+
+# @array256 is used for initialisation, there must be
+# a better way...
+@array256 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+
+&main();
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "makemapfile.pl: Creates unicode map (.ump) files from plain\n";
+    print STDERR "                text code pages.\n\n";
+    print STDERR "  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -encoding name\n";
+    print STDERR "   -mapfile  text file from which to create binary ump file\n\n";
+}
+
+sub main {
+    if (!parsargv::parse(\@ARGV, 
+			 'encoding/.+', \$encoding,
+			 'mapfile/.+', \$mapfile)) {
+	&print_usage();
+	die "\n";
+    }
+
+    if (!&loadencoding ($encoding, $mapfile)) {
+	die "couldn't load encoding $encoding";
+    }
+
+    # write out map files
+    &writemapfile ("$encoding-unicode", $encoding, 1);
+    &writemapfile ("unicode-$encoding", $encoding, 0);
+}
+
+sub writemapfile {
+    my ($encoding, $filename, $tounicode) = @_;
+
+    $filename .= ".ump"; # unicode map file
+    if ($tounicode) {
+	$filename = &util::filename_cat ($ENV{'GSDLHOME'}, "mappings", "to_uc", $filename);
+    } else {
+	$filename = &util::filename_cat ($ENV{'GSDLHOME'}, "mappings", "from_uc", $filename);
+    }
+
+    die "translation not defined" if (!defined $translations{$encoding});
+    my $block = $translations{$encoding};
+
+    print "writing $filename\n";
+    open (MAPFILE, ">" . $filename) || die;
+    binmode (MAPFILE);
+
+    my ($i, $j);
+    for ($i=0; $i<256; $i++) {
+	if (ref ($block->[$i]) eq "ARRAY") {
+	    print MAPFILE pack ("C", $i);
+	    for ($j=0; $j<256; $j++) {
+		# unsigned short in network order
+		print MAPFILE pack ("CC", int($block->[$i]->[$j] / 256), 
+				    $block->[$i]->[$j] % 256);
+	    }
+	}
+    }
+    close (MAPFILE);
+}
+
+# loadencoding expects the mapfile to contain (at least) two
+# tab-separated fields. The first field is the mapped value
+# and the second field is the unicode value.
+#
+# It returns 1 if successful, 0 if unsuccessful
+sub loadencoding {
+    my ($encoding, $mapfile) = @_;
+    
+    my $to = "$encoding-unicode";
+    my $from = "unicode-$encoding";
+
+    # check to see if the encoding has already been loaded
+    if (defined $translations{$to} && defined $translations{$from}) {
+	return 1;
+    }
+
+    return 0 unless open (MAPFILE, $mapfile);
+
+    my ($line, @line);
+    $translations{$to} = [@array256];
+    $translations{$from} = [@array256];
+    while (defined ($line = <MAPFILE>)) {
+	chomp $line;
+	# remove comments
+	$line =~ s/\#.*$//;
+	next unless $line =~ /\S/;
+
+	# split the line into fields and do a few
+	# simple sanity checks
+	@line = split (/\t/, $line);
+	next unless (scalar(@line) >= 2 &&
+		     $line[0] =~ /^0x/ &&
+		     $line[1] =~ /^0x/);
+
+	my $char = hex($line[0]);
+	my $unic = hex($line[1]);
+
+	# might need this for some versions of gb but not gbk
+#	$char = $char | 0x8080 unless ($encoding =~ /gbk/i);
+
+	&addchartrans ($translations{$to}, $char, $unic);
+	&addchartrans ($translations{$from}, $unic, $char);
+    }
+
+    close (MAPFILE);
+
+    return 1;
+}
+
+# addchartrans adds one character translation to a translation block.
+# It also simplifies the translation block if possible.
+sub addchartrans {
+    my ($block, $from, $to) = @_;
+    my $i = 0;
+
+    my $high = ($from / 256) % 256;
+    my $low = $from % 256;
+
+    if (ref ($block->[$high]) ne "ARRAY") {
+	$block->[$high] = [@array256];
+    }
+    $block->[$high]->[$low] = $to;
+}
Index: /main/tags/2.38/gsdl/bin/script/mirror.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/mirror.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/mirror.pl	(revision 21083)
@@ -0,0 +1,146 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# mirror.pl
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program uses w3mirror to mirror a web site.  It looks for a
+# mirror program configuration files in etc, and if it finds them then
+# it runs the mirroring software using this configuration file, and placing
+# the mirror in the import directory.
+#
+# mirror.pl can use the w3mirror program or the wget program if they are
+# installed.
+#
+# To use w3mirror, the configuration file must be in etc/w3mir.cfg.
+# To use GNU wget, the configuration file (i.e. a wgetrc file) must
+# be in etc/wget.cfg and a file of the URLs to read in etc/wget.url
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use arcinfo;
+use colcfg;
+use plugin;
+use docprint;
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "mirror.pl: Uses w3mir or wget to sync a collections import data\n";
+    print STDERR "           with a website.\n\n";
+    print STDERR "  usage: $0 [options] collection-name\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -verbosity number      0=none, 3=lots\n";
+    print STDERR "   -importdir directory   Where to place the mirrored material\n";
+}
+
+
+&main ();
+
+sub main {
+    my ($verbosity, $importdir, $etcdir, 
+        $collection, $configfilename, $collectcfg);
+
+    if (!parsargv::parse(\@ARGV, 
+			 'verbosity/\d+/2', \$verbosity,
+			 'importdir/.*/', \$importdir )) {
+	&print_usage();
+	die "\n";
+    }
+
+    # get and check the collection name
+    if (($collection = &util::use_collection(@ARGV)) eq "") {
+	&print_usage();
+	die "\n";
+    }
+
+    # get the etc directory
+    $etcdir = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc");
+    
+    # check the collection configuration file for options
+    my $interval = 0;
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, 
+					   "etc", "collect.cfg");
+    if (-e $configfilename) {
+	$collectcfg = &colcfg::read_collect_cfg ($configfilename);
+	if (defined $collectcfg->{'importdir'} && $importdir eq "") {
+	    $importdir = $collectcfg->{'importdir'};
+	}
+    } else {
+	die "Couldn't find the configuration file $configfilename\n";
+    }
+    
+    # fill in the default import directories if none
+    # were supplied, turn all \ into / and remove trailing /
+    $importdir = "$ENV{'GSDLCOLLECTDIR'}/import" if $importdir eq "";
+    $importdir =~ s/[\\\/]+/\//g;
+    $importdir =~ s/\/$//;
+
+    # make sure there is an import directory
+    if (! -e "$importdir") {
+	&util::mk_dir($importdir);
+    }
+
+    # if w3mir.cfg exists, 
+    # then we are using w3mirror to mirror the remote site
+    if (-e "$etcdir/w3mir.cfg") {
+
+	# run the mirror program from the import directory
+	my  $cmd = "cd $importdir; ";
+	$cmd .= "perl -S gsw3mir.pl -cfgfile $etcdir/w3mir.cfg";
+	# print "\n$cmd\n";
+	`$cmd`;
+
+    } 
+
+    # if wget.cfg and wget.url both exist, 
+    # then we are using GNU wget to mirror the remote site
+    elsif ((-e "$etcdir/wget.cfg") && (-e "$etcdir/wget.url")) {
+	$ENV{WGETRC} = "$etcdir/wget.cfg";
+	my $cmd = "perl -S gsWget.pl --input-file=$etcdir/wget.url --directory-prefix=$importdir";
+	system($cmd);
+    }
+
+    # otherwise, there are no mirror copnfiguration files
+    else {
+	die "Couldn't find the mirror configuration files in $etcdir\n";
+    }
+
+
+}
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/mkcol.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/mkcol.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/mkcol.pl	(revision 21083)
@@ -0,0 +1,250 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# mkcol.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will setup a new collection from a model one. It does this by
+# copying the model, moving files to have the correct names, and replacing
+# text within the files to match the parameters.
+
+package mkcol;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use util;
+use cfgread;
+
+sub print_usage {
+    print STDOUT "\n";
+    print STDOUT "mkcol.pl: Creates the directory structure for a new\n";
+    print STDOUT "          Greenstone collection.\n\n";
+    print STDOUT "  usage: $0 -creator email [options] collection-name\n\n";
+    print STDOUT "  options:\n";
+    print STDOUT "   -optionfile file    Get options from file, useful on systems where\n";
+    print STDOUT "                       long command lines may cause problems\n";
+    print STDOUT "   -collectdir         Directory where new collection will be created.\n";
+    print STDOUT "                       Default is " . 
+	&util::filename_cat($ENV{'GSDLHOME'}, "collect") . "\n";
+    print STDOUT "   -maintainer email   The collection maintainer's email address (if\n";
+    print STDOUT "                       different from the creator)\n";
+    print STDOUT "   -public true|false  If this collection has anonymous access\n";
+    print STDOUT "   -title text         The title for the collection\n";
+    print STDOUT "   -about text         The about text for the collection\n";
+    print STDOUT "   -plugin text        perl plugin module to use (there may be multiple\n";
+    print STDOUT "                       plugin entries)\n";
+    print STDOUT "   -quiet              Operate quietly\n";
+    print STDOUT "  Note that -creator must be specified. You can make changes to all\n";
+    print STDOUT "  options later by editing the collect.cfg configuration file for your\n";
+    print STDOUT "  new collection (it'll be in the \"etc\" directory).\n\n";
+    print STDOUT "  [Type \"perl -S mkcol.pl | more\" if this help text scrolled off your screen]";
+    print STDOUT "\n" unless $ENV{'GSDLOS'} =~ /^windows$/i;
+}
+
+sub traverse_dir
+{
+    my ($modeldir, $coldir) = @_;
+    my ($newfile, @filetext);
+
+    if (!(-e $coldir)) {
+
+	my $store_umask = umask(0002);
+	my $mkdir_ok = mkdir ($coldir, 0777);
+	umask($store_umask);
+
+	if (!$mkdir_ok) 
+	{
+	    die "$!";
+	}
+    }
+
+    opendir(DIR, $modeldir) || die "Can't read $modeldir";
+    my @files = grep(!/^(\.\.?|CVS)$/, readdir(DIR));
+    closedir(DIR);
+
+    foreach $file (@files)
+    {
+	my $thisfile = &util::filename_cat ($modeldir, $file);
+	if (-d $thisfile) {
+	    my $colfiledir = &util::filename_cat ($coldir, $file);
+	    traverse_dir ($thisfile, $colfiledir);
+
+	} else {
+	    my $destfile = $file;
+	    $destfile =~ s/^modelcol/$collection/;
+	    $destfile =~ s/^MODELCOL/$capcollection/;
+	    print STDOUT "  doing replacements for $destfile\n" unless $quiet;
+	    $destfile = &util::filename_cat ($coldir, $destfile);
+	    
+	    open (INFILE, $thisfile) || 
+		die "ERROR: Can't read file $thisfile";
+	    open (OUTFILE, ">$destfile") ||
+		die "ERROR: Can't create file $destfile";
+
+	    while (defined ($line = <INFILE>)) {
+		$line =~ s/\*\*collection\*\*/$collection/g;
+		$line =~ s/\*\*COLLECTION\*\*/$capcollection/g;
+		$line =~ s/\*\*creator\*\*/$creator/g;
+		$line =~ s/\*\*maintainer\*\*/$maintainer/g;
+		$line =~ s/\*\*public\*\*/$public/g;
+		$line =~ s/\*\*title\*\*/$title/g;
+		$line =~ s/\*\*about\*\*/$about/g;
+		$line =~ s/\*\*plugins\*\*/$pluginstring/g;
+
+		print OUTFILE $line;
+	    }
+	    
+	    close (OUTFILE);
+	    close (INFILE);
+	}
+    }
+}
+
+# get and check options
+sub parse_args {
+    my ($argref) = @_;
+    if (!&parsargv::parse($argref,
+			  'optionfile/.*/', \$optionfile,
+			  'collectdir/.*/', \$collectdir,
+			  'creator/\w+\@[\w\.]+/', \$creator,
+			  'maintainer/\w+\@[\w\.]+/', \$maintainer,
+			  'public/true|false/true', \$public,
+			  'title/.+/', \$title,
+			  'about/.+/', \$about,
+			  'plugin/.+', \@plugin,
+			  'quiet', \$quiet,
+			  )) {
+	&print_usage();
+	die "\n";
+    }
+}
+
+sub main {
+
+    &parse_args (\@ARGV);
+    if ($optionfile =~ /\w/) {
+	open (OPTIONS, $optionfile) || die "Couldn't open $optionfile\n";
+	my $line = [];
+	my $options = [];
+	while (defined ($line = &cfgread::read_cfg_line ('mkcol::OPTIONS'))) {
+	    push (@$options, @$line);
+	}
+	close OPTIONS;
+	&parse_args ($options);
+
+    }
+
+    # load default plugins if none were on command line    
+    if (!scalar(@plugin)) {
+	@plugin = (ZIPPlug,GAPlug,TEXTPlug,HTMLPlug,EMAILPlug,
+		   PDFPlug,RTFPlug,WordPlug,PSPlug,ArcPlug,RecPlug);
+    }
+
+    # get and check the collection name
+    ($collection) = @ARGV;
+    if (!defined($collection)) {
+	print STDOUT "ERROR: no collection name was specified\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (length($collection) > 8) {
+	print STDOUT "ERROR: The collection name must be less than 8 characters\n";
+	print STDOUT "       so compatibility with earlier filesystems can be\n";
+	print STDOUT "       maintained.\n";
+	die "\n";
+    }
+
+    if ($collection eq "modelcol") {
+	print STDOUT "ERROR: No collection can be named modelcol as this is the\n";
+	print STDOUT "       name of the model collection.\n";
+	die "\n";
+    }
+
+    if ($collection eq "CVS") {
+	print STDOUT "ERROR: No collection can be named CVS as this may interfere\n";
+	print STDOUT "       with directories created by the CVS versioning system\n";
+	die "\n";
+    }
+
+    if (!defined($creator) || $creator eq "") {
+	print STDOUT "ERROR: The creator was not defined. This variable is\n";
+	print STDOUT "       needed to recognise duplicate collection names.\n";
+	die "\n";
+    }
+
+    if (!defined($maintainer) || $maintainer eq "") {
+	$maintainer = $creator;
+    }
+
+    $public = "true" unless defined $public;
+
+    if (!defined($title) || $title eq "") {
+	$title = $collection;
+    }
+
+    # get capitalised version of the collection
+    $capcollection = $collection;
+    $capcollection =~ tr/a-z/A-Z/;
+
+    # get the strings to include.
+    $pluginstring = "";
+    foreach $plugin (@plugin) {
+	$pluginstring .= "plugin         $plugin\n";
+    }
+
+    $mdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", "modelcol");
+    if (defined $collectdir && $collectdir =~ /\w/) {
+	if (!-d $collectdir) {
+	    print STDOUT "ERROR: $collectdir doesn't exist\n";
+	    die "\n";
+	}
+	$cdir = &util::filename_cat ($collectdir, $collection);
+    } else {
+	$cdir = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collection);
+    }
+
+    # make sure the model collection exists
+    die "ERROR: Cannot find the model collection $mdir" unless (-d $mdir);
+
+    # make sure this collection does not already exist
+    if (-e $cdir) {
+	print STDOUT "ERROR: This collection already exists\n";
+	die "\n";
+    }
+
+    # start creating the collection
+    print STDOUT "\nCreating the collection $collection...\n" unless $quiet;
+    &traverse_dir ($mdir, $cdir);
+    print STDOUT "\nThe new collection was created successfully at\n" unless $quiet;
+    print STDOUT "$cdir\n" unless $quiet;
+}
+
+&main ();
Index: /main/tags/2.38/gsdl/bin/script/nightly.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/nightly.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/nightly.pl	(revision 21083)
@@ -0,0 +1,104 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# nightly.pl
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will find all the collections under $GSDLHOME/collect
+# and use the update.pl script to update them all.  It should be run
+# every night to keep mirror collections up-to-date.
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use arcinfo;
+use colcfg;
+use plugin;
+use docprint;
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "nightly.pl: Attempts to update all Greenstone collections found on\n";
+    print STDERR "            the local filesystem by calling update.pl for each of\n";
+    print STDERR "            them.\n\n";
+    print STDERR "  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -verbosity number      0=none, 3=lots\n";
+    print STDERR "   -importdir directory   Where to place the mirrored material\n";
+    print STDERR "   -archivedir directory  Where the converted material ends up\n";
+}
+
+
+&main ();
+
+sub main {
+    my ($verbosity, $collectdir, $name, $collection);
+
+    if (!parsargv::parse(\@ARGV, 
+			 'verbosity/\d+/2', \$verbosity )) {
+	&print_usage();
+	die "\n";
+    }
+
+
+    # get the contents of the collect directory
+    $collectdir =  &util::filename_cat($ENV{'GSDLHOME'}, "collect");
+    opendir(CDIR, $collectdir) || die "Cannot open $collectdir: $!";
+    my @files = readdir(CDIR);
+    closedir CDIR;
+
+
+    # update each collection
+    foreach $name (@files) {
+
+	$collection = &util::filename_cat($collectdir, $name);
+
+	# igore entries for "." and ".."
+	next unless ($name =~ /[^\.]/);
+
+	# ignore modelcol
+	next if ($name eq "modelcol");
+
+	# ignore entries that are not directories
+	next unless (-d $collection);
+
+	# ignore directories that do not have a subdir called etc
+	next unless (-d &util::filename_cat($collection, "etc"));
+
+	print "Updating: $name\n";
+	print `update.pl $name`;
+	
+    }
+
+}
Index: /main/tags/2.38/gsdl/bin/script/pdftohtml.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/pdftohtml.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/pdftohtml.pl	(revision 21083)
@@ -0,0 +1,231 @@
+#!/usr/bin/perl -w
+
+
+###########################################################################
+#
+# pdftohtml.pl -- convert PDF documents to HTML format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# pdftohtml.pl is a wrapper for running pdftohtml utility which converts
+# PDF documents to HTML, and converts images to PNG format for display in
+# the HTML pages generated
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use parsargv;
+use util;
+use Cwd;
+use File::Basename;
+
+sub print_usage {
+# note - we don't actually ever use most of these options...
+print STDERR  
+    ("pdftohtml.pl wrapper for pdftohtml version 0.22, modified for GSDL use.\n",
+     "Usage: pdftohtml [options] <PDF-file> <html-file>\n",
+     "Options:\n",
+     "\t-i\tignore images (don't extract)\n",
+     "\t-a\tallow images only (continue even if no text is present)\n"
+     );
+exit (1);
+}
+
+sub main {
+    my (@ARGV) = @_;
+    my ($allow_no_text,$ignore_images);
+    
+    # read command-line arguments so that
+    # you can change the command in this script
+    if (!parsargv::parse(\@ARGV,
+			 'a', \$allow_no_text,
+			 'i', \$ignore_images
+			 ))
+    {
+	print_usage();
+    }
+
+    # Make sure the input file exists and can be opened for reading
+    if (scalar(@ARGV) != 2) {
+	print_usage();
+    }
+
+    my $input_filename = $ARGV[0];
+    my $output_filestem = $ARGV[1];
+    $output_filestem =~ s/\.html$//; # pdftohtml adds this suffix
+
+    my @dir = split (/(\/|\\)/, $input_filename);
+    pop(@dir);
+    my $dir = join ("", @dir);
+
+    if (!-r $input_filename) {
+	print STDERR "Error: unable to open $input_filename for reading\n";
+	exit(1);
+    }
+
+    # Heuristical code removed due to pdftohtml being "fixed" to not
+    # create bitmaps for each char in some pdfs. However, this means we
+    # now create .html files even if we can't extract any text. We should
+    # check for that now instead someday...
+
+
+    # formulate the command
+    my $cmd = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "pdftohtml");
+
+    # don't include path on windows (to avoid having to play about
+    # with quoting when GSDLHOME might contain spaces) but assume
+    # that the PATH is set up correctly.
+    $cmd = "pdftohtml" if ($ENV{'GSDLOS'} =~ /^windows$/);
+
+    $cmd .= " -i" if ($ignore_images);
+    $cmd .= " -noframes \"$input_filename\" \"$output_filestem.html\"";
+
+# system() returns -1 if it can't run, otherwise it's $cmds ret val.
+    # note we return 0 if the file is "encrypted"
+    $!=0;
+    if (system($cmd)!=0) {
+	print STDERR "pdftohtml error for $input_filename $!\n";
+	# leave these for gsConvert.pl...
+	#&util::rm("$output_filestem.text") if (-e "$output_filestem.text");
+	#&util::rm("$output_filestem.err") if (-e "$output_filestem.err");
+	return 1;
+    }
+
+    if (! -e "$output_filestem.html") {
+	return 1;
+    }
+
+# post-process to remove </b><b> and </i><i>, as these break up
+# words, screwing up indexing and searching.
+# At the same time, check that our .html file has some textual content.
+    &util::mv("$output_filestem.html","$output_filestem.html.tmp");
+    $!=0;
+    open INFILE, "$output_filestem.html.tmp" ||
+	die "Couldn't open file: $!";
+    open OUTFILE, ">$output_filestem.html" ||
+	die "Couldn't open file for writing: $!";
+    my $line;
+    my $seen_textual_content=$allow_no_text;
+    while ($line=<INFILE>) {
+	$line =~ s#</b><b>##g;
+	$line =~ s#</i><i>##g;
+	$line =~ s#\\#\\\\#g; # until macro language parsing is fixed...
+# check for any extracted text
+	if ($seen_textual_content == 0) {
+	    my $tmp_line=$line;
+	    $tmp_line =~ s/<[^>]*>//g;
+	    $tmp_line =~ s/Page\s\d+//;
+	    $tmp_line =~ s/\s*//g;
+	    if ($tmp_line ne "") {
+		$seen_textual_content=1;
+	    }
+	}
+
+# escape underscores, but not if they're inside tags (eg img/href names)
+	my $inatag = 0; # allow multi-line tags
+	if ($line =~ /_/) {
+	    my @parts=split('_',$line);
+	    my $lastpart=pop @parts;
+	    foreach my $part (@parts) {
+		if ($part =~ /<[^>]*$/) { # if we're starting a tag...
+		    $inatag=1;
+		} elsif ($part =~ />[^<]*$/) { # closing a tag
+		    $inatag=0;
+		}
+		if ($inatag) {
+		    $part.='_';
+		} else {
+		    $part.="&#95;";
+		}
+	    }
+	    $line=join('',@parts,$lastpart);
+	}
+
+	print OUTFILE $line;
+    }
+    close INFILE;
+    close OUTFILE;
+    &util::rm("$output_filestem.html.tmp");
+
+    # Need to convert images from PPM format to PNG format
+    my @images;
+
+    my $directory=$output_filestem;
+    $directory =~ s@[^\/]*$@@;    # assume filename has no embedded slashes...
+
+    open (IMAGES, "${directory}images.log") || 
+	open (IMAGES, "${directory}image.log") ||
+	      print STDERR "Error opening image log:$!\n";
+    while (<IMAGES>) {
+	push (@images, $_);
+    }
+    close IMAGES;
+    &util::rm("${directory}image.log") if (-e "${directory}image.log");
+
+    # no need to go any further if there is no text extracted from pdf.
+    if ($seen_textual_content == 0) {
+	print STDERR "Error: PDF contains no extractable text\n";
+	# remove images...
+	for $image (@images) {
+	    chomp($image);
+	    &util::rm("${directory}$image");
+	}
+	return 1;
+    }
+
+
+
+    for $image (@images) {
+	chomp($image);
+	my $cmd = "";
+	if ($ENV{'GSDLOS'} =~ /^windows/i) {
+	    $cmd = "pnmtopng \"${directory}$image\"";
+	    if (system($cmd)!=0) {
+		print STDERR "Error executing $cmd\n";
+		#return 1; # not sure about whether to leave this one in or take it out
+		next;
+	    }
+	} else {
+	    my @nameparts = split(/\./, $image);
+	    my $image_base = shift(@nameparts);
+	    $cmd = "pnmtopng \"${directory}$image\" > \"${directory}$image_base.png\" 2>/dev/null";
+	    if (system($cmd)!=0) {
+		$cmd = "convert \"${directory}$image\" \"${directory}$image_base.png\" 2>/dev/null";
+		if (system($cmd)!=0) {
+		    print STDERR "Cannot convert $image into PNG format (tried `pnmtopng' and `convert')...\n";
+		    #return 1; # not sure about whether to leave this one in or take it out
+		    next;
+		}
+	    }
+	}
+	&util::rm($image);
+    }
+
+    return 0;
+}
+
+# indicate our error status, 0 = success
+exit (&main(@ARGV));
+
Index: /main/tags/2.38/gsdl/bin/script/ping.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/ping.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/ping.pl	(revision 21083)
@@ -0,0 +1,74 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# ping.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan/Ping");
+}
+
+
+require LWP::UserAgent;
+use parsargv;
+
+&main();
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "ping.pl: Ping http or ftp URL to see if it's accessable.\n\n";
+    print STDERR "  usage: $0 [options] URL\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -quiet   Quiet operation\n\n";
+}
+
+sub main {
+
+    my ($quiet);
+    if (!parsargv::parse(\@ARGV, 'quiet', \$quiet)) {
+	&print_usage();
+	die "\n";
+    }
+
+    if (!scalar(@ARGV)) {
+	print STDERR "ERROR: no URL was provided\n";
+	die "\n";
+    }
+
+    $ua = new LWP::UserAgent;
+    $ua->timeout(60);
+    $request = new HTTP::Request('HEAD', $ARGV[0]);
+    $response = $ua->request($request);
+    
+    if ($response->is_success) {
+	print STDERR "$ARGV[0] ping succeeded\n" unless $quiet;
+	exit 0;
+    } else {
+	print STDERR "$ARGV[0] ping failed\n" unless $quiet;
+	exit 1;
+    }
+}
Index: /main/tags/2.38/gsdl/bin/script/pluginfo.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/pluginfo.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/pluginfo.pl	(revision 21083)
@@ -0,0 +1,107 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# pluginfo.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will print info about a plugin
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+}
+
+use plugin;
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "pluginfo.pl: Prints information about a plugin.\n\n";
+    print STDERR "  usage: $0 [options] plugin\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -collect collection-name  Giving a collection name will make pluginfo.pl\n";
+    print STDERR "                             look in collect/collection-name/perllib/plugins\n";
+    print STDERR "                             for plugin first. If it doesn't find it there\n";
+    print STDERR "                             it will look in the general perllib/plugins\n";
+    print STDERR "                             directory\n\n";
+}
+
+
+&main ();
+
+sub main {
+    my $collect = "";
+    if (!parsargv::parse(\@ARGV, 'collect.*/', \$collect)) {
+	&print_usage();
+	die "\n";
+    }
+
+    my $plugin = shift (@ARGV);
+    if (!defined $plugin || $plugin eq "") {
+	print STDERR "You must provide a plugin name\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if ($collect ne "") {
+	$ENV{'GSDLCOLLECTDIR'} = &util::filename_cat ($ENV{'GSDLHOME'}, "collect", $collect);
+    } else {
+	$ENV{'GSDLCOLLECTDIR'} = $ENV{'GSDLHOME'};
+    }
+
+    my $pluginfo = &plugin::load_plugins ([[$plugin]]);
+
+    my $plugobj = shift @$pluginfo;
+
+    print STDERR "\n$plugin info:\n\n";
+	
+    print STDERR "Options may be passed to any plugin by including them in your collect.cfg\n";
+    print STDERR "configuration file.\n\n";
+
+    print STDERR "Plugins may take two types of options:\n\n";
+
+    print STDERR "General options are defined within the base class (BasPlug.pm) and are\n";
+    print STDERR "inherited by any plugin that has been correctly derived from BasPlug.\n\n";
+
+    print STDERR "Specific options are defined within the plugin itself and are available\n";
+    print STDERR "only to this particular plugin.\n\n";
+
+    print STDERR "$plugin takes the following specific options:\n";
+    $plugobj->print_usage();
+
+    print STDERR "$plugin takes the following general options\n";
+    &BasPlug::print_general_usage($plugin);
+
+    print STDERR "The default process_exp for $plugin is\n";
+    print STDERR "\"" . $plugobj->get_default_process_exp() . "\"\n\n";
+
+    print STDERR "The default block_exp for $plugin is\n";
+    print STDERR "\"" . $plugobj->get_default_block_exp() . "\"\n\n";
+
+}
+
Index: /main/tags/2.38/gsdl/bin/script/ppttohtml.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/ppttohtml.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/ppttohtml.pl	(revision 21083)
@@ -0,0 +1,68 @@
+eval 'exec perl -x -- $0 $@'
+    if 0;
+#! perl
+# line 6
+
+sub usage() {
+    print "$0 <input.ppt> <output.html>\n";
+}
+
+
+if (@ARGV != 2) {
+    usage();
+    exit(1);
+}
+my $input_ppt=shift;
+my $output_html=shift;
+
+# try to find ppthtml binary in GSDLHOME
+my $ppthtml_binary="ppthtml";
+my $GSDLOS=$ENV{'GSDLOS'};
+my $GSDLHOME=$ENV{'GSDLHOME'};
+if ($GSDLOS =~ /^windows$/i) {
+    $ppthtml_binary.=".exe";
+}
+
+# assume it is on the path if running under windows, in case GSDLHOME
+# has a space
+if ($GSDLOS !~ /windows/i && -x "$GSDLHOME/bin/$GSDLOS/$ppthtml_binary") {
+    $ppthtml_binary="$GSDLHOME/bin/$GSDLOS/$ppthtml_binary";
+}
+
+if (! -r $input_ppt) {
+    print STDERR "Unable to read file `$input_ppt'\n";
+    exit (1);
+}
+
+my $return_value=
+    system("$ppthtml_binary \"$input_ppt\" > \"$output_html\"");
+
+if ($return_value != 0) {
+    exit (1);
+}
+
+# Ok, we made an html file. Check to see if it has any content, and remove
+# the little nag link at the the bottom.
+my $html="";
+open (HTML, "$output_html") || die "Can't read file:$!";
+$html=join('', <HTML>);
+close HTML;
+
+$html =~ s@<hr><FONT SIZE=-1>Created with.*\n</BODY></HTML>$@</BODY></HTML>@s;
+
+# if we are using the file name as the title, then get rid of it,
+# as HTMLPlug will use the first 100 chars instead if there's no title.
+$html =~ s@<title>.*?\.ppt</title>@<title></title>@i;
+
+my $tmp=$html;
+$tmp =~ s/^.*?<BODY>//ms;
+$tmp =~ s/(&nbsp;)|\s//gims;
+if ($tmp !~ m/(>[^<]+<)/) {
+    print STDERR "No text found in extracted html file!\n";
+    exit(1);
+}
+open (NEWHTML, ">$output_html") || die "Can't create file:$!";
+print NEWHTML $html;
+close NEWHTML;
+exit (0);
+
Index: /main/tags/2.38/gsdl/bin/script/process_html.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/process_html.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/process_html.pl	(revision 21083)
@@ -0,0 +1,393 @@
+#!/usr/bin/perl -w
+
+
+# Both this script and its associated process_html.pl were written by
+# Marcel ?, while a student at Waikato University. Unfortunately he
+# was very new to perl at the time so the code is neither as clean nor
+# as fast as it could be (I've cleaned up a few of the more serious
+# bottlenecks -- it could do with alot more work though).  The code
+# does work though, if a little slowly. It's not ready for primetime
+# however and is included in the Greenstone source tree mostly so that
+# I don't lose it. -- Stefan - 24 Jul 2001
+
+
+# This script rebuilds the static collection by linking all the downloaded html files
+# back together. 
+# It searches through html files and replaces links it recognizes from the links.txt file 
+# with the apropriate html file name (eg 1.html, 2.html etc)
+# This script also updates the links for the pictures.
+
+# This is where all the dl-ed html files are located, eg. 'temp_html/'
+my $outputdir  = 'temp_html/';
+
+# This is where all the processed files end up (don't want to overwrite originals ;) eg. 'my_static_collection/'
+my $finaldir   = 'envl_collection/';
+
+# If any options where used (such as &u=1) when the html files where dl-ed then please specify them here.
+my $option = "&u=1";
+
+# Please ensure these two options match the settings used when downloading the collection :)
+my $dir_entries = 250;
+my $fix_empty_pages = '&cl=CL1';
+
+#-------------------------------------------------------------------------------------------------
+
+# global arrays used to store links, links-index & html-filenames
+my %filez;
+my %out_filez;
+my %linkz;
+my %short_linkz1;
+my %short_linkz2;
+my %short_linkz3;
+my %linkz_index;
+#my %remove_these;
+my $remove_these = "";
+
+sub processfiles
+{
+    local($start_here) = @_;
+
+    for my $file($start_here .. $#filez)
+    {
+	if((-e $filez[$file])&&(-s $filez[$file]))
+	{
+	    open (FILE, $filez[$file]) or die "can't open ", $filez[$file],": $! \n";
+	    
+	    print " $filez[$file] ";
+	    
+	    undef $/;
+	    my $content_of_file = <FILE>;
+	    $/ = "\n";
+	    close(FILE);
+	    
+	    #quick & nasty fix for the 'open book' link
+	    local $quick_fix1 = "&cl=\"";
+	    local $quick_fix2 = "&cl=\'";
+	    
+	    $content_of_file =~ s/$quick_fix1/$fix_empty_pages\"/g;
+	    $content_of_file =~ s/$quick_fix2/$fix_empty_pages\'/g;
+	    
+	    for my $link(0 .. $#linkz)
+	    {
+		my $new_link = $linkz_index[$link].".html";
+		
+		if($short_linkz3[$link] ne "")
+		{
+		    $content_of_file =~ s/$short_linkz1[$link].*?$short_linkz2[$link].*?${short_linkz3[$link]}[^\"\'\s\>]*/$new_link/g;
+		}
+		else
+		{
+			$content_of_file =~ s/$short_linkz1[$link].*${short_linkz2[$link]}[^\"\'\s\>]*/$new_link/g;
+		}
+	    }
+    
+            $content_of_file =~ s/(["'])$remove_these/$1..\//g;
+	    open (TEMP, ">temp.html") or die "can't open temp.html: $! \n";
+	    print TEMP $content_of_file;
+	    close(TEMP);
+	    rename("temp.html", $out_filez[$file]) or die "cannot create", $out_filez[$file],": $! \n";
+	    print " --> $out_filez[$file]";
+	    print "..done\n";
+	}
+	else
+	{
+	    last;    # bomb out of loop. Done.
+	}
+    }
+     print " *** Done, cannot find any more files to process ***\n";
+}
+
+# the switch variable there so that I can create a couple of additional arrays without having to write an entirely new function :-)
+# 0 = off, 1 = on (puts values into %linkz_index, %short_linkz1 and %short_linkz2)
+sub sort_array_by_length
+{
+    local (*foo, $switch) = @_;
+    my $total = $#foo;
+    my %temp_linkz;
+    my $shortest = 999999;
+    my $longest = 0;
+
+    if ($switch != 0)
+    {
+	print "Processing linkz (chopping, slicing, dicing and sorting :-)...";
+    }
+
+    for my $counter(0 .. $total)
+    {
+	if (length($foo[$counter]) < $shortest)
+	{
+	    $shortest = length($foo[$counter]);   
+	    $temp_linkz[$total] = $foo[$counter];
+	}
+	if (length($foo[$counter]) > $longest)
+	{
+	    $longest = length($foo[$counter]);   
+	}  
+    }        
+    
+    $backward = $total;
+    for my $l($shortest .. $longest)
+    {      
+	local $numberdir = 0;
+	for my $counter(0 .. $total)
+	{
+	    if ($counter % $dir_entries == 0)
+	    {
+		$numberdir = $counter;
+	    }
+
+	    if(length($foo[$counter]) == $l)
+	    {
+		$temp_linkz[$backward] = $foo[$counter];
+		if ($switch != 0)
+		{ 
+		    $linkz_index[$backward] = "../".$numberdir."/".$counter;
+		    my $d_offset = 0;
+		    for my $search(0 .. (length($foo[$counter]) - 3))
+		    {
+			if((substr($foo[$counter], $search, 3) eq '?e=')||(substr($foo[$counter], $search, 3) eq '&e='))
+			{
+			    $short_linkz1[$backward] = substr($foo[$counter], 0, $search);
+			}
+			
+			for my $second_search($search .. length($foo[$counter]))
+			{
+			    if((substr($foo[$counter], $second_search, 3) eq '?d=')||(substr($foo[$counter], $second_search, 3) eq '&d='))
+			    {
+				$short_linkz3[$backward] = substr($foo[$counter], $second_search);
+				$d_offset = $second_search;
+				last;
+			    }
+			}
+			
+			if(substr($foo[$counter], $search, 3) eq '?a=')
+			{
+			    $short_linkz1[$backward] = substr($foo[$counter], 0, $search);
+			    if($d_offset > 0)
+			    {
+				$short_linkz2[$backward] = substr($foo[$counter], $search, $d_offset - $search);
+			    }
+			    else
+			    {
+				$short_linkz2[$backward] = substr($foo[$counter], $search);
+			    }
+			}
+			
+			if(substr($foo[$counter], $search, 3) eq '&a=')
+			{
+			    if($d_offset > 0)
+			    {
+				$short_linkz2[$backward] = substr($foo[$counter], $search, $d_offset - $search);
+			    }
+			    else
+			    {
+				$short_linkz2[$backward] = substr($foo[$counter], $search);
+			    }
+			}
+		    } 
+		}
+		$backward--;
+	    }
+	}
+    }    
+    # copy the sorted temp_array over the original array (must be a better way of doing this :\ )
+    for my $counter(0 .. $total)
+    {    
+	$foo[$counter] = $temp_linkz[$counter];
+    }
+    if ($switch != 0)
+    {
+	print "done!\n";
+    }
+}
+
+sub how_much_to_chop
+{
+    local($link) = @_;
+    my $bracket_counter = 0;
+    my $chop_offset = 0;
+
+    for my $search(0 .. length($link))
+    {
+	if (substr($link, $search, 1) eq '/')
+	{
+	    $bracket_counter++;   
+	}
+	if ($bracket_counter == 2)
+	{
+	    $chop_offset = $search + 1;
+	} 
+    }
+    return $chop_offset;
+}
+
+my $start_time = (times)[0]; 
+
+#-----------------------------------------------------------------------------------------------
+# No need to start from scratch everytime, we can recover/continue from wherever we left off
+# simply by checking which html files have been created
+#-----------------------------------------------------------------------------------------------
+my $linknumber = 0;
+my $failed     = 0;
+my $check_file = "";
+my $numberdir = 0;
+
+if($outputdir ne $finaldir)
+{
+    while ($failed == 0)
+    {
+	if ($linknumber % $dir_entries == 0) 
+	{
+	    if (!((-e $finaldir.$linknumber)&&(-d $finaldir.$linknumber)))
+	    {
+		$failed++;
+		mkdir($finaldir.$linknumber, 0777) or die " ** Cannot create ",$finaldir.$linknumber, "!: $!\n";
+	    }
+	    $numberdir = $linknumber;
+	}
+	
+	$check_file = $finaldir.$numberdir."/".$linknumber.".html";
+	if ((-e $check_file)&&($failed == 0)) 
+	{ 
+	    $linknumber++;
+	} 
+	else
+	{
+	    $failed++;
+	    # I'm subtracting 1 from the starting link, 
+	    # just in case it only loaded half the page ;^)
+	    if($linknumber>0) 
+	    { 
+		$linknumber--; 
+	    }
+	    print " Will start processing at number $linknumber \n";
+	}
+    }
+}
+my $i = 0;
+my $that = "";
+my $offset = 0;
+
+#read in old links from links text file
+open (CHECK, "links.txt") || die " ** Cannot find/open links text file!: $!\n";
+while (defined ($that = <CHECK>)) {
+    
+    if ($i == 0)
+    {  
+	#chop off the first bit
+	$offset = &how_much_to_chop($that); 
+	print " Offset has been set to: ",$offset,"\n";
+	print " This next bit will be ignored for all links in the links.txt file:\n";
+	print "  -->",substr($that,0,$offset),"<--\n";
+    }
+    
+    $that = substr($that, $offset);
+    
+    #Wipe-out the EOL character
+#    if (substr($that, -1) eq "\n") { substr($that, -1) = ""; }
+    chomp $that;
+    
+    #this wipes the options
+#    if (length($option) != 0)
+#    {	    
+#	substr($that, (length($option)) * -1) = "";
+#    }
+    $that =~ s/$option//;
+    
+    $linkz[$i] = $that;
+    
+    $short_linkz1[$i] = "";
+    $short_linkz2[$i] = "";
+    $short_linkz3[$i] = "";
+    
+    for my $search(0 .. (length($that) - 3))
+    {
+	if((substr($that, $search, 3) eq '?e=')||(substr($that, $search, 3) eq '&e='))
+	{
+	    $short_linkz1[$i] = substr($that, 0, $search);
+	}
+	
+	if(substr($that, $search, 3) eq '?a=')
+	{
+	    $short_linkz1[$i] = substr($that, 0, $search);
+	    $short_linkz2[$i] = substr($that, $search);
+	}
+	if(substr($that, $search, 3) eq '&a=')
+	{
+	    $short_linkz2[$i] = substr($that, $search);
+	}
+    }
+    $i++;
+    
+    if ($i % $dir_entries == 0)
+    {
+	if (!((-e $finaldir.$i)&&(-d $finaldir.$i)))
+	{
+	    mkdir($finaldir.$i, 0777) or die " ** Cannot create ",$finaldir.$i, "!: $!\n";
+	}
+    }
+}
+close(CHECK);
+
+print " - I found ",$i, " links in the links text file -\n";
+
+&sort_array_by_length(*linkz, 1);
+
+$numberdir = 0;
+
+for my $z(0 .. ($i - 1))
+{
+    if($z % $dir_entries == 0)
+    {
+	$numberdir = $z;
+    }
+    $filez[$z] = $outputdir.$numberdir."/".$z.".html";
+    $out_filez[$z] = $finaldir.$numberdir."/".$z.".html";
+}
+
+# ..and last but not least, load any image_dirs from image_dirs.txt
+my $imd_that = "";
+#my $image_dirs_pointer = 0;
+
+my @tmp_arr = ();
+open (IMAGE_DIR, "image_dirs.txt") || die " ** HEY! Cannot find/open image_dirs.txt file! : $! **\n";
+while(defined ($imd_that = <IMAGE_DIR>))
+{
+    chomp $imd_that;
+    push(@tmp_array, $imd_that);
+}
+close IMAGE_DIR;
+
+$remove_these = "(" . join ("|", sort {length $b <=> length $a} @tmp_array) . ")"; 
+
+#print " - I found ",($#remove_these + 1)," picture directories in image_dirs.txt -\n";
+#&sort_array_by_length(*remove_these, 0);
+
+print "-" x 20, "\n";
+print "  Here we go...\n";
+print "-" x 20, "\n";
+
+&processfiles($linknumber);
+
+my $end_time = (times)[0];
+print "\n\n\n *----------------------------*\n";
+print " |  Whew! Task completed! :-D |\n";
+print " *----------------------------*\n";
+printf"  Script took %.2f CPU seconds to complete ;^)\n", $end_time - $start_time;
+print "\n\n"; 
+print " Now there's a few things left to do...load up ",$finaldir, "0/0.html in your webbrowser and\n";
+print " make sure everything works.\n"; 
+print " The grab_collection script will have generated 3 text files that can be removed, namely:\n";
+print " - links.txt \n";
+print " - images.txt \n";
+print " - image_dirs.txt \n\n";
+if ($outputdir ne $finaldir)
+{
+    print "And then finally you can also delete the ",$outputdir," directory.\n\n";
+}
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/sendmail.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/sendmail.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/sendmail.pl	(revision 21083)
@@ -0,0 +1,89 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# sendmail.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# sendmail.pl is a simple wrapper around the Sendmail perl module written
+# by Milivoj Ivkovic <mi@alma.ch>
+
+# Input is either read from STDIN or, if the -msgfile option is set, read
+# from the given file.
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use lib qq($ENV{'GSDLHOME'}/perllib/cpan);
+use Mail::Sendmail;
+use parsargv;
+
+if (!parsargv::parse(\@ARGV, 
+		     'to/@', \$to,
+		     'from/@', \$from,
+		     'subject/.*/', \$subject,
+		     'smtp/.*', \$smtp,
+		     'msgfile/.*/', \$msgfile)) {
+    print STDERR "\n";
+    print STDERR "sendmail.pl: A simple platform independant mail sending program.\n\n";
+    print STDERR "  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -to addr      Comma separated list of mail recipients\n";
+    print STDERR "   -from addr    Address of message sender\n";
+    print STDERR "   -subject str  Optional subject line\n";   
+    print STDERR "   -smtp server  The outgoing (SMTP) mail server\n";
+    print STDERR "   -msgfile file A file from which message to be sent is read.\n";
+    print STDERR "                 If not set message will be read in from STDIN\n";
+    die "\n";
+}
+
+my %mail = ('SMTP' => $smtp, 
+	    'To' => $to,
+	    'From' => $from,
+	    'Subject' => $subject,
+	    );
+
+my $msg = "";
+if ($msgfile ne "") {
+    if (!open (MSGFILE, $msgfile)) {
+	print STDERR "ERROR: Failed to open $msgfile. Message was not sent\n";
+	exit (-1);
+    }
+    undef $/;
+    $msg = <MSGFILE>;
+    $/ = "\n";
+    close MSGFILE;
+} else {
+    $msg = <STDIN>;
+}
+
+$mail{'Message'} = $msg;
+	
+if (!sendmail %mail) {
+    print STDERR "ERROR: Failed to send message\n";
+    print STDERR "'$Mail::Sendmail::error'\n";
+    exit (-1);
+}
Index: /main/tags/2.38/gsdl/bin/script/translate.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/translate.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/translate.pl	(revision 21083)
@@ -0,0 +1,359 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# translate.pl 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# translate.pl takes a translated macro file (filename passed in on command
+# line) and generates any images required by it. Check out english.dm for
+# an example of the format translate.pl expects
+
+# translate.pl uses gimp to generate images so needs gimp installed and set
+# up for scripting with perl
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+}
+
+use Gimp;
+use parsargv;
+use util;
+use unicode;
+
+# these html entities will be translated correctly when occurring in 
+# images. Any entities not in this list will not.
+my %rmap = ('auml' => chr (228),
+	    'euml' => chr (235),
+	    'iuml' => chr (239),
+	    'ouml' => chr (246),
+	    'uuml' => chr (252),
+	    'Auml' => chr (196),
+	    'Euml' => chr (203),
+	    'Iuml' => chr (207),
+	    'Ouml' => chr (214),
+	    'Uuml' => chr (220),
+	    'szlig' => chr (223),
+	    'aacute' => chr (225),
+	    'eacute' => chr (233),
+	    'iacute' => chr (237),
+	    'oacute' => chr (243),
+	    'uacute' => chr (250),
+	    'Aacute' => chr (193),
+	    'Eacute' => chr (201),
+	    'Iacute' => chr (205),
+	    'Oacute' => chr (211),
+	    'Uacute' => chr (218),
+	    'agrave' => chr (224),
+	    'egrave' => chr (232),
+	    'igrave' => chr (236),
+	    'ograve' => chr (242),
+	    'ugrave' => chr (249),
+	    'Agrave' => chr (192),
+	    'Egrave' => chr (200),
+	    'Igrave' => chr (204),
+	    'Ograve' => chr (210),
+	    'Ugrave' => chr (217),
+	    'ntilde' => chr (241),
+	    'Ntilde' => chr (209),
+	    'atilde' => chr (227),
+	    'Atilde' => chr (195),
+	    'otilde' => chr (245),
+	    'Otilde' => chr (213),
+	    'ccedil' => chr (231),
+	    'Ccedil' => chr (199),
+	    'ecirc' => chr (234),
+	    'Ecirc' => chr (202),
+	    'acirc' => chr (226),
+	    'Acirc' => chr (194),
+	    );
+
+my $hand_made = 0;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "translate.pl: Uses gimp to generate any images required by a\n";
+    print STDERR "              Greenstone macro file.\n\n";
+    print STDERR "  usage: $0 [options] macrofile\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -save_orig_file       edited macrofile will be written to\n";
+    print STDERR "                         macrofile.new leaving macrofile unchanged\n";
+    print STDERR "   -language_symbol      ISO abbreviation of language (e.g. German=de,\n";
+    print STDERR "                         French=fr, Maori=mi)\n";
+    print STDERR "   -image_dir directory  full path to directory in which to create images\n";
+    print STDERR "                         (defaults to `pwd`/images)\n\n";
+}
+
+sub gsdl_translate {
+
+    if (!parsargv::parse(\@ARGV, 
+			 'save_orig_file', \$save_orig_file,
+			 'language_symbol/[A-Za-z]{2}', \$language_symbol,
+			 'image_dir/.*/images', \$image_dir)) {
+	&print_usage();
+	die "\n";
+    }
+
+    if ($image_dir eq "images") {
+	$image_dir = `pwd`;
+	chomp $image_dir;
+	$image_dir = &util::filename_cat ($image_dir, "images");
+    }
+
+    if (!defined $ARGV[0]) {
+	print STDERR "no macro file supplied\n\n";
+	&print_usage();
+	die "\n";
+    }
+    my $macrofile = $ARGV[0];
+    die "\nmacrofile $macrofile does not exist\n\n" unless -e $macrofile;
+
+    if (!-e $image_dir) {
+	mkdir ($image_dir, 511) || die "\ncouldn't create image_dir $image_dir\n\n";
+    }
+
+    open (INPUT, $macrofile) || die "\ncouldn't open $macrofile for reading\n\n";
+    open (OUTPUT, ">$macrofile.new") || die "\ncouldn't open temporary file $macrofile.new for writing\n\n";
+
+    &parse_file (INPUT, OUTPUT);
+
+    close OUTPUT;
+    close INPUT;
+
+    if (!$save_orig_file) {
+	`mv $macrofile.new $macrofile`;
+    }
+
+    print STDERR "\n\n";
+    print STDERR "translation of macro file $macrofile completed\n";
+    print STDERR "the translated macro file is $macrofile.new\n" if $save_orig_file;
+    print STDERR "\n";
+    if ($hand_made) {
+	print STDERR "$hand_made hand made images were found within $macrofile,\n";
+	print STDERR "these will need to be made by hand (grep $macrofile for 'hand_made'\n\n";
+    }
+    print STDERR "To add your new interface translation to Greenstone you'll need to:\n";
+    print STDERR "  1. Copy your new macro file to your GSDLHOME/macros directory\n";
+    print STDERR "  2. Add your new macro file to the macrofiles list in your\n";
+    print STDERR "     GSDLHOME/etc/main.cfg configuration file\n";
+    print STDERR "  3. Copy your newly created images from $image_dir to \n";
+    print STDERR "     GSDLHOME/images/$language_symbol/\n\n";
+    print STDERR "Access your new interface language by setting the language (l) cgi\n";
+    print STDERR "argument to '$language_symbol'\n\n";
+
+}
+
+sub parse_file {
+    my ($input, $output) = @_;
+
+    undef $/;
+    my $dmfile = <$input>;
+    $/ = "\n";
+
+    # process all the images
+
+    $dmfile =~ s/(?:^|\n)\#\#\s*\"([^\"]*)\"\s*\#\#\s*([^\s\#]*)\s*\#\#\s*([^\s\#]*)\s*\#\#(.*?)(?=(\n\#|\s*\Z))/&process_image ($1, $2, $3, $4)/esg;
+
+    # add language parameter to each macro
+    $dmfile =~ s/(\n\s*)(_[^_]*_)\s*(\[[^\]]*\])?\s*\{/$1 . &add_language_param ($2, $3)/esg;
+    
+    print $output $dmfile;
+}
+
+sub process_image {
+    my ($text, $image_type, $image_name, $image_macros) = @_;
+
+    my $origtext = $text;
+    $text =~ s/&(\d{3,4});/chr($1)/ge;
+    $text =~ s/&([^;]*);/$rmap{$1}/g;
+
+    # special case for russian images - fonts expect text to be koi8-r encoded
+    if ($language_symbol eq "ru") {
+	$text = &unicode::unicode2koi8r(&unicode::utf82unicode($text));
+    }
+
+    # edit image macros
+    $image_macros =~ s/(_httpimg_\/)(?:[^\/\}]*\/)?([^\}]*\.(?:gif|jpe?g|png))/$1$language_symbol\/$2/gs;
+
+    if ($image_type eq "top_nav_button") {
+	
+	# generate images
+	my $options = "-text \"$text\" -filenamestem $image_name";
+	# special case for russian images
+	if ($language_symbol eq "ru") {
+	    $options .= " -fontsize 10 -height 20 -whitespace -image_dir $image_dir";
+	    $options .= " -foundry cronyx -fontname helvetica";
+	} else {
+	    $options .= " -fontsize 12 -height 20 -whitespace -image_dir $image_dir";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/flash_button.pl $options`;
+
+	# get width of new images and edit width macro
+	# my $fullfilename = &util::filename_cat ($image_dir, "${image_name}on.gif");
+	# &process_width_macro ($fullfilename, $image_name, \$image_macros);
+
+    } elsif ($image_type eq "nav_bar_button") {
+	
+	# generate on and off images
+	my $options = "-text \"$text\" -filenamestem $image_name";
+	$options .= " -fontsize 17 -height 17 -fixed_width -width 87";
+	$options .= " -image_dir $image_dir";
+	# special case for russian images
+	if ($language_symbol eq "ru") {
+	    $options .= " -foundry cronyx -fontname helvetica";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/flash_button.pl $options`;
+
+	# generate green image
+	$options = "-text \"$text\" -filename ${image_name}gr.gif";
+	$options .= " -image_dir $image_dir";
+	# special case for russian images
+	if ($language_symbol eq "ru") {
+	    $options .= " -foundry cronyx -fontname helvetica";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/green_bar.pl $options`;
+
+	# get width of new images and edit width macro
+	my $fullfilename = &util::filename_cat ($image_dir, "${image_name}on.gif");
+	&process_width_macro ($fullfilename, $image_name, \$image_macros);
+
+    } elsif ($image_type eq "document_button") {
+
+	# generate on and off images
+	my $options = "-text \"$text\" -filenamestem $image_name";
+	$options .= " -fixed_width -whitespace -image_dir $image_dir";
+	if ($language_symbol eq "ru") {
+	    $options .= " -fontsize 8 -foundry cronyx -fontname helvetica";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/flash_button.pl $options`;
+
+	# get width of new images and edit width macro
+	# my $fullfilename = &util::filename_cat ($image_dir, "${image_name}on.gif");
+	# &process_width_macro ($fullfilename, $image_name, \$image_macros);
+
+    } elsif ($image_type eq "green_bar_left_aligned") {
+
+	# generate green bar image (we're assuming these bars are always 537
+	# pixels and are never stretched by excess text
+	my $options = "-text \"$text\" -filename ${image_name}.gif -dont_center";
+	$options .= " -width 537 -width_space 15 -image_dir $image_dir";
+	if ($language_symbol eq "ru") {
+	    $options .= " -foundry cronyx -fontname helvetica";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/green_bar.pl $options`;
+
+    } elsif ($image_type eq "green_title") {
+
+	# read the width if it is specified in $image_macros
+        my ($width) = $image_macros =~ /_width${image_name}x?_\s*[^\{]*\{(\d+)\}/;
+        $width = 200 unless ($width);
+
+        # generate green title image
+	my $options = "-text \"$text\" -filename ${image_name}.gif -image_dir $image_dir";
+	$options .= " -width $width -height 57 -stripe_alignment right -text_alignment right";
+	$options .= " -fontsize 26 -fontweight bold";
+	# special case for russian images
+	if ($language_symbol eq "ru") {
+	    $options .= " -foundry cronyx -fontname helvetica";
+	}
+	`$ENV{'GSDLHOME'}/bin/script/gimp/title_icon.pl $options`;
+
+	# get width of resulting image and edit _width..._ macro in $image_macros
+        # (no longer needed since we always resize to the width read from $image_macros.)
+        # my $fullfilename = &util::filename_cat ($image_dir, "${image_name}.gif");
+	# &process_width_macro ($fullfilename, $image_name, \$image_macros);
+
+    } elsif ($image_type eq "hand_made") {
+	
+	$hand_made ++;
+
+    } else {
+	
+	print STDERR "WARNING (translate.pl): unknown image type found ($image_type)\n";
+
+    }
+
+    return "\n\#\# \"$origtext\" \#\# $image_type \#\# $image_name \#\#$image_macros";
+}
+
+sub process_width_macro {
+    my ($filename, $image_name, $image_macros) = @_;
+
+    my $img_info = &get_img_info ($filename);
+    $$image_macros =~ s/(_width${image_name}x?_\s*(?:\[[^\]]*\])?\s*\{)(\d+)(\})/$1$img_info->{'width'}$3/s;
+}
+
+sub add_language_param {
+    my ($macroname, $paramlist) = @_;
+
+    my $first = 1;
+    if (defined $paramlist) {
+	$paramlist =~ s/^\[//;
+	$paramlist =~ s/\]$//;
+	my @params = split /\,/, $paramlist;
+	$paramlist = "";
+	foreach $param (@params) {
+	    # remove any existing language parameter
+	    if ($param !~ /^l=/) {
+		$paramlist .= "," unless $first;
+		$paramlist .= $param;
+		$first = 0;
+	    }
+	}
+    }
+    $paramlist .= "," unless $first;
+    $paramlist .= "l=" . $language_symbol;
+    return "$macroname [$paramlist] {";
+}
+
+sub get_img_info {
+    my ($imagefile) = @_;
+    my %info = ();
+
+    if (!-r $imagefile) {
+	print STDERR "ERROR (translate.pl): couldn't open $imagefile to get dimensions\n";
+	$info{'width'} = 0;
+	$info{'height'} = 0;
+    } else {
+	my $image = gimp_file_load (RUN_NONINTERACTIVE, $imagefile, $imagefile);
+	$info{'width'} = gimp_image_width ($image);
+	$info{'height'} = gimp_image_height ($image);
+    }
+
+    return \%info;
+}
+
+sub query {
+
+  gimp_install_procedure("gsdl_translate", "translate macro files and create images",
+                        "", "Stefan Boddie", "Stefan Boddie", "2000-03-14",
+                        "<Toolbox>/Xtns/gsdl_translate", "*", &PROC_EXTENSION,
+                        [[PARAM_INT32, "run_mode", "Interactive, [non-interactive]"]], []);
+}
+
+sub net {
+  gsdl_translate;
+}
+
+exit main;
Index: /main/tags/2.38/gsdl/bin/script/unindex.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/unindex.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/unindex.pl	(revision 21083)
@@ -0,0 +1,427 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# unindex.pl --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program will decompress all the text from a built index
+# and return it to gml format - may be slightly broken at present
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    $FileHandle = 'FH000';
+}
+
+use doc;
+use docsave;
+use util;
+use parsargv;
+use GDBM_File;
+use FileHandle;
+use English;
+
+select STDERR; $| = 1;
+select STDOUT; $| = 1;
+
+
+# globals
+$collection = "";
+$index = "";
+$textdir = "";
+$classinfo = {};
+$mgread = ++$FileHandle;
+$mgwrite = ++$FileHandle;
+
+
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "unindex.pl: Attempts to generate gml files from a built Greenstone index.\n\n";
+    print STDERR "  usage: $0 [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -verbosity number      0=none, 3=lots\n";
+    print STDERR "   -indexdir directory    The index to be decompressed (defaults to ./index)\n";
+    print STDERR "   -archivedir directory  Where the converted material ends up (defaults to ./archives\n";
+    print STDERR "   -removeold             Will remove the old contents of the archives\n";
+    print STDERR "                          directory -- use with care\n\n";
+}
+
+&main ();
+
+sub main {
+    if (!parsargv::parse(\@ARGV, 
+			 'verbosity/\d+/2', \$verbosity,
+			 'indexdir/.*/index', \$indexdir,
+			 'archivedir/.*/archives', \$archivedir,
+			 'removeold', \$removeold)) {
+	&print_usage();
+	die "\n";
+    }
+
+    die "indexdir $indexdir does not exist\n\n" unless (-d $indexdir);
+    $indexdir =~ s/\/$//;
+    if (-d $archivedir) {
+	if ($removeold) {
+	    print STDERR "Warning - removing current contents of the archives directory $archivedir\n";
+	    print STDERR "          in preparation for the import\n";
+	    sleep(5); # just in case...
+	    &util::rm_r ($archivedir);
+	}
+    } else {
+	&util::mk_all_dir ($archivedir);
+    }
+
+    my $gdbmfile = &get_gdbmfile ($indexdir);
+    &set_index ();
+    &get_classinfo ($gdbmfile);
+    &openmg ();
+
+    # read the archive information file
+    my $archive_info_filename = &util::filename_cat ($archivedir, "archives.inf");
+    my $archive_info = new arcinfo ();
+    $archive_info->load_info ($archive_info_filename);
+
+    # create a docsave object to process the documents
+    my $processor = new docsave ("", $archive_info, $verbosity);
+    $processor->setarchivedir ($archivedir);
+
+    # create a document object for the classification file
+    my $clsudoc_obj = new doc($gdbmfile, "classification");
+    $clsudoc_obj->set_OID ("CLSU");
+
+    my ($doc_obj);
+    foreach $classification (keys %$classinfo) {
+	my $count = 0;
+	foreach $section (sort numerically keys %{$classinfo->{$classification}}) {
+	    print STDERR "\n$classification.$section" if $verbosity >= 2;
+	    if ($classification =~ /^B$/i) {
+		last if $count > 10;
+		# create a new document
+		$doc_obj = new doc ($classinfo->{$classification}->{$section}->{'9999999'}->{'jobnum'}, 
+				    "indexed_doc");
+		$doc_obj->set_OID();
+		my $cursection = $doc_obj->get_top_section();
+		&add_section_content ($doc_obj, $cursection,
+				      $classinfo->{$classification}->{$section});
+		&recurse_classinfo ($doc_obj, $classinfo->{$classification}->{$section}, 
+				    $doc_obj->get_end_child($cursection), 0);
+		$processor->process($doc_obj);
+	    } else {
+		my $classifier = &int_classification ($classification);
+		$clsudoc_obj->create_named_section("$classifier.$section");
+		&add_section_content ($clsudoc_obj, "$classifier.$section",
+				      $classinfo->{$classification}->{$section});
+		&recurse_classinfo ($clsudoc_obj, $classinfo->{$classification}->{$section}, 
+				    "", "$classifier.$section");
+	    }
+	    $count ++;
+	}
+    }
+    $processor->process($clsudoc_obj);
+    &closemg();
+
+    # write out the archive information file
+    $archive_info->save_info($archive_info_filename);
+}
+
+# returns the path to the gdbm info database - also
+# sets the $collection and $textdir global variable
+sub get_gdbmfile {
+    my ($indexdir) = @_;
+    my ($gdbmfile);
+
+    opendir (DIR, $indexdir) || die "Couldn't open directory $indexdir\n\n";
+    my @conts = readdir DIR;
+    close DIR;
+
+    foreach $file (@conts) {
+	if ($file =~ /text$/) {
+	    $textdir = $file;
+	    last;
+	}
+    }
+    die "No text directory found in $indexdir\n\n" 
+	unless defined $textdir && $textdir =~ /text$/;
+
+    $gdbmfile = &util::filename_cat ($indexdir, $textdir);
+
+    opendir (DIR, $gdbmfile) || die "Couldn't open directory $gdbmfile\n\n";
+    @conts = readdir DIR;
+    close DIR;
+
+    foreach $file (@conts) {
+	if ($file =~ /^(.*?)\.(?:ldb|bdb)$/) {
+	    $collection = $1;
+	    $gdbmfile = &util::filename_cat ($gdbmfile, $file);
+	    last;
+	}
+    }
+    
+    if (defined $collection && $collection =~ /\w/) {
+	$textdir = &util::filename_cat ($textdir, $collection);
+    } else {
+	die "collection global wasn't set\n";
+    }
+    return $gdbmfile if (-e $gdbmfile);
+    die "Couldn't find gdbm info database in $indexdir\n\n";
+}
+
+sub get_classinfo {
+    my ($gdbmfile) = @_;
+    my ($class);
+
+    open (DB2TXT, "db2txt $gdbmfile |") || die "couldn't open pipe to db2txt\n";
+
+    print STDERR "Generating classification table from $gdbmfile\n" if $verbosity >= 2;
+    my $count = 0;
+
+    $/ = '-' x 70;
+    my $entry = "";
+    while (defined ($entry = <DB2TXT>)) {
+	next unless $entry =~ /\w/;
+	$entry =~ s/\n+/\\n/g;
+	my ($key, $value) = $entry =~ /\[([^\]]*)\](.*)/;
+
+	print STDERR "." if (($count % 100) == 99 && $verbosity >= 2);
+
+	next if ($key !~ /\./); # ignore the docnums and top level of classifications
+
+	die "Badly formatted key $key in $gdbmfile\n\n" 
+	    unless (($class, $section) = $key =~ /^(.)\.(.*)$/);	
+	$classinfo->{$class} = {} unless defined $classinfo->{$class};
+	my @sections = split /\./, $section;
+
+	my $hashptr = $classinfo->{$class};
+	foreach $sec (@sections) {
+	    $hashptr->{$sec} = {} unless defined $hashptr->{$sec};
+	    $hashptr = $hashptr->{$sec};
+	}
+	&get_metadata ($key, \$value, $hashptr);
+
+	$count ++;
+    }
+
+    $/ = "\n";
+    print STDERR "\n" if $verbosity >= 2;
+}
+
+sub get_metadata {
+    my ($key, $gdb_str_ref, $hashsection) = @_;
+    
+    my ($title) = $$gdb_str_ref =~ /(?:<t>|<title>)(.*?)(?:\\n|$)/i; 
+    my ($docnum) = $$gdb_str_ref =~ /(?:<d>|<docnum>)(.*?)(?:\\n|$)/i; 
+    my ($jobnum) = $$gdb_str_ref =~ /(?:<j>|<jobnumber>)(.*?)(?:\\n|$)/i; 
+    my ($classifications) = $$gdb_str_ref =~ /(?:<x>|<classification>)(.*?)(?:\\n|$)/i; 
+    my $hastext = 1;
+    $hastext = 0 if ($$gdb_str_ref =~ /(?:<c>|<contains>)(.*?)(?:\\n|$)/i);
+    my ($creator) = $$gdb_str_ref =~ /<a>(.*?)(?:\\n|$)/i; 
+    my ($date) = $$gdb_str_ref =~ / <i>(.*?)(?:\\n|$)/i; 
+			
+    # just in case there are empty classifications			     
+    if ($hastext && !defined $docnum) {
+	print STDERR "\nwarning: $key entry has no contents\n" if $verbosity;
+	if ($verbosity >= 2) {
+	    my $valuestr = $$gdb_str_ref;
+	    $valuestr =~ s/\\n/\n/g;
+	    print STDERR "$valuestr\n";
+	}
+	$hastext = 0;
+    }
+
+    # shove metadata in 9999999 to keep it numeric and prevent 
+    # sorting from being a pain. Watch out for documents with
+    # 9999999 subsections ;-)
+    if (defined $hashsection->{'9999999'}) {
+	print STDERR "\nwarning: $key appears multiple times\n" if $verbosity;
+    } else {
+	$hashsection->{'9999999'}->{'Title'} = $title if defined $title;
+	$hashsection->{'9999999'}->{'docnum'} = $docnum if defined $docnum;
+	$hashsection->{'9999999'}->{'jobnum'} = $jobnum if defined $jobnum;
+	$hashsection->{'9999999'}->{'classifications'} = $classifications if defined $classifications;
+	$hashsection->{'9999999'}->{'hastext'} = $hastext;
+	$hashsection->{'9999999'}->{'Creator'} = $creator if defined $creator;
+	$hashsection->{'9999999'}->{'Date'} = $date if defined $date;
+    }
+}
+
+sub recurse_classinfo {
+    my ($doc_obj, $hashsection, $cursection, $class) = @_;
+    foreach $section (sort numerically keys %$hashsection) {
+	next if $section == 9999999;
+	if ($class) {
+	    $doc_obj->create_named_section("$class.$section");
+	    &add_section_content ($doc_obj, "$class.$section", $hashsection->{$section});
+	    &recurse_classinfo ($doc_obj, $hashsection->{$section}, "", "$class.$section");
+	} else {
+	    $cursection = 
+		$doc_obj->insert_section($doc_obj->get_end_child($doc_obj->get_parent_section($cursection)));
+	    &add_section_content ($doc_obj, $cursection, $hashsection->{$section});
+	    &recurse_classinfo ($doc_obj, $hashsection->{$section}, $doc_obj->get_end_child($cursection));
+	}
+    }
+}
+
+sub add_section_content {
+    my ($doc_obj, $cursection, $hashsection) = @_;
+
+    $doc_obj->add_metadata ($cursection, "Title", $hashsection->{'9999999'}->{'Title'})
+	if defined $hashsection->{'9999999'}->{'Title'};
+    $doc_obj->add_metadata ($cursection, "Creator", $hashsection->{'9999999'}->{'Creator'})
+	if defined $hashsection->{'9999999'}->{'Creator'};
+    $doc_obj->add_metadata ($cursection, "Date", $hashsection->{'9999999'}->{'Date'})
+	if defined $hashsection->{'9999999'}->{'Date'};
+
+    if (defined $hashsection->{'9999999'}->{'classifications'}) {
+	my @classifications = split /:/, $hashsection->{'9999999'}->{'classifications'};
+	map {$doc_obj->add_metadata ($cursection, 'Subject', $_); } @classifications;
+    }
+
+    $doc_obj->add_text ($cursection, &get_text ($hashsection->{'9999999'}->{'docnum'}))
+	if ($hashsection->{'9999999'}->{'hastext'});
+}
+
+sub set_index {
+    # check that $collection has been set
+    die "collection global was not set\n"
+	unless defined $collection && $collection =~ /\w/;
+
+    # find an index (just use first non-text directory we come across in $indexdir)
+    opendir (INDEXDIR, $indexdir) || die "couldn't open directory $indexdir\n";
+    my @indexes = readdir INDEXDIR;
+    close INDEXDIR;
+    foreach $i (@indexes) {
+	next if $i =~ /text$/i || $i =~ /\./ ;
+	$index = &util::filename_cat ($i, $collection);
+	last;
+    }
+}
+
+sub get_text {
+    my ($docnum) = @_;
+
+    print STDERR "." if $verbosity >= 2;
+    &mgcommand ($docnum);
+
+    <$mgread>;	# eat the document separator
+
+    my $text = "";
+    my $line = "";
+
+    while (defined ($line = <$mgread>))
+    {
+	last if $line =~ /^<\/mg>/;
+	$text .= $line;
+    }
+
+    # Read in the last statement, which should be:
+    #  "dd documents retrieved."
+    <$mgread>;
+
+    return $text;
+}
+
+sub numerically {$a <=> $b;}
+
+# converts leading letter of a classification into its ascii equivalent
+# i.e C.2.4 becomes 67.2.4
+sub int_classification {
+    my ($classification) = @_;
+    my $c = ord($classification);
+    $classification =~ s/^./$c/;
+
+    return $classification;
+}
+
+
+# mg stuff
+
+sub openmg {
+    
+    die "Unable to start mgquery." unless
+	openpipe($mgread, $mgwrite,
+		 "mgquery -d $indexdir -f $index -t $textdir");
+
+    $mgwrite->autoflush();
+
+    &mgcommand('.set expert true');
+    &mgcommand('.set terminator "</mg>\n"');
+    &mgcommand('.set mode text');
+    &mgcommand('.set query docnums');
+    &mgcommand('.set term_freq off');
+}
+
+sub closemg {
+    &mgcommand (".quit");
+    close($mgread);
+    close($mgwrite);
+}
+
+sub mgcommand {
+    my ($command) = @_;
+
+    return if $command =~ /^\s*$/;
+    print $mgwrite "$command\n";
+
+    # eat up the command executed which is echoed
+    <$mgread>;
+}
+
+# openpipe(READ, WRITE, CMD)
+# 
+# Like open2, except CMD's stderr is also redirected.
+# 
+sub openpipe
+{
+    my ($read, $write, $cmd) = @_;
+    my ($child_read, $child_write);
+
+    $child_read = ++$FileHandle;
+    $child_write = ++$FileHandle;
+
+    pipe($read, $child_write) || die "Failed pipe($read, $child_write): $!";
+    pipe($child_read, $write) || die "Failed pipe($child_read, $write): $!";
+    my $pid;
+
+    if (($pid = fork) < 0) {
+        die "Failed fork: $!";
+    } elsif ($pid == 0) {
+        close($read);
+        close($write);
+        open(STDIN, "<&$child_read");
+        open(STDOUT, ">&$child_write");
+        open(STDERR, ">&$child_write");
+        exec($cmd);
+        die "Failed exec $cmd: $!";
+    }
+
+    close($child_read);
+    close($child_write);
+
+    $write->autoflush();
+    $read->autoflush();
+
+    return 1;
+}
Index: /main/tags/2.38/gsdl/bin/script/update.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/update.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/update.pl	(revision 21083)
@@ -0,0 +1,198 @@
+#!/usr/bin/perl -w
+
+###########################################################################
+#
+# update.pl
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 program updates any collections that are based on mirrors of
+# web sites after a certain interval.  It first checks that the
+# collection is a mirrored collection and whether it is time to 
+# update the collection.  If so, it updates the mirror with 
+# mirror.pl; then imports the collection with import.pl; then 
+# builds the collection with buildcol.pl; then replaces the 
+# existing index directory with the new building directory.
+# The etc/mirror.log file stores the STDOUT output.
+
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    die "GSDLOS not set\n" unless defined $ENV{'GSDLOS'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/plugins");
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/classify");
+}
+
+use arcinfo;
+use colcfg;
+use plugin;
+use docprint;
+use util;
+use parsargv;
+
+sub print_usage {
+    print STDERR "\n";
+    print STDERR "update.pl: Updates a collection if it has been set up to mirror\n";
+    print STDERR "           a website. Calls mirror.pl to do the mirroring.\n\n";
+    print STDERR "  usage: $0 [options] collection-name\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -verbosity number      0=none, 3=lots\n";
+    print STDERR "   -importdir directory   Where to place the mirrored material\n";
+    print STDERR "   -archivedir directory  Where the converted material ends up\n";
+}
+
+
+&main ();
+
+sub main {
+    my ($verbosity, $importdir, $archivedir, $builddir, $indexdir, $etcdir, 
+	$mirror, $interval, $logfile,
+        $collection, $configfilename, $collectcfg);
+
+    if (!parsargv::parse(\@ARGV, 
+			 'verbosity/\d+/2', \$verbosity,
+			 'importdir/.*/', \$importdir,
+			 'archivedir/.*/', \$archivedir )) {
+	&print_usage();
+	die "\n";
+    }
+
+    # get and check the collection name
+    if (($collection = &util::use_collection(@ARGV)) eq "") {
+	&print_usage();
+	die "\n";
+    }
+
+    # check the configuration file for options
+    $configfilename = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "etc/collect.cfg");
+    if (-e $configfilename) {
+	$collectcfg = &colcfg::read_collect_cfg ($configfilename);
+	if (defined $collectcfg->{'importdir'} && $importdir eq "") {
+	    $importdir = $collectcfg->{'importdir'};
+	}
+	if (defined $collectcfg->{'archivedir'} && $archivedir eq "") {
+	    $archivedir = $collectcfg->{'archivedir'};
+	}
+	if (defined $collectcfg->{'mirror'}) {
+	    $mirror = $collectcfg->{'mirror'};
+	}
+    } else {
+	die "Couldn't find the configuration file $configfilename\n";
+    }
+    
+    # fill in the default import and archives directories if none
+    # were supplied, turn all \ into / and remove trailing /
+    $importdir = "$ENV{'GSDLCOLLECTDIR'}/import" if $importdir eq "";
+    $importdir =~ s/[\\\/]+/\//g;
+    $importdir =~ s/\/$//;
+    $archivedir = "$ENV{'GSDLCOLLECTDIR'}/archives" if $archivedir eq "";
+    $archivedir =~ s/[\\\/]+/\//g;
+    $archivedir =~ s/\/$//;
+
+    $indexdir = "$ENV{'GSDLCOLLECTDIR'}/index";
+    $builddir = "$ENV{'GSDLCOLLECTDIR'}/building";
+    $etcdir = "$ENV{'GSDLCOLLECTDIR'}/etc";
+    $logfile = "$etcdir/mirror.log";
+
+    # if there is no mirror information, we're all done
+    if (!defined($mirror)) {
+	print "No mirror command in $configfilename\n";
+	exit;
+    }
+
+    # read the mirror interval
+    if (($#$mirror == 1) && ($$mirror[0] =~ /interval/)){
+	$interval = $$mirror[1];
+    } else {
+	die "Malformed mirror information: use \"mirror interval N\"\n" .
+	    "where N is the number of days between mirrors.\n";
+    }
+
+    # make sure there is an import directory
+    if (! -e "$importdir") {
+	&util::mk_dir($importdir);
+    }
+
+    print "archives directory: $archivedir\n";
+    print "  import directory: $importdir\n";
+    print "     etc directory: $etcdir\n";
+    print "          interval: $interval days\n";
+
+    # how many days is it since the last mirror
+    my $seconds = 0;
+    if (-e "$logfile") {
+	my $now = time;
+	my @stats = stat("$logfile");
+	my $then = $stats[9];
+	# calculate the number of days since the last mirror
+	$seconds = $now - $then;
+    }
+    my $days = (($seconds / 3600) / 24);
+
+    # Is it too soon to start mirroring?
+    if (($seconds > 0) && ($interval > $days)) {
+	printf "Mirror not started: only %.1f days have passed\n", $days;
+	exit;
+    }
+    
+    # Mirror the remote site
+    open(WLOG, ">$logfile");
+    print WLOG "Starting mirror at " . time . "\n\n";
+    
+    my $command = "mirror.pl $collection";
+    print WLOG "Executing: $command\n";
+    print WLOG `$command`;
+    
+    # Import the collection
+    print WLOG "\n\nStarting import at " . time . "\n\n";
+    $command = "import.pl -removeold $collection";
+    print WLOG "Executing: $command\n";
+    print WLOG `$command`;
+
+    # Build the collection
+    print WLOG "\n\nStarting buildcol.pl at " . time . "\n\n";
+    $command = "buildcol.pl $collection";
+    print WLOG "Executing: $command\n";
+    print WLOG `$command`;
+
+    # Renaming the building directory to index
+    print WLOG "\n\nRenaming building directory at " . time . "\n\n";
+    if (-e $indexdir) {
+	&util::mv($indexdir, "$indexdir.old");
+	&util::mv($builddir, $indexdir);
+	&util::rm_r ("$indexdir.old");
+    } else {
+	&util::mv($builddir, $indexdir);
+    }
+
+
+    close WLOG;
+    
+}
+
+
+
+
+
Index: /main/tags/2.38/gsdl/bin/script/xlstohtml.pl
===================================================================
--- /main/tags/2.38/gsdl/bin/script/xlstohtml.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/bin/script/xlstohtml.pl	(revision 21083)
@@ -0,0 +1,69 @@
+eval 'exec perl -x -- $0 $@'
+    if 0;
+#! perl
+# line 6
+
+sub usage() {
+    print "$0 <input.xls> <output.html>\n";
+}
+
+
+if (@ARGV != 2) {
+    usage();
+    exit(1);
+}
+my $input_xls=shift;
+my $output_html=shift;
+
+# try to find xlhtml binary in GSDLHOME
+my $xlhtml_binary="xlhtml";
+my $GSDLOS=$ENV{'GSDLOS'};
+my $GSDLHOME=$ENV{'GSDLHOME'};
+if ($GSDLOS =~ /^windows/i) {
+    $xlhtml_binary.=".exe";
+}
+
+# Trouble happens if there are spaces in GSDLHOME. Assume that on windows
+# the program is found in the path.
+if ($GSDLOS !~ /windows/i && -x "$GSDLHOME/bin/$GSDLOS/$xlhtml_binary") {
+    $xlhtml_binary="$GSDLHOME/bin/$GSDLOS/$xlhtml_binary";
+}
+
+if (! -r $input_xls) {
+    print STDERR "Unable to read file `$input_xls'\n";
+    exit (1);
+}
+
+my $return_value=
+    system("$xlhtml_binary \"$input_xls\" > \"$output_html\"");
+
+if ($return_value != 0) {
+    exit (1);
+}
+
+# Ok, we made an html file. Check to see if it has any content, and remove
+# the little nag link at the the bottom.
+my $html="";
+open (HTML, "$output_html") || die "Can't read file:$!";
+$html=join('', <HTML>);
+close HTML;
+
+$html =~ s@<hr><FONT SIZE=-1>Created with.*\n</BODY></HTML>$@</BODY></HTML>@s;
+
+# xlHtml uses the filename as the title.
+# HTMLPlug will use the first 100 chars instead if there's no title.
+# Don't know if that's a good idea with a spreadsheet, though...
+$html =~ s@<title>.*?\.xls</title>@<title></title>@i;
+
+my $tmp=$html;
+$tmp =~ s/^.*?<BODY>//ms;
+$tmp =~ s/(&nbsp;)|\s//gims;
+if ($tmp !~ m/(>[^<]+<)/) {
+    print STDERR "No text found in extracted html file!\n";
+    exit(1);
+}
+open (NEWHTML, ">$output_html") || die "Can't create file:$!";
+print NEWHTML $html;
+close NEWHTML;
+exit (0);
+
Index: /main/tags/2.38/gsdl/cgi-bin/getior
===================================================================
--- /main/tags/2.38/gsdl/cgi-bin/getior	(revision 21083)
+++ /main/tags/2.38/gsdl/cgi-bin/getior	(revision 21083)
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+echo "Content-type: text/html";
+echo
+
+cat /tmp/localcorba.objid               
Index: /main/tags/2.38/gsdl/cgi-bin/gsdlsite.cfg
===================================================================
--- /main/tags/2.38/gsdl/cgi-bin/gsdlsite.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/cgi-bin/gsdlsite.cfg	(revision 21083)
@@ -0,0 +1,28 @@
+# this file should be placed in the same directory as your library
+# executable file. it should be edited to suit your site.
+
+# points to the GSDLHOME directory
+gsdlhome    **GSDLHOME**
+
+# this is the http address of GSDLHOME
+# if your webservers DocumentRoot is set to $GSDLHOME
+# then httpprefix can remain commented out
+#httpprefix  /gsdl
+
+# this is the http address of the directory which
+# contains the images for the interface.
+# if your webservers DocumentRoot is set to $GSDLHOME
+# then httpimg will be /images
+httpimg     /images
+
+# should contain the http address of this cgi script. This 
+# is not needed if the http server sets the environment variable 
+# SCRIPT_NAME
+#gwcgi       /cgi-bin/library
+
+# maxrequests is the most requests a fastcgi process
+# will serve before it exits. This can be set to a
+# low figure (like 1) while debugging and then set
+# to a high figure (like 10000) when everything is
+# working well.
+maxrequests 10000
Index: /main/tags/2.38/gsdl/collect/demo/etc/AZList.txt
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/etc/AZList.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/etc/AZList.txt	(revision 21083)
@@ -0,0 +1,1 @@
+T.1 1 "A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z"
Index: /main/tags/2.38/gsdl/collect/demo/etc/keyword.txt
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/etc/keyword.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/etc/keyword.txt	(revision 21083)
@@ -0,0 +1,6 @@
+"introduce small animals and micro-livestock in your farm" 1 "introduce small animals and micro-livestock in your farm"
+"introduce little-known Asian farm animals with a promising future" 2 "introduce little-known Asian farm animals with a promising future"
+"utilize the Water Buffalo more effectively" 3 "utilize the Water Buffalo more effectively"
+"start a butterfly farm" 4 "start a butterfly farm"
+"farm snails" 5 "farm snails"
+"achieve gender equality" 6 "achieve gender equality"
Index: /main/tags/2.38/gsdl/collect/demo/etc/org.txt
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/etc/org.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/etc/org.txt	(revision 21083)
@@ -0,0 +1,16 @@
+"ACCU" 1 "ACCU"
+"Agenda 21" 2 "Agenda 21"
+"Alkire" 3 "Alkire"
+"BOSTID" 4 "BOSTID"
+"Chandra" 5 "Chandra"
+"CPS" 6 "CPS"
+"EC Courier" 7 "EC Courier"
+"FAO" 8 "FAO"
+"FAO Better Farming series" 9 "FAO Better Farming series"
+"Habitat" 10 "Habitat"
+"Inforse" 11 "Inforse"
+"International Institute for Rural Reconstruction" 12 "International Institute for Rural Reconstruction"
+"NGLS" 13 "NGLS"
+"Peace Corps" 14 "Peace Corps"
+"UNESCO" 15 "UNESCO"
+"World Bank" 16 "World Bank"
Index: /main/tags/2.38/gsdl/collect/demo/etc/sub.txt
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/etc/sub.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/etc/sub.txt	(revision 21083)
@@ -0,0 +1,102 @@
+"Industry, Manufacture and Services" 1 "Industry, Manufacture and Services"
+"Small- scale industry, handicraft, home industry" 1.1 "Small- scale industry, handicraft, home industry"
+"Metal industry" 1.2 "Metal industry"
+"Forging and blacksmithing" 1.2.1 "Forging and blacksmithing"
+"Energy , Renewable energies, Household energy" 2 "Energy , Renewable energies, Household energy"
+"Energy and power (general works) incl. energy per country, energy savings, etc." 2.1 "Energy and power (general works) incl. energy per country, energy savings, etc."
+"Wood and charcoal (incl. kilns and activated charcoal)" 2.2 "Wood and charcoal (incl. kilns and activated charcoal)"
+"Bio-mass (general works)" 2.3 "Bio-mass (general works)"
+"Cookstoves, Fuel-saving cookstoves, Household Energy" 2.4 "Cookstoves, Fuel-saving cookstoves, Household Energy"
+"Biogas (incl. biogas equipment)" 2.5 "Biogas (incl. biogas equipment)"
+"Water, Sanitation and Sewage Disposal" 3 "Water, Sanitation and Sewage Disposal"
+"Pumps and other water- lifting devices" 3.1 "Pumps and other water- lifting devices"
+"Hydraulic structures (dams, intakes, wells, ponds, cisterns)" 3.2 "Hydraulic structures (dams, intakes, wells, ponds, cisterns)"
+"Water treatment and purification (biological, chemical, physical)" 3.3 "Water treatment and purification (biological, chemical, physical)"
+"Ecology, Biodiversity, Natural resources, Environment, Waste Disposal" 4 "Ecology, Biodiversity, Natural resources, Environment, Waste Disposal"
+"Resources conservation, environmental protection, biodiversity" 4.1 "Resources conservation, environmental protection, biodiversity"
+"Nature reserve, game reserve" 4.1.1 "Nature reserve, game reserve"
+"Biodiversity conservation" 4.2 "Biodiversity conservation"
+"Plant and Crop Production, Protection, and Processing" 5 "Plant and Crop Production, Protection, and Processing"
+"Plant/crop production and processing, vegetable gardening, botany" 5.1 "Plant/crop production and processing, vegetable gardening, botany"
+"Cereals (rice, corn/maize, millet, sorghum, wheat, etc.)" 5.2 "Cereals (rice, corn/maize, millet, sorghum, wheat, etc.)"
+"Other plants/crops, intercropping" 5.3 "Other plants/crops, intercropping"
+"Fishery and Aquaculture" 6 "Fishery and Aquaculture"
+"Fishery and aquaculture (general works), fishery resources" 6.1 "Fishery and aquaculture (general works), fishery resources"
+"Fishing techniques and equipment" 6.2 "Fishing techniques and equipment"
+"Aquaculture, fish farming, fish production (fish ponds, feeding, etc.)" 6.3 "Aquaculture, fish farming, fish production (fish ponds, feeding, etc.)"
+"Politics, Public administration, Law and Legislation, Peace, Human Rights" 7 "Politics, Public administration, Law and Legislation, Peace, Human Rights"
+"Public administration, Tasks of councillors" 7.1 "Public administration, Tasks of councillors"
+"Health, Nutrition, Medicine" 8 "Health, Nutrition, Medicine"
+"Health (general works, incl. health economics and sociology, health statistics, health and community development)" 8.1 "Health (general works, incl. health economics and sociology, health statistics, health and community development)"
+"Family health,  Mother and Child care, Family planning, Pregnancy and Childbirth" 8.2 "Family health,  Mother and Child care, Family planning, Pregnancy and Childbirth"
+"Community Health, Health Care Delivery, Extension workers and training" 8.3 "Community Health, Health Care Delivery, Extension workers and training"
+"Food, Nutrition and Malnutrition" 8.4 "Food, Nutrition and Malnutrition"
+"Community Health, Health Care Delivery, Extension workers and training" 8.4.1 "Community Health, Health Care Delivery, Extension workers and training"
+"Medicine, Clinical Care, Diseases, Hygiene, Emergencies (treatment of specific diseases, injuries, accidents)" 8.5 "Medicine, Clinical Care, Diseases, Hygiene, Emergencies (treatment of specific diseases, injuries, accidents)"
+"Health Education, Promotion, Prevention, AIDS Prevention, Safety, Books covering multiple health dimensions" 8.6 "Health Education, Promotion, Prevention, AIDS Prevention, Safety, Books covering multiple health dimensions"
+"Sustainable Development, International cooperation, Projects; NGO, Organizations, Poverty and Hunger Alleviation, Basic Human Needs" 9 "Sustainable Development, International cooperation, Projects; NGO, Organizations, Poverty and Hunger Alleviation, Basic Human Needs"
+"Project planning and evaluation (incl. project management and dissemination strategies)" 9.1 "Project planning and evaluation (incl. project management and dissemination strategies)"
+"Basic Human Needs" 9.2 "Basic Human Needs"
+"Nongovernmental organizations (NGOs) in general, self- help organizations (their role in development). " 9.3 "Nongovernmental organizations (NGOs) in general, self- help organizations (their role in development). "
+"United Nations" 9.4 "United Nations"
+"Sustainable Development, Development models and examples; Best practices (general)" 9.5 "Sustainable Development, Development models and examples; Best practices (general)"
+"Society, Culture, Community, Woman, Youth, Population" 10 "Society, Culture, Community, Woman, Youth, Population"
+"Society, social structure, social change, social services, social movements, social groups, Minorities" 10.1 "Society, social structure, social change, social services, social movements, social groups, Minorities"
+"Children and youth (youth centres)" 10.2 "Children and youth (youth centres)"
+"Community development, community organizing" 10.3 "Community development, community organizing"
+"Demography and population" 10.4 "Demography and population"
+"Women, gender and development, women&apos;s organizations" 10.5 "Women, gender and development, women&apos;s organizations"
+"Social sciences, sociology (works comprising several subgroups) incl. participatory research and training" 10.6 "Social sciences, sociology (works comprising several subgroups) incl. participatory research and training"
+"Education and Training" 11 "Education and Training"
+"Early education, Primary education, Secondary education" 11.1 "Early education, Primary education, Secondary education"
+"Teaching methods and aids" 11.2 "Teaching methods and aids"
+"Adult education, Literacy training" 11.3 "Adult education, Literacy training"
+"Health Education and Training (see under health and Nutrition)" 11.4 "Health Education and Training (see under health and Nutrition)"
+"Environmental education, Global education, Psychological and assertiveness education, Non-formal education etc" 11.5 "Environmental education, Global education, Psychological and assertiveness education, Non-formal education etc"
+"Vocational, professional and practical training - for specific training- curricula, textbooks- see specific subject." 11.6 "Vocational, professional and practical training - for specific training- curricula, textbooks- see specific subject."
+"Communication, Information and Documentation" 12 "Communication, Information and Documentation"
+"Information for development, Information transfer, Information policy" 12.1 "Information for development, Information transfer, Information policy"
+"Communication, telecommunication, mass communication, mass media, film-making" 12.2 "Communication, telecommunication, mass communication, mass media, film-making"
+"Documentation, Library science and management" 12.3 "Documentation, Library science and management"
+"Records and Archives Management Programme (RAMP) of  UNESCO, Archive Management" 12.4 "Records and Archives Management Programme (RAMP) of  UNESCO, Archive Management"
+"Agriculture and Food Processing" 13 "Agriculture and Food Processing"
+"Food processing and preservation" 13.1 "Food processing and preservation"
+"Food drying (all kinds)" 13.1.1 "Food drying (all kinds)"
+"Irrigation and drainage" 13.2 "Irrigation and drainage"
+"Agriculture (general works), Economics,  Policies, Development, Research, Management" 13.3 "Agriculture (general works), Economics,  Policies, Development, Research, Management"
+"Soil and land management, improvement and treatment" 13.4 "Soil and land management, improvement and treatment"
+"Agricultural production systems (shifting cultivation, wet- land farming, dry- land farming, agroforestry)" 13.5 "Agricultural production systems (shifting cultivation, wet- land farming, dry- land farming, agroforestry)"
+"Organic farming, Eco-farming" 13.6 "Organic farming, Eco-farming"
+"Land reform, Settlements, Rural Development and related topics" 13.7 "Land reform, Settlements, Rural Development and related topics"
+"Better Farming series of FAO and INADES - 46 booklets" 13.8 "Better Farming series of FAO and INADES - 46 booklets"
+"Storage and packaging of agricultural products, Post-Harvest management" 13.9 "Storage and packaging of agricultural products, Post-Harvest management"
+"Fertilization and composting" 13.10 "Fertilization and composting"
+"Animal Husbandry and Animal Product Processing" 14 "Animal Husbandry and Animal Product Processing"
+"Animal traction (excl. implements), animal training" 14.1 "Animal traction (excl. implements), animal training"
+"Veterinary medicine, animal diseases" 14.2 "Veterinary medicine, animal diseases"
+"Poultry, ducks and other birds" 14.3 "Poultry, ducks and other birds"
+"Animal husbandry (general,works) incl. animal feed, works covering several aspects and animals, zoology" 14.4 "Animal husbandry (general,works) incl. animal feed, works covering several aspects and animals, zoology"
+"Cattle" 14.5 "Cattle"
+"Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)" 14.6 "Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)"
+"Beekeeping and honey extraction" 14.7 "Beekeeping and honey extraction"
+"Rabbits and guinea pigs" 14.8 "Rabbits and guinea pigs"
+"Settlements, Housing, Building - Infrastructure Construction (Roads etc)" 15 "Settlements, Housing, Building - Infrastructure Construction (Roads etc)"
+"Architecture and Building design" 15.1 "Architecture and Building design"
+"Urban settlements (urban housing programmes, urbanization, squatters, slums, slum improvement)" 15.2 "Urban settlements (urban housing programmes, urbanization, squatters, slums, slum improvement)"
+"Settlements and housing: general works incl. low- cost housing, planning techniques, surveying, etc." 15.3 "Settlements and housing: general works incl. low- cost housing, planning techniques, surveying, etc."
+"Building and construction (building components, construction techniques)" 15.4 "Building and construction (building components, construction techniques)"
+"Development Periodicals and Magazines" 16 "Development Periodicals and Magazines"
+"Sustainable Energy Newsletters of the INFORSE network" 16.1 "Sustainable Energy Newsletters of the INFORSE network"
+"The Courier ACP 1990 - 1996 Africa-Caribbean-Pacific - European Union" 16.2 "The Courier ACP 1990 - 1996 Africa-Caribbean-Pacific - European Union"
+"The NGLS Magazine Go Between" 16.3 "The NGLS Magazine Go Between"
+"Business, Micro-entreprises, Management, Marketing, Finance, Microfinance, Cooperatives" 17 "Business, Micro-entreprises, Management, Marketing, Finance, Microfinance, Cooperatives"
+"Cooperatives, cooperative movement" 17.1 "Cooperatives, cooperative movement"
+"Housing cooperatives" 17.1.1 "Housing cooperatives"
+"Finance and microfinance / microcredit" 17.2 "Finance and microfinance / microcredit"
+"Microeconomic planning techniques, Micro-enterprises" 17.3 "Microeconomic planning techniques, Micro-enterprises"
+"Accounting" 17.4 "Accounting"
+"Forestry and Agroforestry" 18 "Forestry and Agroforestry"
+"Reforestation - for erosion control see 11.04 and 14.05" 18.1 "Reforestation - for erosion control see 11.04 and 14.05"
+"Cultivation and conservation (nurseries), protection and pest resistance" 18.2 "Cultivation and conservation (nurseries), protection and pest resistance"
+"Specific trees and other forestry plants (incl. bamboo)" 18.3 "Specific trees and other forestry plants (incl. bamboo)"
+"Agroforestry" 18.4 "Agroforestry"
Index: /main/tags/2.38/gsdl/collect/demo/etc/title.txt
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/etc/title.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/etc/title.txt	(revision 21083)
@@ -0,0 +1,3 @@
+"A-E"        1  "A-E"
+"F-Z"        2  "F-Z"
+"Magazines"  3  "Magazines"
Index: /main/tags/2.38/gsdl/collect/demo/import/b17mie/b17mie.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/b17mie/b17mie.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/b17mie/b17mie.htm	(revision 21083)
@@ -0,0 +1,7650 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Microlivestock -  Little-Known Small Animals with a Promising Economic Future</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Microlivestock -  Little-Known Small Animals with a Promising Economic Future</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Acknowledgments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Board on Science and Tecnology for International Development </P>
+<P ALIGN="JUSTIFY">National Research Council</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOTICE: The project that is the subject of this report was approved by the Governing Board of the National Research Council, whose members are drawn from the councils of the National Academy of Sciences, the National Academy of Engineering, and the Institute of Medicine. The members of the committee responsible for the report were chosen for their special competence and with regard for appropriate balance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been reviewed by a group other than the authors according to procedures approved by a Report Review Committee consisting of members of the National Academy of Sciences, the National Academy of Engineering, and the Institute of Medicine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The National Academy of Sciences is a private, nonprofit, self-perpetuating society of distinguished scholars engaged in scientific and engineering research, dedicated to the furtherance of science and technology and to their use for the general welfare. Upon the authority of the charter granted to it by the Congress in 1863, the Academy has a mandate that requires it to advise the federal government on scientific and technical matters. Dr. Frank Press is president of the National Academy of Sciences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The National Academy of Engineering was established in 1964, under the charter of the National Academy of Sciences, as a parallel organization of outstanding engineers. It is autonomous in its administration and in the selection of its members, sharing with the National Academy of Sciences the responsibility for advising the federal government. The National Academy of Engineering also sponsors engineering programs aimed at meeting national needs, encourages education and research, and recognizes the superior achievements of engineers. Dr. Robert M. White is president of the National Academy of Engineering.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Institute of Medicine was established in 1970 by the National Academy of Sciences to secure the services of eminent members of appropriate professions in the examination of policy matters pertaining to the health of the public. The Institute acts under the responsibility given to the National Academy of Sciences by its congressional charter to be an adviser to the federal government and, upon its own initiative, to identify issues of medical care, research, and education. Dr. Samuel O. Their is president of the Institute of Medicine.</P>
+<P ALIGN="JUSTIFY">The National Research Council was organized by the National Academy of Sciences in 1916 to associate the broad community of science and technology with the Academy's purposes of furthering knowledge and advising the federal government. Functioning in accordance with general policies determined by the Academy, the Council has become the principal operating agency of both the National Academy of Sciences and the National Academy of Engineering in providing services to the government, the public, and the scientific and engineering communities. The Council is administered jointly by both Academies and the Institute of Medicine. Dr. Frank Press and Dr. Robert M. White are chairman and vice chairman, respectively, of the National Research Council.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Board on Science and Technology for International Development (BOSTID) of the Office of International Affairs addresses a range of issues arising from the ways in which science and technology in developing countries can stimulate and complement the complex processes of social and economic development. It oversees a broad program of bilateral workshops with scientific organizations in developing countries and conducts special studies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report was prepared by an ad hoc advisory panel of the Advisory Committee on Technology Innovation, Board on Science and Technology for International Development, Office of International Affairs, National Research Council. Staff support was funded by the Office of the Science Advisor, Agency for International Development, under Grant No. DAN-5538-G-SS-1023-00. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PANEL ON MICROLIVESTOCK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH W. PHILLIPS, Deputy Director General (Retired), Food and Agriculture Organization of the United Nations, Chairman </P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Senior Advisor to the President, African Development Bank, Abidjan, Ivory Coast.</P>
+<P ALIGN="JUSTIFY">BONNIE V. BEAVER, Professor of Veterinary Medicine, Department of Small Animal Medicine and Surgery, Texas A&amp;M University, College Station, Texas, USA</P>
+<P ALIGN="JUSTIFY">KURT BENIRSCHKE, Professor of Pathology and Reproductive Medicine, University of California-San Diego, San Diego, California, USA</P>
+<P ALIGN="JUSTIFY">ROY D. CRAWFORD, Professor of Animal and Poultry Genetics, Department of Animal and Poultry Science, University of Saskatchewan, Saskatoon, Saskatchewan, Canada</P>
+<P ALIGN="JUSTIFY">TONY J. CUNHA, Distinguished Service Professor Emeritus, University of Florida, Gainesville, and Dean Emeritus, School of Agriculture, California Polytechnic University, Pomona, California, USA</P>
+<P ALIGN="JUSTIFY">DAVID E. DEPPNER, Director, New Forest Project, International Center, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY">ELIZABETH L. HENSON, Executive Director, American Minor Breeds Conservancy, Pittsboro, North Carolina, USA</P>
+<P ALIGN="JUSTIFY">DONALD L. HUSS, Menard, Texas, USA (Formerly Regional Animal Production Officer, FAO, Santiago, Chile)</P>
+<P ALIGN="JUSTIFY">DAVID R. LINCICOME, Guest Scientist, U.S. Department of Agriculture, Beltsville, Maryland, USA</P>
+<P ALIGN="JUSTIFY">THOMAS E. LOVEJOY, Assistant Secretary for External Affairs, Smithsonian Institution, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY">ARNE W. NORDSKOG, Professor Emeritus, Department of Animal Science, Iowa State University, Ames, Iowa, USA</P>
+<P ALIGN="JUSTIFY">LINDA M. PANEPINTO, Director, Miniature Swine Laboratory, Colorado State University, Fort Collins, Colorado, USA</P>
+<P ALIGN="JUSTIFY">KURT J. PETERS, Professor of Animal Breeding and Husbandry in the Tropics and Subtropics, University of Gottingen, Gottingen, West Germany, and Director of Research, International Livestock Centre for Africa, Addis Ababa, Ethiopia</P>
+<P ALIGN="JUSTIFY">JOHN A. PINO, Senior Fellow, National Research Council, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Program in Agriculture, University of Florida, Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY">MICHAEL H. ROBINSON, Director, National Zoological Park, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY">KNUT SCHMIDT-NIELSON, James B. Duke Professor of Physiology, Department of Zoology, Duke University, Durham, North Carolina, USA </P>
+<P ALIGN="JUSTIFY">ALBERT E. SOLLOD, Associate Professor and Head, Section of International Veterinary Medicine, Tufts University, North Grafton, Massachusetts, USA </P>
+<P ALIGN="JUSTIFY">LEE M. TALBOT, Visiting Fellow, World Resources Institute, Washington, D.C., USA </P>
+<P ALIGN="JUSTIFY">CLAIR E. TERRILL, Sheep and Goat Scientist, U.S. Department of Agriculture, Beltsville, Maryland, USA </P>
+<P ALIGN="JUSTIFY">CHRISTEN M. WEMMER, Assistant Director for Conservation, National Zoological Park, Front Royal, Virginia, USA </P>
+<P ALIGN="JUSTIFY">DANNY C. WHARTON, Associate Curator Animal Departments, New York Zoological Park, Bronx Zoo, The Bronx, New York, USA </P>
+<P ALIGN="JUSTIFY">CHARLES A. WOODS, Professor and Curator, Florida State Museum, University of Florida, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY">THOMAS M. YUILL, Associate Dean for Research and Graduate Training, School of Veterinary Medicine, University of Wisconsin-Madison, Madison, Wisconsin, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">* * *</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, Board on Science and Technology for International Development (BOSTID), National Research Council, Washington, D.C., Microlivestock Study Director and Scientific Editor </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATIONAL RESEARCH COUNCIL STAFF</P>
+<P ALIGN="JUSTIFY">F.R. RUSKIN, BOSTID Editor</P>
+<P ALIGN="JUSTIFY">MARK DAFFORN, Technical Writer</P>
+<P ALIGN="JUSTIFY">MARY JANE ENGQUIST, Staff Associate</P>
+<P ALIGN="JUSTIFY">ELIZABETH MOUZON, Senior Secretary</P>
+<P ALIGN="JUSTIFY">JOHN VREYENS, MUCIA Intern</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CONTRIBUTORS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following individuals have made general contributions to the development of this book. All of the persons listed as research contacts in Appendix B also contributed - usually on one or two species that are their scientific specialty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ASHIQ AHMAD, Wildlife Management Specialist, Pakistan Forest Institute, Peshawar, Pakistan</P>
+<P ALIGN="JUSTIFY">ANGEL C. ALCALA, Division Research, Extension and Development, Silliman University, Dumaguete City, Philippines</P>
+<P ALIGN="JUSTIFY">HARTI AMMANN, Basel, Switzerland</P>
+<P ALIGN="JUSTIFY">PATRICK ANDAU, Forest Department, Sandakan, Sabah, Malaysia</P>
+<P ALIGN="JUSTIFY">S.P. ARORA, National Dairy Research Institute, Karnal, India</P>
+<P ALIGN="JUSTIFY">S. AYYAPPAN, CIFRI, Kausabyaganga, Bhubaneswar Orissa, India</P>
+<P ALIGN="JUSTIFY">WALTER BAKHUIS, Caribbean Marine Biological Institute, Willemstad, Curacao, Netherlands Antilles</P>
+<P ALIGN="JUSTIFY">JAMES R. BARBORAK, CATIE, Turrialba, Costa Rica</P>
+<P ALIGN="JUSTIFY">PUSHKAR NATH BHAT, Indian Veterinary Research Institute, Izatnagar, Uttar Pradesh, India</P>
+<P ALIGN="JUSTIFY">STEVE BENNETT, Curepe, Trinidad, West Indies</P>
+<P ALIGN="JUSTIFY">K.P. BLAND, Department of Physiology, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh, Scotland</P>
+<P ALIGN="JUSTIFY">MELVIN BOLTON, Yeppoon, Queensland, Australia</P>
+<P ALIGN="JUSTIFY">JOSEPH BONNEMAIRE, Ecole Nationale Superieure des Sciences Agronomiques Appliquees, Dijon, France</P>
+<P ALIGN="JUSTIFY">R.D.S. BRANCKRAERT, Faculte des Sciences Agronomiques, Universite du Burundi, Bujumbura, Burundi</P>
+<P ALIGN="JUSTIFY">PETER BRAZAITIS, Herpetology, New York Zoological Society, The Bronx, New York, USA</P>
+<P ALIGN="JUSTIFY">L. DE LA BRETONNE, JR., Louisiana Cooperative Extension Service, Louisiana State University, Baton Rouge, Louisiana, USA</P>
+<P ALIGN="JUSTIFY">P. BRINCK, Department of Animal Ecology, University of Lund, Lund, Sweden</P>
+<P ALIGN="JUSTIFY">LESLIE BROWNRIGG, CIAT, Cali, Colombia</P>
+<P ALIGN="JUSTIFY">D. HOMER BUCK, Illinois Natural History Survey, Kinmundy, Illinois, USA</P>
+<P ALIGN="JUSTIFY">GERARDO BUDOWSKI, Natural Renewable Resources Programme, CATIE, Turrialba, Costa Rica</P>
+<P ALIGN="JUSTIFY">DAVID BUTCHER, Taronga Zoo, Mosman, New South Wales, Australia</P>
+<P ALIGN="JUSTIFY">JULIAN O. CALDECOTT, World Wildlife Fund Malaysia, Kuching, Sarawak, Malaysia</P>
+<P ALIGN="JUSTIFY">GARY CALLIS, Texline, Texas, USA</P>
+<P ALIGN="JUSTIFY">J.K. CAMOENS, Asian Development Bank, Manila, Philippines</P>
+<P ALIGN="JUSTIFY">A. CHRISTOPHER CARMICHAEL, The Museum, Michigan State University, East Lansing, Michigan, USA</P>
+<P ALIGN="JUSTIFY">ROBERT H. CHABRECK, School of Forestry and Wildlife Management, Louisiana State University, Baton Rouge, Louisiana, USA</P>
+<P ALIGN="JUSTIFY">A.M. CHAGULA, Research, Ministry of Agriculture, Dar-es-Salaam, Tanzania</P>
+<P ALIGN="JUSTIFY">CHARAN CHANTALAKHANA, Department of Animal Science, Kasetsart  University, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY">PETER R. CHEEKE, Rabbit Research Center, Oregon State University, Corvallis,  Oregon, USA</P>
+<P ALIGN="JUSTIFY">G.S. CHILD, Forest Resources Division, FAO, Rome, Italy</P>
+<P ALIGN="JUSTIFY">A.S. CHOPRA, Ministry of Agriculture, Department of Agriculture and Cooperation,  New Delhi, India</P>
+<P ALIGN="JUSTIFY">W. Ross COCKRILL 29 Downs Park West, Bristol, England, BS6 7QH</P>
+<P ALIGN="JUSTIFY">CRISOSTOMO CORTES, Dairy Promotion and Extension Section, Dairy Development  Division, Manila, Philippines</P>
+<P ALIGN="JUSTIFY">WYLAND CRIPE, College of Veterinary Medicine, University of Florida, Gainesville,  Florida, USA</P>
+<P ALIGN="JUSTIFY">A. BEN DAVID, Holon, Israel</P>
+<P ALIGN="JUSTIFY">C. DEVENDRA, International Development Research Centre, Singapore</P>
+<P ALIGN="JUSTIFY">RODNEY DILLINGER, International Agency for Apiculture Development, Rockford,  Illinois, USA</P>
+<P ALIGN="JUSTIFY">DIRECTOR, Natal Parks Board, Pietermaritzburg, South Africa</P>
+<P ALIGN="JUSTIFY">ROLLANDE DUMONT, Ecole Nationale Superieure des Sciences Agronomiques  Appliquees, Dijon, France</P>
+<P ALIGN="JUSTIFY">N.G. EHIOBU, Department of Agricultural Sciences, College of Education, Agbor,  Nigeria</P>
+<P ALIGN="JUSTIFY">DONALD FARNER, Department of Zoology, University of Washington, Seattle,  Washington, USA</P>
+<P ALIGN="JUSTIFY">JOHN A. FERGUSON, Overseas Development Administration, Eland House, London,  England</P>
+<P ALIGN="JUSTIFY">ABELARDO FERRER D., Quinta Nueva Exparta, San Bernardino, Caracas,  Venezuela</P>
+<P ALIGN="JUSTIFY">LYNWOOD A. FIEDLER, Section of International Programs, U.S. Fish and Wildlife  Service, Denver Wildlife Research Center, Denver, Colorado, USA</P>
+<P ALIGN="JUSTIFY">H. FISCHER, Tropical Science Centre, Division of Tropical Veterinary Medicine,  Justus-Liebig University, Giessen, West Germany</P>
+<P ALIGN="JUSTIFY">J. FURTADO, Commonwealth Science Council, London, England</P>
+<P ALIGN="JUSTIFY">FRANK GOLLEY, Institute of Ecology, University of Georgia, Athens, Georgia, USA</P>
+<P ALIGN="JUSTIFY">E. GONZALES J., Instituto de Produccion Animal, Universidad Central de Venezuela,  El Limon-Maracay, Venezuela</P>
+<P ALIGN="JUSTIFY">GRAHAM GOUDIE, Mainland Holdings, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">ALISTAIR GRAHAM, Tanglewood, Crowborough, East Sussex, England</P>
+<P ALIGN="JUSTIFY">GORDON GRIGG, Zoology, University of Sydney, Sydney, New South Wales, Australia</P>
+<P ALIGN="JUSTIFY">M.R. DE GUMAN, JR., Food and Fertilizer Technology Center, Taipei, Taiwan</P>
+<P ALIGN="JUSTIFY">COLIN P. GROVES, Department of Prehistory and Anthropology, The Australian  National University, Canberra, ACT, Australia </P>
+<P ALIGN="JUSTIFY">J. HARDOUIN, Institut de Medicine Tropicale "Prince Leopold," Antwerp, Belgium</P>
+<P ALIGN="JUSTIFY">GEOFFREY HAWTIN, International Development Research Centre, University of  British Columbia, Vancouver, B.C., Canada</P>
+<P ALIGN="JUSTIFY">GORDON HAVORD, Technical Advisory Division, UNDP, New York, New York, USA</P>
+<P ALIGN="JUSTIFY">TIN HLA, Veterinary Department, Director General's Office, Rangoon, Burma</P>
+<P ALIGN="JUSTIFY">JAMES HENTGES, Department of Animal Science, University of Florida, Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY">W.F. HOLLANDER, Department of Genetics, Iowa State University, Ames, Iowa, USA</P>
+<P ALIGN="JUSTIFY">RENE E. HONEGGER, Herpetology, Zurich Zoo, Zurich, Switzerland</P>
+<P ALIGN="JUSTIFY">JACK HOWARTH, School of Veterinary Medicine, University of California, Davis, California, USA</P>
+<P ALIGN="JUSTIFY">HUANG CHU-CHIEN, Institute of Zoology, Academia Sinica, Beijing, China</P>
+<P ALIGN="JUSTIFY">ANGUS HUTTON, Gympie, Queensland, Australia</P>
+<P ALIGN="JUSTIFY">H.A. JASIOROWSKI, Animal Production and Health Division, FAO, Rome, Italy</P>
+<P ALIGN="JUSTIFY">MUHAMMAD YAQUB JAVAID, Directorate of Fisheries, Government of the Punjab, Punjab, India</P>
+<P ALIGN="JUSTIFY">J. MANGALARAJ JOHNSON, Nudumalai Sanctuary, Vannarpet, Udagamandalani, India</P>
+<P ALIGN="JUSTIFY">MATI KAAL, Tallinn Zoo, ESSR Tallinn, USSR</P>
+<P ALIGN="JUSTIFY">STELLAN KARLSSON, Simontorp Aquaculture AB, Blentarp, Sweden</P>
+<P ALIGN="JUSTIFY">JACKSON A. KATEGILE, International Development Research Centre, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">ROBERT E. KENWARD, Institute of Terrestrial Ecology, Furzebrook Research Station, Wareham, Dorset, England</P>
+<P ALIGN="JUSTIFY">JAMES M. KEARNEY, Miami, Florida, USA</P>
+<P ALIGN="JUSTIFY">F. WAYNE KING, Florida State Museum, Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY">H.-G. KLOS Zoologischer Garten Berlin, Berlin, West Germany</P>
+<P ALIGN="JUSTIFY">NELS M. KONNERUP, Boom International, Stanwood, Washington, USA</P>
+<P ALIGN="JUSTIFY">NAVU KWAPENA, Office of Environment and Conservation, Boroko, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">THOMAS E. LACHER, Huxley College of Environmental Studies, Western Washington University, Bellingham, Washington, USA</P>
+<P ALIGN="JUSTIFY">JOHN K. LOOSLI, Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY">PETER LUTZ, Rosenstiel School of Marine and Atmospheric Science, University of Miami, Miami, Florida, USA</P>
+<P ALIGN="JUSTIFY">CRAIG MACFARLAND, CATIE, Turrialba, Costa Rica</P>
+<P ALIGN="JUSTIFY">CONSTANCE M. MCCORKLE, Department of Rural Sociology, University of Missouri, Columbia, Missouri, USA</P>
+<P ALIGN="JUSTIFY">ROBERT E. MCDOWELL, Department of Animal Science, Cornell University, Ithaca, New York, USA</P>
+<P ALIGN="JUSTIFY">JEFFREY A. MCNEELY, International Union for Conservation of Nature and Natural Resources, Gland, Switzerland</P>
+<P ALIGN="JUSTIFY">ADRIAN G. MARSHALL, Institute of South-East Asian Biology, University of Aberdeen, Aberdeen, Scotland</P>
+<P ALIGN="JUSTIFY">RICHARD R. MARSHALL, Veterinary Medicine, Sutter Hospitals Medical Research Foundation, Sacramento, California, USA</P>
+<P ALIGN="JUSTIFY">G.H.G. MARTIN, Department of Zoology, Kenyatta University College, Nairobi, Kenya </P>
+<P ALIGN="JUSTIFY">IAN L. MASON, Edinburgh, Scotland</P>
+<P ALIGN="JUSTIFY">JOHN C. MASON, Pacific Biological Station, Nanaimo, B.C., Canada</P>
+<P ALIGN="JUSTIFY">J. MAYO MARTIN, Fish Farming Experimental Station, Stuttgart, Arkansas, USA</P>
+<P ALIGN="JUSTIFY">YOLANDA MATAMOROS, Escuela de Medicina Veterinaria, Universidad Nacional, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY">ROBIN MCKERGON, Livestock Development Corporation, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">M. MGHENI, Faculty of Agriculture, Sokoine University of Agriculture, Morogoro, Tanzania</P>
+<P ALIGN="JUSTIFY">P. MONGIN, Station de Recherches Avicoles, INRA-Centre de Tours, Nouzilly, Monnaie, France</P>
+<P ALIGN="JUSTIFY">JOSE ROBERTO DE ALENCAR MOREIRA, Agricultural Research Center of the Humid Tropics, Belem, Para, Brazil</P>
+<P ALIGN="JUSTIFY">W.L.R. OLIVER, Jersey Wildlife Preservation Trust, Jersey, Channel Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY">WERNER PAUWELS, Basel, Switzerland</P>
+<P ALIGN="JUSTIFY">W.J.A. PAYNE, Worcester, England</P>
+<P ALIGN="JUSTIFY">IAN PLAYER, Wilderness Leadership School, Bellair, Natal, South Africa</P>
+<P ALIGN="JUSTIFY">JAMES H. POWELL, JR., Plainview, Texas, USA</P>
+<P ALIGN="JUSTIFY">WILLIAM R. PRITCHARD, School of Veterinary Medicine, University of California, Davis, California, USA</P>
+<P ALIGN="JUSTIFY">HECTOR HUGO LI PUN, International Development Research Centre, Bogota, Colombia</P>
+<P ALIGN="JUSTIFY">VICENTE T. QUIRANTE, Small Ruminant Collaborative Research Project, Bureau of Animal Industry, Manila, Philippines</P>
+<P ALIGN="JUSTIFY">DAN RATTNER, The Institute of Animal Research, Kibbutz Lahav, D.N. Negev, Israel</P>
+<P ALIGN="JUSTIFY">C.V. REDDY, Faculty of Veterinary Science, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad, India</P>
+<P ALIGN="JUSTIFY">RHOEHEIT, Institute of Applied Science and Technology, University Campus, Turkeyen, Guyana</P>
+<P ALIGN="JUSTIFY">CHARLES T. ROBBINS, Department of Zoology, Washington State University, Pullman, Washington, USA</P>
+<P ALIGN="JUSTIFY">CARMEN MA. ROJAS G., CATIE, Turrialba, Costa Rica</P>
+<P ALIGN="JUSTIFY">D.H.L. ROLLINSON, Sardinia, Italy</P>
+<P ALIGN="JUSTIFY">JULIO E. SANCHEZ P., Museo Nacional, San Jose, Costa Rica</P>
+<P ALIGN="JUSTIFY">JEFF SAYER, World Conservation Centre, Gland, Switzerland</P>
+<P ALIGN="JUSTIFY">G. SEIFERT, Tropical Cattle Research Centre, CSIRO, Rockhampton, Queensland, Australia </P>
+<P ALIGN="JUSTIFY">ANDRES ELOY SEIJAS, Servicio Nacional de Fauna Silvestre, Maracay, Venezuela</P>
+<P ALIGN="JUSTIFY">S.K. SHAH, Institute of Animal Sciences, National Institute of Health, Islamabad, Pakistan</P>
+<P ALIGN="JUSTIFY">SIEH CHENXIA, Department of Animal Science, Nanjing Agricultural College, Nanjing, People's Republic of China</P>
+<P ALIGN="JUSTIFY">B.P. SINGH, College of Veterinary and Animal Science, Chandra Sekhar Azad University of Agriculture and Technology, Mathura, Uttar Pradesh, India</P>
+<P ALIGN="JUSTIFY">C. CATIBOG SINHA, Forest Research Institute, College, Laguna, Philippines </P>
+<P ALIGN="JUSTIFY">A.J. SMITH, Tropical Animal Health, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh, Scotland, Great Britain</P>
+<P ALIGN="JUSTIFY">A. MITHAT EFENDI, Ankara, Turkey</P>
+<P ALIGN="JUSTIFY">HENRY STODDARD, Shamrock Veterinary Clinic and Fisheries, Cross City, Florida, USA</P>
+<P ALIGN="JUSTIFY">SUKUT SULARSASA, Faculty of Animal Husbandry, Gadjalu Mada University, Yogyakarta, Indonesia </P>
+<P ALIGN="JUSTIFY">D.L. SUTTON, Agricultural Research and Education Center, Fort Lauderdale, Florida, USA</P>
+<P ALIGN="JUSTIFY">NICHOLAS SMYTHE, Smithsonian Tropical Research Institute, Panama</P>
+<P ALIGN="JUSTIFY">J. SZUMIEC, Polish Academy of Sciences, Experimental Fish Culture Station, Chybie, Poland</P>
+<P ALIGN="JUSTIFY">N. TABUNAKAWAI, Ministry of Primary Industries, Suva, Fiji</P>
+<P ALIGN="JUSTIFY">FRANK M. THOMPSON, Wild Animal Brokers, Bradenton, Florida, USA</P>
+<P ALIGN="JUSTIFY">ALLEN D. TILLMAN, Stillwater, Oklahoma, USA</P>
+<P ALIGN="JUSTIFY">DON TULLOCH, Winnellie, Northern Territory, Australia</P>
+<P ALIGN="JUSTIFY">CONRADO A. VALDEZ, Dairy Development Division, Bureau of Animal Industry, Manila, Philippines</P>
+<P ALIGN="JUSTIFY">LUIS VARONA, Havana, Cuba</P>
+<P ALIGN="JUSTIFY">PRAN VOHRA, Department of Avian Sciences, College of Agricultural and Environmental Sciences, University of California, Davis, California, USA</P>
+<P ALIGN="JUSTIFY">ANTOON DE VOS Whitford, Auckland, New Zealand</P>
+<P ALIGN="JUSTIFY">GRAHAME WEBB, Conservation Commission of the Northern Territory, Winnellie, Northern Territory, Australia</P>
+<P ALIGN="JUSTIFY">DAGMAR WERNER, Fundacion Pro Iguana Verde, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY">GARY WETTERBERG, Department of the Interior, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY">CHARLES H. WHARTON, Clayton, Georgia, USA</P>
+<P ALIGN="JUSTIFY">F.W. BERT WHEELER, College Station, Texas, USA</P>
+<P ALIGN="JUSTIFY">ROMULUS WHITAKER, Madras Crocodile Bank, Perur, Tamil Nadu, India</P>
+<P ALIGN="JUSTIFY">WILDLIFE CONSERVATION INTERNATIONAL, New York Zoological Society, The Bronx, New York, USA</P>
+<P ALIGN="JUSTIFY">R.R. YEO, USDA-ARS, University of California, Davis, California, USA</P>
+<P ALIGN="JUSTIFY">BRUCE A. YOUNG, Department of Animal Science, University of Alberta, Edmonton, Alberta, Canada</P>
+<P ALIGN="JUSTIFY">CHAROON YOUNGPRAPAKORN, The Samutprakan Crocodile Farm and Zoo, Samutprakan, Thailand</P>
+<P ALIGN="JUSTIFY">THOMAS M. YUILL School of Veterinary Medicine, University of Wisconsin, Madison, Madison, Wisconsin, USA</P>
+<P ALIGN="JUSTIFY">W. ZEILLER, Miami Seaquarium, Miami, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The purpose of this report is to raise awareness of the potential of small livestock species and to stimulate their introduction into animal research and economic development programs. It is geared particularly towards benefiting developing nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Microlivestock" is a term we have coined for species that are inherently small, such as rabbits and poultry, as well as for breeds of cattle, sheep, goats, and pigs that are less than about half the size of the most common breeds. These miniature animals are seldom considered in the broad picture of livestock development, but they seem to have a promising future. Wherever land is scarce it seems reasonable to assume that, things being equal, small animals would be more attractive than large ones. And land for livestock is becoming increasingly scarce.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this report we have emphasized multipurpose species with promise for small  holders. In some species, the promise is immediate; in others, it is long term, and much research must be undertaken before that promise can be realized or even understood.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We have included wild species that seem to have potential as future livestock. Some are threatened with extinction but are described here because their economic merits may be the key to acquiring support for their protection. Also we have highlighted rare breeds of domesticated species because the current tendency has been to concentrate on a small number of large breeds, and many potentially valuable breeds are becoming extinct through neglect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The book was prepared after an intensive survey of more than 300 animal scientists in 80 countries. They suggested more than 150 species for inclusion. The staff then drafted chapters on about 40 species and these drafts were reviewed by more than 400 researchers worldwide. The thousands of resulting comments, corrections, and additions were integrated into the drafts. The panel then met to review the product, to select the most promising species, and to rework the chapters based on their own experiences and joint conclusions. The result is the current 35 chapters. Most of the case studies and accounts of innovations highlighted in the various sidebars were developed by the staff study director. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collectively, this study covers many species, but it by no means exhausts all the microlivestock possibilities. Lack of space and time precludes discussion of creatures such as edible insects, snails, worms, turtles, and bats, which in some regions are highly regarded foods. Similarly, we have not included aquatic life. These decisions were arbitrary; perhaps invertebrates and aquatic species can be included in future volumes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report is addressed to government administrators, technical assistance personnel, and researchers in agriculture, nutrition, and related disciplines who are concerned with helping developing countries achieve a more efficient and balanced exploitation of their biological resources. Hence, we deal with the animals in a general way and do not cover details of biology, husbandry, or economics. A selection of readings that contains such technical information is cited in Appendix A.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A further goal of this project has been to explore the common ground between the disparate arms of animal science: to show that specialists in wildlife, zoology, and livestock science have much to learn from one another's field of expertise; to show that "fanciers" of pigeons, pheasants, chinchillas, iguanas, and other species may have much to offer livestock breeders - including germplasm; and that those who raise "obsolete" breeds are not only playing a vital role in the protection of rare genes but can offer the benefit of their experience to commercial livestock producers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Throughout this report, the scientific names of mammals follow those in: Mammal Species of the World: A Taxonomic and Geographic Reference. 1982. J.H. Honacki, K.E. Kinman, and J.W. Koeppl, editors. Published by Allen Press, Inc.; and the Association of Systematics Collections, Lawrence, Kansas, USA. All dollar figures are in U.S. dollars; all ton figures are in metric tons.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been produced under the auspices of the Advisory Committee on Technology Innovation (ACTI) of the Board on Science and Technology for International Development, National Research Council. ACTI was mandated to assess innovative scientific and technological advances, with particular emphasis on those appropriate for developing countries. In this spirit, therefore, the current report includes some extremely unusual species. Whether these will eventually prove practical for widespread use is uncertain, but we present them here for researchers and others who look forward to challenges and enjoy the satisfaction of successful pioneering. The domestication of new poultry, as well as the management of rodents, iguanas, and small deer and antelope, should be viewed in this spirit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Current titles in the ACTI series on managing tropical animal resources are: </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The Water Buffalo: New Prospects for an Underutilized Animal</P>
+<P ALIGN="JUSTIFY">· Little-Known Asian Animals with a Promising Economic Future</P>
+<P ALIGN="JUSTIFY">· Crocodiles as a Resource for the Tropics</P>
+<P ALIGN="JUSTIFY">· Butterfly Farming in Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The production of these books has been supported largely by the Office of the Science Advisor of the U.S. Agency for International Development (AID), which also made this report possible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WARNING</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">If misunderstood, this book is potentially dangerous. Because of the severity of the food crisis, the panel has selected some animals - mainly in the rodent section - that are highly adaptable and grow quickly. These seem appropriate for raising only in areas where they already exist, which are clearly identified in those chapters. Such potentially invasive animals should not be introduced to other environments because they could become serious pests. In any trials, local species should always be given priority.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How to cite this report:</P>
+<P ALIGN="JUSTIFY">National Research Council. 1991. Microlivestock: Little-Known Small Animals with a Promising Economic Future. National Academy Press, Washington, D.C. </P>
+<P ALIGN="JUSTIFY">Cover Design by David Bennett </P>
+<P ALIGN="JUSTIFY">In the developing countries, there are over 100 million farms of less than five hectares, supporting about 700 million people, who represent about 17 percent of the world population. Even more significant is the fact that about 50 million farms have less than one hectare of land. C. Devendra and Marcia Burns Goat Production in the Tropics We may now be in the wind down stage of bigger is better animal selection trend and it has certainly been a wild ride.... the lesson now being learned is that the bigger breeding animals . . . cost more to maintain, are often slower to reproduce, and may even have a shorter lifespan.</P>
+<P ALIGN="JUSTIFY">Kelly Klober</P>
+<P ALIGN="JUSTIFY">Small Farmer's Journal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Introduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g001a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like computers, livestock for use in developing countries should be getting smaller and becoming more "personal." Conventional "mainframes," such as cattle, are too large for the world's poorest people; they require too much space and expense. "Miniframes," such as the conventional breeds of sheep and goats, have an increasingly important role to play. But tiny, "user-friendly" species for home use are the ones highlighted in this report. We have called them "microlivestock."'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are two types of microlivestock. One consists of extremely small forms of conventional livestock - such as cattle, sheep, goats, and pigs. The other consists of species that are inherently small poultry, rabbits, and rodents, for instance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microlivestock are important because the developing world's animal production is only a fraction of what it should be. Throughout Latin America, Asia, and Africa, the poor eat almost no meat, milk, or eggs - the most nutritious foods. It is estimated, for example, that in Mexico 25 million campesinos cannot afford meat. In poor countries, even the middle class eats less meat in a year than the populations of North America and Europe eat in a month. Malnutrition is common and its effects, especially on children, can be debilitating. It is one of mankind's most serious imbalances - and most pressing problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rural families in the Third World usually subsist mainly on the products from their homes or farms. Thus, if we are to help their livestock production, more attention must be given to animals that are sized for their situations. Examples discussed in the report are summarized here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microbreeds Small breeds of cattle, sheep, goats, and pigs are common in the developing world. Because they are often raised for subsistence rather than for commerce, the national and global contribution that they make is often overlooked. These small, hardy animals deserve much greater recognition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Later chapters highlight dozens of promising microbreeds. All are less than half average size; some are far smaller than that. The "miniBrahman" cow of Mexico is only 60 cm tall and weighs 140 kg; the southern Sudan dwarf sheep of eastern Africa can weigh as little as 11 kg; the Terai goat of Nepal weighs less than 12 kg; and the cuing pig of Mexico weighs merely 10 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Poultry The widespread use of poultry in Third World villages demonstrates the importance of small, easily managed, household livestock. Small size, the ability to forage for themselves, and a natural desire to stay around the house put chickens, ducks, guinea fowl, and other birds among the most vital resources of rural Asia, Africa, and Latin America. Scratching a living out of the dirt, dust, ditches, and debris, these often-scrawny creatures are a resource to be taken seriously. For the most poverty stricken, a bony bird may be the only source of meat during much of a lifetime. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among poultry, there are many underrated, but highly promising, species, including:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Pigeon. These birds forage widely but return home, thereby providing the farmers with squab, one of the tastiest of all meats. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Quail. Small and efficient, they, too, are suited to home rearing, and in Japan and a few other countries, large numbers are raised commercially in very small space. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Muscovy. A native of South American rainforests, this bird is a major poultry resource of France, Taiwan, and a few other countries. Tame, tolerant, and tough, it deserves greater recognition everywhere. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Guinea Fowl. One of the most self-reliant of all domestic birds, this native of Africa is raised in huge numbers in Europe - notably France. Its potential for increased production elsewhere is exceptional. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Turkey. The traditional turkey of Mexico still exists as a scavenger bird in villages and household backyards. Unlike the highly selected modern breeds, it is self-reliant, robust, and disease-resistant. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbits Like chickens, rabbits exemplify the vast possibilities that microlivestock offer for increasing meat production in the most poverty-stricken parts of the world. Captive rabbits have been popular as food at least since the time of the Romans. Rabbit rearing has been well established in Europe and China, and now national rabbit projects have begun in many developing nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rodents Some 7,000 years ago, guinea pigs were domesticated as a source of food for the high Andes; even today in the uplands of Bolivia, Peru, and Ecuador, most Indians raise them inside their homes and regard them as an essential part of life. For many Indians, these indoor livestock are the main source of meat. Prolific, tractable, and easy to feed, house, and handle, guinea pigs are even kept in downtown apartment buildings - often in boxes under the bed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other rodents might also be suited to domestication; for instance, the potentially tamable, clean-living species of South American fields and woodlands - agouti, capybara, hutia, mare, coypu, pace, and vizcacha. Two remarkable domestication programs have been started in Africa: the grasscutter in West Africa and the giant rat in Nigeria. Both animals provide popular "bushmeat" and researchers are now learning to raise them in captivity. (Because of its tangy taste, Ghanaians actually pay three times more for grasscutter meat than for beef!)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antelope Another wild African mammal with potential for "household animal husbandry," the blue duiker, is a rabbit-sized antelope. In some areas of Central and Southern Africa the demand is so great that its population is declining at an alarming rate. Duiker rearing, if it can be made successful, might provide both food and an economic alternative to slaughtering the wild populations. It is reported that duikers are easy to maintain and they reproduce well in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The meat of several other tiny antelope species is also much sought in many African countries, and these animals are also suitably sized to feed the average family at one meal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Deer Several species of tiny deer - smaller than many dogs - might make useful microlivestock, although much research is needed before their true potential can be judged. Normal-sized deer were once considered too easily frightened to be reared as domestic livestock, but several species are now raised on thousands of deer farms in New Zealand as well as in at least a dozen other countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse deer and musk deer (which, strictly speaking, are not true deer at all) are of microlivestock size and are also possible future livestock. The musk deer produces one of the most valuable materials in the animal kingdom - more valuable, in fact, than gold. The musk from the male's glands is used in oriental medicines as well as in European perfumes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iguanas Over much of the Caribbean and Latin America, iguanas are a traditional source of food. Indeed, the meat of these large herbivorous lizards is so delicious they are being hunted to extinction throughout their wide range. Their eggs are much enjoyed also. Programs in Panama, Costa Rica, El Salvador, Curacao, and Argentina have developed simple methods to hatch and rear three iguana species. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bees Honey bees are present almost everywhere, and honey and wax are high-value products that demand little processing and can be stored and transported easily. Innovations in equipment and technique have made beekeeping successful in the tropics without requiring sophisticated hives or elaborate training. Raising bees can also benefit the many crops that require pollination.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE MICROLIVESTOCK ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although animal science has traditionally emphasized bigness, smallness has its advantages. Some of these are summarized below.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microlivestock lend themselves to economic niches that are not easily filled by large livestock. Much of their potential is for subsistence production. They are promising for the many peasants who, being outside the cash economy, are now unable to purchase meat, milk, cheese, or eggs. These people can afford only animals that can be raised within the home or backyard under ambient climatic conditions and on feeds that are cheap and easily available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A subsistence farmer is likely to benefit more from small species than from large because of several factors:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- The animals are less expensive to buy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They are less of a financial risk to maintain. (A farmer with several small animals is less vulnerable to loss than a farmer with a single large animal, a feature that is particularly important in subsistence farming where success determines whether the family will survive.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They give a faster return on investment. (Small size generally signifies high reproductive capacity and a fast turnover.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They provide flexibility. (Farmers can more easily change the size of their herd or flock to match the amount of feed available at a given time. Also, they can sell animals according to the family's fluctuating needs for cash or food.) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They provide a steadier source of income.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They increase the chances of successful breeding because greater numbers are usually kept. (This also means that breeding stock is more likely to be retained in times of scarcity.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- They are more easily transported. (Who hasn't traveled in a Third World bus or train without chickens, ducks, or guinea pigs as fellow passengers?)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- In some cases they are more efficient converters of food energy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are also a number of other benefits to small species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Reduced Spoilage. A portion of meat that comes in a "package" of a size that can be readily consumed by a family is important in areas where refrigeration is unavailable or uneconomic. A family can eat the meat produced by most microlivestock in one meal or in one day to minimize the risk of spoilage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Efficient Use of Space. The space required for handling and feeding microlivestock is proportionately less than that required for large animals. Low space requirements make many microlivestock (such as guinea pigs, rabbits, pigeons, and quail) available to landless rural inhabitants who have no room for a cow. This is particularly important with respect to feed production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Cheaper Facilities. Facilities and equipment required for microlivestock are, by and large, smaller and simpler than those required for large animals. They often can be made from local products or scrap material or both.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Ease of Management. Farmers and villagers can manage small animals more easily than large, which is an advantage in the many places where women and children are the main keepers of livestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Increased Productivity. Small animals tend to fit well into existing farming systems, thereby expanding the resource base and recycling nutrients. Some - for example bees, ducks, and geese - can feed themselves by scavenging.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- By-Products. Many species have fur, feathers, skins, and other by-products that are often more valuable than their meat, milk, or eggs. Examples include the feet and tails of rabbits, musk from musk deer, and pelts from rodents such as coypu. Processing such byproducts creates diversification for the farmer and perhaps jobs for the village.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RATIONALE FOR LIVESTOCK PRODUCTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many have argued that livestock raising should be discouraged, that it is a primary cause of desertification through overgrazing and that it is an inefficient converter of basic material and energy into human food. "Grow more pulses, grow more grains," these people cry. Their arguments can be valid where the land has high potential for permanent cultivation. Much of the world's surface, however, does not fit into that category, and it is in these areas and for those people who have no access to arable lands that a convincing case for livestock can most easily tee mace. As W.J.A. Payne has written:*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Livestock, particularly ruminants, can process forage and waste crop materials inedible by man into nutritionally desirable food products, many of high protein, mineral and vitamin content and including some of high caloric value. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Approximately 40 percent of total land available in developing countries can be used only for some form of forage production and a further 30 percent is classified as forest with some potential for the production of forage. Some 12 percent of the world's total population live in areas where people depend almost entirely on the products obtained from ruminant livestock. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Livestock provide a range of extremely valuable by-products. Dung is not only a fertilizer and soil-stabilizer but also a fuel of often considerably greater value than the fodder consumed in its production. Other byproducts, especially hides and wool form the bases of rural enterprises that may provide significant incomes to the poorest members of society. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Animal plant and human life are ecologically interdependent. The establishment of agricultural systems in which livestock are integrated with crops, forestry and aquaculture is essential for the improvement of overall productivity. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock produce food that adds to the nutritional quality and variety of human diets. Although it is possible for humans to exist without them, these foods are relished and sought after by the majority of humanity. These foods include meat, eggs and processed products such as biltong and cheese. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Feed</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In general, small species tend to expand the food base by using a wider array of resources than do major livestock such as cattle. Many can be raised on feeds that people discard: fibrous residues, industry by-products, or kitchen wastes. Some collect minute feeds that otherwise go unused. For example, chickens and pigeons gather scattered seeds, turkeys gobble up insects, geese graze water weeds, iguanas feed in the tops of trees, and bees collect nectar and pollen from flowers that may be miles away.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Even some grazing microlivestock prefer different forages from those preferred by cattle. Antelope and deer, for instance, browse tree leaves; capybara and grasscutters eat reeds. Combining microlivestock with conventional livestock results in a more complete utilization of forage resources and greater animal production per hectare.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under conditions of abundance, small size may be of no advantage in mammals, but if feed is limited, it is of great help. A small animal (or its keeper) needs to cover less area to fulfill its daily requirements, so that microlivestock may grow fat in areas where the forage is too sparse to support a larger animal. This is particularly vital when there are seasonal bottlenecks. For example, feed may be plentiful enough for most of the year to supply many large animals; however, the dry season may greatly restrict the numbers that can be kept.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although small animals generally require proportionately higher inputs of feed, they also grow proportionately faster (see sidebar opposite). In addition, species such as rabbits, guinea pigs, and grasscutters digest fibrous matter with surprising efficiency, even though they are not true ruminants like cattle, sheep, and goats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reproduction</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many small animals have high reproductive capacity with short gestation periods, large numbers of offspring, and rapid juvenile growth. They tend to reach sexual maturity at a younger age than large animals, and the interval between the generations can be very short. Thus, meat or other products can be produced more rapidly and more evenly throughout the year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cows, for example, produce a maximum of one calf per year. A pig, on the other hand, may produce 7 or more young; a rabbit, 30 or more; a chicken, more than 100.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adaptability and Hardiness</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The survival rates and manageability of many small breeds and species can be outstanding. Smallness is often an adaptation to harsh environment. Indeed, a major promise for microlivestock is in special environmental niches. Where cold, heat, temperature fluctuations, aridity, or humidity are extreme, microlivestock are likely to show their greatest advantage. Chickens, guinea fowl, goats, and many other small species already live in villages, homes, and backyards in harsh and disease-prone climates, and are usually given no care and sometimes no food: they have to scavenge for their sustenance and survive as best they can. Such selection pressures result in animals of remarkable adaptability, tolerance, and robustness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Some microlivestock can produce under conditions where conventional species die. The capybara, for instance, is at home in the Latin American lowlands, where the climate is hot and humid and floods cause seasonal inundations. Cattle, by contrast, die because of malnutrition, foot rot, or drowning. Other microlivestock species with a wide tolerance to ecological extremes include the turkey, pigeon, and bee. And some dwarf breeds of cattle, sheep, goats, and pigs show surprising tolerance to trypanosomes, the parasites that make conventional breeds impossible to maintain throughout much of Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some small species can be raised in cities, where poverty and malnutrition are often worse than in rural areas. It is estimated, for instance, that one million livestock exist in Cairo, not counting the pigeons that are raised on countless rooftops. Goats and cattle are common in urban India, and many Third World cities have far more chickens than people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p9a.png"></center><br>
+ Food utilization versus body size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICROLIVESTOCK LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raising microlivestock is not a panacea for the Third World's food problems. Efforts to develop them will not be without difficulties. Some likely problems are noted here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">High Energy Requirements</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Smaller animals tend to have a higher feed requirement per unit of body weight than large animals. Anatomical and physiological constraints prevent them from meeting their relatively high energy requirements simply by increasing the rate of food ingestion. Therefore, for optimum production, some small animals, particularly nonruminants, require feed that is higher in protein and lower in fiber than large animals. This is particularly true when the small animals are compared with ruminants such as cattle, sheep, and goats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Increased Labor Requirements</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The advantages of low investment, fast return on capital, flexibility, and efficient resource utilization are offset by higher demands for labor. Keeping small animals often requires considerable effort, and its economic viability may depend on the availability of cheap and willing labor. Many small animals are raised at home by family members, such as children, the elderly, and the handicapped, who have time available and whose labor costs are nominally zero.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Diseases</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some potential microlivestock are undomesticated, and resistance to diseases and parasites is one justification for their consideration. However, the general healthiness of a species when it is free-ranging can be a misleading guide for its husbandry. Confining any animal in high density invariably increases the potential for the spread of infectious diseases and parasites. Moreover, mismanagement can foster respiratory and gastrointestinal diseases (such as salmonella or coccidiosis) that are rare among scattered populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some microlivestock are potential reservoirs for diseases that affect not only local animals but people as well. This may limit their successful development in some areas. Although the dangers are often exaggerated, controls may be needed, particularly of rinderpest, tickborne diseases, and those diseases communicable to humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Predation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small size makes microlivestock easy prey.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lack of Research</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Techniques to manage some microlivestock species are not yet well established. The development of appropriate husbandry techniques, as well as a better understanding of the animals' particular biological and behavioral characteristics, will be needed before major progress can be made. These species (for instance rodents, deer, and iguanas) may require collection of different genotypes, as well as studies of diseases, nutrition, and management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Complex Logistics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is complicated and expensive to reach millions of widely scattered peasants, each having only a handful of small animals. Even though total production may far exceed that of commercial farms raising large animals, the smallholdings are often dispersed, their animals are often used for subsistence rather than commerce, and their managers are often ill-trained and illiterate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Legislative Restrictions</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The use of some microlivestock species may be restricted by legislation. For instance, some countries have meat and veterinary laws that work against the development of species other than cattle. Others have laws to protect wildlife, which could be important in the case of species such as antelope, deer, pace, and iguana.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lack of Markets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microlivestock need not be just for home or local consumption; they can also be raised for market. But some commercial programs, including some with rabbits and guinea pigs, have failed because no public demand was developed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Resistance to New Species</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People have close associations with livestock, and in most cultures they do not easily accept animals or animal foods that are radically different from their traditional ones. In general, the ties between certain ethnic groups and a particular species or breed is very strong (one reason, for example, why European colonists introduced their own large breeds of cattle and sheep to Africa and Asia, paying little attention to small indigenous breeds). Moreover, people who are used to bringing the animal to the feed rather than the feed to the animal may resist a small animal that has to be penned up and fed by hand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Opposition to Smallness</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, there seems to be an innate human trait that considers bigger to be better, especially among the common livestock. For example, because many tropical cattle are small, there is strong inclination on the part of those responsible for livestock improvement to dismiss them or to increase their size by crossing them with large breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FUTURE OF MICROLIVESTOCK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small animals are likely to become increasingly important. As human populations increase, the space available for growing forage decreases, and this phenomenon favors small animals. Many villagers already have little or no pastureland. Some live in areas (the rice-growing areas of Southeast Asia, for instance) where crops are grown on almost every square meter almost every month of the year. Microlivestock are potentially important for urban areas of developing countries as well. There, too, land is at a premium and is usually inadequate for raising conventional livestock. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So far, however, microlivestock have been largely ignored. Compared with cattle, they have been accorded little scientific effort. In the drive towards larger animals, stimulated by experience in the temperate zone, the virtually unstudied gene pool of small species and breeds has been mostly bypassed. There have been few attempts to assess or improve their farm productivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is unfortunate, and it is perhaps due to the fact that small animals may be less efficient at digesting certain foods and therefore technically less attractive than large, "modern" breeds. But to Third World peasants, an animal's efficiency is far less important than its survivability and manageability. If an animal cannot be raised under village conditions, its feed-use efficiency or milk yield is irrelevant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microlivestock production should be integrated into most ruraldevelopment projects. Small animals offer a way to improve the lives of people who are hard to reach by other methods. Only by expanding research on the husbandry, hygiene, nutrition, reproduction, physiology, and breeding can the promise of animals sized for small farms and villages be fulfilled. Moreover, the costs will be small compared with those of programs for large animals.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Specifically, experiment stations should produce and promote methods and materials for use in rearing microlivestock. Donors and development institutions, planners, and policymakers should note the potentials of microlivestock and the benefits that can be derived from them. Teaching manuals and materials are needed, and classes in microlivestock husbandry should be included in rural school curricula.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raising personal livestock on weeds and table scraps in cages beside the house or boxes under the bed will, in many instances, get quality protein to the most poverty stricken more effectively than raising large livestock on pastures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although small size confers many advantages, the question is not whether the large or small animal is "best," but rather how well each can meet a person's varying requirements. In a given situation, livestock can be too small or too large. But the fact remains that not everyone who wants meat or money has the resources to acquire, keep, manage, or utilize a large animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The key is balance. Both microlivestock and traditional livestock deserve serious attention. Indeed, it seems likely that the two will seldom compete. Most microlivestock complement traditional livestock because of unique physical, physiological, behavioral, or economic characteristics. They increase the range of options for the millions of poor for whom the choice may not even be between large and small livestock, but between microlivestock and no livestock at all. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It's an unfortunate fact that small animals don't have the prestige among Third World farmers that large animals do (perhaps this arose because children can look after goats and sheep but it takes men to look after cattle). Even sheep and goats are not accorded the same stature as cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hugh Popenoe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeds and varieties were created from mutant genes and thus haste become living reservoirs of these genes, holding them for use in future generations of mankind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anonymous</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g002a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part I : Microbreeds</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g003a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle, goats, sheep, and pigs supply millions of people around the world with the bulk of their cash and animal products. Yet scores of breeds - especially in the tropics - are left out of livestock development projects merely because they are considered too small. These "microbreeds"' have sometimes been considered genetic dead ends because they appear undersized and puny. Many of these traditional animals - some in local use for thousands of years - are disappearing, and even the small ancestors of large modern breeds are becoming extinct.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These small breeds deserve to be studied and developed in their own right. Throughout Africa, Asia, and Latin America, these usually hardy animals are especially adapted to traditional husbandry practices and harsh local conditions. Some have remarkable qualities and are well adapted to resist hostile weather, ravaging pestilence, and poor diets. In remote places and in areas of extreme climate, they are often vitally important for basic subsistence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indeed, because of stress or disease, or insufficient forage, land, or money, microbreeds may be the only practical livestock in many settings. Their individual output may be low, but it can be efficient considering the lack of care and poor feeds they are given. Their availability and the growing number of small-sized farms in the developing world make them increasingly worthy of consideration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following chapters in this section describe microcattle, microgoats, microsheep, and micropigs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">1 Microcattle</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g004a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the purposes of this report, "microcattle" are considered to be small breeds of cattle (Bos taurus and Bos indicus) with a mature weight of about 300 kg or less. In many areas of the developing world, these are actually the animals most widely held by farmers and pastoralists. They are often treasured because of their resilience and simple requirements. Many survive and produce under harsh conditions, grow rapidly, calve easily, show good maternal ability, yield lean meat, or have other advantages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle have generally been ignored in the push towards larger animals, but they seem inherently suitable for traditional and small-farm husbandry. As rural people in developing countries improve their own productivity, as they become more aware of nutritional needs, and as they depend more upon cash economies, microcattle could become vital means for improving personal, dietary, and economic status.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle have been classified in many ways, but they are generally designated as humped or humpless types. However, clear distinctions among them are sometimes difficult or impossible to make because they have intermingled for thousands of years. Representative microcattle types are listed at the end of the chapter. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than two-thirds of the world's 1.3 billion cattle are found in the developing world; one-third is in the tropics. As noted, a considerable number of these could be called "microcattle."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many strains of microcattle are threatened with extinction because of replacement or crossbreeding with larger types. This is in some respects shortsighted because promoting just a few breeds contributes to narrowing of the genetic base, and valuable traits may be lost when selection is done to conform to any preconceived standard, including large size.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle are adapted to a wide variety of habitats. Many types thrive - even with little or no attention - in climates that are hot, humid, arid, or beset by diseases and parasites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle are ruminants and digest fiber well, although they are selective foragers and prefer tender grasses and low-growing legumes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As with other tropical cattle, microbreeds generally reach physical and sexual maturity in 2 or 3 years. Many can breed year-round when conditions are favorable (gestation lasts about 9 months). Cows may remain fertile 10 years or more, and can live more than 20 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle usually graze from as few as four hours to as many as eight hours a day. If feed is of poor quality, they must forage (and ruminate) longer to receive adequate nutrition. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle are commonly docile and undemanding animals, and many small breeds are surprisingly responsive to humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like conventional breeds, microcattle produce the same well-known products: meat, milk, manure, hides, horn, blood, and bone. They are also used for traction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small cattle often produce only modest amounts of milk and meat per animal. However, given higher stocking rates, a herd of microcattle is often able to outyield larger, genetically improved animals on a per hectare basis, especially under stressful conditions. When their ability to survive adversity and poor management is taken into account, they may often be far and away the most efficient cattle for traditional husbandry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surprisingly, there is a place even for small draft animals. They tend to be active, thrifty (efficient), and more maneuverable in tight spaces, and so are adapted for use in the small fields, terraces, and paddies that are becoming increasingly common. The small hill cattle of Nepal, for instance, are valued because they can negotiate steep slopes and narrow terraces on Himalayan mountainsides. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle are handled like their larger counterparts, but herding, tethering, fencing, and hobbling are generally easier.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle are familiar animals that are accepted in nearly all cultures; their meat, milk, manure, and leather are in demand almost everywhere. In many societies, beef is preferred over other meats, even by those who can rarely afford it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most areas, organized breeding, production, and marketing associations are already in place. Microcattle can also integrate well into traditional forms of husbandry, whether in pastoral herds of hundreds or as solitary backyard milk cows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under humid and hot conditions, microcattle probably suffer less than larger breeds because their greater ratio of skin area to body mass enhances their ability to shed heat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The number of cattle that can be kept on a given parcel of land may be increased, sometimes even doubled, with smaller animals. Microcattle can also be penned and fed cut-and-carry forage more easily than can larger cattle, and more of them can be maintained on the same amount of feed. This permits more continuous production and less financial hardship when an animal perishes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small cattle may require less labor because they are generally easier to handle, herd, confine, and transport. They usually have few problems with calving, and as a rule require little or no assistance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some microcattle have unusual tolerances to disease. In Africa, for instance, there are breeds that tolerate or resist trypanosomiasis, a parasitic disease that makes large areas of that continent uninhabitable for most other cattle breeds. Others seem more tolerant of internal or external parasites, theileriosis (east coast fever), rinderpest, or other afflictions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle often lack the prestige of larger breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When given quality forage and supplemental feeding, small unimproved cattle may not match the overall productivity of the large, highly developed breeds. Their greatest potential may prove to be for traditional husbandry and for grazing marginal areas where survival is more important than feed efficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BONSAI BRAHMAN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Mexico, researchers are deliberately creating microcattle. Since 1970, Juan Manuel Berruecos Villalobos, former director of the Veterinary Medicine school at the National Autonomous University, has directed this enterprise. He and his colleagues have miniaturized cows by selecting the smallest specimens out of a herd of normal-sized Brahman cattle and breeding them with one another. After five generations, adult females average 15-180 kg adult males 20-220 kg. A few of the smallest cows are now only 60 cm tall and 140 kg in weight. Merely one-fifth of normal weight, they are shorter than the turkeys that share the barnyard with them. Indeed, they even get lost in the grassy pastures so that the farmers cannot see them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This program seems to have yielded a productive animal that can be cheaply and easily maintained in a small space. Berruecos has demonstrated that the tiny cows can be stocked on one-third the area needed to support one normal-sized cow. He reports that they are giving remarkable amounts of milk: up to four lifers a day, compared with six lifers from their full-sized counterparts. On a feed-intake to weight-gain basis, the tiny cattle are no less efficient than their normal-sized counterparts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although 17 years have gone into the selection of what Berruecos calls his "bonsai cattle," the process is not yet finished. Future goals include testing embryo transplants to see if one normal-sized cow can support multiple "microfetuses" (possibly as many as eight). This would help to rapidly increase the numbers of the miniature form, which weigh merely 4-5 kg at birth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All in all, the Mexican researchers see miniaturization as a new option for governments and farmers increasingly squeezed by shrinking farm land and rising production costs. Small livestock they say, are a way to produce more food on less land faster. For example, a campesino with almost no land can have one or two bonsais, but could never maintain a standard-sized cow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Their adaptability and robustness make microcattle worthy of preservation, study, and greater use, and they should be incorporated into many ongoing programs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Selective breeding, although infrequently attempted, can probably improve productivity significantly. Records of breed history should be established, and unusual or special characteristics noted and the information disseminated. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p24a.png"></center><br>
+ Original distribution of wild cattle and banteng (Based on Mason , 1984)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In areas where small, indigenous breeds are being replaced, representative populations should be maintained and studied to increase understanding of their adaptive diversity and to retain a genetic storehouse for the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">REPRESENTATIVE EXAMPLES OF MICROCATTLE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dwarf West African Shorthorn</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">West African coastal forests, and inland. Female 125 kg; male 150 kg. Adaptation to harsh, humid climates and good resistance to trypanosomiasis and other diseases allow these small animals to exist where other cattle die. They are perhaps the smallest cattle of all (often weighing less than 100 kg). In the areas of worst disease and highest rainfall, this hardy animal is often found thriving, but half wild. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muturu Nigeria. Female 160 kg; male 210 kg. This notable subtype is slightly larger. It is the most trypanotolerant of all cattle, showing no symptoms or loss of vitality. It is widely kept, mostly as a village scavenger and often as a pet, and yields a high percentage of meat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N'Dama</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West Africa. 200-400 kg. These active, stocky animals utilize low-quality forage, produce good beef, and are used as light draft oxen. Milk production, though poor, improves with feeding level. N'Dama mature early and are exceptionally fertile, and they have already become important in breeding programs. They are resistant to trypanosomiasis, and can exist where temperatures average 30&Yacute; C with 1,500 mm annual rainfall. In the least hospitable areas, N'Damas ranging down to 200 kg are often the only cattle that can remain productive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rodope</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southeastern Europe. Female 200 kg; male 350 kg. A humpless multipurpose breed - draft, milk, and beef - that is exceptionally hardy. The milk is high in butterfat. Possibly adaptable to the subtropics. It is rapidly being lost to crossbreeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zebu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zebus are among the most important tropical domestic animals. However, the dwarfs are not well known, although in many areas they are preferred, especially as draft animals. Zebus use less water, even though their sweat glands are larger and more numerous than those of most other cattle. All have a low basal metabolism and resist heat well. In general, they also have high resistance to ticks and other parasites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taiwan Black Taiwan. Female 250 kg; male 250 kg. Well adapted to poor tropical conditions, these work animals are also used for meat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kedah-Kelantan Malaysia. Female 200 kg; male 250 kg. Hardy, well adapted cattle with exceptional fertility on a poor diet, both sexes are used as draft animals as well as sources of meat and cash. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sinhala (Dwarf Zebu) Sri Lanka. Female 200 kg; male 250 kg. An ancient type of zebu, preferred for its handiness in cultivating small paddies and terraced fields. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nuba Dwarf Sudan. 180-220 kg. These work animals are well proportioned but are not slaughtered for meat, and milk production is low. Although tolerant to trypanosomiasis, their numbers have dwindled because of crossbreeding. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small Zebu Somalia. 160-230 kg. These small native cattle are used for beef, milk, and for work. They are well adapted to poor feed in a desolate environment. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abyssinian Shorthorn Zebu (Showa) Central highlands of Ethiopia. Female 225 kg; male 305 kg. These widespread, small-humped cattle are very hardy. They produce beef and are generally milked, with surplus production about 2-4 kg daily. Resistant to many parasites, they also have a gentle disposition and make good work animals. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dwarf Zebu (Mongalla) Tanzania, Uganda, and Kenya. Female 150 kg; male 250 kg. A highly variable, long-entrenched, small, East-African zebu with some nonzebu blood. Pastoralists favor it because of its hardiness. Although slow-maturing, it is well-fleshed, can yield excellent beef, and some types are milked. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mashona Zimbabwe. Female 200 kg; male 250 kg. This hardy zebusanga type (see below) is widespread in drier areas and has a high resistance to disease and parasites. Since the 1940s, it has been bred for beef production and selected animals now weigh more than 500 kg. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mini-Brahman Mexico. 135 kg. Downsized from 450-kg Brazilian zebus through selective breeding by Mexican researchers, these gentle animals are reported to yield two-thirds as much milk (3-4 liters daily) as the parent stock. Because of much higher stocking rates on grass, production per hectare is reportedly greater than with full-sized animals (see sidebar, page 22). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Criollo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central and South America. Descendants of Spanish and Portuguese  cattle imported over 400 years ago, "criollo" cattle have adapted to a  wide range of harsh climates. Many varieties are small: mature females  often weigh 200-300 kg or less. They sometimes produce little beef or  milk under traditional conditions and management, but they are  extremely hardy and survive when other cattle perish. Through  importation and crossbreeding, many local types have been lost or are  threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chinampo Baja California, Mexico. 200-350 kg. Extremely tolerant of  wild desert conditions, these docile criollo cattle exist largely on scrub  and cactus. They get most of their water from succulent plants, have a  low metabolic rate and body temperature, and are mostly active at night. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Florida Scrub Florida, USA. 225-300 kg. Genetically isolated for more  than 300 years, the Florida Scrub is very hardy in harsh, subtropical  conditions. It has good resistance to ticks and screwworm, and can  subsist on forage with a high roughage content. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sanga</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This type - an ancient cross between longhorns or shorthorns and  humped animals - is found throughout eastern and southern Africa. It  weighs from 150 to 500 kg or more. Some types have been selectively  bred or crossed with European cattle and are quite productive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bavenda Transvaal, South Africa. 240-290 kg. This hardy and  disease tolerant tropical variety is small and prolific. It is generally used  for draft, barter, and beef. However, it has been crossbred with larger  animals so frequently that the smaller types are almost extinct; most  "Bavendas" now weigh more than 300 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ovambo' Northeastern Namibia. Female 160 kg; male 225 kg. A calm  and docile animal with a small hump, it is used by seasonal pastoralists  for beef and milk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nilotic Sudan. 180-300 kg. These cattle of southern Sudan show great variation in size, partly due to environmental factors. They are generally resistant to local parasites and worms, have good potential for increased beef production, and their milk is very important locally.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chadian "Native" and Dwarf Black Cattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad. Female 225 kg; male 275 kg. These two types are small, humped meat animals that graze the sparse savanna and are very drought resistant. Little scientific information exists about them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Arab Cattle"</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Middle East. Small types (female 225 kg; male 300 kg) are used for meat and some milk, especially in Lebanon. There are many local forms with variable appearance, but all have small humps. Well adapted to grazing sparse vegetation on rough land, they are becoming rare due to crossbreeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hill Cattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal. Female 160 kg; male 200 kg. A widespread type often recrossed with Indian zebu animals, they are bred to be small. They are thrifty creatures that maintain themselves well on poor forage. Bulls make sure-footed draft animals on rough ground and slopes, and the cows are milked.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tibetan Dwarf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tibet. Less than 250 kg. These humpless cattle are used as pack animals and can tolerate poor forage and high altitudes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yellow Cattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southwest and south China. Female 220 kg; male 380 kg. In the subtropics and tropics, small multipurpose types of Yellow Cattle withstand high temperature and humidity. They are used mainly for work and meat, and seem well adapted to poor feed, harsh conditions, and rugged terrain. The Chowpei (190-380 kg) is a hardy working breed of more temperate areas in Hubei Province.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cheju Hanwoo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Korea. Female 230 kg; male 280 kg. A yellowish-brown Cheju Island native that has almost no calving difficulty, it is well adapted to poor grazing conditions in harsh environments and is docile and obedient.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madura</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indonesia. Female 220 kg; male 300 kg. An ancient cross between humped cattle and the banteng (see sidebar), these heat- and disease resistant hybrids also have good grazing and mothering ability, and are kept in the most extreme humid tropical environments. Breeding for fighting and racing has given them a poor disposition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dexter Cattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ireland and North America. 220-360 kg. This breed can be traced back to eighteenth-century Ireland and is believed to have been developed by peasant farmers living on rough land. It is exceptionally hardy and produces both milk and meat. In North America, it has become popular among city folk who acquire country property, as this microbreed is particularly well suited to their usually tiny farms. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BANTENG: THE CUTEST COW</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The banteng (Bos Javanicus) is a small Southeast Asian bovine with a promising future.* It is a different species from cattle. The two will interbreed, but the hybrid offspring are normally sterile.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although almost entirely neglected by the animal science community, the banteng is remarkable for an ability to thrive under hot, humid, and disease-ridden conditions where cattle often grow poorly. The sexes are easily distinguished: males are jet black, females are golden brown. Both have bright white socks and rumps as if they had been freshly whitewashed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng are found in remote areas of countries from Burma to Indonesia. But only Indonesia has used it as a farm animal so far. It has more than 1.5 million domesticated banteng - some 20 percent of the country's total "cattle" population. Indonesian farmers value the animal's agility, which allows them to cultivate Relds too narrow for cattle to turn the prow. In addition, gourmets consider banteng meat the tastiest of all. Indonesia appreciates the banteng so much that it has established a genetic sanctuary on the island of Bali - banning cattle in order to maintain the banteng's genetic purity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Outside Indonesia, only a few scientists have studied this animal, but it seems clear that it is particularly useful under tropical conditions. In heat and humidity, it thrives; even when cattle are starving, one rarely sees a skinny banteng. And demand for its meat is never ending.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">2 Microgoats</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than 90 percent of the world's nearly half billion goats (Capra hircus) are found in developing countries; many weigh less than 35 kg fully grown.` Such "microgoats" are noted for their high reproductive rates, rapid growth, early maturity, tasty meat, and rich milk' as well as for their robust constitution, ease of handling, and tolerance of climatic stress and poor feeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To many people - especially where pigs and poultry are not common - meat and milk from microgoats are the primary animal proteins consumed during a lifetime. Perhaps the world's best foragers, goats eat practically anything made of cellulose, and are not dependent on grass. Because of their unselective feeding behavior, they are capable of living where the feeds - tree leaves, shrubs, and weeds - are too poor to support other types of livestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Such microgoats deserve wider recognition, for they are often the poor person's only source of milk, meat, and cash income. They are cheap to acquire and easy to maintain, even by people with little property and scarce resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide, especially in arid and semiarid climates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats generally have a long snout and an upright tail, by which they can be distinguished from most sheep. The mouth is unusual in having a mobile upper lip and a grasping tongue, which permits the animal to nibble even tiny leaves on spiny species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Common commercial goat breeds generally weigh between 60 and 100 kg, with some weighing more than 200 kg. Microgoats may weigh less than 15 kg. Representative examples are listed at the end of the chapter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide, with half in Asia and one-third in Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The FAO projects that world numbers may nearly double by the turn of the century. Goats are thus not endangered, but in some areas select populations of feral goats are being deliberately eradicated, with the consequent loss of potentially valuable genes. Some small breeds are also threatened by excessive crossbreeding with larger types.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most adaptable of all livestock, goats can persist in conditions from arid to humid, and from sea level to high altitude. They are especially well adapted to hot, semiarid climates and to rocky, barren terrain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These ruminants can subsist on many feedstuffs that would otherwise be left to waste. Although selective browsers, they often prefer coarse leaves (including palm fronds) and shrubbery to palatable forage grass.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most microgoats mature quickly, and in the tropics they can generally breed year-round. Their reproductive potential has often been underestimated; kidding is rarely difficult, and many types produce twins and sometimes even triplets or quadruplets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In hot, dry areas, goats require less attention than other livestock, and smaller goats have the added advantage of better heat dissipation. Some microgoats may also show disease resistance. For example, tolerance to trypanosomiasis makes them an important livestock in many regions of Africa. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats are generally gentle, but can be easily frightened. They may become stubborn and aggressive when threatened or thwarted, and can prove hard to confine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If their feed smells of other animals - particularly of other goats -  they usually shun it unless nothing else is available. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microgoats mainly produce meat and form an important part of the diet in southern Asia, the Middle East, Africa, and Latin America, especially the Caribbean. Goat is sometimes a preferred meat, and there are few social or religious prohibitions against eating it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some microgoats are good milkers, and under stressful conditions they may keep producing when other livestock are dry. Goat milk is a valuable dietary supplement: it is nutritious, easily digestible, and usually commands premium prices. It makes excellent cheese and yogurt and can be used by people allergic to cow's milk.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microgoats produce some of the finest and most valuable fibers in the world. Angora and Cashmere goats often weigh less than 30 kg fully grown, for example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats produce a fine-textured, durable leather that finds extensive uses both locally and internationally. Horns, hooves, blood, and bone meal also have commercial value. Manure is another important product, and comes in fairly dry pellets that are easy to collect, store, and distribute.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats perform important functions in land management. Seeds of many trees (Acacia and Prosopis, for example) are "scarified" by passing through the goats' digestive system, fostering germination and natural revegetation. With care, goats can also be used to clear land of weeds and brush.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats are often allowed to roam and scavenge for their own food. They form strong territorial attachments and can be trained to stay within a designated area. However, they cannot be kept from investigating - and quite probably devouring - anything within that territory. They are persistent browsers, so it is essential to prevent overstocking as well as raids on crops.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Variety of diet is important, and goats show much individuality in feed preferences. They are often raised on crop residue and kitchen refuse.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats can be run with other livestock without creating serious competition. The goats browse weedy shrubs, whereas the sheep and cattle graze more on grasses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although perhaps the hardiest of all livestock, most breeds benefit when they are provided shelter from rain and high-noon sun. Abrupt chilling and poor ventilation can cause severe respiratory problems. They are also susceptible to various maladies, such as internal parasites, especially when confined. The highest mortality, however, is caused when very young kids are not supplied with adequate feed and clean, dry shelter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In most developing countries goats are already prominent in rural life. Common almost everywhere in Africa, Asia, and Latin America, they are dependable multi-use animals. They are particularly important in providing ready cash, such as for school fees, taxes, marriages, or funerals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats integrate well in mixed agriculture, for example, by consuming leafy wastes, clearing land, and contributing fertilizer. In many places they are raised almost exclusively by women and children. If confined, goats require only simple, inexpensive shelters or pens, which makes them especially important as subsistence animals. In many situations, they may be the most efficient and economic producers for smallholders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals have a relatively fast rate of growth and early reproductive age, even under harsh conditions. They can graze rougher terrain than cattle and most sheep, can go for longer periods without water, and forage well in wooded areas where grass is lacking. They can derive most or all of their diet from roughage unusable by humans; high-energy feeds, such as protein supplements or carbohydrate supplements, are usually not needed even to fatten them for slaughter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats are generally healthy and are not affected by many of the parasites and diseases that ravage other livestock. Some resistance to mange, internal parasites, foot-and-mouth disease, and other livestock scourges has been reported.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some places (notably, in industrialized nations) there is a strong prejudice against goats and goat meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Smallness makes microgoats targets for predators and thieves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many small goats are poor milkers, especially under hardship conditions; however, even small amounts of milk can often fulfill a child's daily nutritional requirement or reinforce a nursing mother's diet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats are independent and may wander away if not watched, and they can be difficult to pen. They may also have an unpleasant odor when kept confined (males are particularly malodorous during rutting season). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goats are often disparaged for degrading land and destroying vegetation because they continue to survive on overutilized lands often laid waste by mismanagement of sheep or cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRESH GENES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A rare wild animal with spectacular horns, the bezoar (Capra aegagrus) is the goat's wild ancestor. People domesticated it before 7000 B.C., probably in the mountains along the Iran/ Iraq border. Until recent times, it remained widely scattered across the vast region between Greece and Pakistan, but it now exists only in pockets and is threatened with extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This would be a tragedy because the bezoar is a resilient wild species that crosses readily with domestic goats, and it could pass on its genetic inheritance for heat, drought, and cold tolerance: disease resistance; and other survival qualities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p39a.png"></center><br>
+ Distribution of the bezoar. The arrow indicates the area where it was probably first domesticated, resulting in the goat as we know it (From Mason 1984)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fascinating science and valuable results probably await those willing to study this hardy, handsome creature and to explore the reharnessing of its genetic endowment. Today the bezoar is considered merely a trophy for hunters. The power of its genes to refresh - perhaps even revolutionize - the world's 500 million goats has been lost to sight. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The microgoat's potential has hardly been realized. More research on performance and husbandry is needed to preserve and restore small breeds. Selective breeding for prolificacy, viability, and rapid growth, as well as more selective on-site culling, could greatly improve both meat and milk yields and quality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Management systems that exploit smallness, stabilize production, and preserve the environment should be introduced and publicized in appropriate goat-rearing areas. Careful assessments of indigenous management methods should be made, particularly emphasizing their desirable characteristics. Improving hygiene in the wet season and supplemental feeding in the dry season are also important, as are disease- and parasite-control measures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The undomesticated ibex and markhor could possibly be major contributors in the development of new, useful breeds for tropical and arid regions (see sidebar, page 42). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">REPRESENTATIVE BREEDS OF MICROGOATS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West African Dwarf (Djallon)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West and Central Africa. Female 20 kg; male 30 kg. Adapted to humid lowlands, this widespread goat is particularly valuable for meat and skin production. Generally, it is bred for meat, but milk is sometimes an important secondary product. Sexual maturity is very early (3-6 months), and quadruplets occasionally occur (most goat breeds normally produce only single births). Related types go by the names "Cameroon Dwarf," "Dirdi," and "Nigerian Dwarf."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nubian Dwarf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United States. 35-40 kg (often less). A stable miniature variety of the milking Nubian, this microgoat has been developed recently in the United States by crossing standard-sized Nubians with the West African Dwarf. It combines a good milk output with high levels of butterfat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">American Pygmy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United States. 15-25 kg. Derived from the West African Dwarf, it is noted for its hardiness and good nature, good milk production, and adaptability to various climates. There are several varieties, some for milking, others for meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sudanese Nubian</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northern Sudan. 25-30 kg. Widespread milk goats of riverain and urban areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sudanese Dwarf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southern Sudan. 11-25 kg. A very hardy desert goat similar to the West African Dwarf, it averages 15 kg, but some mature individuals may weigh as little as 11 kg. Used for meat and hides, it produces little milk.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small East African</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya, Uganda, Tanzania. 20-30 kg. A widely neglected meat and hide animal found over a wide range, it is fast growing (sexual maturity at four months) and extremely hardy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mauritian</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mauritius. 25-30 kg. A prolific, year-round breeder raised for meat production, it is often confined in simple shelters from birth to slaughter. Perhaps because of this isolation, mortality is less than 10 percent, even with little or no veterinary care.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Criollo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Latin America. "Criollo" is a name given to several breeds of ancient Iberian blood with local adaptations to many unfavorable conditions. They are often small and hardy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Creole Caribbean. Females 20 kg; males 25 kg. Robust meat goats of Spanish or West African origin that are kept throughout the Caribbean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crioulo Brazil. 30-35 kg. A meat and skin goat derived from Portuguese ancestors, it is hardy, prolific, undemanding, and adapted to harsh environments. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chapper</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pakistan. Female 20 kg; male 24 kg. Originating in dry regions, this meat and milk goat is a nonseasonal breeder with outstanding potential.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Barbari</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pakistan, India. Females 20-25 kg; males 20-40 kg. A prolific, fastgrowing "urban" goat with high twinning and low mortality. Often kept inside houses, they adapt well to confinement and are important for both milk and meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaddi (White Himalaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hill districts of northern India. 25-30 kg. Kept for meat and their long, lustrous white hair, they are pure-breeding and healthy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Changthangi (Ladakh)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kashmir, India. Male 20 kg. A pashmina (cashmere) goat of India, it is adapted to a high altitude, high humidity climate with extremes of temperature.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Terai</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal. 8-12 kg. A very small, hardy animal of the southern lowlands, it kids year-round (sometimes twice), and often produces twins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southern Hill Goat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal. 12-16 kg. A small, mid-altitude goat resembling the Terai. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black Bengal (Teddy, Bangladesh Dwarf)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eastern India and Pakistan. Female 10 kg; male 14 kg. A widespread, humid-area, meat goat that is early maturing and very prolific. It kids twice a year, and produces 60 percent twins and 10 percent triplets. It produces a superior leather.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Katjang</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southeast Asia, China, and Pacific Islands. In places, less than 20 kg. A widespread, highly variable, hardy goat adapted to humid conditions, it usually has twins or triplets. Used for meat and skins, with exceptional females being milked.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chinese Dwarf (Tibetan, Jining, Fuyang, or Chengdu Grey)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">China. 20-40 kg. Well adapted to the humid tropics, it normally twins and is a good meat producer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Heuk Yumso</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Korea. Female 25 kg; male 35 kg. A prolific cold-climate goat with a year-round breeding season. The meat is highly prized, and often sells at a premium due to its supposed health-giving effects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hejazi</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Middle East. Female 20 kg; male 20 kg. A meat goat, usually black, for harsh desert conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sinai (Black Bedouin)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sinai, Egypt and Negev Desert, Israel. Female 20 kg; male 50 kg. Native to dry, hot deserts, this milk and meat goat matures at 5-8 months and has a twinning rate over 50 percent. A most important characteristic is its drought tolerance. The female, for instance, can drink only once a day - at a pinch, once every other day - without losing appetite or reducing milk flow. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILD RELATIVES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several wild relatives will cross with the goat. Surprisingly, they have the same chromosome number (2n=60), and the offspring are frequently fertile. Although essentially unknown to agricultural science, these hybrids may offer a new gene pool for creating new farm animals and for improving the world's goats. They seem to combine the self-reliance of wild species with the usefulness of domestic ones. Artificial insemination and other modern techniques could make them easier to produce today than ever before.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ibex*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A project in Israel has already produced a cross between the goat and the Nubian ibex (Capra ibex). The Sinai Desert goat, the breed that was used, ranks next to the camel in its ability to go without water - it often drinks only twice a week - but its meat has such a strong flavor that most people consider it dreadful. On the other hand, the ibex is compact and muscular and produces tender, mild meat that steak lovers find delicious. The product from crossbreeding the two is a creature seemingly able to endure extreme temperatures and drought, make use of poor pasture, and produce wonderful steaks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A herd of several hundred of these hybrids (dubbed 'ya-ez") has been created at Kibbutz Lahav in the northern Negev Desert area. Both sexes are fertile, and they can be bred with each other or with either parent. The meat is already in demand on the menus of elegant Tel Aviv hotels. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Markhor**</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In Pakistan's northern uplands, it is not uncommon to find hybrids between domestic goats and the mountain goat known as "markhor" (Capra falconeri). Each year in Chitral and Gilgit, they can be found in the goat markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Markhors inhabit high elevations in rugged mountains and thrive on diets so meager as to be useless to goats. The hybrids are produced when markhor males - perhaps ousted by more dominant males - come in contact with feral domestic goats. However, some farmers raise young markhor and goats together (to overcome mutual resistance) and produce their own hybrids,</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For a single hybrid animal local goatherds pay up to 5,000 rupees, a princely sum in this impoverished region. Traditionally, villagers have kept them as stud animals. They appreciate the animal's genetic endowment. Markhors tolerate extremes of cold and snow, are nimble and skilled at escaping predators, and survive on scanty fodder, Moreover, they have a high reproduction potential because they generally produce twins. As a result, they also tend to give more milk and it is rich in nutritive value. Instead of long body hairs, markhors possess insulating underfur - a soft and valuable raw material for the famous Kashmiri shawls.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apparently, the hybrids can possess many of these qualities together with a calm disposition. Thus they could be useful in themselves and as conduits for passing such traits on to goats. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">3 Microsheep</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among the hundreds of breeds of sheep (Ovis aries) in the world, those weighing less than 35 kg when mature have been largely ignored. Although these are common, the impression lingers that they are too small to be useful. Yet this virtually untapped gene pool is esnecially well adapted to traditional Third World animal husbandry. Given attention, these "microsheep" could boost meat, milk, skin, wool, and pelt production in many villages and small farms of Africa, Asia, and Latin America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many microsheep thrive in environments that tax the ability of larger breeds to survive. They are adapted to poor feeds and can be grazed in uncultivated wastelands unsuited to any other livestock except goats or camels. Because of their size, microsheep can fatten in areas where forage is so scattered and sparse that larger animals cannot cover enough ground to fill their bellies each day. In addition, their foraging complements that of other livestock. For example, sheep can graze rough grasses and weeds that cattle find unpalatable. Some survive even the stress of extreme aridity and for this reason are the predominant livestock in North Africa and the Middle East.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many small breeds can be disease resistant. Some, for example, are widespread in the zones of Africa where trypanosomiasis is prevalent. They are generally less adversely affected by foot-and-mouth disease than are cattle, and some small native sheep seem to have fewer problems with insects and parasites than do most other livestock, including temperate-area sheep.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giving more attention to the management and improvement of microsheep could pay back abundantly in the form of food, income, and improved land utilization in many parts of the developing world. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide, but notably in drier regions of the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">An average weight for temperate sheep breeds is about 70 kg,' but the smallest microsheep weigh less than 20 kg fully grown. Many tropical microsheep are "hairless," and have little or no wool. These are often difficult to distinguish from goats, but (like all sheep) they generally have blunter snouts, more fat, and hanging tails. Some have greatly enlarged rumps or tails that store fat. Unlike goats, sheep have no odor-producing glands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some representative microsheep are described at the end of this chapter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than one billion sheep occur worldwide, and they occupy every climatic zone in which people live. At least half are in developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although more than 1,000 breeds are recognized, only a handful dominate the world's sheep industries. Lesser-known breeds are rapidly becoming extinct (especially in developed countries, although scattered efforts are being made to preserve them). Elsewhere, genetic resources have not been properly evaluated, and potentially valuable stock is being lost before it is even understood.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep are among the most adaptable animals. Various types are kept in areas of extreme heat, cold, altitude, aridity, humidity, and rainfall. They are especially widespread in hot, dry climates, but some breeds also thrive in humid areas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep make efficient use of a wide variety of fodder: tree leaves, fortes, grasses, crop residues, and agricultural by-products, for instance. They often survive privation by calling on their reserves of body fat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the tropics, sheep reach sexual maturity in about a year. Many breeds lamb year-round, which allows for a continuous production of premium meat. Gestation takes about five months, and lambing is usually timed to occur when feed is most abundant and nutritious. Microsheep often bear two or more young and, under good management, may produce lambs annually for more than five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These shy animals flock together and, in general, are managed with little effort. They are easily panicked, however, and rams can become aggressive during rutting or when threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE LITTLE SHEEP THAT COULD</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dozens of the world's neglected breeds of tiny sheep should be preserved from extinction, for many will undoubtedely prove to have outstanding qualities. Current efforts to save the Navajo sheep in the United States exemplify what can be achieved</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Navajo is a microsheep, and is perhaps the oldest breed of sheep in the United States. It may have been introduced to North America in 1540 by the Spanish explorer Francisco Vazquez de Coronado, who was seeking the mythical Seven Golden Cities of Cibola in the region that is now Arizona and New Mexico. Smaller than many dogs, a full-grown Navajo sheep may weigh only 30 kg, but it became a big part of the culture of the Southwest. Although the Navajos and other local Indians had never seen sheep before the 1500s, they soon became shepherds and weavers, and their rugs made from the unique wool of this wiry little animal remain famous even today.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Navajo sheep have white or brown wool hanging in ringlets around their bodies. The fleece is a double coat: long, coarse guard hairs on the outside and short wool on the inside. It yields warm, waterproof, and long-lasting products. Many of the sheep have four horns because the Indians believed that this trait was sacred, and they favored four-horned rams for breeding purposes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The number of Navajo sheep was reduced sharply between 1950 and 1950 because of severe overgrazing and replacement by improved wool breeds. In recent times there has been so little commercial and scientific interest in this microsheep that by the 1970s only a handful of purebred specimens survived. Since the late 1970s, however, Lyle McNeal, a Utah State University professor, has been working to save it from extinction. By 1988 he had a burgeoning flock at the university and was learning that this supposedly obsolete dwarf is amazingly useful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The breed originated in the arid south of Spain (where it is called the "churro"), and it thrives in the hot, dry climate. Unlike normal breeds, it can exist in the desert without supplementary food and with little water. As McNeal has pointed out, any sheep that can survive and raise a lamb in the aridity and searing heat of the American Southwest has to be superior. He has found that the ewes have a strong maternal instinct, which is vital for protecting lambs against the coyotes that are common in the region. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thanks to the efforts of McNeal and his colleagues, Indians are beginning to use Navajo sheep again; by 1988 there were more than 400 on the Navajo reservation, with their wool fetching premium prices. This tough little sheep could prove valuable not only for American Indians but for poor people in many other dry regions as well. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Microsheep are mainly kept for meat production, but - especially in arid regions - for milk as well. Their meat is usually lean with little "muttony" taste.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wool or hair is taken from many breeds, although the yield is often small. Skins from hair sheep' thinner than cowhide, are widely used and are in international demand. In some places, manure is considered an important product. In Nepal, thousands of small sheep are used as pack animals, especially to carry salt into mountain valleys.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most sheep are maintained in free-ranging flocks. Many are grazed (often tethered) over a small area during the day and confined in a "fold" at night. Others are penned or kept as village scavengers. These are usually fed supplements of household scraps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep form an integral part of a mixed farming economy; for example, they may graze pastures during the wet season, and survive on crop residues and field weeds during the dry season. They have excellent foraging capabilities and are often kept alongside goats. This broadens the variety of forages utilized and often increases total production from a single piece of land, for sheep and goats have complementary feeding habits and male goats help protect the sheep from some predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In spite of the heavy toll that predators (such as feral dogs) can take on lambs and ewes, the largest proportion of sheep in the tropics are lost through lack of basic care. Modest supplemental feeding of lambs and inexpensive preventive medicines can do much to lower mortality and boost production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep are multipurpose animals, and almost everywhere they produce several products. The rich milk is often preferred to that of cows or goats, especially for making cheese and yogurt.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lambs form an important part of the household economy for much of the rural world, and only rarely is social or religious stigma attached to keeping or eating them. Indeed, sheep are the traditional feast animals of several religions, and in some places sheep meat is preferred to beef and sells at a premium.</P>
+<P ALIGN="JUSTIFY">By and large, all sheep products can be processed, utilized, or marketed by the producer. In addition, sheep marketing and transportation systems exist in most countries, at least to some degree.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep are efficient producers and can provide a quick turnover for food and cash. On the brush and coarse grasses of marginal lands, they may be more productive than cattle, and on grass they may outproduce goats. As long as they are not overstocked, sheep do not degrade vegetation; unless starving they will not debark trees. Small breeds cause little erosion, even on steep slopes, heavily traveled paths, or near water holes.2 In South Asia, they have been continuously stocked on the same ground for thousands of years without causing apparent harm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because sheep have a natural tendency to accumulate fat, they "finish" well on grazing and usually do not require a high-energy finishing diet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite their general healthiness, sheep are affected by many internal parasites and diseases, a few of which are communicable to man. They are especially susceptible to infectious conjunctivitis (pinkeye).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Predators and thieves can be greater threats than sickness. Labor inputs can be high because of the almost continual protection sheep need.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some mutton has a strong taste that many find unappealing. However, the taste is carried mainly by the fat, and the generally lean microsheep are often commended for their fine-textured, sweet meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The numerous breeds of small sheep should be investigated. Assessments should be made for the animals' ability to thrive under adverse conditions and for resistance to particular diseases and parasites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, even minimal extension services and veterinary support for sheep could greatly decrease mortality, especially among lambs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improving microbreeds without increasing their size is one of the most interesting challenges facing sheep scientists today. While efforts should be made to conserve and select within types, research should also be conducted on hybrid vigor. Efforts to improve the pelt and fleece of microsheep should also be encouraged.</P>
+<P ALIGN="JUSTIFY">More studies on the interactions between sheep and cropping systems are needed. Sheep (and the manure they produce) could become important components of forestry (see sidebar), crop rotation, alley cropping, and other forms of sustainable agriculture. For instance, sheep are especially effective for weed control in plantation crops such as oil palm and rubber as well as in forests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SMALL SHEEP IN THE FOREST</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Even in countries with long traditions of raising large sheep, there are opportunities for using small, agile, hardy breeds. The following is an example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Seeking safer methods for stopping brush from smothering newly planted trees, U.S. government foresters have turned from chemical defoliants to flocks of sheep. Court decisions in 1983 and 1984 barred the use of herbicides along Oregon's Pacific Coast. Various alternatives were tried, and the animals proved the most successful. Sheep are now the favored method for controlling unwanted vegetation. Indeed, they have changed the foresters' whore approach to managing reforestation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Formerly, the U.S. Forest Service allowed the brush to grow on logged-over sites and then sprayed it down before planting tree seedlings. Now it plants grass to suppress brush and reduce erosion. The sites are later fertilized, tree seedlings are planted, and within a year sheep are brought in to graze. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, in the district around Alsea, Oregon sheep nimbly skirt old stumps to graze on the lush vegetation. Three times each summer since 1984, about 2,000 sheep have been guided across the replanted areas by a herder and a range conservationist. The sheep eat both the grass and the new buds on brush, but they leave most fir-tree seedlings untouched. The key, according to Rick Breckle, a forester, is to have enough sheep to graze an area evenly and to keep them moving so they don't resort to nibbling the young trees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Previously, chemical brush treatments had annually cost $135-$353 per hectare. Now, sowing grass and grazing sheep costs about $300 per hectare. And there is a product to sell: the adult sheep don't fatten well, but the lambs bring a useful income at the end of the summer. What is more, Breckle reports that the trees seem to be growing faster - probably because of the manurings they receive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This method seems likely to be effective elsewhere - at least with trees that are unpalatable or too tall for their growing points to be nibbled. Malaysia, for instance, doubled its sheep population between 1986 and 1989, in part because it has begun raising sheep between the trees in rubber plantations. With the use of agroforestry increasing worldwide, small sheep could find a whole new application.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">REPRESENTATIVE EXAMPLES OF MICROSHEEP</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West African Dwarf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Senegal to Nigeria, and south to Angola. Female 25 kg; male 35 kg. Well adapted to warm, humid conditions. Prolific, and good disease resistance. Major meat producer in West Africa. Fast growing: by six months of age they approach adult weight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Landim (Small East African)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">East and Central Africa. 23-40 kg. Prolific, adaptable, long fat-tailed type. Large litter size for a sheep. In one recent test, ewes averaged more than 1.4 lambs.3 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berber</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Atlas Mountains. 25-41 kg. Needing little feed and remaining constantly outdoors, these extremely hardy sheep are exploited for meat and their coarse, hairy wool. They fatten easily when well fed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arab</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">North Africa. 40-50 kg. This thin-tailed sheep is exceptionally robust, and is resistant to extremes of temperature, drought, and poor nutrition. Primarily a meat producer, its wool is used for coarse cloths and carpets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southern Sudan Dwarf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the many small breeds of eastern and southern Africa, its weight ranges from 15 to 25 kg, but it may weigh as little as 11 kg. Yielding a fine, short fleece, this hardy, frugal sheep is often run with cattle to maximize grazing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hejazi</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Deserts of Arabia. 32 kg. A popular and ancient fat-tailed meat producer that is highly acclimatized to drought and privation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zel (Iranian Thin-Tailed)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caspian region of northern Iran. Female 30-32 kg. Well adapted to subtropical regions, they produce coarse wool, milk, and excellent meat that lacks the "mutton taste" and odor of some sheep meats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Greek Zackel</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mountain and island types. Female 30 kg; male 40 kg. These common sheep are active, hardy, and resistant to extremes of climate and disease. Primarily a milking sheep, their wool is used locally and lambs are slaughtered for special occasions. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sitia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crete. Female 25 kg; male 30 kg. Another of the hardy, screwhorned "zackel" sheep common to the Balkans, they are adapted to poor pasturage and extensive herding. Quick maturing and highly fertile, they can be exploited for milk as well as for meat and coarse wool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Common Albanian</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Female 25 kg; male 35 kg. Similar to the Greek Zackel, they are used as triple-purpose animals: meat, milk, and wool. They survive in low, marshy areas where parasites are common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zeta Yellow</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yugoslavia. Female 25 kg; male 35 kg. A small, hardy sheep used for milk and some meat, its primary product is wool. Often unshorn for several years, the long fibers are woven into expensive carpets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pag</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yugoslavia. Female 20-30 kg; male 25-35 kg. These wool, milk, and meat sheep are frugal and well adapted to scant vegetation and rocky terrain. Although they have a low birth rate and carcass yield, their milk and wool are commercially exploitable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Roccia (Steinschaf)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northern Italy, Austria. Female 30 kg; Male 30-35 kg. These "stone sheep" resemble a goat in their ability to exploit the poor pastures of high, steep, rocky mountains. Although not highly productive, they are hardy and frugal and commonly produce twins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corsican</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corsica (France). 25-30 kg. A hardy native breed that is well adapted to rather sparse feed conditions. Coarse wool, both white and black, is well suited for hand processing. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Entre Douro e Minho</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Portugal. Female 15-18 kg; Male 20-25 kg. These independent sheep yield a good wool in mountainous terrain that would otherwise be nonproductive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Churra do Campo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Portugal. Female 20 kg; male 30 kg. A coarse-woofed sheep extensively kept in Portugal's dry interior for milk and wool. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Galician</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Spain. Female 18 kg; male 25 kg. A milking breed that survives on  poor pasture, it also produces a marketable wool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Soay</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scotland. Female 25 kg; male 30 kg. Adapted to wide temperature  variations. Possibly the most primitive domesticated sheep of Europe,  probably unchanged from Viking times. Immune to foot rot. A wool  sheep with short brown fleece that is shed annually.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">North Ronaldsay (Orkney)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northern Scotland. 27-32 kg. Surviving year-round on seaweed,  this rare breed is adapted to high salt intake and the associated digestive  problems. Yield 1-2 kg medium-coarse wool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Criollo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Latin America. Derived from ''native'' Spanish Churro and Merino  sheep. Many are small and very hardy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Navajo-Churro Southwestern United States. Female 45 kg; male 70  kg. Maternal, and very resistant to internal parasites and hoof rot.  Although the Navajo subsists and reproduces on little feed and scarce  water in desert regions, it was widely replaced by improved breeds  earlier in this century. Because of its hardiness, however, and the use of  its wool in traditional weaving, its numbers are rebounding (see sidebar,  page 50). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Florida Native Southeastern United States. Females 35-45 kg;  males 45-6O kg. This long-isolated and highly variable sheep is  adapted to harsh subtropical climates and is known for its ability to  forage. A medium-wool breed, it is very resistant to intestinal parasites.  Verging on extinction due to neglect and uncontrolled crossbreeding. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Virgin Islands White Hair (St. Croix)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caribbean. Female 35-45 kg; male 45-55 kg. Hair sheep with  some wool in young animals. Well adapted to warm humid conditions, it has fairly good disease and parasite resistance and produces good meat. Prolific, it breeds most of the year and commonly has twins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Magra (Chokhla)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northwest India, Pakistan.4 20-25 kg. Adapted to hot, dry areas, the extremely white and shiny fleece is valued for carpet wool. Slowmaturing and low fertility (lambing at 45 percent) plus extensive crossbreeding have led to serious declines in population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Marwari</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northwest India. 25-30 kg. A widespread, white-fleeced sheep that has a high resistance to disease and worms, good fertility, and low mortality. They do well in large flocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mandya (Bandur)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southwest India. Female 25 kg; male 35 kg. An outstanding meat breed with good mutton quality, it adapts well to mixed farming and has unusually low lamb mortality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hu (Huyang, Lake Sheep)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">China. Female 35 kg; male 45 kg. These fat-tailed sheep have a six month lambing interval and are very prolific. They are used under intensive management to produce meat, wool, and a valuable lambskin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Javanese Thin-Tail</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Indonesia. 25-40 kg. Widely held as a "bank account," these meat, manure, and skin sheep are well known for being prolific. Although single lambs are not uncommon, litters of six have also been recorded. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILD AND WOOLLY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Considering that dozens of countries depend on the productivity of more than a billion domesticated sheep, it is remarkable that their wild ancestor is accorded no attention. This fast-declining animal is now little more than a trophy for hunters, a fact that should be of vital intemational concern.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheep were domesticated in the Middle East and Central Asia in the Stone Age era between 8,000 and 11,000 years ago.* Their wild ancestor was almost certainly the mouflon (Outs orientalis). However, domestication may have occurred in more than one place, and two other wild creatures, the urial (Outs vignei) and the argali (Outs ammon), also possibly provided genes to some sheep breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mouflon, urial, and argali still exist in the mountains of Central Asia, and a European subspecies of mouflon is also found in the Mediterranean, but only on Corsica, Cyprus, and Sardinia.** Because they live in remote, rugged, upland areas, these wild sheep are usually undisturbed, but the numbers are decreasing everywhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This may be a serious loss because these animals could be extremely valuable. They are capable of crossing with domestic sheep, and the offspring are viable and fully fertile.*** For developing new meat-producing breeds, their potential seems almost limitless.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the thousands of years that sheep have been protected by humans, their wild ancestors have continued to face predators, parasites, disease, extreme cold and seasonal starvation. Their genetic endowment, forged and tempered in unforgiving harshness, could be a benefit for all future sheep generations. These animals appear to resist various diseases. Their meat is reported to be of excellent quality, notably lacking the strong mutton flavor that many people find objectionable. They have relatively short, thin tails - a feature that might eliminate the need for docking (tail removal) in the domestic flock. Some (for instance, the Asian mouflon and the urial) have rates of effective reproduction up to 1.6 lambs per ewe, more than twice the average of most domestic types, especially under the conditions where these wild creatures live.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That mouflon and other wild sheep could have practical utility is suggested by research at Utah State University. Scientists there have mated mouflon with farm sheep to create sheep better able to defend themselves against coyotes and other natural dangers. Half-wild, half-tame sheep hybrids have existed on a ranch in southern Utah for the past decade. Also, in Cyprus similar mouflon x sheep hybrids have shown considerable promise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the very least, this wiry little mountain sheep could be a model for educating students and the public. It is a living reminder of the fantastic changes that can be induced in animals by selection for various traits. Also, it is a "map" to the history of sheep domestication. Studies of mouflon genes, blood immunology, morphology, physiology, horn structure, skeleton, fleece, temperament, and a host of other features would help unravel the ancestry. These studies and various biochemical analyses would be a fascinating contribution to agriculture, science, history, and the public perception of the origins of our natural resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Genes from wild sheep are not likely to quickly benefit wool production. Lack of fleece is one reason why these creatures have been neglected but throughout most of Asia and in North Africa, sheep are bred primarily for meat and milk, and there is a growing worldwide interest in the use of hair sheep. All of this brings new possibilities for the use of this old resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">4 Micropigs</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g005a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most breeds of swine (Sus scrofa) are too large to be considered microlivestock, but there are some whose mature weight is less than 70 kg. These micropigs are particularly common in West Africa, South Asia, the East Indies, Latin America, and oceanic islands around the world. At least one, the Mexican Cuino, may weigh a mere 12 kg full-grown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many miniature swine have been developed for use in medical research, but their agricultural potential has been largely ignored. This is unfortunate, for micropigs of all types - native, feral, and laboratory - deserve investigation. Swine provide more meat worldwide than any other animal, and micropigs are potentially important sources of food and income for poor people in many parts of the developing world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Smallness makes for nimble and self-sufficient pigs, in contrast to large, lethargic breeds. Small breeds are easier to manage and cheaper to maintain; the threat of injury from angry or frightened animals is lessened; and the sows are less likely to crush newborn piglets, often a major cause of mortality in large breeds. Some micropigs - particularly those from hot regions or wild populations - also have a higher resistance to heat, thirst, starvation, and some diseases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs adapt to a wide variety of management conditions, from scavenging to total confinement; some are even kept indoors.2 They gain weight quickly, mature rapidly, and help complement grazing livestock because they relish many otherwise unused wastes from kitchens, farms, and food industries, as well as other foods such as small roots, leafy trash, or bitter fruits that are not consumed by humans or ruminants. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For these reasons, micropigs could become useful household and village livestock in the developing world, and they deserve greater attention than they now receive. Although their growth may not be as rapid as that of improved breeds raised under intensive commercial production, with modest care and minimum investment, backyard micropigs can produce sizable yields of meat and other products, as well as improved income for rural and even urban populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide, especially in warm, humid areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like full-sized breeds, micropigs are stout-bodied, short-legged animals with small tails and flexible snouts ending in flat discs. Examples of some micropigs are listed at the end of the chapter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic pigs are found all over the world, but their concentrations vary greatly. Africa has the fewest per capita, but in recent years they have gained increasing favor in the sub-Saharan regions. In Latin America, pigs have long been a major component of backyard agriculture. In the Middle East, an early center of domestication, pigs are not widely kept today because of religious dietary restrictions. In the Ear East, they are the major meat source, and China has more pigs than any other country. And in the Pacific region, pigs and chickens are often the only meat available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are becoming more popular: their worldwide numbers increased by about 20 percent in the 1970s. However, in most countries commercial pig production has focused on a mere handful of breeds, and much genetic diversity is unstudied or even threatened with extinction. Some microbreeds have already been lost, and others are dwindling in numbers.3 Many European breeds have been completely lost. The Cuino and some other Latin American criollo types are threatened, as are most of Africa's traditional breeds. China, however, has made notable efforts to preserve its native types. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although, as previously noted, pigs are found all over the world, they are in general adapted to warm, humid climates where many other livestock species are more susceptible to diseases and environmental stresses. They are also raised at high altitudes, such as in the Andes and Tibet. Although there are few climatic limitations to pig production, only about 20 percent of the world's pigs are currently kept in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are omnivores, willing and able to eat almost anything.4 Unlike most other livestock, they eat their fill and sleep as the food digests, allowing humans to establish a convenient eating and sleeping schedule.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are prolific; a few Chinese breeds routinely have litters of 20 or more. Micropigs are no exception; litters of 6-10 are common. Piglets gain weight rapidly and can be weaned after a few weeks. Sexual maturity is sometimes attained as early as 4-6 months, depending on breed and environment. Pigs are usually slaughtered at 67 months of age, allowing them to be produced on an annual cycle. They can live 10-20 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of their smaller size, micropigs have a relatively greater skin-to-weight ratio than today's commercial breeds, and therefore they probably shed heat more effectively. Certainly they seem to perform better in tropical heat and humidity, which normally keep the heavier types from reaching their maximum productivity. Studies have suggested that an optimal size for some tropical environments - because of metabolic and feed efficiency - may be less than 65 kg.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are social animals; they enjoy companionship and ferociously defend their young and sometimes even the humans who care for them. They are employed as guard animals in some areas and have been used extensively in behavioral research.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contrary to common belief, pigs are clean and tidy if provided adequate space. Larger breeds, however, wallow in mud to stay cool in hot weather and require a wallow or shade (except for some Latin American types, which seem less susceptible to heat). Some lightcolored pigs sunburn easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs will dig up earth with their mobile snouts; some breeds do it constantly. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fresh pork is the major pig product in tropical areas. It usually fetches premium prices, and in many places (such as the Pacific Islands and China) it is the most important red meat available to rural people. Nutritious and tasty, it is one of the easiest meats to preserve, needing only salt or melted fat. Processed products such as bacon and sausages can be important for both home consumption and cash sales.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pig fat (lard) is a good source of food energy, and can substitute for cooking fats and oils. It is easily melted and clarified, is widely used to make soap, and is a valuable commercial product.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pig skin, once degreased, is easily tanned into leathers that are popular for garments, shoes, and other products demanding soft, light, and flexible leathers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pig manure is a good fertilizer. Because the animals are often kept in confinement, it can be easily collected.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In many places, pigs are kept as free-roaming scavengers. They can be trained (by coaxing with feed, salt, or affection) to keep close to home, thereby helping to minimize destructive scavenging.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Herding is a higher level of management that requires more effort, but it allows pigs to be integrated into other types of agriculture while utilizing feeds that otherwise go to waste.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because their exercise needs are minimal and dominance is quickly established within litters, pigs are the easiest hoofed livestock to raise in small enclosures (sties). However, fencing must be secure, and if sties are small, the animals must be moved frequently to prevent diseases and parasites from building up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are well-known, often traditional, animals in many areas, and people usually do not have to be taught how to manage and use them. Efficient scavengers, they can live, grow, and reproduce with a minimum of investment or specialized care. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs are highly efficient converters of feed to meat. They can provide the greatest return for the least investment of any hoofed livestock because of their fecundity, low management costs, broad food preferences, and rapid growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs normally accumulate fat during adolescent growth (making ''finishing" feeds less necessary). Some micropigs (especially those from feral ancestors) have the ability to quickly mobilize and store these body-fat reserves; in times of extreme scarcity, it aids their survival.6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigs work well in multiple-cropping schemes. They are often used to help clear small plots by uprooting weeds, shrubs, and even small trees. In Southeast Asia, they are frequently raised in conjunction with aquaculture, their manure providing food for the fish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If improperly managed or maintained in filthy conditions, pigs may quickly succumb to disease and parasite epidemics. Most diseases are communicated only among pigs, but some can be transmitted to humans. For this reason, pork should always be fully cooked.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some cultures never eat pork. Others do, but nonetheless accord pigs and their keepers low status.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young pigs are vulnerable to many predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A major survey of small pig breeds is needed. They have the potential to be valuable producers in their own right, as well as to improve other pig breeds. For instance, they represent a little-known reservoir of disease resistance and climatic adaptation. Governments, research stations, universities, and individuals should make special efforts to preserve types that have outstanding or unusual qualities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When it is necessary to eradicate feral pig populations (as is common on Pacific islands), representative stocks should be preserved. These rugged animals have been genetically isolated for decades or even centuries and are likely to carry valuable traits for survival under adversity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Large breeds may be promising candidates for genetic "downsizing," which has already produced the many types of miniature pigs that are used in medical research. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE LITTLEST PIG</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although this chapter highlights the world's smallest breeds, there exists a pig that is even smaller. It is, however, an entirely different species and it is on the brink of extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pigmy hog (Sus salvanius) is a shy and retiring wild creature of northeastern India. It is merely 60 cm long with a shoulder height of 25 cm, and weighs less than 10 kg. It was once found widely along the southern foothills of the Himalayas. Today, however, it apparently occurs in only one area, the Manas National Park in Assam. Despite this protection and the fact that it is listed among the 12 most endangered species on earth, it still falls victim to hunters and to habitat destruction - especially illegal grass fires.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If saved from extinction, this minute species - barely reaching a person's calf - might become useful throughout the world. Its chromosome number is the same as that of the common pig and its physiological processes are probably also similar. Therefore, were its numbers to be built up, it might become a valued and well-known resource for laboratories and small farms. Its daily food intake and its space requirements are only a fraction of a normal pig's. It probably has exceptional tolerance to heat, humidity, and disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is not a domesticated species, and there is therefore much to learn before its usefulness can be clearly seen. Indeed, whether it can be reared in captivity is uncertain. Some attempts have ended in disaster, but this seems to have been the result of mismanagement.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before there is any possibility of developing it, however, the pigmy hog must be preserved from ultimate loss. The last specimen could go into a villager's pot at any time now. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g006a.png"></center><br>
+ Adult male of the common pig (wild boar) and pigmy hog draw to same scale. (W.L.R. OLIVER)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">REPRESENTATIVE EXAMPLES OF MICROPIGS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West African Dwarf (Nigerian Black, Ashanti)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">West Africa. Mature weights of 25-45 kg are reported. In the humid lowland forests of West Africa this breed has long been kept by villagers, often as a scavenger. Indigenous to the hot, humid tsetse zones of West Africa, it seems resistant to trypanosomiasis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chinese Dwarfs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">China (and Southeast Asian countries such as Vietnam) has long had small pigs - often characterized by numerous teats and large litters - associated with traditional intensive agriculture as well as scavenging conditions. Some Chinese pigs weighing less than 70 kg are adapted to tropical and subtropical conditions, but the smallest (20-35 kg) live in the cold climates and high altitudes of Gansu, Sichuan, and Tibet. Small black Chinese pigs were crossed with European types in the early 1800s and produced the foundation stock of many modern Western breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Criollo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are a number of "native" breeds throughout Latin America commonly known as "criollo." Many are quite small. Although, apparently, they are slow to mature and bear small litters, they adapt well to environmental extremes and are widely kept by rural inhabitants for food and income. Criollos are little studied and are being replaced by imported breeds before their possibly outstanding qualities can be quantified.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cuino This micropig from the highlands of central Mexico may be descended from small Chinese types and is the smallest domestic pig, weighing as little as 10-12 kg fully grown. Hardy and an efficient scavenger, it can grow quickly when feed - especially corn - is abundant. A century ago the cuing was a widespread household animal and was used for a time for experimental work in central Mexico. It is now little known and could be threatened with extinction. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black Hairless (felon, Tubasqueno, Birish) These small pigs of central and northern South America survive in hot, humid, adverse climates. They are adapted to bulkier feeds than most pigs and can thrive on fruit wastes. Many local types exist. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nilo (Macao, Tatu, Canastrinha) This small, widespread, black, hairless pig of Brazil is often kept inside the house. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yucatan Miniature Swine A subtype of the black hairless from Mexico's hot, arid Yucatan Peninsula, it was imported into the United States in 1960. It has been downsized for laboratory use in the United States and is known as the Yucatan Micropig (registered). Weight at sexual maturity has been lowered through selective breeding from 75 kg to, currently, between 30 and 50 kg, with an ultimate goal of 20-25 kg. There is no evidence of "dwarfism," stunting, or loss of reproductive performance, and it appears to hold notable promise as microlivestock for developing countries. The parent stock, used for meat and lard production in Yucatan, is renowned for gentleness, intelligence, resistance to disease, and relative lack of odor. Exceptional docility, even in older boars and sows with litters, makes them easy to handle without the need for specialized housing or equipment.7 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Laboratory Breeds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other miniature laboratory pigs have potential for tropical use. These include the Goettingen, Hanford, Kangaroo Island, Ohmini, Pitman-Moore, and Sinclair (Hormel). In general they weigh 30-50 kg when ready for slaughter and mature at less than 70 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ossabaw</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United States. 20-30 kg. Feral on Ossabaw Island, South Carolina, for more than 300 years, this pig is well adapted to environmental extremes. Unlike most domestic animals, it can maintain itself in coastal salt marshes. It has perhaps the highest percentage of fat of any pig. The piglets are very precocious, self-reliant, and robust.8</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kunekune (Pua'a, Poaka)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Zealand. Female 40 kg; male 50 kg. Perhaps of Chinese origin, these black-and-white spotted pigs are docile, slow, and easy to contain. Although late maturing, they can fatten on grass alone. Like other native breeds throughout the Pacific region (for example, the Pauta of Hawaii), stock is being lost through crossbreeding, displacement by other breeds, and eradication efforts. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To find certain disease-resistant genes in poultry it may be necessary to go looking in the backyard chicken flocks in Latin America, Africa, or Asia.</P>
+<P ALIGN="JUSTIFY">Kelly Klober</P>
+<P ALIGN="JUSTIFY">Small Farmer's Journal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">. . . Policies are needed to encourage development of a labor-intensive small-scale livestock sector, which would increase employment and provide a major market for surplus cereals. This sector, however, is particularly restrained by poor technology, poor public support services, and poor marketing channels. Third World livestock production of this type could provide a natural focus for foreign assistance that earlier seemed inappropriate because of concerns about global food scarcity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John W. Mellor International Food Policy Research Institute</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Successful development of agriculture often requires an intimate understanding of the society within which it is to take place - of its systems of values, of its customary restraints.... It has been necessary to understand what incentives the farmer needs to change, what practical difficulties he encounters introducing change, what his traditional pattern of land use is and how this pattern or system can be upset by thoughtless innovation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John de Wilde</P>
+<P ALIGN="JUSTIFY">Experience with Agricultural Development in Tropical Africa </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part II : Poultry</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g007a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens, ducks, muscovies, geese, guinea fowl, quail, pigeons, and turkeys epitomize the concept of microlivestock. Throughout Africa, Asia, and Latin America they are (collectively) the most common of all farm stock. In many - perhaps most - tropical countries, practically every family, settled or nomadic, owns some kind of poultry. In the countryside, in villages, even in cities, one or another species is seen almost everywhere; in some places, several may be seen together. Although raised in all levels of husbandry, these birds occur most often in scattered household flocks that scavenge for their food and survive with little care or management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Their size bestows microlivestock advantages, including low capital cost, low food requirements, and little or no labor requirements. They are also "family sized": easily killed and dressed, with little waste or spoilage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These poultry species help meet the protein needs of the poorest people in the world. Some are raised even in areas where domestic cattle cannot survive because of afflictions such as trypanosomiasis and foot-and-mouth disease. Some are maintained under conditions of intensive confinement - provided a source of feed is available - and can be produced in areas with insufficient land for other meat-producing animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, these birds grow quickly and mature rapidly. (For instance, a chicken can, under proper conditions, reach maturity in 26 months.) They adapt readily to being fenced or penned much, or all, of the time. And, compared with the major farm livestock, their life cycles are short and their production of offspring is high. Thus, farmers can synchronize production to match seasonal changes in the availability of feed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although poultry contribute substantially to human nutrition in the tropics, it is a small fraction of what it could be. The meat is widely consumed and is in constant demand. An excellent source of protein, it also provides minerals such as calcium, phosphorus, and iron, as well as the B-complex vitamins riboflavin, thiamine, and niacin. Nutritionally as complete as red meat, it is much lower in cholesterol and saturated fats. Poultry eggs are also important sources of nutrients. They are a renewable resource, easy to prepare, and are among the best sources of quality protein and vitamins (except vitamin C).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In spite of their numbers and potential, poultry are rarely accorded primary consideration in economic development activities. All in all, these small birds lack the appeal of large, four-legged livestock. Indeed, most countries have little knowledge of the contribution household birds actually make to the well-being and diets of their peoples. In some countries - even those where birds are widely kept - there is little or no poultry research or extension. And where such programs do exist they usually focus almost exclusively on the production of chickens under "industrial" conditions near cities (see sidebar, page 75).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most developing countries now have these intensive chicken industries, in which birds are kept in complete confinement. However, these commercial operations provide food for people in the cash economy, not for subsistence farmers. Moreover, grain is sometimes diverted or imported to maintain these operations, perhaps causing food shortages, higher prices, or depleted foreign exchange. Thus, in this section we focus on other, neglected, aspects of poultry production.,</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The neglect of poultry that scavenge around the rural farmhouses and in village yards is understandable. The birds are scattered across the countryside where extension programs are difficult to implement. Their presence is often so ingrained in traditional village life that they are taken for granted and ignored by the authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet village poultry deserve greater attention. As converters of vegetation into animal protein, poultry can be outstanding. In fact, it is estimated that, in terms of feed conversion, eggs rank with cow's milk as the most economically produced animal protein, and that poultry meat ranks above that of other domestic animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most Third World poultry flocks live a wary, half-wild existence, scrounging for insects, earthworms, snails, seeds, leaves, and leftovers from the human diet. From dung and refuse piles they salvage undigested grains, as well as insects and other invertebrates. Often the persons who care for them are women or children. Some keep the birds around the house, penning them at night for protection from predators and thieves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This almost zero-cost production has, in spite of high losses, a remarkable rate of return. Any improvements that require the purchase of supplies cut severely into the profitability. The first step in improving the production of free-ranging poultry is vaccination against diseases (especially Newcastle disease, fowl pox, and Marek's disease) and a modest, supplemental feeding during times of seasonal scarcity. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE INDUSTRIAL CHICKEN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Throughout modem livestock farming the trend is toward more intensive methods, and poultry specialists have set the pace. In many countries, since the 1920s, barnyard fowl have given way to egg and broiler factories. The old-fashioned chicken reared outside on corn stubbles for 5 or 6 months has been replaced by the broiler, mass-produced in controlled environment houses in 7 - 10 weeks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As a result of this revolution in poultry raising, small farmers who once made a comfortable living from a few laying hens have been forced out of business. These economic changes have also forced poultry men to have larger and larger flocks to survive. The largest broiler-chicken companies even control their own breed development, feed production, house construction, slaughtering, and freezing, many even have wholesale outlets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The rapid changes in poultry farming methods can be attributed to the application of advanced technology. The development of the incubator to replace the mother hen sitting her seasonal clutch of eggs was the first mayor step toward intensive poultry farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, chickens were the first livestock to receive serious attention from geneticists. Before World War II, it was discovered that crossbreeding selected pure and inbred lines could result in dramatic increases in production. Hybrids tailor-made for egg or meat production quickly ousted the old pure breeds such as the Rhode Island Red White and Brown Leghorns, Light Sussex, and the various crosses among them. Chicken broilers made by crosses involving parents derived from Cornish and Plymouth Rock have supplanted all others.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This situation now prevails in most industrialized countries. The breeding of commercial stocks is in the hands of a few corporations for each commodity (white eggs, brown eggs, chicken broilers, turkeys) and each has national or even global distribution of its hybrid stocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A BREAKTHROUGH IN POULTRY HEALTH</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Newcastle disease is endemic in developing countries and is a constant threat to poultry. Farmers dread this virus, first identified half a century ago in northern England that brings diarrhea, paralysis, and death to most poultry. It is severe, highly contagious, and can cause 100 percent mortality. When it strikes an area, farmers must kill all chickens - even healthy ones - to stop it from spreading.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only Australia, New Zealand, Northern Ireland and some Pacific islands are unaffected. But, although the disease is not found in Australia, certain strains of the virus are present in Australian chickens. These strains are completely harmless, but Australian researchers have found that they induce antibodies that are effective against Newcastle disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a joint project (funded by the Australian Centre for International Agricultural Research), scientists from Malaysia's University of Agriculture and Australia's University of Queensland* have put this to good use. They have produced a live culture of the harmless virus that farmers can spray onto feed pellets to vaccinate their birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Field tests of the new vaccine, carried out in Southeast Asia, have been extremely promising. Simply coating feeds with the virus seems to be enough to immunize some chickens, which then pass the immunity on to the others in the flock as well as to new hatchlings. In Malaysia, which has 49 million chickens and a population willing to pay a premium for tasty village poultry meat, one economist estimates that the vaccine might increase rural incomes by 25 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conventional vaccines must be stored under refrigerated conditions, which most villages lack. But the Malaysian workers made the Newcastle disease vaccine tolerant of heat. By selective breeding, they now have strains that resist 56&Yacute;C for at least 2 hours. Thus, even in the tropics, the vaccine remains effective for several weeks without refrigeration. The researchers have also devised methods for coating the vaccine onto pelleted feeds. Because the virus can withstand heat, they use a machine designed for coating pharmaceutical tablets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At this stage, the project is showing every promise of producing a cheap means of reducing Newcastle disease losses among chickens throughout much of the world. Already inquiries have come from other Asian countries and from Africa, and it is hoped that the vaccine may eventually benefit many countries. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">5 Chicken</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g008a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens (Gallus gallus or Gallus domesticus)1 are the world's  major source of eggs and are a meat source that supports a food  industry in virtually every country. There may be as many as 6.5 billion  chickens, the equivalent of 1.4 birds for every person on earth.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No other domesticated animal has enjoyed such universal acceptance,  and these birds are the prime example of the importance of  microlivestock. Kept throughout the Third World, they are one of the  least expensive and most efficient producers of animal protein.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To the world's poor, chickens are probably the most nutritionally  important livestock species. For instance, in Mauritius and Nigeria more  than 70 percent of rural households keep scavenger chickens. In  Swaziland, more than 95 percent of rural households own chickens,  most of them scavengers. In Thailand, where commercial poultry  production is highly developed, 80-90 percent of rural households still  keep chickens in backyards and under houses. And in other developing  countries from Pakistan to Peru, a similar situation prevails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Clearly, these chickens should be given far more attention. They  represent an animal and a production system with remarkable qualities;  they compete little with humans for food; they produce meat at low  cost; and they provide a critical nutritional resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scavenger chickens are usually self-reliant, hardy birds capable of  withstanding the abuses of harsh climate, minimal management, and inadequate nutrition. They live largely on weed seeds, insects, and feeds that would otherwise go to waste.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, however, quantitative information about the backyard chicken is hard to obtain. Few countries have any knowledge of its actual contribution to the well-being and diet of their people. Notably lacking is an understanding of the factors limiting egg production, which is markedly low and perhaps could be raised dramatically with modest effort.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens are so well known and ubiquitous that they need no further description. Varying in color from white through many shades of brown to black, they range in size from small bantams of less than 1 kg to giant breeds weighing 5 kg or more. Scavenger chickens tend to weigh about I kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The indigenous chickens of Asia are probably descended directly from the wild junglefowl. Those of West Africa are believed descended from European birds brought by the Portuguese in the sixteenth century; those of Latin America probably descend from Spanish birds introduced soon after the time of Columbus.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p81a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All countries have chickens in large numbers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are not endangered, but industrial stocks are replacing traditional breeds to such an extent that much potentially valuable genetic heritage is disappearing. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although chickens derive from tropical species, they adapt to a wide  variety of environments. The modern Leghorn, for example, is found  from the hot plains of India to the frozen tundra of Siberia, and from  sea level to altitudes above 4,000 m in the Andes. (There are, however,  hatching problems at such high altitudes because of oxygen deficiency.)  They also occur in desert countries such as Saudi Arabia, which has a  vast poultry industry and even exports broilers. (However, the birds  need shade and a lot of water where it is hot and dry.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens are omnivorous, living on seeds, insects, worms, leaves,  green grass, and kitchen scraps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A commercial bird may produce 280 eggs annually, but a scavenger  may produce close to none. Commonly, a farmyard hen lays a dozen  eggs, takes three weeks to hatch out a brood of chicks, stays with the  chicks six weeks or more, and only then starts laying again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Egg production depends on daylength. For the highest production  rate, at least 12 hours of daylight are needed. The incubation period is  21 days. A hen can begin laying at 5 months of age or even earlier, but  in scavengers it may be much later. The average weight of the eggs is  approximately 55 g from industrial layers and approximately 40 g from  scavengers. Hatching success from breeder flocks often exceeds 90  percent. Industrial broilers can be marketed as early as 6 weeks, when  they are called "Cornish hens."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These passive, gregarious birds have a pronounced social (pecking)  order. If acclimated, they remain on the premises and are unlikely to go  feral. If given a little evening meal of "scratch," they learn to come  home to roost at night.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens have multiple uses. They were probably first used for cock  fighting; later they were used in religious rituals, and only much later  were raised for eggs and meat. Today, chickens can provide a family  with eggs, meat, feathers, and sometimes cash.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In different parts of the world, people keep scavenging chickens in  different ways. The managers are often women and children because  they have more time to spend at home to feed the birds and repel  predators. Some people leave the birds entirely to their own devices.  Many house them at night. Others take the birds each day to the fields,  where they may find much more food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are many ingenious local practices. In Ghana, for example,  farmers "culture" termites for poultry by placing a moist piece of cow  dung (under a tin) over a known termite nest. The termites burrow into  the dung, and some can then be fed to the chickens each day. Because  termites digest cellulose, this system converts waste vegetation into  meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A ratio of 1 male to 10-15 females is adequate for barnyard flocks.  Hens will lay eggs in the absence of a rooster - but of course the rooster  is needed if fertile eggs are wanted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Removing chicks stimulates the hen to lay more eggs. This results in  more chicks being hatched, but it requires that the chicks be nurtured  and fed until they are old enough to fend for themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Chickens are everywhere; every culture knows them and how to  husband them. They have been utilized for so many centuries that in  most societies their use is ingrained. Unlike the case with pork and beef,  there are few strictures against eating chicken meat or eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The meat is high in quality protein, low in fat, and easily prepared. In  many countries, the village chicken's meat is preferred to that of  commercial broilers because it has better texture and stronger flavor.  Even in countries with vast poultry industries there is a growing demand  for the tasty, "organically grown," free-ranging chicken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chickens are more suited to "urban farming" than most types of  livestock and can be raised in many city situations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds are conveniently sized, easily transported alive, and, by and  large, do not transmit diseases to humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Throughout Asia, Africa, and Latin America, the problems of village  chickens are mainly those discussed below.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">High Hatching Mortality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Commonly, a hatch of eight or nine village chicks results in only two  or three live birds after a few days. A survey in Nigeria, for instance,  showed that 80 percent died before the age of eight weeks. Losses  elsewhere are known to be similar. This is mostly because of starvation,  cold, dehydration, predators (hawks, kites, snakes, dogs, and cats, for  example), diseases, parasites, accidents, and simply getting lost - all of  which can be prevented without great effort.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chronic and Acute Disease</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Poultry diseases can become epidemic in the villages because there  are few if any veterinarians. Newcastle disease, fowlpox, pullorum  disease, and coccidiosis, for example - all of which are endemic in the  Third World - can destroy the entire chicken population over large  areas. Lice and other parasites are also prevalent. Scavengers and  industrial birds seem to show no differences in their tolerance for such  diseases and parasites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Low Egg Production</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A survey in Nigeria showed that the annual production per hen was  merely 20 eggs. Such low production is common throughout the Third  World and is caused by a combination of low genetic potential,  inadequate nutrition, and poor management. Villagers rarely provide nest  boxes or laying areas, so that some eggs are just not found. Some birds  have high levels of broodiness, and eggs accumulating in a nest  stimulates this. There are indications, however, that some village  chickens (for example, some in China) have quite substantial egg-laying  potential when provided with adequate feed.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Low Egg Consumption</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the tropics, many people choose not to eat eggs. Often this is  because eggs are the source of the next generation of chickens;  sometimes it is because of superstition. Further, eggs do not keep well  because most are fertile and, exposed to constant tropical heat, undergo  rapid embryo development.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crop Damage</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">It is often necessary to confine the birds to protect young crops or  vegetable gardens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Unlike the situation with small cattle, goats, sheep, and pigs, there are  few named and recognized breeds of Third World chickens. Yet, nearly  every country has at least one kind of village chicken. These have  survived there for centuries and are highly adapted to local conditions.  In village projects, these unnamed chickens deserve priority attention  before other types are sought from elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Generally speaking, improving the production of scavenging poultry  does not require sophisticated research. Instead, simple precautions are  sufficient. These are discussed below.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Disease Control</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">At a national or regional level, the initial approach to increasing  chicken production in tropical areas should be disease control. There are  several outstanding instances of success in this endeavor. For example,  the spectacular rise of poultry production in Singapore (from 250,000  birds in 1949 to 20 million in 1957) followed the control of Ranikhet  disease. Village flock-health programs, carried out regularly by visiting  veterinarians ("barefoot veterinarians"), might be the answer to some of  the routine health problems. Today, a prime target should be Newcastle  disease, for which there are good chances for success (see page 76).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Management</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The first step in chicken production at the farm level is improved  management. With more care and attention, mortality can be greatly  reduced. Because incubating and brooding hens must spend the night on  the ground, they are extremely vulnerable. Even modest predator  controls can be highly beneficial. Building crude and inexpensive nest  boxes and constructing a simple holding area around them can  substantially raise production by ensuring that more chicks survive.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE CHICKEN'S WILD ANCESTOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although little known to most people, the red junglefowl has  contributed more to every nation than any other wild bird. It is  the ancestor of the chicken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given its descendants importance worldwide, the neglect of  this bird is baffling. If the cow's wild ancestor, the aurochs, had  not become extinct in the 1600s, it would now be worth millions  of dollars as the ultimate source of cattle genetic diversity. Yet  the world's chicken industry remains virtually unaware of the  origin of its source of livelihood.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the aurochs, the red junglefowl has a wealth of wild  genes, and it deserves more recognition and protection. For one  thing the modern chicken - selectively bred in the temperate  zone - is highly susceptible to heat and humidity; the junglefowl,  on the other hand, is not. It inhabits the warmest and most humid  parts of Asia: Sri Lanka, India, Burma, Thailand, and most of  Southeast Asia. It may also be resistant to various chicken  diseases and pests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is not a rare species. Throughout the wide crescent  stretching from Pakistan to Indonesia, junglefowls are still seen  in the wild, especially in forest clearings and lowland scrub.  Although they are a prized bag for hunters, they survive by fast  running and agile flying. They are sometimes sold in village  markets, but can easily be mistaken for domesticated chickens,  which in this region are often very similar. The wild junglefowl,  however, has feathered legs, a down-curving tail, and an overall  scragginess.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Junglefowls should be under intensive study. They are easy to  rear in captivity and do well in pens, even small ones, as long as  they are sheltered from rain and wind. One drawback is their  craze for scratching unless provided plenty of space they  promptly tear up all grass and dirt. Another is that junglecocks  are violent fighters and must be kept apart. (Cockfighting is  probably a major reason why they were initially selected, and  thus their aggressiveness is perhaps the reason we have the  chicken today.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These highly adaptable creatures live in a variety of habitats,  from sea level to 2,000 m. Most, however, are found in and  around damp forests, secondary growth, dry scrub, bamboo  groves, and small woods near farms and villages. They are  amazingly clever at evading capture and thrive wherever there is  some cover.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other junglefowl species might also provide useful poultry.  They, too, can be raised in captivity with comparative ease, as  long as the cocks are kept apart. Perhaps they might be tamed with imprinting and could prove useful as domestic fowl,  especially in marginal habitats. They are everywhere considered  culinary luxuries and their meat commands premium prices.  Moreover, several have colorful feathers, giving them additional  commercial value. These other species are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- La Fayette's Junglefowl (Gallus lafayettei). Avery attractive  bird of Sri Lanka, it is little known in captivity, and only in the  United States are there any number in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Gray or Sonnerat's Junglefowl (Gallus sonnerati). A native  of India, this colorful bird produces feathers that are used in  tying the most prized trout and salmon flies. Demand is so great  that certain populations have declined, and since 1968 India has  banned all export of birds or feathers. Nonetheless, there are  several hundred in captivity in various countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Green Junglefowl (Gallus varius). This is yet another striking  bird. The cock has metallic, greenish-black feathering set off by  a comb that merges from brilliant green at the base to bright  purple and red at the top. Native to Java, Bali, and the  neighboring Indonesian islands as far out as Timor, it is found  particularly near rice paddies and rocky coasts. This species, too,  can be raised without great difficulty, and there are at least 90 in  captivity in various parts of the world.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nutrition</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Improving poultry nutrition is also of prime importance. There are no quantitative data on the quality of a scavenging chicken's diet. Surveys are badly needed so that appropriate, low-cost supplements can be devised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chances are that the diet for chicks of scavenging poultry is almost always deficient in available energy. Minimal supplementation in the form of cereals or energy-rich by-products can greatly improve both egg and meat production. However, caution must always be exercised and the supplements given only to chicks. Overfed adults will give up scavenging and stay around the owner's house, without really producing much more meat or eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Genetic Improvement</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although it seems attractive to replace the scrawny village chicken with bigger, faster-growing imported breeds, it is a process fraught with difficulty. Exotic breeds lack the ability to tolerate the rigors of mismanagement and environmental stress. Many cannot avoid predators, as a result either of being overweight or of having a poor conformation for flight. The local birds, however, probably have a genetic potential that is much higher than can be expressed in the constraining environment. Thus, the environmental constraints should be tackled first.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, the village birds may have a feed-conversion efficiency that is far less than ideal because they are adapted to a scavenging existence. Modern breeds imported into Ghana, for instance, showed a feed-conversion efficiency of less that 3.5:1 (weight of food eaten: growth and eggs), but the local birds had efficiencies of 11:1.4 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The need for preserving genetic variability is greater in poultry, especially in chickens, than in any other form of domestic animal. North America, for instance, which years ago had 50 or more common breeds, now relies on only 2 for meat production, and the others have been largely lost. Conservation of germplasm has become a matter of serious concern, and the saving of rare breeds in domestic fowl should not be delayed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE SOUTH AMERICAN CHICKEN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Early European explorers of South America were surprised to discover an abundance of unusual chickens that laid colored eggs and had feathers resembling earrings on the side of the head. While the origin of this bird - commonly called the araucanian chicken and classified as Gallus inauris - is debatable, scientists generally agree that it is pre-Columbian. There is archeological evidence that this bird is native to the Americas. It is reported to have occurred in Chile, Ecuador, Bolivia, Costa Rica, Peru, and Easter Island. It still occurs in the wild in southern Chile and on Easter Island.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The araucanian has been called the "Easter-egg chicken" because it lays light green, light blue, and olive colored eggs. It lays well and has a delicious meat. In areas such as southern Chile the eggs are preferred over those of normal chickens because of their flavor and dark yellow yolk. This unusual bird has a high degree of variability; however, specimens of similar genetic background have been grouped to create "breeds" such as the White Araucanian, Black Araucanian, and Barred Araucanian. These are homozygotes and breed true.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The araucanian has been the subject of much public interest,. clubs dedicated to its preservation have been formed in the United States, Great Britain, and Chile. Its possible exploitation as a backyard microlivestock deserves serious consideration. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">6 Ducks</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g009a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic ducks (Anas platyrhynchos)1 are well known, but still have much unrealized promise for subsistence-level production. Although a major resource of Asia, where there is approximately one duck per 20 inhabitants, they are not so intensively used elsewhere. On a worldwide basis, for instance, they are of minor importance compared with chickens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is unfortunate because ducks are easy to keep, adapt readily to a wide range of conditions (including small-farm culture), and require little investment. They are also easily managed under village conditions, particularly if a waterway is nearby, and appear to be more resistant to diseases and more adept at foraging than chickens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, the products from ducks are in constant demand. Some breeds yield more eggs than the domestic chicken. And duck meat always sells at premium. A few recently created breeds (notably some in Taiwan) have much lower levels of fat than the traditional farm duck. This development could open up vast new markets for duck meat, especially in wealthy countries, where consumers are both concerned over fat in their diet and eager for alternatives to chicken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks are also efficient at converting waste resources - insects, weeds, aquatic plants, and fallen seeds, for instance - into meat and eggs. Indeed, they are among the most efficient of all food producers. Raised in confinement, ducks can convert 2.4-2.6 kg of concentrated feed into I kg of weight gain. The only domestic animal that has better feed conversion is the broiler chicken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raised as village birds and allowed to forage for themselves, ducks become less productive but become even more cost effective because much of the food they scavenge has no monetary value. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Several distinctive types have been developed in various regions. Most have lost the ability to fly any distance, but they retain a characteristic boatlike posture and a labored, waddling walk. The Indian Runner, however, has an almost erect stance that permits it to walk and run with apparent ease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic ducks range in body size from the diminutive Call, weighing less than I kg, to the largest meat strains (Pekin, Rouen, and Aylesbury, for example) weighing as much as 4.5 kg. For intensive conditions, the Pekin is the most popular meat breed around the world. In confinement it grows rapidly - weighing 2.5-3 kg at a market age of 78 weeks. In addition, it is hardy, does not fly, lays well, and produces good quality (but somewhat fatty) meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Khaki Campbell breed is an outstanding egg producer, some individuals laying more than 300 eggs per bird per year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Taiwan Tsaiya (layer duck) is also a particularly efficient breed. It weighs 1.2 kg at maturity, starts laying at 120-140 days, and can produce 260-290 eggs a year. Its small body size, large egg weight, and phenomenal egg production make Brown Tsaiya the main breed for egg consumption in Taiwan. More than 2.5 million Brown Tsaiya ducks are raised annually for egg production.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The domestic duck is distributed throughout the world; however, its greatest economic importance is in Southeast Asia, particularly in the wetland-rice areas. For example, about 28 percent of Taiwan's poultry are- ducks. In parts of Asia, some domestic flocks have as many as 20,000 birds. One farm near Kuala Lumpur, Malaysia, rears 40,000 ducks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although ducks are abundant, some Western breeds are becoming rare. Indigenous types are little known outside their home countries and have received little study, so their status is uncertain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These adaptable creatures thrive in hot, humid climates. However, during torrid weather they must have access to shade, drinking water, and bathing water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks are well adapted to rivers, canals, lakes, ponds, marshes, and other aquatic locations. Moreover, they can be raised successfully in estuarine areas. Most ocean bays and inlets teem with plant and animal life that ducks relish, but (unlike wild sea ducks) domestic breeds have a low physiological tolerance for salt and must be supplied with fresh drinking water. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Ducks search for food underwater, sieve organic matter from mud, root out morsels underground, and sometimes catch insects in the air. Their natural diet is normally about 90 percent vegetable matter (seeds, berries, fruits, nuts, bulbs, roots, succulent leaves, and grasses) and 10 percent animal matter (insects, snails, slugs, leeches, worms, eels, crustacea, and an occasional small fish or tadpole). They have little ability to utilize dietary fiber. Although they eat considerable quantities of tender grass, they are not true grazers (like geese), and don't eat coarse grasses and weeds at all. Sand and gravel is swallowed to serve as "grindstones" in the gizzard.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When protected from accidents and predation, ducks live a surprisingly long time. It is not unusual for one to continue reproducing for up to 8 years, and there are reports of exceptional birds living more than 20 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite large differences in size, color, and appearance, all domestic breeds interbreed freely. Eggs normally take 28 days to incubate, brooding and rearing is performed solely by the female.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Depending on breed, a female may reach sexual maturity at about 20 weeks of age. Most begin laying at 20-26 weeks, but the best egg- laying varieties come into production at 16-18 weeks and lay profitably for 2 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">It is generally well known that ducks are shy, nervous, and seldom aggressive towards each other or humans. Skilled and enthusiastic swimmers from the day they hatch, they spend many hours each day bathing and frolicking in any available water. However, most breeds can be raised successfully without swimming water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although wild ducks normally pair off, domestic drakes will mate indiscriminately with any females in a flock. In intensively raised flocks, I male to 6 females, and in village flocks, 1 male for up to 25 females, results in good fertility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most domestic ducks, particularly the egg-laying strains, have little instinct to brood. If not confined, they will lay eggs wherever they happen to be - occasionally even while swimming. To facilitate egg collection, some keepers confine ducks until noon. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p96a.png"></center><br>
+ Figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As a meat source, ducks have major advantages. Their growth rate is phenomenal during the first few weeks. (Acceptable market weights can be attained under intensive management with birds as young as 6-7 weeks of age.) Yet, even in older birds, the meat remains tender and palatable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eggs from many breeds are typically 20-35 percent larger than chicken eggs, weighing on average about 73 g. They are nutritious, have more fat and protein, and contain less water than hen's eggs. They are often used in cooking and make excellent custards and ice cream. Eggs incubated until just before the embryos form feathers produce a delicacy known as balut in the Philippines. Salted eggs are popular in China and Southeast Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Feathers and down (an insulating undercoat of fine, fluffy feathers) are valuable by-products. Down is particularly sought as a filler for pillows, comforters, and winter clothing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks have a special fondness for mosquito and beetle larvae, grasshoppers, snails, slugs, and crustaceans, and therefore are effective pest control agents. China, in particular, uses ducks to reduce pests in rice fields.3 Its farmers also keep ducks to clear fields of scattered grain, to clear rice paddy banks of burrowing crabs, and to clear aquatic weeds and algae out of small lakes, ponds, and canals. This not only improves the conditions for aquaculture and agriculture, it also fattens the ducks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In Southeast Asia, droving is a traditional form of duck husbandry, much as it was in medieval Europe. The birds are herded along slowly, foraging in fields or riverbanks as they march to market. The journey might cover hundreds of kilometers and take as long as six months.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This process, however, is generally declining, and most ducks are raised under farm conditions where they scavenge for much of their feed. Throughout Southeast Asia, ducks have been integrated with aquaculture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks can be raised on almost any kitchen wastes: vegetable trimmings, table scraps, garden leftovers, canning refuse, stale produce, and stale (but not moldy) baked goods. However, for top yields and quickest growth, protein-rich feeds are the key. Commercial duck farms rely on such things as fish scraps, grains, soybean meal, or coconut cake. Agricultural wastes such as sago chips, palm-kernel cake, and palm-oil sludge are being used in Malaysia.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks have a very high requirement for niacin (a B vitamin). If chicken rations are used, a plentiful supply of fresh greens must be provided to avoid "cowboy legs," a symptom of niacin deficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Of all domestic animals, ducks are among the most versatile and useful and have multiple advantages, including:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Withstanding poor conditions;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Producing food efficiently;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Utilizing foodstuffs that normally go unharvested;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Helping to control pests; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Helping to fertilize the soil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Also, they are readily herded (for instance, by children).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Excellent foragers, they usually can find all their own food, getting by on only a minimum of supplements, if any. Raising them requires little work, and they provide farmers with food or an income from the sale of eggs, meat, and down.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks can grow faster than broiler chickens if they have adequate nutrients. Like guinea fowl and geese, they are relatively resistant to disease. They also have a good tolerance to cold and, in most climates, don't need artificial heat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">DOMESTICATING NEW DUCKS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Many species of ducks adapt readily to captivity; it is surprising, therefore, that only the mallard and the muscovy have been domesticated so far. Several wild tropical species seem especially worth exploring for possible future use in Third World farms, Because of the year-round tropical warmth, their instinct to migrate is either absent or unpronounced, and the heavy layer of fat (a feature of temperate-climate ducks that consumers in many countries consider a drawback) is lacking. Moreover, because of uniform daylength, they are ready to breed at any time of the year. Candidates for domestication as tropical ducks include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Whistling ducks (Dendrocygna species). These large, colorful, gooselike birds are noted for their beautiful, cheerful whistle.* They are long-necked perching ducks that are found throughout the tropics. By and large, they are gregarious, sedentary, vegetarian, and less arboreal than the muscovy - all positive traits for a poultry species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The black-bellied whistling duck (D. auturunalis) seems especially promising. It is common throughout tropical America (southwestern United States to northwestern Argentina) and is sometimes kept in semicaptivity. Occasionally, in the highlands of Guatemala, for instance, Indians sell young ones they have reared as pets. When hand reared, the birds can become very tame. * * They eat grain and other vegetation, require no swimming water, and will voluntarily use nest boxes. In the wild, they "dump" large numbers of eggs so that even if substantial numbers were removed for artificial hatching, the wild populations should not be affected.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Greater wood ducks (Cairina species). The muscovy (C. moschata) was domesticated by South American Indians long before Europeans arrived (see page 124). Its counterparts in the forests of Southeast Asia and tropical Africa are, however, untried as domesticates. The white-winged wood duck (C. scutulata) is found from eastern India to Java. Hartlaub's duck (C. hartlaubi) occurs in forests and wooded savannas from Sierra Leone to Zaire. Both are rare in captivity, but might well prove to be future tropical resources. Both are strikingly similar to muscovies in size and habits, being large, phlegmatic, sedentary, and omnivorous. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Predators are the most important cause of losses in farm flocks. Ducks are almost incapable of defending themselves, and losses from dogs and poachers can be high. Locking them in at night both protects the birds and prevents eggs from being wastefully laid outside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ducks do suffer from some diseases, mainly those traceable to mismanagement such as poor diet, stagnant drinking water, moldy feed or bedding, or overcrowded and filthy conditions. Of all poultry, they are the most sensitive to aflatoxin, which usually comes from eating moldy feed. They are also susceptible to cholera (pasteurellosis) and botulism, either of which may wipe out entire flocks. Duck virus enteritis (duck plague) and duck virus hepatitis also can cause severe losses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If not carefully managed, ducks can become pests to some crops, especially cereals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, ducks tend to be extremely poor mothers and can be helped by using broody chicken hens or female muscovies as surrogate mothers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Major limitations to large-scale, intensive production are mud, smell, and noise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Defeathering ducks is much more difficult than defeathering chickens because of an abundance of small pinfeathers and down feathers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These birds already function so well that no fundamental research needs to be done. Nonetheless, there are a number of topics that could improve their production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For example, different types of low-cost systems need to be explored and developed. These must be low-input systems since cash is a limiting factor for most subsistence farmers. One possibility is the integration of duck and fish farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A survey of all breeds is needed to determine their status and likelihood of extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One need in countries that already have ducks is to encourage the consumption of duck meat. Indonesia, for instance, has 25 million egg-producing ducks, but little duck meat is consumed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research on economically significant diseases is needed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">7 Geese</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g010a.png"></center><br>
+ Brown Chinese Geese</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although geese (Anser spp.) were one of the first domesticated animals, they have yet to receive the level of commercial or industrial exploitation of chickens or even ducks. Thus, their global potential is far greater than is generally recognized today.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic geese are easily managed and well suited to small-farm production; they are among the fastest growing avian species commonly raised for meat, and they have immediate application in many developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These birds are especially appropriate for providing farmers a supplemental income. With little extra work they supply nutritious meat, huge eggs, and rich fat for cooking, as well as soft down and feathers for bedding and clothing. Moreover, their strident voices sound the alarm when strangers or predators approach. They are especially well suited to aquatic areas and marshy lands and are completely at home in warm shallow waterways. Nevertheless, they can thrive away from water. In fact, wherever pasture is available geese readily adapt to captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese are grazers, and can be raised almost exclusively on pasture. They are excellent foragers, and on succulent grass can find most or all of their own food. With their powerful bills they pull up grasses and underwater plants and probe soil and water for roots, bulbs, and aquatic animals. Their long necks make them adept at gleaning weeds from hard-to-reach places - such as fence rows, ditches, and swampy areas that baffle larger livestock. They will also feast on vegetable trimmings, garden and table leftovers, canning refuse, and stale baked goods. Like other poultry, they pick up shattered grains of rice, wheat, barley, and other crops, which can reduce the bothersome problem of weeds volunteering in subsequent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese are available worldwide. In most climates, they require little or no housing. Given reasonable care and protection from predators, mortality can be extremely low. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic geese come in an assortment of colors, sizes, and shapes. There are two main types, however. Descendants of the wild greylag goose (Anser anser) make up the domestic breeds common in North America and Europe, including the Embden, Toulouse, Pilgrim, American Buff, Pomeranian, Sebastopol, and Tufted Roman breeds. These are generally best suited to temperate climates. On the other hand, descendants of the wild "swan goose" (Anser cygnoides) make up the geese of Asia, including the Chinese and "African" types. These breeds seem better suited to hot climates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to these, many European and Asian countries have their own local breeds and types, and there are even several wild species that show some potential for captive production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With their long legs and webbed toes, geese are equally at home walking or swimming. Avid walkers, they march long distances to find forage, but return home at dusk. Accomplished and graceful swimmers, geese are able to take to water soon after they hatch. Despite their large size, some domestic breeds - especially the leaner ones - have retained the ability to fly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Geese are found worldwide, but goose farming is nationally important only in Asia and Central Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic geese are not threatened, although much local variation among the breeds is being lost.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most geese adapt well to hot climates - as long as some shade is available. Their waterproof feathers help them adapt well to high rainfall regions. They also tolerate extreme cold. (For instance, in Canada, geese are wintered outdoors in subfreezing temperatures, with merely 'e simple shelter from wind.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For tropical developing countries, the Chinese type, which is widely kept in Southeast Asia, is especially promising. Smaller than most geese (although ganders can weigh over 5 kg), they are the best layers, the most active foragers (making them economical and useful as weeders), the most alert and "talkative," and they produce the leanest meat. Some European breeds, such as Embden and Toulouse, have also been used in the tropics with notable success. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DOMESTICATING GEESE</P>
+<P ALIGN="JUSTIFY">(Temperate Zones)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Today's domestic geese are descended from two species: the greylag (Anser anser) and the swan goose (Anser cygnoides). These were domesticated in Europe and China, respectively. Their domestication occurred in ancient times, long before people knew about genetics, microorganisms, veterinary science, or behavior modifications such as imprinting. Today, armed with such knowledge, more geese may be amenable to domestication. Most of the 15 other wild species adapt to captivity. Compared to most birds, geese spend much time walking and swimming and are less inconvenienced by pinioning (removing the tip of the wing). Thus, they can be kept outdoors rather than in cages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both of the ancestors of today's domestic geese are native to the northern temperate zone. Two more wild species that might make useful domesticates are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Canada goose (Branta canadensis). North America. People feeding these birds in city parks and wildlife refuges are causing many local flocks to develop. These birds no longer migrate. They are increasing in numbers each year and are well on the way to de facto domestication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- American swan goose (Coscoroba coscoroba). Southern South America. Although most closely allied to swans in shape and physiology, this bird resembles a muscovy (see page 124) in size and behavior. Its calm disposition, as well as its attractive red feet and bill that accent its white plumage, have made it much sought as an ornament for parks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In its diet, the goose utilizes large quantities of tender forage. It can break down plant-cell walls and digest the contents. Although it has no crop for storing food, there is an enlargement at the end of the gullet that serves as a temporary storage organ. Sand and small gravel are swallowed to aid the gizzard in grinding hard seeds and fibrous grasses. Research has shown that geese can digest 15-20 percent of the fiber in their diet, which is 3-4 times the amount that other poultry species can digest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The natural diet consists of grasses, seeds, roots, bulbs, berries, and fruits, normally supplemented with a little animal matter (mainly insects and snails) picked up incidentally. Most feeding takes place on land. They characteristically feed for prolonged periods, even at night.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Females may lay for 10 years or more. It is generally believed that reproduction is best in the second year and that it remains good until the fifth year. Geese outlive other types of poultry; life spans of 1520 years are common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The eggs incubate in 27-31 days. The incubation time is more variable than in most poultry species, perhaps because geese have not been subjected to the selection pressure that is imposed by artificial incubators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">One of the most intelligent birds, the goose has a good memory and does not quickly forget people, animals, or situations that have frightened it. While personalities and habits vary among individual specimens, there are common behavioral patterns, such as the pecking order, that allow individuals to live peaceably together.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unless conditions are crowded or there are too many males, geese normally live harmoniously both with themselves and with other creatures. The bond between male and female is strong. Changing mates is difficult, although most geese will eventually accept a new mate after a period of "mourning."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese nest on the ground and prefer the water's edge, but they adapt readily to man-made nesting boxes. The gander usually stands guard while the goose incubates the eggs. He then assists in rearing the goslings. Most geese become irritated if intruders approach their nest or goslings, and will even attack people and large dogs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As previously noted, these birds provide meat, eggs, fat, and down. The meat is lean, flavorful, and of outstanding quality. The fat accumulates between the skin and the flesh and can be rendered into a long-lasting oil. The eggs are large and taste much like chicken eggs. The "down" (the small, fluffy feathers that lie next to the body of adult birds) is the finest natural insulating material for clothing and bedding, and can fetch a premium price. Worldwide markets exist for both down and other goose feathers. In France, in particular, some geese are raised for their livers (foie gras).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese can control many types of aquatic weeds in shallow water as well as grass and some types of palatable broad-leaf weeds on the banks of lakes, ponds, and canals. They can also be used as ''lawn mowers" and "weeders" among cotton, fruit trees, and other crops (see sidebar).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Elongated necks not only allow geese to reach many different foods, they also help them keep a watchful eye on the surroundings. With their exceptional eyesight they can see great distances, and the position of the eyes gives them a wide field of vision. Geese are among the most alert of all animals, and strangers cannot calm them into silence. In the high Andes, in Southeast Asia, and in many other locations, they replace guard dogs. In Europe, they are used to guard whiskey warehouses and sensitive military installations (see page 111).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Methods of caring for adult geese vary according to climate, breed, and people's experiences and needs. Overall, however, the birds cause little trouble and require little expense. They range freely without restriction, feeding themselves and returning home of their own accord. They have strong flocking instincts and can readily be herded from one area to another.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like all young poultry, goslings are fragile. The highest mortality is caused by predators. Until the goslings are 6-10 weeks old, it is prudent to confine the parents and their young at night in a secure pen or building.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese are the only domestic fowl that can live and reproduce on a diet of grass. They cannot remain healthy on coarse dry fodder, but when grass is succulent they need little else other than drinking water. Many legumes also make excellent goose forage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the tropics, eggs can be laid year-round. The production seldom exceeds 40 eggs per year, although with feed supplement and simple management, the Chinese breed may yield more than 100 eggs. Geese go broody quickly. To break up broodiness, the goose can be confined for 4 6 days away from, but in sight of, the ganders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goslings grow rapidly and can reach market size as early as 10-12 weeks; most geese, however, are marketed at 20-30 weeks of age, when they may weigh from 5 to 7 kg, depending on type and breed. Some young birds (also called green or junior geese), force-fed for rapid growth, are marketed at 4-6 kg when they are 8-10 weeks old.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If fed a good diet to maximize growth and if slaughtered at, say, 10 weeks, the Embden, Chinese, or African will have a carcass low in fat. However, the carcass normally has much more fat than other poultry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese must have a constant supply of reasonably clean drinking water during daylight hours. Although swimming water is not necessary, it promotes cleaner and healthier birds because they find it easier to care for their plumage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DOMESTICATING GEESE</P>
+<P ALIGN="JUSTIFY">(Tropics)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Geese of the tropics have seldom if ever been considered for domestication, but they might provide poultry of considerable value. Presumably they are more heat tolerant and lack the layers of subcutaneous fat (which the ancestors of today's geese needed for warmth in the Arctic). They might thus produce lean birds that would fetch premium prices because excessive fat is the major drawback of today's commercial geese. Examples of tropical species that might be domesticable are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Egyptian goose (AIopochen aegyptiacus). Found throughout the African tropics, this bird is already partly domesticated. However, it is bad tempered and quarrelsome and, so far, this has limited its utility. It has therefore been kept only under semidomestication, without intensive breeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Nene (Branta sandvicensis). A native of the Hawaiian Islands, this is one of the most endangered species on earth. So few specimens are in existence that farming enterprises cannot now be envisaged. Yet, should this bird prove amenable and suitable, the possibility of an economic future could boost efforts to build up its now meager populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Bar-headed goose (Anser indicus). India and Central Asia. These smallish geese are handsome, dainty, and have a musical horn-like call. They have distinct black bars across the nape, which gives them their popular name. Hand-reared specimens breed well in captivity. Despite heavy hunting they are still abundant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Northern spur-winged goose (Plectropterus gambensis gambensis). Tropical Africa (Senegal to Zimbabwe). This large bird is a ground nester, but it has long bony spurs on the wings that enable it to easily protect its eggs and young from predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Semipalmated (magpie) goose (Anseranas semipalmata). Australia and New Guinea. One of the most aberrant and primitive of all waterfowl, this long-legged sturdy-billed bird has only partially webbed feet. It perches high in trees and has a loud ungooselike whistling call. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE WADDLING WORK FORCE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Because geese relish grasses and shun most broad-leafed plants, some enterprising U.S. farmers in the 1950s began using them to rid cotton fields of grassy weeds, which are difficult to kill with herbicides. The geese were put into the fields as soon as the crop came up. A brace of birds kept an acre of cotton weeded; a gaggle of 12 would gobble as many weeds as a hard-working man could clear with a hoe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This method of clearing fields was so effective that by 1960 more than 175,000 geese honked their way across the carefully tended farmland, mainly in the Southwest. Seven days a week, rain or shine, the feathered field hands slaved uncomplainingly from daybreak to dusk, even putting in overtime on moonlit nights. Many toiled so diligently that they worked themselves out of a job.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The geese cleared the fields more cheaply than hoe hands. They left the crop untouched and ate only the succulent young weeds. They did not damage crop roots (as hoes or tractors can), and they were safe and selective, unlike many herbicides. On top of all that they spread fertilizer for the farmer, and ultimately provided him meat for the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eventually, farmers found that geese could be used to weed nearly all broad-leafed crops: asparagus, potatoes, berry fruits, tobacco, mint, grapes, beets, beans, hops, onions, and strawberries, for example. Geese were used in vineyards and fruit orchards to eat both weeds and the fallen fruits that could otherwise harbor damaging insects. They were employed in fields producing trees for the forest industry and flowers for florists shops. Some growers turned goslings loose in cornfields to consume the "suckers" (cone, after all, is a grass) as well as the grain left on the ground. This eliminated the problem of corn as a weed when different crops were later planted in those fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the 1970s when cotton acreage dropped and herbicides selective for the troublesome grasses were developed, the use of geese declined. But today, some organic farmers are returning to the practice. From February to June in the Pacific Northwest, fields are resounding once more to the old-fashioned racket of White Chinese geese. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Mature geese are independent creatures. When kept in small flocks and allowed to roam the farmyard or field, they require less attention than any other domestic bird with the possible exception of guinea fowl. In areas where grass is green for much of the year, they can be raised on less grain or concentrated feed than any other domestic fowl.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Durability is one of their most attractive features. Along with ducks, geese seem to be the most resistant of all poultry to disease, parasites, and cold or wet weather. They also do well in hot climates as long as drinking water and deep shade are available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Growth is not only rapid, it is also efficient. If managed properly, goslings can produce I kg of body weight for every 2.25-3.5 kg of concentrated feed consumed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese are not usually thought of as prolific layers. However, as noted, some strains of the Chinese breed will yield well over 100 eggs per goose per year. At 140-170 g per egg, that compares favorably with the output of laying chickens. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p112a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These birds are messy and their loud trumpeting is often irritating. However, unless they have been teased or mistreated or if they are nesting or brooding young, they are not aggressive. But kilo for kilo, they are stronger than most animals, and a harassed or angry adult can express its displeasure effectively with powerful bill and pounding wings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Excessive concentrations of geese on ponds or along creeks encourages unsanitary conditions, muddies water, hastens bank erosion, and destroys plant life. Where sanitation is poor, salmonellosis can devastate geese and be transmitted, via meat and eggs, to humans. Coccidiosis and gizzard worm are other infections.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Defeathering geese is more difficult than plucking chickens because there are two coats (feathers and down) to remove.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some situations, geese may need a diet supplement (such as grain) if they are grazing vegetation exclusively. A balance must be struck: too much supplement and they will quit foraging and become too fat; too little and they grow slowly and may suffer malnutrition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese are not fully mature until two years of age. Their overall reproductive rate, therefore, is lower than that of other poultry. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Poultry researchers worldwide should begin studies to clarify the role that geese could play in helping to feed Third World nations. Studies might include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Management practices for tropical areas;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Breeding and management for increased egg production;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Incubation techniques;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Nutrition supplementation (for example, vitamins, minerals, energy, specific amino acids) needed by grazing geese;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Physiology of digestion and reproduction;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Clarifying the inheritance of various traits;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Genetic selection for specific meat, eggs, growth factors, or disease resistance;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Comparative studies of the relative efficiency (especially of feed utilization) of the various types and breeds for specific climates in underdeveloped countries;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Weeding tropical crops with geese; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Studying diseases and cross-infection with other birds. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">8 Guinea Fowl</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g011a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For Third World villages, the guinea fowl (Numida meleagris) could become much more valuable than it is today. The bird thrives under semi-intensive conditions, forages well, and requires little attention. It retains many of its wild ancestor's survival characteristics: it grows, reproduces, and yields well in both cool and hot conditions; it is relatively disease free; it requires little water or attention; it is almost as easily raised as chickens and turkeys; and it is a most useful all-round farm bird.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guinea fowl's potential to increase meat production among hungry countries should be given greater recognition. The birds are widely known in Africa and occur in a few areas of Asia, but they show promise for use throughout all of Asia and Latin America and for increased use in Africa itself. Strains newly created for egg and meat production in Europe - notably in France - show excellent characteristics for industrial-scale production. Also, many semidomestic types in Africa deserve increased scientific assessment as scavenger birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meat from domestic guinea fowl is dark and delicate, the flavor resembling that of game birds. It is a special delicacy, served in some of the world's finest restaurants. Several European countries eat vast amounts. Annual consumption in France, for example, is about 0.8 kg per capita.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea fowl also produce substantial numbers of eggs. In Africa, these are often sold hard-boiled in local markets. In the Soviet Union, they are produced in large commercial operations. In France, guinea fowl strains have been developed that not only grow quickly but lay as many as 190 eggs a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Outside Europe, virtually all guinea fowl are raised as free-ranging birds. These find most of their feed by scratching around villages and farmyards. Their cost of production is small, and they yield food for subsistence farmers. In Europe, on the other hand, most are raised in confinement, with artificial insemination, artificial lighting, and special feeding. In the main, this is to produce meat for luxury markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea fowl production is beginning to increase all over the world. During the last 20 years, for example, many of Europe's chicken farmers and breeders, wishing to diversify, have switched to this bird. The United States is now studying ways to establish industrial production, and both Japan and Australia are increasing their flocks. Nonetheless, there is still a vast untapped future for this bird.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide. This species is robust and resilient and adapts to many climates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea fowl are somewhat larger than average scavenger-type chickens: adults weigh up to 2.5 kilograms. They have dark-grey feathers with small white spots. Their heads are bare with a bony ridge (helmet) on top, which makes them look something like vultures. The short tail feathers usually slope downwards.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The chicks, known as "keels," resemble young quail. They are brown striped with red beaks and legs. The sexes are indistinguishable until eight weeks of age. After that, the males' larger helmets and wattles and the cries of the different sexes can be identified. Both sexes give a one-syllable shriek, but females also have a two-syllable call.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the chicken, the guinea fowl is a gallinaceous species and possesses the characteristic sternum with posterior notches and a raised "thumb."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among domestic types are pearl, white, royal purple, and lavender. Pearl is the most common, and is probably the type first developed from the wild West African birds. Its handsome feathers are often used for ornamental purposes. The white is entirely white from the time of hatching and has a lighter skin. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p117a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Europe dominates industrial production. France, Italy, the Soviet Union, and Hungary all raise millions of guinea fowl under intensive conditions, just as they raise chickens. Elsewhere, guinea fowl have become established as a semidomesticated species on small family farms. Native flocks are found about villages and homes in parts of East and West Africa, and free-ranging flocks can be seen in many parts of India, notably Punjab, Uttar Pradesh, Assam, and Madhya Pradesh. During the slavery era, they were introduced from Africa to the Americas to be used for food. In Jamaica, Central America, and Malaysia, the birds have reverted to the wild state and are treated as game.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea fowl are abundant; in most places even wild populations are not threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea fowl are native to the grasslands and woodlands of most of Africa south of the Sahara where they occupy all habitats except dense forests and treeless deserts. Being native also to temperate South Africa, they appear to have an inherent adaptability to both heat and cold. However, in cool climates, regardless of daylength, they will not begin egg production until temperatures exceed 15&Yacute;C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea fowl accept many foods: grains, leaves, ant eggs (for which they will tear anthills open), and even carrion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Normally, they lay their first egg at about 18 weeks of age. Unlike many wild birds, which produce a single clutch a year, guinea hens lay continuously until adverse weather sets in.2 Free-range "domestic" guinea hens lay up to 60 eggs a season. And well-managed birds under intensive management lay close to 200. The eggs weigh approximately 40 g. Shells are stronger than those of chickens and are usually brown, but can be white or tinted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guinea hen goes broody after laying, which can be overcome by removing most of the eggs. A clutch of 15-20 is common. The incubation period is 27 days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These birds never become "tame," but neither do they leave the premises. Although they stray farther than chickens do, they always return. They like to hide their eggs in a bushy corner, often in hollows scratched in the ground. They can fly, although even in the wild they do not fly far. They prefer to roost on high branches and (unless pinioned) can be hard to catch during the day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although wild guinea fowl live in groups, they are monogamous by nature and tend to bond in pairs. However, in domestication a single male may serve four or more females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, guinea fowl are valuable sources of both meat and eggs. They can also be used to control insect pests on vegetable crops.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea fowl are good "watch animals"; they have fantastic eyesight, a harsh cry, and will shriek at the slightest provocation. Their agitation on sighting dogs, foxes, hawks, or other predators have saved the lives of many a chicken, duck, and turkey. They are brave and will attack even large animals that threaten them.4 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea fowl can be kept in confinement using the methods for raising battery chickens. In this system, breeding stock are housed in cages and artificially inseminated. It gives the best egg production and fertility but requires housing, equipment, and skilled labor.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These birds can also be kept in a semidomestic state in and around the farmyard. In such cases they are penned until they are 12 weeks old. Unaccustomed to foraging for natural food, they constantly return to their artificial food supply. Eventually, however, they learn to subsist by scavenging.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds have been called "the worst parents in the world," and are almost incapable of looking after their keets.5 Because the females are such indifferent mothers, the eggs are best hatched in incubators or under other birds, to avoid the keets' being lost by their natural mothers. In many African countries, eggs are hatched under chickens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Keets are often kept indoors until they are 3-4 weeks old to protect them from predators and wet weather. Sexual maturity can be delayed to as late as 32 weeks of age by holding the birds in windowless housing and controlling the lighting. This improves egg size and hatchability and reduces early mortality. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">GUINEA FOWL AND THE ANCIENTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The earliest reference to guinea fowl can be found in murals in the Pyramid of Wenis at Saqqara in Egypt, painted about 2400 B.C. Aviaries were quite fashionable at the time, and wealthy landowners maintained guinea fowl within their walled gardens. A thousand years later, by the time of Queen Hatshepsut (about 1475 B.C.), the junglefowl (the ancestor of the chicken) had arrived, and from then on it was raised on a substantial scale. Records of this period refer to "walk-in" incubators, constructed of mud bricks and heated by cameldung fires. The largest could hold up to 90,000 eggs (mainly from junglefowl but some from guinea fowl) and hatching rates of up to 70 percent were claimed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By 400 B.C., guinea fowl were well established on farms in Greece. Later, they rose to importance in ancient Rome. Pliny the elder (in his Natural History, published 77 A.D.) stated that they were the last bird to be added to the Roman menu and that they were in great demand, both eggs and flesh being considered great delicacies. The emperor Caligula offered them as sacrifices to himself when he assumed the title of deity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guinea fowl then died out in Europe but was reintroduced by the Portuguese navigators returning from their African explorations in the late 1400s. They gave it the name pintada or "painted chicken" and this changed to pintade in French, while the name "Guinea fowl" (fowl from Africa) stayed in English, and gallina de Guinea in Spanish. Coincidentally, guinea fowl and turkeys were both introduced to England between 1530 and 1550, and the English, smitten with the original French misnomers, were left sorting out "Ginny birds" and "Turkey birds" for the remainder of the century. Both birds were adopted with great enthusiasm, and within 150 years they had utterly displaced the peafowl and swan as the major table birds for festive occasions.</P>
+<P ALIGN="JUSTIFY">Adapted from R.H.H. Belshaw, 1985 Guinea Fowl of the World</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Compared with the farmyard chicken the guinea fowl's advantages are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Low production costs;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Premium quality meat;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Greater capacity to utilize green feeds;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Better ability to scavenge for insects and grains;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Better ability to protect itself against predators; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Better resistance to common poultry parasites and diseases (for example, Newcastle disease and fowlpox).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Surprisingly, this semidomestic bird, which has been farmed for centuries, retains the characteristics (feather morphology, hardiness, social behavior) of its wild ancestor - even when subjected to the most modern intensive-rearing methods employing battery cages and artificial insemination. Thus, it thrives under semicaptive conditions and needs little special care. The birds forage well for themselves and do not require much attention; their meat is tasty and they produce substantial numbers of eggs. Unlike chickens, they don't scratch to get insects out of the soil, so they are less destructive to the garden.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In backyard production the guinea fowl is supreme, but when produced intensively it costs more to raise than chickens. In Europe, for instance, day-old keets cost about twice as much as day-old broiler chicks. (The major reason is that guinea fowl produce fewer hatching eggs and require a longer feeding period.) Guinea fowl are also more expensive to feed. Their feed conversion (for meat production at the marketing age) is about 3.3-3.6 as compared with a broiler's feed conversion of 1.8-1.9. Moreover, guinea fowl take about twice as long to reach marketable size: they are marketed for meat at age 12-14 weeks, compared with 7-8 weeks for the broilers. Therefore, the selling price of guinea fowl in the Western world is up to twice that of broilers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea fowl are nervous and stupid. They can be difficult to catch' and when panicking they can easily suffocate their keets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are susceptible to some of the common diseases of chickens and turkeys. Salmonella is the most prevalent, but others are pullorum disease, staphylococcus, and Marek's disease. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE GUINEA FOWL'S WILD COUSINS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The domesticated guinea fowl is descended from just one subspecies of the family's seven known species and numerous subspecies. Some of the others may also have promise as poultry. They, too, generally occur in flocks in bushy grasslands and open forests in Africa. All feed on vegetable matter such as seeds, berries, and tender shoots, and on invertebrates such as slugs. They rarely fly except to roost. They acclimatize well are easy to maintain in captivity, and can survive long periods away from water.** Their disposition is tame and nonaggressive, and they mix well with other birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild subspecies closely related to the domestic guinea fowl that might make future poultry in their own right include the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Gray-breasted guinea fowl (Numida meleagris galeata). This subspecies is the principal ancestor of domestic guinea fowls. It is found throughout West Africa and probably has many valuable genetic traits. There is much variation in the size and other characteristics among the various individuals. People along the Gambia, Volta, and Niger rivers have long traditions of breeding these birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Tufted guinea fowl (Numida meleagris meleagris). This subspecies is quite large and has black plumage thickly spotted with white dots. It is the probable ancestor of the birds reared in ancient Egypt and in the Roman empire (see page 120). Hill farmers in the southern Sudan sometimes breed them in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Mitred guinea fowl (Numida meleagris mitrata). Probably the most popular game bird in East Africa, this type has a bright blue-green head and red wattles. It was once a common sight in the wild but it has now been decimated by overhunting. It is now most numerous in the Masai lands of Kenya and Tanzania. It has been kept in a semidomesticated form in Zanzibar for several centuries. Zoos and aviaries around the world have imported it, and it has bred well for them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild guinea fowl that are different species from the domestic one but that are still worth considering as potential poultry include the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Black guinea fowl (Phasidus niger or Agelastes niger). This bird of the tropical rainforests of West and Central Africa is the size of a small chicken. It has sooty black plumage, a naked head, and a pink or yellow neck. It is seldom hunted because the meat tastes dreadful but this is probably because of a particularly pungent fungus they eat in the forest. Raised on fungus-free forages, these birds are probably very palatable. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Crested guinea hen (Guttera spp.). Three species. These strange-looking birds have a thick mop of inky black feathers above their black, naked faces. Widely distributed in the thickly forested areas of sub-Saharan Africa. Unlike the other species, they prefer the rainforest. They have a musical trumpeting call. At least one species has bred well in Europe. For example, a flourishing colony has been established in the Walsrode Bird Park in Germany.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Vulturine guinea fowl (Acryllium vulturinum). The largest of all guinea fowl, this species is found in parts of Ethiopia, Somalia, and East Africa. One of the most striking looking of all birds, its head is bare and blue, its body black with white spots, and its breast bears long bright cobalt-blue patches on either side. This has been reared as an aviary bird in both Europe and America and might make a useful domesticate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agencies involved in international economic development should undertake guinea fowl assessment trials, evaluations, and coordinated introductions to stimulate programs for small farmers and for industries in dozens of countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeders have been working to improve guinea fowl only since the 1950s. There is a need for more information on growth rate, health, egg production, feed conversion, body weight, carcass yield, laying intensity, fertility, hatchability, and egg weight - especially under free-ranging conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Husbandry research should also be directed towards feeds and feeding systems for growing and breeding stock. Other efforts are needed to increase the hatchability of eggs under natural conditions (under guinea hens or surrogate mothers), and to identify the best lighting regimes (both sexual maturity and rate of lay are influenced by changes in daylength).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guinea fowl that has become an important domesticated bird throughout the civilized world is descended from just one of seven known species in the family. These birds generally occur in flocks in bushy grasslands and open forest in Africa and Madagascar, and some of the others may also have promise as poultry (see sidebar opposite). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">9 Muscovy</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g012a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The muscovy (Cairina moschata), a unique ducklike species of the South American rainforest, belongs to a small group of waterfowl that perch in trees. In poultry science, however, it is normally grouped with domestic ducks for lack of a better classification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Except in France, Italy and Taiwan muscovies have received little modern research. But their promise can be judged from the fact that they account for 50 percent of the duck meat consumed in France - about 60,000 tons per year - and they are often consumed in Italy and Taiwan as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For Third World subsistence farming, muscovies have excellent possibilities. There is probably no better choice for a meat bird that requires minimal care and feed. Tame, quiet, and able to forage for much of their keep, they are inherently hardy, vigorous, and robust. They have heavily fleshed breasts and are highly prized for their meat, which is dark, more flavorful, and less fatty than that of common ducks. An average muscovy gives more meat than a chicken of the same age, and it also survives hot, wet environments better. In addition, muscovies are better parents than the domestic duck. Females are probably the best natural mothers of any poultry species, as measured by their success at incubating their eggs and caring for their young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All in all, this bird deserves more attention than it has received so far in Third World livestock projects. Dispersed around the warm and hot regions of the world, muscovies already exist in small numbers in backyards and villages, much like the domestic chicken in previous centuries. Despite a lack of research, the present unimproved stocks are already impressive meat yielders. Used more widely and more intensively, they could contribute much to poor people's meat supplies. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crossing the muscovy with the common duck produces a hybrid that combines many of the advantages of both. This cross, known as "mulard," or "mule duck" in English, is raised in France for its liver and meat and is produced in quantity in Taiwan (see sidebar, page 132). It, too, has a major future role.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muscovies are suitable for use almost anywhere that chickens can be kept. Moreover, their tropical ancestry and inherent robustness give them an advantage in hot and humid climates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although a muscovy somewhat resembles a goose, it is one of the greater wood ducks of tropical South America. It was domesticated in pre-Columbian times, most likely in the rainforests of Colombia. Related wild types, looking very much like the muscovy, still occur in South American wetlands, particularly mangrove swamps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males have mature live weights of 5 kg and females about 2.5 kg. Both have broad and rounded wings. The adults have patches of bare skin around the eyes, rather than feathers. Much of this is covered in "caruncles," which superficially resemble warty outgrowths. The feet have sharp claws. Both sexes raise a crest of feathers when alarmed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is much color variation among the various muscovy populations including types that are called white, colored, black, blue, chocolate, silver, buff, and pied.2 The most common types (they are not considered breeds) are the white and the colored. The white produces a cleaner looking carcass, but the colored is the most popular meat type in France. Its plumage is an iridescent greenish black, except for white forewings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The native range of the muscovy's probable wild ancestor covers much of Central America and northern South America. The domestic form also occurs over most of Latin America - from southern Chile to the northern limits of traditional culture in lowland Mexico - including the Caribbean, where it was present shortly after Columbus landed.3 The birds can be observed among the domestic fowl in the high Andes, for example, and are feral in southern coastal areas of the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Carried across the Atlantic, probably in the early 1500s, the domesticated muscovy spread quickly in Europe, and thence to North America, Asia, Africa, and Oceania. Today, it finds favor with the food-loving French as "canard de Barbarie," and France has the greatest concentration of muscovies in Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Down the centuries the muscovy became popular in tropical Asia (especially the Philippines and Indonesia) and in China and Taiwan. Throughout Indonesia (where it is known as "entok") it is popular with villagers for incubating eggs from ducks, geese, and chickens. It is now spreading into Oceania, and has recently gained particular favor in the Solomon Islands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovies are also known in Africa and can be found in many villages, especially in West Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Not endangered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wild muscovies occur mainly along tropical jungle streams, but domestic muscovies are found in many environments from the heat of Central America to the cold of Central Europe. They also tolerate dry conditions, but they thrive best where climates are both hot and wet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muscovies utilize high-fiber feeds better than chickens and common ducks, and eat larger quantities of grass. They also consume other green vegetation and readily snap up any insects they can find. If quality forage is available, only a small daily ration of grain or pellets is required for them to reach peak production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovy females normally hatch and raise large broods efficiently. It is not unusual to see them with a dozen or more fragile ducklings in tow - many of them adopted from other species. They bravely protect their young and have been known to beat off cats, dogs, foxes, and other marauders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Normally, muscovies are healthy and live and breed for many years. They suffer few diseases, especially when free ranging. However, they seem to be more susceptible to duck virus enteritis (duck plague) than common ducks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p129a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">While appearing to be slow and lethargic, muscovies can be quick and agile when one tries to catch them. Females are strong fliers and readily clear a standard fence. Males frequently become so ponderous that they cannot get airborne without an elevated perch or the aid of a strong wind. Although they forage over a larger area than chickens, they generally neither decamp nor wander as far as common ducks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated muscovies are either solitary or live together in small family groups, but sometimes in winter they flock together on bodies of water. They swim and dive well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These birds seldom make loud noises. A drake's voice resembles a muffled "puff"; females are almost mute. However, both can hiss or make a soft sound not unlike that of sleigh bells.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The muscovy is polygamous (a young male will try to mate with almost any fowl, including chickens). Mating can occur on land or in water. Males are pugnacious and tolerate no opposition. Because of this, they do not do well in close confinement.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A BETTER FLY TRAP</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The muscovy is a voracious omnivore that is particularly fond of insects. For years, some Canadian farmers have sworn that a few muscovies took care of all fly problems on their farms. In 1989, Ontario biologists Gordon Surgeoner and Barry Glofcheskie (see Research Contacts) decided to put this to the test.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Starting with laboratory trials, the entomologists first put a hungry five-week-old muscovy into a screened cage with 400 living houseflies. Within an hour it had eaten 326. Later, they placed four muscovies in separate cages containing 100 flies each. Within 30 minutes over 90 percent of the insects were gone. It took flypaper, fly traps, and bait cards anywhere from 15 to 86 hours to suppress the populations that much.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moving to fleld tests, the researchers placed pairs of twoyear-old muscovies on several Ontario farms. Videotapes showed the birds snapping at houseflies and biting flies about every 30 seconds and being successful on 70 percent of their attempts. With that efficiency, they achieved 80-90 percent fly control in enclosures such as calf rooms or piggeries. The birds were given only water and had to scavenge for all their food. Females seemed to eat about 10 percent more flies than males, and individuals of any age between eight days and two years were equally effective.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds fit the practical needs for farmyard fly control. They stayed close to piglets and calves, to which flies are particularly attracted. They even snatched flies off the hides of resting animals without waking them up. On one farm, the birds huddled between sleeping piglets and were accepted by the sow lying beside them. This was noteworthy because most fly-catching devices (chemical, electrical, or mechanical) must be kept far from animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To the Canadians, the economic advantages are clear. A 35-cow dairy needs $150-$590 worth of chemicals for controlling flies during the fly season; muscovy chicks, on the other hand, cost less than $2 each, eat for free, and can be sold for a profit of 200-400 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The researchers point out that employing muscovies does not eliminate all need for insecticides, but it reduces the amounts required. And muscovies are biodegradable, will not cause a buildup of genetic resistance, and taste better than flypaper. Indeed, their meat is excellent, and the naturally mute birds seldom make any noise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reportedly, muscovies are kept in some houses in South America to control not only flies, but also roaches and other insects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The muscovy is generally raised only for its meat, which is of excellent quality and taste. In stews it is hard to distinguish from pork; cured and smoked it is similar to lean ham.4 The fat content is low.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovy eggs are as tasty as other duck eggs, and a muscovy female can supply a large number if she is kept from sitting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These birds are useful for clearing both terrestrial and aquatic weeds.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Down feathers are used, like those of other ducks, in clothing and comforters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muscovies may be raised like common ducks. An ideal grouping is one male to five or six females. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Except in Taiwan, France, Hungary, and a few other European countries, they exist predominantly in small flocks in farmyards and village ponds. However, they can be reared under intensive conditions in a shed or pen that is well lighted and equipped with low roosts and bedding. Under such conditions, they may be fed diets recommended for rearing common ducks or given coarse feeds, including whole grain. If chicken rations are used, fresh greens must be provided to avoid "cowboy" legs, a symptom of niacin deficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although they thrive in areas where there is abundant water, they do not require access to swimming water. They prefer to nest under cover and will use nesting boxes. A normal clutch size is 9-14 eggs; however, clutches of up to 28 can occur. There may be 4 clutches annually, and (when the hen does not have to brood the ducklings) some muscovies have laid 100 eggs in a year.6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The egg weight, which increases with the female's age, ranges from 65 to 85 g. The eggs require 33-35 days to hatch, a week longer than the common duck's. Hatching success of 75 percent or more is common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Compared with domestic ducks early growth is slow, which is perhaps why muscovies have not enjoyed wider industrial use. However, after the slow period they grow rapidly and, because they forage on a broader range of vegetation than common ducks, they can scavenge a large proportion of their diet at little or no cost.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When raised intensively, females average 2 kg and males 4 kg at 11-12 weeks of age. Females may reach sexual maturity by 28 weeks of age; males require a month more.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE MULE DUCK OF TAIWAN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In parts of Europe, hybrids between muscovies and common ducks are reared for fattening. However, Taiwan has made the most outstanding use of this "mule duck." Thanks in part to this muscovy hybrid, Taiwan's duck industry has grown rapidly in the last decade. The total value of duck products now exceeds $346 million per year. Much of the boom in duck production is due to improved feeding disease control and management systems, but much is also due to the performance of the mule duck. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This hybrid is now Taiwan's major meat-duck breed, and about 30 million are consumed each year. Indeed, the duck industry has been so successful that Taiwan is increasingly exporting frozen duck breast and drumstick meat to Japan. It now provides 24 percent of the duck meat eaten in Japan most of it coming from mule ducks. Also, Taiwan is exporting partially incubated mule-duck eggs throughout Southeast Asia. And mule ducks supply most of the raw material for Taiwan's large feather industry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taiwan farmers have been producing mule ducks for 250 years, but the recent jump in production is due to the use of artificial insemination to overcome the natural reticence of the different species to mate. Fortunately, artificial insemination is well developed and is a standard part of farming practice in Taiwan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mule ducks are successful because they have less fat than a broiler chicken and they grow faster. Indeed, they can reach a market weight of 2.8 kg at 65 - 75 days of age, depending upon the weather, season, and management. In part, this fast growth is because they are sterile and waste no energy in preparing for a sexual existence or in laying eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The usual cross employs a muscovy male and a domesticduck female. The domestic breeds most employed for muleduck production are White Kaiya (Pekin male x White Tsaiya female), Large White Kaiya (Pekin male x White Kaiya female) and colored Kaiya. Both sexes of the hybrid offspring weigh about the same.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crosses between a muscovy hen and a domestic drake are much rarer (traditionally, this was because of the different mating behavior of the two species, but even with artificial insemination available they are not much used) and the males of these hybrids are much heavier than the females. Females of this cross do lay eggs, but the eggs are small (about 40 g) and their embryos do not develop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are almost 300 duck-breeding farms in Taiwan, annually producing more than 600,000 female domestic ducks for use in producing mule ducks. Some farmers combine duck raising with fish farming. The excrete of 4,000 ducks on one hectare of pond can provide 30,000 tilapia with 20 percent of their feed. It helps the farmer get rid of waste as well as giving him fresh fish to sell. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, the muscovy is an extremely good forager and thrives under free-ranging conditions. Unlike other ducks, it grazes on grass and leaves and will maintain itself on pasture. Apparently, it can digest bran and other fibrous feeds better than common ducks can.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The males are larger than all but the largest strains of table duck. They have exceptionally broad, well-muscled breasts and provide one of the leanest meats of any waterfowl.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The muscovy is apparently more resistant to diseases that regularly decimate other poultry. This is one reason why villagers favored them: when chickens die, muscovies often survive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The female's strong parental qualities help assure the survival of ducklings with a minimum of human intervention. Her ability to incubate and hatch most other poultry eggs is an added advantage to small farmers who have neither the capital to buy, nor the knowledge to operate, artificial incubators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike other ducks, muscovies are not easily alarmed, and fright does not affect their egg production and laying. Indeed, they are so phlegmatic that automobiles can be major causes of death.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Because they are a tropical species, these birds are much less tolerant of cold than common ducks and require more protection from freezing weather.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The muscovy's feed conversion is not as good as the chicken's. Also, compared with some other meat-duck breeds, muscovies have a slower rate of growth and require about 4 6 weeks longer to attain maximum development of breast muscles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovies can be difficult to handle. If their legs are free, the handler may be badly lacerated by the claws.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although adults have a fair homing ability, muscovies may wander away when local forage is sparse, and young birds may be carried long distances downstream, never to return.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because they feed on greenery, they can devastate gardens if the plants are very young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovies can be unsuspected carriers of poultry diseases, so that healthy-looking muscovies may infect the other species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Poultry scientists should unite in efforts to advance technical knowledge and public appreciation of this bird. Governments and researchers should begin evaluations of local varieties and their uses and performances. The experiences of France, Italy, Eastern Europe, and Taiwan should be gathered and made available for a worldwide readership.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important that the many muscovy varieties within the countries of Latin America - where the bird has a centuries-long history of domestication - be maintained and studied. Many superior varieties and specimens may be awaiting discovery.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The muscovy's nutritional requirements, range and confined systems of management, and disease vulnerability are poorly understood and need study. Especially needed are ways to increase growth rate. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">10 Pigeon</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g013a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeons (Columba livia)1 are durable birds that can be raised with little effort. Able to survive in inhospitable climates, they fend for themselves - often ranging over many square kilometers to locate seeds and edible scraps. They have been raised for centuries, especially in North Africa and the Middle East. In parts of North America and Europe, they are produced as a delicacy for the gourmet market. But raising pigeons for food is not nearly as widespread as it could be; indeed, in modern times its potential has hardly been touched. Farmed pigeons are particularly promising as urban microlivestock because they require little space and thrive in cities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young pigeons (squab) grow at a rapid rate. Their meat is finely textured, has an attractive flavor, and is often used in place of game fowl. Tender and easily digested, it commands premium market prices. In many areas, the continuing demand is unfilled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeons are traditionally raised in dovecotes - "houses" that protect the birds from the elements and from predators. This system allows free-ranging flight and requires almost no human intervention. Dovecotes are a good source of both squab and garden manure, and they continue to be used, especially in Egypt. On the other hand, pigeons can also be raised in confinement - usually in enclosed yards - with all their needs supplied by the farmer. There are, for example, pigeon farms in the United States with up to 35,000 pairs of breeding birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeon production may never rise enough to compete with commercial poultry as a major source of food, but for Third World villages these birds could become a significant addition to the diet as well as a source for substantial supplemental income. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pigeons have small heads, plump, full-breasted bodies, and soft, dense plumage. They weigh from about 0.5 to nearly I kg. A few large breeds (Runts, for instance, which commonly weigh 1.4 kg) are the size of small domestic chickens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many breeds have been developed for meat production. They produce squab that grow quicker and have larger breasts than unselected birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The wild ancestor of the common pigeon - domestic, wild, or feral -  is thought to be the rock pigeon or rock dove of Europe and Asia. Today its domestic descendants are bred in virtually every country, and those that have gone feral (reverted to the wild) occur in most of the world's cities and towns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">They are abundant. However, as with most other domestic species there is concern over the decline and loss of certain breeds. Societies have been organized (notably in the United Kingdom) to preserve rare types.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p138a.png"></center><br>
+ Natural habitat of the rock dove ancestor of the domestic pigeon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The domestic pigeon can be raised equally well in temperate and tropical zones. Indeed, this adaptable species can be kept anywhere that wild pigeons exist, including arid and humid regions. It should be noted, however, that cold climates do not favor squab production and hot climates promote vermin and disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The pigeon's natural diet consists mostly of seeds, but includes fruits, leaves, and some invertebrates. Feral pigeons consume a wide array of materials, including insects, bread, meat scraps, weed seeds, and many kinds of spilled grains at mills, wharves, railway yards, grain elevators, and farm fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the first four or five days of life, the young are fed "crop milk." This substance, common to pigeons and doves,2 is composed of cells from the lining of the crop and is very high in fats and nutritional energy. The phenomenal growth rate of young squab has been attributed to crop milk and to its early replacement (within 8-10 days) with concentrated foods, regurgitated by both parents. The parents feed the squab for about four weeks before pushing it out of the nest to prepare for the next clutch.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In domestic birds, sexual maturity (as measured by age at first egg) is reached at 120-150 days. Life span can be 15 years, although growth and egg production decline rapidly after the third year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wild pigeons often nest on cliff sides. Domestic pigeons prefer to nest around buildings, in nooks and shelves and under the eaves - that is, in "pigeonholes."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In domestic varieties, the pair-bond often lasts until severe illness or death. Sometimes, however, a vigorous male will "invade" a nest and mate with the females there. Both sexes take nearly equal part in nest building, incubation, and caring for the young. Typically, there are two eggs to a clutch. Eight clutches a year is not uncommon for a breeding pair. The incubation period is 17-19 days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike most birds, pigeons drink by inserting their beaks into water and sucking up a continuous draft. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Courtship is characterized by cooing, prancing, and displays of spread, lowered tail feathers. "Bow and coo" exhibitions are unique to pigeons and doves and differ among species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pigeons are usually raised exclusively for meat. The squab are harvested just before full feather development and before the youngster has started to fly, usually at 21-30 days of age. At this time the ratio of flesh to inedible parts is highest; once flying begins, the meat becomes tougher. Weight depends upon breed, nutrition, and other factors, but usually ranges from 340 to 680 g.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeons are extensively used for scientific research, notably in physiology and psychology. They are also widely kept as pets for plumage and for racing. The pigeon's unique homing ability was recognized in Roman times, and the birds have been trained to return to the dovecote from as far away as 700 km. Even today, homing pigeons are used to carry messages, especially during war.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pigeons are easily trained to recognize "home." The wing feathers are clipped and the birds are fed close to the dovecote; by the time they refledge, their homing instinct has been developed. Alternatively, newly captured pigeons may be trained by confining them to the dovecote for at least one week. At first, a little grain is provided in the morning (this is to ensure the birds will return to the coop). The birds can obtain the rest themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any waterproof house that is easy to clean is suitable for keeping pigeons. Many traditional dovecotes are built of earthenware pots. In Asia and Europe, wooden pigeon towers are generally used.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike chickens, pigeons do not prefer communal roosts. Instead, they prefer nesting shelves, of which there should be two for each breeding pair. The shelves are usually placed in dark corners and are fitted with low walls to keep eggs from rolling out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grit is important in the diet, both to provide minerals and to allow the birds to grind feed in their gizzards.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Commercial squab breeds are often kept permanently in pens, a process that requires care and experience. Growers expect an average of 12-14 squab per pair per year, although much depends on environment and management. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds need fresh water daily and water for bathing at least weekly. Since they feed their young by regurgitation, the adults must have a continuous supply of clean drinking water. Orphan squab can be fed egg yolk until old enough to consume adult feeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like all poultry, confined pigeons must be provided enough supplemental feed to ensure a balanced diet. A mixture of whole grains can be fed for maximum production. It is important that grains be dry and free of mold (pigeons will not thrive on mash). Peas, beans, or similar pulses make good supplements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CARRIER PIGEONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most people consider message-carrying pigeons to be a quaint anachronism. But in a few countries (both developed and developing) carrier pigeons are making a comeback, and in the future they may be used routinely once again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New techniques are making this process far more practical than before. For example, in the past the pigeons would be flown in one direction only. They were transported away from home and at the appropriate time released to find their way back. That was very limiting. But it has since been found that pigeons can be trained to carry messages in two directions: flying from one point to another and then back again. They will do it twice a day, and with almost perfect reliability. The key is to place the feeding station at one end and the nest at the other. This limits the pigeon's range, but they still can handle round-trip distances up to 160 km.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With a little ingenuity, there is no need for a person to monitor the stations to receive the messages as the bird arrives. One simple technique is to arrange the station with one-way doors - one opening inwards, the other outwards. Placing a bar across the outward door means that the bird cannot get out until someone releases it. Thus the message can always be retrieved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This system has been employed in Puerto Rico and Guatemala, but it could be used almost anywhere. In many parts of the Third World, in particular, there are remote areas with no phones and with hilly, rough terrain where delivering messages can take hours of strenuous travel. Some locations are subject to unexpected isolation by natural calamities or military or terrorist actions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Puerto Rico, for instance, we kept pigeons in a village 32 km from the capital. The pigeons could get downtown in 20-30 minutes. It took us 1.5-2 hours each way by road. What was easy for the birds was a major trip for us. Pigeons carried the villagers' requests for certain foods and medicines. Our contact in the city then sent up the supplies by bus. The birds never let us down.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Carrier pigeons are useful for more than just flying far and fast. They have been bred for racing and their large pectoral muscles make them excellent meat producers - much better than the common pigeons normally raised for food. A pair of carriers typically will raise 12 - 16 young each year, and those not needed for message carrying can be butchered at 28 days of age - yielding meat that is nutritious and considered a delicacy in many countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David Holderread</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Every day on the northwest coast of France, Petit Gendamme, a black and white carrier pigeon, flies on average 23 km between hospitals on his blood delivery route. Trussed in tiny hand-sewn harnesses, he and a flock of carrier pigeons set out (except during the hunting season) with little red tubes of blood secured to their breasts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"It's a simple, effective, and cost-saving transport system," said Yves Le Henaff, head of the Avranches Hospital laboratory, Cotentin, France, a central blood-testing center that serves a number of isolated medical centers along the coast.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The service becomes particularly valuable during the summer tourist rush, when travellers flock to the seashore to visit nearby Mont Saint Michel, crowding the small country roads and increasing the risk of traffic accidents.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds' average flight time between the hospitals of Avranches and Granville, for example, a distance of about 27 km, is 20 minutes, including the time for harnessing up. And with a favorable western wind their best time can reach 11 minutes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While gasoline costs the equivalent of $0. 75 a lifer in France, hospital officials say that a few grains of corn is all it takes to run this operation. According to Le Henaff, who supervises the carrier pigeon operation, the hospital is saving up to $46 a day on gas and auto maintenance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 40-year-old Le Henaff got the idea five years ago from an article in a scientific journal describing a similar experiment in Britain. A year later, he and an associate called on the local seamstress to design a light harness that could hold a tube, which, when filled, weighs approximately 39 g.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The flock now consists of 40 veteran fliers and 20 carrier pigeons in training.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And what if the winged creatures stray en route? Le Henaff has devised a fall-back option: two pigeons carry two different test tubes containing the same blood sample.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds fly every day of the year with the exception of the three-month autumn hunting season. Since the beginning of the experiment four years ago, there have been two casualties. Le Henaff believes the birds probably met their fate in some Normand's oven.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sometimes weather is a factor, and heavy fog can keep the delivery team grounded.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So far, the new job seems to benefit the pigeons, too. Unlike sickly city pigeons, whose average life span is about four years, well-cared-for carrier pigeons can live up to 15 years, Le Henaff said. "And how many people do you know who are willing to stay with the same outfit for that long?"</P>
+<P ALIGN="JUSTIFY">Sabine Maubouche</P>
+<P ALIGN="JUSTIFY">The Washington Post</P>
+<P ALIGN="JUSTIFY">December 2, 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Under extensive conditions - where the birds are released each day to feed themselves - almost no land is needed. Under intensive conditions, where the birds spend their lives in confinement, a mere half hectare can be enough space to raise 2,000 pairs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Free-ranging pigeons forage over a wider area than most domestic fowl because they fly out to find their feed. Nutrient requirements3 are similar to those of chickens and other fowl (making allowance for the energy needed for flying), so commercial feed and other supplements - if needed at all - are generally available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In dovecote culture, pigeons require little or no handling. They brood the young with little intervention. Although not continuous, the production of meat from these fast-growing, rapidly reproducing birds is more sustained than with most livestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Almost nowhere are there taboos against consuming pigeon meat. Prices received for squab are normally high, and in most places the demand is constant. The only limitation in some areas is the absence of an effective market, which is usually easy to create.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Squab contains a larger proportion of soluble protein and a smaller proportion of connective tissue than most meats and is therefore good for invalids and people with digestive disorders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As many hobbyists can testify, raising pigeons can be gratifying.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pigeons are subject to few diseases. However, worms, lice, diarrhea (coccidiosis), canker (trichomoniasis), and salmonella (paratyphoid) occur at some time in most domestic breeds. Salmonella exists in low levels in most flocks and will flare up if birds are stressed. Treatments recommended for domestic chickens are usually suitable for pigeons. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By flying over a wide area and eating grains and other foods, pigeons can cause conflicts with farmers. Indeed, in the 13th century the aristocracy's pigeons became a major grievance of the peasants who saw their seed devoured. On the other hand, "croppers" (breeds with large crops) were developed to steal grain from the lord's fields. The pigeon returned home and his crop was emptied of the grain, which was used by the peasant to make bread.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds can become nuisances. They leave droppings in annoying places, some people find them too noisy, and a few people are severely allergic to "pigeon dust."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Every conceivable type of predator can be expected; therefore, precautions must be taken. The dovecote must be well protected against rats, which are the principal enemy of the eggs and the squabs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nesting birds need a high-protein diet to raise squab at the high rates of gain that are possible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Poultry researchers should study the increased role pigeons might play in Third World economic development. Nothing comparable to the sophisticated selection employed with the domestic chicken has so far been attempted. Given such attention the gains could be great.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among pressing research needs are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Breeding. This needs to be better understood. For example, the effects of hybridization and inbreeding need clarification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Environmental limits. Little work has been done outside the temperate regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Diseases. These deserve increased attention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">There is also the potential of "dovecotes" for wild pigeons. Numerous local species are well adapted to local conditions, and these deserve to be tested for "domestication."4 Many wild species quickly lose their fear of man, and in time they can even become too fat to fly. Wild pigeons are already found throughout the humid tropics and are trapped for meat and rearing in New Guinea and other places. They are already an important food source for many subsistence farmers and shifting cultivators, and with some dovecote management could provide a greater, more dependable source of food and income. The potential for domesticating local pigeon species, especially those suited to the tropics, deserves exploration. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">11 Quail</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g014a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Native to Asia and Europe, quail' (Coturnix coturnix2) have been farmed since ancient times, especially in the Far East. They reproduce rapidly and their rate of egg production is remarkable. They are also robust, disease resistant, and easy to keep, requiring only simple cages and equipment and little space. Yet they are not well known around the world and deserve wider testing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail are so precocious that they can lay eggs when hardly more than 5 weeks old. It is said that about 20 of them are sufficient to keep an average family in eggs year-round. Quail eggs are very popular in Japan, where they are packed in thin plastic cases and sold fresh in many food stores. They are also boiled, shelled, and either canned or boxed like chicken eggs. Quail eggs are excellent as hors d'oeuvres and they also are used to make mayonnaise, cakes, and other prepared foods.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In France, Italy, the United States, and some countries in Latin America (Brazil and Chile, for example) as well as throughout Asia, it is the meat that is consumed. It is particularly delicious when charcoal broiled. One company in Spain annually processes 20 million quail for meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of the domesticated strains seem to have originated in China, and migrating Chinese carried them throughout Asia. Today, millions of domestic quail are reared in Japan, Indonesia, Thailand, Taiwan, Hong Kong, Indochina, Philippines, and Malaysia, as well as in Brazil and Chile. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Commercial production is carried out, as in the chicken industry, in specialized units involving hatcheries, farms, and factories that process eggs and meat. However, quail have outstanding potential for village and "backyard" production as well. It is this aspect that deserves greater attention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Quail come in various sizes. The smaller types are used for egg production, whereas the larger ones are better for meat. Adult females of improved meat strains may weigh up to 500 g. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are several color varieties. However, mature females are characterized by a tan-colored throat and breast, with black spots on the breast. Mature males, which are slightly smaller than females, have rusty-brown throats and breasts. All mature males have a bulbous structure, known as the foam gland, located at the upper edge of the vent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the United States, the Pharaoh strain is the bird of choice for commercial production. Other available strains tend to be bred more for fancy than for food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail eggs are mottled brown, but some strains have been selected for white shells. These eggs are often preferred by consumers and are easier to candle (the process of holding eggs up to a light to check for interior quality and stage of incubation). An average egg weighs 10 g - about 8 percent of the female's body weight. (By comparison, a chicken egg weighs about 3 percent of the hen's body weight.) Quail chicks weigh merely 5-6 g when hatched and are normally covered in yellowish down with brown stripes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The ancestral wild species is widely distributed over much of Europe and Asia as well as parts of North Africa. Although domestic quail are now available almost everywhere, Japan is probably the world leader in commercial production; quail farms are common throughout its central and southern regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Not endangered. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p149a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Quail are hardy birds that, within reasonable limits, can adapt to many different environments. However, they prefer temperate climates; the northern limit of their winter habitat is around 38&Yacute;N.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A quail's diet in the wild consists of insects, grain, and various other seeds. To thrive and reproduce efficiently in captivity, it needs feeds that are relatively high in protein.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The females mature at about 5-6 weeks of age and usually come into full egg production by the age of 50 days. With proper care, they will lay 200-300 eggs per year, but at that rate they age quickly. The life span under domestic conditions can be up to 5 years. However, second-year egg production is normally less than half the first year's, and fertility and hatchability fall sharply after birds reach 6 months of age, even though egg and sperm production continue. Thus, the commercial life is only about a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crosses between the wild and domestic stocks produce fertile hybrids. Repeated backcrossing to either wild quail or domestic quail is successful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Only females hatch the eggs and raise the chicks. Males go off and court other females when their partners begin the nesting process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Quail eggs taste like chicken eggs. They are often served hard boiled, pickled, fried, or scrambled. Because of their size they make attractive snacks or salad ingredients. They provide an alternative for some people who are allergic to chicken eggs. On frying, the yolk hardens before the albumen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail meat is dark and can be prepared in all of the many ways used for chicken. The two meats are similar in taste, although quail is slightly gamier.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its hardiness, small size, and short life cycle, quail are now commonly used as an experimental animal for biological research and for producing vaccines - especially the vaccine for Newcastle disease, to which quail are resistant. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many fanciers and hobbyists have also become interested in raising this adaptable species as a pet. Science teachers find it an excellent subject for classroom projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">QUAIL IN JAPAN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In some areas of Japan, quail are widely raised for their eggs and meat. However, Japanese originally valued the quail as a songbird. Tradition has it that about 600 years ago people began to enjoy its rhythmic call. In the feudal age, raising song quail became particularly popular among Samurai warriors. Contests were held to identify the most beautiful quail song and birds with the best voices were interbred in closed colonies. Even photostimulation was practiced to induce singing in winter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Around 1910, enthusiastic breeders produced the present domestic Japanese quail from the song quail. It was created as a food source and became a part of Japanese cuisine. During World War II it was almost exterminated, but Japanese quail breeders restored it from the few survivors and from birds imported from China. The original song quail, however, were lost. In the 1960s, commercial quail flocks rapidly recovered and Japan's quail population again reached its prewar level of about 2 million birds. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A QUAIL IN EVERY POT: AN OLD DELICACY FINDS A NEW PUBLIC</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">For centuries, quail were considered a great delicacy: a dish that only eminent chefs would cook and diners with an appreciative palate could enjoy. These small migratory birds, which are found in one variety or another throughout the world, were available until recently almost exclusively to hunters in the wild.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But now quail are in danger: in danger of becoming commonplace.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the last few years, quail have gone from being rarefied to a supermarket specialty item. They are on menus in the most elegant restaurants and the most casual cafes and bistros.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Why so much interest?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail are now available semi-boneless, which makes them faster and easier to cook, and easier to eat as well. The breastbones are removed by hand before the birds are packaged and shipped to stores. The bones in the wings and legs remain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A stainless-steel V-shaped pin - invented and patented by a restaurant chef who wanted a way to keep quail flat for grilling is inserted into the breast. The pin can be left there throughout cooking and removed just before serving.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While whole quail might require 45 minutes to cook, the semi-boneless variety can be grilled in less than 10 minutes, or pan-roasted, braised or sauteed in less than 20 minutes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The flavor of farm-raised quail has also helped bring them into the mainstream. Most farm-raised quail have tender meat like the dark meat of chicken, whose flavor is enjoyed by many people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And at a time when people are searching for foods, specifically animal protein, with low fat and cholesterol, quail fills the bill. The Agriculture Department says that quail skin has about 7 percent fat, about the same as dark meat of roasted chicken without the skin.</P>
+<P ALIGN="JUSTIFY">Judith Banrett Adapted from The New York Times </P>
+<P ALIGN="JUSTIFY">June 21, 1989</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">It is necessary to keep quail in battery cages on wire floors because males secrete a sticky foam (from the foam gland) with their feces; on a solid floor, this adheres to the feet and collects dung, leading to crippling and breakage of eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adult quail can live and produce successfully if they are allowed 80 cm2 of floor space per bird. However, for reproduction about twice that is needed to allow for mating rituals.3 If properly mated, high fertility rates and good egg hatchability can be expected. To obtain fertile eggs, one male is needed for roughly six females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eggs hatch in about 17 days. Chicks require careful attention. Brooding temperatures of between 31 C and 35 C  are needed for the first week and above 21 C for the second week. From the second week on, chicks can survive at room temperature. (These temperatures are similar to those required for common chickens.) In cold climates, supplemental heat may be needed as well as protection from cool drafts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Clean water must be provided at all times, with care taken to prevent the chicks from drowning in their water troughs. Shallow trays, jar lids, or pans filled with marbles or stones may be used.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Quail production can be started with little money. These easy-care birds can be housed in small, simple, inexpensive cages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, they are resistant to Newcastle disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SIX OF ONE, HALF A DOZEN OF THE OTHER</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The fact that chickens can be crossed with quail has been known for some time, but there has been little attempt to develop the fertile hybrids. Now Malaysia has begun a project aimed at producing a new poultry bird - a cross between a cockerel and a hen quail. Zainal Abidin bin Mohd Noor, of the Department of Veterinary Services in Kuala Lumpur, is creating a strain that produces eggs of good quality and meat with the flavor of both parents. The new bird is intermediate in size between chicken and quail which is convenient because it is about right for an individual helping.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The crossbreeding is done through artificial insemination. The progeny exhibit a range of appearances, sizes, and plumage colors, depending on the strains of cockerel and quail hens used. In the Malaysian research, cockerels have been local Ayam Kampung Bantam, Hybro, and Golden Comet hybrids. The quails have been local inbred Japanese quail (IJQ) and imported meat strain quail (IMSQ).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The trials show that the hybrids derived from the IMSQ flocks grew faster and bigger than those from the IJQ cross. The best have been the Hybro x IMSQ crosses, which weigh 475 g at 10 weeks of age. The best of the IJQ group weighed 290 g during the same period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This type of "tropical game hen" might be a way to introduce hybrid vigor into poultry production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The researchers who developed the hybrid have named it the "yamyuh." </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although generally disease resistant, quail are affected by several common poultry diseases, including salmonella, cholera, blackhead, and lice. They also suffer epidemic mortality from "quail disease" (ulcerative enteritis), which can, however, be controlled with antibiotics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail seem to require more protein than chickens, and produce best when given feed that is fairly high in protein.4 However, they also perform satisfactorily when fed rations designed for turkeys. They have high requirements for vitamin A, which they do not store.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail are not suitable as free-ranging "scavengers." They must be kept confined, which is a major constraint. Unlike chickens or pigeons, they have no homing instinct and will not remain on a given site; if released, they will be lost. In addition, since they nest on the ground, they are highly susceptible to predation; they must be protected, especially where certain animals, the mongoose for example, are common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Artificial incubation is essential. Natural incubation using the female is futile; the females do not go broody and rarely incubate their eggs. The shells are extremely thin, but the eggs can be incubated under a small chicken hen, such as a bantam.5 The eggs are also subject to minute fractures. However, the shell membrane is extremely tough and unfertilized eggs are generally unaffected, but the cracks cause fertilized embryos to dehydrate and die. This is a serious limitation. Whenever quail husbandry is introduced, artificial incubation should be included.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Quail deserve to be included in all poultry research aimed at helping the Third World. Through its international scientific program, Japan, in particular, could apply to developing nations its vast experience with quail farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experiences with quail in the tropics (for example, Japanese farmers in the Amazon Basin) and in tropical highlands (for instance, in India, Nepal, or Central Africa) should be collected and assessed to improve understanding of the environmental limits to Third World quail farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cooperation between commercial and laboratory quail breeders should be encouraged. Mutants found at the commercial level would be useful for laboratory work. Conversely, introducing new stocks could help the farmer. In both cases, more genetic diversity might also lead to the production of hybrid vigor, and genetic variability would be conserved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sex-linked genes, if they can be found, would be useful to the commercial quail breeder for the rapid sexing of newly hatched chicks. This could lead to more efficient production techniques, like those in the chicken industry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although virtually all work to date has been on the Japanese quail, other species and subspecies warrant research and testing. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">12 Turkey</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g015a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The turkey (Meleagris gallopavo) is well-known in North America and Europe, but in the rest of the world, especially in developing countries, its potential has been largely overlooked. Partly, this is because chickens are so familiar and grow so well that there seems no reason to consider any other poultry. Partly, it is because modern turkeys have been so highly bred for intensive production that the resulting birds are inappropriate for home production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, there is a much wider potential role for turkeys in the future. There are types that thrive as village birds or as scavengers, but these are little known even to turkey specialists. These primitive types are probably the least studied of all domestic fowl; little effort has been directed at increasing their productivity under free-ranging conditions. However, they retain their ancestral self-reliance and are widely used by farmers in Mexico. That they are unrecognized elsewhere is a serious oversight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Native to North America, the turkey was domesticated by Indians about 400 BC, and today's Mexican birds seem to be direct descendants.' Unlike the large-breasted, modern commercial varieties, they mate naturally and they retain colored feathers and a narrow breast configuration. Their persistence in Mexico after 500 years of competition with other poultry highlights their adaptability, ruggedness, and usefulness to people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These birds complement chicken production. They are able to thrive under more arid conditions, they tolerate heat better, they range farther, and they have higher quality meat. Also, the percentage of edible meat is much greater than that from a chicken. Turkey meat is so low in fat that in the United States, at least, it is making strong inroads into markets that previously used chicken exclusively. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turkeys are natural foragers and can be kept as scavengers. Indeed, they thrive best where they can rove about, feeding on seeds, fresh grass, other herbage, and insects. As long as drinking water is available, they will return to their roost in the evening.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appreciation for the turkey could rise rapidly. Interest already has been shown by several African nations. A French company has created a strain of self-reliant farm turkeys and is exporting them to developing countries.2 Researchers in Mexico are displaying increased interest in their national resource. And as knowledge and breeding stock continue to be developed, it is likely that village turkeys will become increasingly popular around the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Modern turkey breeding has been so dominated by selection for increased size and muscling that commercial turkeys have leg problems and cannot mate naturally (they are inseminated artificially). These highly bred birds are adapted for large-volume intensive production, and must be raised with care. As noted, this chapter emphasizes the more self-reliant, less highly selected turkeys found in Mexico and a few other Latin American countries. They do not require artificial insemination, and with little attention can care for themselves and their young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fully grown "criollo" turkeys of Mexico are less than half the size of some improved strains. Males weigh between 5 and 8 kg; females, between 3 and 4 kg.3 They vary in color from white, through splashed or mottled, to black. The skin of the neck and head is bare, rough, warty, and blue and red in color. A soft fleshy protuberance at the forehead (the snood) resembles a finger. In males it swells during courtship. The front of the neck is a pendant wattle. A bundle of long, coarse bristles (the beard) stands out prominently from the center of the breast.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The unimproved domestic turkey is essentially limited to central Mexico and scattered locations throughout nearby Latin American countries. Some village birds are also kept in India, Egypt, and other areas, but these are descended from semi-improved strains exported from North America and Europe in earlier times. Generally speaking, few turkeys are found in tropical countries outside Latin America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domesticated turkeys are not endangered; there are estimated to be about 124 million in the world. However, the wild Mexican varieties, ancestors to the first domesticated turkeys sent to Europe, may now be endangered since their distribution in southwestern Mexico has been greatly reduced. Certainly, some primitive domestic strains in the uplands of central Mexico are also being depleted. A separate type, independently domesticated by the Pueblo Indians of the southwestern United States, seems to have disappeared entirely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Turkeys can be reared virtually anywhere. Their natural habitat is open forest and wooded areas of the North American continent, but in Mexico they are raised from sea level to over 2,000 m altitude, from  rainforest to desert, and from near-temperate climates to the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p159a.png"></center><br>
+ The original distribution of the turkey and the occellated</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The range of diet is broad. Turkeys eat greens, fruits, seeds, nuts,  grasses, berries, roots, insects (locusts, cicadas, crickets, and  grasshoppers, for example), worms, slugs, and snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reproduction is generally seasonal and is stimulated by increasing  daylength. (A minimum daylength of 12 hours is required.) The birds  can reach sexual maturity at six months of age and may start breeding at  this time. Ten days after first mating, the hen searches out a nest and  commences laying. Industrial birds in temperate climates lay, on  average, 90 eggs a year. The nondescript type of turkey in the tropics  seldom lays more than 20 small eggs (weighing about 60 am) before  going broody.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic turkeys walk rather than fly, and find almost all their food  on the ground. They can, however, fly short distances to avoid  predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The commercial birds have lost many abilities for survival in the wild;  they can no longer exist without human care. However, village types  can do well with little management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turkeys prefer to make their own nests but can be induced to lay in a  convenient spot if provided with nest boxes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These birds are raised almost exclusively for meat. In many countries,  they are a treat for holidays, birthdays, and weddings. In their native  range of Mexico and Central America, the "unimproved" birds are  usually produced as a cash crop for market. They receive little care or  feed, and thus they are almost all profit - providing a significant income  supplement to many rural homes.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The principles of turkey management (nutrition, housing, rearing' and prevention of disease, for example) are basically the same as those for other poultry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Mexico, turkeys are usually kept under free-ranging conditions around houses and villages. Some shelter and kitchen scraps are occasionally provided. A number of them, however, are confined in backyards as protection from marauders and for shelter against rain and wind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One male can service up to 12 females. Roomy nests are needed. (As a rule, turkeys require three times the space occupied by chickens.) Most range turkeys are corralled when they begin to lay, so as to protect them from predators. Eggs may be gathered to prevent broodiness and thereby increase production. The eggs may be kept for several days (cool, but not refrigerated) if turned daily, and then may be placed under a chicken hen. (A setting chicken can be used this way to hatch up to nine eggs at a time.) Hatching takes 28 days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As in other birds, newly hatched turkeys (poults) must be kept warm during the first weeks of life. Until they begin foraging and have full access to pasture they are usually fed broken grain or fine mash, as well as finely chopped, tender green feed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although free-ranging turkeys are simple to raise, confined turkeys require more complex management. The birds need uncrowded, well ventilated conditions and should be on a wire or slatted floor to reduce parasitic infections. Any feeds recommended for chicks are suitable, but the protein content should be somewhat higher; that is, about 27 percent. They can be fed mixed grains, corn, and chopped legume hay. It may be necessary to provide vitamin supplements and antibiotics and take steps to prevent coccidiosis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"AN INCOMPARABLY FINER BIRD"</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The turkey was domesticated in Mexico some time before the Conquest. It is the one and only important domestic animal of North American origin. When the Spanish arrived, they found barnyard turkeys in the possession of Indians in all parts of Mexico and even in Central America. However, the Aztecs and the Tarascans, originating in west-central Mexico, seemed to have achieved the highest development of turkey culture, and it is probable that turkeys were domesticated in the western highlands, perhaps in Michoacan. Wild turkeys of that region are morphologically very similar to the primitive domestic bronze type. Both the Aztecs and Tarascans kept great numbers of the birds, including even white ones. They paid royal tribute to their respective kings in turkeys, according to the Relacion de Michoacan. The Tarascan king fed turkeys to the hawks and eagles in his zoo. The economy of some highland tribes was based on the cultivation of corn and the raising of turkeys.</P>
+<P ALIGN="JUSTIFY">A. Starker Leopold</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE INDUSTRIAL TURKEY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The modern domesticated turkey is thought to be descended from two differing wild subspecies, one found in Mexico and Central America and the other in the United States. The southern type is small, whereas the U.S. native is larger and has a characteristic bronze plumage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mexican turkeys were exported to Europe soon after the Conquest, and spread rapidly. In the 17th century, some were returned to North America, where they interbred with the eastern subspecies of wild turkey, producing a heavier bird, which was then re-exported to Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These types underwent little change until this century, when the Englishman Jesse Throssel bred them for meat quality. In the 1920s, he brought his improved birds to Canada, where their large size and broad breasts quickly made them foundation breeding stock. Crossed with the narrow-breasted North American types, these heavily muscled meat birds quickly supplanted other varieties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">About the same time, the U.S. Department of Agriculture began the scientific development of a smaller meat turkey derived from a more diverse genetic base. By the 1950s, the Beltsville Small Whites predominated in the home consumption market in the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The birds are efficient and generally take care of themselves. They tolerate dry, hot, or cold climates and forage farther than chickens. They are large, fast growing, highly marketable, low in fat, and tasty. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE TURKEY'S TROPICAL COUSIN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The ocellated turkey (Agriocharis ocellata) occurs in Yucatan, Guatemala, and Belize. It is much like the common turkey in size, form, and behavior: however, unlike the common turkey, which in Mexico lives in the high mountain pine and oak forests, the ocellated turkey inhabits bushy, semiforested lowlands. This splendid bird lacks the kind of beard sported by the common turkey gobbler, is generally more metallic in appearance, and has brighter coppery colors. The chief character is a neck and head that are bare, blue, and profusely covered with coral-colored pimples. It also has a yellow-tipped protuberance growing on the crown between the eyes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This species is worthy of investigation by poultry researchers because it might prove to be domesticable. It was possibly domesticated by the Mayas, whose ruins often include appropriately sized stone enclosures whose soil has elevated levels of phosphorus and potassium. Even today, in the rural Peten area of Guatemala, ocellated turkeys are sometimes kept around houses as scavengers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Young birds are readily affected by temperature changes and must be protected from the sun as well as from sudden chills, such as may occur at night. They are particularly susceptible to dampness, especially if associated with cold. One peculiarity is the turkey's aversion to any change in feeding routine or the nature of the food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young turkeys are susceptible to parasitic infestation as well as to the same type of bacterial and virus diseases as chickens (for example, fowlpox and coccidiosis). Blackhead, a devastating disease of young turkeys, is carried by a common parasitic nematode, and can be contracted from chickens. Medicines are available to prevent or treat most disease and pest problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Turkey development is almost nonexistent in the Third World (and much of the rest of the world, too). Although commercial turkeys are highly developed in some countries, little or no research has been conducted on the criollo turkey. Research on physiology, disease, and husbandry of the criollo turkey should be given high priority.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The need for conservation of genetic variability is perhaps more critical in this species than in almost any other domesticated animal. The unimproved types in Mexico should be collected and assessed, and a program to conserve the stocks should be initiated. An analysis should also be made of the traditional management and performance of these birds. In addition, the four or five recognized turkey subspecies should be evaluated for their potential as seed stock for Third World countries. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">13 Potential New Poultry</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g016a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several preceding chapters have discussed the possibilities of domesticating certain wild birds.l Here, briefly, are highlighted other wild species with qualities that might make them suitable for sustained production. It should be understood that their practical use in the long run is pure speculation; they are included here merely to guide those interested in exploring the farthest frontiers of livestock science.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collectively, poultry have become the most useful of all livestock and the most widespread. Yet only a handful of species are employed. Of the 9,000 bird species, only a few (for instance, chickens, ducks, geese, muscovies, pigeons, and turkeys) have been domesticated for farm use. Strictly speaking, all birds are edible - at least none have poisonous flesh - so it seems illogical to conclude that these are the only likely candidates. Perhaps they are not even the best.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At first sight there may seem to be little need for new species, but poultry meat is in ever increasing demand and there are many niches where the main species are stricken by disease, or are afflicted by heat, humidity, altitude problems, or other hazards. For these areas, a new species might become a vital future resource. Perhaps some could even become globally important. The modern guinea fowl, for example, is a relative newcomer as a worldwide resource (see page 120).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The birds now used as poultry were domesticated centuries ago by people unaware of behavior modification, nutrition, genetics, microbiology, disease control, and the other basics of domestication. Today we can tame species that they couldn't. In particular, the new understanding of "imprinting" may make the domestication of birds easier today than ever before. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this highly speculative concept, the birds described on the following pages are worth considering. They all eat vegetation and tend to live in flocks, which makes them likely to be easy to feed and to keep in crowded conditions. Most are sedentary, nonmigratory, and poor fliers. All but three (tinamous, sand grouse, and trumpeters) are gallinaceous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gallinaceous birds are already the most important to people. The best known are chickens, turkeys, quail, and guinea fowl. But there are about 240 other species. Most are chickenlike: heavy bodied with short, rounded wings, and adapted for life on the ground. Although some are solitary, many are sociable. Basically vegetarian, they also eat insects, worms, and other invertebrates. The young birds are extremely precocious, walking and feeding within hours of hatching. All of these are advantageous traits for domestication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Game birds are also emphasized here. Many today are considered gourmet delights, and this should give them a head start in the marketplace. Indeed, some are already being raised in a small way on game farms and are at least partly on the way to domestication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHACHALACAS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These brownish birds (Ortalis vetula and nine other species) are found throughout Central and South America, and, given research, could possibly be raised on a large scale. A sort of "tropical chicken," they tame easily, live together in dense populations, and protect their chicks extremely well. They commonly scavenge around houses and people often put out scraps to feed them.2 The chicks are easily hatched, grow fast, and can be fed standard chicken rations.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is already considerable demand for these birds. Everywhere they are found, they are prized as food. In some areas they constitute the single most important game species, and are heavily hunted to supply local communities. Although they have less meat than a chicken, it is tastier and darker.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chachalacas are very adaptable. They occur mainly around forest edges and thrive in the thickets that appear after tropical forests have been felled. They do well close to humans, and their populations are not threatened, despite much hunting. Indeed, they seem well adapted to existence around villages and towns. Although not strong fliers, they are one of the few tree-roosting gallinaceous species. Primarily fruit eaters, they also consume tender leaves, twigs, and buds, and they scratch up the ground, presumably for insects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although excitable and noisy, chachalacas become remarkably tame when fed by people. In a few cases, full domestication has almost been reached. Farmers like to have chachalacas around and have even used them to guard domestic chickens. These very raucous and fearless birds will take on all potential threats, even weasels.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GUANS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Close relatives of the chachalacas, guans5 are glossy black birds about the size of small geese. They are highly gregarious and perhaps could be raised in larger numbers. They commonly live around houses, farms, and settlements in their native region of tropical America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike most game birds, guans are chiefly tree dwellers, but they also feed on the ground. Some 12 species are known. All are relentlessly hunted for food and sport - their tameness and inability to fly far or fast making them easy targets. The rapid destruction of tropical forests threatens their populations in some parts of their range. Conservation projects and specific plans of action are being proposed for the most threatened species. Perhaps for the other species, game-ranching projects or even outright domestication might provide just the right incentive for their protection and multiplication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CURASSOWS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Curassows are also relatives of guans and chachalacas, but they are even larger - up to 1 m tall and 5 kg in weight. At least seven species are found over the vast area from northern Mexico to southern South America.6 Among them are Latin America's finest game birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It might be possible to produce curassows in organized farming or ranching. They are commonly called "tropical turkeys" because they look like and run like turkeys. Indeed, Latin Americans normally refer to them as "pavos" or "pavones," as if they were the real thing. Their plumage ranges from deep blue to black, invariably with a purple gloss, and all have rather curly crests on their heads. They are not good fliers and spend most of their time on the ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Curassows are increasingly hunted; their tropical forest habitat is shrinking, and the subsequent loss of populations is a calamity. They are special targets, not only because they are large but also because their light-colored flesh makes exceptional eating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is hope that these large wild fowls can be raised and managed in organized programs. Even now, people commonly keep them around their farms and villages. For example, on a number of Venezuelan ranches, yellow-raped curassows can be seen wandering around the cattle yards as if they were chickens.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FOREST BIRD RANCHING</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This report has intentionally focused on intensive farming - the type where people bring feed to animals in captivity. However, where this normal type of farming is of marginal value, `'ranching'' free-ranging birds may often be a more effective option. In this, the farmer simply monitors and improves the condition of the range and devises methods to harvest the birds on a sustainable basis. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Bird ranching" may today have outstanding merit, particularly in tropical rainforests. Hence, in this chapter we emphasize birds of the jungle. These might help make standing rainforests profitable producers of income, and thereby provide economic incentives to stop felling trees for cow pastures. Indeed, forest birds might become part of a whole new "salvation farming'' that makes forests more valuable than fields. It is a technique that may contribute to preserving both bird life and its vitally valuable habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MEGAPODES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Megapodes (family Megapodiidae) include some of the world's most interesting birds. They have temperature-sensitive beaks and employ nature's own heat sources as incubators. The best-known species build piles of leaves and use the heat of decomposition to incubate their eggs. The species of Papua New Guinea and Indonesia, however, take advantage of sun-warmed sand or even geothermal activity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People have long revered these birds. Aborigines in Australia, Melanesians in New Guinea, and many Micronesians all protect the bizarre nesting sites, and "farm" them for eggs. Local people consider the large eggs special delicacies, and sometimes the egg-laying sites are owned and exploited for generations without a single bird being killed for food.8</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Programs that provide sustainable supplies of eggs have been established in Papua New Guinea. One is near Mt. Tovarvar, a simmering volcano on the island of New Britain. Here, megapodes gather in large numbers to lay eggs in the hot sands. They dig until they locate sand that is exactly 32.7&Yacute;C, before laying their huge (more than 10 cm long and 6 cm wide) pink eggs. Each year the villagers dig up some 2O,OOO eggs, which are an important source of protein and cash income. The government now regulates the harvest in a way that protects the bird population while supplying a nourishing food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Megapodes are found in only a few parts of the world, but projects such as those in Papua New Guinea provide hope and guidance not only for the sustainable "ranching" of megapodes, but also for other species elsewhere. Many wild birds yield locally important products down, colored feathers, eggs, meat, and skins, and they make excellent songbirds and pets, for example. Their management on a sustainable basis may in certain cases be the key to turning local people into the most dedicated conservationists of all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PARTRIDGES AND FRANCOLINS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Partridges include many small game birds native to the Old World. They are robust, precocious, and larger than quails. Some lay many eggs - the European partridge, for example, lays up to 26 in a clutch. Newly hatched chicks are soon able to feed themselves and can fly within a few weeks, sometimes even within the first few days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Species that may make useful poultry include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The European (or gray) partridge (Perdix perdix); </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The rock partridge (Alectoris), bantamlike birds of Africa; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The chukar (A. graeca). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A native of the vast area from southeastern Europe to India and Manchuria, the chukar is stocked as a game bird in many countries. It is now produced routinely under poultrylike husbandry in many parts of the United States, not only for hunting clubs, but also for expensive food markets. The birds are generally raised on turkey rations and dress out at about 500 g after 18 weeks. They sell for more than broiler chickens and are a profitable sideline for increasing numbers of poultry farmers.9</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A group of closely related birds are the francolins (genus Francolinus), of which there are 34 species in Africa and 5 in West and South Asia. These adaptable birds are sturdy, live in a variety of habitats, and tend to be rather noisy. Basically, they are partridges with leg spurs. They are highly regarded as a food source and are hunted and trapped wherever they are found.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Francolins are much like quail, but are several times larger. Arabs introduced one of the most beautiful species (Francolinus francolinus) into southern Spain, Sicily, and Greece during the Middle Ages. However, it was hunted so heavily that it soon became extinct in Europe. More recently, francolins have been introduced to the Soviet Union.'&Yacute;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Francolins inhabit steppes, savannas, primeval forests, and mountains. They thrive in cultivated land with much cover. The clutch consists of 6-8 hard, thick-shelled eggs. In recent times at least one program to domesticate them for food has been started in Africa.11</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MALAYSIA'S MOBILE MOUSETRAP</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although the report emphasizes microlivestock as food suppliers, it should be realized that small animals - even wild ones - can have other important uses as welt The following interesting example, with possible worldwide implications, comes from recent experiences in Malaysia. *</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Certain rodents are major pests on farms and plantations. Now, however, Malaysian zoologists are finding that owls, particularly barn owls (Tyto alba), can help control them. An owl pair and its chicks annually consume 1,500 or more rodents. This is not new knowledge; indeed, on farms throughout the world the barn owl has always been a welcome guest. What is new is that Malaysians are showing how outstandingly effective this process is, and they have initiated major projects to attract and maintain these feathered friends. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Barn owls are found in many parts of the world, but were formerly almost unknown in Peninsular Malaysia. In 1969, however, a pair began nesting in an oil-palm plantation in Johore State. Since then, these birds have steadily increased in numbers and have spread throughout most of the peninsula. Today, the population is increasing remarkably quickly as more and more managers erect nest boxes for the owls to live in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The owls are proving to be a good way to remove rats and are notably effective in plantations of oil palm. They perch on fronds and fly under and between the rows of trees. A cost of $1 - $2 per hectare per year is all that is required to install nest boxes, a negligible outlay for the control of such a serious and expensive problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is believed that the barn owls hunt mainly in plantations and other agricultural areas and not in the rainforest. Barn owls are, after all primarily adapted to open spaces and not dense forest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perhaps this experience can be replicated and adopted in other locations and with other crops. Grain crops - notably rice - are particularly prone to the ravages of rodents, and one trial has commenced in Selangor State in a rice area. The concept of using owls for rodent control is also catching on in the United States. Indeed owl nest boxes are being erected in Central Park in the heart of New York City.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PHEASANTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">One pheasant, the red junglefowl, gave the world the chicken (see page 86). The other 48 species may have some potential, too. These are rarely seen forest birds; all but one are confined to Asia.13 Because they are prolific they can sustain heavy predation, and many species, notably the ring-necked pheasant (Phasianus colchicus), are constantly hunted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People in several countries have learned to exploit pheasants on farms and estates. As a result, there is a vast amount of information on how to rear and manage these birds. So far, however, it has been applied only to sport hunting in wealthy societies; the potential of raising pheasants for the mass market should now be seriously addressed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most dramatic-looking pheasant, the peacock (Pavo cristatus), is raised as a poultry species in Vietnam. The meat of the young birds is considered outstanding. In fine restaurants in New York, a peacock dinner is reputed to cost $150. Common peafowls are considered sacred in many parts of India, where they have become so tame that they are essentially domesticated. They also control snakes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">QUAIL</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic quail have been previously described (page 146)J but dozens of wild quail species and subspecies occupy many different habitats and ecological niches in almost all parts of the world. Out of all this genetic wealth only one species - the Japanese quail - is widely used. Yet many other species seem easy to raise, becoming exceedingly tame after about the sixth generation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The management and even perhaps intensive production of these various local quails might provide long-term benefits for many developing nations. Quail meat ranks among the finest.14 Some of these lesser-studied birds are more meaty than the Japanese quail or have other possibly useful traits. Much is known about rearing a few of them because they are used in sport hunting or laboratory research. The possibility of domestication, therefore, is not farfetched.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Particular quail that might be considered for domestication are the lesser-known subspecies of Coturnix coturnix. These subspecies are found in various places, including the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Europe (C. c. coturnix breeds in the area ranging from northern Russia to North Africa and from the British Isles to Siberia. In winter it migrates to tropical Africa, Asia, and southern India.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The Azores (C. c. conturbans) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The Azores, Madeira, and the Canary Islands (C. c. confisa) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Cape Verde Islands (C. c. inopinata) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- East Africa (C. c. erlangeri) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Tropical Africa, southern Africa, Madagascar, and Mauritius (C. c. africana) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Japan (C. c. japonica, the most probable ancestor of the domesticated quail)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- China (C. c. ussuriensis, a possible ancestor of the domesticated Japanese quail)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TINAMOUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Tinamous are quail-like birds of Central and South America's forests and grasslands. They are, however, much larger than quail and resemble small chickens, with plump bodies and no visible tail. There are more than 40 species, and all are much sought for food because their meat is tender and flavorful. The breast is surprisingly large, and its flesh is pale and translucent. One species, the great tinamou (Tinamus major), has been called "the most perfect of birds for culinary purposes." Frozen tinamous from Argentina were formerly sold in the United States under the name "South American quail."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tinamous are found mainly in tropical areas, but are also widely distributed in Argentina and Chile. They dwell in varied habitats: rainforests, thickets, bushlands, savannas, and grasslands up to 5,000 m altitude in the Andes. Some species sleep in trees, others on the ground. They spend their days creeping about in heavy cover, flying only when forced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At least some species tame readily. Indeed, during the nesting period males become so tractable that they can be picked up off the nest. At the turn of the century, many tinamous were raised as game birds in France, England, Germany, and Hungary. However, for reasons unknown, subsequent attempts to settle them in Europe have failed. Tinamous have been raised in Canada without undue difficulty; they showed little or no stress under captivity and there were few losses.15</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tinamous may also prove suitable for egg production. They lay clutches of 16-20 spectacular-looking shiny eggs that seem to be made of sky-blue and bright-green ceramic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SAND GROUSE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Sand grouse (mainly Pterocles species) are highly adapted to life in arid regions - desert, dry grasslands, arid savanna, and bushveld. Their entire body (including most of the bill and feet) is covered with dense down, which in the desert insulates them from the burning heat of midday and the freezing cold of night. It also protects the nostrils against blowing sand and dust.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These pigeonlike birds are found throughout the drier regions of Africa and Asia - for instance, the Sahara, Kalahari, Namib, Arabian, and Thar deserts. They live mainly on small seeds, and sometimes flocks of thousands may be seen at waterholes, flying in for a drink from up to 80 km away. For peoples of the driest spots on earth, these birds may make a useful food species: for one thing, they are not endangered. Indeed, they are proliferating as drought and overgrazing is increasing the amount of dry, desolate rangeland that they prefer. The bore holes provided for livestock have both boosted their populations and afforded a place where these wide-ranging birds can be easily captured. When nesting, sand grouse are highly vulnerable to foxes, jackals, mongooses, and other predators. Protection of the nesting sites may be the key to maintaining their populations if harvesting schemes are introduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TRUMPETERS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Trumpeters (Psophia species) might prove to be a useful species for sustainable production within tropical forests. As "tree poultry," these relatives of cranes could help provide meat without destroying the trees, as is now done to raise cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These chicken-sized birds inhabit South America's jungles.16 They are nonmigrating, ground-dwelling, and are often kept as pets, notably by Amerindians. Under human protection, trumpeters become very tame. They recognize strangers and challenge them with a loud cackle. 17 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fully adapted to the forest environment, they can run fast, but fly poorly. In the wild, this makes them easy targets for hunters. Because of this and the fact that they make excellent eating, they are approaching extinction in some areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No attempts have been made to rear these birds in numbers, but this should be tried. They feed mainly on plant materials, particularly berries of all kinds. They also relish grasshoppers, spiders, and centipedes, and are particularly fond of termites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trumpeters require trees; they completely avoid cultivated land. Thus, as the destruction of forests in South America continues, their habitat is shrinking. Although their existence is not as yet threatened, the long-term prognosis is bleak. If managed in "forest-ranching" programs, however, they might be saved from extinction and thriving populations built up. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interest in rabbits continues to increase. It is now widely recognized that the raising of small animals in developing countries has great potential as a means of improving human nutrition and economic security. The famines in Africa, Latin America, and Southeast Asia starkly illuminate the need for maximum efficiency in food production to maintain the quality of human life. Rabbit raising contributes to meeting these needs.</P>
+<P ALIGN="JUSTIFY">P.R. Cheeke, N.M. Patton, S.D. Lukefahr, and J.I. McNitt Rabbit Production </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbits are especially well adapted to backyard rearing systems in which capital and fodder resources are usually limiting factors in animal production. When rabbits are reared according to the techniques appropriate to the environment they can do much to improve the family diet of many of the most needy rural families, while at the same time supplying them with a source of income. With more advanced technology rabbit production can also help to supply big city meat markets.</P>
+<P ALIGN="JUSTIFY">Food and Agriculture Organization The Rabbit: Husbandry, Health, and Production </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g017a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part III : Rabbits</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Contrary to popular opinion, the domestic rabbit is a substantial part of the world's meat supply. Annual production of rabbit meat is estimated to be one million metric tons, and the total number of rabbits is approximately 708 million.' However, rabbits are now intensively raised for food only in temperate, mostly industrialized, nations. France, Italy, and Spain, for example, have long consumed rabbit meat; West German production was 20,000 tons each year; Hungary raises rabbits in large numbers (two of its commercial rabbitries have more than 10,000 does each); and the United States raises almost 8.5 million rabbits each year for consumption in homes and restaurants.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most developing countries, on the other hand, rabbits are not well known - at least compared with other livestock. But they have great promise there, and in recent years there has been a dramatic increase in interest. For those developing countries where information is available, rabbit meat production almost doubled between 1966 and 1980. For instance, several African countries - among them Ghana, Kenya, Malawi, Mauritius, Mozambique, Nigeria, Sudan, Tanzania, Togo, and Zambia - now have national rabbit-raising programs. A number of Asian countries - such as the Philippines, Indonesia, India, and Vietnam - are also encouraging rabbit farming. And some Latin American countries - Mexico, Costa Rica, and El Salvador, for instance - are actively promoting rabbits for subsistence farmers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghana is also extensively promoting rabbit farming. Although able to produce all the cereals its population needs, it cannot produce enough meat to satisfy demand. In response, the government organized "Operation Feed Yourself." The National Rabbit Project was created </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hares</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The common hare (Lepus europus) has not been domesticated, but it is nevertheless a major cash crop of several countries. In Argentina, for example, there is a booming, million-dollar enterprise that exports hundreds of thousands of carcasses, mainly to Germany where they are sold as game meat. For Argentine campesinos, many of whom have few sources of livelihood, trapping hares provides a vital income. In New Zealand, too, hare has become an export item.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A closely related species (Lepus capensis) is native to Africa, and perhaps could be "ranched in the same fashion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rainforest Rabbit</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The forest rabbit, or tapeti (Sylvilagus brasiliensis), is commonly eaten in its native habitat, which extends from southern Mexico to southern Brazil. It occurs in various hot and humid areas of Central and South America and probably within the Amazon Basin itself. Thus, this creature seems a possible candidate for a "tropical rabbit" that can be raised under sweltering conditions, perhaps even in rainforest regions. Although it seems to be heat resistant, it has an especially fine fur.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is now known about the tapeti. It is rather secretive and its natural history and even its range are still uncertain. However, its populations appear stable and it is not threatened with extinction. It produces litters of 1 - 5 young after a 44-day gestation, and may bear 4 litters a year. This may seem a lot, but compared with other wild rabbits, the litter size is small and the gestation period long. under this program to provide farmers with breeding stock and practical information on rearing rabbits. (To qualify for the purchase of new breeding stock, would-be rabbit raisers are required to take an intensive three-day course in rabbit husbandry, which is provided at no charge.) With both official and popular support, the rabbit's potential for Ghana has been enhanced through media campaigns complete with radio jingles (examples: "Get the bunny money!" "Grow rabbits - grow children." "Get into the rabbit habit!"), television spots, and large posters. Already, rabbit breeding is included in school curricula and rabbit meat is available in school lunches.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other countries have mounted similar campaigns. In Mexico, for instance, teachers raise rabbits in rural schools as a way of training students; scores of government officials have taken to breeding rabbits in their homes; and several army units are raising rabbits as mess-hall substitutes for costly beef, pork, and chicken. In Nigeria, farmers can now acquire rabbits from 18 government rabbit-breeding centers, which distribute thousands of animals each year. In Costa Rica, the government has similarly established a series of breeding, distribution, and rabbit-farming training centers. And in El Salvador, the technology of rabbit production is being transferred to farmers via the army.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although rabbits are ideal microlivestock in a general sense, rabbit rearing has many problems and limitations. Poor management is a common difficulty. Unlike the traditional method of keeping scavenger animals, rabbits have to be contained and cannot be left to find their own food. Raising rabbits requires more skills, more time, and much more effort than raising barnyard chickens or other familiar scavengers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For all that, rabbits produce more food than scavenging animals; they are less likely to damage crops because they are kept confined; they live exclusively on forage, which tends to grow vigorously in tropical zones; and they generally produce a more valuable product. The rabbit's potential is far from exploited, and rabbit farming will have to increase enormously before its promise for the small farms of the world is realized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is, however, an increasing concern over a recent outbreak of an exceptionally virulent viral rabbit disease - hemorrhagic tracheopneumonis, which attacks the lungs and lung tissue, killing 48 hours after the onset of symptoms. The virus, which has ravaged the animals in parts of Asia and Europe, was identified in China five years ago in Angora rabbits imported from Germany. It spread to Korea in 1986, and in early 1988 moved through southern and eastern Europe and spread as far as Egypt. It has also been identified in Mexico. Vaccination may become a future prerequisite of rabbit rearing in many countries. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FAST FOOD</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The order Lagomorpha includes more than 60 small quickmaturing, and rapidly reproducing species. It seems illogical to think that only one is useful as microlivestock. In principle, any rabbit, hare, or pike could be raised in captivity. All are clean, fast growing and rapid breeding. They are opportunistic feeders and can digest fibrous vegetation. Their meat tastes better than chicken and does not carry the stigma of rodent. The animals are small inoffensive, efficient at foraging, and generally tolerant of difficult environments. In theory, at least, they could be raised on vegetation not used by people or by many domesticated livestock.</P>
+<P ALIGN="JUSTIFY">Species worthy of exploratory research include the following.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">14 Domestic Rabbit</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g018a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The domestic rabbit (Oryctolagus cuniculus)1 is suited to small-scale production and backyard farming. It is easily maintained, requires scant space, makes minimal demands on the family budget, and thrives on plant materials that are usually disdained by humans. It utilizes forage efficiently. even coarse vegetation that is high in fiber, and under ideal conditions it can grow so rapidly that its rate is only slightly lower than that of broiler chickens.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The rabbit's capacity for reproduction is legendary. In theory, a single male and four females can produce as many as 3,000 offspring a year, representing some 1,450 kg of meat - as much as an average sized cow.3 The meat is pink, delicately flavored, and is usually considered a premium product that provides variety in the diet. It has more protein and less fat and calories per gram than beef, pork, lamb, or chicken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some breeds are raised for their wool. The long-haired Angora, for instance, yields a luxury fiber that makes a soft, lustrous fabric. It sells at high prices and makes these animals very valuable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbit pelts also bring cash. They are used in fur coats and other luxury garments. In addition, rabbit feet and tails are used in good luck charms and many curios.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits are well known for their long ears, fluffy tails, and long hind legs. Many commercial breeds are white, although colored types are sometimes chosen because of special qualities in their meat or pelts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are many breeds and much genetic diversity within and between breeds. (Almost 160 varieties are recognized by the American Rabbit Breeders Association.) However, in both North America and Europe, the New Zealand White has traditionally displaced most other breeds for commercial meat production. This medium-weight breed bears large litters, is a good milk producer, and has good mothering ability. It reproduces best under intensive farming and, among purebreds, yields the most meat. A full-grown New Zealand White weighs 4-5 kg, giving about 2 kg of meat at 8-10 weeks of age. Large breeds include the Flemish Giant or the Checkered Giant, which weigh more than 6 kg at maturity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hybrids are rapidly replacing purebreds in Europe for commercial production. Specific crosses of breeds have been shown experimentally to be more productive overall compared with purebred New Zealand Whites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Different meat breeds are preferred in various countries. For example, in Ghana the most popular are Flemish Giants, New Zealand Whites, Yellow Silvers, and Checkered Giants; in Tanzania and Nigeria, New Zealand Whites and Dutch are preferred; in China, Chinchillas and Japanese Large Whites are the most widely consumed. Some smaller breeds - for instance, the Polish - are also valuable for husbandry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some Third World strains have already evolved. They show high tolerance to local conditions (for example, the Baladi - the main strain of the Sudan and the Near East - and the Criollo of Mexico). The Baladi has a small body and relatively low production, but it is hardy and tolerates harsh conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Specialized breeds have been developed for wool, fur, and laboratory research. The Angora wool breed has already been mentioned. The Rex breed produces a high-quality pelt used in furs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The wild ancestor of the domestic rabbit was originally restricted to Spain and Portugal. Today, its descendants are found worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Plentiful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domestic rabbits are best suited to temperate climates, but they do well in tropical and subtropical conditions if hutches are constructed and sited to take advantage of shade and cooling breezes. Ventilation is important (but care must be taken to avoid direct exposure to cold drafts). Prolonged exposure to temperatures higher than 30&Yacute;C reduces both fertility and growth. Apparently, all breeds tolerate heat equally well. However, heat is shed through the ears, and the longer the ear, the more heat a rabbit will tolerate. Lop-eared varieties withstand heat poorly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits eat fibrous vegetation. In addition to normal feces, they produce special droppings called cecotropes. Softer and smaller than the regular fecal pellets, they are excreted in clusters and are swallowed as soon as they are eliminated. Cecotropes are rich in bacterial protein, and this double digestion (coprophagy) enables the animals to utilize the fermentation products formed in the cecum. This process is rather like that of ruminants, and rabbits are sometimes called pseudoruminants.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeding begins at 4-6 months of age and may continue up to age 4, occasionally to age 6. Gestation takes 28-32 days. Females can conceive within 24 hours after giving birth and can produce a second litter merely 4 weeks later. With good feed and early rebreeding, 9 or more litters a year are possible. (Such a rate is only achievable under exceptional management, however.) Litter size depends on breed and body weight. Small breeds average 4 young per litter; large breeds 810. Births occur at any time of the year, but production slackens when the weather is exceptionally cold or hot, when feed is scarce, or when days are short. Extremes of heat or cold can also affect the survival of the young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbits raised under subsistence conditions are likely to produce 4 or 5 litters a year, with an average of 5-8 young per litter' depending on management and feed quality.5 Annual production of about 20 weaned offspring per female per year under tropical and subtropical conditions is common. The young remain in the nest until they are 2-3 weeks old. Their eyes open at approximately 10 days of age. About 4 months are required to produce a 2-kg market rabbit under subsistence conditions. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits that receive human handling are very gentle and can be trained to live inside people's houses and even use a "litter box."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits are multipurpose animals yielding the following products:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Meat. Delicious hot or cold, fancy or plain, it can be breaded and fried, broiled, baked, or barbecued.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Wool. The fineness of rabbit hair is an asset in the production of wool, which is the plucked or shaved hair of the long-haired Angora breed. It is usually mixed with fine Merino sheep wool to give more substance and to improve its wearing quality. An average Angora rabbit produces about 850 g of wool each year. (Some specimens produce as much as 1,000 g.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Fur. The fur is dense.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Leather or vellum. Rabbit hide has the tension and strength required for tiny drive-belts in tape recorders and other delicate machines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Fertilizer. Rabbit manure often contains high proportions of nitrogen, phosphorus, and potash, and it comes in convenient drypellet form.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Tourist charms. In many societies, rabbits are connected with good luck. Feet and tails are used for car decorations, key chains, charms, and mementos that appeal to tourists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbits are also used in biochemical and physiological research.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits can be housed in hutches ranging from sophisticated commercial cages to simple packing crates with a few ventilation holes and rough troughs for food and water. In all cases, watertight roofing is essential. A floor space of only 0.25 m&Yacute; is sufficient for one rabbit, but about 1 m&Yacute; is recommended for a female and her young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Starting small-scale rabbit production is generally inexpensive. An almost infinite variety of backyard feeding and drinking equipment can be made from various scrap items, such as old bottles. The main criteria are that cleaning should be easy and spillage minimized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In practice, diets can be based largely on herbage: grass, leaves, legumes, crop residues, and kitchen scraps. However, the diet must be wholesome, and caged rabbits fed on forage usually need some grain or agricultural by-products (rice bran, for instance) as a dietary supplement. Supplementation is particularly important for newborns and lactating females, whose diet must contain about 16 percent protein and at least 18 percent fiber. When "noncommercial" feeds are used, salt must be added to prevent salt deficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of higher protein content, legumes (for instance, alfalfa, cowpea, vetch, or pea) are better than grass. Alfalfa is particularly valuable, and in the Sudan and Mozambique it is already grown extensively for feeding rabbits. On diets consisting of alfalfa and rye grass, weaned New Zealand Whites have demonstrated growth rates of 38-39 g per day in animals weighing up to 2 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rabbits, as mentioned, can utilize almost any type of edible vegetation. Also, despite their diminutive size, they can collectively produce as much meat per unit of forage as large livestock, or even more (see page 183).6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is much genetic diversity. Differences in growth rate, fertility, maternal ability, milk production, disease resistance, heat resistance, and other features have been noted. This is useful, since a wide genetic base enhances the likelihood of success of selection programs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbits are easy to handle and can be raised under primitive conditions. They require little financial investment and their husbandry is easily accomplished in the home by women and children.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal's rapid reproduction is a big advantage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Tropical conditions produce special problems. There, rabbits must be protected from heat and rain. Stress brought on by high temperatures, high humidity, and wet conditions can lead to respiratory disorders and even sudden death.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most diseases are caused by poor management. Dirty or wet cages lead to diarrhea, sores, mites, and ringworm, all of which can cause serious losses. Enteritis (diarrhea) often kills 20 percent or more of all rabbits before they attain market age and weight. A major disease problem in most countries is coccidiosis, which is particularly harmful to young rabbits. Again, damp and unsanitary conditions increase the susceptibility; better management can control it. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some countries - notably Australia and New Zealand - escaping rabbits have become a serious menace and have destroyed crops and grazing lands. Because of this threat, it is illegal to import rabbits into some countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present, many people are unaccustomed to eating rabbit. Indeed, where commercial ventures have been established in areas with an otherwise plentiful meat supply, there have been financial failures. However, where rabbit meat is familiar, there is usually great demand for it. Also, in poorer areas where animal protein is in short supply, the tasty pink meat is widely appreciated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HOW RABBITS WERE DOMESTICATED</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">For 30 or 40 million years the wild species Oryctolagus Cuniculus lived only in the area that today is Spain. Caves there contain Stone Age drawings of it. Phoenician traders landing on the Iberian Peninsula in about 1100 B.C. found huge numbers of these wild rabbits. The little animals were unknown to them and they mistook them for the hyraxes they had seen in Africa. (Although small and rabbitlike, the hyrax is actually related to elephants.) Since the Semitic name for hyrax was shaphan ("one who hides"), the Phoenicians named the peninsula l-shepan-im, from which the Latin name Hispania developed. Thus, "Spain" actually means "island of hyraxes," even though these African animals have never occurred there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the rabbit's reproductive powers and adaptability it is surprising that it hadn't spread beyond Spain, but dense forests covered most of Europe after the last Ice Age. The rabbit, which is suited to open country, only spread rapidly after man had cleared most of the trees. Even then, the natural spread was slowed by the Pyrenees mountains blocking the way into the rest of Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ancient Romans became acquainted with rabbits after they invaded Spain, and they eagerly added wild rabbit meat to their banquets. The meat was so popular that around 1 A.D. Roman voyagers released a pair of rabbits onto the Balearic Islands. In time, these produced so many offspring that the islanders had to appeal to the Roman emperor for help. They even asked to be moved to another country if the emperor could not get rid of the plague of rabbits!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eventually, Romans in Italy, France, and other parts of the European mainland began raising rabbits for meat. They kept them in special cages called leporaria. Their rabbits were probably not truly domesticated; instead they were netted in the wild and caged for fattening before being prepared for the table. The Romans had little incentive to domesticate an animal that could be so easily captured.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tne rabbit was the last farm animal to be domesticated. It seems likely that this did not begin until the Christian era when monks in French monasteries began taming rabbits. In those days, rabbit embryos and newborn young were considered delicacies, called "laurices." In 600 A.D. the Pope declared that laurices were "not meatp," and permitted them to be eaten during fasts and in monasteries of strict discipline where meat was forbidden. Within a few years, the animal was domesticated, </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Government-sponsored rabbit-research stations and programs are found in France, Germany, Italy, Spain, the United States, and the United Kingdom.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rabbit husbandry is well known, but much basic research is needed; for example, specific nutrient requirements, breed comparisons, disease control, reproductive management, and efficient housing and equipment. There is a particular need to reduce the labor required for feeding, breeding, caging, and cleaning.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With the increasing number of rabbit programs in Africa, Asia, and Latin America, there is a need to share information and ideas among the various countries. The exchange of experiences with rabbit breeding, health and nutrition, and the practical experiences and field studies could be of great value.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Further research in rabbit nutrition is necessary to identify nutrient requirements more precisely. Moreover, links between nutrition and disease should be clarified.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Further research into the cause and prevention of enteritis is needed. (At present, this condition is prevented by maintaining a fiber level in the diet of at least 18 percent and keeping the energy level relatively low.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Legume shrubs could be an answer to the feed problems in the dry season. Deep-rooted shrubby legumes, such as gliricidia or leucaena, remain green well into the dry season and have high protein contents. Rabbits find the leaves of leucaena palatable (see companion report Leucaena: Promising Forage and Tree Crop for the Tropics. National Academy Press. Washington, D.C. 1984), and they are fairly resistant to mimosine (a sometimes toxic amino acid found in leucaena foliage). More research on this promising approach is needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted earlier (page 181), a killer virus has recently appeared. Studies into its epidemiology and control are most important. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Outsiders who hope to improve conditions in underdeveloped areas, sometimes . . . introduce new food avoidances to the communities they came to help [if outsiders] show repugnance toward consuming goats, . . . rats, . . . crows, insects, intestines and blood, then the people they are educating may likewise give up those . . . foods and lose valuable proteins.</P>
+<P ALIGN="JUSTIFY">Calvin W. Schwabe</P>
+<P ALIGN="JUSTIFY">Unmentionable Cuisine</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">You can count on the fingers of one hand the domestic animals that produce virtually all of mankind's meat and milk - a selection made more than 10,000 years ago by our Neolithic ancestors. Yet the earth teems with thousands of species of animals; why limit ourselves to cattle, pigs, goats, and sheep? Given the world's shortages of energy and water and arable land, why not try to domesticate wild animals? The effort would save many species from extinction, provide the world with more food, and introduce gentle farming to fragile environments.</P>
+<P ALIGN="JUSTIFY">N.D. Vietmeyer</P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY"><center><img src="g019a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part IV : Rodents</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rodents are the world's most widespread, adaptable, and prolific group of mammals. They reproduce well, grow fast, learn quickly, and adapt to a wide variety of local conditions. Many convert vegetation into meat efficiently, digesting some fiber, even though their stomach, like man's, is a simple one.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It seems probable, therefore, that some species would make suitable microlivestock - a notion supported by the previous domestication of the guinea pig, laboratory rat and mouse, gerbil, and hamster. Indeed, "ranching" rodents might be an effective way to increase food supplies in remote areas. It could also be a mechanism to ensure the survival of rare rodents whose natural habitats are being rapidly destroyed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RODENTS AS FOOD</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Rodents are already common foods in many countries and are valued items of commerce. It has been estimated that 42 of 383 cultures eat rodents.! But the fact that they are a major meat source is almost unrecognized. This is due in part to cultural misunderstanding. Rodents suitable for human food or other products do not live in filth, like common rats. They are clean and vegetarian. Like rabbits, they eat grass and grains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some regions of the world, cooked rodent meat is regarded as the epitome of dining. In many countries, local rodent species are the most eagerly sought meats. City markets in different parts of Latin America carry guinea pig, pace, capybara, and vizcacha. Markets in Asia may carry rice rats, cloud rats, and bandicoot rats. Those of rural Africa are filled with "bushmeats" - usually including grasscutters, giant rats, and several other rodent species. These are often preferred to the meat of domestic stock and fetch higher prices than beef. And the amounts of rodent bushmeat available are not minor. In one year, for example, hunters in Botswana have brought to market 3.3 million kg of meat of the rodent called springhare (see page 278).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fondness for rodent meat is not restricted to the tropics. In the United States, squirrel was once a much sought treat. Fat, nut-fed grey squirrels went into Brunswick stew, which has been called the most famous dish to emerge from the campfires and cabins of Colonial America. Thomas Jefferson liked it. Today, squirrel is the country's number two game animal (after deer), and many are still eaten.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ancient Romans kept fat dormice in captivity, serving them as a delicacy. "The fat dormice are fattened up in barrel-like pots like those in country houses," wrote Varro (116-27 BC). "One feeds these animals large amounts of acorns, chestnuts, or other nuts."2 This small rodent remains a prized food in Europe and still appears on tables in certain areas. The meat is regarded as a delicacy because it tastes of almonds and other nuts. Often it is roasted, broiled, and cooked with its cracklings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rodents have seldom been included in livestock programs or economic development plans. Yet human appetite has actually caused the extinction of a number of species. Caribbean Indians ate several endemic rodents (one of which was as big as a bear), and may have caused several species to become extinct just before the time of Columbus. Others may soon follow the same dismal route, including the beautiful cloud rat of the Philippines, the hare-like mare of Argentina, the vizcacha of southern South America, and the gentle hutias of the Caribbean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guinea pig is described in a later chapter, but as it is the epitome of a rodent microlivestock species, some historical background is given here. It was domesticated for food use at least 7,000 years ago, probably in what is now the central highlands of Peru and Bolivia. With only llama and deer available, the prehistoric Andean peoples had few readily available sources of meat. They adopted wild cavies, and found that these rangeland rodents (which are more closely related to porcupines than to rats or mice) were gentle, manageable, and easy to rear. By the time the Spaniards arrived in the 1500s, the "cuy"  (pronounced "coo-ee," like the faint cry it makes) was a major food from  Argentina to the Caribbean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This impressed the conquistadores, who introduced cuys into Europe,  where they also became a delicacy.3 Within a century, these easily  transported animals began to appear on tables in many parts of the  Spanish empire. Guinea pigs are now reared in campesino huts in the  mountains of central Mexico, in the Philippines, and in several African  nations, along with other areas of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Elsewhere, guinea pigs came to be used only as house pets and  laboratory animals. Although during World War II Mussolini's  government urged Italians to keep them to supplement their meager  meat rations, their use as food was largely ignored in most parts of the  world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DOMESTICATION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The idea of domesticating rodents may seem radical, but  domestication projects are already under way with capybara in  Venezuela (see page 206), pace in Panama (see next page and page  262), giant rat in Nigeria (see page 224), and the grasscutter in Ghana  (see page 232). Rodent husbandry is not complicated and the animals'  environmental requirements seem relatively simple and easy to satisfy.  Moreover, rodents are not usually fastidious feeders, and being  essentially vegetarian will readily accept a wide variety of commonly  available foodstuffs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As with most animals with which man is in close contact, rodents can  transmit human diseases.4 With care, however, managed rodents need  not be any more dangerous to care for or to eat than pigs or  horses - both of which are worldwide food resources.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DOMESTICATING RODENTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">To domesticate the pace (see page 262) would seem to be impossible. These large rodents of Central and South America are nocturnal and fiercely territorial; they have low fecundity and take 10 months to reach weaning, and they have tender skin that is easily damaged Most researchers have written them off as candidates for domestication. But at least two have undertaken to beat the odds. We present the findings of one of them here to show that, using modem techniques, even species that normally fight each other to the death on sight are potential farm animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Through years of studying paces in Panama, Smithsonian biologist Nicholas Smythe has found that with care and planning the aggressive behavior can be so radically altered that the animals become calm. Indeed, some become almost loving. Newborns, Smythe found, undergo "imprinting" and when he places them with docile adults or with humans, the fierce territoriality never develops. He nurses newborns on "surrogate" mothers that have been imprinted on people. The youngsters then welcome human company and, if fumed out of the cage, return there voluntarily. "It's difficult to imagine a more manageable animal," Smythe said. "Technically speaking they are behaviorally indistinguishable from traditional domestic animals."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As of this writing, Smythe has three generations totalling about 50 individuals, and has several "families" of gentle paces living together in harmony. He has observed that they lose their nocturnal habit and, although they live mainly on fruits in the wild, they readily eat leafy vegetables and other foods in captivity. His captive specimens have recently begun to breed. The offspring remain docile, but they have so far averaged only a little more than two young per female per year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"If we can just double the reproduction rate, then raising paces can compete economically with raising cattle," Smythe explained. "The potential for a bigger brood is all in the animal's anatomy, and if successful, paces in the wet tropics could produce as much protein as cattle."*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacas need the shade and protection of the forest. Thus, pace raising might provide an alternative to cutting down rainforests for cattle raising. Instead of toppling trees and planting pastures, people could farm paces in the forest, and perhaps make as much or more money at the same time. In tropical America, the ready acceptance of pace meat is a near guarantee that all they produce will be snapped up at premium prices. In the past, many territorial and aggressive species have been dismissed as being impossible to domesticate or manage. But Smythe has demonstrated that with imprinting and other methods of behavior modification, these need be dismissed no longer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indeed, the pace may already be becoming a new domesticated species. In the first stage of his experiments, Smythe had to train his captive-born paces to be social and nonaggressive. Subsequent generations, however, need no training adopt the new behavior patterns of the parents, and do not revert to aggressive asocial behavior. By the third generation, they have become as accepting of, and indifferent to, people as cattle or sheep. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">15 Agouti</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g020a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among the best known of all animals of the American tropics, agoutis (Dasyprocta species)' are prolific rabbit- or hare-sized rodents that are probably easily farmed. They are valued for food and are hunted throughout most of their range. Indeed, agouti meat, once common in Latin markets. is now difficult to find because of indiscriminate killing. Agouti hunting is already prohibited in Brazil; restaurants in Belem, for example, once offered a variety of "cotta" (agouti) dishes at prices equivalent to those of choice filet mignon, but since the early 1970s they have been banned from serving it. Other countries will probably have to institute similar bans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agoutis are active, long-legged, and high-strung. They flee in panic at the slightest alarm. They do not climb but they do burrow occasionally, being essentially specialized ground-dwellers that live in tropical forest regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There have been no organized scientific attempts to raise these swift, shy animals in captivity, but Latin Americans sometimes keep them as "domestics," especially in parks and large gardens. (Agoutis are well known, for instance at the Goeldi Museum in Belem, Brazil.) These animals seem to tame easily, and could perhaps be mass produced on a large scale like rabbits or guinea pigs. They make affectionate pets, sometimes refusing to return to the wild. A research project on captive breeding of two local agouti species (Dasyprocta mexicana and D. punctata) for food is already under way in Tuxtla Gutierrez, Mexico.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most of lowland, tropical Latin America and the Caribbean. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agoutis are delicately built, graceful, nimble, and beautifully proportioned. They have slender bodies, short ears, and look somewhat like a rabbit that has been "jacked up" in back. Generally, adults are 40-60 cm long and weigh 2-5 kg. Some are even bigger.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They run well and are good jumpers. From a standing start an agouti reportedly can leap as high as 2 m or as far as 6 m; however, as long as they are well fed, there is little problem keeping them behind a wall only 1 m high.2 Reportedly, they sometimes climb easy-sloping trees to collect green fruits, but researchers studying Central American agoutis report that they are strictly terrestrial.3 They swim well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The body hair is thick, coarse, and glossy: pale orange to black on the back, and white to yellow on the belly. Some species have faint stripes, and some have a rump that contrasts with the rest of the back. The short tail is partially concealed under the long body hair.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agoutis occur over a vast area from southern Mexico to Paraguay, including many islands in the Caribbean.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Because they occasionally damage sugarcane plantings and because the meat is particularly tasty, people hunt agoutis relentlessly, especially near cities and towns. Now, in the l990s, they are becoming rare because of excessive hunting and habitat destruction. Many Latin Americans have never heard of them. In Mexico, for instance, there are few places where agoutis survive, and Dasyprocta mexicana may become extinct if habitat destruction and overhunting continue in its restricted range. In Costa Rica and Panama, agoutis occur only where there is little or no hunting or human interference.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">From sea level to elevations of at least 2,500 m, the adaptable agouti lives in many habitats: moist lowland forests, dry upland forests, thick brush, and savannas. However, although they thrive in secondary growth areas, they are mainly forest dwellers. Nonetheless, they often enter fields to forage, and young animals occasionally are seen in open areas such as grassy stream banks and cultivated fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agoutis shelter in hollows among boulders, in riverbanks, or under tree roots. They also hide in heavy brush and sometimes in holes dug out by other species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These herbivores eat seeds, fruit, stalks, leaves, roots, and other succulent plant parts, as well as occasional insects and fungi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They seem to mate twice each year. The estrous cycle is variable, but is only about 34 days long. The young are born after a gestation period of 3.5-4 months. Usually, there are twins; however, single births and triplets have been recorded. Newborns are fully developed and are able to run around within hours. They start feeding on solids within a few days. Puberty occurs at about 9 months of age. Life expectancy is 10 years or more.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the wild, agoutis are shy and retiring. Every sense seems constantly triggered for instantaneous action and sometimes they become hysterical. If danger threatens, they usually "freeze," but when discovered they stamp their feet as an alarm signal and dash away, nimbly dodging obstacles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite excessive timidity, they can be violent among themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In undisturbed forests, agoutis are diurnal and are often seen. But around villages they become nocturnal, as a means of self-preservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the most part, these rodents live in loosely formed pairs, with previous litters living around their territory as "satellites." There is some "bigamy," some "philandering," and some "divorce."5.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite their long claws, they display much finger dexterity. To eat, they usually sit erect, crouching on their haunches and holding the food in their forepaws. If it has a skin' they carefully peel it before starting their meal. They save some nonperishable foods (nuts, for instance) by digging holes in scattered locations, dropping each one in a separate location, stamping it down, and covering it over. This behavior helps disperse the seeds of many species of trees so that agoutis benefit tropical forests and reforestation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p203a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, agoutis are popular game animals. They are often hunted with dogs that even follow them into the burrows. Agouti meat is tasty, although it is usually said to fall short of the meat of the pace (see page 262) because it is leaner and gamier.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agoutis adapt well to captivity. With appropriate care they can be bred without difficulty.6 The nervousness that is pronounced in nature is quickly lost in captivity. The young become tame pets. They can be fed on foods such as leafy vegetables, fruit, potatoes, and bread scraps. Although many wild specimens have become nocturnal, captives readily readapt to daylight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Being entirely terrestrial, agoutis require no trees, but they do need space. Given enough area, they get on well (with each other and with different species), and they breed freely. To avoid fighting, it seems necessary to separate females from males at puberty. Probably removing progeny from breeding pens at weaning could also help avoid most of the interpersonal aggression. In large areas with plenty of cover (banana plants, for instance), groups can be kept, but breeding may be disappointing. Husbandry may be most appropriate in large enclosures (50-100 agoutis) with some animals then removed to small cages 0.5-1 m&Yacute; for selective feeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACOUCHIES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Close relatives, the green and red acouchies (Myoprocta acouchy and Myoprocta exilis) also deserve study. These are smaller animals with longer tails, bearing a little plume of white hairs. Although even more delicate and hypersensitive than agoutis, they can be kept in captivity and breed well. They then become less nervous and are easily handled. Acouchies. show remarkable intelligence and even some affection for those they trust. They frequent rainforests, but are rare or even absent in disturbed areas. Adults weigh up to 1.5 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The general biology (diet, reproduction, activity rhythm), is almost the same as that of the agouti, but they live in smaller home ranges (0.6-1.2 hectares versus 2.5 hectares for the agouti) and travel singly, although belonging to a well-established family unit. Adult males tolerate the juvenile males. They occur only in Colombia, the Guianas, Ecuador, Peru, and Brazil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Farming methods would probably be the same as for the agoutis, but acouchies always need plant cover.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agoutis are appropriately sized: a dressed carcass can weigh 1-3 kg. The meat is good, and large commercial undertakings in urban centers could profit from the ready market that already exists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are prolific: females can produce up to two litters a year, each litter averaging two offspring. In protected areas, populations may grow fast.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These forest dwellers might provide a source of meat and income without destroying the forests in favor of cattle pastures. Also, they thrive in disturbed areas as long as there is some cover. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Experiments in Brazil show that agoutis are highly susceptible to foot-and-mouth disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals might become pests: they eat the roots, leaves, and fruit of agricultural crops and occasionally damage sugarcane and banana plants. However, current experience suggests that if they escape captivity they are quickly caught by hunters and do not reach pest levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Live agoutis have strong-smelling anal glands that may be offensive to breeders or could contaminate the meat if the animals are carelessly handled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where the rainforest is destroyed, the agouti population is destroyed. The animals were once well known throughout Latin America, but not anymore. In some areas, therefore, wild breeding stock may not be locally available. Moreover, people may have become sufficiently unfamiliar with them that their value may no longer be appreciated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In captivity, they can be the prey of large birds such as eagles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The taxonomy of agouti species needs clarification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Husbandry experiments are required, including studies on topics such as:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Nutrition;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Growth rate;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Shelters and enclosures;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Reproduction; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Techniques for catching, moving, marketing, and managing the animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One area where agoutis might profitably be raised is in enclosures in palm plantations. Palms such as the babassu provide food, shade, and shelter, while fallen and rotten logs offer secure retreats from predators. This deserves investigation.8</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Instead of clearing vast areas of rainforest for cattle pasture, as is being done in much of Latin America, people might well "farm" agouties in the forests. Few of the settlers flooding into such regions can afford, let alone raise, beef. Small-scale agouti farming offers a promising and inexpensive alternative that would be gentle on the fragile land. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">16 Capybara</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g021a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The capybara (Hydrochoerus hydrochaeris), the world's largest rodent, can be as big as a sheep and weigh as much as a small person. Its natural habitat is the environs of South America's rivers, marshlands, and swamps, where it feeds on the grasses and reeds that grow near water.1</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its size, tasty meat, valuable leather, and rapid reproduction, the capybara is a candidate for both ranching and intensive husbandry throughout the hot and humid lowland tropical regions of Latin America. It seems easy to handle. It is commonly raised in zoos or occasionally as a pet, and has, in at least one instance, been proven successful in large commercial herds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In floodplain ecosystems, capybaras complement cattle because they prefer to graze swamp grasses rather than the dryland grasses on which cattle feed. They have simple stomachs, but are one of the more efficient herbivores. Although they are "selective feeders" that eat lush waterside grasses "preserved in quality" by the water, they also graze pasture, usually selecting new growth that is often too short and scattered for cattle, with their large muzzles, to eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The floodplains of the South American subtropics and tropics where the animal is indigenous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although they have blunt, horselike heads, capybaras look like gigantic guinea pigs. They are ponderous, barrel shaped, and have a tail too small to be seen from a distance. Their skin is tough and covered by sparse, bristlelike hairs: the color above is reddish brown to gray; beneath, it is yellowish brown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The front legs are shorter than the back. Slightly webbed toes - four on the front feet and three on the back - make them good swimmers. They dive with ease and can stay underwater for up to five minutes. They also move nimbly on land.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The capybara is extremely large for a rodent. In size and color, it looks much like a pig. Often more than 100 cm long and 50 cm high at the shoulder, it can exceed 50 kg liveweight. Indeed, specimens weighing up to 90 kg have been reported.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Before livestock were introduced, the capybara grazed widely over riverine regions throughout South and Central America. Today, it is found in the flooded grasslands from Panama to Paraguay. Mainly, it occurs in the watersheds of the Orinoco, Amazon, Paraguay, and Parana rivers. High population densities exist in the Pantanal of western Brazil and on the Llanos floodplains of Venezuela and Colombia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">There are few precise population counts, but capybaras can occur in large numbers.2 However, in many areas they appear to be on the verge of extinction, being deliberately eradicated by farmers who think they compete with cattle and transmit diseases. Also, in some areas illegal hunting goes on year-round and great numbers are killed. The animals are particularly vulnerable during the dry season, when they concentrate around the diminished river channels and water holes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, most capybaras live in swampy or grassy areas bordering rivers. However, some are found in other habitats, ranging from open plains to tropical rainforests. But even here they stay near ponds, lakes, streams, and swamps, and never venture much more than 500 m from water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p210a.png"></center><br>
+ The capybaras native range</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The capybara, like all rodents, is a simple-stomached animal, but it is a true herbivore. Its digestive system is especially adapted for fibrous materials. The large cecum - the site of enzymatic digestion serves a function like that of the rumen of sheep, cattle, and goats. It has a digestive capacity similar to that of a sheep's rumen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like rabbits and all the rodents, capybaras are coprophagous. That is, during the morning hours when they are resting, soft feces from the cecum are passed a second time through the digestive system.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contributing to the animal's digestive ability is its efficient mastication. It chews its forage seemingly incessantly, reducing it to extremely small particles before it is swallowed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under natural conditions, the females annually bear 1 or 2 litters, each averaging from 4 to 6 offspring. Birth weight is between 1 and 2 kg, depending on litter size and sex. Both males and females reach sexual maturity when they reach a liveweight of 30 kg or more usually between the first and second year of life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Capybaras are intelligent, shy, inoffensive, and harmless. In undisturbed ecosystems, they are gregarious and live in family groups of up to 30. The young follow the mother about for many months after birth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike most rodents, they do not construct dens, but the groups have specific resting areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are both diurnal and nocturnal and, like many herbivores, they graze at daybreak and dusk, and perhaps also at midnight. They spend the morning resting in weeds on riverbanks, and at noon they cool off by bathing for an hour or so before grazing. They may feed belly deep in water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capybaras wallow in mud, allowing it to dry on their skin before bathing again. Mange can develop in captivity when they cannot take a mud bath.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When startled, a capybara barks loudly and dashes away, but after running 200 m or so it tires, slows down, and may lapse into hyperthermia. At that point a hunter can easily catch it. However, if the animal reaches water, it usually eludes the pursuer because it swims so well - especially underwater.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Capybara meat is white and has qualities and properties (such as high emulsification) that might allow it to compete with pork and other meats in the food industry. Spanish-style sausages, Italian-style mortadellas, frankfurters, and German-style smoked chops have been produced experimentally.4 However, at present, the meat is mainly consumed only in the dried and salted form. It is particularly popular in Venezuela, where more than 400 tons are sold every year, especially during Easter festivities.5 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The capybara's hide is one of the best for glove making. This luxury product, known in international commerce as carpincho leather, fetches high prices on European markets because it is more heat resistant than most leathers and because it stretches in only one direction. This one way grain allows gloves to stretch sideways without lengthening and looking sloppy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The capybara appears suitable for raising as a livestock animal. Amerindians traditionally collected capybara orphans during the hunting season and raised them until needed for food. Capybara breeding was reported in Brazil as early as 1565.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Modern attempts have been made towards domestication. Researchers at the Institute of Animal Production in Venezuela, for instance, started a breeding program in the 1970s using 20 females and 5 males. Since that time they have continuously kept capybaras in confinement. Through selection and management, they have improved the reproduction of captive animals. The current aim is to get 16 offspring per mother per year. Newborns are weaned after 5 weeks and the mother is returned to the breeding pen.6 In Colombia, similar work is in progress, and guidelines for raising capybaras on breeding farms have been published.7 In Brazil, research has been carried out to study capybara nutrition, genetics, management, reproduction, and social behavior in total confinement.8</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Throughout South America, the price of beef has increased greatly within the last few years, thereby providing a new incentive for capybara husbandry. It has also forced many campesinos to eat more wildlife, which adds another incentive for producing capybara meat on farms and thereby perhaps helping to relieve pressure on the wild stocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When tame, the animals are amenable to handling without physical restraint. They are so tractable that in Surinam a blind man once used one as a guide animal. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capybaras can be raised on a variety of readily available vegetation: leaves, roots, fruits, and vegetables. They thrive in coarse grasses, if given opportunity to select nutritious parts. Their large incisors allow them to bite off short grasses that many herbivores cannot use. For instance, they eat "capybara grass" (Paspalum fasciculatum) that is abundant on river edges in Venezuela and is normally too short for cattle to graze. This makes for low-cost feeding and utilization of a resource that is otherwise unused.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capybaras are at home in hot, humid environments and are fully adapted to life on the tropical floodplains and seasonally flooded savannas. They thrive in extreme climates where cattle struggle, such as in the parts of the lower Paraguayan Chaco where summer temperatures reach 45&Yacute;C.9 An ecological benefit to raising capybaras is that there is no need to alter habitats by introducing exotic forage plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They reproduce quickly. Age at first conception for females is about 1.5 years, and the time between parturitions is generally shorter than that of goats or sheep in the tropics. Young capybaras grow so fast that in 18 months they can reach a liveweight of more than 40 kg. In their natural conditions, they are more disease resistant than cattle. The annual productivity is said to exceed that of cattle in many parts of its range.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This species is already so widely eaten in South America that the meat from farmed animals should be readily acceptable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Capybaras occasionally raid fields and can harm sugarcane, rice, bananas, sweet potatoes, cassava, corn, and other crops. In many parts of Brazil, they are considered agricultural pests and are shot.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Confining these animals in high density may create serious problems. Infectious diseases and parasite outbreaks seem to be worse than those that occur with conventional livestock. Aggression might prove a limitation to capybara husbandry: it is almost impossible to cage two adult males together or to introduce new animals to an existing group.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals may transmit disease to people and livestock. They can harbor foot-and-mouth disease and are known to be susceptible to brucellosis. They also carry a form of trypanosome, Trypanosoma evansi. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Compared with cattle, capybara use only a small proportion of the total plant biomass. They are largely selective feeders, and for satisfactory performance must have sufficient area to select the plants they need. If placed in a paddock of only coarse grass, most will eventually die. Like goats and gazelles, capybara probably select a diet that is at least 15 percent richer in crude protein than a typical cattle diet.'&Yacute;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">High mortality has never been observed in Venezuela, but keeping the animals alive on a farm in some areas may not be easy. In one trial, more than half (55 percent) of the capybara died of disease, and a few of septicemia (the result of wounds incurred during fights), but most apparently of trypanosomiasis. Other losses were caused by speeding vehicles (29 percent), poaching (6 percent), and predation, mainly by jaguars (12 percent)."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">It is important for researchers to undertake the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Gather specimens from different regions for comparative evaluation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Assess experiences of zoos and farms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Undertake nutritional trials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Initiate captive breeding trials - measurements of growth rates, space requirements, feed needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Characterize the animal's productivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Study the capybara's basic physiology and production potentials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Investigate biological factors, such as reproductive physiology, and social behavior (both in the wild and under controlled conditions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Determine the factors influencing capybara reproduction, growth, and development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Determine the animal's adaptability and economic merit in various farming systems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Study the influence of environment on reproduction rate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Determine their complementarily with water buffalo or other ruminants that normally use swampy habitats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Determine relative causes of mortality (such as diseases specific to capybaras) and predation (especially of the young) by spectacled caiman, crested caracayes, black vultures, and others. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">17 Coypu</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g022a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The coypu' (Myocastor coypus) is an aquatic rodent native to South America. It has been called the "South American beaver," but its size is actually closer to that of a small dog or an agouti. It seems suited to be a microlivestock species because, compared with most rodents' it has a large body size and a relatively high reproduction rate. Moreover, it is easy to manage, and there is much literature on how to raise it in captivity.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fur is the main item of commercial value. In the late 19th century, it was in such high demand that the animal was nearly exterminated. However, in 1922 Argentineans began raising coypu in captivity and this practice spread through South America and to other regions. In many European countries and in various locations in the United States some specimens escaped or were released, and coypu have become established in the waterways.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu meat is tasty and is consumed in many regions of South America as well as in parts of Europe. Because of the absence of musk glands, the meat is free of the "gamy" flavor found in squirrels and rabbits. It is moist, fine "rained, medium light in color, and firm. It is one of the mildest and tenderest of wild meats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This animal has been widely distributed, but its area of safest use is within its natural range in South America. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The coypu is adapted to a semiaquatic existence and has webbed feet, valvular nostrils that can be closed to keep water out, and underfur that remains dry even under water. Its long, powerful claws on the forefeet are used for grooming, excavating burrows, and digging up and holding food. The tail is slender; the extremely large incisor teeth are orange-red.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An adult is 40-65 cm long and weighs 7-10 kg. Some occasionally weigh up to 17 kg. Males are larger than females. The pelage is thick, with coarse guard hairs overlying the underfur. The soft dense underfur (the commercially valuable pelt called "nutria") is about 2 cm long on the belly, and 2-5 cm long and less dense on the back. The color is yellowish to reddish brown on the back and pale yellow on the belly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The coypu is distributed through southern Brazil, Paraguay, Uruguay, Bolivia, Argentina, and Chile. It has been widely introduced in North America, Europe, northern Asia, and eastern Africa. As a result of escapes and releases from fur farms, the animals are now feral in Europe, North America, northern Asia, Japan, and East Africa. In the United States, they are abundant in Louisiana, Oregon, Florida, and the Chesapeake Bay region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In various countries, the animal's status ranges from that of a rarity to that of a pest. Wild coypu are protected by law in Argentina because of overhunting, but there are about 100 producers of farmed coypu.3 Elsewhere the animals are destroyed en masse to reduce the threat of damage to irrigation ditches, dams, and agricultural crops. In England a decade-long program has eradicated them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Coypu mainly inhabit the banks of fresh or brackish waterways.4 They live in temperate zones and are highly sensitive to freezing conditions. Also, their heat tolerance is poor; lowland tropical regions may be too hot for them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p219a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The coypu feeds mainly at night. The diet consists chiefly of plants, particularly water plants and reeds. Large amounts of fibrous vegetation is decomposed in the cecum, where bacteria break down cellulose particles. Mussels, snails, and other small organisms are also often eaten.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals burrow into soft soil or construct nests out of vegetation above ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu are relatively fast breeding. Females first give birth at ages ranging from 6 to 15 months. From then on, they produce 2 or 3 litters a year. They are able to mate and give birth at any time of the year, although more young are born during certain seasons. The gestation period is between 128 and 140 days. There are 5 or 6 (sometimes up to 12) young in each litter. Newborns are well developed, able to see, and fully covered with hair at birth. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The female's four or five pairs of mammae are located on the side of the body, an adaptation that permits the young to nurse while floating with their mothers in the water. In captivity, young are nursed for two months, but can survive if weaned at five days. The mean body weight at birth is about 225 g, but growth is rapid during the first five months.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu have a potential life span of more than six years. However, they seldom survive more than three years, and in the wild probably no animals are older than five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These are passive creatures, usually entirely lacking in aggression. They are shy and fearful; the slightest disturbance will send them scurrying to the shelter of water, a burrow, or other hiding place. With their large incisors they can bite viciously, but in captivity they tame down, even to where they can be carried around by hand. Compared with domestic animals, they are very sanitary in their feeding and living habits.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In hot climates they are nocturnal, in cooler climates crepuscular, and in cold weather they become diurnal. Captive animals become conditioned to diurnal activity if fed during daylight hours. Most of the active period is spent feeding, grooming, and swimming. Grooming is done by scratching and "nibbling" the fur, and an oily secretion from glands located near the mouth and anus lubricates the pelage. Secretions from the anal glands are also employed for marking out territory.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Excellent swimmers, coypu spend most of their time in the water. They can remain submerged for five minutes or more. On land, they lumber about with awkward, clumsy movements; however, when the need arises they can run fast and jump short distances.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although they usually live together in pairs, coypu will form large colonies. They tend to remain in one area throughout their lives: their daily "cruising range" has been measured at less than 45 m.5 However, drought or freezing weather can induce mass migrations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The burrows, which are dug in sloping banks, are usually short with no branching tunnels and generally end in a simple chamber. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In South America, the coypu has a long history of use. Nutria fur was in such high demand and the animal was hunted so avidly at the beginning of the last century that it became rare and had to be protected by government decree. As a result, populations increased dramatically. Nowadays, coypu are protected in many areas, but widespread poaching has reduced their numbers and range.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many thousands are killed each year just for the guard hairs, which are used in making felt.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu are used in marsh management to reduce infestations of aquatic weeds and to keep waterways open.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In most areas where it is found, the coypu is trapped by commercial hunters. However, as noted, several countries have coypu farms. In Germany, the animals have been raised on diets consisting chiefly of potatoes supplemented with oats, clover, corn, hay, green forage, legumes, turnips, or cabbage. Elsewhere, feeds generally include such materials as hay, corn, crushed oats, greens, root vegetables, apples, bread, and rabbit feed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To confine coypu, a wall of stone or concrete or a fence of stout wire netting is necessary. It must be set 1 m deep into the ground and rise 1-1.5 m above ground. Water must be available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where selected strains of animals are kept, it is usual to house each female in separate small compartments, complete with pools and shelter boxes. Each is then paired with a male, which is removed after mating to leave the female to rear her brood in seclusion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The fur is particularly valuable because the female's nipples are so high that the soft belly fur is unbroken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This herbivore is much cheaper to feed than the furbearing carnivores such as mink. Furs of coypu raised in captivity fetch a price about three times greater than furs from wild animals.6 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wherever the coypu has escaped it has damaged embankments and stream banks. The burrows sometimes weaken dikes that protect low lying areas from flooding. In northern Europe and eastern England, for example, it is considered a serious pest. In rice paddies, coypu could become particularly devastating. They can also damage crops and natural plant communities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu can carry viruses that result in toxoplasmosis, papillomatosis, rabies, and equine encephalomyelitis; bacteria that cause salmonellosis, paratyphoid, and leptospirosis; protozoans that produce sarcosporidiosis and coccidiosis; and rickettsia. Common diseases of captive specimens are bacterial pneumonia, hepatitis-nephritis, Strongyloides infection, and neoplasms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">European winters often cause the coypu's tail (which is hairless) to freeze, but the animal hardly seems to notice. A more dangerous situation arises when lakes, streams, or rivers freeze over; beneath the ice, coypu cannot find their way as easily as beavers, and often drown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Little research needs to be done. There is massive literature on farming coypu. Nonetheless, the animal's behavior is little studied, and there are few reliable published observations on its social organization. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">18 Giant Rat</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The giant rat, also known as the pouched rat, is one of Africa's largest rodents.! Two species have been distinguished: Cricetomys gambianus, which lives chiefly in savannas and around the edges of forests and human settlements; and Cricetomys emini, which occurs mainly in rainforests. Both are highly prized as food </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals are solitary, but they are easy to handle, have a gentle nature, and make good pets. Researchers at the University of Ibadan in Nigeria have been developing techniques for managing them in captivity. Breeding stocks were established in 1973, and since then so many generations have been bred that this small population is considered domesticated. Commercial-scale giant rat farming is now being established in southern Nigeria.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This is a promising development because giant rats are a common "bushmeat" throughout much of Africa. Since these herbivores are well known there, and are acceptable as food, they may have as much or more potential as meat animals than the introduced rabbits that are getting considerable attention (see page 178).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The intertropical zone of Africa from the southern Sahara to the northern Transvaal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This species is among the most striking of all African rodents. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its large size, it often causes amazement - even alarm -  when seen for the first time. The body measures as much as 40 cm, and, on average, weighs about 1-1.5 kg. The record for a hand-reared specimen is 1.6 kg 2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Apart from its size, the best known species (Cricetomys gambianus) is noted for the dark hair around its eyes, a nose that is sharply divided into dark upper and pale lower regions, and a tail that has a dark (proximal) section and pale (distal) section. The overall body color is a dusky gray.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The lesser known species (Cricetomys emini) has short, thin, and relatively sleek fur. Its upper parts are pale brown; the belly is white.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Giant rats are commonly found from Senegal to Sudan, and as far south as the northern region of South Africa. The main species is mostly found in moist savannas, patches of forests, and rainforests. However, it can also be found in all West African vegetation zones from the semiarid Sahel to the coast. It also exists at high altitudes up to about 2,OOO m in West Africa and 3,000 m in eastern Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The rainforest species occurs in the great equatorial forest belts of Zaire and neighboring Central African countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals are probably not threatened with extinction. However, they have been exterminated in some areas (such as in parts of eastern Zaire) where the human population is dense, the land fully cultivated, and the wildlife overhunted. Although common, they are not as well known as one might suppose from their bulk and from the fact that they are sometimes found around, and even inside, houses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Giant rats occur largely in lightly wooded dryland regions or in forested humid regions. They cannot tolerate high temperatures or truly arid conditions. They often live in farm areas and in gardens. Their burrows are commonly found inside deserted termite mounds and at the base of trees. Some have also been found in the middle of cassava fields. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p227a.png"></center><br>
+ The giant rats distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These are herbivores with a tendency to omnivory. They prefer fruits, but also subsist on tubers, grains, vegetables, leaves, legume pods, and wastes (such as banana peels). However, they are not grasseaters. Giant rats also kill and eat mice, insects (caterpillars, cockroaches, and locusts, for example), and probably many other small animals.3 They are particularly fond of mollusks (such as snails).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Reproduction is prolific and year-round. The female attains puberty at 20-23 weeks and the gestation period is about 20-42 days. The young are weaned at 21-26 days of age but stay with their mother until 2-3 months of age. So far, the record for the most litters has been 5 in 9 months. It thus seems possible that a female can reproduce 6 times a year. Litter size ranges between I and 5, but 4 is most common. Thus, in 1 year a single female could produce 24 or more young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These strictly nocturnal animals usually lead solitary lives and forage alone. Mostly, they occupy a burrow by themselves, except when the </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">young are being raised. The burrows can be complex. Below the entrances are vertical shafts leading to a system of galleries and chambers for storing food, depositing droppings, sleeping, or breeding. The home range is individual and limited (1-6 hectares). In the wild, one male "supervises" the home ranges of several females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In captivity, the animals are often seen sitting up and ramming large amounts of food into their spacious cheek pouches. With full cheeks, they return to their burrows and disgorge the food into a "larder." Food (chiefly hard nuts) is stored there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They swim and climb well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A study carried out in Nigeria showed that the giant rat produces about the same amount of meat as the domestic rabbit.4 The meat's nutritional value compares favorably with that of domestic livestock, and African villagers know how to preserve it by smoking or by salting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The giant rat has recently attracted attention as a potential laboratory animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Farmers in Nigeria have traditionally trapped the juveniles and fattened them for slaughter. They usually keep the animals in wire cages and feed them daily with food gathered in the wild as well as with scraps from the household.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, the program at the University of Ibadan indicates that the giant rat can be domesticated. Already, specimens are being bred and reared in an intensive program. They adapt to captivity after about a month. They are subsequently transferred into breeding cages, which are wooden boxes with a rectangular wire-mesh "playroom." Each cage holds a breeding pair or a nursing female with its young. Experimental feeding cages have also been designed.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Food-preference trials show that palm fruits and root crops (especially sweet potato) are preferred to grains and vegetables. Nutritional studies show that the animals can tolerate up to 7 percent crude fiber in their rations. Although largely vegetarian, they eagerly consume dry and canned dog food. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals have several advantages:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· They are well known and much sought after for food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· They have adapted to life in lowland tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· They are able to live on locally available plant materials, including vegetable waste.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· They reproduce rapidly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· They are more tolerant of captivity than the grasscutter (see next chapter). This is largely because omnivorous feeding makes them easier to feed than the grasscutter and other strict herbivores.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This species could easily become a pest. It is recommended for rearing only in areas where it already exists. The crops it damages include cacao, root crops, peanuts, maize, sorghum, vegetables, and stored grains and foods. There is also the possibility that this rodent may transmit diseases to humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A project at the University of Kinshasa in Zaire reports problems in getting giant rats to reproduce in captivity. When two specimens were paired they sometimes fought so viciously that copulation was impossible.6 Special management may be required, such as housing animals in adjacent cages before actually introducing them to each other. Moreover, selection for docility may also be necessary.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The ratlike appearance is not attractive, and a few African tribes have taboos against consuming the meat of these animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Throughout Africa south of the Sahara, giant rat domestication deserves experimentation and trials. Success would open up the potential for supplemental meat supplies in rural and urban areas where meat is now scarce. Tests are needed to determine the factors that favor breeding: temperature, aeration, light, privacy, and size and form of cages. Moreover, diets that are cheap and easy to make from local feedstuffs must be identified. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Further research on the domestication of the giant rat might include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Identifying husbandry techniques that are applicable at low cost in rural areas;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Studying food digestibility and setting up various diets;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Illuminating social behavior: pairing of animals, the best moment for pairing, duration of pairing, age of partners;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Outlining the basics of husbandry (for instance, capital costs, food conversion ratios, growth rates) and making simple and cheap cages;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Studying biology (anatomy, physiology, birth records, growth rate); and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Testing the practical likelihood that this rodent may transmit diseases to people and other animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The giant rat has an interesting commensal relationship with Hemimerus, an insect that feeds on secretions in the skin. It seems to cause no irritation or damage, and may even benefit the host by helping to keep the skin clean. Caging these animals results in the general loss of the insect, but attempts should be made to maintain them and to determine their role and life cycle.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The potential of this species as a laboratory animal in nutritional, clinical, and pharmacological research also deserves exploration. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">19 Grasscutter</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g023a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The grasscutter (Thryonomys swinderianus and Thryonomys gregorianus) is found in many forests and savannas of Africa. Its meat, said to resemble suckling pig, often sells for more per kilogram than chicken, beef, pork, or lamb. It is the preferred, and perhaps most expensive meat in West Africa. Indeed. in Ivory</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coast it sells for about $9 per kg. With prices like that, grasscutter is a culinary luxury that only the wealthy can afford.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">If domestication of this wild species were successful in providing meat at a price similar to that of poultry (the second most popular meat), markets would be unlimited.2 However, as production costs are high, long-term research will be required before grasscutter production can be profitable to the small farmer. This research should now be undertaken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In an effort to capitalize on the markets for this delicacy, agricultural extension services of Cameroon, Ghana, Ivory Coast, Nigeria, Togo, and particularly Benin are already encouraging farmers to rear grasscutters as backyard livestock. They furnish breeding stock and information, and maintain central offices for records. In addition, a bilateral cooperation project in Benin has started experimental work on improved breeding methods combined with the study of animal responses under domestication.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In future, this vegetarian animal might become the African equivalent of South America's guinea pig, playing an important role in reducing Africa's chronic protein shortage. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Humid and subhumid Africa south of the Sahara.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Grasscutters are robust animals with short tails, small ears, and stocky bodies. Taxonomically, they are more closely related to porcupines than to common rats or mice.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although many varieties have been described, there are probably only two species. The larger (Thryonomys swinderianus) weighs 9 kg or more and has a head-and-body length of up to 60 cm. The smaller species (Thryonomys gregorianus) may occasionally reach 8 kg and a body length of 50 cm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Both species have yellow-brown to gray-brown bodies, with whitish bellies. The fur is extremely coarse, firm, and bristly - reflecting the animal's kinship to the porcupine. The tail is scaly and has short, sparse hairs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Both species have thick, heavy claws and enormous orange incisors that can chew through even the toughest vegetation. (Grasscutters have been known to tear holes in corrugated iron fences.) Nevertheless, they do not bite when handled, although their claws sometimes cause injuries.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Grasscutters occur in grassland or in wooded savanna throughout the humid and subhumid areas of Africa south of the Sahara. They often live in forest-savanna habitats where grass is present. They do not inhabit rainforest, dry scrub, or desert, but they have colonized the road borders in forest regions. Distribution is determined by availability of adequate or preferred grass species for food. Specifically, Thryonomys swinderianus occurs in virtually all countries of west, east, and southern Africa. Thryonomys gregorianus occurs in savannas in Cameroon, Central African Republic, Zaire, Sudan, Ethiopia, Kenya, Uganda, Tanzania, Malawi, Zambia, Zimbabwe, and Mozambique.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Despite heavy hunting, these animals are not threatened with extinction. Nonetheless, many individual populations are well below carrying capacity, or are extinct because of local overexploitation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The larger grasscutter (T. swinderianus) generally lives in swampy, low-lying areas, especially along river banks and the borders of lakes and streams. Occasionally, it is found on higher ground among bushes and rocks, living where savanna grasses are dense and tangled enough to afford good cover. In Ivory Coast and southern Guinea, for instance, grasscutters are found (and hunted) throughout the savanna zones. And they can occur in close proximity to farmlands and people (for example, in southwest Nigeria).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although the precise diet in the wild has not been determined, grasscutters are vegetarian. They consume nuts, bark, and the soft parts of grasses and shrubs. They particularly favor elephant grass and sweet potatoes. They commonly "raid" cassava and yam plantations, and are considered local pests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grasscutters reproduce year-round, although the births seem to peak at certain times of the year, correlated with weather conditions.5 Probably one male takes several females, and the family group possibly has more than one generation of young. The gestation is about 152 days. Apparently, litters normally contain between 2 and 4 young, but in Benin and Togo some litters of up to 11 or 12 are reported.6 Newborns are fully developed, their eyes are open, they weigh approximately 80 g, have thick fur, and quickly become accomplished runners.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p236a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although they commonly forage in groups, grasscutters are generally solitary. They are nocturnal, and they travel at night through trails in reeds and grass, often to water. Most specimens seen in markets are males, possibly because males lead the groups and are thus most prone to being trapped.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When alarmed, these animals stamp their hind feet and give a strange booming grunt. When fleeing, they can run very fast and, given a chance, will take to water. They swim with ease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For shelter, grasscutters usually weave nests of matted vegetation or scoop out shallow burrows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In a broad geographic band across sub-Saharan Africa, cattle raising is severely limited by trypanosomiasis. There, other sources of animal protein, including rodents, are traditionally used. Thus, grasscutter meat constitutes an important food for many Africans. The animals are mostly caught and eaten by families for their own use, but some are sold in markets and especially in roadside stalls. Many families depend exclusively on selling bushmeat, particularly that of grasscutters. In Accra, Ghana, during one year, 73 tons of grasscutter meat were sold in the local market. This represented more than 15,000 animals. In southern Africa, too, people find that these rodents make tasty food, although they may cut off the tail to make the carcass look less ratlike.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The meat is usually eaten smoked, and is so much in demand that grasscutters are hunted in organized drives with spears, dogs, and sometimes fire. It is considered excellent, especially when cooked in soups and stews or barbecued.7 It has been described as resembling venison in flavor, but it is dark like the meat of wild duck.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the savanna area of West Africa, people have traditionally captured wild grasscutters and raised them at home. As an extension of this, organized grasscutter husbandry has been initiated in West Africa. The animals are provided with marshy, tightly fenced areas with plenty of plant cover. The young are harvested from these areas and raised separately.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghanaian researcher Emanuel Asibey, a pioneer of this research, reports success at getting such captive stocks to reproduce. To this end, farmers are provided with breeding boxes and foundation grass cutter colonies. They are taught how to rear and feed the animals for home consumption or for cash income. Basically, the farmers make available large sheds where the animals can move freely. To prevent escape, the walls may be reinforced with cement plaster. The farmers also provide piles of grass, sugarcane, and other foods. A grasscutter reportedly takes about a month to adjust to such confinement. High mortality can occur in this period. The average weight of a mature, home-raised grasscutter is 4-7 kg. The average killing-out (dressed carcass) is 64 percent.8</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Wildlife Domestication Unit of Ibadan University in Nigeria, another pioneer of rodent domestication, has also reported the potential of domesticated grasscutter colonies.9</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research on grasscutter breeding, husbandry, and feeding is similarly being implemented by the Ministry for Rural Development in Benin and at the Lacena in Ivory Coast (see Research Contacts).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The demand for grasscutter meat is so large that it is not being met. Markets for it already exist over much of Africa,</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Grasscutters can devastate such crops as rice, sugarcane, soybeans, peanuts, yams, cassava, sweet potatoes, oil-palm seedlings, maize, young rubber, sorghum, and wheat. Therefore, as with most rodents, they should be reared only in areas where they already exist.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In past years, captive animals in Benin have suffered fatal Clostridium infections during September and October. In 1986, a broad-spectrum antibiotic was given with outstanding results. During this season, the animals also suffered from ascarid worms, which were also successfully treated with standard drugs.10</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Research is needed in the following areas:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Digestive physiology, feeding habits, feed preferences, feed conversion and growth rate; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Diseases (pathogens and parasites);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Captive breeding and management (growth rates, space requirements, feed needs, etc);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Performance under different environments;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Productivity; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Basic biology (for example, chromosome type, reproductive physiology, and social behavior both in its wild state and under controlled conditions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, specimens should be gathered from different regions for comparative evaluation. A particular need is to select and breed docile specimens because today, even after several generations in captivity, the animal must still be handled with caution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although domestication of the grasscutter is encouraged, wild populations might also be managed to maximize and sustain production through habitat manipulation. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">20 Guinea Pig</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g024a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea pigs (Cavia porcellus) are promising microlivestock because they require little capital or labor; provide an inexpensive, readily available, palatable meat; have no odor, and are suitable for keeping indoors. In the highlands of the Andes, many Indians raise them to supplement diets based on grains  and vegetables. Families eat them mostly on special occasions such as weddings and first communions, or they sell them to restaurants or peddle them in village markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The low cost of these small animals makes them available even to many landless peasants. For both the small farmer and apartment dweller, the guinea pig is a possible food reserve. It converts kitchen scraps and marginal wastelands into meat. According to estimates, 20 females and 2 males may produce enough meat year-round to provide an adequate meat diet for a family of 6.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since husbandry practices are simple and cheap, the guinea pig is an excellent source of supplementary income. An FAO study at Ibarra, Ecuador, showed that on small mountain farms the guinea pig provided more profit than either pigs or dairy cows, partly because its meat fetched high prices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although domesticated guinea pigs are mainly a food resource of Latin America, their use has also spread to parts of Africa and Asia. They are raised, for instance, in Nigeria, Cameroon, Ghana, Sierra Leone, Togo, and Zaire. In southern Nigeria, at least 10 percent of all households raise guinea pigs for food, with colonies of up to 30 animals per household. Guinea pigs are also raised in small cages or cardboard boxes by small farmers in the Philippines.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The feeding efficiency is high: studies have shown that it takes between 3.2 and 5.7 kg of forage to produce 1 kg of growth. This makes guinea pigs more efficient than most farm mammals. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea pigs seem especially adapted to the climate and forages of high-altitude zones, but the fact that they are being raised in Central and West Africa indicates that they are also adapted to the lowland tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p243a.png"></center><br>
+ The native distribution of the guinea pigs wild ancestor</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea pigs have stocky bodies, fairly short hind legs, and short, unfurred ears. Adults can weigh up to 2 kg, but an average-sized specimen is about 0.5 kg. They are 20-40 cm long (average 28 cm) and have no tail. In domesticated forms, the pelage may be smooth or coarse, short or long, and in some types the hairs form rosettes.4 Domesticated types come in colors ranging from white to dark brown, as well as piebald.5 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The original home of the wild guinea pig is believed to have been the central highlands of Peru and Bolivia. Its domesticated descendants are important as meat animals mainly in that same area, but, as noted, they are also important in certain African and Asian countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A few strains are distributed worldwide as laboratory animals and pets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Domesticated guinea pigs, as a whole, are in no danger of extinction, although some rare strains are threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These extremely adaptable animals are found in temperate zones and in the highland tropics, but they are usually kept indoors and protected from the extremes of weather. In Lambayeque and other departments of Peru, they are reared at elevations from sea level to more than 4,000 m. In areas where they are raised, daily temperatures fluctuate as much as 30&Yacute;C. In the Bolivian or Peruvian puna region, for instance, day temperatures can be 22&Yacute;C, while night temperatures are -7&Yacute;C. However, they cannot survive freezing temperatures and they may not perform well when exposed to the full tropical heat and sunlight. Many people of the Peruvian highlands keep the animals in darkness (for example, in wood boxes with little or no light).6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal's original wild habitat is believed to have been an area of grasslands, forest edges, swamps, and rocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These herbivores can be raised on kitchen scraps, garden wastes, and weedy vegetation plucked from backyards or roadsides. Andean peasants mainly feed them potato peels, scraps of cabbage, lettuce, carrot, wild grasses, corn stalks, and the foliage of miscellaneous wild plants. Some barley and alfalfa is grown specifically for guinea pigs; it is cut green and sold in small bundles in the markets. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea pigs mate throughout the year except when climate is excessively adverse. Domestic breeds average 2-3 young per litter, although larger litters sometimes occur. The gestation period is 65-70 days with an average of 67. Females come into estrus every 13-24 days, and there is a fertile postpartum estrus.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Females can become pregnant when merely 3 months old, and many produce 4 litters every year from then on. In principle, a farmer starting with 1 male and 10 females could see his herd grow to 3,000 animals in one year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Newborns are so large that the female's pubic bones must separate for the birth. They emerge fully developed, with fur and open eyes. They look like miniature adults, and they start eating grass and other feedstuffs within hours. (For this reason, babies orphaned at birth have been known to survive.) Weaning may be reached as early as 21 days of age.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The life span in captivity is as long as 8 years, but animals used for breeding usually live only 3.5 years. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SUPER GUINEA PIGS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Even in their native region, guinea pigs have traditionally received little research attention. However, that began changing in the 1970s with the onset of meat shortages in Peru. (For a time the government restricted beef sales to only 15 days a month.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For instance, in 1972 Peru began a guinea pig improvement project. Researchers from i a Molina National Agrarian University traveled throughout Peru gathering many kinds of guinea pigs short haired long haired black, white, yellow, brown, and even purple. Practically all the guinea pigs eaten in Peru are home grown, and researchers observed that the bigger ones were generally winding up in the stew, leaving the smaller ones for breeding. The people inadvertently were making the animals smaller. (This is a common phenomenon for many animals.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To overcome it, the university research workers compared the mature size and growth rates of all the different guinea pigs. They selected and cross-bred the biggest, meatiest, and fastest-growing ones. This program, later taken over by Instituto Nacional de Investigacion y Promocion Agropecuaria (INIPA), produced remarkable results. The starting animals averaged little more than 0.5 kg, the resulting ones averaged almost 2 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peru's "super guinea pigs" are now getting international recognition. They have been introduced into the highlands of Honduras, where the animal is also part of the Indian cuisine. The FAO has shipped some to the Dominican Republic. In addition, Bolivia, Ecuador, and Colombia have all begun their own guinea pig improvement programs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Within Peru the government has established 11 breeding stations to encourage the farming of guinea pigs for food. The goal is to provide better stud males to the people so that future animals will grow more quickly and reach a greater weight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea pigs generally congregate in small groups, normally made up of 5-10 adults. In favorable areas, however, such groups may coalesce into large colonies. The animals communicate incessantly among themselves, emitting a variety of squeaks and other noises.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males, although good-natured with other species, often fight fiercely among themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea pigs are raised mainly for meat. Peru has about 20 million, which annually provide 16-17,000 tons of meat (only 4,000 tons less than Peru's sheep meat production).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea pigs are used worldwide for studies on disease, nutrition, heredity, and toxicology, as well as for the development of serums and other biomedical research. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Guinea pigs require so little space that a small cage or pit can house up to 10 females and 1 male. They can be raised in cages with wire floors of small mesh as well. The labor required is low. A colony of 1,000 females reportedly can be properly cared for by one person. A layer of wood shavings, shredded paper, straw, and dried corncobs is usually recommended for bedding. The droppings are odorless, so the bedding does not need changing as often as with other animals. When the diet mainly consists of greens, much urine is produced, and then the beds have to be changed frequently.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When grown for meat, the young are weaned at 3-4 weeks and are ready for market in a matter of 10-13 weeks. Weight gain is rapid for the first 4-6 weeks, and then decreases. The carcasses normally dress out at about 65 percent, including the skin and legs. The meat's protein content is approximately 21 percent.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a few regions of Peru, guinea pigs are "herded" on the open range and retired at night into small adobe coops.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This small, inoffensive animal rarely bites, is easy to manage, and has no smell. It is an excellent supplemental meat supply. The improved breeds cannot climb or jump so that they are easy to contain. (Primitive "criollo" types, however, can jump.) If kept dry and given green vegetation, grain, and water, it survives in many environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A major constraint is consumer reluctance. Even in Latin America, attempts to promote guinea pig consumption outside the Indian communities have failed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When raised in a clean environment and under normal feeding conditions, guinea pigs thrive and reproduce and do not need routine vaccinations or antibiotics that cattle, sheep, and pigs often require. However, guinea pigs can be carriers of Chagas' disease and salmonella. Further, they are susceptible to pneumonia if temperatures change abruptly when conditions are wet. Coccidiosis and internal and external parasites are also common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Green forages and surplus fruits or by-products are critical to provide vitamin C, which the animal is unable to synthesize for itself. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Since the greatest concentration of guinea pigs is found in the Andes, particular efforts should be directed towards this region. Already, research on guinea pigs has begun in some universities and government research stations in Colombia, Ecuador, Venezuela, Peru, and Bolivia, but more work is needed on matters such as:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Breeding "elite" stock for distribution;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Feeding and nutritional-requirement trials, especially for creating alternate feeds that peasants and commercial producers can use during seasons when conventional feeds are hard to get;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Diseases and parasites that may limit production in small farming systems;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Management practices concerning reproduction, housing, herd size, and feeding; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The genetic basis for weight gain and productivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some research should be directed towards developing rations or introducing drought-resistant forages for the dry season because green forage is needed year-round. A range of practical and economical diets needs to be created.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal geneticists in Latin American countries should establish "elite" populations that can provide superior stock throughout the world. It can be anticipated that applying modern breeding methods to existing improved strains will result in great advances in a relatively short period and at little cost (see sidebar).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Three species of wild cavies (Cavia aperea, C. fulgida, and C. tschudii), close relatives of the guinea pig, are native to South America and are declining drastically. Research to preserve them is urgently needed. C. aperea is a widely used item of food in rural Brazil and other parts of South America. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">21 Hutia</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g025a.png"></center><br>
+ Hispaniolan Hutia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first meat Christopher Columbus tasted in the New World was probably hutia, a rodent avidly hunted by the Carib Indians. Hutia bones have been unearthed from kitchen middens of pre-Columbian inhabitants of all the Greater Antilles. Indians carried live hutias on voyages possibly in a semidomestic state as a source of food. On some islands, hutias were so eagerly sought that their populations were destroyed long before Europeans arrived. Slaves in the cane fields also hunted hutias for food. The surviving species later suffered when forests were cleared and cats, dogs, mongooses, and other predators were introduced. Consequently, the majority of hutia species died out, and today most surviving members of the family (Capromyidae) are facing extinction. Human predation continues in some areas (for instance, in Jamaica) where the tradition of "coneyhunting" still endures in a few regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hutias should be tested as possible microlivestock: success could create the incentive for their complete protection. The animals seem to take well to captivity. The Jamaican hutia is already overproducing in zoos, causing a local glut of animals. And hutias are, or were until recently, kept in barns by some people in Cuba, who fed them on banana and other vegetable waste and ate them regularly.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">POTENTIAL AREA OF USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Caribbean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hutias are broad-headed, short-legged, robust animals with small eyes and ears. The various species are from 20 to 60 cm long and weigh from 1 to 9 kg - a size range from that of a guinea pig to that of a small dog. They walk with a slow, waddling motion, but can hop quickly if frightened or pursued. They also climb well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 10 1iving species are all big enough to be candidates for microlivestock. The best known and easiest species to keep in captivity are the Cuban hutia (Capromys pilorides) and Jamaican hutia (Geocapromys brownii). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Cuban hutia (also called hutia conga) is about 60 cm long, with coarse fur, a raccoon-shaped body, and a thick tail covered with sparse bristles. A forest dweller, it weighs up to 7 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The short-tailed Jamaican hutia is smaller: it is 33-45 cm long and weighs up to 2.5 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p252a.png"></center><br>
+ The hutias native range .</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hutias are found only in the Caribbean (Greater Antilles and Bahamas). Most species are confined to a single island, where they represent the only remaining indigenous land mammals. The Cuban hutia is found only in Cuba. The Jamaican hutia is found only in Jamaica, although a close relative occurs on East Plana Cay, Bahamas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This once widely distributed and plentiful family is now failing. Of the 30 or so known recent taxa, more than half are already extinct, and the remainder all suffer from habitat alteration, predation by introduced animals, and hunting by man. With the exception of the Cuban hutia, all species are included on the list of the world's threatened mammals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hutia ranges have been so reduced that these animals survive only in the most inaccessible forests and rocky drylands. Both the Cuban and the Jamaican hutias occur in a variety of habitats from montane cloud forests to arid coastal semideserts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most species are terrestrial, but some live in trees. The Cuban and Jamaican species are terrestrial, but they can climb trees if circumstances demand. They maneuver well on trunks and larger branches, descending head first like squirrels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hutias are primarily vegetarian, their diets consisting of leaves, bark, fruits, and twigs, as well as incidental catches of small animals such as lizards and invertebrates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hutias seem to breed year-round, generally giving birth to litters of 1-4 offspring after a gestation period of 16-20 weeks. The young are well developed at birth, fully haired, open eyed, and capable of most adult movements. After 10 days they begin taking solid food, although they are not fully weaned for at least a month and a half (5 months for the Cuban hutia). Sexual maturity is at 10 months; life expectancy is 8-11 years in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Jamaican hutia has one of the highest diploid chromosome numbers (2n = 88) of any mammal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most hutias are wary and secretive and are easily displaced by human encroachment. They live like rabbits, hiding among tangled vegetation, in holes, and among rocks - communicating by voice and scent markings. They build shelters mainly in rock crevices, but also in the base of thick bushes or in natural cavities in trees. The Cuban hutia is often diurnal, whereas the Jamaican hutia is largely nocturnal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HISPANIOLAN HUTIA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Hispaniolan hutia, or zagouti (Plagiodontia aedium) as it is known in Haiti is smaller than the two Capromyids discussed here, weighing just 1.2 kg. It is difficult to breed in captivity and has a lower reproductive rate than either the Jamaican or Cuban hutia. It is therefore less suitable as an economic or food source.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, there is a significant need for supplemental protein sources in both Haiti and the Dominican Republic. It might be possible to develop a special captive-breeding program for this animal, but it should be done with great care. It is important that a hunting tradition for this animal not be reestablished in rural areas of Haiti or the Dominican Republic, and that local organizations not be misled into believing that there will be a rapid increase in the numbers of this species in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hutia meat is relished, especially in Jamaica. The animals are still hunted, often by using dogs that smell them out and retrieve them from a hole or hold them at bay in treetops.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Experiences of zoos suggest that the Cuban and Jamaican hutias will thrive in captivity. The animals are generally long-lived and have survived up to 17 years. They are often friendly with their keepers and, when tame, can be held and carried about without any particular danger. However, if angered they can inflict deep bites and should normally be handled with considerable caution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals are already much in demand. Their meat has an excellent flavor and they are big enough to provide a worthwhile quantity. If husbandry could be developed on a sustainable basis, it could be used as a mechanism for both economic development and for saving the remnant populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wild populations are threatened. Any captive population must be built up without endangering them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All hutias are susceptible to predation by domestic cats, mongooses, dogs, and human poachers, so care must be taken to design predator-proof breeding facilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals are carriers of eastern equine encephalomyelitis, a serious disease of horses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hutias deserve urgent conservation attention. In particular, the following steps should be taken:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Establish reserves in natural habitats containing breeding populations to ensure the survival of the genetic diversity of these animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Build up breeding populations in suitable zoos and livestock research centers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Gather specimens from different regions for comparative evaluation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Investigate hutia biology, including chromosome type, reproductive physiology, nutrition, and diseases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Assess experiences of zoos.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Perform captive breeding trials, measuring growth rates, space requirements, food needs, and social behavior (both in its wild state and under controlled conditions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Study the social organization and tameability.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Colonies of some species could be established on uninhabited islands, as has been done with the Bahamian hutia Geocapromys ingrahami. Even this rare species might eventually be raised to yield meat for local inhabitants, as it is well adapted to dry and barren environments and was a regular food of the pre-Columbian Indians. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">22 Mara</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g026a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many wild relatives of the guinea pig are native to South America. Some, such as the guinea pig itself, are small; others, such as the mare, are much bigger. Maras1 (Dolichotis patagonum) are as tall as terriers and, at first glance, look like dwarf antelopes or huge hares They have large ears and eyes, long legs, and short tails. They generally behave like hares or wild rabbits, but, like deer, they run with a stiff-legged gait when pursued by predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These strange-looking creatures are found in temperate regions in the southern half of South America. They are dry-country animals, living on the thorn-scrub, desert plains of Argentina and the stony wastes of Patagonia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although exceedingly shy, restless, and watchful, mares tame easily, make good pets, and are much favored by the local populace. They were introduced to France last century, and in Victorian times Europeans sometimes bred them. These big, handsome rodents, grazing in little herds, were considered an attractive addition to the lawns of country estates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">POTENTIAL AREA OF USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras are best kept in their native region of southern South America. With care, however, they could be used in other areas because they are slow breeders and their population growth is easy to control.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">At first sight, these large rodents look like some weird hybrid. They have the long ears of a hare and the tidy body and spindly legs of a small antelope. Although related to guinea pigs, they are long legged. The tail is short; the ears are long and erect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Average-size mares weigh about 8 kg, but large ones can be 1 m long and weigh up to 16 kg.2 Females are larger than males. The coat is light in color, with grey upper parts and whitish underparts. The limbs and feet are tinged a yellowish brown. The pelage is dense, with individual hairs standing at nearly right angles to the skin. This gives a harsh texture, even though the hairs are soft and fine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals can hop, walk, gallop, or run. They are extremely swift and can reach 45 km per hour over long distances. They are also accomplished jumpers, often leaping 2 m high from a standing start. The feet are compact and rather hooflike, but with sharp claws. The hind foot has three digits; the front foot has four.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The mare's range in the thorn-scrub desert and Patagonian steppe of Argentina extends from about 28&Yacute;S to 50&Yacute;S.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Endangered. These animals, once plentiful, are now threatened because of the introduction of the European hare, which is more successful at competing for food. In many of the eastern parts of its distribution (see map) it is now extinct.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras inhabit open, dry plains and other treeless semidesert areas of coarse grass or scattered shrubs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras are pure vegetarians. They feed on short grasses and herbs that are sparsely distributed between patches of dry desert scrub. Usually, they are satisfied with a few coarse weeds and the shoots of bushes. However, their overall diet consists of any available vegetation: leaves, roots, fruits, and stems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Female mares become sexually receptive within a few hours after giving birth. The estrous cycle is 35 days, plus or minus 5 days.3 The gestation period is 77 days. Each female gives birth to 1-3 young at the mouth of the den; the pups crawl inside to safety. Newborns are well developed, and within a few hours they begin grazing vegetation. They remain in the vicinity of the den for up to 4 months.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initially, at least, the young are nervous and easily frightened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras shelter in a burrow that they either construct for themselves or "borrow" from another animal that has abandoned it. They are active during the day and spend considerable time basking in the sun. They are always alert for danger. When alarmed, they flee at high speed. The white rump patch flashes a warning to the others, who then follow this "flag."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A fundamental element of their social system is the monogamous pair bond. Certainly in captivity, and probably in the wild as well, the bond between a pair lasts for life. When breeding, 20 or more pairs may band together temporarily to share a single den for the pups.4 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals stand on straight legs, sit on bent haunches with the forepart of the body resting on the fully extended front legs, or recline in a catlike position with the front legs folded under the chest, an unusual position for a rodent. They travel in single file, with the female usually leading. Members of a pair maintain contact by means of a low grumble. Although the long legs can quickly carry it to safety, a mare usually stops every 20-30 m and turns to peer at its pursuer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals clean themselves by licking their sides and apparently by "combing" their fur with their teeth. They wipe their faces as cats do, with the inside of a foreleg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p260a.png"></center><br>
+ The maras native range</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although the light-colored meat is said to be dry and flavorless, it is widely consumed in South America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras have been successfully raised and bred in many zoos, and, as noted, have been kept as pets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adults make little use of any shelter; they seem fond of being out and about in all weather. As long as they have a protected burrow for the use of the pups, mare populations can thrive in severe climates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In zoos, diets include straw, vegetables, and crushed oats. Drinking water is supplied, although the animals rarely take it if they are feeding on fresh plant materials. They like to have salt blocks, however.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In South America, one mare lived in captivity for almost 14 years; most specimens do not live beyond 10 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Maras are a good size for microlivestock. They have a short gestation period, and they are social and easy to maintain in groups. They can be successfully kept in pens and can be fed relatively low-quality forage. Colonies can grow to be quite large.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals can easily dig under the edges of cages and escape. Extra-deep foundations are needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following heavy rains, care must be taken to keep them from drowning in their subterranean burrows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If suddenly disturbed, mares can become hysterical, leaping away regardless of anything in the way, and often seriously injuring or even killing themselves as a result. They fear bodily contact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mare's monogamous nature in the wild is a likely limitation. But perhaps, like chinchillas, the animal will become polygamous in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are sensitive to tuberculosis when kept in humid conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Research needs to increase understanding of the mare include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Nutritional trials;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Husbandry experiments - measurements of growth rates, space requirements, feed needs;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Productivity tests;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Grazing-efficiency measurements;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Exploration of commercial details; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Determination of diseases and parasites. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">23 Paca</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pacas (Agouti paca)1,2 are large, white-spotted, almost tailless rodents with the potential to become a source of protein for the American tropics. They are found in lowlands from Mexico to northern Argentina. The meat is white and is considered the best of all Latin American game meat. It is common in local markets and restaurants. Tasting like a combination of pork and chicken, it sells at higher prices than beef and is a regular item of diet in some areas. In Costa Rica, pace is served on special occasions such as weddings or baptisms. It has a higher fat content than the lean meat of agoutis, rabbits, and chickens, and has no gamy taste.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paca has promise as a microlivestock. In several countries, Belize and Mexico for example, people already keep them in cages beside their homes and fatten them on kitchen scraps. In Costa Rica, some are bred on farms, under houses, and even in apartments. Research on raising paces in captivity is under way at the Universidad Nacional in Heredia, Costa Rica; at the Smithsonian Tropical Research Institute in Balboa, Panama (see page 196); and at the Instituto de Historia Natural in Tuxtla Gutierrez, Mexico. In Turrialba, Costa Rica, an entrepreneur is already breeding and raising pace commercially.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the pace has potential as a food source, many problems still must be resolved before it can be recommended for mass rearing. If solved, however, this species would become an attractive microlivestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The pace has potential for use throughout its vast geographical range in Latin America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In general appearance, paces are somewhat like giant guinea pigs. The legs are short, the forefeet have four "fingers," and the hindfeet have five small, hooflike "toes." The feet are partially webbed and are adapted both for digging and for swimming. Pacas burrow with all four feet as well as their teeth; even large roots are no obstacle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adults weigh 6-14 kg, males being somewhat larger than females. Although they may become bulbously fat, paces remain "one of the fastest things on four feet. " From a standing start, even a fat specimen can jump at least 1 m off the ground. Pacas are also agile. However, their skin's epidermal layer is thin and fragile, and large strips may be ripped off as they rush headlong through spiky undergrowth. However, such wounds heal astonishingly fast - frequently within days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacas are chocolate brown in colon The head is somewhat lighter in shade than the body, and the underparts are whitish or buff colored. There are usually four longitudinal rows of white spots that may merge into stripes along each side of the body. The fur is coarse, spiny, and slippery, and has no underwool. Each hair is stiff, relatively sharp, and very smooth, which makes paces extremely difficult for predators to hang on to.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parts of the cheekbones are enlarged, and the cheeks can open to form special pouches. This is more developed in adult males than in females - indeed, adults can be readily sexed by head shape. The pouches are outside of the mouth and are fully haired. The animals use them mainly to create a resonating chamber for their booming bark and noisy tooth grinding. These enlarged cheeks push the large bulging eyes toward the top of the skull. The eyes are suited for nocturnal conditions, the senses of smell and hearing are uncannily acute, and there is an array of long whiskers that is used when maneuvering at night.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Lowland paces are found throughout most of Latin America from east central Mexico to northern Paraguay, Argentina, and Minas Gerais, Brazil. This includes all of Central America and most of Colombia, Ecuador, Peru, Venezuela, and the Guianas. The animal has also been introduced into Cuba.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p265a.png"></center><br>
+ The pacas native range</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Burgeoning human populations are severely reducing many of Latin America's native animal resources, and the pace is one of the most persecuted. It has been exterminated within hunting range of virtually all cities, towns, and villages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several governments, recognizing the pace's plight, have passed laws prohibiting the hunting and marketing of its meat. Nevertheless, people continue to take it, usually at night, using trail dogs and headlights.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pacas thrive in a variety of tropical habitats but are most common in forests, swamps, and partly cleared grazing lands. They inhabit most types of forests from deciduous woodland to rainforest. Usually, they stay near streams or rivers, but they often live where there is no permanent water. They are abundant only in little-disturbed forest areas. Although preferring low, dense tree cover, paces sometimes inhabit open rocky areas and farmland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These herbivores feed mainly on fruits, young seedlings, and some seeds. However, when fruits are scarce they may switch to browsing leaves and roots. They probably sometimes eat large insects, and, on rare occasion, may perhaps eat small vertebrates. Captive paces, like many other "frugivores," seem to develop a protein deficiency and will eagerly eat meat scraps on occasion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The young are usually born singly after a gestation period of 146 days. There are probably 2 births a year. Females have an estrous period that begins shortly after giving birth. If mating does not take place at this time, the female becomes unreceptive until after the 3-month (sometimes 4- to 6-month) lactation is over. The length of the estrous cycle is 30 days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During daylight hours, paces seclude themselves in brushy cover, in or under fallen logs, or in extensive underground burrows. The burrows, which may be several meters long, are dug in moist soil or taken over from other animals; they are often in river banks, on slopes, among tree roots, or under rocks. Usually, several exits are provided, often being plugged with leaves as a disguise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the wild, paces dig large holes and rummage about the forest floor at night, gnawing on fruits. Pairs inhabit a defended area, sometimes living together in the same burrow, sometimes not. Also, they usually travel alone, following paths that lead to feeding grounds and water. Individual home ranges are small (1-3 hectares).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although paces are terrestrial, they enter water freely, they swim well, they copulate in water, and, when alarmed, they generally attempt to escape by swimming. They are also lively and playful; however, they can be exceedingly obstinate. Sometimes fighting among themselves becomes very savage. When angered they growl, sometimes noisily, and they can suddenly jump on aggressors, real or imagined, delivering frightful wounds with their chisel-like front teeth thrust forward like a spear. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, pace meat is tasty and brings high prices in the markets. It is considered a delicacy in fine restaurants and was served to Queen Elizabeth during her October 1985 visit to Belize. In Mexico, paces, like pigs, are usually boiled unskinned. Even the skin is then edible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">If treated appropriately when young, paces become manageable. They undergo "imprinting," a characteristic of most species that have been domesticated. An imprinted pace becomes so tame that it seeks out human company, follows people around like an amiable dog and, if turned out of its cage, returns voluntarily. (To achieve this degree of tameness it is necessary to remove the animal from its mother at an early age.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although wild paces are almost entirely nocturnal, tame paces are more active during daylight hours.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young or partly grown paces are commonly exhibited in zoos. They eat prodigious quantities of almost any vegetation and have been called, "a good substitute for a large garbage pail." Diets can include rolled oats, raw vegetables, bananas, apples, and bread. They probably need additional protein occasionally, and seem to appreciate some fat in their diet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">If husbandry can be developed, the clamor for pace meat throughout tropical America would be a big economic incentive for farming these animals. The excellence and wide acceptance of the meat is an indication that pace farming would be taken up both in rural and urban areas and by many levels of society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pacas can harbor human diseases, including leishmaniasis and Chagas' disease.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apart from the project in Panama (see page 194), paces have bred only sporadically in captivity, with few offspring surviving. However, successes have been recorded in zoos in London, San Diego, and Washington, D.C., and in a research project in Tuxtla Gutierrez, Mexico. In Costa Rica, they are also reportedly breeding well, with a survival rate of 90 percent since 1982, and 80 percent of the females are reproducing.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All adult paces can be aggressive and dangerous. Their powerful incisors can inflict serious wounds. (They can even rip through planks.) Intraspecific aggression is one of the most serious impediments to captive breeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike the capybara, the pace not only has a long gestation but usually bears a single young. Thus, the output of a single breeding female may be, at best, two offspring per year (at least this is the expected production in the wild). This "slow" breeding is a limitation. In captivity, however, there is a possibility that it can be speeded up.4 The fact that paces bond together in pairs is a limitation. If every female has to be accompanied by a male, then many (otherwise unnecessary) males have to be fed and maintained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Male paces are considered difficult to keep as household pets because they spray females (or human substitutes) with a mixture of urine and glandular secretions. This can occur several times a day. In addition, they have anal glands that produce a musky odor that some people find objectionable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Although paces are common in some areas over the vast region from Mexico to Argentina, they are little understood, even by zoologists. In fact, most data concerning this animal have come from interviews with local hunters. Intensive field work is needed to develop an understanding of the pace's biology, status, and habitat requirements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The popularity of pace meat makes it urgent to start this work as well as to begin breeding paces on an organized basis. Such projects would lay the groundwork for preserving the species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Particular research needs concern the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Age structure and reproductive performance;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Growth rates and feeding habits;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Behavioral patterns in captivity;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Nutritional requirements;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Meat quality;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Helminth and arthropod parasites;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Role in transmitting or perpetuating diseases;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Reproduction (such as external manifestations of estrus in females); and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Genetic variations that would allow the selection of animals adapted to captivity and females that produce multiple offspring - twins, triplets, or more.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Ways must be found to introduce more than one female to each male without inciting aggression. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">24 Vizcacha</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g027a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcachas (Lagostomus maximus) are soft-furred South American rodents that look like long-tailed guinea pigs. They can weigh as much as 8 kg and are resilient animals, inhabiting dry pampas and shrub lands in northern Argentina and neighboring countries. They seem to have promise for producing meat and hides in marginal zones whithin their native habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like chinchillas (page 277), these rodents provide a prized furry pelt. They also provide meat that reportedly tastes "as good as hare," which in Europe is considered the epitome of dining. They are easily trapped alive in cheap, homemade, multiple-catch, funnel traps. And they are thought to be suitable for farming on a large scale.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the other hand, vizcachas are currently considered pests because they take grazing from cattle and sheep and because they build large burrows that undermine the land. Government campaigns have eradicated them in the richer agricultural areas of Argentina, but the animals are still common in marginal zones. There is evidence that they become more abundant when domestic livestock overgraze the land. In improverished marginal sites, where other livestock enterprises are unsuitable, the potential exists for game-ranching vizcachas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Because of the potential hazard to new areas, vizcachas can be used only in the pampas regions of southern South America where they are already widespread.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas have short front legs, long, muscular hind legs, and round eyes and ears. Their heads seem oversized in proportion to their bodies. Males weigh 5-8 kg, females 2-4.5 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members of the same rodent subfamily as the chinchilla, they have a thick, soft, valuable fur that is grey or brown above, whitish or greyish below. They are, however, much larger than chinchillas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although basically running animals, vizcachas often jump bipedally (like kangaroos), and they sit erect while eating or grooming. The forefeet have four long flexible digits used to grasp food. Their soles and palms are naked and have fleshy pads (pallipes).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas once swarmed widely over the savannas of southern Paraguay, Bolivia, and Argentina, but they are being systematically exterminated. Today they inhabit isolated areas of north, central, and western Argentina and southern Paraguay.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Since 1907, these animals have been mercilessly hunted. The governments of the Argentine provinces where they are mostly found, reward hunters for killing this "pest." However, the numbers are so reduced that now there is no need for a bounty system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas live in flat, dry, steppelike plains; in dry woodland (Chaco), and in low mountains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The fact that these rodents eat their own droppings (coprophagy) augments their ability to utilize natural forages, and allows them to abound in degraded zones. They feed on any plant materials they can find near their colonies, particularly grasses. In feeding trials, their daily dry matter intake was 2-5 percent of the body weight. The metabolic efficiency (dry matter per kg) was 33-56 percent; the digestive efficiency was 50-60 percent.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Male vizcachas become sexually mature at about seven months of age and remain fertile throughout the year. The gestation period is long: 154 days. Litters contain one or two young. Newborns are well developed, fully furred, and open eyed, although they cannot fend for themselves for at least three weeks. In the wild, one or two litters are reared each year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas are nocturnal and are active year-round. They inhabit underground burrows, living in colonies often containing many individuals. They collect a variety of materials (for example, bones, sticks, and stones), and heap them in piles above the entrances to their burrows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Their hearing and sense of smell are acute. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p274a.png"></center><br>
+ Vizcachas native range</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas have long been hunted for food as well as for their fur. Their meat is often consumed in pickled form in southern South America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The skins are fabricated into table runners, rugs, bedspreads, slippers, and belts. The skins are also popular for overcoats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcachas can be kept in captivity without major difficulty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In zoos, vizcachas are fed the typical diets furnished for vegetarian rodents: rolled oats, green vegetables, bananas, apples, and bread. They are usually kept indoors in wire-fronted cages, about 1 x 2 m in size, and provided with sleeping boxes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known about vizcacha husbandry, but in one trial, weight rose most rapidly in males until age 18 months (the average size was then 5.3 kg) and subsequently slowed. The heaviest male was 7.3 kg at 30-32 months. The female's weight gain was greatest until 16-18 months (average size 3.3 kg).3 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The animals seem well adapted to harsh sites where the climate and forage make raising conventional livestock difficult.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The meat is white and has a good nutritive value because of its high digestibility, low levels of saturated fats, and high levels of proteins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In marginal zones of the pampas, these rodents appear far more productive than traditional livestock.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Vizcachas may do considerable damage by foraging in cultivated crops. As noted, ranchers claim that they take grazing away from domestic animals, 10 vizcachas eating as much as a sheep. In addition, they claim, vizcachas destroy pasture with their acidic urine. And the large burrow systems sometimes create a hazard.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because their reproductive rate is low and their growth rate is only moderate, their commercial breeding might not be profitable except in well-designed projects with clear markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcachas require sturdy pens, which implies a high initial cost for materials such as concrete and brick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcachas can be aggressive to one another, especially in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">There are several possible research projects, including:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Gathering specimens from different regions for comparative evaluation of characters such as biology, chromosome type, reproductive physiology, social behavior (both in its wild state and under controlled conditions);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Attempting captive rearing and small-scale husbandry;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Assessing performance under various environments; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Quantifying productivity and population dynamics in relation to rangeland use and improvement practices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A rational cropping program based on wild stocks is perhaps more viable than captive breeding. This could be organized so as to keep vizcacha numbers in check while sustaining a small chain of processing plants by providing a constant supply of meat and skins. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">25 Other Rodents</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The 10 previous chapters have described some rodent species that show promise as microlivestock. Rodentia, however, is one of the largest families of mammals, and the species highlighted by no means exhaust the possibilities. In this chapter we briefly mention others that deserve consideration and exploratory research. These might prove to be potential resources, at least in localized situations. Several are fast nearing extinction and they deserve protection and immediate attention from animal scientists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHINCHILLAS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the high Andes of South America are found the short-tailed chinchilla (Chinchilla brevicaudata) and the long-tailed chinchilla (Chinchilla lanigera). These plump little rodents have fur that is possibly the thickest, softest, and warmest of any animal's.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the surface they would seem to be ideal candidates for microlivestock in Third World regions. Indeed, in recent years chinchilla-rearing has been successfully carried out in northern India. However, raising these animals for commercial markets is a highly specialized and costly business because only rare and expensive breeding stock produces top-quality pelts, and all other pelts are worthless in today's marketplace.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These guinea-pig-sized animals have round ears, a bushy tail, and range from 25 to 50 cm long. Adult males rarely weigh more than 500 g, but females may weigh up to 800 g.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PACARANA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The pacarana (Dinomys branickii) is the third-largest living rodent only capybaras and some beavers are larger. But little is known about this seldom-encountered, forest-dwelling species. Nevertheless, pacaranas appear to be likely candidates for domestication. They are amazingly even-tempered and peaceful, and become surprisingly tame.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because these animals are endangered they are unlikely candidates for microlivestock in the short run, but their large size and good meat could be the stimulus for an international effort to study, protect, and rear them in large numbers before it is too late.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacaranas are found along the eastern foothills of the Andes, including parts of Bolivia, Brazil, Colombia, Ecuador, and Peru. Their area of potential use is in Latin America and the Caribbean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It would be advantageous for livestock scientists to investigate this species in captivity. Studies are needed of the animal's general biology, including its nutritional requirements, reproductive capacity, behavior, and physiology. For wildlife specialists, there is a compelling need to protect this species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SPRINGHARE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Scattered through the dry lands of eastern and southern Africa - on numerous grasslands, plains, fossil lake beds, hill slopes, and floodplains - is the springhare (or springhaas). With its powerful hind legs, tiny forelegs, upright stance, and hopping gait, it looks something like a tiny kangaroo. It is commonly seen at night, eyes glowing a characteristic red in the headlights.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This animal is an important source of food and skins for rural peoples throughout southern Africa. In Botswana, it is the principal bushmeat in the human diet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Springhares are 35-40 cm long and weigh 3-4 kg. There is one species (Pedetes capensis) and two subspecies: the East African springhare and the Cape springhare (formerly Pedetes cafer). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROCK CAVY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The rock cavy (Kerodon rupestris) is closely related to the guinea pig and occurs in the impoverished semiarid region of northeastern Brazil. It is large and lean and has a face somewhat resembling a dog's. It is hunted extensively and is an important source of meat for country people, who consider it a delicacy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This creature might be suitable as a microlivestock. It consumes leaves and bark, and breeds well in captivity. Famine is a serious periodic problem in the often-drought-stricken area, and protein deficiency is common. The rock cavy, like the guinea pig, may be amenable to domestication and may be able to provide the people with better nutrition. However, it is difficult to keep in a cage because it moves fast, climbs well, and easily slips out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because these rodents occur in rare and patchily distributed habitats, they are in desperate need of protection, whether or not they prove to have any long-term utility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SALT-DESERT CAVY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A smaller relative of the mare (page 256), the salt-desert cavy (Dolichotis salinicola) is rabbitlike in appearance and behavior. It has large ears and eyes, long legs, and a short tail. It lacks the mare's white rump patch.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This animal inhabits dry, salty areas of the Chaco desert, particularly areas of dry, woody brush. Specifically, it is found in the saline western Chaco of Paraguay and northwestern Argentina, as well as in the extreme south of Bolivia. It is about 45 cm long and weighs up to 4 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it might make a useful microlivestock in its native habitat, the salt-desert cavy breeds rapidly and can cause much devastation; it should never be introduced to new regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The salt-desert cavy's life in the wild is largely unknown; however, some have been successfully raised and bred in zoos. Exploratory research on keeping and managing these little creatures is warranted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">OTHERS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted earlier (page 193), it has been estimated that 42 peoples of various cultures eat rodents. Most of these eat locally available species, some of which are listed below. Whether any have long-term usefulness is uncertain, but study of them in the wild and in captivity could result in some interesting and valuable scientific discoveries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Solomon Islands Rodents</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Solomon Islands in the southwest Pacific are home to a collection of six rare giant rodents that live in the rainforest canopy. At one time they were important food items. Archeologists have dug up tens of thousands of rodent bones on sites where people lived as long as 30,000 years ago. These mysterious animals were classified last century, but most have not been seen by biologists for decades. However, one, the thinking rat (Solomys sapientis), was rediscovered in 1987 - the first time it had been reported seen since 1901. The others may also be inhabiting the dense and undisturbed forests.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The thinking rat was located on the island of Santa Isabel. It proved to be gentle, unafraid, and friendly. It lives in the forest canopy, weighs up to 1 kg, and feeds on nuts and fruits. Efforts to build up the population are urgently needed. The other species should also be sought.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Such animals could be a resource for rainforest production (perhaps in the manner of butterfly farming in Papua New Guinea2). They may never be plentiful enough to be food sources again, but they could nonetheless become valuable. Zoos the world over are likely first customers for these scientific curiosities if production can be boosted and the populations secured.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giant New Guinea Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The giant New Guinea rat (Mallomys rothschildi) is often eaten in New Guinea. It is little known to science but is odorless and easily tamed. It grows so fast that it becomes as big as a guinea pig even before it is weaned. It feeds on a wide variety of tubers and vegetable products. An attractive species native to mountain forests, it has a long heavy tail and black fur with white ticking.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Porcupines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Porcupines, brush-tailed porcupines, and their relatives are distantly related to guinea pigs and are widely consumed as food in tropical regions. Examples are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Indian porcupine (Hystrix indica) and other species of South Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Cape porcupine (H. africaeaustralis) of southern Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Prehensile-tailed porcupine (Coendou prehensilis), which inhabits Central and South America. These nocturnal creatures live in the thick, leafy crowns of trees or in hollow trees or holes in the ground. Although often belligerent among themselves, they can be very friendly and tame toward humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kiore</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The kiore (Rattus exulans) was formerly an important component of  the diet of most Polynesians, including the Maoris of New Zealand. It  has been successfully reared in captivity in recent times. Unlike many  other rodents, this animal is normally not a scavenger; it is a clean,  even fastidious feeder that is basically a vegetarian (flowers, berries,  nuts, and seeds) and is reckoned remarkably good eating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Soft-Furred Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The soft-furred rat (Praomys) is relatively large and slender and is  found in the tropical forests of Africa from sea level to more than  3,000 m. Among the most common rodents of the African jungle, it is  trapped almost everywhere. It feeds largely on plants, but eats large  quantities of ants and other insects. It has been raised successfully in  captivity and is eaten by villagers in Malawi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giant Squirrels</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The giant squirrel (Ratufa bicolor) occurs throughout Indonesia,  Malaysia, and Sri Lanka. It is the largest squirrel on earth, almost the  size of a cat. A related species, the palm squirrel (Funambulus), also  gets very large. It can crop nuts in the very high treetops that are  inaccessible to people. It is widely used as food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Squirrels</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Squirrels of the genus Callosciurus (notably C. notatus and C.  prevostii) are significant pests on cocoa, oil palm, and mixed fruit  plantations in Southeast Asia. They can be reared and bred on a diet of  most types of fruit as long as a little protein, in the form of insects or  cooked wheat, is available. The systematic use of this animal may  offer a chance to turn a pest to advantage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cloud Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Two species of slender-tailed cloud rats (Phlocomys spp.) are found  only in southeastern Asia. They live in tree cavities, climb well, and  are well adapted to tree life.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of these (P. cumingi) lives in the northeastern part of Luzon in the Philippines, where it appears to be thriving. It has a large body and long tail and is the largest member of the mouse subfamily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other (Crateromys schadenbergi) has long, thick hair and a thick, bushy tail. It lives in the mountainous areas of northern Luzon. A nocturnal animal, it feeds on buds, bark, and fruits.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both are attractive, even fascinating, creatures that are relentlessly hunted for food. They might make useful livestock in forest situations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Spiny Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Cayenne spiny rat (Proechimys guyannensis) is found throughout most of South America. It is tasty, easily kept in captivity, and is popularly used in Colombia for food. A nocturnal animal, it is one of the most common mammals in many areas. It has been raised in captivity on bananas, sweet corn, coconut, grain, and various seeds.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bamboo Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The bamboo rat (Rhyzomys spp.) is the largest rodent on the island of Sumatra in Indonesia; it weighs 2-4 kg and the body can be as long as 45 cm. It prefers to live in bamboo thickets and is hunted and eaten by many local peoples.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a need - in considering any sort of game farming - to relate the animal's "preferred" conditions (range, feed, temperature, etc.) to the varying land and climate types not being effectively utilized. In other words, rather than looking at animals that might be farmed, it might be necessary to consider the terrain and climate and then seek animals that would "do" well under those conditions. One major fault with traditional farming has been the tendency to force traditional livestock onto unsuitable land. This has given rise to numerous serious problems. In many cases the most suitable use of an area is provided by several species grazing together to mutual benefit (e.g., goats and sheep on New Zealand hill country improve grazing for each other if ratios are right).</P>
+<P ALIGN="JUSTIFY">David Yerex</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g028a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part V : Deer and Antelope</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Several types of tropical deer' and antelope are no bigger than an average-size dog. These "microdeer" and "microantelope"2 are the smallest of all ruminants. Although there is considerable experience with rearing and utilizing the larger species, little is known about these miniature ones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given research, mouse deer, muntjac, musk deer, pudu, brocket, huemul, and water deer, as well as half a dozen small antelope, might prove to have considerable potential. Collectively, they come from diverse habitats, ranging from equatorial to subarctic and from moist rainforest to arid savanna. They are adapted to some environmental conditions that are only marginal for production of conventional livestock because of drought, heat, diseases, altitude, or other constraints.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DEER FARMING</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Deer appear to be unlikely candidates for livestock, but reindeer were probably among the first domesticated animals and have been draft animals for perhaps 2O,OOO years. Even today, tens of thousands of reindeer pull sleighs in the European arctic. On military expeditions, the ancient Romans took along herds of fallow deer as a source of meat, and more than 1,000 years ago deer were annually herded off the Scottish Highlands for winter meat supplies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years, there have been breakthroughs in the "domestication" of deer. Species already being [armed are: red deer (New Zealand, Australia, Taiwan, Korea, Russia, China, Scotland, the United States), elk (New Zealand, Canada, the United States), fallow deer (New Zealand, Australia, England, Denmark, Sweden, Switzerland, Germany, the United States), ruse deer (Australia, Mauritius, New Zealand, Papua New Guinea), sika deer (Taiwan, New Zealand), musk deer (China, India), and PFre David's deer (New Zealand). Although not truly domesticated, even the moose has been tamed in Scandinavia and the Soviet Union, the calves being bottle-raised from three days of age.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Zealand has made particular progress in domesticating large deer (see sidebar). It seems probable, therefore, that similar success with small deer could be achieved. For those seeking interesting, pioneering research, microdeer are good candidates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ANTELOPE RANCHING AND FARMING</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The worldwide experiences in domesticating various deer species suggest that the organized production of small antelope should also be considered. Several large species have already been studied and are used in game farming in eastern and southern Africa. Similar research on the smaller species, which so far have received little or no attention, is one of the more speculative ideas in this report. We put it forward only for consideration by researchers, but if exploratory studies prove successful, this is a topic deserving international support.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some parts of Africa there are large expanses of uninhabited lands, and producing any sort of livestock there is limited by aridity and by the presence of tsetse flies. But in this habitat live tiny antelope such as dikdik, suni, and klipspringer. In the rainforests and secondary forests are found duikers and the royal antelope. All these creatures have advantages that justify their consideration as microlivestock: they have a more rapid turnover than the big species, and they produce a high yield of quality meat. In addition, compared with cattle, these native ungulates make better use of the habitat. Cattle select a limited number of grass species; antelopes choose a wider range, and also include fortes, bushes, and trees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More important perhaps is their resistance to many diseases. Most, if not all, are resistant to trypanosomiasis, the disease carried by the tsetse fly. They are not immune to this and other tropical diseases, but they are less susceptible than cattle. However, part of this may be owing to their ability to roam widely; if confined and treated like domestic animals, they may also require some protection against parasites and diseases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antelopes are also more productive than cattle; that is, they produce a given quantity of meat more quickly because they breed better in the African hinterlands and grow more rapidly on its existing forages. On the other hand, they generally require a richer diet than cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, in their favor, antelopes affect the habitat less than the same density of cattle does; they spread out more while feeding and thereby cause less erosion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are two ways of exploiting this potential. One is by "cropping"taking a controlled offtake from free-ranging populations without depressing the overall population. Several methods for producing meat this way from large antelope have been attempted in countries such as Kenya, Tanzania, and Mozambique. Few have persisted. Often this has been due to opposition from the vested interests of the cattle industry and from stringent veterinary requirements. Nonetheless, game ranching offers a means by which marginal lands could produce food of a high nutritional quality on a sustained basis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other method is by farming - that is, domesticating or partially domesticating the animals, keeping them in pens or herding them like cattle. Experiments in farming antelopes have been less common than game ranching, but one of the most interesting is that conducted on the Galana Ranch in Kenya. Three wild species - buffalo, eland, and oryx - were selected for comparison with cattle. Half-grown animals were preferred for capture, and it was found that if they were kept in the dark for the first week after capture, and then gradually provided with more and more space while they became familiar with people, after about six weeks they could be released into the open and herded from place to place. Grazing during the day under the eye of a herdsman, they allowed themselves to be herded back to a pen at night in the traditional African manner, where they would sleep around the campfire. This was a promising advance in behavior modification leading toward domestication. The oryx, for example, gained weight on grazing that would not even sustain cattle, and it required only a quarter of the amount of water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At bottom, the question is not what contribution antelopes can make to the African larder, for they already make a significant contribution through (largely illegal) hunting. The question is whether farming could make them a sustainable asset rather than their being senselessly squandered, as is the case at present. Although its potential has yet to be realized, antelope farming is not a panacea for Africa's food problems, and certainly not the world's, but it might pave the way to a new and more gentle way to make savannas useful. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TAME GAME</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Since the 1970s, deer have taken the place of sheep on many New Zealand pastures, and today the country has more than 5, 000 deer farms carrying over one million head, mainly red deer. It is now common along country roads to see tall fences surrounding graceful deer quietly grazing ryegrass and clover. And there are all the appurtenances for deer that exist for cattle and sheep. Auctions and shows are held regularly. Deer farmers have a professional association and produce their own glossy magazine. Government scientists publish pamphlets on the care and management of deer. There are recognized stud stags, computerized recording schemes for breed improvement, and even veterinary services specifically for deer. Hybridization between wapiti and red deer, and PFre David's deer and red deer, is accepted practice. The animals are moved by use of dogs (which command by mere presence rather than by bark or bite), and herds of up to 80 are shifted by truck. Slaughter facilities specifically for deer are in operation throughout the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This transformation of a nervous, jumpy, and retiring wild species into a farm animal is a remarkable achievement. Once accustomed to people, many specimens become gentle, even affectionate, and will come at a farmer's call. Males are generally as easy to handle as females, except during the rutting season when they become aggressive and cannot be handled at all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, even at the best of times the farmed deer must be handled gingerly. If the causes of stress are not quickly suppressed, hysteria can erupt throughout a herd; in an instant, quiet animals can be leaping suicidally in all directions, disoriented, diving head-on into fences, charging gates. Chronic stress, the causes of which are not always obvious, can result in illness or death, although this trait diminishes in subsequent generations of farm-born stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A deer farm has to be laid out to certain special specifications. To prevent escapes, the boundary fences must be 2 m high with netting of 15- or 30-cm mesh. Inner fences need only be 1.5 m high. Water troughs are placed in the middle of the fields, and nothing is allowed to jut inwards from the fences because the animals tend to walk fencelines and take comfort from the illusion of openness. Because deer like to wallow in hot weather, some farmers also provide shallow waterholes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Deer yards can be of any design, but the sides of the passageways and holding pens should be solid, as deer do not see fences very well, particularly when under pressure, and may injure themselves in a leap towards what appear to be wide open space. (New Zealanders usually make the sides of plywood.) Also, the holding pens should be roofed, as semidarkness has a calming effect. Animals that in the sunlight become hysterical on seeing a person in the distance, can, in the relative darkness of a roofed shed, be touched and even given injections.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the special facilities, however, handling deer takes time and care and experience. The most successful farmers spend much time among the deer so that the animals become accustomed to human presence. This helps to make yard work easier. Also, new arrivals are allowed to wander through the yards on their own to become familiar with them. In addition, special tame deer are used as leads or decoys to encourage the rest of the herd to follow. Using such simple techniques, a formerly intractable species has become almost fully domesticated.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">26 Mouse Deer</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g029a.png"></center><br>
+ Lesser Malayan Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse deer1 (Tragulus spp. and Hyemoschus aquaticus) are among the smallest ruminants known. The lesser mouse deer of Southeast Asia is probably the smallest; an adult stands only 20 cm high and weighs a merc 1-2.5 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although they look vaguely like tiny deer, mouse deer differ in several particulars. The stomach is simpler and (like the camel's) has three instead of four effective compartments. Rumination occurs, but mouse deer are the most primitive of all ruminants. Indeed, they share a number of characteristics with nonruminants, including lack of horns or antlers; continually growing, tusklike upper canines in males; sharp-crowned premolars; and four fully developed toes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Virtually unchanged in 25 million years of evolution, these are solitary, nocturnal, retiring animals that have seldom received detailed research. Whether they might make suitable microlivestock is unknown. However, they seem to be tractable, and people in Southeast Asia (Sarawak, for instance) have traditionally kept at least one of the species as backyard pets. Moreover, mouse deer are indigenous to tropical lowland regions and withstand the heat and humidity that are stressful to most conventional livestock species. They probably also are resistant to many diseases of those torrid regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the United States, mouse deer are being raised as laboratory animals for basic research on ungulates. This is because the animals are easier to handle than large deer or goats.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Mouse deer are graceful, lithe, and look somewhat like large rodents. The Asian species are the shape and size of an agouti (see page 198); the African species is more like the pace (see page 262). All have short legs, a small head, and a pointed snout. Adults weigh from 1 to 5 kg, depending on species. The head and body are only 04-1 m long, and the shoulder height is merely 20-36 cm. Males are generally smaller than females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most species the body is a rich brown with white spots and stripes. The belly is usually white. The animals stand on the middle toes, so that the lateral ones do not touch the ground. Neither sex bears antlers. In males the upper canines form long tusks that may extend outside the lips and even to below the line of the jaw.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Twenty-five million years ago, early forms of mouse deer existed throughout Asia, Africa, and Europe. Today's species are restricted to tropical forests and mangrove thickets of Southeast Asia and Central Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of the three Asian species, the Indian mouse deer occurs in southern India and Sri Lanka; the larger Malayan mouse deer occurs on the mainland of Southeast Asia and the lesser Malayan mouse deer occurs on Java as well. The water chevrotain, a related African animal, is found from eastern Zaire to the Atlantic coast. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p292a.png"></center><br>
+ figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p293a.png"></center><br>
+ Range of water chevrotain .</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In recent years, human encroachment into the forest has caused the destruction of the mouse deer habitats and has put various mouse deer species under a pressure that is causing their populations to decline.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals inhabit equatorial forests and mixed secondary tropical forest. They generally live among undergrowth on the edges of dense lowland rainforests. They especially haunt rivers and swampy bush areas, seeking escape by water when in danger.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Little about these animals is recorded. Essentially vegetarians, they feed chiefly on fruits, supplemented by leaves. They also eat insects (for instance, ants), if available. They do not seem to eat grass.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The premolars of the mouse deer are designed for piercing and chopping food rather than for chewing. As noted, the stomach consists of three functional compartments: the rumen, the reticulum, and the abomasum. (The omasum of ruminants is represented only by a rudimentary area.) The stomach occupies almost the whole of the abdominal cavity, extending from the diaphragm to the pelvic inlet, which provides this small animal with large food-storage capacity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The blood has a very high erythrocyte (red blood corpuscle) count as well as the smallest erythrocyte size of any mammal. The flesh is "white" and the muscles contain little myoglobin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mature females reproduce almost continuously, and usually regardless of season. In the female larger Malayan mouse deer, mating occurs within 2 days of giving birth. In the African species, many births are synchronized with the rainy seasons, when fruits are plentiful. The gestation period is about 5-6 months, depending on the species. There is only one young per birth. Weaning normally occurs at 2-3 months, but can occur as early as 3 weeks, with sexual maturity achieved at 4-5 months (Asian species) and 10 months (African species). The young stay alone, hidden in vegetation during the first month or two.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Mouse deer are shy, keeping to dense jungle and depending on concealment for protection. Although often present in large numbers, they are seldom seen. Preferring to be near lakes, rivers, or streams, they can nevertheless wander I km or more from water. They feed mostly at dusk or at night, sheltering in undisturbed areas or under shady bushes during the day. They utter weak, bleating sounds, and when frightened, jump a meter or more in the air.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Communication is by scent and calls. The African species possess anal and preputial glands, with which, along with urine and feces, they mark their home ranges. Males of both Asian and African species possess a chin gland to mark either the vegetation or their mates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse deer are among the most excitable, nervous, and jumpy animals. One must tread softly in their presence for fear of causing absolute pandemonium and mishap.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Mouse deer are widely sought by native people for food, and their meat is highly regarded. Dressed carcasses have a high proportion of muscle (84 percent in Asian species), low proportion of bone (15 percent), and an insignificant amount of fat. The ratio of muscle to bone is large - 5.6:1. The mean dressing percentage of 62.1 percent is greater than that reported for cattle, water buffalo, or goat.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Adults are wild, generally intractable, and "flighty," but young animals (at least of the Asian species) tame readily and make good pets. Nevertheless, these are delicate creatures and must always be handled gently. Individuals caught in the wild tend to bash against the sides of cages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite an unpromising temperament, Asian mouse deer are regularly bred in zoos, including those in Amsterdam, New York, and Zurich. They also have been reared successfully in small enclosures at several research institutes, such as the I.R.E.T. Institute, Makokou, Gabon; the Institute of Medical Research in Kuala Lumpur, Malaysia; and at Fort Detrick in the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perhaps the best way to breed this animal is by using the battery system of small units comprising one male and two females per cage. The costs are mostly for obtaining suitable enclosures and for feeding and watering troughs.6 The cages must be covered with mesh because the mouse deer can jump. However, the covering must be sufficiently high to allow the male to stand with its body vertical during copulation.7 They can be fed a variety of foods and grow well on stems of bean plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, these are small, seemingly tractable creatures that are at home in the heat, humidity, and diseases of tropical lowlands. They might play a particularly important role as livestock for tropical rainforests; the forests could be left standing while the animal still produces meat. Today, in a widely condemned process, tropical rainforests are being felled in order to raise cattle for meat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Small size makes mouse deer easy prey for various predators. In the wild, snakes, crocodiles, eagles, and forest cats feed on them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse deer are among the most excitable, nervous, and jumpy animals. One must tread softly in their presence for fear of causing absolute pandemonium and mishap.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The different species are solitary, and it is difficult to keep many individuals (especially males) in a restricted space. They must be kept in a quiet enclosure, with cover or good shelters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The survival of these four "living fossils" depends on conserving their rainforest habitat and restricting hunting, especially night hunting. But studies of their propagation and management are also imperative.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In particular, research is warranted on various aspects of their husbandry, such as enclosure design, space requirements, and health. A special research need is to understand the animal's nutritional requirements and to develop diets for use in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">27 Muntjac</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g030a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muntjac, or barking deer (Muntiacus species), are among the most widespread but least known of all Asian animals.1 They are almost the size of an average dog and they bark, but they are true deer. These little animals adapt well to captivity and have been introduced to zoos and wildlife collections throughout the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years one species, the Reeves' muntjac, has become established in England, and a few specimens have settled into semicaptivity - staying behind fences, accepting human presence, and even eating out of people's hands. In Sarawak, villagers have also been known to keep muntjac, feeding them a diet of rice with some leafy matter occasionally added.2 Such experiences show that these small, shy deer can be calm and adaptable. It also shows that they can be raised on practical, artificial diets and that they are not strictly browsers. This creates the possibility (admittedly highly speculative) that they might make future microlivestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muntjac produce lean, palatable venison and perhaps could be farmed on an organized basis. They are native to severe environments where heat, humidity, and endemic diseases make raising conventional livestock difficult. In future, given research, muntjac might become widespread contributors to Asian economic development. The lessons learned in captive breeding could also be important for conserving endangered muntjac species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One species, the Indian muntjac, has an incredibly low chromosome number (2n=7 in males; 2n=6 in females), which makes them particularly promising candidates for mammalian genetic studies. This species has regularly bred well in both zoos and research institutions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muntjac are small and slender. Reeves' muntjac, the smallest, has a shoulder height of 45-60 cm. Fully grown, it weighs less than 20 kg; commonly it is merely 10-12 kg. The Java subspecies of the Indian muntjac is the biggest, with a shoulder height of 58 cm and a mature weight of 43 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antlers on the males usually include a main prong as well as a much shorter brow tine. Even the main prong is no larger than a finger, but its pointed tip is hooked and must be treated with caution. There are also two tusklike canine teeth that protrude from the mouth. These have sharp points and a knifelike posterior edge, capable of cutting to the bone a person's finger or another muntjac's rump.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coloration varies from deep brown to yellowish or greyish brown with cream or whitish markings, depending on the species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muntjac are native to a vast region from eastern China to Nepal, India, Sri Lanka, and Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Almost a century ago, Indian and Reeves' muntjac were introduced to a deer park in southeast England. Some escaped, and (as noted) the Reeves' muntjac has adapted, spread, and settled down to life in the countryside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Of the five muntjac species, the Reeves' and the Indian are well known and in no danger. For instance, recent estimates of annual game production have shown that there are about 650,000 Reeves' muntjac in China. The other three are threatened with extinction. Black, Roosevelt's, and Fea's muntjacs are virtually untried in captivity, but the success of raising Reeves' muntjac in English country gardens suggests that perhaps their populations could be saved through captive breeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In their native habitats, these small deer are usually found in dense vegetation on hilly ranges at elevations up to at least 3,000 m.3 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p301a.png"></center><br>
+ The native ranges of the various muntjacs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muntjac seem to be primarily browsers. However, in captivity they eat fresh grass, alfalfa hay, and feed pellets. They also readily eat root crops such as potatoes, carrots, and parsnips. They are "concentrate selectors," preferring foods low in fiber and rich in protein and nutrients. Captive specimens reportedly need; a supply of cut browse.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeding may occur year-round, but in practice it is synchronized with certain seasons. The first conception can occur as early as 6 months of age. One, occasionally two, young are born after a gestation of about 200 days. They weigh around I kg at birth, and the fawns usually remain hidden until they can move about with the mother. The females mate within a few days of giving birth. Life spans up to 16 years have been recorded.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, the Indian muntjac is a species of great cytogenetic interest. It has the lowest diploid chromosome numbers yet found in a mammal.4 The large, easily distinguishable chromosomes are a great advantage in tissue culture, and many laboratories now have muntjac cell lines. The karyotypes of the different species' chromosomes are very different; the Indian and Reeves' muntjac can hybridize, but the offspring are infertile.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muntjac are dainty and have a captivating charm. Always on the alert, they are active both day and night. Often they will bark for an hour or more, but typically they bark for only a minute or two. When panicked, captive muntjac may rush into fences or walls. They can easily leap barriers 1.5 m high.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males are highly territorial and defend their territories vigorously. Adult females also inhabit a specific territory, which they defend against strange individuals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males mark the ground at intervals by lowering the head and rubbing the frontal glands on the ground and by scraping their hooves against the ground. They mark trees by scraping the bark with the lower incisors and rubbing the base of their antlers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In Asia, muntjac are hunted for meat, skins, and antlers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Muntjac thrive and, at least under ideal conditions, breed freely in captivity. However, they may stop breeding if they are crowded.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In England, zoos and private collections keep as many as six muntjac in an area of 40 x 20 m. Plenty of cover is provided for the animals to hide in. Fences almost 2 m high are used. (Lower fences are reportedly adequate where there is no risk of the deer being panicked by dogs or people.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Like other deer, muntjac produce extremely lean meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They seem to be healthy animals. In Britain, wild and captive muntjac have few gastrointestinal worms, and ectoparasites such as ticks and lice are not a problem. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MUNTJAC</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In England, far from Asia's forests and mountains, the Reeves' muntjac is the subject of a peculiar chapter in the otherwise unhappy history of introduced species. Charmed by the deer's odd characteristics, the British have welcomed its invasion into gardens around the country. Now, there are tens of thousands of muntjacs on the loose, and some people have even adopted them as pets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although other alien species have wreaked havoc on native plants and animals, muntjacs appear to be a merciful exception. At least over the short term, muntjacs "have proven to be an almost innocuous asset to the countryside. They give pleasure to thousands and pain to few. Eating mostly ivy, grass, leaves, and prickly bushes, they rarely feed in one place long enough to do much damage except to an occasional suburban garden." </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life for many muntjacs is made soft by homeowners who find the deer's large, dewy eyes and tiny antlers irresistible. The kind-hearted suburbanites put out salt licks, water, and kitchen scraps, and they built snug little shelters against the cold north wind. "All our adult deer will take food from the hand," says Walter Buckingham, who has kept muntjacs for five years in his garden in the county of </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hertfordshire, just north of London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The adaptable immigrant is colonizing new areas so rapidly, say biologists, that soon there may be more in England than in Asia. "In time," predicts muntjac-researcher Oliver Dansie (pictured opposite), "it may eventually establish itself as our most widely distributed deer species."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In the wild these animals are not gregarious and are generally found alone or in pairs. Because of their strong territorial instincts, large males may not be able to be kept together without fighting. The upper canine teeth can inflict serious wounds. Some females are intolerant of each other as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muntjac are fragile; they cannot be held by the legs, for example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some infectious diseases may prove to be of epizootic importance: foot-and-mouth disease, mucosal disease, epizootic hemorrhagic disease, rinderpest, and tuberculosis (all three types). This may be a problem, especially when people are raising the animals by hand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">To ensure a better understanding of their potential as microlivestock, muntjac deserve research and recognition from animal scientists and conservationists from Nepal to China. The English experience shows how populations of the endangered species might be built up. At present, however, none are receiving any husbandry research; only the two most common species can generally be found in zoos.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals deserve investigation into physiology, reproductive requirements, fertility, nutrition (for example, food preferences, feeding strategies, and food utilization), growth, adaptability and environmental tolerance, diseases, management, social structure, and selection for calm temperament. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">28 Musk Deer</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The musk deer (Moschus species)1 is so small that (like other ungulates in this section) it is only as large as an average-size dog. A gland in males produces musk, a thick, oily secretion that is one of the most valuable substances in the animal kingdom. Musk is used in Oriental Medicine as well as in Europeans perfumes, and in recent year it has sometimes sold for as much as three times the price of gold.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Musk is traditionally obtained by killing these deer and removing their glands. The dried glands, called pods, contain a reddish brown musk powder that has been a commodity in international commerce for more than 1,000 years. Despite bans in India (1972) and Nepal (1973), musk continues to be illegally exported, mainly via Hong Kong, for use in Japan and Europe. In Japan, for example, it is an ingredient in more than 200 different medicines.2 In Europe, musk goes into some of the most famous perfumes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The international trade in Himalayan musk, originating from both northern and southern sides of the Himalayan divide, amounts to 200 kg per year, representing an annual slaughter of 20,000-32,000 male deer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The commercial value of the animal makes it highly attractive for development as a livestock species. The economic force causing its slide toward extinction could be employed to protect and restore both the species and its habitat. Ranching these deer might put musk production on a sustainable footing. It might also encourage habitat protection, because in the harsh climate of the high Himalayas, rearing musk deer could be much more profitable to villagers than raising crops or cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Musk deer are already being farmed under primitive conditions in China, where techniques for extracting musk without killing the animal have been developed. In India, small collections of musk deer have been established by the forest departments of Himachal Pradesh and Uttar Pradesh. For several years authorities in Nepal have successfully extracted musk from an adult male at the Kathmandu Zoo' without apparent harm to the animal.3 These experiences suggest that musk might become a farmed product. So far, however, success has been limited. The Chinese animals, for example, have a high mortality rate and the musk is said to be of poor quality. Nonetheless, these examples are valuable pioneering case studies that deserve recognition, support, and further development.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">With their long ears, arched back, and bounding gait, these diminutive deer remind one of large hares. The pointed face and large ears make their heads strikingly reminiscent of kangaroos. The coarse hair gives them a stocky appearance. The color varies according to species (and subspecies) from rich reddish brown to dark grey or black. The peculiarly brittle and wavy hair probably has good insulating properties, as it consists of air-filled cells arranged like a honeycomb.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Musk deer have an average mature weight of about 6-11 kg and a body length of 50-90 cm. They stand 50 60 cm high at the shoulder and 5 cm higher at the rump because the hind legs are longer than the forelegs. Some dwarf types are only 40-46 cm high. The tail is short, and in males it is naked, except for a terminal tuft of hair, because they mark their territories by constantly rubbing the caudal gland, which is located near the tail, onto objects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All four toes are flexible, which, compared to the rigid hoof of other ungulates, gives a firmer grip on precipitous slopes. The dew claws are enlarged and, together with the central digits, splay out, to minimize sinking in soft snow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Neither sex possesses antlers, but males have long upper canine teeth that project well below the lips. The lower front teeth have a spatulate form that probably helps the animals scrape lichens from the surfaces of rocks and trees in winter, when most vegetation is snow covered. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p309a.png"></center><br>
+ The musk deers native range.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The genus is distributed patchily throughout the forested mountainous parts of most of Asia. One population extends from just north of the Arctic Circle southward to the northern edge of Mongolia and Korea. Others occur in China, northern Vietnam, and the Himalayan region including Bhutan, Assam, Tibet, the Indian Himalayas, Nepal, and northern Pakistan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">During this century, the musk deer has rapidly declined throughout its former regions. In many parts of Afghanistan, Pakistan, India, Nepal, and probably Tibet, it is already regarded as rare, with a distribution that is becoming increasingly localized. Possible exceptions are Bhutan and most of China, where its population is thought to be stable. In southern China, a recent estimate puts the musk deer population at 100,000 head. In western and northwestern China, the population is estimated at 200,000-300,000 head.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is the uncontrolled hunt for musk that in most places is driving this animal toward extinction, but its habitat is also being increasingly destroyed by livestock and woodcutters. Part of the loss to hunters is owing to the mindless way in which the animals are caught. Most are snared in traps or nets or killed by poisoned stakes set on trails. This kills all the animals indiscriminately, even females and fawns, which produce no musk. This waste of reproductive animals is extremely destructive to the populations and is senselessly hastening the musk deer's extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Musk deer mainly occur in upland woodland and scrub areas. They prefer remote, dense vegetation, especially birch-rhododendron forests in mountainous terrain. They are seldom found in treeless regions or areas thickly populated by people. In the Himalayas, the upper limit coincides approximately with the tree line, which is as high as 4,600 m at the eastern end.6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Despite its economic importance and wide distribution, little is known of the musk deer's biology. Nonetheless, it is known that musk deer have a gall bladder, a bovid feature that distinguishes it from the true deer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are browsers, relying on young leaves, buds, fruits, and flowers. During the winter, as snow deepens, they depend more on lichens growing above the snow on rocks or tree bark, although in shallow snow they scrape for vegetation with their hooves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The male's musk sac is unique among deer. Situated between the umbilicus and penis, it contains the gelatinous, odoriferous oil. The amount varies with the season and the age of the animal, but pods of adult males usually weigh about 30 g; occasionally up to 45 g.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males also have a caudal gland under the tail, which secretes a viscous yellow substance with a goaty smell. They mark vegetation with this secretion by rubbing their hindquarters against stems and branches.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Males become sexually mature at about 18 months, but females seem capable of reproducing in their first year. The estrous cycle is 18-25 days; the receptive period lasts 36 60 hours. Gestation varies from 178 to 192 days. Each female usually bears one or two fawns, rarely three. The fawn is precocious - able to stand and move within 15 minutes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Musk deer are shy, furtive animals with keen senses of hearing, smell, and sight. They are normally solitary and are most active at dawn and dusk. Only under cover of darkness do they frequent the more open spaces. Except in the rutting season, more than two animals are seldom seen together; groups usually consist only of a female and her young. The alarm call, a loud hiss, is often accompanied by a highstepping, springy gait.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the wild, musk deer lead "orderly" lives. They use well established trails connecting well-established feeding places, resting places, and "latrines" where they deposit their droppings. Migration is uncommon.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Remarkably sure footed, musk deer climb cliffs and even the trunks of leaning trees. Being small and solitary, they rely on camouflage to avoid predators but flee through established escape routes when disturbed. If cornered, males defend themselves by slashing with their tusks, often inflicting deep cuts and severe injuries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The strong-smelling, reddish-brown musk is obtainable only from this animal.7 It is used as a fixative in expensive perfumes to increase the retention of the fragrance on the skin. In Oriental medicines it is used in stimulants, sedatives, and other products. Some medicinal properties appear to be genuine.8 Recently, highly purified musk has been selling for as much as $27 a gram.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade in the Himalayan musk deer or its products is banned by all countries that are parties to the Convention on International Trade in Endangered Species of Wild Fauna and Flora (CITES). However, products from musk deer in the Soviet Union and China can be traded legally under license. It seems likely that if formal, self-sufficient, musk-deer farming projects can be established elsewhere, with safeguards to minimize poaching, a wider trade would be officially sanctioned.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Since at least 1919, Chinese scientists have been experimenting with the extraction of musk without killing the males. When the sexual activity is at its peak, the males are caught and musk removed from the pod with a runcible spoon (curved fork) inserted into the sac's aperture. The procedure takes only minutes. There are records of up to 9 g being recovered at a time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, China established formal musk deer farms in 1958. They are clustered in the Maerkang, Miyalo, and Manchuan areas of Sichuan Province; the Zhenping county of Shanxi Province; and the Fuziling area of Anhui Province. Despite heavy initial losses of animals, mainly during transportation and acclimatization, the Chinese now breed musk deer in considerable numbers. However, juvenile mortality is still high and longevity relatively short. Zoos in other parts of the world have also had difficulties maintaining the animals.9</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In captivity, musk deer readily accept many foods: lettuce, carrots, potatoes, apples, rolled oats, hay, alfalfa, bananas, some grass, bamboo leaves, and pumpkins, for example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The musk deer's social system may represent an impediment to its successful reproduction in captivity. It is irascible and scares easily. In close confinement, males fight and may have to be isolated from each other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is an inherent danger in any captive-breeding scheme in the Himalayas: resumption of legal trade in natural musk could damage the remaining populations by stimulating the market and providing an outlet for illicit musk from poached animals. Some biologists (notably in India) consider that a total ban on the trade in natural musk from all sources is essential.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So far, removing the musk without damaging the animals has not proved commercially successful because of market resistance. Most purchasers require the entire pod in order to be certain that they are receiving the genuine product. Given a regularized farming program, however, it seems likely that mutual trust would circumvent this lack of confidence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">To protect this species will not be easy. It occurs in vast, remote areas that are difficult to patrol. The local people are poor and traditionally have used it as a source of income and food. The value of musk is so high that smuggling is already well organized and will be difficult to eradicate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is imperative that the status of existing musk deer populations be established. This is especially important in Nepal. The total population may be not more than 500 in the wild.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No matter what is achieved in farming, pressure on populations will only be reduced by protecting the wild specimens. Thus, the dietary requirements and behavior of musk deer should also be evaluated with a view to building up the wild populations directly. If the techniques of breeding and handling can be improved, farming the animal may also indirectly help wild populations by reducing the pressure to harvest them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An alternative to captive breeding might be ranching the wild animals. In this process, males would be caught periodically and the musk extracted before releasing them. The organized, sustainable harvesting is particularly attractive if developed at the rural level with revenue going directly to local people; it would provide them incentive to conserve not only "their" musk deer but also its habitat. For this purpose, today's musk deer hunters could be trained to extract musk from live animals, releasing and recapturing them on a controlled basis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another alternative could be controlled culling at a sustainable level, as is now done in the Soviet Union, where about 5 percent of the population is harvested each year. However, elsewhere annual culls at any level would not be feasible for at least 10 years because the populations are now so low. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g031a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">29 South America's Microdeer</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g032a.png"></center><br>
+ Pudu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South America contains three types of tiny, indigenous deer. None are well known to science, yet they are of microlivestock size, and if given research attention at least two might respond to rearing in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PUDU</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The pudu (pronounced "poo-doo") is native to temperate forests of the Andean region. It is among the smallest of all true deer, adult males being merely the size of small terriers and the females being smaller still. It is very shy and retiring and is endangered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All things considered, this animal would appear to be an unlikely candidate for microlivestock. But wherever it is found, the pudu is mercilessly hunted, and captive rearing might be the only way to save its populations from extinction. Indeed, it is already being raised in experimental herds in Chile and Argentina.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pudus (also called the Andean dwarf deer) once ranged widely through the foothills, valleys, and lowlands of the Andes. They prefer the dark, dank underbrush of the cool rainforest, particularly thick bamboo stands. There are two species: Pudu pudu is distributed in parts of southern Bolivia and throughout much of southern Chile nearly to the Straits of Magellan. It is also found on islands off the Chilean coast. Pudu mephistophiles is distributed throughout the highlands of Ecuador, where it occurs only in cool areas at great height.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With their short legs, stocky bodies, and compact heads, pudus do not look much like deer - more like small antelopes with foxlike faces and spiky antlers. Full grown, they are only 40 cm tall and weigh less than 12 kg. They have thick fur ranging from reddish brown to pale gray.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of the pudu's small size, shy and secretive nature, and forbidding habitat, few people have ever even seen one. Nonetheless, these animals tame easily and reportedly were once kept by South American Indians. Several generations were also once bred in a Paris apartment and were treated exactly like domestic dogs, which most people who saw them for the first time thought they were.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years, habitat destruction has greatly reduced the range and numbers of these attractive and fascinating little creatures. The International Union for the Conservation of Nature already lists them as vulnerable to extinction. Pudu studies are highly recommended, and raising pudus promises to be an interesting and valuable activity that may one day lead to one of the most intriguing microlivestock of all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BROCKET</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Brockets (Mazama spp.) are small deer that occupy the place in South America's environment that duikers occupy in Africa (see page 326). They typically reside in thick brush. They occur widely throughout South America and are found in every country except Chile and Uruguay. They also occur in Central America, the West Indies, and Mexico.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are four species:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">- Red brocket (Mazama americana), the most common and widespread, is found from Mexico to Argentina. It is also the largest species, with a mature weight of about 20 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Gray (brown) brocket (Mazama gouazoubira) is also found throughout Latin America. It is slightly smaller, weighing about 17 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Lesser brocket (Mazama rufina)2 resides in small and scattered locations in Venezuela, Ecuador, Peru, Bolivia, Brazil, Argentina, and Paraguay. It weighs 10-20 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Dwarf brocket (Mazama chunyi) is found only in pockets of forest and brush on certain mountainsides in Venezuela, Colombia, Ecuador, and northern Peru. The smallest brocket, it weighs only 8-12 kg. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Except for their size and color, all brockets look alike. The head,  neck, and tail are short; the ears are wide. The lumbar region is higher  than the shoulders, and this, together with an arched back, gives them a  hunched appearance not unlike a duiker's. The antlers are simple  spikes, never longer than a person's hand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The different species are similar in behavior, too.3 They generally  wander around singly or in pairs. Although frequenting dense cover  during the day, they emerge at night to feed in open areas. Little is  known of their food preferences. But farmers know only too well how  fond they are of melons, beans, peppers, and corn. Doubtless, wild  forest fruits dominate their native diet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although extensively hunted, brockets are so adept at dodging into  dense brush that relatively few get caught. However, small size makes  them vulnerable to many other predators: puma, jaguar, ocelot, and  eagles and other large birds of prey. Near villages the domestic dog is  probably their worst enemy. (Infuriated vegetable growers commonly  set their dogs on them.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although at first sight these retiring, nervous, and agile creatures  seem unlikely to be even potential microlivestock, young brockets are  sometimes caught and raised by people. It is not uncommon to find  them as pets on farms and in gardens. They seem to become very  tame and might therefore make useful livestock at some future time.  At least one species, the grey brocket, adjusts particularly well to life in  and around human settlements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUEMUL</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The third type of South American microdeer, the huemul,4 is a much  less likely candidate. It is very rare, very shy, and has so far shown  little likelihood of settling into captivity. However, huemul conservation  is critical: without urgent attention, the animal will become extinct.  Although totally protected by law, it is declining owing to poaching,  farm dogs, habitat loss and diseases transmitted by cattle and other  livestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are two species:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The Chilean huemul (Hippocamelus bisulcus)5 occurs in high altitude forests, thickets, and grasslands in the Andes of southern Chile and Argentina.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- The Peruvian huemul, or taruca (H. antisepsis), occurs in parts of the Andes of southern Peru and Bolivia as well as of northern Chile and Argentina.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both species live in small herds above the tree line. They are very shy, and even though the Chilean national seal bears the depiction of a huemul, almost no Chilean (or anyone else, for that matter) has ever seen a live one.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At less than 85 cm tall and probably weighing under 15 kg, huemuls are sized to be microlivestock. However, previous attempts at rearing them in Chile have met with little success. Nevertheless, huemuls have been kept in zoos in Germany, and such experiences - together with the increasing knowledge of how to raise red deer and other species - may eventually provide the keys to their continued existence. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g033a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">30 Water Deer</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g034a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known about the water deer' (Hydropotes inermis), but it should be considered along with mouse deer, muntjacs, musk deer, and others as a possible species for microlivestock development. It is comparable in size, and it is unusual among deer for producing large litters: births of triplets or more are common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As with the other species in this section, this is a highly speculative notion; however, there is some justification for it. The Zoological Society of London has successfully established breeding colonies, and other zoos have also bred the animal in captivity. The water deer has the advantage of rapid growth, early maturity, and high fecundity. Indeed, given protection, its populations have been known to increase rapidly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The animal has a graceful and delicate appearance, its best known characteristic being the male's long tusks. Both sexes are about the same size, standing 45-55 cm at the shoulder and weighing up to 19 kg. Body length is up to about I m, and the tail is so tiny that it is barely noticeable. The round-tipped ears are characteristically held erect above the head.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water deer are somewhat like muntjacs, but they are longer in the leg and lighter in build. Their forelegs are shorter than their hindlegs so that they stand slightly higher at the haunches than at the shoulders. This gives them a hunched appearance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The hair is generally thick and coarse, longest on the flanks and rump. The backs and sides are usually yellowish brown, finely stippled with black. In winter, the coat is thick and variable in color; pale fawn and peppery gray-brown are common shades. In summer, the coat is sleek and reddish. Fawns are white spotted at birth, but this dappling soon fades.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Neither sex has antlers. The upper canine teeth, especially in the males, are enlarged, forming curved tusks 7 cm long. These are much bigger than those in muntjacs and can protrude well below the jawline.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In both sexes there is a small inguinal gland present between the hind legs, the only instance among deer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In China the water deer has a wide distribution range. It is mainly found in the provinces of Jiangsu, Zhejiang, Anhui, Jiangxi, Hunan, Hubei, and Fujian, the mid and lower Yangtze River Basin, and coastal areas and islands in central and eastern China. It is also found in Guilin, southern Sichuan Province, Guangxi Province, and Guangdong Province in the south.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Korea, the animal lives along the lower reaches of most rivers, except those in the extreme northeast. Its northern limit of distribution is probably about latitude 43&Yacute;N.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At Woburn Park in England, a few escaped from a herd early this century and have increased and become established in a number of counties, particularly Bedfordshire, Hertfordshire, Cambridgeshire, and Norfolk.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In China, owing to increasing reclamation and cultivation of wetlands, the habitat of the water deer is gradually shrinking. At present the animal is protected by the government, which designates appropriate hunting seasons. It is estimated that about 10,000 are killed each year by hunters. In Korea the water deer is still plentiful. As noted, in England it is maintaining itself and is thriving in some protected parks. It is also reported to be present in France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In its home range, the water deer is usually found among reeds and rushes in swampy areas. It also frequents the tall grasses and sparse shrubs of mountainsides and cultivated fields. In England it has adapted to a variety of habitats, including woodlands. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p323a.png"></center><br>
+ Native range of the water deer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The water deer is chiefly a grazer. It feeds mainly on reeds, coarse grasses, and some tree leaves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As previously mentioned, this is the most prolific species of deer. Up to seven fetuses have been observed in a single pregnant female, although the normal litters are two or three. The gestation period is about 176 days. Fawns are born in late spring or early summer, and weigh only about 0.5 kg at birth. Within 4 days the newborns can live almost exclusively on grasses. Usually, however, they are fully weaned after 4 8 weeks, but remain socially attached to the mother. They appear to become independent after about 4 months. Males become sexually mature at about 5-6 months; females at about 7-8 months.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Water deer are generally seen alone. Even where abundant, they seldom congregate in herds. Females are sometimes intolerant of each other, as are adult males or young males. However, in captivity, several females can graze and rest in loose aggregations. The peak period of grazing activity occurs around dusk. Feeding sessions are interspersed with periods of passive cud-chewing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water deer "bark" at intruders. During the rut, males are especially noisy and aggressive, and defend their territories with vigor. Fighting involves striking their tusks into the shoulder or back of their opponents. 3 Information from Lu Houji. These are extremely excitable little animals. When upset, they often "hump" their backs and bound away like rabbits. They are also good swimmers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In China the water deer are hunted for their meat and skins, and newly born fawns are killed to obtain the mother's colostrum for medicinal purposes. In a few localities in England, the species has become a game animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The water deer is not yet known on "farms." However, it seems to be easily kept, has bred well in zoos, and has thrived in many British wildlife parks. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The assets of early maturity and high fecundity mean that the potential exists for rapid population expansion. Such an event occurred at Britain's Whipsnade Zoo. In 1929 and 1930, 32 deer were released into undeveloped pasture; by 1937, 120 fawns had been raised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because they are relatively small, and because in the wild state they aggregate only under exceptional conditions, water deer are unlikely to have any appreciable impact on vegetation in forests, farms, or gardens. Nonetheless, they can damage crops, and Chinese farmers, who consider them pests, often illegally kill them out of season.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals are swift and adept at escaping captivity. It is possible that because of territoriality only a single pair will live in a given area. Moreover, males are aggressive and must be kept apart.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They seem able to withstand chilly weather well, but a combination of wet and cold is harmful. Their heavy winter coat, essential to survival in the Far East, renders the animal susceptible to dehydration and heat exhaustion in comparatively mild climates, such as England's.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At birth, the tiny fawns are extremely vulnerable to a variety of predators, both birds and mammals. The species may need areas of dense cover or some shelter from wind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The water deer has been successfully kept in semicaptivity for many years; however, for it to reach a level of domestication suitable for use as microlivestock, research is needed in the following areas:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Reproduction;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Performance under a range of environments;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Grazing efficiency;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Basic physiology;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Captive breeding and domestication - measurements of growth rates, space requirements, and feed needs; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Modifying behavior to overcome territoriality - for instance, imprinting on humans, selection of docile specimens, hand rearing, and castration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water deer is not an endangered species; however, efforts should be made to preserve the populations in their native ranges and habitats. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">31 Duikers</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g035a.png"></center><br>
+ Red Duiker</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers (Cephalophus and Sylvicapra species) are small African antelopes. Although they are ruminants like cattle, sheep, and goats, some are hardly bigger than hares or rabbits. One, the blue duiker, is less than 40 cm high and usually weighs a mere 4-6 kg. It and some of the slightly larger duikers might be suitable for household husbandry because their meat is an extremely popular food throughout much of Africa. In West Africa, for example, it is one of the most common meats sold in both rural and urban markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This idea, however, is highly speculative because, despite their popularity, little is known about these tiny animals. Their husbandry has been attempted only a few times, but the results were encouraging, and rearing duikers deserves further investigation. They are already being raised in captivity in the United States,' Zimbabwe,2 Togo,3 and Gabon. Researchers in Nigeria have bred blue duikers to the fourth generation and found that, if the animals were first handled by people while young, they remained docile.4 Even blue duikers caught in the wild tame quickly if they are very young, but by the time they reach 3.5 months, they become barely tolerant of man's presence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If duiker husbandry can be developed, it might provide not only a more regular source of meat, but also a lessening of the hunting pressures, thereby giving the wild populations a better chance of survival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These antelopes are suitable for testing as microlivestock only in their native region, sub-Saharan Africa. Eventually, they might prove to have wider applicability. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Duiker species vary from about the size of a small dog to that of a small donkey. Most are similar in shape and are characterized by short front legs, arched back, and pointed hoofs. The tail is stubby, often with a terminal tuft. The coat varies from reddish brown to nearly black, although a few species are blue-grey and one is zebra striped.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Females are slightly larger than males, but the sexes look alike. In most species, both sexes bear small straight horns that project backward from the skull, frequently hidden in a long tuft of hair.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Duikers inhabit virtually all regions of Africa below the Sahara from Gambia in the west to Ethiopia in the east, and all countries as far south as South Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Duikers are so shy that they are rarely encountered by people. But almost anywhere in Africa (other than North Africa), the observant traveler may glimpse them ducking into forests or thickets. Although there are still countless numbers, people are eating so many that in some localized areas the populations are fast heading toward extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">All but one species are found in rainforests or dense woodlands. The grey duiker, however, is found in savannas. If the vegetation is juicy, only a few of the species need a separate water source, so they can thrive in very dry sites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The main foods are fruits and seeds supplemented by leaves and shoots. Fruits, which they eat to a much greater degree than other antelopes, are an important part of their diet. Some rare species (for example, the red-flanked duiker, C. rufilatus) can graze. Occasionally (especially in captivity), duikers are also omnivorous, eating fish, crabs, insects, snails, frogs, small animals, or carrion; they also readily accept chopped meat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers reach sexual maturity at 9-15 months; gestation lasts about 7-8 months. In some species, females conceive a few days after calving on a 3- to 5-day postpartum estrus. Apparently one calf per birth is normal. A newborn blue duiker weighs between 0.4 and 0.7 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before one year of age, young duikers leave their parents to find their own mates and territories. Life expectancy is more than 10 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In spite of habitat differences, most duikers behave alike. In the wild they are nervous, shy, and retiring. When alarmed, they plunge into the protection of dense vegetation - hence the origin of the name duiker, which means "diver." Nonetheless, their behavior allows them to be easily netted. An experienced hunter can imitate duiker sounds and call the male out of the bush. Also, a startled animal freezes, thereby facilitating its capture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moving easily through dense vegetation, the head carried low, these tiny animals use regular runs. Forest duiker species are largely diurnal, although a few, such as the bay duiker, are nocturnal. Bush duikers are mainly nocturnal, feeding from early evening until morning. Such nocturnal species shelter during the day in holes (presumably dug by other animals) or inside fallen trees; the diurnal ones lie directly on the ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blue duikers are the best-known species and are probably the most likely candidates for microlivestock (see page 332). They seem to be monogamous and apparently mate for life. Unlike most antelopes, their population densities can be high. The pairs reside in territories of 2-4 hectares, which both male and female stoutly defend against rivals. Other species appear to be polygamous and live in large territories (up to 80 hectares).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In captivity, the animals are generally calm. However, both males and females can be aggressive toward unfamiliar individuals of their own species. In an enclosure, one male can serve several females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Large glands, located beneath each eye, exude a scent that is rubbed onto fences, trees, and other objects as territorial marking. In another form of marking the horns are rubbed against tree trunks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, duiker meat is much sought in many African countries, and the animals are regularly hunted. The meat is lean with little or no intramuscular fat (marbling). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers also have promise as experimental animals. They are true ruminants, with four-part stomachs, and they produce cud. Some are only rabbit size, they need far less room or feed than sheep, and thus are potentially an efficient test animal for determining the nutritional value of forages. Blue duikers, for instance, have a digestion efficiency comparable to that of sheep, but, because of their small size, a test needs only four rabbit cages and 5-10 kg of feed. Sheep, by comparison, require much more spacious facilities and 150 kg of feed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Nigeria, blue duiker pelts are used in making karosses, a traditional dress. A single garment may contain up to 60 pelts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Almost nothing is known about rearing duikers, but they seem to tame easily and perhaps may be kept in backyards like goats. Indeed, they reportedly make good house pets when hand raised. They are attractive, and from the day of capture young ones can be handled and petted.5</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Nigerian researchers who bred blue duikers to the fourth generation bottle-fed young specimens five times a day. Older animals were given feeds that included banana, plantain, and papaya; leaves of hibiscus, cassava, and banana; and dried corn. Variety seemed to be important, and the researchers could not predict the quantity of particular foods the animals would choose on any given day. In addition to varied vegetables, a small dish of salt or a salt lick was sometimes required.6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers are unlikely to run away, except when startled. However, providing an enclosure is worthwhile. It enables them to establish a territory by marking poles, bushes, and fences. Although needing space in which to run, as little as 10 m&Yacute; is reportedly sufficient for 24 animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Satisfactory shelters include an open-ended oil drum laid on its side, a lean-to made of palm frond, or a small hut made of local matting. Apart from providing shade and protection, shelters should be built so that excited animals can run through them. When cornered, duikers tend to either flee for shelter or jump upwards; a run-through shelter can prevent a frightened one from accidentally leaping over the fence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Based on their own experiences, researchers at Pennsylvania State University in the United States report that blue duikers raised in captivity are easy to maintain, reproduce well, and are not fussy about environmental conditions. In fact, they say, blue duikers seem to enjoy living in cages.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In order to raise duikers successfully, post-pubertal males must be separated. A female should be bred with the same male throughout her productive life span.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE BLUE DUIKER</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In one sense, the blue duiker is the most important animal in Africa. It is the only one found throughout the continent south of the Sahara. It occurs at a greater range of altitudes than most - as low as sea level in many places to almost 5,000 m elevation in Kenya. It occurs in habitats from dense rainforests to dryland savannas. And, in sub-Saharan Africa as a whole, the blue duiker is eaten more than any other animal (although in West Africa it is generally called Maxwell's duiker).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This very small antelope, caught by snare or net, can be found in the meat markets of villages, towns, and cities in all countries from Senegal to Madagascar. It is a source of food for tens of millions. Bushmen, Pygmies, Dinkas, and Mandingos, thousands of miles apart; all share the same fondness for duiker meat and for duiker-skin clothes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, scientifically speaking, this is one of the world's least-known animals. And its numbers are diminishing rapidly. Areas that used to have plenty now have few or none. Overhunting and destruction of the rainforests are jointly contributing to their decline.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the losses, people are snaring as many as they can, and there is no sense of concern - not even among most conservationists. However, in many locations there is already evidence that the animals won't be around much longer. Unless something is done - and soon - people will lose their major source of animal protein. If that happens, it is likely that they will move on to larger animals, such as gorillas, which would be an even worse disaster.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The best long-term solution is to organize duiker husbandry. Learning to rear duikers would benefit people throughout Africa. The blue duiker is the most suitable species; it is the most common and the most important. Also, it inhabits the edges of the forest and could therefore become a suitable species for ranching without denuding the forest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blue duikers are easy to maintain in captivity. They tame readily and like to shelter and sleep In boxes or cages. They are good converters of vegetation and produce top-quality lean meat. In addition, they are neither affected by tsetse flies nor are very susceptible to diseases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The key now is to learn how to keep these very timid creatures under different conditions. We need to know their foods (especially foods that might be harvested from forests) and reproductive biology. We need to know the right numbers to house together. Most of all, we need projects aimed at rearing and breeding them in captivity under village conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vivian J. Wilson</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Many African countries already have a ready market for duiker meat. It is somewhat similar to goat meat, but most people agree that it is superior.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal can live on fibrous vegetation. Unlike conventional ruminant livestock, it is suitable for feeding an average family at one meal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ability to forage in undergrowth where other domestic livestock do not thrive makes duikers potential livestock for tropical forest and bushland regions. They can be raised for meat without cutting the trees or bushes to create pastures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Duikers are easy prey for predators: eagles, pythons, wildcats, and people, among others. Thus, they probably require more sophisticated management than common livestock such as goats. However, the quality of their meat could more than compensate for the extra effort.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some species are territorial, which means that they may do poorly in captivity, unless their social organization can be altered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under good conditions, the ideal slaughtering age reportedly occurs at 8-10 months, when the blue duiker can weigh 4 kg. Compared to rabbits and guinea pigs, production is relatively slow because of long gestation and lack of multiple births.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers are resistant to trypanosomiasis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One general problem is that duikers have short, sharp horns designed specifically for jabbing. This could be a potential danger, especially since the males of some species become aggressive when their females are receptive. However, the horns can easily be clipped and taped to limit the danger. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Because of the duikers' secluded lifestyle, much has still to be learned about their habits. Specific information on behavior and breeding is needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal scientists in Africa should gather small herds for comparative studies. This will provide insights into whether duiker temperaments facilitate or hinder their utilization. In addition, assessments of diet, growth rates, behavior in captivity, reproductive rate, adaptability, and future potential can be made. Management considerations include clipping horns, trimming hooves, and controlling lice and fleas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research of particular value would be chemical analysis of duiker milk and of other characteristic glandular secretions. The latter lend themselves especially to a study of animal communication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parming duikers might help rescue the wild populations by relieving hunting pressures. Programs in this area are recommended for locations where overhunting is occurring. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g036a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">32 Other Small Antelope</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g037a.png"></center><br>
+ Klipspringer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The least known and most obscure of all antelope are the delicate African creatures called dikdik, suni, royal antelope, pygmy antelope, and klipspringer. The smallest is a West African form of the royal antelope that stands a mere 25 cm high and weighs less than 2 kg. The four-horned antelope of South Asia is a similarly tough, tractable animal that is also the size of a small dog.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">None of these has previously been seriously considered for use as livestock, but they are possibly amenable to rearing in captivity and they provide some of the finest game meat in the world. Given New Zealand's experience with various deer species (see page 288) and Africa's experience with large antelopes, basic research to test out the possibility of organized dwarf-antelope production could prove to be rewarding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AREA OF POTENTIAL USE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The areas where these antelopes might be used are sub-Saharan Africa for the African species and South Asia for the four-horned antelope.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Of these animals, some, such as the pygmy antelopes, have a crouched appearance with an arched back and short neck; others have a more upright posture with a long neck and a raised head. In all species, the males are smaller than the females and bear tiny spikelike horns. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Collectively, these antelopes have native ranges covering huge areas of Africa and part of Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dikdik: Six species occur in two discontinuous distributions - one from Somalia and Ethiopia southward through Kenya and Tanzania, the other in Namibia and Angola. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sunis: Eastern Africa, from Kenya to South Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Royal antelope: West African forests. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pygmy antelope: Central Africa from southeastern Nigeria to Zaire. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Klipspringer: Ethiopia to the Cape of Good Hope. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Four-horned antelope: India. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Many forms are protected by local laws, but none of the species is on the international endangered-species list.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The animals occupy habitats from dense, moist forests to dry, rocky outcrops and even to deserts. Their ranges have almost certainly been affected by humans - sometimes for the better, since many prefer the secondary growth that invades disturbed areas, notably after overgrazing or slash-and-burn agriculture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although dikdik and klipspringer usually frequent dry areas with scattered brush, the other dwarf antelopes normally stay in dense vegetation. All seem to live in definite areas and do not migrate. For instance:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Dikdik live near streambanks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Sunis inhabit dry country with thick bush, but they can also be found in reed scrub along rivers and in forests up to 3,000 m elevation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Klipspringers live on stony mountain slopes, rocky outcrops' or the sides of steep gorges at altitudes from sea level to 4,000 m.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Four-horned antelopes live in undulating or hill country and shelter in tall grass and open jungle, a terrain more common to deer than to antelope. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Most of these antelope browse on shrubs. They are "concentrate selectors," taking easily digested vegetation such as buds, fruit, and succulent young leaves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Also, most obtain much of their water requirement from dew and the vegetation they consume. Klipspringers, for example, are able to live for months without drinking. Sunis and four-horned antelope, on the other hand, drink regularly and seldom live far from water sources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known of the reproduction and general performance of these animals. Females become sexually mature at about 6 months in the smaller species and 10 months in the larger. Males become sexually mature at about 14 months. The young are born throughout the year, but births peak with the vegetation flush following the first rains. Where there are two rainy seasons a year, two birth peaks occur. Usually a single calf is born. Dikdik is the only one whose reproduction has been studied in detail. Its pregnancy lasts 172 days, one young is born at a time, and the birth weight is 600-800 g.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Their longevity is unknown but is probably in the range of 10-12 years.l</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These tiny creatures have some of the habits of deer. They are shy and elusive and generally rely on concealment to escape detection. Their first response to a predator is to freeze, and then to flee like hares - dashing off in a series of erratic, zigzag leaps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They live alone, in pairs, or in small family groups, but sometimes congregate in larger groups in thorn thickets. The species that have been studied most (dikdik and klipspringer) are strongly pair bonded. (A male, a female, and one or two young is typical, and a klipspringer rarely moves more than 5 m from its mate.) However, the royal and pygmy antelopes and the suni are more solitary in their behavior. Four-horned antelope are usually seen alone or in pairs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals feed mostly in the early morning and late afternoon Some species deposit dung and urine on particular sites. And they repeatedly daub secretions from glands in front of the eyes onto plant stems, where a sticky mass accumulates. Glands near the hooves mark the ground along frequently traveled pathways. Males also mark females with the scent, thus reinforcing the bond. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The four-horned antelope has a whistling call, which helps keep the family group together. Males repeat it frequently in hot weather. Gestation is 8-8.5 months. If taken young, they reportedly tame easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Much more research needs to be done before attempts are made to convince anyone to domesticate these antelope. There are likely to be considerable difficulties. Guinea pigs, rabbits, and giant rats can successfully be kept in cages or small enclosures, but most antelope probably cannot. Larger enclosures will be needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The food habits and general behavior of these small animals must be studied closely. They are strictly monogamous, and it may be necessary to keep them in pairs. Reproduction, growth, and general performance must become understood under different environmental and nutritional conditions. Mixing species is another aspect to be examined - whether these antelope can be kept with other species in the same enclosure (typical of livestock farming in most poor nations) is not known.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To settle such questions, representative species of microantelope should be gathered for comparative assessment. Researchers should focus on the animals' social structure, on husbandry methods for maintaining them over generations, and on how best to breed them. If the findings are promising, then a campaign to domesticate these antelope could be mounted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Throughout most of their ranges these animals are highly sought "bushmeats." The meat is lean and of extremely high quality. In Zaire's Ituri Forest, for example, pygmies net and kill large numbers of pygmy antelope, hanging the carcasses on sticks by the roadside for sale.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of their small size, these species might make good laboratory animals for ruminant studies. The dikdik, for instance, becomes a fully functioning ruminant at a body weight of about only 1.5 kg.2 However, their digestive physiology is quite different from that of cattle, sheep, and goats, which makes them atypical ruminants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given organized production, it is likely that dwarf-antelope pelts could become commercially important. North Africa exports the hides of medium-size antelopes to Europe for use in fine sueded leathers. Hides of the small species would almost certainly be in demand as well if a steady supply could be obtained as a by-product of meat production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Microantelope provide some of the finest game meat. They are small and perhaps tractable. Most are already widely eaten and are being eliminated over broad areas of their range. Turning them into a sustainable, economic food source could provide motivation for their conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These antelope can digest, and are adapted to, the indigenous forage over vast areas of Africa and South Asia. They are native to tropical habitats, where cattle and other livestock often grow poorly. They also appear to be resistant to trypanosomiasis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Some African peoples (for example, the Kalahari Bushmen) have superstitions or social injunctions that prohibit the eating of some of these species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small antelope are probably not as efficient as larger ruminants in digesting fiber: the retention time in the rumen may be too short. On the other hand, quickly digestible cell walls of lush green plants can be used efficiently.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The territorial behavior of most of these species may limit their rearing in large numbers under captive conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted, preliminary research on dwarf antelope husbandry is required. Specifically, studies should be conducted to assess:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Growth rates, feed efficiency, and reproductive rate;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Carcass quality;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Economics and the likely cost of production per animal unit; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Studies of digestion.4 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The few statistics available today on the use of wildlife as food are probably much below actual consumption. Most food consumption surveys record food obtained by hunting or trapping under the indiscriminate heading of "Bushmeat" and neglect to include the many small animals that are normally collected by children. In Africa, an amazing variety of wildlife is eaten, including all wild ungulates, primates, all cats, and many species of birds and reptiles.</P>
+<P ALIGN="JUSTIFY">Food and Agriculture Organization Ceres magazine</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All the world's people must begin to overcome in themselves - and even more so in their children - senseless taboos about what is edible and what is not. Only then can we stop today's universal animal-protein wastage. How ironic it would be, in this scientific age, for mankind to starve largely because of a bunch of old wives' tales, irational beliefs, silly associations, and the lack of a sufficient spirit of culinary and gustatory adventure.</P>
+<P ALIGN="JUSTIFY">Calvin W. Schwabe Unmentionable Cuisine </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iguana is really good, a thousand times better than chicken.</P>
+<P ALIGN="JUSTIFY">Omero Asinto, waiter Pochote Bar and Restaurant</P>
+<P ALIGN="JUSTIFY">Barranca, Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part VI : Lizards</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Large lizards have been important foods since prehistoric times and are still commonly hunted in parts of Asia, Africa, and Latin America.1 Some (such as the monitor lizards seen in markets in Indochina) are carnivorous species that may be difficult to feed and raise economically. However, the iguanas of the Americas offer promise as microlivestock. They are herbivorous and feed primarily on leaves, flowers, and fruits, including many that are too high in the trees to be gathered by man or by other livestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iguana meat is popular throughout much of Latin America, where consumers willingly pay more for it than for fish, poultry, pork, or beef. To fill the demand, several iguana species are hunted by rifle, slingshot, trap, and noose; they are even run down by trained dogs. Villagers (often small children) catch them for food for the family; professional hunters snare and sell them to vendors. Iguanas are hauled around in gunny sacks and wicker baskets by car, boat, horseback, and people on foot. In parts of El Salvador they have been known to arrive at the market by the truckload.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As a result of this indiscriminate hunting, iguanas are now steadily becoming more scarce, and the destruction of their habitat makes the situation even worse. At present, many parts of Latin America's tropical forests are being cleared. The green iguana in particular depends on trees, and as forests disappear its populations are destroyed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, iguanas are forest-edge species: they will grow well on ranches and farms as long as patches of trees are left standing. This offers the hope that they can be raised as microlivestock. They reproduce so prolifically that, in principle, populations can build up exponentially. Mature females, for example, may produce 30 or more eggs a year for up to 10 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the past few years, a notable research program in Panama and Costa Rica (see page 351) has laid the practical foundation for iguana farming. It has artificially incubated and raised thousands of green iguana hatchlings. With less than half a square meter of living space per animal, the hatchlings have grown as fast or faster than their wild counterparts. Unlike their kin in the wild - which in their first year of life suffer 95 percent mortality from birds, snakes, and other predators the captive-raised iguanas show almost 100 percent survival. This research project demonstrates that ranching iguanas both for food or for repopulating depleted habitats is feasible. In addition, experimental projects for farming green iguanas have begun in Curacao and El Salvador.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As livestock, lizards have advantages. Being cold-blooded they do not carry human diseases (except for those such as salmonella that result from gross mismanagement). They can be kept in captivity in fairly high densities without diseases breaking out. Although often aggressive in the wild, they coexist in dense populations with few problems as long as they are well fed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is an important conservation component as well. Farming these lizards may help check and may even reverse the downward trends of their populations by allowing large numbers to be released back to the wild at a size that inhibits predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are three alternatives for utilizing iguanas:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- To manage wild stocks as game animals;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- To raise iguanas on farms, like chickens and pigs; or</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- To raise young iguanas in captivity and then release them into the wild where they can grow to full size and later be harvested on a sustainable basis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the green iguana has so far received the most attention, two other Latin American species are in farming trials. Black iguanas (garrobos) are being raised experimentally in El Salvador and Costa Rica. And the omnivorous tegu lizard, which produces a valuable leather, is beginning to be farmed in Argentina and is briefly described opposite. Both iguana species are described in the following chapters. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TEGU</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The tegus (Tupinambis rufescens and T. teguixin) are large lizards of South America. They are highly prized for their skins, which are made into leather for handbags and similar items. Tegus are heavily exploited; on average, Argentina exports over one million skins a year - about $15 million worth. The 50-year-old tegu industry is estimated to support as many as 30,000 people, including tannery employees and people in rural areas who hunt the lizards full- or part-time. Poor agricultural conditions make farming difficult in the Chaco, and sale of a single tegu skin is worth more than a day's wages for a farmband. Some families also eat the tegu meat and use the fat for medicinal purposes. In many areas, the populations have already been driven to the verge of extinction. Husbandry, therefore, could be beneficial. Traders are hoping that captive operations run by families can eventually replace hunting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although usually associated with the arid regions of northern Argentina and Paraguay, the tegu's range actually covers much of South America - as far north as Colombia, including Trinidad and the Amazon basin. One species (T. rufescens) normally occurs in a dryland habitat, such as Argentina's Chaco region. It can occur in great numbers in pastures, probably because of the insects associated with cattle. But it also occurs in areas that are unsuitable for cattle. Some places where tegus are common are so dry that they can carry only a single cow in 10 hectares. There, farmers might find it profitable to raise tegus. This would maintain the native biological diversity while perhaps reducing the soil degradation that cattle cause.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other species (T. tegubixin) occurs in wet forests, such as those found in Argentina's Formosa Province.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tegus are scientifically interesting. Little is known about their biology, and basic studies are needed. They are not much eaten, but in some areas the tail is considered a delicacy. Indeed, deteriorating economic conditions are already making them more important as a food resource. Convincing campesinos that they can increase their cash income and their meat production by rationally exploiting these large lizards should not be difficult.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sustainable exploitation could also benefit tegu conservation. Large populations still exist in some areas in Argentina and Paraguay, but, overall, the species are declining. A welldesigned management project could ensure the maintenance and reestablishment of large populations where numbers have drastically decreased. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">33 Green Iguana</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g038a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, the green iguana (Iguana iguana) is consumed throughout Central America. It is already subject to heavy commercialization and its populations are plummeting. This is not likely to change: as human population increases, so does demand for iguana meat and eggs as well as for live iguanas, thousands of which are kept as house pets. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its herbivorous diet, inoffensive nature, and high reproductive potential, this reptile is a prime species for intensive management. Alert, curious, and social, it is easily tamed from birth. Given minimal protection during the reproductive season, large populations can build up, and animals can be maintained in simple facilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, although iguanas can be maintained as microlivestock, they may require three years to reach market size. Raising them to maturity entirely under captive conditions is thus probably uneconomic at present, when specimens can still be inexpensively (albeit often illegally) harvested from the wild. However, it has been found that if released into the wild, most will remain in nearby trees, especially if people erect simple feeding stations and keep them stocked with table scraps or weedy vegetation. This makes for very low-cost production during the years of waiting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given such findings, iguana farming has a promising future. With research, growth rates can undoubtedly be increased and maintenance costs reduced. Also, iguanas are becoming more valuable each year. Even now, farming them could be economic in some areas where wild iguanas are scarce, especially if the young are released into forested sites when they have grown to a size where mortality is low.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although green iguanas will happily graze pastures, they need trees. Iguana farming, therefore, provides a way to keep tropical forests standing while still providing people with meat and income. By growing lizards, farmers don't have to fell the forests to create space for growing food crops or cattle. Iguana farming thus gives an economic incentive to preserve the beleaguered tracts of remaining trees. It may even render reforestation economically attractive. And it may promote the use of shelterbelts and contour strips of trees in cattle-ranching areas. Today's researchers estimate that 200-300 kg of meat can be produced per year per hectare from iguanas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The green iguana can grow to more than 2 m long, but more than half of that length is in its whiplike tail. Adults of breeding size generally weigh 2-4 kg. The scaly skin is green, yellowish, or golden brown with dark markings; color is a function of age and reproductive stage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This large lizard is indigenous to a vast region stretching from Mexico to northern Brazil and Peru, including a number of Caribbean islands. In Mexico, it occurs in tropical forests along both coasts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Green iguanas were formerly abundant throughout Central America, but no longer. In the mangrove forests along Mexico's Pacific coast, for instance, only 5 percent of the former population remains. In Guatemala's Pacific lowlands, mere remnants are left. In El Salvador's jungles, the animals have declined to 1 percent of their former density. And in both Panama and Costa Rica, the species is now officially classified as endangered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The green iguana usually lives near water in tropical lowland forests. It thrives only as long as some trees remain. The forests may be either humid or seasonally dry. The animal normally inhabits the treetops, feeding on tender shoots and fruits in the canopy; few other herbivores can convert such forest foliage into food for humans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Like cattle and other herbivorous mammals, iguanas have a specialized digestive system with an enlarged fermentation chamber in which bacteria break down plant cells. Vegetation is converted into meat about as effectively as in cattle, but not as quickly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After reaching sexual maturity, at 2 or 3 years of age, females lay one clutch of 10 85 eggs each year. (For most specimens the average is probably about 35.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p349a.png"></center><br>
+ Native habitat of the green iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The animals are generally slow moving and lethargic when cold, but during the heat of the day they become extremely alert and can run, swim, and climb with speed and agility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They have a complex social structure and a defined annual reproductive cycle. Hatchlings adapt easily to captivity both when artificially incubated and when captured in the wild. However, captured adults, used to living free, are hard to keep in small enclosures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Green iguanas are used mainly for food. The meat tastes somewhat like chicken and in Latin America is typically cooked in a spicy stew. The eggs are also consumed. Small and leathery shelled, they are considered special delicacies and are said to cure various ailments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a sizable demand for live iguanas in the international pet trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Exploitation has been mainly for the flesh; the skins are wasted in most cases. However, given organized production, green iguana skin could perhaps become a farm by-product. It sells in the international reptile-leather market under the trade name "chameleon lizard." The hide is typically up to 20 cm wide. Thin and relatively fragile, it is glued to a fabric or cowhide backing to prevent it from tearing. The prime uses are for ladies' accessories, belts, wallets, and shoes. It is inappropriate for uses that involve flexure because the scales overlap and repeated flexing causes them to separate. The skin then becomes rough to the touch and loses its glossy finish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IGUANA MAMA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The program that now offers hope for raising green iguanas as microlivestock is the brainchild of zoologist Dagmar Werner. She began in 1983 by collecting 700 iguana eggs and then learning what to do with them "on the job."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through a combination of luck and intuition, coupled with determination, she discovered appropriate conditions for incubating the eggs on the first try - no less surprising because her incubators (dirt-filled wooden boxes warmed with light bulbs) were in an apartment in a high-rise building in Panama City. Nonetheless, most of the eggs hatched and the several hundred squirming young lizards were quickly trucked to a forest park near the Panama Canal. Here, for five years, assisted by a steady stream of enthusiastic Panamanian biology students, Wemer experimented with cages, feeds, facilities, breeding genetic selection, and the myriad aspects of management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These dedicated researchers eventually devised what might be considered a production line, and they hatched and raised tens of thousands of green iguanas, reduced the animals' infant mortality rate, and created the basic underpinnings for economic production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1988, administration for the project was shifted to neighboring Costa Rica, where Werner established another research farm as well as a fund-raising foundation. From there, she hopes to catalyze all Central America to take up iguana production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Her immediate goal is, paradoxically, to preserve the lizards by putting an iguana in every pot. That will help reduce the indiscriminate hunting that is taking these animals toward extinction in the wild.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Her system is based on setting up feeding stations in the woods and releasing iguanas at seven months, an age at which they are virtually immune to predators. Iguanas need trees, and her ultimate goal is to help save the vanishing rainforests. With profitable iguana farming, she hopes to persuade farmers to save the trees as homes for iguanas, rather than clearing them for crops and cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Iguana management and an international marketing system will protect, rather than exterminate, the iguana," Werner says. "I don't think iguana farming will stop deforestation. But I do think it will contribute a great deal." </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The iguana farming project in Panama and Costa Rica (see sidebar) provides a model for what might be done elsewhere. In its first five years of operation, the project raised more than 10,000 green iguanas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To create the farms, enclosures are constructed with sheet-metal wails sunk 30 cm in the ground.' Inside, the animals sleep in shelters made of bamboo and vegetation. Each shelter has an adjustable entrance slit through which young lizards can slither, but predators, which usually are larger, cannot. Most are set on stilts and food is served in the shade underneath. With this system, from 20 to 60 young iguanas are kept in an area of 10 m&Yacute; (0.5-0.17 m&Yacute; of land area per individual). In another "high-intensity" design, 30 hatchlings are kept in cages I m&Yacute; in size (only 0.05 m&Yacute; per individual).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The iguana farms also include an artificial nest consisting of a "tunnel" leading to a sand-filled egg-laying chamber. (Both tunnel and chamber are made of concrete blocks or other predator-safe material.) Female iguanas (at least in captivity) prefer this to digging their own tunnels, and it is an important advance in iguana breeding because it produces a hatching success of close to 100 percent. Recent versions require no human intervention: the eggs incubate and hatch by themselves and the hatchlings climb out of the nest through a hollow bamboo "pipe" and fall into plastic bags, which can be easily emptied twice a day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The iguanas are fed mixtures of broken rice meal, meat meal, bone meal, fish meal, papayas, bananas, mangos, avocados, and a variety of leaves and flowers. Each day they receive fresh-cut leaves from plants such as beans, mustard, or hibiscus. Hatchlings are raised to an age of 6-10 months, when they are big enough to be released into forests, farmland with scattered trees, or into village backyards with almost no vulnerability to predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">With each female producing an average of 35 eggs annually, these animals have inherently high reproductive potential. And if the young are protected from predators during their first few months, populations can build up rapidly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iguanas adapt well to second-growth forest and to backyard conditions and can feed on the leaves of fruit trees or timber trees while the farmer can harvest the fruits or wood. Unless grossly overstocked, they are unlikely to affect the productivity of the trees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These lizards may take three years to reach marketable size,2 and the cost of raising them to usable size entirely in captivity is currently greater than their market value as food. Less-expensive methods of raising the animals must be found if large-scale commercial iguana farming is to become economically feasible. The main problem is the high cost of the enclosures, not the cost of food. The food costs no more than that for raising a chicken to marketable size, but iguanas do not grow as fast as chickens. For smallholders the only cost of raising them is labor, and that is often unimportant. Free-ranging herbivorous lizards can damage home gardens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">For conservation purposes, the main need is to educate people throughout Latin America to the iguana's plight. For example, in Central America people catch pregnant females and cut out the eggs for food. (There is a widespread misconception that the females survive this brutality.) This is devastating to the iguana populations, yet by installing artificial nests, farmers could let the females live and still harvest the eggs. Moreover, people could eat half the eggs and incubate the other half to repopulate the trees around their farms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is also important to develop an understanding of iguana reproduction in the wild. At present, the longevity, growth rate, and age of sexual maturity are not well known. Such information would provide baseline data for creating conservation measures to reverse the depletion of this natural resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Further husbandry research is needed. Costs must be reduced. The effectiveness of artificial nests must be tested in village practice. Survival rates of captive-raised young after release must be studied. And harvesting and recruitment schemes should be developed to secure optimum exploitation of the repopulated forests. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">34 Black Iguana</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g039a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The work on green iguana husbandry may apply also to the black iguanas' (Ctenosaura similis, C. acanthura, C. hemilopha, and C. pectinata). These are similar lizards that live in dry habitats throughout Central America </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Exploitation of wild black iguanas for food began in ancient times and has continued in most places over hundreds of years without much harm to the natural populations. Until the 1970s, Latin Americans could obtain the meat and eggs with little effort, and the animals sold cheaply in city markets. In recent years, however, the lizards have become scarce and prices have risen sharply. For instance, in 1976 the central market of San Salvador was selling large specimens for the equivalent of 80 cents, but by 1979 prices were generally from three to six times as much. Today, black iguana meat costs more than fish, poultry, pork, or beef.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eating small game animals is deeply rooted in the traditions of Central America and cannot readily be changed by legislation or education. Despite official edicts, campesinos on a subsistence diet will not willingly forego the little meat they get by capturing and eating lizards. Moreover, legislation is seldom effective because there are too few enforcement officials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As with the green iguana, it seems likely that when the factors causing hatchling mortality are reduced, a large harvestable annual surplus can be produced. Black iguanas efficiently convert vegetation into high-grade protein suitable for human consumption. Young ones, however, are insectivorous and carnivorous rather than purely herbivorous, and during their first weeks of life may require a more expensive diet (perhaps meat scraps) than green iguanas require. Moreover, most insectivorous lizards require moving prey. They may or may not accept meat scraps as food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Black iguanas are smaller and more stocky than green iguanas, but weigh up to 3 kg. Their tails are spiny and short. The scales on the tail are enlarged, grow in spirals, and are sharp-pointed. Other than that (apart from being generally greyish black in color), the two animals are similar in appearance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The different black iguana species range from northern Mexico along both coasts of Central America to Panama and Colombia's Caribbean islands. Most tolerate moderate human presence well, often thriving around town garbage dumps and cemeteries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As recently as 1981, black iguanas were shipped to markets by the truckload. Today, they are generally limited or even absent over much of their original range. Nevertheless, they are still the major game animals across extensive areas of Central America. Many of those taken are gravid females, which is disastrous for the populations. Excessive insecticide spraying is also thought to be reducing their populations in some areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Black iguanas thrive in dry, open woodland. They particularly like rocky hillsides, for they depend for shelter on crevices, rock piles, or soft soil in which they dig burrows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These omnivores feed on foliage, flowers, and fruits, but also on insects and small vertebrates. Adults spend some of their time climbing trees, but they are much less arboreal than green iguanas. Hatchlings are initially terrestrial but have a mostly arboreal stage in their early weeks of life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Females lay one clutch of 20-90 eggs each year. The eggs are much smaller than those of the green iguana and therefore are not as popular a food. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p357a.png"></center><br>
+ Distribution of the black iguana.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These lizards live in burrows or in holes in trees. A typical burrow has several entrances and is 1-2 m long. Several females may combine efforts to form a complex communal burrow with several individual nest chambers. They are such diligent diggers that many are caught while absorbed in the task of adding a new room.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In some places, even where they are not common, black iguanas are still intensively hunted. Because their meat is valuable, the reward justifies the considerable effort involved in finding and killing them. Hence, where populations are so depleted that organized hunting is unprofitable, the animals are still subjected to relentless destruction by individuals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Farming black iguanas is a novel idea. However, it is not a foolish one. In 1981 the Centro de Recursos Naturales (CENREN) in El </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Salvador started a black iguana farming project. Since then, its researchers have collected data on growth rates, feeding patterns, and the maintenance and reproduction of captive adults. The program offers some promise of maintaining breeding stock in large outdoor enclosures, of producing large numbers of hatchlings, and of restocking depleted areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">OTHER IGUANAS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Other iguanas that deserve consideration for husbandry include the rock (rhinoceros) iguana (Cyclura cornuta), a herbivorous lizard of the Antillean region. This has been raised in considerable numbers at the National Zoo of Santo Domingo, Dominican Republic. Captive-bred specimens have reproduced at the age of 32 months, average clutch size has been about 15, and the average incubation time has been 82 days (at 31&Yacute;C). The innate tameness of these island iguanas renders them better adapted for captive rearing than either the green or the black iguana, and their greater size is an advantage as well. On the other hand, the length of time required to reach maturity, and the relatively small egg clutch (about half that of the green iguana and one-third that of the black iguana) are definite disadvantages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A related species, Iguana delicatissima, also deserves research and conservation attention. It occurs in the Leeward Islands and Martinique, and (as its specific name implies) is even better eating than the green iguana.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Latins believe that various ailments are cured or benefited by the flesh of these lizards, so they willingly pay much more for their meat than they would for equivalent amounts of other meats. In most places where the two occur together, the black iguana is preferred over the green iguana.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Compared with green iguana, the black iguana reproduces readily in captivity and has an even higher reproductive potential (averaging 43 eggs per clutch). It has the additional advantage that it thrives in deforested and altered habitats. It can survive near human settlements despite the attacks of dogs and cats, and it attains dense populations in suburban lots or open spaces. (It survives even downtown in cities such as Managua, but not in dense populations because dogs, cats, and humans take so many.) Hence, even in towns and cities, there are habitats capable of supporting it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black iguanas will feed on weedy vegetation or garbage, and adults seem easier to maintain in captivity than their green iguana counterparts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The long delay (probably at least two years) before the animals reach marketable size might make it difficult for the grower to compete with common meats such as poultry or fish. Certain parasitic worms can make the flesh inedible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although smaller than green iguanas, black iguanas are much more aggressive and will defend what they perceive to be their territory. They can inflict a painful bite. They also tend to escape from captivity more readily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, these omnivores depend on animal matter during part of their life cycle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The biology of the black iguana deserves much more study.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Management techniques developed for the green iguana should be tested for their applicability for black iguana species. Harvesting and recruitment schemes must be developed to create sustainable populations in the wild. The specific needs for feeding the young also need to be addressed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I am convinced that in the Third World, it is only when poor people are assured of their livelihood that they will help us to safeguard their natural environments. So long as people remain hungry, it is very difficult to talk to them about conservation. As a result, I believe that development and conservation are inseparable. Only when conservation takes on a dimension of helping the poor, the downtrodden, the destitute, will it have an enduring impact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M.S. Swaminathan International Union for Conservation of Nature and Natural Resources</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I suspect that wildness is an inherited characteristic as was found for the turkey by Starker Leopold. So in attempting domestication one should expect to have difficulty until there are enough animals that you can select breeding stock for quietness and tractability.</P>
+<P ALIGN="JUSTIFY">Ian McTaggart Cowan Emeritus Professor of Zoology</P>
+<P ALIGN="JUSTIFY">University of British Columbia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle will never be extinct for the simple reason that man eats cattle. The best way to preserve wild species is by demonstrating that they, too, can be a valuable resource.</P>
+<P ALIGN="JUSTIFY">Ernie Matteram</P>
+<P ALIGN="JUSTIFY">New York Times Magazine</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wildlife utilization should be considered a legitimate form of land use, just as much as livestock husbandry. In fact, what has happened in the past is that Man has domesticated a limited number of animals, mainly in the temperate zones, while overlooking a considerable potential of other animals, which could be domesticated or used with equal validity.</P>
+<P ALIGN="JUSTIFY">Antoon De Vos </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part VII Others</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As noted in the preface, this report by no means exhausts all the microlivestock possibilities. Lack of space and time precludes discussion of creatures such as edible insects, snails, worms, frogs, turtles, and bats, which in some regions are highly regarded foods. Similarly, we have not included fish, shrimp, and other aquatic life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is not to say that these are less worthy of consideration. The decision to leave them out was arbitrary, but with several recent breakthroughs in tropical beekeeping it seems prudent to include bees. Accordingly, the final chapter of this book describes the smallest livestock of all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bees are one of the most promising microlivestock. They forage on flowers that are otherwise little utilized and produce honey, wax, and other products of high value. They are important as plant pollinators and can greatly increase the production of some crops. Bees can be kept virtually anywhere with little disruption of other activities, and they are easily available. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">35 Bees</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="g040a.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of all the livestock reviewed in this publication, bees are the smallest, the least demanding of space, probably the most familiar, and perhaps the most easily adapted to worldwide rural development efforts. For all that, however, they are an often forgotten component in agricultural programs. This is unfortunate because bees can be particularly valuable to tropical countries, providing pollination of crops, useful products, and a premium source of income.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Almost every village in every tropical country traditionally has had a beekeeper or two. Most use "seat-of-the-pants" methods and "rustic" hives, and this generally leads to low yields and inefficiencies. Today, numerous innovative methods and appropriate equipment are coming available. Many are still not widely known; however, their importance is slowly being recognized. Indeed, some developing countries are already turning bees into a valued natural resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For example, in less than 10 years Kenya has become self-sufficient in honey production and - despite increased local consumption - is now exporting. In seven years, Papua New Guinea has met its local honey requirements and now also exports its surplus. In only four years, Thailand increased yearly production from practically nothing to more than 1,000 tons. In Brazil, beekeeping is more widespread and production greater than before the outbreak of the African honey bee. These achievements can be largely attributed to the promotion of innovative equipment, modern beekeeping techniques, and extension support for small-scale beekeepers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">APPEARANCE AND SIZE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey bees are generally easily recognized and need no description here. The major species and subspecies are all roughly similar in appearance and size. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DISTRIBUTION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Among several hundred species of bees that store honey and pollen in harvestable amounts, only two "social" species, Apis mellifera and Apis cerana, produce multiple combs and can be kept in hives.' Given adequate forage and proper management, they can build up a honey surplus that can be harvested without harming their colonies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apis mellifera, the most widely distributed and exploited honey bee, comes from Europe and Africa. The subspecies from Europe (especially the Italian type, A. mellifera ligustica) is normally preferred because of its docility and high honey yields. It is now the predominant honey bee throughout the temperate zones of Europe, North America, Australasia, and China. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of the many subspecies in Africa, A. mellifera adansonii and A. mellifera scutellata have the widest native ranges. The latter was accidently released in Brazil in 1957. It has become naturalized and has dominated the European bees formerly kept by beekeepers. By l990, it had spread northwards to the southernmost areas of the United States and southwards deep into Argentina.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The docile Asian hive bee, A. cerana, is found in Asia from the Middle East to Japan and as far south as Indonesia. Although it produces much less honey per hive than A. mellifera, its overall production in many Southeast Asian countries may be greater.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STATUS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey bees do not face extinction. However, genetic diversity is disappearing due to loss of habitat, insecticides, displacement by massproduced, genetically uniform queens and exotic breeds, destructive harvesting, and the spread of diseases and pests such as protozoans, bacteria, insects, and mites.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HABITAT AND ENVIRONMENT</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey bees can exist in locations from deserts to rainforests and from near the Arctic to the tropics. They occur wherever there is nectar, pollen, tree resin (for nest building), shelter, and a little water. Heat, drought, and especially rain and humidity may curtail their activities, but a well-managed colony can survive periods of extreme adversity. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BIOLOGY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey bees live in rigidly hierarchical colonies. Normally there is a  single queen. After mating, she begins laying hundreds of eggs a day.  Those that are fertilized become sterile females, called workers; those  that remain unfertilized develop into males (drones), whose only role is  to fertilize future queens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After two or three years the queen, worn-out, starts laying fewer  and fewer eggs, and the colony may replace her. At that time a few  female larvae are raised on royal jelly, a nutritious, little-understood  secretion that causes them to develop into queens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Workers perform different tasks as they mature. Young ones tend  the queen, guard the hive, and raise the larvae. Older ones, comprising  the vast majority of a colony's population, gather pollen and nectar and  water. Pollen provides the protein and fats, and the nectar, converted  into honey in the bee's body, provides carbohydrates to feed the colony.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEHAVIOR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey bee activities are dictated by weather, availability of food,  genetics, and the overall strength of the colony. They are mediated by  chemical interactions between the queen and the workers that control  almost all behavior.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the Asian and European hive bees are relatively docile, most  of the African subspecies are unpredictable and may defend their  colonies in great numbers and with great persistence. The threat of  "killer bees" has been greatly exaggerated, however. Africans have  provided them nests and hives - and harvested their honey - for  thousands of years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Occasionally, large numbers of the bees in a colony split off from  their nest or hive. They usually cluster on a nearby tree or building,  calmly waiting for "scouts" to find a suitable new home. These  homeless swarms can be captured and will readily move into a hive  the simplest and cheapest way for beekeepers to acquire a colony.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">USES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Honey and beeswax are two of nature's best known and most  valuable products. Honey can be employed in hundreds of foods. It is  widely used in baking because, in addition to its flavor, it retains  moisture better than sugar or syrup, and the product keeps longer. Honey-based alcoholic beverages are popular in many parts of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beeswax also is used in many products, including candles, lubricants, polish, waterproofings, soaps, cosmetics, and electronics. Beeswax can be locally important for `'lost-wax" metal-casting and sculptures as well as batik-dyed clothing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both bee pollen and royal jelly are used in cosmetics and can be eaten. Bee venom is used medicinally, particularly in Europe and the developing world. Bee larvae are eaten raw or fried in many parts of Asia and Africa and are considered a delicacy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUSBANDRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Keeping bees means managing a colony so that it produces surplus honey or wax. Specifically this requires:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Providing a suitable hive;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Obtaining bees by collecting a swarm, transferring a wild colony, or purchasing a colony complete with an active queen;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Maintaining the colony free from natural enemies in an area that allows it to produce excess honey; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Harvesting the excess honey without weakening the colony or causing it to flee (abscond).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADVANTAGES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Few other livestock enterprises require less capital, less space, or less attention. Moreover, scarcely any other provides higher quality, more marketable products.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beekeeping is a respected and traditional activity in most areas of the world. It promotes self-reliance and requires little, if any, land or money. It is an easy-entry cottage industry that can be started with minimal equipment or training. It can be done by any member of a family as it requires no special strength or size. It is especially appropriate for increasing women's income in the many areas where men are away working.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beekeeping is suited to remote areas where many agricultural enterprises are at a competitive disadvantage because their products are bulky and far from the markets. Honey, wax, pollen, and other bee products can all be sold far from their point of origin, have high monetary value for their weight, and generally find a ready market. Local honeys often command premium prices (in part because many of them are considered medicinal). In addition, beekeeping encourages people to remain in rural areas rather than move to the city in search of an income.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pollination increases the productivity of many crops, and therefore a few hives can boost local food production. By rotating hives among farmers' fields and orchards, a beekeeper performs a valuable service.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beekeeping is also an important adjunct to reforestation and desert reclamation projects. It can provide income during the long wait for the trees to reach marketable size. Many forests are potential reservoirs of honey and other products. In some cases, the bees also enhance the fruitfulness and standing value of forests. They also increase pollination in tree-seed orchards and tree nurseries. And in newly established forests, bees improve reseeding potential. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">BETTER BEEHIVES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">So many hives have been developed in recent years that a design now exists for almost any level of expertise. One of the most important for Third World beekeeping is the top-bar hive. This crate-like box, derived from an ancient Greek design, incorporates modern beekeeping principles but adds the innovation of sloping sides. Beneath its lid are removable boards (top bars) from which the bees hang the combs (because the sides are sloping the bees do not attach the edges of the comb to them). By lifting a top bar, the comb can be inspected and handled - and the honey harvested - with little disturbance to the colony.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This simple hive can make beekeeping accessible to even the poorest people. It is easy to build and use, and can be locally constructed from scrap lumber. It is well suited for raising most types of honey bees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More elaborate and productive is the African long hive. In addition to having top bars, this square-sided box has removable frames within which the bees build their comb.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most elaborate is the Langstroth hive - the type most common in temperate zones.* These yield the most honey. They can be made only where there are facilities for precise carpentry, where durable, nonwarping parts are available, and where there are good extension services to aid and assist beekeepers. Although traditional Langstroth hives are demanding to build and maintain, simplified designs have been created for use in developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STINGLESS BEES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">By far the most common bees in the tropics, perhaps in the  world, are bees that cannot sting. Their stingers are so akophied  as to be essentially nonexistent (but some can deliver a pretty  fierce bite). They live in colonies and store their honey in wax  pots, some as large as egg cups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Stingless bees can be abundant. In a two-block area in  downtown Panama City, 150 nests have been counted. However,  many species depend on trees and their populations are  plummeting as more and more tropical forests are felled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like honey bees, stingless bees have been "domesticated." For  thousands of years in the tropical Americas, Indians have raised  them in special hives made out of logs, gourds, clay pots, and  other simple containers. Cortes reported in 1519 that Indians on  the island of Cozumel, the now popular tourist spot off the east  coast of Yucatan, practiced beekeeping. That was almost 300 years  before the European honeybee was introduced. A popular Mayan  drink was honey wine, and Mayan beekeepers carved stone  earplugs to keep these bees out of their ears.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Honey from stingless bees has less sugar than normal honey.  However, it is usually more tasty. It is used throughout the  tropics: the Americas, Central Africa, and Southeast Asia, for  instance. Normally, the nests are just robbed, which devastates  the bees because the queen cannot fly, and when she is disturbed  the colony dies. In some areas people open a little hole in the nest.  By putting in a plug, they can then harvest honey a couple of  times a year without destroying the colony.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, a few scientists are reconsidering stingless beekeeping.  In the state of Maranhao in Brazil, an area of crushing poverty,  biologist Warwick Kerr is harnessing stingless bees. He began  after learning that peasants were spending a third of their meager  incomes buying sugar. As part of his experiments, he keeps 60  hives stacked in his garage on the outskirts of the city of San Luis.  (A notable feature of these bees is that there is no prohibition  against keeping them in populated areas.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kerr has found that stingless bees can be made to produce well.  After years of experimenting with different-sized boxes, he can  now obtain more than 4.5 lifers of honey per hive per year. He  reports that the stingless bees are easy to maintain, and can be  raised by poor peoole without land or equipment.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIMITATIONS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Compared to raising four-footed livestock, beekeeping is inexpensive and fairly trouble free, but it is not without problems. Many things can go wrong, and include, for example:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Losses. Bees are susceptible to various predators, pests, and diseases. Although ways to avoid or control most afflictions are available, once a colony becomes infested it may have to be destroyed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Theft. Hives or combs - usually kept in secluded areas - that are full of honey are tempting targets and may be stolen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Swarming and absconding. Some or all of the bees may leave a hive and start a new nest, taking even the honey with them.2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Bad management. Beekeeping requires certain skills and knowledge, and sometimes frequent attention (such as when the colony is stressed, diseased, or swarming).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Lack of equipment. Beekeepers need hives, smokers (to quiet and repel the bees), hive tools, and - advisable but not absolutely necessary - gloves and a veil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Inadequate storage. Some areas lack the knowledge or the bottles in which to store liquid honey.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Pesticides and herbicides. Nectar- and pollen-collecting bees are vulnerable to insecticides, which farmers may apply (often inappropriately) at the time their crops are flowering. Herbicides can destroy important sources of bee forage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Neighborhood concerns. Bees can sting people and livestock. Although wild bees (and other insects) are the principal culprits, the beekeeper is often blamed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Stressful conditions. When rainfall, aridity, heat, or cold are excessive, bees often cannot produce surplus honey.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RESEARCH AND CONSERVATION NEEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Surprisingly, much remains to be learned about the natural science of bees. Although some of the research requires sophisticated equipment and facilities, much can (or must) be performed locally by beekeepers because many factors - such as colony behavior, foraging habits, and microclimatic adaptation - depend on the local conditions. This research may include the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Adaptation. The provision of locally adapted bee varieties is an important basis for developing advanced beekeeping. This can be done by selecting an appropriate local queen. Further, local breeding of queens and workers lessens the probability of importing exotic diseases and pests. Recent developments promise to move the mass production of queens and workers from the realm of high technology to common practice.4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Integration. Continued developments in beekeeping cannot succeed without research, promotion, education, training, and extension services. These are essential for integrating beekeeping with agriculture and reforestation efforts. Thus, descriptions of agronomic plants should always include pollination requirements as well as nectar and pollen potentials. Planting nectar- and pollen-producing firewood species would increase the number of bees, which would in turn help ensure forest survival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Bee plants. There is still much to be understood about the relative qualities that different plants bring to beekeeping. Recently, many valuable bee-forage plants have been identified.5 These deserve special consideration in any reforestation or beautification projects. Broad introduction of these plants may also encourage beekeeping that could produce high-value "specialty" honeys or ensure more continuous production of honey. There may also be a place for "bee farms," where every plant is bee forage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- New bee species. Nontraditional species of Apis as well as other members of the bee family (such as Anthophora, Bombus, Megachilae, Nomia, Osmia, Xylocopa, and especially Trigona and Melipona, which are stingless) should be studied to determine their role in pollination and - for some species - their further exploitation for honey. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendixes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">A Selected Readings</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A small selection follows of books and articles that are not too  difficult to locate and that will help readers explore each topic further. Obscure documents are accompanied by an address from which readers can obtain a reprint or photocopy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GENERAL</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grzimek, B. 1975. Animal Life Encyclopedia. Vol. 1-13. Van Nostrand Reinhold  Company, New York.</P>
+<P ALIGN="JUSTIFY">Robbins, C.T. 1983. Wildlife Feeding and Nutrition. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICROBREEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mason, I.L. 1988. A World Dictionary of Livestock Breeds, Types and Varieties.  Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK. Microcattle</P>
+<P ALIGN="JUSTIFY">Barnard, J.P. and J.P. Venter. 1983. Indigenous and Exotic Beef Cattle in South West  Africa - A Progress Report. Available from Department of Agriculture and Nature  Conservation, PB 13184, Windhoek 9000, Namibia. (Sanga)</P>
+<P ALIGN="JUSTIFY">Cheng Peilieu. 1984. Livestock Breeds of China. FAO Animal Production and Health  Paper 46. Food and Agriculture Organization of the United Nations, Rome. 217 pp.</P>
+<P ALIGN="JUSTIFY">Cole, H.H. and W.N. Garrett, eds. 1974. Animal Agriculture. 2nd edition. W.H. Freeman  and Company, San Francisco, California, USA.</P>
+<P ALIGN="JUSTIFY">Epstein, H. and l.L. Mason. 1984. Cattle. Pages 6-27 in Evolution of Domesticated  Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Felius, M. 1985. Genus Bos: Cattle Breeds of the World. MSD-AGVET, Merck and Co.,  Rahway, New Jersey. 234 pp.</P>
+<P ALIGN="JUSTIFY">Gryseels, G. 1980. Improving Livestock and Farm Production in the Ethiopian Highlands:  Initial Results. ILCA study. International Livestock Centre for Africa, Addis Ababa,  Ethiopia.</P>
+<P ALIGN="JUSTIFY">ILCA. 1979. Trypanotolerant Livestock in West and Central Africa. Vol. 1, General Study.  International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">Joshi, N.R. and R.W. Phillips. 1953. Zebu Cattle of India and Pakistan. FAO Agricultural  Study No. 19. Food and Agriculture Organization of the United Nations, Rome. 297 pp.</P>
+<P ALIGN="JUSTIFY">Joshi, N.R., E.A. McLaughlin, and R.W. Phillips. 1957. Types and Breeds of African  Cattle. FAO Agricultural Study No. 37. Food and Agriculture Organization of the  United Nations, Rome. 297 pp. </P>
+<P ALIGN="JUSTIFY">Koger, M., T.J. Cunha, and A.C. Warnick, eds. 1973. Crossbreeding Beef Cattle. Series 2. University of Florida Press, Gainesville, Florida, USA.</P>
+<P ALIGN="JUSTIFY">Martinez Balboa, A. 1980. La Ganaderia en Baja California Sur. Vol. 1. Editorial J.B. La Paz, BCS: Mexico. 229 pp. (Criollo)</P>
+<P ALIGN="JUSTIFY">Mason, I.L. and J.P. Maule. The Indigenous Livestock of Eastern and Southern Africa. Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK.</P>
+<P ALIGN="JUSTIFY">Maule, J.P. 1989. The Cattle of the Tropics. Centre for Tropical Veterinary Medicine, Edinburgh University, Edinburgh, UK.</P>
+<P ALIGN="JUSTIFY">McDowell, L.R., ed. 1985. Nutrition of Grazing Ruminants in Warm Climates. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">McDowell, R.E. 1972. Improvement of Livestock Production in Warm Climates. W.H. Freeman and Company, San Francisco, California, USA.</P>
+<P ALIGN="JUSTIFY">McDowell, R.E. 1983. Strategy for Improving Beef and Dairy Cattle in the Tropics. Cornell International Agricultural mimeo. Cornell University, Ithaca, New York.</P>
+<P ALIGN="JUSTIFY">Miller, W.J. 1979. Dairy Cattle Feeding and Nutrition. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">National Research Council. 1980. Animal Science in China. CSCPRC Report No. 12. National Academy Press, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">National Research Council. 1981. Effect of Environment on Nutrient Requirements of Domestic Animals. National Academy Press, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Perry, T.W. 1980. Beef Cattle Feeding and Nutrition. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">Rollinson, D.H.L. 1984. Bali cattle. Pages 28-34 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Rouse, J.E. 1970. World Cattle. Vol. 1, Cattle of Europe, South America, Australia, and New Zealand. University of Oklahoma Press, Norman, Oklahoma, USA.</P>
+<P ALIGN="JUSTIFY">Rouse, J.E. 1970. World Cattle. Vol. 2, Cattle of Africa and Asia. University of Oklahoma Press, Norman, Oklahoma, USA.</P>
+<P ALIGN="JUSTIFY">Rouse, J.E. 1973. World Cattle. Vol.3, Cattle of North America. University of Oklahoma Press, Norman, Oklahoma, USA.</P>
+<P ALIGN="JUSTIFY">Rouse, J.E. 1977. The Criollo-Spanish Cattle in the Americas. University of Oklahoma Press, Norman, Oklahoma, USA. 303 pp.</P>
+<P ALIGN="JUSTIFY">Shirley, R.L. 1986. Nitrogen and Energy Nutrition of Ruminants. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">Thrower, W.R. 1954. The Dexter Cow. Revised third impression, 1980. The Spaulding Press, Bethel, Vermont, USA</P>
+<P ALIGN="JUSTIFY">Williamson, G. and W.J.A. Payne. 1965. An Introduction to Animal Husbandry in the Tropics. 2nd edition. Longman, London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microgoat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Acharya, R.M. 1982. Sheep and Goat Breeds of India. FAO Animal Production and Health Paper No. 30. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY">Ademosun, A.A. 1985. Capra spp.: The Emblem of Anarchy - The King-Pin of Man's Pastoral Life. Ife Lectures No. 3. University of Ife, Ile-Ife, Nigeria.</P>
+<P ALIGN="JUSTIFY">Cheng Peilieu. 1984. Livestock Breeds of China. FAO Animal Production and Health Paper 46. Food and Agriculture Organization of the United Nations, Rome. 217 pp.</P>
+<P ALIGN="JUSTIFY">Cole, H.H. and W.N. Garrett. 1980. Animal Agriculture. W.H. Freeman and Company, San Francisco, California, USA.</P>
+<P ALIGN="JUSTIFY">Copland, J.W. 1985. Goat Production and Research in the Tropics. Proceedings of a workshop held at the University of Queensland, Brisbane, Australia, February 6-8, 1984. Australian Centre for International Agricultural Research (ACIAR) Proceedings Series No. 7, 118 pp.</P>
+<P ALIGN="JUSTIFY">Devendra, C. and M. Burns. 1983. Goat Production in the Tropics. Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK. 83 pp.</P>
+<P ALIGN="JUSTIFY">Devendra, C. and G.L. McLeroy. 1983. Goat and Sheep Production in the Tropics. 2nd edition. Longman, London. 271 pp.</P>
+<P ALIGN="JUSTIFY">Devendra, C. and J.E. Owen. 1983. Quantitative and qualitative aspects of meat production from goats. World Animal Review (FAO) 47:19-29.</P>
+<P ALIGN="JUSTIFY">Fielding, D. Goat-keeping in Mauritius. Sonderdruck aus Zeitschrift fur Tierzuchtung und Zuchtungsbiologie. Vol 97(1)(1980):21-27.</P>
+<P ALIGN="JUSTIFY">Gall, C., ed. 1981. Goat Production. Academic Press, London. 619 pp.</P>
+<P ALIGN="JUSTIFY">Haenlein, G.F.W. and D.L. Ace. 1983. Goat Extension Handbook. University of Delaware Cooperative Extension Service, Newark, Delaware, USA.</P>
+<P ALIGN="JUSTIFY">Husnain, H.V. 1985. Sheep and Goats in Pakistan. FAO Animal Production and Health Paper No. 56. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY">International Development Research Centre (IDRC). Small Ruminant Production Systems in South and Southeast Asia, C. Devendra, ed. Proceedings of a workshop held in Bogor, Indonesia, October 6-10, 1986, cosponsored by the Small Ruminant Collaborative Research Support Program. Ottawa, Ontario, Canada.</P>
+<P ALIGN="JUSTIFY">ILCA. 1983. Peste des Petits Ruminants (PPR) in Sheep and Goats, D.H. Hill, ed. Proceedings of the International Workshop held at the International Institute of Tropical Agriculture (IITA), Ibadan, Nigeria, September 24-26, 1980. International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">ILCA. 1985. Sheep and Goats in Humid West Africa. Proceedings of the International Workshop held in Ibadan, Nigeria, January 23-26, 1984. International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">ILCA. 1979. Trypanotolerant Livestock in West and Central Africa. Vol. 1, General Study. International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">King, J.W.B., ed. 1988. Directory of Research on Sheep and Goats. Commonwealth Agricultural Bureaux International, Wallingford, Oxford, UK. 271 pp.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. 1981. Breeds. Pages 57-110 in Goat Production, C. Gall, ed. Academic Press, London.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. 1984. Goat. Pages 85-99 in Evolution of the Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. and J.P. Maule. 1960. The Indigenous Livestock of Eastern and Southern Africa. Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK.</P>
+<P ALIGN="JUSTIFY">National Research Council, 1980. Animal Science in China. CSCPRC Report No. 12. National Academy Press, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Phillips, R.W., R.G. Johnson, and R.T. Moyer. 1945. The Livestock of China. U.S. Department of State Publication No. 2249, Far Eastern Series 9. U.S. Department of State, Washington, D.C. 174 pp.</P>
+<P ALIGN="JUSTIFY">Proceedings of the 3rd International Conference on Goat Production and Disease. January 10-15, 1982, University of Arizona, Tucson, Arizona. Copies can be obtained from Kent Leach, Dairy Goat Journal, P.O. Box 1808, Scottsdale, Arizona 85252, USA. </P>
+<P ALIGN="JUSTIFY">Williamson, G. and W.J.A. Payne. 1965. An Introduction to Animal Husbandry in the Tropics. 2nd edition. Longman, London.</P>
+<P ALIGN="JUSTIFY">Wilson, R.T., T. Murayi, and A. Rocha. 1989. Indigenous African small ruminant strains with potentially high reproductive performance. Small Ruminant Research 2: 107-117.</P>
+<P ALIGN="JUSTIFY">Winrock International, 1984. Sheep and Goats in Developing Countries. Winrock International Technical Paper. The World Bank, Washington, D.C. </P>
+<P ALIGN="JUSTIFY">Acharya, R.M. 1982. Sheep and Goat Breeds of lndia. FAO Animal Production and Health Paper No. 30. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY">Carles, A.B. 1983. Sheep Production in the Tropics. Oxford University Press, London. 213 pp.</P>
+<P ALIGN="JUSTIFY">Cheng Peilieu. 1984. Livestock Breeds of China. FAO Animal Production and Health Paper 46. Food and Agriculture Organization of the United Nations, Rome. 217 pp. Cole, H.H. and W.N. Garrett. 1980. Animal Agriculture. W.H. Freeman and Company,</P>
+<P ALIGN="JUSTIFY">San Francisco, Calffornia, USA.</P>
+<P ALIGN="JUSTIFY">Devendra, C. and G.L. McLeroy. 1983. Goat and Sheep Production in the Tropics. </P>
+<P ALIGN="JUSTIFY">Longman, London. 271 pp.</P>
+<P ALIGN="JUSTIFY">Fitzhugh, H.A. and G.E. Bradford, eds. 1983. Hair Sheep of Western Africa and the Americas. Westview Press, Boulder, Colorado, USA. </P>
+<P ALIGN="JUSTIFY">Husnain, H.V. 1985. Sheep and Goats in Pakistan. FAO Animal Production and Health Paper No. 56. Food and Agriculture Organization of the United Nations, Rome. International Development Research Centre (IDRC). 1987. Small Ruminant Production Systems in South and Southeast Asia, C. Devendra, ed. Proceedings of a workshop held in Bogor, Indonesia, October 6-10, 1986, cosponsored by the Small Ruminant Collaborative Research Support Program. IDRC, Ottawa, Canada. </P>
+<P ALIGN="JUSTIFY">ILCA. 1983. Peste des Petits Ruminants (PPR) in Sheep and Goats, D.H. Hill, ed. Proceedings of the International Workshop held at the International Institute of Tropical Agriculture (IITA), Ibadan, Nigeria, September 24-26, 1980. International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">ILCA. 1985. Sheep and Goats in Humid West Africa. Proceedings of the International Workshop held in Ibadan, Nigeria, January 23-26, 1984. International Livestock Centre for Africa, Addis Ababa, Ethiopia.</P>
+<P ALIGN="JUSTIFY">ILCA. 1979. Trypanotolerant Livestock in West and Central Africa. Vol. 1, Ceneral </P>
+<P ALIGN="JUSTIFY">Study. International Livestock Centre for Africa, Addis Ababa, Ethiopia. </P>
+<P ALIGN="JUSTIFY">King, J.W.B., ed. 1988. Directory of Research on Sheep and Goats. Commonwealth</P>
+<P ALIGN="JUSTIFY">Agricultural Bureaux International, Wallingford, Oxford, UK. 271 pp.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. 1980. Prolific Tropical Sheep. FAO Animal Production and Health Paper No. 17. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY">Mason, l.L.1967. Sheep Breeds of the Mediterranean. Food andAgriculture Organization of the United Nations. Commonwealth Agricultural Bureaux, Farnham Royal, UK.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. and J.P. Maule. 1960. The Indigenous Livestock of Eastern and Southern Africa. Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK. Phillips, R.W., R.C. Johnson, and R.T. Moyer. 1945. The Livestock of China. U.S. Department of State Publication No. 2249, Far Eastern Series 9. U.S. Department of State, Washington, D.C. 174 pp.</P>
+<P ALIGN="JUSTIFY">Ponting, K. 1980. Sheep of the World. Blandford Press, Ltd., Poole, Dorset, UK.</P>
+<P ALIGN="JUSTIFY">Ryder, M.L. 1984. Sheep. Pages 63-85 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Ryder, M.L. 1983. Sheep and hIan. Monograph. Duckworth, London.</P>
+<P ALIGN="JUSTIFY">Terrill, C.E. 1970. Sheep breeds of the world. (505 breeds). USDA mimeo. U.S. Department of Agriculture, Washington, D.C. 163 pp.</P>
+<P ALIGN="JUSTIFY">Whitehurst, V.E., R.M. Crown, R.W. Phillips, and D.A. Spencer. 1947. Productivity of Columbia sheep in Florida and their use for crossing with native sheep. Florida Agricultural Experimental Station Bulletin 429. 34 pp.</P>
+<P ALIGN="JUSTIFY">Williamson, G. and W.J.A. Payne. 1965. An Introduotion to Animal Husbandry in the Tropics. 2nd edition. Longman, London. </P>
+<P ALIGN="JUSTIFY">Wilson, R.T., T. Murayi, and A. Rocha. 1989. Indigenous African small ruminant strains with potentially high reproductive performance. Small Ruminant Research 2: 107-117. Winrock International. 1984. Sheep and Goats in Developing Countries. Winrock International Technical Paper. The World Bank, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Yaltin, B.C. 1979. The Sheep Breeds of Afghanistan, lran, and Turkey. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Micropig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cheng Peilieu. 1984. Livestock Breeds of China. FAO Animal Production and Health Paper 46. Food and Agriculture Organization of the United Nations, Rome.</P>
+<P ALIGN="JUSTIFY">Clutton-Brock, J. 1981. Domesticated Animals from Early Times. British Museum (Natural History), London.</P>
+<P ALIGN="JUSTIFY">Cole, H.H. and W.N. Garrett. 1980. Animal Agriculture. W.H. Freeman and Company, San Francisco, Calffornia, USA.</P>
+<P ALIGN="JUSTIFY">Cunha, T.J. 1977. Swine Feeding and Nutrition. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">Epstein, H. and M. Bichard. 1984. Pigs. Pages 145-162 in Evolution of Domesticated </P>
+<P ALIGN="JUSTIFY">Animals, I.L. Mason, ed. Longman, London. </P>
+<P ALIGN="JUSTIFY">Krider, J.L., J.H. Conrad, and W.E. Carroll. 1982. Swine Production. McGraw-Hill Company, New York.</P>
+<P ALIGN="JUSTIFY">Mason, I.L. and J.P. Maule. 1960. The Indigenous Livestock of Eastern and Southern Africa. Commonwealth Agricultural Bureaux, Farnham Royal, Buckinghamshire, UK. National Research Council. 1983. Little-Known Asian Animals with a Promising Economic Future. National Academy Press, Washington, D.C. National Research Council. 1980. Animal Science in China. CSCPRC Report No. 12. National Academy Press, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Panepinto, L.M. 1986. Miniature swine in biomedical research. LabAnimal 15(8)(November/December 1986):21-27.</P>
+<P ALIGN="JUSTIFY">Panepinto, L.M., R.W. Phillips, L.R. Wheeler, and D.H. Will. 1978. The Yucatan miniature pig as a laboratory animal. Laboratory Animal Science 28(3):308-313.</P>
+<P ALIGN="JUSTIFY">Phillips, R.W. and T.Y. Hou. 1944. Chinese swine and their performance compared with modern and crosses between Chinese and modern breeds. Journal of Heredity 35:365-79.</P>
+<P ALIGN="JUSTIFY">Pond, W.G. and J.H. Maner. 1984. Swine Production and Nutrition. AVI Publishing Company, Westport, Connecticut, USA.</P>
+<P ALIGN="JUSTIFY">Williamson, G. and W.J.A. Payne. 1965. An Introduction to Animal Husbandry in the Tropics. 2nd edition. Longman, London. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">POULTRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The World's Poultry Science Journal is published 3 times a year by the World's Poultry Science Association, (c/o Institut f-r Kleintierzucht, Dornbergstrasse 25/27, Postfach 280, C-3100 Celle, Germany). It has also published a multilingual poultry dictionary.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Poultry, an international journal on poultry, is published by Misset International, a department of Uitgeversmaatschappij, C. Misset b.v., Doetinchem-The Netherlands. (Address: Misset International, P.O. Box 4, 7000 BA Doetinchem, Netherlands.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Poultry Science is published monthly by the Poultry Science Association, Inc., 309 West Clark Street, Champaign, Illinois 61820, USA. British Poultry Science, a quarterly, is available c/o Longman Group Ltd., Subscriptions (Journals) Department, Fourth Avenue, Harlow, Essex CM195AA, UK. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chicken</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Attfield, H.H.D. 1990. Raising Chickens and Ducks. Volunteers in Technical Assistance, Arlington, Virginia, USA.</P>
+<P ALIGN="JUSTIFY">Crawford, R.D. 1984. Domestic fowl. Pages 298-311 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Ensminger, M.E.1971. Poultry Science. Interstate Printers and Publishers, Inc., Danville, Illinois, USA.</P>
+<P ALIGN="JUSTIFY">Fielding, D. 1984. The silent scavengers. African Farming September/October 1984: 11-13.</P>
+<P ALIGN="JUSTIFY">Howman, K.C. 1980. Pheasants: Their Breeding and Management. K&amp;R Books, UK.</P>
+<P ALIGN="JUSTIFY">Huchzermeyer, F.W. 1973. Free ranging hybrid chickens under African tribal conditions. Rhodesian Agricultural Journal 70:73-75.</P>
+<P ALIGN="JUSTIFY">Latif, M.A. 1985. In-Depth Analysis on the Successful Experience of Poultry Production in Bangladesh. Report submitted to FAO-APHC Regional Animal Production and Health Office. FAD/UN, Bangkok, Thailand.</P>
+<P ALIGN="JUSTIFY">Matthewman, R.W. 1977. A Survey of Small Livestock Production at the Village Level in the Derived Savannah and Lowland Forest Zones of South West Nigeria. M.Sc. thesis, University of Reading, UK.</P>
+<P ALIGN="JUSTIFY">MTrat, P. 1986. Potential usefulness of the Na (Naked Neck) gene in poultry production. [Vorld's Poultry Science Journal 42:124-142.</P>
+<P ALIGN="JUSTIFY">Nesheim, M.C., R.E. Austic, and L.E. Card. 1979. Poultry Production. 12th edition. Lea and Febiger, Philadelphia.</P>
+<P ALIGN="JUSTIFY">Phillips, R.W., R.C. Johnson, and R.J. Moyer. 1945. The Livestock of China. U.S. Department of State Publication No. 2249, Far Eastern Series 9. U.S. Department of State, Washington, D.C. 174 pp.</P>
+<P ALIGN="JUSTIFY">Sainsbury, D. 1980. Poultry Health and Management. Granada, London.</P>
+<P ALIGN="JUSTIFY">Scott, M.L., M.C. Nesheim, and R.J. Young. 1982. Nutrition of the Chicken. M.L. Scott and Associates, Ithaca, New York.</P>
+<P ALIGN="JUSTIFY">Smith, A.J. nd. Supplementation for scavenging animals. Unpublished paper. Copies available from A.J. Smith, Centre for Tropical Veterinary Medicine, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK.</P>
+<P ALIGN="JUSTIFY">Somes, R. 1984. International Registry of Poultry Genetic Stocks. BuDetin 469, University of Connecticut Agricultural Experiment Station, Storrs, Connecticut, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Araucanian</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wilhelm, G.O.E. 1965-1966. La Gallina Araucana (Gallus inauris castelloi 1914). Universidad de Concepcion, Concepcion, Chile, Boletia de Concepcion 40:5-26.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duck</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A film, Duck Farmingan Indonesian Tradition, is available from the CSIRO Film and Video Unit, 314 Albert Street, East Melbourne 3002, Victoria, Australia. Soundtrack is in English or Indonesian and it is available in 16 mm or VHS/Beta Video.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Attfield, H.H.D. 1990. Raising Chickens and Ducks. Volunteers in Technical Assistance, Arlington, Virginia, USA. </P>
+<P ALIGN="JUSTIFY">Clayton, G.A. 1984. Common duck. Pages 334-339 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Farrell, D. and P. Stapleton, eds. 1986. Duck Production, Science and World Practice. Proceedingsofaduckproductionworkshop, November 18-22, 1985, Bogor, Indonesia. Central Research Institute for Animal Science. Available from Department of Biochemistry, Microbiology and Nutrition, University of New England, Armidale, NSW 2351, Australia. 430 pp.</P>
+<P ALIGN="JUSTIFY">Holderread, D. 1978. The Home Duck Flock. The Hen House, P.O. Box 492, Corvallis, Oregon 97330, USA.</P>
+<P ALIGN="JUSTIFY">Kingston, D.K., D. Kosasih, and I. Ardi. 1979. The Rearing of Alabio Dt~cklings -nd Management of the Laying Duck Flocks in the Swamps of South Kalimantan. Report No. 9. Centre for Animal Research and Development, Ciawi, Bogor, Indonesia.</P>
+<P ALIGN="JUSTIFY">Petheram, R.J. and A. Thahar. 1983. Duck egg production systems in West Java. Agricultural Systems 2:75-86.</P>
+<P ALIGN="JUSTIFY">Phillips, R.W., R.G. Johnson, and R.J. Moyer. 1945. The Livestock of China. U.S. Department of State Publication No. 2249, Far Eastern Series 9. U.S. Department of State, Washington, D.C. 174 pp.</P>
+<P ALIGN="JUSTIFY">Sainsbury, D. 1980. Poultry Health and Management. Granada, London.</P>
+<P ALIGN="JUSTIFY">Scott, M.L. and W.F. Dean. 1991. Nutrition and Management of Ducks. M.L. Scott of Ithaca, Publisher (P.O. Box 4464, Ithaca, New York 14852, USA)</P>
+<P ALIGN="JUSTIFY">Warren, A.G. 1972. Ducks and geese in the tropics. World Animal Review 3:35-36.</P>
+<P ALIGN="JUSTIFY">Yi Yung and Yu-Ping Zhon. 1980. The Pekin duck in China. World Animal Review 34:11-14.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crawford, R.D. 1984. Goose. Pages 345-349 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">FAO. 1983. The Goose and its Possible Use for Controlling Weeds. Small Animals for Small Farms. GAN-I. FAO Regional Office for Latin America and the Caribbean, Casilla 10095, Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">Holderread, D. 1981. The Book of Geesea Complete Guide to Raising the Home Flock. Hen House Publications, P.O. Box 492, Corvallis, Oregon 97339, USA.</P>
+<P ALIGN="JUSTIFY">Phillips, R.W., R.G. Johnson, and R.J. Moyer. 1945. The Livestock of China. U.S. Department of State Publication No. 2249, Far Eastern Series 9. U.S. Department of State, Washington, D.C. 174 pp.</P>
+<P ALIGN="JUSTIFY">Soames, B. 1980. Keeping Domestic Geese. Blandford, London. 159 pp.</P>
+<P ALIGN="JUSTIFY">USDA Extension Service. 1983. Raising Geese. Farmer's Bulletin No. 2251. U.S. Department of Agriculture, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Warren, A.G. 1972. Ducks and geese in the tropics. World Animal Review 3:35-36.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea Fowl</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many research papers have been published in French, Italian, Spanish, and Russian, but few in English.</P>
+<P ALIGN="JUSTIFY">Ayeni, J.S.O. 1983. Studies of Grey Breasted Helmet Guineafowl (Numida meleagris galeata Pallas) in Nigeria. World's Poultry Science Journal 39(2):143-151.</P>
+<P ALIGN="JUSTIFY">Belshaw, R.H.H. 1985. Guinea Fowl of the World. Nimrod Book Services, P.O. Box No. 1, Liss, Hampshire, UK. </P>
+<P ALIGN="JUSTIFY">Blum, J.C., J. Guillaume, and B. Leclercq. 1975. Studies of the energy and protein requirements of the growing guinea-fowl. Br-ish Poultry Science 16:157-168.</P>
+<P ALIGN="JUSTIFY">Cauchard, J.C. 1971. La Pintade. Henri Peladan, UzFs, France.</P>
+<P ALIGN="JUSTIFY">Chemillier, J. 1984. L'Alimentation de la Pintade. F. Hoffmann-La Roche and Cie, 52, Boulevard du Parc, 92521 Neuilly-sur-Seine, Cedex, France.</P>
+<P ALIGN="JUSTIFY">Commonwealth Agricultural Bureaux. 1968. Guinea Fowl Breeding and Managernent. Annotated Bibliography No. 85. The Commonwealth Bureau of Animal Breeding and Genetics, King's Buildings, Edinburgh 9, Scotland, UK.</P>
+<P ALIGN="JUSTIFY">Leclercq, B. 1982. Alimentation des Futurs Reproducteurs Pintades. Pages 101-111 in FertilitT et Alimentation des Volailles. I.N.R.A. Edit.7 Versailles, France.</P>
+<P ALIGN="JUSTIFY">Leclercq, R. and B. Sauveur. 1982. L'alimentation des reproducteurs pintades. Pages 113-135 in FertilitT et Alimentation des Volailles, I.N.R.A. edit., Versailles, France.</P>
+<P ALIGN="JUSTIFY">Lukefahr, S. Raising guinea fowl. Paper available from author, c/o International Small Livestock Research Center, Alabama Agricultural and Mechanical University. P.O. Box 264, Normal, Alabama 35762, USA.</P>
+<P ALIGN="JUSTIFY">Ministry of Agriculture, Fisheries and Food. 1985. Small-scale guinea-few! production. Pamphlet 934. Ministry of Agriculture, Fisheries and Food (Publications), Lion House, Alnwick, Northumberland NE66 2PF, UK.</P>
+<P ALIGN="JUSTIFY">Mongin, P. and M. Plouzeau. 1984. Guinea-fowl. Pages 322-324 in Evolution of Domesticated Animals, I . L. Mason, ed. Longman, London .</P>
+<P ALIGN="JUSTIFY">USDA. 1970. Raising Cuinea Fowl. Leaflet No. 519. U.S. Department of Agriculture, Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Clayton, G.A. 1984. Muscovy duck. Pages 340-344 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">De Corville, H. 1972. La Production du Canard de Barbarie. Copies available from Institut nacional de la recherce agronomique (INRA), Nouzilly, France.</P>
+<P ALIGN="JUSTIFY">Farrell, D. and P. Stapleton, eds. 1986. Duck Production, Science and World Practice. Proceedings of a duck production workshop, November 18-22, 1985, Bogor, Indonesia. Central Research Institute for Animal Science. Copies available from D. Farrell, University of New England, Armidale, NSW 2351, Australia.</P>
+<P ALIGN="JUSTIFY">Jeffreys, M.D.W. 1956. The Muscovy duck. The Nigerian Field21(3):108-11.</P>
+<P ALIGN="JUSTIFY">Kingston, D.J., D. Kosasih, and I. Ardi. 1978. The Use of the Muscovy Drrck for Hatching of Alabio Duck &Yacute;ggs in the Swamplands of Kalimantan. Centre Report No. 7. Centre for Animal Research and Development, Bogor, Indonesia.</P>
+<P ALIGN="JUSTIFY">Richet, M. 1985. La production du canard de Barbarie. Techniques Agricoles 3770.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abs, M., ed. 1983. Pltysiology and Behavior of the Pigeon. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">Hawes, R.O. 1984. Pigeons. Pages 351-356 in Evolution of Domesticated Anirnals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Hollander, W.F. and W.J. Miller. 1981. Hereditary variants of behavior and vision in the pigeon. Iowa State Journal of Research 55(4):323-331.</P>
+<P ALIGN="JUSTIFY">Levi, W.M. 1965. Encyclopedia of Pigeon Breeds. T.F.H. Publications, Jersey City, New Jersey, USA. </P>
+<P ALIGN="JUSTIFY">Levi, W.M. 1981. The Pigeon. 2nd edition revised. Levi Publishing, Sumter, South Carolina, USA.</P>
+<P ALIGN="JUSTIFY">Murton, R.K., R.P.J. Thearle, and J. Thompson. 1972. Ecological studies of the feral pigeon (Columba livia). 1. Population, breeding biology and methods of control. II. Flock behaviour and social organisation. Ecology 9:835-889.</P>
+<P ALIGN="JUSTIFY">University of Wisconsin. 1977. Pigeons. Bulletin 4-H 135. University of Wisconsin, Madison, Wisconsin, USA.</P>
+<P ALIGN="JUSTIFY">USDA. 1963. Squab Raising. Farmers Bulletin No. 684. U.S. Department of Agriculture, Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bourquin, O. 1980. Biology of rhe Quail (Coturnix coturnix Linnaeus 1758). Ph.D. thesis, University of Natal, Pietermaritzburg, Republic of South Africa.</P>
+<P ALIGN="JUSTIFY">Katoh, H. and N. Wakasugi. 1980. Studies on the blood groups in the Japanese quail: detection of three antigens and their inheritance. Developmental and Comparative Immunology 4:99-110.</P>
+<P ALIGN="JUSTIFY">Kawahara, T. 1973. Comparative study of quantitative traits between wild and domestic Japanese quail (Coturnix coturnix japonica). Experimental Animals 22(supplement): 138-50.</P>
+<P ALIGN="JUSTIFY">Marsh, A. Quail Manual. Marsh Farms, 7171 Patterson Drive, Garden Grove, Calffornia 92641, USA.</P>
+<P ALIGN="JUSTIFY">National Academy of Sciences. 1969. Coturnix (Coturnix coturnix japonica): Standards and Guidelines for the Breeding, Care, and Management of Laboratory' Animals. National Academy of Sciences, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Quail Production Technology. Leaflet No. 13/1982. Central Avian Research Institute, Izatnagar, India. </P>
+<P ALIGN="JUSTIFY">Somes, R.G., Jr. 1981. International Registry of Poultry Genetic Stocks. Storrs Agricultural Experiment Station, University of Connecticut, Storrs, Connecticut, USA.</P>
+<P ALIGN="JUSTIFY">Varghese, S.K. 1981. Coturnix Internationalat home and in the Caribbean. Poultry Science 60:1747.</P>
+<P ALIGN="JUSTIFY">Varghese, S.K. 1982. Coturnix production proves to be a profitable business. Poultry Science 61:1560.</P>
+<P ALIGN="JUSTIFY">Varghese, S.K. 1983. Processing and yield of coturnix (Japanese quail). Poultry Science 62:1517</P>
+<P ALIGN="JUSTIFY">Wakasugi, N. and K. Kondo. 1973. Breeding methods for maintenance of mutant genes and establishment of strains in the Japanese quail. Experimental Animals 22(Supplement): I 51 -9.</P>
+<P ALIGN="JUSTIFY">Woodard, A.E., A. Abplanalp, W.O. Wilson, and P. Vohra. 1973. Japanese Quail Husbandry in the Laboratory. Department of Avian Sciences, University of Calffornia, Davis, Calffornia 95616, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turkey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berg, R. and D. Halvorson. 1985. Turkey Management Guide. Minnesota Turkey Growers Association, 678 Transfer Road, St. Paul, Minnesota 55114, USA.</P>
+<P ALIGN="JUSTIFY">Crawford, R.D. 1984. Turkey. Pages 325-334 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London. </P>
+<P ALIGN="JUSTIFY">Ensminger, M.E. 1971. PoultryScience. InterstatePrintersandPublishers, Inc., Danville,</P>
+<P ALIGN="JUSTIFY">Illinois, USA. Sainsbury, D. 1980. Poultry Health and Management. Granada, London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RABBITS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Rabbit Research Center has been established at Oregon State University, Corvallis, Oregon 97331, USA. It publishes the Journal of Applied Rabbit Research, whose purpose is to convey current research information to those with an interest in commercial rabbit production. The journal describes research conducted at the center and reviews rabbit research results reported in the world's scientific literature.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Founded in 1976 in Paris, the World Rabbit Science Association (Typing House, Shurdington, Cheltenhem, Gloucestershire, GL51 SXF, UK) publishes a newsletter of coming events and chronicles the progress of rabbit farming in most countries of the world. Its aims are to facilitate the advancement of the various branches of the rabbit industry, disseminate knowledge, and study problems of production and marketing. Its members represent individuals and associations in 20 countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The American Rabbit Breeder's Association (1925 South Main Street, Bloomington, Illinois 61701, USA) has published a book, Guide to Producing Better Rabbits, which contains an abundance of information concerning management and diseases of the domestic rabbit. The organization also publishes a bimonthly magazine, Domestic Rabbit, that includes a great deal of updated information on rabbit raising.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asociacion Espanola de Cunicultura (Spanish Rabbit Science Association), Now, 23 08785 Ballbona d'Anoia, Barcelona, Spain, has a set of slides for training, covering breeds, handling, pathology, and commercialization.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Report of the Workshop on Rabbit Husbandry. Copies of this report are available free of charge from the International Foundation for Science, Sibyllegatan 47, S-114 42 Stockholm, Sweden. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A Working Rabbit Literature Resources File. This materia, is directed at scientists working on some aspect of domestic rabbit research. It lists methods of computer searching for scientific reports in the world's scientific literature, various types of computer literature searches, including commerciaHy available ones, and government services. It a,so includes a list of prepared abstracts. The address is D.D. Caveny and H. L. Enos, Colorado State University, Fort Collins, Colorado 80523, USA. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic Rabbit</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ministry of Livestock Development. 1981. Rabbit Production. Kenya Ministry of Livestock Development. Copies can be obtained from the Agricultural Information Centre, P.O. Box 14733, Nairobi, Kenya.</P>
+<P ALIGN="JUSTIFY">Attfield, H.H.D. 1977. Rabbit Raising. Volunteers in Technical Assistance, 1815 Lynn</P>
+<P ALIGN="JUSTIFY">Street, Arlington, Virginia 22209, USA. 90 pp.</P>
+<P ALIGN="JUSTIFY">Bennett, R. 1975. Raising Rabbits the Modern Way. Garden Way Publishing, Charlotte, Vermont 05445, USA.</P>
+<P ALIGN="JUSTIFY">Cheeke, P.R. 1987. Rabbit Feeding and Nutrition. Academic Press, Inc., New York.</P>
+<P ALIGN="JUSTIFY">Cheeke, P.R., N.M. Patton, S.D. Lukefahr, and J.I. McNitt. 1986. Rabbit Production. Sixth edition. The Interstate, Danville, Illinois, USA. </P>
+<P ALIGN="JUSTIFY">FAO. 1986. Cooking Rabbits. Food and Agriculture Organization of the United Nations,  Regional Office for Latin America and the Caribbean, Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">FAO. 1986. Self-Teaching Manual on Backyard Rabb- Rearing. Food and Agriculture  Organization of the United Nations, Regional Office for Latin America and the  Caribbean, Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">FAO. 1986. Backyard Rabbit Rearing: Some Basic Husbandry Practices. Small Animals  for Small Farms. GAN-16. Food and Agriculture Organization of the United Nations,  Regional Office for Latin America and the Caribbean, Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">Schlolaut, W., ed. 1985. A Compendium of Rabbit Production. Gesellschaft f-r  Technische Zusammenarbeit (GTZ) Publication No. 169. TZ-Verlagsgesellschaft mbH,  Postfach 36, D6101 Rossdorf, Germany.</P>
+<P ALIGN="JUSTIFY">Sicivaten, J. and D. Stahl. 1982. A Complete Handbook on Backyard and Commercial  Rabbit Production. CARE/Philippines.</P>
+<P ALIGN="JUSTIFY">Vogt, D.W. 1982. Raising Rabbits in Hawaii. Circular 499, Cooperative Extension  Service, College of Tropical Agriculture and Human Resources, University of Hawaii at  Manoa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RODENTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agouti</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A report summarizing preliminary results in a captive-breeding project in Mexico is available from A. D. Cuaron (see Research Contacts for address).</P>
+<P ALIGN="JUSTIFY">Deutsch, L.A., and G. Santos. 1984. Contribuitao pare o conhecimento do gOnero  Dasyproctareprodutao de cutiasentre cruzamente das espTcies Dasyprocta aguti,  Dasyprocta azarae e Dasyprocta fuliginosa. Congresso Brasileiro de Zoologia, II,  BelTm, 1984. Resumos. . .BelTm, SBZ/UFPalMPEC, p. 383-4/(Resumos 390). Copies  available from the authors, see Research Contacts.</P>
+<P ALIGN="JUSTIFY">Clark, M.M. and B.G. Galef, Jr. 1977. Patterns of agonistic interaction and space  utilization by agoutis, Dasyprocta punctata. Behavioral Biology 20:135-140.</P>
+<P ALIGN="JUSTIFY">Leopold, A.S. 1959. Pages 388-393 in Wildlife of Mexico. University of California Press,  Berkeley and Los Angeles.</P>
+<P ALIGN="JUSTIFY">Meritt, D.A., Jr. 1982. Bibliography of Dasyprocta (Rodentia). Brenesia 19/20:595-612.</P>
+<P ALIGN="JUSTIFY">Meritt, D.A., Jr. 1983. Preliminary observations on reproduction in the Central  American agouti, Dasyprocta punctata. Zoo Biology 2:127-131.</P>
+<P ALIGN="JUSTIFY">Morris, D. 1962. The behaviour of the green acouchi (Myoprocta pratti) with special  reference to scatter hoarding. Proceedings Zoological Society of London 139:701732.</P>
+<P ALIGN="JUSTIFY">Smith N. 1974. Agouti and babassu. Oryx 12(5):581-582.</P>
+<P ALIGN="JUSTIFY">Smythe, N. 1978. The Natural History of the Central American Agouti (Dasyprocta  punctata). Smithsonian Contributions to Zoology No. 257. Smithsonian Institution,  Washington, D.C., USA. 52 pp.</P>
+<P ALIGN="JUSTIFY">Tribe, C.J., R. Leher, M.C.O. Doglio, M.I.L. Rebello, D.S. Mello, and E.M.M. Guimar es.  1985. Uma tentative de esclarecimento do uso de espato e estrutura social na cutia  Dasyprocta a. aguti (Rodentia). Pages 296-7 in Congresso Brasileiro de Zoologia, 12,  Campinas, 1985. Resumos. . .Campinas, SBZ/UNICAMP, 1985. (Resumo 614.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capybara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A capybara bibliography, Bibliograf a sobre Chiguires (Hydrochoerus hydrochaeris), is available from E. Gonzalez-Jimenez and JosT Roberto de Alencar Moreira (see Research Contacts for addresses).</P>
+<P ALIGN="JUSTIFY">Aliaga Rodriguez, L. 1979. Produccion de Cuyes. Universidad Nacional del Centro del Peru, Puno.</P>
+<P ALIGN="JUSTIFY">Baldizan, A., R.M. Dixon, and R. Parra. 1983. Digestion in the capybara (Hydrochoerus hydrochaeris). South African Journal of Animal Science 13(1):27-28.</P>
+<P ALIGN="JUSTIFY">Gonzalez-Jimenez, E. 1977a. The capybara, an indigenous source of meat in tropical America. World Animal Review', 21:24-30.</P>
+<P ALIGN="JUSTIFY">Gonzalez-Jimenez, E. 1977b. Digestive physiology and feeding of capybaras. Pages 167177 in Handbook Series in Nutrition and Food. Section G, Diets, Culture Media and Food Supplements, M. Rechcigl, ed. CRC Press, Cleveland, Ohio, USA.</P>
+<P ALIGN="JUSTIFY">Gonzalez-Jimenez, E. and R. Parra. 1975. The capybara, a meat-producing animal for the flooded areas of the tropics. Pages 81-86 in Proceedings of the Third World Conference on Animal Production, R.L. Reid, ed. Sydney University Press.</P>
+<P ALIGN="JUSTIFY">Gonzalez-Jimenez, E. 1984. Capybara. Pages 258-259 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Macdonald, D.W., K. Krantz, and R.T. Aplin. 1984. Behavioural, anatomical and chemical aspects of scent marking amongst Capybaras (Hydrochoerus hydrochaeris) (Rodentia:Caviomorpha). Journal of Zoology (London) 202:341-360.</P>
+<P ALIGN="JUSTIFY">Mones, A. and J. Ojasti. 1986. Hydrochoerus hydrochaeris. Mammalian Species 264: 1-7.</P>
+<P ALIGN="JUSTIFY">Ojasti, J. 1968. Notes on the mating behavior of the capybara. Journal of Mammalogy 49:345-374.</P>
+<P ALIGN="JUSTIFY">Ojasti, J. 1973. Estudio Biologico del Chiguire o Capybara. Fondo Nacional de Investigaciones Agropecuaria, Caracas, Republica de Venezuela. 27 pp.</P>
+<P ALIGN="JUSTIFY">Zara, J.L. 1973. Breeding and husbandry of the capybara at Evansville Zoo. International Zoo Yearbook 13:137-139.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Christen, M.F. 1978. Evaluacion nutritive de cuatro dietas mono especificas en la alimentacion del coipo (Myocastor coypus Molina 1782). Tesis. Faculty of Veterinary Science, Universidad Austral de Chile, Valdivia, Chile.</P>
+<P ALIGN="JUSTIFY">Deems, E.F., Jr., and D. Pursley. 1978. North American Fur bearers. Maryland Wildlife Administration, Department of Natural Resources, Cheltenham, Maryland, USA. pp. 155.</P>
+<P ALIGN="JUSTIFY">CORFO. n.d. Pieles fieas. Especie coipos. Tomo 1, I! and III. Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">Murua, R., O. Newman, and J. Propelmann. 1981. Food habits of Myocastor coypus (Molina) in Chile. Pages 544-558 in Proceedings of rhe Worldwide Furbearer Conference, J.A. Chapman and D. Pursley, eds. Vol. 1. Worldwide Furbearer Conference, Inc., Frostburg, Maryland, USA.</P>
+<P ALIGN="JUSTIFY">Willner, G.R. 1982. Nutria; Myocastor coypu. Pages 1059-1076 in Wild Mammals of NorthAmerica, J.A. Chapman and G.A. Feldhamer, eds. The John Hopkins University Press, Baltimore, Maryland, USA. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giant Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ajayi, S.S. 1975. Domestication of the African Giant Rat. Department of Forest Resources, University of Ibadan, Ibadan, Nigeria.</P>
+<P ALIGN="JUSTIFY">Faturoti, E.O., O.O. Tewe, and S.S. Ajayi. 1982. Crude fibre tolerance by the African giant rat (Cricetomys gambianus Waterhouse) (Potential sources of protein, Nigeria.) African Journal of Ecology 20(4):289-292.</P>
+<P ALIGN="JUSTIFY">Faturoti, E.O., O.O. Tewe, and S.S. Ajayi. 1983. Effect of varying dietary oil levels on the performance of the African giant rat (Cricetomys gambianus Waterhouse). Nutrition Reports International 27(3):525-530.</P>
+<P ALIGN="JUSTIFY">Den Hartog, A.P. and A. de Vos. 1973. The use of rodents as food in tropical Africa. Nutrition Newsletter (FAO) 11 (2):1-14.</P>
+<P ALIGN="JUSTIFY">Halcrow, J.G. 1958. The giant rat of East Africa. Nature (London) 181:649-650.</P>
+<P ALIGN="JUSTIFY">Matthewman, R.W. 1977. A Survey of Small Livestock Production at the Village Level in the Derived Savanna and Lowland Forest Zones of South West Nigeria. Development Studies 24. Department of Agriculture and Horticulture, University of Reading, UK.</P>
+<P ALIGN="JUSTIFY">Tewe, O.O., S.S. Ajayi, and E.O. Faturoti. 1984. Giant rat and cane rat. Pages 291-293 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grasscutter</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asibey, E.O.A. 1979. Some problems encountered in the field study of the grasscutter (Thryonomys swinderianus) population in Ghana. Pages 214-7 in Wildlife Management in Savannah Woodland, S.S. Ajayi and L. B. Halstead, eds. Cambridge University Press, Cambridge, UK.</P>
+<P ALIGN="JUSTIFY">Baptist, R. and G.A. Mensah. 1986. The Cane-RatFarm animal of the future? [Vorld Animal Review 60:2-6.</P>
+<P ALIGN="JUSTIFY">Matthewman, R.W. 1977. A Survey of Small Livestock Production at the Village Level in the Derived Savanna and Lowland Forest Zones of South West Nigeria. Development Study 24. Department of Agriculture and Horticulture, University of Reading, UK.</P>
+<P ALIGN="JUSTIFY">Pich, S. and K.J. Peters. 1985. Possibilities of using the cane cutter for meat production in Africa. Unpublished manuscript. Copies available from K.J. Peters, Institute of Animal Breeding, Gottingen, Germany.</P>
+<P ALIGN="JUSTIFY">Tewe, O.O., S.S. Ajayi, and E.O. Faturoti. 1984. Giant rat and cane rat. Pages 291-293 in Evolution of Domesticated Animals, I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">"Let's Raise Guinea Pigs," a filmstrip on guinea pig farming, is available from World Neighbors International Headquarters, 5116 North Portland Avenue, Oklahoma City, Oklahoma73112, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aliaga Rodriguez, L. 1979. Produccion de Cuyes. Universidad Nacional del Centro del Peru, Huancayo, Peru. </P>
+<P ALIGN="JUSTIFY">Aliaga Rodriguez, L. 1983. improvement of Guinea Pig Breeding as a Means of Increasing the Productivity and Production of Meat for Consumption oy the Rural Population in Peru. National University of Central Peru, Huancayo, Peru.</P>
+<P ALIGN="JUSTIFY">Bolton, R. 1979. Guinea pigs, protein, and ritual. Ethnology 18(3):229-252.</P>
+<P ALIGN="JUSTIFY">Huss, D.L. 1982. Small animals for small farms in Latin America. World Animal Ret~iew (FAO) 43:24-29.</P>
+<P ALIGN="JUSTIFY">FAO. 1982. The Guinea Pig and a Hypothetical Development Centre. Small Animals for Small Farms. FAO, Regional Office for Latin America and the Caribbean, Santiago, Chile.</P>
+<P ALIGN="JUSTIFY">Loetz, E. and C. Novoa. 1983. Meat from the guinea pig. Span 26(2):84-86.</P>
+<P ALIGN="JUSTIFY">Muller-Haye, B. 1984. Guinea-pig or cuy. Pages 252-257 in Evolution of Domesticated Animals I.L. Mason, ed. Longman, London.</P>
+<P ALIGN="JUSTIFY">Stansfield, S.K., C.L. Scribner, R.M. Kaminski, T. Cairns, J.B. McCormick, and K.M. Johnson. 1982. Antibody to ebola virus in guinea pigs: Tandala, Zaire. The Journal of Infectious Diseases 146(4):483-486.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hutia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anderson, S., C.A. Woods, G.S. Morgan, and W.L.R. Oliver. 1983. Geocaprornys brownii. Mammalian Species 201:1-5.</P>
+<P ALIGN="JUSTIFY">Canet, R.S. and V. Berovides Alvares. 1984. Ecomorfologia y rendimiento de la jutia conga (Capromys pilorides Say). Poeyana 279:1-19.</P>
+<P ALIGN="JUSTIFY">Canet, R.S. and V. Berovides Alvares. 1984. Reproduccion y ecolog~a de la jutia conga (Capromys pilorides Say). Poeyana 220:1-20.</P>
+<P ALIGN="JUSTIFY">Howe, R., and G.C. Clough. 1971. The Bahamian hutia Geocapromys ingrahami in captivity. international Zoo Yearbook 11:89-93.</P>
+<P ALIGN="JUSTIFY">Johnson, M.L., R.H. Taylor, and N.W. Winnick. 1975. The breeding and exhibition of capromyd rodents at Tacoma Zoo. International Zoo Yearbook 15:53-56.</P>
+<P ALIGN="JUSTIFY">Oliver, W.L.R. 1977. The hutias (Capromyidae) of the West Indies. International Zoo Yearbook 17:14-20.</P>
+<P ALIGN="JUSTIFY">Oliver, W.L.R. 1985. The Jamaican hutia or Indian Coney (Geocapromys brownii). A model programme for captive breeding and reintroduction? Symposium of the Association of British Wild Animal Keepers, 10:35-52. (Copies available from author, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Rowlands, I.W., and B.J. Weir, eds. 1974. The Biology of Hystricomorph Rodents. Symposium of the Zoological Society of London, 34:1-482.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dubost, G. and H. Genest. 1974. Le comportement social d'une colonide mares, Dolichotis patagonum Z. dans le Parc de BranfTrT. Zeitschrift fin Tierpsychologie 35:225-302.</P>
+<P ALIGN="JUSTIFY">Taber, A.B. and D.W. Macdonald. 1984. Scent dispensing papillae and associated behaviour of the mare, Dolichotis patagonum (Rodentia: Caviomorpha). Journal of Zoology (London) 203:298-302. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paca</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A report summarizing progress in the captive-breeding project in Panama is available from Nicholas Smythe, Smithsonian Tropical Research Institute, Box 2071, Balboa, Panama. A report summarizing preliminary results in the captive-breeding project in Mexico is available from Alfredo D. Cuaron, (see Research Contacts).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collett, S.F. 1981. Population characteristics of Agouti paca (Rodentia) in Colombia. Michigan State University, Publications of the Museum, Biological Series 5(7): 485-602.</P>
+<P ALIGN="JUSTIFY">Matamoros, Y. 1982. Investigaciones preliminares sobre la reproduccion, comportamiento, alimentacion y manego del tepezcuinte (Cuniculus paca, Brisson) en cautiverio. Pages 961-992 in Zoologia Neotropical, Actas del VIII Congreso Latinoamericano de Zoologia, P.J. Salinas, ed. (Copies available from Y. Matamores, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcacha</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jackson, J.E. nd. Growth rates in vizcacha (Lagostomus maximus) in San Luis, Argentina. Instituto Nacional de Tecnologia Agropecuaria, San Luis, Argentina. (Copies available from author, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Llanos, A.C., and J.A. Crespo. 1952. Ecologia de la vizcacha (Lagostomus maximus maximus Blainv.) en el nordeste de la provincia de Entre Rios. Revista de Investigaciones Agricolas (Buenos Aires) 6:289-378.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Rodents</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butynski, T.M. 1973. Lffe history and economic value of the springhare (Pedetes capensis Forster) in Botswana. Botswana Notes Record 5:209-213.</P>
+<P ALIGN="JUSTIFY">Butynski, T.M. 1979. Reproductive ecology of the springhaas Pedetes capensis in Botswana. Journal of Zoology 189:221-232.</P>
+<P ALIGN="JUSTIFY">Butynski, T.M. 1984. Nocturnal ecology of the springhare, Pedetes capensis, in Botswana. African Journal of Ecology 22:7-22.</P>
+<P ALIGN="JUSTIFY">Butynski, T.M. and R. Mattingly. 1979. Burrow structure and fossorial ecology of the springhare Pedetes capensis in Botswana. African Journal of Ecology 17:205-215.</P>
+<P ALIGN="JUSTIFY">Kofron, C.P. 1987. Seasonal reproduction of the springhare, Pedetes capensis, in southeastern Zimbabwe. African Journal of Ecology 25.</P>
+<P ALIGN="JUSTIFY">Rosenthal, M.A., and D.A. Meritt. 1973. Hand-rearing springhaas at Lincoln Park Zoo. International Zoo Yearbook 18:206-208.</P>
+<P ALIGN="JUSTIFY">Smithers, R.H.N. 1983. The Mammals of the Southern African Subregion. University of Pretoria, Pretoria.</P>
+<P ALIGN="JUSTIFY">Velte, F.F. 1978. Hand-rearing springhaas Pedetes capensis at Rochester Zoo. International Zoo Yearbook 18:206-208. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DEER AND ANTELOPE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Deer Farmer, a quarterly magazine, is published by the New Zealand Deer Farmers' Association, P.O. Box 2678, Wellington, New Zealand.</P>
+<P ALIGN="JUSTIFY">Deer Farming is the quarterly magazine of the British Deer Farmers Association (22 Levat Road, Inverness IV2 3NS, Scotland, UK).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chaplin, R.E. 1977. Deer. Blandford Press, Poole, Dorset, UK.</P>
+<P ALIGN="JUSTIFY">Hoffman, R.R. 1985. Digestion and feeding in deer: their morphophysiological adaptation. In Proceedings International Conference on Deer Biology and Production, eds. P.F. Fennessy and K.R. Drew. Royal Society of New Zealand Bulletin 22, Wellington, New Zealand.</P>
+<P ALIGN="JUSTIFY">Fennessy, P.F. and K.R. Drew, eds. 1985. Biology of Deer Production. Proceedings of an international conference held February 13-18, 1983, Dunedin, New Zealand. Royal Society of New Zealand Bulletin 22, Wellington, New Zealand. Available from Royal Society of New Zealand, Private Bag, Wellington, New Zealand.</P>
+<P ALIGN="JUSTIFY">Wemmer C., ed. 1987. The Biology and Management of the Cervidae. Smithsonian Institution Press, Washington, D.C., USA.</P>
+<P ALIGN="JUSTIFY">Yerex, D. 1982. The Farming of Deer. Agricultural Publishing, Box 176, Carterton, New Zealand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kay, R.N.B. 1987. The comparative anatomy and physiology of digestion in tragulids and cervids and its relation to food intake. In The Biology and Management of the Cenvidae, C. Wemmer, ed. Smithsonian Institution Press, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">Dubost, G. 1975. Le comportement du chevrotain africain, Hyemoschus aquaticus Ogilby (Artiodactyla, Ruminantia). Zeitschrift fdr Tierpsychologie 37:403-501.</P>
+<P ALIGN="JUSTIFY">Dubost, G. 1978. Un apertu sur l'Tcologie du chevrotain africain, Hyemoschus aquaticus Ogilby, Artiodactyle Tragulide. Mammalia 42:1-62.</P>
+<P ALIGN="JUSTIFY">Ralls, K., C. Barasch, and K. Minkowski. 1975. Behaviour of captive mouse deer, Tragulus napu. Zeitschrift Tierpsychology 37:356-378.</P>
+<P ALIGN="JUSTIFY">Robin, K.P. 1979. Zum Verhalten des Kleinkantschils (Tragulus javanicus). Ph.D. dissertation, University of Zurich. (Copies available from K.P. Robin, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Vidyadaran, M.K., M. Hilmi, and R.A. Sirimane. 1982. The gross morphology of the stomach of the Malaysian lesser mousedeer (Tragrrlus javanicus). Pertanika 5(1): 34-38.</P>
+<P ALIGN="JUSTIFY">Vidyadran, M.K., S. Vellayan, and R. Karuppiah. 1983. Muscle weight distribution of the Malaysian lesser mousedeer (Tragulus javanicus). Pertanika 6(2):63-69. </P>
+<P ALIGN="JUSTIFY">Wharton, D.C. 1987. Captive Management of Tragulids at New York Zoological Park. In Biology and Management of the Cervidae, C. Wemmer, ed. Smithsonian Institution Press, Washington, D.C., USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muntjac</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anderson, J. 1981. Studies on digestion in Muntiacus reeves). M.Phil. thesis. Cambridge University. </P>
+<P ALIGN="JUSTIFY">Barrette, C. 1977. The social behavior of captive muntjac Muntiacus reeves) (Ogilby  1839). Zeitschrift f-r Tierpsychologie 43: 188-213.</P>
+<P ALIGN="JUSTIFY">Chaplin, R.E. 1977. Deer. Blandford Press, Poole, Dorset, England</P>
+<P ALIGN="JUSTIFY">Chapman, D.I., N.G. Chapman, J.G. Mathews, and D.H. Wurster-Hill. 1983. Chromosome  studies of feral muntjac (Muntiacus sp.) in England. Journal of Zoology, London  201:557-559.</P>
+<P ALIGN="JUSTIFY">Dansie, O. 1970. Muntjac. British Deer Society, Welwyn Garden City, England. 22 pp.</P>
+<P ALIGN="JUSTIFY">Dubost, G. 1970. L'organisation spatiale et sociale de Muntiacus reeves) Ogilby 1839 en  semi-liberte. Mammalia 34:331-355.</P>
+<P ALIGN="JUSTIFY">Dubost, G. 1971. Observations Tthologiques sur le muntjac (Muntiacus muntjak  Zimmermann 1780 et Muntiacus reeves) Ogilby 1839) en captivitT et semi-libertT.  Zeitschrift fdr Tierpsychologie 28:387-427.</P>
+<P ALIGN="JUSTIFY">Jackson, J.E., D.I. Chapman, and O. Dansie. 1977. A note on the food of muntjac deer  (Muntiacus reeves)). Journal of Zoology (London) 183:546-548.</P>
+<P ALIGN="JUSTIFY">Lu Ho-gee and Sheng He-lin. 1984. Status of the black muntjac Muntiacus crinifrons, in  eastern China. Mammal Review 14(1):29-36.</P>
+<P ALIGN="JUSTIFY">Oli, Madan K. 1986. Studies on stereotyped behavior of barking deer (Muntiacus  muntjak). M.S. dissertation, Institute of Science and Technology, Tribhauvan  University, Kathmandu, Nepal. 84 pp.</P>
+<P ALIGN="JUSTIFY">Shi Liming, Ye Yingying, and Duan Xinsheng. 1980. Comparative cytogenetic studies on  the red muntjac, Chinese muntjac, and their Fl hybrids. Cytogenetics and Cell Genetics  26:22-7.</P>
+<P ALIGN="JUSTIFY">Yonzon, Pralad B. 1978. Ecological studies on Muntaicus muntjack. Journal of Natural  History Museum (Nepal) 2(2):91-100.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Musk Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anonymous. 1974. Feeding musk deer in captivity and collecting musk from the live  animal. Dongwuxue Zhazi, China 2:11-14.</P>
+<P ALIGN="JUSTIFY">Anonymous. 1975. Preliminary experience in raising the survival rate of musk deer.  Dongwuxue Zhazi, China 1 :17-19.</P>
+<P ALIGN="JUSTIFY">Bannikov, A.G., S.K. Ustinov, and P.N. Lobanov. 1980. The musk deer Moschus  moschiferus in the USSR. International Union for Conservation of Nature and Natural  Resources (IUCN), Gland, Switzerland.</P>
+<P ALIGN="JUSTIFY">Bi, S.Z., Y.H. Yan, Z.X. Qing, P.T. Sheng, Y.M. Wu, C.F. Chen, G.K. Yang, T.B. Yin,  and Y.J. Lu. 1980. Dissection and analysis of the musk gland of M. moschiferus and a  preliminary investigation into its histology. The Protection and Use of Wild Animals  (China) 1: 14-19.</P>
+<P ALIGN="JUSTIFY">Green, M.J.B. 1978. Himalayan musk deer (Moschus moschiferus moschiferus). Pages  56-64 in Threatened Deer. International Union for Conservation of Nature and Natural  Resources (IUCN), Morges, Switzerland.</P>
+<P ALIGN="JUSTIFY">Green, M.J.B. 1985. The musk trade, with particular reference to its impact on the  Himalayan population of Moschus chrysogaster. In Conservation in Developir~g  Countries. Bombay Natural History Society, Bombay.</P>
+<P ALIGN="JUSTIFY">Green, M.J.B. 1985. Aspects of the Ecology of the Himalayan Musk Deer. Ph.D.  dissertation, University of Cambridge, U.K. 280 pp.</P>
+<P ALIGN="JUSTIFY">Groves, C.P. 1978. The taxonomy of Moschus, with particular reference to the Indian  Region. Journal of the Bombay Natural History Society 72:662-676.</P>
+<P ALIGN="JUSTIFY">Holloway, C.W. 1973. Threatened deer of the world: conservation status. Biological  Conservation 5(4).  </P>
+<P ALIGN="JUSTIFY">IUCN. 1974. Red Data Book: Mammalia. International Union for Conservation of Nature and Natural Resources (IUCN), Morges.</P>
+<P ALIGN="JUSTIFY">Jamwal, P.S. 1972. Collection of deer musk in Nepal. Journal of Bombay Natural History Society 69(3):647-649.</P>
+<P ALIGN="JUSTIFY">Seth, S.D., A. Muktiopadtiyay, K. Raghunatham, and R.B. Arora. 1975. Pharmodymamics of Musk. Central Council for Research on Indian Medicine and Homoeopathy, New Delhi, India.</P>
+<P ALIGN="JUSTIFY">Zhang B. 1983. Musk-deer. Their capture, domestication and care according to Chinese experience and methods. Unasylva 35(139):16-24.</P>
+<P ALIGN="JUSTIFY">Zhang, B.L., F.M. Dang, and B.S. Li. 1979. The Farming of Musk Deer. Agricultural Publishing Company, Peking.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chaplin, R.E. 1977. Deer. Blandford Press, Poole, Dorset, England.</P>
+<P ALIGN="JUSTIFY">Cooke, A. and L. Farrell. 1983. Chinese water deer (Hydropotes inermis). British Deer Society Publication No. 2. Elvy and Gibbs, Canterbury, UK.</P>
+<P ALIGN="JUSTIFY">Feer, F. 1982. Quelques observations Tthologiques sur l'Hydropote de chine, Hydropotes inennis (Swinhoe, 1870) en captivitT. Zeitschrift fitr Saeugetierkunde 47: 175-185.</P>
+<P ALIGN="JUSTIFY">Sheng Helin and L. Housl. 1984. A preliminary study on the river deer (Hydropotes inermis) population of Shoushau Island (China) and adjacent islets. Acta Theriologica Sinica 4:161-166.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dittrich, L. 1972. Beobachtungen bei der Haltung von Cephalophus-Arten sowie zur Fortpflanzung und Jugendentwicklung von C. dorsalis und C. rufilatus in gefangenschaft. Zoologische Garten Lpz (N.F.) 42:1-16.</P>
+<P ALIGN="JUSTIFY">Dubost, G. 1980. L'Tcologie et la vie sociale du cTphalophe bleu (Cephalophus monticola Thunberg), petit ruminant forestier africain. Zeitschrift fur Tierpsychologie 54: 205-266.</P>
+<P ALIGN="JUSTIFY">Dunbar, R.l.M. and E.P. Dunbar. 1979. Observations on the social organisation of common duiker in Ethiopia. African Journal of Ecology 17:249-252.</P>
+<P ALIGN="JUSTIFY">Dunbar, R.I.M. and E.P. Dunbar. 1980. Animal Behaviour 28:219.</P>
+<P ALIGN="JUSTIFY">Ketelhodt, H.F. Von. 1977. The lambing interval of the blue duiker, Cephalophus monticola Gray in captivity, with observations on its breeding and care. South African Journal of Wildlife Research 7:41-43.</P>
+<P ALIGN="JUSTIFY">Ralls, K. 1975. Agonistic behavior in Maxwell's duiker, Cephalophus max~elli. Marnrnalia 39:241-249.</P>
+<P ALIGN="JUSTIFY">Schweers, S. 1984. The reproductive biology of the banded duiker Cephalophus zebra in comparison with other species of Cephalophus. Zeitschrift fur Saeugetierkunde 49(1):21-36.</P>
+<P ALIGN="JUSTIFY">Whittle, C. and P. Whittle. 1977. Domestication and breeding of Maxwell's duiker. The Nigerian Field 42(4):13-21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antelope</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Spinage, C.A. 1986. The Natural History of Antelopes. Christopher Helm, UK. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Klipspringer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dunbar, R. and P. Dunbar. 1974. Zeitschrift fur Tierpsychologie 35:481-493.</P>
+<P ALIGN="JUSTIFY">Dunbar, R.I.M. 1979. Energetics, thermoregulation and the behavioural ecology of klipspringer. African Journal of Ecology 17:217-230.</P>
+<P ALIGN="JUSTIFY">Dunbar, R. I . M . and E. P. Dunbar. 1 980 . The pairbond in klipspringer. A nimal Beha vior 28:219-229.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dikdik</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hendricks, H. 1975. Zeitschrift fdr Tierpsychologie 38:55-69.</P>
+<P ALIGN="JUSTIFY">Feer, F. 1979. Observations Tcologiques sur le neotrague de Bates (Neltragus bates) de Winton, 1903, Artiodactyle, ruminant, Bovide) du nord-est du gabon. Terre et vie 33: 159-239.</P>
+<P ALIGN="JUSTIFY">Hoppe, P.P. 1975. Acta Physiol. Scand. 95, 9A.</P>
+<P ALIGN="JUSTIFY">Hoppe, P. P. 1 976 . Tritiated water turnover in Kirk' s dikdik, Madoqua (Rhynchotragus) kirk), Gunther, 1880. Zeischrift far Sadgetierkunde, Mitt. 24:318-319.</P>
+<P ALIGN="JUSTIFY">Hoppe, P.P. 1977. How to survive heat and aridity: ecophysiology of the dikdik antelope. Veterinary Medical Review 1:77-86.</P>
+<P ALIGN="JUSTIFY">Hoppe, P.P. 1977. Comparison of voluntary food and water intake and digestion in Kirk's dik-dik and suni. East African Wildlife Journal 15:41-48.</P>
+<P ALIGN="JUSTIFY">Hoppe, P.P. 1977. Rumen fermentation and body weight in African ruminants. Pages 141-150 in Proceedings 13th International Congress of Game Biologists, T.J. Peterle, ed. Wildlife Society, Washington, D.C., USA.</P>
+<P ALIGN="JUSTIFY">Hoppe, P. 1984. Strategies of digestion in African herbivores. Pages 222-243 in Herbivore Nutrition in the Tropics and Subtropics. F.M.C. Gilchrist and R.I. Machie, eds. The Science Press, South Africa.</P>
+<P ALIGN="JUSTIFY">Hungate, R.E., G.D. Phillips, A. McGregor, D.P. Hungate, and H.K. Buechner. 1959. Microbial fermentation in certain mammals. Science 130:1192-1194.</P>
+<P ALIGN="JUSTIFY">Morat, P. and M. Nording. 1978. Maximum food intake and passage of markers in the alimentary tract of the lesser mouse-deer. Malaysian Applied Biology 7:11-17.</P>
+<P ALIGN="JUSTIFY">Yalden, D.W., M.J. Largen, and D. Kock. 1984. Catalogue of the mammals of Ethiopia. 5. Artiodactyla. Monitore Zoologico Italiano Supplemento 19:67-221.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIZARDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Green Iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burghardt, G.M. and A.S. Rand, eds. 1982. Iguanas of the World: Behavior, Ecology, and Conservation. Noyes, Park Ridge, New Jersey, USA.</P>
+<P ALIGN="JUSTIFY">Fitch, H.S. and R.W. Henderson. 1977. Age and Sex Differences, Reproduction and Conservation of Iguana iguana. Milwaukee Public Museum Press. Milwaukee, Wisconsin, USA.</P>
+<P ALIGN="JUSTIFY">Hirth, H.F. 1963. Some aspects of the natural history of Iguana iguana on a tropical strand. Ecology 44:613-615.</P>
+<P ALIGN="JUSTIFY">Klein, E.H. 1982. Reproduction of the green iguana (Iguana iguna L.) in the tropical dry forest of southern Honduras. Brenesia 19/20:301-310. </P>
+<P ALIGN="JUSTIFY">Lazell, J.D., Jr. 1973. The lizard genus Iguana in the Lesser Antilles. Bulletin of the Museum of Comparative Zoology, Harvard University 145(1):1-28.</P>
+<P ALIGN="JUSTIFY">Tamsitt, J.R. and D. Valdivieso. 1963. The herpetofauna of the Caribbean Islands San Andres and Providencia. Revista de Biologfa Tropical 11(2): 131- 139. (Copies available from C. LardT, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Van Devender, R.W. 1982. Growth and ecology of spiny-tailed and green iguanas in Costa Rica. with comments on the evolution of herbivory and large body size. Pages 162-183 in Iguanas of the World. Behavior, Ecology, and Conservation. Noyes, Park Ridge, New Jersey, USA.</P>
+<P ALIGN="JUSTIFY">Werner, D. and T. Miller. 1984. Artificial nests for female green iguanas. Herpetological Review 15(2):57-58.</P>
+<P ALIGN="JUSTIFY">Werner, D. 1986. Iguana management in Central America. BOSTID Developments 6(1). 4 pp. (Available from BOSTID Publications, HA 476, National Research Council, 2101 Constitution Avenue, N.W., Washington, D.C. 20418.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black Iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burghardt, G.M. and A.S. Rand, eds. 1982. Iguanas of the World: Behavior, Ecology, and Conservation. Noyes, Park Ridge, New Jersey, USA.</P>
+<P ALIGN="JUSTIFY">Fitch, H.S. and R.W. Henderson. 1978. Ecology and exploitation of Ctenosaura similis. University of Kansas Science Bulletin 51 :483-500. (Copies available from the authors, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Fitch, H.S., R.W. Henderson, and D.M. Hillis. 1982. Exploitation of Iguanas in Central America. In Iguanas of the World: Behavior, Ecology, and Consen~ation. Noyes, Park Ridge, New Jersey, USA.</P>
+<P ALIGN="JUSTIFY">Iverson, J.B. 1979. Behavior and ecology of the rock iguana, Cyclura carinata. Bulletin of the Florida State Museum Biological Science 24(3):175-358.</P>
+<P ALIGN="JUSTIFY">Martinez, M.G. 1986. Habitos alimenticios de iguanas y garrobos. La Prensa Grafica, San Salvador, May 5:55. (Copies available from G. LardT, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY">Sanchez, S.A. 1985. El garrobo. El Diario de Hoy, San Salvador June 18:36. (Copies available from G. LardT, see Research Contacts.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tegu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Donadio, O.K. and J.M. Gallardo. 1984. Biologia y Conservacion de las Especies del GTnero Tupinambis (Squamata, Sauria Teiidae) en la Republica Argentina. Revista del Museo Argentino de Ciencias Naturales 'Bernardino Rivadavia" Zoologia, 13(11):117-127. Agosto.</P>
+<P ALIGN="JUSTIFY">Revision Bibliografica de algunos aspectos de la Biologfa conservacion y explotacion de los lagartos del gTnero topinambis (Daudin, 1803) by Laura Venturino, Dr. Thesis, Universidad de la Republic (Uruguay) 1983).</P>
+<P ALIGN="JUSTIFY">Report to World Wildlife Fund, USA, Biologia y aprovechamiento de una poblacion de Tupinambis references, by Claudio Blanco and Leohor Pessina (1985).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the publications listed, many countries run beekeeping programs, and have literature and extension services available based on local experiences. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The International Bee Research Association (IBRA) publishes a Newsletter for Beekeepers in Tropical and Subtropical Countries twice each year. Its purpose is to provide a forum for exchange of information about beekeeping. The Newsletter is funded by the United Kingdom Overseas Development Agency (ODA) and is distributed free of charge to those in developing countries involved with beekeeping. Write to the International Bee Research Association, 18 North Road, Cardiff CFI 3DY, United Kingdom, for subscription information. The IBRA can also provide information on forthcoming conferences, grant programs, and the names of other beekeepers in your country. The International Agency for Apiculture Development (IAAD) publishes a quarterly newsletter called Cornucopia that contains articles from beekeepers around the world, especially from the developing world. It provides information on producing, selling, and manufacturing hive products on a local level and discusses agroforestry and the pest and pesticide problems of honeybees. Write to Cornucopia, c/o M. Coleman, 6N 909 Roosevelt Avenue, St. Charles, Illinois 60174, USA, for a free sample. Subscriptions are $12 a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adjare, S. 1984. The Golden Insect: a Handbook on Beekeeping for Beginners. Technology Consultancy Centre, University of Science and Technology, Kumasi, Ghana, in association with Intermediate Technology Publications, Ltd., 9 King Street, Covent Garden, London, WC2 E8HN, UK. 103 pp.</P>
+<P ALIGN="JUSTIFY">Anderson, R.H., B. Buys, and M.F. Johannsmeier. 1983. Beekeeping in South Africa. Department of Agriculture BuHetin No. 394. Pretoria, South Africa. 207 pp.</P>
+<P ALIGN="JUSTIFY">Bradbear, N. and D. De Jong. 1985. The management of africanized honeybees. IBRA Leaflet No. 2. International Bee Research Association (IBRA). Available in English or Spanish from Hill House, Gerrards Cross, Buckinghamshire SL9 ONR, UK. 4 pp.</P>
+<P ALIGN="JUSTIFY">Clauss, B. 1982. A Beekeeping Handbook. Agricultural Information Service, Gaborne, Botswana. 65 pp.</P>
+<P ALIGN="JUSTIFY">Crane, E., P. Walker, and R. Day. 1984. Honey plants of the world. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">FAO. 1984. Proceedings of the expert consultation on beekeeping with Apis mellifera in tropical and sub-tropical Asia. 9-14 April, 1984. FAO Regional Office for Asia and the Tropical Region, Paliwan Mansion, Phra Atit Road, Bangkok, Thailand.</P>
+<P ALIGN="JUSTIFY">Gentry, C. 1984. Small Scale Beekeeping. Manual M-17. Peace Corps, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">IBRC. 1976. Apiculture in Tropical Climates. E. Crane, ed. Full report of the First Conference. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">IBRC. 1982. Proceedings of the Second International Conference on Apiculture in Tropical Climates. New Delhi, 1980. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">IBRC. 1985. Proceedings of the Third international Conference on Apiculture in Tropical Climates. Nairobi, Kenya, November 5-9, 1984. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">IBRC. 1988. Proceedings of the Fourth International Conference on Apiculture in Tropical Climates. Cairo, Egypt, November 1988. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">Kigatiira, K.I. 1974. Hive Designs for Beekeeping in Kenya. Proceedings Entomological Society of Ontario 105:118-128.</P>
+<P ALIGN="JUSTIFY">McGregor, S.E. 1976. Insect Pollination of Cultivated Crop Plants. U.S. Department of Agriculture Handbook No. 496. Government Printing Office, Washington, D.C. 411 pp.</P>
+<P ALIGN="JUSTIFY">Razafindrakoto, C. 1972. Beekeeping in Madagascar. UniversitT Paul-Sabaier de Toulouse, France. 123 pp. </P>
+<P ALIGN="JUSTIFY">Sammataro, D. 1985. Beekeeping in the Philippines. 2nd edition. International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">Sammataro, D. and A. Avitabile. 1986. Beekeepers Handbook. 2nd edition. Collier Books' MacMillan Co., New York.</P>
+<P ALIGN="JUSTIFY">Saubolle, B.R, and A. Bachmann. 1979. Beekeeping: an Introduction to Modern Beekeeping in Nepal. Sahayogi Prahashan, Tripureshwar, Kathmandu, Nepal.</P>
+<P ALIGN="JUSTIFY">Silberrad, Roger E.M. n.d. Beekeeping in Zambia. Apimondia. Available through the International Bee Research Association, London.</P>
+<P ALIGN="JUSTIFY">Singh, S. 1964. Beekeeping in India. Silver Jubilee Publication of the Entomological Society of India. Entomological Society of India, New Delhi.</P>
+<P ALIGN="JUSTIFY">Smith, Francis G. 1960. Beekeeping in the Tropics. Western Printing Service, Bristol UK.</P>
+<P ALIGN="JUSTIFY">Townsend, G.F. 1978. Preparation of Honey for Market. Ministry of Agriculture and Food Publication 544. Ministry of Agriculture and Food, Ontario, Canada.</P>
+<P ALIGN="JUSTIFY">Townsend, G.F. 1976. Transitional hives for use with the tropical African bee Apis mellifera adansonii. Pages 181-189 in Apiculture in Tropical Climates. E. Crane, ed. Full report of the First Conference. International Bee Research Association, London. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">B Research Contacts</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This section includes the names and addresses of individuals and institutions who are familiar with the animal listed. Each person has agreed to answer requests for information and advice. This personal follow-through is the main way this book can stimulate the development of microlivestock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICROBREEDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microcattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B.K. Ahunu, Animal Science Department, University of Ghana, P.O. Box 25, Legon, Ghana</P>
+<P ALIGN="JUSTIFY">D.O. Alonge, Meat Hygiene and Preservation Laboratory, Faculty of Veterinary Medicine, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">M. Andres Poli, EEA San Luis INTA, CC 17, 5730 Mercedes (SL), Argentina</P>
+<P ALIGN="JUSTIFY">F.B. Bareeba, Department of Animal Science, Makerere University, P.O. Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">J.A. Bennett, Department of Animal, Dairy, and Veterinary Sciences, Utah State University, Logan, Utah 84322-4815, USA</P>
+<P ALIGN="JUSTIFY">J.M. Berruecos V., School of Veterinary Medicine and Zoology, Universidad Nacional Aut6noma de MTxico, Ciudad Universitaria, Alvaro Obreg6n, 04510, Mexico D.F., Mexico</P>
+<P ALIGN="JUSTIFY">Cai Li, Animal Science and Veterinary Research Institute, Southwest College of Minority Nationalities, Chengdu, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Centro de Investigaciones Pecuarias (CENIP), A.P. 227-9, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">G.L. Chan, B4-5 Nanyang Mansion, Shenzhen, Guangdong, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Y. Cheneau, Institut d'Elevage et de MTdecine VTtTrinaire des Pays Tropicaux, Laboratoire de Farcha, BP 433, N'Djamena, Chad</P>
+<P ALIGN="JUSTIFY">Cheng Peilieu, Institute of Animal Science, Chinese Academy of Sciences, Beijing, People's Republic of China</P>
+<P ALIGN="JUSTIFY">W.R. Cockrill, 29 Downs Park West, Bristol BS6 7QH, UK</P>
+<P ALIGN="JUSTIFY">J.H. Conrad, Department of Animal Science, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">T.J. Cunha, P.O. Box R, La Verne, California 91750, USA</P>
+<P ALIGN="JUSTIFY">D.E. Deppner, Trees for the Future, 11306 Estona Drive, Silver Spring, Maryland 20902, USA (breeds of the Himalayas, East Indies)</P>
+<P ALIGN="JUSTIFY">C. Devendra, Agriculture Food and Nutrition Sciences Division, International Development Research Centre (IDRC), Tanglin P.O. Box 101, 9124 Singapore</P>
+<P ALIGN="JUSTIFY">N.l. Dim, Department of Animal Science, Faculty of Agriculture, Institute for Agricultural Research, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">Director, Agriculture and Forestry, PB 13184, Windhoek 9000, Namibia</P>
+<P ALIGN="JUSTIFY">V.M.S. Duarte, Instituto de Investigatao Veterinaria, C.P. 7, Huambo, Angola</P>
+<P ALIGN="JUSTIFY">M. Felius, Kerkhoflaan 47C, 3034 TA Rotterdam, The Netherlands</P>
+<P ALIGN="JUSTIFY">D. Fleharty, American Dexter Cattle Association, R.R. #1, Box 378, Concordia, Missouri 64020. USA </P>
+<P ALIGN="JUSTIFY">G. Garcia Lagombra, Animal Husbandry Department, Universidad Nacional "Pedro Henriquez Urena," Decanato Ciencias Agropecuarias, Km 5~/z Aut. Duarte, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">F. Gebreab, College of Veterinary Science, Addis Ababa University, Addis Ababa, Ethiopia</P>
+<P ALIGN="JUSTIFY">G.F.W. Haenlein, Department of Animal Science and Agricultural Biochemistry University of Delaware, Newark, Delaware 19717-1303, USA</P>
+<P ALIGN="JUSTIFY">Z.B. Jensen, Animal and Dairy Science Research Institute, PB X02, Irene, Transvaal 1675, South Africa</P>
+<P ALIGN="JUSTIFY">Jin Xizhen, Animal Science and Veterinary Research Institute, Southwest College of Minority Nationalities, Chengdu, People's Republic of China</P>
+<P ALIGN="JUSTIFY">G. Kitsopanidis, Faculty of Agriculture, Aristotelian University of Thessaloniki, University Campus, Thessaloniki, Greece</P>
+<P ALIGN="JUSTIFY">G.E. Kodituwakku, Department of Veterinary Clinical Studies, University of Peradeniya, Peradeniya, Sri Lanka</P>
+<P ALIGN="JUSTIFY">N.M. Konnerup, 74 North Sunrise Boulevard, Camano Island, Washington 98292, USA</P>
+<P ALIGN="JUSTIFY">L.Y.L. Li, Department of Animal Husbandry and Veterinary Science, South China Agricultural College, Ghangzhou, People's Republic of China</P>
+<P ALIGN="JUSTIFY">J.K. Loosli, 406 S.W. 40th Street, Gainesville, Florida 32607, USA</P>
+<P ALIGN="JUSTIFY">A.B. Lwoga, Sokoine University of Agriculture, P.O. Box 3000, Morogoro, Tanzania</P>
+<P ALIGN="JUSTIFY">A. Martinez Balboa, Legaspy 1025, Apartado Postal 43, 23000, La Paz, Baja California Sur, Mexico</P>
+<P ALIGN="JUSTIFY">A. Masam, Livestock Training Institute, Tengeru, P.O. Box 3101, Arusha, Tanzania</P>
+<P ALIGN="JUSTIFY">J.P. Maule, Hannahfield Quarry House, 578 Lanark Road West, Balerno, Midlothian EH 14 7BN, UK</P>
+<P ALIGN="JUSTIFY">M. Mazid, Faculty of Agriculture, University of Aleppo, Aleppo, Syria</P>
+<P ALIGN="JUSTIFY">L.R. McDowell, Department of Animal Sciences, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">J.A. Morgan, College of Natural Resources and Environmental Studies, University of Juba, P.O. Box 82, Juba, Sudan</P>
+<P ALIGN="JUSTIFY">D.B. Mpiri, Livestock Production Research Institute, Private Bag, Mpwapwa, Tanzania</P>
+<P ALIGN="JUSTIFY">Ni Shicheng, Animal Husbandry and Veterinary Science, Zhejiang Agricultural University, Hangzhou, People's Republic of China</P>
+<P ALIGN="JUSTIFY">B. Nikolov, Institute of Cattle and Sheep Breeding, 6000 Stara Zagora, Bulgaria</P>
+<P ALIGN="JUSTIFY">T. Olson, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">T.W. Perry, Department of Animal Sciences, Purdue University, West Lafayette, Indiana 47907, USA</P>
+<P ALIGN="JUSTIFY">R.W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY">F. Pirchner, Technical University of Munich, D-8050 Munich-Weihenstephan, Germany</P>
+<P ALIGN="JUSTIFY">A. Ramamohana Rao, Postgraduate Studies, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad, Andhra Pradesh 500 030, India</P>
+<P ALIGN="JUSTIFY">Soedomo Reksohadiprodjo, Department of Animai Nutrition, Faculty of Animal Husbandry, Universitas Gadjah Mada, Sekip Blok N-42, Yogyakarta, Indonesia</P>
+<P ALIGN="JUSTIFY">A.Y. Robles, Dairy Training and Research Institute, University of the Philippines at Los Banos, College, Laguna 3732, Philippines</P>
+<P ALIGN="JUSTIFY">Sie Cheuxia, Department of Animal Science, Nanjing Agricultural University, Nanjing, People's Republic of China</P>
+<P ALIGN="JUSTIFY">A.D. Tillman, 523 West Harned Place, Stillwater, Oklahoma 74074, USA</P>
+<P ALIGN="JUSTIFY">J.C.M. Trail, Livestock Productivity and Trypanotolerance Group, International Livestock Centre for Africa (ILCA), P.O. Box 30709, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">A.C. Warnick, Department of Animal Science, University of Florida, Gainesville, Florida 32611, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microgoat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">E.A. Adebowale, Institute of Agricultural Research and Training, University of Ife, Moor Plantation, P.M.B. 5029, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">A.A. Adeloye, Faculty of Agriculture, Adeyemi College of Education, Onjo, Nigeria</P>
+<P ALIGN="JUSTIFY">A.A. Ademosun, Department of Animal Science, University of Ife, lle-Ife, Nigeria</P>
+<P ALIGN="JUSTIFY">I.F. Adu, N.A.P.R.I., Ahmadu Bello University, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">I.A. Akinbode, Faculty of Agriculture, University of Ife, Ile-Ife, Nigeria</P>
+<P ALIGN="JUSTIFY">A.O. Akinsoyinu, Department of Animal Science, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">J.A. Akonji, Institut de Recherches Zootechniques, Office National de la Recherche Scientifique et Technique (ONAREST), B.P. 65, Yaounde, Cameroon</P>
+<P ALIGN="JUSTIFY">D.O. Alonge, Faculty of Veterinary Medicine, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">Baik Dong Hoon, Department of Animal Science, College of Agriculture, Jeonbug National University, JEONJU, 520, Republic of Korea</P>
+<P ALIGN="JUSTIFY">J.S.F. Barker, Department of Animal Science, University of New England, Armidale, New South Wales 2351, Australia</P>
+<P ALIGN="JUSTIFY">K. Boateng, Cooperative Extension Service, University of the Virgin Islands, Box L, Kingshill, St. Croix, Virgin Islands 00850, USA</P>
+<P ALIGN="JUSTIFY">G.E. Bradford, University of California, Davis, California 95616, USA</P>
+<P ALIGN="JUSTIFY">M.S. Browne, Nutrition Consulting Services, P.O. Box 788, St. Thomas, Virgin Islands 00801, USA</P>
+<P ALIGN="JUSTIFY">T.D. Bunch, Department of Animal, Dairy, and Veterinary Sciences, Utah State University, Logan, Utah 84322-4815, USA</P>
+<P ALIGN="JUSTIFY">T.C. Cartwright, Department of Animal Science, Texas A&amp;M University, College Station, Texas 77843, USA</P>
+<P ALIGN="JUSTIFY">Centro de Investigaciones Pecuarias (CENIP), A.P. 227-9, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">C. Devendra, Agriculture Food and Nutrition Sciences Division, International Development Research Centre (IDRC), Tanglin P.O. Box 101, 9124 Singapore, Singapore</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Department of Animal Science, Faculty of Agriculture, Institute for Agricultural Research, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">D. Fielding, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">H.A. Fitzhugh, Winrock International, Route 3, Petit Jean Mountain, Morrilton, Arkansas 72110, USA</P>
+<P ALIGN="JUSTIFY">W.C. Foote, Utah State University International Sheep and Goat Institute, UNC 48, Utah State University, Logan, Utah 84322, USA</P>
+<P ALIGN="JUSTIFY">G.R. Gerona, Department of Animal Science and Veterinary Medicine, Visayas State College of Agriculture, Baybay, Leyte, Philippines</P>
+<P ALIGN="JUSTIFY">G.F.W. Haenlein, Department of Animal Science and Agricultural Biochemistry, University of Delaware, Newark, Delaware 19717-1303, USA</P>
+<P ALIGN="JUSTIFY">A. Essa Haid, Essa International, Inc., 2550 M Street, Suite 405, Washington, D.C. 20037, USA (small East African)</P>
+<P ALIGN="JUSTIFY">W. Harding, Agrarian Society, Palazzo de la Salle, Valletta, Malta</P>
+<P ALIGN="JUSTIFY">M.A. Hasnath, Department of Animal Husbandry, Bangladesh Agricultural University, P.O. Agricultural University, Mymensingh, Bangladesh</P>
+<P ALIGN="JUSTIFY">A.S. Hoversland, Division of Research Grants, National Institutes of Health, 5333 Westbard Avenue, Bethesda, Maryland 20205, USA</P>
+<P ALIGN="JUSTIFY">L. Hulse, National Pygmy Goat Association, RFD #1, Fern Avenue, Amesbury, Massachusetts 01913, USA</P>
+<P ALIGN="JUSTIFY">T.P. Husband, Department of Natural Resource Science, University of Rhode Island, Kingston, Rhode Island 02881, USA (bezoar, agrimi) </P>
+<P ALIGN="JUSTIFY">D.L. Huss, P.O. Box 426, Menard, Texas 76859, USA</P>
+<P ALIGN="JUSTIFY">B. Hutchins, 2535 Halsted Road, Apartment 1, Rockford, Illinois 61103, USA</P>
+<P ALIGN="JUSTIFY">N. Iba+ez Herrera, Paraguay 160-Urbanizacion, Apartado 315, El Recreo, Trujillo, Peru</P>
+<P ALIGN="JUSTIFY">S. Karam Shah, Livestock Experimental Station Rakh Khairewala, District Muzaffergarh, Pakistan</P>
+<P ALIGN="JUSTIFY">C. Katongole, Faculty of Veterinary Medicine, Makerere University, PO Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">G. Kiwuwa, Department of Animal Science, Makerere University, PO Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">L.Y.L. Li, Department of Animal Husbandry and Veterinary Science, South China Agricultural College, Ghangzhou, People's Republic of China</P>
+<P ALIGN="JUSTIFY">D.R. Lincicome, Animal Parasitology Institute, U.S. Department of Agric£lture, Building 1180, BARC-East, Beltsville, Maryland 20705, USA</P>
+<P ALIGN="JUSTIFY">Liu Chengxiang, Animal Husbandry and Veterinary Science Research Institute, Guang^ dong Agricultural Academy, Guangdong, People's Republic of China</P>
+<P ALIGN="JUSTIFY">J.K. Loosli, 406 S.W. 40th Street, Gainesville, Florida 32607, USA</P>
+<P ALIGN="JUSTIFY">M. Mahyuddin Dahan, Department of Animal Sciences, Universiti Pertanian Malaysia, Serdang, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY">G.C.H. Mandari, Livestock Research Centre, West Kilimanjaro, P.O. Box 103, Hai, Tanzania</P>
+<P ALIGN="JUSTIFY">J. Mann, Institute of Tropical Veterinary Medicine, University of Giessen, Germany</P>
+<P ALIGN="JUSTIFY">A. Martinez Balboa, Legaspy 1025, Apartado Postal 43, 23000, La Paz, Baja California Sur, Mexico</P>
+<P ALIGN="JUSTIFY">I. Mecha, Department of Animal Science, University of Nigeria, Nsukka, Anambra State, Nigeria</P>
+<P ALIGN="JUSTIFY">J. Metcalf, School of Medicine, University of Oregon, Eugene, Oregon 97403, USA</P>
+<P ALIGN="JUSTIFY">K. Mitchell, Baptist Bible Institute, P.O. Box 301, Basseterre, St. Kitts, West Indies</P>
+<P ALIGN="JUSTIFY">M. Khusahry Mohd Yusuff, Malaysian Agricultural and Research Institute (MARDI), G.P.O. Box 12301, Kuala Lumpur 01-02, Malaysia</P>
+<P ALIGN="JUSTIFY">A. Monsi, Departments of Animal Science/Food Science and Technology, Rivers State University of Science and Technology, P.M.B. 5080, Port Harcourt, Nigeria</P>
+<P ALIGN="JUSTIFY">G. Montsma, Klomperweg 79, 6741 PD, Lunteren, Netherlands</P>
+<P ALIGN="JUSTIFY">J. Moore, Department of Animal Science, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">C.M. Munyabuntu, Department of Animal Science, P.O. Box 7062, Makerere University' Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">Th. Murayi, Institut des Sciences Agronomiques du Rwanda, P.O. Box 138, Butare, Rwanda</P>
+<P ALIGN="JUSTIFY">W.N.M. Mwenya, School of Agricultural Sciences, University of Zambia, Box 32379, Lusaka, Zambia</P>
+<P ALIGN="JUSTIFY">A. Nivyobizi, FacultT des Sciences Agronomiques, UniversitT du Burundi, BP 2940, Bujumbura, Burundi</P>
+<P ALIGN="JUSTIFY">G.A. Norman, Tropical Development Research Institute, 56/62 Gray's Inn Road, London WCIX 8LU, UK</P>
+<P ALIGN="JUSTIFY">K. Okello-Lapenga, Department of Veterinary Pathobiology, Makerere University, PO Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">S. Ramahefarison, DTpartement de Recherches Zootechniques et VTtTrinaires tCENRADERU), BP 904, Amatobe, Antananarivo, Madagascar</P>
+<P ALIGN="JUSTIFY">A. Ramamohana Rao, Postgraduate Studies, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad, Andhra Pradesh 500 030, India</P>
+<P ALIGN="JUSTIFY">R.K. Rastogi, Department of Livestock Science, University of the West Indies, St. Augustine, Trinidad, West Indies </P>
+<P ALIGN="JUSTIFY">G. Rasul, District Forest Officer &amp; Wildlffe Warden, P.O. Box 501, Gilgit (northern area), Pakistan</P>
+<P ALIGN="JUSTIFY">D. Rattner, Institute of Animal Research, Kibbutz Lahav, Israel (Sinai goat, ya-ez hybrids)</P>
+<P ALIGN="JUSTIFY">Soedomo Reksohadiprodjo, Department of Animal Nutrition, Faculty of Animal Husbandry, Universitas Gadjah Mada, Sekip Blok N-42, Yogyakarta, Indonesia</P>
+<P ALIGN="JUSTIFY">A. Repollo, Jr., Palawan National Agricultural College, Aborlan, Palawan, Philippines</P>
+<P ALIGN="JUSTIFY">A.Y. Robles, Dairy Training and Research Institute, University of the Pbilippines, Los Banos, Laguna 3732, Philippines</P>
+<P ALIGN="JUSTIFY">A. Rocha, Instituto de Reprodutao e Melhoramento Animal, C.P. 25, Matola, Mozambique</P>
+<P ALIGN="JUSTIFY">C. Rodriguez, Centro de Investigaciones Pecuarias (CENIP), Autopista Duarte Km 24, Apartado 227-9, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">M. Nasim Siddiqi, Zoology Department, University of Peshawar, N.W.F.P., Pakistan</P>
+<P ALIGN="JUSTIFY">M. Shelton, Texas A &amp; M University, College Station, Texas 77843, USA (criollo)</P>
+<P ALIGN="JUSTIFY">A. Shkolnik, Department of Zoology, Tel Aviv University, Tel Aviv, Israel</P>
+<P ALIGN="JUSTIFY">O.C. Simpson, Cameroon Road, Prairie View A&amp;M University, Prairie View, Texas 77445, USA</P>
+<P ALIGN="JUSTIFY">Sie Chenxia, Department of Animal Science, Nanjing Agricultural University, Nanjing, People's Republic of Cbina</P>
+<P ALIGN="JUSTIFY">R.G. Wahome, Department of Animal Production, University of Nairobi, P.O. Box 29053, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">R. Watts, Animal Science Department, Natural Resources Development College, Lusaka, Zambia</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY">H. Wood, Highland Game Farm, Route 4, Box 450, Alexandria, Indiana 46001, USA</P>
+<P ALIGN="JUSTIFY">T.P. Husband, Department of Natural Resources Science, University of Rhode Island, Kingston, Rhode Island 02881, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Microsheep</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">E.A. Adebowale, Institute of Agricultural Research and Training, University of Ife, Moor Plantation, P.M.B. 5029, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">I.F. Adu, N.A.P.R.I., Ahmadu Bello University, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">I.A. Akinbode, Faculty of Agriculture, University of Ife, Ile-Ife, Nigeria</P>
+<P ALIGN="JUSTIFY">A.O. Akinsoyinu, Department of Animal Science, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">M. Amin, Jammu and Kashmis State Sheep and Shearing Products Development Board, Nowshera, Srinigar, Kashmir 190 011, India</P>
+<P ALIGN="JUSTIFY">Ahmad Mustaffa B. HJ. Babjee, Veterinary Services Department, Ibu Pejabat Perkhidmatan Haiwan, Kementerian Pertanian, Malaysia, Jalan Mahameru, Kuala Lumpur 10-02, Malaysia (grazing in rubber plantations)</P>
+<P ALIGN="JUSTIFY">J.S.F. Barker, Department of Animal Science, University of New England, Armidale, New South Wales, 2351, Australia (Indonesian breeds)</P>
+<P ALIGN="JUSTIFY">K. Boateng, Cooperative Extension Service, College of the Virgin Islands, Box L, Kingshill, St. Croix, Virgin Islands 00850, USA</P>
+<P ALIGN="JUSTIFY">G.E. Bradford, University of Calffornia, Davis, Calffornia 95616, USA</P>
+<P ALIGN="JUSTIFY">R. Breckle, U.S. Forest Service, Alsea, Oregon 97324, USA (grazing sheep in forests)</P>
+<P ALIGN="JUSTIFY">T. Bunch, Department of Animal, Dairy, and Veterinary Sciences, Utah State University, Logan, Utah 84322-4815, USA (Iranian thin-tailed, Navajo, wild-sheep hybrids)</P>
+<P ALIGN="JUSTIFY">M. Carpio P., Departamento de Produccion Animal, Universidad Nacional Agraria, Apartado 456, La Molina, Lima, Peru </P>
+<P ALIGN="JUSTIFY">Centro de Investigaciones Pecuarias (CENIP), A.P. 227-9, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">S. Cottrell, Pippin Farm, 3081 Goshen Road, Bellingham, Washington 98226, USA</P>
+<P ALIGN="JUSTIFY">C. Courtney, Veterinary Faculty, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">D. Deller, Virgin Islands Department of Agriculture, St. Thomas, Virgin Islands 00820, USA</P>
+<P ALIGN="JUSTIFY">A. Dettmers, 5620 Longwood Avenue, Port Charlotte, Florida 33953, USA (West African dwarf)</P>
+<P ALIGN="JUSTIFY">C. Devendra, Agricultural Food and Nutrition Sciences Division International Development Research Centre (IDRC), Tanglin P.O. Box 101, 9124 Singapore, Singapore</P>
+<P ALIGN="JUSTIFY">N.l. Dim, Department of Animal Science, Faculty of Agriculture, Institute for Agricultural Research, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">K. Drew, Invermay Agricultural Research Centre, Private Bag, Mosgiel, New Zealand</P>
+<P ALIGN="JUSTIFY">F. El Amin, Department of Animal Husandry, Faculty of Veterinary Science, University of Khartoum, P.O. Box 32, Khartoum North, Sudan</P>
+<P ALIGN="JUSTIFY">Gholam-Hossein Erabi, Faculty of Agriculture, University of Tabriz, Tabriz 51664, Iran</P>
+<P ALIGN="JUSTIFY">H.A. Fitzhugh, Winrock International Institute for Agricultural Development, Route 3, Petit Jean Mountain, Morrilton, Arkansas 72110, USA</P>
+<P ALIGN="JUSTIFY">W. Foote, Animal' Dairy, and Veterinary Science Department, UNC 48, Utah State University, Logan, Utah 84322-4815, USA (Virgin Islands white hair, wild-sheep hybrids)</P>
+<P ALIGN="JUSTIFY">E.-H. Gueye, Centre de Recherches Zootechniques de Kolda, Institut SenTgalais de Recherches Agricoles, (ISRA), B.P. 53, Kolda, Senegal</P>
+<P ALIGN="JUSTIFY">G. Garcia Lagombra, Animal Husbandry Department, Universidad Nacional "Pedro Henriquez Urena," Decanato Ciencias Agropecuarias, Km 5 1/2 Aut. Duarte, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">G.F.W. Haenlein, Department of Animal Science and Agricultural Biochemistry, University of Delaware, Newark, Delaware 19717-1303, USA</P>
+<P ALIGN="JUSTIFY">E. Henson, Bemborough, Guiting Power, Cheltenham, Gloucester, UK (rare breeds)</P>
+<P ALIGN="JUSTIFY">D.L. Huss, P.O. Box 426, Menard, Texas 76859, USA</P>
+<P ALIGN="JUSTIFY">N. Ibanez Herrera, Paraguay 160 - Urbanizacion, Apartado 315, El Recreo, Trujillo, Peru</P>
+<P ALIGN="JUSTIFY">P. Jewell, Department of Physiology, University of Cambridge, Cambridge CB2 ITN, UK</P>
+<P ALIGN="JUSTIFY">Jones Sheep Farm, RR 2 Box 185-55, Peabody, Kansas 66866, USA</P>
+<P ALIGN="JUSTIFY">P.E. Loggins, Animal Science Department, 108-D Suite, University of Florida, Gainesville, Florida32611, USA</P>
+<P ALIGN="JUSTIFY">J.K. Loosli, 406 S.W. 40th Street, Gainesville, Florida 32607, USA</P>
+<P ALIGN="JUSTIFY">G.C.H. Mandari, Livestock Research Centre, West Kilimanjaro, P.O. Box 103, Hai, Tanzania</P>
+<P ALIGN="JUSTIFY">J.P. Maule, Hannahfield Quarry House, 578 Lanark Road West, Balerno, Midlothian EH14 7BN, UK</P>
+<P ALIGN="JUSTIFY">L.K. McNeal, Animal, Dairy, and Veterinary Science Department, UNC 48, Utah State University, Logan, Utah 84322-4815, USA</P>
+<P ALIGN="JUSTIFY">I. Mecha, Department of Animal Science, University of Nigeria, Nsukka, Anambra State, Nigeria</P>
+<P ALIGN="JUSTIFY">K. Mitchell, Baptist Bible Institute, P.O. Box 301, Basseterre, St. Kitts, West Indies</P>
+<P ALIGN="JUSTIFY">A. Monsi, Department of Animal Science, Food Science and Technology, Rivers State University of Science and Technology, P.M.B. 5080, Port Harcourt, Nigeria</P>
+<P ALIGN="JUSTIFY">C.M. Munyabuntu, Department of Animal Science, Makerere University, P.O. Box 7062, Kampala, Uganda </P>
+<P ALIGN="JUSTIFY">Th. Murayi, Institut des Sciences Agronomiques du Rwanda, P.O. Box 138, Butare, Rwanda</P>
+<P ALIGN="JUSTIFY">W.N.M. Mwenya, School of Agriculture Sciences, University of Zambia, Box 32379, Lusaka,  Zambia</P>
+<P ALIGN="JUSTIFY">M. Ngendahayo, Institut des Sciences Agronomiques du Rwanda, B.P. 138, Butare, Rwanda</P>
+<P ALIGN="JUSTIFY">R. Njwe, DTpartement des Sciences Animales, Ecole Nationale SupTrieure Agronomique, Centre  Universitaire de Dschang, B.P. 138, YaoundT, United Republic of Cameroon</P>
+<P ALIGN="JUSTIFY">W.J.A. Payne, 91 Bedwardine Road, London SE19 3AY, UK</P>
+<P ALIGN="JUSTIFY">R.W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington,  Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY">G.V. Raghavan, Animal Science Department, College of Veterinary Science, Andhra Pradesh  Agricultural University, Rajendranagar, Hyderabad 500 030, Andhra Pradesh, India</P>
+<P ALIGN="JUSTIFY">A. Ramamohana Rao, Postgraduate Studies, Andhra Pradesh Agricultural University,  Rajendranagar, Hyderabad, Andhra Pradesh 500 030, India</P>
+<P ALIGN="JUSTIFY">R.K. Rastogi, Department of Livestock Science, University of the West Indies, St. Augustine,  Trinidad, West Indies</P>
+<P ALIGN="JUSTIFY">Soedomo Reksohadiprodjo, Department of Animal Nutrition, Faculty of Animal Husbandry,  Universitas Gadjah Mada, Sekip Blok N-42, Yogyakarta, Indonesia</P>
+<P ALIGN="JUSTIFY">A.Y. Robles, Dairy Training and Research Institute, University of the Philippines at Los Banos,  College, Laguna 3732, Philippines</P>
+<P ALIGN="JUSTIFY">A. Rocha, Instituto de Reprodutao e Melhoramento Animal, C.P. 25, Matola, Mozambique</P>
+<P ALIGN="JUSTIFY">M.L. Ryder, c/o H.F.R.O., Bush Estate, Penicuik, Edinburgh, UK (Barbados blackbelly, wool)</P>
+<P ALIGN="JUSTIFY">Sie Chenxia, Department of Animal Science, Nanjing Agricultural University, Nanjing, People's  Republic of China</P>
+<P ALIGN="JUSTIFY">C. David Simpson, Range and Wildlife Department, Texas Tech University, P.O. Box 4349,  Lubbock, Texas 79409, USA</P>
+<P ALIGN="JUSTIFY">C.E. Terrill, U.S. Department of Agriculture, Building 005, BARC-West, Beltsville, Maryland 20705,  USA</P>
+<P ALIGN="JUSTIFY">H.N. Turner, Genetics Research Laboratories, CSIRO, P.O. Box 184, North Ryde, New South  Wales 2113, Australia (Indonesian breeds)</P>
+<P ALIGN="JUSTIFY">R. Vaccaro, Universidad Nacional Agraria, La Molina, P.O. Box 456, Lima, Peru</P>
+<P ALIGN="JUSTIFY">R.G. Wahome, Department of Animal Production, P.O. Box 29053, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">S. Wildeus, College of the Virgin Islands, Agricultural Experiment Station, R.R. 2, Box 10051  Kingshill, St. Croix, Virgin Islands 00850, USA</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY">Wu Jitang, Animal and Veterinary Science, Jiangsu Province Academy of Agricultural Sciences,  Nanjing, People's Republic of China</P>
+<P ALIGN="JUSTIFY">A. Yenikoye, FacultT d'Agronomie, UniversitT de Niamey, B.P. 10662, Niamey, Niger</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Micropig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I.A. Akinbode, Faculty of Agriculture, University of Ife, Ile-Ife, Nigeria</P>
+<P ALIGN="JUSTIFY">D.O. Alonge, Meat Hygiene and Preservation Laboratory, Faculty of Veterinary Medicine,  University of Ibadan, Ibadan, Nigeria  </P>
+<P ALIGN="JUSTIFY">J.M. Andrews, Mesoamerican Ecology Institute, Tulane University, New Orleans, Louisiana 70118, USA (Yucatan pig)</P>
+<P ALIGN="JUSTIFY">G. Ashton-Peach, Box 17, Ohaeawai, Bay of Islands, New Zealand (kunekune)</P>
+<P ALIGN="JUSTIFY">M. Berruecos V. Muz, Facultad de Medicina Veterinaria y Zootecnia, Ciudad Universitaria, Mexico D.F., Mexico</P>
+<P ALIGN="JUSTIFY">R. Blakely, Sedgwick County Zoo, Wichita, Kansas 67203, USA (Ossabaw)</P>
+<P ALIGN="JUSTIFY">K. Boateng, Cooperative Extension Service, University of the Virgin Islands, Box L., Kingshill, St. Croix, Virgin Islands 00850, USA</P>
+<P ALIGN="JUSTIFY">I.L. Brisbin, Savannah River Ecology Laboratory, P.O. Drawer E, Aiken, South Carolina 29801, USA (Ossabaw)</P>
+<P ALIGN="JUSTIFY">L. Bustad, Veterinary School, Washington State University, Pullman, Washington, 99163, USA</P>
+<P ALIGN="JUSTIFY">C. Catibog-Sinha, Forest Products Research and Development Institute, College, Laguna 4031, Philippines</P>
+<P ALIGN="JUSTIFY">Centro de Investigaciones Pecuarias (CENIP), A.P. 227-9, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">Charles River Laboratories, Inc., 251 Ballardvale Street, Wilmington, Massachusetts 01887-0630, USA</P>
+<P ALIGN="JUSTIFY">J.H. Conrad, Department of Animal Science, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">T.J. Cunha, PO Box R, LaVerne, California 91750, USA</P>
+<P ALIGN="JUSTIFY">F. Dederer, 712 Brown Street, Philadelphia, Pennsylvania 19123, USA</P>
+<P ALIGN="JUSTIFY">A. Dettmers, 5620 Longwood Avenue, Port Charlotte, Florida 33953, USA (miniature pigs)</P>
+<P ALIGN="JUSTIFY">C. Devendra, Agriculture Food and Nutrition Sciences Division, International Development Research Centre (IDRC), Tanglin P.O. Box 101, 9124 Singapore</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">G. Edgar, Greenhill, I R.D., Balfour, Southland, New Zealand (kunekune)</P>
+<P ALIGN="JUSTIFY">H. Hendricks, Department of Animal, Dairy, and Veterinary Sciences, Utah State University, Logan, Utah 84322-4815, USA</P>
+<P ALIGN="JUSTIFY">B.J. Hepburn, Swine Program, Charles River Laboratories, 251 Ballardvale Street, Wilmington, Massachusetts 01887-0630, USA (laboratory pigs)</P>
+<P ALIGN="JUSTIFY">P. Holbrook, Aria Road' via Te Kuiti, New Zealand (kunekune)</P>
+<P ALIGN="JUSTIFY">R.R. Hook, Jr., Sinclair Medical Research Farm, University of Missouri, Route 3, Columbia, Missouri 65203, USA (laboratory pigs)</P>
+<P ALIGN="JUSTIFY">J.O. Ilori, Faculty of Agriculture, University of If e, Ile-Ife, Nigeria</P>
+<P ALIGN="JUSTIFY">G. E. Kodituwakku, Department of Veterinary Clinical Studies, University of Peradeniya, Peradeniya, Sri Lanka</P>
+<P ALIGN="JUSTIFY">J.K. Loosli, 406 S.W. 40th Street' Gainesville, Florida 32607, USA</P>
+<P ALIGN="JUSTIFY">J.H. Maner, Winrock International, Route 3, Petit Jean Mountain, Morrilton, Arkansas 72110, USA</P>
+<P ALIGN="JUSTIFY">J.J. Mayer, Savannah River Ecology Laboratory, P.O. Drawer E, Aiken, South Carolina 29801, USA (Ossabaw)</P>
+<P ALIGN="JUSTIFY">K. Mitchell, Baptist Bible Institute, P.O. Box 301, Basseterre, St. Kitts, West Indies</P>
+<P ALIGN="JUSTIFY">A. Monsi, Departments of Animal Science/Food Science and Technology, Rivers State University of Science and Technology, P.M.B. 508O, Port Harcourt, Nigeria</P>
+<P ALIGN="JUSTIFY">J. Mtimuni, Livestock Production Department, Bunda College of Agriculture, University of Malawi, P.O. Box 219, Lilongwe, Malawi</P>
+<P ALIGN="JUSTIFY">D.G. Mugisa, c/o Insure Consult, P.O. Box 30002, Nakivubo, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">K. Mull, 2834 Hamner Avenue #208, Norco, California 91760, USA</P>
+<P ALIGN="JUSTIFY">W.L.R. Oliver, Pigs and Peccaries Specialist Group, Jersey Wildlife Prescrvation Trust, Les AugrFs Manor, Jersey, Channel Islands, UK (pigmy hog) </P>
+<P ALIGN="JUSTIFY">L. Panepinto, Redstone Canyon, P.O. Box 105, Masonville, Colorado 80541, USA (miniature pigs)</P>
+<P ALIGN="JUSTIFY">W.J.A. Payne, 91 Bedwardine Road, London SE19 3AY, UK</P>
+<P ALIGN="JUSTIFY">C.C. Perdomo, Centro Nacional de Pesquisa de Suinos e Aves, BR 153, km 110, CP D-3, 89700 Concordia, SC, Brazil</P>
+<P ALIGN="JUSTIFY">R.W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA (Chinese breeds)</P>
+<P ALIGN="JUSTIFY">W.G. Pond, Meat Animal Research Center, U.S. Department of Agriculture, Box 166, Clay Center, Nebraska 68933, USA</P>
+<P ALIGN="JUSTIFY">H. Popenoe, International Programs in Agriculture, 3028 McCarty Hall, University of Florida, Gainesville, Florida 32611, USA (New Guinea pigs)</P>
+<P ALIGN="JUSTIFY">B.S. Reddi, CoHege of Veterinary Science, Andhra Pradesh Agricultural University, Tirupati 517 502, India</P>
+<P ALIGN="JUSTIFY">S. Avendano Reyes, Instituto Nacional de las Investigaciones sobre los Recursos BiotTcnicos, (INIREB), Apartado Postal 97, MTrida, Yucatan, Mexico (Yucatan)</P>
+<P ALIGN="JUSTIFY">C. Robinson, Robinson's Racing Pigs, 5809 20th Avenue South, Tampa, Florida 336195457, USA (miniature pigs)</P>
+<P ALIGN="JUSTIFY">C. Arellano Sota, Regional Office for Latin America and the Caribbean, Food and Agriculture Organization of the United Nations, Casillo 10095, Santiago, Chile (Cuing)</P>
+<P ALIGN="JUSTIFY">A. Sriramamurty, College of Veterinary Science, Andhra Pradesh Agricultural University, Tirupati 517 502, India</P>
+<P ALIGN="JUSTIFY">M.M. Swindle, Comparative Medicine/Lab Animal Resources, Medical University of South Carolina, 171 Ashley Avenue, Charleston, South Carolina 29425, USA (laboratory pigs)</P>
+<P ALIGN="JUSTIFY">N. Tilakaratne, Veterinary Research Institute, Gannoruwa, Peradeniya, Sri Lanka</P>
+<P ALIGN="JUSTIFY">R.G. Wahome, Department of Animal Production, P.O. Box 29053, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">Wu Jitang, Animal and Veterinary Science, Jiangsu Provincial Academy of Agricultural Sciences, Nanjing, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Yong Shen Lee, Department of Animal Husbandry and Veterinary Medicine, South China Agricultural University, Guangzhou, People's Republic of China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">POULTRY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Information on poultry can generally be obtained from local ministries of agriculture or veterinary and livestock services. However, another source is the World's Poultry Science Association (c/o Institut fur Kleintierzucht, Dornbergstrasse 25/27, Postfach 280, C-3100 Celle, Germany). It has over 5,000 members from 40 national groups. Its objectives are (1) to advance poultry science and the poultry industry, (2) to disseminate and facilitate the exchange of knowledge pertaining to all branches of the poultry industry, (3) to encourage the promotion of world poultry congresses and regional conferences, and (4) to cooperate with other international organizations. It maintains working groups to explore and assess research work on tropical poultry problems. The World's Poultry Science Journal is published 3 times a year. It has also published a multilingual poultry dictionary.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chicken</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.O. Aduku, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria </P>
+<P ALIGN="JUSTIFY">D.O. Alonge, Meat Hygiene and Preservation Laboratory, Faculty of Veterinary Medicine, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">A. Ben-David, Poultry Production Specialist, 5, Azar Street, Holon 58291, Israel</P>
+<P ALIGN="JUSTIFY">I.L. Brisbin, Jr., Savannah River Ecology Laboratory, P.O. Drawer E, Aiken, South Carolina 29801, USA</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Senior Livestock Specialist, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">J.R. Couch, Poultry Science Department, Texas A&amp;M University, College Station, Texas 77843, USA</P>
+<P ALIGN="JUSTIFY">R.D. Crawford, Department of Animal and Poultry Science, University of Saskatchewan, Saskatoon, Saskatchewan S7N 0W0, Canada</P>
+<P ALIGN="JUSTIFY">M. Cuca G., Institucion de Ensenanza e Investigacion en Ciencias Agricolas, Colegio de Postgraduados, Chapingo, Mexico</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Animal Science Department, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">D. Fielding, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">R.O. Hawes, Department of Animal and Veterinary Sciences, University of Maine, Orono, Maine 04469, USA</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">C.H. Huang, Food and Fertilizer Technology Center for the Asian and Pacific Region, Fifih Floor, 14 Wenchow Street, Taipei, Taiwan</P>
+<P ALIGN="JUSTIFY">E.H. Ketelaars, Department of Tropical Husbandry, P.O. Box 338, 6700 A.H. Wageningen, The Netherlands</P>
+<P ALIGN="JUSTIFY">M.A. Latif, Department of Poultry Science, Bangladesh Agricultural University, Mymensingh, Bangladesh</P>
+<P ALIGN="JUSTIFY">H. Martoyo, Faculty of Animal Science, Institut Pertanian Bogor, Jalan Raya Pajajaran, Bogor, West Java, Indonesia</P>
+<P ALIGN="JUSTIFY">K. Mitchell, Baptist Bible Institute, P.O. Box 301, Basseterre, St. Kitts, West Indies</P>
+<P ALIGN="JUSTIFY">E.T. Moran, Jr., Poultry Science Department, Auburn University, Auburn, Alabama 36849-4291, USA</P>
+<P ALIGN="JUSTIFY">S. Ochetim, School of Agriculture, University of the South Pacific, Alafua Campus, Apia, Western Samo</P>
+<P ALIGN="JUSTIFY">S. Parks, Route 1, Box 47-C, Brookshire, Texas 77423, USA (Araucanian chicken)</P>
+<P ALIGN="JUSTIFY">R.W. Phillips, The Representative, Apt.810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY">H.L. Polley, Programme DTveloppement Plateau Bateke, CBZO, B.P. 4728, Kinshasa 2, Zaire</P>
+<P ALIGN="JUSTIFY">A. Ramakrishman, Center for Advanced Studies in Poultry Science, Kerala Agricultural University, Mannuthy 680 651, Kerala, India</P>
+<P ALIGN="JUSTIFY">C.V. Reddy, Faculty of Veterinary Science, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad 500 030, India</P>
+<P ALIGN="JUSTIFY">E. Ross, Department of Animal Science, University of Hawaii, Honolulu, Hawaii 96822, USA</P>
+<P ALIGN="JUSTIFY">M.L. Scott, 16 Spruce Lane, Ithaca, New York 14850, USA</P>
+<P ALIGN="JUSTIFY">T.J. Sexton, Agricultural Research Service, U.S. Department of Agriculture, Beltsville Agricultural Research Center, Building 262, Beltsville, Maryland 20705, USA</P>
+<P ALIGN="JUSTIFY">R.G. Somes, Nutritional Sciences, Box U-17, University of Connecticut, Storrs, Connecticut 06268, USA</P>
+<P ALIGN="JUSTIFY">M. Sunde, Poultry Science Department, University of Wisconsin, Madison, Wisconsin 53706, USA</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duck</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R.E. Abdelsamie, Department of Biochemistry, Microbiology, and Nutrition, University of New England, Armidale, New South Wales 2351, Australia</P>
+<P ALIGN="JUSTIFY">S. Ahmed, Department of Poultry Science, Bangladesh Agricultural University, Mymensingh, Bangladesh</P>
+<P ALIGN="JUSTIFY">A. Bande, PATI, Popondetta Agricultural College, Box 131, Popondetta, Oro Province, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">R.S. Bird, Cherry Valley Farms Ltd., Rothwell, Lincoln LN7 6BR, UK</P>
+<P ALIGN="JUSTIFY">V.D. Bulbule, Central Duck Breeding Farm, Government of India, Hessaraghatta, Bangalore 560 088, India</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">K.M. Cheng, Avian Genetics Laboratory, Department of Animal Science, University of British Columbia, Vancouver, British Columbia V6T 2A2, Canada</P>
+<P ALIGN="JUSTIFY">W.F. Dean, Cornell University Duck Research Laboratory, P.O. Box 217, Eastport, New York 11941, USA</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Animal Science Department, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">P. Edwards, Agricultural and Food Engineering Division, Asian Institute of Technology, P.O. Box 2754, Bangkok 10501, Thailand</P>
+<P ALIGN="JUSTIFY">L. Fishelson, Department of Zoology, Tel Aviv University, Ramat-ave, Tel Aviv 69978, Israel</P>
+<P ALIGN="JUSTIFY">W.F. Floresca, Department of Animal Science and Veterinary Medicine, Visayas State College of Agriculture, Baybay, Leyte 7127, Philippines</P>
+<P ALIGN="JUSTIFY">H. Godoy, Ingeniero Agronomio, Simon Bolivar 2397, Santiago, Chile</P>
+<P ALIGN="JUSTIFY">P. Hardjosworo, Fakultas Peternakan, Institut Pertanian Bogor, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY">R. Henry, Cherry Valley Farms Limited, Divisional Offices, North Kelsey Moor, Lincoln LN7 6HH, UK</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">W.F. Hollander, Route 4, Box 168, Ames, lowa 5001O, USA</P>
+<P ALIGN="JUSTIFY">E. Hoffmann, Canning, Nova Scotia BOP IHO, Canada</P>
+<P ALIGN="JUSTIFY">C.H. Huang, Food and Fertilizer Technology Center for the Asian and Pacific Region, Fifth Floor, 14 Wenchow Street, Taipei, Taiwan</P>
+<P ALIGN="JUSTIFY">G. Ibanez H., Bolivar 451, Trujillo, Peru</P>
+<P ALIGN="JUSTIFY">Z. Jungkaro, Research Institute for Inland Fisheries, Jalan Sempur No. 1, Indonesia</P>
+<P ALIGN="JUSTIFY">G.A.R. Kamar, Animal Production Department, Faculty of Agriculture, Cairo University, Giza, Egypt</P>
+<P ALIGN="JUSTIFY">E.H. Ketelaars, Department of Tropical Husbandry, P.O. Box 338, 6700 A.H. Wageningen, The Netherlands</P>
+<P ALIGN="JUSTIFY">I.P. Kompiang, BaliPenelitianTernak, P.O. Box 123, Bogor 16001, WestJava, Indonesia</P>
+<P ALIGN="JUSTIFY">M.A. Latif, Department of Poultry Science, Bangladesh Agricultural University, Mymensingh, Bangladesh</P>
+<P ALIGN="JUSTIFY">H. Martoyo, Faculty of Animal Science, Institut Pertanian Bogor, Jalan Raya Pajajaran, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY">P. Mongin, Station de Recherches Avicoles, I.N.R.A., Nouzilly 37380 Monnaie, France</P>
+<P ALIGN="JUSTIFY">E.T. Moran, Jr., Poultry Science Department, Auburn University, Auburn, Alabama 36849-4291, USA</P>
+<P ALIGN="JUSTIFY">S. Ochetim, School of Agriculture, University of the South Pacific, Alafua Campus, Apia, Western Samoa</P>
+<P ALIGN="JUSTIFY">R.W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY">H. Pingel, Karl-Marx-Universitat, Sektion TV, Lehrstuhl Geflugel- und Pelztierzucht, 7010 Leipzig, Stephanstrasse 12, Germany </P>
+<P ALIGN="JUSTIFY">S. Poernomo, Research Institute for Veterinary Science, Jalan R.E. Martadinata 32, P.O. Box 52, Bogor, West Java, Indonesia</P>
+<P ALIGN="JUSTIFY">A. Ramakrishman, Center for Advanced Studies in Poultry Science' Kerala Agricultural University, Mannuthy 680 651, Kerala, India</P>
+<P ALIGN="JUSTIFY">B. Retailleau, Grimaud FrFres S.A., La CorbiFre, 49450 Roussay, France</P>
+<P ALIGN="JUSTIFY">T.S. Sandhu, Cornell University Duck Research Laboratory, P.O. Box 217, Eastport, New York 11941, USA</P>
+<P ALIGN="JUSTIFY">M.L. Scott, 16 Spruce Lane, Ithaca, New York 14850, USA</P>
+<P ALIGN="JUSTIFY">B.K. Shingari, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">C. Tai, Taiwan Livestock Research Institute, 112 Farm Road Shin-hua, Tainan, Taiwan 71210</P>
+<P ALIGN="JUSTIFY">B. Tangendjaja, Bali Penelitian Ternak, P.O. Box 123, Bogor 16001, Indonesia</P>
+<P ALIGN="JUSTIFY">Tian Fuh Shen, Department of Animal Husbandry, National Taiwan University, Taipei 10764, Taiwan</P>
+<P ALIGN="JUSTIFY">S.S. Tsai, Laboratory of Veterinary Pathology, National Pintung Institute of Agriculture, Pintung, Taiwan</P>
+<P ALIGN="JUSTIFY">A. Romero Villanueva, Centro Tropical de Capacitaci6n Agropecuaria y Forestal, Apartado Postal #4S, Macuspana 86700 Tabasco, Mexico</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY">Wildfowl Trust, Slimbridge, UK</P>
+<P ALIGN="JUSTIFY">Yeong Shue Woh, Malaysian Agricultural Research and Development Institute (MARDI), G.P.O. No. 12301, 50774 Kuala Lumpur, Malaysia</P>
+<P ALIGN="JUSTIFY">Cha Tak Yimp, Poultry and Swine Unit, Department of Veterinary Services, Jalan Mahameru, 50630 Kuala Lumpur, Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Geese</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many universities have a department of animal or poultry science that should know about the culture and management of these birds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. Bande, PATI, Popondetta Agricultural College, Box 131, Popondetta, Oro Province, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">F.D. Chesterley, 4502 Loomis Trail, Blaine, Washington 98230, USA</P>
+<P ALIGN="JUSTIFY">R.D. Crawford, Department of Animal and Poultry Science, University of Saskatchewan, Saskatoon, Saskatchewan S7N 0W0, Canada</P>
+<P ALIGN="JUSTIFY">N.l. Dim, Animal Science Department, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">S. Jackson, P.O. Box 3, Creenbank, Washington 98253, USA (weeder geese)</P>
+<P ALIGN="JUSTIFY">Liu Fuan, Department of Animal Husbandry and Veterinary Medicine, South China Agricultural University, Guangzhou, People's Republic of China</P>
+<P ALIGN="JUSTIFY">P. Mongin, Station de Recherches Avicoles, l.N.R.A., Nouzilly 37380, Monnaie, France</P>
+<P ALIGN="JUSTIFY">E. Ross, Department of Animal Science, University of Hawaii, Honolulu, Hawaii 96822, USA</P>
+<P ALIGN="JUSTIFY">B.K. Shingari, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">H.R. Wilson, Poultry Science Department, University of Florida, Gainesville, Florida 32611, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea Fowl</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.O. Aduku, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">American Guinea Club, c/o Angie Papp, 620 Payne Road, New Albany, Indiana 47150, USA</P>
+<P ALIGN="JUSTIFY">J.S.O. Ayeni, Kainji Lake Research Institute, P.M.B. 666, New Bussa, Kwara State, Nigeria</P>
+<P ALIGN="JUSTIFY">A. Ben-David, 5, Azar Street, Holon 58291, Israel</P>
+<P ALIGN="JUSTIFY">G.S. Brah, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">X. Colonna C., 14 Cotham Road, Bristol BS6 6DR, UK</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">R. Dumont, Ecole Nationale SupTrieure des Sciences Agronomiques AppliquTes, 26, boulevard Docteur Petitjean 21100 Dijon, France</P>
+<P ALIGN="JUSTIFY">R. Etches, Department of Animal and Poultry Science, University of Guelph, Guelph, Ontario NIG 2WI, Canada</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">A.F. Hutton, Garaina Farms, Scrubby Creek Road, Gympie MS: 115, Queensland 4570, Australia</P>
+<P ALIGN="JUSTIFY">D.N. Johnson, Natal Parks, Game and Fish Preservation Board, P.O. Box 661, Pietermaritzburg 3200, South Africa</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Food Science and Animal Industries, Alabama A&amp;:M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">W. Michie, Poultry Husbandry Division, North of Scotland College of Agriculture, Parkhead, Craibstone, Bucksburn, Aberdeen AB2 9SX, Scotland, UK</P>
+<P ALIGN="JUSTIFY">P. Mongin, Station de Recherches Avicoles, I.N.R.A., Nouzilly, 37380 Monnaie, France</P>
+<P ALIGN="JUSTIFY">S. Ochetim, School of Agriculture, University of the South Pacific, Alafua Campus, Apia, Western Samoa</P>
+<P ALIGN="JUSTIFY">A.N. Okaeme, Wildlife/Range Division, Kainji Lake Research Institute, P.M.B. 666, New Bussa, Kwara State, Nigeria</P>
+<P ALIGN="JUSTIFY">J.S. Sandhu, Poultry Breeder, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">B.K. Shingari, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">R.G. Somes, Nutritional Sciences, Box U-17, University of Connecticut, Storrs, Connecticut 06268, USA</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muscovy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R.E. Abdelsamie, Department of Biochemistry, Microbiology, and Nutrition, University of New England, Armidale, New South Wales 2351, Australia</P>
+<P ALIGN="JUSTIFY">G.P. Bilong, Department of Primary Industry, Monogastric Research Centre, P.O. Box 73, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">H. de Carville, Station de Recherches Avicoles, I.N.R.A., Centre de Tours, Nouzilly 37380, Monnaie, France</P>
+<P ALIGN="JUSTIFY">F.D. Chesterley, 4502 Loomis Trail, Blaine, Washington 98230, USA</P>
+<P ALIGN="JUSTIFY">X. Colonna C., 14 Cotham Road, Bristol BS6 6DR, UK</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Animal Science Department, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">R. Dumont, Ecole Nationale SupTrieure des Sciences Agronomiques AppliquTes, 26, boulevard Docteur Petitjean 21100 Dijon, France</P>
+<P ALIGN="JUSTIFY">G.R. Gerona, Department of Animal Science and Veterinary Medicine, Visayas State College of Agriculture, Baybay, Leyte, Philippines</P>
+<P ALIGN="JUSTIFY">Barry Glofcheskie, Department of Environmental Biology, University of Guelph, Guelph, Ontario NIG 2WI, Canada (fly control)</P>
+<P ALIGN="JUSTIFY">D. Holderread' P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">W.F. Hollander, Route 4, Box 168, Ames, Iowa 50010, USA</P>
+<P ALIGN="JUSTIFY">E. Hoffmann, Canning, Nova Scotia BOP IH0, Canada</P>
+<P ALIGN="JUSTIFY">C.H. Huang, Food and Fertilizer Technology Center for the Asian and Pacific Region, Fifth Floor, 14 Wenchow Street, Taipei, Taiwan (mule duck)</P>
+<P ALIGN="JUSTIFY">G.A.R. Kamar, Animal Production Department, Faculty of Agriculture, Cairo University, Giza, Egypt</P>
+<P ALIGN="JUSTIFY">W. Michie, Poultry Husbandry Division, North of Scotland College of Agriculture, Parkhead, Craibstone, Bucksburn, Aberdeen AB2 9SX, Scotland, UK</P>
+<P ALIGN="JUSTIFY">Donald E. Mock, Department of Extension Entomology, 239 Waters Hall, Kansas State University, Manhattan, Kansas 66506-4004, USA (fly control)</P>
+<P ALIGN="JUSTIFY">P. Mongin, Station de Recherches Avicoles, I.N.R.A., Nouzilly 37380 Monnaie, France</P>
+<P ALIGN="JUSTIFY">S. Ochetim, School of Agriculture, University of the South Pacific, Alafua Campus, Apia, Western Samoa</P>
+<P ALIGN="JUSTIFY">H. Pingel, Karl Marx Universitat, Sektion TV, Lehrstuhl Geflugel- und Pelztierzucht, 7010 Leipzig, Stephanstrasse 12, Germany</P>
+<P ALIGN="JUSTIFY">B. Retailleau, Grimaud FrFres S.A., La CorbiFre, 494S0 Roussay, France</P>
+<P ALIGN="JUSTIFY">I. Romboli, Le Quericole, Universita Delgi Studi di Pisa 56010 S. Piero A Grado, Italy</P>
+<P ALIGN="JUSTIFY">T.S. Sandhu, Cornell University Duck Research Laboratory, P.O. Box 217, Eastport, New York 11941, USA</P>
+<P ALIGN="JUSTIFY">G.A. Surgeoner, Department of Environmental Biology, University of Guelph, Guelph, Ontario NIG 2WI, Canada (fly control)</P>
+<P ALIGN="JUSTIFY">C. Tai, Taiwan Livestock Research Institute, 112 Farm Road Shin-hua. Tainan, Taiwan 71210</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigeon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.O. Aduku, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">D.O. Alonge, Meat Hygiene and Preservation Laboratory, Faculty of Veterinary Medicine, University of Ibadan, Ibadan, Nigeria</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">K.M. Cheng, Avian Genetics Laboratory, Department of Animal Science, University of British Columbia, Vancouver, British Columbia V6T 2A2, Canada</P>
+<P ALIGN="JUSTIFY">R. Dillinger, 3201 Huffman Boulevard, Rockford, Illinois 61103, USA</P>
+<P ALIGN="JUSTIFY">N.I. Dim, Animal Science Department, FacultyofAgriculture, AhmaduBello University, P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">R.O. Hawes, Department of Animal and Veterinary Sciences, University of Maine, Orono, Maine 04469, U.S.A.</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA (carrier pigeons) </P>
+<P ALIGN="JUSTIFY">W.F. Hollander, Route 4, Box 168, Ames, lowa 5001O, USA</P>
+<P ALIGN="JUSTIFY">M.A. Latif, Department of Poultry Science, Bangladesh Agricultural University, Mymensingh, Bangladesh</P>
+<P ALIGN="JUSTIFY">Y. Le HTnaff, Laboratoire de l'H(pital Avranches, Avranches, Cotentin, France (carrier pigeons)</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Food Science and Animal Industries, Alabama A&amp;M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">G.A.R. Kamar, Animal Production Department, Faculty of Agriculture, Cairo University, Giza, Egypt</P>
+<P ALIGN="JUSTIFY">W.J. Miller, Department of Genetics, Iowa State University, Ames, Iowa 50011, USA</P>
+<P ALIGN="JUSTIFY">G. Owen, 6520 Wiscasset Road, Bethesda, Maryland 20816, USA</P>
+<P ALIGN="JUSTIFY">G. Pena PTrez, Apartado Postal 23, La Nucia, Alicante, Spain</P>
+<P ALIGN="JUSTIFY">E. Ross, Department of Animal Science, University of Hawaii, Honolulu, Hawaii 96822, USA</P>
+<P ALIGN="JUSTIFY">M.D. Roush, Green Valley Squab Farm, 1348 Green Valley Road, Folsom, California 9563O, USA</P>
+<P ALIGN="JUSTIFY">T.S. Sandbu, Cornell University Duck Research Laboratory, P.O. Box 217, Eastport, New York 11941, USA</P>
+<P ALIGN="JUSTIFY">J.S. Sim, Department of Animal Science, University of Alberta, Edmonton, Alberta TOG 2P5, Canada</P>
+<P ALIGN="JUSTIFY">R.T. Wilson, Bartridge House, Umberleigh, North Devon EX37 9AS, UK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quail</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Many people raise Japanese quail. Probably the best way to locate a local source is to consult local pet stores, the county farm advisor's office, university faculty of agriculture, game-bird fanciers, and the like. Finding people with local research experience is usually most useful to beginners. Coturnix International, Inc., is a nonprofit organization with primary interests in promoting small domesticated food animal production for both youth training and improved nutrition. The use of coturnix (Japanese quail) for these purposes is already well established in a number of Michigan schools and in the Dominican Republic, with special emphasis on science projects, especially where nutritional inadequacies exist. The address is Coturnix International Inc., International Headquarters, 1111 Michigan Avenue, Box 250O, East Lansing, Michigan 48823, USA. Avian Sciences Department, University of California, Davis, California 95616, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines </P>
+<P ALIGN="JUSTIFY">K.M. Cheng, Avian Genetics Laboratory, Department of Animal Science, University of British Columbia, Vancouver, British Columbia V6T 2A2, Canada</P>
+<P ALIGN="JUSTIFY">D.E. Deppner, Trees for the Future, 11306 Estona Drive, Silver Spring, Maryland 20902, USA</P>
+<P ALIGN="JUSTIFY">D. Holderread, P.O. Box 492, Corvallis, Oregon 97339, USA</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Food</P>
+<P ALIGN="JUSTIFY">Science and Animal Industries, Alabama AOcM University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">H.L. Marks, Genetics Unit, Room 107 Livestock-Poultry Building, University of Georgia, Athens, Georgia 30602, USA</P>
+<P ALIGN="JUSTIFY">A. Marsh, Marsh Farms, 7171 Patterson Drive, Garden Grove, California 92641, USA</P>
+<P ALIGN="JUSTIFY">H. Martoyo, Faculty of Animal Science, Institut Pertanian Bogor, Jalan Raya Pajajaran, Bogor, West Java, Indonesia</P>
+<P ALIGN="JUSTIFY">Z. Abidin bin Mohd Noor, Department of Veterinary Services, Jalan Sultan Salahuddin, 50630 Kuala Lumpur, Malaysia (chicken-quail hybrids)</P>
+<P ALIGN="JUSTIFY">P.K. Pani, Indian Veterinary Research Institute, Izatnagar 243 122, Bareilly, Uttar Pradesh, India</P>
+<P ALIGN="JUSTIFY">H. Pingel, Karl Marx Universitat, Sektion TV, Lehrstuhl Geflugel- und Pelztierzucht, 7010 Leipzig, Stephanstrasse 12, Germany</P>
+<P ALIGN="JUSTIFY">D. Polin, Department of Animal Science, Michigan State University, East Lansing, Michigan 48824, USA</P>
+<P ALIGN="JUSTIFY">C.V. Reddy, Faculty of Veterinary Science, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad 500 030, India</P>
+<P ALIGN="JUSTIFY">Rodale Research Center, RD #1, Box 323, Kutztown, Pennsylvania 19530, USA</P>
+<P ALIGN="JUSTIFY">E. Ross, Department of Animal Science, University of Hawaii, Honolulu, Hawaii 96822, USA</P>
+<P ALIGN="JUSTIFY">B.K. Shingari, Department of Animal Science, Punjab Agricultural University, Ludhiana 141 006, India</P>
+<P ALIGN="JUSTIFY">R.G. Somes, Nutritional Sciences, Box U-17, University of Connecticut, Storrs, Connecticut 06268, USA</P>
+<P ALIGN="JUSTIFY">R. Tempest, Heifer Project International, P.O. Box 808, Little Rock, Arkansas 72203, USA</P>
+<P ALIGN="JUSTIFY">S. K. Varghese, Department of Animal Science, Michigan State University, East Lansing, Michigan 48824-1225, USA</P>
+<P ALIGN="JUSTIFY">N. Wakasugi, Laboratory of Animal Genetics, Nagoya University, Furo-cho, Chikusaku, Nagoya, Japan</P>
+<P ALIGN="JUSTIFY">H.R. Wilson, Poultry Science Department, Archer Road, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turkey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. Berruecos V. Muz, Facultad de Medicina Veterinaria y Zootecnia, Ciudad Universitaria, Mexico D.F., Mexico</P>
+<P ALIGN="JUSTIFY">R.D. Crawford, Department of Animaland Poultry Science, UniversityofSaskatchewan, Saskatoon, Canada</P>
+<P ALIGN="JUSTIFY">M. Cuca G., Institucion de Ensenanza e Investigacion en Ciencias Agricolas, Colegio de Postgraduados, Chapingo, Mexico</P>
+<P ALIGN="JUSTIFY">K.E. Nestor, Ohio Agricultural Research and Development Center, Ohio State University, Wooster, Ohio</P>
+<P ALIGN="JUSTIFY">H. Pingel, Karl-Marx-Universitat, Sektion TV, Lehrstuhl Geflugel- und Pelztierzucht, 7010 Leipzig, Stephanstrasse 12, Germany</P>
+<P ALIGN="JUSTIFY">M.L. Scott, 16 Spruce Lane, Ithaca, New York 14850, USA</P>
+<P ALIGN="JUSTIFY">H.J. Sexton, Agricultural Research Service, U.S. Department of Agriculture, Beltsville Agricultural Research Center, Building 262, Beltsville, Maryland 20705, USA</P>
+<P ALIGN="JUSTIFY">R.G. Somes, Nutritional Sciences. Box U-17, University of Connecticut, Storrs, Connecticut 06268, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential New Poultry</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.E. Duckett, P.O. Box 12378, 50776 Kuala Lumpur, Malaysia (barn owls)</P>
+<P ALIGN="JUSTIFY">W.R. Marion, Department of Wildlife and Range Science, University of Florida, Gainesville, Florida 32611, USA (chachalaca)</P>
+<P ALIGN="JUSTIFY">C. Smal, Wildlife Service, Sidmonton Place, Bray County, Wicklow, Ireland (barn owls) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RABBITS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic Rabbit</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.O. Aduku, Department of Animal Science, Faculty of Agriculture, Ahmadu Bello University,  P.M.B. 1044, Zaria, Nigeria</P>
+<P ALIGN="JUSTIFY">J. Baranga, Department of Zoology, Makerere University, P.O. Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">M. Baselga, Departamento de Ciencia Animal, Escuela TTcnica Superior de Ingenieros  Agronomos, Camino de Vera 14, 46022 Valencia, Spain</P>
+<P ALIGN="JUSTIFY">C. de Blas, Departamento Alimentacion Animal, Escuela TTcnica Superior de Ingenieros  Agronomos, Ciudad Universitaria, 28040 Madrid, Spain</P>
+<P ALIGN="JUSTIFY">J.A. Castell6, Real Escuela Oficial y Superior de Avicultura (REOSA), Calle Plana Parafso, s/n  Arenys de Mar, Barcelona, Spain</P>
+<P ALIGN="JUSTIFY">C.B. Chawan, International Small Livestock Research Center, Department of Food Science and  Animal Industries, Alabama A&amp;M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">P.R. Cheeke, Rabbit Research Center, Department of Animal Science, Oregon State University,  Corvallis, Oregon 97331, USA</P>
+<P ALIGN="JUSTIFY">S. Fekete, University of Veterinary Science, Department of Animal Nutrition, Budapest, Pf.2,  H-1400 Hungary</P>
+<P ALIGN="JUSTIFY">J. Fernandez C., Departamento de Ciencia Animal, Escuela TTcnica Superior de Ingenieros  Agronomos, Universidad PolitTcnica de Valencia, Camino de Vera, 14, 46022 Valencia, Spain</P>
+<P ALIGN="JUSTIFY">C. Cervera Fras, Departamento de Ciencia Animal, Universidad PolitTcnica de Valencia, Apartado  22012, Valencia, Spain</P>
+<P ALIGN="JUSTIFY">D.J. Harris, Pel-Freez Rabbit Meat, Inc., P.O. Box 68, Rogers, Arkansas 72756, USA</P>
+<P ALIGN="JUSTIFY">J.A.B. Hundleby, Ciskei Agricultural Corporation Ltd., P.O. Box 59, Bisho, Ciskei, South Africa</P>
+<P ALIGN="JUSTIFY">D.L. Huss, P.O. Box 426, Menard, Texas 76859, USA</P>
+<P ALIGN="JUSTIFY">R. de Jong, Department of Tropical Animal Production, Marykeweg 40, 6709 P.G. Wageningen,  The Netherlands</P>
+<P ALIGN="JUSTIFY">L.A. Kamwanja, Bunda College of Agriculture, University of Malawi, P.O. Box 219, Lilongwe,  Malawi</P>
+<P ALIGN="JUSTIFY">M. Leyun, Instituto TTcnico Gesti6n Porcino (ITGP), Seccion Conejos, Ctra. del Sadar, s/n 31006  Pamplona (Navarra), Spain</P>
+<P ALIGN="JUSTIFY">H. Loliger, Lisztstrasse 20, 3100 Celle, Germany</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Food Science and  Animal Industries, Alabama A&amp;M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">T.P.E. Makhambera, Bunda College of Agriculture, University of Malawi, P.O. Box 219, Lilongwe,  Malawi</P>
+<P ALIGN="JUSTIFY">J.I. McNitt, Center for Small Farm Research, Southern University, P.O. Box 11170, Baton Rouge,  Louisana 70813-1170, USA</P>
+<P ALIGN="JUSTIFY">M. Mgheni, Sokoine University of Agriculture, Animal Science and Production Department, P.O.  Box 3004, Morogoro, Tanzania</P>
+<P ALIGN="JUSTIFY">K. Mitchell, Baptist Bible Institute, P.O. Box 301, Basseterre, St. Kitts, West Indies</P>
+<P ALIGN="JUSTIFY">G.A. Norman, Tropical Products Institute, Culham, Abingdon, Oxfordshire OX14 3DA, UK</P>
+<P ALIGN="JUSTIFY">L.N. Odonker, P.O. Box 11, Tsito-Awudome, Volta Region, Ghana</P>
+<P ALIGN="JUSTIFY">O.C. Onwudike, Department of Animal Science, University of Ife, Ile-Ife, Nigeria  </P>
+<P ALIGN="JUSTIFY">G.G. Partridge, Rowett Research Institute, Bucksburn, Aberdeen AB2 9SB, Scotland, UK</P>
+<P ALIGN="JUSTIFY">N.M. Patton, Rabbit Research Center, Oregon State University, Corvallis, Oregon 97331, USA</P>
+<P ALIGN="JUSTIFY">M.J. Paya, Departamento de Microbiologia, Facultad de Veterinaria, Avenida Puerta de Hierro, Ciudad Universitaria, 28040 Madrid, Spain</P>
+<P ALIGN="JUSTIFY">T. PTrez, Departamento de Reproduccion Animal, Instituto Nacional de Investigaciones Agrarias (INIA), Avenida Puerta de Hierro, s/n, 28040 Madrid, Spain</P>
+<P ALIGN="JUSTIFY">H.L. Polley, Programme DTveloppement Plateau Bateke, CBZO, B.P. 4728, Kinshasa 2, Zaire</P>
+<P ALIGN="JUSTIFY">R. Ramchurn, School of Agriculture, University of Mauritius, RTduit, Mauritius</P>
+<P ALIGN="JUSTIFY">T.E. Reed, Box 98, Markle, Indiana 46770, USA</P>
+<P ALIGN="JUSTIFY">E. Respaldiza, Instituto Nacional de Investigaciones Agrarias (INIA), Departamento de Higiene y Sanidad Animal, Calle Embajadores, 68, 28012 Madrid, Spain</P>
+<P ALIGN="JUSTIFY">B. Retailleau, Grimaud FrFres S.A., La CorbiFre, 49450 Roussay, France</P>
+<P ALIGN="JUSTIFY">A. Rodriguez, Departamento Microbiologia e Inmunologia, Facultad de Veterinaria, Calle Miguel Servet, numero 117, 50013 Zaragoza, Spain</P>
+<P ALIGN="JUSTIFY">R. Rodriguez de L., "Conejos" Centro de Investigacion Cientifica del Estado de MTxico A.C., Camino a Huexotla No. 5, San Miguel Coatlinchan, 56170 Texcoco, Estado de MTxico, Mexico</P>
+<P ALIGN="JUSTIFY">W. Schlolaut, Hessen Institute for Animal Production, Neu-Ulrichstein, 6313 Homberg, West Germany</P>
+<P ALIGN="JUSTIFY">W.D. Semuguruka, Department of Veterinary Pathology, Faculty of Veterinary Medicine, Sokoine University of Agriculture, P.O. Box 3018, Chuo Kikuu Morogoro, Tanzania</P>
+<P ALIGN="JUSTIFY">I. Sierra, Departamento Produccion Animal, Facultad de Veterinaria, Calle Miguel Servet, numero 117, 50013 Zaragoza, Spain</P>
+<P ALIGN="JUSTIFY">R. Valls, Institut de Recerce i Tecnologia Agroalimentaria (IRTA), Torre Marimon, 08140 Caldes de Montbui, Barcelona, Spain</P>
+<P ALIGN="JUSTIFY">P. Zaragoza, Departamento de Genetica y Mejora, Facultad de Veterinaria, Calle Miguel Servet, numero 117, 50013 Zaragoza, Spain</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RODENTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agouti</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C.J.R. Alho, Departamento de Biologia Animal, Universidade de Brasilia, 70910 Brazilia, DF, Brazil</P>
+<P ALIGN="JUSTIFY">R.H. Baker, 302 North Strickland Street, Eagle Lake, Texas 77434-1841, USA</P>
+<P ALIGN="JUSTIFY">H. Bonilla Encizo, ICA Tibaitata, Apartado Aereo 151123, BogotG, Colombia</P>
+<P ALIGN="JUSTIFY">A.D. Cuaron O., Instituto de Historia Natural, Apartado Postal No. 6, Tuxtla Gutierrez, Chiapas 29000, Mexico</P>
+<P ALIGN="JUSTIFY">L.A. Deutsch, Parque Zoologico de Sao Paulo, SGo Paulo, Brazil</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratorie d'Ecologie, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">J.K. Frenkel, Department of Pathology, University of Kansas Medical Center, Kansas City, Kansas 66013, USA</P>
+<P ALIGN="JUSTIFY">A. Escajadillo, Gorgas Memorial Laboratory, P.O. Box 935, APO Miami, Florida 340020012, USA OR Avenida Justo Arosemena 34-30, Apartado 6991, Panama 5, Panama</P>
+<P ALIGN="JUSTIFY">W. Hallwachs, Department of Biology, University of Pennsylvania, Philadelphia, Pennsylvania 19104-6018, USA </P>
+<P ALIGN="JUSTIFY">G. Hislop, Wildlife Section, Forest Division, Ministry of Food Production, Port-ofSpain, Trinidad and Tobago</P>
+<P ALIGN="JUSTIFY">S. Ingrand, I.N.R.A., Campus agronomique, B.P. 709, 97387 Kourou Cedex, French Guiana</P>
+<P ALIGN="JUSTIFY">D.H. Janzen, Department of Biology, University of Pennsylvania, Philadelphia, Pennsylvania 19104, USA</P>
+<P ALIGN="JUSTIFY">D. Kleiman, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">A. Lavorenti, Animal Sciences Department, ESALQ Universidade de Sao Paulo, C.P. 9, Piracicaba, Sao Paulo 13.400, Brazil</P>
+<P ALIGN="JUSTIFY">D.A. Meritt, Jr., 2200 North Cannon Drive, Chicago, IHinois 60614, USA</P>
+<P ALIGN="JUSTIFY">J.R. de Alencar Moreira, EMBRAPA-CPATU, Agricultural Research Center of the Humid Tropics, Caixa Postal 48, BelTm, Para 66000, Brazil</P>
+<P ALIGN="JUSTIFY">C.Ma. Rojas G., CATIE, 7170 Turrialba, Costa Rica</P>
+<P ALIGN="JUSTIFY">G. Santos, Fundatao Parque Zoologico de Sao Paulo, Sao Paulo, Brazil</P>
+<P ALIGN="JUSTIFY">N. Smith, Department of Geography, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">N. Smythe, Smithsonian Tropical Research Institute, Box 2072, Balboa, Panama</P>
+<P ALIGN="JUSTIFY">O. Sousa, Department of Microbiology, Cinuad Universitaria "Dr Octavio MTndez Pereira," El Cangregio, Apartado Estafeta Universitaria, Panama City, Panama</P>
+<P ALIGN="JUSTIFY">A.B. Taber, Animal Behaviour Research Group, Department of Zoology, South Parks Road, Oxford OXI 3PS, UK</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">C.A. Woods, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capybara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C.J.R. Alho, Departamento de Biologia Animal, Universidade de Brasilia, 70910 Brasilia, DF, Brazil</P>
+<P ALIGN="JUSTIFY">K.P. Bland, Department of Veterinary Physiology, Royal (Dick) School of Veterinary Studies, Summerhall, Edinburgh EH9 IQH, Scotland, UK</P>
+<P ALIGN="JUSTIFY">H. Bonilla Encizo, ICA Tibaitata, Apartado Aereo 151123, Bogota, Colombia</P>
+<P ALIGN="JUSTIFY">P.R. Cheeke, Rabbit Research Center, Department of Animal Science, Oregon State University, Corvallis, Oregon 97331, USA</P>
+<P ALIGN="JUSTIFY">T.J. Cunha, P.O. Box R, LaVerne, California 91750, USA</P>
+<P ALIGN="JUSTIFY">J.F. Eisenberg, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">F. Golley, Institute of Ecology, University of Georgia, Athens, Georgia 30601, USA</P>
+<P ALIGN="JUSTIFY">E. Gonzalez-Jimenez, Facultad de Agronomia, Universidad Central de Venezuela, Maracay, Venezuela</P>
+<P ALIGN="JUSTIFY">H. Hemmer, Institute of Zoology, Johannes Gutenberg University, Anemonenweg 18, D-6500 Mainz-Ebersheim, Germany</P>
+<P ALIGN="JUSTIFY">J.A. Howarth, School of Veterinary Medicine, University of California, Davis, California 95616, USA</P>
+<P ALIGN="JUSTIFY">S. Ingrand, I.N.R.A., Campus agronomique, B.P. 709, 97387 Kourou Cedex, French Guiana</P>
+<P ALIGN="JUSTIFY">N. Konnerup, 74 North Sunrise Boulevard, Camano Island, Washington 98292, USA</P>
+<P ALIGN="JUSTIFY">J.E. Jackson, Terraza Turrado 80, 5730 Villa Mercedes, San Luis, Argentina</P>
+<P ALIGN="JUSTIFY">D. Kleiman, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">A. Lavorenti, Animal Sciences Department, ESALQ Universidade de Sao Paulo, C.P. 9, Piracicaba, Sao Paulo 13.400, Brazil </P>
+<P ALIGN="JUSTIFY">R.D. Lord, Biology Department, Indiana University of Pennsylvania, Indiana, Pennsylvania 15705, USA</P>
+<P ALIGN="JUSTIFY">D.W. MacDonald, Animal Behaviour Research Group, Department of Zoology, South Parks Road, Oxford OXI 3PS, UK</P>
+<P ALIGN="JUSTIFY">J.R. de Alencare Moreira, Agricultural Research Center of the Humid Tropics, EMBRAPA-CPATU, Caixa Postal 48" BelTm, Para 66000, Brazil</P>
+<P ALIGN="JUSTIFY">B. Muller-Haye, Food and Agricultural Organization of the United Nations, Room F524, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY">J. Ojasti, Institute of Tropical Zoology, Apartado 47058, Universidad Central de Venezuela, Caracas 1041A, Venezuela</P>
+<P ALIGN="JUSTIFY">N.L. Rondon, Departamento de Engenharia Florestal, Centro de Ciencias Agrarias, Universidada Federal de Mato Grosso, Cuiaba-MT, 78000, Brazil</P>
+<P ALIGN="JUSTIFY">N. Smith, Department of Geography, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">A.E. Sollod, Section of International Veterinary Medicine, Tufts University, 200 Westboro Road, North Grafton, Massachusetts 01536, USA</P>
+<P ALIGN="JUSTIFY">F. Sunquist, Route 1, Box 1434, Melrose, Florida 32666, USA</P>
+<P ALIGN="JUSTIFY">A.B. Taber, Animal Behaviour Research Group, Department of Zoology, South Parks Road, Oxford OXI 3PS, UK</P>
+<P ALIGN="JUSTIFY">K.D. Thelen, FAO Regional Of fice for Latin America and the Caribbean, CasiHa 10095, Santiago, Chile</P>
+<P ALIGN="JUSTIFY">D. Wharton, New York Zoological Society, Bronx, New York 10460, USA</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coypu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.C. Carmichael, The Museum, Michigan State University, East Lansing, Michigan 48824-1045, USA</P>
+<P ALIGN="JUSTIFY">G. Chapman, Utah State University, Logan, Utah 84322, USA</P>
+<P ALIGN="JUSTIFY">L. Contreras, Universidad Cat61ica de Valpariso, Avenida Brasi. 295O, Casilla 4059, Valparaiso, Chile</P>
+<P ALIGN="JUSTIFY">D. Huss, P.O. Box 426, Menard, Texas 76859, USA</P>
+<P ALIGN="JUSTIFY">H.-G. Klos, Zoologischer Garten Berlin, Aktiengesellschaft, Hardenbergplatz, 1000 Berlin 30, Germany</P>
+<P ALIGN="JUSTIFY">P. Lutz, Rosenstiel School of Marine and Atmospheric Science, Biology and Living Resources, University of Miami, 4600 Rickenbacker Causeway, Miami, Florida 33149, USA</P>
+<P ALIGN="JUSTIFY">J.R. de Alencar Moreira, Agricultural Research Center of the Humid Tropics, Caixa Postal 48, BelTm, ParG, 66000, Brazil</P>
+<P ALIGN="JUSTIFY">J. Szumiec, Experimental Fish Culture Station, Polish Academy of Sciences, Golysz 43-422 Chybie, Poland</P>
+<P ALIGN="JUSTIFY">C.A. Woods, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giant Rat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Research Institute, Council for Scientific and Industrial Research (CSIR), P.O. Box 20, Achimota, Chana</P>
+<P ALIGN="JUSTIFY">J. Baranga, Department of Zoology, Makerere University, P.O. Box 7062, Kampala, Uganda </P>
+<P ALIGN="JUSTIFY">K.P. Bland, Department of Veterinary Physiology, Royal (Dick) School of Veterinary Studies, Summerhall, Edinburgh EH9 IQH, Scotland, UK</P>
+<P ALIGN="JUSTIFY">P. Brinck, Ecology Building, Department of Animal Ecology, University of Lund, S223 62 Lund, Sweden</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratorie d'Ecologie, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">D. Fielding, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">D.C.D. Happold, Department of Zoology, Australian National University, Canberra, Australian Capital Territory 2601, Australia</P>
+<P ALIGN="JUSTIFY">J.C. Heymans, BP 1910, Cotonou, Benin</P>
+<P ALIGN="JUSTIFY">J.A. Kamara, c/o Njala University College, Private Mail Bag, Freetown, Sierra Leone</P>
+<P ALIGN="JUSTIFY">M.H. Knight, Kalahari Gemsbok Park, Private Bag X5890, Upington 8800, South Africa</P>
+<P ALIGN="JUSTIFY">M. Malekani, DTpartement de Biologie, FacultT des Sciences, UniversitT de Kinshasa, B.P. 190, Kinshasa XI, Zaire</P>
+<P ALIGN="JUSTIFY">R.W. Matthewman, Centre for Tropical Veterinary Medicine, Royal (Dick) School for Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">A.J. Smith, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grasscutter</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. Alexander, Department of Biology, Natal University, King George V Avenue, Durban 4001, South Africa</P>
+<P ALIGN="JUSTIFY">E.O.A. Asibey, Department of Game and Wildlife, Ministry Post Office, Accra, Ghana</P>
+<P ALIGN="JUSTIFY">E.S. Ayensu, African Development Bank, 01 B.P. No. 1837, Abidjan 01, Ivory Coast</P>
+<P ALIGN="JUSTIFY">R. Baptist, Institute for Animal Production in the Tropics and Subtropics, University of Hohenheim (480), P.O. Box 700562, D-7000 Stuttgart 70, Germany</P>
+<P ALIGN="JUSTIFY">S.Y. Bimpong-Buta, Council for Law Reporting, P.O. Box M165, Accra, Ghana</P>
+<P ALIGN="JUSTIFY">P. Brinck, Department of Animal Ecology, University of Lund, Ecology Building, S223 62, Lund, Sweden</P>
+<P ALIGN="JUSTIFY">H. Dosso, Institut d'Ecologie Tropicale, Abidjan, Ivory Coast</P>
+<P ALIGN="JUSTIFY">D. Fielding, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">D.C.D. Happold, Department of Zoology, Australian National University, Canberra, Australian Capital Territory 2601, Australia</P>
+<P ALIGN="JUSTIFY">J. Hardouin, Institut de Medicine Tropicale "Prince Leopold," Nationalestraat 155, B2000 Antwerp, Belgium</P>
+<P ALIGN="JUSTIFY">J.C. Heymans, BP 1910, Cotonou, Benin</P>
+<P ALIGN="JUSTIFY">A. Hutton, Garaina Farms, Scrubby Creek Road, Gympie MS:115, Queensland 4570, Australia</P>
+<P ALIGN="JUSTIFY">J.A. Kamara, c/o Njala University College, Private Mail Bag, Freetown, Sierra Leone</P>
+<P ALIGN="JUSTIFY">Laboratoire Centrale de Nutrition Animale (LACENA), B.P. 353, Abidjan 06, Ivory Coast</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Food Science and Animal Industries, Alabama A&amp;M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">R.-P. Mack, Projet BTnino-Allemand Conseiller Technique auprTs du MDRAC, BP 504, Cotonou, Benin </P>
+<P ALIGN="JUSTIFY">G.H.G. Martin, Department of Zoology, Kenyatta University College, P.O. Box 43844, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">R.W. Matthewman, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">G.A. Mensah, Responsable PBAA (Projet BTnino-Allemand d'Aulacodiculture), P.B. 2359, Cotonou, Benin</P>
+<P ALIGN="JUSTIFY">T.A. Omole, Department of Animal Science, University of Ife, Ile-lfe, Nigeria</P>
+<P ALIGN="JUSTIFY">K.J. Peters, International Livestock Centre for Africa (ILCA), P.O. Box 5689, Addis Ababa, Ethiopia</P>
+<P ALIGN="JUSTIFY">F. Petter, MammifFres et Oiseaux, Museum National d'Histoire Naturelle Zoologie, 55 rue de Buffon 75005, Paris, France</P>
+<P ALIGN="JUSTIFY">W. Schr(der, Institute of Animal Breeding, Albrecht-Thaer-Weg 1, 3400 Gottingen, Germany</P>
+<P ALIGN="JUSTIFY">A.J. Smith, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">D.W. Thomas, Department of Biology, University of Sherbrooke, Sherbrooke, Quebec JIK 2RI, Canada</P>
+<P ALIGN="JUSTIFY">St. von Korn, Institute of Animal Breeding, Albrecht-Thaer-Weg 1, 3400 G(ttingen, Germany</P>
+<P ALIGN="JUSTIFY">J. Walder, Presbyterian Rural Training Centre, P.O. Box 72, Bamenda, NW Province, Cameroon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G.P. Bilong, Department of Pimary Industry, Monogastric Research Centre, P.O. Box 73, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">K.P. Bland, Department of Physiology, Royal (Dick) School of Veterinary Studies, Summerhall, Edinburgh EH9 IQH, Scotland, UK</P>
+<P ALIGN="JUSTIFY">R. Bolton, Department of Anthropology, Pomona College, Claremont, California 91711, USA</P>
+<P ALIGN="JUSTIFY">H. Bonilla Encizo, ICA Tibaitata, Apartado Aereo 151123, Bogota, Colombia</P>
+<P ALIGN="JUSTIFY">J.K. Camoens, Asian Development Bank, P.O. Box 789, Manila 2800, Philippines</P>
+<P ALIGN="JUSTIFY">A. Del Carpio R., Facultad de Zootecnia, Universidad Nacional "Pedro Ruiz Gallo," Calle Atahualpa No. 179, Apartado 48, Lambayeque, Peru</P>
+<P ALIGN="JUSTIFY">P.R. Cheeke, Rabbit Research Center, Department of Animal Science, Oregon State University, Corvallis, Oregon 97331, USA</P>
+<P ALIGN="JUSTIFY">T.J. Cunha, P.O. Box R, LaVerne, California 91750, USA</P>
+<P ALIGN="JUSTIFY">J. Descailleux, Laboratorio GenTtica Humana, C.P. 11010, Lima 14, Peru</P>
+<P ALIGN="JUSTIFY">J.A. Ferguson, Overseas Development Administration, Eland House, Stug Place, London, UK</P>
+<P ALIGN="JUSTIFY">D. Fielding, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RC, Scotland, UK</P>
+<P ALIGN="JUSTIFY">J.K. Frenkel, Department of Pathology, University of Kansas Medical Center, Kansas City, Kansas 66013, USA</P>
+<P ALIGN="JUSTIFY">J. Hardouin, Institut de MTdecine Tropicale "Prince Leopold," Nationalestraat IS5, B2000 Antwerpen, Belgium</P>
+<P ALIGN="JUSTIFY">R.E. Honegger, Zurich Zoo, Zurichbergstrasse 221, CH-8044 Zurich, Switzerland </P>
+<P ALIGN="JUSTIFY">J. Howarth, School of Veterinary Medicine, University of Calffornia, Davis, Calffornia 95616, USA</P>
+<P ALIGN="JUSTIFY">D.L. Huss, P.O. Box 426, Menard, Texas 76859, USA</P>
+<P ALIGN="JUSTIFY">J.E. Jackson, Terraza Turrado 80, 5730 Villa Mercedes, San Luis, Argentina</P>
+<P ALIGN="JUSTIFY">C. Jenkins, PNG Institute Medical Research, P.O. Box 60, Goroka, Eastern Highlands Province, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">R. de Jong, Department of Tropical Animal Production, Marykeweg 40, 6709 PG Wageningen, The Netherlands</P>
+<P ALIGN="JUSTIFY">J.A. Kamara, c/o Njala University College, Private Mail Bag Freetown, Sierra Leone</P>
+<P ALIGN="JUSTIFY">P.J. Kohun, Department of Agriculture, PNG University of Technology, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">N.M. Konnerup, 74 North Sunrise Boulevard, Camano Island, Washington 98292, USA</P>
+<P ALIGN="JUSTIFY">T.E. Lacher, Jr., Huxley College of Environmental Studies, Western Washington University, Bellingham, Washington 98225, USA</P>
+<P ALIGN="JUSTIFY">S.D. Lukefahr, International Small Livestock Research Center, Department of Feed Science and Animal Industries, Alabama A&amp;M University, P.O. Box 264, Normal, Alabama 35762, USA</P>
+<P ALIGN="JUSTIFY">R.C. Malik, Department of Agriculture, PNG University of Technology, Lae, Papua New Guinea</P>
+<P ALIGN="JUSTIFY">R.W. Matthewman, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">A.R. Moreno, Departamento de Produccion Animal, Universidad Nacional Agraria, Apartado 456, La Molina, Lima, Peru</P>
+<P ALIGN="JUSTIFY">B. Muller-Haye, Food and Agriculture Organization of the United Nations, Room F524, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY">H.L. Polley, Programme DTveloppement Plateau Bateke, CBZO, B.P. 4728, Kinshasa 2, Zaire</P>
+<P ALIGN="JUSTIFY">V. Purizaga A., Alcalde del Concejo Provincial de Pacasmayo, Dos de Mayo 360, Peru</P>
+<P ALIGN="JUSTIFY">V.T. Quirante, Bureau of Animal Industry, Research Center, Alabang 3124, Metro Manila, Philippines</P>
+<P ALIGN="JUSTIFY">C.V. Reddy, Faculty of Veterinary Science, Andhra Pradesh Agricultural University, Rajendranagar, Hyderabad 500 030, India</P>
+<P ALIGN="JUSTIFY">O.W. Robinson, Department of Animal Science, North Carolina State University, Box 7621 Raleigh, North Carolina 27695-7621, USA</P>
+<P ALIGN="JUSTIFY">A.J. Smith, Centre for Tropical Veterinary Medicine, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Easter Bush, Roslin, Midlothian EH25 9RG, Scotland, UK</P>
+<P ALIGN="JUSTIFY">D. Wharton, New York Zoological Society, Bronx, New York 10460, USA</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hutia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.C. Allen, Hope Zoo, Kingston, Jamacia</P>
+<P ALIGN="JUSTIFY">R.S. Canet, Instituto de Zoologla, Academia Ciencias de Cuba, Calle 214, esq. a Avenida 19, No. 17A 09, Reparto Atabey, Havana 16, Cuba</P>
+<P ALIGN="JUSTIFY">D. Kleiman, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">K. Jordan, Department of Zoology, University of Florida, Gainesville, Florida 32611, USA </P>
+<P ALIGN="JUSTIFY">W.L.R. Oliver, Jersey Wildlife Preservation Trust, Les AugrFs Manor, Jersey, Channel Islands, UK</P>
+<P ALIGN="JUSTIFY">J.A. Ottenwalder, Parque Zool6gico Nacional (ZOODOM), Apartado 2449, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">C. Woods, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">L.T. Blankenship, Animal Resources Center, School of Medicine, East Carolina University, Greenville, North Carolina 27858-4354, USA</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratoire d'Ecologie, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">J.E. Jackson, Terraza Turrado 80, 5730 Villa Mercedes, San Luis, Agentina</P>
+<P ALIGN="JUSTIFY">D. Kleiman, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">D.W. MacDonald, Animal Behaviour Research Group, Department of Zoology, South Parks Road, Oxford OXI 3PS, UK</P>
+<P ALIGN="JUSTIFY">W.H. Pryor, Jr., School of Medicine, East Carolina University, Greenville, North Carolina 27858-4354, USA</P>
+<P ALIGN="JUSTIFY">A.B. Taber, Animal Behaviour Research Group, Department of Zoology, South Parks Road, Oxford OXI 3PS, UK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paca</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.R. de Alencar Moreira, Agricultural Research Center of the Humid Tropics, EMBRAPA-CPATU, Caixa Postal 48, BelTm, Para 66000, Brazil</P>
+<P ALIGN="JUSTIFY">C.J.R. Alho, Departamento de Biologia Animal, Universidade de Brasilia, 70910 Brasilia, DF, Brazil</P>
+<P ALIGN="JUSTIFY">R.H. Baker, 302 North Strickland Street, Eagle Lake, Texas 77434-1841, USA</P>
+<P ALIGN="JUSTIFY">A.D. Cuardn O., Instituto de Historia Natural, Apartado Postal No. 6, Tuxtla Gutierrez, Chiapas 29000, Mexico</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratoire d'Ecologie, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">L. de Escalante, Zool6gico Nacional, Direccion del Patrimonio Natural y Cultural, San Salvador, El Salvador</P>
+<P ALIGN="JUSTIFY">J.K. Frenkel, Department of Pathology, University of Kansas Medical Center, Kansas City, Kansas 66013, USA</P>
+<P ALIGN="JUSTIFY">W. Hallwachs, Ecology and Systematics, Corson Hall, Cornell University, Ithaca, New York 14853, USA</P>
+<P ALIGN="JUSTIFY">C. Hislop, Wildlife Section, Forest Division, Ministry of Food Production, Port-ofSpain, Trinidad and Tobago</P>
+<P ALIGN="JUSTIFY">D.H. Janzen, Department of Biology, University of Pennsylvania, Philadelphia, Pennsylvania 19104, USA</P>
+<P ALIGN="JUSTIFY">D. Kleiman, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">A. Lavorenti, Animal Sciences Department, ESALQ Universidade de Sao Paulo, C.P. 9, Piracicaba, Sao Paulo 13.400, Brazil</P>
+<P ALIGN="JUSTIFY">Y. Matamoros, Escuela de Medicina Veterinaria, Universidad Nacional, Apartado 86, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY">D. Meritt, Jr., 2200 North Cannon Drive, Chicago, Illinois 60614, USA</P>
+<P ALIGN="JUSTIFY">C.Ma. Rojas G., CATIE, 7170 Turrialba, Costa Rica </P>
+<P ALIGN="JUSTIFY">O. Rosado, Ministry of Industry and Natural Resources, Belmopan, Belize</P>
+<P ALIGN="JUSTIFY">N. Smith, Department of Geography, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">N. Smythe, Smithsonian Tropical Research Institute, Box 2072, Balboa, Panama</P>
+<P ALIGN="JUSTIFY">V. Solis, Union Internacional pare la Conservacion de la Naturaleza y de los Recursos Naturales, Oficina Regional pare Centro AmTrica, Apartado Postal 91-1009-FECOSA, San JosT, Costa Rica</P>
+<P ALIGN="JUSTIFY">S. VaidTs, Centro Universitario del Norte Carrera ZootTcnica, Coban, A.V., Ciudad Guatemala 16001, Guatemala</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vizcacha</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Bonilla Encizo, ICA Tibaitata, Apartado Aereo 151123, Bogota, Colombia</P>
+<P ALIGN="JUSTIFY">J.E. Jackson, Terraza Turrado 80, 5730 Villa Mercedes, San Luis, Argentina</P>
+<P ALIGN="JUSTIFY">E.L. Marmillon, Estancias del Conlara S.A., Casilla de Correo 451, 5800 Rio Cuarto, Argentina</P>
+<P ALIGN="JUSTIFY">K.D. Thelen, FAO Regional Office for Latin America and the Caribbean, Casilla 10095, Santiago, Chile</P>
+<P ALIGN="JUSTIFY">E. Wing, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Rodents</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">T.M. Butynski, Impenetrable Forest Conservation Project, Zoology Department, Makerere University, P.O. Box 7062, Kampala, Uganda (springhare)</P>
+<P ALIGN="JUSTIFY">T. Flannery, Australian Museum, 6-8 College Street, Sydney, New South Wales 2000, Australia (Solomon Island rodents)</P>
+<P ALIGN="JUSTIFY">Inter-African Bureau for Animal Resources, Maendeleo House, Monrovia Street, POB 30786, Nairobi, Kenya (springhare)</P>
+<P ALIGN="JUSTIFY">N. Jacobsen, Nature Conservation Division, Private Bag X209, Pretoria 0001, South Africa (springhare)</P>
+<P ALIGN="JUSTIFY">C.P. Kofron, Museum of Zoology, Louisiana State University, Baton Rouge, Louisiana 70893, USA (springhare)</P>
+<P ALIGN="JUSTIFY">T. Leary, Ministry of Natural Resources, Honiara, Solomon Islands (Solomon Island rodents)</P>
+<P ALIGN="JUSTIFY">C.A. McLaughlin, San Diego Zoo, San Diego 92112, California, USA (springhare)</P>
+<P ALIGN="JUSTIFY">R.P. Millar, Department of Chemical Pathology, Medical School, Observatory 7925, South Africa (springhare)</P>
+<P ALIGN="JUSTIFY">J.D. Skinner, Mammal Research Institute, University of Pretoria, Pretoria 0002, South Africa (springhare)</P>
+<P ALIGN="JUSTIFY">Southern African Wildlife Management Association, POB 413, Pretoria, South Africa ( s p ring hare )</P>
+<P ALIGN="JUSTIFY">L. Talbot, 6656 Chitton Court, McLean, Virginia 22101, USA (springhare)</P>
+<P ALIGN="JUSTIFY">M. Van der Merwe, University of Pretoria, Mammal Research Institute, Pretoria 0002, South Africa (springhare)</P>
+<P ALIGN="JUSTIFY">Wildlife Society of Zimbabwe, POB 3497, Harare, Zimbabwe (springhare) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DEER AND ANTELOPE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mouse Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.O. Caldecott, World Wildlife Fund Malaysia, 7 Jalan Ridgeway, 93200 Kuching, Sarawak, Malaysia</P>
+<P ALIGN="JUSTIFY">R. Chaplin, Burnhouse, Fountainhall, Galashiels, Selkirk TDI 2RX, UK</P>
+<P ALIGN="JUSTIFY">G.W.H. Davison, Zoology Department, Universiti Kebangsaan Malaysia, 43600 Bangi, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">P. Grubb, 35 Downhills Park Road, London N17 6PE, UK</P>
+<P ALIGN="JUSTIFY">Liu Ruiqing, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">M. MacNamara, Fauna Research, Inc., 11 Park Avenue, Ardsley, New York 10502, USA</P>
+<P ALIGN="JUSTIFY">I. Muul, Integrated Conservation Research, P.O. Box 920, Harpers Ferry, West Virginia 25425, USA</P>
+<P ALIGN="JUSTIFY">M. Nordin, Bureau of Research and Consultancy, University Kebangsaan Malaysia, Bangi, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY">S. Pathak, Department of Genetics, M.D. Anderson Hospital and Tumor Institute, Houston, Texas 77030, USA</P>
+<P ALIGN="JUSTIFY">C.T. Robbins, Wildlife Biology Program, Washington State University, Pullman, Washington 99164-4220, USA</P>
+<P ALIGN="JUSTIFY">K. Robin, Tierpark Dahlholzli Bern, Dalmaziquai 149, CH-3005 Bern, Switzerland</P>
+<P ALIGN="JUSTIFY">C.R. Schmidt, Zoological Garden, CH-8044 Zurich, Switzerland</P>
+<P ALIGN="JUSTIFY">R.A. Sirimanne, Singapore Zooological Gardens, 80 Mandai Lake Road, Singapore 2572</P>
+<P ALIGN="JUSTIFY">L. Talbot, 6656 Chilton Court, McLean, Virginia 22101, USA</P>
+<P ALIGN="JUSTIFY">M.K. Vidyadaran, Faculty of Veterinary Science, Department of Animal Science, Universiti Pertanian Malaysia, Serdang 43400, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY">Wang Yingxiang, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">D. Wharton, New York Zoological Society, Bronx, New York 10460, USA</P>
+<P ALIGN="JUSTIFY">G.C. Whittow, Department of Physiology, John A. Burns School of Medicine, University of Hawaii, 1960 East West Road, Honolulu, Hawaii 96822, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Muntjac</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. Barrette, DTpartement de Biologie, FacultT des Sciences et de GTnie, UniversitT Laval, QuTbec, GIK 7P4, Canada</P>
+<P ALIGN="JUSTIFY">K. Benirschke, 8457 Prestwick Drive, La Jolla, California 92037, USA</P>
+<P ALIGN="JUSTIFY">The British Deer Society, Church Farm, Lower Basildon, Reading, Berkshire RG8 9NH, UK</P>
+<P ALIGN="JUSTIFY">J.O. Caldecott, World Wildlife Fund Malaysia, 7 Jalan Ridgeway, 933200 Kuching, Sarawak, Malaysia</P>
+<P ALIGN="JUSTIFY">N. Chapman, Larkmead, Barton Mills, Bury St. Edmunds, Suffolk IP28 6AA, UK</P>
+<P ALIGN="JUSTIFY">M. Coe, Department of Zoology, University of Oxford, South Parks Road, Oxford OXI 3PS, UK </P>
+<P ALIGN="JUSTIFY">O. Dansie, The Chapel, 2 Hobbs Hall, Welwyn, Hertsfordshire, UK</P>
+<P ALIGN="JUSTIFY">S.K. Dhungal, Department of Parks and Wildlffe, P.O. Box 860, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY">C. Dubost, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">R.J. Goss, Division of Biology and Medicine, Brown University, Providence, Rhode Island 02912, USA</P>
+<P ALIGN="JUSTIFY">C.P. Groves, Department of Prehistory and Anthropology, Australian National University, P.O. Box 4, Canberra, Australian Capital Territory 2600, Australia</P>
+<P ALIGN="JUSTIFY">P. Grubb, 35 Downhills Park Road, London N17 6PE, UK</P>
+<P ALIGN="JUSTIFY">S.P. Harding, Animal Ecology Research Group, Zoology Department, South Parks Road, Oxford OX1 3PS, UK</P>
+<P ALIGN="JUSTIFY">S. Harris, Department of Zoology, University of Bristol, Woodland Road, Bristol BS8 JUG, UK</P>
+<P ALIGN="JUSTIFY">H. Heck, CatskiH Game Farm, Inc., RD #1, Box 133, Catskill, New York 12414, USA</P>
+<P ALIGN="JUSTIFY">H.A. Jacobson, Fish and Wildlffe Department, Mississippi State University, Mississippi State, Mississippi 39762, USA</P>
+<P ALIGN="JUSTIFY">Liu Ruiqing, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Lu Houji, Department of Biology, East China Normal University, Shanghai 200062, People's Republic of China</P>
+<P ALIGN="JUSTIFY">M. MacNamara, Fauna Research, Inc., 11 Park Avenue, Ardsley, New York 10502, USA</P>
+<P ALIGN="JUSTIFY">V.J.A. Manton, Zoological Society of London, Whipsnade Park, Dunstable, Bedfordshire LU6 2LF, UK</P>
+<P ALIGN="JUSTIFY">S. Miura, Department of Biology, Hyogo College of Medicine, Mukogawa-cho 1-1, Nishinomiya, Hyogo-ken 663, Japan</P>
+<P ALIGN="JUSTIFY">I. Muul, Integrated Conservation Research, P.O. Box 920, Harpers Ferry, West Virginia 25425, USA</P>
+<P ALIGN="JUSTIFY">S. Pathak, Department of Genetics, M.D. Anderson Hospital and Tumor Institute, Houston, Texas 77030, USA</P>
+<P ALIGN="JUSTIFY">C.T. Robbins, Wildlife Biology Program, Washington State University, Pullman, Washington 99164, USA</P>
+<P ALIGN="JUSTIFY">B. Seidel, Tierpark Berlin, Tierklinik, DDR-1136 Berlin, Friedrichsfelde, Germany</P>
+<P ALIGN="JUSTIFY">Shi Liming, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">H. Soma, Department of Obstetrics and Gynecology, Tokyo Medical College Hospital, 1-7, Nishishinjuku 6, Shinjuku-ku, Tokyo 160, Japan</P>
+<P ALIGN="JUSTIFY">S. Stadler, Fakultat fur Biologie, Universitat Bielefeld, 4800 Bielefeld, Universitatsstrasse 25, Germany</P>
+<P ALIGN="JUSTIFY">L. Talbot, 6656 Chilton Court, McLean, Virginia 22101, USA</P>
+<P ALIGN="JUSTIFY">P.F. Taylor, Taylor Energy Company, The 2-3-4 Loyola Building, New Orleans, Louisiana 70112, USA</P>
+<P ALIGN="JUSTIFY">Wang Yingziang, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">C. Wemmer, Conservation and Research Center, National Zoological Park, Front Royal, Virginia 22630, USA</P>
+<P ALIGN="JUSTIFY">D. Wharton, New York Zoological Society, Bronx, New York 10460, USA</P>
+<P ALIGN="JUSTIFY">D.M. Wurster-HiH, Department of Pathology, Dartmouth Medical School, Hanover, New Hampshire 03755, USA</P>
+<P ALIGN="JUSTIFY">R.H. Yahner, 320 Forest Resources Laboratory, Pennsylvania State University, University Park, Pennsylvania 16802, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Musk Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. Chaplin, Burnhouse, Fountainhall, Galashiels, Selkirk TDI 2RX, UK</P>
+<P ALIGN="JUSTIFY">S.K. Dhungel, Department of Parks and Wildlife, P.O. Box 860, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY">A.J. Gaston, Canadian Wildlife Service, Ottawa KIA OE7, Canada</P>
+<P ALIGN="JUSTIFY">C.P. Groves, Department of Prehistory and Anthropology, Australian National University, P.O. Box 4, Canberra, Australian Capital Territory 2600, Australia</P>
+<P ALIGN="JUSTIFY">M.J.B. Green, IUCN Conservation Monitoring Centre, 219C Huntingdon Road, Carnbridge CB3 ODL, UK</P>
+<P ALIGN="JUSTIFY">P. Grubb, 35 Downhills Park Road, London N17 6PE, UK</P>
+<P ALIGN="JUSTIFY">M.L. Hunter, Jr., Wildlife Department, University of Maine, Orono, Maine 04469, USA</P>
+<P ALIGN="JUSTIFY">H.A. Jacobson, Fish and Wildlife Department, Mississippi State University, Mississippi State, Mississippi 39762, USA</P>
+<P ALIGN="JUSTIFY">B. Kattel, P.O. Box 3070, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY">Liu Riqing, Kunming Institute of Zoology, Academia Sinica, Kunming Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Lu Houji, Department of Biology, East China Normal University, Shanghai 200062, People's Republic of China</P>
+<P ALIGN="JUSTIFY">J. McNeely, Program and Policy Division, International Union for Conservation of Nature and Natural Resources, Avenue du Mont-Blanc, CH1196 Gland, Switzerland</P>
+<P ALIGN="JUSTIFY">B.W. O'Gara, Montana Cooperative Wildlife Research Unit, University of Montana, Missoula, Montana 59812, USA</P>
+<P ALIGN="JUSTIFY">C.T. Robbins, Wildlife Biology Program, Washington State University, Pullman, Washington 99164-4220, USA</P>
+<P ALIGN="JUSTIFY">B. Seidel, Tierpark Berlin, Tierklinik, DDR-1136 Berlin, Friedrichsfelde, Germany</P>
+<P ALIGN="JUSTIFY">Shi Liming, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">P.F. Taylor, Taylor Energy Co., The 2-3-4 Loyola Building, New Orleans, Louisiana 70112, USA</P>
+<P ALIGN="JUSTIFY">Wang Yingxiang, Kunming Institute of Zoology, Academia Sinica, Kunming, Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water Deer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. Cooke, Nature Conservancy Council, Northminster House, Peterborough PEI I UA, UK</P>
+<P ALIGN="JUSTIFY">L. Farrell, Nature Conservancy Council, Northminster House, Peterborough PEI IUA, UK</P>
+<P ALIGN="JUSTIFY">F. Feer, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">P. Crubb, 35 Downhills Park Road, London N17 6PE, UK</P>
+<P ALIGN="JUSTIFY">Liu Riuqing, Kunming Institute of Zoology, Academia Sinica. Kunming Yunnan Province, People's Republic of China</P>
+<P ALIGN="JUSTIFY">Lu Houji, Department of Biology, East China Normal University, Shanghai 200062, People's Republic of China</P>
+<P ALIGN="JUSTIFY">V.J.A. Manton, Zoological Society of London, Whipsnade Park, Dunstable, Bedfordshire LU6 2LF, UK</P>
+<P ALIGN="JUSTIFY">B. Seidel, Tierpark Berlin, Tierklinik DDR-1136, Berlin, Friedrichsfelde, Germany</P>
+<P ALIGN="JUSTIFY">R Smith, Department of Zoology, Whiteknights Park, University of Reading, Reading, Berkshire RG6 2AH, UK</P>
+<P ALIGN="JUSTIFY">S. Stadler, Fakultat fur Biologie, Universitat Bielefeld, 4800 Bielefeld, Universitats strasse 25, Germany</P>
+<P ALIGN="JUSTIFY">P.F. Taylor, Taylor Energy Company, The 2-3-4 Loyola Building, New Orleans, Louisiana 70112, USA</P>
+<P ALIGN="JUSTIFY">C. Wemmer, Conservation and Research Center, National Zoological Park, Front Royal, VA 2263O, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South American Microdeer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. Sampath, Trinidad and Tobago Wildlffe Breeders and Farmers Association, c/o 5 3/4 Mile Mark, Penal Rock Road, Penal, Trinidad, West Indies (red brocket)</P>
+<P ALIGN="JUSTIFY">M. MacNamara, Fauna Research, Inc., 11 Park Avenue, Ardsley, New York 10502, USA (pudu)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duikers</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. Baranga, Department of Zoology, Makerere University, P.O. Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">B. Chardonnet, Projet Petits Ruminants, B.P. 65, Atakpame, Togo</P>
+<P ALIGN="JUSTIFY">R.L. Cowan, 324 Henning Building, Pennsylvania State University, University Park, Pennsylvania 16802, USA</P>
+<P ALIGN="JUSTIFY">G. Dubost, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">RI.M. Dunbar, Department of Zoology, University of Liverpool, P.O. Box 147, Liverpool L69 3BX, UK</P>
+<P ALIGN="JUSTIFY">F. Feer, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">K.R. Kranz, Zoological Society of Philadelphia, 34th Street and Girard Avenue, Philadelphia, Pennsylvania 19104, USA</P>
+<P ALIGN="JUSTIFY">S. Lumpkin, Department of Zoological Research, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">I. Player, Wilderness Leadership School, P.O. Box 15036, BeHair 4006, Natal, South Africa</P>
+<P ALIGN="JUSTIFY">K. Pond, Department of Animal Science, North Carolina State University, Box 7621, Raleigh, North Carolina 27695, USA</P>
+<P ALIGN="JUSTIFY">S. Schweers, Bahnhofstrasse 29, D-6744 Kandee, Germany</P>
+<P ALIGN="JUSTIFY">J.D. Skinner, Mammal Research Institute, University of Pretoria, Pretoria 0002, South Africa</P>
+<P ALIGN="JUSTIFY">A.E. SoHod, International Veterinary Medicine, Tufis University, 200 Westboro Road, North Grafion, Massachusetts 01536, USA</P>
+<P ALIGN="JUSTIFY">L. Talbot, 6656 Chilton Court, McLean, Virginia 22101, USA</P>
+<P ALIGN="JUSTIFY">C.C. Udell, 14934 VaHey Vista Blouvard, Sherman Oaks, Calffornia 91403, USA</P>
+<P ALIGN="JUSTIFY">G.A. Varga, Department of Dairy and Animal Science, 225B Borland Laboratory, Pennsylvania State University, University Park, Pennsylvania 16802, USA</P>
+<P ALIGN="JUSTIFY">V.J. Wilson, Duiker Research and Breeding Centre, Chipangali Wildlife Trust, P.O. Box 1057, Bulawayo, Zimbabwe </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Small Antelope</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">L. Asibey, Department of Game and Wildlife, Ministry Post Office, Accra, Ghana</P>
+<P ALIGN="JUSTIFY">J. Baranga, Department of Zoology, Makerere University, P.O. Box 7062, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">J.I. Boshe, College of African Wildlife Management, Mweka, P.O. Box 3031, Moshi, Tanzania (dikdik)</P>
+<P ALIGN="JUSTIFY">B. Chardonnet, Project Petits Ruminants, BP 65, Atakpame, Togo (oribi)</P>
+<P ALIGN="JUSTIFY">S.K. Dhungel, Department of National Parks and Wildife, Conservation, Babar Mahal, Kathmandu, Nepal (four-horned antelope)</P>
+<P ALIGN="JUSTIFY">R.I.M. Dunbar, Department of Zoology, University of Liverpool, P.O. Box 147, Liverpool L69 3BX, UK (dikdik, klipspringer)</P>
+<P ALIGN="JUSTIFY">F. Feer, Laboratoire d'Ecologie GTnTrale, 4 avenue Petit ChGteau, 91800 Brunoy, France</P>
+<P ALIGN="JUSTIFY">A.M. Goebel, Department of Biology, University of Texas at Arlington, Arlington, Texas 76019, USA</P>
+<P ALIGN="JUSTIFY">P.P. Hoppe, Am Hauenstein 13, 6706 Wachenheim, Germany (dikdik, suni)</P>
+<P ALIGN="JUSTIFY">K.R. Kranz, Zoological Society of Philadelphia, 34th Street and Girard Avenue, Philadelphia, Pennsylvania 19104, USA (royal antelope, beira, dikdik, klipspringer, suni, four-horned antelope)</P>
+<P ALIGN="JUSTIFY">I. Player, Wilderness Leadership School, P.O. Box 15036, Bellair 4006, Natal, South Africa</P>
+<P ALIGN="JUSTIFY">E.N.W. Oppong, UNDP/FGN/FAO Livestock Project, P.O. Box 6603, Jos, Plateau State, Nigeria</P>
+<P ALIGN="JUSTIFY">W.R. Pritchard, School of Veterinary Medicine, University of California, Davis, California 95616, USA</P>
+<P ALIGN="JUSTIFY">J. Skinner, Mammal Research Institute, University of Pretoria, Pretoria 0002, South Africa (otibi, steinbok)</P>
+<P ALIGN="JUSTIFY">A.E. Sollod, International Veterinary Medicine, Tufts University, 200 Westboro Road, North Grafton, Massachusetts 01536, USA (dikdik, klipspringer)</P>
+<P ALIGN="JUSTIFY">L. Talbot, 6656 Chilton Court, McLean, Virginia 22101, USA (dikdik, klipspringer, four-horned antelope)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LIZARDS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Green Iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">K. Benirschke, 8457 Prestwick Drive, La Jolla, California 92037, USA</P>
+<P ALIGN="JUSTIFY">G.M. Burghardt, Department of Psychology, University of Tennessee, Knoxville, Tennessee 37996, USA</P>
+<P ALIGN="JUSTIFY">A. Ferreira, Parque Zoologico Nacional, Apartado 2449, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">H.S. Fitch, Route #3, Box 142, Lawrence, Kansas 66044, USA</P>
+<P ALIGN="JUSTIFY">G. Hemley, World Wildlife Fund, 1255 23rd Street, N.W., Washington, D.C. 20037, USA (for trade information)</P>
+<P ALIGN="JUSTIFY">R.W. Henderson, Milwaukee Public Museum, 800 West Wells Street, Milwaukee, Wisconsin 53233 USA</P>
+<P ALIGN="JUSTIFY">J. Higginson, Voluntaria del Cuerpo de Paz, #156 6a Avenida 1-46, Zona 2 Guatemala, Guatemala</P>
+<P ALIGN="JUSTIFY">J.B. Iverson, Department of Biology, Earlham College, Richmond, Indiana 47374, USA S.R. Kellert, School of Forestry and Environmental Studies, Yale University, 205 Prospect Street, New Haven, Connecticut 06511, USA</P>
+<P ALIGN="JUSTIFY">F.W. King, Florida State Museum, University of Florida, Gainesville, Florida 32601, USA</P>
+<P ALIGN="JUSTIFY">G. Larde, Ministerio de Agricultura y Ganaderia Planes de Renderos, Km. 10 Col. Los Angeles 13, CP 01196 San Salvador, El Salvador</P>
+<P ALIGN="JUSTIFY">D. Marcellini, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">J.M. Mora, 200 m sur Pulperia la Uni6n, Cinco Esquinas, Carrieal, Alajuela, Costa Rica</P>
+<P ALIGN="JUSTIFY">J.A. Ottenwalder, Parque Zool6gico Nacional, Apartado 2449, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">G.C. Packard, Department of Zoology, Colorado State University, Fort Collins, Colorado 80523, USA</P>
+<P ALIGN="JUSTIFY">J.J. Perez, Condominio Su. Antonio 7, C. San Antonio Abad, San Salvador, El Salvador</P>
+<P ALIGN="JUSTIFY">J. Phillips, Research Department, San Diego Zoo, Box 551, San Diego, Calffornia 92112, USA</P>
+<P ALIGN="JUSTIFY">D. Werner, Fundacion Pro Iguana Verde, Apa,-tado 1501-3000, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black Iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H.S. Fitch, Route #3, Box 142, Lawrence, Kansas 66044, USA</P>
+<P ALIGN="JUSTIFY">R.W. Henderson, Milwaukee Public Museum, 800 West Wells Street, Milwaukee, Wisconsin 53233, USA</P>
+<P ALIGN="JUSTIFY">J. Higginson, Voluntaria del Cuerpo de Paz, #156 6a Avenida 1-46, Zona 2 Guatemala, Guatemala</P>
+<P ALIGN="JUSTIFY">D.M. Hillis, Department of Biology, University of Miami, Coral Gables, Florida 33124, USA</P>
+<P ALIGN="JUSTIFY">G. Larde, Ministerio de Agricultura y Ganaderia, Planes de Renderos Km. 10 Col. Los Angeles 13, CP 01196, San Salvador, El Salvador</P>
+<P ALIGN="JUSTIFY">D. Marcellini, National Zoologica, Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">J.M. Mora, 200 m sur Pulperita La Union, Cinco Esquinas, Carrieal, Alajuela, Costa Rica</P>
+<P ALIGN="JUSTIFY">G.C. Packard, Department of Zoology, Colorado State University, Fort Collins, Colorado 80523, USA</P>
+<P ALIGN="JUSTIFY">J.J. Perez, Condominio Su. Antonio 7, C. San Antonio Abad, San Salvador, El Salvador</P>
+<P ALIGN="JUSTIFY">J. Phillips, Research Department, San Diego Zoo, Box 551, San Diego, Calffornia 92112, USA</P>
+<P ALIGN="JUSTIFY">D. Werner, Fundacion Pro Iguana Verde, Apartado 1501-3000, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rock Iguana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. Auffenberg, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">D. Auth, Florida State Museum, University of Florida, Gainesville, Florida 32611, USA</P>
+<P ALIGN="JUSTIFY">T.J. Cullen, Cullen Vivarium, 3401 South 16th Street, Milwaukee, Wisconsin 53215 USA</P>
+<P ALIGN="JUSTIFY">A. Ferreira, Parque Zool6gico Nacional, Apartado 2449, Santo Domingo, Dominican Republic </P>
+<P ALIGN="JUSTIFY">R.W. Henderson, Mi]waukee Public Museum, 800 West Wells Street, Milwaukee, Wisconsin 53233, USA</P>
+<P ALIGN="JUSTIFY">J.B. Iverson, Department of Biology, Earlham College, Richmond, Indiana 47374, USA</P>
+<P ALIGN="JUSTIFY">J.A. Ottenwalder, Parque Zool6gico Nacional, Apartado 2449, Santo Domingo, Dominican Republic</P>
+<P ALIGN="JUSTIFY">T.A. Wiewandt, Wild Horizons, Inc., P.O. Box 5118, Tucson, Arizona 85703, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tegu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C.A. Blanco, Direccion Nacional de Fauna Silvestre, Avenida Paseo Colon 922 2&Yacute;piso, (1063) Buenos Aires, Argentina</P>
+<P ALIGN="JUSTIFY">O.K. Donadio, Museo Argentino de Ciencias Naturales, CC 220, Avenida Angel Gallardo 470, Suc. 5, 1405 Buenos Aires, Argentina</P>
+<P ALIGN="JUSTIFY">J.M. Gallardo, Museo Argentino de Ciencias Naturales, CC 220, Avenida Angel Gallardo 470, Suc. 5, 1405 Buenos Aires, Argentina</P>
+<P ALIGN="JUSTIFY">G. Hemley, World Wildlife Fund, 1255 23rd Street, N.W., Washington, D.C. 20037, USA</P>
+<P ALIGN="JUSTIFY">D. Marcellini, National Zoological Park, Washington, D.C. 20008, USA</P>
+<P ALIGN="JUSTIFY">E.L. Marmillon, Casilla de Correo 451, 5800 Rio Cuarto, Argentina</P>
+<P ALIGN="JUSTIFY">G.C. Packard, Department of Zoology, Colorado State University, Fort Collins, Colorado 80523, USA</P>
+<P ALIGN="JUSTIFY">D. Werner, Fundacion Pro Iguana Verde, Apartado 1501-3000, Heredia, Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEES</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Local Agriculture Extension Services and beekeepers are often the best source of information for beginning beekeeping. In addition, the following organizations can provide information: International Bee Research Association, 16/18 North Road, Cardiff CF1 3DY, UK; International Agency for Apiculture Development, 6N 909 Roosevelt, St. Charles, Illinois 60174, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. Abt, Centre for International Agricultural Development Cooperation, Tel Aviv, Israel M. Adey. International Bee Research Association, 16/18 North Road, Cardiff CFI 3DY, UK</P>
+<P ALIGN="JUSTIFY">S.O. Adjare, Technology Consultancy Centre, University of Science and Technology, Kumasi, Ghana</P>
+<P ALIGN="JUSTIFY">All India Beekeepers' Association, 817 Sadashiv Peth, Poono 411 030, India</P>
+<P ALIGN="JUSTIFY">S.K.N. Atuahene, Forest Product Research Institute (Ghana Forestry Commission), University P.O. Box 63, Kumasi, Ghana</P>
+<P ALIGN="JUSTIFY">H.S. Brar, Department of Entomology, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">N. Bradbear, International Bee Research Association, North Road, Cardiff CFI 3DY, UK</P>
+<P ALIGN="JUSTIFY">D.M. Caron, Department of Entomology and Applied Ecology, University of Delaware, Newark, Delaware 19717, USA</P>
+<P ALIGN="JUSTIFY">B.S. Chahal, Department of Entomology, Punjab Agricultural University, Ludhiana 141 004, India</P>
+<P ALIGN="JUSTIFY">B. Clauss, Beekeeping Survey, Kabompo, Zambia </P>
+<P ALIGN="JUSTIFY">M.P. Coleman, International Agency for Apiculture Development, 6N 909 Roosevelt, St. Charles, Illinois 60174, USA</P>
+<P ALIGN="JUSTIFY">Director, or Resident Bee Specialist, Apiary Studies, Zoological Institute, Leningrad, USSR</P>
+<P ALIGN="JUSTIFY">D. DeJong, Departamento de Genetica, Faculdade de Medicina de Ribeirao Preto, Universidade Sao Paulo, 14.049Ribeirao Preto, Sao Paulo, Brazil</P>
+<P ALIGN="JUSTIFY">R.W. Dutton, Centre for Overseas Research and Development (CORD), University of Durham, South Road, Durham DHI 3LE, UK (Apisflorea) </P>
+<P ALIGN="JUSTIFY">E.H. Erickson, Carl Hayden Bee Research Center, Agricultural Research Service, U.S. Department of Agriculture, 2000 East Allen Road, Tucson, Arizona 85719, USA</P>
+<P ALIGN="JUSTIFY">Faculdade de Medicina de Ribeirao Preto, Departamento de GenTtica, 14100Ribeirao Preto, Sao Paulo, Brazil</P>
+<P ALIGN="JUSTIFY">R.D. Fell, Virginia Polytechnic Institute, Blacksburg, Virginia 24061, USA</P>
+<P ALIGN="JUSTIFY">K. Flottum, Gleanings in Bee Culture, 623 West Liberty Street, P.O. Box 706, Medina, Ohio 44258-0706, USA (editor)</P>
+<P ALIGN="JUSTIFY">J. Free, Rothamstead Experimental Station, Harpenden, Hertfordshire L5 2JQ, UK</P>
+<P ALIGN="JUSTIFY">D. Wolde-Semait Gebre-Wold, P.O. Box 7505, Addis Ababa, Ethiopia</P>
+<P ALIGN="JUSTIFY">C.B. Habarugira, AHO (Apiary), Mbara Stockfarm, Beekeeping Section, P.O. Box 4, Mbarara, Uganda</P>
+<P ALIGN="JUSTIFY">L.A.M. Hassan, Njiro Wildlife (Beekeeping) Research Centre, P.O. Box 661, Arusha, Tanzania</P>
+<P ALIGN="JUSTIFY">R. Hoopingarner, Department of Entomology, University of Michigan, East Lansing, Michigan 48824-1115, USA</P>
+<P ALIGN="JUSTIFY">W.E. Kerr, Departamento de Biolgia, Universidade Federal de UberlGndia, 38400 UberlGndia, Brazil</P>
+<P ALIGN="JUSTIFY">P.G. Kevan, or Resident Bee Specialist, Department of Environmental Biology, University of Guelph, Guelph, Ontario NIG 2WI, Canada</P>
+<P ALIGN="JUSTIFY">K.K. Kigatiia, Beekeeping Branch, Ministry of Agriculture c~ Livestock Development, P.O. Box 30028, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">H.C. Killins, 163 Trowbridge Avenue, London, Ontario N6J 3M2, Canada</P>
+<P ALIGN="JUSTIFY">H.M. Kiwuwa, AHL (Apiary), Department of Veterinary Services, Headquarters, Beekeeping Section, P.O. Box 7141, Kampala, Uganda</P>
+<P ALIGN="JUSTIFY">G. Lanarolle, Apiculture Project, Bindunuwewa, Bandarawela, Sri Lanka</P>
+<P ALIGN="JUSTIFY">Y. Lensky, Triwaks Bee Research Center, Hebrew University Faculty of Agriculture, Rehovot 76-100, Israel</P>
+<P ALIGN="JUSTIFY">M.D. Levin, Carl Hayden Bee Research Center, Agricultural Research Service, U.S. Department of Agriculture, 2000 East Allen Road, Tucson, Arizona 85719, USA</P>
+<P ALIGN="JUSTIFY">M. Singh Limbu, Godavari Ashram, GPO Box 50, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY">I. Mann, 14 Millimani Road, Box 20360, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY">R.J. McGinley, Department of Entomology, NHB-105, Smithsonian Institution, Washington, D.C. 20560, USA (Apoidea, except Apis) </P>
+<P ALIGN="JUSTIFY">J. McKay, Peace Corps, American Embassy, Asunci6n, Paraguay</P>
+<P ALIGN="JUSTIFY">C.D. Michener, Snow Entomological Museum, University of Kansas, Lawrence, Kansas 66045, USA</P>
+<P ALIGN="JUSTIFY">R.A. Morse, Department of Entomology, Cornell University, Ithaca, New York 14853, USA</P>
+<P ALIGN="JUSTIFY">J. Morton, Morton Collectanea, University of Miami, Box 248204, Coral Gables, Florida 37724, USA (bee plants)</P>
+<P ALIGN="JUSTIFY">D.G. Mugisa, c/o Insure Consult, P.O. Box 30002, Nakiuubo, Uganda</P>
+<P ALIGN="JUSTIFY">M. Bin Muid, Department of Plant Protection, Faculty of Agriculture, Universiti Pertanian Malaysia, Serdang 43400, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY">H.C. Mulzac, International Agency for Apiculture Development, 393 Decatur Street, Brooklyn, New York 11233, USA </P>
+<P ALIGN="JUSTIFY">K.S. Najar, Faculty of Agriculture, University of Aleppo, Aleppo, Syria</P>
+<P ALIGN="JUSTIFY">B.E. Nightingale, Box 23, Njoro, Kenya</P>
+<P ALIGN="JUSTIFY">G. Patty, Foreign Agriculture Service, U.S. Department of Agriculture, 6095 South Building, Washington, D.C. 20250, USA</P>
+<P ALIGN="JUSTIFY">L.M. Phiri, Office of Chief Beekeeping Officer, P/BAC Mwekera, Kitwe, Zambia</P>
+<P ALIGN="JUSTIFY">R. Pickard, Zoology Department, University College, P.O. Box 78, Cardiff CFI IXL, South Wales, UK</P>
+<P ALIGN="JUSTIFY">G.W. Robins, GPO Box 50, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY">D. Roubik, Stop 105, Museum of Natural History, Smithsonian Institution, Washington, D.C. 20560, USA (stingless bees)</P>
+<P ALIGN="JUSTIFY">D. Sammataro, 7011 Spieth Road, Medina, Ohio 44256, USA (editor, Cornucopia) </P>
+<P ALIGN="JUSTIFY">G. Schechtel, Cnel. Bogado/Itapua, Paraguay</P>
+<P ALIGN="JUSTIFY">H. Shimanuki, Beneficial Insects Laboratory, Agricultural Research Service, U.S. Department of Agriculture, B-476 BARC-East, Beltsville, Maryland 20705, USA</P>
+<P ALIGN="JUSTIFY">O.R. Taylor, Department of Entomology, University of Kansas, Lawrence, Kansas 66045, USA</P>
+<P ALIGN="JUSTIFY">J.E. Tew, Agricultural Technical Institute, Ohio State University, Wooster, Ohio 44691, USA</P>
+<P ALIGN="JUSTIFY">M. Tomasko, Pennsylvania State University, 106 Patterson Building, University Park7 Pennsylvania 16802, USA</P>
+<P ALIGN="JUSTIFY">P. Torchio, Agricultural Research Service, U.S. Department of Agriculture, Bee Laboratory, Utah State University, Logan, Utah 84322-5310, USA</P>
+<P ALIGN="JUSTIFY">R. Wadlow, 8381 San Mateo, Ft. Myers, Florida 33907, USA</P>
+<P ALIGN="JUSTIFY">D.W. Whitehead, International Agency for Apiculture Development, c/o 1000 Connecticut Avenue NW, #707, Washington, D.C. 20036, USA</P>
+<P ALIGN="JUSTIFY">Siriwat Wongsiri, Department of Biology, Chulalongkorn University, Bangkok7 Thailand (Apis cerana) </P>
+<P ALIGN="JUSTIFY">Wu Yan-ru, Department of Insect Taxonomy and Faunistics, Institute of Zoology, Academia Sinica, 7 Zhongguancun Lu, Haitien, Beijing, People's Republic of China </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">C BIOGRAPHICAL SKETCHES OF PANEL MEMBERS</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH W. PHILLIPS retired in 1982 from the post of deputy director general of the Food and Agriculture Organization of the United Nations (FAO), Rome, Italy, a post he held for four years. Among his earlier posts were that of professor and head, Animal Husbandry Department, Utah State University; senior animal husbandman in charge, Genetic Investigations, United States Department of Agriculture (USDA); chief, Animal Production Branch and deputy director, Agriculture Division, FAO; and executive director, International Organization Affairs, USDA. Among his special assignments were: serving as consultant on animal breeding to the governments of China and India for the U.S. Department of State in 1943-44; and as scientific secretary for agriculture of the United Nations Conference on Science and Technology for the Benefit of Developing Countries, in Ceneva, Switzerland, 1962-63. Dr. Phillips holds a B.S. degree in agriculture from Berea College (1930), M.A. (1931) and Ph.D. (1934) degrees from the University of Missouri, and Honorary D.Sc. degrees from Berea College and West Virginia University. He has been awarded the Berea College Distinguished Alumnus Award and the USDA's Distinguished Service Award. He is author or coauthor of some 240 scientific papers, review papers, chapters in books, and books on various aspects of physiology of reproduction, genetics, livestock production, and international agriculture. In his research, writings, and international activities, Dr. Phillips has given particular attention to breeding in relation to the environment and to the identification and conservation of valuable animal genetic resources. He is also the author of a definitive history of FAO entitled FAO: Its Origins, Formation and Evolution, 19451981 and an autobiography, The World Was My Barnyard. </P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU is currently senior advisor to the president of the African Development Bank. He is also president of ESA Associates, Washington, D.C., and former director of the Office of Biological Conservation, Smithsonian Institution, Washington, D.C. A citizen of Ghana, he received his B.A. in 1961 from Miami University in Ohio, M.Sc. from The George Washington University in 1963, and his Ph.D. in 1966 from the University of London. His research interests cover many areas of tropical biology. An internationally recognized expert on topics relating to science, technology, and development, especially in developing countries, he has also published extensively on tropical plants. Dr. Ayensu chairs and serves as a member of many international bodies. </P>
+<P ALIGN="JUSTIFY">BONNIE V. BEAVER, professor of small animal medicine and surgery, Texas A&amp;M University, College Station, is a specialist in animal behavior and problem behaviors, especially in domestic and laboratory animals. She received her B.S. and D.V.M. from the University of Minnesota and her M.S. from Texas A&amp;M. In addition to being a popular speaker at scientific meetings, she is the author of five books and numerous book chapters and articles. </P>
+<P ALIGN="JUSTIFY">KURT BENIRSCHKE, professor of pathology and reproductive medicine, University of California at San Diego, received his M.D. from the University of Hamburg, Germany, in 1948. He served on the faculties of Harvard and Dartmouth medical schools before coming to San Diego in 1970. At the San Diego Zoo he initiated a research department to advance knowledge in endangered species and now serves as a trustee of that organization. He has written on comparative mammalian cytogenetics, vanishing species, and human reproductive pathology. </P>
+<P ALIGN="JUSTIFY">ROY D. CRAWFORD is professor of animal and poultry genetics at the University of Saskatchewan, Saskatoon, Saskatchewan, Canada. He received his B.S.A. from the University of Saskatchewan in 1955, his M.S. in animal genetics from Cornell University in 1957, and his Ph.D. in poultry genetics from the University of Massachusetts in 1963. He was employed as a scientist with the Research Branch of Agriculture Canada from 1957 to 1964 in Prince Edward Island and Nova Scotia. He joined the faculty of the University of Saskatchewan in 1964. He was made a fellow of the Agricultural Institute of Canada in 1986 in recognition of his teaching and research work. His research interests include single gene genetics of poultry, and conservation of genetic resources in poultry and livestock. He has discovered and studied many mutants in chickens; some of them have biomedical importance, including one shown to be an animal genetic model of human grand mal epilepsy; some of them are potentially useful in food production, including an albinism mutant that is being developed for autosexing of commercial chicken broilers. He maintains a very large conservation collection of poultry genetic resources at the University of Saskatchewan and has prepared an inventory and assessment of Canada's poultry and livestock genetic resources. Dr. Crawford is a member of the Expert Panel on Animal Genetic Resources Conservation and Management, FAO/UNEP, Rome, and is a member of the Animal Resources Committee, Canadian Council on Animal Care, Ottawa. He serves on the International Scientific Committee for the French journal GTnTtique, STlection, +volution. He is a member of the Rare Breeds Survival Trust (UK) and is a board member of the American Minor Breeds Conservancy (USA). </P>
+<P ALIGN="JUSTIFY">TONY J. CUNHA, distinguished service professor emeritus, University of Florida, Gainesville, and dean emeritus, California State Polytechnic University, Pomona, received his Ph.D. at the University of Wisconsin in 1944. He has given more than 100 lectures in livestock feeding and nutrition in 40 foreign countries. He served as chairman of the Animal Nutrition Committee of the National Academy of Sciences and as a member of the NAS-NRC Board of Agriculture and Renewable Resources, Latin American Science Board, and as chairman of the livestock committee of two world food studies by NAS-NRC. He served as a member of the organizing committee for the first two World Conferences on Animal Production in Rome (1963) and Washington, D.C. (1968). He served as a member of the Title XII Board of International Food and Agricultural Joint Committee on Research and as chairman of its research priorities committee 1977-1981. He is author, editor, coeditor, or contributor to 30 books and author of more than 1,423 scientific and professional articles. He is a winner of 42 campus, state, national, and international honors and awards. </P>
+<P ALIGN="JUSTIFY">DAVID E. DEPPNER, director of Trees for the Future in Silver Spring, Maryland, has been a consultant for international development projects involving livestock and poultry management and marketing for the past 14 years. He has served in 17 countries of Asia, Africa, and Central America. He has written on processing livestock rations under tropical conditions and about the Madurese breed of cattle found in East Java, Indonesia, where he spent two years studying this ancient breed. He is currently providing technical assistance to projects in several countries for the development of improved forage production as an answer to destruction of natural resources of tropical uplands caused by overgrazing. He received his B.Sc. in animal science from Ohio State University in 1954 and M.Sc. in livestock economics from Araneta University, the Philippines, in 1977. </P>
+<P ALIGN="JUSTIFY">ELIZABETH L. HENSON is the director of the American Minor Breeds Conservancy, based in Pittsboro, North Carolina. She received an M.A. in zoology from Oxford University in 1980 and an M.Sc. in domestic animal breeding from Edinburgh University in 1981. Her primary interests are in the conservation of rare and endangered breeds and varieties of domestic livestock as a genetic resource for changing agricultural needs. She represented Britain at the first international conference on domestic animal conservation in Hungary in 1982, and was a member of the Office of Technology Assessment Committee on grassroots strategies to maintain genetic diversity in 1985. She is executive secretary for four British breed associations and is a member of the British Rare Breeds Survival Trust Technical Panel. </P>
+<P ALIGN="JUSTIFY">DONALD L. HUSS was regional animal production officer of the FAO Regional Office for Latin America and the Caribbean, Santiago, Chile, before his retirement. He received a B.S. in 1949, an M.A. in 1954, and a Ph.D. in 1959, all at Texas A&amp;M University. He was assistant professor of range management at Texas A&amp;M before joining the Food and Agricultural Organization of the United Nations (FAO) in 1967. He founded the FAO Regional Office's Small Animals for Small Farms programme in 1980. Professional assignments and travels in Latin America, the Caribbean' Near and Middle East, and Africa have contributed to his knowledge and experience in microlivestock development. Dr. Huss was recognized by Texas A&amp;M University by being chosen as the recipient of the Memorial Student Center Appreciation and Distinguished Service Awards in 1958 and 196O, respectively, and Honour Professor in the College of Agriculture in 1966 67. He also received the Society for Range Management's Outstanding Service and Achievement Award in 1975 and its Fellow Award in 1978. </P>
+<P ALIGN="JUSTIFY">DAVID RICHARD LINCICOME has been a guest scientist with the Animal Parasitology Institute, United States Department of Agriculture Experiment Station, Beltsville, Maryland, since 1978, having retired as professor of parasitology, Howard University, Washington, D.C., in 1970. He received the B.S. and M.S. degrees cum laude simultaneously in 1937 from the University of Illinois and a Ph.D. in tropical medicine from the Tulane Medical School, New Orleans, Louisiana, in 1941. His principal research interests have centered around morphologic studies on Acanthocephala, molecular exchanges of dependent cells and their environments, and diagnosis of parasitic diseases. He has been a breeder of Nubian and American pygmy goats for the past 20 years. Dr. Lincicome is currently a member of the Board of Directors of the American Dairy Goat Association and is past president of the National Pygmy Goat Association. He was founder and long time trustee of the American Dairy Goat Association Research Foundation. He is also past president of the Helminthological Society and currently serves the society as archivist. He received the Helminthological Society's Anniversary Award in 1975. He was founder and, for 27 years, editor of the journal Experimental Parasitology, and is the author and editor of more than 180 scientific contributions. </P>
+<P ALIGN="JUSTIFY">THOMAS E. LOVEJOY is a tropical biologist and ornithologist. He is assistant secretary for external affairs, Smithsonian Institution' Washington, D.C. He was formerly executive vice president for the World Wildlife Fund-U.S., chairman of the Wildlife Preservation Trust International, and a member of two commissions of the International Union for the Conservation of Nature and Natural </P>
+<P ALIGN="JUSTIFY">Resources. At present, Dr. Lovejoy is a principal investigator of the world's largest controlled ecological experiment, which is attempting to determine the optimum size for parks and reserves. This project, conceived and designed by Dr. Lovejoy, is called "the Minimum Critical Size of Ecosystems" and is a joint program of World Wildlife Fund-U. S. and Brazil's National Institute for Amazon Research. Dr. Lovejoy is also the principal advisor for NATURE (WNET/THIRTEEN, New York), a series that he started in 1980. As principal advisor, he recommends program content and oversees the factual accuracy of the program scripts. A member of 11 scientific societies, Dr. Lovejoy has received grants from 16 foundations and institutions and written more than 100 articles for various national and International publications. He has published three books, Key Environments, Pergamon Press, Oxford; Nearctic Avian Migrants in the Neotropics, a Department of the Interior publication; and Conservation of Tropical Forest Birds, an ICPB publication. He is currently working on The Magnificent Exception, a book on people and the biosphere.</P>
+<P ALIGN="JUSTIFY">ARNE W. NORDSKOG is professor emeritus, Department of Animal Science, Iowa State University. He received his B.S., M.S., and Ph.D. degrees from the University of Minnesota between 1937 and 1943. His training and principal area of research has been in quantitative genetics, but by about 1960 his interests shifted to immunogenetics and more recently to molecular genetics. He has traveled widely, spending two years as an instructor in agriculture at the University of Alaska (1937-39), and has been an NSF Research Fellow at Cal Tech (1960), a visiting professor at the University of Minnesota (1966), an FAO lecturer at the Indian Veterinary Institute (1973), and an FAO-sponsored lecturer on poultry breeding in China (1979). He has acted as a consultant to a commercial breeder in Japan for 20 years. He has been the major professor at Iowa State for more than 60 M.S. and Ph.D. candidates and has published more than 150 scientific papers. Dr. Nordskog is an honorary member of the Norwegian Poultry Breeding Association, a fellow of the Poultry Science Association, and a fellow of the AAAS. In 1972, he was the recipient of the Poultry Science Distinguished Service Research Award. </P>
+<P ALIGN="JUSTIFY">LINDA M. PANEPINTO, swine research consultant, was director of the Colorado State University Swine Laboratory through 1988. She earned her B.S. in animal sciences at Colorado State University in 1972. In 1973 she joined the research team developing Yucatan miniature swine at Colorado State University, where she was given primary responsibility for colony management, protocol development, and genetic selection programs. In 1977, she designed an experimental research program for the development of a line of Yucatan pigs with a genetic propensity for exceptionally small size. She has continued her work in that area and has developed the Yucatan Micropig, described elsewhere in this publication. Her other major professional area of interest has been the design of facilities and equipment for swine with emphasis on animal comfort and minimizing stress. Her invention, known as the Panepinto Sling, has been widely adopted as the primary restraint method for numerous medical schools and research facilities using swine in the laboratory. She has published extensively in the field.</P>
+<P ALIGN="JUSTIFY">KURT J. PETERS is professor of animal breeding and husbandry in the tropics and subtropics, University of Gottingen, and is currently director of research at the International Livestock Centre for Africa. He received his Dr. Agr. degree from the Technical University of Berlin in 1975. He has undertaken research in livestock production development in Southeast Asia and Africa. The major focus of his research has been small animals, with special attention given to the potential of unconventional animals. Early in 1985 he assumed his present position directing research at the International Livestock Centre for Africa. </P>
+<P ALIGN="JUSTIFY">JOHN A. PINO is a senior fellow of the National Research Council, Board on Agriculture, and is currently the project director of the study "Managing Global Genetic Resources: Agricultural Imperatives." He received his B.S. in agriculture in 1944-47 and Ph.D. in zoology in 1951 from Rutgers University. As an associate professor he taught and did research in the Department of Poultry Science at Rutgers until 1955 when he accepted a position with the Rockefeller Foundation as animal scientist with the Mexican Agricultural Program, becoming the associate director of that program in 1960. In 1965 he was transferred to the Rockefeller headquarters in New York and became director of the Agricultural Science Program in 1970. Most of his career has been in international agricultural development. He retired from the Foundation in 1983 and went to Washington to become agricultural science advisor at the InterAmerican Development Bank until July 1986 when he accepted his present position. Dr. Pino has been a member of the Board on Agriculture since 1983 and previously from 1973 to 1977. </P>
+<P ALIGN="JUSTIFY">HUGH POPENOE is professor of soils, agronomy, botany, and geography, and director of the Center for Tropical Agriculture and International Programs (Agriculture) at the University of Florida. He received his B.S. from the University of California at Davis in 1951 and his Ph.D. in soils from the University of Florida in 1960. His principal research interest has been in the area of tropical agriculture and land use. His early work on shifting cultivation is one of the major contributions to this system. He has traveled and worked in most of the countries in the tropical areas of Latin America, Asia, and Africa. His current interests include improving indigenous agricultural systems of small landholders, particularly with the integration of livestock and crops. He was chairman of the Advisory Committee on Technology Innovation and a member of the Board on Science and Technology for International Development (under whose aegis this report is presented). He chaired the BOSTID report panels on water buffalo and little-known Asian animals. Currently, he is on the International Advisory Committee of the National Science Foundation and serves as U.S. Board Member for the International Foundation of Science.</P>
+<P ALIGN="JUSTIFY">MICHAEL HILL ROBINSON, director of the Smithsonian Institution's National Zoological Park, is an animal behaviorist and a tropical biologist. Before his appointment to the National Zoo, Dr. Robinson served as deputy director of the Smithsonian Tropical Research Institute in Panama, which he joined in 1966 as a tropical biologist. He received his Ph.D. from Oxford University after being awarded his B.S., summa cum laude, from the University of Wales. His scientific interests include predator-prey interactions, evolution of adaptations, tropical biology, courtship and mating behavior, phenology of arthropods, and freshwater biology. In the course of his studies, Dr. Robinson has done research in the United States and throughout the developing world. Recent publications include articles on predator-prey interactions, tropical forest conservation, reproductive behavior in spiders, and the function and purpose of zoos in relation to education and conservation. Dr. Robinson's favorite animals are cats, of all kinds. </P>
+<P ALIGN="JUSTIFY">KNUT SCHMIDT-NIELSON, J.B. Duke Professor of Physiology in the Department of Zoology at Duke University, has studied animal responses to extreme environmental conditions. His major emphasis has been on life in hot deserts, and he is widely recognized for his studies of camels and other desert animals. His research has involved field studies in North and South America, Africa, Asia, and Australia. Dr. Schmidt-Nielson has written several books, which have been translated into more than a dozen languages, and he has published several hundred research papers. He has been elected to the National Academy of Sciences, the Royal Society, the French Academie des Sciences, and several other academies. </P>
+<P ALIGN="JUSTIFY">ALBERT E. SOLLOD, is associate professor and head of the international veterinary medicine section at Tufts University School of Veterinary Medicine. He is currently stationed in Niger as chief of party of the integrated livestock project and policy advisor in the Ministry of Animal Resources. He has consulted in 15 countries in Africa and Asia, and his research interests include interdisciplinary systems analysis, indigenous pastoral technologies, monitoring change in agricultural production systems, and monitoring and assessing drought impact.</P>
+<P ALIGN="JUSTIFY">LEE M. TALBOT received his Ph.D. in geography and ecology from the University of California at Berkeley in 1963 and has worked on environmental and natural resource ecology and management in over 110 countries. At present he is visiting fellow at the World Resources Institute, Washington, D.C., and senior environmental consultant to the World Bank. He carried out pioneering research in Africa and elsewhere on the use of wild animals for food production. He has written more than 180 scientific and technical publications, including ten books and monographs. </P>
+<P ALIGN="JUSTIFY">CLAIR E. TERRILL, animal scientist, collaborator, Agricultural Research Service, United States Department of Agriculture (USDA), Beltsville, Maryland, received his Ph.D. from the University of Missouri in 1936, served briefly at the Georgia Agricultural Experiment Station, and joined the USDA at the U.S. Sheep Experiment Station, Dubois, Idaho, in the same year. His research concerned genetics and reproduction of sheep, leading to national and international responsibility regarding research and production of sheep, goats, and other animals, with primary emphasis on increasing efficiency of production of meat, wool, and other products. </P>
+<P ALIGN="JUSTIFY">CHRISTIAN M. WEMMER is assistant director for conservation and captive breeding programs at the National Zoological Park and is also in charge of the zoo's 3,100 acre Conservation and Research Center in Front Royal, Virginia. He is vice chairman of the IUCN Deer Specialist Group and a member of the Mustelid and Viverrid Specialist Group of the same organization. His interest in evolutionary and conservation biology has been motivated by frequent travel to South Asia and his role as scientific coordinator of the Smithsonian Nepal Terai Ecology Project. For the past 12 years he has coordinated the development of facilities and programs at the Conservation and Research Center and with Dr. R. Rudran has promoted conservation training and wildlife research in developing nations. He has published over 50 papers on various aspects of mammalian biology and conservation and has co-edited with Benjamin Beck one book on PFre David's deer. His edited volume "The Biology and Management of the Cervidae" was published by the Smithsonian Institution Press. </P>
+<P ALIGN="JUSTIFY">DANNY C. WHARTON is associate curator, Animal Departments, at New York Zoological Park, Bronx, New York. He received a B.S. from the College of Idaho and an M.Sc. in 1975 from the School for International Training in Brattleboro, Vermont. His Ph.D. in biology was earned at Fordham University. Dr. Wharton was a Peace Corps volunteer to Ecuador 1969-71 and a Fulbright scholar to Germany 1976-77. His research interests have been in the genetic and demographic management of small populations. He works on several committees including the IUCN/SSC Captive Breeding Specialist Group, Species Survival Plan Committee of the American Association of Zoological Parks and Aquariums, and is species chairman for the North American Propagation Group for the Snow Leopard.</P>
+<P ALIGN="JUSTIFY">CHARLES A. WOODS IS curator of mammals at the Florida State Museum and a professor of zoology at the University of Florida. He received his B.S. in zoology from the University of Denver and his Ph.D. in zoology from the University of Massachusetts. He worked at the University of Vermont from 1970 to 1979 when he assumed his present position at the University of Florida. His principle research interests have been in the areas of mammalian ecology (Rodentia) and systematics and evolution and he is especially concerned with island biology. He has spent many years working in the West Indies on a variety of projects and has worked closely with the government of Haiti in establishing a plan for the National Parks of Haiti and in completing a biogeophysical inventory of the natural resources of Hispaniola. He is the ecological consultant for the Institut de Sauvegarde du Patrimoine National in Haiti. He is the author of a number of scientific articles on the fauna of the Antilles including a multivolume series on the fauna of the mountains of Haiti. </P>
+<P ALIGN="JUSTIFY">THOMAS M. YUILL is associate dean for research and graduate training of the School of Veterinary Medicine, assistant director of the Agricultural Experiment Station, and professor of pathobiology and of veterinary science at the University of Wisconsin-Madison. He received his B.S. in wildlife management from Utah State University in 1959 and his Ph.D. jointly in veterinary science and wildlife ecology in 1964 from the University of Wisconsin. His principal research interests are animal health and diseases of wildlife, including those transmissible to domestic animals and to man. He worked in Thailand for two years and has had active research programs in Colombia for 17 years, and Costa Rica for 5 years. He has recently become involved in animal health and production development in the Gambia, West Africa. Dr. Yuill is an executive committee member and immediate past president of the Organization for Tropical Studies and currently serves as president of the Wildlife Disease Association. He completed a five-year term as Chairman of the U.S. Virus Diseases Panel of the U.S.-Japan Cooperative Biomedical Sciences Program. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Board on Science and Technology for International Development (BOSTID)</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ALEXANDER SHAKOW, Director, Strategic Planning and Review,</P>
+<P ALIGN="JUSTIFY">The World Bank, Washington, D.C., Chairman</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PATRICIA BARNES-MCCONNELL, Director, Bean/Cowpea CRSP, East Lansing, Michigan</P>
+<P ALIGN="JUSTIFY">JORDAN J. BARUCH, President, Jordan Baruch Associates, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">PETER D. BELL, President, The Edna McConnell Clark Foundation, New York, New York</P>
+<P ALIGN="JUSTIFY">BARRY BLOOM, Professor, Department of Microbiology, Albert Einstein College of Medicine, The Bronx, New York</P>
+<P ALIGN="JUSTIFY">JANE BORTNTCK, Assistant Chief, Congressional Research Service, Library of Congress, Washington, D.C.</P>
+<P ALIGN="JUSTIFY">GEORGE T. CURLIN, The National Institute of Allergy and Infectious Diseases, The National Institutes of Health, Bethesda, Maryland</P>
+<P ALIGN="JUSTIFY">DTRK FRANKENBERG, Director, Marine Sciences Program, University of North Carolina, Chapel Hill, North Carolina</P>
+<P ALIGN="JUSTIFY">RALPH HARDY, Boyce-Thompson Institute for Plant Research, Cornell University, Ithaca, New York</P>
+<P ALIGN="JUSTIFY">FREDERICK HORNE, Dean, College of Sciences, Oregon State University, Corvallis, Oregon</P>
+<P ALIGN="JUSTIFY">ELLEN MESSER, Allan Shaw Feinstein World Hunger Program, Brown University, Providence, Rhode Island</P>
+<P ALIGN="JUSTIFY">CHARLEs C. MUSCOPLAT, Executive Vice President, Molecular Genetics, Inc., Minneapolis, Minnesota</P>
+<P ALIGN="JUSTIFY">JAMES QUINN, Amos Tuck School of Business, Dartmouth College, Hanover, New Hampshire </P>
+<P ALIGN="JUSTIFY">VERNON RUTTAN, Regents Professor, Department of Agriculture and Applied Economics, Saint Paul, Minnesota</P>
+<P ALIGN="JUSTIFY">ANTHONY SAN PIETRO, Professor of Plant Biochemistry, Department of Biology, Bloomington, Indiana</P>
+<P ALIGN="JUSTIFY">ERNEST SMERDON, College of Engineering and Mines, University of Arizona, Tucson, Arizona</P>
+<P ALIGN="JUSTIFY">GERARD P. DINEEN, Foreign Secretary, National Academy of Engineering, National Research Council, Washington, D.C., ex officio </P>
+<P ALIGN="JUSTIFY">JAMES B. WYNGAARDEN, Foreign Secretary, National Academy of Sciences, National Research Council, Washington, D.C., ex officio </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development Publications and Information Services (H A-476E)</P>
+<P ALIGN="JUSTIFY">Office of International Affairs</P>
+<P ALIGN="JUSTIFY">National Research Council</P>
+<P ALIGN="JUSTIFY">2101 Constitution Avenue, N.W.</P>
+<P ALIGN="JUSTIFY">Washington, D.C. 20418 U SA</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/b18ase/b18ase.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/b18ase/b18ase.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/b18ase/b18ase.htm	(revision 21083)
@@ -0,0 +1,2966 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Little Known Asian Animals With a Promising Economic Future</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Little Known Asian Animals With a Promising Economic Future</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Report of an Ad Hoc Panel of the Advisory Committee on Technology Innovation Board on Science and Technology for International Development Office of International Affairs National Research Council </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Acknowledgments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATIONAL ACADEMY PRESS</P>
+<P ALIGN="JUSTIFY">Washington, D.C. 1983</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOTICE: The project that is the subject of this report was approved by the Governing Board of the National Research Council, whose members are drawn from the Councils of the National Academy of Sciences, the National Academy of Engineering, and the Institute of Medicine. The members of the Committee responsible for the report were chosen for their special competences and with regard for appropiate balance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been reviewed by a group other than the authors according to procedures approved by a Report Review Committee consisting of members of the National Academy of Sciences, the National Academy of Engineering, and the Institute of Medicine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The National Research Council was established by the National Academy of Sciences in 1916 to associate the broad community of science and technology with the Academy's purposes of furthering knowledge and of advising the federal government. The Council operates in accordance with general policies determined by the Academy under the authority of its congressional charter of 1863, which establishes the Academy as a private, nonprofit, self-governing membership corporation. The Council has become the principal operating agency of both the National Academy of Sciences and the National Academy of Engineering in the conduct of their services to the government, the public, and the scientific and engineering communities. It is administered jointly by both Academies and the Institute of Medicine. The National Academy of Engineering and the Institute of Medicine were established in 1964 and 1970, respectively, under the charter of the National Academy of Sciences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Board on Science and Technology for International Development (BOSTID) of the Office of International Affairs addresses a range of issues arising from the ways in which science and technology in developing countries can stimulate and complement the complex processes of social and economic development. It oversees a broad program of bilateral workshops with scientific organizations in developing countries and conducts special studies. BOSTID's Advisory Committee on Technology Innovation publishes topical reviews of technical processes and biological resources of potential importance to developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been prepared by an ad hoc advisory panel of the Advisory Committee on Technology Innovation, Board on Science and Technology for International Development, Office of International Affairs, National Research Council. Program costs for the study were provided by the Office of Technical Resources, Bureau for Asia, Agency for International Development, under Grant No. ASB-0249-SS-00-1026-00 and the Office of the Science Advisor, Agency for International Development, under Grant No. DAN/ 5538-G-SS-1023-00.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Funding for this printing was provided by the Office of Agriculture, Bureau for Science and Technology, Agency for International Development, Washington, D.C., under Grant No. DAN 1406-G-SS-4001-00.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">First Printing, June 1983</P>
+<P ALIGN="JUSTIFY">Second Printing, July 1984</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Library of Congress Catalog Card Number 83-061909</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Participants in the Study</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, USA, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contributors </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AMBAR ROESYAT, Research Institute for Animal Husbandry, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1. B. ARKA, Faculty of Veterinary Science and Animal Husbandry, Udayana University, Bali, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. S. F. BARKER, Professor of Animal Sciences and Head of Department, The University of New England, Armidale, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">KURT BENIRSCHKE, Research Department, San Diego Zoological Garden, San Diego, California, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BEN BERESKIN, Research Geneticist, Nonruminant Animal Nutrition Laboratory, Animal Science Institute, United States Department of Agriculture, Beltsville, Maryland, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALEIGH A. BLOUCH, World Wildlife Fund, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. BONGERS, Nature Conservation Department, Wageningen Agricultural University, Wageningen, The Netherlands </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. BONNEMAIRE, Ecole Nationale Superieure des Sciences Agronomiques Appliquees, Dijon, France </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. A. BOSMA, Vakgroep Funktionele Morfologie, Rijksuniversiteit, Utrecht, The Netherlands </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. BUTCHER, Assistant Director, Western Plains Zoo, Dubbo, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G. S. CHILD, Wildlife and Parks Management Officer, Food and Agriculture Organization, Rome, Italy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. ROSS COCKRILL, International Animal Consultant, Almansil, Algarve, Portugal </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PAUL CONRY, Division of Aquatic and Wildlife Resources, Department of Agriculture, Guam </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HAROLD J. COOLIDGE, Former President, International Union for the Conservation of Nature, Beverly, Massachusetts, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. P. CROWCROFT, General Director, Metropolitan Zoo, Toronto, Canada </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TONY J. CUNHA, Dean Emeritus, California State Polytechnic University, Pomona, California, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. DEPPNER, Tropical Livestock Consultant, Washington, D.C., USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. DEVENDRA, Head, Feed Resources and Animal Nutrition Branch, Malaysian Agricultural Research and Development Institute, Selangor, Malaysia </P>
+<P ALIGN="JUSTIFY">J. M. DOLAN, San Diego Zoological Garden, San Diego, California, USA DUKUT SULARSASA, Department of Tropical Veterinary Science, James Cook University, Townsville, Queensland, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. EPSTEIN, Faculty of Agriculture, The Hebrew University of Jerusalem, Tel Aviv, Israel (retired) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">T. FINNIE, Taronga Zoo, Mosman, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. FISCHER, Director, Institute of Tropical Veterinary Medicine, JustusLiebig-Universitat, Giessen, Federal Republic of Germany </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IAN FLETCHER, Project for Animal Research and Development, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ANNIE P. GRAY, Commonwealth Bureau of Animal Breeding and Genetics, Edinburgh, Scotland (retired) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. B. GRIFFITHS, Director, Animal Production and Health Division, Food and Agriculture Organization, Rome, Italy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1. R. GRiMWOOD, Nairobi, Kenya </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">COLIN P. GROVES, Australian National University, Canberra, A.C.T., Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ULRICH HALDER, Swiss League for Nature Conservation, Basel, Switzerland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHARLES G. HICKMAN, Livestock Consultant, A. Mithat Efendi Sokak No. 36/11, Cankaya, Ankara, Turkey </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. HOFFMAN, Veterinarian, Project for Animal Research and Development, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. H. G. HOLMES, Department of Agriculture and Forestry, University of Melbourne, Victoria, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. HUITEMA, Veterinarian, Osterbeek, The Netherlands </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. H. HUTASOIT, Director-General, Livestock Services, Jakarta, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BENT JORGENSEN, Director, Copenhagen Zoo, Copenhagen, Denmark </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NAT KlEFFER, Department of Animal Science, Texas A&amp;M University, College Station, Texas, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. WAYNE KING, Director and Professor, Florida State Museum, University of Florida, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GRAHAM W. M. KIRBY, Principal Animal Production Officer, Department of Primary Production, Darwin, Northern Territory, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HEINZ-GEORG KLOS, Director, Zoologischer Garten, Berlin, West Germany </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">KUSMAT TANUDIMADJA, Professor of Veterinary Anatomy, Faculty of Veterinary Medicine, Institut Pertanian, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN K. LOOSLI, Department of Animal Science, University of Florida, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN A. LUKAS, White Oak Plantation, Yulee, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. A. MACDONALD, Vakgroep Funktionele Morfologie, Rijksuniversiteit, Utrecht, The Netherlands </P>
+<P ALIGN="JUSTIFY">JOHN MACKINNON, Representative, World Wildlife Fund, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT E. McDOWELL, Professor, Department of Animal Science, Cornell University, Ithaca, New York, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JEFFREY A. McNEELY, Executive Officer, Commission on National Parks and Protected Areas, International Union for Conservation of Nature and Natural Resources, Gland, Switzerland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ADRIAN G. MARSHALL, Honorary Secretary, Institute of South-east Asian Biology, Department of Zoology, University of Aberdeen, Scotland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">[AN L. MASON, Animal Breeding Consultant, Edinburgh, Scotland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEERT MONTSMA, Vakgroepen Veefokkerij, Veehouderij, Tropische Veehouderij, Wageningen, The Netherlands </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. B. MORAN, Senior Research Officer, Animal and Irrigated Pastures Research Institute, Kyabram, Victoria, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT H. MILLER, Chief, Milk Secretion and Mastitis Laboratory, Beltsville, Maryland, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JAN NARI, Director, Central Research Institute for Animal Science, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARVEY NEESE, President, Agri-Food Systems International, Inc., Troy, Idaho, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. M. NITIS, Department of Animal Nutrition and Tropical Pasture Production, Udayana University, Denpasar, Bali, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM L. R. OLIVER, Chairman, lUCN/SSC Pigs and Peccaries Specialist Group, Jersey, Channel Islands, United Kingdom </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN PAYNE, Wildlife Section, Forest Department, Sandakan, Sabah, Malaysia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W.J.A. PAYNE, Tropical Animal Breeding Consultant, London, England </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH W. PHILLIPS, Arlington, Virginia, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Scientific Advisor, Consultative Group on International Agricultural Research, Washington, D.C., USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DAVID W. ROBINSON, Associate Dean, International Programs, University of California, Davis, California, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PATRICK J. ROBINSON, Department of Agricultural and Forest Sciences, University of Oxford, Oxford, England </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. H. L. ROLLINSON, Animal Production Officer, Animal Production and Health Division, Food and Agriculture Organization of the United Nations, Rome, Italy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CLIVE ROOTS, Director, Assiniboine Park Zoo, Winnipeg, Manitoba, Canada </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. A. SAYER, Nature Conservation and National Parks Project, FAO, Rangoon, Burma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. E. SATTER, Nature Conservation and National Parks Project, FAO, Rangoon, Burma </P>
+<P ALIGN="JUSTIFY">GEORCE B. SCHALLER, New York Zoological Society, New York, New York, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN SCHOTTLER, Principal Animal Production Officer, Department of Primary Industry, Lae, Papua New Guinea </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE SEIFERT, CSIRO, Rockhampton, Queensland, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROGER V. SHORT, Professor of Reproductive Biology, Monash University, Melbourne, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. C. SINHA, Outdoor Recreation and Wildlife Research Division, Forest Research Institute, College, Laguna, Philippines </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK J. SIMOONS, Professor, Department of Geography, University of California, Davis, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. D. SIMPSON, Senior Extension Specialist, Department of Agricultural, Technical and Extension Services, Bulawayo, Zimbabwe </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P. SITORUS, Research Institute for Animal Production, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. J. SMITH, Royal School of Veterinary Studies, University of Edinburgh, Edinburgh, Scotland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. J. STOLP-DIEPEVEEN, Department of Tropical Animal Production, Agricultural University, Wageningen, The Netherlands </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SUBANDRlYO, Research Institute for Animal Production, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. SUMADI, Faculty of Animal Husbandry, Gadjah Mada University, Yogyakarta, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">L. M. TALBOT, World Wildlife Fund International, Gland, Switzerland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WARREN D. THOMAS, Director, Los Angeles Zoo, Los Angeles, California, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. L. THROP, Director, Taronga Zoo, Mosman, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ALLEN D. TILLMAN, Private Consultant in Animal Production, Stillwater, Oklahoma, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD G. TULLOCH, Division of Wildlife Research, CSIRO, Winnellie, Northern Territory, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HELEN NEWTON TURNER, Genetics Research Laboratories, CSIRO, North Ryde, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B. VAN PUIJENBROECK, Curator of Mammals, Royal Zoological Society of Antwerp, Antwerp, Belgium </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">E. J. WARWICK, Visiting Professor, Faculty of Animal Husbandry, Gadjah Mada University, Yogyakarta, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WARTOMO HARDJOSUBROTO, Lecturer in Animal Husbandry, Faculty of Animal Husbandry, Gadjah Mada University, Yogyakarta, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. H. WHARTON, Chief Research Scientist, CSIRO, Long Pocket Laboratories, Brisbane, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. L. WHEELER, Project Manager, Project for Animal Research and Development, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY">M.H. WOODFORD, Wildlife Veterinarian, Food and Agriculture Organization, Rome, Italy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B.A.YOUNG, Department of Animal Science, the University of Alberta, Edmonton, Canada </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M.ZULBARDI, Research Institute for Animal Production, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, Professional Associate, Board on Science and Technology for International Development, Asian Animals Study Director </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Research Council Staff</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. R. RUSKIN, BOSTID Editor </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MARY JANE ENGQUIST, Staff Associate </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CONSTANCE RECKS, Administrative Secretary </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">It is high time that the world was made aware of the valuable, large ruminant genetic resources of Southeast Asia.</P>
+<P ALIGN="JUSTIFY">J. B. MORAN Livestock Specialist Animal and Irrigated Pastures Research Institute Kyabram, Victoria, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Without utilization preservation is doomed to failure. Local breeds able to perform well in difficult habitats, such as in sparse vegetation, mountainous terrain, or the tropics, should be used for their agricultural potential. Breeds that demonstrate hybrid vigor on crossing with improved or exotic breeds also merit utilization. Genetically unique breeds should be retained for scientific studies of genetics, evolution, and biochemistry. And aesthetically attractive and historically important breeds should be maintained in parks and preserves for their educational and cultural values.</P>
+<P ALIGN="JUSTIFY">I. L. MASON Animal Breeding Consultant Edinburgh. Scotland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p00.png"></center><br>
+ YAK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report began as a brief examination of the domesticated banteng, a little studied bovine that is an important livestock resource in eastern Indonesia. But the study expanded to include other possibly useful but obscure bovines of Asia: the madura (a hybrid between banteng and cattle), gaur, mithan, kouprey, anoa, tamaraw, yak, and yakowshybrids formed by crossing yaks with cattle. Four pig species were also included (the bearded pig, the Sulawesi warty pig, the Javan warty pig, and the pygmy hog) that are important traditional resources in parts of Asia, as well as the babirusaa piglike, wild animal of Sulawesi that may have a rudimentary rumen. (Asia also has some interesting, little-known breeds of cattle, water buffalo, sheep, goats, and the common pig, but in this report we have chosen to highlight unconventional species only.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">These animals are unfamiliar to international animal science. This report aims to kindle awareness of their possible promise and to stimulate their introduction into projects in the world's animal research facilities. Only through active investigation will the potential of these species - most of which are now familiar only to a small number of wildlife specialists - become clear. Many are threatened with extinction; their genetic merits should be assessed before it is too late.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Development agencies and governments in the tropics should regard local species, such as those described in this report, as important genetic material for bolstering the long-term success of domestic livestock breeding programs. These indigenous resources can probably be improved genetically to compare favorably with imported livestock, particularly in difficult tropical environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report was prepared after Hugh Popenoe, Chairman of the Advisory Committee on Technology Innovation (ACTI), and Noel Vietmeyer of the ACT! staff visited banteng researchers in Indonesia, northern Australia, and Papua New Guinea in May 1981. More than 90 researchers (see contributor's list) provided information to the report through correspondence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACTI is a committee of the Board on Science and Technology for International Development, National Research Council. It assesses unconventional resources and technologies that might prove especially applicable to problems of developing countries. Current titles in the ACTI series Managing Tropical Animal Resources are: </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Water Buffalo: New Prospects for an Underutilized Animal (1981)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Little-Known Asian Animals with a Promising Economic Future (1983) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Crocodiles as a Resource for the Tropics (1983) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Butterfly Farming in Papua New Guinea (1983). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The production of these books has been supported largely by the U.S. Agency for International Development (AID). Program costs for this study were sponsored by AID'S Bureau for Asia, and staff costs by AID'S Office of the Science Advisor, which also made possible the free distribution of this report.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is an exploratory volume. It will, perhaps, lead in a few years' time to a more complete book on indigenous Asian animals - and perhaps also to similar books on little-known animals of Africa and Latin America. If you have material to contribute to the future edition, please send it to Noel Vietmeyer, JH213, National Academy of Sciences, 2101 Constitution Avenue, Washington, D.C. 20418, USA, who will contact you when any new publication on this subject is planned.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Introduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asia has several domesticated animals about which little is known. Among them are the banteng ("Bali cattle") of Indonesia, the yak of Central Asia's high country, and the mithan of the border region of India, Burma, and Bangladesh.( *The promise of another Asian animal, the water buffalo, is described in companion report no 32. ) Some Asian farmers use domesticated bovine hybrids: the madura (banteng-cattle hybrid) in Indonesia and the yakow (yak-cattle hybrid) in Central Asia. In addition, domesticated forms of at least two Asian pig species (the Indonesian wild boar and the Sulawesi warty pig) are important husbandry animals in parts of Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among Asia's undomesticated animals are five interesting and potentially valuable species of wild bovines: the kouprey in Thailand, Laos, and Kampuchea; the gaur in India and much of Southeast Asia; two species of anoas in Indonesia; and the tamaraw in the Philippines. There are also three species of undomesticated Asian pigs: the bearded pig, the Javan warty pig and pigmy hog. Perhaps the strangest Asian animal of all is the babirusa, a piglike species of eastern Indonesia that may be a rudimentary ruminant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of these animals are either threatened or endangered species, and some will soon be extinct unless scientists, governments, and resource managers take forceful action to preserve them. Scientific management and a better understanding of the animals themselves is required.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An important need is to investigate their potential as livestock resources. All seem to be disease resistant and well adapted to difficult natural conditions. Some will interbreed with conventional livestock and might thereby pass on important characters to hybrid progeny. A few of the wild species are ancestors of domestic livestock and could be important genetic reservoirs for maintaining or improving the quality of their domestic descendants. Others may make useful new domesticates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appreciation of their potential in the long-term for the world's agricultural development could create a momentum for the protection, preservation, and greater use of these little-known animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Imported Livestock</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the past, many thought that the best way to raise animal productivity in tropical developing countries was to introduce high-performing breeds from temperate industrialized areas. The fact that the exotic animals were much more productive than local stock made this seem very appealing. But many such importations ended in failure when the animals either quickly died or their growth or reproduction rates declined so drastically that the herds dwindled away or became uneconomic. These introductions had been made without adequate consideration of the local environment that was expected to support the imported animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More recently, some animal scientists have decried the idea of wholesale importing of temperate-zone livestock into tropical countries without also evaluating the indigenous livestock. In many cases the local animals' apparent poor performance results not from their lack of genetic potential, but from inadequate feeding, breeding, selection, management, and health care.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indigenous Animals</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Until an objective evaluation of particular indigenous breeds is undertaken, governments should regard local animals as vitally important for the long-term development of their domestic livestock industries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To achieve an agriculture that is compatible with nature, we should try to raise an animal as much as possible within its own natural environment. Indigenous species are necessarily well adapted to their surroundings and have survival qualities that imported livestock often lack. They generally select food, either graze or browse, better than foreign species and can therefore exploit the habitat more efficiently and live within it more harmoniously.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But most of the livestock species the world depends on today are best adapted to temperate conditions. This is because Stone Age peoples in what today are Europe, the Middle East, and eastern China domesticated the prototypes of agricultural animals that were available in those places. The world's best-known breeds of cattle, wool sheep, and horses, for example, usually perform well in temperate regions and poorly in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The species described in this report offer promise as new and important alternative livestock resources for tropical regions. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Embryo Transplants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It seems likely that modern technology will substantially improve our ability to use new species and breeds of livestock. One of the most encouraging of the new biotechnology techniques is embryo transplantation. In this process multiple eggs (produced by hormonally stimulating female animals) are fertilized and transplanted to other female animals. The hormonal cycles of the donor and receiving animals are synchronized so that a pregnancy results.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This technique is widely used to transfer embryos between cattle, but researchers are now exploring transfers between different species and even between different genera. In 1981, for example, animal scientists at the New York Zoological Garden transplanted a fertilized gaur ovum into a Holstein cow, which carried the gaur calf to term. Now veterinarians at the University of Florida are attempting to transplant water buffalo embryos into both zebu and Holstein-Friesian cattle, and vice versa. If such pioneering work can become everyday practice, it will open possibilities of using common livestock to raise rare animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, because embryos are thought to be free of many diseases, their shipment between nations may soon be permitted without elaborate quarantine precautions. Methods for freezing embryos have been worked out so that the tiny bundles of cells can be air freighted inexpensively in small, insulated containers. This may make animals such as those discussed in this report available to Africans, Latin Americans, North Americans, and Europeans. It may vastly simplify the worldwide exchange of animal genetic material and become the animal counterpart of exchanging seeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An additional benefit of embryo transplants is that the surrogate mother's placental blood supply provides the fetus with natural immunity to some local diseases, thus perhaps reducing one of the most serious causes of failure when exotic animals are introduced to new environments. And at Utah State University it has been noted that raising wildsheep embryos in domestic ewes produces lambs that are more docile than if they were raised by their biological mothers. Embryo transplants may be a small step toward domesticating new animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With these possibilities on the horizon, it becomes even more important that all countries preserve their indigenous animals. The rest of this report suggests and discusses Asian species for protection and study. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part I : Domesticated Bovine Species</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It seems probable that two of our widely used livestock species were domesticated in the Asian tropics: the zebu or humped cattle in India and the water buffalo in the humid marshlands of northeastern India or Southeast Asia. (Both the chicken and some races of pig may also have a tropical Asian origin, but the exact sites of their earliest domestication is unclear.) There are, however, other, much more localized, domesticated bovines in Asia. These are not well studied and deserve greatly increased recognition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This section highlights:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Domesticated banteng</P>
+<P ALIGN="JUSTIFY">· Banteng-cattle hybrids</P>
+<P ALIGN="JUSTIFY">· Mithan</P>
+<P ALIGN="JUSTIFY">· Yak</P>
+<P ALIGN="JUSTIFY">· Yakows. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is time for the world's scientific community to study the genetics, evolution, and biochemical parameters of the unique animal resources, that are found in Southeast Asia. ALLEN D. TILLMAN Animal Consultant Stillwater, Oklahoma, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Though well adapted for survival in their own harsh tropical environments, many domestic livestock breeds are being neglected in the race to achieve temperate zone levels of productivity. CHARLES HICKMAN Department of Dairy Cattle Breeding Ottawa, Canada </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Studies should be made of the present and potential role, productivity and efficiency of all domestic animals and birds, large and small, before they are replaced by imported types. Many wild species also could make important contributions to human welfare with proper management. J. K. LOOSLI Department of Animal Science University of Florida .</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The conservation of endangered genetic resources represents a genuine and welcome synthesis of the concerns of the agriculturalist and the wildlife enthusiast.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN TINKER British Journalist</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p06.png"></center><br>
+ MITHAN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">1 Domesticated Banteng</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The banteng (*Bos javanicus is now the accepted name, but Bos sondaicus, Bibos banteng, and other synonyms have been used in the past. (See Hooijer, 1956.) The name "banteng" has traditionally referred to the wild form of Bos javanicus; the name "Bali cattle" to the domesticated form. This chapter describes the domesticated form, but we retain the name banteng to reinforce the fact that the animal is not a breed of cattle, but a distinct species. Despite a cattle-like appearance, the animals are at least as genetically remote from cattle as is the bison. Both produce sterile males when hybridized with European cattle. Australia. (N.D. Vietmeyer)) is a bovine that resembles a small cow. It is, however, an entirely different species from either European cattle (Bos taurus) or zebus (Bos indicus). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These docile animals thrive under hot, humid conditions and, like the water buffalo, have high resistance to ticks and tick-borne diseases. In parts of Southeast Asia they have proved acceptable for draft power and meat production, and they may have potential for many other regions of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng are remarkably uniform in type and have changed little from their wild ancestors (see chapter 6). Bulls stand from 1.3 to 1.5 m high at the shoulders, while cows are about 1.2 m high. They have the general conformation of beef cattle. The skin is tight, the neck short, and the dewlap inconspicuous. The face is narrow and is carried horizontally with the large ears pointing forward. There is no hump, but the male possesses a distinctive crest over the thorax because the spines of the thoracic vertebrae are unusually elongated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On both sexes a striking white oval patch covers the rump and all four legs have white stockings. Calves and females are usually light brown with a thin black line along the middle of the back. Bulls are brown when young but usually turn near-black at maturity, unless castrated. Thus, in a herd the sexes - black males and brown females - are strikingly apparent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Male horns grow sideways, upward, and outward from a horny mass on the forehead. Females lack this horny shield and their horns usually grow upward and back, eventually curving down again toward the head. Polled animals have not been reported.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mature banteng bulls can weigh from 450 to 500 kg. Under exceptional conditions they may reach 550 kg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nearly all the world's domesticated banteng are found in Indonesia. They are particularly important on the islands of Bali, Kalimantan, Lombok, Sulawesi, Sumbawa, and Timor. On Bali and Sumbawa, they are virtually uncontaminated by crossbreeding with other cattle and are thought to have been domesticated there in prehistoric times. Since 1913 government officials have enforced a law that prohibits crossbreeding so as to maintain the purity of the breed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small numbers of banteng have been introduced to Sumatra, Malaysia, and northern Australia, and there are experimental herds in Texas, USA, and New South Wales, Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p09.png"></center><br>
+ DISTRIBUTION OF DOMESTICATED BANTEG</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated banteng account for about 20 percent of Indonesia's total population of "cattle." The banteng population increased from 1.1 million in 1967 to 1.4 million in 1975 and is now estimated to be more than 1.5 million.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng are found mainly in lowland areas on Indonesian islands straddling the equator. The environment is monsoonal with mean annual temperatures ranging from 23° to 31°C. Most of the region receives heavy rainfall throughout the year, but dry spells as long as five months occur at some locations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng normally have high conception rates. In northern Australia they regularly achieve 80-90 percent conception, as compared with the 50-60 percent of Brahman-Shorthorn crossbred cattle. Similar conception rates have been recorded in Sulawesi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little basic information on the banteng's reproductive physiology has been reported. However, it appears that this differs little from that of cattle. Sexual maturity has been observed as early as 13 months and mating at 16 months.* The gestation period is about one week longer than that of cattle and twinning is not common. At birth, males weigh about 16-17 kg and females about 14-15 kg (about half the size of Brahman-Shorthorn calves). Calves are not weaned at any specific time, and dams may continue suckling a calf until the next birth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng will crossbreed with domestic cattle, producing hybrids with notable vigor and heat tolerance (see chapter 2).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It has been reported that banteng have the ability to drink water with high salinity," and in northern Australia they have even been seen grazing seaweed on coral reefs at low tide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On high-quality diets, feed-conversion ratios approach those of other bovine species. For example, banteng bulls on high-concentrate diets have shown daily growth rates of 0.7 kg, compared with 0.7 kg in water buffalo, 0.8 kg in zebu cattle, and 0.9 kg in British cattle bulls.:"</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As the banteng matures, its weight remains lower than that of cattle of similar age. However, relative to mature liveweight, this disadvantage is only about 8 percent.§</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behaviour</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng cannot be handled as roughly as domestic cattle. Cows and calves are timid and easily upset. When stressed they may run into fences and walls, incurring head and spinal injuries. They also easily get into a state of shock. Special squeeze chutes and other special facilities, along with much care in handling the animals, are essential. However, despite their lively temperament banteng are docile if reared, as in Indonesia, with frequent human contact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These animals are promising beef producers. Gourmets consider banteng cuts among the finest of meats, and Indonesia cannot export enough to satisfy the demand in Hong Kong and Japan alone. The meat's outstanding characteristics are its tenderness and leanness. When the animals are maintained and finished under traditional village management, total fat content of the meat (both on a liveweight and carcass basis) is usually less than 4 percent. Little of the fat is deposited among the meat fibers (marbling); about two-thirds of it is mesenteric and the remainder is subcutaneous, laid down in small globules. The carcasses have a high dressing-out percentage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng have proved to be useful as draft animals for the farm but are reportedly less suitable than zebus for hauling carts on roads. Traditionally, both male and female animals are worked, but Balinese farmers normally use females for cultivating light soils only. Banteng are trained when they are about 2 years old and are reportedly easier to train than zebus.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like water buffaloes banteng can utilize low-quality feeds; they are similar in that they can live off forage unpalatable to cattle. It is rare to see banteng in poor condition. Animals of all ages appear to have an ability to maintain weight and body condition even when pasture quality is poor. In this respect, they have been noted to outperform cattle in Australia's Northern Territory. Moreover, due to their lower milk production banteng cows lose less weight and condition during lactation than, for example, Brahman-Shorthorn cows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In comparison with cattle (European breeds) kept under similar circumstances in Australia, banteng are less infested with external parasites. Their hair is short and their hide tough, which helps them resist ticks. Under field conditions few adult cattle ticks (Boophilus microplus) are observed on the animals, except on malnourished individuals, and the incidence of tick-borne disease is said to be very low. Sarcoptic mange is known to affect the animals, but it has a low incidence as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng also appear to tolerate several internal parasites. Liver fluke is probably the most prevalent. Although the animals themselves appear healthy at slaughter, some 80 percent or more of carcasses are found to have partially infected livers. In addition, intestinal worms are often present.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are only slightly affected by Asian trypanosomiasis (Trypanosoma evansi). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are poor milkers; their udders are almost invisible. The lactation varies from 6 to 10 months and milk production is only 0.9-2.8 kg per day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To keep from reverting to the wild state, banteng may need close contact with humans or regular handling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An unidentified banteng disease first appeared on Bali in 1964. Known locally as "jembrana," it spread rapidly, causing mortalities from 10 to 60 percent in certain localities. It was originally thought to be rinderpest; it is now believed to be caused by a rickettsia transmitted by cattle ticks. Outbreaks have occurred with decreasing intensity and virulence since the original outbreak. The disease is under intensive investigation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Bali ziekte," a disease affecting only banteng, has also been noted. It is characterized by dry eczema, followed by severe necrosis of the skin and exposed mucous membrances.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of their high susceptibility to bovine malignant catarrhal fever, banteng must not be brought in contact with sheep and some other animals. This virus is widely disseminated in sheep and several domestic and wild hoofed mammals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There have been few scientific studies of banteng and no coordinated attempt to improve their performance. They deserve more recognition and they merit testing in tropical locations outside their traditional home in Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The herds in northern Australia (descendants of animals remaining from an abortive colonization attempt in the 1820s) are in a relatively disease-free zone, and although they are feral, they can potentially provide animals for breeding and use in other nations. Although these few hundred banteng are a valuable resource, they are vulnerable to destruction if adverse environmental conditions arise or exotic diseases break out in Australia. Representatives of the herd should therefore be distributed and viable breeding stock established at several new locations. (Their genes and gene combinations may even prove valuable for the indigenous herds in Indonesia, and banteng research and development would make a valuable topic for cooperative research between Australia and Indonesia.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is particularly needed to identify the reasons for the banteng's apparent ability to maintain weight and body condition on poor-quality grazing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The problems of bovine malignant catarrhal fever, Bali ziekte, and jembrana need increased attention, particularly directed toward prevention and control. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p13.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">2 Banteng Cattle Hybrids</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng and cattle have the same number of chromosomes, and they will interbreed. Few scientific details on the hybrid progeny are available, but on the Indonesian island of Madura they are a "stabilized crossbreed" because they seem to be genetically uniform. This hybridization took place some 1,500 years ago, when Indian invaders brought zebus of the Sinhala, or Ceylonese, type to Madura and crossed them with the banteng.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These maduras reportedly show better growth rate than the pure banteng species itself. They are thrifty, hardy, and able to perform well under extremes of heat and poor nutrition. Though a hybrid in origin, both sexes of the madura are fully fertile. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For more than 15 centuries the winners of the bull races ("kerapan sap)") have been the herd sires of Madurese villages. This long breeding history has led to an animal with the following characteristics:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Long legs and small feet</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Elongated muscles of the rear legs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Heavy muscling over the back, loin, and shoulder</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Quick reactions and nervous temperament</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Great heat tolerance</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The ability to perform well as a work animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng-cattle hybrids vary in appearance, depending on whether European or zebu cattle are used in the cross as well as on the amount of backcrossing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maduras (banteng x zebu) are graceful animals. Their bodies are neat, compact, and deep, with well developed forequarters. The cows attain an average weight of about 210 kg and bulls range from 350 to 375 kg at maturity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Superficially, maduras are like Jersey cattle, except for having a much smaller udder. In most of them the banteng dominates the body structure and coat color. Bulls have a well-developed hump; females have almost none. There is no distinct dewlap. Horns are medium sized and curve upwards and slightly backwards. Ears are medium length and horizontal. Breeders on Madura accept only red-brown animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, crossbreeds of banteng and zebu are distributed throughout Indonesia. On the other hand, hybrids between banteng and European cattle have been made only in small programs in the United States and Australia. For example, researchers in central Texas are producing a cross that is one-eighth banteng/seven-eighths Charolais. They believe this will result in a beef animal able to grow well in warm, humid conditions. In the Northern Territory of Australia, no problems have been encountered in mating banteng bulls to Brahman-Shorthorn cows. Calves that are one-fourth banteng/three-fourths Brahman-Shorthorn have since been produced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Virtually all of the 575,000 "cattle" on the Indonesian island of Madura are hybrid animals resulting from crossing indigenous domesticated banteng with zebus. More than 200 head of banteng/Charolais hybrids are found near Easterly, Texas, and a score or so banteng/ Brahman-Shorthorn hybrids are on a research station near Darwin, Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The environment in Madura, where most of these hybrids occur, is monsoonal, with mean average temperatures as high as 31°C in the hot season, and dry spells as long as 5 months. It seems likely that judicious selection of the cattle breed could result in hybrids suitable for many other environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, the animals on Madura are bred to be raced. They are probably the fastest running bovines. From a standing start, a yoked pair pulling a sled can reach 50 kph by the end of the 130-meter course. An unencumbered individual can approach the speed of a horse (about 68 kph).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When compared with other bovine genotypes in Indonesia, the performance of these hybrids is more closely related to the banteng than the zebu ancestry."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the cross between banteng and European cattle all F1 bulls are sterile; their sperm development ceases at the secondary spermatocyte stage. Infertility also exists in most one-fourth banteng (although some sperm are present) and in all three-fourths banteng bulls. The fertility of the F1 cows, on the other hand, is high - 90 percent as compared with 70 percent for Brahman-Shorthorn cows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The hybrids have a lively temperament. However, when they are reared with other domestic cattle or handled on a regular basis, they are almost as docile as cattle. For instance, they remain calm even in Madura's extremely crowded towns. Nevertheless, personal contact probably must be maintained to keep them accustomed to human management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The cows are very protective of their calves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several reports from the livestock service of the former Dutch colonial government, as well as several books on the East Indies, state that meat from the madura is the tenderest of any known breed. In addition, the hides are pliable and superior to those of cattle and are used in the highest quality leather goods. They command a price about 20 percent higher than zebu hides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The breed is reportedly one of the best draft animals for its size in the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maduras have several desirable traits, including those outlined below:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Feed efficiency. With grain rations, yearling bulls can gain 1 kg on less than 7 kg of ration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Thriftiness. The breed can maintain its body condition on low quality forages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Heat tolerance. The madura has a high rate of cutaneous evaporation and is therefore well adapted to the tropical monsoonal climate. Teams of madura can plow or cultivate land for more than 6 hours, even at high temperatures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Carcass quality. The madura fattens readily on a high-quality diet and  produces carcasses with high dressing percentages, a large rib-eye area, and  high yields of lean meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· External fat thickness. A well-finished madura normally has only a slight  covering of fat over ribs and lower round. Maximum thickness (over the top  round) is less than 1.5 cm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Intelligence. These animals are responsive and easily trained. The famous  dancing cattle of Madura, for instance, are actually these banteng-cattle  hybrids.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Parasite resistance. Despite often high levels of fluke infections, the  animals continue to work, reproduce, and maintain body condition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maduras have been bred for one thing - speed. Some of their genetic  limitations are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Low birth weight. The calves begin small, weighing 12-14 kg at birth, and  they continue to be slow weight gainers. [Feeding trials with yearling bulls  have shown daily gains of over 600 g for 180 days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Poor lactation. Milk production is normally less than 1.5 lifers per day and lactation ends after about 4 months. The cows often fail to produce milk. Much of this is probably caused by poor nutrition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the important features of the madura is that its genetic variation has been largely removed during 1,500 years of continuous breeding; with study much valuable information could be obtained that is beneficial to all bovine breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following topics need further study:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Fertility levels</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Crossbreeding to test the effect of using a wider range of cattle breeds*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Assessment of the hybrid's advantages over the pure banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Performance under a wide range of environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">3 Mithan</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mithan (Bos frontalis) is believed to be a domesticated form of gaur (see chapter 6).t (However, it resembles the banteng and some authors have proposed that it is a gaur-cattle cross, others a gaur-banteng cross.) The mithan is a domestic animal indigenous to parts of India, Burma, and Bangladesh. Because of large size and the high butterfat content of its milk it is widely used to crossbreed with cattle in Bhutan. It deserves greater recognition both in Asia and elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mithan is a handsome animal. Bulls may occasionally exceed 1.7 m at the shoulder and weigh 1,000 kg, but the average bull is about 1.5 m tall and weighs 540 kg. Cows are shorter and weigh less.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal has a dorsal ridge on the crest of the shoulders, a small but pronounced dewlap, and a generally flat forehead. Mithan horns are often of unusual girth; they are straight or gently curving, and many have an enormous base that practically covers the top of the skull.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most calves and females are brown, but adult males are generally black with white stockings on all four legs. Some, however, are light brown, white, or piebald.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the hill ranges of Assam, where gaur are still plentiful and interbreeding between mithan and gaur frequently occurs, the mithans are massive and gaurlike. But in the Chin Hills, where gaur are scarce, the mithans have lost their bulky proportions, probably by interbreeding with cattle. With them, the high dorsal ridge on the shoulder (which lends so much to the imposing stature of the gaur) has disappeared, the horns are cowlike, and the varied coloring of the domestic cow begins to appear.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mithan are kept in a domesticated condition by the hill tribes of northeastern India (Mishmis, Mizo, Nagas), the Chittagong Hill tracts, and some Burmese hill ranges (Arakan and Chin Hills). It is the main domestic animal of the Nagas of Nagaland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In India feral herds totalling some 50,000 head roam the jungles of Arunachal Pradesh. Recently the Royal Government of Bhutan has established two herds by purchasing animals from Arunachal Pradesh. Bhutanese farmers have some 60,000 head of animals that are hybrids of mithan and the local breed of cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government of Bhutan is breeding mithans on government farms and distributing males to private breeders to improve the genetic base.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mithan is a grazing animal, but in some areas herds are allowed to browse freely in the woods; some return to the villages for protection at night, while others remain largely in the forests. The villagers keep the forest mithans nearby by providing salt, for which the animals have an insatiable craving.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Feral mithan live in the same habitat as gaurs and are said to move equally skillfully in mountainous terrain. Usually they are found at elevations from 600 to 3,000 m. However, in the Chittagong Hill tracts and the Mishmi country they descend to 300 m and lower, while in Bhutan they have been reported grazing in summer at altitudes as high as 3,300 m, for example around Thimphu.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p23.png"></center><br>
+ Mithan distribution. (after Simoons and Simoons, 1968)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mithans are fully fertile amongst themselves. Also, they interbreed freely with the gaur, banteng, yak, and cattle of both the taurus and zebu types. Naga owners encourage the interbreeding with gaur, regarding it as an improvement of the race. (They arrange this by placing salt licks in the forest. After gaur bulls have formed a habit of coming to the licks, mithan cows are left there and in due course mating takes place.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The crosses between mithan and zebu are also encouraged in certain districts. Unlike most crosses between bovine species, those between mithan and cattle result in fertile male and female offspring (although some owners indicate that the F1 male is not a reliable breeder).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is an unusually gentle animal with a quiet disposition, as revealed in the Chin tribe's expression "gentle as a mithan." Normally even a stranger is safe to approach one; if he gives it a bit of salt, it will usually follow him about. Thus, mithans are easily managed in a regular cattlerearing operation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many mithans are not domesticated in the strict sense. Their herds live in a semi-tame state near jungle villages and come to settlements only in the evening to lick salt.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some regions of northern India, mithans are used for field work and as draft animals. They are also important as a meat supply. The Bhutanese government is establishing a national dairy-mithan breeding program, which could result in a valuable dairy animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To many tribes of northeast India and Burma, mithans serve mainly as sacrificial animals. The Nagas use them as a kind of "currency" to pay for goods, to buy brides, and to pay penalties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hybrids resulting from backcrossing mithan with common cattle are also used as work animals. For at least a century, Bhutanese livestock breeders, particularly those in the eastern section, have mated mithan bulls to siri cows (Bos taurus) from India. This produces very profitable hybrid offspring that have high milk production. The milk is rich in total solids and produces exceptional yields of cheese and butter.* The male of the cross (called "jatsha") is a powerful draft animal, and the female ("jatshum") is a prized milk cow. To this day, extensive crossing continues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mithan is potentially an animal that can be used in difficult terrain where most domestic cattle breeds do not perform well. Mithans are superior when it comes to feeding on steep slopes and cliffs and for grazing native grass and the leaves of local fodder trees. They are also adapted to tropical and subtropical environments. And they are able to maintain themselves in small herds (6-10 head) in dense jungle.*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mithan could prove valuable in other parts of the world, and it could be important particularly for the genetic improvement of cattle in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If they are disturbed, mature mithans can be temperamental. They can be difficult to hold with normal fences or chutes, because of their size. When given injections or otherwise subjected to pain, they are liable to bolt to the jungle and not return.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The productivity of these animals needs to be better characterized and defined. Attention should be given to their grazing efficiency as compared with that of cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The two farms the Bhutan government has established for breeding mithans provide an opportunity to gather genetic information on the species and to have experimental matings take place to establish the most suitable animal for various conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The genetic relationship of mithan to gayal, gaur, and cattle needs to be clarified. Although it is believed that the mithan and gayal are the same animal, one of this report's reviewers points out that the mithan of Bhutan are strikingly different in color, body shape, and horn structure from gayals seen in zoos in Europe and India. Although the mithan is now considered a domesticated gaur, many in the past have claimed it as a gaur-cattle hybrid. Physiological research could remove lingering doubts. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p26.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">4 Yak</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The yak (Bos grunniens), is a grazing animal that is accustomed to traveling great distances in a harsh environment. Nothing is known about when it was first domesticated, but there has probably been a close association between man and yaks ever since the first humans migrated into the high mountains of Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated yaks are about the size of ordinary cattle and rarely exceed heights of 1.3 m at the shoulder. Their liveweight is generally 250-550 kg for the males and 180-350 kg for the females. They differ little from wild yaks except that they are smaller, have shorter and thinner horns, and may be rusty brown, black, silver grey, or piebald instead of black. Often they have whitish spots on their faces.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The yak's hair is long, especially on the flanks, where it forms a shaggy fringe that often reaches the ground. This, together with an underlying layer of thick, fine wool, protects the animal from the bitter cold of its native region. The yak has an enormous tail with a brush of long hair coming from its root, which is rare in bovines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Long extensions of the thoracic vertebrae give the yak shoulders that look like a hump, but this is different from the boneless hump in zebus. The body is long, short-legged, and compact, with particularly large forequarters because, like the bison, the yak has 14 or 15 pairs of ribs instead of the 13 of domestic cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The horns spread outward and upward, and the head is held low, like that of the bison. While no hornless domestic yaks have been reported in Nepal, more than 90 percent of those found in Mongolia lack horns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most yaks are found especially in the mountains and plateaus of Tibet and western China, however they occur from northern Afghanistan, Pakistan, India, and Bhutan to Mongolia, and the Soviet Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are more than one million domestic yaks in the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Himalayas the domestic yak is almost always found above 2,000 m elevation. Males are sometimes brought as low as 1,700 m for mating with cattle (see chapter 6), but they do not fare well at such altitudes. In Mongolia and Buryatiya (U.S.S.R.), however, they are found as low as 1,500 m elevation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p29.png"></center><br>
+ Yak distribution. (after J. Bonnemaire, 1976)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The wild yak lives in desolate mountain areas at altitudes of 4,000-6,000 m. Its habitat is the alpine tundra and the cold desert regions of the northern part of the Tibetan plateau. These barren mountain regions are remote and at higher elevations than the zones of human habitation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yaks look ungainly, partly because they are covered with long hair, but they are agile climbers and can maneuver narrow mountain paths. Their long hair is one adaptation to the cold climate. Other adaptations are the small, compact scrotum of the male and udder of the female, the small teats (only 2-3 cm long) and covering of hair over the udder, and the covering of short hair over the muzzle, except just around the nostrils.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In early summer yaks graze the lush grass in valley bottoms, but for much of the year they live on dry, coarse mountain grass and for long periods obtain water by eating snow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The gestation length is 258 days - slightly shorter than that of cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domestic yaks are docile and easily managed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yaks are especially useful as riding and pack animals; they can manage loads of more than 150 kg. At altitudes up to 6,000 m they may carry a pack or a person at a steady pace for days and still remain in good condition. In some regions they are the only feasible pack animal. Yak bulls (generally castrated) are also used for plowing and for threshing grain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Occasionally the yak is slaughtered for meat. The meat is particularly important in parts of the USSR and in Mongolia, where in the cold, high-altitude environments it reportedly costs only half as much to produce as beef.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most areas milk production is an essential aspect of yak husbandry. Yields vary considerably according to management and nutrition, but they average about 600 kg and can be more than 1,000 kg per lactation. Yak milk is golden colored. It is much richer than cow's milk; a typical analysis is: total dry matter, 17.35 percent; fat, 6.5 percent; protein, 5.3 percent; and sugars, 4.6 percent. The fat globules are much larger than those in cow's milk. People of Tibetan stock use yak butter as a food staple and as a lighting fuel.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yak hide, though apparently not as good as that of cattle, is used for many purposes. It makes outstanding saddles. Yak hair is used for making ropes, saddle blankets (purportedly the best in the world), grainstorage bags, and tents. The fine wool that occurs beneath the long hair is used for making felt. The annual yield of adult females and males is about 750 g and 1,600 g of hair and about 350 g and 600 g of wool, respectively.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because yaks are often found above the timberline their dung is an important fuel in many areas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yaks can live and work hard in a cold climate. They are the only bovines to thrive at high altitudes. In cold, high areas they can work and produce meat and milk more efficiently and cheaply than cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yaks are not well able to eliminate surplus heat because their heavy coat reduces their ability to sweat. In warm climates their respiration rate and body temperature increase and they become exhausted and susceptible to infections. At low altitudes in Nepal yaks die of a variety of diseases. Apparently not even yak-cattle hybrid animals (see next chapter) can successfully live below 700 m in that part of the world. This is probably due to overheating, since during the first half of this century yaks grew successfully in trials at low altitudes in Alaska and northern Canada.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yak improvement programs are much needed. It seems probable that the genetic potential of the species is far from realized because Buddhist beliefs oppose the deliberate killing of stock. Techniques for deep freezing yak semen have been successfully developed at Regents Park Zoo, London and should prove invaluable for improving the breed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· As a result of uncontrolled hunting the wild yak is endangered and is now restricted to remote barrens on upland plateaus and highlands in northern Tibet and Chinghai, inhospitable even to domestic yaks. The numbers of wild yak are unknown. They require total protection throughout their range and the establishment of adequately protected reserves with good pasture. To preserve their genetic purity, it is important to isolate wild yaks from domestic yaks and thus keep them pure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· A primary need is to catalog the numbers and locations of purebred yaks. Today we have little idea of the total breeding population. Gathering such information is difficult, owing to the geographical isolation of the communities involved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· It is also important to catalog the movement of yaks between different areas to see if enough genetic exchange occurs to prevent inbreeding of the population. Exchanges between local pastoralists were much more frequent in the past (for example, between Tibet and Nepal), but this is now more difficult because of border restrictions and because many yak </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">herders that used to move herds long distances have become sedentary farmers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Breeding strategies, herd management, product processing, and herd hygiene in Nepal, Bhutan, Sikkim, northern India, and northern Pakistan, Tibet, Mongolia, and the Soviet Union all differ greatly. It is important to get an overall perspective so that the strengths of the different systems can be judged and the weaknesses reduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· There are clearly different domestic yak "breeds" in terms of their appearance, and these need to be identified and compared systematically. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p33.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">5 Yakows</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yaks and cattle have the same diploid number of chromosomes (60). And in the regions where yaks are found, they are often interbred with cattle, either the humpless cattle (Bos taurus) of Tibet and Mongolia or the zebu (Bos indicus) of South Asia. As with mules, the hybrid offspring of cattle and yak surpass their parents in strength and vigor. Yakows* grow faster than their parents, and they suffer less from high temperatures than yaks. The hybrid cow reaches sexual maturity earlier and yields larger quantities of milk than the yak cow. The males, however, are sterile.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The yakow's appearance varies with the type of cattle used in the cross. But because of the phenomenon of hybrid vigor (heterosis), the hybrids are considerably bigger than the mean size of their parents. (For instance, in one test the liveweight was approximately 18 percent higher than the average weight of the parents.) The hybrids also excel in hardiness, working ability, growth rate, and milk production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, their appearance and performance is closer to that of the mother than of the father. Because of this, the yakows can be "custom designed" for various altitude zones. For example, the farmer at lower altitudes may produce cattle-like yakows by breeding yak bulls to domestic cows, while farmers at higher altitudes would use the reverse cross.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Yakows have shorter hair and a much less downy undercoat than purebred yaks. They are similar in color to yaks. (In Nepal, black is most frequent, but brown shades and even white may occur.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yakows are found in parts of northeastern Afghanistan, northern Pakistan, northeast and northwest India, Nepal, Sikkim, Bhutan, Tibet, western China, Mongolia, and southeastern Russia. They are found notably in the Himalayan region of Nepal, where they are bred by people of Tibetan culture and language. Sherpas, for instance, supply hybrid cows and heifers to dairy farmers throughout northeastern Nepal. Hybrids are also much bred in Ladakh (northern Pakistan) and Mongolia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whereas farmers in Nepal tend to use zebus to cross with yak, the inhabitants of the Tibetan plateau generally use Bos taurus cattle. People in some areas favor mating yak bulls to cows, while those in other areas prefer the reverse. But even within one village there can be a degree of specialization by different families, depending on wealth and the location of traditional grazing grounds. Generally, however, the crosses between domestic cattle bulls and yak cows are the predominant ones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The number of yak-cattle hybrids in the world is unknown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the yak, the hybrid can live in cold, barren, upland terrain, but it has the advantage of being able to adapt to lower altitudes. In winter, caravans of hybrids may come down as low as 1,600 m in some parts of Nepal, and hybrid herds (especially those resulting from crossing yak bulls with zebu cows) can spend several weeks grazing at altitudes as low as about 1,700 m in winter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Female hybrids are fertile when mated with either parent stock. Male hybrids, however, are sterile. Although they have fully developed secondary sexual characters and show libido, their testes do not produce spermatozoa because the seminiferous tubules are poorly developed and the spermatogonia and their nuclei are degenerate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A few normal or motile spermatozoa may be found in the semen of backcrosses of the F1 hybrids to either parent, but as a rule the spermatozoa are normal and dead.* Backcrossing is reportedly not common, however, as the progeny do not retain hybrid vigor.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tibetan farmers prefer the hybrids for plowing because of their docile temperament. The yak is said to be more stubborn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The hybrids are valued as beasts of burden and draft, and are often preferred over yaks. Male hybrids are generally castrated at about 3 years of age so as to increase their strength and size.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where pastures occur over areas of greatly varying altitude, the use of hybrid livestock is likely to be more efficient, in biological terms, than the use of yaks or cattle. By judiciously selecting cattle, yaks, or hybrids all altitudes from sea level to above 5,000 m can be utilized with best efficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The hybrid's milk is intermediate in composition between that of its parents. However, hybrids yield up to 7 kg of milk per day against the yak's 3 kg. (It seems that the hybrid derived from cattle bull and female yak produces considerably more milk, with a higher fat content than that derived from yak bull x cattle female.) Also the female hybrids produce larger quantities of milk than Nepalese zebu cows on the same hill pastures. They also produce a calf each year, while under normal herd management yaks tend to produce a calf every 2 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hybrids do not tolerate extremes of altitude or cold as well as purebred yaks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The normal gestation period for yaks is about 1 month shorter than that of cattle, and the gestation period for a hybrid is intermediate between that of the parents - hence there may be problems at calving when a female yak is sired by a bull from a large cattle breed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is needed to identify differences in altitude tolerance between various hybrids. This should include measurements of hemoglobin count, respiration rate, and pulse rates at different altitudes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Studies are also needed on all production characteristics, particularly on the meat and milk production potentials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cataloging the breeding strategies of different areas where hybrids occur would be useful, along with a historical perspective.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research to determine the most productive hybrids by crossing different yak and cattle "breeds" in areas with different environmental conditions could be extremely useful. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part II : Wild Bovine Species</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In various parts of Southeast Asia there exist little-known relatives of cattle and water buffaloes. Many of these wild animals are close to extinction, and attention is drawn to them in hope their populations will be preserved. All of them survive in tropical regions subject to environmental extremes - flooding annual rains, searing droughts, and swarming pests and parasites. These are conditions to which conventional livestock are poorly adapted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">None of Africa's bovines is threatened with extinction, and both the European and American forms of bison are being preserved by governments and individuals. In Asia, however, there has been an alarming drop in the numbers of wild water buffalo, wild yak, wild banteng, kouprey, gaur, and tamaraw in recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This section describes:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Wild banteng</P>
+<P ALIGN="JUSTIFY">· Gaur</P>
+<P ALIGN="JUSTIFY">· Kouprey</P>
+<P ALIGN="JUSTIFY">· Tamaraw</P>
+<P ALIGN="JUSTIFY">· Anoas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If not molested, many of these animals can thrive side by side with human settlements. They may therefore have an important future role in the development of the tropics. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is little point in conservation for conservation's sake, but loss of irreplaceable resources through ignorance, greed, or thoughtlessness should be avoided. It may be that these Asian animals have little merit other than their uniqueness, but at the very least, sufficient numbers should be conserved until we have time to find out. A. J. SMITH Royal School of Veterinary Studies, Edinburgh, Scotland </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rapid human increase and relative poverty deny hope that any land can lie idle when so many would be robbed of an opportunity simply to exist. For wildlife to survive, let alone at its breathtaking best, we must think of new and better ways to justify its future, preferably by having it contribute to the welfare of those hard-pressed humans who inevitably are further disadvantaged by the creation of national parks. DAVID WESTERN New York Zoological Society, Bronx, New York, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is an urgency to conserve and study nontraditional animal species, especially for use in the environmentally challenging tropical areas of the world. The philosophy plant scientists apply to exploring the potential of the plant kingdom needs to be more enthusiastically adopted for the world's animal species. G. W. M. KIRBY, Principal Animal Production Officer Department of Primary Production Darwin, Australia</P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY"><center><img src="p40.png"></center><br>
+ GAUR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">6  Wild Banteng</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The wild banteng (Bos javanicus)* are the most cowlike of all the wild bovines and are the parent stock of the 1.5 million domesticated banteng in Indonesia (see chapter 1). They have a scattered distribution throughout Southeast Asia, and three subspecies are recognized:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The Java banteng Bos javanicus javanicus (Java and Bali)</P>
+<P ALIGN="JUSTIFY">· The Borneo banteng Bos javanicus lowi (Borneo)</P>
+<P ALIGN="JUSTIFY">· The Burma banteng Bos javanicus birmanicus (Burma, Thailand, Indochina).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng have been called the most beautiful of all wild relatives of cattle. The cows are usually a vibrant reddish brown, while adult bulls are mostly blackish-brown and sometimes even blue-black (although in Burma and Indochina bulls remain golden brown like the cows, and in Thailand a few banteng have been recorded with white, deerlike spots on their brown coats). Both sexes have white "stockings" and a large white patch on their rumps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng are larger than their domesticated counterparts. Average-sized bulls of the Java and Burma subspecies stand 1.6 m high and weigh 635 kg, but bulls as large as 1.9 m and 825 kg have been recorded. Cows average 1.4 m in height and weigh 400 kg. The Borneo subspecies is smaller.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The horns of banteng bulls are angular, turning out and then up, with inward-pointing tips and reaching a spread of 60-75 cm. The horns of cows are short and crescent shaped. There is a patch of thick, naked skin between the horns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are found in restricted localities scattered over an area ranging from the northeastern edge of India, through Burma, Thailand, the northern Malay Peninsula, central and southern Indochina, and the islands of Borneo, Java, and Bali.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only a few thousand wild banteng survive, and their numbers are decreasing. Most populations are endangered because their habitats are being encroached upon by the growing human population. In Sabah, Malaysia, for example, the areas where an estimated 300-550 banteng (the last remaining herds) occur are scheduled for conversion to permanent agriculture. The animals are being forced to use smaller and smaller habitats, thus increasing losses caused by malnutrition, diseases, and parasites. In addition, throughout much of the animal's range, hunting, military operations, and perhaps interbreeding with domestic cattle are further reducing the original stocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p43.png"></center><br>
+ Distribution of wild banteng. (courtesy of C.H. Wharton)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The banteng's general distribution lies in the zone of deciduous monsoon forest in Southeast Asia. Habitats vary between the extremes of dry wooded parkland with large grassy plains to tropical rain forest with small clearings. The animals prefer flat or undulating terrain. In northern Kampuchea and eastern Java, they inhabit grassland savannas. In western Thailand, they live in a belt of grass and bamboo thickets along upper slopes of dry mountains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng inhabit sites from sea level to around 2,000 m elevation. They avoid large human settlements and plantations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most areas there are no pronounced hot or cold seasons, but dry seasons can be long.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng prefer feeding on grass, but are fond of herbs, leaves, fruits and blossoms, as well as the sprouts of trees, brush, and young bamboo. Under favorable conditions they drink daily, preferring standing water. During droughts, they seem able to survive several days without water. In coastal areas where there are no mineral licks they can meet their need for salt by occasionally drinking seawater. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sex ratio at birth is 140 males to 100 females, but mortality of bulls is heavy and the adult ratio is about three cows for every bull.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Calves are suckled until they are 14-16 months old.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In undisturbed conditions, the banteng's daily activity has a more or less fixed rhythm. During daytime, the animals alternate active and resting periods of 2-3 hours each. The active periods predominantly involve feeding, drinking, and social interactions. While resting, the animals commonly ruminate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As a reaction to heavy rains or human disturbances, the animals retreat into dense vegetation. In regions with frequent human disturbance they generally appear in the open only at night. However, where they find particularly suitable localities they become somewhat accustomed to human presence and will venture out in daylight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng live alone or in small groups of up to eight members. Males separate from their mothers at an age of 2-3 years. Sometimes female calves continue living with their mother even beyond maturity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cows and dominant bulls command the best pastures, and young and weaker bulls roam widely, rarely leaving the protection of the thick forest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The banteng bull has a reputation for extraordinary savagery, but stories of its lightning attack have been exaggerated. Wildlife biologists in Indonesia have not been able to document any such attacks and have no qualms about walking in banteng habitats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng show important promise for improving domesticated banteng (see chapter 1) or for interbreeding with cattle (chapter 2). Almost 170 years ago Sir Stamford Raffles, founder of Singapore, noted that in Java "The degenerate domestic cows are sometimes driven into the forest to couple with the wild benteng, for the sake of improving that breed."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tourism could be developed in areas where these magnificent animals occur.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng are large, robust animals fully at home both in the heat and humidity of the wet season and in the hot dry season. Their genetic </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">endowment for such tolerance could be of significant value fin improving domestic stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Possible Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild banteng may prove to have a special susceptibility to diseases of domestic animals. Blackleg (Clostridium chauvoli) and mucosal disease have caused heavy losses in banteng in European zoos.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capture of wild banteng may prove difficult.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research on the physiology, production potential, and possible uses of wild banteng is needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hunting and destruction of its habitats menace the wild banteng over all of its range. The only promising means for conservation is creation of nature reserves where hunting and forest destruction are forbidden. Conservation efforts should particularly include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Supporting government of Thailand efforts to conserve banteng in western Thailand and the Petchabun Range;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Cooperating with the Burmese government in surveys to locate the best banteng habitats;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Cooperating with the governments of Kampuchea and Laos to identify banteng habitats and establish appropriate protective measures; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Carrying out research in Java's nature reserves (Ujung Kulon National Park and Baluran Reserve) to ascertain the genetic distinctiveness of the banteng, its status, and its characteristics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Sabah and other areas of Southeast Asia there are cattle breeding projects that use imported stock exclusively. Experimental crossbreeding of local banteng with this stock should be encouraged. There are some feral and domestic banteng, as well as hybrids between wild banteng and feral cattle, that should also be tested.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p45.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">7 Gaur</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The gaur (Bos gaurus) would seem to be an ideal meat-producing animal. It is a large bovine with massive muscular development, and it has already been domesticated (see mithan, chapter 3). Gaurs, which are threatened with extinction, deserve much greater attention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two subspecies of gaurs are recognized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Bos gaurus gaurus (India, Nepal) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Bos gaurus laosiensis (Burma, Thailand, Laos, Vietnam, Kampuchea, West Malaysia). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With its huge head, massive body, and sturdy limbs, the gaur is the embodiment of vigor and strength. It is among the biggest of bovines. Bulls weigh 600-940 kg and stand 1.6-1.9 m tall at the shoulder, but a record bull of 2.2 m and 1,225 kg has been recorded. Cows are only about 10 cm shorter in height, but they are more lightly built and weigh 150 kg less.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On their shoulders gaur bulls have a striking muscular ridge that slopes down to the middle of the back, where it ends in an abrupt dip. The horns are crescent shaped, creamy yellow, and taper to a sharp point, which is usually tipped in black.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Newborns are a light golden yellow, but soon darken to coffee or reddish brown, the color of young bulls and cows. Old bulls are jet black, their bodies almost hairless. Gaurs have light colored forehead and yellowish or white stockings. Their eyes are brown but in certain lights, because of reflection, they appear blue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs excrete an oily, aromatic sweat, unique to this species and to the mithan. It gives the animals a strong bovine smell and may be an adaptation for keeping away insects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Once common throughout South and Southeast Asia, gaurs now survive only in scattered remnant herds of up to 30 animals in the hill forests of India, Nepal, Burma, Thailand, Laos, Kampuchea, Vietnam, and the Malay Peninsula.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p48.png"></center><br>
+ Gaur distribution. (courtesy of C.H. Wharton)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Historically, the largest concentrations have coexisted with farmers in areas of shifting cultivation. The animals adjust to disturbed land, and they also adapt to man's presence if not unduly harassed. For example, gaurs will feed in agricultural fields, along roadsides, and near occupied houses. Herds in national parks feed peacefully while tourists stand by. Gaurs in zoos also become quite tame and manageable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Populations not protected in parks and reserves are in immediate danger of extinction. Even in the remotest hill forests gaurs are harassed by hunting, exposed to the diseases of domestic cattle, and driven from their natural habitat by human invasion. Most herds outside of parks or wildlife reserves are threatened by agricultural development, hydroelectric dam projects, human settlement, or extensive logging.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In India, large populations still exist in the larger sanctuaries such as </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mudumalai and Kanha Park. In Thailand diseases carried by domestic animals, poaching, and habitat destruction have reduced total gaur numbers to fewer than 500. In Malaysia, the population is estimated to be only 400 animals. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs typically live on gentle, undulating terrain with natural mineral licks. They inhabit gaps in the forest, such as abandoned clearings, where they can find grasses and shrubs. In the northern portions of their range, they inhabit deciduous and semideciduous hill and mountain forests with light brush and many grassy clearings. In the lowlands they live in open bamboo jungles, grassy plains near forests, or dense forests broken by glades or open meadows. (In the forest they probably depend to some extent on the slash and burn agriculture of hill people.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals appear to be adapting to increased human presence. They make use of such man-modified habitats as logged forests and fringe areas of agricultural estates that abound with grasses and early secondgrowth vegetation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs are combination grazers and browsers. They feed on the grasses of forest openings as well as on the young leaves, fruits, twigs, and bark of shrubs and juvenile trees. In one study in Malaysia, grasses comprised 41 percent of their diet, fortes 23 percent, and woody browse 36 percent."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs develop large muscular bodies and maintain excellent condition on relatively low-quality feed. In the Malaysian study, crude protein content of grass species varied from 7.0 to 7.6 percent and phosphorus content varied from 0.11 to 0.17 percent; yet calves reached weights of 300 kg or more during their first year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Birth and survival rates of up to 100 percent have been reported for wild gaur populations. Calves are born at any time of the year. The gestation period is 270 days, a little shorter than for banteng or domestic cattle and longer than for yak or kouprey.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Captive gaurs calve first at 2.5 years of age.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The gaur interbreeds with the mithan, and both have a diploid chromosome number of 2n = 58.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By nature gaurs are shy and timid. As with most wild bovines, their hearing and eyesight seem comparatively poor. Their defense lies in their massive size and acute sense of smell. When a herd with juveniles is threatened by a predator, the adults form a protective circle around the young. Although individuals retreat from danger if they can, they have a unique form of threat: they approach their opponents broadside instead of head on, displaying the huge muscular body and dorsal ridge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In common with other wild bovids, gaurs habitually visit mineral licks, which appear to be necessary to their habitat and influence the herd's movements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike water buffaloes, gaurs do not wallow. They take cover in the forest during the heat of the day and may feed at night and in the early morning during hot weather. In populated areas such as near agricultural estates, they may feed only at night to avoid people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the past, gaurs associated in loose herds of up to 400 animals, but today groups of only 5 to 12 animals are normally found. The herds, which are of more stable composition than those of banteng, are separated by sex for most of the year; however, during the rut stronger bulls form a series of "tending bonds" with estrous cows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs are thought to be interfertile with domestic cattle. If so, their attributes of size, massive muscular development, tolerance of heat and humidity, and resistance to diseases and parasites can contribute to beef production in the tropics. A gaur-cattle hybrid might also have immunity to some cattle diseases; if it retained the mild temperament of the domesticated parent, an extremely powerful beast of burden could be produced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The gaur is a truly majestic animal. Its habit of using grassy forest clearings and salt licks makes it a likely tourist attraction in parks and reserves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a climate and environment where domestic cattle are susceptible to heat stress and parasite infestation, gaur thrive and maintain body condition. Further, they are able to develop large muscular bodies and maintain excellent body conditions on relatively low-quality forage by feeding on a variety of woody browse, grasses, and fortes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Retaining its wild instincts for survival, the gaur is better able to withstand predator attacks them domestic cattle. This could be an advantage when animals graze in remote areas. Adult gaurs are strong enough to defend themselves against a predator as powerful as a tiger. In addition, they are also very protective of their young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs have little immunity to some cattle diseases. In many regions of India, cattle driven into the forests to graze infect gaur herds with rinderpest, foot and mouth disease, cattle plague, and other contagious diseases. Severe losses occur. Gaurs also appear very susceptible to malignant catarrhal fever.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaur numbers are declining throughout their range. If this trend is not reversed, it could effectively prohibit the use of gaur for domestication or crossbreeding purposes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs are shy and excitable, making them difficult to catch, but once in captivity the animals calm down. Second generation zoo populations are easily worked and handled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaurs on occasion damage cultivated crops such as young rubber trees and cassava. They require sturdy and well-kept fences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Southeast Asia there is special need to support the efforts of the governments of Malaysia and Thailand to conserve this species and to identify important gaur populations. Similar protective measures are needed in Burma, Laos, Kampuchea, and Vietnam.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is needed to establish and manage new gaur herds in forest reserves and build up the gaur population in the world's zoos. Techniques have been developed to capture and release wild gaur safely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fertilized gaur ova have been successfully transferred into a foster Holstein cow. The cow carried the gaur fetus to a successful delivery. This could be the forerunner of an important means of rapidly expanding captive herds by transferring gaur embryos into cattle in different parts of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is also needed on the basic physiology and production potential of gaur.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crossbreeding experiments should be started immediately to establish the degree of interfertility between the gaur and other bovine species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p52.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">8 Kouprey</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kouprey (Bos sauveli) is the most primitive of living cattle. Its features are typical of some forms that existed in the Pleistocene era, 600,000 years ago. Discovered by Western scientists only in 1937, the kouprey was the last large mammal to enter the biology books. It is perhaps the most primitive of living cattle and is closely allied to Bos namadicus, the wild ancestor of zebu cattle. In 1964 it was declared Cambodia's national animal. It is now perilously close to extinction, and for a decade no koupreys have been observed close enough for a positive identification by a specialist. In 1982, however, five of the animals were believed sighted in Thailand, near the border with Kampuchea. Thus there are hopes that the kouprey still exists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kouprey is large. Males stand 1.5-2 m high at the shoulder and may weigh 900 kg. Females are approximately three-quarters the height and weight of the males. The body is slender and long-legged. The hump from the withers to the center of the back is smaller than that of the gaur, but larger than that of the banteng. There is a well-developed dewlap from the throat to the mid-chest, which in old animals is sometimes so pendulous that it drags through the grass in front of the forelegs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young bulls are gray, with black on the head and dewlap. Old bulls are entirely black and cows are mouse gray or dullish light brown. As in the gaur and the banteng, the lower parts of the legs have white stockings, but kouprey stockings have a streak of dark hair down the front.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Kouprey. (P. Pfeffer)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey horns are among the longest and widest of any bovine. The tips of the adult male horns are surrounded by rough, frayed tissue caused by the animals' habit of digging in the soil with their horns. The females have slender, lyre-shaped horns that corkscrew upwards, unlike those of any other wild or domesticated cattle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey are said to have a grace more reminiscent of deer than cattle. They move at a light trot, as fast as 32 kph.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kouprey's prevalence in ancient times is evidenced by prehistoric cave-paintings in Kampuchea. The animal was also a favorite of the ancient Khmers, who carved kouprey statues and featured the animal in bas-reliefs on temples, including the monuments of Angkor Wat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, whatever kouprey exist are restricted to an area along both sides of the Mekong River in northern Kampuchea, the Dangrek Range, and other parts of eastern Thailand to the far south of Laos, and to the westernmost part of Vietnam. Although one or two small herds may still exist in remote pockets of Laos and Vietnam, the bulk of the population has always been centered in Kampuchea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are no koupreys in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of their large size, gregarious behavior, comparatively low reproductive rate, and preference for open areas, kouprey are vulnerable to hunting. The impressive horns and other tissues are valued as trophies and as medicinals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1964 it was estimated there were about 500 kouprey in Kampuchea, but by 1970 fewer than 70 were left. The subsequent fate of the species is unknown because of the years of warfare in the area. (Early in 1970, the three nominal kouprey reserves of Kampuchea were overrun by military forces.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p55.png"></center><br>
+ KOUPREY DISTRIBUTION. (AFTER C.H. WHARTON )</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1975 the kouprey stocks in Laos and Thailand were estimated at only 50 and 20 animals, respectively. By now, hunting and habitat destruction probably have all but eliminated the kouprey from Thailand. However, a reported sighting of five animals that had strayed across the border from Kampuchea was made in July 1982. (By the time Thai zoologists arrived to investigate, the herd apparently had crossed back into Kampuchea.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the banteng, the kouprey inhabits open sites such as light savannas, woodland meadows, and scattered glades in the monsoon forests. It is adapted to dry country. This type of habitat is not widespread in Indochina, and the range of the kouprey is consequently limited.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey spend most of the year among low rolling hills in open areas where grazing and visibility are good. These open areas are a fire climax mosaic of dry dipterocarp savannas and patches of dense forest. Fires occur each dry season, most of them deliberately set by man. Kouprey capitalize on the young growth in burned-over areas. They feed primarily on grasses, sedges, and tree leaves. They also require salt licks and a supply of water in the dry season.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The gestation period is thought to be about 8.5 months. Cows leave the herd before parturition and return with their calves after about a month. They nurse their calves for about 6 months.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey are said to be even more shy than banteng and gaur. They feed in erratic patterns and are always alert and nervous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Loose herds of 20 or more have been reported. These were of mixed composition, often with more than one adult male, and were usually led by an old female. Adult bulls sometimes form bachelor herds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey utilize some of the same feeds as wild banteng, and the two animals often live in a loose association. They graze together, and, especially after the mating season, solitary kouprey bulls often associate with banteng herds. The two species do not, however, interbreed in the wild. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kouprey is a candidate for domestication and has important potential as breeding stock. It is a wild animal, but it may have been domesticated temporarily during the Khmer culture, 400-800 years ago.* Both Vietnam and Laos have cattle breeds that resemble kouprey, and a kouprey bull, reputed to be a domestic animal of the Stieng tribe, was exhibited in the Paris Menagerie in the mid-nineteenth century. It may be that kouprey are domestic even today in parts of Indochina.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey survival has worldwide significance. The animals could be important for studies of bovine evolution and as a genetic resource for crossbreeding to improve disease resistance and other characteristics of domesticated bovines. For instance, the kouprey is thought to be resistant to rinderpest, a killer disease of domestic cattle. Also, kouprey bulls are distinctive for their long dewlap, and they probably have more skin area for their weight than other bovines and are therefore better able to eliminate body heat. This genetic trait may help large cattle breeds survive in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kouprey's potential may be moot - there may be none left in the world. It is feared that the warfare of recent years may have caused its extinction. However, if enough animals survive and can be protected, the kouprey could probably recover its numbers, as a higher calf-to-cow ratio (1:3) was reported for this species than for either banteng (1:4) or gaur (1:10).*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If wild kouprey are found, their capture is likely to be difficult.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a long-term sequence of research needs for the kouprey, which includes the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">.  Working with the governments of Thailand, Laos, and Kampuchea to identify any remaining pockets of this species and to establish conservation programs;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Establishing one or more captive breeding herds (because there is little chance of the animal surviving in the wild owing to the fighting and turmoil in the area);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Studying the animal's basic physiology and production potential;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Exploring its possible commercial utilization; and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Investigating the kouprey's genetic relationship to zebu cattle and the transferability of genetic characters through interbreeding. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p58.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">9 Tamaraw</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tamaraw (Bubalus mindorensis) is related to the water buffalo, one of Asia's most important animal resources, but it has never been domesticated or studied and is threatened with extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tamaraw looks rather like a miniature water buffalo of the swamp type that is found in Southeast Asia. It reaches about I m in height and 300 kg in weight. It is much more stockily built and is blacker than the swamp buffalo. The tamaraw has white marks on the fetlocks, instead of completely white lower legs like the banteng, gaur, and kouprey. It has short (35-50 cm), very stout horns that curve out and back slightly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Endemic to the Philippine island of Mindoro the tamaraw is now virtually restricted to three small areas (Mount Iglet/Mount Baco, Mount Calavita, and Sablayon) in Mindoro Occidental.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its limited distribution, the tamaraw's future is of concern to conservationists. Until World War II, hunting was carefully regulated in its native region and no serious concern was felt for the animal's safety. Since then, however, increases in human population, lumbering, and ranching have restricted the tamaraw's habitat, and the availability of rifles and automatic weapons has seriously threatened its numbers. In 1971, research teams counted 148 head, consisting of 116 adults and 32 calves. The latest estimate is 150-200 head.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of these last remaining animals, about 80 are located at Mount Iglit, a game refuge established in 1961 primarily to protect the tamaraw. Recently an active tamaraw conservation program has been started in a 400-hectare enclosed area on the refuge. Stockade traps have been built and tamaraw are beginning to move into them. The goal is to establish a small, semicaptive population that can be properly guarded, studied, and managed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p61.png"></center><br>
+ Tamaraw distribution. (courtesy Wildlife magazine)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The habitat requirements of the tamaraw appear to be fairly flexible, and present habitat use reflects human pressures rather than the animal's preferences. In the past, tamaraw were found in virtually all parts of Mindoro, from sea level to mountain tops. They occupied open grasslands or glades, but hunting pressure and habitat change have forced it to retreat into forest environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present the tamaraw is found primarily in remote areas that have been partly cleared, largely by fire, so that only small pockets of trees remain among coarse grasses such as Imperata cylindrica (a widespread, unpalatable tropical weed commonly called cogon, kunai, alang alang, lalang, or blady grass), and "tahalib" (Saccharum spontaneum). The tamaraw uses the forest pockets for rest and retreat and the open land for grazing. It must have a supply of water for wallowing and drinking.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to cattlemen, tamaraw eat both Imperata grass and tehalib but only when these are short and green. During the wet season when most forages are tall and unpalatable, the animals are known to feed on bamboo shoots.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy is about 20 years. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tamaraw are reputed to be nocturnal, ferocious, and retiring. However, in earlier times they were reportedly relatively tame, diurnal animals of open areas. It was the continual hunting that made them increasingly nocturnal and secretive, and like other wild bovids they can become aggressive and dangerous when harassed or wounded. Given effective protection they doubtless would revert to placid, diurnal behavior.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tamaraw appears to be a possible livestock animal. Its meat and hides were highly regarded by local peoples, cattlemen, and visiting hunters. Because of its close relationship to the water buffalo, it may be able to provide genetic material for improving the health and hardiness of that valuable animal resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal is renowned for hardiness and resilience to heat, humidity, and poor forage, as well as its capability to thrive in a variety of environmental conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tamaraws have only once produced offspring in a zoo and may prove difficult to raise in captivity. However, they have been kept in captivity so seldom that the prospects are unclear. Experiences with other wild bovids suggests that captivity and captive breeding should be no problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tamaraw must be protected and preserved. There is urgent need, for example, to establish more secure parks in the Philippines to rebuild the wild population to safe levels. Other conservation measures should include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Establishing and maintaining more reserves in natural habitats containing breeding populations, and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Building up breeding populations in suitable zoos and livestock research centers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is needed on the tamaraw's physiology, production characteristics, behavior, and genetic relationship to the water buffalo. None of these is well understood. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p63.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">10 Anoas</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The lowland anoa (Bubalus depressicornis) and the mountain anoa (Bubalus quarlesi)* are small bovines that are related to the water buffalo but that are scarcely bigger than goats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Compared with other bovines, the anoa is tiny. It stands only 0.75-1 m tall at the shoulder. The mountain anoa is smaller than its lowland counterpart. The limbs are short, the body plump, and the neck thick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoa horns are short and straight, reaching a maximum length of about 380 mm; they are ringed and triangular in cross section at the base in lowland species and simple and conical in cross section in mountain species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the young are thickly covered with yellowish-brown woolly hair, the mountain anoa adults tend to have curly hair, while lowland anoa have straight hair or are hairless. Adults vary from dark brown to black, with frequent blotches of white on the face, nape, throat, and lower limbs. In mountain anoas the entire lower limbs are creamy white. The underbody parts are usually light brown. Males are generally darker than females.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The hide is exceptionally thick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas are native to dense, mature forests of Sulawesi in eastern Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both species are abundant and well distributed on Sulawesi. Most of the northern, eastern, and southeastern peninsulas and the central area of Sulawesi are still forested and have anoa populations, and there are several large nature reserves to protect them. *</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several of the world's zoos have anoa collections (see Research Contacts).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The climate of Sulawesi is hot, but tempered by sea winds; annual rainfall varies from 500 mm to 4,000 mm. The eastern and southeastern peninsulas have a sparse population and a scattering of subsistence agriculture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The lowland species is found in forests and was once common along the coasts. The mountain anoa is found in primary forests at high altitudes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p66.png"></center><br>
+ DISTRIBUTION OF ANOA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas have a wide-ranging diet that includes grasses, ferns, saplings, palm, ginger, and fallen fruit, especially figs. It is of particular interest that the animals can live on a diet that contains no grass.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas have a high requirement for minerals. They visit mineral-rich hot springs and salt licks, and they even drink from the sea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The San Diego Zoo in the United States and Surabaya Zoo in Indonesia have successfully bred and reared the animals in captivity. The gestation period is 276-315 days, and there is generally only a single birth. The life expectancy is about 20-25 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas are shy animals, but they can be aggressive. The sideways and upwards stab of their straight, sharp horns can be dangerous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Except when the cows are about to give birth, anoas apparently associate in pairs rather than in herds. They enjoy water and frequently wallow in mud. Their gait is a trot, but a times they make clumsy leaps. During the morning they feed alone. In the heat of the afternoon they seek refuge under shade trees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On Sulawesi anoas are prized for their hide, horns, and meat. The flesh, especially that of calves, is tender and well flavored.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although somewhat aggressive and pugnacious, anoas might make a suitable livestock animal. They grow and reproduce well in captivity and are adaptable and intelligent. Their small size makes them easier to handle than many other wild bovines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known about the habits of these animals because of their wary nature, secluded environment, and restricted range. They can be tamed enough to obey commands ("lie down," for example) but they remain nervous and likely to butt strangers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surveys are needed throughout Sulawesi to determine the distribution and taxonomy of possible races of the two species, with a view to establishing a protected-area system that will ensure the survival of the genetic diversity of this group.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is also needed on social organization and tameability, as well as on the anoa's biological relationship to the tamaraw and water buffalo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One target should be to build up the zoo populations of both species. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p68.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part IlI : Pig and Piglike Species</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In parts of Asia wild and feral pigs are often the most abundant source of meat. These animals are predominantly variants of the domestic pig, Sus scrofa, or of its ancestor, the Eurasian wild boar. Also contributing to the pig population are five Asian species:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Bearded pig</P>
+<P ALIGN="JUSTIFY">· Sulawesi warty pig</P>
+<P ALIGN="JUSTIFY">· Javan warty pig</P>
+<P ALIGN="JUSTIFY">· Pigmy hog</P>
+<P ALIGN="JUSTIFY">· Babirusa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Southeast Asia hybridization between these species and common pigs has resulted in a confusing diversity of forms and interrelationships. Because of their value, these pigs have been spread since prehistoric times by traders and migrating peoples, creating odd and unpredictable distribution patterns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The species listed represent a gene pool of potential importance for the further development of one of man's most important sources of food. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In many areas of the world, one must start with the native animals adapted to that environment. In many cases, they are the only animals the native human population can afford to begin with. And it is amazing the increased animal production that can result from the use of better production practices with them. TONY J. CUNHA, Dean Emeritus California State Polytechnic University Pomona, California, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fitting the animal to the vegetation might be a better approach than trying to fit the vegetation to the animal, especially on ranges that have been changed or degraded by man. JAMES TEER, Director Texas Parks and Wildlife Department, Austin, Texas, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is now widespread realization that breed importation is not necessarily the quickest route to increased animal production. Indigenous, adapted breeds should be examined more closely and, where necessary, steps should be taken to ensure conservation of at least some of them. HELEN NEWTON TURNER Genetics Research Laboratories, CSIRO, North Ryde, New South Wales, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maximizing the animal harvest, essentially of animal protein, assumes in concept that all animals will be fully exploited in efficient and economic production systems. C.DEVENDRA Malaysian Agricultural Research and Development Institute, Selangor, Malaysia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p70.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">11 The Bearded Pig</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it apparently has never been domesticated, the bearded pig (Sus barbatus) has a long history as an important resource in Southeast Asia. Human remains from the Niah Caves in Sarawak are accompanied by large numbers of its bones and teeth, indicating that 40,000 years ago it was the most commonly eaten large animal. Today in Sarawak and some other areas the bearded pig is still probably the most sought after source of wild meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bearded pigs are large. Boars measure 1-1.6 m in length (crown to rump), up to 1 m in height, and may weigh as much as 150 kg. Sows are smaller. Adult males have small facial warts (infraocular and preocular) and a bushy tuft of hair on the cheek. Both sexes vary in color from pale red-brown to yellow-brown or black. They have elongated skulls with longer, more flexible snouts than the common pig.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Five subspecies are recognized. They range through the Philippines (Balabac, Palawan and offshore islands, Calamianes, Luzon, Mainit, Mindanao, Jolo, Mindoro, and Cebu) to Borneo, Bangka, Sumatra, the Riau Archipelago, and the Malay Peninsula.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Borneo subspecies (Sus barbatus barbatus) is still abundant in some parts of Sabah, Sarawak (including several wildlife reserves), and </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kalimantan. It remains an important food resource for some hill tribes, although with the spread of Islam, attitudes toward pork are changing in some areas. The Malayan subspecies (Sus barbatus of) is now rare in the Malay Peninsula. It is also becoming rare in Sumatra as the lowland forests are logged and broken up by commercial interests and as the human population expands. The status of the three Philippine subspecies is currently unknown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The bearded pig is most commonly found in both primary and secondary evergreen forests. However, it seems to have wide adaptability, and in Sarawak bearded pigs are found in virtually all habitats from the beaches to the upland rain forests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No biological research has yet been conducted on bearded pigs, but naturalists have made several observations. The pigs eat the seeds of trees (for example, those of species of Dipterocarpaceae and Fageceae), fallen fruits (of Moraceae, Bombacaceae, and other plant families), roots, stems of wild bananas, herbs, and probably earthworms, and along the coast they dig up and eat turtle eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Births occur throughout the year in Sabah, but the peak coincides with the fruiting season of forest trees, usually August-September. The litter size is from 3 to 11 piglets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p73.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No behavioral studies have been conducted, but observations suggest that bearded pigs are generally sedentary animals, although in some areas they congregate into large groups that may travel long distances together.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The species might be used (alone or together with other pig species) as a local source of meat, or even as the foundation of a meat industry. The bearded pig is accustomed to living in groups, which may make it suitable for husbandry or game management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is evidence that the bearded pig will interbreed with the common pig, producing young in which both sexes are fertile.* The progeny might have considerable hybrid vigor.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The bearded pig may have tolerance (if not actual resistance) to tropical diseases and conditions that affect the common pig. The species survives in areas of Southeast Asia where feral herds of common pigs are not common, apparently owing to their inability to cope with disease or other environmental challenges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No negative qualities have been reported, but the animal's biology, behavior, management, and potential uses are so far virtually unstudied.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aspects of the animal's general biology that should be investigated include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Chromosome type and variability, and chromosomal differences between the bearded pig and other wild and domesticated pig species</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Reproductive physiology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Nutritional physiology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Social behavior (both in its wild state and under controlled conditions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To assist in the selective capture of young bearded pigs in the wild, external features that characterize the species at an early age need to be identified.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To assess the bearded pig's potential for contributing hybrid vigor, crossbreeding with other pig species should be attempted under controlled conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">12 The Sulawesi Warty Pig</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Sulawesi warty pig (Sus celebensis) is one of the world's few domesticated animals. It is maintained as a village or household animal in a few areas of Southeast Asia, such as on the Indonesian island of Roti. The common pigs of New Guinea and parts of the Moluccas group are hybrids between this species and the common pig.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sulawesi warty pigs are medium sized, averaging about 60 cm high and 40-70 kg. Boars are larger than females and have longer (10 cm) tusks on both jaws. Boars have three pairs of prominent facial warts: on the snout, the cheek, and on the angle of the jaw. In sows these warts are small or absent entirely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are usually red-brown with sharply marked white and yellow undersides; older animals have a round white spot (about 3 cm in diameter) on each side of the upper cheek. Piglets have horizontal stripes on the body, which disappear as they mature.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The body is covered with scanty coarse hair, but stiff bristles, which become erect when the animal is alarmed, occur along the mid-dorsal line of the body. The longest and stiffest occur on the head and nape.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Native to mainland Sulawesi and certain surrounding islands, the Sulawesi warty pig has been introduced to the Lesser Sunda Islands (Flores, Sumba, Roti, Semau, and Timor), the Moluccas (Malmahera and Buru), and Simaleue, a small island west of Sumatra. In some parts of the Philippines (for instance, Naujan and Mindoro Oriental) the animal either occur naturally or has been introduced. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hybrids between the Sulawesi warty pig and the common domestic pig occur on New Guinea, Ternate, Morotai, Bacan, Amron, Seram, Kei island, Aru island, and Sulawatti.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In many islands of eastern Indonesia, this species is widespread and common. In a few places it is extremely abundant, particularly at higher altitudes; in others, it has been greatly reduced by overhunting, deforestation, and expanding human settlement.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Overall, however, Sulawesi warty pig populations are declining, probably due to increased hunting and to human alterations of the animal's habitats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This pig inhabits varied environments, including rain forest, mountain forest, grasslands, and agricultural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p77.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the common pig, the Sulawesi warty pig has broad dietary preferences. It feeds on roots, fallen fruit, leaves, and young shoots. The bulk of its food consists of vegetable materials, but it also feeds on earthworms, insects, aquatic invertebrates, rats, birds, and even carrion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The uterus and placenta are anatomically indistinguishable from those of the common pig. The litter size is from 2 to 8 piglets, with an average of 5.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sows can give birth throughout the year, but usually have their young in April or May. The gestation period is about 4 months.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeding and farrowing occur in the forest and in open Imperata cylindrica grasslands. The pregnant female makes a nest of grasses, leaves, twigs, and branches, which she collects and places over a hole (approximately 2 m long) that she has previously dug. Here she gives birth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Foraging is the main activity of the day and usually takes up several hours, mainly in the early morning and evening. In the wild the pigs travel in small groups, the young always traveling with an adult female. On the move, warty pigs feed and rest intermittently.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As a source of meat the Sulawesi warty pig has been recognized and exploited by local populations since prehistoric times. The presence of feral specimens far outside the pigs' natural range indicates that traders or migrants have long carried it with them on voyages, either as domestic stock or as wild specimens to be released for later capture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tusks, which can be carved like ivory, are a resource for local artisans. Wild specimens are suitable for sport hunting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a body of unrecorded indigenous experience with this animal as a domesticate, but the information needs to be collected and appraised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Sulawesi warty pig may be expected to possess resistance or tolerance to the many diseases prevalent in its native habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is promising potential for hybridization between this species and domestic pigs, which might lead to the improvement of common pigs in tropical regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apart from the unwritten knowledge of the indigenous people who raise the species, very little information is available on the characteristics and management of this animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The genetic variability within the species, as well as the karyotypic differences with common pigs and other Sus species, should be defined. Further, the hybrid vigor resulting from crossbreeding with other Sus species should be- quantified under controlled conditions. Apart from producing potentially important heat-tolerant livestock, crossbreeding may shed important light on the origins of the common pig in Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal's nutritional requirements and reproductive biology also need study. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p79.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">13 Javan Warty Pig</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Javan warty pig (Sus verrucosus) apparently has never been domesticated, but it has been a resource for hunting peoples for centuries. Now, however, the human population in its native region is predominantly Moslem, and all pigs are widely regarded as agricultural pests. Increasing numbers of them are poisoned each year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Javan warty pig can be up to 1.35 m long and 0.9 m tall. Mature males usually weigh between 80 and 120 kg; females are only half that weight - an unusually dramatic example of sexual dimorphism. The animal has a markedly elongated face with large warts, particularly the infraorbital wart and the smaller preorbital and mandibular warts. Body hairs can be black, red, or yellow, with black tips.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This species is found only on the Indonesian islands of Java and Bawean. It was formerly found on Madura as well, but because of deforestation it is now thought to be extinct there. Two extant subspecies are recognized. The nominate one, Sus verrucosus verrucosus, occurs on mainland Java. The second, Sus verrucosus blouchi, a smaller animal, has recently been described on Bawean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For years it was thought that the Javan warty pig was extinct in the wild, but in October 1981 a herd was found in a small area on Mount Penanggungan in East Java. This population may prove to be substantial, and there is reason to hope that other populations can be found. Overall, however, it is clear that the Javan warty pig is endangered and declining in numbers. In many areas the animals are subjected to uncontrolled poisoning and hunting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Five new reserves have recently been proposed to protect the animal in a variety of habitats because it is not found in appreciable numbers in any of Java's nature reserves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Bawean subspecies is believed to be relatively secure since the establishment of a large reserve.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A breeding colony of 12 Javan warty pigs at the Surabaya Zoo includes 5 young ones born in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitats of the Javan warty pig appear to be confined to elevations below about 800 m. The animals prefer relatively large expanses of grassland or secondary vegetation, where human population is sparse. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p82.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The piglets can be born throughout the year; in one study of 8 sows the litter size ranged from 2 to 8, with a mean of 5.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The (diploid) chromosome number has been found to be 38, the same as that of the common pig. Hybridization between these species is thought to occur in the wild, but apparently not with enough frequency to contaminate the Javan warty pig gene pool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unreported.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These are omnivorous, adaptable animals that might make useful domesticates.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The small size of the sows could make this species particularly appropriate for households or smallholder farms. The animal's genetic "distance" from the domestic pig may make it a useful generator of hybrid vigor in crossbreeds. It could have particular value because its meat is much leaner than pork from the common pig.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The numbers in the wild are now too few to permit any cropping.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Efforts should be directed towards locating and breeding up the Javan warty pig populations that still exist. An immediate need is to isolate pure populations in reserves because it is essential to protect the animal from crossbreeding with other species. In addition, current specimens in zoos should be cataloged and a breeding program established. Other captive breeding colonies should also be started.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important to determine the genetic differences between the Javan warty pig and the common pig, as well as the levels of existing hybridization between them. It is also necessary to determine what variation in karyotype may exist within the populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Basic ecological and behavioral studies are needed, as well as studies of the dietary requirements, growth rates, and nutritional physiology of captive specimens. The reproductive biology of the animal should be studied, and the possibility of crossbreeding it with other Sus species should be examined under controlled conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Javan warty pig's potential for local meat production should be evaluated. The benefit to rural people of converting an agricultural pest into a profitable source of income should be explored within the local religious context. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p84.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">14 Pigmy Hog</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pigmy hog (Sus salvanius), a shy and very small pig of northeastern India, is close to extinction because of hunters and the destruction of its habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pigmy hog is only about 60 cm long, with a shoulder height of about 25 cm and a body weight of less than 10 kg. The hair is medium brown on the sides, darkening to blackish brown along the mid-dorsal line. A facial band of short, dark hair extends from the bridge of the nose to below the eye. The tiny tail is only 3 cm long.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This animal was once widely found along the southern foothills of the Himalayas; today, it is definitely known to occur in only one area, the Manas National Park in Assam.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigmy hogs are seriously endangered; in the wild they are close to extinction. Captive animals are now reduced to a single male in the Assam State Zoo and four male siblings in the Zurich Zoo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The few remaining pigmy hogs mainly inhabit tall-grass savannas, but it seems likely that they could adapt to other environments. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigmy hog. (W.L.R. Oliver)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal is omnivorous and consumes roots, tubers, grass, leaves, insects, earthworms, eggs, and carrion. While foraging, it undoubtedly consumes large quantities of earth as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The chromosome number, 38, is the same as that of the common pig. The karyotype is similar to that the common pig, but small, significant differences have been demonstrated using chromosome banding techniques.*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The age at puberty, time of weaning, length of gestation and estrous cycle, and season of breeding are not yet known with certainty. However, the animal is known to have a single well-defined birth peak (April/May) that coincides with the onset of the rainy season when the food supply increases. The uterus and placenta are anatomically similar to those of the common pig. The litter size varies from 2 to 6. It is not known if the animal can be crossbred with the common pig.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY"><center><img src="p87.png"></center><br>
+ Distribution of pigmy hog. (W.L.R. Oliver)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals are shy, but can be tamed. They tend to forage and run in groups. Nest building is carried out by both males and females and is not restricted to pre-farrowing periods.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is no evidence that the pigmy hog has ever been domesticated; it has, however, been extensively hunted and trapped, and recently it was still being sold for human consumption. There would probably be no inherent difficulty in maintaining this species in husbandry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pigmy hog's small size may make it useful in studies of the physiology of pigs and like mammals. In particular, a study of the uterine capacity may contribute to our understanding of the maternal factors that influence the number and size of mammalian young at birth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is unknown if the animal carries genetic resistance to diseases of the domestic pig, but given its habitat, such resistance seems likely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The small numbers of surviving pigmy hogs obviate any consideration of its use in husbandry at the present time. Moreover, its nervous temperament might restrict its potential as a domesticate. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is essential to ensure the survival of this animal. Efforts should be directed towards locating and breeding up the populations that still exist. If its habitat could be protected by preventing the annual dry-season burning of grasses, it is possible that substantial populations could be established. Attempts should also be made to acquire two or more females as mates for the male pigmy hogs at the Assam and Zurich zoos.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is also an urgent need to ensure that the animals breed successfully in captivity, and the wealth of international expertise in pig reproduction should be applied to that end. For example, the reproductive biology of the animal could be studied by swine experts; the age at puberty, the length of the estrous cycle, the season of breeding (and whether it is influenced by light or temperature), the length of gestation, and time of weaning all need to be determined.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal is an omnivore, but the physiology of its digestion has not been studied. Thus, its nutritive requirements are not well enough known to ensure its survival in captivity or reserves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experiments should be made to determine if pigmy hog embryos can be brought to term in the uterus of the common pig. If so, such embryo transfers could be used to distribute embryos and set up new herds, lessening the risk of this species" extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p88.png"></center><br>
+ Adult male of the common pig (wild boar Sus scrofa) and pigmy hog drawn to the same scale. (W.L.R. Oliver) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">15 The Babirusa</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The babirusa (Babyrousa babyrussa) is a piglike animal whose closest relative appears to be an ancestral animal that lived in Europe 35 million years ago. It is easily tamed, and in its native area there is an ancient tradition of raising young babirusa for meat and for the males' unique tusks. The animal appears to reproduce well in captivity, and with good management techniques it might gain wide use in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appearance and Size</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Male babirusa can be up to 110 cm long and 80 cm tall and weigh up to 100 kg; females are smaller. The male has large upper canines that grow upwards, piercing right through the flesh of the snout and curving back and downwards towards the forehead without ever entering the mouth. The female may sometimes have small upper canines projecting through the skin of the upper lip.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animal is more slender than a pig of similar size. It has a gray or brown-grey skin color, although one subspecies, Babyrousa babyrussa babyrussa, has light body hair that is fawn colored or black.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The babirusa is unique to a few islands of eastern Indonesia: north, central, and southeast Sulawesi, the Togian Islands, and the Sula (Taliabu and Sulabesi) and Buru Islands. On Sula and Buru it is probably not native but was introduced in prehistoric times.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On Sulawesi the babirusa remains abundant, despite hunting and the widespread clearing of the forest. Nevertheless, disturbances created by wood and rattan collectors, hunters, loggers, and farmers threaten the babirusa's survival. Throughout the rest of its range, it is also vulnerable to extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biologists are particularly concerned about some of the babirusa subspecies. The one from the north of mainland Sulawesi, Babyrousa babyrussa celebensis, is still relatively abundant in places and is probably in no immediate danger. The Togian Islands' subspecies, Babyrousa babyrussa togeanensis, is abundant in small islands but is threatened by Indonesia's settlement programs and deforestation. The Buru and Sula Islands subspecies, Babyrousa babyrussa babyrussa, may already be extinct; there have been no confirmed sightings in recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1981, there were 26 male and 27 female babirusa held in six zoo collections; 22 of these animals are in the Surabaya Zoo in Indonesia, where they breed well. Most, if not all, are believed to belong to the mainland Sulawesi race.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat and Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The animals mainly inhabit moist forests at low altitudes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p91.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Biology</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Precise details of babirusa biology are unknown, but the stomach has an extra sac, suggesting that the animals may have some ability to break down cellulose. Indeed, they browse leaves, a behavior more often found in a deer than in a pig, and have been referred to as "ruminant pigs." Babirusa also live on roots, berries, and grubs, making them true omnivores. Compared to other pigs, they do little rooting, and in captivity their enclosures remain quite grassy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Babirusa are said to be sexually mature at 5-10 months, but this depends on nutrition. Gestation length is about 158 days. One or two young are produced although there are some reports of litters of three.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One specimen was kept for 24 years in captivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Behavior</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The babirusa is a social animal that moves in groups. A retiring native of the dense jungle, it is a fast runner and swims readily. Mating behavior in captivity generally resembles that of domestic pig. Evidence from zoo animals suggests that the male must be removed from the young at birth but that by the time they are a month old the young are safe from paternal attack.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uses</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When captured young or reared in captivity, the babirusa is easily tamed. It has potential as a domesticated species, and with appropriate management may provide a useful source of meat. The meat is tasty and of good quality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its unique tusks, the skull of the male finds ready markets. This could provide additional income to farmers raising babirusa for meat. The ivory of the tusks could also be a resource for local artisans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Potential Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, the anatomy of the stomach suggests that the babirusa may be able to make more efficient use of fibrous foodstuffs than other pigs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The babirusa produces only one or two young after a gestation period of just over five months; it may therefore take considerable time to build up herds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the babirusa is easily tamed, it is not known whether it can be husbanded in large groups. Also, present lack of knowledge of the animal's nutrition may restrict its husbandry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Conservation Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The number of animals in the wild is decreasing, and attempts should be made to determine their exact status. Particular attention should be paid to the subspecies Babyrousa babyrussa togeanensis and Babyrousa babyrussa babyrussa. Captive breeding programs for these subspecies should be started.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p93.png"></center><br>
+ When seen in longitudinal section, the stomach of babirusa presents striking similarities  to that of a relatively simple ruminant such as the domestic sheep. Every part except the  omasum, even including a rudimentary reticulum, is represented and occupies the same  relative position. The babirusa stomach differs from that of the domestic pig chiefly in  the enormous size of the diverticulum ventriculi, the prominence of the constrictions  that delimit its three main divisions, and in the size and complexity of the cardia. Regions  corresponding to parts of the ruminant stomach are labeled in brackets. (Information  from Davis, 1940; diagram courtesy Field Museum of Natural History, Chicago.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild populations should be maintained in several regions to ensure that  the species" genetic base is retained. Advantage could be taken of the large  number of islands in eastern Indonesia to establish reserves for the different  babirusa subspecies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Currently, little is known about the biology of the animal in the wild its  diet, social behavior, or reproductive performance are almost unstudied. In  view of the relatively small number of babirusa in zoos and the scarcity of  information about the animal's growth rate and general biology, coordinated  studies between zoos could provide much basic information. It has been  suggested that a studbook be initiated for this species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is clear from chromosome analysis that this pig differs markedly in  its karyotype from that of other pigs. However, more anatomical and  biochemical knowledge is needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Basic parameters of the animal's reproductive physiology are not known.  Questions to be answered include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Can the babirusa be induced to reproduce twice per year?</P>
+<P ALIGN="JUSTIFY">· Can babirusa embryos be developed to term in the uterus of the domestic  pig? If so, can the number of babirusas be rapidly multiplied in this way?</P>
+<P ALIGN="JUSTIFY">· Does the babirusa genotypic and gestation-length difference with the  common pig prevent the two from successfully crossbreeding? And if  crossbreeding can be achieved, will the progeny be fertile?  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p94.png"></center><br>
+ FIGURE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Part IV : Recommendations and  General Research  Needs</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Asian animals described in this report are a natural resource whose  potential is barely glimpsed. They are virtually unknown to established  livestock interests and there has been little thought to developing them as  livestock. As a result, the research and trials that could lead to further use of  these animals is scattered, small scale, and conducted outside the mainstream  of livestock science, mainly by wildlife conservationists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet these animals seem worth considering for use in husbandry in many  tropical regions, especially where poor grazing and harsh environments limit  the performance of conventional livestock. There is a pressing need for  research to develop these species and to explore their potential. Only through  rapid action can many of them be kept available for study and possible  inclusion in agriculture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One suggestion is that funds be provided to establish an Asian  native-livestock research-support team. Its primary purpose would be to  assist in the funding of research projects and to coordinate research being  done in various Asian countries. The team's goal would be to establish a  network of animal scientists based at institutions in Asia and elsewhere to  work cooperatively on the region's little-known bovines and pigs. In this  manner, relatively small sums of money could be used to stimulate and  coordinate Asia-wide research on indigenous animals.*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Basic Research</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The time has come for basic studies on each of the 15 animals discussed in  this book. For each species, the following areas should be investigated:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· Physiology</P>
+<P ALIGN="JUSTIFY">· Reproductive requirements and fertility</P>
+<P ALIGN="JUSTIFY">· Nutritional requirements (such as food preferences, feeding strategies, and food utilization)</P>
+<P ALIGN="JUSTIFY">· Growth</P>
+<P ALIGN="JUSTIFY">· Adaptability and environmental tolerance (for instance, water balance, sweat rate, and shade-seeking habits, as well as temperature, pulse, and respiration rates, both under normal conditions and heat stress)</P>
+<P ALIGN="JUSTIFY">· Diseases</P>
+<P ALIGN="JUSTIFY">. Management (including stocking rates and other production characteristics</P>
+<P ALIGN="JUSTIFY">· Genetic selection for calm temperament, quick growth, and other desirable qualities</P>
+<P ALIGN="JUSTIFY">· Crossbreeding to take advantage of hybrid vigor</P>
+<P ALIGN="JUSTIFY">· Social structure (for example population density and distribution, social organization, leadership, herding potential, aggressiveness of bulls)</P>
+<P ALIGN="JUSTIFY">· Habitat characteristics (behavior-habitat interactions and herd dynamics, for instance).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Studies are also needed on better utilization of products, such as milk, meat, hides, horn, and hair, from these animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experimental transfer of fertilized eggs of all of these animals into domestic species should be explored with a view to establishing herds in secure and disease-free areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Efforts specific to domesticated and wild species, and to hybrids of these species, are discussed below. The report concludes with brief discussions of a few promising species not taken up in the body of the text.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated Species Improving Performance</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little data is available on the performance of the domesticated animals discussed in this report. Yet the main value of these species lies in the new and superior genes and gene combinations that can be adapted to animal production in the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Studies need to be conducted with the indigenous species and strains in their native countries to determine if they will respond to improved conditions with improved performance. These projects could provide opportunities for geneticists and animal breeders to improve livestock production while conducting challenging basic research. It would be helpful to establish studbooks of captive specimens and to select and breed for desirable genetic qualities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Genetic improvement must be directed towards remedying production deficiencies. Methods include selection of superior breeding animals, crossbreeding, and combinations of selection and crossbreeding. Different genetic improvement techniques will be required for each species. Progress should be regularly monitored against the unselected animals and the domestic livestock breeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Introductions</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tropical countries should import breeding stock to evaluate the performance of some of these Asian animals in the local environment. Strict quarantine procedures must, of course, be observed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Special emphasis should be placed on the domesticated banteng of eastern Indonesia. These animals are already an important source of human food and they may have considerable potential for increasing production elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild Animals</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild animals contribute extensively to the welfare of people and economies of developing countries. In many areas they supply much of the animal protein consumed. But the contributions they make are largely unrecorded, and local officials and aid agencies seldom regard wildlife as an economic resource. As a result, few developing countries have analyzed how their people use indigenous animals for subsistence, and few nutritional studies recognize "bushmeat," although large numbers of people eat it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wildlife's contribution justifies more detailed and precise evaluations. In many tropical regions few people even know what species are present, let alone in what numbers. Ecologists and animal scientists should be employed to identify and collect data on the fauna of the tropical forests and how it is used by local people. Their work will provide baseline information on the species present and on the potential utility of the undisturbed natural ecosystems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initial Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All wildlife utilization must be based on a thorough knowledge of the resource, its numbers, the animals' condition, annual recruitment in the </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">various populations, and the seasonal movements of the herds. In addition, it is important to understand the interactions of the species with its habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thus, the immediate need is for action to assure the preservation of populations of these animals until research studies can be conducted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this regard, priority actions include the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Establishing adequate preserves</P>
+<P ALIGN="JUSTIFY">· Providing total protection for remaining animals</P>
+<P ALIGN="JUSTIFY">· Preventing poaching.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With few exceptions, the wild species described in this report are under the pressures of agricultural and human expansion. Without efforts to preserve their habitats it will be difficult for these species to survive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Developing Wildlife Resources</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments cannot stop hungry people from hunting game, but they can use this impetus to help protect some indigenous animals as well as forest and woodland habitats. Fostering the production and supply of wild animals such as those described in this book could open up a new: source of meat and other products, particularly for subsistence farmers in remote areas. In the last analysis, this may be the only way of protecting and maintaining these animals and developing local awareness of their value.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International economic development organizations have traditionally shown little interest in wildlife or wildlife habitats. Yet maintaining these animals and their habitats is crucial to the continuing supply of many indigenous food animals, the most important of which are often the smaller ones that flourish in secondary growth. And the forests that support wildlife also protect some of the huge investments that AID, the World Bank, and other other agencies have made to help developing countries. The forest is the sponge that absorbs the water from tropical rains. Without trees covering the watersheds, heavy rains cause rushing water that erodes the land, despoils highways, silts up dams and reservoirs, knocks out bridges, and inundates towns, villages, and farm fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In principle, the farming of tropical wildlife could become a force in preventing clear-felling of the tropical forests. Rational utilization of tropical animals offers productive alternative use of the land. In some cases, the farming of indigenous animals can fit smoothly into tropical habitats and into traditional village life, because the livestock and its needs are usually familiar to local people and are often ingrained in their traditions.( For successful examples see companion reports nos. 44 and 45, Butterfly Farming in Papua New Guinea and Crocodiles as a Resource for the Tropics. </P>
+<P ALIGN="JUSTIFY">Hybrid Animals)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hybridization may offer new prospects for using underexploited tropical animal resources. This is a speculative notion, but it deserves serious attention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crossbreeding between the animals mentioned in this report holds exciting possibilities for expanding livestock options in the tropics. Some of the crosses, known or envisaged, are:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· gaur x cattle</P>
+<P ALIGN="JUSTIFY">· banteng x cattle</P>
+<P ALIGN="JUSTIFY">· kouprey x cattle</P>
+<P ALIGN="JUSTIFY">· yak x cattle</P>
+<P ALIGN="JUSTIFY">· yak x banteng</P>
+<P ALIGN="JUSTIFY">· anoa x water buffalo</P>
+<P ALIGN="JUSTIFY">· tamaraw x water buffalo</P>
+<P ALIGN="JUSTIFY">· domestic pig x warty pigs</P>
+<P ALIGN="JUSTIFY">· warty pigs x bearded pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Care must be taken, however, to guard against the dilution of wild genes by the escape of hybrid or interbreeding domestic species, or the establishment of feral hybrid populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">International Exchange of Pig Germ Plasm</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Present veterinary restrictions effectively prevent the movement of pigs between most countries. Relatively few species of wild pigs are therefore maintained in zoos outside their countries of origin. This stifles the promising potential for the species described in Part III, as well as for captive-breeding safeguards and research on the endangered species. It is important that attempts be made to identify channels for the future establishment of viable captive stocks both within Asia and elsewhere. Transfer of embryos should be verified as a means of permitting disease-free movement across frontiers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Species Not Covered in this Report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This project, which began as a short report on banteng, quickly developed momentum as it brought in suggestion after suggestion of further species. Through pressures of time and budget, it was not possible to take up all of these interesting animals. Some of the omitted ones are listed below. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Takin (Budorcas taxicolor).* A heavily built, Southeast Asian hoofed mammal of the family Bovidae, the takin lives in small herds in the mountains, often above timberline. Though robust and short-legged, it can move about quickly and easily over difficult slopes. It stands up to about 1 m at the shoulder and has a shaggy yellowish- to blackish-brown coat. Both sexes have heavy horns that turn outward from the center of the forehead and then curve up and backward.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goral (Naemorhedus goral).* This small Asian goatlike bovine has slightly backward curving cylindrical horns and a coarse brownish-grey coat. It is related to the chamois and serow (see below) but is distinguished from them by peculiarities in skull form, as well as by smaller size, shorter horns, and the absence of face glands. Gorals are native to a vast area, ranging from the Himalayas to eastern Siberia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Serow (Capricorhis sumatrensis). The serow has been called a "goatantelope." Found in Sumatra, the Malay Peninsula, Vietnam, Thailand, Burma, the eastern Himalayas, and China, it lives on forest-clad slopes, such as the mountains of southern China that are the home of the giant panda. Serows have coarse black hair, long pointed ears, a distinct mane, and short, backward pointing horns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Native species of goats are also valuable genetic resources of Asia and examples include ibex (Capra ibex), markhor (Capra falconeri), and bharal (Pseudois nayaur). There are also various species of sheep, including the various races of argalis (Ovis ammon), which form small herds in the mountains, often above timberline. Although robust and short-legged, these animals can move about quickly and easily over difficult slopes. Soviet animal breeders apparently are exploring some of the possibilities of using argalis in animal husbandry. They are crossing domestic sheep with arkhar (Ovis ammon karelini) to produce a commercially viable hybrid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The marketable size of lamb might be increased appreciably to provide larger, leaner cuts of meat by crossing domestic sheep with the Marco Polo sheep (Ovis ammon polii), which is as big as deer and has a mature body weight of 400-500 pounds. Marco Polo sheep meat is reported to have none of the "mutton" favor of domestic sheep. Thus, crosses might enhance consumer acceptance of sheep meat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asia also has several species of deer that could have been included.§ The musk deer (Moschus moschiferus) is now domesticated in China for musk production and is a resource with a promising future. Also, sambar deer (Cervus unicolor), Asia's largest deer, may prove useful in husbandry. Several deer species are being farmed in New Zealand and ruse deer (Cervus rusa), which are native to South and Southeast Asia, are being farmed in Mauritius, Australia, and Papua New Guinea for meat and medicinal by-products. Two small, goat-sized Asian deer, the hog deer (Cervus porcinus) and the barking deer (Muntiacus muntjak), may also be worth considering. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p101.png"></center><br>
+ KOUPREY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendixes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Selected Readings</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">General</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bohlken, H. 1961. Haustiere und Zoologische Systematik. Zeitschrift fur Tierzuchtung und Zuchtungsbiologie76:107-113.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul, and J. A. McNeely. 1977. Mammals of Thailand. Association for the Conservation of Wildlife, Bangkok, Thailand. 758 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corbet, G. B., and J. E. Hill. 1980. A World List of Mammalian Species. British Museum of Natural History, London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Groves, C. P. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Genus Sus. Department of Prehistory Technical Bulletin No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gray, A. P. 1972. Mammalian Hybrids: A Check-List with Bibliography. Commonwealth Technical Communication No. 10 (Rev.). Bureau of Animal Breeding and Genetics, Edinburgh, Scotland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Honacki, J. H., K. E. Kinman, and J. W. Koeppl. 1982. Mammal Species of the World. Allen Press, Lawrence, Kansas, USA. 694 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mochi, U. and T. D. Carter. 1953. Hoofed Mammals of the World. Charles Scribner's Sons, New York.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Payne, W. J. A. 1970. Cattle Production in the Tropics. Longman, London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robbins, C. T. In Press. Wildlife Feeding and Nutrition. Academic Press, New York, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Walker, E. P. 1975. Mammals of the World. The Johns Hopkins University Press, Baltimore, Maryland, USA, and London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wharton, C. H. 1969. Man, fire and wild cattle in Southeast Asia. Tall Timbers Fire Ecology Conference 8: 107-167.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated and Wild Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appleton, D. C., G. Dryden, and A. C. Kondos. 1976. A comparison of the digestive efficiency of the water buffalo and Brahman and Banteng cattle. In Proceedings of the Australian Society of Animal Production 11.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Budiarso, I. T., and S. Hardjosworo. 1976. Jembrana disease in Bali cattle. Australian Veterinary Journal 52(2):97.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Copland, R. S. 1974. Observations on banteng cattle in Sabah. Tropical Animal Health and Production 6(2):89-94.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Darmadja, D., and P. Sutedja. 1975. Gestation period and calving interval in Bali cattle. Majalah Ilmiah Universitas Udayana 9:61 -65.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Darmadja, D., and P. Sutedja. 1976. Masa kebuntingan den interval beranak padas sapi Bali. In Proceedings, Seminar Reproduksi den Performance Sapi Bali, April 5-6, 1976. Dinas Peternakan Daerah Ternak Institute, Bali, Indonesia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Devendra, C., T. Lee Kok Choc, and M. Pathmasingam. 1973. The productivity of Bali cattle in Malaysia. Malaysian Agricultural Journal 49(2):183-197.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Holmes, J. H. C., J. H. Schottler, and T. F. Leche. 1977. Southeast Asian cattle, buffalo, and beef in Papua New Guinea. In Agriculture in the Tropics, B. A. C. Enyi and T. H. Varghese, eds. University of Papua New Guinea, Port Moresby, Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hoogerwerf, A. 1970. Udjung Kulan, The Land of the Last Javan Rhinoceros. E. J. Brill, Leiden, The Netherlands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hooijer, D. A. 1956. The valid name of the banteng Bibos javanicus d'Alton. Zoologische Mededelingenuitgegeven door het Rijksmuseum van Natuurlijke Historie te Leiden 34:223-226.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jellinek, P. J., J. Avenell, A. Thahar, and P. Sitorus. 1980. Infertility associated with crossbreeding of Bali cattle. In Proceedings, 2nd Ruminant Seminar, Ciawi, Indonesia. 79 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jenkinson, D. M., and T. Nay. 1975. The sweat glands and hair follicles of different species of Bovidae. Australian Journal of Biological Science 28:55-68.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kirby, G. W. M. 1979. Bali cattle in Australia. World Animal Review 31 :24-29.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mason, 1. L. In Press. Evolution of Domesticated Animals. Longman, London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meijer, W. C. P. 1962. Das Balirind (Balinese Cattle). Die Neue Brehm-Bucherei, No. 303, A. Ziemsen Verlag, Wittenberg Lutherstadt, Federal Republic of Germany. (Translated from the Dutch by E. Mohr.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1973a. Liveweight changes of Brahman cross, Shorthorn, Banteng and buffalo steers grazing improved pastures at Darwin, Northern Territory. Journal of the Australian Institute of Agricultural Science 39:68-9.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1973b. Heat tolerance of Brahman cross, buffalo Banteng and Shorthorn steers during exposure to sun and as a result of exercise. Australian Journal of Agricultural Research 24:775-782.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1978. Digestibility and water metabolism in Brahman cross, buffalo, Banteng and Shorthorn steers fed roughage diets. Journal of the Australian Institute of Agricultural Science 44: 57-59.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1980. The prediction of chemical content of the whole carcass from the physically-dissected rib in cattle and buffaloes. Proceedings of the Australian Society of Animal Production 13:503.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1981. Beef and buffalo production by smallholders in Indonesia. World Review of Animal Production 17:55-64.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1982. The performance of Indonesian beef breeds under traditional and improved management systems. Pp. 347-351 in Animal Production and Health in the Tropics, M. R. Jainudeen and A. R. Omar, eds. Universiti Pertanian Malaysia, Serdang, Selangor, Malaysia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B., B. W. Norton, and J. V. Nolan. 1979. The intake, digestibility and utilization of a low quality roughage by Brahman cross, buffalo, Banteng and Shorthorn steers. Australian Journal of Agricultural Research 30:333-340.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Namikawa, T., and W. Widodo. 1978. Electrophoretic variations of hemoglobin and serum albumin in the Indonesian cattle including Bali cattle (Bos banteng). Japanese Journal of Zootechnical Science 49(11):817-827.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nitis, 1. M., K. Rika, M. Supardjata, K. D. Nurbudhi, and L. R. Humphreys. 1976. Productivity of improved pastures grazed by Bali cattle under coconuts: a preliminary report. Universitas Udayana, Denpasar, Bali, Indonesia. 18 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nitis, 1. M., and K. Rika. 1978. Bali cattle grazing improved pasture under coconuts. 1. Effects of stocking rate on steer performance and coconut yield. In Seminar on Integration of Animals with Plantation Crops, April 13-15. Preprint No. 10. Penang, Indonesia. 8 pp</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nitis, 1. M. 1979a. Effects of replacing 30 percent of the green roughage with concentrate on the performance of Bali steer. Progress report to the International Development Research Centre, Ottawa, Canada. Centre file:3-P77-0087. 25 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nitis, 1. M. 1979b. Performance of Bali cattle fed grass supplemented with stylosanthes. Progress report to the International Foundation for Science, Sweden. Project No. RR 76. 15 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nitis, 1. M., K. Lana, 1. B. Sudana, N. Sutji, and 1. C. N. Sarka. I980. Persediaan den kebutuhan hijauan ternak di Bali (Roughage supply and requirement of livestock in </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bali). Fakultas Kedokteran Hewan den Peternakan, Universitas Udayana, Denpasar, Bali, Indonesia. 218 pp. (Report series mimeograph.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Norton, B. W., J. B. Moran, and J. V. Nolan. 1979. Nitrogen metabolism in Brahman cross, buffalo, Banteng and Shorthorn steers fed on low quality roughage. Australian Journal of Agricultural Research 30:341.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nursamad, M. 1972. Berat lahir den petumbuhan anak sapi Bali selama 4 bulan di kecamatan Watang Pulu, kabupaten Sidenreng, Sulawesi Selatan. Laporan, Fakultas Peternakan Universitas Hasanuddin yang berafinasi dengan Fakultas Peternakan Institut Pertanian Bogor, Bogor, Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pastika, M., and D. Darmadja. 1976. Performance reproduksi sapi Bali. In Proceedings, Seminar Reproduksi den Performance Sapi Bali, April 5-6, 1976. Dinas Peternakan Daerah Ternak Institut, Bali, lndonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Payne, W. J. A., and D. H. L. Rollinson. 1973. Bali cattle. World Animal Review 7: 13-21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pulungan, H., and K. Ma'sum. 1977. Performance sapi Bali den hasil persilangannya dengan sapi Hereford den Shorthorn. Laporan Khusus Lembaga Penelitian Peternakan, Cabang Grati 1977 (Abstract).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robinson, D. W. 1977. Livestock in Indonesia. Research Report No. 1. Centre for Animal Research and Development, Bogor, Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Siebert, B. D., and W. V. MacFarlane. 1969. Body water content and water turnover of tropical Bos taurus, Bos indicus, Bibos banteng, and Bos bubalus bubalis. Australian Journal of Agricultural Research 20:613-622.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Siregar, M. G., and 1. M. Suparjata. 1975. A half century existence of Bali cattle in South Sulawesi. Majalah llmiah Universitas Udayana 9: 13-21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Subandriyo, P. Sitorus, M. Zulbardi, and A. Roesyat. 1979. Performance of Bali cattle, as work animals and milk and beef producers. Indonesian Agricultural Research and Development Journal 1(1/2):9-10, 24.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sutedja, P., M. Kota, 1. B. Mantra, and D. Darmadja. 1976. Progress report beberapa performance pada sapi Bali. In Proceedings, Seminar Reproduksi den Performance Sapi Bali, April 5-6, 1976. Dinas Peternakan Daerah Ternak Institut, Bali, Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thahar, A., J. B. Moran, and J. T. Wood. In press. Studies on the haemotology of Indonesian large ruminants. Tropical Animal Health and Production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thahar, A., J. B. Moran, and R. E. Soerifpo. In press. Observations on the hair and skin of Indonesian large ruminants and their relationships to heat tolerance. SABRAO Journal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vercoe, J. E., and J. E. Frisch. 1977. The importance of voluntary feed intake and metabolic rate to production in different genotypes of cattle in different environments. Pp. I(c)-42 in Proceedings of the 3rd International Congress of the Society for the Advancement of Breeding Researchers in Asia and Oceania, Canberra, Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yeates, N. T. M., and P. J. Schmidt. 1974. Beef Cattle Production. Butterworths Pty Ltd., Chatswood, Sydney, Australia. 323 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng Cattle Hybrids</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Payne, W. J. A., and D. H. L. Rollinson. 1976. Madura cattle. Zeitschrift fur Tiezuchtung und Zuchtungsbiologie 93:89-100.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mithan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Simoons, F. J., and E. S. Simoons. 1968. A Ceremonial Ox of India: The Mithan in Nature, Culture, and History. The University of Wisconsin Press, Madison, Wisconsin, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mason, 1. L. In Press. Evolution of Domesticated Animals. Longman, London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scheurmann, E. 1975. Observations on the behaviour of the mithan (Bibos frontalis Lambert 1837) in captivity. Applied Animal Ethology I :321 -355. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yak and Yakow</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Accolas, J. P., and J. P. Deffontaines. 1970. Quelques donnees sur l'elevage du Yak en Republique Populaire de Mongolie. Pp. 133-141 in The Yak: Its Role in the Economic and Cultural Life of Breeders in Central Asia. Societe d'Ethnozootechnie, 25 Boulevard Arago, 75013 Paris, France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bonadonna, T. 1970. Nuove possibilita per la Zootechnia dei tropic). Zootecnica e Veterinaria 25:202-221.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bonnemaire, J. 1976. Le Yak domestique et son hybridation. Pp. 46-77 in The Yak: Its Role in the Economic and Cultural Life of Breeders in Central Asia. Societe d'Ethnozootechnie, Paris, France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dor, R. 1976. Note sur le Yak au Pamir. Pp. 126-131 in The Yak: Its Role in the Economic and Cultural Life of Breeders in Central Asia. Societe d'Ethnozootechnie, Paris, France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ekvall, R. B. 1968. Fields on the Hoof: Nexus of Tibetan Nomadic Pastoralism. Holt, Rinehart and Winston, New York, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Epstein, H. 1974. Yak and chauri. World Animal Review 9:8-12.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Epstein, H. 1977. Yak and Yak-cattle hybrids. Chapter 3 in Domestic Animals of Nepal. Holmes and Meier Publishers, Inc., New York, USA, and London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ivanova, V. V. 1938. K voprosu izucenija plodovitosti samvoc gibridov jaka s rogatym skotom (On the fertility of male yak x cattle hybrids). Izvestiya Akademii Nauk SSSR, Seriya Biologicheskaya 883-884.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Phillips, R. W., R. G. Johnson, and R. T. Moyer. 1945. The livestock of China. Pp. 67-76 in United States Department of State Publication No. 2249; Far Eastern Series 9.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Phillips, R. W., I. A. Tolstoy, and R. G. Johnson. 1946. Yaks and Yak-cattle hybrids in Asia. The Journal of Heredity 37(6): 162-170; 37(7):206-215.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schley, P. 1967. Der Yak und seine Kreuzung mit dem Rind in der Sowjetunion. Giessener Abhandlungen zur Agrar- und Wirtschaftsforschung des Europaischen Ostens, Vol. 44. Otto Harassowitz, Weisbaden, Federal Republic of Germany. 131 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shahrani, M. Nazif Mohib. 1979. The Kirghiz and Wakki of Afghanistan. University of Washington Press, Seattle, Washington, USA. 264 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vlasov, P., S. Gersenzon, and A. Poljakov. 1932. Gibridizacija mezdu jakom i krupnym rogatym skotom (Hybrids between yak and cattle). Problemy Zhivotnovodstva (1):48-57.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">White, W. T., R. W. Phillips, and E. C. Elting. 1946. Yaks and Yak-cattle hybrids in Alaska. Journal of Heredity 37:355-358.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zawadowsky, M. M. 1931. Zebu-Yak hybrids. Journal of Heredity 22:297.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zuitin, A. I. 1938. New data on the chromosome number in yak (Poephagus grunniens L.). Doklady Akademii Nauk Uzbekskoi SSR 19:201-202.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A unique, interesting film showing wild banteng, gaur and kouprey in Cambodia in 1951</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">is available for hire from The Coolidge Foundation, 38 Standley Street, Beverly, Massachusetts 01915, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul and J. A. McNeely. 1977. Mammals of Thailand. Association for the Conservation of Wildlife, Bangkok, Thailand. 758 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fischer, H., and E. Scheurmann. 1977. Cytogenetic investigations on domestic and wild animal populations in South and Southeast Asia. Animal Research and Development 6:63-71.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Halder, U. 1975. Okologie und Verhalten des banteng (Bos javanicus) in Java. Eine Feldstudie. Verlag Paul Parey, Hamburg and Berlin, Federal Republic of Germany. 124 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hoogerwerf, A. 1974. Report on a Visit to Wildlife Reserves in East Java. Mededelingen No. 21. Nederlandsche Commissie voor Internationale Natuurbescherming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">McNeely, J. A. 1975. Wildlife and national parks in the Lower Mekong Basin. Unpub</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">lished report to the Committee for the Coordination of Investigations of the Lower  Mekong Basin, Economic Commission for Asia and the Far East, Bangkok, Thailand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sumardja, E. A. 1976. The relationships between banteng Bos javanicus (d'Alton) and  vegetation at the Pananjung-Pangandaran Nature Reserve. Research Grant No. 1237/  TF/VI/74. Preliminary Study Internal Report Biotrop. Bogor, Indonesia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wind, J., and H. Amir. 1977. Distribution of banteng (Bos javanicus) in Java and Bali,  Indonesia. Unpublished ms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wind, J., and H. Amir. 1977. Management Plan Baluran Reserve FAO INS/73/013.  Nature Conservation and Wildlife Management Project.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaur</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul. 1965. The gaur. (Bos gaurus). Conservation News of South East  Asia 5:7-10.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul and J. A. McNeely. 1977. Mammals of Thailand. Association for the  Conservation of Wildlife, Bangkok, Thailand. 758 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conry, P. J. 1980. The impact of development and the behavioural response of the  Malaysian seladang. Pp. 279-286 in Tropical Ecology and Development, Proceedings  Fifth International Symposium of Tropical Ecology. International Society of Tropical  Ecology, Kuala Lumpur, Malaysia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conry, P. J. 1981. Habitat selection and use, movements, and home range of Malayan  gaur (Bos gaurus hubbacki) in Central Pahang, Malaysia. M.S. thesis. University of  Montana, Missoula, Montana, USA. 120 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conry, P. J. (In press) Immobilizing Malayan gaur with etorphine. Journal of Wildlife  Management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fischer, H. 1975. The water buffalo and related species as important genetic resources:  their conservation, evaluation and utilization. In The Asiatic Water Buffalo.  Proceedings of an International Symposium, Khon Kaen, Thailand. Food and Fertilizer  Technology Center, Taipei, Taiwan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fischer, H. 1980. Hybrids between Gaur and Gayal and between Gayal and Banteng as  zoological rarities in Thailand. Animal Research and Development 12:116-119.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fradrich, H., and H. G. Klos. 1976. Zur Haltung und Zucht des Gaurs, Bos gaurus.  Zoologische Garten 46(6):417-425.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hussain, M. Khader. 1969. The southern Asiatic gaur or Indian bison (Bos gaurus  gaurus H. Smith). Cheetal 12(1):29-47.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Krishnan, M. 1972. An ecological survey of the larger mammals of peninsular India.  Journal of the Bombay Natural History Society 69:322-349.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Medway, Lord. 1978. The Wild Mammals of Malaya and Singapore. 2nd Edition. Oxford  University Press, Kuala Lumpur, Malaysia. 128 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Momin Khan, M. K. bin 1973. Studies on the seladang (Bos gaurus) in the State of  Perak. Malaysian Nature Journal 26:163-169.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sahai, R. C. 1972. Distribution, composition and herd size of Gaur (Bos gaurus) in  Palamau, Bihar. Cheetal 15:60-66.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schaller, G. B. 1967. The Deer and the Tiger. Chicago University Press, Chicago, USA.  370 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Weigun, L. E. 1971. The last refuge. Malaysian Nature Journal 24:132-137.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Weigun, L. E. 1972. The problems in the preservation of the seladang in the Malaysian  National Park. M.S. thesis. Michigan State University, East Lansing, Michigan, USA.  55 pp</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul and J. A. McNeely. 1977. Mammals of Thailand. Association for the  Conservation of Wildlife, Bangkok, Thailand. 758 pp.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coolidge, H. J. 1940. The Indo-Chinese Forest Ox or Kouprey. Memoirs, Museum of Comparative Zoology at Harvard College 54(6):421-431.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coolidge, H. J. 1955. The Forest Ox or Kouprey of South East Asia. P. 109 in Breeding Beef Cattle for Unfavorable Environments, A. O. Rhoad, ed. University of Texas Press, Austin, Texas, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Neese, H.C. 1976. Kouprey along the Laos/Cambodia border area. Unpublished report to the New York Zoological Society, 185 and Southern Blvd., New York, New York 10460, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pfeffer, P., and O. Kim-San. 1967. Le kouprey, Bos(Bibos) sauvelli, Urbain, 1937: discussion systematique et status actuel. Hypothese sur l'origine du zebu (Bos indicus). Mammalia 31(4):521-536.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pfeffer, P. 1969. Considerations sur l'ecologie des forets claires du Cambodge oriental. Terre et Vie 23(1):3-24.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wharton, C. H. 1957. An Ecological Study of the Kouprey. Novibos sauveli (Urbain). Monograph No. 5. Institute of Science and Technology, Manila, Philippines. 111 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dolan, J. M. 1965. Breeding of the lowland anoa in the San Diego Zoological Garden. Zeitschrift Saugetierekunde 30(4):241-248.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duplaix-Hall, N., ed. 1975. International Zoo Yearbook 15. Zoological Society of London</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fradrich, H. 1973. Einige Bemerkungen uber den Anoa. Zeitschrift des Kolner Zoo 16(3):101-105.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fischer, H., and H. Hohn. 1976. Der Karyotyp eines weiblichen Tamarau (Anea mindorensis) [The Karyotype of a Female Tamaraw (Anoa mindorensis)]. Giessener Beitrage zur Erbpathologie und Zuchthygiene 6:173.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Groves, C. P. 1969. Systematics of the anoa (Mammalia, Bovidae) Beaufortia 17(223): 1-12.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Koulischer, L., J. Tyskens, and J. Mortelsmanns. 1972. The chromosomes of a male specimen of Anoa depressicornis quarlesi. Acta Pathologica, Antwerp 56:21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scheurmann, E., H. Hohn, and H. Fischer. 1977. The karyotype of a male Bubalus (Anoa) depressicornis quarlesi Ouwens 1911. In Symposium, Domesticated Animal Cytogenetics, Jouy en Josas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tamaraw</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alvarez, J. B., Jr. 1970. Philippines tamaraw, here to stay. IUCN Publication, New Series 18:46-51.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grimwood, l. R. 1975. National Parks and Wildlife Conservation in the Philippines. FAO: PHI/72/006. UNDP/FAO, Rome, Italy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Harrisson, T. 1969. The tamaraw and its survival. Conservation News of South East Asia 8:60-61, 70.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kuchn, D. 1975. Tamaraw at Mt. Iglit Came Refuge, Philippines. Tigerpaper 2(3):26.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sitwell, N. 1975. On the track of the tamaraw. Wildlife 17:428-430.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Talbot, L. M., and M. H. Talbot. 1966. The tamaraw, Bubalus mindorensis (Heude). Observations and recommendations. Mammalia 30(1): 1 - 12.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bearded </P>
+<P ALIGN="JUSTIFY">Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Allen, E. F. 1948. The bearded pig. Malaysian Nature Journal 3(2):98-99.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cranbrook, Earl of. 1979. A review of domestic pig remains from archaeological sites in </P>
+<P ALIGN="JUSTIFY">Diong, C. H. 1973. Studies of the Malayan wild pig in Perak and Johore. Malaysian Nature Journal26(2):120-151.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Croves, C. P. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Cenus Sus. Department of Prehistory Technical Bulletin No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hertwig, P. 1936. Artbastarde bei Tieren. Handbuch Vererb Wissenschaften 2B:21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hislop, J. A. 1949. Field notes on the bearded pig. Malaysian Nature Journal 4(2):62-64.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hislop, J. A. 1952. More about the bearded pig. Malaysian Nature Journal 7:22-23.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International Union for the Conservation of Nature. 1972. Red Data Book 1: Mammalia. IUCN, Cland, Switzerland. (This is a loose-leaf binder that is updated from time to time.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kempe, J. E. 1948. The riddle of the bearded pig. Malaysian Nature Journal 3(1):36-42.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lotsy, J. P. 1922. Die Aufarbeitung des kuhn'schen kreuzungsmaterials im Institut fur Tierzucht der Universitat Halle. Cenetica 4:32-61.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MacKinnon, J. 1981. The distribution and status of wild pigs in Indonesia. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 9 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Medway, Lord. 1978. The Wild Mammals of Malaya and Singapore, 2nd Edition. Oxford University Press, Kuala Lumpur, Malaysia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mohr, E. 1960. Wilde Schweine. Die Neue Brehm-Biicherei, A. Ziemsen Verlag, Wittenberg Lutherstadt, Federal Republic of Cermany.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1981. First written report. IUCN/SSC Pigs and Peccaries Specialist group. Unpublished report. 14 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pfeffer, P. 1959. Bologie et migrations du sanglier de Borneo (Sus barbatus Muller 1869). Mammalia 23:277-303.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sulawesi Warty Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appelman, F. J. 1955. Uber Sus celebensis Muller und Schlegel. Der Zoologische Garten 21:152-156.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Catibog-Sinha, C. S. 1981. The quantity and quality of wild food plants and the depredation of wild pigs in the Philippines. Ph.D. thesis. Oklahoma State University, Stillwater Oklahoma, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Croves, C. P. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Cenus Sus. Department of Prehistory Technical Bulletin No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hooijer, D. A. 1968. Pleistocene Vertebrates from Celebes. 8. Sus celebensis Muller and Schlegel, 1845. Beaufortia 16:215-218.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MacKinnon, J. 1981. The distribution and status of wild pigs in Indonesia. IUCN/SSC Pigs and Peccaries Specialist Croup. Unpublished report. 9 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mohr, E. 1960. Wilde Schweine. Die Neue Brehm-Bucherei, A. Ziemsen Verlag, Wittenberg Lutherstadt, Federal Republic of Germany.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1981. Interim report. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 14, pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Javan Warty Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blouch, R. A. 1979. Proposed Bawean Island Wildlife Reserve Management Plan. World Wildlife Fund, Report to Directorate of Nature Conservation, Indonesia. Unpublished report. 63 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blouch, R. A. 1981. Results of a preliminary search for Sus verrucosus in the Mt. Arjuna area. World Wildlife Fund, Meru Betiri Project 1024. Unpublished report. 4 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Groves, C. P. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Genus Sus. Department of Prehistory Technical Bulletin No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hoogerwerf, A. 1970. Udjung Kulonthe Land of the Last Javan Rhinoceros. E. J. Brill, I.eiden. The Netherlands. Pp. 330-349. </P>
+<P ALIGN="JUSTIFY">MacKinnon, J. 1981. The distribution and status of wild pigs in Indonesia. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 9 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1981. First written report. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 14 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigmy Hog</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bosma, A. A., W. L. R. Oliver, and A. A. MacDonald. In press. The karyotype, including g- and c- banding patterns, of the pigmy hog Sus (Porcula) salvanius (Suidae, Mammalia).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Groves, C. T. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Genus Sus. Department of Prehistory Technical Bulletin No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1980. The Pigmy Hog: The Biology and Conservation of the Pigmy Hog Sus (Porcula) salvanius, and the Hispid Hare, Caprolagus hispidus. Special Scientific Report No. I. Jersey Wildlife Preservation Trust. 93 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1981. Pigmy hog and hispid hare: further observations of the continuing decline (or, a lament for Barnadi and a good cause for skepticism). The Dodo, Journal of the Jersey Wildlife Preservation Trust 18:10-20.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Babirus a</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bosma, A. A., 1980. The karyotype of the babirusa (Babyrousa babyrussa); karyotype evolution in the Suidae. Fourth European Colloquium Cytogenetics Domestic Animals 1980:238-241.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bosma, A. A., and De Haan, N. A. 1981. The karyotype of Babrousa babyrussa (Suidae, Mammalia) Acta Zoologica et Pathologica Antverpiensia 76: 17-27.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Davis, D. D. 1940. Notes on the anatomy of the babirusa. Field Museum of Natural History-Zoology 22(5):363-411.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fradich, H. 1974. A comparison of behaviour in the suidae. Pp. 133-144 in The Behaviour of Ungulates and Its Relation to Management. V. Ceist and F. Walther, eds. IUCN Publication No. 24.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Groves, C. P. 1981. Ancestors for the Pigs, Taxonomy and Phylogeny of the Genus Sus. Department of Prehistory Technical Bulletin, No. 3. Australian National University Press, Canberra, Australia. 96 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Croves, C. P. 1980. Notes on the systematics of Babyrousa (Artiodactyla, Suidae). Zoologische Mededelingen, Deel 55(3):29-46.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MacKinnon, J. 1981. The structure and function of the tusks of babirusa. Mammal Review 1 1(1):37-40.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MacKinnon, J. 1981. The distribution and status of wild pigs in Indonesia. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 9 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oliver, W. L. R. 1981. First written report. IUCN/SSC Pigs and Peccaries Specialist Group. Unpublished report. 14 pp.</P>
+<P ALIGN="JUSTIFY">1</P>
+<P ALIGN="JUSTIFY">Selmier, V. J. 1978. Only in Indonesia: the babirusa. Unpublished report to Directorate of Nature Conservation (P.P.A.), Bogor, Indonesia. 40 pp. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Research Contacts</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because Asia contains many livestock breeds about which little is known, an expert committee on Animal Genetic Resources has been recently formed by the Society for the Advancement of Breeding Researchers in Asia and Oceania (SABRAO). Its chairman is Professor J. S. F. Barker of the University of New England, Armidale, New South Wales 2351, Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Species Survival Commission of the International Union for the Conservation of Nature has a Wild Cattle Specialist Group that concerns itself with wild banteng, gaur, and kouprey. Its chairman is Mr. Mohd. Khan bin Momin Khan, Director-General, Wildlife and National Parks, West Malaysia, Kompleks Pejabat-Pejabat Kerajaan, Block K-20, Jalan Duta, Kuala Lumpur, Malaysia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following have particular knowledge of the animals described in this book, have contributed to the various chapters, and (in most cases) have agreed to provide advice to bona fide researchers wishing to study further the animals in this report.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Domesticated Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ida Bagus Arka, Faculty for Veterinary Science and Animal Husbandry, Udayana University, Jalan Sudirman Sanglah, Denpasar, Bali, Indonesia J. S. F. Barker, Department of Animal Science, University of New</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">England, Armidale, New South Wales 2351, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. Bongers, Department of Nature Conservation, Wageningen Agricultural University, Ritzema Bosweg 32a, 6703AZ Wageningen, The Netherlands David Butcher, Western Plains Zoo, Box 813, Dubbo, New South Wales</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2830, Australia (Banteng are available for research projects and zoos.</P>
+<P ALIGN="JUSTIFY">Quarantine for shipments between Australia and most countries are</P>
+<P ALIGN="JUSTIFY">straightforward)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. K. Camoens, Livestock Specialist, Asian Development Bank, P.O. Box 789, Manila, Philippines 2800</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David Deppner, 1603 Dayton Road, Hyattsville, Maryland 20783, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. Devendra, Malaysian Agricultural Research and Development Institute (MARDI), Serdang, Selangor, Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.-M. Duplan, Institut Technique de l'Elevage Bovin, Section Amelioration Genetique, Maison Nationale des Eleveurs, 149, rue de Bercy F, 75595 Paris Cedex 12, France</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Fischer, Institute of Tropical Veterinary Medicine, 63 Giessen, Wilhelmstrasse 15, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S. I. Furtado, Universiti Malaya, Lembah Pantai, Kuala Lumpur 22-11, Malaysia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Hodges, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Huitema, Overzicht 60, 6862 CT, Oosterbeek, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Graham W. M. Kirby, Principal Animal Production Officer, Department of Primary Production, P.O. Box 4160, Darwin, Northern Territory 5790, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moh. Zain Katoe, P.T. United Livestock, Jalan Bau Massepe 472, ParePare, South Sulawesi, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. -G. Klos, Director, Zoologischer Garten Berlin, Hardenbergplatz 8 , 1000 Berlin 30, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prof. Kusmat, Dean, Faculty of Veterinary Medicine, Institut Pertanian Bogor, Jalan Oto Iskandardinata, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ian L. Mason, 8 Ramsay Garden, Edinburgh, EH1 1NA, Scotland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert E. McDowell, Department of Animal Science, Frank B. Morrison Hall, Cornell University, Ithaca, New York 14853, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G. Montsma, Department of Animal Production, Wageningen Agricultural University, Ritzema Bosweg 32a, 6703 AZ Wageningen, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. B. Moran, Senior Research Officer, Animal and Irrigated Pastures Research Institute, Kyabram, Victoria 3620, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jan Nari, Director of Central Research Institute for Animal Science, Jalan Raya Pajajaran, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. M. Nitis, Department of Animal Nutrition and Tropical Pasture Production, Udayana University, Jalan Sudirman Sanglah, Denpasar, Bali, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. J. A. Payne, 91 Bedwardine Road, London SE19 3AY, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Donald L. Plucknett, Consultative Group on International Agricultural Research, 1818 H Street, Washington, D.C. 20433, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research Institute for Animal Production, P.O. Box 123, Bogor, Indonesia (Amber Roesyat, Ian Fletcher, Dennis Hoffmann, P. Sitorus, Subandriyo, M. Zulbardi)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David W. Robinson, International Programs, University of California, Davis, California 95616, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. H. L. Rollinson, Animal Production and Health Division, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G. Seifert, CSIRO, Tropical Cattle Research Centre, P.O. Box 5545, Rockhampton Mail Centre, N. Rockhampton, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. David Simpson, Senior Extension Specialist, Veld, Pastures and Wildlife, Agritex Box 363, Bulawayo, Zimbabwe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. J. Smith, Tropical Animal Health, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Summerhall, Edinburgh, EH9 1QH Scotland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dukut Sularsasa, Department of Tropical Veterinary Science, James Cook University, Townsville, Queensland 4811, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. Syamsul Arifin, Jalan Amin Jakfar 41, Pamekasan Madura, Jatim, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taronga Zoo, P.O. Box 20, Mosman, New South Wales 2088, Australia (T. Finnie and J. L. Throp)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frank M. Thompson, Wild Animal Brokers, 15605 S. R. #64, Bradenton, Florida 33508, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Allen D. Tillman, 523 West Harned Place, Stillwater, Oklahoma 74074, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Don Tulloch, P.O. Box 38841, Winnellie, Northern Territory 5789, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Helen Newton Turner, P.O. Box 184, North Ryde, New South Wales 2113, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antoon de Vos, P.O. Box 34, Whitford, Auckland, New Zealand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert Warren, Department or Range and Wildlife Management, Texas Tech University, Lubbock, Texas 79409, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Everett J. Warwick, The Rockefeller Foundation, P.O. Box 63, Yogyakarta, D.I.Y., Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Woodward, 35AI, Sultan Hasanudin, Ujung Pandang, South Sulawesi, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Domesticated Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antwerp, Belgium (Royal Zoological Society of Antwerp)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Askaniya-Nova, USSR (Zoologicheskii Park Askaniya-Nova)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bangkok, Thailand (Dusit Zoological Park; banteng-mithan hybrid)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berlin, Federal Republic of Germany (Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berlin, German Democratic Republic (Tierpark Berlin)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Copenhagen, Denmark (Zoologisk Have)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dubbo, New South Wales, Australia (Western Plains Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jakarta, Indonesia (Kebun Binatang Ragunan)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kiev, USSR (Kievskii Zoologicheskii Park)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madrid, Spain (Zoo de la Casa de Campo; mithan-banteng hybrid)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pretoria, South Africa (National Zoological Gardens of South Africa) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rome, Italy (Giardino Zoologico e Museo de Zoologia del Comune de Rome and Zoorama)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rotterdam, The Netherlands (Stichting Koninklijke Rotterdamse Diergaarde; 2 male, 2 female, may be wild form)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surabaya, Indonesia (Kebun Binatang Surabaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yogyakarta, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Banteng-Cattle Hybrids</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abubakar Aldjufri, Secretary, Asian Livestock Business Club, Kebun Pala I/79B Tanah Abang, Jakarta, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Saleh Aldjufri, Jalan Jakarta 42, Surabaya, Jawa Timur, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David Deppner, 1603 Dayton Rd., Hyattsville, Maryland 20783, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Huitema, Overzicht 60, 6862 CT, Oosterbeek, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Graham W. M. Kirby, Principal Animal Production Officer, Department of Primary Production, P.O. Box 4160, Darwin, Northern Territory 5790, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. B. Moran, Senior Research Officer, Animal and Irrigated Pastures Research Institute, Kyabram, Victoria 3620, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. J. A. Payne, 91 Bedwardine Road, London SE19 3AY, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David W. Robinson, International Programs, University of California, Davis, California 95616, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. H. L. Rollinson, Animal Production and Health Division, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B. Wheeler, 1000 Shady Lane, College Station, Texas 77840, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mithan</P>
+<P ALIGN="JUSTIFY">Chaichana Satrulee, Dusit Zoological Park, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">H. Fischer, Institute of Tropical Veterinary Medicine, 63 Giessen, Wilhelmstrasse 15, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. von Furer Haimendorf, School of Oriental and African Studies, University of London, London WC1, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles G. Hickman, Livestock Consultant, A. Mithat Efendi Sokak No. 36/11, Cankaya, Ankara, Turkey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frederick J. Simoons, 140 Bartlett Ave., Woodland, California 95695, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Mithan (Gayal)</P>
+<P ALIGN="JUSTIFY">Aalborg, Denmark (Aalborg Zoologiske Have)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Amsterdam, The Netherlands (Stichting Koninklijk Zoologisch) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arnhem, The Netherlands (Burgers' Zoo and Safari)</P>
+<P ALIGN="JUSTIFY">Bangkok, Thailand (Dusit Zoological Park)</P>
+<P ALIGN="JUSTIFY">Berlin, German Democratic Republic (Tierpark Berlin)</P>
+<P ALIGN="JUSTIFY">Calcutta, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cologne, Federal Republic of Germany (Aktiengesellschaft Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Heidelberg, Federal Republic of Germany (Tiergarten Heidelberg)</P>
+<P ALIGN="JUSTIFY">Kolmarden, Sweden (Koemardens Djurpark)</P>
+<P ALIGN="JUSTIFY">Madrid, Spain (Zoo de la Casa de Campo; mithan-banteng hybrid)</P>
+<P ALIGN="JUSTIFY">Rabat, Morocco (Pare Zoologique National)</P>
+<P ALIGN="JUSTIFY">Vienna, Austria (Schonbrunn Zoo)</P>
+<P ALIGN="JUSTIFY">Tallin, USSR (Tallinna Loomaaed)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yak</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joseph Bonnemaire, Ecole Nationale Superieure des Sciences Agronomiques Appliquees, 26, Bd. Docteur Petitjean, 21100 Dijon, France</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corneille Jest, Centre National de la Recherche Scientifique, 1, Place Artistide-Briand, 92190 Meudon, France</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. A. Kazarova, Director, Riga Zoological Garden, Meza prospekt 1, Riga 14 226014, Latvian SSR, USSR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">K. K. Panday, Swiss Association for Technical Assistance (SATA), Box 113, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ralph W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Patrick J. Robinson, Department of Agricultural and Forest Sciences, University of Oxford, Commonwealth Forestry Institute, South Parks Road, Oxford OX1 3RB, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">George B. Schaller, New York Zoological Society, 185 and Southern Blvd., New York, New York 10460, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">T. B. Singh, Director General, Department of Livestock, HMG, Harihar Bhawan, Pulchowk, Laitpur, Nepal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Societe d'Ethnozootechnie, 25, Boulevard Arago, 75013 Paris, France (R. Laurans)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Yak</P>
+<P ALIGN="JUSTIFY">Antwerp, Belgium (Royal Zoological Society of Antwerp)</P>
+<P ALIGN="JUSTIFY">Arnhem, The Netherlands (Burgers' Zoo and Safari)</P>
+<P ALIGN="JUSTIFY">Baltimore, Maryland, USA</P>
+<P ALIGN="JUSTIFY">Bronx, New York, USA (New York Zoological Park)</P>
+<P ALIGN="JUSTIFY">Chicago, Illinois, USA (Brookfield Zoo)</P>
+<P ALIGN="JUSTIFY">Denver, Colorado, USA (Denver Zoological Gardens)</P>
+<P ALIGN="JUSTIFY">Detroit, Michigan, USA (Detroit Zoological Park)</P>
+<P ALIGN="JUSTIFY">Evansville, Indiana, USA (Meeker Park Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Granby, Quebec, Canada (Societe Zoologique de Granby, Inc.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grand Rapids, Michigan, USA (John Ball Zoological Gardens)</P>
+<P ALIGN="JUSTIFY">Kansas City, Missouri, USA (Kansas City Zoological Gardens)</P>
+<P ALIGN="JUSTIFY">Knoxville, Tennessee, USA (Knoxville Municipal Zoo)</P>
+<P ALIGN="JUSTIFY">London, England</P>
+<P ALIGN="JUSTIFY">Rochester, New York, USA (Seneca Park Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rotterdam, The Netherlands (Stichting Koninklijke Rotterdamse Diergaarde)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Diego, California, USA (San Diego Wild Animal Park)</P>
+<P ALIGN="JUSTIFY">Sioux Falls, South Dakota, USA (Great Plains Zoo)</P>
+<P ALIGN="JUSTIFY">South Bend, Indiana, USA (Potawatomi Park Zoo)</P>
+<P ALIGN="JUSTIFY">Syracuse, New York, USA (Burnet Zoo)</P>
+<P ALIGN="JUSTIFY">Toronto, Ontario, Canada (Metro Toronto Zoo)</P>
+<P ALIGN="JUSTIFY">Utica, New York, USA (Utica Zoo)</P>
+<P ALIGN="JUSTIFY">Wichita, Kansas, USA (Sedgwick County Zoo)</P>
+<P ALIGN="JUSTIFY">West Orange, New Jersey, USA (Turtleback Zoo)</P>
+<P ALIGN="JUSTIFY">Winnipeg, Manitoba, Canada (Assiniboine Park Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yakows</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joseph Bonnemaire, Ecole Nationale Superieure des Sciences Agronomiques Appliquees, 26, Bd. Docteur Petitjean, 21100 Dijon, France</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Agriculture, Hari Har Bhawan, Pulchok, Lalitpur, Kathmandu, Nepal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Husbandry and Veterinary Science, Kathmandu, Nepal (Tewari and Burathoky)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director of Livestock Development, Peking, China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Professor Karl Fredge, Department of Genetics, University of Uppsala, Uppsala, Sweden</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indian Veterinary Research Institute, P.O. Izatnagar 243 122, Uttar Pradesh, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock Division, National Agricultural Research Center, Islamabad, Pakistan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Sheep and Yak Development Project, Dechhen Pelrithang, P.O. Bumthang, Bhutan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ralph W. Phillips, The Representative, Apartment 810, 1101 South Arlington Ridge Road, Arlington, Virginia 22202, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Patrick J. Robinson, Department of Agricultural and Forest Sciences, University of Oxford, Commonwealth Forestry Institute, South Parks Road, Oxford OX1 3RB, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whipsnade Zoo, Whipsnade, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bruce A. Young, Department of Animal Science, University of Alberta, Edmonton, Alberta TOG 2P5, Canada </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wild Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Amir, c/o Ministry of Development Supervision and the Environment, JalanMirdekaBarat 15, Jakarta, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. H. Blower, National Parks Project, c/o UNDP, Box 650, Rangoon, Burma</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bonsong Lekagul, Association for the Conservation of Wildlife, No. 4 Customhouse Road, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chaichana Satrulee, Dusit Zoological Park, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Z. Coto, Tropical Forest Biology, SEAMEO-BIOTROP, P.O. Box 17, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Forest Department, P.O. Box 311, Sandakan, Sabah, Malaysia (Patrick Andau, Assistant Chief Game Warden)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. R. Grimwood, P.O. Box 45079, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The Australian National University, P.O. Box 4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">U. Halder, Swiss League for Nature Conservation, P.O. Box 73, CH4020 Basel, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Huitema, Overzicht 60, 6862 CT, Oosterbeek, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. Wayne King, Director and Professor, Florida State Museum, University of Florida, Gainesville, Florida 32601, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lembaga Biologi Nasional (LBN-LIPI), Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John A. Lukas, White Oak Plantation, Rt. 3 Box 224, Yulee, Florida 32097, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jeffrey A. McNeely, Executive Officer, Commission on National Parks and Protected Areas, International Union for Conservation of Nature and Natural Resources, Avenue du Mont-Blanc, 1196 Gland, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Payne, Wildlife Section, Forest Department, P.O. Box 311, Sandakan, Sabah, Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Somtob Norapuckprutikorn, Captive Propagation Section, Wildlife Conservation Division, Royal Forest Department, Bangkhen, Bangkok 9, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B. Wheeler, 1000 Shady Lane, College Station, Texas 77840, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Wild Banteng</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Albuquerque, USA (Rio Grande Zoological Park)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Amsterdam, The Netherlands (Stichting Koninklijk Zoologisch)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bangkok, Thailand (Dusit Zoological Park)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berlin, Federal Republic of Germany (Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chicago, Illinois, USA (Brookfield Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cologne, Federal Republic of Germany (Aktiengesellschaft Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Copenhagen, Denmark (Zoologisk Have)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Darmstadt, Federal Republic of Germany (Vivarium Darmstadt)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dortmund, Federal Republic of Germany (Tierpark Dortmund)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dresden, German Democratic Republic (Zoologischer Garten Dresden)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frankfurt, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jakarta, Indonesia (Kebun Binatang Ragunan)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Diego, California, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">St. Louis, Missouri, USA (St. Louis Zoological Park)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surabaya, Indonesia (Kebun Binatang Surabaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yogyakarta, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yulee, Florida, USA (White Oak Plantation)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gaur</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Aspinal, Howlett's Wildlife Park, near Canterbury, Kent, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul, Association for the Conservation of Wildlife, No. 4 Customhouse Road, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paul Conry, Division of Aquatic and Wildlife Resources, Department of Agriculture, P.O. Box 23367, GMF Guam 96921, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Fischer, Institute of Tropical Veterinary Medicine, 63 Giessen, Wilhelmstrasse 15, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. R. Grimwood, P.O. Box45079, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mohd Khan bin Momin Khan, Director-General, Department of Wildlife and National Parks, P.O. Box 611, Kuala Lumpur, Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. A. Kazarova, Director, Riga Zoological Garden, Meza prospekt 1, Riga 14 226014, Latvian SSR, USSR</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H.-G. Klos, Director, Zoologischer Garten Berlin, Hardenbergplatz 8, 1000 Berlin 30, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adrian G. Marshall, Department of Zoology, University of Aberdeen, Aberdeen, Scotland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">George B. Schaller, New York Zoological Society, 185 and Southern Blvd., New York, New York 10460, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lee Simmons, Omaha Zoo, Omaha, Nebraska 68108, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Janet Stover, Bronx Zoo, 185 and Southern Blvd., New York, New York 10460, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frank M. Thompson, Wild Animal Brokers, 15605 S. R. #64, Bradenton, Florida 33508, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Guar </P>
+<P ALIGN="JUSTIFY">The Berlin Zoo was assigned by the IUCN in cooperation with the</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">lUDZG to keep the guar studbook records. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bangkok, Thailand (Dusit Zoological Park)</P>
+<P ALIGN="JUSTIFY">Berlin, Federal Republic of Germany (Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY">Bronx, New York, USA (New York Zoological Park; 7 male, 3 female)</P>
+<P ALIGN="JUSTIFY">Brownsville, Texas, USA (Gladys Porter Zoo; 5 male, 10 female)</P>
+<P ALIGN="JUSTIFY">Copenhagen, Denmark (Zoologisk Have; 1 male, 2 female)</P>
+<P ALIGN="JUSTIFY">Holiday Island, Eureka Springs, Arkansas, USA</P>
+<P ALIGN="JUSTIFY">Hyderabad, Andhra Pradesh, India (Nehru Zoological Park)</P>
+<P ALIGN="JUSTIFY">Ivey, Wilburton, Oklahoma, USA</P>
+<P ALIGN="JUSTIFY">Kansas City, Missouri, USA (Kansas City Zoological Gardens; I male)</P>
+<P ALIGN="JUSTIFY">Kings Mill, Ohio, USA (Wild Animal Safari,; 1 male)</P>
+<P ALIGN="JUSTIFY">Kuala Lumpur, Malaysia</P>
+<P ALIGN="JUSTIFY">London, England</P>
+<P ALIGN="JUSTIFY">Los Angeles, California, USA (The Los Angeles Zoo; I male, 3 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Memphis, Tennessee, USA (Memphis Zoo and Aquarium; I male, 2 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Munich, Federal Republic of Germany (Munchener Tierpark Hellabrunn Ag)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mysore, Karnataka, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oklahoma City, Oklahoma, USA (Oklahoma City Zoo; 7 male, 7 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Omaha, Nebraska, USA (Henry Doorly Zoological Gardens; 7 male, 15 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Riga, Latvian SSR, USSR (Riga Zoological Garden)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Diego, California, USA (San Diego Wild Animal Park; 6 male, 6 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Bend, Indiana, USA (Potawatomi Park Zoo; 1 male)</P>
+<P ALIGN="JUSTIFY">St. Louis, Missouri, USA (St. Louis Zoological Park; 1 male, 2 female)</P>
+<P ALIGN="JUSTIFY">Toronto, Ontario, Canada (Metro Toronto Zoo; 3 male, 1 female)</P>
+<P ALIGN="JUSTIFY">Vienna, Austria (Schonbrunn Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kouprey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boonsong Lekagul, Association for the Conservation of Wildlife, No. 4 Customhouse Road, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Harold Coolidge, 38 Standley Street, Beverly, Massachusetts 01915, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jeffrey A. McNeely, Executive Officer, Commission on National Parks and Protected Areas, International Union for Conservation of Nature and Natural Resources, Avenue du Mont-Blanc, 1196 Gland, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Harvey C. Neese, P.O. Box 332, Troy, Idaho 83871, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David Anthony Parkinson, White House, San Roque 1, San Jose, Occidental Mindoro, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pierre Pfeffer, Zoologie, Mammiferes et Oiseaux Museum National d'Histoire Naturelle 55, rue de Buffon 75005 Paris, France</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. Kelly Shelton, 211-A North Cordova, Burbank, California 91505, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Henry Stoddard, Branford Veterinary Clinics, Inc., P.O. Box 548, Branford, Florida 32008, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles H. Wharton, Institute of Ecology, University of Georgia, Athens, Georgia 30602, USA (Rt. 2, Clayton, Georgia 30525)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">World Conservation Centre, Avenue du Mont-Blanc, CH 1196 Gland, Switzerland (David Mitchell, Elizabeth Kemf)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Kouprey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">None</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anoas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. M. Dolan, San Diego Zoological Garden, San Diego, California 92112, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Fischer, Institute of Tropical Veterinary Medicine, 63 Giessen, Wilhelmstrasse 15, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The Australian National University, P.O. Box 4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Anoas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antwerp, Belgium (Royal Zoological Society of Antwerp; mountain anoa)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berlin, Federal Republic of Germany (Zoologischer Garten; mountain anoa)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">London, England (lowland anoa)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Leipzig, German Democratic Republic (Zoologischer Garten Leipzig; mountain anoa)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jakarta, Indonesia (Kebun Binatang Ragunan) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rotterdam, The Netherlands (Stichting Koninklijke Rotterdamse Diergaarde; 1 male, 3 female)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Diego, California, USA (San Diego Zoological Garden; 1 male)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Diego, California, USA (San Diego Wild Animal Park; 1 male)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surabaya, Indonesia (Kebun Binatang Surabaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sydney, New South Wales, Australia (Taronga Park Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tamaraw</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Natural Resources, Quezon City, Manila, Philippines (J. B. Alvarez, Jr., Assistant Director)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Fischer, Institute of Tropical Veterinary Medicine, 63 Giessen, Wilhelmstrasse 15, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I. R. Grimwood, P.O. Box 45079, Nairobi, Kenya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Natural Resources Conservation Office, Ministry of Natural Resources, Visayas Avenue, Diliman, Quezon City, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David Anthony Parkinson, White House, San Roque 1, San Jose, Occidental Mindoro, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ian Player, P.O. Box 192, Howick 3290, Natal, South Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N. Sitwell, c/o WWF(UK), 11-13 Ockford Rd., Godalming, Surrey GU7 lQU, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">L. M. Talbot, 6656 Chilton Court, McLean, Virginia 22101, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Forest Research Institute, College, Laguna 3720, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bearded Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Julian Oliver Caldecott, Sub-Department of Veterinary Anatomy, University of Cambridge, Downing Street, Cambridge CB2 3DY, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The AustralianNationalUniversity, P.O. Box4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alastair A. Macdonald, Department of Anatomy, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh EH9 10H, Scotland, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. MacKinnon, WWF/IUCN Representative, P.O. Box 133, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Parks and Wildlife Office, Sarawak Forest Department, Jalan Gartak, Kuching, Sarawak, Malaysia (Kron Aken, David Labang, Mike Kavanagh)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. L. R. Oliver, Jersey Wildlife Preservation Trust, Les Augres Manor, Jersey, Channel Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Payne, Wildlife Section, Forest Department, P.O. Box 311, Sandakan, Sabah, Malaysia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Bearded Pig</P>
+<P ALIGN="JUSTIFY">Singapore, Singapore</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Manila, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sulawesi Warty Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. Catibog-Sinha, Outdoor Recreation and Wildlife Research Division, Forest Research Institute, College, Laguna 3720, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The AustralianNationalUniversity, P.O. Box4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alastair A. Macdonald, Department of Anatomy, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh EH9 10H, Scotland, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. Mackinnon, WWF/TUCN Representative, P.O. Box 133, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. L. R. Oliver, Jersey Wildlife Preservation Trust, Les Augres Manor, Jersey, ChanneL Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Sulawesi Warty Pig</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">None.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Javan Warty Pig</P>
+<P ALIGN="JUSTIFY">Raleigh A. Blouch, 2125 Forest Glen, Lansing, Michigan 48906, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">A. A. Bosma, Department of Functional Morphology, Faculty of Veterinary Sciences, State University Utrecht, P.O. Box 80157, 3508 TD Utrecht, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Directorate of Nature Conservation (PPA), Jalan Ir. H. Juanda 9, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The Australian National University, P.O. Box 4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lembaga Biologi Nasional (LBN-LIPl), Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alastair A. Macdonald, Department of Anatomy, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh EH9 10EI, Scotland, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. MacKinnon, WWF/IUCN Representative, P.O. Box 133, Bogor, Indonesia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. L. R. Oliver, Jersey Wildlife Preservation Trust, Les Augres Manor, Jersey, Channel Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Werner Pauwels, Pfeffingerstrasse 48, CM-053, Basel, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perum Perhutani, Forest State Corporation, Jalan Jendral Gatot Subroto 17-18, Post Box 111, Jakarta, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M. H. Woodford, c/o FORW, FAO, Via delle Terme di Caracalla, 00100 Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Javan Warty Pig</P>
+<P ALIGN="JUSTIFY">Jakarta, Indonesia (Kebun Binatang Ragunan)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surabaya, Indonesia (Kebun Binatang Surabaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pigmy Hog</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. A. Bosma, Department of Functional Morphology, Faculty of Veterinary Sciences, State University Utrecht, P.O. Box 80157, 3508 TD Utrecht, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P. C. Gogoi, Adviser Forests, (Wildlife and Environmental Planning), Meghalaya, P.O. Shillong 793 001, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The AustralianNationalUniversity, P.O. Box4, Canberra, ACT 2600, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alastair A. Macdonald, Department of Anatomy, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh EH9 lOH, Scotland, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. MacKinnon, WWF/IUCN Representative, P.O. Box 133, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. L. R. Oliver, Jersey Wildlife Preservation Trust, Les Augres Manor, Jersey, Channel Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S. Deb Roy, Manas National Park, P.O. Barpeta Road, Kamrup 781 315, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Pigmy Hog</P>
+<P ALIGN="JUSTIFY">Gauhati, India (Assam State Zoo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zurich, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Babirusa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. A. Bosma, Department of Functional Morphology, Faculty of Veterinary Sciences, State University Utrecht, P.O. Box 80157, 3508 TD Utrecht, The Netherlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C. P. Groves, Department of Prehistory and Anthropology, The Australian National University, P.O. Box 4, Canberra, ACT 2600, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alastair A. Macdonald, Department of Anatomy, Royal (Dick) School of Veterinary Studies, University of Edinburgh, Edinburgh EH9 lOH, Scotland, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. MacKinnon, WWF/IUCN Representative, P.O. Box 133, Bogor, Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. L. R. Oliver, Jersey Wildlife Preservation Trust, Les Augres Manor, Jersey, Channel Islands, United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Victoria Selmier, 353 10th Street, San Francisco, California 94103, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zoos with Babirusa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antwerp, Belgium (Royal Zoological Society of Antwerp, W. de Meurichy)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bandung, Indonesia</P>
+<P ALIGN="JUSTIFY">Berlin, Federal Republic of Germany, (Zoologischer Garten)</P>
+<P ALIGN="JUSTIFY">Copenhagen, Denmark, (Zoologisk Have)</P>
+<P ALIGN="JUSTIFY">Frankfurt, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY">Jakarta, Indonesia, (Kebun Binatang Ragunan)</P>
+<P ALIGN="JUSTIFY">Nuremberg, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY">Poznan, Poland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rotterdam, The Netherlands (Stichting Koninklijke Rotterdamse Diergaarde)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Stuttgart, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY">Surabaya, Indonesia, (Kebun Binatang Surabaya)</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Advisory Committee on Technology Innovation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY">WILLIAM BRADLEY, Consultant, New Hope, Pennsylvania</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">HAROLD DREGNE, Director, International Center for Arid and Semi-Arid Land Studies, Texas Tech University, Lubbock, Texas (member through 1981) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CARL N. HODGES, Director, Environmental Research Laboratory, Tucson, Arizona </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CYRUS MCKELL, Native Plants, Inc., Salt Lake City, Utah </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOlS MERGEN, Pinchot Professor of Forestry, School of Forestry and Environmental Studies, Yale University, New Haven, Connecticut (member through 1982) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Consultative Group on International Agricultural Research, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THEODORE SUDIA, Deputy Science Advisor to the Secretary of Interior, Department of Interior, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Board on Science and Technology for International Development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE BUGElARELLO, President, Polytechnic Institute of New York, Brooklyn, New York, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SAMUEL P. ASPER, Educational Commission for Foreign Medical Graduates, Philadelphia, Pennsylvania </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DAVID BELL, Department of Population Sciences, Harvard School of Public Health, Boston, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LEONARD BERRY, Professor, Graduate School of Geography, Clark University, Worcester, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ERNEST.J. BRISKEY, Dean, School of Agriculture, Oregon State University, Corvallis, Oregon </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARRISON S. BROWN, Director, Resources Systems Institute, East-West Center, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT H. BURRIS, Department of Biochemistry, University of Wisconsin, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CLAUDIA JEAN CARR, Associate Professor, Conservation and Resource Studies, University of California at Berkeley, Berkeley, California </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATE FIELDS, Director, Developing Markets, Control Data Corporation, Minneapolis, Minnesota </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROLAND J. FUCHS, Chairman, Department of Geography, University of Hawaii at Manoa, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN HOWARD GIBBONS, Director, U.S. Congress, Office of Technology Assessment, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N. BRUCE HANNAY, Foreign Secretary, National Academy of Engineering, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM HUGHES, Director, Engineering Energy Laboratory, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM A. W. KREBS, Vice President, Arthur D. Little, Inc., Acorn Park, Cambridge, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE I. LYTHCOTT, University of Wisconsin, School of Medicine, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JANICE E. PERLMAN, Executive Director, Committee for a New New York, New York City Partnership, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK C. ROBBINS, President, Institute of Medicine, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WALTER A. ROSENBLITH, Foreign Secretary, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY">FREDERICK SEITZ, President Emeritus, The Rockefeller University, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH HERBERT SMUCKLER, Dean of International Studies and Programs, Michigan State University, East Lansing, Michigan </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GILBERT F. WHITE, Institute of Behavioral Science, University of Colorado, Boulder, Colorado </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BILL C. WRIGHT, Assistant Dean for International Programs, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN G. HURLEY, Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">MICHAEL G. C. McDONALD DOW, Associate Director/Studies </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL P. GREENE. Associate Director/Research Grants </P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/b20cre/b20cre.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/b20cre/b20cre.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/b20cre/b20cre.htm	(revision 21083)
@@ -0,0 +1,1134 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Managing Tropical Animal Resources - Crocodiles as a Resource for the Tropics</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Managing Tropical Animal Resources - Crocodiles as a Resource for the Tropics</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Report of an Ad Hoc Panel of the</P>
+<P ALIGN="JUSTIFY">Advisory Committee on Technology Innovation</P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development</P>
+<P ALIGN="JUSTIFY">Office of International Affairs</P>
+<P ALIGN="JUSTIFY">National Research Council</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Cooperation with the Division of Wildlife, Department of Lands and Environment, Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATIONAL ACADEMY PRESS</P>
+<P ALIGN="JUSTIFY">Washington, D.C. 1983</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development(BOSTID) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Panel on Crocodile Farming</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Director, Office of Biological Conservation, Smithsonian Institution, Washington, D.C., USA, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HOWARD W. CAMPBELL (deceased) U.S. Fish and Wildlife Service, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ARCHIE F. CARR, Jr., Department of Zoology, University of Florida, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. WAYNE KING, Director, Florida Museum, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOIS MERGEN, Pinchot Professor of Forestry, Yale University, New Haven, Connecticut, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. MORRIS, Furzebrook Research Station, Institute of Terrestrial Ecology, Wareham, Dorset, England </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, USA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT M. PYLE, Species Conservation Monitoring Unit, Cambridge, England </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SHELDON R. SEVERINGHAUS, Representative, The Asia Foundation, Taipei, Taiwan </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contributors</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CAROL GABARA, Wildlife Division, Department of Oro Province, Popondetta </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WASSAM GABARA, Wildlife Division, Department of Oro Province, Popondetta </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">KAROL KISOKAU, Director, Office of Environment and Conservation, Waigani </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NAVU KWAPENA, Division of Wildlife, Department of Lands and Environment, Konedobu </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MIRO LAUFA, Division of Wildlife, Department of Lands and Environment, Konedobu </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GREG MITCHELL, Crocodile Farm, Lae </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LEO NING, Division of Wildlife, Department of Lands and Environment, Wewak </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MIGUEE AEVAREZE DEE TORO, Instituto de Historia Natural, Departamento de Zoologia, Chiapas, Mexico</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ANGUS D'A.BELLAIRS, Department of Anatomy, St. Mary's Hospital Medical School, University of London, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PETER BRAZAITIS, Department of Herpetology, New York Zoological Society, Bronx, New York, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT H.CHABRECK, Louisiana Cooperative Wildlife Research Unit, Louisiana State University, Baton Rouge, Louisiana, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MAX C.DOWNES, The Game Conservation Centre, Melbourne, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">KARLHEINZ FUCHS, hoechst Aktiengesellschaft, Frankfurt, Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CLAIRE HACEN, Reptile Products Association, New York, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RENEE.HONEGGER, Zurich Zoo, Zurich, Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TED JOANEN, Rockefeller Wildlife Refuge, Chenier, Louisiana, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN LEVER, Koorana Crocodile Farm, Rockhampton, Queensland, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM MAGNUSSON, Instituto Nacional de Pesquisas da Amazonia, Manaus, Amazonia, Brazil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARRY MESSEE, School of Physics, University of Sydney, Sydney, New South Wales, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRED PARKER, Kirwan Queensland, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ANTHONY POOLEY, St. Lucia Estuary, Zululand, South Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHARLES A.ROSS, National Museum of Natural History, Smithsonian Institution, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">K.B.SALE, UNDP/FAO Crocodile Breeding and Management Project, Hyderabad, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LUISVARONA, La Habana, Cuba</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHAROON YOUNGPRAPAKORN, The Samutprakan Crocodile Farm, Samutprakan, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UTAl YOUNGPRAPAKORN, The Samutprakan Crocodile Farm, Samutprakan, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MYRNA WATANABE, Co-editor of ICUN Newsleter, Brooklyn, New York, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROMULUS WHITAKER, Guindy Deer Park, Madras, India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, Professional Associate, Board on Science and Technology for International Development, Crocodile Study Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Research Council Staff</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. R. RUSKIN, BOSTID Editor</P>
+<P ALIGN="JUSTIFY">MARY lANE ENGQUIST, Staff Associate</P>
+<P ALIGN="JUSTIFY">CONSTANCE REGES, Administrative Secretary</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This publication is dedicated to the memory of panel member Howard W. "Duke" Campbell who devoted most of his professional life to the conservation of crocodilians. Dr. Campbell was Chairman of the Crocodilian Specialist Group of the Survival Commission of the International Union for Conservation of Nature and Natural Resources at the time of his death in 1981.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel that produced this report met in Papua New Guinea in May 1981. Its purpose was to consider the principles of the Papua New Guinea crocodile farming program and their implications for economic development and for the management and survival of crocodilians elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles are an integral part of the tropical fauna; they are ecologically important, biologically interesting, and, potentially, a renewable natural resource of considerable economic value. The panel hopes that through this report the possibility of saving and managing this animal throughout the tropics can be better assessed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members of the panel consulted officials of the Ministry of Wildlife and Conservation in Port Moresby and visited crocodile farms in Moitaka, Popondetta, and Lae. The panel is grateful to Karol Kisokau, Navu Kwapena, and Miro Laufa of the Division of Wildlife for arranging its itinerary and visits in Papua New Guinea. It also wishes to thank Yano Belo, Minister of Environment, for hosting an evening social at the Moitaka crocodile farm; Greg Mitchell and his wife Judy, who entertained the panel at their home in Lae and conducted a tour of their company's crocodile farm; and Wassam and Carol Gabara who acted as guides and hosts in Popondetta.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Advisory Committee on Technology Innovation (ACTI) of the Board on Science and Technology for International Development, National Research Council, is assessing scientific and technological advances that might prove especially applicable to problems of developing countries. This report is one of a series that explores promising areas of science previously unknown, neglected, or overlooked. Current titles in the ACT! series on Managing Tropical Animal Resources include:</P>
+<P ALIGN="JUSTIFY">· Water Buffalo: New Prospects for an Underutilized Animal (1981) </P>
+<P ALIGN="JUSTIFY">· Little-Known Asian Animals with a Promising Economic Future (1983) </P>
+<P ALIGN="JUSTIFY">· Crocodiles as a Resource for the Tropics (1983) </P>
+<P ALIGN="JUSTIFY">· Butterfly Farming in Papua New Guinea (1983) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These activities are supported largely by the U.S. Agency for International Development (AID). Program costs for this study were sponsored by AID'S Bureau for Asia, and staff costs by AID'S Office of the Science Advisor, which also made possible the free distribution of this report. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">1 Introduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles, alligators, caimans, and gavials ( Present-day crocodilians are grouped into three families: crocodiles, alligators and caimans, and gavials (gharials). The animals differ from one another only in minor characters such as shape of snout, arrangement of scutes, and dental features. This report focuses mainly on crocodile species, but its conclusions are generally applicable to alligators, caimans, and gavials.) have existed for some 200 million years - much longer than mammals - but they are now disappearing at alarming rates. Of the 21 or so species of crocodilians distributed in the warm waters of the world, at least 18 are threatened with extinction in most of the countries where they are found.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although some species, such as the American alligator, appear to be out of danger because of strict conservation measures, many of the others survive mostly in national parks, protected preserves, or a few breeding stations. This is true for the slender-spouted crocodiles of Africa and Asia, the saltwater crocodile of Australia and Southeast Asia, the black caiman and Orinoco crocodile of South America, the Chinese alligator, the Siamese crocodile, and other species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat destruction is a major contributor to crocodilian decline; each year more breeding areas are disturbed as swamps and marshlands are drained, rivers dammed, estuaries reclaimed, and riverine forests denuded. However, illegal poaching by tribal people with their simple but effective traps, snares, and set hooks, as well as professional hunters operating with power boats, spotlights, and modern firearms are also decimating the animals over most of their ranges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To a large extent these animals are being destroyed because of their market value. Crocodile is regarded as the costliest and most fashionable leather in western markets. Since World War II, demand for crocodile leather shoes, handbags, luggage, wallets, watchbands, and other expensive luxury articles has far exceeded supply. Even small items such as purses and handbags sell for many hundreds of dollars each. For instance, a ladies' purse or handbag made from crocodile skin can command prices as high as $4,000. A pair of men's shoes may cost from $500 to $900, and a wallet from $150 to $250.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The crocodile trade peaked in the mid-1960s, when world markets absorbed more than 2 million crocodile skins each year. Today it is still large. In 1979, for instance, 1,000,000 caiman hides and 300,000 true crocodile hides entered international commerce. In 1981 the United States itself imported 100,000 hides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International markets for reptile hides and leathers are centered in France, Italy, the Federal Republic of Germany, and Japan. France, the single largest buyer of raw crocodilian hides, uses an estimated 300,000 to 400,000 skins a year. The major buyers of finished crocodile leather products are Hong Kong, Japan, Thailand, Singapore, and the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unrestricted hunting and poaching for hides are wiping out the large breeding animals. Excessive hunting has a devastating effect on crocodile populations because their age distribution is like a pyramid: a small number of breeding animals dominates a large number of juveniles and hatchlings, most of which never survive to maturity. Such societies, in which the size of future populations depends on only a few animals, are highly vulnerable to extinction; once some of the mature members are killed the population can crash. And it takes a long time for a crocodilian population to rebuild because for most large species the females do not begin breeding until they are at least 8 years old.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rearing Crocodiles</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there may seem to be no future for many crocodile populations, the situation is not hopeless. With intelligent intervention and under good conditions they can recover rapidly. Mature crocodiles have no enemies other than man, and, given some care and protection, a small number of breeders can produce a huge number of progeny each year. Mature females of the various crocodilian species usually lay between 30 and 70 eggs each year, and under normal conditions most of these eggs hatch successfully. The key to conserving the population is to protect the few mature animals and their habitats. Then, because of their fecundity, crocodilians can rapidly build up large numbers of young.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This has been exemplified by the American alligator (Alligator mississippiensis). Ten years ago its future seemed doubtful, but the legal protection of the populations has brought a remarkable recovery. Numbers are now so high that two states have lifted the ban on harvesting alligators, and between lo,ooo and 20,000 American alligator hides now enter commerce each year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The past few decades have seen several other examples of successful crocodile-rearing projects. Later chapters of this book highlight the national program in Papua New Guinea. In addition, three successful government-operated farms exist in India (where all the progeny is returned to the wild because current Indian law prohibits commercial crocodile farms). A remarkable farm with more than 3,000 breeding animals operates on the outskirts of Bangkok, Thailand. Australia has four crocodile farms, and a few African countries now have crocodile farms that are already beginning to supply hides internationally. For example, in 1982 Zambia had two such farms, Zimbabwe, five, South Africa, four (with five more planned or under construction), and Kenya, one. Appendix A lists these and other countries that are initiating farms for various crocodilian species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The early technical success of these projects offers the expectation that with an appropriate framework of safeguards and research, crocodiles might become a thriving resource for tropical nations. If such experiences can be replicated, crocodilians and their habitats may come to be considered as resources to be managed and treasured. This will require considerable investment, strict legislation and law enforcement, and international cooperation and research, as well as careful monitoring of the traffic in farmed hides. But national crocodile industries are a possibility, and they could result in thriving natural populations that are free from the danger of extinction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Such prospects may also provide economic incentives for preserving the often-fragile ecosystem in which wild crocodilians live. Crocodile farming could play a part by slowing the uncontrolled draining of swamps and other wetlands that cover large areas of the lowland humid tropics of Asia, Africa, and Latin America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles as a managed resource could economically benefit remote areas of the lowland tropics. Villagers there often have few alternative sources of income and possibilities for economic development are limited. Because the human population is relatively sparse, few opportunities exist for local trading; even where fish are abundant the problems of marketing are formidable. Indeed, in some areas crocodiles may constitute the only readily salvable resource.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles as Farm Animals</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Well-fed crocodiles grow quickly. Under ideal conditions they may reach lengths of 1 m or more in a year and 1.5 m in 2 years. They are normally harvested in the third year when they reach about 2 m in length. In this time their value may have risen from about $5 to as much as $200.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles have acquired a reputation as voracious feeders; investigations reveal this to be false. The animals actually have modest food requirements. Many hatchling animals have a food conversion rate of about 50 percent; that is, the crocodile adds 1 kg of weight for every 2 kg of food it consumes. Cattle, sheep, and pigs would have to eat 3-5 times as much food to achieve the same weight increase. After 2 years the crocodile's growth rate begins to slow down. During the third year the conversion falls to about 25 or 30 percent, which is still a high figure, and makes crocodiles probably the most nutritionally efficient land animal for commercial husbandry. Only the growth of some fish is comparable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The high food conversion efficiency is due to the fact that crocodiles have low metabolic rates and are normally extremely lethargic. They are active only in short bursts, spend hours immobile, and move only about one-third as much as mammals. Moreover, being reptiles, they spend almost no food energy maintaining body temperature. They bask in the sun to keep warm and seek shade or water to cool off. For these reasons crocodilians can thrive in marginal habitats unsuitable for mammals or birds (Investigations on the Nile crocodile showed that a pelican takes 3 days to consume food equal to its own weight, whereas a crocodile takes 125-160 days - Cott, 1961.) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile farming is also space efficient. As long as they are sorted by size, hundreds of juveniles or dozens of larger animals can be penned together in a small area. Indeed crocodiles often choose to pile up on top of one another in stacks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known about disease in reptiles. However, as farm animals, crocodiles have a major advantage: they produce antibodies readily and have few problems with external infections. In the wild it is common to find crocodiles missing limbs or tips of tails, with eyes gouged out, or enormous scars on the body. But the wounds heal readily, with little sign of infection (The American alligator is being used at the University of Florida College of Veterinary Medicine as a model for studies on antibody formation.). This minimizes the need for veterinary services, a distinct benefit in remote village farms. Nevertheless, internal bacterial diseases, such as salmonella, can get out of hand and destroy a program by reducing growth rates, lowering hide quality, or killing the animals outright.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile Hides</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is the belly skin that is the valuable part of a crocodile, and the worth of a hide is determined by the size of the belly skin, the smallness of its scales, and the hide's general condition. (Holes, cuts, scars, and rot drastically reduce its value.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although international markets utilize any crocodile skin from 0.3 m to 6 m long, the most sought-after hides are not the biggest but the moderate-sized ones from animals about 1.5-2 m long. These hides are approximately 25-50 cm in belly width.( A crocodile's total length is approximately 4-4.5 times the width of its belly). Large hides, for example those more than 3 or 4 m in length, are suitable only for luggage and briefcases because their scales are large. Smaller hides, on the other hand, are suitable both for items such as shoes, handbags, and wallets and for larger items.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Internationally, the most desirable hides come from the saltwater crocodile (Crocodylus porosus). It has proportionally the smallest belly scales of any crocodile, it lacks osteoderms,(Osteoderms are deposits of calcium carbonate under the skin. They are undesirable because they dissolve away during the tanning process, leaving a pitted surface),and on the side of its body the scales are uniformly small. The next most valuable hides probably come from Morelet's crocodile (Crocodylus moreletii), the American alligator, the Siamese crocodile (Crocodylus siamensis), and the Nile crocodile (Crocodylus niloticus). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The rest of this report highlights the program in Papua New Guinea, where during the last 10 years the government has made crocodile rearing an organized industry, much as poultry farming is elsewhere. This program, which is beginning to establish crocodiles as a significant natural asset, is designed both to protect the wild populations and to integrate traditional uses of these reptiles into a scientifically managed hide industry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Papua New Guinea crocodile farming (In the official terminology of the Convention on International Trade in Endangered Species of Wild Fauna and Flora (CITES), the Papua New Guinea program is "ranching" rather than "farming" because the young livestock are mostly culled from wild populations and are not bred on the farm) has become the cornerstone for the economic improvement of some of the world's poorest people. It offers a means for bringing the rural poor into the process of economic development, and it can be blended into a traditional village structure where land and resources may be communally owned.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The projects are small and many have had operational difficulties, but they suggest that conservation and economic development can be not only compatible, but also mutually reinforcing. The innovative idea is not that crocodiles can bring in money, but that sound conservation can be blended with marketing crocodile skins, meat, and by-products.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An important aspect of this approach to crocodile conservation is that it is based on protecting the existing landscape and resources. It provides a tool for conserving the species in their own wild habitats so that survival will not depend on a few captive specimens living under artificial conditions. It requires none of the bush clearing, fencing, forage planting or pesticide spraying that domestic animals often demand ,important advantages in an economic development project in a fragile tropical swamp or rain forest ecosystem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Papua New Guinea approach, then, provides an economic incentive for wildlife protection. Everyone ,from the villager to the minister of trade ,has a stake in keeping the wild populations healthy. Out of self-interest, in addition to natural respect, large numbers of people become the guardians of the resource and the habitat needed to keep it surviving and productive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The world's major conservation organizations have given Papua New Guinea's crocodile program their stamp of approval. In 1976 a team of scientists representing the International Union for the Conservation of Nature and Natural Resources, one of the most prestigious conservation organizations in the world, inspected the program. As a result, Papua New Guinea was given special dispensation, and its crocodile skins can be legally traded internationally. For example, because of its endangered status the saltwater crocodile is banned from trade by the Convention on international Trade in Endangered Species of Wild Fauna and Flora (CITES). An exemption, however, is granted to Papua New Guinea in recognition of the fact that its crocodiles now are sufficiently well managed to sustain a skin industry without seriously damaging the wild stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This program serves as a model for nations of the Americas, Asia, and Africa where crocodilian resources are still unmanaged or managed poorly. Crocodiles are being destroyed so fast that within about five years Papua New Guinea and other countries that have organized crocodile farming operations may be the only ones supplying significant numbers of skins to the international market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the principles developed in Papua New Guinea deserve international attention, the recipe will not be a cure-all for problems of rural development or crocodile conservation. Instead, the Papua New Guinea experience suggests that local social, political, economic, and conservation goals can become the impetus for a successful blend of village improvement and wildlife protection.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">2 Crocodile Farming in Papua New Guinea</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As recently as the l950s, crocodiles were abundant in Papua New Guinea. Hunting was a major occupation and was unrestricted. Some Australians and Europeans made fortunes by shooting thousands of crocodiles a year to make shoes and handbags in Europe and North America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it was obvious that wild populations could not sustain such wholesale slaughter, the destruction continued. By 1967 both the saltwater crocodile (Crocodylus porosus) and the freshwater crocodile (Crocodylus novaeguineae) were threatened with extinction. By 1968, despite increased hunting, the yield of skins had dropped in half; along the easily accessible river systems, crocodile populations had been wiped out. By 1969 the saltwater crocodile had disappeared from much of its range throughout the country, and wildlife officers estimated that without protection most specimens of breeding size would be eliminated within five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But how could crocodiles be protected? Papua New Guinea is divided by mountain ranges, ravines, torrential rivers, forests, seas, malarial swamps, and more than 700 languages. It would take hundreds of trained wildlife officers to enforce a ban on crocodile hunting, particularly in the face of opposition from tribesmen who have traditionally harvested crocodiles for food, decorative items, and implements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The challenge was given to the officers of the Wildlife Division. Under the leadership of Max C. Downes, these officials concluded that the best way to protect crocodile populations was to halt the slaughter of the large breeding adults and build up a new hide industry based on the increased numbers of young that would result.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Few young crocodiles ever reach breeding age in the wild. The tiny, virtually defenseless hatchlings are easy prey for large fish, birds, or other crocodiles. Almost all of them are killed by predators or by other natural causes, such as floods..</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Main areas of crocodile distribution in Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What was needed, the wildlife officers concluded, were incentives to make these smaller animals economically attractive, incentives to encourage local people to raise small crocodiles to commercial size. If that could be accomplished, hundreds of hatchlings that would normally perish could be utilized without endangering the wild populations' future. Villagers could benefit by selling skins while the vital breeding-sized animals were being left alone to provide more hatchlings. The system could benefit both the villagers and the vulnerable crocodile populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="b20a.png"></center><br>
+ Main areas of crocodile distribution in Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The idea was viable partly because many Papua New Guineans - particularly those of the Sepik and Fly Rivers - have ancient spiritual and cultural attachments to crocodiles. To them, the idea of handling and managing the animals is not unusual. Crocodile motifs are common in their art and they live in harmony with the big beasts and do not consider them dangerous pests to be eliminated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Legislation passed by the Papua New Guinea government in 1969 capitalized on this tradition by making the villagers themselves the real force in crocodile protection. The law did not ban crocodile hunting, but instead banned the possession, sale, and export of skins larger than 20 inches (51 cm) wide. In this way, it protected breeding-sized animals while allowing for the harvest of juveniles. It also allowed a person to kill a crocodile if attacked (but barred the selling of the skin, if it were oversized).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1980, the legislation was supplemented by a law banning the export of small skins. Together, the bans on possessing large skins and exporting small skins have created a stimulus for gathering small crocodiles from the wild and rearing them to moderate size on farms. The legislation has been the impetus for crocodile farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile farming officially started in Papua New Guinea in 1972. In the late 1970s, it was extensively supported by a UNDP/FAO assistance program that provided personnel and funds for technical support and program management. Today there are about 300 small village farms (The numbers vary, since some villagers go in and out of production depending on their need for income, seasonal variation in river levels, the cost of fuel, and the availability of government extension agents) supplying a number of larger business groups that rear crocodiles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wildlife officers now teach crocodile farming, not crocodile conservation per se. They have introduced crocodile-rearing techniques to villagers all over Papua New Guinea. They help build pens and teach tribesmen how to care for the young reptiles, which are so vulnerable and timid that they can literally die of fright.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government loans of up to US$10,000, along with matching development bank loans, are available to help a farmer enter the crocodile farming business. The funds pay for pumps for changing the water in the pens and sometimes for an outboard motor used in gathering young crocodiles. Everything else a villager needs can be obtained from the forest, including materials for pen construction; a small farm can therefore be established inexpensively.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Three Types of Farms</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government's crocodile management program recognizes three levels of operation: village farms (up to 300 crocodiles), small-business farms (up to 1,000 crocodiles), and large-business farms (more than 1,000 crocodiles).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A village crocodile farm consists of a small pen fenced with posts lashed together with vines. This stockade fence is about 1.5 m high and is sunk about 60 cm in the ground so the crocodiles cannot burrow out. Much of the enclosure is planted with grass, cassava, and banana trees to provide secluded areas where the animals, which regulate their body temperature by the warmth of the sun, can find shade. A shallow pool is excavated in the center.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These village farms are usually run by only one or two people. Many are little more than pens scattered in the remote bush for holding young crocodiles until a buyer from a larger farm comes around. Small crocodiles bring less money than medium-sized animals, but the villager avoids having to feed and care for them for a long period.(Because of operational difficulties, many village farms were abandoned in 1982. Lack of proper husbandy - despite government efforts - were the main reason for these difficulties. Most villagers now collect and hold young only until buyers from commercial farms arrive. However, they are still earning money from crocodiles, and the concept of fully functioning village farms remains valid for the future in Papua New Guinea, as well as for appropriate sites elsewhere). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The small-business farm usually consists of a group of enclosures (each about 6 m x 6 m) constructed of bush materials. It is typically located near an airstrip. It buys crocodiles from the village farmer and, in turn, supplies them to the larger farms, which sometimes dispatch aircraft to pick the animals up (Special cardboard shipping containers have been devised. They can be folded to make cylinders of various diameters to fit crocodiles of different sizes). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Large-scale crocodile farms accommodate as many as 20,000 crocodiles and require a large investment. They serve to regulate the export of skins and are the major purchasers of live crocodiles from the smaller farms. During periods of drought, flooding, or diminished food supplies, the large-scale farms also act as emergency buyers. On the outskirts of Lae on Papua New Guinea's northern coast, there is a 100-hectare farm with nearly 8,000 crocodiles. It is associated with a poultry company, and the crocodiles are raised on the offal from the slaughterhouse.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government Research and Extension</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Wildlife Division has constructed four demonstration farms across the country and one large research farm at Moitaka near Port Moresby, the capital city. After training at one of these, a tribesman can start his own farm alone or can call on the government for further assistance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moitaka is also the site of short courses in crocodile farming. Prospective farmers are brought in for several weeks' training. They learn how to build pens, to feed and care for crocodiles, to kill and skin them, and to prepare the hides for market. They also learn about the crocodile laws and the reason they were enacted. A farm at Lake Murray, in a remote and swampy area of the Western Province, serves the same purpose. It is built entirely from bush materials (see picture, pp. 6-7).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Wildlife Division provides instruction books, profusely illustrated for the illiterate. The books include vivid descriptions of all phases of farming the animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic Gains</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 10 years, crocodile rearing has expanded remarkably in Papua New Guinea. It has already become the main source of income for the people of some swamp and river areas. The Ambunti area, for example, produces coffee and rice, but crocodile skins now bring in much of the area's income. By 1981 the farms nationwide contained a total of 30,000 crocodiles, ensuring a sustained production of at least 10,000 skins a year worth approximately US$ 1-2 million on the international market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because crocodiles are a familiar resource, villagers take to the program quickly. By contrast, introducing cattle or western-style crop raising requires massive education and training, in addition to some social and environmental disruption.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On government farms in Papua New Guinea, fish-fed crocodiles have increased their belly width by 25 cm per year and are ready for slaughter in 2-3 years when the width approaches 50 cm. The selling price of the skin is then between $100 and $200, depending on species, flaws, and size.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But skins are not the only product. A crocodile with a skin big enough to market can provide 20 kg of meat. The meat is white and is low in fat. Papua New Guinea is a net importer of meat, and crocodile farming is now augmenting local supplies. The large farm at Lae already sells frozen crocodile meat (including front and hind legs, tail steaks, ribs, and chops) both locally and on foreign markets. Some orders have come in from dealers in Paris who supply expensive French restaurants.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">3 Conclusions</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Benefits of Crocodile Farming</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile farming seems to be singularly appropriate for rural, isolated, lowland communities in the tropics. The land there is often unsuitable for conventional agriculture, and the people lead a tenuous existence or drift to the cities looking for work. In such areas, there are few opportunities for people to earn cash without drastic and expensive modifications to the environment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile farming has many advantages over hunting the animal in the wild. For instance, crocodiles farms can:</P>
+<P ALIGN="JUSTIFY">· Permit government monitoring of the crocodile industry. (Hunters are more difficult to regulate since they work in remote areas, often undetected and crossing borders at will.)</P>
+<P ALIGN="JUSTIFY">· Yield a regular harvest of a specific number of animals of a selected size.</P>
+<P ALIGN="JUSTIFY">· Produce a standardized, premium product that better serves the needs of the international hide industry, making skins poached from the wild less desirable. (They may provide, for instance, a standard first grade 1-1.5 m long hide rather than hides of mixed size and quality.)</P>
+<P ALIGN="JUSTIFY">· Reduce the wasteful losses of hides from improper handling, the fate of a high proportion of skins now brought in from the wild.(*In remote areas, salt may become scarce late in the season as it is used for hides. This often results in insufficient salt being used when the supply runs out and hides subsequently rot or "slip". In some isolated areas, as much as 25 percent of the hides are lost or downgraded because of improper curing for lack of salt. However, skins produced on farms, especially near urban areas or large villages, are usually properly salted; if salt becomes scarce, killing of the animals can be delayed) </P>
+<P ALIGN="JUSTIFY">· Educate the public about crocodile ecology and the animal's importance to the habitat and the local economy.</P>
+<P ALIGN="JUSTIFY">· Provide sites for scientific studies on crocodilians. Studies conducted on alligators at the Rockefeller Refuge in Louisiana, USA, for example, have provided reproductive, nutritional, and growth data directed specifically towards developing efficient farming techniques.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For some farms the earnings from hides, meat, and by-products may be supplemented by tourism (through gate admissions and the sale of curios), as well as by selling eggs and young to other farms for breeding stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A long-term program of wise utilization of crocodiles can benefit governments by providing revenue from hides, curios, craftwork, and manufactured articles, as well as from export duties. Furthermore, in their natural state in parks and preserves, crocodiles are an important tourist attraction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In an effort to preserve crocodile habitats, the Papua New Guinea program has encouraged the collection of eggs or young from the wild and has discouraged the breeding of crocodiles in captivity. This is because a reliance on the wild creates economic incentives to conserve crocodile habitats; if the habitats are drained for human settlement or conventional agriculture the farmers lose the source of their stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contrary to popular impression, preliminary observations indicate that crocodiles benefit commercial fisheries. The animals are important links in the ecosystems of rivers and lakes and are often the largest inhabitants of the freshwater wetlands. Their movements inhibit the growth of aquatic plants in the waterways, and, in areas with prolonged dry seasons, some species maintain residual waterholes that benefit small aquatic organisms that would otherwise perish. In estuaries and lakes, crocodiles enrich the nutrient content of the water by converting terrestrial prey into feces that in turn feed invertebrates and fish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where crocodiles have been eliminated, reductions in the tonnage of fish caught for human consumption can usually be demonstrated. For example, in Brazil, Kenya, and India, a decline in the fishermen's catch has paralleled the decline in crocodiles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Limitations of Crocodile Farming</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments and individuals seeking rapid returns on investments should realize that a crocodile farming industry is not a get-rich-quick scheme. To build a stable national industry may require 10 years and an investment of at least $500,000 before it is biologically and economically successful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, an organized industry is vital. A village crocodile-rearing pond is only profitable if there is someone to buy, grade, package, and ship the product with all its documentation. Services will be needed at all levels to advise on disease control, nutrition, skinning, and preserving the hides. In many parts of the world crocodile farms have been financial and conservation failures not just because of poor husbandry management, but also because of fiscal shortsightedness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Selection of a suitable farm site is basic to the economics of the entire operation. Farms demand a steady supply of meat or fish to feed the crocodiles, and are most successful when located near a reliable source of inexpensive food. Some farms take advantage of offal from nearby chicken or cattle abattoirs; others use the fish by-catch from shrimping operations. In the absence of an inexpensive animal protein feed, the farm will have to raise its own food (tilapia is frequently used) or harvest it from the wild, both of which can be expensive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodile farms also require a steady year-round supply of clean water for the holding ponds and tanks. If this cannot be supplied by gravity flow from nearby sources, it must be pumped from wells or from nearby lakes or ponds. This, too, is likely to be expensive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the general hardiness of crocodiles, the farms must have access to veterinary care. Most disease problems stem from poor sanitation, low water temperatures, and poor diet, all of which can be easily corrected. But with large numbers of animals crowded together, disease problems, if not quickly diagnosed and treated, can wipe out the young captive animals in epidemic proportions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capturing and transporting large crocodilians is dangerous and difficult. Dealing with a large captive population of crocodiles of different age groups and sizes requires a great deal of experience.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although crocodilians are common in zoos, successful breeding of these reptiles in captivity is so far a rare and remarkable event. However, researchers are now coming to understand the behavioral requirements for success. For instance, gravid females must have access to appropriate nesting sites, males must have ample space when they are penned in with other males, and juveniles and hatchlings must be separated from their parents and housed by size and feeding preferences. That prolific breeding can be achieved, however, is illustrated by the Samutprakan crocodile farm near Bangkok, Thailand, which reportedly has reared tens of thousands of its own animals and now aims for a population of 100,000 crocodiles by 1987.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The worldwide shortage of crocodile leather is becoming more acute each year, and it will be many years before any output from farms can significantly reduce pressure on wild populations. Thus, farming should be only one aspect of an overall conservation program that includes total protection of some populations in national parks and sanctuaries. In addition, the conservation of natural wetlands is an important part of overall economic planning. If wetlands are lost, many wild species in addition to crocodiles will be affected.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Australia, Asia, Africa, and the Americas, many crocodilian populations are poorly protected because governments lack the manpower or the will to enforce conservation laws rigorously, especially in the remote areas where the last remaining crocodiles reside. Because most wildlife departments in the tropics are short staffed and have vast areas to police, their efforts at wildlife protection are frequently ineffective. Moreover, some countries have been slow to introduce protective legislation for an animal that does not engender public sympathy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua New Guinea's program offers one of the best hopes for saving all endangered crocodiles, alligators, caimans, and gavials. The methods developed there serve as a model for other nations. By providing an alternative, Papua New Guinea gives villagers the incentive to protect wild crocodiles that are breeding nearby so as to assure themselves of future supplies. The people themselves become the conservators of the local animals and habitats. In turn, watersheds, soils, and conventional agricultural development (including natural and forest products) can all benefit. The habitat is also preserved for many other wildlife species that share it, and genetic diversity can be maintained. Conversely, without a special incentive to conserve them, all these resources are normally degraded as a region develops.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">4 Regulations, Safeguards, and Research Needs</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Papua New Guinea experience provides a model for other nations, but to implement such a program requires a foundation of legislation, government support, and legal safeguards. Prerequisites of any crocodile farming program are an overhaul of legislation, strict law enforcement, and reciprocal laws with neighboring countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The enforcement of wildlife regulations is so inadequate in most countries that crocodile farming is open to abuse. Farms can front for illegal poaching operations, and hides taken from the wild can be intermingled with hides produced on the ranch or farm unless government enforcement is stringent and inspection frequent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, the stimulation of world trade in crocodile hides through the sale of farmed hides might lead to increased poaching of wild crocodiles or eggs. Poachers have fewer operating expenses than farmers, and unscrupulous hunters and dealers can harvest hides, steal crocodile eggs or young, and subsequently sell them through countries that lack enforcement capabilities. This practice could be disastrous for countries where crocodile populations have almost disappeared.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government Regulations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before any farming scheme is attempted, protective legislation should be in operation throughout the country. This should make it unlawful to kill, capture by any means whatsoever, disturb willfully, or pursue any crocodiles, or to collect or gather any crocodile eggs without a permit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No crocodile eggs should be allowed to be imported or exported with out a permit. No persons should possess, sell, buy, donate, receive consequent upon a donation, convey, keep in captivity, or display any live crocodiles without being the holder of a permit. And no person should be allowed to import or export any crocodile, dead or alive, or any portion of a crocodile, processed or not, from any country without a permit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before granting a license for a commercial farm, the government should investigate the applicant's land tenure and financial resources, particularly since the farm will have to operate for three to four years before producing crocodiles suitable for culling. The applicant's ability and experience in rearing crocodiles should be determined. A plan of the proposed farm, including details of water and food supply and the proposed methods of harvesting food, should be examined.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is suggested that:</P>
+<P ALIGN="JUSTIFY">· No permit for egg harvesting should be issued until adequate rearing facilities have been prepared. The permit should state the name of the holder or his authorized representative, the annual total number of eggs allocated for harvesting, and the area where collection is permitted.(In some cases it is also important to specify a harvest time. Often it is best to take eggs laid early in the season because the female will then lay another clutch.) </P>
+<P ALIGN="JUSTIFY">· Permits should be issued on a year-by-year basis. The applicant should understand that the department may refuse to renew or issue further permits if the farm is not managed satisfactorily or if permit conditions have not been observed.</P>
+<P ALIGN="JUSTIFY">· The applicant should understand that the farm and all production records should be available for inspection by an official of the conservation department.</P>
+<P ALIGN="JUSTIFY">· The farmer should be required to submit periodic reports detailing the total number of nests raided and eggs harvested, the egg mortality, and the number of eggs hatched. Thereafter, the number of animals held in captivity, the rate of mortality and its causes, if known, and the number of animals sold or culled should be included in each report.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Furthermore, it is recommended that the permit holder release 5 percent of his annual crop of hatchlings in order to restock the natural habitat. In addition, a further 5 percent of the hatchling crop should be reared to a length of 1 m before being released, bringing the total release of young crocodilians to 10 percent of the annual crop of hatchlings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The distribution of hatchlings and young reared animals should be supervised by the conservation department.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unless government agencies monitor the wild populations of crocodilians being harvested for hides, eggs, or young, the farms themselves could become a major drain on those populations, leading to their extinction. Therefore, before any farming program is started, a survey of the breeding grounds should be undertaken to determine the number of nests available and those from which eggs can be taken with least danger to the wild population (for example, from nests on grounds likely to be flooded).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These breeding grounds should be fully protected; tourists on foot, in vehicles, or in launches should not be allowed to visit or disturb crocodiles during the breeding season.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International Safeguards and Cooperation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The international traffic in millions of unmarked crocodilian hides and products poses one of the greatest obstacles to enforcement of national and international endangered species regulations. Hides and skins frequently cannot be traced to their source or country of origin. Legally harvested or farmed animals cannot readily be distinguished from those exported in secret from illegal sources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The need for internationally acceptable methods of marking individual hides and products is critical. Traffic in illegal crocodilian hides and products will continue as long as law enforcement agencies lack the means to detect them easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the United States a system has been developed in some states that enables conservation, police, and customs officials to monitor traffic in alligator hides. A conservation authority issues an official tag for each animal allowed by the license. All hides exported are tagged with a serially numbered plastic tag that cannot be removed without breaking it. The serial number is recorded on the export permit and with details of the buyer's and seller's name and address. This tag remains on the hide, right through the tanning process, until the hide reaches the manufacturer. Each tannery maintains a register of purchases that is available for inspection. This system also is being implemented in Zimbabwe and is worthy of trial in other countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tagging of all hides and products for individual identification is an important safeguard. Other safeguards include:</P>
+<P ALIGN="JUSTIFY">· The use of engraved stamps or seals to authenticate legal licenses and export permits and make it more difficult for documents to be forged.</P>
+<P ALIGN="JUSTIFY">· Internationally accessible data and a retrieval system that allows law enforcement personnel to corroborate the authenticity of documentation and the origin of hides and products;</P>
+<P ALIGN="JUSTIFY">· Monitoring agencies to record and publish market statistics, traffic, and trends;</P>
+<P ALIGN="JUSTIFY">· Laws limiting the sale of hides only to nations that cooperate in an internationally sanctioned program of safeguards; and</P>
+<P ALIGN="JUSTIFY">· Research funding to monitor populations and develop new marking and identification techniques. (For instance, the use of dyes, roll marking, and infusion of detectable chemical tracers has yet to be fully explored.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research Needs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is urgent need for tannery owners, manufacturers, and conservation authorities to jointly work out the rational exploitation of crocodile populations. Commercial interests have reaped a rich reward over many years, and if the crocodile industry is to continue, its entrepreneurs must invest in management and conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Clearly, research to improve farming techniques will be a wise investment for both commercial operators and the countries concerned. Surveys to determine population numbers and size as well as the structure of breeding stocks and recruitment rates are essential. Such surveys may indicate the need to establish sanctuaries to protect breeding stock and nesting grounds, or perhaps to ban hunting to allow populations to recover. A rearing program and restocking of suitable habitats might be necessary.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendixes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix A: Crocodile Farming Around the World</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experiences with crocodile farming in Papua New Guinea, the main subject of this report, are described in chapter 2. Here we summarize the status of similar efforts in other countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Four crocodile farms have been established in Australia, one in the Northern Territory and three in Queensland. To date, only the Edward River farm, operated by the government as an aboriginal development project, has developed a successful breeding program. There, seven-yearold saltwater crocodiles (Crocodylus porosus) hatched on the farm from wild eggs are now breeding and laying fertile eggs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People's Republic of China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A farm for Chinese alligators (Alligator sinensis) has been established at Xuancheng, Anhui Province. Its purpose is to breed alligators for conservation, although the hide of this species is not in great demand because it has many osteoderms in the belly scales. Recently the government has expressed interest in establishing a farm for saltwater crocodiles in southern China. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taiwan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taiwan has one crocodile farm or rearing station, but it is too far north to breed its own stock, except in heated indoor enclosures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are several buyers in the Philippines who maintain pens of crocodiles for short periods. None of these is a farm. A new experimental farm for the Philippine freshwater crocodile (Crocodylus novaeguineae mindorensis) was established by Silliman University in an attempt to preserve that endangered species and to promote an economic interest in crocodile conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Micronesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A farm for saltwater crocodiles has been established on Palau, where a small population of these crocodiles occurs in a brackish interior swamp. In the past, the government hired a hunter to reduce the population whenever the local people felt it had become sufficiently large to present a danger, about once a decade. Presumably the nuisance crocodiles will now end up in the farm. The farm, which has been in existence only for a year or two, earns money from tourist admissions as well as hide production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A few crocodile-rearing stations have operated for several decades in Java, Sumatra, and Kalimantan. These have been stocked with eggs and young animals collected from the wild in Sumatra and Kalimantan. In the early 1970s, three such operations in Samarinda, East Kalimantan, closed down for lack of wild stock. At least one operation in Jakarta, Java, continues to survive, but with virtually no output of stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A survey of Irian Jaya (Indonesian New Guinea) in 1980 indicated a number of ranches in that region as well, but revealed that some were having difficulty obtaining stock because of overharvest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singapore</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singapore has a famous crocodile farm that figures prominently in tourism. It breeds some of its stock, but also obtains wild stock from all over Southeast Asia. Singapore has a thriving crocodile hide trade. Many buyers and several tanneries are located there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singapore is not a member of CITES and openly trades in any and all species of crocodilians.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are several crocodile farms in West Malaysia (at Penang, for example) and at least one in East Malaysia (near Sandakan, Sabah). These started out as rearing stations relying on wild young, but have moved slowly toward breeding their own stock. The Penang farm depends on tourism to pay many of its expenses. The Sandakan farm is operated in conjunction with a duck and pig farm that supplies it with offal. Its stock consists of saltwater crocodiles. Until at least 1980, it had very little production from captive animals, but the owner is hoping to broaden his stock from them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sarawak (East Malaysia) also used to have several rearing farms. The present status of these operations is unknown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Samutprakan Crocodile Farm was started in 1950 with 20 wild crocodiles and an investment of US$500. Today it is reported to be the world's largest crocodile farm, with about 30,000 individuals. About 3,700 of these animals, placed in eight separate breeding ponds, are used for breeding stock, and there are plans for a population of 100,000 by 1987. The Samutprakan farm opened to the public 12 years ago and now receives about one million visitors annually.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most of the farm's crocodiles are from the two species native to Thailand, the saltwater crocodile and the Siamese freshwater crocodile (Crocodylus siamensis). It also has hybrids of the two, as well as the indigenous false gavial (Tomistoma schlegelii) and five exotic species: South American caiman (Caiman crocodilus), New Guinea freshwater crocodile (Crocodylus novaeguineae), Chinese alligator (Alligator sinensis), broad-spouted caiman (Caiman latirostris), and dwarf caiman (Paleosuchus palpebrosus). The farm has succeeded in breeding South American caiman (Caiman crocodilus); the other species are approaching maturity and it is hoped they will breed in the near future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The farm sells crocodile meat locally, mostly to restaurants as a delicacy (for US$5 per kg).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The commercial and biological success of the farm is largely due to favorable conditions at Samutprakan. The temperature and humidity are high year-round, and low costs of labor and building materials permit the physical plant to be profitably established and maintained. The main cost is for food; approximately 4,000-5,000 kg of by-catch fish are needed daily at a cost of US 20 cents per kg. If the supply of fish is inadequate, the diet is supplemented with chicken wings, legs, and necks from a slaughterhouse.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burma</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Rangoon there are some crocodile-holding pens operated by hide buyers. It is not clear whether breeding or farming of crocodiles occurs in them or whether the operation simply acts as a clearing center for wild hides. The government has expressed interest in establishing farms in the mangrove areas near the mouth of the Irrawaddy River. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1974 an FAO report on India's crocodiles noted that the Indian gavial (Gavialis gangeticus) was on the verge of extinction, the saltwater crocodile was extremely rare, and the Indian mugger (Crocodylus palustris was a depleted, although not threatened, species).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government, with United Nations assistance, then initiated a project for the conservation and management of all three species. This program aimed to protect and restock habitats. Animals for restocking were obtained by collecting eggs laid in the wild, incubating them under controlled conditions, raising the resulting hatchlings, and returning juveniles to specially selected sanctuaries when they reached about 1.2 m in length,at which time they are free from predation other than by man.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project has resulted in the comeback of the gavial. By March 1979, 200 gavials had been restored to the wild. The wild population now exceeds 1,000 animals of more than 2 m length, and the number is expected to increase rapidly through natural reproduction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project has also carried out extensive research on crocodiles, and since its founding in 1978 the Central Crocodile Breeding and Management Training Institute, located in Hyderabad, has trained many wildlife officers in crocodile protection. Crocodile-rearing facilities are also located near Madras, Lucknow, and Cuttack. All have had success in raising the animals and restocking their habitats.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Indian crocodile project has been a notable success and it coincided with (and perhaps helped create) a wave of local interest in India's wildlife and its conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Israel</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A farm stocked with American alligators (Alligator mississippiensis) was established at a popular hotwater spring resort area, using animals supplied by a Florida farm. The Israeli program will earn money from tourist admissions and from future production of hides. The first successful hatching of captive-bred alligators was reported in 1982.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Near Mombasa a farm for the Nile crocodile (Crocodylus niloticus) has been set up to produce hides from captive-bred stock. The farm is a demonstration project of a large cement factory that is attempting to return its limestone-mined areas to productive agriculture. Some sophisticated experiments are under way on crocodile nutrition, with food for the animals produced in an intensive aquaculture project using tilapia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia is planning a series of farms patterned after those in Zimbabwe (described below).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe has made great strides in captive breeding. In 1979, 87 captive females at two farms produced 1,906 eggs, and a third farm has set aside 30 captive females for breeding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Four of the country's five crocodile farms are on the shores of Lake Kariba and the other is at Victoria Falls. The government allows each farm an annual allotment of wild eggs (averaging 2,000 to 2,500 eggs) for stocking its rearing programs. Each farm is also striving to become self sufficient in egg production by developing successful breeding programs. The government is considering reducing each farm's allotment by the number of eggs produced annually in the farm so that each will eventually become independent of the wild populations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe farmers operate on a system that obliges them to return a small percentage of live animals to the wild if the government requires it. At present, this requirement is being waived because the wild population is increasing on its own.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe has built its crocodile conservation program on a broad base. Crocodiles are protected throughout the country, as game animals in the country at large and as totally protected species in parks and sanctuaries. Populations have increased dramatically, from endangered status in the l950s to over 50,000 individuals today. In the 1950s a survey of the Zambesi River and Lake Kariba revealed no crocodiles; today thousands are seen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe's Department of National Parks and Wildlife is striving to ensure that its legitimate international trade in farm-raised hides does not provide illegal operators in other countries with the opportunity to sell poached hides (for example, forging papers that claim their hides originated on legitimate Zimbabwe farms). To make poaching difficult, Zimbabwe, taking a clue from the state of Louisiana, plans to use serially numbered nonremovable plastic tags to mark legitimate hides. Numbers of the tags will be noted on export permits. In addition, every export permit will be validated by the government with an engraved security stamp that is difficult to forge and that shows ink damage if any erasures or modifications are attempted. The use of such stamps is recommended by CITES, and Zimbabwe is the first nation to put them into use.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Africa has four crocodile farms, and another five are planned or under construction. Apart from the Natal Parks Board Crocodile Research Station at St. Lucia Estuary, which breeds Nile crocodiles for restocking and conservation purposes, all farms are for tourism and hide production. So far only one farm, outside Pretoria, is reported to produce many offspring. Only the provinces of Transvaal and Natal have wild crocodiles, and neither allows eggs, young, or adults to be collected for stocking farms. Both provinces, however, permit the killing of nuisance crocodiles on private land. Transvaal will allow one or two nuisance crocodiles to be taken captive by farmers, but it refuses permission for removing larger numbers of nuisance animals,presumably for fear that this would generate a flood of spurious nuisance complaints. Natal will not permit the removal of any wild crocodiles to farms, nor will it supply offspring from the St. Lucia station to farmers. This makes the Pretoria farm the only source of crocodiles in South Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following the example of Zimbabwe, the South African farmers (present and potential) formed a crocodile farming association in 1982.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Botswana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several farms patterned after those in Zimbabwe are planned for the Okavango area. Petitions for approval are currently before the Botswana government.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the late 1960s French businessmen established a farm for Nile crocodiles near Lake Chad. It collapsed after only a few years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ivory Coast</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government of Ivory Coast has obtained assistance from Zimbabwe to establish a conservation program for its three native crocodiles: the Nile crocodile, African slender-spouted crocodile (Crocodylus cataphractus), and Congo dwarf crocodile (Osteolaemus tetraspis). Recommendations were made for conserving the wild populations as well as for establishing farms. Field studies are under way.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Europe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A commercial farm for the South American caiman (Caiman crocodilus) was established in southern Italy in the late 1970s. Stock was obtained from Colombia. The animals, numbering in the thousands, arrived in Rome in winter and were transported south to the farm in an open truck. Most died from cold. Later shipments fared no better, and the few animals that survived died from poor husbandry. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Americas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United States</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are between 15 and 20 successful alligator farms in the United States. Most are located in Florida and Louisiana, and there is at least one in California. All earn a portion of their money from tourist admissions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cuba</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the 1960s the Cuban government established at least two farms for crocodiles. One is located in the Zapata Peninsula National Park; the other is near Cienfuegos. The purpose of these farms is to breed crocodiles whose wetland habitat has been converted to sugar cane fields. Eventually, the farms will also produce a cash crop of hides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, what started out as an admirable effort created several conservation problems because the farm managers did not realize there were two crocodiles in Cuba ,the American crocodile (Crocodylus acutus) in brackish waters, and the Cuban crocodile (Crocodylus rhombifer) in freshwater areas. The two were mixed in the farms and hybridization resulted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mexico</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Mexican government has established several farms for Morelet's crocodile (Crocodylus moreletii) in Chiapas and Veracruz. The purpose is to breed the species in captivity to relieve hunting pressure on the wild population and prevent its extinction. Original funding was provided by the World Wildlife Fund. At least one of these farms still exists. Breeding has been achieved, but there have been problems of survival in hatchlings. The cause of the deaths has not been discovered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years several businessmen in Mexico have expressed interest in starting one or more crocodile farms, but none has yet materialized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">El Salvador</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the late 1960s, the Louisiana Game and Fisheries Commission supplied specimens of the American alligator to a cattle rancher in El Salvador for the purpose of establishing an experimental farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Louisiana was interested in studying growth rates of American alligators in a tropical nation where the animals did not have to undergo winter hibernation. The husbandry on the farm followed methods worked out in Louisiana. The animals grew fast and presumably have started breeding. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Venezuela</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A captive breeding program for the Orinoco crocodile (Crocodylus intermedius) was established in Venezuela in the late 1970s on the ranch of Tomas Blohm. The operation is not commercial; its purpose is to prevent extinction of the species. The offspring may be used for restocking wild habitats in the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under Venezuelan law there can be no commercial export of any crocodilians. In addition, the Orinoco crocodile and the various caimans are protected. However, the reptiles are everywhere killed as vermin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peru</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peru has proposed harvesting certain wild populations of caimans (Caiman crocodilus) to supply animals to a ranching operation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BraziI</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government of Brazil is interested in establishing farms for several species of caiman, including the yacare (Caiman crocodilusyacare). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Latin American Nations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the past two years, other Central and South American nations that have indicated their intention to set up farms for crocodiles or caimans are Bolivia, Colombia, Costa Rica, Ecuador, French Guiana, Guatemala, Guyana, Haiti, Honduras, Nicaragua, Panama, Paraguay, Suriname, and Uruguay. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix B: Practical Crocodile Farming</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This appendix is adapted from a paper by A. Pooley that detailed the lessons learned from farming crocodiles to restock depleted habitats in Natal, South Africa. The information is presented here not as a blueprint for setting up a farm, but to show prospective farmers some of the points that they must first consider before attempting to rear crocodiles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Farm Location</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reliable supplies of good water and suitable food are the most important considerations for establishment of a crocodile farm; the area selected must have both. Village farms also need to be close enough to wild crocodile populations for the animals to be obtained easily. Larger farms can be located farther from the source.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For small farms, a natural supply of food should also be readily available in the wild. Areas that have a fishing industry are ideal locations. For large farms, sites near slaughterhouses or fish-processing facilities are ideal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other considerations also include the volume of water available throughout the year, the distance over which water must be piped to the ponds, and pumping costs. The quality of the water should be established, with samples tested for salinity and acidity and, where the supply comes from mineral springs, analyzed for harmful chemicals. Chlorinated water must be tested regularly to ensure that the chlorine content is not too high, and the nature of any factory effluents present should be determined. It is important to establish whether fish, frogs, crabs, mollusks, or aquatic insects survive in the water intended for use.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bacterial analysis is advisable where the water is drawn from a river that drains an area densely populated by humans and livestock. If the water is found to be contaminated, the stagnant pond rearing pen system should not be used, particularly when Salmonella spp. are present in high concentrations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A filter system has advantages if water is pumped straight from a river carrying a heavy silt load. Apart from enabling farmers to see the animals in the pools, filtered water makes the pools and pipes easier to clean. Filtration can be achieved by drawing water from a deep pit close to the river so that the water collected seeps through sand or mud.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A reservoir or a series of supply tanks is useful as an additional method of filtering water. In the event that pumping equipment fails, such a reserve supply may prove vital to the health and survival of the crocodiles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ponds should receive as much sun as possible, particularly during the winter months. A series of winter air temperature recordings would be useful in choosing the site of rearing pens, since valley temperatures are often several degrees lower than the temperatures some 50 to 100 m uphill. Preference should be given to the warmer locations, taking into account the direction of local winds and heavy rains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Soil types are the next consideration. If soils are sandy and porous, earth ponds are impractical and a concrete lining is required to retain water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Drainage of the ponds must be carefully considered. Drainage is far easier if the ponds are built on a slight rise. Water from the ponds must not be allowed to stagnate nearby; the drainage system must be efficient. It is recommended that pens be spaced at least 8 m apart and that their drainpipes lead underground at least 10 m before emptying.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pen Construction</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pens with rounded corners are the most successful. Crocodiles frequently choose to lie together in a pile. Square corners allow them to pile up against the angle, smothering those on the bottom and sometimes allowing animals to climb over the fence. With rounded corners, the pile cannot grow very high before the crocodiles slide sideways and the heap collapses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experiments in South Africa indicate that natural pools containing rooted vegetation are less prone to become sources of disease than are concrete pools. The surface of the concrete seems to become impregnated with liquid and debris from food and to become a breeding ground for bacteria. For hatchlings and very small juvenile crocodiles, concrete has an added disadvantage; its rough surface can abrade the belly skin when the animals slide in and out of the water, which can foster infection. In 5 or 10 years, even smooth concrete will erode sufficiently to become a problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Researchers elsewhere, however, report better results with concrete lined ponds, which they find easier to clean. Concrete pools are useful for summer because they can be scrubbed clean and because the volume of water used is small. Normally they need only be emptied, cleaned, and refilled every third day, and there is no wastage through seepage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pools are best built as channels. This provides more bank for basking and enables the pools to accommodate more crocodiles. Because the larger males become belligerent only when they can see each other, floating logs, patches of grass, or channel corners are visual barriers that reduce interactions. The channel system also gives more water edge, and this appears to satisfy the territorial instinct.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles are famous for basking in the sun, but they die surprisingly easily of heat prostration. At least one-third of the land area of a farm pen should be shaded with vegetation. The amount of space around each pool is calculated to allow ample basking room for each animal, and an area of shade must likewise be provided.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On land, crocodiles often seek contact with each other (thigmotaxis) and frequently lie piled on top of each other, but this should be a matter of choice rather than of overcrowding. There should be few enough animals in the enclosure to allow every crocodile to get out of the water if it chooses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ideally, only half the available number of pools should be occupied at a time, so that they can be used in rotation. In this system, the animals can be moved to fresh pools every two months (or as necessary), leaving the "used" pools to be drained and dried out to bake in the sun. After two months, the pools will then be clean and ready for use again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An important requirement is that the pools be at least 60 cm in depth; otherwise, the water becomes too hot in summer. The pool floor should be sloped towards the drain outlet to facilitate cleaning and flushing away uneaten food. Also, the outlet pipe should be 10 cm in diameter, with a stopcock outside the enclosure, so that the pool can be cleaned and emptied efficiently. It is essential to place a screen in the drainpipe to prevent small crocodiles from escaping or being sucked out of the pool during cleaning. After some time, stagnant ponds may become difficult to clean because of the heavy growth of algae on their sides. Hard-bristle scrubbing brushes are needed to dislodge this growth. Small amounts of copper sulfate in the water will help control algae if used regularly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The entire pond and surrounding apron must be smoothly plastered to facilitate cleaning. It helps to have a water source close to each pool from which a hose pipe can be led to pressure spray and clean the pool and its apron.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An important part of the design is a partly submerged, gently sloping ledge, some 45 cm in width, around the perimeter of the pool. This provides a shallow resting zone for the crocodiles and gives them easy access to the water. The crocodiles rest there when feeding, and the ledge prevents them from scraping their bellies and damaging their claws when they enter or leave the pool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For small crocodiles it is advisable to roof over the entire pen with wire netting or cries-crossed strands of wire. This protects against predators. Further, young crocodiles can climb vertical wire netting with ease and will escape unless the enclosure is either roofed or has side walls that slope inwards. A skirting board (planking, sheet iron, tin, or plastic sheeting) placed against the wire netting can also prevent this. If wire netting is used for the sides of the pens it should have mesh no larger than 1 cm so that hatchlings will not injure themselves by trying to climb through. While these pools are being cleaned, care must be exercised to prevent crocodiles from falling into the empty pool.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water can be passed continuously through the pools. The advantage of this is that during hot summer weather, when crocodiles are feeding at their maximum rate, small uneaten food particles, feces, and urine are carried away. Constant dilution of the pond's water also ensures a low bacteria level. However, the pool must be drained and scrubbed clean at least weekly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Earthen pools are easy and cheap to build and are a "natural" habitat where vegetation can be planted and small live fish introduced; insects, frogs, and other creatures attracted to the dams will be an important addition to the diet and health of the crocodiles. Earthen pools are ideal in climates where low winter temperatures are likely to cause respiratory illness in the young animals. During cold weather the crocodiles burrow into the mudbanks and survive nights of heavy frost.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of the animal's burrowing capabilities, it is important to provide a strip of land 4 m wide between the pool's edge and the boundary fence. Otherwise, crocodiles may tunnel beyond the fence line. Fences must be buried at least 1 m deep to intercept the burrows and to prevent predators from burrowing in. Burrowing, however, can be hazardous, because the burrows can collapse and suffocate the animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In areas where the soil is porous or sandy, the floor of an earth dam can be sealed with concrete or plastic irrigation sheets. A layer of earth can be used to conceal this artificial floor. The disadvantages of earth pools are that, because of seepage, they require more water than concrete ones and that they require more maintenance because they cannot be efficiently cleaned. Even if the pools are provided with constantly circulating water, they eventually become fouled, particularly during hot weather.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Removing crocodiles from an earth pond can prove difficult, since most will take refuge in their burrows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capturing Crocodiles</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles are located at night, usually from a boat, by shining a light along the edges of rivers and lagoons. Because of a reflective tapetum, the eyes of crocodiles glow reddish or orange and are visible for a hundred meters or more. If the population has not become exposed to hunting and become wary of people, the animals will not submerge when the light strikes them. Dazzled by the beam, they tolerate a stealthy approach, and small animals can simply be grabbed by hand or scooped up in a net. They can then be transported in sacks to the rearing pens. Larger animals may be noosed or baited into cylindrical screen traps at places they frequent along the water's edge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Managing a Crocodile Farm</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is a problem to sort the young crocodiles. From one clutch of eggs, some individuals will be aggressive and others may be shy or extremely timid; growth may vary from rapid to very slow, with a few individuals classed as runts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Larger animals can be so dominant that smaller individuals will not even attempt to feed. If sorting is not done, the smaller, less-aggressive individuals do not get a fair share of the food; they grow slowly and get bitten and harassed by the larger animals. At feeding time, some will flee to the opposite side of the pen and stop feeding altogether. Keeping the young animals sorted into classes of the same size avoids many of these problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nutrition and Feeding</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the crocodilian's reputation as a man-eater, small wild crocodiles live mainly on invertebrates and larger ones live mainly on fish. Papua New Guinea's farmers feed a varied diet of locally caught fish, crab, shrimp, frogs, snails, grasshoppers, beetles, and slaughterhouse waste. Whole animals minced up should be used, if necessary, because crocodiles require a diet of bone, intestine, scales, and other tissues to provide calcium and minerals. Bones in chopped fish must be minced thoroughly for hatchlings or very young crocodiles, or they should be fed very small fish supplemented by tadpoles or insects. One village in Papua New Guinea has shown remarkable success in rearing hatchlings on a diet of chopped fish and live freshwater shrimp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fish is an excellent food for the bulk feeding of a large captive population. Whole fish chopped into pieces, including the livers and hearts, forms a balanced diet that may be supplemented by meat, if available, to make up bulk. Small whole fish are particularly suitable; the crocodiles derive calcium from the bones and scales, plus roughage to facilitate digestion, while the flesh, liver, and heart are rich in nutrients and protein The main difficulty usually lies in harvesting enough fish to meet the crocodiles' demands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any method of supplementing the diet with live creatures is recommended. For instance, a light can be left burning in each pen about 15 cm above the water for attracting insects. Various types of insect traps may also be used.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles also can be fed on a variety of wastes such as offal or noncommercial fish. Ideally, a large-scale farm should be located near a poultry slaughterhouse. (Cattle offal is also satisfactory, but it is not nutritionally adequate as a sole ration for crocodiles.) Even crocodile offal itself can be fed back to crocodiles. However, the use of offal will necessitate dietary supplements to assure sufficient phosphorus and calcium. These minerals are generally provided by feeding bones to the crocodiles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crocodiles usually consume their food in the water, but they can also be fed on land. They will eat daily, but are able to remain active for weeks without food. If they are fed in the water of a farm pen, the water will become polluted unless there is considerable flow to carry away the debris. In extreme cases, the pools become septic. To ensure the health of the growing animals, constantly flowing water is far superior to standing water. (The Samutprakan Crocodile Farm in Thailand feeds some of its animals in water, but the small feeding pools are separate from the large regular breeding pools and at a lower level to prevent their overflowing into the breeding pools.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important to feed pieces of food small enough to be swallowed without difficulty. Large fish should be cut into elongated rather than square pieces, since the bones can cause damage during swallowing. Similarly, whole live fish should not be so large that the dorsal fin may cause damage to the reptile's throat and gullet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important to know the amount of food that each group of animals will consume at each meal. By feeding at the same time each day, it is easy to calculate how much is required. Moreover, the crocodiles become accustomed to a routine and the food is consumed while it is still fresh. In the hot summer months the animals will devour a full meal every 24 hours, but the feeding rate slackens with the onset of colder weather. It is then wise to start reducing frequency and quantities until food is required only every second or third day, depending on the climate. Generally, young crocodiles will refuse food when the air or water temperature falls below 60°F (15.6°C). Even in midsummer sudden cold spells may occur; at such times, it is usually futile to feed the animals or try to coax them to eat until the weather warms up again. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During hot weather conditions it is preferable to feed late in the afternoon or evenings, mainly to avoid placing the food on a hot cement surface. The food should be spread out around the edge of the pool under the shaded area so that the animals do not have to climb over one another to reach it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In cemented pens the area where the food is laid out should be cleaned and scrubbed two hours after feeding time and any uneaten food removed from the water with a hand net. In earthen pools, the food should be placed at a different spot along the bank at each feeding. A useful aid to hygiene is keeping a few predacious fish, such as barbel (Clarias spp.), in each pool to clean up scraps of uneaten food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population Density</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Twenty-five crocodiles are considered the maximum manageable number per unit; staying within this limit reduces competition for food, bullying and fighting, and the number of injuries. A low stocking rate also results in a more even average growth rate. Most important is the fact that the overall health of the crocodiles is better than in a more crowded pen; disease problems are fewer and the symptoms easier to detect in a small group. If the units are spaced 8 m apart, there is also less danger of infectious disease spreading to other pens. The cleaning of pens is facilitated, and the disturbance caused by capturing crocodiles to be moved to other units is minimized. Housing 500 crocodiles in groups of 25 will require 20 separate pens, and an additional two pens should be provided to allow for intensive care of sick, injured, and weaker animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the first year, when animals are graded frequently, they will often be moved from one pen to another. Recording the number of animals housed in each pen will make it possible to keep track of numbers and movements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breeding</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reproduction is impossible when crocodiles are kept in large groups composed of different species and sizes and in more or less unnatural enclosures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Healthy, sexually mature pairs of crocodiles are usually not enough to start a breeding program. Genetic diversity to maintain a long-term breeding group must be considered, and certain environmental factors are vital for success. The distinct size and age classes of a free-living population must also be taken into consideration. Optimal sex ratios for breeding in enclosed compounds must be determined and adhered to. If a breeding unit is not based on regard for the animals' basic needs for space, nesting sites, and retreats, the larger specimens will disturb, injure, and often kill smaller specimens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Diseases and Parasites</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Disease symptoms may be easily overlooked if the observer is not familiar with the behavior of crocodiles under a variety of conditions. It is essential to know how they normally walk, swim, sleep, feed, and bask in relation to the time of day, the air and water temperatures, and the amount of sunlight or rain, by day, by night, and at different seasons of the year. Caretakers should notice the appearance of feces from healthy animals to be able to detect evidence of diarrhea, and to identify misaligned teeth and weakened limbs to detect nutritional deficiencies. Eggs are critically dependent on specific temperature and moisture requirements if the embryos are to develop normally.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is often difficult to determine the cause of illness or death, and even if the ailment has been correctly diagnosed, it is not easy to capture and administer drugs to large numbers of sick animals. Some animals may be injured during the handling process. Emphasis on preventing disease, rather than curing it, is the best way of ensuring a healthy crop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Almost inevitably, the water in the pools will harbor concentrations of bacteria such as salmonella. If strict hygiene is observed, however, the bacterial level will not be harmful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is recommended that whenever possible animals found newly dead should be dissected and vital organs such as the brain, heart, lung, liver, spleen, kidney, and stomach removed for veterinary research. Blood slides should also be taken and feces samples collected. The various specimens must be carefully labeled, frozen as quickly as possible, and packed on ice in a vacuum flask for immediate dispatch to the nearest veterinary research institute or pathologist. Alternatively, dying animals may be sent live for research purposes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is helpful for the handler to become thoroughly acquainted with the animal's internal anatomy, in order to distinguish between healthy and diseased organs. This knowledge, coupled with the symptoms noted before the animal dies, and the veterinary report, will be useful in future diagnosis and treatment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One problem for the crocodile farmer is a roundworm (nematode) parasite that burrows into the belly skin. When the burrow collapses it produces an undulating track across the belly and throat scales that ruins the hide. These parasites have been found in crocodiles from Latin America, Africa, Australia, Papua New Guinea, and Asia. They seem more prevalent in some areas and some farms than in others. The organism has been identified, but no treatment or control has been discovered. It is, however, believed that damp, muddy conditions foster the nematode, and that to reduce it pens should have areas of dry land where the animals can bask.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Killing, Skinning, and Tanning</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some farmers kill the crocodiles themselves, but many rear the animals and then sell them to a larger concern that is better equipped to deal with the skins. Killing is done most quickly and humanely by catching the crocodile with a noose and severing the spinal cord just behind the skull.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many hides are ruined or severely damaged during skinning. Even a single hole resulting from a slip of the skinning knife may reduce a hide's value by 25 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After skinning, the hides are normally coated with about 0.5 cm of coarse salt and rolled up. Within 48 hours they are unrolled and resalted. If the hide is not sufficiently salted, it may become infected with bacteria or fungi that cause the epidermis of the scales to decay or slip. Although this layer is removed during tannage, scale slip is a symptom of rot and usually causes damage to the finished hide product. If the decay is intense, the salted hides may become reddish or brown in color. This is called "red heat."</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although salt remains the universally used preservative for raw hides, the reptile leather industry has developed chemical fixatives that are used in addition to salt for preserving hides for tanning. Most of these pretannage fixatives are liquid and require soaking the hide in a vat, which may not be feasible in remote areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A pretanned hide is called a crust. It is green-gray (chrome tanned) or tan (vegetable tanned) and is stiff. The hide is dyed and glazed to its final finish. To increase the workability and to remove as many of the osteoderms as possible (if they are present), the underside of the hide is shaved to an even thickness. The shaving is done by craftsmen. If they shaved too much, the hide will be thin and weak, especially over the suture between the scales.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix C: Selected Readings</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information on the management and status of crocodiles can be found in the following:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IUCN/Crocodile Specialist Group Newsletter. Available from the editors, Peter Brazaitis and Myrna Watanabe, c/o New York Zoological Park, Bronx Zoo, The Bronx, New York 10460, USA.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A Field Guide of Captive Rearing and Management of Crocodiles in India is available from Mr. R. K. Rao, Director, Central Crocodile Breeding and Management Training Institute (Government of India), Hyderabad, Andhra Pradesh, India.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blake, D. K. 1974. The rearing of crocodiles for commercial and conservation purposes in Rhodesia. The Rhodesia Science News 8(10):315-324.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blake, D. K., and J. P. Loveridge. 1975. The role of commercial crocodile farming in crocodile conservation. Biological Conservation 8(4): 261-272.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bolton, M. 1981. Crocodile Husbandry in Papua New Guinea. Field Document 4. FO: DP/ PNG/74/029. Food and Agriculture Organization of the United Nations, Rome, Italy. 103 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bolton, M., and M. Laufa. 1982. The crocodile project in Papua New Guinea. Biological Conservation 22:169-179.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazaitis, P. (In press) Problems in the Identification of Commercial Crocodilian Hides and the Effect on Law Enforcement. Proceedings of the IUCN Crocodile Specialist Group meeting in Zimbabwe September-October, 1982. International Union for the Conservation of Nature and Natural Resources, Gland, Switzerland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazaitis, P. 1973. The identification of living crocodiles. Zoologica 58(3-4):59-101.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cott, H. B. 1954. Ecology and economic status of the crocodile in Uganda. Record of the Symposium on African Hydrobiology and Inland Fisheries, Committee on Technical Cooperation for Africa South of the Sahara 6:119-122.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cott, H. B. 1961. Scientific results of an inquiry into the ecology and economic status of the Nile crocodile (Crocodylus niloticus) in Uganda and Northern Rhodesia. Transactions of the Zoological Society of London 29(4):211-337.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Downes, M. C. 1978. An explanation of the National Policy for the Crocodile Programme. Wildlife Division, Department of Lands, Surveys and Environment, Konedobu, Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fuchs, K., nd. Die Krokodilhaut Eduard Roether Verlag Darmstadt, Frankfurt, West Germany.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Graham, A., 1981. Mapping the pattern of crocodile nesting activity in Papua New Guinea. Field Document No. 3, FO: DP/PNG/74/029. Food and Agriculture Organization of the United Nations, Rome, Italy. 50 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joanen, T., and L. McNease. 1975. Notes on the Reproductive Biology and Captive Propagation of the American Alligator. Proceedings of the 29th Annual Conference of the Southeastern Association of Game and Fish Commissioners 29:407-415. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joanen, T., and L. McNease. 1979. Culture of the American alligator. International Zoo Yearbook 19:61-66.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">King, F. W., and P. Brazaitis. 1971. Species identification of commercial crocodile skins. Zoologica 56(2): 15-72.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Loveridge, J. P. ed. 1982. The Zimbabwe Science News 16(9):196-219. Causeway, Zimbabwe. (Contains five articles on crocodilian research and conservation; from Zimbabwe, Australia the United States, and lndia.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Millichamp, N. J. ;980. Medical aspects of disease in reptile collections. In The Care and Breeding of Captive Reptiles, The British Herpetological Society, London, England.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parker, F. 1981. New Crocodile Laws for Papua New Guinea. Division of Wildlife, Department of Lands and Environment, Konedobu, Papua New Guinea. 50 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. 1969. Some observations on the rearing of crocodiles. Lammergeyer 10:45-59.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. 1971. Crocodile rearing and restocking. Pp. 104-130 in Crocodiles, IUCN Publications New Series Supplementary Paper 32. International Union for Conservation of Nature and Natural Resources, 1110 Gland, Switzerland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. 1973. Conservation and Management of Crocodiles in Africa. Journal of the South African Wildlife Management Association 3(2):101-103.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. 1977. A report on Crocodile Farming. Papua New Guinea. Wildlife leaflet No. 77/27. pp. 1-14.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. 1981. Disappearing African Crocodiles. Oryx 16(1):38-40.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C. (In press). The status of crocodiles in Africa. Paper Presented at 5th Meeting IUCN Survival Service Commission's Crocodile Specialist Group. Gainesville Florida, USA. September 1980.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pooley, A. C., and C. Gans. 1976. The Nile crocodile. Scientific American 234(4): 114-124.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wallis, B. E. 1980. Market prospects for reptile leathers. Report number ITC/DIP/12, International Trade Commission, Geneva, Switzerland. 50 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wermuth, Von H., and K. Fuchs. 1978. Bestimmen von Krokodilen und ihrer Haute. Gustav Fischer Verlag, Stuttgart, New York.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whitaker, R. 1982. Export prospects from commercial crocodile farms in Bangladesh. ITC/UNCTAD, Geneva, Switzerland. 47 pp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whitaker, R., and M. Kemp. 1981. The crocodile industry in Papua New Guinea: Commercial Aspects. Field Document No. 2. FO:DP/PNC/74/029. Food and Agricultural Organization of the United Nations, Rome, Italy. 35 pp. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix D: Research Contacts</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following individuals are involved in crocodilian research. Most are biologists concerned with the conservation or natural history of the animals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Applied Ecology Crocodile Farm, Edward River, Queensland 4870</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shelley Burgin, Total Environment Center, 18 Argyle Street, Sydney, New South Wales 2000</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Melvin Bolton, Woodbury Farm, Woodbury Road, M.S. 142, Via Yeppoon, Queensland 4703</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Max C. Downes, The Game Conservation Center, 24 Queens Parade, North Fitzroy, Victoria 3068</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alistair Graham, P.O. Box41266, Darwin, Northern Territory 5792</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gordon Grigg, Zoology A08, University of Sydney, Sydney, New South Wales 2006</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Lever, Koorana Crocodile Farm, M.S.F. 76, Rockhampton, Queensland 4702</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Harry Messel, Head, School of Physics, University of Sydney, Sydney, New South Wales 2006</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fred Parker, 717 Ross River Road, Kirwan, Queensland 4814</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grahame Webb, School of Zoology, University of New South Wales, Kensington 2033</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bangladesh</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mohd. Reza Khan, Assistant Professor, Department of Zoology, University of Dacca, Dacca 2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">William Magnusson, Depto de Ecologia, Instituto Nacional de Pesquisas da Amazonia, Caixa Postal 478, 69000, Manaus, Amazonia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burma</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ko Ko Gyi, Professor of Zoology, Rangoon Arts and Sciences University, Rangoon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nyan Taw, Research Officer, People's Pearl and Fishery Corporation, Myakhwanyo Street, Thaketa, Rangoon </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People's Republic of China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Huang Chu-Chien, Institute of Zoology, Chinese Academy of Science, Beijing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Swatow Prefecture Crocodile Farm, Shantou, Guang Dong Province</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Colombia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Federico Medem, Instituto Roberto Franco, Apartado Aereo 2261, Villavicencio (Meta)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gerado Budowski, Head, Natural Renewable Resources Programme, CATIE, Turrialba</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cuba</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Luis Varona, Norte 29, Nuevo Vedado, La Habana 6</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dominican Republic</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jose Alberto Ottenwalder, Museo Nacional de Historia Natural, Plaza de la Cultura, Santo Domingo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Karlheinz Fuchs, Schillerstrasse 2, 6257 Hunfelder 2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guatemala</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jaime Tres 1., Centro de Estudias Conservacionistas, Universidad de San Carlos de Guatemala, Avenida de la Reforma 0-63, Zona IO, Guatemala</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B. C. Choudhury and Lala A. K. Singh, Central Crocodile Breeding and Management Training Institute, 19-4-319, Lake Dale, Rajendranagar Road, Hyderabad 500 264, Andhra Pradesh</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indian Board for Wildlife, c/o Department of Environment, Bikaner House, Shahjahan Road, New Delhi 110 011</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Sale, UNDP/FAO Crocodile Breeding and Management Project, 19-4-319, Lake Dale, Rajendranagar Road Hyderabad 500 264, Andhra Pradesh</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S. Shanmugunathan, Chief Wildlife Warden, Vivekananda Road, Coimbatore, Tamil Nadu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sudhakar Kar, Saltwater Crocodile Research and Conservation Unit, Danginal 754 220 Via Rejkanika, District Cuttack, Orissa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Romulus Whitaker, Madras Snake Park Trust, Guindy Deer Park, Madras, Tamil Nadu, 600 002</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G. S. Child, Wildlife and Parks Management Of ficer FAO, Rome</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Japan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wataru Kimura, Proprietor, Atagawa Tropical and Alligator Garden, Atagawa Higashi Zlu Town, Shizuoka Prefecture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">R.D. Haller , Bamburi Portland Cement Co. ,Ltd., P.O. Box 90202 ,Mombasa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paul R. Wycherley, President, Malayan Nature Society, P.O. Box 150, Kuala Lumpur</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mexico</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Miguel Alvarez del Toro, Director, Instituto de Historia Natural, Departamento de Zoologia, Apartado Postal No. 6, Tuxtle Gutierrez, Chiapas, 29000</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Marco Antonio Lascano B., INIREB, Apdo. No 281, Merida</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tirtha Maskey, National Parks and Wildlife Conservation Office, Thapathali, P.O. Box 107, Kathmandu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Zealand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antoon de Vos, Box 34, Whitford, Auckland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nicaragua</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Milton G. Camacho B., Instituto Nicaraguense de Recursos Naturales y del Ambiente (IRENA), Depto. de Fauna Silvestre, Kim 12 1/2 Carreterra Norte, Managua.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pakistan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ashiq Ahmad, Wildlife Management Specialist, Pakistan Forest Institute, Peshawar</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abdul Latif Rao, Conservator of Wildlife, National Council for Conservation of Wildlife, Ministry of Food and Agriculture, U.G. St. 51, Sector F 6/4, Islamabad</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Miro Laufa, Division of Wildlife, Department of Lands and Environment, P.O. Box 2585, Konedobu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Karol Kisokau, Director, Office of Environment and Conservation, Central Government Offices, Waigani</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Navu Kwapena, Division of Wildlife, Department of Lands and Environment, Konedobu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Graham Goudie, Crocodile Farm, Lae</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Martin Hollands, Monitoring Ecologist, National Crocodile Project, P.O. Box 2585 Konedobu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peru</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pedro Vasques Ruesta, Departamento de Manejo Forestal, Universidad Nacional Agraria, Apdo. 456, La Molina</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angel C. Alcala, Division Research, Extension and Development, Silliman University, Dumaguete City, 6501, Negros</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">School of Agriculture, Silliman University, Dumaguete City, 6501, Negros.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. B. Anthony, The Natal Parks, Game and Fish Preservation Board, Box 662, Pietermaritzburg, Natal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antony Pooley, P.O. Box 42, St. Lucia Estuary, 3936 Zululand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Switzerland</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rene E. Honegger, Curator, Zurich Zoo, Zurichbergstrasse 221, 8044 Zurich</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">U. Srisomboon, Ministry of Agriculture, Department of Livestock Development, Bangkok Utai Youngprapakorn and Charoon Youngprapakorn, The Samutprakan Crocodile Farm and Zoo Co., Ltd., Talban Road, Samutprakan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angus d'A. Bellairs, Department of Anatomy, St. Mary's Hospital Medical School University of London, Paddington, London W2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Robert Bustard, Isle of Man</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">United States</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Behler, New York Zoological Society, 185th Street &amp; Southern Blvd., The Bronx, New York 10460</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peter Brazaitis, New York Zoological Society, 185th Street &amp; Southern Blvd., The Bronx New York 10460</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gary Callis, Rt. I, Box 360, Clayton, New Mexico</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert H. Chabreck, Louisiana State University, School of Forestry and Wildlife Management, Baton Rouge, Louisiana 70803</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Michael Davenport, Department of Herpetology, National Zoological Park, Smithsonian Institution, Washington, D.C. 20008</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Claire Hagen, Representative, Reptile Products Association, 120 Cabrini Blvd., New York, New York 10033</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fred Hauptfuhrer, Director of Planning and Development, World Wildlife Fund, Inc., 910 17th Street NW, Washington, D.C. 20006</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Howard Hunt, Atlanta Zoological Park, 518 Atlanta Ave. S.E., Atlanta, Georgia 30315</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ted Joanen, Rockefeller Wildlife Refuge, Route 1, Box 20-B, Grand Chenier, Louisiana 70643</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. Wayne King, Director, Florida State Museum, Gainesville, Florida 32611</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jeffrey W. Lang, Biology Department, University of North Dakota, University Station, Grand Forks, North Dakota 58202</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles J. Lankester, UNDP, I United Nations Plaza, New York, New York 10017</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">James H. Powell, 1110 Kokomo Street, Plainview, Texas 79072</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles A. Ross, Division of Reptiles and Amphibians, National Museum of Natural History, Smithsonian Institution, Washington, D.C. 20560</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Myrna Watanabe, 141 Columbia Heights, Brooklyn, New York 11201</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uruguay</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Federico Achaval, Departamento de Zoologia (Vertebrados), Universidad de la Republic Cerrito73, Montevideo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Venezuela</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tomas Blohm, Apartado 69, Caracas 1010-A</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Andres Seijas Y., Servicio Nacional de Fauna Silvestre, MARNR, Apartado 184, Maracay</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. K. Blake, Department of National Parks and Wildlife Management, P.O. Box 8365, Causeway, Harare</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John Loveridge, Zoology Department, University of Zimbabwe, P.O. Box MP 167, Mount Pleasant, Harare</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kevin van Jaarsveldt, Crocodile Farmers Association of Zimbabwe, P.O. Box 2569, Harare </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix E: Biographical Sketches of Panel Members</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Director of the Office of Biological Secretary General Smithsonian Institution, Washington, D.C., is currently the Secretary General of the International Union of Biological Sciences. He received his B.A. in 1961 from Miami University in Ohio, M.Sc. from The George Washington University in 1963, and his Ph.D. in 1966 from the University of London. His research interests are in comparative anatomy and phylogeny of flowering plants, commercial timbers, histology of monocotyledons, economic botany, and tropical biology. An internationally recognized expert on tropical plants, he has published extensively in these areas and on topics relating to science, technology, and development, especially in developing countries. Dr. Ayensu was co-chairman of the Panel on Underexploited Tropical Plants of the Advisory Committee on Technology Innovation and chairs and serves as a member of many international bodies. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ARCHIE F. CARR, JR., is Graduate Research Professor in the Department of Zoology, University of Florida, Gainesville. As Technical Director of the Caribbean Conservation Corporation, he has directed a seasonal research program at the breeding ground of the green turtle at Tortuguero, Costa Rica, since 1952, with continuous grants from the National Science Foundation from 1955 to 1980, and has carried out investigations of marine turtle ecology and navigation in various parts of the world. The author of numerous papers, articles, and books, he received the Daniel Giraud Elliot Medal of the National Academy of Sciences for Handbook of Turtles and the John Burroughs Medal for The Windward Road. He is Research Associate of the American Museum of Natural History; Affiliate Curator of Natural Sciences, Florida State Museum; Chairman of the Marine Turtle Specialist Group of the Survival Service Commission, International Union for the Conservation of Nature; Honorary Consultant of the World Wildlife Fund; Fellow of the Linnean Society of London; Fellow of the American Fisheries Society; and a member of Phi Beta Kappa and Sigma Xi.In 1973 he was awarded a gold medal from the World Wildlife Fund for the application of scientific findings to the conservation of marine turtles. In 1975 he received the Edward W. Browning Award for achievement in biological conservation. In 1978 Dr. Carr was awarded the Gold Medal of the New York Zoological Society for contributions to natural science and conservation; in 1978 he became Officer of the Order of the Golden Ark (The Netherlands).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. WAYNE KING is the Director of the Florida State Museum, Gainesville. He received a B.S. in 1957 and an M.S. in 1961 from the University of Florida and a Ph.D. from 1966 from the University of Miami. His research interests are in wildlife conservation and habitat preservation, impact of international trade on wildlife populations, and ecology and behavior of reptile populations. He worked at the New York Zoological Society from 1967 to 1975. As an international wildlife consultant, Dr. King has received honors from the Dominican Republic, the American Association of Zoological Parks and Aquariums, and from H.R.H. Prince Bernhard of The Netherlands. He has served on committees advising the State Department and the International Union for Conservation of Nature and Natural Resources on policies regarding the trade of crocodile skins, turtle products, and other wildlife materials. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOIS MERGEN, Pinchot Professor of Forestry and Professor of Forest Genetics, Yale University, was Dean of the School of Forestry and Environmental Studies at Yale from 1965 to 1975. He received a B.A. from Luxembourg College and a B.Sc.F. from the University of New Brunswick in 1950, an M.F. in ecology in 1951, and a Ph.D. in forest genetics from Yale in 1954. He is especially knowledgeable about francophone Africa and was chairman of the Sahel program of the Board on Science and Technology for International Development and a member of the Advisory Committee on Technology Innovation. From 1960 to 1965 he was research collaborator at the Brookhaven National Laboratory. In 1966 he was the recipient of the Award for Outstanding Achievement in Biological Research from the Society of American Foresters and in 1975 was Distinguished Professor (Fulbright-Hays Program) in Yugoslavia. Before joining the Yale faculty, he served as project leader in forest genetics for the U.S. Forest Service in Florida. He has served as a consultant to FAO, various foreign governments, and private forestry companies, and he has traveled extensively in the tropical countries of Asia, Africa, and Latin America. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. MORRIS is head of the Furzebrook Research Station of the Institute of Terrestrial Ecology (National Environment Research Council, U.K.). He received a B.A. in natural sciences (zoology) at the University of Cambridge of 1958, M.A. in 1962, and received his Ph.D. from London University in research on the integrated control of orchard pests. Dr. Morris worked at Monks Wood Experimental Station on the effects of grassland management on populations of invertebrates and developed a strong interest in community and applied ecology, particularly the conservation of insect populations. Recently he has become involved with problems of butterfly conservation and resource utilization. He is Secretary of the Joint Committee for the Conservation of British Insects, a Vice-Chairman of the Lepidoptera Specialist Group of lUCN'S Survival Commission, and Chairman of the Habitat and Species Protection Committee of SEL (Societal Europaea Lepidoptero-Logica). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH L. POPENOE is Professor of Soils, Agronomy, Botany, and Geography and Director of the Center for Tropical Agriculture and International Programs (Agriculture) at the University of Florida. He received his B.S. from the University of California at Davis in 1951 and his Ph.D. in soils from the University of Florida in 1960. His principal research interest has been in the area of tropical agriculture and land use. His early work on shifting cultivation is one of the major contributions to this system. He has traveled and worked in most of the countries in the tropical areas of Latin America, Asia, and Africa. He is past Chairman of the Board of Trustees of the Escuela Agricola Panamericana in Honduras, Visiting Lecturer on Tropical Public Health at the Harvard School of Public Health, and a Fellow of the American Association for the Advancement of Science, the American Society of Agronomy, the America Geographical Society, and the International Soils Science Society. He is Chairman of the Advisory Committee for Technology Innovation and a member of the Board on Science and Technology for International Development. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT MICHAEL PYLE, a writer and consulting lepidopterist based in Gray's River, Washington, has served since 1979 as Co-Compiler of the lUCN Invertebrate Red Data Book. In this capacity he is consultant to the Conservation Monitoring Center in Cambridge, England. After receiving his B.S. and M.S. at the University of Washington, he took his Ph.D. through the School of Forestry and Environmental Studies at Yale University in 1976. He worked for the Government of Papua New Guinea on the conservation and utilization of insect resources and then with the Nature Conservancy as Northwest Land Steward. A former Fulbright Scholar to the United Kingdom, Dr. Pyle subsequently founded the Xerces Society for conservation of beneficial insects and their habitats. He has been chairman of IUCN'S Lepidoptera Specialist Group (Species Survival Commission) since 1976. His publications include the Audubon Society Field Guide to North American Butterflies. A comprehensive book on insect conservation in his next project.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SHELDON R. SEVERINGHAUS received his Ph.D. from Cornell University in 1977 in natural resources management. He has worked on various wildlife research projects in Asia since 1964 and is representative for the Asia Foundation in Taiwan. He has published articles on butterfly conservation and wildlife industries in Taiwan, where he has been studying the butterfly and wildlife farming projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, staff officer for this study, is Professional Associate of the Board on Science and Technology for International Development. A New Zealander with a Ph.D. in organic chemistry from the University of California, Berkeley, he now works on innovations in science that are important for developing countries. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Advisory Committee on Technology Innovation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM BRADLEY, Consultant, New Hope, Pennsylvania</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HAROLD DREGNE, Director, International Center for Arid and Semi-Arid Land Studies, Texas Tech University, Lubbock, Texas (member through 1981) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CARL N. HODGES, Director, Environmental Research Laboratory, Tucson, Arizona </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CYRUS MCKELL, Native Plants, Inc., Salt Lake City, Utah </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOIS MERGEN, Pinchot Professor of Forestry, School of Forestry and Environmental Studies, Yale University, New Haven, Connecticut (member through 1982) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Consultative Group on International Agricultural Research, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THEODORE SUDIA, Deputy Science Advisor to the Secretary of Interior, Department of Interior, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Board on Science and Technology for International Development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE BUGLIARELLO, President, Polytechnic Institute of New York, Brooklyn, New York, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SAMUEL P. ASPER, Educational Commission for Foreign Medical Graduates, Philadelphia, Pennsylvania </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DAVID BELL, Department of Population Sciences, Harvard School of Public Health, Boston, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LEONARD BERRY, Professor, Graduate School of Geography, Clark University, Worcester, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ERNEST I. BRISKEY, Dean, School of Agriculture, Oregon State University, Corvallis, Oregon </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARRISON S. BROWN, Director, Resources Systems Institute, East-West Center, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT H. BURRIS, Department of Biochemistry, University of Wisconsin, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CLAUDIA JEAN CARR, Associate Professor, Conservation and Resource Studies, University of California at Berkeley, Berkeley, California </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATE FIELDS, Director, Developing Markets, Control Data Corporation, Minneapolis, Minnesota </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROLAND J. FUCHS, Chairman, Department of Geography, University of Hawaii at Manoa, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN HOWARD GIBBONS, Director, U.S. Congress, Office of Technology Assessment, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N. BRUCE HANNAY, Foreign Secretary, National Academy of Engineering, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM HUGHES, Director, Engineering Energy Laboratory, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM A. W. KREBS, Vice President, Arthur D. Little, Inc., Acorn Park, Cambridge, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE I. LYTHCOTT, University of Wisconsin, School of Medicine, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JANICE E. PERLMAN, Executive Director, Committee for a New New York, New York City Partnership, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK C. ROBBINS, President, Institute of Medicine, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WALTER A. ROSENBLITH, Foreign Secretary, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK SEITZ, President Emeritus, The Rockefeller University, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH HERBERT SMUCKLER, Dean of International Studies and Programs, Michigan State University, East Lansing, Michigan </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GILBERT F. WHITE, Institute of Behavioral Science, University of Colorado, Boulder, Colorado </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BILL C. WRIGHT, Assistant Dean for International Programs, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN G. HURLEY, Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. C. McDONALD DOW, Associate Director/Studies </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL P. GREENE, Associate Director/Research Grants </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/b21wae/b21wae.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/b21wae/b21wae.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/b21wae/b21wae.htm	(revision 21083)
@@ -0,0 +1,1888 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; The Water Buffalo: New Prospects For An Underutilized Animal (1984)</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The Water Buffalo: New Prospects For An Underutilized Animal (1984)</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Original editon 1981</P>
+<P ALIGN="JUSTIFY">Second printing 1984</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Report of an Ad Hoc Panel of the</P>
+<P ALIGN="JUSTIFY">Advisory Committee on Technology Innovation</P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development</P>
+<P ALIGN="JUSTIFY">Commission on International Relations</P>
+<P ALIGN="JUSTIFY">National Research Council</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Panel on Water Buffalo</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of  Florida, Gainesville, Florida, USA, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">STEVE P. BENNETT, Bennett's Animal Clinic, Port of Spain, Trinidad, West Indies</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CHARAN CHANTALAKHANA, Dean, Department of Animal Science, Kasetsart  University, Bangkok, Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD D. CHARLES, Senior Lecturer, Meat Production, Department of Animal  Husbandry, University of Queensland, St. Lucia, Queensland, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. ROSS COCKRILL, Livestock Expert, Food and Agriculture Organization (retired),  Rome, Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WYLAND CRIPE, Department of Veterinary Science, University of Florida,  Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TONY J. CUNHA, Dean, School of Agriculture, California Polytechnic University,  Pomona, California, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. JOHN DE BOER, Winrock International Livestock Research and Training Center,  Morrilton, Arkansas, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MAARTEN DROST, Department of Veterinary Science, University of Florida,  Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MOHAMED ALI EL-ASHRY, Department of Animal Production, Faculty of  Agriculture, Shoubra el Khiema, Cairo, Egypt </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ABELARDO FERRERD ., Former Director, Breeding Administration Centers,  Animal Sciences Division, Ministry of Agriculture, Caracas, Venezuela</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JEAN K. GARDNER, Former Chief, Logistics Division USAID/Philippines, Jackson,  Mississippi, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JAMES F. HENTGES, Department of Animal Science,University of Florida,  Gainesville, Florida, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JACK HOWARTH, School of Veterinary Medicine, University of California, Davis,  California, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NELS M. KONNERUP, Livestock Expert, Agency for International Development  (retired), Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. P LEONARDS, Water buffalo breeder, Lake Charles, Louisiana, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN K. LOOSLI, Department of Animal Science, University of Florida, Gainesville,  Florida, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOSEPH MADAMBA, Director, Asian Institute of Aquaculture, Iloilo, Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CRISTO NASCIMENTO,Director, Brazilian Agriculture Research Corporation  (EMBRAPA), Agriculture Research Center for Humid Tropics (CPATU), Belem,  Para, Brazil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Consultative Group on International Agricultural  Research, The World Bank, Washington, D.C., USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM R. PRITCHARD, Dean, School of Veterinary Medicine, University of California, Davis, California, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. THOMAS REID, (deceased), Department of Animal Science, Cornell University, Ithaca, New York, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN H. SCHOTTLER, Animal Production Officer, Department of Primary Industries, Lae, Papua New Guinea </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DALBIR SINGH DEV, Dean, Animal Science Department, College of Agriculture, Agricultural University, Ludhiana, Punjab, India </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT W. TOUCHBERRY, Dean, Department of Animal Science, University of Minnesota, St. Paul, Minnesota, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD G. TULLOCH, Division of Wildlife Research, Commonwealth Scientific and Industrial Research Organization, Winnellie, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, Board on Science and Technology for International Development, National Research Council, Washington, D.C., Staff Study Director </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MARY JANE ENGQUIST, Board on Science and Technology for International Development, National Research Council, Washington, D.C., Staff Associate </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo is an animal resource whose potential seems to have been barely recognized or examined outside of Asia. Throughout the world there are proponents and enthusiasts for the various breeds of cattle; the water buffalo, however, is not a cow and it has been neglected. Nevertheless, this symbol of Asian life and endurance has performed notably well in recent trials in such diverse places as the United States, Australia, Papua New Guinea, Trinidad, Costa Rica, Venezuela, and Brazil. In Italy and Egypt as well as Bulgaria and other Balkan states the water buffalo has been an important part of animal husbandry for centuries. In each of these places certain herds of water buffalo appear to have equaled or surpassed the local cattle in growth, environmental tolerance, health, and the production of meat and calves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although these are empirical observations lacking painstaking, detailed experimentation, they do seem to indicate that the water buffalo could become an important resource in tropical, subtropical, and warm temperate zones in developing and developed countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If this is the case, then it is clear that many countries should begin water buffalo research. Serious attention by scientists could help dispel the misperceptions and uncertainties surrounding the animal and encourage its true qualities to emerge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report describes the water buffalo's attributes as perceived by several animal scientists. It is designed to present the apparent strengths of buffaloes compared with those of cattle, to introduce researchers and administrators to the animal's potential, and to identify priorities for buffalo research and testing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel that produced this report met at Gainesville, Florida, in July 1979. It was composed of leading water buffalo experts (particularly those from outside Asia who have directed the beginnings of water buffalo industries in their countries) and leading American animal scientists, many of whom are also familiar with the animal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report complements The Husbandry and Health of the Domestic Buffalo, edited by W. Ross Cockrill and published in 1974 by the Food and Agriculture Organization of the United Nations. Cockrill's 933-page book is a "bible" of water buffalo knowledge and provides details of breeds, world distribution, physiology, and an extensive bibliography.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The present report is an introduction to the water buffalo and its potential. It is written particularly for decision makers, as well as scholars or students, in the hope that it will stimulate their interest in the animal and thereby increase the appreciation of, and funding for, buffalo research. The report includes much empirical observation, largely from the panel members. Some of these observations may, in the long run, prove not to be universally applicable. Much benchmark information needs to be obtained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since its creation in 1971, the Advisory Committee on Technology Innovation (ACTI) has investigated innovative ways to use current technology and resources to help developing countries. Often this has meant taking a fresh look at some neglected and unappreciated plant or animal species. The committee assembles ad hoc panels of experts (usually incorporating both skeptics and proponents) to scrutinize the topics selected. The panel reports serve to draw attention to neglected, but promising, technologies and resources. (For a list of ACTI reports, see page 115.) ACTI reports are provided free to developing countries under funding by the Agency for International Development (AID).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Program costs for this study were provided by AID'S Office of Agriculture, Development Support Bureau, and staff support was provided by the Office of Science and Technology, Development Support Bureau.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The final draft of this report was edited and prepared for publication by F. R. Ruskin. Bibliographic editing was by Wendy D. White. Cover art was by Deborah Hanson.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">1 Introduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The domesticated water buffalo Bubalus bubalis numbers at least 130 million-one-ninth the number of cattle in the world. It is estimated that between 1961 and 1981 the world's buffalo population increased by 11 percent, keeping pace with the percentage increase in the cattle population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there are some pedigreed water buffaloes, most are nondescript animals that have not been selected or bred for productivity. There are two general types-the Swamp buffalo and the River buffalo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Swamp buffaloes are slate gray, droopy necked, and ox-like, with massive backswept horns that make them favorite subjects for postcards and wooden statuettes in the Far East. They are found from the Philippines to as far west as India. They wallow in any water or mud puddle they can find or make. Primarily employed as a work animal, the Swamp buffalo is also used for meat but almost never for milk production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">River buffaloes are found farther west, from India to Egypt and Europe. Usually black or dark gray, with tightly coiled or drooping straight horns, they prefer to wallow in clean water. River buffaloes produce much more milk than Swamp buffaloes. They are the dairy type of water buffalo. In India, River buffaloes play an important role in the rural economy as suppliers of milk and draft power. River buffaloes make up about 35 percent of India's milk animals (other than goats) but produce almost 70 percent of its milk. Buffalo butterfat is the major source of cooking oil (ghee) in some Asian countries, including India and Pakistan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although water buffaloes are bovine creatures that somewhat resemble cattle, they are genetically further removed from cattle than are the North American bison (improperly called buffalo) whose massive forequarters, shaggy mane, and small hindquarters are unlike those of cattle. While bison can be bred with cattle to produce hybrids,( This is not, however, very successful, the male progeny (at least of the F 1 generation) are sterile).there is no well-documented case of a mating between water buffalo and cattle that has produced progeny.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parts of Asia and even Europe have depended on water buffaloes for centuries. Their crescent horns, coarse skin, wide muzzles, and low-carried heads are represented on seals struck 5,000 years ago in the Indus Valley, suggesting that the animal had already been domesticated in the area that is now India and Pakistan. Although buffaloes were in use in China 4,000 years ago, they are not mentioned in the literature or seen in the art of the ancient Egyptians, Romans, or Greeks, to whom they were apparently unknown. It was not until about 600 A.D. that Arabs brought the animal from Mesopotamia and began moving it westward into the Near East (modern Syria, Israel, and Turkey). Water buffaloes were later introduced to Europe by pilgrims and crusaders returning from the Holy Land in the Middle Ages. In Italy buffaloes adapted to the area of the Pontine Marshes southeast of Rome and the area south of Naples. They also became established in Hungary, Romania, Yugoslavia, Greece, and Bulgaria and have remained there ever since.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Villagers in medieval Egypt adopted the water buffalo, which has since become the most important domestic animal in modern Egypt. Indeed, during the last 50 years, their buffalo population has doubled to over 2 million head. The animals now supply Egypt with more meat-much of it in the form of tender "veal"-than any other domestic animal. They also provide milk, cooking oil, and cheese.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other areas have capitalized on the water buffalo's promise only in very recent times. For instance, small lots of the animals brought to Brazil (from Italy, India, and elsewhere) during the last 84 years have reproduced so well that they now total about 400,000 head and are still increasing, especially in the lower Amazon region. Buffalo meat and milk are now sold widely in Amazon towns and villages; the meat sells for the same price as beef. Nearby countries have also become familiar with the water buffalo. Trinidad imported several breeds from India between 1905 and 1908, while Venezuela, Colombia, and Guyana have been importing them in recent decades. During the 1970s Costa Rica, Ecuador, Cayenne, Panama, Suriname, and Guyana introduced small herds. By 1979 the buffalo in Venezuela numbered more than 7,000 head.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Across the Pacific, the new nation of Papua New Guinea has found the water buffalo well suited to its difficult environment. For 9 years the government has attempted to run cattle on the Sepik and Ramu Plains on Papua New Guinea's north coast, where the temperatures are high and the forage of poor quality. But the cattle remain thin and underweight. In the 1960s animal scientists began evaluating water buffaloes already living in Papua New Guinea and, encouraged by the results, introduced additional buffaloes from Australia. These have performed remarkably well, producing greater numbers of calves and much more meat than the cattle in the region. The buffaloes appear to maintain appetite despite the heat and humidity, whereas cattle do not. The government of Papua New Guinea has since imported more water buffaloes and today has thriving herds totaling almost 3,500 head. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The United States has been slow to recognize the water buffalo's potential, but the first herd (50 head) ever imported for commercial farming arrived in February 1978.(Air-freighted from the wilds of Guam, the U.S. island possession on the western Pacific, by panel member Tony Leonards. Prior to that time (in 1974), four head of water buffalo were imported to the Department of Animal science' university of Florida, for study. The only other water buffaloes in North America were a few animals in zoos.) The humble water buffalo, normally considered fit only for the steamy rice fields of Asia, is now proving itself on farm fields in Florida and Louisiana. As a result, interest in the animal is on the rise in U.S. university and farm circles.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From experience accumulated in Asia, Egypt, South America, Papua New Guinea, Australia, the United States, and elsewhere, animal scientists now perceive that many general impressions about the water buffalo are incorrect.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For example, it is widely believed that the water buffalo is mean and vicious. Encyclopedias reinforce this perception, and in the Western world it is the prevalent impression of the animal. The truth is, however, that unless wounded or severely stressed, the domesticated water buffalo is one of the gentlest of all farm animals. Despite an intimidating appearance, it is more like a household pet-sociable, gentle, and serene. In rural Asia the care of water buffaloes is often fumed over to small boys and girls aged about four to nine. The children spend their days with their family's gentle buffalo, riding it to water, washing it down, waiting while it rolls and wallows, and then riding it to some source of forage, perhaps a grassy field or thicket. It is not uncommon to see a buffalo patiently feeding, with a young friend stretched prone on its broad gray back, asleep.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perhaps the notion about the viciousness of water buffaloes stems from confusing them with the mean-tempered African buffalo Syncerus caffer, actually a distant relative with which they will not interbreed and which is classified in a different genus.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ferocity is the most blatant misconception concerning the water buffalo, although other fallacies are widely reported as well.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One generally held belief is that water buffaloes can be raised only near water. Actually, buffaloes love to wallow, but they grow and reproduce normally without it, although in hot climates they must have shade available.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another belief is that the water buffalo is exclusively a tropical animal. River-type buffaloes, however, have been used to pull snow plows during Bulgarian winters. They are found in Italy (over 100,000 head), Albania, Yugoslavia, Greece, Turkey, the Georgia and Azerbaijan areas of the Soviet Union (almost 500,000 head) and other temperate-zone regions as well. They are also found in cold, mountainous areas of Pakistan, Afghanistan, and Nepal.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p04to05.png"></center><br>
+ World Distribution of Water Buffaloes</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet another misconception is that the water buffalo is just a poor man's beast of burden. In addition to providing fine lean meat, buffaloes in fact provide rich milk. Mozzarella cheese, one of the most popular in Europe, comes from the buffaloes in Italy. Buffalo milk has a higher content of both butterfat and nonfat solids than cow's milk does. It therefore often brings higher prices than cow's milk. Throughout much of India it is in such demand that cow's milk is sometimes hard to sell.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of the misconceptions generally held about buffaloes are based on little data and much prejudice. For instance, it is widely believed that water buffalo meat is tough and less desirable than beef. However, when the animals are raised for meat, buffalo steaks are lean, as tender as beef, and in appearance it is difficult to distinguish the two. In taste-preference tests at the University of Queensland, buffalo steaks were preferred over those from Angus and Hereford cattle. Tests conducted in Trinidad, Venezuela, the United States, and Malaysia produced similar results.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Australia has shipped water buffalo meat to Hong Kong, the United States, Germany, and Scandinavia. Buffalo meat is now available in stores in Australia's Northern Territory, where demand exceeds supply. It sells at competitive prices and is particularly sought for barbecues and the famous Australian meat pie. In the Philippines, two-thirds of the meat consumed in homes and restaurants is actually water buffalo, a fact that many Filipinos do not realize.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Compared with cattle,waterbuffaloes apparently have an efficient digestive system, one which extracts nourishment from forage so coarse and poor that cattle do not thrive on it. Thin cattle are commonly seen in Asia and northern Australia, for example, but it's rare to see a protruding rib on a buffalo, even though it uses the same source of feed.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Asia, the Middle East, and Europe, water buffaloes live on coarse vegetation on the marginal land traditionally left to the peasants. They help make human survival possible. An old Chinese woman in Taiwan once told panelist W. Ross Cockrill: "To my family the buffalo is more important than I am. When I die, they'll weep for me; but if our buffalo dies, they may starve."  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A better understanding of the water buffalo could be invaluable to many developing nations. In particular, improved production of water buffalo meat offers hope for helping feed India, the second most populous nation on earth. Although India for religious reasons forbids the slaughter of cows, it has no prohibitions regarding slaughter of water buffaloes or the consumption of buffalo meat.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most developing countries are in the tropics, and the water buffalo is inherently a tropical animal. It is comfortable in hot, humid environments. In the Amazon, for example, buffaloes are now common on the landscape and may even replace cattle completely.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tropical countries have more serious disease problems than temperate countries do. Although susceptible to most cattle diseases, the water buffalo seems to resist ticks and often appears to be more resistant to some of the most devastating plagues that make cattle raising risky, difficult, and sometimes impossible in the tropics. Several researchers report that when water buffaloes are allowed to wallow, their mud-coated skin seems to deter insect and tick ectoparasites and they consequently require greatly reduced treatment with insecticides. Although the buffalo fly (Siphona exigua) affects the animals, other pests such as the warble fly and the screwworm, for example, seldom affect healthy buffaloes. AIso, despite their inclination for living in swamps, Avers, and ponds, diseases of the feet such as foot rot and foot abscesses are rare.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another benefit to developing countries is the water buffalo's legendary strength. A large part of the total farm power available in South China, Thailand, Indonesia, the Philippines, the Indochina states, India, and Pakistan comes from this "living tractor." Dependable and docile, the animals pull plows, harrows, and carts with loads that weigh several tons. In the Amazon buffalo teams pull boats laden with cargo and tourists through shallows and swamps.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The petroleum crisis has forced many farmers to reconsider animal power even in some of the technically advanced countries. Buffaloes are not only extraordinarily strong, they can also work in deep mud that may bog down a tractor. Even up to their bellies they forge on, dragging both plow and driver through the mud. Although its average walking speed is only about 3 kilometers per hour, the buffalo, unlike its mechanical competition, doesn't need gasoline or spare parts and its working life is often 20 years or more.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Breeds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As already noted, the major genetic divisions of the water buffalo are the Swamp buffalo of the eastern half of Asia, which has swept-back horns, and the River buffalo of the western half of Asia, which usually has curled horns. There is also the Mediterranean buffalo, which is of the River type but has been isolated for so long that it has developed some unique characteristics. (Records of the buffalo in Italy date back 1,000 years, during which there have been no reported imports.) Mediterranean buffaloes are stocky, high yielding animals that combine both beef and dairy characteristics.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there is only one breed of Swamp buffalo, certain subgroups seem to have specific inherited characteristics. For example, the buffaloes of Thailand are noted for their large size, averaging 450-550 kg, and weights of up to 1,000 kg have been observed. Elsewhere, Swamp buffaloes range from 250 kg for some small animals in China to 300 kg in Burma and 500-600 kg in Laos.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only in India and Pakistan are there well-defined breeds with standard qualities. There are eighteen River buffalo breeds in South Asia, which are further classified into five major groups designated as the Murrah, Gujarat, Uttar  Pradesh, Central Indian, and South Indian breeds. These are the five groups and  main breeds:  </P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=484>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<B><FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Group</B></FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<B><FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Breeds</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Murrah</FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Murrah, Nili/Ravi, Kundi</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Gujarat</FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Surti, Mehsana, Jafarabadi</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Uttar Pradesh</FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Bhadawari, Tarai</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Central Indian</FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Nagpuri, Pandharpun, Manda, Jerangi, Kalahandi, Sambalpur</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">South Indian</FONT></TD>
+<TD WIDTH="79%" VALIGN="TOP">
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY">Toda,  South Kanara</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The best-known breeds are Murrah, Nili/Ravl, Jafarabadi, Surti, Mehsana, and  Nagpuri. Most of the buffaloes of the Indian subcontinent belong to a nondescript  group known as the Desi buffalo. There is no controlled breeding among these  animals and most are quite small, yield little milk, and are variable in color.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Genetics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Swamp buffalo has 48 chromosomes, the River buffalo, 50. The chromosomal  material is, however, similar in the two types and they crossbreed to produce fertile  hybrid progeny. Cattle, however, have 60 chromosomes and although mating  between cattle and buffaloes is common, hybrids from the union are unlikely to  occur.( In 1965 a reputed hybrid was born at Askaniya Nova Zoopark in the Soviet Union  (see Gray, A., 1971. Mammalian Hybrids, Commonwealth Agricultural Bureaux,  Slough, England, p. 126). Hybrids have also been reported from China (Van  Fu-Czao 1959, Gibridy buivolc i krupnogo  i rogatogo skota(buffalo and  cattlehybrids)Zhivotnovodstro, Mosk., 21:92). Both of these reports seem doubtful  because despite many attempts, no other hybrids have ever been claimed to have  been produced). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Individual buffaloes show large variation in milk yield, conformation, horn shape,  color, meat production, temperament, growth rate, and other characteristics.  Selection for survival under adverse conditions has occurred naturally (those that  could not stand adversity died early) and farmers have probably tended to select  animals of gentle temperament. But systematic genetic improvement has almost  never been attempted. It seems likely that further selection could quickly improve  their productivity.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, the large bulls that would be best for breeding purposes are often  being selected as draft animals and castrated, or sent to slaughter, or (as with  some feral animals in northern Australia and on the Amazon island of Marajo) shot  by hunters. The result is that the buffalo's overall size in countries such as Thailand  and Indonesia has been decreasing as the genes for large size and fast growth are  lost.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Limitations  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The buffalo is still largely an animal of the village, and many of its reported  limitations are caused more by its environment than by the animal itself. Moreover,  much of the animal's genetic potential is obscured by environmental influences. For  example, for many breeds and types the genetic variations in milk yield and growth  cannot be accurately determined because they are overwhelmed by the effects of  inadequate nutrition and management.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, some inherent limitations of buffaloes can be identified. For instance,  buffaloes suffer if forced to remain, even for a few hours, in direct sunlight. They  have only one-tenth the density of sweat glands of cattle and their coating of hair is  correspondingly sparse, providing little protection from the sun. Accordingly,  buffaloes must not be driven over long distances in the heat of the day. They must  be allowed time for watering and, if possible, for wallowing. Driving under a hot sun  for long hours will cause heat exhaustion and possibly death; losses can be very  high and can occur suddenly. Young calves are particularly affected by heat.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes are also sensitive to extreme cold and seem less able than cattle to  adapt to truly cold climates(A rule of thumb is that buffaloes don't do well where the sun is inadequate to ripen,  say, cotton, grapes, or Ace. Kaleff, B., 1942. Der Hausbuffel und seine  Zuchtungsbiologie im Vergleich zum Rind. Zeitschsift Tierzucht Biologze,  51:131-178). Sudden drops in temperature and chill winds may lead  to pneumonia and death.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo is usually found m areas where there is ready access to a wallow  or shower. This is not a necessity, but when temperatures are high the availability of  water is important for maintaining buffalo health and productivity. It seems clear,  then, that the buffalo is not suitable for arid lands.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Increasing buffalo productivity through breed improvement is just now beginning.  Throughout Asia buffalo mating is almost completely haphazard, and so the animal  lacks the quality improvement through breeding that most cattle have had.  Therefore, most buffaloes are of nondescript heritage and genetic potential.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On poor quality feed water buffalo grow at least as well as cattle, but under intensive  conditions they probably won't grow as fast as the best breeds of cattle. In feedlots,  therefore, the buffalo is likely to be less productive than improved cattle. Weight  gains of about 1 kg per day have been recorded, some exceptional cattle may gain  at almost twice that rate.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The buffalo has long been considered a poor breeder-slow to mature sexually,  and slow to rebreed after calving. Accumulated experience now shows, however,  that this is mainly a result of poor management and nutrition. Buffaloes are not  sluggish breeders. Nevertheless, their gestation period is about a month longer  than that of cows, buffalo estrus is difficult to detect, and many matings occur~at  night so that~ farmers are likely to encounter more problems breeding buffaloes  than cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes are gentle creatures, but if roughly or inexpertly handled they can, through fear or pain, become completely unmanageable. Buffalo behavior sometimes differs from that of cattle. For example, most buffaloes are not trained to be driven. Instead, the herdsman must walk alongside or ahead of them; they then instinctively follow. Also, because of their innate attachment to an individual site or herd it is more difficult to move buffaloes to new locations or herds. In addition, buffaloes respect fences less than cattle do and when they have the desire to move they are harder to contain. (Electric fences, however, will stop them.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite their general good health, buffaloes are probably as susceptible as cattle to most infections. However, the buffalo seems to be peculiarly sensitive to a few cattle diseases and resistant to a few others (see chapter 7). Reactions to some diseases seem to vary with region, environment, and breed, and the differences are not well understood.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Destruction of the environment is sometimes attributed to buffalo wallowing. This danger seems to have been overstated, except in cases where stocking rates were unreasonably high.(An ongoing study in Northern Australia of environmental degradation widely attributed to buffalo has now shown that the effects are caused by man and climatic changes and only very slightly by buffaloes. (information supplied by D. G. Tulloch.) ) However, buffaloes rub against trees more often than cattle do, and they sometimes de-bark the trees, causing them to die.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, some of the best genetic stocks of water buffaloes exist in areas where certain infections and viral and other diseases sometimes occur. Thus, many countries are reluctant to permit importation of water buffaloes, despite the fact that modern quarantine procedures under conditions of maximum security can essentially eliminate the risk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, it must be emphasized that because buffalo research has been largely neglected, most results reported in this and other buffalo writings cover small numbers of animals and short periods of time. Many are merely empirical observations that have not been subjected to independent confirmation.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anonymous. 1972.Buffalo at the crossroads. World Farming 14(n:l0-l3.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asian and Pacific Council. 1979. Priorities in buffalo research identified.ASPAC News letter No. 43.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bowman, J. c. 1977. Animals for Man. Edward Arnold Publishers, Ltd., London, United Kingdom.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo Bulletin. Newsletter published by the Buffalo Research Committee of Kasetsart University, Bangkok' Thailand. (In English and Thai.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo World. Newsletter published by the National Dairy Research Institute, Karnal, 132001, Haryana, India.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chantalakhana, C. 1975. The buffaloes of Thailand-their potential, utilization and conservation. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chantalakhana, C., and Na Phuket, S. R. 1979. The role of swamp buffalo in small farm development and the need for breeding improvement in Southeast Asia. Extension Bulletin No. 125. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1967. The water buffalo. Scientific American 217:118.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R., ed. 1974. The Husbandry and Health of the Domestic Buffalo. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill W. R. 1975. The domestic buffalo. Blue Book for the Veterinary Profession No. 25. Animal Production and Health Division, Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1976. The Buffaloes of China. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R., ed. 1977. The Water Buffalo. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1977. The water buffalo: domestic animal of the future. Bovine Practitioner 12:92-98.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1978. Domestic water buffaloes. In: The Care and Management of Farm Animals, edited by W. N. Scott. Bailliere TindaU, London, United Kingdom.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1980. The ascendant water buffalo-key domestic animal. World Animal Review 33:2-13.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DeBoer, A. J. 1972. Technical and economic constraints on bovine production in three villages in Thailand. Dissertation Abstracts International 33(5):1935.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DeBoer, A. J. 1975. Livestock and Poultry Industry in Selected Asian Countries. Report of Survey on Diversification of Agriculture: Livestock and Poultry Production. Asian Productivity Organization, Tokyo, Japan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">de Guzman, M. R., Jr. 1979. An overview of recent developments in buffalo research and management in Asia. Extension Bulletin No. 124. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Documentation Center on Water Buffalo. 1978. Abstract Bibliography on Water Buffalo, 1971-1975. Documentation Center on Water Buffalo, University of the Philippines at Los Banos Library, College, Laguna 3720, Philippines.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fahimuddin, M. 1975. Domestic Water Buffalo. Oxford and IBH Publishing Company, New Delhi, India  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fischer, H. 1975. The water buffalo and related species as important genetic resources: their conservation, evaluation and utilization. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6  1975. Food and Fertilizer Technology Center, Taipei, Taiwan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ford, B. D., and Tulloch, D. G. 1977. The Australian buffalo-a collection of papers. Technical Bulletin No.18. Department of the Northern Territory, Animal Industry and Agriculture Branch, Australian Government Publishing Service, Canberra, Australia.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gupta, H. C. 1977. Possibilities and realities of developing buffalo's performance, breeding and feeding. Indian Dairyman 29(6):337-346.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kartha, K. P. R.1965. Buffalo. In: An Introduction to Animal Husbandry in the Tropics edited by G. Williamson and W. J. A. Payne. Longman, London, United Kingdom.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">McKnight, T. L. 1971. Australia's buffalo dilemma. Annals of the Association of American Geographers 61(4):759-773.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madamba, J. C., and Eusebio, A. N. 1979. Developments in the strengthening of buffalo research in Asia. Buffalo Bulletin 2(3):7-16.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mahadevan, P. 1978. Water buffalo research-possible future trends. World Animal Review 25: 2-7.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oloufa, M. M. 1979. Buffaloes as producers of meat and milk. Egyptian Journal of AnimalProduction 19:1-10. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pant, H. C., and Roy, A. 1972. The water buffalo and its future. In: Improvement of Livestock Production in Warm Climates, edited by R. E McDowell. W. H. Freeman and Company, San Francisco, California, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Philippine Council for Agriculture and Resources Research. 1978. The Philippines Recommends for Caraboo Production, PCARR, Los Banos, Laguna 3732, Philippines.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ranjhan, S. K., and Pathak, N. N. 1981. Management and Feeding of Buffaloes. Vikas Publishing House, New Delhi, India  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robinson, D. W. 1977a. Livestock in Indonesia. Research Report No. 1. Centre for Animal Research and Development, Bogor, Indonesia. (In English and Indonesian.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robinson, D. W. 1977b. Preliminary Observations on the Productivity of Porking Buffalo in Indonesia. Research Report No. 2. Centre for Animal Research and Development, Bogor, Indonesia. (In English and Indonesian.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sundaresan, D. 1979. The role of improved buffaloes in rural development. Indian Dairyman 31(2):73-78.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1978. The water buffalo, Bubalus bubalis, in Australia: grouping and home range.Australian Wildlife Research 5:327-34.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wahid, A. 1973. Pakistani buffaloes. World Animal Review 7:22~28. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">2 Meat</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo offers promise as a major source of meat, and the production of buffaloes solely for meat is now expanding.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because buffaloes have been used as draft animals for centuries, they have evolved with exceptional muscular development, some weigh 1,000 kg or more. Until recently, however, little thought was given to using them exclusively for meat production. Most buffalo meat was, and still is, derived from old animals slaughtered at the end of their productive life as work or milk animals. As a result, much of the buffalo meat sold is of poor quality. But when buffaloes are properly reared and fed, their meat is tender and palatable.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are exported for slaughter from India and Pakistan to the Middle East and from Thailand and Australia to Hong Kong. Demand for meat is so great that Thailand's buffalo population has dropped from 7 million to 5.7 million head in the last 20 years, a period in which the human population has more than doubled.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Carcass Characteristics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All buffalo breeds-even the milking ones-produce heavy animals whose carcass characteristics are similar to those of cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite heavier hide and head, the amount of useful meat (dressing percentage) from buffaloes is almost the same as in cattle. Mediterranean type buffalo and Zebu cattle steers in Brazil yielded dressing percentages of 55.5 and 56.6 percent respectively. Swamp buffalo dressing percentages have been measured in Australia at 53 percent. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes are lean animals. Although a layer of subcutaneous fat covers the carcass, it is usually thinner than that on comparably fed cattle. Even animals that appear to be fat prove to be largely muscle. Australian research on Swamp buffaloes reveals that buffaloes with more than 25 percent fat are difficult to produce, whereas average choice-grade beef carcasses may contain  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In general, the buffalo carcass has rounder ribs, a higher proportion of muscle, and a lower proportion of bone and fat than beef has.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo hide is so thick that it can be sliced into two or three layers before tanning into leather.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Meat Quality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo meat and beef are basically similar. The muscle pH (5.4), shrinkage on chilling (2 percent), moisture (76.6 percent), protein (19 percent), and ash (1 percent) are all about the same in buffalo meat and beef. Buffalo fat, however, is always white and buffalo meat is darker in color than beef because of more pigmentation or less intramuscular fat (2-3 percent "marbling," compared with the 3-4 percent in beef).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Eating Quality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taste-panel tests and tenderness measurements conducted by research teams in a number of countries have shown that the meat of the water buffalo is as acceptable as that of cattle. Buffalo steaks have rated higher than beefsteaks in some taste tests in Australia, Malaysia, Venezuela, and Trinidad.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In taste-panel studies in Trinidad, cooked joints from three carcasses Trinidad buffalo, a crossbred steer (Jamaica-Red/Sahiwal), and an imported carcass of a top-grade European beef steer-were served. The 28 diners all had experience in beef production, butchery, or catering and were not told the sources of the various joints. All the carcasses were held in cold storage for one week before cooking. The buffalo meat was rated highest by 14 judges; 7 chose the European beef; 5 thought the crossbred beef the best; and 2 said that the buffalo and crossbred were equal to or better than the European beef. The buffalo meat received most points for color (both meat and fat), taste, and general acceptability. There was little difference noted in texture.( Information supplied by P. N. Wilson.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo veal is considered a delicacy. Calves are usually slaughtered for veal between 3 and 4 weeks of age; dressed weight is 59-66 percent of live weight.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is some evidence that buffaloes may retain meat tenderness to a more advanced age than cattle because the connective tissue hardens at a later age or because the diameter of muscle fibers in the buffalo increases more slowly than in cattle(Joksimonc, 1979) In one test the tenderness (measured by shearing force) of muscle samples from carcasses of buffalo steers 16-30 months old was the same as that from feedlot Angus, Hereford, and Friesian steers 12-18 months old. This gives farmers more flexibility in meeting fluctuating markets while still providing tender meat.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anonymous. 1976. Livestock Production in Asian Context of Agricultural Diversification. Asian Productivity Organization, Tokyo, Japan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arganosa, F. C., Sanchez, P. C., Ibarra, P. I., Gerpacio, A. L., Castillo, L. S., and Arganosa, V. G. 1973. Evaluation of carabeef as a potential substitute for beef. Philippine Journal of Nutrition 26(2).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arganosa, F. C., Arganosa, V. G., and Ibarra, P. I. 1975. Carcass evaluation and utilization of carabeef. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bennett, S. P. 1973. The "buffalypso"-an evaluation of a beef type of water buffalo in Trinidad, West Indies. Paper presented at the Third World Conference on Animal Production, Melbourne, Australia.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Borghese, A., Gigli, S., Romita, A., Di Giacomo, A., and Mormile, M. 1978. Fatty acid composition of fat in water buffalo calves and bovine calves slaughtered at 20, 28, and 36 weeks of age. In: Patterns of Growth and Development in Cattle: A Seminar in the EEC Programme of Coordination of Research on Beef Production, held at Ghent, October 11-13,1977. Martinus Nijhoff, The Hague, Netherlands.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles, D. D., and Johnson, E. R. 1972. Carcass composition of the water buffalo (Bubalus bubalis). Australian Journal of Agriculture Research 23:905-911.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles, D. D., and Johnson, E. R. 1975. Live weight gains and carcass composition of buffalo (Bubalus bubalis) steers on four feeding regimes. Australian Journal of Agriculture Research 26:407-413.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1975. Alternative livestock: with particular reference to the wafer buffalo (Bubalus bubalis). In: Meat. Proceedings of the 21st Easter School in Agricultural Science, University of Nottingham, edited by D. J. A. Cole and R. A. Lawrie. Butterworth, London, England.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">El-Ashry, M. A., Mogawer, H. H., and Kishin, S. S. 1972. Comparative study of meat production from cattle and buffalo male calves. Egyptian Journal of Animal Production 12:99-107.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">El-Koussy, H. A., Afifi, Y. A., Dessouki, T. A., and El-Ashry, M. A. 1977. Some chemical and physical changes of buffalo meat after slaughter. Agriculture Research Review 55:1-7.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Johnson, E. R., and Charles, D. D. 1975. Comparison of live weight gain and changes in carcass composition between buffalo (Bubalus bubalis) and Bos taurus steers. Australian Journal of Agriculture Research 26:415- 422.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joksimovic, J. 1979. Physical, chemical and structural characteristics of buffalo meat. Arhiv za Polloprivredne Nauke 22:110.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joksimovic, J., and Ognjanovic, A. 1977. A comparison of carcass yield, carcass composition, and quality characteristics of buffalo meat and beef Meat Science 1:105 -110.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mai, S. C., and Wu, T. H. 1974. TSC's intensive feed-lot system for cow-calf and beef production program. Taiwan Sugar 21(6):198-211.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Matassino, D., Romita, A., Cosentino, E., Girolami, A., and Cloatruglio, P. 1978. Myorheological, ohemical, and colour characteristics of meat in water buffalo and bovine calves slaughtered at 20, 28 and 36 weeks. In: Patterns of Growth and Development in Cattle: A Seminar in the EEC Programme of Coordination of Research on Beef Production, held at Chent, October 11-13, 1977. Martinus Nijhoff, The Hague, Netherlands.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mogawer, H. H., El-Ashry, M. A., and Mahmoud, S. A. 1976. Comparative study of meat production from cattle and buffalo male calves. II. Effect of different roughage concentrate ratios in ration on carcass traits. Journal of Agriculture Research {Tanta University) 2:6-12.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ognjanovic, A. 1974. Meat and meat production. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. CockrilL Food and Agriculture Organization of the United Nations, Rome, Italy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rastogi, R., Youssef, F. G., and Gonzalez, F. D. 1978. Beef type water buffalo of Trinidad-Beefalypso. World Review of Animal Production 14(2) :49 -56.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Romita, A., Borghese, A., Gigli, S., and Di Giacomo, A. 1978. Growth rate and carcass composition of water buffalo calves and bovine calves slaughtered at 20, 28 and 36 weeks. In: Patterns of Growth and Development in Cattle: A Seminar in the EEC Programme of Coordination of Research on Beef Production, Held at Chent, October 11-13, 1977. Martinus Nijhoff, The Hague, Netherlands.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wilson, P. N. 1961. Palatability of water buffalo meat. Journal of the Agricultural Society of Trinidad 61:457, 459-460. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">3 Milk</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than 5 percent of the world's milk comes from water buffaloes. Buffalo milk is  used in much the same way as cow's milk. It is high in fat and total solids, which  gives it a rich flavor. Many people prefer it to cow's milk and are willing to pay more  for it. In Egypt, for example, the severe mortality rate among buffalo calves is due in  part to the sale of buffalo milk, which is in high demand, thus depriving calves of  proper nourishment. This also occurs in India, where in the Bombay area alone an  estimated 10,000 newborn calves starve to death each year through lack of milk.  The demand for buffalo milk in India (about 60 percent of the milk consumed; over  80 percent in some states) is reflected in the prices paid for a liter of milk: about  130 paisa for cow's milk compared with about 200 paisa for buffalo milk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Twelve of the 18 major breeds of water buffalo are kept primarily for milk production  (although males may be used for traction and all animals are eventually used for  meat). The main milk breeds of India and Pakistan are the Murrah, Nili/Ravi, Surti,  Mehsana, Nagpuri, and Jafarabadi. The buffaloes of Egypt, Eastern Europe  (Bulgaria, Romania, Yugoslavia, and the USSR), and Italy are used for milk  production and there are also herds used principally for this purpose in Iran, Iraq,  and Turkey.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Composition</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo milk contains less water, more total solids, more fat, slightly more lactose,  and more protein than cow's milk. It seems thicker than cow's milk because it  generally contains more than 16 percent total solids compared with 12-14 percent  for cow's milk. In addition, its fat content is usually 50-60 percent higher (or more)  than that of cow's milk. Although the butterfat content is usually 6-8 percent,( An analysis of 7,770 records of Nili/Ravi buffaloes in herds at the Pakistan  Research Institute showed that average butterfat content was 6.40 (a mean based  on 10 tests over 10 months). of all the samples tested, 77 percent ranged between  5 and 8 percent butterfat and 12 percent were below 5 percent butterfat.  -information supplied by R. E. McDowell.)  it can  go much higher in the milk of some well fed dairy buffaloes and in the milk of  Swamp buffaloes (which are not normally used for milking). Cow's milk butterfat content is usually between 3 and 5 percent.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of its high butterfat content, buffalo milk has considerably higher energy value than cow's milk. Phospholipids are lower but cholesterol and saturated fatty acids are higher in buffalo milk. Studies have shown that digestibility is not adversely affected by this. Because of the high fat content, the buffalo's total fat yield per lactation compares favorably with that of improved breeds of dairy cattle; it is much higher than that of indigenous cows.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Normally the protein in buffalo milk contains more casein and slightly more albumin and globulin than cow's milk. Several researchers have claimed that the biological value of buffalo milk protein is higher than that of cow's milk, but this has not yet been proved conclusively.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p27.png"></center><br>
+ Tables 1 and 2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mineral content of buffalo milk is nearly the same as that of cow's milk except for phosphorus, which occurs in roughly twice the amount in buffalo milk. Buffalo milk tends to be lower in salt.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo milk lacks the yellow pigment carotene, precursor for vitamin A, and its whiteness is frequently used to differentiate it from cow's milk in the market. Despite the absence of carotene, the vitamin A content in buffalo milk is almost as high as that of cow's milk. (Apparently the buffalo converts the carotene in its diet to vitamin A. The two milks are similar in B complex vitamins and vitamin C, but buffalo milk tends to be lower in riboflavin.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Milk Products</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo milk, like cow's milk, can provide a wide variety of products: butter, butter oil (clarified butter or ghee), soft and hard cheeses, condensed or evaporated milks, ice cream,yogurt, and buttermilk. It is of great economic importance in India in preparing "toned" milk-a mixture of buffalo milk and milk made by reconstituting skim milk powder.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The richness of buffalo milk makes it highly suitable for processing. To produce 1 kg of cheese, a cheese maker requires 8 kg of cow's milk but only 5 kg of buffalo milk. To produce 1 kg of butter requires 14 kg of cow's milk but only 10 kg of buffalo milk. Because of these high yields, processors appreciate the value of buffalo milk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo cheese is pure white. It many countries it is among the most desirable cheeses (mozzarella and ricotta in Italy, gemir in Iraq, the salty cheeses of Egypt, and pecorino in Bulgaria, for example). In Venezuela all the cheese produced from the small La Guanota milking herd in the Apure River basin (about 100 kg a day) is bought by the Hilton Hotel and sells for 15 bolivars per kg compared with 8 bolivars per kg for cheese made from cow's milk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although much in demand for making soft cheese, buffalo milk is less desirable for making hard cheeses such as cheddar or gouda. During cheesemaking it produces acid more slowly than cow's milk, retains more water in the curd, and loses more fat in the whey.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cheeses are becoming increasingly popular throughout the world. Demand is rising at a rate that is among the highest for any food product. Cheese offers particular benefit to areas where refrigeration is not widely available, where transporting high-protein foods to remote areas is difficult, and where seasonal fluctuations affect milk supplies. Buffalo milk may make cheesemaking profitable on an even smaller scale than conventional dairying; it is more concentrated than cow's milk and requires relatively less energy to transport and process (an increasingly important factor where fuels are limited).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p31.png"></center><br>
+ Table 3 Highest Milk Yield (kg per Day) Recorded in the All India Milk Yield</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Yield</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In countries like India and Egypt, the milk yield of buffaloes is generally higher  (680-800 kg) than for local cattle (360-500 kg). However, since selection for  exceptional milk production is not conducted systematically, large variations in yield  occur between individual animals, and milk production of dairy buffaloes falls short  of its potential.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nonetheless, some outstanding yields have been recorded. On Indian government  farms, average yields for milking buffaloes range from 4 to 7 kg per day in  lactations averaging 285 days. Daily yields of 12 kg have been reported for some  Bulgarian buffalo cows and a daily production of over 20 kg has been reported for  some remarkable animals in India. A peak milk yield of 31.5 kg in a day has been  recorded from a champion Murrah buffalo in the All India Milk Yield Competition  conducted by the Government of India (see Table 3).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At Caserta, Italy, a herd of 1,600 machine-milked, pedigreed dairy buffaloes has  produced average yields of 1,500 kg during lactations of 270 days. In Pakistan an  analysis of over 6,000 lactations of Nili/Ravi buffalo cows showed an average yield  of 1,925 kg during lactations averaging 282 days(Average adjusted for year and  season and calving. Cady et al., in press.) . In India the average milks yield of  Murrah buffaloes in established herds is also reported to be about  1,800kg(*"Williamson and Payne, 1965.)Table 4 lists some outstanding lactation  yields reported from different parts of the world. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As with cattle, the percentages of fat, protein, and total solids decrease as the milks yield increases.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Swamp buffaloes of Southeast Asia are usually considered poor milk producers. They are used mainly as draft animals, but it may be that their milk potential has been underestimated. In the Philippines Swamp buffalo cows with nursing calves have produced 300-800 kg of milk during lactation periods of 180-300 days(*Philippines Council for Agriculture and Resources Research (PCARR). 1978. The Philippines Recommends for Caraboo Production, PCARR, Los Banos, Philippines)In Thailand Swamp buffaloes selected and reared for milk production have yielded 3-5 kg per day during 305-day lactations.(Information supplied by Charan Chantalakhana.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p32.png"></center><br>
+ Table 4 Milk Production of Some Outstading Buffalo Cows and Dairy Herds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Nanning Livestock Research Institute and Farm in Kwangsi Province,which is representative of many others in South China, is upgrading the native  Swamp buffaloes (or Shui Niu) by selective breeding for size and weight and by  crossbreeding with dairy breeds such as the Murrah and Nili/Ravi. The crossbreeds  that are milked yield 4-5 kg daily.(*CockriH, W. R. 1976. The Buffaloes of China.  FAO, Rome.) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">  </P>
+<P ALIGN="JUSTIFY">Dairy Management</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The characteristics of the dairy buffalo so closely approximate those of the dairy cow that successful methods of breeding, husbandry, and feeding for  milks production for the cow can be applied equally to the dairy buffalo. Buffaloes,  however, have not been bred for uniform udders and it is more difficult to milk them  by machine.(Some thousands of buffaloes are machine milked in Bulgaria and Italy, however. At  Ain Shams University in Egypt, buffaloes have adapted to machine milking. The  calves are separated from their dams immediately after birth and no problems of  milk letdown have been observed. -information supplied by M. El Ashry.)Also, some buffaloes have more of a problem with milks letdown than  dairy cows (although not as much of a problem as some native cattle breeds in the  tropics). Frequently, a calf is kept with the cow and is tied to her foreleg at milking  time. In India, Burma, and other countries a dummy calf may be provided; playing  music seems to work, too.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Addeo, F., Mercier, J. C., and Ribadeau-Dumas, B. 1977. The caseins of buffalo  milk. Journal of Dairy Research 44(3):455-468.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agarwala, O. P. 1962. Certain factors of reproduction and production in a water  buffalo herd. Indian Joumal of Dairy Science 15(2):45-51.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Albourco, F., Mincione, B., Addeo, F., and Ameno, M. 1969. Buffaloes' milk. II.  Variations in composition during lactation of milk produced without change in  feeding. Industrie Agraria 7(5):210-219.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associazione Italiana Tecnici del Latter. 1970. Buffaloes' milk and cheese. Scienza  e Tecnica 21(3):175-196.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhatnagar, V. K., Lohia, K. L., and Monga, O. P. 1961. Effect of the month of  calving on milk yield, lactation length and calving interval in Murrah buffaloes. Indian  Journal of Dairy Science 14(3): 102-108.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhasin N. R., and Desai, R. N. 1967. Effect of age at first calving and first lactation  yield on life time production in Hariana cattle. Indian Veterinary Journal 44:684694.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cady, R. A., Shah, S. K., Schermerhorn, E. C., and McDowell, R. E. In Press.  Factors affecting performance of Nili-Ravi buffaloes in Pakistan. Journal of Dairy  Science.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Castillo, L. S. 1975. Production, characteristics and processing of buffalo milk. In:  The Asiatic Water Buffalo. Proceedings of an International Symposium held at  Khon Kahn, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology  Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dassat, P. M., de Paolis, P., and Sartore, G. 1966. Environmental effects on milks  yield in Italian buffalo.Acta Medica Veterinaria 12(6):587-593.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dave, B. K., and Taylor, C. M. 1975. A study on relationship of persistency with other first production traits in Indian water buffaloes. Indian Journal of Animal Health 14(1) :77-80.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Deshmukh, S. N., and Choudhury, P. N. R. 1971. Repeatability estimates of some economic characteristics in Italian buffaloes. Zentralblatt fuer Veterinaer-medizen 18:104-107.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ganguli, N. C. 1979. Buffalo milk technology. World Animal Review 30:2-10.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gomez, I. V. 1977. The manufacture of semihard cheese (Danish type) from carabao milk. Philippine Agriculturalist 61(3/4) :78-86.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gurnani, M., and Nagarcenkar, R. 1971. Evaluation of breeding performance of buffaloes and estimation of genetic and phenotypic parameters. Annual Report of the National Dairy Research Institute, Karnal, India.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Katpatal, B. G. 1977. Dairy cattle crossbreeding in India. I. Growth and development of crossbreeding. World Animal Review 22: 15-21.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kay, H. D. 1974. Milk and milk production. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kohli, M. L., and Malik, D. D. 1960. Effect of service period on total milk production and lactation length in Murrah buffaloes. Indian Journal of Dairy Science 13(3): 105-111.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nascimento, C. N. B., Moura Carvalho, L. O. D., and Lourenco, J. B. 1979. Irnportancia do Bufalo para a Pecuarfa Brasileira. Agricultural Research Center for Humid Tropics (CPATU), Belem, Para, Brazil.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raafat, M. A., El-Sayed, Abou-Hussein, Abou-Raya, A. K., and El-Shirbiny A. 1974. Some nutritional studies of colostrum and milk of cows and buffaloes E:gyptian Journal of Animal Production 14(1) :137-148.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ragab, M. T., Asker, A. A., and Kamal, T. H. 1958. The effect of age and seasonal calving on the composition of Egyptian buffalo milk. Indian Journal of Dairy Science 11(1):18-28.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Saudi Arabia Standards Institution. 1978. Raw milk. Saudi Arabia Standard 98.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sebastian, J., Panthulu, P. C, and Bhimasena, M. 1971. Composition of Surti buffalo milk. Annual Report of the National Dairy Research Institute, Karnal, India.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sekhon, G. S., and Gehlon, M. S. 1966. Repeatability estimates of some economic traits in the Murrah buffalo. Ceylon Veterinary Journal 14:18-22.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, B. B., and Singh, B. P. 1971. Comparative study of lifetime economics of Hariana versus Murrah buffaloes. Indian Veterinary Journal 48:485-489.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, R. P. 1966. A study of production up to ten years of age in buffaloes maintained at military farms. Indian Veterinary Journal 43:986-992.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, S. B., and Desai, R. N. 1962. Production character of Bhadawari buffalo cow. Indian Veterinary journal 39:332-343.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Venkayya, D., and Anantakrishnan, C. P. 1957. Influence of age at first calving on the performance of Murrah buffaloes. Indian Journal of Dairy Science 10(1):20-24.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Williamson, G., and Payne, W. J. A. 1965. An Introduction to Animal Husbandry in the Tropics. Longman, London, United Kingdom. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">4 Work</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo is the classic work animal of Asia, an integral part of that  continent's traditional village farming structure. Probably the most adaptable and  versatile of all work animals, it is widely used to plow; level land; plant crops; puddle  rice fields; cultivate field crops; pump water; haul carts, sleds, and shallow-draft  boats; carry people; thresh grain; press sugar cane; haul logs; and much more.  Even today, water buffaloes provide 20-30 percent of the farm power in South  China, Thailand, Indonesia, Malaysia, Philippines, and Indochina(Figures provided by A. J. de veer. In India water buffaloes contribute much less to  farm power (6-12 percent); bullocks are more commonly used. In Pakistan  buffaloes are little used for farm power (1-2 percent) but provide much of the road  haulage. Papua New Guinea has no tradition of using any work animal, but villagers  are increasingly using buffaloes for farm work and the government is employing  Fillipinos to train them) . Millions of  peasants in the Far East, Middle East, and Near East have a draft buffalo. For them  it is often the only method of farming food crops.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As fuel becomes scarce and expensive in these countries, the buffalo is being used  more frequently as a draft animal. ln 1979 water buffalo prices soared in rural  Thailand because of the increased demand.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although Asian farms have increasingly mechanized in the last 20 years, it has  often proved difficult to persuade the farmer to replace his buffalo with a tractor  since the buffalo produces free fertilizer and does not require diesel fuel. Now there  is renewed official interest in draft power. Sri Lanka has recently opened up large  new tracts of farmland in the Mahawali Valley, creating such a demand for work  animals that buffalo shortages have become a national development problem.  Indonesia's transmigration schemes are also handicapped by shortages of animal  power.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For many small farmers the buffalo represents capital. It is often the major  investment they have. Buffalo energy increases their productivity and allows them to  diversify. Even small farms have work animals that, like the farmer himself, subsist  off the farm. Tractors usually require at least four hectares for economical operation,  which precludes their use on most peasant farms. Further, the infrastructure to  maintain machinery is often not readily available.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes are also used for hauling. Buffalo-drawn carts carry goods between  villages where road surfaces are unfit for trucks. The animals easily traverse  ravines, streams, paddies, and narrow and rocky trails. In the cities carts can  compete economically with trucks where the road surface is unprepared, where  loading or unloading takes longer than the journey itself, or where the loads are too  small and distances too short to make trucking economical. For road haulage  buffaloes are generally shod: the shoes are flat plates fitted to each hoof.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Capacity for Work</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo is a sturdy draft animal Its body structure, especially the  distribution of body weight over the feet and legs, is an important advantage. Its  large boxy hooves allow it to move in the soft mud of rice fields. Moreover, the  buffalo has very flexible pastern and fetlock joints in the lower leg so that it can bend  back its hooves and step over obstacles more easily than cattle. This water-loving  animal is particularly well adapted to paddy farming because its legs withstand  continual wet conditions better than mules or oxen(Australian animal scientists working in Bogor, Indonesia, found that the puddling  effect of buffalo hooves on the soil was critical for rice cultivation in the local soils.  Tractors produced fields so porous that they drained dry. (Information supplied by  A. F. GurnettSmith.) On one research station near Darwin, Australia, buffaloes were  used to prevent water draining from a dam. (Information supplied by D. G. Tulloch.). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although buffaloes are preferred by farmers in the wet, often muddy lowlands of  Asia, mules, horses, and cattle move more rapidly and are preferred in the dryer  areas.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes do not work quickly. They plod along at about 3 km per hour. In  most parts of Southeast Asia they are worked about 5 hours a day and they may  take 6-10 days to plow, harrow, and grade one hectare of rice field. Their stamina  and drawing power increase with body weight.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because they have difficulty keeping cool in hot, humid weather (see next chapter),  it is necessary to let working buffaloes cool off, preferably in a wallow, every 2 hours  or so. Without this their body temperatures may rise to dangerous levels.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A pair of 3-year-old buffaloes costs about the same as a small tractor in Thailand.  But many farmers raise their own calves and there is no investment beyond labor.  The "fuel" for the animals comes mainly from village pastures and farm wastes such  as crop stubble and sugarcane tops. Buffaloes have an average working life of  about 11 years, but some work to age 20.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">  </P>
+<P ALIGN="JUSTIFY">Harness</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The yoke used on working buffalo in Asia has changed very little in the last 1,500 years. It is doubtful that a working buffalo can exert its full power with it. The hard wooden yoke presses on a very small area on top of the animal's neck, producing severe calluses, galls, and obvious discomfort. The harness tends to choke the animal as the straps under the neck tighten into the windpipe. Since the traditional hitch is usually higher than the buffalo's low center of gravity, the animal cannot pull efficiently. Considerably more pulling power and endurance can be obtained by improving the harness. The situation is not unlike that in Western agriculture in the twelfth century when the horse collar-one of the most important inventions of the Middle Ages first appeared. Before that, horses were yoked like buffalo and the harness passed across their windpipes and choked them as they pulled. Use of the horse collar improved pulling efficiency and speeded the development of transportation and trade.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The curved yoke now universally used on water buffalo contacts an area of the neck that is only about 200 cm2 (little more than half the size of this page). The entire load is pulled on this small area and causes the wood to dig into the flesh.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A horse collar is a padded leather device that encircles the animal's neck. One modified in Thailand for use on water buffalo (see page 43) had a contact area of 650 cm2, more than three times that of the yoke it replaced. The collar's padding pressed against the animal's shoulders, not its neck, and  therefore did not choke it. Attached to the collar were wooden hames with the traces for hitching the animal to a wagon or plow. In trials a buffalo pulled loads 24 percent heavier with the collar than with the yoke, and the horsepower it developed increased by 48 percent(These trials were conducted by J. K. Garner in Thailand in 1958. In the maximum-load test the yoked buffalo failed to move a load of 570 kg, but it moved a load of 640 kg when fitted with the horse collar. In an endurance test the yoked animal took 35 minutes to pull a load 550 m, but harnessed with the collar it took only 21 minutes). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another potentially valuable harness is the breast strap, a set of broad leather straps that pass over the animal's neck and back. One breast strap modified for water buffalo use had a contact area of 620 cm2, almost as much as that of the horse collar, and in trials the buffalo pulled a load 12 percent heavier than with a yoke and the horsepower it developed increased by almost 70 percent( The same animal used in the horse collar trials pulled 700 kg with the breast strap, in the endurance test it took 18.5 minutes to travel the 550-m distance). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These seem very good innovations. In the humid tropics, however, leather collars and breast straps may decay rapidly. To make them widely practical may require experimentation with, or development of, special leather treatments or more durable materials.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1974. The working buffalo. In: The Husbandry and Health of the Domes tic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1976. The Buffaloes of China. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">de Guzman, M. R., Jr. 1975. The water buffalo-Asia's beast of burden and key to progress. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Garner, J. K. 1958 (Reprint 1980) Increasing the Work Efficiency of the Water Buffalo Through Use of Improved Harness. (Copies available from Office of Agriculture, Development Support Bureau, Agency for International Development, Washington, D.C. 20523)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kamal, T. H., Shehata, O., and Elbanna, I. M. 1972. Isotope Studies on the Physiology of Domestic Animals. International Atomic Energy Agency, Vienna, Austria.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robinson, D. W. 1977. Preliminary Observations on the Productivity of Working Buffalo in Indonesia. Research Report No. 2, Center for Animal Research and Development, Bogor, Indonesia.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vaugh, M. 1945. Report on a detailed study of methods of yoking bullocks for agricultural work. Indian Journal of Veterinary Science 15:186-198.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ward, G. M., Sutherland, T. M., and Sutherland, J. M. 1980. Animals as an energy source in Third World agriculture. Science 208:570. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">5 Adaptability and Environmental Tolerance</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Heat Tolerance</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the buffalo is remarkably versatile, it has less physiological adaptation to extremes of heat and cold than the various breeds of cattle. Body temperatures of buffaloes are actually lower than those of cattle, but buffalo skin is usually black and heat absorbent and only sparsely protected by hair. Also, buffalo skin has one-sixth the density of sweat glands that cattle skin has, so buffaloes dissipate heat poorly by sweating. If worked or  driven excessively in the hot sun, a buffalo's body temperature, pulse rate, respiration rate, and general discomfort increase more quickly than those of cattle(Failure to appreciate this has caused many buffalo deaths in northern Australia when the animals were herded long distances through the heat of the day as if they were cattle).. This is particularly true of young calves and pregnant females. During one trial in Egypt 2 hours' exposure to sun caused temperatures of buffalo to rise 1.3°C, whereas temperatures of cattle rose only 0.2-0.3°C.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes prefer to cool off in a wallow rather than seek shade. They may wallow for up to 5 hours a day when temperatures and humidity are high. Immersed in water or mud, chewing with half-closed eyes, buffaloes are a picture of bliss.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In shade or in a wallow buffaloes cool off quickly, perhaps because a black skin rich in blood vessels conducts and radiates heat efficiently (Tests at the University of Florida have shown that buffaloes in the shade cool off more quickly than cattle. -Robey, 1976).  Nonetheless, wallowing is not essential. Experience in Australia, Trinidad, Florida, Malaysia, and elsewhere has shown that buffaloes grow normally without wallowing as long as adequate shade is available.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Cold Tolerance</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although generally associated with the humid tropics, buffaloes, as already noted, have been reared for centuries in temperate countries such as Italy, Greece, Yugoslavia, Bulgaria, Hungary, Romania, and in the Azerbaijan and Georgian republics of the USSR. In 1807 Napoleon brought Italian buffaloes to the Landes region of southwest France and released them near Mont-deMarsan. They became feral and multiplied prodigiously in the woods and dunes of the littoral, but unfortunately the local peasants found them easy targets, and with the fall of Napoleon the whole herd was killed for meat(In the twelfth century Benedictine monks introduced buffaloes from their possessions in the Orient to work the lands of their abbey at Auge in northeastern France. In the thirteenth century a herd was introduced to England by the Earl of Cornwall, the brother of Henry III. Nothing is known about how well either herd survived). Buffaloes are also maintained on the high, snowy plateaus of Turkey as well as in Afghanistan and the northern mountains of Pakistan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The buffalo has greater tolerance of cold weather than is commonly supposed. The current range of the buffalo extends as far north as 45° latitude in Romania and the sizable herds in Italy and the Soviet Union range over 40° N latitude(Philadelphia and Peking are at comparable latitudes. In the Southern Hemisphere the 40° line of latitude easily encompasses Cape Town, Buenos Aires, Melbourne, and most of New Zealand's North Island).  Cold winds and rapid drops in temperatures, however, appear to have caused illness, pneumonia, and sometimes death. Most of the animals in Europe are of the Mediterranean breed, but other River-type buffaloes (mainly Murrahs from India) have been introduced to Bulgaria and the Soviet Union, which indicates that River breeds, at least, have some cold tolerance.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Altitude</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although water buffaloes are generally reared at low elevations, a herd of Swamp buffaloes is thriving at Kandep in Papua New Guinea, 2,500 m above sea level. And in Nepal, River buffaloes are routinely found at or above 2,800 m altitude.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wetlands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are well adapted to swamps and to areas subject to flooding. They are at home in the marshes of southern Iraq and of the Amazon, the tidal plains near Darwin, Australia, the Pontine Marshes in south-central Italy, the Orinoco Basin of Venezuela, and other areas.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Amazon, buffaloes (Mediterranean and Swamp breeds) are demonstrating their exceptional adaptability to flood areas. Buffalo productivity outstrips that of cattle, with males reaching 400 kg in 30 months on a diet of native grasses( Information supplied by C. Nascimento). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The advantage of water buffaloes over Holstein, Brown Swiss, and Criollo cattle was demonstrated in a test at Delta Amacuro, Venezuela, when the cattle developed serious foot rot In the wet conditions of the Orinoco Delta and had to be withdrawn from the test. The area of Venezuela is flooded 6 months of the year and creates constant problems for cattle, yet the buffalo seems to adapt well(*Information supplied by A. Ferrer). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">High humidities seem to affect buffaloes less than cattle. In fact, if shade or wallows are available, buffaloes may be superior to cattle in humid areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In southern Brazil, trials comparing buffalo and cattle on subtropical riverine plains have favored the buffalo also. This work is being carried out on native pastures, mostly in  the State of Sao Paulo.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hafez, E. S. E., Badreldin, A. L., and Shafei,M. M. 1955. Skin structure of Egyptian buffaloes and cattle with particular reference to sweat glands. Journal of Agricultural Science, Cambridge 46:19-30.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Katyega, P. M. J., Masoud, A. J., and Kobo, E. 1980. Information on body and carcass characteristics of Egyptian water buffalo and Mpwapwa x Friesian steers raised in central Tanzania. Tanzania Veterinary Bulletin 2:86-90.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mason, I. L. 1974. Environmental physiology. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moran, J. B. 1973. Heat tolerance of Brahman cross, buffalo, Banteng and Shorthorn steers during exposure to sun and as a result of exercise. Australian Journal of Agricultural Research 24(5) :775 -782.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nair, P. G., and Benjamin, B. R. 1963. Studies on sweat glands in the Indian water buffalo. 1. Standardization of techniques and preliminary observations. Indian Journal of Veterinary Science 33:102.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pandey, M. D., and Roy, A. 1969a. Studies on the adaptability of buffaloes to tropical climate. I. Seasonal changes in the water and electrolyte status of buffalo cows. Indian Journal of Animal Science 39:367.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pandey, M. D., and Roy, A. 1969b. Studies on the adaptability of buffaloes to tropical climate. II. Seasonal changes in the body temperature, cardio-respiratory and hematological attributes in buffalo cows. Indian Journal of Animal Science 39:378.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prusty, J. N. 1973. Role of the sweat glands in heat regulation in the Indian water buffalo. Indian Journal of Animal Health 12(1):33-37.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robey, C. A., Jr. 1976. Physiological Responses of Water Buffalo to the Florida Environment. M.S. Thesis, University of Florida, Gainesville, Florida, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">6 Nutrition</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most buffaloes are located in countries where land, cultivated forage crops, and pastures  are limited. Livestock must feed on poor-quality forages, sometimes supplemented with  a little green fodder or byproducts from food, grain, and oil seed processing. Usually  feedstuffs are in such short supply that few animals have a balanced diet, but the buffalo  seems to perform fairly well under such adverse conditions.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Growth Rate</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Insufficient measurements have been taken to allow unequivocal state. meets about the  relative growth rates of cattle and buffaloes. However, many observations made in  various parts of the world indicate that the buffalo's growth is seldom inferior to that of  cattle breeds found in the same environments. Some observations are given below.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Trials in Trinidad in the early 1960s involved buffaloes grazing pangola grass (Digitaria  decumbens) together with Brahman and Jamaican Red cattle. Over a period of 20  months the buffaloes gained an average of 0.72 kg per day, whereas the cattle on a  comparable nearby pasture gained 0.63 per day(Experiments performed by P. N. Wilson. -Information supplied by S. P. Bennett.).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In the Orinoco Delta of Venezuela unselected Criollo/Zebu crossbred cattle gained  0-0.2 kg per day on Paspalum fasciculatum, whereas the water buffaloes with them  gained 0.25-0.4 kg per day(Cunha  et al., 1975).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In the Apure Valley of Venezuela, 100 buffalo steers studied in 1979 reached an  average weight of 508 kg in 30 months, whereas the 30-month old Zebu steers tested  with them weighed 320 kg. The feed consumed was a blend of native grasses (25  percent of the diet) and improved grasses (such as pangola, pare, and guinea grass)( Information supplied by A. Ferrer). In  the same valley 200 buffalo heifers (air freighted from Australia) produced weight gains  averaging 0.5 kg per day over a 2-year period (and 72 percent of them calved). Government statistics for the area record average weight gains in crossbreeds between Zebu and Criollo cattle as 0.28 kg per day (with 40 percent calving).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In the Philippines, buffaloes showed weight gains of 0.75-1.25 kg per day, the same as those of cattle. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Daily weight gains of over 1 kg have been recorded for buffaloes in Bulgaria and Yugoslavia.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Liveweight gains of 0.80 kg per day have been recorded for buffaloes in Papua New Guinea. In a very humid, swampy area of the Sepik River coastal plains liveweight gains by males averaged 0.47 kg per day and females 0.43 kg per day for more than a year. The average weight of 30 4-year-old female buffaloes was 375 kg, while the average weight of 4-year-old female Brahman/ Shorthorn crossbred cattle was 320 kg.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· At the research station near Belem in the Brazilian Amazon weaned Murrah buffaloes, pastured continuously on Echinochloa pyramidalis (a nutritious grass), gained 0.8 kg daily and reached 450 kg in about 18 months. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Liveweight gains of 0.74-l.i kg per day have been obtained in Australia. Buffalo steers grew as fast or faster than crossbred Brahman cattle on several improved pastures near Darwin, but on one very poor pasture, 40-year-old buffaloes each weighed only 400 kg, whereas the Brahman crossbred steers reared with them weighed 500 kg. The reason for this is not clear.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Efficiency of Digestion</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indian animal nutritionists have investigated water buffaloes intensively over the past two decades. Many have reported that buffaloes digest feeds more efficiently than do cattle, particularly when feeds are of poor quality and are high in cellulose.One trial revealed that the digestibility of wheat straw cellulose was 24.3 percent for cattle and 30.7 percent for buffalo. The figures for berseem (Trifolium alexandrinum) cellulose were 34.6 percent for cattle and 52.2 percent for buffalo. In another trial the digestion of straw fiber was 64.7 percent in cattle, 79.8 percent in buffalo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other nutrients reported to be more highly digested in buffaloes than in cattle (Zebu) are crude fat, calcium and phosphorus, and nonprotein nitrogen.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recent experiments in India suggest that buffaloes also are able to utilize nitrogen more efficiently than cattle. Buffaloes digested less crude protein than cattle in one trial but increased their body nitrogen more (and they were being fed only 40 percent of the recommended daily intake of crude protein).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ability of buffaloes to digest fiber efficiently may be partly due to the microorganisms in their rumen. Several Indian research teams have published data indicating that the microbes in the buffalo rumen convert feed into energy more efficiently than do those in cattle (as measured by the rate of production of volatile fatty acids in the rumen).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Also, in laboratory studies samples of buffalo rumen contents produced volatile fatty acids more quickly from a variety of animal feedstuffs than did samples from the rumen of cattle  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No single reason alone explains the buffalo's success in using poor quality forages. Rather, it is a combination of reasons that differ with the breed and conditions used. Studies by other researchers suggest that additional causes might include:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Higher dry matter intake; </P>
+<P ALIGN="JUSTIFY">· Longer retention of feed in digestive tract;  </P>
+<P ALIGN="JUSTIFY">· Ruminal characteristics more favorable to ammonia-nitrogen utilization;  </P>
+<P ALIGN="JUSTIFY">· Less depression of cellulose digestion by soluble carbohydrates (e.g., starch or molasses);  </P>
+<P ALIGN="JUSTIFY">· Superior ability to handle stressful environment; and  </P>
+<P ALIGN="JUSTIFY">· A wider range of grazing preferences.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Calf Growth Rates</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the buffalo's gestation period is more than a month longer than that of cattle, the calves are born weighing 35-40 kg, or about the same as that of a newborn Holstein calf. But because buffalo milk has about twice the butterfat of cow's milk, the calves grow very quickly. They also suffer more shock at weaning and have to be slowly changed to their new feeding program. Buffaloes can be marketed as full-grown animals for beef at the age of 2-3 years, sometimes even earlier.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p59.png"></center><br>
+ Table 5 Some Coarse Grasses and Forages Palatable to Buffaloes but Less Readily</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For example, in Indonesia it has been found that buffalo steers can be marketed 6 months before Zebu steers because they may be 100 kg heavier. In Egypt some buffalo calves given feed supplemented with concentrates weighed 360 kg at 1 year of age. At Ain Shams University near Cairo, buffalo calves weaned at 7-14 days of age gained 0.7 kg per day from weaning to slaughter at 18 months of age and weighed 400 kg. Rice straw comprised 50 percent of the finishing diet.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes on Italian farms have reached 350 kg in 15-18 months and some year-old calves weighed 320 kg. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grazing trials on native pasture (with mineral supplementation) in the Brazilian Amazon indicate that buffalo calves grew faster than cattle. At 2 years of age Mediterranean-type buffaloes averaged 369 kg, Swamp type, 322 kg, and Jafarabadi type, 308 kg. The Zebu cattle tested with them averaged 265 kg and the crossbred Zebu/Charolais, 282 kg. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Feed Preferences</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes graze a wider range of plants than cattle. During floods near Manaus in the  Brazilian Amazon when cattle become marooned on small patches of high ground,  many suffer from foot rot and many starve to death. Their buffalo companions on the  other hand-bodies sleek and full-swim out to islands of floating aquatic plants and eat  them, treading water. Also, they dive almost 2 m to graze beneath the floodwaters. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">University of Florida buffaloes in a lakefront voluntarily consumed vines, sedges, rushes, floating aquatic weeds, and the leaves and shoots of willows and other  trees along the water's edge. Few of these plants are voluntarily grazed by cattle. In  northern Australia water buffaloes graze the very pickily leaves of pandanus; they also  graze sedges, reeds, floating grass, and aquatic weeds. Hungry buffaloes will eat bark,  twigs, and other unpalatable vegetation.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of the variety of their tastes they have been used in northern Queensland,  Australia, to clear pastures of woody weeds left untouched by cattle. In some countries  cattle are used to graze the palatable tops of pasture plants and are followed by  buffaloes to graze the less desirable lower parts.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Afifi, Y. A., El-Koussy, H. A., El-Khishen, S. S., and El-Ashry, M. A. 1977. Production of  meat from Egyptian buffaloes. I. The effect of using different sources of roughages on  rate of gain, gross and net efficiency during the growth and finishing periods. Egyptian  Journal of Animal Production 17(2).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appleton, D. c., Dryden, G., and Kondos, A. C. 1976. A comparison of the digestive  efficiency of the water buffalo and the Brahman and Banteng cattle. Proceedings of the  Australian Society of Animal Production 11.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhatia, L S. 1967. The Study of Factors Affecting the Utilization of Low Grade  Roughages and Production of Volatile Fatty Acids in the Rumen of Indian Cattle. Punjab  Agricultural University, Ludhiana, India.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chalmers, M. 1.1974. Nutrition. In: The Husbandry and Health of the Domestic Buffalo  edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations Rome,  Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Charles, D. D., and Johnson, E. R. 1975. Live weight gains and carcass composition of  buffalo (Bubalus bubalis) steers on four feeding regimes. Australian Journal of  Agricultural Research 26:407-413.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chaturvedi, M. L, Singh, u. B., and Ranjhan, 5. K 1973. Comparative studies on the  efficiency of feed unitization in cattle and buffaloes. Indian Journal of Animal Science  43(12):1034.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chutikul, K. 1975. Ruminant (Buffalo) nutrition. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kacn, Thailand, March 31April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cunha, E., Alvarez, F., Larez, O., and Bryan, W. B. 1975. Pasture and Livestock Investigations in the Humid Tropics: Orinoco Delta, Venezuela. 4. Beef Cattle and Water Buffalo Grazing Trials with Native and Introduced Grasses. IRI Research Institute, New York, New York, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Davendra, C. 1979. The potential value of grasses and crop by-products for feeding buffaloes in Asia. Extension Bulletin No. 126. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">de Guzman, M. R., Jr. 1975. A summary of research into buffalo feeding in the Philippines. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dunkel, R. 1981. Animal production using nutrient-deficient fodders in the tropics and subtropics. Animal Research and Development 13:32-39.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">El-Ashry, M. A., Mogawer, H. H., and Kishin, S. S. 1972. Comparative study of meat production from cattle and buffalo male calves. I. Effect of roughage: concentrate ratio in ration for rate of gain and feed efficiency of native cattle, Friesian and buffalo calves. Egyptian Journal of Animal Production 12(2) :99 -107.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Grant, R. J., Van Soest, P. J., McDowell, R. E., and Perez, C. B. 1974. Intake, digestibility and metabolic loss of Napier grass by cattle and buffaloes when fed wilted, chopped and whole. Journal of Animal Science 39(2):423.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ibrovic, M., Cvetkovic, A., Smrcek, A., and Janevski, K. 1972. A contribution to the knowledge of metabolism of carotene and seasonal dynamics of vitamin A in the buffalo. Veterinaria 21(4) :511.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., Makkar, G. S., Sidhu, G. S., and Moxin, A. L. 1962. Cellulose digestion in water buffaloes and Zebu cattle. Journal of Animal Science 21:1001.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., and Sidhu, G. S. 1966. Effect of urea on the voluntary intake of wheat skew in Zebu cattle and the buffalo. Indian Veterinary Journal 43:880-886.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., Makkar, G. S., and Sidhu, G. S. 1969. Biochemical processes in the rumen. 111. Effect of different carbobydrates on in vitro digestion of cellulose and utilization of urea nikogen by rumen micro-organisms from zebu and buffalo. Indian Journal of Animal Science 39 :27-32.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani J. S., Makkar, G. S., and Sidhu, G. S. 1971a. Studies on the biochemical process in the rumen. Vl. In vivo digestion of cellulose in buffalo and cattle. Indian Veterinary Journal 48:267-271.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., Makkar, G. S., and Sidhu, G. S. 1971b. Studies on the biochemical process in the rumen. VII. In vitro digestion of cellulose in cattle and buffalo. Indian Veterinary Journal 48:583-586.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., Makkar, G. S., and Sidhu, G. S. 1972. Studies on the biochemical processes in the rumen. VIIL The significance of molar proportions of acetic and propionic acids in the rumen on the growth rate of buffalo and Zebu. Indian Veterinary Journal 49:995-1000.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ichhponani, J. S., Gill, R. S., Makkar, G. S., and Ranjan, S. K. 1977. Work done on buffalo nutrition in India-a review. Indian Journal of Dairy Science 30(3): 173-191.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Langar, P. N., Sidhu, G. S., and Bhatia, I. S. 1969. Utilization of nitrogen and production of volatile fatty acids in the rumina of buffalo (Bos bubalis) and zebu (Bos indicus) at different time intervals, under a feeding regimen deficient in carbohydrates. Indian Veterinary Journal 46:593-598.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ludri, R. S., and Razdan, M. N. 1975. Effect of level and source of dietary nitrogen on water metabolism in cows and buffaloes. Indian Journal of Dairy Science 28:107109.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ludri, R. S., and Razdan, M. N. 1980. Efficiency of nitrogen utilization by Zebu cows and buffaloes. I. Nutrient utilization and nitrogen balances on preformed protein diets. TropicalAgriculture (Trinidad) 57:83-90. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Makkar, G. S., and Sidhu, G. S. 1964. The fractionation of carbohydrates in Indian feedstuffs and the digestion of different fractions in the rumina of cattle and buffalo. Journal of Research, Ludhiana 1:56-66.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Misra, R. K., and Ranhoka, G. S. 1969. Influence of energy levels on the utilization of peanut protein-urea nikogen by cattle and buffalo. Journal of Animal Science 28: 107-109.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mullick, D. N. 1964. Review of the investigations on the physiology of Indian buffaloes. Indian Journal of Dairy Saience 17:45-50.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Naga, M. A., El-Shazly, K., Deif, H. I., Abaza, M. A., and El-Faham, R. H. 1975. Relationship between nitrogen balance, digested nitrogen and dry matter digestibility in ruminants. Journal of Animal Science 40(2):366-373.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nangia, O. P., Aggarwal, V. K., and Singh, A. 1972. Studies on the utilization of dietary protein in cattle and buffaloes. Indian Joumal of Dairy &amp;ience 25: 1-5.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nascimento C. N. B., Moura Carvalho, L. O. D., and Lourenco, J. B. 1979. Importdneia do Bufaio para a Pecubria Brasileira. Agricultural Research Center for Humid Tropics (CPATU), Belem, Para, Brazil.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nascimento, C. N. B., and Velga, J. B. 1973. Weight gains in stabled buffaloes of the Mediterranean breed. Boletim Tecnico do Instituto de Pesqutsas e Experimentacao Agropecuarias do Norte 58:24-72.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ponnappa, G. G., Nooruddin, M. D., and Raghavan, G. V. 1971. Rate of the passage of food and its relation to digestibility of nutrients in Murrah buffaloes and Hariana cattle. Indian Journal of Animal Science 41:1026-1030.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Punj, M. L., Kochar, A. S., Bhatia, I. S., and Sidhu, G. S. 1968. In vitro studies on the cellulolytic activity and production of volatile fatty acids by the inocula obtained from the rumen of Zebu cattle and Murrah buffalo on different feeding regimens. Indian Journal of Veterinary Science 38 :325-332.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raghavan, G. V., Kakkar, B., Rao, M. V. N., and Mullick, D. N. 1963. Effects of air temperature and humidity on the metabolism of food nutrients in cattle and buffalo bulls. Annals of Biochemistry and Experimental Medicine 23 :23-28.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ray, S. N., and Mudgal, V. D. 1962. Rumen metabolism studies in cattle and buffalo. Proceedings of the 16th International Dairy Congress, Copenhagen. A:105-l11.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sahai, L., Johri, P. N., and Kehar, N. D. 1955. Effect of feeding alkali and water-treated cereal straws on milk yield. Indfan Journal of Veterinary Science 25:201-212.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Saini, B. S., and Ray, S. N. 1964. Comparative utilization of coarse fodders in cattle and buffalo. Annual Report of the National Dairy Research Institute, Karnal, India.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schottler, J. H., Boromana, A., and Williams, W. T. 1977. Comparative performance of cattle and buffalo on the Sepik Plains, Papua New Guinea.AustralianJournal of Experimental Agriculture and Animal Husbandry 17(87) :550 -554. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sebastian, L., Mudgal, V. D., and Nair, P. G. 1970. Comparative efficiency of milk production by Sahiwal cattle and Murrah buffalo. Joumal of Animal Science 30:253256.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sharma, C. B., and Mugdal, V. D. 1966. Studies on the lignin and cellulose contents of fedder crops and effect of lignification of cellulose digestion. Indian Journal of Dairy Science 19:100.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sidbu, G. S., Kochar, A. S., and Makkar, G. S. 1967. Effect of supplementing Bajra stalks with lucerne and concentrates and their part replacement by urea on the production of volatile fatty acids in the rumen of cows and buffaloes. Journal of Research, Ludhiana 4:104-110.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, B. K., and Mudgal, V. D. 1967. The comparative utilization of feed nutrients from lucerne hay in buffalo and crossbred zebu heifers. Indian Journal of Dairy Science 20: 142-145.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tandon, R. N.' Sharma, D. D., and Mugdal, V. D. 1972. Effect of feeding urea with different levels of energy on the biochemical changes in the rumen of cows and buffaloes. Indian Journal of Animal Science 42: 174-179  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Upadhyaya, R. S., Singh, U. B., and Ranjhan, S. K. 19i3. Digestibilit of nutrients and VFA concentation in zebu cattle and buffalo calves fed on green cowpea and maize. Indian Journal of Animal Science 43 :5 83-s 88.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Verma, M. L., Sidhu, G. S., and Kochar, A. S. 1968. Effect of frequency on the production of VFA in the rumen by zebu cattle and buffalo. Journal of Research, Ludhiana 5(3) :1 -6.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Verma, M. L., Singh, N., Sidhu, G. S., Kochar, A. S., and Bhatia, I. S. 1970. The in vitro cellulose digestion and VFA production from some of the common Indian feeds using rumen inocula from Zebu cattle and buffalo. Indian Journal of Dairy Science 23:155 -160. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">7 Health</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When compared with other domestic livestock, the water buffalo generally is a healthy animal. This is particularly impressive because most of them live in hot, humid regions that are conducive to disease, and the buffalo is a bovine susceptible to most diseases and parasites that afflict cattle. Although the reasons are not specifically known, the effect of disease on the buffalo and its productivity is often less deleterious than on cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antibiotics and vaccines developed for cattle work equally well on buffaloes. As a result, treatments are available for most of the serious diseases of buffaloes, although some are not very effective for either animal.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The greatest buffalo losses are often among calves. Newborn buffalo calves, like bovine calves, can succumb in large numbers to viruses, bacteria, and poor nutrition. This is largely due to poor management during the calf's frst 2 months of life. For example, as noted previously, villagers in some countries often sell the valuable buffalo milk, thus depriving the calves.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo calf losses are often similar to those of the cattle around them, but the animal's proclivity for wallowing exposes calves to waterborne diseases. Further, a young one occasionally drowns when an adult rolls on top of it.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reactions to some specific diseases and parasites are discussed below.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pasteurellosis- Probably the water buffalo's most serious disease, pasteurellosis, or hemorrhagic septicemia, is caused by the bacterium Pasteurella multocida (P. septica). Buffaloes are more susceptible to it than cattle and die in large numbers where pasteurellosis occurs. A vaccine against pasteurellosis is effective in protecting both buffaloes and cattle; it is cheap and easily made.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tuberculosis- Despite some claims to the contrary, the water buffalo is susceptible to the bovine strain of tuberculosis (Alycobacterium bovis). Scattered reports from different parts of India indicate no difference in the incidence of infection between cattle and buffaloes(Information supplied by S. K. Misra, Department of Veterinary Medicine, Punjab Agricultural University, Ludhiana, Punjab, India).  Other strains of mycobacteria have been isolated from feral buffaloes and cattle in northern Australia but seem to have little effect on the animals. Tuberculosis occurs among the buffalo herds of the world only because most are kept under unsanitary conditions(In 1905 buffaloes were introduced to Trinidad because the cattle herds (Zebu and srahman breeds) were infected with tuberculosis and, in those days, it was thought that buffaloes were resistant to the disease. Most were housed in muddy, ill-kept pens and forced to eat sugarcane tops off the ground; consequently, in 1949 over 30 percent of the buffaloes reacted to the tuberculin test. (The cattle herds had 80 percent reactors.) Tuberculosis was eliminated in Trinidad's buffaloes by improving the sanitary conditions: installing concrete floors and mangers and cleaning the pens regularly. This, together with regular tuberculin testing and removal of reactors, led to such a dramatic improvement that buffalo tuberculosis is now virtually unknown. -Information supplied by S. K. Bennett.) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brucellosis-Buffaloes and cattle are equally susceptible to brucellosis. Although seldom reported as a problem elsewhere, brucellosis in Venezuela is increasing more rapidly among buffaloes than among cattle. In India the disease is no more prevalent among buffaloes than among cattle.  As many as 57 percent of some Venezuelan herds are infected with the disease. It is a frequent cause of abortion in buffaloes. Serologic procedures and measures developed for the control of the disease in cattle are also effective means of curbing this infection in buffaloes. (Consumption of raw milk or contact with aborted fetuses may cause undulant fever in humans.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mastitis- Among milking buffaloes mastitis is a problem as it is in dairy cows, but to a lesser extent. It is likely to increase, however, as the milk production per individual buffalo is increased. The bacteria that cause mastitis in the buffalo are similar to those in cattle. Treatment and control programs used for cattle are equally effective for buffaloes.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Diseases -Among the epizootic diseases, rinderpest and piroplasmosis seem to affect buffaloes as much as cattle. Foot-and-mouth disease also affects buffaloes, but to a lesser degree than cattle, producing smaller lesions and having a lower incidence. In northern Australia buffaloes deliberately infected with bovine pleuropneumonia bacteria exhibited slight fever, but the disease never appeared. No naturally occurring eases have been reported in buffaloes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ticks -Buffaloes are notably resistant, although not immune, to ticks. In a tick-infested area of northern Australia only 2 engorged female ticks were found on 13 adult buffaloes during a 2-year test. Accordingly, healthy buffaloes are not commonly affected by diseases borne by ticks nor are the hides damaged by their bites. Since ticks are rarely found on buffaloes, anaplasmosis, theileriasis, and babesiosis, which are tick-borne, have little effect on buffaloes in the field. (Buffaloes and cattle are equally susceptible, however, if inoculated with East Coast fever, a form of theileriasis.) This is important because tick infestations in cattle are particularly troublesome in the tropics and the pesticides used to control them are becoming ineffective as the ticks develop resistance. The pesticides are also becoming expensive.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The basis of the buffalo's tick resistance is not known, but wallowing and rubbing may play a role in it; animals kept in experimental concrete pens in Australia have developed heavy tick infestation. (rials carried out on Magnetic Island by R. H. V/harton, Commonwealth Scientiflc and Industrial Research Organisation, Townsville, Queensland, Australia). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p68to69.png"></center><br>
+ Table 6 Some Infections and Parasites of Buffalo</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Screwworm- Larvae of the screwworm fly (Callitroge species), a major pest of livestock in Central and South America and some other tropical areas, do not affect adult water buffalo. In Venezuelan areas where cattle (Zebu type) are severely infested, adult water buffaloes are virtually free of screwworm larvae and the umbilicus of newborn calves seldom if ever becomes infected. ( Information supplied by A. Ferrer). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The same is true in Papua New Guinea. It is thought that the mud plaster produced by wallowing suffocates the larvae, but in India screwworms do not affect water buffaloes either, and there they wallow in fairly clear water and the farmer usually washes them off. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Roundworm- The heavy losses of young buffalo calves throughout the world are caused, in large measure, by the roundworm Toxocara vitulorum. The calves seem more susceptible than mature animals and they become infected before birth or within 24 hours after birth through the mother's colostrum. The roundworm is the most serious buffalo parasite and in untreated calves the small intestine can get packed with worms to the point of complete occlusion. Although huge numbers of calves die each year, anthelmintic drugs that control roundworms are highly effective and widely available.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The adult water buffalo appears to have a high degree of resistance to strongyloid nematodes. Being such excellent converters of rough fodders they do not suffer the nutritional deficiency and the resulting liability to these roundworms experienced seasonally by cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Liver Fluke- During wallowing, water buffaloes can easily become infected with the waterborne infective stages of liver fluke (Fasciola gigantica). Although the number of flukes in a buffalo may be phenomenally high, no clinical signs of the disease are usually evident. It seems likely that the resulting liver damage reduces the growth and the work and milk production of buffaloes more than is generally appreciated.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trypanosomiasis- The water buffalo is susceptible to trypanosomiasis and is reportedly more susceptible than cattle to Trypanosoma evansi.Experience with the animal in Africa is limited, but trypanosomiasis may be the reason why Egypt is the only African country that has traditionally employed water buffalo.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Parasites- The wallow and its resulting mud cake seem to protect water buffalo from many biting flies, but the main ectoparasite in Australia and Southeast Asia is the buffalo fly (Siphona spp.). Pediculosis, caused by the sucking louse (Hematopinus tuberculatus), occurs widely among buffalo, and sarcoptic mange (Sarcoptes scabiei var. bubalus) is a serious disease, especially among calves and during dry seasons when wallowing opportunities are restricted. The lung worm Dictyocaulus ririparus thrives in warm, humid areas and sometimes infects buffaloes heavily, although its outward manifestations are rare.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Barlow, J. N. 1977. Toxicology and safety evaluation of Phosvel to Egyptian water buffalo. Pages 517-522 in: Pesticide Management and Insecticide Resistance, edited by D. L. Watson and A. W. A. Brown. Academic Press, New York, New York, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhowmik, M. K., and Iyer, P. K. R. 1977. Studies on the pathology of chronic lesions in the mammary glands of buffaloes (Bubalus bubalis). 1. Actinomycosis, nocardiosis and lesions simulating tuberculosis. Indian Veterinary Journal 54(5):342-346.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhowmik, M. K., Singh, S. P., and Iyer, P. K. R. 1977. Studies on chronic mastisis in buffaloes (Bubalus bubalis). lndian Journal of Animal Health 16(2) :157-160.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1974. Aspects of disease. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. Cockrill, Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dhar, S., Bhattacharyulu, Y., and Gautam, O. P. 1973. Susceptibility of Indian water buffalo (Bubalus bubalis) to Theileria annulata infection. Haryana Agricultural University Journal of Research 3(1):27-30.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dwivedi, S. K., Mallick, K. P., and Malhotra, M. N. 1979. Babesiosis: clinical cases in Indian water buffaloes. Indian Veterinary Journal 56(4):333-335.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Griffiths, R. B. 1974. Parasites and parasitic diseases. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hafez, S. M., and Krauss, H. 1979. Detection of antibodies against some respiratory pathogens in the sera of domestic animals in Egypt. Bulletin of Animal Health and Production in Africa 27(3):209-214.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ho, T. M. 1976. Animal disease control program in Republic of China for better animal production. Korean Journal of Animal Science 18(4):317-321.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iannelli, D. 1978. Water buffalo (Bubalus bubalis Arnee) allotypes: identification of a multiple allelic system. Animal Blood Groups and Biochemical Genetics 9(2):105113.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kapur, M. P., and Singh, R. P. 1977. Diagnosis of mastitis: a comparative study of four indirect tests.Haryana Veterinarian 16(2):69-73.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Leue, A. 1971. Buffaloes in Nepal. Tierartliche Umschau 26(4):173-178.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mohan, R. N. 1968. Diseases and parasites of buffaloes. I. Viral, mycoplasmal, and rickettsial diseases. II. Bacterial and fungal diseases. III. Parasitic and miscellaneous diseases. Veterinary Bulletin 38:567-576, 647-659, 735-756.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Murthy, D. K., and Sharma, S. K. 1974. Studies on reactivity and immunogenecity of cell-culture rinderpest vaccine in different species of ruminants. Indian Journal of Animal Science 44(6):359-365.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">San Agustin, F. 1973. Important diseases and parasites of Carabaos. Philippine Journal of Nutrition 26(2):68-79.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schneider, C. R., Kitikoon, V., Sornmani, S., and Thiachantra, S. 1975. Mekong schistosomiasis. III. A parasitological survey of domestic water buffalo (Bubalus bubalis) on Khong Island, Laos. Annals of Tropical Medicine and Parasitology 69(2):227-232.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sharma, K. N. S., Jain, D. K,, and Noble, D. 1975. Calf mortality in pure and crossbred Zebu cattle and Murrah buffaloes reared artificially from birth. Animal Production 20(2):207-211.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sharma, S. K., Banegee, D. P., and Gautam, O. P. 1978. Anaplasma marginale infection in Indian water buffalo (Bubalus bubalis). Indian Journal of Animal Health 17(2): 105-110.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shaw, J. J., and Lainson, R. 1972. Trypanosoma vivax in Brazil. Annals of Tropical Medicine and Parasitology 66(1):25-32.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shukla, R. R., and Singh, G. 1972. Studies on tuberculosis amongst Indian buffaloes. Indian Veterinary Journal 49(2):119-123.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Soni, J. L. 1978. Suitability of different serological tests for diagnosis of brucellosis in buffaloes (Bubalus bubalis). Indian Journal of Animal Science 48(12) :873-881. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tantawi, H. H., Fayed, A. A., Shalaby, M. A., and Skalinsky, E. I. 1979. Isolation, cultivation and characterization of poxviruses from Egyptian water buffaloes .Journal of the Egyptian Veterinary Medical Association 37(4):15-23.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thomson, D. 1977. Diseases of water buffalo in the Northern Territory of Australia. Australian Veterinary Practioner 7(1):50-52.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young, P. L. 1979. Infection of water buffalo (Bubalus bubalis) with bovine ephemeral fever virus. Australian Veterinary Journal 55(7):349-350. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">8 Reproduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo has a reputation for being a sluggish breeder, but the average animal is so poorly fed that its reproductive performance is unrepresentative of its capabilities. Without reasonable nutrition the animals cannot reach puberty as early in life or reproduce as regularly as their physiology or genetic capability would normally allow.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Actually, adequately nourished buffaloes reach puberty at about the same age as cattle, as early as 18 months of age in buffalo bulls. In northern Australia Swamp females have conceived even as early as 14 months of age and feral buffaloes routinely conceive at 16 months of age. In the herd at Punjab Agricultural University in Ludhiana, India, 11 River buffalo heifers showed estrus at ages less than 18.5 months and a few came into heat when less than 15 months old. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo also can calve at an age comparable to that of cattle. At the Ain Shams University in Egypt a well-fed Egyptian buffalo herd of several hundred animals has an average age at first calving of 27 months, 22 days(Information supplied by M. El Ashry. Because of nutritional uncertainties, El Ashry and his colleagues believe that body weight is a better indicator of sexual preparedness than age is. These researchers at Ain Shams University recommend mating heifers when they weigh 365 kg no matter what their age. Research at Punjab Agricultural University shows that buffalo heifers can be bred when they weigh over 270 kg and manifest estrus).Most animals in the Punjab Agricultural University River buffalo herd calved before 35 months, one at 28.3 months.! In one Venezuelan herd almost all heifers 20-24 months old were pregnant; virtually all calved before age 38 months, most by 30 months, and one at age 23 months. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In trials in Queensland, Australia, and in Papua New Guinea buffaloes produced more calves over a 3-year period than the cattle tested with them. In the hot, humid Sepik Plains in northern Papua New Guinea it was noticed that female buffaloes (Swamp breed) came into estrus even while they were losing weight because of inadequate nutrition, whereas cattle did not. Under these stressful conditions the buffalo calves also reached sexual maturity earlier and the buffaloes had a higher calving percentage and a shorter calving interval because they came back into estrus more quickly than cattle(Information supplied by J. Schottler. The age at first calving of more than 60 nutritionally poor buffaloes was 38 months in one herd and 45 months for Brahman cross cattle) . Similar observations have been made in Florida, Trinidad, the Brazilian Amazon, Venezuela, and elsewhere. Although these are exceptions to the normal observations in Asia, where buffaloes seem to breed more slowly than cattle, they do demonstrate the buffalo's potential for improved breeding.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Estrus in buffalo cows usually lasts about 24 hours, but duration varies and may range from 11 to 72 hours. It occurs on an average 21-day cycle. Determination of when a cow is in estrus is difficult because often the animal shows few outward signs of "heat." This increases the chances of missing a cycle, especially for artificial insemination. Unclean surroundings, poor nutrition, and poor management, cause a high death rate among calves; this also contributes to the buffalo's often low reproductive rate.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In many areas, calving is seasonal. This seems to be largely due to changes in nutrition. It may also be caused by heat stress, in either males or females, which results in a low breeding rate during the hot season. However, when buffalo cows are well fed, they come into estrus and will breed in any season.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many matings take place at night and are therefore unobserved. In one set of pregnancy diagnoses in northern Australia, the buffalo's conception rate (81 percent) was higher than that of the Brahman crossbreeds (70 percent) they were with. In India, artificial insemination of water buffaloes began in the late 1950s. Deep-frozen semen is now available and its use is spreading. Overall conception rates of 70-80 percent are obtained. It is estimated that some 100,000 buffaloes are now being artificially inseminated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo's gestation period is about one month longer and is more variable than that of cattle. Whereas cattle give birth after about 280 days (Angus, 279, Holstein, 279-280, Brown Swiss, 286), buffaloes take 300334 days (average 310) or roughly 10 months and 10 days (differences between breeds are unknown). In Punjab, India, River buffaloes have been observed to come into estrus as early as 40 days after calving. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nonetheless, only under uncommon circumstances can a buffalo cow produce a calf each year. In one herd of 800 cows in Venezuela the average female buffalo over age 4 produces 2 calves every 3 years. In response to a recent questionnaire, the majority of Indonesian farmers estimated that the calving rate was between 3 and 4 calves in 5 years. A few claimed a calf a year, some only 1 or 2 calves In 5 years. In Florida it has been noted that some buffalo cows having just calved became pregnant more quickly than cattle, so that a calf may indeed be produced each year. Regular yearly breeding has been noted also in northern Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The incidence of abortion, dystocia, retained placenta, and other parturition problems in buffaloes is similar to that in cattle. Twinning is very rare; probably no more than 0.01 percent of buffalo pregnancies produce twins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Preliminary results in northern Australia indicate that weaning can be carried out as late as 12 months of age without any effect on conception time of the buffalo dam.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bhattacharya, P. 1974. Reproduction. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chauhan, F. S., Singh, N., and Singh, M. 1977. Involution of uterus and cervix in buffaloes. Indian Journal of Dairy Science 30(4):286-291.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eusibio, A. N. 1975. Breeding, management and feeding practices of buffaloes in the Philippines. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FAO Animal Production and Health Paper. 1979. Buffalo Reproduction and Artificial Insemination. Proceedings of the Seminar Sponsored by FAO/SIDA/Government of India, held at National Dairy Research Institute, Karnal, 132001-India, December 4-15, 1978. Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghanem, Y. S. 1955a. Environmental causes of variation in the length of gestation of buffaloes. Indian Journal of Veterinary Science 25 :301-311.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghanem, Y. S. 1955b. Genetic causes of variation in the length of gestation of buffaloes. Indian Journal of Veterinary Science 25:307-311.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Health, E., and Gupta, R. 1976. Ultrastructure of water buffalo (Bos bubalis) spermatozoa. Zentralblatt fuer Veterinaerrnedizin 23(2):106-120.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Liu, C. H. 1978. The preliminary results of crossbreeding of buffaloes in China. Research Institute for Animal Science of Kwangsi, People's Republic of China.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Matharoo, J. S., and Singh, M. 1980. Revivability of buffalo spermatozoa after deepfreezing the semen using various extenders. Zentralblatt fuer Veterinaermedizin 27(5): 385-391.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rao, A. V. N., Murthy, T. S., and Dutt, K. L. 1979. Effect of lunar cyclicity on oestrus rhythmicity in the Indian water buffalo. Livestock Advisor 4(7):29-30.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rawal, C. V. S. 1978. A study on correlations of weight of pituitary gland and reproductive organs in males of Indian water buffalo. Indian Journal of Heredity 10(3):11-12.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robinson, D. W. 1977. Livestock in Indonesia. Research Report No. 1. Centre for Animal Research and Development, Bogor, Indonesia. (In English and Indonesian.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Roy, A. 1974. Observations on the physiology of reproduction. In: The Husbandry and Health of the Domestic Buffalo, edited by W. R. CockrilL Food and Agriculture Organization of the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sahai, R., and Singhal, R. A. 1977. The sex chromatin profile of water buffaloes of Murrah breed. Indian Journal of Animal &amp;Science 11(2):63-67.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sharma, A. 1978. Studies on the process of spermatogenesis and epididymal sperm reserve in water buffalo (Bubalus bubalis). Thesis Abstracts, Haryana Agricultural University 4(4):331.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, M., Matharoo, J. S., and Chauhan, F. S. 1980. Preliminary fertility results with frozen buffalo semen in Tris extender. Theriogenology 13(3):191-194.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singh, N., Chauhan, F. S., and Singh, M. 1979. Postpartum ovarian activity and fertility in buffaloes. Indian Journal of Dairy Sefence 32(2): 134-139.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sunkaporn Ratanadilok Na Puket. 1975. The improvement of buffalo production through breeding and management under Thailand conditions. In: Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Takkar, P. O., Chauhan, F. S., Tiwana, M. S., and Singh, M. 1979. Breeding behaviour of buffalo cows. Indian Veterinary Journal 56: 168-172.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Toelihere, M. R. 1975. Physiology of reproduction and artificial insemination of water buffaloes. In: The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1968. Incidence of calving and birth weights of domesticated buffalo in the Northern Territory. Proceedings of the Australian Society for Animal Productlon 7: 144-147.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1979. The water buffalo in Australia: reproductive and parent-offspring behaviour of buffalo. Australian Wildlife Research 6:265-287. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">9 Management</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are adaptable and are managed in many ways. In general, they are raised like cattle. But in some operations they must be handled differently. This chapter highlights these differences.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Millions of water buffaloes are managed in "backyards" in Asia. They exist on the resources of small holdings. Management and expenditures are minimal. Care of the family buffalo is usually entrusted to children, old people, or women not engaged in other farm duties; the buffalo allows them to be useful and productive.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The buffalo fits the resources available on the farm, but it is also an urban animal. Thousands of herds of 2-20 buffaloes may be found in the cities and towns of India, Pakistan, and Egypt-all fed, managed, and milked in the streets.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, the buffalo has important qualities as a feedlot animal; it can be herded and handled with relative ease because of its placid nature. The Anand Cooperative in India's Gujarat State, which daily contributes thousands of gallons of milk to Operation Flood (the world's largest nutrition project), involves more than 150,000 Surti buffaloes that are fed, managed, and milked by their owners under feedlot-like conditions in their villages. Many of Italy's 100,000 buffaloes are maintained under similar conditions.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes can also be managed on rangelands. In Brazil, Venezuela, Trinidad, the United States, Australia, Papua New Guinea, Malaysia, Indonesia, the Philippines, and elsewhere there is rising interest in raising buffalo beef on the range. The production practices for raising them are similar to those used for range cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes in the humid tropics must be able to cool off. Shade trees are desirable, and although a wallow is not essential, it is probably the most effective way the animal has of coping with heat. Alternatively, water showers may be provided to wet down the animals 3-5 times during the hottest part of the day.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are intelligent animals. Young ones learn patterns quickly and often are reluctant to change their habits. Feral animals-even those born in the wild-tame down after a week or two in a fenced enclosure to the point where many can be handled, haltered, and hand fed(In one example, loo feral buffalo were captured in Northern Territory, Australia. With in 14 days all the animals-males and females, young and old-had become docile and amenable to handling. -Information supplied by D. G. Tulloch) . Among feral herds of northern Australia it has been observed that buffaloes have clans and families. A female calf seems to remain with its family and mother for many years (possibly for life). A male calf stays until it is about 2 years old, when it is driven from the group by an adult bull. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It has also been noted in northern Australia that free-ranging buffaloes instinctively select clean water areas to drink from, other areas to wallow in, and still others as "toilet areas." In addition, China's buffaloes reportedly are being "toilet trained" to defecate only at specific sites to avoid contaminating waterways with schistosome eggs.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another interesting observation from northern Australia is that most buffalo dams readily adopt a calf that has been orphaned by the death of its mother. In fact, females will allow several calves to nurse (including calves of other mothers and sometimes even adults).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes are also self-reliant. For several months each year in Vietnam and Malaysia, for instance, they are turned loose in the forests to fend for themselves.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Provision of adequate fencing is one of the great problems of buffalo management. The  animals have strong survival instincts and if feed runs short, such as in the dry season,  they will break through fences that would deter cattle who would remain and starve. They  will also break through fences if their family unit is split up. Barriers must be stronger  than those used for cattle and the wires closer together and lower to the ground because  buffaloes lift fences up with their horns rather than trample them down. In northern  Australia, Papua New Guinea, and Costa Rica it has been found that buffaloes are  particularly sensitive to electric fences (a single wire is all that is needed), and in Brazil a  special suspension fence has been devised(Moura Carvalho et al., 1979). Both of these  seem to be cheap and efficient answers to the fencing problem.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are easily handled from horseback and easily worked through a corral.  Actually, because of their docility they can be mustered on foot, even on ranges where  cattle require horses. Unless they come from different areas they tend to herd together  and can be mustered like sheep.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the major management adjustments to be made by cattlemen is understanding  and capitalizing on the buffalo's placid nature. Buffaloes are naturally timid and startle  easily; they must be handled quietly and calmly. Rough handling, wild riding, and loud  shouting make handling them more difficult and training them much harder.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Village buffaloes are led and managed by a ring threaded through the septum between  the nostrils. The technique is frequently applied crudely and cruelly, often resulting in a  ripped septum.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The identification of individual buffaloes is difficult. Fire brands do not remain legible on  the skin for long. Cryobranding (freeze branding) is more durable. Most types of ear tags  are not very successful; the numbers wear off and mud covers up the tag's color. In  northern Australia ear tattooing has been the most successful identification technique,  with tattoos remaining legible for at least 8 years(Between 1958 and 1962 hundreds of  Australian buffalo were shipped on the hoof to the meat markets in Hong Kong without  trouble, despite crowded shipboard conditions and the long sea voyage. But in 1962 one  roughly treated bull went berserk in Hong Kong and killed a handler, and the Hong Kong  authorities stopped the trade as a result, although the problem was really one of  mismanagement. Buffalo have since been sent by air from Australia to Venezuela,  Nigeria, and Papua New Guinea and by barge to Papua New Guinea. No handling  problems have been experienced en route).  When they pasture together, cattle and  buffaloes coexist satisfactorily. They segregate themselves into their own groups and do  not interfere with one another. The buffaloes, however, usually dominate the cattle and  tend to monopolize the areas with the best feed supply.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Feed troughs and mineral boxes used for cattle are suitable for buffaloes, but chutes and  crushes must be widened to accommodate the buffalo's broader body and, when  necessary, the Swamp buffalo's greater horn spread. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes are powerful  swimmers. In Brazil they have been known to escape by swimming down the Amazon River. An unusual management difficulty is caused by piranha in the rivers and swamps of Venezuela. In one herd of 100 heifer buffaloes, 40 have lost all or part of a teat to these voracious fish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The horns of water buffaloes are seldom removed or prevented from growing, a  testament to the animal's docility. (When questioned, one Thai villager said that he wouldn't  allow it because it would be a disgrace to the buffalo.) However, the animals can be  dehorned as calves in the same manner as cattle. They are then easier to handle In  chutes and cause less accidental injury to neighboring animals, handlers, walls, and  trees.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Benya, E. G. 1972. Cattle and buffalo production in Vietnam. Dairy Science Mimeo  Report, Florida Agricultural Experiment Station, Gainesville, Florida, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cockrill, W. R. 1974. Management, conservation and use. In: The Husbandry and Health  of the Domestic Buffalo, edited by W. R. Cockrill. Food and Agriculture Organization of  the United Nations, Rome, Italy.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">De Boer, A. J. 1976. A further report on the Taiwan livestock industry: general policy  conclusions and further research needs. Journal of Agricultural Economics 19:116129.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lin, C. H. 1975. The breeding, management and feeding of water buffaloes in Taiwan. In:  The Asiatic Water Buffalo. Proceedings of an International Symposium held at Khon  Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer Technology Center, Taipei,  Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">McDowell, R. E. 1972. Improvement of Livestock Production in Warm Climates. W. H.  Freeman and Company, San Francisco, California, USA.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moura Carvalho, L. O. D., LouIenco, J. B., Nascimento, C. N. B., and Costa, N. A. 1979.  Cerca de Contencao pare Bubalinos e Bovinos. Comunicado Tecnico No. 28,  Agricultural Research Center for the Humid Tropics (CPATU), Belem, Para, Brazil.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rufener, W. H. 1975. Management and productive performance of water buffalo in  northeast Thailand. In: The Asiatic TVater Buffalo. Proceedings of an International  Symposium held at Khon Kaen, Thailand, March 31-April 6, 1975. Food and Fertilizer  Technology Center, Taipei, Taiwan.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1978. The water buffalo in Australia: grouping and home range. Australian  Wildlife Research 5:327-354.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1979. Redomestication of water buffaloes in the Northern Territory of  Australia. Animal Regulation Studies 2(1):5-20.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">10 Environmental Effects</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The grazing and wallowing habits of water buffaloes may have unexpected consequences when the animals are introduced to new, perhaps fragile environments. The presence of several thousand feral buffaloes on the coastal plains of northern Australia, for example, has become a very emotional issue among Australian environmentalists, some of whom foretell the complete destruction of the environment if the uncontrolled feral herds are not destroyed( It is not at all clear, however, that the buffaloes (which have existed in the area for 150 years) are causing the observed environmental degradation. Other possibilities include: fire, climatic stress, overgrazing, and a variety of farming, hunting, and other human activities, especially the use of four-wheel-drive vehicles. Thousands of wild pigs also share the area, along with crayfish that burrow into and weaken the levees that keep out the sea, something for which the buffaloes have been blamed). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Soil Compaction</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes have larger hooves than cattle of comparable size and thus they compact the soil less. But buffaloes often live in damp, boggy areas where their feet may compact soft soils. Also, buffaloes are creatures of habit and, when able, they set up fixed points for drinking, feeding, defecating, wallowing, and sleeping. Between the points they wear sharply defined trails in the vegetation and soil.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Wallowing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Possibly the water buffalo's greatest environmental limitation is its propensity to build wallows. In hot climates every buffalo will wallow at some time during the heat of the day if water is available. When they can, buffaloes will make their own wallows, enlarging a mud puddle by rolling in it or even using their heads to flip water out of a drinking trough and muddying the ground nearby.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pasture in the immediate area of the wallow is usually damaged by trampling and waterholes may become fouled, but buffaloes return to the same wallow day after day and do not build new ones indiscriminately. Thus, the muddied area is not a large proportion of the location in which they graze unless a large number of animals are confined in a small space(At Gainesville, Florida (possibly because of its subtropical but not hot climate), a herd of 52 buffaloes concentrated in a one-hectare field did not attempt to build a wallow at ale -Information supplied by H. Popenoe.) . In addition, man-made wallows can be dug at safe sites and the animals will use them. The problem of wallowing is therefore not generally a serious one.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Damage to Waterways</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because buffaloes often live near and enter water freely, they may cause erosion in ditches, river banks, canals, and levees. Also, their wallowing muddies the water, which may adversely affect some fish species and reduce the growth of algae. Buffaloes commonly urinate and defecate in the water, possibly creating a pollution hazard, although in most situations this contamination is likely to be minor.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The presence of this herbivore in natural waterways may reduce the number of water plants. Some plants are trampled, some eaten, and some underwater species are suppressed because the muddied water transmits less light. This (and several other of the buffalo's environmental effects) can be turned to advantage (see picture page 85) when, as often occurs, aquatic plants grow out of control and become obnoxious weeds.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Damage to Pastures</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water buffaloes have very strong jaws, and when forage is sparse they graze it close to the ground; this overgrazing can destroy a pasture. In addition, they eat virtually all available plant material (including many species that cattle shun), so that a densely stocked pasture can become completely defoliated. In northern Australia it has been found that, with time, buffaloes become accustomed to a given pasture, and unless fences are strong they will instinctively return to it until the forage has been depleted.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The buffalo's inclination to eat many plants can be used to improve the environment and suppress growth of coarse weedy species of plants. On the Sepik Plains in Papua New Guinea buffaloes are being used to graze and suppress sedges (Cyperus species), as a result, the more desirable Paspalum species are beginning to appear. At Mount Bundy in northern Australia native pastures are being improved on a commercial scale by overstocking them with buffaloes. The animals reduce or completely eliminate spear grass and other weeds-even those with thorns-and thus foster the survival and growth of introduced forage legumes such as stylo (Stylosanthes guianensis). In Sri Lanka buffaloes have been used to graze out the vigorous tropical grass Imperata cylindrica.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Damage to Trees</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffaloes instinctively rub against trees (and walls and fences), eagerly browse leaves, and sometimes nibble bark, so they damage trees more so than cattle. In northern Australia it has been noted that each "family herd" of feral buffaloes selects one or two trees for rubbing against so that the rubbing damage is confined to them. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Selected Readings</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rajapske, G., 1950. Death of illuk. Ceylon Coconut Quarterly, 1:7-9.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1969. Home range in feral water buffalo. Australian Journal of Zoology 17:143-152.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1970. Seasonal movement and distribution of the sexes in the water buffaloes in the Northern Territory. Australian Journal of Zoology 18:399-414.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1975. Buffalo in the northern swamplands. Proceedings III of the World Conference on Animal Production. Theme 1, Paper 7.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tulloch, D. G. 1977. Some aspects of the ecology of the water buffalo in the Northern Territory. In: The Australian buffalo-a collection of papers, edited by B. D. Ford and D. G. Tulloch. Technical Bulletin No. 18, Department of the Northern Territory, Animal Industry and Agriculture Branch, Australian Government Printing Service, Canberra, Australia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">11 Recommendations and Research Needs</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has outlined the water buffalo's apparent merits, but most of the statements made about the animal are based on empirical observations. Many of its most exciting and potentially valuable features have not been subjected to the careful scrutiny needed to confirm their validity.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the fact that there are 130 million or more water buffalo in the world, research on the animal is scanty and limited to only a few situations and sites. Quantitative information (especially for the various breeds), tests, trials, and comparison studies are needed.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The research to be done on the water buffalo offers scientific challenges that can be undertaken in laboratories and experiment stations in most parts of the world and in many disciplines: breeding, physiology, microbiology, veterinary science, nutrition, food science, dairy science, and other fields. Water buffalo research is an area worthy of financial support by philanthropic institutions and international development agencies concerned with problems of food and resource shortages. The dominant role of the buffalo in the rural economies of Egypt and Asian countries offers the opportunity for buffalo research that can bring improvements quickly and easily to the rural poor. For other countries the water buffalo is an untapped resource, and they should test its productivity on native pasturelands, marshy lowlands, hot and humid areas where cattle do not thrive, and on areas prone to cattle diseases and parasites that are difficult to control.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Specific recommendations follow.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Comparison with Cattle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal scientists worldwide should undertake trials to compare growth rate, feeding, nutrition, breeding, and other aspects of buffalo and cattle performance.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cattle and water buffaloes are obviously different animals. Each has its own limitations and advantages, and each deserves to be studied in its own right. Perhaps the quickest way for animal scientists to experience for themselves the merits of the water buffalo is to conduct their own comparative trials with buffaloes and cattle in their areas. The results will provide local guidance and will help extend recognition of the buffalo's value, especially under difficult conditions where it may exceed cattle in productivity and profitability.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Germ Plasm Preservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Urgent action is needed, especially in Southeast Asia, to preserve and protect outstanding buffalo specimens.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In some countries (Thailand, Malaysia, and Indonesia, for example) buffalo populations are decreasing dramatically. High demands for meat are causing slaughter at younger and younger ages. Much of the meat is exported to restaurants and markets in Singapore and Hong Kong. Unfortunately, the largest and quickest growing animals are often selected for slaughter. This results in the loss of a major genetic resource, which is compounded by the practice of castrating the largest males to make them more tractable as work animals. Ten years ago in Thailand it was common to find buffalo weighing 1,000 kg; now it is hard to find 750-kg specimens. A similar situation exists in the Philippines where there is no dearth of good breeding stock, but butchers are paying such high prices that farmers are selling even quality animals for slaughter. In northern Australia, where some of the bulls weigh almost 1,200 kg, the largest animals are being shot for meat, hides, pet food, or sportsmen's trophies,  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A large number of high-yielding buffaloes are taken each year to big cities in India (for example, Bombay, Calcutta, Madras) for milking. At the end of lactation many are returned to the villages, but many others are slaughtered, rather than being fed and retired. This creates a huge loss of valuable germ plasm. In many locations most of the largest animals have already been lost. Only urgent action will protect those remaining.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">International Shipment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo quarantine stations should be organized in "disease-free" areas to develop buffalo germ plasm pools for international exchange.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The importation of buffaloes presents difficulties for any government, researcher, or farmer wishing to obtain the animals for the first time or for breeding purposes. Quarantine laws make it extremely difficult and expensive to exchange genetic resources.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Australia is one of the few nations where there are large numbers of water buffalo in an area free of the major animal diseases. Papua New Guinea, </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nigeria, Colombia, Venezuela, and other nations have taken advantage of this and have  imported Australian buffaloes. But Australian herds are all Swamp buffaloes(The island  of Guam is also a safe source of Swamp animals, although the feral herds there are  depleted, only 300 or 400 animals were left on Guam in 1978) and so breeding centers  should be set up also (in Sri Lanka and Italy perhaps) where importers can obtain  River-type (including Mediterranean) buffaloes.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Genetic Improvement</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide efforts should be made to select superior buffalo bulls and cows for breeding.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Performance testing, leading to the mass selection of superior animals, deserves high  priority. Virtually all buffalo breeding is haphazard and unplanned. Village animals graze  together and matings are usually not con" trolled, observed, or recorded. Thus, the full  genetic potential of the water buffalo is not being realized.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A massive selection program is needed to bring about genetic progress. For each breed,  bulls and cows with the potential for improving production of meat and milk and  increasing draft power should be identified and used for breed improvement. However,  the wide variations between the characteristics of individual animals may make  exceptional genetic advances difficult to achieve quickly.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Important traits for culling and selection include behavior, temperament, reproduction  rate, easy milk letdown, average daily gain in weight or weight at a given age, carcass  quality (for example, large hindquarters), and milk production, as well as strength and  endurance for work.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Crossbreeding of Swamp and River buffaloes is a potentially important route to genetic  improvement. The progeny reportedly show hybrid vigor (heterosis) in milking ability,  fertility, meat production, and working ability. Infusing genes for high milk production into  the Swamp buffalo, now used mainly for meat and work, creates the potential for a  triple-purpose animal.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The use of artificial insemination and deep-frozen semen should be a major help in  upgrading the buffalo. Moreover, the transport of live embryos (rather than neonatal  animals) for implantation in the uterus of surrogate mothers could be important for water  buffalo. It seems unlikely, however, that buffalo embryos can be implanted in cattle.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most genetic selections should be made in Asia where 97 percent of the world's water  buffaloes are located. The improvements will depend on how accurately bulls can be  identified, selected, and mated. Performance and  progeny testing is sorely needed at research stations as well as "on the farm." Governments should also institute bull-loan or artificial-insemination programs as a means for upgrading the village herds.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Comparison of Breeds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The relative merits of the various buffalo breeds should be determined,  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little or no information is available on the comparative performance of the different buffalo breeds in various environments, especially the 17 or so River breeds in the Subcontinent and the Egyptian and Mediterranean breeds. Comparison trials of the breeds and breed-crosses are needed in a wide range of climates from the humid tropical to the temperate. In addition, the cytogenetic, immunogenetic, and inheritance relationships of breeds should be clarified.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel encourages countries such as India and Pakistan that have a number of buffalo breeds (for example, Murrah, Surti, Jafarabadi, Mehsana, and Nili/Ravi) to set up experimental farms for scientific reproduction of superior specimens. Substantial research benefits as well as profitable economic returns from using and exporting some of them would be realized.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Meat and Milk Research</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and demonstration is needed to foster the widespread consumption of buffalo meat and milk.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo milk, cheese, and other dairy products are considered outstanding foods in all locations where they are produced. Taste tests so far have indicated that buffalo meat is similar or slightly superior to beef produced under the same conditions.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A specific need is to feed the male calves and use them for meat. Many are now slaughtered at a young age and light weight. Research that provides either a partial or complete milk substitute for feeding calves would have a major impact on meat supplies and farmer income. Diets being developed for calves in Egypt incorporate such ingredients as whey, soybean meal, corn flour (corn starch), and yeast.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other research topics include:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The effect of climate, thermoregulation, and wallowing on meat and milk production;  </P>
+<P ALIGN="JUSTIFY">· The meat characteristics of each of the breeds and the differences between them,  </P>
+<P ALIGN="JUSTIFY">· Milk production and quality for each of the breeds;  </P>
+<P ALIGN="JUSTIFY">· Adapting buffaloes to machine milking by genetic selection or by designing new milking  machinery;  </P>
+<P ALIGN="JUSTIFY">· Developing new or improved milk products (such as yogurt, cottage cheese, and hard  cheese); and  </P>
+<P ALIGN="JUSTIFY">· Banking genetically superior germ plasm for later use.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Work Research</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel recommends research on new harnesses to replace the omnipresent yoke.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As already noted, the wooden yoke, which has not changed in 1,500 years or more, is an  inefficient harness. Research is needed to adapt horse collars, hames, breast straps,  and other devices for the buffalo. Because much of the farm power in Asia comes from  buffaloes, the impact of improved harness could be dramatic, widespread, and of  enormous value to millions of small farmers there. If the experiments in Thailand  described earlier are an indication, the farm power in Asia could be increased by 25  percent overnight with the adoption of an improved harness. The buffalo will continue to  be the small farmer's "tractor," so the benefits from improved harnesses are likely to  continue for a long time.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are 13 million buffalo and bullock carts in India and 20 million Indians are engaged  in the business of road haulage. Application of appropriate technology would eliminate  the archaic wooden wheels, axles, and heavy carts and substitute lightweight carts,  perhaps with such features as metal wheels, pneumatic tires, ball bearings, and fixed  axles. With such improvements, loads might be increased and hauled over longer  distances at greater speed and with less work.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Trials in New Areas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Testing of water buffalo production is needed in many areas where the animal is not  known.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A seemingly adaptable animal, the water buffalo should be productive throughout the  earth's warm temperate, subtropical, and tropical zones. Different breeds may adapt  differently to extremes of heat, humidity, and cold, and this needs further study.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The United States, the Mediterranean Basin of Europe, and some of the more temperate  European areas like southern England are worth considering for water buffalo trials. In the Southern Hemisphere River buffaloes are already found as far south as 25° latitude in Brazil's Sao Paulo State (where large herds are raised); an experimental herd of Swamp buffaloes has performed outstandingly in Brisbane, Australia (27°S); and there are a few Swamp buffalo in South Australia and Victoria (35°S or more). There is good reason to believe that water buffaloes may be productive in all of the states in Australia, New Zealand's North Island, South Africa, Argentina, and other warm temperate areas of the Southern Hemisphere.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The biggest void in the water buffalo map is virtually the entire continent of Africa. It seems a paradox that the buffalo-Egypt's most important domestic animal-is not farmed commercially in any other African country. Experimental herds have been introduced to Nigeria, Uganda, Mozambique, Tanzania, and other countries in the past, and the initial success of three of them is described in Appendix A.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The water buffalo, with its tolerance for heat, disease, poor-quality feed, and mismanagement, appears to have outstanding promise for African nations such as Sudan, Tunisia, Morocco, Senegal, and The Gambia as well as all nations south of the Sahara (Nambia perhaps being an exception).  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More specific aspects of environmental tolerance deserving research attention are:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">· The physiology of the buffalo's response to heat, cold, humidity, and other environmental factors;  </P>
+<P ALIGN="JUSTIFY">· The effect of climate on growth, reproduction, milk production, health, respiration rate, behavior, and carcass quality; and  </P>
+<P ALIGN="JUSTIFY">· Measurement of the calorific efficiency and chemical composition of all breeds of buffaloes and cattle to determine the environments best suited to each breed.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Nutrition Research</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite observations of the buffalo's ability to utilize poor quality forage, research is needed to learn how the animal does it.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This research should:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Establish the buffalo's nutrient requirements by breed, sex, age, and weight for maintenance, growth, reproduction, lactation, and work;  </P>
+<P ALIGN="JUSTIFY">· Determine voluntary forage consumption and the nutrient utilization of different forages in various stages of maturity;  </P>
+<P ALIGN="JUSTIFY">· Examine rumen microbiology and fermentation, the rate of digestion, production, and absorption of volatile fatty acids produced in the rumen, and utilization of energy, nitrogen, vitamins, and minerals; </P>
+<P ALIGN="JUSTIFY">· Develop milk replacements for early~weaned calves;  </P>
+<P ALIGN="JUSTIFY">· Observe the current village-level feeding of low~uality forages to learn their nutrient requirements, nutrient deficiency diseases, and nutrient supplementation needed;  </P>
+<P ALIGN="JUSTIFY">· Study the utilization of concentrated, high-energy feeds (especially byproduct feeds) to determine the upper limits of buffalo growth and productivity (milk, meat, and work) and carcass quality;  </P>
+<P ALIGN="JUSTIFY">· Compare various breeds of water buffaloes and other ruminants to determine possible differences in nutritional requirements and performance; and  </P>
+<P ALIGN="JUSTIFY">· Apply economic research to production practices, including night feeding of cut forage and the use of improved pastures.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Management</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research to improve management practices could benefit small farmers, ranchers, and feedlot feeders alike.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Little is known about the farm management factors that influence water buffalo productivity. Studies and extension literature for farmers are needed on subjects such as:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Proper fencing;  </P>
+<P ALIGN="JUSTIFY">· Procedures for dehorning and for preventing horn growth in calves;  </P>
+<P ALIGN="JUSTIFY">· Grazing management methods;  </P>
+<P ALIGN="JUSTIFY">· Preservation of forages;  </P>
+<P ALIGN="JUSTIFY">· Methods and effect of castration;  </P>
+<P ALIGN="JUSTIFY">· Methods and effect of spaying;  </P>
+<P ALIGN="JUSTIFY">· Breeding methods;  </P>
+<P ALIGN="JUSTIFY">· Milking methods;  </P>
+<P ALIGN="JUSTIFY">· Artificial insemination, methodology and use;  </P>
+<P ALIGN="JUSTIFY">· Methods of handling animals under grazing conditions or in feedlots;  </P>
+<P ALIGN="JUSTIFY">· Age for weaning under different conditions;  </P>
+<P ALIGN="JUSTIFY">· Mineral and protein supplementation methods;  </P>
+<P ALIGN="JUSTIFY">· Semen freezing;  </P>
+<P ALIGN="JUSTIFY">· Ova transplantation methods;  </P>
+<P ALIGN="JUSTIFY">· Cryobranding and other methods of animal identification;  </P>
+<P ALIGN="JUSTIFY">· Control of internal parasites; and  </P>
+<P ALIGN="JUSTIFY">· Disease prevention and treatments. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Health</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is needed in areas where uncertainties about buffalo diseases are hindering  the animals' use.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The research should:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Develop control and management practices to prevent specific infections and parasites  for buffalo groups such as calves, yearlings, heifers, pregnant cows, newly calved cows,  and bulls;  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Elucidate the factors (genetic, nutritional,management, disease) causing losses of  newly born calves;  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Prevent and control the major diseases and parasites of the buffalo: hemorrhagic  septicemia, brucellosis, tuberculosis, foot-and-mouth disease, sarcoptic mange,  fascioliasis, nematode parasites, rinderpest and "rinderpestlike" diseases, nephritis, and  conjunctivitis;  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Develop herd-health programs and specific disease-control programs for the various  production systems;  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Determine the level of susceptibility to trypanosomiasis, a disease that might mitigate  against introducing the animal widely to Africa; and  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Define the buffalo's role in malarial ecology.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Reproduction</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research is needed to improve water buffalo reproduction.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research topics should include:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Physiology and deep-freezing of buffalo semen. (Although it is possible to freeze the  buffalo semen now, further improvements are needed to achieve higher conception  rates.)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Incidence of sub-estrus and anestrus. This is fairly high in buffaloes. Work is needed to  determine the factors contributing to this problem and find solutions applicable in the  field. A simple, inexpensive test for the routine diagnosis of estrus is needed. It could  ensure that buffaloes are inseminated at the optimal time and could lead to the possible  synchronizing of estrus in groups of animals as well as the elimination of seasonal  breeding.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Seasonality of breeding. Investigations are needed into seasonal effects on the intensity  and deviation of estrus in buffaloes. Most of the buffaloes in northern India and Pakistan,  for example, calve between July and December, causing scarcity of milk in the summer  season and a flush of production in the winter months (this phenomenon causes serious  marketing problems).  </P>
+<P ALIGN="JUSTIFY">· Low libido and low semen yield in buffalo bulls. Semen yield in buffalo bulls is less than half of the yield from cattle bulls.  </P>
+<P ALIGN="JUSTIFY">· Effect of season and other factors on semen quality.  </P>
+<P ALIGN="JUSTIFY">· Variation in the freezability of semen from different bulls.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Dissemination of Information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel recommends that two water buffalo publications be produced.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These should be:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· An international water buffalo newsletter. It is important to maintain communication among researchers working with the water buffalo in far flung research stations, universities, missions, and villages. Research findings may not be widely shared if technical animal science journals and the one or two national newsletters now available remain the only source of water buffalo information. A newsletter would bring together results from different parts of the world. It would provide rapid exchange of information as well as a forum for informal opinions, observations, and preliminary experimental data that are usually not accepted by journals.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· A formal journal of water buffalo research.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, other methods for disseminating water buffalo information are to be encouraged. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendixes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix A</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Water Buffalo in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the water buffalo, Africa is the unknown continent. Apart from Egypt, where the  "gamoosa" is a major livestock resource, there have been few recorded experiences  with the animal in Africa. While this may be attributed to disease, chances are it is  because of historical oversight.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small herds of buffaloes were recently introduced to Uganda, Tanzania, and Nigeria, but  because there were so few animals no firm conclusions can be drawn. Initial  observations, however, suggest that the water buffalo could have an important future role  in Africa, south of the Sahara. There seems little reason to believe that they won't thrive  there as they have done elsewhere in the tropics.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The following statements were provided by researchers involved in the enterprises.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Uganda</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"Uganda imported a herd of 12 buffalo cows and one bull in 1969. Grazed on poor-quality  unimproved pasture they received neither supplementary feeding nor any preferential  treatment over the East African zebus kept with them. The herd stayed 7 years at  Entebbe before being moved to another part of the country. They proved to be very  efficient converters of the low protein, high-fber fodder. During this time the herd grew to  40 adult cows and 2 bulls (all other steers were slaughtered). The cows calved every  year. The calves matured at 2 to 21/2 years; the zebu calves took at least 3 years to  mature. Buffalo calves were much heavier than the zebus of comparable age.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"The buffalo cows averaged 7 liters of milk per milking. In taste it was preferred to zebu  milk. Also, the quality of the meat after slaughter was much better than that of the zebus.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">"A major advantage the buffaloes had over the cattle was that they were remarkably  unaffected by diseases endemic to the area. Apart from a few calves that died of  diseases that also killed cattle on the farm at Entebbe, the buffaloes resisted tick-borne  diseases, the biggest killers of cattle in Uganda, and were unaffected by the virulent  strains of East Coast Fever (Theileriosis), Uganda's most serious endemic animal  disease."(Information supplied by G. L. Corry, Director, Veterinary Research Services, Entebbe  Uganda)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Nigeria</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Early in 1976, 194 buffaloes aged 6-9 months were imported from the environs of Darwin in Australia's Northern Territory. The animals settled down quite well, and by the end of 1978 the stock population had risen to about 320, the adults weighing about 400 kg with about 80 percent fertility. The animals were in excellent health when an outbreak of streptothricosis occurred early in 1979. Because of the intractable nature of this rare disease of cattle, sheep, and pigs, the apparent spread of the disease in the confined area of the ranch, and the persistence of the organism, the animals were slaughtered(nformation supplied by Dr. J. E. Erhiaganoma, Chief Veterinary Officer, Ministry of Agriculture and Natural Resources, Benin City, Bendel State of Nigeria)..  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Tanzania</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tanzania introduced 21 buffalo heifers and 2 buffalo bulls from Egypt in 1968 and 1970. By 1977 the herd had grown to 150 animals. They were kept at the Livestock Production Research Institute at Mpwapwa, a site representative of central Tanzania(Mpwapwa is located at an elevation of 1,000 m. It receives an annual rainfall of 700 mm during a single season between late November and early May. Mean minimum temperatures of 13°C occur in June, and mean maximum temperatures of 26°C occur in November). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over a period of 10 years the buffalo were studied and compared with crossbreeds of local Mpwapwa cows and Friesian steers. On average, the buffaloes conceived and calved 4 months earlier than the cattle, their mean calving intervals were about a month shorter, their birth and weaning weights were 1.5 times higher, and their daily weight gain was about double that of the crossbred cattle. The milk yield from the buffaloes was only about two thirds that of the crossbred cattle, but their rnilk's high butterfat content meant that the overall butterfat production was higher in buffaloes.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Figures reported are shown below:  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p98.png"></center><br>
+ Table</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a second study (Shoo, R A. 1980. A study of the performance of Egyptian water buffaloes. Student project, Animal Production Department, Faculty of Agriculture, Forestry and Veterinary Medicine, University of Dar-Es-Salaam, Morogoro, Tanzania.), 30 buffaloes and 34 Mpwapwa cattle (not the crossbreeds) were compared(Mpwapwa cattle are a Tanzanian breed with 55 percent Asian, 35 percent African, and 10 percent European blood). The calving intervals were 396 + 126 days for buffaloes and 437 + 109 days for cattle. The buffaloes first conceived at mean ages of 23-25 months (matings occurred in both wet and dry seasons), the cattle at 27-36 months. The buffaloes calved at 35 months, the cattle at 46 months.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On farms at Ruvu and Mabuki the calving rate was 63 percent, and the mortality rate 1.2-6.9 percent(Rakha, A. 1980. water buffalo Production, Tanzania. Report of the technical Cooperation Program TCP/URT/9002, Food and Agriculture Organization of United Nations, Rome, Italy). The buffalo's overall milk yields averaged 1,237 kg in 225 days, or 5.5 kg per day.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The results of the introduction of buffalo to Tanzania are considered "quite encouraging and the future of buffaloes in Tanzania will be bright." (Oloufa, M. M. 1981. The future of water buffaloes in Tanzania Paper presented at the Tanzania Society of Animal Production Eighth Scientific Conference, Arusha, Tanzania May 26-29, 1981.) Future plans call for increasing the herd to about 200 animals with a view toward establishing another buffalo herd. In addition, 5 buffalo sires have been selected in Egypt for shipment to Tanzania.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix B</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research Contacts</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A directory of names in buffalo studies and research is available from the International Buffalo Information Center, Kasetsart University Library, Bangkhen, Bangkok 10900, Thailand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Industry Branch, Department of Primary Production, P.O. Box 5160, Darwin, Northern Territory 5790 (D.R. Thomson, B. Ford)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Berrimah Agricultural Research Station, Darwin, Northern Territory</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coastal Plains Research Station, near Darwin, Northern Territory</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D. G. Tulloch, P.O. Box 38841, Winnellie 5789, Northern Territory</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">University of Queensland, Department of Animal Husbandry, St. Lucia, Queensland (D.D. Charles)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Brazil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associacao de Criadores de Bufalos do Brasil, Cx Postal 832, Sao Paulo (President, Dr. Paulo Joaquim Monteiro da Silva)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Centro de Pesquisa Agropecuaria do Tropico Umido (Agricultural Reseach Center of the Humid Tropics), Caixa Postal, 48, Belem, Para, 66000  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Faculdade de Medicina Veterinaria e Zootecnia (Faculty of Veterinary Medicine and Zootechnology), Universidade Estadual "Julio de Mesquita Filho," Campus de Botucatu, Estado de Sao Paulo  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Instituto de Zootecnia (Institute of Zootechnology), Nova Odessa, Sao Paulo (Prof. Alberto Alves Santiago)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr. Geraldo Mosse, Rua Apinages 716-CEP, 05017, Sao Paulo, S.P.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr. Walmore Muller Lacort, Ministerio de agriculture Explanada des Ministerios, Bloco 8-50 Andar Sala 518, 70.000 Brasilia, D.F.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Bulgaria</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Academy of Agricultural Sciences, Sofia (P. Ivanov, Z. Zahariev)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Buffalo Basis, Livestock Breeding Research Institute, Shumen (Dr. D. St. Polikhronov, Director; Dr. A. Alexis)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">China</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Husbandry and Veterinary Medicine, Nanking Agricultural College, Nanking (Professor Sieh Chen-Hsia)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kwangsi Agriculture College, Nanning, Kwangsi (Professor Wang Pei Chien</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock Farm, Lu Hsu, Pinyang County, Kwasngsi Chang Autonomous Region</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research Institute for Animal Science, Nanning, Kwangsi (Dr. Chou Chi-Sheng)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Singchow Dairy Farm, Kwangtung Province</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Costa Rica</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jose Luis Pacheco, Director, Dept Formento, 8502 JAPDEVA, Puerto Limon</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Egypt</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ain Shams University, Kasr-EI-Zaafran, Abbasiyah, Cairo (M.A. El-Ashry, A.M. El-Serafy)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Production, College of Agriculture, Cairo University, Cairo (Dr. M.T. Ragab)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">University of Alexandria, 22 Al-Gueish Avenue, Shatby, Alexandria (K. El-Shazly)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Federal Republic of Germany</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr. R. Dunkel, Herzeleidstrasse 39, 5330 Konigswinter 41, Bonn</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prof. Dr. H. Fischer, Insitut fur Tropische Veterinarmedizin, Wilhelmstr. 15, 6300 Giessen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gesellschaft fur Agrarentwicklung (GAE), Meckenheimer Allee 113, 5300 Bonn 1</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Hungary</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. Kovacs, Department of Animal Husbandry, Agricultural University, Deak F. -u16, 8361Keszthely  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">India</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Andhra Pradesh Agricultural University, Hyderabad, A.P. (Director of Research)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Husbandry Commissioner, Government of India, Ministry of Agriculture and Irrigation, Krishi Bhavan, New Delhi  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Sciences, Director General, Indian Council of Agricultural Research, Krishi Bhavan, New Delhi  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Buffalo Breeding Farm, Sambalpua, PO: Sunbeda, Distt. Kerapur, Orissa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Frozen Semen Bank, Hessarghatta, Bangalore, Kamataka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Murrah Breeding Farm, Almadi, Tamil Nadu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Surti Buffalo Farm, Dhamrod, Gujarat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chief Superintendent, Govenment Livestock Farm, Hissar, Haryana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">College of Veterinary and Animal Science, Chandra Sekhar Azad University of Agriculture and Technology, Mathura Campus, Mathura, U.P.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Co-ordinator, All India Buffalo Improvement Project, Natioal Dairy Research Institute, Karnal, Haryana, (Dr. V. N. Tripathi)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director, Military Dairy Farm, Army Headquarters, Quatermaster, General Branch, DHQ PO New Delhi 11  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G.B. Pant, University of Agriculture and Technology, Pantnagar, U.P.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government Livestock Farm, Anjora Distt: Durg, Madhya Pradesh</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gujarat Agricultural University, Reproductive Biology Research Unit, PO Anand Agricultural Institute, Anand, Gujarat  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Haryana Agricultural University , Hissar, Haryana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indian Veterinary Research Institute, Izatnagar, Barcilly, V.P. (Dr. S.K. Ranjan)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jawaharlal Nehru Krishi Vishwa Vidyalaya, Jabalpur, 482004, M.P.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kaira District Cooperative Milk Producers Union Ltd., Anand, Gujarat (Dr. V. Kurien, Chairman)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Dairy Development Board, Anand, Gujarat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Dairy Research Institute (ICAR), Karnal 132002, Haryana (S.P. Arora, Dr. D. Sundaresan, Director)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Punjab Agricultural University, Ludhiana, Punjab (Dr. J.S. Ichhponani, Dr. S.K. Misra)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">University of Agricultural Sciences, Dharwar Campus, Dharwar, Karnataka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">University of Udaipur, Udaipur, Rajasthan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Indonesia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Balai Inseminasi Buatan Lembang, Jawa Barat (Dr. R.D. Simangunsong)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Directorate of Animal Husbandry, Department of Agriculture, Jl Salemba Raya 16, Jakarta (Dr. Jaman Zailani)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pusat Penelitian den Pengambangan Ternak (Centre for Animal Research and Development), Bogor</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Iraq</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Rearing Station, Abu Ghraib, Baghdad</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Italy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Production and Health Division, FAO,00100 Rome</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associazione Provinciale Allevatori, via Redentare, Caserta (Professore de Franciscis,Presidente)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Instituto de Ricerche soll'Adattamento Bovini e dei Bufali, Ponticelli, Napoli (Director: Pro£ Lino Ferrara)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Instituto Sperimentale per la Zootecnica, via Onofrio Panvino, Rome (Prof. A. Pilla)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Instituto Sperimentale per la Zootecnice di Roma, via Salaria 31, 00016, Monterotondo Scalo (Dr. Augusto Romita)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ugo Jemma, Torre Lupara, 81050 Pastorano, near Caserta</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Japan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. Shimuzu, The University of Tsukuba, Sakura-mura niihar gun ibaraki-ken 300-311</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Malaysia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Animal Husbandry Station, Kluang</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Faculty of Veterinary Medicine and Animal Science, University Pertanian, Serdang, Selangor</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malaysian Agricultural Research and Development Institute, Serdang, Selangor</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Nepal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Artificial Insemination Project, Tfipureshwar, Kathmandu (Dr. A.C. Gupta)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock Division, Khumaltar, Lalitpur, Kathmandu (Dr. N.D. Joshi)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Pakistan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">College of Animal Husbandry, Lahore (Dr. Mohammad Shafi Chaudhry)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Reproduction, University of Agriculture, Faisalabad (Dr. Rashid Ahmad Chaudhary)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock Production Research Institute, Bahadurnagar District, Sahiwat, Punjab (Dr. S.K. Shah, Director)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Punjab Veterinary Research Institute, Lahore 13</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Panama</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hugo Giraoud, Apartado 60-2745, El Dorado</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Primary Industry, ERAP, P.O. Box. 348, Lae (John H. Schottler)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sepik Plains Livestock Station, Ufimo via Wewak, E.S.P.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Philippines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Science Department, Central Luzon State University, Muiloz, Nueva Ecija</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">College of Veterinary Medicine, University of the Philippines Systems, Diliman, Quezon City Dairy Development Division, Bureau of Animal Industry, Sta. Mesa, Metro Manila (Dr. Conrado A. Valdez)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dairy Training and Research Institute, University of the Philippines at Los Banos, College, Laguna 3720  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Science, University of the Philippines at Los Banos, College, Laguna 3720 (Dr. V. C. Momongon)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Documentation Center on Water Buffalo, University of the Philippines at Los Banos Library, College, Laguna 3720  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Philippine Council for Agriculture and Resources Research, Livestock Research Division, Los Banos, Laguna 3732 (Dr. Alfonso N. Eusebio)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Portugal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">W. Ross CockriII, 591 Vale do Lobo, Almansil, Algrave 8100</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Sri Lanka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Animal Production and Health, Peradeniya (Dr. K. Balachandran)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">School of Veterinary Science, University of Sri Lanka, Peradenlya Dr. B.M.A.O. Perrera)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Taiwan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Food and Fertilizer Technology Center, P.O. Box 22-149, Taipei City</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Tanzania</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal Production Department, Faculty of Agriculture, Forestry and Veterinary Medicine, University of Dar es Salaam, Morogoro (M.L. Kyomo)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DAFCO Farm, Ruvu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director, Livestock Development Division, Ministry of Agriculture, Dar es Salaam</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P.M.J. Katyega, Director, Livestock Production Research Institute, Private Bag, Mpwapwa M.M. Oloufa, FAO, Morogoro  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Thailand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kasetsart University, Department of Animal Science, Bangkok (Dr. Charan Chantalakhana) Faculty of Veterinary Science, Chulalongkorn University, Henri Dunant Street, Bangkok 5 (Dr. Maneewan Kamonpatana)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Department of Obstetrics, Gynecology and Reproduction, Faculty of Veterinary Science, Chulalongkorn University, Henri Dunant Road, Bangkok 10500  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FAO Regional Office, Maliwan Mansion, Phra Atit Road, Bangkok 2 (Dr. B. K. Soni)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Office of Livestock Development Project, Tha Phra, Khon Kaen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Buffalo Research and Training Center, Surin</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Trinidad</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Steve Bennett, 61 Mucurapo Road, Port-of-Spain</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Uganda</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">G. L. Corry, Director, Veterinary Research Services, P.O. Box 24, Entebbe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S. Mugerwa, Faculty of Agriculture, MaKerere University, P.O. Box 7062, Kampala</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">United Kingdom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">T. B. Begg, Resident Veterinary Surgeon, Howletts and Port Lympne Estates, Ltd., Port Lympne, Lympne, Kent CT21 4PD  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P. N. Wilson, BOCM Silcock Ltd., Basing View, Basingstoke, Hampshire RG21 2EQ</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">United States</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wyland Cripe, Asst. Dean for Public Services, College of Veterinary Medicine, Box J-125, JHMHC, University of Florida, Gainesville, Florida 32610  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J. Harrington, IRI Research Institute, Inc. One Rockefeller Plaza, New York, New York 10020 James Hentges, Department of Animal Science, Room 2104 McCarty Hall, University of Florida, Gainesville, Florida 32611  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jack Howarth, School of Veterinary Medicine, University of California, Davis, California 95616</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nels M. Konnerup, 609 East Iverson Road, Camano Island, Washington 98292</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A. P. Leonards, P.O. Box 1094, Lake Charles, Louisiana 70602</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">John K. Loosli, Department of Animal Science, Room 2103 McCarty Hall, University of Florida, Gainesville, Florida 32611  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert E. McDowell, Department of Animal Science, Frank B. Morrison Hall, Cornell University, Ithaca, New York 14853  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hugh Popenoe, International Programs in Agriculture, 3028 McCarty Hall, University of Florida, Gainesville, Florida 32611  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">William R. Pritchard, School of Veterinary Medicine, University of California, Davis, California 95616  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Venezuela</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abelardo Ferrer D., Quinta Nueva Exparta, Avenida Jose Felix Rivas, San Bernardino, Caracas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix C</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Advisory Committee on Technology Innovation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, Chairman  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM BRADLEY, Consultant, New Hope, Pennsylvania</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HAROLD DREGNE, Director, International Center for Arid and Semi-Arid Land Studies, Texas Tech University, Lubbock, Texas  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ANDREW HAY, President, Calvert-Peat, Inc., New York, New York (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CARL N. HODGES, Director, Environmental Research Laboratory, Tucson, Arizona  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CYRUS MCKELL, Institute of Land Rehabilitation, Utah State University, Logan, Utah  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOIS MERGEN, Pinchot Professor of Forestry, School of Forestry and Environmental Studies, Yale University, New Haven, Connecticut  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Consultative Group on International Agricultural Research, Washington, D.C.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THEODORE SUDIA, Deputy Science Advisor to the Secretary of Interior, Department of Interior, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE BUGLIARELLO, President, Polytechnic Institute of New York, Brooklyn, New York, Chairman  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Director, Office of Biological Conservation, Smithsonian Institution, Washington, D.C. (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PEDRO BARBOSA, Department of Entomology, University of Maryland, College Park, Maryland (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FLETCHER L. BYROM, Chairman, Koppers Company, Inc., Pittsburgh, Pennsylvania  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARRISON BROWN, Director, Resource Systems Institute, The East-West Center, Honolulu, Hawaii  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DORIS GALLOWAY, Department of Nutrition Sciences, University of California, Berkeley, California  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MARY E. CARTER, Associate Administrator, U.S. Department of Agriculture, Washington, D.C.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELIZABETH COLSON, Department of Anthropology, University of California, Berkeley, California  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BREWSTER C. DENNY, Dean, Graduate School of Public Affairs, University of Washington, Seattle, Washington (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROLAND I. FUCHS, Chairman, Department of Geography, University of Hawaii at Manoa, Honolulu, Hawaii, ex-officio  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HERBERT I. FUSFELD, Director, Center for Science and Technology Policy, Graduate School of Public Administration, New York University, New York, New York (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MARTIN GOLAND, President, Southwest Research Institute, San Antonio, Texas (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LINCOLN GORDON, Senior Fellow, Resources for the Future, Washington, D.C. (member through September 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JAMES P. GRANT, President, Overseas Development Council, Washington, D.C. (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N. BRUCE HANNAY, Foreign Secretary, National Academy of Engineering, ax-officio  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE R. HERBERT, President, Research Triangle Institute, Research Triangle Park, North Carolina  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM N. HUBBARD, JR., President, The Upjohn Company, Kalamazoo, Michigan (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT N. KREIDLER, Private Foundation Consultant, New York, New York  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RICHARD LASTER, Executive Vice President, General Foods Corporation, White Plains, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN LISTON, Director, Institute for Food Science &amp; Technology, College of Fisheries, University of Washington, Seattle, Washington  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THOMAS F. MALONE, Foreign Secretary, National Academy of Sciences, ex-officio  FRANCOIS MERGEN, Pinchot Professor of Forestry, School of Forestry and Environmental Studies, Yale University, New Haven, Connecticut  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RODNEY W. NICHOLS, Executive Vice President, Rockefeller University, New York, New York (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DANIEL A. OKUN, Department of Environmental Sciences and Engineering, School of Public Health, University of North Carolina, Chapel Hill, North Carolina  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">E. RAY PARISER, Senior Research Scientist, Department of Nutrition and Food Science, Massachusetts Institute of Technology, Cambridge, Massachusetts  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NAMES BRIAN QUINN, Amos Tuck School of Business Administration, Dartmouth College, Hanover, New Hampshire (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PRISCILLA C. REINING, Director, Project on Desertification, International Division, American Association for the Advancement of Science, Washington, D.C. (member through 1980)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH W. RICHARDSON, JR., Department of Horticulture, Pennsylvania State University, University Park, Pennsylvania (member through 1979)  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK SEITZ, President Emeritus, Rockefeller University, New York, New York  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H. GUYFORD STEVER, Consultant, Washington, D.C.  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BILL C. WRIGHT, Program Officer, Africa and the Middle East, International Agricultural Development Service, New York, New York  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">VICTOR RABINOWITCH, Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. C. McDONALD DOW, Deputy Director  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN G. HURLEY, Deputy Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P></FONT>
+<!--
+</Section>
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/b22bue/b22bue.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/b22bue/b22bue.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/b22bue/b22bue.htm	(revision 21083)
@@ -0,0 +1,656 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Butterfly Farming in Papua New Guinea </TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Butterfly Farming in Papua New Guinea</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Managing Tropical Animal Resources</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">First Printing, June 1983 </P>
+<P ALIGN="JUSTIFY">Second Printing, May, 1985 </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY">&nbsp;</P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"><A NAME="Acknowledgements"></A></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Acknowledgments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Report of an Ad Hoc Panel of the Advisory Committee on Technology Innovation </P>
+<P ALIGN="JUSTIFY">Board on Science and Technology for International Development </P>
+<P ALIGN="JUSTIFY">Office of International Affairs </P>
+<P ALIGN="JUSTIFY">National Research Council </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Cooperation with the Insect Farming and Trading Agency, Bulolo, Papua New Guinea </P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY">NOTICE: The project that is the subject of this report was approved by the Governing  Board of the National Research Council, whose members are drawn from the Councils of  the National Academy of Sciences, the National Academy of Engineering, and the  Institute of Medicine. The members of the committee responsible for the report were  chosen for their special competencies and with regard for appropriate balance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been reviewed by a group other than the authors according to the  procedures approved by a Report Review Committee consisting of members of the  National Academy of Sciences, the National Academy of Engineering, and the Institute  of Medicine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The National Research Council was established by the National Academy of Sciences in  1916 to associate the broad community of science and technology with the Academy's  purposes of furthering knowledge and of advising the federal government. The Council  operates in accordance with general policies determined by the Academy under the  authority of its congressional charter of 1863, which establishes the Academy as a  private, nonprofit, self-governing membership corporation. The Council has become the  principal operating agency of both the National Academy of Sciences and the National  Academy of Engineering in the conduct of their services to the government, the public,  and the scientific and engineering communities. It is administered jointly by both  Academies and the Institute of Medicine. The National Academy of Engineering and the  Institute of Medicine were established in 1964 and 1970, respectively, under the charter  of the National Academy of Sciences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Board on Science and Technology for International Development (BOSTID) of the  Office of International Affairs addresses a range of issues arising from the ways in which  science and technology in developing countries can stimulate and complement the  complex processes of social and economic development. It oversees a broad program of  bilateral workshops with scientific organizations in developing countries and conducts  special studies. BOSTID's Advisory Committee on Technology Innovation publishes  topical reviews of technical processes and biological resources of potential importance to  developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report has been prepared by an ad hoc advisory panel of the Advisory Committee  on Technology I innovation, Board on Science and Technology for International  Development, Office of international Affairs, National Research Council. Program costs  for the study were provided by the Office of Technical Resources, Bureau for Asia,  Agency for International Development under Grant No. ASB-0249-SS-00-1026-00 and  the Office of the Science Advisor, Agency for International Development, under Grant  No DAN/5538-GSS- 1023-00.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">First Printing, June 1983 </P>
+<P ALIGN="JUSTIFY">Second Printing, May, 1985 </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Panel_on_Butterfly_Farming_in_P"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Panel on Butterfly Farming in Papua New Guinea</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT M. PYLE, Chairman, Lepidoptera Specialist Group, International  Union for Conservation of Nature and Natural Resources, Gland,  Switzerland, Chairman </P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Director, Office of Biological Conservation, Smithsonian  Institution, Washington, D.C. </P>
+<P ALIGN="JUSTIFY">ARCHIE F. CARR, JR., Professor, Department of Zoology, University of Florida,  Gainesville, Florida </P>
+<P ALIGN="JUSTIFY">F. WAYNE KING, Director, Florida State Museum, C;ainesville, Florida </P>
+<P ALIGN="JUSTIFY">FRANCOlS MERGEN, Pinchot Professor of Forestry, Yale University, New  Haven, Connecticut </P>
+<P ALIGN="JUSTIFY">MICHAEL G. MORRIS, Head of Subdivision of Invertebrate Ecology,  Furzebrook Research Station, Institute of Terrestrial Ecology, Wareham,  Dorset, England </P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University  of Florida, Gainesville, Florida </P>
+<P ALIGN="JUSTIFY">SHELDON R. SEVERINGHAUS, Representative, The Asia Foundation, Taipei,  Taiwan </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Contributors_"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Contributors</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua New Guinea </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PETER CLARK, Manager, Insect Farming and Trading Agency, Bulolo </P>
+<P ALIGN="JUSTIFY">CAROLE GABARA, Wildlife Division, Department of Oro Province, Popondetta </P>
+<P ALIGN="JUSTIFY">WASAM GARARA, Wildlife Division, Department of Oro Province, Popondetta </P>
+<P ALIGN="JUSTIFY">KAROL KISOKAU, Director, Office of Environment and Conservation, Waigani </P>
+<P ALIGN="JUSTIFY">NAVU KWAPENA, Division of Wildlife, Department of Lands and  Environment, Konedobu </P>
+<P ALIGN="JUSTIFY">MIRO LAUFA, Crocodile Section, Department of Lands and Environment,  Konedobu </P>
+<P ALIGN="JUSTIFY">LEO NING, Division of Wildlife, East Sepik Province, Wewak </P>
+<P ALIGN="JUSTIFY">RODERICK ORARI, Butterfly farmer, Popondetta </P>
+<P ALIGN="JUSTIFY">MICHAEL PARSONS, Ecologist, Insect Farming and Trading Agency, Bulolo </P>
+<P ALIGN="JUSTIFY">BLU RAIRI, Butterfly farmer, Maprik  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Countries </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">K. S. BROWN, JR., Department of Zoology, State University of Campinas, Sao  Paulo, Brazil </P>
+<P ALIGN="JUSTIFY">N. M. COLLINS, Co-compiler, Invertebrate Red Data Book, International Union  for Conservation of Nature and Natural Resources, Cambridge, England </P>
+<P ALIGN="JUSTIFY">WAYNE GAGNE, Bishop Museum, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY">ANGUS HUTTON, Garaina Farms, Gympie, Queensland, Australia </P>
+<P ALIGN="JUSTIFY">ASHLEY C. MORTON, Department of Biology, The University, Southampton,  England </P>
+<P ALIGN="JUSTIFY">FRED PARKER, Kirwan, Queensland, Australia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">* * *</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, Professional Associate, Board on Science and Technology for International Development, Butterfly Study Director </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National Research Council Staff </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. R. RUSKIN, BOSTID Editor </P>
+<P ALIGN="JUSTIFY">MARY JANE ENGQUIST, Staff Associate </P>
+<P ALIGN="JUSTIFY">CONSTANCE REGES, Administrative Secretary </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Preface_"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly farming is a growing new industry in Papua New Guinea, and by  turning irdwings, mauve swallowtails, and other insects into a cash crop  villagers are both earning money and practicing sound wildlife conservation.  In this unique program butterfly farming is being used to complement the  preservation of species and of habitats. In balancing the utilization of  common butterflies with the protection of the most threatened species, Papua  New Guinea is providing a model for other countries, particularly those in the  tropics. The program demonstrates how village development can become an  integral part of conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel that produced this report convened in Papua New Guinea in  May 1981. Its purpose was to investigate the concepts underlying this  project and to assess their potential for application elsewhere. Panel members  met with staff of the government's Division of Wildlife in Port Moresby and  later visited butterfly farms in Popondetta and the insect trading agency in  Bulolo. The panel is grateful to Karol Kisokau, Navu Kwapena, and Miro  Laufa of the Division of Wildlife for arranging the itinerary in Papua New  Guinea and to Peter Clark and Michael Parsons for hosting the Bulolo and  Popondetta visits.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report is one of the National Research Council series, Managing  Tropical Animal Resources. Current titles in the series are:*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Water Buffalo: New Prospects for an Underutilized Animal (  1981 ) </P>
+<P ALIGN="JUSTIFY">· Little-Known Asian Animals with a Promising Economic Future  (1983) </P>
+<P ALIGN="JUSTIFY">· Crocodiles as a Resource for the Tropics (1983)</P>
+<P ALIGN="JUSTIFY">· Butterfly Farming in Papua New Guinea ( 1983)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These activities have been conducted under the auspices of the Advisory  Committee on Technology Innovation (ACTI) of the Board on Science and Technology for International Development, National Research  Council (see page 29). The purpose of ACT}iS the assessment of  unconventional scientific advances that might prove especially applicable to  problems of developing countries. Since its founding in 1971, it has produced  about 30 reports covering subjects as diverse as ferrocement construction  materials, the winged bean (a high-protein tropical food crop), and techniques  to provide more water for arid lands. This study adds the dimension of  conservation and ecosystem protection to ACTI'S principal concerns of  promising but neglected resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACTI activities are supported largely by the U.S. Agency for International  Development (AID). Program costs for this study were supported by AID'S  Bureau for Asia, and staff costs by AID'S Office of the Science Advisor, which  also made possible the free distribution of this report.  </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY">&nbsp;</P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"><A NAME="BM1_Introduction_and_Summary_"></A></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">1 Introduction and Summary</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The international demand for tropical butterflies is much greater than is  generally recognized. Each year millions of them are caught and sold  throughout the world. Many buyers are scientists engaged in research on  aspects of systematics, ecology, ethology, evolution, and conservation.  Others are individuals who like expensive curios that incorporate butterflies,  such as display cases, coffee tables, wall hangings, or other objects. But  increasingly, the fragile, iridescent creatures, mounted in plastic or glass, are  used to decorate less-expensive items such as purses, trays, platters, screens,  and other common objects in Europe, North America, and Japan. In addition,  amateur butterfly collecting, which reached a peak in Victorian times, is again becoming popular.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All this has produced a strong and active market. The current trade is  estimated to be between US $10 and $20 million annually, and the demand is  rising.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly Farming in Papua New Guinea </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Remote regions of Papua New Guinea are benefiting from this burgeoning  interest in tropical insects, and several hundred villagers are rearing or  collecting butterflies, beetles, and other insects for export. The Papua New  Guinea government now considers insects a national resource, and it has  made butterfly farming part of the nation's village economic development. At Bulolo it has established an Insect Farming and Trading Agency (IFTA) to  handle the business details of a growing international trade. And Papua New  Guinea is the only country so far to specify insect conservation as a national  objective in its constitution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Botanical research is the key to Papua New Guinea's butterfly farming  program. Local botanists and ecologists have identified the plants that the  various butterfly species use during their life cycle. The butterfly farmers  then build up their "livestock" by clearing small areas of ground  and planting leafy food plants for larvae, together with the nectar-producing  flowering plants that adult butterflies feed on. The combination of flowering  and leafy plants provides a complete habitat where butterflies find everything  they need to grow and reproduce. Therefore, most remain, and the farmer  retains his livestock without fences or walls.*</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are among the most unusual farms in the world. Around their edges  are hibiscus and bougainvillea that attract the adult butterflies, whose  mouthparts are adapted for drinking nectar from flowers. And inside are leafy  plants, such as the strange Dutchman's pipe vine (Aristolochia tagala), on  which the caterpillars of several birdwing butterflies feed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The enriched butterfly habitat in the villager's garden attracts and holds a  breeding population that becomes a self-renewing resource. By varying the  plant species the farmer can even maintain colonies of different butterfly  species. And because insects are so prolific, some butterfly farmers are  beginning to have problems with overstocking and have had to shift larvae  from plant to plantrather like moving cattle from one field to the next as the  grazing runs out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic Development </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The IFTA program started in 1974 with fewer than 30 Papua New Guineans  from villages in two provinces. By 1978, more than 500 villagers in 10  provinces had been introduced to farming or collecting butterflies for export.  Since then, business has been increasing about 40 percent a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gram for gram, exotic butterflies are far more valuable than cattle. Prices  paid by dealers in Europe, North America, and Japan range from 30 cents for  individuals of common species to around $10 for the two birdwing species  whose export is allowed. A specimen of a rarer species (for example, a female  of the mauve swallowtail Graphium weiskei) may bring as much as $50.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project is still an embryonic activity; it is not large, as development  programs go. IFTA has only one professional staff person and two local  technicians to handle the distribution of specimens. The agency's goal is to  export between 5,000 and 10,000 specimens a month, from which the villages  can expect a return of $10,000 or more.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agency purchases butterflies from villagers and uses them to fill orders from overseas buyers. Colorful beetles, strange-looking stick and leaf insects, and some moths and cicadas are also caught in the wild and sent to Bulolo. The profits, less 25 percent, are returned to the villagers. At the time of the panel's visit, IFTA had received about 4,000 shipments of butterflies and other insects from the rural people and had paid out about US $180,000 to purchase them. In 1979, the average farmer or collector received about $37 per box of specimens. By 1980, this had risen to about $50 per box. In 1981 it was estimated that a diligent butterfly farmer could earn an annual income of about $1,200.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Even so small an annual income is substantial in rural areas where the mean annual per capita income may be only $50. In many remote areas it is difficult to create income-producing opportunities because of illiteracy, dispersed population, and, in some cases, resistance to foreign ways.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through butterfly farming many rural Papua New Guineans are for the first time participating in a cash economy. The product is a highvalue, low-volume crop. It brings needed or supplementary income to the people of the predominantly rural areas. Compared with farming coffee, another possible industry in Papua New Guinea's rural regions, it requires far less effort or land, and it involves minimal costs to the producer. And where a few expatriate opportunists once made small fortunes exploiting Papua New Guinea's butterflies, the profits now go to the villagers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat loss is by far the most critical issue in butterfly conservation. If habitat changes, the animals must change, leave, or die. Usually they die, since alternative habitats are already occupied or too distant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nearly all the world's butterfly species have suffered diminished ranges, and an estimated half of the world's butterfly populations face threats from human development. From Britain to Bhutan, the insects' habitats have come under siege. In Europe, perhaps one-third of all butterfly species are threatened, owing chiefly to the reductions in their various habitats. In California, half-a-dozen coastal butterflies have been lost since the 1860s, and an equal number are now endangered. In Madagascar and Rwanda, swallowtails and some species that occur nowhere else are being sacrificed to the clearing of forests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The losses are much more than aesthetic, for many butterflies benefit people. They pollinate crops, are a major link in the food chain, and serve as sensitive indicators of ecological health.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A striking feature of the Papua New Guinea butterfly farming program is that it is designed to conserve and increase the species being traded. It is a pioneering conservation effort that has been endorsed by the Lepidoptera Specialist Group of the International Union for Conservation of Nature and Natural Resources. The program helps relieve pressure on endangered populations, because for successful butterfly farms the villagers must retain - and even foster - a healthy wild population on or near their land.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Insect farming also helps preserve habitats because it leaves the bulk of the land intact and it helps landowners earn money without requiring them to cut down the rain forest as they would for timber or for cocoa, coffee, or oil palm plantations. Similarly, villagers can retain their traditional hunting grounds while cropping the insects that rely on these grounds for survival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The existence of the butterfly farming project has served to focus attention on the status of all butterfly species. In 1968 this led to a law banning the taking of even a single specimen of the seven birdwing species threatened with extinction in Papua New Guinea. These large, brilliantly colored creatures can bring as much as $1,000 each in international trade, but there is a stiff fine in Papua New Guinea for even possessing one.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enriching habitats with butterfly food plants (notably the Dutchman's pipe vine, Aristolochia tagala) has greatly increased the numbers of Papua New Guinea's two common birdwing species, Ornithoptera priamus and Troides oblongomaculatus. Now the country is taking on the challenge of increasing the seven endangered birdwing species that are protected and banned from trade. Already the IFTA staff has found that at least one of these rare species (Ornithoptera victoriae) is easily reared on the Dutchman's pipe vine. Farms are now being designed and sited with a view to building up the populations of this giant endangered species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conclusions</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At this stage, the importance of this pioneering activity lies not in its size, but in the new vistas it opens up for the use of tropical resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Village Development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In farming butterflies, Papua New Guinea is showing that indigenous wildlife resources (especially those being depleted because of their commercial value) can contribute to economic development and that the farming of indigenous animals can be fitted smoothly into traditional village life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Providing employment in rural areas is a major problem of developing countries. And in a sense, butterflies are an "appropriate" livestock, particularly for remote areas of the tropics where other income-producing activities are difficult to establish or are harmful to traditional lifestyles and fragile environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterflies may seem unusual farm animals, but to villagers in the Papua New Guinea jungle it is cattle that are exotic. The villagers live in close contact with their local insects; invariably they know much about butterfly locations, behavior, habits, life cycle, and the food eaten by the caterpillars.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Farming butterflies is proving a business to which villagers quickly adapt. Butterflies do not require the equipment or financing of a conventional farm; no capital is required, except for postage on the first shipment of specimens. Insect farming allows people to participate in the cash economy without causing disruptive changes in traditional village life. The villagers can work long and hard if they wish or they can put in only enough time to produce a little cash for necessities, leaving plenty of time for raising crops and other village activities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat Conservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is often claimed that economic development is necessarily destructive to the environment and detrimental to conservation - that as rural societies develop, their natural surroundings must suffer. The Papua New Guinea butterfly farming project is an innovative program that demonstrates this need not be true.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The program also shows that where human needs are given attention, conservation can be successful. Elsewhere in the tropics, attempts to conserve habitat without considering the needs of the people who live nearby have often failed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In sum, the butterfly farming program demonstrates that certain natural resources can be used profitably in a way that protects the environment. The program offers a culturally appropriate use of the land; on a broad scale, it could become a force in preventing clear-felling of the forest for timber exports or the wholesale conversion of rain forest to cash-crop monocultures such as coconut, coffee, or oil palm. Most of Papua New Guinea is still covered by primary rain forest; exploiting the economic value of the insects that live there is helping safeguard this increasingly rare habitat, which is fast disappearing in most parts of the tropics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Species Conservation </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The knowledge gained from farming Papua New Guinea's butterflies has already contributed to relieving the threat of extinction from seven endangered species of birdwings. This experience could be replicated in other places where there are endangered butterfly species. Indeed, the program provides a model for nations that could profitably farm butterflies while protecting their threatened butterfly species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Extension to Other Organisms</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This project has a strategy and organizational structure that could well be applied to plants, such as rare orchids, and animals, such as crocodiles, that are endangered because of their commercial value. Indeed, using similar concepts of combining village income and conservation, the Papua New Guinea Division of Wildlife is farming crocodiles,* ruse deer, wallabies, and two native birds, the megapode and cassowary.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through such husbandry practices, many species elsewhere might be saved from extinction, while providing income to the local people who traditionally have used the resource. Other countries should look with interest at the way Papua New Guinea is handling its wildlife enterprises. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="BM2_Butterfly_Status_and_Conserva"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">2 Butterfly Status and Conservation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">About 100,000-150,000 species of butterflies have been described; perhaps half that number remain to be discovered. Although there are important concentrations in the Arctic and temperate regions, most species are found in the tropics. There, the diversity of colors and forms is dazzling; every imaginable combination of hue and color is displayed. And many tropical butterflies are enriched with "structural" colors, which cause the wings to flash iridescently in the sun as they bend the light they reflect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although butterflies have long been admired and often depicted in art, they have been seriously studied only since the end of the seventeenth century. Linnaeus, in his Systema Naturae, placed the small number of butterflies then known in the single genus Papilio. Today that genus is restricted to the true swallowtails, and more than 700 genera of butterflies are recognized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Butterfly Trade</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Last century, as knowledge of butterflies grew and methods of preserving them improved, they become popular collectors' items. Wealthy naturalists such as Rothschild and LeMoult dispatched collectors to all parts of the world for specimens. Today the trade in butterflies is even more extensive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are three major kinds of butterfly and insect trade. In one, large numbers of common species are collected in the wild and processed for use in ornamental objects such as coasters, mats, and lampshades. This is a low-value, high-volume industry that is both labor- and capital-intensive. It frequently uses "chipped" or slightly damaged butterflies. It often sells butterflies with paper bodies and only the wings of actual insects, which seem to be acceptable to a large part of the buying public.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Taiwanese butterfly trade is an example. It operates on a large scale. At least a dozen Taiwanese factories employ scores of workers to capture and process butterflies. Estimates of annual sales vary from 15 million to 500 million butterflies. Taiwanese butterfly wings pasted onto paper bodies with pig-bristle antennae are used in ornaments and household objects from wall hangings to clear-plastic toilet seats. The bodies are recycled as pig feed. Despite this massive trade, Taiwan's wild butterfly populations seem to be remaining steady.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Similar, though smaller, industries trafficking in common butterflies are found in Korea, Malaysia, Hong Kong, Brazil, Honduras, and several African nations. The famous blue morpho butterflies of the American tropics enter the trade at the rate of some 50 million per year. Nearly all of these are the brilliant iridescent males, and biologists believe the number sold could be doubled without harming the overall population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second type of trade involves higher value and lower volume. This produces a vastly different product from the paper-bodied butterflies bound for novelty stores. It is exemplified by the operation in Papua New Guinea where sales are to collectors, museums, and students, and the specimens are high-quality insects in good to perfect condition, usually bearing scientific data. Because of the relatively high value per specimen, this trade can be carried on by fewer individuals in a nonfactory setting, and it is well suited to village industry, provided there is supervision and a quality-control checkpoint.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The third type of butterfly trade is for high-quality, expensive ornamental items, such as glass cases, domes, wall mounts, or jewelry containing beautiful insects. Brazil, for example, has a thriving jewelry trade based on the iridescent blue morpho butterfly. This type of trade can also furnish high-paying outlets for village-farmed insects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p08.png"></center><br>
+ Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In all three divisions of the butterfly trade, dealers fulfill an essential role. Few collectors and scientists can travel the world collecting their own specimens. Some dealers have established reputations for honesty, some have not. Exploitation of suppliers and customers alike has been rife. Few dealers are careful to attach accurate locality data to their specimens; some make serious mistakes in identifying them. (To combat this problem, British insect dealers have formed an association to monitor conservation-related activities and improve professional practice.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Generally, dealers supply specimens bred from the caterpillar or chrysalis and described as "ex pupa." Unless butterflies are caught immediately after emerging from the pupa the fragile wings tear and the scales detach to produce "worn" specimens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly Taxonomy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Classifying butterflies is difficult. Their most obvious features, the color and pattern of the wings, vary greatly; individuals and populations of the same species often look quite different. This has led to the dubious naming of many species and subspecies. And the uncertainties it causes have led some biologists, especially those working in ecology and genetics, to name populations rather than species or subspecies. However, populations frequently evolve, and this introduces a further uncertainty. Much additional work on basic butterfly systematics is needed. The knowledge gained should contribute particularly to the conservation of endangered species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly Conservation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly conservation is still in an early state of development, bedeviled by scarce or incomplete information. The conservation status of even the most thoroughly studied butterfly species is known in only a few areas. The distribution and status of most species is essentially unknown, and proposals for conservation measures are largely based on guesswork. Nevertheless, some conservation programs have been enacted. Most have concentrated on designating endangered species and banning their collection.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The greatest threat to butterflies and other insects, however, is habitat alteration. On several continents some species have already become extinct or endangered when humans altered the special environment they require. The importance of protecting butterfly habitats should not be underrated. Many species are restricted to very small areas, particularly to individual islands (Corsica, Sardinia, Jamaica, Madagascar, Sumba, the Comoros, Fiji, the Solomon Islands, Manus, and the Duke of York Islands, for instance). Such species are vulnerable to extinction because nearly all island habitats are fragile and are changing rapidly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it is uncommon for insect species to be dangerously reduced merely by the capture of specimens, renewed commercial interest in butterflies gives rise to concern for their conservation. Most insects reproduce rapidly, and their high fecundity enables them to replace such losses in a generation or two - provided the basic environment has not been altered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But there are certain species of butterfly that reproduce slowly and are therefore more threatened by collection. The unusual birdwing butterflies of New Guinea, for example, produce only small broods. Moreover, these rare species command higher prices. Because this makes them particularly vulnerable, legislation to protect birdwing butterflies has been instituted in both parts of New Guinea - Papua New Guinea and Irian Jaya.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Accordingly, to save Queen Alexandra's birdwing (the largest and most threatened of the birdwings) from extinction, several wildlife management areas have been set up in Popondetta on Papua New Guinea's north coast. The government is also setting up refuges, administered by village councils, to preserve and protect other birdwing butterflies and wildlife resources. This habitat conservation is an important adjunct to the butterfly farming program. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="BM3_History_and_Government_Policy"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">3 History and Government Policy</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Soon after Europeans discovered New Guinea's remarkable insect fauna around the turn of the century, collectors began arriving, and they have been coming ever since. Many were reputable professional or amateur scientists, gathering modest numbers of specimens for study and for museums, including Papua New Guinea's own national collection. Others, however, were plunderers who carried away large numbers of rare butterflies, giving little or no compensation to the local people and showing no concern for survival of the species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1966 the Papua New Guinea government responded to excessive collecting by designating seven rare birdwing butterflies as protected species. It became illegal to collect these huge, colorful birdwings, and strong measures were instituted - fines for nationals, deportation of expatriates - to halt black market trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the late 1960s and early 1970s commercial collecting of the other butterfly species continued piecemeal and unsupervised. Income was erratic, and expatriate dealers often paid their Papua New Guinean suppliers only a few cents for specimens that retailed for several hundred dollars in Europe and Japan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Insect Farming and Trading Agency</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When Papua New Guinea achieved independence in 1975, the new government decreed that only nationals should profit from the country's butterfly resource. Since that time only Papua New Guineans have been able to export butterfly specimens (nonprotected species) for profit. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1978, to guarantee Papua New Guineans fair prices and stable sales, a marketing agency was established. Its purpose was to protect the resource, to foster butterfly farming, and to ensure a high-quality export product.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Modest in its beginnings, the Insect Farming and Trading Agency (IFTA) was organized by Angus Hutton, a former tea planter and amateur lepidopterist. The business side of the agency was later developed by Peter Clark, who had worked with Hutton. Identification and production of food plants was advanced by Michael Parsons, Robert Pyle, and others.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IFTA provides a market for those Papua New Guinea nationals who farm and collect butterflies and other insects. The agency allows them to obtain fair and fixed prices, maintains quality control, and ensures that current data accompanies all specimens. It also pools the insects from many sources and fills large orders from overseas dealers. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of the butterflies IFTA exports, about 30 percent are from village farms and 70 percent are collected in the field. However, more than 50 percent of the revenue is made up of the farmed butterflies because of their better quality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Quality Control</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agency strives to sell only highest-quality insects; it rejects many butterflies as substandard. Most specimens are sold as named subspecies and to identify and name them requires much skill. Staff members have been specially trained to do this. (To a large extent, the area of origin, particularly in the case of the offshore islands, defines the subspecies concerned.) Locality data, usually consisting of village, province, and month and year of collecting or emergence, is affixed to all butterfly envelopes before they are pooled at the agency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IFTA stores its collection by species, in simple wooden boxes kept in cupboards lit from below (to lure potential pests away from the insects and to warm the cupboards and prevent mold). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Marketing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agency makes up orders and dispatches them (with the required export permits) to customers "on trust." Although this is open to abuse, most buyers pay promptly and the system is easy and convenient. Careful records are kept of all suppliers, customers, and species in stock.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the time of the panel's visit, about 80 percent of the agency's business consisted of responding to requests from dealers. However, less than 10 percent of the orders received from all sources could be filled.Some requests were too small and others too specialized; in some cases the agency simply didn't have the specimens on hand (for example, a request for all the subspecies of a given butterfly). Furthermore, the agency has neither the office staff nor space to cope with every order in a business whose volume is almost doubling every two years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Field Extension</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wildlife extension officers periodically visit clients and new villages to sustain or develop enthusiasm for insect farming. They explain and demonstrate the procedures of butterfly farming and collecting and teach potential farmers how to recognize a valuable species in each of its life stages. Above all, they demonstrate how to prepare specimens for sale. This is because it is often difficult to convince farmers of the need for extreme care and delicacy in handling, and many inexperienced farmers send in bruised or hopelessly damaged specimens. Although about 500 villagers were farming butterflies at the time of the panel's visit, fewer than 50 were supplying good material regularly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These contacts are also important because the butterfly farmers easily become discouraged if no interest is shown in their work. In the Papua New Guinea countryside there is often little need for cash; people can obtain all their food, clothes, shelter, and resources from their gardens or from the bush. Money received from one shipment of butterflies may last a subsistence farmer for months, making it difficult for the agency to sustain his interest in providing regular shipments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agency's extension officers have initiated a number of butterfly farming projects at primary, secondary, and vocational schools. These projects have proved most successful. Apart from the practical education they give students, they provide early insight into one of Papua New Guinea's most useful resources. Several vocational schools also provide training in mounting butterflies and beetles as souvenirs for tourists, as well as in the construction of hatching cages and solar driers. Beautiful wooden cabinets to hold butterflies have also been made by some teenage students.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research and Monitoring</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to teaching Papua New Guineans to collect and farm insects, IFTA promotes research both to conserve species and to make them available in quantity. Success has already been achieved in farming the common birdwing butterflies by planting large numbers of the Dutchman's pipe (Aristolochia tagala) vines that they feed on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agency's staff includes an ecologist, indicating the importance of the scientific basis for conservation in this project. The ecologist is at hand to conduct research on life histories, farming methods, and management measures for rare species.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">IFTA staff are now identifying new food plants that will permit more species to be farmed. Research into the life histories of many butterflies with economic potential is well under way, so that an increasing number of species will become "farmable" and will be available in future in perfect ex pupa condition. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sources of all specimens received by IFTA are recorded on a map so that a butterfly's range and rarity or abundance can be assessed and conservation measures implemented where necessary. In this way, even insects too damaged for sale at least have value to conservation efforts. All specimens of unusual scientific interest are lodged in the national insect collection for future study. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="BM4_Operating_a_Butterfly_Farm"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">4 Operating a Butterfly Farm</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Planting the Farm</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The key to farming butterflies is to establish a garden of the plants the various species need for their life cycles. The ideal farm area is about 0.2 hectares. This is spacious enough for growing food plants for adults and larvae and small enough to keep the plants watered, weeded, pruned, and generally well tended. Such a farm can contain about 500 vines, grown like bean plants on poles or shade trees.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important to surround the site with a thick hedge of hibiscus, bougainvillea, ixora, poinsettia, or other nectar-bearing plants whose flowers attract adult butterflies and encourage them to remain in the area. The hedges also keep out pigs and other livestock that may damage the leafy plants inside the farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A good way to start a farm is to establish it in a vegetable garden. (Papua New Guinea butterfly farmers often plant butterfly vines between their rows of sweet potato or tarot) By the time the vegetables are ready to harvest, the area already has some thriving butterfly food plants and probably some winged livestock as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most successful butterfly food plants in Papua New Guinea is Aristolochia tagala, a vine on which the larvae of more common birdwing butterflies feed. Another is Evodea - a food plant of the large blue ulysses swallowtail and many colorful weevils.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shade trees also can be food plants for butterflies other than birdwings and for beetles or weevils. Examples are species of Annona (such as soursop), Citrus (such as lemon), Cerbera, and Graptophyllum. Wallace's Longhorn Beetle feeds on breadfruit (Artocarpus communis). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Normally, one area of the farm is kept aside for growing seeds or cuttings. (IFTA sells seed of some suitable species.) In this nursery the butterfly food plants are watered and cared for, and unhealthy ones are easily spotted and weeded out. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p16.png"></center><br>
+ Stylized diagram of a butterfly farm:</P>
+<P ALIGN="JUSTIFY">A Hedge of hibiscus, ixora, and poinsettia to keep pigs out and provide nectar.</P>
+<P ALIGN="JUSTIFY">B Fruits trees (such as lemon).</P>
+<P ALIGN="JUSTIFY">C The aristolochia vine grown on the branches of others trees (such as leucaena), to feed    caterpillar larvae.</P>
+<P ALIGN="JUSTIFY">D Nursery area.</P>
+<P ALIGN="JUSTIFY">E A hut for tools.</P>
+<P ALIGN="JUSTIFY">(Diagram courtesy IFTA, Bulolo)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Life Cycle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Normally, each butterfly species has a preferred food plant for its larvae. After the female has mated she searches for the correct plant and lays her eggs on or near it. In a few days the eggs hatch, and the young caterpillars usually eat their own eggshells and begin feeding on the softer leaves and shoots of the food plant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As they grow, the caterpillars shed their skins. Each molt is called an instar, and five instars occur before a larva is big enough to pupate. Pupation is a resting stage during which the adult butterfly develops inside the hard, protective chrysalis. For pupation the larva selects the underside of a stem or leaf to protect it from rain and predators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After 10 days to 3 weeks, depending on the type of butterfly, the pupal case splits open and the adult insect emerges. This usually occurs before 9 o'clock in the morning. The freshly emerged adult then takes from 3 to 4 hours to expand and dry its wings before flying off to feed on nectar and to search for a mate to begin the life cycle once again. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Harvesting</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Once the farm is well established, pupae can be collected daily. Ideally, about 50 percent should be left or released. At least as many females as males should be released. Pupae that are too high to reach are usually left to emerge naturally and repopulate the farm. Others are left because they are not quite perfect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The farmer can usually see that emergence will occur on the next day, since the pupa becomes darker in color as the adult wing and body colors develop. He then plucks off the stem or leaf to which the pupa is attached. (The soft, new pupae are not touched because this damages the adult.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He pins the leaf to a board or puts it in a net or in a small cage. Often these are kept inside to protect the pupae against pests and large predators. However, some farmers construct small houses out of bush materials to hold pupae ready for hatching. Others keep their pupae in the open and count on being able to collect the adults before they have flown away.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Care is taken to protect the specimens from ants and rats. For example, the legs of the cage are placed in bowls of water to deter ants from climbing up. The pupae are sprayed with water 2-3 times a week to speed up the hatching process and to prevent them from drying out. (Only a light spray is used; otherwise the pupa develop mold.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The pupae are best kept in a shady place so the butterflies will remain calm after hatching and will not flap and damage their wings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Processing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the newly emerged butterfly has completely dried its wings, it is carefully caught by the thorax and injected with a small amount of a killing agent such as ethyl acetate or boiling water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small butterflies are particularly easily damaged if handled, so they are placed for about 10 minutes in a killing jar containing cotton (cotton wool) soaked with a little ethyl acetate. A layer of cardboard is placed above the cotton so that the butterflies are not stained by the solvent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The farmer places the dead butterflies in paper envelopes, being careful at all times not to touch or damage the wings. The envelopes are easily made from grease-proof paper, which the agency supplies on request.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To ensure that the butterflies will not mold, they are placed on a black plastic tray and dried in the sun, in their papers, for about 4 days. During this time they are protected from pests such as ants, and the drying trays have a screen on top to prevent the envelopes from blowing away or from being rained on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Once properly dried, the insects, still in their envelopes, are stored in boxes, preferably airtight to prevent condensation and molding. When enough specimens have been collected, the villager packs them carefully in strong cardboard boxes (which the agency also supplies) with cotton or kapok. A few naphthalene crystals are added to keep away pests, and the box is wrapped and sent to Bulolo. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="BM5_Application_to_Other_Nations"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">5 Application to Other Nations</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As noted, the essence of the Papua New Guinea approach is the cultivation of food plants that the butterflies need to complete their life cycles. This is a process that could be replicated elsewhere, and the potential for butterfly farming exists in many countries. In fact, although Papua New Guinea is rich in butterfly species - some 700 of them - it is not unusually so. Other countries also have large numbers of species. There are, for instance 2,500 species known in Costa Rica.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are some 14,000 species of true butterflies in the world. Although there is possible competition, many countries have no overlap in species at all. As collectors and specialists usually want butterflies from many different parts of the world, the likely competition among countries exporting farmed or wild-caught butterflies is minimal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterflies are supplied to the trade from nearly every part of the world. But because they are most diverse in the tropics, it is likely that the best chance for success in farming them lies there. However, some temperate countries also have an abundance of particular species, and in Europe, the United States, and Japan, butterfly farming is already established on a small scale. This is mainly because many collectors like to rear their own material and they purchase eggs, caterpillars, or chrysalids instead of killed adults. Many dealers in these countries supply a few tropical species that are easy to rear, such as the orchard swallowtail (Papilio aegeus). However, this trade is generally low in volume and value, and temperate-zone butterfly farms are little more than a sideline to normal dealerships.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some general comments follow on the potential of butterfly farming in various parts of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Temperate regions of the Old World (Palaearctic Realm). East palaearctic species are in great demand internationally and obtainable with great difficulty. China, in particular, has species of both Parnassius and Papilio that might be farmed. However, all Parnassius species are montane to some degree and none has been farmed yet. Eurasian arctic satyrids, lesser fritillaries, and sulphurs are also in great commercial demand and could perhaps be farmed. Swallowtails are few and are frequently protected.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Tropical Africa and associated islands (Afrotropical Region). The potential for butterfly farming has not yet been considered in Africa, although the diversity of desirable species is great and the potential market extensive. This area has important swallowtails and Charaxes species (Nymphalidae), but so far as is known, no farming enterprises exist. Experimental or trial farms for butterflies are needed in different parts of Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Indian subcontinent and Southeast Asian tropics (Oriental Realm). Silk moths, such as Bombyx mori, are commercially farmed in Asia, and butterfly farming would seem to be a natural extension of this. Many Asian butterflies are supplied to dealers, especially from Taiwan and the Philippines, but there is little farming. A very large trade originates in Malaysia, especially for Rajah Brooke's birdwing (Trogonoptera brookiana). Farming is reputed to take place, but most specimens are actually collected. Desirable species of swallowtails, including the black and gold birdwings (Troides species), occur throughout the region. Species belonging to the families Nymphalidae and Pieridae are good candidates for farming, as they are in much demand from dealers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Australia, New Guinea, and associated islands to the west (Australasian Realm). Australia is not rich in butterflies, but it has some important endemic species. At least one "farm" exists in Australia, but this appears to be an offshoot of a normal dealership, which rears a few local species to supply at early stages to collectors. Farming is to be encouraged here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Guinea's most coveted butterflies, which it shares with Irian Jaya, are the Ornithoptera birdwings. But almost equally desired by collectors and specialists are the Troides birdwings, concentrated to the west of New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Temperate regions of the Americas (Nearctic Realm). There is a considerable trade in New World butterflies from nearly every family (few Lycaenidae and Hesperiidae), but almost all are caught in the wild. There is a strong market for far-northern species (Boloria, Colias, Erebia, Oenesis). Farming these might be possible among Canadian and Alaskan Indian or Eskimo groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Tropical regions of the Americas (Neotropical Realm). This is a likely area for the development of butterfly farming, particularly as its species are completely different from those of the tropics elsewhere. The Morpho and Agrias species of South America are much desired by collectors. It is possible that some of the highly prized morpho butterflies are already farmed (as the law, in fact, requires), but evidence is conflicting, and most biologists believe that the major supply of specimens is from wild populations. Other groups that lend themselves to farming include the swallowtails, nymphalids (including Agrias), and certain members of the family Satyridae. There are large fauna of Riodinidae and Lycaenidae that are potentially suitable for farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A dealer in preserved butterflies has recently set up business in the Dominican Republic, and butterfly farms have been established in Costa Rica.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· General. Butterflies in the family Riodinidae and, especially, Lycaenidae seem to be a neglected resource. Many species are relatively small but brightly colored. A major difficulty is that many Lycaenidae have to live with ants for part of their lives and this complicates their rearing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly Parks</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some regions with tourist industries are showing interest in establishing "butterfly zoos" or "butterfly jungles." These displays have live butterflies (usually farmed or reared) in artificial habitats resembling the natural ones. Some species, such as the orchard swallowtail (Papilio aegeus), respond well to such conditions. One British dealer has a "tropical jungle" in an enclosed environment in which both temperature and atmospheric pressure are regulated. A large British butterfly zoo has been established and a smaller one has been proposed. The New York Zoological Society is developing a butterfly component in its Wild Asia Hall at the Bronx Zoo, and San Francisco, Portland, Cincinnati, and Tokyo all have thriving insect zoos. Also, the Colombo Zoo in Sri Lanka has a live display and a successful program of butterfly rearing. Similar enterprise could be shown in other places with tourist industries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Starting a Butterfly Farm</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Butterfly farming is initially an ecological and botanical challenge. One must first observe, identify, and propagate the plants that the various species use for food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Success for butterfly farmers rests on their choosing commercially attractive species. Unfortunately, ecological details of the life histories of suitable species are known in only a few cases. The prospective farmer will be largely on his own and must first develop this information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of the most desirable species are native to primary tropical forests, and they may need protection because of the rate at which their habitat is being destroyed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any program to commercially exploit butterflies and other insects must either bypass the rarest, most restricted, and slowest reproducing species; farm them cautiously with a high percentage of adults released; or take them with the greatest of care. Further, there must be adequate habitat protection both in the natural state and in mixed land uses (rather than just agricultural croplands) to support the insects and furnish a continuing supply.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some competition could occur if live butterflies were exported between countries and used to establish farming enterprises. In general, however, butterflies are easier to farm in their native habitats. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Appendix_A"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendixes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">A Selected Readings</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Carvalho, J. C. M., and O. H. H. Mielke. 1972. The trade of butterfly wings in Brazil and its effect upon survival of the species. Proceedings 19th International Congress of Entomology (Moscow) 1 :486-488.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fenner, T. L. 1976. Aspects of butterfly conservation in Papua New Guinea, Pp. 121-127 in Ecology and Conservation in Papua New Guinea, K. P. Lamb and J. L. Gressitt eds. Pamphlet 2. Wau Ecology Institute, Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parsons, M. n.d. Insect Farming and Trading Agency Farming Manual. Insect Farming and Trading Agency, Division of Wildlife, P.O. Box 129, Bulolo, Morobe Province, Papua New Guinea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pyle, R. 1981. Butterflies: now you see them.... International Wildlife I I (1):4- 11.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pyle, R., M. Bentzien, and P. Opler. 1981. Insect conservation. Annual Review of Entomology 26:233-258.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pyle, R. M. and S. A. Hughes. 1978. Conservation and utilization of the insect resources of Papua New Guinea. Unpublished report, copies available from the author, see Research Contacts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Severinghaus, S. R. 1977. The butterfly industry and butterfly conservation in Taiwan. Atala 5(2):20-23.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unno, K. 1974. Taiwan's butterfly industry. Wildlife 16: 356-359.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vietmeyer, N. D. 1979. Butterfly ranching is taking wing in Papua New Guinea. Smithsonian 10(2):119-135. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Appendix_B"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix B</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Research Contacts</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wayne Gagne, Bishop Museum, P.O. Box 6037, Honolulu, Hawaii, 96818 USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angus Hutton, Garaina Farms, Scrubby Creek Road, Gympie 4570, Queensland, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Insect Farming and Trading Agency, P.O. Box 129, Bulolo, Morobe Province, Papua New Guinea (Peter Clark, Manager; Michael Parsons, Ecologist)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Karol Kisokau, Director, Office of Environment and Conservation, Central Government Offices, Waigani, Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Navu Kwapena, Division of Wildlife, Department of Lands and Environment, Konedobu, Papua New Guinea</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rudi Mattoni, 9620 Heather Road, Beverly Hills, California 90210, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Michael G. Morris, Chairman, Butterfly Specialist Group, International Union for Conservation of Nature and Natural Resources, Furzebrook Research Station, Institute of Terrestrial Ecology, Wareham, Dorset BH20 5AS, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ashley C. Morton, Department of Biology, Building 44, The University, Southampton S09 5NH, England</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fred Parker, 717 Ross River Road, Kirwan, Queensland 4814, Australia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert M. Pyle, Chairman, Monarch Project, Xerces Society, 369 Loop Road, Gray's River, Washington 98621, USA</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sheldon R. Severinghaus, Representative, The Asia Foundation, 42, Chien Kuo North Road, Taipei 104, Taiwan, Republic of China </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Appendix_C"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Appendix C</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Biographical Sketches of Panel Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EDWARD S. AYENSU, Director of the Office of Biological Conservation, Smithsonian Institution, Washington, D.C., is currently the Secretary-General of the International Union of Biological Sciences. He received his B.A. in 1961 from Miami University in Ohio, M.Sc. from The George Washington University in 1963, and his Ph.D. in 1966 from the University of London. His research interests are in comparative anatomy and phylogeny of flowering plants, commercial timbers, histology of monocotyledons, economic botany, and tropical biology. An internationally recognized expert on tropical plants, he has published extensively in these areas and on topics relating to science, technology, and development, especially in developing countries. Dr. Ayensu was co-chairman of the Panel on Under exploited Tropical Plants of the Advisory Committee on Technology Innovation and chairs and serves as a member of many international bodies. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ARCHIE F. CARR, JR., is Graduate Research Professor in the Department of Zoology, University of Florida, Gainesville. As Technical Director of the Caribbean Conservation Corporation, he has directed a seasonal research program at the breeding ground of the green turtle at Tortuguero, Costa Rica, since 1952, with continuous grants from the National Science Foundation from 1955 to 1980, and has carried out investigations of marine turtle ecology and navigation in various parts of the world. The author of numerous papers, articles, and books, he received the Daniel Giraud Elliot Medal of the National Academy of Sciences for Handbook of Turtles and the John Burroughs Medal for The Windward Road. He is Research Associate of the American Museum of Natural History; Affiliate Curator of Natural Sciences, Florida State Museum; Chairman of the Marine Turtle Specialist Group of the Survival Service Commission, International Union for the Conservation of Nature; Honorary Consultant of the World Wildlife Fund; Fellow of the Linnean Society of London; Fellow of the American Fisheries Society; and a member of Phi Beta Kappa and Sigma Xi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1973 he was awarded a gold medal from the World Wildlife Fund for the application of scientific findings to the conservation of marine turtles. In 1975 he received the Edward W. Browning Award for achievement in biological conservation. In 1978 Dr. Carr was awarded the Gold Medal of the New York Zoological Society for contributions to natural science and conservation; in 1978 he became Officer of the Order of the Golden Ark (The Netherlands).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F. WAYNE KING is the Director of the Florida State Museum, Gainesville. He received a B.S. in 1957 and an M.S. in 1961 from the University of Florida and a Ph.D. from 1966 from the University of Miami. His research interests are in wildlife conservation and habitat preservation, impact of international trade on wildlife populations, and ecology and behavior of reptile populations. He worked at the New York Zoological Society from 1967 to 1975. As an international wildlife consultant, Dr. King has received honors from the Dominican Republic, the American Association of Zoological Parks and Aquariums, and from H.R.H. Prince Bernhard of The Netherlands. He has served on committees advising the State Department and the International Union for Conservation of Nature and Natural Resources on policies regarding the trade of crocodile skins, turtle products, and other wildlife materials. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOlS MERGEN, Pinchot Professor of Forestry and Professor of Forest Genetics, Yale University, was Dean of the School of Forestry and Environmental Studies at Yale from 1965 to 1975. He received a B.A. from Luxembourg College and a B.Sc.F. from the University of New Brunswick in 1950, an M.F. in ecology in 1951, and a Ph.D. in forest genetics from Yale in 1954. He is especially knowledgeable about francophone Africa and was chairman of the Sahel program of the Board on Science and Technology for International Development and a member of the Advisory Committee on Technology Innovation. From 1960 to 1965 he was research collaborator at the Brookhaven National Laboratory. In 1966 he was the recipient of the Award for Outstanding Achievement in Biological Research from the Society of American Foresters and in 1975 was Distinguished Professor (Fulbright-Hays Program) in Yugoslavia. Before joining the Yale faculty, he served as project leader in forest genetics for the U.S. Forest Service in Florida. He has served as a consultant to FAO, various foreign governments, and private forestry companies, and he has traveled extensively in the tropical countries of Asia, Africa, and Latin America. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. MORRIS is head of the Furzebrook Research Station of the Institute of Terrestrial Ecology (National Environment Research Council, U.K.). He received a B.A. in natural sciences (zoology) at the University of Cambridge of 1958, M.A. in 1962, and received his Ph.D. from London University in research on the integrated control of orchard pests. Dr. Morris worked at Monks Wood Experimental Station on the effects of grassland management on populations of invertebrates and developed a strong interest in community and applied ecology, particularly the conservation of insect populations. Recently he has become involved with problems of butterfly conservation and resource utilization. He is Secretary of the Joint Committee for the Conservation of British Insects, a Vice-Chairman of the Lepidoptera Specialist Group of lUCN'S Survival Commission, and Chairman of the Habitat and Species Protection Committee of SEL (Societal Europaea Lepidoptero-Logica). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH L. POPENOE is Professor of Soils, Agronomy, Botany, and Geography and Director of the Center for Tropical Agriculture and International Programs (Agriculture) at the University of Florida. He received his B.S. from the University of California at Davis in 1951 and his Ph.D. in soils from the University of Florida in 1960. His principal research interest has been in the area of tropical agriculture and land use. His early work on shifting cultivation is one of the major contributions to this sytem. He has traveled and worked in most of the countries in the tropical areas of Latin America, Asia, and Africa. He is past Chairman of the Board of Trustees of the Escuela Agricola Panamericana in Honduras, Visiting Lecturer on Tropical Public Health at the Harvard School of Public Health, and a Fellow of the American Association for the Advancement of Science, the American Society of Agronomy, the America Geographical Society, and the International Soils Science Society. He is Chairman of the Advisory Committee for Technology Innovation and a member of the Board on Science and Technology for International Development. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT MICHAEL PYLE, a writer and consulting lepidopterist based in Gray's River, Washington, has served since 1979 as Co-Compiler of the lUCN Invertebrate Red Data Book. In this capacity he is consultant to the Conservation Monitoring Centre in Cambridge, England. After receiving his B.S. and M.S. at the University of Washington, he took his Ph.D. through the School of Forestry and Environmental Studies at Yale University in 1976. He worked for the Government of Papua New Guinea on the conservation and utilization of insect resources and then with the Nature Conservancy as Northwest Land Steward. A </P>
+<P ALIGN="JUSTIFY">former Fulbright Scholar to the United Kingdom, Dr. Pyle subsequently founded the Xerces Society for conservation of beneficial insects and their habitats. He has been chairman of IUCN'S Lepidoptera Specialist Group (Species Survival Commission) since 1976. His publications include the Audubon Society Field Guide to North American Butterflies. A comprehensive book on insect conservation in his next project.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SHELDON R. SEVERINGHAUS received his Ph.D. from Cornell University in 1977 in natural resources management. He has worked on various wildlife research projects in Asia since 1964 and is representative for the Asia Foundation in Taiwan. He has published articles on butterfly conservation and wildlife industries in Taiwan, where he has been studying the butterfly and wildlife farming projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NOEL D. VIETMEYER, staff officer for this study, is Professional Associate of the Board on Science and Technology for International Development. A New Zealander with the Ph.D. in organic chemistry from the University of California, Berkeley, he now works on innovations in science that are important for developing countries. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Advisory_Committee_on_Technolog"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Advisory Committee on Technology Innovation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM BRADLEY, Consultant, New Hope, Pennsylvania </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HAROLD DREGNE, Director, International Center for Arid and Semi-Arid Land Studies, Texas Tech University, Lubbock, Texas (member through 1981) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L.GADEN,JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CARL N. HODGES, Director, Environmental Research Laboratory, Tucson, Arizona </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CYRUS MCKELL, Native Plants, Inc., Salt Lake City, Utah </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FRANCOIS MERGEN, Pinchot Professor of Forestry, School of Forestry and Environmental Studies, Yale University, New Haven, Connecticut (member through 1982) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DONALD L. PLUCKNETT, Consultative Group on International Agricultural Research, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THEODORE SUDIA, Deputy Science Advisor to the Secretary of Interior, Department of Interior, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+</FONT><FONT FACE="Arial" SIZE=2 COLOR="#0000ff"><P ALIGN="JUSTIFY"><A NAME="Board_on_Science_and_Technology"></A></P>
+</FONT><B><FONT FACE="Arial" SIZE=2><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Board on Science and Technology for International Development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE BUGLIARELLO, President, Polytechnic Institute of New York, Brooklyn, New York, Chairman </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Members</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SAMUEL P. ASPER, Educational Commission for Foreign Medical Graduates, Philadelphia, Pennsylvania </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DAVID BELL, Department of Population Sciences, Harvard School of Public Health, Boston, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LEONARD BERRY, Professor, Graduate School of Geography, Clark University, Worcester, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ERNEST J. BRISKEY, Dean, School of Agriculture, Oregon State University, Corvallis, Oregon </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HARRISON S. BROWN, Director, Resources Systems Institute, East-West Center, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROBERT H. BURRIS, Department of Biochemistry, University of Wisconsin, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CLAUDIA JEAN CARR, Associate Professor, Conservation and Resource Studies, University of California at Berkeley, Berkeley, California </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NATE FIELDS, Director, Developing Markets, Control Data Corporation, Minneapolis, Minnesota </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ROLAND J. FUCHS, Chairman, Department of Geography, University of Hawaii at Manoa, Honolulu, Hawaii </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ELMER L. GADEN, JR., Department of Chemical Engineering, University of Virginia, Charlottesville, Virginia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JOHN HOWARD GIBBONS, Director, U.S. Congress, Office of Technology Assessment, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N. BRUCE HANNAY, Foreign Secretary, National Academy of Engineering, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM HUGHES, Director, Engineering Energy Laboratory, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WILLIAM A. W. KREBS, Vice President, Arthur D. Little, Inc., Acorn Park, Cambridge, Massachusetts </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GEORGE 1. LYTHCOTT, University of Wisconsin, School of Medicine, Madison, Wisconsin </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">JANICE E. PERLMAN, Executive Director, Committee for a New New York, New York City Partnership, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUGH POPENOE, Director, International Programs in Agriculture, University of Florida, Gainesville, Florida </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK C. ROBBINS, President, Institute of Medicine, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WALTER A. ROSENBLITH, Foreign Secretary, National Academy of Sciences, Washington, D.C. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FREDERICK SEITZ, President Emeritus, The Rockefeller University, New York, New York </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RALPH HERBERT SMUCKLER, Dean of International Studies and Programs, Michigan State University, East Lansing, Michigan </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GILBERT F. WHITE, Institute of Behavioral Science, University of Colorado, Boulder, Colorado </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BILL C. WRIGHT, Assistant Dean for International Programs, Oklahoma State University, Stillwater, Oklahoma </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">JOHN C. HURLEY, Director</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL G. C. McDONALD DOW, Associate Director/Studies </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MICHAEL P. GREENE, Associate Director/Research Grants </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/ec158e/ec158e.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/ec158e/ec158e.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/ec158e/ec158e.htm	(revision 21083)
@@ -0,0 +1,2772 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; The Courier - N°158 - July - August 1996 Dossier Communication and the media - Country report Cape Verde</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P ALIGN="JUSTIFY"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The Courier - N°158 - July - August 1996 Dossier Communication and the media - Country report Cape Verde</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">AFRICA-CARIBBEAN-PACIFIC - EUROPEAN UNION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dossier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Communication and the media</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Press freedom, regarded as a fundamental human right, is also a key component in the democratization process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With the help of experts in the field, we look at what various organizations are doing to combat censorship and promote a free press in ACP countries and elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We also highlight the new trend of donor support for projects aimed at promoting press freedom. These include, notably, provisions for the training of journalists. And as new means of communication, such as the World Wide Web, develop, we consider what is being done to prevent the opening up of a new divide - this time between the 'information rich' end the 'information poor'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Country report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among the least-developed countries, Cape Verde is seen as a model of good governance and stable democracy. It is also admired for its perseverance in the struggle against the exigencies of history and climate. The country suffers from almost permanent drought and has virtually no regular supplies of fresh water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Its history has been punctuated by serious famines and while the people are no longer hungry, they still face formidable economic difficulties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde produces just 10% of what it consumes and its exports are one fifteenth of its imports. The one bright spot is in services, where it enjoys a positive trade balance. This sector (in particular, international transport and tourism), together with the country's cultural industries, offer the best hope for future development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Meeting point</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Robert M&eacute;nard, Director of 'Reporters sans fronti&egrave;res'</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Combating attacks on press freedom</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Reporters sans fronti&egrave;res' was founded in June 1985 in Montpellier where Robert M&eacute;nard was working as a journalist with Radio France. Now based in Paris, RSF has two main policy areas. In the first place it alerts international public opinion and the media to situations involving violations of press freedom (via publications such as 'RSF News letter' the Annual Report and specific books and reports). Secondly, RSF actively intervenes by sending letters of protest to official bodies and assisting victims. Last year RSF dealt with more than 350 cases involving the press throughout the world. The organisation's ambition, according to Mr M&eacute;nard, is to be a kind of Amnesty International in the press field. The interview began with Mr M&eacute;nard giving a detailed description of RSF's work.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - We do two things - we report violations of press freedom and help journalists who are the victims of such violations. Take the former Yugoslavia, for example. It would have been unthinkable to monitor what was going on in that war-torn country without, at the same time, helping the media who were victims of the repression. So we sent over lawyers to help in trials involving the press, helped the families of imprisoned journalists and gave general assistance to the media. In the case of Oslabodenje, the Sarajevo daily, this went on for four years. We did similar work in Rwanda where RSF helped the media to get back on its feet after the genocide. In Algeria at the moment we are involved in aiding  journalists who are obstructed when doing their work. We also give help in Europe - currently to refugee journalists in Belgium, France, Spain, Switzarland and Germany. That's basically what we do; reporting violations of press freedom and helping those who are the victims of it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you work with other organisations, for example the United Nations ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - We work with various types of organisations. We have daily contact with other NGOs specialising in press freedom, such as Article 19 in London and the Committee for the Protection of Journalists in New York, to give just two examples. We also have contacts with NGOs involved in human rights issues in general and, above all, with Amnesty International.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Then there are our links with international organisations and, first and foremost, with the UN system. RSF has submitted reports in response to requests from various organisations, ranging from the UN Committee for Human Rights to UNESCO. We also work with the Council of Europe and the Organisation of African Unity. But our closest  relationship is with the European Union, or two reasons; firstly because it is RSF's main financial backer and secondly Because the EU enables us to do three things. It has helped us set up and has Financed a vast network of correspondents in 130 different countries and, to my mind, this is the most important thing in terms of defending human rights and press freedom. We also publish reports, which we write in response to EU requests, on press freedom in one country or another and which are made available to the EU and European Parliament. Our third \ink comes in the form of assistance. We manage an aid fund to help where the press is in difficulties, and the money is provided by the Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-You have mentioned a network of correspondents which has been set up. How does it operate ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is a network of people who are in daily contact with RSF and who tip us off when a situation requiring our attention arises. Whenever there is a violation of press freedom in a country where the network operates, our correspondent lets us know - that's the first priority. Then, they make enquiries at our request. The third stage is to set up events. For example May 3 was World Press Freedom Day and, on that day, in about 20 countries in Africa, our correspondents organised events on the theme of press freedom. A fourth aspect of our correspondents' work is that they are often responsible on the ground for helping journalists in difficulty. They also help the media in general because we give them documents and supply them with information which they distribute in their particular country. Their task, therefore, is to alert us to a situation, meet our requirements for information and, on our behalf, physically to assist people on the ground, set up events and disseminate information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Are the correspondents all nationals of the countries in which they work ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes. Also, about 90% of them are joumalists and they are all paid for what they do. Their relationship with us is clear-cut. It is very important for them to be paid because this means that   we can ask certain things of them. If you   work as a volunteer no-one can give you  a deadline to produce such and such a   document. In our case, we pay them to   do this work for RSF.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you choose countries where the situation is already problematic ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Unfortunately, problems exist in many countries. Less than half the countries in the world show any degree of respect for press freedom and that means we have a great deal of work. In addition, information arriving at RSF from the correspondents is distributed to other organisations. We have set up a system called Infex which is an electronic mailbox.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All RSF's information is put on a computerised system and immediately disseminated to all the organisations involved in the defence of human rights, and press freedom in particular.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· So the technological revolution is a positive thing as far as you are concerned ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Absolutely. Both the Imais and Internet systems are unbelievably useful tools which have completely revolutionised our work. For example, RSF might protest about the situation in some country or other. Take China, for example - we regularly lodge protests against the lack of press freedom there. There are 17 journalists in jail, no freedom for the press and a great many problems. However, people in China are not aware of what we do and in order to get information they have to listen to international radio stations. On the Internet, RSF's services are available in French, English and Spanish and it is consulted by people the world over. It is thus one of their sources of information. Another example would be a case where we set up an operation and inundate a number of people in a particular country with faxes, in order to pass on the information. Modern technology enables us to break down the fortresses which totalitarian or dictatorial regimes attempt to construct around themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- RSF has just published its 1996 Report. What do you have to say regarding the current position of press freedom ? Has progress been made ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY"> - I would say two things. In the long term, the situation is improving. If you remember, 25 years ago, the regimes in half the countries in Latin America were dictatorships, communism dominated half of Europe and nearly all of Africa had single-party systems. Even in Europe, there were dictatorships - in Spain, Portugal and Greece. So we cannot deny that there has been progress. The problem is that, for three or four years now, there has been a noticeable rise in new threats to press freedom, and this is a great source of concern to us. Here I am thinking of the rise in power of fundamentalist movements, particularly religious fundamentalism. In a number of countries nowadays - the best example, or perhaps I should say the worst example, is Algeria - journalists are not only threatened by the state but are being killed by armed Islamic groups. The rise in religious fundamentalism is indeed a real danger.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second type of threat confronting the press is the increased influence of mafia-type criminals. You will, of course, have heard about drug trafficking in places like Colombia or Peru. Nowadays, in some countries where communism has been overthrown, the big threat comes from these criminal gangs. Not so long ago in Russia, the star presenter on the main TV channel was killed because he got in the way of 'Mafia' interests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The third threat comes from uncontrolled actions by groups fighting for autonomy or independence, like the Kurdish movement in Turkey (the PKK), and a number of separatist groups in India. The EU is no stranger to this either</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - ETA poses a continual threat to the press, as do members of the FLNC in Corsica. It is only a few months since members of the latter group machine gunned a journalist's house. A fourth and new kind of threat, particularly in countries with a democratic system, comes from the rise of the extreme right.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lastly, a point I draw particular attention to in our recent report is, in fact, a dual phenomenon. On the one hand there are states which pass laws under which any criticism is a crime and may lead to prosecution. An example of this is Egypt where the government has enacted a law which has led to charges being brought against some 60 journalists since summer 1995. On the other hand, there are states where justice simply does not operate and there is no will to make it function.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Last year, 51 journalists were killed and a number of others were attacked, but there has not been a single trial or conviction. It is a real culture of impunity. In some countries, the justice system either does not operate, or it is not independent. In such places, the authorities are reluctant to identify and prosecute those responsible for attacks on journalists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· RSFcurrently has project running in Rwanda, in collaboration with the EU. Could you tell us something about this ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The EU is helping us to meet a wide range of needs in Rwanda, as well as in Burundi, where sadly, the situation is rather similar. In Rwanda, there are those who governed the country before the genocide and those in power at the moment. There was a specific problem there in that nearly half of Rwanda's journalists were killed during the genocide - 49 out of about 100. We had virtually to reconstruct the press system and the EU gave us the means to do this.The press currently has difficulties vis-&agrave;-vis the authorities but it is attempting to do its job.  in Burundi, where our work is of a more conventional type, we see continuing attacks on press freedom. There, RSF is trying to resist the pressure, again supported by the EU. In fact, thanks to the EU, we are helping a   number of countries' media to survive despite difficult conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another quite new problem is that before and during the genocide in Rwanda, the media were used as vehicles for disseminating hatred. They issued calls for people to kill their compatriots, in this instance the Tutsis, and the language they used was unbelievably violent. On Radio Mille Collines, presenters would say - and I quote; 'The graves are not full yet'. They would give out the addresses of people who had to be killed and when the murders had been carried out they would actually say, 'You killed them too quickly - you should have killed them more slowly to make them suffer more', or, 'You didn't kill the children, go back and kill the childreni. We actually have recordings of statements like this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In such a situation, journalists must be made to answer for what they have done and be brought to justice.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU has helped us conduct a number of surveys which will enable the international criminal court in The Hague to charge Rwandan journalists with complicity or incitement to genocide. We expect this to take place in the very near future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of course in Rwanda, all that is in the past but the same thing is happening today in Burundi where there is a radio station called 'Radio Democracy' - what a joke! A number of journalists there are issuing calls for people to be killed and we have a copy of one of their newspapers whose front page offers a cash reward to anyone who kills such and such a person. This is not journalism. RSF has lodged complaints against these people and one of these 'journalists' has just been charged.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We are doing three things in Rwanda and Burundi: denouncing violations of press freedom by the authorities, helping media victims and - something new - reporting what has come to be known as 'the media of hatred'. Unfortunately, this type of media is not restricted to Rwanda and Burundi. it is a phenomenon that we see in a number of African countries, in the former Yugoslavia, the Caucasus and the</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Middle East. Perhaps you are aware that the 50th anniversary of the Nuremberg trials has just passed ? But did you know that there were two journalists among the accused? The press has forgotten that journalists played a part in the rise of Nazism. RSF is pointing out that the same thing is happening today in many countries and we have to fight it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> 'The EU is a  perfect partner</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Given what you have just said, should restrictions be placed on press freedom ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - This is a very complex subject. You have to remember that international texts, particularly the convention on civil and political rights, place restrictions on press freedom. Article 19, which defines press freedom, stipulates that there are certain limits to this and Article 20 forbids any dissemination of racist or antisemitic ideas and any incitements to violence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">RSF has two things to say. First, governments which have signed the agreements must ensure they are observed. These set limits. Journalists are not above the law and they must be punished when they say certain things. So states must face up to their responsibilities and apply the treaties they have signed. Second, I feel that the international community, and Europe in particular - when it signs agreements or gives aid to third countries - should demand that they respect press freedom but clamp down on the media of hatred.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· RSF has just published a draft model legislation governing the press. In preparing this, were you influenced by your experience of the extremist media ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Perhaps we were influenced too much. I am my own worst critic. We sent a mission to Rwanda before the genocide but did not appreciate the full effects of the evil disseminated by the media of hatred, particularly Radio Mille </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collines. We underestimated the situation and are concerned at what is happening. We believe there must be express limits on press freedom and this draft framework law is one way of formulating such restrictions. It is not necessarily the best way of going about things, but our profession has to ask itself questions regarding the definition of press freedom and the limits we must not exceed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Are you satisfied with what the EU is doing in this area ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The EU is a perfect partner and has never exerted any pressure. With the Union, we are able to do things that would not be possible with individual Member-State government because the latter conduct foreign policy in defence of certain interests. Each country has its own cultural history linguistic links or links arising out of former colonial times which prevent it financing RSF's studies unconditionally. As far as our missions are concerned, RSF decides what it wants to do and we send our reports to the EU. They have also granted us a budget enabling us to give immediate aid to people in difficulty. This is the most positive action possible If the EU were not there, there would unfortunately be no-one else to finance an organisation like ours. 60% of our budget comes from the Union, 20%from various companies. We generate the remaining 20% ourselves through sales of books and contributions. Because the EU is a grouping of governments, the Commission has some room for manoeuvre. This is the only possible kind of support for organisations like RSF and, if it were not there, it would be the end for the people whom RSF supports.  interview by Dorothy Morrissey</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">ACP</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The economy of Cameroon: Better prospects but still a long way to go</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is an astonishing sight to behold during the rainy season. As you drive along the road from Yaound&eacute; to Bamenda, you come to a point where human habitation starts - and it then continues unbroken for more than 100 kiLom&eacute;tres. Just before Bafoussam, and as far as the eye can see, every patch of land is cultivated. Bananas, oranges, mangoes, sugarcane, cassava, palm trees, groundnuts and maize grow luxuriantly in open fields and in the front and back gardens of many houses. This route, of course, takes you mainly through the western part of Cameroon, home to the Bamilelr&eacute;s, recognised as one of the country's most enterprising and industrious ethnic groups. The population density here is 200 per km2 as opposed to 1 per km2 in the East.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The impact of this widespread farming, carried out by a large number of smallholders, is visible in the local markets, whether in Bafoussam, Mbouda or Bamenda. There, the stalls overflow with fruits and vegetables and prices are very low - a virtual paradise for the middlemen whose unmistakable presence is signalled by the significant number of trucks loading the produce for distribution throughout the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These scenes come as no surprise to the long-time observer of Cameroon's economy. The country achieved virtual self-sufficiency in food over 15 years ago. It is one of the few African countries to have been able to do this, thanks both to its physical  endowments and an early recognition of its agricultural vocation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon is often described as a microcosm of Africa, not just in terms of its make-up of English- and French speaking communities, but because it enjoys almost all the continent's climatic conditions. The south is equatorial, with two rainy seasons and two dry seasons of equal duration, the centre is Savannah country with one rainy season and one dry season, while the extreme north (part of the Sahel) is hot and dry. The country has a very good supply of rainfall - from 5000 mm annually in the southwest to around 600 mm near Lake Chad.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Such varied climates favour the cultivation of a variety of crops. Timber is  produced mainly in the southern provinces while palm oil, tea, cocoa, coffee, rubber, timber and foodcrops are produced in the southwestern and western areas. The central and north provinces specialise in cattle and cotton production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Concentration on agriculture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon has, not surprisingly, concentrated on agriculture. Indeed the government has given top priority to the sector in all its development plans   since independence in 1960. It has been involved in the marketing of the main export crops and has provided subsidies to farmers in the form of low-priced fertilisers and pesticides for their cocoa, coffee, rubber, palm oil, etc. Almost three-quarters of the working population (the majority of whom are smallholders) are engaged in farming. And despite a low level of mechanisation, they are very efficient. The rate of growth in food outstrips the rate of population growth. Only a few largescale farmers or firms are involved in the production of cash crops.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Until the early 1980s, when oil came into the picture, these large scalefarmers and firms amounted for more than 70% of export earnings, 40% of state revenue and 32% of the Gross Domestic Product. The plan initially was to use oil revenues to further boost and transform agriculture. However, the dramatic increase in the country's oil production, combined with much higher world petroleum prices during the first half of the 1980s, made the sector not only Cameroon's biggest export earner, but also, in a certain sense, a 'spoiler' for agriculture. Increased revenues enabled the government to maintain the level of prices paid to farmers, even though world prices had slumped to disastrous levels. This created distortions in the market. (Later, when the oil price slumped, and revenues dropped sharply, producer prices were also reduced, bringing them closer into line with international prices.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture's contribution to GDP declined steadily to around 21 % in 1985, rose to 27% in 1989 and has hovered around 30% ever since. The sector's share of export earnings has also fallen to about 40% of total exports by value.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite this, Cameroon's agriculture remains, comparatively, in a much better shape than that of most African countries. Indeed, it contributed in large measure to the country's reputation as one of Africa's economic successes in the 1980s. During that decade, growth averaged 8% per annum. However, the period was also marked by dramatic increases in oil revenues which induced  significant policy changes as well as leading to maladministration. The government paid less attention to taxation and customs duties as sources of income and turned a virtual blind eye to smuggling which harmed the manufacturing sector. The civil service, on the other hand, expanded beyond reason, a phenomenon that some have attributed to patronage by the ruling single party.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Boom in public expenditure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Protected somewhat against fluctuations in earnings from export crops, by a strong but overvalued CFA franc, the government embarked on a wide range of capital expenditure and imports. Then, in 1987, international oil prices fell as dramatically as they had risen earlier in the decade. At the time, public spending was running at CFAF 8 billion - well above the CFAF 5.6bn the country actually earned. Revenues from oil continued their downward slide to CFAF4.5 bn in 1988, CFAF 2.8 bn in 1991 and CFAF 2.5 bn in 1994. 1995 saw a modest rise to CFAF 3 bn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1987 thus marked the beginning of a rapid deterioration in Cameroon's financial situation. In the period which followed, civil servants' salaries were unpaid for months, several of the country's foreign missions were left without resources and both domestic and foreign debts worsened. In 1993, the government owed commercial banks around CFAF 3.3bn. Its external debt stood at around $7.5bn with a service ratio of more than 25% of foreign exchange earnings. The devaluation of the CFA franc in January 1994 improved the internal debt situation significantly. In February, the government signed a letter of intent with the IMF after agreeing to a series of reforms which included, among other things, rationalising the banking and insurance sectors, raising revenue from non-oil sources, bringing inflation down and reducing the budget deficit. In return the IMF provided a stand-by loan equivalent to CFAF 1.4bn. However, the agreement was suspended just a few months later when the Fund reached the conclusion that the government lacked the will to carry the reforms through. The 1994/95 budget foresaw a deficit of 4.5% of GDP - well above the IMF's guideline of 1.5%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meanwhile the country's financial situation had become so critical that it could no longer service its debts, most notably, those it owed to the World Bank. France, which had traditionally been ready to come to the rescue, refused to bail Cameroon out and it finally dawned on the authorities that structural adjustment was unavoidable. When, in September 1995, talks resumed with the IMF, the commitment to adjustment was no longer in doubt. The government agreed, in addition to fiscal reforms, to liberalise trade in cocoa, coffee and timber, to prune the civil service and to privatise state enterprises which dominate the industrial sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Commitment to reforms</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since then the reform process has been in full swing. The first and most important task has been to improve the government's financial position. The civil service, which employs more than 175000 people, is gradually being reduced and salaries have been cut. Trade is also being liberalised and subsidies are being removed. The 1995/96 budget, unveiled in June last year, was welcomed by the IMF. It included, for the first time in a long while, increases in income tax and a widening of tax bands. A series of measures have also been introduced to combat tax evasion and fraud. External signs of wealth, water and electricity consumption, and telephone bills are now being used as means of assessing income tax.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Responsibility for the collection of customs duties has been removed from the Customs Department which was often accused in the past of corruption and inefficiency. The task has been given instead to a Swiss-based preshipment inspection company. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The donor community has responded positively. With French assistance, the government has been able to clear its outstanding debt to the World Bank. The IMF has provided a stand-by credit facility of $101 million in support of the adjustment programme for 1995/ 96 and debts to the Paris Club covering the same period have been rescheduled. In addition, now that Cameroon has been reclassified as a poor country, it is entitled to benefit from the terms of the Naples Agreement, which allow for up to 67% of debts to western govemments to be written off. A number of creditor nations have either forgiven the country its debts or have reduced them substantially. More loans have come from France and a number of other donors, including the World Bank and the European Community.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EC is financing a series of projects within the framework of the adjustment programme, including the restructuring of the civil service and preparation of the ground for privatisation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lately though, the donor community has been showing signs of disenchantment, following allegations of misuse of funds and perhaps even outright embezzlement. Last March, an IMF mission to Yaound&eacute; failed to obtain an adequate explanation concerning the allocation of certain sums. The result, at the time The Courier went to press, was that an IMF loan for settlement of Cameroon's debt to the African Development Bank was being held up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dealing with the negative social impact</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p07a.png"></center><br>
+ Figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sudden devaluation of the CFA franc in January 1994 halved Cameroon's purchasing power overnight. The government has since cut wages twice. The average salary of a top civil servant, which stood at around CFAF 300 000 before devaluation, is now less than CFAF 180 000 while the lowest paid government employees receive just CFAF 30 000. At the same time, prices, particularly of imported manufactured goods and inputs, have risen sharply. Increases of up to 150% have been  recorded. By way of example, the price of a baguette (french bread), which was only CFAF 80 in January 1994 had risen to CFAF 130 by March 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there is considerable hardship, Cameroonians are a great deal more fortunate than fellow Africans in many other countries undergoing a similar adjustment process. Staple food remains cheap and affordable to the vast majority, thanks to the continuing strength of agriculture. As a result, there are few, if any, cases of malnutrition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A number of donors, including China, Belgium and the EC, are concentrating on health and education with the specific aim of reducing the negative social impact of adjustment. The EC, for example, has a project designed to strengthen health provision at the grassroots. This entails rehabilitating  infrastructures (health centres and district hospitals in particular) and establishing medical supply centres in areas that are not covered by other donors. The project is governed by the principle of cost-recovery to ensure viability and sustainability. But one area where the donors cannot do much is in the field of job creation. There is growing unemployment and job prospects in the formal sector, at least in the short term, are not good.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In macro-economic terms, things are locking up slightly for Cameroon. After recording economic growth of 3% in 1994/95, the hope is for a 5% increase in 1995/96. However, Cameroon's main economic operators, grouped under the umbrella of GICAM (Groupement inter-patronal du Cameroun), expressed fears late last year   that the country would not achieve this level of growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon exports a variety of primary commodities, most of whose prices have recovered in recent years, and devaluation has had a positive impact on the country's balance of trade. Specifically, it has helped make exports more competitive and in 1994/ 95 the trade surplus was a healthy CFAF 349bn, almost double the CFAF 128bn recorded in the previous year. There was a noticeable slowdown in the export of timber in the latter half of last year and the qualities of coffee and cocoa being sold were not up to the usual standard, a situation that led to both crops being shunned in the world market. Bananas exported to France were also meeting stiffer competition from French Caribbean bananas. However, the fact that rubber production has risen by more than 10%, while aluminium output and sales have increased, should help Cameroon to record another positive trade balance when the figures are next published.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The forestry sector, which has huge foreign-exchange earning and employment potential, is being rationalised as part of the current structural adjustment programme. The Canadian Agency for International Development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(CAID) has a five-year project to conserve and regenerate some 30 000 hectares. In fact, half of Cameroon is covered by forest and less than 500 000 ha is currently being exploited. The objective is to ensure that forest resources are exploited in the future at a sustainable level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The private sector</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Industry, which is still in its infancy, has been developed by the government since independence largely with a view to import-substitution, although with some gearing towards the regional market. It accounts for about 14% of GDP and is currently dominated by aluminium smelting. Although devaluation has lately improved the competitiveness of those enterprises that add value to locally available raw materials, the manufacturing sector as a whole faces two major challenges now that the government has accepted the idea that the economy is best driven by the private sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first relates to private investments, which have been sluggish  over the past ten years; a clear illustration of a lack of confidence in the economy. This was amply demonstrated when Cameroonians with funds abroad failed to repatriate them to take advantage of the CFAF devaluation as was widely expected. This phenomenon puts the whole privatisation exercise in jeopardy as it means that the government is more likely to have to rely on foreign entrepreneurs. The best the authorities can therefore expect in the short term, some observers say, is to convert those state enterprises that are not already joint-ventures into ones where private investors become the majority shareholders. Complete divestment will then take place gradually over a longer timescale. Overall, 150 state enterprises have been earmarked for sale.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to Andr&eacute; Siaka, director of Cameroon's Brewery, who is also Chairman of GICAM, another reason for the lack of investment was high interest rates. These hovered around 20% for many years. Even now, after the reform of the banking sector, interest rates remain very high and there are no borrowers, he told The Courier. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Donors again have been conscious of this and some of their interventions have reflected this concern. For example, Canada is providing funds for the establishment in Douala (the commercial capital) of a centre for the development of private enterprises. Meanwhile, the Chinese have promised to provide CFAF 7bn to enable a line of credit to be opened for small and medium sized enterprises.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government itself is puting in place a number of incentives, according to Minister of Trade and Industry Eloundou Mani Pierre. The liberalisation of the economy and the reform of the customs regime in collaboration with UDEAC, to which Cameroon belongs, are part of these. Mr Mani told The Courier that with a population of under 12 million, Cameroun's most important market was Central Africa. He also, perhaps surprisingly, has high hopes for the new World Trade Aareement. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon meanwhile is reviewing its plan for the establishment of export processing zones with the help of its main donors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is also looking at other ways of attracting foreign investment, particularly in 'value-added' enterprises involved in the processing of locally available raw materials such as cotton, cocoa, coffee and timber.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social and political peace</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second, and by far the more serious challenge facing manufacturing, is the problem of large-scale smuggling by petty traders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Evidence of this abounds in the booming central market of Douala, where goods of all kinds can be found at very reasonable prices. Ironically the measures which were being taken and judged to be relatively effective against smuggling in recent years have had to be abandoned under structural adjustment rules imposed on the government.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As Mr Siaka pointed out, petty traders dealing in smuggled goods put pressure on enterprises, 'because they do not pay tax', and threaten to render domestic manufacturing uncompetitive. It is also widely acknowledged, however, that the small-scale traders, who dominate the informal sector, provide job opportunities to Cameroonians, which is important at a time of economic austerity. Indeed petty trading has arguably been the safety-valve, helping to ease the social pressures brought about by structural adjustment, and thus preventing civil unrest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But the extent to which that safety-valve can withstand the emerging political pressures is a different matter. Democratisation, understandably, was one of the conditions imposed by donors for assistance to Cameroon. After a series of elections - presidential, legislative and municipal - which were marred by violence and deaths, there are still doubts about the health of democracy in the country. Indeed, there are signs that tension is  mounting. And few would dispute that if Cameroon is to succeed economically, it needs both social peace and political stability. </P>
+<P ALIGN="JUSTIFY">Augustin Oyowe </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Jacques Santer commends regional  initiative</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Alex Kremer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Commission President's visit to West Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union's commitment to regional development in sub-Saharan Africa is as strong as ever, but sustainable development can only come from Africa's own initiative. This was the message delivered by Jacques Santer, President of the European Commission, in his address to African heads of state at the UEMOA (Economic and Monetary Union of West Africa) summit in Ouagadougou, Burkina Faso, on May 10.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'I wish to emphasise from the start,' Mr Santer declared to the Presidents of Benin, Burkina Faso, C&ocirc;te d'lvoire, Mali, Niger, Senegal and Togo, 'that the European Commission and the European Parliament are both determined to make our partnership even more dynamic and in tune with today's rapidly changing world.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The presence of the Commission President at the UEMOA summit marks a milestone in the European Community's support for regional integration in the developing world. With its own Commission, Council of Ministers and Court of Justice, the UEMOA appears to be consciously  following the supranational model of regional integration pioneered by the European Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sequencing of UEMOA integration, however, is almost the reverse of the European model. Already linked by a single currency in the CFA franc, the West African Union's member states are now pressing ahead with plans for integration of their 'real' economies. The implementation timetable agreed in Ouagadougou covers freedom of establishment, free movement of capital, mutual macroeconomic monitoring and the first steps to customs union with the harmonisation of external tariffs and the lowering or removal of intra-regional barriers to trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">President Santer indicated that the European Commission is keen to discuss how the European Development Fund (EDF) can support these initiatives. Such aid could take the form of technical assistance and training as well as direct budgetary support to mitigate the short-term costs of customs union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UEMOA is not, however, an aid project. Its member states have designed it to stand on its own feet financially from the start. A 'community solidarity levy' was due to come into effect on 1 July 1996. The money will be used for a structural fund programme beginning in late 1997, as well as to finance the Union's operating costs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meeting with the President of Burkina Faso, Blaise Compaor&eacute;, Mr Santer said that it was particularly significant that his first official visit to Africa as President of the European</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Commission was to Ouagadougou. Not only was it a reaffirmation of the partnership between Africa and the EU, and a statement of the EU's willingness to support regional integration in the developing world. It was also a tribute to the determination of the people of Burkina Faso and other African countries to promote their own development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Community is Burkina Faso's second largest donor, contributing 10% of total aid payments in 1994. Since 1991, the EC has committed an average of ECU 45 million each year to development cooperation with this country, rising to a peak of ECU 100m in 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Santer visited the EDF-financed road improvement site at Tougan, close to the frontier with Mali, and noted that intra-regional transport links were an essential complement to the legislative programme of the UEMOA. He concluded his tour of regional cooperation projects with a visit to a photovoltaic pumping system financed by the EC under its West African solar energy programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, on a more personal note, the Commission President was able to drop in on a project managed by the charity Chr&eacute;tiens pour le Sahel. Mr Santer worked for this Luxembourg-based organisation before starting his career in politics and he was visibly pleased to see that it was still going strong - supporting home-grown African initiatives with a little financial help from the European Community.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.K. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">CTA - moving with the times</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the Technical Centre for Agricultural and Rural Cooperation (CTA) was inaugurated 11 years ago in Ede, Prince Claus of the Netherlands - whose interest in development issues is well-known - attestded as guest of honour. On 19 April, he returned to take part in the official opening of the CTA's new building in neigh bouring Wageningen in the Dutch province of Gelderland. The siting of the purpose built premises is significant. The town of Wageningen has long been an important European centre for agricultural research and the Dutch, of course, are renowned for their commitment to cooperation with developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The CTA may only have moved a short distance from its previous headquarters, but the Centre's 38-strong staff are also aware of the need to move with the times when it comes to fulfilling  their role in the field of agricultural information. This point was particularly emphasised by CTA Director, Dr. R.D. Cooke in his presentation at the opening ceremony. Recalling the Centre's main tasks (see box) Dr Cooke spoke of the 'changing horizons and challenges' which they faced, and he focused on four specific aspects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first of these is the big change taking place in national agricultural systems, with the state withdrawing more and more in favour of the private sector and NGOs. This is being accompanied by a trend towards decentralisation with the result that the CTA has many more potential partners to cater for and work with.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Global liberalisation has also had an effect on the kind of information being sought by the CTA's 'customers'. In the past, demand was almost exclusively for scientific or technical information, notably aimed at increasing productivity. Dr Cooke reported that while this remained important, there was now  an increasing interest in marketing and socio-economic aspects to facilitate decision-taking.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It came as no surprise to hear the Director highlight the challenge posed by new technologies such as electronic networking and digital storage. The key point here, he stressed, was to find ways of adapting these to ACP needs and realities. 'In the next century,' he argued, 'the haves and the heve-nots will be defined by their access to information.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, Dr Cooke referred to the growing significance of regional linkages. He indicated that the CTA was locking at ways in which it could help its partners to devise regional development programmes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The declaration signalling the official opening of the building was made in the preceding presentation by E.F.C. Niehe who is Deputy DirectorGeneral for European Cooperation at the Dutch Ministry of Foreign Affairs. In his speech, Mr Niehe emphasised the relevance of the CTA, pointing out that while the world food situation had improved, 'we are now on the threshold of structural food insecurity'. He also spoke in more general terms about the future of ACP-EU cooperation and acknowledged that 'partnership, sovereignty and equality had been somewhat neglected' by donors. However, he suggested that these concepts were now 'coming back'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the ACP side, the Swaziland ambassador, CS. Mamba,who is co-President of the Committee of Ambassadors, took up the theme of food shortages in sub-Saharan Africa and identified some of the difficulties encountered by African producers, particularly in respect of new technologies and marketing. He also referred to the environmental challenges facing ACP countries, especially in the Caribbean and Pacific. He was keen, however, to stress that the picture was 'not entirely negative'. Thus, for example, new technologies and methods had had a positive impact on grain production in Zimbabwe, horticulture in Kenya, and cocoa and coffee in West Africa. Mr Mamba echoed Dr Cooke in stressing the advantages of regional markets, and concluded with a firm statement of support for continuing ACP-EU cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'History,' he said, 'will show that the Lom&eacute; Convention played a central role in the momentum of development.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The final speaker was Steffen Smidt, Director-General for Development at the European Commission, who suggested that the CTA had played a pioneering role in developing a sectoral  approach at a time when the focus of development cooperation tended to be on individual projects. 'The Centre', he said, 'has become a well-respected international institution in the field of agricultural information.' The Director General focused on the need for ACP countries to develop their own capacities and on the gap that exists 'between potential and reality', because of capacity limitations. The Centre, he believed, could 'help bridge this gap.' Mr Smidt also reiterated a point made earlier that the information flow should not just be in one direction. 'Information from South to North is vital,' he argued, to ensure better targeting of programmes in future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After the speeches, guests had an opportunity to learn more about the CTA's work by speaking to the Centre's personnel and visiting a special exhibition illustrating the nature and purpose of the Centre's activities. _</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Simon Homer About the CTA </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The CIA's tasks are: </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - to develop and provide services which improve access to information for agricultural and rural development ; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - to strengthen the Opacity of ACP countries to produce, acquire, exchange and utilise information in these areas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Programmes are organised around three principal themes: </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Strengthening information centres - designing strategies for improving agricultural information services; - promoting use of new information technologies; - providing training; - donating books. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Promoting contact and exchange of: experience among CTA's partners in rural development - seminars; - study visits. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Providing information on demand - publication s; - radio and audiovisual materials; - literature services for researchers; - Question and answer service. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(The address of the Technical Centre for Agriculture and Rural cooperation can be found in the CTA section towards the end of the white pages in   this issue.) </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Bananas, Hamlet and the Windward IsIands</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Martin Dihm</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What do the Windward Islands' banana industry and Hamlet have in common ? Both are intrigued by the same question: 'To be or not to be.' But unlike Hamlet, whose fete was decided rather quickly and tragically, the future of Windward Canibbean banana production is still open. And what is more, Windward producers have a distinct advantage over Hamlet. They can hire consultants to analyse their problem and come up with fresh solutions. That is what has happened. But before turning to the solutions, what have the problems been ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The four Windward Islands; Dominica, St Lucia, St Vincent and Grenada, have long enjoyed preferential market access to the UK. This first permitted the creation of the industry and then secured its survival, even with production costs that are much higher than those of other producers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A traumatic moment came when the European Community had to decide on a common market regime for bananas. Coming into effect in mid 1993 the regime maintained the principle of preferential access for traditional ACP producers. Nevertheless, it introduced a move towards greater market liberalisation. Fierce attacks on the regime by certain of the EU's trading partners have raised doubts about its viability. The system is due, in any case, to expire in 2002 when even further liberalisation seems likely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All this could cause great difficulties for the Windward Islands which still depend substantially on banana exports to the EU. A decline in prices since mid-1993 and the appearance of new competitors in the previously protected UK market have further underlined the need for the Windwards to compete in a more liberal arena. The Islands commissioned a study, funded by the UK and the EC, into the competitiveness of their industry and on ways of improving its position. It was not the first study of this type, but earlier ones had had no real impact on the industry which had always been sufficiently protected to avoid swallowing the bitter pill of adjustment. This time, it was clear from the outset that action would have to be taken if the industry were to master the new situation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The study provided a wealth of interesting insights and recommendations. The first big surprise - at least for outsiders - was the discovery that the industry was wasting considerable amounts each year through certain deficiencies in governance, management and production methods. The second theme of the study was the poor banana quality resulting from an inappropriate pricing system. In effect, price differences paid to farmers were not sufficient to reward extra attention to quality aspects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The study's recommendations pertaining to management, production and quality were all agreed in a meeting on 29 September 1995, which brought together the Prime Ministers, the EC and other donors. Prime Minister Mitchell of St Vincent labelled this chance for the industry to get its business right as 'the last train to San Fernando'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What has happened since then ? After some hesitation, the industry has indeed begun to 'take up arms against its sea of troubles' (to return to the Hamlet analogy). The EC, for its part, has taken the part of Horatio, the faithful friend. Its role is a delicate one though - for the EC has a lot of money available. Take, for example, the ECU 25m allocated to St Vincent in the 1994 STABEX exercise (roughly five times that  country's national indicative programme). How are such funds to be injected reasonably into the islands without undermining their own strength and sense of purpose in pursuing the right strategy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To answer this, one has to look at the actual requirements. Streamlining the banana industry is less a question of big infrastructure projects than of providing expertise to guide the necessary structural changes. It also means fewer people will be employed in the sector. Aid should, therefore, focus on technical assistance, promoting diversification, and social 'cushioning'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The challenge, of course, remains considerable and the outcome will not be known for some time. But it is clear that the Windwards have taken bold steps in the right direction and that further steps are on the agenda. There is also little doubt that the islands small, sweet bananas can only be competitive in their market segment if they are produced and marketed professionally, and with dedication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So what could Hamlet have learnt from this experience ? In short - get sound analysis and fresh advice from outside - and then boldly implement. And stick close to your good old friend, Horatio! </P>
+<P ALIGN="JUSTIFY">M.D.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">British beef overshadows Development Council</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most recent meeting of the EC`s Development Council was one of the first to be hit by the non-cooperation policy adopted by the UK in protest at the export ban on British beef. The Overseas Development Minister, Linda Chalker, announced at the outset to her fellow ministers: 'I will not be able to agree today to the adoption of those texts... on which unanimity is required'. Britain is seeking agreement 'for a step-by-step lifting of the export ban', which was imposed after scientific evidence suggested a link between Bovine Spongiform Encephalopathy (BSE) - and its human 'equivalent', Creuzfeld Jakob Disease. Cases of BSE have been recorded across Europe, but the vast majority have been in the UK.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Texts which were approved included a regulation on refugees in non-Lom&eacute; developing countries. This makes available ECU 240 million over a four-year period (19961999) for longer term assistance to refugees and displaced persons - mainly in Asia and Latin America. Also agreed were two three-year programmes covering Aids control and environmental projects respectively. They will cover the period 1997-1999, and each has been allocated the sum of ECU 45m. In addition, ministers confirmed a regulation on the criteria for disbursing humanitarian aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But the British stance meant that a number of important resolutions were blocked, including a text on mounting projects which link emergency, rehabilitation and longer-term aid. Rino Serri, Italy's Under Secretary of State for Foreign Affairs who presided the Council meeting, said that once adopted, this approach would represent a 'qualitative leap for the EU's development policy.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other resolutions awaiting approval relate to the strengthening of coordination between Member States, evaluation of the environmental impact of development policies, decentralised cooperation, and migration and development. Since good headway was made on these subjects despite the British attitude, the texts are expected  to be speedily agreed once the UK lifts its veto. Ministers also had an initial discussion on a paper presented by Commissioner Pinheiro on preventing conflicts in Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As is customary at these biannual meetings, several delegations raised points of particular national concern. Belgium, for example, is worried about the Commission's proposal which would finally establish the single market in chocolate products while leaving Member States the choice of adapting their legislation to allow a vegetable oil content of up to 5% in chocolate. Belgium feels that this approach could ultimately prove harmful to cacoa-producing countries and claims that it will be difficult to control the exact percentage of oil used. Sweden, meanwhile, wants action to reform the UN institutions while Italy is keen to increase public awareness of development policies. Finland emphasised the need for better coordination between the European Community and its Member States on environmentally sustainable projects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Great Lakes region</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was backing for the June Round Table meeting on Rwanda organised by the UNDP, as well for the various diplomatic initiatives aimed at bringing stability to the Great Lakes region. On 27 May, the ministers dined  with Emma Bonino, the European Commissioner responsible for humanitarian issues, and with former US President, Jimmy Carter, who has played a major role in the search to find a solution to the region's problems. Others active in this effort include South Africa's Archbishop Tutu, and former Presidents Nyerere and Tour&eacute; of Tanzania and Mali respectively. Ministers also commended the efforts of the UN and the OAU.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Serri said there was a 'desperate need for a ceasefire' in Burundi and called for a 'speeding up of the peace process and full deployment of available humanitarian and development aid.' He told journalists it was vital for the EU to make special efforts to strengthen the judicial systems in Rwanda and Burundi - 'so that the justice system can work properly and identify those responsible for the genocide.' He pledged that 'substantial resources' would be made available once peace is secured. Ministers also called for a control of arms sales to the region, although they have no power to legislate in this area, which remains the preserve of the Member States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Outside the meeting place, Senegalese fishermen and NGOs joined forces to mount a protests against the effects of traditional EU fisheries agreements. These provide financial compensation to governments in exchange for access to their waters for EU vessels, but the protesters claim that they harm local fishing industries and disrupt food supplies. A significant number of agreements are due to come up for renewal later this year. NGOs are lobbying for a new and 'fairer' type of accord which provides for catch reductions, more selective fishing methods and the employment of locally-hired fishermen on EU boats. These proposals are all set out in a paper entitled 'The Fight for Fish: Towards Fair Fisheries Agreements,' published by Eurostep, a Brussels-based NGO. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Country report</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Cape Verde</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Making the best of history</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde has been shaped by the harmattan, the hot dry wind which blows from Africa, strong ocean currents and five hundred years of Portuguese colonialisation. Portugal has been a constant presence in the archipelago's history since the fifteenth century, when it granted the colonists who were to settle on the islands of Cape Verde a monopoly over the slave trade. The country became an interface between Africa, Europe and the Americas, at the centre of the triangle of trade in slaves, hardware and gold. The intermingling of black populations of every origin who  passed through the islands meant that the country was unable to present a united face against the colonialist culture. The colonists were therefore able to impose their own culture, with their fervent and proselytzing Catholicism becoming the principal ingredientin the mixture that is Cape Verde. Strong, scorching winds from the desert have shaped the islands' landscape and inhospitable ocean currents mean that approaches to the islands are difficult, their rocky cliff faces plunging into the sea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mythical Portuguese colonial oasis</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Up to the eighteenth century, Cape Verde was no more than a commercial centre for Portugal, its population at the end of that century barely exceeding 50,000, to be halved by the great drought between 1773-75. Other periods of drought regularly decimated the population and the arrival of new colonists and slaves did not offset such losses or compensate for the massive exodus which began in the early nineteenth century with the arrival of American whalers in search of crew members for their ships. Seven hundred thousand Cape Verdians currently live abroad, half of these in the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only four hundred thousand  have stayed in their own country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the beginning of the twentieth century, a period which signalled a turning point in the country's history, the population still numbered no more than 150 000. At the time, major sea voyages were being undertaken and Cape Verde's geographical location was highly valued. Mindelo, on the island of S&atilde;o Vicente in the north of the archipelago, developed as a coal-and-watersupply port for English vessels plying the route between India and the Americas, and England helped construct this port. However, Portugal's policy towards Cape Verde was double-edged. On the one hand, the islands were regarded as a natural extension of the home country, but as a competitor in terms of port activities. This led to Mindelo's slow development, although the trade in  skins, fishery produce, coffee and salt  could have made it a thriving centre. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mixing of races in Cape Verde has often been held up as, so-to-speak, 'humane colonisation', but this opinion is not corroborated by the under-developed state of the country at the time of independence and the fact that Portugal implemented food security measures to combat the ravages of catastrophic famines only when under pressure from public opinion, at the end of the first half of the twentieth century. The island's colonists had always used slave labour to produce food or fabrics which enabled them to purchase more slaves and it was only when the slave based economy began to decline, which   resulted in the impoverishment of the colonists, that a major grouping of free Blacks and rebel or emancipated slaves came into being. That is when the intermixing of races began. Therefore, before the abolition of slavery (18641869-1878), the vast majority of the black population of the island was free; both unmarried and married colonists would generally emancipate their children born of a secret relationship with female slaves. The aristocracy and white upper-middle classes continued to live a cloistered, aloof life and did not mix with other races. A second factor which would suggest that Portuguese colonisation of Cape Verde was sympathetic in outlook is the reputation of this small country's intellectuals; although colonisation created only a small intellectual elite which was the product of a single institution, the Mindelo College, opened in 1917. In a quote by Michel Lesourd, Deirdre Meintel refers to this phenomenon as the mythical 'cultural oasis'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A nation born of a middle class in tatters</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through its contradictions, it was this black, mulatto and 'petty white' middle class which was to forge the mixed-race culture and national identity, caught between its own privileges and its aspirations of aristocracy, between its rejection of African culture (they sought a 'lusotropical' culture) and the need to find allies amongst the lower classes who retained African cultural values. In order to acquire the wealth and attributes of power, this middle class was to take over the lands vacated by the decline of the slavebased economy and which were often much improved by the former slaves (renamed 'tenant farmers' without a major change in their living conditions) preventing a major economic upheaval which could have put an end to this iniquitous system. Their wholesale appropriation of land explains why, today, there is a very high proportion of landless farmers in Cape Verde, seasonal agricultural workers who survive only thanks to the State's welfare system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This petty bourgeoisie was to give birth to growing awareness which would lead to calls for independence. Officially, Cape Verde was not a colony but a province, and its inhabitants in theory had the same rights or lack of rights as Portuguese citizens in Salazar's 'New State', where the right to vote depended on social and cultural status. In other Portuguese territories, members of the petty bourgeoisie held the rank of colonial administrators and, from their ranks, the pro-independence movements emerged. Such was the case of the PAIGC (Guinea-Bissau and Cape Verde pro-lndependence Party), created by Amilcar Cabral, a symbolic figure in Africa's striuggles for independence and Cape Verde's national hero. He was assassinated in mysterious circumstances in Guinea-Conakry in 1973. His brother, Luiz Cabral, was to become president of Guinea-Bissau, and Aristides Pereira his successor as Party leader and Cape Verde's first president.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde's uneventful transition to independence in July 1975 mirrored Portugalts Carnation Revolution and was quite unlike the fierce war entered into by Portugal in Mozambique and Angola. There was a clandestine struggle during which a number of combatants were imprisoned, but there was never any real guerilla warfare. The Portuguese governor remained at his post until he was replaced by an ambassador. The PAIGC was to govern both Guinea-Bissau and Cape Verde until the coup d'&eacute;tat against Luiz Cabral in Guinea-Bissau in 1980, when it adopted the name of PAICV in Cape Verde, thereby signalling the end to any dream of a union between the two countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Diplomatic ventures</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new state pursued an even-handed diplomatic approach and accomplished the considerable diplomatic feat of remaining equidistant between the Cold wer's principal adversaries, adapting over time to all the changes which occurred on the world  scene. Post-independence, embassies were opened by the United States, China and the Soviet Union. Cape Verde, with its marxist leanings, maintained the former links created with apartheid South Africa by Portugal. The arrival in power of a liberal party had no effect on this diplomatic tightrope-walking act. It was South Africa which was to provide aid to build the international airport at Sal. Ironically, after the establishment of democracy in South Africa, it was at this very airport that President Mandela was to stress his desire for strengthened links with the archipelago. Latterly, Cape Verde has demonstrated this flexible in its recent decision to Join the group of, French-speaking countries whilst still regarding itself as a mouthpiece for the Portuguese-speaking world, enjoying a privileged relationship with Portugal, the Azores, Brazil and African countries where the official language is Portuguese. It is also a very active member of the CEDAO (Community of West-African States) and its President is currently chairman of the CILSS (Inter  national Commitee to Combat Drought). Cape Verde receives as much aid from China as from the US, from Russia and Sweden as from Cuba and Japan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This diplomacy is in keeping with the atypical 'Marxist' Party which first initiated it. With its interventionist approach to economics, its highly developed social policy which gives priority to education, health and combating unemployment through public welfare, this party could be regarded as a socialist party, yet it opted decisively for a market economy. Its single-party structure mirrored the example of would-be popular democracies, but it never set up a system of repression and terror: only one opposition member's death is said to have taken place in suspicious circumstances on the island of Santo Antao. The population was able to discuss politics at popular assemblies and held no fear of openly criticising the government and, in the case of the well-off, of displaying its wealth. A mudan&ccedil;a (change) was implemented calmly and collectedly by the PAICV when it was in power, sowing the seeds of its own downfall. With no pressure from street demonstrations and no insistent demands from political classes, the government of President Aristides Pereira and Prime Minister Pedro Pires adapted to the new situation created by the fall of the Berlin Wall. In early 1990, the PAICV gave up its privileged position as the single party and, one year later, at the legislative elections in January 1991 and presidential elections in February 1991, Africa witnessed the first democratic overthrow of a single-party government which had achieved independence. After the legislative elections, the PAICV, which had placed too great a reliance on being credited for its good governance, was silenced. The desire for change was too great and the position adopted by the Catholic church, anxious to punish a party which had dared to opt for a referendum on abortion, did the rest. President Aristides Pereira's personal prestige stood for little in the full face of this onslaught.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What change?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister Carlos Veiga, who had founded the MPD only eight months before his overwhelming success in the 1991 elections, became the new figurehead in Cape Verde politics. His power sharing with Antonio Mascarenhas Monteiro was again successful at the most recent elections (December 1995 and January 1996). Shortly before the poll, the MPD experienced a near-fatal split, but the new party which emerged, the PCD, had only one representative as against 50 (an absolute majority) for the MPD and 21 for the PAICV, which continued to exist. Three other parties taking part in the elections fell by the wayside and the polarisation of Cape Verde's politics into two camps locks set to continue. This is the second time that the MPD has surprised its opponents - this time, the political adversaries had attacked the MPD's attempt to curry favour, but the majority of the electorate, concentrated on the island of Santiago, continued to show their appreciation of the visible signs of modernisation in their lives and also the government's seductive politics, particularly in the ran-up to the elections. The country had also had a good harvest and, although this was unconnected with the MPD, that party could only benefit from it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite what MPD leaders might say, there has been no real ideological split, any political reorientation having been instigated in 1990 by the previous regime when it threw off its socialist trappings. Diplomacy remains  pragmatic and the new government's liberal rhetoric and social policy, particularly in the areas of education and health, has essentially been maintained. Suspension of the State's collective works programme, the symbol of the State's interventionist social policy, is only temporary, according to statements issued by the Prime Minister, counter to several rumours.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More visible changes have taken place in the economy: partial liberalisation of the banking system; legislation relating to foreign investment; suspension of the requirement for preliminary import authorisation; despite the government's backtracking as regards certain basic products; privatisation of State assets, particularly in the hotel business, etc. Here, too, the PAICV government engineered the changes, but it can surely not be criticised for maintaining a delicate balance between the new demands of the global village and the social practices of a country which is very poor, but which is succeeding in putting an end to its poverty and creating a modest quality of life, but a secure one. Given its bleak geographical location, Cape Verde is simply  continuing to make the best of history. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H&eacute;gel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The economy: too weak to worsen</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The arrival in Praia on 30 April of a throng of IMF officials cannot have failed to cause the government some concern, despite its air of calm. Ministers repeated publicly that Cape Verde had already carried out its own programme of structural adjustments, that they were on the same wavelength as the Bretton Woods institutions, and that they could not, therefore, see any reason why any further adjustments  should be imposed upon them. Nevertheless, the fact that the Cape Verde escudo has had rather a bumpy ride since last year's elections, trading sometimes by as much as 15% under its official rate on the parallel market, caused a certain degree of anxiety within financial circles, with the banks taking action by freezing certain credit facilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government insists that this situation has by no means arisen because of a sudden anxiety raised by opposition parties as to the effects of possible devaluation The truth is that there is a genuine structural imbalance caused by the trade deficit, a disequilibrium which is only being partially offset by official development assistance and the transfer of currency by Cape Verde emigres. As a percentage of the GDP, the overall budgetary deficit has tripled between 1993 and 1994 (increasing from 3.3% to 13.6%). For a country which could always be relied upon to pay its debts promptly, Cape Verde is now, for the first time, in arrears with its payments (see the 1995 report of the Bank of Portugal). The servicing of external debts represents 25.7% of goods and services exported - although these are relatvely small compared with neighbouring countries - the country's total outstanding debt is now nearing $200 million.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although Cape Verde is one of the LDCs (least developed countries) with a total GNP of approximately $850 per capita, out of a total of 174 States, it actually ranks 123 in the Human Development Indicator Tables, which take into account various factors such as life expectancy, education, etc. Its position near the middle of these tables clearly shows that, although the country is poor, its affairs are nevertheless being managed fairly efficiently. Boasting an adult literacy rate of 66% and a life expectancy of 64.7 years, Cape Verde is well ahead of those countries at the bottom of the list, which include a number of its Sahelian neighbours. Efficient administration of the State and the absence of rampant corruption are further feathers in the nation's cap. These achievements have earned Cape Verde much esteem from its sponsors, which goes to explain the prudence of the Bretton Woods institutions and their relative sympathies towards the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unkind Mother Nature</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde's history has been punctuated by great famines. Between the sixteenth and nineteenth centuries the country suffered no less than 30 famines, with this century seeing some of the cruellest: 16 000 people died in 1903-1904, the death toll in 1921 was 17000, in 1941-43 it was 25000 and between 1946-48 famine claimed 20 000 lives - a figure which at the time represented 20% of the total population of the archipelago. After the last famine, the colonial authorities, under pressure from international opinion, adopted food programmes which made the country more able to cope with the consequences of subsequent droughts. The last great famine ended 50 years ago. The nation may no longer be hungry, but the factors which make its inhabitants' lives so difficult remain. The  main reason lies in the country's geography. Cape Verde has virtually no permanent springs and the topography of most of the islands, which are very mountainous, means that heavy rain simply runs down to the sea, the parched soil being unable to absorb it sufficiently. What is more, these downpours simultaneously wash away the little arable land that do" exist, thereby aggravating erosion. The whole situation is further worsened by the fact that the winter in this Sahelian region is very short. Despite huge efforts by successive governments, barely half the population has access to drinking water, with this figure barely reaching 25% in rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With a population of less than 400 000, there are just not enough people to pull off the miracle of making such an unforgiving soil bear fruit. Hence, although providing 50% of all jobs, agriculture represents only 17% of the nation's gross domestic product and produces only 10% of food consumed locally. The mountainous islands that make up Cape Verde are like teeth jutting out of the sea, and with virtually no continental shelf to speak of, small scale fishing is extremely difficult. Even with industrial equipment such as that installed on board large trawlers, catches are small - so small in fact that the country's fisheries agreement with the European Commission brings it only one million ECU over three years, one tenth of the proportional amount earned by neighbouring Senegal. Fishing thus represents less than 4% of the GDP.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mere survival - a</P>
+<P ALIGN="JUSTIFY">Herculean task</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Transport difficulties are another handicap for the economy. The sheer force of the harmattan, the strong ocean currents and the fog which often covers the region, make journeying by boat between the islands frequently hazardous. In addition, the volcanic relief of the islands makes them difficult to reach and means that there are very few locations that make suitable har  bours. construction is both complex and costly due to the steep rocky barriers that seal off deep valleys. Those roads which have been built under the FAIMO scheme (Highly Labour-lntensive Projects) have sometimes turned into real labours of Hercules, and many areas, especially those on sparsely-populated islands, remain completely cut-off. The use of aeroplanes only partly solves the problem. Although competitive, the prices charged by the national airline, TAICV, are still too high for the average inhabitant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Not only does the soil on Cape Verde contain very little water, it has virtually no natural resources: a few stones, lime, pozzolana and a little salt. Within the manufacturing sector (which makes up less than 20% of the GDP), only the construction and civil engineering industries, representing more than 10% of the GDP, contribute in any significant way to the economy, thanks partly to the transfer of currency from emigres who invest in the construction  sector and works with wide public interest. These works, known as FAIMO schemes, have to some extent given this impoverished country a gloss that masks its poverty. Launched after Cape Verde gained its independence, they employ more than 25 000 people for up to ten months of the year in the construction of paved roads or in reafforestation projects, and ensure the survival of one hundred thousand people - over one quarter of the population. The workers are on the whole recruited from among farm labourers, with another large section of the workforce being made up of 'Solteiras' or 'single women', numerous in a country where the male population is constantly emigrating. Unfortunately, the liberal option adopted by the present government has cast some doubt as to whether these projects will continue and this year, for the first time, work ceased in April - three months ahead of the usual termination date. Yet the poor wages which these seasonal jobs pay (ECU 2 per day) are sometimes the only source of income for some families.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only the tertiary sector shows a healthy balance of trade, accounting for  more than 60% of the country's gross domestic production, with the biggest slice of the sector going to the hotel industry, followed by the transport industry. Although, overall, Cape Verde's balance of trade records a large deficit, the balance of trade for the services sector generally shows a profit, with the transport services provided by the international airport, Amilcar Cabral de Sal, alone accounting for 13% of exports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Barely 10% of commercial goods are domestically produced and this has at times fallen below 5%. Cape Verde is therefore genuinely dependent upon foreign aid. Official development assistance represents 27.8% of the GNP (1989 figures), having risen from 17.7% to 27.2% of the GNP between 1980 and 1986. Cape Verde also relies on a second source of income - its emigrant population. In 1990 the currency transfers of its emigres represented nearly 20% of the GNP. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The colonial heritage</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contributing too to the country's poverty are relatively low educational standards. In this area too, successive governments have continued their predecessors' efforts to improve standards of education. However, at the time the country achieved independence, it was in a deplorable state. The reputation of a small intellectual elite of Cape Verdians had, over several decades, led the world to believe that Portuguese colonial rule had been 'enlightened'. This was a mere illusion. It was not until 1917, when the Mindelo grammar school was founded, that the country was able to claim an educational establishment of any cultural sophistication. The Mindelo school was the first state school in the country and it was to provide the nation with its first batch of 'home-grown' intellectuals. Until the middle of the nineteenth century, the Church, which was in charge of all matters educational, had provided basic primary education; then, at the end of the last century, it opened two secondary schools with the purpose of training students for positions in government and the civil service.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Even so, the Mindelo school remained an exception until the middle of this century. In 1950, no more than 5000 children received primary education and no more than 400 went to secondary school. Thirty years earlier, the figure was slightly higher, but Salazar, with his retrograde ideologies, saw education as dangerous and threatening and trimmed the number of schools on the islands from 150 to 60. True, Cape Verde was undoubtedly in a better state than other Portuguese colonies, but, with an illiteracy rate of 80% at the beginning of the 1960s, its position was nevertheless far from enviable. It was not until independence that any real progress was made, with 60% of children attending primary school in 1989 (the average for LDCs is 54%). However, this figure is still well below the average for developing countries, which stands at 90%, and even now, only 13 % of children have access to secondary education. As for higher education, this is virtually only available abroad; in Europe, Brazil, USA and Cuba, in particular.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Serious health problems still exist, exacerbated in particular by the scarcity of water. The cholera epidemic which has struck several African countries over the last two years has killed over 150 people in Cape Verde. The prevalence of AIDS exceeds the average for sub-Saharan Africa, with more than 2000 people being HIV positive and with some one hundred having developed the full-blown disease. According to official figures, 70 have died of the disease. The cholera epidemic which, unlike previous epidemics has affected towns much more than rural areas, is a sign of the deterioration of sanitary conditions in towns - particularly in Praia - affected by a lack of water, a dilapidated sewerage system and overcrowding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anchoring the country's economy in its culture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet, through all the doom and gloom, a small miracle is taking place in Cape Verde. Despite such a heavy burden of poverty, the country has, since gaining independence 20 years ago, managed to clamber up the league tables notably in the essential areas of health and education. Life expectancy at birth, which was only 52 years in 1950,  had increased in 1992 to 64.7 years, better than the average for developing countries and 13 years more than the average for sub-Saharan Africa. The infant mortality rate which stood at 110 per thousand in 1960, had dropped drastically to 50 per thousand by 1992, while virtually all children now receive essential vaccinations. Malaria is also now rare. In 1988 the GDP of Cape Verde amounted to only C.V.Esc 20 billion ($289 million), in other words, 6.9% of the GDP of Trinidad and Tobago, and 16.6% of that of Mauritius. But it is growing steadily. From 1980 to 1988, it grew by 6% per annum, compared with 3% per annum for the Sahel, and since 1980 the GDP per capita has doubled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The solution the nation's leaders should be seeking is greater integration in the global economy context by encouraging foreign investment. They do not need to create free zones but free enterprise, such as the shoe manufacturing concerns which, over the last two years, have contributed to achieving a considerable increase in exports. Various steps have been taken to attract investors, such as the adoption of the principle of tacit acceptance of applications for investment within 30 days. The Prime Minister, Carlos Veiga, and the 'Super-Minister' for Economic Coordination, Antonio Guelberto do Rosario, have highlighted the service, tourism and fishing industries as top government priorities. In order to develop these areas they intend to invest in infrastructures, with the aid, of course, of foreign backers. The modernisation of the port of S&atilde;o Vicente and of the international airport of Sal are currently underway, and the telecommunications project to link the islands by cable has also already been launched. The government's short-term plans also include the development of industries connected with the islands' culture. In the words of Mr Veiga: 'We in Cape Verde should develop our culture and use it as our anchor, to prevent our country drifting into oblivion. That way, our tiny country, which is fortunate enough to have a strong cultural identity, will be a Nation rather than a just a State'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H.G. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with President Antonio Mascarenhas Monteiro</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A wealth of culture and a realistic approach to diplomacy: Cape Verde's two major assets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- How the current government differ from the former administration which had Marxist leanings ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The two eras are distinct from each other in that, since 1990, the Cape Verde people have been able to choose a life of freedom and democracy. Before that, for the   first fifteen years after independence, there was a single-party system. So it is also valid to speak of a break - a break with the way in which institutions used to function at a political level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-The single-party era does not seem to have been as strict as in other countries and the current regime appears to be continuing along the same lines in some areas. Was the former administration not, to some extent, responsible for initiating the change which has taken place ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - No, that's something else entirely. I often say that we had a civilised single party, and I assume that is what you are referring to. However, it is not possible to speak of continuity when formerly we had a single party and now we have moved on to a system where there is freedom of expression and new parties can be set up. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Admittedly, the single party did initiate a change when it created the conditions necessary for the advent of democracy. It removed the infamous Article 4 from the constitution, which seates that the PAICV was the guiding force of society and the state. In fact, it was the PAICV which drew up the country's first electoral laws whereby we were elected. When I say 'we', I mean the party which is in power and also myself, President of the Republic. The single party thus opened the way to  democracy here: that much is undeniable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Am I also right in thinking that many of those who are in power today received their training in that single party ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - You are quite correct. When a change such as this comes about, one has to appreciate, and I do not wish to be elitist here, that it is the higher echelons of a party which lead the move towards change. Such people were there, working in the administration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Since politics gives direction to economic affairs, has there been a total turnaround in this sector, with a clear decision to opt for liberalisation and privatisation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Before 1990, we had a staterun economy. After that, the country's economy was opened up with a number of privatisations, fewer import restrictions, and so on. The word 'break' is also applicable in this area in that we now have a market economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Do you feel that the economy has really shaken off state control given that the govemment still manages important sectors, such as the price of raw materials ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That is necessary a market economy does not mean that the state is entirely absent. I am in favour of a market economy, but with state monitoring. As far as possible, the state has to correct the injustices which are necessarily generated by competition. This is not, as some would have it, ultraliberalism. The government is still entitled to monitor the economy, but the change has been greatest in terms of attitude, in terms of the way things are done.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Do you, like many leaders of developing countries, believe that the requirements set by international institutions as regards structure/ adjustment are too great ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - We are not subject to compulsory adjustment - it is on a voluntary basis here. However, I do feel that adjustment, as implemented in Africa, sometimes has regrettable aspects. On occasion, it is asking a little too much to impose the same requirements on countries whose actual situations are very different. What is applicable to Nigeria is not necessarily suitable for S&atilde;o Tome.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-The 1992 constitution switched Cape Verde over from a presidential system to a parliamentary system. As President of the Republic, do you fee/ trapped by this constitution ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Cape Verde's constitution was never a presidential one. The system under which I was elected is effectively 'semi-presidential'. Admittedly, the constitution which was approved by Parliament in 1992 reduced the powers of the </P>
+<P ALIGN="JUSTIFY">President, particularly as regards the right to dissolve Parliament - which was unrestricted in the 1980 text. The revision was made to permit democratisation and ensure the proper functioning of the institutions, and it was therefore fairly wide-ranging. Now, in order to dissolve Parliament, the President has to have the support of the Council of the Republic, which means that his hands are tied to some extent. Previously, the President could also dismiss the government, without too many restrictions. I would say that the President's prerogatives have undergone a substantial reduction in comparison with those exceptional powers. As for the rest, things are as they were. In a semi-presidential regime as that envisaged by the 1980 constitution, the President has no executive role.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You seem to have chosen to play the role of 'wise man' Some observers think you give the Prime Minister too much leeway.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - They are wrong. The Prime Minister's post is conferred on him by the constitution. He is Head of Government and it is he who governs. I cannot govern in his place. What is true is that there is a great deal of ignorance - people do not restrict themselves to their own fields and attempt to teach lessons in subjects they are unfamiliar with. Germany has a parliamentary  regime like we do - what is the position of the President of the Republic in Germany? If you were to ask a Cape Verde intellectual for the name of the President of Germany, he would be unable to answer you. The parliamentary regime does not give the President of the Republic any powers to run the country. I do not know what the Prime Minister can have taken away from me because I have no power for him to take over. However, I would say that, here, the President of the Republic does have a fairly high profile, in spite of his reduced powers, because all the country's citizens know him. In terms of foreign policy, he plays a significant role in that he represents the country abroad. I attend international conferences like the Rio Summit, go to meetings of the OAU and sign international undertakings on behalf of my country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The President is also the guarantor of the new democracy, which observers seem to regard as well-established. But there still seem to be some bad habits. For instance, I have heard criticism of MPD power and of the fact that state  resources are made available to one party at election time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Look, this is criticism from the government's opponents - it is a normal state of affairs and happens everywhere. Any party, in any country, which has a parliamentary majority, can govern easily. This is possible, even when the majority is very small - and even in Europe. Look at Portugal when Cavaquo Silva was Prime Minister. There were people who said it was a PSD State. You will be familiar with France when Pompidou and even de Gaulle were in power, and Francis Mitterrand used to speak of a Gaullist state. As far as the election campaign is concerned, I am not aware of the government here having monopolised state resources and I don't believe this has happened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Another important factor involved in democracy is the press. Several journalists from the private media sector are awaiting a decision from you on a number of points - for example the lack of pubic support for the private press - in contrast to thestate-run press which has access to all that it needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - What decision are they waiting for ? Do they want me to decide in favour of resourcess being given to the private media ? I have already done that on a number of occasions. Recently, I had a meeting with the Prime Minister and I brought this matter up. He told me that it was something that was currently being considered. Sometimes, however, I get the impression that some of my critics want me to do the work of an opposition leader and to oppose the Government. That is not my job. I think that the President of the Republic, in a regime such as ours, ought to be a unifying force and not someone who foments political tension and instability. That is something I have always tried to avoid, but I do have sufficient courage to tell the government and the Prime Minister exactly what I think and I have actually dared to criticise them publicly several times. I am sole judge of the criticism I make, and I decide if it is appropriate and also when the time is right. Sometimes, people would have   me criticise the government according to a timetable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· A number of journalists in the private sector are currently being prosecuted and these actions nearly all originate from sources close to the government Surely if they were actually acting unprofessionally, we would see legal actions from parts of society, such as business, and not just from the political class.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The reason for this is very simple. It is the political class that they vilify. I myself have been insulted on a number of occasions and, despite having put up with it for five years, I have not instigated any lawsuits. There was one case which was taken seriously by the Attorney General's office and there  were other cases when the Prime Minister was called a thief. I would ask you, is this a normal state of affairs ? Does freedom of the press mean that it can call a Minister or the Mayor of Praia a thief? Is that what is meant by democracy ? You have to be aware of the background to these court cases - and there are a good many of them, some dating from 1991. They are not designed to 'get at' any particular newspaper. The reason many of these cases have been brought is because serious insults of the kind we are talking about are a crime. That is true of even the most advanced democracies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In economic terms, Cape Verde does not appear too badly off. But some economic indicators do give rise to concern, notably the big gap between the export and import figures. How do you see your country's future when it no longer relies so much on international aid ? Do you believe in the dream of many of your fellow countrymen, that Cape Verde will be Africa's 'little dragon'?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Unlike some people, I have never spoken of becoming a dragon. I don't like this expression. I do believe that, despite our enormous problems - Cape Verde has few resources and we have been in the grip of drought for many years - it does have a number of assets. We are capable of making progress and I believe that there are a number of promising areas which have already been identified: for example, fisheries, tourism and even 'foreign' investment. We have to be optimistic about Cape Verde's future. We are in a difficult situation, everyone knows that, but we are a hard-working and courageous people and our prospects are good. The country will be able to forge ahead.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-On the diplomatic front, Cape Verde appears something of an expert at maintaining good relations with different regimes: for instance, with both Israel and the Arab countries, with China, and with South Africa before and after apartheid. How do you manage this ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - There is no magic formula. Since independence, Cape Verde has tried to adopt a realistic and pragmatic foreign policy. We are a small country with no great influence on the international scene and we have to be on good terms with everyone. That is the principle on which we base our foreign policy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Cape Verde and Guinea Bissau used to be fairly close - do you foresee any future rapprochement, perhaps in some form of federation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is difficult to say. I feel that there is already a degree of rapprochement in progress, particularly in economic terms. Recently, we signed a civil aviation cooperation agreement, and there are opportunities for similar achievements in the fisheries and shipping sectors as well. Relations between the Cape Verde and Guinea Bissau governments are excellent but, to my mind, the idea of our forming a federation is out of date. It would not be in our interests nor in those of Guinea Bissau. We do, however, intend to develop a closer economic relationship and our political relations are very good indeed. I would wager that our partners in Guinea Bissau would give you a similar analysis of the situation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-In cultural terms, can it be said that your country has succeeded in becoming a multi-ethnic state ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The important thing is that the Cape Verde people should have their own identity; that there should be a specific Cape Verde culture. What I would say is that all the citizens of Cape Verde are proud of their culture and citizenship. This constitutes a great source of strength for a country such as ours which has major challenges to overcome. Our culture is also an asset in our country's development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interview by Hegel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interview with Aristides Lima, leader of the Opposition</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'The government owes its victory to abuse of the electoral system'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· As main leader of the Opposition, what are your views on the fact that the governing party has recently been reelected ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I believe the country's economy is in crisis. Growth rates are not very high, just like in the 1980s, for example, and there is a high level of structural imbalance. Unemployment has increased: in 1990, unemployment stood at approximately 25% and now it is 30%. There used to be 25 000 people who worked in what we call the high intensity labour sector and who had a job for about 10 months of the year. They were recently laid off early. Such jobs were part of a social programme which, amongst other things, enabled us to build roads. The prices of staple products, such as sugar, maize and rice, which were stable, have just gone up, and the price of cement, which was also controlled to promote economic growth, is no longer subject to the same control and I can foresee this giving rise to many problems in areas outside the towns and cities. In Praia, a 50-kg bag of cement used to cost 440 escudos and, although that price will stay more or less the same, on islands like Fogo, it will go up to about 660 escudos. This will generate problems for economic growth and a number of major projects in the tourism sector, for example, will suffer. The balance between exports and imports has also been adversely affected in that the level of coverage of imports by exports has fallen, despite announcements to the contrary made by the government.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· From 1993 to 1995, exports tripled in volume, if the government is to be believed. What are your thoughts on that ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The problem is that, in this country, some exports rely on the import of considerable amounts of raw materials. For example, in S&atilde;o Vicente, there is a shoe-manufacturing plant which gets its supplies of raw materials from abroad. The same applies to fishing and a number of fisheries products, such as anchovies, which are still canned in S&atilde;o Vicente but which have to be imported from Chile or elsewhere. This causes great problems when it comes to managing the country's foreign currency reserves, which have fallen markedly. In 1990, reserves provided over 6 months' coverage for imports, but now we have to operate in terms of weeks or even days.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Nevertheless, the government could say that it is not responsible for the economic picture you have just painted because the world economic situation is hitting all small countries harder.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - No, the government is responsible, because it has been unable to implement the appropriate liberalization policy. For example, this should have been applied gradually to the trade sector, but the government rushed in and has now had to backtrack on goods which needed import authorization. What happened was that it lifted this authorization requirement but has now  had to bring it in once again. And another thing, the policy of liberalization has not been accompanied by very high levels of foreign investment and, in addition, the country's skilled workers feel marginalised, all of which goes to make the situation worse. As for structural adjustment, the government has always supported the idea of 'less State equals a better State', but, in practice, we have seen spending on the State's everyday activities go up and up. Civil service staff levels have now risen to about 12 000, compared with the former 10 000. However, increased spending is also a result of a not always equitable wages policy - the difference between the highest and lowest salaries is huge and, in some public bodies, one worker might be earning 15 times as much as another.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· According to the Minister for Economic Coordination, the currency is under pressure as a result of the Opposition's irresponsible scare tactics of announcing a future devaluation, leading to the stock-piling of currency and goods, a kind of artificial speculation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That's a very good way of offloading one's responsibilities - the Opposition did no more than criticise the government's policy and point to the   facts of the situation. It was members of the government themselves who acknowledged the low levels of currency reserves and the State bank which suspended transfers abroad. The Minister would have people believe that the Opposition lacks any credibility so how could this same Opposition have any influence on peoples' behaviour? The problem is actually extremely basic: economic operators, society and foreigners are not really au fait with the country's real economic situation because the government does not issue information, which is one of our basic criticisms. Parliamentary representatives and political parties no longer receive the figures they need and the latter are sometimes forced to consult foreign sources or to rely on their personal links with people who are close to sources of information. I myself criticised the Prime Minister for adopting this attitude of regarding information as subversive. I asked the Prime Minister for a copy of the study on Cape Verde's economy by a Portuguese professor, which had been paid for with tax payers' money. I never received it. For our part, we hope that Cape Verde's partners will be able to recognise the true situation and persuade the government to act in a more equitable manner.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Nonetheless the people cannot be too disappointed, because they reelected the government for another term.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That could be explained in many ways - the government controls information and therefore holds the reins of power. It controls television, radio, part of the print media, and the private-press sector is fairly weak, so it has been able to manipulate information and give people the idea that the country is on the right track. The government did do things to change peoples' lives, but it exaggerated its achievements using the State social communication means available to it. In fact, it did not achieve the major objectives it set itself: firstly its fight against unemployment - a failure. Balancing foreign economic relations - another failure. Balancing the domestic  economic situation: differences between our various islands have become more acute. In matters of health, Cape Verde made major advances when our party was in power and, although, to all intents and purposes, the health sector is just as good when compared with other African countries, it has, in fact, deteriorated. Diseases which had been eradicated from the country are returning, like malaria, for example, cholera, etc. Health services are concentrated in the capital city, Praia, and there is no decentralisation, which has negative effects on even links between carers and patients. Humanism shows the effects of a situation such as this, and it applies not only to health: there is an unfair distribution of State financial resources between the central government and local government. The State has been unable to reform local finances and has politicised transfers of funds to those districts which are closest to it. The government has also profited from the structural problems encountered in the working of our democracy. One of these structural problems is Parliament's weakness: it sits only three times a year and the representatives do not work full-time - they are sometimes employed by the administration which they are supposed to monitor. Democracy has a price and although savings can be made in other spheres, when one is  seeking good governance, one of the conditions for which is a strong, functional and effective Parliament, this is not possible. The weakness of the private-press sector is yet another problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-And are you continuing to work in the administration ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I am a 'full-time' parliamentary representative. There are now about 10 out of 79 representatives who work on a full-time basis. They are members of Parliament's office, chairmen of committees and parliamentary leaders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-The government says that it inherited a serious state of affairs when it took over power from the PAICV.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is simply not true that the good life began with this government's accession to power. Here's a little history lesson: think back to colonial times. Admittedly, there were negative aspects to our time in power but you must remember that the PAICV did, in fact, leave in place the subjective.  physical basis for the new policy direction. When we achieved independence, Cape Verde had no ports or airports, apart from small-scale port facilities at S&atilde;o Vicente. We built the port at Praia, the port at Sal, the port at S&atilde;o Nicolau and a number of airports. The telecommunications system was also set up by the PAICV government and we implemented the initial educational reforms. In the 1980s, the GDP growth rate was 7%and the per capita income was one of the highest in Africa, more than $820.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The party in power describes the PAICV as marxist and non-democratic claiming that it was they, not the PAICV, who introduced democracy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That is nothing more than rhetoric, because all of the current governing party's members were in the PAICV - they were radicals, more marxist than anyone. Everyone knows that here, in Cape Verde, we had a pragmatic party, not a marxist party, although marxism was a source of ideas for many people. The idea was not to build socialism here. In those days, we had an open, not a centralised economy and all trade was private. We always had a market economy and to describe us as non-democratic is idle rhetoric. The PAICV's ideology has always been one of national liberation based on political and economic independence, with power vested in the people. This was a normal state of affairs during a national liberation struggle and, although it would be true to say that we were influenced by a certain single-party model which had gained widespread acceptance in Africa, the single party here could not be compared with any other. Both the PAIGC and later the PAICV attempted to force people into taking part in citizens' assemblies in order to put forward suggestions to the candidates. The current Prime Minister, Mr Veiga, for example, was put forward by a militants' assembly - he was on the PAICV's lists and they used to sit one beside the other on the benches in Parliament. The regime was, I suppose, slightly paternalistic but it was the people themselves who were really responsible for national liberation, it was they who had an idea of justice, patriotism, of being African, which explains the total commitment of Cape Verde's people to our party in the struggle for independence and also the good results we achieved when in power.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Why, then, were you not re-elected ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The party had been in power for a long time, with the same president, the same prime minister, the same president of the national assembly and virtually all the same ministers. People were hungry for change because the ruling elite had been in place for so long. The international scene, also, did not favour the old single-party system. Another element, too, was the Church, which fought us over the question of abortion. Perhaps I should point out that, from the very beginning, a section of the Catholic church was not in favour of independence, but younger members of the clergy, with more sympathetic feelings towards the population, supported us and, thus, we changed peoples' attitudes. The Church in Africa is a phenomenon worthy of greater analysis, particularly in Cape Verde, where, I feel, the current government was able to take advantage of the Cape Verde peoples) essentially religious nature to criticise us and present us as an anticlerical party. In fact, the situation is quite different: most PAICV leaders and militants are Roman Catholics and some church" were damaged by opponents in an attempt to discredit the party. Another example of abuse of the electoral system, apart from taking advantage of the peoples' religious nature, is the country's poverty. During election campaigns, the government make it easier for people to obtain food, and it also creates more jobs, en masse, but these disappear again after the elections - precisely as is happening at the moment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· As it is governed at the moment, Cape Verde is regarded by other countries as a 'star pupil'. Surely this is another success for the government ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Cape Verde has always been regarded as a star pupil because, here, our society is fairly homogeneous and there are no major social or ethnic imbalances. However, in my opinion, the future depends on changes at a structural level and such changes cannot take place unless we have a functioning parliament and a strong private press. I cannot deny that the government has had some successes, but I also believe that the people will have an opportunity to judge how it keeps its promises.  interview by Hegei Gouger</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">A portrait of towns and cities with atmosphere</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It suffices for an unruly little bird to escape</P>
+<P ALIGN="JUSTIFY">For, suddenly, Fire to spark, Night to dissolve</P>
+<P ALIGN="JUSTIFY">The walls of every prison to cave in</P>
+<P ALIGN="JUSTIFY">From the tidal-wave battering</P>
+<P ALIGN="JUSTIFY">Amassed, in its untamed heart,</P>
+<P ALIGN="JUSTIFY">By a tiny breathless bird.</P>
+<P ALIGN="JUSTIFY">(Mario Fonseca in 'La Mer a tous les coupe')</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most cities in the Third World devote all their energy to mere survival and there are few imbued with the same atmosphere as Mindelo - the very air  appears to brim over with art and good taste, beauty and sensuality. Our guide to the city speaks slowly, measuring his words, his delivery not an indication that he is searching for a translation, although it could be interpreted as an affectation, but matching the modulation of the language which is closest to his heart: 'I believe the air in this city is imbued with hedonism. Here, we mix work and pleasure - today is a holiday, but I am working. However, my day is not so rigidly timetabled that I cannot do some work and, since you have invited me out for a drink, take some time off to accept'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antonio Firmino, director of the Craft Centre, continues to tell us about his favourite city in the same steady language, a dreamy look in his eyes and wearing a Che Guevara-style beret. The tale he tells is the story of a tiny country which has fallen in love with culture: the actual building housing the Craft Centre used to be a school, the 'Mindelo Technical College', founded in 1917, the first secular educational institution. It was to transform the city into a cultural haven. The story goes that a certain senator named Vera Cruz, who represented the island of S&atilde;o Vicente in the Portuguese Senate, wanted to establish Cape Verde's first college. His peers objected, arguing that Mindelo had no building worthy of housing an institution of such a high standing but</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vera Cruz straight away replied: 'So, why not use mine?'. Thus, he casually handed over his private residence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Art even in the fish market</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How many inhabitants are there in Mindelo? According to Antonio Firmino, 'Just me and my friends'. How right he is. It would be impossible not to become part of such a captivating place. And so a long journey began, which included the creation of Claridade, a review (and cultural movement) established in 1938 by Balthasar Lopes, a writer and essayist of world renown who was born in S&atilde;o Nicolau but taught in Mindelo, and other great artists who were to make up the country's literary and artistic roll of honour. Claridade was to be followed by Certeza which was also to influence the cultural elite. Although historians and other commentators feel that Claridade did no more than praise Cape Verde's 'latinity', rejecting its African side, artists are unanimous in regarding it as the cradle of Cape Verdian intellectual culture and the soil which was to nurture Mindelo and make it such an extraordinary little town. The impression is that everyone here is interested in art - the local authorities encourage and help sculptors in their creative activities all over the town, making it a living museum: here, there is a painting by Antonio Concei&ccedil;&auml;o and, over there, a huge flat sculpture of couples in languorous embraces, by Ro and Anildo, an illustration of the marvellous hedonism evoked by our host.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The same assured but delicate touch of these two artists can be seen in the lobby of Fishpackers, an anchovy- and tunapacking company, this time in the form of a celebration of fishermen. One of the finest examples of this type of art, which can be seen everywhere in the streets and public places, is the sequence of four huge decorative-tile frescoes in the fish market. When Bela Duarte showed them to us, it was such a delight to see how much at ease this famous artist was in the company of the staliholders, to whom both she and her work seemed so familiar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over and above this hedonistic atmosphere, there is, in Mindelo, an eclecticism which can be detected just as widely in other towns and cities, which means that you can talk about painting with the President of the Republic, dancing with a factory manager and decorative tiles with the man in the street. And the latter is literally 'in the street' - the inhabitants of S&atilde;o Vicente, the capital, derive immense pleasure from strolling in its squares and narrow streets, and around the port. A little stall, looking like a sugar loaf in the middle of one of the city's many squares, opposite a grand hotel, opens up in the early evening just like a flower, attracting hundreds of people to it who come to quench their thirst, to converse or woo, and to dance to the music escaping from the terrace of the Porto Grande Hotel, which has just reopened after being privatised and modernised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is as if a dress ball were taking place on two different levels, one in front of the other, dancing to the same music and with equal pleasure: above, in an enormous gallery open to the sky, elegant guests (who include a small gathering of government officials and pretty Brazilian actresses who are here to film television soaps) and, down in the square, the dancing promenaders, full of admiration, almost stimulating those above.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verdian nights</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like all the island's intellectuals, Antonio Firmino has a number of different jobs. In addition to running the </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Craft Centre, he teaches 'nautical' English to would-be sailors, is an amateur painter and musician (he plays and composes for his wife, who is a singer). His spare time is devoted to writing a column. The Craft Centre exhibits, amongst other things, a large number of tapestries, an art form much prized in Cape Verde. These admirable examples are by Ju&auml;n Fortes, Juamo Pento, and a good many others, in particular Bela Duarte, Tchal&ecirc; Figueira, Lucia Queiros and Miguel Figueira, Mindelo's top artistic foursome who appear to be  involved in everything, including the frescoes at the fish market. Bela, who showed us her studio, her house and the fish market, does not conceal the joy she derives from colour and allusion in her pictures, tapestries or decorative tiles, ranging from the most distant abstraction to an anecdotal figuration, using her native land with its doleful nuances, soft cries and romantic strength as raw  material. Above all, there is convivial artistic writing: 'Resistencia', which is at first sight a tapestry and then a patchwork of colour and sinuous lines. Scarcely has the artist begun to explain her work than everything becomes clear: this is a story, in threads and colours, about drought, representing roots, energy, space and struggle, all part of the Cape Verdian soul. She is also paying homage to those weavers of traditional African loincloth (badiu) from Cape Verde from whom today's artists inherited their technique.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So, where to meet Antonio's friends? To find them, look no further than the Cape Verdian nights (noite caboverdiana), those gatherings which take place everywhere and resemble both a nightclub and an artistic association, all those present sharing a fondness for Cape Verde mingled with nostalgia and yearning. One such place is the Piano Bar, which was closed on account of the departure of its owner Chico Serra, another notable in local society, who was accompanying a friend, C&eacute;saria Evora, in her attempt to conquer new lands. Mission accomplished, Chico Serra is back and will soon be open for business again, his club's atmosphere just as intimate and warm as before - just enough room for his piano, his musician friends and others who come to sample grog and music.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Africa nonetheless</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mario Fonseca also adores Mindelo but he would not agree that that wind-blown city has a monopoly on art and culture. He is from an island in the lee of the wind, from Praia, capital of the island of Santiago and of the country. In his opinion, it is the whole of Cape Verde which is bubbling with creativity and he will enchant you with his tales of Praia and its old colonial district, the 'Plateau', which still retains much of the nostalgic character to be seen in the now yellowing photographs taken 50 years ago when the city was not so sprawling and the ambience of Sucupira market was almost tangible. He will also tell you everything about the island of Santiago, with Cidade Velha, the ancient capital  which was too difficult to defend against repeated pirate attacks. It bowed to Praia's supremacy and, today, has an old-fashioned feeling, nestling within a cove around the ruins of its castle, and dominated by the fort which perches above a cliff face. The architecture owes much of its charm to the predominant Creole style which is vaguely reminiscent of Portugal, in every pastel shade. Cidade Velha's central square is caressed by a gentle breeze and groups of young people can always be seen lazing around the monument to the slaves. Time seems to stand still. The pretty little white church whose walls are decorated with sheaves of bougainvillaea, Santa Maria do Rosario, is the oldest on the island and, indeed, along the entire West African coast. It was built in 1460 and the white marble paving in the central nave conceals the final resting place of grandees from colonial times, their epitaphs erased over five hundred years by the soles and knees of penitents.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The director of the INAC (National Cultural Institute), responsible for Praia National Museum (which is soon to open its doors), is Mario Alberto de Almeida Fonseca, who once taught French in Portugal; he is a former administrator who has worked in Mauritania and Turkey, a translator and also a former regional manager of the national airline. In addition he is a poet whose works have been translated into several languages, including Serbo-Croat and Russian. Above all, he is an amateur connoisseur of the art and artists of his country. As the INAC's director, he is responsible for cultural events, exhibitions, shows, publishing and also the compilation of an oral record of the country's history and the preparation of  a Creole dictionary. The INAC's work also involves a major history of Cape Verde, the first volume of which has already been published. He will show you the future National Museum's collection, moving from one painting to another, from an old photograph to an antique cimboa, a type of locally-manufactured violin from the 1 9th century, or to an old Massachusetts galleon, testament to the past explorations of his people. You will first of all discover the works of artists from Praia such as Mito and Kiki Lima, not on account of Fonseca's chauvinism but because he feels he has to 'convert' the visitor who may have left Mindelo with the impression that that city is Cape Verde's premier cultural centre. There is also the music from the island of Santiago - the funana, the batuque, the fina&ccedil;o - all more African than the languid style so influenced by the Portuguese fado of this island's musical groups (Fina&ccedil;on, Bulimundo, Tuvaroes, Kod&eacute; di Dona or the great traditional style singer Nha Inacia Gomes). Gomes is a 'women of the people' whose musical heritage consists of no more than local tradition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It was she who 'reinvented' jazz and whom Alberto Fonseca admires a great deal. Cesaria Evora, moreover, is not the first musician to publicise Cape Verdian music abroad: Fina&ccedil;on or Kod&eacute; di Dona, for example, have captivated many music-lovers, particularly musicians, in Europe and America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Chamber and the stage</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Daniel Brito is not from Mindelo either. He is from Sal but confesses to having to pay regular visits to Mindelo, to immerse himself in that city's hedonistic atmosphere. For three years he has been director of the National Cinematographic Institute which was established in 1967 and is currently exhibiting newfound dynamism on account of the 'production tax' (4% of the filming budget, paid to the Institute and generally converted into a holding, which the State supplements to make the sum up to slightly more than 10% in co-productions). There is also an agreement with Portugal which encourages co-productions between the two countries, thereby enabling Cape Verdian technicians to receive their training. Brito is working on a local video-film-production project (TV viewers are very fond of such things) and wants to set up a major production centre to be made available to lusophone African countries and, perhaps, others. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Daniel Spencer Brito is also Sal's parliamentary representative (10 000 inhabitants), musician, writer/composer and guitarist in his own group, Madrugada. His talents include the composition of morna and coladeira pieces, as well as jazz-rock. At the end of May, the MP was due to appear in his own production at the Cirque d'Hiver in Paris, as part of the lusophone music festival. You could say that he divides his time between the Institute, the Chamber and the stage; however, he is also involved in research into copyright protection in Cape Verde. Daniel (it would never occur to you to call him anything else, even five minutes after making his acquaintance) always gives the same advice to anyone wishing to discover Cape Verde, namely to get to know the atmosphere of a tocatinha, spontaneous jam sessions which take place at one location or another, usually even more intimate than the 'Cape Verdian nights'. By the way, I almost forgot - by training, Brito is a vet, having studied in Romania. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H&eacute;gel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Cape Verd-EU Cooperation</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sponsors are delighted at the full use of aid</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde's physical characteristics - its small size, the fact that its territory is scattered over a number of islands and islets, its Sahelian climate (continually rendering it vulnerable to drought), the arid nature of the soil and its low population (under five hundred  thousand inhabitants) - might explain its high levels of poverty and mean that, in order to survive and develop, it requires considerable amounts of foreign aid. However, it is the effort made by this small country to stabilise its economy and to gain maximum profit from foreign aid which has attracted special attention from sponsors. Last year the European Commission decided to increase its contribution to Cape Verde's National Indicative Programme, within the framework of the Lom&eacute; Convention (tome IV, first protocol 199-95, seventh EDF) by 7%, i.e. an extra ECU 1.7 million. Cape Verde had already put virtually all the ECU 23 million allocated to it to good use, an indication of the government's desire to use the aid granted to the full.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When realism is a luxury</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is difficult to imagine an island inhabited by 160 000 people - the island of S&atilde;o Vicente, where the country's second largest city, Mindelo, with its population of 70 000, is located - having no source of drinking water. In former times, water was shipped in from the neighbouring island of Santo Antao, but Mindelo now has a number of seawater desalination plants, most of these provided by Israel, which meet 100% of its supply needs. The supply of both water and electricity is managed by</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Electra, a publicly-owned company, which, within the framework of the EDF (European Development Fund), has received European Commission aid to increase its electricity-generating capacity. It has set up three wind pumps, of Danish manufacture, which alone supply 13% of the island's non-industrial requirements. Elsewhere, such solutions as sea-water desalination and wind pumps might appear to be unrealistic but, for 160 000 people with no indigenous supply, realism is sometimes a luxury.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the island of Santiago, which is home to Praia, the capital city, does have some natural water sources, these are far from sufficient for its needs. One of the projects recently financed by the European Union concerned improvements to water-distribution systems, water purity and rainwater drainage. Amongst other things, this work involves the recycling of waste water which the island cannot afford to let drain away. Cape Verde's Achilles' heel is definitely its lack of water, its strong point unquestionably the dynamic outlook of its population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has an office on Cape Verde where the work done at Praia (water distribution and purity, support for poorer districts of the capital threatened with overpopulation) is regarded as symbolic of the EU's desire to take account of both weaknesses and strengths and represents the overall intention behind Community aid to this country. Generally speaking, such aid is geared towards infrastructures (water and electricity production and distribution, urban development) on the one hand and education and health on the other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Praia's historic old town, the 'Plateau', with its wealth of fine colonial and neo-classical architecture, risks losing many of its buildings which have been abandoned by their owners who lack the means to maintain them. Community aid has also been provided to help save this part of the country's heritage. Funds are insufficient to finance a complete restoration of the 'Plateau', but, following the example of the Cape Verde government, which has maintained administrative buildings in good condition, the Commission will probably assume responsibility for renovation of a superb nineteenth-century building, the 'Case Cor-de-Rosa'. The purpose of this project is two-fold; not only will the building be restored, but also it will become the core of a more general project to train professionals in building techniques and restoration and it will serve as an example to motivate future purchasers, institutions, businesses and individuals to preserve the historic old town.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Community has also funded a study into the preservation of the capital's historic old town, which has been used as a basis by Praia Town Council. A project is currently underway, costing 1 million ECU, to restore an islet. The principal aim of this project is to train Cape Verdian technicians. Other work in the field of training has induded the building of the Praia Technical College. The next phase of this project, worth almost ECU 1 million, will fund the supply of equipment and teacher training.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Still within the context of the overall project to develop Praia city, an EDF programme worth ECU 1.3 million has been created for the development of a designated area as an industrial site. A rural electrification project in the area around Praia was, at the end of 1995, granted a budget of ECU 1.5 million and will benefit a population of 7500 people living in the three most densely populated rural centres on the island of Santiago. The technical side of the works will be entrusted to Electra, with the private sector being responsible for supplying equipment and monitoring the works. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde's 'essence' as a resource</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cape Verde's leaders regularly point to the richness, which they term the 'essence', of Cape Verde, contrasting this with the fact that their country is so poor. Indeed, despite limited resources, this country devotes a great deal of energy and ingenuity to 'cultivating' its culture. Two projects, financed within the framework of the National Indicative Programme and amounting to ECU 500 000, concern two feature-length films and will play a part in lessening the island's isolation by publicising its culture and people abroad. The first film, made during 1995 and entitled 'llh&eacute;u de Contenda', is the first fiction-based feature film to be made in Cape Verde and is the work of Leao Lopes, a director who has drawn his inspiration from the work of another Cape Verdian citizen, Teixeira de Sousa, and which centres on the history of Cape Verde and the birth of its national identity. The EDF contribution (approximately ECU 250 thousand) amounts to 14% of the total production cost. The film is currently being shown in a number of European countries. Virtually the same amount of  money has been set aside to fund another production, this time by a Portuguese director, Francisco Manso, based on a novel by a Cape Verdian author, Germano de Almeida, and entitled 'O Testamento do Sr. Napuceno', which was being filmed on the island of S&atilde;o Vicente at the time of our visit. 50% of the finance for this film comes from Portuguese producers, the other co-producers being French and Belgian.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Others EDF projects recently completed or being completed include one for improving roads on the islands of Santiago, S&atilde;o Nicolau and Maio (ECU 3 million) and a micro-project programme (ECU 1 million). In addition to funds from the EDF, Cape Verde has received further finance under the Lom&eacute; Convention, including ECU 700 000 within the context of the Stabex transfer schemes to offset loses in the banana-production sector during 1994.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Design a micro climate</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Extemal food aid is essential in a country which cannot meet its own requirements and the Commission's most recent food-aid-budget contribution amounted to nearly ECU 2 million. Other special budget lines include funds provided under 'Human Rights and Democratisation in Developing Countries'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To an attentive foreign visitor, one of Cape Verde's most interesting achievements is the progress it has made in reforesting such an infertile soil. One of these reforested areas, covering 5000 hectares (1990-94) forms the basis of a regional project to disseminate knowhow accumulated in this sphere in Cape Verde. Training course. have enabled technicians and others involved in the reformtation of the Sahel countries to gain experience in methods which have proved succesful here. The production and distribution of teaching tools (books, posters, films, etc.) supplement the project. Since independence, Cape Verde has achieved a tenfold increase in the amount of land which is forested - admittedly there was little to start with, but since climatic conditions are so hostile this result can be regarded as a major accomplishment. There is even a hope that a micro-climate might form. On the island of Santiago, in some of these new green areas, wild duck which had long since disappeared have returned. It is nice to dream but the country cannot afford to rest on its laurels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">H&eacute;gel Goutier </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Profile</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Area: 4 033 km2 Population: 390 000 (1990) Population density: 97 per km2 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population growth rate: 2.8 % (forecast for the period 19922000) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capital: Praia (pop. 75 000)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other main town: Mindelo (pop. 65 000) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Languages: Portuguese, Creole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Currency: Cape Verde Escudo (CVE). In May 1996,1 ECU was worth CVE 104 ($1 = CVE 83 approx.) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Politics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government: Mixed presidential/parliamentary system. The President is not the head of the executive but he represents the country and is guarantor of national unity and the Constitution. Unicameral Parliament. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">President: Antonio Mascarenhas Monteiro (elected in 1991 and reselected at the beginning of this year) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister: Carlos Veiga (since 1991) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Political parties represented in Parliament:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Movimento pare a Democracia (MPD)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Partido Africano pare a Independencia de Cabo Verde (PAICV)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Partido da Convergencia Democratica (PCD) - formed as a result of a break away from the MPD</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Party representation in Parliament: MPD 50, PAICV 21, PCD 1 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(1992 figures)</P>
+<P ALIGN="JUSTIFY">GDP: CVE 23.9 billion</P>
+<P ALIGN="JUSTIFY">GDP per capita: US $840</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Origin of GDP by sector: agriculture 13%, industry 17%, services 70% </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Real GDP growth (estimate 1995): 4% Balance of payments: deficit of CVE 11.9 billion </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Main trade partners: Portugal, Spain, Netherlands, Brazil. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Annual inflation rate: 9.1%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social indicators</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy at birth: 64.7</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Infant mortality per 1000 live births: 56 Adult literacy: 66.4% </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enrolment in education (primary, secondary and tertiary): 59% </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Human Development Index rating: 0.536 (123rd out of 174) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sources: UNDP Human Development Report, 1995; Economic Intelligence Unit 1995; 'Etat et soci&eacute;t&eacute; aux iles du Cap Vert, by Michel Lesourd. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p32a.png"></center><br>
+ Figure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Europe</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The Lom&eacute; Convention in focus</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Poll results and new brochure launched in Brussels</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A new poll of Europeans high lights a deficit of information about the European Community's development policies. A brochure just published on the Lom&eacute; Convention, available in all EU languages, seeks to fill some of the gaps.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At a press conference on May 21, Development Commissioner, Joso de Deus Pinheiro, unveiled the findings of a survey commissioned from the Brussels consultancy, International Research Associates (INRA). The aim of the exercise was to sound out how Europeans perceive developing countries. The sample was 16 346 people, of 15 years and upwards, who were polled in the 15 Member States during December 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The survey shows that since 1991, helping the poor in the developing countries has slipped in the 'league' of issues of most concern to Europeans. The subject now ranks eighth in a table topped by the fight against unemployment. But the better news is that Europeans believe development of these regions should be the fourth most important priority for joint actions between Member States. This comes just below combating terrorism, environmental questions and defending Europe's economic interests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While 82% of Europeans are favourable to development cooperation, 12% are against. The degree of support varies, as one would expect, from one EU country to another. Interestingly, the survey shows that Member States facing an economic squeeze are the most reticent, irrespective of their past track record in development aid. In Belgium, only 65% are in favour while in</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Austria and France, the figures are 69% and 72% respectively. At the other end of the scale, Greece comes out top with 97% just ahead of Spain on 96% and Ireland on 91%. INRA's explanation for this variation is that it reflects the economic problems which are increasingly being felt in northern states of the Community. It is also worth pointing out that nations on EU's southern flank may be more convinced of the effectiveness of aid since they themselves are recipients of EC structural funds allocated to modernise the Union's disadvantaged regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But INRA's report also reveals some misconceptions about European development aid. These, says Commissioner Pinheiro, may be attributed to the lack of visibility of the relevant development policies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">57% of those questioned believe that the bulk of the Community's assistance consists of emergency aid, rather than longer-term project support. The reverse is actually true. More people answer 'no' then 'yes' to the question: 'Does aid contribute to reducing poverty in developing countries'? And most consider that United Nations agencies (UNICEF, UNESCO etc.) do more in the  field of helping developing countries than the EC. Non-governmental organisations also have a high profile, with the EU Member States and Bretton Woods institutions (IMF and World Bank) trailing behind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other key findings from the poll - which Professor Pinheiro says will provide much food for thought in the coming months as thoughts turn to cooperation after Lom&eacute; IV - are highlighted in the box.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mid-term review and beyond</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Professor Pinheiro feels that some of results, which signal the need to tighten up on the management of development aid, have already been addressed in the mid-term review of the Lom&eacute; Convention which will come on stream from the beginning of 1997. The programming of the eighth European Development Fund (EDF) is already well under way and, with a view to increasing the effectiveness of aid, just 70% of resources earmarked for each ACP state will be allocated at the outset (for a three year period). An analysis of how the remainder should be spent will take place at the end of the three years. In addition, Professor Pinheiro indicated that a 'strategic' document was being drawn up on each of the 70 ACP states prior to allocation of funds. This was being done in 'permanent consultation with Member States and Commission delegations, in the interests of achieving a real synergy between the two.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More sweeping changes to the relationship are likely after the current</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some key findings from the INRA report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Aid must reach its intended destination and arrive where it is needed 93.2%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Aid must meet the needs of the local people</P>
+<P ALIGN="JUSTIFY">90.7%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The beneficiary state must raspect human rights</P>
+<P ALIGN="JUSTIFY">85.1%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Transparency, effective public management and the fight against  corruption are essential</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The beneficiary state must respect an overall development plan put forward by an  international aid organisation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">78.3%  plan  put  forward</P>
+<P ALIGN="JUSTIFY"> by an  internati onal  aid  organisa tion</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Aid must be used to fund action by local NGOs</P>
+<P ALIGN="JUSTIFY"> - The beneficiary state must have a democratic system of government</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">59.3%</P>
+<P ALIGN="JUSTIFY">56.0%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Convention expires at the turn of the century. Professor Pinheiro indicated that a first draft (green paper) on the possible shape of the ACP-KU relationship after 2000 will be published by the Commission by the end of the year. This, however, is likely to offer more questions than answers about future cooperation. 'I am not sure if we should keep the Lom&eacute; structure for every country, in the third millennium,' the Commissioner told the assembled journalists, highlighting the different levels of development now apparent between Lom&eacute; nations. Mauritius, now well on the way to becoming the 'Singapore' of Africa, was a case in point. He also pointed out the small island states of the Caribbean are at a very different stage of development from countries such as the Central African Republic or Burundi. He added that, in deciding what to do in future it would also be necessary to take stock of regional developments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Questions about Lom&eacute; answered</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the meantime, efforts are under way to boost the image of Community aid. With this in mind, the Information Unit of the Development Directorate-General has just published a brochure entitled 20 Questions and Answers about the Lom&eacute; Convention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Besides explaining in a nutshell what the Convention is, it answers some of the questions most frequently asked by sceptics about the benefits of development aid and trade preferences, highlighting the positive aspects for developing and developed economies alike. It points out, for example, that for every ECU 100 spent on aid, the Community recovers ECU 48 in the form of projects, supplies and technical assistance purchased from European companies!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The brochure provides a succinct explanation of how the Commission monitors aid to stop embezzlement and corruption. It highlights the right of the European Court of Auditors to check accounts of projects and fund transfers - and to investigate documents in the Lom&eacute; states, without the permission of the country concerned. Another precaution is that once a project is under way, financing is by banker's transfer. This involves a paper specifying that the holder of contract X, whose bank account number is Y. should be credited with Z amount of money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An explanation is given as to why the European Commission is involved in development aid when the Member States have their own bilateral development policies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The brochure explains the advantages of EC assistance over bilateral arrangements and details how the Lom&eacute; system has been evolving in line with the increasing globalisation of the economy, in particular since the fall of the Berlin Wall.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It also contains some pocket statistics on official development assistance (ODA) flows which help to underline the message that the European Union (Community plus Member States) digs deeper into its pocket than its industrialised competitors in providing development aid. In 1994, the Community and its then 12 member states (excluding Austria, Sweden and Finland), contributed an average of 0.40% of their gross national product in ODA. The individual percentages varied from 1.03% in the case of Denmark to 0.20% in Italy. This compared with figures of 0.29% and 0.15% for Japan and the United States respectively.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1994, total ODA from the Twelve reached $26.59 billion. Of this, $4.83 billion came from the European Community in its own right. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The content of chocolate</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Months of heated debate in the EU over the maximum allowable content of vegetable fats in chocolate have culminated in a Commission proposal for a revised Directive which, claim officials, should be to the taste of most interested parties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has proposed that the 'subsidiatity' principle should apply to the content of chocolate. This means leaving it to individual Member States to decide whether they will allow the use of vegetable oil - up to a maximum of 5% by weight - in their chocolate-making. The eight EU countries where this practice is currently prohibited  are free to modify their laws to take account of this 5% rule. The other cocoa butter and dry cocoa contents specified in the Directive - 18% and 35% respectively - may not be reduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The addition of up to 5% vegetable fats was authorised under Directive 73/241 for the UK, Ireland and Denmark when they first joined the EC. Other Member States who acceded later - Austria, Finland, Portugal and Sweden - also use these oils in chocolate production. The remaining EU countries have continued to prohibit the use of vegetable fats - and the sale of chocolate containing such fats. The result has been a partitioning of the EU market, in direct conflict with the Single Market principle.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If the proposal is approved by the Council and the Parliament, all 15 Member States will be free to decide whether vegetable oil can be used in making chocolate. Whatever their individual decisions, however, the barriers will come down, thus opening up the 'pure' chocolate markets to competition from less expensive varieties containing vegetable oil. Stricter labelling rules will also be introduced, with the precise nature of any substitute oils being clearly indicated. The simple mention 'vegetable oil' will no longer suffice. Martin Bangemann, the Commissioner responsible for industry, stressed the significance of revising the Directive in allowing  chocolate products to circulate freely throughout the KU. This, he argued, would be in the interests of consumers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Winners and losers</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Traditional cocoa producers such as Cote d'lvoire, Ghana, Nigeria and Cameroon are fearful that the proposal may prompt some of Europe's 'pure' chocolate countries to change their laws - and that they will lose trade as a result. On the other hand, sheanut exporters in Burkina Faso, Mali, Ghana, Togo and Benin are hoping for higher sales if the 5% rule is adopted by more EU countries. Sheanuts account for 20% of Burkinabe exports and 98% of these are used to make vegetable oil substitute for chocolate products. The sheanut price is just 10% of the cocoa bean price. The Commission calculates that the maximum saving a manufacturer could expect by substituting vegetable fat for cocoa butter is around 1.5% of the ax-factory price.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In weighing up what to do, the Commission also considered the objectives of the International Cocoa Organisation (ICCO). These include taking 'all practical measures to increase the cocoa consumption in their countries by eliminating or reducing all obstacles to the growth of consumption in cocoa.' The ICCO estimates that if the 5% rule is applied in the remaining eight states - Belgium, Luxembourg, France, Germany, Greece, Italy, the Netherlands and Spain - it will lead to a reduction in cocoa butter usage of 36 000-50 000 tonnes, which amounts to a drop in demand for cocoa beans of between 88000 and 125000 tonnes. This represents between 9-12% of current consumption.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some producers suggest that these estimates are too high since they assume that manufacturers will go for  almost full substitution, which is not necessarily seen as inevitable. In addition, there is a belief that overall demand for chocolate products may grow as a result of the legal change.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was not the view taken by NGOs who reacted promptly - and critically - to the Commission text. The Brussels NGO Liaison Committee issued a statement claiming that it would lead to a drop of between 6.25% and 12.5% in the main exporting countries' cocoa receipts - and an additional burden on the European Community's Stabex fund. But chocolate producers and others argue that this is speculative. The impact, they say, will depend on the legal response of the eight Member States, as well as on the reaction of manufacturers. There are signs that the latter may well stick to their traditional and distinctive methods. A spokesperson for the Belgian-based Cote d'Or/ Suchard, pointed out that the proposal had a long way to go before it was approved, and stressed that his company had no intention of changing their 'winning recipes which had served them well since 1883. At the same time, he admitted, vegetable oil could be useful in a more diversified range of chocolate products.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The vegetable oil 'lobby' argues that the addition of vegetable fat makes chocolate easier to mould and less likely to melt in warm climates. And for those who fear the elimination of 'pure' chocolate from the market, they point to manufacturers in Britain, where vegetable oil has traditionally been used, who still exclude such fats from some of their brands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The proposal must now be debated by the Council and it is clear that the arguing is not over yet. But it is beginning to look as if the consumers may be the final arbiters. Through their purchasing habits, they are likely to be the ones who finally determine the winners and losers in the great chocolate debate. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Minority businesses in the UK</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In no country in Europe are ethnic minorities more organised than in the United Kingdom - though they are still not adequately organised, in the opinion of many, to pool their considerable resources together and overcome stereotypes, racism and unenployment. But this may  change if the morale engendered by a recent exhibition of minority businesses in the UK is anything to go by.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The statistics speak for themselves. There are 3.3 million Asians, Africans and Afro-Caribbeans in Britain, about 5% of the population (and the figure is projected to double in the next 25 years). They have six elected Members of Parliament - five Labour and one Conservative - as well as numerous personalities in the world of sports and the media. According to the 1994 Labour Force Survey, 48% of ethnic minorities are graduates or are in full time studies and 55% earn salaries well over &amp;15 000 (ECU 18 000) annually. They have a combined gross annual income estimated at f42 billion and an annual spending power of at least f26 ten.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past 15 years, ethnic minority-owned businesses have grown considerably. In the last two years alone, they were responsible for more than 30 000 new business concerns throughout the country, according to the Commission for Racial Equality (CRE). Although many are in the retail trade, the 10% or so involved in production or manufacturing are extremely dynamic,  particularly those connected with the clothing industry or operating franchises.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are considerable differences between Asians on the one hand and Africans and Afro-Caribbeans on the other. The former are more business oriented and account for well over 80% of all ethnic enterprises. This success in business is often attributed to Asians' industriousness, but there is another crucial and often neglected factor: Asians have a stronger sense of group solidarity and patronage than Africans and Afro-Caribbeans. Whereas the former spend virtually all their earnings within their community, the latter (who are mainly Christians and are known to make greater efforts at integration into the British society) spend theirs in the society at large.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unemployment among the black population in general is 19% compared to 8% for whites (in London it is three times higher). They are much more likely to be turned down by employers even when they have better qualifications than their white counterparts. Often self-employment is the only way out. This explains why there has been a boom in business start-ups by ethnic minorities over the past two years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although several black profffsional associations have come into being in recent years, it has been clear for some time to black leaders that the community's energies are dispersed and that these needed to be harnessed for the benefit of ethnic minorities as a whole. Blacks clearly have political and business clout to be exploited.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The idea for an exhibition of black businesses in the United Kingdom was mooted by a black business couple who, were influenced by a similar event  held annually in the United States called 'Black Expo USA'. But the impetus came from the 'Race for Opportunity Campaign' launched in October last year by the Conservative Government through the Department of Trade and Industry. The campaign has so far seen more than 20 big British companies pledge to do business with ethnic minority enterprises. These include British Airways, British Gas, British Telecom, British Aerospace and several high-street banks and finance houses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Held at the Barbican Centre in London on 4 and 5 May, the exhibition was aimed at creating awareness among ethnic minorities of their potentialities, showing the opportunities available to them not only in the UK but also in Europe, and at promoting networking amongst their businessmen and women. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cross-party support</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The exhibition, which had a cross-party support, could not have come at a more favourable time. Both the Tory government and opposition Labour Party have expressed support for policies favourable to small and medium-sized enterprises, which means that there should be continuity in this area if Labour comes to power in the next general election.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was borne out by the enthusiasm with which the shadow minister for small business, Mrs Barbara Roche greeted the exhibition. To her, the event should be seen in the context of Labour's overall policy on small businesses. Speaking at one of the seminars which was run alongside the exhibition to discuss various aspects of minority business problems, Mrs Roche explained that there were three important reasons why her party was promoting small enterprises, especially those involved in exports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first was that large companies were downsizing, and job-creation towards the end of this century and into the next would be largely by small and medium-sized enterprises. The second was that small businesses were efficient distributors of wealth and the third was that they were good at innovation and using new technologies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because a large number of small businesses are folding, or are struggling to survive in the UK today (often as a result of late payment of bills by large companies), Mrs Roche said a Labour government would introduce a statutory limit of 30 days for the settlement of bills by large companies. The latter would then have to pay interest to small businesses for any late payments. Ethnic minority businesses, she also said, were part and parcel of Labour's strategy for economic growth and jobs in Britain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Barbican exhibition attracted more than 80 exhibitors mainly in retailing, finance, telecommunications, consultancy, arts and crafts, publishing, electronics and education. There were  very few exhibitors from the manufacturing sector (a disappointment considering the number of Asians in the clothing industry) and virtually none in engineering. Some of the big companies connected with the 'Race for Opportunity Campaign' like British Airways and British Gas, as well as the newly created government-backed Business Link, the Customs and Excise department, the Inland Revenue, the Army and the Metropolitan Police were there. Also present was Louis Farrakan's 'Nations of Islam', (not necessarily on a recruitment drive, though that must have been part of the game), but as a reminder of its campaign for greater self-reliance by the black community which culminated late last year in the 'Million-Man' march on Washington DC. Video tapes of the march and speeches by Farrakan and other black leaders in the United States were on sale.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Difficulties</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The seminar run concurrently with the exhibition attracted many notable speakers, among them Members of Parliament, Keith Vaz, Bernie Grant and Barbara Roche and Commissioner Dr Zaka Khan of the Commission for Racial Equality. Jessie Boseman, vice-president of 'Black Expo USA, who was also scheduled to speak, did not turn up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was general agreement on the main factors inhibiting the growth of ethnic minority businesses, the most obvious being racism and  discimination. Ethnic businesspeople not only have difficulties obtaining public contracts, but they are often denied access to finance, market and even premises. Furthermore, they suffer from lack of management skills, networks and feedback. Dr Khan of the Commission for Racial Equality highlighted mounting racist attacks, mostly against Asianowned shops, which have claimed a number of lives in recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Integration into mainstream economy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is no longer a hidden fact that banks discriminate against black businesses. Surveys carried out by the NatWest and Midland banks have confirmed that fact. The latter though, it must be acknowledged, has a laudable Fellowship Programme, designed to encourage ethnic minority university students to take up careers in the Midland Bank on graduation. Lack of access to the market has effectively meant that black businesses have been left out of the mainstream of the British economy. Everyone agreed that it makes good economic sense to see them integrated into it. This was particularly   the position of both Barbara Roche and Zaka Khan. The question was: would it be possible ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some of the issues raised on the floor by businesspeople revealed that many were sceptical that racism and discrimination could be overcome in multiracial Britain. The Commission for Racial Equality symbolises the fight against these two evils and Dr Khan had a hard time defending its role. The CRE was criticised for constantly quoting statistics on improvements in the living conditions of ethnic minorities which, it was argued, were totally removed from reality. Despite this, Dr Khan remained upbeat. To him the future promises great things for ethnic minorities. He promised to look into the grievances aired by some businespeopie during the seminar. Barbara Roche, for her part, promised that a Labour government would encourage the banks to offer packages of assistance to small enterprises, in particular, black-owned ones. They would also ensure that local councils offered minority enterprises a share of local government contracts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Greater self-reliance and global trade</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In view of the problems black businesspeople have had to contend with over the years, Bernie Grant, the Member of Parliament for Tottenham in North London, did not devote much time to the idea of integrating them into mainstream British economy. He felt that racism and discrimination were so prevalent that there was little chance of that happening. For him, the future for black businesspeople in Britain lay in greater self-reliance and entry into international trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a speech entitled 'political responsibility, and black import and export business', the M.P. set the Barbican exhibition in the context of the global economic situation - one where he said, 'the countries of the North are exploiting those of the South, in particular African countries.' Africa's heavy debts to the West should in fact be the other way round. He argued that the new world trade agreement, which  opens up the developing countries to competition, was unfair. 'This means that countries where minorities in the UK came from are going to have problems, and it is the duty of thee minorities to ensure that their countries have a fair deal,' he said. Mr Grant cited, by way of example, the EU's banana protocol under the Lom&eacute; Convention which gives preferential treatment to small Caribbean island producers and which is currently being 'unfairly' challenged by South American producers under the WTO rules. The role of multinationals, which are effectively acting es 'middleman', was, he believed, pernicious for developing countries. There was a need for black businessmen to step in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Minority enterprises in the UK do not exist in isolation from the rest of the world, he elaborated. They should seek to engage in international trade and take advantage of their connection with their countries of origin. To facilitate this, Mr Grant said that a group under his chairmanship had set up a Global Trade Centre in his constituency in North London with the aim of helping black and minority enterprises establish direct trade links with Africa, the Caribbean and black America. The Centre was already in contact with a number of African countries which have expressed interest in the idea. Such a link would not only ensure a better deal for African producers but also favour the growth of minority businesses across the world. This was, he confessed, 'a political agenda' designed to reduce the excessive profits of multinationals, if not put an end to their 'outright exploitation' of Africa and the Caribbean. Mrs Roche expressed support for the Centre for the role it could play in boosting British exports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UK minorities and the</P>
+<P ALIGN="JUSTIFY">European Union</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A self-confessed Eurosceptic, who would have preferred the UK to strengthen economic ties with the Commonwealth rather than with Europe, Mr Grant displayed an extraordinary understanding of the European</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Union's affairs. What worried him most about greater European integration, he said, was racism and the fact the UK job market, where black and ethnic minorities are already heavily disadvantaged, will be exposed to further competition from other Europeans most of whom speak several languages. However, he had no alternative but to support the Labour Party's line on Europe and work to secure the best advantage of British membership for ethnic minorities. He contrasted Tory 'divisions' on Europe with Labour's 'united' policy and condemned the British Government's attitude generally towards the Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The development of the Union, Mr Grant said, was of great significance to black people. He was sure the Government's Immigration and Asylum bill, which had come up against strong opposition in the House of Lords, was aimed at harmonising immigration laws with other countries in the Union. The bill, if passed, will change the UK's visa regime and have serious implications for ethnic minorities and their businesses in Britain. He revealed that, with the support of ethnic minority members of the British Parliament, Bill Morris, the black General Secretary of the Transport and General Workers Union (the second biggest trade union in the UK) and other European trade union leaders, the Intergovernmental Conference was being lobbied for the inclusion of a stronger clause against racism in the Treaty of Rome. The aim, ultimately, is to see measures in line with the UK's laws against racism and discrimination enacted at the Union level. This would include the establishment of a European equivalent of the Commission for Racial Equality - with similar powers - so as to establish a level-playing field for ethnic minorities in competition for jobs and in business throughout Europe. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Augustin Oyowe</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Dossier</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Communication and the media</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Dossier coordinated by Debra Percival)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Press freedom is widely acknowledged as the cornerstone of democracy with a clamp-down anywhere in the world frequently interpreted as a sign of government repression. The rash of multi-party elections in African nations at the beginning of the</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1990s brought new publications to news-stands. Many of these have since folded - often because of a lack of funds and sometimes because of government censorship.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many organisations are campaigning vigorously in the public eye for a free press in developing nations. These include Reporters Sans Frontieres, Article 19 and the International Federation of Joumalists - all of which are featured in this Dossier. The US-based Freedom House has also been monitoring the state of press freedom worldwide since 1979. In its recently published 1996 survey, it says that even today, only 22% of the world's population live in countries with a free press. 38% have a press sector that is 'partly free' while the description 'not free' is applied to the remaining 40%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are also regional organisations such as The Media Institute of Southern Africa (MISA), which are playing a part in keeping media issues to the fore. David Nthengwe, a researcher with MISA, highlights the fact that democratisation does not necessarily guarantee a free media or free expression more generally. He also draws attention to the difficulties faced by private and community organisations in obtaining adequate finance. These are  typical of the problems facing the media in many countries, both in the ACP group and elsewhere in the developing world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In seeking to tackle these issues, donors are showing increasing interest in backing media programmes with development finance (linked to democratisation and human rights). The European Union, UNESCO and a number of bilateral donors have expanded their activities in this area with a variety of projects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One big change has been the rapid growth of the 'Information Superhighway'. This has prompted fears that the developing countries may fall further behind, although donors have indicated a willingness to help ensure this does not happen. One NGO closely monitoring the development of the Internet for the South is the PANOS Institute. Meanwhile, multilateral donors (notably the World Bank, through its INFODEV programme) are also becoming involved. A number of EU personalities lent their support to the development of the information society in the developing world, at a major conference staged in South Africa in May on the initiative of the country's Vice President, Thabo Mbeki. A work programme of projects was drawn up with the aim of making sure, in the words of European Commissioner, Martin Bangemann, that there is no divide between the 'information-poor' end the 'information-rich'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Finally, although the world is undergoing an information revolution, the more traditional media (the press and above all, radio) will, for the foreseeable future, continue to have a central part in informing, educating and entertaining people in many developing  countries. It is important that those of us who increasingly communicate via our computer screens do not lose sight of this essential fact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this Dossier, we examine a number of the key issues affecting the media and highlight some innovative projects in this area - with the help of a series of experts. The subject has clearly moved higher up the development agenda, but there is still a long way to go, as the figures cited above show. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Aidan White of the IFJ</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Confronting the age-old problem</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the chance, 'governments would like to run and manipulate the media'. This is the view of Aidan White, General Secretary of the Brusselsbased International Federation of Journalists (IFJ), who says it is an 'ageold problem'. And the Federation, which has member organizations in 93 countries, works to prevent it from happening. It also provides a range of services to journalists throughout the world. We recently spoke to Mr White, who used to write for the British daily, The Guardian. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He began by outlining to us the Federation's key areas  of activity which include, in particular, the professional conditions in which journalists work and the defence of human rights. On the first of these, Mr White focused on the problem of economic pressures and difficult social conditions. 'We take a strong view that you can't have press freedom if journalists work in conditions of poverty or technical deprivation. It is a nonsense,' he stressed, 'to talk about a free press in a situation where journalists aren't paid, or if they are unable to function properly.' In seeking to tackle this, he spoke, in particular, of the 'need for independent organisations of journalists defending professional and social interests.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As regards human rights, the IFJ is active in the international community, working with bodies such as UNESCO and the UN Human Rights Commission. 'We are very interested in issues such as the legal environment in which journalists and the media operate, and are extremely active in the defence of physical safety.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr White went on to give more detailed information about the IFJ's work in Algeria, where many journalists have been killed in recent years. This country clearly has a bad international reputation and the General Secretary was anxious to offer a more balanced picture of the situation. 'In my view, there is a real malformation of Alaeria's  image in Europe and elsewhere. The view we get is of a paralysed society where nothing can function properly - a kind of international basket case. It is not like that. In Algeria, life continues. There is a form of democracy. There are a dozen newspapers which appear every day. The streets are full of traffic and people walking about. The reality is that there is a particularly horrifying and barbaric form of terrorism which is targeted against intellectuals including journalists. This means that the media has a terrible problem.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aidan White explained the strategy of the IFJ in seeking to confront this. 'We began by going to Algeria to investigate what was going on. Then we established an international office on the spot. This is a direct contact point of solidarity for local journalists and the local media. So we don't report Algeria through Paris. We don't see the need to go through some sort of middleman in order to find out what's going on in the country or have contact with Algerian journalists.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'And then we have two specific programmes which are very important', he continued. One involves providing humanitarian assistance to journalists and their families. The other is a series of practical activities in Algeria. Thus, for example, we are organising a round table on terrorism and information.' He pointed out that the Algerian government had resorted to the traditional method of press censorship in the face of ,the terrorist threat and stressed the 'need to counter this. 'We are also organising a practical seminar on personal safety, as well as one on professional social rights, the need for ethical standards and better social conditions.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The point, he emphasised was that events were being organised on the spot. Algeria may pose terrible difficulties 'but it doesn't mean we walk away from it.' The IFJ's emphasis was firmly on being a 'functional organisation working directly with the people who need help.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Funding and the EU link</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tuming to the issue of the IFJ's funding, Mr White explained how the core activities - his own salary and administrative costs - are paid for by the subscriptions of member organisations, which amount to roughly $1 million. On top of that, the Federation carries out projects with the EU and other donors. They also distribute funds, offering their expertise as a representative body to help other organisations that want to undertake work.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asked in what way the EU could do more, the General Secretary stressed the political dimension. 'It should intervene,' he argued, 'to establish certain standards in international relations. We say, for instance, that political, economic and military cooperation with any state outside the Union should be based on a commitment to and respect for freedom of expression and opinion.' He underlined the 'responsibility' of the EU to take a stand against countries that locked up journalists, implicitly criticising those who argued that freedom of expression was very important but who then shelved the issue when economic relations were involved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He also urged a more proactive approach 'moving away from the strategy of counting bodies, complaining, and making reports about how bad the situation is' towards one based on comprehensive programmes of assistance. He described the IFJ's Media for Democracy programme in Africa as a 'first attempt' in that direction. Mr </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">White highlighted what he saw as a difficulty with existing projects. 'The problem is that the EU is confronted by all sorts of different NGOs who come and say: 'we have got this good project - give us support for it'. This is fine but it inevitably means that resources are spread very diffusely and often to no effect.' A lot of activities, he suggested, such as one-off seminars and conferences, were 'like fireworks in the night sky: they glow bright for a brief period and then they disappear.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He went on to plead for an integrated, comprehensive strategy. 'Until that exists, you will not be able to solve the fundamental problems facing journalists.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Training and status</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The discussion moved on to the subject of training. Perhaps surprisingly, Aidan White did not see this as an important priority in itself. As he explained: 'It's no use training journalists to be very high quality if they go off to work in a country where the legal environment does not allow them to function properly. And it's no use training them to be ethical if they go somewhere that is steeped in political or financial corruption, and where there is no culture which appreciates the media's role in democratic society.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With this in mind, he believes that training should be directly related to the strategic approach he referred to earlier. 'Yes, we need professional, well trained journalists, but it should be part of a range of programmes. And professional training is not just important for journalists. It should also be provided for managers, editors, advertisers... and perhaps even for politicians!'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The General Secretary noted that the status of journalists in most countries was quite high. They are seen as a filter for information 'coming from the government to the governed'. This was important, he thought, but 'tine real question is how the filter functions. On the one hand journalists have a relatively high status, and what they do is extremely important, but they work close to the political elites, which means they  are subject to pressure. They must retain their independent role, scrutinising and investigating what governments are doing.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the subject of access to information in developing countries, Aidan White observed that the situation is now better than it was ten years ago but pointed to the 'age-old problem of people in power wanting to control the media.' He gave the example of journalists in Indonesia, 'who really want to speak independently of the government, but who are being killed because they represent independent strands of opinion.' Overall, however, he believes the situation has been improving. 'This is partly due to changes in information technology. A government can no longer simply take a journalist out and beat him up. There are half a dozen press freedom organisations around the world watching for and reporting on such events.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a tendency in Europe to assume that 'everything in the garden is rosy' in terms of press freedom, and we were interested to hear what the Secretary General thought of this proposition. He was quick to offer a less complacent view. 'We have just issued a very strong statement against the EU about their secrecy policy,' he pointed out. 'You cannot claim the moral high ground for democracy in Africa or elsewhere if you have a system of secrecy in Europe which operates at the highest political level and which denies citizens access to information.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He was also concerned about the concentration of the media in enormous congLom&eacute;rates. This trend, he argued, 'is actually profoundly damaging to the culture of information.' He cited, in this context, the action of the Murdoch organisation 'in banning all news from his cable channels going into China.' Mr White continued: 'They banned the BBC and they banned news coverage in the Chinese language in order to make a business arrangement with the Beijing government. That sort of activity, in our view, is direct censorship from the heart of western democracy.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In conclusion, Aidan White gave some more detailed information about the Media for Democracy programme in Africa which he described as 'ground-breaking.' The Federation has used it to develop key themes, including the coverage of elections. 'The real test of press freedom,' he continued, 'is at an election, because that is when the political pressure is toughest and the professional quality of journalism is exposed. For Africa, we developed a manual on election reporting and, interestingly, it has become the source document worldwide for election reporting.' He explained how it formed the basis for developing a text which is universal. This has been translated into various European languages, and Arabic, and has been employed in Poland, Romania, Albania and Latin America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the first phase of the Media for Democracy programme, the Federation held a serf. of seminars and conferences on how the media covered elections. As Mr White stressed, this was a crucial time in Africa. Political change was taking place, multi-party democracy was being introduced and there was a need to clarify how elections operated and how they should be reported. 'People didn't have the experience. They wanted the information, and to discuss how things should be done.' The seminars covered aspects such as financial corruption, the organisation of journalists and the role of ethics. And what the IFJ found was that the same kind of things happen in Kenya, Tanzania, Mozambique and South Africa - and indeed across the world. In the words of the Secretary General, 'they have an echo everywhere because, at its root, the problem is the same - those in power want to manipulate the media and use whatever pressures they can.' The lesson learnt from the IFJ's experience in Africa is that common solutions are also valid. Or as Aidan White put it, 'there is no part of the world that can't teach the rest of the world something.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.M. &amp; S.H.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Freedom of expression: the first freedom</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Frances d'Souza</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frances d'Souza who is Executive Director of AROSE 19, a nom governmental organization which campaigns against censorship globally, explains why Freedom of Expression is for her the most important human right</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the absence of freedom of expression, it is almost impossible to protect other rights, including the right to life. Once governments can draw a cloak of secrecy round their actions and remain unaccountable, massive human rights violations can, and do, take place. For this reason alone, the right to free expression, specifically protected in international human rights treaties, must be considered a primary right. It is significant that one of the first indications of a government's intention to depart from democratic principles is when it increases its control over information, usually by gagging the media. At the one end of the spectrum, supposedly minor infringements of this fundamental right occur daily in western democracies; for example the abuse of national security laws to prevent publication of information which might embarrass the authorities. At the other end of the scale are regimes of terror which brutally suppress opposition, information and even the freedom to exercise religious beliefs. Without free speech and an independent media, it is easier for governments to employ propaganda to promote ethnic conflict, war and genocide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The right to freedom of expression is formally protected in major international treaties including the Universal Declaration of Human Rights, the International Covenant on Civil and</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">* This text is an abridged version of a submission made by the author to a public hearing hosted by the European Parliament's Committee on Foreign Affairs, Security and Defence and the Sub-Committee on Human Rights and the Committee on Culture, Youth, Education and the Media, April 25, 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Political Rights (Article 19), and the European Convention on Human Rights (Article 10). It is also enshrined in many national constitutions, although this does not always guarantee its protection. Freedom of expression is something which applies even in countries which have not ratified the relevant international treaties. This is because the Universal Declaration is so widely accepted that its provisions now form part of customary international law.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While it is generally agreed that freedom of expression is the cornerstone of democracy, international treaties permit certain restrictions. Unlike the American First Amendment rights which allow few, if any, checks on free speech, the international treaties aim for a balance between competing rights. Thus, for example, free speech may be limited where it impinges on the individual's right to privacy, or where it involves incitement to violence or hatred. Given that the permitted restrictions are necessarily broad, the limits of free speech are constantly being tested in national courts and in regional tribunals such as the European Commission and Court of Human Rights. In recent years, several landmark cases have helped define what restrictions may be imposed by governments and under what circumstances. In particular, it has been emphasised by the European Court that any restriction should 'pass' a threepart test; it should be prescribed by law (and thus not be arbitrarily imposed), it should be proportionate to the legitimate aims pursued, and it should be demonstrably necessary in a democratic society in order to protect the individual and/or the state.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Who censors what?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the rules governing restrictions on free speech, many justifications are still invoked by governments in suppressing information which may be inimical to their policies or interests. These include arguments in defence of national security or the 'public interest'. The mechanisms used to restrict the free flow of information range from subtle economic pressures, and devious methods of undermining political opponents and the independent media, to the enactment of restrictive press laws and rules for licensing journalists. In extreme cases, they may involve the illegal detention, torture and disappearance of journalists and others associated with the expression of independent views.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The right of free speech may appear less important than, for example, freedom from torture or extrajudicial killing. It is also sometimes difficult to persuade the public that censorship, generally associated with banning obscene materials, is a bad thing! It requires a recognition of some of the fundamental principles of democracy to understand why censorship is so dangerous. Democracy implies that people can make choices about the issues that affect their lives, including what they wish to see, read, hear or discuss. While this may seem a luxurious freedom, mainly preoccupying the wealthy West, it is a comparatively short distance between state censorship of an offensive book to the silencing of political dissidents. And the distance between this and the use of violence to suppress opposition is even shorter. Censorship tends to grow rapidly from small beginnings. Allowing a government the power to deny people information, however trivial, not only leads to laws and procedures which can and will be used by those in authority against those with less authority. It also denies people the information they need to render their governments accountable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There have been some terrible examples of the role of censorship in recent years. We have seen it in the republics of the former Yugoslavia   where the media were manipulated for propaganda purposes. We have seen it in Rwanda where the government associated radio incited citizens to kill each other in the name of ethnic supremacy. And we have seen it in Iran which maintains the threat of murder against a citizen of another country because he wrote a book which displeased the authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are clear links between access to information (or rather the lack of it), and war. Democracy empowers people by increasing participation in decision-making at all levels. The poor, who are denied access to information on decisions which deeply affect their lives, are powerless and have no voice. They cannot influence the ruling elites whose interest in consolidating their own power and position may be served by initiating conflict.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is significant that of the 126 developing countries listed in the 1993 Human Development Report, wars were being waged in 30 and a further 33 were suffering severe civil conflicts. 55 of these 63 countries were to be found at the lower end of the Human Development Index which is an indicator of poverty. It is reasonably safe to assume that most people never welcome war. They may be coerced into supporting 'their' side in a conflict by their governments, using propaganda designed to whip up fear and extreme nationalist sentiment. If the majority had a democratic voice, they would undoubtedly object to war. But voices are silenced. Thus, the freedom to express one's views, to challenge government decisions and to insist upon political rather than violent solutions, are necessary aspects of democracy which can, and do, avert war.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">State-sponsored propaganda in Rwanda, as in the former Yugoslavia, succeeded because there were no ways of challenging it. One can conclude that it is impossible for a country to wage war in the absence of a compliant media willing to indulge in government propaganda. Governments needs civilians to fight wars for them and the media is needed to reinforce government policies and intentions at every turn. In a  totalitarian state where the expression of political views, let alone the possibility of political organisation is suppressed, one has to ask what other possibilities are open to a genuine political movement intent on introducing justice. All too often, terrorism and violence are the only perceived options available to communicate the need for change.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What NGOs can do</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The work of human rights organizations has to become much more proactive and should be concerned with providing early warning and preventive action. Monitoring freedom of exprmsion, especially freedom of the press, offers an excellent context because it is widely recognised that would-be dictators always seek to silence people's voices through banning newspapers or other methods of censorship. One has to assume that when censorship begins in earnest, worse human rights abuses will follow and this should be the point for action. Had there been a greater international lobby for an independent media, for access to information and for participation in decision-making in the former Yugoslavia, Rwanda, Nigeria, Burma and many other countries, some of the gross violations which continue to occur, could have been prevented.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Censorship is the first instrument of a government intent on departing from democratic procedures. In this sense it is an early warning signal and at ARTICLE 19, we believe we have a special responsibility to understand better how democracy is destroyed through censorship and how we can alert the international community to act to prevent it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By way of conclusion, anything which can build strong and sound media infrastructures, at the earliest to pportunity, in transitional democracies, is both a gift and a great investment. A crusading press, prepared to separate fact from opinion and to verify its sources, can create a level playing field in which all sectors of society have a voice. This would preclude political control and manipulation for nationalistic power purposes. There is also a need to strengthen local monitoring groups which have the capacity to verify information. International organisations should amplify the voices of local organisations and bring them to the attention of the international community. It is only where there is a strong human rights culture in a given country, whether it has achieved democracy or not, that political changes can be seized upon and shaped into the democratic process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To achieve these objectives, NGOS need to work with governments which are obliged by international law to uphold fundamental rights. We need organisations such as the KU, the UN, ASEAN, and others, to insist on respect for human rights in their dealings with third countries. We also need the general public to be aware of what fundamental rights are, what are the consequences of infringement, and how they can, as individuals, successfully challenge restrictionss imposed on them by their governments. Above all, NGOS need to work with multilateral organisations to determine where slender resources can most fruitfully be targeted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F.d'S.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Commission support for democratisation through the media</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Mark Leysen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Amongst the many cooperation activities in which it is involved, the Lom&eacute; Convention covers cultural cooperation, which includes information and communication, yet European Development Fund support for the media in ACP countries is negligible. Although considerable and increasing amounts of aid are granted for the cinema in such countries, EU support for TV, radio and the printed media is small.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the other hand, for some years now, the Commission has provided considerable aid to the printed media and radio in ACP countries under its 'Support for democratisation and respect for human rights' budget, which heralds a new approach to media questions. The EDF does not participate in the vast majority of big communications projects in Africa, namely PANA (Panafrican News Agency), URTNA (African National Television and Radio Union, the African equivalent of the European Broadcasting Union), the Programme Exchange Centre, Afrovision, Cierro, etc. The reluctance of EU and ACP partners to embark on such media projects can be explained both by EDF procedures and by the worldwide political context including the situation in most African countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Until recently, the media was a matter for the State in Africa. The 'New World Information and Communications Order', announced in the 1 970s, foresaw the participation of not only African citizens, but also of their governments in the world information highway. However, the democratic credentials of such governments were open to question - they controlled the printed media, radio, television and press agencies and any support for such media amounted to a strengthening of the State monopoly and this is why the EDF did not take part.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, aid to the independent media was impossible because such entities did not exist in most African countries and the authorities were not prepared to back a request for aid to the press which they regarded as contrary to their country's interests. If support for the media did exist, it was indirect and restricted to backing of means of communication servicing development projects: literacy campaigns, the fight against AIDS, increasing awareness of ecological problems, etc.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It was not until the advent of the democratisation movement and the support that Europe decided to grant to it that a media-aid strategy was to take root. As a kind of 'Fourth Estate', the media monitor executive power and report any abuse of it. In parallel, they play a key role in strengthening civil society by providing information (if not objective information, then at least information from many sources) on current political, social, economic and cultural issues and by providing a medium which offers an opportunity to speak out on matters of importance to society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Commission focuses its media support in five areas in agreement with representatives of African press and specialist European . organisations in this area. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Freedom of expression It provides direct aid to national, regional and international organizations to defend freedom of expression, specifically financing monitoring, surveys and the reporting of any violation of press freedom (censorship, intimidation, arrests and arbitrary trials, etc.), and direct assistance to the media and any journalists who are victims of such attacks on press freedom. This direct aid is channelled to, inter alia, the activities of Reporters sans frontieres (see 'Interview with Mr Robert Menard', in this issue), 'Article XIX' and Index on Censorship, all organisations which operate like an Amnesty International for the press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Training</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new independent press is often run by journalists who have had no journalistic training and the former State media often require being updated after many years of professional 'distortion' responding to 'his master's voice'. The Commission hence finances programmes offering training in basic journalistic techniques, election coverage; professional codes of ethics, etc. In this area, it is working with a number of European and African organizations, giving priority to long-term actions which are likely to spawn others and to programmes aimed at achieving a higher level of professionalism.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aid for vocational organizations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vocational organizations for journalists have a role to play in improving the profession's social standing, in strengthening its cohesion in the face of political division, in defending its interests and in coming to the aid of journalists who have been victims of repression. The Commission finances a vast 'Media for Democracy' programme conducted by the International Federation of Journalists and its affiliated regional and national organisations (see interview with Aidan White, in this issue). The programme aims to strengthen or create national and regional associations of journalists, but is also involved in more general actions to   increase the professional standing of the media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Access to sources of information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A credible and responsible press requires sources of information which the new and financially precarious press cannot allow itself. The Commission supports the creation or updating of documentation centres, North/South  and South/South exchanges between publications and radio stations, access to international press agencies or photographic libraries, etc., being shared between several media bodies. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Legislative framework and code of ethics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is not enough merely to guarantee freedom of expression in the   constitution. This principle must be embodied in all legislative and regulatory texts to prevent a journalist being prosecuted arbitrarily for 'defamation' or 'a breach of State security'. Moreover, to appear credible, the profession must observe a code of ethics. The Commission backs the drafting of press codes, codes of ethics and regulations to govern the air waves. It also backs the creation of press and air wave regulatory bodies as well as the provision of training in journalistic ethics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is obvious that the 'Democracy and Human Rights' budget cannot alone meet the needs of Africa's multi-faceted media scene. Moreover, although the media are a key element in any democratisation process, they are also much more than that - as a means of information and recreation, they have a role to play in the human development of society; as an instrument to create greater awareness, they can contribute to the strengthening of a civil society which is gradually taking charge; and as an economic sector in the full throes of development, they can make a contribution to the GDP and create jobs. All the more reason for national sponsors and the EDF to take more of an interest. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">National television, victim of  democracy </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than the other media, television in Africa is controlled by the State and serves, first and   fore most, to disse minat e news about the leade r and his govern ment. The state of equip ment depen ds on when it was suppl ied by a friend ly count ry from the North, and as it was almos t certai nly offere d to the count ry's leade rs 'as a perso nal gift', it usual ly consi sts of oversi zed equip ment which the nation al televis ion statio n canno t maint ain correc tly owing to a lack of resou rces. Whils t Europ e is movin g over to digita l Betac am and 1619 forma t, many Africa n TV statio ns are still opera ting with Umat ic and with mach ines that are impos sible to maint ain. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With such deriso ry mean s, nation al TV statio ns have to conte nd with unfair comp etition from the intern ationa l statio ns which, from their satell ites, are inund ating the contin ent with their broad casts . The worldbroad castin g chann els of Europ ean statio ns are receiv ed clearl y (CFI, TV5 Afriqu e, BBC World Telev ision, Deut sche Welle, etc.). The numb er of religio us statio ns (gene rally Islam ic) contin ues to increa se and comm ercial televi sion is develo ping apace - CN N, MTV, Cana l Horizo ns, M-Ne t and others can be picke d up just about every where and can thus cream off the best of a comm ercial mark et which is still virtual ly non-e xisten t and awaiti ng better days . </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The URTN A is unabl e to defen d the intere sts of its memb ers, prope rly and its initiat ives (which are, nevert heles s, lauda ble) are stagn ating: the -progr amme rexch ange centre in Nairob i does not excha nge very much at all and Afrovi sion, . the syste m for excha nging news betw een   nation al TV statio ns via satell ite, is strugg ling to Get off the aroun d. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Never theles s, Africa n TV statio ns do not lack talent or motiva tion and many of them are capab le of produ dng more qualit y progra mmes . What can be done to help them ? Firstly, a decis ion has to be made regar ding who is to be helpe d. Certa inly not intern ationa l TV statio ns' be they private or public, which have their own strate gy (comm ercial or politic al and produ ce televis ion progra mmes for impor t which make only a very margi nal contri bution to the expre ssion of Africa n talent . It would also be wrong to rely or, privati sation and comm ercial statio ns in order to obtain quali ty televis ion - t his much has been demo nstrat ed by the Europ ean exper ience . As for direct aid to nation al televis ion, this would mere ly reinfo rce the State mono poly over inform ation. Wha t is requir ed is greate r suppo rt for the transi tion of State televi sion into a genui ne public servic e. with the benef it of an indep enden t statut e and also true editor ial indep enden ce. Conse quent ly, as things curre ntly stand, aid for trainin g teievis ion' profes siona ls, suppo rt for qualit y progra mme produ ction and any aid aimed at draftin g a public -servic e televis ion Statu te, are usefu l forms of suppo rt which are neutra l with regard to State -medi a contro l. Any direct aid to nation al </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> televis ion statio ns in the form of   hardw are and equip ment shoul d be </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> subje ct to their conve rsion into an auton omou s public servic e. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M.L. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Images of Africa in the Western media</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Geoff Mungham</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It seems difficult to find an African leader or African journalist who has not, at some time, been either fiercely critical or quietly despairing of the way in which the continent is depicted by the western media. Their grievances have come to form part of a now familiar litany. Claims are made that the reporting of Africa is now almost entirely in terms of what has been called a'coup, crisis and famine syndrome', and that the western media focus only on 'bad news' out of Africa and ignore the 'positive' achievements of many African countries. These criticisms go hand-in-hand with accusations that Africa cannot ' tell its own story, in its own way', because the global news market is dominated by powerful, westerr-owned corporations, who have their own agenda for reporting Africa. For many Africans, their continent is becoming increasingly invisible in the trade in global news. For them, Rupert Murdoch's cynical remark that 'the Third World sells no newspapers' would appear to have been uttered with Africa specifically in mind. Finally there are those Africans who are concerned about 'western cultural imperialism' undermining traditional African values and culture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How true are these claims? Is Africa becoming once again a dark continent; one largely excluded from the glare of western media coverage? Are some of the correctives suggested by different African leaders worse than the problems they are complaining about? And if Africa is in danger of becoming a 'disappearing world' for news, to what extent are many African countries themselves to blame?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To begin with, there is no doubt that African critics have a case. First and most obvious, is the undeniable brute fact that global news and information flows are dominated by a small number of multinational operators, nearly all of whom - especially since the end of the Cold War - are western owned and controlled. This is true of the great international news agencies, whether the traditional wire services like Reuters or Agence France-Press, or the newer global television news services represented by WTN and CNN, among others. The major clients for their output are western news organizations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, most African countries are in no position to mount a challenge to this world news order. The continent has recently been described as one of the 'least dynamic regions in the global economy, where buying power of consumers is low' and in which many countries are burdened with crippling debt payments. In the same vein, a 1991 World Bank report not only pointed to the increasing 'communications gap' between Africa and the developed world, but went on to suggest that most of the continent offered poor prospects for those wanting to invest in telecommunications projects. These are among the reasons why Africa scores so poorly in terms of putting in place viable national communications infrastructures, let alone being able to take on the global market leaders in securing a higher profile for Africa in the world's news rooms. The same factors also help explain why most African countries remain so dependent on western-controlled news sources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This dependency is not simply a question of the easy availability of copy or other material from the western news agencies. Puri (a Tanzanian journalist and Managing Editor of Newslink Africa)  presents other reasons why African editors are interested in what's happening in the West. These include the links between many African countries and their former colonial rulers, the realities of global and economic relations and his claim that African editors often have little interest in other parts of the continent. As he puts it, '...a newspaper reader in Botswana, for example, is not much interested in reading detailed reports from Morocco.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, there is plenty of evidence to support the criticisms of the 'coup, crisis, famine' coverage. Examples are too numerous to cite here, but the following small selection is fairly representative of the broader picture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Introducing the findings of a 'Global News Agenda Survey', Malik and Anderson noted: 'For the rest of the world, Africa means coupe, and largescale killings (covered usually only in the first few days), almost ritualistic famine relief... and the occasional travelogues in the guise of saving something or other'. Similar claims were made by Okigho when he wrote that while CNN and other satellite organisations have 'revolutionised international news coverage', the most common images of Africa still depict internecine warfare (in Angola, Liberia, Somalia), pogroms in Rwanda, political violence in Sierra Leone and ethnic conflicts in Kenya and elsewhere in Africa. In contrast, says Okigho, the 'many positive developments' are routinely ignored.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A limited review that I made of wire service copy from the main international news agencies during the week of 13-20 May 1996, produced findings that seemed to echo some of these complaints. In this period, hard news stories were concentrated on a handful of the 50 plus countries of Africa; Burundi, the Central African Republic (C.A.R.), Egypt, Liberia, Somalia, Sudan and South Africa - together with stories of alleged financial irregularities in the World Health Organisation in Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Copy about Burundi dealt with ethnic violence and attacks inside Zaire   on Burundi by Hutu 'rebels'. Reports from the C.A.R. focused on an army mutiny, street battles and looting, but were angled on the mediating role of French troops (the C.A.R is a former French colony) and the fate of 100 Americans trapped in the capital, Bangui. Egypt was featured after its government accused Sudan of harbouring a 'vipers' nest of terrorists'. Out of Liberia came a torrent of wire copy about fighting in Monrovia along with assorted atrocity stories, but pinning the emphasis on the plight of foreign nationals (especially Britons and Americans) and the role being played by the USS Guam in air-lifting them to safety. Somalia rated a mention because of the release of two foreign aid workers (British and German) held by an unidentified 'rebel faction'. On South Africa, the wire services were fixed on further violence and killings in KwaZuluNatal, the result of ongoing struggles between rival supporters of the A.N.C and the Inkatha Freedom Party.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'agenda for Africa' sent out by the wire agencies, was replicated by  the menu offered by Reuters TV and APTV. For instance, on one day during the study period, the former was offering ten picture feeds; only one was from Africa (on the C.A.R.) while the rest included such compelling visuals as the British Queen's visit to the Chelsea Flower Show. For the fifteen picture feeds being touted by the APTV on a single day, one featured Africa ('news pictures to offer on the airlift by US marines'), which competed for the attention of western news rooms alongside visuals of a US woman who collected hubcaps (140 000 of them, no less!), Hugh Grant arriving by boat at the Cannes Film Festival, footage of the Monaco Grand Prix and a 'fun run' in Sarajevo (whether or not pictures are available, the idea of a 'fun-run' in Bosnia still seems a difficult concept to grasp) But what these studies show is not the whole picture about Africa which circulates in the West. Nor should they necessarily be used to support the usual criticisms about the performance of the western media in relation to the continent. In the first place, not all news  out of Africa fits into the syndrome the critics complain about. For example, a great deal of the coverage of South Africa has been 'positive' (if we trace the reporting of that country's transition to majority rule). So, too, have the moves towards multi-party politics in African states like Zimbabwe. Similarly, there is plenty of reporting of Africa's sporting successes (such as South Africa's Rugby World Cup triumph). Nor is the West unaware of the work of certain African musicians and film makers - indeed, it has been influenced by them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And even if 'positive' coverage is sometimes hard to find, the critics may still be missing some key points. The first is to do with western 'news values' or rather a failure to appreciate how they work - whether in relation to Africa or anywhere else. The staple diet of much of the global news flow is about 'bad news' and, in this respect, Africa prob  ably fares no worse or better than other parts of the developing world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Second, a more 'systematic' reporting of much of Africa is still difficult. My point here is about a lack of efficient and developed communication infrastructures, but also a reluctance by many African leaders to tolerate - let alone actively encourage - free and honest open reporting. Too many African journalists have been, and are being, harassed, imprisoned or killed by their own governments. Much of the media in Africa - especially the broadcast media - remains under state control. Newspapers that show a 'lack respect' for the ruling party are frequently shut down. These realities help explain why some of the maligned western media are turned to by those Africans who want something more than state propaganda from their newspapers or broadcasters. This is why the BBC World Service has come to enjoy such a high reputation in many parts of Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Third, the attempts made by the African states to try and take on western dominance of global news and information flows, have been misjudged. Two failed initiatives in particular are worth mentioning in this context; the launch in 1983 of the Pan African News Agency (PANA) and the long-time obsession with setting up a 'New World Information Order' (NWIO).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the start, PANA has been dogged by financial and management problems. African governments owe $18 million, journalists have gone unpaid, lines have been disconnected and in 1992 a UNESCO-funded audit found evidence of financial mismanagement. The main source of information PANA traded in was material from the domestic news agencies of OAU member states. Since most of these are state-controlled, the 'news' they were offering was never likely to attract many western users. To try and give PANA a new lease of life, UNESCO are backing a rescue package, which would allow for private investors to be shareholders along with state-owned African national news agencies. But the pro  posed partnership funding is unlikely to work, especially in one-party states where the ruling groups have always been suspicious of any media not under their direct ownership.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The NWIO project has chased even more impossible dreams. Any attempt fundamentally to change the global news order was always going to be beyond countries with severe national communication 'deficits'. Most African countries, with weak and undercapitalised information infrastructures were never in a position to take on the market leaders in the global news business. In pursuit of the NWIO idea, endless international conferences were held, declarations passed and ritual attacks made on ' western media dominance'. Nothing came of it all. If the sense of frustration which kept the concept alive was understandable, less easy to grasp was why African leaders focused on the NWIO idea, while their own grassroots communication systems remained impoverished and under-resourced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most recent attempt to develop 'top-down' communications facilities in parts of Africa comes with the attempts to push satellite-delivered payTV on the continent. Among the 'players' here are Multi-Choice (which will be offered to subscribers in over 30 countries in sub-Saharan Africa), Canal Horizons (targeted on North Africa and Francophone West Africa) and Panafnet (also aimed at buyers in Francophone West Africa). Because these enterprises are subscription-based there will be a clear bias in take-up towards upperincome groups; and - certainly in the case of Multi-Choice - the output will have a 'strong UK/USA programming flavour'. It is hard to see how these initiatives will ever meet the real news and information needs of the vast majority of African consumers, who have limited spending power and are often deprived of the most basic communication tools.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As Hans Dieter Klee (former Head of the Africa Service of Deutsche Welle) has rightly argued, what Africa urgently needs is large-scale international media aid to help strengthen its own media. This aid should not be targeted at projects designed somehow to allow Africa to 'compete' with Western media congLom&eacute;rates. It should, instead, be aimed at building up diverse, viable and professional local and national media enterprises in African countries themselves. In this, the EU can play a leading role, working through the links established under the Lom&eacute; Convention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robust national communication structures in Africa will not, of course, alter the balance of global media power. They will be able to do little to stop the international news agencies reporting Africa in the way they have done in the past. And it will be a long time before most Africans becomes travellers on the 'information superhighway', since this, in essence, is an extension of existing computer and telephonic communications, which the continent lacks. But a vigorous local and national media, Africa-wide, would be good for Africa and the best barrier for resisting outside media influences. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">6.M.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">References</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Okigho: 'National Images in the Age of the Information Super Highway </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">African Perspectives', African Media Review, vol. 9,1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R. Malik and K. Anderson: 'TV: The Global New Agenda Survey', intermedia, January-February 1992. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">B. Hicks 'North of the Limpopo', Cable and Satellite Europe, April 1996. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">A message of hope on the Burundi airwaves</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Parliament may seem an unlikely launch pad for a radio station, but two members of this elected body, who are committed to a free and fair press as one of the cornerstones of democracy, have set up Radio Espoir (Radio Hope) in Burundi with backing of the European Community Humanitarian Office (ECHO).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Parliamentarians, Pierre Pradier (ERA-F) and Bernard Kouchner (PSE-F) are co-founders of Radio Espoir (Radio Umwizero, in Kirundi) which brings together a French association and a local Burundi radio station. Three expatriates are working on the Bujumbura-based project; an editor, a radio technician and an administrator. They have teamed up with local journalists who, for the moment, are providing their services free of charge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The station, which broadcasts in Kirundi, is targeted at an audience in the 15-25 age group. In a country with an 80% illiteracy rate, radio is the only way of reaching the population. 'The idea came to us in 1994, with Rwanda and Radio Libre des Mille Collines' says Pierre Pradier. 'If so much harm could be done with radio, then why equally could good not be achieved.' RLMC was the radio set up in July 1993 on the eve of the genocide in Rwanda. It became a mouthpiece  for the Akazu, a clan of Hutu extremists grouped around the then President's wife, Agathe Habyarimana, and it undermined the Arusha agreements by whipping up ethnic conflict in Rwanda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Pradier explains that Radio Hope journalists intentionally avoid speaking about Hutus and Tutsis. He also highlights the problems encountered in providing news coverage when local conditions are so difficult. As he points out; 'When you speak about the situation of a woman who has lost her husband in Burundi, you are talking politics.' Security considerations are important too while the MEP stresses that a proper analysis of events can only come with time: 'At the moment we are limited to reporting the facts. And it is only when the facts are verified that one can begin to interpret them.' The news items broadcast by the station rely on agency dispatches confirmed by a network of local people who call in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of such sensitivities and in an effort to find as much common ground as possible, the radio station gives music top billing. This has the added advantage of helping to attract listeners. It also offers general programmes on African roots, sport, culture and educational themes, in addition to its news items. It is currently broadcasting for six hours a day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pierre Pradier says he would like to see an end to the 'navel gazing' of Burundi's population. 'We want to show that peace is possible, by showing how it is progressing elsewhere: in Haiti, for example, where there is a legitimate President now, and amongst the Chiapas in Mexico.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But, like many fledgling stations, finding enough funds from donors to guarantee its future is a worry. The station's current ECHO grant runs out in September 1996. Indeed, the project, classified under emergency aid, was atypical for the humanitarian aid office. But Mr Pradier is hoping that continued support will come from one of the EU's budget lines. He believes that the Union is a particularly suitable donor because it tends to be less 'colonialistic' than some others. He also raises the possibility of seeking funds from private donors such as the Fondation de France. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Looking to the future of the station, Pierre Pradier argues that they cannot let the project 'drop' and hopes eventually to see it being handed over to local broadcasters, assuming 'they are people we can depend on'. The signs so far are encouraging. He would also like to see Radio Hope's programme content broadened to include game shows, with radios offered as prizes for the winners. As far as he is concerned, the more people who tune in, the better! _</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joint Assembly resolution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ACP/Ku Joint Assembly is pushing for EC institutions and Lom&eacute; signatories to be more supportive of media issues. A resolution on the role of communications media in the development and consolidation of democracy in ACP states. passed by the Assembly in March, contained the following points:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - freedom of expression and free communications and media are vital to the development of a democratic society;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - more ACP countries should give opposition parties access to the media' notably where this is controlled by the state;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - all candidates and political parties should be given access to the media in a 'balanced and fair manner'; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - laws which restrict press freedom and the electoral process should be repealed;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - any threat of physical attack against media organisations or their employees should be investigated by the authorities, with those responsible being brought to justice;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - the media should be impartial, providing accurate information during elections, helping to educate the electorate, explaining the importance of elections, giving information on where, when and how to vote, and explaining the secret ballot;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - EU assistance for free and a fair elections - and a free media sector in ACP countries - should be increased. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Catholic radio in Southern Africa</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Antonio Pacheco</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this abridged article, the author, who is a Portuguese journalist, gives details of two church-supported local radio projects in Southern Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the end of the 1980s, the Social Communication Department of IMBISA, the conference of Catholic bishops in Southern Africa (a kind of SADC for Roman Catholics) embarked on a local radio project. It had a two-pronged approach. First, it involved setting up a network of small community radio stations. The local population were involved, sharing responsibility for making programmes and broadcasting information and news about everyday life in the remotest places. In some cases, the programme content was retransmitted at a provincial or even national level. The second aspect was that it was supplemented by the creation of flexible and independent associations of journalists/presenters. They formed information agencies operating as a network to link up local radio stations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At that time, the main concern in Southern Africa was to rid South Africa of apartheid. There was also a desire to promote freedom of expression in Angola and Mozambique. Given that radio was (and still is) the most important means of communication in the region, the idea was to set up a regional network capable of overcoming all the constraints ranging from legal bans and restrictions on broadcasting to widespread illiteracy. The ultimate objective was to set up a Catholic radio station based in Swaziland. This project did not go ahead, however, because it was too expensive to finance and, above all, because it was dependent on the regional Catholic hierarchy. It proved difficult to reconcile the various ideological views and sensitivities of bishops in the various countries of the region. There was also a growing feeling amongst the Christian communities that the underlying need was not for a radio station which would be a vehicle for bishops' views, but rather a media system that served the people, offering recreation, training and information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Radio Pax</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another local radio project of interest, which is now up and running, involved reviving Radio Pax, the private Catholic radio station which made a significant contribution during the 1 960s to the struggle for a free Mozambique. The operation closed down in 1977 but the experience was not forgotten and 16 years later, the decision was made to bring the station back on air. Those behind the new project took advantage of the trend towards greater political openness in the country. Their aim was to offer a credible and informative alternative, which, they hoped, would be up and running in time for the elections scheduled for October 1994. A course was run between July and September 1994 which brought together young presenters chosen by small communities on the outskirts of Beira, Chimoio, Nampula, Quelimane and Maputo. The course involved honing the participants' presentation skills and providing practical training in technical subjects, and programme and information preparation. This was how the first association of young independent Christian journalists came into being.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For various reasons, including red-tape and customs regulations, the  new Radio Pax was unable to broadcast in the run-up to the general election. However, the young journalists, who received their training at various locations, were able to act as important independent sources of information. This was channelled to Maputo and used as backup for a number of international press officials and observers. The information relayed by the young presenters in the provinces made it possible to publish a newsletter which was circulated throughout the country, using fax, religious channels and a variety of other means.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Radio Pax is now in operation, although it faces major technical problems. It is based in a community centre in Inhamizua, 20 km from Beira. The station has already done important work in gathering information about local traditions, and has broadcast programmes aimed particularly at women and young people in suburban areas. The network also incorporates Mozambique's Radio Encontro, which broadcasts from Nampula in conjunction with the Anchilo training centre. There are plans for further local radio stations in Maputo in the south, Quelimane and Chimolo in the centre and Pemba in the north.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Radio Pax is managed entirely by the Association of Independent Young Christian Journalists in Beira. In terms of training, the current preoccupation is to teach the young people involved how to manage the small radio stations which have been made available to them, and to set up local self financing systems. Although equipment is important, what really counts in this project is the training of the presenters. Working in close collaboration with the community, it is they who are in the front linepromoting the inalienable right of free expression.</P>
+<P ALIGN="JUSTIFY">A.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The Voice of the Disabled in Chad!</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Mand Rya&iuml;ra Ngarara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Support Group for the Disabled in Chad (AEHPT) was set up in 1987 with the assistance of the International Christian Service for Peace (EIRENE), which has its headquarters in Germany. By coming together to form a group, disabled people hoped to take charge of their lives and break down the wall of silence that surrounds them. However, despite setting up various workshops (welding workshops, small printing works, musical groups) and publishing an information newsletter, entitled 'Perspectives'. the AEHPT has been unable to improve the image of disabled people within Chad society and has failed to  raise awareness that the work done by the disabled is not only of value, but deserves due recognition. From this status quo sprang the idea of broadcasting a national weekly radio programme called 'The Voice of the Disabled'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are two reasons why radio was chosen as the communication medium: firstly, the very strong oral tradition of the country, together with the population's weak purchasing power, which make access to newspapers difficult, means that radio remains the most appropriate medium for reaching a wide audience; and secondly, radio programmes are not difficult to produce, since they do not require vast technical, financial or human resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Letting the disabled have their say</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initially launched by the AEHPT, The Voice of the Disabled is now jointly produced and broadcast by four associations actively involved in defending the interests of those with disabilities. It is broadcast nationwide every Monday at peak listening times.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The programme is not, however, aimed solely at those with disabilities but, on the contrary, seeks to increase awareness in Chad society as a whole. It also acts as a platform from which to urge the authorities to take concrete measures to help this section of the population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, more than a year after its launch, The Voice of the Disabled is enjoying tremendous success, with ever larger numbers of people, from all walks of life, tuning in. For the disabled themselves it provides a vast source of information, explaining the facts behind the causes of their disabilities and giving advice on how to prevent such disabilities and what can be done to treat them, and it keeps people informed about  what is happening within the various associations for the disabled, giving information about the activities, projects and special events that are taking place. As far as the rest of the population is concerned, The Voice of the Disabled has helped to raise the profile of disabled people in Chad. Slowly but surely, people's preconceptions are beginning to change and one of the programme's greatest achievements has been to eradicate gradually the negative image which people used to have of disabilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless, the lamentable fact remains that this programme is broadcast solely in French, and this is why plans are now in the pipeline to broadcast The Voice of the Disabled in both Arabic and Sara - Chad's two national languages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M.R.N. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">TV documentaries and development</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Africa Express experiment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Richard Synge</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'Africa Express' documentory series mounted by Channel4, an independent British TV station, has done more than just put a new slant on news provided by state-run African channels. it has also created jobs for African producers and reporters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Television viewers in Africa will soon get the chance to see documentaries on African current affairs and development topics which have hitherto only been seen on British TV sets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Channel Four's Africa Express programme has recently concluded its third series to much critical acclaim in Britain. it included items on a surprisingly diverse range of topics. One film showed how a cash-strapped Congolese prison saves money by sending its prisoners home one day in every month, and included lively interviews with the governor and the prisoners themselves as well as footage of the grim prison conditions. Others focused on the flourishing free currency market in Zaire, the spread of South Africa's 'shebeen' culture into the country's upmarket suburbs, political battles in Namibia over the rights to manage historic tourist sites and the Nigerian military government's blatant attempts to censor television reporting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The latest series supplemented the work of British film crews by incorporating several documentaries that were made entirely by African production teams. Special funding for this element of the Africa Express project came from the environmental television distribution agency TVE. As a result, Africa Express hired four African directors and used African-based crews to film half of the 24 films in the series.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other innovative part of the project was that the programmes are now becoming available to viewers in Africa at the lowest possible cost. To promote this concept of 'media feedback', TVE has been actively marketing the series to non-governmental organisations and facilitating arrangements for the distribution of the cassettes to African broadcasting stations, both state-owned and private.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'It is a way forward for us, because nothing like this has been done before,' says Raphael Tuju, a Kenyan film producer who runs a video resource centre in Nairobi, marketing documentaries to local broadcasting stations and the educational sector. 'There are too few opportunities for producers in African countries to break into the international networks. The subjects we cover are rarely of interest to the distribution companies, the differences in technology are too wide and getting wider, and there are not enough African producers who have reached the professional level to compete with their counterparts abroad.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peter Gill, who edited Africa Express for Channel Four, welcomed the opportunity to help promote the independent film industry in Africa. 'It was thoroughly stimulating,' he says, adding that one of the constant challenges was 'finding ways to bridge the gap between what is technically possible in Africa and the standards required for a European television production.' The four African directors hired for the series were two South Africans, Eddie Mbalo and Teddy Mattera, a Zimbabwean, </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Albert Chimedza, and a Namibian, Bridget Pickering. They all worked directly under Peter Gill's management and in contact with a producer in the field. Gill was impressed with the level of journalistic and technical expertise available in Africa and the dedication of the teams working in difficult situations. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Even where the production teams were British, all the 24 films in the latest Africa Express series used African journalists and presenters. They researched and organised most of the films in advance of the actual shoot by the visiting film crews. Cameroonian journalist, Emmanual Wotany, played a prominent role in the films on Congo and Zaire. Kenyan reporter Joseph Warungu proposed and presented a film on the hazards of skin-bleaching in The Gambia. The presenter of the programme on Nigeria, Toyin Fane-Kayode, bravely challenged the censorship of the country's military regime.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An all-African camera and sound team led by Lawrence Mbada and Mandla Mlambo was responsible for the four films in the series that were shot by the South African Broadcasting Corporation (SABC). In the extremely difficult conditions of Angola and Namibia, an experienced SABC cameraman was used. Here there was a need to ensure that the less experienced directors were not further challenged by having to work with an inexperienced crew.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For TVE's Robert Lamb, one of the main breakthroughs made by Africa Express was in the agreement of Channel Four to collaborate both with the SABC and with TVE itself, which insisted on the involvement and participation of African journalists, film-makers and technicians. He was impressed by the results and hopes that thee could be 'an even greater African involvement in another series, if one is commissioned.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The latest series was a success, being regularly watched by up to two million viewers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Channel Four granted broadcasting rights for the series in lowincome countries to TVE and Worldview International Foundation as well as the non-broadcast rights to TVE and its partners in the third world. These   agreements allow TVE to provide the tapes at nominal cost to a network of video resource centres, similar to that run by Raphael Tuju in Nairobi. Such centres seek to get development-oriented documentary films shown by the local broadcasting stations but survive by supplying the needs of schools, colleges, non-governmental organisations and other categories of 'multipliers'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most successful documentary centres is the Film Resource Unit (FRU) in Johannesburg. From its origins as a way of sharing bootlegged foreign films and TV programmes during the political repression of the 1980s, FRU is now a major distributor of educational and documentary films.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To overcome the inexperience of state-owned African broadcasting networks in showing programmes of developmental relevance to their societies, video resource centres have to provide their own sponsorship. 'It is difficult for us to compete with the likes of Coca Cola, which will sponsor programmes like soap operas,' says Raphael Tuju, 'but one way round this obstacle is to sponsor a programme and at the same time advertise our services. The business we generate this way usually means that we can at least break even.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Film-making capacity in Africa has been severely limited by most governments' domination of the broadcasting media and a deep and institutional reluctance to encourage independent local productions. The mainly government-owned television stations rarely have a policy to buy in locallymade programmes and tend to look to Britain, France or the US for outside material, which is often dumped on the market at low prices, making it an even harder challenge for local producers to generate the funds to make their own programmes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The decline of the once-active film industry in Nigeria, in particular, means that in English-speaking Africa, the field is now dominated by South Africa and Zimbabwe. In French-speaking Africa, the continuation of subsidies  has kept an 'art house' tradition alive, especially in Senegal and Burkina Faso. In most of the continent, however, the only development-oriented programmes shown to the public tend to be made by the governments' own propaganda departments rather than by independent film-makers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where there is a lack of access  to local broadcasting media, African film-makers continue to experiment with making their own dramas and documentaries, showing their work on video in village halls and schools. 'At the grassroots, African film-making can be stimulated simply by consumer demand,' says Russel Honeyman, who publishes the African Film and TV Yearbook in Harare. 'But local products do not usually translate into international products. Film and television is a global industry and film-makers should not insist on being too parochial. There is room for greater international collaboration.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Based on the experience of the latest Africa Express series, TVE now plans to build on its achievements. In May 1996, it exhibited the series to the directors of African television stations at a conference in Windhoek, Namibia, and discussed arrangements for distribution of the cassettes. It is also planning to  participate in a workshop for French speaking West African nations in Senegal under a grant from the European Union's human rights division. The consultative process will continue with a meeting of the African video resource centre network at the end of 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TVE's Robert Lamb hopes that the success of Africa Express might encourage international funding agencies in Europe to take up the challenge of funding films made in Africa for African consumption. He doubts that Channel Four on its own would take such a risk. Constraints are, perhaps inevitably, imposed on TVE's concept by the fact that programmes produced for European audiences use a production and editorial structure that requires 'post production' in European capitals. 'Although we came out owning the rights to the programmes in Africa, Channel Four still had 80% of the control over the production and editorial decisions,' he acknowledges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Robert Lamb is fully aware of the challenges that lie ahead. 'National broadcasters are in a parlous financial position and are still, for the most part, stifled by government controls,' he notes. 'Africans who have received formal training rarely find the funds to apply their newly-acquired skills.' But Mr Lamb and his TVE organisation are convinced that there will be increasing demand for more programmes like Africa Express, as much from Africa itself as from European audiences. </P>
+<P ALIGN="JUSTIFY">R.S. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The Internet and the South</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Renaud de la Brosse</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author, who works at the Panos Institute in Paris, reflects on the pros and cons of new information technology for countries in the South and on their chances of success.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Internet has become such a craze amongst users in Third-World countries (researchers, teachers, businesses,, liberal professions, etc.) that it amply demonstrates that a real and genuine need is being met, despite adverse comments from its detractors. The rapid increase in the number of connections to the network in the North is mirrored by an exponential growth in the South. Africa is a good example of the possibilities offered by access to the global network whilst at the same time revealing the technical and financial restrictions facing countries in the South.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Almost all of Africa's 55 countries are today connected to the network, from South Africa, which has over 800.000 computers, to Uganda, which has just a few thousand. The importance of the Internet in Africa must be viewed less in terms of the number of computers (means of access to the Internet) and more in terms of the constant increase it represents in numbers of subscribers to the network. In the last six months alone, the number of subscribers increased by over 50%, whilst the increase in France, for example, was only 20%. Another telling figure is the number of host computers per 1.000 inhabitants, which rose by 147% in South Africa between 1994 and 1995 whereas the increase for Taiwan and Australia was 83% and 50%, respectively!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because it is under-supplied in communications equipment, Africa is starting out with a disadvantage compared with other continents. However, the recent G7 Conference on Information and Development, which took place in mid-May in Midrand in South Africa, brought together 40 countries and 18 intergovernmental organizations and made it possible 'to build a bridge between developed countries and developing countries' so that the latter are not excluded from the world of new information technologies. The benefit to be gained from the Net for the Black Continent lies in the fact that African surfers are anxious to break free  from their scientific, cultural or economic isolation which comes not only from relationships between Africa and the rest of the world, but often from relationships between regions and countries on the African continent itself.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Precursors</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As in Europe and the United States, scientists and researchers in Africa are the first to have understood the importance of the Net and there are now - in French speaking Africa - networks such as the Intertropical Computer Network, which groups together approximately 3000 surfers in 11 countries. The importance of the Internet for these researchers is manifold; in most countries, the education system is in grave crisis, essentially because of diminishing budget resources which for years, on account of structural adjustment measures, have been melting away. This explains the absence of libraries or documentation centres. The Internet is therefore becoming a stopgap measure, offering access to all current scientific production and giving African researchers the chance to publicise and gain recognition for their work outside their own continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interesting experiments in North/South cooperation are also being set up, with the French-speaking Agency for Higher Education and Research currently establishing what it calls a 'virtual French-speaking campus', a kind of vast library to which affiliated universities will be connected. The project is also justified in economic terms since, through the medium of electronic mail (e-mail), which goes hand in hand with the Internet, exchanges of information will be cheaper than by fax, for example, which costs at least five times as much for the same amount of information transmitted. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Outside the academic community, heads of African businesses are also launching themselves into cyberspace, particularly in the case of several hundred of them who have grouped together within a West-African Business Network. Internet's financial viability in the South is dependent on membership of African businesses and multinational companies established in Africa. The cost of subscription is still beyond the means of private individuals and only 'institutional' subscribers are currently able to guarantee payment in the short term.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A useful tool</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of the possibilities on offer remain to be explored, so the Internet can therefore be an important medium for promoting African culture - Niger has set up a Web via which it is possible to visit its archaeological sites and Benin has just set up a server dedicated to voodoo. In general terms, there is the challenge of mastering content, in other words the African suffers should not restrict themselves to a  passive use (sleeking information from the North) but should, on the contrary, move progressively as players providing content and information. For the countries of the South, it is a matter of mastering information and preserving their culture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The range of possibilities offered by the Net is limitless. Its development in Africa or in the South in general does, however, run up against a number of obstacles, including those of both a technical and financial nature. The importance of the Internet lies in being able to transmit greater quantities of information more cheaply than by using other communications techniques. However, the required technology is expensive and therein lies the principal difference between the North and the South.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The infrastructure which would permit rapid, longterm expansion of the Internet is nowhere near being installed in Africa, just as in the other developing countries. The continent is still under-equipped in terms of telephone lines; according to a survey by the BDT (Telecommunications Development Office), the number of main telephone lines per 100 inhabitants is less than 0.5 in sub-Saharan Africa, and in terms of equipment providing access to the Net (computer, modem, etc.). In real terms, this makes access to the network much more expensive for a user in the South than for one in the North. All these imported electronic goods are much more expensive than in the West, and this is without taking account of the additional cost, in most African countries, imposed by tariff barriers on IT goods, which are regarded with great suspicion by the authorities who perceive them as a potential danger more than as essential development tools.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fear is that the remote transmission of data might pose a threat to less than democratic regimes. Under the pretext of 'the control of information-based wealth', a State may decide to interfere with the 'consent' or even 'suppress' a site for producing and exchanging information deemed contrary to its interests. Once more, the question of freedom of expression arises in different terms in the South and North. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Panos Institute</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Panos Institute is a non-profit-making association set up in 1988. Together with its counterparts in London and Washington, the Paris Panos Institute founded Panos International The Institute's aim is to strengthen, particularly in Africa, local expression and information capabilities. Within the context of sustainable and  better-shared development, it aims to promote the emergence of a more democratic culture and of more democratic debate. To this end, the Panos Institute runs two main programmes in west Africa from Paris and its branch offices (Senegal, Mali, Chad and Ghana).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The programme to support pluralism in matters of information, which has four major objectives: - to expand and consolidate the legal, institutional and statutory framework of pluralist-type information - to increase professionalism in the media - to give institutional support to authors in west Africa who promote pluralism in information - to contribute to the production and circulation of more diversified and more qualified information on certain priority topics such as the environment, human rights, management and prevention of conflict, etc.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The migration and cooperation programme seeks to enhance the value of the contribution made by citizens from Third World countries residing in the rich nations to development in their countries of origin. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union, UNESCO and the ACCT, American foundations (Ford, Rockefeller) or German foundations, and bilateral cooperation agreements (Denmark, Netherlands, Norway, Germany, France) support the actions of the Panos Institute. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The press in Africa as a tool in the democratic  process</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Florence Win&eacute;ry</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although radio is 'king of the media' in Africa, the press is increasingly becoming an active player in the democratic process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This has been seen particularly over the last six years in the French-speaking African states where a burgeoning of political parties has been matched by the appearance of an unusually large number of  newspapers. In these countries, the press still requires rudimentary political stability - in contrast to English-speaking countries, where it has a much longer tradition and can nowadays be generally regarded as the 'Fourth Estate'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nigeria is a good illustration of this. One need only cite the press campaigns mounted there to protest against the Federation's membership of the Islamic Conference Organisation in 1986, and more recently, the support given to Moshood Abiola. The vitality of the Nigerian press is something that deserves to be emphasised. Despite a series of measures over the years aimed at suppressing it (not exclusively by the military authorities) it is still much in evidence. There are demonstrations to support it, and it has 'gone underground' at times, continuing to publish clandestinely. The journalists' struggle intensified in June 1993, when it was recommended that they should exercise 'discretion and self-regulation'. In spite of the problems, the Nigerian press endeavours to remain a source of pressure in Nigeria's political and social arena.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Returning to the French-speaking media, we see that the pace of expansion varies considerably from one country to another. In Benin, for example, current discussions are centred  strongly on opening up the country's airwaves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Is a private press a partisan press?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is debatable whether the private press is truly independent. In the political sphere, it is often highly partisan while 'economic' independence - in the sense of access to the materials needed to produce a newspaper - is not always possible. Printing and distribution are often subject to monopolies which may constitute a form of disguised censorship for the publishers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initiatives aimed at setting up press associations in one form or another have been launched in an attempt to overcome these problems. This helps explain why the SEP (publishers' Society) was established. This group, which hopes to extend its activities throughout the region, is based in Benin where the democratisation process (and the proliferation of press titles) first begun. In many countries, media associations have already been formed covering specific areas such as radio, the press and publishing. There are plans for similar organisations in the field of television. Sometimes, they have printing facilities which are available to other private publications.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The principal challenge facing a general information-based newspaper is that it should appear regularly and on time. The next stage, ideally, is for it to be able to increase its distribution. Initially, a number of newspapers only came out monthly or even every two months. After appearing regularly for several months - and thereby achieving  relative financial stability - they then moved to weekly publication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most countries, a new legal framework was also adopted, although the application of the legislation has often proved laborious. This is particularly true of the setting up of regulatory authorities. In Senegal, where the media was previously governed by a law passed in 1979 (and amended in 1986), new legislation was enacted at the beginning of 1996. The measure was prompted by concerns over ethical standards, a demand for a more 'responsible' approach, a desire to prevent monopolies developing, and fears of excessive foreign involvement. This year has also seen the implementation of media law amendments in Cote d'lvoire.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The focus of the work of many newly-formed organisations has been the drawing up of a professional code of ethics, with a view to defining the basis of the journalist's profession. In Cote d'lvoire, the OLPED (Press Freedom and Professional Ethics Monitor) was created in September 1995 in Yamoussoukro at a seminar on journalists' responsibilities during elections. The OLPED is made up of 13 members representing publishers, civil society and the nation's journalists. Although the 'Monitor' has only moral authority, it has had considerable influence on journalists' professional consciences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The OLPED held weekly working sessions up to March 1996 and now meets every two months. One of its main achievements has been to define the criteria whereby a responsible attitude can be guaranteed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vigilance</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The press can expect to be subject to rigorous supervision during an election campaign - as happened recently in Benin. Indeed, Benin's press has attracted special attention from various national institutions including, most notably, the NGO community. This interest resulted In the organisation of seminars on journalism during an election period, designed to avoid incitements to violence. The HAAC (Audi  ovisual and Communications High Authority), responsible for statutory control of the media in the run-up to and during the campaign, took part in these meetings which were aimed at increasing awareness and highlighting the heavy responsibility carried by the media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite a number of incidents during the campaign (which were immediately reported) and although the situation threatened to get out of hand while the country was obliged to wait for the publication of the results of the second round, the press conducted itself in a fairly moderate manner. It should be recalled that there was a great deal of apprehension in Benin before the results were announced with a widespread fear that violence might break out. These fears were given extensive coverage by the media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The HAAC proved to be central to the electoral process and, ultimately, the press was congratulated by most political leaders in Benin, and by those from abroad who were involved in organising and observing the poll, for the role that it played in the process. By and large, it concentrated on portraying popular expectations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During an election period, the print media is an essential vehicle of opinion and power, justifying the creation of special titles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present, the private press is playing an increasingly important role in the democratic process and the question of its survival appears to have attracted more serious attention from the authorities. In Senegal, a subsidy has been granted to a number of newspapers, subject to certain conditions, and Mali set an example this year by establishing a private press aid fund, with Cote d'lvoire about to follow suit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The political context which has favoured this flourishing of the private press has had a marked influence on the way it has developed and on the editorial content of most journals - which is strongly focused on politics and 'national' issues. The press has barely had a chance to find its feet on the media scene and in the political process, and it has had to contend with huge  economic constraints. Low circulation figures are one key reason for its precarious position - newspapers are read only by an educated, urban minority. However, the press is now embarking on a new course, attempting to establish a loyal readership with a view to guaranteeing its long-term survival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Independence and integrity ought, of course, to be the hallmark of journalism, although currently it is not  possible to say that the profession is dissociated entirely from political militancy. In the past, the press has played  a part in undermining the national consensus by promoting division and, on occasion, fomenting exclusion and confrontation. The issue today is whether the sector can now take its place in states governed by the rule of law, representing public opinion and helping to bring about a rapprochement of ideas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F.M. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Benin's press on parole?</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Richard Lawson T&egrave;vi</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When President Mathieu K&eacute;rekou of Benin granted permission to set up private newspapers in his country, the result was an upsurge of new titles. The following article is written by a journalist who works on  one of these publications ('Tam-Tam Express'). He offers an assessment of the way the private press has developed in Benin, and in particular of the ethical and economic challenges it needs to overcome in the new democratic order.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1988, President K&eacute;r&eacute;kou's revolutionary regime authorised the setting-up of private newspapers in Benin. At the beginning, only a limited degree of freedom was granted to new publications but things have evolved quickly. 'La Gazette du Golfe' and 'Tam-Tam Express', the first independent weeklies to be set up (two years prior to the 1990 national conference), went beyond what the Marxist regime had in mind and effectively achieved press freedom in the face of opposition from the Ministry of Information and Propaganda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Journalists took advantage of their initial limited freedom to publish reports about political and financial scandals and this, not surprisingly, gave a new lease of life to the media more generally in Benin. In particular, journalists from the national radio and television  channels were quick to switch their style of reporting, dispensing with the stereotyped formal language which had previously characterised the public-service media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meanwhile, several politically oriented publications came into being ('L'Opinion', 'La Recade', 'Le Canard du Golfe'). This development gave newfound dynamism to the emergence of a free and independent press in the crucial period prior to Benin's national conference, which was held in February 1990.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To date, 170 titles have been registered with the Ministry of the Interior, although barely half of these have been published more than five times. Some appeared only once and many have existed in name only. Publications which have had only a sporadic existence are legion and, in the years between 1991 and 1996, when political power alternated between Presidents Soglo and Kerekou, independent privatepress titles flourished. Unfortunately, they faced a number of problems - such as prohibitive paper and printing costs and poor distribution networks. The result was that many operators were financially ruined as a result of their decision to venture into this area of publication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Currently, the Benin market has only 20 or so titles which appear on a   reasonably regular basis. For the most part, these are two-weekly and monthly publications which concentrate their activities in Cotonou. The audiovisual media are conspicuous by their absence, despite the provisions of the Constitution adopted in December 1990, which gave special powers to the HAAC (Audiovisual and Communications High Authority), particularly as regards guaranteeing 'press freedom' and 'opening up the audiovisual sector'. No one knows when this law will actually be implemented, but it does appear that the Benin Parliament, which sits in Porto Novo, has been giving more attention to this issue since General K&eacute;r&eacute;kou's accession to power.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The relationship between the press and the state</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governmen/press relationships are not particularly healthy at the moment. The usual reflex of authorities in any country is to control or manipulate the press wherever possible. At the ORTB (Benin Broadcasting and Television Office), a branch of the public sector, journalists often complain of the pressures they face in processing information. The same is said at the national daily, 'La Nation'. Fortunately, such pressures have not always shaken the resolve of the professional journalists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The private press has a different problem. In this case, it is the newspaper proprietors who look to collaborate with the political parties. As one publishing editor has said, 'Our problem is more one of allegiance than of harassment'. Virtually all publications are political vehicles for one or other group - which makes nonsense of the code of ethics that is supposed to govern the profession. This phenomenon was most marked during the election period. All the titles that had been in 'hibernation' came to life again and new titles were born, only to disappear once the poll was over. This is also a reflection of the very meagre resources available to most private publishers. Those who do have sufficient means are usually quick to offer allegiance - for example to particular businesses - in order to position themselves more favourably from an economic  standpoint. Thus, some of the press rather overtly promotes particular economic interests. Others assiduously woo politicians and, in some cases, use blatant blackmailing techniques. In the latter situation, the 'market' operates on the basis that a file (sometimes assembled from a number of documents) will not be published if an endorsement is given or - what is worse - in return for hard cash. The justification for this shameful practice is that the market is highly restricted, sales of newspapers bring in very little income and advertising is non-existent but the newspaper has to keep going nonetheless. This situation also explains why defamation actions are frequently settled 'out of court' by the parties to the dispute.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A profession fraught with difficulties</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another explanation for the existence of blackmail is the lack of training. The majority of journalists working for private publications come into the profession for want of something better to do, after they have finished their university courses. One experienced journalist refers to these people as mere 'hirelings'. It is only once they have entered the profession that they learn the basics through joining journalists' associations and by receiving support from some of the bilateral-cooperation missions and foundations that are operating in Benin. The country does not, itself, have any colleges of journalism to speak of. Only recently, the national daily newspaper inaugurated a course for young journalists receiving their training on the country's various publications. This course will be spread over one year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Young journalists working at the national agency, the Benin Press Agency, are trained by WANAD (the West-African National Agencies Development) centre, under the auspices of UNESCO, which is subregional in vocation. The 20 or so trainees have no clear idea of what awaits them when they finish their course - whether all, or just some of them, will be taken on full-time by the agency. Those who are not kept on at the end of their training period are likely to  swell the ranks of the 'hirelings' - who seem fated to remain at that level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new administration will have to tackle the more general question of aid to the press in order to give a fresh boost to the private sector. This has been facing a real struggle since the devaluation of the CFA franc. The effect of the devaluation was to increase the cost of all the inputs needed for publishing newspapers. A new initiative of the part of the authorities would make it possible to offer more work to journalists and to improve considerably the quality of work they produce. To quote the publisher of a private newspaper: 'The influence of money must be curbed. To do this, the state must grant genuine aid to the press so that the profession can be genuinely free and objective and thereby fulfil the important role it has to play in the consolidation of democracy'. R.L.T. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Current media in the English-speaking Caribbean</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Dr Marjan de Bruin</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author of this abridged article, who leaches et the Caribbean institute of Media and Communication (CARIMAC) at the Mona (Jamaica) Campus of the University of the West Indies, focuses on some of the peculiarities of press and media development in small island Caribbean states.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The English-speaking</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caribbean comprises thirteen independent nations that are members of Caricom (the Caribbean Community) and a few  remaining small dependent territories. The total population is about six million. In most of these countries, the majority of the population is of African descent although in Trinidad and Guyana, about half the people are of Asian (Indian) origin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sea, whose name unites the islands, is a serious barrier to communication and social interchange between them. it takes as long to go by plane from Barbados to Jamaica (1200 miles direct, but 2000 miles via Miami) as it takes to cross the Atlantic from Paris to New York (3600 miles) - and the latter journey is usually cheaper! And until fairly recently, telephone calls from neighbouring Caribbean countries without a common language were routed through London, Paris or Miami.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The distances make communications difficult. Mail can take weeks, telephone circuits are often overloaded and, in some countries, unscheduled power cuts often disrupt computer systems at the most inopportune moments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Communication and the media</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Caribbean has a strong oral tradition. This, together with poverty and an estimated general literacy rate of about 80%, makes radio the most popular medium. Recent studies show,  for instance, that 99% of Jamaican households reported having at least one radio at home. In Jamaica alone, three large national radio stations between them broadcast nine hours of prime time call-in radio.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In all Caribbean countries, alongside the mass media, 'alternative' medias play an important role in communication for social change. In some countries, the term simply connotes non mainstream operations. In others it refers to alternative formats which are found in the mainstream media. The term also represents the use of other communication behaviour - popular theatre, dance, music, oral history, story telling. It has been suggested that the increased use of alternative media and alternative uses of mainstream media are an indication of the audience's dissatisfaction with the mainstream mass media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most English-speaking Caribbean countries, the government owns some of the major mass media, especially electronic. Only recently has the private sector developed its own strongholds in radio and television. Print has always been an area of mainly private ownership. Only the larger countries have daily newspapers; morning or evening papers - although usually not more than two or three. In the smaller countries the press consists of weeklies, or bi-weeklies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government ownership</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ownership or control of media houses by governments is recognised as  a serious obstacle to true investigative journalism.The economies of all Caribbean countries are heavily dependent on tourism. Stories on environmental hazards and crises which might affect this essential source of income are subject to explicit or implicit (selfl censorship.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government ownership in some instances means policy discontinuity over time; each new regime imports its own set of administrators and sometimes even entire newsroom staffs. In other instances, where the same party has ruled for a long time, positions within the media are very stable because they are tied to political loyalty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Private ownership, however, does not mean an absence of potential pressure or political influences. In Trinidad &amp; Tobago, the country's oldest daily - The Trinidad Guardian - recently lost its Managing Director, its editor and six of its top editorial executives, after the owners - a supermarket chain - pressurised the editor to moderate criticisms of the country's new administration. The owners also tried to convince the managing director and editor to dismiss a columnist who was a disaffected and now hostile former member of the new ruling party. In apparent justification, the owners produced a document which suggested that it was the policy of the Guardian not to endanger the commercial prospects of its owners by injudicious criticism of the powers that be. Caribbean journalists attacked the Guardian ownership for what some saw as an attempt to turn a respected newspaper into the public relations arm of a commercial congLom&eacute;rate. Despite the protests, the Guardian's new editor, a veteran of forty years in journalism, argued that the proprietors had good reason to interfere with his predecessors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The region's oldest daily, The Jamaica Gleaner (established in 1834) went even further. In an editorial it said: 'In our view the owners have a right to oppose the way in which the judgment of the Editor and others is exercised. The right of the Guardian Board to query content cannot be questioned. It is impossible for a newspaper to be run   without the input of the Board of Governors.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small markets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most English-speaking Caribbean countries are relatively small in population as well as area. The number of media organizations is limited. The limited size of the market has important implications for the financial basis of the media, especially the part that is privately-owned. It limits the horizontal mobility of media workers - there are simply not that many options - and it makes the relationship between media and sources extremely vulnerable. There are not that many sources either. It also means that most Caribbean media houses have very limited resources. Many reporters have to cover a wide range of topics. Specialised reporting for instance on the environment, or health, is usually not feasible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the major problems in the Caribbean media is the high proportion of imported television programming. The region is geographically close to the United States and satellite broad  casting makes access to the Northern networks even easier. In the ten years from 1976 to 1986, the imported content of four large television stations in the region moved from an average of 78.5% to 87%. When the amount of imported content carried by the smaller stations was included, the average increased to 90% of all material televised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Privatisation and new technologies</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several of the larger Caribbean countries have seen an explosive growth in the electronic media. Jamaica, which has a population of about 2.5 million living in some 620 000 households, and per capita GDP of $1563, has seen the number of radio stations grow from three to nine and TV stations from one two, in a period of just five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trinidad &amp; Tobago, with 1.2 million inhabitants in 300 000 households, and per capita GDP of $4049, went through a similar process, with seven new radio stations and two new, privately-owned TV stations being set up over the last five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Barbados, with a population of 260000 living in about 50000 households has long supported two daily newspapers. There are also two TV stations on the island, while viewers can receive television signals from neighbouring islands. This country has the highest per capita GDP in the region ($5562) after The Bahamas ($10,308).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One positive effect of this intensive growth is certainly to be found in the increased employment opportunities for broadcasters. In the past, journalists risked their careers if they disagreed with their employers. Now people have more options. However, increased competition in a relatively small market also enlarges the risk of commercialisation and a lowering of standards. One does not need to undertake in-depth research to discover that locally-produced television is scarce and not always of the highest standard. It is cheaper to buy foreign programming than to produce original content. Some   of the graduates of the Caribbean Institute of Media and Communication, who performed above average during their training and education in print journalism, can be seen sliding down the standards scale once they enter the mass media as working journalists. Similarly, the standards of newsrooms are not always high. In fairness to the professionals, it must be said that the decline in standards is partly due to the lack of resources in editorial departments. The major newsrooms in radio and television in Jamaica, still depend on typewriters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Development of new technologies has contributed to two almost opposite movements. On the one hand, greater access to worldwide networks has widened horizons. On the other, the introduction of cable TV offers, at least in principle, the possibility for small-scale communication initiatives, such as community radio stations either for geographical communities or communities of interest (for example, people or groups interested in the environment).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Satellite dishes, VCRs and computers are breaking down traditional communication borders. In the Jamaican capital, Kingston, 28% of households have a dish and 21% a computer. The picture is very different just 20 miles away, in the neighbouring but rural parish of St Thomas, where the figures are just 1% and 2% respectively. New technologies are affordable for the happy few and are increasing the gap between the 'haves' and 'have-nots' of information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In all of these societies, computers sit uneasily in otherwise nondigital environments. The information that one works with is usually not computerised. Many records are still handwritten, with data kept on index cards. Computerisation is a costly process for which there is rarely a budget.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Once the hardware is available, it is easy to retrieve data from non Caribbean sources. At the same time, it is barely possible - at least at the moment - to tap into Caribbean data sources. There is no commercial Caribbean software. Page make-up and layout programmes, for instance, rely on  non-Caribbean electronic clip-art-images and symbols. It may simply be a matter of time before local products develop, but currently, the main constraints are to do with lack of funds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Journalism</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How is journalism faring in this environment ? The Caribbean context gives journalism a special professional profile. The small size of Caribbean societies has implications for the use of sources. Access is easier, but it also creates sharper dilemmas where loyalty is concerned: most sources are people you know personally and who know you. Anonymity is almost impossible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because the societies are so small, you will meet many of the same people in different roles on different occasions. The small scale of the market makes all enterprises in media and journalism very vulnerable to market forces: the withdrawal of one or two major advertisers would endanger the chances of survival of some media houses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The situation of the press is most marginal in the smaller countries. In Antigua (population 66000), radio and television are controlled either by the Government or by people with close links to those in power. One opposition paper, a trade union publication, has survived several legal assaults by the authorities over the years. The other, little more than a newsletter, has managed to survive into its second year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Grenada (population 91000), journalists complain about police harassment of reporters on duty, and in most of the smaller countries, journalists are uneasily aware of the continuing hostility of long-ruling political parties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The working environment of journalists in Caribbean media organisations is usually more modest compared to that of journalists in rich countries. There is less technology, smaller staffs and lower salaries. In the smaller Caribbean countries, it is not unusual for journalists to have to combine two jobs. Journalism alone cannot pay the bills.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a sharp difference between rich and poor in most developing countries. For large sections of the population, the big decisions will have nothing to do with buying a second or a third television set.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is more likely to be a simple matter of whether there is food on the table tonight. These different priorities obviously influence a journalist's agenda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In developing economies, this can create serious dilemmas for the journalists: if you know your story is likely to hurt the tourist industry - which happens to be the main national income earner of your country - will pursuing it be a waste of valuable time ? And how do you decide on the relevance of a scoop when people - some of whom are your friends - could lose their jobs ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">M.d.B.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Sources</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hilary Brown (1995): American Media Impact on Jamaican Youth: The Cultural Dependency Thesis in 'Globalization, Communications and Caribbean identity', Edited by Hopeton S. Dunn, Kingston, Jamaica, lan Randle Publishers. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aggrey Brown and Roderick Sanatan !1987). Talking With Whom ? A Report a the State of the Media in the Caribbean. Caribbean Institute of Media and Communication (Carimac), Kingston, Jamaica. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aggrey Brown (1995). Caribbean Cultures and Mass Communication Technology: Re-examining the Cultural/ Dependency Thesis, in 'Globalization, Communications and Caribbean Identity'. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Doctoring' the image</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With modern computer technology, it is now very easy for publishers (and film-makers) to dabble with reality. Whereas in the past, you could be reasonably sure that what you saw was a fair representation of what actually happened, today there is no such guarantee.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recently in the United Kingdom, one of the country's regional newspapers came in for criticism when it published a 'doctored' photograph of a well-known opposition politician. He was captured on  film at a social function sitting at a table with a glass of beer in front of him. By the time the paper's computer experts had finished with the photo, it looked as if he was drinking champagne ! When the story broke, the journal thought it expedient to issue an immediate apology. For while  this kind of misrepresentation may appear trivial, in the modern age, image is crucial for those who are involved in public life. Put simply, voters' are more likely to look kindly on beer-drinking politicians than on those whose favourite tipple is champagne.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was a similar case involving an advertisement issued by a well-known car manufacturer. For their publicity in Britain, the company used a landscape photo portraying a selection of their employees. In Poland, the same picture was used but black and Asian workers were no longer to be seen. Their places in the line-up were miraculously taken by people of Caucasian appearance. The advertisers' rather surprising explanation was that this had been a 'mistake'!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other recent victims of 'doctored' pictures or socalled 'photo collages' have included members of the European Parliament and a senior EC official, although these particular misrepresentations received very little publicity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Should consumers of printed or broadcast material be entitled to assume that images are never tampered with ? And if some doctoring is acceptable, where do you draw the line ? The answer to the first question is clearly no. There are certain situations where photo or film enhancement techniques are unobjectionable. We sometimes use them on The Courier cover pages to remove blemishes or fill in gaps which may detract from the main image. In fashion  advertising, it is common for the 'look' of the model to be altered. The aim here is to draw the reader's eye to the page so that their attention can then be focused on the product. More dramatic alterations may even be acceptable if it is evident to the reader that a change has been made. Satirical articles, for example, can sometimes be amusingly illustrated with obviously altered images.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Where the practice is reprehensible is where the picture has been changed in a way that leads the reader to draw false conclusions about what he or she is observing. The  classic example of this is where the image of a person captured in one setting is placed against a different backdrop, without the reader being informed. This may be done to give either a more positive or a more negative impression (the latter approach is more usual) but in either case, it is dishonest. If a politician allows himself to be photographed on a Caribbean beach while on mission at the taxpayers' expense, even if he was only there during the lunch break for a quick dip, then he can't really complain. But if the picture was actually taken when he was on holiday in Majorca, and superimposed against a more exotic back  ground, then both the 'victim' and the reader are being cheated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There will always be borderline cases, but in principle, it ought to be possible to draw a reasonably clear distinction between 'right' and 'wrong' in this area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nonetheless, it is likely that distorted images will continue to be presented to us in the future. In pluralist societies, newspapers and broadcasters operate in a fiercely competitive environment and in theory, this should provide a deterrent. If one media organisation is found to have doctored images in a dishonest way, there will always be plenty of others willing to expose the misbehaviour.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In practice, however, the only real deterrent is the likelihood of a drop in circulation, or lower viewing figures. And while consumers may say they disapprove of journalistic dishonesty (whether in photographs or the written word), there is little evidence to suggest that they react by taking their custom elsewhere. Indeed, in some developed countries, the closer a journal sails to the wind, the more likely it is to enjoy a high circulation!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It used to be said that 'the camera never lies'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nowadays, we can't be so certain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S.H.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Analysis</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Broadening the debate</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In issue 156 of The Courier, we announced the launch of a programme by the European Centre for Development Policy Management on the future of KU-ACP relations beyond Lom&eacute; IV. Here, we publish an abridged text supplied by the ECDPM reporting on progress.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After 20 years, the Lom&eacute; Convention is thought by some not to have lived up to expectations and now that East West rivalry is no longer an issue, many doubt its continued relevance. Questioning, as such, is no bad thing, provided it takes place in a fair and unbiased manner and is not used as a pretext to abandon the acquis  of more than 20 years of cooperation. This is the rationale behind a number of private and official initiatives to redefine KU-ACP cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Consultations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ECDPM's post-tome IV exercise has now been up and running for more than a year. Consultations have been held in more than 20 ACP countries, involving representatives from the private and non-governmental sectors, officials in the National Authorising Offices, EC delegations, regional organisations and research centres. A number of strong impressions have emerged from these interviews. In the first place, the initial comment of many NGOs and private sector representativ  was essentially 'what is in it for us ?'. This points to a lack of knowledge of the Convention in non-governmental circles and suggests that this complicated instrument is not entirely 'user-friendly'. Its government to government character was also criticised. There were calls for ACP-KU relations to be opened up to the private sector and civil society. In this context, experience with decentralised cooperation was seen as encouraging.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Second, the benefits of the Lom&eacute; trade provisions were highlighted with fears being expressed about what would happen after the year 2000. It was felt that at a time when many ACPs  are undergoing structural adjustment, and the private sector is getting its act together, a clearer European commitment in this area would benefit both sides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Various actors from the private, NGO and research communities indicated a willingness to engage in debate on redefining mutual ACP-KU interests and on the design of a new cooperation contract. Some of them had an opportunity to present their views at an ECDPM conference on the future of KU-ACP relations held on 12-14 June.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is clear that the process of reflection is now firmly under way. At the institutional level, the Joint Assembly began as far back as February 1995, when it launched an action plan to revitalise KU-ACP cooperation. This year, it asked Senator Jean-Louis Firmin of Haiti to draw up a report on the future of the Lom&eacute; Convention. It also requested the Social Partners to tackle the issue at their next annual meeting in November 1996. On the European side, the Commission will present a Green Paper later this year while the ACPs are also studying the question. Last November, the ACP Council resolved that Heads of State should meet before the end of 1997 to agree on a joint position.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Obstacles</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All this activity suggests a real awareness of what is at stake. Many obstacles have to be overcome, however, if a new type of partnership is to emerge. The main pillars of Europe's commitment to the ACP countries - aid and trade - both appear under threat. It will be necessary to redefine mutual interests - beyond the negative interdependencies - so that they can serve as a basis for a more modern and effective partnership. Greater creativity  will also be required to find new forms of EU support on ACP trade issues that are compatible with World Trade Organisation obligations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An in-depth rethink of ACP-KU cooperation will significantly benefit from inputs by actors traditionally excluded from the discussions - who are anxious to participate in redefining cooperation ties. For instance, in Namibia, NGOs called for formal consultation mechanisms for non-governmental actors. Similarly, economic operators meeting in Trinidad in November called for a new Europe-Caribbean partnership. There should also be a role for applied research conducted in ACP centres. There is already a joint research project on the future of West Africa Europe relations and similar initiatives are being formulated elsewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The plea for a debate that is open to the key ACP actors should be taken on board by decision-makers and negotiators - and thus far, they have proved receptive. However, two conditions are needed to maintain this fruitful exchange. First, ACP stakeholders need to be able to base their views on full knowledge of the facts and issues. It is essential that the Convention's authors make a major effort to provide more and better information. The ECDPM is willing to play a part in this. Initiatives already under way include the development of EUFORIC - a Forum on the Internet for specialised information on European development cooperation - and the preparation of practical guides to the Lom&eacute; Convention. Enhanced access to information can help all partners move towards a real dialogue. Second, forms and channels for dialogue. need to be devised to ensure that an open debate is sustained beyond the initial reflections taking place within the EU and ACP groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ECDPM</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Re-compromising' development aid for the future</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Jos Jonckers</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author of this article offers an academy critique of *e challenges facing the global system of development cooperation in the post-cold War era. He argues that the old compromises that have shaped development assistance since the Second World War have broken down and pleads for a radical re-think of the strategy in order to 'enable' fess affluent societies to gain from the advent of global 'free market democracy'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let us face it. International development early 50 years, the developed world has taken aid for granted. It no longer does. In real terms, it has started to give less. The expected 'peace dividend' has not materialised and scepticism is rising. Aid and solidarity are considered old-fashioned concepts. Progress and development, it is increasingly argued, must come from cooperation based on mutual interest and a businesslike approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aid scepticism is at its highest in the USA. A conservative majority in Congress promotes radical 'winner' recipes and aid has been slashed. Slowly but surely, America is getting out of the development business. Lacking domestic support, the Clinton administration seeks to 'rescue' the country's aid programme by seeking more cooperation with other donors - particularly the KU, whose solidarity horizons do not yet stop at its own borders. But even here, horizons are shrinking. European aid to its immediate neighbours in the East and the southern Mediterranean basin has risen. Happy and prosperous neighbours suddenly seem more important than distant friends in need.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Has the end of the cold war marked the beginning of a cold world - where international solidarity is being dismantled together with the nuclear warheads ? Or could we be experiencing the beginning of a fundamental reshaping of international solidarity and aid between nations?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beyond altruism - self interest</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International aid has always involved a compromise within affluent society. People and nations are not normally disposed to give something away unless they receive something in return. Any attempt at understanding and reshaping the future of development aid must therefore start from the premise that those providing development aid do so as a result of a complex and evolving compromise between altruism and self-interest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Affluent countries are usually only interested in assisting poorer ones when the effect is to strengthen their international leadership, and in some way to enhance their security and material wellbeing. Looked at in this context, we must recognise that development aid, whatever its altruistic aims, will only exist if it also serves the legitimate, albeit more selfish agenda of the donor. It also means that the compromise which gives aid its rationale in affluent society changes over time: aid is regularly 'recompromised'. In secure and prosperous times, donors are  more inclined to forego self-interest and to cooperate in the interest of less affluent countries. In times of insecurity, the altruistic dimension is likely to diminish in importance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In colonial times, systematic aid flows first emerged as a result of a compromise between expansionist Northern governments and Christian society with its own 'colonizing' clergy. Decolonisation had the effect of increasing insecurity in most former colonial powers. In an attempt to safeguard the capital they had 'invested' in their overseas territories, following the latter's independence, they increasingly shaped aid with a view to 'buying' goodwill from the new rulers. This process, which 'recompromised' aid from a colonial into a neocolonial form, resulted in the secular, institutionalised arrangement now known as 'bilateral aid'. In addition, during the Cold War, Western aid was used increasingly as a device to stop the Third World joining the Second World (the communist bloc). The result was an aid system which was both more internationalised and more politicised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The next stage came with the end of the Cold War. Communism had joined colonialism and fascism in the dustbin of history. Affluent Western society had emerged as the winner. With it came the Western vision for stability, peace and progress: a world of sovereign nations, organised on the basis of democratic and capitalist market principles and committed to respect for each other's territory and for basic human rights. Today, capitalism has become the norm in most nation states. Long-time sceptics such as India, and even convinced opponents such as China and Vietnam, have embraced it. Democracy has not yet achieved the same coverage, but it is sailing forward under favourable conditions. Political pluralism is steadily being consolidated in much of East and Central Europe, while dictatorial regimes in Africa, Asia and Latin America are now the exception.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The effect of all of this has been a speedy erosion of the terms of the compromise on which development aid thrived for so long. In a rapidly globalis  ing,multi-polar world, the old approaches appear increasingly redundant. From this perspective, the current aid crisis is not surprising and is not necesarily a bad thing. Western affluent society is essentially trying to come to terms with the demystification of its development aid, as part of a process of reshaping it for the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Three 'recompromising' strategies</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As in the past, the recompromising process is influenced by both self-interest and altruism in affluent society. Three trends can be identified.. The first, which is the most idealistic, involves restoring altruism. This approach seeks to 'purge' aid of the perverse political and economic compromises and contradictions caused by decades of neocolonial and Cold-War self-interest. It has impacted on aid in several ways. First, it has given a significant boost to humanitarian aid - the most altruistic form - at the expense of development assistance. Second, it has led to a 'decentralisation' of aid - with more assistance being channelled through organisations such as NGOs, that have an 'uncompromised' altruistic profile. Third, it has led to a 'deconstruction' of development aid along idealistic-altruistic lines. 'Women in development', 'child health', 'environment'and 'poverty alleviation' are all examples of deconstructed labels around which aid is increasingly being structured and justified. Finally, it has prompted an 'intellectualisation' of development aid with the particular purpose of tightening its altruistic aims. For example, the Logical Framework Approach, the concept of 'sustainable development', the UNDP's Human Development Index and various experiments with more 'accountable' project management systems, have all essentially been devised as ways of encapsulating and supporting the altruistic intentions that lie behind aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second recompromising strategy, which may be summed up in the expression be businesslike, approaches development cooperation  much more skeptically. Aid, it is argued, only makes sense if it leads to real progress and development - and the prevailing view is that this is not happening. The approach is fueled by the obsession of trying to measure progress with the help of business tools such as 'output', 'impact', 'efficiency', 'rates of return' and so on. This has led to burgeoning aid 'evaluation'. It has also probably contributed to the discovery of aid failures which, in turn, has prompted growing criticism of aid agencies and operators. The businesslike strategy has gained further ground because of the failure of many countries to achieve any real progress in recent decades. Its advocates argue that the compromises which undermined aid's development impact in the past are inherently linked with its altruistic nature. The conclusion is that altruistic aid will seldom or never work. The strategy has impacted on aid in a number of ways being, for example, the major cause of so-called 'aid fatigue'. It has also prompted a search for ways to enhance cooperation for mutual benefit, indeed transforming the narrow, pre Cold War trade cooperation link with developing countries into a much broader and rapidly growing economic cooperation approach. Finally, it has sought to enhance aid's impact on the economic conditions and growth prospects of developing countries through more ambitious, structural-oriented forms of aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Regionalism, the third major strategy, is linked to globalisation. Rooted in human survival psychology, this approach prompts nations in close proximity to form 'strategic' coalitions. In the post-Cold War era, development aid is one of the instruments used by affluent regions to strengthen their position in a 'globalising' environment. The strategy entails promoting 'open' regionalism elsewhere in the world and capitalising on this to create linkages and interactions which enhance their own influence or hegemony. From the point of view of the international political economy, this makes perfect sense. Having succeeded in making the 'world of nations' accept capitalism and democracy, it is through the consolidation   process of free market democracy in other countries and regions that powerful affluent nations will seek to gain maximum advantage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Need for a vision</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With this improved insight into the dynamics that have been reshaping development aid, is it now possible to go further and develop a more political vision of relations between affluent and less affluent nations in future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Free market democracy, having endured the 'crises' of decolonisation, fascism and communism, has succeeded in promoting stability and peace within and between nations. Its main strength has probably been its crucial enabling function, with an increasing number of people and nations now in a position to 'earn' a better future. It appears that the model has the capacity to generate fairly equitable growth and progress, which is presumably why more and more countries are turning to it. As is so often the case, however, the strength of the system also contains the seeds of its weakness. Conceived as an 'enabling' mechanism, it results in the categorisation of those who fail to 'be enabled' as 'unable'. Marginalised because they cannot participate and perform in the   system, the excluded (whether individuals or states) are dubbed 'losers'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are seen as a burden and a threat by the 'winners'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The result is disparity in society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experience in most affluent nations suggests that despite the enabling environment created by free market democracy, up to a quarter of the population finds itself unable to perform effectively, and is marginalised as a result. Moreover, there seems to be an upward trend in the numbers affected by unemployment, underemployment and poverty. Disparity never occurs without some cost to society, which is a good reason why it ought to be minimised. The costs come mainly in the form of internal transfers earned (but foregone) by the active, 'winning' section of society. In more sociallyinspired, free market democracies, it is accepted that marginalisation resulting from the model's shortcomings must be minimised and/or adequately compensated for. In more conservative free market democracies, exclusion is seen more as a weakness of individuals than of the system. Compensatory transfers are generally kept to a minimum to induce people to 'break out' of their situation. But while such societies may save on 'empathetic' transfers, they will generally need to spend much more of their wealth defending against threats posed by growing disparity, such as crime, drug-trafficking and political extremism.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The costs of disparity are political as well as financial. Genuine democracy is based on the participation of a representative majority of citizens. In affluent societies, however, a growing minority no longer participates. The real danger stems from the fact that this is highly skewed. It is the same, growing, marginalised minority that is 'unable' to participate which is also withdrawing from democratic involvement. The result is alienation from the political system and an erosion of democracy to the extent that its very survival may be threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What is really at stake </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Having conquered most of the world's nations, free market capitalism is now set to conquer the world of nations, helped by technological advances in communications, transport and computer technology. Economists have amply shown that the interdependence resulting from free international competition need not be detrimental. Indeed, because global capitalism ensures that ideas, initiatives and resources can be 'put to work' anywhere in the world - wherever they generate most profit - interdependence is usually seen as mutually beneficial. In essence, it confirms what might be called the global enabling effect of free-market capitalism. The basic thesis is that the adoption by less affluent nations of free market democracy should 'enable' many more of them to improve the lives of their people in the coming decades. The boost engendered by this 'enabling effect' will, in turn, help to sustain progress in the more affluent countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If this is the aim, then a new vision should progressively inspire future cooperation between the affluent and less affluent countries. The first concern should be to define 'purpose' and 'interest' much more in terms of system and process, than of output. What really matters is the 'enabling potential' of free market democracy in the specific context of the less affluent countries. How something is achieved and by whom should take precedence over what is achieved. The ultimate aim must be to ensure that free-market democracy 'takes root' in less affluent nations and is able to determine who does what and how.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A second major concern should be to maximise the 'enabling potential' of free market democracy for the most vulnerable sections of individual populations. As mentioned earlier, up to a quarter of the people in affluent societies are excluded. In poorer countries, the figure is much higher. If free market democracy fails to enable a significant proportion of this marginalised group, then it will not take root. And if the poor cannot be mobilised, the  growth that does occur will be highly skewed, leading to growing disparity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A third point is to ensure that the 'global enabling' effect of free market capitalism does not become the exclusive preserve of deregulated capital and the 'winners' who control it, leading to new forms of exploitation and disparity. The concern must be to find a way of directing the combined forces of 'capitalism without borders' and 'democracy within borders' in such a way that it leads to a genuinely better world in which the number of 'losers' is dropping and disparities are diminishing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A historic perspective</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is useful at this stage to take a look at the history of capitalism. Freemarket democracy delivered affluence to about a third of the global population over the last century mainly because of the 'accommodation' between labour and capital in an enabling environment created by 'Fordist' mass-production and consumption. A similar accommodation is now needed to enable global free market democracy to extend material wellbeing to the remaining two thirds of the (continually growing) world population, while at the same time sustaining it among the existing affluent third. It is no longer an accommodation between capitalists and workers that is required, however, but one between the affluent and the less affluent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fordism basically transformed the 'interdependent' stake of capital and labour in the economic pie, into a 'joint stake' - leading to the production of a larger pie. By analogy, what is needed today is to ensure that affluent and less affluent societies develop a joint stake in the production of a larger 'global pie' as a result of new technologies and more efficient, globalised modes of production. Attracting and sustaining capitalist investment in such modes will increasingly depend on demand and consumption structures which guarantee that poorer societies share with affluent ones the benefits of such global production systems. In the same way that a larger 'mess-produced pie' was dependent on higher and more   equitable mass consumption, so will a larger 'globally-produced pie' depend increasingly on higher and more equitable global consumption. In this context, the principal policy aim of development cooperation should be to ensure that growth resulting from globalisationis both enabling and disparity-reducing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The disabling effect of</P>
+<P ALIGN="JUSTIFY">'poor' competition</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Driven by the powerful motive of capital accumulation, globalisation has the tendency to promote competition. In principle, this should be a good thing, but left unchanneled, it can have negative effects. One might draw an analogy between the conquering of the global market and the spread of water during a flood. The water always takes the easiest route, entering the most vulnerable areas first where it causes the most damage. Likewise, globalization, fueled by 'deregulated' capital, often tends to promote competition where it is easiest, but where it is not necessarily beneficial. This is the case, for example, in less affluent countries, where poverty is exploited to achieve what might be dubbed a 'poor' competitive advantage - in the sense that it is based on disparity, but also in that, far from 'enabling', it may actually have the opposite effect. Child labour, sex tourism, environmentally destructive tourism, tropical forms logging, the export of industrial pollution and misuse of intellectual property are all examples of 'disabling' competition resulting from global disparity. In a rapidly globalising world this is ultimately damaging to all concerned, which is why both affluent and less affluent nations have an interest in reducing the gap.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All of this points to the need for a major redefinition of society's role in general and of aid in particular. During the colonial and Cold War periods, development cooperation was progressively uprooted and alienated from society. Serving an increasingly complex and non-transparent agenda, it became more and more a 'cockpit' affair, piloted by a small specialised crew - and it  found itself flying higher and higher above society. In short, affluent society lost touch with development cooperation and aid. Occasionally, the media intervened to 're-establish contact' but the result was that development aid usually only attracted mainstream public attention when things had gone terribly wrong.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turning vision into action</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If the aim is to have affluent and less affluent society working together to ensure that the latter adopts 'free market democracy'- and can adapt it in a way which benefits both - it is vital that the former be reconnected to the business of development cooperation. The affluent must be challenged to help transform their less affluent partners, in the interested and creative manner of a minority stakeholder. They must be ready to share the wealth of knowledge and experience generated in their own process of development. Representatives of all walks of affluent life should therefore be provided with greater opportunity for dialogue and cooperation with their less affluent counterparts. Increasingly easy and cheap communications and transport should facilitate this. This new form of stakeholdership will not happen, however, unless affluent society can be imbued with the new vision.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Donors should actively support the process. Instead of spending most of their time and resources determining the scope and content of development cooperation, they should step down from their cockpit. Their new role should be as brokers and facilitators of cooperation. An initial priority must be to extol the vision itself. As this gathers momentum, they should then turn to 'brokering' it in practice - acting as a catalyst between the affluent and less affluent in order to facilitate 'enabling' cooperation between them. The development of an effective brokerage profile and methodology will probably entail important changes in the way that donors work. They need to move much closer to their  constituency, and to be made democratically accountable again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As mentioned earlier, the concept of enabling cooperation concentrates on who does what, and how. Essentially, therefore, it should be seeking to mobilise democratic and free market forces in less affluent societies. The advantage of working this way is that change and progress will be determined primarily from within the society in question - with cooperation as a source of encouragement. Such an approach also entails acceptance of the fact that the pace of progrms must be left much more to the enabling forces of the maturing democracies and free markets, however weak and imperfect these may still appear. Indeed, the central purpose of cooperation should be to help these fore" become stronger. To achieve this, cooperation will need to move away from an emphasis on engineering outputs to one which involves 'messaging' the system and process. And it is not just methodologies that need to be altered; there must also be a radical change in cooperation mentality. Thus, for example, donors should attempt to broker cooperation which is 'small but smart'. Advancing 'best practice' might be another creative way to pursue cooperation which is enabling. And while some output-related decision techniques can still be used, these must be creatively reshaped to support a more 'enabling' approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In conclusion, this enabling vision entails an awareness of the imperfections of free-market democracy, combined with a conviction that it offers enormous potential for the less affluent countries of the world. 'Recompromising' development aid for the future will mean reshaping it to support a process of adoption and adaptation of free market democracy in less affluent countries which is highly 'enabling'. The result should be a system of international solidarity which is working for free-market democracy, rather than as a substitute for it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J.J.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The effects of corruption on development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Dieter Frisch</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corruption - defined as 'the abuse of public power for personal ends' - has always existed. During recent decades, however, it has grown both in terms of geographic extent and intensity. Since the mid 1970s, it has infiltrated virtually every country in the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It was hoped that the easing of political and economic restrictions that characterised the 1990s after the end of the Cold War would have gone some way to reducing this phenomenon. Through increased openness resulting from political pluralism and the freedom of the press, the process of democratisation should, under normal circumstances, mobilise efforts to overcome corruption. However, emergent democracies are still fragile and seem to find the task of tackling established self interests a formidable one.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By reducing state intervention and therefore the opportunities for corruption, economic liberalisation should improve matters. In the short term, however, the opposite would appear to be true. Weakened state structures, a lack of appropriate legislation, powerlessness on the part of the judicial system to combat corruption, the pursuit of easy money - mistakenly perceived by some as being equivalent to a market economy - all these factors together contribute to aggravating the phenomenon, at least in the transitional stages. Such a state of affairs cannot fail to have some effect on those who are involved in and concerned by development issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Needless to say, corruption and its effects can be seen from a multitude of viewpoints. There is always the ethical angle - but how can we possibly presume to preach to countries of the South and East when bribery is just as rife in the North and when, as far as corruption within international economic relations is concerned, it is in fact, virtually by definition, the North who is the corrupter and the South and East who are the corrupted ? The only possible reply to such an argument - and one which is morally disputable even though economically valid - would be that the rich North can afford the luxury of wasting some of its wealth whereas in the case of developing countries, their sparse financial resources need to be used in the best way possible! Other lines of reasoning emphasise the distortions that corruption causes in the fair application of conditions of competition by penalising successful, yet honest, undertakings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A major obstacle in the path of development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In my opinion, corruption should be approached from the point of view of the effects it has on development. I say this because long professional experience has taught me that corruption is one of the major obstacles to progress, and that its effects on development are disastrous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some people would no doubt counter this assertion with the 'cultural' argument whereby they would have us believe that, in certain cultures, corruption is quite normal and morally acceptable. Well I do not know of a single place on earth where growing rich through taking bribes is considered lawful or morally acceptable! I should like to quote Olusegun Obansanjo,  former President of Nigeria, on the subject: 'In the African concept of appreciation and hospitality, a gift is a token. It is not demanded. The value is in the spirit of the giving, not the material worth. The gift is made in the open for all to see, never in secret. Where the gift is excessive, it becomes an embarrassment, and is returned. If anything, corruption has perverted the positive aspects of this age-old tradition'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Then there are the cynics - including renowned professors - who claim that corruption oils the wheels of progress and enables development to take place. In this respect again, and putting all ethical aspects aside, it would be worthwhile distinguishing between the small baksheesh which 'helps' certain administrative procedures along ('acceleration fees') and large-scale corruption which perverts the course of de  velopment. This does not of course mean that we should underestimate the destructive effects that even small-scale corruption can have on society!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet others have simply resigned themselves to the situation. For them, corruption is intrinsically linked to underdevelopment. As long as a person's normal income does not provide him with a decent living, the door will always be open to bribes. It is, therefore, through development that we should be attempting to eradicate corruption. Yet this argument is reminiscent of the debate on the population explosion. It is only through development, some say, that the problems of population growth will be resolved. But by then, the planet will be inexorably overpopulated! In my opinion, the same argument is just as valid as far as corruption is concerned. We simply cannot wait for it to be stamped out through development. (In any case, development is hardly a miracle cure: true, we have the examples of Singapore and Hong Kong where corruption is extremely uncommon, but we could also mention Italy, where it was precisely at the height of the country's development that corruption became the norm). We must act therefore, and without delay, focusing our efforts on eradicating large-scale corruption.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If we analyse some of the effects that corruption has on development, the first thing we notice is that it increases the cost of goods and services, and not insignificantly either. Although a 5% reduction in the profit margin might, at a pinch, be absorbed by the supplier, corruption levels of 10% to 20%, which have become commonplace, will inevitably be reflected in the price and will, consequently, be paid for through the national or foreign (in the case of foreign aid) resources of a country. It is therefore the national economy that ultimately suffers the consequences of an unjustified surcharge on the goods or services, with the difference being pocketed by some government official or politician who has abused his power for his own personal gain. Given that such operations are generally financed by bank  loans or, in the case of foreign aid, by concessional loans, these surcharges inevitably bring about a proportionate increase in that country's debts. In fact it is now assumed that the exchange value of sums paid out in backhanders makes up a considerable proportion of the foreign debts of developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, the damaging effects of such practices do not stop there. The corrupt decision-maker may well be tempted to accept a substandard quality of service which will make his personal profit all the greater. Thus, with a road building project for example, complicity between government departments and contractors may result in corner-cutting with regard to agreed standards of quality so that the savings made may be shared out between the two parties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At their very worst, the disastrous effects of corruption mean that the conception of a project, and ultimately its very choice, are determined by corruption. As far as conception is concerned, a good example would be the purchase of a technology which is wholly unsuited to the particular needs of a country or the choice of a capital intensive project - more lucrative in terms of corruption - rather than a labour-intensive one which would nevertheless be far more beneficial to that nation's development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The absolute peak of perversion, however, is when the very choice of priorities - and therefore of projects - is determined by corruption. What we are referring to here are those situations in which the real development priorities of a country are neglected in favour of operations which generate the greatest personal gain for the decision-makers. At this point I would like to quote R&eacute;mi Godeau, writing in Jeune Afrique: 'These currency-guzzling abortive projects have become a graveyard of white elephants. Africa is littered with vast deserted motorways which are being eroded by the Savannah, with fully functional but empty factories which have been left to fall into ruin only a few years after they were opened, with railway lines which are now impassable  through a lack of maintenance, and with hydroelectric dams abandoned because they cost too much to run'. Let us pick up on the point about empty factories. These 'follies of development' are to be found in many developing countries and in Africa in particular. Some have never produced, others have failed to reach full production capacity while others still face such prohibitive costs that big state subsidies are needed to keep them going. If we follow the thread right back to the beginning we find, more often than not, that factories have been sold without ensuring real competition between suppliers. Admittedly, such projects usually have only private-sector backing (they are rarely financed through official aid), but the funding is nonetheless backed by state-controlled bodies. The existence of corruption in such cases must be more than mere presumption - what other reason could there be for making decisions which run so counter to the interests of development ? In his work 'Grand Corruption in Third World Development', George Moody-Stuart identified those areas which are especially vulnerable to corruption. These are most notably, the procurement of military and other   technically sophisticated equipment, and large-scale works (in other words, any major, capital-intensive project and any scheme where objective valuation and comparison is hampered because of the technical sophistication involved).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is worthwhile mentioning at this point that a country which borrows money to finance projects that do not satisfy its real needs, and which may indeed be considered economically futile or absurd, will see its debt burden increase - and not simply by the 10% to 20% that is used to fund 'backhanders'. The loss will ultimately be 100% if one views it in terms of the cost of the unproductive investment to the national economy. Discussions about the debts of developing countries rarely focus on the mechanisms which have produced these debts. Yet in most cases, they have become unserviceable on account of the ineffective use of overseas aid - the sort of bad management to which corruption contributes considerably.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What is more, by deflecting the sparse resources which do exist towards non-priority or low-priority areas, corruption contributes to a large extent to ensuring that fundamental needs such as food, health and education, are not met. It is therefore one of the causes of under development and of poverty in general. Needless to say, official aid is often called upon to make good the deficit left by the irresponsible management of otherwise available resources. Is it any surprise if, in the long run, public opinion in the countries of the North begins to grow weary of bridging gaps which efficient management of resources should never have allowed to appear in the first place ? How are we to convince European taxpayers that it is they who need to provide the money to fund bush clinics in countries which put their funds in prestige projects, if not directly into Swiss bank accounts?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A vicious circle that must be broken</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Effectively, we find ourselves in a 'catch-22'situation. Corruption is one of the causes of under development and poverty, yet poverty is in part responsible for its continuation. If a person cannot earn an honest living for himself and his family, then he is more or less forced into earning it by less honest means. Hence corruption is both the cause and the consequence of under development. In order to break the pattern we must therefore combat large-scale corruption inasmuch as it is a significant cause of underdevelopment and we must work gradually to eradicate the reasons for its propagation in society, and in particular to remedy the notorious lack of adequate income to ensure a decent standard of living.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In general terms, we can say that corruption also kills off the spirit of development. Nothing is more destructive to a society than the pursuit of 'a fast and easy buck' which makes honest people who work hard appear naive or foolish. That is why, in the context of economic reforms under the heading of 'structural adjustment', it is vital that the model advocated be one of a market economy based on a sound framework of legislation and on an efficient state. It should not allow free rein to the sort of ruthless capitalism which is aimed at immediate profit at all costs. The example of certain transition countries in the East, where a market economy has become synonymous with the law of the jungle, the Mafia and corruption, really should make us stop and think.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the final analysis, an economy undermined by corruption has the effect of discouraging potential foreign investors and public donors. Yet if development is to succeed, countries have to be able to attract a flow of capital. As Serge Michailof put it: 'Success attracts money. Waste, failure and chaos drive it away'. And although investors are very keen to do business, with the exception of a few opportunists, they all look for host countries that have a stable and predictable climate. Entrepreneurs have been known to withdraw from certain African countries - which are nevertheless rich in resources - because of the constraints imposed on them by corruption on a scale which they considered to be unacceptable. As for public donors, they are increasingly reluctant to offer financial aid to those countries that manage their own resources poorly. It is precisely this failing which is one of the causes of what we now refer to as 'aid fatigue'. Financial aid institutions should go as far as suspending their cooperation in blatant cases of corruption and bad management, just as they do in cases of serious violation of human rights. Conversely, 'good governance' should be the determining factor when allocating aid, and it would appear that Article 5 of the revised Lom&eacute; IV Convention does in fact foresee such an approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In conclusion, far from reserving the foregoing criticisms for countries of the South, I believe that the partners of the North have their part to play in the ravages wrought by corruption, be it only as a result of the inconsistencies between their development cooperation policies and their export promotion policies. Basing our assumptions on the principle that cooperation efforts are genuinely motivated by concerns for development - and I can attest that this is precisely the motivation behind the policies of the European Union, which I have served for a great many years - we should not forget that Western countries have a tendency to promote exports, by other means, without any consideration for the effects this has in terms of development. They thus contribute to the dishonest practices which we have been discussing. The fact that they tolerate, or even go as far as to encourage corruption as a means of promoting exports - restricting the application of the criminal law to acts committed on their own territory and allowing corruption to be taxdeductible under the heading of 'necessary expenses' - seems to me to be absolutely scandalous. In the AlortR too, the battle against the canker of international corruption is a formidable one. But it is a fight to which we are committed in the context of 'Transparency International' This NGO, which was created in 1993, makes its services available to any country which genuinely wishes to eradicate the scourge of corruption. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> D.F. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Close-up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">National park  restoration in Chad: luxury or necessity ?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Phllippe Dejace</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Terms like 'democracy' and 'sustainable development' are increasingly used to keep donors happy, and to present new development projects in the most favourable possible light. With this in mind, it is interesting to look at an example from 'the field' to see how genuine the commitment actually is. Adherence to these concepts has undoubtedly made a positive contribution to environmental protection, but there is also a negative side</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since 1989, the Zakouma National Park in south-east Chad has been undergoing restoration in a   programme supported by the KU. Devastated by a decade of conflict, this wildlife sanctuary of nearly 3000 square kiLom&eacute;tres was little more than a huge graveyard in 1986 when Pierre Pfeffer of the Paris Natural History Museum visited it and decided to campaign for its restoration. Today, this is recognised to have been a sensible decision. It is acknowledged that wildlife are better off when they have a reasonably large area in which to live, away from human activity. Aerial counts made in 1986, 1991 and 1995 confirm that animal numbers are on the increase in the park and that irreversible destruction has been averted. Currently, Zakouma is the only area effectively being protected in Chad. The other designated sites (one park and seven reservations) remain impoverished and in a state of near devastation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recognising the challenge</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One should not be lulled into complacency. Even when a process involving local village communities is initiated, the low standard of living of the inhabitants, their educational level, and the progressive deterioration of vegetation around protected areas in  variably make the latter a tempting 'target'. In these circumstances, it is very hard to preserve their integrity. At Zakouma, a busy time lies ahead. The local people must be educated and informed as quickly as possible. This presents us with the first hurdle given the inadequacy of the education sector. The Ministry of Education is underfunded and with growing numbers of pupils in the system, it is virtually impossible to plan special programmes aimed at increasing awareness of this particular problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are other reasons why there should be short-term investment in this sector. There are good arguments for preserving a few control sites while the awareness programme is under way, since these will one day serve to illustrate what can be achieved. It is also much less difficult to preserve an area than to try to reconstitute it, once desertification has set in. The site is part of the national heritage whose value can only increase. Moreover, in most cases, the protected areas ensure the survival of fish stocks in lakes and rivers downstream and act as a reservoir for game: many of the animals which breed there provide food for the people living at the zone's edges. Even frequent wholesale slaughter of wildlife, as happens during a war, is reversible if the vegetation remains intact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the park is cut off from human activity (the area is flooded and therefore closed, to all intents and purpose, for four months of the year), it has an uncertain future. It faces pressure  from itinerant herdsmen and poachers, the latter tracking giraffe right up to the outskirts of Zakouma village, which is in the middle of the park. Although located in a wildlife reserve of 20 000 km2 - which is supposed to be a buffer zone - the park is not truly protected because human activity inside the reserve is not controlled. In the dry season, the park teems with wildlife. A clear density gradient has been identified with the animal population dropping as you move from the centre to the periphery. Indeed, only about a third of the 3000 km2 is intensively exploited by the wildlife which lives there - and even this area is relatively insecure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enclosure would give those who are keen to defend the park a grace period in which to set up long-term awareness strategies. Ironically, one danger results from the striking democratisation that has taken place in Chad. To win votes, some politicians have called for the bans applying to the park to be lifted. This approach has the potential to succeed because, owing to shortfalls in the education system, the electorate is insufficiently mature in political terms. Another factor is that traditional leaders, seeing their power progressively diminish, are inclined to 'revolt'. Thus, they may fail to intervene when stockmen deliberately invade the park, encouraged by demagogues in search of votes. When the grasslands are invaded by cattle, few wild animals can compete and they are forced to retreat to the central area of the park. Against this background of a need for urgent action, the Zakouma Park team is concentrating its awareness-raising efforts on traditional leaders and the administrative authorities - rather than on teaching schoolchildren about environmental protection (although such a campaign is also envisaged).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Participation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some argue that setting up a 'sustainable and participation-based development' strategy would make it possible to avoid the situation that now exists in Zakouma. The idea behind such a strategy - which clearly has its   attractions - is that man is perfectly capable of managing his native territory. All that is needed is for him to be granted land and to receive support for his initiatives. Many who espouse this approach continue to despatch teams to demonstrate that this is the ideal response. Unfortunately, in the particularly complicated case of managing the environment on the fringes of a national park, the local people are usually reluctant to make the investment. The more normal inclination is to reap a short-term profit from resources that are within reach. The inhabitants are also tired of the lectures they get from specialists who visit for just a few hours. The scope of the problem is such that expertise needs to be available on an ongoing basis. Considerable resources are also needed to ensure.that the effort is sustained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is not easy to halt environmental destruction in a market economy which has overturned traditional values and gives priority to increasing personal wealth and consumption. A natural environment's potential for exploitation is always limited. Yet stock-rearing involves the use of animals 'selected' over thousands of years to take maximum advantage of the least scrap of vegetation. By contrast, a wild animal is much more selective and never ruins the environment it exploits. It may even be able to adapt its reproductive cycle to the available food resources! We are nowhere near this situation in domestic stockbreeding!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is where 'sustainable development', which sounds highly reassuring, appears at odds with reality. Beyond a certain threshold, one cannot avoid depleting the resource. If one is to adopt an approach that involves the population actively, one must acknowledge that their response may fall short of what is needed. Indeed, they may do things which provoke migration, and are thus damaging. Thus, for example, the opening-up of a water source may attract more nomadic herdsman, thereby undermining rather than enhancing the surrounding area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Awareness programme</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The single most significant step towards protecting the park would be to ease population pressure, but progress in this area is very limited. We can only wait for the birthrate to decrease; something which invariably happens as a country develops. But what will become of the national parks in the meantime ? In Zakouma, an eco-development team is currently listening to the villagers' claims. As elsewhere, an attempt is being made to gain time. Unfortunately, the current climate of transparency in Chad, which is one of the positive aspects of democratisation and should be a major asset, has not had much impact in this area. The awareness programme suffers from a serious lack of trained workers and when meetings are held, they usually turn into interminable discussions, simply increasing the level of frustration. On the other hand, a convincing discussion-leader can advance matters considerably and discussion is surely the right approach to adopt. Furthermore, the process must lead to concrete results. Otherwise, decisions taken may end up being postponed indefinitely because they conflict with the interests of political decision-makers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the difficulties, the Zakouma team is placing heavy reliance on this desire for transparency. Although the project's initial aims have essentially been to restore infrastructures and thereby promote an increase in wildlife, the addition of an ecodevelopment aspect and ecological monitoring has made it possible to create an important 'reservoir' of knowledge. A computerized map of the vegetation has been produced with the help of a microlight equipped with a GPS (satellite positioning) system. There have also been aerial inventories tracking the seasonal density and distribution of wildlife, as well as in-depth sociological surveys in the villages most hostile to the park's existence. This major database makes it possible to organise meetings, conferences and discussions to demonstrate that the park's contribution is greater than it seems. One big frustration for local people living on the  park's fringes concerns the redistribution of the income it generates. Looking first at tourism, Chad hardly qualifies as a major holiday destination and those who do visit the park are too few to make a significant contribution (the income raised barely covers the cost of replacing their bedlinen !)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One interesting conclusion has been drawn from studies of the animal distribution in the different seasons. It appears that when pressure from nomadic herdsman is at its strongest, during the dry season, the wildlife take refuge in the park and numbers multiply in safety. When the stockmen return northward, the wild animals then go beyond the park boundaries where they are hunted and eaten by villagers. This is surely a form of income redistribution! Moreover, many young fish in the park's only river (the bahr Salamat), take advantage of the flooding of the area during the rains. This releases huge volumes of nutrients back into the ecosystem. In the park, the fish are safe from the fishermen who work downstream and they can swim back to their spawning grounds. This guarantees the renewal of stocks depleted during the dry season. The level of fish stocks in Lake Iro - and probably in the River Chari as well - is thus linked to the existence of the Zakouma Park! When this version of income redistribution is explained, it often helps to convince traditional leaders who then use their influence to limit incursions by stockmen or poachers. However, a lot remains to be done because demographic pressure and standards of living both make it more difficult to get the message across.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We know that excessive human activity always results in environmental deterioration. Zakouma, although under pressure, has been 'spared' to some extent, and as such, it represents an important resource. But some see it as a luxury and it faces a suspended death sentence. If people stop regarding its conservation as something that is necessary, the sentence will end up being carried out. In my opinion, the most reliable way of guaranteeing its preservation would be to enclose it completely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P.H.D. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Developing World</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">European NGOs look ahead at annual meeting in Brussels</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Agostino Ambrogetti</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 22nd annual General Assembly of European Development Non-Governmental Organisations (NGOs), and a thematic conference entitled 'A Europe open to the world', were held in Brussels from 18 - 20 April. Representatives of more than 800 NGOs attended, with the Assembly adopting 14 resolutions as well as issuing specific appeals on the European Union's Intergovernmental Conference (IGC) and on Lebanon. The Assembly renewed its approval of the development NGOs' 'Strategic Priorities', adopted the Work Plan for the 1996-98 period, and looked at the overall impact of the Lom&eacute; Convention with an eye to likely future developments. The subsequent Conference focused, among other things, on the issue of coherence between the EU's development cooperation and its other policies (notably trade and agriculture). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A general impression that emerged from the two events was that the NGO movement was attaching increasing importance to its role as advocate for the developing countries. A fundamental aspect of this is the ongoing dialogue that NGOs have with the European institutions, and the lobbying they carry out on policy issues. Commission representatives who spoke at the Assembly indicated their understanding and appreciation of this. For example, Development Commissioner, Jao de Deus Pinheiro, referred warmly to 'the very active role played by the NGO community in the debate on the mid-term revision of the Lom&eacute; Convention,' and acknowledged that the NGOs had mounted an 'important political lobby' in favour of increased funding for the next five-year period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commissioner was keen to emphasise the complementarily that existed between the European Commission and the NGO movement in support of emerging societies in the South. He also urged his audience to continue in their task of challenging the general apathy towards development cooperation. This, he said, entailed appealing directly to public opinion in order to influence political leaders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A similar tone was adopted by Bernard Ryelandt, who heads the unit responsible for cofinancing NGO projects in the Commission's development directorate-general (DG VIII) He spoke of the 'decisive' action of European NGOs in balancing other lobbies such as the agricultural one. This, he believed, had the effect of improving the coherence of EU policies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Delegates from a number of countries set out their views on the advocacy issue, and what they saw as the growing NGO role in this area. Andy Rutherford from the United Kingdom said that he saw increased lobbying as necessary, complementing the work carried out in the field through development projects. He pointed out that Southern NGOs had themselves requested their Northern partners to pressurise European governments in the hope that the latter would adopt external policies more favourable to the developing world. Mr Rutherford also raised the thorny question of structural adjustment. The view that adjustment policies were not succeeding in eradicating poverty, had, he said, been acknowledged by the EU's Development Council in its resolution adopted in June 1995. With this in mind, the NGOs would be raising the issue with the World Bank and the IMF - where the EU Member States are among the most substantial contributors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guido Barbera, who headed the Italian delegation to the Assembly, took up this point, calling for more pressure to be exerted on the Bretton Woods institutions by European NGOs and indeed, by the European Commission itself. This was necessary, he believed, to promote coherent macroeconomic policies favouring the development of economic relationships with the less-developed countries. In more general terms, Mr Barbera applauded the growing NGO participation in the political arena, stating that this was both 'positive' and fundamental'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Evaluation of the Liaison</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Committee's work</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A document was presented to the Conference by the NGDO-EU Liaison Committee containing an evaluation of its activities. The aim, in drawing up the document, was to 'review and critically assess the work and organization of the Committee, and evaluate whether it meets the expectations of its stake holders.' In order to do this, NGO members were consulted through questionnaires.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The evaluation revealed that support for the Liaison Committee as the representative umbrella organization of European NGOs remains strong, although there is widespread uncertainty about the future. This is reflected in the perception that the Committee has   gradually been losing momentum. There were also some doubts expressed about its representativeness. Large NGOs, it was noted, were able to spread their efforts across different networks. The fact that small NGOs tended not to be involved in the Committee emerged as one of the critical issues for discussion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Attention was also focused on the alleged weakness of many national platforms (the documents containing proposals drawn up by the various national NGO assemblies) in representing the aspirations of their member organizations. This issue, and the question of voting on resolutions without debating the documents in question gave rise to controversy. Some delegates boycotted the vote while others submitted a written protest and there is clearly some demand for reforms designed to make the Assembly's procedures more democratic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General conditions of cm  financing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another highly topical subject on the Assembly's agenda was the proposed revision of the General Conditions for the Co-financing of NGO </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Projects in Developing Countries. Commission speakers who touched on this subject included Professor Pinheiro and Jacob Houtman who is a Director in DG VIII Both referred to the revision process that was currently under way, and emphasised the higher priority that would be attached to capacity building for Southern NGOs. This involves providing support to strengthen the organisational structure of the bodies in question, and to improve the skills of their staff in managing and implementing projects. Such an approach is now recognised as essential for the long-term sustainability of NGO activities. As Mr Houtman was keen to stress, the principles underpinning the KU-NGO relationship (recognition of NGO independence and specificity, freedom of initiative for European NGOs in cooperation with their Southern partners) would be safeguarded in the revised conditions. Other priorities to be set out in the conditions would include the promotion </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Notice at the site of a non governmental organisation in</P>
+<P ALIGN="JUSTIFY">Zimbabwe devoted to improving agricultural productivity</P>
+<P ALIGN="JUSTIFY">'Crucial to provide more institutional support for Southem</P>
+<P ALIGN="JUSTIFY">NGOs' of democracy and human rights through reinforced structures of civil society, and a greater emphasis on the fight against poverty, income-generating activities and social development programmes. With these objectives in mind, it was all the more crucial to provide more institutional support for Southern NGOs. They, unlike their Northern partners, had a permanent presence in society in the developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The revised general conditions would also reflect the new orientation which favours a long-term programme approach over the traditional project by-project method. This should lead to a reduced administrative burden, and benefit long-standing NGO partners who have demonstrated viable approaches in working with their Southern counterparts, as well as good management and accountability.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'A Europe open to the world'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Conference which took place following the NGO General Assembly focused on assessing the coherence of different EU policies and on ways of achieving coherence where it might be lacking. As the title of the Conference suggests, the question which was never far from participants' minds was 'what sort of Europe is being created.' Is it a Europe which stands in solidarity with the South (and East), or is it one which retreats into its fortress, concerned only with its own prosperity ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the outset, EU policy - or rather its mode of implementation - came in for criticism. It was claimed, on the bask of the experience of both European and Southern NGOs, that the principles of development cooperation set out in the Maastricht Treaty (Title XVII) were not being applied universally and consistently. These principles include the sustainable economic and social development of developing countries, their integration into the world economy, the fight against poverty, and the development and consolidation of democracy, human rights and the rule of law.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this connection, three specific discussion topics were selected: the EU's common foreign and security policy (CFSP), its common commercial and agriculture policies (CCP and CAP) and its immigration and asylum policy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Regarding the first of these, it was suggested that the EU's definition of 'security' tended to be viewed solely in terms of common defence, and that the concept of 'human security' drawn up by the UNDP had been neglected. The latter seeks to define the concept on a broader basis including aspects such as equitable and sustainable development, as well as human rights and democracy. The view was also expressed that a more firm and coordinated CFSP was needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the second topic - trade and agriculture - there was a strong feeling that the policies of the EU (and the USA) were heavily weighted in favour of 'home' producers and that this had the effect of undermining local production and food security in the</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Developing countries. The Union was urged to remove the policy 'contradictions' that allowed this situation to arise bearing in mind the specificity and sensitivity of the food trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, several speakers were highly critical of what they viewed as negative trends in the approach to immigration and asylum adopted by the EU and its Member States, with increasingly strict rules being implemented. There were also calls for measures designed to integrate resident migrants into society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indeed, integration may well be seen as the key message to have emerged from the NGOs' gathering. The call was for the people and governments of the European Union, acting in the Intergovernmental Conference (IGC), to integrate the needs of the rest of the world's people into their actions and programmes. The talk was of common values of human rights and solidarity, in both internal and external polices. And it was clear from the commitment of those who attended that the NGOs are determined to maintain and strengthen their role - as active partners in the development of the South, as advocates for the developing countries and perhaps indeed as keepers of the European conscience.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.A.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Workshops</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As part of the proceedings of the NGO General Assembly, three workshops were organised dealing with specific themes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Workshop 1 was entitled Beyond Lom&eacute; IV. There was a general consensus among those taking part that the Convention's underlying philosophy helped to protect developing countries in today's global commercial environment. Without the Lom&eacute; system, it was felt that the ACP countries would have suffered even more from the deterioration in their terms of trade. With this in mind, the World Trade Organisation came in for criticism for its stance against regional preferential agreements (even if this does not apply to the least developed countries).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The major finding of Workshop 2, which dealt with Poverty in the North and the South, was that  poverty is the result of interactions at a global level - and is not 'nation specific'. It was therefore important to adopt a global approach in  seeking to tackle the causes of poverty, and to develop further North-South exchanges of experience for the benefit of both sides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The third workshop was devoted to making the most of EU Presidencies. Here, the aim was to evaluate past experience of lobbying undertaken by the NGO community in those countries holding the EC Council Presidency, during the six-month period in question. The main recommendation to emerge was that more needed to be done in establishing contacts and exchanging information between the relevant national NGO communities. Such exchanges, it was felt, were needed before, during and after the six month Presidency period, in order to facilitate continuity of lobbying on key themes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Resolutions </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Resolutions adopted by the NGO General Assembly, considerable emphasis was placed on human rights</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> issues, with texts being agreed on Nigeria, the peoples of the Western</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sahara and the child sex 'industry'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade (in the widest sense of the word) also featured prominently. In addition to a general resolution on world trade, representatives passed motions on the arms trade, traffic in landmines and the production of the drug coca.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Also adopted were resolutions on preventive diplomacy, cooperation with Cuba, the Euro-Mediterranean partnership and the 'deterioration' of the situation in the Great Lakes region of Africa. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Africans seek bigger share of tourist dollar</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Godfrey Karoro</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe's government is under pressure to encourage greater African involvement in the predominantly white-run tourism industry, which is facing intense competition from neighbouring South Africa. 'Black participation in all sectors of tourism is a priority,' says Environment and Tourism Minister Chen Chimutengwende. 'Blacks have waited in the wings long enough,' he adds, 'and their entry on to centre stage is inevitable. The solution lies in nurturing black entrepreneurship and giving it the material and technical backup to ensure its growth.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Only 38 of the country's 436 tour operators are indigenous, and most focus on provision of goods and services, particularly transport. African interest in the business was kindled last year when the government identified tourism as one of the sectors which could benefit from an international $74 million credit facility. This prompted enquiries from  about 500 potential entrepreneurs. Interest was heightened during the election campaign earlier this year, when President Mugabe's government made an issue of the continuing economic domination of the white community which constitutes  less than 1% of the country's 11 million population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Chimutengwende pledged support for greater black participation, but the government itself is under fire for not doing enough. 'We have a time-bomb and the government should do something about it quickly before it explodes,' says Colin Blythe-Wood, managing director of a tour company and chairman of the Zimbabwe Association of Tour and Safari Operators (ZATSO), referring to the black-white imbalance in the whole economy. 'We are indeed fortunate that this industry, which has perhaps the greatest potential in our economy, is still in its infancy,' he says. He argues that the government holds the trump card, through its ownership of vast tracts of land in national parks, forests and communal areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A 1994 Zatso report identified more than 100 sites on state-owned land suitable for development by African tourism ventures. At least half, says Mr Blythe-Wood, were in areas of abundant wildlife, including the 'big five' - elephant, lion, rhinoceros, hippopotamus and buffalo. Other opportunities could be provided he suggests, if the National Park service got out of the accommodation business and concentrated on flora and fauna conservation. 'The government cannot be a referee and a player at the same time. It should sell off its shares in the Rainbow Tourism Group' - a wholly-owned government company which is the third largest operator in the tourism sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the industry's problems is that South Africa, too, has found tourism to be an unexpectedly good economic performer. Arrivals there rose by 50% in 1995, and a new government discussion document suggests that tourism could double its foreign exchange earnings by the year 2000 and triple its contribution to national income. South Africa's parks and beaches are well developed, but entrepreneurs are also fostering attractions such as Boer War battle sites and 'Road to Freedom' tours in which visitors have breakfast with former freedom fighters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fear is that South Africa will be the regional hub for visitors, siphonino off  most of the earnings, with</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zimbabwe merely getting the overspill from short side-trips.</P>
+<P ALIGN="JUSTIFY">Zatso chief executive, Elias Nyakuni, points out that South</P>
+<P ALIGN="JUSTIFY">Africa is already using Zimbabwe's top attraction to lure visitors, urging them 'to come to South Africa to see the</P>
+<P ALIGN="JUSTIFY">Victoria Falls'! Efficient train, luxury bus and air services connect several South African cities to the Falls, which are on the Zimbabwe-Zambia border. Mr Nyakuni says that Zimbabwe  could also lose out if things go wrong in their southern neighbour. 'Violence in South Africa could deter people from coming to Zimbabwe.' He accuses the government of not taking marketing in Europe and North America sufficiently seriously. 'The 4-5% annual growth is, in essence, through word of mouth. We need to investt more in marketing.' He says that the Zimbabwe Council for Tourism is underfunded and that it operates 'without brochures or pamphlets.' Neverthelms,  with 1.25 million visitors last year spending $252m (up from 1.04m spending $203m in 1994) - tourism is a growth area in which black people could take a bigger share - and not just, as at present, as guides, drivers, mechanics and cooks.</P>
+<P ALIGN="JUSTIFY">Lovemore Chihota, who runs a booming Victoria Falls safari business, has shown the way. He admits that there is a lot of money to be made from tourism, but warns that careful preparation is needed, as well as determination, commitment and, a realisation that there are no quick returns. He also points to the need to have some equity. 'The promoter,' he stresses, 'must put his money where his mouth is.'</P>
+<P ALIGN="JUSTIFY"> G.K.</P>
+<P ALIGN="JUSTIFY"> </P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Culture and society</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Dak'Art 96</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most important exhibitions of African art, the Biennial Festival of Conternporary African Art, opened its doors to the public in Dakar, Senegal, on 8 May 1996. The 'Pan-African Art Exhibition', as it is still called, was being staged for the third time although it almost failed to take place at all, having been postponed several times over the last four years. All those who participated - from the artists who exhibited to the directors of art galleries and cultural  institions - were pleasantly surprised. The next edition of me Courier will include a more comprehensive account of the exhibition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">President Abdou Diouf of Senegal inaugurated the event at the Daniel Sorano National Theatre in the company of a number of VlPs, including BartoLom&eacute; Amat Armengol who represented the European Commission. The Commission was Dak'Art 96's main financial partner providing support to the tune of CFAF 200 million (ECU 300 000 approx). The Biennial Festival aims to be a showcase for African artists allowing them to break into the international plastic arts market. Hitherto, this has remained relatively closed to them despite the general recognition that Africa has a contribution to make to the art world in this area. Mr Ousmane Sow Huchard, chairman of the Festival's scientific board, stressed that success lay first in stimulating the art market in Africa itself. He gave the example of his own country which had voted the so-called '1 % law', which stipulated the proportion of works of art that should be used to decorate all new public buildings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Festival's main exhibition, at the Ifan Museum of African Arts, was devoted to major trends in African sculpture. 42 artists selected by an international panel took part and, despite some criticism, their choice was a  judicious one. The same cannot be said, unfortunately, of the second major exhibition, at the National Art Gallery. This was devoted to contemporary Senegalese art and the skill involved in producing the exhibits was not of a consistently high standard.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were also five individual exhibitions featuring artists chosen by internationally famous judges. These might be expected to have a dynamic effect in setting standards on the market. Zeribun Yempeta of Ethiopia offered a quite original style, working on a support of leather straps fastened to a trellis of fine strips of wood. He draws his inspiration from a combination of African design, Coptic and Greek influences, and ancient Egyptian art. Ethiopian painting was one of the major revelations of the 'Africa 95' exhibition in London last year and the Festival gave a further opportunity for such art to be displayed. Another display presented work by the Moroccan painter, Mohamed Kacimi, whose pictures have been hung in various exhibitions - although the term 'pictures' is not always appropriate to this artist's work. It is perhaps more fitting to say that he 'occupies space'. In Dakar, he covered three walls of a large room with 'rolling art'. His skill, particularly in monumental works, is to offer excitement and calm simultaneously, through the use of animated forms and soft, rhythmic harmonies. Ezrom Legae of South Africa, Moustapha Dime of Senegal and Pascale Martine Tayou of Cameroon were the three other artists granted individual exhibitions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the trends which came to the fore at Dak'Art was the use of alternative media and recycled material. The latter, in a sense, is the man in the street's legacy to art. Initially, recycling was used predominantly in the informal sector to produce utilitarian objects. The 'Biennial Festival Village' was set aside for informal sculptors, and in an open area beside the Village, both inside a marquee and outdoors, one of the most individually striking exhibitions was presented. This combined a variety of artistic forms ranging from painting to video, not to mention Adeagbo's unusual montages, including 'African artists and AIDS'. This had already been exhibited in a number of countries and was staged by the Revue Noire team in parallel with its 'AIDS' issue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Festival included dozens of on-site exhibitions as well as all the 'fringe' presentations. The AIDS exhibition was one of the boldest but the display entitled 'Love' offered the greatest degree of unity and uniformity of design. Dak'Art 96 also made an attempt to integrate other forms of creativity such as dance, design and fashion. The latter two, for example, were presented at the Espace Vema, a fine metal structure where the creations of the Senegalese designer Claire Kane were in perfect harmony with the highly original furnishings. The European Union's prize for creativity, one of the Festival's four major prizes, was awarded to Vincent Namien, a designer from Cote d'lvoire.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hege'Goueier</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">On creativity... in Africa and elsewhere</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> by Alain Nicolas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author of this article is head curator and director of the Museum of African, Oceanic and Amerindian Arts in Marseilles. Here he offers his thoughts on the (partially unconscious) reluctance of the 'official' art world in the West - museums, critics and art historians - to accept contemporary African artists. Even now, they tend to be relegated to the sphere of 'alternative' art. However, he believes that the abundance of creative Africans, and the pressure they are exerting on the art world and market will, sooner or later, generate a 'new revolution' in the museums. This iswhat happened in the early20th century when traditional African art first arrived in the West. This article is linked to the dossier on African creativity published in our previous issue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When I was asked to make this small contribution on African creativity, I was happy to oblige since, as a non-specialist, I am able to content myself with a few generalisations. I believe that there are still barriers, sometime not very visible, but nonetheless real, which have to be broken down.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, writing just a few lines on creativity is a difficult exercise given the amount of literature on the subject and so many divergent opinions. So, what line should I adopt? About 15 years ago - in the wake of hordes of specialists in the humanities from sociology, psychology, ethnology, anthropology and so on - a rational approach, known as 'the anthropology of art', was at last proposed. The term 'rational' should be seen here in the context of the distinction between exact or 'hard' sciences such as mathematics, physics and astronomy, and the humanities, which are essentially inexact or 'soft' disciplines. And in brief, the West tends to take a scientific approach, relying on empirical evidence, even when it seeks to study such subjects as human creativity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Creativity obviously is to be found in many different spheres. It is needed in technology, it is fundamental to story-telling, it underpins all forms of social organisation and has a part to play in religion. Similarly, what we term 'art'  is one of the spheres of creative endeavour. The anthropology of art seeks to document artistic creativity and to analyse the conditions surrounding its expression in various cultures. This is a laudable enterprise insofar as art is regarded as another means of expression, used in one form or another by all human groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The creative function is universal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The basic postulate is that any society - and any individual - possesses creative potential which may be expressed in any way. The first thing to examine, therefore, is the context of choice. There are various modes of artistic expression ranging from music, poetry, prose and dance to architecture, painting and fashion. Some individuals or societies may have no choice, perhaps because of socio-economic constraints. Others may favour a particular mode of expression while nonetheless dabbling in more than one area. The expression of creativity is, therefore, like an identifying mark, claimed by the group or by the individual. The concept of 'style' now comes into play. The expression of one group is different from that of another and no two can ever be the same. Fundamental elements are at work in this materialisation of creativity. Some  are due to the natural environment. Thus, for example, a society located in a place where wood is abundant may favour sculpture. Others come from the group or individual themselves. And in the final analysis, it is the groups or individuals that decide what to portray (or not) on the basis of their own social norms and what they want to express.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These few limited thoughts should be supplemented by the observation that sculpture or the plastic arts more generally can also be examined from at least two angles: as a means of conveying information, and as a form of linguistic expression.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As regards the former, some have proposed analysing any work of art, from whatever culture, as a message. Analysis of the work therefore includes an examination of the conditions surrounding the production and transmission of the message. What message is broadcast ? How does it function ? What does the addressee gain from it? This approach is fine in hypothetical terms but does not allow one to go beyond theoretical and formal data, teaching us nothing about the content of the message under study. It refers back to the originator who holds the keys to the way in which it was sent and thus to its form and meaning.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Linguistically speaking, we assume that all expression through sculpture is a language and that the techniques for studying language can therefore be applied to the work of art. This approach is more rewarding because it brings us closer both to the sources and to the function of communication.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Be that as it may, all methods involve knowledge of the group or of the individual (but also of the relationships between them) and thus of any organised knowledge. Art cannot be separated from perception. This is the position of the majority of scientists. Yet we are not completely certain of this. Briefly, we are led to imagine that art could be irreducible at a certain level. When we look at a sculpture or listen to a piece of music, aside from the emotional content which is at least   partly quantifiable, what are we able to understand about the culture which produced them ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Having travelled widely throughout the world and kept my eyes open, without having become the 'observer-participant' which the ethnologist should be, I am certain that the same creative function can be seen everywhere, and it is not difficult to identify.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Frequent visits to the world's museums and, perhaps above all, to their vaults, further reinforces the impression that constants do exist and are worthy of more and better investigation. Art, and more particularly the art of others, from other continents, is still the domain of a happy few.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are usually highly literate people, and are seldom activists expounding a cause.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contemporary African art must find its niche</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The above statements relate as much to contemporary art as to what we term 'traditional' art. How many of the world's museums really show contemporary art from Africa ? It is as if this sector were cut off from current cultural reality. This is despite the fact that each week, new artists, musicians, designers, painters, sculptors, dancers, film-makers, stylists and photographers emerge from Africa, to be 'recognised' in the West (if anyone knows what 'recognition' really means!). The museums are, in fact, confused by this burgeoning of talent because they have no idea how to manage it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It has been said that contemporary African art is an urban phenomenon aimed at those living in towns and cities - and that it rebels against essentially rural, traditional art.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The argument is that the usual methods for analysing traditional art cannot be fully mobilised because 'urban civilisation' conforms to a set of universal norms (more or less), which are distinct from those studied by ethnologists. It would, therefore, be more appropriate to consider contemporary art in the context of sociology and aesthetics. This may be true, but it still comes down to a matter of observation. Confusion reigns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When we staged an exhibition in Marseilles by the Senegalese sculptor, Ousmane Sow, the first individual showing of his works came as a major shock to many people, including the specialists. I can remember the reactions of at least   two colleagues from museums of contemporary art. What they said was almost identical, and was along the following lines:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What's the name of this sculptor ? I am not familiar with him...</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A N. Do you like his work ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yes, I do, but what's his name ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.N. Ousmane Sow </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· I don't know him. Astonishing! Where's he from ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A N. Senegal - he lives in Dakar. Are you interested in his sculptures ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yes, but..</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A N. You can buy one of his works - he's not very expensive yet and it would be good for your museum. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The problem is he's African.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AN. I see... </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· His works are more your sphere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.N. But they don't have anything to do with traditional art which is what I have in my museum. Ousmane Sow is a contemporary artist, isn't he ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yes, but he's African, and your museum is a museum of African art.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A N. You're correct, I would love to buy one of his works. But it would be the only example of contemporary art in my museum and would represent a change of policy for me. You wouldn't have anything by Ousmane Sow. And we would then be rivals! </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Critics, artists and art historians have begun discussing contemporary African art, more and more good reviews of it are being published, talks are being given and some major exhibitions have been mounted. There are pioneers and supporters in France, Germany and elsewhere, and there is even a great museum - Washington's Smithsonian - which took it on board several years  ago - but we still seem to be a long way from a commitment from most institutions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I hope this statement will soon be proved wrong. Institutions do not like taking risks. Either they create 'ghettos' ('let's set up a museum of contemporary African art'), or they set up committees to consider the subject. It is up to us to set our houses in order, but we must not be too naive. This is the art market, after</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although we tend to cling to this somewhat short-sighted administrative view that there should be different institutions depending on whether we are dealing with heritage or contemporary creativity, museums of contemporary art must integrate all the world's sculptural expression. If not, they will be in conflict with the above; postulate which claims that creative  potential is the same everywhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for so-called museums of anthropology and also a few rare museums such as the Museum of African, Oceanic and Amerindian Art in Marseilles, the systematic exhibition of contemporary art does generate a number of problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When I have wanted to do this in the past, I have been reminded of the 'museographic landscape' and advised to consult the authorities, to organise a major debate on the topic: who, what, where ? That is the rational approach, we are told. There is no great hurry!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact, the recent arrival of African artists comes at a moment in our history when we are questioning the existence of our museums. When I say 'we', I mean the West in general.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So, what might happen ? Traditional African art caused an explosion in Western art and traditional art history at the very beginning of the 20th century, with the cubists and their research which led them to develop a passion for African sculpture. We are all aware of what we owe to Africa and its traditional artists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Contemporary art from Africa is knocking on the closed door of Western museums, but the arrival of contemporary African artists and the pressure they exert on the art world and  market might trigger a new revolution in the museums, which are also the archives. Certainly, all the usual followers are ready to take up the cause, and that is how it should be. Let's be optimistic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A.N. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The works of Ainsley Yearwood: Bombarded with colour</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Claude Smets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ainsley Yearwood is a Trinity dadian artist based in London. me Courier had the opportunity to meet him recently when an exhibition of his works was staged at his country's embassy in Brussels. Brought up in Trinidad, he moved to London to study fine arts at the Chelsea Art School. Feeling unable to express himself fully in this discipline, he ended up taking a degree in graphic design. Mr Yearwood is still based in the UK capital where, in addition to his work as a painter, he also designs costumes for the Notting Hill Carnival, a cousin of the famous Trinidad Carnival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The artist is fortunate to be able to live from his work. Besides the present exhibition which is touring Europe (Manchester, Brussels, Geneva and London), he has other works currently on show at three galleries in the US. He finds that the reaction of the American public is different from the European one. Americans, he believes, are more spontaneous and openminded. 'Europeans tend to stick more to things they already know; to which they are more accustomed.' The titles he gives to his art pieces are for him 'a basis for artistic conversation' with his audience. They express his emotions, feelings, and thoughts, but do not try to impose a specific interpretation of the painting on the viewer. Ainslie Yearwood dislikes the idea of being labelled or categorised - or as he describes it, 'to  be put into a box'. As such, he rebels against people who try to make him conform.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A world citizen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although Ainsley Yearwood recognises his African roots within Trinidadian society, he sees himself as 'a world citizen'. The influences in his paintings are many and varied - deriving from the multicultural background of Trinidad and Tobago, European art and graphic design, the memories of his own childhood and his recent experiences. 'I am like a sponge', he says. 'Everything influences me in my work... people, places and all that I see around me. They help me to view things from a different perspective.' These all then flow together to be visualised through his 'inner eye' (expressed, for example, by two blue dots in his work In the Company of Nature which represents the Grand Canyon). By paying particular attention to what he sees, his 'visual view' is transformed into an 'emotional view'. Thus, for example, his painting Evolution appears to be a landscape. A :loser look reveals that the rocks are in the shape of hands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The artist also uses symbols in dome of his work, as a personal means 'or him to express life. The butterfly :rapped in a jar, for example, in Love lost, is a symbol of the fragility of life. The glass of water in Soul of a Mother symbolises the way a child looks at the world as something exciting and new. he also draws strongly on the imagery of candles, inner eyes and doorways.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Strong colours, strong emotions</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What unifies Mr. Yearwood's work, is his use of colours. As he says, they are 'strong colours to express strong emotions'. In this, he has been inspired by his childhood in Trinidad which, in his own words, 'was an environment that constantly bombarded you with colour - from crystal to aquamarine, sapphire and emerald - a perpetual rainbow of red, yellow, green and blue'. One painting where colour is used to striking effect is Carnival Bacchanal. This depicts Trinidad's Carnival and reflects both the island's multicultural society and its vividness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ainsley Yearwood has also produced more surrealist and psycho-biographical works, under the influence of artists such as Salvador Dali and Francis Bacon. Emotions are revealed through the use of darker though still vivid colours. These works (such as Evolution, </P>
+<P ALIGN="JUSTIFY">Translucent State and Suspended in Limbo) show a fragmented self, stuck between past, present and future, looking for a way forward. They come in stark contrast to the brighter mood of paintings of island scenes - which are in a more African style - or of jazz musicians (such as Soul of a City or The Musician). According to the artist, this is being realistic. If he wants to paint life, he must show the different and contrasting emotions a human being experiences. 'You get up in the morning and you are feeling a little bit happy. You come home in the evening and you are feeling a little bit down. So emotions are continuously changing. If I said that I was always happy, that wouldn't be true.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As mentioned above, a number of Ainsley Yearwood's pieces portray jazz players. He enjoys going to New Orleans to listen to jazz bands and in Soul of a City he portrays one of the musicians. The title underlaines the importance of performers in a place like New Orleans - where indeed, they form an integral part of city life. In A Musical Love affair, the painter uses techniques learned as a graphic designer to help him express his feelings. By drawing graphic lines, the cello player and the instrument flow into one another. He explains: 'The cello player was not just playing the instrument. She was actually part of it. It is as if she were making love to the cello.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is clear from the foregoing that Mr. Yearwood's art is primarily visual. The onlooker is bombarded with strong colours - which are used, together with abstraction and symbolism, to express both optimistic and pessimistic feelings. The artist uses his multicultural background to great effect, drawing on influences from Trinidad, Africa and Europe, to create different modes of expression. These are the essential factors which make his paintings interesting and refreshing to look at.  c.s. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">CTA-Bulletin</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Fairness on the livestock field of play</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Sarah Reynolds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the town of Thies one of Senegal's regional capitals, there is an abattoir where nothing goes to waste. Even the horns of cattle are sold for making carvings for sale to tourists while the tips of the horns are exported to Japan. In a rural area of Chad, small-scale livestock farmers are preserving meat by the age-old process of cutting it into strips and drying it in the sun. Careful attention to hygiene and quality control has resulted in a product so consistently good that it has found an export market as far away as Gabon. Livestock producers in sub-Saharan Africa are responding to market opportunities, not because they recognise the need to improve national food requirements, but in pursuit of profit. Therein lies the best chance for stimulating the livestock sector's production capacity. The challenge is to design policies that protect consumers without crushing entrepreneurial potential for producers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than half the population of sub-Saharan Africa is likely to be living in a town or city within the next 30 years. These city dwellers will have neither the skill, the time nor the space to raise livestock. There are indications on present trends that their demand for food of animal origin will increase. Where will they get it from ? Imported meat is more expensive than it used to be, largely as a result of the change in policies of the European Union. These have also affected the supply of low-cost milk powder and butter oil. Imports from countries outside the continent will  undoubtedly continue but intra-African   trade and local production will become   far more significant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It has been estimated that the production of animal products in sub-Saharan Africa would have to increase by 4% per year to ensure an adequate supply of animal protein for the region's growing population, and to end the need for imports. This presents a major challenge to policy-makers. Already, the current pressure on land resources is causing conflict in some areas and the prospect of more people, more animals, and more strain on already inadequate resources, is perturbing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Information vacuum  in developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The concept of value</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Decisions on how to achieve sustainable and yet more productive land-use, while at the same time ensuring fair access to resources for other interested users, cannot be soundly based if made in an information vacuum. It was in recognition of the lack of information about the livestock sector that the CTA organised and sponsored a seminar on Livestock development policies in the humid and sub-humid zones of sub-Saharan Africa. This was held in Abidjan, Cote d'lvoire on 5-9 February 1996. It was attended by participants from 17 countries within the region and by representatives from international institutions and from Europe. The objective was to contribute to the ongoing debate on policies aimed at bringing about sustainable livestock development while respecting natural resources in developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The concept of value</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Effective planning of government action on issues such as import policy, provision of inputs and services, marketing and research priorities requires quantitative information on livestock production systems. Why is this information lacking when it is estimated that livestock products contribute about 25% of total agricultural GDP in subSaharan Africa? The livestock sector is too important to ignore and yet it is consistently undervalued. The reason is that economists and statisticians like to deal with a tangible unit that can be counted. Ideally, this should be a monetary unit but, failing that, it should at least be a unit that can be easily converted to money, such as the number of animals potentially available to the market. But if animals are used to sustain a traditional way of life, for people who do not have to pay before they can eat, it is difficult to put a monetary value on the food they consume. Similarly, if a herd of animals is sustained by forage that has no other use, on land that can be used for no other purpose, the cost of feeding cannot easily be measured in financial terms. Indeed producers have little to gain from allowing government   departments to acquire information about their assets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Livestock owners have their own objectives when deciding whether and how to increase production. Livestock provide energy in the form of draught power, and dung for fuel or biogas. Their manure restores structure and fertility to the soil. Social prestige may be measured in the quantity and quality of the animals one possesses. For some livestock owners, their animals are their 'barking' system. They represent a deposit account for accumulated wealth and a current account when an animal is sold to raise cash. Indeed it may be impossible to obtain credit from an orthodox bank. There is an added advantage in that there are no interest charges to pay when you raise cash by selling your own animals as opposed to taking out a loan from a bank. It may be difficult to measure real production when animals are treated as a capital reserve. For example, an increase in meat prices, perhaps as a response to a change in economic policy, may result in a short-term reduction rather than increase, in the number of animals being marketed. This is because producers are able to maintain their income by selling fewer animals and can simultaneously  increase their breeding herds. Alternatively, there may be little incentive to producers to sell more animals if they have no use for the extra money they earn. It is of course true that more people are joining the cash economy as they become aware of the desirability of consumer goods, or of services such as schooling. Governments may aspire to design policies which will develop the livestock sector for the economic welfare of society as a whole, but if these policies ignore the objectives of livestock owners, they will fail.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fair play</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a football match, the referee is there to see fair play. In the livestock sector, governments have to ensure fair play between the 'demand team' and the 'supply team', in other words the -consumers and the producers. Governments often make two mistakes. Either they help one team at the expense of the other, or else they join in the game themselves. The role of the authorities should be to make the rules that protect both teams from unfair or unsafe practices. For example, health and hygiene regulations must be in place, and  enforced, but not be so onerous that illegal and totally unregulated marketing channels are established.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Private traders have considerable power to manipulate markets if they collude to form cartels and prevent outsiders from entering their ring. Governments should ensure that this is not allowed to happen, that markets are open and that traders are free to operate provided that they observe health and hygiene regulations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Veterinary services</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most countries are no longer able to supply even minimum standards of veterinary support to their livestock producers. The efforts that have been made in recent years have been largely in the form of donor-funded projects where continuity is rarely guaranteed. The only viable alternative seems to be to transfer activities of this kind to service providers in the private sector. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The work that they do under contract to the government, for example relating to the control of epidemic diseases, must be funded by government or other central agencies since cost-recovery from individual livestock owners is not feasible when participation has to be compulsory. The work that they do on behalf of individuals, or associations of livestock owners, should, however, be paid for by those who benefit directly from the increased productivity that should result - the farmers. The greatest difficulty lies in managing what will be a long and difficult transition period. The success of ventures to privatise veterinary services depends on whether the profession can deliver a decent living in the private sector, particularly in rural areas where the need is undoubtedly greatest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rural development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is in the rural areas that livestock production needs to be intensified. On the outskirts of Africa's major cities, intensive pig and poultry production is already being supported by commercial, joint venture capital. Dairy units, in which exotic, high performance cattle breeds are managed in a controlled environment, are producing fresh milk for cash-paying consumers in nearby towns and cities. Urban areas create the demand but it is the rural areas that need the development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Animal products are seasonal and prices fluctuate accordingly. However, consumers are more likely to develop the habit of using products that are consistently available at stable prices. Government intervention to stabilise  prices risks favouring the consumer at the expense of the producer. For example, if imports are used to counter temporarily high prices during periods of drought, then producers will receive less for their reduced output at the very time when they need support. The most effective policy of price stabilization is to encourage the adoption of production systems that are less vulnerable to seasonal changes. Processing achieves this to some degree and brings benefits to both producers and consumers. Furthermore, because animal products are perishable, and dangerous to human health when they deteriorate, processing extends storage life, and may even have an effect in improving food security.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most countries, the time of greatest food shortage is at the beginning of the rainy season. This is also the time when milk production soars because cattle have good feed; and yet much of that milk is wasted because there is more than required for home consumption. If that surplus milk can be fumed into cheese, potential customers in more distant markets may be reached. Provided that the product is acceptable to the consumer, cheese-making reduces wastage, diversifies the producer's source of income and may also provide employment, and therefore income, to those brought in to help with the production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A technology that has been exhaustively tested by FAO for its suitability for use in Africa is lactoperoxydase. This is an enzyme which extends by three hours the length of time before milk begins to curdle and clot. This effectively doubles the time available for milk to reach the cooling centre, and thereby extends the catchment areas for producers wishing to supply fresh milk to urban markets. The trials that have been conducted show that it is entirely safe. When milk is brought to rural collecting points, it is the responsibility of the cooling centre employee, not the farmer, to add the enzyme at the prescribed rate as the milk is transferred into cans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On current trends, it seems probable that there will be more than 20 capital cities in Africa that have a population of 10 million people by the year 2010. How many other cities and towns will have developed by that time ? There are so many people migrating to the urban areas, and they are doing so because the type of activities that ought to be taking place in the countryside do not exist. If the livestock industry, both primary production and processing, can be encouraged in rural areas, and if the infrastructure is in place to ensure that animal products, in whatever form, can reach urban markets, rural dwellers will find it more comfortable to stay where they are rather than going to the cities to look for jobs that do not exist.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The challenge for policy-makers is to deal even-handedly, not only in the interests of the livestock sector, but in the interests of other farmers, consumers, the national economy and the long-term sustainability of the nation's natural resources. For this task, reliable information, which is accessible to all countries within the region, is essential. The database structure of this information should be standardised so that it can form the basis of regional cooperation on trade and the sustainable use of land resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S.R. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The Couriers Mailbag</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WCL seeks a wider  expression views</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We refer to the article published by The Courier in issue no 156 (March-April 1996) entitled The changing face of trade unionism in Africa, which reflects the views of the ICFTU (AFRO) and OATUU.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We are surprised that you have not taken pains to solicit the views of the World Confederation of Labour (WCL) and its regional organisation, the Democratic Organisation of African Workers Trade Unions (DOAWTU) - which participated on the same footing as the two other trade union organisations at the ACP-KU Social Partners meeting in December last year. We strongly believe this omission on your part should be corrected in future in order to allow a wider expression of the views and stands of all representative trade unions in Africa on such important issues as structural adjustment programmes, the social clause, labour standards and working conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Carlos L. Custer, Secretary-General, World Confederation of Labour, Brussels, Belgium</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Linked destinies</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The continuing dialogue between the ACP and EC Groups has exposed many mutual concerns about world affairs and has promoted a more complete understanding of the problems of both advanced and developing  nations. I am confident that in the future, we shall see further progress in our efforts to create a favourable financial climate for the resolution of our economic problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Global political and economic events have brought home to all of us how inextricably our social and economic destinies are linked. This is true of a whole range of subjects from human rights and political reform to economic development, conservation, health education and industrial promotion. None of these subjects can be put into independent boxes. We must seek more effective integration of our social and economic policies - both internally and internationally - if we are to serve the welfare of the people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I rejoice in your initiative in publishing The Courier. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Teddyiniovo, International institute for Global Cooperation, Benin City, Nigeria</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scope for energy selfsufficiency</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">May I congratulate you on the new layout of The Courier, which is a great deal clearer and which you have instituted as a result of comments made by a number of your readers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I am surprised to discover that you have not said anything about the question of energy dependence in the Lom&eacute; Convention countries. Energy self sufficiency is an extremely important issue. ACP countries face a famine in this area which is rarely mentioned. Most are majors exporters of petroleum, which is  costly and absorbs a significant proportion of their foreign exchange earnings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Practically all the Lom&eacute; countries are in a position to produce alcohol from crops such as sugar cane and manioc without any negative impact on their food resources. These crops could be distilled to produce big-ethanol which is an excellent fuel. All that is needed - and it is a major challenge admittedly - is for production to be organised in each country, and for the required national and international financing to be set up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Also required is the political will in these countries to overcome the various obstacles, including those lobbies who oppose this kind of production because they want petrol imports to be maintained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pierre Mariotte Consultant, Paris, France </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Bibliography</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jean Monnet - 1888-1979  </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Eric Roussel. Published by Fayard, Paris. 1996. 1004 pages. FFR 198.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jean Monnet was almost 91 years old when he died and, despite the fact that he had no higher education qualifications and at times did not hold any official post, his public role was legendary. From the very first page of his book, Eric Roussel stresses the fact that, from the moment Jean Monnet met the Prime Minister, Rene Viviani, in September 1914 until 9 May 1975, the day the Action Committee for a United States of Europe was dissolved, he worked constantly for the European cause.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He applied the same tireless enthusiasm to all his duties, in whatever sphere of activity he was involved - and these were many and varied. Despite his provincial origins, Jean Monnet was, among other things, a cognac merchant, an advocate of the Allied coordination effort during the First World War, Deputy Secretary General of the League of Nations (for a short time), a banker in America and China during the 1930s and in charge of the Victory Program in the USA in 1941. From 1947 to 1952, he was the first Commissioner-General of the Economic Plan in France. He and Robert Schuman were the architects of the famous Declaration of 9 May 1950 which was to form the basis of European construction. He went on to become the first President of the ECSC's High Authority and, until 1975, he was the driving force behind the Action Committee for a United States of Europe. And that is just to highlight his renowned roles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, Jean Monnet was both a visionary and a pragmatist, who was to become adviser to some of the greatest names of his day. General de Gaulle, another great visionary, albeit with a very different ideology, called him 'the inspiration' behind European integration, although such an accolade was not completely devoid of irony given that the two men could hardly be said to see eye to eye.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jean Monnet was a purveyor of new ideas, but also an eternal realist who never failed to recognise the importance of the status quo. Indeed, he could have stepped right out of the pages of a Paul Morand novel. And yet, despite the fact that he was held in the highest esteem by world political heavyweights (Clemenceau, Roosevelt, Churchill, Adenauer, de Gasperi, Brandt, Pompidou, John Kennedy, Henry Kissinger, Heath and Giscard d'Estaing, to name but a few), in his private life he was a simple man, of modest disposition - in fact a bourgeois in the best sense of the word.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A 'workaholic', like many great men, Jean Monnet defied categorization. He has recently been described as 'a man of fringe ideologies who was nevertheless always at the centre of things'. During the latter part of his life, he settled comfortably into his role as 'rather' of Europe. His fundamental thoughts on that topic could be summed up in one line from the Declaration of 9 May 1950, (now a public holiday in the European institutions). 'Europe will not be built in a day, nor as a single structure, but will come about through concrete actions which, first and foremost, create a de facto solidarity'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For Monnet, nationalism meant only war and, from 1942 onwards, he set his sights on preparing for the future, surrounding himself with a team of extraordinary talent - people such as Etienne Hirsch, Herve Alphand, Rene Mayer and Robert Marjolin. These men strove to find ways to avoid war between the countries of Western Europe, to define the objectives of European unification and to establish European institutions which would be equal to such a task.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eric Roussel is a journalist with an arts degree and a doctorate in law, and this is an outstanding work on the 'pragmatic visionary' that was Jean</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Monnet. The book is comprehensive, extremely well-written and impressively documented. Most notably, the author had access, for the first time, to the famous journal kept by Jean Monnet in which he recorded his countlles conversations with the key players and set out his own thoughts. Today, his dream of 'a united Europe complemented by a partnership with the United States' is still one of the big issues. And as the arguments rage, we should perhaps recall some other famous words from Jean Monnet's Memoires: 'We do not seek to form a coalition of States, we seek to unite men . </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alain Lacroix </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Le Choix de l'Europe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Opting for Europe)  by Laurent Cohen-Tanugi. Pub/ished by Fayard, Paris. 225 pages. FFR 110 - BFR 748.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Laurent Cohen-Tanugi successfully reminds us of the modernity of the European project; that there are aspects of it that are essential to our independence and our prosperity, to preserving our model of society and maintaining our influence on the international stage. By urging Europeans and European leaders to look to the future so as to be better able to manage the risks and seize the opportunities that it offers and, ultimately, to be in a better position to change things, he brings us all hope'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was how Jacques Delors described this book, and, basically, there you have it in a nutshell. It would, however, be worthwhile adding that 'opting for Europe' is not quite as simple as it sounds - a fact which has not escaped the attention of the author, who is a graduate of France's elite Ecole normale superieure and of the Harvard Law School. He is also a barrister and member of a renowned firm of international lawyers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since the Treaty of Rome, European progress has very often come about because Member States have set themselves deadlines for achieving particular objectives. 1996 sees the opening of the Intergovernmental Conference, an event of major importance, which is expected to continue at least until the spring of 1997 (with parliamentary elections planned in several Member States in 1997 and 1998). Among the items on the agenda for the IGC is the need to adapt the European institutions - which in essence have hardly changed since 1958 - and to open up the way for the third phase of Economic and Monetary Union in 1999 for those States which have fulfilled the economic convergence criteria set out in the Maastricht Treaty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, besides the technical and financial problems involved, there are also differences between certain Member States about the political future of Europe. The author rightly stresses, in this respect, that the situation has become even more complex since the demise of the Soviet Union. In particular, some politicians support an expansion of the EU towards Central and Eastern Europe, so as to avoid strengthening European integration. The author believes that, broadly speaking, there are two distinct positions. On the one hand, there is the United Kingdom, which would be happy with a large free trade area guided by a 'Secretariat-Commission'and with flexible and relatively loose inter-State cooperation structures at a political level. On the other hand, there is Germany, which wants expansion of the Union towards the East as well, but also wants a swift and concrete consolidation of a common monetary and political 'hard core'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In his book, the author expresses his view that France will play a vital role in maintaining and advancing the essential elements that form the basis of the European enterprise. And he nails his own colours firmly to the mast as someone who hopes to see the continent moving towards some form of federal structure. As one observer commenting   on the work has noted, 'This little Bible, brimming with faith in the concept of a unified Europe, will be invaluable - even to the doubting Thomases among us'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publications received</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Et.... qu'en pensent les villageois? Projets de developpement durable et be veins de base b&eacute;n&eacute;ficiaires</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(But... what do the villagers think about it ? Sustainable development projects and basic needs of aid recipients)  by Myriam Bacquelaine. Published by Ured (Research, Education and Development Unit) of the K.U. Brussels (17, avenue de la Liberte, B- 1080 Brussels). 1995. 3Z2 pages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Les problemes du monde rural vus par les habitants - Portraits de villages de Haute-Guinee</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(me problems of rural life as seen by the inhabitants - Profiles of villages in Upper Guinea)  by Myriam Bacquelaine. Published by Ured (Research, Education and Development Unit) of the KU. Brussels (17, avenue de la Liberte, B- 1080 Brussels). 1995. 222 pages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author, who has a PhD in educational sciences and is a researcher at Ured, has written these two works on the basis of a study she carried out on behalf of the European Commission in Guinea (Conakr,v). This aimed at identifying the most urgent priorities of village communities within the context of an environment restoration project.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The conclusion of the first book underlines research results which point to the adoption of a different approach to development at local level: one which respects the wishes of the recipients and which finally breaks free from western ethnocentrism.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the second volume, the author presents the results of the survey conducted in the villages of Upper Guinea. Six villages with varying characteristics in terms of size, geographical location and administrative status are featured in more detail. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Informations pour le Developpement: Agriculture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Information on development: Agriculture)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Published by Ibiscus (ibis, rue du Havre, F-75008 Paris) and by the Agency for Cultural and Technical Cooperation. 1995. 271 pages. FFR 150.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More than just an index, this publication is a useful working tool for anyone seeking reliable information about development in the agricultural sector. It includes a list of the main organisations specialising in agriculture in 40 French-speaking countries and a list of the principal places and means from which to obtain information (documentation centres, data banks, optical discs, CDs and on-line data services). There is also a selection of periodicals, a bibliographic section (with more than 300 references, including abstracts) and contributions by specialists relating to major topics connected with rural development: landownership systems, links between cash crops and food crops, agricultural funding, etc.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda - Trois jour qui ont fait basculer l'histoire</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Rwanda - Three days that shook history)  by Filip Reyntjens. Published by L'Harmattan (5-7, rue de l'Ecole-Polytechnique, F75005 Paris). Cahiers africains no. /6! 1995. 148 pages FFR 9O. ISBN 2-738437044.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although much has been written about the tragic events in Rwanda, this work examines an aspect of the story which is still largely a mystery: the brief period which began on 6 April with the missile attack on the presidential jet and ended on 9 April, when the 'caretaker government' was swam into office. According to the author, these 72 hours were of critical importance since it was during  this time that the country's killing machine was set in motion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Essentially based on eye-witnffs accounts, it is a tale which is far from complete. The book, however, does provide some hitherto undocumented information which allow us to delve deeper in search of the truth behind one of the darkest pages of recent human history.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Les refugies rwandais a Bukavu au Zaire - De nouveaux Palestiniens?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(The Rwandan refugees in Bukavu, Zaire - the new Palestinians ?)  by Philippe de Dorlodot Published by L'Harmattan (5-7, rue de l'Ecole-Polytechnique, F-75005 Paris) and by the Jeremie Group. 1995. 253 pages. FM 150. ISBN 2-7384-3698-6.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author has brought together various stories, appeals, communiques, analyses and thoughts to write this book about the crisis facing the Rwandan refugees. The accounts cover the period from April 1994 to October 1995 and relate to the situation in South Kivu, Zaire, where an already volatile position has been greatly exacerbated by the arrival of the refugees. The people living in the regional centres of Goma and Bukavu are having to live with the tragedy of gross overcrowding and all its consequences - environmental deterioration, price increases, general insecurity and the threat of war on the border between Rwanda and Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zaire now wants the refugees to leave as quickly as possible, but their return to Rwanda is still problematic. Rejected at every turn, are these Rwandan refugees set to become the new Palestinians? In the postscript to the work, Filip Reyntjens (the author of the book reviewed previously) states that 'These new refugees will not accept eternal exile. H voluntary repatriation is not possible, and if forced repatriation is unacceptable, the only way left open to them may be armed repatriation... The civil society of South Kivu... is well aware of this, and the international community would do well to listen to their cries of alarm... If  it does not, the tragic events of the past year will have been merely a prelude, with the worst still to come'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">La tragedie rwandaise - Historique et Perspectives</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(The Rwandan tragedy - historical background and future prospects)  by Emmanuel Nkunzumwami. Published by L'Harmaffan (5-7, rue de l'Ecole Polytechnique, F-75005 Paris). 1995. 480 pages. FFR 250. ISBN 2-7384-3697-8.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author, a teiecommunications engineer and economist, was born and raised in Rwanda. He now lives in France and has had several articles about the situation in his country published. In this work, he seeks to Reconstruct the machine of central Rwandan power which first appeared in the eleventh century, seeking answers to questions such as: Who ruled the country and how? What alliances were forged and according to what criteria? What kinds of social structure existed and what forms did conflict take? He then goes on to describe the trauma of colonial rule which 'deliberately' fanned the flames of socio-ethnic conflict so that the people could be more easily controlled. From there, he takes us through the era of an 'independent' Rwanda under a dictatorial regime. Its power was progressively stripped away, initially under the pressure of internal calls for democracy, and then by the demands of Western aid donors. Finally, he recounts the events since April 1994.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Having given the historical background, the author examines the country's future prospects. He believes that the 'siege mentality' of the new government does nothing to induce the return of the 2 million refugees who shuffle back and forth across the border and who find themselves stuck between a 'rock and a hard place'. Finally, the author poses a straightforward question - but one which has yet to be answered: How can we rebuild a country that has witnessed genocide on such a scale ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">News round-up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In brief</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNCTAD Report on the least-developed countries (LDCs)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to the annual report of UNCTAD (The UN Conference on Trade and Development), the 48 least developed countries of the planet, after several years of stagnation - and indeed, decline in some cases - enjoyed an average growth rate of 3% in Gross Domestic Product (GDP) in 1994-95. The figure was 4.6% for LDCs in Asia and 2.2% for those in Africa (33 out 48).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNCTAD says that the renewed grovvth rate for Africa's least developed nations is due to an increase in commodity prices, to improved political and social stability in certain countries and to economic reforms which have been implemented. If these favourable conditions are maintained, further modest progress can be anticipated for 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the positive impact of these factors on the development of countries, notably in Asia, UNCTAD believes that there is still a short-term danger that the world's weakest economies will suffer further marginalisation. It is pointed out, in this context, that the LDCs' share of total world trade - which stood at 1.7% in 1970 - had fallen to 0.4% for exports and 0.7% for imports, by 1994.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the longer term it is thought that the LDCs, with their reliance on basic commodities for export receipts, may benefit from the globalization of their economies. This should happen notably through the regional trade agreements to which they are parties, alongside other developing countries. These regional markets, which are more attractive for investors, offer an opportunity for LDCs to try out their products and can, in time, help improve their competitiveness. In the  meantime, however, UNCTAD has noted that the immediate effects of the Uruguay Round have tended to be more negative, with reductions in the preferences enjoyed by LDCs in export markets and increases in the price of foodstuffs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, because they are dependent on official development aid (ODA) to finance investment, and even for their national budgets, LDCs are faced with possible further marginalisation as such aid flows are reduced. The figures show that, in terms of total resource flows, the amount of ODA provided by the Development Assistance Committee (DAC) of the OECD fell to 23% in 1994 from a figure of 27% a decade previously.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Likewise, the amount of aid, expressed as a proportion of the GDP of the donor countries, has been falling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNCTAD suggests a bolder policy as regards external debt - which, in 1994, amounted to 73% of the entire Gross Domestic Product of the LDCs. The organisation believes that the establishment of a new mechanism with sufficient resources to reduce multilateral indebtedness, combined with the expansion of existing mechanisms, could have the effect of reducing the overall debt burden to a more reasonable level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the subject of globalisation, UNCTAD argues that the international community should work to ensure that the LDCs' export markets do not become blocked by protectionist measures. It also believes that extensions to regional trade agreements, taking in the main industrialised countries, should not be allowed to have a damaging effect on the commercial interests of the LDCs. It points out that these countries have only limited scope for pursuing independent, national economic policies and that</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No agreement over banning landmines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Humanitarian organisations have expressed disappointment over the outcome of a recent United Nations conference, convened in Geneva to draw up a convention on 'Inhumane weapons). Both NGOs, and public agencies such as UNICEF, are particularly unhappy that state representatives at the meeting were unable to agree to an immediate and comprehensive ban on anti-personnel mines. These devices, which often lie hidden in the soil for many years, kill and maim thousands of civilians in current (and former) conflict areas across the globe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Diplomats attending the Geneva conference were keen to emphasise what had been achieved. So-called 'dumb' mines, which do not self-destruct after a certain time will eventually be phased out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Seif-destructing devices, which are still permitted under international law, will be subject to strict new standards, designed notably to ensure that they can be detected. And there will be new rules to ensure that minefieids are properly marked.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Critics point out that signatories to the Convention will not be obliged to phase out 'dumb' mines immediately and that their use will remain legal for a further nine years after the agreement enters into force.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is also an exception to the rule about marking the location of mines, 'where direct military action makes its impossible to comply' - a not uncommon circumstance in conflict situations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since the Geneva Conference, a number of countries, including the United States, have announced their intention to reduce their stockpiles of mines. Few nations, however, seem willing to renounce their use altogether. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">S.H.  their governments have little choice but to adopt the prevailing market oriented approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Long-term food security</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A seminar on 'Long-Term Food Security Policies' was held in Brussels on 1-3 April at the initiative of the European Commission. The meeting, which was opened by Professor Pinheiro, Commissioner with responsibility for relations with the ACP countries, brought together about a hundred participants representing Member States, third countries, international organisations and major cooperation agencies. It was also attended by experts and researchers in the field of food security.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fulfilling a promise made by the Commission, the aim of the seminar was to clarify the long term strategic issues and take a closer look at food security policies with a view to preparing a European position for the World Food Summit scheduled for Rome in November under the auspices of the UN Food and Agriculture Organisation (FAO).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Community and its Member States are the world's main donors of food aid having spent ECU 1.089 billion on this in 1994. This amounted to 53% of the global total with the United States providing 44% and Japan 3%. Despite the large amounts being given, the FAO, the International Food Policy Research Institute (IFPRI) and the World Bank are all predicting that unless global food donations are boosted significantly, certain Asian and African countries will face an alarming food deficit by the beginning of the next century.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Between 600 million and 800 million people are likely to be facing hunger by the year 2010 and the cereal needs  of the developing countries could well double between now and then.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This projected scenario coincides with a period of market difficulty. World stocks are low and grain prices have risen by 40% in just one year. Whether or not this is a portent of future food shortage, it has given rise to renewed debate on the ability of certain countries and regions of the world to supply themselves and the extent to which they will have to have recourse to the international markets. Closer attention is also being paid to the wider strategies that need to be implemented to ensure food security in the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If one looks at the issue solely in terms of increasing supply, the projections are gloomy. Experience shows that the 'right' of access to a sufficient food supply for each of the planet's inhabitants cannot be guaranteed whether through world economic growth, food self-sufficiency at the national level, or the international markets and trade liberalisation. There is, therefore, a need for food security policies, in the developing countries in particular, which act on the conditions of demand as well as supply.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In his presentation opening the seminar, Commissioner Pinheiro stressed the fact that of the ECU 7 billion allocated by the EU for development cooperation last year, ECU 1 billion was in the form of food aid. He also noted that this aid 'category' had evolved over the last decade in the context of the search for food security and explained how the Commission, in revising the policy towards the end of 1994, had set out three essential aspects:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - the use of food aid as a policy instrument designed to achieve longterm food security with the emphasis on local purchases and 'triangular' operations - thereby encouraging the growth of the agricultural sector in the developing countries: this entailed developing a new aid instrument in which funds are available to import basic food products (as a way of encouraging the private sector to  take a more active part in the economic life of those countries facing a structural food deficit);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - the integration of aid instruments into the actual development efforts of the beneficiary countries;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - improved access for the people who suffer most from food shortages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Professor Pinheiro indicated that the Commission would shortly be presenting a communication on the strengthening of the link between development aid on the one hand and emergency, rehabilitation and food aid on the other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He stressed the important role that food aid operations could play in preventing conflicts and easing social tensions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to the Commissioner, the challenge in this area have been clearly identified but he believes that additional thinking is needed, notably on the impact of events in China and the countries of the former Soviet Union, and on the effect of US and EC agricultural policies on the world markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In conclusion, Professor Pinheiro expressed the view that food security was, above all, a national responsibility with all civil society actors having a role to play.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Citing the rise in the price of cereals during the second half of 1995 - which had prompted concerns about the availability of food aid and its impact on the balance of payments (notably in sub-Saharan Africa and the Indian sub-continent) - he gave an assurance that the Commission would remain vigilant about this. At the same time, he was concerned not to see a return to situations where aid in the form of straightforward transfers of food increased. These, he observed,</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· had at least partly contributed to food costs, the destabilisation of local production and constraints on intra-regional trade. As such, they had set   back or undermined the reforms in this sector in the countries concerned.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caribbean rice exporters fear changes in OCT . rules</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guyana and Suriname, together with a number of Overseas Countries and Territories (OCTs), have expressed concern over the European Commission's recently announced intention to change the shape of its relations with the OCTs. In particular, they are worried that proposed new rules could harm their rice sales to the 15 European Union nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guyana currently exports 180 000 tonnes of rice (80% of its exports) to the KU. This is shipped initially to the Netherlands Antilles (Cura&ccedil;ao, Aruba and Bonaire) to be partially milled. It then enters the EU market duty-free by virtue of the Union's existing trade rules with the OCTs. But Caribbean exporters fear that this 'OCT route' could soon be blocked by changes currently being considered in Brussels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As already announced in issue no 157 of The Courier (May-June 1996), in the context of the mid-term review of the association with the OCTs, the Commission published a text on February 14 proposing some fine tuning to the trade preferences it grants to these territories. This has now gone forward to the Council of Ministers for decision. The Commission proposal is that while agricultural produce may continue being processed in the OCTs - and hence still benefit from the more relaxed rules - this should happen in future on a case-by-case basis, and only if priority is given to the least developed OCTs and the operations are economically justified.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact, preferential arrangements do apply to direct rice exports from Guyana and Suriname to the KU, but it is argued that the levies are still too high to make the trade viable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to Yesu Persaud, who is Chairman of Guyana's Institute of Private Enterprise; 'it is only via the OCTs that we can export to the European Union.' Mr Persaud was speaking to journalists during a lobby visit to Brussels on April 16. He was accompanied by Charles P Kennard, Chairman of the Guyana Rice Development Board and David Jessop, director of the London-based Caribbean Council for Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Justifying the need for derange, some EU officials point to evidence that non-tome developing countries are 'abusing' the OCT rice route. Rice is a sensitive product for some EU nations such as Spain and Italy, who grow their own.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Persaud said that Guyana and Suriname were lobbying either for their own duty-free quota under the Lom&eacute; trade rules, or for 'a more reasonable levy'. At the same time, however, he indicated that the Caribbean rice growers were keen on keeping the route open via the Dutch and other OCTs (such as Montserrat and the Turks and Caicos) where major investments have been made on the  strength of the existing arrangements. A representative of the Turks and Caicos told reporters that his country earned half a million dollars a year from the trade, and that a new jetty had been built with British government support.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guyana's rice exports have climbed from less than 39 000 tonnes in 1986 to more than 200 000 tonnes in 1995. And as Mr Persaud also stressed, the trade has done so well that Guyana is now investing in high-yielding varieties. </P>
+<P ALIGN="JUSTIFY">D.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fight against locusts</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fipronil, a recently developed pesticide, is said to be 10 times more effective than other products on the market in the control of locusts, according to representatives of the pharmaceutical giant, Rhone-Poulenc who organised a seminar on locust control </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Links between emergency, rehabilitation and development aid </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European commission has recently approved a communication </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> (COM(96) 153) which was due to be presented to the Development Council on 28 May. The document seeks to respond tO the challenge of I maintaining and improving the effectiveness of emergency aid  rehabilitation assistance and development cooperation with third countries - in the face of a wide variety of political, economic and social circumstances.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Communication suggests ways of strengthening the links between the three types of aid within a strategic planning framework which includes intensified dialogue and political cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This initiative follows extensive consultations, both within the Commission (i_ service groups) and with representatives of numerous outside bodies (Member State experts, USAID, UN agencies, NGOs, academic institutions etc.). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the key phrase in the Communication may be 'strategy and global planning', emphasis is also placed on 'coordination' end 'opportunity'. This underlines a commitment to adapting procedures, where necessary, so that measures can be taken at the right time and the transition from emergency aid, to rehabilitation and subsequently to development cooperation can take place in the best possible conditions.  with the 70-member African, Caribbean and Pacific group. The event took place in Brussels in April.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new product, claims the company, fills a big gap that was left in the war against locust infestation when DDT was banned in 1986 (toxic residues from the chemical having been found to enter the food chain and damage the ecosystem).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is stated that Fipronil causes 99% mortality among locusts and gives complete protection for up to three weeks when applied in doses of six grammes per hectare.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Its developers claim that it is three times cheaper than any other form of anti-locust pesticide used between 1987-1995, a calculation which includes the logistical costs involved in distributing the pesticide. It is said to be very effective in preventing locust infestations in countries in the Sahel that are particularly at risk.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Sahel has some 250 acridian species. Of these, about 15, are known regularly to attack crops in large numbers, according to Michel Launois, who heads the French agricultural research body, CIRAD-GERDAT-PRIFAS.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the Brussels seminar, emphasis was placed on the need for donors to set aside more funds for the prevention of locust infestations. It was also stressed that locust control must be at a regional level because of the migratory nature of the species, and the link between locust control and food security was underlined.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CIRAD-GERDAT-PRIFAS has just published an educational cartoon strip entitled 'Les Dents du Ciel 11' (available from Cirad-Gerdat-Prifas, B.P. 5035, F34032 Montpellier Cedex 1). This is intended to explain to a wide audience the need for an integrated approach to locust control.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I New fishing agreement between Angola and the EU</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A new fisheries agreement between Angola and the EU was initialled on 2 May. It is due to run for three years (as opposed to two years for the previous one) and should ensure greater stability and better programming of the Community fleet's fishing activities in Angolan waters. The EU will pay Angola the sum of ECU 13.35 million per annum in exchange for improved fishing rights for European fishermen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is worth noting that the agreement contains certain innovations. These concern, for example, the legal status of catches (which are given Community origin). This should help to avoid the kind of dispute that has arisen in the recent past. There is also the possibility of imposing an annual biological 'rest-period' for shrimp fishing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I African conference on consumer protection</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first African conference on consumer protection was held in Harare, Zimbabwe from 28 April to 2 May. This resulted from a joint initiative by the organization Consumers international and the United Nations, and it was supported financially by the European Commission. The latter was represented at the event by Mrs Emma Bonino, the Commissioner responsible for Consumer Policy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The aim of the conference was to lay down the basis for a genuine consumer policy in Africa. Representatives of 45 African governments attended, together with officials from various regional and sub-regional organizations and delegates from a large number of</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">African consumer bodies. Coinciding with the tenth anniversary of the adoption by the UN of the guiding principles for the protection of consumers, the Conference offered an opportunity to track progress on the application of these principles in African countries. It also saw the adoption of 'model' legislation setting out the essential rights which should be guaranteed to consumers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In her speech, Mrs Bonino stressed the Commission's commitment to supporting the efforts of African governments and consumer organisations in seeking to establish, in a clear and pragmatic way, the link between consumption and development. Evidence of this commitment, she pointed out, was to be seen in her very presence at the conference. She also lent her support to the broad application of the UN's guiding principles in Africa. This would ensure that the health, security and economic rights of African consumers could be protected.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But the European Commissioner stressed that legislation, while important, was not enough in itself to tackle the fundamental problem - which was the satisfaction of basic needs. She appealed for global action in Africa deigned to break the vicious circle of poverty - based on voluntary action at all levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mrs Bonino added that the Commission would seek ways of supporting projects, in particular in the fields of food and health. This should assist citizens to meet their essential needs - with the opportunity to consume products which were different, 'local' and of better quality, and with risks to health and security minimised. The approach should avoid the exhaustion of scarce resources and respect nature. She indicated that an action plan would be drawn up by the Commission in collaboration with Consumers International. This, it was hoped, would allow financing of pilot programmes under a separate budget line which would be sought from the European Parliament for 1997. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE INSTITUTIONS</P>
+<P ALIGN="JUSTIFY">AT WORK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">COMMON FOREIGN</P>
+<P ALIGN="JUSTIFY"> AND SECURITY POLICY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Within the framework of its Common Foreign and Security Policy (CFSP), the European Union has recently issued a number of statements, details of which are set out below:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Towards national reconciliation in Angola</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 4 April 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Troika of the European Union Ambassadors in Luanda made a formal demarche with both the Government of Angola and UNITA in order to welcome the positive outcome of the Libreville Summit between the President of Angola, Jose Eduardo dos Santos, and the President of UNITA, Jonas Savimbi, and in particular their commitment to establish an integrated national army by June and the creation of an appropriate institutional structure, including the formation of a government of unity and national reconciliation by June/July. The Government and UNITA were encouraged to continue to refrain from military activity and hostile propaganda and to provide for free circulation of persons and goods as soon as possible. The EU Ambassadors underlined also the importance of securing human rights as well as transparency in financial management, economic stabilisation and reforms. Having recalled the terms of reference of the EU Joint Position adopted on 2 October, 1995, the Ambassadors underlined that the Union will continue to monitor, with the greatest attention, the development of the situation particularly as regards respect for the implementation of the calendar agreed in Libreville. Welcoming the recent steps taken by UNITA, the EU expressed concern at the slow pace of the quartering and disarming of UNITA troops and urged UNITA to proceed with its commitments, in full cooperation with UNAVEM ill. The EU encouraged the Government to continue the quartering of the rapid intervention police and the disengagement and pulling back of the FAA to the nearest barracks. The importance of disarming the civilian population was also emphasised. The EU also reiterated their call to the Government and UNITA to refrain from acquiring lethal material and to cooperate fully with the de-mining process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU has reiterated its full support to the Special Representative of the UN Secretary-General, Maitre Blondin Beye, to the Joint Commission and to the United Nations Angola Verification Mission (UNAVEM).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cyprus, Estonia, Latvia and Malta align themselves with this declaration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Free elections in Sierra Leone</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 4 April 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union welcomes the fact that presidential and parliamentary elections took place in Sierra Leone in a free and fair atmosphere and in fulfilment of the established timetable for the return to democracy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The results reflect the will of the people of Sierra Leone to achieve a democratically elected civilian government despite attempts at intimidation by armed elements and the ongoing fighting in various parts of the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU welcomes the peace talks between the Revolutionary United Front (RUF) and the Freetown authorities as well as the intention expressed by President Kabbah to meet Mr Sankoh at the earliest possible opportunity. The EU calls on all the parties to work for peace and national reconciliation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Serious threat to peace process in Liberia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 11 April 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union expresses its deep concern at the outbreak of fighting in Monrovia, which represents a serious threat to the peace process in Liberia. The EU is firmly convinced that the AbuJa agreement provides the right framework for resolving the crisis and calls upon the Council of State, the Liberian national transitional government and the Liberian factions to implement it, and to put the peace process back on track, in order to avoid further deterioration of the situation, and the violation of human rights. The EU condemns the loss of human life and the harassment of the civilian population and humanitarian workers. All parties concerned should prove their willingness to re-establish and maintain the ceasefire which represents the necessary prerequisite to disarmament and demobilization. The relevant measures and the necessary preparations can no longer be delayed. The EU asks the factions to return all weapons seized during the fighting to ECOMOG. The EU will base its attitude to Liberia on the concrete steps taken by all parties concerned to implement the Abuja agreement and bring the conflict to an end.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Treaty of Pelindaba on a nuclear weapon-free zone in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 12 April 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union welcomes the signature in Cairo on 11 April 1996 of the Pelindaba Treaty establishing the African Nuclear Weapon Free Zone. The Treaty is in line with the Decision on Principles and Objectives for Nuclear Non-Proliferation and Disarmament issued by the 1995 NPT Review and Extension Conference which   recognised that the creation of Nuclear Weapon Free Zones enhances global and regional peace and security.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU considers that Nuclear Weapon Free Zones are welcome complementary instruments to the Treaty on the Non-Proliferation of Nuclear Weapons, the universality of which the EU continues to promote.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Central and Eastern European countries associated with the EU and the associated countries Cyprus and Malta align themselves with this declaration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appeal for the 'boat people' of Liberia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 14 May 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union expresses its deep concern at the grave humanitarian situation caused by the ongoing fighting in Monrovia and condemns the violence against the civilian population and the harassment of aid operations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While recognising the enormous efforts already made by neighbouring countries to assist the hundreds of thousands of existing Liberian refugees, the Council deplores the fact that the thousands of people crammed in precarious conditions on ships in the area are still in search of a friendly port.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It appeals on humanitarian grounds to the neighbouring countries to give at least temporary shelter to these victims of the fighting and affirms its own willingness to give humanitarian aid to cover their most urgent needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Council calls on all the Liberian factions to stop the fighting immediately and put the peace process back on track in order to avoid further suffering.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">VISITS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Prime Minister of Rwanda</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Prime Minister of Rwanda, Pierre Celestin Rwigema, visited Brussels from 26 to 29 March in the course of a tour aimed at informing the main donors about the work undertaken by his government in recent months and about the policies which would be implemented in the future. He was accompanied by the Minister of Planning and the Minister for Rehabilitation. The Prime Minister was received by Commissioner Pinheiro, who is responsible for relations with the ACP countries and by Mrs Bonino, the Commission member in charge of humanitarian actions. He also spoke at meetings of the External Relations and Development Committees of the European Parliament. Professor Pinheiro took the opportunity to highlight to the Prime Minister his concerns about the current situation in Rwanda, reiterating the Commission's commitment to the country and its people. He also spoke of the need for the authorities to pursue policies and implement measures leading to the restoration of normality. He said it was essential to have a dialogue with the Rwandan refugees in neighbouring countries (there are now about 1.7 million) and to pursue the pacification process under the auspices of the United Nations and the Organisation of African Unity, with the involvement of all the heads of government in the Great Lakes region. Mr Rwigema's visit came at a crucial time for Rwanda. Even if the immediate crisis had passed, there was still a dire need for rehabilitation and development assistance, on top of the existing emergency aid programmes. The political situation remained delicate and the future was by no means secure, notwithstanding some encouraging signs of a progressive improvement as exemplified by the Tunis summit. The recent nomination of</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aldo Ajello as the EU's special envoy to the Great Lakes region underlined the political and moral dimension of the EU's commitment to the peace process in this troubled part of Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SUPPORT FOR HUMAN</P>
+<P ALIGN="JUSTIFY">RIGHTS</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has recently decided to provide the following financing for projects under the budget line 'Support for. democratisation and human rights'. Non-ACP countries </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central America: ECU 180.000 to support seven national and one regional fore aimed at providing training in the field of human rights for instructors. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central America: ECU 100.000 for a democracy consolidation training programme for 30 teams from various organisations in Nicaragua, Guatemala and El Salvador. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central America/Colombia: ECU 263.000 for a series of actions, notably in Colombia, involving the provision of information on human and citizens' rights. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazil: ECU 190.000 for a project designed to boost the civil rights of black people in the country, through the training of judicial personnel and the strengthening of legislation against race discrimination. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazil: ECU 145.000 for a training programme for magistrates, prosecutors and the police aimed at facilitating the uniform application of the law in the State of S&atilde;o Paulo. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazil: ECU 290.000 for a training programme in the sphere of democratic municipal management, in the cities of Recife, Porto Alegre, Santos and Fortaleza. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guatemala: ECU 308.000 for a project to collect and make available the case law of the Constitutional Court, and  to train officials and members of civil society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Honduras: ECU 326.000 to support the National Human Rights Commission with a view to promoting such rights in the Departments of Comayagua and Olancho. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Honduras: ECU 131.000 for an education programme dealing with civic and electoral issues and the rights of children. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mexico: ECU 20.000 to support an initial Latin-American colloquium on the subject of the Ombudsman (in the face of the objectives and challenges of the region). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nicaragua: ECU 285.000 to support the social rehabilitation of minors in custody. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Panama: ECU 125.000 for a training action in the field of the defence of human rights. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Panama: ECU 250.000 to support a communication campaign designed to strengthen the image of the 'people's ombudsman'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Venezuela: ECU 160.000 to strengthen the institution of Justices of the Peace in the country's municipalities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Venezuela: ECU 100.000 ECU for a training and promotion action in the field of human rights and the strengthening of civil society. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EUROPEAN</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DEVELOPMENT FUND</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following, where required, favourable opinions from the EDF Committee, the Commission has decided to provide grants and special loans from the 5th, 6th and 7th EDFs to finance the following operations (grants unless otherwise stated). Major projects and programmes are highlighted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic and social infrastructure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon: ECU 7.3 million for a programme aimed at protecting the urban boundary of the city of Kousseri from the encroachments of the Logone river, to improve sanitation and for the upgrading of an urban access route towards Chad. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghana: ECU 54 million for a transport infrastructure programme aimed at facilitating the social and economic development of the people living in the recisions in question (Western region, Brong Afaho, the Ashanti region). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghana: ECU 3.8 million for a human resource development programme designed to achieve better planning, management and implementation of development projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya: ECU 1.9 million for a project to support the development of tourism. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 385 000 to extend the water supply system in the town of Mantola </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad: ECU 13.5 million to upgrade the Ere-Kelo road </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade promotion/ structural adjustment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Benin-Cameroon C&ocirc;te-d'lvoire-GhanaGuinea-Togo: ECU 1.99 million for a regional programme of trade activities and training with a view to relaunching the pineapple business in West and Central Africa. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burkina Faso: ECU 180 000 for the construction of an 'export and creativity' pavilion at the Salon international de l'artisanat in Ouagadougou. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Papua-New Guinea: ECU 5.3 million for the fourth structural adjustment support programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madagascar: ECU 1.9 million for a rice irrigation project. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enterpris</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Botswana: ECU 33.7 million from the Sysmin fund, to support the work of the BCL, Tati and FEB mining companies in the SelebiPhikwe region. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Health</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dominican Republic: ECU 1.3 million to support the STD-HIV-AIDS prevention programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Education</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madagascar: ECU 1.9 million for a decentralised training project in favour of regional tourism operators. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tuvalu: ECU 300 000 for the rehabilitation of primary schools on the islands of Nukutetau and Nanumea. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Central Africa (Cameroon-Central African Republic-Congo-GabonEquatorial Guinea): ECU 16 million for phase 2 of the ECOFAC project (Conservation and rational utilisation of forest ecosystems in Central Africa). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Institutional support</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malawi: ECU 1 million towards a study aimed at allowing the government to implement its land reform policy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eritrea: ECU 4.5 million for a study aimed at allowing the government to undertake proper planning in the area of water resources and irrigation. </P>
+<P ALIGN="JUSTIFY">Miscellaneous</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacific region: ECU 4.9 million for a project designed to improve the efficiency and security at certain airports. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HUMANITARIAN AID</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali: ECU 1 million towards the reintegration of some 200 000 Malians who fled to Algeria and Mauritania during the rebellions of the 1980s. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 317 000 for victims of the severe floods that struck the centre and south of the country recently. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nigeria: ECU 850 000 to help fight the meningitis epidemic affecting seven provinces of the country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sierra Leone: ECU 700 000 in urgent food and medical assistance for some 250 000 refugees who fled to the areas around the towns of Bo and Kemena following the fighting. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad: ECU 200 000 to help fight the meningitis epidemic. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zaire: ECU 145 000 to help victims of the cholera epidemic and to assist in preventing its further spread (following the course of the Zaire river). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Non-ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Colombia: ECU 60 000 to help fight cholera in the municipality of Silvia, where some 40 000 are under threat due to a lack of drinking water and deficiencies in basic hygiene. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guatemala: ECU 1.52 million to provide food aid and basic essentials to returnees from other parts of the country, and from Mexico, following years of civil war. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Armenia/Azerbaijan: ECU 11.57 million (ECU 4.07m for Armenia and ECU 7.5m for Azerbaijan), for food and medical assistance, targeted at the most vulnerable sections of the population, and for the provision of agricultural materials with a view to reducing progressively the dependence of the refugees, who are victims of the conflict in Nagomo-Karabakh.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caucasus-Georgia-Tadilkistan: ECU 3.2 million for food aid to be targeted at the most vulnerable sections of the population. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Georgia: ECU 7.43 million for victims of the internal conflict in this country where the loss of the Russian market has seriously undermined the rural economy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lebanon: ECU 600 000 for displaced people, to allow for the purchase of basic essentials including food, medicines, shelter and blankets. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Afghanistan: ECU 600 000 for health infrastructures in the refugee camps   around Jalalabad, and for medical aid to refugees in the town of Herat. Indonesia: ECU 120 000 for toots and materials to construct shelters for the victims of the earthquake that struck in February. China (Tibetan nomads): ECU 550 000 for food aid, medicines and blankets for some 72 000 people living in the mountainous regions who have been badly hit by severe weather and a food shortage.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FOOD AID </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p95a.png"></center><br>
+ The Commission has recently taken decisions to finance food aid as set out in the chart which follows: </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Aknowlegments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier</P>
+<P ALIGN="JUSTIFY">Africa - Caribbean - Pacific - European Union</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Address: Postal address (mail only) 'The ACP-KU Courier' Commission of the European Communities 200, rue de la Loi 1049 Brussels Belgium</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier office address (visitors) First floor Astrid Building 1, rue de Geneve Evere - Brussels Belgium</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publisher Steffen Smide commission of the European Communities 200, rue de la Loi 1049 - BRUSSELS (Belgium) Tel. 00-32-2-299 11 11 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director of Publications</P>
+<P ALIGN="JUSTIFY">Dominique David</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Editor</P>
+<P ALIGN="JUSTIFY">Simon Homer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Assistant editors</P>
+<P ALIGN="JUSTIFY">Augustin Oyowe</P>
+<P ALIGN="JUSTIFY">Jeanne Remade</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associate assistant  editor</P>
+<P ALIGN="JUSTIFY">Hegel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Joumalist:</P>
+<P ALIGN="JUSTIFY">Debra Percival</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Production Manager:</P>
+<P ALIGN="JUSTIFY">Dorothy Morrissey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Secretariat:</P>
+<P ALIGN="JUSTIFY">Carmela Peters</P>
+<P ALIGN="JUSTIFY">Fax: 299-30~02</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Circulation:</P>
+<P ALIGN="JUSTIFY">Margriet Mahy-van der Werf</P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/ec159e/ec159e.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/ec159e/ec159e.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/ec159e/ec159e.htm	(revision 21083)
@@ -0,0 +1,2869 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; The Courier - N°159 - Sept- Oct 1996 Dossier Investing in People Country Reports: Mali ; Western Samoa</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The Courier - N°159 - Sept- Oct 1996 Dossier Investing in People Country Reports: Mali ; Western Samoa</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">AFRICA-CARIBBEAN-PACIFIC - EUROPEAN-UNION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Country report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali, which used to be the centre of great appears hemmed in by its frontiers, colonisation having culminated in the break-up of the old 'French Sudan'. Following the marxist regime of Modibo Keita (the 'founder' of the nation) and the dictatorship of Mousse Traor&eacute;, Mali has discovered democracy. It is still one of the world's poorest countries but recent macro-economic trends are highly encouraging and there is a new dynamism. It seems that the ending of the Tuareg conflict has provoked a surge of optimism- even among ordinary citizens whose wallets have yet to feel the effects of an improving national economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Country report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Western Samoa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacific island nations have a reputation for idyllic scenery and rich cultural traditions. Western Samoa has both of these assets in abundance, but it also faces many development challenges. With a population of just 165 000, the country has a limited local market, and it is a very long way from potential overseas customers. It is also susceptible to destructive tropical storms. Despite these constraints, there have been some promising signs of economic progress in recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dossier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Investing in people</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To say that investing in people makes economic sense is to state the obvious. But to what extent are the implications of this statement fully understood in the developing countries, especially in sub-Saharan Africa, in these days of constantly shifting development theories? We look at this subject in our Dossier. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Acnowledgements</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier</P>
+<P ALIGN="JUSTIFY">Africa - Caribbean - Pacific - European Union</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Address: Postal address (mail only) </P>
+<P ALIGN="JUSTIFY">'The ACP-EU Courier' Commission of the European Communities 200, rue de la Loi </P>
+<P ALIGN="JUSTIFY">1049 Brussels </P>
+<P ALIGN="JUSTIFY">Belgium </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier office address (visitors) </P>
+<P ALIGN="JUSTIFY">First floor Astrid Building 1, rue de Gen&egrave;ve </P>
+<P ALIGN="JUSTIFY">Evere - Brussels </P>
+<P ALIGN="JUSTIFY">Belgium</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publisher Steffen Smidt </P>
+<P ALIGN="JUSTIFY">Commission of the European communities </P>
+<P ALIGN="JUSTIFY">200, rue de la Loi </P>
+<P ALIGN="JUSTIFY">1049 - BRUSSELS </P>
+<P ALIGN="JUSTIFY">(Belgium) </P>
+<P ALIGN="JUSTIFY">Tel. 00-32-2-299 11 11 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director of Publications</P>
+<P ALIGN="JUSTIFY">Dominique David</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Editor</P>
+<P ALIGN="JUSTIFY">Simon Homer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Assistant editors</P>
+<P ALIGN="JUSTIFY">Augustin Oyowe</P>
+<P ALIGN="JUSTIFY">Jeanne Remacle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associate assistant editor</P>
+<P ALIGN="JUSTIFY">H&eacute;gel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Journalist:</P>
+<P ALIGN="JUSTIFY">Debra Percival</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Production Manager:</P>
+<P ALIGN="JUSTIFY">Dorothy Morrissey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Secretariat:</P>
+<P ALIGN="JUSTIFY">Carmela Peters</P>
+<P ALIGN="JUSTIFY">Fax: 299-30-02</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Circulation:</P>
+<P ALIGN="JUSTIFY">Margriet Mahy-van der Werf</P>
+<P ALIGN="JUSTIFY">(299-30-12)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cower page:</P>
+<P ALIGN="JUSTIFY">Cover photo by</P>
+<P ALIGN="JUSTIFY">John and Penny Hubley</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Meeting points</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Ieremiah Tabai, Secretary General of the Forum Secretariat</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Pacific Forum: 'responding to the needs of the Member States'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although an accountant by training, leremiah Tabai has never had the opportunity to practise his profession, having pursued a successful political career instead since 1974. In 1978, he was annointed head of government in Kiribati and a year later he became his country's first President, when it achieved independence. He held this position for 12 years. In 1991, he took up the top post in one of the South Pacific's key regional bodies, the Forum Secretariat, which is based in Suva, Fiji. During a recent Courier visit to the region, we had the opportunity to interview the Secretary General. Our discussion was wide-ranging, covering issues such as the Forum Secretariat's role, the economic challenges facing the South Pacific, and the development of regional links with Australia, New Zealand and Asia. We began by asking Mr Tabai to outline the objectives of the organisation that he heads.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Like many other organisations in the region, the Forum was established essentially to try and assist the development process of the Member States. At the time it was set up, there was already an organisation in existence - the South Pacific Commission - which dates back to 1947. But there was a feeling that we needed an organisation that was not just restricted to economic issues; that could talk about other matters with a bearing on the development of the region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the early years, when the organisation was called the South Pacific Bureau for Economic Cooperation (SPEC), the focus was heavily on trying to assist the trade and economic development of the member countries. Later, the name was changed to the Forum Secretariat and its role evolved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In what way ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-It has evolved in seeking to respond to the needs of the Member States. It started as a very small bureau essentially dealing, as I said, with trade and economic issues. Subsequently, it moved into areas like energy, civil aviation, maritime questions and telecommunications. It also became more involved in political issues. We have a division which deals specifically with these.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1995 was a very important year in the history of the Forum. We had a review of the organisation, looking at ways we could perform better and taking account of the changes in the region and the world at large. The fundamental recommendation in the report which came out of that review was that the Secretariat should focus mainly in future on poliy-related issues, in the areas of trade and investment, economics and international relations. This report was discussed and endorsed at the last Forum in Madang, Papua New Guinea. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Does this mean, in practice, a withdrawal from project activity ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-It may. The essential focus of the work will be providing policy advice to countries. Having said this, there should still be some project work. For instance, we will be engaged in a programme to provide assistance for importers, particularly in the small island countries. The idea is to help people- who may not be familiar with all the legal requirements-to learn how to get into the business. This will involve running a workshop and inviting people with expertise to pass on their knowledge. So even though the focus will be on policy issues, there will still be room for project-type activities where needed -so long as these fit in with the policy priorities. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You mentioned the fact that the Forum now deals with political questions. Although the issue may now be seen as 'water under the bridge' to what extent was the Forum Secretariat involved in the diplomatic disagreement over French nuclear testing ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- We were very much involved from the beginning. In 1991, when the French testing was not underground but atmospheric, the region, at a Forum meeting, came out strongly in opposition to the tests. Right up to our last meeting in Madang, the subject was always a major item on the agenda, and we left France in no doubt as to the resolve of our region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the new President took the decision to resume testing after a gap of several years, I was in the group from the South Pacific that went to France to express our views to French ministers, face-to-face. Our team was led by the then Australian Foreign Minister, Gareth Evans, who was President of the Forum. And when the tests began again, the Chairman took a decision suspending the dialogue and partner status of France with the Forum. So, as you see, we have been heavily involved in the issue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What resources does the Forum have at its disposal and where does the money come from ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- An important source of funds is our members' contributions. These tend to be used to cover the operational costs of the organisation. Then of course, there are the funds made available by our donors. The main ones are obviously Australia and New Zealand but there are many other countries and international organisations who provide assistance. The EU, of course, is an important partner. There was also a private donor who funded our conference centre.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· How many people are employed in the Secretariat ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Around 80, all based here in Suva. Most of these are support staff.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What is the current state of relations between the Forum Secretariat and the main donors ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I would say our relations are good. We have an extensive mechanism for consultation with the donors. Every two years, we invite them here for a dialogue. We talk about the key issues and discuss ways in which they can assist us. There is also usually a dialogue associated with the Forum (ministerial) meetings. In September this year, after the Forum meeting, we will have more discussions with our main partners such as the EU, Canada, France, Japan and the UK. I should mention too the close links we have with international organisations like the Asian Development Bank, the World Bank and the IMF.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I think it is fair to say that the Forum Secretariat is seen as a particularly important organisation in the region. That is why donors are quite keen to be seen assisting us in what we do.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What are the key development issues facing the South Pacific nations ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Development is quite a difficult process for our region. There are various international reports (particularly from the World Bank) - that describe how we have fared over the last few years. If you compare our performance with the Caribbean countries, for example, you find that we have not done nearly so well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We face a number of problems. First, there is the fact that we are so small. Small communities find it much more difficult than large ones to achieve development. You need to have the market and the critical mass to do all the things that are needed and we lack these. A second, related point is that our countries are very isolated from the rest of the world. It is true that here in Fiji, there are quite good connections, but if you go to Tuvalu, Kiribati or Niue, you will soon discover how difficult it is to get out. And if you are so isolated in terms of communication, how can you hope to increase your exports ? How can you airfreight your fish to Japan when there is no aircraft available-or the one that is available is not fast enough to ensure that the product is still fresh when it arrives?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On this question, one of the things we are increasingly realising is the need to do more in terms of human resource development. We all recognise that, without an educated population and workforce, it is very hard to achieve the development that we are aiming for. To be fair, if you compare the literacy rates here with those of many other countries, say in Africa, they are not at all bad. Our literacy levels are quite high. But I think we have a long way to go in acquiring problem-solving skills of the type needed to compete internationally. We are now talking with the EU about how we can utilise funding from the second protocol of Lom&eacute; IV. And I suspect that human resource development will remain high on the agenda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Is that view shared by the European side ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I think so. l have a feeling that they will support it because it is so obvious. If you develop human skills, you are better placed when it comes to problem-solving.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Going back to the key development issues, another point is the lack of natural resources. This is less of a difficulty for countries like Fiji or Papua New Guinea, but it certainly affects the small island states. It hardly needs saying that if you don't have the resources in the first place, it is much harder to develop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, I think there is a question of how the Pacific region can get a better return on the resources it does have. This theme of 'managing our resources' was discussed by the Forum in Brisbane two years ago. Fisheries is probably the most important area here. The question is how we can earn more from this than we are currently doing- and there is no easy answer. Likewise in the forestry sector. We have to ensure that logging is done on a sustainable basis. But we must also recognise that leaders of the Pacific nations are under pressure. On the one hand, they are trying to take a lona-term view. but they are also striving to tackle the immediate problems. In an ideal world, our region would obtain a far better return on our resources, and that is something that we have to work on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Having said all this, I don't think one should be too pessimistic. This region is still a very good place to live in. That is clearly reflected in the number of visitors we get. The 'South Seas' still have a special connotation that draws people here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You effectively have two 'genera/' regional organisations, with overlapping memberships, covering the South Pacific -the Forum, and the South Pacifc Commission (SPC). Do you think there is room for bath ? Do you complement each other or is there a rivalry ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We have more than two regional organisations. We also have SPREP (South Pacifc Regional Environment Programme), the FFA (Forum Fisheries Agency)....</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yes, but these are specialist bodies with distinct sectoral responsibilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Yes, that's true. In answer to your question, my view is that we have no problem with things as they stand. I was very involved in the debate some years back on the question of what we called an SRO - a single regional organisation. There was a strong push to try and achieve an SRO. The subject was debated for a few years and, in the end, it was possible to resolve the question.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You mean it was resolved by the idea being abandoned ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I suppose it depends on the way you look at it. The outcome was a decision to leave the regional organisations as they are but with the establishment of a mechanism to ensure they work together more effectively. This mechanism is called SPOCC-the South Pacific Organisations Coordinating Committee. It is a meeting of heads of regional organisations which happens at least once a year. We talk about the issues that are common to our mandate and work out ways of doing things better. SPOCC has been operating for six or seven years now and I think it works fairly well. There is, after all, no conflict in our underlying objectives. So my answer here is no, I don't see any problem. I don't see any rivalry between us. It is a question of seeing how we can work together to achieve the goals that we share.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In the European Union, the fundamental goal, set out in the Treaty, is to move towards 'ever-closer union' We have been doing this in fits and starts over the past 35 years. Do you see the Forum perhaps taking on a similar role here-as the focus for economic, and perhaps ultimately, political integration in the South Pacifc ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- I think it is too early to speculate. We already have a number of sub-groups in the region like the MSG, the Melanesian Spearhead Group, whose members are the Solomon Islands, Papua New Guinea, Vanuatu and Fiji (admitted last year). Further north, we have the Micronesian grouping which brings together Nauru, Tuvalu, the Marshall Islands and Kiribati. These groups meet outside the Forum framework and they essentially have a common aim which is to work more closely together. I think they feel it is easier to do it at this level because they are closer to each other and have more in common.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for the Forum Secretariat, you can never tell what may come in the future. On balance, however, I think at the moment that integration is a long way off. Having said this, you do sometimes hear people putting the idea forward. There is, for example, something called the CER system, which stands for 'closer economic relations' between Australia and New Zealand. There have been suggestions that it might be possible to enlarge this grouping.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Looking at closer economic cooperation, and the general dismantling of trade barriers, we also need to recognise the growing importance of APEC (Asia-Pacific Economic Cooperation) for the region. We are trying strengthen our links with the APEC countries and in October, we will be establishing a trade office in Japan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You mean a Forum Secretariat office ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Yes, in Tokyo. We are also talking with the Chinese and will probably end up with an office in Beijing. This is all part of our attempt to integrate ourselves with the Asean region. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interview by Simon Homer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mission statement of the Forum Secretariat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mission of the Forum Secretariat is to enhance the economic and social well being of the people of the South Pacific, in support of the efforts of the national governments. The Secretariat has particular responsibility to facilitate, develop and maintain cooperation and consultation between member governments. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Secretariat must pursue its mission in accordance with the directives of the Forum and within its mandated areas of operation. it undertakes political and economic activities, regional in nature and complementary to the activities of the member governments. Its role requires it to act as the secretariat to the Forum and to disseminate the Forum's views, to coordinate activities with other regional institutions in particular through the SPOCC process, and to represent the Forum's interests intemationally, as required. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">ACP</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Investment symposium</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">A success story for African mining</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The MIGA (Multilateral Investment Guarantee Agency) symposium was held in Montreal from 22-24 May. It brought together some 40 African mining ministers, most of the important donor agencies and representatives of around 25 mining companies. MIGA, which is a specialised agency of the World Bank, promotes the flow of private investment to developing countries. It provides insurance against political risks and assists member countries in attracting foreign investment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The purpose of the symposium was to attract investors from all over the world in order to exploit the rich mining possibilities offered by many African states. Several of the countries that attended went to considerable effort to present themselves well, and it was evident that some are quickly learning what it takes to attract foreign investors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The climate for mining investment in most African states has improved tremendously over the last two to three years. Most countries have introduced new mining codes, clearly defining the rights and obligations of foreign investors. State-owned companies are also being privatised, taxation has been made more reasonable and institutions in the mining sector, such as geological surveys, are becoming more efficient.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All this has led to a big increase in exploration for new deposits and a substantial increase in investment. At present, the activity is particularly heavy in West Africa, where many countries have very good gold potential. The European Community is contributing to this development in several ways. The biggest success so far has been the exploration campaign in Mali, funded under that country's Lom&eacute; National Indicative Programme (NIP), which led to the discovery of the Sadiola gold deposit. A world-class gold mine will be built here, bringing substantial benefits to the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The World Bank has also supported many African countries in their efforts to reform the legal and administrative framework for the mining industry. An important element, however, in attracting mining companies is the availability of good geological data. This is a very expensive activity, which does not bring immediate returns, if at all. So it is not appropriate to finance this through bank loans. The NlPs and SYSMIN Fund, on the other hand, are instruments that are well-suited to this kind of work. The Community has already financed a series of airborne geophysical surveys in Botswana and Namibia -to mention just two examples-and a new Sysmin project is currently being prepared for Burkina Faso.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission Unit responsible for Mining Cooperation and Sysmin (VIIIl.B.5) was represented at the symposium. Its main purpose for being there was to present the functioning of Sysmin and the Community's cooperation in the field of mining to ACP ministers, mining companies and other donor agencies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Current state of the mining sector</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mining sector is currently very active. Exploration in West Africa doubled between 1993 and 1995 and new mines are being opened all the time. A lot of this new activity is to be found in the gold sector. This is mainly due to the development of cheaper production methods combined with a much more positive investment climate in many African countries. A gold mine takes less time to reach the production stage than, for example, a copper mine, with the former being far less dependent on good infrastructure. Outside the gold sector, activity is much more subdued. While base-metal prices are at a reasonable level, the pay-back period is much longer and the lack of suitable infrastructure kills many projects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For many countries, mining is a key area in the growth of the private sector. State-ownad mines are being privatised and the new mines that are being opened have little or no state participation. Foreign investors are bringing in the most up-to-date mining technologies and business methods, and they are faced with the need to train local people in technical and business skills. Supporting the mining sector is clearly an efficient way of supporting private sector development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SYSMIN's future role</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given that most metals are currently fetching quite high prices, it is probable that relatively few ACP countries will be eligible for SYSMIN assistance over the next two to three years. The viability of most existing mines is not thought to be under threat and they should continue to be profitable. Thus, countries that are heavily dependent on mining should not experience severe losses in export income, which in turn means that relatively few SYSMIN requests are expected during the period of Lom&eacute; IV's second financial protocol. At the same time, the financial allocation for SYSMIN has been increased from ECU 48Om to ECU 575m.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When trying to attract new mining investors, it is essential for a country to have good geological information. Private companies are normally unwilling to undertake much general prospect ion, such as airborne geophysical surveys, because it is very expensive and, if they do, it is usually limited to very small areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present, companies are tending to restrict their activities to areas for which general information is already available. These points were raised by several of the mining companies that attended the symposium.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But the present mining boom is not going to last for ever. Metal prices are volatile and, with the next downturn in the business cycle, a decline in metal prices will surely follow. So it is essential to prepare the basis for future mining activities by collecting general data. Given that a significant part of the SYSMIN allocation may remain unused because of a lack of requests, it would be worthwhile to consider whether a part could be reallocated to prepare general geological data for mining activities in the next century. </P>
+<P ALIGN="JUSTIFY">F. B.-H.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Joint Assembly to consider climate problem</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Hans van de Veen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Can the EU-ACP relationship be used to strengthen the dialogue between Europe and the main victims of climate change ? And can the Lom&eacute; Convention be one of the tools to promote climate protection measures, as well as the implementation of the Climate</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Treaty? These questions will be considered in depth at a hearing on climate derange scheduled for the next ACP-EU Joint Assembly, to be held in the last week of September 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Periods of heavy rain have always been part of normal life in Fiji. But the latest rains were different, says counsellor Taina Tudau of the Fiji Embassy in Brussels. 'They were much more extreme than what we were used to, and caused heavy damage. Normally it took several days of heavy rain before the floods came up. This time, the water flooded the islands almost immediately the rain began to fall.' Mrs Tudau sees two main causes for the recent flooding. First, there is heavy deforestation on the islands, causing widespread erosion. But she is sure there was another reason for the recent damage: 'In the Pacific we know the local climate is changing. We see that the sea is rising. We are experiencing more extreme weather events. There can be no doubt that global warming is already going on.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji is a prominent member of the Alliance of Small Island States (Aosis), the group of 36 nations which feel particularly threatened by global warming. At the first Conference of Parties to the UN Framework Convention on Climate Change, held in Berlin in March 1995, Aosis called for industrialised nations to reduce their C02 emissions by 20% by 2005 (based on 1990 levels). At the end of the conference, the 150 national delegations agreed to begin negotiations on targets for industrialised nations to cut emissions in the early years of the next century.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So intentions may be good, but in practice not much has been done yet. The EU, for its part, risks losing credibility if firm action is not taken soon. According to a recent Commission White Paper on energy policy, the use of energy within the Union will increase by 1% a year up to 2020. Failing 'any strong policy interventions', the paper says, emissions of carbon dioxide are likely to show a 'substantial increase' during this period. Says Fiji-counsellor Tudau: 'As small island states we know what's at stake, but there seems to be no feeling of urgency in the rest of the world. We really wonder how long it will take before there is a definite move towards reduction of greenhouse gases.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EU-ACP cooperation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the Berlin conference, the ACP countries-led by Aosis but with support from most of the African states -took a constructive and moderate position in the G77. The position adopted by the EU could also be described as moderate, certainly compared to that of other OECD countries. Several observers have pointed to the fact that these two moderate approaches by important blocks within the Climate Convention negotiations offer possibilities for some form of cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'No doubt the EU represents the most progressive group of countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">within the OECD, although its position is far from sufficient', says Sible Schone, a representative of the World Wide Fund for Nature. 'Besides that, the EU has a special relationship with a large group of developing countries. Quite obviously it will be significant to get a dialogue started between the EU and the ACPs on the subject of climate change.' Currently, there is no such dialogue. 'At the moment we are not in a dialogue with ACP countries on climate change', says Bertil Heerink of the European Commission's Environment Directorate-General who is a member of the EU delegation to the climate negotiations. 'I'm convinced this will happen some day, but first we have to agree on our own goals and measures. I am sure developing countries want us to give priority to this too.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The special ACP subcommittee to deal with tropical timber, the environment and fisheries, formed after the signing of the revised Lom&eacute; IV, only recently started its work. With respect to the global warming issue, it is waiting for the Joint Assembly hearing, according to ambassador Michael King of Barbados, who is a committee member. 'The specific interests of the different regions have to be articulated there, and then some kind of sustained effort has to be initiated.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The unit for Sustainable Development and Natural Resources in the Development Directorate-General of the Commission (DG VIII) not at present dealing with the subject of climate change. Says Head of Unit, Amos Tincani: 'We have worked on biodiversity and desertification, and we want to do more on the specific environmental problems of small island states. But we have done nothing similar on climate change. This is partly because it is so much a global problem, but the main reason is we simply lack the people and the time to go into it.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Assembly hearing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At its meeting in Windhoek in March this year, the Joint Assembly adopted a resolution which had been proposed by representatives of 13 small island states. This urged the EU to take the lead in combating climate change and the adverse effects thereof. More specifically, the Commission is being asked to update its climate change strategy for the period post-2000 and to achieve significant reductions in emissions of greenhouse gases over the coming decade and thereafter. The resolution riches on to call for extra assistance to ACP countries in the Caribbean, Pacific and Indian Ocean to help them improve their disaster preparedness. The Commission is also urged to accelerate the transfer of appropriate technologies and practices, to enable ACP states to develop coastal zone management strategies and to rehabilitate and protect areas stricken by drought and desertification as well as by hurricanes and floods.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two representatives of the European Parliament, Maartje van Putter (PES) and Peter Liege (EPP), have been active on the situation of the small island states and climate change for several years. According to Mrs Van Putten, the main effect of the coming Assembly hearing should be to put extra pressure on the Commission to take its responsibility seriously. 'Talking about climate change,' she says, 'one should never forget who is to blame and who, therefore, must take decisive action. A European tax on energy or carbon dioxide would be an important first step, but no more than that.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Besides influencing the Commission's energy policy, Mrs Van Putten hopes the Assembly hearing will raise public awareness on the climate problem in those ACP countries which are not in the 'small island' category. 'If you are talking about rising sea levels, the African states with low-lying coastal zones face the same problems as the small island countries,' she points out. 'And they also face the problem of desertification and declining food production.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Integrating the climate dimension</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a recent briefing paperto the Commission, the International Institute for Environment and Development (IIED) concluded that, hitherto, the aid community (including the EU) had not incorporated measures on global warming into their strategic thinking on sustainable development. 'Indeed, the possibility of climate change has been considered of minor importance in comparison to other environmental concerns.' This is hardly surprising, says the London-based institute, as the climate issue has only recently been placed on the international agenda. Moreover, the long-term threat of global warming raises some difficult questions regarding priorities in circumstances where resources are limited. In other words: who wants to spend scarce funds on problems the full effects of which will probably not be felt for another 25 to 50 years? The best way forward, suggests the IIED, is to tackle the apparent conflict between shortterm development priorities and longterm climate protection, by 'integrating the climate dimension' rather than considering climate change as an issue in isolation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Technology transfer could be a central point, according to WWF's Sible Schone. 'Developing countries see technology transfer as a central theme in the Climate Convention, but the industrialised countries don't give enough weight to these There are a lot of paragraphs about technology transfer in the Convention as well as in Lom&eacute;. Now it's time to fill in these commitments.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Strangely, there are hardly any Lom&eacute; projects currently under way in the field of energy efficiency. It is strange because experts have pointed to the large potential in developing countries for cost-effective energy improvement and energy conservation. Improved management could save at least 25% of the energy now being consumed. Quick realisation of this potential would significantly contribute to alleviating environmental &agrave;nd development problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Henri Martin, energy specialist in DG VIII, agrees a lot more could be done in this field, but he points out: 'We are dependent on requests. If you look at the wording of the Convention, everything has already been said. There are chapters on energy and technology transfer. The problem is that we don't get enough signals back from the ACP countries that these items are a priority for them. I'm afraid sustainable energy or energy efficiency is not high on the agenda of most countries.' Taina Tudau disagrees strongly: 'Our experience is that the projects that could make a difference and contribute to sustainable development, protection of the environment and local sustainable energy production, are found to be too small. It is the donor that sets the conditions for the projects, not us, the small island states.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New funding?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Can the EU build a credible policy linking climate and development cooperation, without reserving extra money? Not surprisingly, there is disagreement on this question. In Brussels, officials are inclined to point to possibilities that are already there but not being used. Amos Tincani, for instance, observes that 'there are budgets for this kind of problem under Lom&eacute;. We have provisions specially targeted for the islands'. He mentions regional budgets in particular: 'A lot can be started at the regional level which then trickles down to the national level. But after producing fine resolutions, everybody seems to forget the work still needs to be done. The idea is: 'oh yes, we can do it, provided it is with fresh money'. We say: a lot more can be done with existing budgets and instruments.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maartje van Putten, from the Parliament, says the discussion should not be 'dominated by southern demands for additional money'. She agrees that ACP countries could make better use of existing funds and possibilities, such as, for instance, the funds for intra ACP cooperation. But counsellor Tudau points to the fact that the Climate Convention urges industrialised countries to support the response of developing countries to climate problems through 'new and additional' money, besides the transfer of environmentally sound technologies and expertise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a financial mechanism built into the Climate Convention, which is administered by the Global Environmental Facility, to cover additional costs of appropriate measures. But much more could be done by the aid community, including the EU, according to Mrs Tudau. 'Most European countries will not succeed in stabilising, let alone reducing, their emissions. In reaction to this, as ACP countries we should say: European Union, you are not fulfilling your obligations. You have to try harder and you have to set extra money aside to compensate for the damage this is doing to us. </P>
+<P ALIGN="JUSTIFY">H.v.d.V.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">ACP-EU Council in Apia</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were no real surprises or unexpected developments at the ACP-EU Council meeting which took place in Apia, Western Samoa, on 27 and 28 June, 1996. The session was preceded by an ACP Council, which saw the adoption of three important decisions. The first of these was the appointment of a new ACP Secretary-6eneral, Mr Ng'andu P. Magande of Zambia. The post had been vacant for some time, following deadlock within the ACP Group over a successor to Berhane Ghebray (see issue 155 of The Courier, p.6). The ministers also agreed to hold a summit of ACP heads of government in Libreville, Gabon, during the second half of 1997. This meeting is expected to focus heavily on the future of ACPEU relations once the present Lom&eacute; Convention has expired.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the substantive area, the ACP Council adopted a resolution deploring the suspension of cooperation with Equatorial Guinea. Ministers urged the European Union to make use of the procedure in Article 366a of the revised Lom&eacute; Convention, and to set in train the consultation procedure envisaged in this provision.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This issue was raised again by the ACP side at the subsequent ACP-EU Council. This meeting, which was presided over by Mrs Toya (Italian Under Secretary for Foreign Affairs) and Mr Syamujaye (Zambia's Trade Minister) had a relatively light agenda. There was a discussion about the Commission proposal for a directive on the use of vegetable fats, other than cocoa fat, in chocolate (see issue 158 of The Courier, p.35). Somalia also featured in the debate, with representatives agreeing on the need to find ways of allowing this country to benefit from Lom&eacute; Convention provisions. The civil conflict in Somalia, and the absence of an effective central administration have prevented the deployment of regular development aid for many years, although significant amounts of emergency assistance have been and are still being provided.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, the ACP-EU Council approved two reports drawn up by the development finance cooperation subcommittee and commodities sub-committee respectively. Representatives were able to reach a compromise on two outstanding points of contention in the resolution on development finance relating to tenders and the dissemination of the user's guide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note was taken of the number of countries that have so far lodged instruments of ratification for the revisad Lom&eacute; Convention (Mauritius agreement). At the time of the Apia meeting, only nine countries had ratified: seven on the ACP side (Barbados, Dominica, Equatorial Guinea, Jamaica, Malawi, Mauritius and Solomon Islands) and two EU Member States (Denmark and Sweden). Appeals were made for the contracting parties to speed up their ratification procedures so that the Eighth European Development Fund can come on stream as speedily as possible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The next ACP-EU Council meeting will take place in Luxembourg on 24 and 25 April 1997.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government of Western Samoa deserves a special mention for the warmth of their hospitality and the efficient way in which they organised the Council meeting. Delegates from all sides were keen to express their appreciation of the host country's efforts, which ensured the smooth running of the various meetings and gave the visitors a real taste of this Pacific country's unique culture. ed. S.H.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">New ACP Secretary-General</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ng`andu Peter Magande, is no stranger to the challenge of development at the grassroots. The new Secretary-General of the ACP Group, who was born in 1947, began his working career as a provincial development officer, planning and supervising projects in the Southern Province of his native Zambia. He is an economics graduate of the University of Zambia and also holds a master's degree in agricultural economics from Makerere university, Uganda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From working in the field, he moved into government administration, rising to the position of Permanent Secretary-a post which he held in a number of ministries. Since the mid-1980s, he has had key jobs in a number of Zambian enterprises (including Managing Director of the Zambia National Commercial Bank) His most recent work has been on a project to develop private sector participation in agricultural input and produce marketing.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Kenya's economy in the 1990s</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Elisabeth Pape</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya has enjoyed rare political stability since independence in 1963. It is one of the most famous holiday destinations in Africa, with abundant wildlife, fine beaches and stunning scenery. But despite having the most advanced economy in East Africa, it is still one of the world's poorest countries. Over 11 million Kenyans live below the poverty line. But better times may be ahead. The Government has embarked on an ambitious reform programme which promises to lay the foundations for strong growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The early 1990s marked the worst time in Kenyan history, in economic development terms. Real GDP growth dropped from 4.3% in 1990 to 2.1% in 1991 and was almost zero in 1992 and 1993. This poor performance was due to drought, structural rigidities, lack of monetary discipline, non-enforcement of banking regulations, and reduced donor assistance. While Kenya was used to receiving substantial foreign aid inflows, the present decade began with growing tensions between Government and donors. In the new post-Cold War atmosphere, the latter wanted to see political and economic reforms, and in November 1991 they decided to halt guick-disbursing aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Multi-party elections in December 1992 did not immediately restore relations with the donors, in particular as they were accompanied by a lack of fiscal and monetary discipline whose effects threatened economic ruin. Monetary expansion was fuelled, among other things, by discretionary exemptions to Banking Act provisions, which enabled over-borrowing by certain 'political' banks from the Central Bank. In early 1993, things came to a head. Foreign currency reserves were down to just a few weeks of imports, the banking system was on the verge of collapse, and consumer prices had shot up. Against this background, the Government went for a comprehensive, IMF-supported structural adjustment programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A number of far-reaching reforms were implemented with unprecedented speed. Exchange restrictions were removed, import licensing was ended, import procedures were made easier and tariffs were reduced. The export license requirement was also lifted and price controls were abolished. In March 1993, the Central Bank (CBK) began to tighten monetary policy. By issuing large amounts of treasury bills, it soaked up most of the excess liquidity which had been injected the previous year. There was also stricter bank supervision and a number of weak financial institutions were closed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Structural reforms</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Government began structural reforms aimed at reducing its own role in the economy in favour of the private sector. The privatisation programme, begun in 1991, was accelerated. By the end of 1995, the authorities had divested more than half of the 211 non-strategic parastatals-though critics complained the process often lacked transparency. The Government also substantially reduced its fiscal deficit through, above all, an improved revenue policy. The deficit fell from 11.4% of GDP in 1992/93 to 2.5% in 1994/95. The number of civil servants was reduced, mainly through voluntary early retirement, so that, by the end of 1995, the service had been trimmed by more than 30 000 (10% of the payroll).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1995, the reform programme lost momentum as proponents of the old and the new systems locked horns. Vested interests stood in the way of more radical reforms. Temporary import bans on maize and sugar were reimposed, key parastatal reforms were delayed and expensive but economically dubious projects were approved outside normal budgetary procedures. These included an international airport in Eldoret, a presidential jet and an identity card project. These further delayed the resumption of balance of payments support by the Bretton Woods Institutions and contributed to the frustration of efforts to improve relations with donors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The economic crisis peaked in early 1993 and the shilling was sharply devalued. The official rate went from about KSh 36 to the dollar at the end of 1992 to KSh 60 in April 1993. On the market, the currency was being traded at a premium of more than 30% and that continued until July-i.e. about two months after the removal of exchange restrictions. The market premium then started to decline and the two rates converged in mid-October when the shilling stood at 69 to the dollar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The high interest rate on treasury bills under the liberalised foreign exchange regime was the main reason behind strong currency inflows which began in October 1993. Other factors, whose exact impact is difficult to gauge, included capital flight from neighbouring crisis-torn countries, the international money laundering one normally finds in places with newly liberalised foreign exchange regimes, and a surplus in the current account position. The shilling then started to rise, despite the CBK's massive currency purchases which led to a build up of reserves to the equivalent of six months of imports. The appreciation continued up to October 1994: indeed, at one point, the shilling reached a high of 35 to the dollar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That was the turning point. Strong import demand, fuelled in particular by a surge in oil imports in the wake of petroleum market liberalisation, and an outflow of portfolio investments due to lower interest rates, weakened the currency. By mid-1995, after two sharp falls, it reached a rate of 56 to the dollar. Since then, it has been relatively stable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic recovery</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Real GDP grew by 3% in 1994 and an estimated 5% in 1995. Good weather certainly helped, but the economy also benefited from the Government's reforms. Agriculture, the mainstay, grew by 2.8% in 1994 and by more than 5% in 1995. This compares with negative growth rates in 1992-93, when the sector was hard hit by bad weather. Elsewhere, the trends were more mixed. Many producers for the local market were affected by trade liberalisation and, in 1994, by the strong shilling. The former created a highly competitive environment almost overnight-after years of cosy protectionism. For cloth manufacturers, the liberalisation of imports of second-hand clothing further aggravated the problem. In 1994, the clothing sector's output dropped 35%. Tourism, the main foreign exchange earner, fared quite well in volume terms in 1994 despite the strong shilling. But while turnover may have gone up, it is likely that many operators did not earn enough extra to cover their increased local currency costs. In 1995, visitor arrivals fell by 20% to the lowest figure since 1988. In consequence, tourism earnings fell by a quarter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As intended, liberalisation led to higher trade volumes. In 1994, exports ( + 16%) rose by more than imports ( + 13%) in value terms, but the position was reversed in 1995 when the latter jumped by 35% while the former were 14% lower. One good sign was that the highest import growth was in industrial supplies and machinery (60% up) but the fact that the deficit almost doubled to reach record levels was obviously a cause for concern.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A major revolution has also taken place in trade flows. In 1994, for the first time, Uganda overtook the UK as the biggest importer of Kenyan goods. In the same year, the value of Kenya's exports to African countries moved ahead of its combined exports to Europe and North America.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During 1994, the Nairobi Stock Exchange proved to be one of the worid's best-performing stock markets, the value of shares rising by 80%.1995 was disappointing, however. Although foreigners were allowed to invest for the first time, the index nonetheless fell by 25%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fighting inflation has been the CBK's main objective since 1993 and a tight monetary policy has brought the problem under control. Inflation dropped from 46% in 1993 to 29% in 1994 and to below 2% in 1995. Recently, however, an upward trend has bean observed. This follows a money supply increase far in excess of the expansion of economic activity, and is mainly due to a substitution of treasury bills for borrowing from the Central Bank since the end of 1994. If inflation is to remain within the 5% target for 1996-which already seemed highly unlikely by the middle of the year - the trend needs to be speedily reversed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initially, the main way of mopping up excess liquidity was through the sale of treasury bills. When the sales began in March 1993, there was a huge liquidity overhang and high interest rates had to be offered to take money out of the market quickly. The rate earned on 90-day bills-which became the lead interest rate in the economy- rose from 17% to 80% between March and July 1993. It then declined steadily, reaching 18% at the end of 1994. This prompted an outflow of short-term capital, leading to currency depreciation and lower foreign reserves. Since mid 1995, treasury bill rates have been back above 20% and this seems to have stabilised the foreign exchange situation. It is generally believed that the high prevailing real interest rates are a major obstacle to investment and economic growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interest on domestic debt is still a big item in the state budget, although, the situation is much improved, thanks to the reduction in the stock of treasury bills and lower interest rates. In fiscal year 1993/94, interest payments on domestic debt alone swallowed one third of total gavernnnent expenditure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agriculture sector employs 70% of the total labour force and generates more than a quarter of Kenya's GDP. Much of industry is linked to agricultural processing, and tea, coffee and horticultural products are Kenya's major foreign exchange earners after tourism. The marketing of key farm products is dominated by large parastatals and cooperatives which are often run like parastatals. Most marketing organisations have been hard hit by the liberalisation, which brought both inefficiency and corruption to light. Tea growers have complained about improprieties at the Kenya Tea Development Authority. Imported sugar flooded the local market, often without paying import duties, leaving the mills with huge stocks. This, in turn, created severe cash flow problems. Most sugar farmers have not been paid for months. Kenya Cooperative Creameries was not able to pay farmers for milk deliveries for up to half a year, and could only start servicing the arrears when the Government came to its rescue with KSh 800 million in January 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Formidable challenges</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya's labour force, around 12.5 million in 1996, is growing at more than 4% a year. This means that at least half a million people enter the job market annually. The challenge of absorbing the new workers is formidable. Studies show that any strategy to deal with this must be based on three pillars: smallholder agriculture (to absorb most of the growth in the rural labour force), continuing substantial job creation in the informal sector, and high real GDP growth (+8% per year is needed to ensure that the modem sector absorbs a significant number of workers).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Informal sector employment has risen rapidly (up by 15-20% a year since 1991). By 1994, for the first time, there were more people working here than in the modern economy. The informal sector covers semi-organised and unregulated activities largely under taken by self-employed people or employers with just a few workers. Typically, they do not comply fully with tax, registration, and licensing rules, and this sometimes leads to conflict with the authorities. Workers are often paid below the minimum wage and have no social security. For many, the informal sector is, therefore, an 'employer' of last resort.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is estimated that almost 50% of rural people and 30% of urban residents live in absolute poverty- unable to meet their minimum requirements for food and essential non-food items. While the percentage has remained fairly stable in recent decades, the increase in the number of 'absolute' poor is alarming. So too is the extent of the poverty: the gap between these people's minimum needs and their actual disposable income has reportedly increased over the last ten years. The bulk of the poor live in the central and western parts of the country, which have the best agricultural potential, the rich soils having always attracted settlers. For decades there was enough land to go around, but demographic trends have finally started to take their toll. The size of landholding has declined continuously, in many cases reaching levels which are no longer capable of sustaining a family.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There has been some progress in restructuring parastatals, but much remains to be done. The performance of key parastatals has been unsatisfactory by international standards and this has constrained growth. At Mombasa port, which is managed by the Kenya Ports Authority, handling charges are 50% higher than the global average, while container turnover is three times slower. Rail transport is unreliable, slow and more expensive than road haulage. The Kenya Power and Lighting Company has a shortage of generating capacity which means periodic power cuts. And intervention in the maize market by the National Cereals and Produce Board- at above-market prices-has prevented private sector involvement as well as placing a heavy burden on government finances. The Board has posted annual operating losses of between KSh 1.8bn and KSh 2.5bn each fiscal year since 1992/93.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corruption, misuse of funds, and the politics of patronage remain endemic and these clearly distort development. Elimination of corruption has been an aim of most reform programmes but it seems that the effect so far has only been to change its form. Trade liberalisation has killed cash cows such as import and foreign exchange licences, and the commercialisation of parastatals has stopped them from doing deals with cronies which were profitable only for the latter. But other forms of non-acceptable wealth accumulation have emerged. In the early 1990s, alleged exports of gold and diamonds are thought to have resulted in a loss of KSh 7 billion of public funds. Land grabbing has also become widespread. This either involves land being sold to individuals or companies with well-established political connections at well below market prices, or the purchase of land by public institutions from the same individuals or companies at inflated prices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After delays because of political differences, cooperation between the three states of the former East African Community (Uganda, Tanzania and Kenya) was revived in early 1996. The EAC Secretariat, based in Arusha, is headed by a Kenyan, Francis Muthaura, a former ambassador in Brussels. For the three countries, the new cooperation aims at facilitating movements of people, capital and trade within the region, and harmonisation of external tariffs and investment regulations. Currencies will be fully convertible. This revived cooperation is expected to have a major growth impact. The Nairobi Stock Exchange is currently assisting Kampala and Dar es Salaam to set up their own exchanges. And the NSE Chairman, Jimnah Mbaru, sees the future not only in a cross-listing of companies in the three places, but in a regional stock exchange.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Policy framework</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Policy Framework Paper (PFP) for 1996-1998, which was published in February ahead of the donors' Consultative Group (CG) Meeting, was highly applauded for both its content and form. The programme, which the media has dubbed 'the big push', promises finally to crack most of the 'hard nuts' of previous reform agendas, in particular in the parastatal and public sector. It also lays down measures aimed at supporting fiscal and monetary discipline through the next elections. These include cutting the budget deficit to 1.5 % of GDP by 1997/98, a tight monetary policy, and more autonomy for the Central Bank. In addition, it tackles some areas'that have emerged as avenues of corruption in recent years, such as the National Social Security Fund. While previous PFPs were highly confidential, this one was published, and the President appointed a Commission chaired by himself to oversee its implementation. These are seen as important steps in bridging the credibility gap which threatened to open up again in 1995. Donors are prepared to support the reform agenda and are eager to see it implemented speedily. Shortly after the positive outcome of the CG meeting, the IMF approved a three-year Enhanced Structural Adjustment Facility programme for a total of $220m. The World Bank is expected to follow suit with a credit of $85m.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An increasing number of donors, however, have pointed to the link between democratic governance/ human rights issues on the one hand, and aid and investment flows on the other. If Kenya is to meet its ambitious targets and turn into a newly-industrialising country by 2010, foreign inflows will be vital. The point was succinctly put by a delegate to the CG meeting. 'If its (the Government's) economic successes are matched by a commitment to democracy and human rights, Kenya may yet prove that surging economic growth is not just for Asian tigers, but for African lions, too.' The period leading up to the next general election will be the acid test. </P>
+<P ALIGN="JUSTIFY">E.P. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Country report</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Mali : An omnipresent sense of history</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some countries have a strong folk memory. Despite its size, Mali appears hemmed in by its frontiers. For more than a thousand years, this state was a splendid empire, constantly spreading outward and reflecting the history of the African continent with its conquests and alliances, reversals of fortune and moments of glory. At its height, it extended from the Atlantic to the Sudanese border, from the south of Morocco to the north of Nigeria. Mali's history rests in the minds of its people rather than in any structures inherited from the past. This acts as an antidote to the 'amnesia' often brought on by colonisation, which has the effect of paralysing the future. Although poor, the country has a well-established sense of its place in the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A racial melting pot</P>
+<P ALIGN="JUSTIFY">`</P>
+<P ALIGN="JUSTIFY">On the eve of colonisation, Mali was known es 'west Sudan'. In 1924, the territory then known as 'French Sudan' was split up and small portions of the Malian nation were incorporated into the seven states bordering it-a move certainly not calculated to have a cohesive effect on the remnants of the old empire. Mali has long been a melting pot of races, ethnic groups and cultures. They have learned to live together- intermingling, sometimes forming unexpected alliances, and occasionally fighting one another. The result today is a potpourri where true racial or ethnic confrontation is difficult to imagine. The interplay of history and the mixing of ethnic groups, families and individuals, has created what one intellectual de scribed to us as 'the anti Rwanda vaccine'. Historical mythology offers, perhaps, further evidence of the fusion of cultures in this country. As in ancient Greece or Rome, to take European examples, each ethnic group and each Malian empire, was 'backed' by a host of gods, spirits and totems. In this nebulous world, where dreams beget history and where vastly differing ethnic groups can trace themselves back to a common ancestor, the result was a multiplicity of interrelationships. Under various names, the python totem belongs to many different peoples, including the Peal, Ma/inke and Sarakolle. A study of the migrations of the peoples who make up Mali also reveals a great many relationships - for example, between the Dogon, who are black, and the Shongoi; who are more half-caste. They regard one another as cousins, originating from Aswan in Egypt.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malians appear to share a genuine sense of belonging in keeping with their shared culture. The 'people' of Mali came into being long before the state of the same name. The guerilla war fought in recent years by the Tuaregs (this is the English plural, Tuareg already being the plural form of Targul) against the Malian army, is often viewed abroad as a struggle between whites (or Arabs) and blacks. But this is an illusion. Although the Tuaregs are probably the only 'white' minority in the country, they are an integral ingredient in the melting pot. They are also known as 'Kel-Tamasheq' - those who speak Tamashek, which was originally the language of their Bella slaves. Like all the country's ethnic groups, they have dominated and have in turn been dominated. They have forged alliances with one another, and, more commonly, have united against Arab or Berber invasions. The relative absence of bitterness overall is probably due to the fact that each of Mali's peoples has had its era of glory and imperial dominance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali is lucky to have such knowledge of its history. For centuries, the most precise details have been collected by the griots. The same role has also been played by the many secret societies which have initiation periods lasting, in some cases, up to 50 years. They were, and sometimes still are, repositories for the secrets of history, magic, astrology and science, and also for the symbols of power-the religious objects and artefacts of the former emperors. There are written sources as well, something which is quite rare in Africa. These have been transcribed since the beginning of the millennium and, in recent decades, close collaboration between historians, griots and members of traditional societies has enabled a deeper knowledge to be gained of Mali's history.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A rich empire</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Asselar Man, discovered near Timbuktu in the centre of Mali, was a contemporary of Cro Magnon Man. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cave paintings from five thousand B.C. reveal similarities with those in Egypt and are probably the work of migrant populations from the east, who moved into Mali as the Sahara Desert expanded. Less reliable sources state that interbred populations of Jews and Egyptians under the command of an officer of the Pharaoh Dinga created the Soninke dynasty (originating from Aswan). These people probably laid the found ations of the first great Malian empire, that of Ouagadou. Other sources, equally unreliable, report that they were probably Judaeo-Syrians who arrived at the end of the third century A.D. and found a population already in place. What is more or less certain is that, during the first millennium, a Soninke dynasty was installed around the current frontier between Mauritania and Mali and that 40 princes ruled it in succession in the period prior to 750 A.D. Initially, these rulers were white but, with increasing intermarriage, their skins became darker and darker. To Arab chroniclers, Mali came to be known as Bafour or Bilad es-Soudan (the country of the blacks). At the beginning of the second millennium, the Ouagadou empire held sway over several kingdoms in the south, including the Nigerian delta and a number of Berber principalities. Documents dating from this period have replaced the name Ouagadou with that of Ghana, by analogy, perhaps, with the emperor's title. The empire was already very rich, the richest in the world according to an Arab chronicler who visited it in 970. A work by the writer A/ Bakri, which appeared a century later (1087) went into great detail about the empire's organisation-the system of matrilinear succession, the role of councils of dignitaries, and the capital, Koumbi (whose foundations were discovered in 1914 in southern Mauritania). This city was divided into two districts, one of these being the sacred, imperial city, home to the empire's python totem to which a young girl was sacrificed every year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A story of courage</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The killing of the snake totem is the most significant myths in the country's history. The hero of the story is Amadou Sefedokete whose love for his beautiful fiancee Sia (who was about to be offered in sacrifice), prompted him to descend into the monster's lair and confront it. By killing the totem, he broke the thread of countless generations before him, who had carried out the ritual sacrifice. He is still remembered for this magnificent action, based on love and a sense of nobility, and he remains a subject for artists of all types. His brave action still causes young lovers in Africa to shudder in admiration. However, this act of deicide brought about a reversal of fortunes. The monster's seven heads, which the young hero is said to have cut off one after the other, are reputed to have been scattered to the four comers of the earth, thereby dispersing the empire's riches and leaving it penniless. The true story is more prosaic. Ghana's wealth was eyed greedily by the Arabs and Berbers who had long traded with it. The empire's resistance in the face of Islam gave Moroccan religious fanatics a pretext for organising a jihad. It was invaded by an army of 30000 devotees supported by forces from some of the empire's black vassal states. The 'holy war' began in 1042 ending 34 years later with the occupation of Koumbi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The occupation did not last long but was followed by internal clan wars which brought about the end of an era. Restoration came about at the end of the 72th century , in the small Sosso kingdom, south of Ouagadou (also set up by a small group of Sonink&eacute;). One of the minor kings called Soumangourou Diarasso dreamed of recreating Ghana's empire, and, in 1203, he succeeded in sacking the ancient capital of Koumbi in a move designed to establish his own dynasty. This was an important symbolic act and in the fierce war which followed, Soumangourou subjugated Mand&eacute;, a region which was overflowing with wealth. One of Africa's greatest heroes, Soundjata, rose up against him. He was supposedly the legitimate heir to the Mandingo throne, but was unable to walk, having been born an invalid of a deformed mother who had been married at the recommendation of the king's sorcerer. His young half-brother took his place on the throne and sent the paralysed prince into exile. At the age of 18, Soundjata decided to seize his own place in history and a 'giant' was thus bom. In 1235, his army fought that of the bloodthirsty Sosso monarch whom he himself is said to have cut down in an extraordinary battle. It was a fight which, according to the legends, saw the use of all types of weapon, including magic. Soundjata had forged a grand alliance in order to gain victory. Rather than reducing to vassalage the small kingdoms which had allied themselves with him, the new emperor decided to form them into a federation-although he wisely declared that from Niani (his capital), 'I shall see all'. His empire took the name of 'Mali' (the hippopotamus) on account of that animal's strength and mastery of bath water and land. For 20 years, the empire was to stretch as far as the Atlantic Ocean. Its structure, based on a number of warrior clans, craftsmen, freemen and marabous, is still characteristic of Mali and neighbouring countries today. The empire was rich in gold once again but also in terms of agricultural organisation with the development of cotton and groundout farming. Soundjata disappeared mysteriously in 1255, leaving a prosperous empire.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Conquest' of America?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1285, there was a struggle for succession between two princes and a third, Prince Sakoura (a freed slave), took advantage of the quarrel to take power for himself. Sakoura expanded the empire by subjugating the Timbuktu Tuaregs and the Gao Shongoi: After his short reign, a genuine heir of Soundjata, Aboubakar II, ascended the throne. He had his eye on conquests over the seas and, according to the story, he set sail westwards leading a fleet of 2000 vessels. He was never seen again. However, recent studies favour the hypothesis that he was not lost at sea as had always been supposed' but did, in fact, reach the Americas. A series of ineffective monarchs succeeded this 'conqueror of the impossible', who preceded Christopher Columbus by 200 years, leaving little real impression on history other than the records of their exuberant behaviour. One of them, for example, went on a pilgrimage to Mecca in 1324 with a reported retinue of 60 000 and distributed considerable amounts of gold to all the dignitaries he encountered in that holy place. These kings, however, are acknowledged as having preserved the empire's unity, guaranteeing order without repression and allowing wide religious, moral and sexual tolerance, even for married women. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The kingdom centred on Gao dates back to at least the first millennium but it was usually a vassal of the Ouagadou empire and of Mali. One of its kings, Sonny Ali Ber (known as Sonny the Great), came to the throne in 1464, profiting from the decay of the Mali empire. His reign was marked by a bitter struggle against the Ul&eacute;mas of Timbuktu who, over a period of four centuries following the Almoravid conquest, had converted a large portion of the empire to Islam. The circumstances of Sonny's disappearance are uncertain, but he is thought to have drowned in 1492, the year when a certain Genoese navigator was to achieve the ancient goal of 'discovering' the Malian empire.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sonny Ber's successor did not last long in the face of Islamic expansion. The new Askia dynasty was installed to lead the Shongoi empire, and this expanded with the annexation of Dahomey and part of Nigeria. However, a small part of the former Mali empire never passed under their rule. The Askia dynasty blew hot and cold in terms of religious fervour. Tyrannical at first, it later took a softer line. Under the reign of one monarch, the Gao court based in the university city of Timbuktu became a place of exceptional refinement-only to slide once again into a state of intolerance. One of the Askias, having destroyed the last symbols of the former Mali empire, the city of Niani, set upon his former Moroccan allies. Another emperor, Askia Daoud (1549-1582), turned out to be a fine administrator. He developed agriculture and set up a genuine bank in Gaol War with Morocco continued throughout his reign and beyond. In 1584, imperial force defeated 20 000 Moroccan soldiers, winning a victory which might have been decisive had it not been for internal dissent. This weakened the Askia side and enabled Morocco, with a band of Spanish mercenaries, to take over the empire, following a battle in April 1591. Success was due, above all on this occasion, to the firearms deployed by the winning side. Such weapons were unknown to the 45 000 Malian cavalry and infantry who were engaged. It also turned out to be a Pyrrhic victory. The occupying troops sent the great scholars from Timbuktu University to Morocco, where their peers took up their cause. Moreover, the foreign soldiers were won over by the easy life in Mali-and one of the first results of their presence was a big increase in the half-caste population. In 1612, the troops rejected the Moroccan command: the occupation was at an end and the last few Moroccans were later expelled from Timbuktu by the Tuaregs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Black religious proselytism and colonisation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To each dog his day. In the 17th century, the Bambaras set up an empire around Segou, but the debauched lifestyle of several of the sovereigns and disapproval of the part they played in the slave trade proved to be their downfall. Once again, the history of the country was to be shaped by a slave- Ngolo Diarra-who founded his dynasty in 1766. He was able to restore a degree of prestige to the kingdom, but his efforts were undermined after his death. As a reaction, a proselytising Black Islam then began to evolve.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Massina became a theocratic state around the beginning of the 19th century, in common with other kingdoms which appeared at the same time. One of their most famous rulers, the conqueror El Hadj Oumar, was defeated by the troops of the French General Faidherbe who forced him to give up West Senegal. The days of Malian independence were now numbered. The courage of his successor only delayed the progress of French colonisation, which finally prevailed at the end of the century.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Resistance fighters carried on the war from other points in the old empire, particularly from what is now Guinea. The country was dismantled by the colonial system and pacified, but the end of the Second World War and the return of African soldiers brought a renewed desire for independence. French Sudan became the rallying point for freedom fighters in the French colonies-the old dream of reunification was not dead and buried. In 1946, the Rassemblement Democratique Africain was set up, later to become the USRDA (Union soudanaise-Rassemblement democratique africain). In 1956, the future architect of Mali's independence, Modibo Keita, was appointed leader of the movement and elected to represent the 'Sudan' in the French Assembly. A 'Malian Federation' project was drawn up to include Dahomey (Benin), Upper Volta (Burkina Faso), Senegal and 'Sudan' (Mali). A constituent assembly of independence movement representatives was set up in 1959. However, the constitution adopted by the local Malian and Senegalese assemblies was rejected by the other two. The Federation now had only two members but was nonetheless proclaimed independent on 20 June 1960. In the event, the spirit of unity was lacking and, on the pretext of a rivalry between the two leaders (the 'Sudanese' Modibo Keita and the Senegalese Mamadou Dia), Senegal withdrew from the union in August. On 22 September 1960, the 'Sudan', now without an outlet to the sea, adopted one of the most prestigious names in its history: Mali.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new state was landlocked not only geographically but also, very soon, politically. Modibo Keita's socialist agenda prompted foreign investors to pull out, and the country was organised increasingly as a 'people's democracy'. Fortunately, the repression was not excessive but a sizeable proportion of the population disapproved of the system that had been chosen. Mali and Guinea still had modest aspirations to their old dream of unification. The founder of the Republic, Modibo Keita, was overthrown by a military coup on 19 November 1968. More than the break-up by colonisation, which left dreams of Sudan being reconstituted, this military putsch sounded the knell of the old empire. Mali became just another state whose colonial and post-colonial eras have been marked by a lack of success. Nevertheless, a sense of history is still omnipresent. </P>
+<P ALIGN="JUSTIFY">Hegel Goueier</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Three republics to create one democracy</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is just something you have to get used to-in French-speaking Africa, virtually all countries have imitated France in assigning a number to each republic formed under a new constitution. At the time of its independence on 20 June 1960, Mali was a federation of two states; Senegal and the former 'French Sudan'. It was an alliance which failed after only a few weeks'existence end 'French Sudan' then adopted one of its most prestigious former names- Mali. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first regime, under Modibo Keita, became increasingly unpopular as its form of 'tropical' marxism caused it to become more and more isolated. One of its main shortcomings was its unrealistic five-year plans, none of which were ever implemented. Discontent became rife among various social groups. including the farmers who, opposed collectivisation and were adept at passive resistance which they employed to disrupt the supply of produce. The regime also modelled itself on the so-called 'people's democracies' in certain respects. For instance, it made a determined effort to improve education, health and social justice, while refraining from the more dictatorial excesses that often characterised such systems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initially welcomed by some sections of the population, the November 1968 putsch, by Lieutenant Moussa Traore quickly fumed into dictatorship although it was to be more than 10 years before there were any significant anti-government protests. At the end of 1990, opponents of the regime openly set up organisations which claimed opposition-party status. One of these was ADEMA (the Alliance for Democracy in Mali), formed by the current President of the Republic, Alpha Oumar Konare. Marches calling for a multi-party state attracted the support of tens of thousands of people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The dictator then sought to neutralise the opposition, beginning with the Tuaregs in the north who had been waging a guerilla war. This conflict was viewed by many as the 'front line' in the people's struggle against dictatorship, and the Tuareg cause was supported by opposition movements. The government, which had for some time opted for 'soft' repression, now revealed its claws and in January 1991 it began to imprison student leaders. The streets were filled with armoured vehicles and the first death amongst the students brought condemnation. Repression reached its height on 22 March 1991, when several dozen students were killed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prior to this, in February 1991, Moussa Traore's UDPM (Democratic Union of the Malian People) came out in support of a multi-party system - a move which marked the beginning of the end of the regime. The day after the students were killed, a democracy coordination committee launched an appeal for a general strike, to last until the dictator was overthrown. This began on 26 March, and amounted, in effect, to a 'democratic' coup d'etat. Its instigator was Lieutenant Colonel Amadou Toumani Toure, who took charge of the transition to-tether with the democratic movements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The former dictator was arrested and put on trial for his crimes. He was later condemned to death but his sentence was recently commuted by President Konare.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Tuareg guerilla war continued despite the government's conciliatory attitude. The new administration also had to deal with a number of social claims which had long been stifled by the dictatorship. However, popular support for the regime remained firm. The new constitution was adopted virtually unanimously in a January 1992 referendum and, a week later, ADEMA won the municipal elections, the first in a series of electoral victories for Alpha Oumar Konare. He went on to win the Presidential election (for the Third Republic) in April, with almost 70% of the vote. Meanwhile, negotiations with the Tuareg rebels resulted only in signatures on agreements which were not observed. The situation grew worse with the Ghanda Koy counter-offensive, but this in turn led to a seemingly viable accord between the Azawad Arab Islamic front, the most important guerilla movement, and the Malian government. Last March, President Konare presided over an enormous bonfire of weapons seized from the former guerilla fighters. The flames lit up the skies above Timbuktoo, the symbol par excellence of rapprochement between the peoples of Mali.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the beginning of January 1994, the regime suffered the effects of the devaluation of the CFA franc. Economic liberalisation had enabled Mali to improve its macroeconomic position, but social discontent, particularly in the towns and cities, demonstrated that the average citizen was continuing to suffer economic hardship. The President still enjoys considerable support, and political democracy is greatly appreciated. Obviously, the government cannot be blamed for all the difficulties facing the country. There is, for example, a lack of professionalism in the press. However, it could have given a lead in the case of the State media, which still studiously avoids criticising the government's actions. The administration has also been taken to task for its apparently lax attitude towards 'economic' misdemeanours.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Next year will see a series of elections. The government views these with apprehension, although it has stolen a march over its rivals by signing a political accord with several small parties. Opposition is centred around the MPR (Patriotic Movement for Renewal), the revamped former party of the dictator Moussa Traore. This has undergone a 'facelift, and now seems to be regaining support. lts trump card is decentralisation. Its former leaders, who held total power for a quarter of a century, can take advantage of the network of contacts they built up. The US-ADA, the party of the Republic's founder, Modibo Keita, which until recently appeared to be the herald of change, seems lately to have restricted its role to that of arbiter. Surprises are in the offing, but one thing is certain: the Third Republic's constitution will remain the guarantee of democracy in Mali. </P>
+<P ALIGN="JUSTIFY">H.G.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with Ali N. Diallo, President of the National Assembly</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Mali, the army has learnt if from the past</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali's institutions were radically remodelled in the wake of the recent vote on decentralisation. This is aimed at allowing, among other things, a degree of autonomy for the north of the country-which is essential to guarantee national reconciliation. The sudden growth in the number of small towns and villages may result in some political surprises during the long e/ection campaign period which is due to begin early next year. The President of the National Assembly, Ali N. Diallo, finds himself in a pivotal position: his Adema (A/fiance for Democracy in Mali) party current/y holds a comfortable majority in Parliament. With democracy being consolidated in Mali, he must find this an exhilarating time. Our frst question touched on this</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-This is certainly an excellent time to be in Mali, but freedom is the most difficult of man's needs to satisfy. Our National Assembly has 12 parties and most people in our country are inspired by ideas based on tolerance and respect for the right to be different. The main concern of those of us who lead the party currently in the majority, is to question constantly whether we are necessarily always right. We have a comfortable majority-72 members out of 115-but this certainly doesn't mean that the National Assembly is just a rubber stamp.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· There is, of course, another stumbling block when one has such a large majority, which is the possibility of internal divisions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Yes, I would agree with you there. Mali's MPs have to realise that they came into this business after a three-stage process. First there was a popular uprising, then the army intervened to put an end to the bloodbath.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, we had the high level national conference to draft the constitution, the electoral code and the charter for the country's parties. MPs, therefore, must always bear in mind that, though they can claim legitimacy on the basis of the revolution, there is also a republican legitimacy they ought to respect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The second phase in the process was the intervention of the army-are you not a*aid that the 'Niger syndrome'will raise its ugly head in Mali, too ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Naturally, MPs have seen what happened in Niger and elsewhere, but fear is tempered here because officers in Mali's forces have also given a great deal of thought to the effects of military dictatorship. Democrats and republicans within the armed forces are very aware that only a minority of men in uniform profited to any degree from the previous regime.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think that because Mali had what might be called a 'moderate' dictatorship, it is now in a better position than it would have been had the previous administration been more repressive ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Let me put it this way. The military dictatorship went through three different stages. During the first stage, just after the coup on 19 November 1968, the junta chose Mao Tse Tung as a model, hammering home the idea that power could be won by force of arms-and it was carried away by the popular acclaim it initially received. Subsequent popular resistance then took them by surprise. People wanted more freedom, but they also wanted to keep what they had gained in social matters. Army officers asked the protestors to abandon their action so that normal constitutional life could be resumed, but the trade unions had their own ideas. They advocated things which the people in power opposed. The ensuing repression was therefore fierce.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was a second phase during which the military were at odds with one another over the leadership question. The popular view was that the country had fourteen different heads of state at that time. This went on until 28 February 1978 when there was a brief Iuli and they were tempted to return power to the civil authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Then came the third phase when, despite appearances, poverty was on the increase. At first, Malians said that there were two 'IMFs' on the loose in Mali-the International Monetary Fund and the intimate circle surrounding the Moussa family. When the social foundation of the regime contracted, and all the country's business became concentrated in the hands of Moussa, his wife and her relations, the popular forces went on the offensive. This was a period of vociferous protest. Moussa Traore reacted with brutality: hence the 200 dead amongst the schoolchildren and students who were protesting- we will never know the exact number.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yet, the former regime could be said to have made the crucial economic choices which your government has continued with. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I wouldn't agree with that. There was a half-hearted discussion at the time about liberalising the economy but, in reality, bureaucracy got in the way. It is the economic laws voted in by ourselves which form the true basis of a liberal economy. However, if you really want to look to the past, I would say that it was the February 1967 accords signed between Mali and France, when we came back into the franc zone, which set the whole process rolling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The Tuaregs and the government have just signed an agreement but the question of the north of the country is still a sensitive one. What are your views on this subject ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-The problem in the north of Mali is extremely complex. First, the Malian nation is made up of a patchwork of minorities, the largest being the Ban Mana (Ed. 'Bambara' in the colonial vocabulary), but no ethnic group is larger than all the others put together. Second, all groups have, at one time or another, held supremacy. But the fact is that the peoples involved have all lived in the same area throughout history- they have shared joys and sorrows, and their blood has mingled on Malian soil. l would accept that the Malian nation is not as well consolidated as it should be, but it is arguably one of the most advanced in the sub-region in terms of its constitution-though I don't mean to sound chauvinistic here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anyway, the problem in the north of the country seems to me to be one of development. The various regions have not all developed at the same rate on account of climate differences. In addition, the dictatorship did not show any great respect for minorities - although it did not direct its actions solely against the Tuaregs, who resorted to arms. The Tuaregs exaggerated the mistreatment they had suffered because they were unfamiliar with what was happening in the rest of the country. In fact, Moussa Traore oppressed everyone: the French-style Jacobin state we inherited did not allow for regional differences. After independence, the regime redoubled its efforts to centralise the state. both because it was Jacobin in outlook and because of Modibo Keita's communist leanings. In 1959, the French forced the Tamashek (ea. 'Tuaregs') to secede-Max Lejeune and Houphouet Boigny were mixed up in all that. This was when oil was first discovered in Algeria and the war with Algeria had been in full swing since 1954. Modibo Keita set up the Malian Federation and declared in 1959 that, upon independence, he would withdraw all soldiers from the Algerian front. Since the Malian Federation was dismantled, Gao virtually became an Algerian willaya, a base camp for its fighters. Mali did not accept this. Moreover, Algeria, around the time it achieved independence, took retaliatory measures and sealed off its borders, mercilessly sending back huge numbers of refugees. It mobilised them through humiliation, telling them that they were the last members of the white race-the only ones to allow themselves to be under black rule.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· But when Ganda Koy's militia halted the Tuareg movement, they appeared to have been supported by the black population. Doesn't that also suggest a racist attitude ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I addressed the Tuaregs in October 1992, and pointed out that their wish to regard themselves as overlords and the other peoples in Mali as vassals who ought to pay tribute would provoke a general uprising, with the risk of a slide into civil war. I told several of the Tuareg chiefs seated around me the legend of Ouagadou- about the serpent of the well who each year demanded that the Soninke people should sacrifice an 18-year-old girl in its honour. Then the day came when a young man refused to accept the sacrifice of his fiancee. He went down into the monster's lair, watched by a horrified crowd who saw his recklessness as folly, and cut off the serpent's head. In the beginning, the Malian people's sympathies in fact lay with the rebellion. On 26 March, when the rebellion against the dictatorship took place, the president at the time, Konare, asked for all the Tuareg chiefs to be brought to him so that they could set up a transition body. He got a nasty surprise when the Tuaregs resorted to arms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Was the government, as rumoured, behind the Ganda Koy ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Not the government as such. To my mind, it would be wrong to applaud when one faction of the people one governs wants to exterminate another faction.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· It appears that some of the people are unhappy with the concessions that have been made to the Tuaregs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-This is a myth. The idea that we are frustrated because the Tuaregs were once our masters, is a story put about by Europe. The situation is quite the reverse. At the time of colonisation, they were unwilling to ream, like other nomads, such as the Peul people, for example. There were splits with them, of course, but no actual, all-out war. Forging a nation always requires tears, sweat and mourning. Those who return will find what they left broken or stolen and will want land which is less barren than that impoverished by the encroaching desert. However, those who stayed put in the face of rebel attacks had their houses smashed and their animals taken away. There will be problems when some Peals, for example, identify their cows which were stolen. We will have to negotiate, but I have confidence in the people. Just as they ended the war, they will be able to heal the wounds-of this I am sure. And the process has already started.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· I gather that you continue to practice as a doctor, on top of your political duties. Is this to teach a moral lesson to your political colleagues ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I would say that it is more of a weakness, an inability to abandon a passion, even for supposedly good reasons. l am an 'internalist' and I have a passion for mechanisms. If you cure an infection and it returns, you have to look elsewhere to solve the problem. There are those in authority who spend money on trying to tackle problems without troubling to locate the cause. I would like to think that the analytical rigour of clinical science might also be put to good use in promoting understanding in politics. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Profile</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Area: 1 240 190 km²</P>
+<P ALIGN="JUSTIFY">Population: 10 million</P>
+<P ALIGN="JUSTIFY">Population density: 8.15 per km²</P>
+<P ALIGN="JUSTIFY">Population growth rate: 3.1 % </P>
+<P ALIGN="JUSTIFY">Capital: Bamako (pop.700 000) </P>
+<P ALIGN="JUSTIFY">Other main towns: S&eacute;gou (65 000), Mopti (52 000), Sikasso (50 000), Koutiala (37 000) </P>
+<P ALIGN="JUSTIFY">Languages: French (official language), Bambara, Peul, Shongoi, Tamashek </P>
+<P ALIGN="JUSTIFY">Curreny: CFA franc. In July 1996,1 ECU was worth CFAF 647.5 ($1 = CFAF 515) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Politics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government: Mixed presidential and parliamentary system. Greater powers are due to be transferred to the regions after the next elections. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Head of State: Alpha Oumar Konar&eacute;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister: Ibrahim Boubacar Keita Political parties represented in Parliament: ADEMA (absolute majority). 'Opposition' - CNID, USRDA and numerous other smaller groupings. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p021.png"></center><br>
+ Map</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economy</P>
+<P ALIGN="JUSTIFY">(1993 figures unless otherwise stated) GDP: CFAF 753.8 billion</P>
+<P ALIGN="JUSTIFY">GDP per capita: $530</P>
+<P ALIGN="JUSTIFY">Origin of GDP by sector: agriculture 42%, industry 11 %, services 47% </P>
+<P ALIGN="JUSTIFY">Real GDP growth: 2.4%</P>
+<P ALIGN="JUSTIFY">Balance of payments: deficit of CFAF 84.1 billion (estimated) </P>
+<P ALIGN="JUSTIFY">Main trade partners (% of total trade) </P>
+<P ALIGN="JUSTIFY">Exports: Thailand (24.2%), Brazil (19.1%), Ireland (9.7%), Belgium/Luxembourg (9.7%) </P>
+<P ALIGN="JUSTIFY">Imports: C&ocirc;te d'lvoire (22.2%), France (14.5%), Senegal (9.7%), Hong Kong (4.6%)</P>
+<P ALIGN="JUSTIFY">Main exports: cotton 40%, livestock 28%, gold 17.5%</P>
+<P ALIGN="JUSTIFY">Annual inflation rate: 3%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social indicators</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy at birth: 46.2 </P>
+<P ALIGN="JUSTIFY">Infant mortalityper 1000 live births: 158 </P>
+<P ALIGN="JUSTIFY">Adult literacy: 28.4% </P>
+<P ALIGN="JUSTIFY">Enrolment in education (primary, secondary and tertiary): 16% </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Human Development Index rating: 0.223 (171st out of 174)</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with Amadou Seydou Traor&eacute;, opposition leader and USRDA spokesman</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Macro-economic indicators tell you nothing about the distribution of the country's resources'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· It cannot be easy to be in opposition when Parliament is dominated by a majority which is given a good press and is regarded abroad as a good pupil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We do not really find it a problem. If one is familiar with Mali's current situation, the people's views, reactions and judgments count for more than outside opinion, despite the fact the latter may seem important. However, we do take account of others' opinions. We are pleased to be able to speak to you-to express our ideas and points of view- so that outsiders can see that the USRDA offers a credible alternative for Mali. We feel quite secure in our current position because the principles and values we stand for are those closest to the Malian people. So we have no problem in being the opposition party. We are not the kind of hysterical opposition which resorts to foul means as well as fair ones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Given that most Malian political trends stem from the revolutionary democratic movement, what are your party's special features ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Our party's origins are in the movement which dates from 26 March 1960-which itself grew out of an underground movement. The main component of this was the USRDA whose government was overthrown by a reactionary military putsch. Adema won the last elections, and we do not contest this fact despite a number of irregularities. Indeed, we supported the Adema government's initial actions. We were one of seven parties who regarded the Third Republic as our own offspring. Between 1992 and 1994, even when we faced grave difficulties and they were asking for suggestions, the government ignored our proposals. This happened, for example, at the time the World Bank threatened to pull out. As it functions at the moment, the government is not meeting the Malian people's basic aspirations. They want to see a change from the previous regime.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What are your essential criticisms of the way Adema works ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We are critical on a number of fronts. Looking at it first from an institutional standpoint, when the Malian people rejected the old regime, they wanted the existing set-up to be changed into a democratic one. The few institutions that have been established since then do not reflect this desire. They are virtually no different from what we had under the single-party system. True, we have an opposition party, but its views are ignored. Second, in terms of the management of democracy, a number of bodies, such as the State Commission on the public media, simply do not function. You have been in Mali for a week now, so you must have heard Adema spokesmen on the TV or radio. But you will never hear a member of the opposition. The space reserved for that -formerly an open forum for free political discussion-has been removed and the state-controlled TV and radio stations do not allow political parties to have a say. In the economic sphere, our approach is also completely different. We believe that support for the development of the private sector means that the state has to act as regulator. Economic development cannot simply be left to run its course as a kind of 'rat race'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Could you give us a few practical examples of what you describe as Use selling-off of the family jewels ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-With pleasure. Before the 26 March revolution, there was a general consensus that, in the process of privatisation, the state sector should be managed in a way that benefited the Malian economy. But the reality is that privatisation methods have not changed. They are no different from what they were in Moussa Traor&eacute;'s time. The electricity sector, for example, which has not yet really been privatised, is now managed by the Bouyges group of France. And it costs more, which will hardly help the country's economic development. The state airline has simply been absorbed by Air Afrique. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· If you were in power, how much economic scope do you think you would have, given the prevailing trend towards international liberalisation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I recognise that there is a dominant international lobby which has drawn up its own conditions, laws and principles. Even if one does not agree with this approach, one has to take it into account. However, it should be feasible to achieve privatisation in a different way. We know what we are talking about because we used to run this country. Indeed, we set up the national economy. Before 1960, there was no economic system to speak of. l am currently completing the text of a work which looks at our economic position at the time of independence. The plain fact is that we had nothing at the time of independence. There were only three pharmacists, fewer than ten doctors, and about ten people qualified to teach in our grammar schools-not much to write home about after 70 years of colonialism! After 1960, we had to set everything up from scratch. If you trace the history of every country in the world, whether under a monarchy or a republic, you see that the state has always made the first move in bringing about industrialisation, developing the maritime sector, and stimulating imports and exports. If you think about it, at the outset, the main manufactured activities were the domain of royalty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You claim that your party left a legacy, but some might say that the highly interventionist regime of your hero, Modibo Keita, who brought about independence, contained the seeds of Moussa Traore's dictatorship.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-These are just fairy stories. When a regime is overthrown by a coup d'etat, it always becomes the victim of systematic defamation campaigns in the press. We were maligned for 23 years with no right of reply and no right to issue a statement to set the record straight. In a way, we are talking today about a past which did not exist. You know the saying 'you are not only what you are but also what people say you are'. This reference to dictatorship is one of the most serious calumnies. But no matter what lies are told, something of the truth will always remain. If our regime had been dictatorial or inquisitorial, a coup d'etat would not have been possible. Before the 1968 coup, Modibo Keita was given a file by the security services warning him of the plot by Moussa Traore, and giving a list of his accomplices. He was advised to arrest the conspirators and put them on trial. His response was that he would not agree to a Malian citizen being deprived of his liberty without a scrap of evidence. I knew Keita very well. It will be a long time before we have another head of state with such democratic convictions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The ordinary people, the farmers, say that they did better under Traore, than under Keita.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Yes, but it depends who you talk to. With Traore, there was an atmosphere of moral decline. We were free to plunder, steal and murder, but it was not real freedom. The farmers see it from a different perspective. However, l can still show you a copy of the 'Summary Report on the Seminar on Cooperation in the Rural Environment' which we drew up in 1968, just a few months before the coup d'etat. This highlighted the fact that socialism had not penetrated into the countryside during the seven or eight years we were in power. So you see our own self criticism appeared in a document published in May 1968. This demonstrates the fact that we were not complacent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What is your view of the compliments the current government is receiving from many foreign observers, and the good marks it has been given in the macro-economic field by international institutions ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Good macro-economic results which are due to good management of public finances are beneficial for the country. However, such management must be accompanied by greater welfare and an improved standard of living for the people. There is no point hailing a GDP increase of 3-4% if more than 10% of the population does not have enough to eat. You have been through Bamako and other towns and cities and you have seen the construction sites and big buildings. But in their daily life, people are now more ill at ease. They have been disappointed by the Adema regime. The welfare of the ordinary citizen cannot be defined by reference to the personal wealth of someone who is having a seven-storey building put up. All of this new construction is reflected in the higher GDP. But the macro-economic indicators tell you nothing about the distribution of the country's resources-and the scales are currently tipped towards injustice. Those who are working are earning less but those who do not work are earning more. Embezzlement and corruption are currently worse than under Moussa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What is the likelihood of a changeover of political power given that the opposition groups are at odds? The union between yourselves and Parena appears to have been suspended.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We are capable of winning the forthcoming elections without entering into an agreement with any other party. Having said this, we are the party to which most groupings in Mali are now turning and we are currently in the process of forming an alliance which will carry a great deal of weight. l am not one to speculate but I am sure that Parena's supporters will, in time, reach the same conclusions as ourselves regarding the timeliness and suitability of an alliance between us. We have contacts with a number of other parties but we do not want to form an electoral pact in the way one would make preparations for a coup-forming a group, ousting the regime and then shooting at each other! Moreover, it is important not to confuse change with restoration. There are those who advocate the restoration of Moussa's regime. Opposition of that kind would suit the current government very well because it would allow them to raise the spectre of our former dictator in the hope of attracting support from those who are frightened by such a pro spect. </P>
+<P ALIGN="JUSTIFY">Interview by H.G.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The magnetism of the unfamiliar... but unexotic</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In West Africa, there is a dry, desert-like region which a river tried to bring under its sway. Instead of flowing seawards, the river's path went in the opposite direction to find this region, impulsively tracing a majestic loop of 2000 kiLom&eacute;tres before heading seawards. The Niger may not have provided an ideal site for Mali's major towns and villages, but it was considerate enough to form a major waterway between them which is navigable over almost its entire course. Its network of tributaries has resulted in the formation of large landlocked lakes whose waters are full of fish-a reminder of the times when the Sahara was one huge expanse of water. It has also resulted in the extraordinary Niger basin, a central delta area the size of Belgium, criss-crossed by lesser tributaries which reach into the smallest valleys. The river has created a diverse landscape which entices the visitor back. The land is steeped in history and if one wishes to learn its secrets, one has no choice but to study the empires of the past, forged it is said, by mythological deities and heros.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the dry season, visitors marvel at the beauty of the plains, which stretch as far as the eye can see. They will be tempted to return to view the waters that will cover them for just a few months during the rains. This is when the towns and villages appear as islands in the flooded landscape. Later in the seasonal cycle, Nature divests itself of its watery raiment and prepares to welcome the egrets, pink flamingos and all the other richly coloured birds which have flown in from afar. The cultural life of this region is also imbued with a rare richness, combining mystery and individuality. Mali has a distinctive character: it is accessible but not adulterated by frippery, welcoming but not taken over, affable but able to treat everyone as its equal. There is no need to make constant reference to the past which existed before colonial times-the past simply exists, eloquent in its tranquil humility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A survey of Mali should logically begin in Bamako, the likely port of arrival. But if one immediately journeys to the towns and villages that were the cradles of empire, one is better able to appreciate this young capital, barely 250 years old, whose history owes much to its smaller forebears. We arrived in the evening and departed at dawn the next day. So Bamako was no more than a blur. The River Niger, still known as the Djoliba in the capital, is crossed by two long bridges which offer a view over the wild river banks. Most of the constructions are brand-new and some have a style borrowed from their thousandyear-old 'Sudanese' architectural heritage. It would have been more romantic to travel by river to the central part of the delta but, despite the welcoming nature of the Niger as it flows through Mali, it is difficult to navigate over the Sotuba rapids, between Bamako and Koulikoro approximately 50 km away. When the waters are in spate from July to December, it takes no more than two days to reach Segou, three to reach Mopti, five to reach Gao and an extra day to arrive in Timbuktu.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Segou, the rebel</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Our first stop after Bamako is Koulikoro, the departure point for Niger cruises. After the unusual houses of the bazo fisherman on the banks of the river, as one leaves Bamako, it is the river itself which is a source of curiosity, transforming the voyage into a wonderful promenade through a forest abounding in game. Then there are the thatched, circular mud huts. Those without a roof are built on piles and are often ovens for preparing karite-nut oil whose bitter-sweet fragrance mingles with the fruity scent of the mango trees which line our route. In Koulikoro, every day is market day. The market spills out into the road and then shrinks back to allow vehicles to pass. It is also a centre for hunters and poachers who come here to seek customers. Above all, it is the centre for the guilds of masons who jealously guard the secrets of traditional Sudanese building skills. For the visitor who cares to linger, the griots will sing the praises of the old magician-king Soumangourou whose spirit has haunted this small town for eight-and-a-half centuries. When he was overthrown by the hero Soundjata, he just vanished into thin air-in the land of mystery that is Mali, great kings do not die, they simply disappear.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first 250 kiLom&eacute;tres of the river's course from Bamako are enchanting. One's first real encounter with Mali's past come at Segou-when the balanzans come into view. The charming, independent city is close by. Segou, the Bambara capital, did not form part of most of Mali's empires. Indeed, the word Bambara comes from 'Ban-Mane', which means 'those who reject a master'. There are 4444 + 1 balanzans to announce the city, all of which are numbered except the last one, which still guards its secret. The balanzans conceal another secret: during the dry season they are covered with leaves, which they lose during the winter. A curious traveller might arrive at Segou with memories of Maryse Conde's fine prose (Segou, Robert Laffont, France, 1984). Her work is an epic fresco of life at the court of the Bambara kingdom in the nineteenth century. The city itself stretches for eight kiLom&eacute;tres along the river bank, with a promenade high above the river on an embankment from where there is an uninterrupted view over the water to the horizon. The richly coloured fabrics of the washer women create a dreamlike atmosphere, giving an impression of the shimmering tunics worn by princes, and the women who swim in the river are not given to excessive prudishness, another reminder of the city's enduring rebellious nature. The charm and cleanliness of the town are striking, its administrative buildings stretching along a grand boulevard lined with modern structures. We see in their profiles, the traditional architectural styles as well as a variety of colours. The whole scene is shaded by gardens full of flowers. It is easy to forget that Segou has retained none of its former architectural wealth. This was all destroyed by the organisers of a jihad who sacked this city of infidels who had never been won over to Islam or, later, to Catholicism. The city walls and the regal courtyards are all gone, so what remains is jealously protected: the sceptre and regal symbols of King Diarra, the kingdom's treasures and its secrets. On Mondays, market day, it is possible to see people kneeling at the feet of an old man. He is the custodian of the town's remaining riches, but will never reveal where they are held. Oumar Santara, one of Segou's intellectuals, is attempting to gain an insight into these mysteries in order to protect them better because, he says, the pillage is still going on. Mali's cultural heritage is being ransacked by outsiders. In some villages on the opposite bank of the river, it is still possible to find 13th-century coins in the village squares.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trial marriage</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nearly 500 kiLom&eacute;tres separate Segou from Mopti. Midway between the two is San, barely more than a large village. San is bathed by the waters of the Bani, a major tributary of the Niger which it flows into it at Mopti. In the market, fine cotton fabrics can be bought, as can the skills of the blacksmiths. Here, however, there is above all an air of secrecy. The town's inhabitants are members of the Bobo people. The name translates es 'stammering', 'mute' being implied. This is the town which holds the secrets of fatal poisons- cocktails of poisonous plants and snake venom. There are also unguents of all kinds to relieve pain, alleviate scarring, and so on. San has another reputation, that of handing out severe punishment to adulteresses. This seems paradoxical when one discovers that women here enjoy exceptional sexual freedom during adolescence and up to the time of their marriage, and even afterwards. They enter into a trial marriage for three or four years, during which time they are free to 'play the field'. At the end of this period, on the occasion of a feast, they reveal whether or not they will accept their 'provisional' husband. If not, the woman regains her freedom and can start all over again as many times as she wishes. If she decides to become the man's wife, she chooses some of her husband's friends with whom she may 'have a fling' for two weeks, the aim being that she thereby lays to rest her unmarried freedom. She will then swear an oath of fidelity to her husband which she breaks on pain of being cast out of society and even, it would appear, at the risk of losing her life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A 1 2-kiLom&eacute;tre dyke, which seems to float on the water during the winter season, links Sevare, the crossroads of the major routes across Mali, to Mopti. Situated below water level, Mopti owes its existence to the embankments which protect it. The dyke offers a fine promenade which opens out onto the quayside of this bustling town. The streets are crowded and the settlement has a vitality and beauty, with coloured lights mirrored in the water. On land, the crowds drift in much the same way as the multitude of boats anchored in staggered rows along the riverbank. These stretch for hundreds of metres- as far as the eye can see. All this wealth of detail forms a tableau punctuated by the outlines of the slender fishing smacks (pirogues or dugout canoes). Despite their size, these vessels retain their uncluttered lines, always giving the impression that they are slicing through the water. The biggest of them are perhaps 50 metres long, carrying cargoes of up to 150 tonnes. This strange, animated scene, which resembles no other in the world, seems to have been staged as a way of reviving the buried images of the Mali of legend-provoking a memory of things unseen and prompting new sensations. Despite the fact that it is replete with Malian influences, Mopti did not develop until colonial times. Like Segou, it never really belonged to any of Mali's great empires, although it became their meeting point. It is a place where all the country's languages are spoken. Indeed, the word 'mopte' in Peal means 'place of assembly'. At Zigui's restaurant or in a cafe down by the port, one find groups of beribboned Tuareg artisans still with their belle servants (former slaves) in tow. One can watch the Peals, also followed by their servants, negotiating their deals. Some trade in gold jewellery, dogon or other ethnic sculptures. Others buy and sell the magnificent Segou carpets or cotton fabrics. Others still dabble in ancient archaeological artifacts (which it is forbidden to sell) and in sacred objects from all over the country. The town itself is an artifact: the apparent hotchpotch is regulated by an internal, almost natural organisation. The hundreds of boats, fishing smacks and other small craft are arranged along the river banks according to the goods they are importing. There is one place for fishing boats, another for furniture imports, and so on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mopti merits an overnight stay. In the curve of the great arc which forms the port, a soft light lingers on the congested river banks. It is not just the people who seem to tire of the day's hustle and bustle. The biggest boats with their gentle backwash, anchored in the mud until the next incoming tide, grow too lazy for their images to be reflected in the water and they seem to hold on to the last of the sun's glow, awaiting the first glimmers of moonlight</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Dogon region, poetry in stone</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As one approaches Bandiagara, on the threshold of the cliff faces which bear the name of this town, the landscape changes. Most of Mali is flat, but here, we find ourselves in the high land. In fact, the altitude is only a few hundred metres, but the landscape is dominated by sheer and rugged rock faces. This is Dogon country where everything seems to be made of stone: the roads, houses and hills appear in matching tones of salmon pink. The inhabitants, too, seem to have been hewn from the very rock. At first glance, the landscape is unremarkable apart from the sight of all this rock, but as one's perception grows keener, shapes can be made out. At the foot of the slopes are caves that are still lived in. And in the most vertical part of the cliff faces, we can pick out regular, sculpted barrel shapes, combining to form an impressive design. These stone cylinders are the ancient dwellings of the Telems, a mysterious people who preceded the Dogons and were conquered by them. Nothing is known about their disappearance. Today, the cylinders are used as Dogon graves. Access is gained to them during funeral services, by means of a system of ropes. At the top of the cliff is Shanga, the beauty of the Dogon region. It stands atop a 400metre sheer drop which extends over a length of 200 kiLom&eacute;tres. Reaching Shanga from Bandiagara involves picking one's way through the rocky landscape and sliding over sandstone scree.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before the Europeans arrived to colonise the country, no one had succeeded in subjugating the Dogon region. Was it really ever under the sway of the colonists ? This region, whose beauty lies in its harshness, has no embellishments. And its language is as hard on the ears as the rock is underfoot. As everywhere, to feed themselves, the Dogons till the soil. But this must be carried on the backs of men and women over distances of several kiLom&eacute;tres and then deposited on the rock. Every onion bulb and every root pulled from this thin layer is a testament to the tenacity of humankind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Dogon region is like a magnet-it attracts pilgrims from afar who come to venerate El Hadj Oumar, the founder of the Islamic brotherhood of the African Tidjani-a military and religious leader whose life and disappearance are shrouded in mystery. It also attracts people because of the beauty of its works of art. Some of these, apparently of recent manufacture, are actually centuries old. For the custodians of the sacred objects, the interest of outsiders is viewed as a catastrophe. The artefacts are constantly pilfered and sometimes, their keepers commit suicide in their horror at such desecration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fine regalia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Djenne translates as 'the beloved of the waters' and is surrounded by two strekhes of the Bani river. Thus, apart from a short time in the dry season, when the river can be forded, it is an island accessible only by boat. The town has always been a rival of Timbuktu, the 'daughter' of the desert. Before Mopti was created, Djenne was the country's meeting point. The town is dominated by its mosque which is a masterpiece of Sudanese architecture. This imposing clay structure has been a magnet for the faithful since the thirteenth century. It has always been rebuilt in the same style, each version scrupulously identical to the previous one. The most recent reconstruction dates from the early 1900s.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Centre of the Malian empire, Djenne has retained all its finery, magnificence and prestige. It was annexed by the Shongoi empire at the end of the Middle Ages and its conquerors have always been seduced by the town's beauty. The mosque has been designated a World Heritage Site, and the entire town has protected status. For centuries, its architecture influenced other towns and cities in the Sahel and it continues to do so. The secrets of the knowledge and skills of its master masons are still jealously guarded, passed on only reluctantly to the initiated. The whole town is built around the mosque, revealing an interplay of balance and power. There are magnificent inner courtyards to which entry is gained through massive, ornate studded gates. The elaborate and finely carved windows, the intertwined leaves and scrolls of the arabesques and the moucharabies, all bear witness to the Moroccan influence. This has, however, been toned down and it now blends in with Djenne's indigenous forms of decoration and architecture. Whilst all Mali's former great towns and cities were known for their power and military glory, Djenne takes pride in having dispensed with brute force, its spirit protecting it from subjugation. All those who pass through take something of Djenne's spirit away with them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coca Cola kept at bay</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Returning to the capital from where we started, we discover that it was colonisation that turned Bamako from a village into the large city that it is today. It inhabitants now number approximately one million. Although a city of recent origin, the site on which it is built dates back to the dawn of time. The hills overlooking the city are home to cave paintings and the underground tombs provide more evidence of a human presence dating from ancient times. There is then a gap of several thousand years in Bamako's history. In early colonial times, just two centuries ago, the village had no more than 700 inhabitants. Bamako began to be developed at the beginning of the 1900s and it is the only city in Mali to have a colonial atmosphere. It has not, however, lost out to change. The ministerial buildings at Koulouba hill, one of five dominating the city, or the Point G houses in the National Museum area, may not equal the beauty of Sudanese architecture, but they are elegant nonetheless. Their plain style is softened by their leafy gardens. The administrative buildings in the lower part of the city are often a fusion of colonial or modern styles and traditional architecture. These edifices are also made more attractive by fine gardens, which lend originality to the city. One of the most successful combinations is the great market, unfortunately in the process of restoration at the time of our visit and whose beautiful interior we were unable to appreciate. It is interior beauty which characterises this city in comparison with other African capitals. Despite its congestion and the density of its population, Bamako still has the atmosphere of a lively village. There is little of what one might term a 'social scene', but it is enough to be invited into the 'squares' or respectfully to visit the block-shaped houses which are still home to entire families and where discussion sessions (grins) last into the small hours. These sessions are enhanced with food and the omnipresent cup of tea. Bamako still prefers tea to imported beverages and to receive guests in the family home rather than joining in the social round in the hotel foyers so characteristic of major capital cities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For those hesitant to venture into the traditional life of Bamako (although they would be assured of a welcome), there are many restaurants which make a good attempt at recreating a homely atmosphere. One is not, however, required to take part in the conversations. Two restaurants (the Djenne and the Santoro), which have opened recently, allow one to enjoy the pleasures of art and history. They are part of a wider project to promote Malian art and set up an organisation for artists and craftsmen. They contain areas modelled on the refinement of former imperial furnishing, interior design and architecture, as well as exhibits by Mali's greatest artists. Their creator, Aminata Traore, is an intellectual, art connoisseur and international expert. In Dakar or Abidjan, patrons of such establishments would probably be expatriates with perhaps a few local dignitaries. But at the Santoro and Djenne, prices have been kept reasonably low (no account having been taken of the 50% devaluation in the CFA franc) and the art remains accessible to middle-class Malians. Thus, the spirit of the 'grins' is preserved. The preferred beverage is still a cup of fragrant tea or perhaps a glass of refreshing juice. Whisky will never replace tea, nor will Coca Cola replace fruit juices. Mali is not a country which rejects other people, but it resists cultural encroachment, preferring the </P>
+<P ALIGN="JUSTIFY">familiar to the exotic. </P>
+<P ALIGN="JUSTIFY">Hegel Goutier</P>
+<P ALIGN="JUSTIFY"> </P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Mali-EU cooperation</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY">Roads and adjustment</P>
+<P ALIGN="JUSTIFY">by Theo Hoorntje</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For 1990-95, ECU 151.7m was allocated (mainly in project aid) under the seventh EDF National Indicative Programme (NIP). This is equivalent to about 1.5% of Mali's GDP and 13% of its public-sector investment programme for the period in question. European funds from sources other than the NIP-emergency aid, Stabex, European Investment Bank (EIB) venture capital and resources from the structural adjustment facility- reached ECU 87.2m over the same five-year period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1995, support for the structural adjustment programme represented 5.4% of the balance of payments deficit and 7.8% of the budget deficit. Looking at all instruments together, the amount involved in financing decisions taken by the Commission last year was ECU 42m, with the disbursement figure rising to ECU 40m.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The NlP's primary commitment level under the 7th EDF rose from 76% at the beginning of the financial year to 92% at the end, which means that virtually all available programmable resources are now allocated to projects and programmes. The secondary commitment level, which involves the conversion of proposals into concrete agreements and contracts, rose from 33% to 45% by the end of the financial year. Disbursement rates remain relatively low (32% of available resources).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Allocations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aid is distributed to the various sectors, as follows:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Roads (29% of the total);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Support for structural adjustment (20%);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Rural development / Environment (1 4%);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Support for the private sector (12%);</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Decentralisation (9%); </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Public health (9%); </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Water supplies (4%); </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Education/Culture (3%).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is clear that Community aid concentrates mainly on road infrastructures-covering both maintenance and the opening-up of remote regions. Support for structural adjustment, which comes second, is used to finance the State budget's current expenses, particular emphasis being placed on improvement of fiscal and customs income and greater efficiency in health-policy matters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In other areas, such as rural development, Community aid also makes an attempt to consolidate gains from previous actions, particularly through the development of rice growing and stock rearing, which should improve supplies to the domestic market and offer further export potential. As far as the environment is concerned, the aim is to contribute to the sustainable management of natural resources on the part of basic users, such as farmers, breeders, etc.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The private sector is supported by actions in key areas and by a programme that was recently set up which involves directing resources through a financial institution (Credit Initiative SA). The objective is to promote lending to SMEs, which is in keeping with the general aim of achieving economic growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the context of administrative reform, priority is given to the decentralisation process which aims to promote the emergence of new local decision making centres (which should, in the long term, become key players in project development and implementation), and to give such decentralised bodies the means they require to fulfil these new public-sector missions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for health, Community aid has contributed to the PSPHR project financed by other donors. Its main focus is initially on infrastructures and on the policy relating to the supply of essential medicines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the water-supply sector, actions are aimed at strengthening village infrastructures, particularly in the Bankass and Koro areas. A solar-pump programme has also been set up in the Mopti and Koulikoro regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to a school reconstruction programme in the north of the country, the Commission has been able to support education and culture through a dozen or so film projects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under the general 'heading' of non-programmable resources, there have been a number of interventions. These include extra support for structural adjustment, Stabex transfers, deployment of the balance from the 5th EDF and EIB projects. Emergency aid has been deployed in the north of the country where, despite difficult conditions, programmes have been able to continue without interruption.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, Community regional aid is helping to combat rinderpest, as well as being directed towards road maintenance, and the provision of training and information on environmental protection. </P>
+<P ALIGN="JUSTIFY">T.H. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">NGOs finally achieve tangible results</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Catherine Beauraind and her five colleagues in the small team of foreigners and Malians, woke early. It had been a short night: our fault, since we had arrived at Bandiagara on the edge of the Niger valley much later than expected having taken the Sevare route. This is the gateway to the rocky Dogon region and travellers on the road occacionaliy fall victim to bandits-which probably made our hosts somewhat apprehensive about our late arrival. The people we had come to see are road builders, working without sophisticated equipment in a region of rocks and cliffs. They seem very youth froml, particularly those who have come from afar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These are 'Progress Volunteers', the name given to the many young people who come to this very poor African country to offer their commitment and dynamism, if not perhaps their experience. On this particular morning, still feeling fatigued, Catherine was having to coordinate the departure of escorts for seasonal workers who were being dispatched to various locations. Their job is to ensure the upkeep of the rocky roads, and the equipment they use is rudimentary to say the least. The Bandiagara-Dourou stretch is maintained by the AFVP (French Association of Progress Volunteers) and is one in a long list of NGO projects. In 1995 alone, the European Commission supported over 50 NGO schemes, to the tune of ECU 1.5 million. Most EU countries and a number of others also have their own projects. On top of this, there is the emergency help provided by the European Commission Humanitarian Office (ECHO), which has just approved a grant of ECU 1 million for the north of Mali. Now that a peace accord has been signed between the government and the Tuareg rebels, this region is likely to see a huge influx of refugees returning to villages that are ill prepared to receive them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali is a least-developed nation and one of the most highly subsidised countries in terms of per capita aid, though recently, its political fortunes have been boosted by the democratisation process. And the efforts of the NGOs now seem to be paying off. The recent times of famine have faded in people's memories even in the Dogon region, where many families ate calabashes in desperation before succumbing to starvation. Mother nature is playing a part in the country's renewal: there has been ample rain over the last Many NGO projects are aimed at helping the population use its meagre resources to exploit the natural wealth of the River Niger and its tributaries. At Konna, for example, a striking village at the confluence of two rivers, the Regional Literacy and Self-Management Project is up and running. Financed, among others, by the European Development Fund, this is being implemented at a number of localities, and it has played a part in the renewal which can now be seen. Fresh coats of paint, repairs to houses, fewer starving children and the return of many migrants all underline this new vitality. Each of the 17 small cultivated areas in the village that are covered by the project (worked by about 60 people), receives no more aid than a motorised pump, a few cereals and a small amount of cash in the first year. A basic course in management is also provided. It is up to the villagers to use these resources to yield a profit. Results tend to be good, proof of success being the growing number of such schemes which are being set up without aid from the organisation. The project is now in its seventh year. It did experience one bad year-1992-when, despite bumper harvests, rice imports into Mali were excessive and prices dropped. The village has therefore made an attempt to diversify its crops. Its objective is to sell onions in Cote d'lvoire, where the inhabitants are very fond of this vegetable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most villages have been able to save money which was initially placed in banks and then invested elsewhere in the wake of devaluation's harsh lessons. Konna opted for purchasing livestock. In nearby Kotaka, surpluses partially funded the construction of an impressive mosque. Kotaka was one of the places most affected by the recent meningitis epidemic, but a hospital would probably have been too expensive. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hegel Goutier </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Western Samoa</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">A new spirit of enterprise</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Small countries with a limited resource base are frequently buffeted by economic forces over which they have no control. If you live in Western Samoa, however, you are likely to be preoccupied by forces of a different kind. For while most of the time, Mother Nature presents a benign face in this attractive and fertile Pacific state, every once in a while, she loses her temper.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tropical storms are an unavoidable reality in much of the Pacific and they breed a special form of resilience which should impress the inhabitants of more temperate climes. The people of Samoa, and other cyclone prone countries in the region, are adept at picking themselves up and, if necessary, starting all over again, once the winds have passed. But between 1989 and 1993, the Samoans' capacity for renewal was to be tested more than ever before. Like a plucky boxer facing a much stronger opponent, the country would just be struggling back to its feet when another hammer blow would send it reeling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The closest to a knock-out punch came in December 1991 in the shape of Cyclone Val-the worst storm to hit the islands in more than a century. This brought death and injury, as well as widespread economic devastation. The coconut and coffee trees on which the country depends for much of its export income were either swept away or stripped bare. Many homes were also destroyed and infrastructures were severely damaged. (The 1993 cyclone, although less powerful, caused further crop destruction.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the last five years, virtually all the damage has been repaired. Indeed, a great many facilities have been upgraded with plans for further improvements in the pipeline. To some extent, the credit for this remarkable recovery must be shared. Overseas donors played an important part in restoring key infrastructures while expatriate Samoans, whose remittances are an important 'invisible' earning for the country in normal times, also rallied round. But the key players, of course, were the people themselves, who rose to the challenge of reconstructing their country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, Western Samoa - which has a population of 165 000-is experiencing an economic mini-boom. Growth during 1996 is expected to be between 5% and 6% for the second consecutive year and there are encouraging signs of a new, home-grown entrepreneurial spirit. This is not to say that everything in the garden is rosy. The latest growth figures need to be set against the unavoidable recession caused by Cyclones Val and Ofa (which struck in 1990) and a mediocre economic performance throughout the 1980s. And while there is some evidence of diversification, the economy is still very narrowly based. There is also considerable room for improvements in health care and education provision. Doubts have been expressed, for example, as to the accuracy of the official literacy figures. Finally, there is a high level of dependence on foreign aid (the country's main donors are the Asian Development Bank, Japan, Australia and the European Community).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economists will tell you how notoriously difficult it is to express the wealth of a developing nation in statistical form. GDP figures can offer a pointer, but they do not present the whole picture as they take no account of the informal economy. Western Samoa provides a particularly good illustration. At US $950, the estimated per capita GDP is very low by Pacific standards. Yet there is clearly no starvation. A great deal of the food consumed by the Samoans simply does not 'show up' in the cash economy. The term subsistence agriculture seems peculiarly inappropriate here since locally available food sources are many and varied.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Similarly, many of the materials used to build the 'fares' (traditional houses) in the villages are obtained without recourse to builders' merchants. And when a Samoan wants a new house, he builds it himself-with the help of his family and neighbours. This involves skilled carpentry work-for which people would pay highly in industrialised societies - and which does not register either in the country's economic statistics. So it is clear that the basic GDP figures do not paint a complete picture. Nonetheless, they illustrate the relatively underdeveloped state of the formal economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Looking at exports, Western Samoa's traditional agricultural sector has gone through some rough times, for a variety of reasons. In the past, the mainstays were copra and coconut products (oil and cream), cocoa and tarot</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The storms destroyed or damaged many of the coconut and cocoa trees, wiping out exports for a number of years until new plantings could reach maturity. The market in food products derived from the coconut had been depressed in any case. One reason for this was negative publicity over the high cholesterol content of coconuts, although more recent research, suggesting that not all types of cholesterol are bad for you, has at least partly restored the reputation of this highly flexible crop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taro, which is Western Samoa's staple food crop, was exported in ever increasing quantities during the 1980s but the trade has suffered badly in recent years because of an outbreak of taro leaf blight.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, Western Samoa's most important primary exports are, once again, coconut-based (oil and cream). With the new trees reaching maturity, production recommenced on a small scale towards the end of 1994. The following year saw a big jump in exports and the figures for 1996 are expected to - come close to pre-cyclone levels,The marketing situation has also improved as a result of privatisation. The old Copra Board, a parastatal with a reputation for inefficiency, was abolished in 1990, its assets being bought for a nominal sum by a Samoan businessman who has invested heavily in refurbishment. This has all been achieved despite continuing low prices for coconut products in the world markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cocoa takes longer to recover but harvesting of the first new crop is due to take place this year with the emphasis on a high value, fine tasting variety. A new chocolate factory (Wilex C.C.P. Ltd), also masterminded by a local entrepreneur, Eddie Wilson, has been built with assistance from the EU's Centre for the Development of Industry (CDI) and a credit from the European Investment Bank (EIB) channelled through the Development Bank of Western Samoa (DBWS). This is a particularly significant venture since it aims to maximise added value before export. The factory is currently operating well below full capacity, awaiting the arrival of the first local crop, but there are high hopes for its long term success.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other main crops exported are bananas and kava. The latter is a mild narcotic based on the root of the pepper plant, which is used in pharmaceutical preparations. It also has an important place in Samoan (and wider Pacific) culture, being drunk in diluted form on ceremonial occasions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With a view to achieving further export diversification, a number of other agricultural/horticultural export possibilities have also been identified. These include asparagus, mangos and cut flowers. The most likely potential market for new tropical production is New Zealand-already the destination for more than half of Western Samoa's exports. However, this country has stringent health rules with rigorous controls on the import of plant and animal material. The understandable aim is to protect the local farming sector from diseases introduced from outside, but it creates an additional hurdle for potential exporters in the developing countries of the Pacific. In particular, Western Samoa needs to come to grips with the fruit fly problem, if it wishes to make inroads into the New Zealand market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Timber also once featured prominently in the trade statistics before declining at the end of the 1980s. There are hopes for a revival here with the authorities keen to encourage value added processing of wood products within the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite its obvious association with the sea, Western Samoa has never really gone in for commercial fishing. While the Exclusive Economic Zone is small by Pacific standards, the country being 'hemmed in' by other island nations and territories, it is still more than 40 times the land area. The government would particularly like to attract foreign investment in fish processing and canning.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Industry</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is probably unrealistic to expect a small and geographically isolated nation such as Western Samoa to develop a highly diversified industrial base but there have been one or two notable ventures which show signs of potential. The above-mentioned chocolate factory is one such. The country also has a highly successful brewery. It is not uncommon for developing nations to produce their own local beer but Western Samoa's Vailima brand has managed to break out successfully into the regional market, bringing in useful foreign exchange in the process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The biggest industrial success story-dwarfing all other manufacturing ventures-has been the establishment of a factory by the Japanese company Yazaki to produce wire harnesses for cars. The business employs some 2500 people (mainly women) in a highly labour-intensive operation-and it makes a significant contribution to the trade balance. The value-added electrical components are re-exported for incorporation into cars sold mainly in Australia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The company was attracted by a number of factors including low labour costs in this non-unionised society, and the political stability of Western Samoa. Perhaps most important, however, were the incentives offered by the government. These went well beyond the usual tax holidays provided by developing countries to attract foreign investors. Indeed, it was the government that built the factory and the company was allowed to occupy it rent-free. Some observers have expressed concern at such largesse but the authorities are insistent that it was still a good deal. They point to the jobs that were created (a huge number by Samoan standards) at a time when many people's livelihoods were threatened by taro blight. They also argue that the profits of the operation are retained in Western Samoa, thereby helping to boost the wider economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Services</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The service sector offers perhaps the best potential for expansion of Western Samoa's formal economy. Top of the list here comes tourism (featured in a separate article), which has been expanding much faster than the underlying rate of economic growth. Despite the increase in both visitors and income, tourism is still underdeveloped. The government (supported by the opposition) believes that this is one field where Western Samoa definitely has a 'comparative advantage'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Linked to tourism, of course, is the air transport business. Although it might still be possible to obtain passage on a merchant ship bound for the South Sea islands, the vast majority of visitors arrive by plane, and good air connections are obviously essential. The history of the country's national carrier, Polynesian Airlines, offers two object lessons. The first is how not to run an airline and the second, more recent and encouraging one, is how to grasp the nettle when the crisis finally breaks. In 1992, with tourism in mind, the government owned airline decided to expand its operations substantially. It leased three long-haul aircraft which it hoped to fill with visitors in search of a new tropical haven. The market research was clearly inadequate and the planes flew with many empty seats. Other aspects of the company's management proved deficient and there was a chronic lack of financial. Debts mounted at such a frightening rate that the budgetary position of the entire country was threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1994, the government took decisive action, bringing in Richard Gates, the experienced airline entrepreneur, who is credited with having turned Air New Zealand around. Relatively small airline businesses in the Pacific are not likely to make a.fortune for anyone, but with proper management, they should at least be able to break even and perhaps even turn in a small profit. This was not something that even the prodigious talents of Mr Gates could achieve, however, with the crushing burden of debt accumulated by Polynesian Airlines. So the government assumed responsibility for the debts and then gave the new manager a free hand, on the firm understanding that the taxpayer would not come to the rescue again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the airline side, the operation was drastically slimmed down. The leases on the large aircraft were terminated, staff 'down-sizing' took place and bath ticketing and financial management were tightened up. The positive impact of these measures was soon evident, with a small operating profit registered in 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Left with huge debts, the action of the authorities was equally impressive, although it entailed discomfort for most Western Samoans. In order to restore its own financial position, the government instituted 15% public expenditure cuts across the board. In macro-economic terms, it is generally acknowledged that this strong medicine was needed, but the social consequences were all too clear as well: reduced funds for health and education, and pressure on important capital investment budgets. Perhaps fortuitously for the country, the financial crisis caused by the Polynesian Airlines debacle coincided with the payment of a substantial Stabex payment from the European Community. The country's was eligible for Stabex funds because of the collapse in agricultural export receipts following the cyclones, and the money-which was directed mainly into infrastructure projects-could hardly have come at a better time. Meanwhile, the government has paid off a large portion of the airline's debt with the residue rescheduled for payment over a five-year period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government has taken a number of steps aimed at attracting offshore finance business to the country. Western Samoa now has a comprehensive legal framework governing such activities, including crucial provisions guaranteeing secrecy. Another vital factor in attracting offshore funds, which has already been mentioned, is political stability. There is even the suggestion that the country's time zone, which puts it almost a day behind Australia and New Zealand, might somehow be turned to its advantage in global financial dealings (although it is not clear how the benefit would be derived in otherwise legitimate transactions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The last three years have seen a big increase in company incorporations and there are now more than 2500 offshore companies (including 15 banks and eight insurance companies) registered. It is difficult to imagine Western Samoa ever challenging the likes of Liechtenstein, the Bahamas or Jersey in this market, given its geographical distance from the main industrialised nations, but even a successful 'niche' operation could bring some useful income to the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Politics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Five years ago, when the Courier last covered Western Samoa, the emphasis was heavily on recent constitutional changes and most notably, the introduction of universal franchise. At the time, there was a lot of interest in how the traditional Samoan way of life (faa-Samoa) would be affected. This is based on the village structure and the matai system which vests considerable authority in family heads. There is also a strong attachment to the Christian faith, as exemplified by strict Sunday observance rules (also found in Tonga and other Pacific countries).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact, the Samoans appear to have embraced their more 'westernised' system of government without any difficulty. Although everyone over 21 has a vote, one still has to be a matai to be eligible to stand for Parliament. In contrast to hierarchical structures elsewhere in the Pacific, however, the system here seems to be based largely on merit and it is not particularly exclusive (there are an estimated 19 000 matai). The matai, nonetheless, exercise considerable authority in village affairs, most notably over the use of customary land.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In short, the change seems to have caused few problems because Western Samoa already had its own decentralised form of democracy. It was not a question of educating people about hitherto alien concepts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fact that change in Western Samoa is slow and progressive rather than sudden and violent, is recognised by most observers to be a good thing. An illustration of this evolutionary approach is the arrangement governing the position of Head of State. The post, which is held by His Highness Malietoa Tunamefili 11, currently appears to be a cross between a presidency and a monarchy. Under the 1962 independence constitution, two of the country's four paramount chiefs were given the position, to be held jointly, for life. With the death of Tupua Tamasese Meaole in 1963, the surviving incumbent became sole Head of State. There will be no automatic succession, however, and Parliament will decide who should have the post in future, with the term of office limited to five years. There is obviously a great deal of respect for the Head of State and his office among Western Samoans, although it should be stressed that his role is largely ceremonial, with political authority being vested in the elected government. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for party politics, there are two groupings represented in Parliament, the ruling Human Rights Protection Party and the opposition Samoa National Development Party. The party system is not particularly strong, however, being based more on personalities than ideology. Corruption is not seen to be a major problem although a major row did blow up recently over a critical report issued by the Auditor-General for 1994. This led to him being suspended and this issue had not yet been resolved at the time The Courier went to press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Western Samoa is not unique in having to adapt to a rapidly changing world. The phenomenon affects all societies, with modern communications technology increasingly breaking down the 'protection' that geographical isolation used to afford. In Westem Samoa, as elsewhere, there must be concern about the impact of this on the country's traditional way of life. Yet the indications are that this Pacific nation is managing the transition rather better than many other developing countries. The people seem to combine an unselfconscious pride in their traditions and cultural assets with a pragmatic welcoming of ideas from outside which help to improve their material wellbeing. The hope must be that this process can continue as we approach the third millennium. S'imon Homer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Historical summary</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to archaeological evidence, the islands of Samoa were first settled about 3000 years ago, after gradual migration within the Pacific from people originally from South East Asia. Samoa, it seems, was the cradle of the Polynesian culture, and settlers from there spread to other islands of Polynesia in the east, north and south.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first European to sight the group in 1722 was Jacob Roggeveen, and although there was intermittent contact between European sailing vessels and the islanders during the 18th century, more permanent contact was established with the arrival of the European missionaries in the early 1980s. They were soon followed by traders looking for copra, beche de mer, sandalwood and other products. Later, some of the trading firms, notably German, fumed to large-scale production of copra and other products such as cotton, cacao and rubber, which also led a corresponding increase in interest on the part of colonial powers. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the late 1800s, the Samoan group became the focus of colonial rivalry between Great Britain, the USA and Germany, leading, in 1900, to the partitioning of the islands between Germany and the United States. The eastern part of the group came under American control and has remained so to this day, while Germany controlled the western islands. Britain received territorial concessions elsewhere in the Pacific. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the outbreak of World War I, New Zealand took over what had come to be known as German Samoa, and became the administrative power there under the League of Nations and later the United Nations until Western Samoa became the first Patific island nation to become an independent state in 1962.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Source: Government of Western Samoa. this text is taken from the information brochure prepared by the authorities for distribution to delegates at the recent ACP-EU Council of Ministers meeting). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dream ticket ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Depart Nuku'alofa-12.00, January l 2000 Arrive Apia - 14.00, December 37 1999</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People with cash to burn are often ready to spend surprising amounts of money in their pursuit of the unusual. Tonga has already recognised this as it begins preparing for the third millennium Lying just to the west of the International Dateline, it believes it will the first country to see the sun rise on the new millennium, although other Pacific territories have also made the claim. (For this purpose, we ignore the purists who point out that the third millennium will not actually begin until January 1, 2001.) Celebrations are planned and bookings are already being taken.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Westem Samoa is obviously not in the running for this distinction since it is east of the dateline, but what this means is it will be the last nation in the world to say goodbye to the old millennium. This surely presents an opportunity for the local tourist industry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And what about those intrepid voyagers who fancy greeting the year 2000 in Tonga and then 'seeing out' the old millennium 24 hours later in Samoa. If i were an airline manager, I would be examining the possibility of extra flights from Nuku'alofa on the big day. (Let's hope it's not a Sunday I)</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">An interview with Tuilaepa Sailele Malielegaoi, Deputy Prime Minister and Minister of Finance</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY">'Economic future in tourism end manufacturing'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier visited Western Samoa at the end of June while the country was hosting the ACP-EU Council of Ministers meeting. At the time, veteran Prime Minister, Tofilau Eti Alesana, was recovering from an operation, and his duties were being carried out by his deputy, Tuilaepa Sailele Malielegaoi, who is also the Minister of Finance. Despite a hectic schedule, the Deputy Prime Minister kindly managed to find a slot for a keynote interview with The Courier.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· There is growing evidence of a new economic dynamism in this island nation, which has managed to find its feet remarkably speedily after the destruction wrought by cyclones in 1989 and 1990. With this in mind, we began by asking the Minister about the economic prospects for the country ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I think they are excellent. Our country suffered a major catastrophe as a result of the cyclones, coming, as they did, in two successive years. There was major damage to our infrastructure and forestry resources- coconuts and cocoa. At the time, we estimated the bill at more than $600m. But the rehabilitation of the infrastructure went ahead quickly, thanks to the major support provided by bodies like the World Bank, the Asian Development Bank, and of course, the European Union, not to mention the bilateral donor countries who answered our call for help. So in some ways, it was a blessing in disguise. We suffered badly, but with the assistance that came, we have been able to improve our roads and electricity supply, and the protection of our foreshore. It also encouraged us to embark on replanting to replace the trees-mainly cocoa and coconut -that had been destroyed. Last year, for the first time since the cyclones, our copra exports came back in strength. We have, at last, started to approach the pre-cyclone export levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What are likely to be the key sectors for future economic activity ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We believe that the economic future of our country now lies more in tourism and in manufacturing industries. Dealing with the latter first, we have already succeeded in attracting some industries. The major investment so-far has come from Yazaki, a Japanese company that produces wire harnessing systems (electrical components) for vehicles. This employs almost 3000 people in Western Samoa. In fact, the company set up here before the cyclones and it did not take long for us to see the benefits. The value added equivalent provided by just that one plant is roughly equivalent to our total agricultural exports for last year. So you can see the importance of manufacturing industry for us. We have provided very generous incentives and have also allocated sufficient government land to provide space for factories.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other industry which is now in the forefront, in terms of foreign exchange earnings, is tourism. We now earn four times more from this sector than we do from agriculture-and agriculture is supposed to be the mainstay of our economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of course, we mustn't reduce the priority that we give to agriculture. It is one area where we have the resources. More specifically, I think that we have great potential for beef production. If we should have another cyclone, the trees will be damaged but cattle should not be affected. So I think we should look more towards beef production and other forms of agricultural diversification. We do have some good commercial farming in place at the moment, but it is not enough. We need to do more.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What about the chocolate industry ? You have traditionally grown cocoa but you now also have a factory to process the raw material right up to the end product.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-This is a direct result of our drive to promote more manufacturing - whether it is export-oriented or geared towards import substitution. The chocolate venture is a new one and I think there are good, prospects here as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An important point is that we are moving back into growing the fine flavour variety of cocoa here. We used to be one of the 14 producers of fine flavoured cocoa in the world, and we got premium prices for it. But somehow, over the years, we switched to producing inferior quality bulk cocoa. We regretted doing that and are now switching back to the higher quality variety-which is just coming back into production following the cyclones. So here we have another potential area for exports. On the other hand, taro which used to be our major export prior to 1993 is facing difficulties. It is affected by a disease, the taro blight, which seems to be uncontrollable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Thinking in particular of the impact of tourism, are you concerned that an influx of foreign visitors might damage Western Samoa's unique and very special culture ? I see, for example, that you now have a 'McDonalds' restaurant in the centre of Apia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- No. I am not really concerned. In 1992, we set up our own tourism festival. This takes place in the first week of September and is quite clearly intended to be a feature event with an emphasis on promoting tourism. All the activities at the festival focus on the various aspects of our culture-the arts, the dances, the preparation of food, the singing and so on. It seems to me that our drive for tourism is actually helping to revive some of the cultural aspects that would otherwise have been dvina out. So I believe there is a complementarily between culture and tourism, so long as we ensure that the relationship between the two is maintained. I think this point is backed up, if you look at the growing popularity of ecotourism nowadays. This is very much concerned with preservation-of both the environment and of local cultures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In international circles, Western Samoa is deemed to be a least-developed country on account of its low GDP per head figures. Yet nobody is starving here and you appear to have a very 'rich' lifestyle, even if people don't have a great deal of cash in their pockets. Do you think the international classification is a fair one ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- I think the first point to emphasise is that a lot of the signs of development you see here are of recent origin. They date back only to 1992-93. Infrastructures have improved considerably over a very short time and this could well create a certain impression about the people's standard of living. On the other hand, it is true that our economy is not completely based on cash. And, of course, our earnings are in Tala which go a lot further here than their dollar equivalent in the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Presumably, it is to your benefit to be classified as an LDC because it gives you access to more sources of foreign funding ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I am happy to leave the classification to the experts. They are the ones who come and estimate our average per capita income, which is then used as the yardstick for placing a country in one or other category. I think it is ironic though, that if you go to a country like the USA, which is supposed to be very rich, you find beggars on the street. It certainly makes you wonder. Perhaps it is not really the statistical wealth of a country that is important, but its social system. And our social system here ensures that no-one goes hungry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· That leads on rather neatly to my next question. What do you think are the main social challenges that need to be tackled here ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-We still have quite a lot of 'service care' needs in the villages that we need to attend to. That is why we have placed the highest priority on social services over the next five years. I am talking here in particular about health, education and water supplies. There are still a lot of villages that need to have piped water brought into the home. Education-wise, we have reasonable access, but we need to improve the teaching material that is available in the classes and upgrade the general level of village schooling. We need to dissuade families from moving to the capital in the belief that they can get better education for their children here. So we still have a lot of work to do to ensure that the primary schools in the villages are upgraded. It is not simply a question of ensuring that competent teachers are available, but also as I say, providing good teaching materials and laboratory equipment for science subjects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· All of this obviously needs to be paid for, which entails healthy government finances. You recently had a serious problem over the debts run up by Air Polynesia, and you took very stringent measures to tackle this which resulted in expenditure cuts. What do the figures look like today ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-They are OK. We are running a budget deficit which means we have to borrow both overseas and locally, but we try to keep the deficit at a reasonable level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What has been the effect of introducing the Value Added Goods and Services Sales Tax (VAGST) ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-It has helped enormously. Of course, in order to sell the idea, we had to reduce other taxes and duties. As you know, there is an international trend towards removing customs duties and shifting revenue-raising in the direction of consumption taxes. Customs levies, which are the traditional source of revenue are diminishing. So what we have done is to lay the foundation for the eventual shift in our revenue base. Also, we promised to cut income taxes even more-from 38% to 25% within two years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Has this measure been implemented yet ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-No, it is due to be introduced in 1998.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Finally, I would like to turn to a constitutional question. Western Samoa introduced universal franchise some five or six years ago, but you still have a system in which only matai (family heads) are entitled to stand as candidates in elections. Do you envisage any further changes to the system ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I cannot really see that we will ever change again. The Constitution stipulates that our government is based on Samoan traditions and Christian principles. When we introduced universal suffrage, we were applying something that had always been there in any case. Samoans have always taken part in the process of choosing their leaders and voting is simply another way of doing this. The only difference is that we would arrive at a decision by getting together through our village structures and talking, whereas your system involves marking a ballot. So the change was quite in accordance with our customs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let me say something about the way villages choose their matai. When there is a question of succession, everyone has a right to take part in the process. There is no age limit. So in that sense, you could argue that we are more advanced. And we always had female matai, even before the arrival of the Europeans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this respect, I believe we are quite different from Fiji and Tonga. In Tonga, the dividing line is quite clear. If you are born a noble, you remain a noble and if you are born a commoner, you will always be a commoner. It is the same in Fiji. There, you are automatically a ratu K your father was one. By contrast, here in Samoa, my son cannot automatically succeed to my title. So to become a matai, a person has to earn it, and to put his case at the family meeting which is convened to choose a successor. Usually, the person chosen is the one who displays the best leadership qualities. I think I should also point out that becoming a matai is not that difficult. If you want to be one, you inform the family and if they think you have matured sufficiently, you will generally get the position and then become eligible to be a parliamentary candidate. It is typical that when a family sees a fellow has matured, he becomes a matai.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Profile</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Area: 2934 km² (Exclusive Economic Zone of 130 000 km²)</P>
+<P ALIGN="JUSTIFY">Population: 165000</P>
+<P ALIGN="JUSTIFY">Population density: 57 per kiLom&eacute;tres</P>
+<P ALIGN="JUSTIFY">Capital: Apia (situated on the island of Upolu)</P>
+<P ALIGN="JUSTIFY">National language: Samoan (English is the business language)</P>
+<P ALIGN="JUSTIFY">Currency: Tala (WS$) made up of 100 sene. In June 1996, 1 ECU was worth approximately WS$ 3. (US$1 = WS$ 2.3)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Politics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">System of government: A unicameral constitutional democracy with strong traditional elements. The current Head of State is one of the country's four paramount chiefs, and he holds the office for life. Thereafter, the Fono (Legislative Assembly) will elect the Head of State for five-year terms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is universal franchise (introduced in 1991) but in order to be a Parliamentary candidate, one has to be a matai (family head). Western Samoa is said to have about 19000 matai. The minimum voting age is 21.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Head of State: HH Malietoa Tanumafili II</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister: Tofilau Eti Alesana</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Main political parties: Human Rights Protection Party (HRPP), Samoa National Development Party (SNDP)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Party representation in Parliament: HRPP 35, SNDP 11, Independent 3. (The HRPP total includes 11 members elected as independents in the April 1996 election who subsequently joined the governing party).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p038.png"></center><br>
+ Map</P>
+<P ALIGN="JUSTIFY"> </P>
+<P ALIGN="JUSTIFY">Economy (1995 figures unless otherwise stated)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Annual GDP per capita: approx US$ 950</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GDP growth rate: 7%. The target for 1996 is 34%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Principal exports: coconut oil (WS $8m), coconut cream (WS $4.8m), copra (WS $2.2m).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Balance of payments: exports - WS $21.7m, imports - WS $228.1m. 'Invisible' earnings, officially described as 'net foreign earnings' amounted to WS $171m, leaving a current amount deficit of WS $36.8m in 1995 (20%lower than the previous year). The main 'invisibles' are private transfers (remittances from Western Samoans living abroad), tourism, income from services and the value added trade of the Yazaki electrical components firm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inflation rate (end 1995): 1 %. Inflation tends to fluctuate a great deal. The figure for 1994 was 18.4%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government budget (projected for 1996/97): revenue WS $288.4m, expenditure WS $312.7m, deficit WS $24.3m.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Accumulated government debt: WS$ 389 m</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social indicators</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy at birth (1993): 67.8 years</P>
+<P ALIGN="JUSTIFY">Adult literacy (1993): 98% (A UNESCO report in 1994 suggested that real literacy levels were significantly below those indicated in official figures) </P>
+<P ALIGN="JUSTIFY">Enrolment in education: all levels from age 6-23: 74%</P>
+<P ALIGN="JUSTIFY">Human Development Index rating: 0.700 (88th out of 174) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Marketing a tropical idyIl</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Folasaito Joe Annandale and his wife Tui are the brains behind Western Samoa's latest tourist facility- the Sinalei Reef Resort, which has just opened on the beautiful south coast of Upolu island. They are among a growing number of Samoan entrepreneurs who are injecting new dynamism into the country's economy although they are somewhat unusual in the tourist trade. With the notable exception of the famous 'Aggie Grey's Hotel' in Apia, tourist accommodation in Western Samoa has tended to be the preserve of foreign investors, including some of the major international hotel chains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At first sight, it is surprising to discover how underdeveloped the tourism sector is in Western Samoa. Tour operators may be inclined to use the phrase 'tropical paradise' a little too freely but this island nation certainly seems to meet most of the essential criteria. It has the obligatory golden beaches fringed with palm trees, extensive coral reefs and striking mountain scenery overlaid with lush vegetation. The vivid colours leave a particularly strong impression. Greens predominate but there are also many copper-leafed trees and bushes, and an abundance of red, orange and yellow flowers. Western Samoa can also offer a number of special features which are important in marketing terms. There is, of course, the legendary hospitality of the Samoans and their distinctive and vibrant traditions. This must be one of the most musically 'literate' populations in the world, a talent which is reflected in the numerous choirs/dance groups. The harmonies are impressive and the traditional dances are both expressive and entertaining. There is also the unique 'fare' architecture which is a particular source of fascination to outsiders, not to mention the Robert Louis Stevenson connection. The famous author spent the last four years of his life in Western Samoa and the house where he lived- which used to be the Head of State's residence - has recently been converted into a museum.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Good prospects</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The potential for expanding tourism is something that has not escaped the government. In today's highly competitive free-market world, countries are being urged to exploit their 'comparative advantage' and the Western Samoan authorities recognise that this sector offers some of the best prospects for future growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like most other economic activities, the tourist trade was badly hit as a result of cyclone devastation in 1989 and 1990. However, visitor numbers have increased substantially since then. Indeed, looking at year on year earnings, the tourist sector is performing better than any other area of the economy. In 1994, income was WS$.58 million (50 000 + visitors). The following year, it reached WS$.78m and there are hopes that it could top WS$.100m in 1996. Of course, no-one in Samoa is talking about 'mass' tourism. The country is too far from the main industrialised nations to be able to offer traditional package holidays (perhaps fortunately !), and too small to absorb the cultural and environmental impact without lasting damage. Having said this, the market can be divided into two very distinct portions. At one end of the scale are the low spending 'back-packers'-often taking advantage of relatively cheap 'round the world' airline tickets to stop off and sample the pleasures of Western Samoa. These tourists may not spend very much on a daily basis but they are reasonably significant from a financial standpoint because they tend to stay for quite lengthy periods.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the other end, you find the high-spending, 'exclusive' customer willing to pay for high quality accommodation and catering. Perhaps not surprisingly, the Government is more interested in attracting the latter, which is why they are keen to encourage investors such as the Annandales.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier spoke to Joe Annandale about his business strategy when we recently visited the country. The Sinalei Reef Resort, which has received EIB loan financing channelled through the Development Bank of Western Samoa, has just 20 rooms (including four suites) giving it a capacity of less than 50. Customers will be offered a tropical idyll and a chance to escape completely from the pressures of modern living. The long term aim, according to Mr Annandale, is to entice Europeans in general and Germans in particular. The latter, it is said, have a preference for environmentally-friendly, 'escapist' vacations and, of course, there is a historical link between Germany and Western Samoa. Until a European clientele can be built up, the focus will be on attracting guests from Australia and New Zealand. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Culture clash?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there is no question of Western Samoa being swamped by visitors from overseas, even a modest increase in tourist numbers is bound to have an impact in this country of just 165000 inhabitants. On the negative side, the Samoan system of customary (village) land ownership sometimes appears at odds with entrepreneurship founded on individual ownership of property and resources. In the early stages, Joe and Tui Annandale encountered local difficulties-including squatters-when they bought the land to develop the resort. The usual arrangement is for overseas tourism operators to lease customary land, a process which may involve protracted and ultimately fruitless negotiations with the matai (village heads) who have traditionally used the land for other purposes. Of course, the clash between traditional land tenure systems and 'modern' capitalism is not restricted to tourist ventures-as mining operators in Papua New Guinea have discovered. But while one understands the frustrations for developers, who may find themselves embroiled in complex and interminable land disputes, we should also recognise the concerns of local people who see a possible threat to their way of life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the positive side, new tourism developments mean jobs and trading opportunities. In the building of the Sinalei Resort, the Annandales drew heavily on local labour, employing 35 people from the neighbourhood. As Mr Annandale pointed out, this was essential for a complex designed to fit in with the local environment. The Samoans have always built their own houses and only they had the required carpentry skills. The resort also employs 35 regular staff for catering, housekeeping etc. and again, the majority are local people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, there is one criticism often levelled against tourist ventures which certainly does not apply at the Sinalei Reef (or other Samoan hotels). This is that most of the food and drink consumed by visitors is imported. The Annandales make a point of purchasing their fish, meat and fruit locally, thereby ensuring that some of the financial benefits of their venture flow back to their own community: in short, a happy combination of astute public relations and good economics. </P>
+<P ALIGN="JUSTIFY">S.H.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with opposition leader Tupua Tamasese Efi</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY">'Revive the agricultural base'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tupua Tamasese Efi a former Prime Minister of Western Samoa, is leader of the opposition Samoa National Development Party which won 11 of the 49 seats in the parliamentary elections held in April 1996. In this interview, he outlines his own and his party's views on some of the key political and economic issues in his country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In what ways does your party offer a different agenda from that of the governing HRPP ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I think the differences are mainly of emphasis. The present government tends to focus on law-making and exploiting the country's least developed status. Our focus would be more on developing our indigenous agricultural industries. If you scrutinise the economic picture in Samoa, you will find that there has been a very substantial decline in agricultural exports in the last fifteen years. Our economy, if you can call it that, is increasingly sustained by largesse-the donations that we get from overseas. This has complicated our situation. Our relative economic independence has been sabotaged to a point where, suddenly, we are getting a proletariat. That might be unavoidable in a lot of places, but it doesn't have to happen in a small country like ours which has self-sustaining village units, and a potentially secure agricultural base supported by products like cocoa, copra and bananas. If you look at what is happening today, you see that, all of a sudden, we have a new class of under-privileged people with absolutely no income at all. And the tragedy is that it has happened without anyone really noticing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So our emphasis is to try and revive our agricultural base, and to seek out exports. In the past, our economy was sustained by cocoa and copra exports, and a lot of our food was sold to New Zealand. Now, you find that there are hardly any exports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· So your focus would be more on boosting the traditional aspects of the Samoan economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Not necessarily traditional. Our party is not bound to cocoa, or copra or whatever. But we are committed to improving our agriculture. It matters little whether it is traditional or other crops. But we need to break back into the New Zealand market. This is the best place to aim for. Australia has its own tropical sector and nothing that we can produce is needed by them. New Zealand is different. One of the biggest challenges we have to overcome in getting back into that market is our fruit fly problem. It would seem sensible for us to channel substantial resources into overcoming this hurdle so that we can sell to New Zealand again. There is a tremendous potential market-and not just for copra. There are also products such as flowers, and a whole number of other possibilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Given what you have just said,what emphasis would you place on sectors like manufacturing and tourism ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-I think that tourism is an obvious way to go and this is where we are in agreement with the government. Of course, you will have heard of the debacle of the Air Polynesia finances. When you compare the losses that were run up with our foreign exchange reserves you get some idea of how enormous the problem was. It was a situation that went badly awry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This issue aside, we agree that we need to get into tourism-but it must be within reason. Part of the explanation for people gravitating towards tourism is that they see it as the only available avenue-or at least the most visible way of making money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another economic point I want to raise concerns debt. Loans can be a quick fix, but when your whole economy is tied to indebtedness, you are creating something that is built on sand. You end 'A potentially secure agricultural base' up acquiring more and more capital items that are totally unrelated to your present or likely future resources. This is one of the most destructive things that can happen to a society, and it is very clearly happening here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You have a rich and vibrant living culture here in Western Samoa. Are you concerned that globalisation could ultimately pose a threat to this ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-No, I am not worried. You have to accept it as a natural development. The things that are distinctive in our culture have to find their place in adapting to the new realities. There is no point putting your head in the sand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Turning to political aspects, you now have universal franchise, but you still have to be a matai to be eligible to stand for Parliament Does your party have any plans to change this ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Some years ago, we had a constitutional convention which led to changes in the system. Attached to that was a provision requiring a further constitutional convention to be convened in 20 or 25 years (I can't remember the exact period). So we are committed to that. We have to sit down and look at the overall picture. We have gone a long way in terms of universal franchise and it is possible that we need to go even further.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But if one takes the United Kingdom as a model, I think the important lesson is that you should 'make haste slowly'. The genius of the Westminster model is that it involves careful evolution. I hope that this tradition will be followed by our country. The constitution, as it was put together some 30 or 40 years ago, has served its purpose very well but there are quite a few anomalies appearing now.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What is your view about regional cooperation in the South Pacific What future do you see in working together with the other countries of the region- perhaps presenting a more united front to the outside world ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-There is a lot of sense in the SAS approach-I am referring here to the Scandinavian countries getting together to form an airline. It is sensible to take a common stand where we have a common interest. But there are obviously intricacies resulting from historical, economic and social factors. At the moment I am reading a book on lain Macleod, the British Conservative statesman. His experience in the failed attempt to form a federation in the Caribbean is very revealing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When you enter a common endeavour, there is always the pull of your own particular interests. And there can be a suspicion that the 'bigger boys' will use the others to promote their own interests. A lot of this may be perception rather than reality. Also, traditional rivalries can intrude. Sometimes you need to fall flat on your face before you Let me give you an example from the world of rugby. It took Rupert Murdoch to get Fiji, Tonga and Western Samoa to realise that our fates are intertwined. He has come in with a commercial package that has taken over the entire rugby scene in the region- with a heavy emphasis on Australia and New Zealand-and this has hit us in a big way. For example, we find ourselves being cut out of traditional rugby tours. There is no point in us trying to claim that we are self-sufficient in this area. The big lesson is that we need to cooperate a lot more with the Tongans and Fijians in order to make an impact on the wider rugby scene._ </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Western Samoa-EU cooperation</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY">Focus on utilities</P>
+<P ALIGN="JUSTIFY">by Mylanwy van de Velde</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Western Samoa's cooperation with the European Community began in 1975 with its accession to the Lom&eacute; Convention. From the start, the sector to benefit most from programmable funds (ECU 4.6 m under Lom&eacute; I and ECU 6m under Lom&eacute; II) was the energy sector, with the financing of the Samasoni Hydroelectric Scheme in the late 1970s and the Sauniatu Hydropower Scheme in the early 1980s.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In parallel, a programme of 260 microprojects was funded involving the development of poultry and pig farming, and fisheries, covering 96 villages on the main islands of Upolu and Savai'i. A further ECU 890 000 was allocated to the Western Samoa Development Bank, in the form of a credit line, to increase the Bank's lending capacity. In addition, at a time when copra exports were still considerable, the Community financed storage and handling facilities for coconut oil and copra pellets (ECU 900 000).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On top of programmable aid, Western Samoa received 12 Stabex transfers totalling ECU 9.3m for export losses on copra, wood, bananas and cocoa in the period 1975-84.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under Lom&eacute; III, the development of the country's substantial hydroelectric power potential continued, and Western Samoa began to make considerable steps towards self-sufficiency in energy needs. While in 1980 some 78% of the electricity generated came from diesel plants, by 1986 this percentage had dropped to 26%. The volume of petroleum imports for electricity generation dropped to 36% in the period 1982-86. With the building of the Afulilo Hydropower Plant (Lom&eacute; III and IV), these volumes have decreased further, with positive benefits in terms of foreign exchange savings. The scheme (which was co-funded by the Asian Development Bank, the EIB, the World Bank and the Western Samoa Electric Power Corporation) involved the construction of a 10 million cubic metre reservoir, a penstock, a powerhouse, and the installation of mechanical equipment and transmission lines, and has contributed substantially to the quality of electricity supply on the island of Upolu.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p043.png"></center><br>
+ Community aid to Western Samoa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Additional work has been done with Lom&eacute; IV funds to address the question of rural water supply: a water master plan and design study for a number of rural areas have been completed, and a public awareness programme on the rational use of water resources has been designed for implemention at such time as planned infrastructural work goes ahead.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, an ECU 1 m microprojects programme has been initiated with the aim of financing the renovation of infrastructure for rural communities in the fields of water supply, health, education, tourism, agriculture and fisheries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Stabex payments under Lom&eacute; 111 (1985-1989) and Lom&eacute; IV (1990-1994) amounted to ECU 11.1 m and ECU 5.7m respectively. These were paid to compensate for losses in coconut oil and copra products, especially, but also for losses on exports of cocoa beans and of wood in the rough.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the above grant aid, the EIB has provided a total of some ECU 9m in risk capital in the years since 1981, the bulk of which was used in connection with the Sauniatu and Afulilo Hydropower Schemes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A further total of ECU 660 896 has been allocated in emergency aid to Western Samoa, in 1983 after a serious fire on Savai'i, and in 1990 and 1991 after the disastrous cyclones Ofa and Val.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Programming of the next tranche of EC funding under the eighth EDF has still to be completed, but the indications are that prominence will be given to extending and upgrading the water supply network. </P>
+<P ALIGN="JUSTIFY">M.v.d.V.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A new health-centre for Tafua</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sight that greeted the people of Tafua when they emerged from shelter in 1990, following the passage of Ccyclone Ofa,was one of complete devastation. The tropical storm had been one of the worst in living memory and this village community on the island of Savai'i, together with many others in the Samoas, found themselves having to start almost from scratch. Homes had been swept away' crops destroyed and much of the essential infrastructure Iay in ruins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is a testament to the resilience and determination of the people in these communities that there are few signs today of the havoc wrought by the winds just six years ago. In some places, rows of dead trees still stand in silent witness to the power of Mother Nature, although the scene is softened : by the new crops and lush vegetation growing beneath. But the villagers have rebuilt their houses and, with some help from outside, they have been able to re-establish i the essential community facilities as well. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through its micro-projects programme, the EC was able to offer a helping hand in the task of reconstruction. For the modest sum of just ECU 10 000, Tafua now has a new community health clinic adjacent to the site of the old one which was swept away by Ofa. In keeping with the rules of the scheme, the villagers were obliged to contribute 25% of the cost-which they provided in kind, in the shape of the labour for rebuilding the clinic. The Courier visited Tafua in June and was shownaround the facility by Nurse Agata Leuelu who provides primary health care for the 600 villagers. We also met local Methodist minister, the Rev. Siaosi Selesele, who explained how the people had taken shelter in the neighbouring school when the storm reached Samoa. It turned out to be the right choice as it was one of very few structures left standing in the neighbourhood. Villagers are obviously hoping that there won't be another 'Ofa' for a very long time' but if and when the next big wind does strike, the new ctinic-which has been built to withstand a lot more strain-should hopefully be able to weather the storm. In the meantime, it provides an important service in the delivery of health care to the people of the area. The European Community has also provided micro-project funding to help rebuild the health clinic at Taga on Savai'i. </P>
+<P ALIGN="JUSTIFY">S.H.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Dossier</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Investing in people</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Dossier coordinated by Augustine Oyowe)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Previous editions of The Courier have dealt, separately and at length, with various aspects of human resource development, especially in the context of recent dossiers on population and social development, education and training, public health, women, and poverty. Our current dossier looks at the issue from the investment perspective.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To say that investing in people makes economic sense is to state the obvious. But to what extent are the implications of this statement fully understood in the developing countries, especially in sub-Saharan Africa in these days of constantly shifting development theories?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Labour or 'human capital' has long been recognised as a key factor of economic growth. As opposed to sustainable human development, which places human beings at the centre of economic activities (the recipient of the fruits of economic progess), 'human capital' places them at the beginning of the process. The difference of approach is thus evident even though the objective is the same. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Investing in people is a concept which simultaneously combines 'human welfare' with the 'human capital' approach at the beginning of the economic development process. It encompasses nutrition, health and education, and should, under the right investment climate or conditions, enable any investor, whether State or individual, to reap an adequate return .</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After three decades of considerable efforts at investment in health and education by sub-Saharan African countries, the returns in terms of standards of living, economic grovvth and rate of development have been extremely disappointing. The conclusion which can be drawn is that the conditions necessary for adequate returns on these investments have been absent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Colonial legacy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sub-Saharan Africa inherited from the colonial regimes, infrastructures in health delivery and education that were not only alien to its culture and traditions, but also totally inadequate for nation building. It is a well known fact that in 1960, there were no more than 1200 university graduates in Capital redefined</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is important when thinking of investnent in human resources to understand the real concept of capital. Below is an extract of a definition given by Stefan de Vylder (taken from his UNDP discussion paper: 'Sustainable Human Development and Macroeconomics strategic links and implications' . </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A child in the North is born wealthy. His or her share of the capital accumulated by earlier generations is worth a fortune. The higher wages and salaries in the North, compared with those in the South, largely reflect differences in endowment of the country, rather than of the individual. The fact that, for example, a nurse in Germany earns 30 times more than one in Bangladesh or Zambia has little to do with individual differences in training or skills; the higher salaries in the North simply reflect the higher dividend on the capital bestowed from the past. Part of this wealth or heritage is easily visible: factories, roads, schools hospitals, universities, telecommunications, and other infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, there are other, less tangible, forms of capital that constitute a crucial complement to physical and infrastructural capital; parliamentary democracy, a free press, respect for human rights' norms for social interaction, systems of rapid dissemination of new ideas, trade unions and a myriad of other large or small social organisations, a judiciary system which, by and large, defends law and justice, and other institutions. This latter form of capital may be called institutional or social capital. It is also highly unevenly distributed in the world, with large differences both between the North and the South and within individual countries of the North as well as in the South the region as a whole. Indeed, some countries had no graduates at all and in others, they could be counted on the fingers of one hand. In what was effectively a race against time, African leaders understandably responded by investing massively in human resource development. This was made possible partly by small, but steady rates of economic growth and partly by sustained foreign assistance. Between 1960 and 1980, sub-Saharan African governments consistently allocated high proportions of their annual budgets to health and education. Households and individuals made similar efforts (accounting for nearly 75% of all spending on health). They made sacrifices and gave a high premium to the education of their children.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The results were tangible and very significant. By the late 1980s, sub-Saharan Africa was producing over 70 000 graduates a year. Major cities had hospitals and health centres and the rural areas, clinics and dispensaries. Amid a general improvement in nutrition and health-care delivery, the incidence of infectious disease, and maternal and infant mortality were considerably reduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite these achievements, the approach to manpower building by the post-independent African leaders was, to say the least, haphazard. As a result, a number of problems, such as the appropriateness of school curricula, under staffing and the long-term budget implications of recurrent expenditures, were overlooked (although reform efforts have since been attempted in some countries with varying degrees of success).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The consequences were felt in the 1980s when Africa's economic crisis was only just beginning. Health and school infrastructures deteriorated for lack of maintenance. There were shortages of qualified teachers and teaching materials leading to falls in educational standards as well as in primary school enrolments. And health systems failed for lack of personnel and drugs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The situation has worsened as the continent's economic crisis has deepened-a crisis characterised by huge budget deficits, high inflation rates, sluggish growth rates and a heavy debt burden. Structural adjustment programmes (SAPs), introduced in response to this, have only served to undermine further the gains made in human resource development. SAPs have been aimed mainly at macroeconomic stabilisation, deregulation and privatisation of state enterprises, and the social sectors have lost out in the process. Subsidies on basic commodities, especially food, have been removed, civil servants and employees of state enterprises have been made redundant and cost-recovery has become the standard practice in medical services. These measures have all combined to produce a level of poverty never before seen in the region, a situation which has adversely affected nutritional standards, provoked malnutrition in many countries and reduced resistance generally to infectious diseases. Because of the rise in unemployment, large sections of the educated population have been rendered unproductive, a waste of several years investment by both the state and the individuals in question.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Appropriateness of skills</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although sub-Saharan Africa produced a large number of graduates before the economic crisis began, few had the kinds of skills needed for industry and agriculture. The evidence of this lies in the unsuccessful attempts by some governments in the late 1970s to indigenise executive positions, most of which required high levels of technological knowledge or experience. The 1980s saw a dramatic increase in the number of foreign technical assistants working on the continent and, paradoxically, in the number of qualified African professionals leaving, mainly for Western Europe, the United States and Canada.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International technical assistance to, or cooperation with, subSaharan Africa has intensified. Organisations such as the World Bank, IMF, UNDP, UNCTAD, UNESCO, European Union and Commonwealth are all involved in one form or another. The effectiveness of this assistance varies, however. This dossier features articles on the work of three of these bodies (the Commonwealth, UNDP and VNESCO). The Commonwealth Fund for Technical Cooperation was set up more than 25 years ago to mobilise Commonwealth skills to meet the needs of member states as required. The UNDP's TOKTEN programme is designed to reduce the negative impact of the brain drain by getting highly qualified developing country expatriates to contribute their skills to the development of their home countries without necessarily having to return permanently. Finally, UNESCO's university twinning programme is designed as a mechanism for the rapid transfer of technology and sharing of knowledge. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While international assistance or cooperation is indispensable, it is surely no substitute for Africa's own efforts at human resource development. Three years ago, Edward Jaycox, then World Bank Vice-President for the Africa Region, announced what appeared to be a change of policy at the annual conference of the African-American Institute in Washington DC. He said that the Bank would no longer pay for foreign technical assistants to help resolve African economic problems but would instead help African governments build their own capacity. Although the Bank has traditionally had enormous influence on development thinking and policy worldwide, the apparent policy change does not appear to have influenced other donors. Nor, indeed, is there any evidence that the Bank itself is implementing it vigorously. The number of foreign experts being sent to Africa continues to grow. There were over 100 000 in 1988.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rationality of investing in people</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the negative social impact, ten years of structural adjustment have not produced the sought-after stabilisation or the economic growth that was initally anticipated. Even the World Bank and IMF, who spearheaded the structural adjustment idea, have admitted that it has flaws and the need for a new approach to sub-Saharan Africa's economic problems could hardly be more urgent. In the Dossier, Giovanni Andreas Cornia argues for a new focus for structural adjustment, based on restoring adequate levels of public spending on health, education, social welfare and water supplies, so as to enable sub-Saharan Africa to restore and develop its human resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Evidence of the impact of a healthy and educated population on economic growth and development abound. Studies on the economies of the East Asian 'tigers' have all concluded that big investments in education in the late 1950s and 1960s were largely responsible for the rapid growth they have experienced in recent years. Malaysia, although a latecomer, appears to be following in the footsteps of its neighbours. After nearly two decades of investment in human resource development, and the introduction of a foreign investment policy which requires some technology transfer, the Government now predicts Malaysia will achieve 'fully developed' status by 2016-twenty years from now.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A relatively well-educated workforce and a certain amount of physical capital or natural resources are all a country needs to succeed economically. Sub-Saharan Africa has sufficient natural resources as is often pointed out. The other side of the equation-a relatively well-educated workforce-is missing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sub-Saharan Africa lags behind other regions in human resource development for a complex variety of reasons. The natural and political environment are not conducive to the delivery of social services: low population density and weak transport infrastructures make such delivery expensive and the achievement of economies of scale impossible. The region's climate favours a variety of diseases (such as malaria and sleeping sickness) and many areas have little or no access to natural water sources. Political instability and weak institutions also continue to cast a long shadow. Although these constraints are long-term, appropriate policy measures could reduce their negative impact significantly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Giovanni Cornia analyses the distributive effects of appropriate health care, nutrition and education on economic growth. He suggests ways of making rational use of available resources for maximum returns and of mobilising funds through taxation, foreign aid and other sources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In an age of increasing globalisation, where technology is more easily transferable across borders, a healthy and educated population is essential, not only for the absorption and use of new technology but also for meaningful participation in international trade.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is insufficient, however, to have an educated workforce. Sub Saharan Africa must acquire the institutional and managerial capacity to make the right decisions, both in the public and private sectors. This is essential in the quest to eliminate poverty, achieve sustained and sustainable economic growth and ensure a realistic integration of the region into the global economy. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">A much needed new focus for SAPs</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Giovanni Andrea Cornia </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past two decades, a clear consensus, supported by a growing amount of empirical evidence, has emerged on the growth and distributive effects of appropriate health care, nutrition and education, and on the rationality of investing in human resources to promote development in low-income economies, and in sub-Saharan Africa in particular. It is now clear that public and private rates of return on investment in primary and secondary education are substantially greater than those in most industrial sectors. Similarly, it is now well demonstrated that nutritional interventions in favour of workers at low levels of food intake has a very large impact on labour productivity. Also, provision of simple but adequate nutrition and health care at an early age has been shown to spare substantially greater health outlays over the longer term. While the number of these examples can be multiplied, the lesson is overwhelmingly clear: investing in people is a sound development policy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the same two decades, a broad political consensus has also emerged on the need to establish realistic targets in these areas and mobilise adequate resources to achieve them. The latter decade, however, has also been characterised by a widespread and acute recession which has reached its lowest point in the African continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While there has been a general recognition of the link between the deterioration of the social sector and Africa's economic decline, the interpretations of the causes of this decline and how best to address them vary considerably.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 1980s also witnessed the advent of structural adjustment, an approach aiming at revitalising economies affected by severe crises and which calls, amongst other things, for a reduction in public spending, including on social services. With sharp falls in revenues, it was argued, African governments could no longer afford to provide health and education free of charge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments were to encourage instead the role of the private sector (since competition between state, private and non-governmental agencies fosters efficiency and enhances quality) and make households bear a greater share of the cost of publicly provided social services (as-it was alleged-households had a strong 'willingness to pay' for better quality health care and education).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a debate characterised by an overwhelming concern for expenditure reduction, little thought was given to protecting the provision and effectiveness of basic health care and education for all. Nor was sufficient attention paid to the mobilisation of additional revenue through taxation, foreign aid or other measures Even the introduction of rationalisation measures, which would have allowed for use and preservation of limited resources, received scant attention. During this period, public policies often ignored a number of well-known public finance arguments concerning market failures, externalities, natural monopolies, etc. typical of basic health and education. It was all too often forgotten, for instance, that the market systematically undersupplies 'quasi-public goods' like education, safe water, immunisation and collective infrastructure (i.e. goods which produce benefits not only for consumers but also for society as a whole); that incomplete or non-existent markets alone are unable to provide complete insurance coverage against the risks of sickness and disability; that the free play of market forces can generate levels of poverty that are socially unacceptable, and that competition among many small providers does not allow for the realisation of the economies of scale which only the public sector can realise because of its size, administrative infrastructure and revenue raising ability.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Greater and better government involvement</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this paper, I will attempt to point out the main distortions in the social sector in sub-Saharan Africa and the major reforms, part of an alternative policy paradigm to the standard approach focusing on large expenditure reductions. My main line of argument is for more efficient and renewed but, in most cases, greater rather than less government involvement. I do not deny the important role of communities, nongovernmental bodies and private providers of social services, but the retreat of the state, which has been underway for several years in most of Africa, is palpably wrong: it may be a good survival strategy, it is definitely not a good development strategy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any approach to revitalisation of the social sector in Africa must aim at increasing both the quality and the relevance of services to the life, health and productivity of the population; enhancing efficiency; reducing distributive biases in the use of public expenditure, and improving the flow of both public and private resources to the social sector. These sets of measures are briefly discussed here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Raising relevance, reducing unit costs and enhancing quality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two basic initiatives are essential to the achievement of this goal. Firstly, it is necessary to adapt the content of services to the demands placed on the child, the adolescent and the family by the external environment. Secondly, in doing so, it is necessary to provide minimum resources, particularly recurrent inputs, for every unit of service offered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Much can be done to improve the relevance of education in Africa. A key element in this is the wider use of African languages in the educational system. Admittedly such a step would probably encounter obstacles, but the results of pilot projects in the continent and experiences in several English speaking countries have been encouraging. The use of African languages should be expanded throughout primary and at least part of secondary schooling. And the curriculum of basic education should include basic health science, agriculture, food and nutrition, basic technological science, ecology and environmental studies as well as reading, writing, arithmetic, history, geography and elementary civics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While responding more appropriately to the life and developmental needs of children and adolescents, these measures offer the potential to improve substantially the cost effectiveness of the educational system by reducing the number of drop-outs and repeaters, particularly if the measures are accompanied by school-based nutritional support programmes and by steps to ensure a steady, if basic, supply of teaching materials such as books, chalk, slates, pens, exercise books and so on. Minimum expenditures for the latter, estimated at $5-10 per child per year, have been shown to have a profound impact on the quality and attractiveness of education.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improving the relevance and quality of African secondary and higher education will require an increase in the number of courses in science, engineering, agronomy, management and other fields. Given the limited success of vocational training and yet the profound need for this type of education, a more flexible approach may be appropriate. Business associations and ministries of labour, rather than ministries of education, for example, could organise the type of vocational training that responds more closely to labour market conditions. Much needs to be done to gear university research to local and national needs. Rather than maintaining the model of independent residential universities, faculties could interact more with and rely upon local institutions and non-governmental organisations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the health sector, a more vigorous approach is necessary to implement the 'Health for All' strategy. In particular, more attention must be paid to the quality of the training imparted to village health workers, the provision of minimum supplies of essential drugs, adequate supervision, the mobilisation of communities and the strengthening of family planning services in the first tier of the primary health care pyramid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Greater efforts are needed to contain unit costs through the mobilisation of community resources (such as materials and time) and the introduction of 'product standards' and 'production techniques' more in line with local factor endowments. With respect to capital expenditure, one major source of potential savings is the substitution of imported materials with local ones in the construction of schools, clinics and other public health facilities. Through this approach, capital costs per student could be more than halved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In health care, savings are also possible, in some cases, in wages and other recurrent expenditures. The potential for savings through increased efficiency in the procurement, management, storage, distribution and prescription of pharmaceuticals is substantial. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And there is a need for more carefully articulated manpower policies, with recognition of the cost implications of alternative skill mixes. Many tasks carried out by senior professionals can be performed by auxiliary personnel. In this regard, there is substantial scope for the application of nominal fees as a tool to guide demand for health care and thus increase efficiency.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Similar considerations are valid in the education sector. Despite considerable declines during the 1980s in both French-speaking and Eastern and Southern Africa, teacher salaries in the late 1980s were still considerably higher than per capita GNP in several countries. While a cutback may be possible in some countries, reductions below the 'efficiency wage' should be avoided as they affect the quality of teaching.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are, of course, other approaches to reducing unit costs such as using teachers trained on crash courses and- paid salaries lower than that of fully trained ones, multi shift education to increase teaching hours, multigrade classes to increase class sizes and the creation of regional training centres with donor support. In addition, in most of sub-Saharan Africa, all university students receive fellowships to cover living expenses while at school. In many cases these fellowships represent a substantial proportion of total unit costs at the tertiary level. They add, in effect, to the regressive nature of educational subsidies and should be suppressed for all except for those who are least able to pay.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improving distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Substantial improvements in the distribution of benefits of public expenditure could be obtained through its restructuring towards basic services which benefit the poor more than they do the rich. This would mean, typically, the reallocation of part of the expenditure on hospitals to primary health care activities and part of the expenditure on universities to primary education. It would also mean that a greater share of investments in water supply and sanitation should be assigned to rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Correcting existing misallocation, however, is not simple, as capital and labour resources are only partially mobile. This is particularly true of capital expenditure which has already been invested in physical infrastructure. Inter sect oral reallocation is easier for recurrent expenditure, particularly when budgets are expanding, and it can lead to the achievement of more efficient and distributive gains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government subsidies need to be improved through effective targeting on 'merit goods' (such as food and shelter). Targeting is distributionally and administratively more effective when it is accomplished according to some objective criteria such as geography (the poorest areas), type of commodity ( low quality foods not consumed by the rich), easily identifiable population group (like pregnant women, young children, children in elementary school in poor areas, etc.) or season. It is less effective when carried out by means-testing or by targeting individuals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The decentralisation of health care and education in the African context is likely to improve the geographical distribution of services. Poor communications and transport systems, population dispersion and the fact that the supervision of personnel, resource distribution and operations is easier at lower levels of administration, are all arguments in favour of such decentralisation. Nonetheless, where it means loss of control over the implementation of national policies (in curriculum development, manpower training, drug procurement and so forth) and excessive additional financial burdens on households and communities, decentralisation is potentially damaging. This was the experience of Kenya when the purchase of drugs was decentralised at the district level. It subsequently had to reverse this policy because of the problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Increasing the flow of resources to basic social services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the considerable scope for protecting and, in some cases, expanding the delivery of cost-effective and high-impact social services, even during periods of declining resources, there are limits to what can be achieved through the measures discussed above, particularly in countries where the share in GDP of public health and education expenditure is already low. Indeed in most African countries, the flow of resources to these sectors must be vastly increased. The options available include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Increasing the share of government expenditure on key social services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Top priority should be given to a radical restructuring of government expenditure involving the shifting of resources towards those sectors with high social rates of return. Expenditure on defence can be cut substantially, while subsidies to chronically lossmaking public and private enterprises and interest payments on debt (the relief effect on foreign-debt interest payments of current provisions is utterly inadequate) should be reduced. If realistic expenditure restructuring like that proposed here were implemented, 1015% of overall public spending in many countries could be redirected to social activities with high rates of return. One half to two-thirds of these savings could be allocated to health care, nutrition, training, education and welfare, thus raising the share of these activities to about 30-35% of total expenditure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Increasing taxation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Between the late 1970s and the mid-1980s, the average tax to GDP ratio for sub-Saharan Africa fell from 18% to 16-17%. (Only recently are there signs of recovery, but these are confined to only a few countries). This resulted mainly from the recession affecting the region and from the limited priority attached to revenue collection in most adjustment programmes implemented during the first part of the 1980s. In these 'first generation' programmes, the stabilisation of deficits was achieved mainly by cutting expenditure and raising excise duties. Increases in income taxes and progressive indirect taxes were far less frequent and land and property taxes were almost never introduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While taking effect rapidly, the measures implemented led to excessive drops in public expenditure on 'quasi public goods' and have had a regressive distributive impact. It is now widely recognised that a more active tax policy is needed. Such a policy should aim at improving revenue generation and enhancing the efficiency and equity of the overall tax system. This would permit a controlled rise in specific 'socially efficient' public expenditures, particularly basic health, primary and secondary education and public infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the 1980s, a number of countries, including Burkina Faso, Kenya, Malawi and Zimbabwe, initiated efforts to reform their tax systems. While the choice of optimal tax instruments has depended on specific country conditions, a few general principles of tax reform apply to all countries. First, colonial type tax systems emphasising the taxation of exports (and to some extent, of imports) should evolve towards systems which focus on income taxes, progressive and efficient indirect taxes and increases in the prices of such public utilities as telephone and electricity which benefit mainly the wealthier sections of society. Second, purchases of goods and services consumed by the poorest should be exempted from indirect taxes. Third, efforts should not concentrate on raising marginal tax rates but rather on broadening the tax base by reducing tax evasion and tax elusion, and fourth a low, uniform and broad-based tax on wealth (such as on land or other assets) should be introduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A non-distortionary and equitably-spread increase in the tax ratio equivalent to 2-3% of GPD is technically feasible in a good number of African countries and would by itself add to the real flow of resources to health care and education by about 15%, even assuming no growth and no shift in priorities towards the social sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Introducing 'earmarked' taxes or raising local ones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The flow of tax resources to the social sector could be augmented more readily if the new tax revenue thus generated, or at least part of it, were directly earmarked for specific health and education activities (for which there are guarantees that tax money is spent efficiently), or if these taxes were raised directly by district and provincial authorities, who are usually entrusted with responsibility for social services at the local level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Mobilising additional resources from households and communities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In sub-Saharan Africa, as in most other developing regions, households have long borne a substantial share of the national expenditure on health, education, water supply and so on by contributing resources (in kind, cash and time) for the construction of health and education facilities, covering direct and indirect costs (transport uniforms, fees, drugs etc.) associated with the provision of public services and making payments to private providers. Despite these already considerable contributions, user charges have been introduced or raised on a large scale in recent years in many countries to alleviate the burden on public expenditure imposed by the economic crisis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, while the small but significant contribution of user charges to health and education budgets should be acknowledged, the negative effects of the indiscriminate application of these charges should also be emphasised. Indeed, in many African countries the need for health care, education and other social services rarely coincides with the ability to pay. The implementation of user charges can have adverse effects in three ways. First, it may lead to a contraction in the demand for services. Second, in the health sector, it tends to discourage the use of preventive services for which potential patients may not see an immediate relevance (such as ante natal care and immunisation). Third, it may adversely affect a household's ability to meet other basic needs, such as the purchase of food, particularly if fees are charged simultaneously for health, education and other services and if the household's income declines. In addition to these problems, there is little evidence that the revenue from user charges is actually reinvested to improve the quality or expand the coverage of local services, as those who promote user charges argue. Despite recent attempts at keeping a share of the user fees at the local level (e.g. at the collecting facilities), in most cases revenue merely flows to the public treasury. Moreover, user charges usually generate a relatively small proportion of the total operating cost of the health care sector, with gross yields at around 5%. If the costs of fee collection are included, the yields are lower and, in some cases, negative.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, health care, education and the provision of water include different types of services, some clearly geared to the needs of the poor and others catering more for middle and upper-income groups. While user charges are not well suited to primary education, disease control programmes, basic curative services and communal water supply, the same cannot be said of university education and other 'income elastic' services. For the latter, cost recovery measures would be advisable, although subsidised access for the deserving poor must be assured. For the intermediate category, which includes most curative health services and secondary education, selective cost-recovery measures might be desirable, with low income individuals exempted or charged only a nominal fee.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While direct user fees (levied on patients at the moment of their treatment) are problematic from several perspectives, there are other indirect ways to mobilise resources from communities (generally before episodes of illness), such as various kinds of prepayment schemes, health insurance, lotteries, mutual funds and the sale of produce from community fields, in addition to their contributions in kind. These schemes have two main features which are attractive for health-care: they shift the moment of payment, so that individuals are not burdened with relatively more significant expenditure at the time of illness, and they spread the burden of costs (e.g. for drugs) over a larger group.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Increasing the volume of international aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There has been a considerable shift in official development assistance (ODA) in favour of Africa over the past two decades. Africa's share in total ODA rose from 19.4% in 1975/6 to 25.1% in 1980/1, and to 34.2% in 1988/9. However, the share assigned to human resource development has dropped, while- debt-service obligations have often absorbed a growing share of ODA. Greater flows are therefore needed. In the late 1980s, the World Bank estimated that additional annual aid of about $1 billion was required during the 1990s to halt social retrogression and ensure reasonable progress. But this flow of aid has not materialised on any appreciable scale. Indeed the trend in the 1990s has been towards an absolute decline in aid flows. The simplest and the most cost-effective way to effect such aid transfer would be through debt relief, although some increases in ODA are needed. Improvement in the quality of aid, including substantial shifts to programme aid, greater participation in the financing of recurrent costs and more focus on primary health care and education and on rural water supply are also required.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What role for NGOs and private providers?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While private providers, including church missions, have always been important in Africa, much of the market oriented literature tends to be very optimistic about the scope for expanding private services in order to replace government ones. Although a multiplicity of providers is desirable (and frequently unavoidable), there are several reasons why such optimism should be tempered. First, private sector services in Africa are typically concentrated in urban areas, and because of their cost, cater for upper-income groups. Although non-governmental providers (especially missions) are often located in rural areas, and they generally provide valuable services, they are seldom able to guarantee extensive coverage and in some cases may duplicate government services. Second, private providers are not without costs to governments; they often receive subsidies or preferential treatment in the allocation of foreign exchange and typically offer higher salaries and better working conditions which draw manpower away from the public sector. In Zambia, for instance, a teacher in a primary school run by the Consolidated Copper Mines can earn more than a lecturer at the University of Zambia. In countries with extremely limited numbers of doctors, certified nurses, qualified teachers and so on, greater privatisation would exacerbate the 'brain drain' from the public to the private sector and the undersupply of 'quasi public goods' for the majority, leading to harmful social differentiation. Third, quality is not necessarily an important incentive in the private sector in developing countries. The view that private institutions in health care and education are more efficient tends to be based largely on analyses in developed countries. Fourth, the growing pressure for pluralism in social service provision often gives scant attention to the problems of central coordination and planning and the development of an adequate 'regulatory framework' for private sector activities. While playing an important complementary role, the private sector and, to a lesser extent, the NGO sector, are thus affected by important objective limitations. Indeed, ironically, their proper functioning and social utility depends crucially on the existence of a stronger, not weaker, state able to regulate, coordinate and ensure that basic social services are provided - possibly through a multitude of public, NGO and private providers-to all citizens of a nation. G.A.C</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Capacity building for management and development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Franklyn Lisk</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The development experience of much of sub-Saharan Africa in past decades provides ample illustration of the importance of capacity building in the development process. The importance is related to the ability to manage economic and social processes, including the analysis and formulation of policy options, for attaining development objectives such as employment generation and poverty reduction. The consequences of failures in domestic economic management, compounded by the effects of a prolonged economic crisis in the region have, inter alla, contributed to high and rising levels of open unemployment and underemployment, declining per Capita incomes and real wages, and an increase in the incidence and intensity of poverty in a number of African countries. The persistence of these adverse consequences, which represent a serious threat to economic growth and sustainable development, are somehow linked-either as a cause or an effect -to weaknesses and instability in the institutional framework for management and public administration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The problem of weak institutional and general capacity for management in Africa today can be traced to the colonial legacy. This left many countries in the region, at the time of independence, with insufficient institutional and human capacity to cope with the transition from colony to independent sovereign state, particularly with respect to the responsibility for economic management. More specifically, this related to the unequal and disadvantageous manner of Africa's incorporation into the international economic system in the late 1950s and the early 1960s. Lack of technological know-how, inadequate infrastructure and limited investment resources compounded the immediate post-independence problem of weak institutional capacity, and left many African countries highly vulnerable to external shocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It was extremely difficult for the majority of African countries to break out of the old 'protected' colonial production and trade systems and rapidly to diversify their economies in line with the requirements of participating effectively in a competitive world economy. Since independence, institutional and human capacity for management in many African countries has not grown fast enough to keep up with the requirements of changing socioeconomic circumstances at the national level and to face the challenge of increasing globalisation. Critical skill shortages in public administration and private sector management in Africa can hardly be addressed in the context of the current economic crisis. The consequences of this crisis can be seen, for example, in underfunded and poorly equipped training and management development institutions, and in low-paid and demoralised civil services. At the same time, the 'brain drain' from the continent, partly as a consequence of poor pay and career prospects, has further undermined capacity in Africa. The interaction of foreign donors and African governments has not always served the interest of capacity building. It has been admitted, even by the World Bank that 'aid has done much less than one might have hoped to reduce poverty (in Africa)'. There is now more or less a consensus in the international donor community that expatriate technical assistance does not and cannot solve all kinds of development problems in the region. Far from solving problems, the imposition of foreign technical assistance has, in some cases, become a destructive force which undermines the development of domestic capacity that is critical to solving local development problems. Where donor assistance is inappropriate in terms of project concept and design, or there is a mismatch between design and domestic implementation and management capacity, technical assistance could end up becoming part of the problem rather than the solution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conceptual issues</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Before examining the requirements for institutional capacity building in developing countries, and particularly African countries, it is necessary to clarify salient issues pertaining to the concept. Broadly speaking, capacity building in a development context refers to a comprehensive process which includes the ability to identify constraints and to plan and manage development. The process usually involves the development of human resources and institutions, and a supportive policy environment. Ideally, it aims at improving on existing capabilities and resources and using them efficiently to achieve sustainable economic and social development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Narrowing the concept to focus on institution-building, the emphasis will be on the development of particular institutions, their human and material resources, their organisational management and their administrative capacities. More specifically, the aim of institutional capacity building is to improve significantly the outputs and impacts of institutions concerned with economic management, public administration (including project management), enterprise development and so on-in both the public and private sectors. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is obvious that relevant development-oriented institutions within an economy can exert a decisive influence on economic growth and employment prospects, and indeed on the attainment of sustainable economic and social development. From a macro standpoint,planning and similar development institutions are required for better management of the economy including, more crucially, the ability to mobilise, allocate and utilise human and material resources in an efficient and productive manner. At the micro level, human and institutional capacity is critical to sound project management and public administration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The framework</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The general situation in Africa today suggests that capacity building is required in relation to the following priority areas:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- good governance, to ensure stability;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-economic management, to maximise resource mobilisation and promote sustainable development;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- human resource development, to support employment creation and income generation, and reduce poverty;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- science and technology, to increase the efficiency of the population and facilitate infrastructural development;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-enterprise development, to enhance the critical role of the private sector in overall development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The degree of emphasis given to each of the above in a given context would vary according to the level and complexity of existing human and institutional capacities, the economic and financial means to support capacity, the relative roles of the public and private sectors, and the degree of involvement of civil society in the decision-making process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The policy context for institutional capacity building should be multi-sectoral and flexible, but coherent in relation to the desired objectives of development. This is to ensure that the process of capacity building is adaptable to changing circumstances-an issue that is particularly relevant in the context of countries undertaking structural adjustment and economic reform programmes when there is a need effectively to nurture and utilise local skills and to mobilise investment resources efficiently.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the light of the development challenge facing African countries, the process of capacity building in the region requires, above all, appropriate and adequate human and institutional capabilities to plan and manage economic and social development processes. These capabilities should include the means of assessing the achievements and impact of capacity building on poverty reduction, employment creation, etc. Existing public sector institutions for development planning and management could provide the operational framework for national capacity building, but the process should also include the participation of diverse social forces, the private sector and non-governmental institutions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Regarding the role of external donors and technical assistance agencies, the approach should be based on the concept of 'partners in development', which implies consultation and dialogue between donor and recipient on all aspects of project planning, design and implementation- with project 'ownership' resting with national authorities. Technical assistance from foreign donors should therefore go mainly towards developing the necessary domestic capacity, rather than contributing to the undermining of existing or potential capacity. Furthermore, assistance provided by external donors should be directed towards the building of capacity for promoting regional economic cooperation and integration through support for the development of viable African regional and sub-regional development organisations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Support initiatives</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The issue of domestic capacity building in Africa has more recently been the focus of attention by the international community as a whole. Indeed, the former World Bank vice-president for Africa, Edward Jaycox, has described 'capacity building' es the 'missing link in African development' which is 'critical to the development effort (of the region) and the chances of success'. UN agencies, spearheaded by the UNDP, have been active in promoting capacity building as a major requirement for attaining sustainable development. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1991, the UNDP Governing Council took a decision which resulted in the development of guidelines covering assistance to governments in the formulation and implementation of national capacity building strategies relating to all stages of the project cycle in the developing countries. The decision coincided with the introduction of the 'programme approach' by the UNDP which emphasised the centrality of national development programmes as the hub for the integration of UN technical assistance activities with national efforts. Emphasis on the use of national skills in the development process was consolidated within the general operational framework for 'national execution', which implied that overall responsibility for management of UN operational activities and accountability remained with the government and other national institutions and beneficiaries who 'owned' these activities. Under these new arrangements, a high priority was thus placed on the strengthening and sustaining of development management and administrative capacities on a long-term basis as an integral part of UNDP technical assistance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The World Bank's interest in capacity building in Africa has been more closely linked to the need for administrative and technical capacity at the national level to carry out policy analysis and economic management in the context of on-going structural adjustment and economic reform programmes. In a trailblazing address to the African American Institute Conference in 1993, Mr Jaycox came out strongly in favour of a new approach to lending to African countries which gave top priority to the development of critical human and institutional capacity. He admitted that the Bank's $4 billion a year lending programme in sub-Saharan Africa had not had the desired impact on development in the region because not enough attention had been paid to national capacity in the past. He went on to criticise the international donor community and financial institutions, including the World Bank itself, for designing and carrying out technical assistance activities which not only fail to solve problems but end up undermining the development of capacity in Africa. Mr Jaycox accordingly pledged to give direct support to capacity building in the Bank's lending programmes, mainly through human resource development and the creation of a 'demand for professionalism in Africa.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The UNDP, the African Development Bank and the World Bank, collaborated in the early 1990s to set up the 'African Capacity Building Foundation' (ACBF), based in Harare, Zimbabwe, with initial seed money of about $30 million and another $70 million attracted from bilateral donors and African governments themselves. The fund is to be used by the Foundation to support capacity building in Africa through training and institution building. Particular attention will be paid to the rehabilitation and strengthening of selected research and training institutions to meet the challenge of indigenous capacity building. Another initiative set up with foreign donors and African support, the Africa Research Consortium in Nairobi, is a good example of collaboration at regional level that is contributing to capacity building in the critical area of economic policy analysis and management. Similarly, the African Development Bank helped establish the African Business Round table which promotes entrepreneurship and enterprise development based on African ownership and control.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Role of the ILO</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For well over three decades the ILO, as part of its technical cooperation programme in Africa, has been involved in a wide range of management development, productivity and institution building initiatives at both national and regional levels. This is consistent with the need to strengthen African training institutions to play a crucial role in providing development managers with the necessary skills to analyse and formulate policy options and manage public and private enterprises efficiently.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most successful initiatives undertaken by the ILO, in collaboration with the UNDP and the Economic Development Institute (EDI) of the World Bank, is the UNEDIL programme for strengthening management training in Africa. Since its inception in 1987, the UNEDIL programme has proven to be a worthwhile initiative in institutional capacity building in the management field. Support for the programme has also come from national and regional management development institutes (MDIs) in Africa, regional and sub-regional organisations such as SADC and the Commonwealth Secretariat, and major bilateral donors such as USAID, CIDA, NORAD, the Netherlands and France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apart from aiming at strengthening institutional capacity, the UNEDIL programme has been instrumental in fostering networking among African development institutes and promoting professional contacts and the exchange of experience. One outcome of the programme has been the revival of three subregional MDI associations which enjoy the direct support of UNEDIL and serve as focal points for UNEDIL's subregional networking arrangements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Networking on a subregional basis has made it possible to optimise the use of scarce resources and talents, and this has helped to increase managerial capacity in the region as a whole. Collaboration has also permitted an exchange of experience among African institutions, and has brought together expertise both from within Africa and from outside to assist in the development of managerial capacity across the continent. This fits in with the goals of technical cooperation in general, and of South-South cooperation in particular. </P>
+<P ALIGN="JUSTIFY">F.L. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The role of international academic cooperation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Increasing demands and diminishing resources in higher education</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Professor Dumitru Chitoran</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As we approach the end of the millennium, higher education world-wide finds itself in a paradoxical situation. On the one hand, it is witnessing unprecedented growth. Enrolments are on the increase and so are the expectations placed on it by society. The correlation between investment in higher education and research, and the level of social, economic and cultural development of nations is well-established and is gaining increasing ground at a time when all development has become knowledge-intensive. On the other hand, higher education is in a state of crisis in practically all countries of the world, under the pressure of serious financial constraints. It has to compete for public funds with many other sectors and very often it is among the first to undergo severe cuts. These cuts have reached a dramatic threshold in the developing countries. As a result, the gap between the developing and the developed countries with regard to higher learning and research is wider than ever and it continues to grow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inter-university cooperation has emerged as a major tool for the support of higher education in the developing countries and as a flexible mechanism for the rapid transfer and sharing of knowledge, channelled via university links and exchanges. As emphasised in the Policy Paper for Change and Development in Higher Education issued by UNESCO in 1995, 'the most pressing need for international cooperation in higher education is to reverse the process of decline of institutions in the developing countries, particularly in the least developed.' The internationalisation of higher education has advanced steadily, reinforced by current processes of economic and political integration and facilitated by the steady advances in information and communication technologies. But, as indicated in the UNESCO World Education Report (1993), it is increasingly subject to the competitive laws of the market. Universities have been urged to develop an entrepreneurial, commercial attitude and to regard international cooperation mainly as a source of additional income. Fees for foreign students have risen considerably in many countries. As a result, academic mobility is becoming more North-North and less South-North or South-South. The benefits of study abroad, of exchanges, networking and access to data are recognised, but the costs involved render them increasingly a privilege, restricted to those who can afford it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An innovative programme</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNESCO's response to these trends was the UNITWIN/UNESCO Chairs Programme, launched in 1991. While serving as an instrument to foster overall inter-university cooperation, it was aimed at giving a clear direction and goal, namely to support higher education in the developing countries. It was meant to mark a return to the spirit of international academic solidarity, through twinning, networking and other linking arrangements among universities. The programme was also designed as an innovative form for the rapid transfer of knowledge, and for institutional development in higher education, including the establishment of transnational centres for advanced studies and research, as a means of redressing the widening knowledge gap between industrially developed and developing countries. One other aim of the Programme was to alleviate the negative effects of the brain drain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The UNITWIN/UNESCO Chairs Programme has seen steady and dynamic development from the very beginning, and has emerged as the major thrust of UNESCO's action in the field of higher education. The favoured institutional framework for carrying out activities is a UNESCO Chair. The programme's activities are extremely diverse. They include the appointment of visiting professors, provision of scholarships and fellowships, facilitating of staff and student exchanges and undertaking of joint research. The 'chairs' are typical of basic units of research and training, with a strong international dimension, since either the chairholder, or some of the professors or researchers associated with its programme come from abroad. Other projects involve complex inter university networks, varying in size from three to more than 50 institutions. Within networks, certain institutions serve as focal points, responsible for initiating activities and securing broad participation in their execution. Also included are cooperation programmes established by UNESCO with major university associations and networks in order to carry out UNITWIN-related activities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present, there are 163 established UNESCO Chairs (a further 84 are under consideration) and 34 largescale networks (18 more are being developed). A total of over 750 teachers, researchers and other support staff are involved in their activities. It is estimated that 350 courses (mainly at the graduate level), attended by more than 7500 students, were organised by the established UNESCO Chairs during the 1992-1996 period. Also, 120 seminars, training workshops, symposia and colloquia were staged over the same period, attended by more than 6000 participants. Some 580 academics from developing countries spent short periods of time at partner universities in the developed countries to upgrade their training. In addition, 355 scholarships have been granted to students and young academics from developing nations within the framework of the Programme. Research has been encouraged through 240 projects (mainly joint ones) resulting, according to progress reports received so far, in the publication of 55 volumes, some 100 published articles and over 150 monographs and progress reports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ACPs in the programme</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A large number of these projects (UNESCO Chairs and networks) concern ACP countries. Africa has been given top priority. Over 30 of the established Chairs are located there and 18 more are under consideration for subSaharan Africa, in order to reinforce the contribution of the programme to the development of higher education in this region. In addition, certain projects located at institutions in Europe and North America carry on activities which are designed to support African universities. A few examples illustrate this. Starting from its bilateral links with several African universities, the University of Utrecht proposed developing these into a broader, multilateral project under the umbrella of UNITWIN. For this purpose, it joined forces with three other European institutions: the University of Lund in Sweden, the Ruhr University in Bochum, Germany and the University of Porto in Portugal. The result was the establishment of the Utrecht/Southern Africa/UNITWIN (USU) network. It includes, at its southern pole, the universities of Harare, Maputo, Namibia, and Western Cape, where UNESCO Chairs have been established in different fields. The aim is to develop each of them into (sub)regional centres of advanced study and research. This is well under way in the case of the UNESCO Chair in Mathematics and Science Education at Western Cape University in South Africa. A first step was to link its activities to those of the MESA (Mathematics Education in South Africa) project, a cooperation project between the Utrecht-Freundenthal Institute for Mathematics Education and the University of the Western Cape. A school for Science and Maths Education is to be established at the University of Western Cape.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another large scale project is the Network of African Teacher Training Institutions, built around a UNESCO Chair at the Ecole Normale Superieure in Dakar. This is designed to serve as a regional centre for postgraduate training and research in the field of education. After several years preparation, activities were launched in 1995. The strength of networking is illustrated by a number of other linking arrangements in support of African higher education institutions. These include the network initiated by the NATURA Group of European universities in the field of agriculture, the ORBICOM Network in the field of Communication, which is a global network but pays particular attention to the needs of African universities, and the UNESCO/John Hopkins University Networking and Partnership in Adolescent Youth Health and Development. The last-mentioned focuses on HlV/AIDS-related research, and includes institutions such as Addis Ababa and Makerere Universities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The agreement signed by UNESCO with the Association of African Universities (AAU) within the framework of UNITWIN provides for support of the latter's staff development and management programme. A UNESCO Chair in Educational Management and Administration is to be established. It will function on a rotating basis at several universities in South Africa, Botswana and Malawi. There are also a number of 'tailor-made' chairs which respond to more specific needs of institutions, notably to develop training and research capabilities in areas such as human rights, democray and peace (at the Universities of Namibia, Addis Ababa and Fianarantsoa in Madagascar), or in the field of Water Resources and Water Culture (at the Universities of Malawi and Omdurman in Sudan). In the latter field, an interesting example is the UNESCO Chair established at the University of Nice, which, although located in France, carries out its activities in Mauritania and has produced the most comprehensive study so far on water resource management in that country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The programme has also made a good start in the Pacific and the Caribbean, even if achievements there are on a more modest scale. There are already 22 established chairs with 14 more under consideration. They cover a wide spectrum of priority fields, including the sustainable use of rain forest resources at the University of Guyana, higher education management and information technology at the University of Havana in Cuba, educational sciences in Fiji, and the use of drugs in Chulalongkorn University in Thailand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNESCO works closely with the University of the South Pacific and the University of the West Indies, with which it has established four UNESCO Chairs. Moreover, it has signed a cooperation agreement, in the framework of UNITWIN, with the Commonwealth Secretariat and the Association of Commonwealth Universities for activities in both regions. There is great potential for the further development of the Chairs programme in the Pacific and Caribbean, given the existence of the two regional universities mentioned above and the strong interest of universities in a number of developed countries (such as Australia, Canada, Japan and Spain) in supporting the programme. It appears to be particularly well suited for the systems of higher education in the two regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Funding</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The cost of international cooperation in higher education has risen steadily and this is currently one of the major obstacles preventing the full use of the potential of academic links. New information and communication technologies help reduce costs, but universities in the least-developed countries would first need considerable investment in order to procure and maintain the necessary equipment. That is why UNESCO has based the Chairs programme on funding principles aimed at lowering costs and sharing them in a genuine spirit of academic solidarity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the outset, UNESCO made it very clear that, since it was not a funding agency, it could not, by itself, assume the financial burden of such an ambitious programme, involving several hundred institutions and thousands of university teachers, researchers and students. However, it decided to make a commitment by providing some initial funds. Rough estimates indicate that, over the 1992-1995 period, UNESCO has contributed some $2.5 million (from its Regular and Participation Programmes, Fellowship Bank and Funds-in-Trust) to the UNITWIN/UNESCO Chairs Programme. At the same time, it has pressed for increased international development aid for higher education, particularly from the developed countries, and from international organisations, including the UN specialised agencies. A strong case is made for the benefit of pooling resources and for involving directly the higher education institutions themselves </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNITWIN-based projects, including UNESCO Chairs, are usually initiated through the direct contributions of UNESCO (the range is generally between $15 000 and $25 000 per individual project). This is meant to help prepare and launch projects and to secure further funding from other sources. The institutions themselves must include allocations for the respective projects in their own budgets and request their appropriate national authorities to make contributions. This applies equally to universities in the developing countries, however poor their resources may be. It serves to indicate that the project in question is indeed seen as a priority by them and by their national authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Experience of the UNITWIN funding formula so far gives cause for cautious optimism. Many projects have been able to secure funds by having recourse to the various sources mentioned above. Thus, the Utrecht/ Southern Africa/UNITWIN Project received a first UNESCO allocation of $50 000 in 1993, in order to launch its activities. The fact that it concerned a large-scale project (a network of eight universities, with four chairs established at four African universities and one at the University of Utrecht) explains the larger UNESCO allocation. This was followed by a second allocation of $70 000 in 1994 for the actual implementation of activities in Africa. The UNESCO seed money led to additional funding-$600 000 annually, for the 1992-1995 period, from various Dutch donors (mainly the Ministry of Development Cooperation, through NUFFIC) and from the European Union, and $450 000 from the University of Utrecht budget, including the total cost for the functioning of the UNESCO Chair on African Studies established at that university. The other three European universities participating in the network (Bochum, Lund and Porto) have also made contributions and are now looking for donor funding in their countries. It is important to mention that the four African universities belonging to the network have also allocated funds from their own budgets to the UNITWIN projects and are actively seeking additional resources from aid and development programmes established for their countries by various donor agencies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It can be fairly argued that in terms of cost-effectiveness, efficiency and the ability to generate funding from various sources, UNITWIN compares favourably with existing cooperation schemes in higher education and research. But it is still too early to conclude that the Chairs Programme can continue and develop further on the basis of the present funding arrangements. The needs are arguably too big for the institutions and individuals involved, who may find themselves in a perpetual search for funds. An evaluation of the programme is under way and this will be submitted to the Member States for their decision. UNESCO is hoping that its efforts to revive academic solidarity, and its campaign in favour of higher education in the developing countries will receive the support of the international community. More than ever before, these countries need to develop their capacity for advanced training and research in order to achieve self sustainable development. The academic community has already indicated its willingness to join forces with UNESCO in this undertaking. </P>
+<P ALIGN="JUSTIFY">D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Brain drain : Colossal loss of investments for developing countries</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When a highly qualified professional chooses to leave his own country for another, he does so for one or several legitimate political or economic reasons: peace and security for himself and his family, job satisfaction, better pay and conditions. a higher standard of living, etc. Throughout history, countries and centres of academic excellence which offer these attractions have received the largest numbers of professional migrants and these have, in turn, made substantial contributions, not only to the economic growth of their host countries, but also to the scientific and technological advancement of humanity. The wave of German scientists who moved to the United States after the Second World war, and their discoveries and inventions, come readily to mind. On a global level, therefore, the free movement and interaction of highly skilled people is a positive thing. But the costs to the home countries of losing their professionals is incalculable-in terms of both development opportunities and loss of investment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whereas Western Europe was the main loser, especially to the United States, up until the 1960s, the developing countries have emerged in recent years as the biggest suppliers of qualified professionals to the industrialised world as a whole. Today there are more than a million and a half skilled expatriates from the developing countries settled in Western Europe, the USA, Japan and Canada. The USA's educational system and its research institutions are heavily dependent on them. These migrant professionals contribute in no small way to increasing the disparities between the world's rich and poor nations. And it is the developing countries that need them most.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Africa, which has serious shortages of manpower, has been worst hit. It is said to have lost 60 000 professionals (doctors, university lecturers, engineers, surveyors, etc) between 1985 and 1990 and to have been losing an average of 20 000 annually ever since.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are more than 21 000 Nigerian doctors practising in the United States alone. Meanwhile, Nigeria's own health system suffers a cruel lack of medical practitioners. 60% of all Ghanaian doctors trained locally in the 1980s have left the country, according to the UNDP's 1992 Human Development Report, while, in Sudan, 17% of doctors and dentists, 20% of university lecturers, 30% of engineers and 45% of surveyors have gone to work abroad.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it is difficult to calculate the cost of an expatriate professional in terms of the nutrition, health care and education provided by households and the State, it is clear developing countries are losing colossal amounts of investment annually to the developed countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The US Congressional Research Service, for example, computed in 197172 that the USA gained $20 000 annually on each skilled migrant from the developing countries. If this rather conservative amount is extrapolated for Africa, then the continent lost more than $1.2 billion of investment between 1985 and 1990 on the 60 000 or so African professionals who emigrated during that period. Much closer perhaps to the truth today would be the estimate made by the United Nations Conference on Trade and Development (UNCTAD), using 1979 prices, which put a cash value of $184 000 on each African professional migrant (and this only for those between the ages of 25 and 35).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the other hand, expatriate remittances, particularly from skilled workers who earn higher salaries than the average migrant, constitute an important source of funds for development in their home countries. Throughout Africa, households are being maintained by remittances from relatives working abroad. Also, fine buildings are being put up and small-scale projects are financed in villages and cities across the continent with funds sent from overseas. But taken together, these will never be large enough to compensate Africa for the loss of investment suffered as a result of the 'brain drain'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Serious flaw in international cooperation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The migration of highly qualified professionals from the developing countries is an extremely complex problem which presents the international community with a major dilemma. First, the 'brain drain' cannot be stopped by force nor can it be legislated against. It is linked to fundamental human rights- the right of individuals to move from one country to another, although the exercise of that right is governed by the immigration policies of individual countries. Second, it is fundamentally a national problem which can only be resolved at the national level by providing enough incentives for qualified nationals to remain at home. Third, some industrialised countries like the USA and Canada, have historically operated liberal immigration policies. Even European states, whose immigration policies tend to be more restrictive, have a good number of third world professionals, but there are over a million in the USA and Canada. It is arguable whether, under the circumstances, the liberalisation of the international labour market under the World Trade Organisation, as is being suggested (even by some developing countries), will actually be in Africa's interests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The reasons for Africa's brain drain problem are legion and easily identifiable, being both structural and economic. The most often cited cause is the continent's school curricula which many see as still largely modelled on the systems of the former colonial masters. This, it is argued, has led to the production of graduates in disciplines that have little or no relevance to the socio-cultural and economic milieux of the continent. This is a highly debatable assertion, given the large numbers of the technical assistants currently working in Africa who are products of the educational systems of the former colonial powers-at least some of whom are having a positive impact on the continent's development. This, however, must not distract from the fact that African higher schools systems are illequipped to produce the right skills for Africa's development needs. Because of shortages of both science equipment and teachers, the system instructs the vast majority of pupils in arts rather than in science and technology-and it is the latter which hold the key to economic growth and development. Thus, there is overproduction of graduates in areas where there are few employment opportunities. This results in high levels of migration, even, paradoxically among the few trained scientists because of the absence of an environment conducive to full professional expression and satisfaction. It is not uncommon for things as simple as electricity and water supply to provide reasons for emigration. Examples abound of frustrated African scientists who have had their experimental work of several years destroyed overnight through power failures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Powerful factors in the brain drain include Africa's poor rates of economic growth over the past 30 years (worsened by structural adjustment measures which have resulted in dramatic falls in living standards) and political instability (disturbances in Nigeria and Zaire, civil war in Liberia, Sierra Leone and Somalia etc). Thousands of qualified professionals have been forced unwillingly into exile, and the majority of those left behind, in these times of serious economic crisis, are engaged in unskilled pursuits-in petty trading and taxi driving-far removed from their professional training. The loss of investment associated with this situation cannot be underestimated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sub-Saharan Africa is in the paradoxical situation today of having large numbers of graduates in various disciplines -from medicine and engineering to architecture and accountancy-who have either emigrated or are simply unemployed, while it hosts a large army of foreign technical assistants. Indeed, Africa receives more advice per capita than any other continent. In 1988, there were more than 80 000 technical assistants, and today the figure is well over 100 000. These experts are believed to cost donors a total of $4bn annually to maintain, a figure which represents nearly 35% of Africa's total official development aid. This situation reveals a serious flaw in the operation of international development cooperation. Would it not be more efficient and cost effective to employ qualified African expatriates in the place of many of these foreign technical experts. The former, after all, have both linguistic and cultural links with the continent. The United Nations Development Programme (UNDP) has a programme in this area which points to a possible way forward. The article on that programme, TOKTEN, follows. </P>
+<P ALIGN="JUSTIFY">A.O.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Brain gain' : A cost - effective UNDP programme</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the scale of the brain drain problem facing the developing countries, the UNDP's Transfer of Knowledge Through Expatriate Nationals (TOKTEN) project may not amount to much, but it has proved, in its 19 years of existence, to be a cost-effective way of getting highly qualified expatriates from the developing countries to contribute to the development of their countries of origin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It all started in Turkey in 1977 by pure accident. A Turkish mineral expert in Alberta, Canada, was asked by a compatriot if he would be kind enough to come over to Turkey and explain his innovative coal cleaning process to the staff and students of his old university in Ankara-the Middle East Technical University. He expressed his interest in the project. Soon afterwards he was contacted by the UNDP which offered to fund part of his trip to Ankara. The expert spent one month in Turkey giving a series of seminars, not only at the Middle East Technical University, but also at the Istanbul and Dokuz Eylul Universities. During these lectures, he made recommendations on resolving Turkey's specific coal utilisation problems. His impact was immense and such that the UNDP was inspired to set up the TOKTEN project along similar lines to help developing countries gain from the knowledge of their expatriate professionals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The system is simple. Member States of the United Nations can apply to join the project. The latter is administered in each country by a National Working Commitee (NWC) which is made up of representatives from the government, local organisations, the private sector and the UNDP. Institutions of that country (government ministries and agencies, private and public sector enterprises, universities, research and development institutions, hospitals, etc) can apply for assistance in a variety of areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Applications are processed by the NWC and recruitment of experts is usually in one or more of the following ways:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> through consultants with lists of experts recognised by the Government as having extensive contacts within their expatriate communities;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> through embassies and missions, alumni associations and research institutions;</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> through prominent members of the country's expatriate community who identify and alert other high level expatriates of the opportunities to return home and serve their countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the Working Committee chooses a consultant, an offer of assignment is made. The beneficiary organisation and the consultant will then determine the timing of the mission and inform the UNDP.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TOKTEN assignments last between one and three months depending on the ability of the consultant and the needs of the beneficiary'. They are not meant to be highly remunerative. Consultants are only entitled to round trip economy fare tickets (by the most direct route) and a daily subsistence allowance at the prevailing UN rate. The costs are paid out of the beneficiary country's 'Indicative Planning Figure'(IPF) which is the amount of assistance the UNDP makes available to a developing country over a five-year programming cycle. Health insurance cover and accommodation is not provided. Usually these are the responsibilities of the beneficiary government or organisation. The salaries of the consultants during their absence are paid by their affiliated employers whose agreement is often necessary for the projects to go ahead.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">TOKTEN consultants are thus not motivated by money but by a genuine desire (with a modicum of patriotism) to contribute to the development of their countries of origin to which they retain strong cultural and linguistic ties. And their impact on the ground is usually immediate and measurable. Pressures are not put on volunteers to return permanently to their countries, although many have chosen to do so since the programme began in 1977.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The system is not only low-cost and cost-effective. It covers a great variety of specialised fields and enables programmes to be implemented with speed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conditions for success</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A UNDP assessment of the programme in 1987, ten years after it began, concluded that regular monitoring of its operation had enabled information garnered to be applied to increase its effectiveness. It had been found, for example, that short-term expatriate consultancies were especially beneficial when the problem tackled was specific and the consultant selected was of international standing, when both the requesting organisation and the expatriate were well prepared in advance, and when the initial mission was followed up by a series of measures, often including a return visit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By 1992, 35 countries were participating in the programme and over 3800 consultancies had been run. Since then, the number of countries has increased dramatically to 51 and con</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">sultancies to 5000. In 1994 and 1995 alone, 28 countries reported over 700 consultancies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It has also become clear that, whereas the main recipient institutions have been government agencies, science and technology research institutions, universities and organisations, the private sector is increasingly showing interest in the programme. The number of female specialists is also increasing: in 1991, 40 consultants were women and last year this figure rose to over 100.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So far, the ACP countries participating in the programme are; Benin, Cape Verde, Central African Republic, Chad, Dominica, Ethiopia, Fiji, Guinea, Guyana, Haiti, Liberia, Nigeria, Sao Tome &amp; Principe, Sierra Leone, St Lucia, Trinidad &amp; Tobago and Uganda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Success stories include a highly skilled Guyanese medical practitioner in the United States who returned home after 17 years to assume the post of minister of health. He had been sent to oversee the introduction of certain aspects of health care such as preventive medicine (immunisation, general child care and nutrition), treatment of trauma (victims of accidents and violence etc) and the establishment and management of the physical facilities for emergency patients. During his stint, his recommendation on the upgrading of the emergency room facilities was rapidly implemented and this contributed significantly to improving patient care. Another story involved a Guinean banker who, after a consultancy stint in Guinea, abandoned a lucrative job in France to return home permanently to work at the Central Bank of Guinea, helping to set up a new loan system for commercial imprt and export businesses. Guinea, in fact, has been one of the greatest beneficiaries of the TOKTEN programme with numerous consultancies involving the University of Conakry, covering more than 20 disciplines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For very small sums the programme is ensuring that developing countries which have invested enormously in the education of their expatriate nationals have a return, at least, in the form of the knowledge they oquired.</P>
+<P ALIGN="JUSTIFY">A.O </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Mobilising Commonwealth skills for Commonwealth development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The role of the Commonwealth in the economic and social progress of its member states is neither widely known nor widely publicised. Yet for over 25 years, the Commonwealth Fund for Technical Cooperation (CFTC) has made significant contributions to the efforts of its developing member countries to accelerate the pace of their economic development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The recognition by the Commonwealth that people are its greatest resource forms the basis of its approach to development assistance-providing, in the short term, specialist technical skills which are either not available or are in short supply to governments to enable them to fill key positions in areas as diverse as export and industrial promotion, high-level economic and legal services etc, and in the longer term, a wide range of training programmes in areas that are crucial for economic development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commonwealth Fund for Technical Cooperation is funded by voluntary financial contributions from member governments which, as has just been mentioned, can also draw on it according to their needs and priorities. As a pioneer of technical cooperation between developing countries, the Fund recruits its experts from these countries and encourages South/South cooperation. It is thus not uncommon to see West Africans serving, on short-term contracts, as legal officers in remote Pacifc island states or Sri Lankans or Indians advising on new agricultural techniques in Africa. The Fund is administered by four separate divisions within the Commonwealth Secretariat: the management and training division; the general technical assistance division; the export and industrial development division, and the economic and legal advisory services division. In 1994-95 the CFTC's financial resources stood at around f23.6 million (ECU 30m).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Human resource development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nearly one-third of the CFTC's budget is spent on human resource development, helping enhance people's skills through a mix of training workshops, study visits and individual attachments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some 4000 training fellowships were awarded in 1993-95 to enhance technical skills. These were given to middle and senior professional, technical and administrative managers to study at some of the Commonwealth's best institutions or to take up work attachments (63% of training takes place in less-developed countries).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Fund also enables universities and other institutions to become centres of excellence and upgrade the tuition they offer by appointing academic and technical specialists. In 1993-95, for example, it helped five universities in Africa and the Caribbean to run applied Masters courses through collaboration with other Commonwealth universities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As the CFTC is usually able to meet only 60% of the requests it receives for specialised training, its programmes are held on a regional and pan-Commonwealth basis to maximise impact, especially in topics such as administrative reform, financial management and strategic planning.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Fund's training priorities include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- first and foremost, identifying needs (consultants are sent to countries to examine their development plans and help them to prioritise training needs).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- providing education and training in key areas that reflect CFTC concerns such as well-managed economic and financial reform by government, sustainable development, participation of women and application of technology.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- ensuring an integrated package of consultancy, advice and training to help managers in government, and public and private sector enterprises to coordinate and manage reforms and restructuring.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- organising policy workshops and seminars that bring together senior government officials, executives and academics from Commonwealth countries to pool experiences, learn examples of best practice, discuss problems and reflect on emerging issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- giving support to institutions to offer new and specialised education and training programmes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- providing technical and vocational training under the Commonwealth Industrial Training and Experience Programme (between 1993 and 1995, workshops were held in hospital equipment repairs, railway repairs and maintenance and computer-assisted manufacturing).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- providing training in information systems, new technologies and environmental issues (governments are helped to develop management information systems and apply information technology). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-setting up programmes for women with a particular focus on entrepreneurs and community managers (among other initiatives, the CFTC is helping three African universities develop specialised programmes in entrepreneurship for women in non-traditional sectors).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-coordinating wider linkages among professional networks to facilitate exchanges of information and examples of best practice (the CFTC recently helped to set up the Commonwealth Association for Public Administration and Management to assist in improving public service performance and in raising ethical standards).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Expertise on tap</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shortage of skills is one of the biggest stumbling-blocks facing countries trying to raise the living standards of their people. Providing experts accounts for about one-third of the CFTC's budget.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because its assistance is relatively small and carefully targeted, it avoids the potential waste associated with larger scale projects and poor technical planning. In 1993-95, the cost both of a typical long-term expert and an average project was around £50 000 (ECU 62 000) a year. Experts can be in place within three or four weeks of project approval.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the same period, over 200 long- and short-term experts were provided to 43 developing Commonwealth countries, six dependent territories and 18 regional organisations. The expertise requested is extremely diverse, from hydrography and agroforestry to tourism, statistics, legal affairs, health, social planning and computer science.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Assignments for short-term experts can range from a few days to six months. Their role is advisory, helping governments to introduce new systems or technologies. Long-term experts stay usually from six months to two years; others may stay up to four years. Experts assist in the development and implementation of policies or in the provision of managerial skills and the training of counterpart staff to take over in due course. Some long-term experts are trainers in specialist fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The CFTC makes every effort to appoint women experts. In 1993-95, they made up 13% of experts that were sent to the field. These included a consultant anaesthetist in Ghana, an agricultural economist in Mozambique, an information specialist in Barbados, a fisheries development officer in Papua New Guinea and an environmental lawyer in Seychelles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A scheme to allow suitably qualified and experienced people to volunteer as short-term experts for a maximum of three months was launched in mid-1995. The scheme draws on experts from the Commonwealth who are willing to give their services on a voluntary basis to developing countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Entrepreneurs come first</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In its help to small businesses, the CFTC focuses on those who manage the businesses and identify new entrepreneurial talent. Most assistance is given to small states, especially in the Pacific. The programme has three phases: the first relates to 'surveys of opportunity' which is aimed at identifying suitable entrepreneurs, investment opportunities and potential for expansion as well as specific problems. Next comes 'workshops on entrepreneurship development' during which business owners and operators are helped to think creatively, to become more aware of opportunities that are available and to act strategically when planning expansion. And the last are what we call 'business clinics' in which one-to-one counselling is provided to an entrepreneur at his or her business. This personal support has proved very successful in helping individual entrepreneurs to become more efficient and competitive and, by implication, adapt to changing world economic conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Developing exports</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The CFTC has pioneered the use of Contact-Promotion programmes and 'Buyer-Seller Meets' forums to help small exporters. These forums allow company representatives, often from small Commonwealth countries, to display their wares and meet prospective buyers from other countries. CFTC consultants plan these activities well ahead, short listing producers that are likely to succeed, identifying suitable foreign markets and advising on redesigning of products. Sometimes exporters and factory staff also receive training.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The CFTC funds a special 'export development programme' for women entrepreneurs. This includes detailed country studies of women engaged in exporting as well as sales promotions abroad. Studies of this type have recently been conducted in Cyprus, Sri Lanka and Zambia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women are helped, under the programme, to adapt their handicrafts for export, improve their manufacturing techniques and undertake sales missions abroad. Training is also given in export marketing, product development, costing and pricing. If necessary, changes to government policy are recommended. In 1994, the assistance given to Ghanaian women to develop markets for their basket ware and handicrafts is estimated to have helped generate sales worth US$3.1 million (ECU 2.4m). </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">EU's investments in education and training in the ACP states</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Digby Swift</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Community's investments in human resource development-health, nutrition and education-in ACP states have regularly been covered in the pages of this magazine whether in the context of dosiers or of country resorts. Here we present a brief description of how the EU's policy in education and training evolved under the Yaounde and Lom&eacute; Convemntions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Educating all the people. This is not just a slogan. In a poor, underdeveloped country, there may be some short-term gains from supplying high quality education and training to an elite few. But, as the 'Asian Miracle' has proved, major long-term gains in development and wealth are possible only if the entire population possesses a reasonable level of education.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Now for the problem. For many countries, notably those of sub-Saharan Africa, a large proportion of school age children receive no education at all. Of those who do attend school, many receive little benefit from their education because of the very low quality of provision. Only a small minority reach secondary education. And yet a higher proportion than ever of national budgets is now going to the education sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The problem is urgent because of the time it will take to resolve. Even if we could wave a magic wand to provide all children with a good primary education, it would take a decade to see the benefits.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How is European aid helping to tackle this problem? What have been the guiding principles of European aid to education in the past? And why is the problem still acute in, for example, subSaharan Africa, despite decades of investment in aid to education ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aid mirrors developments</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aid to education has mirrored developments in the education sectors of the countries concerned. For example, the low-income countries of Africa, which account for 73% of Africa's population, have seen a rapid expansion in their education systems followed by a collapse of funding. This has resulted in a serious decline in standards of provision. European aid, which began by providing piecemeal assistance to infrastructure and manpower, shifted to a 'project approach' to tackle these emerging problems and is now moving towards a coordinated sectoral approach to help tackle the reform of whole education systems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From 1970 to 1980, the number of pupils enrolling in the primary schools of developing countries more than doubled, and the numbers in secondary and tertiary education quadrupled. Even relative to the increasing population, there was a 90% increase in the proportion of primary-aged children in school, and a large increase in the proportion of girls. This growth was accompanied by a doubling of government budgetary resources made available to education.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the massive general economic decline between 1980 and 1985, the money made available for education from the public purse fell by 40%, yet the education systems continued to grow. The result was that teachers' salaries plummeted, and funds for non-salary recurrent costs such as teaching materials and maintenance virtually dried up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since 1985, the financial situation has somewhat improved and funding is now at an all-time high. Nevertheless, for many African states, the education sector is in a state of crisis. Buildings are crumbling and inadequate; teachers are untrained or undertrained and often absent because of low incentives and weak supervision. There are few books and other teaching materials. Consequently, many pupils leave school virtually illiterate and innumerate. Moreover, because of the low quality of instruction and increasing costs to parents, many parents are no longer bothering to send children to school even when places are available. Primary enrolment fell by around 10% between 1990 and 1992. Thus in many countries, a fundamental reform of the sector is seen as the only way forward.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Evolution of aid</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the early days of European aid, education and training were seen as suppliers of manpower for countries to modernise their economies. The priority themes of the 1970 Yaounde Convention for European Community aid were industrialisation, regional cooperation and international trade. Community support to education and training focused on the construction of colleges and university faculties to serve industrialisation and regional cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 1975 Lom&eacute; I Convention referred specifically to 'the establishment of regional institutions of advanced technology, in the context of training programmes to enable nationals to participate fully in economic development'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 1980 Lom&eacute; II Convention introduced multiannual training programmes, and support in the form of training awards and courses/seminars; experts and instructors; teaching equipment; collaboration between training or research establishments and universities. The emphasis was still on vocational training for other sectors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A significant proportion of European bilateral aid to education and training took the form of European teachers for secondary schools, colleges and universities. These helped to cover the shortage of locally trained teachers, whilst educating an elite able to fill senior and middle positions in the public and private sectors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By 1985, problems were becoming all too apparent within the education systems being supported. As in other sectors, there was increased emphasis on the 'project approach' towards tackling these problems. Thus the Lom&eacute; Ill Convention includes support to education and training 'in the form of integrated programmes aimed at a well defined objective'. This could include, for example, 'assisting the ACP States' own efforts to restructure their educational establishments and systems and to update curricula, methods and technology employed, in order to step up the effectiveness and cut back the cost of all types of training'. A concern for under-represented groups, particularly women, was also becoming explicit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By 1990, the concept of investing in people through education and training had moved high on the donor agenda, and alongside it, a growing concern for sectoral reform. According to the 1989 Lom&eacute; IV Convention, 'Cooperation shall be aimed at supporting development in the ACP States, a process centred on man himself and rooted in each people's culture. It shall back up the policies and measures adopted by those States to enhance their human resources, increase their own creative capacities and promote their cultural identities. Cooperation shall also encourage participation by the population in the design and execution of development operations.' In a chapter entitled Operations to enhance the value of human resources, a section on Education and Training refers to supporting the ACP State's efforts to 'reform their basic education institutions and systems, in particular by providing overall primary education coverage and adjusting imported systems as well as building them into development strategies'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the late 1980s and early 1990s, European states and the Community joined the World Bank in support of structural adjustment. In a 1991 communication to the European Development Council, the Commission stated that it 'will give absolute priority to the social dimension of adjustment, in particular ensuring that the health and education sectors are adequately covered, in conjunction with sectoral reforms introduced or planned in these two areas.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Balancing this concern for system reform has been a growing appreciation of the importance of decentralised cooperation. An example is the cost-sharing microprojects for grassroots development first introduced in Lom&eacute; I with explicit mention of support to primary schools. Another example is the need to support the activities of nongovernmental organisations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A new policy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two events in the early 1990s have had a profound impact on European support for education and training. The first was the World Conference on Education for All: Meeting the Basic Learning Needs held in Jomtien in 1990. This emphasised the need for universal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">primary education and adult literacy to be firmly placed on the political agenda, and has resulted in a profound swing of donor support away from higher education and towards primary education. The second important event was the 1992 Treaty of European Union which requires the coordination of Member States' policy and operations, particularly in the social sectors. Guidelines are contained in the 1994 Council Resolution on support to education and training in developing countries in which 'the Council emphasises that education, in particular basic education, is a fundamental right'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to the Resolution, 'the priority for the Community and the Member States must be both to maximise access to education within the limits of the resources available and to ensure that the quality of education provided is suited to the needs of the majority of students. 'This is to be achieved through 'a balanced, programme-based strategy, tailored to the specific circumstances of the individual developing country', with pride of place accorded to basic education. It should provide 'support to the developing countries' own policies and efforts', not acting as a substitute for local initiative, and should involve better integration of action under structural adjustment with education sector priorities and aid activities. The Council also recommends a special emphasis on coordination in a number of pilot countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the outset, Community aid to education and training in African, Caribbean and Pacific countries has been in response to requests from the ACP states with an emphasis on ownership of the resulting programme by those states. What the new policy introduces into this process is a dialogue between government and all donors on needs, priorities and approaches set in the context of the education sector as a whole. Only through such a comprehensive approach can developing countries and European states reach a true partnership in realising the education and training needs of all citizens on which the future of their countries so crucially depends. </P>
+<P ALIGN="JUSTIFY">D.S.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Analysis</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">EU-ACP relations : Building for tomorrow</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Kenneth Karl</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1989 saw the end of the Yalta inspired twin-superpower dominance. Nations had to examine their priorities in their desire for integration in an international environment in which geostrategic and economic realignment would be unavoidable. The philosophy which had served as a basis and reference point for North/South relations throughout the Cold War period is now being called into question and necessary adjustments in ideas have been triggered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Lom&eacute; Convention, which governs the development-cooperation relationship between the EU and the 70 ACP countries, is a unique North/South cooperation agreement on account of its contractual nature, its durability, the funds it allocates and the fact that it provides for a permanent dialogue. But it is also now at a decisive point in its history.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Those who regard the Convention as out-of-date and in need of renovation, and those more radical critics who believe that it no longer serves any useful purpose and must be phased out, both argue that a new direction is needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Beyond all the criticism formulated against this system, the fundamental question remains as to whether the Lom&eacute; Convention will be able, given the necessary changes, to carry on after its fourth version expires.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The years between now and the end of the century will, naturally, see the application of the revised Lom&eacute; IV, including the substantial improvements made to it. However, this same period must also be used to prepare the ground for ACP/KU development cooperation in the future, whatever form it might take.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shortly after his nomination as European Commissioner for relations with the ACP countries and South Africa, Professor Pinheiro commented, realistically, that the ACP countries are no longer 'in fashion'. The change of emphasis can be seen clearly if one looks at the EU's burgeoning relations with its eastern neighbours from the former Communist bloc (illustrated by the wide range of European programmes now benefiting these countries). One might also cite the strengthening of ties with countries in the Mediterranean basin. Economic and security concerns underpin this development, but it undoubtedly reduces the significance which was once accorded to the ACP states.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, the economic objectives of virtually all EU countries, as they seek to reduce budget deficits and deal with increasing internal social problems inevitably put pressure on the amount of development aid being granted to the Third World.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This situation is, of course, not restricted to the European Union - which in fact remains the world's main contributor of official development aid. At the instigation of a Republican dominated Congress, the United States is planning much more swingeing cuts in its contribution, both to certain international agencies and to certain regions (including Africa).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This undeniable cutback in public development aid has been offset in recent years by net increases in private capital flows, but the geographical distribution is highly skewed. Only a few of the poorest developing countries have benefited from the trend, the main 'winners' being the emerging states of Asia. These include countries such as China, India and Indonesia which, it is worth noting in passing, do not have particularly good human rights records, in the sense that the term is understood in Europe. Despite the fact that ACP countries have identified potential for attracting foreign investment, they have not actually benefited from this change in resource flows.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this climate, with official development aid in inaeasingly short supply, innovative methods for making optimum use of the available resources must be devised within the context of the Lom&eacute; Convention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On current indications, it is quite possible that in the year 2000, the Lom&eacute; Convention will be filed away in the archives. ACP/KU relations will certainly have to be more in step with recent developments on the international scene. The initial reasons for the establishment of a cooperative relationship between Europe and the ACPs, following the signature of the Rome Treaty, are now outmoded. As Paul Valery has commented: 'One of the worst mental aberrations is to think that things can survive when the reasons for their existence have gone'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So, what type of development cooperation should the countries of the European Union and their ACP partners aim for in the future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Alternative trends</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU has stated that it is in favour of a globalisation of aid within an innovative framework. One of the first questions to be asked is whether uniform cooperation with regions whose monolithic character is being increasingly called into question is still desirable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Variable geometry in development cooperation relations is increasingly being seen as the trend to be followed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If this option is chosen, there is a risk of the following scenario being created: The EU's relationship with the Caribbean could become diluted within its relationship with Latin-American countries and links with the Pacific countries could become confused with economic relations with Asia. What would then become of Africa, the continent needing most attention on account of the wide range of its difficulties and its increasing marginalisation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1990, the United Nations General Assembly, aware of the African question, adopted a new agenda on development in Africa, thus making that continent its number-one priority. Europe, on the other hand, must not simply focus on Africa but must invent new modes of action which are more concrete and more effective.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Secondly, recent trends imply greater conditionality. This has been taken on board not just by EU Member States. A number of multilateral aid agencies have also included it in their strategy. The OECD's Development Aid Committee believes that future relationships between North and South will be greatly influenced by conditionality and, indeed, the Organisation goes so far as to advocate this approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, conditionality in terms of development is a strategic element which must be handled with extreme caution. If cooperation, whether today or in the future, is to be based on conditionality, then it can only be rendered effective if aid recipients (both governments and the governed) are genuinely committed to the idea. They must be convinced, in a climate of resource-scarcity, than the approach is motivated above all by a desire for greater success.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union thus has a vital role to play, making full use of its advantages in terms of dialogue and consultation in order to prevent conditionality being perceived as a condescending mechanism. Thereby, it can help to prevent conditionality from generating the well-known perverse effects of 'tied' aid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of course, conditionality raises the thorny question of national sovereignty, but it is important to observe that modern international relations have moved on, both de jure and de facto, from a concept of absolute sovereignty to one of relative sovereignty. This is illustrated by the trend towards humanitarian intervention as a right, the requirements of the Bretton Woods institutions, supranationality in certain regional international organisations, and the very fact of world economic interdependence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This does not mean that the developing states should sell off their sovereignty to the highest bidder but that conditionality should be the subject of negotiation. Donors must be more flexible in their demands and thereby give the country in question such room to manoeuvre as is necessary for programmes to succeed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thirdly, development of the private sector appears now to be approved by all parties. Since independence, the State has been omnipresent and omnipotent in most productive areas of ACP economies. Given the failures of the public sector, private enterprise is now being called in to help. Its development is one of the sector specific policies which will and must receive most support.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The development of the private sector must permit better distribution of the fruits of the growth that it generates and promote integration of the ACP countries into the market economy. There can be no question of pitting private enterprise against the public sector, because any Manichean approach in this sphere might prove to be risky. It is important also to stress that free market development cannot take place overnight and that it is subject to inescapable macro and microeconomic preconditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Indeed, the birth and expansion of a dynamic private sector depends on the politico-economic fabric. This includes reliable financial bodies, functioning financial intermediation, adequate infrastructures, technical qualifications and training, a suitable legal/ regulatory framework, institutions to support private businesses, the channelling of the informal sector and a public sector which is prepared to play fair, aware of its regulatory role. These, in short, are the necessary ingredients for the adjustment of the private sector to permit the development of a true enterprise culture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The development of a harmonious private sector will make it possible more easily to achieve the transformation and export objectives required by international competitiveness. It should, therefore, help to counteract the erosion of commercial preferences generated by the Uruguay Round. The latter's time limits should, in any case, be extended, because it seems clear that the ACP countries will be unable to fulfil their obligations by the end of the moratorium obtained by the EU during the negotiations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The notion of compensating for inequality that is found in international development law, implies the adoption of a normative system to counteract the weak trading position of developing countries vis-a-vis their competitors in the North. But in recent times, this idea has been losing ground and it is unlikely to cut much ice with the WTO authorities. Legal equality in a situation where there is structural inequality is not, in fact, equitable, and it is therefore necessary to find some other way of mitigating the adverse effects, looking at it in a global context.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Promotion of domestic and foreign investment should be better supported. People talk of the 'risk/ country' threshold that deters foreign investors. It may be that this can be measured objectively by looking at economic and other indicators, but even if this is not possible, it clearly exists as a psychological barrier. This is a problem for many ACP countries and it needs to be crossed, using measures which tackle the many obstacles to investment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Changing the culture of development cooperation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Besides all the technical aspects, one could argue that the shortcomings of the Lom&eacute; Convention stem also from the perceptions of those involved in development cooperation. In short, it is the actual concept and culture of development aid which must be changed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the European side, the colonial legacy has conditioned attitudes, imprinting on them a dominant patemalism which is prejudicial to the aim of development. This European concept of cooperation must be overturned. Moreover, development cooperation must not be seen as the art of the possible but as the art of making possible what is strictly necessary, by virtue of genuine negotiation with the countries which have resolved to move forward.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, it is desirable to have a better developed policy of informing European public opinion about development cooperation. An effort is needed to counter false impressions, such as the one left by the French journalist who wrote: 'Official development aid is like taking money from the poor in rich countries to give it to the rich in poor countries'. Better information is needed to ensure that the public can decide such matters for itself.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Coordinating the Union's policies with those of the Member States now presents an enormous challenge. The political obstacles are huge and development cooperation may well suffer as a result of them if the objectives of coordination, coherence and complementarity contained in the Maastricht Treaty are not achieved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for the ACP countries, success in their economic development depends on many factors, cooperation being only one of them. Many political leaders in these nations have too often described cooperation with the North as the only way in which they can develop. In fact, this should be seen as nothing more than an additional factor - supporting the national effort and a genuine desire for development. It is pure fantasy to believe that development can be set in motion solely on the basis of an external impetus. To succeed, it must come from within a country. This is why future cooperation between the EU and the ACP countries must progress towards reinforcing the aptitude of the latter to devise, master and control their own development process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the future, the ACP countries must propose concrete and responsible solutions to their partners, doing so by means of the dialogue system. They must also promote development based on participation, particularly with the involvement of young people and women.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fact that the ACPs can offer a credible prospectus for development must be acknowledged. It is undoubtedly a challenge, but it can successfully be overcome if a climate of stability, security and confidence is created, matched by an unambiguous political will.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In KU/ACP relations, programmes must include the long-term vision necessary for sustainable development. Too often in the past, the strategy has been aimed at an immediate and ostentatious result. Successful development in the future will depend crucially on a change in such attitudes. </P>
+<P ALIGN="JUSTIFY">K.K. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let us know what you think</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The debate about the future of cooperation between the European Union and the ACP states is now beginning to gash' pace. Last year, we established the 'Analysis' section in The Courier to report on this debate-and give readers an opportunity to express their own views on the subject.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The response so far has been encouraging, but it has come mainly from the European side. We are keen to receive contributions from ACP readers as well. If you have you own ideas or opinions about what should happen after Lom&eacute; IV expires, why not put them on paper and send them to us. Our address is on the inside front cover of the magazine. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The view of civil society on the future after Lom&eacute; IV</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was the subject of a conference which took place in Maastricht from 12-14 June, under the auspices of the European Centre for Development Policy Management (ECDPM). It brought together participants from ACP countries and Europe, including representatives of civil society (NGOs, the private sector, etc.). Four major topics were addressed:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· How can a new KU/ACP commercial relationship be constructed ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was agreement that some form of preferential trade regime should continue after 2000. Some participants stressed the need to Promote 'fair trade', which would contribute not only to growth but also to development. The impact of individual trade preferences is not always clear-cut, but obviously there cannot be a single solution covering all problems in all ACP countries. An analysis of negative constraints demonstrated the difficulties involved in reconciling the rules of the Lom&eacute; Convention and those of the World Trade Organisation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· How can the private sector become involved in development ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most important aspect of this topic is knowing how to create a favourable and business-friendly environment which will enable the private sector to play its part-and the role the European Union could play in this process. The private sector was defined as both formal and informal, encompassing large, medium and small enterprises, whether local or foreign. The importance of a strong local private sector in guaranteeing long-term stability was particularly emphasised. In this respect, the view was expressed that the role of the state and its relationship with the European Commission should be redefined. There was also a call for time to be set aside time for effective dialogue, and to create the space for a partnership between the public and private sectors. It was felt that the role of Economic and Social Councils should be expanded and specified more clearly. As for the specific issue of privatisation, the point was made that this should not be seen as a panacea and that it should be approached on a country-by-country basis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As regards current instruments, it was noted that their objective is essentially to meet public-sector requirements. The role of the Centre for the Development of Industry (CDI) attracted some criticism. Speakers felt that the private sector should be more involved in the preparation and implementation of cooperation programmes with the European Community. Direct financial support to the private sector was seen as desirable, including backing from the European Investment Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What partnership ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The partnership concept was seen to have been eroded over the past two decades, with the pretext of efficiency resulting in a more paternalistic approach. Mechanisms needed to be found to enable EU priorities and the prerogatives of ACP countries to be reconciled. Reference was made to the political nature of the origin of the partnership and the need to find a new political raison d'etre for this type of relationship. The problems of cohesion within the ACP group and its relations with the EU were also raised, and there was a discussion about the possibility of giving the Convention a regional character-although a number of speakers expressed reservations about this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the European side, two lacunae emerged, namely coordination between donors, and consistency between Lom&eacute; and other Community policies (including relationships with the Bretton Woods institutions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the principle of partnership, some participants were keen to stress the motives of solidarity and common interest that lay behind cooperation. It was not simply a matter of 'negative' interdependence. The appropriateness of the term 'partnership' was questioned, if this was only to mean financial and technical cooperation. The politicisation of Lom&eacute; appears to be on the agenda, involving a move from the current partnership to a genuine 'contractual approach' through political dialogue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As for the role of partnership in cooperation policy management, it was felt essential that civil society and the private sector be involved. There was also a discussion of the debt problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· How can financial and technical cooperation be improved ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As usual, reference was made to the need to simplify and differentiate management of Lom&eacute; Convention instruments, particularly in the context of the programming process. As regards the role of non-state actors, a cautious approach was recommended. Finally, new instruments were called for to prevent conflict.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Conclusions</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This conference, coming after several others of the same type, was characterised essentially by private sector and NGO calls for greater participation in Community cooperation policy. Moreover, the need for 'politicisation' of the Lom&eacute; policy, shifting from purely financial and technical aid to a genuine cooperation contract, seems to have attracted the support of all participants. These questions are sure to figure in the 'Green Paper' on 'tome after 2000', which the European Commission plans to publish before the end of 1996. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dominique David</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Democratising democracy'</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On 6 and 7 June, the Belgian Par/iament hosted a UN seminar on 'me future of international development cooperation: new communication challenges' 'Democratising Democracy' was the succinct, journalistic way in which one of the speakers at the meeting summed up his solution to the problem of underdevelop meet. He was Jean-Bertrand Aristide, former President of Haiti, who observed that democracy, as advocated by the developed world, and increasingly accepted by developing countries, does not prevent the latter's slide into even greater poverty. The Courier had the opportunity to interview Mr Aristide. We began by asking him whether his statement implied that democracy is failing in a world striving to 'globalise' it J-B.A.-The word democracy comes from the Greek words 'demos', meaning people and 'kratein', meaning to govern. In other words, it signifies government of the people, for the people by the people-but if we take a look at the world today, the impression we get is that not all so-called democratic governments are in fact what they purport to be. Hence the need to 'democratise democracy', so as to create a situation in which all citizens can help set governments on a course towards such a model.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Concepts usually generate conflict and, therefore, when speaking of revolution, democracy or globalisation, it is necessary to be au fait with the subject matter so as not to become involved in a dialogue of the deaf. In the specific case of globalisation, my opinion is that this has a tendency to make what is an already precarious situation even more unbalanced. Concepts cannot be applied everywhere without thought being given to their harmful consequences. This does not mean to say that we should give up completely. It's one thing to speak of the globalisation of peace, as if an ineluctable need existed to promote peace on a world scale, but I'm not sure that everyone would define the globalisation of peace in the same way as I do.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Could we turn now to your own country, Haiti. How do you view the future of democracy there, bearing in mind the economic circumstances ? At the seminar, you mentioned several factors which demonstrate democracy's *agility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Democracy is indeed fragile. 1% of Haiti's population owns 48% of the country's wealth and it is estimated that about 65% of the working population is employed in agriculture as against 5.1% in the 'industrial' sector. But is this really the true picture ? Reality for most people is poverty-unacceptable and sub-human poverty. A man needs work to earn his daily crust by the sweat of his brow, but unemployment has reached catastrophic proportions. When people are unable to earn their living, there is little point in discussing the positive influence of democracy. What is needed is for those with a great deal of wealth and those with less wealth to talk to each other; a dialogue between the private and public sectors, so that we can head off futile conflicts and devote all our efforts to economic growth coupled with human development. I do believe that this is possible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yet, the rich are so rich and the poor so poor. Is it not fantasy to think that the gulf which separates them, and their mutual mistrust, can simply be set aside so that genuine dialogue can take place ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-This is one of the challenges we have faced ever since 1960 and, although we have not yet reaped the harvest of this process, we have to carry on. It's not too late. We just have to approach the subject logically and with all the facts to hand, and we must have the intelligence to be patient. If we continue with dialogue, we will achieve real results. Only the citizens of Haiti can play a part in Haiti's development-this is not a task for outsiders. We, on the other hand, have to be more receptive to international cooperation, while maintaining mutual respect and dignity. But what we also need is for our own people to act together in order to enhance our own growth. This is not to say that geopolitical reality can be disregarded. Other countries have to be taken into account, but, as a starting point, we have to consider Haiti's human and material resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Thereisdialogueata world level, but there are rules to be applied. I am thinking, here, of free competition. Haiti has to play by the rules, just like any other country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-Since we gained independence, our history has seen a succession of coups d'etat and people have been over-eager in brandishing weapons to solve economic, political or social problems. Now that democracy has been restored in Haiti, weapons are not the solution to our problems-I cannot stress this enough. What we need is for those with money to sit down and negotiate with those who have none: for the government to get people round the table and devise a common plan to accommodate all interested parties- looking at both the nation's interests and the interests of investors. I do believe that it is possible to achieve this. We have, in fact, already begun to prepare the ground. I am not basing my words, here, on pure theory, but am speaking from experience. In concrete terms, we have to transcend class and racial differences to recognise that Haitian men and women, regardless of their colour and the country they might live in outside Haiti, regardless of their nationality, even, are still part of Haiti's indigenous population. The way must be kept open for dignified and balanced cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The other point you mentioned today was that there can be no development without the effective involvement of the population. Are you not leaving yourself open to accusations of having socialist or even communist tendencies ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-As I have just said, we have to be scientific in our approach and check our facts over and over again. I fail to see how anyone can claim to be working towards peace without looking at poverty which is the greatest threat to social cohesion. Of course, there are those who would deny this assertion, and that is their right. However, rational analysis of the situation can help us alleviate poverty and promote security. It needs to be underlined that security is also one of the essential factors in economics. The UN Security Council is called in to prevent or resolve conflicts. To my mind, we should also be talking about an economic security council to deal with the economic realities. The deeper one plunges into poverty, the greater one's feelings of insecurity-the two always go hand in hand. And insecurity can crop up anywhere in the world. Nor is it a question of charity. It is a real, rational question which must sharpen our awareness, stimulate our common sense and set us on a course to protect the world by alleviating poverty. That, at least, is one approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, you have to recognise that politics is essentially a question of power while economics is influenced by interests. Everyone uses the means at their disposal to defend their personal interests and we know perfectly well that there are no free gifts. The so-called developed countries allocate just 0.3% of their GDP to development aid, yet we are losing our tropical forests at the rate of the area of a football pitch every second. In Haiti, forests now cover only a small area of the country. But in the final analysis, environmental catastrophe threatens us all, rich and poor alike, even if certain countries do not face specific ecological risks. We either deal with it as reasonable people, or we close our eyes to the 'cause and effect' realities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Yes, but are we reasonable people ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-The crisis of ethics is indeed a reality and a great many values are now being called into question. These days, we have to love in order to prove we are not contradicting ourselves. If we believe in God, we might call this love 'God', just as we might call it 'justice'. It all depends on your philosophy, religion or beliefs. If I feel love, I cannot be indifferent to the situation of victims of injustice, both in Haiti and elsewhere. If a man is humiliated, crushed, exploited or marginalised, then 1, too, am humiliated, crushed and marginalised. It is love which makes us fight for justice everywhere. Either one is a demagogue revelling in big words or one is sincere and ready to die so that another might live-this brings immortality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· One final question. You were speaking just now of insecurity and economics. Is there a link, here, with one of your most recent decisions, the abolition of Haiti's army ? Could you tell us how you were able to pull off this 'coup'? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- I am perfectly happy to answer such an important question and would like to be able to give a clear and direct reply. But given that the struggle is still going on, I don't think I should go into too much detail. A decision was made. The Haitian people opted to rid themselves of the army. Supporting their democratic wish, it was our job to help bring about this dissolution. The army, it is worth recalling, had about 7000 men, absorbed 40% of the national budget-and had killed many of our compatriots. We have had to be logical and patient in achieving this goal, bearing in mind that the guarantors of the agreement which led to my return had their own views, which were different from ours. We also needed courage and wisdom and, above all, the determination of the people. My motto has always been that it is better to fail with the people than to succeed without them, and in this we did not fail. Our task now is not to bask in our own glory but to continue the work of structuring the police force, to prevent it becoming another army. To achieve this, we have to make steady progress and use sound judgment. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interview by Hegel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Close-up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Growing rice at high altitude in Burundi</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Jean-Pierre Tilquin and Miguel Amado</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This tiny country tucked away at the heart of Africa has, as is well known, been convulsed over the last three years by an acute socio-political crisis. The tragic consequences have included loss of human life, damage to the economic and social infrastructure, and a movement of refugees to neighbouring countries. Burundi, already one of the most densely populated nations in Africa, also has high population growth. It could be argued that it is only thanks to the hard work and perseverance of the farmers (admittedly, 90% of the population) that the country manages to keep going at all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture in Burundi follows traditional lines and is based on a farming system divided between food crops for consumption by the farmer and his family, and cash crops (mainly coffee, tea and cotton). Although at the beginning of the decade the crops grown for food were sufficient to meet the population's needs, today demographic pressures are forcing farmers to increase food-crop production. It is these pressures that have prompted them to descend into the marshlands which cover approximately 110 000 hectares (8% of cultivable land in Burundi). These marshes are flooded during the rainy season and so allow rice to be cultivated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population growth has also meant that fields cannot be left fallow for long periods. This has resulted in more intensive use of marginal land and an increase in forest clearing. Such practices exacerbate erosion of cultivated areas. The loss of organic matter and nutrients leads to reduced soil fertility and lower yields. Although rainfall in Burundi is high, the soil is only moderately fertile, because of factors such as acidity, aluminium toxicity, and phosphorus immobilisation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While 20% of land suitable for cultivation is currently given over to growing dry beans-a staple in the Burundi diet - various factors now point towards farming the low-lying marshlands, with a particular emphasis on rice. This is one way of increasing the useful agricultural surface area of the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The events of 1993 (democratic elections, followed by the assassination of President Ndadaye), have created a period of instability which has been highly damaging for the country's agriculture. Some people lost their property and livelihood, and are only now slowly re-establishing themselves. The environment has also suffered as a result of the sheer numbers of displaced people. They occupy areas, both urban and rural, which were completely unprepared for the flood of people. it is estimated that 50 000 hectares of forest have been destroyed as a result-with devastating consequences for the country's ecosystem. What is more, the rate of demographic growth has led to overfarming and to a reduction in the average surface area of farms (to 0.7 ha per household).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rice-a crop for the future</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Against this background, the prospect of farming low-lying marshland offers some hope for the people of Burundi. In fact, the marshy valleys have long been used to grow beans, maize and sweet potatoes during the long dry season for later consumption during the short dry season. This practice, which was environmentally sound, provided a regular harvest, but also ensured the preservation of the marshlands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The practice of growing rice during the rainy season, followed by a crop of maize and beans during the dry season, is a form of integrated agriculture. It should be economically viable and environmentally sustainable while ensuring product quality, delivering a good yield, limiting any risks involved and allowing a high degree of social integration. These are the criteria which need to be examined in determining whether high-altitude rice cultivation in Burundi succeeds or fails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rice crops have been grown in this region, on the shores of Lake Tanganyika and in the Ruzizi valley (altitude 800 m), for more than 200 years, having been introduced by successive migrations of people travelling along the old slave route from Zanzibar. Certain varieties, known as 'pandabilima' (which in Swahili means 'he who climbs the mountain') can be grown on land up to a height of 1300 metres. They cannot, however, be planted on the higher central plateau because low temperatures at night render them completely infertile.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is not surprising that the new scheme to grow rice at high altitudes was greeted with interest. Indeed, it became almost a craze among farmers -to the extent that in 1990, rice crops covered more than 20 000 ha of Burundi. The area planted with rice fell subsequently, and in some regions the crop disappeared altogether. This was due largely to the appearance of the fungal 'rice blast disease', which can wipe out an entire crop, and to inadequate planning and misguided husbandry. The extensive planting of only one variety left the crop particularly vulnerable and once the disease did take hold, it was virtually impossible to eradicate. Needless to say, in a country where access to pesticides is non-existent, the introduction of a new crop cannot be based on a single variety; if it is to establish itself successfully, varietal diversification is vital. We should point out here that attempts were made in 1984 to improve varietal diversification </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">in the framework of the EU's Scientific and Technical Programme run by DG XII of the Commission. At that time, it was necessary to familiarise farmers with the techniques for growing the new crop and this aspect of the programme was funded by the EDF, in particular through three integrated projects. These related to agriculture and pastoral forestry and were initiated during 198889 in three provinces of Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Without going into the technical details of the programme, it suffices to say that growing rice at high altitude in the tropics differs from rice-growing in temperate regions. The low night-time temperatures characteristic of high altitudes mean that the crop is subject to constant stress. In temperate regions, the stress caused by cold weather is a problem only at the beginning and end of the growing cycle. As for selection methods, rice varieties have been produced that are resistant to rice blast disease - which remains the main problem. Also, by mixing the varieties grown, the farmers have created a wide diversity which offers a stable basis for a sustainable crop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Transformation of an ecosystem</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the viewpoint of development aid specialists, turning marshland into cultivable land means draining it (digging a ditch and fitting pipes). But this leaves the land open to erosion, causes silting in rivers and ultimately leading to desertification. By changing water levels in a region and disturbing the thermal equilibrium, marshlands cease to be marshlands. The method may have been justifiable before rice growing became possible. Indeed, it was employed in the natural marshlands of Buyenzi by some experts who specialised in upland rice. But it also resulted in large-scale destruction of one ricevariety-Yunnan 3-by rice blast disease in 1990.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Development projects which set themselves spectacular objectives can involve major alterations to the landscape. More often than not, these need to be rectified later. Thus, when it was decided to cultivate vast expanses of papyrus, the plants were moderately successful only thanks to constant artificial assistance. Put simply, the land could not sustain the crop on its own. In the process, the marshes were turned into floating peat bogs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The option chosen here was to adapt the small valleys for rice cultivation and teach the farmers the relevant techniques. Together with their families, they have eagerly embarked on the work needed to prepare the terrain for cultivation, although there are still some land tenure issues that need resolving. (Some people have refused to commit themselves to marshland reclamation projects as long as the land does not belong to them). It should be stressed that growing rice along a strip of water is an option which is in harmony with environmental needs. It promotes percolation of the water, thereby restoring underground water levels and preventing pollutants from being washed down towards the Nile or Zaire basins. It is therefore in keeping with global strategies for conserving resources and ensuring sustainable development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the marshlands, farmers traditionally plant beans and maize in banked-up beds during the dry season (from June to November). By skilfully selecting and growing different bean varieties, the farmer can stagger his crops and thereby ensure a continuous harvest from September until the time the maize is harvested. The marshes are then left fallow during the heavy rains which reach their peak in April. A rice variety which can be harvested in six months could thus be fitted in during this perriod with out disturbing the traditional hill-farming work schedule.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since farmers on the high plateaux had not traditionally grown rice, it was necessary to teach them the techniques needed to produce a successful crop. They were also informed of the benefits that improvements such as dykes, water supply pipes and drainage pipes could have on crop productivity. They have since applied this knowledge in their cultivation. During the dry season, without disrupting the infrastructures on which their rice cultivation is based, they have rebuilt banked-up beds and grown the traditional bean and maize crop. The system has been in place for about ten years and no drop in yield has been recorded. The yield averages 4.5 t/ha for rice, 1 t/ha for beans and 0.4 t/ha for maize-figures which are quite remarkable when compared with the yields of crops grown on the hills in acid soil with increasing levels of aluminium toxicity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By alternating two different farming systems, the problem of weeds -and therefore hoeing-and of pests is greatly limited. The extensive mixing of the soil that takes place accelerates the recycling of biogenic material-and the marshlands stay as marshlands!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Manageable land development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are three main types of marshy valley, each requiring specific programmes. The first consists of valleys lying above 1400 m with a rainfall in excess of 1500 mm. These areas are characterised by a clay soil, are constantly fed with water (with a high iron content) from the mountains, and are often very rich in organic matter. They require drainage using ditches and filtration channels, with changes of gradient so that the mountain water tables can be tapped and the water levels controlled. This is important to prevent a build-up of ferrous toxicity in the soil, which is extremely harmful to rice. A farming system involving paddy fields and banked-up beds can be accommodated perfectly in these types of valleys. Then there are the valleys lying between 800 and 1400 m with a rainfall of between 1100 and 1500 mm. These are known as 'dambos' in Swahili, and they extend from Northern Kenya right down to Southern Zimbabwe. Strewn with giant termite nests, the land here is well-suited to rice cultivation as long as water levels are carefully controlled. All the available water needs to be harnessed via filtration canals dug into the hillside. These allow the paddies to be irrigated speedily and, during the dry season, they can also be used to irrigate between the rows of ridgeplanted crops. It would, however, be very difficult to irrigate the entire valley during the dry season and so it is pointless digging a drainage ditch. The third and final type consists of small alluvial plains tucked away between the hills and stretching along the escarpments. Here, the level of soil fertility is determined by the heavy erosion resulting from farming on burnt land, and the practice of setting fire to the hills in order to 'regenerate' pastures. To grow rice in such locations, a filtration canal needs to be dug into the hillside, into which water then collects from the water table. The paddy fields also need to be terraced. These alluvial plains lend themselves perfectly to a farming system in which paddy fields are alternated with banked-up beds. All these land-adaptation schemes can be easily implemented and maintained by the farmers themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A sociological revolution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although rice grows quickly, it is highly labour-intensive. Thus, when</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">the young rice plants need to be planted out-which happens to coincide with the end-of-year school holidays-the whole family takes part. What is more, rice has become extremely important in sociological terms: reserved in days gone by for special occasions, it now forms part of the nation's staple diet, being mixed together with beans and dressed with palm oil and tomato sauce. The rice harvest is also a time for merrymaking and festivities which go on for the best part of a week.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rice cultivation has also engendered a vital sense of solidarity among farmers as far as sharing water is concerned, and rice-growing cooperatives have been a runaway success. These enable farming operations to be synchronised and running costs to be reduced, in particular by reducing the number of bird scarers needed. The crop, furthermore, can be harvested when fully ripe. On individual plots, farmers usually only allow the rice to mature to 75% before harvest for fear of theft. Finally, the cooperative helps to ensure that infrastructures such as drains and canals are properly maintained and that water supply installations are treated with respect. Each cooperative is run by a representative appointed by the group of farmers. These supervisors are then responsible for organising all operations: choosing and storing seed for the following season's crops, getting information about new varieties, consulting each other and pointing out any problems they may have to those in charge of research and advisory services. The area allotted to each cooperative depends on the number of households in the group and also takes into account the area available, with 10 ares per family being the usual maximum for planted-up paddy fields. Cooperatives may range in size from 5 to 25 families.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cooperatives like this are just the beginning. Networks of rural organisations, in which the farmers club together to buy equipment and fertilisers, need to be developed on a larger scale and they could provide a springboard for the development of the secondary sector, which is vital to the development of the country as a whole.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We would do well to recall that the cassava mills which have been so successful in Burundi and which still run today without any 'technical assistance' had equally humble beginnings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The future</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It must be acknowledged that the people who migrated to this 'wild frontier' of rice cultivation in Burundi also introduced into these regions diseases such as bilharzia and malaria (the mosquitoes carrying the parasite were transported in the luggage of people travelling from the capital to the provinces). Despite this, rice cultivation at high altitude has proved a veritable lifesaver for Burundi. In the year that the FAO plans to stage a summit on famine, it is appropriate to highlight the important role of rice-growing in the food production strategy of this country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Until recently, Burundi ensured that it had enough to feed its people through a delicate balancing act between growing food crops, leaving land fallow and rearing livestock which produced manure. At present, however, increased agricultural production is only possible by increasing the surface area of the country under cultivation-at the expense of fallow land and livestock farming. Such a move risks reducing soil fertility and could lead to the substitution of crops of high nutritional value, such as beans, with higher yield crops such as cassava or sweet potatoes which suck the subsoil dry of minerals and nutrients.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In short, traditional farming methods in Burundi are arguably now out of balance and the situation is getting worse. This may, indeed, be a root cause of the ethnic crisis. A systematic policy of re-establishing marshlands and organising rural communities around high-altitude rice cultivation would allow the country to look ahead with optimism to the next 20 years. Suitable varieties are currently available and the altitudes at which rice can be grown have been pushed back in Burundi as far as 1700 m. What is now needed is the funds! </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">J-P.T. &amp; M.A.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Developing world</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Freedom of expression: the heartbeat of democracy</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A view from UNESCO.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The article which follows is an abridged version of a text compiled by Carlos Amaldo, who heads UNESCO's research into communication and the free flow of information. Mr Arnaldo highlights some of the main aspects of the UN agency's support for the development of a free press in the African, Caribbean and Pacific regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The resolution passed by the ACP/KU Joint Assembly in March 1996 in Windhoek, Namibia, reflected the spirit of many of UNESCO's communication programmes in these regions. Echoing the principal tenets of the Universal Declaration of Human Rights, the resolution declares: 'freedom of expression is a precondition for holding free and fair elections'; 'the monopoly of information media is a barrier to the development of democracy,'; 'there is a need to create a climate in which all part)" can participate fully in political life.' It further holds: 'communication media must not only inform the electorate in an impartial and objective manner' but also; 'freedom of expression and the existence of free communications media are vital preconditions for the development of a democratic society.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The resolution was timely, responding to a need to remind political leaders, as well as civic society, of the relation between free communication media and truly democratic practices. Just five years ago, on 3 May 1991,</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">African journalists and media adopted the Windhoek Declaration at the UN/ UNESCO seminar on promoting an independent and pluralistic African press. Likewise, journalists and media practitioners of each major region adopted the Declarations of Alma Ata (October 1992), Santiago (May 1994) and Sana'a (January 1996), all of which affirmed the unwavering belief of professional communicators in freedom of expression, press freedom, independence and pluralism of the media, and the contribution of such freedoms to democratic processes. At their 28th General Conference, UNESCO Member States further declared that, 'press freedom is an essential component of any democracy.' All these declarations contain action programmes to strengthen press freedom in these regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turning to look at some practical initiatives, a media project entitled 'Independent Press in Africa', which was put in place after the signing of the Windhoek declaration, soon attracted the interest of a number of donors (Italy, USA, France). Under this project, the International Programme for the Development of Communication (IPDC) organised four sets of courses for journalists in 1994. In April 1995, IPDC arranged a multi-theme workshop for 33 English-speaking journalists and editors from Central and West Africa on marketing, distribution techniques, managing mass media enterprises in Africa, new communication technologies, journalism and ethical issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are now plans afoot to study the situation of the press in Mauritius, Madagascar and Comoros, and to publish several handbooks about press enterprises. Efforts will also be made to attract increased donor contributions so that the successes achieved by these initial training activities can be strengthened and shared with other regions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A further example of positive action in support of the media is the work of MISA (the Media Institute of Southern Africa-featured in more detail in the following article). This organisation has been receiving UNESCO support since 1994 under a funding arrangement with the Danish International Development Agency. The project seeks to strengthen links among the region's independent media so as to enhance the free flow of information. It also aims to boost cooperation and information-sharing with similar groups in developing and developed countries worldwide, to strengthen the ability of the region's independent media to stand on its own feet and to improve professional standards.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MlSA, which was set up in 1992, has been monitoring and safeguarding press freedom in the region, facilitated by an electronic network for distribution of information on press freedom issues. It has mounted seminars and training workshops for professional journalists on computer-aided design, strategic financial management, journalism ethics and advertising management. MISA's campaigning material includes a bi-monthly magazine, Free Press: the Media Magazine of Southern Africa and a booklet, So this is Democray, which is a compilation of its 'action alerts' curing 1994 and 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another UNESCO initiative is the 'Communication and Good Governance in West and Central African Countries' project, supported by Germany. This aims to strengthen the human and technical capacity of the media in these regions so that they can make a contribution to good governance. The three year project is to be implemented in 10 countries - Benin, Chad, Equatorial Guinea, Gambia, Ghana, Guinea Bissau, Liberia, Mali, Sao Tome &amp; Principe and Togo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Together with other institutions such as legislatures, the judiciary and civic organisations, media bodies like MISA have a useful role to play. They can enhance transparency and accountability by systematic analysis and reporting of government programmes, policies and pledges, and by encouraging public discussions which help people to make informed decisions about public issues and about how their leaders discharge the power vested in them. Fulfilment of these functions requires access to the media, and qualified, well-trained practitioners who can effectively use the media for information, education and communication on good governance issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caribbean</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turning our attention now to the Caribbean, the question of media freedom recently came to the fore in Trinidad and Tobago when 13 editors and journalists on The Guardian lost their jobs following publication of a number of controversial articles (some reports said they 'constructively resigned'). The events cast a shadow over the famous Carnival. Indeed, as one journalist put it, the Carnival quickly ceded to the 'sacrificial rites' of Holy Week. Six of the paper's youngest reporters were among those who lost their jobs-but out of the furore, a new newspaper was born.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A 'Comparative Study of Media Laws in the CARICOM countries' by Ainsley Sahai, commissioned earlier by UNESCO, became a reference in the debates that followed. The study highlighted that all Caribbean countries guaranteed freedom of expression in their national constitutions. Indeed, Trinidad and Tobago's constitution explicitly guarantees press freedom as well. The Media Association of Trinidad and Tobago (MATT) organised two meetings. The first of these, on 10 April 1996, was a public forum on issues of press freedom. Although a full cross-section of society was not present, and not all the issues at stake were fully debated, it was nevertheless a start. Those who took the floor came from many sectors of society -women, the unemployed, workers, community organisations and at least three different religious groups. About a quarter of those who contributed spoke as individuals. While many criticised the press for errors in reporting, all confirmed the need to uphold a free press vis-a-vis both political pressures and economic and financial interests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The public gave strong support to MATT and demanded that the forum be replicated in other parts of the country. It was the first time that the public had been given the opportunity to speak out on these issues. It was not so much the content of the discussion which counted, but the very fact that the event took place, bringing the media closer to its 'customers'. The meeting gave the public an opportunity to put over their own perceptions of press freedom, impartial reporting and the strengthening of democratic processes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two days later, with support from UNESCO, the Media Association staged a journalists' symposium, moderated by George John, consulting editor at The Guardian. David de Caires, publisher of Guyana's Stabroek News was invited by MATT as an external consultant. Drawing on past and more recent examples of uneasy relations between a free press and governments, Mr de Caires concluded with a headlinehitting statement; the relations of the press with government should not be too cosy, the press must maintain its adversarial position.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many journalists took the floor to stress Trinidad and Tobago's constitutional guarantees for both freedom of expression and press freedom. They also stressed the need to safeguard editorial independence, not only in the printed press, but also in broadcasting, and urged the repeal of 'antiquated' libel laws-a point also made in the Sahai study. The preparation of a Freedom of Information Act was strongly urged to ensure access to public information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These events appear to have strengthened the resolve of the jobless journalists. They grouped together to set up a new weekly newspaper, called The Independent. The new publication focuses on investigative articles, comment and reviews. In addition, a monthly called The Formatt was launched by MATT to disseminate specialised news on press freedom issues and to provide print support for future public fore. Both newspapers brought out their first editions in early May amidst the celebrations of World Press Freedom Day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pacific</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Pacific, issues of freedom of expression and press freedom are no less salient, although a key issue for practitioners there is the modernisation of infrastructures. This is needed to ensure that this vast island region does not find itself in the slow lane of the information highway.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The computerisation of radio newsrooms, in places such as the Cook Islands, Vanuatu, Fiji, Solomon Islands and Tonga, is a priority. The Cook Islands already has a fully computerised newspaper operation. Indeed, this is the first newspaper in the Pacific with the capacity to transmit photographs from various parts of the country to the newsroom electronically by phone.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Considerable concern has been expressed about the inadequacy of national television programming. There is a need for the people of the Pacific to see themselves and their culture, and not just the imported fare distributed by most international TV services. With UNESCO support, women media producers from seven island countries were able to meet to work out ways of cooperating on a series of television documentaries that they themselves produced and exchanged within the region. Preparations are now under way for the annual evaluation and awarding of prizes at the end of 1996. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">C.A.A. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Campaigning for free expression in the SADC region</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by David Nthengwe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Media Institute of Southern Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Officially launched in September 1992, the role of the Media Institute of Southern Africa is primarily that of coordinator, facilitator and communicator in the promotion of media freedom and diversity, (as envisaged in the 1991 Windhoek Declaration). MISA operates in 11 of the 1 2 SADC countries and is currently investigating setting up a chapter in the twelfth-Mauritius- which joined the Community 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The chapters are serviced by a regional secretariat based in the Namibian capital, Windhoek. The secretariat is accountable to a policy-making governing council of elected representatives from each national chapter, while funding for MISA and its projects is channeled through the MISA Education and Production Trust, overseen by a board of independent trustees. The organisation is currently almost entirely donor-funded, with UNESCO, NORAD, SIDA, the KU, the Friedrich Ebert Stiftung, IBIS, and the Australian and German governments being the main contributors. Other income is generated through the sale of subscriptions to MISA publications and services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Institute's main work is in the field of advocacy; highlighting violations of media freedom and free expression, and exploring ways of ensuring that these fundamental freedoms become entrenched throughout Southern Africa. In 1994, MISA became a member of the International Freedom of Expression Exchange (IFEX) network in a bid to increase international awareness of media freedom violations in Southern Africa. Membership of IFEX has enabled MISA to distribute as well as receive information on media freedom issues in a quick and relatively cheap way via the Internet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Action alerts'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1994 and 1995, MISA issued via IFEX and its own electronic mail network, the MISANET (see below), more than 190 'action alerts' relating to media freedom infringements in Southern Africa, and effective campaigns against some of these violations have resulted. In August 1994, Lesotho journalist, Rabuka Chalatse, was shot by soldiers while covering a demonstration. An alert issued by MISA triggered a swift response, and within 24 hours, funds had been raised to pay for emergency treatment which saved the young journalist's leg. In November 1995, Angolan freelance journalist, Mario Paiva, had his life threatened by people who, it was alleged, were state security agents. MlSA's alert prompted protest from throughout the world, and resulted in several governments offering Paiva sanctuary in their embassies in Angola. The threat against the journalist was subsequently lifted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MlSA's advocacy work has also shown that democratisation does not necessarily result in guaranteed media freedom and free expression. In Zambia, for example, which had a multi-party election in 1991, arcane laws inherited from previous regimes have been used against the private media in particular, and free expression, in general. As this article was being written, Fred M'membe, the Editor-in-Chief of Zambia's privately-owned daily 'The Post', and two of his colleagues, were starting an indefinite prison term for contempt of Parliament. The sentence was passed not by a court of law, but by the Speaker, under legislation inherited from British colonial rule. Their 'crime' was to comment on criticism made in Parliament of a Supreme Court decision which declared unconstitutional, laws requiring anyone wishing to stage a demonstration to obtain police permission first.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Five months prior to his arrest, M'membe received the MISA Press Freedom Award, which is presented annually to individuals or institutions considered to have made an outstanding contribution to the advancement of media freedom in Southern Africa. M'membe was the third recipient of the award.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Free flow of information essential</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As the Windhoek Declaration points out, 'the establishment, maintenance and fostering of an independent, pluralistic and free press' is essential to economic development, as well as for the growth of democracy. Accordingly, MISA argues that the free flow of information is vital to the development process. Effective communication within SADC-a 'development community'- has been hampered by the region's poor postal and telecommunications services. MISA considers that these logistical barriers to the free flow of information are a form of censorship. In a bid to break through the information voids which have kept Southern African media workers and their audiences isolated from each other for so long, it has made particular use of advances in information technology, including, most notably, the Internet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past two years, MISA has been linking member organisations up to electronic mail (e-mail). This allows members throughout the region to exchange news, photographs and other information. To date, 25 MISA member organisations are linked to this network, called the MISANET, although further growth has been hampered by members' unfamiliarity with e-mail, and the lack of local technicians to train people and provide user support. Nonetheless, computerised communications have proved to be an appropriate technology, and development of the MISANET remains a top priority. By making some services available to non-MISA subscribers, MISA also intends to generate income and thus reduce its current dependency on donor funding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Focus on training</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The coordination of training and material support to independent media is another area where MISA looks to develop media freedom and diversity. The region's independent media sometimes operates in politically and economically hostile environments. Its survival-and thus the sustenance and growth of media diversity-hinges on these organisations becoming highly professional, well-managed concerns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Working through training institutions based primarily in the region, MISA coordinates workshops and other training programmes aimed at improving the skills of media workers, particularly in the fields of management and finance. Workshops in strategic and financial management, project management, advertising, marketing, sales and subscription management, ethics, subediting, and computerised design were staged during 1994 and 1995. For 1996, training is scheduled in economic reporting, project management, photography, advertising sales, circulation and sales management, computer-aided design, developing world and financial and strategic management. Instruction will also be provided to media workers without formal training. Meanwhile, research is to be carried out into setting up a media ombudsman for Southern Africa, printing press initiatives, media training needs, and the difficulties faced by women media workers in the region. The last-mentioned is in line with MlSA's policy of encouraging gender awareness and equality within the Southern African media.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Private and community-based media organisations face constant problems securing adequate finance. As businesses, they often do not qualify for donor support, while banks are reluctant to lend them money. Therefore, MISA is looking to set up of a Media Development Fund to which independent media can apply for loans, credit guarantees and grants. A study is currently being conducted into the feasibility of such a fund, which MISA hopes to have up-andrunning by early 1997.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Broadcasting in Southern Africa is still largely state-controlled. Moves by some of the region's governments to 'deregulate' broadcasting have been erratic, and many private broadcasting licenses granted in the process have gone to organisations or individuals closely linked to the authorities. MISA is now drawing up a policy aimed at seeking the effective liberalisation of broadcasting legislation covering public, private and community broadcasting throughout the region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As part of this process, MISA will, this year, stage a conference on broadcasting and community media, to coincide with its Annual General Meeting-which has become one of the largest gatherings of media workers on the African continent. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.N.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Volunteers show their worth</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Thomas M. Neufing</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Volunteers have become a major component in international development efforts. They make up a significant proportion of the total human resources available for development cooperation (up to a fifth of the skilled international personnel serving in developing countries). In the early days, volunteer service was strongly influenced by the idea of oneway technical assistance. Specialists, mainly from the North, served in developing nations where their expertise was desperately needed but not yet found among local citizens. Much has changed since.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After the US Peace Corps, the UN Volunteers Programme (UNV) ranks as the second largest volunteer-sendina agency with some 4000 professionals in the field every year. Its universality and internationality is reflected in the high number of UNV specialists (74%) who come from developing countries. The scope and size of the international volunteer contribution to development cooperation (notably areas such as HIV/AIDS and the environment), has increased significantly over the years as a result of the changing development challenge. The re-thinking of the role of technical cooperation is equally central to the volunteer debate and this has led to much greater flexibility in the ways in which volunteer services are provided. The important role volunteers can play in peace building efforts with a long-term development dimension, complementary to humanitarian relief, is increasingly being recognised.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Working with rather than for people</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With the UNV's 25th anniversary, and the relocation of its headquarters to Bonn this summer, it is an appropriate time both to assess and to acknowledge the contribution made by these volunteers. Since the programme began in 1971, some 14 000 professionals have dedicated a period of their lives to serve as a UNV. The programme is administered by UNDP, and is therefore intimately linked to its structures, particularly in the field. Regarding community-based initiatives, the comparative advantage of UNVs is that of working with rather than for people over an extended period, thus facilitating their initiatives. The experience of many development agencies shows that in promoting socio-economic change at the village level, the type of person needed is one who-through long-term commitment and sensitivity -can learn as much from local partners as offer advice to them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International volunteers are engaged mainly in rural development tasks. Those working through specialised NGOs such as the Red Cross, and Medecins Sans Frontieres have proved to be highly effective agents, supporting governments faced with disaster situations. In the case of UNV, the value of using volunteer specialists from other developing nations, as a way of encouraging technical cooperation amongst developing countries, is particularly recognised. Most volunteers- perhaps two-thirds - serve in least developed and small island countries. And about three-quarters serve in rural areas, working mostly in programmes of agricultural and community development, health, education and the supply of basic services. Since the end of the Cold War, a growing number have been deployed in emergency relief, refugee and rehabilitation programmes. UNVs make up 10% of the UN's civilian component in Cambodia; 4096 of the field staff of the World Food Programme and almost 100% of outreach workers attached to the UN Mission in Guatemala. UNVs are increasingly involved in human rights promotion, the organisation of elections and conflict resolution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a consensus among the main international humanitarian and development actors that their programmes should be mutually supportive. For example, development efforts must respond to humanitarian crises by remaining on the scene and supporting immediate needs, as well as aiding in the prevention of crises which are known to be looming. Emergency humanitarian assistance should also pave the way for longer term development by viewing the immediacy of the moment through the lens of future sustainable rehabilitation. Both sets of activities should, ideally, be launched and implemented in tandem with local bodies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">External assistance efforts must include strengthening local capacity to cope with problems. Empowerment strategies which inform, educate and facilitate the people's own vision of peaceful and sustainable living environments (including respect for human rights) are fundamental to the future of communities coping in the aftermath of crisis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Relief, rehabilitation and development?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The UNV programme has been active in exploring the efficacy of volunteer support to communities in crisis in order to bridge the gap between immediate needs and longer term developmental goals. In 1994, the UNV held its 4th Special Consultation, entitled, Between Crisis and Development - Volunteer Roles and UNV's Contribution. At this event, donor governments, UN agencies and cooperating partners from civil society had an indepth discussion of the issues surrounding volunteer efforts, and the complementary nature of emergency interventions and follow-up measures. The participants reconfirmed the need for local capacity building. They also affirmed the usefulness of the UN Volunteer contribution in crisis prevention, emergency rehabilitation and 'building bridges' to sustainable development. The work of UNVs in preventive action and promoting post-conflict development was highlighted. There has been a significant increase in demand for specialist volunteer services in all types of crisis. These may be economic, natural or man-made, but they all have in common the need to provide essential relief and rehabilitation services for basic survival (to refugees and resident populations). In many countries, disasters and internal strife have put so much pressure on essential public services that the longterm capacity of the people to recover may be threatened. Governments in developing countries and donors both believe it is fully justified to use volunteer specialists to help provide such services during the adjustment period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Mixed' teams</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The contribution of both international and national volunteers is often essential to link immediate relief efforts to future long-term development. National volunteers-people working in their own countries within the UN framework-complement the international approach by providing the key grassroots perspective. UN Volunteers who speak local languages, live and work in remote communities, are familiar with community structures and are known to local leaders, play a key part in facilitating preventive action and providing follow-up in the aftermath of a crisis. UNV specialists are well-placed to build effective partnerships with national and local actors. In the last two years, some 2000 UN Volunteers have worked in various parts of the world in prevention and preparedness, peacekeeping, electoral support, human rights, rehabilitation and reconstruction, and humanitarian relief.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burundi offers an example of an initiative designed to stem a crisis through local capacity-building. The UNV is financing a project there which supports the mediation and dialogue efforts of the UN Secretary General's Special Representative (SRSG) through the recruitment of UNV peace advisers and conflict resolution facilitators. This project is being run successfully out of the SRSG's office, extending public awareness of the reconciliation process. It includes use of the mass media to promote understanding, and brings local actors together to work for peaceful solutions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The tasks undertaken by UN volunteers all fit into the spectrum which has 'crisis' et one end end 'development' at the other. The work, moreover, is undertaken in partnership-with civil society (NGOs and community-based organisations), government departments, UN agencies and regional international organisations (such as the KU).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through efforts that aim to link relief, rehabilitation and development, new productive partnerships are emerging to enhance coherence, coordination and complementarily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The growth of professionalism</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">30 years ago, the typical profile of an international volunteer was that of a generalist graduate from an industrialised country seeking first-time experience abroad before settling down to a career. Over time, the governments of developing countries made clear their need for practical and often specialised skills aimed at giving them the ability to manage their own programmes. They increasingly expressed impatience at hosting untrained volunteers. Professionalism became the key word. Unfortunately, the word 'volunteer' is still a source of confusion: it is often equated with 'amateur'. This is a perception that now needs to be corrected. The personnel sent out by most agencies that supply volunteers are likely to be in their thirties, with post-graduate qualifications and several years' practical experience in their fields. The typical UNV specialist is an example par excel/ence of this trend: 39 years of age, holding a Master's degree and with more than ten years of experience in a particular discipline.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It was not just the dedication, but also the professionalism of the hundreds of UN Volunteers serving in Mozambique that impressed Aldo Ajello, the former UN Special Representative in Mozambique (now EU Special Envoy for the Great Lakes Region). 'If I were to run another mission,' he said, 'I would ask immediately for volunteers.' In terms of monitoring-which was vital in building up the trust and confidence needed to ensure the election results were accepted-'UNV electoral officers were our only real presence and they proved to be extremely professional.' ~ T.N. </P>
+<P ALIGN="JUSTIFY">Study by the World Wide Fund for Nature</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Structural adiustment, the environment, and sustainable development</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by David Reed</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On 29 May, David Reed of the World Wide Fund for Nature (WWF) was in Brussels to present the results of a study undertaken by the WWF, with the support of the European Commission, the longterm consequences of structural adjustment programmes (SAPs) on the environment and the use of nature/ resources. Conclusions were drawn from nine country case studies from Cameroon, Mall Tanzania, Zambia, El Salvador, Jamaica, Venezuela, Vietnam and Pakistan. We publish here an abridged version of Mr Reed's general presentation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SAPs, often implemented at the instigation of the international financial institutions, have responded to the pervasive economic problems of the 1980s and to profound changes in the economy in recent decades. The programmes have generally been successful in improving macroeconomic indicators in developing countries. The marketorientation of economies has been increased through liberalised trade and capital flows, privatisation, reductions in regulation and price setting, and cuts in government budgets and programmes. For most developing countries, these changes were essential to economic recovery and adjustment to the new global marketplace.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sustainable development in the social, economic, and environmental sense, has, however, been ignored in SAPs. Many reform programmes have been accompanied by increases in poverty and unemployment, worsening income distribution, and the collapse of social services, environmental protection and state institutional capacities. These immediate costs of adjustment inhibit countries' long-term ability to expand productivity and employment opportunities, as natural resources are exploited indiscriminately to meet short-term needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Environmental impacts</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The environmental effects of structural adjustment vary from country to country depending on the specific components of the reform package, the structure of the economy, and the implementation process. The WWF's country case studies reveal particular mechanisms through which structural adjustment has altered resource-use patterns. Some more general patterns also emerge from the studies. Everywhere, cuts in government institutions and funding have reduced the state's capacity to facilitate the transition process, to compensate for market failures, and to provide for long-term and social sustainability.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many reforms associated with structural adjustment have the potential to improve both environmental and economic outcomes. However, the failure to implement complementary environmental policies or strengthen institutions and regulations, has created a very mixed environmental record. Increases in poverty, greater production incentives, and the loss of government regulatory capacity, have all aggravated patterns of poor resource use.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Extractive and agricultural economies generally increased production in response to greater exposure to global markets. Without proper policies in place, this increase has put a strain on fragile ecosystems. Environmental pressures include increased land degradation and deforestation for agriculture, livestock and timber production; increased production of non-renewables without long-term investment of the proceeds or environmental safeguards; and increased pollution and damage to the ecosystem from unregulated tourism.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The burden of fiscal retrenchment and price changes under structural adjustment have fallen most heavily on the poor, particularly women. The strong association between poverty and environmental degradation has been revealed, as efforts to maintain livelihoods have led to deforestation, land degradation, overhunting and other pressures on endangered species, as well as the unmanaged extraction of nonrenewable resources. Increasing poverty and unemployment associated with adjustment has also added to population pressures in urban areas with insufficient infrastructure exacerbating problems of pollution, disease and congestion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The implications of disregarding the environmental and social impact of adjustment are examined in the various case studies. Structural adjustment has been sustained by the promise that market-orientation and export-led - growth will raise living standards. Evidence from the studies, however, strongly suggests that long-term productive capacity is being destroyed by short-term exploitation of natural resources. Not only environmental but also economic and social sustainability are threatened by the loss of environmental goods and services. Drawing down natural capital has been encouraged by government policies that promote exports and open resources up to international markets. And the process is accelerated by the growing population of poor and unemployed who rely on natural resources for survival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recommendations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following its study, the WWF offers a series of recommendations to reduce the environmental costs of structural adjustment and economic integration, and to reorient structural adjustment aims towards sustainable development. Most urgently, environmental issues must be integrated into structural economic reforms - environmental assessments must become part of the programmes. A strategic vision of the role that natural resources and environmental goods and services could play in the transformation of developing economies is essential to designing appropriate strategies. Efforts to industrialise economies must include consideration of the environmental implications. Social services and environmental institutions must be maintained during the adjustment process to prevent increases in poverty and environmental degradation that have both short-term and long-term consequences for development. Essential services include credit and marketing support to small farmers, income-generating opportunities for women, food-assistance programmes, and promotion of distributional equity. The state's role in providing services which neither the private sector nor civil society can provide, must be maintained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the great variety in economic structures and in the capacity of markets and civil society among developing countries, adjustment strategies and government roles must be tailored to each case. Everywhere, countries must implement national institutional reforms for environmental management. Civil society must be strengthened to allow participation in the adjustment process. International financial institutions promoting and designing SAPs must reform their policies and approaches to implementation in the light of the clear evidence that macroeconomic reforms are having a profound effect on the environment and on the possibilities for sustainable development. Continuing failure to correct these problems on a national level accentuates the concern for addressing issues of sustainability on a global level. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.R. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Culture and society</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Why a Biennial Festival of Contemporary African Art?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dak'Art 96</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first World Festival of Negro Art, held in 1966, was essentially a political exercise. In the post-independence period, it was felt necessary to show the world that the people of Africa (both the continent and the diaspora), had a rich culture which had long been suppressed. The festival - which has never been repeated-is viewed with a great deal of nostalgia by supporters of modern African art and black intellectuals. The better, brighter future, which seemed at the time to be just over the horizon, never quite lived up to expectation. Even before financing problems had surfaced, the festival's fate had already been sealed by petty political rivalries and a greedy pursuit of the limelight. Years later, attempts to relaunch the event met with a lukewarm reception. It was already the beginning of the end as far as ideologies were concerned. In complete contrast, Dak'Art 96 (Dakar, 915 May 1996) set its sights firmly on the market place, nowadays the yardstick by which all success is measured. Its goals were simple: to break into the art market and overcome the generally held prejudice that contemporary African art lacks modernity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An international market for African art does exist, but it concerns itself solely with ancient art- and Africa itself profits little from such trade. Indeed, it would be more accurate to speak of plundering than of trade. The seminar, organised last year by the Terveuren Museum in Brussels on the looting of African works of art, revealed the true extent of the phenomenon. Despite the fact that pirated works fetch considerable sums on the black market, contemporary African artists are faced with a 'Catch-22' situation. Major galleries in Europe, America and Japan do not exhibit their work because African art is ignored by the leading art periodicals; and their work never appears in these publications because it is never exhibited. One reason for the fact that African art is not put on show is that virtually no funds are allocated by international institutions to sponsor exhibitions by the artists in question.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many third-world governments do not dare, are unwilling or are unable to include culture on their list of priorities within international cooperation agreements. One exception is Burkina Faso which now boasts a cinema industry as a result. Senegal is trying to follow in its footsteps. But there are not many places in Africa where artists are promoted for the quality of their creative output. The majority of initiatives have, in fact, been on a voluntary basis. The magazine Revue Noire is one of the most significant examples of this approach. A group of aficionados of contemporary African art - indeed with a passion for art pure and simple, whether African or European-decided to try and break the vicious circle. They looked at two options: the establishment of an art gallery of worldwide renown or of an equally prestigious arts publication, and came down in favour of the latter. Thus Revue Noire was born. However, its success was generally given very slim odds: it was seen as too glossy, too expensive and too intellectual. The sub-text here of course, is that a publication about African art had no right to be glossy, expensive or intellectual, especially since the money could have been used for something far more 'useful' to the development of these countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Others, such as Marie-Claire Mwanza from l'Espace Alizes in Brussels, have attacked the problem from a different angle-by exhibiting contemporary African art. Prior to her initiative, there was not a single gallery in Brussels that specialised in this sector of the market, and there are still none that figure on the shopping lists of the world's great collectors. Whatever the price set for a contemporary African work, it is generally perceived as being too high. The contrast with the prices demanded for works by even the youngest European or American artists, even for their very first exhibitions, speaks volumes. African art is too expensive in relation to what exactly ? The answer is in relation to the status accorded to it, which is of course determined by the art world. In other words, a big fat zero if one considers the fact that African art is never exhibited.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thanks to Revue Noire, African art has been brought to the major galleries of the Western world. Similar projects have been launched or are in the process of being launched in various countries of the West, such as the magazine NKA in Brooklyn, for example. Exhibition organisers, museums, galleries and those looking to stage art festivals now know on whose door to knock, and the last few months have proved extremely promising. The Guggenheim Museum in New York is currently hosting a major exhibition of African art, and Africa 95, held in London, was swiftly followed by Copenhagen 96. The Guggenheim Museum, moreover, is in a completely different league to the Museum of African and Oceanic Art in Paris or the Museum of Central Africa in Tervueren, Belgium (formerly the Colonial Museum)-it is one of the world's most prestigious temples of modern art. What is more, London's Africa 95, which was so disparaged by African art specialists, who considered it nothing more than a meeting place for traders, did, whether we like it or not, act as a significant catalyst. And what about pirated works of art, such as those plundered from the Niger Valley ? These have found a 'home' in public as well as private collections, pointing to a real need to 'clean out the Augean stables'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A few African artists are beginning to get themselves known within 'the market', but there are still not enough of them. It was with great foresight that the organisers of Dak'Art placed these artists at the top of their invitation list. Another shrewd move was to invite the art market's arbiters of taste to select those African artists who should present solo exhibitions, and to ask celebrated art critics and collectors to form part of the international panel of judges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is probably true to say that Africa has rarely known such a dynamic period of creativity which places it at the forefront of global aesthetic trends. The aim of the Biennial Festival was to underline this fact beyond any doubt. Among those artists who are currently in a position to break into the market, the Senegalese sculptor, Ousmane Sow, probably heads the list. Paradoxically, however, Ousmane Sow's work was not presented at Dakar although he himself was there, his tall, striking figure standing out from the crowd. Despite the fact that he lent his support to Dak'Art 96 and that the opening gala was partly dedicated to him with the magnificent film of Beatrice Soule, Ousmane Sow resolutely refused to display his own work. He has no wish to take part in gatherings of 'African artists'. He is an artist and he is African, but he is not an 'African artist'. 'A Japanese artist is a contemporary artist in this universal world', he argues, 'so why should I allow myself to be pigeon-holed in a ghetto ?' No matter how satisfied and pleased champions of contemporary African art may be with the organisation behind the Biennial Festival, they cannot deny that Ousmane Sow has a point. Having said this, there is no contradiction here, but rather a complementary vision. Sow's stance and the idea behind Dak'Art are part of a two-pronged attack, to borrow a military term. The organisers of the Biennial and Sow himself doubtless saw it in this way, and decided to join forces.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Each time Beatrice Soule tackles the work of an artist, she explores it in a very unusual way, reinventing the arts documentary. Her films are reminiscent of the music of Nino Rota in Fe//ini's films, Rota subjugating himself to the service of the director's work, sublimating his own originality through this extreme humility. It is impossible to picture the images of Federico Fellini without Rota's haunting music. Beatrice Soule saw in Sow's work a love affair between an artist and his sculpture, coming up with the idea of placing Sow's sculptures in the savannah and imagining the intimate interaction between Africa's natural world, which is at the heart of the artist's inspiration, and his works, which the natural world is able to absorb back into itself. The result of this juxtaposition is that the physical work of art is eclipsed by sheer creative force and spirit. The genius behind the work becomes the work, merges with it and is reincarnated in it. The one thing that Soule did not film was Ousmane Sow himself, her images concentrating solely on the creative act. It would be illusory to attempt to explain a Beatrice Soule film, especially this film. When she unveils how the artist tames physical matter, reinventing materials in order to create a work of art, technique simply recedes into the background, becoming blurred and intangible. Whereas others would have adopted a scientific or factual approach, her camera perceives the abstract aspects of the piece-and its gestation. The film was due to be broadcast on the international FrancoGerman arts channel Arte. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If Ousmane Sow's sculptures are characterised by their gigantic proportions, then those of Georges Adeagbo, a Beninois artist whose name is also beginning to be heard in the commercial art establishment, are characterised by their 'fugacity'. Adeagbo's artistic constructions are as fleeting as puffs of smoke, like voodoo symbols scratched out in the sand. His art is symbolic and ephemeral. Once one of his works has been exhibited, all that remains of it is a hollow shell which he has to reinvent over and over again. Adeagbo constructs ideas, using a host of assorted materials which he painstakingly selects over months, even years. Yet despite the meticulous care with which they are put together, as far as the artist is concerned, the materials per se are of no importance. He could convey exactly the same idea using other elements. An Adeagbo piece is not merely a pile of objects. It is neither conceptual art, nor scrap art. It consists rather of 'installations' which rise and spread outwards. Sometimes, he uses specially constructed sculptures. At other times he employs everyday objects- shoes, saucepans, stones, spectacles or footballs. He also works with written material; manuscripts, parchment, pieces of newspaper and books, portraying the written word as both a creative force and a deceptive screen. Adeagbo himself is a man of few words. Perpetually crouched on the ground, he constructs, modifies, touches and observes his creations. Why should these constructions remind us so much of paintings? They are as much a pile of objects as a painting is an accumulation of layers of paint. It is by forgetting the paint that we are able to admire the picture and it is by looking beyond the materials used by Adeagbo that his work truly reveals itself. Indeed, it is a sign of his genius as an artist that the materials never intrude upon our contemplation of his work. In Dakar, Adeagbo's work was shown in the AIDS exhibition organised by Revue Noire. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another artist who took part in the AIDS exhibition, and whose art could well be the impetus behind the new universal aesthetic, the avant-garde (if such a concept has a meaning), is Pascale Marthine Tayou from Cameroon. He was given the honour of presenting one of the five solo exhibitions. Tayou was sponsored by Yakuyi Kawagushi, the curator of the Setagaya Museum in Tokyo, who exhibited his work at the forum organised within the overall framework of the exhibition. While the term 'installation' may best describe the works of Georges Adeagbo's, Tayou's work falls unquestionably under the heading of sculpture. This is despite the fact that the two artists use virtually identical materials. Tayou sculpts from wood, covering his pieces with all manner of manufactured and salvaged objects such as shoes, nails, plastic bags and enormous condoms, or with natural objects such as bits of roots and stones. He then paints the arrangement. The work is dense, unyielding and mesmerising, often etching itself into the onlooker's mind. His sculpture lacks heavy ornamentation, yet its starkness has a rich quality, the theme encompassed by a jumble of material standing out clearly, like the outline of a silhouette. Take his work 'Fight against AIDS'. The piece consists of a wooden frame in the shape of figure-of-eight, with each horizontal line doubled, defining a key element in a tragic body with bulging eyes and a Pere Ubu belly. In contrast to this suffocatingly tragic figure, the brightly-coloured shoes of a Harlequin with a faded costume offer a comical note.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were other creators who could well ruffle a few feathers in the art market that ultimately makes or breaks an artist: Tamsir Dia of Cote d'lvoire (whose screaming figures are reminiscent of Munch), Cheikh Niass of Senegal, Mathilde Moro of Cote d'lvoire and Abdoulaye Konate of Mali. The last mentioned was honoured with the highest award of the festival.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A decision was taken that Dak'Art 96 should encompass other areas of creativity, such as music, design and fashion, in addition to the visual arts. At the gala evening held to inaugurate the Festival, there was a fashion show choreographed in the manner of a ballet. The staging of this can only be described as mawkish. The audience were treated neither to a real performance, nor to a good fashion show. The second fashion spot, which was supposed to present an overview of African design, was also quite pitiful. If the event's organisers decide to keep these parallel areas of creativity in the Festival, then their decision will be solely thanks to the success of the International Design Exhibition. Apart from two or three 'exotic' pieces, this was generally of a very high standard.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Community's choice in awarding the prize for creativity to a designer, Vincent Amian Namien from the Cote d'lvoire, was particularly revealing. This artist strips everything down to its bare essentials, creating a line that is so purified as to leave only the quintessence of form. Thus, he creates a chair that is nothing more than a perfect metal triangle, with four boards and four metal wires-and yet offers perfect comfort.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Claire Kane, a fashion designer of Franco-Senegalese descent, had the verve to go it alone and show her collection at the prestigious Salon of Design. Her clothes are characterised by the rejection of all superfluous detail, achieving a fluid line that stylises movement. Following an aesthetic code that has been decanted from the melting pot of the collective costume heritage of the entire continent, Claire Kane is directly involved in the creation of her designs, from the weaving of the cloth to the last finishing touches. In fact, she admits that her true passion is fabric rather than fashion, her favourite material being woven pagne. She often uses silk-screen printing to introduce pattern. She then adds words to the patterns in her designs and, abracadabra, one would think that this is the way it has always been done in Africa. A subtle modernity, combining both past and future, seems to be a recurring motif in African creativity. International artists, still few in number, travel from Dakar to be dressed by her.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If, in the future, the Festival's organisers decide to concentrate solety on the visual arts, this would come as no surprise. On the other hand, it would also make sense to continue to include design and fashion. A country's cultural heritage should be considered one of its raw materials and a source of economic wealth, and unimaginative accountants may have to resign themselves to this fact. Herein lies a possible answer to the question: 'why hold a Biennial Festival of Contemporary African Art?'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hegei Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Acting against AIDS</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY">by Robert Rowe</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many ways of raising money to fight AlDS have been tried, but one of the most unusual must surely be the approach taken by an official of the European Commission. Robert Rowe, who until last year was an assistant editor on The Courier, put on a oneman show in Brussels and then rook it to the other side of the world to raise money for a voluntary organisation working on AIDS prevention and care in Malaysia. Here is his story of fighting the virus with the power of the theatre.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'By the year 2000, South-East Asia will be host to the majority of the world's AIDS cases.' So runs a stark prediction from the World Health Organisation, quoted in a recent paper from a grouping of NGOs affiliated to the Malaysian AIDS Foundation. It goes on to predict that 'the region faces a potential HIV spread of titanic proportions.' In Thailand, a country with a large population and a sad reputation for prostitution, the HIV threat was recognised relatively early and effective public awareness campaigns have successfully reversed the rise in the incidence of infection. But in neighbouring Malaysia, where stricter religious and social attitudes have inhibited wide public discussion of the disease and its methods of transmission, over 13000 people were HIV-positive at the last count-and that is just the figure derived from the small percentage of the population who have been tested. Activists say the true number is certainly higher and it is growing every day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first cases of HIV in Malaysia were found among intravenous drug users and sex workers, and one of the earliest organisations to begin working with people engaged in these high-risk activities was Pink Triangle. This is a voluntary, non-profit-making body which started up in 1987 by setting up AIDS prevention and support programmes for and with the general public and the gay community. Its name, in fact, refers to the pink triangle badge which men sent to concentration camps in Nazi Germany for homosexuality were made to wear. The group has always depended heavily on volunteers to plan and carry out its programmes, which now also involve running a support group for people with HIV or AIDS and a street outreach programme and drop-in centre providing AIDS information, basic medical care, temporary shelter and food for sex workers, injecting drug users and transsexuals. The centre can also provide legal referrals for members of these groups summonsed to appear in court. For the general public, talks, workshops and poster and photo exhibitions are held in schools, hospitals, factories, youth and corporate organisations and other NGOs. Pink Triangle trains its volunteers, too, to provide counselling and information about AIDS and sexuality to anyone who calls up on a confidential telephone line.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The work is serious and vital, but the atmosphere is far from gloomy in Pink Triangle's premises in a lively part of the Malaysian capital, Kuala Lumpur. Though funding comes from several sources at home and abroad, including the European Union, the organisation still has to generate a lot of its own money, and one successful method they have used is to put on imaginative events where fund-raising can be combined with an opportunity to raise public awareness. Last December, for example, they marked the week surrounding World AIDS Day with a string of shows, dance parties, talk-ins and street activities called Pinkfest '95. In venues all over the town, and on television and radio, well-known personalities joined a hundred of Pink Triangle's own speakers and performers to provide education without moralising. The aim was to personalise the issue of AIDS by showing how anyone could be at risk, but at the same time dealing in facts, not fear. Thousands of attractively designed and very frank leaflets and posters put across the virus-busting message in catchy graphics and pithy phrases in several languages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I happened to be in Kuala Lumpur around New Year and saw a video of some of the Pinkfest highlights which set me thinking how admirable an impression of solidarity and self-help the anti-AIDS struggle in Malaysia conveys, and to wondering whether, back in Brussels, it might not be possible for us in Europe to do something to help. It particularly impressed and touched me that while Pink Triangle delivers its message to every single member of Malaysian society, it makes quite clear, even by its name, that it has a special care for some of that society's most downtrodden members, people for whom no one else had ever ventured to speak. Public silence, opprobrium and ridicule make it especially hard to get the safe-sex message through to gay men, especially the young, to transsexuals and sex workers, and as long as there is no cure the only way of containing the spread of infection is by education- and by changing social attitudes. The many women whose husbands or partners are careless about infection also stand to benefit from greater openness and more factual information. But organising all this takes money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It happens that among the multinational English-speaking expatriate community in Brussels there is a thriving amateur theatre scene-in fact they say that if two British people found themselves on an otherwise deserted island, one would immediately put on a play for the other, and the same seems to hold true of the Irish and the North Americans. However, it was less certain that anyone apart from me would want to exert themselves, for the many weeks required to stage a production, on behalf of an AIDS charity in a remote Asian country, so l decided to go ahead by myself and perform a one-man comedy. The play was Brief Lives; it has nothing whatever to do with AIDS, but in its day it was a huge success in London and New York. Adapted in the 1960s by the British actor Patrick Garland from the dusty old memoirs of a real historical figure, John Aubrey, it depicts a day in the life of this 1 7th-century English scientist, historian and wit. As he potters about, an extremely old man, in a garret full of manuscripts and curios, he reminisces about his contemporaries in hilarious and touching vignettes, the potted biographies which give the play its name. Aubrey died in penury, but the picture he gives of a vanished age is now reckoned to be the equal of the record we find in the diary of the better-known Samuel Pepys.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is also a great deal funnier, and when I showed the script to various friends I was astounded and moved to discover how many of them wanted to be involved in the project. Eventually we put together a team headed by the director, Anne Wilkinson, a music impresario married to a coal expert from the European Commission, with production, design, stage management, lighting, sound effects, costume, music and offstage voices-not to mention publicity and box office-provided by other friends from the European institutions or the private sector. The five performances were given in June in a small theatre just adapted from a pottery workshop, and altogether the Brussels showing made a profit of some 110 000 Belgian francs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We had expected just to send this donation to Pink Triangle through the post, but to our immense pleasure they said they would like to see not just the money but, if possible, the play too. By ingenious compression the designer, Burt Baum, managed to cut the essentials of the set down to three sheets painted to give a three-dimensional effect, we put the voices and music on cassette, rolled up the costume tightly and worked out that the whole play, thus reduced, could be got into one suitcase. There is a little theatre company in the Pacific ACP state of Vanuatu called Wan Smol (One Small) Bag which actually gave me this idea. So off I went to Kuala Lumpur with this bag, and did the play another five times there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The staging in Malaysia was done by an adventurous outfit called Instant Cafe Theatre. This young company has a reputation for pushing forward the boundaries of public discussion with topical plays and supports Pink Triangle's aims and work. Brief Lives was well outside their usual repertoire, as well as being spoken in the English of 300 years ago. My worry was that bringing such a Western and Eurocentric entertainment might be resented as cultural imperialism in a country with three great and fascinating cultures of its own, Malay, Chinese and Indian, each with its own style of drama. But it turned out there was a local tradition of amateur dramatics in English, particularly Shakespeare, and that English is the usual lingua franca for speakers of different Asian languages. What went down unexpectedly well was the depiction of an old man nearing death and reviewing the best moments of his life; as the character puts it in the play, 'When a boy, I did always love to converse with old men, as living histories,' and Maiaysians have a particular regard and affection for the elderly. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I came away from Kuala Lumpur with many charming memories: the unfailing, sweet-natured enthusiasm of the audience; the relief on the first night as I stood on stage in a floor-length costume of three layers, designed to suggest London in midwinter rather than to cope with the equatorial heat of the Malay peninsula, and realised that the stage was air conditioned. The night when this air conditioning blew out a vital candle on the stage, and a man in the front row lent me his highly un-17th-century lighter to get my clay pipe going. The Chinese friend who gave me a genuine antique opium pipe to add to John Aubrey's collection of exotic curios. The delicious succession of Asian chicken dishes which the stage manager produced for me to eat on stage, cooked in very un-English coconut milk or glazed with rice wine. The work permit which specified I could perform as an artiste but must not 'sit out' or dance with the audience! The theatre's resident singer asking if she could add the play's Elizabethan theme song, with lute accompaniment, to her repertoire.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taking this play to another continent was a fascinating cultural experience for me as a European, and I hope for the audiences too it was something more than just a painless way of being relieved of money in a deserving cause. At any rate the theatre asked if they could have another play soon, one in which Malaysian actors could be incorporated as well. As for Pink Triangle, some of its leading lights were packing their bags to go to Vancouver for this year's International AIDS Conference, but before they left it was a pleasure to hand over the proceeds of the whole venture and to hear that the organisation will use the money to develop a drop-in centre for people approaching them in person for the first time. Some first-timers are understandably timid about coming to the unfamiliar (and clearly signposted) premises for help or information, and a private space where they can talk in confidence is something Pink Triangle has always wanted to provide but could never find the funds for, as the project or programme money they get from their regular donors is invariably tied to what outsiders might think were more urgent priorities. It is not only the headline grabbing schemes which have useful effects: a quietly welcoming space where someone can be himself or herself may do more to dispel an individual's fear and ignorance than publicly visible campaigning, especially where religious and social pressures against certain types of nonconformity are strong. In fighting HIV/AIDS, we must try whatever works. And empowerment must begin with the self. It was a great privilege to be welcomed in like any other volunteer wanting to help bring about a necessary change. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">R.R. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">CTA-Bulletin</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Earthen architecture</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Materials, techniques and knowledge at the service of new architectural applications</P>
+<P ALIGN="JUSTIFY">by Hugo Houben and Hubert Guilland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A major building material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The importance - both in quantity and quality- of unbaked earth constructions in the world is very little known. Believed to be of ancient origin, (it is associated with the early civilisations of the Nile, Tigris and Euphrates, Indus and Huang He), nowadays, earth is not usually regarded as a major building material. This is despite the fact that it continues to leave an undeniable and distinctive imprint on the architectural landscapes, both rural and urban, of many countries. Unbaked earth is still, in fact, a major building material, being used extensively by people to erect homes and other buildings. Although sites of human occupation have seen constant regeneration with the passage of time, unbaked earth construction has persisted. Excavated from the soil itself, and moulded by the hand of man (or trampled by beasts of burden), the result is a building material which is used in all forms of construction-from simple huts and modest homes, to farm buildings, large houses, urban blocks, religious edifices, castles and palaces. The skills employed are based on knowledge acquired and refined over a long period of time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A contemporary building material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the use of earth in so called 'advanced' countries has declined in the 40 years since the end of the Second World War, in the developing countries it has continued unabated. In the former, the industrialisation of construction and other sweeping changes have rendered obsolete ancient techniques based on the use of local skills and materials, and on mutual help within communities. In the latter, various factors have dictated the continuing use of locally available solutions, materials and knowledge. These include shortages of processed materials (which are costly in both foreign currency and imported energy terms), the widening of the development 'gap', the accumulation of debt contracted within the international monetary system and the survival of local life-styles in which people are accustomed to coming to get her for mutual help for survival. In these countries, which have no industrial means, and which are to be found in various latitudes across the world, earth remains the main-if not the only- building material. Do these circumstances mean that it is a poor material, fashioned using outmoded techniques and unsuitable for promoting the development which is so necessary? The answer to this question is a clear 'no'. On the contrary, the materials and techniques involved are generally of a high standard. They can ensure true architectural quality, allowing communities to continue creating their private or public living environments, and to integrate their buildings into a coherent framework of self-generated development which makes the most of the resources available, both human and material. In fact, scientific and architectural research into earth as a building material, and on related building techniques, has made considerable progress in recent decades. Combined with investments made by industrialists and construction companies, the result is that we now have a wide range of properly mastered production procedures and technical solutions available. These offer great flexibility in meeting a wide range of possible applications.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Making a mark on world architecture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recent global surveys, although partial (covering about 30% of the world's housing), have given us an indication of how extensively earth is used in construction. In developing countries alone, 50% of the rural population and 20% of those living in urban areas are believed to be concerned. The figures, which are drawn from the combined data of statistical surveys in various areas, and from bibliographical information, almost certainly underestimate the true position. They show, for example, that 60% of the housing in Peru is in moulded bricks or rammed earth. 83% of the houses in Kigali, the capital of Rwanda, are made of earth. More than 70%of India's housing stock is constructed out of moulded earth bricks or using successive layers of earth, and these buildings provide shelter for nearly six hundred million people. In France, many rural dwellings are built from unbaked earth and one finds, for instance, that in the Dauphine region, up to 90% of the buildings in certain villages are made out of rammed 'pise' earth. Finally, in California, there were estimated to be almost 200 000 'adobe' (sun-dried earth brick) dwellings by 1980 and the use of this material was growing at the rate of 30% a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Closer examination reveals that the whole world bears the indelible stamp of earthen architecture. Earth is used in Africa-in humble shelters built on leased land and in the great granaries of the continent. It is found in the palaces of the Hausa emirs of Nigeria, the ksours and kasbahs of Morocco and the mosques of Mali. In the Middle East, you come auoss it in the tightly-packed neighbourhoods of Ispahan and Iran, the fortified dwellings of Najran in Saudi Arabia, the multi-storey earth blocks of Shibam and the valley of the Hadramaut in Yemen. In Europe, there are the mouded brick farms of Aquitaine and the baroque and neo-classical castles of the Saone valley. And bringing in other parts of the world, we might mention the pueblos of the New Mexico Indians, and the houses built by the Hakkas in the Chinese province of Fujian, laid out in their characteristic concentric circles. The use of unbaked earth in building may be seen as a vestige of past history, but it is actually a living framework for history in the making.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Realistic uses for the future</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Confronted with the energy crisis of the 1970s, oil-dependent industrialised countries were forced to look again at tried and tested technical solutions which were now proving to be too 'energy-greedy'. The building sector did not escape this reappraisal and the search began for ways of reducing energy consumption both at source (covering the production and use of building materials) and further down the production chain (maintenance). Research on biomass and solar energy ran in parallel with experiments to update traditional materials and to attempt to rationalise the production process. Earth again became a focus of interest, with government institutions supporting a considerable amount of new research and experimentation. This covered applications in both the industrialised world and in developing countries, research for the latter being undertaken in the context of bilateral or multilateral cooperation. With the threat to the ecological balance posed by pollution, degradation and the plundering of natural areas, this interest in developing materials and techniques that are inherently friendly to the environment has not lessened. In many places, people are becoming increasingly involved in controlling and managing their living environment. The field has been opened up by qualitative research, a new awareness of the available options and an increase in leisure time. With techniques now at hand that are easy to use and economical, a greater measure of (partial or complete) selfhelp building is now possible. The USA, Australia and Germany all encourage new forms of intervention in building which give greater responsibility to the occupier in the creation of his living environment. Viewed from this perspective, earth as a building material has definite advantages and plays an important role.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In developing countries, burdened by debt and confronted by an urgent need to build on a scale unprecedented in history, imported materials, techniques and energy are largely inaccessible to the majority of people, and their use may contribute to promoting 'bad' development. Building with earth emerges as an efficient shortterm way of producing houses or public buildings such as schools, which are both economical and of high quality (being culturally and climatically suitable). Decision-makers in these countries are well aware of this and have mobilised 'upstream' feasibility studies in their education and public housing programmes. The research covers local resources and knowledge, and the use of labour intensive techniques that generate employment and enable the population gradually to become 'monetarised'. The days of costly experimentation, often with no practical result, are now over. A new confidence in the resources that are available must be encouraged. There needs to be an increase in building completions and those who built them need more training. Today, this is happening in Mexico (850 earthen houses recently built in the state of Zacatecas) and in Burkina Faso (6000 school classrooms constructed by 1995.) No fewer than forty million homes will have to be built between now and the year 2000 for the urban population of Africa alone.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Studies show that for most of the people involved, there is no choice but to employ local materials, most often earth. One can thus predict that at least 20% of urban and pert-urban housing in African countries (about eight million units), will be built in earth over the next ten years, at a rate of eight hundred thousand units per year. If demand from rural areas is added to this, one gets some idea of the scale of the task facing decision-makers and builders. The use of earth and other locally available materials is unavoidable, and should be encouraged.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Environmental advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is particularly important to enumerate the many advantages of building in unbaked earth from the point of view of the environment. This issue, one of the contemporary problems facing society, is increasingly moving centre-stage, and in the future, it is sure to play a greater part in political, economic, social and cultural strategies linked to the planning and improvement of the quality of life. Here we refer to the concept of the environment in the widest sense of the word, ecological, economic, technical, health-wise and psychological, cultural and human.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the point of view of the ecological environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In terms of pollution and degradation, unbaked earth offers a highly positive picture:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It does not contribute to the deforestation which results, for example, from the use of organic resources for firing baked earth materials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It does not consume any nonrenewable energy (oil, gas, etc.) at source for the processing and production of materials, or further down the production line in their application. This is in sharp contrast to the production of cement, lime and other conventional binding materials, and steel.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- By exploiting strata on construction sites, it allows a considerable saving in energy for the transport of materials.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It does not contribute to a degradation of the landscape as does the extraction of minerals and ores which hollows out hillsides and creates open cast sites. A great deal of the earth excavated in the course of large public works (notably roads and motorways) can be recycled and used in building (allowing very easy decentralised distribution).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It does not contribute to the diminution of resources of aggregates such as gravel and sand, excavated either from quarries or from water courses, in insular sites or lagoons. The latter can endanger the ecological balance of these natural environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It uses very little water which is essential for the life of the people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It produces no industrial or chemical waste and has the additional advantage of being almost entirely recyclable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the point of view of the economic environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It is often comparable in cost with, or indeed more economic than competing technologies and requires no major financial mobilisation for its generally light production infrastructure. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It guarantees rapid amortisement thresholds for bankable investments thanks to its low infrastructure requirements for usable production.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It contribution to local flexibility, being readily susceptible to a decentralised approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Throughout the production process, it creates employment and monetary added-value which can be injected for development purposes into other sectors of the economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- By allowing savings in energy and foreign currency, it contributes at the macro and micro economic levels of the building sector, to a considerable reduction in developing countries' debt and to the balance of payments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the point of view of the technical environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It has thermophysical and hydric properties (good conductivity, energy retention capacity, thermal differential, delayed temperature differences etc.) which help ensure comfortable temperatures:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It normally only requires simple production and application tools (moulds, presses, light shuttering, normal masonry tools, etc.) which are widely accessible to masons and self-help builders.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the point of view of health and the psychological environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Not only non-polluting in its use, it also guarantees the absence of harmful effects in the context of daily life (no gaseous emissions or other toxic chemical components, radioactive emissions etc.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It contributes to psychological wellbeing by the architectural exploitation of its inherent characteristics; these include the surface texture, colour, form and luminosity of the material. It thus makes an active contribution to the beauty of the living environment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From the point of view of the cultural and human environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-It maintains the traditional architecture heritage of the area in question through the use of local materials and thus plays a part in the respect for, as well as the survival and updating of, cultural, architectural and urban environments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- It allows local populations to take charge of the production of their built environment and thus contributes to the expression of the democratic rights of all to control their living environment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The future of earth on the move</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In her work entitled 'A Fate Worse than Debt' (Penguin Books, 1988), the famous political commentator, Susan George, analysed the debt situation of developing countries and attempted to determine the basis for a positive resolution of the problem. Her approach focused in particular on solutions involving repayment in creative values or 'in kind' rather than in strictly monetary means. At the end of her analysis, she put forward eleven potential solutions to allow this repayment in kind and to launch a coherent approach for the development of less advanced societies. One of these recommendations was that it would be necessary to develop 'the study and survey (and if necessary the improvement) of local building techniques, in particular earth architecture ('pise' or 'banco').' Ms George argued that new buildings, particularly public ones, should be constructed using these techniques.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is clear that various solutions are being considered for the future: one in which building with earth, using a wide range of local techniques, will have a new technological, social, cultural, ecological, economic and political role of paramount importance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Various methods of utilisation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The technical, constructional and architectural possibilities of earth are very extensive. The study of popular traditions and of traditional knowledge throughout the world has enabled some 18 different methods of utilisation of the material to be identified, each in itself capable of being applied in a wide variety of ways. This wide construction potential has enabled the building of modest shelters, village houses, urban blocks, religious edifices and palaces. This is not to say that other traditional materials do not have an important role, but the sheer diversity and flexibility of earthen architecture probably cannot be equalled.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As was indicated earlier, the use of earth as a building material has given rise to numerous applications using a wide variety of production and construction techniques. Some of these techniques are still used in traditional construction many countries, some have been abandoned, while others have only recently been the subject of developmental experimentation. It is worth noting that there is a register of the principal techniques, mainly associated with processes using moulds, shuttering and direct shaping. The six most widely used techniques are: 'adobe', 'rammed earth', 'straw clay', 'wattle and daub', 'cob' and 'compressed blocks'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of these six, three (wattle and daub, straw clay, and cob), are highly traditional, while the others (adobe, rammed earth and compressed earth blocks) have recently been the subject of spectacular evolution linked to the modernisation of production machinery and methods of application. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p094.png"></center><br>
+ The use of earth</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The couriers mailbag</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Plea for African solidarity</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thank you sincerely for your report on the second plenary of the Global Coalition for Africa which appeared in the March-April 1996 edition. As a 'displaced' Liberian, I would like to comment on some of the issues reported in the article.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">First, I hope that Africans recognise and appreciate all that former President Jimmy Carter has done and continues to do for our beloved continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Second, I support the view of Ms Johnson-Sirleaf and President Afwerki of Eritrea that we, as Africans, must invest in ourselves and in productive endeavours in our own countries. However, given the number of civil wars, that have resulted in displacement of our peoples and migration of the labour force, it is imperative that we also begin to think of and recognise each other as Africans first - and only then as members of whatever ethnic group we belong to. As a Liberian with professional qualifications who relocated to Ghana in 1992, I met with opposition and resentment because of my nationality and sex. I subsequently went to the Caribbean where my acceptance as an African was easier.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When there is a population movement, the psychological impact associated with feelings of rejection and intimidation is severe. Sub-Saharan Africa will never develop or reach its fullest potential until we begin to think and act as a united, yet diverse group of people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I agree that it is important to develop our homelands first, but in the case of Liberia, Burundi or Rwanda, where no one seems to understand the concept of peace or the idea of having a future, it is crucial that the displaced be respected and accepted as fellow Africans. It would be even better if we were afforded the opportunity to integrate and assimilate into society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ciata A. Bishop, Grand Cayman.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What about Guinea-Bissau ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I am a student from Guinea-Bissau reading international law and political science at the Social Science University in Toulouse. I have also been a faithful Courier reader for more than seven years. In the March-April issue of 1996, you published an article on fisheries by Anthony Acheampong entitled 'A vital food source in West Africa'. You gave the figures for fish production in 16 West African countries-but did not mention my native country! I should point out that Guinea-Bissau consumes and exports a great deal of fish, and the product is an important source of foreign exchange to the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">F.J. Alves d'Almada, Toulouse, France.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Media and democracy in Southern Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I refer to the article with the above title by Francis Caas which appeared in issue no. 154 of The Courier (November-December). I enjoyed reading the text which examined the emergence of a free press due to the advent of political liberalisation in the Southern African region. However, I wish to make a correction as to what I think is a misrepresentation of fact. The author said, and I quote: 'The installation of a democratic regime in 1994 (in Malawi) enabled the MBC to begin broadcasting in all languages spoken in the country'. This is not actually correct although the Malawi Broadcasting Corporation, apart from broadcasting in English and Chechewa, has since introduced Tumbuka on the radio. I felt it was important to put the record straight on this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Disher G.DJ. Pindani Lecturer in Public Administration, Chancellor College, Zomba, Malawi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Corrigenda </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In issue no 157, a number of 'author' footnotes were inadvertently omitted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pascal Dotchevi, author of 'Togo: the victory of the taxi. bikes' (p.11) is a journalist on Kpakpa Desenchante, a satirical weekly published in Lom&eacute; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Piritta Sorsa, author of 'Banking and securities' (p.13) works at the IMF office in Geneva.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yves Delafon, author of 'Developing consultancy work in the ACP countries' (p.15) is the director of a consultancy and President of the Federation of External Trade Associations in Provence/ Cote d'Azur.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">N'Gone Fall, author of 'Fashion; Out of Africa.. the breath of inspiration' (p.53) is a journalist.</P>
+<P ALIGN="JUSTIFY">Also in issue 157, some errors appeared in the article entitled 'Sparks fly in Namibia'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the introductory section it was stated that secret harlots were held on resolutions relating to Nigeria, Niger and Sudan. This should have read Nigeria, Niger and Equatorial Guinea; a resolution on Sudan was passed by normal, open vote procedure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under the heading 'The future of Lom&eacute;' the ACP Generai Rapporteur vvas refered to as Mr Firmin, which is the forename. The General Rapporteur's surname is Mr Jean-Louis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the fifth paragraph under the same heading, there was a reference to Helena Torres Couto. This should have read Mr Jose Manuel Torres Couto. </P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Bibliography</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">L'Afrique est-elle protectionniste- Les chemins buissonniers de la liberation exterieure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Is Africa protectionist ? Greater economic freedom via the maze)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Beatrice Hibou. Karthala Publications (22-24, boulevard Arago, F-75013 Paris). 1996. 334 pp. ISBN 286537-633-8.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This volume offers a clearsighted analysis of the foreign trade policies of African states, fraud, smuggling and the way in which the franc zone operates, giving a definitive, reformulated account of structural adjustment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In her approach, the author is critical of both the liberal political economy and the new trends (the 'new political economy' end the neoinstitutionalist trends) which perpetuate the division between the economy and society. She refers to K Polanyi for whom Man's social relationships include economics and in whose opinion the economic system is managed as a function of non-economic motives.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">From this starting point, Beatrice Hibou demonstrates the part played by the unexpected and the unintentional in economic policies as they currently exist, revealing that coherence in foreign-trade policies on the part of African countries is not an economic priority but a socio-political one. In this connection, she shows that structural adjustment programmes have been unsuccessful in making any real impact on protectionist practices, at least in terms of their political and historical bases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After an overview of (legal or illegal) foreign-trade practices in contemporary Africa, protectionism is clearly alive and well, although much less widely applied and effective than about a decade ago. The reduction in the State's legal powers has meant increased freedom for 'informal networks', various types of dispensation, and an increase in fraud and smuggling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the basis of Jean-Francois Bayart's opinion, dating from 1989, the author suggests that the explanation is to be found in the specific nature of Africa's economic history, which is one of independent means, a lack of production and management of dependency without the way in which it operates being affected. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dominique David</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Reality of Aid</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Independent review of international aid. Pub.: J. Randel and T. German. Earthscan Publications Ltd. (120, Pentonville Road, UK London N1 9JN). 1996. 244 pp. ISBN 1 85383 292 8.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Reality of Aid (now an annual publication) compiled by two NGOs; Eurostep and ICVA, aims to highlight the extent to which donor aid helps developing nations, looking beyond the official publications of governments, banks and inter-governmental bodies. It contains a useful critique of the European Union's various aid policies and the respective bilateral policies of each of its 15 member states, as well as those of other Western nations like Australia, New Zealand, Switzerland and the United States. This year's review highlights, in particular, the need to mount more projects to alleviate poverty, despite aid commitments becoming more scarce.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It says, for example, 'Too much aid is being squandered by governments on projects which have more to do with commercial and political advantage than poverty eradication. Rigorous evaluation needs to identify those programmes which can make an impact -and aid must increasingly be directed only to these areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">International aid to developing nations has fallen off over the years. In 1994, members of the OECD's Development Assistance Committee-21 of the world's richest countries-allowed their aid to fall to just 0.3 % of GNP, the lowest level for more than 20 years. The review stresses the need for donors to address in particular; policy coherence (environment, agriculture and consumption policies are all linked to poverty), the effectiveness of aid, the failure thus far to invest in people and the fact that the amount of assistance going to health and education is stagnating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The review also features analytical case studies of various donor activities in selected developing nations (India, Fiji, Cambodia, Peru, Zimbabwe) and looks at Western assistance to post communist countries in transition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A chapter on the European Union's current development policies, edited by Mirjam van Reisen, a Brussels-based Eurostep researcher, criticises the lack of coherence of EU aid with its Member States bilateral programmes-an issue which is likely to come more to the fore as other European nations join the Union in the next millennium. Ms van Reisen also claims that there are too few staff running the EU's development policies and suggests, in particular, that there is a lack of expertise in the social and poverty areas. She stresses the importance for the EU's political leaders of giving more political clout to the EU's development policies at the Intergovernmental Conference (IGC), which is currently engaged in revising the EU's treaties. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Debra Percival</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">News round-up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">In brief</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trafficking of women</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">European Commissioner for immigration policy and legal affairs, Anita Gradin, will set to work with fellow Commissioners over the coming months to draw up a European Union action programme to clamp down on the trafficking of women which she describes as, 'the modern slave trade'. This comes hot on the heels of the Vienna European conference on trafficking of women, held on June 10 and 11, which was co-hosted by the European Commission, the Austrian government and the International Organisation for Migration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ms Gradin told journalists on June 12: 'I will put forward to the Council and the European Parliament a communication on the trafficking in women for sexual exploitation. This will cover migration policy, police and judicial cooperation, and social aspects to support and protect the victims. It will also consider European relations with the source countries, where the women are recruited.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Vienna conference highlighted the need for cooperation between Member States and third countrie from which women are lured into prostitution in Western Europe. Recommendations, which are expected to be part of the EU policy, include setting up central national units in each Member State to exchange information.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commissioner told the participants in Vienna: 'The slave trade in women is growing, a slave-trade that aims at sexual exploitation. No part of the world seems to be free from this degrading treatment of women. Women are bought and sold like cattle or commodities. They are deprived of their rights and their dignity. And the direction of the trade is the same all over-it is women from poor conditions that are forced into a deplorable life by men in richer countries.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">She cited a typical case of one woman from the Dominican Republic from the book 'Stolen Lives' by Sietske Altinks: 'One day I went to visit a friend who was going to discuss job opportunities in Europe. I went with her and met a schoolteacher who knew somebody called Juan who could get me a job in the Netherlands. When I went to see him, his associates told me that I would easily find employment in a beauty parlour.' She ended up in prostitution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ms Gradin continued: 'The consequences for the women are dreadful. Often, they find themselves deprived of their freedom to move and decide for themselves; they are often locked up and subjected to violence and sexual exploitation. And should they be able to free themselves, they are regarded as illegal residents and expelled.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Debra Percival</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Aid for development in the field of communication</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A seminar was held under the auspices of the United Nations in the Belgian Parliament on 6 and 7 June, on 'the future of international development cooperation: new challenges for communication'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union was represented at the event, among others, by Colette Flesch and Steffen Smidt, the directors general respectively of DG X and DG VlII of the Commission. Mrs Flesch gave a presentation at the opening session in which she highlighted the various communication approaches adopted by the European Community in its efforts to counter what appears to be a growing lack of interest in development aid on the continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Smidt, who spoke in the second session of the seminar, began his presentation with an anecdote, citing a text displayed at the entrance to a Federal building in Washington. This states: 'Taxes are what we pay to have a civilised society'. Paraphrasing this sentiment, the Director-General argued that, 'development assistance is what we pay to have a civilised European Union.' The question, he went on to pose, was whether we were paying enough ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A number of the participants painted a discouraging picture of the situation facing the world's poorest countries in a world of advanced communications and increasing globalisation. Almost all were pessimistic about the impact of the socalled 'information super highways' on the least-developed nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the most striking interventions came from Mabbub Ul Haq, the former Finance Minister of Pakistan, who spoke just after Mr Smidt in the plenary meeting, as well as at one of the discussion workshops. Mr Ul Haq urged the creation of a UN Economic Security Council, arguing that the main risk of global conflagration lies in the disparity that exists between rich and poor, now that the dangers associated with the Cold War have receded. One of the most acute issues under discussion was the growing challenge to the received wisdom that technical assistance is essential for consolidating national capacities. The evidence of 40 years of technical assistance would suggest otherwise (with 95% of funds set aside for this purpose going to foreign experts). Indeed, it was argued that those countries receiving most technical assistance per capita, had 'benefited' least from the system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In his second contribution, Mr Ul Haq painted a somewhat more encouraging picture, pointing out that the shaky 0.3% share of GNP allocated to development aid by the industrialised countries had achieved miracles in terms of increased life expectancy (up by 17 years) and the doubling of school enrolments in the countries of the South.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hegel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Round one of the South Africa-EU talks</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Africa gave no immediate response to the European Union's proposals for a bilateral trade agreement at the first round of high level negotiations in Brussels on June 20. The talks were headed by Dr L. T Links who is South Africa's new Ambassador in Brussels and for the KU, by the Director General for Development, Steffen Smidt. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most difficult subject to negotiate will be future terms of access for South Africa's farm produce. The European mandate, which was agreed by EU Member States on March 25, foresees the exclusion of 39% of South Africa's farm produce currently sold to the EU from the planned free trade area. Applying World Trade Organisation (WTO) rules, the EU wants a scaled dismantling of barriers to trade in both farm and manufactured goods over a 10-year period, with a maximum of 12 years for a few highly sensitive items. But the EU has agreed to 'asymmetry' whereby, in some areas, it will open up its market to South Africa at a faster pace than vice versa. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Abdul Minty, deputy Director General at the Foreign Affairs Department in Pretoria, who is one of ,the chief negotiators, explained that South Africa had not yet responded to the terms because it is still consulting internally with the National Economic Development and Labour Council and with its partners of the Southern African Customs Union (Botswana, Swaziland, Namibia and Lesotho). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During a recent visit to Brussels, South Africa's former agriculture minister, Dr Kraai van Niekerk and his deputy, Mrs Thoko Didiza, told reporters that as it stood, the EU's mandate was 'anti-developmental'. Dr van Niekerk said he would like to see citrus fruit, in particular, removed from the list of exclusions. He also sought to dispel the fears of some EU Member States who wish to omit a larger proportion of South Africa's farm produce from the FTA, for fear of competition with equivalent EU produce.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr van Niekerk stressed the 'complementary' nature of South Africa's farm production. He pointed out that his country's growing season was at the opposite time of year to that of the EU and noted that South Africa's output of farm produce could only increase by about 2%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EU spokesman, Joao Vale de Almeida, said that progress had been made during the Brussels talks on aspects of South Africa's 'tome protocol'. This is aimed at giving South Africa certain benefits from the Lom&eacute; Convention- some eligibility for South African companies to tender for Lom&eacute; contracts and the partial extension of the Lom&eacute; rules of origin to South African exports. It was originally planned that the Lom&eacute; protocol should be implemented at the same time as a bilateral trade accord, (on January 1 1997). Mr Vale de Almeida spelt out that although it would not be technically and legally impossible for the Lom&eacute; protocol to come on stream without the bilateral pact, it would be more practical if the two could be implemented at the same time. A second round of talks is expected to take place in the autumn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Echo Media Awards</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On 29 June, the European Community Humanitarian Office (ECHO) launched a Television and Radio awards scheme to reward high-quality coverage of humanitarian affairs. Prizes will go to programmes produced or co-produced by independent production companies and/or broadcasting stations in the 15 EU countries which have been transmitted in a Member State on terrestrial or satellite television or radio between January 1 1995 and September 1 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Judging by a panel made up of NGOs, environmentalists, politicians and the media will be in six categories:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People on the move-a television documentary on the humanitarian consequences of sudden or forced population movements; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the minds of the people-a TV documentary on the psychological trauma in crisis situations; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Forgotten conflicts-TV coverage of a long-running crisis forgotten by the mainstream; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vulnerable groups-TV coverage of the hazards encountered by women, children and the elderly in rebuilding their lives; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Broadcast commitment-to a radio or TV station for consistent, high-quality coverage of humanitarian issues; </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Radio award-for the most incisive and analytical coverage of an emergency or humanitarian crisis. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Announcing the scheme, EC Commissioner, Emma Bonino, said: 'These awards give us an opportunity to acknowledge the vital role that broadcasters play in raising awareness of the issues at stake in imaginative, accurate and moving ways. They also serve to remind us of some of the basic European values such as solidarity and humanitarianism that have sometimes been eclipsed by barrages of headlines about mad cows and fish wars.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Entries for this inaugural year must be submitted by September 19, 1996. Details can be obtained from: Mandy Duncan-Smith, Media Natura (UK), tel: (44 171) 240 4936 fax: (44171) 240 2291 E-mail: medianatura@gn.apc.org</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Posters featuring contemporary Bantu art</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the framework of its cooperation programme with the Commission, CICIBA (Centre international des civilisations bantu-B.P. 770-Libreville- Gabon) has recently launched a series of large format reproductions featuring contemporary Bantu art. Thirteen works have been chosen, displaying a representative selection of art forms-painting, sculpture, engraving and moulded leather. The posters, more than 5000 of which have been printed in quadrichromic colour, have a 40 x 60 format. They are also available as postcards.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The artists featured are Marcela Costa (Angola), Assouambo (Cameroon), Daikou (Central African Republic), Mouanga Nkodia (Congo), Abdou Moeou (Comoros), Pambou Boulaz (Gabon), Jose Menan (Equatorial Guinea), Protais Hakizimfura (Rwanda), Protasio Pina (Sao Tome &amp; Principe), Silu Kinanga and Munyenz Tshibangu (Zaire) and Mulenga Chafilwa (Zambia).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CICIBA has also put together a similar series on ancient Bantu art. The fourth bi-annual exhibition of contemporary Bantu art, which has received some support from the European Commission, was due to be staged in Luanda (Angola) during July and August.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Links between technology and society</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For more than 50 years, technological innovation has been regarded by many writers in the field as the motor of economic development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, with rapid developments in the media sector and the emergence of 'information super-highways', the whole world is talking about the emergence of a new society dominated by 'smart' technology linked with research and creativity. This trend gives rise to many questions. Will the information be made available to all, and if so, when ? Will it lead to a change in North-South relations? Can we imagine what a world of 'tale-working', 'tale-education' and video on demand will be like ? What will the cost of all this be? Will biotechnology rescue the world or be the cause of its downfall ? What will the consequences be for the environment ? And in a globalised world, what standards and norms will be used ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In short, what is the real nature of the relationship between technology and society; between science and humankind ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fifteen universities of the EEA (European Economic Area) from Oslo to the Basque country and from London to Athens (taking in Roskilde, Maastricht, Louvainla-Neuve, Namur, Strasbourg, Lausanne, Sienna, Bari, Madrid, Valencia and Lisbon), have come together to offer a multidisciplinary course focusing on these key questions. During the first term, classes in theory and seminars are offered (in the local language of the institution) by experts from the academic world and the public and private sectors. Visits are also planned to multinational companies and laboratories. For the second half of the course, the students gain a wider European dimension by 'changing' university (with grants from the Socrates programme). The bulk of their time at this stage will be spent preparing a research dissertation in English on a topic which fits in with the specialisation of the host institution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For further information on the ESST</P>
+<P ALIGN="JUSTIFY">programme, contact:</P>
+<P ALIGN="JUSTIFY">Prof. E Lints (UCL-Belgium)</P>
+<P ALIGN="JUSTIFY">Tel. (32) 01047.82.60</P>
+<P ALIGN="JUSTIFY">Prof. T. Nguyen (FUNDP-Belgium)</P>
+<P ALIGN="JUSTIFY">Tel. (32) 081-72.49.09</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The institutions at work</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Common foreign and security policy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Within the framework of its Common Foreign and Security Policy (CFSP), the European Union has recently issued a number of statements, details of which are set out below:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Antipersonnel mines</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 13 May 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the closure of the Review Conference of the States Parties to the Convention on Certain Conventional Weapons, the European Union recalls that it has, in recent years, redoubled its efforts to combat the severe consequences caused to civilians by the indiscriminate use of land mines, in particular anti-personnel mines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The KU, which adopted joint action in May 1995 in order to reconfirm its commitment to the objective of an overall strengthening of Protocol 11 of the CCW, considers that the achievements of the Review Conference (such as the extension of the scope of Protocol II; the strengthening of restrictions on the use of mines; the new and immediate prohibitions regarding transfers; the provisions on technological cooperation and assistance; the regular review mechanism, etc), taken together, are significant steps forward, both in terms of the land mines protocol itself and of the development of international humanitarian law.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The KU, however, underlines that the resuits of the Review Conference fall short of its expectations and of some of the goals set out in its joint action. In particular, the EU should have liked an effective and binding verification mechanism and no periods of deferral of compliance, or at least much shorter ones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU is convinced that the conclusion of this Review Conference is only the beginning of a challenging process which requires constant and widespread efforts and persistence in order to fully achieve its basic humanitarian objectives. The EU will continue to seek solutions to the problems caused by antipersonnel land mines and will strive towards the goal of their eventual elimination as stated in UN Resolution 50/70 (O). In the meantime, the Member States of the EU will seek early ratification of the amended Protocol II, as well as of the new Protocol IV on blinding laser weapons, and will take urgent steps to ensure their compliance with all the provisions of these two protocols pending their entry into force.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU will also continue to make active efforts with a view to achieving universal adherence to the CCW, since its objectives can only be effectively attained through implementation of its provisions by the widest number of states and parties to conflicts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Furthermore, the EU recalls its determination to pursue its contribution to the international mine clearance efforts. The EU has already contributed to the UN Voluntary Trust Fund, financing, in particular, projects in Angola and Mozambique as well as in Bosnia-Herzegovina and Croatia. In addition, the EU will consider the possibility of conducting specific demining actions and will continue to seek to that effect the contribution of the WEU to the elaboration and implementation of such actions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Central and Eastern European countries associated with the EU (Bulgaria, the Czech Republic, Estonia, Hungary, Latvia, Lithuania, Poland, Romania and Slovakia) and the associated countries Cyprus and Malta, as well as the EFTA country members of the EEA, Iceland, Liechtenstein, and Norway, align themselves with this statement.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Great Lakes region and the situation in Burundi</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 24 June 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU's objectives and priorities with regard to the Great Lakes region are to secure peace, to consolidate the process of national reconciliation in the countries concerned, to facilitate a return to normal democratic life, in particular by restoring the rule of law, and to encourage economic and social recovery.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Aware as it is of the close links between the various political, economic and humanitarian problems in the region and of the serious risk of destabilisation which remains, the EU would emphasise the need for a comprehensive approach and a regional dimension in the search for lasting solutions to the crisis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It considers that the presence of over a million and a half refugees in the region constitutes a major factor of destabilisation and that their return to their countries of origin in safety and with dignity is essential if peace is to be restored.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It appeals to the Heads of State who signed the Cairo and Tunis Declarations to comply with the undertakings they gave, so as in particular to stop trafficking in arms and the training of the various militia and armed groups which serve only to increase insecurity in the region. It would point to United Nations Resolution 1053 in this regard and also the measures in the plan of action adopted by the Bujumbura Conference (12 to 17 February 1995) for the prevention of subversive activities in countries of asylum. The EU also emphasises the importance of deploying United Nations observers in airports and at frontiers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU is increasingly concerned at the deteriorating political and human rights situation in Burundi and at the increase in violence. The persistent clashes, spreading over different parts of the country, and the killings and atrocities committed against the civilian population could well involve Burundi in a spiral of permanent conflict.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU strongly condemns all recourse to violence, which will never bring about a solution to the country's problems, and appeals to all the factions in the country to begin negotiating a resolution of their differences and to agree on an immediate, general cessation of violence. It supports the initiatives taken by the United Nations and the Organisation of African Unity to restore peace, as well as former President Nyerere's current efforts in this area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It fervently hopes that the talks taking place will result in a national dialogue open to all factions within the country. It also expresses its support for the ongoing efforts made by various bodies and eminent figures such as former Presidents Carter and Toure, and Archbishop Tutu.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU would point out that it too has taken initiatives aimed at resolving the crisis and recently appointed a special envoy for the Great Lakes region, Mr Aldo Ajello, to assist the current efforts of the United Nations, the Organisation of African Unity and other bodies and individuals, and specifically to lend support to the organisation of a regional conference under the joint aegis of the UN and the OAU to examine and resolve the deep-rooted causes of the crisis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU remains convinced that such a conference must be convened as soon as possible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU reiterates that it is prepared to assist with specific measures to promote peace and reconciliation in Burundi, in particular the organisation of a national dialogue, support for action to promote human rights and the restoring of the rule of law. It is furthermore willing to continue funding the presence of OAU observers and United Nations human rights observers in the country. It is also prepared to help with the economic and social recovery of Burundi as soon as political and security conditions allow rehabilitation programmes to be set up in the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Niger: progressive restoration of aid</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 28 June 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union takes note of the fact that the regime in Niger has announced the results of the country's constitutional referendum and has lifted the state of emergency and the ban on political parties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU takes the view that Niger has thus met the conditions set out by the Council on 13 May 1996 for the progressive restoration of cooperation. In the first instance, this will take the form of: -support for the electoral process; -aid for structural adjustment which, at present, needs to be focused exclusively on the most pressing needs in the social sectors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Council will continue to follow closely the situation in Niger, in particular as regards the preparation and conduct of the presidential and legislative elections.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arusha summit on Burundi</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 5 July 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recalling its declaration of 25 June 1996, the European Union congratulates President Mkapa on the organisation of the Arusha regional summit, which has produced constructive proposals on the conflict in Burundi. It expresses appreciation for the untiring efforts of former President Nyerere and reiterates its support for his peace initiative.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU encourages the region's Heads of State and the Organisation of African Unity to commit themselves resolutely to supporting and giving substance to the Arusha recommendations and to contribute to the restoration of security in Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU expects the President and the Prime Minister of Burundi to fulfil the undertakings they gave at the Summit to overcome the crisis in Burundi and, with the help of the countries of the region, to put an end to the violence which is destroying the people of Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU calls on all the political forces of Burundi to seek a political solution and to give a favourable reception to regional initiatives to restore peace to their country. It calls the attention of all the parties to the conflict in Burundi to the fact that it condemns all forms of violence and that it will not recognise a government that has taken power by force of arms. Only peace, a peace consolidated at regional level, can guarantee the security of all and lay the foundations for economic and social development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU is prepared to support the realisation of the Arusha objectives with a view to restoring peace and security in Burundi. It reiterates its readiness to help Burundi in its economic and social recovery when political and security conditions make it possible to begin its rehabilitation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU reiterates the need to convene the Conference on Peace, Security and Stability in the Great Lakes Region under the joint aegis of the United Nations and the OAU.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burundi: support for the OAU Resolution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 15 July 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recalling its previous Declarations and Common Position on Burundi and, in particular, the Declarations of 25 June 1996 and 5 July 1996, the European Union warmly welcomes the Resolution on Burundi adopted by the Organisation of African Unity's Assembly of Heads of State and Government in Yaounde on 8 -10 July 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Union particularly welcomes the reaffirmation by the OAU of its support for the Mwanza Peace Talks under the facilitation of former President Nyerere and its encouragement to him to continue with his efforts based on and incorporating the principles of sustainable democracy and security for all the people of Burundi and an all-inclusive negotiation process. The Union reiterates its appreciation of the untiring efforts of former President Nyerere and its support for his peace initiative in this context.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The declaration in the Resolution of the OAU's full support for the outcome of the Arusha Summit of 25 June 1996, especially the acceptance of the request by the Government of Burundi for security assistance in order to complement and reinforce the Mwanza peace talks, as well as creating conducive security conditions for all parties to freely participate in the Mwanza process is also welcomed by the Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU reaffirms its willingness to support the realisation of the Arusha objectives with a view to restoring peace and security in Burundi. It remains ready to help Burundi in its economic and social recovery when political and security conditions make it possible to begin its rehabilitation.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Visits</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The President of Haiti</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The President of the Republic of Haiti, Rene Preval, visited the Commission on 11 June. He met with President Jacques Santer, Commissioner Joao de Deus Pinheiro (responsible for relations with the ACP States) and Commissioner Emma Bonino (responsible for humanitarian aid).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">President Preval thanked the European Union for all the support it had provided both for the restoration of democracy in Haiti and for the country's economic development. He spoke in particular of the discussions that are currently under way with the Bretton Woods institutions aimed at restoring Haiti's economy. The President indicated that an economic recovery programme would need balance of payments support to the tune of $119m during 1996, as well as assistance for a range of economic sectors amounting to a billion dollars over a three-year period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For his part, Professor Pinheiro expressed satisfaction at being able to welcome the President at a time when the democratic process in Haiti was functioning normally and institutional consolidation was taking place. In a statement to the press, he said it was an appropriate moment 'to evaluate our cooperation and to strengthen it in a way that will contribute to economic and social development' in Haiti. He added that it was essential for the Haitian people to recognise that democracy was worthwhile. Professor Pinheiro also welcomed the normalisation of relations between Haiti and its neighbour, the Dominican Republic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The President of the Dominican Republic</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The newly-elected President of the Dominican Republic, Leonel Fernandez Reyna, had a working session at the Commission on 15 and 16 July.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This trip to Brussels was the President's first overseas visit in his new capacity, following his election on 30 June. Indeed, he had not yet formally assumed office at the time of his visit. His inauguration was due to take place on 16 August and the President-elect extended an invitation to the Commission to attend the ceremony. Mr Fernandez Reyna's subsequent itinerary included visits to Spain, France and the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Support for human rights</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has recently approved the financing of the following projects under the budget line 'Human Rights and Democracy in the Developing Countries):</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea: ECU 120 000 for a project aimed at actively involving members of the National Assembly in the institution's functioning, and in the democratisation process taking place in the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Niger: ECU 72 000 for a human rights training programme in schools in both urban and rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nigeria: ECU 118 000 for a human -rights training programme to be run in educational establishments and through itinerant projects in regions lacking education infrastructures. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji: ECU 119 000 for a project to support a non-partisan, multi-ethnic civic forum, aimed at contributing to the achievement of a consensus among various social groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Non-ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal: ECU 59 112 to safeguard texts which are essential to the preservation of Tibetan culture. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nepal: ECU 30196 for the archiving of slides and photographs depicting art objects in order to preserve the culture and traditional techniques of Tibet. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Philippines: ECU 61 750 for a mission to identify the areas in which strategies for human rights and democracy could lead to positive and lasting changes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sri Lanka: ECU 84 314 for a programme of information in the field of promoting equal opportunities and non-discrimination </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Aid for rehabilitation</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has recently decided to finance the following projects in developing countries affected by serious civil disturbances or natural disasters:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angola: ECU 847 000 for an integrated programme covering the rehabilitation of agriculture and basic infrastructures, training in demining, hygiene and self sustaining development in Kipungo. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angola: ECU 185 000 for the rehabilitation of basic infrastructures (water, health, education and housing) In the province of Luanda. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eritrea: ECU 353 947 to support the rehabilitation and development of basic </P>
+<P ALIGN="JUSTIFY">health care services in the south-west of the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eritrea: ECU 575 197 for the rehabilitation of water supplies and community development in the town of Hagaz. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia: ECU 515.685 for the rehabilitation of primary care and water supplies in the Warder area. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia: ECU 455 630 to help the rehabilitation of repatriated people and displaced persons in the Borena area. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia: ECU 308 475 for the rehabilitation of health care and water supplies in the Hararghe area. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 848 000 for a programme of support to upgrade medical infrastructures. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 590 000 to consolidate the water sector and rehabilitate livestock infrastructures in Maputo and Gaza provinces. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 500 000 for the second phase of a programme to help reestablish and reintegrate displaced people in Milange. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda: ECU 241 259 for a project designed to revitalise livestock producer groups, make available essential veterinary products and support cattle production in the landward prefecture of Kigali. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda: ECU 411 751 to provide professional training in primary health care. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda: ECU 805 475 for an environment rehabilitation project in the prefecture of Kibungo. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda: ECU 437 622 for the rehabilitation of primary schools in the southwest of the country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rwanda: ECU 94 650 to train laboratory technicians. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Somalia: ECU 626 439 for the rehabilitation of wells and water points in the Nugal region. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zaire: ECU 423 687 for the creation of enterprises involved in making bricks and earth blocks in order to assist in the rehabilitation of rural habitats. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zaire: ECU 1 491 117 for a tree-planting project around the Virungas National Park as part of a rehabilitation programme directed at Rwanda's immediate neighbours.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Haiti: ECU 213 536 for operational and methodological support for rural development projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Haiti: ECU 645 120 for technical assistance in the follow-up and evaluation of rehabilitation projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Haiti: ECU 551980 for a programme to rehabilitate schools and provide support for the education sector. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">European development fund</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following, where required, favourable opinions from the EDF Committee, the Commission has decided to provide grants and special loans from the 5th, 6th and 7th EDFs to finance the following operations (grants unless otherwise stated). Major projects and programmes are highlighted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic and social infrastructure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malawi: ECU 1.9 million for the rehabilitation and construction of customs facilities. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia: ECU 11 million for resurfacing and improvements to the runway at Lusaka international Airport. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji ECU 1.8 million for the rebuilding of three bridges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade promotion/ structural adjustment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Member states of SADC (Southern Africa), ECOWAS (West Africa) and ECOCAS (Central Africa): ECU 500 000 for a follow-up pilot project relating to industrial fore in different sectors. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Botswana: ECU 1.9 million for a tourism development programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Djibouti: ECU 4.1 million to support the 1996-97 structural adjustment programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Netherlands Antilles/Aruba: ECU 5 million for a tourism promotion programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture/ rural development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Madagascar: ECU 1.9 million to support professional organisations in the field of rural credit. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Swaziland: ECU 1.4 million to build a bridge at Maphobeni, to facilitate rural development in this area. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Swaziland: ECU 1.5 million to improve the storage and commercialisation of maize. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Health</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Benin: ECU 700 000 to enhance the security of blood supplies in the Oueme, Mono and Atlantique departments. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Education/training</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Botswana: ECU 15 million for a training programme directed at SMEs, independent operators and the unemployed. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia: ECU 1.05 million for a programme designed to strengthen training and research capacity in the economic field. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Member states of IGAD (Djibouti, Eritrea, Ethiopia, Kenya, Somalia, Sudan, Uganda): ECU 1.9 million for a training programme for the commercialisation of cereals. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lesotho: ECU 1.3 million for a community reforestation programme in the Lesotho Highlands. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Institutional support</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Djibouti: ECU 250 000 to provide technical support for the computerisation of the National Bank's accounting system. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Niger: ECU 1.8 million to support the electoral process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya: ECU 1.7 million for an assistance programme for the National Authorising </P>
+<P ALIGN="JUSTIFY">Officer covering the management of funds allocated by the European Community.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia: ECU 1.5 million for the first phase of a tourism development programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cariforum countries-Antigua &amp; Barbuda, Barbados, Belize, Bahamas, Dominica, Dominican Republic, Grenada, Guyana, Haiti, Jamaica, St Kitts &amp; Nevis, St Lucia, St Vincent &amp; the Grenadines, Suriname, Trinidad &amp; Tobago): ECU 725 000 in technical assistance for the programming unit of the Cariforum General Secretariat. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Miscellaneous</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All ACPs: ECU 5 million to strengthen fisheries management and biodiversity. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghana: ECU 1.5 million for a pilot project in the field of decentralised cooperation. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya: ECU 12.5 million for a community development programme in the battle against poverty. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Somalia: ECU 47 million for the second rehabilitation programme. The focus will be on productive activities (livestock, agriculture and fisheries), the social sectors (health, water, sanitation systems and education), the private sector (revenue generation, job creation, SMEs), the public sector (training, establishment of institutions), demobilisation, and the integration of former combatants </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia: ECU 1.6 million for a programme to combat poverty including, in particular, the provision of credit to micro-enterprises. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zaire: ECU 2 million to support the integration of displaced people in Kasai. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">European investment bank</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Africa: A loan of ECU 56 million for Eskom, the public electricity company, for the modemisation of part of its electricity distribution network.</P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Humanitarian aid</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angola: ECU 14 million for a global assistance programme covering food and medical aid, the distribution of equipment and demining operations. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad: ECU 500 000 for the distribution of essential food products and to meet the special nutritional needs of children in the north of the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cote d'lvoire: ECU 340 000 to help combat cholera and yellow fever among refugees from Liberia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ghana: ECU 140 000 towards the setting up of a camp for 'boat people' arriving from Liberia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guinea: ECU 160000 for the distribution of food to refugees from Liberia and Sierra Leone. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Senegal: ECU 250 000 towards the fight against cholera, notably in the town of Touba.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sierra Leone: ECU 4.2 million for food and emergency medical aid (to combat cholera) for people displaced by the civil war. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Somalia: ECU 1.5 million for a measles vaccination programme and for medical and food aid for victims of the internal conflict. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Southern Sudan: ECU 13 million to finance ECHO flights, and for food, medical aid and the provision of water supplies, for civilian victims of the conflict, notably in Khartoum and its environs and in the refugee camps in the north of Uganda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Non - ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nicaragua: ECU 1.5 million for medicines, essential provisions, drinking water supply equipment and training actions in the area of epidemic prevention. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Peru: ECU 800 000 for shelters and medical assistance to people in the process of reestablishing their homes having fled from the violence that has occurred over the past ten years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ex-Yugoslavia: ECU 102 million for various emergency operations. The breakdown of this aid, by country, is as follows: Bosnia-Herzegovina-ECU 77.45 million; Croatia-ECU 11.95 million; Serbia-Montenegro-ECU 12,6 million.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Russian Federation: ECU 900 000 for street children in St Petersburg and homeless people in Moscow. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Afghanistan: ECU 7 million for a coordinated aid programme covering public health measures, the provision of drinking water, hygiene and refuse collection. The aid will be directed both at the people of Kabul and at other provinces of the country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kirghizistan: ECU 3.6 million for the purchase and distribution of food. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tadilkistan: ECU 8.9 million for a food and medical programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bangladesh: ECU 300 000 to help victims of the tropical storm that struck in the middle of May. </P>
+<P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Food aid</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Angola: 15 000 tonnes of cereals, 2000 tonnes of oils and 3000 tonnes of beans amounting to a total value of ECU 20.075 million. </P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<!--
+</Section>
+</Section>
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/ec160e/ec160e.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/ec160e/ec160e.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/ec160e/ec160e.htm	(revision 21083)
@@ -0,0 +1,2777 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; The Courier - N°160 - Nov - Dec 1996 - Dossier Habitat - Country reports: Fiji , Tonga</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">The Courier - N°160 - Nov - Dec 1996 - Dossier Habitat - Country reports: Fiji , Tonga</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Africa - Caribbean - Pacific - European Union </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Country reports</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji is home to people of a variety of cultures but it would not be accurate to describe this Pacific island country as a 'melting pot'. Politics here are dominated by the difficult relationship between indigenous Fijians and the descendants of indentured Indian labourers brought in to work the sugar cane fields. We look at how this situation affects the economy -  which everyone acknowledges has considerable potential, and examine the prospects for ethnic rapprochement as the nation begins a 'great debase' on the future shape of its Constitution. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Tonga</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tonga appears like a haven of tranquility in a turbulent world. A society which respects hierarchies and is strongly attached to 'traditional values', it is also one of the few remaining places with a hereditary ruler who wields substantial power. But outside influences cannot be ignored altogether and nations everywhere are having to adapt to living in the 'global village'. Our report focuses on the possible consequences of this for the 'Friendly Islands' as the new millenium approaches. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Dossier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Habitat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The concept of 'habitat' conjures up different things to different people - from the right to a roof over one's head to the way in which we manage the flora and fauna of the planet. In our dossier, we consider the legacy of the United Nations 'Habitat' Conference held in Istanbul earlier this year. We also highlight some of the initiatives being taken to improve the quality of people's living environment. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Acknowledgements</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The Courier: Africa  - Caribbean - Pacific - European union</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Address: Postal address (mail only) 'The ACP-EU Courier' Commission of the European Communities 200, rue de la Loi 1049 Brussels Belgium </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Courier office address (visitors) First floor Astrid Building 1, rue de Geneve Evere- Brussels Belgium</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publisher Steffen Smidt commission of the European communities 200, rue de la Loi 1049 - Brussels (Belgium) Tel. 00-32-2-299 1111 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Director of Publications</P>
+<P ALIGN="JUSTIFY">Dominique David</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Editor</P>
+<P ALIGN="JUSTIFY">Simon Homer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Assistant editors</P>
+<P ALIGN="JUSTIFY">Augustin Oyowe</P>
+<P ALIGN="JUSTIFY">Jeanne Remacle</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Associate assistant editor</P>
+<P ALIGN="JUSTIFY">Hegel Goutier</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Journalist:</P>
+<P ALIGN="JUSTIFY">Debra Percival</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Production Manager:</P>
+<P ALIGN="JUSTIFY">Dorothy Morrissey</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Secretariat:</P>
+<P ALIGN="JUSTIFY">Carmela Peters</P>
+<P ALIGN="JUSTIFY">Fax: 299-30-02</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Circulation:</P>
+<P ALIGN="JUSTIFY">Margriet Mahy-van der Werf (299-30-1 2)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Meeting point</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Jacques Bugnicourt, Executive Secretary of Enda Tiers Monde</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main development battle must be fought in the towns and cities</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Founded in 1972, Enda Tiers Monde ('Enda' stands for 'environment and development') is one of the few large international NGOs to be based in a developing country. It has a presence in a number of states in Africa, Latin America and Asia and has been concentrating its efforts on towns and cities, in the belief that this is where deprived populations can be best assisted. Jacques Bugnicourt, who is Enda's Executive Secretary, has some strong views about what needs to be done to tackle the problem of urban deprivation. When we interviewed him at the Enda headquarters in Dakar, Senegal, we began by asking him about the history of the organisation that he heads.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - When we launched Enda, I am not sure that we had any particular goal in mind. You would have to go back to the end of the 1950s, with the war in Indochina, the approaching conflict in Algeria, the independence of countries in Africa and the last-ditch struggles of the colonial powers, notably France. It was in Paris that links were forged between activists from many Third-World countries - in particular, we all took part in the street demonstrations mounted by people from the French colonies. There were some very strong groupings like the Federation of Students from Black Africa, and its equivalents set up by students from the Maghreb, Latin America and Asia. Ten years later, in the 1970s, we could see that the independence experiment was turning sour and the hopes we vested in the actions of determined and brilliant people had come to nothing. The United Nations was becoming increasingly bureaucratic. Some of our friends and colleagues who had government posts had their hands tied, while others were in prison and were equally powerless. In addition, the communists were disappointed at not being able to apply their doctrine to local conditions. Some did, in fact, manage to achieve small-scale results locally when working at the grass-roots, but by and large, their efforts were not successful. I came to Dakar, where I taught in a United Nations institute.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A lot of people had theories. But you cannot take up the battle for the poor without the poor themselves, or for those under the yoke of colonial rule without the participation of the subjugated population. To begin with, you have to appreciate the diversity of the various peoples in developing countries, and be aware of their daily life and struggle. Cesaire wrote that you had to ask questions about the soil, about cities, about men and about the sun. Later, once you have done this, you can act.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We need to dismantle the barriers. There can be no agronomy without economics, and no economics without sociology. If you are talking about jobs in Senegal, you also must talk about jobs in Mali and Guinea - treat Africa as a whole. Another thing is that you have to stand up for yourself and not allow yourself to be manipulated by people from the developed countries. One of the major problems we have noticed is that part of Africa's elite is out of touch with the general population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These are the underlying reasons for the foundation of Enda. Nowadays, it is a non-profit-making international organisation working with various communities - an 'INGO', if you like, with the 'I' standing for 'international'. We have bases almost everywhere in the Third World, from Ho Chi Minh City to La Paz.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Is each section of Enda independent, then ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes. We took the view that there was a danger of becoming too centralised and acting like a small-scale UNICEF or UNESCO, so we decided to guard our independence very carefully. We opted for the widest-ranging autonomy possible. This has its drawbacks of course, but these are far outweighed by the advantages.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You mention drawbacks. Would it be true to say that the original enthusiasm which greeted the creation of Enda has fallen off somewhat ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That's something we are always concerned about. It is not structures which maintain cohesion, but the sharing of goals and the channelling of our actions towards the common good.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the various sections get together, we find that we have a great many things in common. But there is no good reason why those of us in Dakar should try to influence the way people work in working-class districts in Santo Domingo, for example, where they are trying to tackle problems like AIDS and unemployment. We simply tell them what we are doing here and vice versa. If you want to serve the people, you have to have a decentralised set-up. It would be wrong to deal with a problem centrally, and to do so would be against our instincts. Most of us have no particular liking for institutions. An institution must be of service in the battle, not the other way round.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· How do you guarantee cohesion in practice ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It costs a great deal to travel of course, but we do have a lot of joint programmes. For example, the cities programme includes people from Bogota, Santo Domingo, Rabat, Dakar, Ho Chi Minh City and Bombay, all working together. They meet from time to time and, when they do, it is to get down to practical work. Together, their work is, say, three-quarters practical and one quarter reflective. Nevertheless, there is ongoing tension, particularly in the relationship between overall policy and local demands. Another conflict arises between grass-roots action and reflection.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The impression one gets is that you yourself are the 'cement' between the various groups which make up Enda. Could this not be seen as a weakness which may make things difficult in the future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That's what other people say, not what I think. I try to make my presence useful and those who come after me will do the same. What really holds us together is our belief in what we are doing. It is not a question of adhering to some kind of 'monolithic' faith. We simply believe that we can be of use, recognising that there are many limitations. Let me give you a practical example. If someone involved in recycling in Bogota were to meet up with someone from a poor district in Dakar who works at the rubbish tip, they would have a great deal in common and would find it useful to compare their problems and consider practical ways of solving them together.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What are your most important activities in Senegal ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - By far the most important is the one covering the city of Dakar. As well as being a focus for the country itself, Dakar is a metropolitan centre for the entire sub-region, with influence over Bamako, Conakry, Bissau and perhaps even Praia in Cape Verde and Nouakchott in Mauritania. What happens here has repercussions in all those cities. I do not want to sound too dramatic, but the decisive factor in our destiny will be the fate of young people and the poor in the major cities. Two-thirds of these people are facing chronic problems. Those under twenty make up more than half the population and their lives are continuing to spiral down into poverty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enda should obviously be operating in those areas where it can be of most use. And in the context of towns and cities, we have completely reviewed our strategy. For some years we gave priority to the countryside. For a long time, in fact, we believed that rural development would permit a much improved urbanisation process. There was even the view that people in developed countries would not object to paying a little more for agricultural produce, because they could be certain that the money was going to those who actually grew the cotton, groundnuts, cocoa or whatever.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the last fifteen years or so, though, we have come round to the view that our actions must be directed principally at towns and cities. We found initially that there were some interesting projects involving small groups - working to improve the position of children or banding together in cooperative savings ventures. It was good, long-term work which gave results. But that is all out of date now. We have to speak in terms of much larger numbers  -  tens of thousands and not tens or hundreds. Otherwise, there is no chance of making a real difference. That is why we have considerably altered our strategy. Three years ago, approximately two thousand children were able to go to holiday camps. Most of these holidays were paid for by companies, but fewer than 10% of the beneficiaries were genuinely poor. Last year, no fewer than 10 000 children were sent away on five days' holiday -  to the coast near Dakar. Enda was involved in this programme working with 200 local cultural and sports associations. The idea was to give the children the chance to splash about in the sea, but also to use African resources to help them become full citizens and learn that our diversity is the source of our wealth. There are at least 100 000 children living in misery and many of them could end up joining the ranks of the street children. If you can give these youngsters five days holiday plus a bit of follow-up, you allow friendships to be built. It offers a brief escape from everyday reality. It may not be paradise, but it is something tangible.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another example is the tontines that have been formed into a federation. We currently have nineteen thousand women participating in these and if you bear the large family sizes in mind - there are perhaps ten people in every family - that represents a lot of people. The women pay into the tontines and the money is used, not just for the security of their immediate family, but also to help young people set themselves up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Then there is rubbish collection. Enda runs its own scheme but there are also a number of groups that have turned rubbish collection into a profession. The young people collect the rubbish and recycle it. There are about 50 000 people in the biggest district where we are involved in rubbish collection. There are also some young people in that district who are engaged in water recycling and although it only involves supplying about a hundred people at the moment, I believe this scheme will grow. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We also organise schools and are currently involved in making films for schools on the subjects of the environment, hygiene and solidarity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Enda has just opened an 'eco-centre'. If I understand it correctly, this is a showcase to promote a horizontal link between Enda's various activities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That is right. We want it to be a place of passage, meeting, exhibition, permeation and redistribution. We hope people will feel comfortable there, and that it will be a tool symbolising a new way of working. So the centre offers an experience, but we also want it to be used to promote activity. A variety of events have been organised there simultaneously - recently for example, a meeting of shoe-shiners, a gathering of teachers from a long-standing educational centre, an exhibition for the Biennial Festival of Contemporary African Art, and a local-community meeting about setting up a small production facility. Two days earlier, there was a preliminary holiday-camp meeting where the instructors got together to look at the best available teaching methods designed to make children more aware of the importance of solidarity. We believe that solidarity is essential in tackling problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So the centre has a multitude of uses, all of which contribute to the vitality of the local economy. You have to understand the crucial importance of the local economy. It responds to all the basic needs of the poorest people, who want to live their lives just like the rest of us.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You talk of depending on the local (what some would call the informal) economy to live - or at least survive. But this sector is not viewed with enthusiasm by the international authorities ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  Their policy is based on domination and fear: fear of those who accumulate assets. To see these hordes of people in the developing countries frightens them. It's a bit like the horror of the wealthy classes at the end of the nineteenth century when faced with a working class which dared to aspire to wealth. They will give to charity but are not prepared to make a long-term investment. The lack of support for the local economy stems from the fact that foreign aid is geared, first and foremost, towards major projects or emergency aid. Four or five years ago, the UN conducted a survey in 10 towns and cities in West Africa, but the results were not published because they showed that the average rate of growth of the local economy was 7.5%. So, you see, we are far from just muddling along. Great things could be achieved if only there were a change in attitude. It also requires a change of terminology. How can one justify the use of the word 'informal' and, worse still, treat the work of the poorest people and fraudulent activities under the same heading. Fraud may be formal or informal. Knowing African society as I do, I am aware that fraud is statistically more widespread amongst the prosperous and highly respected. So we must not cast stones at the little man selling socks who has no trading licence because he cannot afford one, or at the woman who sets up a stall at a school entrance without complying with the law which requires a recent certificate stating that she does not have tuberculosis. What is the bottom line here ? Must we respect the law or the people who want to live without being thieves, beggars or prostitutes ? It is unacceptable for force to lie with the law and for the majority to be cast into wretchedness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Senegal, there used to be fixed prices for milk. The World Bank protested, declaring that this was a restriction on free competition. Now we have to pay much more and many people can no longer afford to give their children-milk every day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To put it in perspective, Senegal's economy is about the same size as that of the city of Bordeaux. So we must use all the available potential. Highly qualified managers should do their job looking after the high-tech sectors. But, at the same time, we should not be driving out the poor people who are just trying to eke out a living. The informal sector creates services for a very small investment, and people also require services. Economic policy must allow society to walk on two legs, not just one. What that means is that we need a great deal of flexibility, and perhaps a complete review of the law. Contraceptive implants have to be licensed so that there are no more back-street abortions. And it must be possible for girls to attend school even if they do not have a proper birth certificate - why should they be excluded from education for want of a piece of paper. It should be possible to trade with a simple one-day ticket which people should be able to buy in post offices or cinemas. What would be wrong with that? And we should have a moratorium on a number of regulations. We need to wage war on the destitution that we are suffering and that means taking decisive measure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">ACP</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Joint Assembly begins discussions on future ACP-EU relations</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the agenda was, as usual, heavily laden with a variety of long-standing issues ranging from regional cooperation, fisheries, the cocoa content of chocolate and bananas to the situation in several ACP states (in particular Rwanda and Burundi), the future of ACP-EU relations was at the forefront of discussions at the ACP-EU Joint Assembly, which was held in Luxembourg from 23-26 September 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Opened in the presence of the Grand Duke and Grand Duchess of Luxembourg, the Assembly's general attitude was not one of speculation as to whether or not the European Union would abandon the ACP states when the Lom&eacute; IV Convention expires in the year 2000 - a feeling that was rife shortly after the signing of the revised version in Mauritius in November 1995. Instead, it was one of positive thinking and of exploring the kind of agreement that would succeed it. 'There is no question of the European Union getting out of a relationship which took decades to build', Luxembourg's Prime Minister Jean-Claude Junker, told participants in his welcoming address.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As pessimism gives way to guarded optimism, ACP-EU parliamentarians have taken an important initiative, even before the Commission's Green Paper is published, in what is bound to be a long and passionate debate. A special summit of ACP Heads of State is planned for Gabon later in 1997 to discuss the issue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Options for the future</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A general report, introduced by Mr Firmin Jean-Louis (Haiti), provided the main platform for the Joint Assembly's deliberation. Although presented too late for representatives to have the opportunity to examine it in detail, the exchange of views on the floor was wide-ranging and reflected the report's content to a considerable degree.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The report encapsulates all the ideas that have emerged so far in various fore. It analyses framework options for future ACP-EU relations  -  bilateral, regional and multilateral - and raises pertinent questions and concerns. Noting that international cooperation is increasingly dictated by economic and security considerations, and that North-South solidarity is, as a result, being pushed to the background, it regrets the fact that certain EU member states appear to indicate a preference for bilateral over multilateral cooperation. The author of the report warns that this trend would not only diminish the credibility of the Union but also its international influence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any instrument of cooperation, the report says, should take into account the different levels of development among ACP states as well as the regional vocation of many others. Its objective must be poverty eradication, sustainable economic and social development, and the harmonious integration of the ACP states into the global economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It recognises the need to secure the support of European public opinion which is largely unconvinced that EU aid to ACP states has been effective over the past 20 years. Not enough publicity; it says, has been given to its positive aspects. The report goes on to warn that solidarity and development are at stake and that the debate on the future of ACP-EU relations should not be left to politicians and technocrats. It should also involve wider civil society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Joint Assembly debate, the commitment of EU political leaders to the development of the ACP states was often called into question. Francis Wurtz (EUL-F) summed it up when he said there were worrying signs that the EU intends to downgrade its relationship with the ACP states - signs which go back to the negotiations on the Lom&eacute; IV second financial protocol, when several countries refused to increase their contributions to the 8th EDF. The EU draft budget for 1997, which he said revealed a substantial reduction in the funds allocated to the developing countries outside the Mediterranean region, provided further evidence of this. 'We must be vigilant,' he told his colleagues, 'and must not allow the Lom&eacute; Convention to be revised downwards.' Mr Wurtz agreed that greater efforts were needed to create awareness and mobilise European opinion in favour of development. The European public should know that EU development policy was not based on charity but on self-interest. 'Without Africa developing, Europe has little chance of maintaining growth in the long run.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lord Plumb (EPP-UK), the European Co-President of the Joint Assembly, admitted that it would not be easy to influence European public opinion. 'One of the roles of the Joint Assemby,' he said, however, 'must be to ensure that the peoples of Europe have confidence in the progress being made by the countries of the South. We must all help in this task of confidence-building.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Glenys Kinnock (PES-UK) urged that there should be as much participation as possible in the ongoing dialogue over future ACP-EU relations in order to bridge what she saw as 'the gap between rhetoric and reality.' Equity, she argued, should be the main objective.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACP Co-President, Sir John Kaputin (Papua New Guinea), said there was no doubt that the EU was forging closer ties with the former Eastern bloc countries at the expense of the ACPs. He pointed out, however, that the Lom&eacute; Convention had always encouraged a 'forward-looking' approach and argued that whatever succeeded the current ACP-EU relationship should be 'the most important' agreement ever.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The representative from Barbados, Dr Richard Cheltenham, was of the opinion that whatever the outcome of the discussions, efforts were needed to avoid 'chaos'. There should, for example, be no immediate abandonment of the trade preferences that ACP states had acquired. Transformation must be gradual to enable them to adjust and restructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">European Commissioner, Professor Pinheiro, chose, first of all, to underline the importance of the role of 'the state and civil society' in development. He indicated that he saw this as growing more and more in importance. This was reflected in the agreement signed in Mauritius -  an agreement which seeks to encourage the consolidation of democracy, the rule of law, good governance and transparency, and which emphasises decentralised cooperation and the role of the private sector. the Commissioner spoke about the current programming exercise, reminding the Assembly that resources were being allocated in two tranches in accordance with the provisions of the revised Convention, to take account of each ACP state's development strategy and the objectives and priorities of the Community's development policy. He revealed that only 16 ACP countries and two EU Member States had ratified the revised Convention and urged those that have not done so to accelerate the process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He welcomed the Joint Assembly's initiative in debating future ACP-EU relations. The Commission's Green Paper, he told representatives, will be published in November. He was, therefore, not in a position to enter into detailed discussions with members on the subject at this stage. He stressed, nonetheless, that the document 'will not be a blueprint for future EU strategy towards the ACP countries. It will be a discussion paper.' there were a number of key questions that needed to be addressed regarding strategy, the scope of future relations and the use of the traditional instruments of aid and trade. 'This is not to say that we should start afresh', he argued. 'We should build on what has been achieved so far, and adapt where necessary.' Professor Pinheiro was certain that whatever the outcome of the discussions, there were a number of 'unchallengeable principles' on which ACP-EU relations should continue to be based. These were: partnership, ownership by ACP countries of their development policies, security in terms of EU support and predictability of relations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New areas of concern</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This session of the Joint Assembly saw the emergence of two new areas of concern: urban development, and the effects of climate change on small island states. An initial report on the former was presented by the rapporteur, Daby Diagne (Senegal). It did not give rise to much debate. The report emphasises the pivotal role towns play in economic development and urges the Community to adopt an integrated policy on urban development (See our interview with Mr Daigne in the Dossier). The latter was the subject of a full morning hearing, involving a panel of ACP-EU experts who are closely involved with the problem. They warned of the threat posed by global warming to the survival, and even existence, of many islands in the Caribbean and the Pacific. The emission of greenhouse gases, the Assembly was told, has reached levels never before experienced (see the article which follows). Representatives agreed on the need to integrate climate change considerations into sustainable development strategies. A Working Group on the issue was set up with Karin Junker (PES-G) as general rapporteur.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cocoa and babanas</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was no avoiding the intractable problems of cocoa and bananas. On cocoa, opinions were divided as usual. There were those who felt that the Commission's proposed new directive allowing chocolate to contain vegetable oils (up to 5% of total volume) in place of cocoa butter, was reasonable. The proposal also involves a labelling system to ensure that the exact contents of the product are clearly indicated Advocates of this strategy argued that it would not only widen consumer choice but would also promote the export of shea-butter and other vegetable oils which a number of ACP countries produce. Opponents were worried that if implemented, the directive could lead to a big fall in cocoa exports and a commensurate loss of earnings for ACP cocoa producers. Magda Aelvoet (Greens-B) argued in favour of maintaining the status quo, saying that this was preferable to what was being put forward in the draft directive. She warned that the Commission propose' would almost certainly result in everyone (cocoa producers, shea-butter producers and consumers) losing out. There was no guarantee that menu facturers would choose shea-butter given that they would be free to use whatever vegetable oils they liked She was certain they would go for the cheapest substitute or even for synthetic products. Accordingly, Mrs Aelvoet proposed a 'freeze' on all proposals. This view was reflected in the resolution passed by the Assembly, which called on the Council to reject the proposed directive. It also requested the sever member countries which currently authorise the use of vegetable oil to comply gradually with the existing directive  -  which bans their use altogether.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The banana issue proved even thornier. There is a dispute at the World Trade Organisation, where the Lom&eacute; Protocol is being challenged by the United States and Latin American banana producers. Mrs Kinnock expressed anger at the fact that the arbitration panel set up by the WTO is made UP of three countries known to advocate free trade. The panel, she said, is chaired by Hong Kong - which the Organisation told her was representing the 'developing countries!' The general feeling among representatives was that the odds were stacked against the European Union and the ACPs. The Assembly passed a resolution asking the Union to stand firm in defence of the banana regime.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Democracy, human rights, peace and security</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Twenty-seven questions were addressed to the Council of Ministers and a further 28 to the Commission. More than a third of these dealt with issues relating to emergency relief operations, democracy, human rights, peace and security  -  recurring themes throughout the four-day meeting. The emphasis, in this context, was on Burundi, Rwanda, Liberia and Nigeria, all of which were considered individually under the agenda item 'the situation in ACP states'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the detailed answers given by Commissioner Pinheiro to questions on Burundi and Rwanda, the Assembly had a long session with Aldo Ajello, the EU's Special Representative to the Great Lakes. The discussion focused on efforts to restore democracy and legitimate government in Burundi, national reconciliation, and the repatriation of refugees from neighbouring countries to both Burundi and Rwanda. Mr Ajello gave members a comprehensive picture of the complex political and humanitarian situation in the region. He spoke of the sanctions imposed on Burundi by neighbouring countries and the efforts of the former Tanzania President, Julius Nyerere, to bring about dialogue and a just political settlement in Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nigeria was again in the dock. Its representative, Dada Olisa, acting Charge d'affaires at the Embassy in Brussels, gave an account of what he considered was the progress made by the Abacha regime on human rights and democracy since the Joint Assembly met in Windhoek last March. He mentioned the repeal of the decree under which Ken Saro-Wiwa and other minority activists were executed, the release of detainees and the transitional programme for a return to democracy by 1998. He pleaded for the Assembly's understanding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">His explanation cut no ice with any of the seven political groupings in the European Parliament, who came together to present a compromise draft resolution on Nigeria. They wish to see all political prisoners released immediately, and the restoration of civil and political rights, as well as a democratically elected civilian government, by the end of 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The resolution on Nigeria was again passed by secret ballot - the very last act of the session. It calls, among other things, for a total arms embargo (preventing the trade in future but also covering existing supply agreements) and for the financial assets of the Nigerian government and of members of the country's ruling councils (and of their families), to be frozen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The resolution does not differ very much from the previous one. Mrs Junker, Johanna Maij-Weggen (EPP-NL) and Mrs Kinnock all expressed disappointment that the EU Council had failed to implement this fully. However, by repeating the demand for sanctions, they said, the Assembly was sending a very strong message to the Council that it was determined to see Nigeria return to democracy as quickly as possible. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Alarm bells sound on small island states</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Climate change</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A morning session of the ACP-EU Joint Assembly was devoted to a public hearing on the effects of climate change on small island states. It was appropriate that the issue should be brought to the attention of the Assembly by Maartje van Putten (PESNL). Representing a country much of which lies below sea-level. she is familiar with the devastating effects of sea flooding. At the hearing, which was very well attended, a panel of invited ACP-EU experts was on hand to enlighten the audience on the extent of the problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although global warning has been on the international agenda for more than 10 years, the seriousness of the threat it poses to the survival of small island states is only now beginning to be taken seriously - and it might already be too late, if some of the most apocalyptic scientific predictions are to be believed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is now growing evidence that global warming is taking place. In recent years, we have experienced more extreme weather conditions - heatwaves, floods and increasingly destructive tropical storms - while there are signs that icecaps are melting and sea levels rising. The increasing incidence of malaria in Africa has been linked to these changes. And it is all happening because of the influence our style of living is having on the planet - in particular the huge emissions of greenhouse gases such as carbon dioxide and methane, from our factories, vehicles and so on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That the public hearing attracted a large audience was not only a reflection of the interest the problem is now commanding. It also symbolised the mounting international pressure for reductions in CO2 levels in the atmosphere, and for the adoption of more realistic strategies of sustainable development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel of experts comprised Dr Leonard Nurse, Manager of the Coastal Conservation Project in Barbados, Donald Stewart, Acting Director of the South Pacific Regional Environmental Programme (SPREP), Dr Robert Watson, Senior Scientific Adviser at the Environment Department of the World Bank and Chairman of the second Working Group of the Intergovernmental Panel on Climate Change (IPCC), and Neroni Slade, Vice-Chairman of the Association of Small Island States (AOSIS) and AOSIS Coordinator on Climate Change. A separate workshop on climate change was also organised on the same afternoon outside the formal Joint Assembly setting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to Dr Nurse, current estimates based on most reliable models, suggest sea level is rising at the rate of 5mm a year (the 'range of uncertainty' is between 2mm and 9mm). This is two to five times the rate experienced in the last 100 years. This rise is expected to continue beyond the year 2100 even if greenhouse gases are stabilised. The implications for small island states, particularly the low-lying ones, would be severe. 'Atolls such as Tokelau, Marshall Islands, Tuvalu and the Maldives could possibly disappear', he said. 'Major population displacement would be experienced in Micronesia, Palau, Nauru, French Polynesia, the Cook Islands and Tonga.' Meanwhile, small islands with extensive coastal plains and limited upland areas such as Barbados, the Bahamas and Antigua, 'would be highly vulnerable to social and economic disruptions', as major cities, ports and tourist facilities, industries, freshwater sources, fertile agricultural lands and even coral reefs are destroyed by typhoons and cyclones, or washed away in floods. 'Given the limitations of climate models,' Dr Nurse said, 'it is not possible to state with certainty at this stage whether there will be a change in the behaviour of tropical storms and hurricanes. However, it is highly probable that an increase in the frequency and intensity of these phenomena could occur in a 'warmer world'. One study, he claims, predicts tropical storms would have a potential destructive force at least twice what they have today.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr Watson, similarly, struck a pessimistic note when he said that the potential for irreversible damage was great. He agreed with Dr Nurse that even if we took measures now to reduce CO2 emissions, stabilisation of the situation will take centuries. He pleaded for climate change to be taken into consideration 'in our everyday decisions.' Governments must not wait for cause and effect to be established before taking action. 'It is,' he said, 'economically feasible to reduce CO2' by introducing appropriate policy measures: looking at supply of and demand for energy, resorting to new and renewable energy sources, nuclear power, etc. and ensuring more efficient land management.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The question of 'burden-sharing' in the reduction of emissions between the industrialised world and the developing countries was debated at length. It was noted, for example, that small islands states are responsible for a very small proportion of the emissions, yet they bear the brunt of the consequences. There was a general consensus that burden-sharing should be based on equity and justice.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It should be noted that the Alliance of Small Island States (which was formed during the Second World Climate Conference in 1990) has called on the industrialised world to achieve a 20% reduction in their greenhouse gas emissions by the year 2005 (The 'Toronto objective'). This, it hopes, would bring CO2 in the atmosphere down to 1990 levels. Whether this is realistic is debatable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, a number of strategy options are being closely examined by the European Commision and the Council with a view to adopting Community-wide measures to reduce emissions significantly by 2005-2010. Member States have made phasing-out proposals with targets of 5-10% by 2005, 15-20% by 2020 and 50% by 2030. This works out at an average reduction of 196 2% annually from the year 2000.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Several parliamentarians wanted to know what the Commission, in particular, had done and will do to help small ACP island states overcome the effects of climate change. It was soon discovered during the discussion that a number of African countries were equally concerned. A Commission representative referred the Assembly to the provisions in the Convention which covered global warming and the special problems of island states. Although there is no specific reference to climate change, the Commission had dealt and would continue to deal with the issue in the broader context of its environmental action. Studies, projects and programmes are being implemented in the Caribbean and Indian Ocean in particular. Furthermore, DG VIII has drawn up internal briefing papers aimed at making departments aware of the issues of climate change and the environment. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Country reports</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Fiji</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Political stability is the key to economic success</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In most of the ACP states featured in our Country Reports, the vital issues are usually economic and social ones. How is a nation with a poor natural resource base to achieve lasting development ? What can be done to improve the skills of the people? How can a vibrant private sector be created ? Can better health care be delivered and how should it be paid for? Some of these questions might well be valid for Fiji but the visiting journalist soon discovers that they are all secondary issues. For this is a country whose political system itself dominates the agenda. The fundamental issue here is the relationship between the indigenous people of Fiji and the descendants of indentured Indian labourers brought in by the British between 1879 and 1916 to work in the sugar cane fields.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji, in fact, is home to people of a variety of cultures. On the indigenous side, the majority are Melanesians but there are also some Polynesians (living on the island of Rotuma). The country even plays host to Banabans, from Kiribati, who were displaced from their homes on Ocean Island to make way for the phosphate diggers. They hold a freehold to the island of Rabi and enjoy a special self-governing status. And while the Indians form the bulk of the non-indigenous population, there are also small Chinese and European communities as well as a number of inhabitants of mixed race.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite this diversity, it would be inappropriate to describe Fiji as a melting pot. Ever since the rapid expansion of the Indian population, official policy has tended to accentuate the divisions. In the early days, it was the British who were responsible for this, although one has to be careful to avoid value judgments. The colonial administrators, it seems, were aware of the tensions that would arise by bringing in large numbers of people of a different culture, language and religion. Their eventual response was to provide guarantees for the local population, notably as regards land rights. The effect was to preserve the traditional land tenure system which was based on villages and families. At the time, it seemed a logical thing to do, but several generations on, the country now has a settled population of Indian origin (43% of the total) who have limited opportunities to own land - even though many of them work on it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As the economy has developed, each of the two main communities has found itself 'specialising' in different fields. For example, cane farmers and retailers tend to be of Indian origin while the public service has traditionally attracted more native Fijians. Significantly, the army is almost exclusively filled by indigenous people - a crucial factor in the 1987 military coup.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the political front, as Fiji moved towards independence, the idea of providing separate representation for each ethnic group also took hold. The independence constitution of 1970 reflected this with the two main communities being given parity (22 seats each) in the House of Representatives.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Shattered illusion</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there was no real assimilation between 1970 and 1987, Fiji was seen by many as a model of a successful multiracial society. It was only when the country got its first Indian-dominated administration (sustained in power by a smaller native Fijian party) that this illusion was shattered. There was a military coup led by Lieutenant-Colonel Sitiveni Rabuka, who is now the elected Prime Minister,. Shortly thereafter, Fiji became a republic (Queen Elizabeth was formerly Head of State) and in 1990, a new Constitution was adopted giving political primacy to the indigenous Fijians. Needless to say, it was a time of greatly heightened communal tension.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 1987 coup and the events that followed have been well covered elsewhere (including our previous Country Report which was published in 1991). It suffices to say here that while the last few years have been a lot less turbulent, tensions remain. In 1997, the country must adopt a new set of constitutional proposals and a big debate is currently under way about the shape of the system of government for the 21st century. This subject is covered in a later article and also features prominently in our interviews with the Prime Minister and Opposition Leader.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main focus of this article is therefore on economic and social aspects although, as one soon discovers, this frequently leads us back to the ethnic question. This is particularly the case when one considers the overall economic performance of the country. Fiji is not poor by developing nation standards and it has enjoyed modest growth during 1995 and 1996, but there is a widespread view that it could be doing a great deal better were it not for the political uncertainties. The problem is summed up by the Economic Intelligence Unit in its Fiji Country Report for the first quarter of 1996: 'Political instability will continue to deter investment, other than that on highly favourable tax terms.' In other words, Fiji is paying a high economic price for its internal difficulties.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General unease about the future and, in particular, the outcome of the constitutional review process is compounded by specific concerns over land tenure. The long-term leases granted to (mainly Indian) farmers are approaching their end and the government must soon decide what it should do next. Will any of the sugar cane farmers be evicted and if so, how many ? What alternative arrangements will be made for them? These questions remained to be answered when The Courier visited Fiji in July although, as our keynote interviews show, the subject was clearly exercising the minds of the politicians.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A long-term strategy for agriculture?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The way in which the land question is dealt with will have a crucial impact on the sugar industry - still the country's most important product in terms of its contribution to GDP and the jobs that it generates (see the article entitled 'Sugar definitely has a future'). With other uncertainties facing this sector - in particular, the process of global liberalisation - there is a growing recognition of the need for a long-term strategy. The government has a two-pronged approach  -  improving efficiency within the sector and diversifying into other agricultural products. To learn more about this, we spoke to Luke Ratuvuki, who is the Permanent Secretary for Agriculture, Fisheries and Forests.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Ratuvuki began by stressing the scope for increasing the sugar yield per hectare by as much as 75% (and by even more with irrigation). If productivity could be boosted on this scale, Fiji sugar would be in a much better position to compete in open world markets. He admitted, however, that the country would still face a struggle in maintaining market share and, looking ahead ten years, foresaw a slimmed down industry providing high quality sugar with more of a focus on niche markets. This inevitably meant looking at other agricultural products as possible long-term substitutes. The coconut (or as the Permanent Secretary dubbed it, 'the tree of life') is traditionally grown here and seems poised to enjoy a new lease of life following a period of decline. Fiji has also picked up the taro trade at the expense of Western Samoa, which is affected by taro blight, while there are significant exports of ginger to Australia, New Zealand, Canada and Europe. Mr Ratuvuki spoke enthusiastically about branching out into other areas such as pawpaws, mangoes, bananas and aubergines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji has potential for growth in a range of non-agricultural sectors, but farming is sure to play a vital part in the economy for many years to come. Currently, sugar represents almost three quarters of all crops by value (excluding subsistence growing) and the Fijians are only too aware that this makes the country particularly vulnerable to external shocks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The other primary sectors are all present in Fiji, albeit on a more modest scale. There is some deep-sea fishing backed by Asian investors. This provides useful employment although perhaps not the best possible financial return to the country. As one would expect in a nation of three hundred islands, there is also extensive artisanal and subsistence fishing in the inshore areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The forestry sector divides into two parts: artificial softwood plantations which are said to be managed sustainably and the naturally growing hardwoods. As regards the latter, the EU is helping with a mapping project. Although Asian loggers do not operate in Fiji, there is considerable land clearance taking place, leading to problems of erosion and silting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prospects for mining</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gold is the main mineral being exploited with important deposits around Vatukoula. The sector has had its ups and downs but the Emperor Gold Mining Company has now embarked on an expansion project aimed at raising production from the current level of about 4000 kilos per annum to 6000 kilos by the year 2000. A huge copper and gold mine is also planned for Namosi, some 35 km from Suva. Other minerals discovered but not exploited include bauxite, iron, lead, zinc, phosphates and marble. Mining currently makes a modest contribution to overall GDP but represents an important component in the export earnings figures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With one key exception, manufacturing is on a fairly small scale with an emphasis on staple items (butter, beer, soft drinks, paint, soap etc.) for the local market. The exception is the garment industry which provides some 20% of the country's export income and a considerable amount of employment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The investments in garment manufacturing and mining have been important in jobs terms and in improving the trade figures, but there are those who criticise the fact that the government appears to derive little revenue from the operations. The exact fiscal benefits are not easy to determine, prompting some observers to suggest that official secrecy should be eased (see the article on the Constitutional Review later in this Country Report).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the service sector, long-term growth is foreseen in the key area of tourism. The number of holidaymakers choosing Fiji dipped sharply at the time of the coup, illustrating the importance of political stability in attracting visitors. Tourist arrivals bounced back once Fiji's internal difficulties had receded from the international headlines. The politicians must be hoping that nothing will occur during the current period of constitutional discussion and negotiation to put Fiji back on the front pages. It is worth mentioning here that Fiji's national carrier, Air Pacific, is an example of a relatively rare bird - an airline that makes money ! According to journalist Avin Rahish, writing in the July 1996 issue of The Review (the news and business magazine of Fiji): 'It is one of the few government investments that is profitable on its own.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If tourism is a success story, there is something of a shadow over the financial services sector, which is more extensive here than in most developing countries. The reason is the collapse last year of the National Bank of Fiji with losses of US$ 142m (equivalent to 10% of the annual GDP). The authorities were accused of a failure in supervision and the taxpayers have had to pick up some of the bill. More serious, however, is the undermining of confidence in the system and it will take time for this to be restored.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social challenges</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">As a middle-income country, Fiji has relatively favourable social indicators in the areas of health and education. Medical facilities are provided by the government but it is said that the public health system is not as good as it once was. This is attributed, among other things, to the emigration of highly qualified staff in the aftermath of the events of 1987. Nonetheless, the country does have 27 hospitals and one doctor for approximately every 1900 people. At 72 years, life expectancy is high compared to the ACP average.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The education sector is well-developed with more than 800 primary and secondary schools (for a population of less than 800 000) and 41 technical or vocational institutions. As a result, primary school enrolment is close to 100% while the 1986 census revealed that 60% of 15-year olds were still in education. On the other hand, there are concerns over the proportion of teachers lacking qualifications, notably in the primary school system. In practice, there is considerable racial segregation at both primary and secondary levels, although there is no official policy to this effect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Educationally, the jewel in the crown is almost certainly the University of the South Pacific whose main campus is in Suva. This regional institution, which has departments in a number of other countries of the South Pacific, draws students from various island nations. Dr Vijay Naidu, who is the USP's Pro-Vice Chancellor, outlined some of the special features of this unique university which has to cater for a highly dispersed population. Like traditional tertiary institutions, it provides a wide range of degree programmes on campus, catering for 3500 students. It has a further 9000 who are being educated using the 'distance mode'. Distance learning is organised through centres in each of the participating countries. Students can attend these centres from time to time but much of their work is done through radio and telephone linkages and, increasingly nowadays, by e-mail and satellite communications. The University, Dr Naidu stressed, also provides continuing education at non-degree level 'in everything from computing to basket-weaving'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Like the health sector, the USP suffered a loss of highly qualified staff after 1987  -  and not just among employees of Indian origin. As the Pro-Vice Chancellor pointed out, the coup created 'a new sense of insecurity' all round and teachers who decided to emigrate were quickly accepted in Australia and New Zealand. The loss has been particularly serious in the scientific disciplines.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">90% of the USP's recurrent expenditure is covered by member government contributions with the remainder coming from Australia and New Zealand. For capital investments, there is heavy reliance on external donors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In both of Fiji's main ethnic communities, a strong commitment to the family ensures that there is relatively little absolute poverty although things may be changing as the country become more urbanised. It is rare to see beggars in the streets in the South Pacific but Suva, sadly, has a number of these.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The overall picture is of a country with very considerable potential in both human and natural resource terms which needs to overcome a number of challenges to secure a more prosperous future. Some of these challenges - adapting to the world of free markets, tackling bureaucratic impediments, bringing development to rural villages, improving the infrastructure, and so on - are familiar to all developing countries. The single most important constraint, however, is the big ethnic divide, and the political uncertainty which flows from this. And this is something which can only be solved by the people of Fiji themselves. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with Prime Minister Sitiveni Rabuka</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'The last ten years have been very educational for me'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is almost ten years since Sitiveni Rabuka led the military coup which toppled the newly-electerl coalition government The stormy events of 1987 are long gast end Fiji has returned to more peaceful ways, but the country is arguably not yet at peace with itself. Major-General Rabuka is now the erected Prime Minister, having led the SVT to victory at the polls in 1992 and 1994. But the gulf between the native Fijians end citizens of Indian descent remains -  indeed, it is institutionalised in a political system which ensures a parliamentary majority for the former. A constitutional review is currently under way end a new text must tee adopted by July 1997. For both sides, the stakes are high. In this interview, Prime Minister Rabuka speaks frankly about the crucial issues facing Fiji as the nation gears up for the great constitutional debate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji also faces some formidable economic challenges and we began by asking the Prime Minister about these.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The main challenge is the one that everybody faces: achieving an acceptable rate of growth to ensure job creation and address the unemployment problem. We also want to improve the standard of living of the people, to upgrade our infrastructure, and to develop both the urban and rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What sectors do you see as offering the best hope for future growth ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  We are looking particularly at tourism and the agro-based industries. In the international sphere, we are aiming to boost trade, particularly with our traditional trading partners, Australia and New Zealand, and with new partners that we are trying to cultivate in Asia.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We are very grateful for the Lom&eacute; Convention and the various arrangements associated with it - particularly as regards access to the EU market for our sugar products. Although it would be desirable for us not to have to rely on preferential pricing for sugar, for the moment, there is no alternative. And while we are looking for alternatives and seeking to diversify our economy, we will need that system to remain in place. We would like to continue the dialogue to ensure that this happens. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the area of trade, as I say, our focus is on Australia and New Zealand, and the regional trade agreement that the Pacific island territories have with them. This agreement is currently under review. One important aspect is the clause governing the rules of origin. If we can convince Australia and New Zealand to reduce the local input requirement from 50% to 35%, then we won't need any aid from them. The effect will be to secure existing jobs and, indeed, to increase employment, particularly in the garment industry. At the moment, most of the textiles we import for further processing come from Australia. Because of the market we have to sell to, it is very good quality material. This means the costs are high, in comparison with the local input needed to turn it into finished products, and this makes it difficult for us to get up to the required 50%.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If we don't get that reduction, things could go in the opposite direction. Manufacturers might relocate and we could be facing jobs losses. You have to remember that we are competing with Asian producers who have very low wage costs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Is this proposal for a reduction in the local input requirement on the agenda with the Australians and New Zealanders ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The review actually excludes the clause on the rules of origin. Having said this, we have effectively raised the calculation of our local input in negotiations on a series of other points. On paper, the 50% figure is unchanged but in fact, there has been a reduction of about 5%, thus giving us a little margin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· On the sugar issue you said you were hopeful that some form of preferential access to the EU market would be maintained. Isn't there a concern that this may not last beyond the year 2000, particularly given the increasingly liberal world trading system ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, and we are looking at that. We should be gearing ourselves up for what happens at the end of the current Lom&eacute; agreement. It remains to be seen whether, with the WTO and the new trends, the curtain will suddenly be brought down on 1 January 2000, or whether there will be a grace period in which we are given time to consolidate our diversification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The other big issue in the sugar sector concerns the impending expiry of the land leases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That is a local issue and a very important one. It has high priority on our government agenda. We are currently talking to the landowners and lessees, explaining what will happen. The legislation (the Agricultural Landlord and Tenant Act) makes no provision for further extensions to the leases, which are now nearing their end. Do we need a new act or should we amend the present law to allow extensions beyond the 50 years originally allowed for ? And if we are to do that, what happens to the compensation provisions? At the moment, these are viewed in a rather one-sided way. The emphasis is on the situation where the landlord compensates the tenant for improvements made to the land. But the rules also provide for compensation in the other direction where the value has been reduced. This may be due to constant cultivation over 50 years. What if the owner wants to return the land to its original use, planting taro, yams or cassava, as his father may have done fifty years ago, and finds he can no longer do so ? There has to be a balancing act here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hopefully, most of the land will be leased again under a new agreement or under an amendment to the existing law - because we will need to continue sugar production. It is also worth noting that some sugar farmers are beginning to diversify into other crops, both subsistence and commercial.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What arrangements do you envisage for those farmers who do not have their leases renewed ? Will they be relocated ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Right now, we are looking at the use of state land. There are two basic categories here - what used to be known as 'Crown Land under Schedule A' and 'Crown Land under Schedule B'. Schedule A covers the land not claimed by anybody during the Commission that was set up to determine the ownership of land in the very early colonial years. Schedule B is land that belonged to a community or landholding unit that has since died out: in other words, where there is no surviving member of the land-owning unit. So we have those parcels of land available. My party's policy is to restore land to the traditional owners where possible, but in those cases where you cannot identify the original owners, there will be land available for resettlement - although resettlement is perhaps not a very good term to use. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· It is somewhat emotive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It implies taking a person, family or community from somewhere and planting them somewhere else -  and I hope we can avoid that. On the other hand, if you look at what people are doing nowadays, everybody's relocating. People are always resettling, moving away from home and setting up elsewhere. In this case it is perhaps a necessity, in the sense that the legislation has caught up with us. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Can I turn now to the sensitive issue of the constitution. This is another area where decision day is looming. You currently have a constitutional review under way with the Commission's report due out soon. What do you think will emerge from this process over the next 12-18 months ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I don't feel that the constitutional issue is a sensitive one and do not think anyone should feel restrained in asking questions about it. It reflects the reality of the situation in Fiji. There is a requirement that the 1990 Constitution be reviewed and we have a Review Commission chaired by Sir Paul Reeves. He is a very capable man who is a former Governor-General of New Zealand and a very eminent constitutional lawyer. Assisting him, we have two party nominees - one from the main Fijian party and one nominated jointly by the Indian parties in Parliament. I have total confidence in that Commission. I believe they will come up with very objective observations and recommendations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let me explain the timetable to you. The report is expected by the end of August. It will be presented first to the President and then to me for submission to Cabinet. I envisage it being tabled in Parliament towards the end of September. We cannot debate it until three months have elapsed from the date it was tabled - which takes us to the end of the year. A lot of work will be needed during the first half of 1997. The Joint Parliamentary Select Committee, made up of members of both the upper and lower houses, will have to work on the report and try and build consensus on the various issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given that the house is racially divided, and the possibility that a premature discussion on the floor of the house may raise the temperature, I would prefer not to have a full parliamentary sitting in the early part of next year. Instead, we should go into committee and deal with it there. And then when we are satisfied that the issues can be brought out into the open, we will debate them fully in Parliament. As soon as we start talking next year, the legislative craftsmen should begin their work. On the basis of this programme, I believe we can meet the deadline to the day, promulgating a new Constitution which has been accepted by both houses on 25 July 1997. So I am very hopeful.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Without prejudging the final outcome, do you envisage a move away from strict communal separation ? I am thinking here, in particular, of the separate voting lists ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think there may be provision for some cross-communal voting. There was something like this in the 1970 Constitution which had both communal and national rolls.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What about the longer term. Do you foresee a political system developing in Fiji where ethnic origin is irrelevant -  perhaps a 'right-left' divide, if that is still a meaningful concept ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I am not bold enough to say that that will happen. I have seen the darkest side of Fijian nationalism. I have seen the fear that was in the Indian population in 1987. But if we move too quickly to remove the racial safeguards that are in the Constitution, we may run the risk of prolonging the bad relationship between the races that we now have. So I would say we should proceed very cautiously and let the natural healing process take its course. We also need to look beyond the Constitution at aspects such as our education system and enhancing the ability of the Fijians to compete.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· I believe the education system is also very divided.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Some schools are reserved for Fijians although, slowly, there are Indians from families close to the schools who are beginning to enter them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think that this is a promising sign for the future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think so. I went to a purely Fijian school and when I came out of that, everything was Fijian for me. I went straight into the army which is another Fijian-dominated institution. It was not planned that way. It is just the way it happened. My tolerance level of other races was very low. But you cannot expect somebody who gets to this level of leadership to have a low racial tolerance level. I must admit that the last ten years have been very, very educational for me - very good for my own being. I consider what I used to think before and the way I used to feel before. I have never been threatened by an Indian, but I had always been in Fijian 'safe' areas - a Fijian school and then in the army. But since coming out of that sort of cocoon, I have managed very well to accept that I have to compete with them, I have to look after them, and I have to devise policies and programmes that will be good for them as well as being good for us.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· One final question. Do you envisage Fiji seeking to rejoin the Commonwealth in the near future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think seeking is the wrong word. We will do what we feel is good for Fiji and its people. The people of Fiji are those who are here now but it will include some of those who have moved on looking for greener pastures and who are willing to come back. We were not expelled from the Commonwealth; our membership lapsed. It is up to the Commonwealth to say whether they are prepared to reconsider our member ship. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Profile</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Area: 18 272 km². Fiji has two main islands (Viti Levu and Vanua Levu) and about 300 smaller ones. It has an Exclusive Economic Zone of approximately 1.3 million km²). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population: 790 000</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population density: 43 per kilometre² </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capital: Suva (situated on the island of Viti Levu) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Main languaqes: English, Bauan </P>
+<P ALIGN="JUSTIFY">(main Fijian language)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Currency: Fiji dollar (F$). In June 1996, 1 ECU was worth approximately F$ 1.80. (US$1 = F$ 1.40) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p15.png"></center><br>
+ Fiji</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Politics</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">System of government: A bicameral parliamentary system consisting of an appointed Senate and an elected House of Representatives. The President is a non-executive head of state chosen by the Great Council of Chiefs. The President appoints the Prime Minister. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under the Constitution, adopted in 1990, the Parliament is divided along racial lines. The Senate has 34 members, 24 of whom are indigenous Fijians. In the 70-member House of Representatives, 37 seats are reserved for native Fijians, 27 for Indo-Fijians, 5 for 'general voters' (other ethnic groups) and 1 for Rotuma Island (whose inhabitants are Polynesian). The 1990 Constitution provides for a review within seven years and discussions are currently under way with a view to amending the Constitution by the 1997 deadline.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">President: Ratu Sir Kamisese Mara</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister: Major General Sitiveni Rabuka </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Main political parties: Soqosoqo ni Vakavulewa ni Taukei (SVT - Fijian), National Federation Party (NFP  -  Indian), Fiji Labour Party (FLP - Indian),  Fijian Association (FA - Fijian), General Voters Party (GVP).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Party representation in Parliament (1994 election result): SVT 31, NFP 20, FLP 7, FA 5, GVP 4, Others 3. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economy</P>
+<P ALIGN="JUSTIFY">GDP: (1995) F$ 2.85 billion</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Annual GDP per capita: approx US$ 2600 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GDP growth rate (1995): 2.2% (2.9% predicted for 1996) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Principal exports (1994): Sugar (US$ 182m), Garments (US$ 96m), Gold (US$ 43m), Fish (US$ 38m), Timber (US$ 21 m) Main trading partners (in order of importance):</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Exports - Australia, UK, USA, Japan, New Zealand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Imports - Australia, New Zealand, USA, Japan, Singapore.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade balance (1994): exports - US$ 547m, imports - US$ 826, deficit - US$ 279m. The current account figures also usually reveal a deficit but this is much smaller due to tourism earnings and official transfers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inflation rate (1995): 2.2%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Government budget (1996): revenue -  F$ 759m, expenditure  -  F$ 851 m, deficit - F$92 (about 3.5% of GDP) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Forma/sector employment: 98 112 (out of a total economically active population of about 265 000) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social indicators</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy at birth (1993): 71.6 years </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adult literacy (1993): 90.6%</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Enrolment in education: all levels from age 6-23: 79% </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Human Development Index rating: 0.853 (47th out of 174) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sources: Economic Intelligence Unit, UNDP Human Development Report, 1996, EC Commission. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">An interview with opposition leader Jai Ram Reddy</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'We need to move to a more racially neutral system'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji is not unique in having a political system that is heavily influenced by racial or communel issues In places as diverse as Northern Ireland, Belgium, Guyana and Trinidad - not to mention many parts of Africa - people vote for parties which claim to represent the particular ethnic, religious or linguistic group to which they belong. Where Fiji is different, however, is in having a Constitution that gives primacy to one particular community. Since the 1987 coup, native Fijians have held the upper hand with a guaranteed majority in Parliament and a firm grip on the levers or power.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 1990 Constitution, adopted when communal feelings were still running high, contained a requirement for a constitutional review within seven years. When The Courier visited Fiji (July 19961 the work of a three-member Commission appointed to carry out the review and make recormmendations was nearing completion. All sides seem to accept the need for reforms designed to help bridge the sharp racial divide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The big question is how radical these reforms are likely to be. We sought the views of Jai Ram Reddy, the leader of the opposition National Federation Party (NFP) which has the support of most of the country's Indian (Indo-Fijian) community.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You are the first opposition leader I have met who cannot, constitutionally, become Prime Minister. How do you feel about that ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is something that rankles with me - the mere thought that I am not equal with my fellow citizens of other races. I think that's generally the way the Indians feel here. All the constraints and limitations, the denial of basic human rights, are the source of a great deal of unhappiness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You talk about basic human rights. Obviously, the political aspects are very important but I get the impression that, in other respects, this is a fairly free and easy society: there is free expression, for example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, but free expression is only one aspect of human rights. The fact is that discrimination based on race is widespread and institutionalised. About 45% of the population is Indo-Fijian but you will find they are not fairly represented in the higher levels of the public service. At the Permanent Secretary level, there is definitely a government policy to have a limited number of Indians - and there are hardly any in the more crucial ministries. The same is true of managerial positions throughout the public sector. In the statutory bodies and major public undertakings, there is a deliberate policy of excluding Indians. So we are very much a marginalised community in the public sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Wouldn't it be true to say that Indians have quite a lot of economic power ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - No, I don't agree. There is a tendency for people who come here, end for some people in Fiji, to project this image of Indians controlling the economy. It is a fallacy. It all boils down to how you define economic power.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let's take natural resources. The land, and therefore the forests, are almost exclusively owned and controlled by native Fijians. Even in the corporate sector, the largest business undertaking is the manufacture of sugar, and 80% of the shares are owned by the government. The Indians don't own this industry. They are the small sugar cane producers working on ten-acre plots. And who controls banking and insurance ? Certainly not the Indians. Most of the financial services companies are foreign-owned.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The area where the Indians are most visible is in the retail sector. But those little shops you see in the towns are small family businesses. The shopkeepers work up to 15 hours a day, and you will discover that many of them do not even own their premises; they are tenants. So the idea that Indians control the economy is a bit of a myth. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The Constitution, and in particular the system of racial differentiation for voting and holding certain offices, is obviously a key issue for you. With the Constitution currently under review, what is your party's policy in this area ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The first elections under the current Constitution took place in 1992 and we took part in them under protest. We made clear that our participation should not be construed as acceptance of the system. Indeed, the sole issue on which we campaigned was our rejection of the Constitution. But we accepted the fact that we needed to get into the system as it was, and to try and create an environment where there would be widespread appreciation that it had to change. The 1990 text, in fact, laid down that it had to be reviewed by the seventh anniversary of its promulgation. I think the architects of the Constitution realised themselves that it was deficient. And we laid great emphasis on the need for dialogue; a general recognition that the country would be much better off with everybody working together and that there was nothing to be gained by oppressing or marginalising a community. And that is the kind of environment we have tried to create.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The Constitutional review will shortly be published. What do you hope will come out of that exercise ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I am reasonably optimistic. I think the environment is more favourable now and there is a general recognition that the system has to change. I am sure you will get confirmation of this when you talk to the government side. We need to move away from this very polarised, compartmentalised political system to a more racially neutral one. I think views may diverge as to how far we should go. That will be the contentious issue. But I believe we will make progress.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I certainly think we will get a good report from the Constitutional Review Commission. One of our fears, when we started on this journey, was whether it would be independent and be given fair terms of reference. Largely because of the cooperative and accommodating attitude that we ourselves adopted, and to which the government responded, we were able to get a Commission that was well-balanced. We are very fortunate to have Sir Paul Reeves, a former Governor-General of New Zealand. His independence is taken for granted. The Commission also has one nominee from the indigenous side and one from the Indo-Fijian side. So we certainly expect a good report. There is already a kind of acceptance I think on all sides that political parties need to prepare themselves for a more multiracial approach to governance in the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· On this point, I see that the SVT (the governing party) is looking at the idea of opening up its membership to other groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - That's right.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think there will be many nonnative Fijians interested in joining ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Not straight away but at least it is a beginning. It is an acceptance that they can't remain racially exclusive. If, for example, the Commission recommends a move toward a racially neutral system - at least for a certain number of seats - then it would be important for the SVT to have non-Fijians in their party.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Can I turn to economic issues, which I presume cannot be divorced altogether from political ones ? There is a lot of discussion about the future of the sugar industry which is tied in with the question of renewing the land leases This is an issue which is due to be resolved soon. How concerned are you about the impending decision on the leases ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - This is something that concerns us very deeply. As you correctly observe, you can't separate the political and economic aspects. The two are very closely interlinked here - perhaps more so than in other countries - because of the land situation. The bulk of Indian peasant farmers, both within and outside the sugar industry, are on leases that will begin to expire next year. If these are not renewed, the problem will not just be an economic one but an enormous human one. What do we do with these people who all belong to a particular racial group. It really boils down to our very survival. Despite the growth in the towns, the bulk of the people are still rurally based. They are small subsistence farmers, living in the country areas with no more than 10 or 12 acres to cultivate. So the social implications of non-renewal in terms of poverty, dispossession and hardship are enormous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· But how real is the concern ? Surely, the overwhelming economic logic is for the leases to be renewed. After all the land is being put to productive use at the moment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  Yes, but unfortunately, when you have a communal dimension to the problem, logic does not always prevail. If you think about it, there was no logic in the events of 1987. The trouble is that every issue here has a racial twist. After the coup, communal sentiments were aroused and sharpened. There was a prolonged period of anti-lndian propaganda and in that environment of anger, a highly racial constitution was adopted. There were people in positions of influence openly advocating non-renewal, threatening to take all the land back. Now they need to undo all this and it will not be easy, given the enormous strength of feeling that has been aroused. Having said this, I believe that we are now in the process of restoring sanity to our public life. It is also beginning to dawn on everybody that the sugar industry is vital for Fiji and it will continue to be so for some years to come.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· I have heard that view expressed on all sides, but I wonder if people are sufficiently aware of the implications of global liberalisation. It has been suggested that this will make sugar increasingly unviable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think a lot of people are unaware of the implications, because there has been very little public education in this field. But amongst those 'in the know', there is certainly an appreciation. I am a member of the Parliamentary Select Committee on Sugar and we were recently addressed by the head of the marketing company and the head of the Sugar Commission. At that level, there is an awareness, but if you speak to the average farmer who has been growing and selling sugar for many years, he will probably assume that life will just go on as before.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Isn't it true to say that sugar depends heavily on the Lom&eacute; Convention arrangement with the European Community ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Very much so. In my view, the sugar industry is run so inefficiently that but for the huge subsidy we get from the European Community, it would not be viable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Presumably, this means that measures must be taken to improve efficiency ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, absolutely. But the first issue to resolve is the land question.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is no point talking to the farmers about efficiency  -  asking them to improve their husbandry and focus on sugar content rather than the quantity of cane produced - when they don't know if they will have land to cultivate after next year. So you see all other issues have become completely subsidiary to the tenure question. At the moment, we are in a limbo. The government and the people urgently need to resolve this problem. Then we can put it behind us and address the other concerns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Are there any other economic sectors which you feel offer promise for the future of the country ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  Any growth outside of tourism will, I think, have to be centred on the agricultural sector. We need more agro-based industries and more diversification. We could grow a lot of other crops here - mangoes for example. We also need to improve extension services to farmers, and make an aggressive effort to identify markets. The farmers will grow the crops but they must be sure that somebody will buy them. Every year, for example, we have a glut of tomatoes - so many that they can't even give them away in the markets. This kind of problem kills the incentive to produce.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is obviously heavy state involvement in the running of agriculture. Do you see scope for more privatisation or 'corporatisation' in line with global trends ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think that growth, even in the agricultural sector has to be private-sector driven. At the same time, you have got to create the right environment and infrastructure for this to happen. Unfortunately, it keeps coming back to this question of land. If big investors, for instance, want to come here and invest in agriculture, they need to know what sort of tenure they are going to get and whether they can buy the freehold. I am sure there are people, particularly now from the Asian region, who would be interested in investing in agriculture, but the land problem is a big constraint.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Do you think Fiji will rejoin the Commonwealth at any point ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Well, we hope so. You know we are all very strongly in favour of rejoining. One of the things that I personally feel very strongly about is the unfortunate severance of our link with the Queen. I don't know, constitutionally, whether it can be restored. Obviously, there are difficulties in that area, but I think a large majority of ordinary people in this country would like at least to see Fiji back in the Commonwealth. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Seeking a lasting constitutional settlement</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When The Courier visited Fiji in July, the report of the Constitutional Review Commission headed by Sir Paul Reeves (former Governor-General of New Zealand) had not yet been completed  -  and what it would contain was a major topic of speculation. As readers will see from the interview we publish with the Prime Minister and Opposition Leader, the impartiality of the three-member Commission was not in question  -  at least within the political mainstream on both the native Fijian and Indian sides. Nonetheless, there were doubts about whether a consensus could be found. For the Indo-Fijians, a scaling down of the 'racial' features in the Constitution was seen as a prerequisite. Yet the ruling SVT, in its own submissions to the Commission, had effectively supported the status quo. In view of this apparently unbridgeable gulf, could the compilers of the Report come up with recommendations capable of forming the basis for a lasting constitutional settlement ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The long-awaited Report was formally transmitted to President Ratu Mara on 6 September and a few days later, it was tabled to a joint session of the Senate and the House of Representatives. It now falls to a joint select committee of the two Houses to thrash out a new set of constitutional proposals. These will be presented to Parliament for debate and decision in the first half of next year with a view to meeting the July 1997 deadline foreseen in the 1990 Constitution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Report of the Review Commission is lengthy (almost 800 pages) and contains no fewer than 697 separate recommendations. The key ones, however, relate to the system for electing members of the House of Representatives. Currently, separate electoral lists based on race are used to fill all 70 seats (37 native Fijians, 27 Indo-Fijians, 1 Rotuman and 5 'General Electors', covering all other races). It was widely expected that the Commission would propose a mixture of 'reserve' seats and 'open' ones, with the latter, as their name implies, being chosen by the whole electorate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">45 'open' seats proposed</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is precisely what they have done - but the suggested breakdown may have come as a surprise to some. The proposal is for 45 open seats (15 three-member constituencies) and 25 single-member 'reserve seats (12 native Fijian, 10 Indo-Fijian, 1 Rotuman and 2 'General Electors'). If adopted, the new system would no longer legally guarantee a majority for people of Fijian origin in the country's legislature. What would happen in practice would depend on a number of factors including the nature of the voting system in the three member open constituencies, the willingness of people to cast their ballots across the ethnic divide and the actual turnout of voters from the different communities. It should be pointed out, however, that native Fijians now constitute half the population, large numbers of Indians having emigrated over the past nine years. So long as communal voting patterns persist, this will presumably be reflected in the Parliamentary arithmetic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is also proposed that the bulk of the 35-member Senate (Bose e Cake) should be made up of elected representatives of Fiji's provinces. In the field of local government, it is suggested that the present system based on villages and provinces, which applies only to native Fijians, might be replaced by an arrangement applicable to all races. In this context, the rote of the Council of Chiefs (Bose Levu Vakaturaga) would be reduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the sections of the Report relating to representation are bound to attract most attention, the Commission also put forward a series of other proposals aimed at improving the governance of Fiji. One idea, which appears designed to alter the political culture, is for the 'Official Secrets Act' to be replaced by a 'Freedom of Information Act'. The presumption of secrecy would be replaced by a rule that official information should be accessible to the public except where there is good reason to withhold it. In a similar vein, the Report recommends an 'integrity code' to govern the behaviour of holders of public office.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Initial reactions to the outcome of the Commission's work were mixed. Key players, including the President, Prime Minister and opposition spokespersons broadly welcomed the Report but more nationalistic elements were quick to reject it and one group even mounted a ceremonial burning of the document.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is obvious that a great many more words will be exchanged - and some of them will no doubt be heated  - in the coming months. It is difficult to see how everyone can be 'brought on board' but the hope must be that a compromise can be crafted that is acceptable to the majority on both sides of the communal divide. The people of this Pacific island nation are well aware that prosperity and stability go hand in hand. The single most important achievement in ensuring stability for the longer term would be to secure a satisfactory settlement of the constitutional issue. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Sugar definitely has a future'</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was the key sentiment expressed by Isimeli Bose, Fiji's Trade Minister, when he spoke to The Courier earlier this year. Mr Bose insisted that 'no matter what anybody says, sugar will be the backbone of this country's economy for years to come.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When we discussed Fiji's current economic situation and future prospects with the Minister, it was not surprising that sugar should have featured so prominently. The sector faces a difficult future for both internal and external reasons. At home, the long-term leases granted to the farmers (mainly Fiji Indians) under the Agricultural Landlord and Tenant Act are due to expire over the next few years. No provision was made for their renewal and the resulting uncertainty has provoked widespread concern, not least among the leaseholders themselves. The external 'threat' comes from new international trade rules administered by the World Trade Organisation. At present, Fiji's sugar industry is heavily dependent on the preferential access to the EU market which was granted under the Lom&eacute; Sugar Protocol. No one is quite sure what will happen when Lom&eacute; IV expires at the turn of the century but it is clear that the stakes are high.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mr Bose was quick to acknowledge the importance of ending the uncertainty facing the sugar farmers. 'But the real challenge', he said, 'is to ensure the maintenance of our markets for sugar.' He was aware of the encroachment of global trade liberalisation but stressed that the industry's leaders and the government were 'doing the work now and planning for the future.' At the same time, the authorities are clearly hoping that the European Union will be able to continue with some form of preferential arrangement after the year 2000, if only to buy time so that the industry can adapt and farmers can diversify.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the subject of trade diversification, Mr Bose pointed out that 'the field is very limited'. He continued; 'However, since 1988, we have seen garment production picking up from very humble beginnings. By 1995, we had about F$185 million-worth of exports in this area.' He also spoke enthusiastically about the government policy of encouraging manufacturing in tax-free factories and zones. 'This developed well between 1989 and 1992 and then there was something of a slowdown.' Tax-free factories have been established in a number of locations and the first real tax-free zone is now being set up in Kalabo. Mr Bose indicated that EU assistance was being provided in this area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Privatisation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Our conversation then turned to the changing economic role of governments - throughout the world, they are withdrawing from active involvement in industrial and commercial operations. We asked how far this process had occurred in Fiji and, in particular, whether there was a privatisation policy. The Minister replied in the affirmative, pointing out that government departments 'do not usually make very good businesspeople.' The policy, therefore, was to 'corporatise' and 'privatise', although the process is still in its early stages. The Trade and Commerce Ministry has a public enterprise unit which is responsible for drawing up a policy framework for the government. In 1995, Mr Bose explained, a public enterprise bill was presented to Parliament, 'but there were so many concerns expressed to the previous Minister that it was referred to a select committee -  which, in fact was chaired by me before I took up my present poet.' The committee had now completed its work and the Minister indicated that the issue would go back to Parliament in September.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the legislative delay, Mr Bose was keen to stress that his department was already working on individual programmes. The post and telecoms business, for example, had just gone through another stage towards privatisation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is, of course, an important distinction between 'corporatisation' and 'privatisation' - the former implies staying within the state sector but at arms-length from the administration. This point was acknowledged by our interviewee who explained that the approach was a step-by-step one. The first stage was to reorganise a department along commercial lines. Corporatisation came next 'and then finally you have privatisation by disposing of shares.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He stressed that the most important aim was to ensure an element of competition wherever possible. 'There is no point simply moving from a government monopoly to a private monopoly', he insisted, 'although obviously, there are utilities like water, electricity and even telephones where this may not be easy.' The minister concluded; 'Where they are natural monopolies, we will regulate them.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Our final topic of discussion was the possibility of regional integration in the Pacific.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How far had the South Pacific countries gone in this direction and did the Minister think there was a need for closer economic cooperation? Mr Bose replied that he thought economic integration was a good thing. He pointed to a document on his desk containing a draft proposal for a bilateral trade agreement with Papua New Guinea. 'We will soon be holding negotiations with them, and have also just signed an agreement with Tonga.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The focus on bilateral trade arrangements at this stage suggests that the region still has some way to go on the regional integration path.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But the Minister nonetheless insisted that it was something 'that can and will happen'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Our daily bread - courtesy of a remarkable Fijian businesswoman</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How can a businesswomen succeed in Fiji's patriarchal society? Mere Samisoni, the entrepreneur behind the 'Hotbread Kitchen' gave us an appropriate answer when she said 'I roll with it', although the pun was probably unintentional In fact, it is difficult to imagine this dynamic lady being pushed around. Anybody who manages to build up a chain of bakeries from scratch, capturing 35% of the country's urban consumer market in the process, must have a lot of determination. At the same time, Mrs Samisoni displays a strong sense of social commitment. She believes in community values, advocates group decision-making and consensus, and even describes the tax system as 'reasonably fair'. In short, she contradicts the widely-held view propagated by lurid American TV series, that a dogeat-dog attitude is needed for business success.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact, Mrs Samisoni started out with the idea of working with one of the caring professions. Trained in nursing administration in Australia and New Zealand, she returned to Fiji only to find that there were no openings available. That was when she decided to go into the private sector, establishing 'Samisoni Enterprises'. And over the years, she has succeeded in building up one of the largest bread-making operations in the country. The Hotbread Kitchen operation is highly decentralised with the bread being baked in different locations for sale through the company's local outlets. Her business is also the first Fijian one to franchise out its operations. And having already won a big chunk of the urban market, she is now looking to expand operations in the rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Samisoni Enterprises, of course, is not simply a bread-making operation. The company now offers a line of 62 separate bakery products, with some local adaptations to suit varying tastes. It employs some 275 staff with perhaps another 50 working in the related franchise operations. And the business had an important breakthrough when it won the contract for 'MacDonalds' in Nadi. With branches of the famous hamburger chain likely to open in other parts of Fiji, this could be the start of something big. In fact, there is even a suggestion that Fiji could be used to source Macdonalds' operations in New Zealand, the rolls (or buns, as the Americans like to call them) being exported frozen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Constant quality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For Mrs Samisoni, the key to a successful and profitable operation is 'constant quality' and unfailing attention to customer service. As she puts its, 'if you let quality slip just once, you can end up losing customers for a very long time.' Baking is a labour-intensive business and she is keen to stress the importance of developing people's abilities - in particular, the human relaitons skills of those who deal direct with the customer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As if running a business wasn't enough, Mere Samisoni is also busy completing a Masters in Business Administration (MBA) at the University of the South Pacific, with a thesis on indigenous business. From what we discovered, speaking to this remarkable Fijian entrepreneur, she should have been helping to teach the course! </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Viti Levu - island of contrasts</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Anyone from overseas who is travelling to the Fijian capital, Suva, will soon discover that the country's largest island is a very diverse place. Roughly circular in shape, Viti Levu provides more than half of Fiji's total land area and is home to about three-quarters of the population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The journey to Suva on the south-east coast will almost certainly involve transiting through Nadi International Airport (pronounced Nandi) which is situated in the west. This is the country's only major international gateway and while it is ideal for tourists heading for the resort hotels, it is less convenient for business travellers whose destination is Suva. Their journey has to be completed either by road (which takes several hours) or on one of the small commuter planes which ply regularly between Nadi and Nausori (itself a half-hour drive from the capital).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The biggest surprise to those who are unfamiliar with the country is that the west and the south-east have very different weather patterns. When your aircraft lands at Nadi, the chances are high that the sun will be shining. On reaching Suva, you are more likely to encounter rain. This part of the country enjoys - if that is the correct term - a micro-climate which is good for tropical vegetation but less appealing to human beings. The 'blame' for locating the Fijian capital in such a spot is said (not too seriously) to lie with the country's former colonial rulers. According to the story, a British envoy visited Suva on one of its rare sunny days and, on the strength of this, designated it as the seat of administration. The British can hardly deny their involvement since it was in 1882, during the early years of colonial rule, that the capital moved from Levuka (situated on the much smaller island of Ovalau). But the key reason was almost certainly the fact that Suva, with its large bay, could be developed as a port. Whatever the explanation, one must have some sympathy with the foreign diplomats who keep a raincoat or umbrella to hand at all times, and yet are viewed with envy back home because they have a 'paradise' posting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To be fair, Suva has attributes other than its weather which make it an interesting place. It has, for example, some very attractive architecture, both local and colonial. The views across the bay can be dramatic - and, in this respect, the rolling cloud formations may actually enhance the picture. And the centre of the city buzzes with activity (except on Sunday because of the Sabbatarian influence).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The population of the greater Suva area is about 160 000. This may not be enormous, but it is the largest concentration of humanity to be found between Hawaii and Australia. In some ways, it is the 'capital' of the South Pacific - a point which is underlined by the fact that the Forum Secretariat is based here. It is also the site of the University of the South Pacific's main campus. The local population is mainly ethnic Fijian but there are Indo-Fijians as well as citizens of Chinese and European extraction. Add to this the diplomatic corps, foreign businesspeople and students from other parts of the region, and you get a very cosmopolitan mix. This is reflected in the variety of cuisines available in the local restaurants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The western part of Viti Levu is also cosmopolitan but in a very different way, with a stronger Indian influence and, of course, a constantly changing tourist population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most of the island's inhabitants live a relatively short distance from the sea. Thus, in demographic terms, Viti Levu is like a doughnut with a thick layer of humanity around the edge and a hole in the middle. The analogy may not be entirely apt since the 'hole' is, in fact, a spectacular mountainous area. This makes the road that runs round the island a key arterial route. Meanwhile, those who choose to fly from Nadi to Suva, assuming they are not of a nervous disosition, can enjoy the experience of travelling below the height of the surrounding peaks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The few people who do occupy the central region live in traditional Fijian villages and have a lifestyle far removed from either the town dwellers or the sugar cane farmers. Its size may be little more than ten thousand square kiLom&eacute;tres but Viti Levu is truly an island of contrasts. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Fiji-EU cooperation: comprehensive package</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Ernst Kroner</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji was a signatory of the first Lom&eacute; Convention in 1975 and, to date, the country has been allocated some ECU 190m in EU development cooperation funds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Starting with a relatively modest ECU 9.9m under Lom&eacute; I, the national indicative programme rose to ECU 13m under the following Convention. Without neglecting rural development (feeder roads in Vanua Levu), under Lom&eacute; I most of the resources were devoted to transport infrastructure (a main road on Vanua Levu). Under Lom&eacute; 11, cooperation concentrated clearly on agriculture and rural development, in particular by means of the funding of microprojects, with infrastructural programmes (the extension of the Vanua Levu road, social infrastructure) taking second place. Under this Convention, a new field of action was also addressed: trade development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tax free zone</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade development was addressed further under Lom&eacute; III (6th EDF, ECU 20m, of which ECU 5m in special loans), with support given to an Investment and Trade Development Programme. The longer-term objective of the project was to widen the economic base of Fiji and to create employment. The more immediate objective was the i establishment of a Tax Free Zone near Suva. In order to promote this scheme and to secure markets for exporting the goods which would eventually be produced, the project included a programme of trade and investment promotion to be implemented by the Fiji Trade and Investment Board. Due to problems linked with identifying an appropriate site, the project, which had been given the go-ahead in 1990, only came on stream in 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rural and agricultural development continued to be one of the main sectors of cooperation, with the funding of three major projects. The first was a coconut rehabilitation and development project, situated on the island of Taveuni, which aimed at improving the productivity of coconut plantations through the introduction and multiplication of high yield hybrids. The project also provided for the establishment of a 30 hectare coconut nursery centre, which was expected to finance itself through the sales of seedlings. EC support for this project ended in 1992, since when the scheme has been taken over by the Government. A second project (a large-scale microprogramme divided into two sub-programmes) aimed on the one hand at the construction of access roads to facilitate the development of cocoa plantations, and on the other at the introduction and development of pineapple plantations in Vanua Levu. The first component was closed after disappointing results. The second component, however, produced very interesting and promising results, which will, however, need private and governmental support in order to become sustainable. A rural electrification project involving 28 rural electrification schemes and the supply and installation of a small power plant is still ongoing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Developing human resources</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under Lom&eacute; III, the formerly prominent transport infrastructure sector lost some importance. The Kubulau Peninsula road project on Vanua Levu brought to an end the work started under previous Conventions. This road, which filled the last gap in the circuminsular road, was opened on in July 1994. Lom&eacute; III also saw the beginning of human resources development as a new theme of cooperation, with Technical Assistance funded for the logging school. This area, embodying strong links with forestry and environmental issues, has been further developed under Lom&eacute; IV with the reconstruction of the school burnt down in 1993, and the enlargement of the training and education provided to what now constitutes a Forest Training Centre.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The national indicative programme relating to the first protocol of Lom&eacute; IV (7th EDF, ECU 22m in grant aid) identifies rural development and social infrastructure as the sectors of concentration to which 65% of resources are to be devoted. The remaining 35% will be used for non-focal activities, including trade and services, tourism, cultural cooperation, training and technical cooperation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Building bridges</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately, it was only following the very destructive cyclone Kina in January 1993 that cooperation activities could start in the form of the rebuilding of four bridges either severely damaged or completely destroyed by the post-cyclone floods.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Work on two smaller bridges of major importance to Viti Levu (Korovou and Vunidawa, ECU 1.135m) was started in 1994 by the Public Works Department and completed in January 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Financing Agreement for the two major bridges (ECU 10.24m) was signed in June 1994 and provides for the rebuilding of the bridges of Ba and Sigatoka. These form part of the main road around the island of Viti Levu and are therefore vital for the movement of people and goods on Fiji's main island. The new bridges, 190 and 182 metres long respectively, will be two-lane, and will provide for footpaths and utilities. To enable the traffic to by-pass the often congested towns of Ba and Sigatoka, new sites for both bridges have been chosen, which also call for the building of new approach roads. Building works were under way in early 1996 and completion is expected by April 1997.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Non programmable aid for Fiji has been considerable over the years. While Stabex transfers for losses on coconut oil (totalling ECU 5.4m under Lom&eacute; I - Lom&eacute; III) came to a halt under Lom&eacute; IV (because levels of exports fell below the required dependency threshold), emergency aid (total ECU 9.5m) has continued, unfortunately, to be needed. Time and again the islands have been hit by cyclones (the most recent occasion being in January 1993, when the EU made available ECU 1 m for food rations following cyclone Kina).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the past, a significant feature of EU-Fiji cooperation was the credits provided by the European Investment Bank. It was very active under Lom&eacute; I to Lom&eacute; III, providing loans from its own resources to a total value of ECU 87.5m with a further ECU 6.1 m allocated in risk capital. Loans went to the energy sector (hydropower scheme), industry (wood processing) and services (telecommunications, sea and air transport). Considerable interest rate subsidies (totalling ECU 14.1m) have also been made available under the various EDFs in support of these loans. More recently, the EIB has financed an aircraft maintenance centre (1991) and a telecommunications project (1995).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Trade cooperation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over and above financial cooperation, Fiji benefits from the second largest quota (165348 tonnes per annum) under the Sugar Protocol annexed to the Lom&eacute; Conventions. This covers some 45% of its total sugar exports. The yearly benefit from this provision is estimated at between ECU 45m and ECU 55m - in other words, only slightly less than the total of all programme aid granted since Lom&eacute; I (ECU 64.9m). About two-thirds of these benefits reach the farmers, so that the EU subsidises every sugar smallholder, on average, to the extent of some ECU 1500 a year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recently, Fiji's quota under the Sugar Protocol was increased by 881 tonnes, as a result of the reallocation of the shortfall of deliveries by Barbados. Furthermore, Fiji benefits from an annual special tariff quota to the tune of some 30 000 tonnes up to the year 2001.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Industrial development and external trade have been supported by the relaxation of the rules of origin for exports to the EU of canned tuna to the extent of 500 tonnes a year from 1993 to 1996. A similar arrangement, applicable for certain quantities of garments up the end of 1993 was recently extended to the end of 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fiji's main exports to the EU (sugar, fish and garments) - and the resulting surplus in its trade relations with the EU - are consequently highly dependent upon the continuity of these preferences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Support for tourism</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the field of services, and specifically in tourism, the EU - through its support of the Tourism Council of the South Pacific - has contributed to the fact that every sixth tourist or so arriving in Fiji comes from a member country of the Union. Tourism being by far Fiji's most important source of foreign exchange earnings, receipts from European tourists amount at present to some ECU 30m, and are greater than those from the export of fish and fish products</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Taking the Sugar Protocol into consideration, the EU is by far the most important of Fiji's development partners, followed by Australia. The country also benefits from bilateral cooperation arrangements with EU Member States (UK, France, Germany). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Tonga</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Hoping to maintain harmony</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'None of the most civilised nations have ever exceeded these islanders in the great order and regularity maintained on every occasion, in ready and submissive compliance with the commands of their chiefs, and the perfect harmony that subsists among all ranks.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These were the words of Captain Cook who visited the Tonga archipelago several times on his voyages around the world in the eighteenth century. The famous explorer was obviously impressed by the social organisation of this island nation and, although it is more than two centuries since he undertook his Pacific voyages, many of his observations hold true today. Talk of submissive compliance may no longer be appropriate, but in contrast to the turbulence of much of the outside world, Tonga certainly ranks as a peaceful society, which is respectful of hierarchies and strongly attached to 'traditional values'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The reference to harmony is particularly apposite, as The Courier discovered when we visited Tonga earlier this year. It was fortunate that our trip coincided with the King's birthday celebrations and we had the opportunity to enjoy the superb choral music which plays a central part in many important ceremonies here. Like their Polynesian cousins in Western Samoa (featured in our last issue), the Tongans seem to have a natural flair for music and a talent for spontaneous harmony. The question is whether these 'Friendly Islands' - a name they certainly deserve  -  can maintain their reputation for social harmony into the third millenium.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In order to answer this, one has to identify where discordant notes could creep in. The biggest challenge appears to come from the process of globalisation. New technologies, particularly in the field of communications, are rapidly breaking down barriers. The tide of the international economic system, with its emphasis on mass production, con sumerism and free trade, is lapping at the islands' shores And political systems everywhere are under pressure to con form to a 'democratic' model which some would argue places the individual above the community. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of course, external influences can be both positive and negative Cultural exchanges can be enriching, and new ideas and techniques may offer opportunities for improving the quality of life. The key is to adapt without undermining the social fabric. And in Tonga, as in other countries, a harmonious future will ultimately depend on the way the country evolves both politically and economically.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Looking first at the current political set-up in Tonga, one cannot fault the use of the term constitutional monarchy which is the preferred description locally. It is important, however, to recognise that the constitution - which dates back to 1875 - gives considerable power to the monarchy. There is a measure of democracy in that all adults over 21 have a vote, but they only elect nine of the 30 Members of Parliament A further nine are chosen by the country's 30+ nobles while the twelve Cabinet Ministers, who sit in the House ex officio are nominated by the King. Tonga may' be small (it has fewer than 100 000 inhabitants) but it nonetheless attract: the interest of political scientists as one of the few remaining states with a hereditary ruler who wields substantial power.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Critics of the system view it as an anachronism, although their emphasis is on reform rather than revolutionary change. Defenders argue that the arrangement works well in a small, homogenous nation which values its unique culture and traditions (even if the constitution contains many 'British' elements). The latter also point, with some justification, to the attitude of the population. There are dissenting voices but the majority appears to be happy with the existing set-up, thereby lending it democratic legitimacy  -  at least indirectly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There may not, at present, be any overwhelming demand for constitutional reform but things can change. In particular, a people's view of their political system and how it might evolve is likely to be influenced by the prevailing economic conditions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic outlook</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tonga's economy is not exactly booming with the most recent estimates suggesting a 2% GDP drop in 1995-96. Several of the traditional problems faced by developing countries are to be found writ large here. The local market is not just small but tiny by global standards, and this makes it exceptionally difficult to achieve economies of scale. There is heavy demand for imported manufactured items and few viable export opportunities to balance the equation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The education system compares favourably with those of other developing nations but the pool is so small that Tonga inevitably suffers from human resource shortages. This is exacerbated by a steady 'brain drain'. Qualified Tongans, who may already have experienced life abroad at college or university, are tempted by a range of attractions including higher salaries, better housing and more extensive career prospects. The skills shortage is particularly severe in the medical profession. In a recent issue of Matangi Tonga (the 'national news magazine'), it was reported that the country would only have one anaesthetist by 1997 - with a local doctor observing wryly that there was no need for one since the main hospital's only specialist surgeon had recently left to take up a post abroad.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although it would be better for Tonga to retain its qualified people, the fact that the country 'exports' labour does have its positive side. Tongans have a strong sense of family and community, and overseas workers send significant amounts of money back home. This injection of 'foreign' funds boosts the local economy and reduces the overall balance of payments deficit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agriculture is by far the most important economic sector, with most crops being grown for local consumption. The islands benefit from a fertile soil and a tropical climate, allowing the cultivation of a wide variety of fruit and vegetables. All land is vested in the Crown, with estates allocated to the nobles. By law, each adult male is also supposed to be allotted three hectares although there is not enough land to go round. Despite this difficulty, which means that some people do not receive their allocation, the result is that most Tongans are involved in farming. The advantage of the arrangement is that it guarantees a living for the bulk of the population even if their cash income is low. On the other hand, it is obviously a feudal system which favours the upper echelons of Tongan society. In addition, it tends to hinder the development of larger units which could benefit from economies of scale. While anxious to make farming more efficient (and export-oriented), the government currently has no plans to introduce land reform.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In export terms, the main crop is squash (pumpkins). Production increased dramatically in the early 1990s when a market niche was identified in Japan and it soon became the country's biggest foreign exchange-earner. More recently, income has been depressed, with overproduction in 1994 leading to a drop in prices, and poor rainfall the following year reducing yields. The November export figures for the last three years (November is the month when squash deliveries peak) illustrate the extent of Tonga's reliance on this single product. In November 1993, the country's overall export income was T$15m - more than half of the annual total. Twelve months later, the figure had dropped to T$9m and last year, it fell below T$6m. When The Courier visited Tonga, the authorities were talking about limiting the amount of squash exported to Japan this year to 15 000 tonnes, in the hope of maintaining premium prices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government is also acutely aware of the risks of mono-dependence and is looking for other outlets for its agricultural produce. Demand for copra, Tonga's traditional export, has apparently been reviving, but the price has not been high enough to attract local farmers back into the market. Other crops sold abroad include vanilla, cocoa, coffee, black pepper and ginger.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One farmer who is doing his bit in the quest for export diversification is Masao Soakai, a former general manager of the Copra Board. He is now the managing director of a company that specialises in the import and export of produce. This energetic 73 year-old gave us a guided tour of the plots he had rented. He cultivates an astonishing range of different crops which include potatoes (for Fiji), cassava, taro, yams, carrots, broccoli, cauliflowers, strawberries, bananas and capsicums. He also rears cattle and pigs (a Tongan tradition). Masao Soakai stresses the importance of rotation in maintaining yields and believes strongly in planting for the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other sectors</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wherever you happen to be in Tonga, the Pacific Ocean is never far away. Evidence of the country's maritime tradition can be found in accounts of the appropriately named William Mariner (see box article on this page). But while, in the past, Tongan vessels sailed far and wide, and the country has a huge exclusive economic zone (EEZ), the fishing industry is relatively undeveloped. The sector generates about 5% of GDP. A project sponsored jointly by the FAO and the UNDP revealed that there was considerable scope for expansion, both in the inshore and reef zones and in the deep sea area. The main species which could be exploited commercially are albacore, skipjack and yellowfin tuna. Tonga has received assistance to develop its fisheries from the USA and Japan, and the government has offered tax advantages in the hope of promoting investment, but there is still a long way to go before the country realises its full potential in this area. Hitherto, the country has not licensed foreign vessels to fish in its waters but there is talk of this policy changing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tourism could also generate a lot more income although it currently faces a number of infrastructural and practical constraints. The government is committed to expanding the sector but Mrs Papiloa Bloomlield Foliaki, the owner and manager of Nuku'alofa's third largest hotel (the 'Friendly Islander') feels that a lot more could be done. She pointed out to The Courier that a healthy tourist sector would provide employment as well as stimulating new business for food producers, builders and craft industries. She focused, in particular, on deficiencies in training and marketing, and suggested that some of the resources allocated to agriculture might be better spent in tackling these.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tonga's natural assets make it a 'dream' location for visitors looking for a complete change of scene - particularly if they happen to be keen on sailing, snorkelling or scuba diving. The problem is that the country is so far off the beaten track that it is expensive to get to (some would see this as an advantage in deterring mass tourism). Nothing much can be done to change this but it does mean that they have to aim at the upper end of the market. This requires top quality accommodation  -  of which there is a distinct shortage at the moment. As regards marketing, Mrs Foliaki was hopeful that the recent formation of a hotel association would enable the Tongan tourist industry to raise its profile abroad. Despite her optimism - echoed by all those we spoke to in official circles - the latest figures for visitor arrivals show a downturn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the manufacturing sector, the story is, sadly, one of long term decline. Clothing production ceased in 1994 and the output of leather items has been falling. There are very few industrial activities in which Tonga has a comparative advantage (whether actual, or potential) and this is something which is recognised locally. There may be some scope for adding value to agricultural products through processing but it is unlikely that industry will take off in a big way in the foreseeable future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sale of passports (see the interview with Prime Minister Baron Vaea) is an issue which attracted publicity - not all of it favourable - some years ago, when the government launched the TPPP (Tonga Protected Person's Passport). This was designed to be a travel document which did not confer the right of residence in the country. The authorities adopted the scheme with an eye firmly on Hong Kong, a British colony which is due to be transferred to China in 1997. Some passports were sold but the project never really took off as the immigration authorities of other countries refused to accept the document. Now there are suggestions that the idea may be revived, although this time involving normal passports.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The foregoing survey of Tonga's economy does not paint a particularly happy picture but it should be stressed that there is very little real poverty in the islands. In many ways, the informal economy is more important, and subsistence agriculture and fishing ensure that people do not go hungry. With their traditional family structures and strong attachment to the Christian faith, the Tongans have not yet encountered many of the social problems associated with more consumption-oriented societies. But to paraphrase a famous saying, 'no nation is an island' nowadays - even if it happens to be surrounded by water! In an era of increasing globalisation, the key question is how to manage change. Let us hope that the people of Tonga can find the right answer. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview, Prime Minister Baron Vaea</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Constrained by our geography'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">No-one can accuse Tonga's Prime Minister of being a starry-yed optimist. As the following interview reveals, Baron Vaea, who heads a twelve-member ministerial team, is refreshingly honest about the economic difficulties facing his small island country. The Courier interviewed him in July, at his office in Nuku'alofa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You have suffered a GDP drop and a general slowdown of activity in recent years. What is the government doing to restore the situation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is true that the economy has been declining. The main cause is the excessive demand from the private sector for imports from New Zealand and Australia, combined with diminishing exports. Our exports fell when the price of copra dropped. Another problem is New Zealand's quarantine rules. New Zealand is very particular on quarantine against insects, notably fruit flies, which may damage their own export trade. We have endeavoured to balance this out by selling squash to Japan and indeed, it has been a saviour as far as our economy is concerned. Squash is something our farmers know how to grow. Of course, the market goes up and down. Recently, we made the mistake of over-producing and quite a lot of the crop could not be sold abroad. I think our farmers are now realising this, and that they have to plant according to the quota that we ourselves have imposed. Tourism is another important area although levels of room occupancy are very dependent</P>
+<P ALIGN="JUSTIFY">on the economic situation in other countries. Then there are passport sales.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Is this something you are still doing ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, but it has been hit by technical difficulties. A number of Hong Kong Chinese bought our Tongan Protected Persons Passport (TPPP) in the hope that they could travel. The immigration authorities in other countries decided they would not accept the document so this source of income dried up. We have changed to national passports which people can use to travel. We are hoping to revive this in order to suit the conditions of the Hong Kong people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Is this being done on the assumption that the people who purchase such a passport would not ultimately settle here ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes. The main reason people in Hong Kong want a passport is to keep open the option of leaving after the changeover.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Has this policy prompted any criticism from other countries ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - No. The main problem is the Chinese themselves who are due to take over Hong Kong next year. It is possible that they will not recognise these passports. We are planning to have discussions with the Chinese on this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Going back to the agricultural sector, are you not putting too many eggs in one basket in focusing so heavily on squash. What efforts are you making to diversify ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - We have just signed a trade agreement with Fiji. They are such a close neighbour yet we have had virtually no trade with them. This should change with the agreement, to the benefit of our economy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What products are we talking about here ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Mainly vegetables, particularly those that are favoured by the Indian community, such as chills and spices. A trade mission has just returned from Fiji where they picked up a number of orders. The representative of a group of growers also recently returned from Japan. He took a sample of dried pawpaw, a crop which is popular with the Japanese, and apparently received an excellent response. This is an area which is promising.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The key issue, however, is the amount of space available in the aeroplane. You can't ask everyone to grow pawpaw when the airline tells us that they can only take eight tonnes at a time. Only a limited number of farmers can be involved, so that we can continue to supply the tonnage that the airline can handle. We will encourage the rest of the farmers to concentrate on other products.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What is your policy regarding foreign investment ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - We encourage overseas investors to engage in activities that local people are not involved in. Land leases are available for anything they want to do which fits in with this policy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tonga has an extremely limited manufacturing sector and there appears to have been a long-term decline. What prospects are there for reversing this trend ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - For many years, the policy of the government has been to encourage exports. We have had entrepreneurs here who have exported things like woollen garments, small boats, horse saddles and so on - but it didn't last. The sad fact is that hardy anything is exported from Tonga. The main reason is that we are constrained by our geography. We are so far away from the main markets. The raw materials have to be brought in and by the time the article is finished, there is no way that it can compete in price terms. This has always been our problem. We are always looking for new markets but it is not easy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A second limitation is the private sector in Tonga. This is weak in terms of technology, marketing and product quality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What about further processing of local products - perhaps value-added agricultural activity ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, this is something that we would hope to do, though the same kinds of problem arise. People don't set up the processing plant because they say there isn't enough local cultivation to make it worthwhile. And the farmers don't grow the crop because they say there is no market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· So it is 'chicken and egg' situation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes. The result is that people only grow for home consumption.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I should mention here that there are other resources we have yet to exploit, notably in our waters. We have reserved these for ourselves and do not allow foreign fishing vessels. So we are trying to recover resources from the sea.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is also the possibility of drilling for oil. Research ships operating in the Pacific have found a limited number of locations where it would be worth looking for oil reserves and two of them are in our waters. We have been publicising this with a view to encouraging further exploration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· This would presumably involve drilling licences for oil multinationals.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes. Some companies have done this in the past although only on a small scale. The answer we got from the oil companies is that they are interested in exploitation - but not now because of the low oil price. When the price goes up, I think we may attract interest again but that is clearly only a long term possibility.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· A lot of young Tongans leave the islands to work overseas. What is the explanation for this ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is true that a high percentage of our population migrates. These are people in search of a better life, who seek to reap the benefits of their abilities by working overseas. They can have a nice house and get a good education for their children.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I should stress that we have a good education system here but there is a heavy emphasis on gaining qualifications in order to get into the civil service. Where we are lacking is in the field of technical education. We have some facilities of course - an Institute of Science and Technology and a Marine Institute to train people to go to sea. This is very much in its infancy and we hope it will help for the future. But even some who have gone through this system end up looking for jobs overseas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Turning to political issues, you have a monarchy here which is still very powerful. Do you anticipate any changes in the system ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - There has been some public pressure for change. I don't think people want a radical upheaval but there is a feeling in certain quarters that the present system could be improved upon. As you probably know, Parliament has nine members elected by the people and a further nine selected by the 28 nobles from among their own number. The third component is the government -  12 ministers who are appointed by the King. It has been suggested that qualified people who don't presently sit in Parliament should be there to help deal with the economy. One idea is to change the Constitution so that whole population elects 30 members. The King would then choose his ministers from these 30.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Has this idea made any headway ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  No, not so far. We are maintaining the old system. The proposal has been aired but it hasn't been passed in the House. There are a lot of people, I think, who prefer the present system because they feel the monarchy works for the benefit of all the people. Would a new team necessarily stick to this principle? There must be a danger that they would tend to favour just one section of the population.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Can you comment, finally, on Tonga' relations with its partners in development cooperation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - As you know, we have good relations with the EU through the Lom&eacute; Convention. We also have strong bilateral links with Australia and New Zealand which have been giving us assistance. But I think we have to face up to the fact that the aid cannot continue. The UK, for example, used to provide us with our judges. That has been taken over by Australia and New Zealand -  but for how long ? I think it is bound to be phased out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So we will continue to have relations with our partners, but we need to recognise that they are concentrating their efforts now and adapt accordingly. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Profile</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">General information</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Area: 669 km². Tonga has about 170 small islands and four main island groups (Tongatapu, Ha'apai, Vava'u and the Niuas). It has an Exclusive Economic Zone of approximately 700 000 km,). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Capital: Nuku'alofa (situated on Tongatapu) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population: 99 000 (1994 census) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population density: 149 per kilometre² </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy at birth (1992): 68 years Official languages: Tongan and English Currency: Pa'anga (T$) made up of 100 seniti. The currency is pegged to the Australian dollar. In September 1996, 1 ECU was worth T$ 1.57 (US$1 T$ 1.22)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p32.png"></center><br>
+ Tonga</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Polities</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">System of government: Constitutional monarchy based on the Constitution promulgated in 1875. Considerable powers remain vested in the King. The Parliament has 31 members  -  the Speaker, 12 ministers (including the Governors of Vava'u and Ha'apai) who are appointed by the King, 9 nobles chosen by the 33 members of the nobility and 9 People's Representatives elected by universal suffrage. There are no political parties although there has been talk of setting up a 'people's Party'. The twelve cabinet ministers hold office until they reach retirement age.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Head of State: King Taufa'ahau Tupou IV</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prime Minister: Baron Vaea of Houma</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economy (estimated 1995 figures unless otherwise stated) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Annual GDP per capita: approx US $1900</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">GDP growth rate: -2% (1995/96)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Principal exports: squash, vanilla, manufactured goods and fish. In the early 1990s, squash accounted for more than half the country's total export income. In 1995, however, the harvest was affected by drought and exports dropped significantly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Balance of payments: A trade deficit of US $38.8m (exports  -  US $18.3m, imports  -  US $57.1 m). The current account deficit is much smaller thanks to 'invisible' earnings, notably from tourism and remittances from Tongans living overseas. Inflation rate (April 1995): 4.5%. Total external debt: T$ 44m (1993)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sources: Tonga in Profile (on the Internet -  http: 11l www. netstorage. com/kami/ tonga) Economic Intelligence Unit Country Report 1996. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Interview with peoples representative, Teisina Fuko</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'There is much more political awareness'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">People's representative, Teisina Fuko offers an alternative view</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While Tonga has no political parties, and the main levers of power remain in the hands of the monarch, it would be a mistake to conclude that there is no questioning of the status quo in this small Pacific kingdom. As The Courier discovered on its recent visit, Tongans are happy to speak openly about their political system and to criticise (or praise) aspects of it me local media may not be particularly extensive but it nonetheless allowe for different viewpoints to be expressed, including criticism of the authorities. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Those who advocate political reforms in Tonga face something of an uphill struggle. There is no overwhelming demand for change and although the lever of popular support for the current system is not easy to judge, there appears to be widespread acquiescence  -  which effectively amounts to the same thing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years, the focus of 'opposition' has tended to be within the ranks of the people's representatives who sit in Parliament We spoke to one of these elected members, Teisina Fuko, who comes from the Ha'apai island group and began by asking how democratic the thought the system was.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I would say about 50%. Up until the 1970s, the system was very traditional but we now seem to be westernising quite quickly. People are returning from overseas with different ideas and this is having an impact on the way we are governed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think you will ultimately have a Parliament whose members are all elected by universal franchise ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I would say it is more certain now than ever before. There is much more political awareness. We see it in the schools, where children are being taught to think independently. There are also the new economic trends -  commercialisation and the focus on foreign earnings which imply the need for modernisation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You sound quite enthusiastic about the 'westernisation' process. Are you not concerned about the possible negative aspects in terms of the survival of your traditional culture ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think we have to strike a balance. We mustn't go to extremes. Our culture and traditions are important but there are new things we need to take on board and some old habits we should drop. Take business opportunities: we have to be more democratic in this area. If one group has all the power then they will tend to favour their friends which isn't necessarily efficient. What it boils down to is a lack of checks and balances.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the present economic difficulties, I also think we need to move quite quickly. I recently wrote an article arguing that the King should transfer his power to appoint ministers to the people. Ministers should be elected so that they can be accountable to the taxpayer. We are a close-knit family here and there is no question of getting rid of the monarchy. But we need to sit down and hammer out a compromise which will allow us to improve our economy and make it more competitive.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Let me give you a practical example. Defence is now third on our list of priorities. That doesn't make sense to me. We would be better spending the money on economic development. We also need to boost the private sector so it can create jobs, instead of tying its hands. At present, 50% of our revenue goes on paying civil servants. What for 7 It may create employment, but it is not productive. So the government has to be minimised. Having said this, there are some positive signs. I am glad, for example, to see new blood being brought into the ministerial team.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Parliament is currently composed of three groups - twelve ministers, nine nobles and nine people's representatives. On paper, that suggests that no group can dominate ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">- Yes, but the ministers and nobles often work together and we are  outvoted. It is difficult to imagine the nobles saying 'no' to the King although, to be fair, they do sometimes abstain and some of them recognise the need for certain reforms to the system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Turning to the economy, which areas do you think offer the best development prospects ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">-  Tonga's potential lies in fishing. We are an island nation that has always depended on the resources of the sea and we have the necessary labour force. What the people need is the know-how  -  advanced technologies to develop this sector. We also have to set up credit programmes so that people can invest in boats and equipment. I believe we should spend a lot more on fishing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unfortunately the government does not take the same view. It has put a lot of resources into small industries, airlines and so on. Yet the reality is that these sectors are in decline. Manufacturing has fallen and so have agricultural exports. Fishing is the only sector that is expanding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· What about the prospects for agriculture ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think we have reached the limit in this sector. There is very little scope for expansion. I also believe we should be concentrating on what we can produce to use locally. There is very little more we can do in terms of commercial exploitation. Tonga is somewhat overcrowded and we cannot use too many chemicals because the water table is so low.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· One local issue, which presumably has economic implications, concerns the possible expulsion of foreigners who have been here for a certain amount of time. Apparently, the decision has been taken not to renew certain residence permits. What is your view on this ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think Tonga should encourage skilled people who are here to stay. We should use make use of their skills, particularly where they have expertise that is lacking locally. At the same time, there are some people here who just came for a visit and ended up staying without doing anything very productive. There are also a number who came after the coup in Fiji and I think we should give them some leeway.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the whole, I don't think it is a big problem. Tonga has traditionally been very liberal in the application of its immigration law. We have never been colonised so we tend not to have a suspicion of foreigners. And whatever we do must be in accordance with the law.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Could you sum up your vision for the future ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  You only need to look around you to see that we have a youthful population here: a lot of young people who need to be catered for. We are investing heavily in education which I think is good but we need to do more to adapt to the changing world. We were peaceful in the past because most Tongans were on roughly the same level in terms of wealth. Now the poor are getting poorer while the rich get richer. This could lead to an increase in social tensions. With a more democratic system, we should be able to close the gap and work for a peaceful and more prosperous future. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Seeking business overseas</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">New Minister outlines economic strategy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If the policy of appointing Ministers for life - or at least until retirement age - is maintained, then Dr Giulio Masasso Tu'ikolongahau Paunga can look forward to a long career in the Tonga Cabinet. At just 32, he has recently been been given the job of Minister for Labour, Commerce and Industries (with responsibility also for tourism). He may be relatively young, but the new minister has impressive academic credentials. He took a master's degree in Japan (in Japanese) and as we soon discovered, he has some new ideas about how to achieve economic development in his country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dr Masasso's portfolio covers a wide range of economic activities and we began by asking what he thought the main focus of his work would be. He identified three areas  -  agriculture, which is the single most important sector; fisheries which has potential for growth; and tourism. He would also like to see more manufacturing, particularly for export, but acknowledged that the current prospects in this area were very limited.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Looking first at agricultural production for export, we noted that a significant change had taken place over the last decade. Coconut-related products had been largely replaced by squash, a 'gap' in the Japanese market having been identified when other sources of supply were not available. Tonga may have been the first to spot the opportunity but was there not a danger that other countries might 'muscle in'? The government was 'very aware of this danger', said the Minister and was trying very hard to diversify its export products. He mentioned vanilla, papaya, beans and, in particular, carrots. The last-mentioned crop grows well in the islands and there is apparently a growing taste for carrot juice in Japan. A list of products with export potential, which could be grown successfully in Tonga, had been drawn up in cooperation with the Ministry of Agriculture, and Dr Masasso's department would be actively seeking new business overseas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The government is obviously interested in developing trade with Japan and other countries in Asia, but the Minister felt that New Zealand and Australia were likely to remain the principal markets for Tongan farm products in the future. He was looking forward to easier access to New Zealand once new quarantine facilities had been set up at the international airport on Tongatapu. This, he said, should allow for a larger throughput of export crops.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Efficiency, of course, is the key to winning and keeping overseas customers. With this in mind, our discussion turned to the land tenure system. The allocation (at least in theory) of parcels of land to all male Tongans discourages the development of larger farms or plantations. Was this the most effective way of exploiting the country's fertile lands? Dr Masasso acknowledged that the system hampered efficiency but stressed that the question was a very sensitive one. The right to cultivate a plot of land is deeply rooted in Tongan culture, and radical changes to the property laws are not on the agenda. As the Minister put it; 'We are trying to maximise our efficiency under the present system of land tenure.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Turning to tourism, Dr Masasso observed that 'this has been the most stable industry over the past ten years,' bringing an average of T$ 12 million into the country every year. In looking at possible growth, however, he stressed the need to take account of the environmental and cultural impact. 'Tonga is a very small country, and it would not be right to build too many hotels and related facilities. It might be possible, but the long-term effects would be a little too much for the country.' Dr Masasso said he favoured tourism which has 'e closer relationship with people -  a cultural exchange, targeting people who really wish to understand our country.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fishing is a sector which appears to have huge potential given the size of Tonga's exclusive economic zone. Dr Masasso explained how Japanese assistance was being used in a boat building scheme designed to produce vessels that local people could afford. He also spoke enthusiastically of the research that had been carried out to determine the nature and size of the fish stocks. He recognised, however, that while most of Tonga's fishing was inshore, there was scope for a great deal more revenue from deep-sea fishing. In this connection, negotiations were underway with the United States, Taiwan and Japan, to allow vessels from these nations to fish in Tongan waters. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The conversation then moved on to the more general issue of entrepreneurship and the role of the state in the economy. The Minister indicated that the government believed in privatisation but stressed that this was not simply 'because other countries are doing ft.' The main issue at this stage, he said, was to create a sufficiently large pool of well-trained people to take over activities currently run by the authorities. 'The government wishes it didn't need to get involved but we are a small developing nation, and to get things started, you need capital and know-how  - which locals sometimes don't have access to.' In these circumstances, the state had to activate projects which could later be privatised once the necessary skills had been built up. Another 'major strategy' was to develop a much closer relationship between the Ministry and the private sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This led us into a discussion about Tonga's attitude to foreign investors who might also be in a position to supply capital and know-how. The authorities had recently threatened that a number of residence permits would not be renewed. Was this not a disincentive to potential overseas investors ? Dr Masasso was keen to offer clarification. 'The media makes it look as if Tonga doesn't like investors but they have misinterpeted the situation. He insisted; 'we want the foreign investment here and are encouraging it in those areas where locals cannot get involved.' Defending the actions of the immigration authorities, the Minister stressed that what they were doing was normal practice. 'Those who stay here illegally and do not extend their visa have to be deported.' The action, he argued, was not directed against foreign investors and indeed, the latter should be encouraged by the government's commitment to upholding the law.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Tonga-EU cooperation</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Developing the Vava'u islands</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Myfanwy van de Velde</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EC-Tonga cooperation began in 1975 with the first Lom&eacute; Convention, soon after Tonga gained full independence in 1970. Grant aid totalling ECU 19.8m (Lom&eacute; I - Lom&eacute; IV) has been allocated to the country during its 20-year membership of the Convention.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under Lom&eacute; I, funds were directed principally towards two main projects: the construction of the wharf at Neiafu, Vava'u, and funding for the Ministry of Works to procure road maintenance equipment and build schools, rural health centres and small wharves at Ha'apai and Vava'u. Remaining funds were used to finance studies involving dredging, trade promotion and designs for Vava'u and Faua fisheries harbours. The EIB also financed a line of credit of ECU 130 000, under Lom&eacute; I, to the Tonga Development Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lom&eacute; II funds focused on the fisheries sector, and on initiating works relating to the upgrading of the Vava'u airport. There were also projects in the fisheries sector, aimed at encouraging fishermen to undertake commercial fishing to meet local demand. To this end, the Faua Fisheries Harbour for small boats was built, and marketing and cold storage facilities were provided.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By the time Lom&eacute; III funds came on stream, Tonga had adopted a regional development approach with regard to its various island groups. The aim was to have a coherent development programme taking account of the specific constraints and potential of each. The Vava'u group of islands became identified as the focal area for the use of EC assistance, and Lom&eacute; III resources (ECU 6.5m in grants and ECU 0.5m in the form of risk capital to be managed by the EIB) as well as Lom&eacute; IV funds (ECU 6m and ECU 1 m respectively) have duly focused on its development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Located in the north of the Kingdom, Vava'u is the second group of islands both in terms of population (16 000) and land area. With an abundance of natural resources, the group is thought to have greater potential for agriculture and tourism than other parts of the Kingdom. However, this potential was largely untapped at the time Lom&eacute; III was initiated. This was due to a variety of constraining factors including relatively low productivity, undeveloped marketing infrastructures, substantial import levels and poor distribution of utilities and other public services. One particular constraint preventing the development of tourism was limited access caused by a lack of transport infrastructures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two main projects aimed at addressing these problems have been implemented. The first, costing ECU 1.24m, involved completing the upgrading of the local airport at Lupepau'u (begun under Lom&eacute; II). In addition to runway improvements, a new terminal building was provided, complete with safety and navigational equipment. Passengers began using the new facilities in early 1995. The second project, entitled the 'Vava'u Development Programme', was allocated the sum of ECU 5m. This money is being used to pay for a series of activities including road upgrading, the provision of photovoltaic equipment for household energy needs and the supply of equipment for vocational training colleges. New buildings being funded include health clinics, a market and an agricultural quarantine building. The funds also cover the cost of establishing the Vava'u Development Unit as the monitoring and implementing agency for the programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Programme continues under Lom&eacute; IV, with about 85% of programmable resources for Tonga (approximately ECU 5m) set aside for activities in the focal area. Funds will be directed towards developing the Neiafu urban area, in recognition of the need to upgrade access and services in the commercial centre of Vava'u. The projects envisaged include upgrading the town centre and urban roads, port improvements, and measures to increase the capacity and improve the distribution of piped and rain water to households. In addition, a multi-annual micro-projects programme will lead to the construction of jetties on the inhabited outer islands of Vava'u, thereby improving access to Neiafu which is the main centre of the archipelago.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to the above grant aid, Tonga has received funds in the form of Stabex transfers for losses in export earnings in respect of coconut products, bananas and vanilla. It also received emergency aid in 1977, following an earthquake, and in 1982 following Hurricane Isaac.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EIB interventions have contributed to the share capital of the Tonga Development Bank and have increased the Bank's lending capacity to small and medium-sized enterprises. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Switching on the Iights</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Uelingatoni Tevita Vaea (known as 'T' to his friends), proved to be a mine of information for The Courier, when we visited the Vava'u island group in northern Tonga recently. 'T' is a Tongan engineer who returned to his native land from Australia to work as assistant project manager in the Vava'u Development Unit. His help was particularly useful during the highlight of our visit - a traditional celebratory feast laid on by the villagers of Nuapapu. This is one of Vava'u's inhabited outer islands and the celebration was staged to mark the installation of solar powered lighting, courtesy of Lom&eacute; Convention funds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nuapapu is one of a number of outlying villages to receive solar installations under the Vava'u Development Programme. In all, some 350 homes have been wired up. Units attached to individual buildings collect the power and convert it into electricity which is stored in a battery. When night falls, the lights can then be switched on. Although the bulk of the installation costs are covered by the project, each participating household is required to pay a lump sum to have a unit fitted. They are also contracted to pay a modest amount each month towards maintenance of the system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It may all seem rather prosaic to those of us accustomed to electrical power at the flick of a switch, but for the people of the villages in the Vava'u group, the project is little short of revolutionary. For centuries, their daily rhythm has been governed largely by the rising and setting of the sun. The only 'artificial' light available after darkness came from fuel-burning (and more recently, battery) torches or lamps  - enough perhaps to reveal a path or highlight the position of an object, but certainly not to read or do intricate work with one's hands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The formal 'switching on' ceremony was performed by the Dutch Ambassador, Mr van Thessen and Jonathan Rodwell, who is the European Commission's resident advisor in Tonga. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This was preceded by a courtesy visit to the village chief and the above-mentioned feast, which gave the European visitors an authentic and memorable taste of traditional Tongan hospitality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The food was brought from all quarters of the village on long rectangular trays covered with leaves. Each was laden with food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fare was predominantly local: the famous roast pigs featured prominently along with fish, chicken, bananas, coconuts and a variety of root and tuber vegetables.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were also some 'imported' items: the corned beef which is so popular here, some packets of crisps to add colour to the guest 'table' and boiled sweets woven into garlands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The trays were laid end to end, stretching perhaps 20 metres and woven mats were placed all around. Having received our garlands of flowers, we were invited to sit down.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The feast was interspersed by various speeches and 'T' helped out with a translation and explanation of the proceedings. We began with a prayer in Tongan, delivered by the local minister. This was followed by a speech of welcome and thanks by the matapule (spokesman) of the village chief.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">High ranking people in Tonga always have a matapule to speak on their behalf on such occasions. Ambassador van Thessen and Mr Rodwell then replied on behalf of the guests, (in English, with consecutive translation provided).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They expressed thanks to the people of Nuapapu for their hospitality and wished them success with their new electric lighting. There was then a short discourse by the District Officer followed by a closing prayer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">References to all this speechmaking could leave a false impression that this was a formal and stilted affair.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact the reverse was very much the case: the mood was relaxed throughout and there is no doubt that the villagers know how to enjoy themselves. Music was supplied by a group of men playing a variety of instruments and the women joined in the festivities with what appeared to be spontaneous bursts of dancing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were also special solo dances performed by two young ladies whose bodies had been smeared with coconut oil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As tradition dictates, once their performances (involving highly expressive hand and finger movements) were complete, the audience expressed their appreciation by slapping banknotes on the oily exposed surfaces of the dancers' bodies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The light was fading as the feast ended and we moved to the brief 'lighting up' ceremony, carried out to the accompaniment of applause.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The guests (including the staff of the Vava'u Development Unit who have guided the project through its various stages) then took their leave of this hospitable community and set off by boat on the return journey to Neiafu. As the vessel drew away from the shore, we were able to look up and see, for the first time, the twinkling lights of Nuapapu. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Dossier</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Habitat</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Livable cities and rural rights</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(Dossier coordinated by Debra Percival and  Claude Smets)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The United Nations Conference, Habitat 11, on human settlements (Istanbul, June 3-14 1996) exposed the Herculean task of addressing the problems of ever-growing cities and called for 'shelter for all.' The special contribution of civil society in making cities more liveable was acknowledged at the conference - but the big question is, who will foot the bill ? The meeting also spoke of improving dwellings in rural areas to keep people on the land and halt the mass exodus to the cities. But the right to remain and prosper from one's habitat can be at odds with outside pressures for environmental conservation. The dossier looks at some of the issues raised by the conference, and the wider significance of 'Habitat II' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second UN gathering on the theme of 'habitat', staged two decades after the first conference in Vancouver, took place against a backdrop of rapid and alarming urban growth. In 1900, one person in ten lived in a city. By 1948, the ratio was three in ten and by the year 2000 half the world's population are expected to be urban dwellers. 25 years after that, the figure is expected to have climbed to 60%. Africa is the region that currently has the highest rate of urban growth. In 1950, it had only one city with a population of one million. By the end of this decade there could be 60 cities of this size, according to UN figures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The focus on human settlements and liveable cities inevitably meant that Habitat II covered some of the same ground as other UN conferences convened during the 1990s to explore the big issues facing mankind: the 1992 'Earth Summit' on environmental matters in Rio de Janeiro, the 1994 Population Conference in Cairo, the 1995 Social Summit in Copenhagen and the 1995 Women's Conference in Beijing. Issues common to all the agendas included rapid population growth, environmental degradation, access to clean water, poor sanitation, lack of infrastructures, and women's issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The rallying calls of Habitat II, set out in the Conference's conclusions, were 'shelter for all' and 'sustainable human settlements in an urbanising world.' The Nairobi-based Centre for Human Settlements is to be the focus for the follow-up. But as delegates dispersed, one of the pressing questions was where the money will come from to meet the host of agreed objectives -  which include clean water with improved technology, conservation and protection of the environment, and better health and education. In this dossier, European Commission officials from the Development Directorate General, who attended the conference, reflect on Istanbul and its likely followup.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whereas in the past, cities were associated with economic development, innovation and the diffusion of new ideas, nowadays they conjure up the vision of urban poverty, environmental degradation, poor sanitation and a host of health hazards. Urbanisation is the direct consequence of rapid population growth, according to the 1993 Human Development Report. In 1965, agriculture provided 77% of employment in developing countries and represented more than 41 % of Gross Domestic Product. By 1985, this sector was contributing a lot less to GDP but was still providing 72% of all employment. So a large number of people continue to depend on agriculture although its share of the global economy is declining. In these circumstances, it not surprising that many of the world's poorest people are migrating to cities - the annual estimate is 20-30 million.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The dossier looks, in particular, at the environmental cost of rampant urbanisation and at the problems of city living for more vulnerable groups such as women. They are often among the poorest urban dwellers and can fall victim to exploitation and crime.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Paradoxically, poor people in cities are becoming even poorer as economies improve. Additional pressures on these marginalised groups living in cities are neatly summed up by Jeremy Seabrook, author of 'In the Cities of the South.' In a recent article for Gemini news agency: 'Tougher Struggle for Survival in the Concrete Jungle,' he writes; 'As the pace of development quickens, with high economic growth and increased migration to urban areas, land price in most big cities have soared. Poor people are being increasingly removed from their hoary" - by mysterious fires, explosions and 'accidents'. Meanwhile, the urban poor's ability to mobilise and achieve has been used against them. The capacity of people to create homes and secure local communities has been used as a justification for the withdrawal of government services.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He continues: 'As inequalities become more glaring, enclaves of prosperity are sealed off from the slums by checkpoints, guards and fences - like frontiers to another country. Despite this, people are still flocking to the city  -  often refugees from intensifying, industrialised agriculture and.. megaprojects in the countryside...' Mr Seabrook points out that without decent jobs, they fall prey to sub-contractors, who exploit them, offering them low pay and demanding that they work long hours.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Civil society</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the cities of many developing nations, 'civil society' is taking a lead, with projects to bridge the gap between the 'haves' end the 'have note'. Numerous participants at the Istanbul conference applauded the urban programmes undertaken by various elements of civil society, which include NGOs, community groups and individuals. Their significance was recognised in Istanbul, where their voice came through loud and clear. Nigerian journalist, Paul Okunlola, writing in this dossier notes a move towards 'bottom up' projects in Lagos as a result of the tough times.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agostinho Jardim Gon&ccedil;alves, the President of the NGO-EU Liaison Committee, was particularly pleased at the input of civil society to the conference's committees and conclusions. The debate, he said, had not just been about the macroeconomic aspects. Instead, it had come 'within the reach of the populations themselves.' The people, he argued, were both victims of the anomalies of inhumane settlement and the key players in efforts to construct a humane, dignified habitat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jeremy Seabrook describes some of the inspiring international initiatives undertaken by civil society. Examples include the Society for the Promotion of Area Resource Centres (SPARC) in Bombay, which works with pavement dwellers; the Association of Basic Needs (ARBAN), and 'Health for All' in Dhaka; the Eddie Guazon Foundation in Manila, which seeks to protect the poor against private interests; and the Foundation for Women, which is trying to tackle the trafficking of girls for Bangkok's brothels. But Mr Seabrook also warns against overestimating the strengths of popular organisation. As he points out: 'They require an enabling and positive framework, which the free market can never provide. Government intervention, of a more benign and positive kind than hitherto, is vital if people are to help themselves. As it is, too often they are forced to struggle against the people elected to govern them.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The chair of the Habitat Conference, Wally N'Dow, emphasised local solutions. The conference, he said, 'recognised the changing global patterns of life' and that solutions must be found at the local level. 'National governments and international agencies', he argued, were not in a position to solve massive urban problems or to pay to put them right.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were a number of donor pledges at the conference. The European Union countries, for example, reiterated their long-standing commitment to provide 0.7% of GNP for development by the year 2000  -  though many of the 15 member states are still well short of this target.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One scheme which has attracted the particular interest of donors is South Africa's Reconstruction and Development Programme (RDP). To a considerable extent, the success of President Mandela's government is likely to be judged on the success of this programme. It aims, among other things, to improve health, education, housing and sanitation and as such, it mirrors many of the 'Habitat II' goals. Launched in 1994, it is the centrepiece of the South African government's efforts to create a more democratic, prosperous, non-racial and non-sexist society. In the dossier, we look at the RDP's objectives, how it is faring and what sort of support the EU is giving.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rural rights</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beyond the city, the dossier looks at what is happening to some rural dwellers who have not taken flight to the city. Although, largely focused on the city, Habitat II acknowledged the importance of urban and rural linkages in its conclusions: 'Rural and urban settlements are interdependent... governments must work to extend adequate infrastructure and opportunities to rural areas to increase their attractiveness and thereby minimise... migration.' There was mention too of the need for more jobs and housing for rural areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But in some rural areas, the inhabitants have found themselves in dispute with conservationists. The latter seek to protect wildlife and the rural habitat by setting up national parks - a solution which is not necessarily in the interests of local people struggling to maintain their livelihood. We take a look at such dilemmas and the possible solutions being developed so that rural dwellers can continue to make the most of their habitat. This rural struggle, where solutions are also being called for at a local level, is not unlike the battle being waged for a better quality of life in the cities. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Towards a global concept of urban development - an interview with Daby Diagne</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Deputy mayor of the city of Louga, Daby Diagne is also President of the Finance Committee of Senegal's National Assembly, General Secretary of the Association of Mayors of Senegal and President of the World Federation of United Cities. He is the ACP-EU Joint Assembly's General Rapporteur on urban development and The Courier had the opportunity to interview him in September at the Assembly's meeting in Luxembourg.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You have just submitted an initial report on urban development to the Joint Assembly. In it, you recommend that the Community adopt a specific and consistent global policy in this field, notwithstanding the fact that successive Lom&eacute; Conventions have contained a number of significant provisions relating to the subject. What is the reasoning behind your recommendation ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - There are several reasons. First, there is the fact that, in the past, cities were often viewed solely in terms of infrastructures and sectors. Experience shows that this approach is not effective. Specialists are increasingly opting for a more global 'city' concept. The Commission must therefore adapt itself to the new situation. It is true that it has financed infrastructures and launched health and clean-up programmes, but the problem is that this has been done in a somewhat unsystematic way without being linked to long-term regional development or a zonal policy. There is now an increasing need for an integrated regional development approach. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think ACP countries are aware of the importance of cities ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That's another question altogether. Obviously, the ACP countries are in the process of changing their views on this subject and a number have appointed ministers to look after urban affairs. The reality of city life has to be taken into account. The rate of urban growth in the ACPs far exceeds that in other parts of the world and it is in the towns and cities that one sees the most glaring instances of poverty and under-development. People have therefore been forced to take the 'city' phenomenon into account in the ACP countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The political will must exist for a policy to be successful. Do the ACP countries have a genuine will to implement an urban policy ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I don't think it is possible to speak of a uniform trend in all ACP states. However, in certain regions - for example in West Africa, which I know well - a municipal culture is beginning to take shape. There is a growing political will, which is illustrated by the discussions on decentralisation, and people are increasingly recognising that central government cannot do everything by itself. One can find regional development and planning policies designed to create the fabric of mediumsized cities. Not everyone has them but it is something we are seeing more and more of.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· ACP countries face complex challenges and there are people who say that the actions of the European Community are too dispersed owing to the number of sectors it is involved in. Doesn't your recommendation simply add to this problem ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - On the contrary. I regard my recommendation as being pro-integration and therefore pro-globalisation  - which is not the complete opposite of a sectoral, diversified approach. I believe it would allow the Union's activities in certain fields to be better interlinked. I am thinking here of water, health, clean-up operations and infrastructures  - all of which are major problems for society. Naturally, a more global concept will require greater dedication, and if there are additional resources, so much the better, but, in my view, the situation could be improved even with what we currently have available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The rate of urbanisation in Africa is higher than elsewhere and the living conditions of city dwellers - particularly those in the shanty towns  -  are becoming increasingly difficult in terms of health, education, environment and so on. What, in your opinion, would be the optimum strategy for reversing the decline, at least in the short-term ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - First of all, I think we have to make a distinction here. Let's take the actual rate of urbanisation. Contrary to what is generally thought, this is lower than in the rest of the world. In other words, Africa has fewer towns and cities than the rest of the world. It is the rate of growth in the urban population that is higher. Populations are becoming increasingly concentrated in the cities, with the drift of people from the countryside. In addition, the phenomenon is being fed by demographic trends. You ask me if there is anything we can do to halt this. There are actions that can be taken to restore some balance. For example, we could make investments in the rural environment to keep people in the countryside, and we could implement suitable agricultural policies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But we must not labour under too many illusions, because life in towns and cities will be an inevitable characteristic of the next century. Economists and urban planners have been considering the phenomenon for a long time now - perhaps 30 or 40 years. It is  something that cannot be halted, because it is a fact of civilisation. So, what should we do? Above all, we should devote our efforts to regional development, achieving a balanced distribution of human resources, and a more equitable exploitation of natural resources. Power has to be decentralised so that people do not abandon their roots but face up to local challenges. And we have to implement urban policies which are satisfactory in terms of investment, management and popular participation. In simple terms, urbanisation has to be managed. We cannot hope to reverse the trend overnight, particularly in the case of a continent like Africa where everything happens quickly. Africa is enormous and its population has not yet reached its maximum levels. We have to take all this into account.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We must acknowledge that scientific progress and improvements in the field of health have contributed to population growth, and a reduction in mortality rates. This means that urban civilisation is a reality that we have to manage. There is a risk of uncontrolled growth in urban centres. When infrastructures are lacking, when there is no water, when hygiene cannot be guaranteed and when there is no work, a country's security is threatened.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You have mentioned democracy end the decentralisation of government This also requires adequate financial resources. Where do you think the ACP countries will find the money to implement decentralisation strategies ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Democracy involves a search for freedom - freedom of opinion and expression, independent of material or financial problems. The problem with decentralisation lies in administrative method. It is not purely a matter of money. In the first instance, it is a question of choosing the right approach. It has been demonstrated that without any extra resources, one can still act differently by delegating and decentralising. And success is much more likely because the people are involved in the process. Admittedly, it requires an internal reallocation of resources. A proportion of everything that was formerly centralised has to be allocated to development and to basic needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To answer your question more directly, there is a great deal of talk of this alternative method of governing. It is inspiring new hope and a thirst for something better. It is even being viewed as an 'ideal' solution - which it cannot be entirely. However, by decentralising human and economic resources, and by allowing people to participate, hope can be inspired at local level. This should make for better administration and support, which is an improvement in itself. Of course, this may make people more demanding. Will it satisfy their requirements? As I have already said, internal resources will have to be reallocated, but resources must also come from outside. One cannot make an allout effort for decentralisation without doing something to improve international cooperation. This cooperation, however, must be adaptable, and the state must retain its pre-eminent position and its role as guarantor and arbiter. But in addition, local communities should have access to international cooperation either directly or indirectly through their organisations, municipal structures and so on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· In this context, what role do you see for international organisations - not just in terms of financial resources, but also of human resources ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I think what we now need to do is build up a pool of skills in each municipal area. The developed countries have experience in this field. We have to take their processes as a model without necessarily copying their experience. This is something which will be discussed. Secondly, in the context of relationships between towns and cities, I believe it is possible to make access to experts more flexible and that this can take place very quickly, with the provision of training and fairly basic technology transfers. General training is also extremely important. In order to build up a pool of skills in towns and cities, local government must form a dynamic, management-oriented team. The approach has to be one of business-like management and objectives have to be targeted using private-sector methods, although public-service requirements always have to be borne in mind. A great deal, therefore, can be done at international level, in terms of support for networks of associations and committees of locally elected representatives, enabling them to discuss matters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We could, for example, carry out a comparative study of legislation in a particular area, thereby gaining access to other types of experience. Internationally, aid can be given to associations to help them buy equipment and attain a degree of freedom of manoeuvre vis-&agrave;-vis the authorities. In the field of decentralised cooperation, the international community can help elected representatives to implement their projects through partnerships, conducting studies, and providing personnel. Cooperation is possible in all spheres -  implementation, management, financing and so on. I believe that a new type of cooperation will gradually come into being. It is not a question of creating 'white elephants', but rather small and medium-scale projects which are of genuine use to the population. And I am not talking here about acts of charity, such as the donation of medicines, but sustainable projects. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Habitat II: taking stock</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Christian Cure'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The future of towns and cities is not what it was. In the 20 years between the first United Nations conference on human settlements (1976) and Habitat II which took place in Istanbul in June 1996, the situation has changed a good deal. The significance of urbanisation  - and its irreversible nature -  are now acknowledged, as is the powerlessness of the authorities to deal single handedly with the complex phenomena which result The author of this article points out that civil society has suddenly broken into a field hitherto the preserve of official agencies and qualified experts, claiming a 'right to the city' based on research into more equitable development models.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vancouver to Istanbul: two symbols for two eras</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Vancouver was the 1976 host of the first conference on human settlements organised by the United Nations. At that time, the UN was celebrating 30 years of existence and Vancouver, a model of urban development and modernity, provided inspiration for the developers and experts needed to plan the cities of the future. 'Appropriate technologies' heralded the possibility of mass-produced, cheap housing for everyone.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Twenty years later, the UN chose Istanbul as the host city for the Habitat II conference on human settlements, forcing us to face up to a quite different situation: uncontrollable urban growth (400 000 migrants arrive there every year), social and environmental problems, and intercultural and political tensions (amply illustrated by the Turkish politicians' inability to form a government at the very time the Conference was taking place). In brief, Istanbul presents us with the usual list of problems facing most of the world's major cities - and those of developing countries in particular.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Against this backdrop, the international community  -  180 countries, 500 local dignitaries, a few thousand professionals and even some ordinary citizens - came together from 3 to 14 June to discuss a 'settlement action plan'. This document, which had been in preparation for two years, contains 183 articles. It sets out a series of goals, principles and undertakings as well as providing an action plan for cities, the initial results of which should begin to be seen by the year 2001.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The preparatory committee selected two basic topics for discussion: securing adequate shelter for all, a basic but nonetheless controversial theme; and sustainable urban development The latter encompasses housing, demographic factors, infrastructure, services, the environment, transport, energy, social and economic development, the future of underprivileged groups and combating exclusion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The cycle initiated at the Rio Earth Summit in 1992 (followed by the Copenhagen, Beijing and Cairo meetings) was continued by Habitat II. Two major handicaps had to be overcome - 'conference fatigue' (with the resulting fact that there were fewer delegates than anticipated) and ensuring that what had been accomplished at earlier conferences was not undermined. Given that the subject of the meeting was human settlements, it was inevitable that sensitive issues already debated at previous summits, relating to the environment and social aspects, would keep recurring.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Civil society as an active force</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A number of conclusions arose from the official sessions (hearings, dialogues and various forums) which took place over the two weeks of the conference.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">First, Habitat II represented a recognition of the fact of urbanisation. In the past, there was a tendency on the part of the international community to play down, or even ignore, the phenomenon of urban growth and this was reflected in the meagre resources allocated to this area by donors. Today, the issue is better understood than it was 10 or 20 years ago, and it is acknowledged that the growth trend is unstoppable. Statistical studies and a set of 'urban indicators' drawn up for Habitat II confirm the scale of the problem. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Second, the Istanbul summit was a lesson in modesty. The obvious powerlessness of public authorities to deal single-handedly with the challenge of burgeoning towns and cities is recognised. The result was an understanding that a more pragmatic view is needed -  one which pays more attention to the complexities of urbanisation, to the wide variety of possible responses and, above all, to the multi-faceted nature of the players involved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Conference therefore became a genuine forum for debate. One of its most significant aspects was the emergence of 'civil society' as an active force. Hitherto, the field has largely been the preserve of official agencies and qualified experts. For the first time in a UN forum, local authorities, community leaders, private sector representatives and other dynamic forces in civil society were invited to give their views and take part in discussion groups. Whereas in the past, the debate was dominated by macroeconomic and technical questions, in Istanbul, the political and social aspects were given prominence as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The effect of this was to improve the quality of the debate. The outlines of a new relationship between governments and civil society (NGOs, ordinary citizens and popular urban groups) were defined - with the local authorities slotting in somewhere in the middle. And there was a particular focus on the question of dimension or scale: what should be the basis for urban democracy and citizenship. Both of these are seen as essential if one is to have successful and sustainable urban development policies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A right to the city?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first stage of the analysis is to look at urban life from a macroeconomic standpoint. Urban growth is determined by the evolution of the world economic system and, in particular, by the globalisation of markets. This has generated increased competition, including competition between cities themselves. Since the end of the 1980s, cities have been responsible for between 50% and 80% of the GDP of most countries. In other words, they represent more than mere links in the global economy; they are, in fact, pivotal points.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hence the principles which broadly underpin the Habitat 11 programme. In fundamental terms, public policies must promote the capital, housing, property and employment markets, with a view to improving the efficiency of urban management (living conditions, infrastructures, services, environment, etc.). This is not just desirable in human terms but also essential if urban productivity is to be improved. Many decision-makers at the meeting agreed that privatisation of services, partnerships involving the authorities, the community and the private sector, and decentralisation were all part and parcel of a new standard for good local governance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Representatives of 'social' interests, on the other hand, were successful in focusing the debate on fundamental rights and principles, including individual and social rights. Indeed, these issues dominated the Conference and gave rise to the most difficult negotiations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There were prolonged talks, for example, on the central issue of the right to a roof over one's head. The outcome was a commitment by governments to promote 'the full and progressive acceptance of the right to adequate shelter'. The NGOs had been hoping for a more clear-cut undertaking. Questions relating to the status of vulnerable groups, women's rights and their equal access to land, and protection against eviction, were also the subject of heated exchanges.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perhaps the most important step forward, however, was the success of civil society representatives in sowing the seeds of a new idea - the 'right to the city'. This concept has been devised on the basis of research into more equitable and soundly-based development models to which local authorities are increasingly giving practical support. Thousands of individual experiences and issues were highlighted in Istanbul by NGOs and community groups. Thus, there is a mass of evidence that populations are capable of responding through local initiatives and of taking responsibility for improving their living and housing conditions. If this 'resource' is to be exploited to the full, urban politicians must develop a deeper understanding of the scale of micro-territories and local societies within cities. They also need to promote and coordinate their decision-making in a way which involves consulting and involving the local populations. In the modern era, this is the key to ensuring social cohesion.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beyond Istanbul</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There may have been a lot of new thinking on the basic principles, but there was no reference to financial undertakings in the Habitat 11 programme. On the latter issue, the international community was highly circumspect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The World Bank took the initiative, announcing the launch of an 'urban compact', involving an additional $15 billion in loans for urban projects over the next five years. It also revealed that it would triple its aid to NGOs involved in the urban environment. Recent World Bank estimates suggest that just 0.2% to 0.5% of a country's GDP would need to be set aside for the poor to gain access to basic urban services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As regards monitoring, the NGOs and local authorities won the right to sit on the Human Settlements Committee which will be responsible for implementing the habitat programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The most important points to emerge from Istanbul, however, were that local authorities were given both formal recognition, and a major practical role - in keeping with their current responsibilities. The habitat programme is, in fact, a powerful call for decentralisation and increased local autonomy, its action plan being built on the implicit principles of 'subsidiarily' and 'proximity'. To a large extent, the successful implementation of the programme will depend on the mobilisation of municipal politicians and officials - and on the policies they adopt at local level. The agenda for cities in the 21 st century that was adopted at the Rio Summit must now be fleshed out and become the future reference for action by local authorities, NGOs and citizens' associations. Finally, the importance of decentralised cooperation and the role of local councils in international cooperation have been reconfirmed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Local authorities and their international organisations decided to form a worldwide coordinating group to continue structured dialogue with the international community and to guarantee that the Istanbul resolutions are followed up.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some people predicted that Habitat 11 would be 'the revenge of the cities'. To quote P. Maragall, chairman of the Committee of the Regions, the conference at least provided the opportunity to build, and to give a wider audience to 'the voice of the United Cities within the United Nations'. That itself is a major step forward. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'A house to call my own'</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tackling violence against women</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Rosemary Okello</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author of this article is a journalist with the Nairobi-based Women's Feature Service (WFS) She contends that the Habitat 11 conference skirted around some of the issues affecting women city dwellers in Africa, such es violence and sexual abuse. Improving their lives, she argues, starts with a roof over their heads</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The lofty ideals set during this year's UN Conference on Human Settlements in Istanbul meant little to African women like Catherine Kaberu. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As she recalls the misery of living on the streets of Nairobi, she is just happy now to have a safe, secure room for her family. 'I thought by running away from home and coming to Nairobi, I would find a better life" says Ms Kaberu. Instead, the streets became her home and her life was defined by the fear of violence against her. Her two children were born during that difficult period, following rapes. She cannot identify their father. There are an estimated 30 000 street people in Nairobi and Catherine Kaberu says that all street women and girls are regularly abused.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Every day we had to look for a place to sleep and we bribed the watchmen to guard us.' Often it was the same watchmen, employed to guard office blocks in the city's central district, who took advantage of the women's desperate situation. Not even age could protect them says 63-year old Felista Nyambura, herself a veteran of the streets. 'I suffered all manner of humiliation,' she states, referring to ten years spent on the streets with her seven children. 'The watchmen would rape me if I refused to give in to them - after they had offered me a place to sleep for the night with my children. I am just so happy to be off the streets. I will never go back,' she states firmly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The confidence of the two women comes from their new security as owners of simple one-roomed houses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'Having a house to call my own is the most important thing that ever happened to me,' says Ms Nyambura as she explains how she ended up on the street after the piece of land her husband left in their rural home was taken over by her in-laws.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The two women are part of a group of 114 who have benefited from the Urban Destitute Programme, a project of the African Housing Fund which is involved in participatory community development with the homeless women of Nairobi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Catalina Trujillo, the 'Women in Development' coordinator for the Habitat conference stresses: 'If a woman's place is in the house, we had better make sure she owns it.' These sentiments were supported in Istanbul by the conference Secretary General, Wally N'Dow: He stated: 'By conviction, by analysis and even by instinct, women's rights to ownership and inheritance of property is right. If Habitat II... does not also contribute to social progress by addressing some of the issues like property rights for women, then it will have failed.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the women of-Africa in particular, the most important thing that should have come out of Istanbul was an affirmation of their right to own and inherit property, and to security.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These issues affect most African women regardless of their status and they were presented to ministers concerned with shelter and settlements when they met in Johannesburg last year to prepare an African agenda for the Istanbul meeting.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Most African countries accept the theoretical premise that women must have access to land, credit and inheritance, and recognise that certain types of violence are targeted primarily at women. South Africa's President Mandela affirmed: 'When we talk about people-centred development, we should understand that the involvement of women is often the difference between success and failure.' Yet in reality, customary law and insensitivity to gender concerns continue to predominate. Unfortunately, when the African ministers adopted their declaration, the point on the "unencumbered access of women to credit and land ownership' appeared in only 20th place. And while forced evictions were highlighted in Istanbul, violence against women did not feature at all among the 'key priorities'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet in parts of Africa these are major concerns affecting women every day. 'In South Africa, a women is raped every 83 seconds and in some areas, a girl can expect to be raped four times in her life,' says Emelda Boikanyo of the Johannesburg-based Women's Health Project. Idah Matou remembers how one Sunday morning in 1992, five men stormed into her shop in Alexandria township. They seized the day's earnings and anything else they could carry away before raping her 1 5-year old daughter. A few weeks earlier, they had called to demand protection money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Violence in the home is also a growing problem. Mmatshilo Motsei, Director of Agisanang Domestic Abuse Prevention and Training, an NGO based in Alexandria, South Africa, says the problem is so pervasive, 'it must be raised as a national concern.' Habitat II turned a deaf ear on these women's concerns. This was not their forum. Shawna Tropp of the NGO Women's Caucus criticised those attending the conference who claimed that it was not about women but cities. 'Women live in cities,' she says and adds: 'By and large, human settlements are still very much seen in terms of bricks and mortar'. She calls for greater understanding of the role played by women, usually in an unpaid capacity, in the management of communities. 'Everything begins with having a house in a secure neighbourhood where the dignity of women is protected.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Megacities</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The megacity personifies human misery for many in developing nations. As agglomerations proliferate in the twenty-first century, the United Nations Population Fund's 1996 report - The State of the World Population  -  considers how one might go about remedying the ills of city dwelling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The UNFPA's figures for urban growth make worrying reading. Over half the world's people will live in cities within ten years (3.3 billion out of a total of 6.59 billion). Between 1970 and 2020, the urban population will have risen by more than two billion - and 93% of these will be in developing nations. These increases will add to the strain of an estimated 600 million people already living in urban areas of developing nations without the resources to meet their basic housing and health needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Back in 1950, New York was the only city with more than 10 million inhabitants. Today, there are 14 in this category. Tokyo, which is home to 26.5 million people, is the largest. And by 2015, many others are expected to join the megacity 'club'  -  Djakarta (Indonesia), Karachi (Pakistan), Dhaka (Bangladesh), Delhi (India), Tianjin (China), Manila (Philippines), Cairo (Egypt), Istanbul (Turkey), Rio de Janeiro (Brazil), Lahore (Pakistan), Hyderabad (India), Bangkok (Thailand), Lima (Peru), Teheran (Iran) and Kinshasa (Zaire).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the majority of the world's people will be living in cities by 2005, it will take a little longer for the 50% threshold to be crossed in the less developed regions. However, this is expected to happen before 2015. Looking specifically at Africa, the current estimates reveal significant regional variations. In Southern Africa the rate of urbanisation is 48%. The figures for North, West, Central and East Africa are 45%, 36%, 33% and 21 % respectively.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Expanding populations are likely to add to the widely reported list of horrors emanating from cities that are bursting at their seams. Problems include the collapse of basic services such as water and waste management, escalating social conflict, millions of urban children open to labour exploitation, sexual exploitation, environmental degradation, traffic congestion and environmental hazards such as increased air pollution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the other hand, the UNFPA report acknowledges that cities are also 'concentrations of human creativity and the highest form of social organisation'. It continues: 'Cities provide capital, labour and markets for entrepreneurs and innovators at all levels of economic activity'. Indeed, between 60% and 80% of developing countries' GNP is generated by their major conurbations. Social transformation occurs at a faster pace in urban areas. Thus, health indicators tend to be better, literacy is higher and there is more social mobility. And there are more opportunities for women. The city presents fewer obstacles for women's education and female city dwellers are less likely to be constrained by traditions which may stifle their creativity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But harnessing this potential is no easy task. The final chapter of the UNFPA report, entitled 'Policies, strategies and issues for improving cities', argues that urban dwellers in developing nations have been badly affected by structural adjustment policies. These have resulted in the elimination of subsidies on food and other commodities, increases in school fees and job losses in the public sector. Cities will also be required to adapt to the 'mass global experience in decentralisation' involving the shifting of local decisions from central government to municipal authorities, parastatal bodies and the private sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p48.png"></center><br>
+ Regional distribution of urban population</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Women - a priority</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The report stresses the importance of improving education and health, with a particular focus on women. As Dr Nafis Sadik, who is Executive Director of the UNFPA, observes; 'If urban centres are to be made liveable, and the quality of life of the poorer members of society is to be improved, women should be given the chance to play their role in the process.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The report reiterates the specific targets for improving the lives of women that were drawn up by the 1994 International Conference on Population and Development held in Cairo.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the field of education, these include 100% primary school enrolment (for both girls and boys) by 2015, improving access for girls and women to secondary, tertiary and vocational education, and closing the gender gap in the primary and secondary sectors by 2005.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other goals include a progressive reduction in infant and maternal mortality, making reproductive health services accessible to all through the primary health care system by 2015, greatly improved provision for family planning (allowing couples to make free and informed decisions on the number, spacing and timing of births) and providing better protection against sexually transmitted diseases.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The State of the World Population Report concludes: 'A successful urban future depends, as much as anything else, on engaging all members of the community - especially women and the poor  -  in a constructive political process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There will have to be partnerships struck between governments, nongovernmental organisations, the private sector, and local and community organisations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And global urbanisation will require that the international community  -  governments, NGOs and international institutions - act to exploit the potential of cities to improve the lives of the world's people and to establish the foundations of sustainable development in the 21st century.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Lagos under stress</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Paul Okunlola</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With a present population of some 7.5 million, the new millenium will propel Lagos to megacity status. The United Nations Population Fund predicts that 24 million people will live in the city by 2015, making it the third most populous conurbation on the globe. Whilst the donor community has supported urban projects in the past, tough times mean more reliance on 'bottom up' schemes backed by N60s and community-based groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When it began to rain in the small hours of Thursday 18 July 1996, residents of Lagos -  Nigeria's largest city and economic nerve centre -  merely stirred in their slumber. The gentle, but persistent showers, didn't rank among the heaviest downpours experienced by this coastal city, which gets rain on average for eight months in every year. Nor are Lagosians unfamiliar with spells of rain lasting up to seven days without break.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But by the time of the early morning 'rush hour', the traffic-laden streets of metropolitan Lagos were being swept with rampaging floods. Until well after noon, the city's social and economic life was at a standstill. Already difficult road conditions were rendered impossible for motorists, marooned at the wheel for hours. Exhausted school children eventually made it back home after spending the better part of the day in traffic. Crowds of commuters waited interminably at bus-stops for vehicles that never came.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The economic toll was expected to be heavy, with offices in both government and the private sector remaining empty all day. Commercial activities were put on hold as shops remained shuttered until well after noon. The communications network and electricity supply to key areas of the city were shut down for hours, to protect equipment. One state government official commented: 'It has never been so bad.' By the time the water receded and life had returned to normal, both government engineers and private sector consultants were in agreement: the main reasons for the flooding were illegal development along the natural courses of inner-city waterways, and the reduced drainage capacity of the overdeveloped metropolitan area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Exploding metropolis</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both the flood itself, and the acknowledgement of the human limitations of the city officials, illustrate the frustrations that have attended the management of this exploding metropolis over the last three decades. In the months leading up to the July flooding, a major controversy erupted over plans to landfill the inland Kuramo lake in the highbrow Victoria Island district and develop it as a housing estate. This pitted state government officials and a firm of developers on the one hand, against a motley band of citizens groups, non-governmental organisations and concerned environmentalists on the other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The unusual strength of local feeling against the project reflects growing fears that the island itself could be submerged. Five years ago, this was thought to be a remote prospect but today it is seen as a real threat, given the increasing frequency of flooding incidents and ocean surges along the coastal area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More and more people are arguing that there is a correlation between the growing frequency of flooding incidents and the massive sandfilling activity that has taken place over the years. The Kuramo issue remains contentious but it is just one example of the wider dilemma facing the city's development planners. They have the daunting task of providing for legions of migrants to Lagos - whose swelling numbers are placing great stress on the failing infrastructure. The problem may be particularly acute in the Nigeria's largest city, but it reflects a wider trend of urbanisation in the country over the past half century, as the overall population has increased.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1921, Nigeria had just 18.7 million inhabitants. Current estimates put the population in the region of 103.5 million. And the growth in the proportion of urban dwellers has been equally dramatic. In 1931, fewer than 7% of the people lived in urban centres. The figure had risen to 10% by 1952,19% by 1963, 33% by 1984, and 42% at the last count, in 1991. Current figures suggest that there are now seven Nigerian cities with more than a million inhabitants and no fewer than 78 whose population exceeds 100 000.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The changing structure of the country's human settlement profile has been linked to broader economic and social changes. The situation has been exacerbated by the economic depression of the last two decades. Analysts have noted a trend of declining primary production in such areas as agriculture, mining, quarrying and exploitation of natural resources. This has resulted in greater attention being paid to secondary and tertiary economic activities -  which are generally city-based. The figures illustrate the dramatic nature of the change that has taken place. In 1952, the ratio of primary to secondary/ tertiary economic activity, as measured in Nigeria's GDP, was 68:32. Four decades later, the ratio was 38:62.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">According to World Bank consultant, Prof. Akin Mabogunje, the trend is exemplified by the expansion of a whole range of activities located in urban centres -  large, medium and small-scale enterprises in manufacturing and construction, utilities, transport and communications systems, wholesale and retail outlets, hotels, restaurants, finance and insurance companies, and estate agencies. Then there is the whole range of government activity. Until 1991, Nigeria's huge federal bureaucracy was located in Lagos, operating alongside a state administration and some 15 local authorities. Add to this the major docks and airports of Lagos, and you get an urbanisation phenomenon which has, to say the least, been intimidating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lagos, which only occupies 0.4% of the country's land area, gains an extra 300 000 inhabitants every year on top of its natural growth rate. That the city is a 'pole of attraction' is hardly surprising. It is clearly the economic nucleus of the country, reputed to account for about 57% of total value added in manufacturing and about 40% of the nation's most highly skilled manpower.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Urban toll</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The costs have also been high. Professor Poju Onibokun, a human settlements expert, enumerates these: grossly inadequate housing and infrastructure with millions dwelling in slums; social amenities under enormous pressure with a shortage of schools and poor health facilities; endemic crime and juvenile delinquency; the breakdown of traditional values, family cohesiveness and community spirit. The capacity of law enforcement institutions is also increasingly hampered by technological and resource limitations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Of these ills, the shortage of housing and lack of infrastructure are seen as the most acute. This is borne out by a recent World Bank study which notes that:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - the quality of life and living conditions have deteriorated;</P>
+<P ALIGN="JUSTIFY"> - economic production has plunged;</P>
+<P ALIGN="JUSTIFY"> - the inadequate provision of infrastructural services has negatively affected the operations of most private sector investors, who now need to spend between 22% and 25% of their capital outlay on providing their own infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over 90% of the city's housing is provided by the private sector. But this has been handicapped in recent times by spiralling development costs and a general shortage of funds. New private housing has consisted largely of thousands of individual units, built mainly in areas of existing large scale developments. The authorities have made their own efforts to plug the gap and over the last 15 years, no fewer than 6000 hectares of marshland have been sandfilled and reclaimed in six separate development schemes (some of which have proved controversial). The Land Use Act of 1978 vested all urban land in the state authorities, although the administration of the legislation has not always proved satisfactory.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Public transport is another problem for Lagos residents. There is no integrated system of mass transport and the sector is essentially made up of hundreds of privately operated buses and a dwindling taxi fleet. Massive currency devaluations have meant that the purchase price of new vehicles has rocketed. Maintenance costs for the increasingly dilapidated fleet have also spiralled. As a result, the system is stretched to beyond its capacity and it is the commuters who bear the brunt.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Public sector spending obviously has an important part to play in maintaining urban structures. The downturn in international aid flows has, therefore, had a visible impact with decline in infrastructure provision and maintenance, leading to a less favourable operating environment for private investors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the past, Lagos has been a notable beneficiary of urban support programmes with multi-million dollar schemes for water supply, storm water drainage, and infrastructure. Most of these have been World Bank-led but the support of the European Union and its Member States in this area is also considered crucial.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the positive side, adversity has proved a catalyst for greater community-based and NGO activity in environmental and human settlement issues over the last decade. This is a fresh approach, based on 'bottom-up' strategies, which should open up muchneeded new avenues to urban management in Nigeria more generally and in Lagos in particular. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">A Eurocrat in Istanbul</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Gilles Fontaine</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author, a specialist in urban development, offers us his thoughts on the Istanbul conference. This event, he believes, was a landmark in the collective process of raising awareness which was begun at the Rio Conference on the environment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">14 June 1996 - last day of Habitat II</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Night fell a long time ago. A feeling of hope permeates the hall. Most of the work is completed but there are still disputes over a few paragraphs of the text of the Habitat 11 Agenda. Some delegates have not slept for two days and they can be seen standing around, afraid they might fall asleep. The sense of fatigue increases further when, at midnight, the symbolic 'stopping of the clocks' (to permit a successful outcome of the final negotiations) is announced over the PA system.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At two in the morning, the wait has become almost unreal. It is virtually unimaginable that the Conference should come to nothing, after two years of intense work. Since Wednesday evening, the general atmosphere has been almost euphoric. Agreement has been reached on all the essential points within the allotted time and the Conference is already being heralded as another success story. All that remains to be done is to finalise the 'Istanbul Declaration', a four-page policy text broadly summarising the work of the Conference. The Conference would finally close about two hours later, amid general relief - but why the impasse?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Breaking new ground... and remaining steadfast</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some problems arose where they were least expected! To everyone's surprise, 'informal' working sub-groups had to be set up to discuss nuclear testing and anti-personnel mines! These themes were a far cry from the Habitat Agenda, but this sort of thing inevitably happens at major international conferences.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other stumbling blocks appeared without any real warning, when some delegates attempted to renegotiate the conclusions of the Beijing and Cairo conferences. The negotiators had to stand firm on two counts. The hard-won recognition of women's rights needed to be defended all over again. And, more importantly, the attempt in Istanbul to reopen the debate on everything that had been gained at previous conferences had to be avoided. The European Union's negotiators took an aggressive stance on both these issues.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The fact that so much negotiating effort is expended is a good illustration of the political significance governments attach to the topics debated on such occasions. A conference may be seen as resembling the proverbial half-bottle of water  - some regard it as half empty and others as half full. One's viewpoint depends on one's expectations  -  and much disappointment is caused by a misunderstanding of how such conferences operate.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meeting the delegates</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although I am no anthropologist, I think I was able to identify three major groups of participants. First, there were the 'negotiators', who have built up a common language from conference to conference. I was surprised at the extent to which reference was constantly made, in the negotiating groups, to the 'Languages' of Rio, Copenhagen or Beijing. This is not just a question of vocabulary or syntax, but represents a genuine revolution in thought at international level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second group, to which I myself belonged, was made up of national and international officials. These are the people who, to a greater or lesser extent, prepare the conference. They then attend it and, ideally, write a mission report on returning to their offices (bemoaning the fact that few people will read their words of wisdom !)'These delegates tend to offer the harshest judgments. A common refrain is: 'We have long argument about words in parenthesis in a huge document that no one will ever read!'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The third group, which nowadays is the largest, consists of representatives of so-called civil society. Since Rio, every United Nations conference has seen the parallel organisation of an NGO Forum, and the latter's influence has constantly increased. At Beijing, the authorities banished the NGO Forum to a site 60 km from the capital, but Istanbul welcomed it with open arms on the same footing as the 'Cities Summit' and the meetings of researchers and industrialists. A more fundamental development was the invitation to NGOs and local authorities to take an active part in the working groups and at meetings. This was a 'first' in international conference history and I was struck by the motivation and competence of many of the participants, as well as by the ease with which they have adapted to the information society. Gone are the days when addresses are exchanged on scraps of paper, accompanied by the ritual 'We must keep in touch!'. These days, your business card must include your Internet Email address. Contacts are organised through networks connected to databases, and people swap CD ROMs with each other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What did Habitat II achieve?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'official' end most visible result of the Conference was obviously the adoption of the Habitat Agenda - the final fruit of long hours of work within the national committees set up for the occasion. This document, over a hundred pages in length, contains a 'World Action Plan', accompanied by the 'Istanbul Declaration'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What is not so well-publicised is the fact that many countries  -  including a number of ACPs  -  took the opportunity to publish their own national reports containing individual action plans. The amount of preparation that went into these reports revealed a high degree of motivation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Having looked at them more closely since, I have gained a somewhat better understanding of the months of work put in tens of thousands of people across the world. This reassures me that the majority of state participants will monitor the Habitat 11 follow-up very closely.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One has to recognise that the mere adoption of a text, however significant it may be, cannot be regarded as a magic formula which will change the face of the world overnight. To the impatient among us who want everything straight away, and to unrepentant sceptics, I would say this. In environmental matters there are two major periods in our recent history - the period before Rio and the period after Rio. The Rio meeting, and each subsequent conference, have been milestones in a long, coherent process of collective reflection and growing awareness. Istanbul did, in fact, keep its promises: the right to adequate shelter is now recognised internationally as the fundamental right of every human being.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The exploding city</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Stephane Yerasimos</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Istanbul. Ten million inhabitants - with double that number expected in 20 years time. Financial irregularities, a chaotic house-building sector, a lack of infrastructure and rampant speculation. One needed to look no further than the host city to find the key issues facing the Habitat Conference.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Istanbul is a city steeped in history. It is also one of the Third World's biggest conurbations. Over the last 16 centuries, it has been the capital of two great empires - the Byzantine and the Ottoman - resulting in a rich legacy of monuments and a historic centre on a par with that of Rome. From the Middle Ages to the beginning of the modern era, it was regarded as Europe's largest city. On the eve of the Second World War, it had a population of one million, but that figure has now multiplied tenfold. Almost half of its ten million inhabitants are living on a knife edge, and many are in 'illegal' housing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first big transformation of the city came in the middle of the 19th century when the Ottoman authorities opted for westernisation and embarked on an extensive management programme. By the time the Empire collapsed in 1922, much of the ancient fabric - and traditional housing -  of the city had already been lost. Under the new republic, the capital was transferred to Ankara, and the authorities stepped up their efforts at modernisation. In 1937, Ataturk gave Frenchman Henri Prost, a city planner who had helped preserve the old centres of a number of Moroccan towns, the job of devising major public works in the heart of the old city. The infrastructure was also updated and taken together, these works (which were completed during the 1950s) transformed the old walled city and its ancient suburbs (Galata and Uskudar) into a modern aggLom&eacute;ration, interspersed with ancient monuments.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mass immigration</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unlike the colonial powers who attempted to preserve the traditional character of old city centres around the Mediterranean rim and in the rest of the Islamic world, the desire of successive Turkish governments to modernise the country resulted in the disappearance of most of Istanbul's ancient fabric, and the city no longer has a compact area of old districts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The transformation of the city centre was matched, after the Second World War, by an explosion of building on the outskirts - a phenomenon characteristic of Third World countries. Improved sanitation and hygiene standards led to a natural population increase of between 2.5% and 3% per year. Meanwhile, the modernisation of agricultural practices caused a mass rural exodus. Marginalised in both economic and social terms. the people who flooded into Istanbul soon over whelmed the resident population. Today, the bulk of the people living in the city have rural origins.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The new residents began by occupying the edges of the old quarters and taking over the open spaces which remained after the ravages of an earlier fire. They then began to settle in ever-increasing circles around Istanbul, establishing the first gecekondu districts (groups of huts constructed overnight). These have been incorrectly described as shanty towns. In fact, most buildings are permanent structures and they rapidly develop into multi-storey dwellings. Most of the land on which these illegal buildings have sprung up was originally privately owned. But the elected multi-party government in power at the time was quick to spot the electoral possibilities in these areas. Each district was a reservoir of potential voters and, on the eve of each election, the parties in power would distribute property titles to the illegal occupants. They, in turn hastened to consolidate and increase their assets. This explains the emergence of increasingly densely populated districts without infrastructure during the 1950s and early 1960s</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Industrialisation, and the arrival in the city of people who used to be rural landowners (driven out by the new market economy) later created a demand for housing which the normal market was unable to meet. This has given rise to a new phenomenon of urban marginalisation, involving the illegal division of land into plots. The system involves the purchase of agricultural properties by developers and speculative builders. These are divided into small plots and resold, quite legally, to purchasers  -  who then build unauthorised structures in contravention of the normal planning rules. Often, benefiting from political alliances, the developers take control of these districts and 'convert' the votes of the people living there into cash, in return for urban investments. This enables them to consolidate their power and increase the value of their remaining stock of plots.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An uncontrolled population increase</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, a third phenomenon, linked to the growth of a middle class, began to occur in the mid-1980s, when building cooperatives came into being. Their predecessors were the corporate associations which grouped together public officials (beginning with the army and the police). These developed into ad-hoc associations enabling a group of developers to tap people's savings, thereby dispensing with the need for loans in a country where chronic inflation makes credit prohibitive. Several thousands of dwellings are often constructed at the same time, in the form of tightly packed, multiple-occupancy blocks. The requirements of multi-storey construction mean that these buildings are of acceptable quality, but the related infrastructures are sorely lacking. Entire districts are built 'in the wilds' without any infrastructural investment by the developers or local authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The city is continuing to expand, without reference to any development plan. The fifteen or so major urban schemes drawn up since the 1950s have all remained in desk drawers and the only significant construction work has been on roads (notably bridges and ring roads). These generate further uncontrolled population increases on the outskirts of the city.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the natural rate of demographic growth is slowly declining - it has just dropped to under 2% per year -  the most recent census (in 1990) reveals that Turkey now has more people living in its cities than in its rural areas. Yet the statistics also show that half of the country's people are still involved in agriculture. Given the continuing natural growth, and the fact that in semi-industrialised countries, the rural population tends to settle at around a third or even just a quarter of the total, we can assume that the drift to towns and cities will continue for the next 30 or 40 years. This trend will affect all Turkish towns and cities, be they large, small or medium-sized. But Greater Istanbul, where the majority of the country's economic and social activity is concentrated, is set to experience a doubling of its population within the next twenty-five years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dilemma for urban planners</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The problem caused by demographic changes is exacerbated by economic constraints. For a number of years now, Turkey has suffered a high (albeit stable) inflation rate of about 70% per year. This situation discourages investment in industry, and makes people take refuge in ownership of land that they can build on. Land has thus become the target of speculation by people in all social classes. Against this background, it is virtually impossible to regulate the use of land  - something which must be at the heart of any urban-development programme. An alternative is to discuss the possibility of developing a social consensus involving a more liberal approach to property speculation, recgnising that land is a source of revenue at all levels. This might entail releasing central and local authorities from any responsibility to provide services or other infrastructural investment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the present circumstances, however, any scheme to redevelop Istanbul effectively would seem doomed to failure. The only intervention which might succeed would be at the 'cleaning-up' stage - coming in after the construction of the dwellings under the conditions described above. It is only once the new inhabitants' dream of having a roof over their heads is realised that they come face to face with the harsh daily realities of living in a self-built city of nearly ten million people. They may then be prepared to make some sacrifices in order to improve their living conditions. The moment when harsh reality replaces emotion, is the only time the urban planner has the slightest chance of being listened to. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Adequate housing in the EU: rights and realities</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Misia Coghlan</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are 2.7 million homeless people in the European Union and many millions more are badly housed. But the EU is said to be lagging in taking measures to provide adequate housing - one of the internationally recognised human rights. An expert from a leading campaign group for the homeless explains.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rights</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the weeks and months leading up to the Second United Nations Conference on Human Settlements (Habitat II), much argument and debate centred around the existence of the right to adequate housing. The legal basis of this right was challenged by a handful of delegates and the arguments continued right through the Conference itself. The outcome is that the final Declaration includes a reaffirmation of states to a 'commitment to the full and progressive realisation of the right to adequate housing as provided for in the international instruments.' (see first box)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The political impact of Habitat II as the culmination of the recent series of UN Conferences has been disappointing. The Istanbul Conference was originally heralded with the catch-phrase 'housing for all'. In the course of the preparatory process, this was watered-down to become 'shelter for all' and, as has been seen, the wording of the final Declaration simply refers to existing international commitments and allows for the 'full and progressive realisation of the right.' This of course begs the question of how such a right was ever supposed to have been achieved other than 'progressively' and how meaningful such a commitment can be in the absence of parallel undertakings as to implementation and enforcement. In short, very little has been achieved in progressing international commitment to the realisation of the right.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The right to adequate housing has in fact been recognised for some time now by the Member States of the European Union, all of whom have ratified the 1966 International Covenant on Economic, Social and Cultural Rights (the most important legal basis of housing rights found in international law). Under article 11(1), the parties to the Covenant recognise, 'the right of everyone to an adequate standard of living for himself and his family, including adequate food, clothing and housing...'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The concept of 'adequacy', it is generally acknowledged, is determined at least in part by social, economic, cultural and climatic factors. Adequate housing can be understood as including the following components: legal security of tenure, affordability, habitability, accessibility, location and availability of services, materials, facilities and infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It hardly needs pointing out that commitments in international law, whether legally binding or not, remain statements of intent and are of limited practical use unless accompanied by a comprehensive legislative framework in domestic law which will secure both the access to the right as well as providing enforcement mechanisms. What, then, is the reality ? Has the right to adequate housing been enacted into national legislation and, most importantly, is the right actually being respected across the European Union?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Realities</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FEANTSA, the European Federation of National Associations Working with the Homeless, has been conducting the European Observatory on Homelessness with the support of the European Commission since 1991. FEANTSA's research findings have increasingly demonstrated both the extent and the gravity of the housing crisis in Europe: in what is one of the wealthiest subregions of the world, a large and growing group of the population is being excluded from adequate housing. (see box on next page)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moreover, FEANTSA's 1995 transnational research report (Home/essness in the European Union) has found that the right to housing does not exist in any Member State as a legally enforceable claim. Although the right is recognised in the constitution of several Member States, this remains a statement of intent and does not create any entitlement. Other Member States have adopted a different approach - housing legislation in the United Kingdom, for example, does create an obligation on the local authorities to provide housing for those homeless people assessed to be in priority need and found to be unintentionally homeless. There is no sign of convergence in the ways EU Member States address the right to housing and housing exclusion in their national legislation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The right to housing is not addressed in EU legislation as a legal principle and Member States have exclusive competence to deal with housing issues themselves. There is thus no overall European housing policy, nor is there yet any European policy on homelessness. FEANTSA has, however, identified common trends throughout Europe which have contributed to the escalation of homelessness and the lack of adequate housing provision.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The overall European trend has been an increased reliance on the competitive market to meet all housing needs, with an unwillingness on the part of government to commit public resources to assist lower income groups, who are therefore confronted with the limited choice available to them on the open housing market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The supply of housing has been undergoing change throughout Europe. In all countries, owner-occupation is on the increase, with tax relief generally being offered as an incentive. The private rented sector, on the other hand, has continued to decline. Social housing has generally suffered from cuts in funding. The result is that there is a shortfall in the supply of affordable housing for rent and rents have become correspondingly higher. It is clear that the competitive housing market cannot and will not meet the needs of the increasing numbers of people without the resources to afford market rents.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The type of housing required has also changed: demographic trends have meant that households are getting smaller but more numerous - thus, there is a need for more but smaller dwellings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The problem has been exacerbated by the lack of an overall strategy either at European level or, indeed, often at national level, to meet the realities of structural changes on the labour market. Indeed, in some countries, the increase in long-term unemployment has been accompanied by an erosion of social protection systems. Faced with escalating demand for longterm welfare assistance, the authorities have often responded by tightening up on eligibility criteria in an attempt to cut or limit benefit payments, with shortterm palliative measures to deal with emergency cases. Thus, increasing numbers of people living on or under the poverty threshold, coupled with the deregulation of the housing market, have led to severe housing stress and increased vulnerability to homelessness.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finland sets an example</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finland is one EU country tackling the housing problem. In 1987, the International Year of the Homeless, the Finnish government announced its intention to eliminate homelessness. At that time, the number of homeless people was put at close to 20 000. The programme for the development of housing set the objective of making 18 000 homes available for the homeless over a period of five years. Special funds were set aside in the national budget to permit the local authorities and other organisations to purchase housing for the homeless. State loans for the construction of housing for rent were made available to municipalities with a large homeless population. In under ten years, the number of homeless people in Finland has been reduced to half what it was in the mid-1980s. Finland now enjoys a comprehensive system of carefully targeted housing supply, housing subsidies, benefits and allowances and housing is seen as an integral part of a multi-dimensional strategy to combat poverty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For one in twenty citizens of the European Union, the criteria which, as a whole, constitute adequate housing remain inaccessible. Yet at Istanbul, the EU voiced its determination to make an important and constructive contribution to the implementation of the Habitat objectives. This included an acknowledgement that increased attention should be paid to people living in poverty and that appropriate action should be taken by governments at all levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European housing ministers were due to meet informally in Dublin, on 24 and 25 October of this year, specifically to tackle the question of 'housing for socially excluded people'. The time has come to devise and implement coherent strategies to prevent housing exclusion for low income groups. The market has neither the ethics nor the long-term planning capacity to do this; it remains the responsibility of the state. It can only be hoped that the housing ministers will recognise this and agree on the necessity of protecting housing as a product and as a service from the competitive market, at least for vulnerable groups. The housing ministers have been holding informal meetings since 1989. This year's meeting provides the opportunity, particularly in the light of the Habitat II debate, to exchange information on effective measures to help low income groups access and maintain a home. The result should be the drafting of a number of concrete goals to be achieved within a realistic time-scale.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Homelessness in Europe is not on the scale seen in other regions of the world - with the development and reinforcement of effective preventive policies, based on proven and cost-effective welfare models existing in some Member States, the housing crisis can still be contained. In short, where there is a political will, there is a way. Europe has the potential to serve as a model of good practice to the rest of the world and should do so, more especially in the light of all that was - and wasn't  - achieved at Istanbul. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">References</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Is the European Union Housing its Poor ? Dragana Avramov, Catherine Parmentier and Brian Harvey, FEANTSA, Brussels 1995 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Homelessness in the European Union, Dragana Avramov, FEANTSA, Brussels 1995</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Invisible Hand of the Housing Market, Dragana Avramov, FEANTSA, Brussels 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Cities of the Third World</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Francis Cass</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In ten or so years' time, more than half the world's population will be living in built-up areas and, according to UN figures, by 2025 nearly two thirds of us will live in towns and cities. This is not a complete surprise -  over the last few decades, the ratio of city dwellers to rural people has consistently moved in 'favour' of the former. In 1950, 29% of people were city dwellers. Since 1985, the urban population has exceeded 40% of the global total.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Today, we are witnessing an acceleration in demographic growth, especially in developing countries. Of the 2.6 billion people who currently live in towns, 1.6 billion live in the world's least developed regions. By 2025, the urban population of the Third World will have risen to 3.2 billion, out of a global urban population of just over 4 billion. On the basis of these figures, it is estimated that the number of urban dwellers in developing countries is increasing by approximately 150 000 people each day! In Cape Town in South Africa, for example, as in many towns and cities of the Third World, this demographic explosion can actually be seen happening. All you need to do is drive regularly along the N2 motor way  - which passes through the shanty towns of Khayelitsha and Guguletu -  to see how, week by week, the makeshift dwellings are spreading - gradually expanding to every available plot of land. The same scene is repeated in all of Africa's large towns. In Cot&eacute; d'lvoire, the population of Abidjan rises by 400 inhabitants a day on average. In Gabarone, the capital of Botswana, whose population was barely 3000 at the time of independence in the 1960s, the population is increasing by 18% each year and today 160 000 people live there. Such growth is often accompanied by widespread indifference on the part of local authorities. Such indifference is due, in particular, to a shortage of financial resources, but it also reflects an absence of political will to do anything to tackle the problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Demography and poverty</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The demographic explosion which has taken place in the urban areas of developing countries is due to three main factors: natural population growth, rural emigration to towns and cities, and (less importantly) the redefinition of the administrative boundaries of built-up areas. The first two factors are equally to 'blame' but in future, it is predicted that rural depopulation in Africa will become the single most important element in urban population growth. This will be especially true of countries where there is rampant rural poverty. In this context, we need to recognise other circumstances, such as famine, desertification, a shortage of cultivable land and conflicts, which serve to exacerbate the phenomenon. If people living in the countryside decide to migrate to towns, it is because they are looking for a better life and hope to improve their standard of living. Few succeed. According to a World Bank study, 50% of people in abject poverty will be living in urban areas by the year 2000.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The effects that urban poverty has on the environment are often dramatic. The reverse is also true. A damaged environment constitutes a daily hazard for town and city dwellers, in particular the most destitute. The precarious nature of their living conditions means that only in extremely rare cases are these people able to guard against the degeneration of their immediate surroundings. Driven to the outer limits of the towns - where even basic infrastructures such as sewers and the collection of household waste are often lacking, the poorest sections of society are left to fend for themselves. Local authorities have neither the means nor (often) the inclination to do anything to help them. Even those who are comfortably off and who can afford to give part of their income to safeguard their immediate environment (thereby protecting themselves to some extent) cannot escape the consequences of more general ecological problems such as air pollution and the contamination of water supplies. Living in a modern house in a well-to-do district is simply not enough. It is not possible to shield oneself completely from the problems created by environmental destruction. For example, even an unofficial rubbish tip, located several kilometres away from a residential area, can have disastrous effects on groundwater - meaning that sooner or later, the quality of the drinking water will suffer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Towns gasping for water...</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At present, the vast majority of Third World towns are facing a series of ecological problems which directly or indirectly, affect the lives of their inhabitants. According to the World Health Organisation (WHO), 220 million city dwellers have no access to drinking water and 420 million have no latrines. It does not take much to imagine the potentially catastrophic health consequences of such a situation - in which people are forced to drink and irrigate their land with water from contaminated sources. The WHO has estimated that three million children died during 1993 as a direct result of diarrhoea, and that nearly two million of these victims had consumed drinking water contaminated with faecal matter. In developing countries, 90% of waste water is poured, completely untreated, into rivers, lakes and coastal waters. Again, one can easily imagine the impact on marine flora and fauna, and on the health of those who eat the products fished from these waters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">...and gasp for breath</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As far as air quality is concerned, the WHO intimates that more than a billion city dwellers throughout the world breathe highly polluted air. For the most part, this pollution is generated by industry and motor vehicles. A small improvement has been recorded in the urban areas of developed countries, but air quality in the towns and cities of the South has deteriorated considerably during recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are many reasons for this. First, there has been an increase in industrial activity, mainly concentrated around towns and cities. This is a result of economic development, but also of the fact that many factories - including some with the worst pollution records  - have relocated from the North to the South, where legislation governing emissions is less stringent. Second, in contrast to the trends seen in developed countries - where cars are usually well-maintained, (running on unleaded petrol and rarely more than five years old) motor vehicles in the Third World -  whose numbers are increasing significantly  -  are frequently old, badly maintained and run on leaded fuel. According to the World Bank, 95% of the lead polluting the air in the towns and cities of developing countries comes from vehicles which run on leaded petrol and studies carried out on the subject have revealed concentrations of up to 1.5 microgrammes of lead per cubic metre of air. In North America and Europe the concentration varies between 0.2 and 0.8 microgrammes per cubic metre.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another problem facing towns and cities in the southern hemisphere arises from the enormous amounts of waste they produce and from the fact that they have few treatment facilities. In many cases, the rubbish is not even collected and is left to accumulate into the piles which can often be seen on the edges of shanty towns. This accumulation of refuse encourages the proliferation of certain diseases and poses a real threat to the health of residents both nearby and further away. In addition to this ordinary, everyday waste, the countries of the Third World have to deal with problems generated by toxic waste  - not just their own, but also that which is 'exported' there by industrialised countries. Needless to say, the towns which actually have the means and facilities needed to treat this highly polluting waste are few and far between.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Linking development with environmental protection</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While environmental problems have a direct impact on human health and on the natural world, they also entail huge economic costs. The effect of pollution on human health translates into ever-increasing health costs and a decline in productivity. And it is not only city dwellers who suffer the consequences of a deteriorating urban environment. Depending on their size, the degree of industrial activity and population concentration, towns and cities pollute and destroy areas well beyond their own administrative boundaries. They swallow up enormous amounts of natural resources, suck their hinterlands dry and spit out 'what is left'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nowadays, there is an increasing global consensus over the need to tackle these growing problems rapidly. This was seen clearly at the Habitat II Conference in Istanbul. Most cities of the southern hemisphere urgently need to get to grips with their numerous ecological problems - the alternative is to sink further into chaos. In a similar vein, it has become obvious that some sort of balance must be found between economic development and safeguarding the environment - and that considerable investments are needed to achieve this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Solutions do exist. Recycling projects, for example, could provide jobs for large numbers of town and city dwellers, as well as cleaning up the environment. Governments of industrialised nations should take the necessary steps to ensure that their toxic waste does not end up in the rubbish dumps of the countries of the South. Authorities in urban areas in the Third World should set aside more of their budgets to help the most underprivileged sections of their populations, so that they can manage their own environment. Local authorities should also respond more efficiently to the basic needs of impoverished districts, not least by building roads and sewer systems, by ensuring that rubbish is collected and by guaranteeing all people access to drinking water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Last but not least, a concerted effort - especially a concerted financial effort - should be made by decision-makers at the local, national and international levels. We need to recognise that environmental damage is a phenomenon which rarely confines itself to the local level. Sooner or later, it becomes a problem for all of us. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">When conservation is at odds with the local population</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Hendrik Smets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The clash between the interests of people living on the edges of the Zakouma National Park in Chad and the authorities' attempts at conservation illustrates the situation facing many other nature reserves in Africa. This article argues in favour of a form of eco-development to suit everyone.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the Zakouma National Park (PNZ) WAS officially set up in 1963 (it had been at the planning stage since 1956), the area it covered meant that local people had to be moved -  but the promised compensation was never paid. During the second phase of the PNZ's relaunch, financed by the European Development Fund (EDF), a perimeter path following the 1963 boundaries was marked out, but local villagers opposed this, regarding it as an extension of the Park's area. Subsequently, they rejected a move to build a dispensary in a village located at the edge of the park on the pretext that such a structure would again constitute an extension to the reserve's land.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Conflict between the itinerant stockbreeders of the region and the authorities has simmered for many years. The latter have shrunk from enforcing the 1963 law on transhumance corridors which applies to the fringes of the national park. Under this law, it is prohibited (in principle) to gather wood, hunt for game, fish, or gather honey and other natural produce. The result is a tendency among locals to view the PNZ as an adversary rather than a potential partner in development. Safari tourism is developing too slowly and is not leading to sufficient benefits for example, from a craft industry, or more general redevelopment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the second phase of the project was at the planning stage, its organisers recognised that, in order to guarantee the park's future, support had to be given to the people living on its edges. A high-level 'cooperation committee' was therefore proposed. The membership of this committee, which would sit in N'Djamena, was to include ministers, directors-general, park authorities and Commission representatives. Unfortunately it has not yet been brought into operation. By contrast, the local authorities and park management have been able to set up their own committee which met for the first time in January 1996. This body has helped to tackle some of the most sensitive problems.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The second phase also saw the implementation of a series of microprojects. - school renovations, a dispensary, a bridge, the sinking of wells, a dam, a mill and a nursery. But these were set up without preliminary study, and no arrangements were made to sound out the views of the local people, or the form of development they would like promoted. Understandably, local hostility was encountered and the projects cannot, in any real sense, be viewed as offshoots of the wider PNZ scheme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The future</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project has not been extended to a third phase. Because of this, there is a risk that the capital invested -  and the positive results that have been achieved - could be lost altogether. Should any donor choose to 'pick up the baton' in future, they will need to recognise the key imperative of creating a symbiotic relationship between the park and the local population. To do this, there must be an awareness-raising effort, undertaken in parallel with any eco-development programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the first instance, a higher profile should be given to institutional issues. In particular, the cooperation committee in N'Djamena must be able to act, where necessary, as an appeal or arbitration chamber to deal with any disputes which cannot be resolved by the local authorities' committee. The latter, of course, would continue to meet on a regular basis to discuss any problems encountered.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, there should be campaigns to disseminate information and train local people who are in daily contact with the park's environment. The aim here would be to make them progressively more accountable for conservation and the exploitation of natural resources (cutting wood, gathering produce, hunting, fishing, and so on). They must also gain a better understanding of the effects of poaching and desertification. Above all, such campaigns should seek to convince the people of the benefits they stand to gain from the park, if they continue to respect its integrity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this context, some lessons might be drawn from a regional project dating from April 1987 (which was never fully implemented). This was aimed at halting the advance of the desert in the northern Central African Republic and southern Chad. The component of the project which is of interest to the present discussion was its programme to increase public awareness  -  which involved training organisers, preparing and disseminating information (posters, videos, films), organising information tours and giving support to the Training and Environmental Information Programme of the CILSS (Inter-State Committee to Combat Drought in the Sahel), of which Chad is a member.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One could also learn something from the approach adopted by the Manda National Park which is situated 270 km from Zakouma. This has 'volunteer villagers' appointed by the chiefs of the four cantons making up the park zone, who know the territory well. The volunteers take part in information, awareness and monitoring operations alongside national park and animal reserve employees. Dressed in pale olivegreen uniforms, they cycle between the villages and encampments, providing a link between the villagers and officials in N'Djamena. They have an invaluable role in convincing village people of the advantages of cooperating in the development of the park and its surrounding areas. And the cost of a volunteer is just CFAF 5 000 (ECU 7.5) per month.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Eco-development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Returning to the PNZ, it is true that a small proportion of the population already benefits from the park's existence. Wages are paid to the patrols, and the permanent and seasonal workforce, while micro-projects have been set up. The park pays traders, artisans, farmers and stockbreeders for certain services and there are some tourists. But the bulk of the population does not see these advantages having been largely excluded up to now.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any future eco-development programme should therefore aim at reducing pressure on the park in order to guarantee its long-term integrity. This would obviously need to be preceded by a clear definition of the action to be undertaken, but in the meantime, it might be useful to offer a few guidelines. The programme should include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - a series of flanking or support activities providing infrastructure and equipment, such as a dispensary, a school, paths, wells and carts;</P>
+<P ALIGN="JUSTIFY"> - a food-security programme providing for the conservation of agricultural areas, as well as measures to prevent erosion and safeguard harvests (cereal banks, stores, gardens, agro-forestry systems and pest control);</P>
+<P ALIGN="JUSTIFY">- a project to promote natural resources such as fisheries, gum arable, honey, and straw fodder;</P>
+<P ALIGN="JUSTIFY">- a wood/energy management programme providing improved hearths and brick ovens, and the organised gathering and use of supplies;</P>
+<P ALIGN="JUSTIFY">- development of the craft industry and training of tourist guides.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If, in a third phase, an awareness and eco-development programme could be successfully implemented, the Zakouma National Park should be able to look forward to a brighter future. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">A new 'eco-centre' in West Africa: Two Presidents amid the dust</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In April, on the eve of the International Conference on Human Settlements, the first West-African eco-centre ('Ecopole`) was opened in Dakar. It was set up by Enda, one of the few international non-governmental organisations of significant size based in a developing country. The 'eco' refers to two things - the economic life of the ordinary people and the ecological aspect of the centre. One of the most memorable images of the opening ceremonies was the sight of two Presidents  -  Abdou Diouf of Senegal and his Malian counterpart, Alpha Oumar Konare  -  striding through the dust in a working-class district of the Senegalese capital. For supporters of the 'Ecopole', the event epitomised the fight back of the popular urban economy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The dust which settled on the Presidents' fine clothes was that of the Rail district, so called on account of the railway which cut through it in former times. Built in an old, disused factory, the airy, clean 'eco-complex' adds a touch of style to this semi-industrial, semi-shanty town district. The old buildings were redeveloped with the help of members of some two hundred cultural and sports associations, working in partnership with the NGO. They used recycling techniques of which they are past masters.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The complex had, in fact, been in operation for some time prior to its formal inauguration, but the ceremony  -  which attracted the interest of international press agencies - provided an opportunity to publicise the venture. Since its formation in 1972, Enda has been working to give a higher profile to the 'popular' economy (they eschew the term 'informal') in Senegal and elsewhere. The NGO has focused, in particular, on trying to encourage those involved in the popular economy to collaborate more closely and integrate their activities, as well as on boosting awareness of what is happening in similar communities elsewhere. The opening of the 'Ecopole' provided a showcase for the achievements of the popular economy in West Africa, as well as a forum for dialogue. And it now has the seal of approval of two Heads of State, not to mention other VlPs who made supportive statements at the opening.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The popular economy fights back</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For the inaugural ceremony, the former sheds - now converted into airy vaults clustered around a central structure - hosted a major presentation of the popular economy in a series of exhibitions. It is a kind of 'eco-museum' with pride of place going to recycling. Exhibits ranged from 'fabrics' made of old plastic bags crocheted together, to toy sports cars fashioned from wire and tin cans. And the reaction to the exhibition went beyond the usual, somewhat condescending appreciation of 'the skill of these people'. There were, of course, some curios of interest to tourists such as the aforementioned children's toys, small metal suitcases and papier-mache boxes. But there were also works of art, masks and sculptures, which captured something of the nature of this 'recycling culture'. Indeed, international art critics at the Biennal Festival of Contemporary African Art, taking place in Dakar, were talking of a new artistic trend, also seen in the work of artists from other regions, based on reclamation. This, of course, begs the question: 'Has art not always been based on reclamation?'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Interesting though the subject may be, the artistic and aesthetic qualities of the fruits of recycling are of only secondary importance when one is dealing with everyday objects. The important thing is for deprived populations to use what means they have to survive and to improve the quality of their lives. Tourists may choose to buy decorative and unusual objects on the reclamation market, but more significantly, families can obtain essential items such as kitchen utensils, ploughing implements, carpentry tools and stoves  - all cast from vehicle wheels and bits of scrap metal. They are made using small forges and furnaces the size of a large saucepan, or cut from otherwise unusable pieces of metal sheet. The craftsmen can also supply somewhat more sophisticated equipment: ploughs, brick-moulding machines or soldering irons. One of the exhibitions staged at the 'eco-centre' was a co-production with the Quebec Museum of Civilisation and the Canadian Embassy in Senegal, which had previously toured Canada and four African countries. Entitled 'Africa's ingenuity', it covered a wide variety of styles, ranging from the utilitarian to the artistic. It will, in due course, form the eco-museum's centrepiece. Another temporary exhibition was called 'Antuka: Kinshasa, the art of living in the city', and this paid homage to the Zairean capital - a place which, of necessity, has become one of the 'capitals' of resourcefulness. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jet engines and donkeys</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One hopes that the two Heads of State found time to admire the jet engine constructed by a young Zairean from nothing but reclaimed materials: parts taken from cars, mopeds and unwanted metal sheet. And it works -  not on an aircraft, naturally, but on the bench. This engine is now a legend. Its constructor has apparently already been spotted by a European head-hunting company and offered a job in France. This is part of the 'fight-back' referred to by Enda officials, in which some recognition is finally being given to the economies of the world's poorest populations. During his visit, the President of Senegal issued a plea for greater integration of the informal sector into the overall economic fabric. His remarks were revealing: the West-African 'Ecopole', as its name implies, covers an entire region, and assumption of responsibility by the local people for the shanty towns and poorer districts has lifted a significant burden from central government.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another example of this trend is found in the Malian capital, Bamako, where a hundred or so local community associations have banded together to take over full responsibility for the collection of domestic waste. This organisation, whose initial efforts were ridiculed, is now fully operational. One wonders whether the authorities in other cities have heard about Bamako's scheme. What about Port-au-Prince in Haiti, for example, where they are struggling with mountains of rubbish which they cannot deal with owing to a lack of resources ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since their inception, economic interest groupings (ElGs) such as the one in Bamako have helped bridge the gap between the 'formal' and 'informal' economies. They rely on collaboration and their enterprise is exemplary. At the outset, the inhabitants of poor districts, acting on the initiative of the ElGs, expressed the desire to improve their neighbourhoods by organising refuse collection. They used whatever means were available - which in most cases meant donkeys and carts. In more central districts, delivery tricycles were employed for collection. Specially constructed, tipper-style carts, each costing CFAF 200 000 (ECU 300) have since been brought into service. The price of a donkey, by contrast, is about CFAF 50 000 (ECU 75). The animals and equipment belong to the ElGs and are looked after and maintained by them, with carters receiving a monthly income and social security benefits. A number of groups were set up eight years ago, promoted by young technicians, academics, architects and economists. Those who benefit are known as 'subscribers', with each family paying a contribution towards the service. Managing equipment and collecting contributions both require a well-structured administrative department, but the administrators are not confined to their offices. As employees of the business, they see nothing wrong in lending a hand and assisting the carters. In short, it is an enterprise based on a whole new approach. The contribution made by families varies according to the EIG and the district in question, but it is generally set at around CFAF 750 (ECU 1.2) per family per month. The price of the service may be up to twice this sum in the so called 'quartier des Blancs' (the 'white' district). In theory, the state ought to be subsidising the ElGs, but in practice, this does not happen. The authorities do not even fulfil the task allocated to them under agreements signed with the ElGs, which is to transport the refuse from temporary dumps to a final site. According to local people, the problem is not that the local authorities do not have the trucks available for the task. The vehicles, they allege, are used instead for the officials' own private purposes. The ElGs are forced to plug the gap as far as possible. At present, they appear to be the only ones taking any interest in waste recycling, aware as they are of the risk to the environment posed by permanent dumping grounds, and of the specific danger that the water table will be polluted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A modern concept of the 'informal' economy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'informal' economy is increasingly becoming the norm. According to an Enda survey, 90% of businesspeople in Senegal started out in the informal sector. The conclusion would seem to be that the necessary training for dealing with current conditions is not to be found in the formal education system. The popular economy is not out of step with the modern economy as some would claim. Indeed, one could argue that it is the modern economy, as adapted to today's conditions. The increasing involvement of ordinary people in the economic circuit, which they enter via parallel routes, should also guarantee the continuation of Africa's experiment with democracy. We have seen attempts by former dictators to backtrack in this respect. They cite as evidence, the failure of technicians trained abroad - the 'darlings' of the West who, they claim, are at the beck and call of international institutions. But a return to the past, as exemplified by the regime of Nicephore Soglo, strikes fear into many people. Their response is to generate productivity, social cohesion and political stability through the popular economy, by way of compensation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is suggested that small-scale traders, who distribute hardware from south-east Asia, constitute an obstacle to the development of local production. But there is a confusion here between cause and effect. In fact, the popular economy appears more as a response to the lack of consumer goods. The problem lies with the so-called 'major' local entrepreneurs who favour the import/ export business over production, and with the banks that prefer to focus on larger businesses (influenced by anonymous officials or major economic interests) and have no time for small-scale operators.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Rail district in Dakar has a long history. It is overpopulated, having been settled by workers and artisans, and their influx made it the most expensive poor district. It is a place where the rents, for even the humblest hut without water or electricity, accounted for most of the inhabitants' meagre income. This situation led to the appearance of squatters who built their own shacks on waste ground. For these people, the threat of eviction loomed constantly like a sword of Damocles. The district is also home to a large number of maids and other household employees. Two thousand of these people (from Rail and other parts of the city) set up their own friendly society to which they pay regular contributions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is a world which has always teemed with good ideas: artisans recycling materials, blacksmiths working at the forge and so on. In this sense, nothing much has changed, but the big difference now is that the people have organised themselves. In so doing, they have been able to provide training for adults and children in makeshift schools, and to purchase and renovate old huts  - having extracted a guarantee from officials that such moves would not be opposed. Nowadays, those who live in the district no longer pay rent. However, it will only be possible to measure the true success of the Rail district when there is no longer a need for an organisation like Enda to ensure that it operates effectively.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some years ago, a former sailor, who always dreamed of being a teacher, set up his own school in the main street which runs through the district. He worked on the pavement and in the car park in front of a furniture store, teaching children in the morning before the offices opened and adults in the evening after they had closed. Enda recently offered him a few pieces of furniture, but for many years, he received no help other than a few pieces of chalk, worn-down pencils and the remains of exercise books from his 'colleagues' in regular education. This is a man who has to supply his pupils not just with teaching materials but also sometimes with food. This year, with his voice catching in his throat, he told us that one of his former 'street pupils' is going to college. How can the learned economists calculate the value of this devoted 'academic'? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The RDP challenge</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Professor Willie Esterhuyse</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The cornerstone of South Africa's Reconstruction and Development Programme (RDP) announced by President Nelson Mandela on May 24 1994, shortly after taking office, is people-centred development with an accent on modern infrastructure, health, education, housing and sanitation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lessons have already been learnt from teething troubles.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The RDP is the government's response to the massive socio-economic needs of the bulk of the South African population. It is foremost a strategic framework aimed at human development and restructuring the country's economy. It involves housing projects and programmes to improve the socioeconomic infrastructure covering clean water, electricity, public works, schools, urban renewal and primary health care. Empowerment programmes have been developed, for example; micro and small businesses, support for emergent farmers and skills training.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of the main achievements of the RDP has been to sensitise South Africans to the plight of the poor. Apartheid, amongst other things, succeeded in keeping this out of sight, effectively locking the poor out of the system. A veil of ignorance prevailed among the privileged class. The RDP tore away the veil and has led to a willingness to participate in development and reconstruction programmes, especially in private sector circles. It is succeeding in prioritising South Africa's socio-economic challenges, as well as mobilising funding and organising a common and sustainable approach. Its most important achievement to date is probably the idea of partnerships in development between the state, private sector institutions and non-governmental organisations. Through the RDP, South Africans have accepted that they will have to 'run with the development ball'. They are also aware that the state cannot go it alone, nor should it act as a 'super' development agency. Thus, a very high premium is put on involving the private sector and other actors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Problems</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But many problems have already been encountered. Unfortunately, the RDP was seen by some as a quick-fix solution to South Africa's socio-economic difficulties. Expectations over delivery were too high. Red tape and a growing bureaucracy stifled the initiative early on. Frustrations among the poor quickly surfaced. Many of those who wanted to participate, and applied for RDP funding, were unable to develop viable business plans - a strict requirement to get funds. The launch of projects was further complicated by the absence, at one stage, of legitimate local and governmental structures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But important lessons were learnt from the initial phases, in particular the need to involve people on the ground from day one - starting with the identification of needs, the design of a specific project and its execution. It was accepted that process is more decisive than the product. A second lesson was that a separate RDP office, with its own Ministry, complicated matters as far as delivery was concerned, tending to centralise development. This led to the announcement by President Mandela on March 28 1996 that the RDP office would be closed down. RDP programmes were thereafter integrated into the main budget administered by functional government agencies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another very important lesson was that socio-economic development and reconstruction had to go hand in hand with a dynamic macro-economic strategy - made public earlier this year. It was realised that one cannot have good projects in a bad policy environment - to quote a World Bank report.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In fact, it is generally accepted that the RDP, on its own, cannot launch South Africa on a road to sustainable and vigorous economic growth. We needed a twin-track approach.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Progress</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The RDP has notched up a number of successes. The provision of clean water to rural and urban communities has gone a long way under the leadership of Minister Kadar Asmal -  highlighting the fact that leadership strengthened by solid management, does make a difference. The electrification programme for low-income households, involving the parastatal, Eskom (Electricity Supply Commission), is another success story. The same goes for the Presidential projects, such as free health care for expectant mothers and infants, and some of the nutrition programmes. But the provision of housing for low-income groups has been less successful than anticipated. Rent and services boycotts, as well as unemployment, are some of the reasons for slow progress. Job creation is another problem area. It is envisaged that visible progress in these areas will emerge in the course of next year. Establishing a culture of learning is another great challenge. A restructuring of the educational system is underway, but progress is restricted by severe financial constraints.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Implementation of the RDP, the best strategic framework for socioeconomic development South Africa has ever had, will be a long process. Courage and sustainability are key issues. How to lead and manage expectations, without undermining hope, is a great challenge. The meaningful involvement of donors is another issue. Joint ventures between donors, the private sector, government agencies and communities are happening. Most of these, having been carefully negotiated and executed, are already making a significant difference.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But spectacular progress should not be expected. Development, reconstruction, and growth of the kind that South Africa needs, will take time. However, the lessons and achievements of the past two years have put South Africa in an excellent position to change the country's socio-economic environment. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Targeting South Africa's poor</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Christine Thompson</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The provision of basic amenities for the urban and rural poor rank high on the agenda of the EU's aid policy towards South Africa. In this respect, European cooperation has been tailored to fit with the government's own Reconstruction and Development Programme.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Programme for Reconstruction and Development (EPRD) is the name of the current EU development assistance package to South Africa and it seeks to help improve living conditions for all South Africans. The programme earmarks ECU 125 million a year until 1999. It has evolved from the so-called 'positive measures' programme launched in 1985 to help counter the negative effects of sanctions and to help the victims of apartheid.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under a Declaration of Intent drawn up with Minister Jay Naidoo, then at the helm of South Africa's Reconstruction and Development Programme, it was decided that EU aid should be channelled to the key sectors of education and training, health, rural development, water supply, urban development, economic cooperation, trade and investment promotion, and the promotion of good governance and democracy. In each of these areas, the EU actively encourages a partnership effort between governmental structures and NGOs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2.5 million homes wanted</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over 60% of South Africa's population is urbanised. The apartheid government's restrictions on home ownership in urban areas for the past four decades resulted in a housing backlog estimated at 2.5 million units, with demand growing by 200 000 units per year. Estimates vary, but approximately seven million people are believed to be living in informal settlements throughout South Africa on land occupied both legally and illegally.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improved housing and sanitation are seen as priority areas in urban and rural development. Between 1991 and 1996, the EU has funded 18 projects in the urban development sector valued at approximately R303.1 m (ECU 52m). The Urban Sector Network (USN) and the Cato Manor Development Programme are typical.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU is providing the USN with a total of R26.2m (ECU 4.5m) between 1995 and 1998. The USN is a national network of nine affiliate NGOs, and its aim is to improve living conditions for the urban poor. The beneficiaries of the programme are city dwellers earning less than R2000 (ECU 344) a month and there is a particular emphasis on households with monthly incomes of under R800 (ECU 137) a month.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Through integrated, community-based development, the USN and its affiliates provide technical support and service provision to urban development projects, focusing on housing, local government transformation, skills transfer, project planning, facilitation, information dissemination, education and training.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Cato Manor Development Programme received funding in 1995, also for a three year period. The EU has contributed R117.6m (ECU 20.2m) to the project. Cato Manor, an area in Natal near Durban, was the location of the largest forced resettlement scheme implemented under apartheid. Today, it is the first area targeted for integrated housing in a former white township.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The overall objective of the programme is to improve living conditions through a policy that strengthens the delivery system for infrastructure and housing. The programme anticipates providing the community with primary and secondary schools, sports fields, community halls, libraries and a community health centre. Access to housing finance will be improved and opportunities for income generation provided through a vocational training centre and small-scale industry workshops. In addition, provision is being made to improve management and general policy-making capabilities. By continuing to fund such projects, the EU is working with the South African government to improve the living conditions of the urban and rural poor. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'Guardians of Eden'</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Theatre for Africa, a performing group from Southern Africa, went on tour this autumn to put across the message that the exploitation of Africa's fauna should remain in the hands of rural communities. They did this with a powerful mix of words, dance, mime and song, in a play entitled Guardians of Eden '. The Courier met the author and cast on the Brussels leg of their tour. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The setting for the Brussels' performance was the 'Grand Place' (Grote Markt). With its ornate mediaeval architecture, this famous square in the centre of the Belgian capital could hardly have been more removed from the theme of the play - which is about conservation and development problems in Africa and empowering rural people to manage, use and benefit from the wildlife around them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The play was commissioned by the Southern Africa Sustainable Use Specialist Group (SASUSG) and the idea was that it should reach as many people as possible in the run-up to the World Conservation Congress planned for Montreal in October 1996. South African writer and former economist, Nicolas Ellenbogen, travelled throughout Southern Africa to recruit the all-African cast. Many examples of cultural imperialism leading to the destruction of habitat, highlighted in the production, were actually encountered by Mr Ellenbogen as he travelled through the region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The play opens with a spirit medium summoning representatives from villages in several African countries to discuss the threat to their survival. The actors display their athletic skills performing mimes of the abundant wildlife with simple props, as the history of Africa is recalled from the dinosaurs to the present day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A parable is then told. An old chief informs his three sons that to prosper in the 21st century, the village must change. He instructs them to return a year later with ideas for prosperity, which will be discussed in an indaba (debate). Each chooses a different path. The wheeling and dealing first son seeks out quick fix schemes with NGOs and various city authorities. The second son learns from the difficulties of city life and comes up with a blend of simple wisdom and new ideas. The third spends his time in beer halls -  and his revelry provokes roars of laughter throughout the performance.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Arriving back in his village after almost a year has elapsed, the second son finds that his older brother returned several months earlier to implement his money raising projects. Enjoying the cash benefits of the scheme, the men of the village do not want to hold an indaba. They are forced to do so by the women and Midzimu - the old chief. The audience is then asked to vote and there is a unanimous show of hands for the second son who symbolises the sustainable use of natural resources. The dissolute third son, meanwhile, is eaten by a crocodile.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ivory ban fury</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the message goes out to developers and donors to respect rural autonomy, the play also raises serious questions for Europe's politicians. The frequent appearance of the destructive elephant, in the course of the play, allows Mr Ellenbogen to vent his anger at the ivory import ban imposed by many European states. 'I am furious about the ban', be told The Courier, 'as it is having a profound effect on the daily needs of the people.' He rejects the argument that it helps conservation, insisting that; 'with a stroke of a pen, you reduced the value of the elephant.' The playwrite argues that local people need to see wildlife as economically and socially valuable. Otherwise, they will adopt new forms of land use which will result in the extinction of the species. He also draws attention to the growing black market in ivory in Southern Africa since the ban was introduced.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'token' South African - symbolically played by the only woman in the cast - is given a 'rough time as the baby of Africa', says Ellenbogen. The play also contains numerous swipes at the donor community which frequently gives grants, without, it is said, any respect for local traditions. The Swiss doctoral student researching the potential for producing goat's cheese in Africa exits the stage squealing after asking a goat herder what he does with his animals. 'We slit their throats', is his reply.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guardians of Eden was first launched at the Grahamstown Arts Festival in South Africa in July. It was performed in Zimbabwe and Kenya, and won a prize at the Edinburgh Festival 'Fringe' in August. From there, it moved to Frankfurt and Geneva before reaching Brussels. It was due to be performed in Antwerp, London and several American cities before a final staging at the Montreal Congress in October.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The play is in English and the languages of Southern Africa, but Nicolas Ellenbogen believes it can be readily understood by his multinational audiences. For him, the message - that local people must have the power to manage their own wildlife on their own land - needs no translating. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Analysis</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Europeans and development cooperation: there are opportunities too!</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Stelios Christopoulos</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If politicians in Europe see jobs as their primary concern, it is probably because the citizens regard unemployment as their most serious problem. In the Europe of the Fifteen, the average unemployment rate was about 10% in 1985 dropping to 7.5% in 1990. By 1994, it had risen to a record high of more than 11%. By contrast, unemployment in the United States fell below 6.5% in 1994 and the figures for 1995 reveal a continuing downward trend. In Japan, the proportion of people without work remained below 3% in 1994. Assuming there is no change in current trends, the most recent demographic projections suggest that there will be 70 million people over the age of 65 in the EU by the year 2020, out of a total population of 348 million. This is 18 million more than there are today. The proportion of over-65s is, thus, projected to rise from 15% at present to 20% in less than 25 years. These two elements  -  an ageing population and ongoing structural unemployment - clearly reveal that European society lacks a degree of dynamism compared with its competitors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In an attempt to address this problem, albeit partially, the President of the European Commission, Jacques Santer, launched a European employment pact in April 1996. There are three underlying reasons for this initiative -  Europe's endemic unemployment, the need to reestablish a climate of confidence as a prerequisite for renewed investment and consumption, and the need to fit the creation of the single currency into an overall economic strategy aimed at increasing growth, competitiveness and employment in Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'I'm young, help me find a job', is the heartfelt plea of many of young Europeans. But what chance is there that their cry for help will be answered in a difficult global environment?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We have seen the globalisation of strategic relationships in a range of key areas including the environment, the management of energy resources, health, demography and security. The trend has been accelerated by rapid technical progress in the fields of transport and telecommunications. This process has not taken the big multinational companies by surprise - they were already free of the constraints of sovereignty or space, and were quick to globalise their structures. These enterprises have become more competitive by taking advantage, wherever possible, of the most favourable production conditions, particularly regarding raw materials and employment conditions. More spectacular still has been the growth of international trade: in 1990, the volume of world trade was 11.5 times as great as it had been 40 years earlier. During the same period, global production only increased fivefold.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What this means nowadays is that employment in the EU Member States is directly affected (and some would say threatened) by the world situation. Productivity and growth conditions in Europe are no longer sufficient to ensure full employment. Competition from developing countries, with their low wage bills and undervalued currencies, is too great for countries in the EU. Their position is not the same as that of the multinational companies. They do not have the structures to deal with swiftly evolving events, nor are they capable of controlling the process of globalisation. This is demonstrated, inter alia, by their inability to respond to the financial speculation which turns capital away from productive investment. Today, for example, for every US dollar in circulation, there are at least 30 dollars which are the product of financial speculation. This is not money from productive work by any particular person, but money which is the product of a financial 'virtual reality' and which is usually reinvested in financial speculation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Countries are beginning to realise the need to pool their national skills and cooperate at a regional level, in order to enhance their business competitiveness and take on the challenges of the globalised trading system. But the level of integration implied by this strategic choice must be sufficiently comprehensive if it is to make up for the reduced capability of countries to respond on an individual basis. This process of regionalisation may well be a prerequisite for regulating the world economy in such areas as exchange parities and financial speculation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">And what of Europe in particular? Despite having a head-start on other regional groupings (such Asean, Nafta and Mercosur), the situation is not too rosy. Owing to the lack of a full internal market, Europe is unable to compete on equal terms with the United States or Japan. The internal market still comes up against blocks in important areas, as evidenced by problems over the European employment pact. And there are a number of other defects which make the internal market insufficiently competitive in the context of globalisation. It is true that a more coherent environment has been created for European companies, with common regulations and rules of competition enabling them to distribute their goods and services among the EU's consumers. But despite the appearance of a domestic, or single, market, it is one which is devoid of a genuine internal policy in keeping with its size. This is what distinguishes it from the internal markets of the United States or Japan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The explanation for the disparity may lie in the fact that the most recent moves towards the single market, through 'Single Act', date from 1987. This was before the upheavals which so decisively signalled the globalisation trend. Despite the criticisms sometimes levelled at it, it is a genuine single market which is largely open to the outside world (with only a few exceptions, notably as regards the Common Agricultural Policy, where it is recognised that there is a need for progressive adaptation). But there is still no single currency, nor is there a genuine common commercial and economic policy. The EU is unable to react to change at world level in the same way as its competitors. The common customs tariff, together with protective measures such as the anti-dumping regulations, are still not sufficient to solve all the Union's problems. What is needed on top of this is an active common policy component.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yet, as the European employment pact makes clear, the EU holds a trump card in an increasingly interdependent world. The proviso is that it must speak with one voice, enforce multilateral rules and open up new markets for itself, because, as the document points out 'exports create jobs...'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1994, the developing world received 37% of global direct foreign investment ($84 billion) as against less than 20% at the beginning of the 1980s (the flow of foreign exchange is regarded nowadays as the principal factor influencing development). This is a spectacular increase but the resources are not 'fairly' distributed from the point of view of either the investing countries or the recipients. For example, southeast Asia is currently the world's most dynamic region. Yet, not to put too fine a point on it, it is virtually ignored by European investors. Only 3% of European overseas investment is directed towards this zone. Likewise, Europe's market share in the region is no more than 5%. The US has invested between two and three times more in south-east Asia while Japanese investment is four times higher.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1994, sub-Saharan Africa attracted just 0.8% of direct foreign investment ($1.8 billion). And there is no evidence that Europeans have invested more than the Japanese or Americans in this region. This is despite the highly optimistic outlook for the situation in Africa offered by the late Ron Brown, the former US Trade Secretary. On returning from a tour of Africa with American businesspeople in February 1994, he remarked that major opportunities were opening up in that continent, with spectacular returns on investments  - at the time, the best in the world. His regret was that so few people were aware of the situation. Undoubtedly more significant still was the declaration made in Washington before his departure for Africa to the effect that the United States would no longer leave African markets exclusively to the former colonial powers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">So although others are beginning to explore the possibilities offered by Africa, Europe is still sceptical. A similar scepticism prevailed during the 1960s when it was assumed that the lot of south-east Asia would be famine, and few development prospects. Given the historical links between Europe and Africa, the geographical proximity of the two continents, and the pressing problems faced by the 'old' continent vis-&agrave;-vis its competitors, such an attitude appears difficult to explain. In the years since the former European colonies in Africa gained independence - and despite the creation of an institutional cooperation framework (the Lom&eacute; Convention, which many regard as a model of development cooperation)  -  many Europeans clearly no longer wish to be involved in Africa. The explanation for this lack of interest may be the difficult conditions within African countries -  obstacles preventing access to markets, the lack of liberalisation or political instability.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But this analysis in not entirely convincing. More ACP countries are democracies than ever before in the post-independence era. As for Africa - a much-debated ACP region  -  it is wrong to talk purely in terms of internal conflict, famines or the AIDS epidemic. There are countries in this continent with growth rates of between 5% and 6%, and several examples of where European companies have successfully penetrated local markets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The need to highlight the existence of genuine business opportunities in ACP countries and to make the European public aware of development aid success stories, were among the main conclusions to come out of the first meeting of a television delegates' network, organised by the European Commission's Development Directorate-General on 31 January 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Any European company chairman interested in expanding into an ACP country - thereby enlarging the company's market and enhancing its competitiveness - is likely to acknowledge the possibilities, if offered back-up from the EU or from national governments. But they will then probably point to the complications which remain -  and with some justification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With this in mind, it is worth reiterating the fact that specialised institutions exist for facilitating contact with the ACP countries. In 1995, for example, the Centre for the Development of Industry (CDI) was involved in 367 projects, assisting, free of charge, in the expansion or rehabilitation of industrial companies in ACP countries, in partnership with European business. Although the number of such projects is constantly increasing (190 in 1993,229 in 1994), it is still a long way short of what is needed. But it should be stressed that the CDl's approach, which involves promoting the creation of networks, appears to work. The establishment OF ACP contact networks in ACP countries makes it easier to identify potential areas for involvement and to prepare better for European institutional and sectoral networks. There are several successful projects which have led to the creation or safeguarding of jobs in Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Also in 1995, the European Investment Bank (EIB) granted ECU 430 million in loans to businesses in various sectors in 29 ACP countries. This includes an increase in the Bank's activity in Africa over previous years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What, then, of the effect of Europe's development cooperation policies on the European market ? According to the most conservative estimates, for every ECU 100 granted in aid, the Community 'gets back' ECU 48 in the form of jobs, supplies and technical assistance. This figure does not take account of additional 'secondary' business generated by, for example, the supply of spare parts or the provision of technical advice. This business can be quite significant given the degree of penetration achieved by European companies in the markets of many developing countries. Nor does the estimate include any new business opportunities directly arising from the links established between the companies involved in aid projects and the recipient countries. Thus, it is clear that when a project is set up, it may well have extra beneficial effects for Europe through additional flows of goods and services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The 'return' on aid is even greater in Member States' individual bilateral programmes. For example, tied aid from countries such as Belgium, Italy and the United Kingdom leads to a payback of more than 70%. Another point is that as Europe's industrial rules are harmonised, the success of a single European company in penetrating a particular developing country market may pave the way for companies in other EU Member States, thus benefiting the Union as a whole. Tied aid creates favourable conditions for setting up European companies and for placing European goods and services in other markets. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While the return on aid may be described as satisfactory, the same is not true of the number of companies that benefit or of the actual turnover involved. One wonders whether this weakness is due to a lack of information about existing resources and facilities, or whether there still a lack of confidence about countries which, despite the progress they have made, are still politically unstable and therefore unpredictable.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One might also wonder whether the time is right for investment. Our answer would be that, even though financial speculation is currently governed by global economic considerations, which prevent productive targeting of capital, this situation cannot last. There is a worldwide move to rectify the situation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We all need to be aware that time is no longer on our side. In many sectors, European companies still have a competitive edge over businesses from third countries, owing to their degree of specialisation and technological expertise. But if they are to survive, they must take on a worldwide dimension. In particular, they should pay attention to the comparative advantage that they have in the ACP countries on account of their special skills, historic links, geographical location and, above all, the institutional connections between these developing nations and the 'old' continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although problems do exist and although both European and ACP bureaucracy can sometimes discourage private operators from exploring the potential of the developing world (and more particularly the ACP region), they should not give up. Europe's challenge is to help them to exploit this potential whilst not raising false hopes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nothing can take the place of the shared experience and confidence which arises spontaneously in full knowledge of the facts. In this regard, we feel, there is still much to be done. In both Europe and the ACP countries, one way to succeed is to increase the number of networks representing industrial, economic and financial interests at various levels, and to assist them in identifying opportunities more effectively. This would help to create a new dynamism and renewed vigour in Europe. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Close - up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Eritrea: the start of a renaissance ?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the Courier's issue of July-August 1994, we published a country report on Eritrea. This country became independent in 1993 after almost 30 years of fighting which had bled the county white. Loss of human life, displaced persons, socio-economic disruption and environmental damage have been Eritrea's sad fate in recent times. However, there has now been peace for three years and the Eritrean people are attempting to pick up the threads. Alfonso Artico, a freelance journalist who recently travelled to Eritrea, now offers us a few on-the-spot impressions of his trip, focusing on some current projects which offer hope to this sorely afflicted people</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fisheries at Massawa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The port of Massawa is located on the Red Sea, whose blue waters are teeming with fish. In 1986, the European Union suggested that it would be a suitable place for fisheries development. At the time, the city was a maze of back streets, baking in the sun. Few could have predicted the fate that would befall it five years later. For in 1991, war came to Massawa and 80% of the city was destroyed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Italians, it is said, have 'always' been here, and they once had great plans for the city. Together with Assab, further to the south, Massawa was to be a key point of access to the sea, and a potential launch pad for the, country's struggling economy. The colonial days are long past but, when the Eritrean Popular Liberation Army took over the country after the recent war, the Italians came back to help tackle an immense task. The city, by then, was little more than a pile of rubble.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Help also came from somewhat further afield, in the shape of Professor Seichi Etoh, a Japanese specialist in marine biology. He had made a study of the city in 1989 and he chose to return in 1992 to help in fisheries development. At the outset, his working methods disconcerted the Eritreans who were used to a slightly more relaxed attitude to labour, under the hot sun and eternally blue sky.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Armed with the experience of working in Kenya and a number of other developing countries, Professor Etoh arrived in Massawa and installed himself in a house looking over the sea. After a period of adaptation, to gain his bearings, he took up his new challenge.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The challenge in question is a fisheries project whose main funders are the UNDP, Japan, Italy and the African Development Bank. A total of $7 million has been committed with payments spread over a five-year period. The project began operating in January 1993.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main problem at the outset was one of skills and qualifications. Important posts were often filled by high-ranking former solders, whose administrative skills were less than satisfactory. Conversely, those with the right qualifications - some of whom were criticised for spending the war years in the lecture theatres of European universities  -  had problems finding work. This was particularly true in the closed and conservative world of the fisherman. After a few teething troubles, Etoh was able to announce that he had the confidence of the government, and his efforts rapidly bore fruit thereafter. He set about reorganising the fishermen's cooperative - a task which entailed overcoming the reluctance of members to adopt new practices. He also arranged for the construction of jetties where vessels could take on supplies. Fish were to be unloaded at one spot, and their diesel tanks would be refilled at a different location. The cost of diesel is 1.41 birr (ECU 0.17) per litre. The fishermen's cooperative, which has 440 members, has 35 000 birr (ECU 4000) in its funds. It is also making repayments on a 1.8 million-birr (ECU 200 000) loan.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'In the beginning, there was frenzied activity, which some regarded as chaos', Seichi Etoh recalls. However, in less than two years, the jetties have been completed and the ice plants -  essential for preserving the fish - are running flat out. Now they are producing eight tonnes of ice a day. The daily catch is about two tonnes of fish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The real revolution occurred when Seichi Etoh decided to try and organise cooperatives for women, who represent 25% of the workforce in the production chain. He followed up with an even more radical scheme, offering them paid work in the relatively unrewarding but essential field of ship maintainance and repair. This freed the fishermen, most of whom had no remunerative activity outside the fishing season (November to March), to seek work elsewhere during the other seven months of the year. Eritrea, a country where women's potential has not traditionally been acknowledged (or tapped) had never seen the like before. Nowadays, of the 200 who fish out of Massawa, 50 are women who have formed their own organisation - and they generate a considerable profit. They have even opened up a fish restaurant!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The overall standard of living has increased considerably. This year, fisheries-related production has risen 120% compared with 1995. And the port is doing reasonably well in quality terms. Using the international scale, which ranks the catches from 0 to 10, the quality of fish landings by the Massawa fishermen is rated 6 overall - as against 8 for Japan. 5 for China and 6.5 for Europe. The local market has expanded as a result of efforts to modify local eating habits. People have been taught to grill fish instead of frying it in expensive (and somewhat unhealthy) oil. The message - 'eat grilled fish' - is going out daily on national radio, and women are going into the schools and villages to teach this 'latest' cooking technique.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The local market may be important, but the main target for the increased production is Ethiopia. With the purchase of four refrigerated lorries, it is now possible to transport fish products over long distances. Another important customer is Italy, which currently takes about a third of the total production. Seichi Etoh is hopeful that, following this example, new markets can be found in other parts of Europe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The success of the Massawa project has exceeded all expectations and, although he downplays the achievement with typical oriental modesty, it is clear that Etoh's bet has paid off. The fishermen have come to understand the advantages to be gained in reorganisation and maintaining their 'tools' of production. And as anticipated, the bulk of the profit from the project is going back to the fishermen. The government has taken care not to cream off too much for itself.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other projects are now under way. Etoh is attempting to persuade the fishermen to give up their wooden craft in favour of ferro-cement vessels but after centuries of doing things in a certain way, it will take more than a few months for the new plans to be adopted. The monthly meetings with representatives from the cooperatives are stormy and animated. However, two vessels are already being built, on the assumption that a practical demonstration is worth far more than a long speech. The 60 people working directly on the project are awaiting the outcome.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This change has become necessary owing to the cost of wood - which is one of the reasons why the fishermen have grown progressively poorer. Timber prices have been rising sharply for some years, particularly in Dubia, the regional centre of the wood trade. The war, in the meantime, sent incomes spiralling downwards.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Overall, the Eritrean fishing fleet has 500 vessels, all made of wood, of which 250 have Massawa as their home port. In previous years, the wood (known as tengi in Eritrean) came from Ethiopia. But this country is facing ecological problems and fishermen have been forced to search elsewhere for building and maintenance materials for their unstable and costly vessels (a 13-metre boat requires 8 m³ of wood). Etoh explains that the new boats, while slower, glide more easily over the water on account of their stability. However, the first attempts at change have not been easy. Indeed, things got so bad that Etoh went on holiday 'for longer than expected', he said, though he took advantage of the break to visit Singapore and buy Chinese tricycles  -  which can now be seen in the streets of Massawa. The reign of the bicycle with a simple wicker basket which could carry just 20 kilos is over. Now, each tricycle can deliver 100 kg of fresh fish, packed in ice. All in all, the programme is running smoothly. Etoh has only to check it from time to time. After all this labour, will the smiling Japanese professor be taking a well-earned rest? 'Probably not,' he says, adding 'I am currently thinking about a chain of restaurants. Fish restaurants of course !'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An unusual 'bank'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The road leading to Gersteti village is so beautiful that it takes your breath away. Multicoloured birds fly lazily above the vehicle carrying the journalists and humanitarian aid workers - who are deep in discussion about the kind of world they wish to create. However, there is a switch in the conversation once they reach the Seraye plateaux. Their attention is drawn to the fields which stretch as far as the eye can see. It doesn't take long to discover that demand for land here far outweighs supply. The situation, which is already critical, has not been helped by the influx of refugees returning from neighbouring countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When the war ended in 1991, everyone's prime concern was to relaunch an agricultural sector ruined by 28 years of combat. Farmers and farming communities, the lifeblood of the countryside, had been mobilised to fight on the front line. In 1990, agricultural production was at such a low level that the word 'negligible' featured prominently in the Ministry of Agriculture's statistics.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Oxfam, which first came to Eritrea in 1978, has been running an unusual project on the Seraye plateaux. Located to the south of Asmara, the capital, this region is the second most densely populated part of the country. Five districts containing 65 villages and 17000 families, were chosen for the project  -  on account of their low rainfall and the fact that it is difficult, and in some cases, impossible, to cultivate the exhausted soil. Local communities, village leaders and politicians all understood that only full-scale collaboration could prevent a food-supply disaster in the province. An organisation was therefore created: the villagers elected 13 representatives (12 men and one woman) and began by setting up a seed bank. There was a severe shortage of seed materials in this devastated country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project got off the ground in November 1995 and is set to run for three years. Its objective is simple: to guarantee self-sufficiency in seeds and to provide a reserve during hard times. The 'Seed Bank Committee' has also given training to 40 farmers in seed conservation, terracing and basic agricultural economics. Two wells have been sunk, but these are insufficient for the 40 square kiLom&eacute;tres that require irrigation. Oxfam is putting up the money for the various initiatives while the local community is providing the labour force. It is worth noting that a bag of averagequality cement costs 35 birrs (ECU4), equivalent to one third of a worker's monthly wage. Fourteen different varieties of seed have been stored in sheds - which the locals visit to obtain their supplies. The purchase of 230 quintals of local seeds and the donation of 70 quintals from elsewhere have started the programme off. Next year, Individual farmers will have to repay this 'loan' in kind, with a 10% 'interest payment', also in the form of seeds. The surplus generated will be retained by the bank as a resource to be drawn upon, if necessary, when times are hard.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Advantages</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The local community was quick to understand the advantages to be gained from this system. They were all too aware of the low productivity of their land and up to then, were powerless to resolve the situation. The possibility of falling back on traditional resources to offset production difficulties no longer existed. And the skills they had acquired over the generations were now insufficient, given the poor condition of the soil. In these circumstances, one can well understand their enthusiasm when they saw that 100 kg of seeds per hectare yielded a harvest six times larger than previously. Other elements which contributed to a progressive improvement in conditions were the sinking of new wells, a reduced influx of refugees from Sudan, and a slow but appreciable improvement in the country's general economic situation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As well as being involved in this project, Oxfam is an active member of Acord, an NGO association which extends cash loans at rates much lower than those demanded by the banks. (Acord's rate is 12% per annum with a minimum repayment of 5 birrs per month). Targeted mainly at the most deprived sections of the population, the loans enable the poor to set up small businesses or, more commonly, to purchase agricultural implements, repair irrigation channels and buy cattle. Once again, a village committee manages the transactions. The scheme has brought renewed hope to the most deprived groups. Individual loans have been available since 1994 and the association currently has 163 clients. The total amount lent so far is 878 000 birrs (ECU 110 000).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The combined effects of these programmes - seed banks and preferential loans - are already visible. It would take months to visit all the farms and fields, workshops and stores, where men and women have invested their energies and hopes. Seraye province now produces a third of Eritrea's cereals, a telling illustration of the fact that one does not need billions of dollars for development and humanitarian aid for the work to be effective. In the final analysis, a country's wealth lies in its citizens. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An up-to-date printing plant</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As one strolls down Liberation Avenue, which cuts the city of Asmara in two, one might be forgiven for thinking that 28 years of war have already been forgotten. Surveying the multi-coloured neon signs of the shops, it certainly appears as if the country has turned the corner and the wounds are healing rapidly. One building whose restrained frontage stands outs in sharp contrast is the Adulis printing-works. Adulis was the name of a semi-mythical city founded by the Greeks on the Red Sea in the third millennium before Christ. 'But there is nothing insubstantial about this place', comments Mohamad Shiffa Osman, with a smile. He is one of three expert typesetters who went on a training course in Belgium earlier this year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> The Adulis printing works has its own particular memories of the Eritrean people's struggle for independence. As far back as the 1960s, when the first shots were being fired, the resistance recognised that their fighters and the civil population both had to have access to information. However, it was not until the 1980s that a true propaganda structure came into being. During the war, the Eritrean People's Liberation Army ran a clandestine ministry of information. In Eritrea and elsewhere, this became the channel for conveying practical information, and providing the latest news from the front. It was also used to transmit personal messages, which were delivered to the heart of areas occupied by the Ethiopian Army. 'Our presses were hidden in caves, up in the mountains, and everything was run on generators', Mohamed remembers. The initial amateur approach was quickly replaced by a more professional one. 'We did have professional printers working for us, but it was mainly self-taught comrades'. On-the job apprenticeships had to be fitted in between bouts of fighting!</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'At the time of liberation, in 1991, we set about restoring this printing works, which was founded in 1896 by the Italians', Mohamed explained as he gave us a guided tour of the works. The effort put into relaunching this essential activity soon bore fruit. Within the year, the printing operation was running at a profit - indeed it had a virtual monopoly of printing in the country. The presses were brought down from the mountains on the backs of camels and then taken to Asmara by truck. 'You see this Aurelia 48?', asks Mohamed, pointing to a machine. 'Well, it was up in the north, hidden away in a village'. Throughout our visit, Mohamed draws attention to equipment from an earlier age  -  candidates for the museum which are still in operation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some items have their own story to tell, like the press donated years ago by Oxfam which still churns out thousands of sheets every day. During the war, it was taken from cave to cave, following the army's advance as it conquered new terrain. Most of the Adulis machines, however, were already there, when the decision was taken to restart the operation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The initial budget for the works was a tidy five million birr (ECU 620 000). Today, Adulis has an annual turnover of 20 million birr. Monthly salaries range from 400 birr (ECU 50) for maintenance staff to 1800 birr (ECU 225) for the director, Michael G. Bakhli. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The printing works also acts as a testing ground for workers' social progress. According to Mohamed and the director, the 350 or so people employed at the works benefit from exceptional social cover. If a worker falls ill, his wage is guaranteed for one month, then it drops to 50% in the second month and stops altogether at the end of the third. if a woman is pregnant, she has to take a month's statutory leave and is granted a further two months on full pay. In the event of dismissal, an employee receives two months' wages, although this latter arrangement is gradually changing to one month's wages for each year of service.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Far from resting on the laurels of their success, the Adulis works' directors have appealed for assistance. In order to be at the cutting edge of technology and to have the resources to break into new markets, they need to supplement their knowledge. Therefore, three 'volunteers' spent the three months from January to March this year working in Belgian companies, to the satisfaction of everyone, both hosts and visitors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under Mohamed's gaze, the walls of the workshop have been brightened up with posters which provide a splash of colour. Although the noise from the presses often drowns out conversation, you cannot escape the feeling of hope here. It is like a breath of fresh air, and one leaves with the strong impression of a country that is rising from the ashes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Developing world</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">ECHO fine-tunes disaster preparedness strategy</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Eva Kaluzynska</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When a cyclone strikes in the Caribbean, beware of giant flying razorblades - airborne sheets of corrugated iron that kill and maim unsuspecting victims every time. 'The use of galvanised iron sheeting for roofing is extremely dangerous in cyclone-prone areas,' says Professor Debarati Guha-Sapir, Director of the Centre for Research on the Epidemiology of Disasters (CRED) at the Universite Catholique de Louvain. 'We know this, and we need to encourage the use of lighter materials, such as thatching, which doesn't kill if it flies off in a gale,' she adds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">That is the kind of issue facing people exposed to unavoidable natural disasters  -  in the Caribbean's case, every year. In 1995, there were 27 tropical storms in the region. CRED has been in the vanguard of monitoring natural disasters and in coming up with solutions to the problems they create since it was set up in 1973. Now it is assisting the European Community Humanitarian Office (ECHO) in developing its new Disaster Prevention, Mitigation and Preparedness Programme (DIPECHO) to cover the next two years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since 1994, ECHO has spent almost ECU 7 million on 50 disaster prevention operations, at both national and regional levels. Now, instead of just responding to requests for funding from non-governmental organisations, international organisations and governments, ECHO has decided to fine-tune its strategy. It will concentrate its efforts on specific regions known to be particularly vulnerable and prone to natural disasters. We may not know exactly when disasters will strike, but we certainly know where to expect them. The regions selected at present are: the Caribbean, Central America, South East Asia and Bangladesh.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All of them are exposed to repeated emergencies. All of them have a struggle to develop when their efforts are disrupted so frequently. They cannot just pick up where they left off. Loss of life and property is just the most visible aspect of what happens when disaster strikes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The infrastructure, such as it is, takes a hammering. Road and rail links are severed. Communications, electricity and water supplies break down. Add loss of health care and sanitation, and you get populations exceedingly vulnerable to epidemics. Add loss of education facilites, and a vicious spiral of poverty sets in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An expert in emergency aid cites the sad example of the Aetas, a tribal group that used to live a secluded life on the remote slopes of Mount Pinatubo, the volcano that erupted spectacularly in 1991 in the Philippines. Though the volcano was known to be menacingly active, the Aetas were not evacuated and resettled in time. They fled in panic as disaster struck, to the plains, where they faced a deadly, invisible enemy: measles, a disease to which they had never been exposed. Measles claimed more victims than the volcano itself did in the months that followed. They could have been resettled earlier. And they could have been immunised years before, but weren't.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It's easy to be wise after the event. DlPECHO aims to encourage action before it's too late. The idea behind ECHO's new policy is to take each region, and to identify its hazards and capacity for dealing with disasters. This will help to pinpoint the gaps. Then it will draw up Action Plans that slot into the wider picture of potential development in each case.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DIPECHO projects will involve training personnel in the regions affected to handle disasters, and to strengthen the institutions that can contribute to effective prevention, preparedness and mitigation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some of the solutions are ingenious, low-cost, low-tech ideas. Take, for instance, the use of light, widely-available, inexpensive materials for roofing in earthquake or cyclone-prone zones - an idea poorer countries could adapt from wealthy Japan's experience. Or the construction of safe, raised 'islands' that will stay above the waterline amid flooding in Bangladesh to offer shelter. Or adapting drainage, and changing cropping patterns in Andhra Pradesh, India, to mitigate the effects of cyclones.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In earthquake-prone Central America, protecting roads and bridges, or building schools less prone to collapse is very important. Using the radio or even neighbourhood watch systems to sound the alarm when disaster is imminent can make a big difference to its impact in terms of injuries. Drilling all at risk, from school-age up, to know what to expect and to know what to do is vital.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">DIPECHO did not include Africa in its first selection of regions for Action Plans. This is not to underestimate the gravity or scale of the disasters experienced there, says Professor Guha-Sapir: 'Floods, drought and famine are very frequent events there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">They are often killers.' Overexploitation of scarce resources and political turmoil compound situations that lead to disasters which seem less dramatic than a volcano eruption, but are no less far-reaching in impact.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The instability in many of the areas worst affected means that African countries lack the institutions needed to prepare for disasters in an organised way, she says. 'There are limits on ECHO's ability to intervene. It's unrealistic to expect the kind of grassroots, technical preparedness we are talking about in the current situation.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ECHO's Jean-Claude Heyraud sums up the new policy: 'As far as preventing, mitigating and preparing for catastrophes goes, the new proactive approach reflects the importance ECHO attaches to this type of action. The DIPECHO programme meets the growing need to evaluate risks in order to reduce loss of life and damage to property. If and when emergency aid is needed, preparation and prevention can help to reduce the scale and cost of such actions.' </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Culture and society</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">African reflections</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">by Seydou Sarr</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The third Festival of African Cinema was held in Brussels on 15-22 June. For one week, film-goers in the Belgian capital filled the auditoria of the Palais des Beaux-Arts, where they discovered new images of an alternative Africa. And as always, when the time came to assess how the Festival had gone, professionals and organisers alike were left pondering the problems facing the African film industry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Organised for the first time in 1994, on the initiative of Diaspora Productions, the Festival had a number of objectives, including that of bringing Africa's finest films to wider public notice. The initiative stemmed from two observations. In the first place, the European public's opinion of Africa is based on what it sees on television -  and that image is of a continent so ravaged by famine, misery and strife that it is incapable of progress. Second, from a professional standpoint, there is no effective distribution network in Belgium for African films. Samba Traore by Burkina Faso's Idrissa Ouedraogo and Hyenes by the Senegalese Djibril Diop Mambety were two rare exceptions in succeeding in getting on to the circuit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A forum for reflection</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In setting up film-industry meetings, the organisers of the Brussels Festival wanted the event to be a forum for reflection on the problems facing African cinema. In the 40 years it has existed, there has undoubtedly been some progress. It is even possible to speak of genuine mastery of images and cinematographic language. But there are also many problems -  involving production and distribution, a lack of official support, a shortage of private capital and limited access to international markets. At home, meanwhile, African firms face fierce competition from multi-million dollar productions coming out of the USA, Europe and Asia. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Europe has traditionally offered the only feasible route for those seeking technical and financial resources. The principal donors are the European Union, the ACCT (Cultural and Technical Corporation Agency) and the French Ministry of Cooperation. There are, of course, many instances of African directors producing films without taking this route, but these ventures usually have smaller budgets, and insufficient funds to devote to promotion (press releases, trailers etc). As regards distribution in Belgium, directors face an additional difficulty - they have to take the language issue into account (particularly when films are shown in Flanders).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">African professionals are looking at various ways of solving these problems, including the possibility of coproduction with European operators. For some years now, public and private bodies have also been considering the idea of establishing combined co-production teams in a form of partnership, as a way of supporting African cinema. This topic has been on the agenda of other African film festivals (notably in Amiens) and it came up for discussion in Brussels as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A colloquium on the subject of ACP/Europe co-production was staged on the fringe of the Brussels event. This served to highlight a number of successful experiments in North/South collaboration. One example was the Cape Verdian film Ilheu de Contenda, by Leao Lopes which was made with support from a Belgian production company, Saga Films. This film was screened at the Festival. It also gave an opportunity to discuss a range of other topics. African journalists accredited to the Festival were given the task of drafting a resolution whose conclusions will be submitted to various contributors including FEPACI (the Pan-African Federation of Film-Makers), the European Union, producers and other donors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There was general agreement that a coherent legal framework for organising relationships between directors and producers, on the basis of mutual trust, was badly needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Positive results</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is worth making a brief assessment of the efforts made by the organisers of the Brussels Festival to offer an improved programme. The showing of shorts at the beginning of a performance is undoubtedly a formula they should employ again. These works are a specialised genre which give young directors the chance to present their first work. The bulk of the shorts that were screened this year were in the form of 'documentaries' based on fiction - but with one foot in the real world. They dealt with people's lives, their daily concerns, and a variety of social phenomena. Thus, we were presented with films dealing with Aids, urban delinquency, the role of women in society and so on.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another positive point the organisers should concentrate on is the space resewed for English and Portuguese-language films. There were eight performances in this category including four feature films in English and two in Portuguese. A further worthwhile element was the space allocated to African women (from Nigeria, Kenya, Zimbabwe and Burkina Faso) who have chosen to use the cinema as a means of expression.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Diaspora Productions' managers are said to be reasonably satisfied with the way the Festival went. They hope it can continue to be held at the Palais des Beaux-Arts, since they see this as one way of liberating African cultural events from the Afro-Brussels 'ghetto' where they have often been held. They are also keen, in future years, for African films to be shown in Brussels cinemas while the Festival is under way. If this happens, film-goers in Brussels will have the pleasure, from next year, of seeing quality works in their usual cinemas. The timing is appropriate since the 1997 Brussels event will follow the Ouagadougou Festival (Fespaco) which traditionally sees the launch of a number of new films.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Family meeting</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The organisers chose to close the 1996 Festival with a fashion parade which gave Pathe 'O, the designer from Cot&eacute; d'Ivoire, the chance to present his collection to the Brussels audience.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the fringes of the Festival, there was also a musical offering in the shape of the Toure Kunda brothers who came to lend their support to filmmakers and other African artistes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are those who would argue that the Brussels Festival has now entered the category of a 'not-to-bemissed' event. Every year, it attracts significant numbers of film-makers from Africa and the diaspora, even when they have no current projects or films to present. There was a real family atmosphere in the corridors of the Palais des Beaux-Arts, due in no doubt to the absence of competition. From the outset, the Diaspora Productions team chose to stage an event at which prizes were not awarded, thereby promoting reflection and contact with the public. It is generally agreed that the Brussels Festival offers a rare opportunity for film-makers to meet and discuss their productions and projects in a relaxed atmosphere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The credit for this, in the view of many of the participants, lies with Pape Mbaye Sene, one of the guiding lights of the event, who has also been dubbed the 'high priest' of African cinema. It has, in fact, been suggested tongue-in-cheek that 'in Brussels, they award a Pape, not an Oscar'. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">'We make films... but we do not exist!' - interview with Souleymane Cisse</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The future of African cinema seen through the eyes of the Malian film maker, </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In April, The Courier had the opportunity of meeting Souleymane Cisse, one of Africa's most celebrated film-makers, who has won several awards at major international film festivals. His films, such as Yeelen, which was awarded the Prix du Jury in Cannes in 1987 (the first African film to receive such a prestigious accolade), Waati, which was entered at the same festival, and Finye, have already become classics. Cisse is not just a director, he also produces his own films. In 1972, he impressed international critics by single-handedly producing a short film of exceptionally high quality Cinq jours d'une vie -  which won an award at the Carthage Film Festival. By relying, above all, on his own limited resources, combined with a powerful determination to develop and promote Africa's film industry, Souleymane Cisse has an implied but powerful message for the entire African continent. When he went on stage at the Palais des Festivals in 1987 to receive his award for Yeelen, he said that he was accepting it on behalf of all those who did not have the opportunity to speak for themselves. In particular, he dedicated the film to all the South African technicians who had worked together with him on the project. His has made spirited efforts to boost the African film industry and it was in this context that he helped set up the 'Union of African cinema and audiovisual producers and entrepreneurs' last March. This organisation aims to encourage African countries (especially in West Africa), to take the necessary political decisions to ensure the survival and grouwth of African cinema. When we spoke to Souleymane Cisse, our discussion ranged far and wide. We began by asking the film director whether African art gets the recognition it deserves in Europe? He seemed surprised at the question but then, without hesitation, proceeded to explain his own approach - with the emphasis on the political rather than the aesthetic.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The recognition that African art gets in the West has more to do with politics than aesthetic discernment. Such recognition evolves from the spirit of Africa's relations with the other continents, a spirit which is often devoid of all honesty. We stand at the threshold of the 21st century. We should be looking to develop ways of communicating with each other and finding common ground. We should be able to look each other in the eye. When, for example, people in France debate whether or not the Louvre should have a gallery of African art, it begs the question, 'who is asking for what ?'. When some people wonder whether or not African art really is art, they are asking themselves a pointless question. African art is. Nothing more, nothing less. In any case, the West has some highly contradictory views as far as the whole idea of art in Africa is concerned. On the one hand they dispute the fact that the culture of the Ancient Egyptians was, in essence, an African one, and yet on the other hand the characters of Ancient Egypt - in films for example - are always portrayed as dark-skinned. African art is the 'in' thing at the moment, despite the current tendency to belittle Africa. They think that today's Black Americans and Afro-Caribbeans can be made to forget their African roots, but that just will not happen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Generally speaking, do you think that African politicians should devote time and energy to this battle to defend African culture when their countries face such insurmountable material problems ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> -  Once they have gained power, the obsessive preoccupation of our politicians has been to concentrate on economic policies, neglecting their countries' cultural needs. But without a deeply-rooted culture, you cannot discuss matters on equal terms with representatives of other nations. In their heart of hearts, they will not respect you fully. There have been two or three countries which have tried to combine economic development with cultural development - I'm thinking of Guinea under Sekou Toure, Mali under Modibo Keita and Ghana under Kwame Nkrumah, but in one way or another, all three have been thwarted, for their perceptiveness. I am not now commenting on, or necessarily agreeing with, their domestic policies, but rather with the broad vision they shared for Africa as a whole. The fact that Europe is currently in the process of forging the European Union will be an instrumental force in the opening up of other regions of the globe. It was Europe, after all, which divided much of the world into English speakers, French speakers, Portuguese speakers, Spanish speakers and so on. Now that Europeans are themselves seeking to unite their countries, how could they possibly object to a similar union in Africa - for the sake of its cultural identity. This idea of a United Europe is, therefore, a welcome one. What is more, I believe that the issue has already been tackled within relations between the European Union and ACP countries. Not only is Africa the continent closest to Europe; it is in helping to develop the African continent that Europe has most to gain.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· The cultural aspect has already been incorporated into Lom&eacute; IV, but it seems that ACP countries do not attach as much importance as they should to such matters when drawing up their lists of priorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Many of the politicians in charge of these countries themselves lack any sort of culture. Alternatively, stripped of their own culture, they flaunt that of a foreign land. They say that health care is a priority, that food is a priority, but cultural needs do not figure on their list. Yet culture forms part of an urgent need. You'll see - as soon as any sort of cultural development takes place in a country, or wherever a country already has a viable, thriving culture, its economy will also flourish; of that there is no doubt. A nation which has a highly developed culture will always be able to stand on its own two feet economically. Take, for example, the nations of the former Soviet Union  - their economies may be unstable at the moment. It's only natural that they have to start from scratch, but as long as they manage to hold on to their cultures, they will pull through. These countries will not lag behind as Africa has done.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· It costs money to operate a film industry. Have you found that your reputation as a director has made the financial side of things any easier for you ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - I don't honestly think much has changed in the way we finance our films. Perhaps I should only speak for myself, but I do not believe it is any easier for me than it is for young filmmakers. Mali has no film production facilities, so we are all in the same boat. That is why we organised a colloquium in March this year, aimed at getting a picture of the exact state of West Africa's film industry. What we learned was that it is in pretty bad state. We make films but, in a certain sense, we don't really exist as a film industry. I would dearly like my works to be screened, for example, in Mali, Guinea and Senegal, but that is not possible because the distribution and screening networks are no longer there. Even the most liberal Western countries have passed laws to promote and protect their local film industries, so why don't we do the same ? I cannot make films in the United States without first going through various unions and other professional associations. In France, I cannot distribute my films the way I want, and if I want to make a film, I have to make it through French producers. If people come to work here, they should have to use national producers. The relevant laws were drawn up three or four years ago, but they still haven't been passed. We want all those involved in the film industry to have the opportunity to be true professionals. There should be assistance available to modernise projection rooms and theatres. We are currently in the process of setting up the 'Union of African cinema and audiovisual producers and entrepreneurs' which should help to persuade governments to take our requests into account.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Isn't African cinema also a victim of television ? </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - The problem in Mali is a very simple one. We live in a country where people like to get out and about. The cinema is somewhere they can do that quite easily. So people use it as a place where they can meet up in the evening, just as they like to congregate around the fire to sing and dance. So why are our cinemas empty ? Because when people do go to the cinema, they cannot see the screen properly or they cannot hear the soundtrack, or they are uncomfortable sitting on broken and rickety chairs. If you can provide a suitable and comfortable environment for them, people will start going to the cinema again. That doesn't mean that television doesn't have its place, but people like to go out. This is especially the case with our open air cinemas, which are the perfect places for people to come together, have a chat, enjoy each other's company and relax. A nice auditorium, a good film, and you'll see how the queues will form. All we need to do is upgrade the auditoria, re-equip the projection rooms, overhaul the sound systems, put new chairs in - just a few basic comforts. When people go out to the cinema, it's because they want to escape from their humdrum routine for a while, to dream and unwind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">African governments should do what they can to enable people to relax and enjoy themselves like this. Going to the cinema is like going to school. People go there to learn something - whether consciously or subconsciously - and to see something different. We really must get rid of this purely commercial vision of the cinema, especially in Africa. It should, first and foremost, be a cultural experience, and only subsequently a commercial exercise. But we also need to be realistic. When helping those involved in promoting the film industry, the government should lay down a precise set of conditions, specifying how and when the loans should be repaid and requiring something in return for their subsidies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· So you think that if the Ministries of Culture in African countries were given greater powers, they would be in a position to carry out this task ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - It is not something solely for the Ministry of Culture. This is the type of approach which should be adopted by the state as a whole, in each country. For example, the government should provide a support fund for the film industry and certain other branches of the arts. Even if they were increased substantially, the meagre budgets allocated to the Ministry of Culture in our countries would still represent paltry sums. In Africa, the department of culture is at the bottom of everybody's list.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· But if you look at the number of African films that have been shown in recent years at Cannes and other international festivals, surely one can afford to be a little more optimistic than you are ? More and more young African filmmakers are releasing films.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - True, but as I said earlier, no progress has been made as far as film production is concerned. In that respect, contrary to what people may think, we are still at square one. Young filmmakers are put off and, as more and more avenues are closed to them, they gradually lose their fighting spirit. A film director has no choice but to be his own producer, his own manager - to do everything himself in fact. The result is that he becomes a jack of all trades and a master of none. During our recent colloquium, we decided to set up smallscale facilities which will deal solely with film production and where young people can go and use their services, thus leaving them free to channel their energies into actually directing their films. In the same way, we intend to set up other structures which will deal exclusively with other aspects of the cinema industry. The goal we have set ourselves is that of fostering professionalism in the West African film industry. Maybe then our governments will listen to us.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· Do you think there is any difference between African countries as far as opportunities are concerned ? For example, Burkina Faso would appear to be the cinema capital of Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - Yes, and no. More often than not, it is African film-makers who have chosen Burkina Faso to stage events connected with the cinema industry because it is a landlocked country. This is what has made it the film capital of Africa, not any deliberate move on the part of the politicians. Having said this, the government in Burkina Faso is also making great efforts, despite its limited resources. But each country has its own potential. We must stop trying to tear this continent apart.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">· You mentioned the former President of your own country, Modibo Keita, as one of those far-sighted enough to appreciate the importance of nurturing African culture. Where does Mali stand at the moment in terms of strengthening its own cultural heritage identity ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - After independence, in the years from 1960 to 1968, there was a time when young people would get together and become involved in various biennial art festivals. We had a series of events which encouraged a kind of a 'cultural vision' nationwide. They were so successful that other countries were soon following our example. After the coup in 1968, however, everything fell apart. In the following 23 years there was a total cultural vacuum, in which young people felt completely disorientated, despite superficial attempts to relaunch the festivals. We are now only just trying to rediscover our cultural roots after a long period of upheaval. What we in Mali do have working in our favour, is the fact that our country is a harmonious patchwork of different peoples, all living together without the slightest trace of bitterness or hatred. We are lucky here because our rulers rarely tried to manipulate our ethnic loyalties to set one group against another. A Malian, irrespective of his roots, will always rejoice in the success of his fellow countrymen, whatever tribe they happen to belong to. We owe our good fortune to a heritage in which our peoples have always respected one another - even when they have faced each other as enemies. It is only as a result of this historic mutual respect that we can now speak of a Malian culture where each individual group of people has its own idiosyncrasies, its own customs, is sensitive towards other cultures and actually rejoices in their differences. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">CTA Bulletin</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">CTA and the promotion of rural development through book distribution</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One of CTA's tasks is to provide information on request to researchers, extension workers, planners, farmers' organisations, trainers and information specialists involved in agricultural development in ACP states. In addition to requested publications, CTA also distributes publications on its own initiative to its target groups. These publications, some 550 titles, are also supplied free of charge and consist of books published by CTA, co-published, or purchased specially because of their relevance. In 1995, almost 65 000 books were posted to ACP countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The people who receive the publications to some extent select themselves, because they write to CTA with requests for information. They find out about its existence through attending CTA seminars held in ACP countries or in Europe, or through seeing copies of Spore (CTA's bi-monthly bulletin in English, French and Portuguese which goes to around 50 000 addresses and is seen by many more), or by word of mouth. Over the years, CTA has built up a mailing list of 42 500 addresses of people and organisations active in some way in agriculture and rural development. Of the total, 37 800 are in ACP countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But there are questions. Are our books getting to those who need them and is the targeting accurate enough? And, most importantly, is this the best way of doing things ? For CTA does not - and cannot - satisfy the total demand for books on agriculture and rural development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">What is the best way?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the number of addresses on the mailing list, many more people could in theory still be added. Should CTA even try to satisfy this demand ? The publications are free and, if CTA increased its coverage of the demand, it might in some countries hold back the development of local bookselling with a consequent detrimental effect on local publishing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The majority of those now on the mailing list are 'individuals' rather than institutions, libraries, documentation centres, associations, organisations, etc. On the face of it, more people could be reached by sending CTA publications to groups rather than to individuals, but it's not always clear who is an individual in the sense of information not being shared with others. Some individuals are teachers, some are extension agents, some receive publications on behalf of a cooperative, for example.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Because of the importance of information - the driving force behind development  -  CTA has been investigating and giving support to technical publishing and book distribution in Africa over the last few years and is currently examining its own policy on book distribution over the ACP countries as a whole. Part of the context for this policy re-appraisal is the state of bookselling.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Difficulty of book distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Everyone involved in the books business in and for the ACP countries knows that getting books where you want them to go, book distribution, is not straightforward. The reasons for the difficulty are not straightforward either. One development officer remarked of Papua New Guinea that the lack of books outside the capital, Port Moresby, couldn't simply be explained by lack of roads, because in the most out of the way places you could be sure of finding Coca Cola. Is it, then, that the Coca Cola company has superior marketing and distribution arrangements ? Probably so, but it is the nature of the two products which also determines how far they get. Traders will more readily take goods which they know they will be able to sell easily and the immediate satisfaction given by cigarettes or Coca Cola tends to put them before books in the list of priorities for purchase.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Among the ACP countries where CTA sends books and information, many have under-developed road and rail networks while the postal facilities provide a reliable service only to a relatively small part of the country. The local book publishing and bookselling industries are often themselves developing. Potential readers often cannot afford to buy the books and consequently book distribution is the weak link in the chain from writing and publishing a book to selling it. If books can't be sold, new ones can't be published, for the investment finance for a new publishing project has to come from somewhere.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Africa, the lack of a strong local book sector was attributed in part to the traditional oral culture of the continent which left little need for reading. The majority of students would read in order to pass their exams, after which they hardly sought books again to buy or to read.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main books distributed were therefore textbooks for schools, colleges and for higher education. As long as these were distributed through booksellers, a forum still existed for displaying and raising interest in other books.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Booksellers could also function as sources and conduits of information about the variety of books in print and of their interest to particular groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This development was stunted because of the low purchasing power of many people, lack of foreign exchange (except in the CFA franc states), high cost of importing (either books or the raw materials, print machinery and spare parts to manufacture books) and, consequentially, shortage and lack of variety of locally-published books.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition, in some countries the state intervened in school book publishing and supply (for example in Tanzania), so that the bread and butter of the bookselling business disappeared.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Booksellers then either diversified their stock so that they became bookseller-stationers or worse - books came after groceries, footballs, hats, etc., or the booksellers ceased trading in books or closed down.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The publishing-distribution chain in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Book distribution is part of a chain of activities in the book sector which depend on each other and support each other. The chain starts with an idea for a book which may come from an author or from potential readers who make known their needs and it ends with the published books being bought. The lack of a good book distribution infrastructure in Africa is linked to the lack of a wide variety of books from a good number of publishers and the lack of a market for the books.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At least until South Africa became a democracy, Nigeria probably had the most active publishing industry in Africa with a high level of publishing professionalism. In such a huge country this may not be surprising: there is a large market, state administrations with urban headquarters, and a variety of arrangements for publishing and distributing books. But publishers suffer from a scarcity of investment funds, with high costs of borrowing, which affects their ability to keep books in print and to start new publishing projects. Relatively few technical books are published locally because of the risks when compared with, for example, publishing school textbooks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In such a vast country, the state of book distribution varies from place to place, with cities and large towns obviously having a greater variety of books available for sale than small towns and rural areas. Small traders carry books to the latter; they do not take orders and the books they carry are those that they can get hold of which they think will sell. Would-be readers are frustrated unless they or their friends visit a city. Mail order is not a possibility because the domestic postal service is not trusted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the urban areas, where there are booksellers, an indeterminate number of potential readers cannot afford to buy books, especially those that have been imported. Book piracy is a consequence of this. Booksellers' sales have declined, their turnover has been reduced as has their ability to stay in business. Some institutions in the country buy direct from publishers or from overseas suppliers rather than from booksellers, which further damages them. Booksellers buy books from publishers in small quantities for a fast turn-round which affects publishers' ability to build up investment funds for the next publishing project or for a large reprint with its possibility of reducing unit book costs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This is not to say that technical books are totally unavailable from Nigerian booksellers, but it is clear that only specialised outlets which know their book-buying customers well can risk stocking some of them. Rural dwellers have no chance of buying them without making a big effort in time and money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In contrast, Senegal has a less developed publishing and bookselling industry than Nigeria, with about a dozen professional publishers and a small network of booksellers, mostly in Dakar and the larger towns in the regions. The most important publishing opportunities in Senegal are in the field of primary school textbooks - where there is competition both within the country, with publishers from other developing states, and from the North. Senegal being a lot smaller than Nigeria, there is only room for one textbook, and primary school book production is not therefore the mainstay of local publishers. The publisher which used to supply all primary and secondary school textbooks for the Ministry of National Education is an exception and is still probably dependent upon educational publishing for its turnover. Few technical books are published; as with books for higher education, they are imported.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The network of booksellers has been decreasing and it is difficult to make a living just by selling books without the back-up of other products to sell. Thus there are bookseller-stationers, bookseller-grocers, kiosks and street sellers, especially of secondhand books. Booksellers tend to order titles in small quantities because they cannot risk being left with unsold stock which ties up their capital. They order little and often. Most school textbooks are distributed through the Ministry of National Education, but booksellers still sell a variety of textbooks, some official and approved and some not. Before the devaluation of the CFA franc, booksellers ordered more from abroad. These books have now doubled in price, making them unaffordable, with a consequent opportunity opened for local publishers to fill a gap.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Apart from the professional publishers, various sorts of publications are being produced and distributed by literacy and post-literacy organisations and a delegated literacy ministry. Some organisations promote literacy for its own sake, while others use the attainment of literacy as the means through which development can spread in rural areas. The publications concern rural development, agriculture, health and nutrition, and rural democracy, amongst others. There is a good variety of different titles and a good supply of cheap and affordable books. Some are sold through booksellers, but most people buy them when they take their literacy courses, while small traders carry them up-country to sell and buy more copies from the publishers with the proceeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Book aid schemes</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A whole literature exists on book aid schemes. Briefly, book aid comes in two forms, one using the local book sector and the other not to any great extent. The British Government's Educational Low Prices Books Scheme (sadly scheduled to end, at least in its present form, in April 1997) and the French Government's Programme Plus both use the local bookselling industry to make available standard tertiary textbooks and others at subsidised rates. Not all students could afford to buy them, but the two schemes nonetheless promote bookselling and commercial life within ACP countries and beyond. To some extent they safeguard the continuation of fore where up-to-date books can be seen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CTA's books aid scheme does not use the local book sector in terms of book distribution, although cooperation in co-publishing is beginning. The FAO, in distributing publications to ACP and other developing countries, is similar. Books supplied under multilateral and bilateral agencies' projects have tended to sidestep the local book sector, although this has been changing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As with food aid, the question to be answered is whether continuing the aid prolongs the condition ? Or does the analogy with food aid break down in certain circumstances because books are different ?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improving book distribution in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Various efforts are being made to improve book markets for African publishers. For example, the African Books Collective, based in Oxford, UK, markets and sells both anglophone and francophone African publishers' selected books in the North and also to other African countries. It is often easier for publishers in the North to sell their books in Africa than it is for African publishers to sell their books across frontiers and in the continent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publishers Associations have been formed in about a dozen countries with APNET, the African Publishers' Network, celebrating its fourth year as a continental association. CTA supported APNET in the production of the first catalogue of agricultural books published by African publishers. Very recently, an Africa-wide booksellers association has been created.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">CTA and future book distribution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since CTA started distributing books on agriculture and rural development, publishing and bookselling activities in many ACP countries have multiplied and the context has changed somewhat. As noted at CTA's Montpellier conference in 1995, there is now much information and many documents going from North to South, suited to the planners, research workers and extension agents who process the information and pass it down to the small-scale farmers. Rather, a two-way information route would be more efficient, between farmers who have information to offer as well as information needs and information providers. The growth in requests to CTA for publications from co-operatives and farmer associations and from non-academic libraries and documentation units is evidence that the publications distribution service is fulfilling a need. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The Couriers mailbag</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Earthen architecture</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">I read your article on 'Earthen Architecture', published by the CTA Bulletin in the September-October 1996 issue of The Courier (n° 159) with a great deal of interest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The article presents such traditional products as rammed earth and adobe which have been used by man since time immemorial as witnessed by constructions and monuments to be found in the countries cited by the authors of the article, as well as industrial products such as the compressed earth block (CEB), which have provoked much interest in many parts of the world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The authors also demonstrate that the use of the compressed earth block has a distinct advantage in that it valorises local raw materials, encourages the setting up of local enterprises and creates employment.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this regard, I would particularly wish to inform you that the Centre for the Development of Industry (CDI) has, for the last ten years, been working on the industrial development of the CEB sector through support to ACP promoters at various levels:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - diagnostic studies of projects and setting-up of production units;</P>
+<P ALIGN="JUSTIFY"> - search for EU technical partners who have economically advantageous technologies and are ready to transfer their know-how;</P>
+<P ALIGN="JUSTIFY">- training of enterprise personnel in CEB production and in the utilisation of this product;</P>
+<P ALIGN="JUSTIFY">- support in the manufacturing of brick presses such as is currently the case in Nigeria.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some 100 small and mediumsized enterprises and non-governmental organisations in ACP countries involved in the CEB sector have benefited from direct CDI assistance. This assistance has, notably, led to the improved technical and economic performance of these enterprises.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beyond support to projects, the CDI in collaboration with CRATerre actively participates in the industrial promotion of this technology. The Centre recently disseminated 2000 copies of a technical guide entitled 'CEB: Production Equipment' throughout the ACP countries. An exhibition on the compressed earth block and its application took place during the Industrial Mining Forum held in Lusaka, Zambia, in December 1994. Similar exhibitions were held during the Matconstruct Forum (Libreville, Gabon, October 1995) and at the Industrial Partnership event (Bordeaux, France, February 1995). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The standardisation of the compressed earth block is a prerequisite for the development of this sector. The Centre therefore organised a workshop on this topic in Yaounde in 1996 as a follow-up to the Matconstruct Forum. This seminar brought together some 40 ACP and EU participants to discuss the 'CEB: Standardisation' guide currently being prepared by CRATerre for publication in December 1996.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main objective of the guide is to encourage ACP promoters to manufacture products in conformity with accepted norms and thus facilitate CEB integration in the industrial construction market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Efforts made by the CDI, in collaboration with CRATerre, to develop the CEB sector deserve to be better known. We would therefore look forward to an opportunity to present the Centre's activities in this sector in a future issue of me Courier. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Surendra Sharma, Director, Centre for the Development of Industry,</P>
+<P ALIGN="JUSTIFY">Brussels, Belgium.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Map insets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thank-you for your informative magazine. I wish you all the best in your endeavours to improve me Courier further. May I suggest that in the Country Report profiles, you include an inset map of the region highlighting the country in question for those readers who may not be familiar with the area.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Andrew Frederick Meya, Kampala, Uganda.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A number of readers have raised this point with us since we have rearranged the cover pages and transferred the ACP and Europe 'regional' maps to the inside back cover. In future, we will endeavour to ensure that there is a cross-reference to this page in the Country Report profile. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Bibliography</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Publications received</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">La politique etrangere du Cameroun (Cameroon's foreign policy) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Narcisse Mouelle Kombi. Pub. L'Harmattan, Collection «Points de vue» (5-7, rue de l'Ecole Polytechnique, F-75005 Paris). 1996. 238 pp. ISBN 2-73843701-X.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cameroon belongs to the zone formerly called the 'Third World' which is nowadays labelled the 'South'. This region of great diversity currently faces major socio-economic and political conflict, and receives 'multiform' and 'tied' aid from the developed countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This does not, however, prevent it from having a degree of freedom of action in diplomatic terms.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author, who is a specialist in international law, believes that as a player on the world scene, Cameroon puts its foreign-policy skills to good advantage and has acquired a certain respect in international relations and in global institutions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He argues that Yaounde is attempting to implement a realistic and pragmatic foreign policy, reflecting its own sovereign status and the imperatives of development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, the country is endeavouring to implement the changes forced upon it by modern circumstances.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Le developpement institutionnel - Les organisations a l'epreuve de la specificite et de la concurrence (Institutional development - Organisations based on specificity and competition) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Arturo Israel. Translated from the English by Alain Claisse. Pub. L'Harmattan (5-7, me de l'Ecole Polytechnique, F-75005 Paris). 1996. 235 pp. 140 FF. ISBN 2-73844322-2.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A graduate of the University of Chile and the London School of Economics, the author has devoted most of his career (particularly within the World Bank) to examining the problems of economic and social development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He has been one of the pioneers of institutional development, a field which is nowadays seen as essential to all development strategies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He argues that institutional development requires not bureaucratisation but the promotion and recognition of two principles in both public and private organisations. These are competition and specificity. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The former induces those involved to improve the quality of their work, whilst forcing them to listen to the 'consumer'. The latter involves qualifications, specialisation and a precise definition of objectives, tasks, resources and results.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">After a critical review of assessment reports produced over a 15-year period by the World Bank in the field of institutional development, Arturo Israel tells us why such development is one of the keys to success in development projects. He demonstrates that a good project being implemented in an unfavourable institutional environment has little chance of achieving positive long-term effects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">La justice internationale face au drame rwandais (International justice confronted by the Rwandan crisis) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under the direction of Jean-Fran&ccedil;oise Dupaquier, with William Bourdon, Pierre-Serge Heger, Frederic Mutagwera, Fran,cois-Xavier Nsanzuwera, Rakiya Omaar, William A. Schabas and Anne-Marie Swartenbroekx. Pub. Karthala (22-24, boulevard Arago, F-75013, Paris). 1996. 248 pp. FF 130. BF. 715. ISBN 2-86537-662-1.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is two years since the genocide and political massacres which resulted in the death of a million people in Rwanda. In this work, the authors describe and analyse the progress made in various legal proceedings in Rwanda itself, in the international arena and in the jurisdictions of Belgium, France, Canada and Switzerland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some countries have been slow and apparently reluctant to fulfil their international obligations and this has resulted in disappointment and impatience on the part of the victims' families, jurists and human rights activists.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the example of the Nuremberg trials, the authors suggest there are good grounds for concluding that international human rights have become less important over the last 50 years. This work allows one to reach a considered opinion. Modern legal instruments provide for the punishment of those responsible for the appalling tragedy in Rwanda. These instruments could be seen as a significant advance in the recognition of human rights by the international community. But what is missing at the moment is the political will (and public pressure) to implement them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Methodologies d'analyse de la mortalite des enfants - Applications au Cameroun (Analytical methodologies in child mortality as applied to Cameroon) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Amadou Noumbissi. Pub. Braylant-Academia (25, Grand Rue, B-134B Louvainla-Neuve) and L'Harmattan (5-7, rue de l'Ecole Polytechnique, F-75005 Paris). 1996. 305 pp. ISBN 2-87209389-3 (Academia-Braylant) and ISBN 2-7384-3722-2 (L'Harmattan).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Child mortality, always very high in sub-Saharan Africa, varies according to social class, habitat and region. The identification of the social, economic and cultural factors which influence the survival of children depends on the quality of data, and on the relevance of the indicators and statistical models used.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">With the aid of specific examples, this work attempts to demonstrate the origin of a number of sources of bias in so-called classical approaches and the distortion of the truth which a poor choice or detrimental manipulation of statistical models can give rise to.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A teacher and researcher at the Demographic Institute of the Catholic University of Louvain (Belgium), the author proposes methods to take account of the interdependence and synergy which exist between the factors which affect the risk of mortality. He applies these methods to the data gained in two national surveys which were carried out in Cameroon in 1978 and 1991.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Revue Region et Developpement (Region and Development Journal)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pub. L'Harmattan (5-7, rue de l'Ecole Polytechnique, F75005 Paris). 1995. 238 pp. ISBN 2-7384-4125-4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This half-yearly journal, first launched in 1995, deals with the various socio-economic aspects of regional development. The second issue contains articles which may be of interest to our readers, including: 'Regionalisation, globalisation and polarisation of the world economy: is there room for developing countries?', and 'Housing models in developing countries'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Structural adjustment and ethnicity in Nigeria</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">By Eghosa E. Osaghae. Pub. The Nordic Africa Institute (P.O. Box 1703, S-751 47 Uppsala, Sweden). 1995. 66 pp. ISBN 91-7106373-0.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The author is a lecturer who heads the politics department at the University of Transkei in South Africa. A significant conclusion from his study, undertaken at the Nordic Africa Institute, is that from the ethnic standpoint, the implementation of structural adjustment (with its corollary of reduced state involvement in public life), has had positive effects in Nigeria. This contrasts with the usual perception of the structural adjustment process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The migration experience in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collection prepared under the direction of Jonathan Baker and Tade Akin Aina. Pub. The Nordic Africa Institute (P.O. Box 1703, S-751 47 Uppsala, Sweden). 1995. 353 pp. ISBN-91-7106366-8.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This volume aims to take stock of migration in Africa. The causes of the phenomenon are varied and complex, and the authors have chosen an approach which illustrates the diversity of the theories, and methodological and analytical trends involved.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The book offers an empirical assessment of migration in contemporary Africa, focusing particularly on the problem of women migrants. Migration is an important element in the wider development equation and this work fills a gap in the literature.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Challenges to the Nation-State in Africa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collection prepared under the direction of Adebayo O. Olukoshi and Liisa Laakso. Pub. The Nordic Africa Institute (P.O. Box 1703, S-751 47 Uppsala, Sweden) in collaboration with the Institute of Development Studies, University of Helsinki. 1996. 213 pp. ISBN 91-7106381-1.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The challenge confronting the nation state in contemporary Africa are of great interest to specialists attempting to understand how deconstruction and recomposition of the political identity of populations affects the post-colonial unitarian project. The studies offered in this volume show that this process has often taken ethno-regionalist, religious or separatist forms -  reinforced by economic crisis and the negative effects of structural adjustment, not to mention the legacy of years of political authoritarianism and exclusion dating from the colonial period.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The authors believe that in order to promote national unity and a sense of citizenship in Africa, priority should be given, inter alia, to more representative forms of government, power-sharing and decentralisation, multi-party elections, the reinvention of the post-colonial social contract and cultural autonomy for minority groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agenda for Africa's economic renewal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Collection prepared under the direction of Benno Ndulu and Nicolas van de Walle. Pub. Overseas Department Council (1875 Connecticut Avenue, NW, Suite 1012, Washington, DC 20009, USA). 1996. 246 pp. ISBN 1-56000900-4.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For 20 years, sub-Saharan Africa has been experiencing a severe economic crisis. Growth has been stagnant and the result has been reduced living standards for much of the population, and ever-increasing pressure on the continent's political structures. Structural adjustment, advocated by international organisations in an attempt to restore growth in Africa, has not had the anticipated results and has given rise to a number of disputes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this book, 10 African, US and European experts attempt to look beyond the immediate horizon and identify strategies which could be implemented to give renewed vigour to the African economy. They analyse the choices which should be made in key areas such as agriculture, trade and industry, the role of the state and the social sectors. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">News round - up</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<I><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">In brief</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">World congress against the sexual exploitation of children</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first international congress dealing with the problem of the sexual exploitation of children for profit was held in Stockholm from 27 to 31 August. The initiative for the meeting came from ECPAT (End Child Prostitution in Asian Tourism), working in collaboration with the Swedish government, the United Nations Children's Fund (UNICEF) and a group of NGOs supporting the Convention on the Rights of the Child. The congress was attended by government representatives from most of the UN countries, participants from various international and regional organisations (including the UN Centre for Human Rights, the International Labour Organisation, the World Health Organisation, UNESCO, UNHCR and Interpol), NGOs, health professionals and media representatives from across the globe.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The aim of the congress was to draw the international community's attention to the issue of the sexual exploitation of children and to promote the development of national plans to tackle all forms of abuse in this area. It focused particularly on three aspects: child prostitution, the 'trade' in children for sexual purposes, and child pornography.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although there are a number of legal instruments which refer to these problems, the key one for the purposes of the Stockholm meeting was the Convention on the Rights of the Child. In Article 34 of this multilateral treaty, which has been ratified by 186 countries, the signatory states commit themselves to protect children against all forms of exploitation and violence of a sexual nature. For the purposes of the Convention, a child is defined as any human being less than 18 years old, except where the age of majority is lower than 18 in the relevant local legislation (Article 1).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The committee that was responsible for planning the Congress drew up documents on a number of themes including: the revision and application of laws; psycho-social prevention; tourism and child prostitution; those who engage in abuse; hygiene and health; the role of the media; child pornography; education; and human values. These subjects were all examined by working groups during the two-day session.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The congress was addressed by Anita Gradin, Member of the European Commission with responsibility for internal and judicial affairs, and matters relating to immigration. She took the opportunity to underline the point that the traffic in women and children was international. Organised crime, she said, lay at the heart of the 'trade' and it was closely linked to a whole range of other criminal activities. She cited, in this context, kidnapping, forging of documents, 'false' marriages and adoptions, clandestine immigration, violence and forced labour. these, in turn were associated with the drug trade, extortion and murder. The conclusion was that a global action plan and more international cooperation were needed. Ms Gradin acknowledged that existing arrangements had been successful in exposing the existence of paedophile networks but she was convinced that international cooperation should be strengthened further, and that organisations such as Interpol and Europol would be called upon to play a bigger part in the future. The European Commissioner went on to declare that a commitment to the protection of children ought to be a priority. The UN Convention on the Rights of the Child - which is now eight years old -  should not merely tee 'adopted' by all countries. It should, rather, be applied in full and integrated into the legislation of every nation. There was no point, she suggested, in enacting new laws, if the existing ones were not being implemented and the financial resources had not been provided. Ms Gradin reaffirmed the European Commission's commitment to the fight against the exploitation of children. This would be reflected in communications to be drawn up by the Commission for presentation to the Council of Ministers and European Parliament, on the following subjects:  - the treatment of women (on the basis of the recommendations made by the Vienna Conference on this subject, which was held in June 1996);  - sex tourism, notably in certain countries in Asia and Latin America;  - actions designed to eliminate paedophile rings and child pornography networks which make use of new information technologies such as the Internet. During the congress, the Belgian Minister of Foreign Affairs announced that his country would be launching an initiative at the EC's Justice and Internal Affairs Council meeting scheduled for 26 and 27 September. They would be proposing common action designed to strengthen police and judicial cooperation in the fight against the sexual exploitation of children for profit. He believed that it should be possible to take measures both within the framework of the Europol Convention, and by means of new and specific cooperation instruments. The culmination of the Stockholm congress was the adoption of a declaration and an action plan. These foresee strengthened cooperation and coordination among local and national authorities, and a series of measures to protect children, prevent abuse and provide rehabilitation. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">1997: European year against racism </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In a resolution adopted on 23 July, the Council of Ministers formally designated 1997 as the European year against racism. The aims, set out in the resolution, include:  - highlighting the threat posed by racism, xenophobia and antisemitism, in terms of both respect for fundamental rights, and in ensuring the economic and social cohesion of the European Community;  - encouraging reflection and discussion of the measures needed to tackle racism, xenophobia and antisemitism in Europe;  - promoting a sharing of experiences, best practice, and effective strategies drawn up at the local, national and European levels;  - disseminating information on the aforementioned best practice and strategies amongst those most closely involved in the fight against racism, xenophobia and antisemitism, with a view to enhancing the effectiveness of their actions in this area;  - highlighting the advantages of integration policies implemented at the national level, in particular in the fields of employment, education, training and housing;  - taking account, wherever possible, of the experiences of victims of racism, xenophobia and antisemitism, and promoting the participation of these people in society. ECU 6 million will be spent on a series of activities designed to help achieve these objectives during the 'year against racism'. A logo and slogan will be devised, and seminars and conferences will be staged with the aim of strengthening international cooperation (themes will include the role of education in eliminating racism, ways of establishing dialogue, and establishing mutual respect between different communities living in towns and cities). Documents and audiovisual material will be distributed, and an effort will be made to get the message across in the media. There will also be action to encourage information exchanges on best practice, and to increase public awareness of the issue. Prizes will be awarded to media organisations which safeguard the quality of the information they put out and which seek to promote tolerance. A specific effort will be made to counter the racist propaganda now appearing on the Internet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">WTO banana challenge</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union has set out its legal defence of duty-free preferences for African and Caribbean banana producing countries that are members of the Fourth Lom&eacute; Convention. This took place in September at an initial hearing of a World Trade Organisation (WTO) panel  - convened at the request of a number of competing banana producer nations. African and Caribbean states were permitted to voice their opinion as third part)" in the case, despite an objection from the United States. The EU's banana market arrangements  - notably Protocol 5 of the Lom&eacute; Convention, which sanctions duty-free access  - have twice before come under attack in the Geneva body. Two earlier hearings in the WTO's forerunner, the General Agreement on Tariffs and Trade (GATT), concerned the EU's previous state-to-state regime, and the new single market arrangements which have been in operation since July 1993. The present panel was set up at the request of four Latin American banana producer nations - Ecuador, Honduras, Mexico and Guatemala - together with the United States which is arguing that its domestic banana companies are losing out. The complainants jointly claim that the tariff quota for Latin American nations, the core of regulation 404/93 establishing the EU regime, discriminates against them. They also challenge the licensing arrangements of the so-called 'framework agreement' made under the GATT framework in 1994 with four Latin American nations (Colombia, Costa Rica, Nicaragua and Venezuela). In return for a bigger share of the EU market, these four agreed to refrain from further challenges in the WTO against the EU's banana arrangements.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The panel is expected to give its verdict in March 1997. The hearings are taking place behind closed doors, but it is understood that EU and ACP nations can count on the support of Japan - which currently imposes its own quotas on imports of other items and does not want to be challenged for these - and that of India which wants to show solidarity with the ACP countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Speaking in Geneva, Cot&eacute; d'lvoire's Commodities Minister, Alain Gauze, stressed the heavy dependence of many African and Caribbean states on banana growing. 90% of Dominica's commodity exports are bananas and the crop accounts for 70% of its export receipts and 25% of its Gross Domestic Product.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One ACP representative in Brussels described the task ahead es 'convincing them (the panel) that the banana regime and regulation 404/93 are required to fulfil the obligations of the EU under the Lom&eacute; Convention and the subsequent waiver.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The waiver to which he referred was accorded by GATT to the Lom&eacute; Convention's various non-reciprocal trade preferences in 1994, but it is up for renewal at the end of the year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU has already put in a request for its extension until February 29, 2000, coinciding with the expiry date of Lom&eacute; IV.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The WTO was expected to rule on the renewal of the waiver in mid-October ahead of the panel's decision. If the renewal of the waiver were to be disallowed, the EU and ACP 'defendants' at the panel could find themselves on shaky legal ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the meantime, the EU has fixed its 1996 tariff quota, allowing a maximum of 2.553 million tonnes of Latin American bananas to be imported into the Union with a tariff of ECU 75 per tonne.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A further quota of 72 440 tonnes has been allocated to this region following tropical storms Iris, Luis et Marilyn. The damage caused by these storms led to the suspension of supplies of bananas from several Caribbean islands. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EU banana production is expected to reach 750 000 tonnes in 1996, while preferential imports from the African and Caribbean members of the ACP group have been fixed at 680 000 tonnes. According to latest predictions, the total consumption of this fruit in the European Union in 1996 will be 4030440 tonnes. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">D.P.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Trade and labour standards</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ahead of the first ministerial meeting of the World Trade Organisation (WTO) to be held in December in Singapore, the European Commission has published a discussion paper (COM (96) 402 final) on whether labour standards should be linked to trade - which could mean sanctions for nations which do not comply with globally recognised labour clauses. What is at stake is to draw up globally recognised criteria and implement them without accusations of protectionism from some developing nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At an informal meeting of EU trade ministers in Dublin on September 18, EC Trade Commissioner, Sir Leon Brittan, said that, in supporting an international code, the European Union had no intention of damaging the competitive advantage of developing nations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many Asian countries, who view the move of the EU and of other industrialised nations as veiled protectionism, do not even want the subject broached at the Singapore meeting. However, mention was made of the link between trade and internationally recognised labour standards in the conclusions of the Uruguay Round of GATT in Marrakesh in 1994, which requested that the WTO do more work on this issue.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The recent Commission paper advances the reasons for an international code: 'Workers in certain sectors in particular perceive that their jobs are under threat from imports from countries which allow unfair or unacceptable working practices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These concerns cannot be ignored and should be addressed by the world trading system. Otherwise the perception will be - wrongly - that trade liberalisation is the problem and not the solution to the challenge to all societies to create a higher standard of living for all their citizens.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It further makes the point that such a policy is in line with others such as the promotion of democracy, respect for human rights and adherence to the rule of law. The EU has always upheld the view that there is a positive correlation between social progress, economic growth and trade liberalisation. According to the paper: 'There is no question of imposing on developing countries the higher wage levels and better working conditions which pertain in the industrialised world. Nor is this an action designed to re-erect new barriers to trade under cover of a social agenda.'</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU and international bodies are already looking at the kind of global criteria that might be adopted. A report of the International Labour Organisation (ILO), published in 1994, as well as the conclusions of the 1995 World Social Summit in Copenhagen, both suggest that freedom of association, collective bargaining, prohibition of forced labour and the elimination of child labour are top of the list.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A report entitled: 'Trade, Employment and Labour Standards - a study of core workers' rights and international trade', produced this year by the Paris-based Organisation for Economic Cooperation and Development (OECD), looks at the options in depth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jeff Atkinson, trade policy advisor for the NGO, Oxfam UK, suggests that initial negotiations should be limited to matters covered in ILO Conventions 87 and 98. The former deals with freedom of association and protection of the right to organise, while the latter is on the right to organise and collective bargaining. He argues that other Conventions, covering such matters as the right to equal renumeration for men and women workers, freedom from discrimination and the abolition of forced labour, depend on the first two. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A notable omission from Jeff Atkinson's list is ILO Convention 138 on child labour. He does not feel that this Convention adequately addresses the issue. While international concern has focused on the most abusive forms of child labour such as slavery and prostitution, he points out not all child labour is so grossly abusive. Some forms can bring in money for food and shelter, which would otherwise not be available.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">He argues that if conditions are right, employment (say on a family farm or business) can contribute positively to a child's development, by providing an informal learning environment in which social and physical skills can develop.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">'To tackle the symptoms, for example by banning child labour, without addressing the underlying cause is likely to be counterproductive', says Mr Atkinson. He argues that it might induce children to seek illegal work in order to survive, or alternatively that they may end up becoming destitute.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some bodies are already trying to enforce improved standards. Although the ILO cannot implement sanctions, if an ILO member fails to comply with Conventions, a dialogue can be instituted with the defaulting country. It is also running an extensive public campaign against child labour and is assisting the development of social labelling for goods produced which fully respect ILO Conventions.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under its new Generalised System of Preferences (GSP), the EU can remove some trade preferences if goods imported from non-Lom&eacute; developing nations are found to have been made with forced or slave labour. And from January 1, 1998, extra preferences can be given to countries which so request and comply with Conventions 87, 98 and 138. But if the enforcement of a socalled 'Social Clause' does reach the WTO level, some voices are already calling for joint monitoring involving the WTO and that long-time champion of human rights, the ILO. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">The 1996 UNCTAD Report</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A slow world growth rate is revealed in this year's annual report of the United Nations Conference on Trade and Development (UNCTAD), published in September. The global economy expanded by only 2.4% in 1995 compared with a 2.8% increase in 1994. And production is below what it could be, says the report. On the whole, developing nations achieved higher growth rates than their industrialised counterparts in 1995.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1996, world growth is expected to slow further although there will still be 'star performers' in some regions, and particularly slow movers in others. Asia is the continent currently doing best and China has the fastest expanding economy - despite this having slackened in recent years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1995, Africa recorded higher growth than Latin America, according to the Rubens Ricupero, UNCTAD Secretary General. It also managed the first real increase in average per capita income for a long time. This was partly due to commodity prices picking up - they rose 10% on average.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">But not such good news for the continent was a drop in private capital flows, notably direct investment. And the growth rate was highly variable across Africa. In some countries it was above 5% but in others, the economic situation was hit badly by political and armed conflicts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Meanwhile, drought led to lower production in the Sahel. The prospects for 1996 are uncertain according to the report. It noted that even countries whose economies have expanded during 1995 and 1996 will need another ten concurrent years of good economic results to get back to the per capita income they enjoyed 20 years ago.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The report highlights the tremendous difficulties facing many of the heavily-indebted, least developed nations. This is despite the fact that a number of donors have recently written off substantial amounts of some countries' public debts while the Paris Club has rescheduled repayments from other nations. Even if the new arrangements are followed through, UNCTAD is predicting that debt will remain a major burden for many countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One worrying factor is the weight of their multilateral debt and bilateral obligations to creditors other than the Paris Club. Multilateral institutions have implemented a number of measures, but these are of very limited scope. The UNCTAD Secretary General is encouraging multilateral creditors in particular, to put more muscle behind their debt relief plans.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The authors of the report are also recommending the establishment of an agency, within UNCTAD itself, to help developing nations achieve trade diversification and industrialisation strategies for economic growth. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Seminar on NGOs and government relations in humanitarian emergencies</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The British Council is organising an international seminar on the above subject in Oxford, UK, from 12-17 December 1996. The main themes to be covered at the meeting will include:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - the actors in humanitarian assistance;</P>
+<P ALIGN="JUSTIFY"> - funder and donor policy;</P>
+<P ALIGN="JUSTIFY">- government sovereignty;</P>
+<P ALIGN="JUSTIFY">- rights and obligations of intervention;</P>
+<P ALIGN="JUSTIFY">- the role of the beneficiary;</P>
+<P ALIGN="JUSTIFY">- conflicts of interest and areas of cooperation between donor NGOs and host governments, and;</P>
+<P ALIGN="JUSTIFY">- accountability and evaluation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Further information can be obtained from the Marketing Manager, International Seminars, The British Council, 1 Beaumont Place, GB-Oxford, OX1 2PJ.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tel. (44) 1B65 316 636, Fax. (44) 1865 57368.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">E-mail: International. Seminar@britcoun.org </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<I><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The institutions at work</Metadata>
+  </Description>
+-->
+</I><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">COMMON FOREIGN AND SECURITY POLICY</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Within the framework of its Common Foreign and Security Policy (CFSP), the European Union has recently issued a number of statements, details of which are set out below:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burundi: condemnation of the massacre on 19 July</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 23 July 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union expresses grave concern at the deteriorating situation in Burundi especially at the killing of civilians and other gross violations of human rights which continue to be perpetrated in that country. It vehemently condemns the massacre of civilians in the Bugendana camp for displaced persons on 19 July last and deplores the expulsions of Rwandan refugees against their will. This massacre, following as it does those at Gishubi, Kivyuka, Teza, Mutoyi, Songa and Kamenge, represents a new stage in the vortex of violence, action and reaction putting Burundi at risk of being drawn ever further into a full civil war, the effects of which would be catastrophic for the people of Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU calls on all Burundians to turn away from violence and move singlemindedly along the road to a peaceful and negotiated solution of their problems. It would point to the undertakings given on 25 June 1996 at Arusha during the Summit of Heads of State of the region in favour of dialogue open to all sectors of Burundi's population together with provision of the security measures needed to create the conditions for such dialogue. It would also point out that these undertakings were given formal backing by the Heads of State and Government of the entire continent of Africa when they met from 8 to 10 July at Yaounde under the aegis of the Organisation for African Unity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU believes that only compliance with the undertakings given at Arusha and their swift implementation can restore a climate of confidence and prevent Burundi becoming embroiled in a generalised conflict. As it has already stressed in the Council's statement of 15 and 16 July, the EU reiterates that it is prepared to assist in pursuit of the Arusha objectives in order to restore peace and security in Burundi and it supports the efforts of former President Nyerere and the countries of the region to achieve this.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burundi: appeal for reconciliation following the coup d'Etat </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 26 July 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union shares the deep concern of the Secretary General of the United Nations, and others, about yesterday's military coup in Burundi.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU urges all sides to avoid recourse to violence and to take all steps to resolve the crisis by exclusively peaceful means.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU believes that the main immediate priority is the humanitarian situation. There must be no further loss of life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An immediate beginning of a national debate is essential, leading to a real process of national reconciliation, founded on democracy and security for all sections of society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this regard, the EU commends the efforts of former President Nyerere and regional leaders to broker an all-inclusive, negotiated settlement in Burundi, in peaceful conditions, and urges them to examine the possibility of continuing their efforts in this respect.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU reiterates its firm commitment to the re-establishment of peace in Burundi. The Union is following developments in the country closely, in active consultation with partners in the UN, with the OAU and others, towards the goal of restoring peace and security in Burundi. The EU Special Envoy, Mr Ajello, who is in the region, is actively assisting in this process.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Niger: doubts about the first round election results</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 1 August 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union expresses deep concern about the way in which the first round of the presidential elections in Niger on 7-8 July was conducted. In particular, it deplores the decision taken by the Niger authorities to dissolve the independent national electoral commission during the voting process and to replace it with an alternative body. It is the view of the EU that this decision, by the Niger authorities, casts serious doubts on the credibility of the election results. It requests the Niger authorities to explain this decision and why observers found it impossible to assist in gathering and collating the election results.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU urges the Niger authorities, in dealing with the critical situation which has resulted from their decision, to respect fully the fundamental freedoms of movement, expression and association of the Niger people. It attaches great importance to the restoration of all civil rights.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU will examine, in the light of recent developments, its policies of economic and development cooperation with the Niger authorities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU calls for the full restoration of democratic civilian government in Niger through transparent processes. Free and fair elections will be crucial in this respect. The EU will continue to follow the situation in Niger closely and in particular the preparation, holding and transparency of the forthcoming legislative elections on 22 September. Iceland, the Central European countries associated with the EU and the associated countries Cyprus and Malta align themselves with this declaration.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Swaziland: revision of the Constitution</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 6 August 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The European Union welcomes the announcement by King Mswati III of the names of the new Prime Minister of Swaziland and of the Constitutional Review Commission and is pleased that its membership represents all shades of political opinion in Swaziland.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU wishes to encourage all members of the Constitutional Review Commission to participate fully in its work and expresses confidence that their endeavours will bring about the adoption of a draft democratic constitution acceptable to the people of Swaziland as a whole. It hopes that the Commission will pursue its task energetically and is ready to offer appropriate assistance to the Commission if it so wishes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burundi: appeal for talks and reconciliation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Declaration of 19 August 1996</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recalling its declarations of 25 June and 5, 15, 23 and 26 July 1996, the European Union reiterates its deep concern about the situation in Burundi. It urges all sides to refrain from violence and to commit themselves to, and work actively towards, a negotiated and peaceful resolution of the crisis.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU wishes to express its support for the regional leaders, the Organisation of African Unity and the former President of Tanzania, Mr Julius Nyerere, in the efforts which they have been making to assist Burundi to overcome peacefully the grave crisis which it is experiencing, and encourages them to continue their efforts to facilitate the search for a political solution.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU considers it essential for a dialogue to be organised without delay, bringing together all of Burundi's political forces without exception, including representatives of civil society, in order to negotiate a democratic, institutional consensus ensuring security for all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU is convinced that national reconciliation and civil peace in Burundi can be restored on a lasting basis only through the participation of all sections of society in the principal institutions and bodies of the State.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The EU urges all sides in Burundi to call an immediate halt to the violence and respect the safety of all Burundians.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It reaffirms its willingness to support Burundi's recovery efforts, once the necessary national reconciliation is embarked upon with all the resolve required.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AID FOR REHABILITATION</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Within the framework of the 'European Programme for Reconstruction and Development in South Africa', the Commission has recently decided on financing for the following ten projects:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> - ECU 19.2 million for a development programme covering the management of the public service;</P>
+<P ALIGN="JUSTIFY"> - ECU 17.2 million for technical assistance to the Ministry of Education;</P>
+<P ALIGN="JUSTIFY"> - ECU 16 million for a support programme for Parliament;</P>
+<P ALIGN="JUSTIFY"> - ECU 15 million for the electrification of rural schools;</P>
+<P ALIGN="JUSTIFY"> - ECU 9 million to support the reform process in the police services of the Eastern Cape province;</P>
+<P ALIGN="JUSTIFY"> - ECU 8.9 million for a financing and investment development programme for SMEs;</P>
+<P ALIGN="JUSTIFY"> - ECU 5 million for a programme of rural water supply and sanitation projects to be implemented </P>
+<P ALIGN="JUSTIFY">by the NGO Mvula Trust; </P>
+<P ALIGN="JUSTIFY"> - ECU 4.3 million to support the trade union movement;</P>
+<P ALIGN="JUSTIFY"> - ECU 2.3 million for the 'Soul City 1996' project designed to make full use of the mass media to promote health and development issues;</P>
+<P ALIGN="JUSTIFY"> - ECU 1.9 million to support the 'Truth and National Reconciliation Commission'.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">EUROPEAN DEVELOPMENT FUND</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Following, where required, favourable opinions from the EDF Committee, the Commission has decided to provide grants and special loans from the 5th, 6th and 7th EDFs to finance the following operations (grants unless otherwise stated). Major projects and programmes are highlighted.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic and social infrastructure</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burkina Faso: ECU 4.125 million for studies relating to certain road infrastructures. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mauritius: ECU 9 million for an irrigation programme in the northern plains. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Dominica: ECU 1.65 million towards the establishment of refuse treatments systems.  Trade promotion/ structural adjustment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cot&eacute; d'lvoire: ECU 25.5 million to , support the structural adjustment programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lesotho: ECU 8.6 million for the fourth structural adjustment programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Agriculture/rural development</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia-Kenya-Uganda: ECU 20 million for a programme to coordinate national activities aimed at achieving sustainable rural development in the region (notably involving the fight against the Tsetse fly)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Education/training</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Caribbean region: ECU 5.9 million towards a post-secondary education training programme in the countries of the OECS (Organisation of Eastern Caribbean States - Antigua &amp; Barbuda, British Virgin Islands, Dominica, Grenada, Montserrat, St Kitts &amp; Nevis, St Lucia, St. Vincent &amp; the Grenadines). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Environment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Malawi: ECU 4.4 million for a social/ participatory programme in the forestry sector as part of the implementation of a national forestry policy. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Institutional support</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">SADC member states: ECU 1.7 million to support the SADC (Southern African Development Community) secretariat in order to strengthen the SADC-EU regional programme. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UEMOA (West Africa Economic and Monetary Union): ECU 12 million to support the regional integration process in the member states (Benin, Burkina Faso, Cot&eacute; d'lvoire, Mali, Niger, Senegal and Togo) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia: ECU 1.5 million for a support programme for the Ministry of Finance and Economic Development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">EUROPEAN INVESTMENT  BANK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the first half of 1996, the Bank has provided the following loans from its own resources or in the form of risk capital:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Africa/Madagascar: ECU 30 million for ASECNA (I'Agence pour la securite de la navigation aerienne en Afrique et a Madagascar) for the renewal and modernisation of air safety equipment. Botswana: ECU 6.6 million to the Botswana Power Corporation to help increase electricity-generating capacity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Burkina Faso: ECU 6 million to SOFITEX (Societe burkinabe des fibres textiles) for the renewal and extension of its cotton ginneries facility. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mali: ECU 5.3 million to the Societe Energie du Mali for the financing of the Balingue thermal power station. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mauritania: ECU 2 million to SNIM (Societe rationale industrielle et miniere) for the setting up and operation of a mechanical workshop. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mauritania: ECU 1.4 million to the Societe arabe du fer et de l'acier (Arab iron and steel company) for the construction of a foundry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mozambique: ECU 500 000 to Grafites de Ancuabe for the exploitation of a graphite mine.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Zambia: ECU 2 million to the Zambia Venture Capital Fund, set up to subscribe for minority equity stakes in SMEs. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jamaica: ECU 40 million to Telecommunications of Jamaica Ltd for expansion and modernisation of the domestic and international telecommunications network. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">British Virgin Islands: ECU 600 000 to the government for the design and feasibility study of the main airport at Beef Island, Tortola. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tonga: ECU 3.7 million to the Tonga Telecommunications Commission for the development of the country's domestic telecommunications network.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">HUMANITARIAN AID</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Ethiopia: ECU 5 million for the purchase and distribution of vegetable oils and cereals to refugees living in the country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kenya: ECU 420 000 for emergency medical assistance in the fight against cholera in the Mandera region.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Somalia: ECU 1.9 million for emergency food aid to the victims of the continuing factional fighting. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sudan: ECU 2.5 million for the purchase and distribution of maize in a transit camp close to the capital (154 000 people) and in the south of the country (1 million people), and for the distribution of sorghum to Ethiopian and Eritrean refugees in the east (200 000 people). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chad: ECU 150 000 to help tackle the cholera epidemic. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Haiti: ECU 10 million for a programme to counter malnutrition and improve basic health care, in particular for women and children in isolated locations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Montserrat: ECU 380 000 to help evacuees in the wake of the recent volcanic eruption. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Non-ACP countries</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Colombia: ECU 1 million for people displaced as a result of drug terrorism and the fighting that has been taking peace between government forces and guerillas. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Costa Rica: ECU 400 000 for the victims of Hurricane Cesar. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Guatemala: ECU 220 000 to train teachers in order to improve education among repatriated communities in the department of Alta Verapaz. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nicaragua: ECU 440 000 to improve conditions for the social and economic reintegration of uprooted populations (people who have been repatriated, displaced or demobilised) in the department of Rio San Juan. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Northern Caucasus: ECU 4.18 million for civilian victims of the war in Chechnya and for refugees in Ossetia and Dagestan. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Iraq: ECU 9 million for food aid, medical provisions, rehabilitation of drinking water systems, sanitary equipment and educational material to assist 3 million people in the north and centre of the country.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Yemen: ECU 150 000 for flood victims. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Cambodia: ECU 290 000 for a programme to construct and distribute artificial limbs to land-mine victims. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thailand (Burmese refugees): ECU 220 000 for 'Mon' refugees from Burma (Myanmar) who have fled the violence in their country. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thailand (Burmese refugees): ECU 500 000 for medical aid in favour of 'Karen' refugees from Burma (Myanmar). </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FOOD AID</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Commission has recently decided to allocate the following aid: </P>
+<P ALIGN="JUSTIFY"></P>
+
+<!--
+</Section>
+</Section>
+</Section>
+</Section>
+-->
+
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/fb33fe/fb33fe.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/fb33fe/fb33fe.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/fb33fe/fb33fe.htm	(revision 21083)
@@ -0,0 +1,890 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Farming snails 1: Learning about snails; Building a pen; Food and shelter plants</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Farming snails 1: Learning about snails; Building a pen; Food and shelter plants</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FOOD AND AGRICULTURE ORGANIZATION OF THE UNITED NATIONS</P>
+<P ALIGN="JUSTIFY">Rome 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P-69</P>
+<P ALIGN="JUSTIFY">ISBN 92-5-102396-4</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&copy; FAO 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Introduction</Metadata>
+  </Description>
+-->
+</B><P ALIGN="CENTER"></P>
+<P ALIGN="JUSTIFY">1. Did you know that many kinds of snails are good to eat?</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2. Snail meat tastes good and it is also good for you. If you have snail meat to eat, it will help to keep you and your family strong and healthy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p60a.png"></center><br>
+ Family kept strong and healthy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3. If you want to have snails to eat you can get them in different ways.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">4. Many people gather wild snails that live nearby. Sometimes you can buy snails at the market or from people who gather them to sell to others.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">5. You can also raise your own snails. This is called snail farming. Today, a great many people all over the world farm snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">6. If you farm your own snails, you will always have a supply of fresh snail meat whenever you want it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">7. Then, if your family is not too big and you grow more snails than you need to eat, you can sell what you do not use to your neighbours or at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p61a.png"></center><br>
+ Selling snails at the market</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">8. With more food to eat and the money you get by selling snails, you and your family can live better.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">9. However, if your family is big you will need to grow many more snails if you are going to have enough to eat and to sell at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p61b.png"></center><br>
+ You need to grow more snails if your family is big</P>
+<P ALIGN="CENTER"></P>
+<P ALIGN="CENTER">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">What do you need to start?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="CENTER"></P>
+<P ALIGN="JUSTIFY">You will need</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> enough snails to start your snail farm</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f33p61c.png"></center><br>
+ Snail</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> a place near your house with the right kind of soil and the right amount of water for snails to live and grow</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f33p61d.png"></center><br>
+ A place near your house</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> the kinds of plants that snails need for food and shelter</P>
+<P ALIGN="JUSTIFY"> the materials to build a pen for the snail</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f33p62a.png"></center><br>
+ Plants that snails need; The materials to build a pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">10. If you have or can get all of these things, you can raise snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="CENTER">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Learning about snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">11. To farm snails is not hard; however, it is quite different from keeping chickens or ducks or from growing crops such as maize, rice, cassava or groundnuts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">12. Since farming snails is so different from other kinds of farming, you will have to learn a lot of new things.</P>
+<P ALIGN="JUSTIFY">13. One way to learn about snails so that you will be able to farm them is to watch the wild snails that live near you.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p62b.png"></center><br>
+ Watch the wild snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">14. Try to see how they live, how they move and where they go, what plants they like best and what they eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">15. You can learn many things by watching wild snails that will help you later if you decide to start a snail farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p63a.png"></center><br>
+ Wild snail</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">16. Another way to learn about snails is to ask an older farmer who knows a lot about your area. If there are people near you who gather snails to sell to others, they may be able to help you.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">17. In the next part of this booklet, you will begin to learn some things that you need to know to farm snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">What kind of snails can you farm?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">18. The kind of snails that you can farm are snails that live on land, and there are many kinds of land snails that are good to eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">19. However, some kinds of land snails are not good to eat and they may even make you very, very sick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">20. So, you must be very careful when you choose snails to farm. If you are not sure that a snail is good to eat, do not use it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p63b.png"></center><br>
+ Do not use snail unless you are sure it is good to eat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">21. Now look at the drawings on pages 8 to 11 and you will see four kinds of good snails that live in different places.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">22. You may be able to find one of these kinds of snails where you live. Notice that two of them are small and two of them are large.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">23. The smaller kinds of snails, shown on pages 8 and 9, can often be found in places where part of the year is warm and part of the year is cold.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">24. The larger kinds of snails, shown on pages 10 and 11, can often be found in places where it is warm all year round.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p64a.png"></center><br>
+ Helix pomatia</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">This kind of small snail</P>
+<P ALIGN="JUSTIFY">1 can be found in places where part of the year is warm and part of the year is cold</P>
+<P ALIGN="JUSTIFY">2 weighs from 15 to 25 grams and measures from 40 to 50 millimetres</P>
+<P ALIGN="JUSTIFY">3 has a strong shell which is pale brown and off- white</P>
+<P ALIGN="JUSTIFY">4 grows to full size in two to three years if it is well fed</P>
+<P ALIGN="JUSTIFY">5 lays from 30 to 50 eggs each growing season</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p64b.png"></center><br>
+ Helix Pomatia - 30 to 50 small eggs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p64c.png"></center><br>
+ Helix aspersa</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This kind of small snail</P>
+<P ALIGN="JUSTIFY">1 can often be found in places where part of the year is warm and part of the year is cold</P>
+<P ALIGN="JUSTIFY">2 weighs from 4 to 20 grams and measures from 30 to 45 millimetres</P>
+<P ALIGN="JUSTIFY">3 has a weak shell with broken stripes which are light brown to black</P>
+<P ALIGN="JUSTIFY">4 grows to full size in one year if it is well fed</P>
+<P ALIGN="JUSTIFY">5 lays from 40 to 170 eggs one to three times each growing season</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p64d.png"></center><br>
+ Helix aspersa - 40 to 170 small eggs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p65a.png"></center><br>
+ Achatina achatina</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This kind of large snail</P>
+<P ALIGN="JUSTIFY">1 can often be found in places where it is warm all year round</P>
+<P ALIGN="JUSTIFY">2 weighs from 150 to 200 grams or more and measures from 90 to 130 millimetres</P>
+<P ALIGN="JUSTIFY">3 has a very strong brown shell</P>
+<P ALIGN="JUSTIFY">4 grows to full size in two years if it is well fed</P>
+<P ALIGN="JUSTIFY">5 lays from 100 to 300 eggs one to two times each growing season</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p65b.png"></center><br>
+ Achatina achatina - 100 to 300 small eggs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p65c.png"></center><br>
+ Archchatina marginata</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This kind of large snail</P>
+<P ALIGN="JUSTIFY">1 can often be found in places where it is warm all year round</P>
+<P ALIGN="JUSTIFY">2 weighs from 150 to 200 grams or more and measures from 90 to 130 millimetres</P>
+<P ALIGN="JUSTIFY">3 has a very strong brown shell</P>
+<P ALIGN="JUSTIFY">4 grows to full size in two years if it is well fed</P>
+<P ALIGN="JUSTIFY">5 lays from five to ten eggs four to eight times each growing season</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p65d.png"></center><br>
+ Archchatina marginata - five to ten large eggs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">25. If you cannot get one of these snails, you may be able to get others very much like them where you live.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">26. There are many other kinds of good snails. There may even be several kinds of good snails that are eaten where you live.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">27. If snails are eaten where you live, you can farm one of these. Then you will be sure that it is good to eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Where can you get snails?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">28. When you are ready to get snails, perhaps you can get them by gathering wild snails that live near you.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p66a.png"></center><br>
+ Gathering wild snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">29. Perhaps you can buy them from people who gather wild snails to sell to others.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p66b.png"></center><br>
+ Buying from one who gathers wild snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">30. You may even be able to buy them from another snail farmer.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p66c.png"></center><br>
+ Buying from another snail farmer</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">Never term snails that you buy at the market. Snails at the market may have been washed, kept too cold or hurt and they may die soon.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Where can you farm snails?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">31. A good place for a snail farm is one where there already are snails. If there already are snails, you will know that the soil and the water in the soil are right for snails to live and grow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">32. However, if there are no snails near where you live it does not mean that you cannot raise snails there.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">33. If you have the right kind of soil with the right amount of water, you can bring good snails from another place to start your snail farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The soil and the water in the soil</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">34. Soil is important for snails. Part of the time they live on the soil and part of the time they live in the soil, and to live well, snails need good soil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p67a.png"></center><br>
+ Snail on the soil; Snail in the soil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">35. When snails are not on the soil or in the soil, they are on plants which grow in the soil. So, the soil must also be good for the kinds of plants that snails need.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p67b.png"></center><br>
+ Snail on plant</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">36. When snails are in the soil, they are resting or laying their eggs. If the soil has the right amount of water, snails will live well, the eggs they lay will hatch well and the baby snails will come out of the soil easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">37. Snails cannot live in hard soil such as heavy clay soils. When heavy clay soil is too dry, snails cannot dig into it to rest and lay their eggs. When heavy clay is too wet, snails and the eggs they lay may die.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">38. Snails cannot live in loose soil such as soils that have a lot of sand. Sandy soils do not hold enough water for snail eggs to hatch.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">39. The drawings on the next page show how a snail digs a hole, lays its eggs, closes the hole and how the baby snails come out when they have hatched.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">40. Snails need calcium from the soil to make their shells. All snails grow better and have stronger shells when there is a lot of calcium in the soil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">41. So, if you are going to farm snails, you must have a good medium soil that has neither too much clay nor too much sand. It must also have enough calcium and the right amount of water for your snails to live and grow.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">If you have a garden, you can easily tell if your soll is good for snails. If your green leafy vegetables grow well, snails will also grow well in the same kind of soil</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p68a.png"></center><br>
+ Snails will grow well in a garden</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1 snail digging a hole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p68b.png"></center><br>
+ 1 snail digging a hole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2 laying the eggs and closing the hole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p68c.png"></center><br>
+ Snail laying eggs</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3 baby snails hatching and coming out of the hole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p68d.png"></center><br>
+ Baby snails hatching and coming out of the hole</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Plants for food and plants for shelter</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">42. Snails need plants for both food and sheller. Most kinds of snails use several kinds for food and several other kinds for shelter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p69a.png"></center><br>
+ Plants for food and plants for shelter</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">43. They may also use different plants for food and shelter at different times of the year. Sometimes during the growing season snails eat and find shelter on the same plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">44. Snails usually hide on shelter plants during the day when it is dry and move to food plants to eat at night or early in the morning when they are wet with dew. However, sometimes snails do eat during the day after it has rained.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">45. If you live in a place which has a season when plants do not grow, snails will dig into the soil to rest and they do not eat then.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">46. During the growing season snails will eat a lot and grow very fast if they have food plants that they like.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">47. So, before you begin you will have to find out exactly what plants they like to eat. To do this you will have to watch snails at night when they eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p69b.png"></center><br>
+ See what snails eat at night</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">48. You can tell that snails are eating when you see their heads moving as they scrape food into their mouths. You can also tell when a snail has been eating by the holes it makes in the leaves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p69c.png"></center><br>
+ Snail on leaf</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">49. You will also have to find out what plants they like for shelter. To do this you will have to watch snails during the day when they rest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p70a.png"></center><br>
+ See where snails rest during the day</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">50. It is often difficult to find snails on shelter plants because they are hiding. So, you will have to look very carefully.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p70b.png"></center><br>
+ Snails are hiding on shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">51. In addition to the food plants, there are many other kinds of foods that you can put into a pen for your snails to eat. You will learn about these foods and when you should use them in the next booklet in this series.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Dew and rain</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">52. Dew at night in the growing season helps the plants to grow and makes the leaves and the ground wet so that snails can move about.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">53. Rain in the growing season also helps the plants to grow and it cleans the plants of dust and the dirt that snails leave when they move about. The dirt that snails leave may make them sick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">54. So, it is very important that the food and shelter plants are wet and clean.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">55. When the leaves are wet, snails move easily, eat more and grow well. When the leaves are dry, snails move very little, or not at all, and they grow poorly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p70c.png"></center><br>
+ Wet leaves are good for snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">56. When it rains and the plants are clean, the snails will be healthy. When it does not rain and the plants are dirty, the snails may get sick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">57. Dew and rain also keep the ground moist so that the snails can move easily and dig into it to rest and to lay their eggs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">58. In the next booklet, you will be told how to wet the leaves of plants and moisten the ground when it is too dry.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Land that is wet</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">59. Land that is very wet, low land that does not drain well or land that floods in the rainy season is not good for snail farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p71a.png"></center><br>
+ Low, wet land is bad for snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Wind</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">60. Wind during the growing season is bad because it dries the dew and dries out the snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p71b.png"></center><br>
+ Wind is bad for snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">61. If you decide to farm snails, try to keep them in a place that is protected from the wind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p71c.png"></center><br>
+ Snails should be farmed in a place protected from the wind</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Where do you keep snails when you farm them?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">62. If you decide to farm snails you must keep them in a pen. Snails kept in a well- built pen will not get away easily and you can watch them and take care of them well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">63. After the first year you will need at least two pens. If you decide to farm more snails you may want even more pens. You will learn how to use two or more pens in the next booklet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p72a.png"></center><br>
+ Two pens the second year</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">64. In each pen you can give your snails the right kinds of plants for them to eat and to use as shelter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">65. In each pen you can put the food and shelter plants near each other so that the snails can move easily from one to the other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">66. Each pen you build must also keep the snails safe from their enemies. Snails have many enemies. You must be careful to protect them from</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> mice and rats</P>
+<P ALIGN="JUSTIFY"> shrews and moles</P>
+<P ALIGN="JUSTIFY"> walking insects that live on the ground such as ants and beetles</P>
+<P ALIGN="JUSTIFY"> slugs and other snails that eat snail meat</P>
+<P ALIGN="JUSTIFY"> birds that eat snails</P>
+<P ALIGN="JUSTIFY"> frogs and toads</P>
+<P ALIGN="JUSTIFY"> thieves</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f33p72b.png"></center><br>
+ Protect them from
+</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">67. A snail pen can be small or large depending on how many snails you want to raise. However, when you first begin, start with a small pen. You will need fewer materials. It will be easier to take care of.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">68. In addition, with a small pen you will need fewer snails to begin. When you know more about raising snails, you can build a bigger pen and get more snails to raise.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">69. A good size for a pen is 5 x 5 metres. Later in this booklet you will learn how to build a small pen of this size.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">How many snails will you need when you first begin?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">70. If you are using small snails like those you have seen on pages 8 and 9 in this booklet, you will need more snails to begin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">71. If you are using large snails like those you have seen on pages 10 and 11 in this booklet, you will need fewer snails to begin.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">72. With a pen of 5 x 5 metres (25 square metres) you will need</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> 150 snails if you use the small kind (6 for each square metre)</P>
+<P ALIGN="JUSTIFY"> 25 snails if you use the large kind (1 for each square metre).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p73a.png"></center><br>
+ 150 small snails; 25 large snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">How much snail meat can you expect to get?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">73. The amount of snail meat that you will get from small snails will be about the same as what you would get from large snails. This is because you will use many more small snails than large snails and the meat will be about equal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">74. With one 5 x 5 metre pen you will get 12 to 13 kilograms of snail meat each year and with two 5 x 5 metre pens you will get 24 to 26 kilograms each year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p73b.png"></center><br>
+ 12 to 13 kilograms each year; 24 to 26 kilograms each year</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Now you must decide</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">75. In the first part of this booklet you have learned many things about snails and farming snails. You have learned</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> why it is good to farm snails</P>
+<P ALIGN="JUSTIFY"> what you need to farm snails</P>
+<P ALIGN="JUSTIFY"> what kinds of snails you can farm</P>
+<P ALIGN="JUSTIFY"> how to find plants near you that are good for food and shelter</P>
+<P ALIGN="JUSTIFY"> what kind of soil and how much water in the soil snails need</P>
+<P ALIGN="JUSTIFY"> where to keep snails and how many you need to start</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">76. You may also have been able to learn a lot about snails by watching the wild snails near where you live.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">77. An old farmer may have told you what he knows about snails. Someone who gathers snails to sell to others or another snail farmer may have helped you to learn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">78. So, now that you know a lot about snails it is time to decide if you would like to start your own snail farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">79. If you would like to begin you will learn exactly what to do in the rest of this booklet and in the next booklet.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">How to begin</Metadata>
+  </Description>
+-->
+<P ALIGN="CENTER"></P>
+<P ALIGN="CENTER">&nbsp;</P>
+<P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Choose a place on your land to put your snail farm</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">80. Try to choose a place that is close to your house. That way you will be able to watch your snails, protect them from their enemies and take care of them easily</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p74a.png"></center><br>
+ Close to your house</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">81. In Items 34 to 41 you were told that to farm snails you must have the right kind of soil with the right amount of water.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">82. Remember, if green leafy vegetables grow well in your soil, snails will also grow well in the same kind of soil.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p74b.png"></center><br>
+ If your garden grows well, so will your snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">83. In Items 59 to 61 you were told that low, wet land and wind are bad for snails. So, avoid low, wet places and try to put your snail farm where it is protected from the wind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p75a.png"></center><br>
+ Avoid low, wet land; Find a place protected from wind</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">84. In Item 63 you were told that after the first year you will need at least two pens and later you may want even more. In Item 69 you were told that it is best to start with a small pen of 5 x 5 metres.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">85. So, try to find a place where you can put at least two or three 5 x 5 metre pens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p75b.png"></center><br>
+ two or three 5 x 5 metre pens</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Clean the site and prepare the ground</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">86. Clean the site and prepare the ground a little before the growing season so that you can build the pen in time to plant the food and shelter plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">87. First, mark out a square of 8 x 8 metres on the place that you have chosen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p75c.png"></center><br>
+ Mark and clear the 8 x 8 metre square</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">88. That way, with a pen of 5 x 5 metres in the centre of the square, you will have a path of 1.5 metres all the way around it (see Item 92). If you have enough land, the path can be even wider.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">89. Clear the square of trees, bushes grass, creeping grass and weeds. Take away all of the roots and the big stones that you can.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p76a.png"></center><br>
+ Take away roots and big stones</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">90. Spread the plant material that you have cleaned evenly on the ground and cover the whole square. If there is not enough, bring more plant material from another place.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p76b.png"></center><br>
+ Cover the square with plant materials</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">91. When the plant material is dry, burn it. This will kill the insects, the weed seeds and the roots of creeping grass, and rid the ground of mice, rats and shrews.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p76c.png"></center><br>
+ Burn the plant materials</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">Insecticides and poisons can also be used to rid your pen of insects, mice, rats and other enemies of snails. However, if you use them, do not use them by yourself because they are very dangerous. Ask someone who knows how to use them, such as your extension agent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">92. Now mark out a smaller square of 5 x 5 metres inside the big square. This is for your first snail pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p77a.png"></center><br>
+ Mark the 5 x 5 metre square</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">93. Dig the ground in the smaller square to a depth of 20 centimetres and turn it over well. As you dig, remove any rubbish or roots that you find.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p77b.png"></center><br>
+ Dig in the ground</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">94. While you are digging, if you see any more insects or any of the enemies of snails, bring more dry plant material and burn the ground again. To farm snails, the area must be free of insects, mice, rats and other enemies.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">95. When you have finished digging, the ground in the 5 x 5 metre square should be as smooth and well worked as it would be if you were planting a vegetable garden.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p77c.png"></center><br>
+ The 5 x 5 metre square should be smooth</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">96. However, do not use any fertilizer, animal manure or compost as you might with a vegetable garden. Fertilizers may burn the snails and animal manure or compost may bring in insects and weed seeds.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Building a pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">97. Build a pen for your snails as soon as you can after you have burned the plant material. This is to keep other insects, mice, rats or shrews from getting into your pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">98. A snail pen is a simple fenced- in area and you can build a fence using</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> corrugated sheet metal or plastic sheets</P>
+<P ALIGN="JUSTIFY"> woven plant material</P>
+<P ALIGN="JUSTIFY"> woven plant material with chicken wire</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f33p78a.png"></center><br>
+ Materials for fence</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Using corrugated sheet metal or plastic sheets</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">99. A fence of corrugated sheet metal or plastic sheets makes the best pen for snails because it keeps out their enemies very well. However, sheet metal or plastic costs a lot of money.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p78b.png"></center><br>
+ A fence of corrugated sheet metal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">100. If you are going to build a pen using corrugated metal or plastic, you must build it in such a way that the enemies of snails cannot get in between the sheets.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Using woven plant material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">101. To save money, you can build a fence of woven plant material such as split bamboo. If the woven material is tight, it will keep out enough of enemies for you to farm snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p79a.png"></center><br>
+ Woven material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Using woven plant material with chicken wire</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">102. If you can get fine- mesh chicken wire, you can improve a fence that is made of woven material.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p79b.png"></center><br>
+ Chicken wire</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">103. To do this, first make the fence of chicken wire and then cover it with woven material.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p79c.png"></center><br>
+ First use chicken wire then cover it with woven material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">104. The chicken wire will keep out rats and other small animals. The woven plant material will keep most of the insects out and keep the snails in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p79d.png"></center><br>
+ Keep out small animals</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">With any kind of pen animals such as rats may get in, and this is especially true with pens made only of woven plant material. So, you must always watch for rats and other animals and keep them out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">How to build the fence</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">105. Build the fence as you would any fence, by driving posts into the ground. Use posts 1.40 metres long. When the posts are in place they should be 1.00 metre above and 0.40 metre below the ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p80a.png"></center><br>
+ Drive posts into the ground</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">106. Whatever material you use for the fence of your pen, it should be buried 0.40 metre below the ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">107. If you are using woven material you will have to change the bottom of the fence when it rots.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">108. This can be done more easily by making the woven material in two parts, one for the top and one for the bottom. When the bottom part rots, you can change it without having to change the whole fence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p80b.png"></center><br>
+ Attach top parts first; attach bottom parts second</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Keeping your snails in the pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">109. Many of your snails may crawl over the fence and get out of the pen. If you build a flap on the inside at the top of the fence, it will be more difficult for your snails to get out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">110. However, even with a flap some snails may get out, and for this reason many snail farmers put two flaps on their fence. With two flaps they find that fewer snails get out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p81a.png"></center><br>
+ With two flaps, your snails will not easily crawl out of the pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">If you make your pen using galvanized sheet metal, you will not need flaps. Snails will not crawl on galvanized sheet metal.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">111. The drawings show you how to build a 5 x 5 metre pen using woven plant material, with and without chicken wire and how to build flaps to keep your snails in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p81b.png"></center><br>
+ How to build a 5 x 5 metre small pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3 if you are using woven material only, attach it as you were told to do in Item 108</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p82a.png"></center><br>
+ Attach woven material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">4 If you are using chicken wire and woven material, attach the chicken wire first and then the woven material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p82b.png"></center><br>
+ Attach the chicken material first</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">5 be sure that the fence cover goes all the way to the bottom of the 0.40- m trench</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p82c.png"></center><br>
+ 0.40- m trench</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">6 fill in the trench</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p82d.png"></center><br>
+ Fill in the trench</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">7 attach the flaps to the inside of the pen</P>
+<P ALIGN="JUSTIFY">Note: use woven material 0.25 m wide for the flaps</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">8 first attach the bottom flap using heavy cord</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p83a.png"></center><br>
+ Use heavy cord</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">9 then attach the top flap</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Plant the food and shelter plants</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">112. You have already been told that you should clean and prepare the site and build your snail pen in time for the planting season.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">113. If it has been only a short time since you dug the ground and worked the soil in your pen, you can begin to plant.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">114. If it has been a long time, dig and work the soil again before you plant. However, as you were told in Item 96, do not use fertilizer, animal manure or compost.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">115. Now you can begin to plant the food and shelter plants. Remember that you should use</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> plants that grow well where you live</P>
+<P ALIGN="JUSTIFY"> plants that last a long time</P>
+<P ALIGN="JUSTIFY"> plants that snails like</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">116. The drawings, show you two ways to plant food and shelter plants in a 5 x 5 metre pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">117. On pages 50 to 55 you will see some food and shelter plants that snails are known to like. Look at them carefully. Perhaps you can find some of them where you live.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two ways plant food and shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1 if your shelter plants are small, plant your pen like this</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p84a.png"></center><br>
+ Mark three places for small shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2 plant the shelter plants first and then plant the food plants all around the shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p84b.png"></center><br>
+ First plant the shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3 if your shelter plants are large, plant your pen like this</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p84c.png"></center><br>
+ Mark only one place for large shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">4 plant the shelter plants first and then plant the food plants all around the shelter plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p84d.png"></center><br>
+ Leave a path inside the fence</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">RAMPE</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p85a.png"></center><br>
+ Some plants for food</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rape is one of many kinds of smooth- leaved cabbage. It grows from seed and lasts a number of months. Rape is the best food plant for Helix snails (see pages 8 and 9 in this booklet). Many of the other kinds of smooth- leaved cabbage also make good food plants for snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p85b.png"></center><br>
+ Rape</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AFRICAN SPINACH (Amaranthus)</P>
+<P ALIGN="JUSTIFY">This green leafy vegetable is a good food plant for young Achatina and Archachatina snails. However, if you plant African spinach for your snails, they will need other kinds of food plants as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p85c.png"></center><br>
+ African spinach</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PAPAYA</P>
+<P ALIGN="JUSTIFY">You have already been told that snails can be given food to eat other than the food plants that you have planted in the pen (see also Items 175 to 179 in the next booklet). The tender green leaves and cut- up fruit of the papaya tree are very good for Achatina and Archachatina snails. However, the papaya should not be planted inside the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p86a.png"></center><br>
+ Papaya</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HORSE- RADISH</P>
+<P ALIGN="JUSTIFY">Horse- radish is a good food and shelter plant for young Helix snails. However, when they are older they will need other kinds of food plants as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p86b.png"></center><br>
+ Horse- Radish</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">LEAF BEET</P>
+<P ALIGN="JUSTIFY">Leaf beet grows well from seed and lives for one year. It can be used with He/ix snails for both food and for shelter. As a food plant alone it is not the best and you will have to give your snails other food plants as well. However, as a shelter plant it is very good for Helix snails. These snails lay eggs under the beet plants and find shelter around the roots in cold weather.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p86c.png"></center><br>
+ Leaf Beet</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BURDOCK</P>
+<P ALIGN="JUSTIFY">Burdock grows from seed and lives for more than a year. It grows very slowly and you should plant it as soon as you can so that it can grow big enough for your snails. However, once it has grown it makes a good food and shelter plant for almost any kind of snail.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p87a.png"></center><br>
+ Burdock</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BANANA and LOOFAH</P>
+<P ALIGN="JUSTIFY">Banana and loofah plants together provide both food and shelter for Achatina and Archachatina snails. Ripe bananas can be cut up and fed to the snails and they can use the loofah plant for food and for shelter. However, your snails will need other food plants as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p87b.png"></center><br>
+ Banana and Loofah</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">PLANTAGO</P>
+<P ALIGN="JUSTIFY">Plantago grows well from seed and lasts about two years. It is the best shelter plant for Helix snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p87c.png"></center><br>
+ Plantago</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ASPARAGUS</P>
+<P ALIGN="JUSTIFY">Asparagus lives for many years and it is a good shelter plant for young Achatina and Archachatina snails. However, it is not good for older snails because they are too heavy for asparagus plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">When are the plants big enough for food and for shelter?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">118. The food plants must be big enough to feed your snails and the shelter plants tall enough to cover them and to protect them from the sun.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">119. Depending on the kind of snails that you are raising, most plants will be big enough after they have been growing for about five to six weeks or when they have reached a height of 10 to 20 centimetres.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f33p88a.png"></center><br>
+ Plants will grow to a height of 10 to 20 cm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">120. When you are sure that the plants are big enough to provide food and shelter, you can begin to collect the snails and put them into the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">121. In Booklet No. 34, Farming snails 2, you will learn</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> how to choose good snails and how to put them in the pen</P>
+<P ALIGN="JUSTIFY"> how to take care of your snails</P>
+<P ALIGN="JUSTIFY"> when and how to harvest snails</P>
+<P ALIGN="JUSTIFY"> how to prepare snails for cooking</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">122. You will also be told some things that you can do to improve your snail farm so that later when you have more experience you can raise more and better snails.</P></FONT>
+<!--
+</Section>
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/fb34fe/fb34fe.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/fb34fe/fb34fe.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/fb34fe/fb34fe.htm	(revision 21083)
@@ -0,0 +1,671 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Farming snails 2: Choosing snails; Care and harvesting; Further improvement</TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT FACE="Arial" SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Farming snails 2: Choosing snails; Care and harvesting; Further improvement</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FOOD AND AGRICULTURE ORGANIZATION OF THE UNITED NATIONS</P>
+<P ALIGN="JUSTIFY">Rome 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">P-69</P>
+<P ALIGN="JUSTIFY">ISBN 92-5-102397-2</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&copy; FAO 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Preface</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first twenty- six volumes in FAO's Better Farming Series were based on the Cours d'apprentissage agricole prepared in C&ocirc;te d'Ivoire by the Institut africain de d&eacute;veloppement &eacute;conomique et social for use by extension workers. Later volumes, beginning with No. 27, have been prepared by FAO for use in agricultural development at the farm and family level. The approach has deliberately been a general one, the intention being to constitute basic prototype outlines to be modified or expanded in each area according to local conditions of agriculture.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many of the booklets deal with specific crops and techniques, while others are intended to give the farmer more general information which can help him to understand why he does what he does, so that he will be able to do it better. Booklets No. 33 and 34 were added to the series owing to a growing interest in small- scale snail farming for food and profit in many countries where FAO's Better Farming Series is widely used.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Adaptations of the series, or of individual volumes in it, have been published in Amharic, Arabic, Bengali, Creole, Hindi, Igala, Indonesian, Kiswahili, Malagasy, SiSwati, Thai and Turkish.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Requests for permission to issue this manual in other languages and to adapt it according to local climatic and ecological conditions are welcomed. They should be addressed to the Director, Publications Division, Food and Agriculture Organization of the United Nations, Via delle Terme di Caracalla, 00100 Rome, Italy.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">The snails</Metadata>
+  </Description>
+-->
+<P ALIGN="CENTER"></P>
+<P ALIGN="CENTER">&nbsp;</P>
+<P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Choosing your snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">123. All of the snails that you choose for your pen must be of the same kind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p093a.png"></center><br>
+ All of the snails that you farm must be the same kind</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">124. You may have found one of the kinds of snails shown on pages 8 to 11 in the last booklet living in your area. You may also have found a different kind of snail.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">125. Now you must learn to choose the beat of the kinds of snails that you have found. When you first begin you will need fully grown snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">126. Remember, that all snails are both male and female and all snails lay eggs. So, when you are looking for snails, you can choose any one that is fully grown.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">127. You can tell that a snail is fully grown because it has a lip on the mouth of its shell. The drawings below show two fully grown snails with lips.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p094a.png"></center><br>
+ Snails which fill and which does not fill their cells</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">128. Look at the drawings again. Notice that although both snails are fully grown, one of them fills its shell and one of them does not.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">129. The snail that does not fill its shell may be sick or it may have lost its water because of dry weather. This snail may not grow well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">130. Choose only snails that fill their shells. Snails that fill their shells will usually grow well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">131. Choose snails that have good, strong shells. Strong shells protect snails from their enemies, and snails with strong shells sell better at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">132. Choose the largest of the fully grown snails that you can find from the kind of snail that you are going to farm.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p094b.png"></center><br>
+ Choose the largest snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">133. The larger snails of any kind of snail will be better and healthier and lay more eggs than a snail that is smaller.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">134. In addition, the eggs of large, healthy snails hatch better and the baby snails grow bigger and faster.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">135. Later, when you have more experience in choosing snails, you will learn just how large a fully grown snail should be. You will also learn the different colours of the kind of snail that you are farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">136. Then you can choose snails that are the same size and colour that you want your baby snails to be.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">As you collect your snails, handle them very gently and put them carefully into a container such as a basket so that you can carry them to the pen without hurting them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p095a.png"></center><br>
+ Handle your snails carefully</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Putting your snails in the pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">137. Just before you put your snails in the pen, take out all the grass, the creeping grass and the weeds that may have grown while the food and shelter plants were growing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p095b.png"></center><br>
+ Take out all grass, creeping grass and weeds</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">138. Never put snails in a pen in the morning or during the day when the sun is hot. Always put them in the evening when it is cool. This is when they begin to move about and to eat.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p095c.png"></center><br>
+ Always put snacks in the pen in the evening</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">139. If there is no dew and leaves of the plants and the ground are dry, wet them. Items 160 to 165 in this booklet will tell you how.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p096a.png"></center><br>
+ Wet the plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">140. When you put snails in the pen, put an equal number of them in four different places.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">141. In the last booklet you were told that for a 5 x 5 metre pen you would need 150 snails if you use the small kind, and 25 snails if you use the large kind. So, if you need</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> 150 snails, put 35 to 40 snails in four places</P>
+<P ALIGN="JUSTIFY"> 25 snails, put 6 snails in three places and 7 snails in one place.</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">142. The arrows in the drawing at the top of the next page will show you where to put snails in a 5 x 5 metre pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p096b.png"></center><br>
+ Where to put the snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">When you put snails in a pen, never put them near the fence or in a corner of the fence. If you put them near the fence it is easier for them to get out than it is if you put them near the centre of the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p096c.png"></center><br>
+ Do not put snails in the corner or near the fence</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">143. The morning after you have put your snails in the pen, look to see that they have all moved. If any of them have not moved, put them under shelter plants.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">144. If any snails die, take them out and put in the same number of new snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p097a.png"></center><br>
+ Take out the dead snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">145. At first your snails will try to crawl out of the pen. During this time, go around the pen each morning and put them back.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">146. After about two weeks your snails will become used to their new home and most of them will not try to crawl out.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">147. However, it is a good idea, even after the first two weeks, to check from time to time and put back any of the snails that may have got out of the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">When to take out the fully grown snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">148. When you see a lot of baby snails in your pen, you will no longer need to keep the fully grown snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">149. So, take out all of the fully grown snails that you first put into your pen. You can either eat them or sell them at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p097b.png"></center><br>
+ Take out all fully grown snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">150. Now, with only the baby snails left, the food plants in the pen will be more likely to last until the baby snails are big enough to harvest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">151. Later in this booklet, you will be told when the baby snails are big enough to harvest and how to harvest them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Taking care of your snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">152. After you have put your snails in their pen, watch them carefully to see that they are eating well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">153. If you have given them enough of the right kinds of food plants, they will eat a lot and you will have very little to do for them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">154. However, here are some things that you must do</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> wet the plants and moisten the ground</P>
+<P ALIGN="JUSTIFY"> take care of the plants</P>
+<P ALIGN="JUSTIFY"> take away the weeds and the creeping grass</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P></DIR>
+
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Wet the food and shelter plants and moisten the ground</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">155. You have already been told that the leaves of the food and shelter plants must be wet and clean and that the ground must be moist (see Items 52 to 58 in the last booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">156. If there is too lime dew and not enough rainfall during the time when the plants and the snails are growing, you will have to water the plants and the ground yourself.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">157. If it is dry, you should water the plants and the ground at least every second day. However, if it is very dry, you may have to water them every day.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">158. Never water in the morning or during the day when the sun is hot. Always water in the evening at about sunset.</P>
+<P ALIGN="JUSTIFY">159. If you water when the sun is hot, the snails will begin to move away from the shelter plants and the hot sun may kill them before they can find shelter again.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">160. An easy way to wet the plants and moisten the ground is by hand. First fill a bucket with water and wrap a piece of cloth around your hand.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p098a.png"></center><br>
+ Wrap a cloth around your hand</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">161. Then, dip your hand with the cloth into the bucket of water and gently splash the plants and the ground.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p099a.png"></center><br>
+ Gently splash plants and ground</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">162. Continue to splash the plants and the ground gently until you have watered the whole pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">163. When you have finished, the leaves of the plants should be wet and the ground should be moist.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">164. You can tell when the plants are wet enough and the ground is moist enough when you can see your snails moving about easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p099b.png"></center><br>
+ Snails move about easily</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">165. Remember: the soil must be moist and not wet in order for snail eggs to hatch.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">You have already been told that if you live in a place that has a dry season when the plants do not grow, snails dig into the ground to rest. Never water at this time or your snails may come out of the ground when they should not.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Tend the food and shelter plants</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">166. Watch all of your plants to see that they are growing well and that they do not get too tall or too thick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">167. Plants that are too tall or thick stop the dew from reaching the leaves and stop the rain from washing away the dust and the dirt that snails leave when they move about.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">168. If you see that the plants are not being wet or washed by dew or rain, cut them back.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p101a.png"></center><br>
+ Cut back the plants</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Take away the weeds and creeping grass</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">169. After your snails are in their pen you must be sure to take away all weeds and especially creeping grass as soon as you see them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">170. Creeping grass grows very fast and so thick that it can kill the food and shelter plants. If this happens, your snails will have no food and no place to find shelter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">171. Taking away weeds and creeping grass when snails are in the pen is very difficult. So, you must be very careful not to hurt them or step on them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">172. If the weeds and creeping grass get too thick, it may be better to move the snails before you take weeds and creeping grass away (see Item 183 in this booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">173. Keep the path around the pen clear of weeds, grass and creeping grass. This will help to keep weed seeds and unwanted plants out of the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p101b.png"></center><br>
+ Keep the path clean</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">174. If the path is clean, insects will be less likely to cross it to get into the pen and you will be able to see signs of mice, rats and shrews.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Feeding your snails other kinds of food</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">175. There are a number of reasons for giving your snails other kinds of food. Here are a few</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> when you have not planted the right kinds of food plants</P>
+<P ALIGN="JUSTIFY"> when you have too many snails for the number of food plants that you have planted</P>
+<P ALIGN="JUSTIFY"> when most of the food plants in the pen have been eaten by the snails</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">176. If you decide for any of these reasons that you must give your snails other kinds of food, here are some foods that snails like to eat</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> the outside leaves of vegetables such as cabbage or cauliflower</P>
+<P ALIGN="JUSTIFY"> the tops of vegetables such as carrots or beets</P>
+<P ALIGN="JUSTIFY"> ripe banana fruit</P>
+<P ALIGN="JUSTIFY"> most waste fruit and vegetables</P>
+<P ALIGN="JUSTIFY"> cut- up papaya, melon or squash</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY"><center><img src="f34p102a.png"></center><br>
+ Food snails eat</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">177. There are many other foods that snails like to eat. If you have some food that you think might be good, try it with your snails and see if they like it.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">178. If your snails are not eating their food plants well, you also can try some others. Cut pieces from the plant that you want to try and put them in the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">179. If you see that your snails like the new food plants better, you can use these plants when you build the second pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Building the second pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">180. In the last booklet you were told that to farm snails you will need at least two pens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p103a.png"></center><br>
+ Two pens needed</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">181 . With two pens you can move your snails from one pen to the other to get rid of any enemies that may have got in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">182. You can also move your snails to dig the ground and work the soil so that they can dig into the soil to rest and can lay their eggs easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">183. With two pens you can move your snails from one pen to the other if the weeds and creeping grass get too thick to take away with snails in the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">184. You can also plant new food plants when the old ones have been eaten. When you are moving the snails, you can get rid of any of them that have not grown well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">When to build the second pen and how to build it</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">185. Build your second pen a little before the growing season and exactly one year after you built the first pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">186. Begin just as you did before, by cleaning and preparing the ground (see Items 86 to 96 in the last booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">187. However, if you put your second pen near your first pen, be very careful when you burn the plant material not to burn your first pen or harm the snails in it.</P>
+<P ALIGN="JUSTIFY">188. For this reason it is best to leave an open space of at least 3 metres between your first and second pens.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p103b.png"></center><br>
+ Be very carefull when you burn the plant material</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">189. Now you are ready to build the second 5 x 5 metre pen and to plant the food and shelter plants (see Items 97 to 117 in the last booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Putting snails in your second pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">190. When the plants in your second pen have grown big enough to provide food and shelter, you can put in the snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p104a.png"></center><br>
+ When the plants are grown, you can bring the snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">191. If the snails in your first pen have grown well, you can use some of them for your second pen. So, collect the right number of the biggest and best snails from your first pen to put in your second pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">192. If the snails in your first pen have not grown well, you will have to begin again with new fully grown snails for your second pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">193. Remember, with your first pen you put in 150 snails if you used the small kind and 25 snails if you used the large kind.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">194. However, different snails lay different amounts of eggs. So with your second pen you may want to change the number of snails that you put in.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">195. If there were too many baby snails for the food plants in your first pen, put fewer fully grown snails in your second pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">196. If there were too few baby snails for the food plants in your first pen, put more fully grown snails in your second pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">197. If you are not sure how many snails to use, it is best to continue to put in 150 if you use small snails and 25 if you use large snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p104b.png"></center><br>
+ 25 Large snails; 150 small snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">198. Later, when you have learned more about the kind of snails that you are using and how many baby snails they have, you will be better able to judge just how many fully grown snails that you should use.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">Do not forget to take out all of the fully grown snails that you have put in after you see a lot of baby snails in your second pen (see Items 148 to 151 in this booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Harvesting your snails</Metadata>
+  </Description>
+-->
+<P ALIGN="CENTER"></P>
+<P ALIGN="CENTER">&nbsp;</P>
+<P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">When to harvest your snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">199. If your snails have grown well, some of them will be big enough to harvest about one year after you have first put snails in the pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">200. If you need any snails to put in another pen, collect them first. So, choose the right number (see Items 193 to 198 in this booklet) of the biggest and best snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">201. Carefully put these snails into a container so that you can carry them to the other pen without hurting them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p105a.png"></center><br>
+ Put snails into a container</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">202. Now you are ready to harvest the rest of your biggest snails. Remember, the best way to harvest is a few snails at a time when you want some to eat or to sell at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">203. However, harvest all of the snails by the end of the second year so that you can plant the pen in time for the next growing season.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">How to harvest your snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">204. Harvesting snails is done by hand. It is often hard work to find them because they may be hiding.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p105b.png"></center><br>
+ Harvesting snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">205. The easiest time to find the snails is when the plants are wet, after it has rained or at night when there is dew and they are moving about or eating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">206. You can also put out some of the food that snails like and when they come to eat it, you can collect them easily.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p105c.png"></center><br>
+ Put out some food</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">207. When you are harvesting, handle your snails carefully and put them into a container such as a box or basket or a net sack. However, do not put more than 10 kilograms in a container or you may hurt them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p106a.png"></center><br>
+ Put snails in a container</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">What to do with the snails you harvest</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">208. If you are going to sell the snails, you can carry them to the market in containers like the ones above. However, you must be very careful not to hurt them or break their shells.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">209. Remember, snails with clean shells and well- cared- for snails will sell better at the market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">210. If you want to keep the snails for you and your family to eat later, you can store them alive in containers filled with material such as sawdust or chopped maize husks.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">211. That way you can keep them for as long as six to eight weeks before you use them. The drawings below show you how to store snails this way.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1 a box is a good container to store snails in</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p106b.png"></center><br>
+ A box</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2 cover the bottom of the box with about 5 cm of sawdust or chopped maize husks</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p106c.png"></center><br>
+ Cover the bottom of the box with sawdust</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3 carefully put in a layer of snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">4 cover the snails with about 3 cm of sawdust or chopped maize husks</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p106d.png"></center><br>
+ Cover the snails</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">5 continue to do this until the box is full</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note: be sure that the top layer of snails is covered</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Preparing snails for cooking</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">212. Before snails can be used you must be sure that there is no food in them. They must be clean inside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">213. Snails that have been stored in a container (see Items 210 and 211 in this booklet) for more than four days will have no food left in them. They are clean inside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">214. However, snails which have just been taken from the pen have been eating and are usually full of food.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">215. So, before you can use them you must wait for them to become clean inside. To do this you need only to keep them from eating.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">216. Put them in a container where they can get no food but plenty of air. You can use a covered basket or a net sack.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p107a.png"></center><br>
+ Use a covered basket or a net sack</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">217. Put the basket or sack in a cool place away from the sun. After four days the snails will be clean inside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p107b.png"></center><br>
+ Put the container away from sun</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">218. All snails must be washed and boiled just before cooking them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">219. First, put them in clean, cool water with a little salt and vinegar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p107c.png"></center><br>
+ Put them in clean water</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">220. After a short time the water will begin 10 turn white and you will know that the snails are being washed inside.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">221. When the water is very white, take the snails out and empty out the old water. Then put them again in clean, cool water with a little salt and vinegar.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p108a.png"></center><br>
+ Empty out dirty water; wash snails again</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">222. Continue to wash them this way until the water no longer turns white. Then you will know that the snails are completely washed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">223. Now put the snails in boiling water, again with salt and vinegar, and boil them at least five minutes. The snails are now ready to be cooked.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p108b.png"></center><br>
+ Boil snails with salt and vinegar for five minutes</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Note</P>
+<P ALIGN="JUSTIFY">Snail meat can be cooked like any meat or it can be cut into pieces and added to a stew or vegetables. If snails are eaten where you live, there will be many ways to cook them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Further improvement</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">224. After you have been farming snails using two pens for some time, you may find that you and your family could eat or sell more snails if you had them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">225. You can raise more snails by building another pen. You can either build another 5 x 5 metre pen or you can build a still bigger pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">226. You can also raise more snails by taking better care of the snails that you have. If you take better care of your snails, year after year they will become bigger, healthier and stronger and produce more baby snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Building the third pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">227. Perhaps the most important thing that you can do to improve your snail farm is to build a third pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p109a.png"></center><br>
+ Build a third pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">228. Up until now, using only two pens, you have had to use both of them all of the time so that you could take fully grown snails from one after you had harvested the other.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p109b.png"></center><br>
+ Using two pens</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">229. Today, farmers know that it is not good to grow the same crops in the same place all of the time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">230. This is also true if you grow the same food and shelter plants in the same pen all of the time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">231. However, if you plant vegetables in one of your three pens for a year, the vegetables will grow well because of the snail manure in the soil. Afterwards, your food and shelter plants will also grow better because the soil has had a rest.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">232. Also, if you raise snails in the same place all of the time, the sicknesses that they may get would do more harm year after year.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">233. So, if you plant something else for a year or two and then start with snails again, they will be less likely to get sick.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">234. The diagram below shows you how to improve a snail farm by planting a vegetable garden in each pen from to time.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p110a.png"></center><br>
+ Diagram</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Building a bigger pen</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">235. You may want to build a still bigger pen for your third pen so you can grow many more snails.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">236. If you build a 5 x 10 metre pen, you can grow two times as many snails. If you build a 10 x 10 metre pen, you can grow four times as many snails as you did in a 5 x 5 metre pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p110b.png"></center><br>
+ Pens</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">237. However, building a bigger pen is a lot more work and you will need</P>
+<P ALIGN="JUSTIFY"></P><DIR>
+
+<P ALIGN="JUSTIFY"> more land</P>
+<P ALIGN="JUSTIFY"> more materials to build it</P>
+<P ALIGN="JUSTIFY"> more food and shelter plants</P>
+<P ALIGN="JUSTIFY"> more fully grown snails to begin</P>
+<P ALIGN="JUSTIFY"></P></DIR>
+
+<P ALIGN="JUSTIFY">238. You must also be sure that you and your family have enough time to take care of a bigger pen.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">239. If you do decide to build a bigger pen, build it exactly the same way that you built your first 5 x 5 metre pen (see pages 43 to 46 in the last booklet).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="f34p111a.png"></center><br>
+ Building a bigger pen</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Taking better care of your snails</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">240. The better you understand the snails that you are farming, the better you can take care of them. So, you should always watch them and learn as much as you can.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">241. When you have learned the exact kinds of food plants that your snails like to eat, you will see that they grow well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">242. Then, if you always choose the biggest and best snails each time you begin, you will improve the quality of the snails that you are farming.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">243. So, with bigger and better snails and with more pens or bigger pens, you will be able to raise many more snails to eat or to sell and you arid your family will be able to live better.</P>
+<P ALIGN="JUSTIFY"></P>
+
+<!--
+</Section>
+</Section>
+</Section>
+-->
+
+</HTML>
Index: /main/tags/2.38/gsdl/collect/demo/import/metadata.xml
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/metadata.xml	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/metadata.xml	(revision 21083)
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE DirectoryMetadata SYSTEM "http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd">
+<DirectoryMetadata>
+  <FileSet>
+    <FileName>ec160e</FileName>
+    <Description>
+      <Metadata name="Title">The Courier - NÂ°160 - Nov - Dec 1996 - Dossier Habitat - Country reports: Fiji , Tonga (ec160e)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Settlements and housing: general works incl. low- cost housing, planning techniques, surveying, etc.</Metadata>
+      <Metadata name="Subject" mode="accumulate">The Courier ACP 1990 - 1996 Africa-Caribbean-Pacific - European Union</Metadata>
+      <Metadata name="Organization" mode="accumulate">EC Courier</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>b22bue</FileName>
+    <Description>
+      <Metadata name="Title">Butterfly Farming in Papua New Guinea (b22bue)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)</Metadata>
+      <Metadata name="Organization" mode="accumulate">BOSTID</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">start a butterfly farm</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>b20cre</FileName>
+    <Description>
+      <Metadata name="Title">Managing Tropical Animal Resources - Crocodiles as a Resource for the Tropics (b20cre)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)</Metadata>
+      <Metadata name="Organization" mode="accumulate">BOSTID</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>b17mie</FileName>
+    <Description>
+      <Metadata name="Title">Microlivestock - Little-Known Small Animals with a Promising Economic Future (b17mie)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)</Metadata>
+      <Metadata name="Organization" mode="accumulate">BOSTID</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">introduce small animals and micro-livestock in your farm</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>b18ase</FileName>
+    <Description>
+      <Metadata name="Title">Little Known Asian Animals With a Promising Economic Future (b18ase)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)</Metadata>
+      <Metadata name="Organization" mode="accumulate">BOSTID</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">introduce little-known Asian farm animals with a promising future</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>b21wae</FileName>
+    <Description>
+      <Metadata name="Title">The Water Buffalo: New Prospects For An Underutilized Animal (1984) (b21wae)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Cattle</Metadata>
+      <Metadata name="Subject" mode="accumulate">Other animals (micro-livestock, little known animals, silkworms, reptiles, frogs, snails, game, etc.)</Metadata>
+      <Metadata name="Organization" mode="accumulate">BOSTID</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">utilize the Water Buffalo more effectively</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>fb34fe</FileName>
+    <Description>
+      <Metadata name="Title">Farming snails 2: Choosing snails; Care and harvesting; Further improvement (fb34fe)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Better Farming series of FAO and INADES - 46 booklets</Metadata>
+      <Metadata name="Subject" mode="accumulate">Settlements and housing: general works incl. low- cost housing, planning techniques, surveying, etc.</Metadata>
+      <Metadata name="Organization" mode="accumulate">FAO Better Farming series</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">farm snails</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>fb33fe</FileName>
+    <Description>
+      <Metadata name="Title">Farming snails 1: Learning about snails; Building a pen; Food and shelter plants (fb33fe)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Better Farming series of FAO and INADES - 46 booklets</Metadata>
+      <Metadata name="Subject" mode="accumulate">Settlements and housing: general works incl. low- cost housing, planning techniques, surveying, etc.</Metadata>
+      <Metadata name="Organization" mode="accumulate">FAO Better Farming series</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>ec158e</FileName>
+    <Description>
+      <Metadata name="Title">The Courier - NÂ°158 - July - August 1996 Dossier Communication and the media - Country report Cape Verde (ec158e)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Communication, telecommunication, mass communication, mass media, film-making</Metadata>
+      <Metadata name="Subject" mode="accumulate">The Courier ACP 1990 - 1996 Africa-Caribbean-Pacific - European Union</Metadata>
+      <Metadata name="Organization" mode="accumulate">EC Courier</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>ec159e</FileName>
+    <Description>
+      <Metadata name="Title">The Courier - NÂ°159 - Sept- Oct 1996 Dossier Investing in People Country Reports: Mali ; Western Samoa (ec159e)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Social sciences, sociology (works comprising several subgroups) incl. participatory research and training</Metadata>
+      <Metadata name="Subject" mode="accumulate">The Courier ACP 1990 - 1996 Africa-Caribbean-Pacific - European Union</Metadata>
+      <Metadata name="Organization" mode="accumulate">EC Courier</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+    </Description>
+  </FileSet>
+
+  <FileSet>
+    <FileName>wb34te</FileName>
+    <Description>
+      <Metadata name="Title">Development in practice: Toward Gender Equality (wb34te)</Metadata>
+      <Metadata name="Language" mode="accumulate">English</Metadata>
+      <Metadata name="Subject" mode="accumulate">Women, gender and development, women's organizations</Metadata>
+      <Metadata name="Organization" mode="accumulate">World Bank</Metadata>
+      <Metadata name="AZList" mode="accumulate">T.1</Metadata>
+      <Metadata name="Keyword" mode="accumulate">achieve gender equality</Metadata>
+    </Description>
+  </FileSet>
+
+</DirectoryMetadata>
Index: /main/tags/2.38/gsdl/collect/demo/import/wb34te/wb34te.htm
===================================================================
--- /main/tags/2.38/gsdl/collect/demo/import/wb34te/wb34te.htm	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/demo/import/wb34te/wb34te.htm	(revision 21083)
@@ -0,0 +1,1910 @@
+<HTML>
+<HEAD>
+<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252">
+<META NAME="Generator" CONTENT="Microsoft Word 97">
+<TITLE>&lt;&lt;TOC1&gt;&gt; Development in practice: Toward Gender Equality </TITLE>
+</HEAD>
+<BODY>
+
+<B><FONT SIZE=2><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Development in practice: Toward Gender Equality</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Role of Public Policy</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">@ 1995 The Intentional Bank for Reconstruction and Development / THE WORLD BANK</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">All rights reserved Manufactured in the United States of America First printing July 1995</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Development in Practice series publishes reviews of the World Bank's activities in different regions and sectors. It lays particular emphasis on the progress that is being made and on the policies and practices that hold the most promise of success in the effort to reduce poverty in the developing world.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This book is a product of the staff of the World Bank. and the judgments made herein, do not necessarily reflect the views of its Board of Executive Directors or the countries they represent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Photo credits: Maurice Asseo</P>
+<P ALIGN="JUSTIFY">Library of Congers Cataloging-in-Publication Data</P>
+<P ALIGN="JUSTIFY">Toward gender equality: the role of public policy.  p. cm-(Development in practice)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Includes bibliographer references (p. 70)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ISBN 0-8213-3337-2</P>
+<P ALIGN="JUSTIFY">1. Women-Government policy. </P>
+<P ALIGN="JUSTIFY">2. Women's rights. </P>
+<P ALIGN="JUSTIFY">3. Sex discrimination against women. </P>
+<P ALIGN="JUSTIFY">4. Economic development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1. Series:</P>
+<P ALIGN="JUSTIFY">Development in practice (Washington. D.C.)</P>
+<P ALIGN="JUSTIFY">HQ 1 236.T68; 1995</P>
+<P ALIGN="JUSTIFY">305.4-dc20 95-631</P>
+<P ALIGN="JUSTIFY">CIP</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="CENTER"></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Foreword</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">TWENTY years ago in Mexico the First World Conference on Women inspired a movement that has helped to reduce gender inequality worldwide. Illiteracy among women is declining, maternal mortality and total fertility rates are beginning to fall. and more women are participating in the labor force than ever before. However. much remains to be done.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In low-income countries women are often denied health care and basic education. Worldwide. women face limited access to financial services, technology. and infrastructure. They are locked into relatively low-productivity work. In addition to performing household tasks and child-rearing duties, women work longer hours for lower pay than most men. And. most discouraging of all. hundreds of thousands of women each year are subject to gender-related violence.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Persistent inequality between women and men constrains a society's productivity and, ultimately slows its rate of economic growth. Although this problem has been generally recognized evidence on the need for corrective action is more controlling today than ever.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report written for the Fourth World Conference on Women is intended as a reference to strategies for promoting gender equality and. consequently enhancing economic efficiency. It pulls together evidence, including case studies, that demonstrates the need for governor action to improve the economic status of women. It points out how public policy can and should support services and infrastructure that provide the highest social returns and that are most heavily used by women. The report also aims to stimulate creative solutions to the problem of gender inequality by high lilting innovative and sometimes not obvious strategies that have proved successful. A study in Morocco, for instance, shows that paving public roads to schools increases by 40 percent the probability that local girls will attend classes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Policy reform that provides an enabling environment for economic growth goes hand in hand with investing in people. The success of one strategy draws on the success of the other. No efforts at gender equality. however, can be successful without the participation of women themselves.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As the international community gathers in Beijing for the Fourth World Conference on Women, the World Bank stands ready to assist client governments in response to the challenges ahead. The Bank believes that by advancing gender equality, governments can greatly enhance the future well-being and prosperity of their people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Armeane M. Choksi Vice President Human Capital Development and Operations Policy The World Bank</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Acknowledgments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THIS REPORT was prepared by a team led by Kei Kawabata and comprising Alison Evans, Zafiris Tzannatos. Tara Vishwanath, and Rekha Menon. The work was carried out under the direction of Minh Chau Nguyen and the overall guidance of K. Y. Amoako. Valuable contributions were made by Joyce Cacho, Lionel Demery, Shahid Khandker, and Kalanidhi Subbarao.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Background papers for the report were prepared by team members and by Anjana Bhushan; Lynn Brown and Lawrence Haddad; Florencia Castro-Leal, with Ignacio Tavares and Ramon Lopez; Roberta Cohen; Monica Fong: Roger Key, with Beverly Mullings; Andrew Mason; and Veena Siddharth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">An external review group and a Bankwide advisory committee provided valuable guidance at all stages of the report's preparation. Kalpana Bardhan. Pranab Bardhan, Nancy Folbre. and T. Paul Schultz were the external reviewers. Harold Aldennan, Jean-Jacques Dethier, Louise Fox, Sunita Gandhi, Chris Grootaert, Jeffrey Hammer, Tariq Husahl, Elizabeth King, Augusta Molnar, Helena Ribe, and Paula Valad made up the advisory committee. The report was edited by Jo Bischoff, Richard M. Crum, and Fiona Mackintosh; Benjamin Crow provided word-processing and graphics support.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The report also reflects the contributions of the participants in consultations held with nongovenamental organizations on March 1S, 1995, in New York. Data supplied by the United Nations and its agencies. particularly the International Labour Organization, the United Nations Educational, Scientific, and Cultural Organization (UNESCO), the United Nations Statistical Office, and the World Health Organization, were invaluable for the preparation of the report.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The production of the report was made possible by the assistance of the Norwegian Ministry of Foreign Affairs, which has given unwavering support to the protnotion of gender equality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Definitions and Data Notes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Definitions</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Expected number of years of formal schooling The total number of years of schooling that a child of a certain age can expect to receive if current enrollment patterns remain unchanged.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Literacy rate. The proportion of the adult population that can read or write. This indicator is not always accurate because it is self-reported and represents past investments in schooling. It is often defined only with respect to selected languages and may not take into account the progress being made in many countries through literacy campaigns.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Life expectancy AT BIRTH The number of years a newborn infant would live if prevailing patterns of mortality at the time of birth were to remain unchanged throughout the child's life.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Maternal mortality ratio. The number of women who die in pregnancy and childbirth per 100,000 live births: A measure of the risk that women face of dying from pregnancy-related causes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Data Notes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unless otherwise specified, dollar amounts are current U.S. dollars. A billion is a thousand million.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The data used in this report cover a range of time periods and are from more than 100 countries (both developing and industrial).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unless otherwise specified, geographic regions are those used by the World Bank in its analytical and operational work and are defined as follows:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">sub-Saharan  Africa countries south of the Sahara except Africa.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">East Asia and the Pacific: low- and middle-income economies of East and Southeast Asia and the Pacific.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Europe and Central Asia. middle-income European countries and the countries that formed the former Soviet Union.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Latin America anti the Caribbean all American and Caribbean economies south of the United States.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Middle East and North Africa all the economies of North Africa and the Middle East.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">South Asia: Bangladesh, Bhutan, India. Myantnar, Nepal, Pakistan. and Sri Lanka.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Summary</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THREE messages echo throughout this document:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> The causes of gender inequality are complex, linked as they are to the intrahousehold decisionmaking process. However the decisions are made. the intrahousehold allocation of resources is influenced by market signals and institutional norms that do not capture the full benefits to society of investing in women. Low levels of education and training. poor health and nutritional status, and limited access to resources depress women's quality of life and hinder economic efficiency and growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> It is therefore essential that public policies work to compensate for market failures in the area of gender equality. These policies should equalize opportunities between women and men and redirect resources to those investments with the highest social returns. Of these investments. female education, particularly at the primary and lower-secondary level, is the most important, as it is the catalyst that increases the impact of other investments in health, nutrition, family planning, agriculture, industry, and infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Women themselves are agents for change because they play a key role in shaping the welfare of future generations. Public policies cannot be effective without the participation of the target group-in this case. women, who make up more than half the world's people. Their views need to be incorporated into policy formulation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Progress to Date</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past two decades considerable progress has been made in reducing the gender gap world wide.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> In 1960. for every 100 boys enrolled in primary school. there were 65 girls. In 1990 the ratio had risen to 85.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> In 1980 an average six-year-old girl in a developing country could expect to attend school for 7.3 years. By 1990 this figure had Increased to 8.4 years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Since the 1950s the female labor force has grown twice as last as the male labor force. Worldwide, more than 40 percent of women over 15 years of age are now in the labor force; in developing countries women account for 30 percent of the labor force (These figures. it should be noted, do not fully reflect women's participation in the informal sector as unpaid family members in agriculture.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Nevertheless. inequalities between men and women persist in many important areas.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Despite women s biological advantage, their mortality and morbidity rates frequently exceed those of men, particularly during childhood and the reproductive years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Traditionally women are employed in lower-pay jobs and in a narrower range of occupations than are men. Women's wages are typically only 60-70 percent of wages earned by men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Whether in private sector employment or public sector decisionmaking, women are less likely to be in positions of responsibility than are men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Why Do Gender Inequalities Persist?</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The causes of the persistent inequality between men and women are only partially understood. In recent years attention has focused on inequalities in the allocation of resources at the household level. as seen in the higher share of education, health. and food expenditures boys receive in comparison with girls. The decisionmaking process within households is complex and is influenced by social and cultural norms market opportunities, and institutional factors. There is considerable proof that the intrahousehold allocation of resources is a key factor in determining the levels of schooling. health. and nutrition accorded household members.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inequalities in the allocation of household resources matter because education, health. and nutrition are strongly [hiked to well-being, economic efficiency. and growth. Low levels of educational attainment and poor health and nutrition aggravate poor living conditions and reduce an individual's capacity to work productively. Such economic inefficiency represents a significant loss to society and hampers future economic growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social returns to investments in women's education and health  a? e significantly greater than for similar investment in men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The social and economic losses are greatest when women are denied access to basic education and health care. Data from around the world show that private returns to investments in education are the same for women as for men and may even be marginally higher (Psacharopoulos 1994). More importantly. social returns (that is, total benefits to society) to investment in women's education and health are significantly greater than for similar investments in men, largely because of the strong correlation between women's education, health, nutritional status. and fertility levels and the education. health, and productivity of future generations. These correlation are even stronger when women have control over the way resources are allocated within the household.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wage differentials between women and men in the market are closely linked to educational levels and work experience. since on average. women earn 30-40 percent less than teen' it is not surprising that fewer women than men participate in the labor force. This wage disparity, reinforced by discriminality institutional norms, in turn influences the intrahousehold division of resources. A vicious circle ensues as households invest less in daughters than in sons in the belief that investment in girls yields fewer benefits. As a result. many women are unable to work outside the household because they lack the education or experience that men have.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The decision not to participate in the labor force does not necessarily reflect a woman's own choice, no' does it always correspond to the optimum use of household resources. Furthermore. the market wage does not take into account the social benefits of educating and hiring women. Discrimination in households and in the market carries not only private costs for individuals and households but social costs for society as well.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Public policies for reducing gender inequalities are therefore essential for counteracting market failure and improving the well-being of all members of society. Investing in women's education and health expands their choices in labor markets and other income-generating activities and increases the rate of return on a household's most valuable asset-its labor.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The decision to allocate women's time to the type of non wage work women typically carry out within the household. such as child care. food preparation, and, in low-income countries especially, subsistence farming and the collection of fuel wood and water, has less to do with economics than with social conventions and norms. These nones can have a strong influence on the household division of labor, even in industrial economies, where women's levels of human capital are equal to-and some times higher than those of most men</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The economy pays to this inequality in reduced labour productivity today and diminished national output tomorrow</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Whether this division of labor is appropriate is, essentially, for society to decide. However. there is no doubt that women's entry into the labor market and other spheres of the economy is directly affected by the extensive amounts of time they traditionally devote to household maintenance and family care. Most men do not make similar allocations of time in the home. Such inequality constrains women's employment choices and can limit girls' enrollment in schools. The economy pays for this inequality in reduced labor productivity today and diminished national output tomorrow. Public policy can address inequalities in the household division of labor by supporting initiatives that reduce the amount of time women spend doing unpaid work. Examples of such interventions include improved water and sanitation services, rural electrification, and batter transport infrastructure.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Constraints on female employment opportunities arising from the household division of labor are compounded by institutional norms operating within the labor market. Although overt wage discrimination is illegal in many countries, employers frequently segregate jobs or offer less training to women workers. Employers often perceive the returns to investing in women workers as lower than those for men mainly because of women's primary role in childbearing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lack of access to financial services, to land, and to intonation and technology compounds the unequal treatment of women. Requirements for collateral, high transaction costs, and limited mobility and education contribute to women s inability to obtain credit. When women do have access to credit, the effect on household and individual well-being is striking. Bon-owing by women is linked to increased holdings of non-land assets, to improve in the health status of female children, and to an increased probability that girls will enroll in school. Independent access to land is associated with higher productivity and. in some cases, with greater investments by women in land conservation.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Strategies for the Future</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">If the benefits from investing in girls and women are so great and can be quantified. why do households and employers underinvest in women? The main reason is that. as discussed above. markets fail to capture the full benefit to society of' investing in women and girls. Where the market fails or is absent. government must take the lead Public policy can contribute directly and indirectly. to reducing gender inequalities by, for example:</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"> Modifying the legal and regulatory framework to ensure a opportunities </P>
+<P ALIGN="JUSTIFY"> Ensuring macroeconomic stability and improving, microeconomic incentives</P>
+<P ALIGN="JUSTIFY"> Redirecting public policies and public expenditures to those investments with the highest social returns</P>
+<P ALIGN="JUSTIFY"> Adopting targeted interventions that correct for gender inequalities at the micro-level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Modifying the law to eliminate gender discrimination and equalize opportunities for women and men is an important first step. However. legal reform by itself does not ensure equal treatment. Further public action is required to make sure that gender-neutral laws are enforced at the national and local levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sound economic policies and well-functioning markets are essential for growth, employment generation, and the creation of an environment in which the returns to divesting in women and owls can he fully realized. Economic instability and price distortions can hinder the process. Consequently. sound macroeconomic management is critical. In general. two sets of policies are necessary: one emphasizing macroeconomic stability and the elimination of price distortions. the other focusing on labor-demanding growth and a reorientation in public spending toward basic services with high social returns- such as education. health care and water supply.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gender inequalities in the distribution of the benefits of public spending frequently arise because of a bias within households that limits women's access to publicly provided services. In addition, the services provided by public spending often are of less benefit to women than to men. Public policy can help remedy this problem by rearranging expenditure priorities among sectors and within the social sectors. It can ensure support for those services and types of infrastructure that offer the highest social returns to public spending and that are most heavily used by women and children. such as water supply anti sanitation services and rural electrification.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally general policy interventions may not be enough. and programs that specifically target women and girls may be required. Targeting is justified. Governments can no longer afford not to invest in women gable on two grounds. First. because women are disproportionately represented among the poor. targeting women can be an effective strategy for reducing poverty (broadly defined to include limited access to services. re sources, and other capability-enhancing factors). Second. where gender differences are wide, targeting-for example. the provision of stipends so that girls can attend school-they be needed to capture social gains and increase  internal efficiency</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Conclusion</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments can no longer afford not to invest in women. The evidence on the high private and social returns to investments in women and girls cannot be ignored. By directing public resources toward policies and projects that reduce gender inequality. policymakers not only promote equality but also lay the groundwork for slower population growth, greater labor productivity, a higher rate of human capital formation, and stronger economic growth However, none of these developments can be sustained without the participial of women themselves. Governments and collaborating institutions must listen more carefully to the voices of individual women. including policymakers. and to women's groups. By working with others to identity and implement policies that promote gender equality, governments can make a real difference to the future well-being and prosperity of their people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Chapter one</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Gender Inequalities Persist</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ALTHOUGH the gap between opportunities for men and women is narrowing. inequalities persist, especially in certain regions. This report examines four major development indicators: educational attainment, maternal mortality. life expectancy. and economic participation outside the household. All four are closely related to each other and in turn are closely correlated with individual well-being. These indicators provide a broad picture of trends in gender inequality and their impact on the relative well-being of women and of men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Education</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite the progress in raising educational enrollment rates for both males and females across all regions in the past three decades, growth in educational opportunities at all levels for females lags behind that for males (figure 1.1). In 1990 an average six-year-old girl in a developing country could expect to attend school for 8.4 years. The figure had increased from 7.3 years in 1980-but an average boy of the same age in a developing country could expect to attend school for 9.7 years The gender gap in expected years of schooling is widest in some countries in South Asia, the Middle East, and Sub-Saharan Africa (see figure 1.2). Gender differences in access to education are usually worse in minority populations such as refugees and internally displaced persons. of which only a few children go to school.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p16.png"></center><br>
+ School enrollment ratios in developing countries </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The latest available figures show that 77 million girls of primary school age (6-11 years) are not in school, compared with 52 million boys (figure 1.3). Moreover, even these gross enrollment rates often mask high absenteeism and high dropout rates. Dropout rates are notably high in low-income countries but vary by gender worldwide and within regions. The rates for girls tend to be linked to age, peaking at about grade 5 and remaining high at the secondary level (Herz and others 1991) Cultural factors, early marriage, pregnancy, and household responsibilities affect the likelihood that girls will remain in school.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the gross enrollment rate is an acceptable indicator of progress in education, most studies use literacy rates as an indicator of well-being. Overall illiteracy rates have decreased among adults in low- and middle-income countries, but the percentage of illiterate women in the world is still higher than the percentage of illiterate men. Older women constitute the largest share of the illiterates in the world today, a consequence of past inequalities in access to education. In Sub-Saharan Africa, the Middle East, and South Asia more than 70 percent of women age 25 and older are illiterate (United Nations 1991).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At post-secondary levels. where the gap in enrollment between women and men is wider, there is implicit "gender streaming," or sex segregation, by field of study, even in areas with snore female than male enrollees. Gender streaming. which is widespread in both developing and industrial countries, prevents women from acquiring training in agriculture, forestry, fishing, "hard" sciences, and engineering (figure 1.4).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p17.png"></center><br>
+ Expected years of schooling </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Health</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past two decades life expectancy at birth has increased for both men and women in all regions of the world. In industrial countries women tend to outlive men by six to eight years on average: in low-income countries gender differences are much narrower (two to three years). Despite women's biological advantage, female mortality and morbidity rates frequently exceed those of men, particularly during early childhood and the reproductive years.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">During the reproductive period the most Important causes of morbidity and mortality among women are high fertility and abortion rates, vulnerability to sexually transmitted diseases (STDS), genital mutilation. and gender violence. Each year, about 500,000 women worldwide die from the complications of pregnancy and childbirth. Maternal mortality ratios for developing and industrial countries vary greatly: the rates in parts of South Asia are among the world's highest, in some cases exceeding 1,500 per 100.000 live births. In Sub-Saharan Africa where the ratio is 700 maternal deaths per 100.000 live births, a woman runs a 1 in 22 lifetime risk of dying from pregnancy-related causes, but in northern Europe the risk falls to 10 in 100,000 (United Nations 1993). In the transition economies of Eastern Europe and the former Soviet Union, the rates are around 40 to 50 per 100,000 live births</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p18.png"></center><br>
+ Figure 1.3 children not in school 1990 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A major cause of maternal deaths is complications from unsafe abortions. Abortion-related deaths are highest in South and Southeast Asia. followed by Sub-Saharan Africa and Latin America and the Caribbean. Lack of access to contraceptives can mean that abortion, is used as a form of birth control. For example, in parts of Eastern Europe and Central Asia abortions are more numerous than live births (World Bank 1994b), and abortion rates were as high as 1.76 per live birth in Russia prior to the transition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As increasing numbers of women become aware of and learn to use contraceptives, total fertility rates are falling worldwide. The exception is Sub-Saharan Africa where the total fertility rate averaged 6.4 between 1985 have been infected by HIV. The World Health organization (WHO 1994) estimates that more than 13 million women will have been infected by HIV by 2000 and that about 4 million of that number will have died (figure 1.5 In Atrica, where 10 million adults are infected with the virus, ode-half of all newly infected adults are women, and more than 5 million are women of childbearing age. In Asia almost half of all adults newly infected with the virus are women, compared with less than 25 percent just six years ago.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p19.png"></center><br>
+ Figure 1.4 fields of study</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p20.png"></center><br>
+  Figure 1.5 HIV infected women 1995 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The mortality risk for females is high during the reproductive years. but it is even higher during infancy and early childhood. Between 1962 and 1992 INFANT mortality in the developing world decreased by 50 percent (UNICEF 1993 However, in seventeen of the twenty-nine developing countries for which recent survey data are available, female children age 1-4 were found to have higher mortality rates than male children. despite girls? biological advantage (World Bank 1994b). In many of these countries the underlying cause of high mortality among girls is the parents' bias toward boys, who receive the best food and medical care.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Genital mutilation, prevalent in twenty-eight countries, is performed on 2 million young girls yearly. The practice leads to long-term morbidity, complications during childbirth, mental trauma, and even death. Table 1.1 summarizes the best available statistics on this practice for selected countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Employment Work</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The time women spend on paid and unpaid work is typically greater than the time men spend in the labor market (see table 1.2 for an example). Unpaid family work is rarely recorded in official statistics. It manifests itself only indirectly in the labor market in the form of gender differences in labor force participation rates. sector of employment, hours of work, and wage level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">On the whole. labor force participation rates for women are lower than those for men (figure 1.6). However. these differences are often exaggerated because the definition of the participation rate fails to capture many aspects of women's work, particularly time spent on childbearing, childbearing. and other household tasks. Men are usually in the labor force throughout the prime working years (age 20-60), and their participation rates are typically more than 90 percent in virtually every country. Female participation rates vary widely across countries. In 1990, for every ten men in the labor force there were two women in the Middle East and North Africa, three in South Asia. six in Sub-Saharan Africa, and seven in Southeast Asia (United Nations 1991). Worldwide, 41 percent of women age 15 years or over are in the labor force, but in developing countries the corresponding figure is 31 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">These numbers are deceptive, however, because they do not take into account the agricultural work for which women in developing countries are responsible within the family For example, the Dominican census of 1981 reported that only 21 percent of rural women participated in the labor force, but just three years later a special study suggested a figure of 81 percent. The census had omitted such activities as cultivating gardens and caring for domestic animals In India different definitions of what constitutes "work" have resulted in estimated participation rates as low as 13 percent and as high as 88 percent (Beneria 1992).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tens of Millions of Women Suffer Female Genital Mutilation.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 1.1 female genital mutilation</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=468>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Country</B></FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Estimated prevalence (percent)</B></FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Estimated number of women affected (millions)</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Djibouti</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">98</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0.2</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Egypt</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">50</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">13.5</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Eritrea</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">90</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1.5</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Ethiopia</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">90</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">22.5</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Kenya</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">50</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">6.3</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Nigeria</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">50</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">29.2</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Sierra Leone</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">90</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">2.0</FONT></TD>
+</TR>
+<TR><TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Sudan</FONT></TD>
+<TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">89</FONT></TD>
+<TD WIDTH="36%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">118</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Sri Lanka's Dry Zone, Women Work Longer Hours than Men.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 1.2 distribution of monthly work hours per month)</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=451>
+<TR><TD WIDTH="40%" VALIGN="TOP">&nbsp;</TD>
+<TD WIDTH="31%" VALIGN="TOP" COLSPAN=2>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Peal. Season</B></FONT></TD>
+<TD WIDTH="29%" VALIGN="TOP" COLSPAN=2>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Slack season</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Activity </B></FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Male</B></FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Female</B></FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Male</B></FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Female</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Agricultural production</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">298</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">299</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">245</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">235</FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Household tasks</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">90</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">199</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">220</FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Fetching water and firewood</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">30</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">50</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">:30</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60</FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Social and religious duties</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">8</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">12</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">15</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">15</FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Total work hours</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">426</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">560</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">350</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">530</FONT></TD>
+</TR>
+<TR><TD WIDTH="40%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Leisure and sleep</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">294</FONT></TD>
+<TD WIDTH="17%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">160</FONT></TD>
+<TD WIDTH="10%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">370</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">190</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women are usually employed in different sectors than men. Most of women's nonagricultural employment is in the service sector. but in developing countries female employment in manufacturing has been increasing and is catching up with female employment in services (ILO/ INSTRAW 1985). Women in manufacturing tend to be concentrated in only a few sub sectors: more than two-thirds of the global labor force in garment production is female. and this subsector absorbs almost one-fifth of the female labor force in manufacturing (UNIDO 1993). Men's employment is more evenly distributed across other sectors such as mining manufacturing, construction, utilities, and transport.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over their lifetime, women change their employment status more often than do men. They are also more likely to be self-employed or employed in occupations with flexible house such as subcontracted home work. Regardless of the sector in which they are employed, women tend to work in a narrow range of occupations. Only a few women are in high-paying jobs or in positions with significant responsibility. Nearly two-thirds of the women in manufacturing ate laborers, machine operators. and production workers; only 5 percent ate professional and technical workers and only 2 percent are administrators and managers (UNIDO 1993). However. there are regional differences: women occupy nearly 60 percent of clerical, sales. and service jobs in Latin America and the Caribbean but fewer than 20 percent of similar positions in South Asia North Africa. and the Middle East (figure 1.7).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p23.png"></center><br>
+ Figure 1.6 rates of participation in the labor force by gender</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Wages paid to women are typically about 60-70 percent of those paid to men. About one-quarter of the gender wage gap is explained by differences in educational levels, labor market experience, and other human capital'' characteristics (Psacharopoulos and Tzannatos 1992 Horton 1994). The gender wage gap can also be explained in part by women's lower participation in the labor market-a consequence of domestic and other demands on their time and, possibly, of discriminatory employment practices.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Significant changes in the global economy have affected patterns of employment and working conditions for men and women worldwide. "Globalization" is associated with the deregulation of product and labor markets, with regionalization. and with the liberalization of international trade. In turn. these processes at-e associated with increased female participation in the labor force and with the at-owing "casualization'' of employment, as seen in the growth of part-time work in industrial economies. However, the net effect of globalization on women workers is not yet clear. Growth in the international traded service sector (for example, banking and telecommunications) seems to have offered women in developing countries greater employment opportunities. In addition, the participation rate of women in manufacturing jobs has increased faster than that of men. Women's average participation in the manufacturing labor force is now around 30 percent for both developing and industrial countries.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p24.png"></center><br>
+ Figure 1.7 types of jobs held by women </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Worldwide, the number of women employed in export manufacturing has been increasing rapidly, even though this sector employs only a small fraction of all women workers. In Mexico, for example, the number of women employed in export manufacturing rose by nearly 15 percent a year in the 1980s (Jurisman and Moreno 1990). However, employment in this sector has been increasing more rapidly for men than for women, partly because of</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">technological upgrading over time and partly; because women are less educated and tend to remain in low-skill occupations (Baden 1992).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women now account for a growing share ret wage employment they tend to stay longer in the labor force than ever before</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite persistent gender inequalities in the labor market. some recent trends  are encouraging. Increasing educational opportunities and decreasing fertility  rates have fed to an increase in the number of women entering the labor market. since the 1950s the female labor force has expanded twice as fast as the male  labor force. Women now account for a growing share of wage employment. and they tend to stay longer in the labor force than ever before The narrowing of the gender gap in labor force participation is enabling women to accumulate the work experience necessary tot- improving their job opportunities and increasing their amines. In the formal sector more and more women are working in occupations and sectors once dominated by men. and in many countries women s wages relative to men s have increased over time</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The data in this chapter illustrate some aggregate trends but they cannot tell US anything about the processes behind the persistence of gender inequality. For a more detailed look at these processes. We turn in the next chapter to a growing body of empirical evidence generated at the household and enterprise level. These studies provide a telling insight into the way in which gender inequalities are being challenged particularly by women At the same time these inequalities are reinforced by economic, legal. and cultural incentive systems that discriminate against women Discrimination continues despite compelling evidence showing that less inequality especially within the household. is associated with heftier welfare outcomes for children and better economic outcomes for the household as a v hole.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Chapter two</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Gender Inequalities Hamper Growth</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inequality women and men limits productivity ultimately slows economic growth. early empirical studies (for example, Kuznets 1955) suggested that income inequality would increase with economic growth during the initial phases of development. This chapter, however. starts with the hypothesis that there is not necessarily a tradeoff between inequality and growth and. indeed that high inequality especially as it affects human capital. hampers growth (Fields 1992: Birdsall and Sabot 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Both theory and empirical evidence point to the importance of human capital in creating the necessary conditions for productivity growth and in reducing aggregate inequality in the future. In addition. women s human capital generates benefits for society in the form of lower child mortality.  higher educational attainment improved nutrition. and reduced population growth. Inequalities in the accumulation and use of human capital at-e related to lower economic and social well-being for all.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Household and Intrahousehold Resource Allocation</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In recent years, attempts to explain persistent gender inequalities in the accumulation and use of human capital have focused on the key role of household decisionmaking and tile process of resource allocation within household Households do not make decisions in isolation. however: their decision are linked to market prices and incentives and are influenced by cultural legal and state institutions. These institutions indirectly affect not only the returns on household investment but also access to productive resources and employment outside the house hold.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Household decisions about the allocation of resources have a profound effect on the schooling, health care, and nutrition children receive. The mechanisms used to make these decisions and the effect of the decisions on the well-being of individual household members are not fully understood. Two frameworks for thinking about household decisions are the unitary household model and the collective household model (see box 3.1)</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">BOX 2.1 </P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Two models of household members having their own prefer decisionmaking encase. Decisions on allocating resources reflect market rates of return. The unitary household model assumes but they also mirror the relative bar that household members pool regaining power of household members sources and allocate them according within the collective (Manser and to a common set of objectives and Brown 1980: McElroy and Homey goals. Households maximize the joint 1981). Bargaining power is a function welfare of their members by allocating of social and cultural norms. as well income and other resources to the in as of such external factors as opposed individuals and enterprises that promise "unities for paid work, laws governing the highest rate of return as reflected inheritance, and control over producing prices and wages. An increase initiative assets and property rights. These household income increases the well factors influence the terms governing being of all household members.</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Policy interventions based on the sources and decisions about how unitary household model aim to in those resources are used within the crease household welfare, but they household. Thus, an increase in do not necessarily affect all household income may benefit some hold members in the same way. Some household members but leave others household members may be worse unaffected or worse off. The outcome off, for example, if they lose control depends on a member's ability to exover certain resources; others may excise control over resources both in be better off. in which case house-side and outside the household, and it hold welfare is not maximized. cannot be assumed that individual well</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Under the collective household being increases as household income model. the welfare of individual house-rises. (Collective household models do hold members is not synonymous with not exclude the possibility that the universal household welfare. Resources unitary model may be the best approximate not necessarily pooled, and the motion of household decisionmaking household acts as a collective, with in some contexts.)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The collective household model helps explain why gender inequalities persist even though household becomes increase over time The next sections adopt a collective household framework to explain how these inequalities exact costs in forgone productivity, seduced welfare for individuals and households, encl. ultimately. slower economic growth.(fender Inequalities in Human Capital )</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are strong complementaires between education. health. and nutrition on the one hand, and increased well-being, labor productivity, and growth. On the other. Inequalities in resource allocation that limit household members' educational opportunities. access to health care, or nutrition are costly to individuals, households, and the economy as a whole.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Linkages between Education Health, and Nutritious</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the household level. gender differences in access to education are closely related to inequalities in the shares of household education expenditures allocated to boys and to girls This finding stands even though private returns to girls' schooling are similar to or marginally higher than. those to boys' schooling (figure 2.1; see also Schultz 1988: Mwabu 1994). In this case. parental choice reflects the relatively greater restrictions on educational opportunities and employment choices for girls. in comparison with boys. and cultural norms on the appropriate role for girls within the household.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p28.png"></center><br>
+ Figure 2.1 private returns to education</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p29a.png"></center><br>
+ Figure 2.2 education, fertility. and child mortality (a)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY"><center><img src="p29b.png"></center><br>
+ Figure 2.2 education, fertility. and child mortality (b)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">More importantly. the social externalities linked to female education are crucial. Evidence from a large number of countries shows that female education is linked with better health for women and their children and with lower levels (figure 2.2). This link stems from the direct effect of education on the value of a woman's time and consequently. on private returns to her labor. It also stems from the indirect effect of education on the average age at which women marry on their knowledge of basic health care and nutrition, and on reproductive choices (Rosenzweig and Schultz 1982, 1987).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Educating girls and women reduces maternal mortality and fertility rates and increases the demand for health services. A simulation study of seventy two developing countries shows that, with all other factors held constant, a doubling of female secondary school enrollments in 1975 would have reduced tile average fertility rate in 1985 from 5.3 to 3.9 children per household and would have lowered the number of births by 29 percent (Subbarao and Raney 1992. Studies for individual countries have found that one additional year of female schooling can reduce the fertility rate. on average, between 5 and 1 (i) percent (Summers 1994)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women are more vulnerable than men to micronutrient deficiencies that aggravate poor health (World Batik 1994b). Poor health and nutrition reduce productivity and the chances of reaping gains from investment in education. Intrahousehold inequalities in consumption and nutritional allocations can therefore be a signal of inefficiency Recent estimates suggest that the com effects on morbidity and mortality of just three types of deficiency-in vitamin A, iodine. and iron-could waste as much as 5 percent of gross domestic product (GDP), yet correcting these deficiencies would cost less than 0.3 percent of low-income countries' GDP (World Bank 1994c, pp. 50-51). Studies of women tea producers in Sri Lanka and of women workers in Chinese cotton mills document the reduction in productivity associated with iron deficiencies and the positive effects of in-on supplementation on work and output (Edgerton and others 1979). A study of six villages in Andhra Pradesh, India, found that disabling conditions caused by malnutrition and the prevalence of diseases reduced female labor force participation by 22 percent (Chatterjee 1991).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Physical anti mental abuse can also have deleterious effects on the well-being and productivity of women (table 2.1). Violence against women is widespread in all cultures and cuts across all age and income groups Its consequences. include unwanted pregnancy. infection with STDs, miscarriage partial or permanent disability. and psychological problems such as depression anti low self-esteem. Recent World Bank estimates indicate that in both industrial and developing countries domestic violence and rape cause women of reproductive age to lose a significant percentage of really days. Domestic violence appears to be an example of how the relatively weaker bargaining power of women and the paucity of options for them outside the home can affect the intrahousehold distribution of welfare.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Violence against Women Starts in the Womb and Continues  trough Life</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2.1 Violence against women through the life cycle</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=590>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Phase</B></FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Type of violence</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Pre birth</FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Battering during pregnancy (emotional and physical effects on the ottoman) effects on birth outcome</FONT></TD>
+</TR>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Infancy</FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Female infanticide: emotional and physical abuse</FONT></TD>
+</TR>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Girl hood</FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Sexual abuse by family members and strangers: forced child prostitution</FONT></TD>
+</TR>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Adolescence</FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Dating and courtship violence: economically coerced sex: sexual abuse in the workplace: rape: farce prostitution and trafficking in women</FONT></TD>
+</TR>
+<TR><TD WIDTH="22%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Reproductive</FONT></TD>
+<TD WIDTH="78%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Coerced pregnancy: rape: abuse of women by male partners: down abuse and murder partner homicide psychological abuse sexual abuse of unmarried and childless women: abuse of women with disabilities</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY">Source: Heise 1993 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Prospects for gainful employment. as well as the availability of basic social services such as water supply and sanitation. also influence women's well-being. The survival chances of female children in India appear to increase as the employment rate for women rises and the earnings differential between men and women decreases Battilan 1988 Dowry and marriage practices. along with household ownership of land are closely linked to women's chances of survival The effect of such practices cannot be over late. Sen's (1990) comparison of female-male mortality rates in China. India. and Sub-Saharan Africa suggest that more than 100 million women are "missing"</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Public spending on social services affects the ability of individuals and households to benefit from their own private spending on human capital. In most industrial countries mortality rates decreased even before modern medical care became widely available, mainly because of improved water supplies and sanitation. The same is likely to hold for the developing world. Public interventions that address market under provision of water and sanitation facilities and shortages of health set-vices such as immunization and family planning-have a significant effect. and one that is probably greater for women than for men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lack of data makes it difficult to evaluate the effects of public spending on the educational attainment and health of women and men Very little empirical evidence in this area exists, but there is some indication that the proportion of public subsidies for education that benefits females is lower than the proportion that benefits males. In Kenya in 1992-93. for example. public spending on education amounted to the equivalent of an annual subsidy of 605 Kenyan shillings per capita: males received. on average. 670 shillings and females only 543 shillings. In Mexico the gender difference in public education subsidies was somewhat less: in Pakistan males received almost twice the female subsidy. Gender inequalities in the distribution of subsidies are greater at high than at primary levels. In Pakistan girls receive, on average. only 96 rupees a year for secondary school bag. compared with 58 rupees for boys. Box 2.2 explains how these figures are calculated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Supply-side differences are partly a function of poorly targeted resources (as. for example, when more is spent on tertiary than on primary schooling). More importantly. they reflect differences in household demand for education for girls and boys. If more girls attended anti stayed in school. the proportion of public subsidy going to girls would he greater.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In health care assessing the incidence of public spending by gender is particularly difficult because of the marked differences in the health needs of women and men. These differences are related to different biological re</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7>
+<TR><TD></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY">The main advantage of this type of analysis is that it measures how well public  services are targeted to certain groups in the population, including women, the  poor, and residents of regions of interest.  Requirements anti to women's reproductive and childbearing roles. Some evidence suggests that because of these differences. per capita health cat-e subsidies to women are the same as and sometimes larger than those to men What is clearer is that women are less likely than men to seek health care. including in many countries. hospital care when it is netted and ate mote likely to consult a non medical health cat-e worker (lather than a qualified medical practitioner). Education tends to increase the likelihood that women will seek health care. whether public or  ace the likelihood that women will seek health care. whether public or private (World Bank 1994b). </P>
+<P ALIGN="JUSTIFY">The importance of private and public investments in education and health services that will improve women's well-being is cleat. These services at-e also important for another season: these is important evidence that increases in women's well-being yield important intergenerational benefits and productivity gains in the future World Bank Living Standards Measure Study (LSMS) surveys car-tried out in Nicaragua (1993 Viet Nam 1993) Pakistan (1991), and Cote (1988) suggest that the probability of children being enrolled in school increases with their mother's educational level and that (controlling, for income and household size) girls. particularly those in non poor households. are mote likely to attend school if their mothers attended school. Other studies show that households with educated mothers lend to provide children with greater quantities of mote nutritious food often at a lower cost. than households with poorly educated mothers (Thomas 1990b)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Data from Brazil show that giving women more control over nonlabor income has a larger impact on child measures, nutritional intakes, and the proportion of the household budget devoted to human capital inputs than if men had control of this income (Thomas 1993) Other studies indicate that women spend proportionately mote of the income they control on health care for children than do men. Women also spend more on food products (as opposed to such goods as alcohol and tobacco) than men do (Duraiswamy 1992: Hoddinot and Haddad 1992) But fathers education is also important especially in interaction with mothers' education (Thomas 1990a) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other studies have shown that children's educational attainment is lowest in households whet-e the male head has no schooling In Ghana the impact of a mother's education on her children's schooling is reduced when  their father has no schooling. even after controlling for income and household size (Lavy 1992).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Material health (which is linked to education) also has important intergenerational effects. Children of mothers who are malnourished or sickly or receive inadequate prenatal and delivery cat-e face a greater risk of disease and premature death. Iodine-deficient mothers run a greater risk of giving birth to infants with severe mental retardation and other congenital abnormalities than do healthy mothers. Reduced fertility and improved health for women can increase individual productivity and improve family well-being. When good health is combined with education and access to jobs. the result is higher rates of economic growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Household and Labor Market Linkages</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The link between the household and the labor market is particularly important. Specialization of labor within the household-whether individually chosen. socially determined. or legally induced-can accentuate gender inequalities in the formal and informal labor markets by leaving most of the unpaid work to women. This situation arises from convention rather than  from comparative advantage Inadequate public and community services.  transport. and housing also often have an uneven effect on the way men and women spend their time and can increase the demand for goods produced at home using unpaid labor (Moser 1994) Thus women may spend its much (or more time on unpaid work as on market work. In some countries this unpaid work contributes as much as one-third to the economy recorded GDP-and even mote to the welfare of poor families.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The amount of time women contribute to household production and maintenance, direct income generation. and family care combined is widely held to exceed that of men Analysis of data from Bangladesh. Botswana. Ghana. Kenya. Pakistan. the Philippines. and Zambia on how rural women spend their time confirms that, although use of time by women, and by different generations of women varies according to location. available technology. household characteristics. and cultural norms. gender bias in time use is widespread.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women are generally responsible for collecting fuelwood and carrying water. Girls and alder women often do most of this work, although cultural norms in some countries affect women s mobility. The amount of time allocated to these activities is influenced by seasonal patterns of agricultural activity. the availability of substitute goods and services. and environmental changes. A study in Nepal, for instance, found that deforestation associated with a 75 percent rise in the time per trip would increase the time spent gathering fuelwood by 45 percent for all adults and by 50-60 percent for women.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In addition to fuel and water collection, child care is another activity that dominates women s time-although. considering the importance of children to future household welfare, the amount of direct time spent with children is limited. The seven-country study suggests that more time is spent on child cat-e in female-headed households. Female-headed households tend to have high dependency ratios and relatively large numbers of children, Implying more child-care time overall, but not necessarily on a per child basis. (Kumar and Hotchkiss 1988).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">When a large proportion of women's use of time goes unrecorded the design of projects and policies can yield false evaluations of costs and benefits. For example, women's unpaid work may be assumed to have zero value. As a result, women's response to changing incentives may be predicted as being higher than their time constraints actually allow. Project benefits-such as the time saved by locating piped water close to homes or by expanding rural electrification-may also be undervalued. Conversely, the benefits of treeing up time may be far more significant than might have been thought. A study in Tanzania, for example. shows that relieving certain time constraints in a community of smallholder coffee and banana growers increases household cash incomes by 10 percent, labor productivity by 15 percent, and capital productivity by 44 percent (Tibaijuka 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Formal Sector Employment</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Unpaid work and family responsibilities. as well as lack of investment in women's education. are strongly associated with women's relatively low rates of participation and their limited earnings in formal sector labor. Women's participation rates usually dip in the childbearing years, and earnings tend to decline following an interruption in employment. Younger on average, work more hours than older women, and married women with young children tend to work less than childless women and mothers of grown children. The correlation of marriage and childbearing with labor market outcomes can be seen even in industrial countries, where wage differences between married women and men are larger than those between single women and men Similarly, in some developing countries relative earnings decline with age (table 2.2) Children are not the only treason for interruptions in women's labor force participation; caring for ill or aged family members is often a womans responsibility. A study from Hungary estimates that half of all absenteeism by women workers is the direct result of the need to care for sick relatives (Einhorn 1993).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Countries, Single Women Earn More Than Married Women and Younger Women More Than Older Women.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2.2 female-male earnings (adjusted for hours worked) by marital status and age (percent)</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=345>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Country</B></FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Female-male</B></FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Earnings ratio</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">By marital status</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Married </FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Single</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Australia</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">69</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">91</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Austria</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">66</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">97</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Germany</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">57</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">103</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Norway</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">72</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">92</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Sweden</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">72</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">94</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Switzerland</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">58</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">94</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">United Kingdom</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">95</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">United States</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">59</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">96</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Age</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">A 25 </FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">B 45</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Brazil</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">75</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">63</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Colombia</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">94</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">70</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Indonesia</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">81</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Malaysia</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">82</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">61</FONT></TD>
+</TR>
+<TR><TD WIDTH="38%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Venezuela</FONT></TD>
+<TD WIDTH="27%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">92</FONT></TD>
+<TD WIDTH="35%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">70</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY">Sources: Blau and Kahn 1992 Sedlacek Gutierrez. and Mohindra 1993 </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thus. women s labor market outcomes can be substantially poorer than those of men because women's employment opportunities are constrained by social arrangements at the family or household level. These social demands are reinforced by legal conventions. Within the labor market itself, social or employer discrimination can affect women and men differently. and these differences are reflected in the resource allocation decisions taken within the household. Although wage discrimination is illegal in many countries, employers may respond to an increase in the supply of workers by segregating jobs by gender or offering less training to women who they perceive as being temporarily attached to the labor force (even if in fact most women never drop out). For example, women in the former Soviet Union are fairly well educated and have high labor force participation. but they are concentrated in occupations requiring fewer skills and less vocational training than men, and, on average. they earn less than men (Fong 1993).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Female Wages Are Lower than Male Wages, but This Is Changing.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2.3 female-male earnings ratio over time Female-male earning 1 ratio (percent) </P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=2 CELLPADDING=7 WIDTH=496>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Country</B></FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP" COLSPAN=2>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">First observation</B></FONT></TD>
+<TD WIDTH="25%" VALIGN="TOP" COLSPAN=2>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Second observation</B></FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">A v Average annual percentage change</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Brazil</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">50.2</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1981) </FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">51.6</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1990)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0.7</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Colombia</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">67.2</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1984)</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">70 2</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1990)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0.7</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">C&ocirc;te d'Ivoire</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">75.7</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1985)</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">81.4</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1988)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">2.4</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Indonesia</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">55.6</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1986)</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60.0</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1997)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1.3</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Philippines</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">70.9</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1978)</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">80.0</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1988)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1.2</FONT></TD>
+</TR>
+<TR><TD WIDTH="21%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Thailand</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">73.5</FONT></TD>
+<TD WIDTH="15%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1980)</FONT></TD>
+<TD WIDTH="11%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">79.8</FONT></TD>
+<TD WIDTH="13%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">(1990)</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0.8</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY">Note: Monthly earnings for Indonesia and Thailand rural and urban: for all others urban only</P>
+<P ALIGN="JUSTIFY">Source: Tzanntors 1995</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women's earnings relative to men's tend to increase over time. A study of six developing countries shows that female earnings relative to male earnings increased by 1 percent a year in the 1980s (table 2.3). There were two reasons for this increase: over the years women entered higher-paying sectors. and within sectors, their pay increased in relation to that of men. This gain would have been even greater had it not been for the effect on wages of increased female participation in the labor force. However, the most visible dimension of gender inequality in the formal labor sector remains the wage difference between men and women. Women's wages are. on average lower those of men by about 30 to 40 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social or employer discrimination can affect women and men difference and these difference are reflected i/? the resource allocation decisions taken within the household</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A recent study of the gender wage gap in Russia shows that after controlling for education differences, the ratio of women's to men's average hourly earnings stands at just over 71 percent: it has remained at that level since the 1960s. Part of the reason for women s lower hourly earnings in Russia and many other countries lies in patterns of occupational segmentation by ,gender. Some analysts argue that women-who do most of the household work in Russian households and also have high participation in the formal labor market cope with the burdens imposed on them by taking less demanding work and devoting less time to advancing their careers (Newell and Reilly 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Informal Sector</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One difficulty analysts face in interpreting trends in women's labor force participation and employment in developing economies is the large number of women engaged in informal sector activities, many of which overlap with subsistence - orientated household or community-based activities. Informal sector employment in most developing countries. whether in microentreprises or in casual work, is an important source of livelihood for women and their households.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The L competitiveness of women's informal sector activities is  constrained by women's limited mobility and lack of access to financial and public sectors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A recent study in Mexico estimates that 41 percent of the work force in Mexico's major-cities is employed in the informal sector (World Bank 1995c). Data from a 1989 survey show that 60 percent of men working in the sector are salaried workers' compared with only 18 percent of women. By contrast. 80 percent of women working in the sector are unpaid family members, as against 27 percent of men. By far the most common activity in the informal sector is commerce (fixed-location or itinerant), followed by repair works food preparation. and sales, and small-scale manufacturing. The sectoral distribution of informal employment reflects the hey role informal workers play in supplying goods and services to low-income consumers. Women tend to be concentrated in commerce and men in services and manufacturing, although the percentage differences are relatively small. Two generalizations can be made on the basis of this study: informal sector workers earn less than workers in large firms and women earn less than men.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another recent study of tour communities in Lusaka. Guayaquil (Ecuador), Metro Manila, and Budapest shows that informal sector activities ate especially important for during periods of economic reform Although the numbers both of men and of women in the labor force tend to increase during these times women rely more on the informal sector than men clot The competitiveness of womens informal sector activities is informal by women's limited mobility and lack of access to financial and public services. Women also tend to specialize in non traded goods and services that show relatively low average returns to labor. Across the tour cities in the study, women earn between 46 and 68 percent of men's wages (Moser 1994)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ability of informal sector workers to increase their returns depends on access to physical and human capital and their relationship to the institutional and regulatory environment. Contrary to the common belief, many microenterprises face considerable costs associated with the regulatory environment, including registration and licensing fees, as well as outlays for contracts with public authorities concerning zoning regulations and use of public utilities. In Argentina regulatory costs are estimated to absorb as much as 21 percent of the average microfirm's operational expenses. In some sectors, such as manufacturing and construction, the costs of regulation are about 44 percent (World Bank 1994d). In Mexico real regulatory costs. including the costs of compliance and evasion, are about 20 percent of total costs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Regulatory costs also inhibit Job creation in the informal sector. In Argentina across-the-board deregulation could generate as many as 170,000 jobs in small-scale manufacturing alone. Furthermore. poor workers in family-based firms or micro enterprises and particularly women entrepreneurs-often lack access to such basics as water and power. Targeting infrastructure investments to the poor, which takes account of the needs of women entrepreneurs s. can significantly enhance their productivity and earnings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In rural area where formal markets often are not well developed. informal employment activities play a vital role. In Asia the proportion of female rural wage laborers increased sharply in the 1960s and 1970s. In India women make up a larger proportion of rural wage laborers than of the entire labor force, probably because of growing landlines and poverty among rural households. Rural household labor accounts for a disproportionately large share of employment among the poor and an even larger share among women. Furthermore, a larger proportion of female than male laborers are hired on a casual basis, largely because family arrangements, especially lack of control over property, limit women's ability to work (Hart 1986: Bardhan 1993). Low status in the labor market is also linked to low female indicators in education, health, and nutrition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Providing credit directly to women has a positive effect on  household and individual welfare and improved gender equality.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Social norms affecting decisions within the family about occupational choices or migration can also lead to differential patterns of male and female earnings in informal markets (Bhiswanger and Rosenzweig 1984). Family responsibilities hinder women's geographic mobility, constraining their ability to command high wages and limiting them to certain areas or industries. The concentration of women in certain sectors, especially nontraded goods and set-vices. intensifies competition between women entrepreneurs and wage workers and lowers the returns to female labor. These effects are compounded by women's lack of access to credit. training, and technology.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">(fender Inequality in Access to Assets and Services )</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Access to Financial Markets</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The availability of financial services and access to them are considered important for several reasons. First. savings provide a kind of self-insurance. Second, credit helps households maintain a certain level of consumption at those times when their income fluctuates temporarily. Third, credit can be used to fund investments in capital or other inputs that will yield relatively high returns to production. if households cannot finance such investments from their own savings. A fourth and no less important reason is the role of savings and credit in increasing household members' options outside the home.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Inequalities between women and men in access to financial services- particularly credit--are widely documented. Collateral requirements, high transaction costs. limited mobility and education, and other social and cultural barriers contribute to women's inability to obtain credit (Holt and Ribe 1991). The implications tot household efficiency and individual well-being differ, however, depending on whether the household pools its financial resources. If, as the unitary household model assumes. a household pools its resources the characteristics of individual borrowers are less important than if there is little or no pooling. In the first case. credit resources will be used to meet household needs that have been jointly determined, regardless of who the borrower is. In the second case, the use credit is put to and the needs it then satisfies depend on which household member is borrowing.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A recent study of credit programs in Bangladesh sponsored by the World Bank shows that providing credit directly to women has a positive effect on variables typically associated with household and individual welfare and improved gender equality (Pitt and Khandker 1995). The study looks at three programs in Bangladesh: the Grameen Bank. the Bangladesh Rural Advancement Committee (BRAC), and the Bangladesh Rural Development Board (BRDB). in 1992, women accounted for 94 percent of Grameen Bank members. 82 percent of BRAC members. and 68 percent of BRDB members (Khandker and Khalily 1995; Khandker, Lavy, and Filmer 1994). Only the results for the Grameen Bank are presented here.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Table 2.4 presents the impact of credit obtained by women and men on a variety of social and economic indicators. The results show a clear and positive impact of both male and female borrowing on all indicators of Toward gender equality family welfare especially through an increase in per capita expenditures increases in both boys' and girls schooling, anti a reduction in fertility. Females borrowing has a greater effect on girls' schooling anti per capita expenditure than does male loot-rowing: male borrowing has a greater effect on boys' schooling and fertility than does female borrowing. Interestingly. female borrowing also results in mote female ownership of nonoland assets and an increased supply of female labor to cash - income -earning activities (Pitt and Khandker 1995).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Loans to Women and Men Have Important Welfare Implications.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2 4 welfare effects of Grameen Bank loans (percentage increase)</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=545>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Welfare e change</B></FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Effect of male borrowing</B></FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Effect female borrowing</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Increase in boys' schooling</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">7.2</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">6.1</FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Increase in girls schooling</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">3.0</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">4.7</FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Increase in per capital expenditure</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1.8</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">4.3</FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Reduction in recent fertility</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">7.4</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">3.5</FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Increase in women's labor supply to cash-income earning activities</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">10.4</FONT></TD>
+</TR>
+<TR><TD WIDTH="47%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Increase in women nonland assents</FONT></TD>
+<TD WIDTH="28%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">0</FONT></TD>
+<TD WIDTH="26%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">19.9 </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The introduction of programs such as the Grameen Bank in a village has a positive effect on agricultural and nonagricultural production (Khatidketati Chowdhuty 1994: Rahman and Khandke 1994 The probability that women will be self-employed rather than work for wages increases by 52 percent. The latter finding is important because much of the wage employment open to women in rural areas is very poorly remunerated and can be quite exploitative. Self employment can bring the opportunity of higher returns for women, plus the freedom to integrate their earning activities into other work as they see fit.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Access to financial services alone cannot reduce gender inequalities in the allocation of household resources. A qualitative study reviewing several targeted credit programs in Bangladesh cautions against overgeneralizing about the benefits of giving women access to credit. The study finds that it is difficult to infer that increased borrowing alone improves women's bargaining power because in many rural Bangladesh households the question of who controls the resources is quite complex (Goetz and Sen Gupta 1994). Nevertheless. the possibility of receiving credit (or similarly of working for wages) may give women greater bargaining power within the household. This bargaining power can be used to improve child health and nutrition and may increase the likelihood that children will attend school.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Access to Lund and Property</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The ownership of land and the distributions of land rights influence the productivity of labor and capital resources and the incentive to invest in resource management Private property rights. in particular. are associated with increased access to product and factor markets. especially credit markets. and to public services such as public utilities and agricultural extension. However. relatively little direct evidence exists to link independent owner of land by women with increased access and productivity. One obstacle to empirical work is that women s access to land and property is often mediated trough marriage (A married woman land rights are frequently limited to use rather than ownership.) Future more. complex systems of land tenure make it difficult to generalize about the effects of owner ship on productivity. None some evidence suggests that independent land rights for women could enhance both the efficiency with which resources are used and the well-being of women and their households: (Agarwal 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The possibility of receiving credit may give e women   greater bargaining power within the  household which  can be used to improve child health and nutrition.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">While independent land rights may increase efficiency and household welfare, lack of secure land  appears to be associated with low investments by women in land conservation. In Zimbabwe's communal areas, land that a women acquires is often allocated to her only temporarily: for example, the location of land allotment received from husbands or borrowed from neighbors is usually subject to periodic change (Jackson 1993). The same is true in parts of West Africa (David 1992 Jackson 1994). Uncertainly about the permanence of their control over the land means that women may be reluctant to invest in improvements that will benefit the landowner rather than the user.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A significant trend in recent decades in developing countries has been the move toward private ownership In some countries this trend has been encoulagecl by reforms dealing with land redistribution tenancy or land titling Such reforms are considered important for promoting long-term investments and the adoption of the latest technology They also provide the collateral people need to gain access to credit and other factor markets Ironically, evidence also suggests that perform inequalities in male and female land rights are reinforced by land reform programs For example, in Latin America most reforms are based on the premise that the man of the household its the household head. This presumption means that women (except for widows  and ownership. Even where women and men benefit equally from land reform differences exist between nominal and real land rights (see box 2.3).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the central part of European Russia and in Moldova the lands and assets of state and collective farms are being parceled out in allotments as part of wider economic reforms. Every person who lived and worked on a collective farm receives a share of the land Data show that although on average, women have received a slightly higher proportion of land shares than men, the nonland capital assets of the old farms ale being distributed as property shares on the basis of a formula heavily weighted toward an individual's wage rate and years of employment. Such criteria favor men over women and give men more valuable property chares. Dividends paid on these property shares also tend to be higher than those paid 011 land shares Holt 1995).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Land reform programs that fail to account for gender differences in rights</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 2.3 who gets access to land? Honduras and Cameroon</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Honduras' Agrarian Modernization Law of 1974 includes a provision giving men age 16 or older the right to access to land, independent of any other qualification. For women. however, this right is restricted to unmarried mothers or widows with dependent children. Furthermore. if a male beneficiary dies or becomes incapacitated. the law gives preference in inheritance rights to a male child over the child's legally married mother. Some 30 percent of rural Honduran households are headed by women at least part time because of the seasonal migration of men to look for work (Saito and Spurling 1992). </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the northwest and southwest provinces of Cameroon. an estimated 50 percent or more of those who claimed land within the first ten years of land registration (1974-85) were classified as public servants. Over 32 percent of all the remaining land titles went to businesses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women make up more than 51 percent of Cameroon s population and do more than 75 percent of the agricultural work. but they are virtually absent from land registers. Only 3.2 percent of all land titles issued in the Northwest Province were given to women; in the Southwest Province the figure was 7.2 percent. For the country as a whole. it is estimated that women obtained under 10 percent of all land certificates (World Bank 1995a).  to own. use, and transfer land may actually exacerbate the insecurity of women's land claims and. as a result, harm household welfare. For example, there is evidence that land titling focused on male household heads has adversely affected women's ability to farm independently. Moreover. intrahousehold inequalities in income and decisionmaking have increased (FAO 1993) In Africa some titling programs have allowed men to take advantage of their control over land to redesignate land formerly cultivated by women as household land. This switch provided the opportunity for men to increase the amount of work they expect from women on household plots. In other cases women have received smaller and less fertile plots than they had before for their personal crops (FAO 1993).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Recognizing women's independent claims to land is therefore an important issue in property reform. In poor households. having rights to land could alleviate both women's own poverty and the household's risk of remaining poor. The season is mainly that women s access to economic resources has a positive effect on household welfare (Agarwal 1994). From the point of view of efficiency, secret land tenure increases the incentive to manage resources efficiently and expands access to formal credit markets. Because secure land tenure can mean greater productivity, it may also increase the household's incentives to invest in women's human capital.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Access to Extension Services</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agricultural extension services provide information training and technology to agricultural producers. Extension services have always been regarded as necessary for agricultural modernization. Given the importance of women's labor to agriculture in most regions, providing women with access to agricultural extension services is essential for current and future productivity. Types of agricultural extension services vary, hut in most countries publicly provided services dominate. Evidence suggests that women have not benefited as much as men have from publicly provided extension services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Given the importance of women's labor to agriculture it is in most regions providing women with access to agricultural extension services is essential for current  and future of productivity.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A review of five African countries shows that extension agents are most likely to visit male farmers than female farmers (table 2.5) The impact of this inequity on female productivity depends in part on whether women and men within households pool information. There is, however. little evidence to suggest that this happens (see box 2.4). It is important to ensure that extension services reach omen directly, not only to redress gender inequalities but also to maximize productive efficiency. omen play a critical role in production of food and cash crops for the household. in postharvest activities. and in livestock care Men and omen perform different tasks they can substitute for one another only to a limited extent. and this imitation creates different demands for extension information Also, as men leave farms in search of paid employment ill urban areas. women are increasingly managing and operating farms on a regular and full-time basis. Hence. omen are becoming a constituency for extension and research services in their own right (World Bank 1994e)</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2.5 visits by agricultural extension agents (percentage of households visited)</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=439>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Country and year</B></FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Households with female head</B></FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Households with male head</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<FONT SIZE=2><P ALIGN="JUSTIFY">Kenya. 1989</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">112</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">9</FONT></TD>
+</TR>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<FONT SIZE=2><P ALIGN="JUSTIFY">Malawi, 1989</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">70</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">58</FONT></TD>
+</TR>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<FONT SIZE=2><P ALIGN="JUSTIFY">Nigeria 1989</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">37</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">22</FONT></TD>
+</TR>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<FONT SIZE=2><P ALIGN="JUSTIFY">Tanzania, 1984</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">40</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">20</FONT></TD>
+</TR>
+<TR><TD WIDTH="37%" VALIGN="TOP" COLSPAN=2>
+<FONT SIZE=2><P ALIGN="JUSTIFY">Zambia</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">&nbsp;</TD>
+<TD WIDTH="32%" VALIGN="TOP">&nbsp;</TD>
+</TR>
+<TR><TD WIDTH="4%" VALIGN="TOP">&nbsp;</TD>
+<TD WIDTH="33%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1982</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">57</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">29</FONT></TD>
+</TR>
+<TR><TD WIDTH="4%" VALIGN="TOP">&nbsp;</TD>
+<TD WIDTH="33%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1986</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">60</FONT></TD>
+<TD WIDTH="32%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">19</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 2.4 do women farmers learn from their husbands?</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A survey of women farmers in Burkina Faso found that 40 percent had some knowledge of modern crop and livestock production technologies. For most of these women, relatives and friends were the source of information; nearly one-third had acquired their knowledge from the extension service, and only 1 percent had heard of the technologies from their husbands.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Men are less likely to pass information on to their wives when crops and tasks are gender specific. In Malawi women claimed that their husbands rarely passed on advice to them: if their husbands did tell them something. the women did not find it relevant to their needs. In India women learned from friends, relatives. neighbors. and sometimes from their husbands. but this second-hand information seldom changed their production patterns (Saito and Spurling 1992). </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The expansion of agricultural services beyond the public sector is a growing phenomenon in developing economies. The inadequacies of public funding plus the need to provide snore client-oriented services, suggest that the private sector has an important role to play However, women's limited access to land and credit put the many potential benefits offered by extension services out of reach. For example in Kenya's Meru and Maranga areas more than half the women surveyed cited a shortage of cash as their reason for not adopting, technologies that would maximize their output and increase their efficiency. The amount of education omen receive and the efficiency with which they run their farms are also closely linked This tie is particularly significant in light of the fact that one purpose of extension services is to advise farmers on use of modern technology.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Three studies of Kenya found that the gender of the farm manager was, by itself. an insignification factor in output per hectare but that the manager's educational level had a significant effect on farm productivity (Moock 1976: Saito and Spurling 1992: Bindlish and Evenson 1993). Simulations based on these studies suggest that significant gains could accrue to increased investment in women's physical and human capital. As the data in table 2.6 show, if women and men shared the same educational characteristics and input levels. farm-specific yields would increase between 7 and 22 percent. Giving women primary schooling, by itself. would increase yields by 24 percent. Thus under investment in women's education limits growth of agricultural productivity. Well-targeted extension services can help to narrow the differences in productivity that arise from educational inequalities (Schultz 1988)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Increasing Human Capital and Input Levels Would Increase tile Yield for Women Farmers.</P>
+<P ALIGN="JUSTIFY"></P>
+<B><P ALIGN="JUSTIFY">Table 2.6 effects of increasing women farmers' human capital and input levels Increase  yields</P>
+</B><P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Policy experiment </B></FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">(percent)</B></FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Maize farmers Kenya, 1976</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">&nbsp;</TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of giving female farmers sample mean characteristics and input levels</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">7</FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of giving female farmer s men's education and input levels</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">9</FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of giving women primary schooling</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">24</FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Food maize (maize beans and cow pears) farmers</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">&nbsp;</TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of giving female farmer men's education and input levels</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">2.0</FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of increasing land area to male farmers' levels</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">10.5</FONT></TD>
+</TR>
+<TR><TD WIDTH="82%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">Effects of increasing fertilizer to male farmers' levels</FONT></TD>
+<TD WIDTH="18%" VALIGN="TOP">
+<FONT SIZE=2><P ALIGN="JUSTIFY">1.6</FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Conclusion</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Analysts must look beyond market outcomes to identity the sources of persistent inequality between women and men. The search must focus on the household and its role in the formation of present and future human capital and on institutions beyond the household that reinforce and perpetuate gender inequalities. Gender inequalities within the household affect market outcomes, and these feed back; into household decisionmaking. This process is reinforced by inequalities in access to assets and services beyond the household. Improving the relative status of women within the household and increasing their access to assets and services will increase the returns to investment in human resources and improve the prospects for sustainable economic growth.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">We must look for that which we have been trained not to see  Ann Scales, Yale Law Journal 1986</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Chapter three</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<B><P></P>
+<!--
+<Section>
+  <Description>
+    <Metadata name="Title">Public Policies Matter</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As CHAPTER 2 has shown underivesting in girls and women is inefficient for society as a whole. Correcting for past underinvestment will require a "genders" approach to public policy. How this can be concretely achieved is the topic of this chapter.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Equalizing Opportunities by Modifying, the Legal Framework</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Laws form tile functional framework of the economy and of civil society. Equality in the legal treatment of men and women creates the legitimacy policymakers need to seek change. Legal and regulatory provisions that discriminate against women-that. for example bar married women from seeking employment or prevent women from holding legal title to land-perpetuate gender inequalities and severely restrict women's ability to participate fully in social and economic development.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Modifying the legal framework to  eliminate discrimination and equalize opportunities for women and men is an important goal for public policy at the national and international levels. A supportive legal environment is also vital for other aspects of public policy that have a direct bearing on the opportunities available to women. such as regulations affecting the formal and informal sectors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Four areas of the law are particularly important for equalizing the opportunities available to men and women: land and property rights; labor market policies and employment law: family law: and financial laws and regulations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Land and Property Rights</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Policymakers should ensure that women and men are treated equally in the public allocation of land. Eligibility for land reform programs, for example. should not discriminate against women's perform claims whether the women are heads of households or members of households headed by men. When communities have been resettled or when a project allocates land to participating producers, women should have the same rights to land as men For refugee and displaced women returning to their homelands. often as de facto heads of households. need fair and equal treatment to allow them to establish a Farming or enterprise base as soon as possible. Whet-e land is in short supply, it may be necessary to recognize the land rights of certain groups, as well as their individual rights. The Indian National Sericulture Project is an example; it has leased land to women's groups and promoted women's access to land under state land-grant schemes (Quisumbilig 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Some countries have enacted legislation to ensure gender equality in property and contractual rights. Under China's Law of Succession, for example males and females have equal rights to inheritance. Complementary measures are needed to ensure that women know their rights. Such measures include legal programs and campaigns to make judges and administrators sensitive to gender issues in the area of property rights (see box 2.1)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Labor Market Policies and Employment Law</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Discriminatory labor market policies and employment laws are widespread: examples are bans on hiring married women and restrictions on the type of work pregnant women may pet-form. Labor laws may also restrict female participation in jobs and deny women access to work settings. Even legislation that seeks to promote equal opportunity can have outcomes tot women workers. For example, generous maternity and child-care benefits tot women workers may make hiring women relatively mote costly than hiring men. perpetuating the gender wage gap.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The main issue for public policy its to ensure that fair and equal employment laws exist and are enforced.</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.1 some NGO efforts to promote women's legal literacy</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schuler and Kadirgamar - Rajasingham (1992) describe innovative approaches by  non governmental organizations to provide women with useful legal knowledge and tools.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Caribbean Association for Feminist Research and Action (CAFRA) has launched "women and the law" projects in five English-speaking Caribbean countries. Using a participatory methodology. the projects aim to create awareness of the law. provide women with legal information that will be useful to them in their daily lives, identify specific areas for action, and influence overall legislative policy. The projects develop educational materials for legal literacy and offer topic specific paralegal training for women's organizations.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The legal literacy program of the Ugandan Women Lawyers' Association (FDA-Uganda) conducts legal literacy campaigns on specified dates each month in different districts. Pairs of FIDA volunteers conduct sessions, using role playing and discussions, on legal topics of relevance to women's lives and provide advice on contacting the FIDA legal clinic for advice and representation. In addition, FIDA and Action for Development broadcast regular radio and television programs on women and the law and publish pamphlets on legal issues of interest to women. </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In India the Self - Employed Women's Association (SEWA) holds worker education meetings to provide members with legal information and offers one day training sessions on specialized legal information for community leaders. Members of SEWA paralegal staff research cases, prepare briefs, and argue all cases in labor courts for members. SEWA'S legal literacy efforts are part of its overall strategy of action for supporting self-employed women and women in the informal sector.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In this regard. the main issue for public policy is to ensure that fair and equal employment laws exist and are enforced. Such laws should cover employment and employment-related benefits and should not be applied in a way that restricts women's access to the labor market.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In many countries women are protected by special standards in the workplace. These safeguards are of two types. The first includes measures intended to end discrimination in the labor market by requiring equal pay for work of equal value or by prohibiting the exclusion of workers from certain jobs because of gender. The second type protects women in their role as mottles by requiring employers to pay the full cost of maternity leave and provide childcare facilities. restricting night work, and limiting work categorized as dangerous or hazardous.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The first type of labor standard is often difficult to enforce. although nearly 120 countries have enacted equal opportunity laws. In most cases the law is in place but is not enforced. Furthermore. it often applies only to the formal sector of the labor market. leaving large number of women in the informal sector with little protection. More concerted public and private action is required to devise appropriate for enforcement. In additions complementary measures are needed to increase womens chances of entering the labor force. Such measures would include mote met-it-based hiring of women in the public sector and the creation of an appropriate regulatory framework that encourages the establishment of day-care centers private nursery schools. and kindergartens for the children of workers in both the formal and informal sectors. (Box 3.2 describes a day-care projects in Bolivia)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many countries have laws that limit night work. over theme and the use of heavy machinery by women. While well intentioned. these laws. too. can reduce women's employment options by raising the employer's cost of hiring women and perpetuating the notion that women workers are less flexible than male workers. This adverse result occurs because women already tend to have lower levels of capital than men and are limited by traditional notions of what womens work. Devising effective protective legislation for women is thus a difficult balancing act.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Effective laws to protect women must honor the fine line between ensuring sate working conditions for all workers, including women in the informal sector. and providing equal opportunities for all workers seeking employment. Standards relating to maternity leave and child-care benefits are common in the formal sector. To ensure that such standards do not raise the costs of female labor unnecessarily employment legislation should avoid having employers pay benefits directly. Maternity benefits should be funded through general revenue taxes</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Box 3.2 day-care center in Bolivia to enhance the status of women by increasing their employment opportunities in other Latin American countries, and their knowledge of women in Bolivia are over represented , health, and nutrition. The project among the poor, and many live in will establish day-care centers to proficult circumstances. They are twice vice non formal,  home-based, integrals likely as men to be illiterate, their child development for children unaccess to child care is limited, they the age of 6 in thirty-four poor subject to discrimination in hiring ban and purebred areas. Women and wages, and they are restricted benefit from the project either as by law from engaging in certain procure givers employed at the minimum ductive activities. wage or as clients of the centers. The Integrated Child Development children in day care gives women Project, financed by a credit from the more time to search for jobs or to in World Bank's International Development their current situations (Winkler opponent Association designed and Guedes 1995).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Or social security systems rather than by direct contributions from individual employers. In Eastern Europe and Latin America, however, this method of funding benefits has imposed a significant cost on the treasury, raising the question of how much should be paid and for how long.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">One way of addressing this issue is for governments to encourage women and men to share the responsibility for childrearing by adopting legislation allowing either parent to qualify for the leave and benefits associated with having a child (Folbre 1994). Such legislation can be supported by changes in the tax system to ensure equal treatment of workers within the household and a margin tax rate on the earnings of additional workers in the household low enough to avoid creating a disincentive to women's participation in the labor force (Mac Donald 1994). These tax changes can be complemented by legislation that encourages absent to pay child support. Such laws are in place in many Latin American and Caribbean countries. but none systematically monitors transfers (Folbre 1994). Greater efforts to enforce the law are needed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Family Law</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gender inequality in family law can worsen women's bargaining position within and outside the household and affect household welfare and efficiency. As noted in chapter women's bargaining position in relation to Household resource allocation is often a key factor in determining the wellbeing of household members. particularly children. Reforms of family law can enhance women's economic and social opportunities while still respecting cultural norms. For instance the minim age of marriage for women  should be set high enough so that girls can complete secondary schooling: this would help lower fertility rates. (Allowing for exceptions such as parent consent negates the potential fertility benefit.) Marriage contracts should include stipulations guaranteeing the wife's rights. especially on separation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Women's bargaining position in relation to household</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Legal and policy measures can have a direct bearing on the health of women. The law and its enforcement are essential for combating domestic violence against women. If the laws on violence against women are to be enforced, women need to be made aware of the legal recourse available to them and the judiciary and police need to be sensitized to the existence and</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.3 innovative approaches to combating gender violence</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Brazil's women-only police stations are an innovative approach to the problem of violence against women. They have been so successful that other countries-including Argentina, Colombia, Costa Rica, India, Peru, and Uruguay-have emulated them. The police stations have made it easier for women to report gender based crimes of violence, and, with that experience, women are now demanding more support from the police, such as legal counseling and advice. Despite the program's success, the number of convictions for gender-based crimes has not increased, largely because similar innovations have not been made in the  judicial system (Heise, Pitanguy, and Germain 1994). </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Zimbabwe the Mussasa project provides support and counseling to abused women and sensitizes police and prosecutors to the issues of domestic violence and rape. To ensure the credibility and acceptability of the training, legal professionals are involved in the program. One branch of the criminal justice system-the police department, for example-often hosts training for another, such as prosecutors (Stewart 1992).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Costa Rica El Instituto Legal de las Naciones Unidas y Desarrollo runs gender sensitization training for prosecutors, judges, lawyers, and other professionals who deal with crimes of violence against women (Heise, Pitanguy, and Germain 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Implication of violence against women. Affirmative action policies can increase the number of women police officers lawyers, and judges. Trading police, lawyers, and judges can increase their gender sensitivity. making the legal system more responsive to women's needs. Legal literacy efforts can make women aware of their rights and show them how to use these rights to mobilize for change. Some approaches to dealing with domestic violence are illustrated in box 3.3</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Financial Laws and Regulations</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Access to credit is vital for women, allowing them to manage fluctuations in income and expenditures and to expand their businesses. As we saw in the preceding chapters, credit can be an important source of economic empowerment for women within the household. But in many countries. underdeveloped financial markets, controlled interest rates, and overly rigid backings regulations have led to systems of credit that tend to shut out the pool. many of whom are women If financial institutions are to lend to those unable to obtain credit in the current environment. interest rates must be liberalized. Positive interest rates have important effects on informational money markets, which tend to be more exploitative when formal sector credit is rationed.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Changes in the laws governing access to credit are also vital because women's business profiles often differ from men's. Compared with men. women are more likely to work in low-risk small, and home-based businesses (Rhyne and Holt 1994). This situation creates a demand for small loans that can be obtained without formal, legally secured collateral and that offer relatively flexible repayment terms. Legislation that encourages broad access to financial institutions can increase the availability of these types of loans. but legal changes may also be needed to extend the range of acceptable collateral.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In many countries the regulatory framework contains provisions that are especially punitive to small firms. This adds an additional constraint on women, whose businesses are concentrated at the small end of the size The deregulation of the microentreprise sector would remove implicit disincentives to small-film activity and would relieve some of these Such action would enhance women entrepreneurs' prospects of benefiting from training or credit programs targeted to the microentreprise sector (World Bank 1994d. 1995c).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Redirecting Public Policies and Expenditure to Promote (tender Equality)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is unlikely that legal reform by itself will be sufficient to ensure that women and men ate treated equally. Further public action may be required to guarantee that gentler-neutral laws are enforced at both national and local levels.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Macroeconomic: Policies</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Many developing countries are implementing important policy and institutional reforms to address changing economic conditions on both the domestic and international fronts. These reforms are often supported by international financial institutions and bilateral donors. The pace of reform has varied across countries Those countries that have implemented reforms early on, carried them out consistently, and received adequate financial support have generally enjoyed faster and stronger economic growth than count ties that have undertaken reforms too slowly, too intermittently, or not at all. Where implementation has been slow or the government's commitment weak, economic distortions have tended to multiply and economic trowels to slow. limiting the government's ability to invest in physical and human capital for the future.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is often the poorest groups in society that stand to lose the most from economic distortions. High and rising inflation places a disproportionate tax burden on the poor including low-paid wage workers and those with fixed incomes. For this and other reasons, inflation tends to hit women harder than men. An overvalued currency is also regressive; it keeps the price of goods artificially low. crowding out many locally produced goods. Women's businesses. which ate often concentrated in the informal sector, can be particularly vulnerable to competitions from cheap snorts. An overvalued currency reduces international competitiveness. limiting the availability of foreign exchange for domestic entrepreneurs and constraining business expansion and employment creation. A firm commitment to policy refortify is therefore essential to economic growth and sustainable initiatives for alleviating poverty.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Inflation tends to hit women harder than men.</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Such reforms generally include two kinds of necessary policies. The first emphasizes macroeconomic stability and the removal of price distortions: the second promotes labor-demanding growth in agriculture and industry and better. mote accessible basic social services. mightily in education, health care and water supply. Macroeconomic stability can be achieved by reducing large current account and government budget deficits and by curtailing excessive money and credit expansion. Correct pricing of foreign exchange and of domestic goods and services facilitates trade and investment and promotes growth Reforms of trade and price incentives encourage job creation and higher earnings.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In shots. broadly based economic reforms benefit the poor, as the experiences of diverse countries have shown. Data from the LSMS and similar studies confirm that in Costa Rica, Ethiopia. Than Indonesia, Peru, the Philippines, and Tanzania, declines in poverty rates have accompanied economic reforms. Because of underlying gender inequalities, reductions in poverty do not necessarily improve the economic status of women. Nonetheless. although empirical evidence on changes in women's welfare following reforms is scarce, data from the Philippines suggest that for women. economic reform is by improvements in social indicators and important employment gains (box 3.4). An analysis of household data from Peru indicates that reforms there have not only led to renewed growth and reduced poverty but have also improved the status of female-headed households (box 3.5).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Despite their seminal role in encouraging sustainable. long-term growth. some economic reforms involve transitional costs. for two reasons: the need to implement radical shifts in government policy, and the lag. perhaps of years, between acceleration of economic growth and the realization of the 
+</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.4 social progress and labor force gains for women in the Philippines</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The Philippines began implementing economic reforms in the early 1980s. While political turmoil and some policy slippage have weakened GDP growth over the period and led to the need for further reforms, quality of life indicators have improved during adjustment. For example, by 1990 the incidence of absolute poverty had declined by about one-third (to approximately 20 percent of the population). Maternal and infant mortality rates also declined over the period: in 1980 the infant mortality rate was 52 per 1,000 live births, but by 1990 it had fallen to 41 per 1,000 births (Johansen 1993). </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The percentage of the population with access to safe drinking water increased between 1980 and 1990, from 65 to 93 percent of the urban population and from 43 to 72 percent of the rural population. The figures for sanitation services showed the same increase, climbing from 81 percent with access in 1980 to 98 per  cent in 1990 among urban dwellers and from 67 to 85 percent among those in rural areas. Secondary school enrollment rates for boys and girls also showed gains. Girls and boys have traditionally reached similar educational levels in the Philippines, a trend that contributed to women's gains in the labor market during adjustment in the 1980s. While labor force participation rates for men rose only slightly, the rates for women increased dramatically, from 23 to 37 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">At the same time, women's wages as a percentage of men's grew from 71 to 80 percent between 1978 and 1988 (Tzannatos 1995). A recent study of a low-income community in Manila found that in some private sector jobs women earn more than men, reflecting in part the high educational level among women in the sector. Earnings in the informal sector are generally low for both women and men. although some women have been so successful in their informal sector businesses that their spouses have opted to leave low-paying jobs in the formal sector to participate in their wives enterprises (Moser 1994).  benefits of growth by large segments of the population. The short-term costs can include increases in food prices as subsidies are removed temporary restrictions on credit to control monetary expansion, and cuts in public spending as governments attempt to control budget deficits and reorient spending toward the most important public services. Moreover, inequalities in access to and control over resources and in entry into markets hamper some groups in taking advantage of the opportunities created by economic reform For example, people who are unable to acquire new skills may remain for some thee. Gender inequalities in access to and control over land in rural areas can keep women farmers from taking advantage of changes in the relative prices of tradable and non tradable crops.</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.5 macroeconomic reform and improved living standards in Peru</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Between 1985 and 1990 Peru's economic regime was marked by expansionary monetary and fiscal policies and high levels of government intervention in most areas of the economy. Although these policies led to an initial period of growth, the approach proved unsustainable: by late 1987 growth had given way to hyperinflation and deep recession. During 1988-90 real GDP dropped by an average of 8 percent a year. Real wages and consumption expenditure also fell sharply as inflation soared to 7,600 percent a year in 1990.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In 1990 the new government of President Alberto Fujimori introduced macroeconomic reform measures designed to stabilize the economy, reduce fiscal deficits and inflation, increase market efficiency, and improve the country's competitiveness. Under this reform program inflation declined dramatically, falling to 57 percent in 1992 and to 17 percent in 1994. Real GDP grew by about 20 percent between 1991 and 1994, while real per capita consumption expenditure grew by more than 18.5 percent. LSMS data show that poverty declined by 11 percent-from 55 percent of the population in 1991 to 49 percent in 1994. Although the country experienced a brief contractionary period following the introduction of reform measures, household data from Lima for 1990, 1991, and 1994 indicate that in 1994 per capita expenditure was well above, and the incidence of poverty well below, 1990 levels. </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Improvements in living standards have been widespread, and the largest gains have been made in some of the country's poorest regions, such as the urban and rural sierra (mountain areas). In most parts of the country, increases in per capita expenditure among households headed by women have been above the national average. In the urban and rural sierra, for example. consumption expenditure by these households increased by 47.7 and 44.8 percent. respectively-figures that compare favorably with increases in per capita expenditure among households headed by men (35 and 28 percent for the same regions).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although both women and men are expected to gain from economic reform in the long run. gender inequalities at the household and market levels can mean that the benefits of reform reach women, especially poor women. only slowly. Reforms must incorporate measures aimed at counter acting shot-term transitional costs. Among the most important are safety nets specifically targeted to vulnerable groups. For example, in fiscal 1994 seventeen of the twenty-three reform programs supported by the World Bank included components aimed specifically at reducing poverty: fourteen of them targeted programs or safety net measures such as labor-intensive public works projects. targeted and social assistance programs, and unemployment and social security schemes (see box 3.6).</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7 WIDTH=590>
+<TR><TD VALIGN="TOP">
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.6 food coupons improve nutrition in Honduras</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The food coupon program in Honduras, part of a social safety net supported by the World Bank and financed by IDA and other donors, was put in place in 1990 to protect the country's most vulnerable people during economic reforms. Starting with about 182,000 participants, by 1994 the program had expanded its coverage to 345.000 of the estimated 430,000 children at risk of malnutrition. The effort also supports nutrition education for health workers, community groups, and mothers. Because coupons are used instead of food. the government saves some 30 percent over traditional food distribution costs, and the beneficiaries are able to choose the food  they will consume. Beginning in 1995, an adjustment for inflation will maintain the value of the coupons, enabling participants to satisfy a constant proportion of their food needs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The project also supports the development and implementation of a long-term nutrition assistance strategy for Honduras. Although attempting to measure changes in malnutrition is difficult in the short term, there have already been noticeable benefits. Between 1990 and 1993 the number of first-graders with severe or moderate malnutrition dropped by 4 percent. Organizers are now trying to graduate women participants from the program by offering training in basic skills such as food processing and helping them find assembly work in local factories (World Bank 1995b). </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However, safety nets are not a substitute for a mote integrated approach to economic and social policy that includes appropriate levels of harvest in social services and infrastructure. Recognizing this fact, governments and donors are increasingly incorporating into their reform packages antipoverty initiatives and measures to reduce gender inequality. In Pakistan, for example, the FIDA-financed Public Sector Adjustment. Program provides much needed the financial support for the balance of payments account and reinforces the emphasis on government investment in the social sectors. The program promotes increased access to and improvements in basic education. health. and water supply services that benefit girls and rural areas. It also supports a shift it government education and health spending toward the primary level.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">In fiscal 1994 twelve of twenty-three World Bank economic reform pro emphasized the restructuring public expenditure, primarily to and increase spending on education. health care, and other areas important to poverty reduction such as water supply and sanitation. The Burkina Faso reform program is typical; it supports an increase in the total budgeted amounts for primary education and health services, which are particularly beneficial to the poor and to women. Uganda s program seeks to protect and enhance public expenditures for basic social services. including water supply primary health care and primary education. In the long term, the reform of public spending-especially in the social sectors, physical infrastructure and agricultural research and extension-promises significant benefits) trot women.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Sectoral Investments</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In principle. public expenditures on social services and infrastructure are allocated on a gender-neutral basis; in practice men and women use these services differently. The resulting inequalities frequently perpetuate gender based differences in the accumulation and distribution of human capital within households. Public policy can address this problem by public expenditure priorities between secrets and within social sectors. Further it can support services and types of infrastructure that provide the highest social returns to public spending and are most heavily used by women  and children.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">EDUCATION. Estimations of the private returns to education for a number of countries (Psachatopoulos 1994) show that returns are at least equal for girls anti boys and are often higher for girls. Moreover, these rates do not capture the externalities generated by providing education to girls. The combination of private and social returns provides a clear signal for restructuring the allocations of public resources so as to support female education. Yet incidence analysis for a number of countries for which the necessary data are available reveals that educational subsidies per capita are higher for males than for females This difference is partly a result of the bias in allocation of subsidies toward higher levels of education, where female enrolled is lowest. Distortions in the allocation of public resources, such as the provision of mote money foe male-dominated tertiary institutions than for education that benefits girls, should be corrected by reallocating spending toward basic (primary and lower-secondary) schooling. Targeting these educational levels will have the maximum effect on girls' education and will yield higher social returns for society as a whole. In countries where universal basic education has been achieved and capital markets are unable to help households finance higher education, continuing subsidize higher education may be warranted. The rationale for the subsidy would be the productivity gains associated with a better-trained labor force.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">To correct the bias against enrollment of girls more targeted interventions are need to influence household (see decisionmaking)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">However reallocating public spending toward primary education and later toward higher levels is not sufficient to erase the gender gap in education The bias against enrolling girls in school is evident in both poor and no poor households and applies even at the primary level. To correct this bias, more targeted interventions are needed to influence household decision making</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">HEALTH. Correcting the gender bias in the public financing of health care IS a more complex process than correcting the bias in education. for two main reasons: the marked differences between the health needs of men and women, and the unreliability of household data on demand for health services in comparison with the data on demand tot education). However it is cleat that targeting health services to women implies provision of adequate funding for prenatal care. infant immunization, and mother and child health services. Because of the significant social benefits of providing women with appropriate health care, governments should make basic services ices that benefit women a top priority among, public health care expenditures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There is a critical link between the public provision of health care and women's access to educational opportunities. A mother educated to seek preventive care and early treatment of illness for herself and her children (particularly girls) will reduce the cost of health care and in many cases. prevent premature death. Most of these highly cost-effective services can be supplied in rural clinics and health centers. Public spending should be so allocated as to ensure sufficient funding for these primary health facilities.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">AGRICULTURAL EXTENSION SERVICES. Agricultural extension and research services are widely considered vital to increasing and sustaining agricultural productivity. Many of these services are being provided by the private sector. but in some countries private services need public support, either because certain markets have not yet been developed or because the infrastructure is poorly developed. However. women farmers and small holders are often not served as effectively by public agricultural extension systems as ate and male farmers (FAO 1993). This disparity stems paltry from expend priorities within agricultural extension services. which concentrate resources on the crops and the technology controlled primarily by male commercial farmers. Reallocating public spending on agricultural extension and research services toward crops and technology raised by or used by small holders and women farmers could yield high social returns to public investment and could increase private returns by improving the skills and productivity of small agricultural producers.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reallocating public spending on agricultural extension  and research services toward crops and technology </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Techniques for small holders and women farmers should take into account the need for quality and cost-effectiveness in public services, Economies of scale can be achieved if extension agents deal with groups of farmers instead of with individuals. This approach also provides a valuable forum for exchanging information. fostering peer learning. sharing expensive equipment. and pooling resources for- credit. Mobile trailing units and flexible hours that fit the crowded schedules of women farmers should also be considered. and more female extension agents should be trained to deal directly with female farmers. Such measures can be introduced without large additional resources if existing expenditures are carefully reallocated.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">INFRASTRUCTURE, Public investment in economic and social infrastructure is vital in facilitated individual and household investment in physical and human capital. However, public expenditures on roads, water supply, and sanitation infrastructure frequently do not meet the needs of those who use the services most heavily. Women are the main users of water services, and it is essential to involve them in designing and implementing water projects. For example. in areas where transport is inadequate and water collection is a daily burden for women and children, the population tends to use the closest available facility rather than the safest one. In such cases. projects that ensure a safe water supply and take into account the specific needs and constraints of the users often have a significant effect on users' health. In two villages in Zaire where a piped water network was installed to provide safe drinking water, the median incidence of diarrhea was halved among children in households located less than a five-minute walk from a public standpipe. Spending allocations that favor public water supply and sanitation improve the general health of the population, save time for women and children. and increase school attendance. A study from Morocco chows that access to tap and well water instead of pond or river water raised school enrollment for both boys and girls (Khandker, Lavy, and Filer 1994).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Women are the main users of water services and it is essential  to involve them in designing and implementing water projects.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Public spending on roads and energy-related facilities (for instance electrification or energy conservation) or other infrastructure is usually assumed to be gander neutral. Yet women and men use these facilities differently The Morocco study cited above found that the availability of electricity increased the rate for girls substantially more than for boys. The study also showed that the presence of a paved road increased by 40 percent the probability that girls would attend school and reduced by 5 percent their probability of dropping out. Overall, improved road conditions increased the probability of school attendance for girls by 32 percent and for boys by 20 percent.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rural electrification can also ease the time constraints on women who must balance household and productive work. Lack of time is often a primary season for women's weak response to economic incentives. especially in rural areas. The case for making public investments in infrastructure would be stronger if gender differences in the use of projects and services, as well as the potential effect of such investment on productivity and social development. were taken into account.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Using Targeting Measures to Narrow the Gender</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">As we have seen. policies that specifically target women or girls can address the needs or this group more efficiently and with greater cost-effectiveness than general policy measures. Female household members tend to allocate resources more directly to children. while men tend to allocate more resources to adults. In households in which resources are not pooled. targeting programs to the household as a where will not necessarily benefit all members equally.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Targeting women directly is justifiable on two grounds. First, to the extent that gender inequalities prevent an economy from realizing its full potential. targeting to women can be an effective strategy for increasing productivity and output Second, where gender differences are wide, targeting may be needed to capture social gains and to increase internal efficiency.</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7>
+<TR><TD></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY">Targeting women is especially when doing so contributes directly to reducing poverty; or when women have particular needs-for example. when maternal mortality is very high. The exceptionally high gender gap in educational enrollments in some countries can be reduced only by policies (including subsidies) that target girls. An obvious example would be policies that affect the private costs of schooling. </P>
+<P ALIGN="JUSTIFY">Female household members tend to allocate resources more  directly to children it while men</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Reducing these direct costs to households Will mean setting new public spending priorities. For example. education institutions for girls especially at the primary level, might be exempted from cost recovery measures. thus increasing the implied public spending subsidy to girls. Similarly. a far; number of publicly funded scholarships can be provided for girls' as has been done in and Guatemala.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Opportunity and travel costs can discourage parents from enrolling especially daughters in school. Some counties have tried to overcome the constraints imposed by opportunity costs by introducing flexible school hours and calendar years and providing child care for younger siblings (box 3.7). In some cases girls who are responsible for looking after their younger brothels and sisters ate allowed to bring them to school.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In countries where cultural values may prevent girls from traveling alone to school. measures are needed that will increase access to safe transport.</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<TABLE BORDER CELLSPACING=1 CELLPADDING=7>
+<TR><TD>
+<B><FONT SIZE=2><P ALIGN="JUSTIFY">Box 3.8 economic reforms and gender targeting in Mongolia</P>
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Since Mongolia began its transition to a market economy in 1990, the living conditions of the population have deteriorated dramatically. According to the government's estimates, a quarter of all Mongolians are now living below the poverty line. Single women with young children are among the "new" vulnerable groups that have emerged in the wake of the transition. As of December 1993 nearly 72 percent of households headed by single persons, usually women, were estimated to have incomes below the poverty line. (About 28 percent of all households in Mongolia are headed by women). The Mongolian Women's Federation reports that the divorce rate is rising among jobless low-income couples, increasing the number of single-parent households. </FONT></TD>
+</TR>
+</TABLE>
+
+<FONT SIZE=2><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Along with job loss women are affected by the decline in services such as day care and maternity homes.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mothers now have to look after their children at home, which restricts their ability to participate in the labor market and, ironically, increases their dependence on welfare. When herds were privatized, priority was given to people who, according to the government, could take better care of the animals. Unfortunately, this policy adversely affected female-headed households.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The maternal mortality rate has doubled over the past three years. in part because many more babies are being delivered at home. Other factors that have contributed to the rising maternal mortality rate include a decrease in the number of ambulances and the need for patients to pay for the food they consume while they are hospitalized.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In Mongolia, targeting female-headed households, pregnant women, and children is essential for reducing poverty. Social assistance, health care. education, and help in finding employment are particularly important (Subbarao and Ezemenari forthcoming).  change the geographic distribution of primary schools, of provide more boarding facilities. Projects in Pakistan are using school mapping techniques to establish criteria for placing new schools in currently underserved areas. Such programs benefit both girls and boys.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It may be necessary to target women when economic reforms of systemic transitions are occurring. For example, in Mongolia, as well as in other countries making the transition from a socialist to a market economy, women are disproportionately represented among the unemployed and otherwise disadvantaged (box 3.8). Thus, in designing safety nets to mitigate the short negative effects or economic transitions. policymakers need to recognize and evaluate the specific adverse effects on women</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">It is not always necessary to restrict a particular program of benefit exclusively to women: the objective can sometimes be achieved indirectly.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Techniques based on self-selection appear to be particularly efficient. In Zambia. where men have a strong preference for cash wages, offering wages in kind (food) attracted more women workers than men to public works programs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the financial sector. women entrepreneurs are enabled to borrow at market rates of interest when banking institutions adopt innovate collateral requirements, reduce transaction costs, and offer small loans at repeated intervals The Grameen Bank in Bangladesh and Badan Kredit Kecaman in Indonesia do not reserve loans for women specifically: instead. they adopt innovative lending policies the result of which is that women snake up the majority of participants-is 96 percent in a new branch of the Grameen Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Involving Beneficiaries in Public Policy</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Until recently. the absence of input from beneficiaries often let's ignorant about how the costs and benefits of policy changes would be distributed among the population Today the views and needs of potential beneficiaries are being taken into account at both the macroeconomic and sectoral levels. This trend should make it possible to determine who benefits. who does not, and why. A good example of a situation in which a beneficiary's point of view can make a significant difference is in public expenditure reviews. Governments with unsustainable budget deficits must make difficult decisions about the allocation of public resources. Their task can of ten be facilitated by suggestions from the potential beneficiaries themselves, since one of the key questions policymakers face is whether investments as presently allocated are reaching the intended populations efficiently and effectively</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Three broad approaches can be used to guarantee that the views of women and other intended beneficiaries are adequately reflected in policy and project formulation. First. surveys and other methods of collecting statistical data can be designed to ensure that gender-desegregated data are properly collected and analyzed. Second, beneficiary assessments, which use a range of qualitative research methods such as direct observation. selected individual of group interviews. and case studies. can be used to ensure that the views of all groups are adequately represented.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A third approach involves a range of participatory planning and management techniques that reflect a significant transfer of control to the community and local levels. Participatory evaluations use innovative research that allow illiterate and otherwise voiceless groups to express their concerns and priorities. Small grants and credits managed at the local level by NGOs or governments agencies permit a community to choose the projects that best reflect its OWN priorities. Social funds. whereby resources are channeled to demand-driven projects, are one such mechanism While these participatory approaches have been implemented primarily at the local level, they are also beginning to be used to involve the community in regional and national planning. Participatory methods, by helping to create local capacity. ensure the sustainability of projects and programs. They also help establish rational criteria for making public investment choices that incorporate both social and efficiency objectives.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Generating and Analyzing Gender-Desegregated Data</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gender-desegregated data and the capacity to analyze these data provide public policymakers with essential information and enhance the dialogue with agents outside government. One of the most valuable instruments for collecting desegregated data is the household survey. which can provide detailed information that is invaluable in policymaking. Obtaining full gender information in many instances entails only a small increase in costs. since the desegregation itself involves little extra work. However additional resources ate often needed to analyze the data and make it useful to policymakers. Public statistical agencies might analyze gender-desegregated information in partnership with private and academic institutions in order to share the costs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">There are several important steps in collecting useful and accurate data. First. in places where gender -desegregated household data have not yet been collected. special efforts should be made to obtain them. At a minimum data on how individuals use health and educational services should be collected routinely as part of national consumption and expenditure surveys. If household consumption. income or production surveys have already been carried out but little or no gender--desegregated data have been collected, the marginal cost of collection is likely to be quite modest-perhaps on the order of 10 percent of total costs.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Participatory methods help establish rational criteria  for making public investment choose that incorporate  both social and efficiency objectives. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Second. in places where basic gender-desegregated data have already been collected, it is important to gather more data from individuals on consumption and. as much as possible. on income and the ownership of assets. Such data ate vital for developing a deeper understanding of how access to and allocation and control of resources are determined within households. More data on men's and women's access to credit and information services, such as agricultural extension programs, are needed for an understanding of women's limited access to important production inputs. The data also indicate the effectiveness of projects and programs in providing such services to women.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Third, there should be an increased emphasis on collecting panel data (thee series) to facilitate snore detailed analyses of changes in household behavior over time. Because full panel surveys are costly, it may be necessary to adopt less-expensive panel methods and combine them with flexible data collection. Anthropological and participatory research methods can be used to enhance the quality and relevance of formal survey questions, as well as to provide a "reality check" on formal survey responses.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Finally, greater priority needs to be given to gender-disaggregated analysis of existing data sets. This analysis should be carried out not only in social sectors such as health and education but also on such issues as the intrahousehold allocation of time and labor and access to and use of productive resources.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Working in Collaboration</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments' ability to identify and implement policies that promote gender equality is greatly enhanced by the active participation of other players from the development community and civil society. These agents include individual women and men, community-based groups, private-for-profit firms, trade unions, non governmental organizations, and multilateral and bilateral agencies. Interaction between public institutions and other actors provides the basis for a more informed policy dialogue on gender issues. It also lays the foundation for operational collaboration and for broadly based support for public policy measures.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Over the past several decades NGOs have become major players in international development. NGOs are by no means homogenous. In the field of development, they range from large volunteer and charity organizations, many of them based in industrial countries, to community-based self-help groups. They also include research institutes, volunteer-sending agencies, religious organizations, professional associations, and lobbying groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">NGOs concerned with gender issues have had a particularly important role in designing and implementing gender programs, especially at the grassroots level, and in advocating policy change at the national level NGOs have been effective in providing information and education to women and in helping community-based women's organizations lobby for change. In many countries collaboration between NGOs and governments is still relatively new. Nonetheless, it is growing rapidly-most visibly in the delivery of social and financial services.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">For example, in Peru a proposed basic health and nutrition project aims to improve the quality and accessibility of health and nutritional services, with an emphasis on poor women and children. NGOs are expected to play a major role in implementing the project and will be responsible for 75 percent of training and research, 40 percent of education, and 20 percent of service delivery (World Bank 1994g). In Africa many HIV/AIDS support programs are managed by NGOs with assistance from governments and funds from international donors.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the long run choices made by private sector agents are profoundly important for the persistence  or reduction of gender inequalities </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">In the financial services sector NGOs have found innovative ways of overcoming barriers that women face in access to credit and savings facilities. Among the better-know programs are the Grameen Bank in Bangladesh, ACCION International in Latin America, and the NGO consortium ACCORD in Africa. NGOs have been very successful in organizing village banks and mobile banking systems to reach the rural poor. These credit programs provide women not only with the funds to finance income-generating activities but also with opportunities to acquire basic business skills and to assume leadership positions within their peer groups.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments also seek to collaborate with a range of institutions from the private sector. In the long run the choices made by private sector agents- whether households, firms, or trade unions-are profoundly important for the persistence or seduction of gender inequalities. Joint public-private sector initiatives can be vital in changing peoples perceptions about the benefits of investing in or hiring women. The private sector has a comparative advantage in providing certain kinds of services to women-for example, vocational education and training. Collaboration with the private sector- often means that public resources can be reallocated to those investments that offer the highest rate of social return. such as basic education and health care.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Strengthening International Policies to Meet New Challenges</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Not all issues that bear on gender equality can be effectively addressed by individual nations. For example, refugee and displaced women and children account for up to 80 percent of the 50 million refugees and displaced persons worldwide. The sheer numbers of refugee and displaced women and children highlight the urgent need to devise international strategies for dealing with this problem.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The sheer numbers of refugee and displaced women and  children (estimated at 4 million) </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The constraints that refugee and displaced women lace are similar to those faced by other women, only magnified many times. They lack access to health services, even though their health risks are high. Girls often have less access to basic education than in their home countries. With little access to family planning, women s fertility rates may be extraordinarily high at a time when the burden of additional children hinders the chances of survival for both mothers and infants. In the absence of professional abortion services, women may rely on self-induced and unsafe abortions. The proportion of female-headed households is highest in refugee situations, yet the women's income-generating activities and skills are minimal</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">The international response to this type of crisis is usually limited to emergency relief measures. Although vital, these measures often fail to recognize the long-term economic and social costs involved in restructuring the lives of displaced women when they return to their home countries. International public policy has an important role in preparing refugee and displaced women for their future role in rebuilding their societies. Long-term repatriation and development on a regional basis along the lines of the International Conference on Central American Refugees (CIREFCA) in Central America is one approach to involving governments, NGOs and development agencies in a coordinated response to refugee problems. Governments and agencies must make every effort to collaborate in making repatriation viable by establishing development programs that explicitly take account of refugees' needs. Otherwise, chances are high that people will once again be forced to leave their countries. putting at risk national reconciliation efforts.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Another area that demands an international response is the establishment of legal conventions for the enforcement of social justice and human rights. Equality under the law creates the legitimacy policymakers and private individuals need to seek change that will increase well-being and encourage economic opportunity. In certain instances, legitimacy needs to be established at the international level. For this reason it is vitally important that governments ratify the Convention on the Elimination of All Forms of Discrimination against Women. This convention. adopted by the United Nations General Assembly in 1979, provides a framework for action by countries to reduce discrimination against women in political and public life, law and education, employment, health care. commerce. and domestic relations. International conventions of this type provide an important policy lever for women's organizations and other groups in civil society.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Conclusions</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This chapter has presented the rationale for public interventions to promote gender equality. Such interventions are needed because of market failures and social externalities that extend beyond the individual household to affect society in general. For resources to be allocated efficiently, public spending should focus on those investments with the highest social returns. Given the evidence of high social and private returns to investments in women's human capital, public expenditures should give priority to the investments that have the largest impact on the welfare of girls and women, especially in basic education and reproductive and other health care services. Policymakers also need to identify areas in which actions can be taken that would have gender neutral outcomes, including sectoral programs addressing transport and infrastructure, water supply. and sanitation</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">BY directing  public resource toward policies and projects  that reduce gender inequality policy markers are promoting  not only equality today but also higher labor productivity </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governments can no longer afford not to invest in women. The evidence on private and social returns to investments in women and girls cannot be ignored. By directing public resources toward policies and projects that reduce gender inequality, policy makers are promoted not only equality today but also higher labor productivity, a higher rate of human capital formation, slower population growth. and stronger economic growth tomorrows However, none of these goals can be reached without the participation of women  themselves. Governments and collaborating institutions must listen carefully to the voices of individual women, to women s groups, and to woman policymakers By working with others to identify and implement policies for greater gander equality, governments can take actions that will make a real difference to the future well-being and prosperity of their people.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">Notes</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1. Birdsall and Sabot (1994) use earlier findings by Barro (1991) to test the relationship between inequality and growth. They find that in Latin America unequal distribution of education. in terms of both quality and quantity, constrained economic growth in the region by reducing opportunities for increasing labor productivity. In East Asia open and relatively equal access to high-quality basic education led to a virtuous circle of high educational performance that stimulated growth and reduced inequality</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">2. Subbarao and Raney (1993) estimate that a doubling of family planning services in 1982 would have reduced the fertility rate from 5.5 to 5 0 and the number of births by 3.5 percent</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">3. The Living Standards Measurement Study (LSMS) is a series of multitopic surveys designed to study multiple aspects of household welfare</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">4. Deforestation is represented by the time required to collect a standard load of fuelwood</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">5. It would be more illuminating to compare wage differences across three categories of women workers: women without children: women with children but with no interruption in employment except for statutory maternity leave: and women with children and with interrupted employment</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">6. Among women workers. 53 percent are in commerce. compared with 33 percent of men. In manufacturing. 16 percent of the workers are men. compared with 14 percent for women. In services, 37 percent are men anti 33 percent are women (World Bank 1995c)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">7. In Bolivia informal moneylenders require borrowers to write postdated checks. If borrowers tail to make timely repayments, these checks are deposited and, as the lender knows will bounce for lack of funds A bounced check is a criminal offense in Bolivia. and the lender can have the borrower arrested The World Bank estimates that about 20 percent of all Bolivian prison inmates-and 40 percent of female inmates imprisoned for 'bouncing' checks and for other collateral-related crimes. In many cases children must live in prison with their mothers (winkler and Guedes, 1995)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">8. The International Conference on Central American Refugees (CIREECA) was held in Guatemala City in May 1989 A total of 126 projects in seven countries were introduced. with an overall investment of $365 million Areas with high densities of returnees were targeted. and special attention was given to projects to support displaced women</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<B><P ALIGN="CENTER"></P>
+<!--
+</Section>
+<Section>
+  <Description>
+    <Metadata name="Title">References</Metadata>
+  </Description>
+-->
+</B><P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agarwal. Bina. 1994. "Gender and Command Over Property: A Critical Gap in Economic Analysis and Policy in South Asia." World/Development 22(10) 22(10): 145578.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Baden. Sally. 1993. "The Impact of Recession and Structural Adjustment on Women's Work in Developing and Developed Countries." Working paper. International Labour Office. Geneva</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bardhan, Kalpana 1993. "Women and Rural Poverty: Some Asian Cases" In M G Quibria, ea., Rural Poverty in Asia Priority Issues and Policy Options. New York: Oxford University Press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bardhan, Pranab. 1988. "Sex Disparity in Child Survival in Rural India In T. Srinivasan and Pranab Bardhan. eds., Rural Poverty in South Asia. New York: Columbia University Press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Barro. Robert 1991 "Economic Growth in a Cross-section of Countries' Journal of Economics 106 (May):407 43.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Beneria. Lourdes. 1992. 'Accounting for Women's Work: The Progress of Two Decades.'' World Id Development 20(11): 1547-60.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bindlish. Vishva. and Robert Evenson. 1993. Evaluation of the Performance of T and V Extension it? Kenya. World Bank Technical Paper 208. Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Binswanger. Hans, and Mark R. Rosenzweig, eds. 1984 Contractual Arrangements Employment and Wages in Rural Labor Markets m Asia. New Haven. Conn.: Yale University Press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Birdsall, Nancy, and Richard Sabot 1994 ''Inequality as a Constraint on Growth Working Paper. Manila: Asian Development Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Blau. Francine. and Lawrence N. Kahn. 1992 " The Gender Earnings Gap: Learning from International Comparisons" America Economic Review 82 (2):533-38.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Bouis Howarth E., and Eileen T. Kennedy. 1989. "Traditional Cash Crop Schemes' Effects on Production, Consumption and Nutrition: Sugarcane in the Philippines and Kenya." Prepared for IFPRI-INCAP Policy Workshop. Antigua. Guatemala</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Chatterjee. Meera 1991. Indication Women Their Health and Productivity World Bank Discussion Paper 109. Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">David, Rosalind 1992 The Effects of Male Out-migration on Women's Management of the Natural Resource Base of the Sahel. SOs International, London.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Donors to African Education. 1994. A Statistical Profile of Education in Sub Saharan Africa in the 1980s. Paris.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Duraiswamy. P. 1992. "Child Survival. Preventive Health Care and Schooling in Rural Households of Tamil Nadu: India." Yale University, New Haven, Conn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Edgerton, V. R. G. W Gardner, Y Ohira. K. A Gunarwardena, and B. Senewiratne 1979 'lron Deficiency Anaemia and Its Effects on Worker Productivity and Activity Patterns' British Medical Journal 2:1546-49.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Einhorn. Barbara. 1993 Citizenship. Gender and Women's Movements in East Cent/al Europe London: Verso</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">FAO (Food and Agriculture Organization) 1993 Rural Poverty Alleviation Polices and Trends Economic and Social Development Paper 113 Rome</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fields, Gary S. 1992 ''Changing Poverty and Inequality in Latin America" Public Finance 47 (Supplement): 59-76.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Folbre. Nancy. 1994. Who Pays for the Kids:' Gender and the Structures of Constraint. London: Routledge</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Fong, Monica 1993. The Role of Women in Rebuilding the Russian Economy. Studies of Economics in Transformation 10 Washington, D.C.: World Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Goetz. Anne Marie. and Rina Sen Gupta. 1994 'Who Takes the Credit'? Gender. Power and Control over Loan Use in Rural Credit Programmes in Bangladesh." Draft University of Sussex, Institute of Development Studies. Brighton, U.K.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hart, Gillian 1986 Power Labor and Livelihood: Processes of Change in Rural Java San Francisco: University of Berkeley Press.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Heise, Lori. 1993 ''Violence Against Women: The Missing Agenda." In Marge Koblinsky. Judith Timyan. and Jill Gay. eds.. The Health of Women A Global</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Perspective Boulder. Colo: Westview</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Heise. Lori. Jacqueline Pitanguy, and Adrienne German. 1994 Violence Against Women The Hidden Health Burden World Bank Discussion Paper 255. Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Herz, Barbara. and Shahidur Khandker. 1991 Women Work Education and Welfare in Peru. World Bank Discussion Paper 116. Washington. D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Herz Barbara, K Subbarao, Masooma Habib. and Laura Raney 1991 Letting Girls Lea/n. Promising Education. World Bank Discussion Paper 1. Washington, D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hoddinot, John, and Lawrence Haddad 1992. Does Female Income Insentience Household Expenditures  Evidence from C&ocirc;te d'Ivoire Trinity College. Oxford University, Oxford. U K</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Holt, Sharon. 1995 Gender and Property Rights: Women and Agrarian Reform in Russia and Moldova.' World Bank, Europe and Central Asia Region, Washington, D C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">&nbsp;</P>
+<P ALIGN="JUSTIFY">Horton, Susan 1994. "Women and Industrialization in Asia" University of Toronto. Institute for Policy Analysis</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Hosken, Fran P., ed 1992. Women's International Network News 18(4).</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">ILO/INSTRAW. 1985. Women in Economic Activity: A Global Statistical Survey 1950-2000 Geneva</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jackson. Cecile 1993 "Doing What Comes Naturally? Women and Environment in Development." World Development 21 (12): 1947-63.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Johansen. Frida 1993 Poverty Reduction in East Asia. World Bank Discussion Paper 203. Washington. D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Jurisman. Clara, and Araceli Moreno. 1990. ''Women, Labour and Crisis: Mexico." Prepared for International Center for Research on Women (ICRW) project on Weathering Economic Crises: Women's Economic Responses to Recession in Latin America and the Caribbean. ICRW, Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kalima Rose. 1992. Where Women are Leaders The Sewa Movement in India. London Zed Press</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Khandker. Shahidur R. and Osman H. Chowdhury 1994 "Targeted Credit Programs and Rural Poverty in Bangladesh." World Bank, Education and Social Policy Department. Washington, D.C. and Bangladesh Institute of Development Studies, Dhaka.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Khandker, Shahidur R. and Baqui Khalily. 1995. "Designing a Sustainable Poverty Alleviation Program: The BRAC Strategy in Bangladesh." World Bank, Education and Social Policy Department. Washington, D.C., and Bangladesh Institute of Development Studies, Dhaka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Khandker, Shahidur R. Baqui Khalily. and Zahed Khan 1993 ''Sustainability of Grameen Bank: What Do We Know ? World Bank. Education and Social Policy Department. Washington. D C, and Bangladesh Institute of Development Studies, Dhaka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Khandker, Shahidur R., Victor Lavy, and D Filmer. 1994. Schooling and Cognitive in World Bank Discussion Paper 264. Washington. </P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kumar, Shubh K. and David Hotchkiss. 1988 Consequences of Deforestation for Women's Time Allocation Agricultural Production and Nutrition in Hill Areas of Nepal International Food Policy Research Institute Research Report 69 Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Kuzoets. Simon. 1955 Economic Growth and Income Inequalities." American Economic Review 45 (March): 1-28.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Lavy, Victor. 1992. Investment in Human Capital Schooling Supply in Rural Ghana Living Standards Measurement Study Working Paper 93 Washington, D C: World Bank.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">MacDonald, Martha. 1994. 'Panel Presentation at the Gender Symposium" World Bank. Poverty and Social Policy Department, Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Manser Marilyn, and Murray Brown 1980 "Marriage and Household Decision making: A Bargaining Analysis " International Economic Review 21:11 44</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">McElroy, Marjorie, and Mary Jean Homey. 1981. "Nash-bargained Household Decisions: Towards a Generalisation of the Theory of Demand" International</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Economic Review 22 (June):333 49</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moock, Peter R 1976 "The Efficiency of Women as Farm Managers: Kenya." American an Journal of Agricultural Economic 58(5):831-35.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Moser, Caroline O. 1992 "Adjustment from Below: Low-income Women, Time and the Triple Role in Guayaquil. Ecuador" In Haleh Ashar and Carolynne Dennis, eds., Women and Adjustment Policies in the Third World. New York: St. Martin Press</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">1994. "Urban Poverty and Social Policy in the Context of Adjustment" World Bank, Urban Development Division, Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Mwabu, Germano. 1994 "Household Composition and Expenditures on Human Capital Inputs in Kenya" Presented at Northeast Universities Development Conference, Economic Growth Center Yale University, New Haven, Conn</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Newell, Andrew and Barry Reilly 1994. "Pine Gender Wage Gap in Russia. ' World Bank, Europe and Central Asia Country Department 3, Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Pitt, Mark, and Shahidur Khandker. 1995 "Household and Intrahousehold Impacts of the Grameen Bank and Similar Targeted Credited Programs in Bangladesh " World Bank, Education and Social Policy Department, Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Population Reference Bureau 1994. The Wood'. Youth 1994 A Special Focus on Reproductive Health Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Psacharopoulos George 1994. "Returns to Investment in Education: A Global Up-date ' World Development 22(9):1325 43</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Psacharopoulos. George, and Zafiris Tzannatos. 1992 Women's Employment and PUN in Latin America Overview and Methodology. A World Bank Regional and Sectoral Study Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Agnes. 1994. ''Improving Women's Agricultural Productivity as Farmers and Workers." Education and Social Policy Department Discussion Paper 37. World Bank, Washington. D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rahrnan. Rushidan I. and Shahidur Khandker 1994 "Role of Targeted Credit Programs in Promoting Employment and Productivity of the Poor in Bangladesh." World Bank, Education and Social Policy Department. Washington, D.C. and Bangladesh Institute of Development Studies. Dhaka</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rhyne, Elisabeth. and Sharon Holt 1994 ''Women in Finance and Enterprise Development'' Education and Social Policy Department Discussion Paper 40. World Bank. Washington, D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Rosenzweig, Mark. and T. Paul Schultz. 1982 'Market Opportunities. Genetic Endowments, and Intrafamily Resource Distribution: Child Survival in Rural India'' American an Economic Review 72:4:803-15.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">. 1987. 'Fertility and Investments in Human Capital: Estimates of the Consequences of Imperfect Fertility Control in Malaysia.' Journal of Econometrics 36: 163-84</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Saito, Katrine, and Daphne Spurlirio 1992 Developing Agricultural Extension to/ Women Farmers World Bank Discussion Paper 156 Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Scales, Ann 1986 "The Emergence of Feminist Jurisprudence'' Yale Law Journal 95(7): 1373-1403.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schuler, Margaret, ed. 1986 Empowerment and the Law Strategies of Third World Women  Washington, D.C.: OEF</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schuler, Margaret. and Sakuntala Kadirgamar-Rajasingilam. eds 1992 Legal Literary. A TOOL for Women's Empowerment New York: United Nations Development Fund for Women (UNIFEM)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Schultz. T. Paul 1988 ''Education Investments and Returns'' In Hollis Chenery and T.R. Srinivasan. eds. Handbook of Development Economics Amsterdam: North land.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sedlacek, Guilhemie, Leah Gutierrez, and Amit Mohindra 1993. "Women in the Labor Market" World Bank. Education and Social Policy Department Washington, D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sen, Amartya 1990 'More Than One Hundred Million Women Are Missing: Women's Survival as a Development Problem." New York Review of Books (December 20):61-66.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Sivard, R L 1985. Women: A World Survey. Washington, D.C.: World Priorities</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Stewart, Sheelagh. 1992. ''Working the System: Sensitizing the Police to the Plight of Women " In Margaret Schuler. ed. Freedom from Violence e: Women Strategies from around the World. New York: United Nations Development Fund for Women (UNIFEM)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Subbarao Kalanidlli. and Kene l Ezemenari Forthcoming "Transition. Poverty and Social Assistance in Mongolia.'' World Bank. Education and Social Policy Department Washington, D C</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Subbarao Kalanidhi. and Laura Raney 1993 Social Gains from Female Education: A Cross-National Stud!. World Bank Discussion Paper 194. Washington! D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Summers, Lawrence H. 1994 Investing in All the People Education Women in Developing Countries ED' Seminar Paper 45 Washington, D.C: World Bank</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Thomas, Duncan 1990a "Household Resources and Child Health in Zimbabwe." Working Paper. Yale University, Economic Grow Center, New Haven, Conn.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">. 1990b Intrahousehold Resource Allocation: An Inferential Approach of Human Resources 25(4):635-64.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">. 1991 Gender Differences in household Resource Allocation. Living Standards Measurement Study Working Paper 79 Washington. D C: World Bank</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">. 1993. "The Distribution of Income and Expenditure within the Household." A Annals of Economics and Statistic 29: 109-35.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tibaijuka, Anna 1994 ''Cost of Differential Gender Roles in African Agriculture: A Case Study of Smallholder Banana-Coffee Fames in the Kagera Region, Tanzania." Journal of Agricultural Economics (U K) 45(1):69-81</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Toubia, Nahid 1993. Female Genital Mutilation: A Call for Global Action. New York: United Nations</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Tzannatos, Zafiris 1995. "Growths, Adjustment, and the Labor Market: Effects on Women Workers." World Bank, Poverty and Social Policy Department, Washington. D.C.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNESCO (United Nations Educational, Scientific, and Cultural Organization). 1991. 1991. Paris</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">. 1993b Trends and Projections of Enrollment by Level of Education by Age and Sex, 1960-2025. Paris</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNICEF (United Nations Children's Fund! 1993. The Progress of Nations. New York</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">UNIDO (United Nations Industrial Development Organization). 1993 11 Women in Manu</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Other Recent Development in Practice Books</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Priorities and Strategies for Education: A World Bank Review (also available in French and Spanish)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Better Urban Services: Finding the Right Incentives (also available in French and Spanish)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Strengthening the Effectiveness of Aid: Lessons for Donors</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Enriching Lives: Overcoming Vitamin and Mineral Malnutrition in Developing Countries (also available in French and Spanish)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">A New Agenda for Women's Health and Nutrition (also available in French)</P>
+<P ALIGN="JUSTIFY">Population and Development: Implications for the World Bank</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">East Asia's Trade and Investment: Regional and Global Gains from Liberalization</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Governance: The World Bank's Experience</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Higher Education: The Lessons of Experience (also available in French and Spanish)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Better Health in Africa: Experience and Lessons Learned (also available in French)</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Argentina's Privatization Program: Experience, Issues, and Lessons Sustaining Rapid Development in East Asia and the Pacific</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">THE WORLD BANK A partner in strengthening economies and expanding markets to improve the quality of life for people everywhere, especially the poorest</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Gender equality is not only a matter of social justice but also good economics. It is of foremost importance to women's wellbeing and development. Discrimination means losses in productivity and lower welfare of women, their families, and society at large.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">Although the gender gap is narrowing in education, health, and many other areas, women are still less educated than men, work more hours, and are paid less. The reasons why gender disparities persist are complex, having to do with social and institutional norms, relationships within households, and even lack of information about the benefits of educating and employing women. Despite the weight of social and cultural factors, public policy can influence women's status and well-being. Governments have a leading role in widening the opportunities available to women and extending the services that are vitally important to them.</P>
+<P ALIGN="JUSTIFY"></P>
+<P ALIGN="JUSTIFY">This report outlines what governments and development agencies can do to work toward greater gender equality- one of the best investments a society can make. Public policy can affect investments in health, education, and infrastructure through laws and regulations. It can also affect land ownership, financial services, and access to employment. Not least important, public  policies can affect macroeconomic performance and create a favorable climate for economic development.</P>
+<P ALIGN="JUSTIFY"></P></FONT>
+<!--
+</Section>
+</Section>
+-->
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/collect/modelcol/etc/collect.cfg
===================================================================
--- /main/tags/2.38/gsdl/collect/modelcol/etc/collect.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/collect/modelcol/etc/collect.cfg	(revision 21083)
@@ -0,0 +1,18 @@
+creator       **creator**
+maintainer    **maintainer**
+public        **public**
+
+indexes        document:text document:Title document:Source
+defaultindex   document:text
+
+**plugins**
+
+classify       AZList -metadata Title
+classify       AZList -metadata Source
+
+collectionmeta collectionname    "**title**"
+collectionmeta iconcollection    ""
+collectionmeta collectionextra   "**about**"
+collectionmeta .document:text    "text"
+collectionmeta .document:Title  "titles"
+collectionmeta .document:Source  "filenames"
Index: /main/tags/2.38/gsdl/config.guess
===================================================================
--- /main/tags/2.38/gsdl/config.guess	(revision 21083)
+++ /main/tags/2.38/gsdl/config.guess	(revision 21083)
@@ -0,0 +1,1298 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-07-12'
+
+# 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@cygnus.com>.
+# Please send patches to <config-patches@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 build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+
+dummy=dummy-$$
+trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script.
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int dummy(){}" > $dummy.c ;
+	for c in cc gcc c89 ; do
+	  ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
+	  if test $? = 0 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	rm -f $dummy.c $dummy.o $dummy.rel ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 1994-08-24)
+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
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# Netbsd (nbsd) targets should (where applicable) match one or
+	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	# Determine the machine/vendor (is the vendor relevant).
+	case "${UNAME_MACHINE}" in
+	    amiga) machine=m68k-unknown ;;
+	    arm32) machine=arm-unknown ;;
+	    atari*) machine=m68k-atari ;;
+	    sun3*) machine=m68k-sun ;;
+	    mac68k) machine=m68k-apple ;;
+	    macppc) machine=powerpc-apple ;;
+	    hp3[0-9][05]) machine=m68k-hp ;;
+	    ibmrt|romp-ibm) machine=romp-ibm ;;
+	    *) machine=${UNAME_MACHINE}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE}" in
+	    i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep __ELF__ >/dev/null
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+	        os=netbsd
+		;;
+	esac
+	# The OS release
+	release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit 0 ;;
+    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
+	.data
+\$Lformat:
+	.byte 37,100,45,37,120,10,0	# "%d-%x\n"
+
+	.text
+	.globl main
+	.align 4
+	.ent main
+main:
+	.frame \$30,16,\$26,0
+	ldgp \$29,0(\$27)
+	.prologue 1
+	.long 0x47e03d80 # implver \$0
+	lda \$2,-1
+	.long 0x47e20c21 # amask \$2,\$1
+	lda \$16,\$Lformat
+	mov \$0,\$17
+	not \$1,\$18
+	jsr \$26,printf
+	ldgp \$29,0(\$26)
+	mov 0,\$16
+	jsr \$26,exit
+	.end main
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
+	if test "$?" = 0 ; then
+		case `./$dummy` in
+			0-0)
+				UNAME_MACHINE="alpha"
+				;;
+			1-0)
+				UNAME_MACHINE="alphaev5"
+				;;
+			1-1)
+				UNAME_MACHINE="alphaev56"
+				;;
+			1-101)
+				UNAME_MACHINE="alphapca56"
+				;;
+			2-303)
+				UNAME_MACHINE="alphaev6"
+				;;
+			2-307)
+				UNAME_MACHINE="alphaev67"
+				;;
+		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-unknown-sysv4
+	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;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit 0;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee@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*: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*:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${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 ;;
+    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
+#include <stdio.h>  /* for printf() prototype */
+	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
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy \
+	  && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+	  && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	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 ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	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
+		eval $set_cc_for_build
+		$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $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:*:[45])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${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=${UNAME_VERSION}.${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 BSD 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:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+              case "${HPUX_REV}" in
+                11.[0-9][0-9])
+                  if [ -x /usr/bin/getconf ]; then
+                    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+                    case "${sc_cpu_version}" in
+                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+                      532)                      # CPU_PA_RISC2_0
+                        case "${sc_kernel_bits}" in
+                          32) HP_ARCH="hppa2.0n" ;;
+                          64) HP_ARCH="hppa2.0w" ;;
+                        esac ;;
+                    esac
+                  fi ;;
+              esac
+              if [ "${HP_ARCH}" = "" ]; then
+              sed 's/^              //' << EOF >$dummy.c
+
+              #define _HPUX_SOURCE
+              #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
+	eval $set_cc_for_build
+	(CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
+	if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
+	rm -f $dummy.c $dummy
+	fi ;;
+	esac
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit 0 ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-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
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $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:*:* | *3000*: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} | sed -e 's/\.[^.]*$/.X/'
+	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/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3D:*:*:*)
+	echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit 0 ;;
+    CRAY-2:*:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    hp300:OpenBSD:*:*)
+	echo m68k-unknown-openbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/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:*:*)
+	echo ${UNAME_MACHINE}-unknown-freebsd`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*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	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 ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit 0 ;;
+    arm*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    mips:Linux:*:*)
+	case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
+	  big)    echo mips-unknown-linux-gnu && exit 0 ;;
+	  little) echo mipsel-unknown-linux-gnu && exit 0 ;;
+	esac
+	;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit 0 ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev67 ;;
+        esac
+	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit 0 ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit 0 ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit 0 ;;
+    x86_64:Linux:*:*)
+	echo x86_64-unknown-linux-gnu
+	exit 0 ;;
+    i*86: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_supported_targets=`cd /; ld --help 2>&1 \
+			 | sed -ne '/supported targets:/!d
+				    s/[ 	][ 	]*/ /g
+				    s/.*supported targets: *//
+				    s/ .*//
+				    p'`
+        case "$ld_supported_targets" in
+	  elf32-i386)
+		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+		;;
+	  a.out-i386-linux)
+		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+		exit 0 ;;		
+	  coff-i386)
+		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+		exit 0 ;;
+	  "")
+		# Either a pre-BFD a.out linker (linux-gnuoldld) or
+		# one that does not give us useful --help.
+		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+		exit 0 ;;
+	esac
+	# Determine whether the default compiler is a.out or elf
+	cat >$dummy.c <<EOF
+#include <features.h>
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	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-pc-linux-gnu\n", argv[1]);
+#  else
+    printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+#  endif
+# else
+   printf ("%s-pc-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+	eval $set_cc_for_build
+	$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
+	rm -f $dummy.c $dummy
+	test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+	;;
+    i*86:DYNIX/ptx:4*:*)
+	# 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.
+	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:[78]*)
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	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 ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit 0 ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+        # 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]??A:*: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.*:* | m68*:LynxOS:3.0*:*)
+	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]*:* | i*86:LynxOS:4.0*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+	echo powerpc-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@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes@openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit 0 ;;
+    *:*:*:FTX*)
+	# From seanf@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 ;;
+    *:Darwin:*:*)
+	echo `uname -p`-apple-darwin${UNAME_RELEASE}
+	exit 0 ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	if test "${UNAME_MACHINE}" = "x86pc"; then
+		UNAME_MACHINE=pc
+	fi
+	echo `uname -p`-${UNAME_MACHINE}-nto-qnx
+	exit 0 ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit 0 ;;
+    NSR-[KW]:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit 0 ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit 0 ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit 0 ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit 0 ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit 0 ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit 0 ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit 0 ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit 0 ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	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)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# 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
+
+eval $set_cc_for_build
+$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $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
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.38/gsdl/config.h.in
===================================================================
--- /main/tags/2.38/gsdl/config.h.in	(revision 21083)
+++ /main/tags/2.38/gsdl/config.h.in	(revision 21083)
@@ -0,0 +1,208 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+#ifndef _GSDL_CONFIG_H
+#define _GSDL_CONFIG_H
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* 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 don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+#undef _POSIX_1_SOURCE
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* 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 you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+/* Define if you don't want to use long long's with GCC */
+#undef DISABLE_LONG_LONG
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
+
+/* Define FASTCGI if needsbe */
+#undef USE_FASTCGI
+
+/* Define USE_CORBA if needsbe */
+#undef USE_CORBA
+
+/* Define MICO_DIR if needsbe */
+#undef MICO_DIR
+
+/* Define MICO_VERSION if required */
+#undef MICO_VERSION
+
+/* Define if you have the ftime function.  */
+#undef HAVE_FTIME
+
+/* Define if you have the ftruncate function.  */
+#undef HAVE_FTRUNCATE
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the getrusage function.  */
+#undef HAVE_GETRUSAGE
+
+/* Define if you have the mallinfo function.  */
+#undef HAVE_MALLINFO
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the setbuffer function.  */
+#undef HAVE_SETBUFFER
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+/* Define if you have the strftime function.  */
+#undef HAVE_STRFTIME
+
+/* Define if you have the strstr function.  */
+#undef HAVE_STRSTR
+
+/* Define if you have the strtol function.  */
+#undef HAVE_STRTOL
+
+/* Define if you have the times function.  */
+#undef HAVE_TIMES
+
+/* Define if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define if you have the <crypt.h> header file.  */
+#undef HAVE_CRYPT_H
+
+/* Define if you have the <dirent.h> header file.  */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <memory.h> header file.  */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <ndir.h> header file.  */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/dir.h> header file.  */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/ndir.h> header file.  */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/procfs.h> header file.  */
+#undef HAVE_SYS_PROCFS_H
+
+/* Define if you have the <sys/time.h> header file.  */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the crypt library (-lcrypt).  */
+#undef HAVE_LIBCRYPT
+
+/* Define if you have the g library (-lg).  */
+#undef HAVE_LIBG
+
+/* Define if you have the gdbm library (-lgdbm).  */
+#undef HAVE_LIBGDBM
+
+/* Define if you have the m library (-lm).  */
+#undef HAVE_LIBM
+
+/* Define if you have the stdc++ library (-lstdc++).  */
+#undef HAVE_LIBSTDC__
+
+#endif /* _GSDL_CONFIG_H */
Index: /main/tags/2.38/gsdl/config.sub
===================================================================
--- /main/tags/2.38/gsdl/config.sub	(revision 21083)
+++ /main/tags/2.38/gsdl/config.sub	(revision 21083)
@@ -0,0 +1,1375 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+#   Free Software Foundation, Inc.
+
+timestamp='2001-06-08'
+
+# 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.
+
+# Please send patches to <config-patches@gnu.org>.
+#
+# 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.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches@gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+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
+  nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
+    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 | -axis)
+		os=
+		basic_machine=$1
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+ 	-chorusrdb)
+ 		os=-chorusrdb
+		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] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \
+		| pyramid | mn10200 | mn10300 | tron | a29k \
+		| 580 | i960 | h8300 \
+		| x86 | ppcbe | mipsbe | mipsle | shbe | shle \
+		| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
+		| hppa64 \
+		| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
+		| alphaev6[78] \
+		| we32k | ns16k | clipper | i370 | sh | sh[34] \
+		| powerpc | powerpcle \
+		| 1750a | dsp16xx | pdp10 | pdp11 \
+		| mips16 | mips64 | mipsel | mips64el \
+		| mips64orion | mips64orionel | mipstx39 | mipstx39el \
+		| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
+		| mips64vr5000 | mips64vr5000el | mcore | s390 | s390x \
+		| sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \
+		| v850 | c4x \
+		| thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \
+		| pj | pjl | h8500 | z8k)
+		basic_machine=$basic_machine-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12)
+		# Motorola 68HC11/12.
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+
+	# 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*86 | x86_64)
+	  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*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
+	      | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \
+	      | arm-*  | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+	      | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
+	      | xmp-* | ymp-* \
+	      | x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \
+	      | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
+	      | hppa2.0n-* | hppa64-* \
+	      | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
+	      | alphaev6[78]-* \
+	      | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
+	      | clipper-* | orion-* \
+	      | sparclite-* | pdp10-* | pdp11-* | sh-* | sh[34]-* | sh[34]eb-* \
+	      | powerpc-* | powerpcle-* | sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \
+	      | mips16-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* \
+	      | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
+	      | mipstx39-* | mipstx39el-* | mcore-* \
+	      | f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \
+	      | [cjt]90-* \
+	      | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
+	      | thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \
+	      | bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*)
+		;;
+	# 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-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		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
+		;;
+	[cjt]90)
+		basic_machine=${basic_machine}-cray
+		os=-unicos
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	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
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	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*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*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
+		;;
+	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
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	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
+		;;
+	mmix*)
+		basic_machine=mmix-knuth
+		os=-mmixware
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	msdos)
+		basic_machine=i386-pc
+		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
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	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 | nexgen)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2)
+		basic_machine=i686-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-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
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	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
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=t3e-cray
+		os=-unicos
+		;;
+	tic54x | c54x*)
+		basic_machine=tic54x-unknown
+		os=-coff
+		;;
+	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
+		;;
+	windows32)
+		basic_machine=i386-pc
+		os=-windows32-msvcrt
+		;;
+	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
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh3 | sh4)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv9 | sparcv9b)
+		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
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		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* \
+	      | -chorusos* | -chorusrdb* \
+	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto*)
+		os=-nto-qnx
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -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
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-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
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-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[0-9]* | -*MiNT | -MiNT[0-9]*)
+	        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
+		;;
+	pdp10-*)
+		os=-tops20
+		;;
+        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
+		;;
+	f30[01]-fujitsu | f700-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[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
Index: /main/tags/2.38/gsdl/configtest.pl
===================================================================
--- /main/tags/2.38/gsdl/configtest.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/configtest.pl	(revision 21083)
@@ -0,0 +1,1 @@
+print $]
Index: /main/tags/2.38/gsdl/configure
===================================================================
--- /main/tags/2.38/gsdl/configure	(revision 21083)
+++ /main/tags/2.38/gsdl/configure	(revision 21083)
@@ -0,0 +1,3943 @@
+#! /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
+  --enable-corba          Enable CORBA support"
+ac_help="$ac_help
+  --with-micodir          Use installed MICO directory"
+ac_help="$ac_help
+  --enable-z3950          Enable Z39.50 client support"
+ac_help="$ac_help
+  --with-gdbm=dir         Use local gdbm library and headers"
+ac_help="$ac_help
+  --with-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz"
+ac_help="$ac_help
+  --with-regex            use older regex in lieu of GNU rx for matching"
+
+# 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=lib/text_t.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@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
+
+
+
+
+PACKAGE=gsdl
+VERSION=2.1
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+
+USE_FASTCGI=0
+if test USE_FASTCGI = 1; then
+cat >> confdefs.h <<\EOF
+#define USE_FASTCGI 1
+EOF
+
+
+fi
+
+# Check whether --enable-corba or --disable-corba was given.
+if test "${enable_corba+set}" = set; then
+  enableval="$enable_corba"
+  USE_CORBA=1
+else
+  USE_CORBA=0
+fi
+
+cat >> confdefs.h <<EOF
+#define USE_CORBA $USE_CORBA
+EOF
+
+
+
+# Check whether --with-micodir or --without-micodir was given.
+if test "${with_micodir+set}" = set; then
+  withval="$with_micodir"
+  MICO_DIR=$enableval
+else
+  MICO_DIR="default"
+fi
+
+cat >> confdefs.h <<EOF
+#define MICO_DIR "$MICO_DIR"
+EOF
+
+
+
+# Check whether --enable-z3950 or --disable-z3950 was given.
+if test "${enable_z3950+set}" = set; then
+  enableval="$enable_z3950"
+  USE_Z3950=1
+else
+  USE_Z3950=0
+fi
+
+if test USE_Z3950 = 1; then
+cat >> confdefs.h <<\EOF
+#define USE_Z3950 $USE_Z3950
+EOF
+
+
+fi
+
+# Check whether --with-gdbm or --without-gdbm was given.
+if test "${with_gdbm+set}" = set; then
+  withval="$with_gdbm"
+  gdbmdir=$withval
+fi
+
+
+LDFLAGS=
+if test -z "$CFLAGS"; then
+CFLAGS=-O2
+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:622: 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:652: 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:703: 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:735: 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 746 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:751: \"$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:777: 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:782: 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:791: \"$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:810: 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
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
+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:846: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+  echo "$ac_t""$CXX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:878: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 889 "configure"
+#include "confdefs.h"
+
+int main(){return(0);}
+EOF
+if { (eval echo configure:894: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cxx_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_cxx_cross=no
+  else
+    ac_cv_prog_cxx_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cxx_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_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_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 ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:920: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:925: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.C <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:934: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gxx=yes
+else
+  ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+
+ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ac_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS=
+echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:953: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+  ac_cv_prog_cxx_g=yes
+else
+  ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS="$ac_save_CXXFLAGS"
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+
+for ac_declaration in \
+   ''\
+   '#include <stdlib.h>' \
+   'extern "C" void std::exit (int) throw (); using std::exit;' \
+   'extern "C" void std::exit (int); using std::exit;' \
+   'extern "C" void exit (int) throw ();' \
+   'extern "C" void exit (int);' \
+   'void exit (int);'
+do
+  cat > conftest.$ac_ext <<EOF
+#line 994 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int main() {
+exit (42);
+; return 0; }
+EOF
+if { (eval echo configure:1002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  continue
+fi
+rm -f conftest*
+  cat > conftest.$ac_ext <<EOF
+#line 1012 "configure"
+#include "confdefs.h"
+$ac_declaration
+int main() {
+exit (42);
+; return 0; }
+EOF
+if { (eval echo configure:1019: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+if test -n "$ac_declaration"; then
+  echo '#ifdef __cplusplus' >>confdefs.h
+  echo $ac_declaration      >>confdefs.h
+  echo '#endif'             >>confdefs.h
+fi
+
+
+for ac_prog in gawk mawk nawk awk
+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:1040: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+for ac_prog in 'bison -y' byacc
+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:1074: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # 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_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+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:1151: 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:1172: 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:1190: 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:1224: 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 ln -s works""... $ac_c" 1>&6
+echo "configure:1277: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+  rm -f conftestdata
+  ac_cv_prog_LN_S="ln -s"
+else
+  ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1298: 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
+
+# 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:1327: 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
+
+
+#moved CORBA MICO directory test to get version of MICO
+if test $USE_CORBA = 1; then
+
+if test $MICO_DIR = "default"; then
+#do something
+MICO_INC="-I packages/mico/mico/include"
+else
+#build the micotest program
+MICO_INC= ""
+if test $MICO_DIR != yes; then
+MICO_INC="-I $MICO_DIR"
+fi
+fi
+
+#get MICO_VER value
+sh -c "$CC -c micotest.cpp -o micotest.o $MICO_INC 2>&1" > /dev/null
+sh -c "$CC -o micotest micotest.o -lstdc++ 2>&1" > /dev/null
+MICO_VER=`./micotest` || MICO_VER=2.3.5
+sh -c "rm micotest"
+sh -c "rm micotest.o"
+
+#do test of MICO_VER
+if test MICO_VER != 0; then
+cat >> confdefs.h <<\EOF
+#define MICO_VER 1
+EOF
+
+
+fi
+#end USE_CORBA test
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1388: 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 1403 "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:1409: \"$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 1420 "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:1426: \"$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 1437 "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:1443: \"$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 AIX""... $ac_c" 1>&6
+echo "configure:1468: checking for AIX" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1470 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6
+fi
+rm -f conftest*
+
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1492: 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
+
+ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6
+echo "configure:1514: checking for minix/config.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 1519 "configure"
+#include "confdefs.h"
+#include <minix/config.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1524: \"$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
+  MINIX=yes
+else
+  echo "$ac_t""no" 1>&6
+MINIX=
+fi
+
+if test "$MINIX" = yes; then
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _POSIX_1_SOURCE 2
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _MINIX 1
+EOF
+
+fi
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1562: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 1578 "configure"
+#include "confdefs.h"
+#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+
+int main() {
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+; return 0; }
+EOF
+if { (eval echo configure:1590: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_prog_cc_stdc="$ac_arg"; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_stdc" 1>&6
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+
+echo $ac_n "checking for function prototypes""... $ac_c" 1>&6
+echo "configure:1611: checking for function prototypes" >&5
+if test "$ac_cv_prog_cc_stdc" != no; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define PROTOTYPES 1
+EOF
+
+  U= ANSI2KNR=
+else
+  echo "$ac_t""no" 1>&6
+  U=_ ANSI2KNR=ansi2knr
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1625: 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 1630 "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:1679: \"$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 ANSI C header files""... $ac_c" 1>&6
+echo "configure:1700: 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 1705 "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:1713: \"$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 1730 "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 1748 "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 1769 "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:1780: \"$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
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1804: 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 1809 "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:1837: 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 1842 "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
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:1870: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1875 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:1884: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_time=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
+echo "configure:1905: checking whether struct tm is in sys/time.h or time.h" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1910 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <time.h>
+int main() {
+struct tm *tp; tp->tm_sec;
+; return 0; }
+EOF
+if { (eval echo configure:1918: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm=time.h
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm" 1>&6
+if test $ac_cv_struct_tm = sys/time.h; then
+  cat >> confdefs.h <<\EOF
+#define TM_IN_SYS_TIME 1
+EOF
+
+fi
+
+
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+cat > conftest.$ac_ext <<EOF
+#line 1941 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+
+int main() {
+ FILE *rubbish = popen("yes", "r"); 
+; return 0; }
+EOF
+if { (eval echo configure:1949: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'
+fi
+rm -f conftest*
+fi
+
+
+echo $ac_n "checking for main in -lg""... $ac_c" 1>&6
+echo "configure:1962: checking for main in -lg" >&5
+ac_lib_var=`echo g'_'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="-lg  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1970 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1977: \"$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 g | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lg $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for main in -lgdbm""... $ac_c" 1>&6
+echo "configure:2005: checking for main in -lgdbm" >&5
+ac_lib_var=`echo gdbm'_'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="-lgdbm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2013 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2020: \"$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 gdbm | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lgdbm $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:2048: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'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="-lm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2056 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2063: \"$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
+
+echo $ac_n "checking for main in -lstdc++""... $ac_c" 1>&6
+echo "configure:2091: checking for main in -lstdc++" >&5
+ac_lib_var=`echo stdc++'_'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="-lstdc++  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2099 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2106: \"$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 stdc++ | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lstdc++ $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for main in -lcrypt""... $ac_c" 1>&6
+echo "configure:2134: checking for main in -lcrypt" >&5
+ac_lib_var=`echo crypt'_'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="-lcrypt  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2142 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2149: \"$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 crypt | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lcrypt $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:2183: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2188 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:2196: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$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
+ ac_header_dirent=$ac_hdr; break
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:2221: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | 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="-ldir  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2229 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:2240: \"$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 -ldir"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:2262: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | 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="-lx  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2270 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:2281: \"$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 -lx"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:2304: 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 2309 "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:2317: \"$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 2334 "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 2352 "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 2373 "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:2384: \"$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
+
+for ac_hdr in fcntl.h limits.h sys/time.h unistd.h crypt.h string.h memory.h sys/procfs.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2411: 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 2416 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2421: \"$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
+
+cat > conftest.$ac_ext <<EOF
+#line 2448 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fread" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FREAD_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2463 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fgetc" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FGETC_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2478 "configure"
+#include "confdefs.h"
+#include <sys/procfs.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "pr_brksize" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_PR_BRKSIZE 1
+EOF
+
+fi
+rm -f conftest*
+
+
+# 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:2496: 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 2501 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2508: \"$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:2529: 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 2534 "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:2562: \"$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:2594: 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 2599 "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:2624: 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 2629 "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:2652: \"$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:2679: 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 2687 "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:2706: \"$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
+
+if test $ac_cv_prog_gcc = yes; then
+    echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:2729: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat > conftest.$ac_ext <<EOF
+#line 2735 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+else
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat > conftest.$ac_ext <<EOF
+#line 2753 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+  fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:2775: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2780 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:2797: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+echo "configure:2816: checking for vprintf" >&5
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2821 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char vprintf(); 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 vprintf();
+
+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_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2844: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+echo "configure:2868: checking for _doprnt" >&5
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2873 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt(); 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 _doprnt();
+
+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__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+for ac_func in ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize strerror
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2923: 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 2928 "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:2951: \"$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 ftruncate strstr strcasecmp
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2978: 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 2983 "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:3006: \"$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
+
+
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+echo $ac_n "checking for HP-UX needing gmalloc""... $ac_c" 1>&6
+echo "configure:3037: checking for HP-UX needing gmalloc" >&5
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  echo "$ac_t""yes" 1>&6
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  cat >> confdefs.h <<\EOF
+#define HAVE_VALLOC 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+  for ac_func in valloc
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3050: 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 3055 "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:3078: \"$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
+
+echo $ac_n "checking if malloc debugging is wanted""... $ac_c" 1>&6
+echo "configure:3105: checking if malloc debugging is wanted" >&5
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  if test "$withval" = yes; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_DMALLOC 1
+EOF
+
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  echo "$ac_t""no" 1>&6
+fi
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking which of rx or regex is wanted""... $ac_c" 1>&6
+echo "configure:3126: checking which of rx or regex is wanted" >&5
+# Check whether --with-regex or --without-regex was given.
+if test "${with_regex+set}" = set; then
+  withval="$with_regex"
+  if test "$withval" = yes; then
+  ac_with_regex=1
+  echo "$ac_t""regex" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_REGEX 1
+EOF
+
+  LIBOBJS="$LIBOBJS regex.o"
+fi
+fi
+
+if test -z "$ac_with_regex"; then
+  echo "$ac_t""rx" 1>&6
+  echo $ac_n "checking for re_rx_search""... $ac_c" 1>&6
+echo "configure:3144: checking for re_rx_search" >&5
+if eval "test \"`echo '$''{'ac_cv_func_re_rx_search'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3149 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char re_rx_search(); 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 re_rx_search();
+
+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_re_rx_search) || defined (__stub___re_rx_search)
+choke me
+#else
+re_rx_search();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3172: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'re_rx_search`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS rx.o"
+fi
+
+fi
+
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+
+# ---------------------------------------------------------------------------
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+
+
+echo $ac_n "checking that the GDBM library is available""... $ac_c" 1>&6
+echo "configure:3213: checking that the GDBM library is available" >&5
+if test ! -z "$gdbmdir" ; then
+  # look in given directory for header file
+  if test -r $gdbmdir/include/gdbm.h ; then
+    GDBM_INCLUDE="-I$gdbmdir/include" ;
+  elif test -r $gdbmdir/gdbm.h ; then
+    GDBM_INCLUDE="-I$gdbmdir" ;
+  fi
+
+  # look in given directory for library
+  if test -r $gdbmdir/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir" ;
+  elif test -r $gdbmdir/lib/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir/lib" ;
+  elif test -r $gdbmdir/.libs/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir/.libs" ;
+  fi
+
+  if test ! -z "$GDBM_LIBPATH" -a ! -z "$GDBM_INCLUDE" ; then
+    echo "$ac_t""$gdbmdir" 1>&6 ;
+  else
+    echo "$ac_t""can't find gdbm.h and libgdbm.a in $gdbmdir" 1>&6;
+    echo $ac_n "checking looking for GDBM library in default locations""... $ac_c" 1>&6
+echo "configure:3236: checking looking for GDBM library in default locations" >&5
+  fi
+fi
+
+# look in default path and in /usr/local
+if test -z "$GDBM_INCLUDE" ; then
+  # try in system directory 
+  cat > conftest.$ac_ext <<EOF
+#line 3244 "configure"
+#include "confdefs.h"
+#include <gdbm.h>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3252: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  success=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  success=no
+  
+fi
+rm -f conftest*
+
+  if test $success = "no"; then
+# last chance - look in /usr/local (eg FreeBSD)
+    GDBM_LIBPATH=-L/usr/local/lib
+    GDBM_INCLUDE=-I/usr/local/include
+    ac_save_CXXFLAGS="$CXXFLAGS"
+    ac_save_LIBS="$LIBS"
+      CXXFLAGS="$CXXFLAGS -I/usr/local/include"
+      LIBS="$LIBS -L/usr/local/lib -lgdbm"
+      cat > conftest.$ac_ext <<EOF
+#line 3273 "configure"
+#include "confdefs.h"
+#include <gdbm.h>
+#include <stdio.h>
+	
+int main() {
+printf("%s",gdbm_version);
+; return 0; }
+EOF
+if { (eval echo configure:3282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  success=/usr/local
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  success=no
+      
+fi
+rm -f conftest*
+      CXXFLAGS=$ac_save_CXXFLAGS
+      LIBS=$ac_save_LIBS
+  fi
+
+  echo "$ac_t""$success" 1>&6
+  if test $success = "no"; then
+  { echo "configure: error: GDBM Library not available - cannot install" 1>&2; exit 1; }
+  fi
+fi
+cat >> confdefs.h <<\EOF
+#define HAVE_LIBGDBM  1
+EOF
+
+
+
+
+
+echo $ac_n "checking that Perl 5 is available""... $ac_c" 1>&6
+echo "configure:3311: checking that Perl 5 is available" >&5
+success="no"
+pl_path="$PATH"
+IFS="${IFS=   }"; pl_save_ifs="$IFS"; IFS=":"
+for pl_dir in $pl_path; do
+  test -z "$pl_dir" && pl_dir=.
+  if test -x $pl_dir/perl; then
+    success="yes"
+    break
+  fi
+done
+IFS="$pl_save_ifs"
+
+if test $success = "yes"; then
+try=`perl configtest.pl` || try="0"
+try=`expr $try \> 5.000`
+if test $try = "1"; then
+echo "$ac_t"""yes"" 1>&6
+else
+success="no"
+fi
+fi
+
+if test $success = "no"; then
+echo "$ac_t"""no"" 1>&6
+{ echo "configure: error: "Perl 5 not available - cannot install"" 1>&2; exit 1; }
+fi
+
+success=no
+echo $ac_n "checking "whether STL library has known faults"""... $ac_c" 1>&6
+echo "configure:3341: checking "whether STL library has known faults"" >&5
+
+cat > conftest.$ac_ext <<EOF
+#line 3344 "configure"
+#include "confdefs.h"
+#include <vector>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3352: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  success=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+
+if test $success = "no"; then
+cat > conftest.$ac_ext <<EOF
+#line 3363 "configure"
+#include "confdefs.h"
+#include <vector.h>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3371: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  success="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+fi
+
+if test $success = "no"; then
+cat > conftest.$ac_ext <<EOF
+#line 3383 "configure"
+#include "confdefs.h"
+#include <ospace\\std\\vector>
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3391: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  success="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+fi
+
+if test $success = yes; then
+echo "$ac_t"""no"" 1>&6
+else
+echo "$ac_t"""yes"" 1>&6
+{ echo "configure: error: "STL Broken - Obtain newer version of GNU C Compiler"" 1>&2; exit 1; }
+fi
+
+gsdlos=`uname | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+# check for running bash under cygwin
+ if test "`echo $gsdlos | sed 's/cygwin//'`" != "$gsdlos" ;
+ then
+  gsdlos=windows
+ fi
+
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+# ---------------------------------------------------------------------------
+
+moduleDirs=""
+MODULEDIRS=""
+for x in `find modules -mindepth 1 -maxdepth 2`; do
+  if test -d "$x"; then
+    d="$x/Makefile.in"
+    if test -e "$d"; then
+      moduleDirs="$moduleDirs $x/Makefile"
+      MODULEDIRS="$MODULEDIRS $x"
+    fi
+  fi
+done
+echo "Making$moduleDirs in modules directory"
+
+
+# ---------------------------------------------------------------------------
+ac_configure_args="$ac_configure_args --host=$host --target=$target"
+subdirs="packages"
+
+
+# the list of folders in the src folder
+srclist="src/mgpp/lib/Makefile src/mgpp/text/Makefile src/mgpp/Makefile \
+          src/hashfile/Makefile src/colservr/Makefile src/recpt/Makefile src/txt2db/Makefile \
+          src/db2txt/Makefile src/getpw/Makefile src/phind/generate/Makefile"
+
+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 "packages/Makefile packages/mg/Makefile packages/mg/src/text/Makefile packages/mg/src/images/Makefile 
+          packages/mg/src/scripts/Makefile packages/mg/lib/Makefile
+	  lib/Makefile Makefile $srclist $moduleDirs 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%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@USE_FASTCGI@%$USE_FASTCGI%g
+s%@USE_CORBA@%$USE_CORBA%g
+s%@MICO_DIR@%$MICO_DIR%g
+s%@USE_Z3950@%$USE_Z3950%g
+s%@CC@%$CC%g
+s%@CXX@%$CXX%g
+s%@AWK@%$AWK%g
+s%@YACC@%$YACC%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%@LN_S@%$LN_S%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@RANLIB@%$RANLIB%g
+s%@MICO_VER@%$MICO_VER%g
+s%@CPP@%$CPP%g
+s%@U@%$U%g
+s%@ANSI2KNR@%$ANSI2KNR%g
+s%@ALLOCA@%$ALLOCA%g
+s%@LIBOBJS@%$LIBOBJS%g
+s%@GDBM_LIBPATH@%$GDBM_LIBPATH%g
+s%@GDBM_INCLUDE@%$GDBM_INCLUDE%g
+s%@gsdlos@%$gsdlos%g
+s%@MODULEDIRS@%$MODULEDIRS%g
+s%@subdirs@%$subdirs%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-"packages/Makefile packages/mg/Makefile packages/mg/src/text/Makefile packages/mg/src/images/Makefile 
+          packages/mg/src/scripts/Makefile packages/mg/lib/Makefile
+	  lib/Makefile Makefile $srclist $moduleDirs"}
+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
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+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
+
+if test "$no_recursion" != yes; then
+
+  # Remove --cache-file and --srcdir arguments so they do not pile up.
+  ac_sub_configure_args=
+  ac_prev=
+  for ac_arg in $ac_configure_args; do
+    if test -n "$ac_prev"; then
+      ac_prev=
+      continue
+    fi
+    case "$ac_arg" in
+    -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=*)
+      ;;
+    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+      ac_prev=srcdir ;;
+    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+      ;;
+    *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+    esac
+  done
+
+  for ac_config_dir in packages; do
+
+    # Do not complain, so a configure script can configure whichever
+    # parts of a large source tree are present.
+    if test ! -d $srcdir/$ac_config_dir; then
+      continue
+    fi
+
+    echo configuring in $ac_config_dir
+
+    case "$srcdir" in
+    .) ;;
+    *)
+      if test -d ./$ac_config_dir || mkdir ./$ac_config_dir; then :;
+      else
+        { echo "configure: error: can not create `pwd`/$ac_config_dir" 1>&2; exit 1; }
+      fi
+      ;;
+    esac
+
+    ac_popdir=`pwd`
+    cd $ac_config_dir
+
+      # A "../" for each directory in /$ac_config_dir.
+      ac_dots=`echo $ac_config_dir|sed -e 's%^\./%%' -e 's%[^/]$%&/%' -e 's%[^/]*/%../%g'`
+
+    case "$srcdir" in
+    .) # No --srcdir option.  We are building in place.
+      ac_sub_srcdir=$srcdir ;;
+    /*) # Absolute path.
+      ac_sub_srcdir=$srcdir/$ac_config_dir ;;
+    *) # Relative path.
+      ac_sub_srcdir=$ac_dots$srcdir/$ac_config_dir ;;
+    esac
+
+    # Check for guested configure; otherwise get Cygnus style configure.
+    if test -f $ac_sub_srcdir/configure; then
+      ac_sub_configure=$ac_sub_srcdir/configure
+    elif test -f $ac_sub_srcdir/configure.in; then
+      ac_sub_configure=$ac_configure
+    else
+      echo "configure: warning: no configuration information is in $ac_config_dir" 1>&2
+      ac_sub_configure=
+    fi
+
+    # The recursion is here.
+    if test -n "$ac_sub_configure"; then
+
+      # Make the cache file name correct relative to the subdirectory.
+      case "$cache_file" in
+      /*) ac_sub_cache_file=$cache_file ;;
+      *) # Relative path.
+        ac_sub_cache_file="$ac_dots$cache_file" ;;
+      esac
+  case "$ac_given_INSTALL" in
+        [/$]*) INSTALL="$ac_given_INSTALL" ;;
+        *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+        esac
+
+      echo "running ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir"
+      # The eval makes quoting arguments work.
+      if eval ${CONFIG_SHELL-/bin/sh} $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_sub_srcdir
+      then :
+      else
+        { echo "configure: error: $ac_sub_configure failed for $ac_config_dir" 1>&2; exit 1; }
+      fi
+    fi
+
+    cd $ac_popdir
+  done
+fi
+
+#AC_OUTPUT($srclist)
+
+
Index: /main/tags/2.38/gsdl/configure.in
===================================================================
--- /main/tags/2.38/gsdl/configure.in	(revision 21083)
+++ /main/tags/2.38/gsdl/configure.in	(revision 21083)
@@ -0,0 +1,387 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(lib/text_t.h)
+AC_CONFIG_HEADER(config.h)
+
+PACKAGE=gsdl
+VERSION=2.1
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+dnl
+dnl Set use of fast cgi
+dnl
+USE_FASTCGI=0
+if test USE_FASTCGI = 1; then
+AC_DEFINE(USE_FASTCGI)
+AC_SUBST(USE_FASTCGI)
+fi
+
+dnl
+dnl Set use of corba
+dnl
+AC_ARG_ENABLE(corba, [  --enable-corba          Enable CORBA support], USE_CORBA=1, USE_CORBA=0)
+AC_DEFINE_UNQUOTED(USE_CORBA, $USE_CORBA)
+AC_SUBST(USE_CORBA)
+
+AC_ARG_WITH(micodir, [  --with-micodir          Use installed MICO directory], MICO_DIR=$enableval, MICO_DIR="default")
+AC_DEFINE_UNQUOTED(MICO_DIR, "$MICO_DIR")
+AC_SUBST(MICO_DIR)
+
+dnl
+dnl Set use of z39.50
+dnl
+AC_ARG_ENABLE(z3950, [  --enable-z3950          Enable Z39.50 client support], USE_Z3950=1, USE_Z3950=0)
+if test USE_Z3950 = 1; then
+AC_DEFINE(USE_Z3950, $USE_Z3950)
+AC_SUBST(USE_Z3950)
+fi
+
+dnl
+dnl look for libgdbm if not in standard location
+dnl
+AC_ARG_WITH(gdbm, [  --with-gdbm=dir         Use local gdbm library and headers], gdbmdir=$withval)
+
+dnl Checks for programs.
+LDFLAGS=
+dnl only set CFLAGS if not already set in environment
+if test -z "$CFLAGS"; then
+CFLAGS=-O2
+fi
+AC_SUBST(CFLAGS)
+
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_AWK
+AC_PROG_YACC
+dnl get $target_cpu, $target_vendor, and $target_os
+dnl (as well as host_*)
+AC_CANONICAL_SYSTEM
+dnl do we actually want this? It adds a prefix based on host, system etc
+dnl AC_ARG_PROGRAM
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+
+#moved CORBA MICO directory test to get version of MICO
+if test $USE_CORBA = 1; then
+
+if test $MICO_DIR = "default"; then
+#do something
+MICO_INC="-I packages/mico/mico/include"
+else
+#build the micotest program
+MICO_INC= ""
+if test $MICO_DIR != yes; then
+MICO_INC="-I $MICO_DIR"
+fi
+fi
+
+#get MICO_VER value
+sh -c "$CC -c micotest.cpp -o micotest.o $MICO_INC 2>&1" > /dev/null
+sh -c "$CC -o micotest micotest.o -lstdc++ 2>&1" > /dev/null
+MICO_VER=`./micotest` || MICO_VER=2.3.5
+sh -c "rm micotest"
+sh -c "rm micotest.o"
+
+#do test of MICO_VER
+if test MICO_VER != 0; then
+AC_DEFINE(MICO_VER)
+AC_SUBST(MICO_VER)
+fi
+#end USE_CORBA test
+fi
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_AIX
+AC_ISC_POSIX
+AC_MINIX
+fp_C_PROTOTYPES
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+AC_STRUCT_TM
+
+dnl --- This should be in the stdc checking -----------------
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+dnl The Pyramids running SMP_DC.OSx on MIPS r3000 chips with
+dnl /usr/opt/cc3.11/bin/cc treat -Xc as full ANSI mode - no POSIX or
+dnl XOPEN extensions (like popen).
+dnl Unfortunately -D_{XOPEN,POSIX}_SOURCE can't provide all that mg
+dnl needs. So drop back to -Xa
+AC_TRY_COMPILE(
+[#include <stdio.h>
+], [ FILE *rubbish = popen("yes", "r"); ],,
+[CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'])
+fi
+dnl ----------------------
+
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lg:
+AC_CHECK_LIB(g, main)
+dnl Replace `main' with a function in -lgdbm:
+AC_CHECK_LIB(gdbm, main)
+dnl Replace `main' with a function in -lm:
+AC_CHECK_LIB(m, main)
+dnl Replace `main' with a function in -lstdc++:
+AC_CHECK_LIB(stdc++, main)
+dnl Replace `main' with a function in -lcrypt:
+AC_CHECK_LIB(crypt, main)
+
+
+dnl Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h limits.h sys/time.h unistd.h crypt.h string.h memory.h sys/procfs.h)
+AC_EGREP_HEADER(fread, stdio.h, AC_DEFINE(HAVE_FREAD_DECL))
+AC_EGREP_HEADER(fgetc, stdio.h, AC_DEFINE(HAVE_FGETC_DECL))
+AC_EGREP_HEADER(pr_brksize, sys/procfs.h, AC_DEFINE(HAVE_PR_BRKSIZE))
+
+dnl Checks for library functions.
+AC_FUNC_ALLOCA
+AC_PROG_GCC_TRADITIONAL
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize strerror)
+AC_REPLACE_FUNCS(ftruncate strstr strcasecmp)
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+AC_MSG_CHECKING(for HP-UX needing gmalloc)
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  AC_MSG_RESULT(yes)
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  AC_DEFINE(HAVE_VALLOC)
+else
+  AC_MSG_RESULT(no)
+  AC_CHECK_FUNCS(valloc)
+fi
+
+fp_WITH_DMALLOC
+fp_WITH_REGEX
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+dnl    support functions for alloca.c
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+
+# ---------------------------------------------------------------------------
+
+dnl
+dnl Switch into C++
+dnl
+AC_LANG_CPLUSPLUS
+
+dnl
+dnl Check that the GDBM library is available
+dnl
+dnl check libgdbm manually, in case it's not in the standard location.
+
+AC_MSG_CHECKING(that the GDBM library is available)
+if test ! -z "$gdbmdir" ; then
+  # look in given directory for header file
+  if test -r $gdbmdir/include/gdbm.h ; then
+    GDBM_INCLUDE="-I$gdbmdir/include" ;
+  elif test -r $gdbmdir/gdbm.h ; then
+    GDBM_INCLUDE="-I$gdbmdir" ;
+  fi
+
+  # look in given directory for library
+  if test -r $gdbmdir/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir" ;
+  elif test -r $gdbmdir/lib/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir/lib" ;
+  elif test -r $gdbmdir/.libs/libgdbm.a ; then
+    GDBM_LIBPATH="-L$gdbmdir/.libs" ;
+  fi
+
+  if test ! -z "$GDBM_LIBPATH" -a ! -z "$GDBM_INCLUDE" ; then
+    AC_MSG_RESULT($gdbmdir) ;
+  else
+    AC_MSG_RESULT(can't find gdbm.h and libgdbm.a in $gdbmdir);
+    AC_MSG_CHECKING(   looking for GDBM library in default locations)
+  fi
+fi
+
+# look in default path and in /usr/local
+if test -z "$GDBM_INCLUDE" ; then
+  # try in system directory 
+  AC_TRY_COMPILE(
+  [#include <gdbm.h>
+],
+  [],
+  success=yes,
+  success=no
+  )
+
+  if test $success = "no"; then
+# last chance - look in /usr/local (eg FreeBSD)
+    GDBM_LIBPATH=-L/usr/local/lib
+    GDBM_INCLUDE=-I/usr/local/include
+    ac_save_CXXFLAGS="$CXXFLAGS"
+    ac_save_LIBS="$LIBS"
+      CXXFLAGS="$CXXFLAGS -I/usr/local/include"
+      LIBS="$LIBS -L/usr/local/lib -lgdbm"
+      AC_TRY_LINK(
+  	[#include <gdbm.h>
+#include <stdio.h>
+	],
+  	[printf("%s",gdbm_version);],
+  	success=/usr/local,
+  	success=no
+      )
+      CXXFLAGS=$ac_save_CXXFLAGS
+      LIBS=$ac_save_LIBS
+  fi
+
+  AC_MSG_RESULT($success)
+  if test $success = "no"; then
+  AC_MSG_ERROR(GDBM Library not available - cannot install)
+  fi
+fi
+dnl I don't think anything actually checks this define, but...
+AC_DEFINE(HAVE_LIBGDBM , 1)
+
+AC_SUBST(GDBM_LIBPATH)
+AC_SUBST(GDBM_INCLUDE)
+
+dnl
+dnl Now check that Perl is actually around, and can be found
+dnl
+AC_MSG_CHECKING(that Perl 5 is available)
+success="no"
+pl_path="$PATH"
+IFS="${IFS=   }"; pl_save_ifs="$IFS"; IFS=":"
+for pl_dir in $pl_path; do
+  test -z "$pl_dir" && pl_dir=.
+  if test -x $pl_dir/perl; then
+    success="yes"
+    break
+  fi
+done
+IFS="$pl_save_ifs"
+
+dnl
+dnl Perl actually can be run; now we see if it is version 5 by
+dnl running a sample script (which returns a "clean" version number
+dnl and then tests the result using expr.  If perl errors in some
+dnl way (eg. broken Perl executable, missing script), we set a failure
+dnl value ("0") and then proceed as best we can
+dnl
+if test $success = "yes"; then
+try=`perl configtest.pl` || try="0"
+try=`expr $try \> 5.000`
+if test $try = "1"; then
+AC_MSG_RESULT("yes")
+else
+success="no"
+fi
+fi
+
+if test $success = "no"; then
+AC_MSG_RESULT("no")
+AC_MSG_ERROR("Perl 5 not available - cannot install")
+fi
+
+dnl
+dnl Check if the STL library has any known faults;
+dnl In GCC 2.7.2.x series, some STL library headers are missing
+dnl a file called "new" which is referred to by other headers
+dnl (eg. vector/vector.h); if this applies, then all use of the
+dnl STL will cause a compile fail, so we'd better let the user
+dnl know now, before things really go wrong!
+dnl
+success=no
+AC_MSG_CHECKING("whether STL library has known faults")
+
+dnl - first shot, try simple good old vector on its own
+AC_TRY_COMPILE(
+[#include <vector>
+], 
+[],
+success=yes,
+)
+
+dnl - try using the .h equivalent
+if test $success = "no"; then
+AC_TRY_COMPILE(
+[#include <vector.h>
+], 
+[],
+success="yes",
+)
+fi
+
+dnl - now try for the objectspace headers
+if test $success = "no"; then
+AC_TRY_COMPILE(
+[#include <ospace\\std\\vector>
+], 
+[],
+success="yes",
+)
+fi
+
+if test $success = yes; then
+AC_MSG_RESULT("no")
+else
+AC_MSG_RESULT("yes")
+AC_MSG_ERROR("STL Broken - Obtain newer version of GNU C Compiler")
+fi
+
+gsdlos=`uname | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+# check for running bash under cygwin
+ if test "`echo $gsdlos | sed 's/cygwin//'`" != "$gsdlos" ;
+ then
+  gsdlos=windows
+ fi
+AC_SUBST(gsdlos)
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+dnl    support functions for alloca.c
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+# ---------------------------------------------------------------------------
+
+dnl
+dnl Locate all children of the modules folder
+dnl
+moduleDirs=""
+MODULEDIRS=""
+for x in `find modules -mindepth 1 -maxdepth 2`; do
+  if test -d "$x"; then
+    d="$x/Makefile.in"
+    if test -e "$d"; then
+dnl      echo $d
+      moduleDirs="$moduleDirs $x/Makefile"
+      MODULEDIRS="$MODULEDIRS $x"
+    fi
+  fi
+done
+echo "Making$moduleDirs in modules directory"
+AC_SUBST(MODULEDIRS)
+
+# ---------------------------------------------------------------------------
+dnl for Darwin, as our packages don't (yet) correctly guess our system type.
+ac_configure_args="$ac_configure_args --host=$host --target=$target"
+AC_CONFIG_SUBDIRS(packages)
+
+# the list of folders in the src folder
+srclist="src/mgpp/lib/Makefile src/mgpp/text/Makefile src/mgpp/Makefile \
+          src/hashfile/Makefile src/colservr/Makefile src/recpt/Makefile src/txt2db/Makefile \
+          src/db2txt/Makefile src/getpw/Makefile src/phind/generate/Makefile"
+
+AC_OUTPUT(packages/Makefile packages/mg/Makefile packages/mg/src/text/Makefile packages/mg/src/images/Makefile 
+          packages/mg/src/scripts/Makefile packages/mg/lib/Makefile
+	  lib/Makefile Makefile $srclist $moduleDirs)
+
+
Index: /main/tags/2.38/gsdl/etc/BVERSION
===================================================================
--- /main/tags/2.38/gsdl/etc/BVERSION	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/BVERSION	(revision 21083)
@@ -0,0 +1,1 @@
+build version: 2.1
Index: /main/tags/2.38/gsdl/etc/VERSION
===================================================================
--- /main/tags/2.38/gsdl/etc/VERSION	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/VERSION	(revision 21083)
@@ -0,0 +1,3 @@
+gsdl version: x.xx
+cvs tag: gsdl-x_xx-distribution
+build version: 2.1
Index: /main/tags/2.38/gsdl/etc/main.cfg
===================================================================
--- /main/tags/2.38/gsdl/etc/main.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/main.cfg	(revision 21083)
@@ -0,0 +1,200 @@
+# This is the main configuration file for configuring
+# your Greenstone receptionist (i.e. the bit responsible
+# for the way things are displayed).
+
+# Email address of the webmaster of this Greenstone installation
+# If maintainer is set to "NULL" EmailEvents and EmailUserEvents
+# will be disabled.
+maintainer      NULL
+
+# Outgoing (SMTP) mail server for this Greenstone installation.
+# This will default to mail.maintainer-domain if it's not set
+# (i.e. if maintainer is greenstone@cs.waikato.ac.nz then MailServer
+# will default to mail.cs.waikato.ac.nz). If MailServer doesn't
+# resolve to a valid SMTP server then the EmailEvents and
+# EmailUserEvents options (see below) won't be functional. Likewise,
+# turning off EmailEvents and EmailUserEvents will remove any 
+# reliance on MailServer.
+MailServer      NULL
+
+# Set status to "disabled" if you don't want the Maintenance and
+# Administration facility to be available.
+status          enabled
+
+# Set collector to "disabled" if you don't want the "collector"
+# end-user collection building facility to be available.
+collector       enabled
+
+# Set logcgiargs to true to keep a log of usage information in
+# $GSDLHOME/etc/usage.txt.
+logcgiargs      false
+
+# Set usecookies to true to use cookies to identify users (cookie 
+# information will be written to the usage log if logcgiargs is
+# true).
+usecookies      false
+
+# LogDateFormat sets the format that timestamps will be stored in the usage
+# log (i.e. if logcgiargs is enabled). It takes the following values:
+# LocalTime: (the default) The local time and date in the form 
+#            "Thu Dec 07 23:47:00 NZDT 2000".
+# UTCTime: Coordinated universal time (GMT) in the same format as LocalTime.
+# Absolute: Integer value representing the number of seconds since 
+#           00:00:00 1/1/1970 GMT
+LogDateFormat   LocalTime
+
+# Log any events that Greenstone deems important in 
+# $GSDLHOME/etc/events.txt. 
+# The only events that are currently implemented come from the 
+# collector (e.g. someone just built/deleted the following collection)
+# LogEvents may take values of:
+# AllEvents: All important events
+# CollectorEvents: Just those events originating from the collector
+#                  (e.g. someone just built a collection)
+# disabled: Don't log events
+LogEvents       disabled
+
+# Email the maintainer whenever any event occurs. EmailEvents
+# takes the same values as LogEvents.
+# Note that perl must be installed for EmailEvents or
+# EmailUserEvents to work.
+EmailEvents     disabled
+
+# In some cases it may be appropriate to email the user about a
+# certain event (e.g. notification from the collector that a collection
+# was built successfully)
+EmailUserEvents false
+
+
+# The list of display macro files used by this receptionist
+macrofiles      tip.dm style.dm base.dm query.dm help.dm pref.dm about.dm \
+                document.dm browse.dm status.dm authen.dm users.dm html.dm \
+                extlink.dm gsdl.dm english.dm chinese.dm french.dm \
+                german.dm maori.dm english2.dm french2.dm arabic.dm \
+                spanish.dm spanish2.dm dutch.dm port.dm russian.dm russian2.dm \
+                italian.dm italian2.dm home.dm collect.dm docs.dm \
+                hebrew.dm indo.dm bsummary.dm
+
+# Define the interface languages and encodings supported by this receptionist
+
+# An "Encoding" line defines an encoding to be used by the receptionist.
+# Uncomment "Encoding" lines to include an encoding on your "preferences" page.
+# Encoding line options are:
+# shortname -- The standard charset label for the given encoding. The
+#              shortname option is mandatory.
+# longname  -- The display name of the given encoding. If longname isn't set
+#              it will default to using shortname instead.
+# map       -- The name of the map file (i.e. the .ump file) for use when
+#              converting between unicode and the given encoding. The map
+#              option is mandatory for all encoding lines except the
+#              special case for utf8.
+# multibyte -- This optional argument should be set for all encodings that use
+#              multibyte characters.
+
+# The utf8 encoding is handled internally and doesn't require a map file.
+# As a rule the utf8 encoding should always be enabled, especially if you
+# have collections of documents that may not all be in the same
+# language/encoding.
+Encoding shortname=utf-8 "longname=Unicode (UTF-8)"
+
+# The ISO-8859 series
+Encoding shortname=iso-8859-1 "longname=Western (ISO-8859-1)" map=8859_1.ump
+#Encoding shortname=iso-8859-2 "longname=Central European (ISO-8859-2)" map=8859_2.ump
+#Encoding shortname=iso-8859-3 "longname=Latin 3 (ISO-8859-3)" map=8859_3.ump
+#Encoding shortname=iso-8859-4 "longname=Latin 4 (ISO-8859-4)" map=8859_4.ump
+#Encoding shortname=iso-8859-5 "longname=Cyrillic (ISO-8859-5)" map=8859_5.ump
+#Encoding shortname=iso-8859-6 "longname=Arabic (ISO-8859-6)" map=8859_6.ump
+#Encoding shortname=iso-8859-7 "longname=Greek (ISO-8859-7)" map=8859_7.ump
+#Encoding shortname=iso-8859-8 "longname=Hebrew (ISO-8859-8)" map=8859_8.ump
+#Encoding shortname=iso-8859-9 "longname=Turkish (ISO-8859-9)" map=8859_9.ump
+
+# Windows codepages
+#Encoding shortname=windows-1250 "longname=Central European (Windows-1250)" map=win1250.ump
+Encoding shortname=windows-1251 "longname=Cyrillic (Windows-1251)" map=win1251.ump
+#Encoding shortname=windows-1252 "longname=Western (Windows-1252)" map=win1252.ump
+#Encoding shortname=windows-1253 "longname=Greek (Windows-1253)" map=win1253.ump
+#Encoding shortname=windows-1254 "longname=Turkish (Windows-1254)" map=win1254.ump
+Encoding shortname=windows-1255 "longname=Hebrew (Windows-1255)" map=win1255.ump
+Encoding shortname=windows-1256 "longname=Arabic (Windows-1256)" map=win1256.ump
+#Encoding shortname=windows-1257 "longname=Baltic (Windows-1257)" map=win1257.ump
+#Encoding shortname=windows-1258 "longname=Vietnamese (Windows-1258)" map=win1258.ump
+#Encoding shortname=windows-874 "longname=Thai (Windows-874)" map=win874.ump
+#Encoding shortname=cp866 "longname=Cyrillic (DOS)" map=dos866.ump
+
+# KOI8 Cyrillic encodings
+#Encoding shortname=koi8-r "longname=Cyrillic (KOI8-R)" map=koi8_r.ump
+#Encoding shortname=koi8-u "longname=Cyrillic (KOI8-U)" map=koi8_u.ump
+
+# CJK encodings (note that Shift-JIS Japanese isn't currently supported)
+Encoding shortname=gbk "longname=Chinese Simplified (GBK)" map=gbk.ump multibyte
+Encoding shortname=big5 "longname=Chinese Traditional (Big5)" map=big5.ump multibyte
+Encoding shortname=euc-jp "longname=Japanese (EUC)" map=euc_jp.ump multibyte
+Encoding shortname=euc-kr "longname=Korean (UHC)" map=uhc.ump multibyte
+
+
+# A "Language" line defines an interface language to be used by the
+# interface. Note that it is possible to display only a subset of the
+# specified languages on the preferences page for a given collection by
+# using the "PreferenceLanguages" format option in your collect.cfg
+# configuration file.
+# options are:
+# shortname        -- ISO 639 two letter language symbol. The shortname
+                      option is mandatory.
+# longname         -- The display name for the given language. If longname
+                      isn't set it will default to using shortname instead.
+# default_encoding -- The encoding to use by default when using the given
+#                     interface language. This should be set to the
+#                     "shortname" of a valid "Encoding" line
+Language shortname=en longname=English default_encoding=iso-8859-1
+Language shortname=fr longname=French default_encoding=iso-8859-1
+Language shortname=zh longname=Chinese default_encoding=gbk
+Language shortname=de longname=German default_encoding=iso-8859-1
+Language shortname=es longname=Spanish default_encoding=iso-8859-1
+Language shortname=mi longname=Maori default_encoding=utf-8
+Language shortname=ar longname=Arabic default_encoding=windows-1256
+Language shortname=pt longname=Portuguese default_encoding=iso-8859-1
+Language shortname=nl longname=Dutch default_encoding=iso-8859-1
+Language shortname=ru longname=Russian default_encoding=windows-1251
+Language shortname=it longname=Italian default_encoding=iso-8859-1
+Language shortname=iw longname=Hebrew default_encoding=windows-1255
+Language shortname=id longname=Indonesian default_encoding=iso-8859-1
+
+# Define any additional page parameters to be used by the above macro files
+# (the current default page parameters are c (collection) and l (language)
+
+# Define v (version -- text or graphic) page parameter and give it a default
+# value of 0 (0 = text version off)
+pageparam       v 0
+
+# Set the precedence given to the page parameters. This effects which macro 
+# will be selected for display when there are multiple versions of the same 
+# macro with different page parameters.
+# e.g. Given a macroprecedence of "c,v,l" and the following macro definitions:
+# _content_ []
+# _content_ [l=en]
+# _content_ [c=demo]
+# _content_ [v=1]
+# _content_ [l=fr,v=1,c=hdl]
+# If the corresponding cgi arguments were set to l=en&v=1&c=hdl then the
+# _content_[v=1] macro would be selected for display. It would be selected 
+# ahead of the _content_[l=en] macro because "v" has a higher precedence 
+# than "l". The _content_[l=fr,v=1,c=hdl] macro would not be selected 
+# because one of the page parameters is completely wrong ("l").
+macroprecedence c,v,l
+
+
+# Define any additional cgi arguments. Most cgi arguments are built into
+# Greenstone but it's possible to define them here (or set defaults for
+# existing built-in cgi arguments).
+
+# define the "v" cgi argument (to correspond to the "v" page parameter defined
+# above).
+cgiarg          shortname=v longname=version multiplechar=false argdefault=0 \
+                defaultstatus=weak savedarginfo=must
+
+# set a default value for the built-in "a" cgi argument
+cgiarg          shortname=a argdefault=p
+
+# set a default value for the built-in "p" cgi argument
+cgiarg          shortname=p argdefault=home
+
Index: /main/tags/2.38/gsdl/etc/packages/phind/stopword/en/brown.sw
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/phind/stopword/en/brown.sw	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/phind/stopword/en/brown.sw	(revision 21083)
@@ -0,0 +1,2009 @@
+a
+aah
+aback
+abed
+abjectly
+ablaze
+ably
+abnormally
+aboard
+about
+abreast
+abroad
+abroade
+abruptly
+absently
+absentmindedly
+absolutely
+abstractly
+absurdly
+abundantly
+academically
+accidentally
+according
+accordingly
+accurately
+accusingly
+acourse
+acoustically
+across
+actively
+actually
+actuarially
+acutely
+adamantly
+additionally
+adequately
+administratively
+admirably
+admiringly
+admittedly
+adrift
+advantageously
+adversely
+advisedly
+afar
+affectingly
+affectionately
+affirmatively
+afield
+afloat
+afoot
+aforethought
+afresh
+after
+afterward
+afterwards
+aftuh
+again
+against
+agayne
+aggressively
+agilely
+agin
+ago
+agreeably
+agriculturally
+ah
+ahah
+ahead
+ahem
+ahn
+ai
+aimlessly
+airily
+ajar
+alarmingly
+alas
+albeit
+alertly
+algebraically
+alike
+all
+allegedly
+allso
+almost
+aloft
+alone
+along
+alongside
+aloud
+alreadeh
+already
+also
+alternately
+alternatively
+altho
+although
+altogether
+altruistically
+always
+am
+amazingly
+ambitiously
+ame
+amen
+amicably
+amid
+amidst
+among
+amongst
+amorphously
+amply
+amusedly
+amusingly
+an
+analogously
+analytically
+anatomically
+anciently
+and
+anesthetically
+anew
+angrily
+anhydrously
+ani
+annually
+another
+anti
+anxiously
+any
+anybody
+anye
+anyhow
+anymore
+anyone
+anyplace
+anythin
+anything
+anyway
+anyways
+anywhere
+apart
+apiece
+apologetically
+appallingly
+apparently
+appraisingly
+appreciably
+appreciatively
+apprehensively
+appropriately
+approvingly
+approximately
+aptly
+arbitrarily
+are
+aristocratically
+around
+arrogantly
+artfully
+artificially
+artistically
+as
+asham
+ashore
+aside
+askance
+askew
+asleep
+associatively
+assuredly
+astonishingly
+astray
+astride
+astronomically
+asunder
+asymmetrically
+asymptotically
+at
+atonally
+atop
+atrociously
+att
+atta
+attentively
+attractively
+audibly
+aurally
+auspiciously
+austerely
+authentically
+authoritatively
+automatically
+avidly
+aw
+away
+awaye
+awfully
+awhile
+awkwardly
+axially
+aye
+backstage
+backstairs
+backward
+backwards
+badly
+bah
+bannnnnng
+barely
+basically
+be
+beautifully
+because
+beefore
+been
+befoh
+before
+beforehand
+behahn
+behaviorally
+behind
+bein
+being
+beinge
+belatedly
+believably
+belligerently
+below
+beneath
+beside
+besides
+between
+bewilderedly
+bewilderingly
+beyond
+bi
+billion
+biologically
+bitterly
+blandly
+bleakly
+blindly
+blissfully
+blithely
+bluntly
+boastfully
+bodily
+boldly
+bong
+both
+bravely
+brazenly
+breathlessly
+briefly
+brightly
+brilliantly
+briskly
+broadly
+brokenly
+brusquely
+brutally
+busily
+but
+by
+callously
+calmly
+can
+candidly
+cannot
+capably
+carefully
+carelessly
+casually
+catastrophically
+categorically
+causally
+cautiously
+ceaselessly
+centrally
+ceremonially
+ceremoniously
+certainly
+characteristically
+charmingly
+cheaply
+cheerfully
+chemically
+chiefly
+childishly
+chronically
+chronologically
+circa
+circumspectly
+clairaudiently
+classically
+cleanly
+clearly
+cleverly
+clinically
+clockwise
+closely
+clumsily
+coarsely
+cogently
+cohesively
+colde
+coldly
+collectively
+comfortably
+comically
+commercially
+commonly
+compactly
+comparatively
+compassionately
+competently
+competitively
+completely
+comprehensively
+compulsively
+concededly
+conceivably
+conceptually
+concerning
+conclusively
+concretely
+concurrently
+confidentially
+confidently
+consanguineously
+consciously
+consequently
+considerably
+considerately
+consisently
+consistently
+conspicuously
+constantly
+constructively
+consummately
+contemptuously
+contentedly
+continentally
+continually
+continuously
+contradictorily
+contrarily
+conveniently
+conventionally
+conversely
+convincingly
+convulsively
+coolly
+copiously
+correctly
+correlatively
+correspondingly
+cortically
+cosily
+coud
+coudn
+could
+courageously
+courteously
+covertly
+coyly
+crazily
+creatively
+credibly
+crisply
+critically
+crossways
+crosswise
+crucially
+crudely
+cruelly
+culturally
+cunningly
+curiously
+currently
+curtly
+curvaceously
+customarily
+cynically
+d
+da
+daintily
+dammit
+damnit
+dandily
+dangerously
+darkly
+dearly
+deathly
+decently
+deceptively
+decidedly
+decisively
+deeply
+defiantly
+definitely
+dejectedly
+deliberately
+delicately
+deliciously
+delightfully
+demandingly
+demonstrably
+denominationally
+depending
+deplorably
+depressingly
+dere
+derisively
+despairingly
+desperately
+despite
+determinedly
+devastatingly
+devotedly
+devoutly
+dey
+diagonally
+dialectically
+diametrically
+did
+diddle
+didn
+differently
+diffusely
+diligently
+dimensionally
+dimly
+directionally
+directly
+disapprovingly
+disconcertingly
+discordantly
+discreetly
+dismally
+dispassionately
+disproportionately
+distally
+distantly
+distastefully
+distinctively
+distinctly
+distractedly
+disturbingly
+divinely
+dizzily
+do
+doan
+docilely
+doctrinally
+does
+doggedly
+doggone
+dogmatically
+domestically
+dominantly
+doo
+dost
+doubly
+doubtfully
+doubtingly
+doubtless
+dourly
+down
+downright
+downstairs
+downwind
+dramatically
+drastically
+dreadfully
+dreamlessly
+drowsily
+drunkenly
+druther
+dryly
+dully
+duly
+during
+dutifully
+dynamically
+each
+eagerly
+earnestly
+easily
+eastward
+eclectically
+economically
+edgewise
+editorially
+eerily
+effectively
+efficaciously
+efficiently
+effortlessly
+egregiously
+eh
+eight
+eighteen
+eighteenth
+eighth
+eighty
+either
+elaborately
+electrically
+elegantly
+eleven
+eleventh
+eloquently
+else
+elsewhere
+em
+embarrassingly
+eminently
+emotionally
+emphatically
+empirically
+enchantingly
+encouragingly
+endlessly
+enduringly
+energetically
+engagingly
+enny
+enormously
+enough
+enterprisingly
+enthusiastically
+entirely
+enviably
+enviously
+epicyclically
+equally
+equidistantly
+equitably
+ere
+erotically
+erratically
+erroneously
+especially
+essentially
+etcetera
+ether
+ethically
+evenly
+eventfully
+eventshahleh
+eventually
+evenutally
+ever
+everlastingly
+every
+everybody
+everyone
+everything
+everywhere
+evidently
+exactly
+exasperatingly
+exceedingly
+excellently
+except
+excepting
+exceptionally
+excessively
+excitedly
+excluding
+exclusively
+exhaustingly
+exhaustively
+expansively
+expectantly
+expectedly
+expeditiously
+experientially
+experimentally
+expertly
+explicitly
+explosively
+expressly
+exquisitely
+extempore
+extensively
+externally
+extraordinarily
+extremely
+exuberantly
+exultantly
+facetiously
+faintly
+fairly
+faithfully
+familiarly
+fantastically
+farther
+fascinatingly
+fatally
+favorably
+fearfully
+fearlessly
+feebly
+fer
+ferociously
+fervently
+feverishly
+few
+fewer
+fiercely
+fifteen
+fifteenth
+fifth
+fiftieth
+fifty
+finally
+financially
+finely
+firmly
+first
+fitfully
+five
+flagrantly
+flamboyantly
+flatly
+flatteringly
+fluently
+focally
+foh
+fondly
+foolishly
+for
+forcibly
+foremost
+forever
+formally
+former
+formerly
+formidably
+forth
+forthrightly
+fortunately
+forty
+foully
+four
+fourteen
+fourteenth
+fourth
+fragmentarily
+frankly
+frantically
+freely
+frenziedly
+frequently
+freshly
+friendlily
+frighteningly
+frightfully
+from
+frowningly
+frugally
+fruitfully
+fruitlessly
+fully
+functionally
+fundamentally
+furiously
+furthermore
+furtively
+fussily
+futhermore
+gaily
+gaspingly
+gawdamighty
+generally
+generously
+gently
+genuinely
+geographically
+geometrically
+girlishly
+gladly
+glaringly
+gleefully
+glibly
+globally
+gloomily
+gloriously
+glumly
+godamit
+goddamit
+goddammit
+golly
+goodbye
+goodnight
+goody
+goolick
+goooolick
+gorgeously
+gosh
+governmentally
+gracefully
+graciously
+gradually
+grammatically
+grandly
+graphically
+gratefully
+gratifyingly
+gratingly
+gratis
+gratuitously
+gravely
+greatly
+greedily
+greenly
+grevouselye
+grimly
+grossly
+grotesquely
+grudgingly
+ha
+habitually
+had
+hadd
+haf
+haggardly
+haint
+half
+halfways
+haltingly
+handsomely
+haphazardly
+happily
+harder
+hardly
+harmlessly
+harmoniously
+harro
+harshly
+has
+hast
+hastily
+hath
+haughtily
+have
+having
+he
+healthily
+heartily
+heatedly
+heavily
+hello
+helpfully
+helplessly
+hence
+henceforth
+henh
+her
+here
+hereabouts
+hereafter
+hereby
+herein
+hereinafter
+heretofore
+hereunto
+herewith
+heroically
+hers
+herself
+hesitantly
+hesitatingly
+hev
+hevin
+hey
+hi
+hideously
+highly
+hilariously
+him
+himself
+himselfe
+hir
+his
+hisself
+historically
+hither
+hitherto
+hmpf
+hoarsely
+homeward
+homewards
+homogeneously
+honestly
+honorably
+hopefully
+hopelessly
+horizontally
+horribly
+horrifyingly
+hotly
+how
+howe
+however
+howsomever
+hubba
+huh
+humanely
+humanly
+humbly
+humiliatingly
+hundred
+hundredth
+hurriedly
+huskily
+hydraulically
+hym
+hyperbolically
+hypnotically
+hypothalamically
+hys
+hytt
+ideally
+identically
+idiotically
+idly
+if
+illegally
+imaginatively
+immeasurably
+immediately
+immensely
+impassively
+impatiently
+impeccably
+imperceptibly
+imperfectly
+imperiously
+impersonally
+implausibly
+implicitly
+importantly
+importunately
+impossibly
+imprecisely
+improbably
+improperly
+imprudently
+impudently
+in
+inadequately
+inadvertently
+inasmuch
+incessantly
+incidentally
+including
+incoherently
+incomparably
+incompletely
+inconspicuously
+inconveniently
+increasingly
+incredibly
+incredulously
+incurably
+indecisively
+indeed
+indefinitely
+indelibly
+independently
+indignantly
+indirectly
+indiscriminantly
+indisputably
+individually
+indolently
+indoors
+industrially
+industriously
+ineffectively
+ineptly
+inescapably
+inevitably
+inexorably
+inexplicably
+inexpressibly
+infernally
+infinitely
+infinitesimally
+informally
+infra
+infrequently
+ingeniously
+inherently
+initially
+inland
+innocently
+inordinately
+insanely
+insidiously
+insofar
+insolently
+insomma
+instantaneously
+instantly
+instead
+instinctively
+instrumentally
+insufficiently
+insuperably
+intellectually
+intelligently
+intensely
+intensively
+intentionally
+intently
+interestingly
+intermittently
+internally
+internationally
+intimately
+into
+intramuscularly
+intricately
+intriguingly
+intrinsically
+intuitively
+invariably
+inversely
+invisibly
+involuntarily
+inwardly
+ironically
+irrationally
+irredeemably
+irregularly
+irreparably
+irresistibly
+irreversibly
+irrevocably
+irritably
+is
+isothermally
+it
+its
+itself
+jaggedly
+jealously
+jist
+jocularly
+jointly
+joyfully
+joyously
+jubilantly
+judiciously
+july
+jurisprudentially
+justifiably
+justly
+kaboom
+keenly
+kin
+kinda
+kinesthetically
+knowingly
+laboriously
+lahk
+lak
+largely
+last
+lastly
+lately
+latter
+laudably
+laughingly
+lavishly
+lazily
+least
+legally
+legitimately
+lengthily
+less
+lest
+lewdly
+liberally
+lightly
+likewise
+limply
+linearly
+linguistically
+listlessly
+literally
+litle
+lo
+locally
+logically
+loosely
+lopsidedly
+loudly
+lovingly
+luckily
+lustily
+m
+macroscopically
+madly
+magically
+magnetically
+magnificently
+mah
+maht
+mai
+mainly
+majestically
+maliciously
+manifestly
+manually
+many
+manye
+marginally
+markedly
+marketwise
+marvelously
+masterfully
+materially
+mathematically
+may
+maybe
+maye
+mayst
+me
+meaningfully
+meanwhile
+measurably
+mechanically
+mechanochemically
+medically
+mee
+meekly
+melodically
+mentally
+mercifully
+mercilessly
+merely
+merrily
+methodically
+meticulously
+metrically
+microscopically
+midway
+might
+mightily
+mildly
+militantly
+militarily
+million
+mimetically
+mine
+minimally
+minus
+minutely
+miraculously
+miserably
+mistakenly
+mmm
+mmmm
+mockingly
+moderately
+modestly
+momentarily
+monolithically
+monumentally
+moodily
+mor
+morally
+more
+moreover
+morosely
+mortally
+most
+mostly
+mountainously
+mournfully
+movingly
+much
+municipally
+musically
+must
+mutely
+mutually
+my
+myn
+myne
+myself
+mysteriously
+n
+na
+nae
+naively
+nakedly
+namely
+narrowly
+nary
+natch
+nationally
+naturally
+naught
+naw
+nawt
+nay
+nearly
+nearsightedly
+neatly
+necessarily
+needlessly
+negatively
+neither
+nervously
+nether
+never
+nevertheless
+next
+nicely
+nigh
+nightly
+nilly
+nimbly
+nine
+nineteen
+nineteenth
+ninetieth
+ninety
+ninth
+no
+nobody
+noisily
+nominally
+noncommittally
+nondescriptly
+none
+nonetheless
+nonspecifically
+nope
+nor
+normally
+northward
+nostalgically
+not
+notably
+noth
+nothin
+nothing
+noticeably
+notoriously
+nott
+notwithstanding
+now
+nowadays
+nowhere
+nuf
+numbingly
+numerically
+o
+objectively
+obligingly
+obliquely
+obscurely
+obviously
+occasionally
+octillion
+oddly
+of
+off
+offensively
+officially
+offstage
+oft
+often
+oftener
+oftentimes
+oh
+okay
+ominously
+on
+once
+onct
+one
+oneself
+onleh
+only
+onto
+ontologically
+onward
+onwards
+oooo
+oops
+openly
+operationally
+optically
+or
+orally
+ordinarily
+organically
+organizationally
+originally
+ornately
+ostensibly
+other
+otherwise
+ought
+our
+ours
+ourselves
+out
+outdoors
+outstandingly
+outwardly
+over
+overboard
+overland
+overly
+overtly
+overwhelmingly
+ovuh
+owly
+ownself
+painfully
+painlessly
+painstakingly
+palely
+palpably
+paradoxically
+parenthetically
+partially
+particularly
+partly
+passionately
+passively
+paternally
+patiently
+peacefully
+peculiarly
+per
+perchance
+perennially
+perfectly
+perforce
+perfunctorily
+perhaps
+perilously
+periodically
+peripherally
+permanently
+perpendicularly
+perpetually
+persistently
+personally
+persuasively
+pervasively
+perversely
+philosophically
+photographically
+physically
+physiologically
+pictorially
+piecewise
+pinkly
+piously
+pip
+pitifully
+pitilessly
+pityingly
+plainly
+plastically
+pleasantly
+pleasingly
+plumb
+plus
+poetically
+poignantly
+pointedly
+politely
+politically
+pompously
+poorly
+popularly
+positively
+possibly
+potentially
+powerfully
+practically
+prayerfully
+precariously
+precisely
+precociously
+predictably
+predominantly
+predominately
+preferably
+preferentially
+prematurely
+preponderantly
+presente
+presently
+presentlye
+presumably
+prettily
+pretty
+previously
+primarily
+primly
+principally
+privately
+probably
+probly
+prodigally
+professedly
+professionally
+profitably
+profoundly
+profusely
+progressively
+prominently
+promptly
+pronto
+properly
+prophetically
+proportionally
+proportionately
+protectively
+proudly
+provocatively
+prudentially
+prudently
+psychically
+psychologically
+publically
+publicly
+pugh
+punctually
+pungently
+purely
+purportedly
+purposefully
+purposely
+purposively
+pursuant
+quadrillion
+qualitatively
+quantitatively
+querulously
+questioningly
+quickly
+quietly
+quintillion
+quite
+quitely
+racially
+radically
+rakishly
+randomly
+rapidly
+rarely
+rather
+rationally
+raucously
+readily
+realistically
+really
+reasonably
+reassuringly
+rebelliously
+recently
+recklessly
+rectlinearly
+recurrently
+reflexly
+refreshingly
+regarding
+regardless
+regionally
+regretfully
+regrettably
+regularly
+relatively
+relentlessly
+reliably
+religiously
+reluctantly
+remarkably
+remotely
+repeatedly
+reportedly
+reproducibly
+reprovingly
+reputedly
+residentially
+resignedly
+resolutely
+resourcefully
+respectfully
+respectively
+responsibly
+responsively
+restively
+restlessly
+reverently
+rhythmically
+richly
+ridiculously
+rightfully
+rightly
+rigidly
+rigorously
+rollickingly
+romantically
+rotationally
+roughly
+roughtly
+roundly
+routinely
+rudely
+ruefully
+ruggedly
+ruthlessly
+sadly
+safely
+same
+sarcastically
+satirically
+satisfactorily
+savagely
+scarcely
+scathingly
+schematically
+scholastically
+scientifically
+scornfully
+scrupulously
+searchingly
+seasonally
+second
+secondarily
+secondly
+secretly
+securely
+sedately
+sedulously
+seekingly
+seemingly
+seldom
+selectively
+semantically
+senselessly
+sensibly
+sensitively
+separately
+septillion
+serenely
+seriously
+seven
+seventeen
+seventeenth
+seventh
+seventy
+several
+severally
+severely
+severly
+sextillion
+sexually
+sha
+shabbily
+shakily
+shall
+shamefacedly
+sharply
+shatteringly
+she
+shh
+shiningly
+shockingly
+shortly
+should
+shrewdly
+shrilly
+shucks
+shuld
+shulde
+shyly
+sidewise
+signally
+significantly
+silently
+similarly
+simply
+simultaneously
+since
+sincerely
+single
+singlehandedly
+singly
+singularly
+sinuously
+six
+sixteen
+sixteenth
+sixth
+sixty
+skeptically
+skilfully
+skillfully
+sleepily
+sleeplessly
+slightly
+slimly
+sloppily
+slowly
+sluggishly
+slyly
+smartly
+smilingly
+smolderingly
+smoothly
+snobbishly
+snugly
+so
+sobbingly
+soberly
+socially
+sociologically
+soddenly
+soe
+sofar
+softly
+solely
+solemnly
+solidly
+some
+somebody
+someday
+somehow
+someone
+someplace
+somethin
+something
+sometime
+sometimes
+somewhat
+somewhere
+somewheres
+sompin
+sonuvabitch
+soon
+sooner
+soothingly
+sorely
+soulfully
+soundly
+sourly
+sparsely
+spatially
+specially
+specifically
+spectacularly
+spectrally
+speculatively
+speedily
+spiritually
+splendidly
+spontaneously
+squarely
+sssshoo
+staggeringly
+starkly
+startlingly
+statistically
+steadfastly
+steadily
+stealthily
+steamily
+steeply
+sternly
+stiffly
+stirringly
+stolidly
+stonily
+stoutly
+straightway
+strangely
+strategically
+strenuously
+strictly
+strikingly
+stringently
+strongly
+structurally
+stubbornly
+studiously
+stunningly
+stupidly
+subconsciously
+subjectively
+subsequently
+substantially
+substantively
+subtly
+successfully
+successively
+succinctly
+suddenly
+sufficiently
+suitably
+sulkily
+sullenly
+superbly
+superficially
+supinely
+supposedly
+supposing
+supra
+supremely
+surely
+surprisingly
+surreptitiously
+suspiciously
+sweepingly
+sweetly
+swiftly
+sycophantically
+symbolically
+symmetrically
+sympathetically
+synce
+syntactically
+systematically
+ta
+tacitly
+tactically
+tactually
+tangibly
+tantalizingly
+tarantara
+tardily
+tartly
+tauntingly
+tearfully
+technically
+technologically
+tediously
+telepathically
+temperately
+temporally
+temporarily
+temptingly
+ten
+tenaciously
+tenderly
+tenfold
+tensely
+tentatively
+tenth
+tenuously
+terribly
+tersely
+testily
+than
+thar
+that
+thatt
+thay
+the
+theare
+thease
+theatrically
+thee
+thees
+thei
+their
+theirs
+them
+themselves
+thence
+thenceforth
+theoretically
+ther
+there
+thereabouts
+thereafter
+thereby
+therefor
+therefore
+therefrom
+therein
+thereof
+thereon
+thereto
+theretofore
+thereunder
+thereupon
+therewith
+thermally
+thermodynamically
+these
+thet
+they
+thickly
+thine
+thinly
+third
+thirdly
+thirteen
+thirteenth
+thirtieth
+thirty
+this
+thither
+thoroughly
+those
+thou
+though
+thoughtfully
+thoughtlessly
+thousand
+thousandth
+threateningly
+three
+thrice
+through
+throughout
+thru
+thum
+thus
+thy
+tighter
+tightly
+till
+timidly
+tiredly
+tirelessly
+to
+together
+tonally
+too
+totally
+toward
+towardes
+towards
+traditionally
+tragically
+transversally
+transversely
+tremendously
+tremulously
+trillion
+triumphantly
+truly
+trustfully
+trustingly
+truthfully
+tunelessly
+twelfth
+twelve
+twentieth
+twenty
+twice
+twirlingly
+twise
+two
+typically
+u
+ugh
+uh
+uhhu
+ultimately
+ultracentrifugally
+ultrasonically
+um
+umm
+unaccountably
+unambiguously
+unanimously
+unappeasably
+unashamedly
+unavoidably
+unbearably
+unbelievably
+unblinkingly
+unceasingly
+uncertainly
+uncomfortably
+uncommonly
+uncomplainingly
+unconcernedly
+unconditionally
+unconsciously
+uncritically
+undeniably
+underfoot
+underneath
+understandably
+understandingly
+underway
+undoubtedly
+unduly
+uneasily
+unequally
+unequivocally
+unerringly
+unexpectedly
+unfailingly
+unfairly
+unfalteringly
+unfortunately
+unfunnily
+unhappily
+unhesitatingly
+unhurriedly
+uniformly
+unilaterally
+unimpeachably
+unintentionally
+uninterruptedly
+uniquely
+universally
+unknowingly
+unless
+unlike
+unluckily
+unmanageably
+unmistakably
+unnaturally
+unnecessarily
+unnnt
+unobtrusively
+unofficially
+unpleasantly
+unpredictably
+unqualifiedly
+unquestionably
+unquestioningly
+unrealistically
+unreasonably
+unreassuringly
+unreservedly
+unrestrictedly
+unselfishly
+unsmilingly
+unsteadily
+unsuccessfully
+unsuitably
+until
+unto
+unusually
+unutterably
+unwaveringly
+unwillingly
+unwisely
+unwittingly
+up
+upon
+uppermost
+uppon
+uproariously
+upside
+upstate
+upwards
+urgently
+us
+usefully
+uselessly
+usually
+utterly
+vaguely
+vainly
+valiantly
+validly
+variously
+vastly
+vehemently
+verbally
+verbatim
+verie
+versa
+versus
+vertically
+very
+via
+victoriously
+vigorously
+violently
+virtually
+visibly
+visually
+vitally
+vividly
+vocally
+vocationally
+vociferously
+volumetrically
+voluntarily
+voraciously
+warily
+warmly
+warningly
+was
+waspishly
+we
+weakly
+wearily
+wee
+weirdly
+were
+westward
+westwards
+wetly
+whad
+what
+whatever
+whatsoever
+wheare
+when
+whence
+whenever
+wher
+where
+whereas
+whereby
+whereever
+wherefore
+wherein
+whereon
+whereupon
+wherever
+wherewith
+whether
+which
+whichever
+whitely
+who
+whoe
+whoever
+wholeheartedly
+wholly
+whom
+whoosh
+whose
+whosoever
+why
+wickedly
+widely
+wil
+wildly
+wilfully
+will
+willfully
+willingly
+willy
+wilt
+wisely
+wistfully
+with
+withal
+within
+without
+wittingly
+wod
+woefully
+wold
+wolde
+wolfishly
+wonderfully
+wonderingly
+wondrously
+wordlessly
+worriedly
+would
+wow
+wrongly
+wryly
+wuh
+ya
+ye
+yea
+yeah
+yearningly
+yehhh
+yes
+yesiree
+yet
+yff
+yon
+yonder
+yooee
+you
+your
+yours
+yourself
+yourselves
+yow
+ys
+yuh
+zealously
+zero
+zoooop
+zounds
Index: /main/tags/2.38/gsdl/etc/packages/phind/stopword/fr/JASIS.sw
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/phind/stopword/fr/JASIS.sw	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/phind/stopword/fr/JASIS.sw	(revision 21083)
@@ -0,0 +1,215 @@
+a
+afin
+ai
+ainsi
+aprÃšs
+attendu
+au
+aujourd
+auquel
+aussi
+autre
+autres
+aux
+auxquelles
+auxquels
+avait
+avant
+avec
+avoir
+c
+car
+ce
+ceci
+cela
+celle
+celles
+celui
+cependant
+certain
+certaine
+certaines
+certains
+ces
+cet
+cette
+ceux
+chez
+ci
+combien
+comme
+comment
+concernant
+contre
+d
+dans
+de
+debout
+dedans
+dehors
+delÃ 
+depuis
+derriÃšre
+des
+desquelles
+desquels
+dessous
+dessus
+devant
+devers
+devra
+divers
+diverse
+diverses
+doit
+donc
+dont
+du
+duquel
+durant
+dÃšs
+elle
+elles
+en
+entre
+environ
+est
+et
+etc
+etre
+eux
+exceptÃ©
+hormis
+hors
+hui
+hÃ©las
+il
+ils
+j
+je
+jusqu
+jusque
+l
+la
+laquelle
+le
+lequel
+les
+lesquelles
+lesquels
+leur
+leurs
+lorsque
+lui
+lÃ 
+ma
+mais
+malgrÃ©
+me
+merci
+mes
+mien
+mienne
+miennes
+miens
+moi
+moins
+mon
+moyennant
+mÃªme
+mÃªmes
+n
+ne
+ni
+non
+nos
+notre
+nous
+nÃ©anmoins
+nÃŽtre
+nÃŽtres
+on
+ou
+out
+outre
+oÃ¹
+par
+parmi
+partant
+pas
+passÃ©
+pendant
+plein
+plus
+plusieurs
+pour
+pourquoi
+proche
+prÃšs
+puisque
+qu
+quand
+que
+quel
+quelle
+quelles
+quels
+qui
+quoi
+quoique
+revoici
+revoilÃ 
+s
+sa
+sans
+sauf
+se
+selon
+seront
+ses
+si
+sien
+sienne
+siennes
+siens
+sinon
+soi
+soit
+son
+sont
+sous
+suivant
+sur
+ta
+te
+tes
+tien
+tienne
+tiennes
+tiens
+toi
+ton
+tous
+tout
+toute
+toutes
+tu
+un
+une
+va
+vers
+voici
+voilÃ 
+vos
+votre
+vous
+vu
+vÃŽtre
+vÃŽtres
+y
+Ã 
+Ã§a
+Ãšs
+Ã©tÃ©
+Ãªtre
+ÃŽ
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.gen
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.gen	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.gen	(revision 21083)
@@ -0,0 +1,215 @@
+# RTF ANSI character set (\ansi) general map
+# These are taken from the ISO-Latin-1 (ISO-8859-1) encodings, with
+# a few additions
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+# jrm21 - ie, given the input in field 2, what name do we use for it?
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+equal		=
+greater		>
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII characters (128-255)
+null		0x80
+
+nobrkspace	0xa0
+exclamdown	0xa1
+cent		0xa2
+sterling	0xa3
+currency	0xa4
+yen		0xa5
+brokenbar	0xa6
+section		0xa7
+dieresis	0xa8
+copyright	0xa9
+ordfeminine	0xaa
+guillemotleft	0xab
+logicalnot	0xac
+opthyphen	0xad
+registered	0xae
+macron		0xaf
+degree		0xb0
+plusminus	0xb1
+twosuperior	0xb2
+threesuperior	0xb3
+acute		0xb4
+mu		0xb5
+paragraph	0xb6
+periodcentered	0xb7
+cedilla		0xb8
+onesuperior	0xb9
+ordmasculine	0xba
+guillemotright	0xbb
+onequarter	0xbc
+onehalf		0xbd
+threequarters	0xbe
+questiondown	0xbf
+Agrave		0xc0
+Aacute		0xc1
+Acircumflex	0xc2
+Atilde		0xc3
+Adieresis	0xc4
+Aring		0xc5
+AE		0xc6
+Ccedilla	0xc7
+Egrave		0xc8
+Eacute		0xc9
+Ecircumflex	0xca
+Edieresis	0xcb
+Igrave		0xcc
+Iacute		0xcd
+Icircumflex	0xce
+Idieresis	0xcf
+Eth		0xd0
+Ntilde		0xd1
+Ograve		0xd2
+Oacute		0xd3
+Ocircumflex	0xd4
+Otilde		0xd5
+Odieresis	0xd6
+multiply	0xd7
+Oslash		0xd8
+Ugrave		0xd9
+Uacute		0xda
+Ucircumflex	0xdb
+Udieresis	0xdc
+Yacute		0xdd
+Thorn		0xde
+germandbls	0xdf
+agrave		0xe0
+aacute		0xe1
+acircumflex	0xe2
+atilde		0xe3
+adieresis	0xe4
+aring		0xe5
+ae		0xe6
+ccedilla	0xe7
+egrave		0xe8
+eacute		0xe9
+ecircumflex	0xea
+edieresis	0xeb
+igrave		0xec
+iacute		0xed
+icircumflex	0xee
+idieresis	0xef
+eth		0xf0
+ntilde		0xf1
+ograve		0xf2
+oacute		0xf3
+ocircumflex	0xf4
+otilde		0xf5
+odieresis	0xf6
+divide		0xf7
+oslash		0xf8
+ugrave		0xf9
+uacute		0xfa
+ucircumflex	0xfb
+udieresis	0xfc
+yacute		0xfd
+thorn		0xfe
+ydieresis	0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.sym
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.sym	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/ansi.sym	(revision 21083)
@@ -0,0 +1,114 @@
+# RTF ANSI character set (\ansi) Symbol font map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+universal	'"'
+mathnumbersign	#
+existential	$
+percent		%
+ampersand	&
+suchthat	"'"
+parenleft	(
+parenright	)
+mathasterisk	*
+mathplus	+
+comma		,
+mathminus	-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+mathequal	=
+greater		>
+question	?
+congruent	@
+Alpha		A
+Beta		B
+Chi		C
+Delta		D
+Epsilon		E
+Phi		F
+Gamma		G
+Eta		H
+Iota		I
+# J		J
+Kappa		K
+Lambda		L
+Mu		M
+Nu		N
+Omicron		O
+Pi		P
+Theta		Q
+Rho		R
+Sigma		S
+Tau		T
+Upsilon		U
+varsigma	V
+Omega		W
+Xi		X
+Psi		Y
+Zeta		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+alpha		a
+beta		b
+chi		c
+delta		d
+epsilon		e
+phi		f
+gamma		g
+eta		h
+iota		i
+# j		j
+kappa		k
+lambda		l
+mu		m
+nu		n
+omicron		o
+pi		p
+theta		q
+rho		r
+sigma		s
+tau		t
+upsilon		u
+# xxx		v
+omega		w
+xi		x
+psi		y
+zeta		z
+braceleft	{
+bar		|
+braceright	}
+mathtilde	~
+
+# non-ASCII characters (128-255)
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.gen
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.gen	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.gen	(revision 21083)
@@ -0,0 +1,244 @@
+# RTF Windows Codepage-1252 character set (\ansi) general map
+# Note (jrm21) - this is basically a modified version of the ANSI map.
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# printable characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "	# 0x20
+exclam		!	# 0x21
+quotedbl	'"'	# 0x22
+numbersign	#	# 0x23
+dollar		$	# 0x24
+percent		%	# 0x25
+ampersand	&	# 0x26
+quoteright	"'"	# 0x27
+parenleft	(	# 0x28
+parenright	)	# 0x29
+asterisk	*	# 0x2a
+plus		+	# 0x2b
+comma		,	# 0x2c
+hyphen		-	# 0x2d
+period		.	# 0x2e
+slash		/	# 0x2f
+zero		0	# 0x30
+one		1	# 0x31
+two		2	# 0x32
+three		3	# 0x33
+four		4	# 0x34
+five		5	# 0x35
+six		6	# 0x36
+seven		7	# 0x37
+eight		8	# 0x38
+nine		9	# 0x39
+colon		:	# 0x3a
+semicolon	;	# 0x3b
+less		<	# 0x3c
+equal		=	# 0x3d
+greater		>	# 0x3e
+question	?	# 0x3f
+at		@	# 0x40
+A		A	# 0x41
+B		B	# 0x42
+C		C	# 0x43
+D		D	# 0x44
+E		E	# 0x45
+F		F	# 0x46
+G		G	# 0x47
+H		H	# 0x48
+I		I	# 0x49
+J		J	# 0x4a
+K		K	# 0x4b
+L		L	# 0x4c
+M		M	# 0x4d
+N		N	# 0x4e
+O		O	# 0x4f
+P		P	# 0x50
+Q		Q	# 0x51
+R		R	# 0x52
+S		S	# 0x53
+T		T	# 0x54
+U		U	# 0x55
+V		V	# 0x56
+W		W	# 0x57
+X		X	# 0x58
+Y		Y	# 0x59
+Z		Z	# 0x5a
+bracketleft	[	# 0x5b
+backslash	\	# 0x5c
+bracketright	]	# 0x5d
+asciicircum	^	# 0x5e
+underscore	_	# 0x5f
+quoteleft	"`"	# 0x60
+a		a	# 0x61
+b		b	# 0x62
+c		c	# 0x63
+d		d	# 0x64
+e		e	# 0x65
+f		f	# 0x66
+g		g	# 0x67
+h		h	# 0x68
+i		i	# 0x69
+j		j	# 0x6a
+k		k	# 0x6b
+l		l	# 0x6c
+m		m	# 0x6d
+n		n	# 0x6e
+o		o	# 0x6f
+p		p	# 0x70
+q		q	# 0x71
+r		r	# 0x72
+s		s	# 0x73
+t		t	# 0x74
+u		u	# 0x75
+v		v	# 0x76
+w		w	# 0x77
+x		x	# 0x78
+y		y	# 0x79
+z		z	# 0x7a
+braceleft	{	# 0x7b
+bar		|	# 0x7c
+braceright	}	# 0x7d
+asciitilde	~	# 0x7e
+# undefined (delete)	# 0x7f
+
+# non-ASCII characters (128-255)
+euro		0x80
+# undefined	0x81
+quotesinglbase	0x82 # single low-9 quotation mark
+florin		0x83 # f with hook (fnof) ## not sure if florin is right...
+quotedblbase	0x84 # double low-9 quotation mark
+ellipsis	0x85
+dagger		0x86
+daggerdbl	0x87
+circumflex	0x88 # modifier
+perthousand	0x89
+Scaron		0x8a
+guilsinglleft	0x8b
+OE		0x8c # OE ligature
+# undefined	0x8d
+Zcaron		0x8e
+# undefined	0x8f
+# undefined	0x90
+quoteleft	0x91 # single quote left - use ascii for now
+quoteright	0x92 # single quote right - use ascii for now
+quotedblleft	0x93
+quotedblright	0x94
+bullet		0x95
+endash		0x96
+emdash		0x97
+asciitilde	0x98 # use ascii tilde
+trademark	0x99
+scaron		0x9a
+guilsinglright	0x9b # single rightpointing quotemark
+oe		0x9c
+# undefined	0x9d
+zcaron		0x9e
+Ydieresis	0x9f # Y with diaeresis
+nobrkspace	0xa0
+exclamdown	0xa1
+cent		0xa2
+sterling	0xa3
+currency	0xa4
+yen		0xa5
+brokenbar	0xa6
+section		0xa7
+dieresis	0xa8
+copyright	0xa9
+ordfeminine	0xaa
+guillemotleft	0xab
+logicalnot	0xac
+opthyphen	0xad
+registered	0xae
+macron		0xaf
+degree		0xb0
+plusminus	0xb1
+twosuperior	0xb2
+threesuperior	0xb3
+acute		0xb4
+mu		0xb5
+paragraph	0xb6
+periodcentered	0xb7
+cedilla		0xb8
+onesuperior	0xb9
+ordmasculine	0xba
+guillemotright	0xbb
+onequarter	0xbc
+onehalf		0xbd
+threequarters	0xbe
+questiondown	0xbf
+Agrave		0xc0
+Aacute		0xc1
+Acircumflex	0xc2
+Atilde		0xc3
+Adieresis	0xc4
+Aring		0xc5
+AE		0xc6
+Ccedilla	0xc7
+Egrave		0xc8
+Eacute		0xc9
+Ecircumflex	0xca
+Edieresis	0xcb
+Igrave		0xcc
+Iacute		0xcd
+Icircumflex	0xce
+Idieresis	0xcf
+Eth		0xd0
+Ntilde		0xd1
+Ograve		0xd2
+Oacute		0xd3
+Ocircumflex	0xd4
+Otilde		0xd5
+Odieresis	0xd6
+multiply	0xd7
+Oslash		0xd8
+Ugrave		0xd9
+Uacute		0xda
+Ucircumflex	0xdb
+Udieresis	0xdc
+Yacute		0xdd
+Thorn		0xde
+germandbls	0xdf
+agrave		0xe0
+aacute		0xe1
+acircumflex	0xe2
+atilde		0xe3
+adieresis	0xe4
+aring		0xe5
+ae		0xe6
+ccedilla	0xe7
+egrave		0xe8
+eacute		0xe9
+ecircumflex	0xea
+edieresis	0xeb
+igrave		0xec
+iacute		0xed
+icircumflex	0xee
+idieresis	0xef
+eth		0xf0
+ntilde		0xf1
+ograve		0xf2
+oacute		0xf3
+ocircumflex	0xf4
+otilde		0xf5
+odieresis	0xf6
+divide		0xf7
+oslash		0xf8
+ugrave		0xf9
+uacute		0xfa
+ucircumflex	0xfb
+udieresis	0xfc
+yacute		0xfd
+thorn		0xfe
+ydieresis	0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.sym
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.sym	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/cpg1252.sym	(revision 21083)
@@ -0,0 +1,221 @@
+# RTF ANSI character set (\ansi) general map
+# These are taken from the ISO-Latin-1 (ISO-8859-1) encodings, with
+# a few additions
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# jrm21 - the character name is used when outputting a particular character
+# code. This name is then looked up in the *-gen file to see what to output
+# for that symbol name. It's a bit round-about...
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+equal		=
+greater		>
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII characters (128-255)
+#ellipsis		0x85
+#dagger		0x86
+#daggerdbl	0x87
+
+nobrkspace	0xa0
+exclamdown	0xa1
+cent		0xa2
+sterling	0xa3
+currency	0xa4
+yen		0xa5
+brokenbar	0xa6
+section		0xa7
+dieresis	0xa8
+copyright	0xa9
+ordfeminine	0xaa
+guillemotleft	0xab
+logicalnot	0xac
+opthyphen	0xad
+registered	0xae
+macron		0xaf
+degree		0xb0
+plusminus	0xb1
+twosuperior	0xb2
+threesuperior	0xb3
+acute		0xb4
+mu		0xb5
+paragraph	0xb6
+periodcentered	0xb7
+#asterisk	0xb7
+cedilla		0xb8
+onesuperior	0xb9
+ordmasculine	0xba
+guillemotright	0xbb
+onequarter	0xbc
+onehalf		0xbd
+threequarters	0xbe
+questiondown	0xbf
+Agrave		0xc0
+Aacute		0xc1
+Acircumflex	0xc2
+Atilde		0xc3
+Adieresis	0xc4
+Aring		0xc5
+AE		0xc6
+Ccedilla	0xc7
+Egrave		0xc8
+Eacute		0xc9
+Ecircumflex	0xca
+Edieresis	0xcb
+Igrave		0xcc
+Iacute		0xcd
+Icircumflex	0xce
+Idieresis	0xcf
+Eth		0xd0
+Ntilde		0xd1
+Ograve		0xd2
+Oacute		0xd3
+Ocircumflex	0xd4
+Otilde		0xd5
+Odieresis	0xd6
+multiply	0xd7
+Oslash		0xd8
+Ugrave		0xd9
+Uacute		0xda
+Ucircumflex	0xdb
+Udieresis	0xdc
+Yacute		0xdd
+Thorn		0xde
+germandbls	0xdf
+agrave		0xe0
+aacute		0xe1
+acircumflex	0xe2
+atilde		0xe3
+adieresis	0xe4
+aring		0xe5
+ae		0xe6
+ccedilla	0xe7
+egrave		0xe8
+eacute		0xe9
+ecircumflex	0xea
+edieresis	0xeb
+igrave		0xec
+iacute		0xed
+icircumflex	0xee
+idieresis	0xef
+eth		0xf0
+ntilde		0xf1
+ograve		0xf2
+oacute		0xf3
+ocircumflex	0xf4
+otilde		0xf5
+odieresis	0xf6
+divide		0xf7
+oslash		0xf8
+ugrave		0xf9
+uacute		0xfa
+ucircumflex	0xfb
+udieresis	0xfc
+yacute		0xfd
+thorn		0xfe
+ydieresis	0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-map
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-map	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-map	(revision 21083)
@@ -0,0 +1,265 @@
+# Output sequence map for rtftohtml
+
+# Field 1 is the standard character name.  Field 2 is the output sequence
+# to produce for that character.
+
+# The output sequence is simply a string of characters.  If it contains
+# whitespace, it may be quoted.  If it contains quotes, it may be quoted
+# with a different quote character.
+
+null		''
+# characters in ASCII range (32-127)
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&amp;
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+onesuperior	&sup1;
+two		2
+twosuperior	&sup2;
+three		3
+threesuperior	&sup3;
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		&lt;
+equal		=
+greater		&gt;
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII
+# use HTML 4.0 entity names where practical
+# starting at decimal code 160
+nobrkspace	&nbsp;
+# inverted exclamation mark 161
+cent		&cent;
+sterling	&pound;
+currency	&curren;
+yen		&yen;
+#netscape will only do this in utf-8: brokenbar	&brvbar;
+brokenbar	|
+section		&sect;
+# uml / diaeresis = 168
+copyright	&copy;
+copyrightsans	&copy;
+
+
+# Latin Extended-A
+OE		&OElig;
+oe		&oelig;
+Scaron		&Scaron;
+scaron		&scaron;
+Ydieresis	&Yuml;
+
+acute		"'"
+angleleft	[
+angleright	&gt;
+approxequal	~
+arrowboth	&lt;-&gt;
+arrowdblboth	&lt;=&gt;
+arrowdblleft	&lt;=
+arrowdblright	=&gt;
+arrowleft	&lt;-
+arrowright	-&gt;
+#bullet		*
+bullet		&middot;
+circumflex	^
+# next 2 have named entities, which netscape 4 doesn't use...
+# unicode &#8224; and &#8225;
+dagger		&#134;
+daggerdbl	&#135;
+
+degree		&deg;
+delta		d
+divide		&divide;
+dotlessi	i
+ellipsis	...
+# next 2 have named entities, which netscape 4 doesn't use...
+endash		&#150;
+emdash		&#151;
+euro		&euro;
+fi		fi
+fl		fl
+fraction	/
+grave		"`"
+greaterequal	&gt;=
+# &#171; # was &lt;&lt;
+guillemotleft	&laquo;
+# &#187; # was &gt;&gt;
+guillemotright	&raquo;
+# netscape 4.7 doesn't do this? - unicode: &#2039; or &lsaquo;
+guilsinglleft	&lt;
+# ditto? unicode: &#203A; or &rsaquo;
+guilsinglright	&gt;
+lessequal	&lt;=
+logicalnot	&not;
+mathasterisk	*
+mathequal	=
+mathminus	-
+mathnumbersign	'#'
+mathplus	+
+mathtilde	~
+minus		-
+mu		&micro;
+multiply	&times;
+nobrkhyphen	-
+
+notequal	!=
+onehalf		&frac12;
+onequarter	&frac14;
+periodcentered	&middot;
+plusminus	&plusmn;
+quotedblbase	,,
+quotedblleft	'"'
+quotedblright	'"'
+quotesinglbase	,
+registered	&reg;
+registersans	&reg;
+threequarters	&frac34;
+tilde		~
+trademark	&trade;
+AE		&AElig;
+Aacute      &Aacute;
+Acircumflex &Acirc;
+Agrave      &Agrave;
+Aring       &Aring;
+Atilde		&Atilde;
+Adieresis	&Auml;
+Ccedilla	&Ccedil;
+#ETH		&ETH;
+Eacute	&Eacute;
+Ecircumflex	&Ecirc;
+Egrave	&Egrave;
+Edieresis	&Euml;
+Iacute	&Iacute;
+Icircumflex	&Icirc;
+Igrave	&Igrave;
+Idieresis	&Iuml;
+Ntilde	&Ntilde;
+Oacute	&Oacute;
+Ocircumflex	&Ocirc;
+Ograve	&Ograve;
+Oslash	&Oslash;
+#Otilde	&Otilde;
+Odieresis	&Ouml;
+#THORN	&THORN;
+Uacute	&Uacute;
+Ucircumflex	&Ucirc;
+Ugrave	&Ugrave;
+Udieresis	&Uuml;
+#Yacute	&Yacute;
+ae		&aelig;
+aacute	&aacute;
+acircumflex	&acirc;
+agrave	&agrave;
+aring	&aring;
+atilde	&atilde;
+adieresis	&auml;
+ccedilla	&ccedil;
+eacute	&eacute;
+ecircumflex	&ecirc;
+egrave	&egrave;
+#eth	&eth;
+edieresis	&euml;
+iacute	&iacute;
+icircumflex	&icirc;
+igrave	&igrave;
+idieresis	&iuml;
+ntilde	&ntilde;
+oacute	&oacute;
+ocircumflex	&ocirc;
+ograve	&ograve;
+oslash	&oslash;
+otilde	&otilde;
+odieresis	&ouml;
+germandbls	&szlig;
+#thorn	&thorn;
+uacute	&uacute;
+ucircumflex	&ucirc;
+ugrave	&ugrave;
+udieresis	&uuml;
+yacute	&yacute;
+ydieresis	&yuml;
+newline	<br>
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-trn
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-trn	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/html-trn	(revision 21083)
@@ -0,0 +1,214 @@
+# Starting with rtftohtml 2.7, all html-trans files have a version number
+# The version number must appear before any other tables.
+.Version,3
+
+# Paragraph Style Tags table
+# Format:
+#"name","starttag","endtag","col2mark","tabmark","parmark",allowtext,cannest,DeleteCol1,fold,TocStyl
+.PTag
+"Normal","","\n","\t","\t","<p>\n",1,0,0,1,0
+"h1","<h1>\n","</h1>\n","\t","\t","<br>\n",0,0,0,1,1
+"h2","<h2>\n","</h2>\n","\t","\t","<br>\n",0,0,0,1,2
+"h3","<h3>\n","</h3>\n","\t","\t","<br>\n",0,0,0,1,3
+"h4","<h4>\n","</h4>\n","\t","\t","<br>\n",0,0,0,1,4
+"h5","<h5>\n","</h5>\n","\t","\t","<br>\n",0,0,0,1,5
+"h6","<h6>\n","</h6>\n","\t","\t","<br>\n",0,0,0,1,6
+"ul","<ul>\n<li>","</ul>","\t","\t","\n<li>",1,1,0,1,0
+"ul-d","<ul>\n<li>","</ul>","\t","\t","\n<li>",1,1,1,1,0
+"ol","<ol>\n<li>","</ol>","\t","\t","\n<li>",1,1,0,1,0
+"ol-d","<ol>\n<li>","</ol>","\t","\t","\n<li>",1,1,1,1,0
+"dl","<dl>\n<dt>","</dl>","\n<dd>","\t","\n<dt>",1,1,0,1,0
+"TERM","<dl>\n<dt>","</dl>","\t","\t","\n<dt>",1,1,0,1,0
+"DEF","<dd>","","\t","\t","\n<br>",1,1,0,1,0
+"dir","<dir>\n<li>","</dir>","\n<li>","\n<li>","\n<li>",0,1,0,1,0
+"menu","<menu>\n<li>","</menu>\n","\n<li>","\n<li>","\n<li>",0,1,0,1,0
+"address","<address>","</address>\n","\t","\t","<br>\n",1,0,0,1,0
+"pre","\n<pre>\n","\n</pre>\n","\t","\t","\n",0,0,0,0,0
+"blockquote","<blockquote>","</blockquote>","\t","\t","\n",1,0,0,1,0
+"hr","<hr>","","","","",1,0,0,1,0
+# This is a required entry; tables will be formatted with this entry
+"_Table","\n<pre>\n","\n</pre>\n","\t","\t","\n",0,0,0,0,0
+
+# Text STyle Tags table
+# Format
+# "name","Starttag","Endtag"
+.TTag
+"b","<b>","</b>"
+"i","<i>","</i>"
+"u","<u>","</u>"
+"em","<em>","</em>"
+"cite","<cite>","</cite>"
+"tt","<tt>","</tt>"
+"strong","<strong>","</strong>"
+"code","<code>","</code>"
+"samp","<samp>","</samp>"
+"kbd","<kbd>","</kbd>"
+"var","<var>","</var>"
+"dfn","<dfn>","</dfn>"
+"sup","<sup>","</sup>"
+
+# Text Match Table
+# Format:
+# "Font",FontSize,Match,Mask,"TextStyleName"
+# "" is don't care for fonts
+# 0 is don't care for font size
+# Special names for TextStyleName
+# _Discard - text will not be output
+# _Name    - text will be used for an named anchor
+# _HRef    - text is an href
+# _Hot     - end of this text marks the end of hot text
+# _Literal - text is sent thorough without any translation
+# The order of bits for match and mask is:
+#    v^bDWUHACSOTIB - Bold
+#    v^bDWUHACSOTI - Italic
+#    v^bDWUHACSOT - StrikeThrough
+#    v^bDWUHACSO - Outline
+#    v^bDWUHACS - Shadow
+#    v^bDWUHAC - SmallCaps
+#    v^bDWUHA - AllCaps
+#    v^bDWUH - Hidden
+#    v^bDWU - Underline
+#    v^bDW - Word Underline
+#    v^bD - Dotted Underline
+#    v^b - Double Underline
+#    v^ - SuperScript
+#    v - SubScript
+#    v^bDWUIACSOTIB
+.TMatch
+#
+# First do specials, because they are higher priority than other matches
+# 
+# double-underline/not hidden -> hot text
+# double-underline/hidden -> href
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00100000000000,00100010000000,"_Hot"
+"",0,00100010000000,00100010000000,"_HRef"
+
+# hidden/shadow -> literal
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00000010010000,00000010010000,"_Literal"
+
+# hidden/outline -> Name
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00000010001000,00000010001000,"_Name"
+
+# hidden/all other hiddens are discarded
+"",0,00000010000000,00000010000000,"_Discard"
+
+# All other Superscripts just superscripts
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,01000000000000,01000000000000,"sup"
+
+# Regular matches - You can have multiple of these active
+
+# monospace fonts -> tt
+"Courier",0,00000000000000,00000000000000,"tt"
+"Monoco",0,00000000000000,00000000000000,"tt"
+
+# bold -> bold
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00000000000001,00000000000001,"b"
+
+# italic/underline -> cite, italic/nounderline -> italic
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00000000000010,00000100000010,"i"
+"",0,00000100000010,00000100000010,"cite"
+
+# any underline without italic -> underline
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00010000000000,00111100000010,"u"
+"",0,00001000000000,00111100000010,"u"
+"",0,00000100000000,00111100000010,"u"
+"",0,00100000000000,00111100000010,"u"
+
+# outline,shadow -> em
+#    v^bDWUHACSOTIB,v^bDWUHACSOTIB
+"",0,00000000001000,00000000001000,"em"
+"",0,00000000010000,00000000010000,"em"
+
+
+# Format:
+# "Paragraph Style",NestLevel,"ParagraphStyleName"
+# First Entry is the default if no style match. Should be level 0 
+# point to a Paragraph style with no markup
+.PMatch
+"Normal",0,"Normal"
+# This is a required entry; tables will be formatted with this entry
+"_Table",0,"_Table"
+"heading 1",0,"h1"
+"heading 2",0,"h2"
+"heading 3",0,"h3"
+"heading 4",0,"h4"
+"heading 5",0,"h5"
+"heading 6",0,"h6"
+"ol",0,"ol"
+"ol 1",1,"ol"
+"ol 2",2,"ol"
+"ol 3",3,"ol"
+"ol 4",4,"ol"
+"ol 5",5,"ol"
+"ul",0,"ul"
+"ul 1",1,"ul"
+"ul 2",2,"ul"
+"ul 3",3,"ul"
+"ul 4",4,"ul"
+"ul 5",5,"ul"
+"numbered list",0,"ol-d"
+"numbered list 1",1,"ol-d"
+"numbered list 2",2,"ol-d"
+"numbered list 3",3,"ol-d"
+"numbered list 4",4,"ol-d"
+"numbered list 5",5,"ol-d"
+"bullet list",0,"ul-d"
+"bullet list 1",1,"ul-d"
+"bullet list 2",2,"ul-d"
+"bullet list 3",3,"ul-d"
+"bullet list 4",4,"ul-d"
+"bullet list 5",5,"ul-d"
+"dir",0,"dir"
+"dir 1",1,"dir"
+"dir 2",2,"dir"
+"dir 3",3,"dir"
+"dir 4",4,"dir"
+"dir 5",5,"dir"
+"small gloss",0,"dl"
+"small gloss 1",1,"dl"
+"small gloss 2",2,"dl"
+"small gloss 3",3,"dl"
+"small gloss 4",4,"dl"
+"small gloss 5",5,"dl"
+"glossary",0,"dl"
+"glossary 1",1,"dl"
+"glossary 2",2,"dl"
+"glossary 3",3,"dl"
+"glossary 4",4,"dl"
+"glossary 5",5,"dl"
+"menu",0,"menu"
+"menu 1",1,"menu"
+"menu 2",2,"menu"
+"menu 3",3,"menu"
+"menu 4",4,"menu"
+"menu 5",5,"menu"
+"pre",0,"pre"
+"blockquote",0,"blockquote"
+"address",0,"address"
+"hr",0,"hr"
+# the following paragraph styles will be discarded
+"toc 1",0,"_Discard"
+"toc 2",0,"_Discard"
+"toc 3",0,"_Discard"
+"toc 4",0,"_Discard"
+"toc 5",0,"_Discard"
+"index 1",0,"_Discard"
+"index 2",0,"_Discard"
+"index 3",0,"_Discard"
+"index 4",0,"_Discard"
+"index 5",0,"_Discard"
+"TERM",0,"TERM"
+"DEF",1,"DEF"
+"TERM 1",1,"TERM"
+"DEF 1",2,"DEF"
+"TERM 2",2,"TERM"
+"DEF 2",3,"DEF"
+"HTML",0,"_Literal"
+"footnote text",0,"Normal"
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.gen
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.gen	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.gen	(revision 21083)
@@ -0,0 +1,243 @@
+# RTF Macintosh character set (\mac) general map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+equal		=
+greater		>
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII characters (128-255)
+
+# ?? Ygrave		0x07
+# ?? yacute		0x08
+Adieresis	0x80
+Aring		0x81
+Ccedilla	0x82
+Eacute		0x83
+Ntilde		0x84
+Odieresis	0x85
+Udieresis	0x86
+aacute		0x87
+agrave		0x88
+acircumflex	0x89
+adieresis	0x8a
+atilde		0x8b
+aring		0x8c
+ccedilla	0x8d
+eacute		0x8e
+egrave		0x8f
+ecircumflex	0x90
+edieresis	0x91
+iacute		0x92
+igrave		0x93
+icircumflex	0x94
+idieresis	0x95
+ntilde		0x96
+oacute		0x97
+ograve		0x98
+ocircumflex	0x99
+odieresis	0x9a
+otilde		0x9b
+uacute		0x9c
+ugrave		0x9d
+ucircumflex	0x9e
+udieresis	0x9f
+dagger		0xa0
+degree		0xa1
+cent		0xa2
+sterling	0xa3
+section		0xa4
+bullet		0xa5
+paragraph	0xa6
+germandbls	0xa7
+registered	0xa8
+copyright	0xa9
+trademark	0xaa
+acute		0xab
+dieresis	0xac
+notequal	0xad
+AE		0xae
+Oslash		0xaf
+infinity	0xb0
+plusminus	0xb1
+lessequal	0xb2
+greaterequal	0xb3
+yen		0xb4
+mu		0xb5
+partialdiff	0xb6
+Sigma		0xb7
+Pi		0xb8
+pi		0xb9
+integral	0xba
+ordfeminine	0xbb
+ordmasculine	0xbc
+Omega		0xbd
+ae		0xbe
+oslash		0xbf
+questiondown	0xc0
+exclamdown	0xc1
+logicalnot	0xc2
+radical		0xc3
+florin		0xc4
+approxequal	0xc5
+Delta		0xc6
+guillemotleft	0xc7
+guillemotright	0xc8
+ellipsis	0xc9
+nobrkspace	0xca
+Agrave		0xcb
+OE		0xce
+oe		0xcf
+endash		0xd0
+emdash		0xd1
+quotedblleft	0xd2
+quotedblright	0xd3
+quoteleft	0xd4
+quoteright	0xd5
+divide		0xd6
+lozenge		0xd7
+ydieresis	0xd8
+Ydieresis	0xd9
+fraction	0xda
+currency	0xdb
+guilsinglleft	0xdc
+guilsinglright	0xdd
+fi		0xde
+fl		0xdf
+daggerdbl	0xe0
+periodcentered	0xe1
+quotesinglbase	0xe2
+quotedblbase	0xe3
+perthousand	0xe4
+Acircumflex	0xe5
+Ecircumflex	0xe6
+Aacute		0xe7
+Edieresis	0xe8
+Egrave		0xe9
+Iacute		0xea
+Icircumflex	0xeb
+Idieresis	0xec
+Igrave		0xed
+Oacute		0xee
+Ocircumflex	0xef
+apple		0xf0
+Ograve		0xf1
+Uacute		0xf2
+Ucircumflex	0xf3
+Ugrave		0xf4
+dotlessi	0xf5
+circumflex	0xf6
+tilde		0xf7
+macron		0xf8
+breve		0xf9
+dotaccent	0xfa
+ring		0xfb
+cedilla		0xfc
+hungarumlaut	0xfd
+ogonek		0xfe
+caron		0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.sym
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.sym	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/mac.sym	(revision 21083)
@@ -0,0 +1,241 @@
+# RTF Macintosh character set (\mac) Symbol font map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+universal	'"'
+mathnumbersign	#
+existential	$
+percent		%
+ampersand	&
+suchthat	"'"
+parenleft	(
+parenright	)
+mathasterisk	*
+mathplus	+
+comma		,
+mathminus	-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+mathequal	=
+greater		>
+question	?
+congruent	@
+Alpha		A
+Beta		B
+Chi		C
+Delta		D
+Epsilon		E
+Phi		F
+Gamma		G
+Eta		H
+Iota		I
+# J		J
+Kappa		K
+Lambda		L
+Mu		M
+Nu		N
+Omicron		O
+Pi		P
+Theta		Q
+Rho		R
+Sigma		S
+Tau		T
+Upsilon		U
+varsigma	V
+Omega		W
+Xi		X
+Psi		Y
+Zeta		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+alpha		a
+beta		b
+chi		c
+delta		d
+epsilon		e
+phi		f
+gamma		g
+eta		h
+iota		i
+# j		j
+kappa		k
+lambda		l
+mu		m
+nu		n
+omicron		o
+pi		p
+theta		q
+rho		r
+sigma		s
+tau		t
+upsilon		u
+# xxx		v
+omega		w
+xi		x
+psi		y
+zeta		z
+braceleft	{
+bar		|
+braceright	}
+mathtilde	~
+
+# non-ASCII characters (128-255)
+
+# Adieresis	0x80
+# Aring		0x81
+# Ccedilla	0x82
+# Eacute	0x83
+# Ntilde	0x84
+# Odieresis	0x85
+# Udieresis	0x86
+# aacute	0x87
+# agrave	0x88
+# acircumflex	0x89
+# adieresis	0x8a
+# atilde	0x8b
+# aring		0x8c
+# ccedilla	0x8d
+# eacute	0x8e
+# egrave	0x8f
+# ecircumflex	0x90
+# edieresis	0x91
+# iacute	0x92
+# igrave	0x93
+# icircumflex	0x94
+# idieresis	0x95
+# ntilde	0x96
+# oacute	0x97
+# ograve	0x98
+# ocircumflex	0x99
+# odieresis	0x9a
+# otilde	0x9b
+# uacute	0x9c
+# ugrave	0x9d
+# ucircumflex	0x9e
+# udieresis	0x9f
+# dagger	0xa0
+# degree	0xa1
+minute		0xa2
+lessequal	0xa3
+fraction	0xa4
+infinity	0xa5
+florin		0xa6
+club		0xa7
+diamond		0xa8
+heart		0xa9
+spade		0xaa
+arrowboth	0xab
+arrowleft	0xac
+arrowup		0xad
+arrowright	0xae
+arrowdown	0xaf
+degree		0xb0
+plusminus	0xb1
+second		0xb2
+greaterequal	0xb3
+multiply	0xb4
+proportional	0xb5
+partialdiff	0xb6
+bullet		0xb7
+divide		0xb8
+notequal	0xb9
+equivalence	0xba
+approxequal	0xbb
+ellipsis	0xbc
+arrowvertex	0xbd
+arrowhorizex	0xbe
+carriagereturn	0xbf
+aleph		0xc0
+Ifraktur	0xc1
+Rfraktur	0xc2
+weierstrass	0xc3
+circlemultiply	0xc4
+circleplus	0xc5
+emptyset	0xc6
+intersection	0xc7
+union		0xc8
+propersuperset	0xc9
+reflexsuperset	0xca
+notsubset	0xcb
+propersubset	0xce
+reflexsubset	0xcf
+angle		0xd0
+gradient	0xd1
+registered	0xd2
+copyright	0xd3
+trademark	0xd4
+product		0xd5
+radical		0xd6
+periodcentered	0xd7
+logicalnot	0xd8
+logicaland	0xd9
+logicalor	0xda
+arrowdblboth	0xdb
+arrowdblleft	0xdc
+arrowdblup	0xdd
+arrowdblright	0xde
+arrowdbldown	0xdf
+lozenge		0xe0
+angleleft	0xe1
+registersans	0xe2
+copyrightsans	0xe3
+trademarksans	0xe4
+Sigma		0xe5
+# Ecircumflex	0xe6
+# Aacute	0xe7
+# Edieresis	0xe8
+# Egrave	0xe9
+# Iacute	0xea
+# Icircumflex	0xeb
+# Idieresis	0xec
+# Igrave	0xed
+# Oacute	0xee
+# Ocircumflex	0xef
+apple		0xf0
+angleright	0xf1
+# Uacute	0xf2
+# Ucircumflex	0xf3
+# Ugrave	0xf4
+# dotlessi	0xf5
+# circumflex	0xf6
+# tilde		0xf7
+# macron	0xf8
+# breve		0xf9
+# dotaccent	0xfa
+# ring		0xfb
+# cedilla	0xfc
+# hungarumlaut	0xfd
+# ogonek	0xfe
+# caron		0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.gen
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.gen	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.gen	(revision 21083)
@@ -0,0 +1,243 @@
+# RTF PC character set (\pc) general map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (32-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+equal		=
+greater		>
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII characters (128-255)
+
+Ccedilla	0x80
+udieresis	0x81
+eacute		0x82
+acircumflex	0x83
+adieresis	0x84
+agrave		0x85
+aring		0x86
+ccedilla	0x87
+ecircumflex	0x88
+edieresis	0x89
+egrave		0x8a
+idieresis	0x8b
+icircumflex	0x8c
+igrave		0x8d
+Adieresis	0x8e
+Aring		0x8f
+Eacute		0x90
+ae		0x91
+AE		0x92
+ocircumflex	0x93
+odieresis	0x94
+ograve		0x95
+ucircumflex	0x96
+ugrave		0x97
+ydieresis	0x98
+Odieresis	0x99
+Udieresis	0x9a
+cent		0x9b
+sterling	0x9c
+yen		0x9d
+ucircumflex	0x9e
+florin		0x9f
+aacute		0xa0
+iacute		0xa1
+oacute		0xa2
+uacute		0xa3
+ntilde		0xa4
+Ntilde		0xa5
+ordfeminine	0xa6
+ordmasculine	0xa7
+questiondown	0xa8
+copyright	0xa9
+trademark	0xaa
+acute		0xab
+dieresis	0xac
+exclamdown	0xad
+guillemotleft	0xae
+guillemotright	0xaf
+space		0xb0
+plusminus	0xb1
+lessequal	0xb2
+bar		0xb3
+yen		0xb4
+mu		0xb5
+partialdiff	0xb6
+Sigma		0xb7
+Pi		0xb8
+pi		0xb9
+integral	0xba
+ordfeminine	0xbb
+ordmasculine	0xbc
+Omega		0xbd
+ae		0xbe
+logicalnot	0xbf
+questiondown	0xc0
+exclamdown	0xc1
+logicalnot	0xc2
+radical		0xc3
+emdash		0xc4
+approxequal	0xc5
+delta		0xc6
+guillemotleft	0xc7
+guillemotright	0xc8
+ellipsis	0xc9
+nobrkspace	0xca
+Agrave		0xcb
+Atilde		0xcc
+Otilde		0xcd
+OE		0xce
+oe		0xcf
+endash		0xd0
+emdash		0xd1
+quotedblleft	0xd2
+quotedblright	0xd3
+quoteleft	0xd4
+quoteright	0xd5
+divide		0xd6
+lozenge		0xd7
+ydieresis	0xd8
+Ydieresis	0xd9
+fraction	0xda
+Ydieresis	0xdb
+guilsinglleft	0xdc
+greater		0xdd
+less		0xde
+fl		0xdf
+a		0xe0
+germandbls	0xe1
+quotesinglbase	0xe2
+pi		0xe3
+Sigma		0xe4
+Acircumflex	0xe5
+mu		0xe6
+Aacute		0xe7
+Edieresis	0xe8
+Egrave		0xe9
+Omega		0xea
+partialdiff	0xeb
+infinity	0xec
+oslash		0xed
+e		0xee
+Ocircumflex	0xef
+equal		0xf0
+plusminus	0xf1
+greaterequal	0xf2
+lessequal	0xf3
+integral	0xf4
+integral	0xf5
+divide		0xf6
+approxequal	0xf7
+degree		0xf8
+bullet		0xf9
+bullet		0xfa
+radical		0xfb
+cedilla		0xfc
+hungarumlaut	0xfd
+ogonek		0xfe
+nobrkspace	0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.sym
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.sym	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/pc.sym	(revision 21083)
@@ -0,0 +1,115 @@
+# RTF PC character set (\pc) Symbol font map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+universal	'"'
+mathnumbersign	#
+existential	$
+percent		%
+ampersand	&
+suchthat	"'"
+parenleft	(
+parenright	)
+mathasterisk	*
+mathplus	+
+comma		,
+mathminus	-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+mathequal	=
+greater		>
+question	?
+congruent	@
+Alpha		A
+Beta		B
+Chi		C
+Delta		D
+Epsilon		E
+Phi		F
+Gamma		G
+Eta		H
+Iota		I
+# J		J
+Kappa		K
+Lambda		L
+Mu		M
+Nu		N
+Omicron		O
+Pi		P
+Theta		Q
+Rho		R
+Sigma		S
+Tau		T
+Upsilon		U
+varsigma	V
+Omega		W
+Xi		X
+Psi		Y
+Zeta		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+alpha		a
+beta		b
+chi		c
+delta		d
+epsilon		e
+phi		f
+gamma		g
+eta		h
+iota		i
+# j		j
+kappa		k
+lambda		l
+mu		m
+nu		n
+omicron		o
+pi		p
+theta		q
+rho		r
+sigma		s
+tau		t
+upsilon		u
+# xxx		v
+omega		w
+xi		x
+psi		y
+zeta		z
+braceleft	{
+bar		|
+braceright	}
+mathtilde	~
+
+# non-ASCII characters (128-255)
+
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.gen
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.gen	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.gen	(revision 21083)
@@ -0,0 +1,244 @@
+# RTF PC-A character set (\pca) general map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (32-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+quotedbl	'"'
+numbersign	#
+dollar		$
+percent		%
+ampersand	&
+quoteright	"'"
+parenleft	(
+parenright	)
+asterisk	*
+plus		+
+comma		,
+hyphen		-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+equal		=
+greater		>
+question	?
+at		@
+A		A
+B		B
+C		C
+D		D
+E		E
+F		F
+G		G
+H		H
+I		I
+J		J
+K		K
+L		L
+M		M
+N		N
+O		O
+P		P
+Q		Q
+R		R
+S		S
+T		T
+U		U
+V		V
+W		W
+X		X
+Y		Y
+Z		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+a		a
+b		b
+c		c
+d		d
+e		e
+f		f
+g		g
+h		h
+i		i
+j		j
+k		k
+l		l
+m		m
+n		n
+o		o
+p		p
+q		q
+r		r
+s		s
+t		t
+u		u
+v		v
+w		w
+x		x
+y		y
+z		z
+braceleft	{
+bar		|
+braceright	}
+asciitilde	~
+
+# non-ASCII characters (128-255)
+
+
+Ccedilla	0x80
+udieresis	0x81
+eacute		0x82
+acircumflex	0x83
+adieresis	0x84
+agrave		0x85
+aring		0x86
+ccedilla	0x87
+ecircumflex	0x88
+edieresis	0x89
+egrave		0x8a
+idieresis	0x8b
+icircumflex	0x8c
+igrave		0x8d
+Adieresis	0x8e
+Aring		0x8f
+Eacute		0x90
+ae		0x91
+AE		0x92
+ocircumflex	0x93
+odieresis	0x94
+ograve		0x95
+ucircumflex	0x96
+ugrave		0x97
+ydieresis	0x98
+Odieresis	0x99
+Udieresis	0x9a
+oslash		0x9b
+sterling	0x9c
+Oslash		0x9d
+# ???		0x9e
+florin		0x9f
+aacute		0xa0
+iacute		0xa1
+oacute		0xa2
+uacute		0xa3
+ntilde		0xa4
+Ntilde		0xa5
+ordfeminine	0xa6
+ordmasculine	0xa7
+questiondown	0xa8
+registered	0xa9
+logicalnot	0xaa
+# ???		0xab
+# ???		0xac
+exclamdown	0xad
+guillemotleft	0xae
+guillemotright	0xaf
+# ???		0xb0
+# ???		0xb1
+# ???		0xb2
+# ???		0xb3
+# ???		0xb4
+# ???		0xb5
+# ???		0xb6
+Agrave		0xb7
+copyright	0xb8
+# ???		0xb9
+# ???		0xba
+# ???		0xbb
+# ???		0xbc
+cent		0xbd
+yen		0xbe
+# ???		0xbf
+# ???		0xc0
+# ???		0xc1
+# ???		0xc2
+# ???		0xc3
+# ???		0xc4
+# ???		0xc5
+atilde		0xc6
+Atilde		0xc7
+# ???		0xc8
+# ???		0xc9
+# ???		0xca
+# ???		0xcb
+# ???		0xcc
+# ???		0xcd
+# ???		0xce
+# ???		0xcf
+partialdiff	0xd0
+# ???		0xd1
+# ???		0xd2
+# ???		0xd3
+# ???		0xd4
+# ???		0xd5
+# ???		0xd6
+# ???		0xd7
+# ???		0xd8
+# ???		0xd9
+# ???		0xda
+# ???		0xdb
+# ???		0xdc
+# ???		0xdd
+# ???		0xde
+# ???		0xdf
+# ???		0xe0
+germandbls	0xe1
+# ???		0xe2
+# ???		0xe3
+otilde		0xe4
+Otilde		0xe5
+mu		0xe6
+# ???		0xe7
+# ???		0xe8
+# ???		0xe9
+# ???		0xea
+# ???		0xeb
+# ???		0xec
+# ???		0xed
+# ???		0xee
+acute		0xef
+endash		0xf0
+plusminus	0xf1
+equal		0xf2
+# ???		0xf3
+paragraph	0xf4
+section		0xf5
+divide		0xf6
+# ???		0xf7
+degree		0xf8
+dieresis	0xf9
+bullet		0xfa
+# ???		0xfb
+# ???		0xfc
+# ???		0xfd
+# ???		0xfe
+nobrkspace	0xff
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.sym
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.sym	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/pca.sym	(revision 21083)
@@ -0,0 +1,115 @@
+# RTF PC-A character set (\pca) Symbol font map
+
+# Field 1 is the standard character name which the character value in
+# field 2 maps onto.  (It doesn't mean "to produce the character in field 1,
+# use the value in field 2.)
+
+# The character value may be given either as a single character (which will be
+# converted to the ASCII value of the character), or in numeric format, either
+# in decimal or 0xyy as hex yy.  Single or double quotes may be used to quote
+# characters.
+
+# characters in ASCII range (00-127)
+
+formula		0x06
+nobrkhyphen	0x1e
+opthyphen	0x1f
+
+space		" "
+exclam		!
+universal	'"'
+mathnumbersign	#
+existential	$
+percent		%
+ampersand	&
+suchthat	"'"
+parenleft	(
+parenright	)
+mathasterisk	*
+mathplus	+
+comma		,
+mathminus	-
+period		.
+slash		/
+zero		0
+one		1
+two		2
+three		3
+four		4
+five		5
+six		6
+seven		7
+eight		8
+nine		9
+colon		:
+semicolon	;
+less		<
+mathequal	=
+greater		>
+question	?
+congruent	@
+Alpha		A
+Beta		B
+Chi		C
+Delta		D
+Epsilon		E
+Phi		F
+Gamma		G
+Eta		H
+Iota		I
+# J		J
+Kappa		K
+Lambda		L
+Mu		M
+Nu		N
+Omicron		O
+Pi		P
+Theta		Q
+Rho		R
+Sigma		S
+Tau		T
+Upsilon		U
+varsigma	V
+Omega		W
+Xi		X
+Psi		Y
+Zeta		Z
+bracketleft	[
+backslash	\
+bracketright	]
+asciicircum	^
+underscore	_
+quoteleft	"`"
+alpha		a
+beta		b
+chi		c
+delta		d
+epsilon		e
+phi		f
+gamma		g
+eta		h
+iota		i
+# j		j
+kappa		k
+lambda		l
+mu		m
+nu		n
+omicron		o
+pi		p
+theta		q
+rho		r
+sigma		s
+tau		t
+upsilon		u
+# xxx		v
+omega		w
+xi		x
+psi		y
+zeta		z
+braceleft	{
+bar		|
+braceright	}
+mathtilde	~
+
+# non-ASCII characters (128-255)
+
Index: /main/tags/2.38/gsdl/etc/packages/rtftohtm/rtf-ctrl
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/rtftohtm/rtf-ctrl	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/rtftohtm/rtf-ctrl	(revision 21083)
@@ -0,0 +1,769 @@
+# number of control words
+766
+# control word table
+6 0 "vern"
+6 5 "edmins"
+6 6 "yr"
+6 7 "mo"
+6 8 "dy"
+6 9 "hr"
+6 10 "min"
+6 11 "sec"
+6 12 "nofpages"
+6 13 "nofwords"
+6 14 "nofchars"
+6 15 "id"
+6 16 "chdate"
+6 17 "chdpl"
+6 18 "chdpa"
+6 19 "chtime"
+6 20 "chpgn"
+6 21 "sectnum"
+6 22 "chftn"
+6 23 "chatn"
+6 24 "chftnsep"
+6 25 "chftnsepc"
+6 26 "cell"
+6 27 "row"
+6 28 "par"
+6 28 "\n"
+6 28 "\r"
+6 29 "sect"
+6 30 "page"
+6 31 "column"
+6 32 "line"
+6 33 "softpage"
+6 34 "softcol"
+6 35 "softline"
+6 36 "softlheight"
+6 37 "tab"
+6 38 "emdash"
+6 39 "endash"
+6 40 "emspace"
+6 41 "enspace"
+6 42 "bullet"
+6 43 "lquote"
+6 44 "rquote"
+6 45 "ldblquote"
+6 46 "rdblquote"
+6 47 "|"
+6 49 "~"
+6 50 "-"
+6 51 "_"
+6 52 "*"
+6 53 "ltrmark"
+6 54 "rtlmark"
+6 55 "zwj"
+6 56 "zwnj"
+6 57 "chpict"
+6 59 "version"
+12 0 "plain"
+12 1 "b"
+12 2 "caps"
+12 37 "cgrid"
+12 3 "deleted"
+12 4 "dn"
+12 5 "sub"
+12 6 "nosupersub"
+12 7 "expnd"
+12 8 "expndtw"
+12 9 "kerning"
+12 38 "langfe"
+12 39 "langfenp"
+12 35 "lang"
+12 40 "langnp"
+12 10 "f"
+12 11 "fs"
+12 12 "i"
+12 13 "outl"
+12 14 "revised"
+12 15 "revauth"
+12 16 "revdttm"
+12 17 "scaps"
+12 18 "shad"
+12 19 "strike"
+12 20 "ul"
+12 21 "uld"
+12 22 "uldb"
+12 23 "ulnone"
+12 24 "ulw"
+12 25 "up"
+12 26 "super"
+12 27 "v"
+12 28 "cf"
+12 29 "cb"
+12 30 "rtlch"
+12 31 "ltrch"
+12 32 "noproof"
+12 33 "cs"
+12 34 "cchs"
+12 36 "gray"
+11 0 "pard"
+11 1 "s"
+11 2 "hyphpar"
+11 3 "intbl"
+11 104 "itap"
+11 4 "keep"
+11 6 "keepn"
+11 7 "level"
+11 8 "noline"
+11 5 "nowidctlpar"
+11 105 "widctlpar"
+11 7 "outlinelevel"
+11 9 "pagebb"
+11 10 "sbys"
+11 11 "ql"
+11 12 "qr"
+11 13 "qj"
+11 14 "qc"
+11 15 "fi"
+11 16 "li"
+11 16 "lin"
+11 17 "ri"
+11 17 "rin"
+11 17 "curi"
+11 106 "adjustright"
+11 18 "sb"
+11 19 "sa"
+11 20 "sl"
+11 21 "slmult"
+11 22 "subdocument"
+11 23 "rtlpar"
+11 24 "ltrpar"
+11 25 "tx"
+11 26 "tql"
+11 27 "tqr"
+11 28 "tqc"
+11 29 "tqdec"
+11 30 "tb"
+11 31 "tldot"
+11 32 "tlhyph"
+11 33 "tlul"
+11 34 "tlth"
+11 35 "tleq"
+11 36 "pnlvl"
+11 37 "pnlvlblt"
+11 38 "pnlvlbody"
+11 39 "pnlvlcont"
+11 40 "pnnumonce"
+11 41 "pnacross"
+11 42 "pnhang"
+11 43 "pnrestart"
+11 44 "pncard"
+11 45 "pndec"
+11 46 "pnucltr"
+11 47 "pnucrm"
+11 48 "pnlcltr"
+11 49 "pnlcrm"
+11 50 "pnord"
+11 51 "pnordt"
+11 52 "pnb"
+11 53 "pni"
+11 54 "pncaps"
+11 55 "pnscaps"
+11 56 "pnul"
+11 57 "pnuld"
+11 58 "pnuldb"
+11 59 "pnulnone"
+11 60 "pnulw"
+11 61 "pnstrike"
+11 62 "pncf"
+11 63 "pnf"
+11 64 "pnfs"
+11 65 "pnindent"
+11 66 "pnsp"
+11 67 "pnprev"
+11 68 "pnqc"
+11 69 "pnql"
+11 70 "pnqr"
+11 71 "pnstart"
+11 72 "brdrt"
+11 73 "brdrb"
+11 74 "brdrl"
+11 75 "brdrr"
+11 76 "brdrbtw"
+11 77 "brdrbar"
+11 78 "box"
+11 79 "brdrs"
+11 80 "brdrth"
+11 81 "brdrsh"
+11 82 "brdrdb"
+11 83 "brdrdot"
+11 83 "brdrdash"
+11 85 "brdrhair"
+11 86 "brdrw"
+11 87 "brdrcf"
+11 88 "brsp"
+11 89 "shading"
+11 90 "bghoriz"
+11 91 "bgvert"
+11 92 "bgfdiag"
+11 93 "bgbdiag"
+11 94 "bgcross"
+11 95 "bgdcross"
+11 96 "bgdkhoriz"
+11 97 "bgdkvert"
+11 98 "bgdkfdiag"
+11 99 "bgdkbdiag"
+11 100 "bgdkcross"
+11 101 "bgdkdcross"
+11 102 "cfpat"
+11 103 "cbpat"
+11 39 "ls"
+11 40 "ilvl"
+9 0 "sectd"
+9 1 "endnhere"
+9 2 "binfsxn"
+9 3 "binsxn"
+9 4 "ds"
+9 5 "sbknone"
+9 6 "sbkcol"
+9 7 "sbkpage"
+9 8 "sbkeven"
+9 9 "sbkodd"
+9 10 "cols"
+9 11 "colsx"
+9 12 "colno"
+9 13 "colsr"
+9 14 "colw"
+9 15 "linebetcol"
+9 16 "linemod"
+9 17 "linex"
+9 18 "linestarts"
+9 19 "linerestart"
+9 20 "lineppage"
+9 21 "linecont"
+9 22 "pgwsxn"
+9 23 "pghsxn"
+9 24 "marglsxn"
+9 25 "margrsxn"
+9 26 "margtsxn"
+9 27 "margbsxn"
+9 28 "guttersxn"
+9 29 "lndscpsxn"
+9 30 "titlepg"
+9 31 "headery"
+9 32 "footery"
+9 33 "pgnstarts"
+9 34 "pgncont"
+9 35 "pgnrestart"
+9 36 "pgnx"
+9 37 "pgny"
+9 38 "pgndec"
+9 39 "pgnucrm"
+9 40 "pgnlcrm"
+9 41 "pgnucltr"
+9 42 "pgnlcltr"
+9 43 "pgnhnsh"
+9 44 "pgnhnsp"
+9 45 "pgnhnsc"
+9 46 "pgnhnsm"
+9 47 "pgnhnsn"
+9 48 "vertalt"
+9 49 "vertalb"
+9 50 "vertalc"
+9 51 "vertalj"
+9 52 "rtlsect"
+9 53 "ltrsect"
+9 54 "horzsect"
+9 55 "vertsect"
+9 100 "sectexpand"
+9 100 "sectlinegrid"
+9 100 "sectdefaultcl"
+9 100 "sectspecifycl"
+9 100 "sectspecifyl"
+9 100 "sectspecifygen"
+9 56 "pgnhn"
+9 57 "sectunlocked"
+8 160 "uc"
+8 0 "deftab"
+8 1 "hyphhotz"
+8 2 "hyphconsec"
+8 3 "hyphcaps"
+8 4 "hyphauto"
+8 5 "linestart"
+8 6 "fracwidth"
+8 7 "makeback"
+8 7 "makebackup"
+8 8 "defformat"
+8 9 "psover"
+8 10 "doctemp"
+8 11 "deflang"
+8 150 "deflangfe"
+8 151 "windowcaption"
+8 152 "doctype"
+8 153 "fromtext"
+8 154 "fromhtml"
+8 155 "horzdoc"
+8 156 "vertdoc"
+8 157 "jcompress"
+8 158 "jexpand"
+8 159 "lnongrid"
+8 78 "viewkind"
+8 79 "viewscale"
+8 79 "viewzk"
+8 12 "fet"
+8 13 "endnotes"
+8 14 "enddoc"
+8 15 "ftntj"
+8 16 "ftnbj"
+8 17 "aendnotes"
+8 18 "aenddoc"
+8 19 "aftntj"
+8 20 "aftnbj"
+8 21 "ftnstart"
+8 22 "aftnstart"
+8 23 "ftnrstpg"
+8 24 "ftnrestart"
+8 25 "ftnrstcont"
+8 26 "aftnrestart"
+8 27 "aftnrstcont"
+8 28 "ftnnar"
+8 29 "ftnnalc"
+8 30 "ftnnauc"
+8 31 "ftnnrlc"
+8 32 "ftnnruc"
+8 33 "ftnnchi"
+8 34 "aftnnar"
+8 35 "aftnnalc"
+8 36 "aftnnauc"
+8 37 "aftnnrlc"
+8 38 "aftnnruc"
+8 39 "aftnnchi"
+8 40 "paperw"
+8 41 "paperh"
+8 42 "psz"
+8 43 "margl"
+8 44 "margr"
+8 45 "margt"
+8 46 "margb"
+8 47 "facingp"
+8 48 "gutter"
+8 49 "margmirror"
+8 50 "landscape"
+8 51 "pgnstart"
+8 52 "widowctrl"
+8 53 "linkstyles"
+8 54 "notabind"
+8 55 "wraptrsp"
+8 56 "prcolbl"
+8 57 "noextrasprl"
+8 58 "nocolbal"
+8 59 "cvmme"
+8 60 "sprstsp"
+8 61 "sprsspbf"
+8 62 "otblrul"
+8 63 "transmf"
+8 64 "swpbdr"
+8 65 "brkfrm"
+8 82 "formprot"
+8 83 "allprot"
+8 84 "formshade"
+8 85 "formdisp"
+8 86 "printdata"
+8 87 "revprot"
+8 88 "revisions"
+8 89 "revprop"
+8 90 "revbar"
+8 91 "annotprot"
+8 92 "rtldoc"
+8 93 "ltrdoc"
+8 94 "cts"
+8 95 "dghspace"
+8 96 "dgvspace"
+8 97 "dghorigin"
+8 98 "dgvorigin"
+8 99 "dghshow"
+8 100 "dgvshow"
+8 101 "dgsnap"
+8 102 "dgmargin"
+8 103 "pgbrdrhead"
+8 104 "pgbrdrfoot"
+8 105 "aspalpha"
+8 106 "aspnum"
+8 107 "faauto"
+8 66 "truncex"
+8 67 "bdbfhdr"
+8 68 "dntblnsbdb"
+8 69 "expshrtn"
+8 70 "lytexcttp"
+8 71 "lytprtmet"
+8 72 "msmcap"
+8 73 "nolead"
+8 74 "nospaceforul"
+8 75 "noultrlspc"
+8 76 "noxlattoyen"
+8 77 "oldas"
+8 78 "lnbrkrule"
+8 79 "bdrrlswsix"
+8 81 "sprstsm"
+8 80 "nolnhtadjtbl"
+7 0 "additive"
+7 1 "sbasedon"
+7 2 "snext"
+7 3 "sautoupd"
+13 32 "emfblip"
+13 33 "pngblip"
+13 34 "jpegblip"
+13 36 "nonshppict"
+13 0 "macpict"
+13 1 "pmmetafile"
+13 2 "wmetafile"
+13 3 "dibitmap"
+13 4 "wbitmap"
+13 5 "wbmbitspixel"
+13 6 "wbmplanes"
+13 7 "wbmwidthbytes"
+13 8 "picw"
+13 9 "pich"
+13 10 "picwgoal"
+13 11 "pichgoal"
+13 10 "picwGoal"
+13 11 "pichGoal"
+13 12 "picscalex"
+13 13 "picscaley"
+13 14 "picscaled"
+13 15 "piccropt"
+13 16 "piccropb"
+13 17 "piccropl"
+13 18 "piccropr"
+13 19 "picbmp"
+13 20 "picbpp"
+13 21 "bin"
+13 22 "blipupi"
+13 24 "bliptag"
+15 0 "width"
+15 1 "height"
+3 0 "fonttbl"
+3 1 "falt"
+3 2 "fonteb"
+3 3 "fontfile"
+3 4 "filetbl"
+3 5 "file"
+3 6 "colortbl"
+3 7 "stylesheet"
+3 8 "keycode"
+3 9 "revtbl"
+3 10 "info"
+3 11 "title"
+3 12 "subject"
+3 13 "author"
+3 14 "operator"
+3 15 "keywords"
+3 16 "comment"
+3 18 "doccomm"
+3 19 "verscomm"
+3 20 "nextfile"
+3 21 "template"
+3 22 "ftnsep"
+3 23 "ftnsepc"
+3 24 "ftncn"
+3 25 "aftnsep"
+3 26 "aftnsepc"
+3 27 "aftncn"
+3 29 "pnseclvl"
+3 30 "header"
+3 31 "footer"
+3 32 "headerl"
+3 33 "headerr"
+3 34 "headerf"
+3 35 "footerl"
+3 36 "footerr"
+3 37 "footerf"
+3 38 "pntext"
+3 39 "pn"
+3 40 "pntxta"
+3 41 "pntxtb"
+3 42 "bkmkstart"
+3 43 "bkmkend"
+3 44 "pict"
+3 45 "object"
+3 46 "objclass"
+3 47 "objname"
+3 48 "objtime"
+3 49 "objdata"
+3 50 "objalias"
+3 51 "objsect"
+3 53 "objitem"
+3 54 "objtopic"
+3 52 "result"
+3 55 "do"
+3 56 "footnote"
+3 57 "atrfstart"
+3 58 "atrfend"
+3 59 "atnid"
+3 60 "atnauthor"
+3 61 "annotation"
+3 62 "atnref"
+3 63 "atntime"
+3 64 "atnicn"
+3 65 "field"
+3 66 "fldinst"
+3 67 "fldrslt"
+3 68 "datafield"
+3 69 "xe"
+3 70 "txe"
+3 71 "rxe"
+3 72 "tc"
+3 73 "NeXTGraphic"
+3 74 "NeXTHelpMarker"
+3 28 "NeXTHelpLink"
+3 75 "buptim"
+3 76 "creatim"
+3 77 "printim"
+3 78 "revtim"
+3 79 "dptxbxtext"
+3 80 "fontemb"
+3 81 "tcn"
+3 35 "shppict"
+3 41 "listtext"
+3 79 "private"
+3 82 "shpgrp"
+4 0 "fnil"
+4 1 "froman"
+4 2 "fswiss"
+4 3 "fmodern"
+4 4 "fscript"
+4 5 "fdecor"
+4 6 "ftech"
+4 7 "fbidi"
+23 0 "fcharset"
+23 1 "fprq"
+23 2 "cpg"
+23 3 "ftnil"
+23 4 "fttruetype"
+24 0 "fid"
+24 1 "frelative"
+24 2 "fosnum"
+25 0 "fvalidmac"
+25 1 "fvaliddos"
+25 2 "fvalidntfs"
+25 3 "fvalidhpfs"
+25 4 "fnetwork"
+5 0 "red"
+5 1 "green"
+5 2 "blue"
+2 2 "mac"
+2 0 "ansi"
+2 3 "pc"
+2 4 "pca"
+2 1 "ansicpg"
+10 0 "trowd"
+10 1 "trgaph"
+10 2 "cellx"
+10 3 "clmgf"
+10 4 "clmrg"
+10 5 "trql"
+10 6 "trqr"
+10 7 "trqc"
+10 8 "trleft"
+10 9 "trrh"
+10 10 "trhdr"
+10 11 "trkeep"
+10 12 "rtlrow"
+10 13 "ltrrow"
+10 14 "trbrdrt"
+10 15 "trbrdrl"
+10 16 "trbrdrb"
+10 17 "trbrdrr"
+10 18 "trbrdrh"
+10 19 "trbrdrv"
+10 20 "clbrdrb"
+10 21 "clbrdrt"
+10 22 "clbrdrl"
+10 23 "clbrdrr"
+10 42 "clvertalt"
+10 43 "clvertalc"
+10 44 "clvertalb"
+10 45 "cltxlrtb"
+10 46 "cltxlbrl"
+10 24 "clshdng"
+10 25 "clbghoriz"
+10 26 "clbgvert"
+10 27 "clbgfdiag"
+10 28 "clbgbdiag"
+10 29 "clbgcross"
+10 30 "clbgdcross"
+10 31 "clbgdkhoriz"
+10 31 "clbgdkhor"
+10 32 "clbgdkvert"
+10 33 "clbgdkfdiag"
+10 34 "clbgdkbdiag"
+10 35 "clbgdkcross"
+10 36 "clbgdkdcross"
+10 37 "clcfpat"
+10 38 "clcbpat"
+16 0 "flddirty"
+16 1 "fldedit"
+16 2 "fldlock"
+16 3 "fldpriv"
+16 4 "fldalt"
+18 0 "absw"
+18 1 "absh"
+18 2 "phmrg"
+18 3 "phpg"
+18 4 "phcol"
+18 5 "posx"
+18 6 "posnegx"
+18 7 "posxc"
+18 8 "posxi"
+18 9 "posxo"
+18 10 "posxr"
+18 11 "posxl"
+18 12 "pvmrg"
+18 13 "pvpg"
+18 14 "pvpara"
+18 15 "posy"
+18 16 "posnegy"
+18 17 "posyil"
+18 18 "posyt"
+18 19 "posyc"
+18 20 "posyb"
+18 21 "nowrap"
+18 22 "dxfrtext"
+18 23 "dfrmtxtx"
+18 24 "dfrmtxty"
+18 25 "dyfrtext"
+18 26 "dropcapli"
+18 27 "dropcapt"
+19 0 "objemb"
+19 1 "objlink"
+19 2 "objautlink"
+19 3 "objsub"
+19 4 "objpub"
+19 5 "objicemb"
+19 6 "linkself"
+19 7 "objupdate"
+19 8 "objlock"
+19 9 "objh"
+19 10 "objw"
+19 11 "objsetsize"
+19 12 "objalign"
+19 13 "objtransy"
+19 14 "objcropt"
+19 15 "objcropb"
+19 16 "objcropl"
+19 17 "objcropr"
+19 18 "objscalex"
+19 19 "objscaley"
+19 20 "rsltrtf"
+19 21 "rsltpict"
+19 22 "rsltbmp"
+19 23 "rslttxt"
+19 24 "rsltmerge"
+19 25 "bkmkpub"
+19 26 "pubauto"
+22 0 "ab"
+22 1 "acaps"
+22 2 "acf"
+22 3 "adn"
+22 4 "aexpnd"
+22 5 "af"
+22 6 "afs"
+22 7 "ai"
+22 8 "alang"
+22 9 "aoutl"
+22 10 "ascaps"
+22 11 "ashad"
+22 12 "astrike"
+22 13 "aul"
+22 14 "auld"
+22 15 "auldb"
+22 16 "aulnone"
+22 17 "aulw"
+22 18 "aup"
+20 0 "ftnalt"
+21 0 "alt"
+21 1 "shift"
+21 2 "ctrl"
+21 3 "fn"
+14 0 "bkmkcolf"
+14 1 "bkmkcoll"
+27 0 "xef"
+27 1 "bxe"
+27 2 "ixe"
+17 0 "tcf"
+17 1 "tcl"
+26 0 "dolock"
+26 1 "dobxpage"
+26 2 "dobxcolumn"
+26 3 "dobxmargin"
+26 4 "dobypage"
+26 6 "dobymargin"
+26 7 "dodhgt"
+26 8 "dpgroup"
+26 9 "dpcount"
+26 10 "dpendgroup"
+26 11 "dparc"
+26 12 "dpcallout"
+26 13 "dpellipse"
+26 14 "dpline"
+26 15 "dppolygon"
+26 16 "dppolyline"
+26 17 "dprect"
+26 18 "dptxbx"
+26 19 "dpx"
+26 20 "dpxsize"
+26 21 "dpy"
+26 22 "dpysize"
+26 23 "dpcoa"
+26 24 "dpcoaccent"
+26 25 "dpcobestfit"
+26 26 "dpcoborder"
+26 27 "dpcodabs"
+26 28 "dpcodbottom"
+26 29 "dpcodcenter"
+26 30 "dpcodtop"
+26 31 "dpcolength"
+26 32 "dpcominusx"
+26 33 "dpcominusy"
+26 34 "dpcooffset"
+26 35 "dpcosmarta"
+26 36 "dpcotdouble"
+26 37 "dpcotright"
+26 38 "dpcotsingle"
+26 39 "dpcottriple"
+26 40 "dptxbxmar"
+26 42 "dproundr"
+26 43 "dpptx"
+26 44 "dppty"
+26 45 "dppolycount"
+26 46 "dparcflipx"
+26 47 "dparcflipy"
+26 48 "dplinecob"
+26 49 "dplinecog"
+26 50 "dplinecor"
+26 51 "dplinepal"
+26 52 "dplinedado"
+26 53 "dplinedadodo"
+26 54 "dplinedash"
+26 55 "dplinedot"
+26 56 "dplinegray"
+26 57 "dplinehollow"
+26 58 "dplinesolid"
+26 59 "dplinew"
+26 60 "dpaendhol"
+26 61 "dpaendl"
+26 62 "dpaendsol"
+26 63 "dpaendw"
+26 64 "dpastarthol"
+26 65 "dpastartl"
+26 66 "dpastartsol"
+26 67 "dpastartw"
+26 68 "dpfillbgcb"
+26 69 "dpfillbgcg"
+26 70 "dpfillbgcr"
+26 71 "dpfillbgpal"
+26 72 "dpfillbggray"
+26 73 "dpfillfgcb"
+26 74 "dpfillfgcg"
+26 75 "dpfillfgcr"
+26 76 "dpfillfgpal"
+26 77 "dpfillfggray"
+26 78 "dpfillpat"
+26 79 "dpshadow"
+26 80 "dpshadx"
+26 81 "dpshady"
+26 82 "dobypara"
+0 -1 "rtf"
+1 -1 "deff"
Index: /main/tags/2.38/gsdl/etc/packages/wv/wvHtml.xml
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/wv/wvHtml.xml	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/wv/wvHtml.xml	(revision 21083)
@@ -0,0 +1,397 @@
+<main>
+<charentity>
+<begin>HTML</begin>
+</charentity>
+
+<document>
+<begin>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/REC-html40/loose.dtd&quot;&gt;
+&lt;html&gt; 
+&lt;head&gt; 
+&lt;META HTTP-EQUIV=&quot;Content-Type&quot; CONTENT=&quot;text/html; charset=<charset/>&quot;&gt;
+&lt;META NAME=&quot;GENERATOR&quot; CONTENT=&quot;wvWare/<version/>&quot;&gt;
+&lt;title&gt; 
+<title/>
+&lt;/title&gt; 
+&lt;/head&gt; 
+&lt;body bgcolor=&quot;#FFFFFF&quot; text=&quot;#000000&quot; link=&quot;#0000ee&quot; vlink=&quot;#551a8b&quot;&gt;
+</begin>
+<end>
+&lt;/body&gt;
+&lt;/html&gt;
+</end>
+</document>
+
+<section>
+<begin>
+&lt;!--Section Begins--&gt;&lt;br&gt;
+</begin>
+<end>
+&lt;!--Section Ends--&gt;
+</end>
+</section>
+
+<justification>
+<left>left</left>
+<right>right</right>
+<center>center</center>
+<block>justify</block>
+<asian>&lt;!--Could Someone who sees this tag tell me what was is this type of justification, asian languages only i thing--&gt;</asian>
+</justification>
+
+<numbering>
+<Arabic>type=&quot;1&quot;</Arabic>
+<UpperRoman>type=&quot;I&quot;</UpperRoman>
+<LowerRoman>type=&quot;i&quot;</LowerRoman>
+<UpperCaseN>type=&quot;A&quot;</UpperCaseN>
+<LowerCaseN>type=&quot;a&quot;</LowerCaseN>
+</numbering>
+
+<border>
+<noned>none</noned>
+<singled>solid</singled>
+<thickd>solid</thickd>
+<doubled>double</doubled>
+<number4d>double</number4d>
+<hairlined>solid</hairlined>
+<dotd>dotted</dotd>
+<dashlargegapd>dashed</dashlargegapd>
+<dotdashd>dotted</dotdashd>
+<dotdotdashd>dotted</dotdotdashd>
+<tripled>double</tripled>
+<thin-thicksmallgapd>dashed</thin-thicksmallgapd>
+<thick-thinsmallgapd>dashed</thick-thinsmallgapd>
+<thin-thick-thinsmallgapd>dashed</thin-thick-thinsmallgapd>
+<thin-thickmediumgapd>dashed</thin-thickmediumgapd>
+<thick-thinmediumgapd>dashed</thick-thinmediumgapd>
+<thin-thick-thinmediumgapd>dashed</thin-thick-thinmediumgapd>
+<thin-thicklargegapd>dashed</thin-thicklargegapd>
+<thick-thinlargegapd>dashed</thick-thinlargegapd>
+<thin-thick-thinlargegapd>dashed</thin-thick-thinlargegapd>
+<waved>solid</waved>
+<doublewaved>double</doublewaved>
+<dashsmallgapd>sashed</dashsmallgapd>
+<dashdotstrokedd>dashed</dashdotstrokedd>
+<emboss3Dd>ridge</emboss3Dd>
+<engrave3Dd>groove</engrave3Dd>
+<defaultd>ridge</defaultd>
+</border>
+
+<olist>
+<begin>&lt;ol <nfc/> start=&quot;<start/>&quot;&gt;
+</begin>
+<end>&lt;/ol&gt;</end>
+</olist>
+
+<ulist>
+<begin>&lt;ul&gt;
+</begin>
+<end>&lt;/ul&gt;</end>
+</ulist>
+
+<entry>
+<begin>&lt;li&gt;</begin>
+<end></end>
+</entry>
+
+
+<!-- 
+this tableoverride option can be used to turn off handling of
+these tags in tables, which I find is necessary for at least netscape
+-->
+<tableoverrides>
+<ParaBefore>0</ParaBefore>
+<ParaRight>0</ParaRight>
+<ParaAfter>0</ParaAfter>
+<ParaLeft>0</ParaLeft>
+<ParaLeft1>0</ParaLeft1>
+<VertMergedCells>0</VertMergedCells>
+</tableoverrides>
+
+<table>
+<begin>&lt;table width=&quot;<tablerelwidth/>%&quot; border=&quot;1&quot; cols=&quot;<no_cols/>&quot; rows=&quot;<no_rows/>&quot;&gt;</begin>
+<end>&lt;/table&gt;</end>
+</table>
+
+<row>
+<begin>&lt;tr&gt;</begin>
+<end>&lt;/tr&gt;</end>
+</row>
+
+<cell>
+<begin>&lt;td bgcolor=&quot;<cellbgcolor/>&quot; width=&quot;<cellrelwidth/>%&quot; rowspan=&quot;<rowspan/>&quot; colspan=&quot;<colspan/>&quot;&gt;</begin>
+<end>&lt;/td&gt;</end>
+</cell>
+
+<paragraph>
+<begin>
+<table.end/>
+<table.begin/>
+<row.begin/>
+<cell.begin/><olist.end/><olist.begin/><ulist.end/><ulist.begin/><entry.begin/>
+<text.begin/>
+</begin>
+<end>
+<text.end/>
+<entry.end/>
+<olist.end/>
+<ulist.end/>
+<cell.end/>
+<row.end/>
+</end>
+</paragraph>
+
+<!-- these are all the character properties that can show up in word -->
+<bold><begin>&lt;b&gt;</begin><end>&lt;/b&gt;</end></bold>
+<italic><begin>&lt;i&gt;</begin><end>&lt;/i&gt;</end></italic>
+
+<!--
+text that has been deleted and will be displayed with strikethrough when
+revision marked text is to be displayed
+
+use either this line...
+--> 
+<RMarkDel><begin>&lt;s&gt;</begin><end>&lt;/s&gt;&lt;a href=&quot;#author<ibstRMarkDel/>&quot;&gt;[Author ID<ibstRMarkDel/>: at <dttmRMarkDel/> ]&lt;/a&gt;</end></RMarkDel>
+
+<!--
+or uncomment below to make deleted text dissappear (well, become commented out)
+-->
+<!--
+<RMarkDel><begin>&lt;!-&#45;</begin><end>-&#45;&gt;</end></RMarkDel>
+-->
+
+<!-- I don't even know what outline means -->
+<outline><begin></begin><end></end></outline>
+<smallcaps><begin></begin><end></end></smallcaps>
+<caps><begin></begin><end></end></caps>
+<vanish><begin></begin><end></end></vanish>
+
+<!--If you uncomment this then the annotation text links will become commented out by html tags-->
+<!--
+<vanish><begin>&lt;!-&#45;</begin><end>-&#45;&gt;</end></vanish>
+-->
+
+<!--
+text that has been newly typed since the last time revision marks have been accepted
+and will be displayed with underline when revision marked text is to be displayed
+
+use either this line...
+-->
+<RMark><begin>&lt;u&gt;</begin><end>&lt;/u&gt;&lt;a href=&quot;#author<ibstRMark/>&quot;&gt;[Author ID<ibstRMark/>: at <dttmRMark/>]&lt;/a&gt;</end></RMark>
+
+<!--
+or uncomment below to make the underline dissappear
+-->
+<!--
+<RMark><begin></begin><end></end></RMark>
+-->
+
+
+<strike><begin>&lt;s&gt;</begin><end>&lt;/s&gt;</end></strike>
+<shadow><begin></begin><end></end></shadow>
+<lowercase><begin></begin><end></end></lowercase>
+<emboss><begin></begin><end></end></emboss>
+<imprint><begin></begin><end></end></imprint>
+<!--double strike-->
+<dstrike><begin>&lt;s&gt;</begin><end>&lt;/s&gt;</end></dstrike>
+
+<!--
+ftc's
+&
+hps
+
+keep them for font face and do that later.
+-->
+
+<super><begin>&lt;sup&gt;</begin><end>&lt;/sup&gt;</end></super>
+<sub><begin>&lt;sub&gt;</begin><end>&lt;/sub&gt;</end></sub>
+
+<singleu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></singleu>
+<wordu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></wordu>
+<doubleu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></doubleu>
+<dottedu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></dottedu>
+<hiddenu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></hiddenu>
+<thicku><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></thicku>
+<dashu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></dashu>
+<dotu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></dotu>
+<dotdashu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></dotdashu>
+<dotdotdashu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></dotdotdashu>
+<waveu><begin>&lt;u&gt;</begin><end>&lt;/u&gt;</end></waveu>
+
+<!--
+text whose properties have been changed since the last time revision marks have been accepted
+and will be displayed with a note showing the change points.
+
+use either this line (which admit it a bit scary looking, but harmless)...
+--> 
+<PropRMark><begin>&lt;a href=&quot;#author<ibstPropRMark/>&quot;&gt;-&#45;&amp;gt;&lt;/a&gt;</begin><end>&lt;a href=&quot;#author<ibstPropRMark/>&quot;&gt;[Author ID<ibstPropRMark/>: at <dttmPropRMark/>]&lt;/a&gt;</end></PropRMark>
+
+<!--
+or uncomment below to make the notes dissappear
+-->
+<!--
+<PropRMark><begin></begin><end></end></PropRMark>
+-->
+
+<!--
+<color>
+-->
+<Black><begin>Black</begin><end></end></Black>
+<Blue><begin>Blue</begin><end></end></Blue>
+<Cyan><begin>Cyan</begin><end></end></Cyan>
+<Green><begin>Green</begin><end></end></Green>
+<Magenta><begin>Magenta</begin><end></end></Magenta>
+<Red><begin>Red</begin><end></end></Red>
+<Yellow><begin>Yellow</begin><end></end></Yellow>
+<White><begin>White</begin><end></end></White>
+<DkBlue><begin>DarkBlue</begin><end></end></DkBlue>
+<DkCyan><begin>DarkCyan</begin><end></end></DkCyan>
+<DkGreen><begin>DarkGreen</begin><end></end></DkGreen>
+<DkMagenta><begin>DarkMagenta</begin><end></end></DkMagenta>
+<DkRed><begin>DarkRed</begin><end></end></DkRed>
+<DkYellow><begin>#8b8b00</begin><end></end></DkYellow>
+<DkGray><begin>DarkGray</begin><end></end></DkGray>
+<LtGray><begin>LightGrey</begin><end></end></LtGray>
+<!--
+</color>
+-->
+
+<!--
+<animation>
+-->
+<LasVegas><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></LasVegas>
+<BackgroundBlink><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></BackgroundBlink>
+<SparkleText><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></SparkleText>
+<MarchingAnts><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></MarchingAnts>
+<MarchingRedAnts><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></MarchingRedAnts>
+<Shimmer><begin>&lt;blink&gt;</begin><end>&lt;/blink&gt;</end></Shimmer>
+<!--
+</animation>
+-->
+
+<!--
+I dont understand what this one is, and ive never come across it
+
+use this sample line (which admit it a bit scary looking, but harmless)...
+-->
+<DispFldRMark><begin>&lt;a href=&quot;#author<ibstDispFldRMark/>&quot;&gt;--&amp;gt;&lt;/a&gt;</begin><end>&lt;a href=&quot;#author<ibstDispFldRMark/>&quot;&gt;[Author ID<ibstDispFldRMark/>: at <dttmDispFldRMark/> (<xstDispFldRMark/>)]&lt;/a&gt;</end></DispFldRMark>
+
+<!--
+or uncomment below to ignore it, the previous might even crash wv ?
+-->
+<!--
+<DispFldRMark><begin></begin><end></end></DispFldRMark>
+-->
+
+<animation>
+<begin><LasVegas.begin/><BackgroundBlink.begin/><SparkleText.begin/><MarchingAnts.begin/><MarchingRedAnts.begin/><Shimmer.begin/></begin>
+<end><Shimmer.end/><MarchingRedAnts.end/><MarchingAnts.end/><SparkleText.end/><BackgroundBlink.end/><LasVegas.end/></end>
+</animation>
+
+<fontstr>
+<begin>&lt;font color=&quot;<black.begin/><blue.begin/><cyan.begin/><green.begin/><magenta.begin/><red.begin/><yellow.begin/><white.begin/><dkblue.begin/><dkcyan.begin/><dkgreen.begin/><dkmagenta.begin/><dkred.begin/><dkyellow.begin/><dkgray.begin/><ltgray.begin/>&quot;&gt;</begin>
+<end><ltgray.end/><dkgray.end/><dkyellow.end/><dkred.end/><dkmagenta.end/><dkgreen.end/><dkcyan.end/><dkblue.end/><white.end/><yellow.end/><red.end/><magenta.end/><green.end/><cyan.end/><blue.end/><black.end/>&lt;/font&gt;</end>
+</fontstr>
+
+<comment>
+<begin>
+&lt;a href=&quot;#comment<ibstAnno/> &quot;&gt;-&#45;&amp;gt;&lt;/a&gt;
+</begin>
+<end>&lt;a href=&quot;#comment<ibstAnno/> &quot;&gt;[Author:<xstUsrInitl/>]&lt;/a&gt;
+</end>
+</comment>
+
+<style name="Normal">
+<character>
+<begin><PropRMark.begin/><DispFldRMark.begin/><animation.begin/><fontstr.begin/><bold.begin/><italic.begin/><strike.begin/><RMarkDel.begin/><outline.begin/><smallcaps.begin/><caps.begin/><vanish.begin/><RMark.begin/><shadow.begin/><lowercase.begin/><emboss.begin/><imprint.begin/><dstrike.begin/><super.begin/><sub.begin/><singleu.begin/><wordu.begin/><doubleu.begin/><dottedu.begin/><hiddenu.begin/><thicku.begin/><dashu.begin/><dotu.begin/><dotdashu.begin/><dotdotdashu.begin/><waveu.begin/></begin>
+<end><waveu.end/><dotdotdashu.end/><dotdashu.end/><dotu.end/><dashu.end/><thicku.end/><hiddenu.end/><dottedu.end/><doubleu.end/><wordu.end/><singleu.end/><sub.end/><super.end/><dstrike.end/><imprint.end/><emboss.end/><lowercase.end/><shadow.end/><RMark.end/><vanish.end/><caps.end/><smallcaps.end/><outline.end/><RMarkDel.end/><strike.end/><italic.end/><bold.end/><fontstr.end/><animation.end/><DispFldRMark.end/><PropRMark.end/></end>
+</character>
+
+<!-- Netscape does handle this correctly yet, here is how each different side of the border should work.
+border-top: thin <bordertopstyle/> <bordertopcolor/>;
+border-left: thin <borderleftstyle/> <borderleftcolor/>;
+border-right: thin <borderrightstyle/> <borderrightcolor/>;
+border-bottom: thin <borderbottomstyle/> <borderbottomcolor/>
+-->
+
+
+<pmargin>
+<begin>margin: <mmParaBefore/> <mmParaRight/> <mmParaAfter/> <mmParaLeft/>;</begin>
+</pmargin>
+
+<pborder>
+<begin>
+border: thin <borderleftstyle/> <borderleftcolor/>;
+<!--
+border-top: thin <bordertopstyle/> <bordertopcolor/>;
+border-left: thin <borderleftstyle/> <borderleftcolor/>;
+border-right: thin <borderrightstyle/> <borderrightcolor/>;
+border-bottom: thin <borderbottomstyle/> <borderbottomcolor/>
+-->
+</begin>
+</pborder>
+
+<text>	
+<begin>
+&lt;div align=&quot;<just/>&quot; style=&quot;<paramargin/> <paraborder/>
+padding: <mmPadTop/> <mmPadRight/> <mmPadBottom/> <mmPadLeft/>; &quot;&gt;
+&lt;p style=&quot;text-indent: <mmParaLeft1/>; text-align: <just/>; color: <parafgcolor/>; background-color: <parabgcolor/>; &quot;&gt;
+</begin>
+<end>
+&lt;/p&gt;
+&lt;/div&gt;
+</end>
+</text>
+
+<picture>
+<begin>
+&lt;img <htmlAlignGuess/> width=&quot;<pixPicWidth/>&quot; height=&quot;<pixPicHeight/>&quot; alt=&quot;0x01 graphic&quot; src=&quot;placeholder.png&quot;&gt;<htmlNextLineGuess/>
+</begin>
+</picture>
+
+</style>
+
+<!--we need to be override the character properties-->
+<!--
+<style name="Normal">
+<character>
+<begin><PropRMark.begin/><DispFldRMark.begin/><animation.begin/><fontstr.begin/><bold.begin/><italic.begin/><strike.begin/><RMarkDel.begin/><outline.begin/><smallcaps.begin/><caps.begin/><vanish.begin/><RMark.begin/><shadow.begin/><lowercase.begin/><emboss.begin/><imprint.begin/><dstrike.begin/><super.begin/><sub.begin/><singleu.begin/><wordu.begin/><doubleu.begin/><dottedu.begin/><hiddenu.begin/><thicku.begin/><dashu.begin/><dotu.begin/><dotdashu.begin/><dotdotdashu.begin/><waveu.begin/></begin>
+<end><waveu.end/><dotdotdashu.end/><dotdashu.end/><dotu.end/><dashu.end/><thicku.end/><hiddenu.end/><dottedu.end/><doubleu.end/><wordu.end/><singleu.end/><sub.end/><super.end/><dstrike.end/><imprint.end/><emboss.end/><lowercase.end/><shadow.end/><RMark.end/><vanish.end/><caps.end/><smallcaps.end/><outline.end/><RMarkDel.end/><strike.end/><italic.end/><bold.end/><fontstr.end/><animation.end/><DispFldRMark.end/><PropRMark.end/></end>
+</character>
+
+<text>	
+<begin>
+&lt;div align=&quot;<just/>&quot;&gt;
+&lt;p&gt;
+</begin>
+<end>
+&lt;/p&gt;
+&lt;/div&gt;
+</end>
+</text>
+
+</style>
+
+<style name="Heading 1">
+
+<character>
+<begin></begin>
+<end></end>
+</character>
+
+<text>	
+<begin>
+&lt;div align=&quot;<just/>&quot;&gt;
+&lt;H1&gt;
+</begin>
+<end>
+&lt;/H1&gt;
+&lt;/div&gt;
+</end>
+</text>
+
+
+
+</style>
+-->
+
+</main>
Index: /main/tags/2.38/gsdl/etc/packages/z3950.cfg
===================================================================
--- /main/tags/2.38/gsdl/etc/packages/z3950.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/etc/packages/z3950.cfg	(revision 21083)
@@ -0,0 +1,43 @@
+[GSDL2.1] # config file version
+#
+# This file specifies a list of z39.50 servers to use.
+# Each field is separated by white-space.
+# If you want a " character inside a string, escape it - ie \" or ""
+
+#
+# Each server configuration consists of a stanza. The items are described here:
+#	Item				Description
+#	###############			########################
+#	collectname			<GSDL internal name (alphanumeric) >
+#	servername:port			<Internet address (def. port is 210) >
+#	dbname				<z39.50 server database name>
+#	"humanname"			<Brief description>
+#	icon "url to icon"		<optional GSDL icon (eg collection) >
+#	smallicon "url to small icon"	<optional GSDL icon (eg homepage) >
+#	About "about text"		<optional>
+
+
+# For an exhaustive list of servers to try, have a look at
+#  http://www.indexdata.dk/targettest/
+
+
+#LOCtest
+#       ilssun2.loc.gov:7090
+#       Voyager
+#       "Library of Congress TEST z39.50 server"
+#       About "This database/server is provided by the US LoC for the testing
+#           of z39.50 clients. For server capabilities, look at
+#           <a href=\"http://lcweb.loc.gov/z3950/lcserver.html\">their web 
+#           pages</a>. Note that <b>no records will ever be returned</b> -
+#           this server is for testing the protocols only."
+
+
+#LOC
+#        z3950.loc.gov:7090
+#        Voyager
+#        "Library of Congress z39.50 server"
+#        About   "This is the z39.50 interface to the US LoC catalogue
+#           system. It contains approximately 12 million bibliographic records.
+#           For server capabilities, look at
+#           <a href=\"http://lcweb.loc.gov/z3950/lcserver.html\">their web 
+#           pages</a>."
Index: /main/tags/2.38/gsdl/install-sh
===================================================================
--- /main/tags/2.38/gsdl/install-sh	(revision 21083)
+++ /main/tags/2.38/gsdl/install-sh	(revision 21083)
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# 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.
+#
+
+
+# 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}"
+
+tranformbasename=""
+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
Index: /main/tags/2.38/gsdl/lib/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/lib/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/Makefile.in	(revision 21083)
@@ -0,0 +1,134 @@
+###########################################################################
+#
+# Makefile -- lib
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+
+AR = ar
+CC = @CC@
+CPP = @CXX@
+#CCFLAGS = @CFLAGS@ -Wall -Wunused -pedantic -W -Woverloaded-virtual
+CCFLAGS = @CFLAGS@
+MCFLAGS = -Wall -Wunused
+DEFS = @DEFS@
+INCLUDES = -I../packages/mg/lib -I..
+MICO_DIR = @MICO_DIR@
+ifeq ($(MICO_DIR), default)
+MICO_INC = -I../packages/mico/mico/include
+MICO_PATH = ../bin/linux/
+else
+ifeq ($(MICO_DIR), yes)
+MICO_INC =
+else
+MICO_INC = -I$(MICO_DIR)
+endif
+MICO_PATH =
+endif
+MINCLUDES = -I/usr/include/g++-2/ -I/usr/lib/gcc-lib/i386-slackware-linux/egcs-2.91.66/include/ -I/usr/include -I.  -I../packages/mg/lib $(MICO_INC) -I..
+RANLIB = @RANLIB@
+USE_CORBA = @USE_CORBA@
+
+COMPILE = $(CC) -c $(CCFLAGS) $(DEFS) $(INCLUDES)
+CPPCOMPILE = $(CPP) -c $(CCFLAGS) $(DEFS) $(INCLUDES)
+
+ifneq ($(USE_CORBA), 0)
+MCOMPILE = $(MICO_PATH)mico-c++ -x c++ $(MCFLAGS) $(DEFS) $(MINCLUDES) -c
+else
+MCOMPILE = $(COMPILE)
+endif
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CPPCOMPILE) $< 
+
+.SUFFIXES: .mpp .o
+.mpp.o:
+	$(MCOMPILE) $<
+
+
+
+
+ifneq ($(USE_CORBA), 0)
+CORBAHEADERS = \
+  corbaconv_text_t.h corbatext_t.h
+CORBASOURCES = \
+  corbaiface.mpp    corbatext_t.mpp  corbaconv_text_t.mpp corbaiface_skel.mpp
+CORBAOBJECTS = \
+  corbaiface.o      corbatext_t.o    corbaconv_text_t.o   corbaiface_skel.o 
+else
+CORBAHEADERS = 
+CORBASOURCE = 
+CORBAOBJECTS = 
+endif
+
+HEADERS = \
+  cfgread.h      fileutil.h     gsdlunicode.h  gsdltools.h text_t.h \
+  display.h      gsdlconf.h     gsdltimes.h    cnfgable.h  cnfgator.h \
+  $(CORBAHEADERS)
+
+
+SOURCES = \
+  cfgread.cpp      fileutil.cpp     text_t.cpp     cnfgable.cpp \
+  display.cpp      gsdlunicode.cpp  gsdltimes.cpp  gsdltools.cpp \
+  cnfgator.cpp     $(CORBASOURCES)
+
+OBJECTS = \
+  cfgread.o        fileutil.o       text_t.o     cnfgable.o \
+  display.o        gsdlunicode.o    gsdltimes.o  gsdltools.o \
+  cnfgator.o       $(CORBAOBJECTS)
+
+
+all: gsdllib.a
+corbaiface_skel.h: corbaiface.idl
+	LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=$(MICO_PATH):$(PATH) idl --boa --no-poa --c++-skel --c++-suffix=mpp $?
+corbaiface_skel.mpp: corbaiface.idl
+	LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=$(MICO_PATH):$(PATH) idl --boa --no-poa --c++-skel --c++-suffix=mpp $?
+corbaiface.mpp: corbaiface.idl
+	LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PATH=$(MICO_PATH):$(PATH) idl --boa --no-poa --c++-skel --c++-suffix=mpp $?
+
+GSDLLIBOBJECTS = $(OBJECTS)
+
+gsdllib.a: $(GSDLLIBOBJECTS)
+	rm -f gsdllib.a
+	$(AR) cru gsdllib.a $(GSDLLIBOBJECTS)
+	$(RANLIB) gsdllib.a
+
+clean:
+	rm -f $(OBJECTS) gsdllib.a corbaiface_skel.mpp corbaiface.h corbaiface.mpp
+
+distclean: clean
+	rm -f Makefile
+install:
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CCFLAGS) -- $(SOURCES)
+
+
+
+
Index: /main/tags/2.38/gsdl/lib/cfgread.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/cfgread.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cfgread.cpp	(revision 21083)
@@ -0,0 +1,168 @@
+/**********************************************************************
+ *
+ * cfgread.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "cfgread.h"
+
+int write_ini_line (ofstream &fileout, const text_t &key, const text_t value) {
+  if (key.empty() || value.empty()) return -1;
+  outconvertclass text_t2ascii;
+  fileout << text_t2ascii << key << "=" << value << "\n";
+  return 0;
+}
+
+int read_ini_line (ifstream &filein, text_t &key, text_t &value) {
+  if (filein.eof()) return -1;
+
+  key.clear();
+  value.clear();
+  char c;
+  filein.get(c);
+
+  int foundeq = 0;
+  while (!filein.eof() && c != '\n') {
+    if (!foundeq && c == '=') {foundeq = 1; filein.get(c);}
+
+    if (foundeq) value.push_back(c);
+    else key.push_back(c);
+    filein.get(c);
+  }
+  if (key.empty()) return 0; // blank line maybe?
+  return 0;
+} 
+
+// write out line of values to cfgfile
+// does nothing fancy - make sure no values contain carriage returns
+int write_cfg_line (ofstream &fileout, const text_tarray &values) {
+  outconvertclass text_t2ascii;
+
+  text_tarray::const_iterator here = values.begin();
+  text_tarray::const_iterator end = values.end();
+
+  bool first = true;
+  while (here != end) {
+    if (first) fileout << text_t2ascii << *here;
+    else fileout << text_t2ascii << "  \"" << *here << "\"";
+    first = false;
+    here ++;
+  }
+  fileout << "\n";
+  return 0;
+}
+// same, but use a file descriptor this time
+int write_cfg_line (int fileout, const text_tarray &values) {
+  outconvertclass text_t2ascii;
+
+  text_tarray::const_iterator here = values.begin();
+  text_tarray::const_iterator end = values.end();
+
+  bool first = true;
+  while (here != end) {
+    if (first) text_t2ascii << *here;
+    else text_t2ascii << "  \"" << *here << "\"";
+
+    size_t buffersize=here->size() + 4; // +4 in case of " and spaces
+    char *buffer=new char[buffersize];
+    size_t num_chars;
+    convertclass::status_t status;
+    text_t2ascii.convert(buffer, buffersize, num_chars, status);
+    // ignore status - assume it is "finished" as buffer is big enough
+    write(fileout, buffer, num_chars);
+    delete buffer;
+    first = false;
+    here ++;
+  }
+  write(fileout,"\n",1);
+  return 0;
+}
+
+
+// returns 0 on success, -1 on failure
+int read_cfg_line (ifstream &filein, text_tarray &values) {
+  //  outconvertclass text_t2ascii;
+
+  values.erase(values.begin(), values.end());
+
+  if (!filein.good()) return -1;
+
+  text_t curvalue;
+  char c, quote;
+
+  bool linecontinues = true;
+  filein.get(c);
+  while (!filein.eof() && linecontinues) {
+    // eat up all return characters
+    while (!filein.eof() && (c=='\n' || c=='\r')) { filein.get(c); }
+
+    // ignore comments
+    if (c == '#') {
+      while (!filein.eof() && c!='\n' && c!='\r') { filein.get(c); }
+    }
+
+    // deal with all the records on this line
+    while (!filein.eof() && c!='\n' && c!='\r') {
+      // ignore white space
+      while (!filein.eof() && (c==' ' || c=='\t')) { filein.get(c); }
+
+      // get the next record
+      if (c!='\n' && c!='\r') {
+	curvalue.clear();
+	quote = 0;
+
+	// see if this is a quoted record
+	if (c=='\'' || c=='\"') {
+	  quote = c;
+	  filein.get(c);
+	}
+
+	// get the value
+	while (!filein.eof() && c!='\n' && c!='\r') {
+	  if (quote != 0 && c == quote) { // end of quote
+	    filein.get(c);
+	    break;
+	  } else if (quote == 0 && (c == ' ' || c == '\t')) {
+	    break; // space seperator
+	  }
+	  curvalue.push_back(c);
+	  filein.get(c);
+	}
+
+	// see if the record continues on the next line
+	if ((c=='\n' || c=='\r') && curvalue=="\\") {
+	  linecontinues = true;
+	} else {
+	  //	  cerr << text_t2ascii << "\"" << curvalue << "\" ";
+	  
+	  values.push_back(curvalue);
+	  curvalue.clear();
+	  linecontinues = false;
+	}
+      }
+    }
+  }
+
+  //  cerr << "\n";
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/lib/cfgread.h
===================================================================
--- /main/tags/2.38/gsdl/lib/cfgread.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cfgread.h	(revision 21083)
@@ -0,0 +1,48 @@
+/**********************************************************************
+ *
+ * cfgread.h -- reads in configuration files
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CFGREAD_H
+#define CFGREAD_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <fstream.h>
+#else
+#  include <fstream>
+#endif
+
+// return 0 on success, -1 on failure
+int write_ini_line (ofstream &fileout, const text_t &key, const text_t value);
+int read_ini_line (ifstream &filein, text_t &key, text_t &value);
+int write_cfg_line (ofstream &fileout, const text_tarray &values);
+int write_cfg_line (int filedesc, const text_tarray &values);
+int read_cfg_line (ifstream &filein, text_tarray &values);
+
+#endif
Index: /main/tags/2.38/gsdl/lib/cnfgable.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/cnfgable.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cnfgable.cpp	(revision 21083)
@@ -0,0 +1,37 @@
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/iostream>
+#  include <ospace/std/fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+#include "cnfgable.h"
+#include "cfgread.h"
+
+bool configurable::read_configfile (text_t filename) {
+  // read in the build configuration file
+  text_t key;
+  text_tarray cfgline;
+  char *cstr = filename.getcstr();
+  ifstream confin (cstr);
+  delete cstr;
+
+  if (confin) {
+    while (read_cfg_line(confin, cfgline) >= 0) {
+      if (cfgline.size () >= 2) {
+	key = cfgline[0];
+	cfgline.erase(cfgline.begin());
+
+	// configure the collection server
+	this->configure (key, cfgline);
+      }
+    }
+    confin.close ();
+    return true;
+  }
+  return false;
+}
Index: /main/tags/2.38/gsdl/lib/cnfgable.h
===================================================================
--- /main/tags/2.38/gsdl/lib/cnfgable.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cnfgable.h	(revision 21083)
@@ -0,0 +1,16 @@
+#ifndef CONFIGURABLE_H
+#define CONFIGURABLE_H
+
+#include "text_t.h"
+
+class configurable {
+ public:
+  virtual void configure (const text_t &key, const text_tarray &cfgline) = 0;
+  virtual ~configurable () {}
+
+  bool read_configfile (text_t filename);
+ protected:
+  configurable() {}
+};
+
+#endif
Index: /main/tags/2.38/gsdl/lib/cnfgator.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/cnfgator.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cnfgator.cpp	(revision 21083)
@@ -0,0 +1,52 @@
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/iostream>
+#  include <ospace/std/fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+#include "cnfgator.h"
+
+configurator::configurator(configurable *configureobject) {
+  configureobjs.push_back(configureobject);
+}
+
+void configurator::add_configurable(configurable *configureobject) {
+  configureobjs.push_back(configureobject);
+}
+
+bool configurator::configure(text_t filename) {
+  // read in the build configuration file
+  text_t key;
+  text_tarray cfgline;
+  char *cstr = filename.getcstr();
+  ifstream confin (cstr);
+  delete cstr;
+
+  if (confin) {
+    while (read_cfg_line(confin, cfgline) >= 0) {
+      if (cfgline.size () >= 2) {
+	key = cfgline[0];
+	cfgline.erase(cfgline.begin());
+
+	// configure the configurables
+	configurable *configureObject;
+	vector<configurable *>::iterator configureIter = configureobjs.begin();
+
+	while (configureIter != configureobjs.end()) {
+	  configureObject = *configureIter;
+	  configureIter ++;
+    
+	  configureObject->configure (key, cfgline);
+	}
+      }
+    }
+    confin.close ();
+    return true;
+  }
+  return false;
+}
Index: /main/tags/2.38/gsdl/lib/cnfgator.h
===================================================================
--- /main/tags/2.38/gsdl/lib/cnfgator.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/cnfgator.h	(revision 21083)
@@ -0,0 +1,18 @@
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/vector>
+#else
+#  include <vector>
+#endif
+
+#include "cfgread.h"
+#include "cnfgable.h"
+
+class configurator
+{ 
+ private:
+  vector<configurable *> configureobjs;
+ public:
+  configurator(configurable *configureobject);
+  bool configure(text_t filename);
+  void add_configurable(configurable *configureobject);
+};
Index: /main/tags/2.38/gsdl/lib/corbaconv_text_t.h
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaconv_text_t.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaconv_text_t.h	(revision 21083)
@@ -0,0 +1,68 @@
+/**********************************************************************
+ *
+ * corbaconv_text_t.mpp -- conversion support text_t <-> corba_text_t
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef CORBACONV_TEXT_T_H
+#define CORBACONV_TEXT_T_H
+
+#include "text_t.h"
+
+// Inherit from text_t
+// Provide support to convert from corba_text_t to text_t and vice versa
+
+class corbaconv_text_t : public text_t {
+  
+public:
+  // constructors
+  corbaconv_text_t (corbatext_t t);
+
+  void setCorbatext(corbatext_t ct);
+  void getCorbatext(corbatext_t &ct) const;
+  void fillUsString(usString *us) const;
+
+  static void setCorbatext(text_t& t, corbatext_t ct);
+  static void getCorbatext(const text_t& t, corbatext_t &ct);
+  static void fillUsString(const text_t& t, usString *us);
+};
+
+
+inline void corbaconv_text_t::setCorbatext(corbatext_t ct) 
+{ 
+  setCorbatext(*this,ct); 
+}
+
+inline void corbaconv_text_t::getCorbatext(corbatext_t& ct) const
+{ 
+  getCorbatext(*this,ct); 
+}
+
+inline void corbaconv_text_t::fillUsString(usString *us) const
+{
+  fillUsString(*this,us);
+}
+
+#endif
Index: /main/tags/2.38/gsdl/lib/corbaconv_text_t.mpp
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaconv_text_t.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaconv_text_t.mpp	(revision 21083)
@@ -0,0 +1,104 @@
+/**********************************************************************
+ *
+ * corbaconv_text_t.mpp -- conversion support text_t <-> corba_text_t
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+// protocol header
+#include "corbaiface.h"
+using namespace gsdlInterface;
+
+#include "corbatext_t.h"
+
+#include "corbaconv_text_t.h"
+
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\algorithm>
+#elif defined(GSDL_USE_STL_H)
+#  if defined(GSDL_USE_ALGO_H)
+#    include <algo.h>
+#  else
+#    include <algorithm.h>
+#  endif
+#else
+#  include <algorithm>
+#endif
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include "WIN32cfg.h"
+# else
+#  include "mico/config.h"
+# endif
+#endif
+
+
+// #include "unitool.h" // ****
+
+////////////////////////////////////
+// corbaconv_text_t methods
+////////////////////////////////////
+
+corbaconv_text_t::corbaconv_text_t (corbatext_t t)
+{ 
+  setCorbatext(t);  
+}
+
+void corbaconv_text_t::getCorbatext(const text_t& t, corbatext_t &ct)
+{
+  ct.encoding = 0;
+  fillUsString(t,&ct.text);
+}
+
+void corbaconv_text_t::setCorbatext(text_t& t, corbatext_t ct)
+{
+  t.setencoding(0);
+  t.clear();
+  corbatext_usvector(ct, t.text_as_usvector());
+}
+
+void corbaconv_text_t::fillUsString(const text_t& t, usString *us)
+{
+  unsigned int i;
+  usvector::const_iterator here = t.text_as_usvector().begin();
+  usvector::const_iterator end = t.text_as_usvector().end();
+
+
+  if (end == here)
+    { 	
+      return;
+    }
+  (*us).length(end - here);
+  i = 0;
+
+  while (here != end)
+    {
+      (*us)[i] = *here;
+      i ++;
+      here ++;
+    }
+  
+}
Index: /main/tags/2.38/gsdl/lib/corbaiface.h
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaiface.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaiface.h	(revision 21083)
@@ -0,0 +1,613 @@
+/*
+ *  MICO --- a free CORBA implementation
+ *  Copyright (C) 1997-98 Kay Roemer & Arno Puder
+ *
+ *  This file was automatically generated. DO NOT EDIT!
+ */
+
+#if !defined(__CORBAIFACE_H__) || defined(MICO_NO_TOPLEVEL_MODULES)
+#define __CORBAIFACE_H__
+
+#ifndef MICO_NO_TOPLEVEL_MODULES
+#include <CORBA.h>
+#include <mico/throw.h>
+#endif
+
+#ifndef MICO_NO_TOPLEVEL_MODULES
+MICO_NAMESPACE_DECL gsdlInterface {
+#endif
+
+#if !defined(MICO_NO_TOPLEVEL_MODULES) || defined(MICO_MODULE_gsdlInterface)
+
+
+typedef SequenceTmpl<CORBA::UShort,MICO_TID_DEF> usString;
+#ifdef _WINDOWS
+static usString _dummy_usString;
+#endif
+typedef TSeqVar<SequenceTmpl<CORBA::UShort,MICO_TID_DEF> > usString_var;
+typedef TSeqOut<SequenceTmpl<CORBA::UShort,MICO_TID_DEF> > usString_out;
+
+typedef StringSequenceTmpl<CORBA::String_var> stringSeq;
+#ifdef _WINDOWS
+static stringSeq _dummy_stringSeq;
+#endif
+typedef TSeqVar<StringSequenceTmpl<CORBA::String_var> > stringSeq_var;
+typedef TSeqOut<StringSequenceTmpl<CORBA::String_var> > stringSeq_out;
+
+struct corbatext_t;
+typedef TVarVar<corbatext_t> corbatext_t_var;
+typedef TVarOut<corbatext_t> corbatext_t_out;
+
+struct corbatext_t {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbatext_t_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbatext_t();
+  ~corbatext_t();
+  corbatext_t( const corbatext_t& s );
+  corbatext_t& operator=( const corbatext_t& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  usString text;
+  CORBA::UShort encoding;
+  CORBA::ULong length;
+};
+
+typedef SequenceTmpl<corbatext_t,MICO_TID_DEF> corbatext_tarray;
+#ifdef _WINDOWS
+static corbatext_tarray _dummy_corbatext_tarray;
+#endif
+typedef TSeqVar<SequenceTmpl<corbatext_t,MICO_TID_DEF> > corbatext_tarray_var;
+typedef TSeqOut<SequenceTmpl<corbatext_t,MICO_TID_DEF> > corbatext_tarray_out;
+
+typedef corbatext_tarray corbatext_tset;
+#ifdef _WINDOWS
+static corbatext_tset _dummy_corbatext_tset;
+#endif
+typedef TSeqVar<corbatext_tarray > corbatext_tset_var;
+typedef TSeqOut<corbatext_tarray > corbatext_tset_out;
+
+struct corbatext_tmap;
+typedef TVarVar<corbatext_tmap> corbatext_tmap_var;
+typedef TVarOut<corbatext_tmap> corbatext_tmap_out;
+
+struct corbatext_tmap {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbatext_tmap_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbatext_tmap();
+  ~corbatext_tmap();
+  corbatext_tmap( const corbatext_tmap& s );
+  corbatext_tmap& operator=( const corbatext_tmap& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_tarray names;
+  corbatext_tarray values;
+};
+
+enum corbaComError {
+  corbaNoError = 0,
+  corbaAuthenticationFailure,
+  corbaProtocolError,
+  corbaConfigurationError,
+  corbaSystemProblem
+};
+
+typedef corbaComError& corbaComError_out;
+
+struct corbaShortColInfo;
+typedef TVarVar<corbaShortColInfo> corbaShortColInfo_var;
+typedef TVarOut<corbaShortColInfo> corbaShortColInfo_out;
+
+struct corbaShortColInfo {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaShortColInfo_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaShortColInfo();
+  ~corbaShortColInfo();
+  corbaShortColInfo( const corbaShortColInfo& s );
+  corbaShortColInfo& operator=( const corbaShortColInfo& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t name;
+  corbatext_t host;
+  CORBA::Long response;
+};
+
+struct corbaColInfoResponse;
+typedef TVarVar<corbaColInfoResponse> corbaColInfoResponse_var;
+typedef TVarOut<corbaColInfoResponse> corbaColInfoResponse_out;
+
+struct corbaColInfoResponse {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaColInfoResponse_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaColInfoResponse();
+  ~corbaColInfoResponse();
+  corbaColInfoResponse( const corbaColInfoResponse& s );
+  corbaColInfoResponse& operator=( const corbaColInfoResponse& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbaShortColInfo shoftInfo;
+  CORBA::Boolean isPublic;
+  CORBA::Boolean isBeta;
+  CORBA::ULong buildDate;
+  corbatext_tarray ccsCols;
+  corbatext_tarray languages;
+  CORBA::ULong numDocs;
+  CORBA::ULong numWords;
+  CORBA::ULong numBytes;
+  corbatext_tmap collectionMeta;
+  corbatext_tmap format;
+  corbatext_tmap building;
+  corbatext_t httpdomain;
+  corbatext_t httpprefix;
+  corbatext_t receptionist;
+};
+
+struct corbaDocRequest;
+typedef TVarVar<corbaDocRequest> corbaDocRequest_var;
+typedef TVarOut<corbaDocRequest> corbaDocRequest_out;
+
+struct corbaDocRequest {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaDocRequest_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaDocRequest();
+  ~corbaDocRequest();
+  corbaDocRequest( const corbaDocRequest& s );
+  corbaDocRequest& operator=( const corbaDocRequest& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t OID;
+  corbatext_t docType;
+  corbatext_t docFormat;
+};
+
+struct corbaDocResponse;
+typedef TVarVar<corbaDocResponse> corbaDocResponse_var;
+typedef TVarOut<corbaDocResponse> corbaDocResponse_out;
+
+struct corbaDocResponse {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaDocResponse_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaDocResponse();
+  ~corbaDocResponse();
+  corbaDocResponse( const corbaDocResponse& s );
+  corbaDocResponse& operator=( const corbaDocResponse& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t doc;
+};
+
+enum corbaFilterType {
+  booleanType = 0,
+  integerType,
+  enumeratedType,
+  stringType
+};
+
+typedef corbaFilterType& corbaFilterType_out;
+
+enum corbaFilterRepeatable {
+  onePerQuery = 0,
+  onePerTerm,
+  nPerTerm
+};
+
+typedef corbaFilterRepeatable& corbaFilterRepeatable_out;
+
+struct corbaFilterOption;
+typedef TVarVar<corbaFilterOption> corbaFilterOption_var;
+typedef TVarOut<corbaFilterOption> corbaFilterOption_out;
+
+struct corbaFilterOption {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaFilterOption_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaFilterOption();
+  ~corbaFilterOption();
+  corbaFilterOption( const corbaFilterOption& s );
+  corbaFilterOption& operator=( const corbaFilterOption& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t name;
+  corbaFilterType type;
+  corbaFilterRepeatable repeatable;
+  corbatext_t defaultValue;
+  corbatext_tarray validValues;
+};
+
+typedef SequenceTmpl<corbaFilterOption,MICO_TID_DEF> corbaFilterOptionList;
+#ifdef _WINDOWS
+static corbaFilterOptionList _dummy_corbaFilterOptionList;
+#endif
+typedef TSeqVar<SequenceTmpl<corbaFilterOption,MICO_TID_DEF> > corbaFilterOptionList_var;
+typedef TSeqOut<SequenceTmpl<corbaFilterOption,MICO_TID_DEF> > corbaFilterOptionList_out;
+
+struct corbaFilterOptionsResponse;
+typedef TVarVar<corbaFilterOptionsResponse> corbaFilterOptionsResponse_var;
+typedef TVarOut<corbaFilterOptionsResponse> corbaFilterOptionsResponse_out;
+
+struct corbaFilterOptionsResponse {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaFilterOptionsResponse_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaFilterOptionsResponse();
+  ~corbaFilterOptionsResponse();
+  corbaFilterOptionsResponse( const corbaFilterOptionsResponse& s );
+  corbaFilterOptionsResponse& operator=( const corbaFilterOptionsResponse& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbaFilterOptionList options;
+  corbatext_tarray names;
+};
+
+struct corbaOptionValue;
+typedef TVarVar<corbaOptionValue> corbaOptionValue_var;
+typedef TVarOut<corbaOptionValue> corbaOptionValue_out;
+
+struct corbaOptionValue {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaOptionValue_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaOptionValue();
+  ~corbaOptionValue();
+  corbaOptionValue( const corbaOptionValue& s );
+  corbaOptionValue& operator=( const corbaOptionValue& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t name;
+  corbatext_t value;
+};
+
+typedef SequenceTmpl<corbaOptionValue,MICO_TID_DEF> corbaOptionValue_array;
+#ifdef _WINDOWS
+static corbaOptionValue_array _dummy_corbaOptionValue_array;
+#endif
+typedef TSeqVar<SequenceTmpl<corbaOptionValue,MICO_TID_DEF> > corbaOptionValue_array_var;
+typedef TSeqOut<SequenceTmpl<corbaOptionValue,MICO_TID_DEF> > corbaOptionValue_array_out;
+
+struct corbaFilterRequest;
+typedef TVarVar<corbaFilterRequest> corbaFilterRequest_var;
+typedef TVarOut<corbaFilterRequest> corbaFilterRequest_out;
+
+struct corbaFilterRequest {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaFilterRequest_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaFilterRequest();
+  ~corbaFilterRequest();
+  corbaFilterRequest( const corbaFilterRequest& s );
+  corbaFilterRequest& operator=( const corbaFilterRequest& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t filter;
+  corbaOptionValue_array filterOptions;
+  corbatext_tarray docSet;
+  CORBA::Long filterResultOptions;
+  corbatext_t requestParams;
+  corbatext_t refParams;
+  corbatext_tset fields;
+  CORBA::Boolean getParents;
+};
+
+struct corbaTermInfo;
+typedef TVarVar<corbaTermInfo> corbaTermInfo_var;
+typedef TVarOut<corbaTermInfo> corbaTermInfo_out;
+
+struct corbaTermInfo {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaTermInfo_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaTermInfo();
+  ~corbaTermInfo();
+  corbaTermInfo( const corbaTermInfo& s );
+  corbaTermInfo& operator=( const corbaTermInfo& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t term;
+  CORBA::Long frequency;
+  corbatext_tarray matchTerms;
+};
+
+typedef SequenceTmpl<corbaTermInfo,MICO_TID_DEF> corbaTermInfo_array;
+#ifdef _WINDOWS
+static corbaTermInfo_array _dummy_corbaTermInfo_array;
+#endif
+typedef TSeqVar<SequenceTmpl<corbaTermInfo,MICO_TID_DEF> > corbaTermInfo_array_var;
+typedef TSeqOut<SequenceTmpl<corbaTermInfo,MICO_TID_DEF> > corbaTermInfo_array_out;
+
+struct corbaMetadataInfo;
+typedef TVarVar<corbaMetadataInfo> corbaMetadataInfo_var;
+typedef TVarOut<corbaMetadataInfo> corbaMetadataInfo_out;
+
+struct corbaMetadataInfo {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaMetadataInfo_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaMetadataInfo();
+  ~corbaMetadataInfo();
+  corbaMetadataInfo( const corbaMetadataInfo& s );
+  corbaMetadataInfo& operator=( const corbaMetadataInfo& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t params;
+  CORBA::Boolean isRef;
+  corbatext_tarray values;
+  CORBA::Long id;
+  CORBA::Long parentid;
+};
+
+typedef SequenceTmpl<corbaMetadataInfo,MICO_TID_DEF> corbaMetadataInfo_array;
+#ifdef _WINDOWS
+static corbaMetadataInfo_array _dummy_corbaMetadataInfo_array;
+#endif
+typedef TSeqVar<SequenceTmpl<corbaMetadataInfo,MICO_TID_DEF> > corbaMetadataInfo_array_var;
+typedef TSeqOut<SequenceTmpl<corbaMetadataInfo,MICO_TID_DEF> > corbaMetadataInfo_array_out;
+
+struct corbaMetadataInfo_map;
+typedef TVarVar<corbaMetadataInfo_map> corbaMetadataInfo_map_var;
+typedef TVarOut<corbaMetadataInfo_map> corbaMetadataInfo_map_out;
+
+struct corbaMetadataInfo_map {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaMetadataInfo_map_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaMetadataInfo_map();
+  ~corbaMetadataInfo_map();
+  corbaMetadataInfo_map( const corbaMetadataInfo_map& s );
+  corbaMetadataInfo_map& operator=( const corbaMetadataInfo_map& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_tarray names;
+  corbaMetadataInfo_array values;
+};
+
+typedef SequenceTmpl<CORBA::Long,MICO_TID_DEF> corbaDocFreq_array;
+#ifdef _WINDOWS
+static corbaDocFreq_array _dummy_corbaDocFreq_array;
+#endif
+typedef TSeqVar<SequenceTmpl<CORBA::Long,MICO_TID_DEF> > corbaDocFreq_array_var;
+typedef TSeqOut<SequenceTmpl<CORBA::Long,MICO_TID_DEF> > corbaDocFreq_array_out;
+
+struct corbaResultDocInfo;
+typedef TVarVar<corbaResultDocInfo> corbaResultDocInfo_var;
+typedef TVarOut<corbaResultDocInfo> corbaResultDocInfo_out;
+
+struct corbaResultDocInfo {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaResultDocInfo_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaResultDocInfo();
+  ~corbaResultDocInfo();
+  corbaResultDocInfo( const corbaResultDocInfo& s );
+  corbaResultDocInfo& operator=( const corbaResultDocInfo& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  corbatext_t OID;
+  CORBA::Long resultNum;
+  CORBA::Long ranking;
+  CORBA::Long termsMatched;
+  CORBA::Long phraseMatched;
+  corbaDocFreq_array docFreq;
+  corbaMetadataInfo_map metadata;
+  corbatext_t classifierMetadataType;
+  CORBA::Long classifierMetadataOffset;
+  corbaMetadataInfo_array metaparents;
+};
+
+typedef SequenceTmpl<corbaResultDocInfo,MICO_TID_DEF> corbaResultDocInfo_array;
+#ifdef _WINDOWS
+static corbaResultDocInfo_array _dummy_corbaResultDocInfo_array;
+#endif
+typedef TSeqVar<SequenceTmpl<corbaResultDocInfo,MICO_TID_DEF> > corbaResultDocInfo_array_var;
+typedef TSeqOut<SequenceTmpl<corbaResultDocInfo,MICO_TID_DEF> > corbaResultDocInfo_array_out;
+
+enum corbaIsApprox {
+  resultExact = 0,
+  resultApprox,
+  resultMany
+};
+
+typedef corbaIsApprox& corbaIsApprox_out;
+
+struct corbaFilterResponse;
+typedef TVarVar<corbaFilterResponse> corbaFilterResponse_var;
+typedef TVarOut<corbaFilterResponse> corbaFilterResponse_out;
+
+struct corbaFilterResponse {
+  #ifdef HAVE_TYPEDEF_OVERLOAD
+  typedef corbaFilterResponse_var _var_type;
+  #endif
+  #ifdef HAVE_EXPLICIT_STRUCT_OPS
+  corbaFilterResponse();
+  ~corbaFilterResponse();
+  corbaFilterResponse( const corbaFilterResponse& s );
+  corbaFilterResponse& operator=( const corbaFilterResponse& s );
+  #endif //HAVE_EXPLICIT_STRUCT_OPS
+
+  CORBA::Long numDocs;
+  corbaIsApprox isApprox;
+  corbaTermInfo_array termInfo;
+  corbaResultDocInfo_array docInfo;
+};
+
+class corbaiface;
+typedef corbaiface *corbaiface_ptr;
+typedef corbaiface_ptr corbaifaceRef;
+typedef ObjVar<corbaiface> corbaiface_var;
+typedef ObjOut<corbaiface> corbaiface_out;
+
+
+// Common definitions for interface corbaiface
+class corbaiface : 
+  virtual public CORBA::Object
+{
+  public:
+    virtual ~corbaiface();
+
+    #ifdef HAVE_TYPEDEF_OVERLOAD
+    typedef corbaiface_ptr _ptr_type;
+    typedef corbaiface_var _var_type;
+    #endif
+
+    static corbaiface_ptr _narrow( CORBA::Object_ptr obj );
+    static corbaiface_ptr _narrow( CORBA::AbstractBase_ptr obj );
+    static corbaiface_ptr _duplicate( corbaiface_ptr _obj )
+    {
+      CORBA::Object::_duplicate (_obj);
+      return _obj;
+    }
+
+    static corbaiface_ptr _nil()
+    {
+      return 0;
+    }
+
+    virtual void *_narrow_helper( const char *repoid );
+    static vector<CORBA::Narrow_proto> *_narrow_helpers;
+    static bool _narrow_helper2( CORBA::Object_ptr obj );
+
+    virtual CORBA::Boolean initialise( corbaComError& error ) = 0;
+    virtual void configure( const corbatext_t& key, const corbatext_tarray& cfgline, corbaComError& error ) = 0;
+    virtual void collectionList( corbatext_tarray& collist, corbaComError& error ) = 0;
+    virtual void hasCollection( const corbatext_t& corbaCollection, CORBA::Boolean& has, corbaComError& error ) = 0;
+    virtual void ping( const corbatext_t& collection, CORBA::Boolean& wasSuccess, corbaComError& error ) = 0;
+    virtual void getDocument( const corbatext_t& collection, corbaDocRequest& request, corbaDocResponse& response, corbaComError& error ) = 0;
+    virtual void getCollectInfo( const corbatext_t& collection, corbaColInfoResponse& response, corbaComError& error ) = 0;
+    virtual void getFilterInfo( const corbatext_t& collection, corbatext_tarray& filterNames, corbaComError& error ) = 0;
+    virtual void getFilterOptions( const corbatext_t& collection, const corbatext_t& option, corbaFilterOptionsResponse& response, corbaComError& error ) = 0;
+    virtual void filter( const corbatext_t& collection, const corbaFilterRequest& request, corbaFilterResponse& response, corbaComError& error ) = 0;
+
+  protected:
+    corbaiface() {};
+  private:
+    corbaiface( const corbaiface& );
+    void operator=( const corbaiface& );
+};
+
+// Stub for interface corbaiface
+class corbaiface_stub:
+  virtual public corbaiface
+{
+  public:
+    virtual ~corbaiface_stub();
+    CORBA::Boolean initialise( corbaComError& error );
+    void configure( const corbatext_t& key, const corbatext_tarray& cfgline, corbaComError& error );
+    void collectionList( corbatext_tarray& collist, corbaComError& error );
+    void hasCollection( const corbatext_t& corbaCollection, CORBA::Boolean& has, corbaComError& error );
+    void ping( const corbatext_t& collection, CORBA::Boolean& wasSuccess, corbaComError& error );
+    void getDocument( const corbatext_t& collection, corbaDocRequest& request, corbaDocResponse& response, corbaComError& error );
+    void getCollectInfo( const corbatext_t& collection, corbaColInfoResponse& response, corbaComError& error );
+    void getFilterInfo( const corbatext_t& collection, corbatext_tarray& filterNames, corbaComError& error );
+    void getFilterOptions( const corbatext_t& collection, const corbatext_t& option, corbaFilterOptionsResponse& response, corbaComError& error );
+    void filter( const corbatext_t& collection, const corbaFilterRequest& request, corbaFilterResponse& response, corbaComError& error );
+
+  private:
+    void operator=( const corbaiface_stub& );
+};
+
+class corbaiface_skel :
+  virtual public StaticMethodDispatcher,
+  virtual public corbaiface
+{
+  public:
+    corbaiface_skel( const CORBA::BOA::ReferenceData & = CORBA::BOA::ReferenceData() );
+    virtual ~corbaiface_skel();
+    corbaiface_skel( CORBA::Object_ptr obj );
+    virtual bool dispatch( CORBA::StaticServerRequest_ptr _req, CORBA::Environment &_env );
+    corbaiface_ptr _this();
+
+};
+
+#endif // !defined(MICO_NO_TOPLEVEL_MODULES) || defined(MICO_MODULE_gsdlInterface)
+
+#ifndef MICO_NO_TOPLEVEL_MODULES
+
+} MICO_NAMESPACE_END_DECL
+#endif
+
+
+
+#ifndef MICO_CONF_NO_POA
+
+#endif // MICO_CONF_NO_POA
+
+#if !defined(MICO_NO_TOPLEVEL_MODULES) || defined(MICO_MODULE__GLOBAL)
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbatext_t;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbatext_tmap;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaComError;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaShortColInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaColInfoResponse;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaDocRequest;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaDocResponse;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterType;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterRepeatable;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterOption;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterOptionsResponse;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaOptionValue;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterRequest;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaTermInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaMetadataInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaMetadataInfo_map;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaResultDocInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaIsApprox;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterResponse;
+
+extern CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaiface;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbatext_t;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaFilterOption;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaOptionValue;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaTermInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaMetadataInfo;
+
+extern CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaResultDocInfo;
+
+#endif // !defined(MICO_NO_TOPLEVEL_MODULES) || defined(MICO_MODULE__GLOBAL)
+
+
+#if !defined(MICO_NO_TOPLEVEL_MODULES) && !defined(MICO_IN_GENERATED_CODE)
+#include <mico/template_impl.h>
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/lib/corbaiface.idl
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaiface.idl	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaiface.idl	(revision 21083)
@@ -0,0 +1,230 @@
+// basic elements for text
+
+module gsdlInterface {
+
+typedef sequence<unsigned short> usString;
+
+typedef sequence<string> stringSeq;
+
+struct corbatext_t
+{ 
+  usString text;
+  unsigned short encoding;
+  unsigned long  length;
+};
+
+typedef sequence<corbatext_t> corbatext_tarray;
+
+typedef corbatext_tarray corbatext_tset;
+
+struct corbatext_tmap
+{
+  corbatext_tarray names;
+  corbatext_tarray values;
+};
+
+// standard error values
+
+enum corbaComError
+{ corbaNoError, 
+  corbaAuthenticationFailure, 
+  corbaProtocolError, 
+  corbaConfigurationError, 
+  corbaSystemProblem
+};
+
+//
+// getColInfo response
+//
+
+struct corbaShortColInfo
+{
+  corbatext_t name;
+  corbatext_t host;
+  long        response;
+};
+
+struct corbaColInfoResponse
+{
+  corbaShortColInfo shoftInfo;
+  boolean           isPublic;
+  boolean           isBeta;
+  unsigned long     buildDate;
+  corbatext_tarray  ccsCols;        // Added 05/04/2000
+  corbatext_tarray  languages;
+  unsigned long     numDocs;
+  unsigned long     numWords;
+  unsigned long     numBytes;
+  corbatext_tmap    collectionMeta;
+  corbatext_tmap    format;
+  corbatext_tmap    building;
+  corbatext_t       httpdomain ;    // Added 27/07/2000
+  corbatext_t       httpprefix;     // Added 27/07/2000
+  corbatext_t       receptionist;
+};
+
+//
+// getDocument request
+//
+
+struct corbaDocRequest
+{ 
+  corbatext_t OID;
+  corbatext_t docType;
+  corbatext_t docFormat;
+};
+
+//
+// getDocument response
+//
+
+struct corbaDocResponse
+{ 
+  corbatext_t doc;
+};
+
+enum corbaFilterType
+{
+  booleanType,
+  integerType,
+  enumeratedType,
+  stringType
+};
+
+enum corbaFilterRepeatable
+{
+  onePerQuery,
+  onePerTerm,
+  nPerTerm
+};
+
+struct corbaFilterOption
+{
+  corbatext_t           name;
+  corbaFilterType       type;
+  corbaFilterRepeatable repeatable;
+  corbatext_t           defaultValue;
+  corbatext_tarray      validValues;
+};
+
+typedef sequence<corbaFilterOption> corbaFilterOptionList;
+
+struct corbaFilterOptionsResponse
+{
+  corbaFilterOptionList options;
+  corbatext_tarray      names;
+};
+
+//
+// structures for filter call
+//
+
+struct corbaOptionValue
+{
+  corbatext_t name;
+  corbatext_t value;
+};
+
+typedef sequence<corbaOptionValue> corbaOptionValue_array;
+
+struct corbaFilterRequest
+{ 
+  corbatext_t            filter;
+  corbaOptionValue_array filterOptions;
+  corbatext_tarray       docSet;
+  long                   filterResultOptions;
+  corbatext_t            requestParams;
+  corbatext_t            refParams;
+  corbatext_tset         fields;
+  boolean                getParents;
+};
+
+struct corbaTermInfo
+{
+  corbatext_t      term;
+  long             frequency;
+  corbatext_tarray matchTerms;
+};
+
+typedef sequence<corbaTermInfo> corbaTermInfo_array;
+
+struct corbaMetadataInfo
+{
+  corbatext_t      params;
+  boolean          isRef;
+  corbatext_tarray values;
+  long             id;
+  long             parentid; // dodge for avoiding pointers for the moment
+};
+
+typedef sequence<corbaMetadataInfo> corbaMetadataInfo_array;
+
+struct corbaMetadataInfo_map
+{ 
+  corbatext_tarray        names;
+  corbaMetadataInfo_array values;
+};
+
+typedef sequence<long> corbaDocFreq_array;
+
+struct corbaResultDocInfo
+{
+  corbatext_t             OID;
+  long                    resultNum;
+  long                    ranking;
+  long                    termsMatched;
+  long                    phraseMatched;
+  corbaDocFreq_array      docFreq;
+  corbaMetadataInfo_map   metadata;
+  corbatext_t             classifierMetadataType;    // Added 05/04/2000
+  long                    classifierMetadataOffset;  // Added 05/04/2000
+  corbaMetadataInfo_array metaparents;
+};
+
+typedef sequence<corbaResultDocInfo> corbaResultDocInfo_array;
+
+enum corbaIsApprox
+{
+  resultExact,
+  resultApprox,
+  resultMany
+};
+
+struct corbaFilterResponse
+{
+  long                     numDocs;
+  corbaIsApprox            isApprox;
+  corbaTermInfo_array      termInfo;
+  corbaResultDocInfo_array docInfo;
+};
+
+interface corbaiface
+{
+  boolean   initialise(inout corbaComError error);
+  void      configure(in corbatext_t key, in corbatext_tarray cfgline,
+		      inout corbaComError error);
+  void      collectionList(inout corbatext_tarray collist,
+			   inout corbaComError error);
+  void      hasCollection(in corbatext_t corbaCollection, inout boolean has,
+		       inout corbaComError error);
+  void      ping(in corbatext_t collection, inout boolean wasSuccess, inout corbaComError error);
+  void      getDocument(in corbatext_t collection,
+			inout corbaDocRequest request, inout corbaDocResponse response,
+			inout corbaComError error);
+  void      getCollectInfo(in corbatext_t collection,
+			   inout corbaColInfoResponse response,
+			   inout corbaComError error);
+  void      getFilterInfo(in corbatext_t collection, 
+                          inout corbatext_tarray filterNames, 
+			  inout corbaComError error);
+  void      getFilterOptions(in corbatext_t collection,
+                             in corbatext_t option,
+                             inout corbaFilterOptionsResponse response,
+			     inout corbaComError error);
+  void      filter(in corbatext_t collection,
+		   in corbaFilterRequest request,
+                   inout corbaFilterResponse response,
+                   inout corbaComError error);
+};
+
+};
Index: /main/tags/2.38/gsdl/lib/corbaiface.mpp
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaiface.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaiface.mpp	(revision 21083)
@@ -0,0 +1,1996 @@
+/*
+ *  MICO --- a free CORBA implementation
+ *  Copyright (C) 1997-98 Kay Roemer & Arno Puder
+ *
+ *  This file was automatically generated. DO NOT EDIT!
+ */
+
+#include "corbaiface.h"
+
+//--------------------------------------------------------
+//  Implementation of stubs
+//--------------------------------------------------------
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbatext_t::corbatext_t()
+{
+}
+
+gsdlInterface::corbatext_t::corbatext_t( const corbatext_t& _s )
+{
+  text = ((corbatext_t&)_s).text;
+  encoding = ((corbatext_t&)_s).encoding;
+  length = ((corbatext_t&)_s).length;
+}
+
+gsdlInterface::corbatext_t::~corbatext_t()
+{
+}
+
+gsdlInterface::corbatext_t&
+gsdlInterface::corbatext_t::operator=( const corbatext_t& _s )
+{
+  text = ((corbatext_t&)_s).text;
+  encoding = ((corbatext_t&)_s).encoding;
+  length = ((corbatext_t&)_s).length;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbatext_t : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbatext_t _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbatext_t::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbatext_t::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbatext_t::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbatext_t::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    CORBA::_stcseq_ushort->demarshal( dc, &((_MICO_T*)v)->text ) &&
+    CORBA::_stc_ushort->demarshal( dc, &((_MICO_T*)v)->encoding ) &&
+    CORBA::_stc_ulong->demarshal( dc, &((_MICO_T*)v)->length ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbatext_t::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  CORBA::_stcseq_ushort->marshal( ec, &((_MICO_T*)v)->text );
+  CORBA::_stc_ushort->marshal( ec, &((_MICO_T*)v)->encoding );
+  CORBA::_stc_ulong->marshal( ec, &((_MICO_T*)v)->length );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbatext_t;
+
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbatext_tmap::corbatext_tmap()
+{
+}
+
+gsdlInterface::corbatext_tmap::corbatext_tmap( const corbatext_tmap& _s )
+{
+  names = ((corbatext_tmap&)_s).names;
+  values = ((corbatext_tmap&)_s).values;
+}
+
+gsdlInterface::corbatext_tmap::~corbatext_tmap()
+{
+}
+
+gsdlInterface::corbatext_tmap&
+gsdlInterface::corbatext_tmap::operator=( const corbatext_tmap& _s )
+{
+  names = ((corbatext_tmap&)_s).names;
+  values = ((corbatext_tmap&)_s).values;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbatext_tmap : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbatext_tmap _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbatext_tmap::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbatext_tmap::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbatext_tmap::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbatext_tmap::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->names ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->values ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbatext_tmap::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->names );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->values );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbatext_tmap;
+
+
+class _Marshaller_gsdlInterface_corbaComError : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaComError _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaComError::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaComError::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaComError::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaComError::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong ul;
+  if( !dc.enumeration( ul ) )
+    return FALSE;
+  *(_MICO_T*) v = (_MICO_T) ul;
+  return TRUE;
+}
+
+void _Marshaller_gsdlInterface_corbaComError::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.enumeration( (CORBA::ULong) *(_MICO_T *) v );
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaComError;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaShortColInfo::corbaShortColInfo()
+{
+}
+
+gsdlInterface::corbaShortColInfo::corbaShortColInfo( const corbaShortColInfo& _s )
+{
+  name = ((corbaShortColInfo&)_s).name;
+  host = ((corbaShortColInfo&)_s).host;
+  response = ((corbaShortColInfo&)_s).response;
+}
+
+gsdlInterface::corbaShortColInfo::~corbaShortColInfo()
+{
+}
+
+gsdlInterface::corbaShortColInfo&
+gsdlInterface::corbaShortColInfo::operator=( const corbaShortColInfo& _s )
+{
+  name = ((corbaShortColInfo&)_s).name;
+  host = ((corbaShortColInfo&)_s).host;
+  response = ((corbaShortColInfo&)_s).response;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaShortColInfo : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaShortColInfo _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaShortColInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaShortColInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaShortColInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaShortColInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->name ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->host ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->response ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaShortColInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->name );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->host );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->response );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaShortColInfo;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaColInfoResponse::corbaColInfoResponse()
+{
+}
+
+gsdlInterface::corbaColInfoResponse::corbaColInfoResponse( const corbaColInfoResponse& _s )
+{
+  shoftInfo = ((corbaColInfoResponse&)_s).shoftInfo;
+  isPublic = ((corbaColInfoResponse&)_s).isPublic;
+  isBeta = ((corbaColInfoResponse&)_s).isBeta;
+  buildDate = ((corbaColInfoResponse&)_s).buildDate;
+  ccsCols = ((corbaColInfoResponse&)_s).ccsCols;
+  languages = ((corbaColInfoResponse&)_s).languages;
+  numDocs = ((corbaColInfoResponse&)_s).numDocs;
+  numWords = ((corbaColInfoResponse&)_s).numWords;
+  numBytes = ((corbaColInfoResponse&)_s).numBytes;
+  collectionMeta = ((corbaColInfoResponse&)_s).collectionMeta;
+  format = ((corbaColInfoResponse&)_s).format;
+  building = ((corbaColInfoResponse&)_s).building;
+  httpdomain = ((corbaColInfoResponse&)_s).httpdomain;
+  httpprefix = ((corbaColInfoResponse&)_s).httpprefix;
+  receptionist = ((corbaColInfoResponse&)_s).receptionist;
+}
+
+gsdlInterface::corbaColInfoResponse::~corbaColInfoResponse()
+{
+}
+
+gsdlInterface::corbaColInfoResponse&
+gsdlInterface::corbaColInfoResponse::operator=( const corbaColInfoResponse& _s )
+{
+  shoftInfo = ((corbaColInfoResponse&)_s).shoftInfo;
+  isPublic = ((corbaColInfoResponse&)_s).isPublic;
+  isBeta = ((corbaColInfoResponse&)_s).isBeta;
+  buildDate = ((corbaColInfoResponse&)_s).buildDate;
+  ccsCols = ((corbaColInfoResponse&)_s).ccsCols;
+  languages = ((corbaColInfoResponse&)_s).languages;
+  numDocs = ((corbaColInfoResponse&)_s).numDocs;
+  numWords = ((corbaColInfoResponse&)_s).numWords;
+  numBytes = ((corbaColInfoResponse&)_s).numBytes;
+  collectionMeta = ((corbaColInfoResponse&)_s).collectionMeta;
+  format = ((corbaColInfoResponse&)_s).format;
+  building = ((corbaColInfoResponse&)_s).building;
+  httpdomain = ((corbaColInfoResponse&)_s).httpdomain;
+  httpprefix = ((corbaColInfoResponse&)_s).httpprefix;
+  receptionist = ((corbaColInfoResponse&)_s).receptionist;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaColInfoResponse : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaColInfoResponse _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaColInfoResponse::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaColInfoResponse::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaColInfoResponse::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaColInfoResponse::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbaShortColInfo->demarshal( dc, &((_MICO_T*)v)->shoftInfo ) &&
+    CORBA::_stc_boolean->demarshal( dc, &((_MICO_T*)v)->isPublic ) &&
+    CORBA::_stc_boolean->demarshal( dc, &((_MICO_T*)v)->isBeta ) &&
+    CORBA::_stc_ulong->demarshal( dc, &((_MICO_T*)v)->buildDate ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->ccsCols ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->languages ) &&
+    CORBA::_stc_ulong->demarshal( dc, &((_MICO_T*)v)->numDocs ) &&
+    CORBA::_stc_ulong->demarshal( dc, &((_MICO_T*)v)->numWords ) &&
+    CORBA::_stc_ulong->demarshal( dc, &((_MICO_T*)v)->numBytes ) &&
+    _marshaller_gsdlInterface_corbatext_tmap->demarshal( dc, &((_MICO_T*)v)->collectionMeta ) &&
+    _marshaller_gsdlInterface_corbatext_tmap->demarshal( dc, &((_MICO_T*)v)->format ) &&
+    _marshaller_gsdlInterface_corbatext_tmap->demarshal( dc, &((_MICO_T*)v)->building ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->httpdomain ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->httpprefix ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->receptionist ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaColInfoResponse::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbaShortColInfo->marshal( ec, &((_MICO_T*)v)->shoftInfo );
+  CORBA::_stc_boolean->marshal( ec, &((_MICO_T*)v)->isPublic );
+  CORBA::_stc_boolean->marshal( ec, &((_MICO_T*)v)->isBeta );
+  CORBA::_stc_ulong->marshal( ec, &((_MICO_T*)v)->buildDate );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->ccsCols );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->languages );
+  CORBA::_stc_ulong->marshal( ec, &((_MICO_T*)v)->numDocs );
+  CORBA::_stc_ulong->marshal( ec, &((_MICO_T*)v)->numWords );
+  CORBA::_stc_ulong->marshal( ec, &((_MICO_T*)v)->numBytes );
+  _marshaller_gsdlInterface_corbatext_tmap->marshal( ec, &((_MICO_T*)v)->collectionMeta );
+  _marshaller_gsdlInterface_corbatext_tmap->marshal( ec, &((_MICO_T*)v)->format );
+  _marshaller_gsdlInterface_corbatext_tmap->marshal( ec, &((_MICO_T*)v)->building );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->httpdomain );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->httpprefix );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->receptionist );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaColInfoResponse;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaDocRequest::corbaDocRequest()
+{
+}
+
+gsdlInterface::corbaDocRequest::corbaDocRequest( const corbaDocRequest& _s )
+{
+  OID = ((corbaDocRequest&)_s).OID;
+  docType = ((corbaDocRequest&)_s).docType;
+  docFormat = ((corbaDocRequest&)_s).docFormat;
+}
+
+gsdlInterface::corbaDocRequest::~corbaDocRequest()
+{
+}
+
+gsdlInterface::corbaDocRequest&
+gsdlInterface::corbaDocRequest::operator=( const corbaDocRequest& _s )
+{
+  OID = ((corbaDocRequest&)_s).OID;
+  docType = ((corbaDocRequest&)_s).docType;
+  docFormat = ((corbaDocRequest&)_s).docFormat;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaDocRequest : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaDocRequest _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaDocRequest::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaDocRequest::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaDocRequest::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaDocRequest::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->OID ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->docType ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->docFormat ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaDocRequest::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->OID );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->docType );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->docFormat );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaDocRequest;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaDocResponse::corbaDocResponse()
+{
+}
+
+gsdlInterface::corbaDocResponse::corbaDocResponse( const corbaDocResponse& _s )
+{
+  doc = ((corbaDocResponse&)_s).doc;
+}
+
+gsdlInterface::corbaDocResponse::~corbaDocResponse()
+{
+}
+
+gsdlInterface::corbaDocResponse&
+gsdlInterface::corbaDocResponse::operator=( const corbaDocResponse& _s )
+{
+  doc = ((corbaDocResponse&)_s).doc;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaDocResponse : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaDocResponse _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaDocResponse::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaDocResponse::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaDocResponse::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaDocResponse::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->doc ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaDocResponse::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->doc );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaDocResponse;
+
+
+class _Marshaller_gsdlInterface_corbaFilterType : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterType _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterType::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterType::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterType::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterType::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong ul;
+  if( !dc.enumeration( ul ) )
+    return FALSE;
+  *(_MICO_T*) v = (_MICO_T) ul;
+  return TRUE;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterType::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.enumeration( (CORBA::ULong) *(_MICO_T *) v );
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterType;
+
+
+class _Marshaller_gsdlInterface_corbaFilterRepeatable : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterRepeatable _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterRepeatable::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRepeatable::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRepeatable::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterRepeatable::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong ul;
+  if( !dc.enumeration( ul ) )
+    return FALSE;
+  *(_MICO_T*) v = (_MICO_T) ul;
+  return TRUE;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRepeatable::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.enumeration( (CORBA::ULong) *(_MICO_T *) v );
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterRepeatable;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaFilterOption::corbaFilterOption()
+{
+}
+
+gsdlInterface::corbaFilterOption::corbaFilterOption( const corbaFilterOption& _s )
+{
+  name = ((corbaFilterOption&)_s).name;
+  type = ((corbaFilterOption&)_s).type;
+  repeatable = ((corbaFilterOption&)_s).repeatable;
+  defaultValue = ((corbaFilterOption&)_s).defaultValue;
+  validValues = ((corbaFilterOption&)_s).validValues;
+}
+
+gsdlInterface::corbaFilterOption::~corbaFilterOption()
+{
+}
+
+gsdlInterface::corbaFilterOption&
+gsdlInterface::corbaFilterOption::operator=( const corbaFilterOption& _s )
+{
+  name = ((corbaFilterOption&)_s).name;
+  type = ((corbaFilterOption&)_s).type;
+  repeatable = ((corbaFilterOption&)_s).repeatable;
+  defaultValue = ((corbaFilterOption&)_s).defaultValue;
+  validValues = ((corbaFilterOption&)_s).validValues;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaFilterOption : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterOption _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterOption::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOption::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOption::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterOption::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->name ) &&
+    _marshaller_gsdlInterface_corbaFilterType->demarshal( dc, &((_MICO_T*)v)->type ) &&
+    _marshaller_gsdlInterface_corbaFilterRepeatable->demarshal( dc, &((_MICO_T*)v)->repeatable ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->defaultValue ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->validValues ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOption::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->name );
+  _marshaller_gsdlInterface_corbaFilterType->marshal( ec, &((_MICO_T*)v)->type );
+  _marshaller_gsdlInterface_corbaFilterRepeatable->marshal( ec, &((_MICO_T*)v)->repeatable );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->defaultValue );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->validValues );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterOption;
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaFilterOptionsResponse::corbaFilterOptionsResponse()
+{
+}
+
+gsdlInterface::corbaFilterOptionsResponse::corbaFilterOptionsResponse( const corbaFilterOptionsResponse& _s )
+{
+  options = ((corbaFilterOptionsResponse&)_s).options;
+  names = ((corbaFilterOptionsResponse&)_s).names;
+}
+
+gsdlInterface::corbaFilterOptionsResponse::~corbaFilterOptionsResponse()
+{
+}
+
+gsdlInterface::corbaFilterOptionsResponse&
+gsdlInterface::corbaFilterOptionsResponse::operator=( const corbaFilterOptionsResponse& _s )
+{
+  options = ((corbaFilterOptionsResponse&)_s).options;
+  names = ((corbaFilterOptionsResponse&)_s).names;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaFilterOptionsResponse : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterOptionsResponse _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterOptionsResponse::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOptionsResponse::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOptionsResponse::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterOptionsResponse::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller__seq_gsdlInterface_corbaFilterOption->demarshal( dc, &((_MICO_T*)v)->options ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->names ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaFilterOptionsResponse::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller__seq_gsdlInterface_corbaFilterOption->marshal( ec, &((_MICO_T*)v)->options );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->names );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterOptionsResponse;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaOptionValue::corbaOptionValue()
+{
+}
+
+gsdlInterface::corbaOptionValue::corbaOptionValue( const corbaOptionValue& _s )
+{
+  name = ((corbaOptionValue&)_s).name;
+  value = ((corbaOptionValue&)_s).value;
+}
+
+gsdlInterface::corbaOptionValue::~corbaOptionValue()
+{
+}
+
+gsdlInterface::corbaOptionValue&
+gsdlInterface::corbaOptionValue::operator=( const corbaOptionValue& _s )
+{
+  name = ((corbaOptionValue&)_s).name;
+  value = ((corbaOptionValue&)_s).value;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaOptionValue : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaOptionValue _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaOptionValue::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaOptionValue::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaOptionValue::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaOptionValue::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->name ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->value ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaOptionValue::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->name );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->value );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaOptionValue;
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaFilterRequest::corbaFilterRequest()
+{
+}
+
+gsdlInterface::corbaFilterRequest::corbaFilterRequest( const corbaFilterRequest& _s )
+{
+  filter = ((corbaFilterRequest&)_s).filter;
+  filterOptions = ((corbaFilterRequest&)_s).filterOptions;
+  docSet = ((corbaFilterRequest&)_s).docSet;
+  filterResultOptions = ((corbaFilterRequest&)_s).filterResultOptions;
+  requestParams = ((corbaFilterRequest&)_s).requestParams;
+  refParams = ((corbaFilterRequest&)_s).refParams;
+  fields = ((corbaFilterRequest&)_s).fields;
+  getParents = ((corbaFilterRequest&)_s).getParents;
+}
+
+gsdlInterface::corbaFilterRequest::~corbaFilterRequest()
+{
+}
+
+gsdlInterface::corbaFilterRequest&
+gsdlInterface::corbaFilterRequest::operator=( const corbaFilterRequest& _s )
+{
+  filter = ((corbaFilterRequest&)_s).filter;
+  filterOptions = ((corbaFilterRequest&)_s).filterOptions;
+  docSet = ((corbaFilterRequest&)_s).docSet;
+  filterResultOptions = ((corbaFilterRequest&)_s).filterResultOptions;
+  requestParams = ((corbaFilterRequest&)_s).requestParams;
+  refParams = ((corbaFilterRequest&)_s).refParams;
+  fields = ((corbaFilterRequest&)_s).fields;
+  getParents = ((corbaFilterRequest&)_s).getParents;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaFilterRequest : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterRequest _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterRequest::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRequest::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRequest::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterRequest::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->filter ) &&
+    _marshaller__seq_gsdlInterface_corbaOptionValue->demarshal( dc, &((_MICO_T*)v)->filterOptions ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->docSet ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->filterResultOptions ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->requestParams ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->refParams ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->fields ) &&
+    CORBA::_stc_boolean->demarshal( dc, &((_MICO_T*)v)->getParents ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaFilterRequest::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->filter );
+  _marshaller__seq_gsdlInterface_corbaOptionValue->marshal( ec, &((_MICO_T*)v)->filterOptions );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->docSet );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->filterResultOptions );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->requestParams );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->refParams );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->fields );
+  CORBA::_stc_boolean->marshal( ec, &((_MICO_T*)v)->getParents );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterRequest;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaTermInfo::corbaTermInfo()
+{
+}
+
+gsdlInterface::corbaTermInfo::corbaTermInfo( const corbaTermInfo& _s )
+{
+  term = ((corbaTermInfo&)_s).term;
+  frequency = ((corbaTermInfo&)_s).frequency;
+  matchTerms = ((corbaTermInfo&)_s).matchTerms;
+}
+
+gsdlInterface::corbaTermInfo::~corbaTermInfo()
+{
+}
+
+gsdlInterface::corbaTermInfo&
+gsdlInterface::corbaTermInfo::operator=( const corbaTermInfo& _s )
+{
+  term = ((corbaTermInfo&)_s).term;
+  frequency = ((corbaTermInfo&)_s).frequency;
+  matchTerms = ((corbaTermInfo&)_s).matchTerms;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaTermInfo : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaTermInfo _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaTermInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaTermInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaTermInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaTermInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->term ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->frequency ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->matchTerms ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaTermInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->term );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->frequency );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->matchTerms );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaTermInfo;
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaMetadataInfo::corbaMetadataInfo()
+{
+}
+
+gsdlInterface::corbaMetadataInfo::corbaMetadataInfo( const corbaMetadataInfo& _s )
+{
+  params = ((corbaMetadataInfo&)_s).params;
+  isRef = ((corbaMetadataInfo&)_s).isRef;
+  values = ((corbaMetadataInfo&)_s).values;
+  id = ((corbaMetadataInfo&)_s).id;
+  parentid = ((corbaMetadataInfo&)_s).parentid;
+}
+
+gsdlInterface::corbaMetadataInfo::~corbaMetadataInfo()
+{
+}
+
+gsdlInterface::corbaMetadataInfo&
+gsdlInterface::corbaMetadataInfo::operator=( const corbaMetadataInfo& _s )
+{
+  params = ((corbaMetadataInfo&)_s).params;
+  isRef = ((corbaMetadataInfo&)_s).isRef;
+  values = ((corbaMetadataInfo&)_s).values;
+  id = ((corbaMetadataInfo&)_s).id;
+  parentid = ((corbaMetadataInfo&)_s).parentid;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaMetadataInfo : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaMetadataInfo _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaMetadataInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaMetadataInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->params ) &&
+    CORBA::_stc_boolean->demarshal( dc, &((_MICO_T*)v)->isRef ) &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->values ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->id ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->parentid ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->params );
+  CORBA::_stc_boolean->marshal( ec, &((_MICO_T*)v)->isRef );
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->values );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->id );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->parentid );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaMetadataInfo;
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaMetadataInfo_map::corbaMetadataInfo_map()
+{
+}
+
+gsdlInterface::corbaMetadataInfo_map::corbaMetadataInfo_map( const corbaMetadataInfo_map& _s )
+{
+  names = ((corbaMetadataInfo_map&)_s).names;
+  values = ((corbaMetadataInfo_map&)_s).values;
+}
+
+gsdlInterface::corbaMetadataInfo_map::~corbaMetadataInfo_map()
+{
+}
+
+gsdlInterface::corbaMetadataInfo_map&
+gsdlInterface::corbaMetadataInfo_map::operator=( const corbaMetadataInfo_map& _s )
+{
+  names = ((corbaMetadataInfo_map&)_s).names;
+  values = ((corbaMetadataInfo_map&)_s).values;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaMetadataInfo_map : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaMetadataInfo_map _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaMetadataInfo_map::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo_map::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo_map::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaMetadataInfo_map::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller__seq_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->names ) &&
+    _marshaller__seq_gsdlInterface_corbaMetadataInfo->demarshal( dc, &((_MICO_T*)v)->values ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaMetadataInfo_map::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller__seq_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->names );
+  _marshaller__seq_gsdlInterface_corbaMetadataInfo->marshal( ec, &((_MICO_T*)v)->values );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaMetadataInfo_map;
+
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaResultDocInfo::corbaResultDocInfo()
+{
+}
+
+gsdlInterface::corbaResultDocInfo::corbaResultDocInfo( const corbaResultDocInfo& _s )
+{
+  OID = ((corbaResultDocInfo&)_s).OID;
+  resultNum = ((corbaResultDocInfo&)_s).resultNum;
+  ranking = ((corbaResultDocInfo&)_s).ranking;
+  termsMatched = ((corbaResultDocInfo&)_s).termsMatched;
+  phraseMatched = ((corbaResultDocInfo&)_s).phraseMatched;
+  docFreq = ((corbaResultDocInfo&)_s).docFreq;
+  metadata = ((corbaResultDocInfo&)_s).metadata;
+  classifierMetadataType = ((corbaResultDocInfo&)_s).classifierMetadataType;
+  classifierMetadataOffset = ((corbaResultDocInfo&)_s).classifierMetadataOffset;
+  metaparents = ((corbaResultDocInfo&)_s).metaparents;
+}
+
+gsdlInterface::corbaResultDocInfo::~corbaResultDocInfo()
+{
+}
+
+gsdlInterface::corbaResultDocInfo&
+gsdlInterface::corbaResultDocInfo::operator=( const corbaResultDocInfo& _s )
+{
+  OID = ((corbaResultDocInfo&)_s).OID;
+  resultNum = ((corbaResultDocInfo&)_s).resultNum;
+  ranking = ((corbaResultDocInfo&)_s).ranking;
+  termsMatched = ((corbaResultDocInfo&)_s).termsMatched;
+  phraseMatched = ((corbaResultDocInfo&)_s).phraseMatched;
+  docFreq = ((corbaResultDocInfo&)_s).docFreq;
+  metadata = ((corbaResultDocInfo&)_s).metadata;
+  classifierMetadataType = ((corbaResultDocInfo&)_s).classifierMetadataType;
+  classifierMetadataOffset = ((corbaResultDocInfo&)_s).classifierMetadataOffset;
+  metaparents = ((corbaResultDocInfo&)_s).metaparents;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaResultDocInfo : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaResultDocInfo _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaResultDocInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaResultDocInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaResultDocInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaResultDocInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->OID ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->resultNum ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->ranking ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->termsMatched ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->phraseMatched ) &&
+    CORBA::_stcseq_long->demarshal( dc, &((_MICO_T*)v)->docFreq ) &&
+    _marshaller_gsdlInterface_corbaMetadataInfo_map->demarshal( dc, &((_MICO_T*)v)->metadata ) &&
+    _marshaller_gsdlInterface_corbatext_t->demarshal( dc, &((_MICO_T*)v)->classifierMetadataType ) &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->classifierMetadataOffset ) &&
+    _marshaller__seq_gsdlInterface_corbaMetadataInfo->demarshal( dc, &((_MICO_T*)v)->metaparents ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaResultDocInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->OID );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->resultNum );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->ranking );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->termsMatched );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->phraseMatched );
+  CORBA::_stcseq_long->marshal( ec, &((_MICO_T*)v)->docFreq );
+  _marshaller_gsdlInterface_corbaMetadataInfo_map->marshal( ec, &((_MICO_T*)v)->metadata );
+  _marshaller_gsdlInterface_corbatext_t->marshal( ec, &((_MICO_T*)v)->classifierMetadataType );
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->classifierMetadataOffset );
+  _marshaller__seq_gsdlInterface_corbaMetadataInfo->marshal( ec, &((_MICO_T*)v)->metaparents );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaResultDocInfo;
+
+
+
+class _Marshaller_gsdlInterface_corbaIsApprox : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaIsApprox _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaIsApprox::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaIsApprox::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaIsApprox::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaIsApprox::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong ul;
+  if( !dc.enumeration( ul ) )
+    return FALSE;
+  *(_MICO_T*) v = (_MICO_T) ul;
+  return TRUE;
+}
+
+void _Marshaller_gsdlInterface_corbaIsApprox::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.enumeration( (CORBA::ULong) *(_MICO_T *) v );
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaIsApprox;
+
+#ifdef HAVE_EXPLICIT_STRUCT_OPS
+gsdlInterface::corbaFilterResponse::corbaFilterResponse()
+{
+}
+
+gsdlInterface::corbaFilterResponse::corbaFilterResponse( const corbaFilterResponse& _s )
+{
+  numDocs = ((corbaFilterResponse&)_s).numDocs;
+  isApprox = ((corbaFilterResponse&)_s).isApprox;
+  termInfo = ((corbaFilterResponse&)_s).termInfo;
+  docInfo = ((corbaFilterResponse&)_s).docInfo;
+}
+
+gsdlInterface::corbaFilterResponse::~corbaFilterResponse()
+{
+}
+
+gsdlInterface::corbaFilterResponse&
+gsdlInterface::corbaFilterResponse::operator=( const corbaFilterResponse& _s )
+{
+  numDocs = ((corbaFilterResponse&)_s).numDocs;
+  isApprox = ((corbaFilterResponse&)_s).isApprox;
+  termInfo = ((corbaFilterResponse&)_s).termInfo;
+  docInfo = ((corbaFilterResponse&)_s).docInfo;
+  return *this;
+}
+#endif
+
+class _Marshaller_gsdlInterface_corbaFilterResponse : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaFilterResponse _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaFilterResponse::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterResponse::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller_gsdlInterface_corbaFilterResponse::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaFilterResponse::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  return
+    dc.struct_begin() &&
+    CORBA::_stc_long->demarshal( dc, &((_MICO_T*)v)->numDocs ) &&
+    _marshaller_gsdlInterface_corbaIsApprox->demarshal( dc, &((_MICO_T*)v)->isApprox ) &&
+    _marshaller__seq_gsdlInterface_corbaTermInfo->demarshal( dc, &((_MICO_T*)v)->termInfo ) &&
+    _marshaller__seq_gsdlInterface_corbaResultDocInfo->demarshal( dc, &((_MICO_T*)v)->docInfo ) &&
+    dc.struct_end();
+}
+
+void _Marshaller_gsdlInterface_corbaFilterResponse::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  ec.struct_begin();
+  CORBA::_stc_long->marshal( ec, &((_MICO_T*)v)->numDocs );
+  _marshaller_gsdlInterface_corbaIsApprox->marshal( ec, &((_MICO_T*)v)->isApprox );
+  _marshaller__seq_gsdlInterface_corbaTermInfo->marshal( ec, &((_MICO_T*)v)->termInfo );
+  _marshaller__seq_gsdlInterface_corbaResultDocInfo->marshal( ec, &((_MICO_T*)v)->docInfo );
+  ec.struct_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaFilterResponse;
+
+
+// Stub interface corbaiface
+gsdlInterface::corbaiface::~corbaiface()
+{
+}
+
+void *gsdlInterface::corbaiface::_narrow_helper( const char *_rid )
+{
+  if( strcmp( _rid, "IDL:gsdlInterface/corbaiface:1.0" ) == 0 )
+    return (void *)this;
+  return NULL;
+}
+
+bool gsdlInterface::corbaiface::_narrow_helper2( CORBA::Object_ptr _obj )
+{
+  if( strcmp( _obj->_repoid(), "IDL:gsdlInterface/corbaiface:1.0" ) == 0) {
+    return true;
+  }
+  for( vector<CORBA::Narrow_proto>::size_type _i = 0;
+       _narrow_helpers && _i < _narrow_helpers->size(); _i++ ) {
+    bool _res = (*(*_narrow_helpers)[ _i ])( _obj );
+    if( _res )
+      return true;
+  }
+  return false;
+}
+
+gsdlInterface::corbaiface_ptr gsdlInterface::corbaiface::_narrow( CORBA::Object_ptr _obj )
+{
+  gsdlInterface::corbaiface_ptr _o;
+  if( !CORBA::is_nil( _obj ) ) {
+    void *_p;
+    if( (_p = _obj->_narrow_helper( "IDL:gsdlInterface/corbaiface:1.0" )))
+      return _duplicate( (gsdlInterface::corbaiface_ptr) _p );
+    if( _narrow_helper2( _obj ) ||
+       ( _obj->_is_a_remote( "IDL:gsdlInterface/corbaiface:1.0" ) ) ) {
+      _o = new gsdlInterface::corbaiface_stub;
+      _o->MICO_SCOPE(CORBA,Object::operator=)( *_obj );
+      return _o;
+    }
+  }
+  return _nil();
+}
+
+gsdlInterface::corbaiface_ptr
+gsdlInterface::corbaiface::_narrow( CORBA::AbstractBase_ptr _obj )
+{
+  return _narrow (_obj->_to_object());
+}
+
+gsdlInterface::corbaiface_stub::~corbaiface_stub()
+{
+}
+
+CORBA::Boolean gsdlInterface::corbaiface_stub::initialise( gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::Boolean _res;
+  CORBA::StaticAny __res( CORBA::_stc_boolean, &_res );
+
+  CORBA::StaticRequest __req( this, "initialise" );
+  __req.add_inout_arg( &_error );
+  __req.set_result( &__res );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+  return _res;
+}
+
+
+void gsdlInterface::corbaiface_stub::configure( const gsdlInterface::corbatext_t& key, const gsdlInterface::corbatext_tarray& cfgline, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _key( _marshaller_gsdlInterface_corbatext_t, &key );
+  CORBA::StaticAny _cfgline( _marshaller__seq_gsdlInterface_corbatext_t, &cfgline );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "configure" );
+  __req.add_in_arg( &_key );
+  __req.add_in_arg( &_cfgline );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::collectionList( gsdlInterface::corbatext_tarray& collist, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collist( _marshaller__seq_gsdlInterface_corbatext_t, &collist );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "collectionList" );
+  __req.add_inout_arg( &_collist );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::hasCollection( const gsdlInterface::corbatext_t& corbaCollection, CORBA::Boolean& has, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _corbaCollection( _marshaller_gsdlInterface_corbatext_t, &corbaCollection );
+  CORBA::StaticAny _has( CORBA::_stc_boolean, &has );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "hasCollection" );
+  __req.add_in_arg( &_corbaCollection );
+  __req.add_inout_arg( &_has );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::ping( const gsdlInterface::corbatext_t& collection, CORBA::Boolean& wasSuccess, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _wasSuccess( CORBA::_stc_boolean, &wasSuccess );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "ping" );
+  __req.add_in_arg( &_collection );
+  __req.add_inout_arg( &_wasSuccess );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::getDocument( const gsdlInterface::corbatext_t& collection, gsdlInterface::corbaDocRequest& request, gsdlInterface::corbaDocResponse& response, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _request( _marshaller_gsdlInterface_corbaDocRequest, &request );
+  CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaDocResponse, &response );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "getDocument" );
+  __req.add_in_arg( &_collection );
+  __req.add_inout_arg( &_request );
+  __req.add_inout_arg( &_response );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::getCollectInfo( const gsdlInterface::corbatext_t& collection, gsdlInterface::corbaColInfoResponse& response, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaColInfoResponse, &response );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "getCollectInfo" );
+  __req.add_in_arg( &_collection );
+  __req.add_inout_arg( &_response );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::getFilterInfo( const gsdlInterface::corbatext_t& collection, gsdlInterface::corbatext_tarray& filterNames, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _filterNames( _marshaller__seq_gsdlInterface_corbatext_t, &filterNames );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "getFilterInfo" );
+  __req.add_in_arg( &_collection );
+  __req.add_inout_arg( &_filterNames );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::getFilterOptions( const gsdlInterface::corbatext_t& collection, const gsdlInterface::corbatext_t& option, gsdlInterface::corbaFilterOptionsResponse& response, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _option( _marshaller_gsdlInterface_corbatext_t, &option );
+  CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaFilterOptionsResponse, &response );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "getFilterOptions" );
+  __req.add_in_arg( &_collection );
+  __req.add_in_arg( &_option );
+  __req.add_inout_arg( &_response );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+void gsdlInterface::corbaiface_stub::filter( const gsdlInterface::corbatext_t& collection, const gsdlInterface::corbaFilterRequest& request, gsdlInterface::corbaFilterResponse& response, gsdlInterface::corbaComError& error )
+{
+  CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+  CORBA::StaticAny _request( _marshaller_gsdlInterface_corbaFilterRequest, &request );
+  CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaFilterResponse, &response );
+  CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+  CORBA::StaticRequest __req( this, "filter" );
+  __req.add_in_arg( &_collection );
+  __req.add_in_arg( &_request );
+  __req.add_inout_arg( &_response );
+  __req.add_inout_arg( &_error );
+
+  __req.invoke();
+
+  mico_sii_throw( &__req, 
+    0);
+}
+
+
+#ifdef HAVE_NAMESPACE
+namespace gsdlInterface { vector<CORBA::Narrow_proto> * corbaiface::_narrow_helpers; }
+#else
+vector<CORBA::Narrow_proto> * gsdlInterface::corbaiface::_narrow_helpers;
+#endif
+
+class _Marshaller_gsdlInterface_corbaiface : public CORBA::StaticTypeInfo {
+    typedef gsdlInterface::corbaiface_ptr _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller_gsdlInterface_corbaiface::create() const
+{
+  return (StaticValueType) new _MICO_T( 0 );
+}
+
+void _Marshaller_gsdlInterface_corbaiface::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = ::gsdlInterface::corbaiface::_duplicate( *(_MICO_T*) s );
+}
+
+void _Marshaller_gsdlInterface_corbaiface::free( StaticValueType v ) const
+{
+  CORBA::release( *(_MICO_T *) v );
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller_gsdlInterface_corbaiface::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::Object_ptr obj;
+  if (!CORBA::_stc_Object->demarshal(dc, &obj))
+    return FALSE;
+  *(_MICO_T *) v = ::gsdlInterface::corbaiface::_narrow( obj );
+  CORBA::Boolean ret = CORBA::is_nil (obj) || !CORBA::is_nil (*(_MICO_T *)v);
+  CORBA::release (obj);
+  return ret;
+}
+
+void _Marshaller_gsdlInterface_corbaiface::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::Object_ptr obj = *(_MICO_T *) v;
+  CORBA::_stc_Object->marshal( ec, &obj );
+}
+
+CORBA::StaticTypeInfo *_marshaller_gsdlInterface_corbaiface;
+
+class _Marshaller__seq_gsdlInterface_corbatext_t : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbatext_t,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbatext_t::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbatext_t::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbatext_t::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbatext_t::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbatext_t->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbatext_t::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbatext_t->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbatext_t;
+
+class _Marshaller__seq_gsdlInterface_corbaFilterOption : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbaFilterOption,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbaFilterOption::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaFilterOption::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaFilterOption::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbaFilterOption::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbaFilterOption->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbaFilterOption::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbaFilterOption->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaFilterOption;
+
+class _Marshaller__seq_gsdlInterface_corbaOptionValue : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbaOptionValue,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbaOptionValue::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaOptionValue::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaOptionValue::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbaOptionValue::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbaOptionValue->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbaOptionValue::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbaOptionValue->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaOptionValue;
+
+class _Marshaller__seq_gsdlInterface_corbaTermInfo : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbaTermInfo,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbaTermInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaTermInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaTermInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbaTermInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbaTermInfo->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbaTermInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbaTermInfo->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaTermInfo;
+
+class _Marshaller__seq_gsdlInterface_corbaMetadataInfo : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbaMetadataInfo,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbaMetadataInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaMetadataInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaMetadataInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbaMetadataInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbaMetadataInfo->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbaMetadataInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbaMetadataInfo->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaMetadataInfo;
+
+class _Marshaller__seq_gsdlInterface_corbaResultDocInfo : public CORBA::StaticTypeInfo {
+    typedef SequenceTmpl<gsdlInterface::corbaResultDocInfo,MICO_TID_DEF> _MICO_T;
+  public:
+    StaticValueType create () const;
+    void assign (StaticValueType dst, const StaticValueType src) const;
+    void free (StaticValueType) const;
+    CORBA::Boolean demarshal (CORBA::DataDecoder&, StaticValueType) const;
+    void marshal (CORBA::DataEncoder &, StaticValueType) const;
+};
+
+
+CORBA::StaticValueType _Marshaller__seq_gsdlInterface_corbaResultDocInfo::create() const
+{
+  return (StaticValueType) new _MICO_T;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaResultDocInfo::assign( StaticValueType d, const StaticValueType s ) const
+{
+  *(_MICO_T*) d = *(_MICO_T*) s;
+}
+
+void _Marshaller__seq_gsdlInterface_corbaResultDocInfo::free( StaticValueType v ) const
+{
+  delete (_MICO_T*) v;
+}
+
+CORBA::Boolean _Marshaller__seq_gsdlInterface_corbaResultDocInfo::demarshal( CORBA::DataDecoder &dc, StaticValueType v ) const
+{
+  CORBA::ULong len;
+  if( !dc.seq_begin( len ) )
+    return FALSE;
+  ((_MICO_T *) v)->length( len );
+  for( CORBA::ULong i = 0; i < len; i++ ) {
+    if( !_marshaller_gsdlInterface_corbaResultDocInfo->demarshal( dc, &(*(_MICO_T*)v)[i] ) )
+      return FALSE;
+  }
+  return dc.seq_end();
+}
+
+void _Marshaller__seq_gsdlInterface_corbaResultDocInfo::marshal( CORBA::DataEncoder &ec, StaticValueType v ) const
+{
+  CORBA::ULong len = ((_MICO_T *) v)->length();
+  ec.seq_begin( len );
+  for( CORBA::ULong i = 0; i < len; i++ )
+    _marshaller_gsdlInterface_corbaResultDocInfo->marshal( ec, &(*(_MICO_T*)v)[i] );
+  ec.seq_end();
+}
+
+CORBA::StaticTypeInfo *_marshaller__seq_gsdlInterface_corbaResultDocInfo;
+
+struct __tc_init_CORBAIFACE {
+  __tc_init_CORBAIFACE()
+  {
+    _marshaller_gsdlInterface_corbatext_t = new _Marshaller_gsdlInterface_corbatext_t;
+    _marshaller_gsdlInterface_corbatext_tmap = new _Marshaller_gsdlInterface_corbatext_tmap;
+    _marshaller_gsdlInterface_corbaComError = new _Marshaller_gsdlInterface_corbaComError;
+    _marshaller_gsdlInterface_corbaShortColInfo = new _Marshaller_gsdlInterface_corbaShortColInfo;
+    _marshaller_gsdlInterface_corbaColInfoResponse = new _Marshaller_gsdlInterface_corbaColInfoResponse;
+    _marshaller_gsdlInterface_corbaDocRequest = new _Marshaller_gsdlInterface_corbaDocRequest;
+    _marshaller_gsdlInterface_corbaDocResponse = new _Marshaller_gsdlInterface_corbaDocResponse;
+    _marshaller_gsdlInterface_corbaFilterType = new _Marshaller_gsdlInterface_corbaFilterType;
+    _marshaller_gsdlInterface_corbaFilterRepeatable = new _Marshaller_gsdlInterface_corbaFilterRepeatable;
+    _marshaller_gsdlInterface_corbaFilterOption = new _Marshaller_gsdlInterface_corbaFilterOption;
+    _marshaller_gsdlInterface_corbaFilterOptionsResponse = new _Marshaller_gsdlInterface_corbaFilterOptionsResponse;
+    _marshaller_gsdlInterface_corbaOptionValue = new _Marshaller_gsdlInterface_corbaOptionValue;
+    _marshaller_gsdlInterface_corbaFilterRequest = new _Marshaller_gsdlInterface_corbaFilterRequest;
+    _marshaller_gsdlInterface_corbaTermInfo = new _Marshaller_gsdlInterface_corbaTermInfo;
+    _marshaller_gsdlInterface_corbaMetadataInfo = new _Marshaller_gsdlInterface_corbaMetadataInfo;
+    _marshaller_gsdlInterface_corbaMetadataInfo_map = new _Marshaller_gsdlInterface_corbaMetadataInfo_map;
+    _marshaller_gsdlInterface_corbaResultDocInfo = new _Marshaller_gsdlInterface_corbaResultDocInfo;
+    _marshaller_gsdlInterface_corbaIsApprox = new _Marshaller_gsdlInterface_corbaIsApprox;
+    _marshaller_gsdlInterface_corbaFilterResponse = new _Marshaller_gsdlInterface_corbaFilterResponse;
+    _marshaller_gsdlInterface_corbaiface = new _Marshaller_gsdlInterface_corbaiface;
+    _marshaller__seq_gsdlInterface_corbatext_t = new _Marshaller__seq_gsdlInterface_corbatext_t;
+    _marshaller__seq_gsdlInterface_corbaFilterOption = new _Marshaller__seq_gsdlInterface_corbaFilterOption;
+    _marshaller__seq_gsdlInterface_corbaOptionValue = new _Marshaller__seq_gsdlInterface_corbaOptionValue;
+    _marshaller__seq_gsdlInterface_corbaTermInfo = new _Marshaller__seq_gsdlInterface_corbaTermInfo;
+    _marshaller__seq_gsdlInterface_corbaMetadataInfo = new _Marshaller__seq_gsdlInterface_corbaMetadataInfo;
+    _marshaller__seq_gsdlInterface_corbaResultDocInfo = new _Marshaller__seq_gsdlInterface_corbaResultDocInfo;
+  }
+};
+
+static __tc_init_CORBAIFACE __init_CORBAIFACE;
+
Index: /main/tags/2.38/gsdl/lib/corbaiface_skel.mpp
===================================================================
--- /main/tags/2.38/gsdl/lib/corbaiface_skel.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbaiface_skel.mpp	(revision 21083)
@@ -0,0 +1,274 @@
+/*
+ *  MICO --- a free CORBA implementation
+ *  Copyright (C) 1997-98 Kay Roemer & Arno Puder
+ *
+ *  This file was automatically generated. DO NOT EDIT!
+ */
+#include "corbaiface.h"
+
+//--------------------------------------------------------
+//  Implementation of skeletons
+//--------------------------------------------------------
+
+gsdlInterface::corbaiface_skel::corbaiface_skel( const CORBA::BOA::ReferenceData &_id )
+{
+  CORBA::ImplementationDef_var _impl =
+    _find_impl( "IDL:gsdlInterface/corbaiface:1.0", "corbaiface" );
+  assert( !CORBA::is_nil( _impl ) );
+  _create_ref( _id,
+    0,
+    _impl,
+    "IDL:gsdlInterface/corbaiface:1.0" );
+  register_dispatcher( new StaticInterfaceDispatcherWrapper<corbaiface_skel>( this ) );
+}
+
+gsdlInterface::corbaiface_skel::corbaiface_skel( CORBA::Object_ptr _obj )
+{
+  CORBA::ImplementationDef_var _impl =
+    _find_impl( "IDL:gsdlInterface/corbaiface:1.0", "corbaiface" );
+  assert( !CORBA::is_nil( _impl ) );
+  _restore_ref( _obj,
+    CORBA::BOA::ReferenceData(),
+    0,
+    _impl );
+  register_dispatcher( new StaticInterfaceDispatcherWrapper<corbaiface_skel>( this ) );
+}
+
+gsdlInterface::corbaiface_skel::~corbaiface_skel()
+{
+}
+
+bool gsdlInterface::corbaiface_skel::dispatch( CORBA::StaticServerRequest_ptr _req, CORBA::Environment & /*_env*/ )
+{
+  #ifdef HAVE_EXCEPTIONS
+  try {
+  #endif
+    switch (mico_string_hash (_req->op_name(), 17)) {
+    case 0:
+      if( strcmp( _req->op_name(), "collectionList" ) == 0 ) {
+        corbatext_tarray collist;
+        CORBA::StaticAny _collist( _marshaller__seq_gsdlInterface_corbatext_t, &collist );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_inout_arg( &_collist );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        collectionList( collist, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 3:
+      if( strcmp( _req->op_name(), "ping" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        CORBA::Boolean wasSuccess;
+        CORBA::StaticAny _wasSuccess( CORBA::_stc_boolean, &wasSuccess );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_inout_arg( &_wasSuccess );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        ping( collection, wasSuccess, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 7:
+      if( strcmp( _req->op_name(), "filter" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        corbaFilterRequest request;
+        CORBA::StaticAny _request( _marshaller_gsdlInterface_corbaFilterRequest, &request );
+        corbaFilterResponse response;
+        CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaFilterResponse, &response );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_in_arg( &_request );
+        _req->add_inout_arg( &_response );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        filter( collection, request, response, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 9:
+      if( strcmp( _req->op_name(), "getFilterOptions" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        corbatext_t option;
+        CORBA::StaticAny _option( _marshaller_gsdlInterface_corbatext_t, &option );
+        corbaFilterOptionsResponse response;
+        CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaFilterOptionsResponse, &response );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_in_arg( &_option );
+        _req->add_inout_arg( &_response );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        getFilterOptions( collection, option, response, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 10:
+      if( strcmp( _req->op_name(), "getCollectInfo" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        corbaColInfoResponse response;
+        CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaColInfoResponse, &response );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_inout_arg( &_response );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        getCollectInfo( collection, response, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 11:
+      if( strcmp( _req->op_name(), "initialise" ) == 0 ) {
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        CORBA::Boolean _res;
+        CORBA::StaticAny __res( CORBA::_stc_boolean, &_res );
+        _req->add_inout_arg( &_error );
+        _req->set_result( &__res );
+
+        if( !_req->read_args() )
+          return true;
+
+        _res = initialise( error );
+        _req->write_results();
+        return true;
+      }
+      if( strcmp( _req->op_name(), "getFilterInfo" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        corbatext_tarray filterNames;
+        CORBA::StaticAny _filterNames( _marshaller__seq_gsdlInterface_corbatext_t, &filterNames );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_inout_arg( &_filterNames );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        getFilterInfo( collection, filterNames, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 12:
+      if( strcmp( _req->op_name(), "hasCollection" ) == 0 ) {
+        corbatext_t corbaCollection;
+        CORBA::StaticAny _corbaCollection( _marshaller_gsdlInterface_corbatext_t, &corbaCollection );
+        CORBA::Boolean has;
+        CORBA::StaticAny _has( CORBA::_stc_boolean, &has );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_corbaCollection );
+        _req->add_inout_arg( &_has );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        hasCollection( corbaCollection, has, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    case 13:
+      if( strcmp( _req->op_name(), "configure" ) == 0 ) {
+        corbatext_t key;
+        CORBA::StaticAny _key( _marshaller_gsdlInterface_corbatext_t, &key );
+        corbatext_tarray cfgline;
+        CORBA::StaticAny _cfgline( _marshaller__seq_gsdlInterface_corbatext_t, &cfgline );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_key );
+        _req->add_in_arg( &_cfgline );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        configure( key, cfgline, error );
+        _req->write_results();
+        return true;
+      }
+      if( strcmp( _req->op_name(), "getDocument" ) == 0 ) {
+        corbatext_t collection;
+        CORBA::StaticAny _collection( _marshaller_gsdlInterface_corbatext_t, &collection );
+        corbaDocRequest request;
+        CORBA::StaticAny _request( _marshaller_gsdlInterface_corbaDocRequest, &request );
+        corbaDocResponse response;
+        CORBA::StaticAny _response( _marshaller_gsdlInterface_corbaDocResponse, &response );
+        corbaComError error;
+        CORBA::StaticAny _error( _marshaller_gsdlInterface_corbaComError, &error );
+
+        _req->add_in_arg( &_collection );
+        _req->add_inout_arg( &_request );
+        _req->add_inout_arg( &_response );
+        _req->add_inout_arg( &_error );
+
+        if( !_req->read_args() )
+          return true;
+
+        getDocument( collection, request, response, error );
+        _req->write_results();
+        return true;
+      }
+      break;
+    }
+  #ifdef HAVE_EXCEPTIONS
+  } catch( CORBA::SystemException_catch &_ex ) {
+    _req->set_exception( _ex->_clone() );
+    _req->write_results();
+    return true;
+  } catch( ... ) {
+    assert( 0 );
+    return true;
+  }
+  #endif
+  return false;
+}
+
+gsdlInterface::corbaiface_ptr gsdlInterface::corbaiface_skel::_this()
+{
+  return gsdlInterface::corbaiface::_duplicate( this );
+}
+
Index: /main/tags/2.38/gsdl/lib/corbatext_t.h
===================================================================
--- /main/tags/2.38/gsdl/lib/corbatext_t.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbatext_t.h	(revision 21083)
@@ -0,0 +1,13 @@
+void corbatext_fillChar(corbatext_t *t, char *text);
+void corbatext_usvector(corbatext_t t, vector<unsigned short>& us);
+char *corbatext_string(corbatext_t t);
+#ifdef TEXT_T_H
+void corbatext_arrayToCorbaArray(text_tarray t, corbatext_tarray *ca);
+void corbatext_corbaArrayToArray(corbatext_tarray ca, text_tarray *ta);
+void corbatext_mapToCorbaMap(text_tmap tm, corbatext_tmap *cm);
+void corbatext_corbaMapToMap(corbatext_tmap cm, text_tmap &tm);
+void corbatext_setToCorbaArray(text_tset set, corbatext_tset *cset);
+void corbatext_corbaArrayToSet(corbatext_tset cset, text_tset *set);
+corbatext_t_var corbatext_corbatext(text_t t);
+int corbatext_corbatext(text_t t, corbatext_t_var ct);
+#endif
Index: /main/tags/2.38/gsdl/lib/corbatext_t.mpp
===================================================================
--- /main/tags/2.38/gsdl/lib/corbatext_t.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/corbatext_t.mpp	(revision 21083)
@@ -0,0 +1,172 @@
+// standard headers
+#include <iostream.h>
+#include <fstream.h>
+
+// protocol headers
+#include "corbaiface.h"
+using namespace gsdlInterface;
+
+// greenstone headers
+#include "corbaconv_text_t.h"
+
+//local headers
+#include "corbatext_t.h"
+
+void corbatext_fillChar(corbatext_t *t, char *text)
+{
+  unsigned int i;
+
+  t->text.length(0);
+  if (text == NULL)
+      {
+	  return;
+      }
+  for (i = 0; i < strlen(text); i ++)
+      {
+	  t->text[i] = text[i];
+      }  
+  t->encoding = 0;
+}
+
+void corbatext_usvector(corbatext_t t, usvector& us)
+{
+  unsigned int i;
+
+  for (i = 0; i < t.text.length(); i ++)
+    {
+      us.push_back(t.text[i]);
+    }
+}
+
+char *corbatext_string(corbatext_t t)
+{ 
+  char *lcopy;
+  unsigned int i;
+    lcopy = (char *) malloc(t.text.length() + 1);
+    for (i = 0; i < t.text.length(); i ++)
+    {
+      lcopy[i] = (char) t.text[i];
+    }
+    lcopy[i] = '\0';
+    return lcopy;
+}
+
+corbatext_t_var corbatext_corbatext(text_t t)
+{ corbatext_t_var ct;
+// usString_var    us;
+
+  // cout << "Making text\n";
+  ct = new corbatext_t;
+  //  ct->text.length(20);
+  // us = new usString(20);
+  //  cout << ct->text.length() << endl;
+  //  cout << ct->text.maximum() << endl;
+  corbaconv_text_t::fillUsString(t,&ct->text);
+  //t.fillUsString(us);
+  // delete us;
+  // cout << "Encoding text\n";
+  ct->encoding = 0;
+  // cout << "Encoding text\n";
+  return ct;
+}
+
+int corbatext_corbatext(text_t t, corbatext_t_var ct)
+{
+  cout << "A" << endl;
+  corbaconv_text_t::fillUsString(t,&ct->text);
+  cout << "B" << endl;
+  ct->encoding = 0;
+  cout << "C" << endl;
+}
+
+void corbatext_corbaArrayToArray(corbatext_tarray ca, text_tarray *ta)
+{
+  unsigned int i;
+  corbaconv_text_t *cct;
+
+  ta->clear();
+  ta->reserve(ca.length());
+  for (i = 0; i < ca.length(); i ++)
+    {
+      cct = new corbaconv_text_t(ca[i]);
+      ta->push_back(*cct); // cast to text_t
+    }  
+}
+
+void corbatext_arrayToCorbaArray(text_tarray ta, corbatext_tarray *_ca)
+{
+  text_tarray::iterator here = ta.begin();
+  text_tarray::iterator end = ta.end();
+  corbatext_tarray ca(end - here);
+  unsigned int i;
+
+  i = 0;
+  (*_ca).length(end - here);
+
+  while (here != end)
+    {
+      corbatext_t_var ptr;
+      //      cout << "Array: " << (*_ca).maximum() << " " << (*_ca).length() << endl;
+      ptr = corbatext_corbatext(*here);
+      (*_ca)[i] = ptr;
+      here ++;
+      i++;      
+    }
+}
+
+void corbatext_corbaArrayToSet(corbatext_tarray t, text_tset *ts)
+{ unsigned int i;
+ 
+  for (i = 0; i < t.length(); i ++)
+    {
+      ts->insert((corbaconv_text_t) t[i]); // further typecast to text_t
+    } 
+
+  return;
+}
+
+void corbatext_setToCorbaArray(text_tset ts, corbatext_tarray *t)
+{
+  corbatext_t str;
+  text_tset::iterator here = ts.begin();
+  text_tset::iterator end = ts.end();
+  unsigned int i;
+
+  i = 0;
+  while (here != end)
+    {
+      (*t).length(i+1);
+      (*t)[i] = *corbatext_corbatext(*here);
+      here ++;
+      i ++;
+    }
+}
+
+void corbatext_mapToCorbaMap(text_tmap map, corbatext_tmap *cmap)
+{
+  text_tmap::iterator here = map.begin();
+  text_tmap::iterator end  = map.end();
+  unsigned int i = 0;
+
+  while (here != end)
+    {
+      (*cmap).names.length(i+1);
+      (*cmap).values.length(i+1);
+      cmap->names[i] = *corbatext_corbatext((*here).first);
+      cmap->values[i] = *corbatext_corbatext((*here).second);
+      here ++;
+      i ++;
+    }
+}
+
+void corbatext_corbaMapToMap(corbatext_tmap cmap, text_tmap &map)
+{
+  unsigned int i;
+
+  for (i = 0; i < cmap.names.length(); i ++)
+    {
+      map.insert(make_pair(*(new corbaconv_text_t(cmap.names[i])), 
+                           *(new corbaconv_text_t(cmap.values[i])))); // further typecast to text_t
+    }
+}
+
Index: /main/tags/2.38/gsdl/lib/display.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/display.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/display.cpp	(revision 21083)
@@ -0,0 +1,1753 @@
+/**********************************************************************
+ *
+ * display.cpp -- Context sensitive macro language
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+/*
+   $Log$
+   Revision 1.26  2002/02/26 23:01:31  jrm21
+   istream.get(char&) caused funny problems with gcc3 so they've been replaced
+   with char=istream.get() instead.
+
+   Revision 1.25  2002/02/12 22:46:47  jrm21
+   Allow nested _If_ macros. We now count '(' and ')' characters, so you can now
+   do _If_(_foo_, _If_(_bar_,FOOBAR,FOONOBAR), _If_(_bar_,NOFOOBAR,NOFOONOBAR) )
+   inside a macro file. If you want to display a bracket, you can escape it.
+   Previously we had assumed that a ',' marked the end of a toplevel argument.
+
+   Revision 1.24  2001/01/25 18:26:44  cs025
+   Included CORBA branch for first time
+
+   Revision 1.17.2.1  2000/04/04 15:02:28  cs025
+   Corba first commit
+
+   Revision 1.17  2000/02/29 21:00:38  sjboddie
+   fixed some compiler warnings
+
+   Revision 1.16  1999/11/25 21:53:08  sjboddie
+   fixed bug in logout
+
+   Revision 1.15  1999/09/24 02:25:35  rjmcnab
+   removed limitation on the number of arguments that a macro can have
+
+   Revision 1.14  1999/09/07 04:57:41  sjboddie
+   added gpl notice
+
+   Revision 1.13  1999/08/31 07:59:11  rjmcnab
+   Generalised spaces to unicode spaces, added ability to automatically detect
+   whether the input file is Unicode or UTF-8 and read the file in the
+   appropriate way, and improved the error messages slightly.
+
+   Revision 1.12  1999/07/21 20:46:12  rjmcnab
+   fixed small bug
+
+   Revision 1.11  1999/07/21 07:26:30  rjmcnab
+   Added more operators to _If_, changed quoting of parameters so that
+   ' can be used to quote but it is removed, and made slight optimisation
+   so that macros that don't contain other macros aren't expanded.
+
+   Revision 1.10  1999/03/01 20:39:54  sjboddie
+
+   Added eq and ne functionality to _If_
+
+   Revision 1.9  1999/03/01 01:18:09  sjboddie
+
+   Fixed bug in _If_ when value being tested was only one character
+   long (e.g. "0" or "1")
+
+   Revision 1.8  1999/02/28 23:15:29  rjmcnab
+
+   Made _If_ recognise 'false' and '0' as being false.
+
+   Revision 1.7  1999/02/08 01:26:11  rjmcnab
+
+   Improved the error reporting.
+
+   Revision 1.6  1999/01/19 08:30:23  rjmcnab
+
+   Added a method to determine whether a macro has been defined.
+
+   Revision 1.5  1999/01/19 01:38:12  rjmcnab
+
+   Made the source more portable.
+
+   Revision 1.4  1999/01/12 01:50:57  rjmcnab
+
+   Standard header.
+
+   Revision 1.3  1999/01/08 02:33:13  rjmcnab
+
+   Added standard header to source files.
+
+ */
+#include "display.h"
+#include "gsdlunicode.h"
+#include "unitool.h"
+#include <assert.h>
+
+// include to get NULL
+#include <stdlib.h>
+
+
+
+/////////////////////////////////////
+// misc classes
+/////////////////////////////////////
+
+
+// precedencetype defines a 'precedence value' for each parameter
+typedef map<text_t, double, lttext_t> precedencetype;
+
+
+// macro value structure
+struct mvalue
+{
+  text_t filename;
+  text_t value;
+};
+
+inline bool operator==(const mvalue &x, const mvalue &y) {
+  return (x.filename==y.filename && x.value==y.value);
+}
+
+inline bool operator<(const mvalue &x, const mvalue &y) {
+  return (x.filename<y.filename ||
+	  (x.filename==y.filename && x.filename<y.filename));
+}
+
+
+
+/////////////////////////////////////
+// stuff for defaultmacros_t
+/////////////////////////////////////
+  
+typedef map<text_t, mvalue, lttext_t> defparammap;
+typedef map<text_t, defparammap, lttext_t> defmacromap;
+typedef map<text_t, defmacromap, lttext_t> defpackagemap;
+
+// all methods in defaultmacros_t assume the parameters
+// and packages in a standard form and not empty
+class defaultmacros_t
+{
+protected:
+  defpackagemap macros;
+
+public:
+  typedef defpackagemap::const_iterator const_package_iterator;
+  typedef defpackagemap::size_type package_size_type;
+
+  // setmacro returns 0 if there was no error,
+  //            -1 if it redefined a macro
+  //            -2 if it hid a Global macro
+  //            -3 if it redefined a macro and hid a Global macro
+  //            -4 if either a package, macroname, or params were not supplied
+  int setmacro(const text_t &package,
+	  const text_t &macroname, 
+	  const text_t &params, 
+	  const text_t &filename, 
+	  const text_t &macrovalue);
+
+  void delmacro(const text_t &package,
+	      const text_t &macroname, 
+	      const text_t &params);
+
+  void clear () {macros.erase(macros.begin(), macros.end());}
+
+  // top level stuff
+  const_package_iterator package_begin () const {return macros.begin();}
+  const_package_iterator package_end () const {return macros.end();}
+  bool package_empty () const {return macros.empty();}
+  package_size_type package_size() const {return macros.size();}
+
+  // methods to find things
+  defmacromap *package_find (const text_t &packagename);
+  defparammap *macro_find (const text_t &packagename, 
+			   const text_t &macroname);
+  mvalue *parameter_find (const text_t &packagename, 
+			  const text_t &macroname,
+			  const text_t &parametername);
+};
+
+
+// setmacro returns 0 if there was no error,
+//            -1 if it redefined a macro
+//            -2 if it hid a Global macro
+//            -3 if it redefined a macro and hid a Global macro
+//            -4 if either a package, macroname, or params were not supplied
+int defaultmacros_t::setmacro(const text_t &package,
+			 const text_t &macroname, 
+			 const text_t &params, 
+			 const text_t &filename, 
+			 const text_t &macrovalue)
+{
+  paramhashtype paramhash;
+
+  defmacromap *macromapptr;
+  defparammap *parammapptr;
+  mvalue *mvalueptr;
+
+  int warning = 0;
+
+  // check to see if we would be hiding a Global macro with the 
+  // same name. Note: it doesn't matter what parameters are used
+  // a Global macro will still be hid by a non-Global one with
+  // the same name.
+  if ((package != "Global") && 
+      (macro_find ("Global", macroname) != NULL))
+    {
+      warning -= 2; // found the macroname
+    }
+
+  // define this macro
+  macromapptr = &(macros[package]); // -- package
+  parammapptr = &((*macromapptr)[macroname]); // -- macro name
+  // -- parameters
+  if ((*parammapptr).find(params) != (*parammapptr).end()) {
+    warning -= 1; // found the parameters
+  }
+  mvalueptr = &((*parammapptr)[params]);
+
+  // -- value
+  (*mvalueptr).filename = filename;
+  (*mvalueptr).value = macrovalue;
+
+  return warning;
+}
+
+void defaultmacros_t::delmacro(const text_t &package,
+			     const text_t &macroname, 
+			     const text_t &params)
+{
+  // make sure everything was supplied
+  if (package.empty() || macroname.empty() || params.empty()) return;
+
+  // find the package and macroname
+  defparammap *parammapptr = macro_find(package, macroname);
+  if (parammapptr == NULL) return;
+
+  // find the parameters
+  defparammap::iterator parammapit = parammapptr->find(params);
+  if (parammapit == parammapptr->end()) return;
+
+  // finally delete this element
+  parammapptr->erase(parammapit);
+}
+
+defmacromap *defaultmacros_t::package_find (const text_t &packagename)
+{
+  if (packagename.empty()) return NULL;
+
+  defpackagemap::iterator it = macros.find(packagename);
+  if (it == macros.end()) return NULL;
+
+  return &((*it).second);
+}
+
+defparammap *defaultmacros_t::macro_find (const text_t &packagename, 
+					       const text_t &macroname)
+{
+  defmacromap *macromapptr = package_find(packagename);
+  if (macromapptr == NULL || macroname.empty()) return NULL;
+
+  defmacromap::iterator it = (*macromapptr).find(macroname);
+  if (it == (*macromapptr).end()) return NULL;
+
+  return &((*it).second);
+}
+
+mvalue *defaultmacros_t::parameter_find (const text_t &packagename, 
+					 const text_t &macroname,
+					 const text_t &parametername)
+{
+  defparammap *parammapptr = macro_find(packagename, macroname);
+  if (parammapptr == NULL || parametername.empty()) return NULL;
+
+  defparammap::iterator it = (*parammapptr).find(parametername);
+  if (it == (*parammapptr).end()) return NULL;
+
+  return &((*it).second);
+}
+
+
+
+/////////////////////////////////////
+// stuff for currentmacros_t
+/////////////////////////////////////
+
+typedef map<text_t, mvalue, lttext_t> curmacromap;
+typedef map<text_t, curmacromap, lttext_t> curpackagemap;
+
+// all methods in currentmacros_t assume the parameters
+// and packages in a standard form and not empty
+class currentmacros_t 
+{
+protected:
+  curpackagemap macros;
+
+public:
+  typedef curpackagemap::const_iterator const_package_iterator;
+  typedef curpackagemap::size_type package_size_type;
+
+  // setmacro returns 0 if there was no error,
+  //            -1 if it redefined a macro
+  //            -4 if either a package, or macroname were not supplied
+  int setmacro(const text_t &package,
+	  const text_t &macroname, 
+	  const text_t &filename, 
+	  const text_t &macrovalue);
+
+  void delmacro(const text_t &package,
+		const text_t &macroname);
+
+  void clear () {macros.erase(macros.begin(), macros.end());}
+
+  // top level stuff
+  const_package_iterator package_begin () const {return macros.begin();}
+  const_package_iterator package_end () const {return macros.end();}
+  bool package_empty () const {return macros.empty();}
+  package_size_type package_size() const {return macros.size();}
+
+  // methods to find things
+  curmacromap *package_find (const text_t &packagename);
+  mvalue *macro_find (const text_t &packagename, 
+		      const text_t &macroname);
+};
+
+
+// setmacro returns 0 if there was no error,
+//            -1 if it redefined a macro
+//            -4 if either a package, or macroname were not supplied
+int currentmacros_t::setmacro(const text_t &package,
+			 const text_t &macroname, 
+			 const text_t &filename, 
+			 const text_t &macrovalue)
+{
+  int warning = 0;
+
+  // make sure everything was supplied
+  if (package.empty() || macroname.empty()) return -4;
+
+  // define this macro
+  curmacromap *macromapptr = &(macros[package]);
+  if ((*macromapptr).find(macroname) != (*macromapptr).end()) 
+    {
+      warning -= 1; // found the macroname
+    }
+  mvalue *mvalueptr = &((*macromapptr)[macroname]);
+
+  // -- value
+  (*mvalueptr).filename = filename;
+  (*mvalueptr).value = macrovalue;
+
+  return warning;
+}
+
+void currentmacros_t::delmacro(const text_t &package,
+			     const text_t &macroname)
+{
+  // make sure everything was supplied
+  if (package.empty() || macroname.empty()) return;
+
+  // find the package
+  curmacromap *macromapptr = package_find(package);
+  if (macromapptr == NULL) return;
+
+  // find the macroname
+  curmacromap::iterator macromapit = macromapptr->find(macroname);
+  if (macromapit == macromapptr->end()) return;
+
+  // finally delete this element
+  macromapptr->erase(macromapit);
+}
+
+curmacromap *currentmacros_t::package_find (const text_t &packagename)
+{
+  if (packagename.empty()) return NULL;
+
+  curpackagemap::iterator it = macros.find(packagename);
+  if (it == macros.end()) return NULL;
+
+  return &((*it).second);
+}
+
+mvalue *currentmacros_t::macro_find (const text_t &packagename, 
+				     const text_t &macroname)
+{
+  curmacromap *macromapptr = package_find(packagename);
+  if (macromapptr == NULL || macroname.empty()) return NULL;
+
+  curmacromap::iterator it = (*macromapptr).find(macroname);
+  if (it == (*macromapptr).end()) return NULL;
+
+  return &((*it).second);
+}
+
+
+
+
+/////////////////////////////////////
+// support functions
+/////////////////////////////////////
+
+// this calculation of precedence will make one occurance of a high
+// precedence item override many occurances of lower precedence items
+void calcprecedence (const text_t &precedstr, precedencetype &precedhash) 
+{
+  text_t param;
+  double multiple = 5.0;
+  double nextprec = multiple;
+
+  text_t::const_iterator here, end;
+
+  // set precedhash to an empty hash
+  precedhash.erase(precedhash.begin(), precedhash.end());
+
+  // iterate through paramstring ignoring space and extracting
+  // out key value pairs.
+  here = precedstr.begin();
+  end = precedstr.end();
+  while (here != end) 
+    {
+      // get the next parameter
+      param.clear(); // set param to an empty string
+      
+      while (here != end) 
+	{
+	  if (*here == ',') 
+	    {
+	      // found the end of the parameter
+	      here++;
+	      break;
+	    } 
+	  else if (*here == ' ') 
+	    {
+	      // do nothing (ignore spaces)
+	    } 
+	  else 
+	    {
+	      // character in parameter
+	      param.push_back (*here); // copy this character
+	    }
+	  
+	  here++;
+	}
+
+      // if a parameter was found insert its value
+      if (!param.empty()) 
+	{
+	  precedhash[param] = nextprec;
+	  nextprec *= multiple;
+	}
+    }
+}
+
+
+// decides how specific any given parameter is to the page parameters. Returns 
+// negative if any options are different or else the sum of the precedence for
+// the options which match. 
+double getspecificness(const paramhashtype &pageparams, 
+		       const paramhashtype &theseparams, 
+		       const precedencetype &precedhash) 
+{
+  double specificness = 0.0;
+  paramhashtype::const_iterator here, pagevalueit;
+  precedencetype::const_iterator precedit;
+  text_t thesekey, thesevalue, constignore("ignore");
+  
+  here = theseparams.begin();
+  while (here != theseparams.end()) 
+    {
+      thesekey = (*here).first;
+      thesevalue = (*here).second;
+      
+      if (thesekey == constignore) 
+	{
+	  // do nothing, this is a placeholder
+	} 
+      else 
+	{
+	  pagevalueit = pageparams.find(thesekey);
+	  if ((pagevalueit != pageparams.end()) && 
+	      ((*pagevalueit).second == thesevalue)) 
+	    {
+	      // this parameter fits, add its precedence value
+	      precedit = precedhash.find(thesekey);
+	      if (precedit == precedhash.end()) 
+		specificness += 1.0; // no precedence defined
+	      else 
+		  specificness += (*precedit).second;
+	    }
+	  else 
+	    {
+	      return -1.0; // did not match
+	    }
+	}
+
+      here++;
+    }
+  
+  return specificness;
+}
+
+
+void splitparams (const text_t &paramstring, paramhashtype &paramhash)
+{
+  text_t key;
+  text_t value;
+
+  text_t::const_iterator here, end;
+
+  // set paramhash to an empty hash
+  paramhash.erase(paramhash.begin(), paramhash.end());
+
+  // iterate through paramstring ignoring space and extracting
+  // out key value pairs.
+  here = paramstring.begin();
+  end  = paramstring.end();
+  while (here != end) 
+    {
+      // reset key and value
+      key.clear();
+      value.clear();
+
+      // get key
+      while (here != end) 
+	{
+	  if (*here == ',') 
+	    {
+	      // have a key with no value
+	      break;
+	    } 
+	  else if (*here == '=') 
+	    {
+	      // found the end of the key
+	      here ++; 
+	      break;
+	    } 
+	  else if (*here == ' ') 
+	    {
+	      // do nothing (ignore spaces)
+	    } 
+	  else 
+	    {
+	      // character in key
+	      key.push_back (*here); // copy this character
+	    }
+	  here ++;
+	}
+
+      // get value
+      while (here != end) 
+	{
+	  if (*here == '=') 
+	    {
+	      // multiple values for one key, ignore previous
+	      // values
+	      value.clear();
+	    } 
+	  else if (*here == ',') 
+	    {
+	      // found the end of the value
+	      here ++;
+	      break;
+	    } 
+	  else if (*here == ' ') 
+	    {
+	      // do nothing (ignore spaces)
+	    } 
+	  else 
+	    {
+	      // character in value
+	      value.push_back (*here); // copy this character
+	    }
+	  here ++;
+	}
+    
+      // if a key was found insert the key/value pair in 
+      // the map 
+      if (!key.empty()) 
+	{
+	  paramhash[key] = value;
+	}
+    }
+}
+
+
+void joinparams (const paramhashtype &paramhash, text_t &paramstring)
+{
+  //set paramstring to an empty string
+  paramstring.clear();
+
+  //iterate through the paramhash
+  paramhashtype::const_iterator thepair;
+  int firstparam = 1;
+
+  for (thepair=paramhash.begin();thepair!=paramhash.end(); thepair++)
+    {
+      if (!firstparam) paramstring.push_back(',');
+      firstparam = 0;
+      
+      // insert pairs of "key=value"
+      text_t thevalue;
+      paramstring.append((*thepair).first);
+      paramstring.push_back('=');
+      paramstring.append((*thepair).second);
+    }
+}
+
+
+
+/////////////////////////////////////
+// parsing support functions
+/////////////////////////////////////
+
+inline int my_isalpha (unsigned short c) 
+{
+  return ((c >= 'A' && c <= 'Z') ||
+	  (c >= 'a' && c <= 'z'));
+} 
+
+
+
+inline unsigned short my_ttnextchar (text_t::const_iterator &here, 
+				     text_t::const_iterator &end) 
+{
+  if (here != end) 
+    {
+      here++;
+      if (here != end) return (*here);
+    }
+  return '\0';
+}
+
+
+
+/////////////////////////////////////
+// methods for display
+/////////////////////////////////////
+
+// public methods for display
+
+displayclass::displayclass ()
+{
+  defaultmacros = new defaultmacros_t;
+  defaultfiles = new fileinfomap;
+  
+  orderparamlist = new paramspeclist;
+  currentmacros = new currentmacros_t;
+
+  outc = NULL;
+
+  logout = &cerr;
+}
+
+
+displayclass::~displayclass ()
+{
+  delete defaultmacros;
+  delete defaultfiles;
+  
+  delete orderparamlist;
+  delete currentmacros;
+}
+  
+// setdefaultmacro adds an entry to the list of default macros 
+// returns 0 if there was no error,
+//        -1 if it redefined a macro
+//        -2 if it hid a Global macro
+//        -3 if it redefined a macro and hid a Global macro
+//        -4 if no macroname was supplied
+int displayclass::setdefaultmacro (text_t package, const text_t &macroname, 
+			      text_t params, const text_t &macrovalue) 
+{
+  return setdefaultmacro (macroname, package, params, macrovalue, "memory");
+}
+
+
+
+// as we are using one character lookahead the
+// value of line might be off by one.
+// the input file must be in the utf-8 or unicode format
+// initially for each file isunicode should be set to 0 and 
+// bigendian should be set to 1
+// 0 will be returned when the end of the file has been found
+unsigned short my_uni_get (/*unistream*/ifstream &fin, int &line, 
+			   int &isunicode, int &bigendian) {
+  unsigned short c = 0;
+  
+  if (isunicode) {
+    // unicode text
+    // get the next two characters
+    unsigned char c1 = 0, c2 = 0;
+    
+    if (!fin.eof()) c1=fin.get();
+    if (!fin.eof()) c2=fin.get();
+    else c1 = 0;
+
+    // if they indicate the order get the next character
+    // otherwise just get these characters
+    if (c1 == 0xff && c2 == 0xfe) {
+      bigendian = 0;
+      c = my_uni_get (fin, line, isunicode, bigendian);
+    } else if (c1 == 0xfe && c2 == 0xff) {
+      bigendian = 1;
+      c = my_uni_get (fin, line, isunicode, bigendian);
+    } else c = (bigendian) ? (c1*256+c2) : (c2*256+c1);
+    
+  } else {
+    // utf-8 text
+    // how many characters we get depends on what we find
+    unsigned char c1 = 0, c2 = 0, c3 = 0;
+    while (!fin.eof()) {
+      c1=fin.get();
+      if (c1 == 0xfe || c1 == 0xff) {
+	// switch to unicode
+	isunicode = 1;
+	if (!fin.eof()) c2=fin.get();
+
+	if (c1 == 0xff && c2 == 0xfe) bigendian = 0;
+	else bigendian = 1;
+
+	c = my_uni_get (fin, line, isunicode, bigendian);
+	break;
+
+      } else if (c1 <= 0x7f) {
+	// one byte character
+	c = c1;
+	break;
+
+      } else if (c1 >= 0xc0 && c1 <= 0xdf) {
+	// two byte character
+	if (!fin.eof()) c2=fin.get();
+	c = ((c1 & 0x1f) << 6) + (c2 & 0x3f);
+	break;
+
+      } else if (c1 >= 0xe0 && c1 <= 0xef) {
+	// three byte character
+	if (!fin.eof()) c2=fin.get();
+	if (!fin.eof()) c3=fin.get();
+	c = ((c1 & 0xf) << 12) + ((c2 & 0x3f) << 6) + (c3 & 0x3f);
+	break;
+      }
+
+      // if we get here there was an error in the file, we should
+      // be able to recover from it however, maybe the file is in
+      // another encoding
+    }
+  }
+
+  if (c == '\n') line++;
+  return c;
+}
+
+
+
+// loads a default macro file (if it isn't already loaded)
+// returns 0 if didn't need to load the file (it was already loaded)
+//         1 if was (re)loaded
+//        -1 an error occurred while trying to load the file
+int displayclass::loaddefaultmacros (text_t thisfilename) {
+  // convert the filename to a C string
+  char *filenamestr = thisfilename.getcstr();
+  outconvertclass text_t2ascii;
+
+  // see if we need to open this file -- this isn't implemented yet
+  
+  // open the file
+  //  unistream fin (filenamestr);
+  ifstream fin (filenamestr);
+
+  if (fin.fail()) return -1; // read failed
+
+  text_t package = "Global";
+  int line = 1;
+  int isunicode = 0, bigendian = 1;
+
+  // pre-fetch the next character
+  unsigned short c = my_uni_get(fin, line, isunicode, bigendian);
+
+  text_t macropackage, macroname, macroparameters, macrovalue;
+  int err; // for keeping track of whether an error occurred somewhere
+
+  while (!fin.eof()) {
+    // expect: white space, comment, "package", or macroname
+    if (is_unicode_space(c)) {
+      // found some white-space
+      c = my_uni_get(fin, line, isunicode, bigendian);
+
+    } else if (c == '#') {
+      // found the start of a comment
+      // skip all characters up to the end of the line
+      c = my_uni_get(fin, line, isunicode, bigendian); // skip the '#'
+      while (!fin.eof ()) {
+	if (c == '\n') break;
+	c = my_uni_get(fin, line, isunicode, bigendian);
+      }
+
+    } else if (c == 'p') {
+      // found the start of 'package' (hopefully)
+      // get everything up to the next space
+      text_t tmp;
+      while (!fin.eof() && my_isalpha(c)) {
+	tmp.push_back(c);
+	c = my_uni_get(fin, line, isunicode, bigendian);
+      }
+      // see if we have a package name
+      if (tmp == "package") {
+	// skip all white space
+	while (!fin.eof() && is_unicode_space(c)) 
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	
+	// get the package name
+	tmp.clear(); // init tmp
+	while (!fin.eof() && my_isalpha(c)) {
+	  tmp.push_back(c);
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	}
+	package = tmp;
+	if (package.empty()) package = "Global";
+
+      } else {
+	// error
+	if (logout != NULL) {
+	  (*logout) << text_t2ascii << "Expected 'package' on line " << line 
+		    << " of " << thisfilename << "\n";
+	}
+      }
+      
+    } else if (c == '_') {
+      // found the start of a macro (hopefully)
+      c = my_uni_get(fin, line, isunicode, bigendian); // skip the _
+
+      // init variables
+      err = 0;
+      macropackage = package;
+      macroname.clear(); // init macroname
+      macroparameters.clear(); // init macroname
+      macrovalue.clear(); // init macroname
+      
+      // get the macro name
+      while ((!fin.eof()) && (!is_unicode_space(c)) && 
+	     (c != '\\') && (c != '_') &&(c != ':') && 
+	     (macroname.size() < 80)) {
+	macroname.push_back(c);
+	c = my_uni_get(fin, line, isunicode, bigendian);
+      }
+	  
+      if (c == ':') {
+	// we actually had the macro package
+	c = my_uni_get(fin, line, isunicode, bigendian); // skip :
+	macropackage = macroname;
+	macroname.clear ();
+	
+	// get the macro name (honest!)
+	while ((!fin.eof()) && (!is_unicode_space(c)) && 
+	       (c != '\\') && (c != '_') &&(c != ':') && 
+	       (macroname.size() < 80)) {
+	  macroname.push_back(c);
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	}
+      }
+      
+      if (!err && c == '_') {
+	c = my_uni_get(fin, line, isunicode, bigendian); // skip the _
+	
+	// skip all white space
+	while (!fin.eof() && is_unicode_space(c)) c = my_uni_get(fin, line, isunicode, bigendian);
+      } else if (!err) err = 1;
+
+      // get the macro parameters (optional)
+      if (!err && c == '[') {
+	c = my_uni_get(fin, line, isunicode, bigendian); // skip the [
+	while ((!fin.eof()) && (c != '\n') && (c != '\\') && (c != ']')) {
+	  macroparameters.push_back(c);
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	}
+	
+	if (c == ']') {
+	  c = my_uni_get(fin, line, isunicode, bigendian); // skip the ]
+	  
+	  // skip all white space
+	  while (!fin.eof() && is_unicode_space(c)) c = my_uni_get(fin, line, isunicode, bigendian);
+	} 
+	else if (!err) err = 2;
+      }
+
+      // get the macro value
+      if (!err && c == '{') {
+	c = my_uni_get(fin, line, isunicode, bigendian); // skip the {
+	while ((!fin.eof()) && (c != '}')) {
+	  if (c == '\\') {
+	    macrovalue.push_back(c); // keep the '\'
+	    c = my_uni_get(fin, line, isunicode, bigendian); // store the *next* value regardless
+	    if (!fin.eof()) macrovalue.push_back(c);
+	    c = my_uni_get(fin, line, isunicode, bigendian);
+	  }
+	  macrovalue.push_back(c);
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	}
+	
+	if (c == '}') {
+	  c = my_uni_get(fin, line, isunicode, bigendian); // skip the }
+	  
+	  // define the macro
+	  err = setdefaultmacro (macropackage, macroname, macroparameters,
+				 thisfilename, macrovalue);
+	  if ((err == -1 || err == -3) && logout != NULL) {
+	    (*logout) << text_t2ascii << "Warning: redefinition of _" << 
+	      package << ":" << macroname << "_[" << macroparameters <<
+	      "] on line ";
+	    (*logout) << line;
+	    (*logout) << text_t2ascii << " of " << thisfilename << "\n";
+	    
+	  } else if (err == -2 && logout != NULL) {
+	    // I don't think we really want this warning since it's a very
+	    // common occurance - Stefan.
+
+	    //	    (*logout) << text_t2ascii << "Warning: _" << 
+	    //	      package << ":" << macroname << "_[" << macroparameters <<
+	    //	      "] on line ";
+	    //	    (*logout) << line;
+	    //	    (*logout) << text_t2ascii << " of " << 
+	    //	      thisfilename << " hides a Global macro with the same name\n";
+
+	  } else if (err == -4 && logout != NULL) {
+	    (*logout) << text_t2ascii << "Error: macro name expected on line ";
+	    (*logout) << line ;
+	    (*logout) << text_t2ascii << " of " << thisfilename << "\n";
+	  }		  
+	  
+	  err = 0; // for the test below
+	}
+	else if (!err) err = 3;
+      }
+      else if (!err) err = 4;
+      
+      if (err) {
+	// found an error, skip to the end of the line
+	if (logout != NULL) {
+	  (*logout) << text_t2ascii << "Error: ";
+	  if (err == 1) (*logout) << text_t2ascii << "'_'";
+	  else if (err == 2) (*logout) << text_t2ascii << "']'";
+	  else if (err == 3) (*logout) << text_t2ascii << "'}'";
+	  else if (err == 4) (*logout) << text_t2ascii << "'{'";
+	  (*logout) << text_t2ascii << " expected on line ";
+	  (*logout) << line ;
+	  (*logout) << text_t2ascii << " of " << thisfilename << "\n";
+	}
+	while (!fin.eof ()) {
+	  if (c == '\n') break;
+	  c = my_uni_get(fin, line, isunicode, bigendian);
+	}
+      }
+      
+    } else {
+      // found an error, skip to the end of the line
+      if (logout != NULL) {
+	(*logout) << text_t2ascii << "Error: Unexpected input on line " << line 
+		  << " of " << thisfilename << "\n";
+      }
+      while (!fin.eof ()) {
+	if (c == '\n') break;
+	c = my_uni_get(fin, line, isunicode, bigendian);
+      }
+      
+    }
+  }
+  
+  fin.close ();
+  
+  // free up memory
+  delete filenamestr;
+  return 0;
+}
+
+
+// prepares to create a page.
+void displayclass::openpage (const text_t &thispageparams, 
+			const text_t &thisprecedence)
+{
+  // init variables
+  currentmacros->clear();
+
+  // reload any default macro files which have changed.
+  if (checkdefaultmacrofiles() < 0) 
+    {
+      // print error message
+    }
+
+  setpageparams (thispageparams, thisprecedence);
+}
+
+
+// changes the parameters for the current page.
+void displayclass::setpageparams (text_t thispageparams, 
+			     text_t thisprecedence)
+{
+  paramhashtype thissplitparams, splittheseparams;
+  precedencetype precedhash;
+  text_tset::iterator text_tsetit;
+  paramspec tmpps;
+
+  precedence = thisprecedence;
+  calcprecedence(thisprecedence, precedhash);
+
+  splitparams(thispageparams, thissplitparams);
+  joinparams(thissplitparams, thispageparams);
+  params = thispageparams;
+
+  // get a list of parameters with their specificness
+  orderparamlist->erase(orderparamlist->begin(), orderparamlist->end());
+  for (text_tsetit=allparams.begin();
+       text_tsetit!=allparams.end();
+       text_tsetit++) 
+    {
+      tmpps.param = (*text_tsetit);
+      splitparams(tmpps.param, splittheseparams);
+      tmpps.spec = getspecificness(thissplitparams, splittheseparams, precedhash);
+      if (tmpps.spec >= 0) 
+	{
+	  orderparamlist->push_back (tmpps);
+	}
+    }
+
+  // sort the list
+  sort(orderparamlist->begin(), orderparamlist->end());
+
+//   paramspeclist::iterator pshere = orderparamlist->begin();
+//   paramspeclist::iterator psend = orderparamlist->end();
+//   while (pshere != psend) 
+//     {
+//       cerr << text_t2ascii << "param=" << (*pshere).param;
+//       cerr << " spec=" << (int)((*pshere).spec) << "\n";
+//       pshere++;
+//     }
+}
+
+
+// overrides (or sets) a macro for the current page.
+// returns 0 if there was no error,
+//        -1 if it redefined a macro
+//        -4 if no macroname was supplied
+int displayclass::setmacro (const text_t &macroname, 
+		       text_t package, 
+		       const text_t &macrovalue)
+{
+  // make sure a macroname was supplied
+  if (macroname.empty()) return -4;
+
+  // make package "Global" if it doesn't point to anything yet
+  if (package.empty()) package = "Global";
+
+  // set the macro
+  return currentmacros->setmacro(package, macroname, "memory", macrovalue);
+}
+
+
+void displayclass::expandstring (const text_t &inputtext, text_t &outputtext)
+{
+  expandstring("", inputtext, outputtext);
+}
+
+
+void displayclass::expandstring (text_t package, const text_t &inputtext,
+				 text_t &outputtext, int recursiondepth)
+{
+  text_t macroname, macropackage, macroargs;
+  text_t::const_iterator tthere = inputtext.begin();
+  text_t::const_iterator ttend = inputtext.end();
+  unsigned short c = '\0';
+  int openbrackets=0;
+
+  if (package.empty()) package = "Global";
+
+  outputtext.clear();
+  // use one-character lookahead
+  if (tthere != ttend) c = (*tthere);
+  while (tthere != ttend) 
+    {
+      if (c == '\\')
+	{
+	  // found an escape character
+	  c = my_ttnextchar (tthere, ttend); // skip the escape character
+	  if (tthere != ttend) 
+	    {
+	      if (c == 'n') outputtext.push_back('\n');
+	      else if (c == 't') outputtext.push_back('\t');
+	      else outputtext.push_back(c);
+	    }
+	  c = my_ttnextchar (tthere, ttend);
+	  
+	} 
+      else if (c == '_') 
+	{
+	  // might have found the start of a macro
+      
+	  // embedded macros (macros within the names
+	  // of other macros) are no longer supported -- Rodger.
+      
+	  // save the current state (in case we need to back out)
+	  text_t::const_iterator savedtthere = tthere;
+	  unsigned short savedc = c;
+	  
+	  macroname.clear();
+	  macropackage = package;
+	  macroargs.clear();
+      
+	  c = my_ttnextchar (tthere, ttend); // skip the '_'
+	  
+	  // get the macroname
+	  while (tthere != ttend && (!is_unicode_space(c)) && 
+		 (c != '\\') && (c != '_') &&(c != ':') && 
+		 (macroname.size() < 80)) 
+	    {
+	      macroname.push_back((unsigned char)c);
+	      c = my_ttnextchar (tthere, ttend);
+	    }
+      
+	  if (c == ':') 
+	    {
+	      // we actually had the macro package
+	      c = my_ttnextchar (tthere, ttend);
+	      macropackage = macroname;
+	      macroname.clear ();
+	
+	      // get the macro name (honest!)
+	      while ((tthere != ttend) && (!is_unicode_space(c)) && 
+		     (c != '\\') && (c != '_') &&(c != ':') && 
+		     (macroname.size() < 80)) 
+		{
+		  macroname.push_back((unsigned char)c);
+		  c = my_ttnextchar (tthere, ttend);
+		}
+	    }
+      
+	  if ((tthere != ttend) && (c == '_') &&
+	      (macroname.size() > 0)) 
+	    {
+	      // found a macro!!!! (maybe)
+	      c = my_ttnextchar (tthere, ttend); // skip the '_'
+	
+	      // get the parameters (if there are any)
+	      if ((tthere != ttend) && (c == '(')) 
+		{
+		  c = my_ttnextchar (tthere, ttend); // skip '('
+	  	  openbrackets++;
+		  // have to be careful of quotes
+		  unsigned short quote = '\0';
+		  while (tthere != ttend) 
+		    {
+		      if (c == '\\') 
+			{
+			  // have an escape character, save escape 
+			  // character and next character as well
+			  macroargs.push_back (c);
+			  c = my_ttnextchar (tthere, ttend); 
+	      
+			} 
+		      else if (quote == '\0') 
+			{
+			  // not in a quote at the moment
+			  if (c == '(')
+			    {
+			      openbrackets++;
+////			      macroargs.push_back (c);
+////			      c = my_ttnextchar (tthere, ttend); 
+			    }
+			  else if (c == ')') 
+			    {
+			      openbrackets--;
+			      if (openbrackets==0) {
+				// found end of the arguments
+				c = my_ttnextchar (tthere, ttend); // skip ')'
+				break;
+			      } else {
+				// nested brackets
+			        macroargs.push_back (c);
+			        c = my_ttnextchar (tthere, ttend); 
+			      }
+			    } 
+			  else if (c == '\'' || c == '\"') 
+			    {
+			      // found a quote
+			      quote = c;
+			    }
+	      
+			} 
+		      else 
+			{
+			  // we are in a quote
+			  if (c == quote) quote = '\0';
+			}
+	    
+		      // save this character
+		      if (tthere != ttend) macroargs.push_back (c);
+		      c = my_ttnextchar (tthere, ttend);
+		    } // while (tthere != ttend)
+		}
+	
+	      //
+	      // we now have the macropackage, macroname, and macroargs
+	      //
+	
+	      // try to expand out this macro
+	      text_t expandedmacro;
+	      if (macro (macroname, macropackage, macroargs, expandedmacro, recursiondepth)) 
+		{
+		  // append the expanded macro
+		  outputtext += expandedmacro;
+		} 
+	      else
+		{
+		  // wasn't a macro
+		  tthere = savedtthere;
+		  c = savedc;
+		  outputtext.push_back(c); // the '_'
+		  c = my_ttnextchar (tthere, ttend);
+		}
+	
+
+	    }
+	  else
+	    {
+	      // wasn't a macro
+	      tthere = savedtthere;
+	      c = savedc;
+	      outputtext.push_back(c); // the '_'
+	      c = my_ttnextchar (tthere, ttend);
+	    }
+
+	}
+      else 
+	{
+	  // nothing of interest
+	  outputtext.push_back(c); // the '_'
+	  c = my_ttnextchar (tthere, ttend);
+	}
+    } // end of while (tthere != ttend)
+}
+
+ostream *displayclass::setlogout (ostream *thelogout) {
+
+  ostream *oldlogout = logout;
+  logout = thelogout;
+  return oldlogout;
+}
+
+// protected methods for display
+
+// reloads any default macro files which have changed
+// returns 0 no errors occurred
+//        -1 an error occurred while trying to load one of the files
+int displayclass::checkdefaultmacrofiles ()
+{
+  // this isn't implemented yet
+  return 0;
+}
+
+// isdefaultmacro sees if there is an entry in the list of
+// default macros with the given package and macro name
+// returns 0 if no macros in the package or in the global package
+//           were found
+//         1 if no macros in the package were found but a macro
+//           in the global package was found
+//         2 if a macro in the given package was found
+int displayclass::isdefaultmacro (text_t package, const text_t &macroname) {
+  // make sure a macroname was supplied
+  if (macroname.empty()) return 0;
+
+  // make package "Global" if it doesn't point to anything yet
+  if (package.empty()) package = "Global";
+
+  // check the given package
+  if (defaultmacros->macro_find(package, macroname) != NULL) return 2;
+
+  // check the Global package
+  if (defaultmacros->macro_find("Global", macroname) != NULL) return 1;
+
+  return 0;
+}
+
+
+// setdefaultmacro adds an entry to the list of default macros 
+// returns 0 if there was no error,
+//        -1 if it redefined a macro
+//        -2 if it hid a Global macro
+//        -3 if it redefined a macro and hid a Global macro
+//        -4 if no macroname was supplied
+int displayclass::setdefaultmacro (text_t package, const text_t &macroname, 
+			      text_t params, const text_t &filename,
+			      const text_t &macrovalue) 
+{
+  // make sure a macroname was supplied
+  if (macroname.empty()) return -4;
+
+  // put the parameters in a standard form
+  paramhashtype paramhash;
+  if (params.empty()) params = "ignore=yes";
+  splitparams (params, paramhash);
+  joinparams (paramhash, params);
+
+  // make package "Global" if it doesn't point to anything yet
+  if (package.empty()) package = "Global";
+
+  // remember these parameters
+  allparams.insert (params);
+
+  // remember this filename (this part isn't finished yet -- Rodger).
+
+  // set the macro
+  return defaultmacros->setmacro(package, macroname, params, filename, macrovalue);
+}
+
+
+// evaluates a boolean expression
+// returns false if expr equals "" or "0". 
+// otherwise returns true *unless* expr is 
+// format "XXXX" eq/ne "dddd" in which case
+// the two quoted strings are compared
+bool displayclass::boolexpr (text_t package, const text_t &expr, int recursiondepth) {
+
+  if (expr.empty()) return false;
+
+  text_t expexpr;
+  if (package.empty()) package = "Global";  
+  expandstring (package, expr, expexpr, recursiondepth);
+
+  if (expexpr.empty() || expexpr == "0") return false;
+  if (expr[0] != '\"') return true;
+
+  // don't use expexpr while separating quoted parts of
+  // expression just in case expanded out macros contain
+  // quotes
+  text_t::const_iterator here = expr.begin();
+  text_t::const_iterator end = expr.end();
+
+  int quotecount = 0;
+  text_t string1, expstring1;
+  text_t string2, expstring2;
+  text_t op;
+  text_t combineop;
+  bool result = false; // an empty string is false
+  bool result2 = false;
+
+  while (here != end) {
+    // get a comparison
+    quotecount = 0;
+    string1.clear();
+    string2.clear();
+    op.clear();
+    while (here != end) {
+      if (*here == '"') quotecount++;
+      else if (quotecount == 1) string1.push_back(*here);
+      else if ((quotecount == 2) && !is_unicode_space (*here))
+	op.push_back(*here);
+      else if (quotecount == 3) string2.push_back(*here);
+      else if (quotecount >= 4) break;
+      here ++;
+    }
+    
+    expandstring (package, string1, expstring1, recursiondepth);
+    expandstring (package, string2, expstring2, recursiondepth);
+
+    // get next result
+    result2 = true; // any badly formatted string will return true
+    if (op == "eq") result2 = (expstring1 == expstring2);
+    else if (op == "ne") result2 = (expstring1 != expstring2);
+    else if (op == "gt") result2 = (expstring1 > expstring2);
+    else if (op == "ge") result2 = (expstring1 >= expstring2);
+    else if (op == "lt") result2 = (expstring1 < expstring2);
+    else if (op == "le") result2 = (expstring1 <= expstring2);
+    else if (op == "==") result2 = (expstring1.getint() == expstring2.getint());
+    else if (op == "!=") result2 = (expstring1.getint() != expstring2.getint());
+    else if (op == ">") result2 = (expstring1.getint() > expstring2.getint());
+    else if (op == ">=") result2 = (expstring1.getint() >= expstring2.getint());
+    else if (op == "<") result2 = (expstring1.getint() < expstring2.getint());
+    else if (op == "<=") result2 = (expstring1.getint() <= expstring2.getint());
+
+    // combine the results
+    if (combineop == "&&") result = (result && result2);
+    else if (combineop == "||") result = (result || result2);
+    else result = result2;
+
+    // get next combination operator
+    combineop.clear();
+    while (here != end && *here != '"') {
+      if (!is_unicode_space(*here)) combineop.push_back(*here);
+      here++;
+    }
+  }
+
+  return result;
+}
+
+
+// (recursively) expand out a macro
+// returns true  if the macro was found
+//         false if the macro was not found
+bool displayclass::macro (const text_t &macroname, text_t macropackage, 
+		     const text_t &macroparam, text_t &outputtext,
+		     int recursiondepth)
+{
+  outconvertclass text_t2ascii;
+  text_tlist splitmacroparam;
+  text_t::const_iterator hereit, endit;
+  text_t aparam;
+  unsigned short c = '\0', quote = '\0';
+
+  //  cerr << "r: " << recursiondepth << "\n";
+  // check for deep recursion
+  if (recursiondepth >= MAXRECURSIONDEPTH)
+    {
+      if (logout != NULL)
+	(*logout) << "Warning: deep recursion, limiting macro expansion\n";
+      return false;
+    }
+
+  // check the macropackage
+  if (macropackage.empty()) macropackage = "Global";
+
+  // get the parameters (but don't expand them)
+  if (macroparam.size() > 0) {
+    // set up for loop
+    hereit = macroparam.begin();
+    endit = macroparam.end();
+    if (hereit != endit) c = (*hereit);
+    int openbrackets=0; // keep track of bracket level eg _If_(1, _macro_(arg))
+			// this allows commas inside brackets (as arguments)
+    while (hereit != endit) {
+      // get the next parameter
+      aparam.clear();
+      quote = '\0'; // not-quoted unless proven quoted
+      
+      // ignore initial whitespace
+      while ((hereit!=endit)&&is_unicode_space(c)) c=my_ttnextchar(hereit,endit);
+      
+      // look for the end of the parameter
+      while (hereit != endit) {
+	if (c == '\\') {
+	  // found escape character, also get next character
+	  aparam.push_back(c);
+	  c = my_ttnextchar (hereit, endit);
+	  if (hereit != endit) aparam.push_back(c);
+	  
+	} else if (quote=='\0' && (c=='\'' /*|| c=='"'*/)) {
+	  // found a quoted section
+	  quote = c;
+	  if (openbrackets>0) aparam.push_back(c);
+
+	} else if (quote!='\0' && c==quote) {
+	  // found the end of a quote
+	  quote = '\0';
+	  if (openbrackets<0) aparam.push_back(c);
+
+	} else if (quote=='\0' && (c==',' || c==')') && openbrackets==0) {
+	  // found the end of a parameter
+	  c = my_ttnextchar (hereit, endit);
+	  break;
+
+	} else if (c=='(') {
+	  aparam.push_back(c);
+	  openbrackets++;
+	} else if (c==')') {
+	  openbrackets--;
+	  aparam.push_back(c);
+	} else {
+	  // ordinary character
+	  aparam.push_back(c);
+	}
+
+	c = my_ttnextchar (hereit, endit);
+      }
+
+
+      // add this parameter to the list
+      splitmacroparam.push_back(aparam);
+    }
+  }
+
+  if (macroname == "If") {
+    // get the condition, then clause and else clause
+    text_tlist::iterator paramcond = splitmacroparam.begin();
+    text_tlist::iterator paramend = splitmacroparam.end();
+    text_tlist::iterator paramthen = paramend;
+    text_tlist::iterator paramelse = paramend;
+    
+    if (paramcond != paramend) {
+      paramthen = paramcond;
+      paramthen++;
+    }
+    if (paramthen != paramend) {
+      paramelse = paramthen;
+      paramelse++;
+    }
+    
+    // will always output something
+    outputtext.clear();
+
+
+    // expand out the first parameter
+    if (paramcond != paramend) {
+      /// text_t tmpoutput;
+      /// expandstring (macropackage, *paramcond, tmpoutput, recursiondepth+1);
+      /// lc (tmpoutput);
+      // test the expanded string
+      if (boolexpr (macropackage, *paramcond, recursiondepth+1)) {
+	//(tmpoutput.size()) && (tmpoutput != "false") && (tmpoutput != "0")) {
+	// true
+	if (paramthen != paramend)
+	  expandstring (macropackage, *paramthen, outputtext, recursiondepth+1);
+      } else {
+	// false
+	if (paramelse != paramend)
+	  expandstring (macropackage, *paramelse, outputtext, recursiondepth+1);
+      }
+    }
+    
+    return true;
+  }
+
+  // try and find this macro
+
+  // this list might be replaced by something a little more
+  // sophisticated in the future.
+  text_tlist packagelist;
+  packagelist.push_back (macropackage);
+  packagelist.push_back ("Global");
+
+  paramspeclist::iterator paramhere, paramend;
+  text_tlist::iterator packagehere = packagelist.begin();
+  text_tlist::iterator packageend = packagelist.end();
+  mvalue *macrovalue = NULL;
+  while ((macrovalue == NULL) && (packagehere != packageend)) 
+    {
+      // first look in the currentmacros
+      macrovalue = currentmacros->macro_find(*packagehere, macroname);
+      if (macrovalue == NULL)
+	macrovalue = currentmacros->macro_find("Style", macroname);
+
+      // look in the default macros
+      if (macrovalue == NULL) 
+	{
+	  // next look in the defaultmacros
+	  if (defaultmacros->macro_find (*packagehere, macroname) != NULL)
+	    {
+	      paramhere = orderparamlist->begin(); paramend = orderparamlist->end();
+	      while ((macrovalue == NULL) && (paramhere != paramend))
+		{
+// 		  cerr << text_t2ascii << "\npackage: " << *packagehere << "\n";
+// 		  cerr << text_t2ascii << "macroname: " << macroname << "\n";
+// 		  cerr << text_t2ascii << "param: " << (*paramhere).param << "\n";
+// 		  cerr << "spec: " << (int)((*paramhere).spec) << "\n";
+		  macrovalue = defaultmacros->parameter_find(*packagehere, macroname,
+							     (*paramhere).param);
+		  paramhere++;
+		}
+	    }
+	}
+
+      // and again in the package "Style"
+      if (macrovalue == NULL) 
+	{
+	  // next look in the defaultmacros
+	  if (defaultmacros->macro_find ("Style", macroname) != NULL)
+	    {
+	      paramhere = orderparamlist->begin(); paramend = orderparamlist->end();
+	      while ((macrovalue == NULL) && (paramhere != paramend))
+		{
+		  macrovalue = defaultmacros->parameter_find("Style", macroname,
+							     (*paramhere).param);
+		  paramhere++;
+		}
+	    }
+	}
+      if (macrovalue == NULL) packagehere++;
+    }
+
+  if (macrovalue != NULL)
+    {
+      // we found a macro
+
+      // replace all the option macros (_1_, _2_, ...) in the value of this macro
+      // and decide if we need to expand the value of this macro
+      bool needsexpansion = false;
+      text_t tempmacrovalue;
+      tempmacrovalue.clear();
+      hereit = macrovalue->value.begin();
+      endit = macrovalue->value.end();
+      if (hereit != endit) c = (*hereit);
+      while (hereit != endit)
+	{
+	  if (c == '\\')
+	    {
+	      // found an escape character
+	      needsexpansion = true;
+	      tempmacrovalue.push_back(c);
+	      c = my_ttnextchar (hereit, endit);
+	      if (hereit != endit) tempmacrovalue.push_back(c);
+	      c = my_ttnextchar (hereit, endit);
+	    }
+	  else if (c == '_')
+	    {
+	      text_t::const_iterator savedhereit = hereit;
+
+	      // attempt to get a number
+	      int argnum = 0;
+	      unsigned short digc = my_ttnextchar (hereit, endit);
+	      while (digc >= '0' && digc <= '9') {
+		argnum = argnum*10 + digc - '0';
+		digc = my_ttnextchar (hereit, endit);
+	      }
+	      if (digc == '_' && argnum > 0) {
+		// found an option macro, append the appropriate text
+		text_tlist::iterator ttlisthere = splitmacroparam.begin();
+		text_tlist::iterator ttlistend = splitmacroparam.end();
+		while ((argnum > 1) && (ttlisthere != ttlistend)) {
+		  argnum--;
+		  ttlisthere++;
+		}
+		if (ttlisthere != ttlistend) {
+		  tempmacrovalue.append(*ttlisthere);
+		  if (findchar((*ttlisthere).begin(), (*ttlisthere).end(), '_') != (*ttlisthere).end())
+		    needsexpansion = true;
+		}
+
+		c = my_ttnextchar (hereit, endit);
+
+	      } else {
+		// wasn't a option macro
+		needsexpansion = true;
+		tempmacrovalue.push_back(c);
+		hereit = savedhereit;
+		c = my_ttnextchar (hereit, endit);
+	      }
+	    }
+	  else
+	    {
+	      tempmacrovalue.push_back(c);
+	      c = my_ttnextchar (hereit, endit);
+	    }
+	}
+      
+      // recursively replace this macro (if we need to)
+      if (needsexpansion) {
+	expandstring (*packagehere, tempmacrovalue, outputtext, recursiondepth+1);
+      } else {
+	outputtext += tempmacrovalue;
+      }
+
+      return true;
+    }
+
+  // GRB: deal with remaining code properly as it faults
+  return false;
+
+  if (logout != NULL) {
+    (*logout) << text_t2ascii << "Warning: _" << 
+      macropackage << ":" << macroname << "_ not found\n";
+  }
+  
+  return false; // didn't find the macro
+}
+
+
+void displayclass::printdefaultmacros ()
+{
+  defpackagemap::const_iterator packagemapit;
+  defmacromap::const_iterator macromapit;
+  defparammap::const_iterator parammapit;
+  const mvalue *mvalueptr;
+  outconvertclass text_t2ascii;
+
+  text_t packagename, macroname, macroparam;
+  
+  for (packagemapit = defaultmacros->package_begin();
+       packagemapit != defaultmacros->package_end();
+       packagemapit++) 
+    {
+      packagename = (*packagemapit).first;
+      //     cerr << "***package   : \"" << packagename << "\"\n";
+    
+      for (macromapit = (*packagemapit).second.begin();
+	   macromapit != (*packagemapit).second.end();
+	   macromapit++) 
+	{
+	  macroname = (*macromapit).first;
+	  //       cerr << "***macroname : \"" << macroname << "\"\n";
+
+	  for (parammapit = (*macromapit).second.begin();
+	       parammapit != (*macromapit).second.end();
+	       parammapit++) 
+	    {
+	      macroparam = (*parammapit).first;
+	      mvalueptr = &((*parammapit).second);
+	      cerr << text_t2ascii << "package   : \"" << packagename << "\"\n";
+	      cerr << text_t2ascii << "macroname : \"" << macroname << "\"\n";
+	      cerr << text_t2ascii << "parameters: [" << macroparam << "]\n";
+	      cerr << text_t2ascii << "filename  : \"" << mvalueptr->filename << "\"\n";
+	      cerr << text_t2ascii << "value     : {" << mvalueptr->value << "}\n\n";
+	    }
+	}
+    }
+}
+
+void displayclass::printallparams ()
+{
+  text_tset::iterator text_tsetit;
+  outconvertclass text_t2ascii;
+
+  cerr << text_t2ascii << "** allparams\n";
+  for (text_tsetit=allparams.begin();
+       text_tsetit!=allparams.end();
+       text_tsetit++) {
+    cerr << text_t2ascii << (*text_tsetit) << "\n";
+  }
+  cerr << text_t2ascii << "\n";
+}
+
+
+
+/////////////////////////////////////
+// stuff to do tricky output
+/////////////////////////////////////
+
+displayclass &operator<< (outconvertclass &theoutc, displayclass &display)
+{
+  display.setconvertclass (&theoutc);
+  return display;
+}
+
+displayclass &operator<< (displayclass &display, const text_t &t)
+{
+  outconvertclass *theoutc = display.getconvertclass();
+
+  if (theoutc == NULL) return display;
+  
+  text_t output;
+  display.expandstring (t, output);
+  (*theoutc) << output;
+
+  return display;
+}
Index: /main/tags/2.38/gsdl/lib/display.h
===================================================================
--- /main/tags/2.38/gsdl/lib/display.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/display.h	(revision 21083)
@@ -0,0 +1,266 @@
+/**********************************************************************
+ *
+ * display.h -- Context sensitive macro language
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef DISPLAY_H
+#define DISPLAY_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#  include <ospace\std\list>
+#  include <ospace\std\set>
+#  include <ospace\std\map>
+#  include <ospace\std\algorithm>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#  include <list.h>
+#  include <set.h>
+#  include <map.h>
+#  if defined(GSDL_USE_ALGO_H)
+#    include <algo.h>
+#  else
+#    include <algorithm.h>
+#  endif
+#else
+#  include <vector>
+#  include <list>
+#  include <set>
+#  include <map>
+#  include <algorithm>
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+
+#define unistream ifstream
+#else
+#  include <iostream>
+#  include <fstream>
+
+typedef std::basic_ifstream<unsigned char> unistream;
+
+#endif
+
+
+// use the standard namespace
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#elif !defined(GSDL_NAMESPACE_BROKEN)
+using namespace std;
+#endif
+
+
+
+// MAXRECURSIONDEPTH is a cutoff to catch
+// cyclic macros (a includes b and b includes a)
+#define MAXRECURSIONDEPTH 30
+
+// class prototypes
+class defaultmacros_t;
+class currentmacros_t;
+
+// a few supporting types
+// fileelement isn't finished yet, I have to find out
+// more about getting information about files
+struct fileinfoelement 
+{
+  int otherinfo;
+};
+
+inline bool operator==(const fileinfoelement &x, const fileinfoelement &y) {
+  return (x.otherinfo==y.otherinfo);
+}
+
+inline bool operator<(const fileinfoelement &x, const fileinfoelement &y) {
+  return (x.otherinfo<y.otherinfo);
+}
+
+typedef map<text_t, fileinfoelement, lttext_t> fileinfomap;
+
+
+typedef map<text_t, text_t, lttext_t> paramhashtype;
+
+
+struct paramspec 
+{
+  double spec;
+  text_t param;
+};
+
+inline bool operator==(const paramspec& x, const paramspec& y) 
+{
+  return ((x.spec == y.spec) && (x.param == y.param));
+}
+
+inline bool operator!=(const paramspec& x, const paramspec& y) 
+{
+  return ((x.spec != y.spec) || (x.param != y.param));
+}
+
+// note: paramspec is sorted by reverse spec and then param
+
+inline bool operator<(const paramspec& x, const paramspec& y) 
+{
+  return ((x.spec > y.spec) ||
+	  ((x.spec == y.spec) && (x.param < y.param)));
+}
+
+inline bool operator>(const paramspec& x, const paramspec& y) 
+{
+  return ((x.spec < y.spec) ||
+	  ((x.spec == y.spec) && (x.param > y.param)));
+}
+
+typedef vector<paramspec> paramspeclist;
+
+
+// NOTE: when macros are used within text they should have
+// underscores '_' on both sides, however, in calls to
+// setdefaultmacro and setmacro they should not have the
+// underscores. So you might have
+//
+// setmacro ("aname", "query", " some text ");
+// expandstring ("_aname_", expandedtext);
+//
+// because the input to expandstring is a block of text, not
+// a macroname
+
+class displayclass 
+{
+public:
+  displayclass ();
+  ~displayclass ();
+  
+  // isdefaultmacro sees if there is an entry in the list of
+  // default macros with the given package and macro name
+  // returns 0 if no macros in the package or in the global package
+  //           were found
+  //         1 if no macros in the package were found but a macro
+  //           in the global package was found
+  //         2 if a macro in the given package was found
+  int isdefaultmacro (text_t package, const text_t &macroname);
+
+  // setdefaultmacro adds an entry to the list of default macros 
+  // returns 0 if there was no error,
+  //        -1 if it redefined a macro
+  //        -2 if it hid a Global macro
+  //        -3 if it redefined a macro and hid a Global macro
+  //        -4 if no macroname was supplied
+  int setdefaultmacro (text_t package, const text_t &macroname, 
+		       text_t params, const text_t &macrovalue);
+  
+  // loads a default macro file (if it isn't already loaded)
+  // returns 0 if didn't need to load the file (it was already loaded)
+  //         1 if was (re)loaded
+  //        -1 an error occurred while trying to load the file
+  int loaddefaultmacros (text_t thisfilename);
+  
+  // prepares to create a page: deletes all macros set with
+  // 'setmacro', checks all the default macro files to see
+  // if any need reloading, and sets the page parameters.
+  void openpage (const text_t &thispageparams, 
+		 const text_t &thisprecedence);
+  
+  // changes the parameters for the current page.
+  void setpageparams (text_t thispageparams, 
+		      text_t thisprecedence);
+  
+  // overrides (or sets) a macro for the current page.
+  // returns 0 if there was no error,
+  //        -1 if it redefined a macro
+  //        -4 if no macroname was supplied
+  int setmacro (const text_t &macroname, 
+		text_t package, 
+		const text_t &macrovalue);
+  
+  void expandstring (const text_t &inputtext, text_t &outputtext);
+  void expandstring (text_t package, const text_t &inputtext,
+		     text_t &outputtext, int recursiondepth = 0);
+
+  // these functions are not ment to be used directly, they are used to permit 
+  // concise stream output like:
+  // cout << text_t2ascii << display << "_amacro_" << "_anothermacro_";
+  void setconvertclass (outconvertclass *theoutc) {outc = theoutc;}
+  outconvertclass *getconvertclass () {return outc;}
+
+  // say where any error logging goes, this can be NULL
+  // if no error logging is desired - returns previous value
+  ostream *setlogout (ostream *thelogout);
+
+  // debug stuff
+  void printdefaultmacros ();
+  void printallparams ();
+
+protected:
+  // special variables to permit trickly output
+  outconvertclass *outc;
+
+  // general variables
+  text_tset allparams;  // possible parameter combinations
+  defaultmacros_t *defaultmacros;
+  fileinfomap *defaultfiles;
+  
+  // variables to do with a page expansion
+  text_t params;
+  text_t precedence;
+  paramspeclist *orderparamlist; // ordered by specificness
+  currentmacros_t *currentmacros; // only macros set by setmacro
+
+  // logging variable
+  ostream *logout;
+
+  // reloads any default macro files which have changed
+  // returns 0 no errors occurred
+  //        -1 an error occurred while trying to load one of the files
+  int checkdefaultmacrofiles ();
+
+  int setdefaultmacro (text_t package, const text_t &macroname, 
+		       text_t params, const text_t &filename,
+		       const text_t &macrovalue); 
+
+  // evaluates a boolean expression
+  bool boolexpr (text_t package, const text_t &expr, int recursiondepth);
+
+  // (recursively) expand out a macro
+  // returns true  if the macro was found
+  //         false if the macro was not found
+  bool macro (const text_t &macroname, text_t macropackage, 
+	      const text_t &macroparam, text_t &outputtext,
+	      int recursiondepth);
+};
+
+
+displayclass &operator<< (outconvertclass &theoutc, displayclass &display);
+displayclass &operator<< (displayclass &display, const text_t &t);
+
+#endif
Index: /main/tags/2.38/gsdl/lib/fileutil.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/fileutil.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/fileutil.cpp	(revision 21083)
@@ -0,0 +1,452 @@
+/**********************************************************************
+ *
+ * fileutil.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "fileutil.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+
+// returns the proper concatenation of the two paths
+text_t filename_cat (text_t path1, text_t path2) {
+  text_t::iterator here;
+  text_t::iterator begin;
+  text_t::iterator end;
+
+  // make sure there is just one slash, of the correct type,
+  // at the end of path1 (unless path1 is an empty string).
+  if (!path1.empty()) {
+    // remove all trailing slashes
+    here = path1.end();
+    here--;
+    begin = path1.begin();
+    while (here != begin && (*here == '/' || *here == '\\')) {
+      here--;
+    }
+    here++;
+    path1.erase(here,path1.end());
+    
+    // add one final slash
+#ifdef __WIN32__
+    path1 += "\\";
+#else
+    path1 += "/";
+#endif 
+  }
+
+  // remove all slashes from the start of path2
+  here = path2.begin();
+  end = path2.end();
+  while (here != end && (*here == '/' || *here == '\\')) {
+    here++;
+  }
+  path2.erase (path2.begin(), here);
+  
+  text_t fullpath = path1 + path2;
+  
+  // make sure all the right slashes are used
+  here = fullpath.begin();
+  end = fullpath.end();
+  while (here != end) {
+#ifdef __WIN32__
+    if (*here == '/') *here = '\\';
+#else
+    if (*here == '\\') *here = '/';
+#endif
+    here ++;
+  }
+  return fullpath;
+}
+
+text_t filename_cat (text_t path1, text_t path2, text_t path3) {
+  return filename_cat(filename_cat(path1,path2),path3);
+}
+
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4) {
+  return filename_cat(filename_cat(filename_cat(path1,path2),path3),path4);
+}
+
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4, 
+		     text_t path5) {
+  return filename_cat(filename_cat(filename_cat(filename_cat(path1,path2),path3),
+				   path4),path5);
+}
+
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4, 
+		     text_t path5, text_t path6) {
+  return filename_cat(filename_cat(path1,path2,path3,path4,path5),path6);
+}
+
+// returns true if filename can be opened
+bool file_exists (const text_t &filename) {
+  char *cstr = filename.getcstr();
+#ifdef GSDL_USE_IOS_H
+  ifstream filestream (cstr, ios::in | ios::nocreate);
+#else
+  ifstream filestream (cstr, ios::in);
+#endif
+  delete cstr;
+  
+  if (filestream) {
+    // file exists
+    filestream.close ();
+    return true;
+  }
+  
+  // file does not exist
+  return false;
+}
+
+// returns true if filename can be opened
+bool file_writable (const text_t &filename) {
+  char *cstr = filename.getcstr();
+#ifdef GSDL_USE_IOS_H
+  ifstream filestream (cstr, ios::out | ios::nocreate);
+#else
+  ifstream filestream (cstr, ios::out);
+#endif
+  delete cstr;
+  
+  if (filestream) {
+    // file exists
+    filestream.close ();
+    return true;
+  }
+  
+  // file does not exist
+  return false;
+}
+
+#if defined(__WIN32__) && !defined(__GNUC__)
+
+#include <windows.h>
+
+bool directory_exists (const text_t &dirname) {
+  
+  WIN32_FIND_DATA FileData;  
+  HANDLE hSearch; 
+
+  text_t dir = dirname + "\\*";
+  char *dirpath = dir.getcstr();
+  
+  hSearch = FindFirstFile(dirpath, &FileData);
+  if (hSearch == INVALID_HANDLE_VALUE) {
+    delete dirpath;
+    return false;
+  }
+
+  FindClose (hSearch);
+  delete dirpath;
+  return true;
+}
+
+bool read_dir (const text_t &dirname, text_tset &filelist) {
+  
+  WIN32_FIND_DATA FileData;  
+  HANDLE hSearch; 
+  
+  text_t dir = dirname + "\\*";
+  char *dirpath = dir.getcstr();
+  
+  hSearch = FindFirstFile(dirpath, &FileData); 
+  if (hSearch == INVALID_HANDLE_VALUE) {
+    delete dirpath;
+    return false;
+  }
+  
+  text_t filename = FileData.cFileName;
+  if (filename != "." && filename != ".." && filename != "CVS")
+    filelist.insert (filename); 
+  
+  while (FindNextFile(hSearch, &FileData)) {
+    filename = FileData.cFileName;
+    if (filename == "." || filename == ".." || filename == "CVS")
+      continue;
+    filelist.insert (filename); 
+  }
+  
+  FindClose(hSearch);
+  delete dirpath;
+  
+  return true;
+}
+
+bool read_dir (const text_t &dirname, text_tarray &filelist) {
+  
+  WIN32_FIND_DATA FileData;  
+  HANDLE hSearch; 
+  
+  text_t dir = dirname + "\\*";
+  char *dirpath = dir.getcstr();
+  
+  hSearch = FindFirstFile(dirpath, &FileData); 
+  if (hSearch == INVALID_HANDLE_VALUE) {
+    delete dirpath;
+    return false;
+  }
+  
+  text_t filename = FileData.cFileName;
+  if (filename != "." && filename != ".." && filename != "CVS")
+    filelist.push_back (filename); 
+  
+  while (FindNextFile(hSearch, &FileData)) {
+    filename = FileData.cFileName;
+    if (filename == "." || filename == ".." || filename == "CVS")
+      continue;
+    filelist.push_back (filename); 
+  }
+  
+  FindClose(hSearch);
+  delete dirpath;
+
+  return true;
+}
+
+#else
+
+#include <dirent.h>
+
+bool directory_exists (const text_t &dirname) {
+  
+  char *tmp = dirname.getcstr();
+  DIR *dirin = opendir (tmp);
+  delete tmp;
+  
+  if (dirin == NULL) return false;
+  closedir (dirin);
+  return true;
+}
+
+bool read_dir (const text_t &dirname, text_tset &filelist) {
+  
+  char *tmp = dirname.getcstr();
+  DIR *dirin = opendir (tmp);
+  delete tmp;
+  
+  if (dirin == NULL) return false;
+  
+  dirent *dirp; 
+  
+  text_t filename;
+  while ((dirp = readdir (dirin)) != NULL) {
+    filename = dirp->d_name;
+    if (filename == "." || filename == ".." || filename == "CVS")
+      continue;
+    filelist.insert (filename);
+  }
+  closedir (dirin);
+  return true;
+}
+
+bool read_dir (const text_t &dirname, text_tarray &filelist) {
+  
+  char *tmp = dirname.getcstr();
+  DIR *dirin = opendir (tmp);
+  delete tmp;
+  
+  if (dirin == NULL) return false;
+  
+  dirent *dirp; 
+  
+  text_t filename;
+  while ((dirp = readdir (dirin)) != NULL) {
+    filename = dirp->d_name;
+    if (filename == "." || filename == ".." || filename == "CVS")
+      continue;
+    filelist.push_back (filename);
+  }
+  closedir (dirin);
+  return true;
+}
+
+#endif
+
+// returns true if things look like they happened ok
+bool file_copy (const text_t &fromfile, const text_t &tofile) {
+  
+  char *fromfilec = fromfile.getcstr();
+  char *tofilec = tofile.getcstr();
+  bool fail = false;
+
+#ifdef __WIN32__
+  if (CopyFile (fromfilec, tofilec, FALSE) == 0) fail = true;
+
+#else
+
+  // I'm sure there's a better way to do this - for now I don't have 
+  // time to find it though
+  ifstream from (fromfilec);
+  if (!from) {
+    fail = true;
+  } else {
+    ofstream to (tofilec);
+    if (!to) {
+      fail = true;
+      from.close();
+    } else {
+      char c;
+      from.get(c);
+      while (!from.eof ()) {
+	to.put(c);
+	from.get(c);
+      }
+      from.close();
+      to.close();
+    }
+  }
+
+#endif
+
+  delete fromfilec;
+  delete tofilec;
+  if (fail) return false;
+  return true;
+}
+
+// This is a fairly quick and nasty attempt at doing a "tail" on a file
+// (i.e. returning the last numlines lines of filename).  It has one
+// important limitation in that it expects lines to be linelength
+// characters long on average.  This of course makes it possible that it
+// won't return numlines lines if there are some lines that are longer than
+// linelength.  It also makes it fairly inefficient as it always reads in
+// numlines*linelength characters when it most often doesn't need them all.
+// For current needs it's fine though.
+// -- Pass a linelength of 0 to use the default linelength (256 chars).
+// -- The maximum value of linelength is MAXLINELENGTH
+text_t file_tail (const text_t &filename, int numlines, int linelength) {
+
+#define MAXLINELENGTH 2048
+
+  if (numlines < 1) numlines = 1;
+  if (linelength < 1) linelength = 256;
+  if (linelength > MAXLINELENGTH) linelength = MAXLINELENGTH;
+
+  streampos numchars = linelength*numlines;
+
+  text_tarray lines;
+  text_t ret;
+
+  char *filenamec = filename.getcstr();
+  char linec[MAXLINELENGTH];
+  ifstream file_in (filenamec);
+  delete filenamec;
+  if (file_in) {
+    file_in.seekg (0, ios::end);
+    streampos file_length = file_in.tellg();
+    if (file_length < numchars) numchars = file_length;
+    file_in.seekg (-numchars, ios::end);
+
+    while (!file_in.eof()) {
+      file_in.getline (linec, linelength);
+      ret.setcstr(linec);
+      text_t::const_iterator here = ret.begin();
+      text_t::const_iterator end = ret.end();
+      // make sure line has content
+      while (here != end) {
+	if (*here != '\n' && *here != ' ') {
+	  lines.push_back (ret);
+	  break;
+	}
+	here ++;
+      }
+    }
+    file_in.close();
+  }
+
+  ret.clear();
+  int numlinesgot = lines.size();
+  int sindex = 0;
+  if (numlinesgot > numlines) sindex = numlinesgot - numlines;
+  for (int i = sindex; i < numlinesgot; i++) {
+    ret += lines[i] + "\n";
+  }
+
+  return ret;
+}
+
+#ifdef __WIN32__
+
+#include <direct.h>
+// returns true if directory was created successfully
+bool mk_dir (const text_t &dirname) {
+  char *dirnamec = dirname.getcstr();
+  int rv = _mkdir (dirnamec);
+  delete dirnamec;
+  if (rv == 0) return true;
+  return false;
+}
+
+#else
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+// returns true if directory was created successfully
+bool mk_dir (const text_t &dirname) {
+  mode_t mode = 0777;
+  char *dirnamec = dirname.getcstr();
+  int rv = mkdir (dirnamec, mode);
+  delete dirnamec;
+  if (rv == 0) return true;
+  return false;
+}
+
+#endif
+
+// read in file from filename and load into content
+bool read_file (const text_t &filename, text_t &content) {
+
+  content.clear();
+
+  char *filenamec = filename.getcstr();
+#ifdef GSDL_USE_IOS_H
+  ifstream file_in (filenamec, ios::in | ios::nocreate);
+#else
+  ifstream file_in (filenamec, ios::in);
+#endif
+  delete filenamec;
+
+  if (file_in) {
+    char c;
+    file_in.get(c);
+    while (!file_in.eof ()) {
+      content.push_back(c);
+      file_in.get(c);
+    }
+    file_in.close();
+  } else {
+    return false;
+  }
+  return true;
+}
Index: /main/tags/2.38/gsdl/lib/fileutil.h
===================================================================
--- /main/tags/2.38/gsdl/lib/fileutil.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/fileutil.h	(revision 21083)
@@ -0,0 +1,65 @@
+/**********************************************************************
+ *
+ * fileutil.h -- a few useful file utilities
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef FILEUTIL_H
+#define FILEUTIL_H
+
+#include "text_t.h"
+
+
+// returns the proper concatenation of the two paths
+text_t filename_cat (text_t path1, text_t path2);
+text_t filename_cat (text_t path1, text_t path2, text_t path3);
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4);
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4, 
+		     text_t path5);
+text_t filename_cat (text_t path1, text_t path2, text_t path3, text_t path4, 
+		     text_t path5, text_t path6);
+
+// returns true if filename can be opened
+bool file_exists (const text_t &filename);
+
+// returns true if filename can be written to
+bool file_writable (const text_t &filename);
+
+// returns true if directory exists
+bool directory_exists (const text_t &dirname);
+
+// note that read_dir appends to filelist, it doesn't clear
+// it first
+bool read_dir (const text_t &dirname, text_tarray &filelist);
+bool read_dir (const text_t &dirname, text_tset &filelist);
+
+bool file_copy (const text_t &fromfile, const text_t &tofile);
+
+text_t file_tail (const text_t &filename, int numlines, int linelength);
+
+// returns true if directory created successfully
+bool mk_dir (const text_t &dirname);
+
+bool read_file (const text_t &filename, text_t &content);
+
+#endif
Index: /main/tags/2.38/gsdl/lib/gsdlconf.h
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdlconf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdlconf.h	(revision 21083)
@@ -0,0 +1,176 @@
+/**********************************************************************
+ *
+ * gsdlconf.h -- system specific includes
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef GSDLCONF_H
+#define GSDLCONF_H
+
+#define GSDL_VERSION "x.xx"
+
+#if defined(__WIN32__) && !defined(__CYGWIN__)
+#include "../win32cfg.h"
+#else
+#include "../config.h"
+#endif
+
+// Note: all macros used in the gsdl software (except the _H macros) should
+// now start with GSDL_
+
+// GSDL_NEED_STRINGS_H should be defined if some string functions
+// needed (like strcasecmp) are in strings.h
+#if defined(__IBMCPP__)
+#  define GSDL_NEED_STRINGS_H
+#endif
+
+// GSDL_USE_IOS_H should be defined if the .h extension needs to
+// be used for the io stream headers
+#if (defined(__GNUG__)  && __GNUG__ + 0 < 3) || defined(__IBMCPP__)
+#  define GSDL_USE_IOS_H 1
+#endif
+
+// GSDL_USE_STL_H should be defined if the .h extension needs to
+// be used for the stl header files
+#if defined(__IBMCPP__)
+#  define GSDL_USE_STL_H 1
+#endif
+
+// GSDL_USE_ALGO_H should be defined if algo.h should be used 
+// instead of algorithm.h
+#if defined(__IBMCPP__)
+#  define GSDL_USE_ALGO_H 1
+#endif
+
+// GSDL_NAMESPACE_BROKEN should be defined if namespaces should
+// not be used
+#if (defined(__GNUG__)  && __GNUG__ + 0 < 3) || defined(__IBMCPP__)
+#  define GSDL_NAMESPACE_BROKEN 1
+#endif
+
+// GSDL_USE_OBJECTSPACE should now be used instead of USE_OBJECTSPACE
+#if defined(USE_OBJECTSPACE)
+#  define GSDL_USE_OBJECTSPACE
+#endif
+
+// GSDL_NEED_DESTROY_USHORT should be defined if the compiler needs
+// a definition for void destroy(short unsigned int *)
+#if defined(__IBMCPP__)
+# define GSDL_NEED_DESTROY_USHORT
+#endif
+
+// mktemp
+
+#if !defined(__WIN32__) || defined(__GNUC__)
+#include <unistd.h>
+#define GSDL_MKTEMP(str) mktemp(str)
+#else
+#include <io.h>
+#define GSDL_MKTEMP(str) _mktemp(str)
+#endif
+
+
+
+// file locking
+
+#if defined(__WIN32__)
+
+#if !defined(LK_UNLOCK) && defined(LK_UNLCK)
+#define LK_UNLOCK LK_UNLCK
+#endif
+
+#if defined (GSDL_USE_IOS_H)
+#include <io.h>
+#include <sys/locking.h>
+
+#if defined(__GNUC__) /* not gcc >= 3 - this has GSDL_USE_IOS_H */
+#define GSDL_GET_FILEDESC(str) str.filedesc()
+#else
+#define GSDL_GET_FILEDESC(str) str.fd()
+#endif
+
+#define GSDL_UNLOCK_FILE(fd) _locking(fd, LK_UNLCK, 200)
+#define GSDL_LOCK_FILE(fd) lock_val = _locking(fd, LK_NBLCK, 200)
+
+#else    /* ifdef GSDL_USE_IOS_H */
+
+// when using <fstream> (i.e. VC++ 6.0) I can't work out how
+// to return a filedesc. File locking won't currently work
+// for those windows compilers requiring GSDL_USE_IOS_H to
+// not be set -- Stefan.
+#define GSDL_GET_FILEDESC(str) 1
+#define GSDL_LOCK_FILE(fd) lock_val = 0
+#define GSDL_UNLOCK_FILE(fd) 0
+#endif
+
+#else     /* not WIN32 */
+// darwin (Mac OS X) requires _STREAM_COMPAT to be set when
+// including <fstream.h> for filedesc() to be declared...
+#define GSDL_GET_FILEDESC(str) str.filedesc()
+
+#if GSDL_USE_FLOCK
+#include <sys/lock.h>
+
+#ifndef LOCK_SH
+#define LOCK_SH	1
+#endif
+
+#ifndef LOCK_EX
+#define LOCK_EX	2
+#endif
+
+#ifndef LOCK_NB
+#define LOCK_NB 4
+#endif
+
+#ifndef LOCK_UN
+#define LOCK_UN 8
+#endif
+
+#define GSDL_UNLOCK_FILE(fd) flock (fd, LOCK_UN)
+#define GSDL_LOCK_FILE(fd) lock_val = flock (fd, LOCK_EX + LOCK_NB)
+
+#else  /* ! GSDL_USE_FLOCK */
+// use fcntl
+#include <fcntl.h>
+#define GSDL_UNLOCK_FILE(fd) \
+	{					\
+	  struct flock flock;			\
+	  flock.l_type = F_UNLCK;		\
+	  flock.l_whence = SEEK_SET;		\
+	  flock.l_start = flock.l_len = 0L;	\
+	  fcntl (fd, F_SETLK, &flock);	\
+	}
+#define GSDL_LOCK_FILE(fd) \
+	{					\
+	  struct flock flock;			\
+	  flock.l_type = F_WRLCK;		\
+	  flock.l_whence = SEEK_SET;			\
+	  flock.l_start = flock.l_len = 0L;	\
+	  lock_val = fcntl (fd, F_SETLK, &flock);	\
+	}
+
+#endif
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/lib/gsdltimes.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdltimes.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdltimes.cpp	(revision 21083)
@@ -0,0 +1,149 @@
+/**********************************************************************
+ *
+ * gsdltimes.cpp -- functions to deal with time
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdltimes.h"
+
+// returns a string of the form "YYYY/MM/DD hh:mm:ss" (expressed in
+// Coordinated Universal Time (UTC))
+// returns "" if an error occurs
+text_t time2text (time_t time) {
+  tm *tm_ptr = gmtime(&time);
+  if (tm_ptr == NULL) return "";
+
+  // year
+  text_t timestr(tm_ptr->tm_year+1900);
+  timestr.push_back('/');
+
+  // month (note the +1)
+  if ((tm_ptr->tm_mon+1) < 10) timestr.push_back('0');
+  timestr += (tm_ptr->tm_mon+1);
+  timestr.push_back('/');
+
+  // day
+  if (tm_ptr->tm_mday < 10) timestr.push_back('0');
+  timestr += tm_ptr->tm_mday;
+  timestr.push_back(' ');
+
+  // hour
+  if (tm_ptr->tm_hour < 10) timestr.push_back('0');
+  timestr += tm_ptr->tm_hour;
+  timestr.push_back(':');
+
+  // minutes
+  if (tm_ptr->tm_min < 10) timestr.push_back('0');
+  timestr += tm_ptr->tm_min;
+  timestr.push_back(':');
+
+  // seconds
+  if (tm_ptr->tm_sec < 10) timestr.push_back('0');
+  timestr += tm_ptr->tm_sec;
+
+  return timestr;
+}
+
+// takes a string like that returned by time2text and returns corresponding time_t
+// returns -1 if an error occurs
+time_t text2time (const text_t &timestr) {
+  tm timetm;
+  text_t tempstr;
+  
+  text_t::const_iterator time_here = timestr.begin();
+  text_t::const_iterator time_end = timestr.end();
+
+  // year
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, '/', tempstr);
+  timetm.tm_year = tempstr.getint() - 1900;
+  if (timetm.tm_year < 0) return (time_t) -1;
+
+  // month (note the -1)
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, '/', tempstr);
+  timetm.tm_mon = tempstr.getint() - 1;
+  if (timetm.tm_mon < 0 || timetm.tm_mon > 11)
+    return (time_t) -1;
+  
+  // day
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, ' ', tempstr);
+  timetm.tm_mday = tempstr.getint();
+  if (timetm.tm_mday < 1 || timetm.tm_mday > 31)
+    return (time_t) -1;
+  
+  // hour
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, ':', tempstr);
+  timetm.tm_hour = tempstr.getint();
+  if (timetm.tm_hour < 0 || timetm.tm_hour > 23)
+    return (time_t) -1;
+  
+  // min
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, ':', tempstr);
+  timetm.tm_min = tempstr.getint();
+  if (timetm.tm_min < 0 || timetm.tm_min > 59)
+    return (time_t) -1;
+  
+  // sec
+  if (time_here == time_end) return (time_t) -1;
+  time_here = getdelimitstr (time_here, time_end, ':', tempstr);
+  timetm.tm_sec = tempstr.getint();
+  if (timetm.tm_sec < 0 || timetm.tm_sec > 59)
+    return (time_t) -1;
+  
+  return mktime (&timetm);
+}
+
+// returns current date and time formatted like "Thu Dec 07 23:43:38 GMT 2000"
+// if ltime is true return value will be expressed in local time, otherwise
+// it'll be Coordinated Universal Time (UTC) - no promises are made that the
+// resulting string will be formatted exactly as expected, especially on windows
+// returns "" if an error occurs
+text_t get_date (bool ltime) {
+
+  tm *tm_ptr = NULL;
+  time_t t = time(NULL);
+  if (ltime) tm_ptr = localtime (&t);
+  else tm_ptr = gmtime (&t);
+  if (tm_ptr == NULL) return "";
+  char *timestr = new char[128];
+  text_t ret;
+
+  // we do this in such an ugly way because windows is kind of flakey when
+  // it comes to timezones
+  if (ltime) {
+    strftime (timestr, 128, "%a %b %d %H:%M:%S %z %Y", tm_ptr);
+    ret.setcstr (timestr);
+  } else {
+    strftime (timestr, 128, "%a %b %d %H:%M:%S", tm_ptr);
+    ret.setcstr (timestr);
+    ret += " GMT ";
+    strftime (timestr, 128, "%Y", tm_ptr);
+    ret += timestr;
+  }
+
+  delete timestr;
+  return ret;
+}
Index: /main/tags/2.38/gsdl/lib/gsdltimes.h
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdltimes.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdltimes.h	(revision 21083)
@@ -0,0 +1,46 @@
+/**********************************************************************
+ *
+ * gsdltimes.h -- functions to deal with time
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef GSDLTIMES_H
+#define GSDLTIMES_H
+
+#include <time.h>
+#include "text_t.h"
+
+// dates are stored in the format YYYY/MM/DD hh:mm:ss
+
+// returns "" if an error occurs
+text_t time2text (time_t time);
+
+// returns -1 if an error occurs
+time_t text2time (const text_t &timestr);
+
+
+// returns formatted date in local or UTC time
+// returns "" if an error occurs
+text_t get_date (bool ltime);
+
+#endif
Index: /main/tags/2.38/gsdl/lib/gsdltools.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdltools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdltools.cpp	(revision 21083)
@@ -0,0 +1,156 @@
+/**********************************************************************
+ *
+ * gsdltools.cpp -- 
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdltools.h"
+
+#if defined(__WIN32__)
+#include <windows.h>
+#include <process.h>
+#endif
+
+bool littleEndian() {
+  char s[2] = {'\xFE', '\xEF'};
+
+  if (sizeof(unsigned short) == 2)
+    return *(unsigned short*)s == 0xEFFE;
+  else if (sizeof(unsigned int) == 2)
+    return *(unsigned int*)s == 0xEFFE;
+}
+
+text_t dm_safe (const text_t &instring) {
+
+  text_t outstring;
+  text_t::const_iterator here = instring.begin();
+  text_t::const_iterator end = instring.end();
+  while (here != end) {
+    if (*here == '_' || *here == '\\') outstring.push_back('\\');
+    outstring.push_back(*here);
+    here ++;
+  }
+  return outstring;
+}
+
+// gsdl_system creates a new process for the cmd command (which
+// may contain arguments).
+// cmd should contain the full path of the program to run.
+// The child process inherits the environment of the calling
+// process.
+// If sync is true a synchronous call will be made, otherwise
+// an asyncronous call.
+// If sync is true the return value will be the exit code of
+// the child process or -1 if the child process wasn't started.
+// If sync is false the return value will be 0 if the process
+// was started ok or -1 if it failed.
+int gsdl_system (const text_t &cmd, bool sync, ostream &logout) {
+  if (cmd.empty()) return -1;
+  char *cmd_c = cmd.getcstr();
+
+#if defined (__WIN32__)
+  // the windows version - this is implemented this way
+  // to prevent windows popping up all over the place when
+  // we call a console application (like perl)
+  STARTUPINFO ps = {sizeof(STARTUPINFO), NULL, NULL, NULL,
+                    0, 0, 0, 0, 0, 0,
+                    0, STARTF_USESHOWWINDOW,
+                    SW_HIDE, 0, NULL,
+		    NULL, NULL, NULL};
+  PROCESS_INFORMATION pi;
+  BOOL res = CreateProcess(NULL,
+                           cmd_c,
+                           NULL,
+                           NULL,
+                           FALSE,
+#if defined (GSDL_LOCAL_LIBRARY)
+			   NULL,
+#else
+			   DETACHED_PROCESS,
+#endif
+                           NULL,
+                           NULL,
+                           &ps,
+                           &pi);
+  if (!res) {
+    logout << "gsdl_system failed to start " << cmd_c 
+	   << " process, error code " << GetLastError();
+    delete cmd_c;
+    return -1;
+  } 
+
+  DWORD ret = 0;
+  if (sync) { // synchronous system call
+    // wait until child process exits.
+    WaitForSingleObject(pi.hProcess, INFINITE);
+    // set ret to exit code of child process
+    GetExitCodeProcess(pi.hProcess, &ret);
+  }
+
+  CloseHandle(pi.hProcess);
+  CloseHandle(pi.hThread);
+
+#else
+  // the unix version
+  int ret = 0;
+  if (sync) { // synchronous system call
+    // make sure the command interpreter is found
+    if (system (NULL) == 0) {
+      logout << "gsdl_system failed to start " << cmd_c
+	     << " process, command interpreter not found\n";
+      delete cmd_c;
+      return -1;
+    }
+    ret = system (cmd_c);
+
+  } else { // asynchronous system call
+    int pid = fork();
+    if (pid == -1) {
+      delete cmd_c;
+      return -1;
+    }
+    if (pid == 0) {
+      // child process
+      char *argv[4];
+      argv[0] = "sh";
+      argv[1] = "-c";
+      argv[2] = cmd_c;
+      argv[3] = 0;
+      execv("/bin/sh", argv);
+    }
+  }
+#endif
+
+  delete cmd_c;
+  return ret;
+}
+
+// attempts to work out if perl is functional
+bool perl_ok (ostream &logout) {
+#if defined(__WIN32__)
+  text_t cmd = "perl -e \"exit 0\"";
+#else 
+  text_t cmd = "perl -e 'exit 0'";
+#endif
+  int i = gsdl_system (cmd, true, logout);
+  return (i == 0);
+}
Index: /main/tags/2.38/gsdl/lib/gsdltools.h
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdltools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdltools.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**********************************************************************
+ *
+ * gsdltools.h -- 
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef GSDLTOOLS_H
+#define GSDLTOOLS_H
+
+// don't actually use this but some windows
+// versions of STL complain about use of 
+// bool keyword without it
+#include "text_t.h"
+
+// returns true if machine is little endian
+bool littleEndian();
+
+// escapes '\' and '_' characters with '\'
+// note that single '\' characters occurring 
+// naturally within text (or filenames!!) will
+// be removed by the dm macro language
+text_t dm_safe (const text_t &instring);
+
+// gsdl_system creates a new process for the cmd command (which
+// may contain arguments).
+// cmd should contain the full path of the program to run.
+// The child process inherits the environment of the calling
+// process.
+// If sync is true a synchronous call will be made, otherwise
+// an asyncronous call.
+// If sync is true the return value will be the exit code of
+// the child process or -1 if the child process wasn't started.
+// If sync is false the return value will be 0 if the process
+// was started ok or -1 if it failed.
+int gsdl_system (const text_t &cmd, bool sync, ostream &logout);
+
+// attempts to work out if perl is functional
+bool perl_ok (ostream &logout);
+
+#endif
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/lib/gsdlunicode.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdlunicode.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdlunicode.cpp	(revision 21083)
@@ -0,0 +1,642 @@
+/**********************************************************************
+ *
+ * gsdlunicode.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdlunicode.h"
+
+
+// unitool is currently in mg, if mg is not being used it should
+// be moved into GSDLHOME/lib 
+#include "unitool.h"
+
+#include "fileutil.h"
+
+#include <stdio.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+
+// converts a unicode encode text_t string to a utf-8
+// encoded text_t string
+text_t to_utf8 (text_t::const_iterator here, text_t::const_iterator end) {
+  text_t out;
+
+  unsigned char thischar[MAXUTF8CHARLEN];
+  int i, charlen;
+
+  while (here != end) {
+    charlen = output_utf8_char (*here, thischar, &thischar[MAXUTF8CHARLEN-1]);
+    for (i=0; i<charlen; i++) out.push_back(thischar[i]);
+    here++;
+  }
+
+  return out;
+}
+
+// converts a utf-8 encoded text_t string to a unicode
+// encoded text_t string
+text_t to_uni (const text_t &in) {
+  text_t out;
+  unsigned char *in_cstr = (unsigned char *)in.getcstr();
+  unsigned char *here = in_cstr;
+  unsigned char *end = in_cstr;
+
+  unsigned short unichar;
+  int charlen = 0;
+
+  // get the last valid character in the string
+  while (*end != '\0') end++;
+  end--;
+
+  while ((charlen = parse_utf8_char (here, end, &unichar)) > 0) {
+    out.push_back(unichar);
+    here += charlen;
+  }
+
+  delete in_cstr;
+
+  return out;
+}
+
+
+
+utf8inconvertclass::utf8inconvertclass () {
+  utf8buflen = 0;
+}
+
+void utf8inconvertclass::reset () {
+  start = NULL;
+  len = 0;
+  utf8buflen=0;
+}
+
+void utf8inconvertclass::convert (text_t &output, status_t &status) {
+  output.clear();
+  output.reserve (len/3);
+  
+  if (start == NULL || len == 0) {
+    if (utf8buflen == 0) status = finished;
+    else status = stopped;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *here = (unsigned char *)start;
+  unsigned char *end = here+len-1;
+  unsigned short c;
+  size_t realcharlen;
+
+  size_t charlen = getutf8charlen ();
+  while (len > 0) {
+    if (charlen == 0) {
+      // start parsing a new character
+      utf8buflen = 0;
+
+      // fast common case
+      while (len > 3) {
+  	realcharlen = parse_utf8_char (here, end, &c);
+  	output.push_back (c);
+  	here += realcharlen;
+  	len -= realcharlen;
+      }
+
+      utf8buf[utf8buflen++] = *here;
+      ++here;
+      --len;
+      charlen = getutf8charlen ();
+
+    } else if (utf8buflen < charlen) {
+      // assumes charlen is always less than MAXUTF8CHARLEN
+      utf8buf[utf8buflen++] = *here;
+      ++here;
+      --len;
+    }
+
+    if (utf8buflen == charlen) {
+      // got a complete character
+      realcharlen = parse_utf8_char (utf8buf, &utf8buf[utf8buflen-1], &c);
+      output.push_back (c);
+      
+      // move any unparsed characters. If an error occurred some of
+      // the characters might be unused.
+      int i;
+      int diff = utf8buflen - realcharlen;
+      for (i=0; i < diff; i++) utf8buf[i] = utf8buf[i+diff];
+      utf8buflen = diff;
+      charlen = getutf8charlen ();
+    }
+  }
+
+  start = (char *)here; // save current position
+
+  if (utf8buflen == 0) status = finished;
+  else status = stopped;
+}
+
+
+// returns the length that the current contents of the 
+// utf8buf should be
+size_t utf8inconvertclass::getutf8charlen () {
+  if (utf8buflen == 0) return 0;
+
+  // one byte character
+  if (utf8buf[0] < 0x80) return 1;
+
+  // error, is not the start of a utf-8 character
+  if (utf8buf[0] < 0xc0) return 1;
+
+  // two bute character
+  if (utf8buf[0] < 0xe0) return 2;
+
+  // three byte character
+  if (utf8buf[0] < 0xf0) return 3;
+
+  // error, character too long for unicode
+  return 1;
+}
+
+
+void utf8outconvertclass::reset () {
+  input = NULL;
+  outs = NULL;
+  utf8buflen = 0;
+  utf8bufhere = 0;
+}
+
+// note that convert does not null-terminate the
+// output array of characters
+void utf8outconvertclass::convert (char *output, size_t maxlen, 
+				   size_t &len, status_t &status) {
+  if (input == NULL || output == NULL) {
+    if (utf8buflen == 0) status = finished;
+    else status = unfinished;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *uoutput = (unsigned char *)output;
+  text_t::iterator textend = input->end();
+  len = 0;
+  while (len < maxlen) {
+    // empty the contents of the internal buffer
+    if (utf8buflen > 0) {
+      while (len < maxlen && utf8bufhere < utf8buflen) {
+	*uoutput = utf8buf[utf8bufhere];
+	uoutput++;
+	len++;
+	utf8bufhere++;
+      }
+
+      if (utf8bufhere == utf8buflen) {
+	utf8bufhere = 0;
+	utf8buflen = 0;
+      }
+    }
+
+    // fill up the buffer with the next character
+    if (utf8buflen == 0) {
+      if (texthere == textend) break; // finished!
+      if (!rzws || (*texthere != 0x200b))
+	utf8buflen = output_utf8_char (*texthere, utf8buf, 
+				       &utf8buf[MAXUTF8CHARLEN-1]);
+      texthere++;
+      utf8bufhere = 0;
+    }
+  }
+  
+  if (texthere == textend && utf8buflen == 0) status = finished;
+  else status = unfinished;
+}
+
+
+
+
+
+
+mapdata_t::mapdata_t () {
+  int i;
+
+  // reset all the map ptrs to be NULL
+  for (i=0; i<256; i++) {
+    ptrs[i] = (unsigned short *)NULL;
+  }
+
+  // say nothing has been loaded
+  loaded = false;
+}
+
+
+mapconvert::mapconvert () {
+  absentc = 0;
+}
+
+// setmapfile will cause loadmapfile to be called when conversion is
+// needed
+bool mapconvert::setmapfile (const text_t &themapfile, unsigned short theabsentc) {
+  // check to see if the mapfile has been already loaded
+  if (mapdata.loaded && mapfile == themapfile && absentc == theabsentc) return true;
+
+  unloadmapfile ();
+  mapfile = themapfile;
+  absentc = theabsentc;
+  
+  return true;
+}
+
+
+
+// loadmapfile should be called before any conversion is done
+bool mapconvert::loadmapfile (const text_t &themapfile,
+			      unsigned short theabsentc) {
+  FILE *mapfilein = (FILE *)NULL;
+
+  // check to see if the mapfile has been already loaded
+  if (mapdata.loaded && mapfile == themapfile && absentc == theabsentc) return true;
+
+  unloadmapfile ();
+  mapfile = themapfile;
+  absentc = theabsentc;
+
+  // open the map file
+  char *cfilename = mapfile.getcstr();
+  if (cfilename == (char *)NULL) return false;
+  mapfilein = fopen(cfilename, "rb");
+  delete cfilename;
+
+  if (mapfilein == (FILE *)NULL) return false;
+
+  unsigned char c, n1, n2;
+  unsigned short *arrptr;
+  int i;
+  c = fgetc (mapfilein);
+  while (!feof (mapfilein)) {
+    if (mapdata.ptrs[c] == (unsigned short *)NULL) {
+      // allocate a new array
+      arrptr = new unsigned short[256];
+      mapdata.ptrs[c] = arrptr;
+    } else arrptr = mapdata.ptrs[c];
+
+    // clear the array
+    for (i=0; i<256; i++) arrptr[i] = 0;
+    
+    // read in this block
+    n1 = fgetc (mapfilein);
+    n2 = fgetc (mapfilein);
+    i=0;
+    while (!feof (mapfilein)) {
+      arrptr[i] = ((unsigned short)n1 << 8) | (unsigned short)n2;
+
+      i++;
+      if (i >= 256) break;
+      n1 = fgetc (mapfilein);
+      n2 = fgetc (mapfilein);
+    }
+
+    c = fgetc (mapfilein);
+  }
+
+  mapdata.loaded = true;
+
+  return true;
+}
+
+void mapconvert::unloadmapfile () {
+  if (!mapdata.loaded) return;
+
+  int i;
+  for (i=0; i<256; i++) {
+    if (mapdata.ptrs[i] != (unsigned short *)NULL) {
+      delete [] mapdata.ptrs[i];
+      mapdata.ptrs[i] = (unsigned short *)NULL;
+    }
+  }
+
+  mapdata.loaded = false;
+}
+
+
+unsigned short mapconvert::convert (unsigned short c) {
+  if (!mapdata.loaded) {
+    if (!mapfile.empty() && loadmapfile (mapfile, absentc)) {
+      // do nothing, successfully loaded database
+    } else return absentc;
+  }
+
+  if (c == 0) return 0; // 0 always maps to 0...
+
+  unsigned short n1 = c >> 8;
+  unsigned short n2 = c & 0xff;
+
+  unsigned short *arrptr = mapdata.ptrs[n1];
+  if (arrptr == (unsigned short *)NULL) return absentc;
+
+  if (arrptr[n2] == 0) return absentc;
+  return arrptr[n2];
+}
+
+text_t mapconvert::convert (const text_t &instr) {
+  if (!mapdata.loaded) return absentc;
+
+  text_t outstr;
+  text_t::const_iterator here = instr.begin();
+  text_t::const_iterator end = instr.end();
+
+  while (here != end) {
+    outstr.push_back(this->convert(*here));
+    here++;
+  }
+  
+  return outstr;
+}
+
+
+
+
+mapinconvertclass::mapinconvertclass () {
+  multibyte = 0;
+  mapbuflen = 0;
+}
+
+void mapinconvertclass::reset () {
+  start = NULL;
+  len = 0;
+  mapbuflen=0;
+}
+
+void mapinconvertclass::convert (text_t &output, status_t &status) {
+  output.clear();
+
+  if (start == NULL || len == 0) {
+    if (mapbuflen == 0) status = finished;
+    else status = stopped;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *here = (unsigned char *)start;
+
+  size_t charlen = getmapcharlen ();
+  while (len > 0) {
+    if (charlen == 0) {
+      // start parsing a new character
+      mapbuflen = 0;
+      mapbuf[mapbuflen++] = *here;
+      ++here;
+      --len;
+      charlen = getmapcharlen ();
+
+    } else if (mapbuflen < charlen) {
+      // assumes charlen is always less than MAXMAPCHARLEN
+      mapbuf[mapbuflen++] = *here;
+      ++here;
+      --len;
+    }
+
+    if (mapbuflen == charlen) {
+      // got a complete character
+      if (charlen == 1) {
+	if (mapbuf[0] < 0x80) {
+	  // ascii character
+	  output.push_back (mapbuf[0]);
+	} else {
+	  output.push_back (converter.convert((unsigned short)mapbuf[0]));
+	}
+
+      } else {
+	// two byte character
+	output.push_back (converter.convert(((unsigned short)mapbuf[0] << 8) |
+					    (unsigned short)mapbuf[1]));
+      }
+
+      mapbuflen = 0;
+      charlen = 0;
+    }
+  }
+
+  start = (char *)here; // save current position
+
+  if (mapbuflen == 0) status = finished;
+  else status = stopped;
+}
+
+
+
+mapoutconvertclass::mapoutconvertclass () {
+  multibyte = 0;
+  mapbuflen=0; 
+  mapbufhere=0;
+}
+
+void mapoutconvertclass::reset () {
+  input = NULL;
+  outs = NULL;
+  mapbuflen = 0;
+  mapbufhere = 0;
+}
+
+// note that convert does not null-terminate the
+// output array of characters
+void mapoutconvertclass::convert (char *output, size_t maxlen, 
+				 size_t &len, status_t &status) {
+  unsigned short outc;
+
+  if (input == NULL || output == NULL) {
+    if (mapbuflen == 0) status = finished;
+    else status = unfinished;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *uoutput = (unsigned char *)output;
+  text_t::iterator textend = input->end();
+  len = 0;
+  while (len < maxlen) {
+    // empty the contents of the internal buffer
+    if (mapbuflen > 0) {
+      while (len < maxlen && mapbufhere < mapbuflen) {
+	*uoutput = mapbuf[mapbufhere];
+	uoutput++;
+	len++;
+	mapbufhere++;
+      }
+
+      if (mapbufhere == mapbuflen) {
+	mapbufhere = 0;
+	mapbuflen = 0;
+      }
+    }
+
+    // fill up the buffer with the next character
+    if (mapbuflen == 0) {
+      if (texthere == textend) break; // finished!
+      if (!rzws || (*texthere != 0x200b)) {
+	if (*texthere < 0x80) {
+	  mapbuf[0] = (unsigned char)*texthere;
+	  mapbuflen = 1;
+	} else {
+	  outc = converter.convert (*texthere);
+	  if (multibyte) {
+	    mapbuf[0] = (unsigned char)(outc >> 8);
+	    mapbuf[1] = (unsigned char)(outc & 0xff);
+	    mapbuflen = 2;
+	  } else {
+	    mapbuf[0] = outc;
+	    mapbuflen = 1;
+	  }
+	}
+      }
+
+      texthere++;
+      mapbufhere = 0;
+    }
+  }
+  
+  if (texthere == textend && mapbuflen == 0) status = finished;
+  else status = unfinished;
+}
+
+
+bool simplemapconvert::loadmapfile (bool in) {
+  if (loaded) return true;
+  if (mapfile.empty()) return false;
+
+  char *cfilename = mapfile.getcstr();
+#ifdef GSDL_USE_IOS_H
+  ifstream mapfilein (cfilename, ios::in | ios::nocreate);
+#else
+  ifstream mapfilein (cfilename, ios::in);
+#endif
+  delete cfilename;
+  if (!mapfilein) return false;
+
+  char cline[2048];
+  text_t line;
+
+  while (!mapfilein.eof()) {
+    mapfilein.getline (cline, 2048);
+    line.clear();
+    line.appendcstr (cline);
+    if (line.empty()) continue;
+    // remove comments
+    text_t::iterator end = line.end();
+    text_t::iterator here = findchar (line.begin(), end, '#');
+    if (here != end) {
+      line.erase (here, end);
+      if (line.empty()) continue;
+    }
+    
+    text_tarray parts;
+    splitchar (line.begin(), line.end(), '\t', parts);
+    
+    // do some simple sanity checks
+    if (parts.size() < 2) continue;
+    text_t::iterator begin1 = parts[0].begin();
+    text_t::iterator begin2 = parts[1].begin();
+    if (*begin1 != '0' || *(begin1+1) != 'x') continue;
+    if (*begin2 != '0' || *(begin2+1) != 'x') continue;
+    char *from = parts[0].getcstr();
+    char *to = parts[1].getcstr();
+    unsigned int f = 0, t = 0;
+    sscanf (from, "%i", &f);
+    sscanf (to, "%i", &t);
+    delete from;
+    delete to;
+    
+    if (in) mapping[(unsigned short)f] = (unsigned short)t;
+    else mapping[(unsigned short)t] = (unsigned short)f;
+  }
+
+  loaded = true;
+  return true;
+}
+
+unsigned short simplemapconvert::convert (unsigned short c, bool in) {
+
+  if (!loaded) 
+    if (!loadmapfile(in)) return absentc;
+  
+  return mapping[c];
+}
+
+
+void simplemapinconvertclass::convert (text_t &output, status_t &status) {
+  output.clear();
+  
+  if (start == NULL || len == 0) {
+    status = finished;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *here = (unsigned char *)start;
+  while (len > 0) {
+
+    if (*here < 0x80)
+      output.push_back (*here); // append this character
+    else 
+      output.push_back (converter.convert(*here, true));
+
+    ++here;
+    --len;
+  }
+
+  start = (char *)here; // save current position
+  status = finished;
+}
+
+
+void simplemapoutconvertclass::convert (char *output, size_t maxlen, 
+					size_t &len, status_t &status) {
+
+  if (input == NULL || output == NULL) {
+    status = finished;
+    return;
+  }
+
+  // don't want any funny sign conversions happening
+  unsigned char *uoutput = (unsigned char *)output;
+  text_t::iterator textend = input->end();
+  len = 0;
+  while ((len < maxlen) && (texthere != textend)) {
+
+    if (*texthere < 0x80) *uoutput = (unsigned char)(*texthere);
+    else *uoutput = converter.convert (*texthere, false);
+
+    ++uoutput;
+    ++len;
+    ++texthere;
+  }
+  
+  if (texthere == textend) status = finished;
+  else status = unfinished;
+}
Index: /main/tags/2.38/gsdl/lib/gsdlunicode.h
===================================================================
--- /main/tags/2.38/gsdl/lib/gsdlunicode.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/gsdlunicode.h	(revision 21083)
@@ -0,0 +1,272 @@
+/**********************************************************************
+ *
+ * gsdlunicode.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef GSDLUNICODE_H
+#define GSDLUNICODE_H
+
+#include "text_t.h"
+
+
+// converts a unicode encode text_t string to a utf-8
+// encoded text_t string
+text_t to_utf8 (text_t::const_iterator here, text_t::const_iterator end);
+inline text_t to_utf8 (const text_t &in) {return to_utf8 (in.begin(), in.end());}
+
+// converts a utf-8 encoded text_t string to a unicode
+// encoded text_t string
+text_t to_uni (const text_t &in);
+
+
+
+#define MAXUTF8CHARLEN 3
+
+// convert from a utf-8 char stream to the text_t class
+class utf8inconvertclass : public inconvertclass {
+public:
+  utf8inconvertclass();
+  void reset ();
+  void convert (text_t &output, status_t &status);
+
+protected:
+  // buffer to hold unconverted characters in a stream
+  unsigned char utf8buf[MAXUTF8CHARLEN];
+  size_t utf8buflen;
+
+  // returns the length that the current contents of the 
+  // utf8buf should be
+  size_t getutf8charlen ();
+};
+
+
+// This class provides the option of removing zero width
+// spaces (U+200B) during the output. By default this
+// option is turned off. The functionality is actually
+// implemented by the sub-classes, this class just provides
+// the framework for these classes. 
+//
+// Note: by convention reset() should not reset the rzws flag.
+class rzwsoutconvertclass : public outconvertclass {
+public:
+  rzwsoutconvertclass () {rzws = 0;};
+  void set_rzws (int new_rzws) {rzws = new_rzws;};
+
+protected:
+  int rzws;
+};
+
+
+// Convert from a text_t class to a utf-8 char stream
+class utf8outconvertclass : public rzwsoutconvertclass {
+public:
+  utf8outconvertclass () {utf8buflen=0; utf8bufhere=0;};
+  void reset ();
+  // note that convert does not null-terminate the
+  // output array of characters
+  void convert (char *output, size_t maxlen, 
+		size_t &len, status_t &status);
+
+protected:
+  unsigned char utf8buf[MAXUTF8CHARLEN];
+  size_t utf8buflen;
+  size_t utf8bufhere;
+};
+
+
+// mapdata_t is used by mapconvert to hold the map file data
+class mapdata_t {
+public:
+  mapdata_t();
+  bool loaded;
+  unsigned short *ptrs[256];
+};
+
+// mapconvert is used in situations where conversion is best
+// done using a map file. The mapfile should reside in 
+// gsdlhome/unicode.
+class mapconvert {
+public:
+  mapconvert ();
+  ~mapconvert () {unloadmapfile();};
+
+  // setmapfile will cause loadmapfile to be called when conversion is
+  // needed
+  bool setmapfile (const text_t &themapfile, unsigned short theabsentc);
+
+  // loadmapfile should be called before any conversion is done
+  bool loadmapfile (const text_t &themapfile, unsigned short theabsentc);
+  void unloadmapfile ();
+
+  unsigned short convert (unsigned short c);
+
+  // note that this version of convert has different semantics to
+  // the convertclass version.
+  text_t convert (const text_t &instr);
+
+protected:
+  text_t mapfile;
+  unsigned short absentc;
+  mapdata_t mapdata;
+};
+
+
+
+#define MAXMAPCHARLEN 2
+
+// convert from a gb char stream to the unicode text_t class
+class mapinconvertclass : public inconvertclass {
+public:
+  mapinconvertclass();
+  virtual ~mapinconvertclass() {};
+
+  // setmapfile will cause loadmapfile to be called when conversion is needed
+  bool setmapfile (const text_t &themapfile, unsigned short theabsentc) {
+    return converter.setmapfile (themapfile, theabsentc);
+  };
+
+  // loadmapfile should be called before any conversion takes
+  // place
+  bool loadmapfile (const text_t &themapfile, unsigned short theabsentc) {
+    return converter.loadmapfile (themapfile, theabsentc);
+  };
+
+  void set_multibyte (int new_multibyte) {multibyte = new_multibyte;};
+
+  void reset ();
+  void convert (text_t &output, status_t &status);
+
+protected:
+  // buffer to hold unconverted characters in a stream
+  unsigned char mapbuf[MAXMAPCHARLEN];
+  size_t mapbuflen;
+  int multibyte;
+
+  // note: multiple instances of mapinconvert class are expensive
+  // as each will have its own copy of the map file data. This
+  // could be reduced by making map2unimap static, but then it
+  // wouldn't be thread safe.
+  mapconvert converter;
+
+  // returns the length that the current contents of the 
+  // mapbuf should be
+  inline size_t getmapcharlen () {
+    if (mapbuflen == 0) return 0;
+    if (mapbuf[0] < 0x80) return 1;
+    if (!multibyte) return 1;
+    return 2;
+  }
+};
+
+
+// Convert from a text_t class to a map char stream
+class mapoutconvertclass : public rzwsoutconvertclass {
+public:
+  mapoutconvertclass ();
+  virtual ~mapoutconvertclass() {};
+
+  // setmapfile will cause loadmapfile to be called when conversion is needed
+  bool setmapfile (const text_t &themapfile, unsigned short theabsentc) {
+    return converter.setmapfile (themapfile, theabsentc);
+  };
+
+  // loadmapfile should be called before any conversion takes
+  // place
+  bool loadmapfile (const text_t &themapfile, unsigned short theabsentc) {
+    return converter.loadmapfile (themapfile, theabsentc);
+  };
+
+  void set_multibyte (int new_multibyte) {multibyte = new_multibyte;};
+
+  void reset ();
+  void convert (char *output, size_t maxlen, 
+		size_t &len, status_t &status);
+
+protected:
+  unsigned char mapbuf[MAXMAPCHARLEN];
+  size_t mapbuflen;
+  size_t mapbufhere;
+  int multibyte;
+
+  mapconvert converter;
+};
+
+
+// Simple input and output converter classes for use with 8 bit encodings
+// using simple textual map files. Map files should contain (at least) two
+// tab-separated fields. The first field is the mapped value and the second
+// field is the unicode value.
+
+struct ltus_t 
+{
+  bool operator()(const unsigned short &t1, const unsigned short &t2) const
+  { return t1 < t2; }
+};
+
+
+class simplemapconvert {
+public:
+  simplemapconvert () {absentc=0; loaded=false;}
+  unsigned short convert (unsigned short c, bool in);
+  void setmapfile (const text_t &themapfile) {mapfile = themapfile;}
+
+protected:
+  bool loadmapfile (bool in);
+
+  map <unsigned short, unsigned short, ltus_t> mapping;
+  bool loaded;
+  text_t mapfile;
+  unsigned short absentc;
+};
+
+
+class simplemapinconvertclass : public inconvertclass {
+public:
+  virtual ~simplemapinconvertclass () {}
+
+  void convert (text_t &output, status_t &status);
+
+  void setmapfile (const text_t &themapfile) {converter.setmapfile(themapfile);}
+  
+protected:
+  simplemapconvert converter;
+};
+
+class simplemapoutconvertclass : public rzwsoutconvertclass {
+public:
+  virtual ~simplemapoutconvertclass () {}
+
+  void convert (char *output, size_t maxlen, 
+		size_t &len, status_t &status);
+
+  void setmapfile (const text_t &themapfile) {converter.setmapfile(themapfile);}
+  
+protected:
+  simplemapconvert converter;
+};
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/lib/text_t.cpp
===================================================================
--- /main/tags/2.38/gsdl/lib/text_t.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/text_t.cpp	(revision 21083)
@@ -0,0 +1,892 @@
+/**********************************************************************
+ *
+ * text_t.cpp -- a simple 16-bit character string class
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+/*
+   $Log$
+   Revision 1.21  2001/06/01 02:51:28  sjboddie
+   Changes to get phind working under windows
+
+   Revision 1.20  2001/01/25 18:26:44  cs025
+   Included CORBA branch for first time
+
+   Revision 1.15.2.2  2000/04/05 10:19:38  syeates
+   added automatic conversion to allow text_t's to be <<'ed to ostreams
+
+   Revision 1.15.2.1  2000/04/04 15:02:29  cs025
+   Corba first commit
+
+   Revision 1.15  1999/10/14 22:52:39  sjboddie
+   joinchar can join using text_t string now too
+
+   Revision 1.14  1999/09/24 02:30:03  rjmcnab
+   added function has_unicode_letdig
+
+   Revision 1.13  1999/09/07 04:57:43  sjboddie
+   added gpl notice
+
+   Revision 1.12  1999/08/31 08:04:41  rjmcnab
+   Fixed a small but hard to find bug in getcarr
+
+   Revision 1.11  1999/07/01 04:05:09  rjmcnab
+   Optimised append functions slightly and added a reserve function.
+
+   Revision 1.10  1999/04/26 03:58:03  sjboddie
+   added is_number function
+
+   Revision 1.9  1999/04/06 22:17:24  rjmcnab
+   Added splits and joins using text_tset.
+
+   Revision 1.8  1999/02/28 23:14:41  rjmcnab
+
+   Added uc and lc to convert to uppercase and lowercase.
+
+   Revision 1.7  1999/02/21 22:26:39  rjmcnab
+
+   Made getint() a constant function.
+
+   Revision 1.6  1999/02/03 01:13:26  sjboddie
+
+   Got interface to handle subcollections and language subcollections -
+   committed changes made to some of the collections
+
+   Revision 1.5  1999/01/19 01:38:14  rjmcnab
+
+   Made the source more portable.
+
+   Revision 1.4  1999/01/12 01:51:00  rjmcnab
+
+   Standard header.
+
+   Revision 1.3  1999/01/08 02:33:16  rjmcnab
+
+   Added standard header to source files.
+
+ */
+
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\algorithm>
+#elif defined(GSDL_USE_STL_H)
+#  if defined(GSDL_USE_ALGO_H)
+#    include <algo.h>
+#  else
+#    include <algorithm.h>
+#  endif
+#else
+#  include <algorithm>
+#endif
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include "WIN32cfg.h"
+# else
+#  include "config.h"
+# endif
+#endif
+
+
+#include "unitool.h"
+
+////////////////////////////////////
+// text_t methods
+////////////////////////////////////
+
+// new stream converter ...
+ostream& operator<< (ostream &o, const text_t text)
+{
+  text_t::const_iterator ithere = text.begin();
+  text_t::const_iterator itend = text.end();
+
+  while (ithere != itend)
+    {
+      if (*ithere < 256)
+	{
+	  o << (unsigned char)(*ithere);
+	}
+      else 
+	{
+	// put a space or a question mark depending on what
+	// the character is. Question marks tell the user that
+	// they are missing some information.
+	if (is_unicode_space (*ithere)) 
+	  o << ' ';
+	else 
+	  o << '?';
+      }
+      ithere++;
+    }
+
+  return o;
+}
+
+text_t::text_t () 
+{
+  setencoding(0);
+  clear ();
+}
+
+text_t::text_t (int i) 
+{
+  setencoding(0);
+  clear ();
+  appendint (i);
+}
+
+text_t::text_t (char *s) 
+{ 
+  setencoding(0);
+  clear ();
+  appendcstr (s);
+}
+
+
+void text_t::append (const text_t &t) 
+{
+  text.insert(text.end(), t.begin(), t.end());
+  //  const_iterator here, end=t.end();
+  //  for (here=t.begin(); here!=end;here++)
+  //    {
+  //      text.push_back(*here);
+  //    }
+}
+
+void text_t::appendrange (iterator first, iterator last) 
+{
+  text.insert(text.end(), first, last);
+  //  while (first != last) 
+  //  {
+  //    text.push_back (*first);
+  //    first++;
+  //  }
+}
+
+void text_t::appendrange (const_iterator first, const_iterator last) 
+{
+  text.insert(text.end(), first, last);
+  //  while (first != last) 
+  //  {
+  //    text.push_back (*first);
+  //    first++;
+  //  }
+}
+
+void text_t::appendint (int i)
+{
+  // deal with zeros and negatives
+  if (i == 0) 
+    {
+      text.push_back('0');
+      return;
+    }
+  else if (i < 0)
+    {
+      text.push_back('-');
+      i *= -1;
+    }
+
+  // get a buffer for the conversion
+  int maxbuflen = sizeof(int)*3;
+  char *buf = new char[maxbuflen];
+  int len = 0;
+  
+  // get the number in reverse
+  while (i > 0)
+    {
+      buf[len++] = '0'+ (i%10);
+      i = i/10;
+    }
+
+  // reverse the number
+  while (len > 0)
+    {
+      text.push_back(buf[--len]);
+    }
+
+  delete buf;
+}
+
+int text_t::getint () const
+{
+  int i = 0;
+  int mult = 1; // become -1 for negative numbers
+
+  const_iterator here = text.begin();
+  const_iterator end = text.end();
+  
+  // do plus and minus signs
+  if (here != end)
+    {
+      if (*here == '-')
+	{
+	  mult = -1;
+	  here++;
+	}
+      else if (*here == '+')
+	{
+	  mult = 1;
+	  here++;
+	}
+    }
+
+  // deal with the number
+  while ((here != end) && (*here >= '0') && (*here <= '9'))
+    {
+      i = 10*i + (*here - '0');
+      here++;
+    }
+
+  i *= mult;
+  return i;
+}
+
+unsigned long text_t::getulong () const
+{
+  unsigned long i = 0;
+
+  const_iterator here = text.begin();
+  const_iterator end = text.end();
+
+  while ((here != end) && (*here >= '0') && (*here <= '9'))
+    {
+      i = 10*i + (*here - '0');
+      here++;
+    }
+
+  return i;
+}
+
+void text_t::appendcarr (char *s, size_type len)
+{
+  unsigned char *us = (unsigned char *)s;
+  while (len > 0) 
+    {
+      text.push_back (*us); // append this character
+      us++;
+      len--;
+    }
+}
+
+void text_t::appendcstr (char *s) 
+{
+  unsigned char *us = (unsigned char *)s;
+  while (*us != '\0') 
+    {
+      text.push_back (*us); // append this character
+      us++;
+    }
+}
+
+
+// strings returned from getcarr and getcstr become the callers 
+// responsibility and should be deallocated with "delete"
+
+char *text_t::getcarr(size_type &len) const
+{
+  unsigned char *cstr = new unsigned char[size()];
+  len = 0;
+
+  const_iterator ithere = begin();
+  const_iterator itend = end();
+  while (ithere != itend)
+    {
+      if (*ithere < 256) cstr[len] = (unsigned char)(*ithere);
+      else {
+	// put a space or a question mark depending on what
+	// the character is. Question marks tell the user that
+	// they are missing some information.
+	if (is_unicode_space (*ithere)) cstr[len] = ' ';
+	else cstr[len] = '?';
+      }
+      len++;
+      ithere++;
+    }
+
+  return (char *)cstr;
+}
+
+char *text_t::getcstr() const
+{
+  unsigned char *cstr = new unsigned char[size() + 1];
+  const_iterator ithere = begin();
+  const_iterator itend = end();
+  int len = 0;
+
+  while (ithere != itend)
+    {
+      if (*ithere < 256) cstr[len] = (unsigned char)(*ithere);
+      else {
+	// put a space or a question mark depending on what
+	// the character is. Question marks tell the user that
+	// they are missing some information.
+	if (is_unicode_space (*ithere)) cstr[len] = ' ';
+	else cstr[len] = '?';
+      }
+      len++;
+      ithere++;
+    }
+
+  cstr[len] = '\0';
+
+  return (char *)cstr;
+}
+
+
+// general functions which work on text_ts
+
+// find a character within a range
+text_t::const_iterator findchar (text_t::const_iterator first, text_t::const_iterator last, 
+				 unsigned short c)
+{
+  while (first != last)
+    {
+      if (*first == c) break;
+      first++;
+    }
+  return first;
+}
+
+text_t::iterator findchar (text_t::iterator first, text_t::iterator last, 
+			   unsigned short c)
+{
+  while (first != last)
+    {
+      if (*first == c) break;
+      first++;
+    }
+  return first;
+}
+
+text_t::iterator findword (text_t::iterator first, text_t::iterator last, 
+			   const text_t& word)
+{
+  text_t::const_iterator word_begin = word.begin();
+  text_t::const_iterator word_end = word.end();
+
+  while (first != last)
+    {
+      text_t::iterator char_match = first;
+      text_t::const_iterator word_here = word_begin;
+      while (word_here!=word_end)
+	{
+	  if (*char_match != *word_here)
+	    {
+	      break;
+	    }
+	  char_match++;
+	  word_here++;
+	}
+      if (word_here==word_end)
+	{
+	  return first;
+	}
+      first++;
+    }
+  return last; // get to here only if there is no match
+}
+
+// get a string up to the next delimiter (which is skipped)
+text_t::const_iterator getdelimitstr (text_t::const_iterator first, 
+				      text_t::const_iterator last,
+				      unsigned short c, text_t &outstr)
+{
+  text_t::const_iterator here = first;
+  here = findchar (first, last, c);
+  outstr.clear();
+  outstr.appendrange (first, here);
+  if (here != last) here++; // skip c
+  return here;
+}
+
+text_t::iterator getdelimitstr (text_t::iterator first, text_t::iterator last,
+				unsigned short c, text_t &outstr)
+{
+  text_t::iterator here = first;
+  here = findchar (first, last, c);
+  outstr.clear();
+  outstr.appendrange (first, here);
+  if (here != last) here++; // skip c
+  return here;
+}
+
+// split a string with a character
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tset &outlist)
+{
+  outlist.erase(outlist.begin(), outlist.end());
+
+  text_t t;
+
+  while (first != last)
+    {
+      first = getdelimitstr (first, last, c, t);
+      outlist.insert (t);
+    }
+}
+
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tlist &outlist)
+{
+  outlist.erase(outlist.begin(), outlist.end());
+
+  text_t t;
+
+  while (first != last)
+    {
+      first = getdelimitstr (first, last, c, t);
+      outlist.push_back (t);
+    }
+}
+
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tarray &outlist)
+{
+  outlist.erase(outlist.begin(), outlist.end());
+
+  text_t t;
+
+  while (first != last)
+    {
+      first = getdelimitstr (first, last, c, t);
+      outlist.push_back (t);
+    }
+}
+
+// join a string using a character
+void joinchar (const text_tset &inlist, unsigned short c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tset::const_iterator here = inlist.begin ();
+  text_tset::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext.push_back (c);
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+void joinchar (const text_tlist &inlist, unsigned short c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tlist::const_iterator here = inlist.begin ();
+  text_tlist::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext.push_back (c);
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+void joinchar (const text_tarray &inlist, unsigned short c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tarray::const_iterator here = inlist.begin ();
+  text_tarray::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext.push_back (c);
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+void joinchar (const text_tlist &inlist, text_t c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tlist::const_iterator here = inlist.begin ();
+  text_tlist::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext += c;
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+void joinchar (const text_tset &inlist, text_t c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tset::const_iterator here = inlist.begin ();
+  text_tset::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext += c;
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+void joinchar (const text_tarray &inlist, text_t c, text_t &outtext)
+{
+  outtext.clear ();
+
+  text_tarray::const_iterator here = inlist.begin ();
+  text_tarray::const_iterator end = inlist.end ();
+  bool first = true;
+  while (here != end)
+    {
+      if (!first) outtext += c;
+      first = false;
+      outtext += *here;
+      here++;
+    }
+}
+
+// count the occurances of a character within a range
+int countchar (text_t::const_iterator first, text_t::const_iterator last,
+	       unsigned short c)
+{
+  int count = 0;
+  while (first != last) {
+    if (*first == c) count ++;
+    first ++;
+  }
+  return count;
+}
+
+// return a substring of string from first up to but not including last
+text_t substr (text_t::const_iterator first, text_t::const_iterator last) {
+
+  text_t substr;
+  while (first != last) {
+    substr.push_back(*first);
+    first ++;
+  }
+  return substr;
+}
+
+
+// convert to lowercase
+void lc (text_t::iterator first, text_t::iterator last) {
+  while (first != last) {
+    *first = unicode_tolower(*first);
+    first++;
+  }
+}
+
+// convert to uppercase
+void uc (text_t::iterator first, text_t::iterator last) {
+  while (first != last) {
+    *first = unicode_toupper(*first);
+    first++;
+  }
+}
+
+
+// checks to see if it is a number (i.e. contains only 0-9)
+bool is_number (const text_t &text) {
+
+  text_t::const_iterator here = text.begin();
+  text_t::const_iterator end = text.end();
+
+  while (here != end) {
+    if ((*here!='0') && (*here!='1') && (*here!='2') &&
+	(*here!='3') && (*here!='4') && (*here!='5') &&
+	(*here!='6') && (*here!='7') && (*here!='8') &&
+	(*here!='9')) return false;
+    here ++;
+  }
+  return true;
+}
+
+
+// checks to see if the text has any letters or digits
+bool has_unicode_letdig (const text_t &text) {
+  if (text.empty()) return false;
+  
+  text_t::const_iterator here = text.begin();
+  text_t::const_iterator end = text.end();
+  while (here != end) {
+    if (is_unicode_letdig (*here)) return true;
+    here++;
+  }
+
+  return false;
+}
+
+
+
+////////////////////////////////////
+// convertclass methods
+////////////////////////////////////
+
+// conversion classes used for getting information in to and out of
+// the text_t class.
+
+convertclass::convertclass () 
+{
+  // nothing to do
+}
+
+void convertclass::reset ()
+{
+  // nothing to do
+}
+
+
+////////////////////////////////////
+// inconvertclass methods
+////////////////////////////////////
+
+// convert from a char stream to the text_t class
+// the default version assumes the input is a ascii
+// character array
+
+inconvertclass::inconvertclass () 
+{
+  start = NULL;
+  len = 0;
+}
+
+
+void inconvertclass::reset ()
+{
+  start = NULL;
+  len = 0;
+}
+
+void inconvertclass::setinput (char *thestart, size_t thelen)
+{
+  start = thestart;
+  len = thelen;
+}
+
+void inconvertclass::convert (text_t &output, status_t &status)
+{
+  output.clear();
+
+  if (start == NULL || len == 0)
+    {
+      status = finished;
+      return;
+    }
+
+  // don't want any funny sign conversions happening
+  unsigned char *here = (unsigned char *)start;
+  while (len > 0) 
+    {
+      output.push_back (*here); // append this character
+      ++here;
+      --len;
+    }
+
+  start = (char *)here; // save current position
+  status = finished;
+}
+
+// will treat the text_t as a 8-bit string and convert
+// it to a 16-bit string using the about convert method.
+text_t inconvertclass::convert (const text_t &t) {
+  text_t out;
+  text_t tmpout;
+  status_t status;
+  text_t::const_iterator here = t.begin();
+  text_t::const_iterator end = t.end();
+  unsigned char cbuf[256];
+  size_t cbuflen = 0;
+ 
+  while (here != end) {
+    while (here != end && cbuflen < 256) {
+      cbuf[cbuflen++] = (unsigned char)(*here & 0xff);
+      here++;
+    }
+
+    if (cbuflen > 0) {
+      setinput ((char *)cbuf, cbuflen);
+      status = unfinished;
+      while (status == unfinished) {
+	convert (tmpout, status);
+	out += tmpout;
+      }
+      cbuflen = 0;
+    }
+  }
+
+  out.setencoding (0); // unicode
+
+  return out;
+}
+
+// an instance of the default inconvertclass to do simple
+// conversions. Note that any functions that use this are
+// not reentrant. If a function needs to be reentrant it
+// should declare its own instance.
+inconvertclass ascii2text_t;
+
+
+////////////////////////////////////
+// outconvertclass methods
+////////////////////////////////////
+
+// Convert from a text_t class to a char stream
+// This default version assumes the output is a ascii
+// character array. If you set the output stream you
+// can use this class to output to a stream using the
+// << operator. The << operator can also be conveniently
+// used to set the output stream by doing something like
+//
+// cout << text_t2ascii << text_tstr << anothertext_tstr;
+//
+outconvertclass::outconvertclass ()
+{
+  input = NULL;
+  outs = NULL;
+}
+
+void outconvertclass::reset ()
+{
+  input = NULL;
+  outs = NULL;
+}
+
+void outconvertclass::setinput (text_t *theinput)
+{
+  input = theinput;
+  if (input != NULL) texthere = input->begin();
+}
+
+void outconvertclass::convert (char *output, size_t maxlen, 
+		      size_t &len, status_t &status)
+{
+  if (input == NULL || output == NULL)
+    {
+      status = finished;
+      return;
+    }
+
+  // don't want any funny sign conversions happening
+  unsigned char *uoutput = (unsigned char *)output;
+  text_t::iterator textend = input->end();
+  len = 0;
+  while ((len < maxlen) && (texthere != textend)) 
+    {
+      if (*texthere < 256) *uoutput = (unsigned char)(*texthere);
+      else {
+	// put a space or a question mark depending on what
+	// the character is. Question marks tell the user that
+	// they are missing some information.
+	if (is_unicode_space (*texthere)) *uoutput = ' ';
+	else *uoutput = '?';
+      }
+      ++uoutput;
+      ++len;
+      ++texthere;
+    }
+  
+  if (texthere == textend) status = finished;
+  else status = unfinished;
+}
+
+// will convert the 16-bit string to a 8-bit stream
+// and place the result in a text_t. This method uses
+// the above convert function.
+text_t outconvertclass::convert (const text_t &t) {
+  text_t out;
+  unsigned char cbuf[256];
+  size_t cbuflen = 0;
+  status_t status = unfinished;
+
+  setinput ((text_t *)&t); // discard constant
+  while (status == unfinished) {
+    convert ((char *)cbuf, 256, cbuflen, status);
+    out.appendcarr ((char *)cbuf, cbuflen);
+  }
+
+  out.setencoding (1); // other encoding
+  
+  return out;
+}
+
+
+void outconvertclass::setostream (ostream *theouts)
+{
+  outs = theouts;
+}
+
+ostream *outconvertclass::getostream ()
+{
+  return outs;
+}
+
+
+
+
+// an instance of the default outconvertclass to do simple
+// conversions
+outconvertclass text_t2ascii;
+
+
+
+// stream operators for the output class
+
+outconvertclass &operator<< (ostream &theouts, outconvertclass &outconverter)
+{
+  outconverter.setostream(&theouts);
+  return outconverter;
+}
+
+
+#define STREAMBUFSIZE 256
+outconvertclass &operator<< (outconvertclass &outconverter, const text_t &t)
+{
+  ostream *outstream = outconverter.getostream();
+
+  if (outstream == NULL) return outconverter;
+
+  char outbuf[STREAMBUFSIZE];
+  size_t len;
+  outconvertclass::status_t status = outconvertclass::unfinished;
+
+  // assume that there is no data needing converting
+  // left in the converter
+  outconverter.setinput ((text_t *)(&t)); // note the const -> nonconst conversion
+
+  while (status == outconvertclass::unfinished)
+    {
+      outconverter.convert (outbuf, STREAMBUFSIZE, len, status);
+      if (len > 0) outstream->write(outbuf, len);
+    }
+
+  return outconverter;
+}
Index: /main/tags/2.38/gsdl/lib/text_t.h
===================================================================
--- /main/tags/2.38/gsdl/lib/text_t.h	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/text_t.h	(revision 21083)
@@ -0,0 +1,372 @@
+/**********************************************************************
+ *
+ * text_t.h -- a simple 16-bit character string class
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef TEXT_T_H
+#define TEXT_T_H
+
+#include "gsdlconf.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#  include <ospace\std\list>
+#  include <ospace\std\set>
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#  include <list.h>
+#  include <set.h>
+#  include <map.h>
+#else
+#  include <vector>
+#  include <list>
+#  include <set>
+#  include <map>
+#endif
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+// class prototypes
+class inconvertclass;
+class outconvertclass;
+
+
+// for those stupid compilers which need it
+#if defined(GSDL_NEED_DESTROY_USHORT)
+inline void destroy(unsigned short *) {};
+inline void destroy(int *) {};
+#endif
+
+typedef vector<unsigned short> usvector;
+
+// The class text_t can handle long strings which may contain
+// null characters. It uses unsigned shorts to represent up to
+// 64K character values.
+class text_t {
+  public:
+  //type support for ucvector
+  typedef usvector::iterator iterator;
+  typedef usvector::const_iterator const_iterator;
+  typedef usvector::reference reference;
+  typedef usvector::const_reference const_reference;
+  typedef usvector::size_type size_type;
+  typedef usvector::difference_type difference_type;
+  typedef usvector::const_reverse_iterator const_reverse_iterator;
+  typedef usvector::reverse_iterator reverse_iterator;
+  
+protected:
+  usvector text;
+  unsigned short encoding; // 0 = unicode, 1 = other
+  
+public:
+  // constructors
+  text_t ();
+  text_t (int i);
+  text_t (char *s); // assumed to be a normal c string
+
+  void setencoding (unsigned short theencoding) {encoding=theencoding;};
+  unsigned short getencoding () {return encoding;};
+
+  usvector& text_as_usvector() { return text ; };
+  const usvector& text_as_usvector() const { return text ; };
+
+  // basic container support
+  iterator begin () {return text.begin();}
+  const_iterator begin () const {return text.begin();}
+  iterator end () {return text.end();}
+  const_iterator end () const {return text.end();}
+
+  void erase(iterator pos) {text.erase(pos);}
+  void erase(iterator first, iterator last) {text.erase(first, last);}
+  void push_back(unsigned short c) {text.push_back(c);}
+  void pop_back() {text.pop_back();}
+  text_t &operator=(const text_t &x) {text=x.text; encoding=x.encoding; return *this;}
+  reference operator[](size_type n) {return text[n];};
+  const_reference operator[](size_type n) const {return text[n];};
+
+  void reserve (size_type n) {text.reserve(n);}
+  
+  bool empty () const {return text.empty();}
+  size_type size() const {return text.size();}
+  friend inline bool operator!=(const text_t& x, const text_t& y)
+	{return (x.text != y.text);}
+  friend inline bool operator==(const text_t& x, const text_t& y) 
+	{return (x.text == y.text);}
+  friend inline bool operator<(const text_t& x, const text_t& y) 
+	{return (x.text < y.text);}
+  friend inline bool operator>(const text_t& x, const text_t& y) 
+	{return (x.text > y.text);}
+  friend inline bool operator>=(const text_t& x, const text_t& y) 
+	{return (x.text >= y.text);}
+  friend inline bool operator<=(const text_t& x, const text_t& y) 
+	{return (x.text <= y.text);}
+  
+  // added functionality
+  void clear () {text.erase(text.begin(),text.end());}
+  void append (const text_t &t);
+  void appendrange (iterator first, iterator last);
+  void appendrange (const_iterator first, const_iterator last);
+  text_t &operator+= (const text_t &t) {append(t);return *this;}
+
+  // support for integers
+  void appendint (int i);
+  void setint (int i) {clear();appendint(i);}
+  text_t &operator=(int i) {setint (i);return *this;}
+  text_t &operator+= (int i) {appendint(i);return *this;}
+  int getint () const;
+
+  // same as getint but returns an unsigned long
+  unsigned long getulong () const;
+
+  // support for arrays of chars
+  void appendcarr (char *s, size_type len);
+  void setcarr (char *s, size_type len) {clear();appendcarr(s,len);}
+
+  // support for null-terminated C strings
+  void appendcstr (char *s);
+  void setcstr (char *s) {clear();appendcstr(s);}
+  text_t &operator= (char *s) {setcstr(s);return *this;} // c string
+  text_t &operator+= (char *s) {appendcstr(s);return *this;} // c string
+
+  // support for const null-terminated C string
+  void appendcstr (const char *s) {appendcstr((char *)s);}
+  void setcstr (const char *s) {clear();appendcstr((char *) s);}
+  text_t &operator= (const char *s) {setcstr((char *) s);return *this;} // c string
+  text_t &operator+= (const char *s) {appendcstr((char *) s);return *this;} // c string
+
+  // strings returned from getcarr and getcstr become the callers 
+  // responsibility and should be deallocated with "delete"
+  char *getcarr(size_type &len) const;
+  char *getcstr() const;
+
+};
+
+// new stream converter ...
+ostream& operator<< (ostream &o, const text_t text);
+
+inline text_t operator+(const text_t &t1, const text_t &t2)
+{
+  text_t tnew = t1;
+  tnew.append(t2);
+  return tnew;
+}
+
+inline text_t operator+(const text_t &t1, int i1)
+{
+  text_t tnew = t1;
+  tnew.appendint(i1);
+  return tnew;
+}
+
+inline text_t operator+(const text_t &t1, char *s1)
+{
+  text_t tnew = t1;
+  tnew.appendcstr(s1);
+  return tnew;
+}
+
+
+
+
+struct eqtext_t 
+{
+  bool operator()(const text_t &t1, const text_t &t2) const
+  { return t1 == t2; }
+};
+
+struct lttext_t 
+{
+  bool operator()(const text_t &t1, const text_t &t2) const
+  { return t1 < t2; }
+};
+
+
+// frequently used derived types
+typedef set<text_t,lttext_t> text_tset;
+typedef list<text_t> text_tlist;  // more efficient for insertions/deletions
+typedef vector<text_t> text_tarray; // more space efficient than text_tlist
+typedef map<text_t, text_t, lttext_t> text_tmap;
+
+
+// general functions which work on text_ts
+
+// find a character within a range
+text_t::const_iterator findchar (text_t::const_iterator first, text_t::const_iterator last, 
+				 unsigned short c);
+text_t::iterator findchar (text_t::iterator first, text_t::iterator last, 
+			   unsigned short c);
+
+text_t::iterator findword (text_t::iterator first, text_t::iterator last,
+			   const text_t &word);
+
+// get a string up to the next delimiter (which is skipped)
+text_t::const_iterator getdelimitstr (text_t::const_iterator first, 
+				      text_t::const_iterator last,
+				      unsigned short c, text_t &outstr);
+text_t::iterator getdelimitstr (text_t::iterator first, text_t::iterator last,
+				unsigned short c, text_t &outstr);
+
+// split a string with a character
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tset &outlist);
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tlist &outlist);
+void splitchar (text_t::const_iterator first, text_t::const_iterator last,
+		unsigned short c, text_tarray &outlist);
+
+// join a string using a character
+void joinchar (const text_tset &inlist, unsigned short c, text_t &outtext);
+void joinchar (const text_tlist &inlist, unsigned short c, text_t &outtext);
+void joinchar (const text_tarray &inlist, unsigned short c, text_t &outtext);
+void joinchar (const text_tset &inlist, text_t c, text_t &outtext);
+void joinchar (const text_tlist &inlist, text_t c, text_t &outtext);
+void joinchar (const text_tarray &inlist, text_t c, text_t &outtext);
+
+// count the occurances of a character within a range
+int countchar (text_t::const_iterator first, text_t::const_iterator last,
+	       unsigned short c);
+
+// return a substring of string from first up to but not including last
+text_t substr (text_t::const_iterator first, text_t::const_iterator last);
+
+// convert to lowercase
+void lc (text_t::iterator first, text_t::iterator last);
+inline void lc (text_t &t) {lc (t.begin(), t.end());}
+
+// convert to uppercase
+void uc (text_t::iterator first, text_t::iterator last);
+inline void uc (text_t &t) {uc (t.begin(), t.end());}
+
+// checks to see if it is a number (i.e. contains only 0-9)
+bool is_number (const text_t &text);
+
+// checks to see if the text has any letters or digits
+bool has_unicode_letdig (const text_t &text);
+
+
+// conversion classes used for getting information in to and out of
+// the text_t class.
+
+class convertclass 
+{
+public:
+  enum status_t {finished, stopped, unfinished};
+  
+  convertclass ();
+  virtual void reset ();
+};
+
+
+
+// convert from a char stream to the text_t class
+// the default version assumes the input is a ascii
+// character array
+class inconvertclass : public convertclass
+{
+public:
+  inconvertclass ();
+  void reset ();
+  void setinput (char *thestart, size_t thelen);
+
+  // output will be cleared before the conversion
+  virtual void convert (text_t &output, status_t &status);
+
+  // will treat the text_t as a 8-bit string and convert
+  // it to a 16-bit string using the about convert method.
+  text_t convert (const text_t &t);
+
+protected:
+  char *start;
+  size_t len;
+};
+
+// to get something which will do the conversion
+// to ascii declare a (non global!) instance like
+// this
+// inconvertclass ascii2text_t;
+
+#if defined(GSDL_USE_IOS_H)
+#include <iostream.h> // darwin doesn't have ostream.h...
+#else
+#include <ostream>
+#endif
+
+// Convert from a text_t class to a char stream
+// This default version assumes the output is a ascii
+// character array. If you set the output stream you
+// can use this class to output to a stream using the
+// << operator. The << operator can also be conveniently
+// used to set the output stream by doing something like
+//
+// cout << text_t2ascii << textstr << anothertextstr;
+//
+// this class assumes that the input text doesn't change
+// while the conversion takes place
+class outconvertclass : public convertclass
+{
+public:
+  outconvertclass ();
+  void reset ();
+  void setinput (text_t *theinput);
+  // note that convert does not null-terminate the
+  // output array of characters
+  virtual void convert (char *output, size_t maxlen, 
+			size_t &len, status_t &status);
+
+  // will convert the 16-bit string to a 8-bit stream
+  // and place the result in a text_t. This method uses
+  // the above convert function.
+  text_t convert (const text_t &t);
+
+  void setostream (ostream *theouts);
+  ostream *getostream ();
+
+protected:
+  text_t *input;
+  text_t::iterator texthere; // only valid if input is valid
+
+  ostream *outs;
+};
+
+// to get something which will do the conversion
+// to text_t declare a (non global!) instance like
+// this
+// outconvertclass text_t2ascii;
+
+
+// stream operators for the output class
+outconvertclass &operator<< (ostream &theouts, outconvertclass &outconverter);
+outconvertclass &operator<< (outconvertclass &outconverter, const text_t &t);
+
+#endif
Index: /main/tags/2.38/gsdl/lib/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/lib/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/lib/win32.mak	(revision 21083)
@@ -0,0 +1,83 @@
+###########################################################################
+#
+# win32 makefile -- lib
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..
+USE_STLPORT = 0
+LOCAL_LIBRARY = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = -GX
+
+DEFS = -D__WIN32__ -DHAVE_CONFIG_H -DPARADOCNUM -D_LITTLE_ENDIAN \
+       -DSHORT_SUFFIX
+INCLUDES = -I"$(GSDLHOME)" -I"$(GSDLHOME)\packages\mg\lib"
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+!IF $(LOCAL_LIBRARY)
+DEFS = $(DEFS) -DGSDL_LOCAL_LIBRARY
+!ENDIF
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $< 
+
+HEADERS = cfgread.h fileutil.h gsdlunicode.h text_t.h display.h gsdlconf.h \
+	  gsdltimes.h gsdltools.h cnfgable.h cnfgator.h
+
+SOURCES = cfgread.cpp fileutil.cpp gsdlunicode.cpp text_t.cpp display.cpp \
+	  gsdltimes.cpp gsdltools.cpp cnfgable.cpp cnfgator.cpp
+
+OBJECTS = cfgread.obj fileutil.obj gsdlunicode.obj text_t.obj display.obj \
+	  gsdltimes.obj gsdltools.obj cnfgable.obj cnfgator.obj
+
+all: gsdllib.lib
+
+gsdllib.lib : $(OBJECTS)
+	if EXIST gsdllib.lib del gsdllib.lib
+	$(AR) /out:gsdllib.lib $(OBJECTS)
+
+# we want gsdltools to always be compiled in case the status of
+# GSDL_LOCAL_LIBRARY has changed
+gsdltools.obj: FORCE
+
+clean:
+	del *.obj 
+	del gsdllib.lib
+
+install:
+
+FORCE:
Index: /main/tags/2.38/gsdl/macros/Chktrans.pl
===================================================================
--- /main/tags/2.38/gsdl/macros/Chktrans.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/Chktrans.pl	(revision 21083)
@@ -0,0 +1,145 @@
+#! /usr/bin/perl -w
+
+use strict;
+
+my @languages = ("chinese", "french", "german", "maori");
+
+print "
+Chktrans.pl
+
+This file checks english.dm and english2.dm against 
+translations made in other languages.  It outputs 
+ whether the translation exists in each language,
+ what macros override the English (default) macros
+ what macros have not been translated,
+ what additional macros exist.
+
+Current languages:
+";
+
+foreach my $l (@languages) {
+    print " $l\n";
+}
+
+print "\nReading english.dm\n";
+
+open(E, "<english.dm");
+
+my $line;
+my $count = 0;
+my %macro;
+
+while (<E>) {
+    chomp;
+    $line = $_;
+
+    next unless ($line =~ /^_\w+_ +\{/);
+    
+    $line =~ s/ +\{.*//;
+    $macro{$line} = 1;
+    $count++;
+}
+
+print "Read $count macros.\n\n";
+
+my $file;
+
+foreach my $l (@languages) {
+    $file = "$l.dm";
+
+    print "=============================================\nLanguage: $l\n";
+
+    # make sure thwere is a translation for the language
+    if (!-e "$file") {
+	print "$file doesn't exist\n\n";
+	next;
+    }
+    
+    # read the macros in this language
+    print "Reading $file\n";
+    open(L, "<$file");
+    my (%lm, %lmnew, %lr, %lrnew);
+    my $lc = 0;
+    while (<L>) {
+	chomp;
+	$line = $_;
+	
+	next unless ($line =~ /^_\w+_/);
+	next unless ($line =~ /\{/);
+	
+	$line =~ s/ +\{.*//;
+	# There are four types of macro, the combos of:
+	#  With or without macro country code
+	#  Present or not present in %macro
+	if ($line =~ /\[/) {
+	    $line =~ s/ .*//;
+	    if (defined($macro{$line})) {
+		$lm{$line} = $line;
+	    } else {
+		$lmnew{$line} = $line;
+	    }
+	} else {
+	    if (defined($macro{$line})) {
+		$lr{$line} = $line;
+	    } else {
+		$lrnew{$line} = $line;
+	    }
+	}
+	$lc++;
+    }
+    close L;
+    print "Read $lc macros.\n\n";
+
+    # How many macros operate correctly
+    print (scalar keys %lm);
+    print" macros are translated from english to $l\n\n";
+   
+    # What are the new macros?
+    if (scalar keys %lmnew) {
+	print (scalar keys %lmnew);
+	print" macros are new $l macros with no eqivalents in english.dm:\n";
+	foreach my $m (sort (keys (%lmnew))) {
+	    print "$m ";
+	}
+	print "\n\n";
+    }
+
+    # What are the new macros?
+    if (scalar keys %lrnew) {
+	print (scalar keys %lrnew);
+	print" macros are new macros in english that do not appear in english.dm:\n";
+	foreach my $m (sort (keys (%lrnew))) {
+	    print "$m ";
+	}
+	print "\n\n";
+    }
+
+    # Which languages override their english counterparts?
+    if (scalar keys %lr) {
+	print (scalar keys %lr);
+	print" macros override equivalents in english.dm ";
+	print"(It doesn't matter if you override macros like widths, heights, and URLs):\n";
+	foreach my $m (sort (keys (%lr))) {
+	    print "$m ";
+	}
+	print "\n\n";
+    }
+
+    # Which macros in english.dm do not appear in the newfile?
+    my @missing = ();
+    foreach my $m (sort (keys (%macro))) {
+	next if defined($lm{$m});
+	push @missing, $m;
+    }
+    if (scalar @missing) {
+	print (scalar @missing);
+	print " macros in english.dm have no entry in $l.dm:\n";
+	foreach my $m (sort @missing) {
+	    print "$m ";
+	}
+	print "\n\n";
+    }
+
+    print "\n";
+
+}
Index: /main/tags/2.38/gsdl/macros/about.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/about.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/about.dm	(revision 21083)
@@ -0,0 +1,38 @@
+package about
+
+#######################################################################
+# Icons
+#######################################################################
+
+_imagethispage_ {<img src="_httpiconhabout_" width=_widthhabout_ height=_heighthabout_>}
+
+# don't want link to 'about' page
+_imagecollection_ {_If_("_iconcollection_" ne "",
+	<img src="_iconcollection_" border=0>,<br><br><h2>_collectionname_</h2>)}
+_imagecollection_ [v=1] {<br><br><h2>_collectionname_</h2>}
+
+#######################################################################
+# about page content 
+#######################################################################
+
+_pagetitle_ {_collectionname_}
+
+_content_ {
+<center>
+_navigationbar_
+</center>
+_If_("_cgiargu_" ne "1",_query:queryform_
+<p>_iconblankbar_)
+_If_(_Global:collectionextra_,<p>_textabout_)
+_textsubcollections_
+<h3>_help:textsimplehelpheading_</h3>
+_help:simplehelp_
+}
+
+_textabout_ {
+<h3>_textabcol_</h3>
+_Global:collectionextra_
+}
+
+# set from within server
+_textsubcollections_ {}
Index: /main/tags/2.38/gsdl/macros/authen.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/authen.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/authen.dm	(revision 21083)
@@ -0,0 +1,64 @@
+package authen
+
+#######################################################################
+# page content                     
+#######################################################################
+
+_pagetitle_ {_textGSDLtitle_}
+_imagethispage_ {_imagegreenstone_}
+
+_content_ {
+<br><br><br><br>
+<form name="login" method="get" action="_gwcgi_">
+<input type=hidden name="e" value="_If_(_cgiarger_,_cgiarger_,_decodedcompressedoptions_)">
+_hiddenargs_
+<center><table width=_pagewidth_>
+<tr><td>
+_messagestatus_
+</td></tr>
+
+<tr><td>
+<table><tr><td>_textusername_</td>
+<td><input type="text" name="un" value="_cgiargun_" size=10></td>
+<td></td></tr>
+<tr><td>_textpassword_</td>
+<td><input type="password" name="pw" size=10></td>
+<td><input type="submit" value="_textsignin_"></td>
+</tr>
+</table>
+</td></tr>
+</table>
+</form>
+}
+
+
+_messageinvalid_ {_textmessageinvalid_}
+
+_messagefailed_ {_textmessagefailed_}
+
+_messageenabled_ {}
+
+_messagedisabled_ {_textmessagedisabled_}
+
+_messagepermissiondenied_ {_textmessagepermissiondenied_}
+
+_messagestalekey_ {_textmessagestalekey_}
+
+
+#################################
+# when authentication is accepted
+#################################
+
+package authenok
+
+
+#######################################################################
+# page content                     
+#######################################################################
+
+_pagetitle_ {_authen:textGSDLtitle_}
+_imagethispage_ {_imagegreenstone_}
+
+_content_ {
+_authen:messagestatus_
+}
Index: /main/tags/2.38/gsdl/macros/base.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/base.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/base.dm	(revision 21083)
@@ -0,0 +1,527 @@
+#######################################################################
+# GLOBAL MACROS 
+#######################################################################
+
+package Global
+
+##########
+
+# not sure exactly what this is used for but it seems it needs to default
+# to something 
+_optsite_ {}
+
+
+##########
+
+_htmlextra_ {}
+
+#_starthighlight_ {<b><u>}
+#_endhighlight_ {</u></b>}
+
+_starthighlight_ {<span style="background: #FFFF77">}
+_endhighlight_ {</span>}
+
+#######################################################################
+# page content
+#
+# these should always be overridden for each page/collection 
+#######################################################################
+
+_content_ {<p><h2>oops</h2>
+_textdefaultcontent_}
+_pagetitle_ {_textdefaulttitle_}
+_imagethispage_ {}
+_iconcollection_ {}
+_collectionname_ {}
+
+_imagecollection_ {_If_("_iconcollection_" ne "",
+<a href="_httppageabout_"><img src="_iconcollection_" border=0></a>,
+_imagecollectionv_}
+_imagecollection_ [v=1] {_imagecollectionv_}
+_imagecollectionv_ {_If_(_collectionname_,<br><br><h2><a href="_httppageabout_">_collectionname_</a></h2>)}
+
+#######################################################################
+# these width macros are read in by the server when calculating 
+# width of navigation bar etc. There should be one for each 
+# classification that this receptionist supports, one for the 
+# search button, and the _pagewidth_ macro which is the total width
+# of the page
+#######################################################################
+
+# width of tabs when displaying tables of contents
+_tabwidth_ {25}
+
+_pagewidth_ {537}
+# defaultwidth is the width buttons default to if not included in this list
+_defaultwidth_ {87}
+_searchwidth_ {_widthtsrchx_}
+_Titlewidth_ {_widthttitlx_}
+_Listwidth_ {_widthtlistx_}
+_Creatorwidth_ {_widthtauthx_}
+_Serieswidth_ {_widthtserx_}
+_Datewidth_ {_widthtdatex_}
+_Subjectwidth_ {_widthtsubjx_}
+_Towidth_ {_widthttox_}
+_Fromwidth_ {_widthtfromx_}
+_Organizationwidth_ {_widthtorgx_}
+_Howtowidth_ {_widththowx_}
+_Topicwidth_ {_widthttopicx_}
+_Browsewidth_ {_widthtbrwsex_}
+_Peoplewidth_ {_widthtpeopx_}
+_Languagewidth_ {_widthtlangx_}
+_Acronymwidth_ {_widthtacrox_}
+_Phrasewidth_ {_widthtphrsex_}
+_Artistwidth_ {_widthtartstx_}
+_Sourcewidth_ {_widthtsrcx_}
+_Keywordwidth_ {_widthtkwx_}
+
+#######################################################################
+# Macros whose values are set from within the server at runtime. These 
+# are here only for reference and to set default values if required.           
+#######################################################################
+
+# _win32_ will be set to 1 if we're on windows
+_win32_ {}
+
+_navigationbar_ {}
+_widthtspace_ {2}
+
+# all cgi args are set as _cgiargX_ macros - those I've put here 
+# are those that need to default to something
+_cgiargd_ {}
+_cgiargcl_ {}
+
+# set from within the query action
+_hselection_ {}
+_jselection_ {}
+_nselection_ {}
+#granularity selection for mgpp
+_gselection_ {}
+
+#######################################################################
+# flashy rollover image macro
+#
+#######################################################################
+
+# imagescript should always be included in html header if there are
+# flashy images on the page
+_imagescript_ {
+var loaded = new Array();
+function gbutton (image, onimage) \{
+  if (image && image.src && (image.out == null || typeof(image.out) == typeof(void(0)))) \{
+    s = image.src;
+    image.out = new Image();
+    image.out.src = s;
+    image.over = new Image();
+    image.over.src = onimage;
+    loaded[image.name] = image;
+  \}
+\}
+
+function roll (imagename, over) \{
+  if (document.images) \{
+    if (over) i = "over";
+    else i = "out";
+    image = loaded[imagename];
+    if (image) image.src = eval("image."+i+".src");
+  \}
+\}
+}
+
+# gsimage should be used to define an instance of a flashy image
+# parameters are:
+# 1. the url to go to when the button is clicked
+# 2. the url of the "off" image
+# 3. the url of the "on" image
+# 4. the name of the image (must be unique)
+# 5. image alt text
+_gsimage_ {<a href="_1_" onMouseover="roll('_4_',1);" onMouseOut="roll('_4_',0);"><img
+name="_4_" src="_2_" onLoad="gbutton(this,'_3_');" border=0 alt="_5_"></a>}
+
+_gsimage_ [v=1] {<a href="_1_">_5_</a><br>}
+
+#######################################################################
+# navigation bar images
+#
+#######################################################################
+
+# the spacer image - the width of this is set from server
+_imagespacer_ {<img 
+src="_httpicontspace_" width="_widthtspace_" height="_heighttspace_">}
+_imagespacer_[v=1] {<br>
+}
+
+# image macros for all the classifications currently supported by
+# this receptionist.
+
+_imagesearch_ {_If_("_cgiargu_" ne "1",_imagesearch2_,_iconnosearch_)}
+_imagesearch2_ {_gsimage_(_httpquery_,_httpicontsrchof_,_httpicontsrchon_,srch,_textimagesearch_)}
+_imageTitle_ {_gsimage_(_httpbrowseTitle_,_httpiconttitlof_,_httpiconttitlon_,titles,_textimageTitle_)}
+_imageCreator_ {_gsimage_(_httpbrowseCreator_,_httpicontauthof_,_httpicontauthon_,authors,_textimageCreator_)}
+_imageSeries_ {_gsimage_(_httpbrowseSeries_,_httpicontserof_,_httpicontseron_,series,_textimageSeries_)}
+_imageDate_ {_gsimage_(_httpbrowseDate_,_httpicontdateof_,_httpicontdateon_,dates,_textimageDate_)}
+_imageSubject_ {_gsimage_(_httpbrowseSubject_,_httpicontsubjof_,_httpicontsubjon_,subjects,_textimageSubject_)}
+_imageTo_ {_gsimage_(_httpbrowseTo_,_httpiconttoof_,_httpiconttoon_,to,_textimageTo_)}
+_imageFrom_ {_gsimage_(_httpbrowseFrom_,_httpicontfromof_,_httpicontfromon_,from,_textimageFrom_)}
+_imageOrganization_ {_gsimage_(_httpbrowseOrganization_,_httpicontorgof_,_httpicontorgon_,org,_textimageOrganization_)}
+_imageHowto_ {_gsimage_(_httpbrowseHowto_,_httpiconthowof_,_httpiconthowon_,how,_textimageHowto_)}
+_imageTopic_ {_gsimage_(_httpbrowseTopic_,_httpiconttopicof_,_httpiconttopicon_,topic,_textimageTopic_)}
+_imageBrowse_ {_gsimage_(_httpbrowseBrowse_,_httpicontbrwseof_,_httpicontbrwseon_,browse,_textimageBrowse_}
+_imageBrowseMeta_ {_gsimage_(_httpBrowseMeta_,_httpicontbrowsof_,_httpicontbrowson_,browsemeta,_textimageBrowse_)}
+_imagePeople_ {_gsimage_(_httpbrowsePeople_,_httpicontpeopof_,_httpicontpeopon_,people,_textimagePeople_)}
+_imageLanguage_ {_gsimage_(_httpbrowseLanguage_,_httpicontlangof_,_httpicontlangon_,language,_textimageLanguage_)}
+_imageAcronym_ {_gsimage_(_httpbrowseAcronym_,_httpicontacroof_,_httpicontacroon_,acronym,_textimageAcronym_)}
+_imagePhrase_ {_gsimage_(_httpbrowsePhrase_,_httpicontphrseof_,_httpicontphrseon_,phrase,_textimagePhrase_)}
+_imageArtist_ {_gsimage_(_httpbrowseArtist_,_httpicontartstof_,_httpicontartston_,artist,_textimageArtist_)}
+_imageSource_ {_gsimage_(_httpbrowseSource_,_httpicontsrcof_,_httpicontsrcon_,source,_textimageSource_)}
+_imageKeyword_ {_gsimage_(_httpbrowseKeyword_,_httpicontkwof_,_httpicontkwon_,kw,_textimageKeyword_)}
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. 
+
+_javalinks_ {_imagehome__imagehelp__imagepref_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+_imagehelp_<br>
+_imagepref_<br>
+}
+
+
+#######################################################################
+# general web macros 
+#######################################################################
+
+_mailaddr_ {greenstone@cs.waikato.ac.nz}
+
+_gsdltop_ {_top}
+
+#######################################################################
+# http macros 
+#
+# These contain the url without any quotes
+#######################################################################
+
+_httpcollimg_ {_httpcollection_/index/assoc}
+_httpdocimg_ {_httpcollimg_/_thisOID_}
+
+_httpcollection_ {_httpprefix_/collect/_cgiargc_}
+
+_httppagex_ {_gwcgi_?e=_compressedoptions_&a=p&p=_1_}
+_httppagestatus_ {_gwcgi_?e=_compressedoptions_&a=status&p=frameset}
+_httppagecollector_ {_gwcgi_?e=_compressedoptions_&a=collector&p=intro}
+_httppageabout_ {_httppagex_(about)}
+#_httppagehome_ {_httppagex_(home)}
+###_httppagehome_ {http://www.nzdl.org/cgi-bin/dblibrary?a=p&p=home}
+_httppagehome_ {_gwcgi_?a=p&p=home&l=_cgiargl_&w=_cgiargw_}
+_httppagehelp_ {_httppagex_(help)}
+_httppagepref_ {_httppagex_(preferences)}
+_httppagedocs_ {_httppagex_(docs)}
+_httpclearhistory_ {_gwcgi_?e=_compressedoptions_&a=dh}
+
+_httpgreenstone_ {_httppagex_(gsdl)}
+_httpdownload_ {http://www.nzdl.org/download}
+_httppublications_ {_httpdownload_/greenstone/publications}
+
+_httpcurrentdocument_ {_gwcgi_?e=_compressedoptions_&cl=_cgiargcl_&d=_cgiargd_}
+_httpquery_ {_gwcgi_?e=_compressedoptions_&a=q}
+_httpBrowse_ {_gwcgi_?e=_compressedoptions_&a=br}
+
+# _httpdoc_ is the same as _httpdocument_ - _httpdocument_
+# may occasionally be altered by the server however
+_httpdocument_ {_gwcgi_?e=_compressedoptions_&a=d}
+_httpdoc_  {_gwcgi_?e=_compressedoptions_&a=d}
+
+_httpextlink_ {_gwcgi_?e=_compressedoptions_&a=extlink}
+_httpbuild_ {_gwcgi_?e=_compressedoptions_&a=bc}
+
+_httpiconchalk_ {_httpimg_/chalk.gif}
+_widthchalk_ {2000}
+_heightchalk_ {10}
+
+_httpicondivb_ {_httpimg_/divb.gif}
+_widthdivb_ {_pagewidth_}
+_heightdivb_ {17}
+
+_httpicongsdl_ {_httpimg_/gsdl.gif}
+_widthgsdl_ {140}
+_heightgsdl_ {77}
+
+_httpiconitext_ {_httpimg_/itext.gif}
+_widthitext_ {16}
+_heightitext_ {21}
+
+_httpiconibtext_ {_httpimg_/ibtext.gif}
+_widthibtext_ {16}
+_heightibtext_ {21}
+
+_httpiconimpegvideo_ {_httpimg_/impegvid.gif}
+_widthimpegvideo_ {29}
+_heightimpegvideo_ {32}
+
+_httpiconiqtvideo_ {_httpimg_/iqtvideo.gif}
+_widthiqtvideo_ {29}
+_heightiqtvideo_ {32}
+
+_httpiconirmvideo_ {_httpimg_/irmvideo.gif}
+_widthirmvideo_ {29}
+_heightirmvideo_ {32}
+
+_httpiconless_ {_httpimg_/less.gif}
+_widthless_ {30}
+_heightless_ {16}
+
+_httpiconmore_ {_httpimg_/more.gif}
+_widthmore_ {30}
+_heightmore_ {16}
+
+_httpiconspacer_ {_httpimg_/spacer.gif}
+_widthspacer_ {42}
+_heightspacer_ {4}
+
+_httpicontabspace_ {_httpimg_/tabspace.gif}
+_widthtabspace_ {23}
+_heighttabspace_ {1}
+
+_httpicontspace_ {_httpimg_/tspace.gif}
+_heighttspace_ {17}
+
+_httpiconwarning_ {_httpimg_/warning.gif}
+_widthwarning_ {30}
+_heightwarning_ {29}
+
+_httpiconhhome_ {_httpimg_/h\_home.gif}
+_widthhhome_ {200}
+_heighthhome_ {57}
+
+_httpiconarrrght_ {_httpimg_/arrrght.gif}
+_widtharrrght_ {23}
+_heightarrrght_ {15}
+
+_httpiconopenbook_ {_httpimg_/openbook.gif}
+_widthopenbook_ {28}
+_heightopenbook_ {23}
+
+_httpiconaopenbk_ {_httpimg_/aopenbk.gif}
+_widthaopenbk_ {28}
+_heightaopenbk_ {23}
+
+_httpiconopenfldr_ {_httpimg_/openfldr.gif}
+_widthopenfldr_ {23}
+_heightopenfldr_ {15}
+
+_httpiconaopenfdr_ {_httpimg_/aopenfdr.gif}
+_widthaopenfdr_ {23}
+_heightaopenfdr_ {15}
+
+_httpiconbook_ {_httpimg_/book.gif}
+_widthbook_ {18}
+_heightbook_ {11}
+
+_httpiconabook_ {_httpimg_/abook.gif}
+_widthabook_ {18}
+_heightabook_ {11}
+
+_httpiconbshelf_ {_httpimg_/bshelf.gif}
+_widthbshelf_ {20}
+_heightbshelf_ {16}
+
+_httpiconabshelf_ {_httpimg_/abshelf.gif}
+_widthabshelf_ {20}
+_heightabshelf_ {16}
+
+_httpiconsmtext_ {_httpimg_/smtext.gif}
+_widthsmtext_ {23}
+_heightsmtext_ {15}
+
+_httpiconasmtext_ {_httpimg_/asmtext.gif}
+_widthasmtext_ {23}
+_heightasmtext_ {15}
+
+_httpiconclsdfldr_ {_httpimg_/clsdfldr.gif}
+_widthclsdfldr_ {23}
+_heightclsdfldr_ {15}
+
+_httpiconaclsdfdr_ {_httpimg_/aclsdfdr.gif}
+_widthaclsdfdr_ {23}
+_heightaclsdfdr_ {15}
+
+_httpiconimidi_ {_httpimg_/imidi.gif}
+_widthimidi_ {16}
+_heightimidi_ {21}
+
+_httpiconimsword_ {_httpimg_/imsword.gif}
+_widthimsword_ {26}
+_heightimsword_ {26}
+
+_httpiconipdf_ {_httpimg_/ipdf.gif}
+_widthipdf_ {26}
+_heightipdf_ {26}
+
+_httpiconips_ {_httpimg_/ips.gif}
+_widthips_ {25}
+_heightips_ {32}
+
+_httpiconippt_ {_httpimg_/ippt.gif}
+_widthippt_ {32}
+_heightippt_ {30}
+
+_httpiconirtf_ {_httpimg_/irtf.gif}
+_widthirtf_ {29}
+_heightirtf_ {32}
+
+_httpiconixls_ {_httpimg_/iexcel.gif}
+_widthixls_ {32}
+_heightixls_ {30}
+
+#######################################################################
+# Icons 
+#
+# Must not include links (so they can be used as links). If you want to
+# include links use _image
+#######################################################################
+
+_iconnext_{<img src="_httpiconmore_" align=absbottom 
+width=_widthmore_ height=_heightmore_ border=0 alt="_texticonnext_">}
+_iconnext_[v=1] {_texticonnext_}
+
+_iconprev_{<img src="_httpiconless_" align=absbottom 
+width=_widthless_ height=_heightless_ border=0 alt="_texticonprev_">}
+_iconprev_[v=1] {_texticonprev_}
+
+_icontabsearchgreen_ {<img 
+src="_httpicontsrchgr_" width=_widthtsrchx_ border=0>}
+_icontabsearchgreen_[v=1] {_texticontabsearchgreen_}
+
+_icontabListgreen_ {<img
+src="_httpicontlistgr_" width=_widthtlistx_ border=0>}
+_icontablistgreen_ [v=1] {_texticontablistgreen_}
+
+_icontabTitlegreen_ {<img 
+src="_httpiconttitlgr_" width=_widthttitlx_ border=0>}
+_icontabTitlegreen_[v=1] {_texticontabtitlegreen_}
+
+_icontabCreatorgreen_ {<img 
+src="_httpicontauthgr_" width=_widthtauthx_ border=0>}
+_icontabCreatorgreen_[v=1] {_texticontabauthorgreen_}
+
+_icontabSeriesgreen_ {<img 
+src="_httpicontsergr_" width=_widthtserx_ border=0>}
+_icontabSeriesgreen_[v=1] {_texticontabseriesgreen_}
+
+_icontabDategreen_ {<img 
+src="_httpicontdategr_" width=_widthtdatex_ border=0>}
+_icontabDategreen_[v=1] {_texticontabdategreen_}
+
+_icontabSubjectgreen_ {<img 
+src="_httpicontsubjgr_" width=_widthtsubjx_ border=0>}
+_icontabSubjectgreen_[v=1] {_texticontabsubjectgreen_}
+
+_icontabTogreen_ {<img 
+src="_httpiconttogr_" width=_widthttox_ border=0>}
+_icontabTogreen_[v=1] {_texticontabtogreen_}
+
+_icontabFromgreen_ {<img 
+src="_httpicontfromgr_" width=_widthtfromx_ border=0>}
+_icontabFromgreen_[v=1] {_texticontabfromgreen_}
+
+_icontabHowtogreen_ {<img 
+src="_httpiconthowgr_" width=_widththowx_ border=0>}
+_icontabHowtogreen_[v=1] {_texticontabhowgreen_}
+
+_icontabTopicgreen_ {<img 
+src="_httpiconttopicgr_" width=_widthttopicx_ border=0>}
+_icontabTopicgreen_[v=1] {_texticontabtopicgreen_}
+
+_icontabBrowsegreen_ {<img 
+src="_httpicontbrwsegr_" width=_widthtbrwsex_ border=0>}
+_icontabBrowsegreen_[v=1] {_texticontabbrwsegreen_}
+
+_icontabOrganizationgreen_ {<img 
+src="_httpicontorggr_" width=_widthtorgx_ border=0>}
+_icontabOrganizationgreen_[v=1] {_texticontaborggreen_}
+
+_icontabPeoplegreen_ {<img
+src="_httpicontpeopgr_" width=_widthtpeopx_ border=0>}
+_icontabPeoplegreen_[v=1] {_texticontabPeoplegreen_}
+
+_icontabLanguagegreen_ {<img
+src="_httpicontlanggr_" width=_widthtlangx_ border=0>}
+_icontabLanguagegreen_[v=1] {_texticontabLanguagegreen_}
+
+_icontabAcronymgreen_ {<img
+src="_httpicontacrogr_" width=_widthtacrox_ border=0>}
+_icontabAcronymgreen_[v=1] {_texticontabAcronymgreen_}
+
+_icontabPhrasegreen_ {<img
+src="_httpicontphrsegr_" width=_widthtphrsex_ border=0>}
+_icontabPhrasegreen_[v=1] {_texticontabPhrasegreen_}
+
+_icontabArtistgreen_ {<img
+src="_httpicontartstgr_" width=_widthtartstx_ border=0>}
+_icontabArtistgreen_[v=1] {_texticontabArtistgreen_}
+
+_icontabSourcegreen_ {<img 
+src="_httpicontsrcgr_" width=_widthtsrcx_ border=0>}
+_icontabSourcegreen_[v=1] {_texticontabSourcegreen_}
+
+_icontabKeywordgreen_ {<img 
+src="_httpicontkwgr_" width=_widthtkwx_ border=0>}
+_icontabKeywordgreen_[v=1] {_texticontabKeywordgreen_}
+
+
+_iconblankbar_ {<center><img src="_httpicondivb_" width=_widthdivb_ height=_heightdivb_></center>}
+_iconblankbar_[v=1] {<br><hr><br>}
+
+_icontext_ {<img border=0 align=absmiddle src="_httpiconitext_" width=_widthitext_ height=_heightitext_ alt="_texticontext_">}
+_icontext_[v=1] {_texticontext_}
+
+_iconblanktext_ {<img border=0 align=absmiddle src="_httpiconibtext_" width=_widthibtext_ height=_heightibtext_>}
+_iconblanktext_[v=1] {}
+
+_iconclosedbook_ {<img src="_httpiconbook_" width=_widthbook_ height=_heightbook_ border=0 alt="_texticonclosedbook_">}
+_iconclosedbook_ [v=1] {<small><b>_texticonclosedbook_: </b></small>}
+_iconclosedbook_ [v=1,l=zh]{<small><_font_><b>_texticonclosedbook_: </b></font></small>}
+
+_icondoc_ {<img border=0 align=absmiddle src="_httpiconimsword_" width=_widthimsword_ height=_heightimsword_ alt="_texticonmsword_">}
+_iconmsword_[v=1] {_texticonmsword_}
+
+_iconmidi_ {<img border=0 align=absmiddle src="_httpiconimidi_" width=_widthimidi_ height=_heightimidi_ alt="_texticonmidi_">}
+_iconmidi_[v=1] {_texticonmidi_}
+
+_iconpdf_ {<img border=0 align=absmiddle src="_httpiconipdf_" width=_widthipdf_ height=_heightipdf_ alt="_texticonpdf_">}
+_iconpdf_[v=1] {_texticonpdf_}
+
+_iconps_ {<img border=0 align=absmiddle src="_httpiconips_" width=_widthips_ height=_heightips_ alt="_texticonps_">}
+_iconps_[v=1] {_texticonps_}
+
+_iconppt_ {<img border=0 align=absmiddle src="_httpiconippt_" width=_widthippt_ height=_heightippt_ alt="_texticonppt_">}
+_iconppt_[v=1] {_texticonppt_}
+
+_iconrtf_ {<img border=0 align=absmiddle src="_httpiconirtf_" width=_widthirtf_ height=_heightirtf_ alt="_texticonrtf_">}
+_iconrtf_[v=1] {_texticonrtf_}
+
+_iconxls_ {<img border=0 align=absmiddle src="_httpiconixls_" width=_widthixls_ height=_heightixls_ alt="_texticonxls_">}
+_iconxls_[v=1] {_texticonxls_}
+
+_iconnosearch_ {<img src="_httpimg_/nosearch.gif">}
+
+#######################################################################
+# Image links 
+#
+# These might include a link (not like an _icon_
+#######################################################################
+
+_imagehome_ {_If_("_cgiargu_" ne "1",_imagehome2_)}
+_imagehome2_ {_gsimage_(_httppagehome_,_httpiconchomeof_,_httpiconchomeon_,homer,_textimagehome_)}
+
+_imagehelp_ {_gsimage_(_httppagehelp_,_httpiconchelpof_,_httpiconchelpon_,help,_textimagehelp_)}
+
+_imagepref_ {_If_("_cgiargu_" ne "1",_imagepref2_)}
+_imagepref2_ {_gsimage_(_httppagepref_,_httpiconcprefof_,_httpiconcprefon_,pref,_textimagepref_)}
+
+_imagegreenstone_ {<img src="_httpicongsdl_" width="_widthgsdl_" height="_heightgsdl_" border="0" alt="_textimagegreenstone_" hspace=0>}
+_imagegreenstone_[v=1] {_textimagegreenstone_}
Index: /main/tags/2.38/gsdl/macros/browse.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/browse.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/browse.dm	(revision 21083)
@@ -0,0 +1,113 @@
+package browse
+
+#######################################################################
+# headers
+# these are overridden so we can put an onLoad event handler
+# in the <body> tag of this page - for mgpp, form search pages
+#######################################################################
+
+#copied from prefs 
+
+_header_ {_cgihead_
+_htmlhead_(onLoad="ccont(0)")_startspacer__pagebanner_
+}
+
+
+_content_{
+	
+	
+
+	_navigationbar_
+	
+	_browseinterface_
+
+	_iconblankbar_
+
+	_classifications_
+	
+
+	<div id="mydiv"></div>
+	<div><layer id="mylayer"top=350 left=280 width="100%"></layer></div>	
+
+}
+
+
+_runtimebrowsescript_{}
+
+_browseinterface_{
+
+<form name=BrowseForm method=get action="_gwcgi_">
+
+<input type=hidden name="a" value="br">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+       <p>
+       _textfilterby_ _anyallselect_ _textwords_<br> 
+       _filterbox_<br>
+ 
+	<font size=-1><i>(_textleaveblank_)</i></font><p>	      	      
+       
+       _textsortby_ _browsebox1_, _textalsoshowing_ _browsebox2_ _textwith_ 
+       _docnum_ _textdocsperpage_
+       <span align = right> _browsebutton_ </span><p>
+</form>  
+
+}
+
+_browsebutton_{<input type=submit value=_browsebuttontext_ align=right>}
+
+_docnum_{
+<select name="bnu">
+	<option _If_("_cgiargbnu_" eq "5", selected)>5
+	<option _If_("_cgiargbnu_" eq "10", selected)>10
+	<option _If_("_cgiargbnu_" eq "20", selected)>20
+	<option _If_("_cgiargbnu_" eq "50", selected)>50
+	<option value="-1" _If_("_cgiargbnu_" eq "-1", selected)>max
+</select>
+}
+
+_filterbox_{<input type=text name="bft" value="_cgiargbft_" size=60>}
+
+
+_anyallselect_{
+<select name="bt">
+	<option value="0"_If_(_cgiargbt_,, selected)>_textany_
+	<option value="1"_If_(_cgiargbt_, selected)>_textall_
+</select>
+}
+
+_classifications_{
+}
+ 	
+_pagescriptextra_ {
+var tbl = new Array()
+
+function ccont(current)\{
+  if(document.getElementById) \{
+    document.getElementById("mydiv").innerHTML = tbl[current]; 
+   \}	
+  else if(document.all)\{
+    mydiv.innerHTML=tbl[current]
+  \}
+  else if(document.layers)\{
+    document.mylayer.document.write(tbl[current])
+    document.mylayer.document.close()
+   \}
+  
+\}      
+
+_runtimebrowsescript_
+
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/macros/bsummary.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/bsummary.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/bsummary.dm	(revision 21083)
@@ -0,0 +1,16 @@
+package bsummary
+
+_pagetitle_ {_collectionname_}
+
+_content_ {
+<center>
+_navigationbar_
+<h3>_textbsummary_</h3>
+</center>
+<p>_importlog_
+
+<center>
+<h3>_textflog_</h3>
+</center>
+<p>_faillog_
+}
Index: /main/tags/2.38/gsdl/macros/collect.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/collect.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/collect.dm	(revision 21083)
@@ -0,0 +1,902 @@
+package collector
+
+_imagethispage_ {<a href="_httppagecollector_">_iconhcolect_</a>}
+
+# _pagescriptextra_ will be set to the appropriate _***scriptextra_
+# macro from within the server
+_pagescriptextra_ {}
+
+# this is just like the _gsimage_ macro but it calls the check_submit() javascript
+# function instead of linking directly to the page (_1_ argument isn't used)
+_gsjimage_ {<a href="javascript:check\_submit('_4_');" onMouseover="roll('_4_',1);" onMouseOut="roll('_4_',0);" target=_top><img
+name="_4_" src="_2_" onLoad="gbutton(this,'_3_');" border=0 alt="_5_"></a>}
+_gsjimage_ [v=1] {<a href="javascript:check\_submit('_4_');" target=_top>_5_</a><br>}
+
+# _gstimage_ is also similar to _gsimage_ but is used where buttons occur in a sub-frame and
+# require target=_top
+_gstimage_ {<a href="_1_" onMouseover="roll('_4_',1);" onMouseOut="roll('_4_',0);" target="\_top"><img
+name="_4_" src="_2_" onLoad="gbutton(this,'_3_');" border=0 alt="_5_"></a>}
+_gstimage_ [v=1] {<a href="_1_" target="\_top">_5_</a><br>}
+
+# a plain header for those pages that need it (the _pagebanner_ macro
+# will be set to this by the server for those pages.
+_plainbanner_ {}
+
+# dont want links to "help" or "preferences" pages from within
+# collector
+_javalinks_ {_imagehome_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+}
+
+
+#######################################################################
+# icons
+
+_iconcross_ {<img src="_httpimg_/cross.gif">}
+_iconcross_ [v=1] {<b>no</b>}
+_icontick_ {<img src="_httpimg_/tick.gif">}
+_icontick_ [v=1] {<b>yes</b>}
+_iconblank_ {<img src="_httpimg_/blank.gif">}
+_iconblank_ [v=1] {}
+
+_imagemore_ {<a href="javascript:more()" onMouseover="roll('more',1);" onMouseOut="roll('more',0);"><img
+name="more" src="_httpimg_/moreof.gif" onLoad="gbutton(this,'_httpimg_/moreon.gif');" border=0 alt="_textmore_"
+align=top></a>}
+_imagemore_ [v=1] {_textmore_}
+
+_iconhcolect_ {<img src="_httpiconhcolect_" alt="_textcollector_" border=0>}
+_icongreyarrow_ {<img src="_httpimg_/grarrow.gif">}
+_icongreyuparrow_ {<img src="_httpimg_/guarrow.gif">}
+_iconstop_ {<img src="_httpimg_/stop.gif" border=0>}
+
+_icongcinfoof_ {<img src="_httpicongcinfoof_" alt="_textinfo_">}
+_icongcinfoon_ {<img src="_httpicongcinfoon_" alt="_textinfo_">}
+_iconycinfoof_ {<img src="_httpiconycinfoof_" alt="_textinfo_">}
+_iconycinfoon_ {<img src="_httpiconycinfoon_" alt="_textinfo_">}
+_iconncinfoof_ {<img src="_httpiconncinfoof_" alt="_textinfo_">}
+
+_icongcsrceof_ {<img src="_httpicongcsrceof_" alt="_textsrce_">}
+_icongcsrceon_ {<img src="_httpicongcsrceon_" alt="_textsrce_">}
+_iconycsrceof_ {<img src="_httpiconycsrceof_" alt="_textsrce_">}
+_iconycsrceon_ {<img src="_httpiconycsrceon_" alt="_textsrce_">}
+_iconncsrceof_ {<img src="_httpiconncsrceof_" alt="_textsrce_">}
+
+_icongcconfof_ {<img src="_httpicongcconfof_" alt="_textconf_">}
+_icongcconfon_ {<img src="_httpicongcconfon_" alt="_textconf_">}
+_iconycconfof_ {<img src="_httpiconycconfof_" alt="_textconf_">}
+_iconycconfon_ {<img src="_httpiconycconfon_" alt="_textconf_">}
+_iconncconfof_ {<img src="_httpiconncconfof_" alt="_textconf_">}
+
+_icongcbildof_ {<img src="_httpicongcbildof_" alt="_textbild_">}
+_icongcbildon_ {<img src="_httpicongcbildon_" alt="_textbild_">}
+_iconycbildof_ {<img src="_httpiconycbildof_" alt="_textbild_">}
+_iconycbildon_ {<img src="_httpiconycbildon_" alt="_textbild_">}
+_iconncbildof_ {<img src="_httpiconncbildof_" alt="_textbild_">}
+
+_icongcviewof_ {<img src="_httpicongcviewof_" alt="_textview_">}
+_icongcviewon_ {<img src="_httpicongcviewon_" alt="_textview_">}
+_iconycviewof_ {<img src="_httpiconycviewof_" alt="_textview_">}
+_iconycviewon_ {<img src="_httpiconycviewon_" alt="_textview_">}
+_iconncviewof_ {<img src="_httpiconncviewof_" alt="_textview_">}
+
+_icongcdelof_ {<img src="_httpicongcdelof_" alt="_textdel_">}
+_icongcdelon_ {<img src="_httpicongcdelon_" alt="_textdel_">}
+
+# these buttons fixed width 77x26 fontsize 13 bgcolor #96c19b
+
+_icongcexptof_ {<img src="_httpicongcexptof_" alt="_textexpt_">}
+_icongcexpton_ {<img src="_httpicongcexpton_" alt="_textexpt_">}
+
+#######################################################################
+# http macros 
+
+_httpinfo_ {_gwcgi_?e=_compressedoptions_&p=info}
+_httpsrce_ {_gwcgi_?e=_compressedoptions_&p=srce}
+_httpconf_ {_gwcgi_?e=_compressedoptions_&p=conf}
+_httpbild_ {_gwcgi_?e=_compressedoptions_&p=bild}
+_httpview_ {_gwcgi_?a=p&p=about&c=_cgiargbc1dirname_}
+_httpdel_  {javascript:do\_delete();}
+_httpexpt_ {_gwcgi_?e=_compressedoptions_&p=expt}
+
+
+#######################################################################
+# intro
+#######################################################################
+
+_introscriptextra_ {}
+
+_introcontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center>
+<h2>_textcollector_</h2>
+<p>_textcollectorblurb_
+</center>
+<p>_iconblankbar_
+<p>_textcb1_
+<p>_textcb2_
+<ul>
+<input type=radio name=p value=new checked>
+_textcnc_
+<br>
+<input type=radio name=p value=existing>
+_textwec_
+</ul>
+<p>_iconblankbar_
+<p>_textcb3_
+<p>_textcb4_
+
+<table><tr><td width=80>_authen:textusername_</td>
+<td><input type="text" name="un" value="" size=10></td>
+<td></td></tr>
+<tr><td>_authen:textpassword_</td>
+<td><input type="password" name="pw" size=10></td>
+<td><input type="submit" value="_textsignin_"></td>
+</tr>
+</table>
+<p>_iconblankbar_
+</td></tr>
+</table></center>
+
+</form>
+}
+
+
+#######################################################################
+# existing (Changing an existing collection page)
+#######################################################################
+
+_existingscriptextra_ {
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  if (gotopage == "srce") \{
+    form.bc1esrce.value = "1";
+  \}
+  if (gotopage == "conf") \{
+    form.bc1econf.value = "1";
+  \}
+  form.p.value = gotopage;
+  form.submit();
+\}
+
+function do\_delete () \{
+  var form = document.collectorform;  
+  var i = form.bc1dirname.selectedIndex;
+  var del = confirm ("Confirm deletion of " + form.bc1dirname.options[i].value + " collection?");
+  if (del) \{
+    form.bc1dodelete.value = "1";
+    form.submit();
+  \}
+\}
+}
+
+_changeexisting_ {
+<p>_textfsc_
+<br>_fullnamemenu_<br>
+<p>_textwtc_
+
+<table cellspacing=6>
+<tr><td width=20 align=right valign=bottom>1.</td>
+<td valign=bottom>_gsjimage_( ,_collector:httpicongcsrceof_,_collector:httpicongcsrceon_,srce,_collector:textsrce_)</td>
+<td valign=bottom>_textamd_</td></tr>
+<tr><td align=right valign=bottom>2.</td>
+<td valign=bottom>_gsjimage_(_,_collector:httpicongcconfof_,_collector:httpicongcconfon_,conf,_collector:textconf_)</td>
+<td valign=bottom>_textetc_</td></tr>
+<tr><td align=right valign=bottom>3.</td>
+<td valign=bottom>_gsimage_(_collector:httpdel_,_collector:httpicongcdelof_,_collector:httpicongcdelon_,del,_collector:textdel_)</td>
+<td valign=bottom>_textdtc_</td></tr>
+<tr><td align=right valign=bottom>4.</td>
+<td valign=bottom>_gsjimage_( ,_collector:httpicongcexptof_,_collector:httpicongcexpton_,expt,_collector:textexpt_)</td>
+<td valign=bottom>_textetcfcd_</td></tr>
+</table>
+}
+
+_existingcontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+<input type=hidden name="bc1dodelete" value="0">
+<input type=hidden name="bc1esrce" value="0">
+<input type=hidden name="bc1econf" value="0">
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center><h2>_textcaec_</h2></center>
+_iconblankbar_
+_If_("_fullnamemenu_" eq "",<p>_textnwec_,_changeexisting_)
+<p>_iconblankbar_
+</td></tr>
+</table></center>
+</form>
+}
+
+
+#######################################################################
+# new (Create a new collection page)
+#######################################################################
+
+_newscriptextra_ {}
+
+_newcontent_ {
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center><h2>_textcianc_</h2></center>
+_iconblankbar_
+
+<p>_texttsosn_
+<table cellspacing=6>
+<tr><td width=20 align=right valign=bottom>1.</td>
+    <td valign=bottom>_iconncinfoof_</td>
+    <td valign=bottom>_textsin_</td></tr>
+<tr><td align=right valign=bottom>2.</td>
+    <td valign=bottom>_iconncsrceof_</td>
+    <td valign=bottom>_textswts_</td></tr>
+<tr><td align=right valign=bottom>3.</td>
+    <td valign=bottom>_iconncconfof_</td>
+    <td valign=bottom>_textatco_</td></tr>
+<tr><td align=right valign=bottom>4.</td>
+    <td valign=bottom>_iconncbildof_</td>
+    <td valign=bottom>_textbtc_</td></tr>
+<tr><td align=right valign=bottom>5.</td>
+    <td valign=bottom>_iconncviewof_</td>
+    <td valign=bottom>_textpvyh_</td></tr>
+</table>
+
+<p>_texttfsiw_
+<p>_iconblankbar_
+<p>_textadab_
+<p>_textwyar_
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+}
+
+
+#######################################################################
+# info (Collection information page)
+#######################################################################
+
+_infoscriptextra_ {
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  if (form.bc1fullname.value.match(/^\\s*$/))
+  \{
+    alert("_textcnmbs_");
+    form.bc1fullname.focus();
+    return;
+  \}
+  else if (form.bc1contactemail.value.match(/^\\s*$/))
+  \{     
+    alert("_texteambs_");
+    form.bc1contactemail.focus();
+    return;
+  \}
+  else if (!form.bc1contactemail.value.match(/^([^@]+)@(.+)$/))
+  \{
+    alert("_textpsea_");
+    form.bc1contactemail.focus();
+    return;
+  \}
+  else if (form.bc1aboutdesc.value.match(/^\\s*$/))
+  \{
+    alert("_textdocmbs_");
+    form.bc1aboutdesc.focus();
+    return;
+  \}
+  form.p.value = gotopage;
+  form.submit();
+\}
+}
+
+_infocontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+<input type=hidden name="bc1infochanged" value="0">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center>
+<h2>_textinfo_</h2>
+</center>
+<p>_iconblankbar_
+
+<p>_textwcanc_
+<h4>_texttfc_</h4>
+<input type="text" name="bc1fullname" value="_cgiargbc1fullname_"
+onChange="document.collectorform.bc1infochanged.value=1;") size=72>
+<br>_texttctiasp_
+<h4>_textcea_</h4>
+<input type="text" name="bc1contactemail" value="_cgiargbc1contactemail_"
+onChange="document.collectorform.bc1infochanged.value=1;" size=72>
+<br>
+_textteas_
+
+<h4>_textatc_</h4>
+<textarea name="bc1aboutdesc"  cols=72 rows=6 wrap=physical
+onChange="document.collectorform.bc1infochanged.value=1;">
+_cgiargbc1aboutdesc_
+</textarea>
+<br>_texttiasd_
+
+<p>_iconblankbar_
+
+<p>_textypits_
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+
+</form>
+}
+
+
+#######################################################################
+# srce (Source data page)
+#######################################################################
+
+# _fullnamemenu is set from within the server. If it's empty there are
+# no valid collections 
+_fullnamemenu_ {}
+
+_srcescriptextra_ {
+var selectedindex = _selectedindex_;
+
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  form.p.value = gotopage;
+  form.bc1fromsrce.value = "1";
+  form.submit();
+\}
+
+function menuchange () \{
+  var form = document.collectorform;
+  var warnlist = new Array (_warnindex_);
+
+  if (warnlist[form.bc1clonecol.selectedIndex] == 1) \{
+    alert ("The collection you are cloning has a non-standard input file\\n" +
+           "format, and/or uses metadata specified in auxiliary files.  If your\\n" +
+	   "new input lacks this information, some browsing facilities may not\\n" +
+           "work properly.");
+  \}
+
+  if (form.bc1clonecol.selectedIndex == 0) \{
+    form.bc1clone.value = "0";
+  \} else \{
+    form.bc1clone.value = "1";
+  \}
+
+  if (form.bc1clonecol.selectedIndex == selectedindex) \{
+    form.bc1clonechanged.value = "0";
+  \} else \{
+    form.bc1clonechanged.value = "1";
+  \}
+\}
+
+function more () \{
+  var form = document.collectorform;
+  form.bc1inputnum.value = parseInt(form.bc1inputnum.value) + 3;
+  form.p.value = "srce";
+  if (!form.action.match(/sources$/)) \{
+    form.action += "#sources";
+  \}
+  form.submit();
+\}
+}
+
+_srcenew_ {
+<center>
+<h2>_textsrce_</h2>
+</center>
+<p>_iconblankbar_
+_If_("_badsources_" eq "1",_srcebadsources_,_srcenewcontent_)
+}
+
+_srcenewcontent_ {
+_textymbyco_
+<p>_textbtco_
+_fullnamemenu_
+<p>_iconblankbar_
+}
+
+_srceappend_ {
+<center>
+<h2>_textand_</h2>
+</center>
+<p>_iconblankbar_
+<h4>_textad_</h4>
+_texttftysb_
+}
+
+_srcecontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+<input type=hidden name="bc1fromsrce" value="0">
+<input type=hidden name="bc1clonechanged" value="0">
+<input type=hidden name="bc1clone" value="_cgiargbc1clone_">
+<input type=hidden name="bc1inputnum" value="_cgiargbc1inputnum_">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+_If_("_cgiargbc1esrce_" eq "1",_srceappend_,_srcenew_)
+
+<a name=sources>
+<h4>_textis_</h4>
+_sourcelist_
+
+_textddd1_
+<p>_iconblankbar_
+_textddd2_
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+
+</form>
+}
+
+
+#######################################################################
+# conf (Configure collection page)
+#######################################################################
+
+_confscriptextra_ {
+var changed = 0;
+
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  form.bc1cfgchanged.value = changed;
+  form.p.value = gotopage;
+  form.submit();
+\}
+
+function reset\_button () \{
+  document.collectorform.reset();
+  changed = 0;
+\}
+}
+
+_confcontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+<input type=hidden name="bc1cfgchanged" value="_cgiargbc1cfgchanged_">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center>
+<h2>_textconf_</h2>
+</center>
+<p>_iconblankbar_
+_textconf1_
+
+<p><textarea name="cfgfile" cols=72 rows=18 wrap=off onChange="changed=1;">
+_cfgfile_
+</textarea>
+<table><tr valign=top>
+<td><a href="javascript:reset\_button();">_iconstop_</a></td>
+<td><a href="javascript:reset\_button();">_textreset_</a></td>
+</tr></table>
+
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+
+</form>
+}
+
+
+#######################################################################
+# bild (main frameset for build page)
+#######################################################################
+
+_bildcontent_ {
+<html>
+<head>
+<script>
+<!--
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  form.p.value = gotopage;
+  form.submit();
+\}
+// -->
+</script>
+</head>
+
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+
+<frameset rows="*,160" border=0>
+  <noframes><body bgcolor="#ffffff">
+  <p>You must have a frame enabled browser to obtain feedback
+  on how the building process is progressing. The collection <i>will</i>
+  continue to build as normal however.
+
+  <table>
+  <tr valign=center><td>
+  To stop the building process at any time, click here.
+  <br>The collection you are working on will remain intact.
+  </td>
+  <td><input type="submit" value="stop building"></td>
+  </table>
+
+  </body>
+  </noframes>
+  <frame src="_gwcgi_?e=_compressedoptions_&p=bildframe1">
+  <frame src="_gwcgi_?e=_compressedoptions_&p=bildstatus">
+</frameset>
+</html>
+}
+
+#######################################################################
+# bildframe1
+#######################################################################
+
+# header overridden to allow base target to be set
+# also no page banner to maximise what we can fit in the frame without scrolling
+_bildframe1header_ {_cgihead_
+<html>
+<head>
+<base target=_top>
+<title>_pagetitle_</title>
+_globalscripts_
+</head>
+<body bgcolor="\#ffffff" text="\#000000" link="\#006666" 
+      alink="\#cc9900" vlink="\#666633" background="_httpiconchalk_">
+_startspacer_
+}
+_bildframe1header_[v=1] {_cgihead_
+<html>
+<head>
+<base target=_top>
+<title>_pagetitle_</title>
+_globalscripts_
+</head>
+<body bgcolor="\#ffffff" text="\#000000" link="\#006666" 
+      alink="\#cc9900" vlink="\#666633" background="_httpiconchalk_">
+}
+_bildframe1scriptextra_ {}
+_bildframe1content_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="bildcancel">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center>
+<h2>_textbild_</h2>
+</center>
+<p>_iconblankbar_
+<p>
+_textbild1_
+<p>
+
+<table>
+<tr valign=center><td>
+_textbild2_
+</td>
+<td><input type="submit" value="_textstopbuild_"></td>
+</table>
+
+<p>
+_textbild3_
+</td></tr>
+</table></center>
+</form>
+}
+
+
+#######################################################################
+# bildcancel
+#######################################################################
+
+_bildcancelscriptextra_ {
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  form.p.value = gotopage;
+  form.submit();
+\}
+}
+_bildcancelcontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+
+</form>
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+<center>
+<h2>_textbuildcancelled_</h2>
+</center>
+<p>_iconblankbar_
+<p>
+_textbildcancel1_
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+}
+
+
+#######################################################################
+# bildstatus
+#######################################################################
+
+# special header for status page
+_bildstatusheader_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_" onLoad="initialize();")_startspacer_
+}
+_bildstatusheader_[v=1] {_cgihead_
+_htmlhead_(onLoad="initialize();")
+}
+
+_bildstatusscriptextra_ {
+var timer = 5;
+function initialize() \{
+  setTimeout("count_down()",1000);
+\}
+
+function count_down() \{
+  if (timer==0) \{
+    window.status = "";
+    document.collectorform.submit();
+  \} else \{
+    if (timer==1) \{
+	window.status = "_textbsupdate1_";
+    \} else \{
+	window.status = "_textbsupdate2_ "+timer+" _textseconds_";
+    \}
+    timer--;
+    setTimeout("count_down()",1000);
+  \}	
+\}
+}
+
+_bildstatuscontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_statusline_
+</td></tr>
+</table></center>
+</form>
+}
+
+
+#######################################################################
+# bilddone
+#######################################################################
+
+_bilddoneheader_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_")_startspacer_
+}
+_bilddonescriptextra_ {}
+_bilddonecontent_ {
+<center>
+<table width=_pagewidth_>
+<tr><td>
+<p>_textbildsuc_
+
+<p>_textviewbildsummary_
+
+<p><center>
+_collectorbar_
+</center>
+
+</td></tr>
+</table></center>
+}
+
+
+#######################################################################
+# bildfail
+#######################################################################
+
+_bildfailheader_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_")_startspacer_
+}
+_bildfailscriptextra_ {
+function check\_submit (gotopage) \{
+  var form = document.collectorform;
+  form.p.value = gotopage;
+  form.submit();
+\}
+}
+_bildfailcontent_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="p" value="_cgiargp_">
+
+</form>
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_textfailmsg_
+</td></tr>
+</table></center>
+}
+
+# _textfailmsg_ will be set to one of the following macros from within
+# the server
+
+_textfailmsg1_ {
+_textfailmsg11_
+<p><center>
+_collectorbar_
+</center>
+}
+
+_textfailmsg6_ {_textfailmsg1_}
+
+_textfailmsg2_ {
+_textfailmsg21_
+<p>_textblcont_
+<p>_faillog_
+<p>_texttryagain_
+}
+
+_textfailmsg3_ {
+_textfailmsg31_
+<p>_textblcont_
+<p>_faillog_
+<p>_texttryagain_
+}
+
+_textfailmsg4_ {
+_textfailmsg41_
+<p>_textblcont_
+<p>_faillog_
+}
+
+_textfailmsg5_ {_textfailmsg4_}
+
+_textfailmsg7_ {
+_textfailmsg71_
+<p>_texttryagain_
+}
+
+#######################################################################
+# Error and message pages
+#######################################################################
+
+_messagehead_ {
+<form name="collectorform" method=post action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+
+<center>
+<table width=_pagewidth_>
+<tr><td>
+_iconblankbar_
+}
+
+_messagefoot_ {
+<p>
+<a href="javascript:document.collectorform.submit();">_textretcoll_</a>
+<p>_iconblankbar_
+</td></tr>
+</table></center>
+</form>
+}
+
+_messagefootnolink_ {
+<p>_iconblankbar_
+</td></tr>
+</table></center>
+</form>
+}
+
+_delpermissioncontent_ {
+_messagehead_
+<p>
+_textdelperm_
+_messagefoot_
+}
+
+_delinvalidcontent_ {
+_messagehead_
+<p>
+_textdelinv_
+_messagefoot_
+}
+
+_delsuccesscontent_ {
+_messagehead_
+<p>
+_textdelsuc_
+_messagefoot_
+}
+
+_clonefailcontent_ {
+_messagehead_
+<input type=hidden name="bc1clone" value="0">
+<p>_textclonefail_
+_messagefoot_
+}
+
+_genericcontent_ {
+_messagehead_
+<p>_textcolerr_
+_messagefoot_
+}
+
+_tmpfailcontent_ {
+_messagehead_
+<p>
+_texttmpfail_
+_messagefoot_
+}
+
+_mkcolfailcontent_ {
+_messagehead_
+<p>_textmkcolfail_
+_messagefoot_
+}
+
+_nocollectioncontent_ {
+_messagehead_
+<p>_textnocontent_
+<br><a href="_httppagecollector_">_textrestart_</a>
+<p>
+_messagefootnolink_
+}
+
+_reloaderrorcontent_ {
+_messagehead_
+<p>_textreloaderror_
+<br><a href="_httppagecollector_">_textrestart_</a>
+<p>
+_messagefootnolink_
+}
+
+_exptscriptextra_ {}
+
+_exptsuccesscontent_ {
+_messagehead_
+<input type=hidden name=p value=existing>
+<p>_textexptsuc_
+_messagefoot_
+}
+
+_exptfailcontent_ {
+_messagehead_
+<input type=hidden name=p value=existing>
+_textexptfail_
+_messagefoot_
+}
Index: /main/tags/2.38/gsdl/macros/dateqry.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/dateqry.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/dateqry.dm	(revision 21083)
@@ -0,0 +1,146 @@
+package query
+
+
+#######################################################################
+# Macros whose values are set from within the server at runtime. These 
+# are here only for reference and to set default values if required.           
+#######################################################################
+
+_quotedquery_ {}
+_freqmsg_ {}
+_resultline_ {}
+_thisfirst_ {}
+_thislast_ {}
+_nextfirst_ {}
+_nextlast_ {}
+_prevfirst_ {}
+_prevlast_ {}
+_searchhistorylist_ {}
+
+#######################################################################
+# icons
+#######################################################################
+
+_iconthispage_ {<img src="_httpiconhsearch_" alt="_texticonthispage_" width="_widthhsearch_" height="_heighthsearch_">}
+_iconthispage_ [v=1] {<h2>_texticonthispage_</h2>}
+
+_iconqueryresultsbar_ {<img src="_httpiconqryresb_" width="_widthqryresb_" height="_heightqryresb_" alt="_texticonqueryresultsbar_">}
+_iconqueryresultsbar_[v=1] {_texticonqueryresultsbar_}
+
+# _iconnext_ and _iconprev_ are overridden in this package as we
+# don't want alt text here
+_iconnext_{<img src="_httpiconmore_" width=_widthmore_ height=_heightmore_ border=0 align=top>}
+_iconnext_ [v=1] {}
+_iconprev_{<img src="_httpiconless_" width=_widthless_ height=_heightless_ border=0 align=top>}
+_iconprev_ [v=1] {}
+
+#######################################################################
+# images
+#######################################################################
+
+_imagethispage_ {_iconthispage_}
+
+
+#######################################################################
+# page content
+#######################################################################
+
+_pagetitle_ {_If_(_cgiargq_,_textquerytitle_,_textnoquerytitle_)}
+
+_content_ {
+<center>
+_navigationbar_
+</center>
+_queryform_
+_If_(_searchhistorylist_,<center>
+_searchhistorylist_
+</center>)
+_If_(_cgiargq_,<center>_iconqueryresultsbar_</center><br>
+<small>
+_freqmsg_
+_textpostprocess_</small><br>
+,<center>_iconblankbar_</center>)<br>
+_resultline_<p>
+}
+
+_queryform_ {
+<!-- query form -->
+<form name=QueryForm method=get action="_gwcgi_">
+
+<input type=hidden name="a" value="q">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="r" value="1">
+<input type=hidden name="hs" value="1">
+<input type=hidden name="g" value="Document" 
+<center>
+<table><tr><td>
+<nobr>
+	_textselect_<br>
+<nobr>	
+</tr></td>
+<tr><td>
+<nobr>
+	<center>
+	<input type="text" name="q" value="_cgiargq_" size="50">
+	<input type="submit" value="_textbeginsearch_">
+	</center>
+</nobr>
+</tr></td>
+<tr><td>
+	_textdatesearch_<br>
+</tr></td>
+<tr><td>
+	<center>
+_textstartdate_
+<input type="text" name="ds" value = "_cgiargds_"size="4" maxlength="4">
+<select name="dsbc" value="_cgiargdsbc_" size="1">
+	<option value = "0"_If_(_cgiargdsbc_,, selected)>_textad_
+	<option value = "1"_If_(_cgiargdsbc_, selected)>_textbc_
+</select> 
+_textenddate_
+<input type="text" name="de" value = "_cgiargde_" size="4" maxlength="4"> 
+<select name="debc" size="1">
+	<option value = "0" _If_(_cgiargdebc_,, selected)>_textad_
+	<option value = "1" _If_(_cgiargdebc_, selected)>_textbc_
+</select> 
+</center>	  
+</tr></td>
+<tr><td>
+_textexplaineras_
+</tr></td>
+</table>
+</center>
+</form>
+<!-- end of query form -->
+}
+
+_textselect_ {_If_(_cgiargb_,_textadvancedsearch_,_textsimplesearch_)}
+
+# we want to put the links to previous/next pages of results
+# in the footer
+_pagefooterextra_ {
+<center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr>
+<td align=left>_If_(_prevfirst_,<a href="_httpquery_&r=_prevfirst_">_iconprev__textmatches__prevfirst_ - _prevlast_</a>)</td>
+<td align=right>_If_(_nextfirst_,<a href="_httpquery_&r=_nextfirst_">_textmatches__nextfirst_ - _nextlast__iconnext_</a>)</td>
+</tr></table>
+</center>
+}
+
+_querytypeselection_ {
+<select name="t">
+<option value="1"_If_(_cgiargt_, selected)>_textsome_
+<option value="0"_If_(_cgiargt_,, selected)>_textall_
+</select>
+}
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/macros/docs.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/docs.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/docs.dm	(revision 21083)
@@ -0,0 +1,35 @@
+package docs
+
+# set from within server
+_documentation_ {}
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. 
+
+_javalinks_ {_imagehome_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+}
+
+#######################################################################
+# page content
+#######################################################################
+
+_icongsdocsgr_ {<img src="_httpicongsdocsgr_">}
+_httpiconpdf_ {_httpimg_/pdf.gif}
+_iconpdf_ {<img src="_httpiconpdf_" border=0>}
+
+_httpdocs_ {_httpprefix_/docs}
+
+_pagetitle_ {_textimagegreenstone_}
+
+_content_ {
+_icongsdocsgr_
+_If_(_documentation_,_documentation_,_textnodocumentation_)
+
+_nzdlpagefooter_
+}
Index: /main/tags/2.38/gsdl/macros/document.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/document.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/document.dm	(revision 21083)
@@ -0,0 +1,295 @@
+package document
+
+#######################################################################
+# macros set from within the server
+#######################################################################
+
+_imagethispage_ {}
+_httpprevarrow_ {}
+_httpnextarrow_ {}
+_pagetitle_ {}
+_phindclassifier_ {}
+
+#######################################################################
+# page content
+#######################################################################
+
+_content_ {
+<center>
+_navigationbar_
+<p>
+_phindclassifier_
+</center>
+}
+
+_textTitlepage_ {_texticonhtitle_}
+_textCreatorpage_ {_texticonhauth_}
+_textSubjectpage_ {_texticonhsubj_}
+_textTopage_ {_texticonhto_}
+_textFrompage_ {_texticonhfrom_}
+_textSeriespage_ {_texticonhser_}
+_textDatepage_ {_texticonhdate_}
+_textHowtopage_ {_texticonhhow_}
+_textOrganizationpage_ {_texticonhorg_}
+_textBrowsepage_ {_texticonhbrwse_}
+_textPeoplepage_ {_texticonhpeople_}
+_textLanguagepage_ {_texticonhlanguage_}
+_textAcronympage_ {_texticonhacronym_}
+_textPhrasepage_ {_texticonhphrases_}
+_textArtistpage_ {_texticonhartist_}
+_textSourcepage_ {_texticonhsrc_}
+_textKeywordpage_ {_texticonhkw_}
+
+#######################################################################
+# navigation arrows
+#
+#######################################################################
+
+_navarrows_ {<center>
+<table width=_pagewidth_ cellpadding=0 cellspacing=0 border=0>
+<tr><td align=left valign=top>
+_prevarrow_
+</td><td align=right valign=top>
+_nextarrow_
+</td></tr></table>
+</center>
+}
+
+_prevarrow_ {_If_(_httpprevarrow_,<a href="_httpprevarrow_">_iconprev_</a>)}
+_nextarrow_ {_If_(_httpnextarrow_,<a href="_httpnextarrow_">_iconnext_</a>)}
+
+_navarrows_ [v=1] {<p>
+_prevarrow_<br>
+_nextarrow_
+}
+
+#######################################################################
+# the goto form
+#######################################################################
+
+_gotoform_ {
+<form name="GotoForm" method="get" action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="d" value="_cgiargd_">
+<input type=hidden name="cl" value="_cgiargcl_">
+<input type="text" name="gp" size="3" maxlength="4">
+<input type="submit" value="_textgoto_">
+</form>
+}
+
+_textnumpages_ {&nbsp;<i>(_1_ _pages_)</i>}
+_parentarrow_ {}
+
+
+#######################################################################
+# the phind applet
+#
+# The phind applet is only required on phind classifier pages.
+# Consequently, the _phindclassifier_ macro is not usually set.  On screens
+# where it is required, _phindclassifier_ resolves to _phindapplet_, and
+# the following macro is loaded into the web page.
+#######################################################################
+
+_phindapplet_ {
+<APPLET CODEBASE="_httpprefix_/bin/java" CODE="org.nzdl.gsdl.Phind.Phind.class" ARCHIVE="Phind.jar" WIDTH=500 HEIGHT=400>
+  <PARAM NAME=library      VALUE="_gwcgi_?e=_compressedoptions_">
+  <PARAM NAME=phindcgi     VALUE="_gwcgi_?a=phind">
+  <PARAM NAME=collection   VALUE="_cgiargc_">
+  <PARAM NAME=classifier   VALUE="_phindnumber_">
+
+  <PARAM NAME=orientation  VALUE="vertical">
+  <PARAM NAME=depth        VALUE="2">
+  <PARAM NAME=resultorder VALUE="L,l,E,e,D,d">
+
+  <PARAM NAME=backdrop     VALUE="_httpimg_/phindbg1.jpg">
+  <PARAM NAME=fontsize     VALUE="10">
+  <PARAM NAME=blocksize    VALUE="10">
+
+  The Phind java applet.
+</APPLET>
+}
+
+
+#######################################################################
+# icons
+#######################################################################
+
+# title images - there should be one of these for each classification
+# supported by this receptionist
+
+_iconTitlepage_ {<img src="_httpiconhtitle_" width=_widthhtitle_
+height=_heighthtitle_}
+_iconTitlepage_ [v=1] {<h2>_texticonhtitle_</h2>}
+
+_iconListpage_ {<img src="_httpiconhlist_" width=_widthhlist_
+height=_heighthlist_}
+_iconListpage_ [v=1] {<h2>_texticonhlist_</h2>}
+
+_iconCreatorpage_ {<img src="_httpiconhauth_" width=_widthhauth_
+height=_heighthauth_}
+_iconCreatorpage_ [v=1] {<h2>_texticonhauth_</h2>}
+
+_iconSubjectpage_ {<img src="_httpiconhsubj_" width=_widthhsubj_
+height=_heighthsubj_}
+_iconSubjectpage_ [v=1] {<h2>_texticonhsubj_</h2>}
+
+_iconTopage_ {<img src="_httpiconhto_" width=_widthhto_
+height=_heighthto_}
+_iconTopage_ [v=1] {<h2>_texticonhto_</h2>}
+
+_iconFrompage_ {<img src="_httpiconhfrom_" width=_widthhfrom_
+height=_heighthfrom_}
+_iconFrompage_ [v=1] {<h2>_texticonhfrom_</h2>}
+
+_iconSeriespage_ {<img src="_httpiconhser_" width=_widthhser_
+height=_heighthser_}
+_iconSeriespage_ [v=1] {<h2>_texticonhser_</h2>}
+
+_iconDatepage_ {<img src="_httpiconhdate_" width=_widthhdate_
+height=_heighthdate_}
+_iconDatepage_ [v=1] {<h2>_texticonhdate_</h2>}
+
+_iconHowtopage_ {<img src="_httpiconhhow_" width=_widthhhow_
+height=_heighthhow_}
+_iconHowtopage_ [v=1] {<h2>_texticonhhow_</h2>}
+
+_iconTopicpage_ {<img src="_httpiconhtopic_" width=_widthhtopic_
+height=_heighthtopic_}
+_iconTopicpage_ [v=1] {<h2>_texticonhtopic_</h2>}
+
+_iconOrganizationpage_ {<img src="_httpiconhorg_" width=_widthhorg_
+height=_heighthorg_}
+_iconOrganizationpage_ [v=1] {<h2>_texticonhorg_</h2>}
+
+_iconBrowsepage_ {<img src="_httpiconhbrwse_" width=_widthhbrwse_
+height=_heighthbrwse_}
+_iconBrowsepage_ [v=1] {<h2>_texticonhbrwse_</h2>}
+
+_iconPeoplepage_ {<img src="_httpiconhpeople_" width=_widthhpeople_
+height=_heighthpeople_}
+_iconPeoplepage_ [v=1] {<h2>_texticonhpeople_</h2>}
+
+_iconLanguagepage_ {<img src="_httpiconhlanguage_" width=_widthhlanguage_
+height=_heighthlanguage_}
+_iconLanguagepage_ [v=1] {<h2>_texticonhlanguage_</h2>}
+
+_iconAcronympage_ {<img src="_httpiconhacronym_" width=_widthhacronym_
+height=_heighthacronym_}
+_iconAcronympage_ [v=1] {<h2>_texticonhacronym_</h2>}
+
+_iconPhrasepage_ {<img src="_httpiconhphrse_" width=_widthhphrse_
+height=_heighthphrse_}
+_iconPhrasepage_ [v=1] {<h2>_texticonhphrse_</h2>}
+
+_iconArtistpage_ {<img src="_httpiconhartist_" width=_widthhartist_
+height=_heighthartist_}
+_iconArtistpage_ [v=1] {<h2>_texticonhartist_</h2>}
+
+_iconSourcepage_ {<img src="_httpiconhsrc_" width=_widthhsrc_
+height=_heighthsrc_}
+_iconSourcepage_ [v=1] {<h2>_texticonhsrc_</h2>}
+
+_iconKeywordpage_ {<img src="_httpiconhkw_" width=_widthhkw_
+height=_heighthkw_}
+_iconKeywordpage_ [v=1] {<h2>_texticonhkw_</h2>}
+
+
+_iconsmalltext_ {<img src="_httpiconsmtext_" border=0 width=_widthsmtext_ height=_heightsmtext_ alt="_texticonsmalltext_">}
+_iconsmalltext_ [v=1] {<small><b>_texticonsmalltext2_</b></small>}
+
+_iconarrowsmalltext_ {<img src="_httpiconasmtext_" border=0 width=_widthasmtext_ height=_heightasmtext_ alt="_texticonsmalltext_">}
+_iconarrowsmalltext_ [v=1] {<small><b>->_texticonsmalltext2_</b></small>}
+
+_iconclosedfolder_ {<img src="_httpiconclsdfldr_" border=0 width=_widthclsdfldr_ height=_heightclsdfldr_ alt="_texticonclosedfolder_">}
+_iconclosedfolder_ [v=1] {<small><b>_texticonclosedfolder2_</b></small>}
+
+_iconarrowclosedfolder_ {<img src=_httpiconaclsdfdr_" border=0 width=_widthaclsdfdr_ height=_heightaclsdfdr_ alt="_texticonclosedfolder_">}
+_iconarrowclosedfolder_ [v=1] {<small><b>->_texticonclosedfolder2_</b></small>}
+
+_iconopenfolder_ {<img src="_httpiconopenfldr_" border=0 width=_widthopenfldr_ height=_heightopenfldr_ alt="_texticonopenfolder_">}
+_iconopenfolder_ [v=1] {<small><b>_texticonopenfolder2_</b></small>}
+
+_iconarrowopenfolder_ {<img src="_httpiconaopenfdr_" border=0 width=_widthaopenfdr_ height=_heightaopenfdr_ alt="_texticonopenfolder_">}
+_iconarrowopenfolder_ [v=1] {<small><b>->_texticonopenfolder2_</b></small>}
+
+_iconarrowclosedbook_ {<img src="_httpiconabook_" width=_widthabook_ height=_heightabook_ border=0 alt="_texticonclosedbook_">}
+_iconarrowclosedbook_ [v=1] {<small><b>->_texticonclosedbook_: </b></small>}
+
+_iconopenbook_ {<img src="_httpiconopenbook_" width=_widthopenbook_ height=_heightopenbook_ border=0 alt="_texticonopenbook_">}
+_iconopenbook_ [v=1] {<small><b>_texticonopenbook_: </b></small>}
+
+_iconarrowopenbook_ {<img src="_httpiconaopenbk_" width=_widthaopenbk_ height=_heightaopenbk_ border=0 alt="_texticonopenbook_">}
+_iconarrowopenbook_ [v=1] {<small><b>->_texticonopenbook_: </b></small>}
+
+_iconopenbookshelf_ {<img src="_httpiconbshelf_" border=0 width=_widthbshelf_ height=_heightbshelf_ alt="_texticonopenbookshelf_">}
+_iconopenbookshelf_ [v=1] {<small><b>_texticonopenbookshelf_: </b></small>}
+
+_iconarrowopenbookshelf_ {<img src="_httpiconabshelf_" border=0 width=_widthabshelf_ height=_heightabshelf_ alt="_texticonopenbookshelf_">}
+_iconarrowopenbookshelf_ [v=1] {<small><b>->_texticonopenbookshelf_: </b></small>}
+
+_iconclosedbookshelf_ {<img src="_httpiconbshelf_" border=0 width=_widthbshelf_ height=_heightbshelf_ alt="_texticonclosedbookshelf_">}
+_iconclosedbookshelf_ [v=1] {<small><b>_texticonclosedbookshelf_: </b></small>}
+
+_iconarrowclosedbookshelf_ {<img src="_httpiconabshelf_" border=0 width=_widthabshelf_ height=_heightabshelf_ alt="_texticonclosedbookshelf_">}
+_iconarrowclosedbookshelf_ [v=1] {<small><b>->_texticonclosedbookshelf_: </b></small>}
+
+_iconpointer_ {<img src="_httpiconarrrght_" border=0 width=_widtharrrght_ height=_heightarrrght_>}
+_iconpointer_ [v=1] {<small><b>_texticonpointer_-> </b></small>}
+
+_icontab_ {<img src="_httpicontabspace_" width=_widthtabspace_ height=_heighttabspace_>}
+_tab_ {<td>_icontab_</td>}
+
+_iconwarning_ {<img src="_httpiconwarning_" width=_widthwarning_ height=_heightwarning_ border=0 align=left>}
+_iconwarning_ [v=1] {_texticonwarning_}
+
+
+#######################################################################
+# images
+#######################################################################
+
+# can't use _gsimage_ macro for detach button as we need to include target
+_imagedetach_ {<a href="_httpcurrentdocument_&x=1" target=\_blank onMouseover="roll('detach',1);" onMouseOut="roll('detach',0);"><img
+name="detach" src="_httpiconedtchof_" onLoad="gbutton(this,'_httpiconedtchon_');" border=0 alt="_texticondetach_"></a>}
+_imagedetach_ [v=1] {<a href="_httpcurrentdocument_&x=1" target=\_blank>_texticondetach_</a><br>}
+
+_imagehighlight_ {_gsimage_(_httpcurrentdocument_&hl=1&gc=_cgiarggc_&amp;gt=_cgiarggt_,_document:httpiconehlof_,_document:httpiconehlon_,hl,_document:texticonhighlight_)}
+
+_imagenohighlight_ {_gsimage_(_httpcurrentdocument_&hl=0&gc=_cgiarggc_&amp;gt=_cgiarggt_,_document:httpiconenhlof_,_document:httpiconenhlon_,nhl,_document:texticonnohighlight_)}
+
+_imagecontracttoc_ {_gsimage_(_httpcurrentdocument_&gc=0,_document:httpiconeconcof_,_document:httpiconeconcon_,concon,_document:texticoncontracttoc_)}
+
+_imageexpandtoc_ {_gsimage_(_httpcurrentdocument_&gc=1,_document:httpiconeexpcof_,_document:httpiconeexpcon_,expcon,_document:texticonexpandtoc_)}
+
+_imagecontracttext_ {_gsimage_(_httpcurrentdocument_&amp;gt=0,_document:httpiconetsecof_,_document:httpiconetsecon_,thissec,_document:texticoncontracttext_)}
+
+_imageexpandtext_ {_gsimage_(_httpcurrentdocument_&amp;gt=1,_document:httpiconealltof_,_document:httpiconeallton_,alltext,_document:texticonexpandtext_)}
+
+_imagecont_ {_gsimage_(_httpcurrentdocument_&amp;gt=2,_document:httpiconcontoff_,_document:httpiconconton_,cont,_document:texticoncont_)}
+
+
+#######################################################################
+# headers/footers
+#######################################################################
+
+
+# header overridden for text pages
+# the tabspace is there because netscape refuses to let our flashy button
+# javacript stuff work on a button that is the first image in the page
+_textheader_ {_cgihead_
+_htmlhead_
+<center>
+<table width=_pagewidth_><tr><td align=right>
+_icontab__javalinks_</td></tr></table>
+</center>
+}
+_textheader_ [v=1] {_cgihead_
+_htmlhead_
+_javalinks_
+}
+
+_footer_ {
+<p>
+_navarrows_
+</table>
+_endspacer__htmlfooter_
+}
Index: /main/tags/2.38/gsdl/macros/dutch.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/dutch.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/dutch.dm	(revision 21083)
@@ -0,0 +1,919 @@
+######################################################################
+#
+# Dutch Language text and icon macros, translated 8.9.2000
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ {macro value}
+# Everything between the {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\{' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=nl] {De vereisde pagina kon niet worden gevonden. 
+Gebruik de terug knop van de browser of de home knop om naar de hoofdpagina 
+van de Greenstone Digitale Bibliotheek terug te keren.}
+
+_textdefaulttitle_ [l=nl] {GSDL Error}
+
+_collectionextra_ [l=nl] {Deze collectie bevat _about:numdocs_ documenten. 
+De collectie werd _about:builddate_ dagen geleden vervaardigd.}
+
+_textimagecollection_ [l=nl] {}
+_textimageabout_ [l=nl] {Informatie-pagina}
+_textimagehome_ [l=nl] {Hoofdpagina}
+_textimagehelp_ [l=nl] {Helppagina}
+_textimagepref_ [l=nl] {Preferenctie-pagina}
+_textimagegreenstone_ [l=nl] {Greenstone Digital Library Software}
+
+_textimagesearch_ [l=nl] {Zoeken specifieke termen}
+_textimageTitle_ [l=nl] {Browsen titels in alfabetische orde}
+_textimageList_ [l=nl] {Browsen documenten lijst}
+_textimageCreator_ [l=nl] {Browsen alfabeitsche lijst van auteurs}
+_textimageSeries_ [l=nl] {Browsen volgens uitgaven}
+_textimageDate_ [l=nl] {Browsen volgens datum}
+_textimageSubject_ [l=nl] {Browsen volgens onderwerpen}
+_textimageTo_ [l=nl] {Browsen volgens geadresseerde}
+_textimageFrom_ [l=nl] {Browsen volges afzender}
+_textimageOrganization_ [l=nl] {Browsen volgens organisaties}
+_textimageHowto_ [l=nl] {Browsen volgens help onderwerpen}
+_textimageTopic_ [l=nl] {Browsen volgens speciale themas}
+_textimageBrowse_ [l=nl] {Browsen}
+_textimagePeople_ [l=nl] {Browsen alfabetische personenlijst}
+_textimageLanguage_ [l=nl] {Browsen volgens taal}
+_textimageAcronym_ [l=nl] {Browsen volgens afkortingen}
+
+_texticontabsearchgreen_ [l=nl] {Zoeken}
+_texticontabdategreen_ [l=nl] {Datums}
+_texticontabseriesgreen_ [l=nl] {Reeksen}
+_texticontabauthorgreen_ [l=nl] {Auteurs A-Z}
+_texticontabtitlegreen_ [l=nl] {Titels A-Z}
+_texticontablistgreen_ [l=nl] {Lijsten}
+_texticontabsubjectgreen_ [l=nl] {Onderwerpen}
+_texticontabtogreen_ [l=nl] {Geadresseerde}
+_texticontabfromgreen_ [l=nl] {Afzender}
+_texticontaborggreen_ [l=nl] {Organisatie}
+_texticontabhowgreen_ [l=nl] {Help}
+_texticontabtopicgreen_ [l=nl] {Themas}
+_texticontabbrwsegreen_ [l=nl] {Browsen}
+_texticontabPeoplegreen_ [l=nl] {Personen A-Z}
+_texticontabLanguagegreen_ [l=nl] {Taalen}
+_texticontabAcronymgreen_ [l=nl] {Afkortingen}
+
+_texticontext_ [l=nl] {Documenten weergeven}
+_texticonclosedbook_ [l=nl] {Dokument openen en inhoud op het scherm brengen}
+_texticonnext_ [l=nl] {naar de volgende sectie}
+_texticonprev_ [l=nl] {naar de vooafgaande sectie}
+
+_page_ [l=nl] {pagina }
+_pages_ [l=nl] {paginas}
+_of_ [l=nl] { uit }
+_vol_ [l=nl] {Deel}
+_num_ [l=nl] {Nummer}
+
+_textmonth00_ [l=nl] {}
+_textmonth01_ [l=nl] {Januari}
+_textmonth02_ [l=nl] {Februari}
+_textmonth03_ [l=nl] {Maart}
+_textmonth04_ [l=nl] {April}
+_textmonth05_ [l=nl] {Mei}
+_textmonth06_ [l=nl] {Juni}
+_textmonth07_ [l=nl] {Juli}
+_textmonth08_ [l=nl] {Augustus}
+_textmonth09_ [l=nl] {September}
+_textmonth10_ [l=nl] {Oktober}
+_textmonth11_ [l=nl] {November}
+_textmonth12_ [l=nl] {December}
+
+_Document_ [l=nl] {Document}
+_Section_ [l=nl] {Sectie}
+_Paragraph_ [l=nl] {Alinea}
+
+_magazines_ [l=nl] {tijdschriften}
+
+_nzdlpagefooter_ [l=nl] {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">New Zealand Digital Library Project</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Department of Computer Science</a>, 
+<a href="http://www.waikato.ac.nz">University of Waikato</a>, 
+New Zealand}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "HOOFDPAGINA" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=nl] {_httpimg_/nl/chomeof.gif}
+_httpiconchomeon_ [l=nl] {_httpimg_/nl/chomeon.gif}
+
+## "HELP" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=nl] {_httpimg_/nl/chelpof.gif}
+_httpiconchelpon_ [l=nl] {_httpimg_/nl/chelpon.gif}
+
+## "PREFERENTIES" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=nl] {_httpimg_/nl/cprefof.gif}
+_httpiconcprefon_ [l=nl] {_httpimg_/nl/cprefon.gif}
+
+## "help" ## green_title ## h_help ##
+_httpiconhhelp_ [l=nl] {_httpimg_/nl/h\_help.gif}
+_widthhhelp_ [l=nl] {200}
+_heighthhelp_ [l=nl] {57}
+
+## "auteurs a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=nl] {_httpimg_/nl/tauthgr.gif}
+_httpicontauthof_ [l=nl] {_httpimg_/nl/tauthof.gif}
+_httpicontauthon_ [l=nl] {_httpimg_/nl/tauthon.gif}
+_widthtauthx_ [l=nl] {100}
+
+## "reksen" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=nl] {_httpimg_/nl/tsergr.gif}
+_httpicontserof_ [l=nl] {_httpimg_/nl/tserof.gif}
+_httpicontseron_ [l=nl] {_httpimg_/nl/tseron.gif}
+_widthtserx_ [l=nl] {87}
+
+## "datums" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=nl] {_httpimg_/nl/tdategr.gif}
+_httpicontdateof_ [l=nl] {_httpimg_/nl/tdateof.gif}
+_httpicontdateon_ [l=nl] {_httpimg_/nl/tdateon.gif}
+_widthtdatex_ [l=nl] {87}
+
+## "onderwerpen" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=nl] {_httpimg_/nl/tsubjgr.gif}
+_httpicontsubjon_ [l=nl] {_httpimg_/nl/tsubjon.gif}
+_httpicontsubjof_ [l=nl] {_httpimg_/nl/tsubjof.gif}
+_widthtsubjx_ [l=nl] {110}
+
+## "geadresseerde" ## nav_bar_button ## tto ##
+_httpiconttogr_ [l=nl] {_httpimg_/nl/ttogr.gif}
+_httpiconttoon_ [l=nl] {_httpimg_/nl/ttoon.gif}
+_httpiconttoof_ [l=nl] {_httpimg_/nl/ttoof.gif}
+_widthttox_ [l=nl] {122}
+
+## "afzender" ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ [l=nl] {_httpimg_/nl/tfromgr.gif}
+_httpicontfromon_ [l=nl] {_httpimg_/nl/tfromon.gif}
+_httpicontfromof_ [l=nl] {_httpimg_/nl/tfromof.gif}
+_widthtfromx_ [l=nl] {87}
+
+## "organisatie" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=nl] {_httpimg_/nl/torggr.gif}
+_httpicontorgon_ [l=nl] {_httpimg_/nl/torgon.gif}
+_httpicontorgof_ [l=nl] {_httpimg_/nl/torgof.gif}
+_widthtorgx_ [l=nl] {94}
+
+## "help onderwerpen" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=nl] {_httpimg_/nl/thowgr.gif}
+_httpiconthowon_ [l=nl] {_httpimg_/nl/thowon.gif}
+_httpiconthowof_ [l=nl] {_httpimg_/nl/thowof.gif}
+_widththowx_ [l=nl] {151}
+
+## "thema" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=nl] {_httpimg_/nl/ttopicgr.gif}
+_httpiconttopicon_ [l=nl] {_httpimg_/nl/ttopicon.gif}
+_httpiconttopicof_ [l=nl] {_httpimg_/nl/ttopicof.gif}
+_widthttopicx_ [l=nl] {87}
+
+## "browsen" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=nl] {_httpimg_/nl/tbrwsegr.gif}
+_httpicontbrwseon_ [l=nl] {_httpimg_/nl/tbrwseon.gif}
+_httpicontbrwseof_ [l=nl] {_httpimg_/nl/tbrwseof.gif}
+_widthtbrwsex_ [l=nl] {87}
+
+## "zoeken" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=nl] {_httpimg_/nl/tsrchgr.gif}
+_httpicontsrchof_ [l=nl] {_httpimg_/nl/tsrchof.gif}
+_httpicontsrchon_ [l=nl] {_httpimg_/nl/tsrchon.gif}
+_widthtsrchx_ [l=nl] {87}
+
+## "titels a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=nl] {_httpimg_/nl/ttitlgr.gif}
+_httpiconttitlof_ [l=nl] {_httpimg_/nl/ttitlof.gif}
+_httpiconttitlon_ [l=nl] {_httpimg_/nl/ttitlon.gif}
+_widthttitlx_ [l=nl] {87}
+
+## "personen" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=nl] {_httpimg_/nl/tpeopgr.gif}
+_httpicontpeopof_ [l=nl] {_httpimg_/nl/tpeopof.gif}
+_httpicontpeopon_ [l=nl] {_httpimg_/nl/tpeopon.gif}
+_widthtpeopx_ [l=nl] {87}
+
+## "taal" ## nav_bar_button ## tlang ##
+_httpicontlanggr_ [l=nl] {_httpimg_/nl/tlanggr.gif}
+_httpicontlangon_ [l=nl] {_httpimg_/nl/tlangon.gif}
+_httpicontlangof_ [l=nl] {_httpimg_/nl/tlangof.gif}
+_widthtlangx_ [l=nl] {87}
+
+## "afkortingen" ## nav_bar_button ## tacro ##
+_httpicontacrogr_ [l=nl] {_httpimg_/nl/tacrogr.gif}
+_httpicontacroof_ [l=nl] {_httpimg_/nl/tacroof.gif}
+_httpicontacroon_ [l=nl] {_httpimg_/nl/tacroon.gif}
+_widthtacrox_ [l=nl] {98}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=nl] {informatie over deze collectie}
+
+_textsubcols1_ [l=nl] {<p>De volledige collectie bevat _1_ subcollecties:
+<blockquote>}
+
+_textsubcols2_ [l=nl] {</blockquote>
+Voor het controleren en veranderen van subcollecties in gebruik 
+ga naar de preferentie pagina.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "informatie" ## green_title ## h_about ##
+_httpiconhabout_ [l=nl] {_httpimg_/nl/h\_about.gif}
+_widthhabout_ [l=nl] {200}
+_heighthabout_ [l=nl] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=nl] {Titels A-Z}
+_texticonhauth_ [l=nl] {Auteurs A-Z}
+_texticonhsubj_ [l=nl] {Onderwerpen}
+_texticonhto_ [l=nl] {Geadresseerde}
+_texticonhfrom_ [l=nl] {Afzender}
+_texticonhser_ [l=nl] {Reeksen}
+_texticonhdate_ [l=nl] {Datums}
+_texticonhhow_ [l=nl] {Help onderwerpen}
+_texticonhorg_ [l=nl] {Organizaties}
+_texticonhbrwse_ [l=nl] {Browsen}
+_texticonhpeople_ [l=nl] {Personen A-Z}
+_texticonhlanguage_ [l=nl] {Taalen}
+_texticonhacronym_ [l=nl] {Afkortingen}
+
+_texticonopenbookshelf_ [l=nl] {Sluit dit gedeelte van de bibliotheek}
+_texticonclosedbookshelf_ [l=nl] {Open dit tgedeelte van de bibliotheek en bring de inhoud op het scherm.}
+_texticonopenbook_ [l=nl] {Sluit dit boek}
+_texticonclosedfolder_ [l=nl] {Open deze map en breng de inhoud op het scherm}
+_texticonclosedfolder2_ [l=nl] {Open deze onder-sectie:}
+_texticonopenfolder_ [l=nl] {Sluit deze map: }
+_texticonopenfolder2_ [l=nl] {Sluit deze onder sectie: }
+_texticonsmalltext_ [l=nl] {Geef deze sectie van de tekst weer}
+_texticonsmalltext2_ [l=nl] {Geef tekst weer: }
+_texticonpointer_ [l=nl] {Actueele sectie}
+_texticondetach_ [l=nl] {Open en nieuw venster voor deze pagina}
+_texticonhighlight_ [l=nl] {Accentueer zoek termen}
+_texticonnohighlight_ [l=nl] {Accentueer zoek termen niet}
+_texticoncontracttoc_ [l=nl] {Inhoudsopgave inkorten}
+_texticonexpandtoc_ [l=nl] {Inhouds opgave uitbreiden}
+_texticonexpandtext_ [l=nl] {Hele tekst weergeven}
+_texticoncontracttext_ [l=nl] {Alleen maar geselecteerde tekst weergeven}
+_texticonwarning_ [l=nl] {<b>Waarschuiving: </b>}
+_texticoncont_ [l=nl] {Voortzetten?}
+
+_textltwarning_ [l=nl] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Het Uitbreiden van deze tekst zal 
+een grote hoeveelheid data produceeren om _imagecont_ door de browser 
+weer te geven.
+</td></tr></table></center>
+}
+
+_textgoto_ [l=nl] {Ga naar pagina}
+_textintro_ [l=nl] { <i>(Inleidende tekst)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "titels a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=nl] {_httpimg_/nl/h\_title.gif}
+_widthhtitle_ [l=nl] {200}
+_heighthtitle_ [l=nl] {57}
+
+## "auteurs a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=nl] {_httpimg_/nl/h\_auth.gif}
+_widthhauth_ [l=nl] {200}
+_heighthauth_ [l=nl] {57}
+
+## "onderwerpen" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=nl] {_httpimg_/nl/h\_subj.gif}
+_widthhsubj_ [l=nl] {200}
+_heighthsubj_ [l=nl] {57}
+
+## "geadresseerde" ## green_title ## h_to ##
+_httpiconhto_ [l=nl] {_httpimg_/nl/h\_to.gif}
+_widthhto_ [l=nl] {200}
+_heighthto_ [l=nl] {57}
+
+## "afzenders" ## green_title ## h_from ##
+_httpiconhfrom_ [l=nl] {_httpimg_/nl/h\_from.gif}
+_widthhfrom_ [l=nl] {200}
+_heighthfrom_ [l=nl] {57}
+
+## "reeksen" ## green_title ## h_ser ##
+_httpiconhser_ [l=nl] {_httpimg_/nl/h\_ser.gif}
+_widthhser_ [l=nl] {200}
+_heighthser_ [l=nl] {57}
+
+## "datums" ## green_title ## h_date ##
+_httpiconhdate_ [l=nl] {_httpimg_/nl/h\_date.gif}
+_widthhdate_ [l=nl] {200}
+_heighthdate_ [l=nl] {57}
+
+## "help onderwerpen" ## green_title ## h_how ##
+_httpiconhhow_ [l=nl] {_httpimg_/nl/h\_how.gif}
+_widthhhow_ [l=nl] {200}
+_heighthhow_ [l=nl] {57}
+
+## "themas" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=nl] {_httpimg_/nl/h\_topic.gif}
+_widthhtopic_ [l=nl] {200}
+_heighthtopic_ [l=nl] {57}
+
+## "organisaties" ## green_title ## h_org ##
+_httpiconhorg_ [l=nl] {_httpimg_/nl/h\_org.gif}
+_widthhorg_ [l=nl] {250}
+_heighthorg_ [l=nl] {57}
+
+## "browsen" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=nl] {_httpimg_/nl/h\_brwse.gif}
+_widthhbrwse_ [l=nl] {200}
+_heighthbrwse_ [l=nl] {57}
+
+## "personen" ## green_title ## h_people ##
+_httpiconhpeople_ [l=nl] {_httpimg_/nl/h\_people.gif}
+_widthhpeople_ [l=nl] {200}
+_heighthpeople_ [l=nl] {57}
+
+## "taalen" ## green_title ## h_lang ##
+_httpiconhlanguage_ [l=nl] {_httpimg_/nl/h\_lang.gif}
+_widthhlanguage_ [l=nl] {200}
+_heighthlanguage_ [l=nl] {57}
+
+## "afkortingen" ## green_title ## h_acro ##
+_httpiconhacronym_ [l=nl] {_httpimg_/nl/h\_acro.gif}
+_widthhacronym_ [l=nl] {200}
+_heighthacronym_ [l=nl] {57}
+
+## "VOORTZETTEN?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=nl] {_httpimg_/nl/contof.gif}
+_httpiconconton_ [l=nl] {_httpimg_/nl/conton.gif}
+
+## "     TEKST
+#UITBREIDEN" ## document_button ## eallt ## 
+_httpiconealltof_ [l=nl] {_httpimg_/nl/ealltof.gif}
+_httpiconeallton_ [l=nl] {_httpimg_/nl/eallton.gif}
+
+## "  INHOUD
+#INKRIMPEN" ## document_button ## econc ##
+_httpiconeconcof_ [l=nl] {_httpimg_/nl/econcof.gif}
+_httpiconeconcon_ [l=nl] {_httpimg_/nl/econcon.gif}
+
+## "  NIEUW
+#VENSTER" ## document_button ## edtch ##
+_httpiconedtchof_ [l=nl] {_httpimg_/nl/edtchof.gif}
+_httpiconedtchon_ [l=nl] {_httpimg_/nl/edtchon.gif}
+
+## "  INHOUD 
+#UITBREIDEN" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=nl] {_httpimg_/nl/eexpcof.gif}
+_httpiconeexpcon_ [l=nl] {_httpimg_/nl/eexpcon.gif}
+
+## "   TEKST
+#INKRIMPEN" ## document_button ## etsec ##
+_httpiconetsecof_ [l=nl] {_httpimg_/nl/etsecof.gif}
+_httpiconetsecon_ [l=nl] {_httpimg_/nl/etsecon.gif}
+
+## "ACCENTUEREN" ## document_button ## ehl ##
+_httpiconehlof_ [l=nl] {_httpimg_/nl/ehlof.gif}
+_httpiconehlon_ [l=nl] {_httpimg_/nl/ehlon.gif}
+
+## "        NIET
+#ACCENTUEREN" ## document_button ## enhl ##
+_httpiconenhlof_ [l=nl] {_httpimg_/nl/enhlof.gif}
+_httpiconenhlon_ [l=nl] {_httpimg_/nl/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=nl] {_If_(_thislast_, _thisfirst_ - _thislast_ resultaten voor de zoekactie: _cgiargq_,geen resultaat voor de zoekactie: _cgiargq_)}
+_textnoquerytitle_ [l=nl] {Zoek pagina}
+
+_texticonthispage_ [l=nl] {doorzoeken van}
+_textsome_ [l=nl] {_If_(_cgiargb_,gestaffelde,somige)}
+_textall_ [l=nl] {_If_(_cgiargb_,boolse,alle)}
+_texticonqueryresultsbar_ [l=nl] {}
+_textfreqmsg1_ [l=nl] {aantal woorden: }
+_textpostprocess_ [l=nl] {_If_(_quotedquery_,<br><i>verder verwerkt om _quotedquery_ te vinden</i>
+)}
+
+_textmorethan_ [l=nl] {Meer dan }
+_textapprox_ [l=nl] {Ongeveer }
+_textnodocs_ [l=nl] {Geen documenten gevonden.}
+_text1doc_ [l=nl] {1 document gevonden.}
+_textlotsdocs_ [l=nl] {documenten gevonden.}
+_textmatches_ [l=nl] {passende teksten }
+_textbeginsearch_ [l=nl] {Begin zoekactie}
+
+# _hselection_, _jselection_ and _nselection_ are set from within the server
+# some or all of them may remain unset
+_textsimplesearch_ [l=nl] {Doorzoek _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_gselection_, op het _gselection_ niveau)_If_(_nselection_, in _nselection_ taal) 
+naar _querytypeselection_ van de volgende woorden}
+
+_textadvancedsearch_ [l=nl] {Doorzoek _If_(_hselection_, _hselection_, _defaultindextext_)_If_(_jselection_,_textjselect_)_If_(_gselection_, op het _gselection_ niveau)_If_(_nselection_, in _nselection_ taal) 
+met een _querytypeselection_ zoekvraag}
+
+_textjselect_ [l=nl] {_If_(_hselection_, of) _jselection_}
+
+_textstemon_ [l=nl] { (Woord einden negeeren)}
+_textsearchhistory_ [l=nl] {Vroegere zoekacties doorzoeken}
+_textnohistory_ [l=nl] {Vroegere zoekacties zijn niet beschikbaar}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "zoeken" ## green_title ## h_search ##
+_httpiconhsearch_ [l=nl] {_httpimg_/nl/h\_search.gif}
+_widthhsearch_ [l=nl] {200}
+_heighthsearch_ [l=nl] {57}
+
+## "resultaten" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=nl] {_httpimg_/nl/qryresb.gif}
+_widthqryresb_ [l=nl] {_pagewidth_}
+_heightqryresb_ [l=nl] {17}
+
+## "weergave" ## hand_made ##
+_httpicondisplay_ [l=nl] {_httpimg_/display.gif}
+_widthdisplay_ [l=nl] {60}
+_heightdisplay_ [l=nl] {20}
+
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsearchprefs_ [l=nl] {Zoek preferenties}
+_textcollectionprefs_ [l=nl] {Collectie preferenties}
+_textpresentationprefs_ [l=nl] {Presentatie preferenties}
+_textpreferences_ [l=nl] {Preferenties}
+_textignorecase_ [l=nl] { Negeer Hoofdletters}
+_textmatchcase_ [l=nl] { Kleine letters en hoofdletters moeten exact overeenstemmen}
+_textstem_ [l=nl] { Negeer woord einden }
+_textnostem_ [l=nl] { Geheel woord moet overeenstemmen}
+_textprefop_ [l=nl] {Weergeven van maximaal _maxdocoption_ treffers met maximaal _hitsperpageoption_ treffers per pagina.}
+_textextlink_ [l=nl] {Toegang tot externe Web paginas: }
+_textintlink_ [l=nl] {Bronnen documenten opgevraagd van:}
+_textlanguage_ [l=nl] {Interface taal: }
+_textencoding_ [l=nl] {Encodering: }
+_textformat_ [l=nl] {Interface formaat: }
+_textall_ [l=nl] {alle}
+_textsimplemode_ [l=nl] { Eenvoudige zoek modus}
+_textadvancedmode_ [l=nl] { Geavanceerde zoek modus (zoek termen gekombineerd met boolse termen mogelijk b.v. !, &, |, en parentheses)}
+_textlinkinterm_ [l=nl] {via tussen pagina}
+_textlinkdirect_ [l=nl] {Ga direct naar de Webpagina}
+_textdigitlib_ [l=nl] {de digitale bibliotheek}
+_textweb_ [l=nl] {Het Web}
+_textgraphical_ [l=nl] {Grafisch}
+_texttextual_ [l=nl] {Tekst}
+_textcollectionoption_ [l=nl] {<p>
+Ondercollecties die ingesloten moeten worden:
+<br>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "preferenties" ## green_title ## h_pref ##
+_httpiconhpref_ [l=nl] {_httpimg_/nl/h\_pref.gif}
+_widthhpref_ [l=nl] {200}
+_heighthpref_ [l=nl] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=nl] {Help}
+_textSearchshort_ [l=nl] {naar bepaalde woorden zoeken}
+_textSeriesshort_ [l=nl] {publicaties gesorteerd volgens reksen}
+_textDateshort_ [l=nl] {publicaties gesorteerd volgens datum}
+_textSubjectshort_ [l=nl] {publicaties gesorteerd volgens onderwerpen}
+_textToshort_ [l=nl] {publicaties gesorteerd volgens geadresseerden}
+_textFromshort_ [l=nl] {publicaties gesorteerd volgens afzenders}
+_textTitleshort_ [l=nl] {publicaties gesorteerd volgens titels}
+_textBrowseshort_ [l=nl] {alle publicaties}
+_textCreatorshort_ [l=nl] {publicaties gesorteerd volgens auteurs}
+_textOrganizationshort_ [l=nl] {publicaties gesorteerd volgens organisaties}
+_textHowtoshort_ [l=nl] {publicaties gesorteerd volgens help onderwerpen}
+_textTopicshort_ [l=nl] {publicaties gesorteerd volgens themas}
+_textPeopleshort_ [l=nl] {publicaties gesorteerd volgens personen}
+_textLanguageshort_ [l=nl] {publicaties gesorteerd volgens taalen}
+_textAcronymshort_ [l=nl] {publicaties gesorteerd volgens afkortingen}
+_textdefaultshorttext_ [l=nl] {ongedefineerde classificatie}
+
+_textSearchlong_ [l=nl] { <p>U kunt <i>naar bepalde woorden zoeken</i> die in de tekst 
+van de zoek pagina voorkomen. De zoekpagina komt op het scherm als U begint 
+en kan vanuit andere paginas opgezocht worden door op de knop <i>zoeken</i> te clicken. }
+
+_textTitlelong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens titels</i> opzoeken door op 
+de knop <i>titels a-z</i> te clicken.  Deze actie zal een lijst met alfabetisch gesorteerde 
+boekentitels op het scherm brengen.  }
+
+_textOrganizationlong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens organisaties</i>  opzoeken door op 
+de knop <i>organisaties</i> te clicken.  Deze actie zal een lijst met 
+organisaties op het scherm brengen.  }
+
+_textHowtolong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens help onderwerpen</i>
+opzoeken door op de knop <i>help onderwerpen</i> te clicken.  Deze actie zal een lijst met 
+help onderwerpen op het scherm brengen.  }
+
+_textCreatorlong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens auteurs</i> opzoeken door op de knop <i>auteurs a-z</i> te clicken.  Deze actie zal een lijst met 
+met boeken gesorteerd volgens de auteur op het scherm brengen.  }
+
+_textTopiclong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens themas</i> opzoeken door op de knop <i>themas</i> te clicken.  Deze actie zal een lijst met 
+themas op het scherm brengen om te browsen.  }
+
+_textSubjectlong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens onderwerpen</i> opzoeken door op de knop <i>onderwerpen</i> te clicken.  Deze actie zal een lijst met 
+onderwerpen op het scherm brengen gerepresenteerd door boekenkasten.  }
+
+_textTolong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens geadresseerden</i> opzoeken door op de knop <i>geadresseerde</i> te clicken.  Deze actie zal een lijst met 
+geadresseerden op het scherm brengen.  }
+
+_textFromlong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens afzenders</i> opzoeken door op de knop <i>afzenders</i> te clicken.  Deze actie zal een lijst met 
+help onderwerpen op het scherm brengen.  }
+
+_textSerieslong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens reksen</i> opzoeken door op de knop <i>reeksen</i> te clicken.  Deze actie zal een lijst met 
+reeksen op het scherm brengen die op dit moment in de collectie aanwezig zijn.  }
+
+_textDatelong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens datum</i> opzoeken door op de knop <i>datums</i> te clicken.  Deze actie zal een lijst met chronologisch gesorteerde
+publicaties op het scherm brengen.  }
+
+_textBrowselong_ [l=nl] { <p>U kunt <i>alle publicaties</i> opzoeken door op de knop <i>alle publicaties</i> te clicken.  }
+
+_textPeoplelong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens personen</i> opzoeken door op de knop <i>personen a-z</i> te clicken.  Deze actie zal een lijst met 
+personen op het scherm brengen alfabetisch gesorteerd volgens familie naam.  }
+
+_textLanguagelong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens taalen</i> opzoeken door op de knop <i>taalen</i> te clicken.  Deze actie zal een lijst met 
+publicaties op het scherm brengen gesorteerd volgens taalen.  }
+
+_textAcronymlong_ [l=nl] { <p>U kunt <i>publicaties gesorteerd volgens afkortingen</i> opzoeken door op de knop <i>afkortingen</i> te clicken.  Deze actie zal een lijst met 
+afkortingen op het scherm brengen en de tekst stukken waarin deze voorkomen.  }
+
+_textdefaultlongtext_ [l=nl] { <p>Click de knop <i>ongedefineerd</i> om publicaties te browsen die volgens een onbekend veld gesorteerd zijn.}
+
+_texthelptopics_ [l=nl] {
+<h2 align=left>Topics</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Hoe kan ik voor bepaalde woorden zoeken?</a>
+<ul>
+  <li><a href="\#query-terms">Zoek termen</a>
+  <li><a href="\#query-type">Type zoek vraag</a>
+  <li><a href="\#scope-of-queries">Omvang zoek vraag</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Collectie preferenties</a>
+  <li><a href="\#pres-prefs">Weergave preferenties</a>
+  <li><a href="\#search-prefs">Zoek preferenties</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=nl] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=nl] {Hoe can ik documenten lezen?}
+_booktextreadingdocs_ [l=nl] {Hoe can ik boeken lezen?}
+_bibtextreadingdocs_ [l=nl] {Hoe can ik meer informatie krijgen over een bibliografisch onderwerp?}
+
+_texthelpreadingdocs_ [l=nl] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>U bent bij een document aangekomen, als de titel en de auteur links boovenaan de pagina 
+verschijnen.  Daarnaast bevinden zich het pagina nummer van de actuele pagina, een box om 
+een nieuwe pagina nummer te kiezen en pijlen om de volgende of voorafgaande pagina te kiezen. 
+
+<p>Onder de pagina nummers bevind zich de tekst van de sectie.  U kunt gebruik maken van de 
+pijlen onderaan de pagina om naar de volgende of voorafgaande sectie komen.
+
+<p>Onder de titel en de auteur bevinden zich drie knoppen. Click op de knop <i>tekst uitbreiden</i> 
+om de hele tekst te zien.  Als U groote documenten uitbreid, zou dit heel wat tijd en geheugen in 
+beslag kunnen nemen!
+Click op de knop <i>nieuw venster</i> om een nieuw venster voer een document te opeuen.  
+(Dit zou handig kunnen zijn, als U twee documenten wilt lezen of als U twee documenten wilt 
+vergelijken.) Na het uitvoeren van een zoekactie, worden de woorden waarnaar U gezocht hebt 
+geaccentueerd. Wilt U dit ongedaan maken, dan clickt U op de knop <i>niet accentueren</i>.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Druk op de pijl om naar de volgende sectie te gaan ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... of terug naar de voorafgaande sectie.</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Geef de hele tekst weer, of niet</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>pen een nieuw venster voor deze pagina</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Accentueer zoektermen of niet</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=nl] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>U bent bij een book aangekomen als een afbeelding van de voorplaat van het book links bovenaan 
+de pagina veschijnt.  Naast het plaatje bevind zich een inhoudsopgave. Een pijltje geeft het gedeelte 
+aan waar U zich momenteel bevindt.  De inhouds opgave kan nitgebreidt worden: click op de map om de 
+inhoudsopgave te openen en te sluiten.
+Click op een open boek om het te sluiten.
+
+<p>Onderaan bevind zich de tekst van de actuele sectie.  Met de pijlen onderaan de pagina kunt U naar 
+de volgende of voorafgaande sectie gaan.
+
+<p>Onder het plaatje bevinden zich vier knoppen.  Druk de knop <i>tekst uitbreiden</i>om de hele 
+tekst van een sectie of book te kunnen zien.  Het uitbreiden van omvangrijke boeken kan veel tijd 
+en geheugen in beslag nemen! 
+Click op het knopje <i>inhoudsopgave uitbreiden</i> om de koppen van alle hoofdstukken te kunnen zien.
+Click op de knop <i>nieuw venster</i>  om een nieuw venster voor een boek te openen.  Dit zou handig 
+zijn als U boeken vergelijkt of twee boeken tegelijker tijd wilt lezen.
+ Na een zoekactie worden de zoektermen in de tekst geaccentueerd.  Click op de knop <i>niet accentueren</i> 
+als U geen geaccentueerde zoektermen wilt.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Onderwerp openen </td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Boek openen/sluiten, </td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Deze sectie van de tekst weergeven</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>De hele tekst weergeven of niet</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Inhoudsopgave uitbreiden of niet</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open een nieuw venster voor deze pagina</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Zoektermen accentueren of niet</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Click op de pijl om naar de volgende sectie te gaan ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... of terug naar de voorafgaande sectie</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=nl] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Sommige bibliografische items bevatten aavullende informatie (b.v. een abstract)
+Dit blijkt uit icons op de zoek responsie-pagina. ls een item aanvullende informatie bevat dan wordt het door_icontext_ icon in plaats 
+van _iconblanktext_ weergegeven.
+
+<p>Als U op het icon _icontext_ clickt word de aavullende informatie van het bibliografisch item weergegeven.
+
+<p> Onderaan het bibliografisch item bevinden zich twee knoppen.  Click op de knop <i>niew venster</i> 
+om een nieuw browser-venster voor dit boek te openen.  (Dit zou handig zijn als U bibliografische 
+items wilt vergelijken). Na een zoekactie worden de zoektermen in de doorzochte tekst geaccentueerd.  
+Click op <i>niet accentureren</i> om de accentuering te onderdrukken.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open een nieuw venster voor deze pagina</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Accentueer zoek termen of niet.</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=nl] {
+<h2>Zoeken naar bepaalde worden</h2>
+<p>
+  Vanuit de zoek pagina moeten volgende stappen uitgevoerd worden:<p>
+  
+  <ol><li>Kies de documenten die doorzocht moeten worden.
+      <li>Kies of U naar somige of alle woorden wilt zoeken.
+      <li>Typ in de woorden waarnaar gezocht moet worden.
+      <li>Click op de knop <i>Begin zoeken<i>
+  </ol>
+
+<p>Na het uitvoeren van een zoekactie worden de titels van maximaal 20 gevonden documenten 
+per pagina weergengeven. Er is een knop onderaan de pagina om naar de volgende 20 titels te gaan.  
+Vandaar kunt U of terug naar de vooafgaande pagina of  vooruit naar de volgende pagina gaan. 
+Click op de titel of op het knopje ernaast om een document weer te geven.
+
+<p>Er wordt een maximum van 100 gevonden documenten weergengeven.  U kunt het maximum gwonden 
+documenten veranderen via de knop <i>preferenties</I> bovenaan de pagina.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Zoektermen</h3>
+
+<p>Alle woorden in de zoekvraag box worden als zoektermen geinterpreteerd Zoektermen mogen alleen 
+letters en nummers bevatten. Zoektermen worden gesepareerd door een spatie. Alle anderen tekens 
+(zoals kommas of vraagtekens) worden als seperatoren geinterpreteerd.  Ze zijn dus identiek met 
+spaties en worden genegeerd als onderdeel van zoektermen.  Het is dus niet mogelijk om naar 
+worden te zoeken die dit soort tekens bevatten.
+
+<p>Bij voorbeeld de zoekvraag <p>
+    <ul><kbd>s'Maandags</kbd></ul>
+      <p>s het zelfde als <p>
+      <ul><kbd>s Maandags</kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>ypen zoekvragen</h3>
+
+<p>Er zijn twee sorten zoekvragen.
+<ul>
+  <li>Zoekvragen haar <b>alle</b> woorden.  Deze zoekvragen zoeken naar documenten die alle 
+gespecificeerde zoektermen bevatten.  Documenten die aan deze zoekvraag voldoen worden in 
+alphabetische orde weergengeven..<p>
+
+  <li>Zoekvragen naar <b>somige woorden</b>.  Deze zoekvragen zoeken naar documenten die een of 
+merdere zoektermen bevatten.  Voer woorden in, die waarschiijnlijk in de gewensde documenten aanwezig 
+zijn.  Documenten worden weergegeven naar mate zij aan de zoekvraag voldoen.  
+
+      <p><ul>
+        <li> Hoe meer zoektermen een dokument bevat, hoe beter het maat van voldoening met dit soort zoekvragen.
+        <li> Rare woorden werken beter dan gebruiklijke woorden.
+        <li> Korte documenten voeldoen beter aan zoekvragen dan omvangrijke documenten.
+      </ul>
+</ul>
+
+<p>U kunt elk aantal zoektermen invoeren, hele zinnen en hele alineas.  Als U maar een zoekterm 
+invoert zullen de gevonden documenten worden weergegeven in orde van het aantal keren dat de 
+zoekterm werd aangetroffen in een document.<p>
+
+_texthelpscope_
+}
+
+_textchangeprefs_ [l=nl] {Het veranderen van preferenties}
+
+_texthelppreferences_ [l=nl] {<h2>_textchangeprefs_</h2>
+
+<p>Bovenaan de pagina bevindt zich de knop <i>preferenties</i>.  Als U deze knop drukt kunt U de 
+eigensdrappen van het interface veranderen zodat het aan Uw eisen voldoet.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Collectie preferenties</h3>
+
+SoSomige collecties bevatten meerdene sub-collecties.  Deze kunnen individueel doorzocht worden of 
+als een geheel.  Op de preferentie pagina kunt U kiezen welke sub-collecties in de zoekacties 
+inbegrepen moeten worden.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Presentatie preferenties</h3>
+
+Afhankelijk van de type collectie bestaan veschillende opties om de presentatie van 
+de collectie te veranderen.
+
+In collecties van Web paginas kan de Greenstone navigatie lijst onderdrukt worden.  De Greenstone 
+navigatie lijst wordt normaliter bavenaan de dokumenten pagina weergengeven.  Als U kiest om 
+deze lijst te verwijderen zal een zoekactie U naar een Webpagina zonder Greenstone navigatie 
+lijst brengen. 	Om in deze situatie een nieuwe zoek actie uit te voeren moet U gebruik maken van 
+de 'terug'-knop van de browser. Greenstone brengt waarschuings-boodschappen op het scherm als 
+U op een link clickt dat buiten de digitale bibliotheek en op het Web gaat.  Deze 
+waarschuings-boodschappen kunnen onderdrukt worden. In somige Web collecties is het mogelijk 
+om te kiezen of de links van de zoek resultaten pagina direct naar de URL verwijzen of naar de 
+kopie in de digitale bibliotheek.
+
+Collecties, die in verschillende taalen kunnen worden weergegeven, bieden de mogelijkheid om een 
+interface taal te kiezen.  In het geval van Chinees kunt U, degene standard Chinees encodering 
+kiezen die door Uw browser wordt gebruikt.
+
+In alle collecties kunt U kiezen tussen een tekst interface en een graphisch interface.  
+Deze optie is bijzonder helpful voor visueel gehandicapten die extra groote letters willen gebruiken.
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Zoek preferenties</h3>
+Met twee paaren van knoppen kunt U het gbruik van Hoofdletters/kleine letters en het gebruik van 
+woordstammen controleren. Met het eeste paar knoppen kunt U kiezen of Hoofdletters in zoektermen 
+in acht genomen moeten worden of niet. Met het tweede paar knoppen kunt U regelen of woordeinden 
+genegeerd moeten worden, of niet.
+
+
+<p>Als b.v. de knoppen <i>negeer hoofdletters</i> en <i>negeer woordeinden</i> geselecteerd zijn, 
+dan zal de zoekvraag <p>
+	<ul><kbd>Africaanse gebouwen</kbd></ul>
+	<p>net zo worden behandelt als de zoekvraag<p>
+	<ul><kbd>Africa gebouw</kbd></ul><p>
+Dit is so, omdat de hoofdletter 'A' naar de kleine letter 'a' word veranderd en de woordeinden 
+"anse" en "en" worden weggelaten.
+
+<p>U kunt ook voor een geavanceerde form van zoekvragen kiezen.  In de geavanceerde zoekvraag 
+kunt U termen combineren door AND (&), OR (I), and NOT (!) te gebruiken.  Op die manier kunt U 
+precisesere zoekvragen formuleren. 
+
+<p>U kunt ook het maximum aantal gevonden documenten en het 
+maximum aantal documenten per pagina veranderen.
+
+}
+
+_texttanumbrowseoptions_ [l=nl] {Er zijn _numbrowseoptions_ moglijkheden om informatie in 
+deze collectie op te sporen:}
+
+_textsimplehelpheading_ [l=nl] {Het opsporen van informatie}
+
+_texthelpscope_ [l=nl] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Omvang van zoekvragen</h3>
+
+<p>
+In de meeste collecties kunt U verschillende indicees kiezen voor Uw zoekacties.  Er zouden auteurs- 
+en titel indicees aanwezig kunnen zijn of hoofdstuk- en alinea indecees. Geheel passende documenten 
+zullen altijd worden gevonden onafhankelijk van de gebruikte index.  
+<p> Boeken worden geopened op het relevante stuk tekst.
+}
Index: /main/tags/2.38/gsdl/macros/english.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/english.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/english.dm	(revision 21083)
@@ -0,0 +1,1191 @@
+######################################################################
+#
+# English Language text and icon macros 
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ {macro value}
+# Everything between the {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\{' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textperiodicals_ {Periodicals}
+_textsource_ {source ref: }
+_textdate_ {publication date: }
+_textnumpages_ {no. of pages: }
+
+_textsignin_ {sign in}
+
+_textdefaultcontent_ {The requested page could not be found. Please use
+your browsers 'back' button or the above home button to return to the
+Greenstone Digital Library.}
+
+_textdefaulttitle_ {GSDL Error}
+
+_collectionextra_ {This collection contains _about:numdocs_ documents. 
+It was last built _about:builddate_ days ago.}
+
+# this is only used by the collector (where the above _collectionextra_
+# macro will always be set to another value)
+_collectorextra_ {
+<p>This collection contains _numdocs_ _If_("_numdocs_" eq "1",document,documents), a total of _numbytes_.
+<p><a href="_httppagex_(bsummary)">Click here</a> to view the build summary for this collection.
+}
+
+_textimagecollection_ {}
+_textimageabout_ {About page}
+_textimagehome_ {Home page}
+_textimagehelp_ {Help page}
+_textimagepref_ {Preferences page}
+_textimagegreenstone_ {Greenstone Digital Library Software}
+
+_textimagesearch_ {Search for specific terms}
+_textimageTitle_ {Browse alphabetical list of titles}
+_textimageList_ {Browse document listing}
+_textimageCreator_ {Browse alphabetical list of authors}
+_textimageSeries_ {Browse by issue}
+_textimageDate_ {Browse by date}
+_textimageSubject_ {Browse by subject category}
+_textimageTo_ {Browse by To field}
+_textimageFrom_ {Browse by From field}
+_textimageOrganization_ {Browse by organization}
+_textimageHowto_ {Browse how to categories}
+_textimageTopic_ {Browse special topic issues}
+_textimageBrowse_ {Browse}
+_textimagePeople_ {Browse alphabetical list of people}
+_textimageLanguage_ {Browse by language}
+_textimageAcronym_ {Browse acronyms}
+_textimagePhrase_ {Browse phrases}
+_textimageArtist_ {Browse artists}
+_textimageSource_ {Browse by original filename}
+_textimageKeyword_ {Browse by keyword}
+
+_texticontabsearchgreen_{Search}
+_texticontabdategreen_{Dates}
+_texticontabseriesgreen_{Series}
+_texticontabauthorgreen_{Authors A-Z}
+_texticontabtitlegreen_{Titles A-Z}
+_texticontablistgreen_ {Listing}
+_texticontabsubjectgreen_{Subjects}
+_texticontabtogreen_{To}
+_texticontabfromgreen_{From}
+_texticontaborggreen_{Organization}
+_texticontabhowgreen_{How to}
+_texticontabtopicgreen_{Topics}
+_texticontabbrwsegreen_{Browse}
+_texticontabbrowsgreen_{Browse}
+_texticontabPeoplegreen_{People A-Z}
+_texticontabLanguagegreen_{Language}
+_texticontabAcronymgreen_{Acronyms}
+_texticontabPhrasegreen_{Phrases}
+_texticontabArtistgreen_{Artists}
+_texticontabSourcegreen_{Filenames}
+_texticontabKeywordgreen_{Keywords}
+
+_texticontext_ {View the document}
+_texticonclosedbook_ {open this document and view contents}
+_texticonnext_ {to next section}
+_texticonprev_ {to previous section}
+
+_texticonmidi_ {View the MIDI document}
+_texticonmsword_ {View the Microsoft Word document}
+_texticonpdf_  {View the PDF document}
+_texticonps_  {View the PostScript document}
+_texticonppt_  {View the PowerPoint document}
+_texticonrtf_  {View the RTF document}
+_texticonxls_  {View the Microsoft Excel document}
+
+_page_ {page }
+_pages_ {pages}
+_of_ { of }
+_vol_ {Vol.}
+_num_ {No.}
+
+_textmonth00_ {}
+_textmonth01_ {January}
+_textmonth02_ {February}
+_textmonth03_ {March}
+_textmonth04_ {April}
+_textmonth05_ {May}
+_textmonth06_ {June}
+_textmonth07_ {July}
+_textmonth08_ {August}
+_textmonth09_ {September}
+_textmonth10_ {October}
+_textmonth11_ {November}
+_textmonth12_ {December}
+
+_Document_ {Document}
+_Section_ {Section}
+_Paragraph_ {Paragraph}
+
+_magazines_ {Magazines}
+
+_nzdlpagefooter_ {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">New Zealand Digital Library Project</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Department of Computer Science</a>, 
+<a href="http://www.waikato.ac.nz">University of Waikato</a>, 
+New Zealand}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "HOME" ## top_nav_button ## chome ##
+_httpiconchomeof_ {_httpimg_/chomeof.gif}
+_httpiconchomeon_ {_httpimg_/chomeon.gif}
+
+## "HELP" ## top_nav_button ## chelp ##
+_httpiconchelpof_ {_httpimg_/chelpof.gif}
+_httpiconchelpon_ {_httpimg_/chelpon.gif}
+
+## "PREFERENCES" ## top_nav_button ## cpref ##
+_httpiconcprefof_ {_httpimg_/cprefof.gif}
+_httpiconcprefon_ {_httpimg_/cprefon.gif}
+
+## "help" ## green_title ## h_help ##
+_httpiconhhelp_ {_httpimg_/h\_help.gif}
+_widthhhelp_ {200}
+_heighthhelp_ {57}
+
+## "authors a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ {_httpimg_/tauthgr.gif}
+_httpicontauthof_ {_httpimg_/tauthof.gif}
+_httpicontauthon_ {_httpimg_/tauthon.gif}
+_widthtauthx_ {110}
+
+## "series" ## nav_bar_button ## tser ##
+_httpicontsergr_ {_httpimg_/tsergr.gif}
+_httpicontserof_ {_httpimg_/tserof.gif}
+_httpicontseron_ {_httpimg_/tseron.gif}
+_widthtserx_ {87}
+
+## "dates" ## nav_bar_button ## tdate ##
+_httpicontdategr_ {_httpimg_/tdategr.gif}
+_httpicontdateof_ {_httpimg_/tdateof.gif}
+_httpicontdateon_ {_httpimg_/tdateon.gif}
+_widthtdatex_ {87}
+
+## "subjects" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ {_httpimg_/tsubjgr.gif}
+_httpicontsubjon_ {_httpimg_/tsubjon.gif}
+_httpicontsubjof_ {_httpimg_/tsubjof.gif}
+_widthtsubjx_ {87}
+
+## "to" ## nav_bar_button ## tto ##
+_httpiconttogr_ {_httpimg_/ttogr.gif}
+_httpiconttoon_ {_httpimg_/ttoon.gif}
+_httpiconttoof_ {_httpimg_/ttoof.gif}
+_widthttox_ {87}
+
+## "from" ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ {_httpimg_/tfromgr.gif}
+_httpicontfromon_ {_httpimg_/tfromon.gif}
+_httpicontfromof_ {_httpimg_/tfromof.gif}
+_widthtfromx_ {87}
+
+## "organisations" ## nav_bar_button ## torg ##
+_httpicontorggr_{_httpimg_/torggr.gif}
+_httpicontorgon_{_httpimg_/torgon.gif}
+_httpicontorgof_{_httpimg_/torgof.gif}
+_widthtorgx_ {114}
+
+## "how to" ## nav_bar_button ## thow ##
+_httpiconthowgr_{_httpimg_/thowgr.gif}
+_httpiconthowon_{_httpimg_/thowon.gif}
+_httpiconthowof_{_httpimg_/thowof.gif}
+_widththowx_ {87}
+
+## "topic" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_{_httpimg_/ttopicgr.gif}
+_httpiconttopicon_{_httpimg_/ttopicon.gif}
+_httpiconttopicof_{_httpimg_/ttopicof.gif}
+_widthttopicx_ {87}
+
+## "browse" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_{_httpimg_/tbrwsegr.gif}
+_httpicontbrwseon_{_httpimg_/tbrwseon.gif}
+_httpicontbrwseof_{_httpimg_/tbrwseof.gif}
+_widthtbrwsex_ {87}
+
+## "browsemeta" ## nav_bar_button ## tbrwse like above ##
+_httpicontbrowsgr_{_httpimg_/tbrwsegr.gif}
+_httpicontbrowson_{_httpimg_/tbrwseon.gif}
+_httpicontbrowsof_{_httpimg_/tbrwseof.gif}
+_widthtbrowsx_ {87}
+
+## "search" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ {_httpimg_/tsrchgr.gif}
+_httpicontsrchof_ {_httpimg_/tsrchof.gif}
+_httpicontsrchon_ {_httpimg_/tsrchon.gif}
+_widthtsrchx_ {87}
+
+## "titles a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ {_httpimg_/ttitlgr.gif}
+_httpiconttitlof_ {_httpimg_/ttitlof.gif}
+_httpiconttitlon_ {_httpimg_/ttitlon.gif}
+_widthttitlx_ {87}
+
+## "people" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ {_httpimg_/tpeopgr.gif}
+_httpicontpeopof_ {_httpimg_/tpeopof.gif}
+_httpicontpeopon_ {_httpimg_/tpeopon.gif}
+_widthtpeopx_ {97}
+
+## "language" ## nav_bar_button ## tlang ##
+_httpicontlanggr_ {_httpimg_/tlanggr.gif}
+_httpicontlangon_ {_httpimg_/tlangon.gif}
+_httpicontlangof_ {_httpimg_/tlangof.gif}
+_widthtlangx_ {87}
+
+## "acronym" ## nav_bar_button ## tacro ##
+_httpicontacrogr_ {_httpimg_/tacrogr.gif}
+_httpicontacroof_ {_httpimg_/tacroof.gif}
+_httpicontacroon_ {_httpimg_/tacroon.gif}
+_widthtacrox_ {87}
+
+## "phrases" ## nav_bar_button ## tphrse ##
+_httpicontphrsegr_ {_httpimg_/tphrsegr.gif}
+_httpicontphrseof_ {_httpimg_/tphrseof.gif}
+_httpicontphrseon_ {_httpimg_/tphrseon.gif}
+_widthtphrsex_ {87}
+
+## "artists" ## nav_bar_button ## tartst ##
+_httpicontartstgr_ {_httpimg_/tartstgr.gif}
+_httpicontartstof_ {_httpimg_/tartstof.gif}
+_httpicontartston_ {_httpimg_/tartston.gif}
+_widthtartstx_ {87}
+
+## "filenames" ## nav_bar_button ## tsrc ##
+_httpicontsrcgr_ {_httpimg_/tsrcgr.gif}
+_httpicontsrcof_ {_httpimg_/tsrcof.gif}
+_httpicontsrcon_ {_httpimg_/tsrcon.gif}
+_widthtsrcx_ {87}
+
+## "keywords" ## nav_bar_button ## tkw ##
+_httpicontkwgr_ {_httpimg_/tkwgr.gif}
+_httpicontkwof_ {_httpimg_/tkwof.gif}
+_httpicontkwon_ {_httpimg_/tkwon.gif}
+_widthtkwx_ {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ {About this collection}
+
+_textsubcols1_ {<p>The complete collection comprises _1_ subcollections. 
+Those currently available are:
+<blockquote>}
+
+_textsubcols2_ {</blockquote>
+You can check (and alter) which subcollections you are 
+currently using on the Preferences page.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "about" ## green_title ## h_about ##
+_httpiconhabout_ {_httpimg_/h\_about.gif}
+_widthhabout_ {200}
+_heighthabout_ {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ {Titles A-Z}
+_texticonhauth_ {Authors A-Z}
+_texticonhsubj_ {Subjects}
+_texticonhto_ {To}
+_texticonhfrom_ {From}
+_texticonhser_ {Series}
+_texticonhdate_ {Dates}
+_texticonhhow_ {How to}
+_texticonhorg_ {Organizations}
+_texticonhbrwse_ {Browse}
+_texticonhbrows_ {Browse}
+_texticonhpeople_ {People A-Z}
+_texticonhlanguage_ {Languages}
+_texticonhacronym_ {Acronyms}
+_texticonhphrases_ {Phrases}
+_texticonhartist_ {Artists}
+_texticonhsrc_ {Filenames}
+_texticonhkw_ {Keywords}
+
+_texticonopenbookshelf_ {close this section of the library}
+_texticonclosedbookshelf_ {open this section of the library and view contents}
+_texticonopenbook_ {close this book}
+_texticonclosedfolder_ {Open this folder and view contents}
+_texticonclosedfolder2_ {open sub-section: }
+_texticonopenfolder_ {close this folder}
+_texticonopenfolder2_ {close sub-section: }
+_texticonsmalltext_ {View this section of the text}
+_texticonsmalltext2_ {view text: }
+_texticonpointer_ {current section}
+_texticondetach_ {Open this page in a new window}
+_texticonhighlight_ {Highlight search terms}
+_texticonnohighlight_ {Don't highlight search terms}
+_texticoncontracttoc_ {Collapse table of contents}
+_texticonexpandtoc_ {Expand table of contents}
+_texticonexpandtext_ {Display all text}
+_texticoncontracttext_ {Display text only for currently selected section}
+_texticonwarning_ {<b>Warning: </b>}
+_texticoncont_ {continue?}
+
+_textltwarning_ {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Expanding the text here will generate a large 
+amount of data for your browser to display _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ {go to page}
+_textintro_ { <i>(introductory text)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "titles a-z" ## green_title ## h_title ##
+_httpiconhtitle_ {_httpimg_/h\_title.gif}
+_widthhtitle_ {200}
+_heighthtitle_ {57}
+
+## "authors a-z" ## green_title ## h_auth ##
+_httpiconhauth_ {_httpimg_/h\_auth.gif}
+_widthhauth_ {200}
+_heighthauth_ {57}
+
+## "subjects" ## green_title ## h_subj ##
+_httpiconhsubj_ {_httpimg_/h\_subj.gif}
+_widthhsubj_ {200}
+_heighthsubj_ {57}
+
+## "to" ## green_title ## h_to ##
+_httpiconhto_ {_httpimg_/h\_to.gif}
+_widthhto_ {200}
+_heighthto_ {57}
+
+## "from" ## green_title ## h_from ##
+_httpiconhfrom_ {_httpimg_/h\_from.gif}
+_widthhfrom_ {200}
+_heighthfrom_ {57}
+
+## "series" ## green_title ## h_ser ##
+_httpiconhser_ {_httpimg_/h\_ser.gif}
+_widthhser_ {200}
+_heighthser_ {57}
+
+## "dates" ## green_title ## h_date ##
+_httpiconhdate_ {_httpimg_/h\_date.gif}
+_widthhdate_ {200}
+_heighthdate_ {57}
+
+## "how to" ## green_title ## h_how ##
+_httpiconhhow_ {_httpimg_/h\_how.gif}
+_widthhhow_ {200}
+_heighthhow_ {57}
+
+## "topics" ## green_title ## h_topic ##
+_httpiconhtopic_ {_httpimg_/h\_topic.gif}
+_widthhtopic_ {200}
+_heighthtopic_ {57}
+
+## "organization" ## green_title ## h_org ##
+_httpiconhorg_ {_httpimg_/h\_org.gif}
+_widthhorg_ {250}
+_heighthorg_ {57}
+
+## "browse" ## green_title ## h_brwse ##
+_httpiconhbrwse_ {_httpimg_/h\_brwse.gif}
+_widthhbrwse_ {200}
+_heighthbrwse_ {57}
+
+## "browsemeta" ## green_title ## h_brwse ##
+_httpiconhbrows_ {_httpimg_/h\_brwse.gif}
+_widthhbrows_ {200}
+_heighthbrows_ {57}
+
+## "people" ## green_title ## h_people ##
+_httpiconhpeople_ {_httpimg_/h\_people.gif}
+_widthhpeople_ {200}
+_heighthpeople_ {57}
+
+## "languages" ## green_title ## h_lang ##
+_httpiconhlanguage_ {_httpimg_/h\_lang.gif}
+_widthhlanguage_ {200}
+_heighthlanguage_ {57}
+
+## "acronyms" ## green_title ## h_acro ##
+_httpiconhacronym_ {_httpimg_/h\_acro.gif}
+_widthhacronym_ {200}
+_heighthacronym_ {57}
+
+## "phrases" ## green_title ## h_phrse ##
+_httpiconhphrse_ {_httpimg_/h\_phrse.gif}
+_widthhphrse_ {200}
+_heighthphrse_ {57}
+
+## "artists" ## green_title ## h_artist ##
+_httpiconhartist_ {_httpimg_/h\_artist.gif}
+_widthhartist_ {200}
+_heighthartist_ {57}
+
+## "filenames" ## green_title ## h_src ##
+_httpiconhsrc_ {_httpimg_/h\_src.gif}
+_widthhsrc_ {200}
+_heighthsrc_ {57}
+
+## "keywords" ## green_title ## h_kw ##
+_httpiconhkw_ {_httpimg_/h\_kw.gif}
+_widthhkw_ {200}
+_heighthkw_ {57}
+
+## "CONTINUE?" ## top_nav_button ## cont ##
+_httpiconcontoff_ {_httpimg_/contof.gif}
+_httpiconconton_ {_httpimg_/conton.gif}
+
+## "EXPAND TEXT" ## document_button ## eallt ## 
+_httpiconealltof_ {_httpimg_/ealltof.gif}
+_httpiconeallton_ {_httpimg_/eallton.gif}
+
+## "CONTRACT CONTENTS" ## document_button ## econc ##
+_httpiconeconcof_ {_httpimg_/econcof.gif}
+_httpiconeconcon_ {_httpimg_/econcon.gif}
+
+## "DETACH" ## document_button ## edtch ##
+_httpiconedtchof_ {_httpimg_/edtchof.gif}
+_httpiconedtchon_ {_httpimg_/edtchon.gif}
+
+## "EXPAND CONTENTS" ## document_button ## eexpc ##
+_httpiconeexpcof_ {_httpimg_/eexpcof.gif}
+_httpiconeexpcon_ {_httpimg_/eexpcon.gif}
+
+## "CONTRACT TEXT" ## document_button ## etsec ##
+_httpiconetsecof_ {_httpimg_/etsecof.gif}
+_httpiconetsecon_ {_httpimg_/etsecon.gif}
+
+## "HIGHLIGHTING" ## document_button ## ehl ##
+_httpiconehlof_ {_httpimg_/ehlof.gif}
+_httpiconehlon_ {_httpimg_/ehlon.gif}
+
+## "NO HIGHLIGHTING" ## document_button ## enhl ##
+_httpiconenhlof_ {_httpimg_/enhlof.gif}
+_httpiconenhlon_ {_httpimg_/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ {_If_(_thislast_,results _thisfirst_ - _thislast_ for query: _cgiargq_,No matches for query: _cgiargq_)}
+_textnoquerytitle_ {Search page}
+
+_texticonthispage_ {search}
+_textsome_ {_If_(_cgiargb_,ranked,some)}
+_textall_ {_If_(_cgiargb_,boolean,all)}
+_textformsome_ {_If_(_cgiargb_,ranked,some)}
+_textformall_ {_If_(_cgiargb_,natural,all)}
+_texticonqueryresultsbar_ {}
+_texticonsearchhistorybar_ {search history}
+
+#alt text for query buttons
+_textusequery_ {use this query}
+_textfreqmsg1_ {Word count: }
+_textpostprocess_ {_If_(_quotedquery_,<br><i>post-processed to find _quotedquery_</i>
+)}
+
+_textmorethan_ {More than }
+_textapprox_ {About }
+_textnodocs_ {No documents matched the query.}
+_text1doc_ {1 document matched the query.}
+_textlotsdocs_ {documents matched the query.}
+_textmatches_ {Matches }
+_textbeginsearch_ {Begin Search}
+_textrunquery_{Run Query}
+_textclearform_{Clear Form}
+
+#these go together in form search:
+#"Word or phrase  (fold, stem)  ... in field"
+_textwordphrase_{Word or phrase}
+_textinfield_{... in field}
+_textfoldstem_{(fold, stem)}
+
+_textadvquery_{Or enter a query directly:}
+_textallfields_{All fields}
+_textand_{and}
+_textor_{or}
+_textandnot_{and not}
+
+# _hselection_, _jselection_, _nselection_ and _gselection_ are set from 
+# within the server some or all of them may remain unset
+
+
+_textsimplesearch_ {Search for _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, at _gselection_ level) _If_(_nselection_, in _nselection_ language)
+which contain _querytypeselection_ of the words}
+
+_textadvancedsearch_ {Search _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, at _gselection_ level)_If_(_nselection_, in _nselection_ language) 
+using _querytypeselection_ query}
+
+_textformsimplesearch_ {Search for _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, at _gselection_ level) _If_(_nselection_, in _nselection_ language)
+which contain _formquerytypeselection_ of}
+
+_textformadvancedsearch_ {Search _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, at _gselection_ level)_If_(_nselection_, in _nselection_ language) 
+and display results in _formquerytypeselection_ order}
+
+
+_textjselect_ {_If_(_hselection_, of) _jselection_}
+
+_textdatesearch_ {This collection can be searched for documents within a date range, or documents that contain a particular date. This is an optional feature of the search.}
+_textstartdate_ {Start (or only) date:}
+_textenddate_ {End date:}
+_textbc_ {B.C.E.}
+_textad_ {C.E.}
+_textexplaineras_{C.E. and B.C.E are alternatives for A.D. and B.C. repsectively.  These terms are considered to be culture indiscriminate, and stand for "Common Era" and "Before the Common Era"} 
+
+_textstemon_ { (ignoring word endings)}
+
+_textsearchhistory_ {Search History}
+
+#text macros for search history
+_textnohistory_ {Search history not available}
+_texthresult_ {result}
+_texthresults_ {results}
+_texthallwords_ {all words}
+_texthsomewords_ {some words}
+_texthboolean_ {boolean}
+_texthranked_ {ranked}
+_texthcaseon_ {case must match}
+_texthcaseoff_ {casefolded}
+_texthstemon_ {stemmed}
+_texthstemoff_ {unstemmed}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "search" ## green_title ## h_search ##
+_httpiconhsearch_ {_httpimg_/h\_search.gif}
+_widthhsearch_ {200}
+_heighthsearch_ {57}
+
+## "results" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ {_httpimg_/qryresb.gif}
+_widthqryresb_ {_pagewidth_}
+_heightqryresb_ {17}
+
+## "history" ## green_bar_left_aligned ## schhistb ##
+_httpiconsrchhistb_ {_httpimg_/schhistb.gif}
+_widthsrchhistb_ {_pagewidth_}
+_heightsrchhistb_ {17}
+
+## "display" ## hand_made ##
+_httpicondisplay_ {_httpimg_/display.gif}
+_widthdisplay_ {60}
+_heightdisplay_ {20}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textprefschanged_ {
+Preferences have been set as follows. Do not use your browser's
+&quot;back&quot; button - it will unset them! Instead, click one of the
+buttons on the access bar above.
+}
+_textsetprefs_ {set preferences}
+_textsearchprefs_ {Search preferences}
+_textcollectionprefs_ {Collection preferences}
+_textpresentationprefs_ {Presentation preferences}
+_textpreferences_ {Preferences}
+_textcasediffs_ {Case differences:}
+_textignorecase_ { ignore case differences}
+_textmatchcase_ { upper/lower case must match}
+_textwordends_{Word endings:}
+_textstem_ { ignore word endings}
+_textnostem_ { whole word must match}
+_textprefop_ {Return up to _maxdocoption_ hits with _hitsperpageoption_ hits per page.}
+_textextlink_ {Access to external Web pages:}
+_textintlink_ {Source documents retrieved from:}
+_textlanguage_ {Interface language:}
+_textencoding_ {Encoding:}
+_textformat_ {Interface format:}
+_textall_ {all}
+_textquerymode_{Query mode:}
+_textsimplemode_ { simple query mode}
+_textadvancedmode_ { advanced query mode (allows boolean searching using !, &, |, and parentheses)}
+_textlinkinterm_ {through intermediate page}
+_textlinkdirect_ {go directly there}
+_textdigitlib_ {the digital library}
+_textweb_ {the web}
+_textgraphical_ {Graphical}
+_texttextual_ {Textual}
+_textcollectionoption_ {<p>
+Subcollections to include:
+<br>}
+_textrelateddocdisplay_ {display related documents}
+_textsearchhistory_{Search history:}
+_texthistorydisplay_ { display _historynumrecords_search history records}
+_textnohistorydisplay_{ do not display search history}
+
+_texttypesearch_ {Type of search:}
+_texttextsearch_ {text search}
+_textformsearch_ {form search}
+_textqueryboxsize_ {Query box size:}
+_textregbox_{ regular query box}
+_textbigbox_{ large query box}
+_textformtype_ {Form type:}
+_textsimple_{ simple}
+_textadvanced_ { advanced}
+
+# used in "with 4 fields" in the form search box
+_textwith_{with}
+_textfields_{fields}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "preferences" ## green_title ## h_pref ##
+_httpiconhpref_ {_httpimg_/h\_pref.gif}
+_widthhpref_ {200}
+_heighthpref_ {57}
+
+#####################################################################
+# 'browse' package for the dynamic browsing interface
+package browse
+#####################################################################
+
+_textsortby_ {Sort documents by}
+_textalsoshowing_ {also showing}
+_textwith_ {with at most}
+_textdocsperpage_ {documents per page}
+
+_textfilterby_ {Get documents containing}
+_textall_ {all}
+_textany_ {any}
+_textwords_ {of the words}
+_textleaveblank_{leave this box blank to get all the documents}	    
+
+_browsebuttontext_ {"Sort Documents"}
+
+_nodata_ {<i>no data</i>}
+_docs_ {documents}
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ {Help}
+_textSearchshort_ {search for particular words}
+_textSeriesshort_ {access publications by series}
+_textDateshort_ {access publications by date}
+_textSubjectshort_ {access publications by subject}
+_textToshort_ {access publications by To field}
+_textFromshort_ {access publications by From field}
+_textTitleshort_ {access publications by title}
+_textBrowseshort_ {browse publications}
+_textCreatorshort_ {access publications by author}
+_textOrganizationshort_ {access publications by organization}
+_textHowtoshort_ {access publications by &quot;how to&quot; listing}
+_textTopicshort_ {access publications by topic}
+_textPeopleshort_ {access publications by people}
+_textLanguageshort_ {access publications by language}
+_textAcronymshort_ {access publications by acronym occurance}
+_textPhraseshort_ {browse phrases occurring in publications}
+_textArtistshort_ {access publications by artist}
+_textSourceshort_ {access publications by filename}
+_textKeywordshort_ {access publications by keyword}
+_textdefaultshorttext_ {undefined classification}
+
+_textSearchlong_ { <p>You can <i>search for particular words</i> that
+appear in the text from the "search" page. This is the first page that
+comes up when you begin, and can be reached from other pages by pressing
+the <i>search</i> button.  }
+
+_textTitlelong_ { <p>You can <i>access publications by title</i> by
+pressing the <i>titles a-z</i> button.  This brings up a list of books in
+alphabetic order.  }
+
+_textOrganizationlong_ { <p>You can <i>access publications by
+organisation</i> by pressing the <i>organisations</i> button.  This brings
+up a list of organisations.  }
+
+_textHowtolong_ { <p>You can <i>access publications by &quot;how to&quot; listing</i>
+by pressing the <i>how to</i> button.  This brings up a list of how to
+strings.  }
+
+_textCreatorlong_ { <p>You can <i>access publications by author</i> by
+pressing the <i>authors a-z</i> button.  This brings up a list of books,
+sorted by author name.  }
+
+_textTopiclong_ { <p>You can <i>access publications by topic</i> by
+pressing the <i>topic</i> button.  This brings up a list of topics to
+browse.  }
+
+_textSubjectlong_ { <p>You can <i>access publications by subject</i> by
+pressing the <i>subjects</i> button.  This brings up a list of subjects,
+represented by bookshelves.  }
+
+_textTolong_ { <p>You can <i>access publications by To field</i> by
+pressing the <i>to</i> button.  This brings up a list of addressees.  }
+
+_textFromlong_ { <p>You can <i>access publications by From field</i> by
+pressing the <i>from</i> button.  This brings up a list of senders.  }
+
+_textSerieslong_ { <p>You can <i>access publications by series</i> by
+pressing the <i>series</i> button.  This brings up a list of those series
+which are currently in the collection.  }
+
+_textDatelong_ { <p>You can <i>access publications by date</i> by pressing
+the <i>dates</i> button.  This brings up a list of all the issues, sorted
+chronologically.  }
+
+_textBrowselong_ { <p>You can <i>browse publications</i> by pressing the
+<i>browse</i> button.  }
+
+_textPeoplelong_ { <p>You can <i>access publications by people</i> by
+pressing the <i>people a-z</i> button.  This brings up a list of entries,
+sorted by surname.  }
+
+_textLanguagelong_ { <p>You can <i>access publications by language</i> by
+pressing the <i>languages</i> button.  This brings up a list of entries,
+sorted by language.  }
+
+_textAcronymlong_ { <p>You can <i>access publications by acronym occurance</i> by
+pressing the <i>acronyms</i> button.  This brings up a list of the acronyms,
+and the places that they occur.  }
+
+_textPhraselong_ { <p>You can <i>browse phrases occurring in publications</i> by
+pressing the <i>phrases</i> button.  This uses the phind phrase browser.  }
+
+_textArtistlong_ { <p>You can <i>access publications by artist</i> by
+pressing the <i>artists</i> button.  This brings up a list of entries,
+sorted by artist name.  }
+
+_textSourcelong_ { <p>You can <i>access publications by filename</i> by
+pressing the <i>filenames</i> button.  This brings up a list of entries,
+sorted by original filename.  }
+
+_textKeywordlong_ { <p>You can <i>access publications by keyword</i> by
+pressing the <i>keywords</i> button.  This brings up a list of keywords. }
+
+_textdefaultlongtext_ { <p>Click on the <i>unknown</i> button to browse
+publications (listing is sorted by an unknown field).  }
+
+_texthelptopics_ {
+<h2 align=left>Topics</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">How to search for particular words</a>
+<ul>
+  <li><a href="\#query-terms">Search terms</a>
+  <li><a href="\#query-type">Query type</a>
+  <li><a href="\#scope-of-queries">Scope of queries</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Collection preferences</a>
+  <li><a href="\#lang-prefs">Language preferences</a>
+  <li><a href="\#pres-prefs">Presentation preferences</a>
+  <li><a href="\#search-prefs">Search preferences</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ {How to read the documents}
+_booktextreadingdocs_ {How to read the books}
+_bibtextreadingdocs_ {Getting more information on a bibliography item}
+
+_texthelpreadingdocs_ {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>You can tell when you have arrived at an individual document because its
+title and author appear at the top left of the page. Beside these is the
+number of the current page, a box that allows you to select a new page, and
+forward and backward arrows.
+
+<p>Underneath is the text of the current section. When you have read
+through it, there are arrows at the bottom to take you on to the next
+section or back to the previous one.
+
+<p>Below the title and author are three buttons. Click on <i>expand
+text</i> to expand out the whole text of the current document. If the
+document is large, this could take a long time and use a lot of memory!
+Click on <i>detach</i> to make a new browser window for this
+document. (This is useful if you want to compare documents, or read two at
+once.)  Finally, when you do a search the words you search for are
+highlighted.  Click on <i>no highlighting</i> to remove the highlighting.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Click on the arrow to go to the next section ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... or back to the previous section</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Display all text, or not</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open this page in a new window</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Highlight search terms, or not</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>You can tell when you have arrived at an individual book because there
+is a photograph of its front cover at the top left of the page.  Beside the
+photograph is a table of contents with an arrow marking where you are.
+This table is expandable: click on the folders to open them or close them.
+Click on the open book at the top to close it.
+
+<p>Underneath is the text of the current section.  When you have read
+through it, there are arrows at the bottom to take you on to the next
+section or back to the previous one.
+
+<p>Below the photograph are four buttons. Click on <i>expand text</i> to
+expand out the whole text of the current section, or book.  If the book is
+large, this could take a long time and use a lot of memory! Click on
+<i>expand contents</i> to expand out the whole table of contents so that
+you can see the titles of all chapters and subsections. Click on
+<i>detach</i> to make a new browser window for this book.  (This is useful
+if you want to compare books, or read two at once.) Finally, when you do a
+search the words you search for are highlighted. Click on <i>no
+highlighting</i> to remove highlighting.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Open this bookshelf</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Open/close this book</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>View this section of the text</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Display all text, or not</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Expand table of contents, or not</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open this page in a new window</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Highlight search terms, or not</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Click the arrow to go to the next section ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... or back to the previous section</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Some bibliography items contain more information, such as an abstract.
+You can tell from the query response page if this is the case because they 
+are shown with the _icontext_ icon instead of the _iconblanktext_ icon.
+
+<p>Clicking on the _icontext_ icon will give you more information about the
+bibliography item.
+
+<p> Below the bibliography item are two buttons. Click on <i>detach</i> to 
+make a new browser window for this book. (This is useful if you want to compare
+bibliography items.) Finally, when you do a search the words you search for are 
+highlighted. Click on <i>no highlighting</i> to remove the highlighting.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open this page in a new window</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Highlight search terms, or not</td></tr>
+</table>
+}
+
+_texthelpsearching_ {
+<h2>How to search for particular words</h2>
+<p>
+  From the search page, you make a query in these simple steps:<p>
+  
+  <ol><li>Specify what items you want to search
+      <li>Say whether you want to search for all or just some of the words
+      <li>Type in the words you want to search for
+      <li>Click the <i>Begin Search</i> button
+  </ol>
+
+<p>When you make a query, the titles of twenty matching documents will be shown.
+There is a button at the end to take you on to the next twenty documents.  From
+there you will find buttons to take you on to the third twenty or back to the
+first twenty, and so on.  Click the title of any document, or the little button
+beside it, to see it.
+
+<p>A maximum of 100 is imposed on the number of
+  documents returned.  You can change this number by clicking the
+  <i>preferences</i> button at the top of the page.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Search terms</h3>
+
+<p>Whatever you type into the query box is interpreted as a list of words
+called "search terms."  Each term contains nothing but alphabetic characters
+and digits.  Terms are separated by white space.  If any other characters such
+as punctuation appear, they serve to separate terms just as though they were
+spaces.  And then they are ignored.  You can't search for words that include
+punctuation.
+
+<p>For example, the query<p>
+    <ul><kbd>Agro-forestry in the Pacific Islands: Systems for Sustainability (1993)</kbd></ul>
+      <p>will be treated the same as<p>
+      <ul><kbd>Agro forestry in the Pacific Islands  Systems for Sustainability  1993 </kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Query type</h3>
+
+<p>There are two different kinds of query.
+
+<ul>
+  <li>Queries for <b>all</b> of the words.  These look for documents (or
+      chapters, or titles) that contain all the words you have specified.
+      Documents that satisfy the query are displayed, in alphabetical
+      order.<p>
+
+  <li>Queries for <b>some</b> of the words.  Just list some terms that are
+      likely to appear in the documents you are looking for.  Documents are
+      displayed in order of how closely they match the query.  When determining
+
+      the degree of match,
+
+      <p><ul>
+        <li> the more search terms a document contains, the closer it matches;
+        <li> rare terms are more important than common ones;
+        <li> short documents match better than long ones.
+      </ul>
+</ul>
+
+<p>Use as many search terms as you like--a whole sentence, or even a
+whole paragraph.  If you specify only
+one term, documents will be ordered by its frequency of occurrence.<p>
+_texthelpscope_
+}
+
+_textdatesearch_{Searching with Dates}
+
+_texthelpdatesearch_{<h2>_textdatesearch_</h2>
+Date search lets you find documents that, as well as matching your search 
+terms, are about events within a certain timeframe.  You can search for 
+documents from a certain year or from a range of years.  Note that you do not 
+have to have any search terms -- you can search by date alone; and also that 
+you do not have to use dates in your search, if you do not type any dates in it
+ is just the same as if the date search didn't exist.<p>
+
+<p>_iconblankbar_
+<a name=datesearch-howto>
+<h3>How to use this feature:</h3>
+<ul>
+   <li>To search for documents about a single year:<p>
+   <ul>
+       <li>Type in any ordinary search terms as you normally would.	
+       <li>Type the year you want into the "Start (or only) date" box.
+       <li>If your date is from before the common era (also known as before 
+	   Christ), choose the B.C.E option from the pulldown menu next to that
+	   box.
+       <li>Begin your search as you ordinarily would.
+   </ul>
+<p><li>To search for documents about a time period or range of years:<p>
+   <ul>
+       <li>Type in any ordinary search terms as you normally would.
+       <li>Type the earlier date into the "Start (or only) date" box.
+       <li>Type the later date into the "End date" box.
+       <li>Select "B.C.E from the pulldown menu next to any date from before 
+           the common era (also known as before Christ).
+       <li>Begin your search as you ordinarily would.
+   </ul>    
+</ul><p>
+
+<p>_iconblankbar_
+<a name=datesearch-results>
+<h3>The way results of your search work</h3>
+
+Generally speaking a search for documents about the year 1903 will not return documents that, say, reference books written in 1903, just documents about 1903.  However, the way that the documents' dates are found, it will return documents that have a date range (for example 1899-1911) that includes 1903, and also those documents which, as part of their text name the century that 1903 is a part of (for example 20th century or twentieth century).  This means that for some documents, the dates in your search will not actually appear in the document text.  For a range search, all of this applies to every date in the range.<p>
+}
+
+_textchangeprefs_ {Changing your preferences}
+
+_texthelppreferences_ {<h2>_textchangeprefs_</h2>
+
+<p>When you click the <i>preferences</i> button at the top of the page you will
+be able to change some features of the interface to suit your own requirements.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Collection preferences</h3>
+
+Some collections comprise several subcollections, which can be searched
+independently or together, as one unit.  If so, you can select which
+subcollections to include in your searches on the Preferences page.
+
+<p>_iconblankbar_
+<a name=lang-prefs>
+<h3 align=left>Language preferences</h3>
+
+Each collection has a default presentation language, but you can switch to
+a different language if you like.  You can also alter the encoding scheme
+used by Greenstone for output to the browser -- the software chooses
+sensible defaults, but with some browsers better visual results can be used
+by switching to a different encoding scheme. All collections allow you to
+switch from the standard graphical interface format to a textual one. This
+is particularly useful for visually impaired users who use large screen
+fonts or speech synthesizers for output.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Presentation preferences</h3>
+
+Depending on the particular collection, there may be several options you can
+set that control the presentation.
+
+<p>Collections of Web pages allow you to suppress the Greenstone navigation bar at
+the top of each document page, so that once you have done a search you land at
+the exact Web page that matches without any Greenstone header.  To do another
+search you will have to use your browser's "back" button.  These collections
+also allow you to suppress Greenstone's warning message when you click a link
+that takes you out of the digital library collection and on to the Web itself.
+And in some Web collections you can control whether the links on the "Search
+Results" page take you straight to the actual URL in question, rather than to
+the digital library's copy of the page.
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Search preferences</h3>
+<p>Two pairs of buttons control the kind of text matching in the searches that
+you make. The first set (labeled "case differences") controls whether upper and
+lower case must match.  The second ("word endings") controls whether to ignore
+word endings or not.  It is possible to get a large query box, so that you can
+easily do paragraph-sized searching. It is surprisingly quick to search for
+large amounts of text.
+
+<p>For example, if the buttons <i>ignore case differences</i> and
+<i>ignore word endings</i> are selected, the query<p>
+    <ul><kbd>African building</kbd></ul>
+      <p>will be treated the same as<p>
+      <ul><kbd>africa builds</kbd></ul><p>
+      because the uppercase letter in "African" will be transformed to
+      lowercase, and  the suffixes "n" and "ing" will be removed from
+      "African" and "building" respectively (also, "s" would be removed from
+      "builds").
+
+<p>You can switch to an "advanced" query mode which allows you to combine terms
+using AND (&amp;), OR (|), and NOT (!). This allows you to specify more precise
+queries. You can turn the search history feature, which shows you your last few
+queries.  This makes it easy to repeat slightly modified versions of previous
+queries. Finally, you can control the number of hits returned, and the
+number presented on each screenful.
+}
+
+_texttanumbrowseoptions_ {There are _numbrowseoptions_ ways to find information in this collection:}
+
+_textsimplehelpheading_ {How to find information in the _collectionname_ collection}
+
+_texthelpscope_ {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Scope of queries</h3>
+
+<p>
+In most collections you can choose different indexes to search. For example, there might
+be author or title indexes. Or there might be chapter or paragraph indexes. Generally,
+the full matching document is returned regardless of which index you search.
+<p>If documents are books, they will be opened at the appropriate place.
+}
Index: /main/tags/2.38/gsdl/macros/english2.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/english2.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/english2.dm	(revision 21083)
@@ -0,0 +1,1007 @@
+######################################################################
+#
+# English Language text and icon macros 
+# -- this file contains english text that is of less importance
+# -- to translate when creating a new interface language
+######################################################################
+
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_documents_ { documents. }
+_lastupdate_ {Last updated}
+_ago_ {days ago.}
+_colnotbuilt_ {Collection not built.}
+
+_textpagetitle_ {Greenstone Digital Library}
+_textadmin_ {Administration Page}
+_textabgs_ {About Greenstone}
+_textgsdocs_ {Greenstone Documentation}
+
+_textimagecollector_ {
+Helps you create new collections, modify or add to existing ones, or delete
+collections
+}
+
+_textimageadmin_ {
+Allows you to add new users, summarizes the collections in the system,
+gives technical information on the Greenstone installation
+}
+
+_textimagegogreenstone_ {
+Tells you about the Greenstone software and the New Zealand Digital Library
+Project where it originated
+}
+
+_textimagegodocs_ {Greenstone manuals}
+
+_textpoem_ {
+<br><h2>Kia papapounamu te moana</h2>
+
+<p>kia hora te marino,
+<br>kia tere te karohirohi,
+<br>kia papapounamu te moana
+
+<p>may peace and calmness surround you,
+<br>may you reside in the warmth of a summer's haze,
+<br>may the ocean of your travels be as smooth as the polished greenstone.
+}
+
+_textgreenstone_ { 
+<p>Greenstone is a semi-precious stone that (like this software) is sourced
+in New Zealand.  In traditional Maori society it was the most highly prized
+and sought after of all substances.  It can absorb and hold <i>wairua</i>,
+which is a spirit or life force, and is endowed with traditional virtues
+that make it an appropriate emblem for a public-domain digital library
+project.  Its lustre shows charity; its translucence, honesty; its
+toughness, courage; and the sharp edge it can take, justice.  The carved
+piece used in the Greenstone Digital Library Software logo is a <i>patu</i>
+or fighting club, and is a family heirloom of one of our project members.
+In hand-to-hand combat its delivery is very quick, very accurate, and very
+complete.  We like to think these qualities also apply to our software, the
+razor sharp edge of the <i>patu</i> symbolizing the leading edge of
+technology.
+}
+
+_textaboutgreenstone_ {
+<p>Greenstone is a suite of software for building and distributing digital
+library collections. It provides a new way of organizing information and
+publishing it on the Internet or on CD-ROM.  Greenstone is produced by the
+<b>New Zealand Digital Library Project</b> at the <b>University of
+Waikato</b>, and developed and distributed in cooperation with
+<b>UNESCO</b> and the <b>Human Info NGO</b>.  It is open-source
+software, available from <a
+href="http://greenstone.org">http://greenstone.org</a> under the terms of
+the GNU General Public License.
+
+<p>The aim of the software is to empower users, particularly in
+universities, libraries, and other public service institutions, to
+build their own digital libraries.  Digital libraries are radically
+reforming how information is disseminated and acquired in UNESCO's
+partner communities and institutions in the fields of education,
+science and culture around the world, and particularly in developing
+countries.  We hope that this software will encourage the effective
+deployment of digital libraries to share information and place it in
+the public domain.
+
+
+<p>This software is developed and distributed as an international
+cooperative effort established in August 2000 among three parties.
+
+<table border="0">
+<tr valign="top">
+<td>
+<a href="http://nzdl.org"><b>New Zealand Digital Library Project at the University of Waikato</b></a>
+<br>
+Greenstone software grew out of this project, and this initiative
+has been endorsed by the Communication Sub-Commission of the New
+Zealand National Commission for UNESCO as part of New Zealand's
+contribution to UNESCO's programme.
+</td>
+<td></td>
+</tr>
+<tr valign="top">
+<td>
+<a href="http://www.unesco.org"><b>United Nations Educational, Scientific and Cultural Organization</b></a>
+<br>
+The dissemination of educational, scientific and cultural information
+throughout the world, and particularly its availability in developing
+countries, is central to UNESCO's goals as pursued within its
+intergovernmental Information for All Programme, and appropriate,
+accessible information and communication technology is seen as an important
+tool in this context.
+</td>
+<td><a href="http://www.unesco.org"><img src="_httpimg_/unesco.gif"
+border="0"></a></td>
+</tr>
+<tr valign="top">
+<td>
+<a href="http://humaninfo.org"><b>The Human Info NGO, based in Antwerp, Belgium</b></a>
+<br>
+This project works with UN agencies and other NGOs, and has established
+a worldwide reputation for digitizing documentation of interest to
+human development and making it widely available, free of charge to
+developing nations and on a cost-recovery basis to others.
+</td>
+<td><a href="http://humaninfo.org"><img src="_httpimg_/ghproj2.jpg" border="0"></a></td>
+</tr>
+</table>
+}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "THE NEW ZEALAND DIGITAL LIBRARY" ## nzdl_heading ## nzdl2gr ##
+_httpiconnzdl_ {_httpimg_/nzdl2gr.gif}
+_widthnzdl_ {457}
+_heightnzdl_ {181}
+
+## "select a collection" ## green_bar_left_aligned ## selcolgr ##
+_httpiconselcolgr_ {_httpimg_/selcolgr.gif}
+_widthselcolgr_ {537}
+_heightselcolgr_ {17}
+_altselcolgr_ {"Select a collection"}
+
+
+######################################################################
+# home help page
+package homehelp
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_text4buts_ {There are four further buttons on the home page}
+
+_textnocollections_ {
+<p>There are currently no collections available to this Greenstone installation. 
+To add some collections you may either
+<ul><li>Use <a href="_httppagecollector_">The Collector</a> to build new collections
+    <li>If you have a Greenstone cd-rom you may install collections from cd-rom
+</ul>
+}
+
+_text1coll_ {This Greenstone installation contains 1 collection}
+
+_textmorecolls_ {This Greenstone installation contains _1_ collections}
+
+######################################################################
+# external link package
+package extlink
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textextlink_ {External Link}
+_textlinknotfound_{Internal Link not Found}
+
+_textextlinkcontent_ {The link you have selected is external to any of your currently selected collections.
+    If you still wish to view this link and your browser has access to 
+    the Web, you can <a href="_nexturl_">go forward</a> to this page; otherwise 
+    use your browsers "back" button to return to the previous document.}
+
+_textlinknotfoundcontent_ {For reasons beyond our control, the internal link you have selected 
+    does not exist.  This is probably due to an error in the source collection.
+    Use your browsers "back" button to return to the previous document.}
+
+# should have arguments of collection, collectionname and link
+_foundintcontent_ {
+
+<h3>Link to "_2_" collection</h3>
+
+<p> The link you have selected is external to the "_collectionname_"
+    collection (it links to the "_2_" collection).
+    If you wish to view this link in the "_2_" collection you can 
+    <a href="_httpdoc_&c=_1_&cl=_cgiargcl_&d=_3_">go forward</a> to this page; 
+    otherwise use your browsers "back" button to return to the previous document.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+
+######################################################################
+# authentication page
+package authen
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textGSDLtitle_ {Greenstone Digital Library}
+
+_textusername_ {username}
+_textpassword_ {password}
+
+_textmessageinvalid_ {The page you have requested requires you to sign in.<br>
+_If_(_cgiargug_,[Note that you must belong to the "_cgiargug_" group to access this page]<br>)
+Please enter your Greenstone username and password.}
+
+_textmessagefailed_ {Either your username or password was incorrect.}
+
+_textmessagedisabled_ {Sorry, your account has been disabled. Please contact
+the webmaster for this site.}
+
+_textmessagepermissiondenied_ {Sorry, you do not have permission to access this page.}
+
+_textmessagestalekey_ {The link you have followed is now stale. 
+Please enter your password to access this page.}
+
+
+######################################################################
+# 'docs' page 
+package docs
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textnodocumentation_ {
+<p>This Greenstone installation does not include any documentation. This
+may be because:
+<ol>
+ <li>Greenstone was installed from CD-ROM using a compact installation.
+ <li>Greenstone was installed from a distribution downloaded from the
+ internet.
+</ol>
+In either case you may obtain the documentation either from the <i>docs</i>
+directory of a Greenstone CD-ROM or by visiting <a
+href="http://www.greenstone.org">http://www.greenstone.org</a>.
+}
+
+_textuserguide_ {User's Guide}
+_textinstallerguide_ {Installer's Guide}
+_textdeveloperguide_ {Developer's Guide}
+_textpaperguide_ {From Paper to Collection Guide}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "greenstone documentation" ## green_bar_left_aligned ## gsdocsgr ##
+_httpicongsdocsgr_ {_httpimg_/gsdocsgr.gif}
+_widthgsdocsgr_ {_pagewidth_}
+_heightgsdocsgr_ {17}
+
+
+######################################################################
+# collectoraction
+package collector
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textmore_ {more}
+_textcollector_ {The Collector}
+_textinfo_ {Collection information}
+_textsrce_ {Source data}
+_textconf_ {Configure collection}
+_textbild_ {Build}
+_textview_ {view}
+_textdel_ {delete collection}
+_textexpt_ {export collection}
+
+_textcollectorblurb_ {
+<i>The pen is mightier than the sword!
+<br>Building and distributing information collections carries responsibilities
+that you may want to reflect on before you begin.
+There are legal issues of copyright: being able to access documents doesn't
+mean you can necessarily give them to others.
+There are social issues:  collections should respect the customs of the
+community out of which the documents arise.
+And there are ethical issues: some things simply should not be made 
+available to others.
+<br>Be sensitive to the power of information and use it wisely.
+</i>
+}
+
+_textcb1_ {
+The Collector helps you to create new collections, modify or add to
+existing ones, or delete collections.  To do this you will be guided through a
+sequence of Web pages which request the information that is needed.
+}
+
+_textcb2_ {First, you must decide whether to}
+_textcnc_ {create a new collection}
+_textwec_ {work with an existing one, adding data to it or deleting it.}
+
+_textcb3_ {
+In order to build or modify digital library collections you must sign in.
+This is to protect you from others logging in to your computer and altering
+the information on it.  Note: for security reasons you will be
+automatically logged out once a 30 minute period has elapsed since you
+logged in.  If this happens, don't worry! -- you will be invited to log in
+again and can continue from where you left off.
+}
+
+_textcb4_ {
+Please enter your Greenstone username and password, and click the button to
+sign in.
+}
+
+_textfsc_ {
+First select the collection that you want to work with (write protected
+collections won't appear in this list).
+}
+
+_textwtc_ {With the collection you have selected, you can}
+_textamd_ {Add more data and rebuild the collection}
+_textetc_ {Edit the collection configuration file and rebuild the collection}
+_textdtc_ {Delete the collection entirely}
+_textetcfcd_ {Export the collection for writing to a self-installing Windows CD-ROM}
+_textcaec_ {Changing an existing collection}
+_textnwec_ {No write-enabled collections are available for modifying}
+_textcianc_ {Creating a new collection}
+_texttsosn_ {The sequence of steps needed to create a new digital library collection is:}
+_textsin_ {Specify its name (and associated information)}
+_textswts_ {Specify where the source data comes from}
+_textatco_ {Adjust the configuration options (advanced users only)}
+_textbtc_ {"Build" the collection (see below)}
+_textpvyh_ {Proudly view your handiwork.}
+
+_texttfsiw_ {
+The fourth step is where the computer does all the work.  In the "building"
+process the computer makes all the indexes and gathers together any other
+information that is required to make things work.  But first you have to
+specify the information.
+}
+
+_textadab_ {
+A diagram appears below that will help you keep track of where you are.
+The green button is the one that you click to carry on in the sequence.  As
+you go through the sequence, the buttons will change to yellow.  You can
+return to a previous page by clicking on the corresponding yellow button in
+the diagram.
+}
+
+_textwyar_ {
+When you are ready, click the green "collection information" button to
+begin creating your new digital library collection!
+}
+
+_textcnmbs_ {Collection name must be specified}
+_texteambs_ {Email address must be specified}
+_textpsea_ {Please specify email address in the form: usename@domain}
+_textdocmbs_ {Description of collection must be specified}
+
+_textwcanc_ {
+When creating a new collection you need to enter some preliminary
+information about the source data.  This process is structured as a series
+of Web pages, overseen by The Collector.  The bar at the bottom of the page
+shows you the sequence of pages to be completed.
+}
+
+_texttfc_ {Title for collection:}
+
+_texttctiasp_ {
+The collection title is a short phrase used throughout the digital library
+to identify the content of the collection.  Example titles include
+"Computer Science Technical Reports" and "Humanity Development Library."
+}
+
+_textcea_ {Contact email address:}
+
+_textteas_ {
+This email address specifies the first point of contact for the collection.
+If the Greenstone software detects a problem, a diagnostic report is sent
+to this address.  Enter an email address in its full form:
+<tt>name@domain</tt>.
+}
+
+_textatc_ {About this collection:}
+
+_texttiasd_ {
+This is a statement describing the principles governing what is included in
+the collection.  It appears on the first page when the collection is
+presented.
+}
+
+_textypits_ {
+Your position in the sequence is indicated by an arrow underneath--in this
+case, the "collection information" stage.  To proceed, click the green
+"source data" button.
+}
+
+_srcebadsources_ {
+<p>One or more of the input sources you specified is unavailable (marked
+_iconcross_ below).
+
+<p>This might be because
+<ul>
+<li>The file, FTP site or URL does not exist.
+<li>You need to dial up your ISP first.
+<li>You are trying to access a URL from behind a firewall (this is the case
+if you normally have to present a username and password to access the
+internet).
+</ul>
+
+<p>If this is a URL that you can see in your browser, it may be coming from
+a locally cached copy. Unfortunately, locally cached copies are invisible
+to our mirroring process. In this case we recommend that you download the
+pages using your browser first.
+}
+
+_textymbyco_ {
+<p>You may base your collection on either
+<ul>
+<li>The default structure
+<dl><dd>The new collection may contain html documents (.htm, .html), plain text
+documents (.txt, .text), MS Word documents (.doc), PDF documents (.pdf) or
+"m-box" format email documents (.mbx).</dd></dl>
+<li>An existing collection
+<dl><dd>The files in your new collection must be exactly the same type as those
+used to build the existing one.</dd></dl>
+</ul>
+}
+
+_textbtco_ {Base the collection on}
+_textand_ {Add new data}
+_textad_ {Adding data:}
+
+_texttftysb_ {
+The files that you specify below will be added to the collection. Make sure
+that you do not re-specify files that are already in the collection:
+otherwise two copies will be included. Files are identified by their full
+pathname, Web pages by their absolute Web address.
+}
+
+_textis_ {Input sources:}
+
+_textddd1_ {
+<p>If you use file:// or ftp:// to specify a file, that file will be
+downloaded.
+
+<p>If you use http:// it depends on whether the URL gives you a normal web
+page in your browser, or a list of files.  If a page, that page will be
+downloaded -- and so will all pages it links to, and all pages they link
+to, etc. -- provided they reside on the same site, below the URL.
+
+<p>If you use file:// or ftp:// to specify a folder or directory, or give a
+http:// URL that leads to a list of files, everything in the folder and all
+its sub-folders will be included in the collection.
+
+<p>Click the "more sources" button to get more input boxes.
+}
+
+_textddd2_ {
+<p>Click one of the green buttons. If you are an advanced user you may want
+to adjust the collection configuration. Alternatively, go straight to the
+building stage. Remember, you can always revisit an earlier stage by
+clicking its yellow button.
+}
+
+_textconf1_ {
+<p>The building and presentation of your collection are controlled by
+specifications in a special "configuration file".  Advanced users may want
+to alter the configuration settings.
+
+<center><p><b>If you are not an advanced user, just go to the bottom of the
+page.</b></center> 
+
+<p>To alter the configuration settings, edit the data that appears below.
+If you make a mistake, click on "Reset" to reinstate the original
+configuration settings.
+}
+
+_textreset_ {Reset}
+
+_textbild1_ {
+The collection is now being built: this might take some time. The building
+status line below gives feedback on how the operation is progressing.
+}
+
+_textbild2_ {
+To stop the building process at any time, click here.
+<br>The collection you are working on will remain intact.
+}
+
+_textstopbuild_ {stop building}
+
+_textbild3_ {
+If you leave this page (and have not cancelled the building process with
+the "stop building" button) the collection will continue to build and will
+be installed upon successful completion.
+}
+
+_textbuildcancelled_ {Build cancelled}
+
+_textbildcancel1_ {
+The collection building process was cancelled. Use the yellow buttons below
+to make changes to your collection or restart the building process.
+}
+
+_textbsupdate1_ {Building status update in 1 second}
+_textbsupdate2_ {Building status update in}
+_textseconds_ {seconds}
+_textbildsuc_ {Collection built successfully.}
+
+_textviewbildsummary_ {
+You may <a href="_httppagex_(bsummary)&c=_cgiargbc1dirname_" target=_top>view the build
+summary</a> of this collection for further details.
+}
+
+_textfailmsg11_ {
+The collection could not be built as it contains no data. Make sure that at
+least one of the directories or files you specified on the <i>source
+data</i> page exists and is of a type or (in the case of a directory)
+contains files of a type, that Greenstone can process.
+}
+
+_textfailmsg21_ {The collection could not be built (import.pl failed).}
+_textblcont_ {The build log contains the following information:}
+
+_texttryagain_ {
+Please <a href="_httppagecollector_" target=_top>restart the collector</a>
+and try again.
+}
+
+_textfailmsg31_ {The collection could not be built (buildcol.pl failed).}
+_textfailmsg41_ {The collection was built successfully but could not be installed.}
+_textfailmsg71_ {An unexpected error occurred while attepting to build your collection}
+_textretcoll_ {Return to the collector}
+
+_textdelperm_ {
+Some or all of the _cgiargbc1dirname_ collection could not be
+deleted. Possible causes are:
+<ul>
+<li> Greenstone does not have permission to delete the _gsdlhome_/collect/_cgiargbc1dirname_
+directory.<br>
+You may need to remove this directory manually to complete the removal of the _cgiargbc1dirname_
+collection from this computer.
+</ul>
+}
+
+_textdelinv_ {
+The _cgiargbc1dirname_ collection is protected or invalid. Deletion was cancelled.
+}
+
+_textdelsuc_ {The _cgiargbc1dirname_ collection was successfully deleted.}
+
+_textclonefail_ {
+The _cgiargclonecol_ collection cound not be cloned. Possible causes are:
+<ul>
+<li> The _cgiargclonecol_ collection doesn't exist
+<li> The _cgiargclonecol_ collection has no collect.cfg configuration file
+<li> Greenstone does not have permission to read the collect.cfg configuration file
+}
+
+_textcolerr_ {Collector error.}
+
+_texttmpfail_ {
+The collector failed to read from or write to a temporary file or
+directory. Possible causes are:
+<ul>
+<li> Greenstone does not have read/write access to the _gsdlhome_/tmp
+     directory.
+</ul>
+}
+
+_textmkcolfail_ {
+The collector failed to create the directory structure required by the new
+collection (mkcol.pl failed). Possible causes are:
+<ul>
+<li> Greenstone does not have permission to write to the _gsdlhome_/tmp
+     directory.
+<li> mkcol.pl perl script errors.
+</ul>
+}
+
+_textnocontent_ {
+Collector error: no collection name was provided for the new collection. Try 
+restarting the Collector from the beginning.
+}
+
+_textrestart_ {Restart the Collector}
+
+_textreloaderror_ {
+An error occurred while creating the new collection. This may have been due
+to Greenstone getting confused by the use of your browser's "reload" or
+"back" buttons (please try to avoid using these buttons while creating a
+collection with the Collector).  It is recommended that you restart the
+Collector from the beginning.
+}
+
+_textexptsuc_ {
+The _cgiargbc1dirname_ collection was successfully exported to the
+_gsdlhome_/tmp/exported\__cgiargbc1dirname_ directory.
+}
+
+_textexptfail_ {
+<p>Failed to export the _cgiargbc1dirname_ collection.
+
+<p>This is likely to be because Greenstone was installed without the
+necessary components to support the "Export Collection" function.
+<ul>
+
+ <li>If you installed Greenstone from a CD-ROM these components won't have
+ been installed unless you selected them during a &quot;Custom&quot; install.
+ You may add them to your installation by re-running the installation 
+ procedure.
+
+ <li>If you installed Greenstone from a web distribution you will need to
+ download and install an additional package to enable this function. Please
+ visit <a href="http://www.greenstone.org">http://www.greenstone.org</a> or
+ email <a
+ href="mailto:greenstone@cs.waikato.ac.nz">greenstone@cs.waikato.ac.nz</a>
+ for further details.
+
+</ul>
+}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "The collector" ## green_title ## h_colect ##
+_httpiconhcolect_ {_httpimg_/h\_colect.gif}
+
+## "collection information" ## collector_bar_button ## info ##
+_httpicongcinfoof_ {_httpimg_/gcinfoof.gif}
+_httpicongcinfoon_ {_httpimg_/gcinfoon.gif}
+_httpiconycinfoof_ {_httpimg_/ycinfoof.gif}
+_httpiconycinfoon_ {_httpimg_/ycinfoon.gif}
+_httpiconncinfoof_ {_httpimg_/ncinfoof.gif}
+
+## "source data" ## collector_bar_button ## srce ##
+_httpicongcsrceof_ {_httpimg_/gcsrceof.gif}
+_httpicongcsrceon_ {_httpimg_/gcsrceon.gif}
+_httpiconycsrceof_ {_httpimg_/ycsrceof.gif}
+_httpiconycsrceon_ {_httpimg_/ycsrceon.gif}
+_httpiconncsrceof_ {_httpimg_/ncsrceof.gif}
+
+## "configure collection" ## collector_bar_button ## conf ##
+_httpicongcconfof_ {_httpimg_/gcconfof.gif}
+_httpicongcconfon_ {_httpimg_/gcconfon.gif}
+_httpiconycconfof_ {_httpimg_/ycconfof.gif}
+_httpiconycconfon_ {_httpimg_/ycconfon.gif}
+_httpiconncconfof_ {_httpimg_/ncconfof.gif}
+
+## "build collection" ## collector_bar_button ## bild ##
+_httpicongcbildof_ {_httpimg_/gcbildof.gif}
+_httpicongcbildon_ {_httpimg_/gcbildon.gif}
+_httpiconycbildof_ {_httpimg_/ycbildof.gif}
+_httpiconycbildon_ {_httpimg_/ycbildon.gif}
+_httpiconncbildof_ {_httpimg_/ncbildof.gif}
+
+## "view collection" ## collector_bar_button ## view ##
+_httpicongcviewof_ {_httpimg_/gcviewof.gif}
+_httpicongcviewon_ {_httpimg_/gcviewon.gif}
+_httpiconycviewof_ {_httpimg_/ycviewof.gif}
+_httpiconycviewon_ {_httpimg_/ycviewon.gif}
+_httpiconncviewof_ {_httpimg_/ncviewof.gif}
+
+## "delete collection" ## collector_bar_button ## del ##
+_httpicongcdelof_ {_httpimg_/gcdelof.gif}
+_httpicongcdelon_ {_httpimg_/gcdelon.gif}
+
+## "export collection" ## collector_bar_button ## expt ##
+_httpicongcexptof_ {_httpimg_/gcexptof.gif}
+_httpicongcexpton_ {_httpimg_/gcexpton.gif}
+
+
+######################################################################
+# 'gsdl' page
+package gsdl
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textgreenstone1_ {
+Greenstone is a suite of software which has the ability to serve digital
+library collections and build new collections.  It provides a new way of
+organizing information and publishing it on the Internet or on CD-ROM.
+Greenstone is produced by the New Zealand Digital Library Project at the
+University of Waikato, and distributed in cooperation with UNESCO and the
+Human Info NGO. It is open-source software, available from
+<i>http://greenstone.org</i> under the terms of the GNU General Public
+License.
+}
+
+_textgreenstone2_ {
+The New Zealand Digital Library website (<a
+href="http://nzdl.org">http://nzdl.org</a>) contains numerous example
+collections, all created with the Greenstone software, which are publicly
+available for you to peruse. They exemplify various searching and browsing
+options, and include collections in Arabic, Chinese, French, Maori, and
+Spanish, as well as English. There are also some music collections.
+}
+
+_textgreenstone3_ {
+Greenstone runs on Windows and Unix. The distribution includes ready-to-use
+binaries for all versions of Windows, and for Linux. It also includes
+complete source code for the system, which can be compiled using Microsoft
+C++ or gcc.  Greenstone works with associated software that is also freely
+available: the Apache Webserver and PERL. The user interface uses a Web
+browser: typically Netscape Navigator or Internet Explorer.
+}
+
+_textgreenstone4_ {
+Many document collections are distributed on CD-ROM using the Greenstone
+software. For example, the <i>Humanity Development Library</i> contains
+1,230 publications ranging from accounting to water sanitation. It runs on
+minimal computing facilities such as those typically found in developing
+countries. The information can be accessed by searching, browsing by
+subject, browsing by titles, browsing by organisation, browsing a list of
+how-tos, and by randomly viewing the book covers.
+}
+
+_textgreenstone5_ {
+Greenstone is specifically designed to be highly extensible and
+customisable. New document and metadata formats are accommodated by writing
+"plugins" (in Perl). Analogously, new metadata browsing structures can be
+implemented by writing "classifiers." The user interface look-and-feel can
+be altered using "macros" written in a simple macro language. A Corba
+protocol allows agents (e.g. in Java) to use all the facilities associated
+with document collections. Finally, the source code, in C++ and Perl, is
+available and accessible for modification.
+}
+
+_textthreedocs_ {There are three documents that explain the Greenstone system:}
+_textinstall_ {The Greenstone Digital Library Software Installer's Guide}
+_textuser_ {The Greenstone Digital Library Software User's Guide}
+_textdevelop_ {The Greenstone Digital Library Software Developer's Guide}
+
+_textmailinglist_ {
+There is a mailing list intended primarily for discussions about the
+Greenstone digital library software.  Active users of Greenstone should
+consider joining the mailing list and contributing to the discussions.  The
+mailing list is hosted by the Pathfinder Library System in beautiful Grand
+Junction, Colorado (John Campbell, john@colosys.net). To subscribe, send
+email to <a href="mailto:majordomo@colosys.net">majordomo@colosys.net</a>
+with the text <ul>subscribe greenstone </ul> (no subject, no name, nothing
+else). To send a message to the list, address it to <a
+href="mailto:greenstone@colosys.net">greenstone@colosys.net</a>.
+}
+
+_textreport_ {
+We want to ensure that this software works well for you.  Please report any
+bugs to <a href="mailto:majordomo@colosys.net">greenstone@cs.waikato.ac.nz</a>
+}
+
+_textcredits_ {credits}
+
+_textwhoswho_ {
+The Greenstone software is a collaborative effort between many
+people. Rodger McNab and Stefan Boddie are the principal architects and
+implementors.  Contributions have been made by David Bainbridge, George
+Buchanan, Hong Chen, Elke Duncker, Carl Gutwin, Geoff Holmes, John
+McPherson, Craig Nevill-Manning, Gordon Paynter, Bernhard Pfahringer, Todd
+Reed, Bill Rogers, and Stuart Yeates. Other members of the New Zealand
+Digital Library project provided advice and inspiration in the design of
+the system: Mark Apperley, Sally Jo Cunningham, Steve Jones, Te Taka
+Keegan, Michel Loots, Malika Mahoui and Lloyd Smith. We would also like to
+acknowledge all those who have contributed to the GNU-licensed packages
+included in this distribution: MG, GDBM, PDFTOHTML, WGET, WVWARE and XLHTML.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+## "about the greenstone software" ## green_bar_left_aligned ## abgsgr ##
+_httpiconabgsgr_ {_httpimg_/abgsgr.gif}
+_widthabgsgr_ {_pagewidth_}
+_heightabgsgr_ {17}
+
+
+######################################################################
+# 'users' page
+package userslistusers
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textlocu_ {List of current users}
+_textuser_ {user}
+_textas_ {account status}
+_textgroups_ {groups}
+_textcomment_ {comment}
+_textadduser_ {add a new user}
+_textedituser_ {edit}
+_textdeleteuser_ {delete}
+
+
+######################################################################
+# 'users' page
+package usersedituser
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textedituser_ {Edit user information}
+_textadduser_ {Add a new user}
+
+_textaboutusername_ {
+Usernames must be between 2 and 30 characters long. They can contain
+alphanumeric characters, '.', and '_'.
+}
+
+_textaboutpassword_ {
+Passwords must be between 3 and 8 characters long. They can contain any
+normal printable ASCII characters.
+}
+
+_textoldpass_ {If this field is blank the old password will be kept.}
+_textenabled_ {enabled}
+_textdisabled_ {disabled}
+
+_textaboutgroups_ {
+Groups is a comma separated list, do not put spaces after the commas.
+}
+
+
+######################################################################
+# 'users' page
+package usersdeleteuser
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdeleteuser_ {Delete a user}
+_textremwarn_ {Do you really want to permanently remove user <b>_cgiargumun_</b>?}
+
+
+######################################################################
+# 'users' page
+package userschangepasswd
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textchangepw_ {Change password}
+_textoldpw_ {old password}
+_textnewpw_ {new password}
+_textretype_ {retype new password}
+
+
+######################################################################
+# 'users' page
+package userschangepasswdok
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsuccess_ {Your password was successfully changed.}
+
+
+######################################################################
+# 'users' page
+package users
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textinvalidusername_ {The username is invalid.}
+_textinvalidpassword_ {The password is invalid.}
+_textemptypassword_ {Please enter an initial password for this user.}
+_textuserexists_ {This user already exists, please enter another username.}
+
+_textusernameempty_ {Please enter your username.}
+_textpasswordempty_ {You must enter your old password.}
+_textnewpass1empty_ {Enter your new password and then retype it.}
+_textnewpassmismatch_ {The two versions of your new password did not match.}
+_textnewinvalidpassword_ {You entered an invalid password.}
+_textfailed_ {Either your username or password was incorrect.}
+
+
+######################################################################
+# 'status' pages
+package status
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textversion_ {Greenstone version number}
+_textframebrowser_ {You must have a frame enabled browser to view this.}
+_textusermanage_ {User management}
+_textlistusers_ {list users}
+_textaddusers_ {add a new user}
+_textchangepasswd_ {change password}
+_textinfo_ {Technical information}
+_textgeneral_ {general}
+_textarguments_ {arguments}
+_textactions_ {actions}
+_textbrowsers_ {browsers}
+_textprotocols_ {protocols}
+_textconfigfiles_ {Configuration files}
+_textlogs_ {Logs}
+_textusagelog_ {usage log}
+_texterrorlog_ {error log}
+_textadminhome_ {admin home}
+_textreturnhome_ {Greenstone home}
+_titlewelcome_ { Administration }
+_textmaas_ {Maintenance and administration services available include:}
+_textvol_ {view on-line logs}
+_textcmuc_ {create, maintain and update collections}
+_textati_ {access technical information such as CGI arguments}
+
+_texttsaa_ {
+These services are accessed using the side navigation bar on the lefthand
+side of the page.
+}
+
+_textcolstat_ {Collection Status}
+
+_textcwoa_ {
+Collections will only appear as &quot;running&quot; if their build.cfg
+files exist, are readable, contain a valid builddate field (i.e. > 0),
+and are in the collection's index directory (i.e. NOT the building
+directory).
+}
+
+_textcafi_ {click <i>abbrev.</i> for information on a collection}
+_textcctv_ {click <i>collection</i> to view a collection}
+_textsubc_ {Submit Changes}
+_texteom_ {Error opening main.cfg}
+_textftum_ {Failed to update main.cfg}
+_textmus_ {main.cfg updated successfully}
+
+
+######################################################################
+# 'bsummary' pages
+package bsummary
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textbsummary_ {Build summary for _collectionname_ collection}
+_textflog_ {Fail log for _collectionname_ collection}
+
+
Index: /main/tags/2.38/gsdl/macros/extlink.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/extlink.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/extlink.dm	(revision 21083)
@@ -0,0 +1,17 @@
+package extlink
+
+_header_ {_htmlhead_}
+
+_foundcontent_ {
+
+<h3>_textextlink_</h3>
+
+<p> _textextlinkcontent_
+}
+
+_notfoundcontent_ {
+
+<h3>_textlinknotfound_</h3>
+
+<p> _textlinknotfoundcontent_
+}
Index: /main/tags/2.38/gsdl/macros/french.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/french.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/french.dm	(revision 21083)
@@ -0,0 +1,885 @@
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textperiodicals_ [l=fr] {PÃ©riodiques}
+_textsource_ [l=fr] {source: }
+_textdate_ [l=fr] {date: }
+_textnumpages_ [l=fr] {nombre de pages: }
+
+_textsignin_ [l=fr] {se connecter}
+
+_textdefaultcontent_ [l=fr] {La page demandÃ©e n'a pu Ãªtre trouvÃ©e. Utilisez s'il vous plait
+le bouton 'Retour' de votre navigateur ou le bouton 'Accueil' pour retourner
+Ã  la BibliothÃšque NumÃ©rique Greenstone.}
+
+_textdefaulttitle_ [l=fr] {Erreur GSDL}
+
+_collectionextra_ [l=fr] {Cette collection contient _about:numdocs_ documents.
+Sa derniÃšre mise a jour a Ã©tÃ© faite il y a _about:builddate_ jours.}
+
+_textimagecollection_ [l=fr] {}
+_textimageabout_ [l=fr]      {Page Ã  propos}
+_textimagehome_ [l=fr]       {Page d'accueil}
+_textimagehelp_ [l=fr]       {Page d'aide}
+_textimagepref_ [l=fr]       {Page de prÃ©fÃ©rences}
+_textimagegreenstone_ [l=fr] {Logiciel de BibliothÃšque NumÃ©rique Greenstone}
+
+_textimagesearch_ [l=fr]       {Recherche de termes spÃ©cifiques}
+_textimageTitle_ [l=fr]        {Naviguer Ã  travers la liste alphabÃ©tique des titres}
+_textimageList_ [l=fr]         {Naviguer Ã  travers la liste des documents}
+_textimageCreator_ [l=fr]      {Naviguer Ã  travers la liste alphabÃ©tique des auteurs}
+_textimagesÃ©ries_ [l=fr]       {Naviguer Ã  travers les diffÃ©rentes publications}
+_textimageDate_ [l=fr]         {Naviguer par dates}
+_textimageSubject_ [l=fr]      {Naviguer par catÃ©gorie de sujet}
+_textimageOrganization_ [l=fr] {Naviguer par organisation}
+_textimageHowto_ [l=fr]        {Naviguer en utilisant les rubriques Comment faire}
+_textimageTopic_ [l=fr]        {Naviguer en utilisant les Ã©ditions spÃ©ciales a thÃšme}
+_textimageBrowse_ [l=fr]       {Naviguer}
+_textimagePeople_ [l=fr]       {Naviguer par liste alphabÃ©tique de personnes}
+
+_texticontabsearchgreen_ [l=fr]  {Recherche}
+_texticontabdategreen_ [l=fr]    {Dates}
+_texticontabsÃ©riesgreen_ [l=fr]  {SÃ©ries}
+_texticontabauthorgreen_ [l=fr]  {Auteurs A-Z}
+_texticontabtitlegreen_ [l=fr]   {Titres A-Z}
+_texticontablistgreen_ [l=fr]    {Listes}
+_texticontabsubjectgreen_ [l=fr] {Sujets}
+_texticontaborggreen_ [l=fr]     {Organisations}
+_texticontabhowgreen_ [l=fr]     {Comment faire}
+_texticontabtopicgreen_ [l=fr]   {ThÃšmes}
+_texticontabbrwsegreen_ [l=fr]   {Naviguer}
+_texticontabPeoplegreen_ [l=fr]  {Personnes A-Z}
+
+_texticontext_ [l=fr]       {Afficher le document}
+_texticonclosedbook_ [l=fr] {Ouvrir ce document et afficher son contenu}
+_texticonnext_ [l=fr]       {Vers la section suivante}
+_texticonprev_ [l=fr]       {Vers la section prÃ©cÃ©dente}
+
+_texticonmidi_   [l=fr] {Voir le document au format MIDI}
+_texticonmsword_ [l=fr] {Voir le document au format Microsoft Word}
+_texticonpdf_    [l=fr] {Voir le document au format PDF}
+_texticonps_     [l=fr] {Voir le document au format PostScript}
+_texticonppt_    [l=fr] {Voir le document au format PowerPoint}
+_texticonrtf_    [l=fr] {Voir le document au format RTF}
+_texticonxls_    [l=fr] {Voir le document au format Microsoft Excel}
+
+_page_ [l=fr]  {page }
+_pages_ [l=fr] {pages}
+_of_ [l=fr]    { de }
+_vol_ [l=fr]   {Volume}
+_num_ [l=fr]   {Nombre}
+
+_textmonth00_ [l=fr] {}
+_textmonth01_ [l=fr] {janvier}
+_textmonth02_ [l=fr] {fÃ©vrier}
+_textmonth03_ [l=fr] {mars}
+_textmonth04_ [l=fr] {avril}
+_textmonth05_ [l=fr] {mai}
+_textmonth06_ [l=fr] {juin}
+_textmonth07_ [l=fr] {juillet}
+_textmonth08_ [l=fr] {aoÃ»t}
+_textmonth09_ [l=fr] {septembre}
+_textmonth10_ [l=fr] {octobre}
+_textmonth11_ [l=fr] {novembre}
+_textmonth12_ [l=fr] {dÃ©cembre}
+
+_magazines_ [l=fr] {Magazines}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "ACCUEIL" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=fr] {_httpimg_/fr/chomeof.gif}
+_httpiconchomeon_ [l=fr] {_httpimg_/fr/chomeon.gif}
+
+## "AIDE" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=fr] {_httpimg_/fr/chelpof.gif}
+_httpiconchelpon_ [l=fr] {_httpimg_/fr/chelpon.gif}
+
+## "PR&Eacute;F&Eacute;RENCES" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=fr] {_httpimg_/fr/cprefof.gif}
+_httpiconcprefon_ [l=fr] {_httpimg_/fr/cprefon.gif}
+
+## "aide" ## green_title ## h_help ##
+_httpiconhhelp_ [l=fr] {_httpimg_/fr/h\_help.gif}
+_widthhhelp_ [l=fr] {200}
+_heighthhelp_ [l=fr] {57}
+
+## "auteurs a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=fr] {_httpimg_/fr/tauthgr.gif}
+_httpicontauthof_ [l=fr] {_httpimg_/fr/tauthof.gif}
+_httpicontauthon_ [l=fr] {_httpimg_/fr/tauthon.gif}
+_widthtauthx_ [l=fr] {100}
+
+## "s&eacute;ries" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=fr] {_httpimg_/fr/tsergr.gif}
+_httpicontserof_ [l=fr] {_httpimg_/fr/tserof.gif}
+_httpicontseron_ [l=fr] {_httpimg_/fr/tseron.gif}
+_widthtserx_ [l=fr] {87}
+
+## "dates" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=fr] {_httpimg_/fr/tdategr.gif}
+_httpicontdateof_ [l=fr] {_httpimg_/fr/tdateof.gif}
+_httpicontdateon_ [l=fr] {_httpimg_/fr/tdateon.gif}
+_widthtdatex_ [l=fr] {87}
+
+## "sujets" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=fr] {_httpimg_/fr/tsubjgr.gif}
+_httpicontsubjon_ [l=fr] {_httpimg_/fr/tsubjon.gif}
+_httpicontsubjof_ [l=fr] {_httpimg_/fr/tsubjof.gif}
+_widthtsubjx_ [l=fr] {87}
+
+## "organisations" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=fr] {_httpimg_/fr/torggr.gif}
+_httpicontorgon_ [l=fr] {_httpimg_/fr/torgon.gif}
+_httpicontorgof_ [l=fr] {_httpimg_/fr/torgof.gif}
+_widthtorgx_ [l=fr] {114}
+
+## "comment faire" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=fr] {_httpimg_/fr/thowgr.gif}
+_httpiconthowon_ [l=fr] {_httpimg_/fr/thowon.gif}
+_httpiconthowof_ [l=fr] {_httpimg_/fr/thowof.gif}
+_widththowx_ [l=fr] {122}
+
+## "th&egrave;mes" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=fr] {_httpimg_/fr/ttopicgr.gif}
+_httpiconttopicon_ [l=fr] {_httpimg_/fr/ttopicon.gif}
+_httpiconttopicof_ [l=fr] {_httpimg_/fr/ttopicof.gif}
+_widthttopicx_ [l=fr] {87}
+
+## "naviguer" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=fr] {_httpimg_/fr/tbrwsegr.gif}
+_httpicontbrwseon_ [l=fr] {_httpimg_/fr/tbrwseon.gif}
+_httpicontbrwseof_ [l=fr] {_httpimg_/fr/tbrwseof.gif}
+_widthtbrwsex_ [l=fr] {87}
+
+## "recherche" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=fr] {_httpimg_/fr/tsrchgr.gif}
+_httpicontsrchof_ [l=fr] {_httpimg_/fr/tsrchof.gif}
+_httpicontsrchon_ [l=fr] {_httpimg_/fr/tsrchon.gif}
+_widthtsrchx_ [l=fr] {87}
+
+## "titres a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=fr] {_httpimg_/fr/ttitlgr.gif}
+_httpiconttitlof_ [l=fr] {_httpimg_/fr/ttitlof.gif}
+_httpiconttitlon_ [l=fr] {_httpimg_/fr/ttitlon.gif}
+_widthttitlx_ [l=fr] {87}
+
+## "personnes" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=fr] {_httpimg/tpeopgr.gif}
+_httpicontpeopof_ [l=fr] {_httpimg/tpeopof.gif}
+_httpicontpeopon_ [l=fr] {_httpimg/tpeopon.gif}
+_widthtpeopx_ [l=fr] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=fr] {Ã propos de cette collection}
+
+_textsubcols1_ [l=fr] {<p>La collection comprend _1_ sous-collections au total:
+<blockquote>}
+
+_textsubcols2_ [l=fr] {</blockquote>
+Vous pouvez vÃ©rifier (et modifier) la collection que vous
+utilisez couramment en utilisant la page des prÃ©fÃ©rences.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "Ã  propos" ## green_title ## h_about ##
+_httpiconhabout_ [l=fr] {_httpimg_/fr/h\_about.gif}
+_widthhabout_ [l=fr] {200}
+_heighthabout_ [l=fr] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=fr] {Titres A-Z}
+_texticonhauth_ [l=fr] {Auteurs A-Z}
+_texticonhsubj_ [l=fr] {Sujets}
+_texticonhser_ [l=fr] {SÃ©ries}
+_texticonhdate_ [l=fr] {Dates}
+_texticonhhow_ [l=fr] {Comment faire}
+_texticonhorg_ [l=fr] {Organisations}
+_texticonhbrwse_ [l=fr] {Naviguer}
+_texticonhpeople_ [l=fr] {Personnes A-Z}
+
+_texticonopenbookshelf_ [l=fr]   {Ferme cette partie de la bibliothÃšque}
+_texticonclosedbookshelf_ [l=fr] {Ouvre cette partie de la bibliothÃšque et affiche son contenu}
+_texticonopenbook_ [l=fr]        {Ferme ce livre}
+_texticonclosedfolder_ [l=fr]    {Ouvre ce rÃ©pertoire et affiche son contenu}
+_texticonclosedfolder2_ [l=fr]   {Ouvrir la sous-partie: }
+_texticonopenfolder_ [l=fr]      {Ferme ce rÃ©pertoire}
+_texticonopenfolder2_ [l=fr]     {Fermer la sous-partie: }
+_texticonsmalltext_ [l=fr]       {Affiche cette portion de texte}
+_texticonsmalltext2_ [l=fr]      {Afficher le texte: }
+_texticonpointer_ [l=fr]         {Partie active}
+_texticondetach_ [l=fr]          {Ouvre cette page dans une nouvelle fenÃªtre}
+_texticonhighlight_ [l=fr]       {Met en Ã©vidence les termes de recherche}
+_texticonnohighlight_ [l=fr]     {Supprime la mise en Ã©vidence les termes de recherche}
+_texticoncontracttoc_ [l=fr]     {RÃ©duit la table des matiÃšres}
+_texticonexpandtoc_ [l=fr]       {DÃ©veloppe la table des matiÃšres}
+_texticonexpandtext_ [l=fr]      {Affiche tout le texte}
+_texticoncontracttext_ [l=fr]    {Affiche le texte uniquement pour la partie sÃ©lectionnÃ©e active}
+_texticonwarning_ [l=fr]         {<b>Attention: </b>}
+_texticoncont_ [l=fr]            {Souhaitez-vous continuer?}
+
+_textltwarning_ [l=fr] {
+   <p><center>
+   <table cellspacing=0 cellpadding=0 width=_pagewidth_>
+    <tr valign=top><td>_iconwarning_ DÃ©velopper le texte 
+    Ã  ce niveau gÃ©nÃ©rera une importante quantitÃ© d'informations 
+    Ã  traiter par votre navigateur _imagecont_
+   </td></tr></table></center>
+}
+
+_textgoto_ [l=fr]  { aller Ã  la page}
+_textintro_ [l=fr] { <i>(texte d'introduction)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "titres a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=fr] {_httpimg_/fr/h\_title.gif}
+_widthhtitle_  [l=fr] {200}
+_heighthtitle_ [l=fr] {57}
+
+## "auteurs a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=fr] {_httpimg_/fr/h\_auth.gif}
+_widthhauth_ [l=fr] {200}
+
+## "sujets" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=fr] {_httpimg_/fr/h\_subj.gif}
+_widthhsubj_ [l=fr] {200}
+_heighthsubj_ [l=fr] {57}
+
+## "s&eacute;ries" ## green_title ## h_ser ##
+_httpiconhser_ [l=fr] {_httpimg_/fr/h\_ser.gif}
+_widthhser_ [l=fr] {200}
+_heighthser_ [l=fr] {57}
+
+## "dates" ## green_title ## h_date ##
+_httpiconhdate_ [l=fr] {_httpimg_/fr/h\_date.gif}
+_widthhdate_ [l=fr] {200}
+_heighthdate_ [l=fr] {57}
+
+## "comment faire" ## green_title ## h_how ##
+_httpiconhhow_ [l=fr] {_httpimg_/fr/h\_how.gif}
+_widthhhow_ [l=fr] {200}
+_heighthhow_ [l=fr] {57}
+
+## "th&egrave;mes" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=fr] {_httpimg_/fr/h\_topic.gif}
+_widthhtopic_ [l=fr] {200}
+_heighthtopic_ [l=fr] {57}
+
+## "organisations" ## green_title ## h_org ##
+_httpiconhorg_ [l=fr] {_httpimg_/fr/h\_org.gif}
+_widthhorg_ [l=fr] {250}
+_heighthorg_ [l=fr] {57}
+
+## "naviguer" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=fr] {_httpimg_/fr/h\_brwse.gif}
+_widthhbrwse_ [l=fr] {200}
+_heighthbrwse_ [l=fr] {57}
+
+## "personnes" ## green_title ## h_people ##
+_httpiconhpeople_ [l=fr] {_httpimg_/fr/h\_people.gif}
+_widthhpeople_ [l=fr] {200}
+_heighthpeople_ [l=fr] {57}
+
+## "CONTINER?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=fr] {_httpimg_/fr/contof.gif}
+_httpiconconton_ [l=fr] {_httpimg_/fr/conton.gif}
+
+## "D&Eacute;VELOPPER LE TEXTE" ## document_button ## eallt ## 
+_httpiconealltof_ [l=fr] {_httpimg_/fr/ealltof.gif}
+_httpiconeallton_ [l=fr] {_httpimg_/fr/eallton.gif}
+
+## "R&Eacute;DUIRE LE CONTENU" ## document_button ## econc ##
+_httpiconeconcof_ [l=fr] {_httpimg_/fr/econcof.gif}
+_httpiconeconcon_ [l=fr] {_httpimg_/fr/econcon.gif}
+
+## "D&Eacute;TACHER" ## document_button ## edtch ##
+_httpiconedtchof_ [l=fr] {_httpimg_/fr/edtchof.gif}
+_httpiconedtchon_ [l=fr] {_httpimg_/fr/edtchon.gif}
+
+## "D&Eacute;VELOPPER LE CONTENU" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=fr] {_httpimg_/fr/eexpcof.gif}
+_httpiconeexpcon_ [l=fr] {_httpimg_/fr/eexpcon.gif}
+
+## "R&Eacute;DUIRE LE TEXTE" ## document_button ## etsec ##
+_httpiconetsecof_ [l=fr] {_httpimg_/fr/etsecof.gif}
+_httpiconetsecon_ [l=fr] {_httpimg_/fr/etsecon.gif}
+
+## "METTRE EN &Eacute;VIDENCE" ## document_button ## ehl ##
+_httpiconehlof_ [l=fr] {_httpimg_/fr/ehlof.gif}
+_httpiconehlon_ [l=fr] {_httpimg_/fr/ehlon.gif}
+
+## "SUPPRIMER LA MISE EN &Eacute;VIDENCE" ## document_button ## enhl ##
+_httpiconenhlof_ [l=fr] {_httpimg_/fr/enhlof.gif}
+_httpiconenhlon_ [l=fr] {_httpimg_/fr/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=fr]   {_If_(_thislast_,resultats _thisfirst_ - _thislast_ pour la recherche: _cgiargq_,Pas de documents contenant: _cgiargq_)}
+_textnoquerytitle_ [l=fr] {Page de recherche}
+
+_texticonthispage_ [l=fr]        {Recherche}
+_textsome_ [l=fr]                {_If_(_cgiargb_,ranked,quelques uns des)}
+_textall_ [l=fr]                 {_If_(_cgiargb_,booleen,tous les)}
+_texticonqueryresultsbar_ [l=fr] {}
+_textfreqmsg1_ [l=fr]            {Nombre de mots: }
+_textpostprocess_ [l=fr]         {_If_(_quotedquery_,<br><i>post-traitÃ©s Ã  retrouver _quotedquery_</i>
+)}
+
+_textmorethan_ [l=fr]    {Plus de }
+_textapprox_ [l=fr]      {Ã propos }
+_textnodocs_ [l=fr]      {Aucun document ne satisfait la requÃªte.}
+_text1doc_ [l=fr]        {1 document satisfait la requÃªte.}
+_textlotsdocs_ [l=fr]    {documents satisfont la requÃªte.}
+_textmatches_ [l=fr]     {RÃ©sultats }
+_textbeginsearch_ [l=fr] {DÃ©marrer la recherche}
+
+_textsimplesearch_ [l=fr] {Rechercher des _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in _nselection_ language) 
+contenant _querytypeselection_ mots}
+
+_textadvancedsearch_ [l=fr] {Rechercher _If_(_hselection_, _hselection_, _defaultindextext_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in _nselection_ language) 
+en utilisant _querytypeselection_ requÃªte}
+
+_textjselect_ [l=fr] {_If_(_hselection_, of) _jselection_}
+
+_textstemon_ [l=fr]  { (ignorer la fin des mots)}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "recherche" ## green_title ## h_search ##
+_httpiconhsearch_ [l=fr] {_httpimg_/fr/h\_search.gif}
+_widthhsearch_ [l=fr] {200}
+_heighthsearch_ [l=fr] {57}
+
+## "rÃ©sultats" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=fr] {_httpimg_/fr/qryresb.gif}
+_widthqryresb_ [l=fr] {_pagewidth_}
+_heightqryresb_ [l=fr] {17}
+
+## "Affichage" ## hand_made ##
+_httpicondisplay_ [l=fr] {_httpimg_/display.gif}
+_widthdisplay_ [l=fr] {60}
+_heightdisplay_ [l=fr] {20}
+
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# use similar wording to previous...
+#_textprefschanged_ [l=fr] {
+#Une fois les pr&eacute;f&eacute;rences appliqu&eacute;s, veillez &agrave; ne pas utiliser le bouton &laquo;Pr&eacute;c&eacute;dent&raquo; de votre navigateur. Utilisez plut&ocirc;t un des boutons ci-dessus.}
+
+_textprefschanged_ [l=fr] {
+Une fois les pr&eacute;f&eacute;rences appliqu&eacute;s, veuillez ne pas
+utiliser le bouton 'Retour' de votre navigateur. Utilisez plut&ocirc;t un des
+boutons ci-dessus.}
+
+
+
+
+_textsearchprefs_ [l=fr]       {Pr&eacute;f&eacute;rences de recherche}
+_textcollectionprefs_ [l=fr]   {Pr&eacute;f&eacute;rences de collection}
+_textpresentationprefs_ [l=fr] {Pr&eacute;f&eacute;rences de pr&eacute;sentation}
+_textpreferences_ [l=fr]       {Pr&eacute;f&eacute;rences}
+_textcasediffs_ [l=fr]         {Respecter la casse:}
+_textignorecase_ [l=fr]        { ignorer la casse}
+_textmatchcase_ [l=fr]         { les majuscules et les minuscules doivent correspondre}
+_textwordends_ [l=fr]          {La fin des mots:}
+_textstem_ [l=fr]              { ignorer la fin des mots}
+_textnostem_ [l=fr]            { le mot entier doit correspondre}
+_textprefop_ [l=fr]            {Afficher jusqu'&agrave; _maxdocoption_ r&eacute;sultats avec _hitsperpageoption_ r&eacute;sultats par page.}
+_textextlink_ [l=fr]           {AccÃšs aux pages Web externes: }
+_textintlink_ [l=fr]           {Documents source rÃ©cupÃ©rÃ©s de:}
+_textlanguage_ [l=fr]          {Langage de l'interface: }
+_textencoding_ [l=fr]          {Encodage: }
+_textformat_ [l=fr]            {Format de l'interface: }
+_textall_ [l=fr]               {tous}
+_textsimplemode_ [l=fr]        {mode de recherche simple}
+_textadvancedmode_ [l=fr]      {mode de recherche avanc&eacute;e (autoriser les recherches bool&eacute;ennes utilisant !, &, |, et les parenth&egrave;ses)}
+_textlinkinterm_ [l=fr]        {Ã  travers les pages intermÃ©diaires}
+_textlinkdirect_ [l=fr]        {aller directement la-bas}
+_textdigitlib_ [l=fr]          {la biblioth&egrave;que numÃ©rique}
+_textweb_ [l=fr]               {l'Internet}
+_textgraphical_ [l=fr]         {Graphique}
+_texttextual_ [l=fr]           {Textuel}
+_textcollectionoption_ [l=fr] {<p>
+Sous-collections Ã  inclure:
+<br>}
+
+_textquerymode_ [l=fr]         {Mode de recherche:}
+_textsearchhistory_ [l=fr]     {Rechercher l'historique}
+_textnohistory_ [l=fr]         {La recherche d'historique n'est pas disponible}
+_texthistorydisplay_ [l=fr]    {Afficher les _historynumrecords_ derni&egrave;res requ&ecirc;tes}
+_textnohistorydisplay_ [l=fr]  {Ne pas afficher l'historique }
+
+_textqueryboxsize_ [l=fr]      {Champ de saisie:}
+_textregbox_ [l=fr]            {Champ normal}
+_textbigbox_ [l=fr]            {Champ &eacute;tendu}
+
+_textsetprefs_ [l=fr]          {Appliquer}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "pr&eacute;f&eacute;rences" ## green_title ## h_pref ##
+_httpiconhpref_ [l=fr] {_httpimg_/fr/h\_pref.gif}
+_widthhpref_ [l=fr] {200}
+_heighthpref_ [l=fr] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=fr] {Aide}
+_textSearchshort_ [l=fr]       {Chercher certains mots en particulier}
+_textSeriesshort_ [l=fr]       {AccÃšs aux publications par sÃ©rie}
+_textDateshort_ [l=fr]         {AccÃšs aux publications par date}
+_textSubjectshort_ [l=fr]      {AccÃšs aux publications par sujet}
+_textTitleshort_ [l=fr]        {AccÃšs aux publications par titre}
+_textBrowseshort_ [l=fr]       {Naviguer Ã  travers les publications}
+_textCreatorshort_ [l=fr]      {AccÃšs aux publications par auteur}
+_textOrganizationshort_ [l=fr] {AccÃšs aux publications par organisation}
+_textHowtoshort_ [l=fr]        {AccÃšs aux publications par la liste des comment faire}
+_textTopicshort_ [l=fr]        {AccÃšs aux publications par thÃšme}
+_textPeopleshort_ [l=fr]       {AccÃšs aux publications par personne}
+_textdefaultshorttext_ [l=fr]  {Classification non dÃ©finie}
+
+_textSearchlong_ [l=fr] { <p>Vous pouvez <i>rechercher certains mots</i> prÃ©sents
+dans le texte Ã  partir de la page de recherche. C'est la premiÃšre page Ã  s'afficher
+lorsque vous dÃ©butez une recherche, elle peut Ãªtre aussi atteinte Ã  partir des autres pages en cliquant sur
+le bouton <i>Recherche</i>. }
+
+_textTitlelong_ [l=fr] { <p>Vous pouvez avoir <i>accÃšs aux publications par titre</i> en
+cliquanr sur le bouton <i>Titres a-z</i>. Ceci affichera la liste alphabÃ©tique 
+des livres. }
+
+_textOrganizationlong_ [l=fr] { <p>Vous pouvez avoir<i>accÃšs aux publications par 
+organisation</i> en cliquant sur le bouton <i>Organisations</i>. Ceci affichera 
+une liste alphabÃ©tique des organisations.  }
+
+_textHowtolong_ [l=fr] { <p>Vous pouvez avoir<i>accÃšs aux publications de la liste des Comment faire</i>
+ en cliquant sur le bouton <i>Comment faire</i>. Ceci affichera une liste des rubriques Comment faire.  }
+
+_textCreatorlong_ [l=fr] { <p>Vous pouvez avoir<i>accÃšs aux publications par auteur</i> en cliquant sur
+le bouton <i>Auteurs a-z</i>. Ceci affichera la liste des livres, classÃ©s par nom d'auteur.  }
+
+_textTopiclong_ [l=fr] { <p>Vous pouvez avoir<i>accÃšs aux publications par thÃšme</i> en cliquant sur
+le bouton <i>ThÃšmes</i>. Ceci affichera une liste thÃ©matique Ã  naviguer.  }
+
+_textSubjectlong_ [l=fr] { <p>Vous pouvez avoir <i>accÃšs aux publications par sujet</i> en cliquant sur 
+le bouton <i>Sujets</i>. Ceci affichera une liste de sujets, reprÃ©sentÃ©e par rayons de livres.  }
+
+_textSerieslong_ [l=fr] { <p>Vous pouvez avoir<i>accÃšs aux publications par sÃ©ries</i> en cliquant sur
+le bouton <i>SÃ©ries</i>.  Ceci affichera la liste des sÃ©ries contenues actuellement dans la collection.  }
+
+_textDatelong_ [l=fr] { <p>Vous pouvez <i>avoir accÃšs aux publications par date</i> en cliquant sur
+le bouton <i>Dates</i>. Ceci affichera la liste des Ã©ditions, triÃ©es chronologiquement. }
+
+_textBrowselong_ [l=fr] { <p>Vous pouvez <i>naviguer parmi les publications</i> en cliquant sur
+le bouton <i>Naviguer</i>.  }
+
+_textPeoplelong_ [l=fr] { <p>Vous pouvez avoir <i>accÃšs aux publications par personne</i> en cliquant sur
+le bouton <i>Personnes a-z</i>. Ceci affichera une liste d'entrÃ©es, triÃ©es par nom de famille.  }
+
+_textdefaultlongtext_ [l=fr] { <p>Cliquez sur le bouton <i>Inconnu</i> pour naviguer
+Ã  travers les publications (la liste est triÃ©e suivant un champ inconnu).  }
+
+_texthelptopics_ [l=fr] {
+<h2 align=left>ThÃšmes</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Comment rechercher certains mots en particulier</a>
+<ul>
+  <li><a href="\#query-terms">Termes de recherche</a>
+  <li><a href="\#query-type">Type de recherche</a>
+  <li><a href="\#scope-of-queries">Ãtendue des recherches</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">PrÃ©fÃ©rences concernant les collections</a>
+  <li><a href="\#pres-prefs">PrÃ©fÃ©rences concernant la prÃ©sentation</a>
+  <li><a href="\#search-prefs">PrÃ©fÃ©rences concernant la recherche</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=fr] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=fr]     {Comment lire les documents}
+_booktextreadingdocs_ [l=fr] {Comment lire les livres}
+_bibtextreadingdocs_ [l=fr]  {Obtenir plus d'information sur une bibliographie}
+
+_texthelpreadingdocs_ [l=fr] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Lorsqu'un document particulier est affichÃ©, vous pouvez voir son titre et 
+ses auteurs en haut Ã  gauche de la page. A cÃŽtÃ©, vous pouvez voir le numÃ©ro
+de la page en cours, et une boite contenant des boutons qui vous permettent
+soit de sÃ©lectionner une nouvelle page, soit de passer Ã  la page suivante ou prÃ©cÃ©dente.
+
+<p>En dessous se trouve le texte de la partie en cours. Lorsque vous avez terminÃ©
+votre lecture, vous pouvez utiliser l'une des deux flÃšches Ã  votre disposition soit
+pour passer Ã  la partie suivante soit pour revenir Ã  la partie prÃ©cÃ©dente.
+
+            <p>Sous le titre et l'auteur se trouvent trois boutons. Cliquez sur <i>DÃ©velopper
+le texte</i> pour dÃ©velopper the texte entier du document actif. Si le document est
+grand, le chargement peut Ãªtre long et peut nÃ©cessiter beaucoup de mÃ©moire!
+Cliquez sur <i>DÃ©tacher</i> pour crÃ©er une nouvelle fenÃªtre Navigateur pour ce
+document. (C'est trÃšs utile si vous voulez comparer des documents, ou lire deux
+documents Ã  la fois.) Finalement, lorsque vous faites une requÃªte, les mots
+utilisÃ©s dans la recherche sont mis en Ã©vidence. Cliquez sur <i>Supprimer la mise en Ã©vidence</i>
+pour Supprimer la mise en Ã©vidence.
+<p>
+
+
+
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Cliquez sur la flÃšche pour passer Ã  la partie suivante ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ou retourner Ã  la partie prÃ©cÃ©dente</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Afficher tout le texte, ou dÃ©sactiver</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Ouvrir cette page dans une nouvelle fenÃªtre</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Mise en Ã©vidence des mots recherchÃ©s, ou dÃ©sactiver</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=fr] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Lorsque vous arrivez sur un livre en particulier, vous pouvez voir la 
+photographie qui se trouve sur la page de couverture en haut Ã  gauche de 
+la page. A cÃŽtÃ© se trouve la table des matiÃšres avec une flÃšche indiquant
+l'endroit ou l'on se trouve. La table des matiÃšres peut Ãªtre dÃ©veloppÃ©e: 
+cliquez sur les dossiers pour les ouvrir ou bien les fermer. Cliquez sur
+le livre ouvert en haut pour le fermer.
+
+
+<p>En dessous, le texte de la partie active est affichÃ©. Lorsque vous
+avez lu le texte, vous pouvez utiliser les flÃšches en bas soit pour 
+passer Ã  la partie suivante soit pour revenir Ã  la partie prÃ©cÃ©dente.
+
+
+<p>En dessous de la photographie, il y a quatre boutons.
+Cliquez sur <i>DÃ©velopper le texte</i> pour DÃ©velopper le texte entier 
+de la partie ou du livre en cours. Si le document est
+grand, le chargement peut Ãªtre long et peut nÃ©cessiter beaucoup de mÃ©moire!
+Cliquez sur <i>DÃ©tacher</i> pour crÃ©er une nouvelle fenÃªtre Navigateur pour ce
+document. (C'est trÃšs utile si vous voulez comparer des documents, ou lire deux
+documents Ã  la fois.) Finalement, lorsque vous faites une requÃªte, les mots
+utilisÃ©s dans la requÃªte sont mis en Ã©vidence. Cliquez sur <i>SUPPRIMER LA MISE EN 
+ÃVIDENCE</i> pour Supprimer la mise en Ã©vidence.
+
+
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Ouvrir ce rayonnage</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Ouvrir/Fermer ce livre</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Afficher cette patie de texte</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Afficher tout le texte, ou rÃ©duire</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>DÃ©velopper la table des matiÃšres, ou rÃ©duire</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Ouvrir cette page dans une nouvelle fenÃªtre</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Mise en Ã©vidence des mots recherchÃ©s, ou dÃ©sactiver</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Cliquez sur la flÃšche pour passer Ã  la partie suivante ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ou retourner Ã  la partie prÃ©cÃ©dente</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=fr] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Certaines bibliographies contiennent des informations supplÃ©mentaires, un rÃ©sumÃ©
+par exemple. A partir de la page rÃ©sultats, vous pouvez tout de suite le savoir car
+les rÃ©sultats sont affichÃ©s avec l'icÃŽne _icontext_ au lieu de l'icÃŽne _iconblanktext_ .
+
+
+<p>En cliquant sur l'icÃŽne _icontext_ , vous obtiendrez plus d'informations concernant
+l'Ã©lÃ©ment bibliographique concernÃ©.
+
+<p>Sous l'Ã©lÃ©ment bibliographique se trouvent deux boutons. Cliquez sur <i>DÃ©tacher</i>
+pour crÃ©er une nouvelle fenÃªtre Navigateur pour ce livre. (C'est trÃšs utile si
+vous voulez comparer plusieurs bibliographies). Finalement, lorsque vous faites
+une requÃªte, les mots utilisÃ©s dans la requÃªte sont mis en Ã©vidence. Cliquez sur
+<i>Supprimer la mise en Ã©vidence</i> pour Supprimer la mise en Ã©vidence.
+
+
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Ouvrir cette page dans une nouvelle fenÃªtre</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Mise en Ã©vidence des termes recherchÃ©s, ou non</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=fr] {
+<h2>Comment faire une requÃªte pour certains mots en particulier</h2>
+<p>
+  A partir de la page Recherche, vous pouvez formuler votre recherche en suivant le mode d'emploi suivant:<p>
+  
+  <ol><li>SpÃ©cifiez sur quels documents vous souhaitez faire la recherche
+      <li>Indiquez si vous voulez rechercher tous les mots ou seulement certains mots
+      <li>Tapez les mots pour lesquels vous souhaitez faire la recherche
+      <li>Cliquez sur le bouton <i>Commencer la recherche</i>
+  </ol>
+
+<p>Lorsque vous faites une recherche, les titres des vingt premiers documents qui
+satisfont la requÃªte sont affichÃ©s. Il y a un bouton Ã  la fin de la liste qui vous
+permet d'avoir accÃšs aux vingt documents suivants. A partir de lÃ  vous pourrez Ã 
+nouveau avoir accÃšs aux vingt documents suivants, et ainsi de suite.
+Cliquez sur le titre d'un document, ou sur le petit bouton derriÃšre lui, pour
+l'afficher.
+
+
+<p>Le nombre de documents retournÃ©s est limitÃ© Ã  100 par dÃ©faut. Vous pouvez
+changer ce nombre en cliquant sur le bouton <i>"PrÃ©fÃ©rences"</i> en haut de
+la page.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Termes de la recherche</h3>
+
+
+<p>Tout ce que vous tapez dans la boÃ®te recherche est interprÃ©tÃ© comme une liste
+de mots appelÃ©e "termes de la recherche". Chaque terme doit Ãªtre alphanumÃ©rique
+et ne peut contenir que des lettres ou des chiffres. Les termes de la recherche
+sont supposÃ©s Ãªtre sÃ©parÃ©s par des espaces, si des caractÃšres de ponctuation
+sont tapÃ©s, ils sont considÃ©rÃ©s comme des espaces servant Ã  sÃ©parer les termes
+et sont ignorÃ©s lors de la recherche. Il n'est pas possible d'effectuer une recherche
+sur des mots contenants des caractÃšres de ponctuation.
+
+
+<p>Par exemple, la recherche<p>
+    <ul><kbd>Agro-forestry in the Pacific Islands: Systems for Sustainability (1993)</kbd></ul>
+      <p>est Ã©quivalente Ã <p>
+      <ul><kbd>Agro forestry in the Pacific Islands  Systems for Sustainability  1993 </kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Type de recherche</h3>
+
+<p>Il y a deux types de recherche.
+
+<ul>
+  <li>Recherches sur <b>tous</b> les mots.  Ce type de recherche  restitue les
+      documents qui contiennent tous les mots spÃ©cifiÃ©s. Les documents qui
+      satisfont Ã  la recherche sont affichÃ©s dans l'ordre alphabÃ©tique.<p>
+
+  <li>Recherches sur <b>certains</b> mots en particulier. Vous pouvez donner une liste de
+      certains mots qui ont de grandes chances d'apparaitre dans les documents
+      que vous recherchez. Les documents sont alors affichÃ©s dans un ordre qui
+      reflÃšte avec quelle pertinence ils satisfont la requÃªte. 
+      Lors de la dÃ©termination du degrÃ© de pertinence d'un document, il est tenu
+      compte des critÃšres suivants:
+
+      <p><ul>
+        <li> Plus il ya de termes de la recherche dans le document, et plus le document est pertinent;
+        <li> les termes rares sont considÃ©rÃ©s comme plus importants que ceux qui sont courants;
+        <li> les petits documents sont considÃ©rÃ©s comme plus pertinents que les grands.
+      </ul>
+</ul>
+
+<p>Vous pouvez utiliser autant de termes de recherche que vous le souhaitez
+-- une phrase entiÃšre, oÃ¹ mÃªme un paragraphe entier. Si vous spÃ©cifiez un
+seul terme, alors les documents qui satisfont Ã  la requÃªte seront classÃ©s en fonction du nombre 
+d'occurences du terme dans chaque document.<p>
+_texthelpscope_
+}
+
+_textchangeprefs_ [l=fr]     {Changement des prÃ©fÃ©rences}
+
+_texthelppreferences_ [l=fr] {<h2>_textchangeprefs_</h2>
+
+<p>Si vous cliquez sur le bouton <i>PrÃ©fÃ©rences</i> en haut de la page, vous
+pourrez alors changer certaines fonctionnalitÃ©s de l'interface utilisateur afin
+que celles-ci conviennent Ã  vos propre besoins.
+
+
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>PrÃ©fÃ©rence pour la collection</h3>
+Certaines collections sont constituÃ©es de plusieurs sous-collections,
+qui peuvent Ãªtre recherchÃ©es individuellement ou globalement comme un tout.
+Si vous le souhaitez, vous pouvez spÃ©cifier quelles sont les sous-collections
+qui doivent Ãªtre recherchÃ©es dans la page "PrÃ©fÃ©rence".
+
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>PrÃ©fÃ©rences de prÃ©sentation</h3>
+
+Pour chaque collection, vous pouvez spÃ©cifier plusieurs options
+qui contrÃŽlent la prÃ©sentation.
+
+"Collection de pages Web" permet de masquer la barre de navigation Greenstone
+qui apparaÃ®t en haut de chaque page d'un document, de telle faÃ§on que lorsque
+vous avez fait une recherche, la page qui satisfait Ã  la requÃªte est affichÃ©e
+directement sans l'en-tÃªte Greenstone. Pour effectuer une autre recherche, 
+vous devrez alors utiliser le bouton "PrÃ©cÃ©dente" de votre navigateur.
+Ce type de collection vous permet aussi de supprimer le message d'avertissement
+affichÃ© par Greenstone lorsqu'un lien hypertexte vous renvoie en dehors de
+la collection de la bibliothÃšque numÃ©rique, quelque part ailleurs sur la toile (Web).
+Pour certaines collections vous pouvez aussi contrÃŽler les liens qui
+apparaissent sur la page "RÃ©sultats de la recherche" de telle faÃ§on que ces
+liens vous renvoient directement sur l'URL en question, plutÃŽt que sur 
+la copie qui se trouve dans la bibliothÃšque numÃ©rique.
+
+Vous pouvez aussi changer le langage de l'interface. Pour le chinois, vous pouvez
+spÃ©cifier la codification des caractÃšres utilisÃ©e par votre navigateur. 
+
+Finalement quelle que soit la collection, vous pouvez choisir d'avoir une prÃ©sentation
+qui utilise une interface textuelle Ã  la place de l'interface graphique standard.
+Cela peut Ãªtre utile pour les utilisateurs qui ont des problÃšmes de vue et qui
+utilisent des grandes polices ou bien pour la sortie sur des synthÃ©tiseurs vocaux.
+
+
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>PrÃ©fÃ©rences pour les recherches</h3>
+Deux paires de boutons permettent le contrÃŽle des majuscules/ minuscules et des
+racines des mots. Les premiers permettent de contrÃŽler la prise en compte
+des majuscules/ minuscules lors de la recherche des documents qui doivent satisfaire 
+Ã  la requÃªte. Les deux autres permettent de contrÃŽler la prise en compte des
+fins de mot lors de la recherche des documents qui doivent satisfaire 
+Ã  la requÃªte.
+
+
+<p>Par exemple, si les boutons<i>Ignorer les diffÃ©rences dues aux majuscules/minuscules</i> et
+<i>Ignorer les fins de mots</i> sont actifs, la recherche<p>
+    <ul><kbd>African building</kbd></ul>
+      <p>sera traitÃ©e de la mÃªme faÃ§on que<p>
+      <ul><kbd>africa builds</kbd></ul><p>
+      La lettre majuscule de "African" sera convertie en minuscule,
+      et les suffixes "n" and "ing" seront supprimÃ©s de "African" et
+      "building" respectivement (le "s" sera aussi supprimÃ© de "builds").
+
+<p>Vous pouvez aussi choisir le mode recherche "avancÃ©e" qui vous permet
+de combiner des termes en utilisant les opÃ©rateurs boolÃ©en AND (&),
+OR (|), et NOT (!). Cela vous permettra d'affiner les recherches.
+
+<p>Finalement, vous pouvez aussi contrÃŽler le nombre de documents
+pertinents restituÃ©s ainsi que celui prÃ©sentÃ©s sur chaque page.
+
+
+}
+
+_texttanumbrowseoptions_ [l=fr] {Il y a _numbrowseoptions_ faÃ§ons de trouver des informations dans cette collection:}
+
+_textsimplehelpheading_ [l=fr] {Comment trouver des informations qui vous intÃ©ressent}
+
+_texthelpscope_ [l=fr] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Domaine d'application des recherches</h3>
+
+<p>
+Dans la plupart des collections, vous pouvez choisir diffÃ©rents index pour la recherche.
+Par exemple, il y aura peut-Ãªtre un index pour les auteurs et un autre pour les titres.
+Ou bien mÃªme un index pour les chapitres ou paragraphes. GÃ©nÃ©ralement, le document entier est retournÃ©
+quelque soit l'index utilisÃ©.
+<p>Si les documents sont des livres, ils seront ouverts a l'endroit appropriÃ©.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "aide" ## green_title ## h_help ##
+_httpiconhhelp_ [l=fr] {_httpimg_/fr/h\_help.gif}
+_widthhhelp_ [l=fr] {200}
+_heighthhelp_ [l=fr] {57}
+
Index: /main/tags/2.38/gsdl/macros/french2.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/french2.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/french2.dm	(revision 21083)
@@ -0,0 +1,1107 @@
+######################################################################
+#
+# French Language text and icon macros 
+# -- this file contains french text that is of less importance
+# -- to translate when creating a new interface language
+######################################################################
+
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_documents_   [l=fr]   { documents. }
+_lastupdate_  [l=fr]   {DerniÃšre mise Ã  jour}
+_ago_         [l=fr]   {jours.}
+_colnotbuilt_ [l=fr]   {Collection non construite.}
+
+_textpagetitle_ [l=fr] {BibliothÃšque NumÃ©rique Greenstone}
+_textadmin_     [l=fr] {Page d'Administration}
+_textabgs_      [l=fr] {Ã Propos de Greenstone}
+_textgsdocs_    [l=fr] {Documentation Greenstone}
+
+_textimagecollector_ [l=fr] {
+Vous aide Ã  crÃ©er de nouvelles collections, Ã  modifier ou supprimer des collections,
+ou bien encore Ã  ajouter des documents Ã  une collection
+
+}
+
+_textimageadmin_ [l=fr] {
+Vous permet d'ajouter de nouveaux utilisateurs, de connaÃ®tre les collections qui se trouvent sur le systÃšme,
+et de connaÃ®tre les informations techniques concernant l'installation de Greenstone
+}
+
+_textimagegogreenstone_ [l=fr] {
+Vous informe sur le logiciel Greenstone et le projet de BibliothÃšque NumÃ©rique de Nouvelle ZÃ©lande ainsi 
+que sur son origine
+}
+
+_textpoem_ [l=fr] {
+<br><h2>Kia papapounamu te moana</h2>
+
+<p>kia hora te marino,
+<br>kia tere te karohirohi,
+<br>kia papapounamu te moana
+
+<p>puisse la paix et le calme vous entourer,
+<br>puissiez vous Ãªtre dans la chaleur d'une brume d'Ã©tÃ©,
+<br>puisse l'ocÃ©an de vos voyages Ãªtre aussi lisse que la pierre verte polie.
+}
+
+_textgreenstone_ [l=fr] {
+<p>Greenstone est une pierre semi-prÃ©cieuse qui (comme ce logiciel) a pris
+naissance en Nouvelle ZÃ©lande. Dans la sociÃ©tÃ© traditionnelle Maori, c'Ã©tait 
+l'objet le plus recherchÃ© et celui auquel on attachait le plus d'importance.
+Cette pierre a le pouvoir d'emmagasiner et retenir <i>wairua</i>, qui est l'esprit de 
+la force de vie, elle est aussi dotÃ©e de vertus traditionnelles qui en font un excellent
+emblÃšme pour un projet de bibliothÃšque numÃ©rique du domaine public. Son Ã©clat  
+symbolise la charitÃ©; sa transluciditÃ©, l'honnÃªtetÃ©; sa duretÃ©, le courage; 
+et le cÃŽtÃ© tranchant qu'elle peut prendre, la justice.
+L'objet sculptÃ© et utilisÃ© comme logo du logiciel est appelÃ© <i>patu</i>, c'est
+une sorte de matraque utilisÃ©e pour combattre. Un des participants au projet
+Greenstone a hÃ©ritÃ© cet objet de sa famille.
+Lors des combats, son lancer Ã©tait d'une rapiditÃ©  et d'une prÃ©cision phÃ©nomÃ©nale 
+ce qui en faisait une arme de combat redoutable et complÃšte.
+Nous souhaiterions que ces qualitÃ©s soient aussi celles de ce logiciel, le cÃŽtÃ©
+tranchant comme un rasoir symbolisant l'aspect avancÃ© et pointu de la technologie
+utilisÃ©e. 
+
+}
+
+_textaboutgreenstone_ [l=fr] {
+
+<p>Greenstone est un ensemble de logiciels dont le but est de donner
+accÃšs Ã  des collections d'informations constituant une bibliothÃšque
+numÃ©rique et de construire de nouvelles collections. Greenstone
+permet d'organiser les informations d'une faÃ§on innovante et de les
+publier soit sur internet soit sur un CD-ROM. Greenstone fait partie
+du <b>Projet de BibliothÃšque NumÃ©rique de Nouvelle ZÃ©lande</b> Ã 
+<b>l'UniversitÃ© de Waikato</b>, il est distribuÃ© en coopÃ©ration
+avec <b>l'UNESCO</b> et le Projet de <b>BibliothÃšques Humanitaires et
+de dÃ©veloppement</b>. C'est un logiciel dont le code source est
+ouvert et qui est disponible pour tÃ©lÃ© chargement sur le site Web <a
+href="http://greenstone.org">http://greenstone.org</a>, la licence
+d'utilisation est la licence "GNU General Public License".
+
+<p>Le but de ce logiciel est de permettre aux utlisateurs, appartenant
+en particulier aux universitÃ©s, biblothÃšques, et autres institutions
+du service public de construire leurs propres bibliothÃšques
+numÃ©riques. Les bibliothÃšques numÃ©riques sont en train de
+rÃ©volutionner la mÃ©thode de distribution et d'acquisition des
+connaissances utilisÃ©e par l'UNESCO avec ses partenaires habituels
+dont les institutions qui travaillent dans le domaine de la
+l'Ã©ducation, de la science et de la culture, et ceci dans le monde
+entier et en particulier dans les pays en voie de dÃ©veloppement. Nous
+espÃ©rons que ce logiciel servira Ã  encourager la construction et la
+diffusion de biblothÃšques numÃ©riques dans le domaine public afin de
+partager l'information et le savoir.
+
+<p>Ce logiciel est dÃ©veloppÃ© et distribuÃ© grÃ¢ce Ã  un effort de
+collaboration internationale qui prit naissance en aoÃ»t 2000 entre
+trois parties.
+
+<table border="0">
+<tr valign="top">
+<td>
+<a href="http://nzdl.org"><b>Le projet de BibliothÃšque NumÃ©rique de
+Nouvelle ZÃ©lande Ã  l'UniversitÃ© de Waikato</b></a>
+<br>
+Le logiciel Greenstone s'est dÃ©veloppÃ© Ã  partir de ce projet, cette
+initiative a ensuite Ã©tÃ© soutenue et prÃ©sentÃ©e par la
+Sous-Commision pour la Communication de la Commision Nationale de
+Nouvell ZÃ©lande auprÃšs de l'UNESCO en tant que contribution de la
+Nouvelle ZÃ©lande aux programmes de l'UNESCO.
+</td>
+<td></td>
+</tr>
+<tr valign="top">
+<td>
+<a href="http://www.unesco.org"><b>Organisation des Nations Unies pour
+l'Ã©ducation, la science et la culture</b></a>
+<br>
+La diffusion mondiale d'information et de savoir dans les domaines de
+l'Ã©ducation, la science et la culture , et en particulier dans les
+pays en voie de dÃ©veloppement, est une des missions du programme
+intergouvernemental "Information pour tous", d'autre part une
+technologie de l'information et de la communication accessible est
+considÃ©rÃ©e comme un outil essentiel dans ce contexte.
+</td>
+<td><a href="http://www.unesco.org"><img src="_httpimg_/unesco.gif"
+border="0"></a></td>
+</tr>
+<tr valign="top">
+<td>
+<a href="http://humaninfo.org"><b>L'ONG "Human Info" situÃ©e Ã 
+Antwerp, Belgique</b></a>
+<br>
+Ce projet de bibliothÃšques humanitaires et de dÃ©veloppement crÃ©Ã©
+par des agences des Nations Unies et d'autres ONGs s'est forgÃ© une
+solide rÃ©pution mondiale en ce qui concerne la numÃ©risation de
+documents relatifs au dÃ©veloppement humanitaire et aussi pour leur
+diffusion public, gratuite pour les pays en voie de dÃ©veloppement et
+Ã  prix coutant pour les autres.
+</td>
+<td><a href="http://humaninfo.org"><img src="_httpimg_/ghproj2.jpg" border="0"></a></td>
+</tr>
+</table>
+}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "THE NEW ZEALAND DIGITAL LIBRARY" ## nzdl_heading ## nzdl2gr ##
+_httpiconnzdl_ [l=fr] {_httpimg_/nzdl2gr.gif}
+_widthnzdl_ [l=fr] {457}
+_heightnzdl_ [l=fr] {181}
+
+## "s&eacute;lectionnez a collection" ## green_bar_left_aligned ## selcolgr ##
+_httpiconselcolgr_ [l=fr] {_httpimg_/fr/selcolgr.gif}
+_widthselcolgr_    [l=fr] {537}
+_heightselcolgr_   [l=fr] {17}
+_altselcolgr_      [l=fr] {"SÃ©lectionnez une collection"}
+
+
+######################################################################
+# home help page
+package homehelp
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_text4buts_  [l=fr] {Il y a quatre autres boutons sur la page d'accueil}
+
+_textnocollections_ [l=fr] {
+<p>Aucune collection n'est disponible pour cette installation de Greenstone.
+Pour ajouter des collections, vous pouvez:
+
+<ul><li>soit utiliser <a href="_httppagecollector_">Le Collector</a> pour construire de nouvelles collections
+    <li>soit installer des collections Ã  partir du CD-ROM si vous avez le CD-ROM Greenstone
+</ul>
+}
+
+_text1coll_ [l=fr] {Cette installation Greenstone contient 1 collection}
+
+_textmorecolls_ [l=fr] {Cette installation Greenstone contient _1_ collection}
+
+######################################################################
+# external links
+package extlink
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textextlink_      [l=fr] {Lien ExtÃ©rieur}
+_textlinknotfound_ [l=fr] {Lien IntÃ©rieur introuvable}
+
+_textextlinkcontent_ [l=fr] {Le lien sÃ©lectionnÃ© est extÃ©rieur Ã  toutes vos collections sÃ©lectionnÃ©es
+    actuellement
+    Si vous souhaitez quand mÃªme afficher ce lien et si vous avez accÃšs au Web, 
+    vous pouvez <a href="_nexturl_"> vous dÃ©placer</a> sur cette page; sinon utilisez le bouton "PrÃ©cÃ©dente" du
+    navigateur pour revenir au document prÃ©cÃ©dent.
+
+    }
+
+_textlinknotfoundcontent_ [l=fr] {Le lien interne sÃ©lectionnÃ©  n'existe pas. C'est certainement dÃ»
+    Ã  une erreur dans collection source de base.
+    Utilisez le bouton "PrÃ©cÃ©dente" du navigateur pour revenir au document prÃ©cÃ©dent.
+  }
+
+# should have arguments of collection, collectionname and link
+_foundintcontent_ [l=fr] {
+
+<h3>Lien sur la collection "_2_"</h3>
+
+<p> Le lien sÃ©lectionnÃ© est externe Ã  la collection "_collectionname_"
+    (il renvoie sur la collection "_2_").
+    Si vous souhaitez afficher le document qui correspond Ã  ce lien dans la collection
+    "_2_", vous pouvez  
+    <a href="_httpdoc_&c=_1_&cl=_cgiargcl_&d=_3_">vous dÃ©placer</a> sur cette page; 
+    sinon utilisez le bouton "PrÃ©cÃ©dente" du navigateur pour revenir au document prÃ©cÃ©dent.
+    
+}
+
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+######################################################################
+# authentication page
+package authen
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textGSDLtitle_ [l=fr] {BibliothÃšque NumÃ©rique Greenstone}
+
+_textusername_ [l=fr] {nom d'utilisateur}
+_textpassword_ [l=fr] {mot de passe}
+
+_textmessageinvalid_ [l=fr] {La page que vous avez demandÃ©e nÃ©cessite que vous vous enregistriez.<br>
+_If_(_cgiargug_,[Remarquez qu&#039;il vous faut appartenir au groupe &quot;_cgiargug_&quot; pour accÃ©der &agrave; cette page]<br>)
+Veuillez saisir votre identifiant Greenstone et votre mot de passe.}
+
+_textmessagefailed_ [l=fr]           {Votre nom d'utilisateur ou votre mot de passe est incorrect.}
+
+_textmessagedisabled_ [l=fr]         {DÃ©solÃ©, votre compte a Ã©tÃ© mis hors service. Veuillez contacter
+l'administrateur de ce site.}
+
+_textmessagepermissiondenied_ [l=fr] {DÃ©solÃ©, vous n'avez pas la permission d'accÃ©der a cette page.}
+
+_textmessagestalekey_ [l=fr] {Le lien que vous avez choisi est maintenant pÃ©rimÃ©.
+Veuillez entrer votre mot de passe pour accÃ©der a cette page.}
+
+
+
+
+######################################################################
+# 'docs' page 
+package docs
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textnodocumentation_ [l=fr] {
+<p>Cette installation de Greenstone ne contient pas de documentation. Ceci est
+peut Ãªtre dÃ» au fait que:
+<ol>
+ <li>vous avez installÃ© Greenstone Ã  partir du CD-ROM en utilisant l'option compacte.
+ <li>vous avez installÃ© Greenstone Ã  partir d'une distribution tÃ©lÃ©chargÃ©e sur un site
+ Internet.
+</ol>
+Dans les deux cas, vous pouvez obtenir la documentation soit Ã  partir du rÃ©pertoire <i>docs</i>
+de Greenstone sur le CD-ROM , soit en visitant le site web <a
+href="http://www.greenstone.org">http://www.greenstone.org</a>.
+}
+
+_textuserguide_       [l=fr] {Guide Utilisateur}
+_textinstallerguide_  [l=fr] {Guide pour l'Installation}
+_textdeveloperguide_  [l=fr] {Guide du DÃ©veloppeur}
+_textpaperguide_      [l=fr] {Guide pour passer de la collection papier Ã  la collection numÃ©rique}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "documentation greenstone" ## green_bar_left_aligned ## gsdocsgr ##
+_httpicongsdocsgr_ [l=fr] {_httpimg_/fr/gsdocsgr.gif}
+_widthgsdocsgr_    [l=fr] {_pagewidth_}
+_heightgsdocsgr_   [l=fr] {17}
+
+
+######################################################################
+# collectoraction
+package collector
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textmore_      [l=fr] {Plus}
+_textcollector_ [l=fr] {Le Collector}
+_textinfo_      [l=fr] {Informations sur la collection}
+_textsrce_      [l=fr] {DonnÃ©es initiales}
+_textconf_      [l=fr] {Configurer la collection}
+_textbild_      [l=fr] {Construire}
+_textview_      [l=fr] {Afficher}
+_textdel_       [l=fr] {Supprimer la collection}
+_textexpt_      [l=fr] {Exporter la collection}
+
+_textcollectorblurb_ [l=fr] {
+<i>Le crayon et la plume ont plus de pouvoir que l'Ã©pÃ©e!
+<br>La construction et la distribution de collections d'information comporte
+certaines responsabilitÃ©s qu'il est prÃ©fÃ©rable d'Ã©tudier avant de commencer.
+
+Il y a des aspects juridiques et lÃ©gaux concernant le copyright: le fait que
+l'on puisse avoir accÃšs librement Ã  certains documents ne signifie pas forcÃ©ment
+que l'on peut les distribuer aux autres. 
+Il y a des aspects sociaux:  les collections doivent respecter la culture et les coutumes
+de la communautÃ© dont les documents proviennent.
+Et il y a des aspects Ã©thiques: tout simplement, certaines informations ne doivent pas Ãªtre
+divulguÃ©es aux autres.
+<br>Soyez sensibilisÃ© au pouvoir de l'information et utilisez le avec prudence.
+</i>
+}
+
+_textcb1_ [l=fr] {
+Le Collector vous aide Ã  crÃ©er de nouvelles collections, Ã  modifier ou
+supprimer des collections, et Ã  ajouter des documents. Pour cela,
+vous serez guidÃ© par une sÃ©quence de pages Web qui vous demanderont les
+informations nÃ©cessaires.
+
+}
+
+_textcb2_ [l=fr] {PremiÃšrement, vous devez dÃ©cider si vous voulez}
+_textcnc_ [l=fr] {crÃ©er une nouvelle collection}
+_textwec_ [l=fr] {travailler avec une collection dÃ©jÃ  existante, pour ajouter des donnÃ©es ou la supprimer.}
+
+_textcb3_ [l=fr] {
+Le systÃšme doit d'abord vÃ©rifier votre signature pour pouvoir construire ou modifier des 
+collections de la bibliothÃšque numÃ©rique. Cela permet de protÃ©ger les
+informations contenues dans votre bibliothÃšque numÃ©rique en empÃªchant
+les autres de se connecter sur votre ordinateur et de changer les informations.
+Note: Pour des raisons de sÃ©curitÃ©, vous serez automatiquement dÃ©connectÃ© aprÃšs
+une pÃ©riode d'inactivitÃ© de 30 minutes. Si cela vous arrive, ne vous en
+faites pas! -- vous pouvez Ã  nouveau entrer votre signature et continuer Ã  partir de
+l'endroit oÃ¹ vous Ã©tiez lors de la dÃ©connection. 
+ 
+}
+
+_textcb4_ [l=fr] {
+Veuillez entrer votre nom d'utilisateur et mot de passe, puis cliquez sur
+le bouton pour vÃ©rifier votre signature.
+
+}
+
+_textfsc_ [l=fr] {
+PremiÃšrement, sÃ©lectionnez la collection sur laquelle vous souhaitez travailler
+(les collections protÃ©gÃ©es en Ã©criture n'apparaisse pas dans cette liste).
+}
+
+_textwtc_    [l=fr] {Avec la collection sÃ©lectionnÃ©e, vous pouvez}
+_textamd_    [l=fr] {Ajouter plus de donnÃ©es et reconstruire la collection}
+_textetc_    [l=fr] {Ãditer le fichier de configuration de la collection et reconstruire la collection}
+_textdtc_    [l=fr] {Supprimer la collection entiÃšrement}
+_textetcfcd_ [l=fr] {Exporter la collection pour l'enregistrer sur un CD-ROM auto-installable sous Windows}
+_textcaec_   [l=fr] {Changer une collection existante}
+_textnwec_   [l=fr] {Aucune collection permettant l'Ã©criture n'est disponible pour modification}
+_textcianc_  [l=fr] {CrÃ©ation d'une nouvelle collection}
+_texttsosn_  [l=fr] {La suite logique des Ã©tapes Ã  suivre pour crÃ©er une nouvelle bibliothÃšque numÃ©rique est la suivante:}
+_textsin_    [l=fr] {SpÃ©cifiez son nom (et autres informations associÃ©es)}
+_textswts_   [l=fr] {SpÃ©cifiez l'origine des donnÃ©es initiales}
+_textatco_   [l=fr] {Ajustez les options pour la configuration (uniquement pour les utilisateurs avancÃ©s)}
+_textbtc_    [l=fr] {"Construction" de la collection (voir ci-dessous)}
+_textpvyh_   [l=fr] {Consultez votre oeuvre d'art.}
+
+_texttfsiw_ [l=fr] {
+C'est dans la quatriÃšme Ã©tape que Greenstone effectue tout le travail.
+Au cours du processus de "Construction", Greenstone construit tous les
+fichiers d'index et rassemble toutes les informations nÃ©cessaires pour
+que la bibliothÃšque numÃ©rique puisse fonctionner. Mais vous devez en
+premier lieu prÃ©ciser les informations.
+
+}
+
+_textadab_ [l=fr] {
+Un diagramme apparaÃ®t ci-dessous qui vous aidera Ã  vous situer dans la sÃ©quence.
+Le bouton vert est celui sur lequel vous devez cliquer pour continuer en
+sÃ©quence. Lorsque vous allez vous dÃ©placer dans la sÃ©quence, la couleur
+du bouton va changer et devenir jaune. Vous pouvez vous dÃ©placer sur une page
+prÃ©cÃ©dente en cliquant sur le bouton jaune correspondant dans le diagramme.
+
+}
+
+_textwyar_ [l=fr] {
+Lorsque vous Ãªtes prÃªts, cliquez sur le bouton vert "collection information"
+pour commencer Ã  crÃ©er la nouvelle collection de la bibliothÃšque numÃ©rique.
+
+}
+
+_textcnmbs_  [l=fr] {Le nom de la collection est obligatoire}
+_texteambs_  [l=fr] {L'adresse Ã©lectronique est obligatoire}
+_textpsea_   [l=fr] {Veuillez vÃ©rifier que l'adresse Ã©lectronique  est bien dans le format: nomutilisateur@domaine}
+_textdocmbs_ [l=fr] {Une description de la collection est obligatoire}
+
+_textwcanc_ [l=fr] {
+Lorsque vous crÃ©ez une nouvelle collection, il est nÃ©cessaire de saisir
+certaines informations prÃ©liminaires concernant les donnÃ©es initiales.
+Ce processus est structurÃ© sous la forme d'une sÃ©rie de pages Web,  contrÃŽlÃ©es
+par le Collector. La barre en bas de page affiche la sÃ©quence des pages
+qui doivent Ãªtre complÃ©tÃ©es.
+}
+
+_texttfc_ [l=fr] {Titre pour la collection:}
+
+_texttctiasp_ [l=fr] {
+Le titre de la collection est une phrase courte qui est utilisÃ©e dans
+la bibliothÃšque numÃ©rique pour identifier le contenu de la collection.
+Par exemple: "Rapports techniques en Informatique" ou
+"BibliothÃšque sur le DÃ©veloppement humanitaire".
+
+}
+
+_textcea_ [l=fr] {Contact, adresse Ã©lectronique:}
+
+_textteas_ [l=fr] {
+Cette adressel donne le point de contact principal pour la collection.
+Si le logiciel Greenstone rencontre un problÃšme, un rapport sur le 
+problÃšme est envoyÃ© Ã  cette adresse.Veuillez taper l'adressel en entier dans le format
+suivant: 
+<tt>nom@domain</tt>
+
+}
+
+_textatc_ [l=fr] {Ã propos de cette collection:}
+
+_texttiasd_ [l=fr] {
+C'est une dÃ©claration dÃ©crivant les principes qui rÃ©gissent les donnÃ©es
+faisant partie de cette collection. Ce sera affichÃ© sur la premiÃšre page
+lorsque la collection est prÃ©sentÃ©e.
+
+}
+
+_textypits_ [l=fr] {
+La position dans la sÃ©quence est indiquÃ©e par une flÃšche en dessous--dans
+ce cas, l'Ã©tape "collection information". Pour continuer, cliquez sur le
+bouton "donnÃ©es initiales".
+
+}
+
+_srcebadsources_ [l=fr] {
+<p>Une ou plusieurs donnÃ©es initiales spÃ©cifiÃ©es en entrÃ©e ne sont pas disponibles
+(marquÃ©e(s) _iconcross_ ci-dessous).
+
+
+
+<p>La cause peut Ãªtre:
+<ul>
+<li>le fichier, le site FTP ou bien l'URL n'existe pas.
+<li>vous n'Ãªtes pas connectÃ© Ã  l'internet (vous devez vous connecter chez votre fournisseur d'accÃ©s d'abord).
+<li>vous essayez d'accÃ©der Ã  un URL qui se trouve derriÃšre une protection coupe-feu 
+(C'est en gÃ©nÃ©ral le cas si vous devez donner un nom d'utilisateur et un mot de passe
+pour accÃ©der Ã  l'Internet).
+</ul>
+
+<p>Si vous pouvez afficher l'URL dans votre navigateur, le problÃšme peut venir
+d'une copie qui se trouve dans la mÃ©moire cache locale. Malheureusement,
+les copies qui se trouvent dans la mÃ©moire cache locale ne sont pas visibles par
+le processus de miroir de Greenstone. Dans ce cas,  il est recommandÃ© de commencer
+par tÃ©lÃ© charger les pages Ã  l'aide du navigateur.
+}
+
+_textymbyco_ [l=fr] {
+<p>Vous pouvez dÃ©finir votre collection soit Ã  partir de:
+<ul>
+<li>la structure par dÃ©faut
+<dl><dd>La nouvelle collection peut contenir des documents html (.htm, .html),
+des documents contenant du texte simple, (.txt, .text), des documents en format
+MS WORD (.doc), des documents en format PDF (.pdf) ou des documents de type courrier
+Ã©lectronique (.email).</dd></dl>
+<li>d'une collection dÃ©jÃ  existante
+<dl><dd>Dans ce cas, les fichiers (documents) de la nouvelle collection doivent Ãªtre 
+exactement du mÃªme type que ceux qui ont Ã©tÃ© utilisÃ©s pour construire la
+collection existante.
+</dd></dl>
+</ul>
+}
+
+_textbtco_ [l=fr] {DÃ©finir la collection Ã  partir de}
+_textand_  [l=fr] {Ãjouter de nouvelles donnÃ©es}
+_textad_   [l=fr] {Ãjout des donnÃ©es:}
+ 
+_texttftysb_ [l=fr] {
+Les fichiers que vous allez spÃ©cifier ci-dessous seront ajoutÃ©s Ã  la collection.
+Faites attention Ã  ne pas re-spÃ©cifier des fichiers qui se trouvent dÃ©jÃ  dans
+la collection, sinon la collection comportera deux copies de ces fichiers. Les
+fichiers sont spÃ©cifiÃ©s en indiquant le nom du fichier prÃ©cÃ©dÃ© du chemin complet,
+et les pages Web par leur adresse Web absolue. 
+
+}
+
+_textis_ [l=fr] {DonnÃ©es en entrÃ©e:}
+
+_textddd1_ [l=fr] {
+<p>Si vous utilisez file:// ou ftp:// pour spÃ©cifier un fichier, ce fichier sera
+tÃ©lÃ© chargÃ©.
+
+<p>Si vous utilisez http:// le rÃ©sultat dÃ©pendra de l'URL et sera diffÃ©rent
+si celui-ci affiche une page Web  ou bien une liste de fichiers dans votre
+navigateur. Si l'URL affiche une page Web, alors cette page et toutes les
+autres pages sur lesquelles elle pointe par l'intermÃ©diaire de liens
+hypertexte seront tÃ©lÃ© chargÃ©es -- il en sera de mÃªme pour ces pages et
+ainsi de suite, etc.. -- tant que ces pages rÃ©sident sur le mÃªme site
+Web et Ã  un niveau infÃ©rieur de l'URL initial.
+
+
+<p>Si vous utilisez file:// ou ftp:// pour spÃ©cifier un dossier ou un rÃ©pertoire,
+ou bien http:// et que cet URL affiche une liste de fichiers, tous les fichiers
+qui se trouvent dans ce dossier et ses sous-dossiers seront inclus dans la 
+collection.
+
+<p>Cliquez sur le bouton "Plus de donnÃ©es" pour afficher plus de champs de saisie.
+}
+
+_textddd2_ [l=fr] {
+<p>Cliquez sur l'un des boutons verts. Si vous Ãªtes un utilisateur avancÃ©, vous
+pouvez affiner la configuration pour la collection. Autrement, passez directement
+Ã  l'Ã©tape de construction. N'oubliez pas que vous pouvez toujours avoir accÃšs Ã  une
+Ã©tape prÃ©cÃ©dente en cliquant sur le bouton jaune correspondant.
+
+}
+
+_textconf1_ [l=fr] {
+<p>La construction et la prÃ©sentation d'une collection sont contrÃŽlÃ©es
+par des spÃ©cifications enregistrÃ©es dans un "fichier de configuration"
+spÃ©cial. Les utilisateurs avancÃ©s peuvent modifier les paramÃštres de
+configuration contenus dans ce fichier.
+
+
+<center><p><b>Si vous n'Ãªtes pas un utilisateur avancÃ©, allez directement en 
+bas de la page.</b></center> 
+
+<p>Pour changer les paramÃštres de configuration, Ã©ditez les paramÃštres 
+qui apparaissent ci-dessous. Si vous faites une erreur, vous pouvez toujours
+cliquer sur le bouton "RÃ©initialiser" pour revenir aux paramÃštres de configuration 
+initiaux.
+
+}
+
+_textreset_ [l=fr] {RÃ©initialiser}
+
+_textbild1_ [l=fr] {
+La collection est maintenant en cours de construction: cette opÃ©ration peut Ãªtre
+longue. La ligne ci-dessous affiche l'Ã©tat du processus de construction et donne
+des informations sur son dÃ©roulement.
+
+}
+
+_textbild2_ [l=fr] {
+Vous pouvez arrÃªter le processus de construction Ã  tout instant,
+pour cela, cliquez ici.
+<br>La collection sur laquelle vous travaillez restera intacte.
+}
+
+_textstopbuild_ [l=fr] {ArrÃªt de la construction}
+
+_textbild3_ [l=fr] {
+Si vous quittez cette page sans avoir interrompu le processus de construction
+(en cliquant sur le bouton "ArrÃªt de la construction"), celui-ci va continuer
+et la collection sera installÃ©e dans la bibliothÃšque numÃ©rique une fois le
+processus terminÃ© avec succÃšs.
+f
+}
+
+_textbuildcancelled_ [l=fr] {Construction interrompue}
+
+_textbildcancel1_ [l=fr] {
+Le processus de construction de la collection a Ã©tÃ© interrompu. Utilisez les
+boutons jaunes pour faire des changements concernant la collection ou bien
+re-dÃ©marrez le processus de construction.
+
+}
+
+_textbsupdate1_ [l=fr] {Nouvel Ã©tat de la construction dans 1 seconde}
+_textbsupdate2_ [l=fr] {Nouvel Ã©tat de la construction dans}
+_textseconds_ [l=fr]   {secondes}
+_textbildsuc_ [l=fr]   {La collection a Ã©tÃ© construite avec succÃšs.}
+
+_textviewbildsummary_ [l=fr] {
+Vous pouvez <a href="_httppagex_(bsummary)&c=_cgiargbc1dirname_" target=_top> afficher un rÃ©sumÃ© du
+processus de construction</a> de cette collection pour obtenir plus de dÃ©tails.
+}
+
+_textfailmsg11_ [l=fr] {
+La collection n'a pas pu Ãªtre construite car elle contient aucunes donnÃ©es.
+Assurez-vous qu'au moins un des rÃ©pertoires ou fichiers spÃ©cifiÃ©s dans la
+page <i>DonnÃ©es initiales</i> existe et que le fichier ou bien (dans
+le cas d'un rÃ©pertoire) un des fichiers est d'un type reconnu par
+Greenstone.  
+
+}
+
+_textfailmsg21_ [l=fr] {La collection n'a pas pu Ãªtre construite (import.pl a Ã©chouÃ©).}
+_textblcont_ [l=fr]    {Le fichier journal de la construction contient les informations suivantes:}
+
+_texttryagain_ [l=fr] {
+Veuillez svp <a href="_httppagecollector_" target=_top>re-dÃ©marrer le Collector</a>
+et essayer Ã  nouveau.
+}
+
+_textfailmsg31_ [l=fr] {La collection n'a pas pu Ãªtre construite (buildcol.pl a Ã©chouÃ©).}
+_textfailmsg41_ [l=fr] {La collection a Ã©tÃ© construite avec succÃšs mais n'a pu Ãªtre installÃ©e.}
+_textfailmsg71_ [l=fr] {Une erreur inattendue s'est produite lors de la construction de la collection}
+_textretcoll_   [l=fr] {Retour au Collector}
+
+_textdelperm_ [l=fr] {
+Certains Ã©lÃ©ments ou toute la collection _cgiargbc1dirname_ n'ont pu Ãªtre supprimÃ©s.
+Les causes possibles sont:
+<ul>
+<li> Greenstone n'a pas la permission de supprimer le rÃ©pertoire _gsdlhome_/collect/_cgiargbc1dirname_
+.<br>
+Vous pouvez avoir Ã  supprimer manuellement le rÃ©pertoire pour achever la suppression
+de la collection _cgiargbc1dirname_ de cet ordinateur.
+</ul>
+}
+
+_textdelinv_ [l=fr] {
+La collection _cgiargbc1dirname_ est protÃ©gÃ©e ou invalide. La suppression a Ã©tÃ© annulÃ©e.
+}
+
+_textdelsuc_ [l=fr] {La collection _cgiargbc1dirname_ a Ã©tÃ© supprimÃ©e.}
+
+_textclonefail_ [l=fr] {
+La collection _cgiargclonecol_ n'a pu Ãªtre clonÃ©e. Les causes possibles sont:
+<ul>
+<li> La collection _cgiargclonecol_ n'existe pas
+<li> La collection _cgiargclonecol_ ne possÃšde pas de fichier de configuration collect.cfg
+<li> Greenstone n'a pas la permission de lire le fichier de configuration collect.cfg
+}
+
+_textcolerr_ [l=fr] {Erreur du Collector.}
+
+_texttmpfail_ [l=fr] {
+Le Collector a Ã©chouÃ© lors de la lecture ou de l'Ã©criture sur un fichier temporaire ou dans
+un rÃ©pertoire temporaire. Les causes possibles sont:
+<ul>
+<li> Greenstone n'a pas la permission de lire/Ã©crire dans le rÃ©pertoire _gsdlhome_/tmp
+     
+</ul>
+}
+
+_textmkcolfail_ [l=fr] {
+Le Collector a Ã©chouÃ© lors de la crÃ©ation de la structure hiÃ©rarchique des rÃ©pertoires
+qui est nÃ©cessaire Ã  la crÃ©ation d'une nouvelle collection (mkcol.pl a Ã©chouÃ©). Les causes possibles sont:
+<ul>
+<li> Greenstone n'a pas la permission de lire/Ã©crire dans le rÃ©pertoire _gsdlhome_/tmp
+<li> Erreurs dans le script PERL mkcol.pl
+</ul>
+}
+
+_textnocontent_ [l=fr] {
+Erreur Collector: aucune collection n'a Ã©tÃ© saisie pour la nouvelle collection. 
+Essayez de redÃ©marrer le Collector Ã  partir du dÃ©but.
+}
+
+_textrestart_ [l=fr] {RedÃ©marrer le Collector}
+
+_textreloaderror_ [l=fr] {
+Une erreur s'est produite lors de la crÃ©ation de la nouvelle collection.
+Il se peut que Greenstone ait Ã©tÃ© trompÃ© par l'utilisation des boutons
+"Recharger" ou "PrÃ©cÃ©dente" du navigateur (svp, essayez d'Ã©viter l'utilisation
+de ces boutons au moment de la crÃ©ation d'une collection avec le Collector).
+Il est recommandÃ© de redÃ©marrer le Collector Ã  partir du dÃ©but.
+}
+
+_textexptsuc_ [l=fr] {
+La collection _cgiargbc1dirname_ a Ã©tÃ© exportÃ© dans le rÃ©pertoire
+_gsdlhome_/tmp/exported\__cgiargbc1dirname_ .
+}
+
+_textexptfail_ [l=fr] {
+<p>L'exportation de la collection _cgiargbc1dirname_ a Ã©chouÃ©.
+
+<p>Il est probable que ce problÃšme provient du fait que Greenstone
+a Ã©tÃ© installÃ© sans les composants qui permettent la fonction
+"Export de la collection".
+<ul>
+
+ <li>
+ Si vous avez installÃ© Greenstone Ã  partir du CD-ROM, ces composants
+ ne sont pas installÃ©s, si vous avez choisi l'option installation "Compacte".
+ Vous pouvez alors rÃ©installer Greenstone en choisissant l'option "Par dÃ©faut"
+ Autrement, vous pouvez aussi tÃ©lÃ© charger les composants Ã  partir du Web et
+ les installer (voir ci-dessous).
+
+ <li>Si vous avez installÃ© Greenstone Ã  partir d'une distribution tÃ©lÃ© chargÃ©e
+ sur le Web, vous aurez alors besoin de tÃ©lÃ© charger les composants 
+ dont vous avez besoin pour permettre cette fonctionnalitÃ©. Vous pouvez visiter
+ <a href="http://www.greenstone.org">http://www.greenstone.org</a> ou bien
+ envoyer un courriel Ã  <a href="mailto:greenstone@cs.waikato.ac.nz">
+ greenstone@cs.waikato.ac.nz</a> pour obtenir plus de dÃ©tails.
+ 
+</ul>
+}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "Le collector" ## green_title ## h_colect ##
+_httpiconhcolect_ [l=fr] {_httpimg_/h\_colect.gif}
+
+## "  informations sur la collection" ## collector_bar_button ## info ##
+_httpicongcinfoof_ [l=fr] {_httpimg_/fr/gcinfoof.gif}
+_httpicongcinfoon_ [l=fr] {_httpimg_/fr/gcinfoon.gif}
+_httpiconycinfoof_ [l=fr] {_httpimg_/fr/ycinfoof.gif}
+_httpiconycinfoon_ [l=fr] {_httpimg_/fr/ycinfoon.gif}
+_httpiconncinfoof_ [l=fr] {_httpimg_/fr/ncinfoof.gif}
+
+## "donn&eacute;es initiales" ## collector_bar_button ## srce ##
+_httpicongcsrceof_ [l=fr] {_httpimg_/fr/gcsrceof.gif}
+_httpicongcsrceon_ [l=fr] {_httpimg_/fr/gcsrceon.gif}
+_httpiconycsrceof_ [l=fr] {_httpimg_/fr/ycsrceof.gif}
+_httpiconycsrceon_ [l=fr] {_httpimg_/fr/ycsrceon.gif}
+_httpiconncsrceof_ [l=fr] {_httpimg_/fr/ncsrceof.gif}
+
+## " configuration de la collection" ## collector_bar_button ## conf ##
+_httpicongcconfof_ [l=fr] {_httpimg_/fr/gcconfof.gif}
+_httpicongcconfon_ [l=fr] {_httpimg_/fr/gcconfon.gif}
+_httpiconycconfof_ [l=fr] {_httpimg_/fr/ycconfof.gif}
+_httpiconycconfon_ [l=fr] {_httpimg_/fr/ycconfon.gif}
+_httpiconncconfof_ [l=fr] {_httpimg_/fr/ncconfof.gif}
+
+## "  construction de la collection" ## collector_bar_button ## bild ##
+_httpicongcbildof_ [l=fr] {_httpimg_/fr/gcbildof.gif}
+_httpicongcbildon_ [l=fr] {_httpimg_/fr/gcbildon.gif}
+_httpiconycbildof_ [l=fr] {_httpimg_/fr/ycbildof.gif}
+_httpiconycbildon_ [l=fr] {_httpimg_/fr/ycbildon.gif}
+_httpiconncbildof_ [l=fr] {_httpimg_/fr/ncbildof.gif}
+
+## "   affichache de la collection" ## collector_bar_button ## view ##
+_httpicongcviewof_ [l=fr] {_httpimg_/fr/gcviewof.gif}
+_httpicongcviewon_ [l=fr] {_httpimg_/fr/gcviewon.gif}
+_httpiconycviewof_ [l=fr] {_httpimg_/fr/ycviewof.gif}
+_httpiconycviewon_ [l=fr] {_httpimg_/fr/ycviewon.gif}
+_httpiconncviewof_ [l=fr] {_httpimg_/fr/ncviewof.gif}
+
+## " suppression de la collection" ## collector_bar_button ## del ##
+_httpicongcdelof_ [l=fr] {_httpimg_/fr/gcdelof.gif}
+_httpicongcdelon_ [l=fr] {_httpimg_/fr/gcdelon.gif}
+
+## "  export de la collection" ## collector_bar_button ## expt ##
+_httpicongcexptof_ [l=fr] {_httpimg_/fr/gcexptof.gif}
+_httpicongcexpton_ [l=fr] {_httpimg_/fr/gcexpton.gif}
+
+
+######################################################################
+# 'gsdl' page
+package gsdl
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textgreenstone1_ [l=fr] {
+Greenstone est un ensemble de logiciels dont le but est de donner accÃšs
+Ã  des collections d'informations constituant une bibliothÃšque numÃ©rique
+et de construire de nouvelles collections. Greenstone permet d'organiser
+les informations d'une faÃ§on innovante et de les publier soit sur internet
+soit sur un CD-ROM. Greenstone fait partie du Projet de BibliothÃšque
+NumÃ©rique de Nouvelle ZÃ©lande Ã  l'UniversitÃ© de Waikato, il est distribuÃ©
+en coopÃ©ration avec l'UNESCO et le Projet de BibliothÃšques sur le DÃ©veloppement
+ Humanitaires.
+C'est un logiciel libre dont le code source est ouvert et qui est disponible pour 
+tÃ©lÃ© chargement Ã  d'adresse Web suivante: <i>http://greenstone.org</i>, la licence d'utilisation
+est la licence Gnu "General Public License". 
+
+}
+
+_textgreenstone2_ [l=fr] {
+Le site Web de la bibliothÃšque numÃ©rique de Nouvelle ZÃ©lande
+(<a href="http://nzdl.org">http://nzdl.org</a>) contient de
+nombreux exemples de collections, qui ont toutes Ã©tÃ© crÃ©Ã©es avec
+le logiciel Greenstone et que vous pouvez parcourir Ã  votre grÃ©
+car elles sont dans le domaine public. Elles montrent les diffÃ©rentes 
+options de recherche et de parcours, certaines collections sont
+en arabe, chinois, franÃ§ais, maori, espagnol et anglais. Il y a
+aussi quelques collections de morceaux de musique.
+
+}
+
+_textgreenstone3_ [l=fr] {
+Greenstone s'exÃ©cute sous Windows ou Unix. La distribution contient
+des versions exÃ©cutables pour toutes les versions de Windows, ainsi que 
+pour Linux. Elle contient aussi l'ensemble du code source pour le systÃšme
+qui peut Ãªtre compilÃ© soit avec MS VC++ ou Gnu GCC. Greenstone fonctionne
+avec d'autres logiciels qui eux aussi sont des logiciels libres et tÃ©lÃ©chargables:
+le serveur Web Apache et PERL. L'interface utilisateur utilise un simple
+navigateur tel que le navigateur Netscape ou Internet Explorer.
+}
+
+_textgreenstone4_ [l=fr] {
+Bon nombre de collections sont distribuÃ©es sur CD-ROM avec le logiciel
+Greenstone. Par exemple, le <i>Projet de BibliothÃšques sur le DÃ©velopement Humanitaire</i>
+contient 1230 publications qui couvrent des sujets 
+allant de la comptabilitÃ© jusqu'aux conditions d'hygiÃšne liÃ©es Ã  l'eau.
+L'accÃšs Ã  cette collection peut se faire Ã  partir d'un ordinateur aux capacitÃ©s modestes
+tels que ceux que l'on trouve dans les pays en voie de dÃ©veloppement.
+L'accÃšs aux informations contenues dans ce CD-ROM peut se faire soit en recherchant
+des mots particulier ou une phrase, en parcourant les publications par sujet,
+en parcourant les publications par titre, en parcourant les publications par
+organisation, en parcourant une liste de "Comment faire" et en affichant au hasard
+des pages de couverture des publications.
+
+}
+
+_textgreenstone5_ [l=fr] {
+Greenstone est spÃ©cialement conÃ§u pour Ãªtre Ã©largi et adaptÃ© Ã  des besoins
+particuliers. De nouveaux formats de document et mÃ©tadata peuvent Ãªtre 
+facilement traitÃ© par Greenstone en Ã©crivant des "Plug-ins" (en PERL). De la
+mÃªme faÃ§on, de nouvelles structures pour parcourir des mÃ©tadata 
+peuvent Ãªtre mise en oeuvre en Ã©crivant des "classifiers".
+L'interface utilisateur et la prÃ©sentation peuvent Ãªtre facilement modifiÃ©es
+car elles sont dÃ©finies par l'intermÃ©diaire d'un langage macro simple.
+Le protocole CORBA permet aux agents (c.a.d. Ã©crits en Java) d'utiliser toutes
+les fonctionnalitÃ©s disponibles dans les collections de documents. Finalement, le code source
+en C++ et PERL, est disponible et accessible pour modification.
+}
+
+_textthreedocs_ [l=fr] {Il y a trois documents qui expliquent le systÃšme Greenstone:}
+_textinstall_   [l=fr] {Le guide du logiciel Greenstone de bibliothÃšque numÃ©rique pour l'installation }
+_textuser_      [l=fr] {Le guide du logiciel Greenstone de bibliothÃšque numÃ©rique pour l'utilisateur}
+_textdevelop_   [l=fr] {Le guide du logiciel Greenstone de bibliothÃšque numÃ©rique pour le dÃ©veloppeur}
+
+_textmailinglist_ [l=fr] {
+Il existe une liste postale dÃ©diÃ©e au logiciel Greenstone de 
+bibliothÃšque numÃ©rique. Il serait bon que les utilisateurs actifs de
+Greenstone se joignent Ã  cette liste et contribuent aux discussions.
+La liste postale est hÃ©bergÃ©e par le "Pathfinder Library System" Ã 
+beautiful Grand Junction, Colorado (John Campbell, john@colosys.net).
+Pour souscrire, il suffit d'envoyer un courriel Ã  
+<a href="mailto:majordomo@colosys.net">majordomo@colosys.net</a>
+avec le texte suivant <ul>subscribe greenstone </ul> (pas de sujet, pas de nom, rien
+d'autre). Pour envoyer un message Ã  cette liste, adressez le Ã  <a
+href="mailto:greenstone@colosys.net">greenstone@colosys.net</a>.
+}
+
+_textreport_ [l=fr] {
+Nous voulons nous assurer que ce logiciel fonctionne correctement et qu'il
+convient Ã  vos besoins. Veuillez svp nous faire part des bogues Ã 
+<a href="mailto:majordomo@colosys.net">greenstone@cs.waikato.ac.nz</a>
+}
+
+_textcredits_ [l=fr] {Reconnaissances}
+
+_textwhoswho_ [l=fr] {
+Le logiciel Greenstone a vu le jour grÃ¢ce Ã  un effort de collaboration
+entre de nombreuses personnes. Rodger McNab et Stefan Boddie en sont les
+principaux architectes et dÃ©veloppeurs. Des contributions ont Ã©tÃ© faites
+par David Bainbridge, George Buchanan, Hong Chen, Elke Duncker, 
+Carl Gutwin, Geoff Holmes, John McPherson, Craig Nevill-Manning, 
+Gordon Paynter, Bernhard Pfahringer, Todd Reed, Bill Rogers, et Stuart Yeates. 
+
+D'autres membres du Projet de bibliothÃšque digitale de Nouvelle ZÃ©lande ont
+aussi donnÃ© des conseils et inspirÃ© les concepteurs du systÃšme:
+Mark Apperley, Sally Jo Cunningham, Steve Jones, Te Taka
+Keegan, Michel Loots, Malika Mahoui and Lloyd Smith. 
+Nous remercions aussi tous ceux qui ont contribuÃ© au dÃ©veloppement des
+logiciels libres avec une licence GNU et qui font partie de cette 
+distribution: MG, GDBM, WGET, WVWARE, PDFTOHTML.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+## "&agrave; propos du logiciel Greenstone" ## green_bar_left_aligned ## abgsgr ##
+_httpiconabgsgr_ [l=fr] {_httpimg_/fr/abgsgr.gif}
+_widthabgsgr_    [l=fr] {_pagewidth_}
+_heightabgsgr_   [l=fr] {17}
+
+
+######################################################################
+# 'users' page
+package userslistusers
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textlocu_       [l=fr] {Liste des utilisateurs actifs}
+_textuser_       [l=fr] {Utilisateur}
+_textas_         [l=fr] {Ãtat du compte}
+_textgroups_     [l=fr] {Groupes}
+_textcomment_    [l=fr] {Commentaires}
+_textadduser_    [l=fr] {Ajouter un nouvel utilisateur}
+_textedituser_   [l=fr] {Ãditer}
+_textdeleteuser_ [l=fr] {Supprimer}
+
+
+######################################################################
+# 'users' page
+package userseditusers
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textedituser_ [l=fr] {Ãditer les informations utilisateur}
+_textadduser_  [l=fr] {Ajouter un nouvel utilisateur}
+
+_textaboutusername_ [l=fr] {
+Les noms utilisateur doivent comporter entre 2 et 30 caractÃšres.
+Ils peuvent aussi contenir les caractÃšres alphanumÃ©riques '.', et '_'.
+
+}
+
+_textaboutpassword_ [l=fr] {
+Les mots de passe doivent comporter entre 3 et 8 caractÃšres.
+Ils peuvent contenir n'importe quel caractÃšre ASCII imprimable.
+
+}
+
+_textoldpass_ [l=fr]  {Si ce champ est blanc, l'ancien mot de place sera conservÃ©.}
+_textenabled_ [l=fr]  {permis}
+_textdisabled_ [l=fr] {non-permis}
+
+_textaboutgroups_ [l=fr] {
+Les groupes sont des listes dont les Ã©lÃ©ments sont sÃ©parÃ©s par des virgules,
+ne mettez pas de blancs aprÃšs les virgules.
+
+}
+
+
+######################################################################
+# 'users' page
+package usersdeleteuser
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdeleteuser_ [l=fr] {Supprimer un utilisateur}
+_textremwarn_    [l=fr] {Ãtes vous sÃ»r de vouloir supprimer l'utilisateur <b>_cgiargumun_</b>?}
+
+
+######################################################################
+# 'users' page
+package userschangepasswd
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textchangepw_ [l=fr] {Changer le mot de passe}
+_textoldpw_    [l=fr] {Ancien mot de passe}
+_textnewpw_    [l=fr] {Nouveau mot de passe}
+_textretype_   [l=fr] {Veuillez retaper le nouveau mot de passe}
+
+
+######################################################################
+# 'users' page
+package userschangepasswdok
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsuccess_ [l=fr] {Votre mot de passe a Ã©tÃ© changÃ©.}
+
+
+######################################################################
+# 'users' page
+package users
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textinvalidusername_    [l=fr] {Le nom d'utilisateur est incorrect.}
+_textinvalidpassword_    [l=fr] {Le mot de passe est incorrect.}
+_textemptypassword_      [l=fr] {Veuillez svp entrer un mot de passe initial pour cet utilisateur.}
+_textuserexists_         [l=fr] {Cet utilisateur existe dÃ©jÃ , veuillez svp entrer un autre nom d'utilisateur.}
+
+_textusernameempty_      [l=fr] {Veuillez svp entrer votre nom d'utilisateur.}
+_textpasswordempty_      [l=fr] {Vous devez entrer votre ancien mot de passe.}
+_textnewpass1empty_      [l=fr] {Entrez votre nouveau mot de passe, puis retapez le.}
+_textnewpassmismatch_    [l=fr] {Les deux versions de votre nouveau mot de passe ne correspondent pas.}
+_textnewinvalidpassword_ [l=fr] {Vous avez entrÃ© un mot de passe incorrect.}
+_textfailed_             [l=fr] {Soit le nom d'utilisateur, soit le mot de passe ou les deux sont incorrects.}
+
+
+######################################################################
+# 'status' pages
+package status
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textframebrowser_  [l=fr] {Vous devez avoir un navigateur acceptant les 'frames' pour l'affichage.}
+_textusermanage_    [l=fr] {Gestion des utilisateurs}
+_textlistusers_     [l=fr] {Liste des utilisateurs}
+_textaddusers_      [l=fr] {Ajouter un nouvel utilisateur}
+_textchangepasswd_  [l=fr] {Changer le mot de passe}
+_textinfo_          [l=fr] {Informations techniques}
+_textgeneral_       [l=fr] {GÃ©nÃ©ral}
+_textarguments_     [l=fr] {Arguments}
+_textactions_       [l=fr] {Actions}
+_textbrowsers_      [l=fr] {Navigateurs}
+_textprotocols_     [l=fr] {Protocoles}
+_textconfigfiles_   [l=fr] {Fichiers de configuration}
+_textlogs_          [l=fr] {Journaux}
+_textusagelog_      [l=fr] {Journal de l'utilisation}
+_textinitlog_       [l=fr] {Journal de l'initialisation}
+_texterrorlog_      [l=fr] {Journal des erreurs}
+_textadminhome_     [l=fr] {Page d'accueil admin}
+_textreturnhome_    [l=fr] {Page d'accueil Greenstone}
+_titlewelcome_      [l=fr] { Administration }
+_textmaas_          [l=fr] {Les services de maintenance et d'administration sont:}
+_textvol_           [l=fr] {Afficher les journaux en ligne}
+_textcmuc_          [l=fr] {CrÃ©ation, maintenance et mise Ã  jour des collections}
+_textati_           [l=fr] {AccÃšs aux informations techniques  telles que les arguments CGI}
+
+_texttsaa_ [l=fr] {
+L'accÃšs Ã  ces services peuvent se fait en utilisant la barre de navigation
+sur le cÃŽtÃ© gauche de la page.
+
+}
+
+_textcolstat_ [l=fr] {Situation de la collection}
+
+_textcwoa_ [l=fr] {
+Les collections pourront Ãªtre parcourues uniquement si le fichier
+build.cfg existe, si il est lisible, s'il contient une date de
+construction valable (c.a.d > 0),  et s'il se trouve dans
+le rÃ©pertoire <i>index</i> de la collection (c.a.d. qu'il n'est pas
+dans le rÃ©pertoire <i>build</i>.
+
+}
+
+_textcafi_ [l=fr] {Cliquez sur <i>abbrev.</i> pour obtenir des informations sur la collection}
+_textcctv_ [l=fr] {Cliquez sur <i>collection</i> pour afficher une collection}
+_textsubc_ [l=fr] {Soumettre les changements}
+_texteom_  [l=fr] {Erreur lors de l'ouverture du fichier main.cfg}
+_textftum_ [l=fr] {La mise Ã  jour du fichier main.cfg a Ã©chouÃ©}
+_textmus_  [l=fr] {La mise Ã  jour du fichier main.cfg est faite}
+
+
+######################################################################
+# 'bsummary' pages
+package bsummary
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textbsummary_ [l=fr] {RÃ©sumÃ© de la construction pour la collection _collectionname_}
+_textflog_     [l=fr] {Journal des opÃ©rations qui ont Ã©chouÃ©es pour la collection _collectionname_}
+
+
+
Index: /main/tags/2.38/gsdl/macros/german.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/german.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/german.dm	(revision 21083)
@@ -0,0 +1,927 @@
+######################################################################
+#
+# German Language text and icon macros (translated from english.dm
+# 9 March 2000)
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ {macro value}
+# Everything between the {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\{' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=de] {Die angegebene Seite konnte nicht gefunden
+werden. Bitte benutzen sie den "Zur&uuml;ck" Knopf ihres Browsers oder
+den obigen "Home" Knopf um zur Hauptseite der elektronischen
+Bibliothek zur&uuml;ckzukehren.}
+
+_textdefaulttitle_ [l=de] {GSDL Fehler}
+
+_collectionextra_ [l=de] {Diese Sammlung enth&auml;lt _about:numdocs_
+Dokumente.  Sie wurde vor _about:builddate_ Tagen erstellt.}
+
+_textimagecollection_ [l=de] {}
+_textimageabout_ [l=de] {Info}
+_textimagehome_ [l=de] {Hauptseite}
+_textimagehelp_ [l=de] {Hilfe}
+_textimagepref_ [l=de] {Voreinstellungen}
+_textimagegreenstone_ [l=de] {Greenstone Digital Library Software}
+
+_textimagesearch_ [l=de] {Suche nach einem bestimmten Begriff}
+_textimageTitle_ [l=de] {Alphabetische Liste der Titel}
+_textimageList_ [l=de] {Liste der Dokumente}
+_textimageCreator_ [l=de] {Alphabetische Liste der Autoren}
+_textimageSeries_ [l=de] {Sortiert nach Ausgaben}
+_textimageDate_ [l=de] {Sortiert nach Datum}
+_textimageSubject_ [l=de] {Sortiert nach Sparte}
+_textimageOrganization_ [l=de] {Sortiert nach Organisation}
+_textimageHowto_ [l=de] {&quot;Wie geht das?&quot;-Kategorien}
+_textimageTopic_ [l=de] {St&ouml;bern in Ausgaben zu speziellen Themen}
+_textimageBrowse_ [l=de] {St&ouml;bern}
+_textimagePeople_ [l=de] {Alphabetische Liste der Personen}
+
+_texticontabsearchgreen_ [l=de] {Suche}
+_texticontabdategreen_ [l=de] {Daten}
+_texticontabseriesgreen_ [l=de] {Serien}
+_texticontabauthorgreen_ [l=de] {Autoren A-Z}
+_texticontabtitlegreen_ [l=de] {Titel A-Z}
+_texticontablistgreen_ [l=de] {Auflistung}
+_texticontabsubjectgreen_ [l=de] {Sparten}
+_texticontaborggreen_ [l=de] {Organisation}
+_texticontabhowgreen_ [l=de] {Wie geht das?}
+_texticontabtopicgreen_ [l=de] {Themen}
+_texticontabbrwsegreen_ [l=de] {St&ouml;bern}
+_texticontabPeoplegreen_ [l=de] {Personen A-Z}
+
+_texticontext_ [l=de] {Sichten des Dokuments}
+_texticonclosedbook_ [l=de] {&Ouml;ffnen dieses Dokuments und Sichten des Inhalts}
+_texticonnext_ [l=de] {zur n&auml;chsten Sektion}
+_texticonprev_ [l=de] {zur vorhergehenden Sektion}
+
+_page_ [l=de] {Seite }
+_pages_ [l=de] {Seiten}
+_of_ [l=de] { of }
+_vol_ [l=de] {Volume}
+_num_ [l=de] {Number}
+
+_textmonth00_ [l=de] {}
+_textmonth01_ [l=de] {Januar}
+_textmonth02_ [l=de] {Februar}
+_textmonth03_ [l=de] {M&auml;rz}
+_textmonth04_ [l=de] {April}
+_textmonth05_ [l=de] {Mai}
+_textmonth06_ [l=de] {Juni}
+_textmonth07_ [l=de] {Juli}
+_textmonth08_ [l=de] {August}
+_textmonth09_ [l=de] {September}
+_textmonth10_ [l=de] {Oktober}
+_textmonth11_ [l=de] {November}
+_textmonth12_ [l=de] {Dezember}
+
+_magazines_ [l=de] {Magazine}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "HAUPTSEITE" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=de] {_httpimg_/de/chomeof.gif}
+_httpiconchomeon_ [l=de] {_httpimg_/de/chomeon.gif}
+
+## "HILFE" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=de] {_httpimg_/de/chelpof.gif}
+_httpiconchelpon_ [l=de] {_httpimg_/de/chelpon.gif}
+
+## "VOREINSTELLUNGEN" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=de] {_httpimg_/de/cprefof.gif}
+_httpiconcprefon_ [l=de] {_httpimg_/de/cprefon.gif}
+
+## "hilfe" ## green_title ## h_help ##
+_httpiconhhelp_ [l=de] {_httpimg_/de/h\_help.gif}
+_widthhhelp_ [l=de] {200}
+_heighthhelp_ [l=de] {57}
+
+## "autoren a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=de] {_httpimg_/de/tauthgr.gif}
+_httpicontauthof_ [l=de] {_httpimg_/de/tauthof.gif}
+_httpicontauthon_ [l=de] {_httpimg_/de/tauthon.gif}
+_widthtauthx_ [l=de] {102}
+
+## "serien" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=de] {_httpimg_/de/tsergr.gif}
+_httpicontserof_ [l=de] {_httpimg_/de/tserof.gif}
+_httpicontseron_ [l=de] {_httpimg_/de/tseron.gif}
+_widthtserx_ [l=de] {87}
+
+## "daten" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=de] {_httpimg_/de/tdategr.gif}
+_httpicontdateof_ [l=de] {_httpimg_/de/tdateof.gif}
+_httpicontdateon_ [l=de] {_httpimg_/de/tdateon.gif}
+_widthtdatex_ [l=de] {87}
+
+## "sparten" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=de] {_httpimg_/de/tsubjgr.gif}
+_httpicontsubjon_ [l=de] {_httpimg_/de/tsubjon.gif}
+_httpicontsubjof_ [l=de] {_httpimg_/de/tsubjof.gif}
+_widthtsubjx_ [l=de] {87}
+
+## "organisation" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=de] {_httpimg_/de/torggr.gif}
+_httpicontorgon_ [l=de] {_httpimg_/de/torgon.gif}
+_httpicontorgof_ [l=de] {_httpimg_/de/torgof.gif}
+_widthtorgx_ [l=de] {105}
+
+## "wie geht das?" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=de] {_httpimg_/de/thowgr.gif}
+_httpiconthowon_ [l=de] {_httpimg_/de/thowon.gif}
+_httpiconthowof_ [l=de] {_httpimg_/de/thowof.gif}
+_widththowx_ [l=de] {115}
+
+## "thema" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=de] {_httpimg_/de/ttopicgr.gif}
+_httpiconttopicon_ [l=de] {_httpimg_/de/ttopicon.gif}
+_httpiconttopicof_ [l=de] {_httpimg_/de/ttopicof.gif}
+_widthttopicx_ [l=de] {87}
+
+## "st&ouml;bern" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=de] {_httpimg_/de/tbrwsegr.gif}
+_httpicontbrwseon_ [l=de] {_httpimg_/de/tbrwseon.gif}
+_httpicontbrwseof_ [l=de] {_httpimg_/de/tbrwseof.gif}
+_widthtbrwsex_ [l=de] {87}
+
+## "suche" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=de] {_httpimg_/de/tsrchgr.gif}
+_httpicontsrchof_ [l=de] {_httpimg_/de/tsrchof.gif}
+_httpicontsrchon_ [l=de] {_httpimg_/de/tsrchon.gif}
+_widthtsrchx_ [l=de] {87}
+
+## "titel a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=de] {_httpimg_/de/ttitlgr.gif}
+_httpiconttitlof_ [l=de] {_httpimg_/de/ttitlof.gif}
+_httpiconttitlon_ [l=de] {_httpimg_/de/ttitlon.gif}
+_widthttitlx_ [l=de] {87}
+
+## "personen" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=de] {_httpimg_/de/tpeopgr.gif}
+_httpicontpeopof_ [l=de] {_httpimg_/de/tpeopof.gif}
+_httpicontpeopon_ [l=de] {_httpimg_/de/tpeopon.gif}
+_widthtpeopx_ [l=de] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=de] {&Uuml;ber diese Sammlung}
+
+_textsubcols1_ [l=de] {<p>Die komplette Sammlung umfa&szlig;t _1_ individuelle
+Kollektionen:
+<blockquote>}
+
+_textsubcols2_ [l=de] {</blockquote>
+Auf der Seite mit den Einstellugen k&ouml;nnen sie pr&uuml;fen (und
+ &auml;Yndern) welche individuellen Kollektionen sie momentan benutzen.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "info" ## green_title ## h_about ##
+_httpiconhabout_ [l=de] {_httpimg_/de/h\_about.gif}
+_widthhabout_ [l=de] {200}
+_heighthabout_ [l=de] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=de] {Titel A-Z}
+_texticonhauth_ [l=de] {Autoren A-Z}
+_texticonhsubj_ [l=de] {Sparten}
+_texticonhser_ [l=de] {Serien}
+_texticonhdate_ [l=de] {Daten}
+_texticonhhow_ [l=de] {Wie geht das?}
+_texticonhorg_ [l=de] {Organisationen}
+_texticonhbrwse_ [l=de] {St&ouml;bern}
+_texticonhpeople_ [l=de] {Personen A-Z}
+
+_texticonopenbookshelf_ [l=de] {Schliessen dieser Sektion der Bibliothek}
+_texticonclosedbookshelf_ [l=de] {&Ouml;ffnen dieser Sektion der Bibliothek und Sichten des Inhalts}
+_texticonopenbook_ [l=de] {Schliessen dieses Buches}
+_texticonclosedfolder_ [l=de] {&Ouml;ffnen dieses Ordners und Sichten des Inhalts}
+_texticonclosedfolder2_ [l=de] {&Ouml;ffnen der individuellen Kollektion: }
+_texticonopenfolder_ [l=de] {Schliessen dieses Ordners}
+_texticonopenfolder2_ [l=de] {Schliessen der individuellen Kollektion: }
+_texticonsmalltext_ [l=de] {Sichten des Textabschnittes}
+_texticonsmalltext2_ [l=de] {Sichten des Texts: }
+_texticonpointer_ [l=de] {Augenblickliche Sektion}
+_texticondetach_ [l=de] {&Ouml;ffnen dieser Seite in einem neuen Fenster}
+_texticonhighlight_ [l=de] {Suchbegriffe werden hervorgehoben}
+_texticonnohighlight_ [l=de] {Suchbegriffe werden nicht hervorgehoben}
+_texticoncontracttoc_ [l=de] {Verkleinerte Version des Inhaltsverzeichnisses}
+_texticonexpandtoc_ [l=de] {Expandierte Version des Inhaltsverzeichnisses}
+_texticonexpandtext_ [l=de] {Anzeigen des gesamten Texts}
+_texticoncontracttext_ [l=de] {Anzeigen des Textes nur f&uuml;r die augenblicklich ausgew&auml;hlte Sektion}
+_texticonwarning_ [l=de] {<b>Warnung: </b>}
+_texticoncont_ [l=de] {Weitermachen?}
+
+_textltwarning_ [l=de] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Wenn der Text hier expandiert wird, wird eine sehr grosse Menge an Daten dargestellt werden m&uuml;ssen _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ [l=de] {Gehe zur Seite}
+_textintro_ [l=de] { <i>(Einf&uuml;hrender Text)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "titel a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=de] {_httpimg_/de/h\_title.gif}
+_widthhtitle_ [l=de] {200}
+_heighthtitle_ [l=de] {57}
+
+## "autoren a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=de] {_httpimg_/de/h\_auth.gif}
+_widthhauth_ [l=de] {200}
+
+## "sparten" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=de] {_httpimg_/de/h\_subj.gif}
+_widthhsubj_ [l=de] {200}
+_heighthsubj_ [l=de] {57}
+
+## "serien" ## green_title ## h_ser ##
+_httpiconhser_ [l=de] {_httpimg_/de/h\_ser.gif}
+_widthhser_ [l=de] {200}
+_heighthser_ [l=de] {57}
+
+## "daten" ## green_title ## h_date ##
+_httpiconhdate_ [l=de] {_httpimg_/de/h\_date.gif}
+_widthhdate_ [l=de] {200}
+_heighthdate_ [l=de] {57}
+
+## "wie geht das?" ## green_title ## h_how ##
+_httpiconhhow_ [l=de] {_httpimg_/de/h\_how.gif}
+_widthhhow_ [l=de] {200}
+_heighthhow_ [l=de] {57}
+
+## "themen" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=de] {_httpimg_/de/h\_topic.gif}
+_widthhtopic_ [l=de] {200}
+_heighthtopic_ [l=de] {57}
+
+## "organisation" ## green_title ## h_org ##
+_httpiconhorg_ [l=de] {_httpimg_/de/h\_org.gif}
+_widthhorg_ [l=de] {250}
+_heighthorg_ [l=de] {57}
+
+## "st&ouml;bern" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=de] {_httpimg_/de/h\_brwse.gif}
+_widthhbrwse_ [l=de] {200}
+_heighthbrwse_ [l=de] {57}
+
+## "personen" ## green_title ## h_people ##
+_httpiconhpeople_ [l=de] {_httpimg_/de/h\_people.gif}
+_widthhpeople_ [l=de] {200}
+_heighthpeople_ [l=de] {57}
+
+## "WEITERMACHEN?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=de] {_httpimg_/de/contof.gif}
+_httpiconconton_ [l=de] {_httpimg_/de/conton.gif}
+
+## "EXPANDIEREN
+#  DES TEXTS" ## document_button ## eallt ## 
+_httpiconealltof_ [l=de] {_httpimg_/de/ealltof.gif}
+_httpiconeallton_ [l=de] {_httpimg_/de/eallton.gif}
+
+## "KONTRAKTIONDES
+#        INHALTS" ## document_button ## econc ##
+_httpiconeconcof_ [l=de] {_httpimg_/de/econcof.gif}
+_httpiconeconcon_ [l=de] {_httpimg_/de/econcon.gif}
+
+## "SEPARATES
+#  FENSTER" ## document_button ## edtch ##
+_httpiconedtchof_ [l=de] {_httpimg_/de/edtchof.gif}
+_httpiconedtchon_ [l=de] {_httpimg_/de/edtchon.gif}
+
+## "EXPANDIEREN
+#DES INHALTS" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=de] {_httpimg_/de/eexpcof.gif}
+_httpiconeexpcon_ [l=de] {_httpimg_/de/eexpcon.gif}
+
+## "KONTRAKTION
+#   DES TEXTS" ## document_button ## etsec ##
+_httpiconetsecof_ [l=de] {_httpimg_/de/etsecof.gif}
+_httpiconetsecon_ [l=de] {_httpimg_/de/etsecon.gif}
+
+## "HERVORHEBUNG" ## document_button ## ehl ##
+_httpiconehlof_ [l=de] {_httpimg_/de/ehlof.gif}
+_httpiconehlon_ [l=de] {_httpimg_/de/ehlon.gif}
+
+## "         KEINE
+#HERVORHEBUNG" ## document_button ## enhl ##
+_httpiconenhlof_ [l=de] {_httpimg_/de/enhlof.gif}
+_httpiconenhlon_ [l=de] {_httpimg_/de/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=de] {_If_(_thislast_,Treffer _thisfirst_ - _thislast_ zur Anfrage: _cgiargq_,Keine Treffer f&uuml;r die Anfrage: _cgiargq_)}
+_textnoquerytitle_ [l=de] {Suchseite}
+
+_texticonthispage_ [l=de] {Suche}
+_textsome_ [l=de] {_If_(_cgiargb_,gestaffelt,einige)}
+_textall_ [l=de] {_If_(_cgiargb_,boolsch,alle)}
+_texticonqueryresultsbar_ [l=de] {}
+_textfreqmsg1_ [l=de] {Zahl der W&ouml;rter: }
+_textpostprocess_ [l=de] {_If_(_quotedquery_,<br><i>weiterverarbeitet um _quotedquery_ zu finden</i>
+)}
+
+_textmorethan_ [l=de] {Mehr als }
+_textapprox_ [l=de] {&Uuml;ber }
+_textnodocs_ [l=de] {Keine Dokumente zur Anfrage passenden Dokumente gefunden.}
+_text1doc_ [l=de] {Eins zur Anfrage passendes Dokument gefunden.}
+_textlotsdocs_ [l=de] {zur Anfrage passenden Dokumente gefunden.}
+_textmatches_ [l=de] {Passende Dokumente }
+_textbeginsearch_ [l=de] {Suche beginnen}
+
+_textsimplesearch_ [l=de] {Suche nach _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in der _nselection_ Sprache) 
+die _querytypeselection_ der W&ouml;rter enthalten}
+
+_textadvancedsearch_ [l=de] {Suche nach _If_(_hselection_, _hselection_, _defaultindextext_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in der _nselection_ Sprache) 
+mit einer _querytypeselection_ Anfrage}
+
+_textjselect_ [l=de] {_If_(_hselection_, aus) _jselection_}
+
+_textstemon_ [l=de] { (Wortendungen werden ignoriert)}
+_textsearchhistory_ [l=de] {Alte Suchresultate}
+_textnohistory_ [l=de] {Alte Suchresultate nicht verf&uuml;gbar}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "suche" ## green_title ## h_search ##
+_httpiconhsearch_ [l=de] {_httpimg_/de/h\_search.gif}
+_widthhsearch_ [l=de] {200}
+_heighthsearch_ [l=de] {57}
+
+## "resultate" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=de] {_httpimg_/de/qryresb.gif}
+_widthqryresb_ [l=de] {_pagewidth_}
+_heightqryresb_ [l=de] {17}
+
+## "sichtung" ## hand_made ##
+_httpicondisplay_ [l=de] {_httpimg_/display.gif}
+_widthdisplay_ [l=de] {60}
+_heightdisplay_ [l=de] {20}
+
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsearchprefs_ [l=de] {Suchvoreinstellungen}
+_textcollectionprefs_ [l=de] {Voreinstellungen zu Kollektionen}
+_textpresentationprefs_ [l=de] {Voreinstellungen zur Pr&auml;sentation}
+_textpreferences_ [l=de] {Voreinstellungen}
+_textignorecase_ [l=de] { ignoriere Gro&szlig;-/Kleinschreibung}
+_textmatchcase_ [l=de] { Gro&szlig;-/Kleinschreibung mu&szlig; passen}
+_textstem_ [l=de] { ignoriere Wortendungen}
+_textnostem_ [l=de] { das vollst&auml;ndige Wort mu&szlig; passen}
+_textprefop_ [l=de] {Zeige maximal _maxdocoption_ hits Treffer an, mit _hitsperpageoption_ Treffern per Seite.}
+_textextlink_ [l=de] {Zugang zu externen Seiten: }
+_textintlink_ [l=de] {Quelldokumente aufgefunden in:}
+_textlanguage_ [l=de] {Schnittstellensprache: }
+_textencoding_ [l=de] {Kodierung: }
+_textformat_ [l=de] {Schnittstellenformat: }
+_textall_ [l=de] {alle}
+_textsimplemode_ [l=de] {einfache Anfragen}
+_textadvancedmode_ [l=de] {komplexe Anfragen (erm&ouml;glicht boolsche Suche mit !, &, |, und Klammern)}
+_textlinkinterm_ [l=de] {via einer dazwischenliegenden Seite}
+_textlinkdirect_ [l=de] {gehe direkt dorthin}
+_textdigitlib_ [l=de] {die elektronische Bibliothek}
+_textweb_ [l=de] {das Web}
+_textgraphical_ [l=de] {Graphisch}
+_texttextual_ [l=de] {Textuell}
+_textcollectionoption_ [l=de] {<p>
+Individuelle Sammlungen die eingebunden werden sollen:
+<br>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "voreinstellungen" ## green_title ## h_pref ##
+_httpiconhpref_ [l=de] {_httpimg_/de/h\_pref.gif}
+_widthhpref_ [l=de] {200}
+_heighthpref_ [l=de] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=de] {Help}
+_textSearchshort_ [l=de] {Suche nach bestimmten W&ouml;rtern}
+_textSeriesshort_ [l=de] {Zugriff auf Publikationen nach Serien}
+_textDateshort_ [l=de] {Zugriff auf Publikationen nach Zeit}
+_textSubjectshort_ [l=de] {Zugriff auf Publikationen nach Sparten}
+_textTitleshort_ [l=de] {Zugriff auf Publikationen nach Titel}
+_textBrowseshort_ [l=de] {St&ouml;bern in Publikationen}
+_textCreatorshort_ [l=de] {Zugriff auf Publikationen nach Autor}
+_textOrganizationshort_ [l=de] {Zugriff auf Publikationen nach Organisation}
+_textHowtoshort_ [l=de] {Zugriff auf Publikationen nach "Wie geht das?" Kategorien}
+_textTopicshort_ [l=de] {Zugriff auf Publikationen nach Thema}
+_textPeopleshort_ [l=de] {Zugriff auf Publikationen nach Personen}
+_textdefaultshorttext_ [l=de] {Klassifikation is nicht definiert}
+
+_textSearchlong_ [l=de] { <p>Sie k&ouml;nnen <i>nach bestimmten Begriffen
+suchen</i>, die im Text der Suchseite erscheinen. Das ist die erste
+Seite, die angezeigt wird, wenn sie anfangen. Sie kann von allen
+anderen Seiten durch Anklicken des <i>Suche</i> Knopfes erreicht
+werden.  }
+
+_textTitlelong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Titel zugreifen</i> indem sie den <i>Titel A-Z</i> Knopf
+anklicken. Dann wird ihnen eine alphabetisch geordnete Liste der
+B&uuml;cher angezeigt.  }
+
+_textOrganizationlong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen
+geordnet nach Organisation zugreifen</i> indem sie den
+<i>Organisationen</i> Knopf anklicken. Dann wird ihnen eine Liste der
+Organisationen angezeigt.  }
+
+_textHowtolong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen
+geordnet nach "Wie geht das?" Kategorie zugreifen</i> indem sie den
+<i>Wie geht das?</i> Knopf anklicken. Dann wird ihnen eine Liste der
+"Wie geht das?" Kategorien angezeigt.  }
+
+_textCreatorlong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Autor zugreifen</i> indem sie den <i>Autor</i> Knopf
+anklicken. Dann wird ihnen eine nach Autor geordnete Liste der
+B&uuml;cher angezeigt.  }
+
+_textTopiclong_ [l=de] {  <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Thema zugreifen</i> indem sie den <i>Thema</i> Knopf
+anklicken. Dann wird ihnen eine Liste der Themen angezeigt.  }
+
+_textSubjectlong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Sparte zugreifen</i> indem sie den <i>Sparte</i> Knopf
+anklicken. Dann wird ihnen eine Liste der Sparten angezeigt,
+dargestellt durch B&uuml;cherregale.  }
+
+_textSerieslong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Serie zugreifen</i> indem sie den <i>Serie</i> Knopf
+anklicken. Dann wird ihnen eine Liste der Serien angezeigt, die sich momentan in der Sammlung befinden.  }
+
+_textDatelong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Datum zugreifen</i> indem sie den <i>Datum</i> Knopf
+anklicken. Dann wird ihnen eine chronologisch geordnete Liste aller
+Ausgaben angezeigt.  }
+
+_textBrowselong_ [l=de] { <p>Sie k&ouml;nnen durch <i>Publikationen
+st&ouml;bern</i> indem sie den <i>St&ouml;bern</i> Knopf anklicken.  }
+
+_textPeoplelong_ [l=de] { <p>Sie k&ouml;nnen auf <i> Publikationen geordnet
+nach Personen zugreifen</i> indem sie den <i>Personen A-Z</i> Knopf
+anklicken. Dann wird ihnen eine Liste aller Eintr&auml;ge angezeigt,
+die nach Nachnamen geordnet ist.  }
+
+_textdefaultlongtext_ [l=de] { <p>Klicken sie auf den <i>Unbekannt</i> Knopf
+um durch die Publikationen zu st&ouml;bern. In diesem Fall wird die
+Liste nach einem unbekannten Feld sortiert.  }
+
+_texthelptopics_ [l=de] {
+<h2 align=left>Themen</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Wie man nach bestimmten W&ouml;rtern suchen kann</a>
+<ul>
+  <li><a href="\#query-terms">Suchbegriffe</a>
+  <li><a href="\#query-type">Typ der Anfrage</a>
+  <li><a href="\#scope-of-queries">Reichweite der Anfragen</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Voreinstellungen zu den Sammlungen</a>
+  <li><a href="\#pres-prefs">Voreinstellungen zur Pr&auml;sentation</a>
+  <li><a href="\#search-prefs">Suchvoreinstellungen</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=de] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=de] {Wie Dokumente gelesen werden k&ouml;nnen}
+_booktextreadingdocs_ [l=de] {Wie B&uuml;cher gelesen werden k&ouml;nnen}
+_bibtextreadingdocs_ [l=de] {Wie man weitere Informationen zu einem
+bibliographischen Eintrag erhalten kann}
+
+_texthelpreadingdocs_ [l=de] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p> Sie k&ouml;onnen feststellem, dass sie bei einem einzelnen
+Dokument angekommen sind, wenn dessen Titel und Autor links oben auf
+der Seite angezeigt werden. Daneben ist die aktuelle Seitennummer, ein
+K&auml;stchen welches ihnen die Auswahl einer neuen Seite erlaubt und
+vorw&auml;rts und r&uuml;ckw&auml;ts Pfeile.
+
+<p>Darunter ist der Text des aktuellen Abschnitts. Unten befinden befinden
+sich Pfeile, die sie zum n&auml;chsten Abschnitt oder zum vorherigen
+bringen nachdem sie den aktuellen Abschnitt gelesen haben.
+
+<p>Unter dem Titel und dem Namen des Autors befinden sich drei Kn&ouml;pfe.
+Dr&uuml;cken sie auf <i>ganzes Dokument</i>, um den gesamten Text des
+aktuellen Dokuments anzuzeigen. Ist 
+das Dokument umfangreich, so kann der Ladevorgang einige Zeit in
+Anspruch nehmen und es wird viel Arbeitsspeicher benn&ouml;tigt!
+Dr&uuml;cken sie auf <i>neues Fenster</i>, um das Dokument in einem neuen
+Browserfenster zu &ouml;ffnen. (Dies is sinnvoll, wenn sie Dokumente
+vergleichen oder zwei auf einmal lesen wollen.) Wenn sie das Dokument
+aufgrund einer Suche erhalten haben sind die Suchbegriffe
+hervorgehoben. Dr&uuml;cken sie auf <i>nicht hervorheben</i>, um die
+Suchbegriffe normal darzustellen.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_"
+border="0"></td><td>Dr&uuml;cken sie auf den Pfeil, um zum n&auml;chsten
+Abschnitt zu gelangen ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... oder
+zur&uuml;ck zum vorigen Abschnitt</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Gesamten Text
+darstellen, oder nicht</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_"
+border="0"></td><td>Diese Seite in einem neuen Fenster &ouml;ffnen</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Suchbegriffe
+hervorheben, oder nicht</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=de] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Sie k&ouml;nnen feststellem, dass sie bei einem einzelnen Buch angekommen
+sind, wenn eine Photographie seines Titelbildes links oben auf der Seite
+angezeigt wird. Daneben ist das Inhaltsverzeichnis angezeigt. Ein Pfeil
+markiert wo sie sich befinden. Das Inhaltsverzeichnis kann expandiert
+werden. Dr&uuml;cken sie auf die dargestellten Ordner, um sie zu
+&ouml;ffnen bzw. zu schliessen. Dr&uuml;cken sie auf das offene Buch, um es
+zu schliessen.
+
+<p>Darunter ist der Text des aktuellen Abschnitts. Unten befinden befinden
+sich Pfeile, die sie zum n&auml;chsten Abschnitt oder zum vorherigen
+bringen nachdem sie den aktuellen Abschnitt gelesen haben.
+
+<p>Unter dem Titel und dem Namen des Autors befinden sich vier Kn&ouml;pfe.
+Dr&uuml;cken sie auf <i>ganzes Dokument</i>, um den gesamten Text des
+aktuellen Dokuments oder Buches anzuzeigen. Ist 
+das Buch umfangreich, so kann der Ladevorgang einige Zeit in
+Anspruch nehmen und es wird viel Arbeitsspeicher benn&ouml;tigt!
+Dr&uuml;cken sie auf <i>Verzeichnis expandieren</i>, um das
+Inhaltsverzeichnis des aktuellen Buches vollst&auml;ndig zu
+expandieren. Die Titel aller Kapitel und Unterkapitel werden dann
+angezeigt.
+Dr&uuml;cken sie auf <i>neues Fenster</i>, um das Buch in einem neuen
+Browserfenster zu &ouml;ffnen. (Dies is sinnvoll, wenn sie B&uuml;cher
+vergleichen oder zwei auf einmal lesen wollen.) Wenn sie das Buch
+aufgrund einer Suche erhalten haben sind die Suchbegriffe
+hervorgehoben. Dr&uuml;cken sie auf <i>nicht hervorheben</i>, um die
+Suchbegriffe normal darzustellen.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_"
+border="0"></td><td>Dieses B&uuml;cherregal &ouml;ffnen</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Dieses Buch &ouml;ffnen/schliessen</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Diesen Abschnitt des Texts zeigen</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Gesamten Text
+darstellen, oder nicht</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Inhaltsverzeichnis
+expandieren, oder nicht</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Diese Seite in einem neuen Fenster &ouml;ffnen</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Suchbegriffe
+hervorheben, oder nicht</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Pfeil
+dr&uuml;cken, um zum n&auml;chsten Abschnitt zu gelangen ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... oder
+zur&uuml;ck zum vorigen Abschnitt</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=de] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p> Manche Literatur eintr&auml;e enthalten zus&auml;tzliche Informationen,
+wie z.B. eine Zusammenfassung. Sie k&ouml;nnen am Aussehen der
+Antwortseite, die sie aufgrund ihrer Anfrage erhalten, feststellen, ob
+zus&auml;tzliche Informationen vorliegen. In diesem Fall werden die
+Literatureintr&auml;ge mittels des _icontext_ Ikons anstatt des
+_iconblanktext_ Ikons dargestellt.
+
+<p>Wenn sie auf das _icontext_ Ikon dr&uuml;cken erhalten sie
+zus&auml;tzliche Informationen &uuml;ber den Literatureintrag.
+
+<p> Unter einem Literatureintrag befinden sich zwei
+Kn&oum;pfe. Dr&uuml;cken sie auf <i>neues Fenster</i>, um das Buch in einem
+neuen Browserfenster darzustellen. (Dies ist sinnvoll falls
+Literatureintr&auml;ge vergleichen wollen.)
+Wenn sie den Literatureintrag
+aufgrund einer Suche erhalten haben sind die Suchbegriffe
+hervorgehoben. Dr&uuml;cken sie auf <i>nicht hervorheben</i>, um die
+Suchbegriffe normal darzustellen.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Open this page in a new window</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Suchbegriffe
+hervorheben, oder nicht</td></tr> 
+</table>
+}
+
+_texthelpsearching_ [l=de] {
+<h2>Wie sie nach bestimmten Worten suchen k&ouml;nnen</h2>
+<p>
+  Ausgehend von der Suchseite starten sie eine Suchanfrage in den folgenden
+  einfachen Schritten::<p>
+  
+  <ol><li>Spezifizieren sie welche Dokumente sie durchsuchen wollen
+      <li>Sagen sie, ob sie nach allen oder lediglich einigen der
+      Suchbegriffe suchen wollen
+      <li>Geben sie die Suchbegriffe ein
+      <li>Dr&uuml;cken sie den Knopf <i>Starte Anfrage</i>
+  </ol>
+
+<p> Wenn sie eine Anfrage durchf&uuml;hren werden die Titel von zwanzig
+dazu gefundenen Dokumenten angezeigt. Am Ende der Seite befindet sich ein
+Knopf mit dem sie die n&auml;chsten zwanzig Seiten dargestellt
+bekommen. Dort finden sie einen Knopf, der sie zu den n&auml;chsten Zwanzig
+und einen der sie zu den ersten zwanzig bringt, und so fort. Um ein
+beliebiges Dokument zu sehen dr&uuml;cken sie auf seinen Titel  oder den
+kleinen Knopf daneben. 
+
+<p> Gem&auml;ss der Voreinstellungen werden maximal bis zu 100 Dokumente zu
+einer Anfrage zur&uuml;ckgegeben. Sie k&ouml;nnen diese Anzahl &auml;ndern
+inden sie auf den Knopf <i>Voreinstellungen</i> am Kopf der Seite
+dr&uuml;cken.<p> 
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Suchbegriffe</h3>
+
+<p> Was immer sie in das Suchfeld eingeben wird als Liste von Worten
+interpretiert, die "Suchbegriffe" genannt werden. Jeder Begriff darf
+ausschliesslich alphabetische Zeichen und Zahlen enthalten. Begriffe werden
+durch Leerzeichen getrennt. Falls Interpunktionszeichen wie Punkte oder Kommata
+auftauchen, dienen diese dazu, genau wie Leerzeichen, Begriffe zu
+trennen. Im weiteren werden sie nicht weiter beachtet. Sie k&ouml;nnen
+nicht nach Worten suchen die Interpunktionszeichen enthalten!
+
+<p>Beispiel: die Anfrage<p>
+    <ul><kbd>Agro-forestry in the Pacific Islands: Systems for Sustainability (1993)</kbd></ul>
+      <p>wird genauso interpretiert wie<p>
+      <ul><kbd>Agro forestry in the Pacific Islands  Systems for Sustainability  1993 </kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Anfragearten</h3>
+
+<p>Es gibt zwei unterschiedliche Arten von Anfragen.
+
+<ul>
+  <li>Anfragen nach <b>allen</b> eingegebenen Suchbegriffen. Anfragen
+  dieser Art suchen nach Dokumenten, die alle eingegebenen Suchbegriffe
+  beinhalten. Dokumente, die der Anfrage gen&uuml;gen werden in
+  alphabetischer Reihenfolge dargestellt.<p>
+
+  <li>Anfragen nach <b>einigen</b> der eingegebenen Suchbegriffen. Geben
+      sie einfach einige der Begriffe an, die m&ouml;glicherweise in den
+      Dokumenten enthalten sind nach denen sie suchen. Die Dokumente werden
+      in der Reihenfolge dargestellt je nachdem wie stark sie die
+      Suchanfrage erf&uuml;llen. Der Grad des Erf&uuml;llens der
+      Suchanfrage wird folgendermassen bestimmt.
+      <p><ul>
+        <li> Je mehr Suchbegriffe ein Dokument enth&auml;lt desto besser
+      erf&uuml;llt es die Anfrage.
+        <li> Seltene Begriffe sind wichtiger als sehr oft vorkommende.
+        <li> Kurze Dokumente erf&uuml;llen Anfragen besser als lange.
+      </ul>
+</ul>
+
+<p> Benutzen sie so viele Suchbegriffe wie sie wollen -- einen ganzen Satz
+oder gar einen ganzen Absatz. Falls sie nur einen einzigen Suchbegriff
+angeben werden die Dokumente nach der H&auml;ufigkeit dessen Auftauchens
+sortiert.<p>
+_texthelpscope_
+}
+
+_textchangeprefs_ [l=de] {&Auml;ndern ihrer Voreinstellungen}
+
+_texthelppreferences_ [l=de] {<h2>_textchangeprefs_</h2>
+
+<p>Wenn sie den Knopf <i>Voreinstellungen</i> am Kopf der Seite
+dr&uuml;cken, k&ouml;nnen sie einige Eigenschaften der
+Benutzerschnittstelle so ver&auml;ndern, dass sie ihren Anforderungen
+entspricht. 
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Kollektionsvoreinstellungen</h3>
+
+Einige Kollektionen enthalten mehrere Unterkollektionen welche entwerder
+unabh&auml;ngig oder gemeinsam als eine Einheit durchsucht werden
+k&ouml;nnen. Falls dem so ist, k&ouml;nnen sie auf der Voreinstellungsseite
+festlegen, welche der Unterkollektionen im Rahmen ihrer Anfragen
+ber&uuml;cksichtigt werden sollen.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Darstellungsvoreinstellungen</h3>
+
+Je nach vorliegender Kollektion k&ouml;nnen verschiedene Optionen
+eingestellt werden, die die Art der Darstellung beeinflussen.
+
+Kollektionen von Webseiten gestatten es ihnen die Darstellung der 
+Greenstonenavigationsleiste, die sich am Kopf jeder Dokumentseite befindet
+zu unterdr&uuml;cken. Auf diese Weise endet ihre Anfrage direkt auf der
+Webseite, die ihre Anfrage erf&uuml;llt, ohne dass der Greenstoneseitenkopf
+dargestellt wird. Um in diesem Falle eine weitere Suche durchf&uuml;hren zu
+k&ouml;nnen m&uuml;ssen sie den "Zur&uuml;ck" Knopf ihres Browsers
+bet&auml;tigen. Diese Art der Kollektionen erlaubt es ihnen auch die
+Greenstonewarnmeldungen zu unterdr&uuml;cken, die gezeigt werden, wenn sie
+einen Link verfolgen, der aus der Greenstonekollektion in das World-Wide
+Web f&uuml;hrt. Weiterhin k&ouml;nnen sie in manchen Webkollektionen
+einstellen, ob sie die Links auf der Ergebnisseite anstatt zur lokal in
+der Kollektion gespeicherten Kopie direkt zur Originalwebseite f&uuml;hren
+sollen. 
+
+Kollektionen, die in verschiedenen Sprachen dargestellt werden k&ouml;nnen,
+erlauben ihnen die Wahl der in der Benutzerschnittstelle zu verwendenden
+Sprache. Ist die gew&auml;hlte Sprache Chinesisch, so k&ouml;nnen sie
+ausserdem feststellen, welche der Standardkodierungen f&uuml;r Chinesisch
+ihr Browser verwendet.
+
+Schliesslich erlauben ihnen alle Kollektionen anstatt der graphischen
+Standardschnittstelle eine textuelle Schnittstelle zu verwenden. Dies ist
+besonders f&uuml;r sehbehinderte Benutzer, die auf die Verwendung grosser
+Zeichens&auml;tze oder von Ger&auml;ten zur Sprachausgabe angewiesen sind,
+sinnvoll.
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Suchvoreinstellungen</h3>
+Zwei Knopfpaare steuern, ob bei ihren Anfragen Gross- und Kleinschreibung
+beachtet wird, und ob Wortst&auml;mme Verwendung finden. Die ersten beiden
+Kn&ouml;pfe steuern, ob Gross- und Kleinbuchstanben zwischen ihrer Anfrage
+und den Dokumententextem &uuml;bereinstimmen m&uuml;ssen. Die zweiten
+beiden Kn&ouml;pfe bestimmen, ob Wortenden bei der Suche ignoriert werden
+oder nicht. 
+
+<p>Beispiel: wenn die Kn&ouml;pfe <i>ignoriere Gross-/Kleinschreibung</i> und
+<i>ignoriere Wortendungen</i> angew&aauml;hlt sind, wird die Anfrage<p>
+    <ul><kbd>African buildings</kbd></ul>
+      <p>genauso behandelt wie die Anfrage<p>
+      <ul><kbd>africa build</kbd>,</ul><p>
+      da der Grossbuchstabe in "African" zu einem Kleinbuchstaben
+      transformiert wird und die Endungen "n" and "ing" von
+      "African" und "building" entfernt werden (ausserdem wird "s" von
+      "builds" entfernt).
+
+<p>Sie k&ouml;nnen auch auf einen komplexeren Anfragemodus umschalten,
+welcher es ihnen gestattet Begriffe zu kombinieren indem sie sie mittels
+der Operatoren AND (&), OR (|), und NOT (!) verkn&uuml;pfen. Dies erlaubt
+es ihnen pr&auml;zisere Anfragen zu spezifizieren.
+
+<p>Schliesslich k&ouml;nnen sie die Anzahl der als Antwort
+zur&uuml;ckgegebenen passenden Dokumente und  der
+auf einer Seite dargestellten Dokumente einstellen.
+
+}
+
+_texttanumbrowseoptions_ [l=de] {Es gibt _numbrowseoptions_ Arten Informationen in
+dieser Kollektion zu finden:}
+
+_textsimplehelpheading_ [l=de] {Wie man Informationen findet}
+
+_texthelpscope_ [l=de] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Reichweite der Anfragen</h3>
+
+<p> In den meisten Kollektionen k&ouml;nnen sie in verschiedenen Indexen
+suchen. Es kann zum Beispiel einen Autoren- und einen Titelindex
+geben. Oder es gibt einen Kapitel- und einen Paragraphenindex. In jedem
+Fall wird zu ihrer Anfrage passendes Dokument immer vollst&auml;ndig
+zur&uuml;ckgegeben egal welchen Index sie zur Suche verwendet haben.
+<p>Sollte es sich bei Dokumenten um B&uuml;cher handeln, so werden sie immer
+an der passenden Stelle (in der Kollektion) ge&ouml;ffnet.
+}
Index: /main/tags/2.38/gsdl/macros/gsdl.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/gsdl.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/gsdl.dm	(revision 21083)
@@ -0,0 +1,116 @@
+package gsdl
+
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. 
+
+_javalinks_ {_imagehome_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+}
+
+#######################################################################
+# page content
+#######################################################################
+
+_iconabgsgr_ {<img src="_httpiconabgsgr_">}
+
+_pagetitle_ {_textimagegreenstone_}
+
+_content_ {
+_iconabgsgr_
+
+<p>
+
+
+<table border=0 cellspacing=0 cellpadding=0>
+ <tr>
+  <td valign=top align=center>_imagegreenstone_</td>
+  <td valign=top>_textgreenstone1_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+  <h2><a href="http://nzdl.org">nzdl.org</a></h2>
+  </td>
+  <td valign=top>_textgreenstone2_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+  <h2>platform</h2>
+  </td>
+  <td valign=top>_textgreenstone3_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+    <a href="http://nzdl.org/hdl"><img border=0 width=101 height=100 src="_httpimg_/hdlimg.jpg"></a>
+  </td>
+  <td valign=top>
+  _textgreenstone4_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+  <h2>customisation</h2>
+  </td>
+  <td valign=top>_textgreenstone5_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+  <h2>documentation</h2>
+  </td>
+  <td valign=top>
+  _textthreedocs_
+<ul>
+<li>_textinstall_
+<li>_textuser_
+<li>_textdevelop_
+</ul><br>
+</tr>
+ <tr>
+  <td valign=top align=center>
+  <h2>mailing list</h2>
+  </td>
+  <td valign=top>_textmailinglist_
+  <br><br>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+   <h2>bugs</h2>
+  </td>
+  <td valign=top>_textreport_
+  <br><br>
+  </td>
+ </tr>
+ <tr>
+  <td valign=top align=center>
+   <h2>_textcredits_</h2>
+  </td>
+  <td valign=top>_textwhoswho_
+  </td>
+ </tr>
+</table>
+
+<p>_iconblankbar_
+<p>
+<table>
+<tr valign=top>
+<td>_home:textpoem_</td>
+<td>_imagegreenstone_</td>
+</tr></table>
+<p>_home:textgreenstone_
+
+_nzdlpagefooter_
+}
Index: /main/tags/2.38/gsdl/macros/hebrew.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/hebrew.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/hebrew.dm	(revision 21083)
@@ -0,0 +1,1193 @@
+######################################################################
+#
+# English Language text and icon macros 
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ {macro value}
+# Everything between the {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\{' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=iw] {Greenstone Digital Library  ×××¡×× ×××××§×© ×× × ××Š×. × × ×××××¥ ×¢× ××€×ª××š "××××š×" ×××€××€× ×× ××€×ª××š ×"×××ª" ××× ×××××š × }
+ 
+
+_textdefaulttitle_ [l=iw] {GSDL ××¢××ª }
+
+
+_collectionextra_ [l=iw] { ×××× _about:builddate_ ××××¡×£ × ×× × ××€× × 
+ ××¡×××× _about:numdocs_ ××××¡×£ ××××  }
+# this is only used by the collector (where the above _collectionextra_
+# macro will always be set to another value)
+_collectorextra_ [l=iw] {  
+<p> ××ª×× _numbytes_ ×¡×"×    _If_("_numdocs_" eq "1",××¡××,××¡××××),_numdocs_ ××××¡×£ ×××× ××××¢ ××××× }
+
+
+_textimagecollection_ [l=iw] {}
+_textimageabout_ [l=iw] {×¢× ×××ª×š}
+_textimagehome_ [l=iw] {×¢××× ××××ª}
+_textimagehelp_ [l=iw] {××£ ×¢××š}
+_textimagepref_ [l=iw] {××£ ××××š××ª}
+_textimagegreenstone_ [l=iw] {Greenstone  ×¡×€×š×××ª }
+
+
+
+_textimagesearch_ [l=iw] {××€×© ××× ××× ××××××§××}
+_textimageTitle_ [l=iw] {××€××£ ×××ª×š××ª ××€× ×-×}
+_textimageList_ [l=iw] {××€××£ ××š×©×××ª ××¡××××}
+_textimageCreator_ [l=iw] {××€××£ ××××š×× ××€× ×-×}
+_textimageSeries_ [l=iw] {××€××£ ××€× ×¡××××š××}
+_textimageDate_ [l=iw] {××€××£ ××€× ×ª××š××}
+_textimageSubject_ [l=iw] {××€××£ ××€× × ××©×××}
+_textimageTo_ [l=iw] {××€××£ ××€× ×¡××š ×××¢×}
+_textimageFrom_ [l=iw] {××€××£ ××€× ×¡××š ××§××š××ª}
+_textimageOrganization_ [l=iw] {××€××£ ××€× ×××š××× ××}
+_textimageHowto_ [l=iw] {××€××£ ××€× ×¡××š ×××Š×}
+_textimageTopic_ [l=iw] {××€××£ ××€× ×¡××××š×× ×××××××}
+_textimageBrowse_ [l=iw] {××€××£}
+_textimagePeople_ [l=iw] {××€××£ ×š×©×××ª ×× ×©×× ××€× ×-×}
+_textimageLanguage_ [l=iw] {××€××£ ××€× ×©×€×} 
+_textimageAcronym_ [l=iw] {××€××£ ×š××©× ×ª××××ª}
+_textimagePhrase_ [l=iw] {××€××£ ××××××××}
+
+_texticontabsearchgreen_ [l=iw] {××€×©}
+_texticontabdategreen_ [l=iw] {×ª××š××××}
+_texticontabseriesgreen_ [l=iw] {×¡××š××ª}
+_texticontabauthorgreen_ [l=iw] {××××š×× ×-×ª}
+_texticontabtitlegreen_ [l=iw] {×××ª×š××ª ×-×ª}
+_texticontablistgreen_ [l=iw] {×š×©××××ª}
+_texticontabsubjectgreen_ [l=iw] {× ××©×××}
+_texticontabtogreen_ [l=iw] {××¢×}
+_texticontabfromgreen_ [l=iw] {××§××š}
+_texticontaborggreen_ [l=iw] {×××š×××}
+_texticontabhowgreen_ [l=iw] {×××Š×}
+_texticontabtopicgreen_ [l=iw] {×××ª×š××ª}
+_texticontabbrwsegreen_ [l=iw] {××€××£}
+_texticontabPeoplegreen_ [l=iw] {×× ×©×× ×-×ª}
+_texticontabLanguagegreen_ [l=iw] {×©×€×}
+_texticontabAcronymgreen_ [l=iw] {×š××©× ×ª××××ª}
+_texticontabPhrasegreen_ [l=iw] {×××××××}
+
+
+_texticontext_ [l=iw] {××Š× ××ª ×××¡××}
+_texticonclosedbook_ [l=iw] {×€×ª× ××ª ×××¡×× ×××Š× ××ª ×ª××× ×}
+_texticonnext_ [l=iw] {××××§ ×××}
+_texticonprev_ [l=iw] {××××§ ××§×××}
+
+_texticonmidi_ [l=iw] {MIDI - ××Š× ××ª ××¡×× ×}
+_texticonmsword_ [l=iw] {Word - ××Š× ××ª ××¡×× ×}
+_texticonpdf_ [l=iw] {PDF - ××Š× ××ª ××¡×× × }
+_texticonps_ [l=iw] {PS - ××Š× ××ª ××¡×× ×}
+_texticonppt_ [l=iw] {PPT - ××Š× ××ª ××¡×× ×}
+_texticonrtf_ [l=iw] {RTF - ××Š× ××ª ××¡×× ×}
+_texticonxls_ [l=iw] {XLS - ××Š× ××ª ××¡×× ×}
+
+
+
+
+_page_ [l=iw] {×¢×××}
+_pages_ [l=iw] {×¢×××××}
+_of_ [l=iw] {×××§××š ×××}
+_vol_ [l=iw] {××š×}
+_num_ [l=iw] {××¡×€×š}
+
+
+_textmonth00_ [l=iw] {}
+_textmonth01_ [l=iw] {×× ×××š}
+_textmonth02_ [l=iw] {×€××š×××š}
+_textmonth03_ [l=iw] {××š×¥}
+_textmonth04_ [l=iw] {××€×š××}
+_textmonth05_ [l=iw] {×××}
+_textmonth06_ [l=iw] {××× ×}
+_textmonth07_ [l=iw] {××××}
+_textmonth08_ [l=iw] {×××××¡×}
+_textmonth09_ [l=iw] {×¡×€××××š}
+_textmonth10_ [l=iw] {×××§××××š}
+_textmonth11_ [l=iw] {× ×××××š}
+_textmonth12_ [l=iw] {××Š×××š}
+
+
+_Document_ [l=iw] {××¡××}
+_Section_ [l=iw] {×××§} 
+_Paragraph_ [l=iw] {×€××¡×§×}
+
+_magazines_ [l=iw] {××š×××}
+
+
+_nzdlpagefooter_ [l=iw] {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">New Zealand Digital Library Project</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Department of Computer Science</a>, 
+<a href="http://www.waikato.ac.nz">University of Waikato</a>, 
+New Zealand}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "  ××××¢ ×ª××× " ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=iw] {_httpimg_/iw/chomeof.gif}
+_httpiconchomeon_ [l=iw] {_httpimg_/iw/chomeon.gif}
+_widthchomex_ [l=iw] {43}
+_heightchomex_ [l=iw] {20}
+
+## " ××š××¢ " ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=iw] {_httpimg_/iw/chelpof.gif}
+_httpiconchelpon_ [l=iw] {_httpimg_/iw/chelpon.gif}
+_widthchelpx_ [l=iw] {36}
+_heightchelpx_ [l=iw] {20}
+
+## " ×ª××××€×××¢ " ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=iw] {_httpimg_/iw/cprefof.gif}
+_httpiconcprefon_ [l=iw] {_httpimg_/iw/cprefon.gif}
+_widthcprefx_ [l=iw] {87}
+_heightcprefx_ [l=iw] {20}
+
+## " ××š××¢ " ## green_title ## h_help ##
+_httpiconhhelp_ [l=iw] {_httpimg_/iw/h\_help.gif}
+_widthhhelp_ [l=iw] {200}
+_heighthhelp_ [l=iw] {57}
+
+## " ×××š××× ×ª-× " ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=iw] {_httpimg_/iw/tauthgr.gif}
+_httpicontauthof_ [l=iw] {_httpimg_/iw/tauthof.gif}
+_httpicontauthon_ [l=iw] {_httpimg_/iw/tauthon.gif}
+_widthtauthx_ [l=iw] {100}
+_heighttauthx_ [l=iw] {17}
+
+## " ×ª××š××¡ " ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=iw] {_httpimg_/iw/tsergr.gif}
+_httpicontserof_ [l=iw] {_httpimg_/iw/tserof.gif}
+_httpicontseron_ [l=iw] {_httpimg_/iw/tseron.gif}
+_widthtserx_ [l=iw] {87}
+_heighttserx_ [l=iw] {17}
+
+## " ×××××š××ª " ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=iw] {_httpimg_/iw/tdategr.gif}
+_httpicontdateof_ [l=iw] {_httpimg_/iw/tdateof.gif}
+_httpicontdateon_ [l=iw] {_httpimg_/iw/tdateon.gif}
+_widthtdatex_ [l=iw] {87}
+_heighttdatex_ [l=iw] {17}
+
+## " ××××©××  " ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=iw] {_httpimg_/iw/tsubjgr.gif}
+_httpicontsubjon_ [l=iw] {_httpimg_/iw/tsubjon.gif}
+_httpicontsubjof_ [l=iw] {_httpimg_/iw/tsubjof.gif}
+_widthtsubjx_ [l=iw] {87}
+_heighttsubjx_ [l=iw] {17}
+
+## " ×š××§× " ## nav_bar_button ## tto ##
+_httpiconttogr_ [l=iw] {_httpimg_/iw/ttogr.gif}
+_httpiconttoon_ [l=iw] {_httpimg_/iw/ttoon.gif}
+_httpiconttoof_ [l=iw] {_httpimg_/iw/ttoof.gif}
+_widthttox_ [l=iw] {87}
+_heightttox_ [l=iw] {17}
+
+## " ××¢× " ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ [l=iw] {_httpimg_/iw/tfromgr.gif}
+_httpicontfromon_ [l=iw] {_httpimg_/iw/tfromon.gif}
+_httpicontfromof_ [l=iw] {_httpimg_/iw/tfromof.gif}
+_widthtfromx_ [l=iw] {87}
+_heighttfromx_ [l=iw] {17}
+
+## " ××××š× " ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=iw] {_httpimg_/iw/torggr.gif}
+_httpicontorgon_ [l=iw] {_httpimg_/iw/torgon.gif}
+_httpicontorgof_ [l=iw] {_httpimg_/iw/torgof.gif}
+_widthtorgx_ [l=iw] {87}
+_heighttorgx_ [l=iw] {17}
+
+## " ××Š×× " ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=iw] {_httpimg_/iw/thowgr.gif}
+_httpiconthowon_ [l=iw] {_httpimg_/iw/thowon.gif}
+_httpiconthowof_ [l=iw] {_httpimg_/iw/thowof.gif}
+_widththowx_ [l=iw] {87}
+_heightthowx_ [l=iw] {17}
+
+## " ×ª×š×ª×× " ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=iw] {_httpimg_/iw/ttopicgr.gif}
+_httpiconttopicon_ [l=iw] {_httpimg_/iw/ttopicon.gif}
+_httpiconttopicof_ [l=iw] {_httpimg_/iw/ttopicof.gif}
+_widthttopicx_ [l=iw] {87}
+_heightttopicx_ [l=iw] {17}
+
+## " ×£××€× " ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=iw] {_httpimg_/iw/tbrwsegr.gif}
+_httpicontbrwseon_ [l=iw] {_httpimg_/iw/tbrwseon.gif}
+_httpicontbrwseof_ [l=iw] {_httpimg_/iw/tbrwseof.gif}
+_widthtbrwsex_ [l=iw] {87}
+_heighttbrwsex_ [l=iw] {17}
+
+## " ×©×€× " ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=iw] {_httpimg_/iw/tsrchgr.gif}
+_httpicontsrchof_ [l=iw] {_httpimg_/iw/tsrchof.gif}
+_httpicontsrchon_ [l=iw] {_httpimg_/iw/tsrchon.gif}
+_widthtsrchx_ [l=iw] {87}
+_heighttsrchx_ [l=iw] {17}
+
+## " ×ª-× ×ª××š×ª×× " ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=iw] {_httpimg_/iw/ttitlgr.gif}
+_httpiconttitlof_ [l=iw] {_httpimg_/iw/ttitlof.gif}
+_httpiconttitlon_ [l=iw] {_httpimg_/iw/ttitlon.gif}
+_widthttitlx_ [l=iw] {100}
+_heightttitlx_ [l=iw] {17}
+
+## " ×××©× × " ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=iw] {_httpimg_/iw/tpeopgr.gif}
+_httpicontpeopof_ [l=iw] {_httpimg_/iw/tpeopof.gif}
+_httpicontpeopon_ [l=iw] {_httpimg_/iw/tpeopon.gif}
+_widthtpeopx_ [l=iw] {87}
+_heighttpeopx_ [l=iw] {17}
+
+## " ××€×© " ## nav_bar_button ## tlang ##
+_httpicontlanggr_ [l=iw] {_httpimg_/iw/tlanggr.gif}
+_httpicontlangon_ [l=iw] {_httpimg_/iw/tlangon.gif}
+_httpicontlangof_ [l=iw] {_httpimg_/iw/tlangof.gif}
+_widthtlangx_ [l=iw] {87}
+_heighttlangx_ [l=iw] {17}
+
+## " ××©××š ×ª××××ª " ## nav_bar_button ## tacro ##
+_httpicontacrogr_ [l=iw] {_httpimg_/iw/tacrogr.gif}
+_httpicontacroof_ [l=iw] {_httpimg_/iw/tacroof.gif}
+_httpicontacroon_ [l=iw] {_httpimg_/iw/tacroon.gif}
+_widthtacrox_ [l=iw] {99}
+_heighttacrox_ [l=iw] {17}
+
+
+
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+
+## " ××¢ " ## green_title ## h_about ##
+_httpiconhabout_ [l=iw] {_httpimg_/iw/h\_about.gif}
+_widthhabout_ [l=iw] {200}
+_heighthabout_ [l=iw] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=iw] {×× ××××¡×£}
+
+_textsubcols1_ [l=iw] {<p>××××¡×£ ××××  _1_  ×ª×ª-×××¡×€××  
+<blockquote>}
+_textsubcols2_ [l=iw] {</blockquote>
+×××£ ×¢×××€×××ª × ××ª× ××š×××ª (×××©× ××ª) ××××× ×ª×ª-×××¡×€×× ××©×ª××©×× ××š××¢ ××}
+
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "××¢ ×£×¡×××" ## green_title ## h_about ##
+_httpiconhabout_ [l=iw] {_httpimg_/iw/h\_about.gif}
+_widthhabout_ [l=iw] {200}
+_heighthabout_ [l=iw] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textTitlepage_ [l=iw] {_texticonhtitle_}
+_textCreatorpage_ [l=iw] {_texticonhauth_}
+_textSubjectpage_ [l=iw] {_texticonhsubj_}
+_textTopage_ [l=iw] {_texticonhto_}
+_textFrompage_ [l=iw] {_texticonhfrom_}
+_textSeriespage_ [l=iw] {_texticonhser_}
+_textDatepage_ [l=iw] {_texticonhdate_}
+_textHowtopage_ [l=iw] {_texticonhhow_}
+_textOrganizationpage_ [l=iw] {_texticonhorg_}
+_textBrowsepage_ [l=iw] {_texticonhbrwse_}
+_textPeoplepage_ [l=iw] {_texticonhpeople_}
+_textLanguagepage_ [l=iw] {_texticonhlanguage_}
+_textAcronympage_ [l=iw] {_texticonhacronym_}
+_textPhrasepage_ [l=iw] {_texticonhphrases_}
+
+_texticonhtitle_ [l=iw] {×××ª×š××ª ×-×ª}
+_texticonhauth_ [l=iw] {××××š×× ×-×ª}
+_texticonhsubj_ [l=iw] {× ××©×××}
+_texticonhto_ [l=iw] {××¢×}
+_texticonhfrom_ [l=iw] {××§××š}
+_texticonhser_ [l=iw] {×¡××š××ª}
+_texticonhdate_ [l=iw] {×ª××š××××}
+_texticonhhow_ [l=iw] {×××Š×}
+_texticonhorg_ [l=iw] {×××š××× ××}
+_texticonhbrwse_ [l=iw] {××€××£}
+_texticonhpeople_ [l=iw] {×× ×©×× ×-×ª}
+_texticonhlanguage_ [l=iw] {×©×€××ª}
+_texticonhacronym_ [l=iw] {×š××©× ×ª××××ª}
+_texticonhphrases_ [l=iw] {×××××××}
+
+
+
+_texticonopenbookshelf_ [l=iw] {×¡×××š ××ª ××××§ ××× ×©× ××¡×€×š×××}
+_texticonclosedbookshelf_ [l=iw] {×€×ª× ××ª ××××§ ××× ×©× ××¡×€×š××× ×××Š× ××ª ×ª××× ×}
+_texticonopenbook_ [l=iw] {×¡×××š ××ª ××¡×€×š}
+_texticonclosedfolder_ [l=iw] {×€×ª× ××ª ××ª××§××× ×××Š× ××ª ×ª××× ×}
+_texticonclosedfolder2_ [l=iw] {×€×ª× ××ª ××ª×ª-×××§} 
+_texticonopenfolder_ [l=iw] {×¡×××š ××ª ××ª××§×××}
+_texticonopenfolder2_ [l=iw] {×¡×××š ××ª ××ª×ª-×××§} 
+_texticonsmalltext_ [l=iw] {××Š× ××ª ××××§ ××× ×©× ×××§×¡×}
+_texticonsmalltext2_ [l=iw] {××Š× ××§×¡×} 
+_texticonpointer_ [l=iw] {×××§ × ××××}
+_texticondetach_ [l=iw] {×€×ª× ××ª ××¢××× ××××× ×××©}
+_texticonhighlight_ [l=iw] {××××© ××× ×× ×××€××©}
+_texticonnohighlight_ [l=iw] {×× ×ª××××© ××× ×× ×××€××©}
+_texticoncontracttoc_ [l=iw] {×Š××Š× ×ª××× ×¢×× ××× ××}
+_texticonexpandtoc_ [l=iw] {××Š× ×ª××× ×¢×× ××× ××}
+_texticonexpandtext_ [l=iw] {××Š× ××ª ×× ×××§×¡×}
+_texticoncontracttext_ [l=iw] {××Š× ××§×¡× ×š×§ ×¢×××š ××××§ ×××¡×××}
+_texticonwarning_ [l=iw] {<b> ××××š× : /<b>}
+_texticoncont_ [l=iw] {?××××©××}
+_textltwarning_ [l=iw] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_  ××Š××ª ×××§×¡× ××× ×××Š××š ××××ª ××××× 
+×©× × ×ª×× ×× ×××Š×× ×××€××€× _imagecont_
+</td></tr></table></center>
+}
+_textgoto_ [l=iw] {×× ××¢×××}
+_textintro_ [l=iw] { <i>  (××××) </i> }
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "  ×ª××š×ª×× ×ª-× " ## green_title ## h_title ##
+_httpiconhtitle_ [l=iw] {_httpimg_/iw/h\_title.gif}
+_widthhtitle_ [l=iw] {200}
+_heighthtitle_ [l=iw] {57}
+
+## "  ×××š××× ×ª-× " ## green_title ## h_auth ##
+_httpiconhauth_ [l=iw] {_httpimg_/iw/h\_auth.gif}
+_widthhauth_ [l=iw] {200}
+_heighthauth_ [l=iw] {57}
+
+## " ××××©××  " ## green_title ## h_subj ##
+_httpiconhsubj_ [l=iw] {_httpimg_/iw/h\_subj.gif}
+_widthhsubj_ [l=iw] {200}
+_heighthsubj_ [l=iw] {57}
+
+## " ×š××§× " ## green_title ## h_to ##
+_httpiconhto_ [l=iw] {_httpimg_/iw/h\_to.gif}
+_widthhto_ [l=iw] {200}
+_heighthto_ [l=iw] {57}
+
+## " ××¢× " ## green_title ## h_from ##
+_httpiconhfrom_ [l=iw] {_httpimg_/iw/h\_from.gif}
+_widthhfrom_ [l=iw] {200}
+_heighthfrom_ [l=iw] {57}
+
+## " ×ª××š××¡ " ## green_title ## h_ser ##
+_httpiconhser_ [l=iw] {_httpimg_/iw/h\_ser.gif}
+_widthhser_ [l=iw] {200}
+_heighthser_ [l=iw] {57}
+
+## " ×××××š××ª " ## green_title ## h_date ##
+_httpiconhdate_ [l=iw] {_httpimg_/iw/h\_date.gif}
+_widthhdate_ [l=iw] {200}
+_heighthdate_ [l=iw] {57}
+
+## " ××Š×× " ## green_title ## h_how ##
+_httpiconhhow_ [l=iw] {_httpimg_/iw/h\_how.gif}
+_widthhhow_ [l=iw] {200}
+_heighthhow_ [l=iw] {57}
+
+## " ××××©××  " ## green_title ## h_topic ##
+_httpiconhtopic_ [l=iw] {_httpimg_/iw/h\_topic.gif}
+_widthhtopic_ [l=iw] {200}
+_heighthtopic_ [l=iw] {57}
+
+## " ××××š× " ## green_title ## h_org ##
+_httpiconhorg_ [l=iw] {_httpimg_/iw/h\_org.gif}
+_widthhorg_ [l=iw] {250}
+_heighthorg_ [l=iw] {57}
+
+## " ××Š× " ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=iw] {_httpimg_/iw/h\_brwse.gif}
+_widthhbrwse_ [l=iw] {200}
+_heighthbrwse_ [l=iw] {57}
+
+## " ×××©× × " ## green_title ## h_people ##
+_httpiconhpeople_ [l=iw] {_httpimg_/iw/h\_people.gif}
+_widthhpeople_ [l=iw] {200}
+_heighthpeople_ [l=iw] {57}
+
+## " ×ª××€×© " ## green_title ## h_lang ##
+_httpiconhlanguage_ [l=iw] {_httpimg_/iw/h\_lang.gif}
+_widthhlanguage_ [l=iw] {200}
+_heighthlanguage_ [l=iw] {57}
+
+## " ××©××š ×ª××××ª " ## green_title ## h_acro ##
+_httpiconhacronym_ [l=iw] {_httpimg_/iw/h\_acro.gif}
+_widthhacronym_ [l=iw] {200}
+_heighthacronym_ [l=iw] {57}
+
+##  " " ×××©××× ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=iw] {_httpimg_/iw/contoff.gif}
+_httpiconconton_ [l=iw] {_httpimg_/iw/conton.gif}
+_widthcontx_ [l=iw] {76}
+_heightcontx_ [l=iw] {17}
+
+## " ××××š×× ××¡×§× " ## document_button ## eallt ## 
+_httpiconealltof_ [l=iw] {_httpimg_/iw/ealltof.gif}
+_httpiconeallton_ [l=iw] {_httpimg_/iw/eallton.gif}
+_widthealltx_ [l=iw] {65}
+_heightealltx_ [l=iw] {30}
+
+## " ×¥×××× ×ª× ××××ª× " ## document_button ## econc ##
+_httpiconeconcof_ [l=iw] {_httpimg_/iw/econcof.gif}
+_httpiconeconcon_ [l=iw] {_httpimg_/iw/econcon.gif}
+_widtheconcx_ [l=iw] {65}
+_heighteconcx_ [l=iw] {30}
+
+## " ×§×ª× × " ## document_button ## edtch ##
+_httpiconedtchof_ [l=iw] {_httpimg_/iw/edtchof.gif}
+_httpiconedtchon_ [l=iw] {_httpimg_/iw/edtchon.gif}
+_widthedtchx_ [l=iw] {65}
+_heightedtchx_ [l=iw] {30}
+
+## " ××××š×× ×ª× ××××ª× " ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=iw] {_httpimg_/iw/eexpcof.gif}
+_httpiconeexpcon_ [l=iw] {_httpimg_/iw/eexpcon.gif}
+_widtheexpcx_ [l=iw] {65}
+_heighteexpcx_ [l=iw] {30}
+
+## " ×¥×××× ×ª× ××¡×§×× " ## document_button ## etsec ##
+_httpiconetsecof_ [l=iw] {_httpimg_/iw/etsecof.gif}
+_httpiconetsecon_ [l=iw] {_httpimg_/iw/etsecon.gif}
+_widthetsecx_ [l=iw] {65}
+_heightetsecx_ [l=iw] {30}
+
+## " ××©××× " ## document_button ## ehl ##
+_httpiconehlof_ [l=iw] {_httpimg_/iw/ehlof.gif}
+_httpiconehlon_ [l=iw] {_httpimg_/iw/ehlon.gif}
+_widthehlx_ [l=iw] {65}
+_heightehlx_ [l=iw] {30}
+
+## " ××× ××©××× " ## document_button ## enhl ##
+_httpiconenhlof_ [l=iw] {_httpimg_/iw/enhlof.gif}
+_httpiconenhlon_ [l=iw] {_httpimg_/iw/enhlon.gif}
+_widthenhlx_ [l=iw] {65}
+_heightenhlx_ [l=iw] {30}
+
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=iw] {_If_(thislast_,×ª××Š×××ª _thisfirst_ - _thislast_ ××©××××ª× : _cgiargq_, ×××  ××¡×××× ×××× ××©××××ª×: _cgiargq_)}
+
+_textnoquerytitle_ [l=iw] {×××€××© ××£}
+
+_texticonthispage_ [l=iw] {×××€××©}
+_textsome_ [l=iw] {_If_(_cgiargb_,×××§,×××××)}
+_textall_ [l=iw] {_If_(_cgiargb_,×××,××××× × )}
+_textformsome_ [l=iw] {_If_(_cgiargb_,×××§,×××××)}
+_textformall_ [l=iw] {_If_(_cgiargb_,×××,×××¢×)}
+_texticonqueryresultsbar_ [l=iw] {}
+_texticonsearchhistorybar_ [l=iw] {××¡×××š×××ª ×××€××©}
+
+#alt text for query buttons
+ 
+_textusequery_ [l=iw] {×©×ª××© ××©××××ª× ××××ª} 
+_textfreqmsg1_ [l=iw] {:×¡×€××š×ª ×××××}
+
+_textpostprocess_ [l=iw] {_If_(_quotedquery_,<br><i>××××š ×××××_quotedquery_</i>)}
+
+_textmorethan_ [l=iw] { -  ×××ª×š × }
+_textapprox_ [l=iw] {××} 
+_textnodocs_ [l=iw] {××©××××ª× ××× ×ª×©××××ª} 
+_text1doc_ [l=iw] {×ª×©××× ×××ª ××× ××©××××ª×} 
+_textlotsdocs_ [l=iw] {×ª×©××××ª ××ª×××××ª ××©××××ª×} 
+_textmatches_ [l=iw] {× ××Š×× ××ª××××ª}
+_textbeginsearch_ [l=iw] {××ª×× ×××€××©} 
+_textrunquery_ [l=iw] {××š×¥ ×©××××ª×} 
+_textclearform_ [l=iw] {× ×§× ×××€×¡} 
+
+#these go together in form search:
+#"Word or phrase  (fold, stem)  ... in field"
+_textwordphrase_ [l=iw] {×××× ×× ×××××}
+_textinfield_ [l=iw] { ...××©××}
+_textfoldstem_ [l=iw] {××××©×× ××××€××©, ××¢×Š××š }
+
+_textadvquery_ [l=iw] {×× ××× ×¡ ××ª ××©××××ª× ××©××š××ª:}
+_textallfields_ [l=iw] {×× × ×©×××ª}
+_textand_ [l=iw] {×××}
+_textor_ [l=iw] {××}
+_textandnot_ [l=iw] {×××} 
+
+
+# _hselection_, _jselection_, _nselection_ and _gselection_ are set from 
+# within the server some or all of them may remain unset
+
+
+_textsimplesearch_ [l=iw] {××€×© ××ª _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, _gselection_ ××š××) _If_(_nselection_, _nselection_ ××©×€×)
+_querytypeselection_ ××©×š ×××××ª ×××××}
+
+_textadvancedsearch_ [l=iw] {××€×© ××ª _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, _gselection_ ××š××)_If_(_nselection_, _nselection_ ××©×€×)  
+_querytypeselection_ ××©××××© ×©× ×©×××××}
+
+_textformsimplesearch_ [l=iw] {××€×© ××ª _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, _gselection_ ××š××) _If_(_nselection_, _nselection_ ××©×€×)
+_formquerytypeselection_ ××©×š ×××××ª ××ª}
+
+_textformadvancedsearch_ [l=iw] {××€×© ××ª _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_)
+_If_(_gselection_, _gselection_ × ××š×× _If_(_nselection_, _nselection_ ××©×€×)}
+
+_formquerytypeselection_ [l=iw] {×××Š× ×ª××Š×××ª ××€× ×¡××š}
+
+_textjselect_ [l=iw] {_If_(_hselection_, ×©×) _jselection_}
+
+_textdatesearch_ [l=iw] {××××€×¡ ××× × ××ª× ×××€×© ×××š ××¡×××× ××ª×§××€× ××¡×××××ª ×× ×××× ××××××× ×ª××š×× ××¡××××. ×× ×××§ ×××€×Š××× ×× ×××××€××©}
+
+_textstartdate_ [l=iw] {×ª××š×× (×× ×š×§ ) ××ª×××}
+
+_textenddate_ [l=iw] {×ª××š××  ×¡×××:}
+_textbc_ [l=iw] {××€× × ××¡×€××š×}
+_textad_ [l=iw] {××¡×€××š×}
+_textexplaineras_ [l=iw] { ×××ª××.C.E. -× B.C.E -×   A.D. -×  B.C. ××××¡×§×, ××©××× ×××× ××ª ××××××× ××ª×š×××ª× ×××¡×× ××ª ××€× × ××××š× ××¡×€××š× 
+ ××× ××©××©×× × -  "××¡×€××š×" ×-"××€× × ××¡×€××š×" ×××ª×××}
+_textstemon_ [l=iw] {(××ª×¢××  ××¡××××ª ×©× ××××× )}
+
+_textsearchhistory_ [l=iw] {××¡×××š×××ª ×××€××©} 
+
+#text macros for search history
+_textnohistory_ [l=iw] {×××¡×××š×××ª ×××€××© ×× ×××× ×}
+_texthresult_ [l=iw] {×ª××Š××} 
+_texthresults_ [l=iw] {×ª××Š×××ª} 
+_texthallwords_ [l=iw] {×× ××××××}  
+_texthsomewords_ [l=iw] {××§ ×©× ××××××}
+_texthboolean_ [l=iw] {××××× ×}
+_texthranked_ [l=iw] {×××××}
+_texthcaseon_ [l=iw] {×××× ×××ª×××  ×××× ××××ª×××ª} 
+_texthcaseoff_ [l=iw] {×©×××š ×¢× ×××× ×××××} 
+_texthstemon_ [l=iw] {× ×¢×Š×š} 
+_texthstemoff_ [l=iw] {×××©×× ××× ×¢×Š××š×} 
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "×©××€××  " ## green_title ## h_search ##
+_httpiconhsearch_ [l=iw] {_httpimg_/iw/h\_search.gif}
+_widthhsearch_ [l=iw] {200}
+_heighthsearch_ [l=iw] {57}
+
+## " ×ª×××Š××ª" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=iw] {_httpimg_/iw/qryresb.gif}
+_widthqryresb_ [l=iw] {_pagewidth_}
+_heightqryresb_ [l=iw] {17}
+
+## " ×××š×××¡× " ## green_bar_left_aligned ## schhistb ##
+_httpiconsrchhistb_ [l=iw] {_httpimg_/iw/schhistb.gif}
+_widthsrchhistb_ [l=iw] {_pagewidth_}
+_heightsrchhistb_ [l=iw] {17}
+
+## "××Š× " ## hand_made ##
+_httpicondisplay_ [l=iw] {_httpimg_/display.gif}
+_widthdisplay_ [l=iw] {60}
+_heightdisplay_ [l=iw] {20}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textprefschanged_ [l=iw] {  ××¢×××€××××ª ×××××š× ××¡××š ××× :
+ ×©× ××€××€×&quot;back&quot;  ×× ×ª×©×ª××© ×××€×××š 
+×× ×××× ×××ª× !  ×××§×× ×××ª ×ª×××Š× ×¢× ××€×ª××š×× ××¡×š×× ×××©× ×××¢××}
+
+
+_textsetprefs_ [l=iw] {××××š×ª ×¢×××€××××ª}
+_textsearchprefs_ [l=iw] {×××€××© ×¢×××€××××ª}
+_textcollectionprefs_ [l=iw] {×××¡×£ ×¢×××€××××ª} 
+_textpresentationprefs_ [l=iw] {×ª×Š×××ª ×¢×××€××××ª} 
+_textpreferences_ [l=iw] {×¢×××€××××ª} 
+_textcasediffs_ [l=iw] {××××× ×××ª×××ª ×§×× ××ª/××××××ª}
+_textignorecase_ [l=iw] {××ª×¢×× ×××××× ×××ª×××ª ×§×× ××ª/××××××ª} 
+_textmatchcase_ [l=iw] {×××× ×××ª×××ª ×Š×š×× ×××××ª ××ª×××} 
+_textwordends_ [l=iw] {×¡×××××ª ×××××}
+_textstem_ [l=iw] {×××ª×¢×× ××¡××××ª ×××××}
+_textnostem_ [l=iw] {×××× ×©××× ×Š×š××× ×××ª×××}
+_textprefop_ [l=iw] { ×§××©××š×× _maxdocoption_ ××××š ×¢× }
+_hitsperpageoption_ [l=iw] {×§××©××š×× ××¢××× }
+
+
+_textextlink_ [l=iw] { ××××Š×× ××× Web ×××©× ×××€×× }
+_textintlink_ [l=iw] {××§××š××ª ×××€×¡×× ×××××š× ×  }
+_textlanguage_ [l=iw] {:×©×€×ª ×××©×§}
+_textencoding_ [l=iw] {:×§××××}
+_textformat_ [l=iw] {:×€××š×× ××××©×§}
+_textall_ [l=iw] {×××}
+_textquerymode_ [l=iw] {×¡×× ××©××××ª×}   
+_textsimplemode_ [l=iw] {×¡×× ×€×©×× ×©× ××©××××ª×}
+_textadvancedmode_ [l=iw] {×¡×× ××ª×§×× ×©× ××©××××ª× ×××©×š ×©××××© ××××€××© ××××× × ×¢× ×©××××© ×- !,&,| ××¡×××š×××}
+_textlinkinterm_ [l=iw] {××š× ××£ ×××ª×××}
+_textlinkdirect_ [l=iw] {×¢×××š ××©×š ××©×}
+_textdigitlib_ [l=iw] {×¡×€×š××× ××××××××ª}
+_textweb_ [l=iw] {××š×©×ª}
+_textgraphical_ [l=iw] {××š×€×}
+_texttextual_ [l=iw] {×××××}
+_textcollectionoption_ [l=iw] {<p>
+×ª×ª ××××¡×€××  ××××<br>}
+_textrelateddocdisplay_ [l=iw] {××Š× ××€×¡×× ×§×©××š××}
+_texthloption_ [l=iw] {×××××× ×××©×× ×××€××© ××ª×× ×××§×¡×}
+_textsearchhistory_ [l=iw] {:××¡×××š×××ª ×××€××©}
+_texthistorydisplay_ [l=iw] {×××Š×× ××¡×××š×××ª ×××€××©}
+_historynumrecords_ [l=iw] {××Š× ×š×©××××ª ×××€××©}
+_textnohistorydisplay_ [l=iw] {×× ×××Š×× ××¡×××š×××ª ×××€××©}  
+
+_texttypesearch_ [l=iw] {:×¡×× ×××€××©}
+_texttextsearch_ [l=iw] {×××€××© ×××§×¡×}
+_textformsearch_ [l=iw] {×××€××©  ×Š××š××ª}
+_textqueryboxsize_ [l=iw] {×××× ×ª××š ××©××××ª××ª} 
+_textregbox_ [l=iw] {×ª××š ×š××× ×©× ××©××××ª××ª}  
+_textbigbox_ [l=iw] {×ª××š ××š×× ×©× ××©××××ª××ª}
+_textformtype_ [l=iw] {×¡×× ××××××}
+_textsimple_ [l=iw] {×€×©××}
+_textadvanced_ [l=iw] {××ª×§××}
+
+# used in "with 4 fields" in the form search box
+_textwith_ [l=iw] {×¢×}
+_textfields_ [l=iw] {×©×××ª}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## " ×ª×××€×××¢ " ## green_title ## h_pref ##
+_httpiconhpref_ [l=iw] {_httpimg_/iw/h\_pref.gif}
+_widthhpref_ [l=iw] {200}
+_heighthpref_ [l=iw] {57}
+
+
+#####################################################################
+# 'browse' package for the dynamic browsing interface
+package browse
+#####################################################################
+
+_textbrowseby_ [l=iw] {××€××£ ××××Š×¢××ª}
+_textthenby_ [l=iw] {×××š ×× ××××Š×¢××ª}
+_textshowing_ [l=iw] {××Š××}
+_textdocsperpage_ [l=iw] {××€×¡×× ××£ ×××š× ××£}
+
+_textfilterby_ [l=iw] {××€××£ ×š×§ ××ª ×××¡×××× ×××××××}
+_textall_ [l=iw] {××ª ×××}
+_textany_ [l=iw] {×××§}
+_textwords_ [l=iw] {××××××}
+
+_browsebuttontext_ [l=iw] {××€××£}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=iw] {×¢××š×}
+_textSearchshort_ [l=iw] {×××€××© ××××× ××¡×××××ª}
+_textSeriesshort_ [l=iw] {××© ×××Š××š××ª ××€× ×¡××š××ª}
+_textDateshort_ [l=iw] {××© ×××Š××š××ª ××€× ×ª××š××}
+_textSubjectshort_ [l=iw] {××© ×××Š××š××ª ××€× × ××©×}
+_textToshort_ [l=iw] {××© ×××Š××š××ª ××€× ×©×× "××¢×"}
+_textFromshort_ [l=iw] {××© ×××Š××š××ª ××€× ×©×× "××§××š"} 
+_textTitleshort_ [l=iw] {××© ×××Š××š××ª ××€× ×××ª×š×ª} 
+_textBrowseshort_ [l=iw] {××Š××š××ª ×××× ××¡}
+_textCreatorshort_ [l=iw] {××© ×××Š××š××ª ××€× ××××š} 
+_textOrganizationshort_ [l=iw] {××© ×××Š××š××ª ××€× ×××š×××} 
+_textHowtoshort_ [l=iw] {××© ×××Š××š××ª ××€× ×š×©×××}
+_textTopicshort_ [l=iw] {××© ×××Š××š××ª ××€× × ××©×} 
+_textPeopleshort_ [l=iw] {××© ×××Š××š××ª ××€× ×× ×©××}
+_textLanguageshort_ [l=iw] {××© ×××Š××š××ª ××€× ×©×€×} 
+_textAcronymshort_ [l=iw] {××© ×××Š××š××ª ××€× ×š××©× ×ª××××ª}
+_textPhraseshort_ [l=iw] {××× ×¡ ×××××× ×××€××¢×× ×××Š××š××ª}
+_textdefaultshorttext_ [l=iw] {××××× ×× ×××××š}
+
+_textSearchlong_ [l=iw] {<p> ×©××¢×××. <i> "×××€××©" </I> ××ª× ×××× ×××€×©  ×××××  ××¡××××××ª ×××§×¡××× ×××××Š× ×¢× ××€×ª××š 
+  ×× ×××£ ××š××©××  ××©×š ×¢×××  ×××©×š ××ª× ××ª×××  ×××€×©×š ×××××š ××××  ×××××Š×ª ××€×ª××š}
+ 
+_textTitlelong_ [l=iw] { <p>  <i> ×××ª×š××ª </i> ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×××ª×š××ª ×××××Š×  ×¢× ××€×ª××š
+×× ××¢×× ××ª ×š×©×××ª ×××Š××š××ª ××€× ×-× ×©× ×××ª×š××ª 
+}
+_textOrganizationlong_ [l=iw] { <p> < i>×××š××× ××</i>  ××ª× ×××× ×××©×ª ×××Š××š××ª ××€×  ×××š××× ×× ×××××Š×  ×¢× ××€×ª××š
+ ×× ××¢×× ××ª ×š×©×××ª ×××Š××š××ª ××€× ×××š××× ××} 
+
+
+_textHowtolong_ [l=iw] { <p><I> ×××Š× </i>××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×¡××š ×××Š× ×××××Š×  ×¢×  ××€×ª××š 
+<I> ×××Š×</i>  ×× ××¢×× ××ª ×š×©×××ª ×××Š××š××ª ××€× ×¡××š 
+}
+_textCreatorlong_ [l=iw] { <p> <I> ××××š××  ×-×ª  </i>   ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ××××š×× ×××××Š×  ×¢× ××€×ª××š
+×× ××¢×× ××ª ×š×©×××ª ×××Š××š××ª ×××××× ××ª ××€× ×-× ×©× ×©×××ª ××©×€×× ×©× ××××š××}
+
+_textTopiclong_ [l=iw] { <p>  <i> ×¡××××š×× ×××××××  </I> ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×¡××××š×× ××××××× ×××××Š× ×¢× ××€×ª××š
+ ×× ××¢×× ××ª ×š×©×××ª ××¡××××š×× ×××€×××£
+}
+_textSubjectlong_ [l=iw] { <p>  <i> × ××©××× </I>  ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× × ××©××× ×××××Š×  ×¢× ××€×ª××š ×× ××¢×× ××ª ×š×©×××ª ×× ××©×××, ××××Š××× ×¢"× ×××€× ×¡×€×š××
+}
+
+_textTolong_ [l=iw] { <p>  <i> ××× </I>  ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×©×× ××× ×××××Š×  ×¢× ××€×ª××š
+  ×× ××¢×× ××ª ×š×©×××ª  ××××ª×š××ª    
+}
+
+_textFromlong_ [l=iw] { <p>  <i> ××¢× </I>  ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ××¢× ×× ×××××Š×  ×¢× ××€×ª××š
+×× ××¢×× ××ª ×š×©×××ª ××©××××× 
+}
+
+_textSerieslong_ [l=iw] { <p>  <i> ×¡××š××ª </I> ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×¡××š××ª ×××××Š×  ×¢× ××€×ª××š 
+  ×× ××¢×× ××ª ×š×©×××ª ××¡××š××ª ×©××© ××××¡×£
+}
+ 
+_textDatelong_ [l=iw] { <p>  <i> ×ª××š×× </I>××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×ª××š×× ×××××Š×  ×¢× ××€×ª××š 
+×× ××¢×× ××ª ×š×©×××ª ×××Š××š××ª ××¡×××š××ª ××××€× ××š×× ××××× }
+
+_textBrowselong_ [l=iw] { <p> <i>××€××£</I> ××ª× ×××× ×××€××£ ×××Š××š××ª ×××××Š×  ×¢× ××€×ª××š  } 
+
+
+_textPeoplelong_ [l=iw] { <p>  <i> ×× ×©×× </I> ××ª× ×××× ×××©×ª ×××Š××š××ª ××€×  ×× ×©×× ×××××Š×  ×¢× ××€×ª××š 
+ ×× ××¢×× ××ª ×š×©×××ª ××× ××¡××ª ××€× ×©×××ª ××©×€××
+}
+_textLanguagelong_ [l=iw] { <p>  <i> ×©×€× </I> ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×©×€××ª ×××××Š×  ×¢× ××€×ª××š 
+ ×× ××¢×× ××ª ×š×©×××ª ××× ××¡××ª ××¡×××š××ª ××€× ×©×€××ª
+}
+_textAcronymlong_ [l=iw] { <p>  <i> ×š××©× ×ª××××ª </I>  ××ª× ×××× ×××©×ª ×××Š××š××ª ××€× ×š××©× ×ª××××ª ×××××Š×  ×¢× ××€×ª××š  
+ ×× ××¢×× ××ª ×š××©× ×ª××××ª ×××§×× ××××Š××
+}
+
+_textPhraselong_ [l=iw] { <p>  <i>××××××</I>  ××ª× ×××× ×××©×ª ××××××× ××¡××××× ××©×š ×××€×¢×× ×××Š××š××ª ×××××Š×  ×¢× ××€×ª××š </I> 
+   ×× ××¢×× ××€××€× ×©× ×××××× } 
+
+
+_textdefaultlongtext_ [l=iw] { <p> ××× ××š×××ª ××Š××š××ª ×¢× ×€×š××× ××¡×š×× ×× ×× ××××¢×× <i> ×× ××××¢</I>  ×××¥ ×¢× ××€×ª××š  
+  (××Š××ª ××××× ××€× ×©×××ª ×× ××××¢××)
+}
+
+_texthelptopics_ [l=iw] {
+<h2 align=left>× ××©×××</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">××× ×××Š×× ××××× ××¡××××××ª</a>
+<ul>
+  <li><a href="\#query-terms">××× ×× ×××€××©</a>
+<li><a href="\#query-type">×¡×× ×©××××ª×</a>
+  <li><a href="\#scope-of-queries">×§×××Š×ª ×©××××ª××ª</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">×¢×××€××××ª ×©× ×××¡×£</a>
+<li><a href="\#lang-prefs"> ×¢×××€××××ª ×©× ×©×€×</a>
+<li><a href="\#pres-prefs"> ×¢×××€××××ª ×©× ×ª×Š××× </a>
+<li><a href="\#search-prefs"> ×¢×××€××××ª ×©× ×××€××©</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+#  which version is used is currently set within the server
+# it should probably use the macro language e.g. )[type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+
+
+
+_topicreadingdocs_ [l=iw] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=iw] {××× ××§×š×× ××¡××××}
+_booktextreadingdocs_ [l=iw] {××× ××§×š×× ×¡×€×š××}
+_bibtextreadingdocs_ [l=iw] {××§×× ×¢×× ××××¢ ×¢× ×€×š×× ×××××××××š×€×}
+
+_texthelpreadingdocs_ [l=iw] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+
+<p>××€×©×š ×××¢×ª ×× ×××¢×ª ×××¡×× ×××× ××××× ×©××××ª×š×ª ××××××š
+×××€××¢×× ××€×× × ×©×××××ª ×¢×××× × ×©× ××¢×××. ×××¥ ××× ××© ××ª ××¡×€×š  ××¢×××
+×× ××××, ×ª××× ××××€×©×š×ª ××××š×ª ×¢××× ×××© ×××Š×× ×§×××× ×××××š×
+
+<p> ××ª××ª ××© ××ª ×××§×¡× ×©× ××§××¢ ×× ××××. ××××š ×©×§×š××ª ×××ª×
+××ª××ª××ª ××¢××× ××©× × ××€×ª××š×× ×©××§×× ×××ª× ××¢××× ××× ×× ××¢××× ××§×××
+
+<p>××ª××ª ××××ª×š×ª ××××××š ××©× × ×©×××©× ××€×ª××š××. ×××¥ ×¢×
+ ××× ××€×ª×× ××ª ×× ×××§×¡× ×©×××¡××.<i> ××š×× ××§×¡× </i> 
+×× ×××¡×× ××××, ××××š ×××× ××§××ª ××š×× ××× ×××××š××!
+××× ××€×ª×× ×××× ×××© ×¢× ×××¡××..<i>××€×š×  </i> ×××¥ ×¢× 
+××××š ×©××××©× ×××©××××ª ××¡×××× ×× ×§×š××× ×©× ××× ×××§×××
+<i> ××× ××××©× </i> ×× ××¡×£ ×××××ª ××××€××© ×××××©××ª. ×××¥ ×¢×
+××× ×××€×¡××§ ××ª ×××××©×
+<p>
+
+
+
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>×××¥ ×¢× ×××¥ ××¢×××š ××××§ ××× ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ×× ×××××š ××××§ ××§×××</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>××Š×/×× ×ª×Š×× ××ª ×××§×¡× ××××</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>×€×ª× ×¢××× ×× ××××× ×××©</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>××× ×× ×××€××© ×××××©××/×× ×××××©××</td></tr>
+</table>
+}
+
+
+_booktexthelpreadingdocs_ [l=iw] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p> ××€×©×š ×××¢×ª ×× ×××¢×ª ××¡×€×š × ×€×š× ×× ××© ×Š×××× ×©× ×××š×××
+××€×× × ×©×××××ª ×¢×××× × ×©× ××¢×××. ×××¥ ××××š××× ××©× × ×ª××× ×¢× ××× ×× 
+×¢× ××¥ ×××¡×× ××ª ××§××× ×× ××××. ×ª××× ××¢× ××× ×× × ××ª× ×××š×××:
+×××¥ ×¢× ××ª××§×××ª ××€×ª×× ×× ××¡×××š ×××ª×. ×××¥ ×¢× ××¡×€×š ××€×ª××  ×¢× ×× ×ª ××¡×××š ×××ª×
+
+
+<p> ××ª××ª ××© ××ª ×××§×¡× ×©× ××§××¢ ×× ××××. ××××š ×©×§×š××ª ×××ª×
+××ª××ª××ª ××¢××× ××©× × ××Š×× ×©××§×× ×××ª× ××¢××× ××× ×× ××¢××× ××§×××
+
+
+
+<p>××ª××ª ××ª××× × ××©× × ××š××¢× ××€×ª××š××. ×××¥ ×¢×
+ ××× ××€×ª×× ××ª ×× ×××§×¡× ×©××© ××¡×€×š ×× ××€×š×§..<i> ××š×× ××§×¡× </i> 
+×× ××¡×€×š ××××, ××××š ×××× ××§××ª ××š×× ××× ×××××š××!
+ ××× ××€×ª×× ××ª ×ª××× ××¢× ××× ×× ××××××.<i> ××š×× ×ª××× ×¢× ××× ×× </i> ×××¥ ×¢×
+.××× ××€×ª×× ×××× ×××© ×¢× ××¡×€×š<i>××€×š×  </i> ×××¥ ×¢× 
+,××××š ×©××××©× ×××©××××ª ×¡×€×š×× ×× ×§×š××× ×©× ××× ×××§×××
+<i> ×× ××××××© </i> ×× ××¡×£ ×××××ª ××××€××© ×××××©××ª. ×××¥ ×¢×
+××× ×××€×¡××§ ××ª ×××××©×
+<p>
+
+
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>×€×ª× ××ª ×××£ ××¡×€×š××</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>×€×ª×/×¡×××š ××ª ××¡×€×š</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>×š×× ××ª ××§××¢ ××× ×©× ×××§×¡×</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>××Š×/×× ×ª×Š×× ××ª ×××§×¡× ××××</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>××š××/×Š××Š× ×ª××× ××¢×× ××× ××</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>×€×ª× ×¢××× ×× ××××× ×××©</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>××× ×× ×××€××© ×××××©××/×× ×××××©××</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>×××¥ ×¢× ×××¥ ××¢×××š ××××§ ×××</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>×× ×××××š ××××§ ××§×××</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=iw] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+
+<p>××©× × ×€×š×××× ××××××× ××××¢ × ××¡×£ (×××¡××š×§××)
+××€×©×š ××š×××ª ×××ª ×××¢××× ××ª×©××× ××©××××ª× ×××××× 
+_iconblanktext_ ×¡×× ×××§××  _icontext_ ×¡××     ×©×× ×××Š××× ×¢×
+
+
+<p>×ª×ª× ×××ª×š ××××¢ ×¢× ××€×š×× _icontext_ ××××Š× ×¢× ×¡××
+
+
+<p>××ª××ª ××€×š×× ××××××š ××©× × ×©× × ××€×ª××š××. ×××¥ ×¢×
+.××× ××€×ª×× ×××× ×××© ×¢× ××€×š××.<i>××€×š× </i> 
+××××š ×©××××©× ×××©××××ª ×€×š×××× ×× ×§×š××× ×©× ××× ×××§×××,
+<i> ×× ××××××© </i> ×× ××¡×£ ×××××ª ××××€××© ×××××©××ª. ×××¥ ×¢×
+××× ×××€×¡××§ ××ª ×××××©×
+<p>
+
+
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>×€×ª× ×¢××× ×× ××××× ×××©</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>××× ×× ×××€××© ×××××©××/×× ×××××©××</td></tr>
+</table>
+}
+
+
+_texthelpsearching_ [l=iw] {
+<h2> ××× ×××Š×× ××××× ××¡××××××ª </h2>
+<p>
+ :××¢××× ××©××××ª× , ×××××š×× ××ª ××©××××ª× ×××¡×€×š ×Š×¢××× ×€×©××××<p>
+  
+<ol><li>××××š ×××× ×¡××× ×€×š×××× ××© ×××€×©
+<li>×¡×× ×× ××ª× ×š××Š× ×××€×© ××ª ×× ×××××× ×× ×š×§ ×××§ ×××
+      <li>××§×× ××ª ×××××ª ××××€××©
+      <li> <i> ××ª×× ×××€××© </i> ×××¥ ×¢× ××€×ª××š
+</ol>
+
+
+<p>××©××ª× ××€×¢×× ××ª ××©××××ª× , ××××ª×š××ª ×©× ×¢×©×š×× ××€×š×××× ××ª××××× ×××Š××.
+××©× ×××× 2 ××€×ª××š×× ×××× ××¢×©×š×× ××€×š×××× ××××× ×××©× × ××¢×©×š×× ××€×š×××× ××§××××× ××¡××£ ××¢××× ××©× × ××€×ª××š ×©××§× ×××ª× ××¢×©×š×× ××€×š×××× ×××××
+
+
+<p>×××§×¡×××× ×©× ×€×š×××× ×©×××××š× ××× 100
+<i> ×¢×××€××××ª</i> ××€×©×š ××©× ××ª ××ª ×××¡×€×š ×¢"× ××××Š× ×¢× ××€×ª××š
+××ª××××ª  ××¢×××<p>
+
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Search terms</h3>
+
+
+<p>×× ×©×××× ×¡ ×××§×¡× ××©××××ª× ×××¢×× ××š×©××× ×©× ××××× 
+×× ×§×š×××ª "××× ×× ×××€××©". ×× ××× × ×××× ×š×§ ×××ª×××ª ×××¡×€×š××. 
+×××× ××× ×××€×š××× ×¢"× ×š×××. ×× ×¡××× × ×€××¡××§ ×××€××¢××ª ××ª×× ××××××, ××
+××©××©××ª ××š×××, ×××××š ××× ××ª×¢×××× ×××. ×× ××€×©×š ×××€×© ××××× 
+×××××××ª ×¡××× × ×××€××© 
+
+
+<p>×××××× ××©××××ª×<p>
+<ul><kbd>××§××××ª ×××× ××××§×× ××¡ ××©×§×: ××¢×š×××ª × ×ª××××ª (1993)</kbd></ul>
+<p>×ª×¢××× ×××××§ ×××<p>
+<ul><kbd> ××§××××ª ×××× ××××§×× ××¡ ××©×§× ××¢×š×××ª × ×ª××××ª 1993</kbd></ul><p>
+
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Query type</h3>
+
+
+<p>××©× × ×©× × ×¡××× ×©××××ª××ª
+
+
+
+<ul>
+  <li> ××××××. ××©××××ª××ª <b> ××</b> ×©××××ª××ª ×¢×××š
+	×××× ×××€×©××ª ×××š ××€×š×××× ××××××× ××ª ×× ××××××
+	××€×š×××× ×××Š××× ××¡××š ×"×
+<p>
+
+<li> ×××××××. ××©××××ª××ª <b> ×××§</b> ×©××××ª××ª ×¢×××š
+	×××× ×××€×©××ª ×××š ××€×š×××× ××××××× ××ª ×× ××××××
+	××€×š×××× ×××Š××× ××¡××š ×××ª××× ××©××××ª×
+      <p><ul>
+<li> ×€×š×××× ××××××× ×××ª×š ××× ×× ×××€××© ×× ×××ª××××× ×××ª×š 
+<li> ××× ××× × ×××š×× ××©×××× ×××ª×§ ×××©×š ×š××××× 
+<li> ××¡×××× ×§×Š×š×× ××ª××××× ×××ª×š ×××©×š ××š××××
+</ul>
+</ul>
+
+<p>××©×ª××© ×××× ××× ×× ×××€××© ×©× ×× ××- ××©×€× ×× ××€××× ×€××¡×§×
+×× ×××× ×š×§ ××× × ×××€××© ××××, ×××¡×××× ××¡×××š× ××€× ××¡×€×š ××××€×¢×× ×©× ××× × ××××€××©
+<p>
+_texthelpscope_
+}
+
+
+_textdatesearch_ [l=iw] {×××€××© ×¢× ×ª××š××××}
+
+
+_texthelpdatesearch_ [l=iw] {<h2>_textdatesearch_</h2>
+×××€××© ×¢× ×ª××š×××× × ××ª× ××€×©×š××ª ××§×× ×€×š×××× ××©×š ×××¥ ××× ×©××ª×××××
+×××× ×× ×××€××© ×× ××©×ª××××× ×××× ××¡××××. ××€×©×š ×××€×© ××€× ×©× × ××¡×××××ª ×× ×š×Š×£ ×©× ×©× ××
+××€×©×š ×××ª×©××© ××××€××© ××€× ×ª××š×× ×× ××× ××× ×× ×××€××©: ××€×š×××× ×©×××××š× ××©×ª×××× ××š×Š×£ ×××× ××××××š
+×× ××©×ª××©×× ××××€××© ×š××× ××× ×××€××© ××€× ×ª××š×× ××€×š×××× ×©×××××š× ×××××š× ××× ×ª×××ª ××ª××š××
+<p>
+
+
+<p>_iconblankbar_
+<a name=datesearch-howto>
+<h3>××× ×××©×ª××© ××××€××©</h3>
+<ul>
+<p><li>×××€×© ×××š ××¡×× ××©× × ××¡×××××ª
+<ul>
+<li>××× ×¡ ××× ×× ×××€××© ××š×××     
+<li>××× ×¡ ×©× × ×š×Š×××× × ×××× "××ª×××"
+<li>×× ××©× × ××× ××€× ×"×¡ , ×¡×× ××€× ×"×¡ ××š×©×××ª ×××××× 
+<li>××ª×× ××××€××© ××š×××
+</ul>
+<p><li>:×××€×© ××¡×× ××©× ××<p>
+   <ul>
+       <li> ××× ×¡ ××× ×× ×××€××© ××š×××
+<li> "××× ×¡ ×©× ×ª ××ª××× ×š×Š×××× × ×××× "××ª×××
+<li> ××× ×¡ ×©× ×ª ×¡××× ×š×Š×××× × ×××× "×¡××£"
+<li> ×× ××©× × ××× ××€× ×"×¡ , ×¡×× ××€× ×"×¡ ××š×©×××ª ××××××
+<li> ××ª×× ××××€××© ××š××× 
+</ul>    
+</ul><p>
+
+<p>_iconblankbar_
+<a name=datesearch-results>
+<h3>××š× ×©×× ××××€××© ×€××¢×</h3>
+
+<p> ×××€×©×× ××¡×××× ×©× ××ª×× × - 1903, ××š×× × ×§×× ××¡×××× ×¢× ××©× × ××× ××× ××©×š × ××ª×× ××©× × ×× "×
+}
+_textchangeprefs_ [l=iw] {×©×× ×× ×¢×××€××××ª}
+
+_texthelppreferences_ [l=iw] {<h2>_textchangeprefs_</h2>
+
+
+<p>×× ×ª×××¥ ×¢× ××€×ª××š "×¢×××€××××ª" ××ª××××ª ×××£ , ×ª××× ×× ××€×©×š××ª ××©× ××ª
+××ª ×€×¢××××ª ×× ××××©×§ ×× ×©××ª××× ××Š×š×××
+
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>×¢×××€××××ª ××××¡×£</h3>
+
+
+××©× × ×××¡×€×× ××××š×××× ×××× ×ª×ª-×××¡×€×× , ××©×š × ××ª× ×× ××¢××× ×××××€××© 
+×× ×€×š× ×× ××××, ×××××× ×××ª. ×× ×× ××××š , ××¢××× ××¢×××€××××ª × ××ª×
+ ××¡×× ×××× ×××ª×ª-×××¡×€×× ××© ×××××× ××××€××©
+
+
+<p>_iconblankbar_
+<a name=lang-prefs>
+<h3 align=left>×©×€× ×¢×××€××××ª </h3>
+
+×× ×××¡×£ × ×× × ×¢×××š ×©×€× ××¡×××××ª , ×× × ××ª× ××©× ××ª ×××ª
+××× ×× ××€×©×š ××©× ××ª ××× ×××Š×× ××š×€× ××××Š×× ××§×¡× ××š×××
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left> ×¢×××€××××ª ×ª×Š×××</h3>
+
+×××ª×× ××××¡×£ ×× ×ª×× ××©× × ××× ××š××× ××©× ××ª ××ª ×ª×Š×××ª×
+
+
+
+<p>  Greenstone×××¡×€×× ×©× ××€× ×š×©×ª ×××€×©×š×× ×× ×××× ××ª ××€×ª××š× ×× ×××× ×©×    
+××ª××××ª ××¢××× , ××  ×©××××š ××©××××ª× ××ª× ×ª×××¢ ××©××š××ª ××¢××× ××š×©×ª ×©×××ª× ×××€×©×ª ××× ××€×ª××š× ××××€××©. ×××× ×××Š×¢ 
+×××€××© ×××© ××© ×××©××© ×××€×ª××š "××××š×" . ××××¡×€×× ×× ×××€×©×š×× ×× ×××× ××ª ×××××š×  ×××××š ××××Š× ×¢× ×××××š ××××Š× ×××××¡×£ ××š×©×ª ×¢×Š××.
+××× ×× ×××× ×××¡×€×× ××€×©×š ××©××× ××× ××××××š×× ×××××× ×××€× ××š×©×ª ××š×©×ª ×× ××¢××ª×§×× ×©××× ×©× ××Š××× ××¡×€×š××
+
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>×¢×××€××××ª ×××€××© </h3>
+
+
+<p>×©× × ×××××ª ××€×ª××š×× ×©××××× ×¢× ×¢×××€××××ª ××××€××©:
+×××× ××š××©×× ××× × ×š×××× ×× ××©×€× ××¢××š××ª ( ×××ª×××ª ××××××ª ××§×× ××ª)
+×××× ××©× × ×©××× ××× ×¡×××××ª ×××××× ×××××× ××××€××©.
+ ××× ×× ××© ××€×©×š××ª ××§×× ×©×× ××× × ×××× ×××ª×š. ×××€××© ×¢× ××š××
+ ××× ××× ××× ×××€××© ××××š ××××
+
+
+<p>×××××× ×× ××€×ª××š "××ª×¢×× ××¡×××××ª ××××××" ×××× ××××§ ××××€××©
+<ul><kbd>××× ×× ××€×š××§×××× </kbd></ul>
+      <p>××ª×§×× ×××
+     <ul><kbd>××× × ××€×š××§×</kbd></ul><p>
+
+<p>××€×©×š ×××€×¢×× ×××€××© ××ª×§×× ×©× ××ª× ×××€×¢××××× ××× ×××××× ××× ×××
+××× & , ×× | , ××× !.
+××š××š×ª ×××××  ( ×š××× ) ××× ×××
+××××š ×××€×©×š ×××€××© ××××××§ ×××ª×š
+××€×©×š ×××€×¢×× ××ª ×××€×Š×××ª ×××××š××: ××××š ×××€×©×š ×××€×¢×× ×××€××©×× ×××©××
+×× ××š×¡×××ª ×©×× ××ª ×××§×Š×ª ×©× ×××€××©×× ×§×××××
+}
+
+
+_texttanumbrowseoptions_ [l=iw] {××š××× ×××Š×× ××ª ×××××¢ ××××¡×£ ×× "×  _numbrowseoptions_ ××©
+}
+
+_textsimplehelpheading_ [l=iw] {××× ×××Š×× ××××¢}
+
+_texthelpscope_ [l=iw] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>×¡×××š×ª ×©××××ª××ª</h3>
+
+
+<p>
+××š×× ××××¡×€×× × ××ª× ×××××š ××× ××¡×€×š ××× ××§×¡×× ××××€××©. ×××××× ×××× ×××××ª ××× ××§×¡ ×©× ××××š××
+ ×× ×××ª×š××ª, ×× ×××× ×××××ª ××× ××§×¡ ×©× ×€×š×§××, ×× ×©× ×€×¡×§×××ª. ×××××ª, ×××××š× ×××¡×××× ××××××
+××× ×ª×××ª ×××š× ××××€××©. ×× ×××¡×× ××× ×¡×€×š, ××× ×××€×ª× ×××§×× ××ª××
+<p>   
+}
+
+
+
Index: /main/tags/2.38/gsdl/macros/help.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/help.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/help.dm	(revision 21083)
@@ -0,0 +1,31 @@
+package help
+
+_imagethispage_ {_iconthispage_}
+_iconthispage_ {<img src="_httpiconhhelp_" alt="_textHelp_" width=_widthhhelp_ height=_heighthhelp_>}
+
+# don't want collection icon on help page as much of the text is not collection specific
+_imagecollection_ {}
+
+_textnumbrowseoptions_ {_If_("_numbrowseoptions_" != "1",<p>_texttanumbrowseoptions_)}
+
+_simplehelp_ {
+_textnumbrowseoptions_
+_textbrowseoptions_
+}
+
+_content_ {
+<center>_navigationbar_</center>
+_texthelptopics_
+<p>_iconblankbar_
+<a name=finding-information>
+<h2>_textsimplehelpheading_</h2>
+_simplehelp_
+_texthelpreadingdocs_
+<p>_iconblankbar_
+<a name=searching>
+_texthelpsearching_
+<p>_iconblankbar_
+<a name=preferences>
+_texthelppreferences_
+<p>_iconblankbar_
+}
Index: /main/tags/2.38/gsdl/macros/home.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/home.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/home.dm	(revision 21083)
@@ -0,0 +1,187 @@
+package home
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. this is overridden here as we don't want 'home' 
+# links on this page
+
+_javalinks_ {_imagehelp__imagepref_}
+_javalinks_ [v=1] {_imagehelp_<br>_imagepref_}
+
+#######################################################################
+# icons
+#######################################################################
+
+_iconselectcollection_ {<img align=texttop src="_httpiconselcolgr_" width=_widthselcolgr_ height=_heightselcolgr_ alt=_altselcolgr_>}
+_iconmusiclibrary_ {<img align=texttop src="_httpicontmusic_" border=1 alt="meldex music library">}
+
+_imagecollection_ {<img src="_httpimg_/gsdlhead.gif">}
+
+#######################################################################
+# http macros 
+#
+# These contain the url without any quotes
+#######################################################################
+
+_httppagegsdl_ {_httppagex_(gsdl)}
+_httppagehomehelp_ {_httppagex_(homehelp)}
+_httppagehomepref_ {_httppagex_(homepref)}
+
+#######################################################################
+# images
+#######################################################################
+
+
+_imagecollector_ {_gsimage_(_httppagecollector_,_httpimg_/ccolof.gif,_httpimg_/ccolon.gif,col,_collector:textcollector_)}
+_imageadmin_ {_gsimage_(_httppagestatus_,_httpimg_/cadminof.gif,_httpimg_/cadminon.gif,admin,_home:textadmin_)}
+_imagegogreenstone_ {_gsimage_(_home:httppagegsdl_,_httpimg_/cabgsof.gif,_httpimg_/cabgson.gif,gogs,_home:textabgs_)}
+_imagegodocs_ {_gsimage_(_home:httppagedocs_,_httpimg_/cgsdocof.gif,_httpimg_/cgsdocon.gif,docs,_home:textgsdocs_)}
+_imagehelp_ {_gsimage_(_home:httppagehomehelp_,_httpiconchelpof_,_httpiconchelpon_,help,_textimagehelp_)}
+_imagepref_ {_gsimage_(_home:httppagehomepref_,_httpiconcprefof_,_httpiconcprefon_,pref,_textimagepref_)}
+
+#######################################################################
+# page content                     
+#######################################################################
+
+_content_ {
+<center>
+<p>_iconselectcollection_
+</center>
+<p>_homeextra_
+
+<center>
+<p>_iconblankbar_
+</center>
+<p><table>
+_textgocollector_
+_textgoadmin_
+_textgogreenstone_
+_textgodocs_
+</table>
+<center>
+<p>_iconblankbar_
+</center>
+_textaboutgreenstone_
+<center>
+<p>_iconblankbar_
+</center>
+}
+
+# the _textgocollector_ and _textgoadmin_ macros may be overridden
+# to be empty from within the receptionist if the collector or admin
+# facilities are disabled
+_textgocollector_ {
+<tr valign=top>
+<td valign=top>_imagecollector_</td>
+<td>_textimagecollector_</td>
+</tr>
+}
+
+_textgoadmin_ {
+<tr valign=top>
+<td valign=top>_imageadmin_</td>
+<td>_textimageadmin_</td>
+</tr>
+}
+
+_textgogreenstone_ {
+<tr valign=top>
+<td valign=top>_imagegogreenstone_</td>
+<td>_textimagegogreenstone_</td>
+</tr>
+}
+
+_textgodocs_ {
+<tr valign=top>
+<td valign=top>_imagegodocs_</td>
+<td>_textimagegodocs_</td>
+</tr>
+}
+
+package homehelp
+
+_imagecollection_ {<a href="_httppagehome_"><img src="_httpimg_/gsdlhead.gif" border="0"></a>}
+
+_collectionlist_ {}
+
+_javalinks_ {_imagehome_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+}
+
+_content_ {
+<center>
+<p>_iconblankbar_
+</center>
+<p>
+<table border=0 cellspacing=0 cellpadding=0>
+ <tr>
+  <td valign=top align=center>_imagegreenstone_</td>
+  <td valign=top>_gsdl:textgreenstone1_
+  <br><br>
+  </td>
+ </tr>
+</table>
+
+<center>
+<p>_iconblankbar_
+</center>
+_If_(_collectionlist_,_collectionlist_,_textnocollections_)
+
+<center>
+<p>_iconblankbar_
+</center>
+<p>_text4buts_
+<p><table>
+_home:textgocollector_
+_home:textgoadmin_
+_home:textgogreenstone_
+_home:textgodocs_
+</table>
+<center>
+<p>_iconblankbar_
+</center>
+}
+
+
+package homepref
+
+_imagecollection_ {<a href="_httppagehome_"><img src="_httpimg_/gsdlhead.gif" border="0"></a>}
+
+_javalinks_ {_homepref:imagehome_}
+_javalinks_ [v=1] {
+_homepref:imagehome_<br>
+}
+
+_pagescriptextra_ {_preferences:pagescriptextra_}
+
+
+_imagehome_ {_gsimage_(_homepref:httppagehome_,_httpiconchomeof_,_httpiconchomeon_,homer,_textimagehome_)}
+_httppagehome_ {_httppagex_(home)}
+
+_content_ {
+<center>
+<p>_iconblankbar_
+</center>
+
+<form name=PrefForm method=get action="_gwcgi_">
+<h3>_preferences:textpresentationprefs_</h3>
+
+<table border="0">
+<tr valign="top">
+<td>_preferences:textlanguage_</td>
+<td><select name="l" onChange="updatel();">
+<option value="en" _If_("_cgiargl_" eq "en", selected)>English
+<option value="fr" _If_("_cgiargl_" eq "fr", selected)>French
+</select>
+</td>
+</tr>
+<tr valign="top">
+_preferences:formatoption_
+</tr>
+</table>
+<p>_iconblankbar_
+}
Index: /main/tags/2.38/gsdl/macros/html.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/html.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/html.dm	(revision 21083)
@@ -0,0 +1,57 @@
+package html
+
+_header_ {<html>
+<head></head>
+}
+
+_footer_ {</html>}
+
+_pagetitle_ {_collectionname_}
+
+_content_ {
+<frameset rows="68,*" noresize border=0>
+  <frame frameborder=0 src="_gwcgi_?e=_compressedoptions_&a=p&p=nav">
+  <frame frameborder=0 src="_cgiarghp_">
+  <noframes>
+  <p>_textframebrowser_</p>
+  </noframes>
+</frameset>
+}
+
+
+package nav
+
+_header_ {_cgihead_
+_htmlhead_
+<center>
+<table width=_pagewidth_><tr><td align=right>
+_javalinks_</td></tr></table>
+</center>
+}
+
+_faoheader_ [v=1] {_cgihead_
+_htmlhead_
+_javalinks_
+}
+
+_htmlhead_ {
+<html>
+<head>
+<title>_pagetitle_</title>
+<base target="_top">
+_globalscripts_
+</head>
+
+<body bgcolor="\#ffffff" text="\#000000" link="\#006666" 
+      alink="\#cc9900" vlink="\#666633">
+}
+
+_footer_ {</body>
+</html>
+}
+
+_content_ {
+<center>
+_navigationbar_
+</center>
+}
Index: /main/tags/2.38/gsdl/macros/indo.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/indo.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/indo.dm	(revision 21083)
@@ -0,0 +1,1002 @@
+######################################################################
+#
+# English Language text and icon macros 
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ [l=id] {macro value}
+# Everything between the [l=id] {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\[l=id] {' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=id] {Halaman yang diminta tidak dapat ditemukan. Mohon gunakan tombol 'Back' (balik) di browser anda atau tombol Induk di atas untuk kembali ke Perpustakaan Digital Greenstone.}
+
+_textdefaulttitle_ [l=id] {Kesalahan GSDL }
+
+_collectionextra_ [l=id] {Koleksi ini mengandung _about:numdocs_ dokumen. 
+Koleksi terbentuk _about:builddate_ hari yang lalu.}
+
+# this is only used by the collector (where the above _collectionextra_
+# macro will always be set to another value)
+_collectorextra_ [l=id] {
+<p>Koleksi ini mengandung _numdocs_ _If_("_numdocs_" eq "1",dokumen,dokumen), dengan jumlah _numbytes_.
+}
+
+_textimagecollection_ [l=id] {}
+_textimageabout_ [l=id] {Halaman Perihal}
+_textimagehome_ [l=id] {Halaman Induk}
+_textimagehelp_ [l=id] {Halaman Bantuan}
+_textimagepref_ [l=id] {Halaman Preferensi}
+_textimagegreenstone_ [l=id] {Perangkat Lunak Perpustakaan Digital Greenstone}
+
+_textimagesearch_ [l=id] {Mencari istilah tertentu}
+_textimageTitle_ [l=id] {Melihat judul buku menurut abjad}
+_textimageList_ [l=id] {Melihat daftar dokumen}
+_textimageCreator_ [l=id] {Melihat pengarang buku menurut abjad}
+_textimageSeries_ [l=id] {Melihat menurut terbitan}
+_textimageDate_ [l=id] {Melihat menurut tanggal}
+_textimageSubject_ [l=id] {Melihat menurut kategori subyek}
+_textimageTo_ [l=id] {Melihat menurut bidang Kepada}
+_textimageFrom_ [l=id] {Melihat menurut bidang Dari}
+_textimageOrganization_ [l=id] {Melihat menurut organisasi}
+_textimageHowto_ [l=id] {Melihat kategori Bagaimana}
+_textimageTopic_ [l=id] {Melihat terbitan khusus}
+_textimageBrowse_ [l=id] {Melihat}
+_textimagePeople_ [l=id] {Melihat daftar orang menurut abjad}
+_textimageLanguage_ [l=id] {Melihat menurut bahasa}
+_textimageAcronym_ [l=id] {Melihat singkatan lembaga}
+_textimagePhrase_ [l=id] {Melihat ungkapan}
+
+_texticontabsearchgreen_ [l=id] {Mencari}
+_texticontabdategreen_ [l=id] {Tanggal}
+_texticontabseriesgreen_ [l=id] {Berkala}
+_texticontabauthorgreen_ [l=id] {Pengarang A-Z}
+_texticontabtitlegreen_ [l=id] {Judul A-Z}
+_texticontablistgreen_ [l=id] {Daftar}
+_texticontabsubjectgreen_ [l=id] {Subyek}
+_texticontabtogreen_ [l=id] {Kepada}
+_texticontabfromgreen_ [l=id] {Dari}
+_texticontaborggreen_ [l=id] {Organisasi}
+_texticontabhowgreen_ [l=id] {Bagaimana}
+_texticontabtopicgreen_ [l=id] {Topik}
+_texticontabbrwsegreen_ [l=id] {Melihat}
+_texticontabPeoplegreen_ [l=id] {Orang A-Z}
+_texticontabLanguagegreen_ [l=id] {Bahasa}
+_texticontabAcronymgreen_ [l=id] {Singkatan}
+_texticontabPhrasegreen_ [l=id] {Ungkapan}
+
+_texticontext_ [l=id] {Menampilkan dokumen}
+_texticonclosedbook_ [l=id] {Membuka dokumen ini dan melihat isinya}
+_texticonnext_ [l=id] {ke bagian berikut}
+_texticonprev_ [l=id] {ke bagian sebelumnya}
+
+_texticonmidi_ [l=id] {Melihat dokumen MIDI}
+_texticonmsword_ [l=id] {Melihat dokumen Microsoft Word}
+_texticonpdf_ [l=id] {Melihat dokumen PDF}
+_texticonps_ [l=id] {Melihat dokumen PS}
+_texticonppt_ [l=id] {Melihat dokumen PPT}
+_texticonrtf_ [l=id] {Melihat dokumen RTF}
+_texticonxls_ [l=id] {Melihat dokumen XLS}
+
+_page_ [l=id] {halaman }
+_pages_ [l=id] {halaman}
+_of_ [l=id] { dari }
+_vol_ [l=id] {Vol.}
+_num_ [l=id] {No.}
+
+_textmonth00_ [l=id] {}
+_textmonth01_ [l=id] {Januari}
+_textmonth02_ [l=id] {Pebruari}
+_textmonth03_ [l=id] {Maret}
+_textmonth04_ [l=id] {April}
+_textmonth05_ [l=id] {Mei}
+_textmonth06_ [l=id] {Juni}
+_textmonth07_ [l=id] {Juli}
+_textmonth08_ [l=id] {Agustus}
+_textmonth09_ [l=id] {September}
+_textmonth10_ [l=id] {Oktober}
+_textmonth11_ [l=id] {Nopember}
+_textmonth12_ [l=id] {Desember}
+
+_Document_ [l=id] {Dokumen}
+_Section_ [l=id] {Bagian}
+_Paragraph_ [l=id] {Alinea}
+
+_magazines_ [l=id] {Majalah}
+
+_nzdlpagefooter_ [l=id] {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">New Zealand Digital Library Project</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Department of Computer Science</a>, 
+<a href="http://www.waikato.ac.nz">University of Waikato</a>, 
+New Zealand}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "INDUK" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=id] {_httpimg_/id/chomeof.gif}
+_httpiconchomeon_ [l=id] {_httpimg_/id/chomeon.gif}
+
+## "BANTUAN" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=id] {_httpimg_/id/chelpof.gif}
+_httpiconchelpon_ [l=id] {_httpimg_/id/chelpon.gif}
+
+## "PREFERENSI" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=id] {_httpimg_/id/cprefof.gif}
+_httpiconcprefon_ [l=id] {_httpimg_/id/cprefon.gif}
+
+## "bantuan" ## green_title ## h_help ##
+_httpiconhhelp_ [l=id] {_httpimg_/id/h\_help.gif}
+_widthhhelp_ [l=id] {200}
+_heighthhelp_ [l=id] {57}
+
+## "pengarang a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=id] {_httpimg_/id/tauthgr.gif}
+_httpicontauthof_ [l=id] {_httpimg_/id/tauthof.gif}
+_httpicontauthon_ [l=id] {_httpimg_/id/tauthon.gif}
+_widthtauthx_ [l=id] {125}
+
+## "berkala" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=id] {_httpimg_/id/tsergr.gif}
+_httpicontserof_ [l=id] {_httpimg_/id/tserof.gif}
+_httpicontseron_ [l=id] {_httpimg_/id/tseron.gif}
+_widthtserx_ [l=id] {87}
+
+## "tanggal" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=id] {_httpimg_/id/tdategr.gif}
+_httpicontdateof_ [l=id] {_httpimg_/id/tdateof.gif}
+_httpicontdateon_ [l=id] {_httpimg_/id/tdateon.gif}
+_widthtdatex_ [l=id] {87}
+
+## "subyek" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=id] {_httpimg_/id/tsubjgr.gif}
+_httpicontsubjon_ [l=id] {_httpimg_/id/tsubjon.gif}
+_httpicontsubjof_ [l=id] {_httpimg_/id/tsubjof.gif}
+_widthtsubjx_ [l=id] {87}
+
+## "kepada" ## nav_bar_button ## tto ##
+_httpiconttogr_ [l=id] {_httpimg_/id/ttogr.gif}
+_httpiconttoon_ [l=id] {_httpimg_/id/ttoon.gif}
+_httpiconttoof_ [l=id] {_httpimg_/id/ttoof.gif}
+_widthttox_ [l=id] {87}
+
+## "dari" ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ [l=id] {_httpimg_/id/tfromgr.gif}
+_httpicontfromon_ [l=id] {_httpimg_/id/tfromon.gif}
+_httpicontfromof_ [l=id] {_httpimg_/id/tfromof.gif}
+_widthtfromx_ [l=id] {87}
+
+## "organisasi" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=id] {_httpimg_/id/torggr.gif}
+_httpicontorgon_ [l=id] {_httpimg_/id/torgon.gif}
+_httpicontorgof_ [l=id] {_httpimg_/id/torgof.gif}
+_widthtorgx_ [l=id] {87}
+
+## "bagaimana" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=id] {_httpimg_/id/thowgr.gif}
+_httpiconthowon_ [l=id] {_httpimg_/id/thowon.gif}
+_httpiconthowof_ [l=id] {_httpimg_/id/thowof.gif}
+_widththowx_ [l=id] {93}
+
+## "topik" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=id] {_httpimg_/id/ttopicgr.gif}
+_httpiconttopicon_ [l=id] {_httpimg_/id/ttopicon.gif}
+_httpiconttopicof_ [l=id] {_httpimg_/id/ttopicof.gif}
+_widthttopicx_ [l=id] {87}
+
+## "melihat" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=id] {_httpimg_/id/tbrwsegr.gif}
+_httpicontbrwseon_ [l=id] {_httpimg_/id/tbrwseon.gif}
+_httpicontbrwseof_ [l=id] {_httpimg_/id/tbrwseof.gif}
+_widthtbrwsex_ [l=id] {87}
+
+## "mencari" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=id] {_httpimg_/id/tsrchgr.gif}
+_httpicontsrchof_ [l=id] {_httpimg_/id/tsrchof.gif}
+_httpicontsrchon_ [l=id] {_httpimg_/id/tsrchon.gif}
+_widthtsrchx_ [l=id] {87}
+
+## "judul a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=id] {_httpimg_/id/ttitlgr.gif}
+_httpiconttitlof_ [l=id] {_httpimg_/id/ttitlof.gif}
+_httpiconttitlon_ [l=id] {_httpimg_/id/ttitlon.gif}
+_widthttitlx_ [l=id] {87}
+
+## "orang" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=id] {_httpimg_/id/tpeopgr.gif}
+_httpicontpeopof_ [l=id] {_httpimg_/id/tpeopof.gif}
+_httpicontpeopon_ [l=id] {_httpimg_/id/tpeopon.gif}
+_widthtpeopx_ [l=id] {87}
+
+## "bahasa" ## nav_bar_button ## tlang ##
+_httpicontlanggr_ [l=id] {_httpimg_/id/tlanggr.gif}
+_httpicontlangon_ [l=id] {_httpimg_/id/tlangon.gif}
+_httpicontlangof_ [l=id] {_httpimg_/id/tlangof.gif}
+_widthtlangx_ [l=id] {87}
+
+## "singkatan" ## nav_bar_button ## tacro ##
+_httpicontacrogr_ [l=id] {_httpimg_/id/tacrogr.gif}
+_httpicontacroof_ [l=id] {_httpimg_/id/tacroof.gif}
+_httpicontacroon_ [l=id] {_httpimg_/id/tacroon.gif}
+_widthtacrox_ [l=id] {87}
+
+## "ungkapan" ## nav_bar_button ## tphrse ##
+_httpicontphrsegr_ [l=id] {_httpimg_/id/tphrsegr.gif}
+_httpicontphrseof_ [l=id] {_httpimg_/id/tphrseof.gif}
+_httpicontphrseon_ [l=id] {_httpimg_/id/tphrseon.gif}
+_widthtphrsex_ [l=id] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=id] {Mengenai koleksi ini}
+
+_textsubcols1_ [l=id] {<p>Koleksi lengkap mengandung _1_ subkoleksi. 
+Koleksi yang sedang tersedia adalah:
+<blockquote>}
+
+_textsubcols2_ [l=id] {</blockquote>
+Anda dapat mengecek (dan mengubah) subkoleksi yang sedang digunakan 
+pada halaman Preferensi.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "about" ## green_title ## h_about ##
+_httpiconhabout_ [l=id] {_httpimg_/id/h\_about.gif}
+_widthhabout_ [l=id] {200}
+_heighthabout_ [l=id] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textTitlepage_ [l=id] {_texticonhtitle_}
+_textCreatorpage_ [l=id] {_texticonhauth_}
+_textSubjectpage_ [l=id] {_texticonhsubj_}
+_textTopage_ [l=id] {_texticonhto_}
+_textFrompage_ [l=id] {_texticonhfrom_}
+_textSeriespage_ [l=id] {_texticonhser_}
+_textDatepage_ [l=id] {_texticonhdate_}
+_textHowtopage_ [l=id] {_texticonhhow_}
+_textOrganizationpage_ [l=id] {_texticonhorg_}
+_textBrowsepage_ [l=id] {_texticonhbrwse_}
+_textPeoplepage_ [l=id] {_texticonhpeople_}
+_textLanguagepage_ [l=id] {_texticonhlanguage_}
+_textAcronympage_ [l=id] {_texticonhacronym_}
+_textPhrasepage_ [l=id] {_texticonhphrases_}
+
+_texticonhtitle_ [l=id] {Judul A-Z}
+_texticonhauth_ [l=id] {Pengarang A-Z}
+_texticonhsubj_ [l=id] {Subyek}
+_texticonhto_ [l=id] {Kepada}
+_texticonhfrom_ [l=id] {Dari}
+_texticonhser_ [l=id] {Berkala}
+_texticonhdate_ [l=id] {Tanggal}
+_texticonhhow_ [l=id] {Bagaimana}
+_texticonhorg_ [l=id] {Organisasi}
+_texticonhbrwse_ [l=id] {Melihat}
+_texticonhpeople_ [l=id] {Orang A-Z}
+_texticonhlanguage_ [l=id] {Bahasa}
+_texticonhacronym_ [l=id] {Singkatan}
+_texticonhphrases_ [l=id] {Ungkapan}
+
+_texticonopenbookshelf_ [l=id] {tutup bagian perpustakaan ini}
+_texticonclosedbookshelf_ [l=id] {buka bagian perpustakaan ini dan melihat isinya}
+_texticonopenbook_ [l=id] {tutup buku ini}
+_texticonclosedfolder_ [l=id] {Buka map ini dan melihat isinya}
+_texticonclosedfolder2_ [l=id] {buka sub-bagian: }
+_texticonopenfolder_ [l=id] {tutup map ini}
+_texticonopenfolder2_ [l=id] {tutup sub-bagian: }
+_texticonsmalltext_ [l=id] {Melihat bagian ini dari teks}
+_texticonsmalltext2_ [l=id] {melihat teks: }
+_texticonpointer_ [l=id] {bagian terpilih}
+_texticondetach_ [l=id] {Bukan halaman ini pada jendela baru}
+_texticonhighlight_ [l=id] {Menyoroti istilah yang dicari}
+_texticonnohighlight_ [l=id] {Jangan menyoroti istilah yang dicari}
+_texticoncontracttoc_ [l=id] {Tutup daftar isi}
+_texticonexpandtoc_ [l=id] {Buka daftar isi}
+_texticonexpandtext_ [l=id] {Tampilkan semua teks}
+_texticoncontracttext_ [l=id] {Tampilkan teks hanya di bagian yang terpilih}
+_texticonwarning_ [l=id] {<b>Perhatian: </b>}
+_texticoncont_ [l=id] {teruskan?}
+
+_textltwarning_ [l=id] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Membuka teks di sini akan menghasilkan sejumlah data besar untuk ditampilkan oleh browser anda _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ [l=id] {ke halaman}
+_textintro_ [l=id] { <i>(teks pengantar)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "Judul A-Z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=id] {_httpimg_/id/h\_title.gif}
+_widthhtitle_ [l=id] {200}
+_heighthtitle_ [l=id] {57}
+
+## "pengarang a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=id] {_httpimg_/id/h\_auth.gif}
+_widthhauth_ [l=id] {200}
+_heighthauth_ [l=id] {57}
+
+## "subyek" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=id] {_httpimg_/id/h\_subj.gif}
+_widthhsubj_ [l=id] {200}
+_heighthsubj_ [l=id] {57}
+
+## "kepada" ## green_title ## h_to ##
+_httpiconhto_ [l=id] {_httpimg_/id/h\_to.gif}
+_widthhto_ [l=id] {200}
+_heighthto_ [l=id] {57}
+
+## "dari" ## green_title ## h_from ##
+_httpiconhfrom_ [l=id] {_httpimg_/id/h\_from.gif}
+_widthhfrom_ [l=id] {200}
+_heighthfrom_ [l=id] {57}
+
+## "berkala" ## green_title ## h_ser ##
+_httpiconhser_ [l=id] {_httpimg_/id/h\_ser.gif}
+_widthhser_ [l=id] {200}
+_heighthser_ [l=id] {57}
+
+## "tanggal" ## green_title ## h_date ##
+_httpiconhdate_ [l=id] {_httpimg_/id/h\_date.gif}
+_widthhdate_ [l=id] {200}
+_heighthdate_ [l=id] {57}
+
+## "bagaimana" ## green_title ## h_how ##
+_httpiconhhow_ [l=id] {_httpimg_/id/h\_how.gif}
+_widthhhow_ [l=id] {200}
+_heighthhow_ [l=id] {57}
+
+## "topik" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=id] {_httpimg_/id/h\_topic.gif}
+_widthhtopic_ [l=id] {200}
+_heighthtopic_ [l=id] {57}
+
+## "organisasi" ## green_title ## h_org ##
+_httpiconhorg_ [l=id] {_httpimg_/id/h\_org.gif}
+_widthhorg_ [l=id] {250}
+_heighthorg_ [l=id] {57}
+
+## "melihat" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=id] {_httpimg_/id/h\_brwse.gif}
+_widthhbrwse_ [l=id] {200}
+_heighthbrwse_ [l=id] {57}
+
+## "orang" ## green_title ## h_people ##
+_httpiconhpeople_ [l=id] {_httpimg_/id/h\_people.gif}
+_widthhpeople_ [l=id] {200}
+_heighthpeople_ [l=id] {57}
+
+## "bahasa" ## green_title ## h_lang ##
+_httpiconhlanguage_ [l=id] {_httpimg_/id/h\_lang.gif}
+_widthhlanguage_ [l=id] {200}
+_heighthlanguage_ [l=id] {57}
+
+## "singkatan" ## green_title ## h_acro ##
+_httpiconhacronym_ [l=id] {_httpimg_/id/h\_acro.gif}
+_widthhacronym_ [l=id] {200}
+_heighthacronym_ [l=id] {57}
+
+## "ungkapan" ## green_title ## h_phrse ##
+_httpiconhphrse_ [l=id] {_httpimg_/id/h\_phrse.gif}
+_widthhphrse_ [l=id] {200}
+_heighthphrse_ [l=id] {57}
+
+## "TERUSKAN?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=id] {_httpimg_/id/contof.gif}
+_httpiconconton_ [l=id] {_httpimg_/id/conton.gif}
+
+## "BUKA TEKS" ## document_button ## eallt ## 
+_httpiconealltof_ [l=id] {_httpimg_/id/ealltof.gif}
+_httpiconeallton_ [l=id] {_httpimg_/id/eallton.gif}
+
+## "TUTUP ISI" ## document_button ## econc ##
+_httpiconeconcof_ [l=id] {_httpimg_/id/econcof.gif}
+_httpiconeconcon_ [l=id] {_httpimg_/id/econcon.gif}
+
+## "PISAHKAN" ## document_button ## edtch ##
+_httpiconedtchof_ [l=id] {_httpimg_/id/edtchof.gif}
+_httpiconedtchon_ [l=id] {_httpimg_/id/edtchon.gif}
+
+## "BUKA ISI" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=id] {_httpimg_/id/eexpcof.gif}
+_httpiconeexpcon_ [l=id] {_httpimg_/id/eexpcon.gif}
+
+## "TUTUP TEKS" ## document_button ## etsec ##
+_httpiconetsecof_ [l=id] {_httpimg_/id/etsecof.gif}
+_httpiconetsecon_ [l=id] {_httpimg_/id/etsecon.gif}
+
+## "PENYOROTAN" ## document_button ## ehl ##
+_httpiconehlof_ [l=id] {_httpimg_/id/ehlof.gif}
+_httpiconehlon_ [l=id] {_httpimg_/id/ehlon.gif}
+
+## "      TANPA 
+#PENYOROTAN" ## document_button ## enhl ##
+_httpiconenhlof_ [l=id] {_httpimg_/id/enhlof.gif}
+_httpiconenhlon_ [l=id] {_httpimg_/id/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=id] {_If_(_thislast_,hasil _thisfirst_ - _thislast_ untuk pertanyaan: _cgiargq_,Tidak ada yang memenuhi syarat: _cgiargq_)}
+_textnoquerytitle_ [l=id] {Halaman Pencarian}
+
+_texticonthispage_ [l=id] {mencari}
+_textsome_ [l=id] {_If_(_cgiargb_,terurut,beberapa)}
+_textall_ [l=id] {_If_(_cgiargb_,logika,semua)}
+_textformsome_ [l=id] {_If_(_cgiargb_,terurut,beberapa)}
+_textformall_ [l=id] {_If_(_cgiargb_,alami,semua)}
+_texticonqueryresultsbar_ [l=id] {}
+_texticonsearchhistorybar_ [l=id] {riwayat pencarian}
+
+#alt text for query buttons
+_textusequery_ [l=id] {gunakan pertanyaan ini}
+_textfreqmsg1_ [l=id] {Jumlah kata: }
+_textpostprocess_ [l=id] {_If_(_quotedquery_,<br><i>diproses ulang untuk menemukan _quotedquery_</i>
+)}
+
+_textmorethan_ [l=id] {Lebih dari }
+_textapprox_ [l=id] {Sekitar }
+_textnodocs_ [l=id] {Tidak ada dokumen yang memenuhi syarat.}
+_text1doc_ [l=id] {1 dokumen memenuhi syarat.}
+_textlotsdocs_ [l=id] {dokumen memenuhi syarat.}
+_textmatches_ [l=id] {Penemuan }
+_textbeginsearch_ [l=id] {Mulai mencari}
+_textrunquery_ [l=id] {Menjalankan pertanyaan}
+_textclearform_ [l=id] {Menghapuskan formulir}
+
+#these go together in form search:
+#"Word or phrase  (fold, stem)  ... in field"
+_textwordphrase_ [l=id] {Kata atau ungkapan}
+_textinfield_ [l=id] {... dalam bidang}
+_textfoldstem_ [l=id] {(lipatan, kata dasar)}
+
+_textadvquery_ [l=id] {Atau masukkan pertanyaan secara langsung:}
+_textallfields_ [l=id] {Semua bidang}
+_textand_ [l=id] {dan}
+_textor_ [l=id] {atau}
+_textandnot_ [l=id] {dan tidak}
+
+# _hselection_, _jselection_, _nselection_ and _gselection_ are set from 
+# within the server some or all of them may remain unset
+
+
+_textsimplesearch_ [l=id] {Mencari _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, pada tingkat _gselection_) _If_(_nselection_, dalam bahasa _nselection_)
+yang mengandung _querytypeselection_ dari kata}
+
+_textadvancedsearch_ [l=id] {Mencari _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, pada tigkat _gselection_)_If_(_nselection_, dalam bahasa _nselection_) 
+dengan menggunakan pertanyaan _querytypeselection_}
+
+_textformsimplesearch_ [l=id] {Mencari _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, pada tingkat _gselection_) _If_(_nselection_, dalam bahasa _nselection_)
+yang mengandung _formquerytypeselection_ dari}
+
+_textformadvancedsearch_ [l=id] {Mencari _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, pada tingkat _gselection_)_If_(_nselection_, dalam bahasa _nselection_) 
+dan menampilkan hasil dalam urutan _formquerytypeselection_}
+
+
+_textjselect_ [l=id] {_If_(_hselection_, dari) _jselection_}
+
+_textdatesearch_ [l=id] {Koleksi ini dapat diselidiki untuk dokumen yang mengandung tahun atau kisaran tahun tertentu. Kemungkinan ini merupakan pilihan tambahan.}
+_textstartdate_ [l=id] {Tahun mulai (atau tunggal):}
+_textenddate_ [l=id] {Tahun akhir:}
+_textbc_ [l=id] {SM}
+_textad_ [l=id] {TM}
+_textexplaineras_ [l=id] {SM = sebelum Masehi, TM = Tarich (sesudah) Masehi} 
+
+_textstemon_ [l=id] { (mengabaikan akhiran kata)}
+
+_textsearchhistory_ [l=id] {Riwayat pencarian}
+
+#text macros for search history
+_textnohistory_ [l=id] {Riwayat pencarian tidak tersedia}
+_texthresult_ [l=id] {hasil}
+_texthresults_ [l=id] {hasil}
+_texthallwords_ [l=id] {semua kata}
+_texthsomewords_ [l=id] {beberapa kata}
+_texthboolean_ [l=id] {pencarian logika}
+_texthranked_ [l=id] {terurut}
+_texthcaseon_ [l=id] {Huruf besar/kecil harus sama}
+_texthcaseoff_ [l=id] {Abaikan huruf besar/kecil}
+_texthstemon_ [l=id] {Abaikan awalan dan akhiran}
+_texthstemoff_ [l=id] {Dengan awalan dan akhiran}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "Mencari" ## green_title ## h_search ##
+_httpiconhsearch_ [l=id] {_httpimg_/id/h\_search.gif}
+_widthhsearch_ [l=id] {200}
+_heighthsearch_ [l=id] {57}
+
+## "Hasil" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=id] {_httpimg_/id/qryresb.gif}
+_widthqryresb_ [l=id] {_pagewidth_}
+_heightqryresb_ [l=id] {17}
+
+## "Riwayat" ## green_bar_left_aligned ## schhistb ##
+_httpiconsrchhistb_ [l=id] {_httpimg_/id/schhistb.gif}
+_widthsrchhistb_ [l=id] {_pagewidth_}
+_heightsrchhistb_ [l=id] {17}
+
+## "Tampilkan" ## hand_made ##
+_httpicondisplay_ [l=id] {_httpimg_/display.gif}
+_widthdisplay_ [l=id] {60}
+_heightdisplay_ [l=id] {20}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textprefschanged_ [l=id] {Preferensi ditetapkan seperti berikut. Jangan menggunakan tombol &quot;back&quot; di browser anda - preferensi tersebut akan terhapus! Daripada itu, klik di salah satu tombol di atas.}
+_textsetprefs_ [l=id] {tetapkan preferensi}
+_textsearchprefs_ [l=id] {Preferensi pencarian}
+_textcollectionprefs_ [l=id] {Preferensi koleksi}
+_textpresentationprefs_ [l=id] {Preferensi penampilan}
+_textpreferences_ [l=id] {Preferensi}
+_textcasediffs_ [l=id] {Pembedaan huruf besar/kecil:}
+_textignorecase_ [l=id] { abaikan perbedaan}
+_textmatchcase_ [l=id] { huruf besar/kecil harus tepat sama}
+_textwordends_ [l=id] {Akhiran kata:}
+_textstem_ [l=id] { abaikan akhiran}
+_textnostem_ [l=id] { kata harus tepat sama}
+_textprefop_ [l=id] {Sediakan sampai dengan _maxdocoption_ penemuan dengan _hitsperpageoption_ penemuan per halaman.}
+_textextlink_ [l=id] {Akses ke halaman web di luar:}
+_textintlink_ [l=id] {Dokumen asli diperoleh dari:}
+_textlanguage_ [l=id] {Bahasa tampilan:}
+_textencoding_ [l=id] {Pengekodean:}
+_textformat_ [l=id] {Format tampilan:}
+_textall_ [l=id] {semua}
+_textquerymode_ [l=id] {Cara pertanyaan:}
+_textsimplemode_ [l=id] { sederhana}
+_textadvancedmode_ [l=id] { lanjutan (boleh mencari secara logika dengan menggunakan ! [tidak], & [dan], | [atau], dan tanda kurung)}
+_textlinkinterm_ [l=id] {melalui halaman pengantara}
+_textlinkdirect_ [l=id] {langsung tersedia}
+_textdigitlib_ [l=id] {perpustakaan digital}
+_textweb_ [l=id] {web}
+_textgraphical_ [l=id] {grafis}
+_texttextual_ [l=id] {teks}
+_textcollectionoption_ [l=id] {<p>
+Sub-koleksi yang tercantum:
+<br>}
+_textrelateddocdisplay_ [l=id] {tampilkan dokumen terkait}
+_textsearchhistory_ [l=id] {Riwayat pencarian:}
+_texthistorydisplay_ [l=id] { tampilkan _historynumrecords_ butir riwayat pencarian}
+_textnohistorydisplay_ [l=id] { jangan tampilkan riwayat pencarian}
+
+_texttypesearch_ [l=id] {Macam pencarian:}
+_texttextsearch_ [l=id] {teks}
+_textformsearch_ [l=id] {formulir}
+_textqueryboxsize_ [l=id] {Ukuran kotak pertanyaan:}
+_textregbox_ [l=id] { kotak pertanyaan biasa}
+_textbigbox_ [l=id] { kotak pertanyaan besar}
+_textformtype_ [l=id] {Tipe formulir:}
+_textsimple_ [l=id] { sederhana}
+_textadvanced_ [l=id] { lanjutan}
+
+# used in "with 4 fields" in the form search box
+_textwith_ [l=id] {dengan}
+_textfields_ [l=id] {bidang}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "preferensi" ## green_title ## h_pref ##
+_httpiconhpref_ [l=id] {_httpimg_/id/h\_pref.gif}
+_widthhpref_ [l=id] {200}
+_heighthpref_ [l=id] {57}
+
+#####################################################################
+# 'browse' package for the dynamic browsing interface
+package browse
+#####################################################################
+
+_textbrowseby_ [l=id] {Melihat menurut}
+_textthenby_ [l=id] {kemudian menurut}
+_textshowing_ [l=id] {menampilkan}
+_textdocsperpage_ [l=id] {dokumen per halaman}
+
+_textfilterby_ [l=id] {Melihat hanya dokumen yang mengandung}
+_textall_ [l=id] {semua}
+_textany_ [l=id] {apa saja}
+_textwords_ [l=id] {dari kata}
+
+_browsebuttontext_ [l=id] {Melihat}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=id] {Bantuan}
+_textSearchshort_ [l=id] {mencari kata-kata tertentu}
+_textSeriesshort_ [l=id] {mengakses publikasi menurut judul berkala}
+_textDateshort_ [l=id] {mengakses publikasi menurut tanggal}
+_textSubjectshort_ [l=id] {mengakses publikasi menurut subyek}
+_textToshort_ [l=id] {mengakses publikasi menurut bidang Kepada}
+_textFromshort_ [l=id] {mengakses publikasi menurut bidang Dari}
+_textTitleshort_ [l=id] {mengakses publikasi menurut judul}
+_textBrowseshort_ [l=id] {melihat publikasi}
+_textCreatorshort_ [l=id] {mengakses publikasi menurut pengarang}
+_textOrganizationshort_ [l=id] {mengakses publikasi menurut organisasi}
+_textHowtoshort_ [l=id] {mengakses publikasi menurut daftar Bagaimana}
+_textTopicshort_ [l=id] {mengakses publikasi menurut topik}
+_textPeopleshort_ [l=id] {mengakses publikasi menurut orang}
+_textLanguageshort_ [l=id] {mengakses publikasi menurut bahasa}
+_textAcronymshort_ [l=id] {mengakses publikasi menurut singkatan}
+_textPhraseshort_ [l=id] {melihat ungkapan yang berada di publikasi}
+_textdefaultshorttext_ [l=id] {klasifikasi belum terdefinisi}
+
+_textSearchlong_ [l=id] { <p>Anda dapat <i>mencari kata-kata tertentu</i> yang berada di teks dari halaman "Pencarian". Halaman inilah yang pertama mencul bila program dimulai. Halaman tsb dapat ditampilkan dengan menekan tombol <i>Mencari</i>.  }
+
+_textTitlelong_ [l=id] { <p>Anda dapat <i>mengakses publikasi menurut judul</i> dengan menekan tombol <i>Judul A-Z</i>.  Tombol ini menampilkan daftar publikasi dalam urutan abjad.  }
+
+_textOrganizationlong_ [l=id] { <p>Anda dapat <i>mengakses publikasi menurut organisasi</i> dengan menekan tombol <i>organisasi</i>.  Tombol ini menampilkan daftar organisasi.  }
+
+_textHowtolong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut daftar "Bagaimana"</i> dengan menekan tombol <i>bagaimana</i>.  Tombol ini menampilkan daftar cara mengerjakan sesuatu.  }
+
+_textCreatorlong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut pengarang</i> dengan menekan tombol <i>pengarang a-z</i>.  Tombol ini menampilkan daftar publikasi yang diurutkan menurut nama pengarang.  }
+
+_textTopiclong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut topik</i> dengan menekan tombol <i>topik</i>.  Tombol ini menampilkan daftar topik yang dapat dipilih.  }
+
+_textSubjectlong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut subyek</i> dengan menekan tombol <i>subyek</i>.  Tombol ini menampilkan daftar subyek, diwakili oleh rak buku.  }
+
+_textTolong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut bidang "Kepada"</i> dengan menekan tombol <i>kepada</i>.  Tombol ini menampilkan daftar alamat.  }
+
+_textFromlong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut bidang "Dari" </i> dengan menekan tombol <i>dari</i>.  Tombol ini menampilkan daftar pengirim. }
+
+_textSerieslong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut judul seri (publikasi berkala)</i> dengan menekan tombol <i>berkala</i>.  Tombol ini menampilkan daftar publikasi berkala yang ada dalam koleksi.  }
+
+_textDatelong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut tanggal</i> dengan menekan tombol <i>tanggal</i>.  Tombol ini menampilkan daftar publikasi berurutan tanggalnya.  }
+
+_textBrowselong_ [l=id] { <p> Anda dapat <i>memilih dari daftar publikasi</i> dengan menekan tombol <i>melihat</i>.  }
+
+_textPeoplelong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut perorangan</i> dengan menekan tombol <i>orang</i>.  Tombol ini menampilkan daftar perorangan dalam urutan abjad.  }
+
+_textLanguagelong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut bahasa</i> dengan menekan tombol <i>bahasa</i>.  Tombol ini menampilkan daftar berurutan bahasa.  }
+
+_textAcronymlong_ [l=id] { <p> Anda dapat <i>mengakses publikasi menurut singkatan</i> dengan menekan tombol <i>singkatan</i>.  Tombol ini menampilkan daftar singkatan dan letaknya.  }
+
+_textPhraselong_ [l=id] { <p>You can <i>melihat ungkapan yang berada dalam publikasi</i> dengan menekan tombol <i>ungkapan</i> button.  Tombol ini menggunakan browser untuk mencari ungkapan.  }
+
+_textdefaultlongtext_ [l=id] { <p>Klik pada tombol <i>tidak diketahui</i> untuk melihat publikasi (daftar diurutkan menurut bidang yang tidak diketahui).  }
+
+_texthelptopics_ [l=id] {
+<h2 align=left>Topik</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Bagaimana mencari kata-kata tertentu </a>
+<ul>
+  <li><a href="\#query-terms">Istilah pencarian</a>
+  <li><a href="\#query-type">Macam pertanyaan</a>
+  <li><a href="\#scope-of-queries">Jangkauan pertanyaan</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Preferensi koleksi</a>
+  <li><a href="\#lang-prefs">Preferensi bahasa</a>
+  <li><a href="\#pres-prefs">Preferensi penampilan</a>
+  <li><a href="\#search-prefs">Preferensi pencarian</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=id] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=id] {Bagaimana membaca dokumen}
+_booktextreadingdocs_ [l=id] {Bagaimana membaca buku}
+_bibtextreadingdocs_ [l=id] {Memperoleh informasi tambahan mengenai unsur bibliografi}
+
+_texthelpreadingdocs_ [l=id] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Anda dapat mengetahui bahwa anda telah tiba di dokumen tertentu karena judul dan pengarangnya terlihat pada atas kiri halaman. Di sebelahnya ada nomor halaman yang ditampilkan, kotak yang memungkinkan anda untuk memilih halaman baru, dan panah maju dan mundur.
+
+<p>Di bawahnya ada teks dari bagian yang terpilih. Bila anda sudah selesai membaca teks itu, panah di bawah dapat digunakan untuk maju ke bagian berikut atau mundur ke yang sebelumnya. 
+
+<p>Di bawah judul dan pengarang terdapat tiga tombol. Klik pada <i>buka teks</i> untuk membuka semua teks dari dokumen terpilih. Bila dokumen besar, mungkin perlu menunggu lama dan banyak memori terpakai! Klik pada tombol <i>pisahkan</i> untuk membuka jendela baru untuk dokumen ini. (Hal ini dapat berguna bila anda ingin memperbandingkan dokumen, atau membaca dua dokumen sekaligus.)  Akhirnya, bila anda mencari kata tertentu, kata tersebut disoroti.  Klik pada tombol <i>tanpa penyorotan</i> untuk menghilangkan penyorotan.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Klik pada panah untuk maju ke bagian berikut ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... atau kembali ke bagian sebelumnya </td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Tampilkan semua teks, atau tidak</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Buka halaman ini dalam jendela baru</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Menyoroti istilah yang dicari, atau tidak</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=id] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Anda dapat mengetahui bahwa anda telah tiba di buku tertentu karena foto sampulnya terlihat pada atas kiri halaman. Di sebelah foto itu ada daftar isi dengan panah yang menunjukkan letak anda Daftar tersebut dapat dibuka: klik pada map untuk membuka atau menutup map itu. Klik pada buku terbuka di paling atas untuk menutupnya.
+
+<p> Di bawahnya ada teks dari bagian yang terpilih. Bila anda sudah selesai membaca teks itu, panah di bawah dapat digunakan untuk maju ke bagian berikut atau mundur ke yang sebelumnya. 
+
+<p> Di bawah foto terdapat empat tombol. Klik pada <i>buka teks</i> untuk membuka semua teks dari buku atau bagian terpilih. Bila buku besar, mungkin perlu menunggu lama dan banyak memori terpakai! Klik pada tombol <i>pisahkan</i> untuk membuka jendela baru untuk dokumen ini. (Hal ini dapat berguna bila anda ingin memperbandingkan dokumen, atau membaca dua dokumen sekaligus.)  Akhirnya, bila anda mencari kata tertentu, kata tersebut disoroti.  Klik pada tombol <i>tanpa penyorotan</i> untuk menghilangkan penyorotan.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Buka rak buku ini</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Buka/tutup buku ini</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Melihat bagian teks ini</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Tampilkan semua teks, atau tidak</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Buka daftar isi, atau tidak</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Buka halaman ini dalam jendela baru</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Menyoroti istilah yang dicari, atau tidak</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Klik pada panah untuk maju ke bagian berikut ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... atau kembali ke bagian sebelumnya</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=id] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Beberapa unsur bibliografi mengandung informasi tambahan, seperti abstrak. Di halaman hasil pencarian, unsur yang mengandung informasi tambahan itu ditandai dengan lambang _icontext_ bukan dengan lambang _iconblanktext_.
+
+<p>Klik pada lambang _icontext_ untuk memperoleh informasi tambahan mengenai unsur bibliografi.
+
+<p> Di bawah bibliografi terdapat dua tombol. Klik pada tombol <i>pisahkan</i> untuk membuka jendela baru untuk dokumen ini. (Hal ini dapat berguna bila anda ingin memperbandingkan unsur bibliografi.)  Akhirnya, bila anda mencari kata tertentu, kata tersebut disoroti.  Klik pada tombol <i>tanpa penyorotan</i> untuk menghilangkan penyorotan.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Buka halaman ini dalam jendela baru</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td> Menyoroti istilah yang dicari, atau tidak</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=id] {
+<h2>Bagaimana mencari istilah tertentu</h2>
+<p>
+  Dari halaman Pencarian, anda dapat mengajukan pertanyaan dengan langkah berikut:<p>
+  
+  <ol><li>Memilih bahan yang ingin diselidiki 
+      <li>Menentukan apakah anda ingin mencari semua atau hanya beberapa dari istilah 
+      <li>Mengetik istilah yang dicari 
+      <li>Klik pada tombol <i>Mulai mencari</i> 
+  </ol>
+
+<p>Bila pertanyaan diajukan, judul dari 20 dokumen yang sesuai akan ditampilkan. Tombol di ujung daftar tersebut dapat ditekan untuk menampilkan 20 dokumen berikutnya, kemudian 20 dokumen lagi, dst. Untuk melihat isi dokumen, klik pada judul dokumen itu, atau pada lambang di sisiknya. 
+
+<p>Maksimal 100 dokumen dapat ditemukan. Jumlah ini dapat diganti dengan mengeklik pada tombol <i>preferensi</i> di atas halaman.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Istilah pencarian</h3>
+
+<p>Apa saja yang diketik dalam kotak pertanyaan dianggap sebagai daftar kata atau "istilah pencarian". Suatu istilah dapat mengandung hanya huruf A-Z dan angka 0-9. Istilah dipisahkan dengan spasi. Semua tanda lain (seperti tanda baca) dianggap sebagai spasi dan diabaikan. Kata yang mengandung tanda baca tidak dapat dicari.
+
+<p>Misalnya, pertanyaan<p>
+    <ul><kbd>Lada di Bangka-Belitung: Peluang untuk Agribisnis (1993)</kbd></ul>
+      <p>dianggap sebagai<p>
+      <ul><kbd> Lada di Bangka Belitung Peluang untuk Agribisnis 1993</kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Macam pertanyaan</h3>
+
+<p>Ada dua macam pertanyaan.
+
+<ul>
+  <li>Mencari <b>semua</b> kata. Pertanyaan ini mencari dokumen (atau bab atau 
+      judul) yang mengandung semua kata yang diketik dalam kotak pertanyaan.
+      Dokumen yang mengisi syarat itu ditampilkan dalan urutan abjad.<p>
+
+  <li>Mencari <b>beberapa</b> dari kata. Ketikkan saja daftar istilah yang
+      barangkali dimuat dalam dokumen yang dicari. Dokumen ditampilkan menurut
+      kesesuaiannya pada pertanyaan itu. Dalam menentukan dekatnya kesesuaian,
+
+      <p><ul>
+        <li> makin banyak istilah yang dikandung dokumen, makin dekat kesesuaiannya;
+        <li> istilah yang jarang dianggap lebih penting daripada istilah biasa;
+        <li> dokumen pendek dianggap lebih dekat kesesuaiannya daripada dokumen panjang.
+      </ul>
+</ul>
+
+<p>Anda dapat menggunakan sehendaknya banyak istilah pencarian--suatu kalimat penuh, atau bahkan alinea lengkap. Bila hanya satu istilah yang diketik, dokumen diurutkan menurut keseringan munculnya istilah itu.<p>
+_texthelpscope_
+}
+
+_textdatesearch_ [l=id] {Mencari menurut tanggal}
+
+_texthelpdatesearch_ [l=id] {<h2>_textdatesearch_</h2>
+Pencarian menurut tanggal memungkinkan pencarian dokumen yang sesuai dengan istilah yang dipilih dan juga mengenai peristiwa dalam kurung waktu tertentu. Dokumen dapat dicari dari tahun tertentu atau dari kisaran tahun. Istilah pencarian tidak perlu: dokumen juga dapat dicari menurut tanggal saja. Tidak perlu menggunakan tanggal dalam pencarian: bila tanggal tidak diketik, maka tanggal diabaikan.<p>
+
+<p>_iconblankbar_
+<a name=datesearch-howto>
+<h3>Bagaimana menggunakan fasilitas ini:</h3>
+<ul>
+   <li>Untuk mencari dokumen mengenai tahun tertentu:<p>
+   <ul>
+       <li>Masukkan istilah pencarian seperti biasa.	
+       <li>Ketikkan tahun yang dimaksud pada kotak "Tahun mulai (atau tunggal)". 
+       <li>Bila tahun yang dimaksud sebelum Masehi, pilihlah SM dari menu di sebelah. 
+       <li>Mulailah pencarian seperti biasa.
+   </ul>
+<p><li>Untuk mencari dokumen mengenai kisaran tahun:<p>
+   <ul>
+       <li>Masukkan istilah pencarian seperti biasa.
+       <li>Ketikkan tahun pertama pada kotak "Tahun mulai (atau tunggal)". 
+       <li>Ketikkan tahun terakhir pada kotak "Tahun akhir".
+       <li> Bila tahun yang dimaksud sebelum Masehi, pilihlah SM dari menu di sebelah. 
+       <li> Mulailah pencarian seperti biasa.
+   </ul>    
+</ul><p>
+
+<p>_iconblankbar_
+<a name=datesearch-results>
+<h3>Cara kerja pencarian</h3>
+
+Pada umumnya, pencarian dokumen mengenai tahun 1903 tidak akan menemukan dokumen yang mengutip buku yang tertulis pada tahun 1903, hanya dokumen mengenai 1903. Akan tetapi, dokumen ditemukan yang mengandung kisaran tahun (seperti 1899-1911) yang mencakupi 1903. Juga ditemukan dokumen yang menyebut abad itu (misalnya abad ke-20 atau abad keduapuluh). Hal ini berarti bahwa tahun yang dicari tidak muncul di teks. Cara kerja ini juga berlaku untuk setiap tahun dalam pencarian kisaran.<p>
+}
+
+_textchangeprefs_ [l=id] {Mengubah preferensi}
+
+_texthelppreferences_ [l=id] {<h2>_textchangeprefs_</h2>
+
+<p>Dengan mengeklik pada tombol <i>preferensi</i> di atas halaman, anda dapat mengubah beberapa fasilitas dari penampilan supaya cocok dengan kebutuhan anda.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Preferensi koleksi</h3>
+
+Koleksi dapat terdiri dari beberapa sub-koleksi, yang dapat dicari secara tersendiri atau bersamaan. Pada koleksi macam itu, anda dapat memilih sub-koleksi yang mana untuk diselidiki pada halaman Preferensi.
+
+<p>_iconblankbar_
+<a name=lang-prefs>
+<h3 align=left>Preferensi bahasa</h3>
+
+Setiap koleksi ada bahasa penampilan yang standar, tetapi bahasa lain juga dapat dipilih. Anda juga dapat mengubah cara pengekodeaan yang digunakan oleh Greenstone untuk penyampaian hasil ke browser. Perangkat lunak memilih cara pengekodeaan secara otomatis, tetapi penampilan masih dapat diperbaiki di beberapa browser dengan memilih cara pengekodean yang lain. Semua koleksi memungkinkan pengantian penampilan grafis yang standar menjadi penampilan teks saja. Hal ini berguna untuk pengguna yang cacat mata yang memerlukan gaya huruf besar atau alat bicara untuk memperoleh keluaran.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Preferensi presentasi</h3>
+
+Dalam koleksi tertentu, beberapa pilihan dapat disetel yang mengendalikan presentasi. 
+
+<p>Di koleksi halaman web, mungkin menghilangkan menu navigasi Greenstone di atas setiap halaman, sehingga setelah menemukan halaman yang dicari, tidak ada kop Greenstone di atasnya. Untuk mencari lagi, harus menggunakan tombol "Back" (balik) di browser. Pada koleksi seperti itu juga mungkin menghilangkan pesan peringatan dari Greenstone yang ditampilkan bila anda klik pada link yang keluar dari koleksi dan masuk ke internet. Pada beberapa koleksi, mungkin mengendalikan apakah link di halaman "Hasil pencarian" meneruskan anda ke URL di internet, atau ke jiplakan halaman itu yang ada di koleksi. 
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Preferensi pencarian</h3>
+<p>Dua pasangan tombol mengendalikan macam penyesuaian teks yang dilakukan dalam pencarian. Pasangan pertama ("Pembedaan huruf besar/kecil") mengatur apakah huruf besar dan kecil harus persis sama dengan apa yang diketik. Pasangan kedua ("Akhiran kata") mengatur apakah akhiran kata diabaikan atau tidak. Mungkin menampilkan kotak pertanyaan besar untuk mencari kalimat atau alinea. Pencarian alinea cukup cepat. 
+
+<p>Misalnya, bila tombol <i>abaikan perbedaan</i> dan 
+<i>abaikan akhiran</i> dipilih, pertanyaan<p>
+    <ul><kbd>African building</kbd></ul>
+      <p>akan dianggap sama dengan<p>
+      <ul><kbd>africa builds</kbd></ul><p>karena huruf besar di "African" akan
+      dijadikan huruf kecil, dan akhiran "n" dan "ing" dihapus dari "African"
+      dan "building" ("s" juga dihapus dari "builds").
+
+<p>Anda dapat pindah ke cara pencarian "lanjutan" yang memungkinkan penggunaan AND (&amp;) [dan], OR (|) [atau], dan NOT (!) [tidak]. Hal ini memungkinkan pertanyaan lebih spesifik. Anda juga dapat menggunakan fasilitas riwayat pencarian, yang menampilkan beberapa pertanyaan yang terakhir ditampilkan. Fasilitas ini memungkinkan pengulangan dari pertanyaan dulu dengan nada sedikit berbeda. Anda juga dapat mengendalikan jumlah dokumen yang ditemukan, serta jumlah yang ditampilkan pada setiap layar. 
+}
+
+_texttanumbrowseoptions_ [l=id] {Ada _numbrowseoptions_ cara untuk menemukan informasi dalam koleksi ini:}
+
+_textsimplehelpheading_ [l=id] {Bagaimana mencari informasi}
+
+_texthelpscope_ [l=id] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Jangkauan pertanyaan</h3>
+
+<p>
+Dalam sebagian besar dari koleksi, anda dapat memilih di antara beberapa indeks. Misalnya, mungkin ada indeks pengarang atau judul. Atau indeks bab atau alinea. Pada umumnya, dokumen penuh ditampilkan, tanpa memperhatikan indeks yang digunakan.
+<p>Bila dokumen adalah buku, buku tsb dibuka pada tempat yang layak.
+}
Index: /main/tags/2.38/gsdl/macros/italian.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/italian.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/italian.dm	(revision 21083)
@@ -0,0 +1,1073 @@
+######################################################################
+#
+# Traduzione italiana a cura di Marco Michelino michelinux@tin.it
+#
+######################################################################
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=it] {La pagina richiesta non &egrave; disponibile.
+Usa il pulsante 'indietro' del tuo browser o il pulsante
+'Pagina principale' per tornare alla Greenstone Digital Library.}
+
+_textdefaulttitle_ [l=it] {Errore GSDL}
+
+_collectionextra_ [l=it] {Questa raccolta contiene _about:numdocs_ documenti.
+E' stata creata _about:builddate_ giorni fa.}
+
+_collectorextra_ [l=it] {
+<p>Questa raccolta contiene _numdocs_ _If_("_numdocs_" eq "1",documento,documenti), per un totale di _numbytes_.
+}
+
+_textimagecollection_ [l=it] {}
+_textimageabout_ [l=it] {Informazioni su}
+_textimagehome_ [l=it] {Pagina principale}
+_textimagehelp_ [l=it] {Aiuto}
+_textimagepref_ [l=it] {Impostazioni}
+_textimagegreenstone_ [l=it] {Greenstone Digital Library Software}
+
+_textimagesearch_ [l=it] {Cerca termini specifici}
+_textimageTitle_ [l=it] {Elenco alfabetico per titolo}
+_textimageList_ [l=it] {Elenco documenti}
+_textimageCreator_ [l=it] {Elenco per autore}
+_textimageSeries_ [l=it] {Elenco per argomento}
+_textimageDate_ [l=it] {Elenco per data}
+_textimageSubject_ [l=it] {Elenco per oggetto}
+_textimageTo_ [l=it] {Elenco per destinatario}
+_textimageFrom_ [l=it] {Elenco per mittente}
+_textimageOrganization_ [l=it] {Elenco per organizzazione}
+_textimageHowto_ [l=it] {Elenco per categorie di guide pratiche}
+_textimageTopic_ [l=it] {Elenco argomenti particolari}
+_textimageBrowse_ [l=it] {Elenco}
+_textimagePeople_ [l=it] {Elenco per persone}
+_textimageLanguage_ [l=it] {Elenco per lingua}
+_textimageAcronym_ [l=it] {Elenco acronimi}
+_textimagePhrase_ [l=it] {Elenco frasi}
+
+_texticontabsearchgreen_ [l=it] {Cerca}
+_texticontabdategreen_ [l=it] {Date}
+_texticontabseriesgreen_ [l=it] {Serie}
+_texticontabauthorgreen_ [l=it] {Autori A-Z}
+_texticontabtitlegreen_ [l=it] {Titoli A-Z}
+_texticontablistgreen_ [l=it] {Lista}
+_texticontabsubjectgreen_ [l=it] {Oggetto}
+_texticontabtogreen_ [l=it] {Destinatario}
+_texticontabfromgreen_ [l=it] {Mittente}
+_texticontaborggreen_ [l=it] {Organizzazione}
+_texticontabhowgreen_ [l=it] {Guide pratiche}
+_texticontabtopicgreen_ [l=it] {Argomento}
+_texticontabbrwsegreen_ [l=it] {Elenco}
+_texticontabPeoplegreen_ [l=it] {Persone A-Z}
+_texticontabLanguagegreen_ [l=it] {Lingua}
+_texticontabAcronymgreen_ [l=it] {Acronimi}
+_texticontabPhrasegreen_ [l=it] {Frasi}
+
+_texticontext_ [l=it] {Visualizza il documento}
+_texticonclosedbook_ [l=it] {Apri questo documento e visualizza il contenuto}
+_texticonnext_ [l=it] {Prossima sezione}
+_texticonprev_ [l=it] {Sezione precedente}
+
+_texticonmidi_ [l=it] {Visualizza il documento MIDI}
+_texticonmsword_ [l=it] {Visualizza il documento Microsoft Word}
+_texticonpdf_ [l=it] {Visualizza il documento PDF}
+_texticonps_ [l=it] {Visualizza il documento PS}
+_texticonppt_ [l=it] {Visualizza il documento PPT}
+_texticonrtf_ [l=it] {Visualizza il documento RTF}
+_texticonxls_ [l=it] {Visualizza il documento XLS}
+
+_page_ [l=it] {pagina }
+_pages_ [l=it] {pagine}
+_of_ [l=it] { di }
+_vol_ [l=it] {Vol.}
+_num_ [l=it] {N.}
+
+_textmonth00_ [l=it] {}
+_textmonth01_ [l=it] {Gennaio}
+_textmonth02_ [l=it] {Febbraio}
+_textmonth03_ [l=it] {Marzo}
+_textmonth04_ [l=it] {Aprile}
+_textmonth05_ [l=it] {Maggio}
+_textmonth06_ [l=it] {Giugno}
+_textmonth07_ [l=it] {Luglio}
+_textmonth08_ [l=it] {Agosto}
+_textmonth09_ [l=it] {Settembre}
+_textmonth10_ [l=it] {Ottobre}
+_textmonth11_ [l=it] {Novembre}
+_textmonth12_ [l=it] {Dicembre}
+
+_Document_ [l=it] {Documento}
+_Section_ [l=it] {Sezione}
+_Paragraph_ [l=it] {Paragrafo}
+
+_magazines_ [l=it] {Riviste}
+
+_nzdlpagefooter_ [l=it] {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">Progetto New Zealand Digital Library</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Dipartimento di Informatica</a>,
+<a href="http://www.waikato.ac.nz">Universit&agrave; di Waikato</a>,
+Nuova Zelanda.}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "PAGINA PRINCIPALE" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=it] {_httpimg_/it/chomeof.gif}
+_httpiconchomeon_ [l=it] {_httpimg_/it/chomeon.gif}
+
+## "AIUTO" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=it] {_httpimg_/it/chelpof.gif}
+_httpiconchelpon_ [l=it] {_httpimg_/it/chelpon.gif}
+
+## "IMPOSTAZIONI" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=it] {_httpimg_/it/cprefof.gif}
+_httpiconcprefon_ [l=it] {_httpimg_/it/cprefon.gif}
+
+## "aiuto" ## green_title ## h_help ##
+_httpiconhhelp_ [l=it] {_httpimg_/it/h\_help.gif}
+_widthhhelp_ [l=it] {200}
+_heighthhelp_ [l=it] {57}
+
+## "autori a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=it] {_httpimg_/it/tauthgr.gif}
+_httpicontauthof_ [l=it] {_httpimg_/it/tauthof.gif}
+_httpicontauthon_ [l=it] {_httpimg_/it/tauthon.gif}
+_widthtauthx_ [l=it] {87}
+
+## "serie" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=it] {_httpimg_/it/tsergr.gif}
+_httpicontserof_ [l=it] {_httpimg_/it/tserof.gif}
+_httpicontseron_ [l=it] {_httpimg_/it/tseron.gif}
+_widthtserx_ [l=it] {87}
+
+## "date" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=it] {_httpimg_/it/tdategr.gif}
+_httpicontdateof_ [l=it] {_httpimg_/it/tdateof.gif}
+_httpicontdateon_ [l=it] {_httpimg_/it/tdateon.gif}
+_widthtdatex_ [l=it] {87}
+
+## "oggetto" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=it] {_httpimg_/it/tsubjgr.gif}
+_httpicontsubjon_ [l=it] {_httpimg_/it/tsubjon.gif}
+_httpicontsubjof_ [l=it] {_httpimg_/it/tsubjof.gif}
+_widthtsubjx_ [l=it] {87}
+
+## "destinatario" ## nav_bar_button ## tto ##
+_httpiconttogr_ [l=it] {_httpimg_/it/ttogr.gif}
+_httpiconttoon_ [l=it] {_httpimg_/it/ttoon.gif}
+_httpiconttoof_ [l=it] {_httpimg_/it/ttoof.gif}
+_widthttox_ [l=it] {95}
+
+## "mittente" ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ [l=it] {_httpimg_/it/tfromgr.gif}
+_httpicontfromon_ [l=it] {_httpimg_/it/tfromon.gif}
+_httpicontfromof_ [l=it] {_httpimg_/it/tfromof.gif}
+_widthtfromx_ [l=it] {87}
+
+## "organizzazione" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=it] {_httpimg_/it/torggr.gif}
+_httpicontorgon_ [l=it] {_httpimg_/it/torgon.gif}
+_httpicontorgof_ [l=it] {_httpimg_/it/torgof.gif}
+_widthtorgx_ [l=it] {125}
+
+## "guide pratiche" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=it] {_httpimg_/it/thowgr.gif}
+_httpiconthowon_ [l=it] {_httpimg_/it/thowon.gif}
+_httpiconthowof_ [l=it] {_httpimg_/it/thowof.gif}
+_widththowx_ [l=it] {116}
+
+## "argomento" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=it] {_httpimg_/it/ttopicgr.gif}
+_httpiconttopicon_ [l=it] {_httpimg_/it/ttopicon.gif}
+_httpiconttopicof_ [l=it] {_httpimg_/it/ttopicof.gif}
+_widthttopicx_ [l=it] {87}
+
+## "elenco" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=it] {_httpimg_/it/tbrwsegr.gif}
+_httpicontbrwseon_ [l=it] {_httpimg_/it/tbrwseon.gif}
+_httpicontbrwseof_ [l=it] {_httpimg_/it/tbrwseof.gif}
+_widthtbrwsex_ [l=it] {87}
+
+## "cerca" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=it] {_httpimg_/it/tsrchgr.gif}
+_httpicontsrchof_ [l=it] {_httpimg_/it/tsrchof.gif}
+_httpicontsrchon_ [l=it] {_httpimg_/it/tsrchon.gif}
+_widthtsrchx_ [l=it] {87}
+
+## "titoli a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=it] {_httpimg_/it/ttitlgr.gif}
+_httpiconttitlof_ [l=it] {_httpimg_/it/ttitlof.gif}
+_httpiconttitlon_ [l=it] {_httpimg_/it/ttitlon.gif}
+_widthttitlx_ [l=it] {87}
+
+## "persone" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=it] {_httpimg_/it/tpeopgr.gif}
+_httpicontpeopof_ [l=it] {_httpimg_/it/tpeopof.gif}
+_httpicontpeopon_ [l=it] {_httpimg_/it/tpeopon.gif}
+_widthtpeopx_ [l=it] {87}
+
+## "lingue" ## nav_bar_button ## tlang ##
+_httpicontlanggr_ [l=it] {_httpimg_/it/tlanggr.gif}
+_httpicontlangon_ [l=it] {_httpimg_/it/tlangon.gif}
+_httpicontlangof_ [l=it] {_httpimg_/it/tlangof.gif}
+_widthtlangx_ [l=it] {87}
+
+## "acronimi" ## nav_bar_button ## tacro ##
+_httpicontacrogr_ [l=it] {_httpimg_/it/tacrogr.gif}
+_httpicontacroof_ [l=it] {_httpimg_/it/tacroof.gif}
+_httpicontacroon_ [l=it] {_httpimg_/it/tacroon.gif}
+_widthtacrox_ [l=it] {87}
+
+## "frasi" ## nav_bar_button ## tphrse ##
+_httpicontphrsegr_ [l=it] {_httpimg_/it/tphrsegr.gif}
+_httpicontphrseof_ [l=it] {_httpimg_/it/tphrseof.gif}
+_httpicontphrseon_ [l=it] {_httpimg_/it/tphrseon.gif}
+_widthtphrsex_ [l=it] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=it] {Informazioni su questa raccolta}
+
+_textsubcols1_ [l=it] {<p>La raccolta completa comprende _1_ sottoraccolte.
+Quelle attualmente disponibili sono:
+<blockquote>}
+
+_textsubcols2_ [l=it] {</blockquote>
+Puoi controllare (e modificare) le sottoraccolte che stai
+correntemente utilizzando nella pagina Impostazioni.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "informazioni su" ## green_title ## h_about ##
+_httpiconhabout_ [l=it] {_httpimg_/it/h\_about.gif}
+_widthhabout_ [l=it] {200}
+_heighthabout_ [l=it] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=it] {Titoli A-Z}
+_texticonhauth_ [l=it] {Autori A-Z}
+_texticonhsubj_ [l=it] {Oggetto}
+_texticonhto_ [l=it] {Destinatario}
+_texticonhfrom_ [l=it] {Mittente}
+_texticonhser_ [l=it] {Serie}
+_texticonhdate_ [l=it] {Date}
+_texticonhhow_ [l=it] {Guide pratiche}
+_texticonhorg_ [l=it] {Organizzazione}
+_texticonhbrwse_ [l=it] {Elenco}
+_texticonhpeople_ [l=it] {Persone A-Z}
+_texticonhlanguage_ [l=it] {Lingua}
+_texticonhacronym_ [l=it] {Acronimi}
+_texticonhphrases_ [l=it] {Frasi}
+
+_texticonopenbookshelf_ [l=it] {Chiudi questa sezione della biblioteca}
+_texticonclosedbookshelf_ [l=it] {Apri questa sezione della biblioteca e mostra il contenuto}
+_texticonopenbook_ [l=it] {Chiudi questo libro}
+_texticonclosedfolder_ [l=it] {Apri questa cartella e mostra il contenuto}
+_texticonclosedfolder2_ [l=it] {Apri la sottosezione: }
+_texticonopenfolder_ [l=it] {Chiudi questa cartella}
+_texticonopenfolder2_ [l=it] {Chiudi la sottosezione: }
+_texticonsmalltext_ [l=it] {Mostra questa sezione del testo}
+_texticonsmalltext2_ [l=it] {Mostra testo: }
+_texticonpointer_ [l=it] {Sezione corrente}
+_texticondetach_ [l=it] {Apri questa pagina in una nuova finestra}
+_texticonhighlight_ [l=it] {Evidenzia le parole cercate}
+_texticonnohighlight_ [l=it] {Non evidenziare le parole cercate}
+_texticoncontracttoc_ [l=it] {Nascondi indice}
+_texticonexpandtoc_ [l=it] {Mostra indice}
+_texticonexpandtext_ [l=it] {Mostra tutto il testo}
+_texticoncontracttext_ [l=it] {Mostra il testo solo per la sezione correntemente selezionata}
+_texticonwarning_ [l=it] {<b>Attenzione: </b>}
+_texticoncont_ [l=it] {continuare?}
+
+_textltwarning_ [l=it] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_ mostrare il testo qui significa una
+grande quantit&agrave; di dati _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ [l=it] {vai a pagina}
+_textintro_ [l=it] { <i>(introduzione)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "titoli a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=it] {_httpimg_/it/h\_title.gif}
+_widthhtitle_ [l=it] {200}
+_heighthtitle_ [l=it] {57}
+
+## "autori a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=it] {_httpimg_/it/h\_auth.gif}
+_widthhauth_ [l=it] {200}
+_heighthauth_ [l=it] {57}
+
+## "oggetto" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=it] {_httpimg_/it/h\_subj.gif}
+_widthhsubj_ [l=it] {200}
+_heighthsubj_ [l=it] {57}
+
+## "destinatario" ## green_title ## h_to ##
+_httpiconhto_ [l=it] {_httpimg_/it/h\_to.gif}
+_widthhto_ [l=it] {200}
+_heighthto_ [l=it] {57}
+
+## "mittente" ## green_title ## h_from ##
+_httpiconhfrom_ [l=it] {_httpimg_/it/h\_from.gif}
+_widthhfrom_ [l=it] {200}
+_heighthfrom_ [l=it] {57}
+
+## "serie" ## green_title ## h_ser ##
+_httpiconhser_ [l=it] {_httpimg_/it/h\_ser.gif}
+_widthhser_ [l=it] {200}
+_heighthser_ [l=it] {57}
+
+## "date" ## green_title ## h_date ##
+_httpiconhdate_ [l=it] {_httpimg_/it/h\_date.gif}
+_widthhdate_ [l=it] {200}
+_heighthdate_ [l=it] {57}
+
+## "guide pratiche" ## green_title ## h_how ##
+_httpiconhhow_ [l=it] {_httpimg_/it/h\_how.gif}
+_widthhhow_ [l=it] {200}
+_heighthhow_ [l=it] {57}
+
+## "argomento" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=it] {_httpimg_/it/h\_topic.gif}
+_widthhtopic_ [l=it] {200}
+_heighthtopic_ [l=it] {57}
+
+## "organizzazione" ## green_title ## h_org ##
+_httpiconhorg_ [l=it] {_httpimg_/it/h\_org.gif}
+_widthhorg_ [l=it] {250}
+_heighthorg_ [l=it] {57}
+
+## "elenco" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=it] {_httpimg_/it/h\_brwse.gif}
+_widthhbrwse_ [l=it] {200}
+_heighthbrwse_ [l=it] {57}
+
+## "persone" ## green_title ## h_people ##
+_httpiconhpeople_ [l=it] {_httpimg_/it/h\_people.gif}
+_widthhpeople_ [l=it] {200}
+_heighthpeople_ [l=it] {57}
+
+## "lingua" ## green_title ## h_lang ##
+_httpiconhlanguage_ [l=it] {_httpimg_/it/h\_lang.gif}
+_widthhlanguage_ [l=it] {200}
+_heighthlanguage_ [l=it] {57}
+
+## "acronimi" ## green_title ## h_acro ##
+_httpiconhacronym_ [l=it] {_httpimg_/it/h\_acro.gif}
+_widthhacronym_ [l=it] {200}
+_heighthacronym_ [l=it] {57}
+
+## "frasi" ## green_title ## h_phrse ##
+_httpiconhphrse_ [l=it] {_httpimg_/it/h\_phrse.gif}
+_widthhphrse_ [l=it] {200}
+_heighthphrse_ [l=it] {57}
+
+## "CONTINUA?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=it] {_httpimg_/it/contof.gif}
+_httpiconconton_ [l=it] {_httpimg_/it/conton.gif}
+
+## "ESPANDI TESTO" ## document_button ## eallt ##
+_httpiconealltof_ [l=it] {_httpimg_/it/ealltof.gif}
+_httpiconeallton_ [l=it] {_httpimg_/it/eallton.gif}
+
+## "NASCONDI INDICE" ## document_button ## econc ##
+_httpiconeconcof_ [l=it] {_httpimg_/it/econcof.gif}
+_httpiconeconcon_ [l=it] {_httpimg_/it/econcon.gif}
+
+## "NUOVA FINESTRA" ## document_button ## edtch ##
+_httpiconedtchof_ [l=it] {_httpimg_/it/edtchof.gif}
+_httpiconedtchon_ [l=it] {_httpimg_/it/edtchon.gif}
+
+## "MOSTRA INDICE" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=it] {_httpimg_/it/eexpcof.gif}
+_httpiconeexpcon_ [l=it] {_httpimg_/it/eexpcon.gif}
+
+## "NASCONDI TESTO" ## document_button ## etsec ##
+_httpiconetsecof_ [l=it] {_httpimg_/it/etsecof.gif}
+_httpiconetsecon_ [l=it] {_httpimg_/it/etsecon.gif}
+
+## "EVIDENZIA" ## document_button ## ehl ##
+_httpiconehlof_ [l=it] {_httpimg_/it/ehlof.gif}
+_httpiconehlon_ [l=it] {_httpimg_/it/ehlon.gif}
+
+## "NON EVIDENZIARE" ## document_button ## enhl ##
+_httpiconenhlof_ [l=it] {_httpimg_/it/enhlof.gif}
+_httpiconenhlon_ [l=it] {_httpimg_/it/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=it] {_If_(_thislast_,risultati _thisfirst_ - _thislast_ della ricerca: _cgiargq_,Nessun risultato della ricerca: _cgiargq_)}
+_textnoquerytitle_ [l=it] {Pagina di ricerca}
+
+_texticonthispage_ [l=it] {cerca}
+_textsome_ [l=it] {_If_(_cgiargb_,posizione,almeno una delle)}
+_textall_ [l=it] {_If_(_cgiargb_,booleano,tutte le)}
+_textformsome_ [l=it] {_If_(_cgiargb_,posizione,almeno una delle)}
+_textformall_ [l=it] {_If_(_cgiargb_,naturale,tutte le)}
+_texticonqueryresultsbar_ [l=it] {}
+_texticonsearchhistorybar_ [l=it] {storico ricerca}
+
+#alt text for query buttons
+_textusequery_ [l=it] {Cerca}
+_textfreqmsg1_ [l=it] {Conteggio parole: }
+_textpostprocess_ [l=it] {_If_(_quotedquery_,<br><i>trasformata in _quotedquery_</i>
+)}
+
+_textmorethan_ [l=it] {Pi&ugrave; di }
+_textapprox_ [l=it] {Circa }
+_textnodocs_ [l=it] {Nessun documento soddisfa le condizioni.}
+_text1doc_ [l=it] {1 documento soddisfa le condizioni.}
+_textlotsdocs_ [l=it] {documenti soddisfano le condizioni.}
+_textmatches_ [l=it] {Trovati }
+_textbeginsearch_ [l=it] {Inizia ricerca}
+_textrunquery_ [l=it] {Esegui ricerca}
+_textclearform_ [l=it] {Pulisci maschera}
+
+#these go together in form search:
+#"Word or phrase  (fold, stem)  ... in field"
+_textwordphrase_ [l=it] {Parola o frase}
+_textinfield_ [l=it] {... nel campo}
+_textfoldstem_ [l=it] {(desinenza, radice)}
+
+_textadvquery_ [l=it] {O inserisci direttamente una query:}
+_textallfields_ [l=it] {Tutti i campi}
+_textand_ [l=it] {e}
+_textor_ [l=it] {o}
+_textandnot_ [l=it] {e non}
+
+# _hselection_, _jselection_, _nselection_ and _gselection_ are set from
+# within the server some or all of them may remain unset
+
+
+_textsimplesearch_ [l=it] {Cerca _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, a livello _gselection_) _If_(_nselection_, in lingua _nselection_)
+contenenti _querytypeselection_ parole specificate}
+
+_textadvancedsearch_ [l=it] {Cerca _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, a livello _gselection_)_If_(_nselection_, in lingua _nselection_)
+secondo _querytypeselection_}
+
+_textformsimplesearch_ [l=it] {Cerca _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, a livello _gselection_) _If_(_nselection_, in lingua _nselection_)
+contenenti _formquerytypeselection_ di}
+
+_textformadvancedsearch_ [l=it] {Cerca _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, a livello di _gselection_)_If_(_nselection_, in lingua _nselection_)
+e mostra i risultati in ordine _formquerytypeselection_}
+
+
+_textjselect_ [l=it] {_If_(_hselection_, di) _jselection_}
+
+_textdatesearch_ [l=it] {In questa raccolta si possono anche cercare documenti compresi in un intervallo di date o contenenti una particolare data. }
+_textstartdate_ [l=it] {Data iniziale (o  data):}
+_textenddate_ [l=it] {Data finale:}
+_textbc_ [l=it] {A.C.}
+_textad_ [l=it] {D.C.}
+_textexplaineras_ [l=it] { }
+
+_textstemon_ [l=it] { (ignora la declinazione delle parole)}
+
+_textsearchhistory_ [l=it] {Storico ricerca}
+
+#text macros for search history
+_textnohistory_ [l=it] {Storico ricerca non disponibile}
+_texthresult_ [l=it] {risultato}
+_texthresults_ [l=it] {risultati}
+_texthallwords_ [l=it] {tutte le parole}
+_texthsomewords_ [l=it] {almeno una parola}
+_texthboolean_ [l=it] {booleana}
+_texthranked_ [l=it] {classifica}
+_texthcaseon_ [l=it] {maiuscole e minuscole devono coincidere}
+_texthcaseoff_ [l=it] {maiuscole e minuscole non devono coincidere}
+_texthstemon_ [l=it] {radice}
+_texthstemoff_ [l=it] {parola intera}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "cerca" ## green_title ## h_search ##
+_httpiconhsearch_ [l=it] {_httpimg_/it/h\_search.gif}
+_widthhsearch_ [l=it] {200}
+_heighthsearch_ [l=it] {57}
+
+## "risultati" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=it] {_httpimg_/it/qryresb.gif}
+_widthqryresb_ [l=it] {_pagewidth_}
+_heightqryresb_ [l=it] {17}
+
+## "storico" ## green_bar_left_aligned ## schhistb ##
+_httpiconsrchhistb_ [l=it] {_httpimg_/it/schhistb.gif}
+_widthsrchhistb_ [l=it] {_pagewidth_}
+_heightsrchhistb_ [l=it] {17}
+
+## "mostra" ## hand_made ##
+_httpicondisplay_ [l=it] {_httpimg_/display.gif}
+_widthdisplay_ [l=it] {60}
+_heightdisplay_ [l=it] {20}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textprefschanged_ [l=it] {
+Le impostazioni sono state fissate come riportato di seguito.
+Non usare il pulsante &quot;indietro&quot; del tuo browser - le cancellerebbe!
+Fai click invece su uno dei pulsanti della barra soprastante.
+}
+_textsetprefs_ [l=it] {modifica impostazioni}
+_textsearchprefs_ [l=it] {impostazioni di ricerca}
+_textcollectionprefs_ [l=it] {impostazioni della raccolta}
+_textpresentationprefs_ [l=it] {impostazioni di visualizzazione}
+_textpreferences_ [l=it] {Impostazioni}
+_textcasediffs_ [l=it] {Maiuscole:}
+_textignorecase_ [l=it] { ignora maiuscole}
+_textmatchcase_ [l=it] { maiuscole e minuscole devono corrispondere}
+_textwordends_ [l=it] {Parole:}
+_textstem_ [l=it] { ignora la declinazione delle parole}
+_textnostem_ [l=it] { la parola completa deve corrispondere}
+_textprefop_ [l=it] {Cerca fino a _maxdocoption_ risultati, _hitsperpageoption_ per pagina.}
+_textextlink_ [l=it] {Accesso a pagine web esterne:}
+_textintlink_ [l=it] {Documenti originali presi da:}
+_textlanguage_ [l=it] {Lingua dell'interfaccia:}
+_textencoding_ [l=it] {Codifica:}
+_textformat_ [l=it] {Formato dell'interfaccia:}
+_textall_ [l=it] {tutte}
+_textquerymode_ [l=it] {Modalit&agrave; ricerca:}
+_textsimplemode_ [l=it] { ricerca semplice}
+_textadvancedmode_ [l=it] { ricerca avanzata (permette espressioni booleane che contengono !, &, |, e parentesi)}
+_textlinkinterm_ [l=it] {attraverso pagina intermedia}
+_textlinkdirect_ [l=it] {vai direttamente}
+_textdigitlib_ [l=it] {la biblioteca digitale}
+_textweb_ [l=it] {il web}
+_textgraphical_ [l=it] {Grafica}
+_texttextual_ [l=it] {Testuale}
+_textcollectionoption_ [l=it] {<p>
+Sottoraccolte da includere:
+<br>}
+_textrelateddocdisplay_ [l=it] {mostra documenti correlati}
+_textsearchhistory_ [l=it] {Storico della ricerca:}
+_texthistorydisplay_ [l=it] { mostra _historynumrecords_ elementi dello storico}
+_textnohistorydisplay_ [l=it] { non mostrare lo storico della ricerca}
+
+_texttypesearch_ [l=it] {Tipo di ricerca:}
+_texttextsearch_ [l=it] {ricerca testuale}
+_textformsearch_ [l=it] {ricerca attraverso modulo}
+_textqueryboxsize_ [l=it] {Dimensioni della casella di ricerca:}
+_textregbox_ [l=it] { casella normale}
+_textbigbox_ [l=it] { casella grande}
+_textformtype_ [l=it] {Tipo di modulo:}
+_textsimple_ [l=it] { semplice}
+_textadvanced_ [l=it] { avanzato}
+
+# used in "with 4 fields" in the form search box
+_textwith_ [l=it] {con}
+_textfields_ [l=it] {campi}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "impostazioni" ## green_title ## h_pref ##
+_httpiconhpref_ [l=it] {_httpimg_/it/h\_pref.gif}
+_widthhpref_ [l=it] {200}
+_heighthpref_ [l=it] {57}
+
+#####################################################################
+# 'browse' package for the dynamic browsing interface
+package browse
+#####################################################################
+
+_textbrowseby_ [l=it] {Elenca per}
+_textthenby_ [l=it] {quindi per}
+_textshowing_ [l=it] {mostrando}
+_textdocsperpage_ [l=it] {documenti per pagina}
+
+_textfilterby_ [l=it] {Elenca i documenti contenenti}
+_textall_ [l=it] {tutte le parole}
+_textany_ [l=it] {almeno una parola}
+_textwords_ [l=it] {}
+
+_browsebuttontext_ [l=it] {Elenco}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=it] {Aiuto}
+_textSearchshort_ [l=it] {ricerca per parole}
+_textSeriesshort_ [l=it] {elenco per serie}
+_textDateshort_ [l=it] {elenco per data di pubblicazione}
+_textSubjectshort_ [l=it] {elenco per oggetto}
+_textToshort_ [l=it] {elenco per destinatario}
+_textFromshort_ [l=it] {elenco per mittente}
+_textTitleshort_ [l=it] {elenco per titolo}
+_textBrowseshort_ [l=it] {elenco pubblicazioni}
+_textCreatorshort_ [l=it] {elenco per autore}
+_textOrganizationshort_ [l=it] {elenco per organizzazione}
+_textHowtoshort_ [l=it] {elenco per categorie di guide pratiche}
+_textTopicshort_ [l=it] {elenco per argomento}
+_textPeopleshort_ [l=it] {elenco per persone}
+_textLanguageshort_ [l=it] {elenco per lingua}
+_textAcronymshort_ [l=it] {elenco per acronimi utilizzati}
+_textPhraseshort_ [l=it] {elenco per occorrenza di frasi}
+_textdefaultshorttext_ [l=it] {classificatione non definita}
+
+_textSearchlong_ [l=it] { <p>Puoi effettuare la <i>ricerca per parole</i> nella pagina "ricerca".
+Questa &egrave; la prima pagina che ti appare e pu&ograve; essere raggiunta premendo il
+pulsante <i>cerca</i>.  }
+
+_textTitlelong_ [l=it] { <p>Puoi <i>accedere alle publicazioni per titolo</i>
+premendo il pulsante <i>titoli a-z</i>. Questo ti mostra un elenco di
+ libri in ordine alfabetico. }
+
+_textOrganizationlong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni
+per organizzazione</i> premendo il pulsante <i>organizzazione</i>.
+Questo ti mostra l'elenco delle organizzazioni.  }
+
+_textHowtolong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per categorie di guide pratiche</i>
+premendo il pulsante <i>guide pratiche</i>.
+Questo ti mostra una lista di di categorie di guide pratiche. }
+
+_textCreatorlong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per autore</i>
+premendo il pulsante <i>autori a-z</i>. Questo mostra l'elenco di libri
+ ordinati per autore. }
+
+_textTopiclong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per argomento</i>
+premendo il pulsante <i>argomento</i>.
+Questo mostra l'elenco di argomenti da scegliere. }
+
+_textSubjectlong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per oggetto</i> premendo il pulsante
+<i>oggetto</i>. Questo mostra la lista degli oggetti. }
+
+_textTolong_ [l=it] { <p>Puoi <i>accedere alle email per destinatario</i> premendo il pulsante
+<i>destinatario</i>Questo mostrer&agrave; un elenco di indirizzi.  }
+
+_textFromlong_ [l=it] { <p>Puoi <i>accedere alle email per mittente</i>
+premendo il pulsante <i>mittente</i>. Questo mostrer&agrave; l'elenco dei mittenti. }
+
+_textSerieslong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per serie</i>
+premendo il pulsante <i>serie</i>. Questo mostrer&agrave; l'elenco delle serie
+presenti nella raccolta.  }
+
+_textDatelong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni per data</i>
+premendo il pulsante <i>date</i>. Questo mostrer&agrave; l'elenco di tutti
+i documenti ordinati cronologicamente. }
+
+_textBrowselong_ [l=it] { <p>Puoi <i>visualizzare l'elenco delle pubblicazioni</i>
+premendo il pulsante <i>elenco</i>.  }
+
+_textPeoplelong_ [l=it] { <p>Puoi <i>accedere alle publicazioni in base alle persone</i>
+premendo il pulsante <i>persone a-z</i>. Questo mostrer&agrave;l'elenco delle persone
+ordinato per cognome.  }
+
+_textLanguagelong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni in base alla lingua</i>
+premendo il pulsante <i>lingua</i>. Questo mostrer&agrave; la lista dei documenti ordinati in base
+alla lingua. }
+
+_textAcronymlong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni tramite gli acronimi che vi compaiono</i>
+premendo il pulsante <i>acronimi</i>. Questo mostrer&agrave; un elenco di acronimi e dei posti dove essi compaiono.  }
+
+_textPhraselong_ [l=it] { <p>Puoi <i>accedere alle pubblicazioni tramite le frasi che vi occorrono</i>
+premendo il pulsante <i>frasi</i>.  }
+
+_textdefaultlongtext_ [l=it] { <p>Premi il pulsante <i>sconosciuto</i> per navigare tra pubblicazioni
+ordinate in base ad un campo sconosciuto.  }
+
+_texthelptopics_ [l=it] {
+<h2 align=left>Argomenti</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Come cercare particolari parole</a>
+<ul>
+  <li><a href="\#query-terms">Ricerca parole</a>
+  <li><a href="\#query-type">Tipo di ricerca</a>
+  <li><a href="\#scope-of-queries">Documenti interessati dalla ricerca</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Impostazioni relative alla raccolta</a>
+  <li><a href="\#lang-prefs">Impostazioni della lingua</a>
+  <li><a href="\#pres-prefs">Impostazioni dell'interfaccia</a>
+  <li><a href="\#search-prefs">Impostazioni della ricerca</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=it] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=it] {Come leggere i documenti}
+_booktextreadingdocs_ [l=it] {Come leggere i libri}
+_bibtextreadingdocs_ [l=it] {Informazioni su una voce della bibliografia}
+
+_texthelpreadingdocs_ [l=it] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Puoi sapere quando sei arrivato ad uno specifico documento in quanto
+il titolo e l'autore appaiono in alto a sinistra nella pagina. Inoltre
+appare il numero della pagina corrente, una casella che ti permette
+di scegliere la pagina da visualizzare e delle frecce per andare avanti ed indietro.
+
+<p>Sotto c'&egrave; il testo della sezione corrente. Sotto di esso ci sono delle
+frecce per tornare alla sezione precedente o per spostarsi alla successiva.
+
+<p>Sotto il titolo e l'autore ci sono tre pulsanti. Clicka su <i>espandi
+testo</i> per visualizzare tutto il testo del documento corrente. Se il
+documento &egrave; molto grande questo richieder&agrave; molto tempo e molta memoria!
+Clicka su <i>nuova finestra</i> per aprire una nuova finestra del browser contenente
+il documento. (Questo pu&ograve; essere utile se desideri confrontare due documenti o
+leggere pi&ugrave; di un documento alla volta.) Infine quando effettui una ricerca
+le parole cercate appaiono evidenziate, clicka su <i>non evidenziaziare</i> per rimuovere la sottolineatura.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Clicka sulla freccia per andare alla prossima sezione...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... o per tornare a quella precedente</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img
+src="_document:httpiconetsecof_" border="0"></td><td>Mostra (o no) tutto il testo</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Mostra questa pagina in una nuova finestra</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Evidenzia (o no) le parole cercate</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=it] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Puoi sapere quando sei arrivato ad uno specifico libro in quanto c'&egrave;
+una immagine della copertina in alto a sinistra nella pagina. Affianco all'immagine
+c'&egrave; l'indice del libro con una freccia che mostra in che punto ti trovi.
+L'indice si pu&ograve; espandere: clicka sulle cartelle per aprirle o chiuderle.
+Clicka sul libro aperto in alto per chiudere l'indice.
+
+<p>Sotto c'&egrave; il testo della sezione corrente.
+Ci sono delle freccce in basso per andare alla sezione successiva o alla precedente.
+
+<p>Sotto l'immagine della copertina ci sono quattro pulsanti.
+Clicka su <i>espandi
+testo</i> per visualizzare tutto il testo del documento corrente. Se il
+documento &egrave; molto grande questo richieder&agrave; molto tempo e molta memoria!
+Clicka su <i>mostra indice</i> per visualizzare tutto l'indice in modo da poter
+vedere i titoli di tutti i capitoli ed i pragrafi.
+Clicka su <i>nuova finestra</i> per aprire una nuova finestra del browser contenente
+il documento. (Questo pu&ograve; essere utile se desideri confrontare due documenti o
+leggere pi&ugrave; di un documento alla volta.) Infine quando effettui una ricerca
+le parole cercate appaiono evidenziate, clicka su <i>non evidenziaziare</i> per rimuovere l'evidenziazione.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Apri questo scaffale</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img
+src="_httpiconbook_" border="0"></td><td>Apri/chiudi questo libro</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Mostra questa sezione del testo</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img
+src="_document:httpiconetsecof_" border="0"></td><td>Mostra (o no) tutto il testo</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Mostra (o no) l'indice</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Mostra questa pagina in una nuova finestra</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Evidenzia (o no) le parole cercate</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Clicka sulla freccia per andare alla sezione successiva...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... o per tornare alla precedente</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=it] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Su alcuni dei testi citati in bibliografia sono conservate ulteriori informazioni, ad esempio un riassunto.
+Si possono riconoscere in quanto sono contraddistinti dell'icona _icontext_ anzich&egrave;
+dall'icona _iconblanktext_ .
+
+<p>Clicka sull'icona _icontext_ per ottenere ulteriori informazioni sul testo.
+
+<p>Sotto la bibliografia ci sono due pulsanti.
+Clicka su <i>nuova finestra</i> per aprire una nuova finestra del browser contenete questo libro.
+(Questo pu&ograve; essere utile se vuoi confrontare due o pi&ugrave; testi.)
+ Infine quando effettui una ricerca
+le parole cercate appaiono evidenziate, clicka su <i>non evidenziaziare</i> per rimuovere l'evidenziazione.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Mostra questa pagina in una nuova finestra</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Evidenzia (o no) le parole cercate</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=it] {
+<h2>Come cercare parole particolari</h2>
+<p>
+  Dalla pagina di ricerca, puoi cercare tramite questi semplici passi:<p>
+
+  <ol><li>Specifica in che ambito effettuare la ricerca
+      <li>Specifica se vuoi cercare tutte o alcune delle parole
+      <li>Scrivi le parole che vuoi cercare
+      <li>Clicka il pulsante <i>Ricerca</i>
+  </ol>
+
+<p>Quando effettui una ricerca, appaiono i titoli di venti documenti.
+Il pulsante in basso ti permette di visualizzare i successivi venti.
+Una volta premuto appariranno i pulsanti che ti permettono di visualizzare i
+venti documenti successivi o quelli precedenti.
+Clicka sul titolo di un documento, o sul piccolo pulsante affianco ad esso,
+per visualizzarne il contenuto.
+
+<p>Il numero massimo di documenti elencati &egrave; fissato a 100.
+Puoi modificare questo numero clickando sul pulsante <i>impostazioni</i>
+nella parte alta della pagina.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Parole da cercare</h3>
+
+<p>Qualsiasi cosa scrivi nella casella di ricerca viene interpretato come
+"parole da cercare". Ogni parola non contiene nient'altro che caratteri
+alfabetici e cifre numeriche. Le parole sono separate da spazi.
+Se altri caratteri (come i segni di punteggiatura) appaiono, questi verranno
+utilizzati per separare le parole come se fossero spazi. Non &egrave; possibile
+ricercare parole che includono segni di punteggiatura.
+
+<p>Per esempio la ricerca:<p>
+    <ul><kbd>Agro-forestry in the Pacific Islands: Systems for Sustainability (1993)</kbd></ul>
+      <p>verr&agrave; trattata come se fosse:<p>
+      <ul><kbd>Agro forestry in the Pacific Islands Systems for Sustainability 1993 </kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Tipi di ricerca</h3>
+
+<p>Ci sono due differenti tipi di ricerca:
+
+<ul>
+  <li>Ricerca di <b>tutte</b> le parole. In questo caso si cercano documenti
+  (o capitoli o titoli) che contengano tutte le parole specificate.
+  I documenti che soddisfano questa condizine sono elencati in ordine alfabetico.<p>
+
+  <li>Ricerca di <b>alcune</b> delle parole. Scrivi alcune delle parole che
+  probabilmente compariranno nei documenti che stai cercando. I documenti verranno
+  elencati in base al grado di corrispondenza alla ricerca effettuata. Nella
+  determinazione del grado di corrispondenza,
+
+      <p><ul>
+        <li> pi&ugrave; parole da cercare il documento contiene, pi&ugrave; elevato &egrave; il grado;
+        <li> le parole rare sono pi&ugrave; importanti delle parole comuni;
+        <li> i documenti corti corrispondono meglio di quelli lunghi.
+      </ul>
+</ul>
+
+<p>Usa quante parole da cercare desideri - una intera frase o anche
+un intero paragrafo. Se specifichi una sola parola i documenti saranno ordinati
+in base al numero di volte in cui occorre quella parola in ognuno.<p>
+_texthelpscope_
+}
+
+_textdatesearch_ [l=it] {Ricerca per data}
+
+_texthelpdatesearch_ [l=it] {<h2>_textdatesearch_</h2>
+La ricerca per data permette di trovare documenti che, oltre a contenere parole da cercare,
+riguardano eventi avvenuti in un certo intervallo temporale.
+Puoi cercare documenti di un certo anno o in una serie di anni.
+Nota che non &egrave; indispensabile inserire parole da cercare, puoi effettuare
+ricerche anche solo sulle date, cos&igrave; come non &egrave; necessario inserire delle date;
+se non scrivi alcuna data &egrave; come se si effettuasse una ricerca non per data.<p>
+
+<p>_iconblankbar_
+<a name=datesearch-howto>
+<h3>Come utilizzare questa funzionalit&agrave;:</h3>
+<ul>
+   <li>Come cercare documenti riguardanti un singolo anno:<p>
+   <ul>
+       <li>Scrivi le parole da cercare come faresti normalmente.
+       <li>Scrivi l'anno nella casella "Data iniziale (o data)".
+       <li>Se la data &egrave; Avanti Cristo,
+       scegli l'opzione A.C. dal menu a tendina a fianco.
+       <li>Avvia la ricerca come faresti normalmente.
+   </ul>
+<p><li>Per cercare documenti riguardanti un periodo di tempo o un intervallo di anni:<p>
+   <ul>
+       <li>Scrivi le parole da cercare come faresti normalmente.
+       <li>Scrivi la data di partenza nella casella "Data iniziale (o data)".
+       <li>Scrivi la data finale nella casella "Data finale".
+       <li>Seleziona A.C. dal menu a tendina per ogni data Avanti Cristo.
+       <li>Avvia la ricerca come faresti normalmente.
+   </ul>
+</ul><p>
+
+<p>_iconblankbar_
+<a name=datesearch-results>
+<h3>Come funziona la ricerca</h3>
+
+Generalmente una ricerca di documenti riguardanti l'anno 1903 non mostrer&agrave; quelli che, ad esempio,
+sono stati scritti nel 1903, solo i documenti che riguardano il 1903. In ogni modo, verranno trovati i documenti
+che hanno nel testo un'intervallo di date (ad esempio 1899-1911) in cui rientra il 1903, e tutti i documenti
+che hanno nel testo il nome del secolo di cui &egrave; parte il 1903 (ad esempio 20th century o twentieth century).
+Questo significa che per alcuni documenti la data ricercata potrebbe non apparire nel testo. Se si effettua la ricerca
+su di un intervallo di date, questo si applica a tutte la date nell'intervallo.<p>
+}
+
+_textchangeprefs_ [l=it] {Modificare le impostazioni}
+
+_texthelppreferences_ [l=it] {<h2>_textchangeprefs_</h2>
+
+<p>Premendo il pulsante <i>impostazioni</i> in alto nella pagina puoi modificare
+alcune caratteristiche dell'interfaccia per adattarla alle tue esigenze.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Impostazioni relative alle raccolte</h3>
+
+Alcune raccolte comprendono diverse sottoraccolte, su cui &egrave; possibile
+effettuare ricerche singolarmente o come un tutt'uno. In questi casi, nella pagina Impostazioni puoi
+scegliere quali sottoraccolte prendere in considerazione nelle ricerche.
+
+<p>_iconblankbar_
+<a name=lang-prefs>
+<h3 align=left>Impostazioni della lingua</h3>
+
+Ogni raccolta ha una lingua di presentazione predefinita, ma puoi cambiare lingua se lo desideri.
+Puoi anche cambiare il set di caratteri utilizzato da Greenstone per l'output verso il tuo browser
+-- il software ha delle opportune impostazioni predefinite ma con alcuni browser puoi ottenere una
+visualizzazione migliore cambiando il set di caratteri. Tutte le raccolte permettono di passare dall'interfaccia
+grafica standard ad una testuale. Questa &egrave; particolarmente utile per gli ipovedenti che utilizzano
+delle interfacce testuali con tipi di caratteri molto grandi oppure dei sintetizzatori vocali.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Impostazioni relative all'interfaccia</h3>
+
+A seconda della raccolta possono esserci numerose opzioni modificabili riguardanti l'interfaccia.
+
+<p>Le raccolte di pagine web ti permettono di eliminare la barra di navigazione di Greenstone che altrimenti
+appare sulla sommit&agrave; di ogni pagina, in questo modo quando effettui una ricerca trovi esattamente la pagina
+cercata senza alcuna intestazione aggiuntiva. In questo caso, per effettuare una nuova ricerca
+dovrai utilizzare il pulsante "indietro" del browser.
+Queste raccolte ti permettono anche di eliminare il messaggio di avvertimento che appare quando fai click su
+di un collegamento che ti porta direttamente sul web, fuori dalla raccolta.
+Inoltre in alcune raccolte di pagine web puoi stabilire se i link presentati nella pagina "Risultati della ricerca"
+ti portano direttamente all'URL in questione piuttosto che alla copia della pagina web presente nella
+biblioteca digitale.
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Impostazioni relative alla ricerca</h3>
+<p>Due coppie di pulsanti controlano il tipo di confronto tra parole nelle ricerche che effettui.
+La prima coppia ("sensibilit&agrave; alle maiuscole") stabilisce se le maiuscole e le minuscole devono essere
+considerate differenti nel confronto tra le parole.
+La seconda coppia ("finali delle parole") stabilisce se ignorare la declinazione delle parole nelle operazioni
+di confronto.
+E' inoltre possibile ingrandire la casella in cui inserire le parole da cercare, in modo da rendere pi&ugrave;
+semplice cercare frasi lunghe. La ricerca di grandi porzioni di testo &egrave; incredibilmente veloce.
+
+<p>Ad esempio, se i pulsanti <i>ignora maiuscole</i> ed
+<i>ignora la declinazione delle parole</i> sono selezionati, la ricerca<p>
+    <ul><kbd>Edifici africani</kbd></ul>
+      <p>sar&agrave; trattata allo stesso modo di<p>
+      <ul><kbd>africa edificio</kbd></ul><p>
+      in quanto la maiuscola in "Edifici" sar&agrave; trasformata in minuscola e le desinenze saranno rimosse
+      (NOTA DEL TRADUTTORE: quest'ultima funzionalit&agrave; potrebbe non funzionare correttamente quando
+      applicata a parole non in lingua inglese).
+
+<p>Puoi passare ad una modalit&agrave; di ricerca "avanzata" che ti permette di unire pi&ugrave; condizioni
+usando AND (&amp;), OR (|), e NOT (!).
+Questo permette di creare ricerche pi&ugrave; precise.
+Puoi abilitare o disabilitare lo storico delle ricerche, questo ti mostrer&agrave; le ultime
+ricerche effettuate rendendo pi&ugrave; semplice la ripetizione di ricerche simili tra loro.
+Infine puoi stabilire il numero massimo di documenti da trovare ed il numero massimo di documenti
+da mostrare in una schermata.
+}
+
+_texttanumbrowseoptions_ [l=it] {Ci sono _numbrowseoptions_ modi per cercare le informazioni nell'ambito di questa raccolta:}
+
+_textsimplehelpheading_ [l=it] {Come cercare le informazioni}
+
+_texthelpscope_ [l=it] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Ambito delle ricerche</h3>
+
+<p>In alcune raccolte puoi scegliere tra diversi indici per effettuare le ricerche. Ad esempio, ci possono essere
+indici sugli autori e sui titoli, oppure ci possono essere indici sui nomi dei capitoli e dei paragrafi.
+Generalmente, viene ritornato comunque l'intero documento a prescindere dall'indice su cui si &egrave; effettuata
+la ricerca.
+
+<p>Se il documento &egrave; un libro, questo verr&agrave; aperto in un punto specifico.
+}
Index: /main/tags/2.38/gsdl/macros/italian2.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/italian2.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/italian2.dm	(revision 21083)
@@ -0,0 +1,130 @@
+######################################################################
+#
+# Traduzione italiana a cura di Marco Michelino michelinux@tin.it
+#
+######################################################################
+
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_documents_ [l=it] { documenti. }
+_lastupdate_ [l=it] {Ultima modifica}
+_ago_ [l=it] {giorni fa.}
+_colnotbuilt_ [l=it] {Raccolta non costruita.}
+
+_textpagetitle_ [l=it] {Greenstone Digital Library}
+
+_textpoem_ [l=it] {
+<br><h2>Kia papapounamu te moana</h2>
+
+<p>kia hora te marino,
+<br>kia tere te karohirohi,
+<br>kia papapounamu te moana
+
+<p>possano la pace e la calma circondarti,
+<br>possa tu vivere nel calore della foschia estiva,
+<br>possa l'oceano in cui tu viaggi essere levigato come la nefrite.
+}
+
+_textgreenstone_ [l=it] {
+<p>La nefrite (greenstone) &egrave; una pietra semi-preziosa che (come questo software) viene dalla Nuova Zelanda.
+Nella societ&agrave; tradizionale dei Maori era la pi&ugrave; costosa ed ambita di tutte le sostanze. Essa pu&ograve;
+assorbire e conservare lo <i>wairua</i>, lo spirito della forza vitale, ed &egrave; dotata di virt&ugrave; tradizionali
+che la rendono un emblema appropriato per una biblioteca digitale di pubblico dominio.
+Il suo splendore &egrave; simbolo di carit&agrave;; la sua trasparenza, di onest&agrave;; la sua durezza, di coraggio;
+ed i bordi taglienti che pu&ograve; avere, di giustizia.
+La pietra lavorata utilizzata come logo del software Greenstone Digital Library &egrave; un <i>patu</i>
+o mazza da guerra, ed &egrave; un cimelio di famiglia di uno dei membri del progetto.
+Nel combattimento corpo a corpo il suo colpo &egrave; molto veloce e preciso. A noi piace pensare
+che queste qualit&agrave; si applicano anche al nostro software, il bordo del <i>patu</i> tagliente come un rasoio
+simboleggia il vertice della tecnologia.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "scegli una raccolta" ## green_bar_left_aligned ## selcolgr ##
+_httpiconselcolgr_ [l=it] {_httpimg_/it/selcolgr.gif}
+_widthselcolgr_ [l=it] {537}
+_heightselcolgr_ [l=it] {17}
+_altselcolgr_ [l=it] {"Scegli una raccolta"}
+
+
+
+######################################################################
+# external link package
+package extlink
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textextlink_ [l=it] {Collegamento esterno}
+_textlinknotfound_ [l=it] {Collegamento interno non trovato}
+
+_textextlinkcontent_ [l=it] {Il collegamento che hai selezionato &egrave; esterno alle raccolte correntemente selezionate da te.
+Se desideri ugualmente seguire questo collegamento ed il tuo browser ha accesso al web, puoi
+<a href="_nexturl_">proseguire</a> altrimenti usa il pulsante "indietro" del browser per tornare al documento
+precedente.}
+
+_textlinknotfoundcontent_ [l=it] {Per ragioni aldil&agrave; del nostro controllo il link interno che hai selezionato
+non esiste. Questo probabilmente &egrave; dovuto ad un errore nel documento originale. Usa il pulsante "indietro" del
+browser per tornare al documento preccedente.}
+
+# should have arguments of collection, collectionname and link
+_foundintcontent_ [l=it] {
+
+<h3>Collegamento alla raccolta "_2_"</h3>
+
+<p> Il collegamento che hai selezionato &egrave; esterno alla raccolta "_collectionname_" (esso porta alla raccolta
+"_2_"). Se desideri seguire questo collegamento verso la raccolta "_2_" puoi
+<a href="_httpdoc_&c=_1_&cl=_cgiargcl_&d=_3_">proseguire</a> verso questa pagina; altrimenti usa il pulsante "indietro"
+del browser per tornare al documento precedente.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+
+######################################################################
+# authentication page
+package authen
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textGSDLtitle_ [l=it] {Greenstone Digital Library}
+
+_textusername_ [l=it] {nome utente}
+_textpassword_ [l=it] {password}
+
+_textmessageinvalid_ [l=it] {La pagina che hai richiesto necessita di autenticazione.<br>
+_If_(_cgiargug_,[Nota che devi appartenere al gruppo "_cgiargug_" per accedere a questa pagina]<br>)
+Inserisci nome e password.}
+
+_textmessagefailed_ [l=it] {Il tuo nome o la tua password sono errati.}
+
+_textmessagedisabled_ [l=it] {Spiacente, il tuo account &egrave; stato disabilitato. Contatta il webmaster di questo sito.}
+
+_textmessagepermissiondenied_ [l=it] {Spiacente, non hai il permesso di accedere a questa pagina.}
+
+_textmessagestalekey_ [l=it] {La pagina &egrave; scaduta. Inserisci la password per accedere a questa pagina.}
Index: /main/tags/2.38/gsdl/macros/maori.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/maori.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/maori.dm	(revision 21083)
@@ -0,0 +1,401 @@
+######################################################################
+#
+# Maori Language text and icon macros 
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textimagehelp_ [l=mi] {Te whÄrangi whakamÄrama}
+_textimagepref_ [l=mi] {Te whÄrangi o ngÄ whiriwhiringa}
+_textimagehome_ [l=mi] {Te whÄrangi kÄinga}
+_textimagesearch_ [l=mi] {rapua he kupu}
+
+_page_ [l=mi] {whÄrangi }
+_pages_ [l=mi] {whÄrangi}
+_vol_ [l=mi] {Pukapuka}
+_num_ [l=mi] {Nama}
+_textmonth01_ [l=mi] {Hanuere}
+_textmonth02_ [l=mi] {Pepuere}
+_textmonth03_ [l=mi] {Maehe}
+_textmonth04_ [l=mi] {Aperira}
+_textmonth05_ [l=mi] {Mei}
+_textmonth06_ [l=mi] {Hune}
+_textmonth07_ [l=mi] {Hurae}
+_textmonth08_ [l=mi] {Akuhata}
+_textmonth09_ [l=mi] {Hepetema}
+_textmonth10_ [l=mi] {Oketopa}
+_textmonth11_ [l=mi] {Noema}
+_textmonth12_ [l=mi] {Tihema}
+_of_ [l=mi] { i te }
+
+
+_texticontabsearchgreen_ [l=mi] {rapu}
+_texticontabseriesgreen_ [l=mi] {whakarÄrangi niupepa}
+_texticonnext_ [l=mi] {titiro ki te whÄrangi o muri}
+_texticonprev_ [l=mi] {titiro ki te whÄrangi o mua}
+_texticontext_ [l=mi] {Tirohia te whÄrangi}
+
+_textimageSeries_ [l=mi] {Tirohia te whakarÄrangi taitara}
+_textimageDate_ [l=mi] {Tirohia te whakarÄrangi wÄtaka}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconchomeof_ [l=mi] {_httpimg_/mi/chomeof.gif}
+_httpiconchomeon_ [l=mi] {_httpimg_/mi/chomeon.gif}
+
+_httpiconchelpof_ [l=mi] {_httpimg_/mi/chelpof.gif}
+_httpiconchelpon_ [l=mi] {_httpimg_/mi/chelpon.gif}
+
+_httpiconcprefof_ [l=mi] {_httpimg_/mi/cprefof.gif}
+_httpiconcprefon_ [l=mi] {_httpimg_/mi/cprefon.gif}
+
+_httpicontsergr_ [l=mi] {_httpimg_/mi/tsergr.gif}
+_httpicontserof_ [l=mi] {_httpimg_/mi/tserof.gif}
+_httpicontseron_ [l=mi] {_httpimg_/mi/tseron.gif}
+_widthtserx_ [l=mi] {114}
+
+_httpicontdategr_ [l=mi] {_httpimg_/mi/tdategr.gif}
+_httpicontdateof_ [l=mi] {_httpimg_/mi/tdateof.gif}
+_httpicontdateon_ [l=mi] {_httpimg_/mi/tdateon.gif}
+
+_httpicontsrchgr_ [l=mi] {_httpimg_/mi/tsrchgr.gif}
+_httpicontsrchof_ [l=mi] {_httpimg_/mi/tsrchof.gif}
+_httpicontsrchon_ [l=mi] {_httpimg_/mi/tsrchon.gif}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=mi] {He kupu whakamÄrama i te kohikohinga niupepa}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconhabout_ [l=mi] {_httpimg_/mi/h\_about.gif}
+_widthhabout_ [l=mi] {262}
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticondetach_ [l=mi] {Huakina mai he matapihi hou kia noho motuhake ai tÄnei kÅrero}
+_texticonexpandtext_ [l=mi] {Titiro ki ngÄ kupu katoa o tÄnei niupepa}
+_texticoncontracttext_ [l=mi] {Titiro ki ngÄ kupu o tÄnei whÄrangi anake}
+_texticonopenbookshelf_ [l=mi] {kÄtia}
+_texticonclosedbookshelf_ [l=mi] {whakatÅ«whera mai}
+_texticonclosedbook_ [l=mi] {whakatÅ«whera mai}
+_texticonopenbook_ [l=mi] {kÄtia}
+_texticonpointer_ [l=mi] {wÄhanga e tiro ana}
+_texticonhighlight_ [l=mi] {Kia pÅ«kaha ngÄ kupu rapu}
+_texticonnohighlight_ [l=mi] {Kia kore he pÅ«kaha}
+_texticonsmalltext_ [l=mi] {He whÄrangi niupepa}
+_texticonclosedfolder_ [l=mi] {He kÅpaki}
+
+_textgoto_ [l=mi] {poka noa ki}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconhser_ [l=mi] {_httpimg_/mi/h\_ser.gif}
+_widthhser_ [l=mi] {220}
+
+_httpiconhdate_ [l=mi] {_httpimg_/mi/h\_date.gif}
+
+_httpiconealltof_ [l=mi] {_httpimg_/mi/ealltof.gif}
+_httpiconeallton_ [l=mi] {_httpimg_/mi/eallton.gif}
+
+_httpiconedtchof_ [l=mi] {_httpimg_/mi/edtchof.gif}
+_httpiconedtchon_ [l=mi] {_httpimg_/mi/edtchon.gif}
+
+_httpiconetsecof_ [l=mi] {_httpimg_/mi/etsecof.gif}
+_httpiconetsecon_ [l=mi] {_httpimg_/mi/etsecon.gif}
+
+_httpiconehlof_ [l=mi] {_httpimg_/mi/ehlof.gif}
+_httpiconehlon_ [l=mi] {_httpimg_/mi/ehlon.gif}
+
+_httpiconenhlof_ [l=mi] {_httpimg_/mi/enhlof.gif}
+_httpiconenhlon_ [l=mi] {_httpimg_/mi/enhlon.gif}
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+######################################################################
+# 'help' page
+package help
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texttanumbrowseoptions_ [l=mi] {E _numbrowseoptions_ ngÄ huarahi hei rapu kÅrero i te kohikohinga niupepa:}
+
+_textHelp_ [l=mi] {Äwhina}
+_textSearchshort_ [l=mi] {rapua he kupu}
+
+_textSeriesshort_ [l=mi] {tirohia te whakarÄrangi taitara}
+
+_textDateshort_ [l=mi] {tirohia te whakarÄrangi e pÄ ana ki te wÄ}
+
+
+_textSearchlong_ [l=mi] {
+<p>Ko te whÄrangi rapu te whÄrangi <i>e rapu atu ai ngÄ kupu</i> i roto
+i ngÄ tuhinga. Kia puta mai ai tÄnei whÄrangi, i a koe e titiro ana ki 
+te kohinga niupepa nei pÄwhiritia te pÄtene <i>rapu</i>.
+}
+
+
+_textSerieslong_ [l=mi] {
+<p>Kia <i>tirohia te whakarÄrangi taitara</i> pÄwhiritia te pÄtene 
+<i>whakarÄrangi taitara</i>. Ka puta mai te whakarÄrangi o ngÄ
+niupepa e pÄ ana ki ngÄ taitara.
+}
+
+_textDatelong_ [l=mi] {<p>Kia <i>tirohia te whakarÄrangi e pÄ ana ki te wÄ</i> pÄwhiritia te
+pÄtene <i>wÄtaka</i>. Ka puta mai te whakarÄrangi o ngÄ niupepa
+e pÄ ana ki te wÄ i puta mai ai aua niupepa.
+}
+
+_texthelptopics_ [l=mi] {
+<h2 align=left>Kaupapa</h2>
+<ul>
+  <li><a href="\#finding-information">NgÄ huarahi hei rapu kÅrero</a>
+  <li><a href="\#reading-books">Te pÄnui niupepa/kupu whakataki</a>
+  <li><a href="\#searching">Te rapu kupu</a>
+<ul>
+  <li><a href="\#query-terms">NgÄ kupu hei rapu</a>
+  <li><a href="\#query-type">NgÄ tÅ«momo rapu</a>
+  <li><a href="\#scope-of-queries">Te whÄnui o te rapu</a>
+  <li><a href="\#stemming">NgÄ pÅ« matua, pÅ« iti me ngÄ kÅ«muri hoki</a>
+</ul>
+</ul>
+}
+
+_texthelpsearching_ [l=mi] {
+<h2>Te rapu kupu</h2>
+<p>
+  Ko te whÄrangi rapu te whÄrangi hei rapu kupu. Ka puta mai taua whÄrangi ka
+  whai mai Änei kÅkiri kia rapu ai i (t)Ätehi kupu:<p>	
+
+  <ol><li>KÅwhiritia ko ngÄ niupepa, ko ngÄ kupu whakataki rÄnei, 
+	ko ngÄ rÄpopoto reo PÄkehÄ, ko aua mea e toru rÄnei
+      <li>KÅwhiritia ko Ätehi o ngÄ kupu rapu, ko te katoa rÄnei o ngÄ
+          kupu rapu
+      <li>Tuhia ngÄ kupu rapu
+      <li>PatÅhia te pÄtene <i>Rapua</i>
+  </ol>
+<p>Ka tukua te rapu ka hoki mai ngÄ pukapuka rua tekau e pÄ ana ki Äu kupu rapu.
+He pÄtene kei raro rÄ o te whÄrangi hei titiro ai ki ngÄ pukapuka 21 ki te
+40 e pÄ ana ki Äu kupu rapu. MÄ Änei pÄtene kei raro rÄ ka taea
+te tirohia te katoa o ngÄ whÄrangi e pÄ ana ki tÄu i rapu ai.
+
+<p>Ka kore e nuku atu i te 100 o ngÄ pukapuka ka kitea i tÄtehi rapunga. Heoi anÄ
+ka taea te whakarerekÄ tÄnei nama i te whÄrangi whiriwhiringa.
+
+<p>
+<a name=query-terms>
+_iconblankbar_<br>
+
+<h3>NgÄ kupu hei rapu</h3>
+
+<p>Koia nei ngÄ kupu ka tuhia ki roto i te pouaka rapu. Me tuhi ko ngÄ reta me ngÄ
+nama anakÄ. Kaua e tuhia ngÄ tohu tÅ, he uaua te kite i ngÄ tohu tÅ i roto 
+i ngÄ niupepa. Me noho te mokowÄ (wÄhi wÄtea) i waenganui i ngÄ kupu.
+Kaua e tuhi ngÄ tohutuhi (pÄrÄ i te "?" me te "/"), ka tangohia aua tohu e te
+rorohiko nei, ka whakauru ko te mokowÄ.
+
+<p>Hei tauira, ki te tuhi atu i Änei kupu rapu;
+    <ul><kbd>huihuinga-a-motu / Whanganui (1860-1885)</kbd></ul>
+       <p>ka rapua kÄtia e te rorohiko Änei kupu;
+    <ul><kbd>huihuinga a motu Whanganui 1860 1885</kbd></ul><p>
+
+<p>
+<a name=query-type>
+_iconblankbar_<br>
+
+<h3>NgÄ TÅ«momo Rapu</h3>
+
+<p><ul>E rua ngÄ tÅ«momo rapu<p>
+
+  <li>Ka rapua te <b>katoa</b> o Äu kupu rapu. Ka rapua ngÄ pukapuka e mau ana i te katoa
+      o ngÄ kupu rapu kua tuhia e koe. Ka whakaatu mai aua pukapuka e pÄ ana ki te 
+      whakarÄrangi-Ä-pÅ«.
+
+  <li>Ka rapua <b>Ätehi</b> o Äu kupu rapu. NÅ reira, me tuhi noa he kupu e pÄ
+      ana ki te kaupapa e hiahia ana koe. Ka whakarÄrangitia ngÄ pukapuka e pÄ ana
+      ki te ritenga ki Äu kupu rapu. ArÄ, ka puta tuatahitia mai ngÄ pukapuka;	 
+
+      <p><ul>
+        <li> e mau ana i te maha o Äu kupu rapu;
+        <li> e mau ana i ngÄ kupu uaua te kite o Äu kupu rapu;
+        <li> e iti ana, ka whai mai ko ngÄ pukapuka nui.
+      </ul>
+
+      <p>Me tuhi i te maha o ngÄ kupu rapu kia arahina te rapu ki tÅ ake hiahia.
+</ul>
+
+<p>
+<a name=other-options><a name=scope-of-queries>
+_iconblankbar_<br>
+
+_texthelpscope_
+
+<h3 align=left>NgÄ pÅ« matua, pÅ« iti me ngÄ kÅ«muri hoki</h3>
+
+<p>PatÅhia te pÄtene whiriwhiringa kia puta mai ai te whÄrangi e pÄ
+ana ki ngÄ pÅ« matua, pÅ« iti me ngÄ kÅ«muri hoki. Ka hÄngai
+te whiriwhiringa tuatahi ki ngÄ pÅ« matua me ngÄ pÅ« iti. Äe
+rÄnei, me tika te pÅ« matua me te pÅ« iti, kÄore rÄnei, hei aha
+te Äta titiro ki ngÄ pÅ« matua me ngÄ pÅ« iti. Ka hÄngai te
+whiriwhiringa tuarua ki ngÄ kÅ«muri o te kupu. Äe rÄnei, me tino
+Årite te kÅ«muri, kÄore rÄnei, hei aha te Äta titiro ki ngÄ 
+kÅ«muri o ngÄ kupu. MÅ ngÄ kupu PÄkehÄ anakÄ te 
+whiriwhiringa kÅ«muri.
+
+<p>Hei tauira, mehemea ka kÅwhiritia te <i>hei aha te pÅ« matua me te pÅ«
+iti</i>, Ä, ka kÅwhiritia hoki te <i>hei aha te kÅ«muri o te kupu</i>
+kÄtahi ka tukua Änei kupu hei rapu;
+<p>
+  <ul><kbd>Aotearoa building</kbd></ul>
+    <p>ka Årite te whakahoki mai o ngÄ pukapuka ki Änei kupu rapu
+  <ul><kbd>aotearoa builds</kbd></ul>
+<p>ka pÄnei i te mea, kÄore te rapu i te Äta titiro mehemea he pÅ«
+matua, he pÅ« iti rÄnei, Ä, ka tangohia ngÄ kÅ«muri (pÄrÄ
+i te "ing", me te "s") i tÄnei whiriwhiringa.
+
+}
+
+_textsimplehelpheading_ [l=mi] {NgÄ huarahi hei rapu kÅrero}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconhhelp_ [l=mi] {_httpimg_/mi/h\_help.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonthispage_ [l=mi] {rapu}
+_textsome_ [l=mi] {Ätehi}
+_textall_ [l=mi] {_If_(_cgiargb_,te boolean,te katoa)}
+_textbeginsearch_ [l=mi] {Rapua}
+_textfreqmsg1_ [l=mi] {Kia hia ngÄ kupu: }
+_textmorethan_ [l=mi] {Neke atu i te }
+_textnodocs_ [l=mi] {kÄore he pukapuka e pÄ ana ki Äu kupu rapu.}
+_text1doc_ [l=mi] {1 te pukapuka e pÄ ana ki Äu kupu rapu.}
+_textlotsdocs_ [l=mi] {ngÄ pukapuka e pÄ ana ki Äu kupu rapu.}
+_textmatches_ [l=mi] {Kitenga }
+_textstemon_ [l=mi] { (hei aha te kÅ«muri)}
+
+_textsimplesearch_ [l=mi] {Tirohia ki _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in _nselection_ language) mÅ _querytypeselection_ o ngÄ kupu}
+
+_textadvancedsearch_ [l=mi] {Tirohia ki _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_nselection_, in _nselection_ language) 
+mÅ _querytypeselection_ o ngÄ kupu}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconhsearch_ [l=mi] {_httpimg_/mi/h\_search.gif}
+
+_httpiconqryresb_ [l=mi] {_httpimg_/mi/qryresb.gif}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textsetprefs_ [l=mi] {whakamaua}
+_textsearchprefs_ [l=mi] {Whiriwhiringa Rapu}
+_textpresentationprefs_ [l=mi] {Whiriwhiringa Whakaaturanga}
+_textpreferences_ [l=mi] {Whiriwhiringa}
+_textcasediffs_ [l=mi] {PÅ« matua me te pÅ« iti:}
+_textignorecase_ [l=mi] { hei aha te pÅ« matua me te pÅ« iti}
+_textmatchcase_ [l=mi] { me tika te pÅ« matua me te pÅ« iti}
+_textwordends_ [l=mi] {KÅ«muri:}
+_textstem_ [l=mi] { hei aha te kÅ«muri}
+_textnostem_ [l=mi] { me tika te kÅ«muri}
+_textprefop_ [l=mi] {Whakahokia mai te _maxdocoption_ kupu, Ä, kia _hitsperpageoption_ kupu ki ia whÄrangi.}
+_textlanguage_ [l=mi] {Reo: }
+_textencoding_ [l=mi] {Whakatakotoranga pÅ«: }
+_textformat_ [l=mi] {Whakatakotoranga whÄrangi: }
+_textquerymode_ [l=mi] {TÅ«momo rapu:}
+_textsimplemode_ [l=mi] {te rapu ngÄwari}
+_textadvancedmode_ [l=mi] {te rapu matatau (ka taea te whakamahi i ngÄ pÅ« boolean, 
+pÄrÄ i te '!', '&', '|', me te '()' hoki)}
+_textgraphical_ [l=mi] {Whakaahua}
+_texttextual_ [l=mi] {KÄore he whakaahua}
+
+_textsearchhistory_ [l=mi] {HÄ«tori rapu:}
+_texthistorydisplay_ [l=mi] { whakaatu mai kia _historynumrecords_ ngÄ rapunga kua tukua}
+_textnohistorydisplay_ [l=mi] { kaua e whakaatu mai i te hÄ«tori rapu}
+
+
+_textqueryboxsize_ [l=mi] {Pouaka rapu:}
+_textregbox_ [l=mi] { pouaka rapu iti}
+_textbigbox_ [l=mi] { pouaka rapu nui}
+
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+_httpiconhpref_ [l=mi] {_httpimg_/mi/h\_pref.gif}
+_widthhpref_ [l=mi] {220}
Index: /main/tags/2.38/gsdl/macros/nzdlhome.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/nzdlhome.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/nzdlhome.dm	(revision 21083)
@@ -0,0 +1,377 @@
+# nzdlhome.dm
+#
+# This file defines the homepage of the New Zealand Digital Library Project
+# as it appears on Http://www.nzdl.org. It is designed to override the default
+# homepage (defined in home.dm), so it should appear last in the "macrofiles"
+# section of the main.cfg file.
+#
+
+package home
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. this is overridden here as we don't want 'home' 
+# links on this page
+
+_javalinks_ {}
+_javalinks_ [v=1] {}
+
+
+
+#######################################################################
+# icons
+#######################################################################
+
+_iconnzdl_ {<img src="_httpiconnzdl_" width=_widthnzdl_ height=_heightnzdl_ alt="The New Zealand Digital Library">}
+_icongbull_ {<img src="_httpicongbull_">}
+_iconpdf_ {<img src="_httpiconpdf_">}
+
+_iconselectcollection_ {<img src="_httpiconselcolgr_" width=_widthselcolgr_ height=_heightselcolgr_ alt=_altselcolgr_>}
+
+## "reference collections" ## green_bar_left_aligned ## selcolrf ##
+_httpiconselcolrf_ {_httpimg_/selcolrf.gif}
+_widthselcolrf_ {537}
+_heightselcolrf_ {17}
+_altselcolrf_ {"Reference collections"}
+
+## "humanitarian and UN collections" ## green_bar_left_aligned ## selcolun ##
+_httpiconselcolun_ {_httpimg_/selcolun.gif}
+_widthselcolun_ {537}
+_heightselcolun_ {17}
+_altselcolun_ {"Humanitarian and UN collections"}
+
+## "demonstration collections" ## green_bar_left_aligned ## selcolde ##
+_httpiconselcolde_ {_httpimg_/selcolde.gif}
+_widthselcolde_ {537}
+_heightselcolde_ {17}
+_altselcolde_ {"Demonstration collections"}
+
+_iconselectrf_ {<img src="_httpiconselcolrf_" width=_widthselcolrf_ height=_heightselcolrf_ alt=_altselcolrf_>}
+_iconselectun_ {<img src="_httpiconselcolun_" width=_widthselcolun_ height=_heightselcolun_ alt=_altselcolun_>}
+_iconselectde_ {<img src="_httpiconselcolde_" width=_widthselcolde_ height=_heightselcolde_ alt=_altselcolde_>}
+
+_iconmusiclibrary_ {<img src="_httpicontmusic_" border=1 alt="meldex music library">}
+
+
+#######################################################################
+# http macros 
+#
+# These contain the url without any quotes
+#######################################################################
+
+_httpicongbull_ {_httpimg_/gbull.gif}
+
+_httpiconpdf_ {_httpimg_/pdf.gif}
+
+_httpicontmusic_ {_httpimg_/meldexsm.gif}
+
+
+#######################################################################
+# page content                     
+#######################################################################
+
+_pagetitle_ {_textpagetitle_}
+_imagethispage_ {}
+_imagecollection_ {<center>_iconnzdl_</center>}
+
+_content_ {
+_nzdlcollectionlist_
+<center>_iconblankbar_</center>
+
+<p><center><h2>_textprojhead_</h2></center>
+
+<table border=0 cellpadding=5>
+
+<tr valign=top>
+<td>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="mailto:_mailaddr_">Feedback</a></td></tr></table>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.nzdl.org/html/people.html">People</a></td></tr></table>
+</td>
+<td>_textprojinfo_</td>
+</tr>
+
+<tr>
+<td></td>
+<th align=left>_titlesoftwareinfo_</th>
+</tr>
+<tr valign=top>
+<td>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="_httppagex_(gsdl)">About<br>Greenstone</a></td></tr></table>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.cs.waikato.ac.nz/~nzdl/gsdl-docs/Download.html">Download<br>Greenstone</a></td></tr></table>
+<!--<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.nzdl.org/gsdl-docs/Download.html">Download<br>Greenstone</a></td></tr></table>-->
+
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://prdownloads.sourceforge.net/greenstone/Install.pdf">Installer's<br>Guide</a></td><td><img src="http://www.nzdl.org/images/new2.gif"></td></tr></table>
+
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://prdownloads.sourceforge.net/greenstone/User.pdf">User's<br>Guide</a></td><td><img src="http://www.nzdl.org/images/new2.gif"></td></tr></table>
+
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://prdownloads.sourceforge.net/greenstone/Developer.pdf">Developer's<br>Guide</a></td><td><img src="http://www.nzdl.org/images/new2.gif"></td></tr></table>
+
+<table><tr valign=middle><td>_icongbull_</td><td><a href="mailto:majordomo@colosys.net?body=subscribe greenstone">Subscribe to<br>Mailing List</a></td></tr></table>
+
+</td>
+<td>_textsoftwareinfo_</td>
+</tr>
+
+<tr>
+<td></td>
+<th align=left>_titleresearchinfo_</th>
+</tr>
+<tr valign=top>
+<td>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.nzdl.org/html/research.html">Research</a></td></tr></table>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.nzdl.org/html/projects.html">Projects</a></td></tr></table>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.nzdl.org/html/software.html">Software<br>Downloads</a></td></tr></table>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://www.cs.waikato.ac.nz/~nzdl/publications/">Publications</a></td></tr></table>
+</td>
+<td>_textresearchinfo_</td>
+</tr>
+
+<tr valign=top>
+<td>
+<table><tr valign=middle><td>_icongbull_</td><td><a href="http://nzdl2.cs.waikato.ac.nz/cgi-bin/zdemo/library">Z39.50<br>demo</a></td></tr></table>
+</td><td>
+We have an experimental facility for searching Z39.50 collections using
+Greenstone.  Ultimately we plan a full bibliographic search facility, with
+the ability to combine tests on different fields, and to be able to search
+multiple collections, including cross-searching Greenstone and Z39.50
+collections.
+</td>
+</tr>
+
+<tr>
+<td></td>
+<th align=left>_titleaffiliateinfo_</th>
+</tr>
+<tr valign=top>
+<td>
+<img src="_httpimg_/ghproj.jpg" alt="Global Help Projects" width=100 height=90>
+</td>
+<td>_textaffiliateinfo_</td>
+</tr></table></p>
+
+_iconblankbar_
+<table>
+<tr valign=top>
+<td>_textpoem_</td>
+<td>_imagegreenstone_</td>
+</tr></table>
+<p>_textgreenstone_
+
+<p>
+_nzdlpagefooter_ 
+<br>April 2000
+}
+
+
+
+#######################################################################
+# English language text macros
+#######################################################################
+_textpagetitle_ {New Zealand Digital Library}
+_textprojhead_ {The New Zealand Digital Library Project}
+
+_textprojinfo_ {
+<p>
+The New Zealand Digital Library project is a research programme at
+The University of Waikato whose aim is to develop the underlying
+technology for digital libraries and make it available publicly so that
+others can use it to create their own collections. 
+<p>
+Our web site provides several document collections, including historical
+documents, humanitarian and development information, computer
+science technical reports and bibliographies, literary works, and
+magazines. All are available over the Web, and can be accessed
+through searching and browsing interfaces provided by the
+Greenstone digital library software. Behind the query interface lies a
+huge collection providing gigabytes of information. We hope you find
+what you want, or at least something intriguing!
+}
+
+_titlesoftwareinfo_ {The Greenstone software}
+
+_textsoftwareinfo_ {
+<p>
+The Greenstone Digital Library software provides a new way of
+organizing information and making it available over the Internet or on
+CD-ROM. It is open-source software, available under the terms of the
+Gnu public license. 
+<p>
+A digital library is made up of a set of collections. Each collection of
+information comprises several (typically several thousand, or even
+several million) documents, which share a uniform searching and
+browsing interface. Collections can be organized in many different
+ways while retaining a strong family resemblance. 
+
+<p>To subscribe to the Greenstone mailing list mail <a
+href="mailto:majordomo@colosys.net?body=subscribe greenstone">majordomo@colosys.net
+</a> with "subscribe greenstone" in the <u>body</u> of the message.
+
+<p align=right>
+<a href="_httppagex_(gsdl)">More...</a>
+}
+
+_titleresearchinfo_ {Our research}
+
+_textresearchinfo_ {
+<p>
+The goal of our research program is to explore the potential of
+internet-based digital libraries. Our vision is to develop systems that
+automatically impose structure on anarchic, uncatalogued, distributed
+repositories of information, thereby providing information consumers
+with effective tools to locate what they need and to peruse it
+conveniently and comfortably. 
+<p>
+Project members are actively working on techniques for creating,
+managing, and and mainatining collections; extracting metadata from
+legacy documents; analysing library usage and user needs; Maori,
+Arabic and Chinese language systems; internationalising the library
+interface; optical music recognition and musical collections; novel
+interfaces for formulating queries and visualising results; novel
+interfaces for browsing metadata; text mining for keyphrases,
+acronyms, and other metadata; keyphrase extraction and
+phrase-based browsing; and other research topics. 
+<p align=right>
+<a href="http://www.nzdl.org/html/research.html">More...</a>
+}
+
+_titleaffiliateinfo_ {Our affiliates}
+
+_textaffiliateinfo_ {
+<p>
+<a href="http://www.globalprojects.org">Global Help Projects</a>
+is a registered charity responsible for the
+Humanity Libraries Project that provides universal low-cost
+information access through co-operation between UN Agencies,
+universities and NGOs. Global Help Projects collaborate extensively
+with the NZDL project, and use the Greenstone software. 
+<p>
+<a name="mirrors"></a>
+The following websites are among those currently using Greenstone,
+either to make their own collections available, 
+or to mirror New Zealand Digital Library content.
+Some are still under development.
+<ul>
+<li><a href="http://gov.mari.ru/gsdl/">Mari El Republic (Russian federation)</a>
+<li><a href="http://public.ibiblio.org/gsdl/cgi-bin/library.cgi?a=p&p=about&c=gberg">Project Gutenberg Mirror at ibiblio.org</a>
+<li><a href="http://canada.nzdl.org/~nzdl/cgi-bin/library">Canadian Mirror (CISTI)</a>
+<li><a href="http://linux.payson.tulane.edu/cgi-bin/library">Payson Center, Tulane University</a>
+<!--<li><a href="http://gene.rutgers.edu/cgi-bin/library">Rutgers University</a>-->
+<li><a href="http://csdl1.mdx.ac.uk/">Middlesex University</a>
+<li><a href="http://laraine.unidata.ucar.edu/projects/coohl/htdig/cgi-bin/library">Unidata</a>
+<li><a href="http://greenstone.cs.uct.ac.za/">University of Capetown mirror</a>
+</ul> 
+}
+
+
+#######################################################################
+# The collection display
+# A hand-crafted alternative to the _homeextra_ macro
+#######################################################################
+
+_nzdlgwcgi_ {library}
+#_nzdlgwcgi_ {http://www.nzdl.org/cgi-bin/library}
+_nzdlhttpprefix_ {http://www.nzdl.org/gsdl}
+
+_nzdlcollection_ {library?a=p&p=about&c=_1_}
+#_nzdlcollection_ {http://www.nzdl.org/cgi-bin/library?a=p&p=about&c=_1_}
+_nzdlcollectionimage_ {<img width=150 border=1 src="_nzdlhttpprefix_/collect/_1_/images/_2_" alt=_3_>}
+
+_collectionlink_ {<a href="_nzdlcollection_(_4_)">_nzdlcollectionimage_(_1_,_2_,_3_)</a>}
+
+
+_nzdlcollectionlist_ {
+<center>
+<p>_iconselectrf_
+<p>_collectactive_
+<p>_iconselectun_
+<p>_collectfao_
+<p>_iconselectde_
+<p>_collectrest_
+</center>
+}
+
+_collectactive_ {
+<table width=537>
+<tr valign=top>
+<td align=center>
+<p>_collectionlink_(arabic,  arabic.gif,  "Arabic text collection", arabic&l=ar&nw=windows-1256)
+<p>_collectionlink_(chinese, chinsm.jpg,  "Chinese text collection", chinese&l=zh&nw=utf-8)
+<p>_collectionlink_(gberg,   gbergsm.gif, "Project Gutenberg Collection", gberg)
+</td>
+
+
+<td align=center>
+<p><a href="niupepalibrary?a=p&p=about&c=niupepa&l=mi&nw=utf-8"><img width=150 border=1 src="_nzdlhttpprefix_/collect/niupepa/images/niupepsm.gif" alt="Niupepa: M&auml;ori Newspapers"></a>
+<p><a href="http://nzdl2.cs.waikato.ac.nz/cgi-bin/gwmm?c=meldex&a=page&p=coltitle"><img src="_nzdlhttpprefix_/images/meldexsm.gif" border=1 alt="Meldex music library"></a>
+<p><a href="_nzdlgwcgi_?a=p&p=about&c=musvid"><img width=150 border=1 src="http://www.cosc.canterbury.ac.nz/~davidb/gsdl/collect/musvid/images/musvid_frontpage.gif" alt="Music Videos"></a>
+<p><a href="cstrlibrary?a=p&p=about"><img width=150 border=1 src="_nzdlhttpprefix_/collect/cstr/images/cstrsm.gif" alt="Computer Science Technical Reports"></a>
+<p>_collectionlink_(csbib, csbibsm.gif, "Computer Science Bibliographies", csbib)
+<p>_collectionlink_(gsarch, gsarch.gif, "Greenstone mailing list archive", gsarch)
+</td>
+
+<td align=center>
+<p>_collectionlink_(whist, whist\_logo\_small.gif, "Women&#039;s History Primary Source Documents", whist)
+<p>_collectionlink_(ohist, ohist\_title\_small.gif, "Hamilton Public Library Youth Oral History Collection", ohist)
+<p>_collectionlink_(hcibib, hcibibsm.gif, "The HCI Bibliography", hcibib)
+</td>
+</tr></table>
+}
+
+
+_collectfao_ {
+<table width=537>
+<tr valign=top>
+<td align=center>
+<p>_collectionlink_(fi1998, faosm.gif, "FAO on the Internet &#40;1998&#41;", fi1998)
+<p>_collectionlink_(faodocs, faodrsm.gif, "FAO document repository", faodocs)
+<p>_collectionlink_(hdl,  hdlsm.gif, "Humanity Development Library", hdl)
+<p>_collectionlink_(envl, welsm.gif, "World Environment Library", envl)
+<p>_collectionlink_(aginfo, aginfo.gif, "Agricultural Information Modules", aginfo)
+</td>
+<td align=center>
+<p>_collectionlink_(mhl,  mhlsm.gif,   "Medical and Health Library", mhl)
+<p>_collectionlink_(fnl,  fnlsm.gif,   "Food and Nutrition Library", fnl)
+<p>_collectionlink_(paho, pahosml.gif, "Virtual Disaster Library", paho)
+
+<p>_collectionlink_(povsem, povsem_front.gif, "Poverty Alleviation", povsem)
+<p>_collectionlink_(ipc, ipcsm.gif, "Indigenous Peoples", ipc)
+
+</td>
+<td align=center>
+<p>_collectionlink_(ccgi,   ccgism.gif,   "Collection on Critical Global Issues", ccgi)
+<p>_collectionlink_(tulane, tulanesm.gif, "Biblioth&egrave;que pour le d&eacute;veloppement", tulane)
+<p>_collectionlink_(unesco, unescosm.gif, "Sahel point Doc", unesco)
+</td>
+</tr>
+</table>
+}
+
+
+_collectrest_ {
+<table width=537>
+<tr valign=top>
+
+<td align=center>
+<p><a href="http://nzdl2.cs.waikato.ac.nz/cgi-bin/library?a=p&p=about&c=scms"><img width=150 border=1 src="http://nzdl2.cs.waikato.ac.nz/gsdl/collect/scms/images/scms.gif" alt="Search Waikato's School of Computing and Mathematical Sciences"></a>
+<p>_collectionlink_(acrodemo, acrodemosm.gif, "AGRIS: acronym extraction demo", acrodemo)
+</td>
+
+<td align=center>
+<p>_collectionlink_(folktale, folktale.gif, "Folktales: language extraction demo", folktale)
+<p>_collectionlink_(tcc, tccsm.gif, "The Computists&#039; Weekly", tcc)
+</td>
+
+<td align=center>
+<p>_collectionlink_(wordpdf, wordpdf.gif, "MSWord and PDF demo", wordpdf)
+<p>_collectionlink_(tidbits, tidbitsm.gif, "TidBITS", tidbits)
+</td>
+
+</tr>
+</table>
+}
+
+# bbc no longer public
+#<p>_collectionlink_(bbc1, bbc_home.gif, "BBC archives (1900-1985)", bbc1)
Index: /main/tags/2.38/gsdl/macros/port.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/port.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/port.dm	(revision 21083)
@@ -0,0 +1,783 @@
+######################################################################
+#
+# Portuguese Language text and icon macros 
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=pt] {A p&aacute;gina requerida n&atilde;o pode ser encontrada. Por favor,
+use o bot&atilde;o 'back' do seu browser ou o bot&atilde;o home para retornar para a Biblioteca Digital Greenstone.}
+
+_textdefaulttitle_ [l=pt] {GSDL Erro}
+
+_collectionextra_ [l=pt] {Esta cole&ccedil;&atilde;o cont&eacute;m _about:numdocs_ documentos. 
+Que foi montada _about:builddate_ dias atr&aacute;s.}
+
+_textimagecollection_ [l=pt] {}
+_textimageabout_ [l=pt] {P&aacute;gina Sobre}
+_textimagehome_ [l=pt] {P&aacute;gina Principal}
+_textimagehelp_ [l=pt] {P&aacute;gina Ajuda}
+_textimagepref_ [l=pt] {P&aacute;gina Prefer&ecirc;ncias}
+_textimagegreenstone_ [l=pt] {Greenstone Digital Library Software}
+
+_textimagesearch_ [l=pt] {Busca por termos espec&iacute;ficos}
+_textimageTitle_ [l=pt] {Lista alfab&eacute;tica de t&iacute;tulos}
+_textimageList_ [l=pt] {Lista de documentos}
+_textimageCreator_ [l=pt] {Lista alfab&eacute;tica de autores}
+_textimageSeries_ [l=pt] {Listar por edi&ccedil;&atilde;o}
+_textimageDate_ [l=pt] {Listar por data}
+_textimageSubject_ [l=pt] {Listar categorias de assunto}
+_textimageOrganization_ [l=pt] {Listar por organiza&ccedil;&atilde;o}
+_textimageHowto_ [l=pt] {Listar categorias como fazer }
+_textimageTopic_ [l=pt] {Listar t&oacute;picos de edi&ccedil;&otilde;es especiais}
+_textimageBrowse_ [l=pt] {Listar}
+_textimagePeople_ [l=pt] {Lista alfab&eacute;tica de pessoas}
+
+_texticontabsearchgreen_ [l=pt] {Busca}
+_texticontabdategreen_ [l=pt] {Datas}
+_texticontabseriesgreen_ [l=pt] {S&eacute;ries}
+_texticontabauthorgreen_ [l=pt] {Autors A-Z}
+_texticontabtitlegreen_ [l=pt] {T&iacute;tulos A-Z}
+_texticontablistgreen_ [l=pt] {Listagem}
+_texticontabsubjectgreen_ [l=pt] {Assunto}
+_texticontaborggreen_ [l=pt] {Organiza&ccedil;&atilde;o}
+_texticontabhowgreen_ [l=pt] {Como fazer}
+_texticontabtopicgreen_ [l=pt] {T&oacute;picos}
+_texticontabbrwsegreen_ [l=pt] {Listar}
+_texticontabPeoplegreen_ [l=pt] {Pessoas A-Z}
+
+_texticontext_ [l=pt] {Visualizar o documento}
+_texticonclosedbook_ [l=pt] {Abrir este documento e visualizar o conte&uacute;do}
+_texticonnext_ [l=pt] {se&ccedil;&atilde;o posterior}
+_texticonprev_ [l=pt] {se&ccedil;&atilde;o anterior}
+
+_page_ [l=pt] {p&aacute;gina }
+_pages_ [l=pt] {p&aacute;ginas}
+_of_ [l=pt] { de }
+_vol_ [l=pt] {Volume}
+_num_ [l=pt] {N&uacute;mero}
+
+_textmonth00_ [l=pt] {}
+_textmonth01_ [l=pt] {Janeiro}
+_textmonth02_ [l=pt] {Fevereiro}
+_textmonth03_ [l=pt] {Mar&ccedil;o}
+_textmonth04_ [l=pt] {Abril}
+_textmonth05_ [l=pt] {Maio}
+_textmonth06_ [l=pt] {Junho}
+_textmonth07_ [l=pt] {Julho}
+_textmonth08_ [l=pt] {Agosto}
+_textmonth09_ [l=pt] {Setembro}
+_textmonth10_ [l=pt] {Outubro}
+_textmonth11_ [l=pt] {Novembro}
+_textmonth12_ [l=pt] {Dezembro}
+
+_magazines_ [l=pt] {Revistas}
+
+_nzdlpagefooter_ [l=pt] {<p>_iconblankbar_
+<p><a href="_gwcgi_">Projeto Biblioteca Digital Nova Zel&acirc;ndia</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Departamento de Ci&ecirc;ncia da Computa&ccedil;&atilde;o</a>, 
+<a href="http://www.waikato.ac.nz">Universidade de Waikato</a>, 
+Nova Zel&acirc;ndia}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "PRINCIPAL" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=pt] {_httpimg_/pt/chomeof.gif}
+_httpiconchomeon_ [l=pt] {_httpimg_/pt/chomeon.gif}
+
+## "AJUDA" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=pt] {_httpimg_/pt/chelpof.gif}
+_httpiconchelpon_ [l=pt] {_httpimg_/pt/chelpon.gif}
+
+## "PREFERÊNCIAS" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=pt] {_httpimg_/pt/cprefof.gif}
+_httpiconcprefon_ [l=pt] {_httpimg_/pt/cprefon.gif}
+
+## "ajuda" ## green_title ## h_help ##
+_httpiconhhelp_ [l=pt] {_httpimg_/pt/h\_help.gif}
+_widthhhelp_ [l=pt] {200}
+_heighthhelp_ [l=pt] {57}
+
+## "autores a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=pt] {_httpimg_/pt/tauthgr.gif}
+_httpicontauthof_ [l=pt] {_httpimg_/pt/tauthof.gif}
+_httpicontauthon_ [l=pt] {_httpimg_/pt/tauthon.gif}
+_widthtauthx_ [l=pt] {100}
+
+## "s&eacute;ries" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=pt] {_httpimg_/pt/tsergr.gif}
+_httpicontserof_ [l=pt] {_httpimg_/pt/tserof.gif}
+_httpicontseron_ [l=pt] {_httpimg_/pt/tseron.gif}
+_widthtserx_ [l=pt] {87}
+
+## "datas" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=pt] {_httpimg_/pt/tdategr.gif}
+_httpicontdateof_ [l=pt] {_httpimg_/pt/tdateof.gif}
+_httpicontdateon_ [l=pt] {_httpimg_/pt/tdateon.gif}
+_widthtdatex_ [l=pt] {87}
+
+## "assuntos" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=pt] {_httpimg_/pt/tsubjgr.gif}
+_httpicontsubjon_ [l=pt] {_httpimg_/pt/tsubjon.gif}
+_httpicontsubjof_ [l=pt] {_httpimg_/pt/tsubjof.gif}
+_widthtsubjx_ [l=pt] {87}
+
+## "organiza&ccedil;&atilde;o" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=pt] {_httpimg_/pt/torggr.gif}
+_httpicontorgon_ [l=pt] {_httpimg_/pt/torgon.gif}
+_httpicontorgof_ [l=pt] {_httpimg_/pt/torgof.gif}
+_widthtorgx_ [l=pt] {102}
+
+## "como fazer" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=pt] {_httpimg_/pt/thowgr.gif}
+_httpiconthowon_ [l=pt] {_httpimg_/pt/thowon.gif}
+_httpiconthowof_ [l=pt] {_httpimg_/pt/thowof.gif}
+_widththowx_ [l=pt] {95}
+
+## "tópico" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=pt] {_httpimg_/pt/ttopicgr.gif}
+_httpiconttopicon_ [l=pt] {_httpimg_/pt/ttopicon.gif}
+_httpiconttopicof_ [l=pt] {_httpimg_/pt/ttopicof.gif}
+_widthttopicx_ [l=pt] {87}
+
+## "listar" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=pt] {_httpimg_/pt/tbrwsegr.gif}
+_httpicontbrwseon_ [l=pt] {_httpimg_/pt/tbrwseon.gif}
+_httpicontbrwseof_ [l=pt] {_httpimg_/pt/tbrwseof.gif}
+_widthtbrwsex_ [l=pt] {87}
+
+## "buscar" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=pt] {_httpimg_/pt/tsrchgr.gif}
+_httpicontsrchof_ [l=pt] {_httpimg_/pt/tsrchof.gif}
+_httpicontsrchon_ [l=pt] {_httpimg_/pt/tsrchon.gif}
+_widthtsrchx_ [l=pt] {87}
+
+## "títulos a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=pt] {_httpimg_/pt/ttitlgr.gif}
+_httpiconttitlof_ [l=pt] {_httpimg_/pt/ttitlof.gif}
+_httpiconttitlon_ [l=pt] {_httpimg_/pt/ttitlon.gif}
+_widthttitlx_ [l=pt] {90}
+
+## "pessoas" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=pt] {_httpimg_/pt/tpeopgr.gif}
+_httpicontpeopof_ [l=pt] {_httpimg_/pt/tpeopof.gif}
+_httpicontpeopon_ [l=pt] {_httpimg_/pt/tpeopon.gif}
+_widthtpeopx_ [l=pt] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=pt] {Sobre esta cole&ccedil;&atilde;o}
+
+_textsubcols1_ [l=pt] {<p>A Completa cole&ccedil;&atilde;o cont&eacute;m _1_ sub-cole&ccedil;&otilde;es:
+<blockquote>}
+
+_textsubcols2_ [l=pt] {</blockquote>
+Voc&ecirc; pode checar (e alterar) a cole&ccedil;&atilde;o que voc&ecirc; est&aacute; 
+atualmente usando na p&aacute;gina Prefer&ecirc;ncias.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "sobre" ## green_title ## h_about ##
+_httpiconhabout_ [l=pt] {_httpimg_/pt/h\_about.gif}
+_widthhabout_ [l=pt] {200}
+_heighthabout_ [l=pt] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=pt] {T&iacute;tulos A-Z}
+_texticonhauth_ [l=pt] {Autores A-Z}
+_texticonhsubj_ [l=pt] {Assuntos}
+_texticonhser_ [l=pt] {S&eacute;ries}
+_texticonhdate_ [l=pt] {Datas}
+_texticonhhow_ [l=pt] {Como fazer}
+_texticonhorg_ [l=pt] {Organiza&ccedil;&otilde;es}
+_texticonhbrwse_ [l=pt] {Listar}
+_texticonhpeople_ [l=pt] {Pessoas A-Z}
+
+_texticonopenbookshelf_ [l=pt] {feche esta se&ccedil;&atilde;o da biblioteca}
+_texticonclosedbookshelf_ [l=pt] {abre esta se&ccedil;&atilde;o da biblioteca e visualiza o conte&uacute;do}
+_texticonopenbook_ [l=pt] {fecha este livro}
+_texticonclosedfolder_ [l=pt] {abre esta pasta e visualiza o conte&uacute;do}
+_texticonclosedfolder2_ [l=pt] {abre sub-se&ccedil;&atilde;o: }
+_texticonopenfolder_ [l=pt] {fecha esta pasta}
+_texticonopenfolder2_ [l=pt] {fecha sub-se&ccedil;&atilde;o: }
+_texticonsmalltext_ [l=pt] {Visualiza esta se&ccedil;&atilde;o de texto}
+_texticonsmalltext2_ [l=pt] {visualiza texto: }
+_texticonpointer_ [l=pt] {se&ccedil;&atilde;o atual}
+_texticondetach_ [l=pt] {Abre esta p&aacute;gina numa nova janela}
+_texticonhighlight_ [l=pt] {Destaca termos buscados}
+_texticonnohighlight_ [l=pt] {N&atilde;o destaca termos buscados}
+_texticoncontracttoc_ [l=pt] {Reduz tabela de conte&uacute;do}
+_texticonexpandtoc_ [l=pt] {Amplia tabela de conte&uacute;do}
+_texticonexpandtext_ [l=pt] {Exibir todo texto}
+_texticoncontracttext_ [l=pt] {Exibe texto somente das se&ccedil;&otilde;es selecionadas}
+_texticonwarning_ [l=pt] {<b>Aviso: </b>}
+_texticoncont_ [l=pt] {continuar?}
+
+_textltwarning_ [l=pt] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Expanding o texto gerar&aacute; uma grande 
+quantidade de dados para o seu browser exibir _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ [l=pt] {ir para p&aacute;gina}
+_textintro_ [l=pt] { <i>(texto introdut&oacute;rio)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "títulos a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=pt] {_httpimg_/pt/h\_title.gif}
+_widthhtitle_ [l=pt] {200}
+_heighthtitle_ [l=pt] {57}
+
+## "autores a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=pt] {_httpimg_/pt/h\_auth.gif}
+_widthhauth_ [l=pt] {200}
+
+## "assuntos" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=pt] {_httpimg_/pt/h\_subj.gif}
+_widthhsubj_ [l=pt] {200}
+_heighthsubj_ [l=pt] {57}
+
+## "s&eacute;ries" ## green_title ## h_ser ##
+_httpiconhser_ [l=pt] {_httpimg_/pt/h\_ser.gif}
+_widthhser_ [l=pt] {200}
+_heighthser_ [l=pt] {57}
+
+## "datas" ## green_title ## h_date ##
+_httpiconhdate_ [l=pt] {_httpimg_/pt/h\_date.gif}
+_widthhdate_ [l=pt] {200}
+_heighthdate_ [l=pt] {57}
+
+## "como fazer" ## green_title ## h_how ##
+_httpiconhhow_ [l=pt] {_httpimg_/pt/h\_how.gif}
+_widthhhow_ [l=pt] {200}
+_heighthhow_ [l=pt] {57}
+
+## "tópicos" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=pt] {_httpimg_/pt/h\_topic.gif}
+_widthhtopic_ [l=pt] {200}
+_heighthtopic_ [l=pt] {57}
+
+## "organiza&ccedil;&atilde;o" ## green_title ## h_org ##
+_httpiconhorg_ [l=pt] {_httpimg_/pt/h\_org.gif}
+_widthhorg_ [l=pt] {250}
+_heighthorg_ [l=pt] {57}
+
+## "listar" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=pt] {_httpimg_/pt/h\_brwse.gif}
+_widthhbrwse_ [l=pt] {200}
+_heighthbrwse_ [l=pt] {57}
+
+## "pessoas" ## green_title ## h_people ##
+_httpiconhpeople_ [l=pt] {_httpimg_/pt/h\_people.gif}
+_widthhpeople_ [l=pt] {200}
+_heighthpeople_ [l=pt] {57}
+
+## "CONTINUAR?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=pt] {_httpimg_/pt/contof.gif}
+_httpiconconton_ [l=pt] {_httpimg_/pt/conton.gif}
+
+## "AMPLIAR
+#  TEXTO" ## document_button ## eallt ## 
+_httpiconealltof_ [l=pt] {_httpimg_/pt/ealltof.gif}
+_httpiconeallton_ [l=pt] {_httpimg_/pt/eallton.gif}
+
+## " ABREVIAR
+#CONTEÚDO" ## document_button ## econc ##
+_httpiconeconcof_ [l=pt] {_httpimg_/pt/econcof.gif}
+_httpiconeconcon_ [l=pt] {_httpimg_/pt/econcon.gif}
+
+## "RESUMIR" ## document_button ## edtch ##
+_httpiconedtchof_ [l=pt] {_httpimg_/pt/edtchof.gif}
+_httpiconedtchon_ [l=pt] {_httpimg_/pt/edtchon.gif}
+
+## "  AMPLIAR
+#CONTEÚDO" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=pt] {_httpimg_/pt/eexpcof.gif}
+_httpiconeexpcon_ [l=pt] {_httpimg_/pt/eexpcon.gif}
+
+## "ABREVIAR
+#   TEXTO" ## document_button ## etsec ##
+_httpiconetsecof_ [l=pt] {_httpimg_/pt/etsecof.gif}
+_httpiconetsecon_ [l=pt] {_httpimg_/pt/etsecon.gif}
+
+## "DESTACAR" ## document_button ## ehl ##
+_httpiconehlof_ [l=pt] {_httpimg_/pt/ehlof.gif}
+_httpiconehlon_ [l=pt] {_httpimg_/pt/ehlon.gif}
+
+## "     NÃO
+#DESTACAR" ## document_button ## enhl ##
+_httpiconenhlof_ [l=pt] {_httpimg_/pt/enhlof.gif}
+_httpiconenhlon_ [l=pt] {_httpimg_/pt/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=pt] {_If_(_thislast_,resultados _thisfirst_ - _thislast_ para a consulta: _cgiargq_,Nunhuma resposta encontrada: _cgiargq_)}
+_textnoquerytitle_ [l=pt] {P&aacute;gina busca}
+
+_texticonthispage_ [l=pt] {busca}
+_textsome_ [l=pt] {_If_(_cgiargb_,ranked,algumas)}
+_textall_ [l=pt] {_If_(_cgiargb_,boolean,all)}
+_texticonqueryresultsbar_ [l=pt] {}
+_textfreqmsg1_ [l=pt] {Palavras contadas: }
+_textpostprocess_ [l=pt] {_If_(_quotedquery_,<br><i>encontrar p&oacute;s-processadas _quotedquery_</i>
+)}
+
+_textmorethan_ [l=pt] {Mais que }
+_textapprox_ [l=pt] {Sobre }
+_textnodocs_ [l=pt] {Nenhum documento encontrado.}
+_text1doc_ [l=pt] {1 documento encontrado.}
+_textlotsdocs_ [l=pt] {documentos encontrados.}
+_textmatches_ [l=pt] {Consulta }
+_textbeginsearch_ [l=pt] {Come&ccedil;ar a busca}
+
+_textsimplesearch_ [l=pt] {Buscar por _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_gselection_, na _gselection_ n&iacute;vel)_If_(_nselection_, na _nselection_ linguagem) 
+que contenha _querytypeselection_ palavras}
+
+_textadvancedsearch_ [l=pt] {Search _If_(_hselection_, _hselection_, _defaultindextext_)_If_(_jselection_,_textjselect_)_If_(_gselection_, na _gselection_ n&iacute;vel)_If_(_nselection_, na _nselection_ linguagem) 
+usando _querytypeselection_ consulta}
+
+_textjselect_ [l=pt] {_If_(_hselection_, de) _jselection_}
+
+_textstemon_ [l=pt] { (ignorar final das palavras)}
+_textsearchhistory_ [l=pt] {Buscar Hist&oacute;ria}
+_textnohistory_ [l=pt] {Buscar hist&oacute;ria n&atilde;o dispon&iacute;vel}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "busca" ## green_title ## h_search ##
+_httpiconhsearch_ [l=pt] {_httpimg_/pt/h\_search.gif}
+_widthhsearch_ [l=pt] {200}
+_heighthsearch_ [l=pt] {57}
+
+## "resultados" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=pt] {_httpimg_/pt/qryresb.gif}
+_widthqryresb_ [l=pt] {_pagewidth_}
+_heightqryresb_ [l=pt] {17}
+
+## "exibir" ## hand_made ##
+_httpicondisplay_ [l=pt] {_httpimg_/display.gif}
+_widthdisplay_ [l=pt] {60}
+_heightdisplay_ [l=pt] {20}
+
+
+
+######################################################################
+# 'preferences' page    
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsearchprefs_ [l=pt] {Prefer&ecirc;ncias de busca}
+_textcollectionprefs_ [l=pt] {Prefer&ecirc;ncias da cole&ccedil;&atilde;o}
+_textpresentationprefs_ [l=pt] {Prefer&ecirc;ncias da apresenta&ccedil;&atilde;o}
+_textpreferences_ [l=pt] {Prefer&ecirc;ncias}
+_textignorecase_ [l=pt] { ignorar diferen&ccedil;as entre mai&uacute;sculas/min&uacute;sculas}
+_textmatchcase_ [l=pt] { mai&uacute;sculas/min&uacute;sculas devem corresponder}
+_textstem_ [l=pt] { ignorar termina&ccedil;&otilde;es das palavras}
+_textnostem_ [l=pt] { palavra inteira deve corresponder}
+_textprefop_ [l=pt] {Retornar _maxdocoption_ resultados com _hitsperpageoption_ por p&aacute;gina.}
+_textextlink_ [l=pt] {Acesso &agrave; Web Pages externas: }
+_textintlink_ [l=pt] {Origem dos documentos recebidos:}
+_textlanguage_ [l=pt] {Linguage da Interface: }
+_textencoding_ [l=pt] {C&oacute;digo: }
+_textformat_ [l=pt] {Formato da Interface: }
+_textall_ [l=pt] {todos}
+_textsimplemode_ [l=pt] {modo de consultas simples}
+_textadvancedmode_ [l=pt] {mode de consultas avan&ccedil;adas (permite busca bin&aacute;rias usando !, &, |, e par&ecirc;ntesis)}
+_textlinkinterm_ [l=pt] {direto para a p&aacute;gina intermedi&aacute;ria}
+_textlinkdirect_ [l=pt] {ir diretamente para l&aacute;}
+_textdigitlib_ [l=pt] {a biblioteca digital}
+_textweb_ [l=pt] {a web}
+_textgraphical_ [l=pt] {Gr&aacute;fico}
+_texttextual_ [l=pt] {Texto}
+_textcollectionoption_ [l=pt] {<p>
+Subcole&ccedil;&otilde;es &agrave; incluir:
+<br>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "preferências" ## green_title ## h_pref ##
+_httpiconhpref_ [l=pt] {_httpimg_/pt/h\_pref.gif}
+_widthhpref_ [l=pt] {200}
+_heighthpref_ [l=pt] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=pt] {Ajuda}
+_textSearchshort_ [l=pt] {busca por palavra espec&iacute;fica}
+_textSeriesshort_ [l=pt] {acessar publica&ccedil;&otilde;es por s&eacute;ries}
+_textDateshort_ [l=pt] {acessar publica&ccedil;&otilde;es por data}
+_textSubjectshort_ [l=pt] {acessar publica&ccedil;&otilde;es por assunto}
+_textTitleshort_ [l=pt] {acessar publica&ccedil;&otilde;es por t&iacute;tulo}
+_textBrowseshort_ [l=pt] {listar publica&ccedil;&otilde;es}
+_textCreatorshort_ [l=pt] {acessar publica&ccedil;&otilde;es por autores}
+_textOrganizationshort_ [l=pt] {acessar publica&ccedil;&otilde;es por organiza&ccedil;&atilde;o}
+_textHowtoshort_ [l=pt] {acessar publica&ccedil;&otilde;es por como fazer}
+_textTopicshort_ [l=pt] {acessar publica&ccedil;&otilde;es por t&oacute;pico}
+_textPeopleshort_ [l=pt] {acessar publica&ccedil;&otilde;es por pessoas}
+_textdefaultshorttext_ [l=pt] {classifica&ccedil;&atilde;o indefinida}
+
+_textSearchlong_ [l=pt] { <p>Voc&ecirc; pode <i>buscar por palavras espec&iacute;ficas</i> que
+aparecem no texto da p&aacute;gina "busca". Esta &eacute; a primeira p&aacute;gina que
+aparece quando voc&ecirc; come&ccedil;a, e podem ser encontradas nas outras p&aacute;ginas pressionando-se
+o bot&atilde;o <i>busca</i>.  }
+
+_textTitlelong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por t&iacute;tulo</i> clicando
+no bot&atilde;o <i>t&iacute;tulos a-z</i>.  O qual trar&aacute; uma lista de livros em
+ordem alfab&eacute;tica.  }
+
+_textOrganizationlong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por
+organiza&ccedil;&atilde;o</i> pressionando o bot&atilde;o <i>organiza&ccedil;&atilde;o</i>.  O qual trar&aacute;
+uma lista por organiza&ccedil;&otilde;es.  }
+
+_textHowtolong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por como fazer</i>
+pressionando o bot&atilde;o <i>como fazer</i>.  O qual trar&aacute; uma lista de como fazer.  }
+
+_textCreatorlong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por autor</i> 
+clicando no bot&atilde;o <i>autores a-z</i>.  O qual trar&aacute; uma lista de livros,
+ordenada por nome de autores.  }
+
+_textTopiclong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por t&oacute;pico</i> 
+clicando no bot&atilde;o <i>t&oacute;pico</i>.  O qual trar&aacute; uma lista de t&oacute;picos
+para o Browser.  }
+
+_textSubjectlong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por assuntos</i> 
+clicando no bot&atilde;o <i>assuntos</i>.  O qual trar&aacute; uma lista de assuntos,
+representandos por livros.  }
+
+_textSerieslong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por s&eacute;ries</i> 
+clicando no bot&atilde;o <i>s&eacute;ries</i>.  O qual trar&aacute; uma lista das s&eacute;ries
+que est&atilde;o atualmente na cole&ccedil;&atilde;o.  }
+
+_textDatelong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por data</i> clicando
+no bot&atilde;o <i>datas</i>.  O qual trar&aacute; uma lista de todos as edi&ccedil;&otilde;es, ordenadas
+cronologicamente.  }
+
+_textBrowselong_ [l=pt] { <p>Voc&ecirc; pode <i>folhear publica&ccedil;&otilde;es</i> clicando no
+bot&atilde;o <i>folhear</i>.  }
+
+_textPeoplelong_ [l=pt] { <p>Voc&ecirc; pode <i>acessar publica&ccedil;&otilde;es por pessoas</i> 
+clicando no bot&atilde;o <i>pessoas a-z</i>.  O qual trar&aacute; uma lista ordenadas por nome.  }
+
+_textdefaultlongtext_ [l=pt] { <p>Click no bot&atilde;o <i>n&atilde;o encontrado</i> para listar
+publica&ccedil;&otilde;es (listando por ordem de um campo n&atilde;o encontrado).  }
+
+_texthelptopics_ [l=pt] {
+<h2 align=left>T&oacute;picos</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">Como buscar por uma palavra espec&iacute;fica</a>
+<ul>
+  <li><a href="\#query-terms">Busca de termos</a>
+  <li><a href="\#query-type">Tipo de busca</a>
+  <li><a href="\#scope-of-queries">Abrang&ecirc;ncia da busca</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Prefer&ecirc;ncias da cole&ccedil;&atilde;o</a>
+  <li><a href="\#pres-prefs">Prefer&ecirc;ncias de apresenta&ccedil;&atilde;o</a>
+  <li><a href="\#search-prefs">Prefer&ecirc;ncias de busca</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=pt] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=pt] {Como ler documentos}
+_booktextreadingdocs_ [l=pt] {Como ler livros}
+_bibtextreadingdocs_ [l=pt] {Pegar mais informa&ccedil;&otilde;es em uma bibliografia}
+
+_texthelpreadingdocs_ [l=pt] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Voc&ecirc; pode saber quando voc&ecirc; chegou em um documento especifico por que
+o t&iacute;tulo e autor aparecem no topo esquerdo da p&aacute;gina. Tamb&eacute;m haver&aacute; o 
+n&uacute;mero da p&aacute;gina corrente, um box com setas de avan&ccedil;o e retrocesso dir&aacute; a voc&ecirc; para selecionar uma nova p&aacute;gina.
+
+<p>Sobre o texto da se&ccedil;&atilde;o atual. Quando voc&ecirc; tiver lido ele,
+haver&atilde;o setas e bot&otilde;es que trar&atilde;o para voc&ecirc; a pr&oacute;xima
+se&ccedil;&atilde;o ou a se&ccedil;&atilde;o anterior.
+
+<p>Abaixo do t&iacute;tulo e autor h&aacute; tr&ecirc;s bot&otilde;es. Clique no <i>ampliar
+texto</i> para ampliar todo o texto do documento atual. Se o 
+documento for grande, isto poder&aacute; levar muito tempo e usar muita mem&oacute;ria!
+Clique em <i>resumir</i> para fazer uma nova janela de busca para o
+documento. (Isto &eacute; util se voc&ecirc; quiser comparar documentos, ou ler dois ao
+mesmo tempo.)  Finalmente, quando voc&ecirc; fizer uma busca por palavras as mesmas ser&atilde;o
+destacadas.  Clique em <i>n&atilde;o destacar</i> para retirar os destaques.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Clique na seta para ir para a pr&oacute;xima se&ccedil;&atilde;o ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ou voltar para a se&ccedil;&atilde;o anterior</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Exibir todo texto, ou n&atilde;o</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina em uma nova janela</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Destacar termos buscados, ou n&atilde;o</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=pt] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Voc&ecirc; saber&aacute; quando voc&ecirc; chegou em um individual livro por que h&aacute;
+uma fotografia da capa no topo esquerdo da p&aacute;gina.  Ao lado da
+fotografia h&aacute; uma tabela de conte&uacute;do com uma seta marcando onde voc&ecirc; est&aacute;.
+Esta tabela &eacute; expand&iacute;vel: clique na pasta para abrir-los ou fech&aacute;-los.
+Clique no livro aberto no topo para fech&aacute;-lo.
+
+<p>Sobre o texto da se&ccedil;&atilde;o atual. Quando voc&ecirc; estiver lendo ela, 
+haver&aacute; bot&otilde;es com setas para voc&ecirc; ir para a pr&oacute;xima 
+se&ccedil;&atilde;o ou voltar para a se&ccedil;&atilde;o anterior.
+
+<p>Sob a fotografia est&atilde;o quatro bot&otilde;es.. Clique no <i>ampliar texto</i> para
+ampliar completamente o texto da se&ccedil;&atilde;o ou livro atual.  Se o livro for 
+grande, isto poder&aacute; levar muito tempo ou usar uma grande quantidade de mem&oacute;ria!
+Clique em <i>ampliar conte&uacute;do </i> para ampliar a tabela de conte&uacute;do 
+completamente ent&atilde;o voc&ecirc; poder&aacute; ver os t&iacute;tulos de todos os cap&iacute;tulos e 
+sub-se&ccedil;&otilde;es. Clique em <i>separar</i> para fazer uma nova janela para este livro.  (Isto &eacute; &uacute;til quando voc&ecirc; quiser comparar livros, ou ler dois ao mesmo tempo.)
+Finalmente, quando voc&ecirc; fizer uma busca as palavras encontradas ser&atilde;o destacadas.
+Clique em <i>n&atilde;o destacar</i> para remover os destaques.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Abrir esta biblioteca</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Abrir/fechar este livro </td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Visualizar esta se&ccedil;&atilde;o de texto </td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Exibir todo texto, ou n&atilde;o </td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Ampliar tabela de conte&uacute;dos, ou n&atilde;o </td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina em uma nova janela</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Destacar termos encontrados, ou n&atilde;o </td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Clique na seta para ir para a pr&oacute;xima se&ccedil;&atilde;o ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ou voltar para a se&ccedil;&atilde;o anterior </td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=pt] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Alguns &iacute;tens de bibliografia cont&eacute;m muitas informa&ccedil;&otilde;es com um resumo.
+Voc&ecirc; pode saber na p&aacute;gina de consulta se eles existem por que eles ser&atilde;o mostrados com &iacute;cone _icontext_ ao inv&eacute;s do &iacute;cone _iconblanktext_ .
+
+<p>Clicando no &iacute;cone _icontext_ dar&aacute; a voc&ecirc; mais informa&ccedil;&otilde;es sobre os &iacute;tens de bibliografia.
+
+<p> Abaixo dos &iacute;tens de bibliografia haver&atilde;o dois bot&otilde;es. Clique em <i>separar</i> para abrir uma nova janela para este livro. (Isto &eacute; &uacute;til se voc&ecirc; quiser comparar &iacute;tens de bibliografia.) Finalmente, quando voc&ecirc; fizer uma busca  as palavras encontradas ser&atilde;o destacadas. Clique em <i>n&atilde;o destacar </i> para remover o destaque.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina em uma nova janela</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Destacar termos encontrados, ou n&atilde;o </td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=pt] {
+<h2>Como buscar por palavras particulares </h2>
+<p>
+  Na p&aacute;gina de busca, voc&ecirc; dever&aacute; fazer uma consulta com estes simples passos:<p>
+  
+  <ol><li>Especifique quais documentos voc&ecirc; quer buscar 
+      <li>Diga se voc&ecirc; quer buscar por todas ou somente algumas palavras 
+      <li>Digite as palavras que voc&ecirc; quer buscar 
+      <li>Clique no bot&atilde;o <i>Come&ccedil;ar busca</i>
+  </ol>
+
+<p>Quando voc&ecirc; fizer uma consulta, os t&iacute;tulos de vinte documentos ser&atilde;o apresentados.
+Haver&aacute; um bot&atilde;o no final da p&aacute;gina que apresentar&aacute; os pr&oacute;ximos vinte documentos.  L&aacute; voc&ecirc; encontrar&aacute; bot&otilde;es para lev&aacute;-lo para as terceiras vinte ou voltar para as primeiras vinte e assim continuar&aacute;. Clique no t&iacute;tulo de qualquer documento, ou no pequeno bot&atilde;o ao lado dele para v&ecirc;-lo.
+
+<p>Um m&aacute;ximo de 100 documentos s&atilde;o retornados. Voc&ecirc; pode mudar este n&uacute;mero clicando no bot&atilde;o <i>prefer&ecirc;ncias</i> no topo da p&aacute;gina.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Termos de busca </h3>
+
+<p>Qualquer coisa que voc&ecirc; digitar na caixa de consulta &eacute; interpretado como uma lista de palavras chamadas "termos de busca." Cada termo n&atilde;o cont&eacute;m nada al&eacute;m de caracteres e d&iacute;gitos. Termos s&atilde;o separados por espa&ccedil;os em branco. Se qualquer outro caracter como pontua&ccedil;&atilde;o aparecer, eles servir&atilde;o apenas para separar termos mas continuar&atilde;o sendo espa&ccedil;os. E ent&atilde;o eles ser&atilde;o ignorados. Voc&ecirc; n&atilde;o pode buscar por palavras que incluem pontua&ccedil;&atilde;o. 
+
+<p>Por exemplo, a consulta <p>
+    <ul><kbd>Agro-forestry in the Pacific Islands: Systems for Sustainability (1993)</kbd></ul>
+      <p>Ser&atilde;o tratadas como<p>
+      <ul><kbd>Agro forestry in the Pacific Islands  Systems for Sustainability  1993 </kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Tipos de consultas</h3>
+
+<p>Existem dois tipos diferentes de consulta.
+
+<ul>
+  <li>Consultas por <b>todas</b> as palavras.  Esta op&ccedil;&atilde;o busca por documentos 
+      que contenham todas as palavras que voc&ecirc; especificou. Documentos que
+	satisfassam a consulta ser&atilde;o apresentados em ordem alfab&eacute;tica .<p>
+
+  <li>Consultas por <b>algumas</b> das palavras.  Apenas listar&aacute; alguns termos 
+      que provavelmente aparecem nos documentos que voc&ecirc; esta buscando. 	Documentos s&atilde;o apresentados na ordem mais pr&oacute;xima da consulta. Quando
+      determinado o grau de consulta,
+
+      <p><ul>
+        <li> quanto mais termos um documento contenha, mais combinar&aacute;;
+        <li> termos raros s&atilde;o mais importantes que comuns;
+        <li> documentos menores combinam melhor que grandes.
+      </ul>
+</ul>
+
+<p>Use quantos termos voc&ecirc; quiser-uma senten&ccedil;a completa, ou um par&aacute;grafo completo. Se voc&ecirc especificar somente um termo, os documentos ser&atilde;o ordenados por frequ&ecirc;ncia de ocorr&ecirc;ncia.<p>
+_texthelpscope_
+}
+
+_textchangeprefs_ [l=pt] {Mudar suas prefer&ecirc;ncias }
+
+_texthelppreferences_ [l=pt] {<h2>_textchangeprefs_</h2>
+
+<p>Quando voc&ecirc; clica no bot&atilde;o de <i>prefer&ecirc;ncias</i> no topo da p&aacute;gina, voc&ecirc; ser&aacute; capaz de mudar alguns aspectos da interface para moldar em seus pr&oacute;prios requerimentos.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Prefer&ecirc;ncias da cole&ccedil;&atilde;o</h3>
+
+Algumas cole&ccedil;&otilde;es incluem v&aacute;rias sub-cole&ccedil;&otilde;es, as quais podem ser buscadas independentemente ou juntas, como uma unidade. Assim, voc&ecirc; pode selecionar quais sub-cole&ccedil;&otilde;es incluir em suas buscas na p&aacute;gina de prefer&ecirc;ncias. 
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Prefer&ecirc;ncias de apresenta&ccedil;&atilde;o</h3>
+
+Dependendo de uma particular cole&ccedil;&atilde;o, haver&aacute; v&aacute;rias op&ccedil;&otilde;es que voc&ecirc; pode definir para controlar a apresenta&ccedil;&atilde;o. 
+
+Cole&ccedil;&otilde;es de Web pages permitir&atilde;o a voc&ecirc; suprimir a barra de navega&ccedil;&atilde;o Greenstone no topo de cada p&aacute;gina de documento, quando voc&ecirc; fizer uma busca a p&aacute;gina com os documentos encontrados aparecer&atilde;o sem nenhum cabe&ccedil;ario Greenstone. Para fazer outra busca voc&ecirc; ter&aacute; que usar o bot&atilde;o "back" do seu browser. Estas cole&ccedil;&otilde;es tamb&eacute;m possibilitar&atilde;o a voc&ecirc; suprimir as mensagens de avisos Greenstone quando voc&ecirc; clicar em um link que levar&aacute; voc&ecirc; para fora da cole&ccedil;&atilde;o digital.
+Em algumas cole&ccedil;&otilde;es voc&ecirc; pode controlar quaisquer links na p&aacute;gina de "Resultados de Busca" para lev&aacute;-lo diretamente para a atual URL em quest&atilde;o, ao inv&eacute;s de copiar as p&aacute;ginas da biblioteca digital.
+
+Cole&ccedil;&otilde;es que s&atilde;o capazes de serem apresentadas em diferentes linguagens permitir&atilde;o que voc&ecirc; especifique a linguagem da interface. Se a linguagem &eacute; chin&ecirc;s, voc&ecirc; tamb&eacute;m pode especificar quais c&oacute;digos de padr&otilde;es chineses seu browser deve usar.
+
+Finalmente, todas as cole&ccedil;&otilde;es d&atilde;o a voc&ecirc; a condi&ccedil;&atilde;o de mudar para uma interface textual ao inv&eacute;s do padr&atilde;o gr&aacute;fico. Isto &eacute; particularmente &uacute;til para visualiza&ccedil;&atilde;o por usu&aacute;rios que usam fontes de tela largas ou escutam por sintetizadores. 
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Prefer&ecirc;ncias de busca </h3>
+Dois pares de bot&otilde;es controlam a sensibilidade entre mai&uacute;sculas e min&uacute;sculas e termina&ccedil;&otilde;es das buscas que voc&ecirc; fizer. O primeiro grupo de bot&otilde;es controlam qualquer mai&uacute;sculas ou min&uacute;sculas que devem combinar (sensibilidade).  O segundo grupo ignorar qualquer final de palavras ou n&atilde;o (termina&ccedil;&otilde;es).
+
+<p>Por exemplo, se os bot&otilde;es <i>ignorar diferencas entre maíusculas/minúsculas</i> e
+<i>ignorar termina&ccedil;&otilde;es de palavras </i> estiverem selecionados, a consulta <p>
+    <ul><kbd>African building</kbd></ul>
+      <p>ser&aacute; tratada como <p>
+      <ul><kbd>africa builds</kbd></ul><p>
+      porque as letras mai&uacute;sculas em "African" ser&atilde;o transformadas para 
+      min&uacute;sculas, e os sufixos "n" e "ing" ser&atilde;o removidos de 
+      "African" e "building" respectivamente (tamb&eacute;m, "s" ser&atilde;o removidos de 
+      "builds").
+
+<p>Voc&ecirc; pode tamb&eacute;m mudar para o modo "avan&ccedil;ado" de consulta que possibilitar&aacute; a voc&ecirc; combinar termos usando AND (&), OR (|), e NOT (!). Isto dar&aacute; a voc&ecirc; consultas mais precisas. 
+
+<p>Finalmente, voc&ecirc; pode controlar o n&uacute;mero de p&aacute;ginas encontradas, e o n&uacute;mero de p&aacute;ginas que ser&atilde;o apresentadas em cada tela.
+
+}
+
+_texttanumbrowseoptions_ [l=pt] {Existem _numbrowseoptions_ formas de encontrar informa&ccedil;&otilde;es nesta cole&ccedil;&atilde;o:}
+
+_textsimplehelpheading_ [l=pt] {Como encontrar informa&ccedil;&otilde;es}
+
+_texthelpscope_ [l=pt] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Abrang&ecirc;ncia das consultas</h3>
+
+<p>
+Na maioria das cole&ccedil;&otilde;es voc&ecirc; pode escolher diferentes indices de busca. Por exemplo, poderiam ser indeces por autores ou por t&iacute;tulos. Ou poderiam ser por cap&iacute;tulos ou par&aacute;grafos. Genericamente uma completa lista de documentos &eacute; retornada apesar dos indeces de busca.
+<p>Se os documentos s&atilde;o livros, eles ser&atilde;o abertos no local apropriado.
+}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
Index: /main/tags/2.38/gsdl/macros/pref.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/pref.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/pref.dm	(revision 21083)
@@ -0,0 +1,548 @@
+package preferences
+
+# set within server
+
+# collectionoption is only set when cross-collection searching is turned on
+_collectionoption_ {}
+
+# this macro will be set to "1" when the "source docs retrived from dl/web
+# button is required - i.e. whenever PreferenceDocsFromWeb isn't set to false
+# in collect.cfg
+_PreferenceDocsFromWeb_ {}
+
+# this macro will be set to _textprefschanged_ when the "set preferences"
+# button has been pressed
+_prefschanged_ {}
+
+#######################################################################
+# java images/scripts
+#######################################################################
+
+# the _javalinks_ macros are the flashy image links at the top right of
+# the page. this is overridden here as we don't want a 'preferences' 
+# link on this page
+
+_javalinks_ {_imagehome__imagehelp_}
+_javalinks_ [v=1] {
+_imagehome_<br>
+_imagehelp_<br>
+}
+
+
+#######################################################################
+# scripts
+# note that changing either the "m" or the "o" argument
+# from the preferences page necessitates reseting the "r"
+# argument to 1
+#######################################################################
+
+_ccsfunctions_ {argcc = "";
+savedccs = new Object();
+
+function initialize () \{
+  for (i = 0; i < document.links.length; i++)
+    savedhrefs[i] = document.links[i].href;
+
+  s = "_cgiargcc_";
+  a = s.split (",");
+  for (i = 0; i < a.length ;i++) \{
+    for (j = 0; j < document.PrefForm.cc.length; j++) \{
+      if (a[i] == document.PrefForm.elements["cc"][j].value) \{
+        document.PrefForm.elements["cc"][j].checked = true;
+        savedccs[a[i]] = 1;
+        argcc = argcc + "&cc=" + a[i];
+        break;
+      \} else \{
+        savedccs[a[i]] = 0;
+      \}
+    \}
+  \}
+  updatehrefs();
+\}
+
+function updatecc (collection) \{
+  if (savedccs[collection] == 1) savedccs[collection] = 0;
+  else savedccs[collection] = 1;
+       
+  var i;
+  argcc = "";
+  var changed = 0;
+  for (i in savedccs)
+    if (savedccs[i] == 1) \{
+       argcc += "&cc=" + i;
+       changed = 1;
+    \}
+  if (changed == 1) argcc += "&r=1";
+  updatehrefs();
+\}
+}
+
+_standardfunctions_ {
+function initialize () \{
+  for (i = 0; i < document.links.length; i++)
+    savedhrefs[i] = document.links[i].href;
+  // only add form search option if mgpp (ct arg) and javascript
+_If_("_cgiargct_" eq "1",var opt=new Option\("_textformsearch_"\, "1"\); document.PrefForm.qt.options[1]=opt;,//)_If_("_cgiargqt_" eq "1",opt.selected=1;)
+\}
+}
+
+_getargsfunction_ {
+function getargs () \{
+  return argk + args + argm + argo + argrd + arghd + argb + argqb + argfqn_If_(_collectionoption_,_ccsargs_)_If_(_htmloptions_,_htmlargs_);
+\}
+}
+
+_ccsargs_ {+ argcc}
+_htmlargs_ {+ argel + argil + argfc + arghl}
+
+_htmlfunctions_ {argel = "";
+argil = "";
+argfc = "";
+arghl = "";
+
+function updateel () \{
+  value = document.PrefForm.el.options[document.PrefForm.el.selectedIndex].value;
+  if (value != "_cgiargel_") argel = "&el=" + value;
+  else argel = "";
+  updatehrefs();
+\}
+
+function updateil () \{
+  value = document.PrefForm.il.options[document.PrefForm.il.selectedIndex].value;
+  if (value != "_cgiargil_") argil = "&il=" + value;
+  else argil = "";
+  updatehrefs();
+\}
+
+function updatefc(value) \{
+  if (value != _cgiargfc_) argfc = "&fc=" + value + "&f=" + value;
+  else argfc = "";
+  updatehrefs();
+\}
+
+function updatehl(value) \{
+  if (value != _cgiarghl_) arghl = "&hl=" + value;
+  else arghl = "";
+  updatehrefs();
+\}
+}
+
+_pagescriptextra_ {
+// preferences scripts generated from \_preferences:pagescriptextra\_
+
+savedhrefs = new Object();
+
+argk = "";
+args = "";		
+argm = "";
+argrd = "";
+argo = "";
+argb = "";
+arghd = "";
+argqb = "";
+argfqn = "";
+
+_If_(_collectionoption_,_ccsfunctions_,_standardfunctions_)
+_If_(_htmloptions_,_htmlfunctions_)
+_getargsfunction_
+function updatehrefs () \{
+  for (i = 0; i < document.links.length; i++)
+    document.links[i].href = savedhrefs[i] + getargs();
+\}
+
+function updatek (value) \{
+  if (value != _cgiargk_) argk = "&k=" + value;
+  else argk = "";
+  updatehrefs();
+\}
+
+function updates (value) \{
+  if (value != _cgiargs_) args = "&s=" + value;
+  else args = "";
+  updatehrefs();
+\}
+
+function updatem () \{
+  value = document.PrefForm.m.options[document.PrefForm.m.selectedIndex].value;
+  if (value != _cgiargm_) argm = "&r=1&m=" + value;
+  else argm = "";
+  updatehrefs();
+\}
+
+function updaterd () \{
+  if (document.PrefForm.rd.checked)
+    _If_("_cgiargrd_" eq "1",argrd="";,argrd="&rd=1";)
+  else 
+    _If_("_cgiargrd_" ne "1",argrd="";,argrd="&rd=0";)
+  updatehrefs();
+\}
+
+function updateo () \{
+  value = document.PrefForm.o.options[document.PrefForm.o.selectedIndex].value;
+  if (value != _cgiargo_) argo = "&r=1&o=" + value;
+  else argo = "";
+  updatehrefs();
+\}
+
+function updatefqn () \{
+  value = document.PrefForm.fqn.options[document.PrefForm.fqn.selectedIndex].value;
+  if (value != _cgiargfqn_) argfqn = "&fqn=" + value;
+  else argfqn = "";
+  updatehrefs();
+\}
+
+function updateb (value) \{
+  if (value != _cgiargb_) argb = "&b=" + value;
+  else argb = "";
+  updatehrefs();
+\}
+
+function updatehd() \{
+  arghd="";
+  if (document.PrefForm.hd[0].checked) \{
+     if ("_cgiarghd_" != "0") arghd = "&hd=0";
+  \}
+  else \{
+     value = document.PrefForm.hdn[document.PrefForm.hdn.selectedIndex].value;
+     if (_cgiarghd_ != value) arghd = "&hd="+value;
+  \}
+  updatehrefs();
+\}
+
+function updateqb(value) \{
+  if (value != _cgiargqb_) argqb = "&qb=" + value;
+  else argqb = "";
+  updatehrefs();
+\}
+
+function updatel () \{
+  value = document.PrefForm.l.options[document.PrefForm.l.selectedIndex].value;
+  href = location.href;
+  if (href.match(/&l=\\w\\w/)) href = href.replace(/&l=\\w\\w/, "&l=" + value);
+  else href += "&l=" + value;
+  if (!location.href.match(/&nl=1$/)) href += "&nl=1";
+  location.href = href + getargs();
+\}
+
+function updatev () \{
+  value = document.PrefForm.v.options[document.PrefForm.v.selectedIndex].value;
+  href = location.href;
+  if (href.match(/&v=\\d/)) href = href.replace(/&v=\\d/, "&v=" + value);
+  else href += "&v=" + value;
+  location.href = href + getargs();
+\}
+
+function updatew () \{
+  value = document.PrefForm.w.options[document.PrefForm.w.selectedIndex].value;
+  href = location.href;
+  if (href.match(/&nw=[^&]+/)) href = href.replace(/&nw=[^&]+/, "&nw=" + value);
+  else href += "&nw=" + value;
+  if (!location.href.match(/&nl=0$/)) href += "&nl=0";
+  location.href = href + getargs();
+\}
+
+function updateqt () \{
+  value = document.PrefForm.qt.options[document.PrefForm.qt.selectedIndex].value;
+  location.href = location.href + "&qt=" + value + getargs();
+\}
+}
+
+
+#######################################################################
+# headers
+# these are overridden so we can put an onLoad event handler
+# in the <body> tag of this page
+#######################################################################
+
+
+_header_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_" onLoad="initialize();")_startspacer__pagebanner_
+}
+
+# this declaration ends up being the same as style=restrict, never mind
+_header_[v=1] {_cgihead_
+_htmlhead_(onLoad="initialize();")_pagebanner_
+}
+
+
+#######################################################################
+# page content
+#######################################################################
+
+_pagetitle_ {_collectionname_: _textpreferences_}
+_imagethispage_ {_iconthispage_}
+
+_htmloptions_ {}
+
+_htmloptionson_ {
+<p>
+<tr>_fcoption_</tr>
+<p>
+<tr>_hloption_</tr>
+<p>
+<tr>_extlinkoption_</tr>
+_If_(_PreferenceDocsFromWeb_,<p>
+<tr>_intlinkoption_</tr>)
+}
+
+_fcoption_ {
+<td valign=baseline>Document page layout</td>
+<td><input type=radio name=fc value=1 onClick="updatefc(1);"
+		_If_(_cgiargfc_, checked)>navigation bar at top<br>
+<input type=radio name=fc value=0 onClick="updatefc(0);"
+		_If_(_cgiargfc_,, checked)>no navigation bar</td>
+}
+
+_hloption_ {
+<td valign=baseline>Search term highlighting</td>
+<td><input type=radio name=hl value=1 onClick="updatehl(1);"
+		_If_(_cgiarghl_, checked)>highlight search terms<br>
+<input type=radio name=hl value=0 onClick="updatehl(0);"
+		_If_(_cgiarghl_,, checked)>don't highlight search terms</td>
+}
+
+#search pref options
+_boxsizeoption_{
+<td valign=baseline>_textqueryboxsize_</td>
+<td><input type=radio name=qb value=0 onClick="updateqb(0);"
+		_If_(_cgiargqb_,, checked)>_textregbox_<br>
+<input type=radio name=qb value=1 onClick="updateqb(1);"
+		_If_(_cgiargqb_, checked)>_textbigbox_</td>
+}
+
+_caseoption_ {
+<td valign=baseline>_textcasediffs_</td>
+<td><input type=radio name=k value=1 onClick="updatek(1);"
+		_If_(_cgiargk_, checked)>_textignorecase_<br>
+<input type=radio name=k value=0 onClick="updatek(0);"
+		_If_(_cgiargk_,, checked)>_textmatchcase_</td>
+}
+
+_caseoption_ [l=ar] {}
+_caseoption_ [l=zh] {}
+
+_stemoption_ {
+<td valign=baseline>_textwordends_</td>
+<td><input type=radio name=s value=1 onClick="updates(1);"
+  _If_(_cgiargs_, checked)>_textstem_<br>
+<input type=radio name=s value=0 onClick="updates(0);"
+  _If_(_cgiargs_,, checked)>_textnostem_</td>
+}
+
+_stemoption_ [l=zh] {}
+
+
+_modeoption_ {
+<td valign=baseline>_textquerymode_</td>
+<td><input type=radio name=b value=0 onClick="updateb(0);"
+		_If_(_cgiargb_,, checked)>_textsimplemode_<br>
+<input type=radio name=b value=1 onClick="updateb(1);"
+		_If_(_cgiargb_, checked)>_textadvancedmode_</td>
+}
+
+
+_searchhistoryop_ {
+<td valign=baseline>_textsearchhistory_</td>
+<td><input type=radio name="hd" value=0 onClick="updatehd();"
+                _If_("_cgiarghd_" eq "0", checked)>_textnohistorydisplay_<br>
+<input type=radio name="hd" value=1 onClick="updatehd();"
+		_If_("_cgiarghd_" eq "0",, checked)>_texthistorydisplay_</td>   
+}
+
+_relateddocop_ {
+<td colspan=2><nobr><input type=checkbox name="rd" value=1 onClick="updaterd();" _If_("_cgiargrd_" eq "1", checked)>
+Display related documents</nobr></td>
+}
+
+_historynumrecords_{<select name="hdn" onChange="updatehd();">
+    <option value="5"_If_("_cgiarghd_" eq "5", selected)>5
+    <option value="10"_If_("_cgiarghd_" eq "10", selected)>10
+    <option value="15"_If_("_cgiarghd_" eq "15", selected)>15
+    <option value="20"_If_("_cgiarghd_" eq "20", selected)>20
+</select>}
+
+_maxdocoption_ {
+<select name="m" onChange="updatem();">
+  <option value="50"_If_("_cgiargm_" eq "50", selected)>50
+  <option value="100"_If_("_cgiargm_" eq "100", selected)>100
+  <option value="200"_If_("_cgiargm_" eq "200", selected)>200
+</select>
+}
+
+_hitsperpageoption_ {
+<select name="o" onChange="updateo();">
+  <option value="10"_If_("_cgiargo_" eq "10", selected)>10  
+  <option value="20"_If_("_cgiargo_" eq "20", selected)>20
+  <option value="50"_If_("_cgiargo_" eq "50", selected)>50
+  <option value="100")_If_("_cgiargo_" eq "100", selected)>_textall_
+</select>
+}
+
+_extlinkoption_ {
+<td>_textextlink_</td>
+<td><select name="el" onChange="updateel();">
+  <option value="prompt"_If_("_cgiargel_" eq "prompt", selected)>
+     _textlinkinterm_
+  <option value="direct"_If_("_cgiargel_" eq "direct", selected)>
+     _textlinkdirect_
+</select></td>
+}
+
+_intlinkoption_ {
+<td>_textintlink_</td>
+<td><select name="il" onChange="updateil();">
+  <option value="l"_If_("_cgiargil_" eq "l", selected)>
+     _textdigitlib_
+  <option value="w"_If_("_cgiargil_" eq "w", selected)>
+     _textweb_
+</select></td>
+}
+
+# set from within pageaction
+_languageoption_ {}
+_encodingoption_ {}
+
+_formatoption_ {
+<td>_textformat_</td>
+<td><select name="v" onChange="updatev();">
+  <option value="0"_If_("_cgiargv_" eq "0", selected)>_textgraphical_
+  <option value="1"_If_("_cgiargv_" eq "1", selected)>_texttextual_
+</select></td>
+}
+
+_content_ {
+<center>
+_navigationbar_
+</center>
+_If_(_prefschanged_,<p>_prefschanged_<br><center>_iconblankbar_</center>)
+
+<blockquote>
+
+<form name=PrefForm method=get action="_gwcgi_">
+
+<input type="hidden" name="e" value="_decodedcompressedoptions_">
+
+_If_(_collectionoption_,_collectionprefs_)
+_presentationprefs_
+_If_("_cgiargct_" eq "1",_mgppsearchprefs_,_mgsearchprefs_)
+
+</blockquote>
+</form>
+}
+
+#search prefs for mg collections
+_mgsearchprefs_ {
+<center><table border=0 cellpadding=0 cellspacing=0 width=_pagewidth_><tr>
+<td><h3>_textsearchprefs_</h3></td>
+<td align=right><input type=submit name="bp" value="_textsetprefs_"></td>
+</tr></table></center>
+
+<table>
+<tr>_boxsizeoption_</tr>
+
+<tr>_caseoption_</tr>
+
+<tr>_stemoption_</tr>
+
+<tr>_modeoption_</tr>
+
+<tr>_searchhistoryop_</tr>
+
+<!--
+Don't include this for now
+<tr>_relateddocop_</tr>
+-->
+
+<tr><td colspan=2>_textprefop_</td></tr>
+</table>
+</blockquote>
+_iconblankbar_
+<blockquote>
+}
+
+_collectionprefs_ {
+<h3>_textcollectionprefs_</h3>
+_collectionoption_
+</blockquote>
+_iconblankbar_
+<blockquote>
+}
+
+_presentationprefs_ {
+<h3>_textpresentationprefs_</h3>
+<table>_htmloptions_
+
+_If_(_languageoption_,<tr><td>_textlanguage_</td><td>_languageoption_</td></tr>)
+
+_If_(_encodingoption_,<tr><td>_textencoding_</td><td>_encodingoption_</td></tr>)
+
+<tr>_formatoption_</tr></table>
+</blockquote>
+_iconblankbar_
+<blockquote>
+}
+
+#######################################################
+## new stuff for prefs for form vs text search - for mgpp collections
+_mgppsearchprefs_ {
+<h3>_textsearchprefs_</h3>
+<table>
+<tr>_searchtypeop_</tr>
+
+_If_(_cgiargqt_,_formsearchoptions_,_textsearchoptions_)
+
+<tr>_caseoption_</tr>
+
+<tr>_stemoption_</tr>
+
+<tr>_searchhistoryop_</tr>
+
+<tr><td colspan=2>_textprefop_</td></tr></table>
+<input type=submit value="Update settings"><!--non-javascript users only-->
+</blockquote>
+_iconblankbar_
+<blockquote>
+}
+
+
+_searchtypeop_ {
+<td>_texttypesearch_</td>
+<td><select name="qt" onChange="updateqt();">
+  <option value="0"_If_("_cgiargqt_" eq "0", selected)>_texttextsearch_
+<!-- textformsearch option done in initialize function -->
+</select></td>
+}
+
+_formsearchoptions_ {
+<tr>_formmodeoption_</tr>
+}
+
+_textsearchoptions_ {
+<tr>_boxsizeoption_</tr>
+<tr>_modeoption_</tr>
+}
+
+_formmodeoption_{
+<td valign=baseline>_textformtype_</td>
+<td><input type=radio name=b value=0 onClick="updateb(0);"
+		_If_(_cgiargb_,, checked)>_textsimple_<br>
+<input type=radio name=b value=1 onClick="updateb(1);"
+		_If_(_cgiargb_, checked)>_textadvanced_<br>
+_formnumoption_</td>
+}
+
+_formnumoption_ {_textwith_
+<select name="fqn" onChange="updatefqn();">
+  <option value="2"_If_("_cgiargfqn_" eq "2", selected)>2  
+  <option value="4"_If_("_cgiargfqn_" eq "4", selected)>4
+  <option value="6"_If_("_cgiargfqn_" eq "6", selected)>6
+  <option value="8"_If_("_cgiargfqn_" eq "8", selected)>8
+</select>_textfields_</td>
+}
+
+
+#######################################################################
+# icons
+#######################################################################
+
+_iconthispage_ {<img src="_httpiconhpref_" alt="_textpreferences_" width="_widthhpref_" height="_heighthpref_">}
Index: /main/tags/2.38/gsdl/macros/query.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/query.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/query.dm	(revision 21083)
@@ -0,0 +1,696 @@
+package query
+
+
+#######################################################################
+# Macros whose values are set from within the server at runtime. These 
+# are here only for reference and to set default values if required.           
+#######################################################################
+
+_quotedquery_ {}
+_freqmsg_ {}
+_resultline_ {}
+_thisfirst_ {}
+_thislast_ {}
+_nextfirst_ {}
+_nextlast_ {}
+_prevfirst_ {}
+_prevlast_ {}
+_searchhistorylist_ {}
+#_histvalue0_ to _histvalue19_
+_advformlist_ {}
+_regformlist_ {}
+_fqfselection_ {}
+
+
+#######################################################################
+# icons
+#######################################################################
+
+_iconthispage_ {<img src="_httpiconhsearch_" alt="_texticonthispage_" width="_widthhsearch_" height="_heighthsearch_">}
+_iconthispage_ [v=1] {<h2>_texticonthispage_</h2>}
+
+_iconqueryresultsbar_ {<img src="_httpiconqryresb_" width="_widthqryresb_" height="_heightqryresb_" alt="_texticonqueryresultsbar_">}
+_iconqueryresultsbar_[v=1] {_texticonqueryresultsbar_}
+
+_iconsearchhistorybar_ {<img src="_httpiconsrchhistb_" width="_widthsrchhistb_" height="_heightsrchhistb_" alt="_texticonsearchhistorybar_">}
+_iconsearchhistorybar_[v=1] {_texticonsearchhistorybar_}
+
+# _iconnext_ and _iconprev_ are overridden in this package as we
+# don't want alt text here
+_iconnext_{<img src="_httpiconmore_" width=_widthmore_ height=_heightmore_ border=0 align=top>}
+_iconnext_ [v=1] {}
+_iconprev_{<img src="_httpiconless_" width=_widthless_ height=_heightless_ border=0 align=top>}
+_iconprev_ [v=1] {}
+
+# the small squares for search history
+## " " ## handmade ## mstds ##
+_httpiconmstdsqrof_ {_httpimg_/mstdsof.gif}
+_httpiconmstdsqron_ {_httpimg_/mstdson.gif}
+_widthmstdsqrx_ {13}
+_heightmstdsqrx_ {13}
+
+#######################################################################
+# images
+#######################################################################
+
+_imagethispage_ {_iconthispage_}
+
+#the buttons for the search history entries
+# takes one arg - the entry number (0-num entries)
+_imagehistbutton_ {<a  href="_httpquery_" onMouseover="roll('histbutton_1_',1);" onMouseOut="roll('histbutton_1_',0);" onClick="inputQuery(histvalue_1_); return false;"><img name="histbutton_1_" src="_httpiconmstdsqrof_" onLoad="gbutton(this,'_httpiconmstdsqron_');" border=0 alt="_textusequery_"></a>}
+
+
+#######################################################################
+# scripts (and some macros for the scripts)
+#######################################################################
+
+_pagescriptextra_ {_If_("_cgiargct_" eq "1" && "_cgiargqt_" eq "1",_formpagescriptextra_,_dummypagescriptextra_)
+_If_("_cgiarghd_" ne "0",_historypagescriptextra_) }
+
+_dummypagescriptextra_{
+function initialize() \{
+\}
+}
+_formpagescriptextra_ {
+// query scripts generated by \_query:pagescriptextra\_
+
+_standardfunctions_
+_formfunctions_
+_searchfunctions_
+
+function getsearchargs () \{
+
+  var args="";
+  args = "&fqa=0&fqv="+argfqv+"&fqf="+argfqf;
+  _If_(_cgiargb_,args += "&fqk="+argfqk+"&fqs="+argfqs+"&fqc="+argfqc;)
+
+  return args;
+\}
+
+
+
+function getqueryargs () \{
+  return "&fqa=1"+"&q="+argq+"&fqv="+argfqv+"&fqf="+argfqf+
+	 "&fqk="+argfqk+"&fqs="+argfqs+"&fqc="+argfqc ;
+\}
+
+}
+
+_historypagescriptextra_{
+
+var histvalue0='_histvalue0_';
+var histvalue1='_histvalue1_';
+var histvalue2='_histvalue2_';
+var histvalue3='_histvalue3_';
+var histvalue4='_histvalue4_';
+var histvalue5='_histvalue5_';
+var histvalue6='_histvalue6_';
+var histvalue7='_histvalue7_';
+var histvalue8='_histvalue8_';
+var histvalue9='_histvalue9_';
+var histvalue10='_histvalue10_';
+var histvalue11='_histvalue11_';
+var histvalue12='_histvalue12_';
+var histvalue13='_histvalue13_';
+var histvalue14='_histvalue14_';
+var histvalue15='_histvalue15_';
+var histvalue16='_histvalue16_';
+var histvalue17='_histvalue17_';
+var histvalue18='_histvalue18_';
+var histvalue19='_histvalue19_';
+
+function inputQuery(value) \{
+  if ("_cgiargqt_" == "0") \{ // text search
+     document.QueryForm.q.value += " "+value;
+  \}
+  else \{
+     if ("_cgiargb_" == "1") \{ // advanced query
+        document.QueryForm.q.value += " "+value;
+	updateq();
+     \}
+     else \{ // simple form search
+	  // do something here, what??
+     \}
+  \}
+\}
+
+}
+
+_standardfunctions_{
+
+ function getstdargs() \{
+    
+    stdarg = "";
+    _If_(_cgiargh_,_getharg_)
+    _If_(_gselection_,_getgarg_)	
+    _If_(_cgiargj_,_getjarg_)
+
+    value = document.QueryForm.t.options[document.QueryForm.t.selectedIndex].value;
+    if (value != "_cgiargt_") stdarg += "&t="+value;
+
+    stdarg += "&r=1&hs=1";    
+    return stdarg;
+  \}
+
+}
+
+#some macros to go with getstdargs()
+_getharg_{
+    value = document.QueryForm.h.options[document.QueryForm.h.selectedIndex].value;
+    if (value != "_cgiargh_") stdarg += "&h="+value;
+}
+
+_getgarg_{
+    value = document.QueryForm.g.options[document.QueryForm.g.selectedIndex].value;
+    if (value != "_cgiargg_") stdarg += "&g="+value;
+}
+
+_getjarg_{
+    value = document.QueryForm.j.options[document.QueryForm.j.selectedIndex].value;
+    if (value != "_cgiargj_") stdarg += "&j="+value;
+}
+
+
+_formfunctions_{
+
+argfqf="_cgiargfqf_";	
+argfqv="_cgiargfqv_";
+argfqk="_cgiargfqk_";
+argfqs="_cgiargfqs_";
+argfqc="_cgiargfqc_";
+argq = "";
+
+function initialize () \{
+
+   if (document.QueryForm.fqf != null) \{initfqf();\}
+   initfqv();
+   if ( "_cgiargb_" == "1") \{
+      initfqs();	    
+      initfqk();
+      initfqc();
+      initq();
+   \}
+   
+\}
+
+// fqf - the field selection box
+function initfqf() \{
+   var i;
+   fqf = argfqf.split(",");   
+   for (i=0; i<fqf.length; i++) \{
+       for (j=0;j<document.QueryForm.fqf[i].options.length;j++) \{
+	   if (fqf[i] == document.QueryForm.fqf[i].options[j].value) \{
+	      document.QueryForm.fqf[i].options[j].selected = true;
+	      break;	
+	   \}
+	\}
+   \}
+   if (fqf.length < document.QueryForm.fqf.length) \{ // initialize remaining ones
+      for (i=fqf.length;i<document.QueryForm.fqf.length;i++) \{
+	  var z=i;
+	  if (i >= document.QueryForm.fqf[i].options.length) 
+	     z = z-document.QueryForm.fqf[i].options.length;
+
+	  document.QueryForm.fqf[i].options[z].selected = true;
+	  
+      \}
+   \}
+   updatefqf();
+
+\}
+
+function updatefqf() \{
+
+   var i;
+   argfqf = "";
+   var j = document.QueryForm.fqf[0].selectedIndex;
+   argfqf += document.QueryForm.fqf[0].options[j].value;
+   for (i=1; i<document.QueryForm.fqf.length;i++) \{
+      j = document.QueryForm.fqf[i].selectedIndex;
+      argfqf += "," + document.QueryForm.fqf[i].options[j].value;
+   \}
+
+\}
+
+
+function clearfqf() \{
+   var i;
+   for (i=0;i<document.QueryForm.fqf.length;i++) \{
+       var z = i;
+       if (i >= document.QueryForm.fqf[i].options.length) z = z-document.QueryForm.fqf[i].options.length;
+       document.QueryForm.fqf[i].options[z].selected = true;
+   \}
+   updatefqf();
+\}
+
+// fqc - the boolean operator selection box
+function initfqc() \{
+   var i,j;
+   fqc = argfqc.split(",");
+   if (_cgiargfqn_ == 2) \{ // there will only be one fqc element
+       for (j=0;j<document.QueryForm.fqc.options.length;j++) \{
+	   if (fqc[0] == document.QueryForm.fqc.options[j].value) \{
+	      document.QueryForm.fqc.options[j].selected = true;
+	      break;
+	   \}
+       \}   
+   \}
+   else \{   
+   for (i=0; i<fqc.length;i++) \{
+       for (j=0;j<document.QueryForm.fqc[i].options.length;j++) \{
+	   if (fqc[i] == document.QueryForm.fqc[i].options[j].value) \{
+	      document.QueryForm.fqc[i].options[j].selected = true;
+	      break;
+	   \}
+       \}
+   \}
+   \}
+   updatefqc();
+
+\}
+
+function updatefqc() \{
+  
+   var i,j;
+   argfqc = "";
+   if (_cgiargfqn_ == 2) \{
+      j = document.QueryForm.fqc.selectedIndex;
+      argfqc += document.QueryForm.fqc.options[j].value;
+   \}
+   else \{
+	j = document.QueryForm.fqc[0].selectedIndex;
+	argfqc += document.QueryForm.fqc[0].options[j].value;
+	for (i=1;i<document.QueryForm.fqc.length;i++) \{
+	    j = document.QueryForm.fqc[i].selectedIndex;
+	    argfqc += "," + document.QueryForm.fqc[i].options[j].value;
+	\}
+   \}
+
+\}
+
+
+function clearfqc() \{
+   
+   var i;
+   if (_cgiargfqn_ == 2) \{
+       document.QueryForm.fqc.options[0].selected = true;
+   \}
+   else \{
+	for (i=0; i<document.QueryForm.fqc.length; i++) \{
+	    document.QueryForm.fqc[i].options[0].selected = true;
+	\}
+   \}
+   updatefqc();
+\}
+
+// fqv - the query word/phrase text box       
+function initfqv() \{
+
+   var i;
+   fqv= argfqv.split(",");
+   for (i=0; i<fqv.length; i++) \{
+       document.QueryForm.fqv[i].value = fqv[i];
+   \}
+   updatefqv();
+
+
+\}
+
+
+function updatefqv() \{
+
+   var i;
+   argfqv="";
+   argfqv += escape(format(document.QueryForm.fqv[0].value));
+   for (i=1; i<document.QueryForm.fqv.length;i++) \{
+       argfqv += ",";
+       argfqv +=  escape(format(document.QueryForm.fqv[i].value)); 
+   \}
+\}
+
+function clearfqv() \{
+   var i;
+   for (i=0; i< document.QueryForm.fqv.length;i++) \{
+       document.QueryForm.fqv[i].value = "";
+   \}
+   updatefqv();
+\}
+
+// fqs - the stemming checkboxes
+function initfqs() \{
+
+   var i;
+   fqs = argfqs.split(",");
+   for (i=0; i<fqs.length; i++) \{
+       if (fqs[i]=="1") \{
+	  document.QueryForm.fqs[i].checked = true;
+       \}
+   \}
+   updatefqs();
+
+\}
+
+function updatefqs() \{
+   argfqs="";
+   if (document.QueryForm.fqs[0].checked) \{
+      argfqs += "1";
+   \}
+   else \{
+      argfqs += "0";	
+   \}
+   var i;
+   for (i=1; i<document.QueryForm.fqs.length; i++) \{
+       if (document.QueryForm.fqs[i].checked) \{
+	  argfqs += ",1";
+	\}
+	else \{
+	  argfqs += ",0";
+	\}
+   \}
+\}
+
+
+function clearfqs() \{
+   var i;
+   for (i=0; i<document.QueryForm.fqs.length; i++) \{
+       document.QueryForm.fqs[i].checked = false;
+   \}
+   updatefqs();
+\}
+
+// kqk - the casefolding checkboxes
+function initfqk() \{
+   var i;
+   fqk = argfqk.split(",");
+   for (i=0; i<fqk.length; i++) \{
+       if (fqk[i]=="1") \{
+	  document.QueryForm.fqk[i].checked = true;
+       \}
+   \}
+   updatefqk();
+
+\}
+
+
+function updatefqk() \{
+   argfqk="";
+   if (document.QueryForm.fqk[0].checked) \{
+      argfqk += "1";
+   \}
+   else \{
+      argfqk += "0";	
+   \}
+   var i;
+   for (i=1; i<document.QueryForm.fqk.length; i++) \{
+       if (document.QueryForm.fqk[i].checked) \{
+	  argfqk += ",1";
+	\}
+	else \{
+	  argfqk += ",0";
+	\}
+   \}
+\}
+
+function clearfqk() \{
+   var i;
+   for (i=0; i<document.QueryForm.fqk.length; i++) \{
+       document.QueryForm.fqk[i].checked = false;
+   \}
+   updatefqk();
+\}
+
+// q - the advanced query box
+function initq() \{
+   updateq();
+\}
+
+function updateq() \{
+   argq = "";
+   argq += escape(document.QueryForm.q.value);
+\}
+
+function clearq() \{
+   document.QueryForm.q.value="";
+\}
+
+
+// convert commas and spaces to plus
+function format(string) \{
+   var str = "" + string;
+   var out = "", flag = 0;
+   var j;
+   for (j = 0; j < str.length; j++) \{
+       if (str.charAt(j) == " "|| str.charAt(j) == ",") \{
+       if ( flag == 0) \{
+	  out += "+";
+	  flag=1;
+	  \}
+	\}
+       else \{
+          out += str.charAt(j);
+	  flag=0;
+       \}
+   \}
+   return out;
+\}
+
+}
+
+#_httpquery_ has a=q&e=compressedargs
+#if adv form, need to set k=0 and s=0
+_advformargs_{_If_(_cgiargb_,&k=0&s=0)}
+
+_searchfunctions_ {
+
+function beginSearch() \{
+window.location="_httpquery_"+getstdargs()+"_advformargs_"+getsearchargs();
+\}
+
+function runQuery() \{
+window.location="_httpquery_"+getstdargs()+"_advformargs_"+getqueryargs();
+\}
+
+function clearForm() \{
+   clearfqf();
+   clearfqv();
+
+   if ("_cgiargb_" == "1") \{
+      clearfqk();
+      clearfqs();
+      clearfqc();
+   \}
+
+\}
+
+}
+
+#######################################################################
+# headers
+# these are overridden so we can put an onLoad event handler
+# in the <body> tag of this page - for mgpp, form search pages
+#######################################################################
+
+#copied from prefs 
+
+_header_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_" onLoad="initialize();")_startspacer__pagebanner_
+}
+
+# this declaration ends up being the same as style=restrict, never mind
+_header_[v=1] {_cgihead_
+_htmlhead_(onLoad="initialize();")_pagebanner_
+}
+
+#######################################################################
+# page content
+#######################################################################
+
+
+_pagetitle_ {_If_(_cgiargq_,_textquerytitle_,_textnoquerytitle_)}
+
+
+_content_ {
+<center>
+_navigationbar_
+</center>
+<center>
+_If_(_cgiargct_,_selectqueryform_,_queryform_)
+</center>
+_If_(_searchhistorylist_,<center>_iconsearchhistorybar_</center><br>
+<center>
+_searchhistorylist_
+</center>)
+_If_(_cgiargq_,<center>_iconqueryresultsbar_</center><br>
+<small>
+_freqmsg_
+_textpostprocess_</small><br>
+_resultline_
+,<center>_iconblankbar_</center>)<br>
+}
+
+_selectqueryform_{_If_(_cgiargqt_,_fieldqueryform_,_queryform_)}
+
+_queryform_ {
+<!-- query form (\_query:queryform\_) -->
+<form name=QueryForm method=get action="_gwcgi_">
+
+<input type=hidden name="a" value="q">
+<input type=hidden name="r" value="1">
+<input type=hidden name="hs" value="1">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+_queryformcontent_
+
+</form>
+<!-- end of query form -->
+}
+
+_queryformcontent_{_basicqueryform_}
+
+_basicqueryform_ {<table><tr><td>
+<nobr>_textselect_</nobr>
+</td></tr>
+<tr><td>
+_If_(_cgiargqb_,_largequerybox_,_smallquerybox_)
+</td></tr></table>
+}
+
+_datesearch_
+{<table><tr><td>
+	<center>
+_textstartdate_
+<input type="text" name="ds" value = "_cgiargds_"size="4" maxlength="4">
+<select name="dsbc" value="_cgiargdsbc_" size="1">
+	<option value = "0"_If_(_cgiargdsbc_,, selected)>_textad_
+	<option value = "1"_If_(_cgiargdsbc_, selected)>_textbc_
+</select> 
+_textenddate_
+<input type="text" name="de" value = "_cgiargde_" size="4" maxlength="4"> 
+<select name="debc" size="1">
+	<option value = "0" _If_(_cgiargdebc_,, selected)>_textad_
+	<option value = "1" _If_(_cgiargdebc_, selected)>_textbc_
+</select> 
+</center>	  
+</tr></td>
+<tr><td>
+_textexplaineras_
+</tr></td>
+</table>
+</center>
+}
+
+_smallquerybox_ {<tr><td><nobr><input type="text" name="q" value="_cgiargq_" size="50">
+<input type="submit" value="_textbeginsearch_"></nobr>}
+
+_largequerybox_ {
+<tr><td><textarea name="q" cols=63 rows=10>
+_cgiargq_
+</textarea></td></tr>
+<tr align=right><td><table>
+<tr><td><input type="submit" value="_textbeginsearch_"></td>
+</tr></table></td></tr>}
+
+
+_fieldqueryform_ {
+<!-- field query form (\_query:fieldqueryform\_) -->
+<form name=QueryForm method=get action="_gwcgi_">
+<table><tr><td>
+<nobr>
+_textformselect_
+</nobr>
+</td></tr>
+_If_(_cgiargb_,_advancedforms_,_simpleforms_)
+</table>
+_If_(_cgiargb_,<center>_iconblankbar_</center><br>
+<center>_advancedformextra_</center>)
+</form>
+<!-- end of query form -->
+}
+
+_advancedforms_{
+<tr><td><center> <table border=0 cellspacing=0 cellpadding=0 width="90%">
+<tr><th></th><th align=left>_textwordphrase_</th><th colspan=2><nobr>_textfoldstem_</nobr></th><th align=center>&nbsp;&nbsp;_textinfield_</th></tr>	
+_advformlist_
+<tr><td colspan=2><input type=button value="_textclearform_" onClick="clearForm();"></td>
+<td colspan=3><table>
+<tr><td><input type=button value="_textbeginsearch_" onClick="beginSearch();"></td>
+</tr></table></td></tr>
+</table></td></tr>
+}
+
+_advancedformextra_{
+<table>
+<tr><td>_textadvquery_</td></tr>
+<tr><td><textarea name=q cols=57 rows=3 onChange="updateq();">_cgiargq_</textarea></td>
+<td valign=bottom>
+<input type="button" value="_textrunquery_" onClick="runQuery();"></td></tr>
+</table>
+}
+
+_simpleforms_{
+<tr><td><center> <table border=0 cellspacing=0 cellpadding=0 width="90%">
+<tr><th align=left>_textwordphrase_</th><th align=left>&nbsp;&nbsp;_textinfield_</th></tr>	
+_regformlist_
+<tr><td><input type=button value="_textclearform_" onClick="clearForm();"></td>
+<td><table>
+<tr><td><input type=button value="_textbeginsearch_" onClick="beginSearch();"></td>
+</tr>
+</table></td></tr>
+</table></td></tr>}
+
+_regformelement_{
+<td><input type=text size=39 name="fqv" onChange="updatefqv();"></td>
+<td>_fqfselection_</td>}
+
+#has no and/or/not selection box
+_firstadvformelement_{
+<td></td><td><input type=text size=31 name="fqv" onChange="updatefqv();"></td>
+<td align=center><input type=checkbox name="fqk" onClick="updatefqk();""></td>
+<td align-center><input type=checkbox name="fqs" onClick="updatefqs();"></td>
+<td align=right>_fqfselection_</td>}
+
+_advformelement_{
+<td>_fqcselection_</td>
+<td><input type=text size=31 name="fqv" onChange="updatefqv();"></td>
+<td align=center><input type=checkbox name="fqk" onClick="updatefqk();"></td>
+<td align-center><input type=checkbox name="fqs" onClick="updatefqs();"></td>
+<td align=right>_fqfselection_</td>}
+
+_fqcselection_ {
+<select name="fqc" onChange="updatefqc();">
+<option value="and">_textand_
+<option value="or">_textor_
+<option value="not">_textandnot_
+</select>}
+
+_textselect_ {_If_(_cgiargb_,_textadvancedsearch_,_textsimplesearch_)}
+_textformselect_ {_If_(_cgiargb_,_textformadvancedsearch_,_textformsimplesearch_)}
+
+_ZZ_{_textallfields_}
+
+# we want to put the links to previous/next pages of results
+# in the footer
+_pagefooterextra_ {
+<center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr>
+<td align=left>_If_(_prevfirst_,<a href="_httpquery_&r=_prevfirst_">_iconprev__textmatches__prevfirst_ - _prevlast_</a>)</td>
+<td align=right>_If_(_nextfirst_,<a href="_httpquery_&r=_nextfirst_">_textmatches__nextfirst_ - _nextlast__iconnext_</a>)</td>
+</tr></table>
+</center>
+}
+
+_querytypeselection_ {
+<select name="t">
+<option value="1"_If_(_cgiargt_, selected)>_textsome_
+<option value="0"_If_(_cgiargt_,, selected)>_textall_
+</select>
+}
+
+_formquerytypeselection_ {
+<select name="t">
+<option value="1"_If_(_cgiargt_, selected)>_textformsome_
+<option value="0"_If_(_cgiargt_,, selected)>_textformall_
+</select>
+}
+
+
Index: /main/tags/2.38/gsdl/macros/russian.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/russian.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/russian.dm	(revision 21083)
@@ -0,0 +1,993 @@
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=ru] {Ð¢ÑÐµÐ±ÑÐµÐŒÐ°Ñ ÑÑÑÐ°ÐœÐžÑÐ° ÐœÐµ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐœÐ°Ð¹ÐŽÐµÐœÐ°. ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ° ÐœÐ°Ð¶ÐŒÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÑ 'back' Ð² Ð²Ð°ÑÐµÐŒ Ð±ÑÐ°ÑÐ·ÐµÑÐµ ÐžÐ»Ðž ÑÑÑÐ»ÐºÑ ÐœÐ° ÐŽÐŸÐŒÐ°ÑÐœÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž.}
+
+_textdefaulttitle_ [l=ru] {ÐÑÐžÐ±ÐºÐ°}
+
+_collectionextra_ [l=ru] {ÐÐ°ÐœÐœÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐŸÐŽÐµÑÐ¶ÐžÑ _about:numdocs_ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². 
+ÐÐŸÑÐ»ÐµÐŽÐœÐžÐµ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ Ð±ÑÐ»Ðž Ð¿ÑÐŸÐžÐ·Ð²ÐµÐŽÐµÐœÑ _about:builddate_ ÐŽÐœÐµÐ¹ ÐœÐ°Ð·Ð°ÐŽ.}
+
+_textimagecollection_ [l=ru] {}
+_textimageabout_ [l=ru] {Ð Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐµ}
+_textimagehome_ [l=ru] {ÐÐŸÐŒÐ°ÑÐœÑÑ ÑÑÑÐ°ÐœÐžÑÐ°}
+_textimagehelp_ [l=ru] {Ð¡ÑÑÐ°ÐœÐžÑÐ° Ð¿ÐŸÐŒÐŸÑÐž}
+_textimagepref_ [l=ru] {ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž}
+_textimagegreenstone_ [l=ru] {Ð­Ð»ÐµÐºÑÑÐŸÐœÐœÐ°Ñ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° ÐÐ°ÑÐÐÐ}
+
+_textimagesearch_ [l=ru] {ÐÐŸÐžÑÐº}
+_textimageTitle_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑÐŒ}
+_textimageList_ [l=ru] { ÐÐ±ÑÐžÐ¹ ÑÐ¿ÐžÑÐŸÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²}
+_textimageCreator_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°Ð²ÑÐŸÑÐ°ÐŒ}
+_textimageSeries_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð²ÑÐ¿ÑÑÐºÐ°ÐŒ}
+_textimageDate_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŽÐ°ÑÐ°ÐŒ}
+_textimageSubject_ [l=ru] {ÐÑÐµÐŽÐŒÐµÑÐœÑÐ¹ ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ}
+_textimageTo_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°ÐŽÑÐµÑÐ°ÑÐ°ÐŒ}
+_textimageFrom_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»ÑÐŒ}
+_textimageOrganization_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑÐŒ}
+_textimageHowto_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ¿ÐŸÑÐŸÐ±Ð°ÐŒ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÑ}
+_textimageTopic_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐµÐŒÐ°ÐŒ}
+_textimageBrowse_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ}
+_textimagePeople_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÐžÑÐŒ}
+_textimageLanguage_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ·ÑÐºÐ°ÐŒ}
+_textimageAcronym_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°ÐºÑÐŸÐœÐžÐŒÐ°ÐŒ}
+_textimagePhrase_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÑÐ°Ð·Ð°ÐŒ}
+
+_texticontabsearchgreen_ [l=ru] {ÐÐŸÐžÑÐº}
+_texticontabdategreen_ [l=ru] {ÐÐ°ÑÑ}
+_texticontabseriesgreen_ [l=ru] {ÐÑÐ¿ÑÑÐºÐž}
+_texticontabauthorgreen_ [l=ru] {ÐÐ²ÑÐŸÑÑ Ð-Ð¯}
+_texticontabtitlegreen_ [l=ru] {ÐÐ°Ð·Ð²Ð°ÐœÐžÑ Ð-Ð¯}
+_texticontablistgreen_ [l=ru] {Ð¡Ð¿ÐžÑÐŸÐº}
+_texticontabsubjectgreen_ [l=ru] {Ð£ÐºÐ°Ð·Ð°ÑÐµÐ»Ñ}
+_texticontabtogreen_ [l=ru] {ÐÐŸÐŒÑ}
+_texticontabfromgreen_ [l=ru] {ÐÑ ÐºÐŸÐ³ÐŸ}
+_texticontaborggreen_ [l=ru] {ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž}
+_texticontabhowgreen_ [l=ru] {Ð¡Ð¿ÐŸÑÐŸÐ±Ñ}
+_texticontabtopicgreen_ [l=ru] {Ð¢ÐµÐŒÑ}
+_texticontabbrwsegreen_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ}
+_texticontabPeoplegreen_ [l=ru] {ÐÐµÑÑÐŸÐœÐ°Ð»ÐžÐž Ð-Ð¯}
+_texticontabLanguagegreen_ [l=ru] {Ð¯Ð·ÑÐºÐž}
+_texticontabAcronymgreen_ [l=ru] {ÐÐºÑÐŸÐœÐžÐŒÑ}
+_texticontabPhrasegreen_ [l=ru] {Ð€ÑÐ°Ð·Ñ}
+
+_texticontext_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°}
+_texticonclosedbook_ [l=ru] {ÐÑÐºÑÑÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ðž Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ}
+_texticonnext_ [l=ru] {Ð¡Ð»ÐµÐŽÑÑÑÐ°Ñ ÑÐµÐºÑÐžÑ}
+_texticonprev_ [l=ru] {ÐÑÐµÐŽÑÐŽÑÑÐ°Ñ ÑÐµÐºÑÐžÑ}
+
+_texticonmidi_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° MIDI}
+_texticonmsword_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Microsoft Word}
+_texticonpdf_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° PDF}
+_texticonps_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° PS}
+_texticonppt_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° PPT}
+_texticonrtf_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° RTF}
+_texticonxls_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° XLS}
+
+_page_ [l=ru] {Ð¡ÑÑÐ°ÐœÐžÑÐ°}
+_pages_ [l=ru] {Ð¡ÑÑÐ°ÐœÐžÑÑ}
+_of_ [l=ru] { ÐžÐ· }
+_vol_ [l=ru] {Ð¢ÐŸÐŒ}
+_num_ [l=ru] {ÐÐŸÐŒÐµÑ}
+
+_textmonth00_ [l=ru] {}
+_textmonth01_ [l=ru] {Ð¯ÐœÐ²Ð°ÑÑ}
+_textmonth02_ [l=ru] {Ð€ÐµÐ²ÑÐ°Ð»Ñ}
+_textmonth03_ [l=ru] {ÐÐ°ÑÑ}
+_textmonth04_ [l=ru] {ÐÐ¿ÑÐµÐ»Ñ}
+_textmonth05_ [l=ru] {ÐÐ°Ð¹}
+_textmonth06_ [l=ru] {ÐÑÐœÑ}
+_textmonth07_ [l=ru] {ÐÑÐ»Ñ}
+_textmonth08_ [l=ru] {ÐÐ²Ð³ÑÑÑ}
+_textmonth09_ [l=ru] {Ð¡ÐµÐœÑÑÐ±ÑÑ}
+_textmonth10_ [l=ru] {ÐÐºÑÑÐ±ÑÑ}
+_textmonth11_ [l=ru] {ÐÐŸÑÐ±ÑÑ}
+_textmonth12_ [l=ru] {ÐÐµÐºÐ°Ð±ÑÑ}
+
+_Document_ [l=ru] {ÐÐŸÐºÑÐŒÐµÐœÑ}
+_Section_ [l=ru] {Ð¡ÐµÐºÑÐžÑ}
+_Paragraph_ [l=ru] {ÐÐ±Ð·Ð°Ñ}
+
+_magazines_ [l=ru] {ÐÑÑÐœÐ°Ð»Ñ}
+
+_nzdlpagefooter_ [l=ru] {<p>_iconblankbar_
+<p><a href="http://www.nzdl.org">New Zealand Digital Library Project</a>
+<br><a href="http://www.cs.waikato.ac.nz/cs">Department of Computer Science</a>, 
+<a href="http://www.waikato.ac.nz">University of Waikato</a>, 
+New Zealand}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "ÐÐÐ§ÐÐÐ" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=ru] {_httpimg_/ru/chomeof.gif}
+_httpiconchomeon_ [l=ru] {_httpimg_/ru/chomeon.gif}
+
+## "ÐÐÐÐÐ©Ð¬" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=ru] {_httpimg_/ru/chelpof.gif}
+_httpiconchelpon_ [l=ru] {_httpimg_/ru/chelpon.gif}
+
+## "ÐÐÐ¡Ð¢Ð ÐÐÐÐ" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=ru] {_httpimg_/ru/cprefof.gif}
+_httpiconcprefon_ [l=ru] {_httpimg_/ru/cprefon.gif}
+
+## "Ð¿ÐŸÐŒÐŸÑÑ" ## green_title ## h_help ##
+_httpiconhhelp_ [l=ru] {_httpimg_/ru/h\_help.gif}
+_widthhhelp_ [l=ru] {200}
+_heighthhelp_ [l=ru] {57}
+
+## "Ð°Ð²ÑÐŸÑÑ Ð°-Ñ" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=ru] {_httpimg_/ru/tauthgr.gif}
+_httpicontauthof_ [l=ru] {_httpimg_/ru/tauthof.gif}
+_httpicontauthon_ [l=ru] {_httpimg_/ru/tauthon.gif}
+_widthtauthx_ [l=ru] {110}
+
+## "Ð²ÑÐ¿ÑÑÐºÐž" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=ru] {_httpimg_/ru/tsergr.gif}
+_httpicontserof_ [l=ru] {_httpimg_/ru/tserof.gif}
+_httpicontseron_ [l=ru] {_httpimg_/ru/tseron.gif}
+_widthtserx_ [l=ru] {87}
+
+## "ÐŽÐ°ÑÑ" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=ru] {_httpimg_/ru/tdategr.gif}
+_httpicontdateof_ [l=ru] {_httpimg_/ru/tdateof.gif}
+_httpicontdateon_ [l=ru] {_httpimg_/ru/tdateon.gif}
+_widthtdatex_ [l=ru] {87}
+
+## "ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=ru] {_httpimg_/ru/tsubjgr.gif}
+_httpicontsubjon_ [l=ru] {_httpimg_/ru/tsubjon.gif}
+_httpicontsubjof_ [l=ru] {_httpimg_/ru/tsubjof.gif}
+_widthtsubjx_ [l=ru] {87}
+
+## "ÐºÐŸÐŒÑ" ## nav_bar_button ## tto ##
+_httpiconttogr_ [l=ru] {_httpimg_/ru/ttogr.gif}
+_httpiconttoon_ [l=ru] {_httpimg_/ru/ttoon.gif}
+_httpiconttoof_ [l=ru] {_httpimg_/ru/ttoof.gif}
+_widthttox_ [l=ru] {87}
+
+## "ÐŸÑ ÐºÐŸÐ³ÐŸ" ## nav_bar_button ## tfrom ##
+_httpicontfromgr_ [l=ru] {_httpimg_/ru/tfromgr.gif}
+_httpicontfromon_ [l=ru] {_httpimg_/ru/tfromon.gif}
+_httpicontfromof_ [l=ru] {_httpimg_/ru/tfromof.gif}
+_widthtfromx_ [l=ru] {87}
+
+## "ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=ru] {_httpimg_/ru/torggr.gif}
+_httpicontorgon_ [l=ru] {_httpimg_/ru/torgon.gif}
+_httpicontorgof_ [l=ru] {_httpimg_/ru/torgof.gif}
+_widthtorgx_ [l=ru] {109}
+
+## "ÑÐ¿ÐŸÑÐŸÐ±Ñ" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=ru] {_httpimg_/ru/thowgr.gif}
+_httpiconthowon_ [l=ru] {_httpimg_/ru/thowon.gif}
+_httpiconthowof_ [l=ru] {_httpimg_/ru/thowof.gif}
+_widththowx_ [l=ru] {87}
+
+## "ÑÐµÐŒÑ" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=ru] {_httpimg_/ru/ttopicgr.gif}
+_httpiconttopicon_ [l=ru] {_httpimg_/ru/ttopicon.gif}
+_httpiconttopicof_ [l=ru] {_httpimg_/ru/ttopicof.gif}
+_widthttopicx_ [l=ru] {87}
+
+## "ÑÐ¿ÐžÑÐŸÐº" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=ru] {_httpimg_/ru/tbrwsegr.gif}
+_httpicontbrwseon_ [l=ru] {_httpimg_/ru/tbrwseon.gif}
+_httpicontbrwseof_ [l=ru] {_httpimg_/ru/tbrwseof.gif}
+_widthtbrwsex_ [l=ru] {87}
+
+## "Ð¿ÐŸÐžÑÐº" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=ru] {_httpimg_/ru/tsrchgr.gif}
+_httpicontsrchof_ [l=ru] {_httpimg_/ru/tsrchof.gif}
+_httpicontsrchon_ [l=ru] {_httpimg_/ru/tsrchon.gif}
+_widthtsrchx_ [l=ru] {87}
+
+## "ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ Ð°-Ñ" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=ru] {_httpimg_/ru/ttitlgr.gif}
+_httpiconttitlof_ [l=ru] {_httpimg_/ru/ttitlof.gif}
+_httpiconttitlon_ [l=ru] {_httpimg_/ru/ttitlon.gif}
+_widthttitlx_ [l=ru] {114}
+
+## "Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÐžÐž" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=ru] {_httpimg_/ru/tpeopgr.gif}
+_httpicontpeopof_ [l=ru] {_httpimg_/ru/tpeopof.gif}
+_httpicontpeopon_ [l=ru] {_httpimg_/ru/tpeopon.gif}
+_widthtpeopx_ [l=ru] {87}
+
+## "ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ" ## nav_bar_button ## tlang ##
+_httpicontlanggr_ [l=ru] {_httpimg_/ru/tlanggr.gif}
+_httpicontlangon_ [l=ru] {_httpimg_/ru/tlangon.gif}
+_httpicontlangof_ [l=ru] {_httpimg_/ru/tlangof.gif}
+_widthtlangx_ [l=ru] {87}
+
+## "Ð°ÐºÑÐŸÐœÐžÐŒÑ" ## nav_bar_button ## tacro ##
+_httpicontacrogr_ [l=ru] {_httpimg_/ru/tacrogr.gif}
+_httpicontacroof_ [l=ru] {_httpimg_/ru/tacroof.gif}
+_httpicontacroon_ [l=ru] {_httpimg_/ru/tacroon.gif}
+_widthtacrox_ [l=ru] {87}
+
+## "ÑÑÐ°Ð·Ñ" ## nav_bar_button ## tphrse ##
+_httpicontphrsegr_ [l=ru] {_httpimg_/ru/tphrsegr.gif}
+_httpicontphrseof_ [l=ru] {_httpimg_/ru/tphrseof.gif}
+_httpicontphrseon_ [l=ru] {_httpimg_/ru/tphrseon.gif}
+_widthtphrsex_ [l=ru] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=ru] {ÐÐµÐŒÐœÐŸÐ³ÐŸ ÐŸ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž}
+
+_textsubcols1_ [l=ru] {<p>ÐÐ°ÐœÐœÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÑÐŸÐŽÐµÑÐ¶ÐžÑ _1_ Ð¿ÐŸÐŽÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹:
+<blockquote>}
+
+_textsubcols2_ [l=ru] {</blockquote>
+ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ/ÐžÐ·ÐŒÐµÐœÐžÑÑ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐŸÐŽÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ ÑÐµÐ¹ÑÐ°Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÐµ, ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "ÐŸÐ¿ÐžÑÐ°ÐœÐžÐµ" ## green_title ## h_about ##
+_httpiconhabout_ [l=ru] {_httpimg_/ru/h\_about.gif}
+_widthhabout_ [l=ru] {200}
+_heighthabout_ [l=ru] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=ru] {ÐÐ°Ð·Ð²Ð°ÐœÐžÑ Ð-Ð¯}
+_texticonhauth_ [l=ru] {ÐÐ²ÑÐŸÑÑ Ð-Ð¯}
+_texticonhsubj_ [l=ru] {Ð£ÐºÐ°Ð·Ð°ÑÐµÐ»Ñ}
+_texticonhto_ [l=ru] {ÐÐŸÐŒÑ}
+_texticonhfrom_ [l=ru] {ÐÑ ÐºÐŸÐ³ÐŸ}
+_texticonhser_ [l=ru] {ÐÑÐ¿ÑÑÐºÐž}
+_texticonhdate_ [l=ru] {ÐÐ°ÑÑ}
+_texticonhhow_ [l=ru] {Ð¡Ð¿ÐŸÑÐŸÐ±Ñ}
+_texticonhorg_ [l=ru] {ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž}
+_texticonhbrwse_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ}
+_texticonhpeople_ [l=ru] {ÐÐµÑÑÐŸÐœÐ°Ð»ÐžÐž Ð-Ð¯}
+_texticonhlanguage_ [l=ru] {Ð¯Ð·ÑÐºÐž}
+_texticonhacronym_ [l=ru] {ÐÐºÑÐŸÐœÐžÐŒÑ}
+_texticonhphrases_ [l=ru] {Ð€ÑÐ°Ð·Ñ}
+
+_texticonopenbookshelf_ [l=ru] {ÐÐ°ÐºÑÑÑÑ ÑÐµÐºÑÐžÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž}
+_texticonclosedbookshelf_ [l=ru] {ÐÑÐºÑÑÑÑ ÑÐµÐºÑÐžÑ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Ðž Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ}
+_texticonopenbook_ [l=ru] {ÐÐ°ÐºÑÑÑÑ ÐºÐœÐžÐ³Ñ}
+_texticonclosedfolder_ [l=ru] {ÐÑÐºÑÑÑÑ Ð¿Ð°Ð¿ÐºÑ Ðž Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ}
+_texticonclosedfolder2_ [l=ru] {ÐÑÐºÑÑÑÑ Ð¿ÐŸÐŽÑÐµÐºÑÐžÑ: }
+_texticonopenfolder_ [l=ru] {ÐÐ°ÐºÑÑÑÑ Ð¿Ð°Ð¿ÐºÑ}
+_texticonopenfolder2_ [l=ru] {ÐÐ°ÐºÑÑÑÑ Ð¿ÐŸÐŽÑÐµÐºÑÐžÑ: }
+_texticonsmalltext_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÑÐµÐºÑÐžÐž ÑÐµÐºÑÑÐ°}
+_texticonsmalltext2_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÑÐµÐºÑÑÐ°: }
+_texticonpointer_ [l=ru] {Ð¢ÐµÐºÑÑÐ°Ñ ÑÐµÐºÑÐžÑ}
+_texticondetach_ [l=ru] {ÐÑÐºÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ}
+_texticonhighlight_ [l=ru] {ÐÑÐŽÐµÐ»ÐžÑÑ ÐžÑÐºÐŸÐŒÑÐµ ÑÐµÑÐŒÐžÐœÑ}
+_texticonnohighlight_ [l=ru] {ÐÐµ Ð²ÑÐŽÐµÐ»ÑÑÑ ÐžÑÐºÐŸÐŒÑÐµ ÑÐµÑÐŒÐžÐœÑ}
+_texticoncontracttoc_ [l=ru] {Ð¡Ð²ÐµÑÐœÑÑÑ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ }
+_texticonexpandtoc_ [l=ru] {Ð Ð°ÑÐºÑÑÑÑ Ð²ÑÐµ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ}
+_texticonexpandtext_ [l=ru] {ÐÐŸÐºÐ°Ð·Ð°ÑÑ Ð²ÐµÑÑ ÑÐµÐºÑÑ}
+_texticoncontracttext_ [l=ru] {ÐÐŸÐºÐ°Ð·Ð°ÑÑ ÑÐµÐºÑÑ ÑÐŸÐ»ÑÐºÐŸ ÐŽÐ»Ñ Ð²ÑÐŽÐµÐ»ÐµÐœÐœÑÑ
+ ÑÐµÐºÑÐžÐ¹}
+_texticonwarning_ [l=ru] {<b>ÐÐœÐžÐŒÐ°ÐœÐžÐµ: </b>}
+_texticoncont_ [l=ru] {Ð¿ÑÐŸÐŽÐŸÐ»Ð¶ÐžÑÑ?}
+
+_textltwarning_ [l=ru] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_ ÐÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÐµ Ð²ÑÐµÐ³ÐŸ ÑÐµÐºÑÑÐ° Ð¿ÑÐžÐ²ÐµÐŽÐµÑ Ðº ÑÐ²ÐµÐ»ÐžÑÐµÐœÐžÑ  ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž ÐŽÐ»Ñ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð² Ð±ÑÐ°ÑÐ·ÐµÑÐµ _imagecont_
+</td></tr></table></center>
+}
+
+_textgoto_ [l=ru] {Ð¿ÐµÑÐµÐ¹ÑÐž ÐœÐ° ÑÑÑÐ°ÐœÐžÑÑ}
+_textintro_ [l=ru] { <i>(Ð²Ð²ÐµÐŽÐµÐœÐžÐµ)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ Ð°-Ñ" ## green_title ## h_title ##
+_httpiconhtitle_ [l=ru] {_httpimg_/ru/h\_title.gif}
+_widthhtitle_ [l=ru] {200}
+_heighthtitle_ [l=ru] {57}
+
+## "Ð°Ð²ÑÐŸÑÑ Ð°-Ñ" ## green_title ## h_auth ##
+_httpiconhauth_ [l=ru] {_httpimg_/ru/h\_auth.gif}
+_widthhauth_ [l=ru] {200}
+_heighthauth_ [l=ru] {57}
+
+## "ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=ru] {_httpimg_/ru/h\_subj.gif}
+_widthhsubj_ [l=ru] {200}
+_heighthsubj_ [l=ru] {57}
+
+## "ÐºÐŸÐŒÑ" ## green_title ## h_to ##
+_httpiconhto_ [l=ru] {_httpimg_/ru/h\_to.gif}
+_widthhto_ [l=ru] {200}
+_heighthto_ [l=ru] {57}
+
+## "ÐŸÑ ÐºÐŸÐ³ÐŸ" ## green_title ## h_from ##
+_httpiconhfrom_ [l=ru] {_httpimg_/ru/h\_from.gif}
+_widthhfrom_ [l=ru] {200}
+_heighthfrom_ [l=ru] {57}
+
+## "Ð²ÑÐ¿ÑÑÐºÐž" ## green_title ## h_ser ##
+_httpiconhser_ [l=ru] {_httpimg_/ru/h\_ser.gif}
+_widthhser_ [l=ru] {200}
+_heighthser_ [l=ru] {57}
+
+## "ÐŽÐ°ÑÑ" ## green_title ## h_date ##
+_httpiconhdate_ [l=ru] {_httpimg_/ru/h\_date.gif}
+_widthhdate_ [l=ru] {200}
+_heighthdate_ [l=ru] {57}
+
+## "ÑÐ¿ÐŸÑÐŸÐ±Ñ" ## green_title ## h_how ##
+_httpiconhhow_ [l=ru] {_httpimg_/ru/h\_how.gif}
+_widthhhow_ [l=ru] {200}
+_heighthhow_ [l=ru] {57}
+
+## "ÑÐµÐŒÑ" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=ru] {_httpimg_/ru/h\_topic.gif}
+_widthhtopic_ [l=ru] {200}
+_heighthtopic_ [l=ru] {57}
+
+## "ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž" ## green_title ## h_org ##
+_httpiconhorg_ [l=ru] {_httpimg_/ru/h\_org.gif}
+_widthhorg_ [l=ru] {250}
+_heighthorg_ [l=ru] {57}
+
+## "ÑÐ¿ÐžÑÐŸÐº" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=ru] {_httpimg_/ru/h\_brwse.gif}
+_widthhbrwse_ [l=ru] {200}
+_heighthbrwse_ [l=ru] {57}
+
+## "Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÐžÐž" ## green_title ## h_people ##
+_httpiconhpeople_ [l=ru] {_httpimg_/ru/h\_people.gif}
+_widthhpeople_ [l=ru] {200}
+_heighthpeople_ [l=ru] {57}
+
+## "ÑÐ·ÑÐºÐž" ## green_title ## h_lang ##
+_httpiconhlanguage_ [l=ru] {_httpimg_/ru/h\_lang.gif}
+_widthhlanguage_ [l=ru] {200}
+_heighthlanguage_ [l=ru] {57}
+
+## "Ð°ÐºÑÐŸÐœÐžÐŒÑ" ## green_title ## h_acro ##
+_httpiconhacronym_ [l=ru] {_httpimg_/ru/h\_acro.gif}
+_widthhacronym_ [l=ru] {200}
+_heighthacronym_ [l=ru] {57}
+
+## "ÑÑÐ°Ð·Ñ" ## green_title ## h_phrse ##
+_httpiconhphrse_ [l=ru] {_httpimg_/ru/h\_phrse.gif}
+_widthhphrse_ [l=ru] {200}
+_heighthphrse_ [l=ru] {57}
+
+## "ÐÐ ÐÐÐÐÐÐÐ¢Ð¬?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=ru] {_httpimg_/ru/contof.gif}
+_httpiconconton_ [l=ru] {_httpimg_/ru/conton.gif}
+
+## "ÐÐÐ¡Ð¬ Ð¢ÐÐÐ¡Ð¢" ## document_button ## eallt ## 
+_httpiconealltof_ [l=ru] {_httpimg_/ru/ealltof.gif}
+_httpiconeallton_ [l=ru] {_httpimg_/ru/eallton.gif}
+
+## "  Ð¡ÐÐÐ ÐÐ£Ð¢Ð¬
+#ÐÐÐÐÐÐÐÐÐÐ" ## document_button ## econc ##
+_httpiconeconcof_ [l=ru] {_httpimg_/ru/econcof.gif}
+_httpiconeconcon_ [l=ru] {_httpimg_/ru/econcon.gif}
+
+## "ÐÐÐÐÐ ÐÐÐÐ" ## document_button ## edtch ##
+_httpiconedtchof_ [l=ru] {_httpimg_/ru/edtchof.gif}
+_httpiconedtchon_ [l=ru] {_httpimg_/ru/edtchon.gif}
+
+## "  Ð ÐÐ¡ÐÐ Ð«Ð¢Ð¬
+#ÐÐÐÐÐÐÐÐÐÐ" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=ru] {_httpimg_/ru/eexpcof.gif}
+_httpiconeexpcon_ [l=ru] {_httpimg_/ru/eexpcon.gif}
+
+## "Ð¡ÐÐÐ ÐÐ£Ð¢Ð¬
+#    Ð¢ÐÐÐ¡Ð¢" ## document_button ## etsec ##
+_httpiconetsecof_ [l=ru] {_httpimg_/ru/etsecof.gif}
+_httpiconetsecon_ [l=ru] {_httpimg_/ru/etsecon.gif}
+
+## "ÐÐ«ÐÐÐÐÐ¢Ð¬
+#    Ð¡ÐÐÐÐ" ## document_button ## ehl ##
+_httpiconehlof_ [l=ru] {_httpimg_/ru/ehlof.gif}
+_httpiconehlon_ [l=ru] {_httpimg_/ru/ehlon.gif}
+
+## "     Ð¡ÐÐ¯Ð¢Ð¬
+#ÐÐ«ÐÐÐÐÐÐÐ" ## document_button ## enhl ##
+_httpiconenhlof_ [l=ru] {_httpimg_/ru/enhlof.gif}
+_httpiconenhlon_ [l=ru] {_httpimg_/ru/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=ru] {_If_(_thislast_,ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÑ _thisfirst_ - _thislast_ Ð¿ÐŸÐžÑÐºÐ° Ð¿ÐŸ Ð·Ð°Ð¿ÑÐŸÑÑ: _cgiargq_,ÐÐžÑÐµÐ³ÐŸ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐŸ Ð¿ÐŸ Ð·Ð°Ð¿ÑÐŸÑÑ: _cgiargq_)}
+_textnoquerytitle_ [l=ru] {Ð¡ÑÑÐ°ÐœÐžÑÐ° Ð¿ÐŸÐŒÐŸÑÐž}
+
+_texticonthispage_ [l=ru] {ÐÐŸÐžÑÐº}
+_textsome_ [l=ru] {_If_(_cgiargb_,ÑÐ¿ÐŸÑÑÐŽÐŸÑÐµÐœÐœÑÐ¹,ÐœÐµÐºÐŸÑÐŸÑÑÐµ)}
+_textall_ [l=ru] {_If_(_cgiargb_,Ð»ÐŸÐ³ÐžÑÐµÑÐºÐžÐ¹,Ð²ÑÐµ)}
+_textformsome_ [l=ru] {_If_(_cgiargb_,ÑÐ¿ÐŸÑÑÐŽÐŸÑÐµÐœÐœÑÐ¹,ÐœÐµÐºÐŸÑÐŸÑÑÐµ)}
+_textformall_ [l=ru] {_If_(_cgiargb_,ÐŸÐ±ÑÑÐœÑÐ¹,Ð²ÑÐµ)}
+_texticonqueryresultsbar_ [l=ru] {}
+_texticonsearchhistorybar_ [l=ru] {ÐÑÑÐŸÑÐžÑ Ð¿ÐŸÐžÑÐºÐ°}
+
+#alt text for query buttons
+_textusequery_ [l=ru] {ÐÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐŽÐ°ÐœÐœÑÐ¹ Ð·Ð°Ð¿ÑÐŸÑ}
+_textfreqmsg1_ [l=ru] {ÐÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ Ð²Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÐ¹: }
+_textpostprocess_ [l=ru] {_If_(_quotedquery_,<br><i>ÐŸÐ±ÑÐ°Ð±ÐŸÑÐ°ÐœÐŸ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ° _quotedquery_</i>
+)}
+
+_textmorethan_ [l=ru] {ÐÐŸÐ»ÑÑÐµ ÑÐµÐŒ}
+_textapprox_ [l=ru] {ÐÐºÐŸÐ»ÐŸ}
+_textnodocs_ [l=ru] {ÐÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÑÐŽÐŸÐ²Ð»ÐµÑÐ²ÐŸÑÑÑÑÐžÑ
+ Ð·Ð°Ð¿ÑÐŸÑÑ ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐŸ.}
+_text1doc_ [l=ru] {1 ÐŽÐŸÐºÑÐŒÐµÐœÑ ÑÐŽÐŸÐ²Ð»ÐµÑÐ²ÐŸÑÑÐµÑ Ð·Ð°Ð¿ÑÐŸÑÑ.}
+_textlotsdocs_ [l=ru] { ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÑÐŽÐŸÐ²Ð»ÐµÑÐ²ÐŸÑÑÑÑÐžÑ
+ Ð·Ð°Ð¿ÑÐŸÑÑ.}
+_textmatches_ [l=ru] {Ð ÐµÐ·ÑÐ»ÑÑÐ°ÑÑ }
+_textbeginsearch_ [l=ru] {ÐÐ°ÑÐ°ÑÑ Ð¿ÐŸÐžÑÐº}
+_textrunquery_ [l=ru] {ÐÑÐ¿ÐŸÐ»ÐœÐžÑÑ Ð·Ð°Ð¿ÑÐŸÑ}
+_textclearform_ [l=ru] {ÐÑÐžÑÑÐžÑÑ ÑÐŸÑÐŒÑ}
+
+#these go together in form search:
+#"Word or phrase  (fold, stem)  ... in field"
+_textwordphrase_ [l=ru] {Ð¡Ð»ÐŸÐ²ÐŸ ÐžÐ»Ðž ÑÑÐ°Ð·Ð°}
+_textinfield_ [l=ru] {... Ð² Ð¿ÐŸÐ»Ðµ}
+_textfoldstem_ [l=ru] {(ÑÐ»ÐŸÐ²ÐŸ, ÑÑÐ°Ð·Ð°)}
+
+_textadvquery_ [l=ru] {ÐžÐ»Ðž Ð²Ð²ÐµÐŽÐžÑÐµ ÑÐµÐºÑÑ Ð·Ð°Ð¿ÑÐŸÑÐ°:}
+_textallfields_ [l=ru] {Ð²ÑÐµ Ð¿ÐŸÐ»Ñ}
+_textand_ [l=ru] {Ðž}
+_textor_ [l=ru] {ÐžÐ»Ðž}
+_textandnot_ [l=ru] {Ðž ÐœÐµ}
+
+# _hselection_, _jselection_, _nselection_ and _gselection_ are set from 
+# within the server some or all of them may remain unset
+
+
+_textsimplesearch_ [l=ru] {ÐÐŸÐžÑÐº Ð¿ÐŸ _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, Ð¿ÐŸ _gselection_ ÑÑÐŸÐ²ÐœÑ) _If_(_nselection_, ÐœÐ°  _nselection_ ÑÐ·ÑÐºÐµ )
+,ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐŒ _querytypeselection_ ÐžÐ· ÑÐ»ÐŸÐ²}
+
+_textadvancedsearch_ [l=ru] {ÐÐŸÐžÑÐº _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, Ð¿ÐŸ _gselection_ ÑÑÐŸÐ²ÐœÑ)_If_(_nselection_, ÐœÐ°_nselection_ ÑÐ·ÑÐºÐµ) 
+ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ  _querytypeselection_ Ð·Ð°Ð¿ÑÐŸÑ}
+
+_textformsimplesearch_ [l=ru] {ÐÐŸÐžÑÐº Ð¿ÐŸ _If_(_hselection_, _hselection_) _If_(_jselection_, _textjselect_) _If_(_gselection_, at _gselection_ level) _If_(_nselection_, in _nselection_ language)
+,Ð³ÐŽÐµ ÑÐŸÐŽÐµÑÐ¶ÐžÑÑÑ _formquerytypeselection_ }
+
+_textformadvancedsearch_ [l=ru] {ÐÐŸÐžÑÐº _If_(_hselection_, _hselection_, _defaultindextext_) _If_(_jselection_,_textjselect_) _If_(_gselection_, Ð¿ÐŸ _gselection_ ÑÑÐŸÐ²ÐœÑ)_If_(_nselection_, ÐœÐ° _nselection_ ÑÐ·ÑÐºÐµ) 
+Ðž ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ ÑÐµÐ·ÑÐ»ÑÑÐ°Ñ Ð² Ð¿ÐŸÑÑÐŽÐºÐµ _formquerytypeselection_}
+
+
+_textjselect_ [l=ru] {_If_(_hselection_, of) _jselection_}
+
+_textdatesearch_ [l=ru] {ÐÐŸÐžÑÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð¿ÐŸ ÐŽÐ°ÐœÐœÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŒÐŸÐ¶ÐµÑ ÐŸÑÑÑÐµÑÑÐ²Ð»ÑÑÑÑÑ ÐºÐ°Ðº Ð¿ÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒÑ Ð²ÑÐµÐŒÐµÐœÐœÐŸÐŒÑ ÐžÐœÑÐµÑÐ²Ð°Ð»Ñ, ÑÐ°Ðº Ðž Ð¿ÐŸ ÐºÐŸÐœÐºÑÐµÑÐœÐŸÐ¹ ÑÐžÑÐ»ÐŸÐ²ÐŸÐ¹ ÐŽÐ°ÑÐµ.}
+_textstartdate_ [l=ru] {ÐÐ°ÑÐ°Ð»ÑÐœÐ°Ñ (ÐžÐ»Ðž ÐºÐŸÐœÐºÑÐµÑÐœÐ°Ñ) ÐŽÐ°ÑÐ°:}
+_textenddate_ [l=ru] {ÐÐŸÐœÐµÑÐœÐ°Ñ ÐŽÐ°ÑÐ°:}
+_textbc_ [l=ru] {ÐŽÐŸ Ðœ.Ñ.}
+_textad_ [l=ru] {Ðœ.Ñ.}
+_textexplaineras_ [l=ru] {Ð¢ÐµÑÐŒÐžÐœÑ Ð.Ð­. Ðž ÐÐŸ Ð.Ð­. ÐŸÐ±ÐŸÐ·ÐœÐ°ÑÐ°ÑÑ "ÐÐ°ÑÐµÐ¹ ÑÑÑ" Ðž "ÐÐŸ ÐœÐ°ÑÐµÐ¹ ÑÑÑ"} 
+
+_textstemon_ [l=ru] { (ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÑ ÑÐ»ÐŸÐ²)}
+
+_textsearchhistory_ [l=ru] {ÐÑÑÐŸÑÐžÑ Ð·Ð°Ð¿ÑÐŸÑÐ°}
+
+#text macros for search history
+_textnohistory_ [l=ru] {Ð ÐŽÐ°ÐœÐœÑÐ¹ ÐŒÐŸÐŒÐµÐœÑ ÐœÐµ ÑÑÑÐµÑÑÐ²ÑÐµÑ ÐžÑÑÐŸÑÐžÐž Ð·Ð°Ð¿ÑÐŸÑÐ°}
+_texthresult_ [l=ru] {Ð²Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÐµ}
+_texthresults_ [l=ru] {Ð²Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÐ¹}
+_texthallwords_ [l=ru] {Ð²ÑÐµ ÑÐ»ÐŸÐ²Ð°}
+_texthsomewords_ [l=ru] {ÐœÐµÐºÐŸÑÐŸÑÑÐµ ÑÐ»ÐŸÐ²Ð°}
+_texthboolean_ [l=ru] {Ð»ÐŸÐ³ÐžÑÐµÑÐºÐžÐ¹}
+_texthranked_ [l=ru] {ÑÐ¿ÐŸÑÑÐŽÐŸÑÐµÐœÐœÑÐ¹}
+_texthcaseon_ [l=ru] {Ñ ÑÑÐµÑÐŸÐŒ ÑÐµÐ³ÐžÑÑÑÐ°}
+_texthcaseoff_ [l=ru] {Ð±ÐµÐ· ÑÑÐµÑÐ° ÑÐµÐ³ÐžÑÑÑÐ°}
+_texthstemon_ [l=ru] {Ñ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÑÐŒÐž}
+_texthstemoff_ [l=ru] {Ð±ÐµÐ· ÐŸÐºÐŸÐœÑÐ°ÐœÐžÐ¹}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "Ð¿ÐŸÐžÑÐº" ## green_title ## h_search ##
+_httpiconhsearch_ [l=ru] {_httpimg_/ru/h\_search.gif}
+_widthhsearch_ [l=ru] {200}
+_heighthsearch_ [l=ru] {57}
+
+## "ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÑ" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=ru] {_httpimg_/ru/qryresb.gif}
+_widthqryresb_ [l=ru] {_pagewidth_}
+_heightqryresb_ [l=ru] {17}
+
+## "ÐžÑÑÐŸÑÐžÑ" ## green_bar_left_aligned ## schhistb ##
+_httpiconsrchhistb_ [l=ru] {_httpimg_/ru/schhistb.gif}
+_widthsrchhistb_ [l=ru] {_pagewidth_}
+_heightsrchhistb_ [l=ru] {17}
+
+## "Ð²ÑÐ²ÐŸÐŽ" ## hand_made ##
+_httpicondisplay_ [l=ru] {_httpimg_/display.gif}
+_widthdisplay_ [l=ru] {60}
+_heightdisplay_ [l=ru] {20}
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsearchprefs_ [l=ru] {ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž Ð¿ÐŸÐžÑÐºÐ°}
+_textcollectionprefs_ [l=ru] {ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž}
+_textpresentationprefs_ [l=ru] {ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°}
+_textpreferences_ [l=ru] {ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž}
+_textcasediffs_ [l=ru] {Ð ÐµÐ³ÐžÑÑÑÑ:}
+_textignorecase_ [l=ru] {ÐžÐ³ÐœÐŸÐžÑÐŸÐ²Ð°ÑÑ ÑÐµÐ³ÐžÑÑÑÑ}
+_textmatchcase_ [l=ru] {ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð²ÐµÑÑ
+ÐœÐžÐ¹ Ðž ÐœÐžÐ¶ÐœÐžÐ¹ ÑÐµÐ³ÐžÑÑÑÑ }
+_textwordends_ [l=ru] {ÐÐºÐŸÐœÑÐ°ÐœÐžÑ ÑÐ»ÐŸÐ²:}
+_textstem_ [l=ru] {ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÑ ÑÐ»ÐŸÐ²}
+_textnostem_ [l=ru] {ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÑÐ»ÐŸÐ²Ð° Ñ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÐµÐŒ}
+_textprefop_ [l=ru] {ÐÐŸÐºÐ°Ð·ÑÐ²Ð°ÑÑ _maxdocoption_ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² - ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐŸÐ² Ð¿ÐŸÐžÑÐºÐ°, Ð¿ÐŸ  _hitsperpageoption_ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ.}
+_textextlink_ [l=ru] {ÐÐŸÑÑÑÐ¿ Ðº Ð²ÐœÐµÑÐœÐžÐŒ ÑÐ·Ð»Ð°ÐŒ Web:}
+_textintlink_ [l=ru] {ÐÐ°ÐœÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð²Ð·ÑÑ ÐžÐ·:}
+_textlanguage_ [l=ru] {Ð¯Ð·ÑÐº ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°:}
+_textencoding_ [l=ru] {ÐÐŸÐŽÐžÑÐŸÐ²ÐºÐ°:}
+_textformat_ [l=ru] {Ð€ÐŸÑÐŒÐ°Ñ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°:}
+_textall_ [l=ru] {Ð²ÑÐµ}
+_textquerymode_ [l=ru] {Ð¢ÐžÐ¿ Ð·Ð°Ð¿ÑÐŸÑÐ°:}
+_textsimplemode_ [l=ru] { Ð¿ÑÐŸÑÑÐ°Ñ ÑÐŸÑÐŒÐ° Ð·Ð°Ð¿ÑÐŸÑÐ°}
+_textadvancedmode_ [l=ru] { ÑÐ°ÑÑÐžÑÐµÐœÐœÐ°Ñ ÑÐŸÑÐŒÐ° Ð·Ð°Ð¿ÑÐŸÑÐ°(ÑÐ°Ð·ÑÐµÑÐµÐœ Ð»ÐŸÐ³ÐžÑÐµÑÐºÐžÐ¹ Ð¿ÐŸÐžÑÐº Ñ ÐŸÐ¿ÐµÑÐ°ÑÐžÑÐŒÐž ! (ÐÐ) , & (Ð), | (ÐÐÐ) , Ðž ÑÐºÐŸÐ±ÐºÐž)}
+_textlinkinterm_ [l=ru] {ÑÐµÑÐµÐ· Ð¿ÑÐŸÐŒÐµÐ¶ÑÑÐŸÑÐœÑÑ ÑÑÑÐ°ÐœÐžÑÑ}
+_textlinkdirect_ [l=ru] {Ð¿ÐµÑÐµÐ¹ÑÐž ÐœÐµÐ¿ÐŸÑÑÐµÐŽÑÑÐ²ÐµÐœÐœÐŸ Ðº}
+_textdigitlib_ [l=ru] {ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐ°Ñ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ°}
+_textweb_ [l=ru] {Web}
+_textgraphical_ [l=ru] {ÐÑÐ°ÑÐžÑÐµÑÐºÐžÐ¹}
+_texttextual_ [l=ru] {TÐµÐºÑÑÐŸÐ²ÑÐ¹}
+_textcollectionoption_ [l=ru] {<p> ÐÐŸÐŽÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÐŽÐ»Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÐœÐžÑ: <br>}
+_textrelateddocdisplay_ [l=ru] { ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ ÑÑ
+ÐŸÐ¶ÐžÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ }
+_textsearchhistory_ [l=ru] {ÐÑÑÐŸÑÐžÑ Ð·Ð°Ð¿ÑÐŸÑÐ°:}
+_texthistorydisplay_ [l=ru] { ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ _historynumrecords_ ÐžÑÑÐŸÑÐžÑ Ð·Ð°Ð¿ÑÐŸÑÐ°}
+_textnohistorydisplay_ [l=ru] { ÐœÐµ ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ ÐžÑÑÐŸÑÐžÑ Ð·Ð°Ð¿ÑÐŸÑÐ°}
+
+_texttypesearch_ [l=ru] {Ð¢ÐžÐ¿ Ð¿ÐŸÐžÑÐºÐ°:}
+_texttextsearch_ [l=ru] {Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐµÐºÑÑÑ}
+_textformsearch_ [l=ru] {Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐŸÑÐŒÐµ}
+_textqueryboxsize_ [l=ru] {Ð Ð°Ð·ÐŒÐµÑ ÐŸÐºÐœÐ° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°:}
+_textregbox_ [l=ru] { ÐŸÐ±ÑÑÐœÐŸÐµ ÐŸÐºÐœÐŸ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°}
+_textbigbox_ [l=ru] { Ð±ÐŸÐ»ÑÑÐŸÐµ ÐŸÐºÐœÐŸ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°}
+_textformtype_ [l=ru] {Ð¢ÐžÐ¿ ÑÐŸÑÐŒÑ:}
+_textsimple_ [l=ru] { Ð¿ÑÐŸÑÑÐ°Ñ}
+_textadvanced_ [l=ru] { ÑÐ°ÑÑÐžÑÐµÐœÐœÐ°Ñ}
+
+# used in "with 4 fields" in the form search box
+_textwith_ [l=ru] {ÐžÐ·}
+_textfields_ [l=ru] {Ð¿ÐŸÐ»Ñ}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "ÐœÐ°ÑÑÑÐŸÐ¹ÐºÐž" ## green_title ## h_pref ##
+_httpiconhpref_ [l=ru] {_httpimg_/ru/h\_pref.gif}
+_widthhpref_ [l=ru] {200}
+_heighthpref_ [l=ru] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=ru] {ÐÐŸÐŒÐŸÑÑ}
+_textSearchshort_ [l=ru] {Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐ¿ÐµÑÐžÐ°Ð»ÑÐœÑÐŒ ÑÐµÑÐŒÐžÐœÐ°ÐŒ}
+_textSeriesshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð²ÑÐ¿ÑÑÐºÐ°ÐŒ}
+_textDateshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŽÐ°ÑÐ°ÐŒ}
+_textSubjectshort_ [l=ru] {ÐÑÐµÐŽÐŒÐµÑÐœÑÐ¹ ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ}
+_textToshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð¿ÐŸÐ»ÑÑÐ°ÑÐµÐ»ÑÐŒ}
+_textFromshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»ÑÐŒ}
+_textTitleshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ ÑÐ°Ð±ÐŸÑ}
+_textBrowseshort_ [l=ru] {ÐÑÐŸÑÐŒÐŸÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²}
+_textCreatorshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°Ð²ÑÐŸÑÐ°ÐŒ}
+
+_textOrganizationshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑÐŒ}
+_textHowtoshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ¿ÐŸÑÐŸÐ±Ñ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÑ}
+_textTopicshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐµÐŒÐ°ÐŒ}
+_textPeopleshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÐžÑÐŒ}
+_textLanguageshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ·ÑÐºÐ°ÐŒ}
+_textAcronymshort_ [l=ru] {ÐÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°ÐºÑÐŸÐœÐžÐŒÐ°ÐŒ}
+_textPhraseshort_ [l=ru] {Ð¿ÑÐŸÑÐŒÐŸÑÑ ÑÑÐ°Ð·, Ð²ÑÑÑÐµÑÐ°ÑÑÐžÑ
+ÑÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž}
+_textdefaultshorttext_ [l=ru] {ÐœÐµÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐ°Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ}
+
+_textSearchlong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ ÐŸÑÑÑÐµÑÑÐ²ÐžÑÑ <i>Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐ¿ÐµÑÐžÐ°Ð»ÑÐœÑÐŒ ÑÐµÑÐŒÐžÐœÐ°ÐŒ</i> ÑÐŸ ÑÑÑÐ°ÐœÐžÑÑ Ð¿ÐŸÐžÑÐºÐ°. Ð­ÑÐ° ÑÑÑÐ°ÐœÐžÑÐ° ÑÐ²Ð»ÑÐµÑÑÑ ÑÑÐ°ÑÑÐŸÐ²ÐŸÐ¹, ÐºÐŸÐ³ÐŽÐ° Ð²Ñ ÐœÐ°ÑÐžÐœÐ°ÐµÑÐµ ÑÐ°Ð±ÐŸÑÐ°ÑÑ Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐµÐ¹, Ðž ÐœÐ° ÐœÐµÐµ ÐŒÐŸÐ¶ÐœÐŸ Ð¿ÐŸÐ¿Ð°ÑÑÑ Ñ Ð»ÑÐ±ÑÑ
+ ÐŽÑÑÐ³ÐžÑ
+ ÑÑÑÐ°ÐœÐžÑ Ñ Ð¿ÐŸÐŒÐŸÑÑÑ ÐœÐ°Ð¶Ð°ÑÐžÑ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐŸÐžÑÐº</i>.}
+
+_textTitlelong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑÐŒ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ²</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐ°Ð·Ð²Ð°ÐœÐžÑ Ð-Ð¯</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐºÐœÐžÐ³ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐ¹. }
+
+_textOrganizationlong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ<i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑÐŒ</i>  ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐž</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐŸÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐ¹. }
+
+_textHowtolong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ¿ÐŸÑÐŸÐ±Ð°ÐŒ Ð¿ÑÐžÐŒÐµÐœÐµÐœÐžÑ</i> 
+ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>Ð¡Ð¿ÐŸÑÐŸÐ±</i>.  Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº Ð¿ÑÐ°ÐºÑÐžÑÐµÑÐºÐžÑ
+ ÑÐµÐºÐŸÐŒÐµÐœÐŽÐ°ÑÐžÐ¹, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÑ
+ÑÑ Ð² ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°Ñ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž.  }
+
+_textCreatorlong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð°Ð²ÑÐŸÑÐ°ÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐ²ÑÐŸÑÑ Ð-Ð¯</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ Ð¿ÐŸ ÑÐ°ÐŒÐžÐ»ÐžÑÐŒ Ð°Ð²ÑÐŸÑÐŸÐ². }
+
+_textTopiclong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐµÐŒÐ°ÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ  ÐºÐœÐŸÐ¿ÐºÐž <i>Ð¢ÐµÐŒÑ</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÑÐµÐŒ. }
+
+_textSubjectlong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÑÐ°Ð±ÐŸÑÐ°ÑÑ Ñ <i>Ð¿ÑÐµÐŽÐŒÐµÑÐœÑÐŒ ÑÐºÐ°Ð·Ð°ÑÐµÐ»ÐµÐŒ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž</i> , ÐœÐ°Ð¶Ð°Ð² ÐºÐœÐŸÐ¿ÐºÑ <i>Ð£ÐºÐ°Ð·Ð°ÑÐµÐ»Ñ</i>.  ÐÑÐµÐŽÐŒÐµÑÐœÑÐ¹ ÑÐºÐ°Ð·Ð°ÑÐµÐ»Ñ Ð¿ÐŸÑÑÑÐŸÐµÐœ Ð¿ÐŸ ÐžÐµÑÐ°ÑÑ
+ÐžÑÐµÑÐºÐŸÐŒÑ Ð¿ÑÐžÐœÑÐžÐ¿Ñ, Ðž ÐŽÐ°ÐµÑ ÐœÐ°ÐžÐ±ÐŸÐ»ÐµÐµ Ð¿ÐŸÐ»ÐœÐŸÐµ Ð¿ÑÐµÐŽÑÑÐ°Ð²Ð»ÐµÐœÐžÐµ ÐŸ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. }
+
+_textTolong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ<i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð¿ÐŸÐ»ÑÑÐ°ÑÐµÐ»ÑÐŒ</i>, ÐœÐ°Ð¶Ð°Ð² ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐŸÐŒÑ</i>.  Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº Ð¿ÐŸÐ»ÑÑÐ°ÑÐµÐ»ÐµÐ¹.  }
+
+_textFromlong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ Ñ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»ÑÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÑ ÐºÐŸÐ³ÐŸ</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÐµÐ»ÐµÐ¹.  }
+
+_textSerieslong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ<i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð²ÑÐ¿ÑÑÐºÐ°ÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÑÐ¿ÑÑÐºÐž</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº Ð²ÑÐ¿ÑÑÐºÐŸÐ²/ÑÐµÑÐžÐ¹, ÐºÐŸÑÐŸÑÑÐµ ÐžÐŒÐµÑÑÑÑ Ð² ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. }
+
+_textDatelong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÐŽÐ°ÑÐ°ÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐ°ÑÑ</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŸÐ² Ð² Ñ
+ÑÐŸÐœÐŸÐ»ÐŸÐ³ÐžÑÐµÑÐºÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ. }
+
+_textBrowselong_ [l=ru] {<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ <i>browse publications</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐœÐ° ÐºÐœÐŸÐ¿ÐºÑ
+<i>ÐÑÐŸÑÐŒÐŸÑÑ</i>. }
+
+_textPeoplelong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð¿ÐµÑÑÐŸÐœÐ°Ð»ÐžÑÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐµÑÑÐŸÐœÐ°Ð»ÐžÐž Ð-Ð¯</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÐŒÐ°ÑÐµÑÐžÐ°Ð»ÐŸÐ², ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ Ð¿ÐŸ ÑÐ°ÐŒÐžÐ»ÐžÑÐŒ. }
+
+_textLanguagelong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ <i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÐ·ÑÐºÐ°ÐŒ</i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>Ð¯Ð·ÑÐºÐž</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº ÑÑÐ°ÑÐµÐ¹, ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÐ¹ Ð¿ÐŸ ÑÐ·ÑÐºÐ°ÐŒ.}
+
+_textAcronymlong_ [l=ru] {<p> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ<i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ Ð²Ñ
+ÐŸÐ¶ÐŽÐµÐœÐžÑ Ð°ÐºÑÐŸÐœÐžÐŒÐŸÐ² </i> ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>ÐÐºÑÐŸÐœÐžÐŒÑ</i>. Ð ÑÑÐŸÐŒ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐž Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐ¿ÐžÑÐŸÐº Ð°ÐºÑÐŸÐœÐžÐŒÐŸÐ², Ðž ÐŒÐµÑÑ Ð³ÐŽÐµ ÐŸÐœÐž Ð²ÑÑÑÐµÑÐ°ÑÑÑÑ.}
+
+_textPhraselong_ [l=ru] { <p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐŸÐ»ÑÑÐžÑÑ<i>ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ Ð¿ÐŸ ÑÑÐ°Ð·Ð°ÐŒ, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐŒÑÑ Ð² Ð¿ÑÐ±Ð»ÐžÐºÐ°ÑÐžÑÑ
+</i> , ÐœÐ°Ð¶Ð°ÑÐžÐµÐŒ ÐºÐœÐŸÐ¿ÐºÐž <i>Ð€ÑÐ°Ð·Ñ</i>.  ÐÐ»Ñ ÑÑÐŸÐ³ÐŸ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÑÑÑ ÐŸÐ±ÐŸÐ·ÑÐµÐ²Ð°ÑÐµÐ»Ñ phind phrase browser.  }
+
+_textdefaultlongtext_ [l=ru] { <p>ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ°  ÐºÐœÐŸÐ¿ÐºÑ <i>ÐœÐµÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐ°Ñ ÐºÐ»Ð°ÑÑÐžÑÐžÐºÐ°ÑÐžÑ</i> ÐŽÐ»Ñ Ð¿ÑÐŸÑÐŒÐŸÑÑÐ° ÑÑÐ°ÑÐµÐ¹, ÐŸÑÑÐŸÑÑÐžÑÐŸÐ²Ð°ÐœÐœÑÑ
+ Ð¿ÐŸ ÐœÐµÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒÑ Ð¿ÐŸÐ»Ñ. }
+
+_texthelptopics_ [l=ru] {
+<h2 align=left>Ð Ð°Ð·ÐŽÐµÐ»Ñ</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">ÐÐ°Ðº ÐŸÑÑÑÐµÑÑÐ²Ð»ÑÑÑ Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐ¿ÐµÑÐžÐ°Ð»ÑÐœÑÐŒ ÑÐµÑÐŒÐžÐœÐ°ÐŒ</a>
+<ul>
+  <li><a href="\#query-terms">Ð¡Ð»ÐŸÐ²Ð° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°</a>
+  <li><a href="\#query-type">Ð¢ÐžÐ¿ Ð·Ð°Ð¿ÑÐŸÑÐ°</a>
+  <li><a href="\#scope-of-queries">ÐÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸÑÑÐž Ð·Ð°Ð¿ÑÐŸÑÐ°</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž</a>
+  <li><a href="\#lang-prefs">ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÑÐ·ÑÐºÐ°</a>
+  <li><a href="\#pres-prefs">ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°</a>
+  <li><a href="\#search-prefs">ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž Ð¿ÐŸÐžÑÐºÐ°</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=ru] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=ru] {ÐÐ°Ðº ÑÐ°Ð±ÐŸÑÐ°ÑÑ Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒÐž}
+_booktextreadingdocs_ [l=ru] {ÐÐ°Ðº ÑÐžÑÐ°ÑÑ ÐºÐœÐžÐ³Ðž}
+_bibtextreadingdocs_ [l=ru] {ÐÐŸÐ»ÑÑÐµ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž ÐœÐ° Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÑÑ ÑÐµÐŒÑ}
+
+_texthelpreadingdocs_ [l=ru] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>ÐÐŸÐ³ÐŽÐ° Ð²Ñ ÐŸÑÐºÑÐŸÐµÑÐµ ÐºÐ°ÐºÐŸÐ¹-ÐœÐžÐ±ÑÐŽÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÐµÐ³ÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ, Ð° ÑÐ°ÐºÐ¶Ðµ ÐžÐŒÑ Ð°Ð²ÑÐŸÑÐ° Ð² Ð»ÐµÐ²ÐŸÐŒ Ð²ÐµÑÑ
+ÐœÐµÐŒ ÑÐ³Ð»Ñ ÑÑÑÐ°ÐœÐžÑÑ. ÐÑÐŸÐŒÐµ ÑÑÐŸÐ³ÐŸ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐœÐ°Ð¹ÑÐž ÐœÐŸÐŒÐµÑ ÑÑÑÐ°ÐœÐžÑÑ, ÑÑÑÐµÐ»ÐºÐž Ð²Ð¿ÐµÑÐµÐŽ Ðž ÐœÐ°Ð·Ð°ÐŽ, ÐºÐœÐŸÐ¿ÐºÑ ÐŽÐ»Ñ Ð²ÑÐ±ÐŸÑÐ° ÐœÐŸÐ²ÐŸÐ¹ ÑÑÑÐ°ÐœÐžÑÑ.
+
+<p>ÐÐžÐ¶Ðµ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÑÐµÐºÑÑ ÑÐµÐºÑÑÐµÐ³ÐŸ ÑÐ°Ð·ÐŽÐµÐ»Ð°. ÐÐŸÑÐ»Ðµ ÑÐŸÐ³ÐŸ ÐºÐ°Ðº Ð²Ñ Ð¿ÑÐŸÑÐžÑÐ°ÐµÑÐµ ÐµÐ³ÐŸ, Ð²ÐœÐžÐ·Ñ Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÑÑÐµÐ»ÐºÐž ÐŽÐ»Ñ Ð¿ÐµÑÐµÑ
+ÐŸÐŽÐ° Ðº ÑÐ»ÐµÐŽÑÑÑÐµÐŒÑ ÐžÐ»Ðž Ð¿ÑÐµÐŽÑÐŽÑÑÐµÐŒÑ ÑÐ°Ð·ÐŽÐµÐ»Ñ.
+
+<p>ÐÐžÐ¶Ðµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° Ðž ÐµÐ³ÐŸ Ð°Ð²ÑÐŸÑÐ° ÐœÐ°Ñ
+ÐŸÐŽÑÑÑ ÑÑÐž ÐºÐœÐŸÐ¿ÐºÐž. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° <i>ÐÐµÑÑ ÑÐµÐºÑÑ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐŸÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ ÐœÐ° ÑÐºÑÐ°ÐœÐµ Ð²ÐµÑÑ ÑÐµÐºÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÑÐ»Ðž ÐŽÐŸÐºÑÐŒÐµÐœÑ ÐŽÐŸÑÑÐ°ÑÐŸÑÐœÐŸ Ð±ÐŸÐ»ÑÑÐŸÐ¹, ÑÐŸ ÑÑÐŸ ÐŒÐŸÐ¶ÐµÑ Ð·Ð°ÐœÑÑÑ ÐœÐµÐºÐŸÑÐŸÑÐŸÐµ Ð²ÑÐµÐŒÑ Ðž ÐŒÐœÐŸÐ³ÐŸ Ð¿Ð°ÐŒÑÑÐž!
+ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° <i>Ð ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</i> ÑÑÐŸÐ±Ñ ÐŸÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ ÐŽÐ°ÐœÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ(Ð­ÑÐŸ Ð±ÑÐ²Ð°ÐµÑ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÐµÑÐ»Ðž Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÑÑÐ°Ð²ÐœÐžÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐžÐ»Ðž ÑÐžÑÐ°ÑÑ ÐŽÐ²Ð° ÑÑÐ°Ð·Ñ).  ÐÐ°ÐºÐŸÐœÐµÑ, ÐµÑÐ»Ðž Ð²Ñ ÐœÐ°ÑÐ»Ðž ÑÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð¿ÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ»ÐŸÐ²Ð°ÐŒ, ÑÐŸ ÐŸÐœÐž Ð±ÑÐŽÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.  ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° <i>Ð¡ÐœÑÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÐžÐµ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð° ÐœÐµ Ð²ÑÐŽÐµÐ»ÑÐ»ÐžÑÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° ÑÑÑÐµÐ»ÐºÑ, ÑÑÐŸÐ±Ñ Ð¿ÐµÑÐµÐ¹ÑÐž Ðº ÑÐ»ÐµÐŽÑÑÑÐµÐŒÑ ÑÐ°Ð·ÐŽÐµÐ»Ñ ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ÐžÐ»Ðž ÐœÐ°Ð·Ð°ÐŽ, ÑÑÐŸÐ±Ñ Ð²ÐµÑÐœÑÑÑÑÑ Ðº Ð¿ÑÐµÐŽÑÐŽÑÑÐµÐŒÑ</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>ÐÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ Ð²ÐµÑÑ ÑÐµÐºÑÑ ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>ÐÑÐºÑÑÑÑ ÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>ÐÑÐŽÐµÐ»ÑÑÑ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð° ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+</table>
+
+}
+
+_booktexthelpreadingdocs_ [l=ru] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p> ÐÐŸÐ³ÐŽÐ° Ð²Ñ ÐŸÑÐºÑÐŸÐµÑÐµ ÐºÐ°ÐºÑÑ-ÐœÐžÐ±ÑÐŽÑ ÐºÐœÐžÐ³Ñ, Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÐžÑÑÐœÐŸÐº ÐµÐµ ÐŸÐ±Ð»ÐŸÐ¶ÐºÐž Ð² Ð»ÐµÐ²ÐŸÐŒ Ð²ÐµÑÑ
+ÐœÐµÐŒ ÑÐ³Ð»Ñ ÑÑÑÐ°ÐœÐžÑÑ. ÐÑÐŸÐŒÐµ ÑÐžÑÑÐœÐºÐ° ÐŸÐ±Ð»ÐŸÐ¶ÐºÐž Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐœÐ°Ð¹ÑÐž ÑÐ°Ð±Ð»ÐžÑÑ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ. Ð¢Ð°Ð±Ð»ÐžÑÐ° ÐŒÐŸÐ¶ÐµÑ ÑÐ°ÑÑÐžÑÑÑÑÑÑ: ÐœÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° Ð¿Ð°Ð¿ÐºÐž, ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐŸÑÐºÑÑÑÑ ÐžÐ»Ðž Ð·Ð°ÐºÑÑÑÑ ÐžÑ
+. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° ÐŸÑÐºÑÑÑÑÑ ÐºÐœÐžÐ³Ñ Ð²Ð²ÐµÑÑ
+Ñ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÑ, ÑÑÐŸÐ±Ñ Ð·Ð°ÐºÑÑÑÑ ÐµÐµ. 
+
+<p> ÐÐžÐ¶Ðµ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÑÐµÐºÑÑ ÑÐµÐºÑÑÐµÐ³ÐŸ ÑÐ°Ð·ÐŽÐµÐ»Ð°. ÐÐŸÑÐ»Ðµ ÑÐŸÐ³ÐŸ ÐºÐ°Ðº Ð²Ñ Ð¿ÑÐŸÑÐžÑÐ°ÐµÑÐµ ÐµÐ³ÐŸ, Ð²ÐœÐžÐ·Ñ Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÑÑÑÐµÐ»ÐºÐž ÐŽÐ»Ñ Ð¿ÐµÑÐµÑ
+ÐŸÐŽÐ° Ðº ÑÐ»ÐµÐŽÑÑÑÐµÐŒÑ ÐžÐ»Ðž Ð¿ÑÐµÐŽÑÐŽÑÑÐµÐŒÑ ÑÐ°Ð·ÐŽÐµÐ»Ñ.
+
+<p>ÐÐžÐ¶Ðµ ÑÐŸÑÐŸÐ³ÑÐ°ÑÐžÐž ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÐºÐœÐŸÐ¿ÐŸÐº. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ°  <i>ÐÐµÑÑ ÑÐµÐºÑÑ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐŸÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ ÐœÐ° ÑÐºÑÐ°ÐœÐµ Ð²ÐµÑÑ ÑÐµÐºÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÑÐ»Ðž ÐºÐœÐžÐ³Ð° ÐŽÐŸÑÑÐ°ÑÐŸÑÐœÐŸ Ð±ÐŸÐ»ÑÑÐ°Ñ, ÑÐŸ ÑÑÐŸ ÐŒÐŸÐ¶ÐµÑ Ð·Ð°ÐœÑÑÑ ÐœÐµÐºÐŸÑÐŸÑÐŸÐµ Ð²ÑÐµÐŒÑ Ðž ÐŒÐœÐŸÐ³ÐŸ Ð¿Ð°ÐŒÑÑÐž! ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ°
+<i>ÐÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐŸÑÐŸÐ±ÑÐ°Ð·ÐžÐ»ÐŸÑÑ Ð²ÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°ÐœÐžÐµ, Ð³ÐŽÐµ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÑÐ²ÐžÐŽÐµÑÑ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐž Ð²ÑÐµÑ
+ Ð³Ð»Ð°Ð² Ðž Ð¿ÐŸÐŽÑÐ°Ð·ÐŽÐµÐ»ÐŸÐ². ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ°
+<i>Ð ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</i> ÑÑÐŸÐ±Ñ ÐŸÑÐŸÐ±ÑÐ°Ð·ÐžÑÑ ÐŽÐ°ÐœÐœÑÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ (Ð­ÑÐŸ Ð±ÑÐ²Ð°ÐµÑ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÐµÑÐ»Ðž Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÑÑÐ°Ð²ÐœÐžÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐžÐ»Ðž ÑÐžÑÐ°ÑÑ ÐŽÐ²Ð° ÑÑÐ°Ð·Ñ). ÐÐ°ÐºÐŸÐœÐµÑ, ÐµÑÐ»Ðž Ð²Ñ ÐœÐ°ÑÐ»Ðž ÑÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð¿ÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ»ÐŸÐ²Ð°ÐŒ, ÑÐŸ ÐŸÐœÐž Ð±ÑÐŽÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.  ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° <i>Ð¡ÐœÑÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÐžÐµ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð° ÐœÐµ Ð²ÑÐŽÐµÐ»ÑÐ»ÐžÑÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>ÐÑÐºÑÑÑÑ ÐºÐœÐžÐ¶ÐœÑÑ Ð¿ÐŸÐ»ÐºÑ</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>ÐÑÐºÑÑÑÑ/Ð·Ð°ÐºÑÑÑÑ ÐºÐœÐžÐ³Ñ</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>ÐÑÐŸÑÐŒÐŸÑÑ ÑÑÐŸÐ¹ ÑÐµÐºÑÐžÐž ÑÐµÐºÑÑÐ°</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>ÐÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ Ð²ÑÐµÑ ÑÐµÐºÑÑ, ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Ð Ð°Ð·Ð²ÐµÑÐœÑÑÑ ÐŸÐ³Ð»Ð°Ð²Ð»ÐµÐœÐžÐµ, ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>ÐÑÐºÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>ÐÑÐŽÐµÐ»ÑÑÑ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð°, ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° ÑÑÑÐµÐ»ÐºÑ, ÑÑÐŸÐ±Ñ Ð¿ÐµÑÐµÐ¹ÑÐž Ðº ÑÐ»ÐµÐŽÑÑÑÐµÐ¹ ÑÐµÐºÑÐžÐž...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... ÐžÐ»Ðž ÐœÐ°Ð·Ð°ÐŽ, ÑÑÐŸÐ±Ñ Ð²ÐµÑÐœÑÑÑÑÑ Ðº Ð¿ÑÐµÐŽÑÐŽÑÑÐµÐ¹</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=ru] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>ÐÐµÐºÐŸÑÐŸÑÑÐµ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÐµ ÐºÐ°ÑÑÐŸÑÐºÐž ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÐŒÐœÐŸÐ³ÐŸ ÑÐ°Ð·Ð»ÐžÑÐœÐŸÐ¹ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ ÑÐµÑÐµÑÐ°Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°. ÐÑ ÑÐ²ÐžÐŽÐžÑÐµ ÑÑÐŸ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐŸÐ² Ð¿ÐŸÐžÑÐºÐ°: ÐµÑÐ»Ðž  Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐ°Ñ ÐºÐ°ÑÑÐŸÑÐºÐ° ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÐžÐœÐŸÑÐŸÑÐŒÐ°ÑÐžÑ, ÑÐŸ ÐŸÐœÐ° Ð±ÑÐŽÐµÑ Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ Ð² Ð²ÐžÐŽÐµ Ð·ÐœÐ°ÑÐºÐ° _icontext_ Ð²Ð·Ð°ÐŒÐµÐœ Ð·ÐœÐ°ÑÐºÐ° _iconblanktext_.
+
+<p>ÐÐ°Ð¶Ð°Ð² ÐœÐ° Ð·ÐœÐ°ÑÐŸÐº _icontext_ Ð²Ñ Ð¿ÐŸÐ»ÑÑÐžÑÐµ Ð±ÐŸÐ»ÑÑÐµ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐµ.
+
+<p> ÐÐžÐ¶Ðµ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐŸÐ¹ ÐºÐ°ÑÑÐŸÑÐºÐž ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ ÐŽÐ²Ðµ ÐºÐœÐŸÐ¿ÐºÐž. ÐÐ°Ð¶ÐŒÐžÑÐµ  ÐœÐ° <i>Ð ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸ Ð±Ñ ÐŸÑÐºÑÑÑÑ ÐŽÐ°ÐœÐœÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ (Ð­ÑÐŸ Ð¿ÐŸÐ»ÐµÐ·ÐœÐŸ ÐµÑÐ»Ðž Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÑÑÐ°Ð²ÐœÐžÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ Ð±ÐžÐ±Ð»ÐžÐŸÐ³ÑÐ°ÑÐžÑÐµÑÐºÐžÑ
+ ÐºÐ°ÑÑÐŸÑÐµÐº). ÐÐ°ÐºÐŸÐœÐµÑ, ÐµÑÐ»Ðž Ð²Ñ ÐœÐ°ÑÐ»Ðž ÑÑÐŸÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ Ð¿ÐŸ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ ÑÐ»ÐŸÐ²Ð°ÐŒ, ÑÐŸ ÐŸÐœÐž Ð±ÑÐŽÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.  ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° <i>Ð¡ÐœÑÑÑ Ð²ÑÐŽÐµÐ»ÐµÐœÐžÐµ</i> ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð° ÐœÐµ Ð²ÑÐŽÐµÐ»ÑÐ»ÐžÑÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.
+
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>ÐÑÐºÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ Ð² ÐœÐŸÐ²ÐŸÐŒ ÐŸÐºÐœÐµ</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>ÐÑÐŽÐµÐ»ÑÑÑ ÐžÑÐºÐŸÐŒÑÐµ ÑÐ»ÐŸÐ²Ð°, ÐžÐ»Ðž ÐœÐµÑ</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=ru] {
+<h2>ÐÐ°Ðº ÐŸÑÑÑÐµÑÑÐ²Ð»ÑÑÑ Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐ¿ÐµÑÐžÐ°Ð»ÑÐœÑÐŒ ÑÐµÑÐŒÐžÐœÐ°ÐŒ</h2>
+<p>
+  ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ ÑÐŽÐµÐ»Ð°ÑÑ Ð¿ÑÐŸÑÑÐŸÐ¹ Ð·Ð°Ð¿ÑÐŸÑ ÑÐŸ ÑÑÑÐ°ÐœÐžÑÑ Ð¿ÐŸÐžÑÐºÐ°, ÑÐŸÐ³Ð»Ð°ÑÐœÐŸ ÑÐ»ÐµÐŽÑÑÑÐžÐŒ ÑÐ°Ð³Ð°ÐŒ:<p>
+  
+  <ol><li>ÐÐ¿ÑÐµÐŽÐµÐ»ÐžÑÐµ ÑÑÐŸ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐœÐ°Ð¹ÑÐž
+      <li>ÐÐ¿ÑÐµÐŽÐµÐ»ÐžÑÐµ ÐºÐ°Ðº Ð²Ñ ÑÑÐŸ Ñ
+ÐŸÑÐžÑÐµ ÐžÑÐºÐ°ÑÑ: ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ ÑÑÐ°Ð·Ñ ÐžÐ»Ðž ÐŸÑÐŽÐµÐ»ÑÐœÑÐµ ÑÐ»ÐŸÐ²Ð°
+      <li>ÐÐ°Ð¿ÐµÑÐ°ÑÐ°Ð¹ÑÐµ ÑÐµÐºÑÑ Ð·Ð°Ð¿ÑÐŸÑÐ° Ð² ÑÑÑÐŸÐºÐµ Ð¿ÐŸÐžÑÐºÐ°
+      <li>ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° ÐºÐœÐŸÐ¿ÐºÑ <i>ÐÐ°ÑÐ°ÑÑ Ð¿ÐŸÐžÑÐº</i> 
+  </ol>
+
+<p>ÐÐŸÑÐ»Ðµ Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÑ Ð·Ð°Ð¿ÑÐŸÑÐ° ÐœÐ° ÑÐºÑÐ°ÐœÐµ Ð¿ÐŸÑÐ²ÐžÑÑÑÑ 20 ÐœÐ°ÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÐ¹ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². Ð ÐºÐŸÐœÑÐµ ÑÐ¿ÐžÑÐºÐ° ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ ÐºÐœÐŸÐ¿ÐºÐ°, Ñ Ð¿ÐŸÐŒÐŸÑÑÑ ÐºÐŸÑÐŸÑÐŸÐ¹ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐµÑÐµÐ¹ÑÐž Ðº ÑÐ»ÐµÐŽÑÑÑÐžÐŒ 20.  ÐÐ° ÑÐ»ÐµÐŽÑÑÑÐžÑ
+ ÑÑÑÐ°ÐœÐžÑÐ°Ñ
+ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐŸÐ² Ð²Ñ ÑÐ²ÐžÐŽÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÐž ÐŽÐ»Ñ Ð¿ÐµÑÐµÑ
+ÐŸÐŽÐ° Ðº ÑÐ»ÐµÐŽÑÑÑÐžÐŒ 20 ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒ ÐžÐ»Ðž ÐŸÐ±ÑÐ°ÑÐœÐŸ Ðº Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐŒ, Ðž Ñ.ÐŽ. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐœÐ° ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð»ÑÐ±ÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ° ÐžÐ»Ðž Ð·ÐœÐ°ÑÐŸÐº Ð¿ÐµÑÐµÐŽ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµÐŒ, ÐŽÐ»Ñ ÑÐŸÐ³ÐŸ ÑÑÐŸÐ±Ñ Ð¿ÑÐŸÑÐŒÐŸÑÑÐµÑÑ ÐµÐ³ÐŸ.
+
+<p>ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÐŸÐµ ÑÐžÑÐ»ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐ° Ð¿ÐŸÐžÑÐºÐ° - 100. ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ ÐžÐ·ÐŒÐµÐœÐžÑÑ ÑÑÐŸ ÑÐžÑÐ»ÐŸ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ ÐœÐ°ÑÑÑÐŸÐµÐº ( ÐºÐœÐŸÐ¿ÐºÐ° <i>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž</i> Ð²Ð²ÐµÑÑ
+Ñ ÑÑÑÐ°ÐœÐžÑÑ ).<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>Ð¡Ð»ÐŸÐ²Ð° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°</h3>
+
+<p>Ð¢ÐŸ, ÑÑÐŸ Ð²Ñ Ð²Ð²ÐŸÐŽÐžÑÐµ Ð² ÑÑÑÐŸÐºÐµ Ð·Ð°Ð¿ÑÐŸÑÐ°, ÐœÐ°Ð·ÑÐ²Ð°ÐµÑÑÑ "ÑÐ»ÐŸÐ²Ð°ÐŒÐž ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°". ÐÐ°Ð¶ÐŽÐŸÐµ ÑÐ»ÐŸÐ²ÐŸ ÑÐŸÐŽÐµÑÐ¶ÐžÑ Ð±ÑÐºÐ²Ñ Ðž ÑÐžÑÑÑ. Ð¡Ð»ÐŸÐ²Ð° ÑÐ°Ð·ÐŽÐµÐ»ÐµÐœÑ Ð¿ÑÐŸÐ±ÐµÐ»Ð°ÐŒÐž. ÐÑÐ»Ðž ÐžÐŒÐµÐµÑÑÑ ÐºÐ°ÐºÐŸÐ¹-Ð»ÐžÐ±ÐŸ ÐŽÑÑÐ³ÐŸÐ¹ Ð·ÐœÐ°Ðº, ÐœÐ°Ð¿ÑÐžÐŒÐµÑ, Ð·ÐœÐ°ÐºÐž Ð¿ÑÐœÐºÑÑÐ°ÑÐžÐž, ÑÐŸ ÐŸÐœÐž ÑÐ»ÑÐ¶Ð°Ñ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÑÐ°Ð·ÐŽÐµÐ»ÐžÑÐµÐ»ÐµÐ¹ ÑÐ»ÐŸÐ², ÐºÐ°Ðº Ðž Ð¿ÑÐŸÐ±ÐµÐ»Ñ, ÑÐŸ ÐµÑÑÑ ÐžÐ³ÐœÐŸÑÐžÑÑÑÑÑÑ. ÐÑ ÐœÐµ ÐŒÐŸÐ¶ÐµÑÐµ ÐŸÑÑÑÐµÑÑÐ²ÐžÑÑ Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÑÐ»ÐŸÐ²Ð°ÐŒ, ÑÐŸÐŽÐµÑÐ¶Ð°ÑÐžÐŒ Ð·ÐœÐ°ÐºÐž Ð¿ÑÐœÐºÑÑÐ°ÑÐžÐž.
+
+<p>ÐÐ°Ð¿ÑÐžÐŒÐµÑ, ÑÐ°ÑÑÐŒÐŸÑÑÐžÐŒ Ð·Ð°Ð¿ÑÐŸÑ<p>
+    <ul><kbd>Ð¡ÐµÐ»ÑÑÐºÐŸ-Ð»ÐµÑÐœÐŸÐµ Ñ
+ÐŸÐ·ÑÐ¹ÑÑÐ²ÐŸ ÐœÐ° ÐŸÑÑÑÐŸÐ²Ð°Ñ
+ Ð¢ÐžÑ
+ÐŸÐ³ÐŸ ÐŸÐºÐµÐ°ÐœÐ°: Ð¡ÐžÑÑÐµÐŒÐ° Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐž (1993)</kbd></ul>
+      <p>ÐŸÐœ Ð±ÑÐŽÐµÑ ÑÐ°Ð²ÐœÐŸÑÐžÐ»ÐµÐœ ÑÐ»ÐµÐŽÑÑÑÐµÐŒÑ<p>
+      <ul><kbd> Ð¡ÐµÐ»ÑÑÐºÐŸÐµ Ð»ÐµÑÐœÐŸÐµ Ñ
+ÐŸÐ·ÑÐ¹ÑÑÐ²ÐŸ ÐœÐ° ÐŸÑÑÑÐŸÐ²Ð°Ñ
+ Ð¢ÐžÑ
+ÐŸÐ³ÐŸ ÐŸÐºÐµÐ°ÐœÐ° Ð¡ÐžÑÑÐµÐŒÐ° Ð¿ÐŸÐŽÐŽÐµÑÐ¶ÐºÐž 1993</kbd></ul><p>
+
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Ð¢ÐžÐ¿Ñ Ð·Ð°Ð¿ÑÐŸÑÐŸÐ²</h3>
+
+<p>Ð¡ÑÑÐµÑÑÐ²ÑÐµÑ ÐŽÐ²Ð° ÑÐ°Ð·Ð»ÐžÑÐœÑÑ
+ ÑÐžÐ¿Ð° Ð·Ð°Ð¿ÑÐŸÑÐ°.
+
+<ul>
+  <li>ÐÐ°Ð¿ÑÐŸÑÑ Ð¿ÐŸ <b>Ð²ÑÐµÐŒ</b> ÑÐ»ÐŸÐ²Ð°ÐŒ. Ð­ÑÐŸ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÐžÑ ÐŽÐ»Ñ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ ÑÐŸÐŽÐµÑÐ¶Ð°Ñ Ð²ÑÐµ ÑÐ»ÐŸÐ²Ð°, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ Ð² ÑÑÑÐŸÐºÑ Ð¿ÐŸÐžÑÐºÐ°.
+ÐÐŸÐºÑÐŒÐµÐœÑÑ, ÑÐŽÐŸÐ²Ð»ÐµÑÐ²ÐŸÑÑÑÑÐžÐµ Ð·Ð°Ð¿ÑÐŸÑÑ, Ð±ÑÐŽÑÑ Ð²ÑÐ²ÐµÐŽÐµÐœÑ Ð² Ð°Ð»ÑÐ°Ð²ÐžÑÐœÐŸÐŒ Ð¿ÐŸÑÑÐŽÐºÐµ.<p>
+
+  <li>ÐÐ°Ð¿ÑÐŸÑÑ Ð¿ÐŸ <b>ÐœÐµÐºÐŸÑÐŸÑÑÐŒ</b> ÑÐ»ÐŸÐ²Ð°ÐŒ. ÐÐŸÑÑÐ°ÑÐŸÑÐœÐŸ ÐœÐ°Ð¿ÐžÑÐ°ÑÑ Ð»ÐžÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÑÐ»ÐŸÐ², ÐºÐŸÑÐŸÑÑÐµ, Ð²ÐµÑÐŸÑÑÐœÐŸ, ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ Ð² ÑÐµÐºÑÑÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°.  ÐÐŸÐºÑÐŒÐµÐœÑÑ Ð±ÑÐŽÑÑ ÐŸÑÐŸÐ±ÑÐ°Ð¶ÐµÐœÑ Ð² Ð¿ÐŸÑÑÐŽÐºÐµ ÑÐŒÐµÐœÑÑÐµÐœÐžÑ ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐžÑ Ð·Ð°Ð¿ÑÐŸÑÑ. Ð¡ÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÐžÐµ Ð·Ð°Ð¿ÑÐŸÑÑ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÑÐµÑÑÑ ÑÐ°Ðº:
+      <p><ul>
+        <li> ÑÐµÐŒ Ð±ÐŸÐ»ÑÑÐµ ÐžÑÐºÐŸÐŒÑÑ
+ ÑÐµÑÐŒÐžÐœÐŸÐ² ÑÐŸÐŽÐµÑÐ¶ÐžÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ, ÑÐµÐŒ Ð±ÐŸÐ»ÑÑÐµ ÐŸÐœ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÐžÑ;
+        <li> ÑÐµÐŽÐºÐžÐµ ÑÐ»ÐŸÐ²Ð° Ð±ÐŸÐ»ÐµÐµ Ð²Ð°Ð¶ÐœÑ, ÑÐµÐŒ ÐŸÐ±ÑÐžÐµ Ð²ÑÑÐ°Ð¶ÐµÐœÐžÑ;
+        <li> ÐŒÐ°Ð»ÐµÐœÑÐºÐžÐµ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð¿ÐŸÐŽÑ
+ÐŸÐŽÑÑ Ð»ÑÑÑÐµ ÑÐµÐŒ Ð±ÐŸÐ»ÑÑÐžÐµ.
+      </ul>
+</ul>
+
+<p>ÐÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ ÑÑÐŸÐ»ÑÐºÐŸ ÑÐ»ÐŸÐ² ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°, ÑÐºÐŸÐ»ÑÐºÐŸ Ð²Ð°ÐŒ ÑÐ³ÐŸÐŽÐœÐŸ - ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÑÐµÐ»ÐŸÐµ Ð¿ÑÐµÐŽÐ»ÐŸÐ¶ÐµÐœÐžÐµ, ÐžÐ»Ðž Ð¿Ð°ÑÐ°Ð³ÑÐ°Ñ.  ÐÑÐ»Ðž Ð²Ñ Ð²Ð²ÐµÐŽÐµÑÐµ ÑÐŸÐ»ÑÐºÐŸ ÐŸÐŽÐœÐŸ ÑÐ»ÐŸÐ²ÐŸ, ÑÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ Ð±ÑÐŽÑÑ ÑÐ°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÑ Ð¿ÐŸ ÑÐ±ÑÐ²Ð°ÐœÐžÑ ÑÐ°ÑÑÐŸÑÑ ÐµÐ³ÐŸ Ð¿ÐŸÑÐ²Ð»ÐµÐœÐžÑ.<p>
+_texthelpscope_
+}
+
+_textdatesearch_ [l=ru] {ÐÐŸÐžÑÐº Ð¿ÐŸ ÐŽÐ°ÑÐµ}
+
+_texthelpdatesearch_ [l=ru] {<h2>_textdatesearch_</h2>
+ÐÐŸÐžÑÐº Ð¿ÐŸ ÐŽÐ°ÑÐµ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ Ð²Ð°ÐŒ ÐœÐ°Ð¹ÑÐž ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÐŸÑÐœÐŸÑÑÑÐžÐµÑÑ Ðº ÑÐŸÐ±ÑÑÐžÑÐŒ, Ð¿ÑÐŸÑÐµÐŽÑÐžÐŒ Ð² ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒ Ð²ÑÐµÐŒÐµÐœÐœÐŸÐŒ Ð¿ÑÐŸÐŒÐµÐ¶ÑÑÐºÐµ Ð¿ÐŸÐŽÐŸÐ±ÐœÐŸ ÑÐŸÐŒÑ, ÐºÐ°Ðº ÐœÐ°Ñ
+ÐŸÐŽÑÑÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑÑ, ÑÐ²ÑÐ·Ð°ÐœÐœÑÐµ Ñ ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÑÐŒ Ð¿ÐŸÐžÑÐºÐŸÐ²ÑÐŒ ÑÐµÑÐŒÐžÐœÐŸÐŒ.  ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ ÐŸÑÑÑÐµÑÑÐ²ÐžÑÑ Ð¿ÐŸÐžÑÐº ÐºÐ°Ðº Ð¿ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°ÐŒ, ÐŸÑÐœÐŸÑÑÑÐžÐŒÑÑ Ðº ÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐœÐŸÐŒÑ Ð³ÐŸÐŽÑ, ÑÐ°Ðº Ðž Ð¿ÐµÑÐžÐŸÐŽÑ Ð»ÐµÑ. <p>
+
+<p>_iconblankbar_
+<a name=datesearch-howto>
+<h3>ÐÐ°Ðº ÑÑÐŸ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ:</h3>
+<ul>
+   <li>ÐÐŸÐžÑÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð¿ÐŸ ÐºÐŸÐœÐºÑÐµÑÐœÐŸÐ¹ ÐŽÐ°ÑÐµ:<p>
+   <ul>
+       <li>ÐÐ²ÐµÐŽÐžÑÐµ ÐŸÐ±ÑÐºÐœÐŸÐ²ÐµÐœÐœÑÐµ ÑÐ»ÐŸÐ²Ð° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°.	
+       <li>ÐÐ²ÐµÐŽÐžÑÐµ ÐœÑÐ¶ÐœÑÐ¹ Ð³ÐŸÐŽ Ð² ÑÐŸÑÐŒÐµ "ÐÐ°ÑÐ°Ð»ÑÐœÐ°Ñ (ÐžÐ»Ðž ÐºÐŸÐœÐºÑÐµÑÐœÐ°Ñ) ÐŽÐ°ÑÐ°".
+       <li>ÐÑÐ»Ðž Ð²Ð°Ñ Ð³ÐŸÐŽ ÐœÐ°Ñ
+ÐŸÐŽÐžÑÑÑ Ð² Ð¿ÐµÑÐžÐŸÐŽÐµ ÐŽÐŸ ÐœÐ°ÑÐµÐ¹ ÑÑÑ (ÐžÐ»Ðž ÐŽÐŸ Ð ÐŸÐ¶ÐŽÐµÑÑÐ²Ð° Ð¥ÑÐžÑÑÐŸÐ²Ð°), ÑÐŸ Ð²ÑÐ±ÐµÑÐžÑÐµ ÐŽÐ°Ð»ÐµÐµ "ÐÐŸ Ðœ.Ñ." ÐžÐ· Ð²ÑÐ¿Ð°ÐŽÐ°ÑÑÐµÐ³ÐŸ ÐŒÐµÐœÑ.
+       <li>ÐÐ°ÑÐœÐžÑÐµ Ð¿ÐŸÐžÑÐº.
+   </ul>
+<p><li>ÐÐŸÐžÑÐº ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² Ð¿ÐŸ Ð²ÑÐµÐŒÐµÐœÐœÐŸÐŒÑ Ð¿ÑÐŸÐŒÐµÐ¶ÑÑÐºÑ:<p>
+   <ul>
+       <li>ÐÐ²ÐµÐŽÐžÑÐµ ÐŸÐ±ÑÐºÐœÐŸÐ²ÐµÐœÐœÑÐµ ÑÐ»ÐŸÐ²Ð° ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°.
+       <li>ÐÐ²ÐµÐŽÐžÑÐµ ÐœÐ°ÑÐ°Ð»ÑÐœÑÐ¹ Ð³ÐŸÐŽ Ð² ÑÐŸÑÐŒÐµ "ÐÐ°ÑÐ°Ð»ÑÐœÐ°Ñ (ÐžÐ»Ðž ÐºÐŸÐºÑÐµÑÐœÐ°Ñ) ÐŽÐ°ÑÐ°". 
+       <li>ÐÐ²ÐµÐŽÐžÑÐµ ÐºÐŸÐœÐµÑÐœÑÐ¹ Ð³ÐŸÐŽ Ð² ÑÐŸÑÐŒÐµ "ÐÐŸÐœÐµÑÐœÐ°Ñ ÐŽÐ°ÑÐ°".
+       <li>ÐÑÐ±ÐµÑÐžÑÐµ "ÐÐŸ Ðœ.Ñ" ÐžÐ· Ð²ÑÐ¿Ð°ÐŽÐ°ÑÑÐµÐ³ÐŸ ÐŒÐµÐœÑ ÐŽÐ»Ñ Ð»ÑÐ±ÐŸÐ¹ ÐŽÐ°ÑÑ ÐžÐ· ÑÑÐŸÐ³ÐŸ Ð¿ÐµÑÐžÐŸÐŽÐ° (ÑÐ°ÐºÐ¶Ðµ ÐžÐ·Ð²ÐµÑÑÐœÐŸÐ³ÐŸ ÐºÐ°Ðº Ð¿ÐµÑÐžÐŸÐŽ ÐŽÐŸ Ð ÐŸÐ¶ÐŽÐµÑÑÐ²Ð° Ð¥ÑÐžÑÑÐŸÐ²Ð°).
+       <li>ÐÐ°ÑÐœÐžÑÐµ Ð¿ÐŸÐžÑÐº.
+   </ul>    
+</ul><p>
+
+<p>_iconblankbar_
+<a name=datesearch-results>
+<h3>ÐÐ°Ðº ÑÐ°Ð±ÐŸÑÐ°ÐµÑ Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÐŽÐ°ÑÐµ</h3>
+
+ÐÐ»Ñ Ð¿ÐŸÐ»ÑÑÐµÐœÐžÑ ÐœÐ°ÐžÐ±ÐŸÐ»ÐµÐµ Ð¿ÐŸÐ»ÐœÐŸÐ³ÐŸ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐ° Ð·Ð°Ð¿ÑÐŸÑÐ° ÑÐµÐºÐŸÐŒÐµÐœÐŽÑÐµÑÑÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐžÐœÑÐµÑÐ²Ð°Ð»ÑÐœÑÐ¹ Ð·Ð°Ð¿ÑÐŸÑ, Ñ.Ðº. Ð² ÐœÐµÐºÐŸÑÐŸÑÑÑ
+ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°Ñ
+ ÐŽÐ°ÑÐ° ÑÐ²ÐœÐ° ÐœÐµ ÑÐºÐ°Ð·Ð°ÐœÐ° (ÐœÐ°Ð¿ÑÐžÐŒÐµÑ ÐŒ.Ð±. ÑÐºÐ°Ð·Ð°Ðœ Ð²ÐµÐº, Ð° ÐœÐµ Ð³ÐŸÐŽ). 
+<p>
+}
+
+_textchangeprefs_ [l=ru] {ÐÐ·ÐŒÐµÐœÐµÐœÐžÐµ ÐœÐ°ÑÑÑÐŸÐµÐº}
+
+_texthelppreferences_ [l=ru] {<h2>_textchangeprefs_</h2>
+
+<p>ÐÐ° ÑÑÑÐ°ÐœÐžÑÐµ <i>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž</i> (ÐºÐœÐŸÐ¿ÐºÐ° Ð² Ð²ÐµÑÑ
+ÐœÐµÐ¹ ÑÐ°ÑÑÐž ÑÑÑÐ°ÐœÐžÑÑ) Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐžÐ·ÐŒÐµÐœÐžÑÑ ÐœÐµÐºÐŸÑÐŸÑÑÐµ Ð¿Ð°ÑÐ°ÐŒÐµÑÑÑ ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž</h3>
+
+ÐÐµÐºÐŸÑÐŸÑÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÑÐŸÐŽÐµÑÐ¶Ð°Ñ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ Ð¿ÐŸÐŽÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, Ð¿ÐŸÐžÑÐº Ð¿ÐŸ ÐºÐŸÑÐŸÑÑÐŒ ÐŒÐŸÐ¶ÐµÑ ÐŸÑÑÑÐµÑÑÐ²Ð»ÑÑÑÑÑ ÐºÐ°Ðº Ð¿ÐŸ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÐžÐ· ÐœÐžÑ
+, ÑÐ°Ðº Ðž Ð¿ÐŸ Ð²ÑÐµÐŒ Ð²ÐŒÐµÑÑÐµ. ÐÐ° ÑÑÑÐ°ÐœÐžÑÐµ ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð²ÑÐ±ÑÐ°ÑÑ ÑÐµ Ð¿ÐŸÐŽÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ Ð² Ð¿ÐŸÐžÑÐº.
+
+<p>_iconblankbar_
+<a name=lang-prefs>
+<h3 align=left>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÑÐ·ÑÐºÐ°</h3>
+
+ÐÐ°Ð¶ÐŽÐ°Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐžÐŒÐµÐµÑ ÑÑÐ°ÐœÐŽÐ°ÑÑÐœÑÐ¹ ÑÐ·ÑÐº ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°, ÐœÐŸ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ Ð²ÑÐ±ÑÐ°ÑÑ Ð»ÑÐ±ÐŸÐ¹ ÐŽÑÑÐ³ÐŸÐ¹.  Ð¢Ð°ÐºÐ¶Ðµ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ Ð²ÑÐ±ÑÐ°ÑÑ ÐŽÑÑÐ³ÑÑ ÐºÐŸÐŽÐžÑÐŸÐ²ÐºÑ, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐµÐŒÑÑ Ð² ÐŽÐ°ÐœÐœÐŸÐ¹ Ð¿ÑÐŸÐ³ÑÐ°ÐŒÐŒÐµ, Ð¿ÐŸÐŽÑ
+ÐŸÐŽÑÑÑÑ ÐŽÐ»Ñ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ° - Ð°Ð²ÑÐŸÐŒÐ°ÑÐžÑÐµÑÐºÐž ÑÑÐ°Ð²ÐžÑÑÑ ÑÑÐ°ÐœÐŽÐ°ÑÑÐœÐ°Ñ, ÐœÐŸ ÐœÐ° ÐœÐµÐºÐŸÑÑÑÑ
+ Ð±ÑÐ°ÑÐ·ÐµÑÐ°Ñ
+ Ð»ÑÑÑÐµ Ð²ÑÐ±ÑÐ°ÑÑ ÐºÐŸÐŽÐžÑÐŸÐ²ÐºÑ Ð²ÑÑÑÐœÑÑ. ÐÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÑÑ ÑÐ°ÐºÐ¶Ðµ Ð¿ÐµÑÐµÐ¹ÑÐž ÐŸÑ Ð³ÑÐ°ÑÐžÑÐµÑÐºÐŸÐ³ÐŸ ÑÐµÐ¶ÐžÐŒÐ° Ð¿ÑÐŸÑÐŒÐŸÑÑÐ° Ðº ÑÐµÐºÑÑÐŸÐ²ÐŸÐŒÑ, Ðž ÐœÐ°ÐŸÐ±ÐŸÑÐŸÑ. 
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°</h3>
+
+Ð Ð·Ð°Ð²ÐžÑÐžÐŒÐŸÑÑÐž ÐŸÑ ÐºÐ°Ð¶ÐŽÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž, Ð² ÐœÐµÐ¹ ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÐœÐµÑÐºÐŸÐ»ÑÐºÐŸ ÑÐ°Ð·Ð»ÐžÑÐœÑÑ
+ ÐœÐ°ÑÑÑÐŸÐµÐº ÐžÐœÑÐµÑÑÐµÐ¹ÑÐ°.
+
+<p>ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ Web ÑÑÑÐ°ÐœÐžÑ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ Ð¿Ð°ÐœÐµÐ»Ñ ÑÐ¿ÑÐ°Ð²Ð»ÐµÐœÐžÑ Ð²Ð²ÐµÑÑ
+Ñ ÐºÐ°Ð¶ÐŽÐŸÐ³ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐ°, ÑÐ°ÐºÐžÐŒ ÐŸÐ±ÑÐ°Ð·ÐŸÐŒ Ð¿ÐŸÑÐ»Ðµ Ð¿ÐŸÐžÑÐºÐ° Ð²Ñ ÑÑÐ°Ð·Ñ Ð¿ÐŸÐ¿Ð°ÐŽÐµÑÐµ ÐœÐ° Web ÑÑÑÐ°ÐœÐžÑÑ Ð±ÐµÐ· Ð²ÑÑÐºÐŸÐ³ÐŸ Greenstone Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ°.  Ð§ÑÐŸÐ±Ñ ÑÐŽÐµÐ»Ð°ÑÑ ÐœÐŸÐ²ÑÐ¹ Ð·Ð°Ð¿ÑÐŸÑ ÐŽÐŸÑÑÐ°ÑÐŸÑÐœÐŸ ÐœÐ°Ð¶Ð°ÑÑ ÐºÐœÐŸÐ¿ÐºÑ "back" Ð² Ð²Ð°ÑÐµÐŒ Ð±ÑÐ°ÑÐ·ÐµÑÐµ. Ð¢Ð°ÐºÐžÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž ÑÐ°ÐºÐ¶Ðµ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÑÑ Ð·Ð°Ð¿ÑÐµÑÐ°ÑÑ ÑÐžÑÑÐµÐŒÐœÑÐµ ÐŸÑÐžÐ±ÐºÐž ÐºÐŸÐ³ÐŽÐ° Ð²Ñ ÐœÐ°Ð¶ÐžÐŒÐ°ÐµÑÐµ ÐœÐ° ÑÑÑÐ»ÐºÐžÐ²ÑÐ²ÐŸÐŽÑÑÐžÐµ Ð²Ð°Ñ Ð·Ð° ÑÐ°ÐŒÐºÐž ÑÐ»ÐµÐºÑÑÐŸÐœÐœÐŸÐ¹ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐž Ð² WWW. 
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>ÐÐ°ÑÑÑÐŸÐ¹ÐºÐž Ð¿ÐŸÐžÑÐºÐ°</h3>
+<p>ÐÐ²Ð° Ð¿ÐµÑÐµÐºÐ»ÑÑÐ°ÑÐµÐ»Ñ ÑÐ¿ÑÐ°Ð²Ð»ÑÑÑ ÑÐŸÑÐœÐŸÑÑÑÑ Ð¿ÐŸÐžÑÐºÐ° ÑÐµÐºÑÑÐ°. ÐÐµÑÐµÐºÐ»ÑÑÐ°ÑÐµÐ»Ñ ("Ð ÐµÐ³ÐžÑÑÑÑ") Ð²ÐºÐ»ÑÑÐ°ÐµÑ/ÐŸÑÐŒÐµÐœÑÐµÑ ÑÑÐµÑ ÑÐµÐ³ÐžÑÑÑÐ°. ÐÐµÑÐµÐºÐ»ÑÑÐ°ÑÐµÐ»Ñ "ÐÐºÐŸÐœÑÐ°ÐœÐžÑ ÑÐ»ÐŸÐ²" Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÐžÐ»Ðž ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÑ Ñ ÑÐ»ÐŸÐ².  ÐÐµÑÐµÐºÐ»ÑÑÐ°ÑÐµÐ»Ñ "Ð Ð°Ð·ÐŒÐµÑ ÐŸÐºÐœÐ° Ð¿ÐŸÐžÑÐºÐ°" Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ Ð²Ð²ÐŸÐŽÐžÑÑ ÑÐµÐ»ÑÐ¹ Ð°Ð±Ð·Ð°Ñ Ð² ÐºÐ°ÑÐµÑÑÐ²Ðµ ÑÐµÐºÑÑÐ° Ð·Ð°Ð¿ÑÐŸÑÐ°. 
+<p>ÐÐ°Ð¿ÑÐžÐŒÐµÑ, ÐµÑÐ»Ðž Ð²ÑÐ±ÑÐ°ÐœÐŸ <i>ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ ÑÐµÐ³ÐžÑÑÑÑ</i> Ðž
+<i>ÐžÐ³ÐœÐŸÑÐžÑÐŸÐ²Ð°ÑÑ ÐŸÐºÐŸÐœÑÐ°ÐœÐžÑ ÑÐ»ÐŸÐ²</i>,ÑÐŸ Ð·Ð°Ð¿ÑÐŸÑ<p>
+    <ul><kbd>African building</kbd></ul>
+      <p>Ð±ÑÐŽÐµÑ ÑÑÐ°ÐºÑÐŸÐ²Ð°ÑÑÑÑ ÐºÐ°Ðº<p>
+      <ul><kbd>africa builds</kbd></ul><p>
+      Ð¿ÐŸÑÐŸÐŒÑ ÑÑÐŸ Ð±ÑÐºÐ²Ð° Ð²ÐµÑÑ
+ÐœÐµÐ³ÐŸ ÑÐµÐ³ÐžÑÑÑÐ° ÐžÐ· ÑÐ»ÐŸÐ²Ð° "African" Ð±ÑÐŽÐµÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐ° ÐœÐ° Ð±ÑÐºÐ²Ñ ÐœÐžÐ¶ÐœÐµÐ³ÐŸ ÑÐµÐ³ÐžÑÑÑÐ°, Ð° ÑÑÑÑÐžÐºÑÑ "n" Ðž "ing" Ð±ÑÐŽÑÑ ÑÐŽÐ°Ð»ÐµÐœÑ ÐžÐ· ÑÐ»ÐŸÐ²
+      "African" Ðž "building" (ÑÐ°ÐºÐ¶Ðµ, "s" Ð±ÑÐŽÐµÑ ÑÐŽÐ°Ð»ÐµÐœÐ° ÐžÐ· "builds").
+
+<p>ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ Ð¿ÐµÑÐµÐºÐ»ÑÑÐžÑÑÑÑ Ð² ÑÐ°ÑÑÐžÑÐµÐœÐœÑÑ ÑÐŸÑÐŒÑ Ð·Ð°Ð¿ÑÐŸÑÐ°, ÐºÐŸÑÐŸÑÐ°Ñ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ ÑÐŸÑÐµÑÐ°ÑÑ ÑÐ»ÐŸÐ²Ð°, ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÑ Ð (&amp;), ÐÐÐ (|), Ð ÐÐ (!). Ð­ÑÐŸ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÑÑ Ð±ÐŸÐ»ÐµÐµ ÑÐŸÑÐœÑÐµ Ð·Ð°Ð¿ÑÐŸÑÑ. Ð¢Ð°ÐºÐ¶Ðµ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ Ð²ÐºÐ»ÑÑÐžÑÑ Ð¿ÐŸÐºÐ°Ð· ÐžÑÑÐŸÑÐžÐž Ð·Ð°Ð¿ÑÐŸÑÐ°, ÐºÐŸÐ³ÐŽÐ° Ð±ÑÐŽÑÑ Ð¿ÐŸÐºÐ°Ð·Ð°ÐœÑ Ð¿ÑÐµÐŽÑÐŽÑÑÐžÐµ ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÑ Ð¿ÐŸÐžÑÐºÐ°. Ð­ÑÐŸ Ð¿ÐŸÐ·Ð²ÐŸÐ»ÑÐµÑ ÑÐŸÐ·ÐŽÐ°Ð²Ð°ÑÑ ÑÐ»ÐµÐ³ÐºÐ° ÐžÐ·ÐŒÐµÐœÐµÐœÐœÑÐµ ÑÐŸÑÐŒÑ Ð·Ð°Ð¿ÑÐŸÑÐŸÐ². ÐÐ°ÐºÐŸÐœÐµÑ, Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÑÐµÐ³ÑÐ»ÐžÑÐŸÐ²Ð°ÑÑ ÐŸÐ±ÑÐµÐµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² - ÑÐµÐ·ÑÐ»ÑÑÐ°ÑÐŸÐ² Ð¿ÐŸÐžÑÐºÐ°, Ð° ÑÐ°ÐºÐ¶Ðµ ÐºÐŸÐ»ÐžÑÐµÑÑÐ²ÐŸ ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ² ÐœÐ° ÐŸÐŽÐœÐŸ ÑÑÑÐ°ÐœÐžÑÐµ.
+}
+
+_texttanumbrowseoptions_ [l=ru] {Ð¡ÑÑÐµÑÑÐ²ÑÑÑ ÑÐ°Ð·ÐœÑÐµ ÑÐ¿ÐŸÑÐŸÐ±Ñ Ð¿ÐŸÐžÑÐºÐ°  ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÐž Ð² ÑÑÐŸÐ¹ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž (_numbrowseoptions_):}
+
+_textsimplehelpheading_ [l=ru] {ÐÐ°Ðº ÐžÑÐºÐ°ÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ}
+
+_texthelpscope_ [l=ru] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>ÐÐžÐ°Ð¿Ð°Ð·ÐŸÐœ Ð¿ÐŸÐžÑÐºÐ° </h3>
+
+<p>
+Ð Ð±ÐŸÐ»ÑÑÐžÐœÑÑÐ²Ðµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑ ÑÐ°Ð·Ð»ÐžÑÐœÑÐµ ÐžÐœÐŽÐµÐºÑÑ ÐŽÐ»Ñ Ð¿ÐŸÐžÑÐºÐ°. ÐÐ°Ð¿ÑÐžÐŒÐµÑ, ÐžÐœÐŽÐµÐºÑ Ð¿ÐŸ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑÐŒ ÐºÐœÐžÐ³, ÐžÐ»Ðž Ð¿ÐŸ ÑÐ°ÐŒÐžÐ»ÐžÑÐŒ Ð°Ð²ÑÐŸÑÐŸÐ². Ð­ÑÐŸ ÐŒÐŸÐ³ÑÑ Ð±ÑÑÑ ÑÐ°ÐºÐ¶Ðµ ÐžÐœÐŽÐµÐºÑÑ Ð¿ÐŸ Ð³Ð»Ð°Ð²Ð°ÐŒ ÐžÐ»Ðž Ð¿ÐŸ Ð·Ð°Ð³ÐŸÐ»ÐŸÐ²ÐºÐ°ÐŒ ÑÐµÐºÑÐžÐ¹. ÐÑÐ»Ðž Ð²Ñ ÐœÐµ ÑÐºÐ°Ð¶ÐµÑÐµ  ÑÑÐµÐ±ÑÐµÐŒÑÐ¹ ÐžÐœÐŽÐµÐºÑ (Ð¿ÐŸ Ð³Ð»Ð°Ð²Ð°ÐŒ ÐžÐ»Ðž Ð¿ÐŸ ÑÐµÐºÑÐžÑÐŒ), ÑÐŸ ÐœÐ° ÑÐºÑÐ°Ðœ Ð±ÑÐŽÐµÑ Ð²ÑÐ²ÐµÐŽÐµÐœ Ð²ÐµÑÑ ÐŽÐŸÐºÑÐŒÐµÐœÑ<p> ÐÑÐ»Ðž ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐŒ ÑÐ²Ð»ÑÐµÑÑÑ ÑÐµÐ»Ð°Ñ ÐºÐœÐžÐ³Ð°, ÑÐŸ ÐŸÐœÐ° Ð±ÑÐŽÐµÑ ÐŸÑÐºÑÑÑÐ° Ð² ÑÐŸÐŸÑÐ²ÐµÑÑÑÐ²ÑÑÑÐµÐŒ ÐŒÐµÑÑÐµ.
+}
+
Index: /main/tags/2.38/gsdl/macros/russian2.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/russian2.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/russian2.dm	(revision 21083)
@@ -0,0 +1,106 @@
+######################################################################
+#
+# English Language text and icon macros 
+# -- this file contains english text that is of less importance
+# -- to translate when creating a new interface language
+######################################################################
+
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_documents_ [l=ru] { ÐŽÐŸÐºÑÐŒÐµÐœÑÐŸÐ². }
+_lastupdate_ [l=ru] {ÐÐŸÑÐ»ÐµÐŽÐœÐµÐµ ÐŸÐ±ÐœÐŸÐ²Ð»ÐµÐœÐžÐµ}
+_ago_ [l=ru] {ÐŽÐœÐµÐ¹ ÐœÐ°Ð·Ð°ÐŽ.}
+_colnotbuilt_ [l=ru] {ÐÐŸÐ»Ð»ÐµÐºÑÐžÑ ÐœÐµ ÑÐŸÐ·ÐŽÐ°ÐœÐ°.}
+
+_textpagetitle_ [l=ru] {Ð­Ð»ÐµÐºÑÑÐŸÐœÐœÐ°Ñ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° Greenstone}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+### "Ð­ÐÐÐÐ¢Ð ÐÐÐÐÐ¯ ÐÐÐÐÐÐÐ¢ÐÐÐ ÐÐÐÐÐ ÐÐÐÐÐÐÐÐ" ## nzdl_heading ## nzdl2gr ##
+#_httpiconnzdl_ {_httpimg_/nzdl2gr.gif}
+#_widthnzdl_ {457}
+#_heightnzdl_ {181}
+
+## "Ð²ÑÐ±ÐµÑÐžÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ" ## green_bar_left_aligned ## selcolgr ##
+_httpiconselcolgr_ [l=ru] {_httpimg_/selcolgr.gif}
+_widthselcolgr_ [l=ru] {537}
+_heightselcolgr_ [l=ru] {17}
+_altselcolgr_ [l=ru] {"ÐÑÐ±ÐµÑÐžÑÐµ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ"}
+
+
+
+######################################################################
+# external link package
+package extlink
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textextlink_ [l=ru] {Ð¡ÑÑÐ»ÐºÐ° ÐœÐ° ÑÐµÑÑÑÑ Web}
+_textlinknotfound_ [l=ru] {ÐÐœÑÑÑÐµÐœÐœÑÑ ÑÑÑÐ»ÐºÐ° ÐœÐµ ÐœÐ°Ð¹ÐŽÐµÐœÐ°}
+
+_textextlinkcontent_ [l=ru] {Ð¡ÑÑÐ»ÐºÐ° ÐºÐŸÑÐŸÑÑÑ Ð²Ñ Ð²ÑÐ±ÑÐ°Ð»Ðž ÐœÐµ ÑÐºÐ°Ð·ÑÐ²Ð°ÐµÑ ÐœÐž ÐœÐ° ÐŸÐŽÐœÑ ÐžÐ· ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐ¹. ÐÑÐ»Ðž Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐŸÑÐºÑÑÑÑ ÐŽÐ°ÐœÐœÑÑ ÑÑÑÐ»ÐºÑ Ðž Ð²Ñ ÐžÐŒÐµÐµÑÐµ ÐŽÐŸÑÑÑÐ¿ Ð² ÐÐœÑÐµÑÐœÐµÑ, ÑÐŸ Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ <a href="_nexturl_">ÐžÐŽÑÐž ÐŽÐ°Ð»ÑÑÐµ</a> ÐœÐ° ÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ; ÐžÐœÐ°ÑÐµ ÐœÐ°Ð¶ÐŒÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÑ "ÐÐ°Ð·Ð°ÐŽ" Ð² Ð²Ð°ÑÐµÐŒ Ð±ÑÐ°ÑÐ·ÐµÑÐµ ÐŽÐ»Ñ Ð²ÐŸÐ·Ð²ÑÐ°ÑÐµÐœÐžÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ.}
+
+_textlinknotfoundcontent_ [l=ru] {ÐÐŸ Ð¿ÑÐžÑÐžÐœÐ°ÐŒ, ÐŸÑ ÐœÐ°Ñ ÐœÐµ Ð·Ð°Ð²ÐžÑÑÑÐžÐŒ, ÑÑÑÐ»ÐºÐ°, ÐºÐŸÑÐŸÑÑÑ Ð²Ñ Ð²ÑÐ±ÑÐ°Ð»Ðž, ÐœÐµ ÐŸÑÐ²ÐµÑÐ°ÐµÑ. ÐÐŸÐ·ÐŒÐŸÐ¶ÐœÐŸ, ÑÑÐŸ ÐŸÐ±ÑÑÐ»ÐŸÐ²Ð»ÐµÐœÐŸ ÐŸÑÐžÐ±ÐºÐŸÐ¹ Ð² ÑÐµÑÑÑÑÐ°Ñ
+ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÐž. ÐÐ°Ð¶ÐŒÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÑ "ÐÐ°Ð·Ð°ÐŽ" Ð² Ð²Ð°ÑÐµÐŒ Ð±ÑÐ°ÑÐ·ÐµÑÐµ ÐŽÐ»Ñ Ð²ÐŸÐ·Ð²ÑÐ°ÑÐµÐœÐžÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ.}
+
+# should have arguments of collection, collectionname and link
+_foundintcontent_ [l=ru] {
+
+<h3>Ð¡ÑÑÐ»ÐºÐ° ÐœÐ° "_2_" ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ</h3>
+
+<p> Ð¡ÑÑÐ»ÐºÐ°, ÐºÐŸÑÐŸÑÑÑ Ð²Ñ Ð²ÑÐ±ÑÐ°Ð»Ðž, ÑÐ²Ð»ÑÐµÑÑÑ Ð²ÐœÐµÑÐœÐµÐ¹ ÐŽÐ»Ñ ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ "_collectionname_" (ÑÑÐŸ ÑÑÑÐ»ÐºÐ° ÐœÐ° "_2_" ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ).ÐÑÐ»Ðž Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐŸÑÐºÑÑÑÑ ÑÑÑÐ»ÐºÑ ÐœÐ° "_2_" ÐºÐŸÐ»Ð»ÐµÐºÑÐžÑ, Ð²Ñ ÐŒÐŸÐ¶ÐµÑÐµ <a href="_httpdoc_&c=_1_&cl=_cgiargcl_&d=_3_">ÐžÐŽÑÐž ÐŽÐ°Ð»ÑÑÐµ</a> ÐœÐ° ÐŽÐ°ÐœÐœÑÑ ÑÑÑÐ°ÐœÐžÑÑ; ÐžÐœÐ°ÑÐµ ÐœÐ°Ð¶ÐŒÐžÑÐµ ÐºÐœÐŸÐ¿ÐºÑ "ÐÐ°Ð·Ð°ÐŽ" Ð² Ð²Ð°ÑÐµÐŒ Ð±ÑÐ°ÑÐ·ÐµÑÐµ ÐŽÐ»Ñ Ð²ÐŸÐ·Ð²ÑÐ°ÑÐµÐœÐžÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ.}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+
+
+######################################################################
+# authentication page
+package authen
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textGSDLtitle_ [l=ru] {Ð­Ð»ÐµÐºÑÑÐŸÐœÐœÐ°Ñ Ð±ÐžÐ±Ð»ÐžÐŸÑÐµÐºÐ° Greenstone}
+
+_textusername_ [l=ru] {ÐÐŒÑ}
+_textpassword_ [l=ru] {ÐÐ°ÑÐŸÐ»Ñ}
+
+_textmessageinvalid_ [l=ru] {Ð¡ÑÑÐ°ÐœÐžÑÐ°, ÐœÐ° ÐºÐŸÑÐŸÑÑÑ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ Ð·Ð°Ð¹ÑÐž, ÑÑÐµÐ±ÑÐµÑ Ð°Ð²ÑÐŸÑÐžÐ·Ð°ÑÐžÐž.<br>_If_(_cgiargug_,[ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ Ð¿ÑÐžÐœÐ°ÐŽÐ»ÐµÐ¶Ð°ÑÑ ÐºÐŸ Ð³ÑÑÐ¿Ð¿Ðµ "_cgiargug_"   ÐŽÐ»Ñ ÐŽÐŸÑÑÑÐ¿Ð° Ðº ÑÑÐŸÐ¹ ÑÑÑÐ°ÐœÐžÑÐµ]<br>)
+ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ° Ð²Ð²ÐµÐŽÐžÑÐµ ÑÐ²ÐŸÐµ ÐžÐŒÑ Ðž Ð¿Ð°ÑÐŸÐ»Ñ.}
+
+_textmessagefailed_ [l=ru] {ÐÐµÐ¿ÑÐ°Ð²ÐžÐ»ÑÐœÐŸÐµ ÐžÐŒÑ ÐžÐ»Ðž Ð¿Ð°ÑÐŸÐ»Ñ.}
+
+_textmessagedisabled_ [l=ru] {ÐÐ·Ð²ÐžÐœÐžÑÐµ, ÐœÐŸ Ð²Ð°ÐŒ Ð·Ð°ÐºÑÑÑ ÐŽÐŸÑÑÑÐ¿. ÐÑÐµ Ð²ÐŸÐ¿ÑÐŸÑÑ Ðº Ð²ÐµÐ±ÐŒÐ°ÑÑÐµÑÑ  ÑÐ°Ð¹ÑÐ°.}
+
+_textmessagepermissiondenied_ [l=ru] {ÐÐ·Ð²ÐžÐœÐžÑÐµ Ñ Ð²Ð°Ñ ÐœÐµÑ ÐŽÐŸÑÑÑÐ¿Ð°, ÑÑÐŸÐ±Ñ Ð·Ð°Ð¹ÑÐž ÐœÐ° ÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ.}
+
+_textmessagestalekey_ [l=ru] {Ð¡ÑÑÐ»ÐºÐ°, ÐºÐŸÑÐŸÑÑÑ Ð²Ñ ÐžÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°Ð»Ðž, ÑÑÑÐ°ÑÐµÐ»Ð°. 
+ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ° Ð²Ð²ÐµÐŽÐžÑÐµ Ð¿Ð°ÑÐŸÐ»Ñ ÐŽÐ»Ñ Ð²Ñ
+ÐŸÐŽÐ° ÐœÐ° ÑÑÑÐ°ÐœÐžÑÑ.}
Index: /main/tags/2.38/gsdl/macros/spanish.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/spanish.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/spanish.dm	(revision 21083)
@@ -0,0 +1,873 @@
+######################################################################
+#
+# Spanish Language text and icon macros 
+#
+######################################################################
+#
+# This is the main macro file for translation when creating an 
+# interface in another language.
+#
+# Under the 'text macros' comments are text macros of the form:
+# _macroname_ {macro value}
+# Everything between the {} is the text to be translated. This text 
+# may itself contain macros (i.e. characters other than space between
+# underscore characters, e.g. _about:numdocs_ or _textpage_). These
+# macro names occurring within text shouldn't be translated but should
+# be left as they are. Underscores or curly brackets occurring 
+# naturally within the text should be escaped with a leading backslash
+# (i.e. '\_', '\{' or '\}).
+#
+# Under the 'icons' comments are macros concerned with displaying
+# icons which themselves contain text.
+# Above each macro (or group of macros) for an icon is a comment line
+# that looks something like '## "HOME" ## top_nav_button ## chome ##'.
+# The first field of the comment ("HOME" in this case) is the text
+# that appears in the english version of the icon. This is the text
+# that must be translated, nothing needs to be done to the macros 
+# themselves. The other two fields of the comments are used by 
+# automatic icon generating software which reads the newly translated
+# file and generates appropriate icons.
+#
+# Comment lines (other than those described above) need not be 
+# translated (i.e. any lines beginning with '#', like this line).
+#
+# The simplest way to translate this file is to save it as something
+# else (e.g. french.dm) and work through translating all the text
+# macro values and icon comments.
+#
+######################################################################
+
+
+######################################################################
+# Global (base) package
+package Global
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textdefaultcontent_ [l=es] {La p&aacute;gina solicitada no fue encontrada. Por 
+favor utilice el bot&oacute;n 'regresar' de su navegador o el bot&oacute;n 
+de principal para regresara la Biblioteca Digital Greenstone.}
+
+_textdefaulttitle_ [l=es] {Error en GSDL}
+
+_collectionextra_ [l=es] {Esta colecci&oacute;n contiene _about:numdocs_ documentos. 
+La colecci&oacute;n fue construida hace _about:builddate_ d&iacute;as.}
+
+_textimagecollection_ [l=es] {}
+_textimageabout_ [l=es] {P&aacute;gina Acerca de}
+_textimagehome_ [l=es] {P&aacute;gina Principal}
+_textimagehelp_ [l=es] {P&aacute;gina de Ayuda}
+_textimagepref_ [l=es] {P&aacute;gina de Preferencias}
+_textimagegreenstone_ [l=es] {Software de la Biblioteca Digital Greenstone}
+_textimagesearch_ [l=es] {Buscar t&eacute;rminos espec&iacute;ficos}
+_textimageTitle_ [l=es] {Navegar en las listas de t&iacute;tulos en orden alfab&eacute;tico}
+_textimageList_ [l=es] {Navegar en la lista de documentos}
+_textimageCreator_ [l=es] {Navegar en las listas de autores en orden alfab&eacute;tico}
+_textimageSeries_ [l=es] {Navegar por ejemplar}
+_textimageDate_ [l=es] {Navegar por fecha}
+_textimageSubject_ [l=es] {Navegar por categor&iacute;as de temas}
+_textimageOrganization_ [l=es] {Navegar por organizaci&oacute;n}
+_textimageHowto_ [l=es] {Navegar por categor&iacute;as de c&oacute;mo}
+_textimageTopic_ [l=es] {Navegar por t&oacute;picos especiales}
+_textimageBrowse_ [l=es] {Navegar}
+_textimagePeople_ [l=es] {Navegar en listas de gente en orden alfab&eacute;tico}
+
+_texticontabsearchgreen_ [l=es] {Buscar}
+_texticontabdategreen_ [l=es] {Fechas}
+_texticontabseriesgreen_ [l=es] {Series}
+_texticontabauthorgreen_ [l=es] {Autores A-Z}
+_texticontabtitlegreen_ [l=es] {T&iacute;tulos A-Z}
+_texticontablistgreen_ [l=es] {Listados}
+_texticontabsubjectgreen_ [l=es] {Temas}
+_texticontaborggreen_ [l=es] {Organizaci&oacute;n}
+_texticontabhowgreen_ [l=es] {C&oacute;mo}
+_texticontabtopicgreen_ [l=es] {T&oacute;picos}
+_texticontabbrwsegreen_ [l=es] {Navegar}
+_texticontabPeoplegreen_ [l=es] {Gente A-Z}
+
+_texticontext_ [l=es] {Ver el documento}
+_texticonclosedbook_ [l=es] {abrir este documento y ver su &iacute;ndice de contenido}
+_texticonnext_ [l=es] {ir a la siguiente secci&oacute;n}
+_texticonprev_ [l=es] {ir a la secci&oacute;n anterior}
+
+_page_ [l=es] {p&aacute;gina }
+_pages_ [l=es] {p&aacute;ginas}
+_of_ [l=es] { de }
+_vol_ [l=es] {Volumen}
+_num_ [l=es] {N&uacute;mero}
+
+_textmonth00_ [l=es] {}
+_textmonth01_ [l=es] {Enero}
+_textmonth02_ [l=es] {Febrero}
+_textmonth03_ [l=es] {Marzo}
+_textmonth04_ [l=es] {Abril}
+_textmonth05_ [l=es] {Mayo}
+_textmonth06_ [l=es] {Junio}
+_textmonth07_ [l=es] {Julio}
+_textmonth08_ [l=es] {Agosto}
+_textmonth09_ [l=es] {Septiembre}
+_textmonth10_ [l=es] {Octubre}
+_textmonth11_ [l=es] {Noviembre}
+_textmonth12_ [l=es] {Diciembre}
+
+_magazines_ [l=es] {Revistas}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "PRINCIPAL" ## top_nav_button ## chome ##
+_httpiconchomeof_ [l=es] {_httpimg_/es/chomeof.gif}
+_httpiconchomeon_ [l=es] {_httpimg_/es/chomeon.gif}
+
+## "AYUDA" ## top_nav_button ## chelp ##
+_httpiconchelpof_ [l=es] {_httpimg_/es/chelpof.gif}
+_httpiconchelpon_ [l=es] {_httpimg_/es/chelpon.gif}
+   
+## "PREFERENCIAS" ## top_nav_button ## cpref ##
+_httpiconcprefof_ [l=es] {_httpimg_/es/cprefof.gif}
+_httpiconcprefon_ [l=es] {_httpimg_/es/cprefon.gif}
+
+## "ayuda" ## green_title ## h_help ##
+_httpiconhhelp_ [l=es] {_httpimg_/es/h\_help.gif}
+_widthhhelp_ [l=es] {200}
+_heighthhelp_ [l=es] {57}
+
+## "autores a-z" ## nav_bar_button ## tauth ##
+_httpicontauthgr_ [l=es] {_httpimg_/es/tauthgr.gif}
+_httpicontauthof_ [l=es] {_httpimg_/es/tauthof.gif}
+_httpicontauthon_ [l=es] {_httpimg_/es/tauthon.gif}
+_widthtauthx_ [l=es] {100}
+
+## "series" ## nav_bar_button ## tser ##
+_httpicontsergr_ [l=es] {_httpimg_/es/tsergr.gif}
+_httpicontserof_ [l=es] {_httpimg_/es/tserof.gif}
+_httpicontseron_ [l=es] {_httpimg_/es/tseron.gif}
+_widthtserx_ [l=es] {87}
+
+## "fechas" ## nav_bar_button ## tdate ##
+_httpicontdategr_ [l=es] {_httpimg_/es/tdategr.gif}
+_httpicontdateof_ [l=es] {_httpimg_/es/tdateof.gif}
+_httpicontdateon_ [l=es] {_httpimg_/es/tdateon.gif}
+_widthtdatex_ [l=es] {87}
+
+## "temas" ## nav_bar_button ## tsubj ##
+_httpicontsubjgr_ [l=es] {_httpimg_/es/tsubjgr.gif}
+_httpicontsubjon_ [l=es] {_httpimg_/es/tsubjon.gif}
+_httpicontsubjof_ [l=es] {_httpimg_/es/tsubjof.gif}
+_widthtsubjx_ [l=es] {87}
+
+## "organización" ## nav_bar_button ## torg ##
+_httpicontorggr_ [l=es] {_httpimg_/es/torggr.gif}
+_httpicontorgon_ [l=es] {_httpimg_/es/torgon.gif}
+_httpicontorgof_ [l=es] {_httpimg_/es/torgof.gif}
+_widthtorgx_ [l=es] {108}
+
+## "cómo" ## nav_bar_button ## thow ##
+_httpiconthowgr_ [l=es] {_httpimg_/es/thowgr.gif}
+_httpiconthowon_ [l=es] {_httpimg_/es/thowon.gif}
+_httpiconthowof_ [l=es] {_httpimg_/es/thowof.gif}
+_widththowx_ [l=es] {87}
+
+## "tópicos" ## nav_bar_button ## ttopic ##
+_httpiconttopicgr_ [l=es] {_httpimg_/es/ttopicgr.gif}
+_httpiconttopicon_ [l=es] {_httpimg_/es/ttopicon.gif}
+_httpiconttopicof_ [l=es] {_httpimg_/es/ttopicof.gif}
+_widthttopicx_ [l=es] {87}
+
+## "navegar" ## nav_bar_button ## tbrwse ##
+_httpicontbrwsegr_ [l=es] {_httpimg_/es/tbrwsegr.gif}
+_httpicontbrwseon_ [l=es] {_httpimg_/es/tbrwseon.gif}
+_httpicontbrwseof_ [l=es] {_httpimg_/es/tbrwseof.gif}
+_widthtbrwsex_ [l=es] {87}
+
+## "buscar" ## nav_bar_button ## tsrch ##
+_httpicontsrchgr_ [l=es] {_httpimg_/es/tsrchgr.gif}
+_httpicontsrchof_ [l=es] {_httpimg_/es/tsrchof.gif}
+_httpicontsrchon_ [l=es] {_httpimg_/es/tsrchon.gif}
+_widthtsrchx_ [l=es] {87}
+
+## "títulos a-z" ## nav_bar_button ## ttitl ##
+_httpiconttitlgr_ [l=es] {_httpimg_/es/ttitlgr.gif}
+_httpiconttitlof_ [l=es] {_httpimg_/es/ttitlof.gif}
+_httpiconttitlon_ [l=es] {_httpimg_/es/ttitlon.gif}
+_widthttitlx_ [l=es] {90}
+
+## "gente" ## nav_bar_button ## tpeop ##
+_httpicontpeopgr_ [l=es] {_httpimg_/es/tpeopgr.gif}
+_httpicontpeopof_ [l=es] {_httpimg_/es/tpeopof.gif}
+_httpicontpeopon_ [l=es] {_httpimg_/es/tpeopon.gif}
+_widthtpeopx_ [l=es] {87}
+
+
+######################################################################
+# 'about' page
+package about
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textabcol_ [l=es] {Acerca de esta colecci&oacute;n}
+
+_textsubcols1_ [l=es] {<p>La colecci&oacute;n completa comprende _1_ subcolecciones: 
+<blockquote>} 
+
+_textsubcols2_ [l=es] {</blockquote>
+Puede seleccionar (y cambiar) las subcolecciones que est&aacute;
+utilizando actualmente en la p&aacute;gina de Preferencias.}
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "acerca de" ## green_title ## h_about ##
+_httpiconhabout_ [l=es] {_httpimg_/es/h\_about.gif}
+_widthhabout_ [l=es] {200}
+_heighthabout_ [l=es] {57}
+
+
+
+######################################################################
+# document package
+package document
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_texticonhtitle_ [l=es] {T&iacute;tulos A-Z}
+_texticonhauth_ [l=es] {Autores A-Z}
+_texticonhsubj_ [l=es] {Temas}
+_texticonhser_ [l=es] {Series}
+_texticonhdate_ [l=es] {Fechas}
+_texticonhhow_ [l=es] {C&oacute;mo}
+_texticonhorg_ [l=es] {Organizaciones}
+_texticonhbrwse_ [l=es] {Navegar}
+_texticonhpeople_ [l=es] {Gente A-Z}
+
+_texticonopenbookshelf_ [l=es] {cerrar esta secci&oacute;n de la biblioteca}
+_texticonclosedbookshelf_ [l=es] {abrir esta secci&oacute;n de la biblioteca y ver el &iacute;ndice de contenido}
+_texticonopenbook_ [l=es] {cerrar este libro}
+_texticonclosedfolder_ [l=es] {Abrir esta carpeta y ver su contenido}
+_texticonclosedfolder2_ [l=es] {abrir subsecci&oacute;n: }
+_texticonopenfolder_ [l=es] {cerrar esta carpeta}
+_texticonopenfolder2_ [l=es] {cerrar subsecci&oacute;n: }
+_texticonsmalltext_ [l=es] {Ver esta secci&oacute;n del texto}
+_texticonsmalltext2_ [l=es] {ver texto: }
+_texticonpointer_ [l=es] {secci&oacute;n actual}
+_texticondetach_ [l=es] {Abrir esta p&aacute;gina en una nueva ventana}
+_texticonhighlight_ [l=es] {Resaltar los t&eacute;rminos de la b&uacute;squeda}
+_texticonnohighlight_ [l=es] {No resaltar los t&eacute;rminos de la b&uacute;squeda}
+_texticoncontracttoc_ [l=es] {Contraer el &iacute;ndice de contenido}
+_texticonexpandtoc_ [l=es] {Expandir el &iacute;ndice de contenido}
+_texticonexpandtext_ [l=es] {Mostrar el texto completo}
+_texticoncontracttext_ [l=es] {Mostrar el texto s&oacute;lo de la secci&oacute;n seleccionada}
+_texticonwarning_ [l=es] {<b>Advertencia: </b>}
+_texticoncont_ [l=es] {&#191;desea continuar?}
+
+_textltwarning_ [l=es] {
+<p><center>
+<table cellspacing=0 cellpadding=0 width=_pagewidth_>
+<tr valign=top><td>_iconwarning_Expandir el texto generar&aacute; una gran cantidad 
+de datos a desplegar en su navegador _imagecont_
+</td></tr></table></center>
+}  
+
+_textgoto_ [l=es] {ir a la p&aacute;gina}
+_textintro_ [l=es] { <i>(texto inicial)</i>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "títulos a-z" ## green_title ## h_title ##
+_httpiconhtitle_ [l=es] {_httpimg_/es/h\_title.gif}
+_widthhtitle_ [l=es] {200}
+_heighthtitle_ [l=es] {57}
+
+## "autores a-z" ## green_title ## h_auth ##
+_httpiconhauth_ [l=es] {_httpimg_/es/h\_auth.gif}
+_widthhauth_ [l=es] {200}
+
+## "temas" ## green_title ## h_subj ##
+_httpiconhsubj_ [l=es] {_httpimg_/es/h\_subj.gif}
+_widthhsubj_ [l=es] {200}
+_heighthsubj_ [l=es] {57}
+
+## "series" ## green_title ## h_ser ##
+_httpiconhser_ [l=es] {_httpimg_/es/h\_ser.gif}
+_widthhser_ [l=es] {200}
+_heighthser_ [l=es] {57}
+
+## "fechas" ## green_title ## h_date ##
+_httpiconhdate_ [l=es] {_httpimg_/es/h\_date.gif}
+_widthhdate_ [l=es] {200}
+_heighthdate_ [l=es] {57}
+
+## "cómo" ## green_title ## h_how ##
+_httpiconhhow_ [l=es] {_httpimg_/es/h\_how.gif}
+_widthhhow_ [l=es] {200}
+_heighthhow_ [l=es] {57}
+
+## "tópicos" ## green_title ## h_topic ##
+_httpiconhtopic_ [l=es] {_httpimg_/es/h\_topic.gif}
+_widthhtopic_ [l=es] {200}
+_heighthtopic_ [l=es] {57}
+
+## "organización" ## green_title ## h_org ##
+_httpiconhorg_ [l=es] {_httpimg_/es/h\_org.gif}
+_widthhorg_ [l=es] {250}
+_heighthorg_ [l=es] {57}
+
+## "navegar" ## green_title ## h_brwse ##
+_httpiconhbrwse_ [l=es] {_httpimg_/es/h\_brwse.gif}
+_widthhbrwse_ [l=es] {200}
+_heighthbrwse_ [l=es] {57}
+
+## "gente" ## green_title ## h_people ##
+_httpiconhpeople_ [l=es] {_httpimg_/es/h\_people.gif}
+_widthhpeople_ [l=es] {200}
+_heighthpeople_ [l=es] {57}
+
+## "DESEA CONTINUAR?" ## top_nav_button ## cont ##
+_httpiconcontoff_ [l=es] {_httpimg_/es/contof.gif}
+_httpiconconton_ [l=es] {_httpimg_/es/conton.gif}
+
+## "TEXTO COMPLETO" ## document_button ## eallt ## 
+_httpiconealltof_ [l=es] {_httpimg_/es/ealltof.gif}
+_httpiconeallton_ [l=es] {_httpimg_/es/eallton.gif}
+
+## "CONTRAER ÍNDICE" ## document_button ## econc ##
+_httpiconeconcof_ [l=es] {_httpimg_/es/econcof.gif}
+_httpiconeconcon_ [l=es] {_httpimg_/es/econcon.gif}
+
+## "SEPARAR" ## document_button ## edtch ##
+_httpiconedtchof_ [l=es] {_httpimg_/es/edtchof.gif}
+_httpiconedtchon_ [l=es] {_httpimg_/es/edtchon.gif}
+
+## "EXPANDIR ÍNDICE" ## document_button ## eexpc ##
+_httpiconeexpcof_ [l=es] {_httpimg_/es/eexpcof.gif}
+_httpiconeexpcon_ [l=es] {_httpimg_/es/eexpcon.gif}
+
+## "CONTRAER TEXTO" ## document_button ## etsec ##
+_httpiconetsecof_ [l=es] {_httpimg_/es/etsecof.gif}
+_httpiconetsecon_ [l=es] {_httpimg_/es/etsecon.gif}
+
+## "RESALTAR" ## document_button ## ehl ##
+_httpiconehlof_ [l=es] {_httpimg_/es/ehlof.gif}
+_httpiconehlon_ [l=es] {_httpimg_/es/ehlon.gif}
+
+## "NO RESALTAR" ## document_button ## enhl ##
+_httpiconenhlof_ [l=es] {_httpimg_/es/enhlof.gif}
+_httpiconenhlon_ [l=es] {_httpimg_/es/enhlon.gif}
+
+
+######################################################################
+# 'search' page
+package query
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+# this if statement produces the text 'results n1 - nn for query: querystring' or 
+# 'No matches for query: querystring', depending on whether or not there were
+# any matches
+_textquerytitle_ [l=es] {_If_(_thislast_,resultados _thisfirst_ - _thislast_ para la petici&oacute;n:_cgiargq_,No se encontraron resultados para la petici&oacute;n: _cgiargq_)}
+
+_textnoquerytitle_ [l=es] {P&aacute;gina de b&uacute;squeda}
+
+_texticonthispage_ [l=es] {buscar}
+_textsome_ [l=es] {_If_(_cgiargb_,clasificado,algunas de)}
+_textall_ [l=es] {_If_(_cgiargb_,boleano,todas)}
+_texticonqueryresultsbar_ [l=es] {}
+_textfreqmsg1_ [l=es] {Palabras contadas: }
+_textpostprocess_ [l=es] {_If_(_quotedquery_,<br><i>postprocesado para encontrar _quotedquery_</i>
+)}					     
+
+_textmorethan_ [l=es] {M&aacute;s de }
+_textapprox_ [l=es] {Acerca de }
+_textnodocs_ [l=es] {No hay documentos que correspondan a la petici&oacute;n.}
+_text1doc_ [l=es] {un documento corresponde a la petici&oacute;n.}
+_textlotsdocs_ [l=es] {documentos corresponden a la petici&oacute;n.}
+_textmatches_ [l=es] {Correspondencias }
+_textbeginsearch_ [l=es] {Iniciar la b&uacute;squeda}
+
+_textsimplesearch_ [l=es] {Buscar _If_(_hselection_, _hselection_)_If_(_jselection_,_textjselect_)_If_(_nselection_, en idioma _nselection_) 
+que contengan _querytypeselection_ las palabras}
+
+_textadvancedsearch_ [l=es] {Buscar _If_(_hselection_, _hselection_, _defaultindextext_)_If_(_jselection_,_textjselect_)_If_(_nselection_, en idioma _nselection_) 
+utilizando la petici&oacute;n _querytypeselection_}
+
+_textjselect_ [l=es] {_If_(_hselection_, de) _jselection_}
+
+_textstemon_ [l=es] { (ignorar las terminaciones de las palabras)}
+_textsearchhistory_ [l=es] {Buscar en la Historia}
+_textnohistory_ [l=es] {La b&uacute;squeda en la historia no est&aacute; disponible}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "buscar" ## green_title ## h_search ##
+_httpiconhsearch_ [l=es] {_httpimg_/es/h\_search.gif}
+_widthhsearch_ [l=es] {200}
+_heighthsearch_ [l=es] {57}
+
+## "resultados" ## green_bar_left_aligned ## qryresb ##
+_httpiconqryresb_ [l=es] {_httpimg_/es/qryresb.gif}
+_widthqryresb_ [l=es] {_pagewidth_}
+_heightqryresb_ [l=es] {17}
+
+## "mostrar" ## hand_made ##
+_httpicondisplay_ [l=es] {_httpimg_/display.gif}
+_widthdisplay_ [l=es] {60}
+_heightdisplay_ [l=es] {20}
+
+
+
+######################################################################
+# 'preferences' page
+package preferences
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textsearchprefs_ [l=es] {Preferencias de b&uacute;squeda}
+_textcollectionprefs_ [l=es] {Preferencias de colecciones}
+_textpresentationprefs_ [l=es] {Preferencias de presentaci&oacute;n}
+_textpreferences_ [l=es] {Preferencias}
+_textignorecase_ [l=es] { ignorar diferencias entre may&uacute;sculas y min&uacute;sculas}
+_textmatchcase_ [l=es] { deben corresponder may&uacute;sculas y min&uacute;sculas}
+_textstem_ [l=es] { ignorar las terminaciones de las palabras}
+_textnostem_ [l=es] { debe corresponder la palabra completa}
+_textprefop_ [l=es] {Regresa hasta _maxdocoption_ resultados con _hitsperpageoption_ aciertos por p&aacute;gina.}
+_textextlink_ [l=es] {Acceder a p&aacute;ginas de Web externas: }
+_textintlink_ [l=es] {Documentos fuente recuperados de:}
+_textlanguage_ [l=es] {Idioma de la interfaz: }
+_textencoding_ [l=es] {Codificaci&oacute;n: }
+_textformat_ [l=es] {Formato de la interfaz: }
+_textall_ [l=es] {todas}
+_textsimplemode_ [l=es] {b&uacute;squeda simple}
+_textadvancedmode_ [l=es] {b&uacute;squeda avanzada (permite b&uacute;squedas boleanas utilizando !, &, | y par&eacute;ntesis)}
+_textlinkinterm_ [l=es] {a trav&eacute;s de una p&aacute;gina intermedia}
+_textlinkdirect_ [l=es] {ir directamente ah&iacute;}
+_textdigitlib_ [l=es] {la biblioteca digital}
+_textweb_ [l=es] {el web}
+_textgraphical_ [l=es] {Gr&aacute;fica}
+_texttextual_ [l=es] {S&oacute;lo texto}
+_textcollectionoption_ [l=es] {<p>
+Subcolecciones a incluir:
+<br>}
+
+
+#------------------------------------------------------------
+# icons
+#------------------------------------------------------------
+
+## "preferencias" ## green_title ## h_pref ##
+_httpiconhpref_ [l=es] {_httpimg_/es/h\_pref.gif}
+_widthhpref_ [l=es] {200}
+_heighthpref_ [l=es] {57}
+
+
+######################################################################
+# 'help' page -- this is lower priority for translating than the
+# rest of this file
+package help
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+_textHelp_ [l=es] {Ayuda}
+_textSearchshort_ [l=es] {buscar palabras clave}
+_textSeriesshort_ [l=es] {acceder a las publicaciones por series}
+_textDateshort_ [l=es] {acceder a las publicaciones por fecha}
+_textSubjectshort_ [l=es] {acceder a las publicaciones por tema}
+_textTitleshort_ [l=es] {acceder a las publicaciones por t&iacute;tulo}
+_textBrowseshort_ [l=es] {navegar en las publicaciones}
+_textCreatorshort_ [l=es] {acceder a las publicaciones por autor}
+_textOrganizationshort_ [l=es] {acceder a las publicaciones por organizaci&oacute;n}
+_textHowtoshort_ [l=es] {acceder a las publicaciones por lista de c&oacute;mo}
+_textTopicshort_ [l=es] {acceder a las publicaciones por t&oacute;pico}
+_textPeopleshort_ [l=es] {acceder a las publicaciones por gente}
+_textdefaultshorttext_ [l=es] {clasificaci&oacute;n no definida}
+
+_textSearchlong_ [l=es] { <p>Puede <i>buscar palabras clave</i> que aparecen en 
+el texto desde la p&aacute;gina de "b&uacute;squeda". &Eacute;sta es la primera p&aacute;gina que 
+aparece cuando usted inicia y puede ser accesada desde otras p&aacute;ginas al 
+presionar el bot&oacute;n de <i>buscar</i>.  }
+
+_textTitlelong_ [l=es] { <p>Puede <i>acceder a las publicaciones por t&iacute;tulo</i> 
+presionando el bot&oacute;n <i>titulos a-z</i>. El resultado ser&aacute; una 
+lista de libros en orden alfab&eacute;tico.  }
+
+_textOrganizationlong_ [l=es] { <p>Puede <i>acceder a las publicaciones por 
+organizaci&oacute;n</i> presionando el bot&oacute;n <i>organizaci&oacute;n</i>. El resultado 
+ser&aacute; una lista de organizaciones.  }
+
+_textHowtolong_ [l=es] { <p>Puede <i>acceder a las publicaciones por una lista 
+de c&oacute;mo</i> presionando el bot&oacute;n <i>c&oacute;mo</i>. El resultado 
+ser&aacute; una lista de c&oacute;mos.  }
+
+_textCreatorlong_ [l=es] { <p>Puede <i>acceder a publicaciones por autor</i> 
+presionando el bot&oacute;n <i>autores a-z</i>. El resultado ser&aacute; una 
+lista de libros ordenados por el apellido del autor.  }
+
+_textTopiclong_ [l=es] { <p>Puede <i>acceder a las publicaciones por t&oacute;pico</i> 
+presionando el bot&oacute;n de <i>t&oacute;pico</i>. El resultado ser&aacute; 
+una lista de t&oacute;picos para navegarlos.  }
+
+_textSubjectlong_ [l=es] { <p>Puede <i>acceder a las publicaciones por tema</i> 
+presionando el bot&oacute;n de <i>temas</i>. El resultado ser&aacute; una lista de temas, 
+representados por libreros.  }
+
+_textSerieslong_ [l=es] { <p>Puede <i>acceder a las publicaciones por series</i> 
+presionando el bot&oacute;n de <i>series</i>. El resultado ser&aacute; una lista 
+de las series que se encuentran en la colecci&oacute;n.  }
+
+_textDatelong_ [l=es] { <p>Puede <i>acceder a las publicaciones por fecha</i> 
+presionando el bot&oacute;n de <i>fechas</i>. El resultado ser&aacute; una lista
+de todas las publicaciones, ordenadas cronol&oacute;gicamente.  }
+
+_textBrowselong_ [l=es] { <p> Puede <i>navegar en las publicaciones</i> presionando 
+el bot&oacute;n de <i>navegar</i>.  }
+
+_textPeoplelong_ [l=es] { <p>Puede <i>acceder a las publicaciones por gente</i> 
+presionando el bot&oacute;n <i>gente a-z</i>. El resultado ser&aacute; una lista
+ordenada por apellido.  }
+
+_textdefaultlongtext_ [l=es] { <p>Pulse el bot&oacute;n <i>desconocido</i> para navegar 
+en las publicaciones (el listado ser&aacute; ordenado por un campo desconocido).  }
+
+_texthelptopics_ [l=es] {
+
+<h2 align=left>T&oacute;picos</h2>
+<ul>
+  <li><a href="\#finding-information">_textsimplehelpheading_</a>
+  _topicreadingdocs_
+  <li><a href="\#searching">&#191;C&oacute;mo buscar palabras clave?</a>
+<ul>
+  <li><a href="\#query-terms">T&eacute;rminos de la b&uacute;squeda</a>
+  <li><a href="\#query-type">Tipo de petici&oacute;n</a>
+  <li><a href="\#scope-of-queries">Rango de las b&uacute;squedas</a>
+</ul>
+  <li><a href="\#preferences">_textchangeprefs_</a>
+<ul>
+  <li><a href="\#col-prefs">Preferencias de colecci&oacute;n</a>
+  <li><a href="\#pres-prefs">Preferencias de presentaci&oacute;n</a>
+  <li><a href="\#search-prefs">Preferencias de b&uacute;squeda</a>
+</ul>
+</ul>
+}
+
+# there are 4 versions of this section of the help text.
+# which version is used is currently set within the server
+# (it should probably use the macro language e.g. [type=book])
+# 1 = html (like fao collections) -- section is empty
+# 2 = book (like hdl collection) -- macros beginning with book
+# 3 = bibliographic (like csbib) -- macros beginning with bib
+# 4 = standard (like gberg) -- the default
+
+_topicreadingdocs_ [l=es] {<li><a href="\#reading-docs">_textreadingdocs_</a>}
+
+_textreadingdocs_ [l=es] {&#191;C&oacute;mo leer los documentos?}
+_booktextreadingdocs_ [l=es] {&#191;C&oacute;mo leer los libros?}
+_bibtextreadingdocs_ [l=es] {Obtener m&aacute;s informaci&oacute;n sobre un elemento bibliogr&aacute;fico}
+
+_texthelpreadingdocs_ [l=es] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Puede notar cuando ha llegado a un documento en particular porque su 
+t&iacute;tulo y autor aparecen en la parte superior izquierda de la 
+p&aacute;gina. Al lado de &eacute;stos est&aacute; el n&uacute;mero de la 
+p&aacute;gina actual, un cuadro que le permite seleccionar la nueva 
+p&aacute;gina y las flechas de adelante y atr&aacute;s.
+
+<p>Debajo est&aacute; el texto de la secci&oacute;n actual. Cuando lo haya 
+leido, las flechas que se encuentran en la parte inferior pueden llevarlo a la 
+secci&oacute;n siguiente o regresarlo a la secci&oacute;n anterior.
+
+<p>Abajo del t&iacute;tulo y autor se encuentran tres botones. Presione
+<i>texto completo</i> para desplegar el texto completo de documento actual. 
+Si el documento es extenso, este proceso tomar&aacute; alg&uacute;n tiempo y 
+utilizar&aacute; mucha memoria!. Presione <i>separar</i> para crear un nueva 
+ventana de su navegador para este documento (esto es &uacute;til si desea 
+comparar documentos o leer dos a la vez). Finalmente, cuando realiza una 
+b&uacute;squeda, las palabras a buscar aparecen resaltadas; presione <i>sin 
+resaltar</i> para eliminar esta apariencia.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Presione la flecha para ir a la secci&oacute;n siguiente ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... o regresar a la secci&oacute;n anterior</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Desplegar el texto completo, o no</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina en una nueva ventana</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Resaltar o no los t&eacute;rminos buscados</td></tr>
+</table>
+}
+
+_booktexthelpreadingdocs_ [l=es] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Puede notar cuando ha llegado a un libro en particular porque la 
+fotograf&iacute;a de su portada aparece en la parte izquierda de la 
+p&aacute;gina. Al lado de la fotograf&iacute;a est&aacute; el &iacute;ndice 
+de contenido con una flecha que le indica d&oacute;nde est&aacute; usted. 
+Este &iacute;ndice es expandible: presione las carpetas para abrirlas o 
+cerrarlas. Presione en el libro abrierto, que se encuentra en la parte 
+superior, para cerrarlo.
+
+<p>Debajo est&aacute; el texto de la secci&oacute;n actual. Cuando lo haya 
+leido, las flechas que se encuentran en la parte inferior pueden llevarlo a la
+secci&oacute;n siguiente o regresarlo a la secci&oacute;n anterior.
+
+<p>Abajo de la fotograf&iacute;a se encuentran cuatro botones. Presione sobre 
+<i>texto completo</i> para desplegar el texto completo de la secci&oacute;n 
+actual o del libro. Si el libro es extenso, este proceso tomar&aacute; 
+alg&uacute;n tiempo y utilizar&aacute; mucha memoria!. Presione <i>expandir 
+&iacute;ndice</i> para expandir el &iacute;ndice completo y as&iacute; pueda 
+ver todos los t&iacute;tulos de cap&iacute;tulos y subsecciones. Presione 
+<i>separar</i> para crear un nueva ventana de su navegador para este documento 
+(esto es &uacute;til si desea comparar libros o leer dos a la vez). Finalmente, 
+cuando realiza una b&uacute;squeda, las palabras a buscar aparecen resaltadas; 
+presione <i>sin resaltar</i> para eliminar esta apariencia.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_httpiconbshelf_" border="0"></td><td>Abrir este librero</td></tr>
+<tr><td><img src="_httpiconopenbook_" border="0"></td><td><img 
+src="_httpiconbook_" border="0"></td><td>Abrir/cerrar este libro</td></tr>
+<tr><td colspan=2><img src="_httpiconitext_" border="0"></td><td>Ver esta secci&oacute;n del texto</td></tr>
+<tr><td><img src="_document:httpiconealltof_" border="0"></td><td><img 
+src="_document:httpiconetsecof_" border="0"></td><td>Desplegar el texto completo, o no</td></tr>
+<tr><td><img src="_document:httpiconeexpcof_" border="0"></td><td><img
+src="_document:httpiconeconcof_" border="0"></td><td>Expandir o no el &iacute;ndice de contenido</td></tr>
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina en una nueva ventana</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Resaltar o no los t&eacute;rminos de la b&uacute;squeda</td></tr>
+<tr><td colspan=2><img src="_httpiconmore_" border="0"></td><td>Presionar la flecha para ir a la secci&oacute;n siguiente ...</td></tr>
+<tr><td colspan=2><img src="_httpiconless_" border="0"></td><td>... o regresar a la secci&oacute;n anterior</td></tr>
+</table>
+}
+
+_bibtexthelpreadingdocs_ [l=es] {
+<p>_iconblankbar_
+<a name=reading-docs>
+<h2>_textreadingdocs_</h2>
+
+<p>Algunos elementos bibliogr&aacute;ficos contienen m&aacute;s 
+informaci&oacute;n, por ejemplo un resumen. Puede notar desde la p&aacute;gina 
+de resultados si este es el caso porque que se muestran con el &iacute;cono
+ _icontext_ en lugar del &iacute;cono _iconblanktext_.
+
+<p>Presionar el &iacute;cono _icontext_ le dar&aacute; m&aacute;s 
+informaci&oacute;n acerca del elemento bibliogr&aacute;fico.
+
+<p> Abajo del elemento bibliogr&aacute;fico se encuentran dos botones. Presione
+<i>separar</i> para crear un nueva ventana de su navegador para este 
+libro (esto es &uacute;til si desea comparar elementos bibliogr&aacute;ficos). 
+Finalmente, cuando realiza una b&uacute;squeda, las palabras a buscar aparecen 
+resaltadas; presione <i>sin resaltar</i> para eliminar esta apariencia.
+
+<p>
+<table cellspacing="0" cellpadding="2" border="0">
+<tr><td colspan=2><img src="_document:httpiconedtchof_" border="0"></td><td>Abrir esta p&aacute;gina en una nueva ventana</td></tr>
+<tr><td><img src="_document:httpiconehlof_" border="0"></td><td><img
+src="_document:httpiconenhlof_" border="0"></td><td>Resaltar o no los t&eacute;rminos buscados</td></tr>
+</table>
+}
+
+_texthelpsearching_ [l=es] {
+<h2>&#191;C&oacute;mo buscar palabras clave?</h2>
+<p>
+  Desde la p&aacute;gina de b&uacute;squeda, hacer una petici&oacute;n siguiendo estos pasos:<p>
+  <ol><li>Especificar qu&eacute; documentos quiere buscar
+      <li>Decir si quiere buscar todas las palabras o s&oacute;lo algunas
+      <li>Escribir las palabras que quiere buscar
+      <li>Presionar el bot&oacute;n de <i>Iniciar la b&uacute;squeda</i>
+  </ol>
+  
+<p>Cuando hace una petici&oacute;n, se mostrar&aacute;n los t&iacute;tulos de 
+veinte documentos resultantes. Existe un bot&oacute;n al final que lo 
+llevar&aacute; a los siguientes veinte documentos. De ah&iacute; 
+encontrar&aacute; botones para llevarlo a los terceros veinte o regresar a los 
+primeros veinte, etc&eacute;tera. Presione el t&iacute;tulo de cualquier 
+documento o el peque&ntilde;o bot&oacute;n al lado de &eacute;l, para verlo. 
+
+<p>El n&uacute;mero m&aacute;ximo documentos resultantes es de 100. Puede 
+  cambiar este n&uacute;mero presionando el bot&oacute;n de <i>preferencias</i>
+  que se encuentra en la parte superior de la p&aacute;gina.<p>
+
+<p>_iconblankbar_
+<a name=query-terms>
+<h3>T&eacute;rminos de la b&uacute;squeda</h3>
+
+<p>Lo que escribe en el cuadro de petici&oacute;n es interpretado como una 
+lista de palabras llamadas "t&eacute;rminos de la b&uacute;squeda". Cada 
+t&eacute;rmino contiene letras y d&iacute;gitos. Los t&eacute;rminos se separan 
+por el espacio en blanco. Si aparecen otros caracteres, como los de 
+puntuaci&oacute;n, &eacute;stos sirven para separar los t&eacute;rminos 
+como si fueran espacios y son ignorados. No puede buscar palabras que incluyan 
+puntuaci&oacute;n.
+
+<p>Por ejemplo, la petici&oacute;n<p>
+    <ul><kbd>Agro-sivicultura en las Islas del Pac&iacute;fico: Sistemas de Sustento (1993)</kbd></ul>
+      <p>ser&aacute; tratado de igual manera que<p>
+      <ul><kbd>Agro sivicultura en las Islas del Pac&iacute;fico Sistemas de Sustento 1993 </kbd></ul><p>
+      
+<p>_iconblankbar_
+<a name=query-type>
+<h3>Tipo de petici&oacute;n</h3>
+
+<p>Existen dos tipos de petici&oacute;n.
+
+<ul>
+  <li>Peticiones de <b>todas</b> las palabras. &Eacute;sta busca documentos que 
+      contengan todas las palabras que especifique. Los documentos que 
+      satisfagan la petici&oacute;n ser&aacute;n desplegados en orden 
+      alfab&eacute;tico. <p>     
+      
+  <li>Peticiones de <b>alguna(s)</b> palabra(s).  Solamente liste los
+      t&eacute;rminos que probablemente aparecer&aacute;n en los documentos que 
+      est&eacute; buscando. Los documentos se ordenar&aacute;n de acuerdo a que 
+      tanto coincidieron con su petici&oacute;n. Cuando se determina el grado de
+      correspondencia, 
+
+      <p><ul>
+        <li> entre m&aacute;s t&eacute;rminos buscados contenga el documento, 
+             satisfacer&aacute; mejor su petici&oacute;n;
+        <li> los t&eacute;rminos no comunes son m&aacute;s importantes que los 
+             comunes;
+        <li> los documentos m&aacute;s peque&ntilde;os tienen m&aacute;s 
+             probabilidades que los grandes de corresponder a su solicitud.
+      </ul>      
+</ul>
+
+<p>Utilice tantos t&eacute;rminos de b&uacute;squeda como desee, una 
+oraci&oacute;n completa, o quizas todo un p&aacute;rrafo. Si especifica un 
+s&oacute;lo t&eacute;rmino, los documentos ser&aacute;n 
+ordenados por frecuencia de ocurrencia.<p>
+_texthelpscope_
+}
+
+_textchangeprefs_ [l=es] {Cambiando sus preferencias}
+
+_texthelppreferences_ [l=es] {<h2>_textchangeprefs_</h2>
+
+<p>Cuando presione el bot&oacute;n de <i>preferencias</i>, de la parte superior de la
+p&aacute;gina, ser&aacute; capaz de cambiar algunas caracter&iacute;sticas de la 
+interfaz para satisfacer sus propios requisitos.
+
+<p>_iconblankbar_
+<a name=col-prefs>
+<h3 align=left>Perefencias de colecci&oacute;n</h3>
+<p>
+Algunas colecciones se componen de varias subcolecciones, las cuales pueden
+buscarse de forma independiente o juntas, como una unidad. De esta 
+manera, puede seleccionar qu&eacute; subcolecciones desea incluir en sus 
+b&uacute;squedas en la p&aacute;gina de preferencias.
+
+<p>_iconblankbar_
+<a name=pres-prefs>
+<h3 align=left>Preferencias de presentaci&oacute;n</h3>
+<p>
+Dependiendo de la colecci&oacute;n, pueden existir muchas opciones para definir 
+la manera de la presentaci&oacute;n.
+<p>
+Las colecciones de p&aacute;ginas de Web le permiten eliminar la barra de 
+navegaci&oacute;n de Greenstone de la parte superior de cada p&aacute;gina, 
+de modo que una vez terminada la b&uacute;squeda se encontrar&aacute; en la 
+p&aacute;gina correspondiente sin los encabezados de Greenstone. Para realizar 
+otra b&uacute;squeda tendr&aacute; que utilizar el bot&oacute;n "regresar" de 
+su navegador. Estas colecciones tambi&eacute;n le permiten eliminar el mensaje 
+de alerta de Greenstone cuando seleccione una liga que lo lleve fuera de la 
+colecci&oacute;n de la biblioteca digital y de Web en si. Y en algunas 
+colecciones del Web puede controlar si las ligas de la p&aacute;gina de 
+"Resultados de la b&uacute;squeda" lo llevan directo al URL en cuesti&oacute;n 
+o m&aacute;s bien a la copia de la p&aacute;gina de la biblioteca digital.
+
+<p>
+Las colecciones que son capaces de ser representadas en diferentes idiomas 
+le permiten especificar el idioma de la interfaz. Si el idioma es Chino, 
+puede especificar tambi&eacute;n cu&aacute;les son los est&aacute;ndares 
+Chinos de codificaci&oacute;n que utiliza su navegador.
+
+<p>
+Finalmente, todas las colecciones le permiten cambiar a una interfaz de texto
+diferente de la gr&aacute;fica. Esto es muy &uacute;til para los usuarios con 
+problemas visuales que utilizan fuentes grandes o sintetizadores de voz como 
+salida.
+
+<p>_iconblankbar_
+<a name=search-prefs>
+<h3 align=left>Preferencias de b&uacute;squeda</h3>
+Dos pares de botones controlan la diferencia entre may&uacute;sculas y 
+min&uacute;sculas y las ra&iacute;ces de las b&uacute;squedas que hace. 
+El primer conjunto de botones controla si deben coincidir may&uacute;sculas 
+o min&uacute;sculas. El segundo conjunto controla si se ignoran las 
+terminaciones de las palabras o no (ra&iacute;ces).
+
+<p>Por ejemplo, si los botones de <i>ignorar diferencias entre may&uacute;sculas
+y min&uacute;sculas</i> y el de <i>ignorar terminaciones de palabras</i> 
+est&aacute;n seleccionados, la b&uacute;squeda<p>
+    <ul><kbd>Construcciones Africanas</kbd></ul>
+      <p>ser&aacute; considerada al igual que <p>
+      <ul><kbd>constructores africanos</kbd></ul><p>
+      porque la letra may&uacute;scula en "Africanas" sera transformada a 
+      min&uacute;scula, y los sufijos "ciones" y "nas" se eliminaran de 
+      "Construcciones" y "Africanas" respectivamente ( de la misma manera, 
+      "tores" y "nos" se eliminar&aacute;n de "constructores" y "africanos").
+
+<p>Tambi&eacute;n puede cambiar a un modo "avanzado" de consulta que le permite 
+combinar t&eacute;rminos utilizando Y (&), O (|), y NO (!). Esto le 
+permitir&aacute; especificar consultas m&aacute;s precisas.
+
+<p>Finalmente, puede controlar el n&uacute;mero de aciertos regresados, y el
+n&uacute;mero de estos presentado en cada pantalla completa.
+}
+
+_texttanumbrowseoptions_ [l=es] {Existen _numbrowseoptions_ manera(s) de encontrar informaci&oacute;n en esta colecci&oacute;n:}
+
+_textsimplehelpheading_ [l=es] {&#191;C&oacute;mo encontrar informaci&oacute;n?}
+
+_texthelpscope_ [l=es] {
+<p>_iconblankbar_
+<a name=scope-of-queries>
+<h3 align=left>Rango de las b&uacute;squedas</h3> 
+
+<p>
+En la mayor&iacute;a de las colecciones puede escoger diferentes &iacute;ndices 
+para buscar. Por ejemplo, puede haber &iacute;ndices por autor o t&iacute;tulo. 
+Tambi&eacute;n puede haber &iacute;ndices por cap&iacute;tulo o p&aacute;rrafo. 
+Generalmente, se recupera el documento correspondiente sin importar &eacute;l 
+&iacute;ndice por el cual se busca. 
+<p>Si los documentos son libros, estos aparecer&aacute;n en el lugar 
+predefinido.
+}
Index: /main/tags/2.38/gsdl/macros/spanish2.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/spanish2.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/spanish2.dm	(revision 21083)
@@ -0,0 +1,84 @@
+# partially completed Spanish translation of english2.dm
+
+
+
+######################################################################
+# 'home' page
+package home
+######################################################################
+
+
+#------------------------------------------------------------
+# text macros
+#------------------------------------------------------------
+
+
+_textimagecollector_ [l=es] {
+&lt;&lt;spanish&gt;&gt; Helps you create new collections, modify or add to existing ones, or delete
+collections
+}
+
+_textimageadmin_ [l=es] {
+&lt;&lt;spanish&gt;&gt; Allows you to add new users, summarizes the collections in the system,
+gives technical information on the Greenstone installation
+}
+
+_textimagegogreenstone_ [l=es] {
+&lt;&lt;spanish&gt;&gt; Tells you about the Greenstone software and the New Zealand Digital Library
+Project where it originated
+}
+
+_textimagegodocs_ [l=es] {&lt;&lt;spanish&gt;&gt; Greenstone manuals}
+
+_textaboutgreenstone_ [l=es] {
+
+<p>&lt;&lt;spanish&gt;&gt;
+
+<p>Greenstone is a suite of software for building and distributing
+digital library collections. It provides a new way of organizing
+information and publishing it on the Internet or on CD-ROM. Greenstone
+is developed and produced by the New Zealand Digital Library
+Project at the University of Waikato, and distributed in
+cooperation with UNESCO and the Humanity Libraries
+Project. It is open-source software, available from <a
+href="http://greenstone.org">http://greenstone.org</a> under the terms
+of the GNU General Public License.
+
+<p>The aim of the software is to empower users, particularly in
+universities, libraries, and other public service institutions, to
+build their own digital libraries.  Digital libraries are radically
+reforming how information is disseminated and acquired in UNESCO's
+partner communities and institutions in the fields of education,
+science and culture around the world, and particularly in developing
+countries.  We hope that this software will encourage the effective
+deployment of digital libraries to share information and place it in
+the public domain.
+
+<p>This software is developed and distributed as an international
+cooperative effort established in August 2000 between three parties.
+<ul>
+<li>
+<a href="http://nzdl.org"><b>New Zealand Digital Library Project at the University of Waikato</b></a>
+<br>
+Greenstone software grew out of this project, and this initiative
+has been endorsed by the Communication Sub-Commission of the New
+Zealand National Commission for UNESCO as part of New Zealand's
+contribution to UNESCO's programme.
+<li>
+<a href="http://www.unesco.org"><b>United Nations Educational, Scientific and Cultural Organization</b></a>
+<br>
+The dissemination of educational and scientific knowledge throughout
+the world is central to UNESCO's goals as enunciated in its
+Constitution, and information and communication technology is seen as
+an important tool in this context.
+<li>
+<a href="http://humaninfo.org"><b>The Humanity Libraries Project, based in Antwerp, Belgium</b></a>
+<br>
+This project works with UN agencies and other NGOs, and has established
+a worldwide reputation for digitizing documentation of interest to
+human development and making it widely available, free of charge to
+developing nations and on a cost-recovery basis to others.
+</ul>
+
+<p>&lt;&lt;spanish&gt;&gt;
+}
Index: /main/tags/2.38/gsdl/macros/status.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/status.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/status.dm	(revision 21083)
@@ -0,0 +1,144 @@
+package status
+
+_header_ {<html>
+<head>
+<title>_1_</title>
+</head>
+<body bgcolor="\#90c098" text="\#000000" link="\#006666"
+      alink="\#cc9900" vlink="\#666633">
+}
+
+_footer_ {</body>
+</html>
+}
+
+_infoheader_ {<html>
+<head>
+<title>_1_</title>
+</head>
+<body bgcolor="\#ffffff" text="\#000000" link="\#006666"
+      alink="\#cc9900" vlink="\#666633">
+
+<table width=100%>
+  <tr>
+    <td><img src="_httpimg_/spacer.gif" width=2 height=77></td>
+    <td>_iconblankbar_
+        <center><h2>_1_</h2></center>
+        _iconblankbar_</td>
+  </tr>
+</table>
+<center>
+<table width=_pagewidth_><tr><td>
+}
+
+_infofooter_ {
+</td></tr></table>
+<p> _iconblankbar_
+</body>
+</html>
+}
+
+
+_frameset_ {
+<html>
+<head>
+<title>_titlewelcome_</title>
+</head>
+
+<frameset cols="180,*" border=0>
+  <noframes><body bgcolor="#ffffff">
+  <p>_textframebrowser_</p>
+  </body>
+  </noframes>
+  <frame src="_gwcgi_?e=_compressedoptions_&a=status&p=select" name=navframe>
+  <frame src="_gwcgi_?e=_compressedoptions_&a=status&p=welcome" name=infoframe>
+</frameset>
+
+</html>
+}
+
+_select_ {
+<a href="_httppagehome_" target=_top border=0><img src="_httpimg_/gsdl.gif"></a>
+<p>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=welcome" target=infoframe>_textadminhome_</a><br>
+<a href="_httppagehome_" target=\_top>_textreturnhome_</a>
+
+<p><b>_textconfigfiles_</b><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=gsdlsite" target=infoframe>_textgsdlsite_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=maincfg" target=infoframe>_textmaincfg_</a>
+
+<p><b>_textlogs_</b><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=usagelog" target=infoframe>_textusagelog_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=errorlog" target=infoframe>_texterrorlog_</a>
+
+_If_("_cgiarguma_" ne "\_cgiarguma\_", 
+<p><b>_textusermanage_</b><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=um&uma=listusers" target=infoframe>_textlistusers_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=um&uma=adduser" target=infoframe>_textaddusers_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=um&uma=changepasswd" target=infoframe>_textchangepasswd_</a>
+)
+
+<p><b>_textinfo_</b><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=generalinfo" target=infoframe>_textgeneral_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=argumentinfo" target=infoframe>_textarguments_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=actioninfo" target=infoframe>_textactions_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=browserinfo" target=infoframe>_textbrowsers_</a><br>
+<a href="_gwcgi_?e=_compressedoptions_&a=status&p=protocolinfo" target=infoframe>_textprotocols_</a>
+}
+
+_textgsdlsite_ {gsdlsite.cfg}
+_textmaincfg_ {main.cfg}
+
+_welcome_ {
+<center>
+<table width=_pagewidth_><tr><td>
+<b>_textversion_: _versionnum_</b>
+
+<p>_textmaas_
+<ul>
+<li>_textvol_
+<li>_textcmuc_
+<li>_textati_
+</ul>
+_texttsaa_
+<p>
+_iconblankbar_
+</td></tr>
+<tr><th align=left><br>_textcolstat_</th></tr>
+<tr><td>
+<font color=gray>
+_textcwoa_
+<p>
+_textcafi_
+<br>
+_textcctv_
+</font>
+</td></tr>
+</table>
+</center>
+}
+
+_maincfg_ {
+<form name="maincfgform" method=post action="_gwcgi_">
+<input type=hidden name="p" value="changemaincfg">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<p>_If_(_maincfgfile_,<textarea name="cfgfile" cols=72 rows=18 wrap=off>
+_maincfgfile_
+</textarea>
+<br><input type=submit value="_textsubc_"><input type=reset>,_texteom_)
+</form>
+}
+
+_changemaincfgfail_ {
+<html>
+<body bgcolor="\#ffffff" text="\#000000">
+_textftum_
+_footer_
+}
+
+_changemaincfgsuccess_ {
+<html>
+<body bgcolor="\#ffffff" text="\#000000">
+_textmus_
+_footer_
+}
Index: /main/tags/2.38/gsdl/macros/style.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/style.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/style.dm	(revision 21083)
@@ -0,0 +1,151 @@
+#######################################################################
+# PAGE STYLES 
+#######################################################################
+
+package Style
+
+# to use this style system output
+# _header_
+# all your page content, then
+# _footer_
+
+# use the page parameter 'style' to choose the appropriate style
+
+# the style system uses
+# _pagetitle_  - what gets displayed at the top of the browser window
+# _pagescriptextra_ - any extra javascript you want included in the header
+# _pagebannerextra_ - anything extra you want displayed in the page banner
+# _pagefooterextra_ - anything extra you want displayed in the footer
+
+# defaults for the above macros
+_pagetitle_ {_collectionname_}
+_pagescriptextra_ {}
+_pagebannerextra_ {}
+_pagefooterextra_ {}
+
+# it also relies on lots of Globals, the most important of these are:
+# _cookie_ - put in the cgi header
+# _globalscripts_ - javascript stuff
+# _httpiconchalk_ - the image down the left of the page
+# _imagecollection_
+# _imagehome_
+# _imagehelp_
+# _imagepref_
+# _imagethispage_
+# _linkotherversion_
+
+_header_ {_cgihead_
+_htmlhead_(background="_httpiconchalk_")_startspacer__pagebanner_
+}
+
+_header_[v=1] {_cgihead_
+_htmlhead__pagebanner_
+}
+
+# _cgihead_ {Content-type: text/html
+# _cookie_
+#
+# }	
+_cgihead_{}
+
+# htmlhead uses:
+# _1_ - extra parameters for the body tag
+# _pagetitle_
+# _globalscripts_
+_htmlhead_ {
+<html_htmlextra_>
+<head>
+<title>_pagetitle_</title>
+_globalscripts_
+</head>
+
+<body bgcolor="\#ffffff" text="\#000000" link="\#006666" 
+      alink="\#cc9900" vlink="\#666633"_1_>
+}
+
+
+# _startspacer_ is a spacer to get past the 10010 graphic. It contains an open
+# <table> tag which must eventually be closed by _endspacer_.
+_startspacer_ {
+<table border=0 cellspacing=0 cellpadding=0 width="100%">
+<tr><td valign=top width=65><img src="_httpimg_/spacer.gif" width="65" height="1" alt="" border="0"></td>
+<td><center><table width="_pagewidth_"><tr><td>
+}
+
+
+# pagebanner uses :
+# _imagecollection_ 
+# _imagehome_
+# _imagehelp_
+# _imagepref_
+# _imagethispage_
+# _pagebannerextra_
+_pagebanner_ {
+<!-- page banner (\_style:pagebanner\_) -->
+<center>
+<table width=_pagewidth_ cellspacing=0 cellpadding=0>
+  <tr valign=top>
+    <td rowspan=2 align=left>_imagecollection_</td>
+    <td align=right>_javalinks_</td>
+  </tr>
+
+  <tr>
+    <td align=right>_imagethispage_</td>
+  </tr>
+
+  <tr>
+    <td colspan=2>_pagebannerextra_</td>
+  </tr>
+</table>
+</center>
+<!-- end of page banner -->
+}
+
+_pagebanner_[v=1] {
+<!-- page banner - text version [v=1] (\_style:pagebanner\_) -->
+<center><h2><b><u>_imagecollection_</u></b></h2></center><p>
+_javalinks_
+_pagebannerextra_
+<p>
+<!-- end of page banner -->
+}
+
+_footer_ {
+<!-- page footer (\_style:footer\_) -->
+_pagefooterextra_
+</table>
+_endspacer__htmlfooter_
+}
+
+_endspacer_ {</center>
+</td></tr></table>
+}
+
+_htmlfooter_ {
+</body>
+</html>
+}
+
+_globalscripts_{
+<script>
+<!--
+_imagescript_
+_pagescriptextra_
+// -->
+</script>
+}
+
+_globalscripts_ [v=1] {
+<script>
+<!--
+_If_(_cgiargx_,_scriptdetach_)
+_pagescriptextra_
+// -->
+</script>
+}
+
+_scriptdetach_ {
+    function close\_detach() \{
+	close();
+    \}
+}
Index: /main/tags/2.38/gsdl/macros/tip.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/tip.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/tip.dm	(revision 21083)
@@ -0,0 +1,147 @@
+package tip
+
+#######################################################################
+# Tips
+# if you want a random tip to appear, use the macro name _tip:thistip_
+#######################################################################
+
+_tipstart_ {<center>}
+_tipquotestart_ {<b>}
+_tipquoteend_ {</b> }
+_tipattributionstart_ {<em>}
+_tipattributionend_ {</em>}
+_tipend_ {</center>}
+
+_tip1_ {
+       _tipstart_
+       _tipquotestart_
+       A word after a word after a word is power.
+       _tipquoteend_
+       _tipattributionstart_
+       Margaret Atwood
+       _tipattributionend_
+       _tipend_
+       _tipend_
+}
+
+_tip2_ {
+       _tipstart_
+       _tipquotestart_ Books are weapons in the war of ideas
+       _tipquoteend_
+       _tipattributionstart_ American Library Association, 1942
+       _tipattributionend_
+       _tipend_
+}
+
+_tip3_ {
+       _tipstart_
+       _tipquotestart_ Only the educated are free
+       _tipquoteend_
+       _tipattributionstart_ Epictetus
+       _tipattributionend_
+       _tipend_
+}
+
+_tip4_ {
+       _tipstart_
+       _tipquotestart_ We need our libraries open to all, so we can prepare our students for the 21st Century.
+       _tipquoteend_
+       _tipattributionstart_ Martin Luther King, quoted in the program at ALA midwinter, "Celebrating
+Equity and Empowerment," on Martin Luther King Day.
+       _tipattributionend_
+       _tipend_
+}
+
+_tip5_ {
+       _tipstart_
+       _tipquotestart_
+       Congress shall make no law abridging the freedom of sXXXch, or the right of the people peaceably to XXXemble, and to peXXXion the government for a redress of grievances.
+       _tipquoteend_
+       _tipattributionstart_
+The first amendment according to XStop (according to Marc Rotenberg, Electronic Privacy Information Center)
+       _tipattributionend_
+       _tipend_
+}
+_tip6_ {
+       _tipstart_
+       _tipquotestart_
+       My Alma mater was books, a good library . . . I could spend the rest of my life reading, just satisfying my curiosity.
+       _tipquoteend_
+       _tipattributionstart_
+       Malcolm X, Autobiograhy of Malcolm X
+       _tipattributionend_
+       _tipend_
+}
+_tip7_ {
+       _tipstart_
+       _tipquotestart_
+       To be literate is to possess the cow of plenty.
+       _tipquoteend_
+       _tipattributionstart_
+       Motto of the Madras Library Association
+       _tipattributionend_
+       _tipend_
+}
+
+_tip8_ {
+       _tipstart_
+       _tipquotestart_
+       It does not matter how many books you may have, but whether they are good or not.
+       _tipquoteend_
+       _tipattributionstart_
+       Seneca
+       _tipattributionend_
+       _tipend_
+}
+
+_tip9_ {
+       _tipstart_
+       _tipquotestart_
+       I have always imagined that Paradise will be a kind of library.
+       _tipquoteend_
+       _tipattributionstart_
+Jorge Luis Borges (1899-1986)
+       _tipattributionend_
+       _tipend_
+}
+
+_tip10_ {
+       _tipstart_
+       _tipquotestart_
+       When an old man dies, a library burns down.
+       _tipquoteend_
+       _tipattributionstart_
+       African Proverb
+       _tipattributionend_
+       _tipend_
+}
+
+_tip11_ {
+       _tipstart_
+       _tipquotestart_
+       My library / Was dukedom large enough. 
+       _tipquoteend_
+       _tipattributionstart_
+       William Shakespeare. The Tempest.
+       _tipattributionend_
+       _tipend_
+}
+
+_tip12_ {
+       _tipstart_
+       _tipquotestart_
+      Knowing I lov'd my books, he furnish'd me /
+      From mine own library with volumes that /
+      I prize above my dukedom. /
+       _tipquoteend_
+       _tipattributionstart_
+       William Shakespeare. The Tempest.
+       _tipattributionend_
+       _tipend_
+}
+
+
+_tip:tipmax_ {12}
+
+
+
Index: /main/tags/2.38/gsdl/macros/users.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/users.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/users.dm	(revision 21083)
@@ -0,0 +1,194 @@
+package userslistusers
+
+_header_ {
+<html>
+<head>
+<title>_textlocu_</title>
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#006666"
+      alink="#cc9900" vlink="#666633">
+}
+
+_content_ {}
+
+_contentstart_ {
+<h2>_textlocu_</h2>
+
+
+<table border=0 cellspacing=1 cellpadding=3 width=100%>
+<tr>
+  <th bgcolor="\#d0d0d0">_textuser_</th>
+  <th bgcolor="\#d0d0d0">_textas_</th>
+  <th bgcolor="\#d0d0d0">_textgroups_</th>
+  <th bgcolor="\#d0d0d0">_textcomment_</th>
+  <th>&nbsp;</th>
+</tr>
+}
+
+_contentend_ {
+</table>
+}
+
+_footer_ {
+</body>
+</html>
+}
+
+
+
+package usersedituser
+
+_header_ {
+<html>
+<head>
+<title>_If_("_cgiarguma_" eq "edituser",_textedituser_,_textadduser_)</title>
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#006666"
+      alink="#cc9900" vlink="#666633">
+}
+
+_content_ {
+<h2>_If_("_cgiarguma_" eq "edituser",_textedituser_,_textadduser_)</h2>
+
+
+_users:messagestatus_
+
+<form name="edituser" method="post" action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="a" value="um">
+<input type=hidden name="uma" value="_cgiarguma_">
+
+<table border=0>
+<tr><td>_authen:textusername_</td><td><input type="text" name="umun" value="_users:usersargun_" size=15></td>
+<td><font color=gray>_textaboutusername_</font></td>
+</tr>
+<tr><td>_authen:textpassword_</td><td><input type="text" name="umpw" value="_users:usersargpw_" size=9></td>
+<td><font color=gray>_textaboutpassword_
+_If_("_cgiarguma_" eq "edituser",_textoldpass_)
+</font></td></tr>
+<tr><td>_userslistusers:textas_</td><td>
+<select name="umus">
+<option value="enabled">_textenabled_
+<option value="disabled"_If_("_users:usersargus_" ne "enabled", selected)>_textdisabled_
+</select>
+</td></tr>
+<tr><td>_userslistusers:textgroups_</td><td><input type="text" name="umug" value="_users:usersargug_" size=15></td>
+<td><font color=gray>_textaboutgroups_</font></td></tr>
+<tr><td>_userslistusers:textcomment_</td><td colspan=2><input type="text" name="umc" value="_users:usersargc_" size=50></td></tr>
+<tr><td></td><td colspan=2><input type="submit" name=beu value="submit">
+<input type="submit" name=uma value="cancel"></td></tr>
+</table>
+</form>
+}
+
+_footer_ {
+</body>
+</html>
+}
+
+
+
+
+package usersdeleteuser
+
+_header_ {
+<html>
+<head>
+<title>_textdeleteuser_</title>
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#006666"
+      alink="#cc9900" vlink="#666633">
+}
+
+_content_ {
+
+<p>
+<table border=0>
+<tr><td>
+<form name="deleteuser" method="post" action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="a" value="um">
+<input type=hidden name="uma" value="_cgiarguma_">
+<input type=hidden name="umun" value="_cgiargumun_">
+<font color=red>_textremwarn_</font>
+<input type="submit" name=cm value="no">
+<input type="submit" name=cm value="yes">
+</form>
+</td></tr>
+</table>
+}
+
+_footer_ {
+</body>
+</html>
+}
+
+
+
+package userschangepasswd
+
+_header_ {
+<html>
+<head>
+<title>_textchangepw_</title>
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#006666"
+      alink="#cc9900" vlink="#666633">
+}
+
+_content_ {
+<h2>_textchangepw_</h2>
+<p><font color=gray>_usersedituser:textaboutpassword_</font>
+
+<p>_users:messagestatus_
+
+<p>
+<form name="changepasswd" method="post" action="_gwcgi_">
+<input type=hidden name="e" value="_decodedcompressedoptions_">
+<input type=hidden name="a" value="um">
+<input type=hidden name="uma" value="_cgiarguma_">
+<table border=0>
+<tr><td align=right>_textoldpw_</td><td><input type="password" name="umpw" size=9></td></tr>
+<tr><td align=right>_textnewpw_</td><td><input type="password" name="umnpw1" size=9></td></tr>
+<tr><td align=right>_textretype_</td><td><input type="password" name="umnpw2" size=9></td></tr>
+<tr><td></td><td><input type="submit" name=bcp value="submit"></td></tr>
+</table>
+</table>
+</form>
+
+}
+
+
+package userschangepasswdok
+
+_header_ {
+<html>
+<head>
+<title>_userschangepasswd:textchangepw_</title>
+</head>
+<body bgcolor="#ffffff" text="#000000" link="#006666"
+      alink="#cc9900" vlink="#666633">
+}
+
+_content_ {
+<h2>_userschangepasswd:textchangepw_</h2>
+
+<p>_textsuccess_
+}
+
+
+
+package users
+
+_messageinvalidusername_ {<font color=red>_textinvalidusername_</font>}
+_messageinvalidpassword_ {<font color=red>_textinvalidpassword_</font>}
+_messageemptypassword_ {<font color=red>_textemptypassword_</font>}
+_messageuserexists_ {<font color=red>_textuserexists_</font>}
+
+_messageusernameempty_ {<font color=red>_textusernameempty_</font>}
+_messagepasswordempty_ {<font color=red>_textpasswordempty_</font>}
+_messagenewpass1empty_ {<font color=red>_textnewpass1empty_</font>}
+_messagenewpass2empty_ {_messagenewpass1empty_}
+_messagenewpassmismatch_ {<font color=red>_textnewpassmismatch_</font>}
+_messagenewinvalidpassword_ {<font color=red>_textnewinvalidpassword_</font>}
+_messagefailed_ {<font color=red>_textfailed_</font>}
Index: /main/tags/2.38/gsdl/macros/yourhome.dm
===================================================================
--- /main/tags/2.38/gsdl/macros/yourhome.dm	(revision 21083)
+++ /main/tags/2.38/gsdl/macros/yourhome.dm	(revision 21083)
@@ -0,0 +1,38 @@
+package home
+_content_ {
+
+<h2>Your own Greenstone home page</h2>
+
+<ul>
+<table>
+<tr valign=top><td>Search page for the demo collection<br></td>
+    <td><a href="_httpquery_&c=demo">Click here</a></td></tr>
+
+<tr><td>"About" page for the demo collection</td>
+    <td><a href="_httppageabout_&c=demo">Click here</a></td></tr>
+
+<tr><td>Preferences page for the demo collection</td>
+    <td><a href="_httppagepref_&c=demo">Click here</a></td></tr>
+
+<tr><td>Home page</td>
+    <td><a href="_httppagehome_">Click here</a></td></tr>
+
+<tr><td>Help page</td>
+    <td><a href="_httppagehelp_">Click here</a></td></tr>
+
+<tr><td>Administration page</td>
+    <td><a href="_httppagestatus_">Click here</a></td></tr>
+
+<tr><td>The Collector</td>
+    <td><a href="_httppagecollector_">Click here</a></td></tr>
+
+</table>
+</ul>
+
+}
+
+# if you hate the squirly green bar down the left-hand side of the page,
+# uncomment these lines:
+
+# _header_ { 
+#          }
Index: /main/tags/2.38/gsdl/mappings/README
===================================================================
--- /main/tags/2.38/gsdl/mappings/README	(revision 21083)
+++ /main/tags/2.38/gsdl/mappings/README	(revision 21083)
@@ -0,0 +1,22 @@
+This directory and its subdirectories contain .ump mapping files for
+converting various character encodings to and from unicode.
+
+To generate .ump files use a command like "makemapfile.pl -encoding
+encodingname -mapfile textmapfile" where encodingname becomes the filename
+of the two new .ump files and textmapfile is a plain text file containing a
+tab separated list of the form:
+0x8167	      0x201C
+where the first column is the hexadecimal value of the encoded character
+and the second is the hexadecimal value of it's unicode equivalent.
+
+
+
+The following .ump files were generated from their corresponding Microsoft
+codepages. These codepages do, in some cases, differ very slightly from the
+standards they were based on but we've used them anyway as they're so
+extensively used on the web.
+
+* gbk.ump: Simplified Chinese - generated from Microsoft's codepage 936
+* shiftjis.ump: Japanese - generated from Microsoft's codepage 932
+* uhc.ump: UHC Korean - generated from Microsoft's codepage 949
+* big5.ump: Traditional Chinese - generated from Microsoft's codepage 950
Index: /main/tags/2.38/gsdl/micotest.cpp
===================================================================
--- /main/tags/2.38/gsdl/micotest.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/micotest.cpp	(revision 21083)
@@ -0,0 +1,11 @@
+#include <iostream.h>
+#include <stdlib.h>
+#include <mico/version.h>
+
+char version[] = MICO_VERSION;
+
+int main()
+{
+  cout << version;
+  exit(0);
+}
Index: /main/tags/2.38/gsdl/packages/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/Makefile.in	(revision 21083)
@@ -0,0 +1,88 @@
+###########################################################################
+#
+# Makefile -- Makefile for packages included with Greenstone
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+# PACKAGEDIRS contains the packages that we want to make and install.  It
+# is assumed that each package will have at least four rules: all, install,
+# clean, and distclean.
+USE_Z3950=@USE_Z3950@
+ifeq ($(USE_Z3950), 1)
+YAZ=yaz
+else
+YAZ=
+endif
+
+USE_CORBA=@USE_CORBA@
+MICO_DIR=@MICO_DIR@
+ifeq ($(USE_CORBA), 1)
+ifeq ($(MICO_DIR), default)
+CORBA="mico/mico"
+else
+CORBA=
+endif
+else
+CORBA=
+endif
+
+PACKAGEDIRS =	wv/wv-gs rtftohtml/rtftohtml_src pdftohtml/pdftohtml_0_22 \
+		wget/wget-1.5.3 cpan/XML-Parser-2.27 $(YAZ) $(CORBA) \
+		xlhtml/xlhtml-0.4.9.0
+
+all:
+	for odir in $(PACKAGEDIRS); do \
+          echo making $@ in $$odir; \
+          (cd $$odir && $(MAKE) $(MDEFINES) $@) || exit 1; \
+        done
+ifeq ($(CORBA), "mico/mico")
+	cd mico/mico; $(MAKE)  $(MDEFINES) install
+	mkdir -p ../bin/linux
+	mkdir -p ../lib
+	mkdir -p ../include
+	mkdir -p ../man
+	cp -f mico/bin/* ../bin/linux
+	cp -f mico/lib/* ../lib/
+	cp -fr mico/include/* ../include
+	cp -fr mico/man ../man
+endif
+
+
+install:
+	for idir in $(PACKAGEDIRS); do \
+          echo installing $$idir; \
+          (cd $$idir && $(MAKE) install) || exit 1; \
+        done
+
+clean:
+	for subdir in $(PACKAGEDIRS); do \
+          echo cleaning $@ in $$subdir; \
+          (cd $$subdir && $(MAKE) clean || exit 0) ; \
+        done
+
+distclean:
+	for subdir in $(PACKAGEDIRS); do \
+          echo cleaning $@ in $$subdir; \
+          (cd $$subdir && $(MAKE) distclean || exit 0) ; \
+        done
Index: /main/tags/2.38/gsdl/packages/configure
===================================================================
--- /main/tags/2.38/gsdl/packages/configure	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/configure	(revision 21083)
@@ -0,0 +1,203 @@
+#! /bin/sh
+
+PACKAGES=`pwd`
+cd ..
+GSDLHOME=`pwd`
+cd $PACKAGES
+
+GSDLOS=`uname -s |tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+# check for running bash under cygwin
+if test "`echo $GSDLOS | sed 's/cygwin//'`" != "$GSDLOS" ;
+then
+ GSDLOS=windows
+fi
+
+prefix=""
+bindir=""
+HOSTTARGETFLAGS=""
+
+USE_CORBA=false
+MICO_DIR=default
+
+# parse any arguments given from toplevel configure
+while test $# -ne 0; do
+    case "$1" in
+	--cache-file=*)
+	    cache_filename=`echo $1 | sed s/--cache-file=//`
+	    # turn relative path into an absolute path
+	    cache_dir=`echo $cache_filename | sed 's@/[^/]*$@@'`
+	    cache_dir=`cd $cache_dir 2>/dev/null && pwd`
+
+	    cache_basefile=`echo $cache_filename | sed 's@.*/@@'`
+	    cache_file="$cache_dir/$cache_basefile"
+	    if test ! -f "$cache_file"; then
+		CACHE_FILE=""
+	    else
+		CACHE_FILE="--cache-file=$cache_file"
+	    fi
+	    ;;
+	--enable-z3950)
+	    USE_Z3950=true
+	    ;;
+	--enable-corba)
+	    USE_CORBA=true
+	    ;;
+	--with-micodir=*)
+	    if test $1 = ""; then
+	      $1 = "default"
+            fi
+	    MICO_DIR=$1
+	    ;;       
+	--prefix=*)
+	    prefix=`echo $1 | sed s/--prefix=//`
+	    ;;
+	--bindir=*)
+	    # where to install binaries to
+	    bindir=`echo $1 | sed s/--bindir=//`
+	    # turn relative path into an absolute path
+	    if test -d "$bindir" ; then
+	      bindir=`cd "$bindir" ; pwd `
+	      cd "$PACKAGES"
+	    elif test -z `echo $bindir | sed '/^\// p;D'` ; then
+	      rel_bindir="`echo $bindir | sed s@/.*@@`"
+	      cd "$rel_bindir"
+	      bindir="`pwd`/`echo $bindir | sed s@^[^/]*/@@`"
+	      cd "$PACKAGES"
+	    else
+	      # bindir doesn't exist, and isn't relative
+	      true
+	    fi
+	    ;;
+	--host=* | --target=*)
+	    HOSTTARGETFLAGS="$HOSTTARGETFLAGS $1"
+	    ;;
+	*)
+	    # ignore all other options for now
+	    ;;
+    esac
+    shift
+done
+
+# note! Our GSDL package currently always installs into it's source
+# directory, ignoring any --prefix given to configure.
+# When this is fixed, uncomment the relevant lines below...
+
+##if test -z "$prefix" ; then
+prefix="${GSDLHOME}"
+##fi
+
+##if test -z "$bindir" ; then
+bindir="${prefix}/bin/$GSDLOS"
+##fi
+
+# This loads the top configure's cache file, with variables already set.
+if test -f "$cache_file" ; then
+  . $cache_file
+fi
+
+# we assume that gzip and tar are on the search path.
+# non-GNU versions of tar don't take the -z option.
+
+if test $USE_CORBA = true ; then
+  if test $MICO_DIR = default; then
+    # configure the MICO CORBA ORB
+    echo ""
+    echo "Configuring MICO CORBA"
+    echo ""
+
+    cd "$PACKAGES/mico"
+    gzip -dc mico-2.3.5.tar.gz | tar -xf -
+    cd mico
+    ./configure $CACHE_FILE    --prefix=$PACKAGES/mico/  --disable-coss --disable-naming --disable-relship --disable-events --disable-streams --disable-property --disable-trader --disable-time --disable-debug --enable-optimize --enable-final --enable-speed-tune
+    sed 's/tools//'  $PACKAGES/mico/mico/Makefile | sed 's/ldconfig//' >$PACKAGES/mico/mico/Makefile.out
+    mv $PACKAGES/mico/mico/Makefile.out $PACKAGES/mico/mico/Makefile
+  else
+    #MICO is on the system path
+    echo ""
+    echo "Taking MICO from system paths"
+    echo ""
+  fi
+else
+  echo "corba support disabled - mico compiler not required."
+  echo "  add '--enable-corba' to the configure command to include corba support."
+  echo ""
+fi
+
+
+
+
+
+# configure the wvWare Word document converter
+echo ""
+echo "Configuring wvWare"
+echo ""
+
+cd "$PACKAGES/wv"
+gzip -dc wv-0.7.1-gs.tar.gz | tar -xf -
+cd wv-gs
+# datadir is for default location of wvHtml.xml config file
+./configure $CACHE_FILE --prefix=$PACKAGES/wv --bindir="$bindir" --datadir="$prefix/etc/packages" $HOSTTARGETFLAGS
+
+# configure the pdftohtml converter
+echo ""
+echo "Configuring pdftohtml"
+echo ""
+
+cd "$PACKAGES/pdftohtml"
+gzip -dc pdftohtml_gs.tar.gz | tar -xf -
+cd pdftohtml_0_22
+./configure $CACHE_FILE --prefix="$prefix" --bindir="$bindir" $HOSTTARGETFLAGS
+
+# rtftohtml converter
+echo ""
+echo "Configuring rtftohtml"
+echo ""
+
+cd "$PACKAGES/rtftohtml"
+gzip -dc rtftohtml-gs.tar.gz | tar -xf -
+cd rtftohtml_src
+./configure $CACHE_FILE --prefix="$prefix" --bindir="$bindir" $HOSTTARGETFLAGS
+
+
+# YAZ Z39.50 toolkit
+echo ""
+echo "Configuring YAZ"
+if test x$USE_Z3950 = xtrue ; 
+then
+  echo ""
+  cd "$PACKAGES/yaz"
+  ./configure $CACHE_FILE $HOSTTARGETFLAGS
+else
+  echo "Z39.50 support disabled - YAZ library not required."
+  echo "  add '--enable-z3950' to the configure command to include z39.50 support."
+  echo ""
+fi
+
+# configure wget
+echo ""
+echo "Configuring wget"
+echo ""
+cd "$PACKAGES/wget"
+gzip -dc wget.tar.gz | tar -xf -
+cd "$PACKAGES/wget/wget-1.5.3"
+./configure $CACHE_FILE --prefix=$PACKAGES/wget --bindir="$bindir" $HOSTTARGETFLAGS
+
+# configure XML::Parser perl module
+echo ""
+echo "Configuring XML::Parser"
+echo ""
+cd "$PACKAGES/cpan"
+gzip -dc XML-Parser-2.27.tar.gz | tar -xf -
+cd "$PACKAGES/cpan/XML-Parser-2.27"
+perl Makefile.PL "$GSDLHOME"
+
+
+# configure powerpoint converter
+echo ""
+echo "Configuring xlhtml (powerpoint & excel converter)"
+echo ""
+cd "$PACKAGES/xlhtml"
+gzip -dc xlhtml-0.4.9.0-gs.tar.gz | tar -xf -
+cd xlhtml-0.4.9.0
+./configure $CACHE_FILE --prefix="$prefix" --bindir="$bindir" $HOSTTARGETFLAGS
+
Index: /main/tags/2.38/gsdl/packages/cpan/README
===================================================================
--- /main/tags/2.38/gsdl/packages/cpan/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/cpan/README	(revision 21083)
@@ -0,0 +1,20 @@
+This directory contains perl modules from cpan for use with the Greenstone
+collection building code. After a "make install" these modules will be
+installed to the gsdl/perllib/cpan directory.
+
+Note that pure perl modules (i.e. those not containing any C code to
+compile) don't need building so they don't live in the packages directory
+tree (they live in perllib/cpan).
+
+
+The following modules are currently included:
+
+
+XML::Parser: Copyright (c) 1998-2000 Larry Wall and Clark Cooper
+
+- Version 2.27 - as downloaded from cpan.org but with a few files removed
+  (to minimize the size of the tarball we distribute) and minor Greenstone
+  specific modifications to Makefile.PL. Originally used version 2.29 but
+  it appeared to be incompatible with perl 5.6.1.
+
+
Index: /main/tags/2.38/gsdl/packages/mg/COPYING
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/COPYING	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/COPYING	(revision 21083)
@@ -0,0 +1,344 @@
+		    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
+
+
+	    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.
Index: /main/tags/2.38/gsdl/packages/mg/INSTALL
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/INSTALL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/INSTALL	(revision 21083)
@@ -0,0 +1,176 @@
+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.
+
+   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.
+
+`--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.
+
Index: /main/tags/2.38/gsdl/packages/mg/INSTALL.mg
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/INSTALL.mg	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/INSTALL.mg	(revision 21083)
@@ -0,0 +1,38 @@
+                     BUILDING AND INSTALLATION OF MG
+                     ===============================
+ 
+This file explains how to build the mg system.
+ 
+(1) Follow the general GNU install instructions in the INSTALL file.
+    NOTE: this procedure has changed from version mg-1.1 which did
+    not use a GNU configure script.
+    e.g.
+      cd ~/mg-1.2
+      ./configure --prefix=`pwd`
+      make
+      make check
+      make install
+    Report portability problems to tes@kbs.citri.edu.au .
+ 
+(2) You will need to set the environment variable MGDATA which 
+    indicates where the mg data files will be created. You will also
+    need to create the directory you specify.
+ 
+    e.g.
+        setenv MGDATA ~/mgdata
+	mkdir ~/mgdata
+
+(4) You may also need to set the environment variable MGSAMPLE which
+    is used by mg_get and indicates where the sample data included
+    with this package is located.
+    If this is not specified it defaults to ``./SampleData''
+
+(4) Included with mg is an X11 interface to mgquery called xmg. 
+    Xmg is a ``wish'' script which uses the Tcl/Tk packages available
+    by anonymous ftp from allspice.berkeley.edu [128.32.150.27].
+ 
+(5) Another environment variable that you may wish to set is
+    MGIMAGEVIEWER, this variable sets the image viewer to be used
+    to display images. The image viewer must take the image from stdin.
+    If this is not specified it defaults to ``xv -''.
+ 
Index: /main/tags/2.38/gsdl/packages/mg/MODIFICATIONS
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/MODIFICATIONS	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/MODIFICATIONS	(revision 21083)
@@ -0,0 +1,1023 @@
+TITLE
+  Parsing of Long Words
+APPLICATION
+ mg-1, mg-2
+TYPE
+  bug
+REPORT
+  tim@cosc.canterbury.ac.nz - May 11th 1994
+FIX
+  tes@kbs.citri.edu.au - August 9th 1994
+CLAIM
+  Mg didn't handle long words properly; it crashed.
+PROBLEM
+  Invf passes calls PARSE_LONG_WORD [words.h] which uses a limit of
+  MAXLONGWORD on iterating thru the string and storing into 
+  a word. MAXLONGWORD = 8192.
+  However, mg strings generally store the length in the first
+  byte limiting them to 255 characters. The word which was passed
+  to PARSE_LONG_WORD was an allocated string of MAXSTEMLEN = 255,
+  which is as large as we should get anyway. Thus when accessing
+  a larger word than 255 chars, PARSE_LONG_WORD would allow it
+  (less than 8192) and would try storing beyond the array limit.
+SOLUTION
+  The author can't remember why PARSE_LONG_WORD was used and what
+  the significance of MAXLONGWORD = 8192 is.
+  So PARSE_LONG_WORD has been changed to PARSE_STEM_WORD which
+  uses MAXSTEMLEN as its limit.
+FILES
+ *   words.h
+ *   invf.pass1.c
+ *   invf.pass2.c
+ *   ivf.pass1.c
+ *   ivf.pass2.c
+ *   query.ranked.c
+*************************************************************
+TITLE
+  Use of Lovins stemmer
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  local - 1994
+FIX
+  linh@kbs.citri.edu.au - 1994
+CLAIM
+  Stemming was done naively.
+PROBLEM
+  Only a few types of words and their endings
+  were considered.
+SOLUTION
+  Replacement with a more elaborate "known" stemmer by Lovins.
+  The algorithm is described in:
+    J.B. Lovins, "Development of a Stemming Algorithm",
+    Mechanical Translation and Computational Linguistics, Vol 11,1968.
+FILES
+ *   stem.c
+ *   stem.h
+*************************************************************
+TITLE
+  Different term parsing
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - 23 Aug 1994
+FIX
+  tes@kbs.citri.edu.au - 23 Aug 1994
+CLAIM
+  Boolean queries did not extract words/terms using the
+  same method as is done at inverted-file creation and
+  as is used for rank query parsing.
+PROBLEM
+  The hand-written lex. analyser, query_lex, which is called by
+  the boolean query parser was not calling a common
+  word-extraction routine as used by the rest of mg. 
+  This would be ok if the code did the same things - but they didn't.
+  Query_lex, for instance, did NOT place any limit on the
+  number of digits in a term.
+  Of even more concern, it would allow arbitrary sized words
+  although it used Pascal style strings which store the length
+  in the first byte and can therefore only be 255 characters in length.
+SOLUTION
+  Query_lex in "query.bool.y", was modified to call the routine
+  PARSE_STEM_WORD which is also used by text-inversion routines and
+  ranking query routines.
+  Now all terms are extracted by the same routine.
+  To do this, the end of the line buffer had to be noted as
+  PARSE_STEM_WORD requires a pointer to the end - which is the
+  safe thing to do (don't want to run over the end).
+  This meant I had to find the length of the query line buffer.
+  This was allocated in the file "read_line.c" by the routine,
+  "readline". Its size was the literal number 1024. 
+  This was changed to a constant and placed in "read_line.h".
+  The definition for PARSE_STEM_WORD can be found in "words.h".
+FILES
+ *   query.bool.y
+ *   query.bool.c (by bison)
+ *   read_line.c
+ *   read_line.h
+*************************************************************
+TITLE
+  Highlighting of query terms
+APPLICATION
+  mg-1
+TYPE
+  extend
+REPORT
+  tes@kbs.citri.edu.au - Aug 94
+FIX
+  tes@kbs.citri.edu.au - Sep 94
+CLAIM
+  Difficult to feel happy that the query-result returned is
+  satisfying the query - need to look hard to find the queried words.
+  Need to show words in results using some highlighting method.
+PROBLEM
+  No highlighting of query terms in results.
+SOLUTION
+  Mgquery was previously outputting the decompressed text to a pager
+  such as "less(1)" or "more(1)".
+  (Except when redirected or piped elsewhere :)
+  So what was needed was some sort of highlight pager that instead of
+  displaying the text would also use some means for highlighting the
+  stemmed query words. 
+  Two common forms of highlighting were chosen: underline and bolding.
+  These are supported by "less(1)" and possibly by "more(1)" by
+  using the backspace character.
+  A highlight pager will also need to know which words need to be
+  highlighted. Therefore, the code was modified to build up a
+  string of the stemmed query words for passing to the highlight pager.
+  Design Options:
+  ---------------
+    * Could do text filtering in mgquery before passing out to pager.
+      Instead I pipe to a separate process, the "hilite_words" pager,
+      which filters and pipes into less/more.
+    * Could do different highlighting or a combination.
+    * Could use a different structure for storing the query words other
+      than the hash-table I used.
+FILES
+ *   Makefile - to include hilite_words target
+ *   mg_hilite_words.c
+ *   mgquery.c
+ *   mgquery.1
+ *   query.bool.y
+ *   query.ranked.c
+ *   environment.c
+ *   environment.h
+ *   backend.h
+*************************************************************
+TITLE
+  Mg_compression_dict did premature free
+APPLICATION
+  mg-1
+TYPE
+  bug 
+REPORT
+  R.Sosic@cit.gu.edu.au - 23 Sep 94
+FIX
+  R.Sosic@cit.gu.edu.au - 23 Sep 94
+CLAIM
+  mg_compression_dict dumped core in 
+	file: mg_compression_dict.c
+	function: Write_data
+	line: int codelen = hd->clens[i];
+PROBLEM
+  Huffman data, hd, was freed *before* it was accessed again. 
+SOLUTION
+  The freeing of hd has been moved to after all accesses
+  (just before returning).
+FILES
+ *   mg_compression_dict.c
+*************************************************************
+TITLE
+  Boolean tree optimising rewrite
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  sosic@kurango.cit.gu.edu.au - 23 Sep 94
+FIX
+  tes@kbs.citri.edu.au - Oct 94
+CLAIM
+  "I am still getting core dump in "and" queries in mgquery, 
+   where the first word does not exist, but the second one does."
+PROBLEM
+  Having freed a particular node, it tried to refree it and 
+  access one of its fields.
+
+  I.e. code-fragment...
+
+       FreeNode(curr); /* where curr = CHILD(base) for 1st term in list */
+       FreeNodes(next);
+       FreeNodes(CHILD(base)); 
+              /* but CHILD(base) has already been freed above */
+              /* if the node was the first one in the list */
+
+SOLUTION
+  A number of things in the code seemed a bit dubious to me.
+  So I have rewritten the boolean optimising stage and abstracted out
+  the various stages - each file starts with "bool".
+  Boolean query optimising seems to be a tricky problem. 
+  It is not clear that putting an expression into a certain form will
+  actually simplify it and whether simplification means faster querying.
+  I have converted a given boolean expression into DNF 
+  (Disjunctive Normal Form).  "And not" nodes, which are readily apparent 
+  in DNF, are converted to "diff" nodes.  I have only applied the idempotency 
+  laws involving TRUE and FALSE, and not the ones requiring matching of 
+  expressions - it is a potentially more complicated problem.
+  The optimiser has been tested by playing with "bool_tester", and if you are
+  having a crash or problem in a boolean query it would be worth testing the
+  query on the "bool_tester." The token "*" stands for TRUE (or all documents) 
+  and the token "_" stands for FALSE (or no documents). This should show the 
+  expression before and after optimisation in an ascii tree bracketting format.
+FILES
+ *   bool_tree.c
+ *   bool_parser.y
+ *   bool_optimiser.c
+ *   bool_query.c 
+ *   bool_tester.c
+ *   term_lists.c
+*************************************************************
+TITLE
+  Mgtic pixel placement
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  Bruce McKenzie - bruce@cosc.canterbury.ac.nz (21st Oct 1994)
+FIX
+  singlis@cs.waikato.ac.nz
+CLAIM
+  mgtic crashed on certain files.
+PROBLEM
+  Placing pixels outside of bitmap.
+SOLUTION
+  Changed the putpixel routine to truncate at borders of the image.
+FILES
+ *   mgtic.c
+*************************************************************
+TITLE
+  Improved boolean tree optimising
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  tes@kbs.citri.edu.au - 12/Dec/94
+FIX
+  tes@kbs.citri.edu.au - 21/Dec/94, 14/Mar/95
+CLAIM
+  Optimising by conversion to DNF is not necessarily such
+  a good idea - can actually slow things down.
+PROBLEM
+  The distributive law used in converting to DNF
+  duplicates expressions.
+SOLUTION
+  Introduce a query environment variable, optimise_type = 0 | 1 | 2.
+  Type 0 does nothing to the parse tree. 
+  Type 2 does the DNF conversion.
+  Type 1 is the new default and does the following...
+    Do simple tree rearrangement like flattening. 
+    Optimise for CNF queries.
+FILES
+ *   bool_query.c, .h
+ *   bool_optimiser.c
+ *   environment.c
+ *   invf_get.c
+ *   bool_tree.c, .h
+ *   bool_tester.c
+ *   lists.h
+*************************************************************
+TITLE
+  Similarity variants
+APPLICATION
+  mg-2
+TYPE
+  extend
+REPORT
+  jz@kbs.citri.edu.au/alistair - June 1994
+FIX
+  tes@kbs.citri.edu.au - July 1994 .. Feb 1995
+CLAIM
+  Can only use one type of similarity measure - the
+  standard cosine measure.
+PROBLEM
+  See CITRI/TR-95-3 for more details.
+  The standard measure can be broken up into 7 components.
+  The 7 components are  
+  Each one of these components has a number of alternatives.
+  The overall measure, S_qd, can also be altered.
+  Thus the particular similarity measure used can be specified
+  by an 8 dimensional vector.
+  What is desired is to be able to specify to mgquery an option
+  and a 8-digit string representing this vector (assuming that
+  any one alternative can have at most 9 (not using zero) variants).
+SOLUTION
+  The programs which had to be modified were:
+  (i) mgquery,
+  (ii) mg_weights_build.
+  The other mg programs in existence store the text, indexing info,
+  and the basic statistics such as N, n, ft, fdt.  
+  Other programs which had to be created were:
+  (i) mg_fmd_build,
+  (ii) mg_wt_build.
+  Mg_fmd_build will create the file to store the f_md statistic, 
+  where f_md is the largest (maximum) f_dt of any term in document, d.
+  Mg_wt_build will create the file to store the w_t primitive.
+  It only creates this for the w_t variants 6-9 which would require
+  extra passes of invf at query time if they were not stored here.
+  For details on similarity changes for mgquery and mg_weights_build,
+  please see the other modification entries.  
+FILES
+ *   mg_fmd_build.c
+ *   mg_wt_build.c
+ *   build_lib.c, build_lib.h
+*************************************************************
+TITLE
+  Similarity variants for mgquery
+APPLICATION
+  mg-2
+TYPE
+  extend
+REPORT
+  jz@kbs.citri.edu.au/alistair - June 1994
+FIX
+  tes@kbs.citri.edu.au - July 1994 .. Feb 1995
+CLAIM
+  "mgquery" needs to be altered to allow modification of
+  the similarity measure. 
+PROBLEM
+  See CITRI/TR-95-3 for more details.
+SOLUTION
+
+  Most of the similarity measures, Sqd, are of the 
+  form:   Aqd
+         -----
+          Bqd
+  where Bqd is an expression involving Wd and possibly Wq,
+  where Aqd is a sum over the common document/query terms
+  of w_qt and w_dt.
+  Building of Aqd
+  ===============
+  The calculation of Aqd is done in the file build_Aqd.c .
+  The functions for doing this used to be in the file invf_get.c .
+  Build_Aqd.c contains 4 different functions for building Aqd, each
+  of them building a different data structure:
+    (i) Array, (ii) Splay Tree, (iii) Hash Table, (iv) List Table.
+  Each of these routines seems to have been construction by modifications
+  to duplicated code. This is often the easiest way to construct variants
+  but is quite difficult to maintain consistency. 
+  As the aim of the exercise was to try out different sim. measures for
+  retrieval effectiveness, I only modified the code that constructed
+  an array. This routine was called "CosineDecode"; I changed it to
+  "build_Aqd_Array." This change reflects the fact that we are only 
+  calculating Aqd and this need not be used for the Cosine measure.
+  The other routines: "CosineDecodeSplay," "CosineDecodeHash," and
+  "CosineDecodeList" have been left unaltered - they need to be updated
+  in the future which would be best be done by abstracting out common code.
+  By the stage of building Aqd, the query terms have been looked up in
+  the inverted file dictionary and put into a list.
+  This list of common terms is traversed to lookup the corresponding
+  invf entries. Before the invf entry is processed, all query and term
+  relevant statistics and primitive quantities are calculated.
+  For example, fqt, ft, wt, rqt, wqt, Wq-partial-sum.
+  To save unnecessary calculations, there is a test for each value
+  to see whether it is needed e.g. "if (sim->variant_needs & NEEDS_wt) ... ".  
+  Aside: Variant Needs
+  --------------------
+  The idea behind the "variant_needs" field is to be able to have all
+  the code in the one place for each possible variant and this code would
+  get the information at the correct time/place only when it is needed.
+  The overhead is a "bit-and" and "test" for each component.
+  The important concern though, is that the "variant_needs" must be
+  accurate i.e. it should be carefully maintained.
+  Each possible need is stored as a bit position in a constant/macro
+  of the form "NEEDS_component" e.g. NEEDS_wt, NEEDS_nt 
+  More recently (Jan/95), I have found that the _need_ing of a component
+  may be relevant to a particular purpose, that is, it may be needed in
+  one situation and not another. This was the case for Wd. 
+  For rdt#6, Wd was needed, however, it might not be needed for Bqd, the
+  denominator of Sqd. So I changed from NEEDS_Wd to NEEDS_Wd_for_Sqd and
+  NEEDS_Wd_for_rdt. 
+  --------------------
+  To handle the different calculations of the variants, I wrote macros
+  based around a switch statement. All these macros are stored in the file
+  "similarity.h" . The point of doing this is to centralise most of the changes
+  and cut down on the number of files which have to be altered if a new
+  way of calculating a primitive is to be added.  
+  This is achieved by having a data record called, "Similarity_variant" whose
+  fields includes all the statistics and the similarity primitives.
+  So the standard procedure is to see if something is needed and if so, then
+  extract it from an mg file or calculate it using a macro - most of the
+  input and output to the macro is done via the "Similarity_variant" structure.
+  As well as calculating Aqd, it is also a convenient place to calculate Wq.
+  Previously, for Cosine measure, Wq was not needed because each Aqd was directly
+  divided by Wq and thus would not change the ordering. However, there are
+  some Sqd's which divide by a sum involving Wq and thus need Wq. 
+  Calculating Sqd and Ordering Documents
+  ====================================== 
+  The file query.ranked.c contains the code for calculating Sqd using the
+  approximate Wd in order to do the ranking of the documents.
+  The mg-1 file was cleaned up and modified slightly.
+  All the heap data structures and routines were taken out and placed in 
+  their own file, heap_weights.c/.h .
+  The major components/steps in the ranking process were abstracted into
+  macros and functions:
+    calc_MaxParas
+    insert_heap_entry
+    insert_greater_heap_entry
+    approx_guided_insert
+    fill_initial_heap
+    add_heap_remainders
+    change_heap_to_exact
+    add_remainder_exact_weights
+    Make_Exact_Root
+    build_doc_list
+  Aside: Zeroing of an Aqd Element
+  -------------------------
+  One interesting change concerned the use of zeroing out an Aqd element
+  so as to mark it as being used in the heap.
+  In the heap, the approx. Sqd is stored based on Aqd/Wd-approx.
+  Later when Aqd is required, it can be extracted from the approx. Sqd
+  by muliplication of Wd-approx i.e. Aqd = Sqd-approx * Wd-approx.
+  This, however, is not always possible for the various Sqd variants.
+  So, instead of zeroing out Aqd, I decided just to make it negative.
+  -------------------------
+  In some Sqd cases, Wd and Wd-approx. are not required. In which case,
+  step 3 which calls on "change_heap_to_exact", "Heap_Build" and
+  "add_remainder_exact_weights" is not required.
+ 
+FILES
+ *    build_Aqd.c
+ *    query.ranked.c
+ *    similarity.c/.h (in libmg)
+ *    heap_weights.c/.h
+ *    backend.c/.h
+*************************************************************
+TITLE
+  Similarity variants for mg_weights_build
+APPLICATION
+  mg-2
+TYPE
+  extend
+REPORT
+  jz@kbs.citri.edu.au/alistair - June 1994
+FIX
+  tes@kbs.citri.edu.au - July 1994 .. Feb 1995
+CLAIM
+  "mg_weights_build" needs to be altered to allow modification of
+  the similarity measure.
+PROBLEM
+  See CITRI/TR-95-3 for more details.
+SOLUTION
+  The weight files which are generated for a particular similarity
+  measure have their names extended by a suffix.
+  In the case of Wd#1 no weights are generated.
+  In the case of the standard cosine weights, Wd#2, a 3 letter suffix
+  is used to represent .
+  In the case of the other Wd variants, a one letter suffix is used
+  to represent which Wd variant it is.
+  In each case, the variant input (e.g. -q 22222222) should be the whole
+  similarity variant string and the relevant fields will be extracted out.
+  This is done for consistency in code and interface. 
+  The code is fairly similar to the original.
+  A dependency check has been added so that the dates of files and the
+  type of needed files is verified before building.
+  The dependencies include, invf dictionary, invf index, invf, fmd and wt files.
+  The major change here, is the possible use of fmd and/or wt files.
+  Later when I was having to write mg_fmd_build and mg_wt_build,
+  I decided to abstract out some macros, namely:
+    Get_ft, Get_ft_Ft, loop_invf_entry,
+  which were put into "build_lib.c" .
+  "loop_invf_entry" takes a function/macro name as a parameter and applies
+  it to the sim record (with field fdt set), current doc number and modifies
+  the return value. 
+FILES
+ *   mg_weights_build.c
+ *   build_lib.c
+*************************************************************
+TITLE
+  Mgstat with non-existent files
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  tes@kbs.citri.edu.au - 10 Aug 1994
+CLAIM
+  NaNs and Infinites would be printed out by mgstat
+  if unable to open .text or .text.dict file.
+PROBLEM
+  The NaNs etc. were output in the column stating
+  the percentage size of the file compared with the
+  number of input bytes of the source text data.
+  If it couldn't read the .text file with its
+  header describing the number of source text bytes, then
+  in working out the percentage it would divide by zero.
+  Also due to some bad control flow, it wouldn't attempt to
+  open the .text file if it failed when opening 
+  the .text.dict file.
+SOLUTION
+  Only printout the percentage if we can read the header
+  from the .text file.
+  Read in text header irrespective of text dictionary file.
+FILES
+ *   mgstat.c
+*************************************************************
+TITLE
+  Boolean tree optimisations
+APPLICATION
+  mg-2
+TYPE
+  extend
+REPORT
+  (i) tes@kbs.citri.edu.au - 28/Sep/94
+  (ii) tes@kbs.citri.edu.au - 12/Dec/94
+FIX
+  (i) tes@kbs.citri.edu.au - 18/Oct/94
+  (ii) tes@kbs.citri.edu.au - 21/Dec/94
+CLAIM
+  The initial prompt for investigating the optimisation of
+  boolean queries is noted in the mg-1 mod14.txt. 
+  The code for optimising seemed to have a number of faults.
+PROBLEM
+  Boolean optimisation was unreliable.
+SOLUTION
+  Initially (in case (i) above, see mg-1/mod14.txt), I rewrote 
+  all the boolean tree and optimising code. I converted the boolean
+  expression into DNF. I did this after reading some notes about 
+  the steps involved in optimisation and they suggested standardising
+  in some normal form. I thought that DNF would be appropriate so that
+  all the terms are converted to be part of "and" expressions and be
+  evaluated quickly using skipping.
+  This, however, can suffer quite badly if the distributive law is
+  applied to often and the query expands in size. If there was
+  some sort of cacheing of invf entries, then it might not be so
+  bad otherwise there is quite an overhead on reading the same
+  invf entry more than once.
+
+  As it happens, CNF queries are reasonably common, where the user
+  queries with a conjunction of disjunctions of similes:
+    e.g. (car | automobile | vehicle) & (fast | quick | speedy)
+  This sort of CNF query expands a hell of a lot !
+  So after speaking with Justin who wanted to benchmark Atlas with Mg on
+  these sort of queries, I looked up the MG book for other ideas.
+
+  The method that I implemented was the following:
+
+  -----------------------------------------------------------------
+  Steps of tree modifications:
+    Gets literals by pushing the nots down, detecting T/F at leaves
+    and collapsing the tree by detecting  'and' of 'and's and 'or' of
+    'or's.
+    Next it looks at the or nodes and if all the children are terms
+    then it marks the or-node as such.
+    Finally, the or-term-nodes are sorted by using the sum of their
+    ft's for comparison.
+  Steps at query evaluation:
+    If it comes across an 'and' of 'or-terms' then the evaluation is
+    done noting the distributive law.
+    I.e. a & (b | c | d) = (a & b) | (a & c) | (a & d)
+    Assuming 'a' is the c-set of documents.
+    All of 'a' is tested against 'b' and matching ones are marked.
+    Next, all the unmarked members of 'a' are tested against 'c'.
+    Likewise for 'd'.
+    Now all the marked members of our c-set are kept.
+    When we do the testing, we can use the skipping in the invf entries.
+  -----------------------------------------------------------------
+
+
+  After doing this, I added the choice of which type of optimisation
+  the user wanted by adding query-environment-variable, "optimise_type".
+  Type 0 = no parse tree modification. 
+  Type 1 = Or-term recognition and CNF query evaluation optimisation. 
+  Type 2 = Put into DNF form. [generally not recommended]
+FILES
+ *   bool_tree.c
+ *   bool_parser.y
+ *   bool_optimiser.c
+ *   bool_query.c 
+ *   bool_tester.c
+ *   term_lists.c
+ *   query_env.c
+ *   invf_get.c [GetDocsOp]
+*************************************************************
+TITLE
+  nonexistent HOME bug  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  bug 
+REPORT
+  cgn@totara.cs.waikato.ac.nz - 2/May/95
+FIX
+  tes@kbs.citri.edu.au - 2/May/95
+CLAIM
+"The big problem was that mgquery crashes when the HOME environment
+ variable is not set, which is the case when it is run by the www server."
+ [...] "I expect it happens when looking for $HOME/.mgrc."
+PROBLEM
+  The result of getenv("HOME")" was used directly in
+  a sprintf call. If the environment variable HOME
+  was not in existence then null would be used.
+  In some C libraries sprintf will convert the 0
+  string into the string "(null)" on others it will core dump.
+  (For example, Solaris seems to core dump, sunos 4 seems ok).
+SOLUTION
+  The result from getenv("HOME")" is tested before
+  being used.
+FILES
+ *   commands.c
+*************************************************************
+TITLE
+  mgquery collection name preference  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  improve
+REPORT
+  cgn@totara.cs.waikato.ac.nz - 2/May/95
+FIX
+  tes@kbs.citri.edu.au - 4/May/95
+CLAIM
+ Surely something must override mquery's preference for ./bib. 
+ If MGDATA is set correctly, I think it should prefer that collection, 
+ and -d should definitely override it. 
+ I could always say -d . if I really wanted ./bib.
+PROBLEM
+Currently the priority is:
+1.  Check if ./name is a directory,
+     If so then use it as the collection directory.
+2.  Check if ./name.text is a file,
+     If so then use ./ as the collection directory.
+3.  Check if mgdir/name is a directory,
+     If so then use mgdir/name as the collection directory.
+4.  Otherwise,
+     Use mgdir/name as the database file prefix.
+     This would be the case if one used "-f alice/alice".
+     However, one would then not specify a final name argument
+     and we'd never get here. Go figure ???
+SOLUTION
+Moved step 3 to the top instead.
+FILES
+ *   mgquery.c [search_for_collection()]
+*************************************************************
+TITLE
+  Printout of query terms
+APPLICATION
+  mg-1, mg-2
+TYPE
+  extend
+REPORT
+  tes@kbs.citri.edu.au - April 95
+FIX
+  tes@kbs.citri.edu.au - April 95
+CLAIM
+  No easy way to find out the parsed and stemmed words
+  used in the query. Would like to know these words
+  so I can call a separate highlighting program to 
+  highlight these words.
+PROBLEM
+  No facility available.
+SOLUTION
+  A ".queryterms" mgquery command was added which lists
+  out the parsed/stemmed queryterms of the last query.
+FILES
+ *    commands.c (added CmdQueryTerms)
+*************************************************************
+TITLE
+  mg_getrc  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  extend
+REPORT
+  bruce@cosc.canterbury.ac.nz - 2/May/95
+FIX
+   - 
+CLAIM
+  Repeated code had to be written for different named
+  gets but really the same type of parsing required.
+  E.g. one might want to use a standard method for inserting
+  ^Bs between paragraphs for different books. One doesn't
+  want to write duplicate code for each different named book,
+  rather note that each book should be filtered "book" style.
+PROBLEM
+  There was no way of abstracting out types of filters from
+  the name of an instance of a collection.
+SOLUTION
+  Allow information to be given with <name, type, files>.
+  This extra info can be provided in a mg_getrc file.
+  See man page for mg_get for details.
+FILES
+ *    mg_get.sh
+*************************************************************
+TITLE
+  TREC DocNo file   
+APPLICATION
+  mg-2
+TYPE
+  improve
+REPORT
+  tes@kbs.citri.edu.au - 26/May/95
+FIX
+  tes@kbs.citri.edu.au - 26/May/95
+CLAIM
+  MG has problems dealing with trec docnos for trec disk 3.
+PROBLEM
+  Trec DocNos file didn't have a wide enough field
+  to handle disk 3. 
+SOLUTION
+  Allow different width fields for file.
+  It is still fixed width but a number in the header
+  says how wide the field is.
+FILES
+ *   passes/mg.special.c
+ *   query/mgquery.c
+*************************************************************
+TITLE
+  Boolean optimiser #1 with `!'  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  bug 
+REPORT
+  triffid@iconz.co.nz - 20/7/95
+FIX
+  tes@kbs.citri.edu.au - 27/7/95
+CLAIM
+  Complained about not-nodes. 
+  e.g. complained about "croquet & !hedgehog"
+PROBLEM
+  Boolean optimiser type#1 didn't convert
+  "and not"s into diff nodes.
+SOLUTION
+  Added code to convert '&!' to '-'.
+FILES
+ *   mg/bool_optimiser.c [mg-1]
+ *   query/bool_optimiser.c [mg-2]
+*************************************************************
+TITLE
+   Autoconfiguring mg-1  
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  many people - 94/95
+FIX
+  tes@kbs.citri.edu.au - Aug/95
+CLAIM
+  Portability is limited by setting up c-macros just for particular
+  machines and operating systems.
+  People had to make changes for HP, Next, Linux, Dec Alpha, ...
+PROBLEM
+  Porting was only targetting at the machines that the author had
+  access to.
+SOLUTION
+  Use GNU's autoconfigure program.
+  This allows checking of the systems features/characteristics.
+  It also allows some checking for specific machines/OS - although
+  I have not utilised this option.
+  I used GNU's tar-1.11.8 as an example to base my changes on.
+  I also used autoscan to generate the initial "configure.in".
+  The "Makefile.in"s were done very similarly to GNU tar's.
+  The "config.h" and "sysfuncs.h" files were scrapped and 
+  rewritten. The new "config.h" file is generated by the configure
+  script - it contains all the #define's for the system features.
+  The "sysfuncs.h" file wraps up a number of system headers. 
+  For example, some systems use , while some use ;
+  which one is included is decided in "sysfuncs.h".
+  I have also used GNU tar's use of ansi2knr in its Makefiles.
+  This should hopefully allow the package to work on a system with
+  only a K&R C compiler.
+  However, there are probably problems with what I have done.
+  I am concerned about <stdarg.h> for example.
+  I also noticed that "ansi2knr" require function definitions as
+  the GNU coding style recommends ie. with function name the first
+  string on the line. This prompted me to run all the package's code
+  thru GNU's indent.
+  Setting up the configure changes is difficult. It really seems
+  necessary to try the package out on many target machines so one
+  can know what is necessary.
+  A simple check target for the main Makefile has been written.
+  It is used to see if the installation is working - it does
+  not test much of the functionality of mg.
+  It does cmp's on data files and diff's on query/result files.
+FILES
+  Most of the files in the distribution.
+*************************************************************
+TITLE
+  Consistent use of stderr
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  tes@kbs.citri.edu.au - 11 August 1994
+CLAIM
+  Inconsistent use of stdout/stderr in usage messages.
+PROBLEM
+  Sometimes used "printf" and sometimes used "fprintf(stderr"
+  in usage messages.
+SOLUTION
+  All should now use "fprintf(stderr" in usage messages.
+FILES
+ *   mg_compression_dict.c
+ *   mg_compression_dict.1
+ *   mg_fast_comp_dict.c
+ *   mg_fast_comp_dict.1
+ *   mg_invf_dict.c
+ *   mg_invf_dict.1
+ *   mg_invf_dump.c
+ *   mg_invf_dump.1
+ *   mg_invf_rebuild.c
+ *   mg_invf_rebuild.1
+ *   mg_perf_hash_build.c
+ *   mg_perf_hash_build.1
+ *   mg_text_estimate.c
+ *   mg_text_estimate.1
+ *   mg_weights_build.c
+ *   mg_weights_build.1
+*************************************************************
+TITLE
+  xmg bug
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  cgn@cpsc.ucalgary.ca - 22 April 1994
+FIX
+  cgn@cpsc.ucalgary.ca - 22 April 1994
+CLAIM
+  "Serious problem in xmg, which I fear occurs whenever a query
+   doesn't return anything."
+PROBLEM
+  ??
+SOLUTION
+  [xmg.sh 201] set rank 0
+FILES
+ *   xmg.sh
+*************************************************************
+TITLE
+  Unnecessary loading of text
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - ?? August 1994
+FIX
+  tes@kbs.citri.edu.au - 12 August 1994
+CLAIM
+  Mg was loading and uncompressing text when the
+  query did not require the text.
+PROBLEM
+  There was no test for the query mode
+  before loading and uncompressing the text.
+SOLUTION
+  Only load/uncompress text if query mode
+  is for text, headers or silent(for timing).
+FILES
+ *   mgquery.c
+*************************************************************
+TITLE
+  Man page errors
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  beebe@math.utah.edu - 16 May 1994
+CLAIM
+  Man page errors.
+PROBLEM
+  See below.
+SOLUTION
+ "The mg_make_fast_dict.1 file has been renamed mg_fast_comp_dict.1,
+  and all mg_make_fast_dict strings changed to mg_fast_comp_dict in all
+  man pages.
+  A large number of errors of spelling, typography, spacing, fonts,
+  grammar, omitted words, slang, punctuation, missing man page
+  cross-references, and man-page style have been corrected."
+FILES
+ *    mg_compression_dict.1
+ *    mg_fast_comp_dict.1
+ *    mg_get.1
+ *    mg_invf_dict.1
+ *    mg_invf_dump.1
+ *    mg_invf_rebuild.1
+ *    mg_passes.1
+ *    mg_perf_hash_build.1
+ *    mg_text_estimate.1
+ *    mg_weights_build.1
+ *    mgbilevel.1
+ *    mgbuild.1
+ *    mgdictlist.1
+ *    mgfelics.1
+ *    mgquery.1
+ *    mgstat.1
+ *    mgtic.1
+ *    mgticbuild.1
+ *    mgticdump.1
+ *    mgticprune.1
+ *    mgticstat.1
+ *    xmg.1
+*************************************************************
+TITLE
+  Man page overview
+APPLICATION
+  mg-1
+TYPE
+  extend
+REPORT
+  beebe@math.utah.edu - 
+FIX
+  tes@kbs.citri.edu.au - 17 August 1994
+CLAIM
+  "Write new mg.1 file to give a brief overview of mg, with samples
+   of how to use it.  Otherwise, users are likely to be completely
+   overwhelmed by the number of programs (about 20) which might need to
+   be used, when in reality, only 2 or 3 are likely to be run by end
+   users."
+SOLUTION
+  It was thought that mg.1, written by Nelson Beebe, was very useful
+  but a bit too comprehensive for an introduction.
+  Therefore, two man files, mgintro.1 and mgintro++.1 were written
+  with the basic stuff in mgintro.1 and slightly more advanced stuff
+  in mgintro++.1 . 
+FILES
+ *   mg.1
+ *   mgintro.1
+ *   mgintro++.1 
+*************************************************************
+TITLE
+  Parse errors not bus errors
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tim@cosc.canterbury.ac.nz - 2 Jun 94
+FIX
+  tes@kbs.citri.edu.au - 19 Aug 94
+CLAIM
+  "These two queries 
+   (which I typed in before I knew what I was doing!!)
+      > The Queen of Hearts, she made some tarts
+      > "The Queen of Hearts" and "she made some tarts"
+      produced the following result:
+      mgquery : parse error
+      Bus error
+  "
+PROBLEM
+  What is expected to happen under boolean querying:
+    Query1:
+    > The Queen of Hearts, she made some tarts
+    will produce a parse error due to the comma which
+    is not a valid TERM.
+    Query2:
+    > "The Queen of Hearts" and "she made some tarts"
+    will store a post-processing string
+    of ''The Queen of Hearts" and "she made some tarts'' and
+    will have a main boolean query of the empty string.
+    This is because the postprocessing string takes in
+    everything between the first quote and the last one.
+    An empty string is illegal for the boolean grammar and
+    hence a parse error.
+  The problem stems from the fact that the processing of
+  the parse tree is carried out, even though we have a 
+  parse error. In the case of using an empty string to build
+  a parse tree, it is likely to leave the parse tree undefined.
+SOLUTION
+  As soon as we find out that there is a parse-error,
+  we abandon any processing of the parse tree.
+FILES
+ *   query.bool.y
+ *   query.bool.c (generated from query.bool.y)
+*************************************************************
+TITLE
+  Perfect hashing on small vocab
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - July 1994
+FIX
+  alistair@cs.mu.oz.au - July 1994
+CLAIM
+  Mg could not handle small collections in the case
+  where there was only a small number of unique words.
+  The perfect hash function would report an error.
+PROBLEM
+  Rounding of the arithmetic during the calculation of the
+  parameters of the perfect hash function was resulting in a
+  combination of values such that the probability of a hash
+  function being found was very small. This led to the limit
+  on the generation loop being exceeded, and eventual
+  failure.
+SOLUTION
+  By using ceiling rather than floor when converting from a
+  floating point value to an integer parameter, the arithmetic
+  is now correct for all lexicon sizes, and the probability of
+  each iteration successfully generating a hash function is
+  sufficiently great that with _very_ high probability the
+  execution loop counter will not be exceeded unless there
+  genuinely is no hash function (for example, if the lexicon
+  contains two words the same there cannot be  a hash
+  function).
+FILES
+ *   perf_hash.c
+*************************************************************
Index: /main/tags/2.38/gsdl/packages/mg/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/Makefile.in	(revision 21083)
@@ -0,0 +1,163 @@
+# Main Makefile for GNU tar.
+# Copyright (C) 1994, 1995 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+@SET_MAKE@
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+ 
+
+CC = @CC@
+CFLAGS = @CFLAGS@ 
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@  
+TOUCH = echo timestamp >
+ 
+bindir = $(exec_prefix)/bin
+infodir = $(prefix)/info
+libexecdir = $(exec_prefix)/libexec
+ 
+MDEFINES = 
+#CC='$(CC)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \
+#prefix='$(prefix)' exec_prefix='$(exec_prefix)' \
+#bindir='$(bindir)' libexecdir='$(libexecdir)' \
+#infodir='$(infodir)' infodir='$(infodir)' libexecdir='$(libexecdir)'
+
+#SUBDIRS = lib src/text src/images src/scripts
+SUBDIRS = lib src/text
+
+
+.SUFFIXES:
+
+all install uninstall execinstall execuninstall maninstall manuninstall: ../../config.h
+	for subdir in $(SUBDIRS); do \
+	  echo making $@ in $$subdir; \
+	  (cd $$subdir && $(MAKE) $(MDEFINES) $@) || exit 1; \
+	done
+
+# Have not written any texinfo files for the documentation yet
+#info dvi:
+#	cd doc && $(MAKE) $@
+
+check: all
+	echo making $@ in ./test directory
+	(cd ./test && $(MAKE) all) || exit 1
+	./test/testmg `pwd`
+
+mostlyclean: mostlyclean-recursive mostlyclean-local
+
+clean: clean-recursive clean-local
+
+# the toplevel Makefile already does our subdirs.
+#distclean: distclean-recursive distclean-local
+#	rm -f config.status
+distclean:
+
+maintainer-clean: maintainer-clean-recursive maintainer-clean-local
+	rm -f config.status
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	for subdir in $(SUBDIRS); do \
+	  target=`echo $@ | sed 's/-recursive//'`; \
+	  echo making $$target in $$subdir; \
+	  (cd $$subdir && $(MAKE) $$target) || exit 1; \
+	done
+
+mostlyclean-local:
+
+clean-local: mostlyclean-local
+
+distclean-local: clean-local
+	rm -f Makefile stamp-h
+
+maintainer-clean-local: distclean-local
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+distdir = $(PACKAGE)-$(VERSION)
+
+distname = $(distdir)
+
+DISTFILES = \
+INSTALL.mg INSTALL README README.port COPYING MODIFICATIONS about_mg.html \
+Makefile.in acconfig.h aclocal.m4 configure.in install-sh mkinstalldirs \
+config.guess config.sub \
+config.h.in configure stamp-h.in sysfuncs.h
+
+dist: $(DISTFILES)
+#-----------------------------------------------------------------
+	#create distribution directory
+	-rm -rf $(distdir)
+	mkdir $(distdir)
+#
+	#link in local distribution files
+	ln $(DISTFILES) $(distdir)
+#
+	#link in SampleData
+	mkdir $(distdir)/SampleData
+	(cd SampleData; $(MAKE) "distdir=../$(distdir)/SampleData" dist)
+	# link in davinci stuff
+	mkdir $(distdir)/SampleData/davinci
+	(cd SampleData/davinci; \
+	$(MAKE) "distdir=../../$(distdir)/SampleData/davinci" dist)
+	# link in bible stuff
+	mkdir $(distdir)/SampleData/bible
+	(cd SampleData/bible; \
+	$(MAKE) "distdir=../../$(distdir)/SampleData/bible" dist)
+#
+	#link in tests
+	mkdir $(distdir)/test
+	(cd test; $(MAKE) "distdir=../$(distdir)/test" dist)
+#
+	#link in docs directory
+	mkdir $(distdir)/docs
+	(cd docs; $(MAKE) "distdir=../$(distdir)/docs" dist)
+#
+	#link in lib directory
+	mkdir $(distdir)/lib
+	(cd lib; $(MAKE) "distdir=../$(distdir)/lib" dist)
+#
+	#link in src distribution files
+	mkdir $(distdir)/src
+	for dir in src/text src/images src/scripts; do \
+	  echo makeing $@ in $$dir ; \
+	  mkdir $(distdir)/$$dir; \
+	  (cd $$dir; $(MAKE) "distdir=../../$(distdir)/$$dir" $@) ; \
+	done
+#
+	# archive and compress
+	tar -chf - $(distdir) | gzip -9 > $(distname).tar.gz
+	tar -chf - $(distdir) | compress > $(distname).tar.Z
+#
+	# cleanup
+	rm -rf $(distdir)
+#-----------------------------------------------------------------
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/mg/README
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/README	(revision 21083)
@@ -0,0 +1,156 @@
+                 MG INFORMATION RETRIEVAL SYSTEM
+                 ===============================
+
+The MG system is a suite of programs for compressing and indexing text
+and images. Most of the functionality implemented in the suite is as
+described in the book ``Managing Gigabytes:  Compressing and Indexing
+Documents and Images'', I.H. Witten, A.  Moffat, and T.C. Bell; Van
+Nostrand Reinhold, New York, 1994, ISBN 0-442-01863-0; US $54.95; call
+1 (800) 544-0550 to order.
+
+These features include:
+
+-- text compression using a Huffman-coded semi-static word-based scheme
+-- two-level context-based compression of bi-level images
+-- FELICS lossless compression of gray-scale images
+-- combined lossy/lossless compression for textual images
+-- indexing algorithms for large volumes of text in limited main memory
+-- index compression
+-- a retrieval system that processes Boolean and ranked queries
+-- an X windows interface to the retrieval system
+
+As one example, a collection of 2 Gb of text (1,700,000 documents) can
+be indexed (on a SPARC 10 Model 512) in about four hours and compressed
+in a further four hours to make a database that in total occupies less
+than 800 Mb, or 40% of the original size. This includes a full index to
+every word and number in the original text. Boolean queries such as
+``managing AND gigabytes'' run in a few seconds, and ranked queries of
+30--50 terms are evaluated in 10--30 seconds.
+
+Details of these methods and further performance results appear in the
+MG book.
+
+The MG system comes with ABSOLUTELY NO WARRANTY; for details see the
+file COPYING.
+
+Instructions on how to build and install mg are in the file INSTALL.
+
+
+** CHANGES FROM BOOK
+
+For copyright reasons the stemmer used in this distribution of MG is
+not the same as the one illustrated in Figure 3.8 on page 108 of the MG
+book.  This means that the numbers generated by the command ``mgstat
+alice'' will not match those numbers in Figure A.1 on page 394.
+Another stemmer was initially written as a simple stopgap for version
+1.0.  That stemmer has been replaced by a stemmer based on the Lovin's
+stemming algorithm for mg-1.1.
+
+The output format of ``mgstat'' has changed since Figure A.1 (page 394)
+was prepared. The same information is displayed but formatted
+differently.
+
+** MG VERSIONS
+
+The current version is mg-1.2, September 1995. The changes from earlier 
+versions are listed in the file MODIFICATIONS. This can be accessed
+with mg by building a database using ``mgbuild mods'' and can also be
+accessed from the mg web page (see below). 
+
+The mg-1.2 extensions include:
+
+-- Source modifications for use of GNU's autoconf.
+
+The mg-1.1 extensions include:
+
+-- A new highlighting mode.
+   The output mode ``hilite'' will highlight the query terms in the
+   retrieved text documents. The variable ``hilite_style'' can be set
+   to ``bold'' or ``underline''. It works best with the pager
+   ``less''.  A .mgrc to use would include:
+	.set pager less
+	.set mode hilite
+	.set hilite_style bold
+
+-- A web site containing manual pages, documentation, and a
+   mgquery demo page (utilising cgi scripts). 
+   See: http://www.kbs.citri.edu.au/mg
+   One of these pages ``about_mg.html'' is included in this
+   distribution.
+
+-- A revised mg_get script which uses a .mg_getrc file to map
+   specific collection names to filter types.  (Modifications by Bruce
+   McKenzie). See mg_get.1 for more details.
+
+-- Code to perform merging of existing databases. This code
+   was created by Shane Hudson and is documented in the mgmerge.README
+   file found in the docs subdirectory.  This code is maintained by
+   Shane Hudson (shane@cosc.canterbury.ac.nz).
+
+-- Revised man pages, including some new entries (thanks to Nelson
+   Beebe). See mg.1, mgintro.1, mgintro++.1.
+
+-- A real (rather than toy) stemmer.
+
+** PORTABILITY
+
+Please refer to "README.port".
+
+** CREDITS
+ 
+The MG development is largely the result of research collaboration
+between:
+
+        Tim C. Bell            <tim@cosc.canterbury.ac.nz>
+        Ian Witten             <ihw@cs.waikato.ac.nz>
+        Alistair Moffat        <alistair@cs.mu.oz.au>
+        Justin Zobel           <jz@cs.rmit.oz.au>
+
+The bulk of the programming work has been carried out by:
+
+        Stuart Inglis          <singlis@cs.waikato.ac.nz>
+        Craig Nevill-Manning   <cgn@cs.waikato.ac.nz>
+        Neil Sharman           <neil@kbs.citri.edu.au>
+        Tim Shimmin            <tes@kbs.citri.edu.au>
+
+In addition to these, the following people have contributed to the
+development of the MG software:
+
+        Lachlan Andrew         <lha@kbs.citri.edu.au>
+        Gary Eddy              <gary@cs.mu.oz.au>
+        Hugh Emberson          <hugh@cosc.canterbury.ac.nz>
+        Kerry Guise            <kerry@cs.waikato.ac.nz>
+	Shane Hudson           <shane@cosc.canterbury.ac.nz>
+        Linh Huynh             <linh@kbs.citri.edu.au>
+        Bohdan S. Majewski     <bohdan@cs.uq.oz.au>
+        Bruce McKenzie         <bruce@cosc.canterbury.ac.nz>
+
+In addition to these, the following people have submitted bug reports
+and suggestions/fixes:
+
+        Rex Barzee             <rex@python.cs.byu.edu>
+        Tim A.H. Bell          <bhat@cs.mu.oz.au>
+        Tim C. Bell            <tim@cosc.canterbury.ac.nz>
+        Nelson Beebe           <beebe@math.utah.edu>
+	Rodney Brown           <RBrown@cmutual.com.au>
+        Rok Sosic              <R.Sosic@cit.gu.edu.au>
+        Carl Staelin           <staelin@cello.hpl.hp.com>
+
+Development of the MG system was supported by the Australian Research
+Council; the Universities of Melbourne, Waikato, Canterbury, and
+Calgary; RMIT; and the Collaborative Information Technology Research
+Institute (Melbourne).
+
+** BUG REPORTS
+
+Send bug reports to <alistair@cs.mu.oz.au> and <tes@kbs.citri.edu.au>.
+Back-traces from gdb are always welcome but not mandatory :-)
+
+** FURTHER READING
+
+A bibliography of MG related research work appears in the files
+MG.Bibliography.ps and MG.Bibliography.bib on the ftp site and
+is accessible through the Web page.
+
+
+
Index: /main/tags/2.38/gsdl/packages/mg/README.port
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/README.port	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/README.port	(revision 21083)
@@ -0,0 +1,125 @@
+P O R T A B I L I T Y
+=====================
+
+The main development of MG is done under Solaris on a Sun sparc.
+However, we would also like MG to be reasonably portable.
+Therefore, MG-1.2 now uses a configure stript generated by GNU's autoconf.
+Below, is a list of the machines that the s/ware has been ported to. 
+Most only need the configure script and some require manual modifications 
+mentioned in the "Problems" field.
+
+------------------------------------------------------------------------- 
+** Systems which have successfully been built.
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Sun
+System:		SunOS 4.1.2 8 sun4c
+Compiler:	gcc version 2.3.3
+Problems:	none
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Sun
+System:		SunOS 4.1.2_DB 14 sun4c
+Compiler:	gcc version 2.3.3
+Problems:	none
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Sun
+System:		SunOS 4.1.3_U1 1 sun4c
+Compiler:	gcc version 2.5.7
+Problems:	none
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Sun
+System:		SunOS 5.3 Generic_Patch sun4m sparc
+Compiler:	gcc version 2.4.3
+Problems:	none
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Silicon Graphics
+System:		IRIX 5.2 02282014 IP7
+Compiler:	gcc version 2.6.3
+Problems:	none
+
+Tester:		tes@kbs.citri.edu.au
+Date:
+Machine:	Sun
+System:		SunOS 5.4 Generic_101945-27 sun4c sparc
+Compiler:	cc: SC3.0.1 13 Jul 1994
+Problems:	none
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:
+System:		SCO 3.2v4.1
+Compiler:	gcc 2.6.1
+Problems:	requires RANLIB=true, use of tcsh
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:	HP
+System:		HP-UX A.09.04 D 9000/837 415303291 64-user license
+Compiler:	HP92453-01 A.09.73 HP C Compiler
+Problems:
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:	Data General
+System:		dgux 5.4R3.00 generic AViiON mc88110 
+Compiler:	gcc 2.4.5 (dg supplied)
+Problems:	none
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:	Pyramid MIPS R3000 box
+System:		
+Compiler:	cc (vendor supplied)
+Problems:	none
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:	IBM RS6000
+System:		AIX 3.2
+Compiler:	AIX XL C Compiler/6000
+Problems:	none
+
+Tester:		RBrown@cmutual.com.au
+Date:
+Machine:	Linux 1.2.9
+System:		
+Compiler:	gcc 2.6.3
+Problems:	none
+
+-----------------------------------------------------------------------
+** Systems which have NOT successfully been built.
+
+Tester:		RBrown@cmutual.com.au, 
+		Lloyd.Parkes@vuw.ac.nz
+Date:		Oct, Nov, 1995
+Machine:	Dec Alpha OSF/1
+System:
+Compiler:	cc
+Problems: 	Many - see below.
+
+* Problems with Dec Alpha
+  - 64 bit length longs as opposed to 32 bit longs.
+  - Lloyd.Parkes@vuw.ac.nz says that there is some bit encoding problems 
+    but the decoding seems to work.
+  - RBrown@cmutual.com.au says that it will compile but will core dump
+    when  building the test database.
+  - tes.kbs.citri.edu.au says that he needs to look into the repercussions
+    of 64 bit longs, however, he does not have access to such a machine.
+		
+-----------------------------------------------------------------------
+** Other systems. 
+
+Systems other than the above may have installation problems.
+If this is the case, please send me (tes@kbs.citri.edu.au) a log of the output
+and I will modify the configuration files in an effort to fix the problems.
+
+-----------------------------------------------------------------------
Index: /main/tags/2.38/gsdl/packages/mg/SampleData/MODIFICATIONS
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/SampleData/MODIFICATIONS	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/SampleData/MODIFICATIONS	(revision 21083)
@@ -0,0 +1,664 @@
+TITLE
+  Parsing of Long Words
+APPLICATION
+ mg-1, mg-2
+TYPE
+  bug
+REPORT
+  tim@cosc.canterbury.ac.nz - May 11th 1994
+FIX
+  tes@kbs.citri.edu.au - August 9th 1994
+CLAIM
+  Mg didn't handle long words properly; it crashed.
+PROBLEM
+  Invf passes calls PARSE_LONG_WORD [words.h] which uses a limit of
+  MAXLONGWORD on iterating thru the string and storing into 
+  a word. MAXLONGWORD = 8192.
+  However, mg strings generally store the length in the first
+  byte limiting them to 255 characters. The word which was passed
+  to PARSE_LONG_WORD was an allocated string of MAXSTEMLEN = 255,
+  which is as large as we should get anyway. Thus when accessing
+  a larger word than 255 chars, PARSE_LONG_WORD would allow it
+  (less than 8192) and would try storing beyond the array limit.
+SOLUTION
+  The author can't remember why PARSE_LONG_WORD was used and what
+  the significance of MAXLONGWORD = 8192 is.
+  So PARSE_LONG_WORD has been changed to PARSE_STEM_WORD which
+  uses MAXSTEMLEN as its limit.
+FILES
+ *   words.h
+ *   invf.pass1.c
+ *   invf.pass2.c
+ *   ivf.pass1.c
+ *   ivf.pass2.c
+ *   query.ranked.c
+*************************************************************
+TITLE
+  Use of Lovins stemmer
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  local - 1994
+FIX
+  linh@kbs.citri.edu.au - 1994
+CLAIM
+  Stemming was done naively.
+PROBLEM
+  Only a few types of words and their endings
+  were considered.
+SOLUTION
+  Replacement with a more elaborate "known" stemmer by Lovins.
+  The algorithm is described in:
+    J.B. Lovins, "Development of a Stemming Algorithm",
+    Mechanical Translation and Computational Linguistics, Vol 11,1968.
+FILES
+ *   stem.c
+ *   stem.h
+*************************************************************
+TITLE
+  Different term parsing
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - 23 Aug 1994
+FIX
+  tes@kbs.citri.edu.au - 23 Aug 1994
+CLAIM
+  Boolean queries did not extract words/terms using the
+  same method as is done at inverted-file creation and
+  as is used for rank query parsing.
+PROBLEM
+  The hand-written lex. analyser, query_lex, which is called by
+  the boolean query parser was not calling a common
+  word-extraction routine as used by the rest of mg. 
+  This would be ok if the code did the same things - but they didn't.
+  Query_lex, for instance, did NOT place any limit on the
+  number of digits in a term.
+  Of even more concern, it would allow arbitrary sized words
+  although it used Pascal style strings which store the length
+  in the first byte and can therefore only be 255 characters in length.
+SOLUTION
+  Query_lex in "query.bool.y", was modified to call the routine
+  PARSE_STEM_WORD which is also used by text-inversion routines and
+  ranking query routines.
+  Now all terms are extracted by the same routine.
+  To do this, the end of the line buffer had to be noted as
+  PARSE_STEM_WORD requires a pointer to the end - which is the
+  safe thing to do (don't want to run over the end).
+  This meant I had to find the length of the query line buffer.
+  This was allocated in the file "read_line.c" by the routine,
+  "readline". Its size was the literal number 1024. 
+  This was changed to a constant and placed in "read_line.h".
+  The definition for PARSE_STEM_WORD can be found in "words.h".
+FILES
+ *   query.bool.y
+ *   query.bool.c (by bison)
+ *   read_line.c
+ *   read_line.h
+*************************************************************
+TITLE
+  Highlighting of query terms
+APPLICATION
+  mg-1
+TYPE
+  extend
+REPORT
+  tes@kbs.citri.edu.au - Aug 94
+FIX
+  tes@kbs.citri.edu.au - Sep 94
+CLAIM
+  Difficult to feel happy that the query-result returned is
+  satisfying the query - need to look hard to find the queried words.
+  Need to show words in results using some highlighting method.
+PROBLEM
+  No highlighting of query terms in results.
+SOLUTION
+  Mgquery was previously outputting the decompressed text to a pager
+  such as "less(1)" or "more(1)".
+  (Except when redirected or piped elsewhere :)
+  So what was needed was some sort of highlight pager that instead of
+  displaying the text would also use some means for highlighting the
+  stemmed query words. 
+  Two common forms of highlighting were chosen: underline and bolding.
+  These are supported by "less(1)" and possibly by "more(1)" by
+  using the backspace character.
+  A highlight pager will also need to know which words need to be
+  highlighted. Therefore, the code was modified to build up a
+  string of the stemmed query words for passing to the highlight pager.
+  Design Options:
+  ---------------
+    * Could do text filtering in mgquery before passing out to pager.
+      Instead I pipe to a separate process, the "hilite_words" pager,
+      which filters and pipes into less/more.
+    * Could do different highlighting or a combination.
+    * Could use a different structure for storing the query words other
+      than the hash-table I used.
+FILES
+ *   Makefile - to include hilite_words target
+ *   mg_hilite_words.c
+ *   mgquery.c
+ *   mgquery.1
+ *   query.bool.y
+ *   query.ranked.c
+ *   environment.c
+ *   environment.h
+ *   backend.h
+*************************************************************
+TITLE
+  Mg_compression_dict did premature free
+APPLICATION
+  mg-1
+TYPE
+  bug 
+REPORT
+  R.Sosic@cit.gu.edu.au - 23 Sep 94
+FIX
+  R.Sosic@cit.gu.edu.au - 23 Sep 94
+CLAIM
+  mg_compression_dict dumped core in 
+	file: mg_compression_dict.c
+	function: Write_data
+	line: int codelen = hd->clens[i];
+PROBLEM
+  Huffman data, hd, was freed *before* it was accessed again. 
+SOLUTION
+  The freeing of hd has been moved to after all accesses
+  (just before returning).
+FILES
+ *   mg_compression_dict.c
+*************************************************************
+TITLE
+  Boolean tree optimising rewrite
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  sosic@kurango.cit.gu.edu.au - 23 Sep 94
+FIX
+  tes@kbs.citri.edu.au - Oct 94
+CLAIM
+  "I am still getting core dump in "and" queries in mgquery, 
+   where the first word does not exist, but the second one does."
+PROBLEM
+  Having freed a particular node, it tried to refree it and 
+  access one of its fields.
+
+  I.e. code-fragment...
+
+       FreeNode(curr); /* where curr = CHILD(base) for 1st term in list */
+       FreeNodes(next);
+       FreeNodes(CHILD(base)); 
+              /* but CHILD(base) has already been freed above */
+              /* if the node was the first one in the list */
+
+SOLUTION
+  A number of things in the code seemed a bit dubious to me.
+  So I have rewritten the boolean optimising stage and abstracted out
+  the various stages - each file starts with "bool".
+  Boolean query optimising seems to be a tricky problem. 
+  It is not clear that putting an expression into a certain form will
+  actually simplify it and whether simplification means faster querying.
+  I have converted a given boolean expression into DNF 
+  (Disjunctive Normal Form).  "And not" nodes, which are readily apparent 
+  in DNF, are converted to "diff" nodes.  I have only applied the idempotency 
+  laws involving TRUE and FALSE, and not the ones requiring matching of 
+  expressions - it is a potentially more complicated problem.
+  The optimiser has been tested by playing with "bool_tester", and if you are
+  having a crash or problem in a boolean query it would be worth testing the
+  query on the "bool_tester." The token "*" stands for TRUE (or all documents) 
+  and the token "_" stands for FALSE (or no documents). This should show the 
+  expression before and after optimisation in an ascii tree bracketting format.
+FILES
+ *   bool_tree.c
+ *   bool_parser.y
+ *   bool_optimiser.c
+ *   bool_query.c 
+ *   bool_tester.c
+ *   term_lists.c
+*************************************************************
+TITLE
+  Mgtic pixel placement
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  Bruce McKenzie - bruce@cosc.canterbury.ac.nz (21st Oct 1994)
+FIX
+  singlis@cs.waikato.ac.nz
+CLAIM
+  mgtic crashed on certain files.
+PROBLEM
+  Placing pixels outside of bitmap.
+SOLUTION
+  Changed the putpixel routine to truncate at borders of the image.
+FILES
+ *   mgtic.c
+*************************************************************
+TITLE
+  Improved boolean tree optimising
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  tes@kbs.citri.edu.au - 12/Dec/94
+FIX
+  tes@kbs.citri.edu.au - 21/Dec/94, 14/Mar/95
+CLAIM
+  Optimising by conversion to DNF is not necessarily such
+  a good idea - can actually slow things down.
+PROBLEM
+  The distributive law used in converting to DNF
+  duplicates expressions.
+SOLUTION
+  Introduce a query environment variable, optimise_type = 0 | 1 | 2.
+  Type 0 does nothing to the parse tree. 
+  Type 2 does the DNF conversion.
+  Type 1 is the new default and does the following...
+    Do simple tree rearrangement like flattening. 
+    Optimise for CNF queries.
+FILES
+ *   bool_query.c, .h
+ *   bool_optimiser.c
+ *   environment.c
+ *   invf_get.c
+ *   bool_tree.c, .h
+ *   bool_tester.c
+ *   lists.h
+*************************************************************
+TITLE
+  Mgstat with non-existent files
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  tes@kbs.citri.edu.au - 10 Aug 1994
+CLAIM
+  NaNs and Infinites would be printed out by mgstat
+  if unable to open .text or .text.dict file.
+PROBLEM
+  The NaNs etc. were output in the column stating
+  the percentage size of the file compared with the
+  number of input bytes of the source text data.
+  If it couldn't read the .text file with its
+  header describing the number of source text bytes, then
+  in working out the percentage it would divide by zero.
+  Also due to some bad control flow, it wouldn't attempt to
+  open the .text file if it failed when opening 
+  the .text.dict file.
+SOLUTION
+  Only printout the percentage if we can read the header
+  from the .text file.
+  Read in text header irrespective of text dictionary file.
+FILES
+ *   mgstat.c
+*************************************************************
+TITLE
+  nonexistent HOME bug  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  bug 
+REPORT
+  cgn@totara.cs.waikato.ac.nz - 2/May/95
+FIX
+  tes@kbs.citri.edu.au - 2/May/95
+CLAIM
+"The big problem was that mgquery crashes when the HOME environment
+ variable is not set, which is the case when it is run by the www server."
+ [...] "I expect it happens when looking for $HOME/.mgrc."
+PROBLEM
+  The result of getenv("HOME")" was used directly in
+  a sprintf call. If the environment variable HOME
+  was not in existence then null would be used.
+  In some C libraries sprintf will convert the 0
+  string into the string "(null)" on others it will core dump.
+  (For example, Solaris seems to core dump, sunos 4 seems ok).
+SOLUTION
+  The result from getenv("HOME")" is tested before
+  being used.
+FILES
+ *   commands.c
+*************************************************************
+TITLE
+  mgquery collection name preference  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  improve
+REPORT
+  cgn@totara.cs.waikato.ac.nz - 2/May/95
+FIX
+  tes@kbs.citri.edu.au - 4/May/95
+CLAIM
+ Surely something must override mquery's preference for ./bib. 
+ If MGDATA is set correctly, I think it should prefer that collection, 
+ and -d should definitely override it. 
+ I could always say -d . if I really wanted ./bib.
+PROBLEM
+Currently the priority is:
+1.  Check if ./name is a directory,
+     If so then use it as the collection directory.
+2.  Check if ./name.text is a file,
+     If so then use ./ as the collection directory.
+3.  Check if mgdir/name is a directory,
+     If so then use mgdir/name as the collection directory.
+4.  Otherwise,
+     Use mgdir/name as the database file prefix.
+     This would be the case if one used "-f alice/alice".
+     However, one would then not specify a final name argument
+     and we'd never get here. Go figure ???
+SOLUTION
+Moved step 3 to the top instead.
+FILES
+ *   mgquery.c [search_for_collection()]
+*************************************************************
+TITLE
+  Printout of query terms
+APPLICATION
+  mg-1, mg-2
+TYPE
+  extend
+REPORT
+  tes@kbs.citri.edu.au - April 95
+FIX
+  tes@kbs.citri.edu.au - April 95
+CLAIM
+  No easy way to find out the parsed and stemmed words
+  used in the query. Would like to know these words
+  so I can call a separate highlighting program to 
+  highlight these words.
+PROBLEM
+  No facility available.
+SOLUTION
+  A ".queryterms" mgquery command was added which lists
+  out the parsed/stemmed queryterms of the last query.
+FILES
+ *    commands.c (added CmdQueryTerms)
+*************************************************************
+TITLE
+  mg_getrc  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  extend
+REPORT
+  bruce@cosc.canterbury.ac.nz - 2/May/95
+FIX
+   - 
+CLAIM
+  Repeated code had to be written for different named
+  gets but really the same type of parsing required.
+  E.g. one might want to use a standard method for inserting
+  ^Bs between paragraphs for different books. One doesn't
+  want to write duplicate code for each different named book,
+  rather note that each book should be filtered "book" style.
+PROBLEM
+  There was no way of abstracting out types of filters from
+  the name of an instance of a collection.
+SOLUTION
+  Allow information to be given with <name, type, files>.
+  This extra info can be provided in a mg_getrc file.
+  See man page for mg_get for details.
+FILES
+ *    mg_get.sh
+*************************************************************
+TITLE
+  Boolean optimiser #1 with `!'  
+APPLICATION
+  mg-1, mg-2
+TYPE
+  bug 
+REPORT
+  triffid@iconz.co.nz - 20/7/95
+FIX
+  tes@kbs.citri.edu.au - 27/7/95
+CLAIM
+  Complained about not-nodes. 
+  e.g. complained about "croquet & !hedgehog"
+PROBLEM
+  Boolean optimiser type#1 didn't convert
+  "and not"s into diff nodes.
+SOLUTION
+  Added code to convert '&!' to '-'.
+FILES
+ *   mg/bool_optimiser.c [mg-1]
+ *   query/bool_optimiser.c [mg-2]
+*************************************************************
+TITLE
+  Consistent use of stderr
+APPLICATION
+  mg-1
+TYPE
+  improve
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  tes@kbs.citri.edu.au - 11 August 1994
+CLAIM
+  Inconsistent use of stdout/stderr in usage messages.
+PROBLEM
+  Sometimes used "printf" and sometimes used "fprintf(stderr"
+  in usage messages.
+SOLUTION
+  All should now use "fprintf(stderr" in usage messages.
+FILES
+ *   mg_compression_dict.c
+ *   mg_compression_dict.1
+ *   mg_fast_comp_dict.c
+ *   mg_fast_comp_dict.1
+ *   mg_invf_dict.c
+ *   mg_invf_dict.1
+ *   mg_invf_dump.c
+ *   mg_invf_dump.1
+ *   mg_invf_rebuild.c
+ *   mg_invf_rebuild.1
+ *   mg_perf_hash_build.c
+ *   mg_perf_hash_build.1
+ *   mg_text_estimate.c
+ *   mg_text_estimate.1
+ *   mg_weights_build.c
+ *   mg_weights_build.1
+*************************************************************
+TITLE
+  xmg bug
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  cgn@cpsc.ucalgary.ca - 22 April 1994
+FIX
+  cgn@cpsc.ucalgary.ca - 22 April 1994
+CLAIM
+  "Serious problem in xmg, which I fear occurs whenever a query
+   doesn't return anything."
+PROBLEM
+  ??
+SOLUTION
+  [xmg.sh 201] set rank 0
+FILES
+ *   xmg.sh
+*************************************************************
+TITLE
+  Unnecessary loading of text
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - ?? August 1994
+FIX
+  tes@kbs.citri.edu.au - 12 August 1994
+CLAIM
+  Mg was loading and uncompressing text when the
+  query did not require the text.
+PROBLEM
+  There was no test for the query mode
+  before loading and uncompressing the text.
+SOLUTION
+  Only load/uncompress text if query mode
+  is for text, headers or silent(for timing).
+FILES
+ *   mgquery.c
+*************************************************************
+TITLE
+  Man page errors
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  beebe@math.utah.edu - 16 May 1994
+FIX
+  beebe@math.utah.edu - 16 May 1994
+CLAIM
+  Man page errors.
+PROBLEM
+  See below.
+SOLUTION
+ "The mg_make_fast_dict.1 file has been renamed mg_fast_comp_dict.1,
+  and all mg_make_fast_dict strings changed to mg_fast_comp_dict in all
+  man pages.
+  A large number of errors of spelling, typography, spacing, fonts,
+  grammar, omitted words, slang, punctuation, missing man page
+  cross-references, and man-page style have been corrected."
+FILES
+ *    mg_compression_dict.1
+ *    mg_fast_comp_dict.1
+ *    mg_get.1
+ *    mg_invf_dict.1
+ *    mg_invf_dump.1
+ *    mg_invf_rebuild.1
+ *    mg_passes.1
+ *    mg_perf_hash_build.1
+ *    mg_text_estimate.1
+ *    mg_weights_build.1
+ *    mgbilevel.1
+ *    mgbuild.1
+ *    mgdictlist.1
+ *    mgfelics.1
+ *    mgquery.1
+ *    mgstat.1
+ *    mgtic.1
+ *    mgticbuild.1
+ *    mgticdump.1
+ *    mgticprune.1
+ *    mgticstat.1
+ *    xmg.1
+*************************************************************
+TITLE
+  Man page overview
+APPLICATION
+  mg-1
+TYPE
+  extend
+REPORT
+  beebe@math.utah.edu - 
+FIX
+  tes@kbs.citri.edu.au - 17 August 1994
+CLAIM
+  "Write new mg.1 file to give a brief overview of mg, with samples
+   of how to use it.  Otherwise, users are likely to be completely
+   overwhelmed by the number of programs (about 20) which might need to
+   be used, when in reality, only 2 or 3 are likely to be run by end
+   users."
+SOLUTION
+  It was thought that mg.1, written by Nelson Beebe, was very useful
+  but a bit too comprehensive for an introduction.
+  Therefore, two man files, mgintro.1 and mgintro++.1 were written
+  with the basic stuff in mgintro.1 and slightly more advanced stuff
+  in mgintro++.1 . 
+FILES
+ *   mg.1
+ *   mgintro.1
+ *   mgintro++.1 
+*************************************************************
+TITLE
+  Parse errors not bus errors
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tim@cosc.canterbury.ac.nz - 2 Jun 94
+FIX
+  tes@kbs.citri.edu.au - 19 Aug 94
+CLAIM
+  "These two queries 
+   (which I typed in before I knew what I was doing!!)
+      > The Queen of Hearts, she made some tarts
+      > "The Queen of Hearts" and "she made some tarts"
+      produced the following result:
+      mgquery : parse error
+      Bus error
+  "
+PROBLEM
+  What is expected to happen under boolean querying:
+    Query1:
+    > The Queen of Hearts, she made some tarts
+    will produce a parse error due to the comma which
+    is not a valid TERM.
+    Query2:
+    > "The Queen of Hearts" and "she made some tarts"
+    will store a post-processing string
+    of ''The Queen of Hearts" and "she made some tarts'' and
+    will have a main boolean query of the empty string.
+    This is because the postprocessing string takes in
+    everything between the first quote and the last one.
+    An empty string is illegal for the boolean grammar and
+    hence a parse error.
+  The problem stems from the fact that the processing of
+  the parse tree is carried out, even though we have a 
+  parse error. In the case of using an empty string to build
+  a parse tree, it is likely to leave the parse tree undefined.
+SOLUTION
+  As soon as we find out that there is a parse-error,
+  we abandon any processing of the parse tree.
+FILES
+ *   query.bool.y
+ *   query.bool.c (generated from query.bool.y)
+*************************************************************
+TITLE
+  Perfect hashing on small vocab
+APPLICATION
+  mg-1
+TYPE
+  bug
+REPORT
+  tes@kbs.citri.edu.au - July 1994
+FIX
+  alistair@cs.mu.oz.au - July 1994
+CLAIM
+  Mg could not handle small collections in the case
+  where there was only a small number of unique words.
+  The perfect hash function would report an error.
+PROBLEM
+  Rounding of the arithmetic during the calculation of the
+  parameters of the perfect hash function was resulting in a
+  combination of values such that the probability of a hash
+  function being found was very small. This led to the limit
+  on the generation loop being exceeded, and eventual
+  failure.
+SOLUTION
+  By using ceiling rather than floor when converting from a
+  floating point value to an integer parameter, the arithmetic
+  is now correct for all lexicon sizes, and the probability of
+  each iteration successfully generating a hash function is
+  sufficiently great that with _very_ high probability the
+  execution loop counter will not be exceeded unless there
+  genuinely is no hash function (for example, if the lexicon
+  contains two words the same there cannot be  a hash
+  function).
+FILES
+ *   perf_hash.c
+*************************************************************
Index: /main/tags/2.38/gsdl/packages/mg/SampleData/Makefile
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/SampleData/Makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/SampleData/Makefile	(revision 21083)
@@ -0,0 +1,4 @@
+DISTFILES = Makefile alice13a.txt.Z MODIFICATIONS 
+
+dist:
+	ln $(DISTFILES) $(distdir)
Index: /main/tags/2.38/gsdl/packages/mg/about_mg.html
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/about_mg.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/about_mg.html	(revision 21083)
@@ -0,0 +1,75 @@
+<HTML>
+<HEAD>
+<TITLE>About MG</TITLE>
+</HEAD>
+<BODY>
+<H1>About MG</H1>
+ 
+<HR SIZE=4>
+
+MG is a public domain
+indexing and retrieval system for text, images, and textual images.
+MG is covered by a 
+<a href="http://deimos.kbs.citri.edu.au/mg/intro/copying.html">GNU 
+public licence</a>.
+<P>
+MG is available for ftp <a href="ftp://munnari.oz.au/pub/mg">here</a>
+
+<H2>Developers</H2>
+
+The MG system is an embodiment of ideas developed primarily by:
+<ul>
+<li> <a href="http://www.cosc.canterbury.ac.nz/~tim">Tim C. Bell</a>,
+	University of Canterbury;
+<li> <a href="http://www.cs.mu.oz.au/~alistair">Alistair Moffat</a>,
+	University of Melbourne;
+<li> <a href="http://www.cs.waikato.ac.nz/~ihw">Ian Witten</a>,
+	University of Waikato; and
+<li> <a href="http://www.cs.rmit.edu.au/~jz">Justin Zobel</a>,
+	RMIT.
+</ul>
+
+<H2>Programmers</H2>
+
+The bulk of the programming work has been undertaken by:
+<ul>
+<li><A HREF="http://www.cs.waikato.ac.nz/~singlis/">Stuart Inglis</A>,
+       University of Waikato;
+<li><A HREF="http://www.cs.waikato.ac.nz/~cgn/">Craig Nevill-Manning</A>,
+       University of Waikato;
+<li> Neil Sharman, University of Melbourne; and
+<li> Tim Shimmin, Collaborative Information Technology Research Institute (CITRI).
+</ul>
+A full list of contributors appears
+<A HREF="http://deimos.kbs.citri.edu.au/mg/intro/mgintro.html#xtocid2063010">
+here</a>.
+
+<H2>Institutional Support</H2>
+
+The MG project has been supported by the following organisations:
+<ul>
+<li>	The Australian Research Council;
+<li>	<a HREF="http://www.citri.edu.au/">CITRI</a>, Melbourne;
+<li>	The <a HREF="http://www.cpsc.ucalgary.ca/">University
+		of Calgary</a>, Canada;
+<li>	The <a HREF="http://www.cosc.canterbury.ac.nz/">University
+		of Canterbury</a>, New Zealand;
+<li>	The <a HREF="http://www.cs.mu.oz.au/">University
+		of Melbourne</a>, Australia;
+<li>	<a HREF="http://www.cs.rmit.edu.au/">RMIT</a>, Australia; and
+<li>	The <a HREF="http://www.cs.waikato.ac.nz/">University
+		of Waikato</a>, New Zealand.
+</ul>
+
+<H2>Backpointer</H2>
+
+If you didn't just come from there, the MG home page is accessible
+<a href="http://www.kbs.citri.edu.au/mg/">here</a>.
+
+<HR SIZE=4>
+<ADDRESS>alistair@cs.mu.oz.au</ADDRESS><BR>
+ 
+</BODY>
+</HTML>
+
+
Index: /main/tags/2.38/gsdl/packages/mg/acconfig.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/acconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/acconfig.h	(revision 21083)
@@ -0,0 +1,35 @@
+/* Special definitions for mg, processed by autoheader.
+   Created by [TS:Aug/95] 
+   by grepping for AC_DEFINE on configure.in and using the appropriate defs 
+   of acconfig.h used by GNU tar.
+*/
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define if `union wait' is the type of the first arg to wait functions.  */
+#undef HAVE_UNION_WAIT
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
Index: /main/tags/2.38/gsdl/packages/mg/aclocal.m4
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/aclocal.m4	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/aclocal.m4	(revision 21083)
@@ -0,0 +1,141 @@
+# Local additions to Autoconf macros.
+# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+# François Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# [TS:Aug/95] - chopped out the NLS stuff which I don't support
+
+## ------------------------------- ##
+## Check for function prototypes.  ##
+## ------------------------------- ##
+
+AC_DEFUN(fp_C_PROTOTYPES,
+[AC_REQUIRE([fp_PROG_CC_STDC])
+AC_MSG_CHECKING([for function prototypes])
+if test "$ac_cv_prog_cc_stdc" != no; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(PROTOTYPES)
+  U= ANSI2KNR=
+else
+  AC_MSG_RESULT(no)
+  U=_ ANSI2KNR=ansi2knr
+fi
+AC_SUBST(U)dnl
+AC_SUBST(ANSI2KNR)dnl
+])
+
+## ----------------------------------------- ##
+## ANSIfy the C compiler whenever possible.  ##
+## ----------------------------------------- ##
+
+# @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 defines @code{__STDC__} to 1 and
+# 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{ac_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(fp_PROG_CC_STDC,
+[AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(ac_cv_prog_cc_stdc,
+[ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  AC_TRY_COMPILE(
+[#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+], [int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};],
+[ac_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CFLAGS="$ac_save_CFLAGS"
+])
+AC_MSG_RESULT($ac_cv_prog_cc_stdc)
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+])
+
+## --------------------------------------------------------- ##
+## Use AC_PROG_INSTALL, supplementing it with INSTALL_SCRIPT ##
+## substitution.					     ##
+## --------------------------------------------------------- ##
+
+AC_DEFUN(fp_PROG_INSTALL,
+[AC_PROG_INSTALL
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL} -m 755'
+AC_SUBST(INSTALL_SCRIPT)dnl
+])
+
+## ----------------------------------- ##
+## Check if --with-dmalloc was given.  ##
+## ----------------------------------- ##
+
+# I just checked, and GNU rx seems to work fine with a slightly
+# modified GNU m4.  So, I put out the test below in my aclocal.m4,
+# and will try to use it in my things.  The idea is to distribute
+# rx.[hc] and regex.[hc] together, for a while.  The WITH_REGEX symbol
+# (which should also be documented in acconfig.h) is used to decide
+# which of regex.h or rx.h should be included in the application.
+#
+# If `./configure --with-regex' is given, the package will use
+# the older regex.  Else, a check is made to see if rx is already
+# installed, as with newer Linux'es.  If not found, the package will
+# use the rx from the distribution.  If found, the package will use
+# the system's rx which, on Linux at least, will result in a smaller
+# executable file.
+
+AC_DEFUN(fp_WITH_DMALLOC,
+[AC_MSG_CHECKING(if malloc debugging is wanted)
+AC_ARG_WITH(dmalloc,
+[  --with-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz],
+[if test "$withval" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(WITH_DMALLOC)
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  AC_MSG_RESULT(no)
+fi], [AC_MSG_RESULT(no)])
+])
+
+## --------------------------------- ##
+## Check if --with-regex was given.  ##
+## --------------------------------- ##
+
+AC_DEFUN(fp_WITH_REGEX,
+[AC_MSG_CHECKING(which of rx or regex is wanted)
+AC_ARG_WITH(regex,
+[  --with-regex            use older regex in lieu of GNU rx for matching],
+[if test "$withval" = yes; then
+  ac_with_regex=1
+  AC_MSG_RESULT(regex)
+  AC_DEFINE(WITH_REGEX)
+  LIBOBJS="$LIBOBJS regex.o"
+fi])
+if test -z "$ac_with_regex"; then
+  AC_MSG_RESULT(rx)
+  AC_CHECK_FUNC(re_rx_search, , [LIBOBJS="$LIBOBJS rx.o"])
+fi
+AC_SUBST(LIBOBJS)dnl
+])
Index: /main/tags/2.38/gsdl/packages/mg/build_options.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/build_options.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/build_options.in	(revision 21083)
@@ -0,0 +1,2 @@
+set stem_method = 3
+set do_indexes = 1
Index: /main/tags/2.38/gsdl/packages/mg/config.guess
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/config.guess	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/config.guess	(revision 21083)
@@ -0,0 +1,470 @@
+#!/bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# 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).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@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
+
+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:V*:*)
+	# After 1.2, OSF1 uses "V1.3" for uname -r.
+	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	# 1.2 uses "1.2" for uname -r.
+	echo alpha-dec-osf${UNAME_RELEASE}
+        exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    Pyramid*:OSx*:*:*)
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    sun4*:SunOS:5.*:*)
+	echo sparc-sun-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:*:*)
+	# 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 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:5*:RISCos)
+	echo mips-mips-riscos${UNAME_RELEASE}
+	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:*:*)
+	if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+	     -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	else
+		echo m88k-dg-dguxbcs${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${UNAME_RELEASE}
+	exit 0 ;;
+    i[34]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-cc} 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)
+	if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1
+	elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1.1
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    *: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/[3478]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/7?? | 9000/8?7 ) HP_ARCH=hppa1.1 ;;
+	    9000/8?? )            HP_ARCH=hppa1.0 ;;
+	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-cc} 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?7:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?7:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	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:UNICOS:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:UNICOS:*:*)
+	echo ymp-cray-unicos
+        exit 0 ;;
+    CRAY-2:UNICOS:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+	echo m68k-hp-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i[34]86:BSD/386:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	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 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+# 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[34]86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i[34]86:*:4.*:* | i[34]86:SYSTEM_V:4.*:*)
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i[34]86:*:3.2:*)
+	if /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
+		echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
+	elif test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-unknown-isc$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv32
+	fi
+	exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-unknown-mach3
+	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 ;;
+    M680[234]0:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4.3 && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m680[234]0:LynxOS:2.2*:*)
+	echo m68k-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i[34]86:LynxOS:2.2*:*)
+	echo i386-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.2*:*)
+	echo sparc-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.2*:*)
+	echo rs6000-lynx-lynxos${UNAME_RELEASE}
+	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 ;;
+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
+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
+  printf ("m68k-sony-newsos\n"); 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`;
+  printf ("%s-next-nextstep%s\n", __ARCHITECTURE__,  version==2 ? "2" : "3");
+  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-unknown-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_)
+  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-cc} 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
Index: /main/tags/2.38/gsdl/packages/mg/config.h.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/config.h.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/config.h.in	(revision 21083)
@@ -0,0 +1,171 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* 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 don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+#undef _POSIX_1_SOURCE
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* 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 you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
+
+/* Define if you have the ftime function.  */
+#undef HAVE_FTIME
+
+/* Define if you have the ftruncate function.  */
+#undef HAVE_FTRUNCATE
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the getrusage function.  */
+#undef HAVE_GETRUSAGE
+
+/* Define if you have the mallinfo function.  */
+#undef HAVE_MALLINFO
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the setbuffer function.  */
+#undef HAVE_SETBUFFER
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strftime function.  */
+#undef HAVE_STRFTIME
+
+/* Define if you have the strstr function.  */
+#undef HAVE_STRSTR
+
+/* Define if you have the strtol function.  */
+#undef HAVE_STRTOL
+
+/* Define if you have the times function.  */
+#undef HAVE_TIMES
+
+/* Define if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define if you have the <dirent.h> header file.  */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <memory.h> header file.  */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <ndir.h> header file.  */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/dir.h> header file.  */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/ndir.h> header file.  */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/procfs.h> header file.  */
+#undef HAVE_SYS_PROCFS_H
+
+/* Define if you have the <sys/time.h> header file.  */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the m library (-lm).  */
+#undef HAVE_LIBM
Index: /main/tags/2.38/gsdl/packages/mg/config.sub
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/config.sub	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/config.sub	(revision 21083)
@@ -0,0 +1,793 @@
+#!/bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 1992, 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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
+# It is wrong to echo any other type of specification.
+
+# 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 (if any).
+basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+if [ $basic_machine != $1 ]
+then os=`echo $1 | sed 's/.*-/-/'`
+else os=; fi
+
+### 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 )
+		os=
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-lynx)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+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 | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm | pyramid \
+		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
+		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
+		| powerpc | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
+		| pdp11 | mips64el | mips64orion | mips64orionel )
+		basic_machine=$basic_machine-unknown
+		;;
+	# 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.
+	vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+	      | pdp11-* | sh-* | powerpc-* | sparc64-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* )
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	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
+		;;
+	amigados)
+		basic_machine=m68k-cbm
+		os=-amigados
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	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
+		;;
+	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
+		;;
+	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
+		;;
+	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
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[345]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv32
+		;;
+	i[345]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv4
+		;;
+	i[345]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv
+		;;
+	i[345]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-solaris2
+		;;
+	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
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	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
+		;;
+	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
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	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-*)
+		# We will change tis to say i586 once there has been
+		# time for various packages to start to recognize that.
+		basic_machine=i486-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	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
+		;;
+	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
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	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.
+	mips)
+		basic_machine=mips-mips
+		;;
+	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)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	*)
+		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
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux|'`
+		;;
+	# 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[345]* \
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
+	      | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
+	      | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+	      | -ptx* | -coff* | -winnt*)
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-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
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigados
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-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
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	*)
+		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
+				;;
+			-lynxos*)
+				vendor=lynx
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
Index: /main/tags/2.38/gsdl/packages/mg/configure
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/configure	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/configure	(revision 21083)
@@ -0,0 +1,3073 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12 
+# 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-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz"
+ac_help="$ac_help
+  --with-regex            use older regex in lieu of GNU rx for matching"
+
+# 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=
+# 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.12"
+    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=src/text/mgquery.c
+
+# 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 $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@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
+
+
+
+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,"
+
+
+PACKAGE=mg
+VERSION=1.3e
+
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++
+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:567: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+  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
+      ac_cv_prog_CXX="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+  echo "$ac_t""$CXX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:598: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 608 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:612: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  ac_cv_prog_cxx_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_cxx_cross=no
+  else
+    ac_cv_prog_cxx_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cxx_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 $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_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 ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:638: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:643: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.C <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:652: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gxx=yes
+else
+  ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+  GXX=yes
+  ac_test_CXXFLAGS="${CXXFLAGS+set}"
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS=
+  echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:667: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+  ac_cv_prog_cxx_g=yes
+else
+  ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+  if test "$ac_test_CXXFLAGS" = set; then
+    CXXFLAGS="$ac_save_CXXFLAGS"
+  elif test $ac_cv_prog_cxx_g = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-O2"
+  fi
+else
+  GXX=
+  test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+
+for ac_prog in mawk gawk nawk awk
+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:699: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # Let the user override the test.
+else
+  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
+      ac_cv_prog_AWK="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+for ac_prog in 'bison -y' byacc
+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:732: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # Let the user override the test.
+else
+  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
+      ac_cv_prog_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+# 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:764: 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="${IFS}:"
+  for ac_dir in $PATH; 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:793: 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="${IFS}:"
+  ac_prog_rejected=no
+  for ac_dir in $PATH; 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
+
+  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:841: 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 $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 851 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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*
+
+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:875: 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:880: 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:889: \"$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
+  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:904: 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
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-O2"
+  fi
+else
+  GCC=
+  test "${CFLAGS+set}" = set || CFLAGS="-g"
+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
+# 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:961: 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="${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.
+      for ac_prog in ginstall installbsd 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.
+	    # OSF/1 installbsd also uses dspmsg, but is usable.
+	    :
+	  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_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1011: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+  rm -f conftestdata
+  ac_cv_prog_LN_S="ln -s"
+else
+  ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1032: 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
+
+# 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:1061: 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="${IFS}:"
+  for ac_dir in $PATH; 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 how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1089: 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 1104 "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:1110: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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 1121 "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:1127: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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*
+  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 AIX""... $ac_c" 1>&6
+echo "configure:1150: checking for AIX" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1152 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6
+fi
+rm -f conftest*
+
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1174: 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
+
+ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6
+echo "configure:1196: checking for minix/config.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 1201 "configure"
+#include "confdefs.h"
+#include <minix/config.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1206: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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
+  MINIX=yes
+else
+  echo "$ac_t""no" 1>&6
+MINIX=
+fi
+
+if test "$MINIX" = yes; then
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _POSIX_1_SOURCE 2
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _MINIX 1
+EOF
+
+fi
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1244: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 1260 "configure"
+#include "confdefs.h"
+#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+
+int main() {
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+; return 0; }
+EOF
+if { (eval echo configure:1272: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_prog_cc_stdc="$ac_arg"; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_stdc" 1>&6
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+
+echo $ac_n "checking for function prototypes""... $ac_c" 1>&6
+echo "configure:1293: checking for function prototypes" >&5
+if test "$ac_cv_prog_cc_stdc" != no; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define PROTOTYPES 1
+EOF
+
+  U= ANSI2KNR=
+else
+  echo "$ac_t""no" 1>&6
+  U=_ ANSI2KNR=ansi2knr
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1307: 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 1312 "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:1361: \"$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 ANSI C header files""... $ac_c" 1>&6
+echo "configure:1382: 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 1387 "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:1395: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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 1412 "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 1430 "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 1451 "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:1462: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./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
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1486: 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 1491 "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 "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:1519: 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 1524 "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 "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
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:1552: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1557 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:1566: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_time=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
+echo "configure:1587: checking whether struct tm is in sys/time.h or time.h" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1592 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <time.h>
+int main() {
+struct tm *tp; tp->tm_sec;
+; return 0; }
+EOF
+if { (eval echo configure:1600: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm=time.h
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm" 1>&6
+if test $ac_cv_struct_tm = sys/time.h; then
+  cat >> confdefs.h <<\EOF
+#define TM_IN_SYS_TIME 1
+EOF
+
+fi
+
+
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+cat > conftest.$ac_ext <<EOF
+#line 1623 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+
+int main() {
+ FILE *rubbish = popen("yes", "r"); 
+; return 0; }
+EOF
+if { (eval echo configure:1631: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'
+fi
+rm -f conftest*
+fi
+
+
+echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:1644: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'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="-lm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1652 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1692: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1697 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1705: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$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
+ ac_header_dirent=$ac_hdr; break
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1730: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | 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="-ldir  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1738 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1749: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 -ldir"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1771: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | 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="-lx  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1779 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1790: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 -lx"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1813: 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 1818 "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:1826: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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 1843 "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 1861 "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 1882 "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:1893: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./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
+
+for ac_hdr in fcntl.h limits.h sys/time.h unistd.h string.h memory.h sys/procfs.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1920: 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 1925 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1930: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+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
+
+cat > conftest.$ac_ext <<EOF
+#line 1957 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fread" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FREAD_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 1972 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fgetc" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FGETC_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 1987 "configure"
+#include "confdefs.h"
+#include <sys/procfs.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "pr_brksize" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_PR_BRKSIZE 1
+EOF
+
+fi
+rm -f conftest*
+
+
+# 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:2005: 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 2010 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2017: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:2038: 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 2043 "configure"
+#include "confdefs.h"
+
+#ifdef __GNUC__
+# define alloca __builtin_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
+
+int main() {
+char *p = (char *) alloca(1);
+; return 0; }
+EOF
+if { (eval echo configure:2066: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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.o
+  cat >> confdefs.h <<\EOF
+#define C_ALLOCA 1
+EOF
+
+
+echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
+echo "configure:2098: 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 2103 "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:2128: 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 2133 "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:2156: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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:2183: 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 2191 "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:2210: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./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
+
+if test $ac_cv_prog_gcc = yes; then
+    echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:2233: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat > conftest.$ac_ext <<EOF
+#line 2239 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+else
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat > conftest.$ac_ext <<EOF
+#line 2257 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+  fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:2279: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2284 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:2301: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+echo "configure:2320: checking for vprintf" >&5
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2325 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char vprintf(); 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 vprintf();
+
+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_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2348: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+echo "configure:2372: checking for _doprnt" >&5
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2377 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt(); 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 _doprnt();
+
+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__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2400: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+for ac_func in ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2427: 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 2432 "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:2455: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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 ftruncate strstr strcasecmp
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2482: 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 2487 "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:2510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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}.o"
+fi
+done
+
+
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+echo $ac_n "checking for HP-UX needing gmalloc""... $ac_c" 1>&6
+echo "configure:2541: checking for HP-UX needing gmalloc" >&5
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  echo "$ac_t""yes" 1>&6
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  cat >> confdefs.h <<\EOF
+#define HAVE_VALLOC 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+  for ac_func in valloc
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2554: 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 2559 "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:2582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; 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
+
+echo $ac_n "checking if malloc debugging is wanted""... $ac_c" 1>&6
+echo "configure:2609: checking if malloc debugging is wanted" >&5
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  if test "$withval" = yes; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_DMALLOC 1
+EOF
+
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  echo "$ac_t""no" 1>&6
+fi
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking which of rx or regex is wanted""... $ac_c" 1>&6
+echo "configure:2630: checking which of rx or regex is wanted" >&5
+# Check whether --with-regex or --without-regex was given.
+if test "${with_regex+set}" = set; then
+  withval="$with_regex"
+  if test "$withval" = yes; then
+  ac_with_regex=1
+  echo "$ac_t""regex" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_REGEX 1
+EOF
+
+  LIBOBJS="$LIBOBJS regex.o"
+fi
+fi
+
+if test -z "$ac_with_regex"; then
+  echo "$ac_t""rx" 1>&6
+  echo $ac_n "checking for re_rx_search""... $ac_c" 1>&6
+echo "configure:2648: checking for re_rx_search" >&5
+if eval "test \"`echo '$''{'ac_cv_func_re_rx_search'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2653 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char re_rx_search(); 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 re_rx_search();
+
+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_re_rx_search) || defined (__stub___re_rx_search)
+choke me
+#else
+re_rx_search();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2676: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'re_rx_search`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+LIBOBJS="$LIBOBJS rx.o"
+fi
+
+fi
+
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+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) 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.12"
+    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/text/Makefile src/images/Makefile 
+          src/scripts/Makefile lib/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%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%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%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@CXX@%$CXX%g
+s%@AWK@%$AWK%g
+s%@YACC@%$YACC%g
+s%@CC@%$CC%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@LN_S@%$LN_S%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@RANLIB@%$RANLIB%g
+s%@CPP@%$CPP%g
+s%@U@%$U%g
+s%@ANSI2KNR@%$ANSI2KNR%g
+s%@ALLOCA@%$ALLOCA%g
+s%@LIBOBJS@%$LIBOBJS%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/text/Makefile src/images/Makefile 
+          src/scripts/Makefile lib/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
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+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
+
Index: /main/tags/2.38/gsdl/packages/mg/configure.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/configure.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/configure.in	(revision 21083)
@@ -0,0 +1,98 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(src/text/mgquery.c)
+AC_CONFIG_HEADER(config.h)
+AC_ARG_PROGRAM
+
+dnl
+PACKAGE=mg
+VERSION=1.2
+
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+dnl Checks for programs.
+AC_PROG_CXX
+AC_PROG_AWK
+AC_PROG_YACC
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_AIX
+AC_ISC_POSIX
+AC_MINIX
+fp_C_PROTOTYPES
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+AC_STRUCT_TM
+
+dnl --- This should be in the stdc checking -----------------
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+dnl The Pyramids running SMP_DC.OSx on MIPS r3000 chips with
+dnl /usr/opt/cc3.11/bin/cc treat -Xc as full ANSI mode - no POSIX or
+dnl XOPEN extensions (like popen).
+dnl Unfortunately -D_{XOPEN,POSIX}_SOURCE can't provide all that mg
+dnl needs. So drop back to -Xa
+AC_TRY_COMPILE(
+[#include <stdio.h>
+], [ FILE *rubbish = popen("yes", "r"); ],,
+[CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'])
+fi
+dnl ----------------------
+
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lm:
+AC_CHECK_LIB(m, main)
+
+dnl Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h limits.h sys/time.h unistd.h string.h memory.h sys/procfs.h)
+AC_EGREP_HEADER(fread, stdio.h, AC_DEFINE(HAVE_FREAD_DECL))
+AC_EGREP_HEADER(fgetc, stdio.h, AC_DEFINE(HAVE_FGETC_DECL))
+AC_EGREP_HEADER(pr_brksize, sys/procfs.h, AC_DEFINE(HAVE_PR_BRKSIZE))
+
+dnl Checks for library functions.
+AC_FUNC_ALLOCA
+AC_PROG_GCC_TRADITIONAL
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize)
+AC_REPLACE_FUNCS(ftruncate strstr strcasecmp)
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+AC_MSG_CHECKING(for HP-UX needing gmalloc)
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  AC_MSG_RESULT(yes)
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  AC_DEFINE(HAVE_VALLOC)
+else
+  AC_MSG_RESULT(no)
+  AC_CHECK_FUNCS(valloc)
+fi
+
+fp_WITH_DMALLOC
+fp_WITH_REGEX
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+dnl    support functions for alloca.c
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+
+# ---------------------------------------------------------------------------
+
+AC_OUTPUT([Makefile src/text/Makefile src/images/Makefile 
+          src/scripts/Makefile lib/Makefile ], 
+[test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h])
Index: /main/tags/2.38/gsdl/packages/mg/docs/Makefile
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/Makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/Makefile	(revision 21083)
@@ -0,0 +1,5 @@
+DISTFILES = Makefile mgmerge.README mg_invf_dump.changes \
+  README.man mg.1 mgintro.1 mgintro++.1
+
+dist:
+	ln $(DISTFILES) $(distdir)
Index: /main/tags/2.38/gsdl/packages/mg/docs/README.man
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/README.man	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/README.man	(revision 21083)
@@ -0,0 +1,1 @@
+The rest of the man files are in the respective src directories.
Index: /main/tags/2.38/gsdl/packages/mg/docs/mg.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/mg.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/mg.1	(revision 21083)
@@ -0,0 +1,462 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg 1 \*(Dt CITRI
+.\"=====================================================================
+.\" Author:
+.\"     Nelson H. F. Beebe
+.\"     Center for Scientific Computing
+.\"     Department of Mathematics
+.\"     University of Utah
+.\"     Salt Lake City, UT 84112
+.\"     USA
+.\"     Email: beebe@math.utah.edu (Internet)
+.\"=====================================================================
+.if t .ds Bi B\s-2IB\s+2T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
+.if n .ds Bi BibTeX
+.if t .ds Te T\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X
+.if n .ds Te TeX
+.\"=====================================================================
+.SH NAME
+mg \- full-text inverted index support
+.\"=====================================================================
+.SH DESCRIPTION
+.B mg
+is a suite of programs that can be used to create
+and query full-text inverted indexes for a
+collection of documents.
+.PP
+An inverted index is essentially a list of
+pointers to occurrences of every word in a
+collection of documents, so that, for example, in
+a collection of Shakespeare's works, one can pose
+questions like
+.I "How often is a fool mentioned in the plays?"
+and
+.I "Are Romeo and Juliet ever mentioned in the same sentence?"
+While search utilities like the UNIX
+.BR grep (1)
+family can be used for simple queries, they suffer
+from several limitations:
+.TP \w'\(bu'u+2n
+\(bu
+Each invocation requires a separate pass over the
+documents, which becomes impossibly slow if the
+document collection is very large.
+.TP
+\(bu
+It is difficult to compose Boolean queries like
+.IR "Caesar AND Brutus AND NOT Antony" .
+.TP
+\(bu
+They provide no mechanism for ranking matches
+according to importance, which is extremely
+important when queries are complex and numerous
+matches are found.
+.TP
+\(bu
+They provide no mechanism for displaying
+surrounding context (although the Free Software
+Foundation
+implementations for the GNU Project remedy this
+with their
+.BI \-A " num"
+(after)
+and
+.BI \-B " num"
+(before)
+switches).
+.TP
+\(bu
+They provide no mechanism for searching for
+occurrences in the same paragraph, unless
+preprocessing is done on the files to wrap
+paragraphs into long lines.  Even that will often
+fail, because input buffer sizes may be limited to
+a few hundred characters.
+.TP
+\(bu
+They provide no easy way to deal with grammatical
+word-ending variants, except by explicit
+enumeration, such as searching for
+.IR compress ,
+.IR compressed ,
+.IR compresses ,
+.IR compressing ,
+and
+.IR compression .
+.PP
+Most computer users have been faced with the
+problem of finding information from a large
+collection of files, such as electronic mail,
+on-line documentation, or source code.  Inverted
+indices provide a highly-effective solution to
+this problem.
+.PP
+The
+.B mg
+software is described in Appendix A of the book
+.RS
+.nf
+Ian H. Witten, Alistair Moffat, and Timothy C. Bell
+.I "Managing Gigabytes: Compressing and Indexing Documents and Images"
+Van Nostrand Reinhold
+1994
+xiv + 429 pages
+US$54.95
+ISBN 0-442-01863-0
+Library of Congress catalog number TA1637 .W58 1994
+.fi
+.RE
+.PP
+Many of the algorithms implemented in
+.B mg
+represent significant advances over previous work,
+both in speed, and in storage requirements.  On a
+fast workstation, in tens of minutes, or a few
+hours,
+.BR mgbuild (1)
+can create an index to
+.I all
+of the words in hundreds of thousands of documents
+occupying hundreds of megabytes, or even more than
+a gigabyte, of disk space.
+.BR mgquery (1)
+can then be used to answer complex queries, with
+responses often returned in a second or less.
+.B mg
+also contains algorithms to deal with images, so
+that with a small amount of descriptive text for
+each image, it is possible to do searches in
+collections of images, and to have retrievals
+display the images using a viewer like
+.BR xv (1).
+.PP
+.B mg
+can deal with compressed text and image files and
+surprisingly, it usually runs faster than it would
+if the files were not compressed!  Thus, the
+considerable disk space savings possible from
+file compression are not lost because of the need
+for fast document search and retrieval.
+.PP
+The Free Software Foundation GNU Project
+compression utilities
+.BR gzip (1)
+and
+.BR gunzip (1)
+are recommended for general use over older
+alternatives, like
+.BR compress (1),
+because of their speed and high compression
+ratios.
+.\"=====================================================================
+.SH AVAILABILITY
+The
+.B mg
+software can be obtained via anonymous ftp to the
+Australian archive host
+.I "munnari.oz.au [128.250.1.21]"
+from the directory
+.IR "/pub/mg" .
+.\"=====================================================================
+.SH "TYPICAL USE OF mg"
+Although
+.B mg
+consists of more than 20 separate programs, many
+of which have complicated command-line options,
+take heart: most users require only two or three
+of these programs, and nothing more than a
+document name on the command line.
+.PP
+A
+.I document
+for
+.B mg
+is a fragment of text suitable for retrieval as a
+unit when it is found to contain a requested word,
+or words.  In a collection of poetry, a document
+might be a stanza, while in a novel, it could be a
+paragraph.  In an index of first lines of poems, a
+document would likely be just a single line.
+.PP
+Just what constitutes a document is decided by a
+user-modifiable UNIX shell script,
+.BR mg_get (1).
+The default script provided with the
+.B mg
+source distribution knows about these named
+document collections:
+.TP \w'mailfiles'u+2n
+.I alice
+Lewis Carroll's
+.I "Alice in Wonderland"
+book.
+.TP
+.I allfiles
+all mail files in the directory tree
+.IR $HOME/Mail ,
+including all of its nested subdirectories.
+.TP
+.I mailfiles
+individual mail messages in
+.IR $HOME/mbox
+and
+.IR $HOME/.sentmail.
+.TP
+.I davinci
+A small collection of text and images from the
+work of Leonardo da Vinci.
+.PP
+A document collection name is used by
+.B mg
+as a
+.BR csh (1)
+.I case
+statement selector, and as a subdirectory name in the
+.B $MGDATA
+directory, or the current directory, if
+.B MGDATA
+is not defined.
+.\"=====================================================================
+.SH "EXTENDING mg_get"
+This section describes how to extend
+.BR mg_get (1)
+to handle a new document collection.
+.PP
+Let us take two examples: all \*(Bi
+.I .bib
+files, and all \*(Te files, contained in
+subdirectories under the login directory.
+.PP
+For \*(Bi, each bibliographic entry will be
+considered a separate document.  In order to
+facilitate easy identification of entries, we
+shall require them to begin at the start of a
+line; the
+.BR bibclean (1)
+utility can be used to standardize the format of
+.I .bib
+files, and to validate their string values, so
+that this requirement is met.
+.PP
+For \*(Te, each paragraph will be a separate
+document, and we assume that paragraphs are
+separated by blank lines.  We assume that files
+with extensions
+.IR .atx ,
+.IR .ltx ,
+.IR .stx ,
+and
+.I .tex
+contain input to common \*(Te macro package
+variants.
+.PP
+Make a personal copy of the
+.I mg_get
+script, using the one in the
+.B mg
+source distribution
+.RI ( mg-1.0/mg/mg_get.sh ),
+or the one in the local binary program directory,
+at many sites called
+.IR /usr/local/bin/mg_get .
+.PP
+Examination of the
+.I mg_get
+script shows that each document collection name is
+used in a
+.BR csh (1)
+.I case
+statement selector, and that most of work is done
+by very simple
+.BR awk (1)
+programs that extract documents from files.  In
+your private copy of the
+.I mg_get
+file, after the line
+.PP
+.nf
+  breaksw #davinci
+.fi
+.PP
+and before the line
+.PP
+.nf
+  default:
+.fi
+.PP
+insert this new code:
+.PP
+.nf
+  case bibfiles:
+# Takes a list of files that contain BibTeX entries, and splits them up
+#   by putting ^B after each entry. Assumes that each entry
+#   begins with a line '^@'.
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text':
+      find $HOME -name '*.bib' -print | \e
+        sort | \e
+        xargs -l100 awk \e
+          '/^@/&&NR!=1{print "^B"} {print $0} END{print "^B"}'
+    breaksw #-text
+
+    case '-cleanup':
+    breaksw #-cleanup
+
+  endsw #flag
+  breaksw #bibfiles
+
+  case texfiles:
+# Takes a list of TeX files and split them up
+#   by putting ^B after each paragraph. Assumes that each entry
+#   begins with a line '^@'.
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text':
+      find $HOME -name '*x' -print | \e
+        egrep '[.]tex$|[.]ltx$|[.]atx$|[.]stx$' | \e
+        sort | \e
+        xargs -l100 nawk '   /^ *$/ {if (b!=1) printf "^B";b=1} \e
+            \e!/^ *$/ {print;b=0} \e
+            END {printf "^B"}'
+    breaksw #-text
+
+    case '-cleanup':
+    breaksw #-cleanup
+
+  endsw #flag
+  breaksw #texfiles
+.fi
+.PP
+The ^B characters here are Control-B characters,
+.I not
+caret-B pairs.
+.PP
+If you have a large number of \*(Bi or \*(Te
+files, it is likely that a list of them would be
+too long for the UNIX shell to hold in a single
+variable, or on a single command line.  Thus,
+instead of storing the output of
+.BR find (1)
+in a variable, we proceed more cautiously, and
+employ it to produce a list of the required files,
+then pipe them to
+.BR xargs (1),
+which in turn passes up to 100 filenames at a time
+to
+.BR nawk (1)
+for document selection.
+.PP
+Install this modified
+.I mg_get
+script in your private directory for executable
+programs (e.g.
+.IR $HOME/bin ),
+create a directory
+.I $HOME/mgdata
+to hold the index, issue a
+.B rehash
+command if you are using
+.BR csh (1)
+or
+.BR tcsh (1),
+ensure that
+.I mg_get
+occurs in your search path
+.I before
+any system-wide one (the command
+.BI which " mg_get"
+will tell you which version will be selected),
+then create the inverted indexes by
+.BI mgbuild " bibfiles"
+and
+.B mgbuild
+.IR texfiles .
+These commands may take several minutes to run if
+you have a lot of \*(Bi or \*(Te files, or a large
+home directory tree.  Once they are complete, you
+can then query the index with the commands
+.BI mgquery " bibfiles"
+and
+.B mgquery
+.IR texfiles .
+These should respond very rapidly.
+.PP
+In order to keep your index up-to-date, you should
+arrange for it to be recreated automatically and
+regularly, probably every night.  You can do this
+with
+.BR cron (1).
+Use the command
+.B "crontab \-e"
+to edit your
+.I crontab
+file and add two lines like this:
+.PP
+.nf
+00 04 * * * mgbuild bibfiles >$HOME/mgdata/bibfiles.log 2>&1
+15 04 * * * mgbuild texfiles >$HOME/mgdata/texfiles.log 2>&1
+.fi
+.PP
+Save the file and exit the editor.  Now, every
+night at 4am and 4:15am,
+.BR mgbuild (1)
+will reconstruct your inverted indexes, and the
+results of the builds will be saved in log files
+in your
+.I $HOME/mgdata
+directory.
+.\"=====================================================================
+.SH "SEE ALSO"
+.na
+.BR awk (1),
+.BR bibclean (1),
+.BR bibtex (1),
+.BR compress (1),
+.BR csh (1),
+.BR grep (1),
+.BR gunzip (1),
+.BR gzip (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1),
+.BR nawk (1),
+.BR tcsh (1),
+.BR tex (1),
+.BR xargs (1),
+.BR xmg (1),
+.BR xv (1).
+.\"=====================================================================
+.\" This is for GNU Emacs file-specific customization:
+.\" Local Variables:
+.\" fill-column: 50
+.\" End:
Index: /main/tags/2.38/gsdl/packages/mg/docs/mgintro++.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/mgintro++.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/mgintro++.1	(revision 21083)
@@ -0,0 +1,212 @@
+.\"------------------------------------------------------------  
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4 
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.ds r \&\s-1MG\s0
+.if n .ds - \%--
+.if t .ds - \(em
+.\"------------------------------------------------------------  
+.am SS
+.LP
+..
+.\"------------------------------------------------------------
+.TH MGINTRO++ 1 \*(Dt CITRI
+.\"--------------------------------------------------------------
+.SH NAME
+mgintro++ \- extended introduction to the MG system
+.\"-------------------------------------------------------------
+.SH DESCRIPTION
+This manual assumes the reader has already read
+.BR mgintro (1).
+.\"-------------------------------------------------------------
+.SS Creating Different Databases
+If a user wants to build databases other than for some
+predefined ones, such as "alice", "davinci", "mailfiles", "allfiles",
+then the user has a couple of choices.
+Ultimately (s)he must produce a text file with control-Bs 
+terminating the documents. 
+To do this one can produce one or more such files, or write a
+"get" command (typically in the form of a script or c program).
+.\"-------------------------------------------------------------
+.SS Using Input Files for mgbuild
+If you don't want to write a "get" script and just want to use
+one or more text files as input, then you must first generate
+the file with control-Bs. For a simple example, you could take
+any text file(s) such as "test1.txt" and "test2.txt", and use 
+.BR vi (1)
+to insert control-Bs by typing "control-V b".
+Next you should create a file with "set" statements 
+in the following form:
+.PP
+.IP
+\fBset pipe = 0 # do not use pipe - use file instead 
+.br
+\fBset input_files = 'test1.txt test2.txt'
+.LP
+Let's call this file, "build_options".
+Now issue the command:
+.IP
+.B mgbuild -s build_options test
+.LP
+This should build a database called "test" in the $MGDATA directory,
+based on the source data of "test1.txt" and "test2.txt".
+The build_options file is simply sourced by 
+.BR mgbuild (1)
+after it has set up its variables. 
+Therefore, any settings one makes in the
+build_options file will override the standard settings.
+See 
+.BR mgbuild (1) 
+for more information.
+.\"-------------------------------------------------------------
+.SS Writing A Get Program
+Instead of using files as input, it is often more convenient to 
+write a "get" program. This program is called by 
+.BR mgbuild (1)
+to get the text data with control-Bs as document terminators.
+It should take three options:
+.br
+(i) -init; (ii) -text; (iii) -cleanup.
+.br
+Get will be called with "init" first and with "cleanup" at the end.
+It will call get with "text" when it wants the text and it should
+write the text to stdout.
+.br
+See 
+.BR mg_get (1)
+for an example.
+.\"-------------------------------------------------------------
+.SS Regular Builds
+The MG system provides a static database; 
+there are no update commands.
+So if one wants to keep one's database reasonably up-to-date
+then one can have this done automatically on a regular basis by 
+.BR cron (1).
+A crontab file can be created using:
+crontab -e
+A crontab file contains lines of the form:
+.nf
+.IP
+\fBminute hour day-of-month month day-of-week shell-command.
+.LP
+.fi
+See
+.BR crontab (1)
+for more information.
+.nf
+An example crontab entry is:
+.IP
+\fB15 02 * * * mgbuild allfiles >$MGDATA/allfiles/allfiles.log 2>&1
+.LP
+.fi
+This will build up the mg database for "allfiles", your mail in
+the folders, every morning at 2:15am. 
+.\"
+.\"-------------------------------------------------------------
+.SS Command Structure
+There are 22 commands that make up the mg system. However,
+a user may only need to be aware of a few: 
+.BR mgbuild (1),
+.BR mgquery (1), 
+and perhaps
+.BR mg_get (1). 
+Many of the commands are called by 
+.BR mgbuild(1).
+The commands can be broken up into a hierarchy.
+.PP
+--------------------------------------
+.br
+MG--+--image compression
+    |  |
+    |  +--mgbilevel
+    |  |
+    |  +--mgfelics
+    |  |
+    |  +--mgtic
+    |  |
+    |  +--mgticbuild
+    |  |
+    |  +--mgticdump
+    |  |
+    |  +--mgticprune
+    |  |
+    |  +--mgticstat
+    |
+    +--text 
+       |
+       +--compression
+       |  |
+       |  +--mg_passes -T1
+       |  |
+       |  +--mg_passes -T2
+       |  |
+       |  +--mg_compression_dict
+       |  |
+       |  +--mg_fast_comp_dict
+       |
+       +--indexing
+       |  |
+       |  +--mg_passes -N1
+       |  |
+       |  +--mg_passes -N2
+       |  |
+       |  +--mg_perf_hash_build
+       |  |
+       |  +--mg_invf_dict
+       |  |
+       |  +--mg_invf_rebuild
+       |  
+       +--weights
+       |  |
+       |  +--mg_weights_build
+       |
+       +--query
+       |  |
+       |  +--mgquery
+       |
+       +--tools
+          |
+          +--mg_invf_dump
+          |
+          +--mg_text_estimate
+          |
+          +--mgdictlist
+          |
+          +--mgstat
+.br
+--------------------------------------
+.PP
+.nf
+.BR mgbuild (1)
+calls the following commands:
+.RS
+.BR mg_passes (1), mg_compression_dict (1)
+.BR mg_perf_hash_build (1), mg_invf_dict (1), mg_invf_rebuild (1)
+.BR mg_weights_build (1)
+.RE
+.fi
+.\"--------------------------------------------
+.SH SEE ALSO
+.BR mgintro (1),
+.BR mgbuild (1),
+.BR mg_get (1)
+.br
+"Guide To The \*r System", in Appendix A of the book:
+.PP
+.RS
+.nf
+Ian H. Witten, Alistair Moffat, and Timothy C. Bell
+.I "Managing Gigabytes: Compressing and Indexing Documents and Images"
+Van Nostrand Reinhold
+1994
+xiv + 429 pages
+US$54.95 
+ISBN 0-442-01863-0
+Library of Congress catalog number TA1637 .W58 1994.
+.fi
+.RE
+
Index: /main/tags/2.38/gsdl/packages/mg/docs/mgintro.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/mgintro.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/mgintro.1	(revision 21083)
@@ -0,0 +1,155 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.ds r \&\s-1MG\s0
+.if n .ds - \%--
+.if t .ds - \(em
+.\"------------------------------------------------------------
+.am SS
+.LP
+..
+.\"------------------------------------------------------------
+.TH MGINTRO 1 \*(Dt CITRI
+.\"--------------------------------------------------------------
+.SH NAME
+mgintro \- introduction to the MG system
+.\"--------------------------------------------------------------
+.SH DESCRIPTION
+The MG (Managing Gigabytes) system is a collection of
+programs which comprise a full-text retrieval system.
+A full-text retrieval system allows one to create a
+database out of some given documents and then do queries
+upon it to retrieve any relevant documents.
+It is "full-text" in the sense that every word in the
+text is indexed and the query operates only on this index 
+to do the searching.
+.PP
+For example, one could have a database on the book,
+"Alice in Wonderland." A document could be represented by
+each paragraph in the book.
+Having built up the "Alice" database, one could do queries
+such as "cat alice grin" and retrieve any paragraphs which
+match the query. The matching could either be boolean, that
+is the retrieved paragraphs contain a boolean expression of
+the query terms e.g. "cat alice grin"; or the matching
+could be ranked i.e. the most relevant documents to the query
+in relevance order, using some standard heuristic measure.
+.\"--------------------------------------------------------------
+.SS Motivation
+If one wants to find some particular information which
+is stored in a computer text file then one has a few alternative
+courses of action. One can operate directly on the text files
+with utilities such as grep or can process the text files into
+some form of database. Grep is generally limited to identifying
+lines by matching on regular expressions. If the collection 
+of files which grep operates on becomes large, then continual
+passes over the entire text on each query becomes expensive.
+However, its usage is simple as no auxiliary files must be created.
+.PP
+A database consists of some data and indexes into that data. By having
+indexes one can query a large database quickly. Standard databases
+divide the data up into records of fields. This means that the granularity
+of search is a field. In a full-text system, such as \*r,
+there are no fields 
+(or there is an arbitrary sized list of word fields per document) 
+and instead every word is indexed. 
+Using this method, we can except free-form information and yet be fast on searches.
+The next question is what is the overhead of this database.
+In \*r most files which are produced are in a compressed form. The
+two notable compressed files being the given data and the index, called
+an "inverted file". By compressing the files it is possible to have the
+size of the database smaller than the size of the source data.
+.\"--------------------------------------------------------------
+.SS Typical Usage
+The most common use for \*r
+has been as a search database on unix mail files.
+However, any set of text data can be used, one just needs to determine
+what constitutes a document (see 
+.BR mgintro++ (1)
+).
+\*r has also been used on large collections such
+as Comact (Commonwealth Acts of Australia) which is around 132 megabytes 
+and also on sizes up to around 2 gigabytes for TREC 
+(a mixture of collections such as the Wall Street Journal 
+and Associated Press).
+.\"--------------------------------------------------------------
+.SS Getting Started with \*r
+The first thing to do is install the package; 
+please follow the INSTALL instructions.
+Having done this, it is necessary to set a couple of environment variables.
+MGDATA should be set to a directory which is to hold subdirectories for
+each database that you build. For example: 
+.IP
+.B mkdir ~/mgdata; setenv MGDATA ~/mgdata.
+.LP
+If you want to try out building some sample databases then there is
+some sample data such as the "Alice In Wonderland" book. To make sure
+this is accessible you should set the environment variable MGSAMPLE.
+For example: 
+.IP
+.B setenv MGSAMPLE ~/mg/SampleData
+.LP
+Here, "~/mg/SampleData" should contain alice.z .
+.PP
+To build the Alice database (to be contained in $MGDATA/alice subdirectory), 
+type the command 
+.IP
+.B mgbuild alice 
+.LP
+Assuming all went well and some status messages 
+were printed indicating the build was completed, then type 
+.IP
+.B mgquery alice 
+.LP
+to query the database. 
+You can type a few words at the prompt, hit return and
+some relevant documents, Alice paragraphs, should be retrieved.
+Type ".set query ranked" to do ranking queries. Please refer to the 
+.BR mgquery (1)
+man-page for more information on the commands and options of 
+.BR mgquery (1).
+.PP
+The next thing to do is to use \*r
+on a more personal database. If you have
+your mail stored in subdirectories of ~/Mail, such as is done if you use the
+typical set up of 
+.BR elm (1), 
+then type 
+.IP
+.B mgbuild allfiles 
+.LP
+If, however, you keep all your mail in ~/mbox or ~/sentmail, then type 
+.IP
+.B mgbuild mailfiles
+.LP
+.\"--------------------------------------------------------------
+.SH AVAILABILITY
+The \*r software for SunOS 4, Solaris, HPUX, and MIPS,
+can be ftped from: munnari.oz.au [128.250.1.21] in the directory
+/pub/mg. 
+.\"--------------------------------------------------------------
+.SH SEE ALSO
+.na
+.BR mgintro++ (1),
+.BR mgbuild (1),
+.BR mgquery (1)
+.br
+"Guide To The \*r System", in Appendix A of the book:
+.PP
+.RS
+.nf
+Ian H. Witten, Alistair Moffat, and Timothy C. Bell
+.I "Managing Gigabytes: Compressing and Indexing Documents and Images"
+Van Nostrand Reinhold
+1994
+xiv + 429 pages
+US$54.95
+ISBN 0-442-01863-0
+Library of Congress catalog number TA1637 .W58 1994.
+.fi
+.RE
Index: /main/tags/2.38/gsdl/packages/mg/docs/mgmerge.README
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/docs/mgmerge.README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/docs/mgmerge.README	(revision 21083)
@@ -0,0 +1,230 @@
+A CRASH COURSE GUIDE TO MGMERGE
+===============================
+
+Shane Hudson
+15 November 1994
+
+
+This document is intended as a note to the maintainers of mgmerge
+outlining the mgmerge utility, the changes
+that had to be made to the existing mg code to make mgmerge
+work, and the new source code for mgmerge.
+
+
+****  NOTE:    ****
+All the NEW/CHANGED files are in the file "new_mg.tar" which
+you should have received with this; files that were
+not changed are NOT in the tar file  so it will have to be
+extracted "on top of" the existing code. You'll figure it out :)
+
+
+****  DESCRIPTION:   ****
+mgmerge adds documents to an existing mg database
+without the need to rebuild the database from scratch.
+It works by building a temporary new database from the
+new documents, then merging the "old" and "new" databases
+to give one merged database.
+
+
+The source consists of:
+    mgmerge.sh		The main script, a lot like mgbuild.sh
+    mg_get_merge.sh	Script to retrieve new documents, a lot like
+			mg_get.sh
+    mg_merge.h		header file used by mg_invf_merge.c
+			and mg_text_merge.c
+    mg_text_merge.c	Program to append one compressed text file
+			to another
+    mg_invf_merge.c	Program to merge two inverted files and
+			stemmed dictionaries
+
+See the man pages for mgmerge, mg_get_merge, mg_text_merge and
+mg_invf_merge for a brief overview.
+
+mg_get_merge.sh should really be put into mg_get.sh, with a "-merge"
+option if it is being called by the mgmerge utility, but I was
+too lazy to change it to that.
+
+
+The files updated by mgmerge are:
+
+*.text			with mg_text_merge
+*.text.idx		with mg_text_merge
+*.text.idx.wgt		with mg_weights_build (after merging)
+*.invf			with mg_invf_merge
+*.invf.idx		with      "
+*.invf.dict		with      "
+*.weight		with mg_invf_merge or mg_weights_build
+*.invf.dict.blocked	with mg_invf_dict (after merging)
+
+The *.text.stats file and *.text.dict file remain the same.
+Any other database files (ie, *.invf.dict.hash)
+will be out of date after a merge and will need to be recomputed.
+
+--------------------------------------------------------------------------
+
+MG_TEXT_MERGE
+=============
+
+The two "merging" utilities are mg_text_merge and mg_invf_merge
+
+mg_text_merge simply appends the compressed text for the new
+documents to the old compressed text file.
+For this to succeed, the two files should have been created
+with the same parameters to mg_passes and the same compression
+model must be used. So *.text.dict from the old (static) database
+is used as the model for compressing the new documents.
+The default "-C" option to mg_compression_dict in mgbuild was
+changed to "-S" so novel words in the new documents can be coded.
+The option must be the same in mgmerge -- it is "-S" there too.
+
+---------------
+
+EFFECT on FILE COMPRESSION PERFORMANCE
+
+Since the compression model is not being updated,compression
+performance for the text will slowly degrade. The only solution
+is a periodic rebuild from scratch.
+
+---------------------------------------------------------------------------
+
+MG_INVF_MERGE
+=============
+
+mg_invf_merge updates the stemmed dictionary and
+inverted file.
+For reasons of simplicity, the stemmed dictionaries merged
+are in the ".invf.dict" format, NOT the ".invf.dict.blocked"
+format. 
+So if a database is to be merged the .invf.dict file should
+not be deleted after the .invf.dict.blocked file used by mgquery
+has been created.
+Also for simplicity, level 3 inverted files are not supported, nor
+are skipped format files.
+
+
+
+Merging the inverted files requires every entry in each file
+to be decoded and merged if an entry for the same term appears
+in the other inverted file.
+This can be a slow process if the old inverted file is very large.
+Especially since each entry is decoded bit-by-bit with
+the bit-level I/O rouutines.
+As was noted on page 94 of the book "Managing Gigabytes" (hereafter 
+called "MG"), switching from bernoulli coding (called "Bblock" in
+the mg source code) to gamma or delta coding for the
+inter-document gaps would be an advantage since they require no
+parameters.
+With Bblock coding, N (the number of documents) is a parameter and
+as N changes whenever documents are added, every entry must
+be decoded and recoded.
+My approach was to keep Bblock coding, but keep the N parameter
+constant by recording the artificial N  used to code document
+gaps (called "Nstatic") as well as the real number of documents.
+
+Then, any entry in the old inverted file (called "IFold") that
+is not merged with an entry in the new inverted file (called "IFnew")
+can be copied directly to the merged inverted file (called "IFmerge").
+This can give a significant increase in speed, since usually the
+size of IFnew is very small if only a few documents are being added.
+
+To store Nstatic, a field "static_num_of_docs" was added to
+the invf_dict_header and stem_dict_header structs defined
+in invf.h
+Any program that decodes inverted file entries also had to be changed.
+(The existing mg source code that I changed has been returned with
+this document.)
+Most changes were simply altering a line that
+called BIO_Bblock_Init() so it used the static_num_of_docs
+value rather than num_of_docs.
+
+So since the file format has changed, any existing collection will
+have to be rebuilt first even using mgmerge with it is not
+intended.
+
+-------------
+
+EFFECT on INVERTED FILE COMPRESSION PERFORMANCE
+
+As more merges are accumulatively performed on a database, the
+compression performance will decline.
+The solution is an option in mg_invf_merge to do a "slow"
+merge where every inverted file entry is decoded and recoded using
+the real value of N.
+This is not a lot slower than a fast merge when compared to the
+cost of completely rebuilding the collection from scratch, and 
+the option can be used periodically (when, say, 40% of the
+inverted file has been added since the previous slow merge).
+
+-----------------
+
+THE EXACT WEIGHTS FILE
+
+Recomputing exact document weights requires a complete scan over the
+merged inverted file. This is a waste since the weights for old
+documents will (hopefully) not change much anyway, and the weights
+for new documents can be computed exactly when merging the inverted files,
+at no extra time cost.
+So mg_invf_merge computes the weights for new documents and
+updates the .weight file.
+The weights for old documents are left untouched.
+mgmerge has an option to recompute the weights file.
+This is not much more expensive in terms of time, and is only
+periodically needed.
+
+The effect of leaving the old weights unchanged is difficult to
+asess since the "correct" ranking of documents for a query is
+subjective.
+The frequency with which a rebuild of the weights file with the
+"-w" option should be done is hard to guess.
+But if most merges involves only a few documents, it makes sense
+to not bother recomputing it since the change in old weights values
+is very small and the weights only stray from their "true"
+values slowly over accumulated merging.
+
+-------------------------------------------------------------------------
+
+EXPERIMENTAL RESULTS
+====================
+
+With some small test collections (only a few Mb of text)
+and a slow merge, and a weights file rebuild,
+mgmerge typically took under 20% of the time to completely
+rebuild. Using the default options (fast merge, dont rebuild weights)
+took around 10% or more.
+For larger collections, the savings were greater, especially if the
+added text is very small.
+For example, when the last 6Kb of text of the GNUBib collection was
+added to the rest of it (14Mb) using mgmerge, the total mgmerge time
+was around 20 seconds whereas a complete mgbuild took 280 seconds.
+Only one larger collection was tested (resource contraints prevented
+testing on any really large collections): two short (one-line)
+documents were added to the Gutenberg collection, which comprised
+of nearly 74Mb of source text and had an inverted file size of 9Mb.
+mgmerge took 42 seconds (or 142 seconds with a slow merge and rebuilding the
+weights file), and I'd estimate that an mgbuild on the same machine would 
+have taken at least 20 minutes.
+
+To summarise, mgmerge is not as fast as some sophisticated method
+such as the fixed-length blocks described in section 5.7 of "MG",
+but its huge advantage is that it required almost no changes to
+the existing mg code and is still far better than using mgbuild
+every time a document needs to be added to a collection.
+
+----------------------------------------------------------------------------
+
+OTHER NOTES
+===========
+
+Since it works like mgbuild, mgmerge needs mg_get_merge
+to return the SAME text each time "mg_get_merge -text .." is called.
+
+----
+
+One other thing discovered (but not fixed) was a bug in "invf.pass2.c":
+It crashes on parsed words longer than 128 characters.
+So if any text with words >128 chars is piped to mg_passes,
+the "-N1" and "-N2" options (the memory-efficient inversion method)
+had better be used and not the "-I1"/"-I2" option (which would only
+work on small collections anyway, being the memory-inefficient
+method).
+
Index: /main/tags/2.38/gsdl/packages/mg/install-sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/install-sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/install-sh	(revision 21083)
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# 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.
+#
+
+
+# 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}"
+
+tranformbasename=""
+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
Index: /main/tags/2.38/gsdl/packages/mg/lib/GCC.mak
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/GCC.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/GCC.mak	(revision 21083)
@@ -0,0 +1,84 @@
+###########################################################################
+#
+# gcc win32 makefile -- mg\lib
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+
+AR = ar
+RANLIB = ranlib
+CC = gcc
+DELETE = del
+
+CPPFLAGS = -g
+DEFS = -DQUIET -DHAVE_CONFIG_H -D__WIN32__ -D_LITTLE_ENDIAN
+INCLUDES = -I".." -I"."
+
+o = .o
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS)
+ 
+.SUFFIXES:
+.SUFFIXES: .c $o
+.c$o:
+	$(COMPILE) $<
+
+
+HEADERS = \
+    bitio_m_random.h filestats.h local_strings.h lovinstem.h \
+    bitio_m_stdio.h getopt.h memlib.h bitio_gen.h bitio_mem.h \
+    mgheap.h messages.h bitio_m.h bitio_mems.h huffman.h \
+    timing.h bitio_m_mem.h bitio_random.h huffman_mem.h \
+    perf_hash.h bitio_m_mems.h bitio_stdio.h huffman_stdio.h \
+    sptree.h rx.h pathmax.h getpagesize.h random.h \
+    win32in.h simplefrenchstem.h unitool.h
+
+SOURCES = \
+    bitio_random.c mgheap.c memlib.c bitio_stdio.c huffman.c \
+    messages.c bitio_gen.c filestats.c huffman_mem.c \
+    perf_hash.c bitio_mem.c getopt.c huffman_stdio.c \
+    sptree.c bitio_mems.c getopt1.c local_strings.c \
+    lovinstem.c timing.c rx.c alloca.c error.c xmalloc.c \
+    strstr.c ftruncate.c strcasecmp.c random.c win32in.c \
+    simplefrenchstem.c unitool.h
+
+OBJECTS = \
+    rx$o bitio_random$o mgheap$o memlib$o bitio_stdio$o \
+    huffman$o messages$o bitio_gen$o filestats$o huffman_mem$o \
+    perf_hash$o bitio_mem$o getopt$o huffman_stdio$o sptree$o \
+    bitio_mems$o getopt1$o local_strings$o lovinstem$o \
+    timing$o error$o xmalloc$o random$o win32in$o \
+    simplefrenchstem$o unitool$o
+ 
+all : libmg.a
+
+libmg.a : $(OBJECTS)
+	$(DELETE) libmg.a
+	$(AR) cru libmg.a $(OBJECTS)
+	$(RANLIB) libmg.a
+
+install: 
+ 
+clean: 
+	$(DELETE) *$o
+	$(DELETE) libmg.a
Index: /main/tags/2.38/gsdl/packages/mg/lib/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/Makefile.in	(revision 21083)
@@ -0,0 +1,174 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the general purpose library
+# Copyright (C) 1994  Neil Sharman; (C) 1995 Tim Shimmin
+#
+# 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.
+#
+#       @(#)Makefile.in	1.3 16 Mar 1994
+#
+###########################################################################
+
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+SHELL = /bin/sh
+srcdir = @srcdir@
+subdir = lib
+VPATH = @srcdir@
+ 
+AR = ar
+CC = @CC@
+CFLAGS = @CFLAGS@ 
+CPPFLAGS = @CPPFLAGS@
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+
+##########################################
+# Uncomment for compiling for the nzdl project
+#
+CFLAGS = @CFLAGS@ -DQUIET
+##########################################
+
+ 
+prefix = @prefix@
+datadir = $(prefix)/share
+localedir = $(datadir)/locale
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+ANSI2KNR = @ANSI2KNR@
+o = .@U@o
+ 
+.SUFFIXES: ._c ._o
+.c._c:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $@
+._c._o:
+	@echo $(COMPILE) $<
+	@rm -f _$*.c
+	@ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $*._c
+	@echo $(COMPILE) $*._c
+	@rm -f _$*.c
+	@ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+
+ 
+INCLUDES = -I../../.. -I.. -I$(srcdir)
+ 
+HEADERS = \
+    bitio_m_random.h   filestats.h        local_strings.h    lovinstem.h \
+    bitio_m_stdio.h    getopt.h           memlib.h \
+    bitio_gen.h        bitio_mem.h        mgheap.h             messages.h \
+    bitio_m.h          bitio_mems.h       huffman.h          timing.h \
+    bitio_m_mem.h      bitio_random.h     huffman_mem.h      perf_hash.h \
+    bitio_m_mems.h     bitio_stdio.h      huffman_stdio.h    sptree.h \
+    pathmax.h          getpagesize.h \
+    random.h           simplefrenchstem.h unitool.h  longlong.h
+# regex.h            rx.h               
+
+
+SOURCES = \
+    bitio_random.c    mgheap.c            memlib.c \
+    bitio_stdio.c     huffman.c         messages.c \
+    bitio_gen.c       filestats.c       huffman_mem.c     perf_hash.c \
+    bitio_mem.c       getopt.c          huffman_stdio.c   sptree.c \
+    bitio_mems.c      getopt1.c         local_strings.c   lovinstem.c \
+    timing.c  \
+    alloca.c          error.c           xmalloc.c         strstr.c \
+    gmalloc.c         ftruncate.c       strcasecmp.c      random.c \
+    simplefrenchstem.c                  unitool.c
+# regex.c           rx.c              
+
+OBJECTS = @ALLOCA@ @LIBOBJS@ \
+    bitio_random$o    mgheap$o            memlib$o \
+    bitio_stdio$o     huffman$o         messages$o \
+    bitio_gen$o       filestats$o       huffman_mem$o     perf_hash$o \
+    bitio_mem$o       getopt$o          huffman_stdio$o   sptree$o \
+    bitio_mems$o      getopt1$o         local_strings$o   lovinstem$o \
+    timing$o \
+    error$o           xmalloc$o \
+    random$o          simplefrenchstem$o \
+    unitool$o
+#   gmalloc$o regex$o		rx$o 
+
+LIB_OBJECTS =   \
+    bitio_random$o    mgheap$o            memlib$o \
+    bitio_stdio$o     huffman$o          \
+    bitio_gen$o       filestats$o       huffman_mem$o     perf_hash$o \
+    bitio_mem$o       getopt$o          huffman_stdio$o   sptree$o \
+    bitio_mems$o      getopt1$o         local_strings$o   lovinstem$o \
+    timing$o \
+    error$o           xmalloc$o \
+    random$o          simplefrenchstem$o \
+    unitool$o
+
+
+DISTFILES = Makefile.in $(HEADERS) $(SOURCES)
+ 
+all : libmg.a gsdllibmg.a
+
+libmg.a : $(OBJECTS)
+	rm -f libmg.a
+	$(AR) cru libmg.a $(OBJECTS)
+	$(RANLIB) libmg.a
+
+$(OBJECTS): ../../../config.h
+
+gsdllibmg.a: $(LIB_OBJECTS)
+	rm -f gsdllibmg.a
+	$(AR) cru gsdllibmg.a $(LIB_OBJECTS)
+	$(RANLIB) gsdllibmg.a
+ 
+
+install: 
+installdirs:
+uninstall:
+execinstall:
+execuninstall:
+maninstall:
+manuninstall:
+ 
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $$file $(distdir) 2> /dev/null \
+	  || cp -p $$file $(distdir); \
+	done
+
+mostlyclean:
+	rm -f *.o *_.o
+ 
+clean: mostlyclean
+	rm -f libmg.a gsdllibmg.a
+ 
+distclean: clean
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+
+#Makefile: Makefile.in ../../../config.status
+#	cd ../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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:
Index: /main/tags/2.38/gsdl/packages/mg/lib/WIN32.MAK
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/WIN32.MAK	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/WIN32.MAK	(revision 21083)
@@ -0,0 +1,94 @@
+###########################################################################
+#
+# win32 makefile -- mg\lib
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+ 
+GSDLHOME = ..\..\..
+
+AR = lib
+CC = cl
+CPPFLAGS = 
+
+DEFS = -DQUIET -DHAVE_CONFIG_H -D__WIN32__ -D_LITTLE_ENDIAN -DPARADOCNUM \
+       -DSHORT_SUFFIX
+INCLUDES = -I"$(GSDLHOME)\packages\mg\lib" -I"$(GSDLHOME)\packages\mg" \
+           -I"$(GSDLHOME)"
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES)
+ 
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+ANSI2KNR = 
+o = .obj
+ 
+HEADERS = \
+    bitio_m_random.h   filestats.h        local_strings.h    lovinstem.h \
+    bitio_m_stdio.h    getopt.h           memlib.h \
+    bitio_gen.h        bitio_mem.h        mgheap.h             messages.h \
+    bitio_m.h          bitio_mems.h       huffman.h          timing.h \
+    bitio_m_mem.h      bitio_random.h     huffman_mem.h      perf_hash.h \
+    bitio_m_mems.h     bitio_stdio.h      huffman_stdio.h    sptree.h \
+                       rx.h               pathmax.h          getpagesize.h \
+    random.h           win32in.h          simplefrenchstem.h unitool.h \
+    longlong.h	
+
+SOURCES = \
+    bitio_random.c    mgheap.c          memlib.c \
+    bitio_stdio.c     huffman.c         messages.c \
+    bitio_gen.c       filestats.c       huffman_mem.c     perf_hash.c \
+    bitio_mem.c       getopt.c          huffman_stdio.c   sptree.c \
+    bitio_mems.c      getopt1.c         local_strings.c   lovinstem.c \
+    timing.c                            rx.c              \
+    alloca.c          error.c           xmalloc.c         strstr.c \
+    ftruncate.c       strcasecmp.c      random.c          win32in.c \
+    simplefrenchstem.c                  unitool.h
+
+OBJECTS =   rx$o \
+    bitio_random$o    mgheap$o            memlib$o \
+    bitio_stdio$o     huffman$o         messages$o \
+    bitio_gen$o       filestats$o       huffman_mem$o     perf_hash$o \
+    bitio_mem$o       getopt$o          huffman_stdio$o   sptree$o \
+    bitio_mems$o      getopt1$o         local_strings$o   lovinstem$o \
+    timing$o           \
+    error$o           xmalloc$o \
+    random$o          win32in$o         simplefrenchstem$o \
+    unitool$o
+ 
+DISTFILES = Makefile.in $(HEADERS) $(SOURCES)
+ 
+all : libmg.lib
+
+libmg.lib : $(OBJECTS)
+	if EXIST libmg.lib del libmg.lib
+	$(AR) /out:libmg.lib $(OBJECTS)
+
+$(OBJECTS): "$(GSDLHOME)\win32cfg.h"
+
+install: 
+clean:
+	del *$o 
+	del libmg.lib
Index: /main/tags/2.38/gsdl/packages/mg/lib/alloca.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/alloca.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/alloca.c	(revision 21083)
@@ -0,0 +1,496 @@
+/* alloca.c -- allocate automatically reclaimed memory
+   (Mostly) portable public-domain implementation -- D A Gwyn
+
+   This implementation of the PWB library alloca function,
+   which is used to allocate space off the run-time stack so
+   that it is automatically reclaimed upon procedure exit,
+   was inspired by discussions with J. Q. Johnson of Cornell.
+   J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+   There are some preprocessor constants that can
+   be defined when compiling for your specific system, for
+   improved efficiency; however, the defaults should be okay.
+
+   The general concept of this implementation is to keep
+   track of all alloca-allocated blocks, and reclaim any
+   that are found to be deeper in the stack than the current
+   invocation.  This heuristic does not reclaim storage as
+   soon as it becomes invalid, but it will do so eventually.
+
+   As a special case, alloca(0) reclaims storage without
+   allocating any.  It is a good idea to use alloca(0) in
+   your main control loop, etc. to force garbage collection.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#ifdef emacs
+#include "blockinput.h"
+#endif
+
+/* If compiling with GCC 2, this file's not needed.  */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+   there must be some other way alloca is supposed to work.  */
+#ifndef alloca
+
+#ifdef emacs
+#ifdef static
+/* actually, only want this if static is defined as ""
+   -- this is for usg, in which emacs must undefine static
+   in order to make unexec workable
+   */
+#ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+#endif /* STACK_DIRECTION undefined */
+#endif /* static */
+#endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+   provide an "address metric" ADDRESS_FUNCTION macro.  */
+
+#if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+#else
+#define ADDRESS_FUNCTION(arg) &(arg)
+#endif
+
+#if __STDC__
+typedef void *pointer;
+#else
+typedef char *pointer;
+#endif
+
+#define	NULL	0
+
+/* Different portions of Emacs need to call different versions of
+   malloc.  The Emacs executable needs alloca to call xmalloc, because
+   ordinary malloc isn't protected from input signals.  On the other
+   hand, the utilities in lib-src need alloca to call malloc; some of
+   them are very simple, and don't have an xmalloc routine.
+
+   Non-Emacs programs expect this to call use xmalloc.
+
+   Callers below should use malloc.  */
+
+#ifndef emacs
+#define malloc xmalloc
+#endif
+extern pointer malloc ();
+
+/* Define STACK_DIRECTION 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  */
+
+#ifndef STACK_DIRECTION
+#define	STACK_DIRECTION	0	/* Direction unknown.  */
+#endif
+
+#if STACK_DIRECTION != 0
+
+#define	STACK_DIR	STACK_DIRECTION	/* Known at compile-time.  */
+
+#else /* STACK_DIRECTION == 0; need run-time code.  */
+
+static int stack_dir;		/* 1 or -1 once known.  */
+#define	STACK_DIR	stack_dir
+
+static void
+find_stack_direction ()
+{
+  static char *addr = NULL;	/* Address of first `dummy', once known.  */
+  auto char dummy;		/* To get stack address.  */
+
+  if (addr == NULL)
+    {				/* Initial entry.  */
+      addr = ADDRESS_FUNCTION (dummy);
+
+      find_stack_direction ();	/* Recurse once.  */
+    }
+  else
+    {
+      /* Second entry.  */
+      if (ADDRESS_FUNCTION (dummy) > addr)
+	stack_dir = 1;		/* Stack grew upward.  */
+      else
+	stack_dir = -1;		/* Stack grew downward.  */
+    }
+}
+
+#endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+   (a) chain together all alloca'ed blocks;
+   (b) keep track of stack depth.
+
+   It is very important that sizeof(header) agree with malloc
+   alignment chunk size.  The following default should work okay.  */
+
+#ifndef	ALIGN_SIZE
+#define	ALIGN_SIZE	sizeof(double)
+#endif
+
+typedef union hdr
+{
+  char align[ALIGN_SIZE];	/* To force sizeof(header).  */
+  struct
+    {
+      union hdr *next;		/* For chaining headers.  */
+      char *deep;		/* For stack depth measure.  */
+    } h;
+} header;
+
+static header *last_alloca_header = NULL;	/* -> last alloca header.  */
+
+/* Return a pointer to at least SIZE bytes of storage,
+   which will be automatically reclaimed upon exit from
+   the procedure that called alloca.  Originally, this space
+   was supposed to be taken from the current stack frame of the
+   caller, but that method cannot be made to work for some
+   implementations of C, for example under Gould's UTX/32.  */
+
+pointer
+alloca (size)
+     unsigned size;
+{
+  auto char probe;		/* Probes stack depth: */
+  register char *depth = ADDRESS_FUNCTION (probe);
+
+#if STACK_DIRECTION == 0
+  if (STACK_DIR == 0)		/* Unknown growth direction.  */
+    find_stack_direction ();
+#endif
+
+  /* Reclaim garbage, defined as all alloca'd storage that
+     was allocated from deeper in the stack than currently. */
+
+  {
+    register header *hp;	/* Traverses linked list.  */
+
+#ifdef emacs
+    BLOCK_INPUT;
+#endif
+
+    for (hp = last_alloca_header; hp != NULL;)
+      if ((STACK_DIR > 0 && hp->h.deep > depth)
+	  || (STACK_DIR < 0 && hp->h.deep < depth))
+	{
+	  register header *np = hp->h.next;
+
+	  free ((pointer) hp);	/* Collect garbage.  */
+
+	  hp = np;		/* -> next header.  */
+	}
+      else
+	break;			/* Rest are not deeper.  */
+
+    last_alloca_header = hp;	/* -> last valid storage.  */
+
+#ifdef emacs
+    UNBLOCK_INPUT;
+#endif
+  }
+
+  if (size == 0)
+    return NULL;		/* No allocation required.  */
+
+  /* Allocate combined header + user data storage.  */
+
+  {
+    register pointer new = malloc (sizeof (header) + size);
+    /* Address of header.  */
+
+    ((header *) new)->h.next = last_alloca_header;
+    ((header *) new)->h.deep = depth;
+
+    last_alloca_header = (header *) new;
+
+    /* User storage begins just after header.  */
+
+    return (pointer) ((char *) new + sizeof (header));
+  }
+}
+
+#if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+#ifdef DEBUG_I00AFUNC
+#include <stdio.h>
+#endif
+
+#ifndef CRAY_STACK
+#define CRAY_STACK
+#ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+  {
+    long shgrow:32;		/* Number of times stack has grown.  */
+    long shaseg:32;		/* Size of increments to stack.  */
+    long shhwm:32;		/* High water mark of stack.  */
+    long shsize:32;		/* Current size of stack (all segments).  */
+  };
+
+/* The stack segment linkage control information occurs at
+   the high-address end of a stack segment.  (The stack
+   grows from low addresses to high addresses.)  The initial
+   part of the stack segment linkage control information is
+   0200 (octal) words.  This provides for register storage
+   for the routine which overflows the stack.  */
+
+struct stack_segment_linkage
+  {
+    long ss[0200];		/* 0200 overflow words.  */
+    long sssize:32;		/* Number of words in this segment.  */
+    long ssbase:32;		/* Offset to stack base.  */
+    long:32;
+    long sspseg:32;		/* Offset to linkage control of previous
+				   segment of stack.  */
+    long:32;
+    long sstcpt:32;		/* Pointer to task common address block.  */
+    long sscsnm;		/* Private control structure number for
+				   microtasking.  */
+    long ssusr1;		/* Reserved for user.  */
+    long ssusr2;		/* Reserved for user.  */
+    long sstpid;		/* Process ID for pid based multi-tasking.  */
+    long ssgvup;		/* Pointer to multitasking thread giveup.  */
+    long sscray[7];		/* Reserved for Cray Research.  */
+    long ssa0;
+    long ssa1;
+    long ssa2;
+    long ssa3;
+    long ssa4;
+    long ssa5;
+    long ssa6;
+    long ssa7;
+    long sss0;
+    long sss1;
+    long sss2;
+    long sss3;
+    long sss4;
+    long sss5;
+    long sss6;
+    long sss7;
+  };
+
+#else /* CRAY2 */
+/* The following structure defines the vector of words
+   returned by the STKSTAT library routine.  */
+struct stk_stat
+  {
+    long now;			/* Current total stack size.  */
+    long maxc;			/* Amount of contiguous space which would
+				   be required to satisfy the maximum
+				   stack demand to date.  */
+    long high_water;		/* Stack high-water mark.  */
+    long overflows;		/* Number of stack overflow ($STKOFEN) calls.  */
+    long hits;			/* Number of internal buffer hits.  */
+    long extends;		/* Number of block extensions.  */
+    long stko_mallocs;		/* Block allocations by $STKOFEN.  */
+    long underflows;		/* Number of stack underflow calls ($STKRETN).  */
+    long stko_free;		/* Number of deallocations by $STKRETN.  */
+    long stkm_free;		/* Number of deallocations by $STKMRET.  */
+    long segments;		/* Current number of stack segments.  */
+    long maxs;			/* Maximum number of stack segments so far.  */
+    long pad_size;		/* Stack pad size.  */
+    long current_address;	/* Current stack segment address.  */
+    long current_size;		/* Current stack segment size.  This
+				   number is actually corrupted by STKSTAT to
+				   include the fifteen word trailer area.  */
+    long initial_address;	/* Address of initial segment.  */
+    long initial_size;		/* Size of initial segment.  */
+  };
+
+/* The following structure describes the data structure which trails
+   any stack segment.  I think that the description in 'asdef' is
+   out of date.  I only describe the parts that I am sure about.  */
+
+struct stk_trailer
+  {
+    long this_address;		/* Address of this block.  */
+    long this_size;		/* Size of this block (does not include
+				   this trailer).  */
+    long unknown2;
+    long unknown3;
+    long link;			/* Address of trailer block of previous
+				   segment.  */
+    long unknown5;
+    long unknown6;
+    long unknown7;
+    long unknown8;
+    long unknown9;
+    long unknown10;
+    long unknown11;
+    long unknown12;
+    long unknown13;
+    long unknown14;
+  };
+
+#endif /* CRAY2 */
+#endif /* not CRAY_STACK */
+
+#ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+   I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+  struct stk_stat status;
+  struct stk_trailer *trailer;
+  long *block, size;
+  long result = 0;
+
+  /* We want to iterate through all of the segments.  The first
+     step is to get the stack status structure.  We could do this
+     more quickly and more directly, perhaps, by referencing the
+     $LM00 common block, but I know that this works.  */
+
+  STKSTAT (&status);
+
+  /* Set up the iteration.  */
+
+  trailer = (struct stk_trailer *) (status.current_address
+				    + status.current_size
+				    - 15);
+
+  /* There must be at least one stack segment.  Therefore it is
+     a fatal error if "trailer" is null.  */
+
+  if (trailer == 0)
+    abort ();
+
+  /* Discard segments that do not contain our argument address.  */
+
+  while (trailer != 0)
+    {
+      block = (long *) trailer->this_address;
+      size = trailer->this_size;
+      if (block == 0 || size == 0)
+	abort ();
+      trailer = (struct stk_trailer *) trailer->link;
+      if ((block <= address) && (address < (block + size)))
+	break;
+    }
+
+  /* Set the result to the offset in this segment and add the sizes
+     of all predecessor segments.  */
+
+  result = address - block;
+
+  if (trailer == 0)
+    {
+      return result;
+    }
+
+  do
+    {
+      if (trailer->this_size <= 0)
+	abort ();
+      result += trailer->this_size;
+      trailer = (struct stk_trailer *) trailer->link;
+    }
+  while (trailer != 0);
+
+  /* We are done.  Note that if you present a bogus address (one
+     not in any segment), you will get a different number back, formed
+     from subtracting the address of the first block.  This is probably
+     not what you want.  */
+
+  return (result);
+}
+
+#else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+   Determine the number of the cell within the stack,
+   given the address of the cell.  The purpose of this
+   routine is to linearize, in some sense, stack addresses
+   for alloca.  */
+
+static long
+i00afunc (long address)
+{
+  long stkl = 0;
+
+  long size, pseg, this_segment, stack;
+  long result = 0;
+
+  struct stack_segment_linkage *ssptr;
+
+  /* Register B67 contains the address of the end of the
+     current stack segment.  If you (as a subprogram) store
+     your registers on the stack and find that you are past
+     the contents of B67, you have overflowed the segment.
+
+     B67 also points to the stack segment linkage control
+     area, which is what we are really interested in.  */
+
+  stkl = CRAY_STACKSEG_END ();
+  ssptr = (struct stack_segment_linkage *) stkl;
+
+  /* If one subtracts 'size' from the end of the segment,
+     one has the address of the first word of the segment.
+
+     If this is not the first segment, 'pseg' will be
+     nonzero.  */
+
+  pseg = ssptr->sspseg;
+  size = ssptr->sssize;
+
+  this_segment = stkl - size;
+
+  /* It is possible that calling this routine itself caused
+     a stack overflow.  Discard stack segments which do not
+     contain the target address.  */
+
+  while (!(this_segment <= address && address <= stkl))
+    {
+#ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+#endif
+      if (pseg == 0)
+	break;
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      this_segment = stkl - size;
+    }
+
+  result = address - this_segment;
+
+  /* If you subtract pseg from the current end of the stack,
+     you get the address of the previous stack segment's end.
+     This seems a little convoluted to me, but I'll bet you save
+     a cycle somewhere.  */
+
+  while (pseg != 0)
+    {
+#ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o\n", pseg, size);
+#endif
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      result += size;
+    }
+  return (result);
+}
+
+#endif /* not CRAY2 */
+#endif /* CRAY */
+
+#endif /* no alloca */
+#endif /* not GCC version 2 */
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.c	(revision 21083)
@@ -0,0 +1,145 @@
+/**************************************************************************
+ *
+ * bitio_gen.c -- General supoport routines for bitio
+ * Copyright (C) 1994  Neil Sharman and Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+#include "bitio_m.h"
+
+
+
+
+int fprintf (FILE *, const char *,...);
+
+unsigned long 
+BIO_Unary_Length (unsigned long val)
+{
+  register unsigned long num;
+  UNARY_LENGTH (val, num);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Binary_Length (unsigned long val, unsigned long b)
+{
+  register unsigned long num;
+  BINARY_LENGTH (val, b, num);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Gamma_Length (unsigned long val)
+{
+  register unsigned long num;
+  GAMMA_LENGTH (val, num);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Delta_Length (unsigned long val)
+{
+  register unsigned long num;
+  DELTA_LENGTH (val, num);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Elias_Length (unsigned long val, unsigned long b, double s)
+{
+  register unsigned long num;
+  ELIAS_LENGTH (val, b, s, num);
+  return (num);
+}
+
+unsigned long 
+BIO_Bblock_Length (unsigned long val, unsigned long b)
+{
+  register unsigned long num;
+  BBLOCK_LENGTH (val, b, num);
+  return (num);
+}
+
+
+int 
+BIO_Bblock_Init (int N, int p)
+{
+  int b;
+  b = (int) (0.5 + 0.6931471 * N / p);
+  return (b ? b : 1);
+}
+
+
+int 
+BIO_Bblock_Init_W (int N, int p)
+{
+  int logb;
+  FLOORLOG_2 ((N - p) / p, logb);
+  return (logb < 0 ? 1 : (1 << logb));
+}
+
+int 
+BIO_Bblock_Bound_b (int N, int p, int b)
+{
+  int clogb;
+  CEILLOG_2 (b, clogb);
+  return (p * (1 + clogb) + (N - p * ((1 << clogb) - b + 1)) / b);
+}
+
+int 
+BIO_Bblock_Bound (int N, int p)
+{
+  int b;
+  b = BIO_Bblock_Init_W (N, p);
+  return (BIO_Bblock_Bound_b (N, p, b));
+}
+
+
+/* adjustment is a hack to overcome inaccuracies in floating point,
+   where (int)(ln4/ln2) can equal 1, not 2. */
+/* copied from mg-1.3f, 17-09-01 kjm18 */
+int 
+BIO_Gamma_Bound (int N, int p)
+{
+  /* return ((int) (p * (2 * log2 ((double) N / p) + 1))); */
+  return ((int) (p * (2 * log2 (((double) N * 1.0001) / p) + 1)));
+}
+
+int 
+floorlog_2 (int b)
+{
+  int logb;
+  FLOORLOG_2 (b, logb);
+  return logb;
+}
+
+int 
+ceillog_2 (int b)
+{
+  int logb;
+  CEILLOG_2 (b, logb);
+  return logb;
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_gen.h	(revision 21083)
@@ -0,0 +1,63 @@
+/**************************************************************************
+ *
+ * bitio_gen.h -- General supoport routines for bitio
+ * Copyright (C) 1994  Neil Sharman and Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains function definitions for doing general bitio operations.
+ *
+ *  This file defines functions for calculation the length in bits of a number
+ *  coded unary, binary, delta, gamma, elias, and  bblock coding. It defines 
+ *  routines for calculating the parameter and bounds for bblock coding. 
+ *  Routines for calculating ceil and floor lg are also defined.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_GEN
+#define H_BITIO_GEN
+
+unsigned long BIO_Unary_Length (unsigned long val);
+
+unsigned long BIO_Binary_Length (unsigned long val, unsigned long b);
+
+unsigned long BIO_Gamma_Length (unsigned long val);
+
+unsigned long BIO_Delta_Length (unsigned long val);
+
+unsigned long BIO_Elias_Length (unsigned long val, unsigned long b, double s);
+
+unsigned long BIO_Bblock_Length (unsigned long val, unsigned long b);
+
+int BIO_Bblock_Init (int N, int p);
+
+int BIO_Bblock_Init_W (int N, int p);
+
+int BIO_Bblock_Bound_b (int N, int p, int b);
+
+int BIO_Bblock_Bound (int N, int p);
+
+int BIO_Gamma_Bound (int N, int p);
+
+int floorlog_2 (int b);
+
+int ceillog_2 (int b);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_m.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_m.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_m.h	(revision 21083)
@@ -0,0 +1,543 @@
+/**************************************************************************
+ *
+ * bitio_m.h -- Macros for bitio
+ * Copyright (C) 1994  Neil Sharman and Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_BITIO_M
+#define H_BITIO_M
+
+/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
+
+#ifndef BIO_ENCODE_PROLOGUE
+#define BIO_ENCODE_PROLOGUE
+#endif
+
+#ifndef BIO_DECODE_PROLOGUE
+#define BIO_DECODE_PROLOGUE
+#endif
+
+#ifndef BIO_ENCODE_EPILOGUE
+#define BIO_ENCODE_EPILOGUE
+#endif
+
+#ifndef BIO_DECODE_EPILOGUE
+#define BIO_DECODE_EPILOGUE
+#endif
+
+#ifndef DECODE_ADD
+#define DECODE_ADD(b) (b) += (b) + DECODE_BIT
+#endif
+
+/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */
+
+#define POSITIVE(f, x)							\
+  if ((x)<=0) 								\
+    fprintf(stderr,"Error: Cannot "#f" encode %lu\n",(unsigned long)x),exit(1);
+
+
+#define CEILLOG_2(x,v)							\
+do {									\
+  register int _B_x  = (x) - 1;						\
+  (v) = 0;								\
+  for (; _B_x ; _B_x>>=1, (v)++);					\
+} while(0)
+
+
+#define FLOORLOG_2(x,v)							\
+do {									\
+  register int _B_x  = (x);						\
+  (v) = -1;								\
+  for (; _B_x ; _B_x>>=1, (v)++);					\
+} while(0)
+
+
+/****************************************************************************/
+
+
+
+#define UNARY_ENCODE(x)							\
+do {									\
+  register unsigned long _B_x = (x);					\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(unary, _B_x);						\
+  while(--_B_x) ENCODE_BIT(0);						\
+  ENCODE_BIT(1);							\
+  BIO_ENCODE_EPILOGUE;							\
+} while(0)
+
+#define UNARY_ENCODE_L(x, count)					\
+do {									\
+  register unsigned long _B_x = (x);					\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(unary, _B_x);						\
+  (count) += _B_x;							\
+  while(--_B_x) ENCODE_BIT(0);						\
+  ENCODE_BIT(1);							\
+  BIO_ENCODE_EPILOGUE;							\
+} while(0)
+
+#define UNARY_DECODE(x)							\
+do {									\
+  BIO_DECODE_PROLOGUE;							\
+  (x) = 1;								\
+  while (!DECODE_BIT) (x)++;						\
+  BIO_DECODE_EPILOGUE;							\
+} while(0)
+
+#define UNARY_DECODE_L(x, count)					\
+do {									\
+  BIO_DECODE_PROLOGUE;							\
+  (x) = 1;								\
+  while (!DECODE_BIT) (x)++;						\
+  (count) += (x);							\
+  BIO_DECODE_EPILOGUE;							\
+} while(0)
+
+
+#define UNARY_LENGTH(x, count)						\
+do {									\
+  POSITIVE(unary, x);							\
+  (count) = (x);							\
+} while(0)
+
+
+/****************************************************************************/
+
+
+#define BINARY_ENCODE(x, b)						\
+do {									\
+  register unsigned long _B_x = (x);					\
+  register unsigned long _B_b = (b);					\
+  register int _B_nbits, _B_logofb, _B_thresh;				\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(binary, _B_x);						\
+  CEILLOG_2(_B_b, _B_logofb);						\
+  _B_thresh = (1<<_B_logofb) - _B_b;					\
+  if (--_B_x < _B_thresh)						\
+    _B_nbits = _B_logofb-1;						\
+  else									\
+    {									\
+      _B_nbits = _B_logofb;						\
+      _B_x += _B_thresh;						\
+    }									\
+  while (--_B_nbits>=0)							\
+    ENCODE_BIT((_B_x>>_B_nbits) & 0x1);					\
+  BIO_ENCODE_EPILOGUE;							\
+} while(0)
+
+#define BINARY_ENCODE_L(x, b, count)					\
+do {									\
+  register unsigned long _B_x = (x);					\
+  register unsigned long _B_b = (b);					\
+  register int _B_nbits, _B_logofb, _B_thresh;				\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(binary, _B_x);						\
+  CEILLOG_2(_B_b, _B_logofb);						\
+  _B_thresh = (1<<_B_logofb) - _B_b;					\
+  if (--_B_x < _B_thresh)						\
+    _B_nbits = _B_logofb-1;						\
+  else									\
+    {									\
+      _B_nbits = _B_logofb;						\
+      _B_x += _B_thresh;						\
+    }									\
+  (count) += _B_nbits;							\
+  while (--_B_nbits>=0)							\
+    ENCODE_BIT((_B_x>>_B_nbits) & 0x1);					\
+  BIO_ENCODE_EPILOGUE;							\
+} while(0)
+
+
+#define BINARY_DECODE(x, b)						\
+do {									\
+  register unsigned long _B_x = 0;					\
+  register unsigned long _B_b = (b);					\
+  register int _B_i, _B_logofb, _B_thresh;				\
+  BIO_DECODE_PROLOGUE;							\
+  if (_B_b != 1)							\
+    {									\
+      CEILLOG_2(_B_b, _B_logofb);					\
+      _B_thresh = (1<<_B_logofb) - _B_b;				\
+      _B_logofb--;							\
+      for (_B_i=0; _B_i < _B_logofb; _B_i++)			 	\
+        DECODE_ADD(_B_x);						\
+      if (_B_x >= _B_thresh)						\
+        {								\
+          DECODE_ADD(_B_x);						\
+          _B_x -= _B_thresh;						\
+	}								\
+      (x) = _B_x+1;							\
+    }									\
+  else									\
+    (x) = 1;								\
+  BIO_DECODE_EPILOGUE;							\
+} while(0)
+
+#define BINARY_DECODE_L(x, b, count)					\
+do {									\
+  register unsigned long _B_x = 0;					\
+  register unsigned long _B_b = (b);					\
+  register int _B_i, _B_logofb, _B_thresh;				\
+  BIO_DECODE_PROLOGUE;							\
+  if (_B_b != 1)							\
+    {									\
+      CEILLOG_2(_B_b, _B_logofb);					\
+      _B_thresh = (1<<_B_logofb) - _B_b;				\
+      _B_logofb--;							\
+      (count) += _B_logofb;					       	\
+      for (_B_i=0; _B_i < _B_logofb; _B_i++)			 	\
+        DECODE_ADD(_B_x);						\
+      if (_B_x >= _B_thresh)						\
+        {								\
+          DECODE_ADD(_B_x);						\
+          _B_x -= _B_thresh;						\
+          (count)++;							\
+	}								\
+      (x) = _B_x+1;							\
+    }									\
+  else									\
+    (x) = 1;								\
+  BIO_DECODE_EPILOGUE;							\
+} while(0)
+
+#define BINARY_LENGTH(x, b, count)					\
+do {									\
+  register unsigned long _B_x = (x);					\
+  register unsigned long _B_b = (b);					\
+  register int _B_nbits, _B_logofb, _B_thresh;				\
+  POSITIVE(binary, _B_x);						\
+  CEILLOG_2(_B_b, _B_logofb);						\
+  _B_thresh = (1<<_B_logofb) - _B_b;					\
+  if (--_B_x < _B_thresh)						\
+    _B_nbits = _B_logofb-1;						\
+  else									\
+    _B_nbits = _B_logofb;						\
+  (count) = _B_nbits;							\
+} while(0)
+
+/****************************************************************************/
+
+
+
+
+#define GAMMA_ENCODE(x)							\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register int _B_logofb;						\
+  register int _B_nbits;						\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(gamma, _B_xx);						\
+  FLOORLOG_2(_B_xx, _B_logofb);						\
+  _B_nbits = _B_logofb+1;						\
+  while(_B_logofb--) ENCODE_BIT(0);					\
+  while (--_B_nbits>=0)							\
+    ENCODE_BIT((_B_xx>>_B_nbits) & 0x1);				\
+  BIO_ENCODE_EPILOGUE;							\
+} while (0)
+
+#define GAMMA_ENCODE_L(x, count)					\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register int _B_logofb;						\
+  register int _B_nbits;						\
+  BIO_ENCODE_PROLOGUE;							\
+  POSITIVE(gamma, _B_xx);						\
+  FLOORLOG_2(_B_xx, _B_logofb);						\
+  _B_nbits = _B_logofb+1;						\
+  (count) += _B_logofb*2+1;						\
+  while(_B_logofb--) ENCODE_BIT(0);					\
+  while (--_B_nbits>=0)							\
+    ENCODE_BIT((_B_xx>>_B_nbits) & 0x1);				\
+  BIO_ENCODE_EPILOGUE;							\
+} while (0)
+
+#define GAMMA_DECODE(x)							\
+do {									\
+  register unsigned long _B_xx = 1;					\
+  register int _B_nbits = 0;						\
+  BIO_DECODE_PROLOGUE;							\
+  while(!DECODE_BIT) _B_nbits++;					\
+  while (_B_nbits-- > 0)						\
+    DECODE_ADD(_B_xx);							\
+  (x) = _B_xx;								\
+  BIO_DECODE_EPILOGUE;							\
+} while (0)
+
+#define GAMMA_DECODE_L(x, count)					\
+do {									\
+  register unsigned long _B_xx = 1;					\
+  register int _B_nbits = 0;						\
+  BIO_DECODE_PROLOGUE;							\
+  while(!DECODE_BIT) _B_nbits++;					\
+  (count) += _B_nbits*2+1;						\
+  while (_B_nbits-- > 0)						\
+    DECODE_ADD(_B_xx);							\
+  (x) = _B_xx;								\
+  BIO_DECODE_EPILOGUE;							\
+} while (0)
+
+#define GAMMA_LENGTH(x, count)						\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register int _B_logofb;						\
+  POSITIVE(gamma, _B_xx);						\
+  FLOORLOG_2(_B_xx, _B_logofb);						\
+  (count) = _B_logofb*2+1;						\
+} while (0)
+
+
+
+/****************************************************************************/
+
+
+#define DELTA_ENCODE(x)							\
+do {									\
+  register unsigned long _B_xxx = (x);					\
+  register int _B_logx;							\
+  FLOORLOG_2(_B_xxx, _B_logx);						\
+  GAMMA_ENCODE(_B_logx+1);						\
+  BINARY_ENCODE(_B_xxx+1, 1<<_B_logx);					\
+} while (0)
+
+#define DELTA_ENCODE_L(x, count)					\
+do {									\
+  register unsigned long _B_xxx = (x);					\
+  register int _B_logx;							\
+  FLOORLOG_2(_B_xxx, _B_logx);						\
+  GAMMA_ENCODE_L(_B_logx+1, count);					\
+  BINARY_ENCODE_L(_B_xxx+1, 1<<_B_logx, count);				\
+} while (0)
+
+
+#define DELTA_DECODE(x)							\
+do {									\
+  register unsigned long _B_xxx;					\
+  register int _B_logx;							\
+  GAMMA_DECODE(_B_logx); _B_logx--;					\
+  BINARY_DECODE(_B_xxx, 1<<_B_logx); _B_xxx--;				\
+  (x) = _B_xxx + (1<<_B_logx);						\
+} while (0)
+
+#define DELTA_DECODE_L(x, count)					\
+do {									\
+  register unsigned long _B_xxx;					\
+  register int _B_logx;							\
+  GAMMA_DECODE_L(_B_logx, count); _B_logx--;				\
+  BINARY_DECODE_L(_B_xxx, 1<<_B_logx, count); _B_xxx--;			\
+  (x) = _B_xxx + (1<<_B_logx);						\
+} while (0)
+
+#define DELTA_LENGTH(x, count)						\
+do {									\
+  register unsigned long _B_xxx = (x);					\
+  register int _B_logx, _B_dcount;					\
+  FLOORLOG_2(_B_xxx, _B_logx);						\
+  GAMMA_LENGTH(_B_logx+1, count);					\
+  BINARY_LENGTH(_B_xxx+1, 1<<_B_logx, _B_dcount);			\
+  (count) += _B_dcount;							\
+} while (0)
+
+
+/****************************************************************************/
+
+
+
+
+#define ELIAS_ENCODE(x, b, s)						\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register unsigned long _B_b = (b);					\
+  register double _B_s = (s);						\
+  register int _B_lower=1, _B_upper=1;					\
+  register int _B_k=0;							\
+  register double _B_pow=1.0;						\
+  POSITIVE(elias, _B_xx);						\
+  while (_B_xx>_B_upper) 						\
+    {									\
+      _B_k++;								\
+      _B_lower = _B_upper+1;						\
+      _B_pow *= _B_s;							\
+      _B_upper += _B_b*_B_pow;						\
+    }									\
+  UNARY_ENCODE(_B_k+1);							\
+  BINARY_ENCODE(_B_xx-_B_lower+1, _B_upper-_B_lower+1);			\
+} while (0)
+
+#define ELIAS_ENCODE_L(x, b, s, count)					\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register unsigned long _B_b = (b);					\
+  register double _B_s = (s);						\
+  register int _B_lower=1, _B_upper=1;					\
+  register int _B_k=0;							\
+  register double _B_pow=1.0;						\
+  POSITIVE(elias, _B_xx);						\
+  while (_B_xx>_B_upper) 						\
+    {									\
+      _B_k++;								\
+      _B_lower = _B_upper+1;						\
+      _B_pow *= _B_s;							\
+      _B_upper += _B_b*_B_pow;						\
+    }									\
+  UNARY_ENCODE_L(_B_k+1, count);					\
+  BINARY_ENCODE_L(_B_xx-_B_lower+1, _B_upper-_B_lower+1, count);	\
+} while (0)
+
+#define ELIAS_DECODE(x, b, s)						\
+do {									\
+  register unsigned long _B_xx;						\
+  register unsigned long _B_b = (b);					\
+  register double _B_s = (s);						\
+  register int _B_lower=1, _B_upper=1;					\
+  register int _B_k;							\
+  register double _B_pow=1.0;						\
+  UNARY_DECODE(_B_k); _B_k--;						\
+  while (_B_k--)							\
+    {									\
+      _B_lower = _B_upper+1;						\
+      _B_pow *= _B_s;							\
+      _B_upper += _B_b*_B_pow;						\
+    }									\
+  BINARY_DECODE(_B_xx, _B_upper-_B_lower+1); _B_xx--;			\
+  POSITIVE(gamma, _B_xx+_B_lower);				  	\
+  (x) = _B_xx+_B_lower;							\
+} while (0)
+
+#define ELIAS_DECODE_L(x, b, s, count)					\
+do {									\
+  register unsigned long _B_xx;						\
+  register unsigned long _B_b = (b);					\
+  register double _B_s = (s);						\
+  register int _B_lower=1, _B_upper=1;					\
+  register int _B_k;							\
+  register double _B_pow=1.0;						\
+  UNARY_DECODE_L(_B_k, count); _B_k--;					\
+  while (_B_k--)							\
+    {									\
+      _B_lower = _B_upper+1;						\
+      _B_pow *= _B_s;							\
+      _B_upper += _B_b*_B_pow;						\
+    }									\
+  BINARY_DECODE_L(_B_xx, _B_upper-_B_lower+1, count); _B_xx--;		\
+  POSITIVE(gamma, _B_xx+_B_lower);				  	\
+  (x) = _B_xx+_B_lower;							\
+} while (0)
+
+#define ELIAS_LENGTH(x, b, s, count)					\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register unsigned long _B_b = (b);					\
+  register double _B_s = (s);						\
+  register int _B_lower=1, _B_upper=1;					\
+  register int _B_k=0, _B_ecount;					\
+  register double _B_pow=1.0;						\
+  POSITIVE(gamma, _B_xx);						\
+  while (_B_xx>_B_upper) 						\
+    {									\
+      _B_k++;								\
+      _B_lower = _B_upper+1;						\
+      _B_pow *= _B_s;							\
+      _B_upper += _B_b*_B_pow;						\
+    }									\
+  UNARY_LENGTH(_B_k+1, count);						\
+  BINARY_LENGTH(_B_xx-_B_lower+1, _B_upper-_B_lower+1, _B_ecount);	\
+  (count) += _B_ecount;							\
+} while (0)
+
+
+/****************************************************************************/
+
+
+#define BBLOCK_ENCODE(x, b)						\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register unsigned long _B_bb = (b);					\
+  register int _B_xdivb = 0;						\
+  POSITIVE(bblock, _B_xx);						\
+  _B_xx--;								\
+  while (_B_xx >= _B_bb) 						\
+    {									\
+      _B_xdivb++;							\
+      _B_xx -= _B_bb;							\
+    }									\
+  UNARY_ENCODE(_B_xdivb+1);						\
+  BINARY_ENCODE(_B_xx+1, _B_bb);					\
+} while (0)
+
+#define BBLOCK_ENCODE_L(x, b, count)					\
+do {									\
+  register unsigned long _B_xx = (x);					\
+  register unsigned long _B_bb = (b);					\
+  register int _B_xdivb = 0;						\
+  POSITIVE(bblock, _B_xx);						\
+  _B_xx--;								\
+  while (_B_xx >= _B_bb) 						\
+    {									\
+      _B_xdivb++;							\
+      _B_xx -= _B_bb;							\
+    }									\
+  UNARY_ENCODE_L(_B_xdivb+1, count);					\
+  BINARY_ENCODE_L(_B_xx+1, _B_bb, count);				\
+} while (0)
+
+#define BBLOCK_DECODE(x, b)						\
+do {									\
+  register unsigned long _B_x1, _B_xx = 0;				\
+  register unsigned long _B_bb = (b);					\
+  register int _B_xdivb;						\
+  UNARY_DECODE(_B_xdivb); _B_xdivb--;					\
+  while (_B_xdivb--)							\
+    _B_xx += _B_bb;							\
+  BINARY_DECODE(_B_x1, _B_bb);						\
+  (x) = _B_xx+_B_x1;							\
+} while (0)
+
+#define BBLOCK_DECODE_L(x, b, count)					\
+do {									\
+  register unsigned long _B_x1, _B_xx = 0;				\
+  register unsigned long _B_bb = (b);					\
+  register int _B_xdivb;						\
+  UNARY_DECODE_L(_B_xdivb, count); _B_xdivb--;				\
+  while (_B_xdivb--)							\
+    _B_xx += _B_bb;							\
+  BINARY_DECODE_L(_B_x1, _B_bb, count);					\
+  (x) = _B_xx+_B_x1;							\
+} while (0)
+
+#define BBLOCK_LENGTH(x, b, count)					\
+do {									\
+  register unsigned long _B_bcount, _B_xx = (x);			\
+  register unsigned long _B_bb = (b);					\
+  register int _B_xdivb = 0;						\
+  POSITIVE(bblock, _B_xx);						\
+  _B_xx--;								\
+  while (_B_xx >= _B_bb) 						\
+    {									\
+      _B_xdivb++;							\
+      _B_xx -= _B_bb;							\
+    }									\
+  UNARY_LENGTH(_B_xdivb+1, count);					\
+  BINARY_LENGTH(_B_xx+1, _B_bb, _B_bcount);				\
+  (count) += _B_bcount;  						\
+} while (0)
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mem.h	(revision 21083)
@@ -0,0 +1,191 @@
+/**************************************************************************
+ *
+ * bitio_m_mem.h -- Macros for bitio to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are faster than the ones in "mems" files. But 
+ *  with these routines you cannot mix reads and writes on the array of chars,
+ *  or multiple write, at the same time and guarantee them to work, also you 
+ *  cannot seek to a point and do a write. The decode routine can detect when
+ *  you run off the end of the array and will produce an approate error 
+ *  message, and the encode routine will stop when it gets to the end of the 
+ *  character array. 
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_MEM
+#define H_BITIO_M_MEM
+
+typedef struct mem_bitio_state
+  {
+    unsigned char *Base;
+    unsigned char *Pos;
+    int Remaining;
+    unsigned char Buff;
+    unsigned char Btg;
+  }
+mem_bitio_state;
+
+
+
+
+#ifndef DECODE_ERROR
+#define DECODE_ERROR (fprintf(stderr,"Unexpected EOF in \"%s\" on line %d\n",\
+				__FILE__, __LINE__), exit(1))
+#endif
+
+
+
+#define ENCODE_START(p,r)						\
+  {									\
+    register unsigned char *__pos = p;					\
+    register unsigned char *__base = p;					\
+    register int __remaining = r;					\
+    register unsigned char __buff = 0;					\
+    register unsigned char __btg = sizeof(__buff)*8;
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    register unsigned char *__pos = (b).Pos;				\
+    register unsigned char *__base = (b).Base;				\
+    register int __remaining = (b).Remaining;				\
+    register unsigned char __buff = (b).Buff;				\
+    register unsigned char __btg = (b).Btg;
+
+#define ENCODE_BIT(b)							\
+  do {									\
+    __btg--;								\
+    if (b) __buff |= (1 << __btg);					\
+    if (!__btg)								\
+      {									\
+	if (__remaining)						\
+	  {								\
+	    *__pos++ = __buff;						\
+	    __remaining--;						\
+	  }  								\
+	__buff = 0;							\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+  } while(0)
+
+#define ENCODE_PAUSE(b)							\
+    (b).Pos = __pos;							\
+    (b).Base = __base;							\
+    (b).Remaining = __remaining;					\
+    (b).Buff = __buff;							\
+    (b).Btg =  __btg;							\
+  }
+
+#define ENCODE_FLUSH							\
+  do {									\
+    if (__btg != sizeof(__buff)*8)					\
+      if (__remaining)							\
+	{								\
+          *__pos++ = __buff;						\
+          __remaining--;						\
+	}  								\
+    __btg = sizeof(__buff)*8;						\
+  } while (0)
+
+#define ENCODE_DONE							\
+    ENCODE_FLUSH;							\
+  }
+
+
+#define DECODE_START(p,r)						\
+  {									\
+    register unsigned char *__pos = p;					\
+    register unsigned char *__base = p;					\
+    register int __remaining = r;					\
+    register unsigned char __buff = 0;					\
+    register unsigned char __btg = 0;
+
+#define DECODE_CONTINUE(b)						\
+  {									\
+    register unsigned char *__pos = (b).Pos;				\
+    register unsigned char *__base = (b).Base;				\
+    register int __remaining = (b).Remaining;				\
+    register unsigned char __buff = (b).Buff;				\
+    register unsigned char __btg = (b).Btg;
+
+#define DECODE_ADD_FF(b)						\
+  do {									\
+    if (!__btg)								\
+      {									\
+	if (__remaining)						\
+	  {								\
+  	    __buff = *__pos++;						\
+	    __remaining--;						\
+	  }								\
+        else								\
+          __buff = 0xff;						\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+    (b) += (b) + ((__buff >> --__btg) & 1);				\
+  } while(0)
+
+#define DECODE_ADD_00(b)						\
+  do {									\
+    if (!__btg)								\
+      {									\
+	if (__remaining)						\
+	  {								\
+  	    __buff = *__pos++;						\
+	    __remaining--;						\
+	  }								\
+        else								\
+          __buff = 0x00;						\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+    (b) += (b) + ((__buff >> --__btg) & 1);				\
+  } while(0)
+
+#define DECODE_BIT (__btg ? (__buff >> --__btg) & 1 :			\
+   (!__remaining ? 							\
+    (DECODE_ERROR, 0) :							\
+    (__buff = *__pos++, __remaining--, __btg = sizeof(__buff)*8, 	\
+     (__buff >> --__btg) & 1)))
+
+#define DECODE_DONE	;						\
+  }
+
+#define DECODE_PAUSE(b)							\
+    (b).Pos = __pos;							\
+    (b).Base = __base;							\
+    (b).Remaining = __remaining;					\
+    (b).Buff = __buff;							\
+    (b).Btg =  __btg;							\
+  }
+
+#define DECODE_SEEK(pos)						\
+  do {									\
+    register long __new_pos = (pos);					\
+    __pos = __base + (__new_pos >> 3);					\
+    __buff = *__pos++;							\
+    __btg = 8 - (__new_pos&7);						\
+    }									\
+  while(0)
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mems.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mems.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_mems.h	(revision 21083)
@@ -0,0 +1,114 @@
+/**************************************************************************
+ *
+ * bitio_m_mems.h -- Macros for bitio to memory (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are slower than the ones in "mem" files. but 
+ *  with these routines you can mix reads and writes, or multiple writes,  on
+ *  the array of chars at the same time and guarantee them to work, also you 
+ *  can seek to a point and do a write. The decode and encode macros cannot 
+ *  detect when the end off the character is reached and just continue 
+ *  processing.
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_MEMS
+#define H_BITIO_M_MEMS
+
+typedef struct mems_bitio_state
+  {
+    unsigned char *Base;
+    unsigned long pos;
+  }
+mems_bitio_state;
+
+
+#define ENCODE_START(b,p)						\
+  {									\
+    register unsigned char *__base = b;					\
+    register unsigned long __pos = p;
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    register unsigned char *__base = (b).Base;				\
+    register unsigned long __pos = (b).pos;
+
+#define ENCODE_BIT(b)							\
+  do {									\
+    if (b)								\
+      __base[__pos>>3] |= 0x80 >> (__pos&7);				\
+    else								\
+      __base[__pos>>3] &= 0xff7f >> (__pos&7);				\
+    __pos++;								\
+  } while(0)
+
+#define ENCODE_PAUSE(b)							\
+    (b).Base = __base;							\
+    (b).pos = __pos;							\
+  }
+
+#define ENCODE_FLUSH
+
+
+#define ENCODE_DONE							\
+    ENCODE_FLUSH;							\
+  }
+
+
+#define DECODE_START(b,p)						\
+  {									\
+    register unsigned char *__base = b;					\
+    register unsigned long __pos = p;
+
+#define DECODE_CONTINUE(b)						\
+  {									\
+    register unsigned char *__base = (b).Base;				\
+    register unsigned long __pos = (b).pos;
+
+#define DECODE_ADD_FF(b)						\
+  do {									\
+    (b) += (b) + (__base[__pos>>3] & (0x80 >> (__pos&7)) != 0);		\
+    __pos++;								\
+  } while(0)
+
+#define DECODE_ADD_00(b) DECODE_ADD_FF(b)
+
+#define DECODE_BIT 							\
+    (__pos++, ((__base[(__pos-1)>>3] & (0x80 >> ((__pos-1)&7))) != 0))
+
+#define DECODE_DONE	;						\
+  }
+
+#define DECODE_PAUSE(b)							\
+    (b).Base = __base;							\
+    (b).pos = __pos;							\
+  }
+
+#define DECODE_SEEK(pos) __pos = (pos)
+
+#define ENCODE_SEEK(pos) __pos = (pos)
+
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_random.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_random.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_random.h	(revision 21083)
@@ -0,0 +1,168 @@
+/**************************************************************************
+ *
+ * bitio_m_random.h -- Macros for bitio to a file (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are slower than the ones in "mem" files. but 
+ *  with these routines you can mix reads and writes, or multiple writes,  on
+ *  the array of chars at the same time and guarantee them to work, also you 
+ *  can seek to a point and do a write. The decode and encode macros cannot 
+ *  detect when the end off the character is reached and just continue 
+ *  processing.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_RANDOM
+#define H_BITIO_M_RANDOM
+
+typedef struct random_bitio_state
+  {
+    FILE *File;
+    unsigned char *Buf;
+    unsigned long Base;
+    unsigned long Used;
+    unsigned long pos;
+    unsigned long len;
+    unsigned long sft;
+  }
+random_bitio_state;
+
+
+#define ENCODE_START(f,l)						\
+  {									\
+    register FILE *__file = f;						\
+    register unsigned char *__buf;					\
+    register unsigned long __pos = 0;					\
+    register unsigned long __base = 0;					\
+    register unsigned long __used = 0;					\
+    register unsigned long __len = (l)-1;				\
+    register unsigned long __sft = 0;					\
+    while (__len) { __sft++; __len >>=1; }				\
+    __len = 1<<__sft;							\
+    __buf = Xmalloc(__len);						\
+    fseek(__file, 0, 0);						\
+    fread(__buf, 1, __len, __file);
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    register FILE *__file = (b).File;					\
+    register unsigned char *__buf = (b).Buf;				\
+    register unsigned long __pos = (b).pos;				\
+    register unsigned long __base = (b).Base;				\
+    register unsigned long __used = (b).Used;				\
+    register unsigned long __len = (b).len;				\
+    register unsigned long __sft = (b).sft;
+
+#define SEEK fprintf(stderr, "Seek to %d\n",__base)
+#define READ fprintf(stderr, "Read of %d\n",__len)
+#define WRITE fprintf(stderr, "Write of %d\n",__used)
+
+#define WRITE_READ 							\
+	(__used ? (fseek(__file, __base, 0),				\
+                   fwrite(__buf, 1, __len, __file)) : 0,		\
+        __base += __len,						\
+	fseek(__file, __base, 0),					\
+        fread(__buf, 1, __len, __file),					\
+	__pos = 0, __used = 0)
+
+#define ENCODE_BIT(b)							\
+  do {									\
+    if (b)								\
+      __buf[__pos>>3] |= 0x80 >> (__pos&7);				\
+    else								\
+      __buf[__pos>>3] &= 0xff7f >> (__pos&7);				\
+    __used = 1;								\
+    __pos++;								\
+    if ((__pos>>3) >= __len)						\
+      (void)WRITE_READ;							\
+  } while(0)
+
+#define ENCODE_PAUSE(b)							\
+    (b).File = __file;							\
+    (b).Buf = __buf;							\
+    (b).pos = __pos;							\
+    (b).Base = __base;							\
+    (b).Used = __used;							\
+    (b).len = __len;							\
+    (b).sft = __sft;							\
+  }
+
+#define ENCODE_FLUSH							\
+  if (__used)								\
+    {									\
+      fseek(__file, __base, 0);						\
+      fwrite(__buf, 1, __len, __file);					\
+      __used = 0;							\
+    }
+
+
+
+#define ENCODE_DONE							\
+    ENCODE_FLUSH;							\
+    free(__buf);							\
+  }
+
+
+#define DECODE_START(f,l) ENCODE_START(f,l)
+
+#define DECODE_CONTINUE(b) ENCODE_CONTINUE(b)
+
+#define DECODE_BIT 							\
+    (__pos++, (((__pos-1)>>3) >= __len ? WRITE_READ, __pos=1 : 0),	\
+     ((__buf[(__pos-1)>>3] & (0x80 >> ((__pos-1)&7))) != 0))
+
+#define DECODE_ADD_FF(b) ((b) += (b) + DECODE_BIT)
+
+#define DECODE_ADD_00(b) DECODE_ADD_FF(b)
+
+#define DECODE_DONE ENCODE_DONE
+
+#define DECODE_PAUSE(b)	ENCODE_PAUSE(b)
+
+#define ENCODE_SEEK(pos) 						\
+  do {									\
+    if ((((pos)>>3) >= __base) && ((((pos)+7)>>3) < (__base+__len)))   	\
+      __pos = (pos)-(__base << 3); 					\
+    else								\
+      {									\
+        ENCODE_FLUSH;							\
+        __base = (pos) >> 3;						\
+        __base = ((pos)  >> (__sft+3)) << __sft;			\
+        fseek(__file, __base, 0);					\
+        fread(__buf, 1, __len, __file);					\
+        __pos = (pos)&7; 						\
+        __pos = (pos)&((8 << __sft)-1);					\
+      }									\
+  } while(0)
+
+
+#define DECODE_SEEK(pos) ENCODE_SEEK(pos)
+
+#define ENCODE_TELL ((__base << 3) + __pos)
+
+#define DECODE_TELL ENCODE_TELL
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_stdio.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_stdio.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_m_stdio.h	(revision 21083)
@@ -0,0 +1,147 @@
+/**************************************************************************
+ *
+ * bitio_m_stdio.h -- Macros for bitio to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains macros for doing bitwise input and output on a FILE*.
+ *  With these routines you cannot mix reads and writes on the FILE,
+ *  or multiple writes, at the same time and guarantee them to work, also you 
+ *  cannot seek to a point and do a write. The decode routine can detect when
+ *  you run off the end of the file and will produce an approate error message.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_STDIO
+#define H_BITIO_M_STDIO
+
+typedef struct stdio_bitio_state
+  {
+    FILE *File;
+    unsigned char Buff;
+    unsigned char Btg;
+  }
+stdio_bitio_state;
+
+
+
+#ifndef DECODE_ERROR
+#define DECODE_ERROR (fprintf(stderr,"Unexpected EOF in \"%s\" on line %d\n",\
+				__FILE__, __LINE__), exit(1))
+#endif
+
+
+
+#define ENCODE_START(f)							\
+  {									\
+    FILE *__outfile = f;						\
+    register unsigned char __buff = 0;					\
+    register unsigned char __btg = sizeof(__buff)*8;
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    FILE *__outfile = (b).File;						\
+    register unsigned char __buff = (b).Buff;				\
+    register unsigned char __btg = (b).Btg;
+
+#define ENCODE_BIT(b)							\
+  do {									\
+    __btg--;								\
+    if (b) __buff |= (1 << __btg);					\
+    if (!__btg)								\
+      {									\
+	putc(__buff, __outfile);					\
+	__buff = 0;							\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+  } while(0)
+
+#define ENCODE_PAUSE(b)							\
+    (b).File = __outfile;						\
+    (b).Buff = __buff;							\
+    (b).Btg =  __btg;							\
+  }
+
+#define ENCODE_DONE							\
+    if (__btg != sizeof(__buff)*8)					\
+      putc(__buff,__outfile);						\
+  }
+
+
+#define DECODE_START(f)							\
+  {									\
+    FILE *__infile = f;							\
+    register unsigned char __buff = 0;					\
+    register unsigned char __btg = 0;
+
+#define DECODE_CONTINUE(b)						\
+  {									\
+    FILE *__infile = (b).File;						\
+    register unsigned char __buff = (b).Buff;				\
+    register unsigned char __btg = (b).Btg;
+
+#define DECODE_ADD_FF(b)						\
+  do {									\
+    if (!__btg)								\
+      {									\
+	register int val = getc(__infile);				\
+	__buff = val == EOF ? 0xff : val;				\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+    (b) += (b) + ((__buff >> --__btg) & 1);				\
+  } while(0)
+
+#define DECODE_ADD_00(b)						\
+  do {									\
+    if (!__btg)								\
+      {									\
+	register int val = getc(__infile);				\
+	__buff = val == EOF ? 0xff : val;				\
+	__btg = sizeof(__buff)*8;					\
+      }									\
+    (b) += (b) + ((__buff >> --__btg) & 1);				\
+  } while(0)
+
+#define DECODE_BIT (__btg ? (__buff >> --__btg) & 1 :			\
+   (__buff = getc(__infile), (feof(__infile) ?				\
+    (DECODE_ERROR, 0) :							\
+    (__btg = sizeof(__buff)*8, (__buff >> --__btg) & 1))))
+
+#define DECODE_DONE	;						\
+  }
+
+#define DECODE_PAUSE(b)							\
+    (b).File = __infile;						\
+    (b).Buff = __buff;							\
+    (b).Btg =  __btg;							\
+  }
+
+
+#define DECODE_SEEK(pos)						\
+  do {									\
+    register long __new_pos = (pos);					\
+    fseek(__infile, __new_pos >> 3, 0);					\
+    __buff = getc(__infile);						\
+    __btg = 8 - (__new_pos&7);						\
+    }									\
+  while(0)
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.c	(revision 21083)
@@ -0,0 +1,256 @@
+/**************************************************************************
+ *
+ * bitio_mem.c -- Functions for bitio to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:45  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:31:47  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:39  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+#include "sysfuncs.h"
+
+#include "bitio_m_mem.h"
+#include "bitio_m.h"
+
+int fprintf (FILE *, const char *,...);
+
+
+
+void 
+BIO_Mem_Encode_Start (void *buf, int rem, mem_bitio_state * bs)
+{
+  ENCODE_START (buf, rem)
+    ENCODE_PAUSE (*bs)
+}
+
+void 
+BIO_Mem_Encode_Done (mem_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_DONE
+}
+
+
+void 
+BIO_Mem_Decode_Start (void *buf, int rem, mem_bitio_state * bs)
+{
+  DECODE_START (buf, rem)
+    DECODE_PAUSE (*bs)
+}
+
+
+
+
+void 
+BIO_Mem_Unary_Encode (unsigned long val, mem_bitio_state * bs,
+		      unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_ENCODE_L (val, *bits);
+  else
+    UNARY_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Unary_Decode (mem_bitio_state * bs,
+		      unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_DECODE_L (val, *bits);
+  else
+    UNARY_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Mem_Binary_Encode (unsigned long val, unsigned long b,
+		       mem_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_ENCODE_L (val, b, *bits);
+  else
+    BINARY_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Binary_Decode (unsigned long b, mem_bitio_state * bs,
+		       unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_DECODE_L (val, b, *bits);
+  else
+    BINARY_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Mem_Gamma_Encode (unsigned long val, mem_bitio_state * bs,
+		      unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_ENCODE_L (val, *bits);
+  else
+    GAMMA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Gamma_Decode (mem_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_DECODE_L (val, *bits);
+  else
+    GAMMA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Mem_Delta_Encode (unsigned long val, mem_bitio_state * bs,
+		      unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_ENCODE_L (val, *bits);
+  else
+    DELTA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Delta_Decode (mem_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_DECODE_L (val, *bits);
+  else
+    DELTA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mem_Elias_Encode (unsigned long val, unsigned long b, double s,
+		      mem_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_ENCODE_L (val, b, s, *bits);
+  else
+    ELIAS_ENCODE (val, b, s);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Elias_Decode (unsigned long b, double s,
+		      mem_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_DECODE_L (val, b, s, *bits);
+  else
+    ELIAS_DECODE (val, b, s);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mem_Bblock_Encode (unsigned long val, unsigned long b,
+		       mem_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_ENCODE_L (val, b, *bits);
+  else
+    BBLOCK_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mem_Bblock_Decode (unsigned long b, mem_bitio_state * bs,
+		       unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_DECODE_L (val, b, *bits);
+  else
+    BBLOCK_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mem_Decode_Seek (unsigned long pos, mem_bitio_state * bs)
+{
+  DECODE_CONTINUE (*bs)
+    DECODE_SEEK (pos);
+  DECODE_PAUSE (*bs)
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_mem.h	(revision 21083)
@@ -0,0 +1,105 @@
+/**************************************************************************
+ *
+ * bitio_mem.h -- Functions for bitio to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains function definitions for doing bitwise input and output
+ *  of numbers on an array of chars. These routines are faster than the ones 
+ *  in "mems" files. But with these routines you cannot mix reads and writes 
+ *  on the array of chars, or multiple write, at the same time and guarantee
+ *  them to work, also you cannot seek to a point and do a write. The decode
+ *  routine can detect when you run off the end of the array and will produce
+ *  an approate error message, and the encode routine will stop when it gets
+ *  to the end of the character array. 
+ *
+ *
+ **************************************************************************/
+
+
+#ifndef H_BITIO_MEM
+#define H_BITIO_MEM
+
+
+
+typedef struct mem_bitio_state
+  {
+    unsigned char *Base;
+    unsigned char *Pos;
+    int Remaining;
+    unsigned char Buff;
+    unsigned char Btg;
+  }
+mem_bitio_state;
+
+
+/* NOTE : All bytes are filled high bit first */
+
+
+void BIO_Mem_Encode_Start (void *buf, int rem, mem_bitio_state * bs);
+void BIO_Mem_Encode_Done (mem_bitio_state * bs);
+
+
+
+void BIO_Mem_Decode_Start (void *buf, int rem, mem_bitio_state * bs);
+
+
+
+void BIO_Mem_Unary_Encode (unsigned long val, mem_bitio_state * bs,
+			   unsigned long *bits);
+unsigned long BIO_Mem_Unary_Decode (mem_bitio_state * bs,
+				    unsigned long *bits);
+
+
+
+void BIO_Mem_Binary_Encode (unsigned long val, unsigned long b,
+			    mem_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mem_Binary_Decode (unsigned long b, mem_bitio_state * bs,
+				     unsigned long *bits);
+
+
+
+void BIO_Mem_Gamma_Encode (unsigned long val, mem_bitio_state * bs,
+			   unsigned long *bits);
+unsigned long BIO_Mem_Gamma_Decode (mem_bitio_state * bs, unsigned long *bits);
+
+
+
+void BIO_Mem_Delta_Encode (unsigned long val, mem_bitio_state * bs,
+			   unsigned long *bits);
+unsigned long BIO_Mem_Delta_Decode (mem_bitio_state * bs, unsigned long *bits);
+
+
+void BIO_Mem_Elias_Encode (unsigned long val, unsigned long b, double s,
+			   mem_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mem_Elias_Decode (unsigned long b, double s,
+				 mem_bitio_state * bs, unsigned long *bits);
+
+
+void BIO_Mem_Bblock_Encode (unsigned long val, unsigned long b,
+			    mem_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mem_Bblock_Decode (unsigned long b, mem_bitio_state * bs,
+				     unsigned long *bits);
+
+
+void BIO_Mem_Decode_Seek (unsigned long pos, mem_bitio_state * bs);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.c	(revision 21083)
@@ -0,0 +1,265 @@
+/**************************************************************************
+ *
+ * bitio_mems.c -- Functions for bitio to memory (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:45  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:31:48  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:39  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+#include "sysfuncs.h"
+
+#include "bitio_m_mems.h"
+#include "bitio_m.h"
+
+int fprintf (FILE *, const char *,...);
+
+
+
+void 
+BIO_Mems_Encode_Start (unsigned char *buf, unsigned long pos,
+		       mems_bitio_state * bs)
+{
+  ENCODE_START (buf, pos)
+    ENCODE_PAUSE (*bs)
+}
+
+void 
+BIO_Mems_Encode_Done (mems_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_DONE
+}
+
+
+void 
+BIO_Mems_Decode_Start (unsigned char *buf, unsigned long pos,
+		       mems_bitio_state * bs)
+{
+  DECODE_START (buf, pos)
+    DECODE_PAUSE (*bs)
+}
+
+
+
+
+void 
+BIO_Mems_Unary_Encode (unsigned long val, mems_bitio_state * bs,
+		       unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_ENCODE_L (val, *bits);
+  else
+    UNARY_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Unary_Decode (mems_bitio_state * bs,
+		       unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_DECODE_L (val, *bits);
+  else
+    UNARY_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Mems_Binary_Encode (unsigned long val, unsigned long b,
+			mems_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_ENCODE_L (val, b, *bits);
+  else
+    BINARY_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Binary_Decode (unsigned long b, mems_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_DECODE_L (val, b, *bits);
+  else
+    BINARY_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Mems_Gamma_Encode (unsigned long val, mems_bitio_state * bs,
+		       unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_ENCODE_L (val, *bits);
+  else
+    GAMMA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Gamma_Decode (mems_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_DECODE_L (val, *bits);
+  else
+    GAMMA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Mems_Delta_Encode (unsigned long val, mems_bitio_state * bs,
+		       unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_ENCODE_L (val, *bits);
+  else
+    DELTA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Delta_Decode (mems_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_DECODE_L (val, *bits);
+  else
+    DELTA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mems_Elias_Encode (unsigned long val, unsigned long b, double s,
+		       mems_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_ENCODE_L (val, b, s, *bits);
+  else
+    ELIAS_ENCODE (val, b, s);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Elias_Decode (unsigned long b, double s,
+		       mems_bitio_state * bs, unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_DECODE_L (val, b, s, *bits);
+  else
+    ELIAS_DECODE (val, b, s);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mems_Bblock_Encode (unsigned long val, unsigned long b,
+			mems_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_ENCODE_L (val, b, *bits);
+  else
+    BBLOCK_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Mems_Bblock_Decode (unsigned long b, mems_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_DECODE_L (val, b, *bits);
+  else
+    BBLOCK_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Mems_Decode_Seek (unsigned long pos, mems_bitio_state * bs)
+{
+  DECODE_CONTINUE (*bs)
+    DECODE_SEEK (pos);
+  DECODE_PAUSE (*bs)
+}
+
+void 
+BIO_Mems_Encode_Seek (unsigned long pos, mems_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_SEEK (pos);
+  ENCODE_PAUSE (*bs)
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_mems.h	(revision 21083)
@@ -0,0 +1,99 @@
+/**************************************************************************
+ *
+ * bitio_mems.h -- Functions for bitio to memory (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains function definitions for doing bitwise input and output
+ *  of numbers on an array of chars. These routines are slower than the ones 
+ *  in "mem" files. but with these routines you can mix reads and writes, or 
+ *  multiple writes,  on the array of chars at the same time and guarantee
+ *  them to work, also you can seek to a point and do a write. The decode and 
+ *  encode functions cannot detect when the end off the character is reached
+ *  and just continue processing.
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_MEMS
+#define H_BITIO_MEMS
+
+
+
+typedef struct mems_bitio_state
+  {
+    unsigned char *Base;
+    unsigned long pos;
+  }
+mems_bitio_state;
+
+
+/* NOTE : All bytes are filled high bit first */
+
+
+void BIO_Mems_Encode_Start (char *buf, unsigned long pos, mems_bitio_state * bs);
+void BIO_Mems_Encode_Done (mems_bitio_state * bs);
+
+
+
+void BIO_Mems_Decode_Start (void *buf, unsigned long pos, mems_bitio_state * bs);
+
+
+
+void BIO_Mems_Unary_Encode (unsigned long val, mems_bitio_state * bs,
+			    unsigned long *bits);
+unsigned long BIO_Mems_Unary_Decode (mems_bitio_state * bs,
+				     unsigned long *bits);
+
+
+
+void BIO_Mems_Binary_Encode (unsigned long val, unsigned long b,
+			     mems_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mems_Binary_Decode (unsigned long b, mems_bitio_state * bs,
+				      unsigned long *bits);
+
+
+
+void BIO_Mems_Gamma_Encode (unsigned long val, mems_bitio_state * bs,
+			    unsigned long *bits);
+unsigned long BIO_Mems_Gamma_Decode (mems_bitio_state * bs, unsigned long *bits);
+
+
+
+void BIO_Mems_Delta_Encode (unsigned long val, mems_bitio_state * bs,
+			    unsigned long *bits);
+unsigned long BIO_Mems_Delta_Decode (mems_bitio_state * bs, unsigned long *bits);
+
+
+void BIO_Mems_Elias_Encode (unsigned long val, unsigned long b, double s,
+			    mems_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mems_Elias_Decode (unsigned long b, double s,
+				mems_bitio_state * bs, unsigned long *bits);
+
+
+void BIO_Mems_Bblock_Encode (unsigned long val, unsigned long b,
+			     mems_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Mems_Bblock_Decode (unsigned long b, mems_bitio_state * bs,
+				      unsigned long *bits);
+
+
+void BIO_Mems_Decode_Seek (unsigned long pos, mems_bitio_state * bs);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.c	(revision 21083)
@@ -0,0 +1,328 @@
+/*************************************************************************
+ *
+ * bitio_random.c -- Functions for bitio to a file (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.2  2001/09/21 12:45:03  kjm18
+   updated mg to be in line with version mg-1.3f. Now uses long long for
+   some variables to enable indexing of very large collections.
+
+   Revision 1.1  1999/08/10 21:16:46  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:31:50  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:40  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+#include "longlong.h"
+
+#include "bitio_m_random.h"
+#include "bitio_m.h"
+
+
+void 
+BIO_Random_Start (FILE * f, unsigned long len,
+		  random_bitio_state * bs)
+{
+  ENCODE_START (f, len)
+    ENCODE_PAUSE (*bs)
+}
+
+void 
+BIO_Random_Done (random_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_DONE
+}
+
+void 
+BIO_Random_Encode_Bit (int bit, random_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_BIT (bit);
+  ENCODE_PAUSE (*bs)
+}
+
+int 
+BIO_Random_Decode_Bit (random_bitio_state * bs)
+{
+  register int val;
+  DECODE_CONTINUE (*bs)
+    val = DECODE_BIT;
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+void 
+BIO_Random_Unary_Encode (unsigned long val, random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_ENCODE_L (val, *bits);
+  else
+    UNARY_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Unary_Decode (random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_DECODE_L (val, *bits);
+  else
+    UNARY_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Random_Binary_Encode (unsigned long val, unsigned long b,
+			  random_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_ENCODE_L (val, b, *bits);
+  else
+    BINARY_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Binary_Decode (unsigned long b,
+			  random_bitio_state * bs,
+			  unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_DECODE_L (val, b, *bits);
+  else
+    BINARY_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Random_Gamma_Encode (unsigned long val, random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_ENCODE_L (val, *bits);
+  else
+    GAMMA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Gamma_Decode (random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_DECODE_L (val, *bits);
+  else
+    GAMMA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Random_Delta_Encode (unsigned long val, random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_ENCODE_L (val, *bits);
+  else
+    DELTA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Delta_Decode (random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_DECODE_L (val, *bits);
+  else
+    DELTA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Random_Elias_Encode (unsigned long val, unsigned long b, double s,
+			 random_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_ENCODE_L (val, b, s, *bits);
+  else
+    ELIAS_ENCODE (val, b, s);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Elias_Decode (unsigned long b, double s,
+			 random_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_DECODE_L (val, b, s, *bits);
+  else
+    ELIAS_DECODE (val, b, s);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Random_Bblock_Encode (unsigned long val, unsigned long b,
+			  random_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_ENCODE_L (val, b, *bits);
+  else
+    BBLOCK_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Random_Bblock_Decode (unsigned long b,
+			  random_bitio_state * bs,
+			  unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_DECODE_L (val, b, *bits);
+  else
+    BBLOCK_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Random_Seek (unsigned long pos, random_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_SEEK (pos);
+  ENCODE_PAUSE (*bs)
+}
+void 
+BIO_Random_Flush (random_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_FLUSH;
+  ENCODE_PAUSE (*bs)
+}
+
+unsigned long 
+BIO_Random_Tell (random_bitio_state * bs)
+{
+  register unsigned long t;
+  ENCODE_CONTINUE (*bs)
+    t = ENCODE_TELL;
+  ENCODE_PAUSE (*bs)
+    return (t);
+}
+
+#ifdef USE_LONG_LONG
+
+void 
+BIO_Random_Seek_LL (mg_ullong pos, random_bitio_state * bs)
+{
+  ENCODE_CONTINUE(*bs)
+
+    if ((((pos) >> 3) >= (mg_ullong)__base) &&
+	((((pos)+7) >> 3) < (mg_ullong)(__base + __len)))
+      {
+	__pos = (long)((pos) - (mg_ullong)(__base << 3));
+      }
+    else
+      {
+        ENCODE_FLUSH;
+	__base = (long)(((pos) >> (__sft+3)) << __sft);
+	
+	fseek(__file,__base,0);
+	fread(__buf,1,__len,__file);
+	__pos = (long)((pos) & ((8 << __sft)-1));
+      }
+  
+  ENCODE_PAUSE(*bs)
+}
+
+mg_ullong 
+BIO_Random_Tell_LL (random_bitio_state * bs)
+{
+  mg_ullong t;
+  ENCODE_CONTINUE(*bs)
+    t = (((mg_ullong)__base) << 3ull) + __pos;
+  ENCODE_PAUSE(*bs)
+  return(t);  
+}
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_random.h	(revision 21083)
@@ -0,0 +1,127 @@
+/**************************************************************************
+ *
+ * bitio_random.h -- Functions for bitio to a file (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains function definitions for doing bitwise input and output
+ *  of numbers on an array of chars. These routines are slower than the ones 
+ *  in "mem" files. but with these routines you can mix reads and writes, or 
+ *  multiple writes,  on the array of chars at the same time and guarantee
+ *  them to work, also you can seek to a point and do a write. The decode and 
+ *  encode functions cannot detect when the end off the character is reached
+ *  and just continue processing.
+ *
+ *  Modified:
+ *   - long long seek and tell ops
+ *     (1999-08-03 Tim Bell <bhat@cs.mu.oz.au>)
+ **************************************************************************/
+
+#ifndef H_BITIO_RANDOM
+#define H_BITIO_RANDOM
+
+#include "longlong.h"
+
+
+typedef struct random_bitio_state
+  {
+    FILE *File;
+    unsigned char *Buf;
+    unsigned long Base;
+    unsigned long Used;
+    unsigned long pos;
+    unsigned long len;
+    unsigned long sft;
+  }
+random_bitio_state;
+
+
+/* NOTE : All bytes are filled high bit first */
+
+
+void BIO_Random_Start (FILE * f, unsigned long len,
+		       random_bitio_state * bs);
+void BIO_Random_Done (random_bitio_state * bs);
+
+
+
+void BIO_Random_Decode_Start (void *buf, unsigned long pos,
+			      random_bitio_state * bs);
+
+void BIO_Random_Encode_Bit (int bit, random_bitio_state * bs);
+
+int BIO_Random_Decode_Bit (random_bitio_state * bs);
+
+
+void BIO_Random_Unary_Encode (unsigned long val, random_bitio_state * bs,
+			      unsigned long *bits);
+unsigned long BIO_Random_Unary_Decode (random_bitio_state * bs,
+				       unsigned long *bits);
+
+
+
+void BIO_Random_Binary_Encode (unsigned long val, unsigned long b,
+			       random_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Random_Binary_Decode (unsigned long b, random_bitio_state * bs,
+					unsigned long *bits);
+
+
+
+void BIO_Random_Gamma_Encode (unsigned long val, random_bitio_state * bs,
+			      unsigned long *bits);
+unsigned long BIO_Random_Gamma_Decode (random_bitio_state * bs,
+				       unsigned long *bits);
+
+
+
+void BIO_Random_Delta_Encode (unsigned long val, random_bitio_state * bs,
+			      unsigned long *bits);
+unsigned long BIO_Random_Delta_Decode (random_bitio_state * bs,
+				       unsigned long *bits);
+
+
+void BIO_Random_Elias_Encode (unsigned long val, unsigned long b, double s,
+			      random_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Random_Elias_Decode (unsigned long b, double s,
+				       random_bitio_state * bs,
+				       unsigned long *bits);
+
+
+void BIO_Random_Bblock_Encode (unsigned long val, unsigned long b,
+			       random_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Random_Bblock_Decode (unsigned long b,
+					random_bitio_state * bs,
+					unsigned long *bits);
+
+
+void BIO_Random_Seek (unsigned long pos, random_bitio_state * bs);
+
+void BIO_Random_Flush (random_bitio_state * bs);
+
+unsigned long BIO_Random_Tell (random_bitio_state * bs);
+
+#ifdef USE_LONG_LONG
+
+void BIO_Random_Seek_LL (mg_ullong pos, random_bitio_state * bs);
+mg_ullong BIO_Random_Tell_LL (random_bitio_state * bs);
+
+#endif /* USE_LONG_LONG */
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.c	(revision 21083)
@@ -0,0 +1,281 @@
+/**************************************************************************
+ *
+ * bitio_stdio.c -- Functions for bitio to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:47  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:31:52  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:41  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+#include "sysfuncs.h"
+
+#include "bitio_m_stdio.h"
+#include "bitio_m.h"
+
+
+
+void 
+BIO_Stdio_Encode_Start (FILE * f, stdio_bitio_state * bs)
+{
+  ENCODE_START (f)
+    ENCODE_PAUSE (*bs)
+}
+
+void 
+BIO_Stdio_Encode_Done (stdio_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_DONE
+}
+
+
+void 
+BIO_Stdio_Decode_Start (FILE * f, stdio_bitio_state * bs)
+{
+  DECODE_START (f)
+    DECODE_PAUSE (*bs)
+}
+
+void 
+BIO_Stdio_Encode_Bit (int bit, stdio_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    ENCODE_BIT (bit);
+  ENCODE_PAUSE (*bs)
+}
+
+
+int 
+BIO_Stdio_Decode_Bit (stdio_bitio_state * bs)
+{
+  register int val;
+  DECODE_CONTINUE (*bs)
+    val = DECODE_BIT;
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Stdio_Unary_Encode (unsigned long val, stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_ENCODE_L (val, *bits);
+  else
+    UNARY_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Unary_Decode (stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    UNARY_DECODE_L (val, *bits);
+  else
+    UNARY_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Stdio_Binary_Encode (unsigned long val, unsigned long b,
+			 stdio_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_ENCODE_L (val, b, *bits);
+  else
+    BINARY_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Binary_Decode (unsigned long b, stdio_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BINARY_DECODE_L (val, b, *bits);
+  else
+    BINARY_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+
+
+
+void 
+BIO_Stdio_Gamma_Encode (unsigned long val, stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_ENCODE_L (val, *bits);
+  else
+    GAMMA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Gamma_Decode (stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    GAMMA_DECODE_L (val, *bits);
+  else
+    GAMMA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Stdio_Delta_Encode (unsigned long val, stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_ENCODE_L (val, *bits);
+  else
+    DELTA_ENCODE (val);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Delta_Decode (stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    DELTA_DECODE_L (val, *bits);
+  else
+    DELTA_DECODE (val);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+
+void 
+BIO_Stdio_Elias_Encode (unsigned long val, unsigned long b, double s,
+			stdio_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_ENCODE_L (val, b, s, *bits);
+  else
+    ELIAS_ENCODE (val, b, s);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Elias_Decode (unsigned long b, double s,
+			stdio_bitio_state * bs,
+			unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    ELIAS_DECODE_L (val, b, s, *bits);
+  else
+    ELIAS_DECODE (val, b, s);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+
+
+void 
+BIO_Stdio_Bblock_Encode (unsigned long val, unsigned long b,
+			 stdio_bitio_state * bs, unsigned long *bits)
+{
+  ENCODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_ENCODE_L (val, b, *bits);
+  else
+    BBLOCK_ENCODE (val, b);
+  ENCODE_PAUSE (*bs)
+}
+
+
+unsigned long 
+BIO_Stdio_Bblock_Decode (unsigned long b, stdio_bitio_state * bs,
+			 unsigned long *bits)
+{
+  register unsigned long val;
+  DECODE_CONTINUE (*bs)
+    if (bits)
+    BBLOCK_DECODE_L (val, b, *bits);
+  else
+    BBLOCK_DECODE (val, b);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
+
+void 
+BIO_Stdio_Decode_Seek (unsigned long pos, stdio_bitio_state * bs)
+{
+  DECODE_CONTINUE (*bs)
+    DECODE_SEEK (pos);
+  DECODE_PAUSE (*bs)
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/bitio_stdio.h	(revision 21083)
@@ -0,0 +1,106 @@
+/**************************************************************************
+ *
+ * bitio_stdio.h -- Functions for bitio to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  This file contains function definitions for doing bitwise input and output
+ *  of number on a FILE*. With these function you cannot mix reads and writes
+ *  on the FILE, or multiple writes, at the same time and guarantee them to 
+ *  work, also you  cannot seek to a point and do a write. The decode function
+ *  can detect when you run off the end of the file and will produce an 
+ *  approate error message.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_STDIO
+#define H_BITIO_STDIO
+
+
+typedef struct stdio_bitio_state
+  {
+    FILE *File;
+    unsigned char Buff;
+    unsigned char Btg;
+  }
+stdio_bitio_state;
+
+
+/* NOTE : All bytes are filled high bit first */
+
+
+void BIO_Stdio_Encode_Start (FILE * f, stdio_bitio_state * bs);
+void BIO_Stdio_Encode_Done (stdio_bitio_state * bs);
+
+
+
+void BIO_Stdio_Decode_Start (FILE * f, stdio_bitio_state * bs);
+
+
+
+void BIO_Stdio_Encode_Bit (int bit, stdio_bitio_state * bs);
+int BIO_Stdio_Decode_Bit (stdio_bitio_state * bs);
+
+
+void BIO_Stdio_Unary_Encode (unsigned long val, stdio_bitio_state * bs,
+			     unsigned long *bits);
+unsigned long BIO_Stdio_Unary_Decode (stdio_bitio_state * bs,
+				      unsigned long *bits);
+
+
+
+void BIO_Stdio_Binary_Encode (unsigned long val, unsigned long b,
+			      stdio_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Stdio_Binary_Decode (unsigned long b, stdio_bitio_state * bs,
+				       unsigned long *bits);
+
+
+
+void BIO_Stdio_Gamma_Encode (unsigned long val, stdio_bitio_state * bs,
+			     unsigned long *bits);
+unsigned long BIO_Stdio_Gamma_Decode (stdio_bitio_state * bs,
+				      unsigned long *bits);
+
+
+
+void BIO_Stdio_Delta_Encode (unsigned long val, stdio_bitio_state * bs,
+			     unsigned long *bits);
+unsigned long BIO_Stdio_Delta_Decode (stdio_bitio_state * bs,
+				      unsigned long *bits);
+
+
+
+void BIO_Stdio_Elias_Encode (unsigned long val, unsigned long b, double s,
+			     stdio_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Stdio_Elias_Decode (unsigned long b, double s,
+				      stdio_bitio_state * bs,
+				      unsigned long *bits);
+
+
+void BIO_Stdio_Bblock_Encode (unsigned long val, unsigned long b,
+			      stdio_bitio_state * bs, unsigned long *bits);
+unsigned long BIO_Stdio_Bblock_Decode (unsigned long b, stdio_bitio_state * bs,
+				       unsigned long *bits);
+
+
+void BIO_Stdio_Decode_Seek (unsigned long pos, stdio_bitio_state * bs);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/error.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/error.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/error.c	(revision 21083)
@@ -0,0 +1,127 @@
+/* error.c -- error handler for noninteractive utilities
+   Copyright (C) 1990, 91, 92, 93, 94 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by David MacKenzie <djm@gnu.ai.mit.edu>.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#include <stdio.h>
+
+#if HAVE_VPRINTF || HAVE_DOPRNT
+# if __STDC__
+#  include <stdarg.h>
+#  define VA_START(args, lastarg) va_start(args, lastarg)
+# else
+#  include <varargs.h>
+#  define VA_START(args, lastarg) va_start(args)
+# endif
+#else
+# define va_alist a1, a2, a3, a4, a5, a6, a7, a8
+# define va_dcl char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
+#endif
+
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <string.h>
+#else
+void exit ();
+#endif
+
+/* If NULL, error will flush stdout, then print on stderr the program
+   name, a colon and a space.  Otherwise, error will call this
+   function without parameters instead.  */
+void (*error_print_progname) () = NULL;
+
+/* The calling program should define program_name and set it to the
+   name of the executing program.  */
+#if 0 /* [RB/TS:10/95] do not use program_name */
+extern char *program_name;
+#endif
+
+#if HAVE_STRERROR
+char *strerror (int errnum);
+#else
+static char *
+private_strerror (errnum)
+     int errnum;
+{
+  extern char *sys_errlist[];
+  extern int sys_nerr;
+
+  if (errnum > 0 && errnum <= sys_nerr)
+    return sys_errlist[errnum];
+  return "Unknown system error";
+}
+#define strerror private_strerror
+#endif
+
+/* Print the program name and error message MESSAGE, which is a printf-style
+   format string with optional args.
+   If ERRNUM is nonzero, print its corresponding system error message.
+   Exit with status STATUS if it is nonzero.  */
+/* VARARGS */
+
+void
+#if defined(VA_START) && __STDC__
+error (int status, int errnum, const char *message, ...)
+#else
+error (status, errnum, message, va_alist)
+     int status;
+     int errnum;
+     char *message;
+     va_dcl
+#endif
+{
+#ifdef VA_START
+  va_list args;
+#endif
+
+  if (error_print_progname)
+    (*error_print_progname) ();
+  else
+    {
+      fflush (stdout);
+#if 0 /* [RB/TS:10/95] do not use program_name */
+      fprintf (stderr, "%s: ", program_name);
+#endif
+    }
+
+#ifdef VA_START
+  VA_START (args, message);
+# if HAVE_VPRINTF
+  vfprintf (stderr, message, args);
+# else
+  _doprnt (message, args, stderr);
+# endif
+  va_end (args);
+#else
+  fprintf (stderr, message, a1, a2, a3, a4, a5, a6, a7, a8);
+#endif
+
+  if (errnum)
+    fprintf (stderr, ": %s", strerror (errnum));
+  putc ('\n', stderr);
+  fflush (stderr);
+  if (status)
+    exit (status);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/filestats.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/filestats.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/filestats.c	(revision 21083)
@@ -0,0 +1,133 @@
+/**************************************************************************
+ *
+ * filestats.c -- Functions for keeping stats on file accesses
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:48  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:31:54  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:42  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "filestats.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+File *
+Fopen (char *name, char *mode, unsigned long magic)
+{
+  FILE *f;
+  File *F;
+  unsigned long m;
+  if (!(f = fopen (name, mode)))
+    return (NULL);
+  if (magic)
+    switch (*mode)
+      {
+      case 'r':
+	fread ((char *) &m, sizeof (m), 1, f);
+	NTOHUL(m);  /* [RPAP - Jan 97: Endian Ordering] */
+	if (m != magic)
+	  {
+	    fclose (f);
+	    return (NULL);
+	  }
+	break;
+      case 'w':
+	HTONUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+	fwrite ((char *) &magic, sizeof (magic), 1, f);
+      }
+  if (!(F = Xmalloc (sizeof (File))))
+    {
+      fclose (f);
+      return (NULL);
+    }
+  F->pathname = Xstrdup (name);
+  F->name = strrchr (F->pathname, '/');
+  F->name = F->name ? F->name + 1 : F->pathname;
+  F->f = f;
+  F->Current.NumSeeks = F->Current.NumReads = F->Current.NumBytes = 0;
+  F->Cumulative = F->Current;
+  return (F);
+}
+
+
+int 
+Fclose (File * F)
+{
+  int num;
+  if (!F)
+    return (0);
+  num = fclose (F->f);
+  if (F->pathname)
+    Xfree (F->pathname);
+  Xfree (F);
+  return (num);
+}
+
+size_t 
+Fread (void *ptr, size_t size, size_t nitems, File * F)
+{
+  int num;
+  num = fread ((char *) ptr, size, nitems, F->f);
+  F->Current.NumReads++;
+  F->Current.NumBytes += num * size;
+  return (num);
+}
+
+int 
+Fseek (File * F, long offset, int ptrname)
+{
+  int num;
+  num = fseek (F->f, offset, ptrname);
+  F->Current.NumSeeks++;
+  return (num);
+}
+
+void 
+Rewind (File * F)
+{
+  rewind (F->f);
+  F->Current.NumSeeks++;
+}
+
+
+void 
+ZeroFileStats (File * F)
+{
+  F->Cumulative.NumSeeks += F->Current.NumSeeks;
+  F->Cumulative.NumReads += F->Current.NumReads;
+  F->Cumulative.NumBytes += F->Current.NumBytes;
+  F->Current.NumSeeks = F->Current.NumReads = F->Current.NumBytes = 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/filestats.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/filestats.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/filestats.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**************************************************************************
+ *
+ * filestats.h -- Functions for keeping stats on file accesses
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_FILESTATS
+#define H_FILESTATS
+
+#include "sysfuncs.h"
+
+typedef struct FileStats
+  {
+    unsigned long NumSeeks;
+    unsigned long NumReads;
+    unsigned long NumBytes;
+  }
+FileStats;
+
+
+
+typedef struct
+  {
+    FILE *f;
+    char *pathname;
+    char *name;
+    FileStats Current;
+    FileStats Cumulative;
+  }
+File;
+
+/* if magic is 0 no magic number is read or written */
+File *Fopen (char *name, char *mode, unsigned long magic);
+
+size_t Fread (void *ptr, size_t size, size_t nitems, File * F);
+
+int Fseek (File * F, long offset, int ptrname);
+
+void Rewind (File * F);
+
+int Fclose (File * F);
+
+#define Getc(F) (F->Current.NumReads++, F->Current.NumBytes++, getc(F->f))
+
+/* This adds the Current file stats to the Cumulative stats and then zeros
+   the Current stats */
+void ZeroFileStats (File * F);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/ftruncate.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/ftruncate.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/ftruncate.c	(revision 21083)
@@ -0,0 +1,107 @@
+/* ftruncate emulations that work on some System V's.
+   This file is in the public domain.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef F_CHSIZE
+
+int
+ftruncate (fd, length)
+     int fd;
+     off_t length;
+{
+  return fcntl (fd, F_CHSIZE, length);
+}
+
+#else /* not F_CHSIZE */
+#ifdef F_FREESP
+
+/* By William Kucharski <kucharsk@netcom.com>.  */
+
+#include <sys/stat.h>
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+ftruncate (fd, length)
+     int fd;
+     off_t length;
+{
+  struct flock fl;
+  struct stat filebuf;
+
+  if (fstat (fd, &filebuf) < 0)
+    return -1;
+
+  if (filebuf.st_size < length)
+    {
+      /* Extend file length. */
+      if (lseek (fd, (length - 1), SEEK_SET) < 0)
+	return -1;
+
+      /* Write a "0" byte. */
+      if (write (fd, "", 1) != 1)
+	return -1;
+    }
+  else
+    {
+
+      /* Truncate length. */
+
+      fl.l_whence = 0;
+      fl.l_len = 0;
+      fl.l_start = length;
+      fl.l_type = F_WRLCK;	/* write lock on file space */
+
+      /* This relies on the *undocumented* F_FREESP argument to fcntl,
+	 which truncates the file so that it ends at the position
+	 indicated by fl.l_start.  Will minor miracles never cease?  */
+
+      if (fcntl (fd, F_FREESP, &fl) < 0)
+	return -1;
+    }
+
+  return 0;
+}
+
+#else /* not F_CHSIZE nor F_FREESP */
+#ifdef HAVE_CHSIZE
+
+int
+ftruncate (fd, length)
+     int fd;
+     off_t length;
+{
+  return chsize (fd, length);
+}
+
+#else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+int
+ftruncate (fd, length)
+     int fd;
+     off_t length;
+{
+  errno = EIO;
+  return -1;
+}
+
+#endif /* not HAVE_CHSIZE */
+#endif /* not F_FREESP */
+#endif /* not F_CHSIZE */
Index: /main/tags/2.38/gsdl/packages/mg/lib/getopt.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/getopt.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/getopt.c	(revision 21083)
@@ -0,0 +1,750 @@
+/* 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@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.  */
+
+
+#ifdef HAVE_CONFIG_H
+#include "sysfuncs.h"
+#endif
+
+#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__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#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
+#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;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+#ifdef IN_GCC
+#include "gstddef.h"
+#else
+#include <stddef.h>
+#endif
+extern size_t strlen (const char *);
+#endif
+
+#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 bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+	{
+	  /* Bottom segment is the short one.  */
+	  int len = middle - bottom;
+	  register int i;
+
+	  /* Swap it with the top part of the top segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[top - (middle - bottom) + i];
+	      argv[top - (middle - bottom) + i] = tem;
+	    }
+	  /* Exclude the moved bottom segment from further swapping.  */
+	  top -= len;
+	}
+      else
+	{
+	  /* Top segment is the short one.  */
+	  int len = top - middle;
+	  register int i;
+
+	  /* Swap it with the bottom part of the bottom segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[middle + i];
+	      argv[middle + i] = tem;
+	    }
+	  /* Exclude the moved top segment from further swapping.  */
+	  bottom += len;
+	}
+    }
+
+  /* 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 */
Index: /main/tags/2.38/gsdl/packages/mg/lib/getopt.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/getopt.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/getopt.h	(revision 21083)
@@ -0,0 +1,130 @@
+/* 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 */
Index: /main/tags/2.38/gsdl/packages/mg/lib/getopt1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/getopt1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/getopt1.c	(revision 21083)
@@ -0,0 +1,178 @@
+/* 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 "sysfuncs.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 */
Index: /main/tags/2.38/gsdl/packages/mg/lib/getpagesize.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/getpagesize.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/getpagesize.h	(revision 21083)
@@ -0,0 +1,38 @@
+/* Emulate getpagesize on systems that lack it.  */
+
+#ifndef HAVE_GETPAGESIZE
+
+#ifdef VMS
+#define getpagesize() 512
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef _SC_PAGESIZE
+#define getpagesize() sysconf(_SC_PAGESIZE)
+#else
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifndef __WIN32__
+#include <sys/param.h>
+#endif
+
+#ifdef EXEC_PAGESIZE
+#define getpagesize() EXEC_PAGESIZE
+#else
+#ifdef NBPG
+#define getpagesize() NBPG * CLSIZE
+#ifndef CLSIZE
+#define CLSIZE 1
+#endif /* no CLSIZE */
+#else /* no NBPG */
+#ifdef NBPC
+#define getpagesize() NBPC
+#endif /* NBPC */
+#endif /* no NBPG */
+#endif /* no EXEC_PAGESIZE */
+#endif /* no _SC_PAGESIZE */
+
+#endif /* not HAVE_GETPAGESIZE */
Index: /main/tags/2.38/gsdl/packages/mg/lib/gmalloc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/gmalloc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/gmalloc.c	(revision 21083)
@@ -0,0 +1,1318 @@
+/* DO NOT EDIT THIS FILE -- it is automagically generated.  -*- C -*- */
+
+#define _MALLOC_INTERNAL
+
+/* The malloc headers and source files from the C library follow here.  */
+
+/* Declarations for `malloc' and friends.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef _MALLOC_H
+
+#define _MALLOC_H	1
+
+#ifdef _MALLOC_INTERNAL
+
+#ifdef	HAVE_CONFIG_H
+#include <sysfuncs.h>
+#endif
+
+#if	defined(_LIBC) || defined(STDC_HEADERS) || defined(USG)
+#include <string.h>
+#else
+#ifndef memset
+#define	memset(s, zero, n)	bzero ((s), (n))
+#endif
+#ifndef memcpy
+#define	memcpy(d, s, n)		bcopy ((s), (d), (n))
+#endif
+#endif
+
+#if	defined(__GNU_LIBRARY__) || __STDC__
+#include <limits.h>
+#else
+#define	CHAR_BIT	8
+#endif
+
+#ifdef	HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#endif	/* _MALLOC_INTERNAL.  */
+
+
+#ifdef	__cplusplus
+extern "C"
+{
+#endif
+
+#if defined (__cplusplus) || __STDC__
+#undef	__P
+#define	__P(args)	args
+#undef	__ptr_t
+#define	__ptr_t		void *
+#else /* Not C++ or ANSI C.  */
+#undef	__P
+#define	__P(args)	()
+#undef	const
+#define	const
+#undef	__ptr_t
+#define	__ptr_t		char *
+#endif /* C++ or ANSI C.  */
+
+#if	__STDC__
+#include <stddef.h>
+#else
+#undef	size_t
+#define	size_t		unsigned int
+#undef	ptrdiff_t
+#define	ptrdiff_t	int
+#endif
+
+#ifndef	NULL
+#define	NULL	0
+#endif
+
+
+/* Allocate SIZE bytes of memory.  */
+extern __ptr_t malloc __P ((size_t __size));
+/* Re-allocate the previously allocated block
+   in __ptr_t, making the new block SIZE bytes long.  */
+extern __ptr_t realloc __P ((__ptr_t __ptr, size_t __size));
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
+extern __ptr_t calloc __P ((size_t __nmemb, size_t __size));
+/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
+extern void free __P ((__ptr_t __ptr));
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+extern __ptr_t memalign __P ((size_t __alignment, size_t __size));
+
+/* Allocate SIZE bytes on a page boundary.  */
+extern __ptr_t valloc __P ((size_t __size));
+
+
+#ifdef _MALLOC_INTERNAL
+
+/* The allocator divides the heap into blocks of fixed size; large
+   requests receive one or more whole blocks, and small requests
+   receive a fragment of a block.  Fragment sizes are powers of two,
+   and all fragments of a block are the same size.  When all the
+   fragments in a block have been freed, the block itself is freed.  */
+#define INT_BIT		(CHAR_BIT * sizeof(int))
+#define BLOCKLOG	(INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE	(1 << BLOCKLOG)
+#define BLOCKIFY(SIZE)	(((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+   (not an absolute limit).  */
+#define HEAP		(INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+   memory before they will be returned to the system.  */
+#define FINAL_FREE_BLOCKS	8
+
+/* Data structure giving per-block information.  */
+typedef union
+  {
+    /* Heap information for a busy block.  */
+    struct
+      {
+	/* Zero for a large block, or positive giving the
+	   logarithm to the base two of the fragment size.  */
+	int type;
+	union
+	  {
+	    struct
+	      {
+		size_t nfree;	/* Free fragments in a fragmented block.  */
+		size_t first;	/* First free fragment of the block.  */
+	      } frag;
+	    /* Size (in blocks) of a large cluster.  */
+	    size_t size;
+	  } info;
+      } busy;
+    /* Heap information for a free block
+       (that may be the first of a free cluster).  */
+    struct
+      {
+	size_t size;		/* Size (in blocks) of a free cluster.  */
+	size_t next;		/* Index of next free cluster.  */
+	size_t prev;		/* Index of previous free cluster.  */
+      } free;
+  } malloc_info;
+
+/* Pointer to first block of the heap.  */
+extern char *_heapbase;
+
+/* Table indexed by block number giving per-block information.  */
+extern malloc_info *_heapinfo;
+
+/* Address to block number and vice versa.  */
+#define BLOCK(A)	(((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B)	((__ptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Current search index for the heap table.  */
+extern size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+extern size_t _heaplimit;
+
+/* Doubly linked lists of free fragments.  */
+struct list
+  {
+    struct list *next;
+    struct list *prev;
+  };
+
+/* Free list headers for each fragment size.  */
+extern struct list _fraghead[];
+
+/* List of blocks allocated with `memalign' (or `valloc').  */
+struct alignlist
+  {
+    struct alignlist *next;
+    __ptr_t aligned;		/* The address that memaligned returned.  */
+    __ptr_t exact;		/* The address that malloc returned.  */
+  };
+extern struct alignlist *_aligned_blocks;
+
+/* Instrumentation.  */
+extern size_t _chunks_used;
+extern size_t _bytes_used;
+extern size_t _chunks_free;
+extern size_t _bytes_free;
+
+/* Internal version of `free' used in `morecore' (malloc.c). */
+extern void _free_internal __P ((__ptr_t __ptr));
+
+#endif /* _MALLOC_INTERNAL.  */
+
+/* Underlying allocation function; successive calls should
+   return contiguous pieces of memory.  */
+extern __ptr_t (*__morecore) __P ((ptrdiff_t __size));
+
+/* Default value of `__morecore'.  */
+extern __ptr_t __default_morecore __P ((ptrdiff_t __size));
+
+/* If not NULL, this function is called after each time
+   `__morecore' is called to increase the data size.  */
+extern void (*__after_morecore_hook) __P ((void));
+
+/* Nonzero if `malloc' has been called and done its initialization.  */
+extern int __malloc_initialized;
+
+/* Hooks for debugging versions.  */
+extern void (*__free_hook) __P ((__ptr_t __ptr));
+extern __ptr_t (*__malloc_hook) __P ((size_t __size));
+extern __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+   `mcheck' enables detection of.  */
+enum mcheck_status
+  {
+    MCHECK_DISABLED = -1,	/* Consistency checking is not turned on.  */
+    MCHECK_OK,			/* Block is fine.  */
+    MCHECK_FREE,		/* Block freed twice.  */
+    MCHECK_HEAD,		/* Memory before the block was clobbered.  */
+    MCHECK_TAIL			/* Memory after the block was clobbered.  */
+  };
+
+/* Activate a standard collection of debugging hooks.  This must be called
+   before `malloc' is ever called.  ABORTFUNC is called with an error code
+   (see enum above) when an inconsistency is detected.  If ABORTFUNC is
+   null, the standard function prints on stderr and then calls `abort'.  */
+extern int mcheck __P ((void (*__abortfunc) __P ((enum mcheck_status))));
+
+/* Check for aberrations in a particular malloc'd block.  You must have
+   called `mcheck' already.  These are the same checks that `mcheck' does
+   when you free or reallocate a block.  */
+extern enum mcheck_status mprobe __P ((__ptr_t __ptr));
+
+/* Activate a standard collection of tracing hooks.  */
+extern void mtrace __P ((void));
+
+/* Statistics available to the user.  */
+struct mstats
+  {
+    size_t bytes_total;		/* Total size of the heap. */
+    size_t chunks_used;		/* Chunks allocated by the user. */
+    size_t bytes_used;		/* Byte total of user-allocated chunks. */
+    size_t chunks_free;		/* Chunks in the free list. */
+    size_t bytes_free;		/* Byte total of chunks in the free list. */
+  };
+
+/* Pick up the current statistics. */
+extern struct mstats mstats __P ((void));
+
+/* Call WARNFUN with a warning message when memory usage is high.  */
+extern void memory_warnings __P ((__ptr_t __start,
+				  void (*__warnfun) __P ((const char *))));
+
+
+/* Relocating allocator.  */
+
+/* Allocate SIZE bytes, and store the address in *HANDLEPTR.  */
+extern __ptr_t r_alloc __P ((__ptr_t *__handleptr, size_t __size));
+
+/* Free the storage allocated in HANDLEPTR.  */
+extern void r_alloc_free __P ((__ptr_t *__handleptr));
+
+/* Adjust the block at HANDLEPTR to be SIZE bytes long.  */
+extern __ptr_t r_re_alloc __P ((__ptr_t *__handleptr, size_t __size));
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* malloc.h  */
+/* Allocate memory on a page boundary.
+   Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#if defined (__GNU_LIBRARY__) || defined (_LIBC)
+#include <stddef.h>
+#include <sys/cdefs.h>
+extern size_t __getpagesize __P ((void));
+#else
+#include "getpagesize.h"
+#define	 __getpagesize()	getpagesize()
+#endif
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+static size_t pagesize;
+
+__ptr_t
+valloc (size)
+     size_t size;
+{
+  if (pagesize == 0)
+    pagesize = __getpagesize ();
+
+  return memalign (pagesize, size);
+}
+/* Memory allocator `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* How to really get more memory.  */
+__ptr_t (*__morecore) __P ((ptrdiff_t __size)) = __default_morecore;
+
+/* Debugging hook for `malloc'.  */
+__ptr_t (*__malloc_hook) __P ((size_t __size));
+
+/* Pointer to the base of the first block.  */
+char *_heapbase;
+
+/* Block information table.  Allocated with align/__free (not malloc/free).  */
+malloc_info *_heapinfo;
+
+/* Number of info entries.  */
+static size_t heapsize;
+
+/* Search index in the info table.  */
+size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+size_t _heaplimit;
+
+/* Free lists for each fragment size.  */
+struct list _fraghead[BLOCKLOG];
+
+/* Instrumentation.  */
+size_t _chunks_used;
+size_t _bytes_used;
+size_t _chunks_free;
+size_t _bytes_free;
+
+/* Are you experienced?  */
+int __malloc_initialized;
+
+void (*__after_morecore_hook) __P ((void));
+
+/* Aligned allocation.  */
+static __ptr_t align __P ((size_t));
+static __ptr_t
+align (size)
+     size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj;
+
+  result = (*__morecore) (size);
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+						  (char *) NULL)) % BLOCKSIZE;
+  if (adj != 0)
+    {
+      adj = BLOCKSIZE - adj;
+      (void) (*__morecore) (adj);
+      result = (char *) result + adj;
+    }
+
+  if (__after_morecore_hook)
+    (*__after_morecore_hook) ();
+
+  return result;
+}
+
+/* Set everything up and remember that we have.  */
+static int initialize __P ((void));
+static int
+initialize ()
+{
+  heapsize = HEAP / BLOCKSIZE;
+  _heapinfo = (malloc_info *) align (heapsize * sizeof (malloc_info));
+  if (_heapinfo == NULL)
+    return 0;
+  memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+  _heapinfo[0].free.size = 0;
+  _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+  _heapindex = 0;
+  _heapbase = (char *) _heapinfo;
+
+  /* Account for the _heapinfo block itself in the statistics.  */
+  _bytes_used = heapsize * sizeof (malloc_info);
+  _chunks_used = 1;
+
+  __malloc_initialized = 1;
+  return 1;
+}
+
+/* Get neatly aligned memory, initializing or
+   growing the heap info table as necessary. */
+static __ptr_t morecore __P ((size_t));
+static __ptr_t
+morecore (size)
+     size_t size;
+{
+  __ptr_t result;
+  malloc_info *newinfo, *oldinfo;
+  size_t newsize;
+
+  result = align (size);
+  if (result == NULL)
+    return NULL;
+
+  /* Check if we need to grow the info table.  */
+  if ((size_t) BLOCK ((char *) result + size) > heapsize)
+    {
+      newsize = heapsize;
+      while ((size_t) BLOCK ((char *) result + size) > newsize)
+	newsize *= 2;
+      newinfo = (malloc_info *) align (newsize * sizeof (malloc_info));
+      if (newinfo == NULL)
+	{
+	  (*__morecore) (-size);
+	  return NULL;
+	}
+      memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+      memset (&newinfo[heapsize], 0,
+	      (newsize - heapsize) * sizeof (malloc_info));
+      oldinfo = _heapinfo;
+      newinfo[BLOCK (oldinfo)].busy.type = 0;
+      newinfo[BLOCK (oldinfo)].busy.info.size
+	= BLOCKIFY (heapsize * sizeof (malloc_info));
+      _heapinfo = newinfo;
+      /* Account for the _heapinfo block itself in the statistics.  */
+      _bytes_used += newsize * sizeof (malloc_info);
+      ++_chunks_used;
+      _free_internal (oldinfo);
+      heapsize = newsize;
+    }
+
+  _heaplimit = BLOCK ((char *) result + size);
+  return result;
+}
+
+/* Allocate memory from the heap.  */
+__ptr_t
+malloc (size)
+     size_t size;
+{
+  __ptr_t result;
+  size_t block, blocks, lastblocks, start;
+  register size_t i;
+  struct list *next;
+
+  /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+     valid address you can realloc and free (though not dereference).
+
+     It turns out that some extant code (sunrpc, at least Ultrix's version)
+     expects `malloc (0)' to return non-NULL and breaks otherwise.
+     Be compatible.  */
+
+#if	0
+  if (size == 0)
+    return NULL;
+#endif
+
+  if (__malloc_hook != NULL)
+    return (*__malloc_hook) (size);
+
+  if (!__malloc_initialized)
+    if (!initialize ())
+      return NULL;
+
+  if (size < sizeof (struct list))
+      size = sizeof (struct list);
+
+#ifdef SUNOS_LOCALTIME_BUG
+  if (size < 16)
+    size = 16;
+#endif
+
+  /* Determine the allocation policy based on the request size.  */
+  if (size <= BLOCKSIZE / 2)
+    {
+      /* Small allocation to receive a fragment of a block.
+	 Determine the logarithm to base two of the fragment size. */
+      register size_t log = 1;
+      --size;
+      while ((size /= 2) != 0)
+	++log;
+
+      /* Look in the fragment lists for a
+	 free fragment of the desired size. */
+      next = _fraghead[log].next;
+      if (next != NULL)
+	{
+	  /* There are free fragments of this size.
+	     Pop a fragment out of the fragment list and return it.
+	     Update the block's nfree and first counters. */
+	  result = (__ptr_t) next;
+	  next->prev->next = next->next;
+	  if (next->next != NULL)
+	    next->next->prev = next->prev;
+	  block = BLOCK (result);
+	  if (--_heapinfo[block].busy.info.frag.nfree != 0)
+	    _heapinfo[block].busy.info.frag.first = (unsigned long int)
+	      ((unsigned long int) ((char *) next->next - (char *) NULL)
+	       % BLOCKSIZE) >> log;
+
+	  /* Update the statistics.  */
+	  ++_chunks_used;
+	  _bytes_used += 1 << log;
+	  --_chunks_free;
+	  _bytes_free -= 1 << log;
+	}
+      else
+	{
+	  /* No free fragments of the desired size, so get a new block
+	     and break it into fragments, returning the first.  */
+	  result = malloc (BLOCKSIZE);
+	  if (result == NULL)
+	    return NULL;
+
+	  /* Link all fragments but the first into the free list.  */
+	  for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i)
+	    {
+	      next = (struct list *) ((char *) result + (i << log));
+	      next->next = _fraghead[log].next;
+	      next->prev = &_fraghead[log];
+	      next->prev->next = next;
+	      if (next->next != NULL)
+		next->next->prev = next;
+	    }
+
+	  /* Initialize the nfree and first counters for this block.  */
+	  block = BLOCK (result);
+	  _heapinfo[block].busy.type = log;
+	  _heapinfo[block].busy.info.frag.nfree = i - 1;
+	  _heapinfo[block].busy.info.frag.first = i - 1;
+
+	  _chunks_free += (BLOCKSIZE >> log) - 1;
+	  _bytes_free += BLOCKSIZE - (1 << log);
+	  _bytes_used -= BLOCKSIZE - (1 << log);
+	}
+    }
+  else
+    {
+      /* Large allocation to receive one or more blocks.
+	 Search the free list in a circle starting at the last place visited.
+	 If we loop completely around without finding a large enough
+	 space we will have to get more memory from the system.  */
+      blocks = BLOCKIFY (size);
+      start = block = _heapindex;
+      while (_heapinfo[block].free.size < blocks)
+	{
+	  block = _heapinfo[block].free.next;
+	  if (block == start)
+	    {
+	      /* Need to get more from the system.  Check to see if
+		 the new core will be contiguous with the final free
+		 block; if so we don't need to get as much.  */
+	      block = _heapinfo[0].free.prev;
+	      lastblocks = _heapinfo[block].free.size;
+	      if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+		  (*__morecore) (0) == ADDRESS (block + lastblocks) &&
+		  (morecore ((blocks - lastblocks) * BLOCKSIZE)) != NULL)
+		{
+ 		  /* Which block we are extending (the `final free
+ 		     block' referred to above) might have changed, if
+ 		     it got combined with a freed info table.  */
+ 		  block = _heapinfo[0].free.prev;
+  		  _heapinfo[block].free.size += (blocks - lastblocks);
+		  _bytes_free += (blocks - lastblocks) * BLOCKSIZE;
+		  continue;
+		}
+	      result = morecore (blocks * BLOCKSIZE);
+	      if (result == NULL)
+		return NULL;
+	      block = BLOCK (result);
+	      _heapinfo[block].busy.type = 0;
+	      _heapinfo[block].busy.info.size = blocks;
+	      ++_chunks_used;
+	      _bytes_used += blocks * BLOCKSIZE;
+	      return result;
+	    }
+	}
+
+      /* At this point we have found a suitable free list entry.
+	 Figure out how to remove what we need from the list. */
+      result = ADDRESS (block);
+      if (_heapinfo[block].free.size > blocks)
+	{
+	  /* The block we found has a bit left over,
+	     so relink the tail end back into the free list. */
+	  _heapinfo[block + blocks].free.size
+	    = _heapinfo[block].free.size - blocks;
+	  _heapinfo[block + blocks].free.next
+	    = _heapinfo[block].free.next;
+	  _heapinfo[block + blocks].free.prev
+	    = _heapinfo[block].free.prev;
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapindex = block + blocks;
+	}
+      else
+	{
+	  /* The block exactly matches our requirements,
+	     so just remove it from the list. */
+	  _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapinfo[block].free.prev;
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapindex = _heapinfo[block].free.next;
+	  --_chunks_free;
+	}
+
+      _heapinfo[block].busy.type = 0;
+      _heapinfo[block].busy.info.size = blocks;
+      ++_chunks_used;
+      _bytes_used += blocks * BLOCKSIZE;
+      _bytes_free -= blocks * BLOCKSIZE;
+    }
+
+  return result;
+}
+
+
+#ifndef _LIBC
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+   and _realloc.  Make them use the GNU functions.  */
+
+__ptr_t
+_malloc (size)
+     size_t size;
+{
+  return malloc (size);
+}
+
+void
+_free (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+
+__ptr_t
+_realloc (ptr, size)
+     __ptr_t ptr;
+     size_t size;
+{
+  return realloc (ptr, size);
+}
+
+#endif
+/* Free a block of memory allocated by `malloc'.
+   Copyright 1990, 1991, 1992 Free Software Foundation
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* Debugging hook for free.  */
+void (*__free_hook) __P ((__ptr_t __ptr));
+
+/* List of blocks allocated by memalign.  */
+struct alignlist *_aligned_blocks = NULL;
+
+/* Return memory to the heap.
+   Like `free' but don't call a __free_hook if there is one.  */
+void
+_free_internal (ptr)
+     __ptr_t ptr;
+{
+  int type;
+  size_t block, blocks;
+  register size_t i;
+  struct list *prev, *next;
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Get as many statistics as early as we can.  */
+      --_chunks_used;
+      _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+      _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+      /* Find the free cluster previous to this one in the free list.
+	 Start searching at the last block referenced; this may benefit
+	 programs with locality of allocation.  */
+      i = _heapindex;
+      if (i > block)
+	while (i > block)
+	  i = _heapinfo[i].free.prev;
+      else
+	{
+	  do
+	    i = _heapinfo[i].free.next;
+	  while (i > 0 && i < block);
+	  i = _heapinfo[i].free.prev;
+	}
+
+      /* Determine how to link this block into the free list.  */
+      if (block == i + _heapinfo[i].free.size)
+	{
+	  /* Coalesce this block with its predecessor.  */
+	  _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+	  block = i;
+	}
+      else
+	{
+	  /* Really link this block back into the free list.  */
+	  _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+	  _heapinfo[block].free.next = _heapinfo[i].free.next;
+	  _heapinfo[block].free.prev = i;
+	  _heapinfo[i].free.next = block;
+	  _heapinfo[_heapinfo[block].free.next].free.prev = block;
+	  ++_chunks_free;
+	}
+
+      /* Now that the block is linked in, see if we can coalesce it
+	 with its successor (by deleting its successor from the list
+	 and adding in its size).  */
+      if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+	{
+	  _heapinfo[block].free.size
+	    += _heapinfo[_heapinfo[block].free.next].free.size;
+	  _heapinfo[block].free.next
+	    = _heapinfo[_heapinfo[block].free.next].free.next;
+	  _heapinfo[_heapinfo[block].free.next].free.prev = block;
+	  --_chunks_free;
+	}
+
+      /* Now see if we can return stuff to the system.  */
+      blocks = _heapinfo[block].free.size;
+      if (blocks >= FINAL_FREE_BLOCKS && block + blocks == _heaplimit
+	  && (*__morecore) (0) == ADDRESS (block + blocks))
+	{
+	  register size_t bytes = blocks * BLOCKSIZE;
+	  _heaplimit -= blocks;
+	  (*__morecore) (-bytes);
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapinfo[block].free.next;
+	  _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapinfo[block].free.prev;
+	  block = _heapinfo[block].free.prev;
+	  --_chunks_free;
+	  _bytes_free -= bytes;
+	}
+
+      /* Set the next search to begin at this block.  */
+      _heapindex = block;
+      break;
+
+    default:
+      /* Do some of the statistics.  */
+      --_chunks_used;
+      _bytes_used -= 1 << type;
+      ++_chunks_free;
+      _bytes_free += 1 << type;
+
+      /* Get the address of the first free fragment in this block.  */
+      prev = (struct list *) ((char *) ADDRESS (block) +
+			   (_heapinfo[block].busy.info.frag.first << type));
+
+      if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+	{
+	  /* If all fragments of this block are free, remove them
+	     from the fragment list and free the whole block.  */
+	  next = prev;
+	  for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
+	    next = next->next;
+	  prev->prev->next = next;
+	  if (next != NULL)
+	    next->prev = prev->prev;
+	  _heapinfo[block].busy.type = 0;
+	  _heapinfo[block].busy.info.size = 1;
+
+	  /* Keep the statistics accurate.  */
+	  ++_chunks_used;
+	  _bytes_used += BLOCKSIZE;
+	  _chunks_free -= BLOCKSIZE >> type;
+	  _bytes_free -= BLOCKSIZE;
+
+	  free (ADDRESS (block));
+	}
+      else if (_heapinfo[block].busy.info.frag.nfree != 0)
+	{
+	  /* If some fragments of this block are free, link this
+	     fragment into the fragment list after the first free
+	     fragment of this block. */
+	  next = (struct list *) ptr;
+	  next->next = prev->next;
+	  next->prev = prev;
+	  prev->next = next;
+	  if (next->next != NULL)
+	    next->next->prev = next;
+	  ++_heapinfo[block].busy.info.frag.nfree;
+	}
+      else
+	{
+	  /* No fragments of this block are free, so link this
+	     fragment into the fragment list and announce that
+	     it is the first free fragment of this block. */
+	  prev = (struct list *) ptr;
+	  _heapinfo[block].busy.info.frag.nfree = 1;
+	  _heapinfo[block].busy.info.frag.first = (unsigned long int)
+	    ((unsigned long int) ((char *) ptr - (char *) NULL)
+	     % BLOCKSIZE >> type);
+	  prev->next = _fraghead[type].next;
+	  prev->prev = &_fraghead[type];
+	  prev->prev->next = prev;
+	  if (prev->next != NULL)
+	    prev->next->prev = prev;
+	}
+      break;
+    }
+}
+
+/* Return memory to the heap.  */
+void
+free (ptr)
+     __ptr_t ptr;
+{
+  register struct alignlist *l;
+
+  if (ptr == NULL)
+    return;
+
+  for (l = _aligned_blocks; l != NULL; l = l->next)
+    if (l->aligned == ptr)
+      {
+	l->aligned = NULL;	/* Mark the slot in the list as free.  */
+	ptr = l->exact;
+	break;
+      }
+
+  if (__free_hook != NULL)
+    (*__free_hook) (ptr);
+  else
+    _free_internal (ptr);
+}
+/* Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C 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.
+
+The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#ifdef _LIBC
+
+#include <ansidecl.h>
+#include <gnu-stabs.h>
+
+#undef	cfree
+
+function_alias(cfree, free, void, (ptr),
+	       DEFUN(cfree, (ptr), PTR ptr))
+
+#else
+
+void
+cfree (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+
+#endif
+/* Change the size of a block allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+		     Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#if  (defined (MEMMOVE_MISSING) || \
+      !defined(_LIBC) && !defined(STDC_HEADERS) && !defined(USG))
+
+/* Snarfed directly from Emacs src/dispnew.c:
+   XXX Should use system bcopy if it handles overlap.  */
+#ifndef emacs
+
+/* Like bcopy except never gets confused by overlap.  */
+
+static void
+safe_bcopy (from, to, size)
+     char *from, *to;
+     int size;
+{
+  if (size <= 0 || from == to)
+    return;
+
+  /* If the source and destination don't overlap, then bcopy can
+     handle it.  If they do overlap, but the destination is lower in
+     memory than the source, we'll assume bcopy can handle that.  */
+  if (to < from || from + size <= to)
+    bcopy (from, to, size);
+
+  /* Otherwise, we'll copy from the end.  */
+  else
+    {
+      register char *endf = from + size;
+      register char *endt = to + size;
+
+      /* If TO - FROM is large, then we should break the copy into
+	 nonoverlapping chunks of TO - FROM bytes each.  However, if
+	 TO - FROM is small, then the bcopy function call overhead
+	 makes this not worth it.  The crossover point could be about
+	 anywhere.  Since I don't think the obvious copy loop is too
+	 bad, I'm trying to err in its favor.  */
+      if (to - from < 64)
+	{
+	  do
+	    *--endt = *--endf;
+	  while (endf != from);
+	}
+      else
+	{
+	  for (;;)
+	    {
+	      endt -= (to - from);
+	      endf -= (to - from);
+
+	      if (endt < to)
+		break;
+
+	      bcopy (endf, endt, to - from);
+	    }
+
+	  /* If SIZE wasn't a multiple of TO - FROM, there will be a
+	     little left over.  The amount left over is
+	     (endt + (to - from)) - to, which is endt - from.  */
+	  bcopy (from, to, endt - from);
+	}
+    }
+}     
+#endif	/* Not emacs.  */
+
+#define memmove(to, from, size) safe_bcopy ((from), (to), (size))
+
+#endif
+
+
+#define min(A, B) ((A) < (B) ? (A) : (B))
+
+/* Debugging hook for realloc.  */
+__ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
+
+/* Resize the given region to the new size, returning a pointer
+   to the (possibly moved) region.  This is optimized for speed;
+   some benchmarks seem to indicate that greater compactness is
+   achieved by unconditionally allocating and copying to a
+   new region.  This module has incestuous knowledge of the
+   internals of both free and malloc. */
+__ptr_t
+realloc (ptr, size)
+     __ptr_t ptr;
+     size_t size;
+{
+  __ptr_t result;
+  int type;
+  size_t block, blocks, oldlimit;
+
+  if (size == 0)
+    {
+      free (ptr);
+      return malloc (0);
+    }
+  else if (ptr == NULL)
+    return malloc (size);
+
+  if (__realloc_hook != NULL)
+    return (*__realloc_hook) (ptr, size);
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Maybe reallocate a large block to a small fragment.  */
+      if (size <= BLOCKSIZE / 2)
+	{
+	  result = malloc (size);
+	  if (result != NULL)
+	    {
+	      memcpy (result, ptr, size);
+	      _free_internal (ptr);
+	      return result;
+	    }
+	}
+
+      /* The new size is a large allocation as well;
+	 see if we can hold it in place. */
+      blocks = BLOCKIFY (size);
+      if (blocks < _heapinfo[block].busy.info.size)
+	{
+	  /* The new size is smaller; return
+	     excess memory to the free list. */
+	  _heapinfo[block + blocks].busy.type = 0;
+	  _heapinfo[block + blocks].busy.info.size
+	    = _heapinfo[block].busy.info.size - blocks;
+	  _heapinfo[block].busy.info.size = blocks;
+	  /* We have just created a new chunk by splitting a chunk in two.
+	     Now we will free this chunk; increment the statistics counter
+	     so it doesn't become wrong when _free_internal decrements it.  */
+	  ++_chunks_used;
+	  _free_internal (ADDRESS (block + blocks));
+	  result = ptr;
+	}
+      else if (blocks == _heapinfo[block].busy.info.size)
+	/* No size change necessary.  */
+	result = ptr;
+      else
+	{
+	  /* Won't fit, so allocate a new region that will.
+	     Free the old region first in case there is sufficient
+	     adjacent free space to grow without moving. */
+	  blocks = _heapinfo[block].busy.info.size;
+	  /* Prevent free from actually returning memory to the system.  */
+	  oldlimit = _heaplimit;
+	  _heaplimit = 0;
+	  _free_internal (ptr);
+	  _heaplimit = oldlimit;
+	  result = malloc (size);
+	  if (result == NULL)
+	    {
+	      /* Now we're really in trouble.  We have to unfree
+		 the thing we just freed.  Unfortunately it might
+		 have been coalesced with its neighbors.  */
+	      if (_heapindex == block)
+	        (void) malloc (blocks * BLOCKSIZE);
+	      else
+		{
+		  __ptr_t previous = malloc ((block - _heapindex) * BLOCKSIZE);
+		  (void) malloc (blocks * BLOCKSIZE);
+		  _free_internal (previous);
+		}
+	      return NULL;
+	    }
+	  if (ptr != result)
+	    memmove (result, ptr, blocks * BLOCKSIZE);
+	}
+      break;
+
+    default:
+      /* Old size is a fragment; type is logarithm
+	 to base two of the fragment size.  */
+      if (size > (size_t) (1 << (type - 1)) && size <= (size_t) (1 << type))
+	/* The new size is the same kind of fragment.  */
+	result = ptr;
+      else
+	{
+	  /* The new size is different; allocate a new space,
+	     and copy the lesser of the new size and the old. */
+	  result = malloc (size);
+	  if (result == NULL)
+	    return NULL;
+	  memcpy (result, ptr, min (size, (size_t) 1 << type));
+	  free (ptr);
+	}
+      break;
+    }
+
+  return result;
+}
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+   The entire array is initialized to zeros.  */
+__ptr_t
+calloc (nmemb, size)
+     register size_t nmemb;
+     register size_t size;
+{
+  register __ptr_t result = malloc (nmemb * size);
+
+  if (result != NULL)
+    (void) memset (result, 0, nmemb * size);
+
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library 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.
+
+The GNU C 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU C Library; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#ifndef	__GNU_LIBRARY__
+#define	__sbrk	sbrk
+#endif
+
+#ifdef __GNU_LIBRARY__
+/* It is best not to declare this and cast its result on foreign operating
+   systems with potentially hostile include files.  */
+extern __ptr_t __sbrk __P ((int increment));
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* Allocate INCREMENT more bytes of data space,
+   and return the start of data space, or NULL on errors.
+   If INCREMENT is negative, shrink data space.  */
+__ptr_t
+__default_morecore (increment)
+     ptrdiff_t increment;
+{
+  __ptr_t result = (__ptr_t) __sbrk ((int) increment);
+  if (result == (__ptr_t) -1)
+    return NULL;
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+__ptr_t
+memalign (alignment, size)
+     size_t alignment;
+     size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj;
+
+  size = ((size + alignment - 1) / alignment) * alignment;
+
+  result = malloc (size);
+  if (result == NULL)
+    return NULL;
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+						  (char *) NULL)) % alignment;
+  if (adj != 0)
+    {
+      struct alignlist *l;
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+	if (l->aligned == NULL)
+	  /* This slot is free.  Use it.  */
+	  break;
+      if (l == NULL)
+	{
+	  l = (struct alignlist *) malloc (sizeof (struct alignlist));
+	  if (l == NULL)
+	    {
+	      free (result);
+	      return NULL;
+	    }
+	  l->next = _aligned_blocks;
+	  _aligned_blocks = l;
+	}
+      l->exact = result;
+      result = l->aligned = (char *) result + alignment - adj;
+    }
+
+  return result;
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman.c	(revision 21083)
@@ -0,0 +1,423 @@
+/**************************************************************************
+ *
+ * huffman.c -- Huffman coding functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:51  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:03  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:44  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "huffman.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+/* ->data on success,  
+   NULL on error 
+ */
+huff_data *
+Generate_Huffman_Data (int num, long *freqs, huff_data * data,
+		       u_long * mem)
+{
+  int HNum, i, count;
+  unsigned long *heap;
+  huff_data *hd = data;
+  if (!hd)
+    {
+      if (!(hd = Xmalloc (sizeof (huff_data))))
+	goto error0;
+    }
+  if (!(heap = Xmalloc (num * 2 * sizeof (*heap))))
+    goto error1;
+  if (!(hd->clens = Xmalloc (num * sizeof (char))))
+      goto error2;
+  hd->num_codes = num;
+  if (mem)
+    {
+      if (hd != data)
+	*mem += sizeof (huff_data);
+      *mem += num * sizeof (char);
+    }
+  bcopy ((char *) freqs, (char *) &heap[num], num * sizeof (*heap));
+  bzero ((char *) heap, num * sizeof (*heap));
+
+  /* Initialise the pointers to the leaves */
+  for (count = i = 0; i < num; i++)
+    if (heap[num + i])
+      heap[count++] = num + i;
+
+  /* Reorganise the pointers so that it is a heap */
+  HNum = count;
+  for (i = HNum / 2; i > 0; i--)
+    {
+      register int curr, child;
+      curr = i;
+      child = curr * 2;
+      while (child <= HNum)
+	{
+	  if (child < HNum && heap[heap[child]] < heap[heap[child - 1]])
+	    child++;
+	  if (heap[heap[curr - 1]] > heap[heap[child - 1]])
+	    {
+	      register u_long temp;
+	      temp = heap[child - 1];
+	      heap[child - 1] = heap[curr - 1];
+	      heap[curr - 1] = temp;
+	      curr = child;
+	      child = 2 * curr;
+	    }
+	  else
+	    break;
+	}
+    }
+
+
+  /* Form the huffman tree */
+  while (HNum > 1)
+    {
+      int pos[2];
+
+      for (i = 0; i < 2; i++)
+	{
+	  register int curr, child;
+	  pos[i] = heap[0];
+	  heap[0] = heap[--HNum];
+	  curr = 1;
+	  child = 2;
+	  while (child <= HNum)
+	    {
+	      if (child < HNum &&
+		  heap[heap[child]] < heap[heap[child - 1]])
+		child++;
+	      if (heap[heap[curr - 1]] > heap[heap[child - 1]])
+		{
+		  register int temp;
+		  temp = heap[child - 1];
+		  heap[child - 1] = heap[curr - 1];
+		  heap[curr - 1] = temp;
+		  curr = child;
+		  child = 2 * curr;
+		}
+	      else
+		break;
+	    }
+	}
+
+      heap[HNum + 1] = heap[pos[0]] + heap[pos[1]];
+      heap[pos[0]] = heap[pos[1]] = HNum + 1;
+
+      heap[HNum] = HNum + 1;
+
+      {
+	register int parent, curr;
+	HNum++;
+	curr = HNum;
+	parent = curr >> 1;
+	while (parent && heap[heap[parent - 1]] > heap[heap[curr - 1]])
+	  {
+	    register int temp;
+	    temp = heap[parent - 1];
+	    heap[parent - 1] = heap[curr - 1];
+	    heap[curr - 1] = temp;
+	    curr = parent;
+	    parent = curr >> 1;
+	  }
+      }
+    }
+
+
+  /* Calculate the code lens */
+  heap[0] = -1UL;
+  heap[1] = 0;
+  for (i = 2; i < num * 2; i++)
+    heap[i] = heap[heap[i]] + 1;
+
+  /* zero the lencount's array */
+  bzero ((char *) hd->lencount, sizeof (hd->lencount));
+  hd->maxcodelen = 0;
+  hd->mincodelen = 100;
+
+  /* Set the code length of each leaf in the huffman tree */
+  for (i = 0; i < num; i++)
+    {
+      register u_long codelen = heap[i + num];
+      hd->clens[i] = (char) codelen;
+      if (!codelen)
+	continue;
+      if (codelen > hd->maxcodelen)
+	hd->maxcodelen = codelen;
+      if (codelen < hd->mincodelen)
+	hd->mincodelen = codelen;
+      hd->lencount[codelen]++;
+    }
+
+
+  if (hd->maxcodelen == 0 && hd->mincodelen == 100)
+    {
+      hd->num_codes = 0;
+    }
+  else
+    {
+      /* Calculate the current codes for each different code length */
+      hd->min_code[hd->maxcodelen] = 0;
+      for (i = hd->maxcodelen - 1; i>=0; i--)
+	hd->min_code[i] = (hd->min_code[i + 1] + hd->lencount[i + 1]) >> 1;
+    }
+  free (heap);
+  return (hd);
+
+error2:
+  free (heap);
+error1:
+  if (!data)
+    free (hd);
+error0:
+  return (NULL);
+
+}
+
+unsigned long *
+Generate_Huffman_Codes (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *codes;
+  unsigned long mc[MAX_HUFFCODE_LEN + 1];
+
+  if (!data)
+    return (NULL);
+  if (!(codes = Xmalloc (data->num_codes * sizeof (*codes))))
+    return (NULL);
+  if (mem)
+    *mem += data->num_codes * sizeof (*codes);
+  bcopy ((char *) data->min_code, (char *) mc, sizeof (mc));
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      codes[i] = mc[(int) (data->clens[i])]++;
+
+  return (codes);
+}
+
+
+unsigned long **
+Generate_Huffman_Vals (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *fcode[MAX_HUFFCODE_LEN + 1];
+  unsigned long **values;
+  unsigned long *vals;
+
+  if (!data)
+    return (NULL);
+  if (!(vals = Xmalloc (data->num_codes * sizeof (*vals))))
+    return (NULL);
+  if (!(values = Xmalloc ((MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *))))
+    {
+      free (vals);
+      return (NULL);
+    }
+
+  bzero ((char *) values, (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *));
+
+  if (mem)
+    *mem += data->num_codes * sizeof (*vals) +
+      (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+  fcode[0] = values[0] = &vals[0];
+  for (i = 1; i <= data->maxcodelen; i++)
+    fcode[i] = values[i] = &vals[(values[i - 1] - vals) + data->lencount[i - 1]];
+
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      *fcode[(int) (data->clens[i])]++ = i;
+  return (values);
+}
+
+
+
+double 
+Calculate_Huffman_Size (int num, long *freqs, long *counts)
+{
+  double size = 0;
+  huff_data hd;
+  int i;
+  if (!Generate_Huffman_Data (num, freqs, &hd, NULL))
+    return -1;
+  for (i = 0; i < num; i++)
+    size += counts[i] * hd.clens[i];
+  Xfree (hd.clens);
+  return size;
+}
+
+
+
+int 
+Write_Huffman_Data (FILE * f, huff_data * hd)
+{
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONSI(hd->num_codes);
+  HTONSI(hd->mincodelen);
+  HTONSI(hd->maxcodelen);
+
+  if (fwrite (&hd->num_codes, sizeof (hd->num_codes), 1, f) != 1)
+    return -1;
+
+  if (fwrite (&hd->mincodelen, sizeof (hd->mincodelen), 1, f) != 1)
+    return -1;
+
+  if (fwrite (&hd->maxcodelen, sizeof (hd->maxcodelen), 1, f) != 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(hd->num_codes);
+  NTOHSI(hd->mincodelen);
+  NTOHSI(hd->maxcodelen);
+
+  if (hd->num_codes)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int i;
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	HTONSI(hd->lencount[i]);
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	HTONUL(hd->min_code[i]);
+
+      if (fwrite (hd->lencount + hd->mincodelen, sizeof (*hd->lencount),
+		  hd->maxcodelen - hd->mincodelen + 1, f) !=
+	  hd->maxcodelen - hd->mincodelen + 1)
+	return -1;
+
+      if (fwrite (hd->min_code, sizeof (*hd->min_code), hd->maxcodelen + 1, f) !=
+	  hd->maxcodelen + 1)
+	return -1;
+
+      if (fwrite (hd->clens, sizeof (*hd->clens), hd->num_codes, f) != hd->num_codes)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	NTOHSI(hd->lencount[i]);
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	NTOHUL(hd->min_code[i]);
+    }
+  return 0;
+}
+
+
+
+
+static int 
+General_Read_Huffman_Data (size_t (*rd) (), void *f,
+			   huff_data * hd, u_long * mem, u_long * disk)
+{
+  if (rd (&hd->num_codes, sizeof (hd->num_codes), 1, f) != 1)
+    return -1;
+
+  if (rd (&hd->mincodelen, sizeof (hd->mincodelen), 1, f) != 1)
+    return -1;
+
+  if (rd (&hd->maxcodelen, sizeof (hd->maxcodelen), 1, f) != 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(hd->num_codes);
+  NTOHSI(hd->mincodelen);
+  NTOHSI(hd->maxcodelen);
+
+  if (disk)
+    (*disk) += sizeof (hd->num_codes) + sizeof (hd->mincodelen) +
+      sizeof (hd->maxcodelen);
+
+  hd->clens = NULL;
+
+  if (hd->num_codes)
+    {
+      int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+      bzero ((char *) (hd->lencount), sizeof (hd->lencount));
+      if (rd (hd->lencount + hd->mincodelen, sizeof (*hd->lencount),
+	      hd->maxcodelen - hd->mincodelen + 1, f) !=
+	  hd->maxcodelen - hd->mincodelen + 1)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	NTOHSI(hd->lencount[i]);
+
+      if (disk)
+	(*disk) += sizeof (*hd->lencount) * (hd->maxcodelen - hd->mincodelen + 1);
+
+      bzero ((char *) (hd->min_code), sizeof (hd->min_code));
+
+      if (rd (hd->min_code, sizeof (*hd->min_code), hd->maxcodelen + 1, f) !=
+	  hd->maxcodelen + 1)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	NTOHUL(hd->min_code[i]);
+
+      if (disk)
+	(*disk) += sizeof (*hd->min_code) * (hd->maxcodelen + 1);
+
+      if (!(hd->clens = Xmalloc (sizeof (*hd->clens) * hd->num_codes)))
+	return -1;
+
+
+      if (rd (hd->clens, sizeof (*hd->clens), hd->num_codes, f) != hd->num_codes)
+	return -1;
+
+      if (disk)
+	(*disk) += sizeof (*hd->clens) * hd->num_codes;
+    }
+
+  if (mem)
+    *mem += sizeof (*hd->clens) * hd->num_codes;
+  return 0;
+}
+
+
+
+int 
+Read_Huffman_Data (FILE * f, huff_data * hd, u_long * mem, u_long * disk)
+{
+  return General_Read_Huffman_Data (fread, f, hd, mem, disk);
+}
+
+
+
+
+int 
+F_Read_Huffman_Data (File * f, huff_data * hd, u_long * mem, u_long * disk)
+{
+  return General_Read_Huffman_Data (Fread, f, hd, mem, disk);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman.h	(revision 21083)
@@ -0,0 +1,114 @@
+/**************************************************************************
+ *
+ * huffman.h -- Huffman coding functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_HUFFMAN
+#define H_HUFFMAN
+
+#include "sysfuncs.h"
+
+#include "filestats.h"
+
+
+#define MAX_HUFFCODE_LEN 31
+
+typedef struct huff_data
+  {
+    int num_codes;
+    int mincodelen;
+    int maxcodelen;
+    int lencount[MAX_HUFFCODE_LEN + 1];
+    unsigned long min_code[MAX_HUFFCODE_LEN + 1];
+    char *clens;
+  }
+huff_data;
+
+
+huff_data *Generate_Huffman_Data (int num, long *freqs, huff_data * data,
+				  u_long * mem);
+
+unsigned long *Generate_Huffman_Codes (huff_data * data, u_long * mem);
+
+unsigned long **Generate_Huffman_Vals (huff_data * data, u_long * mem);
+
+int Write_Huffman_Data (FILE * f, huff_data * hd);
+
+int Read_Huffman_Data (FILE * f, huff_data * hd, u_long * mem, u_long * disk);
+
+int F_Read_Huffman_Data (File * f, huff_data * hd, u_long * mem, u_long * disk);
+
+/* Calculate the number of bits required to code the data with the
+   specified frequencies. Normally freqs and counts should point to
+   the same array. */
+double Calculate_Huffman_Size (int num, long *freqs, long *counts);
+
+
+
+#define HUFF_ENCODE(x, codes, lens)					\
+  do {									\
+    register int __i;							\
+    register int __clen = (lens)[x];					\
+    register unsigned long __code = (codes)[x];				\
+    for (__i=__clen-1; __i>=0; __i--)					\
+      ENCODE_BIT((__code >> __i) & 1);					\
+  } while(0)
+
+#define HUFF_ENCODE_L(x, codes, lens, count)				\
+  do {									\
+    HUFF_ENCODE(x, codes, lens);		   			\
+    (count) += (lens)[x];						\
+  } while(0)
+
+
+#define HUFF_DECODE(x, mcodes, values)					\
+  do {									\
+    register unsigned long *__min_code = (mcodes);			\
+    register unsigned long *__mclen = __min_code;			\
+    register unsigned long **__values = (values);			\
+    register unsigned long __code = 0;					\
+    do									\
+      {									\
+        DECODE_ADD(__code);						\
+      }									\
+    while (__code < *++__mclen);					\
+    (x) = __values[__mclen - __min_code][__code - *__mclen];		\
+  } while(0);
+
+
+#define HUFF_DECODE_L(x, mcodes, values, count)				\
+  do {									\
+    register unsigned long *__min_code = (mcodes);			\
+    register unsigned long *__mclen = __min_code;			\
+    register unsigned long **__values = (values);			\
+    register unsigned long __code = 0;					\
+    do									\
+      {									\
+        DECODE_ADD(__code);						\
+	(count)++;							\
+      }									\
+    while (__code < *++__mclen);					\
+    (x) = __values[__mclen - __min_code][__code - *__mclen];		\
+  } while(0);
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.c	(revision 21083)
@@ -0,0 +1,66 @@
+/**************************************************************************
+ *
+ * huffman_mem.c -- Huffman coding functions to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:51  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:05  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:45  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+#include "bitio_m.h"
+#include "bitio_m_mem.h"
+#include "huffman.h"
+
+#if 0
+int fprintf (FILE *, const char *,...);
+#endif
+
+void 
+BIO_Mem_Huff_Encode (unsigned long val, unsigned long *codes,
+		     char *clens, mem_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    HUFF_ENCODE (val, codes, clens);
+  ENCODE_PAUSE (*bs)
+}
+
+unsigned long 
+BIO_Mem_Huff_Decode (unsigned long *mincodes,
+		     unsigned long **values, mem_bitio_state * bs)
+{
+  unsigned long val;
+  DECODE_CONTINUE (*bs)
+    HUFF_DECODE (val, mincodes, values);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman_mem.h	(revision 21083)
@@ -0,0 +1,36 @@
+/**************************************************************************
+ *
+ * huffman_mem.h -- Huffman coding functions to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_HUFFMAN_MEM
+#define H_HUFFMAN_MEM
+
+
+
+void BIO_Mem_Huff_Encode (unsigned long val, unsigned long *codes,
+			  char *clens, mem_bitio_state * bs);
+
+unsigned long BIO_Mem_Huff_Decode (unsigned long *mincodes,
+			      unsigned long **values, mem_bitio_state * bs);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.c	(revision 21083)
@@ -0,0 +1,70 @@
+/**************************************************************************
+ *
+ * huffman_stdio.c -- Huffman coding function to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:52  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:07  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:46  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "huffman.h"
+
+#if 0
+int fprintf (FILE *, const char *,...);
+int _filbuf (FILE *);
+int _flsbuf (unsigned, FILE *);
+#endif
+
+void 
+BIO_Stdio_Huff_Encode (unsigned long val, unsigned long *codes,
+		       char *clens, stdio_bitio_state * bs)
+{
+  ENCODE_CONTINUE (*bs)
+    HUFF_ENCODE (val, codes, clens);
+  ENCODE_PAUSE (*bs)
+}
+
+unsigned long 
+BIO_Stdio_Huff_Decode (unsigned long *mincodes,
+		       unsigned long **values,
+		       stdio_bitio_state * bs)
+{
+  unsigned long val;
+  DECODE_CONTINUE (*bs)
+    HUFF_DECODE (val, mincodes, values);
+  DECODE_PAUSE (*bs)
+    return (val);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/huffman_stdio.h	(revision 21083)
@@ -0,0 +1,38 @@
+/**************************************************************************
+ *
+ * huffman_stdio.h -- Huffman coding function to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_HUFFMAN_STDIO
+#define H_HUFFMAN_STDIO
+
+
+
+void BIO_Stdio_Huff_Encode (unsigned long val, unsigned long *codes,
+			    char *clens, stdio_bitio_state * bs);
+
+
+unsigned long BIO_Stdio_Huff_Decode (unsigned long *mincodes,
+				     unsigned long **values,
+				     stdio_bitio_state * bs);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/local_strings.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/local_strings.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/local_strings.c	(revision 21083)
@@ -0,0 +1,415 @@
+/**************************************************************************
+ *
+ * local_strings -- provides some extra string routines
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "local_strings.h"
+#include "memlib.h"
+
+/* =========================================================================
+ * Function: arg_atoi
+ * Description: 
+ *      Converts an ascii string to an integer
+ *      but allows a scale string immediately following.
+ *      i.e. "10Mb" or "20Kb" or "40Megabytes"
+ *      There must be no gap between the last digit and the scale.
+ *      Only the fist letter is significant.
+ *      K = Kilo
+ *      M = Mega
+ *      G = Giga
+ * Input: 
+ *      string of form: xxxxxxK or xxxxxxxM or xxxxxxxG
+ *      where x is a digit
+ * Output: 
+ *      a scaled integer
+ * ========================================================================= */
+
+#define KILO 	1024
+#define MEGA	1024*1024
+#define GIGA	1024*1024*1024
+
+int 
+arg_atoi (char *str)
+{
+  char *str_ptr = str;
+  char ch = '\0';
+  long scale = 1;
+
+  /* find any scale letter immediately after digits */
+  ch = *str_ptr;
+  while (!isalpha (ch) && (ch != '\0'))
+    ch = *str_ptr++;
+
+  /* replace scale letter by end-of-string character */
+  *str_ptr = '\0';
+
+  /* set scale appropriately */
+  switch (ch)
+    {
+    case 'K':
+      scale = KILO;
+      break;
+    case 'M':
+      scale = MEGA;
+      break;
+    case 'G':
+      scale = GIGA;
+      break;
+    default:
+      scale = 1;
+      break;
+    }
+
+  return (atoi (str) * scale);
+
+}
+
+/* ===============================================================================
+ * Function: compare
+ * Description: Compare two strings. 
+ * Input: Two binary strings, first byte of string indicates length. 
+ * Output: Like standard strcmp.
+ *      = 0 if s1 = s2
+ *      < 0 if s1 < s2
+ *      > 0 if s1 > s2
+ * =============================================================================== */
+int 
+compare (u_char * s1, u_char * s2)
+{
+  int l1 = *s1, l2 = *s2;
+  int l = (l1 < l2) ? l1 : l2;
+
+  while (l--)
+    if (*++s1 != *++s2)
+      return (*s1 - *s2);
+  return (l1 - l2);
+
+}
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char casecharmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+/* ===============================================================================
+ * Function: casecompare   [RPAP - Jan 97: Stem Index Change]
+ * Description: Compare two strings in dictionary order
+ * Input: Two binary strings, first byte of string indicates length. 
+ * Output:
+ *      = 0 if s1 = s2
+ *      < 0 if s1 < s2
+ *      > 0 if s1 > s2
+ * =============================================================================== */
+int 
+casecompare (u_char * s1, u_char * s2)
+{
+  int l1 = *s1, l2 = *s2;
+  int l = (l1 < l2) ? l1 : l2;
+  int pos = 0;
+  register int diff = 0;
+
+  while (l--)
+    if ((diff = casecharmap[*++s1] - casecharmap[*++s2]) != 0)
+      return (diff);
+    else if ((diff = *s1 - *s2) != 0)
+      if (!pos)
+	pos = diff;
+
+  return ((l1 - l2) ? (l1 - l2) : (pos));
+
+}
+
+/* =========================================================================
+ * Function: copy_string
+ * Description: 
+ *      Copies a string with the len in 1st byte
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+u_char *
+copy_string (u_char * src_str)
+{
+  u_char *copy = Xmalloc (src_str[0] + 1);
+
+  if (!copy)
+    return NULL;
+
+  bcopy ((char *) src_str, (char *) (copy), src_str[0] + 1);
+  return copy;
+
+}
+
+
+/* ===============================================================================
+ * Function: prefixlen
+ * Description: Returns length of common prefix string between s1 and s2.
+ * Input: two binary strings
+ * Output: prefix length
+ * =============================================================================== */
+int 
+prefixlen (u_char * s1, u_char * s2)
+{
+  int l = (*s1 < *s2) ? *s1 : *s2;
+  int i = 0;
+
+  while (i < l && *++s1 == *++s2)
+    i++;
+  return (i);
+}
+
+
+/* ===============================================================================
+ * Function: char2str
+ * Description: 
+ *      Ensures that non-printable characters are converted to a string
+ *      which is printable i.e. it indentifies the character.
+ *      e.g. carriage-return = "\n".
+ * Input: character (may be non-printable)
+ * Output: pointer to static string
+ * =============================================================================== */
+
+char *
+char2str (u_char c)
+{
+  static char buf[10];
+  switch (c)
+    {
+    case '\n':
+      sprintf (buf, "\\n");
+      break;
+    case '\b':
+      sprintf (buf, "\\b");
+      break;
+    case '\f':
+      sprintf (buf, "\\f");
+      break;
+    case '\t':
+      sprintf (buf, "\\t");
+      break;
+    default:
+	if (c >= ' ' && c <= 126)
+	switch (c)
+	  {
+	  case '\\':
+	    sprintf (buf, "\\\\");
+	    break;
+	  case '\"':
+	    sprintf (buf, "\\\"");
+	    break;
+	  case '\'':
+	    sprintf (buf, "\\\'");
+	    break;
+	  default:
+	    buf[0] = c;
+	    buf[1] = '\0';
+	    break;
+	  }
+      else
+	sprintf (buf, "\\x%02x", c);
+      break;
+    }
+  return buf;
+}
+
+/* ===============================================================================
+ * Function: word2str
+ * Description: 
+ *      Converts a string with possible non-printable characters into a string
+ *      consisting entirely of printable characters.
+ * Input: string, length stored in first byte
+ * Output: pointer to static string
+ * =============================================================================== */
+
+char *
+word2str (u_char * s)
+{
+  static char buf[1024];
+  char *p = buf;
+  int i, len = (int) *s++;
+
+  bzero (buf, sizeof (buf));
+  for (i = 0; i < len; i++)
+    {
+      strcpy (p, char2str (s[i]));
+      p = strchr (p, '\0');
+    }
+  return buf;
+}
+
+
+/* =========================================================================
+ * Function: de_escape_string
+ * Description: 
+ *      Turn a string containing \ escapes into real characters
+ *      Note this destroys the string s in the process
+ * Input: string to de-escape 
+ * Output: the de-escaped string
+ * ========================================================================= */
+char *
+de_escape_string (char *s)
+{
+  char *org = s;
+  char *d = s;
+  while (*s)
+    {
+      if (*s == '\\')
+	{
+	  s++;
+	  switch (*s++)
+	    {
+	    case '\0':
+	      *d++ = '\\';
+	      s--;
+	      break;
+	    case '\\':
+	      *d++ = '\\';
+	      break;
+	    case 'b':
+	      *d++ = '\b';
+	      break;
+	    case 'f':
+	      *d++ = '\f';
+	      break;
+	    case 'n':
+	      *d++ = '\n';
+	      break;
+	    case 'r':
+	      *d++ = '\r';
+	      break;
+	    case 't':
+	      *d++ = '\r';
+	      break;
+	    case '\"':
+	      *d++ = '\"';
+	      break;
+	    case '\'':
+	      *d++ = '\'';
+	      break;
+	    case 'x':
+	      {
+		int num = 0;
+		if (isxdigit (*s))
+		  {
+		    char ch = toupper (*s++);
+		    num = ch <= '9' ? ch - '0' : ch - 'A' + 10;
+		  }
+		if (isxdigit (*s))
+		  {
+		    char ch = toupper (*s++);
+		    num = (num << 4) + (ch <= '9' ? ch - '0' : ch - 'A' + 10);
+		  }
+		*d++ = num;
+		break;
+	      }
+	    case '0':
+	    case '1':
+	    case '2':
+	    case '3':
+	    case '4':
+	    case '5':
+	    case '6':
+	    case '7':
+	      {
+		int num = *(s - 1) - '0';
+		if (*s >= '0' && *s <= '7')
+		  num = (num << 3) + *s++ - '0';
+		if (*s >= '0' && *s <= '7')
+		  num = (num << 3) + *s++ - '0';
+		*d++ = num;
+		break;
+	      }
+	    }
+	}
+      else
+	*d++ = *s++;
+    }
+  *d = '\0';
+  return (org);
+}
+
+/* =========================================================================
+ * Function: str255_to_string 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+char *
+str255_to_string (u_char * str255, char *str)
+{
+  static char buf[256];
+  char *str_base = NULL;
+  int len = *str255++;
+  int i = 0;
+
+  /* if haven't been given a str to write to then use local buffer */
+  if (!str)
+    str = &(buf[0]);
+
+  str_base = str;
+  for (i = 0; i < len; i++)
+    {
+      *str++ = *str255++;
+    }
+  *str = '\0';
+
+  return str_base;
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/local_strings.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/local_strings.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/local_strings.h	(revision 21083)
@@ -0,0 +1,39 @@
+/**************************************************************************
+ *
+ * local_strings.h -- string routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef LOCAL_STRINGS_H
+#define LOCAL_STRINGS_H
+
+#include "sysfuncs.h"
+
+int arg_atoi (char *str);
+int compare (u_char * s1, u_char * s2);
+int casecompare (u_char * s1, u_char * s2);   /* [RPAP - Jan 97: Stem Index Change] */
+u_char *copy_string (u_char * src_str);
+char *str255_to_string (u_char * str255, char *str);
+int prefixlen (u_char * s1, u_char * s2);
+char *char2str (u_char c);
+char *word2str (u_char * s);
+char *de_escape_string (char *s);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/longlong.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/longlong.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/longlong.h	(revision 21083)
@@ -0,0 +1,81 @@
+/**************************************************************************
+ *
+ * longlong.h -- Use of GCC's long long integer types
+ * Copyright (C) 1999 Tim A.H. Bell
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_LONGLONG
+#define H_LONGLONG
+
+#ifndef __WIN32__
+#include "config.h"
+#endif
+
+/*
+  Use GCC's "long long" integer types for certain variables, to avoid
+  overflowing 32 bit integers.
+
+  Other files affected:
+  
+    lib:
+        bitio_random.c
+        bitio_random.h
+	
+    src/text:
+        ivf.pass1.c
+        ivf.pass2.c
+        build.h
+        mg_passes.c
+        text.h
+	mgstat.c
+*/
+
+/*#define TESTING_OVERFLOW*/
+
+#ifdef TESTING_OVERFLOW
+
+/* Test the overflow detection by using tiny (16-bit) types */
+typedef unsigned short int mg_ullong;
+typedef short int mg_llong;
+
+#define ULL_FS "u"
+#define LL_FS "d"
+
+#elif defined __GNUC__ && ! defined DISABLE_LONG_LONG
+
+/* We're using GCC, so it's okay to use "long long" (64-bit) types */
+#define USE_LONG_LONG
+
+typedef unsigned long long int mg_ullong;
+typedef long long int mg_llong;
+
+#define ULL_FS "llu"
+#define LL_FS "lld"
+
+#else
+
+/* Not using GCC, so fall back on plain "long" (32-bit) types */
+typedef unsigned long int mg_ullong;
+typedef long int mg_llong;
+
+#define ULL_FS "lu"
+#define LL_FS "ld"
+
+#endif /* __GNUC__ */
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.c	(revision 21083)
@@ -0,0 +1,1187 @@
+/**************************************************************************
+ *
+ * lovinstem.c -- Stemming code
+ * Copyright (C) 1994  Linh Huynh (linh@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+
+/*****************************************************************************
+ *
+ *   Transformational Rules used in Recoding Stem Terminations
+ *
+ *   Parameter in functions:
+ *       ch : the second last character of the old ending
+ *            (after removing one of double consonants) 
+ *
+ ****************************************************************************/
+
+
+/************ Conditional rules associated with transformations **************/
+
+static int aio ();
+static int s ();
+static int pt ();
+static int m ();
+static int n ();
+
+static int 
+aio (ch)			/* Rule number 9     */
+     char ch;
+{
+  return ((ch != 'a') && (ch != 'i') && (ch != 'o'));
+}
+
+static int 
+s (ch)				/* Rule Number 24    */
+     char ch;
+{
+  return (ch != 's');
+}
+
+static int 
+pt (ch)				/* Rule number 28    */
+     char ch;
+{
+  return ((ch != 'p') && (ch != 't'));
+}
+
+static int 
+m (ch)				/* Rule number 30    */
+     char ch;
+{
+  return (ch != 'm');
+}
+
+static int 
+n (ch)				/* Rule number 32    */
+     char ch;
+{
+  return (ch != 'n');
+}
+
+
+/**************************************************************************
+ *
+ *  Context-sensitive rules associated with certain endings.
+ *
+ *  The notations of the rules are the same as in Lovins' paper
+ *  except that rule A is replaced by a NULL in the data structure.
+ *
+ *  Function parameters:
+ *      - stem_length: possible stem length
+ *      - end        : pointer points to the end of the possible stem.
+ *
+ *************************************************************************/
+
+
+/********* Context-sensitive rule function declarations ******************/
+
+static int B ();
+static int C ();
+static int D ();
+static int E ();
+static int F ();
+static int G ();
+static int H ();
+static int I ();
+static int J ();
+static int K ();
+static int L ();
+static int M ();
+static int N ();
+static int O ();
+static int P ();
+static int Q ();
+static int R ();
+static int S ();
+static int T ();
+static int U ();
+static int V ();
+static int W ();
+static int X ();
+static int Y ();
+static int Z ();
+static int AA ();
+static int BB ();
+static int CC ();
+
+static int 
+B (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 3);
+}
+
+static int 
+C (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 4);
+}
+
+static int 
+D (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 5);
+}
+
+static int 
+E (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'e');
+}
+
+static int 
+F (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((stem_length >= 3) && (*end != 'e'));
+}
+
+static int 
+G (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((stem_length >= 3) && (*end == 'f'));
+}
+
+static int 
+H (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  return ((p1 == 't') || ((p1 == 'l') && (p2 == 'l')));
+}
+
+static int 
+I (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'o') && (p1 != 'e'));
+}
+
+static int 
+J (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'e'));
+}
+
+static int 
+K (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((stem_length >= 3) &&
+	  ((p1 == 'l') || (p1 == 'i') ||
+	   ((p1 == 'e') && (*(end - 2) == 'u'))));
+}
+
+static int 
+L (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  if (p1 == 's')
+    return (p2 == 'o');
+  else
+    return ((p1 != 'u') && (p1 != 'x'));
+}
+
+static int 
+M (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'c') &&
+	  (p1 != 'e') && (p1 != 'm'));
+}
+
+static int 
+N (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  if (stem_length >= 3)
+    {
+      if (*(end - 2) == 's')
+	return (stem_length >= 4);
+      else
+	return 1;
+    }
+  else
+    return 0;
+}
+
+static int 
+O (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+P (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'c');
+}
+
+static int 
+Q (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((stem_length >= 3) && (p1 != 'l') && (p1 != 'n'));
+}
+
+static int 
+R (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+S (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 't');
+  else
+    return ((p1 == 'r') && (p2 == 'd'));
+}
+
+static int 
+T (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 'o');
+  else
+    return (p1 == 's');
+}
+
+static int 
+U (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 == 'l') || (p1 == 'm') ||
+	  (p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+V (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end == 'c');
+}
+
+static int 
+W (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 != 's') && (p1 != 'u'));
+}
+
+static int 
+X (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  if (p1 == 'e')
+    return ((stem_length >= 3) && (*(end - 2) == 'u'));
+  else
+    return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+Y (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((*end == 'n') && (*(end - 1) == 'i'));
+}
+
+static int 
+Z (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'f');
+}
+
+static int 
+AA (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 'h')
+    return ((p2 == 'p') || (p2 == 't'));
+  else if (p1 == 'r')
+    return ((p2 == 'e') || (p2 == 'o'));
+  else if (p1 == 's')
+    return (p2 == 'e');
+  else
+    return ((p1 == 'd') || (p1 == 'f') ||
+	    (p1 == 'l') || (p1 == 't'));
+}
+
+static int 
+BB (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  if (stem_length >= 3)
+    {
+      if (stem_length >= 4)
+	return (strncmp (end - 3, "ryst", 4) != 0);
+      else
+	return (strncmp (end - 2, "met", 3) != 0);
+    }
+  else
+    return 0;
+}
+
+static int 
+CC (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end == 'l');
+}
+
+/**************************************************************************/
+
+#define MIN_STEM_LENGTH 2
+#define MAX_ENDING_SIZE 11
+#define PREDEFINED_SIZE (MAX_ENDING_SIZE + MIN_STEM_LENGTH)
+#define EOS     '\0'
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAX_STEM_LENGTH 255
+
+static char *remove_ending (char *word, int w_len);
+static void recode_stem (char *stem_end);
+
+/* =========================================================================
+ * Function: stem
+ * Description: 
+ *      Implemetation of the Lovins' stemming algorithm described in
+ *      J.B. Lovins, "Development of a Stemming Algorithm",
+ *      Mechanical Translation and Computational Linguistics, Vol 11,1968.
+ * Input: a word string with the length in the first byte
+ * Output: the stemmed word
+ * ========================================================================= */
+
+void
+lovinstem (u_char * word)
+{
+  char *word_start;		/* points to first letter of word */
+  char *stem_end;		/* points to last character of stem portion */
+  int old_length;		/* length of word */
+  int new_length;		/* length after stemming */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  u_char copy[MAX_STEM_LENGTH + 2];
+  bcopy ((char *) word, (char *) copy, *word + 1);
+
+  old_length = *copy; /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* The word must be at least MIN_STEM_LENGTH characters long. */
+  if (old_length <= MIN_STEM_LENGTH)
+    return;
+
+  word_start = (char *) copy + 1;	/* jump over length byte */ /* [RPAP - Jan 97: Stem Index Change] */
+  copy[old_length + 1] = '\0';	/* null terminate string */ /* [RPAP - Jan 97: Stem Index Change] */
+
+  stem_end = remove_ending (word_start, old_length);
+  recode_stem (stem_end);
+
+  /* fix up new length */
+  /* have to use strlen because have no other way of telling length */
+  new_length = strlen (word_start);
+  *copy = new_length;  /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  bcopy ((char *) copy, (char *) word, *copy + 1);
+
+}				/*stem_complex */
+
+/* =========================================================================
+
+ *   Data structure for recoding and the method for recoding the stem. 
+ *
+ * ========================================================================= */
+
+typedef struct
+{
+  char *old_end;		/* old ending */
+  char *new_end;		/* new ending */
+  char old_offset;		/* length of the old ending - 1 */
+  int (*cond) ();		/* condition rule */
+  char end_group;		/* signal the end of the group */
+}
+Recode_Rules;
+
+/*  
+   Stem terminations are divided into groups having the same last
+   character
+ */
+
+static Recode_Rules Rules[] =
+{
+  "uad", "uas", 2, NULL, 0,
+  "vad", "vas", 2, NULL, 0,
+  "cid", "cis", 2, NULL, 0,
+  "lid", "lis", 2, NULL, 0,
+  "erid", "eris", 3, NULL, 0,
+  "pand", "pans", 3, NULL, 0,
+  "end", "ens", 2, s, 0,
+  "end", "ens", 2, m, 0,
+  "ond", "ons", 2, NULL, 0,
+  "lud", "lus", 2, NULL, 0,
+  "rud", "rus", 2, NULL, 1,
+
+  "ul", "l", 1, aio, 1,
+
+  "istr", "ister", 3, NULL, 0,
+  "metr", "meter", 3, NULL, 0,
+  "her", "hes", 2, pt, 1,
+
+  "urs", "ur", 2, NULL, 1,
+
+  "uct", "uc", 2, NULL, 0,
+  "umpt", "um", 3, NULL, 0,
+  "rpt", "rb", 2, NULL, 0,
+  "mit", "mis", 2, NULL, 0,
+  "ert", "ers", 2, NULL, 0,
+  "et", "es", 1, n, 0,
+  "yt", "ys", 1, NULL, 1,
+
+  "iev", "ief", 2, NULL, 0,
+  "olv", "olut", 2, NULL, 1,
+
+  "bex", "bic", 2, NULL, 0,
+  "dex", "dic", 2, NULL, 0,
+  "pex", "pic", 2, NULL, 0,
+  "tex", "tic", 2, NULL, 0,
+  "ax", "ac", 1, NULL, 0,
+  "ex", "ec", 1, NULL, 0,
+  "ix", "ic", 1, NULL, 0,
+  "lux", "luc", 2, NULL, 1,
+
+  "yz", "ys", 1, NULL, 1
+};
+
+typedef struct last
+  {
+    char c;			/* The last character */
+    struct last *left;		/* used in balanced   */
+    struct last *right;		/* binary tree        */
+    Recode_Rules *pt;		/* location of approriate group */
+  }
+Last_Char_Node;
+
+/*------------
+       s
+     /   \
+    l     x
+   / \   / \
+  d   r t   z
+         \
+          v
+---------------*/
+static Last_Char_Node pr[] =
+{
+  'd', NULL, NULL, Rules,
+  'l', pr, pr + 2, Rules + 11,
+  'r', NULL, NULL, Rules + 12,
+  's', pr + 1, pr + 6, Rules + 15,
+  't', NULL, pr + 5, Rules + 16,
+  'v', NULL, NULL, Rules + 23,
+  'x', pr + 4, pr + 7, Rules + 25,
+  'z', NULL, NULL, Rules + 33,
+};
+
+
+/*****************************************************************************
+ *
+ *  Recode the stem according to the transformation rules.
+ *
+ *****************************************************************************/
+
+static void
+recode_stem (char *stem_end)
+{
+  static Last_Char_Node *root = pr + 3;
+  Last_Char_Node *p_last = root;
+  Recode_Rules *rule;		/* points to the transformation list */
+  char *h,			/* points to start of possible ending */
+    ch,				/* last character of the old ending  */
+    ch2;
+
+  h = stem_end - 1;
+  ch = *stem_end;
+  if (*h == ch)			/* Check for double consonant        */
+    {
+      if (strchr ("bdglmnprst", ch) != NULL)
+	{
+	  *stem_end = EOS;
+	  stem_end = h;
+	}
+    }
+
+  do				/* Check for the last character       */
+    {
+      ch2 = p_last->c;
+      if (ch == ch2)
+	break;
+      else if (ch > ch2)
+	p_last = p_last->right;
+      else
+	p_last = p_last->left;
+    }
+  while (p_last != NULL);
+
+  if (p_last != NULL)		/* Check for the rest of suffix list */
+    {
+      rule = p_last->pt;
+      for (;;)
+	{
+	  h = stem_end - rule->old_offset;
+	  if (strcmp (h, rule->old_end) == 0)
+	    {
+	      if (!rule->cond || (*rule->cond) (*(h - 1)))
+		{
+		  (void) strcpy (h, rule->new_end);
+		  break;
+		}
+	    }
+	  if (rule->end_group)
+	    break;
+	  rule++;
+	}
+    }
+}
+
+/* ======================================================================
+
+ *    List of endings and the method to remove the ending 
+ *
+ * ======================================================================*/
+
+/************ Data structures for list of endings  ********************/
+
+typedef struct
+{
+  char *ending;			/* old ending                */
+  int (*cond) ();		/* conditional rule          */
+  signed char left_offset;	/* used to find the siblings */
+  signed char right_offset;	/* in balanced binary tree   */
+}
+Ending_List;
+
+/*
+   The original list of endings is re-organised into groups having
+   the same length and the same first character.
+ */
+
+static Ending_List List[] =
+{
+  "a", NULL, 0, 0,
+
+  "ae", NULL, 0, 0,
+  "al", BB, -1, 2,
+  "ar", X, 0, 0,
+  "as", B, -1, 0,
+
+  "acy", NULL, 0, 1,
+  "age", B, 0, 0,
+  "aic", NULL, -2, 1,
+  "als", BB, 0, 0,
+  "ant", B, -2, 2,
+  "ars", O, 0, 0,
+  "ary", F, -1, 2,
+  "ata", NULL, 0, 0,
+  "ate", NULL, -1, 0,
+
+  "able", NULL, 0, 1,
+  "ably", NULL, 0, 0,
+  "ages", B, -2, 2,
+  "ally", B, 0, 0,
+  "ance", B, -1, 1,
+  "ancy", B, 0, 0,
+  "ants", B, -4, 4,
+  "aric", NULL, 0, 0,
+  "arly", K, -1, 1,
+  "ated", I, 0, 0,
+  "ates", NULL, -2, 2,
+  "atic", B, 0, 0,
+  "ator", NULL, -1, 0,
+
+  "acies", NULL, 0, 0,
+  "acity", NULL, -1, 1,
+  "aging", B, 0, 0,
+  "aical", NULL, -2, 2,
+  "alist", NULL, 0, 0,
+  "alism", B, -1, 0,
+  "ality", NULL, -3, 3,
+  "alize", NULL, 0, 1,
+  "allic", BB, 0, 0,
+  "anced", B, -2, 2,
+  "ances", B, 0, 0,
+  "antic", C, -1, 0,
+  "arial", NULL, -6, 6,
+  "aries", NULL, 0, 1,
+  "arily", NULL, 0, 0,
+  "arity", B, -2, 2,
+  "arize", NULL, 0, 0,
+  "aroid", NULL, -1, 0,
+  "ately", NULL, -3, 3,
+  "ating", I, 0, 1,
+  "ation", B, 0, 0,
+  "ative", NULL, -2, 2,
+  "ators", NULL, 0, 0,
+  "atory", NULL, -1, 1,
+  "ature", E, 0, 0,
+
+  "aceous", NULL, 0, 1,
+  "acious", B, 0, 0,
+  "action", G, -2, 2,
+  "alness", NULL, 0, 0,
+  "ancial", NULL, -1, 1,
+  "ancies", NULL, 0, 0,
+  "ancing", B, -4, 4,
+  "ariser", NULL, 0, 0,
+  "arized", NULL, -1, 1,
+  "arizer", NULL, 0, 0,
+  "atable", NULL, -2, 2,
+  "ations", B, 0, 0,
+  "atives", NULL, -1, 0,
+
+  "ability", NULL, 0, 1,
+  "aically", NULL, 0, 0,
+  "alistic", B, -2, 2,
+  "alities", NULL, 0, 0,
+  "ariness", E, -1, 0,
+  "aristic", NULL, -3, 3,
+  "arizing", NULL, 0, 1,
+  "ateness", NULL, 0, 0,
+  "atingly", NULL, -2, 2,
+  "ational", B, 0, 0,
+  "atively", NULL, -1, 1,
+  "ativism", NULL, 0, 0,
+
+  "ableness", NULL, 0, 1,
+  "arizable", NULL, 0, 0,
+
+  "allically", C, 0, 0,
+  "antaneous", NULL, -1, 1,
+  "antiality", NULL, 0, 0,
+  "arisation", NULL, -2, 2,
+  "arization", NULL, 0, 0,
+  "ationally", B, -1, 1,
+  "ativeness", NULL, 0, 0,
+
+  "antialness", NULL, 0, 0,
+  "arisations", NULL, -1, 1,
+  "arizations", NULL, 0, 0,
+
+  "alistically", B, 0, 1,
+  "arizability", NULL, 0, 0,
+
+  "e", NULL, 0, 0,
+
+  "ed", E, 0, 0,
+  "en", F, -1, 1,
+  "es", E, 0, 0,
+
+  "eal", Y, 0, 0,
+  "ear", Y, -1, 1,
+  "ely", E, 0, 0,
+  "ene", E, -2, 2,
+  "ent", C, 0, 0,
+  "ery", E, -1, 1,
+  "ese", NULL, 0, 0,
+
+  "ealy", Y, 0, 1,
+  "edly", E, 0, 0,
+  "eful", NULL, -2, 1,
+  "eity", NULL, 0, 0,
+  "ence", NULL, -2, 2,
+  "ency", NULL, 0, 0,
+  "ened", E, -1, 2,
+  "enly", E, 0, 0,
+  "eous", NULL, -1, 0,
+
+  "early", Y, 0, 1,
+  "ehood", NULL, 0, 0,
+  "eless", NULL, -2, 2,
+  "elity", NULL, 0, 0,
+  "ement", NULL, -1, 0,
+  "enced", NULL, -3, 3,
+  "ences", NULL, 0, 1,
+  "eness", E, 0, 0,
+  "ening", E, -2, 2,
+  "ental", NULL, 0, 0,
+  "ented", C, -1, 1,
+  "ently", NULL, 0, 0,
+
+  "eature", Z, 0, 0,
+  "efully", NULL, -1, 1,
+  "encies", NULL, 0, 0,
+  "encing", NULL, -2, 2,
+  "ential", NULL, 0, 0,
+  "enting", C, -1, 1,
+  "entist", NULL, 0, 1,
+  "eously", NULL, 0, 0,
+
+  "elihood", E, 0, 1,
+  "encible", NULL, 0, 0,
+  "entally", NULL, -2, 2,
+  "entials", NULL, 0, 0,
+  "entiate", NULL, -1, 1,
+  "entness", NULL, 0, 0,
+
+  "entation", NULL, 0, 0,
+  "entially", NULL, -1, 1,
+  "eousness", NULL, 0, 0,
+
+  "eableness", E, 0, 1,
+  "entations", NULL, 0, 0,
+  "entiality", NULL, -2, 2,
+  "entialize", NULL, 0, 0,
+  "entiation", NULL, -1, 0,
+
+  "entialness", NULL, 0, 0,
+
+  "ful", NULL, 0, 0,
+
+  "fully", NULL, 0, 0,
+
+  "fulness", NULL, 0, 0,
+
+  "hood", NULL, 0, 0,
+
+  "i", NULL, 0, 0,
+
+  "ia", NULL, 0, 0,
+  "ic", NULL, -1, 1,
+  "is", NULL, 0, 0,
+
+  "ial", NULL, 0, 0,
+  "ian", NULL, -1, 1,
+  "ics", NULL, 0, 1,
+  "ide", L, 0, 0,
+  "ied", NULL, -3, 3,
+  "ier", NULL, 0, 0,
+  "ies", P, -1, 0,
+  "ily", NULL, -1, 1,
+  "ine", M, 0, 0,
+  "ing", N, -5, 5,
+  "ion", Q, 0, 0,
+  "ish", C, -1, 1,
+  "ism", B, 0, 1,
+  "ist", NULL, 0, 0,
+  "ite", AA, -3, 3,
+  "ity", NULL, 0, 0,
+  "ium", NULL, -1, 0,
+  "ive", NULL, -1, 1,
+  "ize", F, 0, 0,
+
+  "ials", NULL, 0, 0,
+  "ians", NULL, -1, 0,
+  "ible", NULL, -1, 1,
+  "ibly", NULL, 0, 0,
+  "ical", NULL, -2, 2,
+  "ides", L, 0, 0,
+  "iers", NULL, -1, 1,
+  "iful", NULL, 0, 0,
+  "ines", M, -4, 4,
+  "ings", N, 0, 0,
+  "ions", B, -1, 1,
+  "ious", NULL, 0, 0,
+  "isms", B, -2, 2,
+  "ists", NULL, 0, 0,
+  "itic", H, -1, 1,
+  "ized", F, 0, 1,
+  "izer", F, 0, 0,
+
+  "ially", NULL, 0, 0,
+  "icant", NULL, -1, 1,
+  "ician", NULL, 0, 0,
+  "icide", NULL, -2, 2,
+  "icism", NULL, 0, 0,
+  "icist", NULL, -1, 0,
+  "icity", NULL, -3, 3,
+  "idine", I, 0, 1,
+  "iedly", NULL, 0, 0,
+  "ihood", NULL, -2, 2,
+  "inate", NULL, 0, 0,
+  "iness", NULL, -1, 0,
+  "ingly", B, -6, 6,
+  "inism", J, 0, 1,
+  "inity", CC, 0, 0,
+  "ional", NULL, -2, 2,
+  "ioned", NULL, 0, 0,
+  "ished", NULL, -1, 0,
+  "istic", NULL, -3, 3,
+  "ities", NULL, 0, 1,
+  "itous", NULL, 0, 0,
+  "ively", NULL, -2, 2,
+  "ivity", NULL, 0, 0,
+  "izers", F, -1, 1,
+  "izing", F, 0, 0,
+
+  "ialist", NULL, 0, 0,
+  "iality", NULL, -1, 1,
+  "ialize", NULL, 0, 0,
+  "ically", NULL, -2, 2,
+  "icance", NULL, 0, 0,
+  "icians", NULL, -1, 1,
+  "icists", NULL, 0, 0,
+  "ifully", NULL, -4, 4,
+  "ionals", NULL, 0, 0,
+  "ionate", D, -1, 1,
+  "ioning", NULL, 0, 0,
+  "ionist", NULL, -2, 2,
+  "iously", NULL, 0, 0,
+  "istics", NULL, -1, 1,
+  "izable", E, 0, 0,
+
+  "ibility", NULL, 0, 0,
+  "icalism", NULL, -1, 1,
+  "icalist", NULL, 0, 1,
+  "icality", NULL, 0, 0,
+  "icalize", NULL, -3, 3,
+  "ication", G, 0, 0,
+  "icianry", NULL, -1, 0,
+  "ination", NULL, -1, 1,
+  "ingness", NULL, 0, 0,
+  "ionally", NULL, -5, 5,
+  "isation", NULL, 0, 0,
+  "ishness", NULL, -1, 1,
+  "istical", NULL, 0, 1,
+  "iteness", NULL, 0, 0,
+  "iveness", NULL, -3, 3,
+  "ivistic", NULL, 0, 0,
+  "ivities", NULL, -1, 0,
+  "ization", F, -1, 1,
+  "izement", NULL, 0, 0,
+
+  "ibleness", NULL, 0, 0,
+  "icalness", NULL, -1, 1,
+  "ionalism", NULL, 0, 0,
+  "ionality", NULL, -2, 2,
+  "ionalize", NULL, 0, 0,
+  "iousness", NULL, -1, 1,
+  "izations", NULL, 0, 0,
+
+  "ionalness", NULL, 0, 1,
+  "istically", NULL, 0, 0,
+  "itousness", NULL, -2, 2,
+  "izability", NULL, 0, 0,
+  "izational", NULL, -1, 0,
+
+  "izationally", B, 0, 0,
+
+  "ly", B, 0, 0,
+
+  "less", NULL, 0, 1,
+  "lily", NULL, 0, 0,
+
+  "lessly", NULL, 0, 0,
+
+  "lessness", NULL, 0, 0,
+
+  "ness", NULL, 0, 0,
+
+  "nesses", NULL, 0, 0,
+
+  "o", NULL, 0, 0,
+
+  "on", S, 0, 1,
+  "or", T, 0, 0,
+
+  "oid", NULL, 0, 0,
+  "one", R, -1, 1,
+  "ous", NULL, 0, 0,
+
+  "ogen", NULL, 0, 0,
+
+  "oidal", NULL, 0, 0,
+  "oides", NULL, -1, 2,
+  "otide", NULL, 0, 0,
+  "ously", NULL, -1, 0,
+
+  "oidism", NULL, 0, 0,
+
+  "oidally", NULL, 0, 1,
+  "ousness", NULL, 0, 0,
+
+  "s", W, 0, 0,
+
+  "s'", NULL, 0, 0,
+
+  "um", U, 0, 1,
+  "us", V, 0, 0,
+
+  "ward", NULL, 0, 1,
+  "wise", NULL, 0, 0,
+
+  "y", B, 0, 0,
+
+  "yl", R, 0, 0,
+
+  "ying", B, 0, 1,
+  "yish", NULL, 0, 0,
+
+  "'s", NULL, 0, 0,
+};
+
+typedef struct node
+  {
+    char c;			/* First character  */
+    struct node *left;		/* used in balanced */
+    struct node *right;		/* binary tree      */
+    Ending_List *ptr[11];	/* the approriate location */
+  }
+First_Char_Node;
+
+static First_Char_Node First[] =
+{
+  '\'', NULL, NULL,
+  {NULL,
+   List + 293, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'a', First, NULL,
+  {List,
+   List + 2, List + 9, List + 20, List + 39, List + 58,
+   List + 70, List + 77, List + 82, List + 87, List + 89},
+
+  'e', First + 1, First + 4,
+  {List + 91,
+   List + 93, List + 98, List + 106, List + 116, List + 126,
+   List + 133, List + 138, List + 142, List + 145, NULL},
+
+  'f', NULL, NULL,
+  {NULL,
+   NULL, List + 146, NULL, List + 147, NULL,
+   List + 148, NULL, NULL, NULL, NULL},
+
+  'h', First + 3, First + 5,
+  {NULL,
+   NULL, NULL, List + 149, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'i', NULL, NULL,
+  {List + 150,
+   List + 152, List + 163, List + 181, List + 202, List + 222,
+   List + 239, List + 252, List + 258, NULL, List + 261},
+
+  'l', First + 2, First + 10,
+  {NULL,
+   List + 262, NULL, List + 263, NULL, List + 265,
+   NULL, List + 266, NULL, NULL, NULL},
+
+  'n', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 267, NULL, List + 268,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'o', First + 7, First + 9,
+  {List + 269,
+   List + 270, List + 273, List + 275, List + 277, List + 280,
+   List + 281, NULL, NULL, NULL, NULL},
+
+  's', NULL, NULL,
+  {List + 283,
+   List + 284, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'u', First + 8, First + 12,
+  {NULL,
+   List + 285, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'w', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 287, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'y', First + 11, NULL,
+  {List + 289,
+   List + 290, NULL, List + 291, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+};
+
+
+/******************************************************************************
+ *
+ *  Look for a match in the suffix list.
+ *  Return the pointer to the end of the new stem if there is a match.
+ *  Otherwise, return the pointer to the end of the original word.
+ *
+ *  Method:
+ *      * Search for the first character in the suffix list.
+ *      * If there is match, search for the rest of the suffix list.
+ *         
+ *****************************************************************************/
+
+static char *
+remove_ending (char *word, int w_len)
+{
+  static First_Char_Node *root = First + 6;	/* the root of binary tree is 'l' */
+  First_Char_Node *p_first;	/* Points to the first character      */
+  /* of the possible suffix             */
+  Ending_List *p_list;		/* Points to the List of Endings      */
+  char *suffix_start,		/* Points to start of possible suffix */
+   *stem_end,			/* Points to the end of possible stem */
+    ch1, ch2;
+  int s_len,			/* Possible stem length               */
+    e_offset,			/* Offset from the end to the start of */
+  /* possible suffix                    */
+    not_done = 1, cmp;
+
+  stem_end = word + w_len - 1;
+  if (w_len > PREDEFINED_SIZE)	/* find the start of suffix   */
+    suffix_start = word + w_len - MAX_ENDING_SIZE;
+  else
+    suffix_start = word + MIN_STEM_LENGTH;
+
+  ch1 = *suffix_start;
+  do				/* Search for the first character     */
+    {
+      p_first = root;
+      do
+	{
+	  ch2 = p_first->c;
+	  if (ch1 == ch2)
+	    break;
+	  else if (ch1 > ch2)
+	    p_first = p_first->right;
+	  else
+	    p_first = p_first->left;
+	}
+      while (p_first != NULL);
+
+      if (p_first != NULL)	/* Search for the rest */
+	{
+	  e_offset = stem_end - suffix_start;
+	  if ((p_list = p_first->ptr[e_offset]) != NULL)
+	    {
+	      for (;;)		/* no need to compare the first char  */
+		{
+		  cmp = strcmp (suffix_start + 1, p_list->ending + 1);
+		  if (cmp > 0)
+		    if (p_list->right_offset)
+		      p_list += p_list->right_offset;
+		    else
+		      break;
+		  else if (cmp < 0)
+		    if (p_list->left_offset)
+		      p_list += p_list->left_offset;
+		    else
+		      break;
+		  else
+		    {
+		      s_len = suffix_start - word;
+		      if (!p_list->cond ||
+			  (*p_list->cond) (s_len, suffix_start - 1))
+			{
+			  *suffix_start = EOS;
+			  stem_end = suffix_start - 1;
+			  not_done = 0;
+			}
+		      break;
+		    }
+		}
+	    }
+	}
+      suffix_start++;
+    }
+  while (not_done && ((ch1 = *suffix_start) != EOS));
+  return (stem_end);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/lovinstem.h	(revision 21083)
@@ -0,0 +1,53 @@
+/**************************************************************************
+ *
+ * lovinstem.h -- Lovins' stemmer header
+ * Copyright (C) 1994  Linh Huynh, 
+ *                     (glued into library by tes@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:54  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/25 07:55:36  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:32:47  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:20:10  tes
+   * Changes made for 1.1
+   *
+   *
+ */
+#ifndef LOVINSTEM_H
+#define LOVINSTEM_H
+
+void lovinstem (unsigned char *word);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/memlib.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/memlib.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/memlib.c	(revision 21083)
@@ -0,0 +1,59 @@
+/**************************************************************************
+ *
+ * memlib.c -- Malloc wrappers
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:54  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:10  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:47  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+/* Defined as strdup is not an ANSI function */
+char *
+my_strdup(const char *str)
+{
+  char *ret_str = malloc(strlen(str)+1);
+  if (ret_str) return strcpy(ret_str, str);
+  else return (char*) 0;
+}
+
+
+Malloc_func Xmalloc = malloc;
+
+Realloc_func Xrealloc = realloc;
+
+Free_func Xfree = free;
+
+Strdup_func Xstrdup = my_strdup;
Index: /main/tags/2.38/gsdl/packages/mg/lib/memlib.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/memlib.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/memlib.h	(revision 21083)
@@ -0,0 +1,51 @@
+/**************************************************************************
+ *
+ * memlib.h -- Malloc wrappers
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_MEMLIB
+#define H_MEMLIB
+
+#ifdef STD_MEM
+
+#define Xmalloc malloc
+#define Xrealloc realloc
+#define Xfree free
+#define Xstrdup strdup
+
+#else
+
+
+#include "sysfuncs.h"
+
+typedef void *(*Malloc_func) (size_t);
+typedef void *(*Realloc_func) (void *, size_t);
+typedef void (*Free_func) (void *);
+typedef char *(*Strdup_func) (const char *);
+
+extern Malloc_func Xmalloc;
+extern Realloc_func Xrealloc;
+extern Free_func Xfree;
+extern Strdup_func Xstrdup;
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/messages.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/messages.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/messages.c	(revision 21083)
@@ -0,0 +1,96 @@
+/**************************************************************************
+ *
+ * messages.c -- Message and error functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:55  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/23 03:38:06  rjmcnab
+
+   combined unix and windows versions of mg
+
+   Revision 1.1  1998/11/19 03:00:32  sjboddie
+   Added windows gdbm and mg versions
+
+   * Revision 1.1  1994/08/22  00:24:48  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include <stdarg.h>
+#include "messages.h"
+
+char *msg_prefix = "";
+
+
+void VOLATILE 
+FatalError (int ExitCode, const char *fmt,...)
+{
+  char buf[1024];
+  char *s, *pfx;
+  va_list args;
+  va_start (args, fmt);
+  vsprintf (buf, fmt, args);
+  s = strrchr (buf, '\n');
+  if (!s || *(s + 1) != '\0')
+    strcat (buf, "\n");
+  pfx = strrchr (msg_prefix, '/');
+  pfx = pfx ? pfx + 1 : msg_prefix;
+  fprintf (stderr, "%s%s%s", pfx, *pfx ? " : " : "", buf);
+  exit (ExitCode);
+}
+
+
+
+/*
+ * This function writes messages to stderr. Due to the fact that I can't 
+ * guarantee that the fprintf call is monatomic I have to implement a 
+ * semaphore system.
+ */
+void 
+Message (const char *fmt,...)
+{
+  char buf[1024];
+  char *s, *pfx;
+  va_list args;
+
+#ifdef QUIET
+  return; /* stop those messages!!!! */
+#endif  
+
+  va_start (args, fmt);
+  vsprintf (buf, fmt, args);
+  s = strrchr (buf, '\n');
+  if (!s || *(s + 1) != '\0')
+    strcat (buf, "\n");
+
+  pfx = strrchr (msg_prefix, '/');
+  pfx = pfx ? pfx + 1 : msg_prefix;
+  fprintf (stderr, "%s%s%s", pfx, *pfx ? " : " : "", buf);
+
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/messages.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/messages.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/messages.h	(revision 21083)
@@ -0,0 +1,39 @@
+/**************************************************************************
+ *
+ * messages.h -- Message and error functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_MESSAGES
+#define H_MESSAGES
+
+#ifdef __GNUC__
+#define VOLATILE volatile
+#else
+#define VOLATILE
+#endif
+
+extern char *msg_prefix;
+
+void VOLATILE FatalError (int ExitCode, const char *fmt,...);
+
+void Message (const char *fmt,...);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/mgheap.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/mgheap.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/mgheap.c	(revision 21083)
@@ -0,0 +1,170 @@
+/**************************************************************************
+ *
+ * mgheap.c -- Heap routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:16:55  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1999/01/15 03:05:50  rjmcnab
+
+   Renamed lib/heap to be lib/mgheap (it was causing some problems with
+   some versions of the STL libraries which contained a heap.h)
+
+   Revision 1.1  1998/11/17 09:32:01  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:43  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "mgheap.h"
+
+#define SWAP(s, a, b) 						\
+do {								\
+     register int __i;						\
+     register char *__a = (a), *__b = (b);			\
+     for (__i = (s); __i; __i--)				\
+       {							\
+         register char __t = *__a;				\
+	 *__a++ = *__b; *__b++ = __t;				\
+       }							\
+} while(0)
+
+
+
+#define COPY(s, dst, src) 					\
+do {								\
+     register int __i;						\
+     register char *__dst = (dst), *__src = (src);		\
+     for (__i = (s); __i; __i--)				\
+       *__dst++ = *__src++;					\
+} while(0)
+
+
+
+static void 
+heap_heapify (void *heap, int size, int num, int curr, heap_comp hc)
+{
+  register int child = curr * 2;
+  while (child <= num)
+    {
+      if (child < num && hc ((char *) heap + child * size,
+			     (char *) heap + child * size - size) < 0)
+	child++;
+      if (hc ((char *) heap + (curr - 1) * size, (char *) heap + (child - 1) * size) > 0)
+	{
+	  SWAP (size, (char *) heap + (curr - 1) * size,
+		(char *) heap + (child - 1) * size);
+	  curr = child;
+	  child = child * 2;
+	}
+      else
+	break;
+    }
+}
+
+static void 
+heap_pullup (void *heap, int size, int num, heap_comp hc)
+{
+  register int curr = num;
+  register int parent = curr >> 1;
+  while (parent &&
+	 hc ((char *) heap + (curr - 1) * size, (char *) heap + (parent - 1) * size) < 0)
+    {
+      SWAP (size, (char *) heap + (curr - 1) * size,
+	    (char *) heap + (parent - 1) * size);
+      curr = parent;
+      parent = curr >> 1;
+    }
+}
+
+/************************************************************************
+ *
+ * NOTE: If you choose to change the comparison function the first thing 
+ *       you do after changing the function is call heap_build.
+ *
+ */
+void 
+heap_build (void *heap, int size, int num, heap_comp hc)
+{
+  register int i;
+  for (i = num / 2; i > 0; i--)
+    heap_heapify (heap, size, num, i, hc);
+}
+
+
+
+/****************************************************
+ *
+ * NOTE : The heap must be built before heap_sort is called. 
+ *        This has the effect of reversing the order of the array.
+ *		e.g. if your comparison function is designed to pull the
+ *                   biggest thing off the heap first then the result of
+ *		     sorting with this function will be to put the bigest
+ *                   thing at the end of the array.
+ *
+ */
+void 
+heap_sort (void *heap, int size, int num, heap_comp hc)
+{
+  register int i;
+  for (i = num; i > 1; i--)
+    {
+      SWAP (size, heap, (char *) heap + (i - 1) * size);
+      heap_heapify (heap, size, i - 1, 1, hc);
+    }
+}
+
+
+void 
+heap_deletehead (void *heap, int size, int *num, heap_comp hc)
+{
+  (*num)--;
+  SWAP (size, heap, (char *) heap + *num * size);
+  heap_heapify (heap, size, *num, 1, hc);
+}
+
+
+void 
+heap_changedhead (void *heap, int size, int num, heap_comp hc)
+{
+  heap_heapify (heap, size, num, 1, hc);
+}
+
+
+/***********************************************************************
+ *
+ * This assumes that the item has been added to the end of the
+ * array that is the heap. But that num has not been changed. 
+ *
+ */
+void 
+heap_additem (void *heap, int size, int *num, heap_comp hc)
+{
+  (*num)++;
+  heap_pullup (heap, size, *num, hc);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/mgheap.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/mgheap.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/mgheap.h	(revision 21083)
@@ -0,0 +1,84 @@
+/**************************************************************************
+ *
+ * mgheap.h -- Heap routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/* Care should be taken when using these routines as NO error checking is
+ * done.
+ */
+
+
+
+/* The heap comparison routine should return 
+ * <0 : If a should be before b
+ *  0 : If a and b are equal
+ * >0 : If a should be after b
+ */
+typedef int (*heap_comp) (void *a, void *b);
+
+
+/************************************************************************
+ *
+ * NOTE: If you choose to change the comparison function the first thing 
+ *       you do after changing the function is call heap_build.
+ *
+ */
+void heap_build (void *heap, int size, int num, heap_comp hc);
+
+
+
+/************************************************************************
+ *
+ * NOTE : The heap must be built before heap_sort is called.
+ *        This has the effect of reversing the order of the array.
+ *		e.g. if your comparison function is designed to pull the
+ *                   biggest thing off the heap first then the result of
+ *		     sorting with this function will be to put the bigest
+ *                   thing at the end of the array.
+ *
+ */
+void heap_sort (void *heap, int size, int num, heap_comp hc);
+
+/***********************************************************************
+ *
+ * NOTE: After deleting the head the heap will be one item shorter.
+ *       The deleted item will be placed at the end of the heap.
+ *
+ */
+void heap_deletehead (void *heap, int size, int *num, heap_comp hc);
+
+
+/***********************************************************************
+ *
+ * If you change the "value" of the root node of the heap then you
+ * should call this to re-pritorize the heap.
+ *
+ */
+void heap_changedhead (void *heap, int size, int num, heap_comp hc);
+
+
+/***********************************************************************
+ *
+ * This assumes that the item has been added to the end of the
+ * array that is the heap. But that num has not been changed. 
+ *
+ */
+void heap_additem (void *heap, int size, int *num, heap_comp hc);
Index: /main/tags/2.38/gsdl/packages/mg/lib/netorder.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/netorder.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/netorder.h	(revision 21083)
@@ -0,0 +1,189 @@
+#ifndef NETORDER_H
+#define NETORDER_H
+
+#include "sysfuncs.h"
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+#include "win32in.h"
+#else
+# include <netinet/in.h>
+#endif
+
+#if defined (BIG_ENDIAN) || defined (_BIG_ENDIAN) || defined (__BIG_ENDIAN)
+# ifndef _BIG_ENDIAN
+#  define _BIG_ENDIAN
+# endif
+#endif
+
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+# ifndef _LITTLE_ENDIAN
+#  define _LITTLE_ENDIAN
+# endif
+#endif
+
+#ifdef _LITTLE_ENDIAN
+
+/* double */
+#define HTOND(d)                                                                                  \
+        do {                                                                                      \
+             unsigned long tmph, tmpl;                                                            \
+	     bcopy ((char *) &d, (char *) &tmph, sizeof(double) >> 1);                            \
+	     bcopy ((char *) &d + (sizeof(double) >> 1), (char *) &tmpl, sizeof (double) >> 1);   \
+	     tmph = htonl (tmph);                                                                 \
+	     tmpl = htonl (tmpl);                                                                 \
+	     bcopy ((char *) &tmpl, (char *) &d, sizeof (double) >> 1);                           \
+	     bcopy ((char *) &tmph, (char *) &d + (sizeof(double) >> 1), sizeof (double) >> 1);   \
+	}while(0)
+#define NTOHD(d)                                                                                  \
+        do {                                                                                      \
+             unsigned long tmph, tmpl;                                                            \
+	     bcopy ((char *) &d, (char *) &tmph, sizeof(double) >> 1);                            \
+	     bcopy ((char *) &d + (sizeof(double) >> 1), (char *) &tmpl, sizeof (double) >> 1);   \
+	     tmph = ntohl (tmph);                                                                 \
+	     tmpl = ntohl (tmpl);                                                                 \
+	     bcopy ((char *) &tmpl, (char *) &d, sizeof (double) >> 1);                           \
+	     bcopy ((char *) &tmph, (char *) &d + (sizeof(double) >> 1), sizeof (double) >> 1);   \
+        }while(0)
+#define HTOND2(hd, nd)                                                                            \
+        do {                                                                                      \
+             unsigned long tmph, tmpl;                                                            \
+	     bcopy ((char *) &hd, (char *) &tmph, sizeof(double) >> 1);                           \
+	     bcopy ((char *) &hd + (sizeof(double) >> 1), (char *) &tmpl, sizeof (double) >> 1);  \
+	     tmph = htonl (tmph);                                                                 \
+	     tmpl = htonl (tmpl);                                                                 \
+	     bcopy ((char *) &tmpl, (char *) &nd, sizeof (double) >> 1);                          \
+	     bcopy ((char *) &tmph, (char *) &nd + (sizeof(double) >> 1), sizeof (double) >> 1);  \
+	}while(0)
+#define NTOHD2(nd, hd)                                                                            \
+        do {                                                                                      \
+             unsigned long tmph, tmpl;                                                            \
+	     bcopy ((char *) &nd, (char *) &tmph, sizeof(double) >> 1);                           \
+	     bcopy ((char *) &nd + (sizeof(double) >> 1), (char *) &tmpl, sizeof (double) >> 1);  \
+	     tmph = ntohl (tmph);                                                                 \
+	     tmpl = ntohl (tmpl);                                                                 \
+	     bcopy ((char *) &tmpl, (char *) &hd, sizeof (double) >> 1);                          \
+	     bcopy ((char *) &tmph, (char *) &hd + (sizeof(double) >> 1), sizeof (double) >> 1);  \
+        }while(0)
+
+/* float */
+#define HTONF(f)                                                                   \
+        do {                                                                       \
+             unsigned long tmp;                                                    \
+             bcopy ((char *) &(f), (char *) &tmp, sizeof (float));                 \
+             HTONUL (tmp);                                                         \
+	     bcopy ((char *) &tmp, (char *) &(f), sizeof (float));                 \
+	}while(0)
+#define NTOHF(f)                                                                   \
+        do {                                                                       \
+             unsigned long tmp;                                                    \
+             bcopy ((char *) &(f), (char *) &tmp, sizeof (float));                 \
+	     NTOHUL (tmp);                                                         \
+	     bcopy ((char *) &tmp, (char *) &(f), sizeof (float));                 \
+	}while(0)
+#define HTONF2(hf, nf)                                                             \
+        do {                                                                       \
+             unsigned long tmp;                                                    \
+             bcopy ((char *) &(hf), (char *) &tmp, sizeof (float));                \
+             HTONUL (tmp);                                                         \
+	     bcopy ((char *) &tmp, (char *) &(nf), sizeof (float));                \
+	}while(0)
+#define NTOHF2(nf, hf)                                                             \
+        do {                                                                       \
+             unsigned long tmp;                                                    \
+             bcopy ((char *) &(nf), (char *) &tmp, sizeof (float));                \
+	     NTOHUL (tmp);                                                         \
+	     bcopy ((char *) &tmp, (char *) &(hf), sizeof (float));                \
+	}while(0)
+
+/* pointers */
+#define HTONP(p)          ((p) = (void *) htonl ((unsigned long) p))
+#define NTOHP(p)          ((p) = (void *) ntohl ((unsigned long) p))
+#define HTONP2(hp, np)    ((np) = (void *) htonl ((unsigned long) hp))
+#define NTOHP2(np, hp)    ((hp) = (void *) ntohl ((unsigned long) np))
+
+/* unsigned long */
+#define HTONUL(l)         ((l) = htonl((l)))
+#define NTOHUL(l)         ((l) = ntohl((l)))
+#define HTONUL2(hl, nl)   ((nl) = htonl ((hl)))
+#define NTOHUL2(nl, hl)   ((hl) = ntohl ((nl)))
+
+/* signed long */
+#define HTONSL(l)         ((l) = (long) htonl ((unsigned long) (l)))
+#define NTOHSL(l)         ((l) = (long) ntohl ((unsigned long) (l)))
+#define HTONSL2(hl, nl)   ((nl) = (long) htonl ((unsigned long) (hl)))
+#define NTOHSL2(nl, hl)   ((hl) = (long) ntohl ((unsigned long) (nl)))
+
+/* unsigned int */
+#define HTONUI(i)         ((i) = (unsigned int) htonl ((unsigned long) (i)))
+#define NTOHUI(i)         ((i) = (unsigned int) ntohl ((unsigned long) (i)))
+#define HTONUI2(hi, ni)   ((ni) = (unsigned int) htonl ((unsigned long) (hi)))
+#define NTOHUI2(ni, hi)   ((hi) = (unsigned int) ntohl ((unsigned long) (ni)))
+
+/* signed int */
+#define HTONSI(i)         ((i) = (int) htonl ((unsigned long) (i)))
+#define NTOHSI(i)         ((i) = (int) ntohl ((unsigned long) (i)))
+#define HTONSI2(hi, ni)   ((ni) = (int) htonl ((unsigned long) (hi)))
+#define NTOHSI2(ni, hi)   ((hi) = (int) ntohl ((unsigned long) (ni)))
+
+/* unsigned short */
+#define HTONUS(s)         ((s) = htons((s)))
+#define NTOHUS(s)         ((s) = ntohs((s)))
+#define HTONUS2(hs, ns)   ((ns) = htons((hs)))
+#define NTOHUS2(ns, hs)   ((hs) = ntohs((ns)))
+
+#else   /* _BIG_ENDIAN */
+
+/* double */
+#define HTOND(d)          (d)
+#define NTOHD(d)          (d)
+#define HTOND2(hd, nd)    ((hd) = (nd))
+#define NTOHD2(nd, hd)    ((nd) = (hd))
+
+/* float */
+#define HTONF(f)          (f)
+#define NTOHF(f)          (f)
+#define HTONF2(hf, nf)    ((nf) = (hf))
+#define NTOHF2(nf, hf)    ((hf) = (nf))
+
+/* pointers */
+#define HTONP(p)          (p)
+#define NTOHP(p)          (p)
+#define HTONP2(hp, np)    ((np) = (hp))
+#define NTOHP2(np, hp)    ((hp) = (np))
+
+/* unsigned long */
+#define HTONUL(l)         (l)
+#define NTOHUL(l)         (l)
+#define HTONUL2(hl, nl)   ((nl) = (hl))
+#define NTOHUL2(nl, hl)   ((hl) = (nl))
+
+/* signed long */
+#define HTONSL(l)         (l)
+#define NTOHSL(l)         (l)
+#define HTONSL2(hl, nl)   ((nl) = (hl))
+#define NTOHSL2(nl, hl)   ((hl) = (nl))
+
+/* unsigned int */
+#define HTONUI(i)         (i)
+#define NTOHUI(i)         (i)
+#define HTONUI2(hi, ni)   ((ni) = (hi))
+#define NTOHUI2(ni, hi)   ((hi) = (ni))
+
+/* signed int */
+#define HTONSI(i)         (i)
+#define NTOHSI(i)         (i)
+#define HTONSI2(hi, ni)   ((ni) = (hi))
+#define NTOHSI2(ni, hi)   ((hi) = (ni))
+
+/* unsigned short */
+#define HTONUS(s)         (s)
+#define NTOHUS(s)         (s)
+#define HTONUS2(hs, ns)   ((ns) = (hs))
+#define NTOHUS2(ns, hs)   ((hs) = (ns))
+
+
+
+#endif
+
+#endif /* netorder.h */
Index: /main/tags/2.38/gsdl/packages/mg/lib/pathmax.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/pathmax.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/pathmax.h	(revision 21083)
@@ -0,0 +1,53 @@
+/* Define PATH_MAX somehow.  Requires sys/types.h.
+   Copyright (C) 1992 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _PATHMAX_H
+#define _PATHMAX_H
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* 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
+
+#endif /* _PATHMAX_H */
Index: /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.c	(revision 21083)
@@ -0,0 +1,1108 @@
+/**************************************************************************
+ *
+ * perf_hash.c -- Perfect hashing functions
+ * Copyright (C) 1992  Bohdan S. Majewski
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ * 1994 Neil Sharman
+ *      Small modifications were made to the interface so that it fitted in
+ *      with mg.
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.2  2001/02/22 01:35:03  jrm21
+   Fixed bug that caused perf_hash to fail for lexicon of < 4 words.
+   Added a #define to increase size of n (for vertices in the graph) as we
+   need to allocate more memory somewhere else before calling tree_builder()
+
+   Revision 1.1  1999/08/10 21:16:57  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:17  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/08/22  00:26:30  tes
+   * Made perf_hash take the ceiling of 1.23 * num
+   * in lieu of the floor.
+   * This was done so that perf_hash works ok on
+   * a small number of keys.
+   *
+   * Revision 1.1  1994/08/22  00:24:49  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+#define STRUCT
+
+#include "sysfuncs.h"
+
+#include "local_strings.h"
+#include "memlib.h"
+#include "messages.h"
+#include "perf_hash.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#define FALSE 0
+#define TRUE  1
+
+#define STATIC 0
+
+/* Random Number stuff */
+static long seed[] = {0, 0};
+#define RANDOM() irandm(seed)
+#define SEED_RANDOM(the_seed) do{ seed[0] = the_seed; }while(0)
+
+/* Max number of keys - must be a power of 2 minus 1 */
+static int MAX_M;
+
+
+static int MAX_CH;
+
+
+/* the width of the mapping tables  */
+static int MAX_L;
+
+
+
+#define c     1.23
+static int MAX_N;
+
+/* An arbitrary amount to add to both MAX_N and n for building tree/acyclic
+   graph -- John McPherson - jrm21 (22-02-2001) */
+#define MAX_N_HEADROOM  100
+
+
+static u_char *translate;
+
+#define MEMBER 0
+#define ERASED 1
+
+
+
+/* direction constants for the edge oriented 3-graph representation */
+#define A              0
+#define B        (MAX_M)
+#define C          (2*B)
+
+/* NODEa, NODEb, NODEc, FIRST and NEXT are used to represent a 3-graph */
+static int *NODEa, *NODEb, *NODEc;
+static int *FIRST;
+static int *NEXT;
+
+
+#define norm(e) ((e) % MAX_M)
+/* in general should be ((e) % MAX_M) but MAX_M = 2^k - 1 */
+
+
+static char *mk;		/* for marking edges/vertices as removed */
+static int *g;			/* array g defines a minimal perfect hash function */
+
+
+
+/* stack of edges, created during the independency */
+/* test, used in the assignment step               */
+static struct
+  {
+    int sp;
+    int *st;
+  }
+S;
+#define push(s, e) s.st[s.sp++] = (e)
+#define pop(s, e)  e = s.st[--s.sp]
+
+#ifndef STRUCT
+static long **tb0, **tb1, **tb2;
+#else
+struct tb_entry **tb;
+#endif
+
+
+static int 
+unique (int v)
+{				/* checks if vertex v belongs to only one edge */
+  return (FIRST[v] != 0 && NEXT[FIRST[v]] == 0) ? FIRST[v] : 0;
+}				/*unique */
+
+
+
+
+
+
+
+
+static void 
+delete (int v, int e)
+{				/* deletes edge e from list of v */
+
+  int b;
+
+  b = FIRST[v];
+  assert (norm (b) != 0);
+  if (norm (b) == e)
+    FIRST[v] = NEXT[FIRST[v]];
+  else
+    {
+      while (norm (NEXT[b]) != e)
+	{
+	  b = NEXT[b];
+	  assert (norm (b) != 0);
+	}
+      NEXT[b] = NEXT[NEXT[b]];
+    }
+}				/*delete */
+
+
+
+
+
+
+#if 0
+/* recursively removes the edges of a 3-graph which have at least */
+/* one unique vertex. The removed edges are placed on stack S     */
+static void 
+ph_remove (int e, int v)
+{
+  int b;
+  mk[e] = ERASED;
+  push (S, e);
+
+  if (NODEa[e] != v)
+    delete (NODEa[e], e);
+  if (NODEb[e] != v)
+    delete (NODEb[e], e);
+  if (NODEc[e] != v)
+    delete (NODEc[e], e);
+
+  if (NODEa[e] != v && mk[b = norm (unique (NODEa[e]))] == MEMBER)
+    ph_remove (b, NODEa[e]);
+  if (NODEb[e] != v && mk[b = norm (unique (NODEb[e]))] == MEMBER)
+    ph_remove (b, NODEb[e]);
+  if (NODEc[e] != v && mk[b = norm (unique (NODEc[e]))] == MEMBER)
+    ph_remove (b, NODEc[e]);
+}
+#else
+
+
+static int StackPos, StackMax;
+static struct Stack
+  {
+    int e, v, m;
+  }
+ *Stack = NULL;
+
+#define StackAdd(_e, _v, _m)						\
+  do {									\
+    if (StackPos == StackMax)						\
+      {									\
+        StackMax <<= 1;							\
+	if (!(Stack = Xrealloc(Stack, sizeof(*Stack) * StackMax)))	\
+	  return(-1);							\
+      }									\
+    Stack[StackPos].e = (_e);						\
+    Stack[StackPos].v = (_v);						\
+    Stack[StackPos++].m = (_m);						\
+  } while(0)
+
+
+static int 
+ph_remove (int e, int v)
+{
+  if (!Stack)
+    {
+      StackMax = 256;
+      if (!(Stack = Xmalloc (sizeof (*Stack) * StackMax)))
+	return (-1);
+      StackPos = 0;
+    }
+  Stack[StackPos].e = e;
+  Stack[StackPos].v = v;
+  Stack[StackPos].m = 0;
+  StackPos++;
+  while (StackPos)
+    {
+      int m, b;
+      StackPos--;
+      e = Stack[StackPos].e;
+      v = Stack[StackPos].v;
+      m = Stack[StackPos].m;
+
+
+      switch (m)
+	{
+	case 0:
+	  {
+	    mk[e] = ERASED;
+	    push (S, e);
+
+	    if (NODEa[e] != v)
+	      delete (NODEa[e], e);
+	    if (NODEb[e] != v)
+	      delete (NODEb[e], e);
+	    if (NODEc[e] != v)
+	      delete (NODEc[e], e);
+
+	    if (NODEa[e] != v && mk[b = norm (unique (NODEa[e]))] == MEMBER)
+	      {
+		Stack[StackPos++].m = 1;
+		StackAdd (b, NODEa[e], 0);
+		break;
+	      }
+	  }
+	case 1:
+	  {
+	    if (NODEb[e] != v && mk[b = norm (unique (NODEb[e]))] == MEMBER)
+	      {
+		Stack[StackPos++].m = 2;
+		StackAdd (b, NODEb[e], 0);
+		break;
+	      }
+	  }
+	case 2:
+	  if (NODEc[e] != v && mk[b = norm (unique (NODEc[e]))] == MEMBER)
+	    StackAdd (b, NODEc[e], 0);
+	}
+    }
+  return (0);
+}
+#endif
+
+
+
+
+
+/* returns TRUE if and only if set of edges created in the tree_builder */
+/* procedure form a 3-graph with independent edges. Edges of a 3-graph  */
+/* are independent iff repeated deletion of edges containing vertices   */
+/* of degree 1 results in a graph with no edges in it.                  */
+static int 
+acyclic (int m, int n)
+{
+
+  int v, e;
+  /* build list of edges for each node */
+  for (v = 1; v <= n; FIRST[v++] = 0);
+  for (e = 1; e <= m; e++)
+    {
+      NEXT[A + e] = FIRST[NODEa[e]];
+      FIRST[NODEa[e]] = A + e;
+      NEXT[B + e] = FIRST[NODEb[e]];
+      FIRST[NODEb[e]] = B + e;
+      NEXT[C + e] = FIRST[NODEc[e]];
+      FIRST[NODEc[e]] = C + e;
+
+      /* mark edge e as belonging to the hypergraph */
+      mk[e] = MEMBER;
+    }
+
+
+  S.sp = 0;			/* empty the stack */
+  mk[0] = ERASED;		/* a sentinel for the test below */
+  for (v = 1; v <= n; v++)
+    {
+      if (mk[e = norm (unique (v))] == MEMBER)
+	ph_remove (e, v);
+    }
+
+  /* check if any edges were left in the graph */
+  return S.sp == m;
+}				/*acyclic */
+
+
+
+
+
+
+
+
+/* repeatedly maps words into edges of a 3-graph until the edges */
+/* are independent.                                              */
+static int 
+tree_builder (int num, u_char ** keys, int *n)
+{
+
+  int e, k = 0;
+  int i, j;
+  u_char *w;
+
+  do
+    {
+      /* Added variable - need to increase MAX_N on allocate as well */
+      *n = (int) (num * c + MAX_N_HEADROOM); /* john mcpherson 22-02-2001 */
+
+      /* initialize tables of random integers */
+      for (i = 0; i < MAX_CH; i++)
+	for (j = 0; j < MAX_L; j++)
+	  {
+#ifndef STRUCT
+	    tb0[i][j] = RANDOM () % *n;
+	    tb1[i][j] = RANDOM () % *n;
+	    tb2[i][j] = RANDOM () % *n;
+#else
+	    struct tb_entry *tbp = &tb[i][j];
+	    tbp->tb0 = RANDOM () % *n;
+	    tbp->tb1 = RANDOM () % *n;
+	    tbp->tb2 = RANDOM () % *n;
+#endif
+	  }
+
+      /* compute an edge (NODEa[e], NODEb[e], NODEc[e]) for each word */
+      for (e = 1; e <= num; e++)
+	{
+	  /*generate an edge corresponding to the ith word */
+	  int x = 0, y = 0, z = 0, l;
+	  w = keys[e - 1];
+
+	  l = *w++;
+	  j = (l - 1) % MAX_L;
+
+	  do
+	    {
+#ifndef STRUCT
+	      x += tb0[translate[*w]][j];
+	      y += tb1[translate[*w]][j];
+	      z += tb2[translate[*w]][j];
+#else
+	      struct tb_entry *tbp = &tb[translate[*w]][j];
+	      x += tbp->tb0;
+	      y += tbp->tb1;
+	      z += tbp->tb2;
+#endif
+	      if (++j >= MAX_L)
+		j = 0;
+	      w++;
+	    }
+	  while (--l);
+	  x = (x % *n) + 1;
+	  y = (y % *n) + 1;
+	  z = (z % *n) + 1;
+	  if (y == x && ++y > *n)
+	    y = 1;
+	  if (z == x && ++z > *n)
+	    z = 1;
+	  if (z == y)
+	    {
+	      if (++z > *n)
+		z = 1;
+	      if (z == x && ++z > *n)
+		z = 1;
+	    }
+
+	  NODEa[e] = x;
+	  NODEb[e] = y;
+	  NODEc[e] = z;
+	}
+      if (++k > 50)		/* make sure we will not wait for ever */
+	FatalError (1, "Unable to generate the perfect hash function. "
+		    "This is probably because there aren't enough words");
+    }
+  while (!acyclic (num, *n));
+  return k;
+}				/*tree_builder */
+
+
+
+
+
+
+
+
+
+/* calculates values of the g function/array so that i-th word is */
+/* placed at the (i-1)st position of a hash table.                */
+static void 
+assign (int n)
+{
+
+  int v, w = 0, e;
+
+  /* mark all the vertices of the 3-graph as unassigned */
+  for (v = 1; v <= n; mk[v++] = FALSE);
+
+  while (S.sp > 0)
+    {
+      int xor = 0;
+      pop (S, e);
+      v = NODEa[e];
+      if (mk[v])
+	xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      v = NODEb[e];
+      if (mk[v])
+	xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      v = NODEc[e];
+      if (mk[v])
+	xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      g[w] = (e - 1) ^ xor;
+    }
+}				/*assign */
+
+
+
+
+
+
+
+
+
+/*check returns 0 if no error in mphf is detected, else returns error code */
+static int 
+check (int m)
+{
+
+  int e, err_code = 0;
+
+  /*for each word compute its place in hash table and check if correct */
+  for (e = 1; e <= m; e++)
+    {
+      if ((e - 1) != (g[NODEa[e]] ^ g[NODEb[e]] ^ g[NODEc[e]]))
+	{
+	  (void) fprintf (stderr, "Error for %dth word detected.\n", e);
+	  err_code = e;
+	}
+    }
+  return err_code;
+}				/*check */
+
+
+
+
+
+
+
+#if 0
+void 
+outputh (int m, int n)
+{
+
+  int i, j, w = (int) ceil (log10 ((double) n + 1.0)) + 1;
+
+#if 0
+  char *PRG =
+  "int h(char *s)\n"
+  "{\n"
+  "  int u, v, w, i;\n"
+  "i = (strlen(s) - 1) % _HXL;\n"
+  "  u = v = w = 0;\n"
+  "  while(*s)\n"
+  "    {\n"
+  "      u += mt1[(*s) - _HFC][i];\n"
+  "      v += mt2[(*s) - _HFC][i];\n"
+  "      w += mt3[(*s++) - _HFC][i];\n"
+  "      if(++i >= _HXL) i = 0;\n"
+  "    }\n"
+  "  u %= _HFN; v %= _HFN; w %= _HFN;\n"
+  "  if(u == v && ++v >= _HFN) v = 0;\n"
+  "  if(w == u && ++w >= _HFN) w = 0;\n"
+  "  if(w == v && ++w >= _HFN) w = 0;\n"
+  "  if(w == u && ++w >= _HFN) w = 0;\n"
+  "  return (g[u] ^ g[v] ^ g[w]) % _HFM;\n"
+  "};\n\n";
+#endif
+
+  char *PRG =
+  "int h(char *s)\n"
+  "{\n"
+  "  int u, v, w, i;\n"
+  "  i = (strlen(s) - 1) % _HXL;\n"
+  "  u = v = w = 0;\n"
+  "  while(*s)\n"
+  "    {\n"
+  "      if((u += mt1[(*s) - _HFC][i]) >= _HFN) u -= _HFN;\n"
+  "      if((v += mt2[(*s) - _HFC][i]) >= _HFN) v -= _HFN;\n"
+  "      if((w += mt3[(*s++) - _HFC][i]) >= _HFN) w -= _HFN;\n"
+  "      if(++i >= _HXL) i = 0;\n"
+  "    }\n"
+  "  if(u == v && ++v >= _HFN) v = 0;\n"
+  "  if(w == v) \n"
+  "    {\n"
+  "      if(++w >= _HFN) w = 0;\n"
+  "      if(w == u && ++w >= _HFN) w = 0;\n"
+  "    }\n"
+  "  else\n"
+  "    if(w == u)\n"
+  "      {\n"
+  "	     if(++w >= _HFN) w = 0;\n"
+  "	     if(w == v && ++w >= _HFN) w = 0;\n"
+  "      }\n"
+  "  return ((g[u] ^ g[v] ^ g[w]) > _HFM)? 0 : (g[u] ^ g[v] ^ g[w]);\n"
+  "}\n\n";
+
+  printf ("#define _HFN %d\n#define _HFC %d\n", n, fc);
+  printf ("#define _HFM %d\n#define _HXL %d\n", m, MAX_L);
+  printf ("#define _HFA %d\n\nstatic int g[_HFN] = {\n", lc - fc + 1);
+  for (i = 1; i < n; i++)
+    {
+      if (i % 8 == 0)
+	putchar ('\n');
+      printf ("%5d, ", g[i]);
+    }
+  printf ("%5d};\n\n", g[n]);
+
+  printf ("static int mt1[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb0[j][i]);
+      printf ("%*d},\n", w, tb0[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb0[lc][i]);
+  printf ("%*d}\n", w, tb0[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("static int mt2[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb1[j][i]);
+      printf ("%*d},\n", w, tb1[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb1[lc][i]);
+  printf ("%*d}\n", w, tb1[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("static int mt3[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb2[j][i]);
+      printf ("%*d},\n", w, tb2[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb2[lc][i]);
+  printf ("%*d}\n", w, tb2[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("%s", PRG);
+}				/*outputh */
+#endif
+
+
+
+
+
+
+
+static void 
+make_trans_func (int num, u_char ** keys)
+{
+  int i, j;
+
+  bzero ((char *) translate, sizeof (translate));
+
+  MAX_L = 1;
+  for (i = 0; i < num; i++)
+    {
+      unsigned len = keys[i][0];
+      u_char *s = keys[i] + 1;
+      for (; len; len--, s++)
+	translate[*s] = 1;
+      if (i)
+	{
+	  int l;
+	  l = prefixlen (keys[i - 1], keys[i]);
+	  if (l + 1 > MAX_L)
+	    MAX_L = l + 1;
+	}
+    }
+  j = 0;
+  for (i = 0; i < 256; i++)
+    if (translate[i])
+      translate[i] = j++;
+  MAX_CH = j;
+}
+
+
+static void 
+temp_free (void)
+{
+  if (NODEa)
+    Xfree (NODEa);
+  if (NODEb)
+    Xfree (NODEb);
+  if (NODEc)
+    Xfree (NODEc);
+  if (FIRST)
+    Xfree (FIRST);
+  if (NEXT)
+    Xfree (NEXT);
+  if (S.st)
+    Xfree (S.st);
+  if (mk)
+    Xfree (mk);
+}
+
+static void 
+all_free (void)
+{
+  int i;
+  temp_free ();
+  if (translate)
+    Xfree (translate);
+  if (g)
+    Xfree (g);
+#ifndef STRUCT
+  for (i = 0; i < MAX_CH; i++)
+    {
+      if (tb0 && tb0[i])
+	Xfree (tb0[i]);
+      if (tb1 && tb1[i])
+	Xfree (tb1[i]);
+      if (tb2 && tb2[i])
+	Xfree (tb2[i]);
+    }
+  if (tb0)
+    Xfree (tb0);
+  if (tb1)
+    Xfree (tb1);
+  if (tb2)
+    Xfree (tb2);
+#else
+  for (i = 0; i < MAX_CH; i++)
+    if (tb && tb[i])
+      Xfree (tb[i]);
+  if (tb)
+    Xfree (tb);
+#endif
+}
+
+static int 
+allocate_memory (void)
+{
+  int i, ok = 1;
+  NODEa = Xmalloc (sizeof (int) * (MAX_M + 1));
+  NODEb = Xmalloc (sizeof (int) * (MAX_M + 1));
+  NODEc = Xmalloc (sizeof (int) * (MAX_M + 1));
+  FIRST = Xmalloc (sizeof (int) * (MAX_N + 1));
+  NEXT = Xmalloc (sizeof (int) * (MAX_M + 1) * 3);
+  S.st = Xmalloc (sizeof (int) * MAX_M);
+  mk = Xmalloc (sizeof (char) * (MAX_N + 1));
+  g = Xmalloc (sizeof (int) * (MAX_N + 1));
+#ifndef STRUCT
+  tb0 = Xmalloc (sizeof (int *) * MAX_CH);
+  tb1 = Xmalloc (sizeof (int *) * MAX_CH);
+  tb2 = Xmalloc (sizeof (int *) * MAX_CH);
+  for (i = 0; i < MAX_CH; i++)
+    {
+      if (tb0)
+	if (!(tb0[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+      if (tb1)
+	if (!(tb1[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+      if (tb2)
+	if (!(tb2[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+    }
+
+  if (!(NODEa && NODEb && NODEc && FIRST && NEXT && S.st && mk && g &&
+	tb0 && tb1 && tb2 && ok))
+    {
+      all_free ();
+      return (-1);
+    }
+#else
+  tb = Xmalloc (sizeof (struct tb_entry *) * MAX_CH);
+  for (i = 0; i < MAX_CH; i++)
+    if (tb)
+      if (!(tb[i] = Xmalloc (sizeof (struct tb_entry) * MAX_L)))
+	  ok = 0;
+
+  if (!(NODEa && NODEb && NODEc && FIRST && NEXT && S.st && mk && g &&
+	tb && ok))
+    {
+      all_free ();
+      return (-1);
+    }
+#endif
+  return (0);
+}
+
+
+perf_hash_data *
+gen_hash_func (int num, u_char ** keys, int r)
+{
+  int n;
+  perf_hash_data *phd;
+  translate = Xmalloc (sizeof (u_char) * 256);
+  bzero ((char *) translate, sizeof (u_char) * 256);  /* [RPAP - Feb 97: WIN32 Port] */
+  make_trans_func (num, keys);
+
+  if (r <= 0)
+    SEED_RANDOM ((long) time ((time_t *) NULL));
+  else
+    SEED_RANDOM (r);
+
+  MAX_M = num + 1;
+
+  /* For extremely small lexicons (<4 words), this isn't good enough! 
+   -- John McPherson jrm21 22-02-2001 */
+  /* MAX_N = MAX_M + MAX_M / 4; */
+  MAX_N = (int)(ceil (1.25 * MAX_M)); 
+  /* Add some space for "experimentation" of n in tree_builder() */
+  MAX_N += MAX_N_HEADROOM;
+
+  if (allocate_memory () == -1)
+    return (NULL);
+
+  /* construct an "acyclic" hypergraph */
+  tree_builder (num, keys, &n);
+  /* compute function g */
+  assign (n);
+
+  if (check (num) != 0)
+    FatalError (1, "An error has been detected in the mphf.");
+  temp_free ();
+
+  if (!(phd = Xmalloc (sizeof (perf_hash_data))))
+    return (NULL);
+
+  bcopy ((char *) &g[1], (char *) g, n * sizeof (int));
+
+  phd->MAX_L = MAX_L;
+  phd->MAX_N = n;
+  phd->MAX_M = num;
+  phd->MAX_CH = MAX_CH;
+  phd->translate = translate;
+  phd->g = g;
+#ifndef STRUCT
+  phd->tb0 = tb0;
+  phd->tb1 = tb1;
+  phd->tb2 = tb2;
+#else
+  phd->tb = tb;
+#endif
+  return (phd);
+}
+
+int 
+write_perf_hash_data (FILE * f, perf_hash_data * phd)
+{
+  int tot, i;
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONSI(phd->MAX_L);
+  HTONSI(phd->MAX_N);
+  HTONSI(phd->MAX_M);
+  HTONSI(phd->MAX_CH);
+
+  tot = fwrite ((char *) &phd->MAX_L, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_N, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_M, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_CH, sizeof (int), 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(phd->MAX_L);
+  NTOHSI(phd->MAX_N);
+  NTOHSI(phd->MAX_M);
+  NTOHSI(phd->MAX_CH);
+
+  tot += fwrite ((char *) phd->translate, sizeof (u_char), 256, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    HTONSI(phd->g[i]);
+
+  tot += fwrite ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+#ifndef STRUCT
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int j;
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  HTONSI(phd->tb0[i][j]);
+	  HTONSI(phd->tb1[i][j]);
+	  HTONSI(phd->tb2[i][j]);
+	}
+
+      tot += fwrite ((char *) phd->tb0[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fwrite ((char *) phd->tb1[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fwrite ((char *) phd->tb2[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSI(phd->tb0[i][j]);
+	  NTOHSI(phd->tb1[i][j]);
+	  NTOHSI(phd->tb2[i][j]);
+	}
+    }
+#else
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int j;
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  HTONSL(phd->tb[i][j].tb0);
+	  HTONSL(phd->tb[i][j].tb1);
+	  HTONSL(phd->tb[i][j].tb2);
+	}
+
+      tot += fwrite ((char *) phd->tb[i], sizeof (struct tb_entry), phd->MAX_L, f) *
+	sizeof (struct tb_entry);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSL(phd->tb[i][j].tb0);
+	  NTOHSL(phd->tb[i][j].tb1);
+	  NTOHSL(phd->tb[i][j].tb2);
+	}
+    }
+#endif
+  return (tot);
+}
+
+
+perf_hash_data *
+read_perf_hash_data (FILE * f)
+{
+  perf_hash_data *phd;
+  int i, tot, ok = 1;
+  if (!(phd = Xmalloc (sizeof (perf_hash_data))))
+    return (NULL);
+  tot = fread ((char *) &phd->MAX_L, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_N, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_M, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_CH, sizeof (int), 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(phd->MAX_L);
+  NTOHSI(phd->MAX_N);
+  NTOHSI(phd->MAX_M);
+  NTOHSI(phd->MAX_CH);
+
+  if (tot != 4 * sizeof (int))
+      return (NULL);
+  phd->translate = Xmalloc (sizeof (u_char) * 256);
+  phd->g = Xmalloc (sizeof (int) * (phd->MAX_N + 1));
+#ifndef STRUCT
+  phd->tb0 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  phd->tb1 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  phd->tb2 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      if (phd->tb0)
+	if (!(phd->tb0[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+      if (phd->tb1)
+	if (!(phd->tb1[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+      if (phd->tb2)
+	if (!(phd->tb2[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+    }
+  if (!(phd->translate && phd->g && phd->tb0 && phd->tb1 && phd->tb2 && ok))
+    {
+      if (phd->translate)
+	Xfree (phd->translate);
+      if (phd->g)
+	Xfree (phd->g);
+      for (i = 0; i < MAX_CH; i++)
+	{
+	  if (phd->tb0 && phd->tb0[i])
+	    Xfree (phd->tb0[i]);
+	  if (phd->tb1 && phd->tb1[i])
+	    Xfree (phd->tb1[i]);
+	  if (phd->tb2 && phd->tb2[i])
+	    Xfree (phd->tb2[i]);
+	}
+      if (phd->tb0)
+	Xfree (phd->tb0);
+      if (phd->tb1)
+	Xfree (phd->tb1);
+      if (phd->tb2)
+	Xfree (phd->tb2);
+      Xfree (phd);
+      return (NULL);
+    }
+  tot += fread ((char *) phd->translate, sizeof (u_char), 256, f);
+  tot += fread ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      int j;
+
+      tot += fread ((char *) phd->tb0[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fread ((char *) phd->tb1[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fread ((char *) phd->tb2[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSI(phd->tb0[i][j]);
+	  NTOHSI(phd->tb1[i][j]);
+	  NTOHSI(phd->tb2[i][j]);
+	}
+    }
+#else
+  phd->tb = Xmalloc (sizeof (struct tb_entry *) * phd->MAX_CH);
+  for (i = 0; i < phd->MAX_CH; i++)
+    if (phd->tb)
+      if (!(phd->tb[i] = Xmalloc (sizeof (struct tb_entry) * phd->MAX_L)))
+	  ok = 0;
+  if (!(phd->translate && phd->g && phd->tb && ok))
+    {
+      if (phd->translate)
+	Xfree (phd->translate);
+      if (phd->g)
+	Xfree (phd->g);
+      for (i = 0; i < MAX_CH; i++)
+	if (phd->tb && phd->tb[i])
+	  Xfree (phd->tb[i]);
+      if (phd->tb)
+	Xfree (phd->tb);
+      Xfree (phd);
+      return (NULL);
+    }
+  tot += fread ((char *) phd->translate, sizeof (u_char), 256, f);
+  tot += fread ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      int j;
+
+      tot += fread ((char *) phd->tb[i], sizeof (struct tb_entry), phd->MAX_L, f) *
+	sizeof (struct tb_entry);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSL(phd->tb[i][j].tb0);
+	  NTOHSL(phd->tb[i][j].tb1);
+	  NTOHSL(phd->tb[i][j].tb2);
+	}
+    }
+#endif
+  return (phd);
+}
+
+void 
+free_perf_hash (perf_hash_data * phd)
+{
+  int i;
+  if (phd->translate)
+    Xfree (phd->translate);
+  if (phd->g)
+    Xfree (phd->g);
+  for (i = 0; i < phd->MAX_CH; i++)
+    if (phd->tb && phd->tb[i])
+      Xfree (phd->tb[i]);
+  if (phd->tb)
+    Xfree (phd->tb);
+  Xfree (phd);
+}
+
+
+int 
+perf_hash (perf_hash_data * phd, u_char * s)
+{
+  int u, v, w, i, l;
+  l = *s++;
+  i = (l - 1) % phd->MAX_L;
+  u = v = w = 0;
+  while (l)
+    {
+#ifndef STRUCT
+      if ((u += phd->tb0[phd->translate[*s]][i]) >= phd->MAX_N)
+	u -= phd->MAX_N;
+      if ((v += phd->tb1[phd->translate[*s]][i]) >= phd->MAX_N)
+	v -= phd->MAX_N;
+      if ((w += phd->tb2[phd->translate[*s]][i]) >= phd->MAX_N)
+	w -= phd->MAX_N;
+#else
+      struct tb_entry *tbp = &phd->tb[phd->translate[*s]][i];
+      if ((u += tbp->tb0) >= phd->MAX_N)
+	u -= phd->MAX_N;
+      if ((v += tbp->tb1) >= phd->MAX_N)
+	v -= phd->MAX_N;
+      if ((w += tbp->tb2) >= phd->MAX_N)
+	w -= phd->MAX_N;
+#endif
+      if (++i >= phd->MAX_L)
+	i = 0;
+      l--;
+      s++;
+    }
+  if (u == v && ++v >= phd->MAX_N)
+    v = 0;
+  if (w == v)
+    {
+      if (++w >= phd->MAX_N)
+	w = 0;
+      if (w == u && ++w >= phd->MAX_N)
+	w = 0;
+    }
+  else if (w == u)
+    {
+      if (++w >= phd->MAX_N)
+	w = 0;
+      if (w == v && ++w >= phd->MAX_N)
+	w = 0;
+    }
+  return ((phd->g[u] ^ phd->g[v] ^ phd->g[w]) > phd->MAX_M) ? 0 :
+    (phd->g[u] ^ phd->g[v] ^ phd->g[w]);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/perf_hash.h	(revision 21083)
@@ -0,0 +1,57 @@
+/**************************************************************************
+ *
+ * perf_hash.h -- Perfect hashing functions
+ * Copyright (C) 1994  Bohdan S. Majewski and Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_PERF_HASH
+#define H_PERF_HASH
+
+
+
+
+struct tb_entry
+  {
+    long tb0, tb1, tb2;
+  };
+
+typedef struct
+  {
+    int MAX_L;
+    int MAX_N;
+    int MAX_M;
+    int MAX_CH;
+    u_char *translate;
+    int *g;
+    struct tb_entry **tb;
+  }
+perf_hash_data;
+
+perf_hash_data *gen_hash_func (int num, u_char ** keys, int r);
+
+int perf_hash (perf_hash_data * phd, u_char * s);
+
+int write_perf_hash_data (FILE * f, perf_hash_data * phd);
+
+void free_perf_hash (perf_hash_data * phd);
+
+perf_hash_data *read_perf_hash_data (FILE * f);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/random.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/random.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/random.c	(revision 21083)
@@ -0,0 +1,225 @@
+/**************************************************************************
+ *
+ * random.c -- pseudo random number generator
+ * Copyright (C) 1994  Chris Wallace (csw@bruce.cs.monash.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1  1999/08/10 21:16:57  sjboddie
+renamed mg-1.3d directory mg
+
+Revision 1.1  1998/11/17 09:32:20  rjmcnab
+*** empty log message ***
+
+*/
+
+static char *RCSID = "$Id$";
+
+/*
+ *	A random number generator called as a function by
+ *	random (iseed)	or	irandm (iseed)
+ *	The parameter should be a pointer to a 2-element long vector.
+ *	The first function returns a double uniform in 0 .. 1.
+ *	The second returns a long integer uniform in 0 .. 2**31-1
+ *	Both update iseed[] in exactly the same way.
+ *	iseed[] must be a 2-element integer vector.
+ *	The initial value of the second element may be anything.
+ *
+ *	The period of the random sequence is 2**32 * (2**32-1)
+ *	The table mt[0:127] is defined by mt[i] = 69069 ** (128-i)
+ */
+
+#define MASK ((long) 593970775)
+/*	or in hex, 23674657	*/
+
+#define SCALE ((double) 1.0 / (1024.0 * 1024.0 * 1024.0 * 2.0))
+/*	i.e. 2 to power -31	*/
+
+static long mt [128] =   {
+      902906369,
+     2030498053,
+     -473499623,
+     1640834941,
+      723406961,
+     1993558325,
+     -257162999,
+    -1627724755,
+      913952737,
+      278845029,
+     1327502073,
+    -1261253155,
+      981676113,
+    -1785280363,
+     1700077033,
+      366908557,
+    -1514479167,
+     -682799163,
+      141955545,
+     -830150595,
+      317871153,
+     1542036469,
+     -946413879,
+    -1950779155,
+      985397153,
+      626515237,
+      530871481,
+      783087261,
+    -1512358895,
+     1031357269,
+    -2007710807,
+    -1652747955,
+    -1867214463,
+      928251525,
+     1243003801,
+    -2132510467,
+     1874683889,
+     -717013323,
+      218254473,
+    -1628774995,
+    -2064896159,
+       69678053,
+      281568889,
+    -2104168611,
+     -165128239,
+     1536495125,
+      -39650967,
+      546594317,
+     -725987007,
+     1392966981,
+     1044706649,
+      687331773,
+    -2051306575,
+     1544302965,
+     -758494647,
+    -1243934099,
+      -75073759,
+      293132965,
+    -1935153095,
+      118929437,
+      807830417,
+    -1416222507,
+    -1550074071,
+      -84903219,
+     1355292929,
+     -380482555,
+    -1818444007,
+     -204797315,
+      170442609,
+    -1636797387,
+      868931593,
+     -623503571,
+     1711722209,
+      381210981,
+     -161547783,
+     -272740131,
+    -1450066095,
+     2116588437,
+     1100682473,
+      358442893,
+    -1529216831,
+     2116152005,
+     -776333095,
+     1265240893,
+     -482278607,
+     1067190005,
+      333444553,
+       86502381,
+      753481377,
+       39000101,
+     1779014585,
+      219658653,
+     -920253679,
+     2029538901,
+     1207761577,
+    -1515772851,
+     -236195711,
+      442620293,
+      423166617,
+    -1763648515,
+     -398436623,
+    -1749358155,
+     -538598519,
+     -652439379,
+      430550625,
+    -1481396507,
+     2093206905,
+    -1934691747,
+     -962631983,
+     1454463253,
+    -1877118871,
+     -291917555,
+    -1711673279,
+      201201733,
+     -474645415,
+      -96764739,
+    -1587365199,
+     1945705589,
+     1303896393,
+     1744831853,
+      381957665,
+     2135332261,
+      -55996615,
+    -1190135011,
+     1790562961,
+    -1493191723,
+      475559465,
+          69069
+		};
+
+double 
+random (long is [2])
+{
+	long it, leh, nit;
+
+	it = is [0];
+	leh = is [1];
+	if (it <= 0)	
+		it = (it + it) ^ MASK;
+	else
+		it = it + it;
+	nit = it - 1;
+/*	to ensure all-ones pattern omitted    */
+	leh = leh * mt[nit & 127] + nit;
+	is [0] = it;    is [1] = leh;
+	if (leh < 0) leh = ~leh;
+	return (SCALE * ((long) (leh | 1)));
+}
+
+
+
+long 
+irandm (long is [2])
+{
+	long it, leh, nit;
+
+	it = is [0];
+	leh = is [1];
+	if (it <= 0)	
+		it = (it + it) ^ MASK;
+	else
+		it = it + it;
+	nit = it - 1;
+/*	to ensure all-ones pattern omitted    */
+	leh = leh * mt[nit & 127] + nit;
+	is [0] = it;    is [1] = leh;
+	if (leh < 0) leh = ~leh;
+	return (leh);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/random.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/random.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/random.h	(revision 21083)
@@ -0,0 +1,54 @@
+/**************************************************************************
+ *
+ * random.h -- pseudo random number generator
+ * Copyright (C) 1994  Chris Wallace (csw@bruce.cs.monash.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1  1999/08/10 21:16:58  sjboddie
+renamed mg-1.3d directory mg
+
+Revision 1.1  1998/11/17 09:32:21  rjmcnab
+*** empty log message ***
+
+*/
+
+#ifndef RANDOM_H
+#define RANDOM_H
+
+/*
+ *	A random number generator called as a function by
+ *	random (iseed)	or	irandm (iseed)
+ *	The parameter should be a pointer to a 2-element long vector.
+ *	The first function returns a double uniform in 0 .. 1.
+ *	The second returns a long integer uniform in 0 .. 2**31-1
+ *	Both update iseed[] in exactly the same way.
+ *	iseed[] must be a 2-element integer vector.
+ *	The initial value of the second element may be anything.
+ *
+ *	The period of the random sequence is 2**32 * (2**32-1)
+ *	The table mt[0:127] is defined by mt[i] = 69069 ** (128-i)
+ */
+
+double random (long is [2]);
+long irandm (long is [2]);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/regex.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/regex.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/regex.c	(revision 21083)
@@ -0,0 +1,5426 @@
+/* Extended regular expression matching and search library,
+   version 0.12.
+   (Implements POSIX draft P10003.2/D11.2, except for
+   internationalization features.)
+
+   Copyright (C) 1993, 1994, 1995 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* AIX requires this to be the first thing in the file. */
+#if defined (_AIX) && !defined (REGEX_MALLOC)
+  #pragma alloca
+#endif
+
+#define _GNU_SOURCE
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+/* We need this for `regex.h', and perhaps for the Emacs include files.  */
+#include <sys/types.h>
+
+/* This is for other GNU distributions with internationalized messages.  */
+#if HAVE_LIBINTL_H || defined (_LIBC)
+# include <libintl.h>
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+/* The `emacs' switch turns on certain matching commands
+   that make sense only in Emacs. */
+#ifdef emacs
+
+#include "lisp.h"
+#include "buffer.h"
+#include "syntax.h"
+
+#else  /* not emacs */
+
+/* If we are not linking with Emacs proper,
+   we can't use the relocating allocator
+   even if sysfuncs.h says that we can.  */
+#undef REL_ALLOC
+
+#if defined (STDC_HEADERS) || defined (_LIBC)
+#include <stdlib.h>
+#else
+char *malloc ();
+char *realloc ();
+#endif
+
+/* We used to test for `BSTRING' here, but only GCC and Emacs define
+   `BSTRING', as far as I know, and neither of them use this code.  */
+#ifndef INHIBIT_STRING_HEADER
+#if HAVE_STRING_H || STDC_HEADERS || defined (_LIBC)
+#include <string.h>
+#ifndef bcmp
+#define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
+#endif
+#ifndef bcopy
+#define bcopy(s, d, n)	memcpy ((d), (s), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n)	memset ((s), 0, (n))
+#endif
+#else
+#include <strings.h>
+#endif
+#endif
+
+/* Define the syntax stuff for \<, \>, etc.  */
+
+/* This must be nonzero for the wordchar and notwordchar pattern
+   commands in re_match_2.  */
+#ifndef Sword 
+#define Sword 1
+#endif
+
+#ifdef SWITCH_ENUM_BUG
+#define SWITCH_ENUM_CAST(x) ((int)(x))
+#else
+#define SWITCH_ENUM_CAST(x) (x)
+#endif
+
+#ifdef SYNTAX_TABLE
+
+extern char *re_syntax_table;
+
+#else /* not SYNTAX_TABLE */
+
+/* How many characters in the character set.  */
+#define CHAR_SET_SIZE 256
+
+static char re_syntax_table[CHAR_SET_SIZE];
+
+static void
+init_syntax_once ()
+{
+   register int c;
+   static int done = 0;
+
+   if (done)
+     return;
+
+   bzero (re_syntax_table, sizeof re_syntax_table);
+
+   for (c = 'a'; c <= 'z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = 'A'; c <= 'Z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = '0'; c <= '9'; c++)
+     re_syntax_table[c] = Sword;
+
+   re_syntax_table['_'] = Sword;
+
+   done = 1;
+}
+
+#endif /* not SYNTAX_TABLE */
+
+#define SYNTAX(c) re_syntax_table[c]
+
+#endif /* not emacs */
+
+
+/* Get the interface, including the syntax bits.  */
+#include "regex.h"
+
+/* isalpha etc. are used for the character classes.  */
+#include <ctype.h>
+
+/* Jim Meyering writes:
+
+   "... Some ctype macros are valid only for character codes that
+   isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
+   using /bin/cc or gcc but without giving an ansi option).  So, all
+   ctype uses should be through macros like ISPRINT...  If
+   STDC_HEADERS is defined, then autoconf has verified that the ctype
+   macros don't need to be guarded with references to isascii. ...
+   Defining isascii to 1 should let any compiler worth its salt
+   eliminate the && through constant folding."  */
+
+#ifndef ISASCII
+#  if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
+#    define ISASCII(c) 1
+#  else
+#    define ISASCII(c) isascii(c)
+#  endif
+#endif
+
+#ifdef isblank
+#define ISBLANK(c) (ISASCII (c) && isblank (c))
+#else
+#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+#define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+#else
+#define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+#endif
+
+#define ISPRINT(c) (ISASCII (c) && isprint (c))
+#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+#define ISALNUM(c) (ISASCII (c) && isalnum (c))
+#define ISALPHA(c) (ISASCII (c) && isalpha (c))
+#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+#define ISLOWER(c) (ISASCII (c) && islower (c))
+#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+#define ISSPACE(c) (ISASCII (c) && isspace (c))
+#define ISUPPER(c) (ISASCII (c) && isupper (c))
+#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* We remove any previous definition of `SIGN_EXTEND_CHAR',
+   since ours (we hope) works properly with all combinations of
+   machines, compilers, `char' and `unsigned char' argument types.
+   (Per Bothner suggested the basic approach.)  */
+#undef SIGN_EXTEND_CHAR
+#if __STDC__
+#define SIGN_EXTEND_CHAR(c) ((signed char) (c))
+#else  /* not __STDC__ */
+/* As in Harbison and Steele.  */
+#define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
+#endif
+
+
+/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+   use `alloca' instead of `malloc'.  This is because using malloc in
+   re_search* or re_match* could cause memory leaks when C-g is used in
+   Emacs; also, malloc is slower and causes storage fragmentation.  On
+   the other hand, malloc is more portable, and easier to debug.  
+   
+   Because we sometimes use alloca, some routines have to be macros,
+   not functions -- `alloca'-allocated space disappears at the end of the
+   function it is called in.  */
+
+#ifdef REGEX_MALLOC
+
+#define REGEX_ALLOCATE malloc
+#define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
+#define REGEX_FREE free
+
+#else /* not REGEX_MALLOC  */
+
+/* Emacs already defines alloca, sometimes.  */
+#ifndef alloca
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else /* not __GNUC__ or HAVE_ALLOCA_H */
+#ifndef _AIX /* Already did AIX, up at the top.  */
+char *alloca ();
+#endif /* not _AIX */
+#endif /* not HAVE_ALLOCA_H */ 
+#endif /* not __GNUC__ */
+
+#endif /* not alloca */
+
+#define REGEX_ALLOCATE alloca
+
+/* Assumes a `char *destination' variable.  */
+#define REGEX_REALLOCATE(source, osize, nsize)				\
+  (destination = (char *) alloca (nsize),				\
+   bcopy (source, destination, osize),					\
+   destination)
+
+/* No need to do anything to free, after alloca.  */
+#define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
+
+#endif /* not REGEX_MALLOC */
+
+/* Define how to allocate the failure stack.  */
+
+#ifdef REL_ALLOC
+#define REGEX_ALLOCATE_STACK(size)				\
+  r_alloc (&failure_stack_ptr, (size))
+#define REGEX_REALLOCATE_STACK(source, osize, nsize)		\
+  r_re_alloc (&failure_stack_ptr, (nsize))
+#define REGEX_FREE_STACK(ptr)					\
+  r_alloc_free (&failure_stack_ptr)
+
+#else /* not REL_ALLOC */
+
+#ifdef REGEX_MALLOC
+
+#define REGEX_ALLOCATE_STACK malloc
+#define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
+#define REGEX_FREE_STACK free
+
+#else /* not REGEX_MALLOC */
+
+#define REGEX_ALLOCATE_STACK alloca
+
+#define REGEX_REALLOCATE_STACK(source, osize, nsize)			\
+   REGEX_REALLOCATE (source, osize, nsize)
+/* No need to explicitly free anything.  */
+#define REGEX_FREE_STACK(arg)
+
+#endif /* not REGEX_MALLOC */
+#endif /* not REL_ALLOC */
+
+
+/* True if `size1' is non-NULL and PTR is pointing anywhere inside
+   `string1' or just past its end.  This works if PTR is NULL, which is
+   a good thing.  */
+#define FIRST_STRING_P(ptr) 					\
+  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
+
+/* (Re)Allocate N items of type T using malloc, or fail.  */
+#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
+#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
+#define RETALLOC_IF(addr, n, t) \
+  if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
+#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
+
+#define BYTEWIDTH 8 /* In bits.  */
+
+#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+#undef MAX
+#undef MIN
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+typedef char boolean;
+#define false 0
+#define true 1
+
+static int re_match_2_internal ();
+
+
+/* These are the command codes that appear in compiled regular
+   expressions.  Some opcodes are followed by argument bytes.  A
+   command code can specify any interpretation whatsoever for its
+   arguments.  Zero bytes may appear in the compiled regular expression.  */
+
+typedef enum
+{
+  no_op = 0,
+
+  /* Succeed right away--no more backtracking.  */
+  succeed,
+
+        /* Followed by one byte giving n, then by n literal bytes.  */
+  exactn,
+
+        /* Matches any (more or less) character.  */
+  anychar,
+
+        /* Matches any one char belonging to specified set.  First
+           following byte is number of bitmap bytes.  Then come bytes
+           for a bitmap saying which chars are in.  Bits in each byte
+           are ordered low-bit-first.  A character is in the set if its
+           bit is 1.  A character too large to have a bit in the map is
+           automatically not in the set.  */
+  charset,
+
+        /* Same parameters as charset, but match any character that is
+           not one of those specified.  */
+  charset_not,
+
+        /* Start remembering the text that is matched, for storing in a
+           register.  Followed by one byte with the register number, in
+           the range 0 to one less than the pattern buffer's re_nsub
+           field.  Then followed by one byte with the number of groups
+           inner to this one.  (This last has to be part of the
+           start_memory only because we need it in the on_failure_jump
+           of re_match_2.)  */
+  start_memory,
+
+        /* Stop remembering the text that is matched and store it in a
+           memory register.  Followed by one byte with the register
+           number, in the range 0 to one less than `re_nsub' in the
+           pattern buffer, and one byte with the number of inner groups,
+           just like `start_memory'.  (We need the number of inner
+           groups here because we don't have any easy way of finding the
+           corresponding start_memory when we're at a stop_memory.)  */
+  stop_memory,
+
+        /* Match a duplicate of something remembered. Followed by one
+           byte containing the register number.  */
+  duplicate,
+
+        /* Fail unless at beginning of line.  */
+  begline,
+
+        /* Fail unless at end of line.  */
+  endline,
+
+        /* Succeeds if at beginning of buffer (if emacs) or at beginning
+           of string to be matched (if not).  */
+  begbuf,
+
+        /* Analogously, for end of buffer/string.  */
+  endbuf,
+ 
+        /* Followed by two byte relative address to which to jump.  */
+  jump, 
+
+	/* Same as jump, but marks the end of an alternative.  */
+  jump_past_alt,
+
+        /* Followed by two-byte relative address of place to resume at
+           in case of failure.  */
+  on_failure_jump,
+	
+        /* Like on_failure_jump, but pushes a placeholder instead of the
+           current string position when executed.  */
+  on_failure_keep_string_jump,
+  
+        /* Throw away latest failure point and then jump to following
+           two-byte relative address.  */
+  pop_failure_jump,
+
+        /* Change to pop_failure_jump if know won't have to backtrack to
+           match; otherwise change to jump.  This is used to jump
+           back to the beginning of a repeat.  If what follows this jump
+           clearly won't match what the repeat does, such that we can be
+           sure that there is no use backtracking out of repetitions
+           already matched, then we change it to a pop_failure_jump.
+           Followed by two-byte address.  */
+  maybe_pop_jump,
+
+        /* Jump to following two-byte address, and push a dummy failure
+           point. This failure point will be thrown away if an attempt
+           is made to use it for a failure.  A `+' construct makes this
+           before the first repeat.  Also used as an intermediary kind
+           of jump when compiling an alternative.  */
+  dummy_failure_jump,
+
+	/* Push a dummy failure point and continue.  Used at the end of
+	   alternatives.  */
+  push_dummy_failure,
+
+        /* Followed by two-byte relative address and two-byte number n.
+           After matching N times, jump to the address upon failure.  */
+  succeed_n,
+
+        /* Followed by two-byte relative address, and two-byte number n.
+           Jump to the address N times, then fail.  */
+  jump_n,
+
+        /* Set the following two-byte relative address to the
+           subsequent two-byte number.  The address *includes* the two
+           bytes of number.  */
+  set_number_at,
+
+  wordchar,	/* Matches any word-constituent character.  */
+  notwordchar,	/* Matches any char that is not a word-constituent.  */
+
+  wordbeg,	/* Succeeds if at word beginning.  */
+  wordend,	/* Succeeds if at word end.  */
+
+  wordbound,	/* Succeeds if at a word boundary.  */
+  notwordbound	/* Succeeds if not at a word boundary.  */
+
+#ifdef emacs
+  ,before_dot,	/* Succeeds if before point.  */
+  at_dot,	/* Succeeds if at point.  */
+  after_dot,	/* Succeeds if after point.  */
+
+	/* Matches any character whose syntax is specified.  Followed by
+           a byte which contains a syntax code, e.g., Sword.  */
+  syntaxspec,
+
+	/* Matches any character whose syntax is not that specified.  */
+  notsyntaxspec
+#endif /* emacs */
+} re_opcode_t;
+
+
+/* Common operations on the compiled pattern.  */
+
+/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
+
+#define STORE_NUMBER(destination, number)				\
+  do {									\
+    (destination)[0] = (number) & 0377;					\
+    (destination)[1] = (number) >> 8;					\
+  } while (0)
+
+/* Same as STORE_NUMBER, except increment DESTINATION to
+   the byte after where the number is stored.  Therefore, DESTINATION
+   must be an lvalue.  */
+
+#define STORE_NUMBER_AND_INCR(destination, number)			\
+  do {									\
+    STORE_NUMBER (destination, number);					\
+    (destination) += 2;							\
+  } while (0)
+
+/* Put into DESTINATION a number stored in two contiguous bytes starting
+   at SOURCE.  */
+
+#define EXTRACT_NUMBER(destination, source)				\
+  do {									\
+    (destination) = *(source) & 0377;					\
+    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;		\
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number (dest, source)
+    int *dest;
+    unsigned char *source;
+{
+  int temp = SIGN_EXTEND_CHAR (*(source + 1)); 
+  *dest = *source & 0377;
+  *dest += temp << 8;
+}
+
+#ifndef EXTRACT_MACROS /* To debug the macros.  */
+#undef EXTRACT_NUMBER
+#define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
+   SOURCE must be an lvalue.  */
+
+#define EXTRACT_NUMBER_AND_INCR(destination, source)			\
+  do {									\
+    EXTRACT_NUMBER (destination, source);				\
+    (source) += 2; 							\
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number_and_incr (destination, source)
+    int *destination;
+    unsigned char **source;
+{ 
+  extract_number (destination, *source);
+  *source += 2;
+}
+
+#ifndef EXTRACT_MACROS
+#undef EXTRACT_NUMBER_AND_INCR
+#define EXTRACT_NUMBER_AND_INCR(dest, src) \
+  extract_number_and_incr (&dest, &src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+
+/* If DEBUG is defined, Regex prints many voluminous messages about what
+   it is doing (if the variable `debug' is nonzero).  If linked with the
+   main program in `iregex.c', you can enter patterns and strings
+   interactively.  And if linked with the main program in `main.c' and
+   the other test files, you can run the already-written tests.  */
+
+#ifdef DEBUG
+
+/* We use standard I/O for debugging.  */
+#include <stdio.h>
+
+/* It is useful to test things that ``must'' be true when debugging.  */
+#include <assert.h>
+
+static int debug = 0;
+
+#define DEBUG_STATEMENT(e) e
+#define DEBUG_PRINT1(x) if (debug) printf (x)
+#define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 				\
+  if (debug) print_partial_compiled_pattern (s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)			\
+  if (debug) print_double_string (w, s1, sz1, s2, sz2)
+
+
+/* Print the fastmap in human-readable form.  */
+
+void
+print_fastmap (fastmap)
+    char *fastmap;
+{
+  unsigned was_a_range = 0;
+  unsigned i = 0;  
+  
+  while (i < (1 << BYTEWIDTH))
+    {
+      if (fastmap[i++])
+	{
+	  was_a_range = 0;
+          putchar (i - 1);
+          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
+            {
+              was_a_range = 1;
+              i++;
+            }
+	  if (was_a_range)
+            {
+              printf ("-");
+              putchar (i - 1);
+            }
+        }
+    }
+  putchar ('\n'); 
+}
+
+
+/* Print a compiled pattern string in human-readable form, starting at
+   the START pointer into it and ending just before the pointer END.  */
+
+void
+print_partial_compiled_pattern (start, end)
+    unsigned char *start;
+    unsigned char *end;
+{
+  int mcnt, mcnt2;
+  unsigned char *p = start;
+  unsigned char *pend = end;
+
+  if (start == NULL)
+    {
+      printf ("(null)\n");
+      return;
+    }
+    
+  /* Loop over pattern commands.  */
+  while (p < pend)
+    {
+      printf ("%d:\t", p - start);
+
+      switch ((re_opcode_t) *p++)
+	{
+        case no_op:
+          printf ("/no_op");
+          break;
+
+	case exactn:
+	  mcnt = *p++;
+          printf ("/exactn/%d", mcnt);
+          do
+	    {
+              putchar ('/');
+	      putchar (*p++);
+            }
+          while (--mcnt);
+          break;
+
+	case start_memory:
+          mcnt = *p++;
+          printf ("/start_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case stop_memory:
+          mcnt = *p++;
+	  printf ("/stop_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case duplicate:
+	  printf ("/duplicate/%d", *p++);
+	  break;
+
+	case anychar:
+	  printf ("/anychar");
+	  break;
+
+	case charset:
+        case charset_not:
+          {
+            register int c, last = -100;
+	    register int in_range = 0;
+
+	    printf ("/charset [%s",
+	            (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
+            
+            assert (p + *p < pend);
+
+            for (c = 0; c < 256; c++)
+	      if (c / 8 < *p
+		  && (p[1 + (c/8)] & (1 << (c % 8))))
+		{
+		  /* Are we starting a range?  */
+		  if (last + 1 == c && ! in_range)
+		    {
+		      putchar ('-');
+		      in_range = 1;
+		    }
+		  /* Have we broken a range?  */
+		  else if (last + 1 != c && in_range)
+              {
+		      putchar (last);
+		      in_range = 0;
+		    }
+                
+		  if (! in_range)
+		    putchar (c);
+
+		  last = c;
+              }
+
+	    if (in_range)
+	      putchar (last);
+
+	    putchar (']');
+
+	    p += 1 + *p;
+	  }
+	  break;
+
+	case begline:
+	  printf ("/begline");
+          break;
+
+	case endline:
+          printf ("/endline");
+          break;
+
+	case on_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/on_failure_jump to %d", p + mcnt - start);
+          break;
+
+	case on_failure_keep_string_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/on_failure_keep_string_jump to %d", p + mcnt - start);
+          break;
+
+	case dummy_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/dummy_failure_jump to %d", p + mcnt - start);
+          break;
+
+	case push_dummy_failure:
+          printf ("/push_dummy_failure");
+          break;
+          
+        case maybe_pop_jump:
+          extract_number_and_incr (&mcnt, &p);
+  	  printf ("/maybe_pop_jump to %d", p + mcnt - start);
+	  break;
+
+        case pop_failure_jump:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/pop_failure_jump to %d", p + mcnt - start);
+	  break;          
+          
+        case jump_past_alt:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/jump_past_alt to %d", p + mcnt - start);
+	  break;          
+          
+        case jump:
+	  extract_number_and_incr (&mcnt, &p);
+  	  printf ("/jump to %d", p + mcnt - start);
+	  break;
+
+        case succeed_n: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+	  printf ("/succeed_n to %d, %d times", p + mcnt - start, mcnt2);
+          break;
+        
+        case jump_n: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+	  printf ("/jump_n to %d, %d times", p + mcnt - start, mcnt2);
+          break;
+        
+        case set_number_at: 
+          extract_number_and_incr (&mcnt, &p);
+          extract_number_and_incr (&mcnt2, &p);
+	  printf ("/set_number_at location %d to %d", p + mcnt - start, mcnt2);
+          break;
+        
+        case wordbound:
+	  printf ("/wordbound");
+	  break;
+
+	case notwordbound:
+	  printf ("/notwordbound");
+          break;
+
+	case wordbeg:
+	  printf ("/wordbeg");
+	  break;
+          
+	case wordend:
+	  printf ("/wordend");
+          
+#ifdef emacs
+	case before_dot:
+	  printf ("/before_dot");
+          break;
+
+	case at_dot:
+	  printf ("/at_dot");
+          break;
+
+	case after_dot:
+	  printf ("/after_dot");
+          break;
+
+	case syntaxspec:
+          printf ("/syntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+          break;
+	  
+	case notsyntaxspec:
+          printf ("/notsyntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+	  break;
+#endif /* emacs */
+
+	case wordchar:
+	  printf ("/wordchar");
+          break;
+	  
+	case notwordchar:
+	  printf ("/notwordchar");
+          break;
+
+	case begbuf:
+	  printf ("/begbuf");
+          break;
+
+	case endbuf:
+	  printf ("/endbuf");
+          break;
+
+        default:
+          printf ("?%d", *(p-1));
+	}
+
+      putchar ('\n');
+    }
+
+  printf ("%d:\tend of pattern.\n", p - start);
+}
+
+
+void
+print_compiled_pattern (bufp)
+    struct re_pattern_buffer *bufp;
+{
+  unsigned char *buffer = bufp->buffer;
+
+  print_partial_compiled_pattern (buffer, buffer + bufp->used);
+  printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
+
+  if (bufp->fastmap_accurate && bufp->fastmap)
+    {
+      printf ("fastmap: ");
+      print_fastmap (bufp->fastmap);
+    }
+
+  printf ("re_nsub: %d\t", bufp->re_nsub);
+  printf ("regs_alloc: %d\t", bufp->regs_allocated);
+  printf ("can_be_null: %d\t", bufp->can_be_null);
+  printf ("newline_anchor: %d\n", bufp->newline_anchor);
+  printf ("no_sub: %d\t", bufp->no_sub);
+  printf ("not_bol: %d\t", bufp->not_bol);
+  printf ("not_eol: %d\t", bufp->not_eol);
+  printf ("syntax: %d\n", bufp->syntax);
+  /* Perhaps we should print the translate table?  */
+}
+
+
+void
+print_double_string (where, string1, size1, string2, size2)
+    const char *where;
+    const char *string1;
+    const char *string2;
+    int size1;
+    int size2;
+{
+  unsigned this_char;
+  
+  if (where == NULL)
+    printf ("(null)");
+  else
+    {
+      if (FIRST_STRING_P (where))
+        {
+          for (this_char = where - string1; this_char < size1; this_char++)
+            putchar (string1[this_char]);
+
+          where = string2;    
+        }
+
+      for (this_char = where - string2; this_char < size2; this_char++)
+        putchar (string2[this_char]);
+    }
+}
+
+#else /* not DEBUG */
+
+#undef assert
+#define assert(e)
+
+#define DEBUG_STATEMENT(e)
+#define DEBUG_PRINT1(x)
+#define DEBUG_PRINT2(x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
+
+#endif /* not DEBUG */
+
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+/* This has no initializer because initialized variables in Emacs
+   become read-only after dumping.  */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t
+re_set_syntax (syntax)
+    reg_syntax_t syntax;
+{
+  reg_syntax_t ret = re_syntax_options;
+  
+  re_syntax_options = syntax;
+  return ret;
+}
+
+
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.
+   POSIX doesn't require that we do anything for REG_NOERROR,
+   but why not be nice?  */
+
+static const char *re_error_msgid[] =
+  { "Success",					/* REG_NOERROR */
+    "No match",					/* REG_NOMATCH */
+    "Invalid regular expression",		/* REG_BADPAT */
+    "Invalid collation character",		/* REG_ECOLLATE */
+    "Invalid character class name",		/* REG_ECTYPE */
+    "Trailing backslash",			/* REG_EESCAPE */
+    "Invalid back reference",			/* REG_ESUBREG */
+    "Unmatched [ or [^",			/* REG_EBRACK */
+    "Unmatched ( or \\(",			/* REG_EPAREN */
+    "Unmatched \\{",				/* REG_EBRACE */
+    "Invalid content of \\{\\}",		/* REG_BADBR */
+    "Invalid range end",			/* REG_ERANGE */
+    "Memory exhausted",				/* REG_ESPACE */
+    "Invalid preceding regular expression",	/* REG_BADRPT */
+    "Premature end of regular expression",	/* REG_EEND */
+    "Regular expression too big",		/* REG_ESIZE */
+    "Unmatched ) or \\)",			/* REG_ERPAREN */
+  };
+
+
+/* Avoiding alloca during matching, to placate r_alloc.  */
+
+/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
+   searching and matching functions should not call alloca.  On some
+   systems, alloca is implemented in terms of malloc, and if we're
+   using the relocating allocator routines, then malloc could cause a
+   relocation, which might (if the strings being searched are in the
+   ralloc heap) shift the data out from underneath the regexp
+   routines.
+
+   Here's another reason to avoid allocation: Emacs 
+   processes input from X in a signal handler; processing X input may
+   call malloc; if input arrives while a matching routine is calling
+   malloc, then we're scrod.  But Emacs can't just block input while
+   calling matching routines; then we don't notice interrupts when
+   they come in.  So, Emacs blocks input around all regexp calls
+   except the matching calls, which it leaves unprotected, in the
+   faith that they will not malloc.  */
+
+/* Normally, this is fine.  */
+#define MATCH_MAY_ALLOCATE
+
+/* When using GNU C, we are not REALLY using the C alloca, no matter
+   what sysfuncs.h may say.  So don't take precautions for it.  */
+#ifdef __GNUC__
+#undef C_ALLOCA
+#endif
+
+/* The match routines may not allocate if (1) they would do it with malloc
+   and (2) it's not safe for them to use malloc.
+   Note that if REL_ALLOC is defined, matching would not use malloc for the
+   failure stack, but we would still use it for the register vectors;
+   so REL_ALLOC should not affect this.  */
+#if (defined (C_ALLOCA) || defined (REGEX_MALLOC)) && defined (emacs)
+#undef MATCH_MAY_ALLOCATE
+#endif
+
+
+
+/* Failure stack declarations and macros; both re_compile_fastmap and
+   re_match_2 use a failure stack.  These have to be macros because of
+   REGEX_ALLOCATE_STACK.  */
+   
+
+/* Number of failure points for which to initially allocate space
+   when matching.  If this number is exceeded, we allocate more
+   space, so it is not a hard limit.  */
+#ifndef INIT_FAILURE_ALLOC
+#define INIT_FAILURE_ALLOC 5
+#endif
+
+/* Roughly the maximum number of failure points on the stack.  Would be
+   exactly that if always used MAX_FAILURE_SPACE each time we failed.
+   This is a variable only so users of regex can assign to it; we never
+   change it ourselves.  */
+#if defined (MATCH_MAY_ALLOCATE)
+int re_max_failures = 200000;
+#else
+int re_max_failures = 2000;
+#endif
+
+union fail_stack_elt
+{
+  unsigned char *pointer;
+  int integer;
+};
+
+typedef union fail_stack_elt fail_stack_elt_t;
+
+typedef struct
+{
+  fail_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} fail_stack_type;
+
+#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
+#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
+#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
+
+
+/* Define macros to initialize and free the failure stack.
+   Do `return -2' if the alloc fails.  */
+
+#ifdef MATCH_MAY_ALLOCATE
+#define INIT_FAIL_STACK()						\
+  do {									\
+    fail_stack.stack = (fail_stack_elt_t *)				\
+      REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t));	\
+									\
+    if (fail_stack.stack == NULL)					\
+      return -2;							\
+									\
+    fail_stack.size = INIT_FAILURE_ALLOC;				\
+    fail_stack.avail = 0;						\
+  } while (0)
+
+#define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
+#else
+#define INIT_FAIL_STACK()						\
+  do {									\
+    fail_stack.avail = 0;						\
+  } while (0)
+
+#define RESET_FAIL_STACK()
+#endif
+
+
+/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
+
+   Return 1 if succeeds, and 0 if either ran out of memory
+   allocating space for it or it was already too large.  
+   
+   REGEX_REALLOCATE_STACK requires `destination' be declared.   */
+
+#define DOUBLE_FAIL_STACK(fail_stack)					\
+  ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS		\
+   ? 0									\
+   : ((fail_stack).stack = (fail_stack_elt_t *)				\
+        REGEX_REALLOCATE_STACK ((fail_stack).stack, 			\
+          (fail_stack).size * sizeof (fail_stack_elt_t),		\
+          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),	\
+									\
+      (fail_stack).stack == NULL					\
+      ? 0								\
+      : ((fail_stack).size <<= 1, 					\
+         1)))
+
+
+/* Push pointer POINTER on FAIL_STACK. 
+   Return 1 if was able to do so and 0 if ran out of memory allocating
+   space to do so.  */
+#define PUSH_PATTERN_OP(POINTER, FAIL_STACK)				\
+  ((FAIL_STACK_FULL ()							\
+    && !DOUBLE_FAIL_STACK (FAIL_STACK))					\
+   ? 0									\
+   : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER,	\
+      1))
+
+/* Push a pointer value onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_POINTER(item)					\
+  fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
+
+/* This pushes an integer-valued item onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_INT(item)					\
+  fail_stack.stack[fail_stack.avail++].integer = (item)
+
+/* Push a fail_stack_elt_t value onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_ELT(item)					\
+  fail_stack.stack[fail_stack.avail++] =  (item)
+
+/* These three POP... operations complement the three PUSH... operations.
+   All assume that `fail_stack' is nonempty.  */
+#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
+#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
+#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
+
+/* Used to omit pushing failure point id's when we're not debugging.  */
+#ifdef DEBUG
+#define DEBUG_PUSH PUSH_FAILURE_INT
+#define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
+#else
+#define DEBUG_PUSH(item)
+#define DEBUG_POP(item_addr)
+#endif
+
+
+/* Push the information about the state we will need
+   if we ever fail back to it.  
+   
+   Requires variables fail_stack, regstart, regend, reg_info, and
+   num_regs be declared.  DOUBLE_FAIL_STACK requires `destination' be
+   declared.
+   
+   Does `return FAILURE_CODE' if runs out of memory.  */
+
+#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)	\
+  do {									\
+    char *destination;							\
+    /* Must be int, so when we don't save any registers, the arithmetic	\
+       of 0 + -1 isn't done as unsigned.  */				\
+    int this_reg;							\
+    									\
+    DEBUG_STATEMENT (failure_id++);					\
+    DEBUG_STATEMENT (nfailure_points_pushed++);				\
+    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);		\
+    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
+    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
+									\
+    DEBUG_PRINT2 ("  slots needed: %d\n", NUM_FAILURE_ITEMS);		\
+    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);	\
+									\
+    /* Ensure we have enough space allocated for what we will push.  */	\
+    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)			\
+      {									\
+        if (!DOUBLE_FAIL_STACK (fail_stack))				\
+          return failure_code;						\
+									\
+        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",		\
+		       (fail_stack).size);				\
+        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
+      }									\
+									\
+    /* Push the info, starting with the registers.  */			\
+    DEBUG_PRINT1 ("\n");						\
+									\
+    for (this_reg = lowest_active_reg; this_reg <= highest_active_reg;	\
+         this_reg++)							\
+      {									\
+	DEBUG_PRINT2 ("  Pushing reg: %d\n", this_reg);			\
+        DEBUG_STATEMENT (num_regs_pushed++);				\
+									\
+	DEBUG_PRINT2 ("    start: 0x%x\n", regstart[this_reg]);		\
+        PUSH_FAILURE_POINTER (regstart[this_reg]);			\
+                                                                        \
+	DEBUG_PRINT2 ("    end: 0x%x\n", regend[this_reg]);		\
+        PUSH_FAILURE_POINTER (regend[this_reg]);			\
+									\
+	DEBUG_PRINT2 ("    info: 0x%x\n      ", reg_info[this_reg]);	\
+        DEBUG_PRINT2 (" match_null=%d",					\
+                      REG_MATCH_NULL_STRING_P (reg_info[this_reg]));	\
+        DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));	\
+        DEBUG_PRINT2 (" matched_something=%d",				\
+                      MATCHED_SOMETHING (reg_info[this_reg]));		\
+        DEBUG_PRINT2 (" ever_matched=%d",				\
+                      EVER_MATCHED_SOMETHING (reg_info[this_reg]));	\
+	DEBUG_PRINT1 ("\n");						\
+        PUSH_FAILURE_ELT (reg_info[this_reg].word);			\
+      }									\
+									\
+    DEBUG_PRINT2 ("  Pushing  low active reg: %d\n", lowest_active_reg);\
+    PUSH_FAILURE_INT (lowest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing high active reg: %d\n", highest_active_reg);\
+    PUSH_FAILURE_INT (highest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing pattern 0x%x: ", pattern_place);		\
+    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);		\
+    PUSH_FAILURE_POINTER (pattern_place);				\
+									\
+    DEBUG_PRINT2 ("  Pushing string 0x%x: `", string_place);		\
+    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
+				 size2);				\
+    DEBUG_PRINT1 ("'\n");						\
+    PUSH_FAILURE_POINTER (string_place);				\
+									\
+    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);		\
+    DEBUG_PUSH (failure_id);						\
+  } while (0)
+
+/* This is the number of items that are pushed and popped on the stack
+   for each register.  */
+#define NUM_REG_ITEMS  3
+
+/* Individual items aside from the registers.  */
+#ifdef DEBUG
+#define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
+#else
+#define NUM_NONREG_ITEMS 4
+#endif
+
+/* We push at most this many items on the stack.  */
+#define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
+
+/* We actually push this many items.  */
+#define NUM_FAILURE_ITEMS						\
+  ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS 	\
+    + NUM_NONREG_ITEMS)
+
+/* How many items can still be added to the stack without overflowing it.  */
+#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
+
+
+/* Pops what PUSH_FAIL_STACK pushes.
+
+   We restore into the parameters, all of which should be lvalues:
+     STR -- the saved data position.
+     PAT -- the saved pattern position.
+     LOW_REG, HIGH_REG -- the highest and lowest active registers.
+     REGSTART, REGEND -- arrays of string positions.
+     REG_INFO -- array of information about each subexpression.
+   
+   Also assumes the variables `fail_stack' and (if debugging), `bufp',
+   `pend', `string1', `size1', `string2', and `size2'.  */
+
+#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+{									\
+  DEBUG_STATEMENT (fail_stack_elt_t failure_id;)			\
+  int this_reg;								\
+  const unsigned char *string_temp;					\
+									\
+  assert (!FAIL_STACK_EMPTY ());					\
+									\
+  /* Remove failure points and point to how many regs pushed.  */	\
+  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");				\
+  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);	\
+  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);	\
+									\
+  assert (fail_stack.avail >= NUM_NONREG_ITEMS);			\
+									\
+  DEBUG_POP (&failure_id);						\
+  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);		\
+									\
+  /* If the saved string location is NULL, it came from an		\
+     on_failure_keep_string_jump opcode, and we want to throw away the	\
+     saved NULL, thus retaining our current position in the string.  */	\
+  string_temp = POP_FAILURE_POINTER ();					\
+  if (string_temp != NULL)						\
+    str = (const char *) string_temp;					\
+									\
+  DEBUG_PRINT2 ("  Popping string 0x%x: `", str);			\
+  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);	\
+  DEBUG_PRINT1 ("'\n");							\
+									\
+  pat = (unsigned char *) POP_FAILURE_POINTER ();			\
+  DEBUG_PRINT2 ("  Popping pattern 0x%x: ", pat);			\
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);			\
+									\
+  /* Restore register info.  */						\
+  high_reg = (unsigned) POP_FAILURE_INT ();				\
+  DEBUG_PRINT2 ("  Popping high active reg: %d\n", high_reg);		\
+									\
+  low_reg = (unsigned) POP_FAILURE_INT ();				\
+  DEBUG_PRINT2 ("  Popping  low active reg: %d\n", low_reg);		\
+									\
+  for (this_reg = high_reg; this_reg >= low_reg; this_reg--)		\
+    {									\
+      DEBUG_PRINT2 ("    Popping reg: %d\n", this_reg);			\
+									\
+      reg_info[this_reg].word = POP_FAILURE_ELT ();			\
+      DEBUG_PRINT2 ("      info: 0x%x\n", reg_info[this_reg]);		\
+									\
+      regend[this_reg] = (const char *) POP_FAILURE_POINTER ();		\
+      DEBUG_PRINT2 ("      end: 0x%x\n", regend[this_reg]);		\
+									\
+      regstart[this_reg] = (const char *) POP_FAILURE_POINTER ();	\
+      DEBUG_PRINT2 ("      start: 0x%x\n", regstart[this_reg]);		\
+    }									\
+									\
+  set_regs_matched_done = 0;						\
+  DEBUG_STATEMENT (nfailure_points_popped++);				\
+} /* POP_FAILURE_POINT */
+
+
+
+
+/* Structure for per-register (a.k.a. per-group) information.
+   Other register information, such as the
+   starting and ending positions (which are addresses), and the list of
+   inner groups (which is a bits list) are maintained in separate
+   variables.  
+   
+   We are making a (strictly speaking) nonportable assumption here: that
+   the compiler will pack our bit fields into something that fits into
+   the type of `word', i.e., is something that fits into one item on the
+   failure stack.  */
+
+typedef union
+{
+  fail_stack_elt_t word;
+  struct
+  {
+      /* This field is one if this group can match the empty string,
+         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
+#define MATCH_NULL_UNSET_VALUE 3
+    unsigned match_null_string_p : 2;
+    unsigned is_active : 1;
+    unsigned matched_something : 1;
+    unsigned ever_matched_something : 1;
+  } bits;
+} register_info_type;
+
+#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
+#define IS_ACTIVE(R)  ((R).bits.is_active)
+#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
+#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
+
+
+/* Call this when have matched a real character; it sets `matched' flags
+   for the subexpressions which we are currently inside.  Also records
+   that those subexprs have matched.  */
+#define SET_REGS_MATCHED()						\
+  do									\
+    {									\
+      if (!set_regs_matched_done)					\
+	{								\
+	  unsigned r;							\
+	  set_regs_matched_done = 1;					\
+	  for (r = lowest_active_reg; r <= highest_active_reg; r++)	\
+	    {								\
+	      MATCHED_SOMETHING (reg_info[r])				\
+		= EVER_MATCHED_SOMETHING (reg_info[r])			\
+		= 1;							\
+	    }								\
+	}								\
+    }									\
+  while (0)
+
+/* Registers are set to a sentinel when they haven't yet matched.  */
+static char reg_unset_dummy;
+#define REG_UNSET_VALUE (&reg_unset_dummy)
+#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
+
+
+/* Subroutine declarations and macros for regex_compile.  */
+
+static void store_op1 (), store_op2 ();
+static void insert_op1 (), insert_op2 ();
+static boolean at_begline_loc_p (), at_endline_loc_p ();
+static boolean group_in_compile_stack ();
+static reg_errcode_t compile_range ();
+
+/* Fetch the next character in the uncompiled pattern---translating it 
+   if necessary.  Also cast from a signed character in the constant
+   string passed to us by the user to an unsigned char that we can use
+   as an array index (in, e.g., `translate').  */
+#define PATFETCH(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++;						\
+    if (translate) c = translate[c]; 					\
+  } while (0)
+
+/* Fetch the next character in the uncompiled pattern, with no
+   translation.  */
+#define PATFETCH_RAW(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++; 						\
+  } while (0)
+
+/* Go backwards one character in the pattern.  */
+#define PATUNFETCH p--
+
+
+/* If `translate' is non-null, return translate[D], else just D.  We
+   cast the subscript to translate because some data is declared as
+   `char *', to avoid warnings when a string constant is passed.  But
+   when we use a character as a subscript we must make it unsigned.  */
+#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
+
+
+/* Macros for outputting the compiled pattern into `buffer'.  */
+
+/* If the buffer isn't allocated when it comes in, use this.  */
+#define INIT_BUF_SIZE  32
+
+/* Make sure we have at least N more bytes of space in buffer.  */
+#define GET_BUFFER_SPACE(n)						\
+    while (b - bufp->buffer + (n) > bufp->allocated)			\
+      EXTEND_BUFFER ()
+
+/* Make sure we have one more byte of buffer space and then add C to it.  */
+#define BUF_PUSH(c)							\
+  do {									\
+    GET_BUFFER_SPACE (1);						\
+    *b++ = (unsigned char) (c);						\
+  } while (0)
+
+
+/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
+#define BUF_PUSH_2(c1, c2)						\
+  do {									\
+    GET_BUFFER_SPACE (2);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+  } while (0)
+
+
+/* As with BUF_PUSH_2, except for three bytes.  */
+#define BUF_PUSH_3(c1, c2, c3)						\
+  do {									\
+    GET_BUFFER_SPACE (3);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+    *b++ = (unsigned char) (c3);					\
+  } while (0)
+
+
+/* Store a jump with opcode OP at LOC to location TO.  We store a
+   relative address offset by the three bytes the jump itself occupies.  */
+#define STORE_JUMP(op, loc, to) \
+  store_op1 (op, loc, (to) - (loc) - 3)
+
+/* Likewise, for a two-argument jump.  */
+#define STORE_JUMP2(op, loc, to, arg) \
+  store_op2 (op, loc, (to) - (loc) - 3, arg)
+
+/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP(op, loc, to) \
+  insert_op1 (op, loc, (to) - (loc) - 3, b)
+
+/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP2(op, loc, to, arg) \
+  insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
+
+
+/* This is not an arbitrary limit: the arguments which represent offsets
+   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+   be too small, many things would have to change.  */
+#define MAX_BUF_SIZE (1L << 16)
+
+
+/* Extend the buffer by twice its current size via realloc and
+   reset the pointers that pointed into the old block to point to the
+   correct places in the new one.  If extending the buffer results in it
+   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+#define EXTEND_BUFFER()							\
+  do { 									\
+    unsigned char *old_buffer = bufp->buffer;				\
+    if (bufp->allocated == MAX_BUF_SIZE) 				\
+      return REG_ESIZE;							\
+    bufp->allocated <<= 1;						\
+    if (bufp->allocated > MAX_BUF_SIZE)					\
+      bufp->allocated = MAX_BUF_SIZE; 					\
+    bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
+    if (bufp->buffer == NULL)						\
+      return REG_ESPACE;						\
+    /* If the buffer moved, move all the pointers into it.  */		\
+    if (old_buffer != bufp->buffer)					\
+      {									\
+        b = (b - old_buffer) + bufp->buffer;				\
+        begalt = (begalt - old_buffer) + bufp->buffer;			\
+        if (fixup_alt_jump)						\
+          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
+        if (laststart)							\
+          laststart = (laststart - old_buffer) + bufp->buffer;		\
+        if (pending_exact)						\
+          pending_exact = (pending_exact - old_buffer) + bufp->buffer;	\
+      }									\
+  } while (0)
+
+
+/* Since we have one byte reserved for the register number argument to
+   {start,stop}_memory, the maximum number of groups we can report
+   things about is what fits in that byte.  */
+#define MAX_REGNUM 255
+
+/* But patterns can have more than `MAX_REGNUM' registers.  We just
+   ignore the excess.  */
+typedef unsigned regnum_t;
+
+
+/* Macros for the compile stack.  */
+
+/* Since offsets can go either forwards or backwards, this type needs to
+   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
+typedef int pattern_offset_t;
+
+typedef struct
+{
+  pattern_offset_t begalt_offset;
+  pattern_offset_t fixup_alt_jump;
+  pattern_offset_t inner_group_offset;
+  pattern_offset_t laststart_offset;  
+  regnum_t regnum;
+} compile_stack_elt_t;
+
+
+typedef struct
+{
+  compile_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} compile_stack_type;
+
+
+#define INIT_COMPILE_STACK_SIZE 32
+
+#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+
+/* The next available element.  */
+#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+
+
+/* Set the bit for character C in a list.  */
+#define SET_LIST_BIT(c)                               \
+  (b[((unsigned char) (c)) / BYTEWIDTH]               \
+   |= 1 << (((unsigned char) c) % BYTEWIDTH))
+
+
+/* Get the next unsigned number in the uncompiled pattern.  */
+#define GET_UNSIGNED_NUMBER(num) 					\
+  { if (p != pend)							\
+     {									\
+       PATFETCH (c); 							\
+       while (ISDIGIT (c)) 						\
+         { 								\
+           if (num < 0)							\
+              num = 0;							\
+           num = num * 10 + c - '0'; 					\
+           if (p == pend) 						\
+              break; 							\
+           PATFETCH (c);						\
+         } 								\
+       } 								\
+    }		
+
+#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#define IS_CHAR_CLASS(string)						\
+   (STREQ (string, "alpha") || STREQ (string, "upper")			\
+    || STREQ (string, "lower") || STREQ (string, "digit")		\
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
+    || STREQ (string, "space") || STREQ (string, "print")		\
+    || STREQ (string, "punct") || STREQ (string, "graph")		\
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+
+
+#ifndef MATCH_MAY_ALLOCATE
+
+/* If we cannot allocate large objects within re_match_2_internal,
+   we make the fail stack and register vectors global.
+   The fail stack, we grow to the maximum size when a regexp
+   is compiled.
+   The register vectors, we adjust in size each time we
+   compile a regexp, according to the number of registers it needs.  */
+
+static fail_stack_type fail_stack;
+
+/* Size with which the following vectors are currently allocated.
+   That is so we can make them bigger as needed,
+   but never make them smaller.  */
+static int regs_allocated_size;
+
+static const char **     regstart, **     regend;
+static const char ** old_regstart, ** old_regend;
+static const char **best_regstart, **best_regend;
+static register_info_type *reg_info; 
+static const char **reg_dummy;
+static register_info_type *reg_info_dummy;
+
+/* Make the register vectors big enough for NUM_REGS registers,
+   but don't make them smaller.  */
+
+static
+regex_grow_registers (num_regs)
+     int num_regs;
+{
+  if (num_regs > regs_allocated_size)
+    {
+      RETALLOC_IF (regstart,	 num_regs, const char *);
+      RETALLOC_IF (regend,	 num_regs, const char *);
+      RETALLOC_IF (old_regstart, num_regs, const char *);
+      RETALLOC_IF (old_regend,	 num_regs, const char *);
+      RETALLOC_IF (best_regstart, num_regs, const char *);
+      RETALLOC_IF (best_regend,	 num_regs, const char *);
+      RETALLOC_IF (reg_info,	 num_regs, register_info_type);
+      RETALLOC_IF (reg_dummy,	 num_regs, const char *);
+      RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
+
+      regs_allocated_size = num_regs;
+    }
+}
+
+#endif /* not MATCH_MAY_ALLOCATE */
+
+
+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+   Returns one of error codes defined in `regex.h', or zero for success.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate'
+   fields are set in BUFP on entry.
+
+   If it succeeds, results are put in BUFP (if it returns an error, the
+   contents of BUFP are undefined):
+     `buffer' is the compiled pattern;
+     `syntax' is set to SYNTAX;
+     `used' is set to the length of the compiled pattern;
+     `fastmap_accurate' is zero;
+     `re_nsub' is the number of subexpressions in PATTERN;
+     `not_bol' and `not_eol' are zero;
+   
+   The `fastmap' and `newline_anchor' fields are neither
+   examined nor set.  */
+
+/* Return, freeing storage we allocated.  */
+#define FREE_STACK_RETURN(value)		\
+  return (free (compile_stack.stack), value)
+
+static reg_errcode_t
+regex_compile (pattern, size, syntax, bufp)
+     const char *pattern;
+     int size;
+     reg_syntax_t syntax;
+     struct re_pattern_buffer *bufp;
+{
+  /* We fetch characters from PATTERN here.  Even though PATTERN is
+     `char *' (i.e., signed), we declare these variables as unsigned, so
+     they can be reliably used as array indices.  */
+  register unsigned char c, c1;
+  
+  /* A random temporary spot in PATTERN.  */
+  const char *p1;
+
+  /* Points to the end of the buffer, where we should append.  */
+  register unsigned char *b;
+  
+  /* Keeps track of unclosed groups.  */
+  compile_stack_type compile_stack;
+
+  /* Points to the current (ending) position in the pattern.  */
+  const char *p = pattern;
+  const char *pend = pattern + size;
+  
+  /* How to translate the characters in the pattern.  */
+  char *translate = bufp->translate;
+
+  /* Address of the count-byte of the most recently inserted `exactn'
+     command.  This makes it possible to tell if a new exact-match
+     character can be added to that command or if the character requires
+     a new `exactn' command.  */
+  unsigned char *pending_exact = 0;
+
+  /* Address of start of the most recently finished expression.
+     This tells, e.g., postfix * where to find the start of its
+     operand.  Reset at the beginning of groups and alternatives.  */
+  unsigned char *laststart = 0;
+
+  /* Address of beginning of regexp, or inside of last group.  */
+  unsigned char *begalt;
+
+  /* Place in the uncompiled pattern (i.e., the {) to
+     which to go back if the interval is invalid.  */
+  const char *beg_interval;
+                
+  /* Address of the place where a forward jump should go to the end of
+     the containing expression.  Each alternative of an `or' -- except the
+     last -- ends with a forward jump of this sort.  */
+  unsigned char *fixup_alt_jump = 0;
+
+  /* Counts open-groups as they are encountered.  Remembered for the
+     matching close-group on the compile stack, so the same register
+     number is put in the stop_memory as the start_memory.  */
+  regnum_t regnum = 0;
+
+#ifdef DEBUG
+  DEBUG_PRINT1 ("\nCompiling pattern: ");
+  if (debug)
+    {
+      unsigned debug_count;
+      
+      for (debug_count = 0; debug_count < size; debug_count++)
+        putchar (pattern[debug_count]);
+      putchar ('\n');
+    }
+#endif /* DEBUG */
+
+  /* Initialize the compile stack.  */
+  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
+  if (compile_stack.stack == NULL)
+    return REG_ESPACE;
+
+  compile_stack.size = INIT_COMPILE_STACK_SIZE;
+  compile_stack.avail = 0;
+
+  /* Initialize the pattern buffer.  */
+  bufp->syntax = syntax;
+  bufp->fastmap_accurate = 0;
+  bufp->not_bol = bufp->not_eol = 0;
+
+  /* Set `used' to zero, so that if we return an error, the pattern
+     printer (for debugging) will think there's no pattern.  We reset it
+     at the end.  */
+  bufp->used = 0;
+  
+  /* Always count groups, whether or not bufp->no_sub is set.  */
+  bufp->re_nsub = 0;				
+
+#if !defined (emacs) && !defined (SYNTAX_TABLE)
+  /* Initialize the syntax table.  */
+   init_syntax_once ();
+#endif
+
+  if (bufp->allocated == 0)
+    {
+      if (bufp->buffer)
+	{ /* If zero allocated, but buffer is non-null, try to realloc
+             enough space.  This loses if buffer's address is bogus, but
+             that is the user's responsibility.  */
+          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
+        }
+      else
+        { /* Caller did not allocate a buffer.  Do it for them.  */
+          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
+        }
+      if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
+
+      bufp->allocated = INIT_BUF_SIZE;
+    }
+
+  begalt = b = bufp->buffer;
+
+  /* Loop through the uncompiled pattern until we're at the end.  */
+  while (p != pend)
+    {
+      PATFETCH (c);
+
+      switch (c)
+        {
+        case '^':
+          {
+            if (   /* If at start of pattern, it's an operator.  */
+                   p == pattern + 1
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's come before.  */
+                || at_begline_loc_p (pattern, p, syntax))
+              BUF_PUSH (begline);
+            else
+              goto normal_char;
+          }
+          break;
+
+
+        case '$':
+          {
+            if (   /* If at end of pattern, it's an operator.  */
+                   p == pend 
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's next.  */
+                || at_endline_loc_p (p, pend, syntax))
+               BUF_PUSH (endline);
+             else
+               goto normal_char;
+           }
+           break;
+
+
+	case '+':
+        case '?':
+          if ((syntax & RE_BK_PLUS_QM)
+              || (syntax & RE_LIMITED_OPS))
+            goto normal_char;
+        handle_plus:
+        case '*':
+          /* If there is no previous pattern... */
+          if (!laststart)
+            {
+              if (syntax & RE_CONTEXT_INVALID_OPS)
+                FREE_STACK_RETURN (REG_BADRPT);
+              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+                goto normal_char;
+            }
+
+          {
+            /* Are we optimizing this jump?  */
+            boolean keep_string_p = false;
+            
+            /* 1 means zero (many) matches is allowed.  */
+            char zero_times_ok = 0, many_times_ok = 0;
+
+            /* If there is a sequence of repetition chars, collapse it
+               down to just one (the right one).  We can't combine
+               interval operators with these because of, e.g., `a{2}*',
+               which should only match an even number of `a's.  */
+
+            for (;;)
+              {
+                zero_times_ok |= c != '+';
+                many_times_ok |= c != '?';
+
+                if (p == pend)
+                  break;
+
+                PATFETCH (c);
+
+                if (c == '*'
+                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+                  ;
+
+                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
+                  {
+                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+                    PATFETCH (c1);
+                    if (!(c1 == '+' || c1 == '?'))
+                      {
+                        PATUNFETCH;
+                        PATUNFETCH;
+                        break;
+                      }
+
+                    c = c1;
+                  }
+                else
+                  {
+                    PATUNFETCH;
+                    break;
+                  }
+
+                /* If we get here, we found another repeat character.  */
+               }
+
+            /* Star, etc. applied to an empty pattern is equivalent
+               to an empty pattern.  */
+            if (!laststart)  
+              break;
+
+            /* Now we know whether or not zero matches is allowed
+               and also whether or not two or more matches is allowed.  */
+            if (many_times_ok)
+              { /* More than one repetition is allowed, so put in at the
+                   end a backward relative jump from `b' to before the next
+                   jump we're going to put in below (which jumps from
+                   laststart to after this jump).  
+
+                   But if we are at the `*' in the exact sequence `.*\n',
+                   insert an unconditional jump backwards to the .,
+                   instead of the beginning of the loop.  This way we only
+                   push a failure point once, instead of every time
+                   through the loop.  */
+                assert (p - 1 > pattern);
+
+                /* Allocate the space for the jump.  */
+                GET_BUFFER_SPACE (3);
+
+                /* We know we are not at the first character of the pattern,
+                   because laststart was nonzero.  And we've already
+                   incremented `p', by the way, to be the character after
+                   the `*'.  Do we have to do something analogous here
+                   for null bytes, because of RE_DOT_NOT_NULL?  */
+                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
+		    && zero_times_ok
+                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
+                    && !(syntax & RE_DOT_NEWLINE))
+                  { /* We have .*\n.  */
+                    STORE_JUMP (jump, b, laststart);
+                    keep_string_p = true;
+                  }
+                else
+                  /* Anything else.  */
+                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
+
+                /* We've added more stuff to the buffer.  */
+                b += 3;
+              }
+
+            /* On failure, jump from laststart to b + 3, which will be the
+               end of the buffer after this jump is inserted.  */
+            GET_BUFFER_SPACE (3);
+            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
+                                       : on_failure_jump,
+                         laststart, b + 3);
+            pending_exact = 0;
+            b += 3;
+
+            if (!zero_times_ok)
+              {
+                /* At least one repetition is required, so insert a
+                   `dummy_failure_jump' before the initial
+                   `on_failure_jump' instruction of the loop. This
+                   effects a skip over that instruction the first time
+                   we hit that loop.  */
+                GET_BUFFER_SPACE (3);
+                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
+                b += 3;
+              }
+            }
+	  break;
+
+
+	case '.':
+          laststart = b;
+          BUF_PUSH (anychar);
+          break;
+
+
+        case '[':
+          {
+            boolean had_char_class = false;
+
+            if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+            /* Ensure that we have enough space to push a charset: the
+               opcode, the length count, and the bitset; 34 bytes in all.  */
+	    GET_BUFFER_SPACE (34);
+
+            laststart = b;
+
+            /* We test `*p == '^' twice, instead of using an if
+               statement, so we only need one BUF_PUSH.  */
+            BUF_PUSH (*p == '^' ? charset_not : charset); 
+            if (*p == '^')
+              p++;
+
+            /* Remember the first position in the bracket expression.  */
+            p1 = p;
+
+            /* Push the number of bytes in the bitmap.  */
+            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* Clear the whole map.  */
+            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* charset_not matches newline according to a syntax bit.  */
+            if ((re_opcode_t) b[-2] == charset_not
+                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
+              SET_LIST_BIT ('\n');
+
+            /* Read in characters and ranges, setting map bits.  */
+            for (;;)
+              {
+                if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                PATFETCH (c);
+
+                /* \ might escape characters inside [...] and [^...].  */
+                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
+                  {
+                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+                    PATFETCH (c1);
+                    SET_LIST_BIT (c1);
+                    continue;
+                  }
+
+                /* Could be the end of the bracket expression.  If it's
+                   not (i.e., when the bracket expression is `[]' so
+                   far), the ']' character bit gets set way below.  */
+                if (c == ']' && p != p1 + 1)
+                  break;
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character class.  */
+                if (had_char_class && c == '-' && *p != ']')
+                  FREE_STACK_RETURN (REG_ERANGE);
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character: if this is a hyphen not at the
+                   beginning or the end of a list, then it's the range
+                   operator.  */
+                if (c == '-' 
+                    && !(p - 2 >= pattern && p[-2] == '[') 
+                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+                    && *p != ']')
+                  {
+                    reg_errcode_t ret
+                      = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
+                  }
+
+                else if (p[0] == '-' && p[1] != ']')
+                  { /* This handles ranges made up of characters only.  */
+                    reg_errcode_t ret;
+
+		    /* Move past the `-'.  */
+                    PATFETCH (c1);
+                    
+                    ret = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
+                  }
+
+                /* See if we're at the beginning of a possible character
+                   class.  */
+
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
+                  { /* Leave room for the null.  */
+                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+
+                    PATFETCH (c);
+                    c1 = 0;
+
+                    /* If pattern is `[[:'.  */
+                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                    for (;;)
+                      {
+                        PATFETCH (c);
+                        if (c == ':' || c == ']' || p == pend
+                            || c1 == CHAR_CLASS_MAX_LENGTH)
+                          break;
+                        str[c1++] = c;
+                      }
+                    str[c1] = '\0';
+
+                    /* If isn't a word bracketed by `[:' and:`]':
+                       undo the ending character, the letters, and leave 
+                       the leading `:' and `[' (but set bits for them).  */
+                    if (c == ':' && *p == ']')
+                      {
+                        int ch;
+                        boolean is_alnum = STREQ (str, "alnum");
+                        boolean is_alpha = STREQ (str, "alpha");
+                        boolean is_blank = STREQ (str, "blank");
+                        boolean is_cntrl = STREQ (str, "cntrl");
+                        boolean is_digit = STREQ (str, "digit");
+                        boolean is_graph = STREQ (str, "graph");
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_print = STREQ (str, "print");
+                        boolean is_punct = STREQ (str, "punct");
+                        boolean is_space = STREQ (str, "space");
+                        boolean is_upper = STREQ (str, "upper");
+                        boolean is_xdigit = STREQ (str, "xdigit");
+                        
+                        if (!IS_CHAR_CLASS (str))
+			  FREE_STACK_RETURN (REG_ECTYPE);
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);					
+
+                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
+                          {
+			    /* This was split into 3 if's to
+			       avoid an arbitrary limit in some compiler.  */
+                            if (   (is_alnum  && ISALNUM (ch))
+                                || (is_alpha  && ISALPHA (ch))
+                                || (is_blank  && ISBLANK (ch))
+                                || (is_cntrl  && ISCNTRL (ch)))
+			      SET_LIST_BIT (ch);
+			    if (   (is_digit  && ISDIGIT (ch))
+                                || (is_graph  && ISGRAPH (ch))
+                                || (is_lower  && ISLOWER (ch))
+                                || (is_print  && ISPRINT (ch)))
+			      SET_LIST_BIT (ch);
+			    if (   (is_punct  && ISPUNCT (ch))
+                                || (is_space  && ISSPACE (ch))
+                                || (is_upper  && ISUPPER (ch))
+                                || (is_xdigit && ISXDIGIT (ch)))
+			      SET_LIST_BIT (ch);
+                          }
+                        had_char_class = true;
+                      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)    
+                          PATUNFETCH;
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT (':');
+                        had_char_class = false;
+                      }
+                  }
+                else
+                  {
+                    had_char_class = false;
+                    SET_LIST_BIT (c);
+                  }
+              }
+
+            /* Discard any (non)matching list bytes that are all 0 at the
+               end of the map.  Decrease the map-length byte too.  */
+            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) 
+              b[-1]--; 
+            b += b[-1];
+          }
+          break;
+
+
+	case '(':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_open;
+          else
+            goto normal_char;
+
+
+        case ')':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_close;
+          else
+            goto normal_char;
+
+
+        case '\n':
+          if (syntax & RE_NEWLINE_ALT)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+	case '|':
+          if (syntax & RE_NO_BK_VBAR)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+        case '{':
+           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
+             goto handle_interval;
+           else
+             goto normal_char;
+
+
+        case '\\':
+          if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+          /* Do not translate the character after the \, so that we can
+             distinguish, e.g., \B from \b, even if we normally would
+             translate, e.g., B to b.  */
+          PATFETCH_RAW (c);
+
+          switch (c)
+            {
+            case '(':
+              if (syntax & RE_NO_BK_PARENS)
+                goto normal_backslash;
+
+            handle_open:
+              bufp->re_nsub++;
+              regnum++;
+
+              if (COMPILE_STACK_FULL)
+                { 
+                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
+                            compile_stack_elt_t);
+                  if (compile_stack.stack == NULL) return REG_ESPACE;
+
+                  compile_stack.size <<= 1;
+                }
+
+              /* These are the values to restore when we hit end of this
+                 group.  They are all relative offsets, so that if the
+                 whole pattern moves because of realloc, they will still
+                 be valid.  */
+              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
+              COMPILE_STACK_TOP.fixup_alt_jump 
+                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
+              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
+              COMPILE_STACK_TOP.regnum = regnum;
+
+              /* We will eventually replace the 0 with the number of
+                 groups inner to this one.  But do not push a
+                 start_memory for groups beyond the last one we can
+                 represent in the compiled pattern.  */
+              if (regnum <= MAX_REGNUM)
+                {
+                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
+                  BUF_PUSH_3 (start_memory, regnum, 0);
+                }
+                
+              compile_stack.avail++;
+
+              fixup_alt_jump = 0;
+              laststart = 0;
+              begalt = b;
+	      /* If we've reached MAX_REGNUM groups, then this open
+		 won't actually generate any code, so we'll have to
+		 clear pending_exact explicitly.  */
+	      pending_exact = 0;
+              break;
+
+
+            case ')':
+              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
+
+              if (COMPILE_STACK_EMPTY)
+                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+                  goto normal_backslash;
+                else
+                  FREE_STACK_RETURN (REG_ERPAREN);
+
+            handle_close:
+              if (fixup_alt_jump)
+                { /* Push a dummy failure point at the end of the
+                     alternative for a possible future
+                     `pop_failure_jump' to pop.  See comments at
+                     `push_dummy_failure' in `re_match_2'.  */
+                  BUF_PUSH (push_dummy_failure);
+                  
+                  /* We allocated space for this jump when we assigned
+                     to `fixup_alt_jump', in the `handle_alt' case below.  */
+                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
+                }
+
+              /* See similar code for backslashed left paren above.  */
+              if (COMPILE_STACK_EMPTY)
+                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+                  goto normal_char;
+                else
+                  FREE_STACK_RETURN (REG_ERPAREN);
+
+              /* Since we just checked for an empty stack above, this
+                 ``can't happen''.  */
+              assert (compile_stack.avail != 0);
+              {
+                /* We don't just want to restore into `regnum', because
+                   later groups should continue to be numbered higher,
+                   as in `(ab)c(de)' -- the second group is #2.  */
+                regnum_t this_group_regnum;
+
+                compile_stack.avail--;		
+                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
+                fixup_alt_jump
+                  = COMPILE_STACK_TOP.fixup_alt_jump
+                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1 
+                    : 0;
+                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
+                this_group_regnum = COMPILE_STACK_TOP.regnum;
+		/* If we've reached MAX_REGNUM groups, then this open
+		   won't actually generate any code, so we'll have to
+		   clear pending_exact explicitly.  */
+		pending_exact = 0;
+
+                /* We're at the end of the group, so now we know how many
+                   groups were inside this one.  */
+                if (this_group_regnum <= MAX_REGNUM)
+                  {
+                    unsigned char *inner_group_loc
+                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
+                    
+                    *inner_group_loc = regnum - this_group_regnum;
+                    BUF_PUSH_3 (stop_memory, this_group_regnum,
+                                regnum - this_group_regnum);
+                  }
+              }
+              break;
+
+
+            case '|':					/* `\|'.  */
+              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
+                goto normal_backslash;
+            handle_alt:
+              if (syntax & RE_LIMITED_OPS)
+                goto normal_char;
+
+              /* Insert before the previous alternative a jump which
+                 jumps to this alternative if the former fails.  */
+              GET_BUFFER_SPACE (3);
+              INSERT_JUMP (on_failure_jump, begalt, b + 6);
+              pending_exact = 0;
+              b += 3;
+
+              /* The alternative before this one has a jump after it
+                 which gets executed if it gets matched.  Adjust that
+                 jump so it will jump to this alternative's analogous
+                 jump (put in below, which in turn will jump to the next
+                 (if any) alternative's such jump, etc.).  The last such
+                 jump jumps to the correct final destination.  A picture:
+                          _____ _____ 
+                          |   | |   |   
+                          |   v |   v 
+                         a | b   | c   
+
+                 If we are at `b', then fixup_alt_jump right now points to a
+                 three-byte space after `a'.  We'll put in the jump, set
+                 fixup_alt_jump to right after `b', and leave behind three
+                 bytes which we'll fill in when we get to after `c'.  */
+
+              if (fixup_alt_jump)
+                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+              /* Mark and leave space for a jump after this alternative,
+                 to be filled in later either by next alternative or
+                 when know we're at the end of a series of alternatives.  */
+              fixup_alt_jump = b;
+              GET_BUFFER_SPACE (3);
+              b += 3;
+
+              laststart = 0;
+              begalt = b;
+              break;
+
+
+            case '{': 
+              /* If \{ is a literal.  */
+              if (!(syntax & RE_INTERVALS)
+                     /* If we're at `\{' and it's not the open-interval 
+                        operator.  */
+                  || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                  || (p - 2 == pattern  &&  p == pend))
+                goto normal_backslash;
+
+            handle_interval:
+              {
+                /* If got here, then the syntax allows intervals.  */
+
+                /* At least (most) this many matches must be made.  */
+                int lower_bound = -1, upper_bound = -1;
+
+                beg_interval = p - 1;
+
+                if (p == pend)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else
+                      FREE_STACK_RETURN (REG_EBRACE);
+                  }
+
+                GET_UNSIGNED_NUMBER (lower_bound);
+
+                if (c == ',')
+                  {
+                    GET_UNSIGNED_NUMBER (upper_bound);
+                    if (upper_bound < 0) upper_bound = RE_DUP_MAX;
+                  }
+                else
+                  /* Interval such as `{1}' => match exactly once. */
+                  upper_bound = lower_bound;
+
+                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+                    || lower_bound > upper_bound)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      FREE_STACK_RETURN (REG_BADBR);
+                  }
+
+                if (!(syntax & RE_NO_BK_BRACES)) 
+                  {
+                    if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
+
+                    PATFETCH (c);
+                  }
+
+                if (c != '}')
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      FREE_STACK_RETURN (REG_BADBR);
+                  }
+
+                /* We just parsed a valid interval.  */
+
+                /* If it's invalid to have no preceding re.  */
+                if (!laststart)
+                  {
+                    if (syntax & RE_CONTEXT_INVALID_OPS)
+                      FREE_STACK_RETURN (REG_BADRPT);
+                    else if (syntax & RE_CONTEXT_INDEP_OPS)
+                      laststart = b;
+                    else
+                      goto unfetch_interval;
+                  }
+
+                /* If the upper bound is zero, don't want to succeed at
+                   all; jump from `laststart' to `b + 3', which will be
+                   the end of the buffer after we insert the jump.  */
+                 if (upper_bound == 0)
+                   {
+                     GET_BUFFER_SPACE (3);
+                     INSERT_JUMP (jump, laststart, b + 3);
+                     b += 3;
+                   }
+
+                 /* Otherwise, we have a nontrivial interval.  When
+                    we're all done, the pattern will look like:
+                      set_number_at <jump count> <upper bound>
+                      set_number_at <succeed_n count> <lower bound>
+                      succeed_n <after jump addr> <succeed_n count>
+                      <body of loop>
+                      jump_n <succeed_n addr> <jump count>
+                    (The upper bound and `jump_n' are omitted if
+                    `upper_bound' is 1, though.)  */
+                 else 
+                   { /* If the upper bound is > 1, we need to insert
+                        more at the end of the loop.  */
+                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
+
+                     GET_BUFFER_SPACE (nbytes);
+
+                     /* Initialize lower bound of the `succeed_n', even
+                        though it will be set during matching by its
+                        attendant `set_number_at' (inserted next),
+                        because `re_compile_fastmap' needs to know.
+                        Jump to the `jump_n' we might insert below.  */
+                     INSERT_JUMP2 (succeed_n, laststart,
+                                   b + 5 + (upper_bound > 1) * 5,
+                                   lower_bound);
+                     b += 5;
+
+                     /* Code to initialize the lower bound.  Insert 
+                        before the `succeed_n'.  The `5' is the last two
+                        bytes of this `set_number_at', plus 3 bytes of
+                        the following `succeed_n'.  */
+                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
+                     b += 5;
+
+                     if (upper_bound > 1)
+                       { /* More than one repetition is allowed, so
+                            append a backward jump to the `succeed_n'
+                            that starts this interval.
+                            
+                            When we've reached this during matching,
+                            we'll have matched the interval once, so
+                            jump back only `upper_bound - 1' times.  */
+                         STORE_JUMP2 (jump_n, b, laststart + 5,
+                                      upper_bound - 1);
+                         b += 5;
+
+                         /* The location we want to set is the second
+                            parameter of the `jump_n'; that is `b-2' as
+                            an absolute address.  `laststart' will be
+                            the `set_number_at' we're about to insert;
+                            `laststart+3' the number to set, the source
+                            for the relative address.  But we are
+                            inserting into the middle of the pattern --
+                            so everything is getting moved up by 5.
+                            Conclusion: (b - 2) - (laststart + 3) + 5,
+                            i.e., b - laststart.
+                            
+                            We insert this at the beginning of the loop
+                            so that if we fail during matching, we'll
+                            reinitialize the bounds.  */
+                         insert_op2 (set_number_at, laststart, b - laststart,
+                                     upper_bound - 1, b);
+                         b += 5;
+                       }
+                   }
+                pending_exact = 0;
+                beg_interval = NULL;
+              }
+              break;
+
+            unfetch_interval:
+              /* If an invalid interval, match the characters as literals.  */
+               assert (beg_interval);
+               p = beg_interval;
+               beg_interval = NULL;
+
+               /* normal_char and normal_backslash need `c'.  */
+               PATFETCH (c);	
+
+               if (!(syntax & RE_NO_BK_BRACES))
+                 {
+                   if (p > pattern  &&  p[-1] == '\\')
+                     goto normal_backslash;
+                 }
+               goto normal_char;
+
+#ifdef emacs
+            /* There is no way to specify the before_dot and after_dot
+               operators.  rms says this is ok.  --karl  */
+            case '=':
+              BUF_PUSH (at_dot);
+              break;
+
+            case 's':	
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
+              break;
+
+            case 'S':
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
+              break;
+#endif /* emacs */
+
+
+            case 'w':
+              laststart = b;
+              BUF_PUSH (wordchar);
+              break;
+
+
+            case 'W':
+              laststart = b;
+              BUF_PUSH (notwordchar);
+              break;
+
+
+            case '<':
+              BUF_PUSH (wordbeg);
+              break;
+
+            case '>':
+              BUF_PUSH (wordend);
+              break;
+
+            case 'b':
+              BUF_PUSH (wordbound);
+              break;
+
+            case 'B':
+              BUF_PUSH (notwordbound);
+              break;
+
+            case '`':
+              BUF_PUSH (begbuf);
+              break;
+
+            case '\'':
+              BUF_PUSH (endbuf);
+              break;
+
+            case '1': case '2': case '3': case '4': case '5':
+            case '6': case '7': case '8': case '9':
+              if (syntax & RE_NO_BK_REFS)
+                goto normal_char;
+
+              c1 = c - '0';
+
+              if (c1 > regnum)
+                FREE_STACK_RETURN (REG_ESUBREG);
+
+              /* Can't back reference to a subexpression if inside of it.  */
+              if (group_in_compile_stack (compile_stack, c1))
+                goto normal_char;
+
+              laststart = b;
+              BUF_PUSH_2 (duplicate, c1);
+              break;
+
+
+            case '+':
+            case '?':
+              if (syntax & RE_BK_PLUS_QM)
+                goto handle_plus;
+              else
+                goto normal_backslash;
+
+            default:
+            normal_backslash:
+              /* You might think it would be useful for \ to mean
+                 not to translate; but if we don't translate it
+                 it will never match anything.  */
+              c = TRANSLATE (c);
+              goto normal_char;
+            }
+          break;
+
+
+	default:
+        /* Expects the character in `c'.  */
+	normal_char:
+	      /* If no exactn currently being built.  */
+          if (!pending_exact 
+
+              /* If last exactn not at current position.  */
+              || pending_exact + *pending_exact + 1 != b
+              
+              /* We have only one byte following the exactn for the count.  */
+	      || *pending_exact == (1 << BYTEWIDTH) - 1
+
+              /* If followed by a repetition operator.  */
+              || *p == '*' || *p == '^'
+	      || ((syntax & RE_BK_PLUS_QM)
+		  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
+		  : (*p == '+' || *p == '?'))
+	      || ((syntax & RE_INTERVALS)
+                  && ((syntax & RE_NO_BK_BRACES)
+		      ? *p == '{'
+                      : (p[0] == '\\' && p[1] == '{'))))
+	    {
+	      /* Start building a new exactn.  */
+              
+              laststart = b;
+
+	      BUF_PUSH_2 (exactn, 0);
+	      pending_exact = b - 1;
+            }
+            
+	  BUF_PUSH (c);
+          (*pending_exact)++;
+	  break;
+        } /* switch (c) */
+    } /* while p != pend */
+
+  
+  /* Through the pattern now.  */
+  
+  if (fixup_alt_jump)
+    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+  if (!COMPILE_STACK_EMPTY) 
+    FREE_STACK_RETURN (REG_EPAREN);
+
+  /* If we don't want backtracking, force success
+     the first time we reach the end of the compiled pattern.  */
+  if (syntax & RE_NO_POSIX_BACKTRACKING)
+    BUF_PUSH (succeed);
+
+  free (compile_stack.stack);
+
+  /* We have succeeded; set the length of the buffer.  */
+  bufp->used = b - bufp->buffer;
+
+#ifdef DEBUG
+  if (debug)
+    {
+      DEBUG_PRINT1 ("\nCompiled pattern: \n");
+      print_compiled_pattern (bufp);
+    }
+#endif /* DEBUG */
+
+#ifndef MATCH_MAY_ALLOCATE
+  /* Initialize the failure stack to the largest possible stack.  This
+     isn't necessary unless we're trying to avoid calling alloca in
+     the search and match routines.  */
+  {
+    int num_regs = bufp->re_nsub + 1;
+
+    /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
+       is strictly greater than re_max_failures, the largest possible stack
+       is 2 * re_max_failures failure points.  */
+    if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
+      {
+	fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
+
+#ifdef emacs
+	if (! fail_stack.stack)
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) xmalloc (fail_stack.size 
+					    * sizeof (fail_stack_elt_t));
+	else
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
+					     (fail_stack.size
+					      * sizeof (fail_stack_elt_t)));
+#else /* not emacs */
+	if (! fail_stack.stack)
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) malloc (fail_stack.size 
+					   * sizeof (fail_stack_elt_t));
+	else
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) realloc (fail_stack.stack,
+					    (fail_stack.size
+					     * sizeof (fail_stack_elt_t)));
+#endif /* not emacs */
+      }
+
+    regex_grow_registers (num_regs);
+  }
+#endif /* not MATCH_MAY_ALLOCATE */
+
+  return REG_NOERROR;
+} /* regex_compile */
+
+
+/* Subroutines for `regex_compile'.  */
+
+/* Store OP at LOC followed by two-byte integer parameter ARG.  */
+
+static void
+store_op1 (op, loc, arg)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg);
+}
+
+
+/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+store_op2 (op, loc, arg1, arg2)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg1);
+  STORE_NUMBER (loc + 3, arg2);
+}
+
+
+/* Copy the bytes from LOC to END to open up three bytes of space at LOC
+   for OP followed by two-byte integer parameter ARG.  */
+
+static void
+insert_op1 (op, loc, arg, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+    unsigned char *end;    
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 3;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+    
+  store_op1 (op, loc, arg);
+}
+
+
+/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+insert_op2 (op, loc, arg1, arg2, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+    unsigned char *end;    
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 5;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+    
+  store_op2 (op, loc, arg1, arg2);
+}
+
+
+/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+   after an alternative or a begin-subexpression.  We assume there is at
+   least one character before the ^.  */
+
+static boolean
+at_begline_loc_p (pattern, p, syntax)
+    const char *pattern, *p;
+    reg_syntax_t syntax;
+{
+  const char *prev = p - 2;
+  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
+  
+  return
+       /* After a subexpression?  */
+       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
+       /* After an alternative?  */
+    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
+}
+
+
+/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+   at least one character after the $, i.e., `P < PEND'.  */
+
+static boolean
+at_endline_loc_p (p, pend, syntax)
+    const char *p, *pend;
+    int syntax;
+{
+  const char *next = p;
+  boolean next_backslash = *next == '\\';
+  const char *next_next = p + 1 < pend ? p + 1 : NULL;
+  
+  return
+       /* Before a subexpression?  */
+       (syntax & RE_NO_BK_PARENS ? *next == ')'
+        : next_backslash && next_next && *next_next == ')')
+       /* Before an alternative?  */
+    || (syntax & RE_NO_BK_VBAR ? *next == '|'
+        : next_backslash && next_next && *next_next == '|');
+}
+
+
+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
+   false if it's not.  */
+
+static boolean
+group_in_compile_stack (compile_stack, regnum)
+    compile_stack_type compile_stack;
+    regnum_t regnum;
+{
+  int this_element;
+
+  for (this_element = compile_stack.avail - 1;  
+       this_element >= 0; 
+       this_element--)
+    if (compile_stack.stack[this_element].regnum == regnum)
+      return true;
+
+  return false;
+}
+
+
+/* Read the ending character of a range (in a bracket expression) from the
+   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+   Then we set the translation of all bits between the starting and
+   ending characters (inclusive) in the compiled pattern B.
+   
+   Return an error code.
+   
+   We use these short variable names so we can use the same macros as
+   `regex_compile' itself.  */
+
+static reg_errcode_t
+compile_range (p_ptr, pend, translate, syntax, b)
+    const char **p_ptr, *pend;
+    char *translate;
+    reg_syntax_t syntax;
+    unsigned char *b;
+{
+  unsigned this_char;
+
+  const char *p = *p_ptr;
+  int range_start, range_end;
+  
+  if (p == pend)
+    return REG_ERANGE;
+
+  /* Even though the pattern is a signed `char *', we need to fetch
+     with unsigned char *'s; if the high bit of the pattern character
+     is set, the range endpoints will be negative if we fetch using a
+     signed char *.
+
+     We also want to fetch the endpoints without translating them; the 
+     appropriate translation is done in the bit-setting loop below.  */
+  /* The SVR4 compiler on the 3B2 had trouble with unsigned const char *.  */
+  range_start = ((const unsigned char *) p)[-2];
+  range_end   = ((const unsigned char *) p)[0];
+
+  /* Have to increment the pointer into the pattern string, so the
+     caller isn't still at the ending character.  */
+  (*p_ptr)++;
+
+  /* If the start is after the end, the range is empty.  */
+  if (range_start > range_end)
+    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+
+  /* Here we see why `this_char' has to be larger than an `unsigned
+     char' -- the range is inclusive, so if `range_end' == 0xff
+     (assuming 8-bit characters), we would otherwise go into an infinite
+     loop, since all characters <= 0xff.  */
+  for (this_char = range_start; this_char <= range_end; this_char++)
+    {
+      SET_LIST_BIT (TRANSLATE (this_char));
+    }
+  
+  return REG_NOERROR;
+}
+
+
+/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
+   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
+   characters can start a string that matches the pattern.  This fastmap
+   is used by re_search to skip quickly over impossible starting points.
+
+   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
+   area as BUFP->fastmap.
+   
+   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
+   the pattern buffer.
+
+   Returns 0 if we succeed, -2 if an internal error.   */
+
+int
+re_compile_fastmap (bufp)
+     struct re_pattern_buffer *bufp;
+{
+  int j, k;
+#ifdef MATCH_MAY_ALLOCATE
+  fail_stack_type fail_stack;
+#endif
+#ifndef REGEX_MALLOC
+  char *destination;
+#endif
+  /* We don't push any register information onto the failure stack.  */
+  unsigned num_regs = 0;
+  
+  register char *fastmap = bufp->fastmap;
+  unsigned char *pattern = bufp->buffer;
+  unsigned long size = bufp->used;
+  unsigned char *p = pattern;
+  register unsigned char *pend = pattern + size;
+
+  /* This holds the pointer to the failure stack, when
+     it is allocated relocatably.  */
+  fail_stack_elt_t *failure_stack_ptr;
+
+  /* Assume that each path through the pattern can be null until
+     proven otherwise.  We set this false at the bottom of switch
+     statement, to which we get only if a particular path doesn't
+     match the empty string.  */
+  boolean path_can_be_null = true;
+
+  /* We aren't doing a `succeed_n' to begin with.  */
+  boolean succeed_n_p = false;
+
+  assert (fastmap != NULL && p != NULL);
+  
+  INIT_FAIL_STACK ();
+  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
+  bufp->fastmap_accurate = 1;	    /* It will be when we're done.  */
+  bufp->can_be_null = 0;
+      
+  while (1)
+    {
+      if (p == pend || *p == succeed)
+	{
+	  /* We have reached the (effective) end of pattern.  */
+	  if (!FAIL_STACK_EMPTY ())
+	    {
+	      bufp->can_be_null |= path_can_be_null;
+
+	      /* Reset for next path.  */
+	      path_can_be_null = true;
+
+	      p = fail_stack.stack[--fail_stack.avail].pointer;
+
+	      continue;
+	    }
+	  else
+	    break;
+	}
+
+      /* We should never be about to go beyond the end of the pattern.  */
+      assert (p < pend);
+      
+      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
+	{
+
+        /* I guess the idea here is to simply not bother with a fastmap
+           if a backreference is used, since it's too hard to figure out
+           the fastmap for the corresponding group.  Setting
+           `can_be_null' stops `re_search_2' from using the fastmap, so
+           that is all we do.  */
+	case duplicate:
+	  bufp->can_be_null = 1;
+          goto done;
+
+
+      /* Following are the cases which match a character.  These end
+         with `break'.  */
+
+	case exactn:
+          fastmap[p[1]] = 1;
+	  break;
+
+
+        case charset:
+          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
+              fastmap[j] = 1;
+	  break;
+
+
+	case charset_not:
+	  /* Chars beyond end of map must be allowed.  */
+	  for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
+            fastmap[j] = 1;
+
+	  for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
+              fastmap[j] = 1;
+          break;
+
+
+	case wordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notwordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+        case anychar:
+	  {
+	    int fastmap_newline = fastmap['\n'];
+
+	    /* `.' matches anything ...  */
+	    for (j = 0; j < (1 << BYTEWIDTH); j++)
+	      fastmap[j] = 1;
+
+	    /* ... except perhaps newline.  */
+	    if (!(bufp->syntax & RE_DOT_NEWLINE))
+	      fastmap['\n'] = fastmap_newline;
+
+	    /* Return if we have already set `can_be_null'; if we have,
+	       then the fastmap is irrelevant.  Something's wrong here.  */
+	    else if (bufp->can_be_null)
+	      goto done;
+
+	    /* Otherwise, have to check alternative paths.  */
+	    break;
+	  }
+
+#ifdef emacs
+        case syntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notsyntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+      /* All cases after this match the empty string.  These end with
+         `continue'.  */
+
+
+	case before_dot:
+	case at_dot:
+	case after_dot:
+          continue;
+#endif /* not emacs */
+
+
+        case no_op:
+        case begline:
+        case endline:
+	case begbuf:
+	case endbuf:
+	case wordbound:
+	case notwordbound:
+	case wordbeg:
+	case wordend:
+        case push_dummy_failure:
+          continue;
+
+
+	case jump_n:
+        case pop_failure_jump:
+	case maybe_pop_jump:
+	case jump:
+        case jump_past_alt:
+	case dummy_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+	  p += j;	
+	  if (j > 0)
+	    continue;
+            
+          /* Jump backward implies we just went through the body of a
+             loop and matched nothing.  Opcode jumped to should be
+             `on_failure_jump' or `succeed_n'.  Just treat it like an
+             ordinary jump.  For a * loop, it has pushed its failure
+             point already; if so, discard that as redundant.  */
+          if ((re_opcode_t) *p != on_failure_jump
+	      && (re_opcode_t) *p != succeed_n)
+	    continue;
+
+          p++;
+          EXTRACT_NUMBER_AND_INCR (j, p);
+          p += j;		
+	  
+          /* If what's on the stack is where we are now, pop it.  */
+          if (!FAIL_STACK_EMPTY () 
+	      && fail_stack.stack[fail_stack.avail - 1].pointer == p)
+            fail_stack.avail--;
+
+          continue;
+
+
+        case on_failure_jump:
+        case on_failure_keep_string_jump:
+	handle_on_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+
+          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
+             end of the pattern.  We don't want to push such a point,
+             since when we restore it above, entering the switch will
+             increment `p' past the end of the pattern.  We don't need
+             to push such a point since we obviously won't find any more
+             fastmap entries beyond `pend'.  Such a pattern can match
+             the null string, though.  */
+          if (p + j < pend)
+            {
+              if (!PUSH_PATTERN_OP (p + j, fail_stack))
+		{
+		  RESET_FAIL_STACK ();
+		  return -2;
+		}
+            }
+          else
+            bufp->can_be_null = 1;
+
+          if (succeed_n_p)
+            {
+              EXTRACT_NUMBER_AND_INCR (k, p);	/* Skip the n.  */
+              succeed_n_p = false;
+	    }
+
+          continue;
+
+
+	case succeed_n:
+          /* Get to the number of times to succeed.  */
+          p += 2;		
+
+          /* Increment p past the n for when k != 0.  */
+          EXTRACT_NUMBER_AND_INCR (k, p);
+          if (k == 0)
+	    {
+              p -= 4;
+  	      succeed_n_p = true;  /* Spaghetti code alert.  */
+              goto handle_on_failure_jump;
+            }
+          continue;
+
+
+	case set_number_at:
+          p += 4;
+          continue;
+
+
+	case start_memory:
+        case stop_memory:
+	  p += 2;
+	  continue;
+
+
+	default:
+          abort (); /* We have listed all the cases.  */
+        } /* switch *p++ */
+
+      /* Getting here means we have found the possible starting
+         characters for one path of the pattern -- and that the empty
+         string does not match.  We need not follow this path further.
+         Instead, look at the next alternative (remembered on the
+         stack), or quit if no more.  The test at the top of the loop
+         does these things.  */
+      path_can_be_null = false;
+      p = pend;
+    } /* while p */
+
+  /* Set `can_be_null' for the last path (also the first path, if the
+     pattern is empty).  */
+  bufp->can_be_null |= path_can_be_null;
+
+ done:
+  RESET_FAIL_STACK ();
+  return 0;
+} /* re_compile_fastmap */
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+    struct re_pattern_buffer *bufp;
+    struct re_registers *regs;
+    unsigned num_regs;
+    regoff_t *starts, *ends;
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = (regoff_t *) 0;
+    }
+}
+
+
+/* Searching routines.  */
+
+/* Like re_search_2, below, but only one string is specified, and
+   doesn't let you say where to stop matching. */
+
+int
+re_search (bufp, string, size, startpos, range, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, startpos, range;
+     struct re_registers *regs;
+{
+  return re_search_2 (bufp, NULL, 0, string, size, startpos, range, 
+		      regs, size);
+}
+
+
+/* Using the compiled pattern in BUFP->buffer, first tries to match the
+   virtual concatenation of STRING1 and STRING2, starting first at index
+   STARTPOS, then at STARTPOS + 1, and so on.
+   
+   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
+   
+   RANGE is how far to scan while trying to match.  RANGE = 0 means try
+   only at STARTPOS; in general, the last start tried is STARTPOS +
+   RANGE.
+   
+   In REGS, return the indices of the virtual concatenation of STRING1
+   and STRING2 that matched the entire BUFP->buffer and its contained
+   subexpressions.
+   
+   Do not consider matching one past the index STOP in the virtual
+   concatenation of STRING1 and STRING2.
+
+   We return either the position in the strings at which the match was
+   found, -1 if no match, or -2 if error (such as failure
+   stack overflow).  */
+
+int
+re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+     int stop;
+{
+  int val;
+  register char *fastmap = bufp->fastmap;
+  register char *translate = bufp->translate;
+  int total_size = size1 + size2;
+  int endpos = startpos + range;
+
+  /* Check for out-of-range STARTPOS.  */
+  if (startpos < 0 || startpos > total_size)
+    return -1;
+    
+  /* Fix up RANGE if it might eventually take us outside
+     the virtual concatenation of STRING1 and STRING2.  */
+  if (endpos < -1)
+    range = -1 - startpos;
+  else if (endpos > total_size)
+    range = total_size - startpos;
+
+  /* If the search isn't to be a backwards one, don't waste time in a
+     search for a pattern that must be anchored.  */
+  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0)
+    {
+      if (startpos > 0)
+	return -1;
+      else
+	range = 1;
+    }
+
+  /* Update the fastmap now if not correct already.  */
+  if (fastmap && !bufp->fastmap_accurate)
+    if (re_compile_fastmap (bufp) == -2)
+      return -2;
+  
+  /* Loop through the string, looking for a place to start matching.  */
+  for (;;)
+    { 
+      /* If a fastmap is supplied, skip quickly over characters that
+         cannot be the start of a match.  If the pattern can match the
+         null string, however, we don't need to skip characters; we want
+         the first null string.  */
+      if (fastmap && startpos < total_size && !bufp->can_be_null)
+	{
+	  if (range > 0)	/* Searching forwards.  */
+	    {
+	      register const char *d;
+	      register int lim = 0;
+	      int irange = range;
+
+              if (startpos < size1 && startpos + range >= size1)
+                lim = range - (size1 - startpos);
+
+	      d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
+   
+              /* Written out as an if-else to avoid testing `translate'
+                 inside the loop.  */
+	      if (translate)
+                while (range > lim
+                       && !fastmap[(unsigned char)
+				   translate[(unsigned char) *d++]])
+                  range--;
+	      else
+                while (range > lim && !fastmap[(unsigned char) *d++])
+                  range--;
+
+	      startpos += irange - range;
+	    }
+	  else				/* Searching backwards.  */
+	    {
+	      register char c = (size1 == 0 || startpos >= size1
+                                 ? string2[startpos - size1] 
+                                 : string1[startpos]);
+
+	      if (!fastmap[(unsigned char) TRANSLATE (c)])
+		goto advance;
+	    }
+	}
+
+      /* If can't match the null string, and that's all we have left, fail.  */
+      if (range >= 0 && startpos == total_size && fastmap
+          && !bufp->can_be_null)
+	return -1;
+
+      val = re_match_2_internal (bufp, string1, size1, string2, size2,
+				 startpos, regs, stop);
+#ifndef REGEX_MALLOC
+#ifdef C_ALLOCA
+      alloca (0);
+#endif
+#endif
+
+      if (val >= 0)
+	return startpos;
+        
+      if (val == -2)
+	return -2;
+
+    advance:
+      if (!range) 
+        break;
+      else if (range > 0) 
+        {
+          range--; 
+          startpos++;
+        }
+      else
+        {
+          range++; 
+          startpos--;
+        }
+    }
+  return -1;
+} /* re_search_2 */
+
+
+/* Declarations and macros for re_match_2.  */
+
+static int bcmp_translate ();
+static boolean alt_match_null_string_p (),
+               common_op_match_null_string_p (),
+               group_match_null_string_p ();
+
+/* This converts PTR, a pointer into one of the search strings `string1'
+   and `string2' into an offset from the beginning of that string.  */
+#define POINTER_TO_OFFSET(ptr)			\
+  (FIRST_STRING_P (ptr)				\
+   ? ((regoff_t) ((ptr) - string1))		\
+   : ((regoff_t) ((ptr) - string2 + size1)))
+
+/* Macros for dealing with the split strings in re_match_2.  */
+
+#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
+
+/* Call before fetching a character with *d.  This switches over to
+   string2 if necessary.  */
+#define PREFETCH()							\
+  while (d == dend)						    	\
+    {									\
+      /* End of string2 => fail.  */					\
+      if (dend == end_match_2) 						\
+        goto fail;							\
+      /* End of string1 => advance to string2.  */ 			\
+      d = string2;						        \
+      dend = end_match_2;						\
+    }
+
+
+/* Test if at very beginning or at very end of the virtual concatenation
+   of `string1' and `string2'.  If only one string, it's `string2'.  */
+#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
+#define AT_STRINGS_END(d) ((d) == end2)	
+
+
+/* Test if D points to a character which is word-constituent.  We have
+   two special cases to check for: if past the end of string1, look at
+   the first character in string2; and if before the beginning of
+   string2, look at the last character in string1.  */
+#define WORDCHAR_P(d)							\
+  (SYNTAX ((d) == end1 ? *string2					\
+           : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
+   == Sword)
+
+/* Test if the character before D and the one at D differ with respect
+   to being word-constituent.  */
+#define AT_WORD_BOUNDARY(d)						\
+  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
+   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
+
+
+/* Free everything we malloc.  */
+#ifdef MATCH_MAY_ALLOCATE
+#define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
+#define FREE_VARIABLES()						\
+  do {									\
+    REGEX_FREE_STACK (fail_stack.stack);				\
+    FREE_VAR (regstart);						\
+    FREE_VAR (regend);							\
+    FREE_VAR (old_regstart);						\
+    FREE_VAR (old_regend);						\
+    FREE_VAR (best_regstart);						\
+    FREE_VAR (best_regend);						\
+    FREE_VAR (reg_info);						\
+    FREE_VAR (reg_dummy);						\
+    FREE_VAR (reg_info_dummy);						\
+  } while (0)
+#else
+#define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning.  */
+#endif /* not MATCH_MAY_ALLOCATE */
+
+/* These values must meet several constraints.  They must not be valid
+   register values; since we have a limit of 255 registers (because
+   we use only one byte in the pattern for the register number), we can
+   use numbers larger than 255.  They must differ by 1, because of
+   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
+   be larger than the value for the highest register, so we do not try
+   to actually save any registers when none are active.  */
+#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
+#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
+
+
+/* Matching routines.  */
+
+#ifndef emacs   /* Emacs never uses this.  */
+/* re_match is like re_match_2 except it takes only a single string.  */
+
+int
+re_match (bufp, string, size, pos, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, pos;
+     struct re_registers *regs;
+{
+  int result = re_match_2_internal (bufp, NULL, 0, string, size,
+				    pos, regs, size);
+  alloca (0);
+  return result;
+}
+#endif /* not emacs */
+
+
+/* re_match_2 matches the compiled pattern in BUFP against the
+   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
+   and SIZE2, respectively).  We start matching at POS, and stop
+   matching at STOP.
+   
+   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
+   store offsets for the substring each group matched in REGS.  See the
+   documentation for exactly how many groups we fill.
+
+   We return -1 if no match, -2 if an internal error (such as the
+   failure stack overflowing).  Otherwise, we return the length of the
+   matched substring.  */
+
+int
+re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+{
+  int result = re_match_2_internal (bufp, string1, size1, string2, size2,
+				    pos, regs, stop);
+  alloca (0);
+  return result;
+}
+
+/* This is a separate function so that we can force an alloca cleanup
+   afterwards.  */
+static int
+re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+{
+  /* General temporaries.  */
+  int mcnt;
+  unsigned char *p1;
+
+  /* Just past the end of the corresponding string.  */
+  const char *end1, *end2;
+
+  /* Pointers into string1 and string2, just past the last characters in
+     each to consider matching.  */
+  const char *end_match_1, *end_match_2;
+
+  /* Where we are in the data, and the end of the current string.  */
+  const char *d, *dend;
+  
+  /* Where we are in the pattern, and the end of the pattern.  */
+  unsigned char *p = bufp->buffer;
+  register unsigned char *pend = p + bufp->used;
+
+  /* Mark the opcode just after a start_memory, so we can test for an
+     empty subpattern when we get to the stop_memory.  */
+  unsigned char *just_past_start_mem = 0;
+
+  /* We use this to map every character in the string.  */
+  char *translate = bufp->translate;
+
+  /* Failure point stack.  Each place that can handle a failure further
+     down the line pushes a failure point on this stack.  It consists of
+     restart, regend, and reg_info for all registers corresponding to
+     the subexpressions we're currently inside, plus the number of such
+     registers, and, finally, two char *'s.  The first char * is where
+     to resume scanning the pattern; the second one is where to resume
+     scanning the strings.  If the latter is zero, the failure point is
+     a ``dummy''; if a failure happens and the failure point is a dummy,
+     it gets discarded and the next next one is tried.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
+  fail_stack_type fail_stack;
+#endif
+#ifdef DEBUG
+  static unsigned failure_id = 0;
+  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
+#endif
+
+  /* This holds the pointer to the failure stack, when
+     it is allocated relocatably.  */
+  fail_stack_elt_t *failure_stack_ptr;
+
+  /* We fill all the registers internally, independent of what we
+     return, for use in backreferences.  The number here includes
+     an element for register zero.  */
+  unsigned num_regs = bufp->re_nsub + 1;
+  
+  /* The currently active registers.  */
+  unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+  unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+
+  /* Information on the contents of registers. These are pointers into
+     the input strings; they record just what was matched (on this
+     attempt) by a subexpression part of the pattern, that is, the
+     regnum-th regstart pointer points to where in the pattern we began
+     matching and the regnum-th regend points to right after where we
+     stopped matching the regnum-th subexpression.  (The zeroth register
+     keeps track of what the whole pattern matches.)  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **regstart, **regend;
+#endif
+
+  /* If a group that's operated upon by a repetition operator fails to
+     match anything, then the register for its start will need to be
+     restored because it will have been set to wherever in the string we
+     are when we last see its open-group operator.  Similarly for a
+     register's end.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **old_regstart, **old_regend;
+#endif
+
+  /* The is_active field of reg_info helps us keep track of which (possibly
+     nested) subexpressions we are currently in. The matched_something
+     field of reg_info[reg_num] helps us tell whether or not we have
+     matched any of the pattern so far this time through the reg_num-th
+     subexpression.  These two fields get reset each time through any
+     loop their register is in.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
+  register_info_type *reg_info; 
+#endif
+
+  /* The following record the register info as found in the above
+     variables when we find a match better than any we've seen before. 
+     This happens as we backtrack through the failure points, which in
+     turn happens only if we have not yet matched the entire string. */
+  unsigned best_regs_set = false;
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **best_regstart, **best_regend;
+#endif
+  
+  /* Logically, this is `best_regend[0]'.  But we don't want to have to
+     allocate space for that if we're not allocating space for anything
+     else (see below).  Also, we never need info about register 0 for
+     any of the other register vectors, and it seems rather a kludge to
+     treat `best_regend' differently than the rest.  So we keep track of
+     the end of the best match so far in a separate variable.  We
+     initialize this to NULL so that when we backtrack the first time
+     and need to test it, it's not garbage.  */
+  const char *match_end = NULL;
+
+  /* This helps SET_REGS_MATCHED avoid doing redundant work.  */
+  int set_regs_matched_done = 0;
+
+  /* Used when we pop values we don't care about.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **reg_dummy;
+  register_info_type *reg_info_dummy;
+#endif
+
+#ifdef DEBUG
+  /* Counts the total number of registers pushed.  */
+  unsigned num_regs_pushed = 0; 	
+#endif
+
+  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
+  
+  INIT_FAIL_STACK ();
+  
+#ifdef MATCH_MAY_ALLOCATE
+  /* Do not bother to initialize all the register variables if there are
+     no groups in the pattern, as it takes a fair amount of time.  If
+     there are groups, we include space for register 0 (the whole
+     pattern), even though we never use it, since it simplifies the
+     array indexing.  We should fix this.  */
+  if (bufp->re_nsub)
+    {
+      regstart = REGEX_TALLOC (num_regs, const char *);
+      regend = REGEX_TALLOC (num_regs, const char *);
+      old_regstart = REGEX_TALLOC (num_regs, const char *);
+      old_regend = REGEX_TALLOC (num_regs, const char *);
+      best_regstart = REGEX_TALLOC (num_regs, const char *);
+      best_regend = REGEX_TALLOC (num_regs, const char *);
+      reg_info = REGEX_TALLOC (num_regs, register_info_type);
+      reg_dummy = REGEX_TALLOC (num_regs, const char *);
+      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
+
+      if (!(regstart && regend && old_regstart && old_regend && reg_info 
+            && best_regstart && best_regend && reg_dummy && reg_info_dummy)) 
+        {
+          FREE_VARIABLES ();
+          return -2;
+        }
+    }
+  else
+    {
+      /* We must initialize all our variables to NULL, so that
+         `FREE_VARIABLES' doesn't try to free them.  */
+      regstart = regend = old_regstart = old_regend = best_regstart
+        = best_regend = reg_dummy = NULL;
+      reg_info = reg_info_dummy = (register_info_type *) NULL;
+    }
+#endif /* MATCH_MAY_ALLOCATE */
+
+  /* The starting position is bogus.  */
+  if (pos < 0 || pos > size1 + size2)
+    {
+      FREE_VARIABLES ();
+      return -1;
+    }
+    
+  /* Initialize subexpression text positions to -1 to mark ones that no
+     start_memory/stop_memory has been seen for. Also initialize the
+     register information struct.  */
+  for (mcnt = 1; mcnt < num_regs; mcnt++)
+    {
+      regstart[mcnt] = regend[mcnt] 
+        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
+        
+      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
+      IS_ACTIVE (reg_info[mcnt]) = 0;
+      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+    }
+  
+  /* We move `string1' into `string2' if the latter's empty -- but not if
+     `string1' is null.  */
+  if (size2 == 0 && string1 != NULL)
+    {
+      string2 = string1;
+      size2 = size1;
+      string1 = 0;
+      size1 = 0;
+    }
+  end1 = string1 + size1;
+  end2 = string2 + size2;
+
+  /* Compute where to stop matching, within the two strings.  */
+  if (stop <= size1)
+    {
+      end_match_1 = string1 + stop;
+      end_match_2 = string2;
+    }
+  else
+    {
+      end_match_1 = end1;
+      end_match_2 = string2 + stop - size1;
+    }
+
+  /* `p' scans through the pattern as `d' scans through the data. 
+     `dend' is the end of the input string that `d' points within.  `d'
+     is advanced into the following input string whenever necessary, but
+     this happens before fetching; therefore, at the beginning of the
+     loop, `d' can be pointing at the end of a string, but it cannot
+     equal `string2'.  */
+  if (size1 > 0 && pos <= size1)
+    {
+      d = string1 + pos;
+      dend = end_match_1;
+    }
+  else
+    {
+      d = string2 + pos - size1;
+      dend = end_match_2;
+    }
+
+  DEBUG_PRINT1 ("The compiled pattern is: ");
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
+  DEBUG_PRINT1 ("The string to match is: `");
+  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
+  DEBUG_PRINT1 ("'\n");
+  
+  /* This loops over pattern commands.  It exits by returning from the
+     function if the match is complete, or it drops through if the match
+     fails at this starting point in the input data.  */
+  for (;;)
+    {
+      DEBUG_PRINT2 ("\n0x%x: ", p);
+
+      if (p == pend)
+	{ /* End of pattern means we might have succeeded.  */
+          DEBUG_PRINT1 ("end of pattern ... ");
+          
+	  /* If we haven't matched the entire string, and we want the
+             longest match, try backtracking.  */
+          if (d != end_match_2)
+	    {
+	      /* 1 if this match ends in the same string (string1 or string2)
+		 as the best previous match.  */
+	      boolean same_str_p = (FIRST_STRING_P (match_end) 
+				    == MATCHING_IN_FIRST_STRING);
+	      /* 1 if this match is the best seen so far.  */
+	      boolean best_match_p;
+
+	      /* AIX compiler got confused when this was combined
+		 with the previous declaration.  */
+	      if (same_str_p)
+		best_match_p = d > match_end;
+	      else
+		best_match_p = !MATCHING_IN_FIRST_STRING;
+
+              DEBUG_PRINT1 ("backtracking.\n");
+              
+              if (!FAIL_STACK_EMPTY ())
+                { /* More failure points to try.  */
+
+                  /* If exceeds best match so far, save it.  */
+                  if (!best_regs_set || best_match_p)
+                    {
+                      best_regs_set = true;
+                      match_end = d;
+                      
+                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
+                      
+                      for (mcnt = 1; mcnt < num_regs; mcnt++)
+                        {
+                          best_regstart[mcnt] = regstart[mcnt];
+                          best_regend[mcnt] = regend[mcnt];
+                        }
+                    }
+                  goto fail;	       
+                }
+
+              /* If no failure points, don't restore garbage.  And if
+                 last match is real best match, don't restore second
+                 best one. */
+              else if (best_regs_set && !best_match_p)
+                {
+  	        restore_best_regs:
+                  /* Restore best match.  It may happen that `dend ==
+                     end_match_1' while the restored d is in string2.
+                     For example, the pattern `x.*y.*z' against the
+                     strings `x-' and `y-z-', if the two strings are
+                     not consecutive in memory.  */
+                  DEBUG_PRINT1 ("Restoring best registers.\n");
+                  
+                  d = match_end;
+                  dend = ((d >= string1 && d <= end1)
+		           ? end_match_1 : end_match_2);
+
+		  for (mcnt = 1; mcnt < num_regs; mcnt++)
+		    {
+		      regstart[mcnt] = best_regstart[mcnt];
+		      regend[mcnt] = best_regend[mcnt];
+		    }
+                }
+            } /* d != end_match_2 */
+
+	succeed_label:
+          DEBUG_PRINT1 ("Accepting match.\n");
+
+          /* If caller wants register contents data back, do it.  */
+          if (regs && !bufp->no_sub)
+	    {
+              /* Have the register data arrays been allocated?  */
+              if (bufp->regs_allocated == REGS_UNALLOCATED)
+                { /* No.  So allocate them with malloc.  We need one
+                     extra element beyond `num_regs' for the `-1' marker
+                     GNU code uses.  */
+                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
+                  regs->start = TALLOC (regs->num_regs, regoff_t);
+                  regs->end = TALLOC (regs->num_regs, regoff_t);
+                  if (regs->start == NULL || regs->end == NULL)
+		    {
+		      FREE_VARIABLES ();
+		      return -2;
+		    }
+                  bufp->regs_allocated = REGS_REALLOCATE;
+                }
+              else if (bufp->regs_allocated == REGS_REALLOCATE)
+                { /* Yes.  If we need more elements than were already
+                     allocated, reallocate them.  If we need fewer, just
+                     leave it alone.  */
+                  if (regs->num_regs < num_regs + 1)
+                    {
+                      regs->num_regs = num_regs + 1;
+                      RETALLOC (regs->start, regs->num_regs, regoff_t);
+                      RETALLOC (regs->end, regs->num_regs, regoff_t);
+                      if (regs->start == NULL || regs->end == NULL)
+			{
+			  FREE_VARIABLES ();
+			  return -2;
+			}
+                    }
+                }
+              else
+		{
+		  /* These braces fend off a "empty body in an else-statement"
+		     warning under GCC when assert expands to nothing.  */
+		  assert (bufp->regs_allocated == REGS_FIXED);
+		}
+
+              /* Convert the pointer data in `regstart' and `regend' to
+                 indices.  Register zero has to be set differently,
+                 since we haven't kept track of any info for it.  */
+              if (regs->num_regs > 0)
+                {
+                  regs->start[0] = pos;
+                  regs->end[0] = (MATCHING_IN_FIRST_STRING
+				  ? ((regoff_t) (d - string1))
+			          : ((regoff_t) (d - string2 + size1)));
+                }
+              
+              /* Go through the first `min (num_regs, regs->num_regs)'
+                 registers, since that is all we initialized.  */
+	      for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++)
+		{
+                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
+                    regs->start[mcnt] = regs->end[mcnt] = -1;
+                  else
+                    {
+		      regs->start[mcnt]
+			= (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
+                      regs->end[mcnt]
+			= (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
+                    }
+		}
+              
+              /* If the regs structure we return has more elements than
+                 were in the pattern, set the extra elements to -1.  If
+                 we (re)allocated the registers, this is the case,
+                 because we always allocate enough to have at least one
+                 -1 at the end.  */
+              for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++)
+                regs->start[mcnt] = regs->end[mcnt] = -1;
+	    } /* regs && !bufp->no_sub */
+
+          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
+                        nfailure_points_pushed, nfailure_points_popped,
+                        nfailure_points_pushed - nfailure_points_popped);
+          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
+
+          mcnt = d - pos - (MATCHING_IN_FIRST_STRING 
+			    ? string1 
+			    : string2 - size1);
+
+          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
+
+          FREE_VARIABLES ();
+          return mcnt;
+        }
+
+      /* Otherwise match next pattern command.  */
+      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
+	{
+        /* Ignore these.  Used to ignore the n of succeed_n's which
+           currently have n == 0.  */
+        case no_op:
+          DEBUG_PRINT1 ("EXECUTING no_op.\n");
+          break;
+
+	case succeed:
+          DEBUG_PRINT1 ("EXECUTING succeed.\n");
+	  goto succeed_label;
+
+        /* Match the next n pattern characters exactly.  The following
+           byte in the pattern defines n, and the n bytes after that
+           are the characters to match.  */
+	case exactn:
+	  mcnt = *p++;
+          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
+
+          /* This is written out as an if-else so we don't waste time
+             testing `translate' inside the loop.  */
+          if (translate)
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if (translate[(unsigned char) *d++] != (char) *p++)
+                    goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  else
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if (*d++ != (char) *p++) goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  SET_REGS_MATCHED ();
+          break;
+
+
+        /* Match any character except possibly a newline or a null.  */
+	case anychar:
+          DEBUG_PRINT1 ("EXECUTING anychar.\n");
+
+          PREFETCH ();
+
+          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
+              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
+	    goto fail;
+
+          SET_REGS_MATCHED ();
+          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+          d++;
+	  break;
+
+
+	case charset:
+	case charset_not:
+	  {
+	    register unsigned char c;
+	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
+
+            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
+
+	    PREFETCH ();
+	    c = TRANSLATE (*d); /* The character to match.  */
+
+            /* Cast to `unsigned' instead of `unsigned char' in case the
+               bit list is a full 32 bytes long.  */
+	    if (c < (unsigned) (*p * BYTEWIDTH)
+		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+	      not = !not;
+
+	    p += 1 + *p;
+
+	    if (!not) goto fail;
+            
+	    SET_REGS_MATCHED ();
+            d++;
+	    break;
+	  }
+
+
+        /* The beginning of a group is represented by start_memory.
+           The arguments are the register number in the next byte, and the
+           number of groups inner to this one in the next.  The text
+           matched within the group is recorded (in the internal
+           registers data structure) under the register number.  */
+        case start_memory:
+	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+
+          /* Find out if this group can match the empty string.  */
+	  p1 = p;		/* To send to group_match_null_string_p.  */
+          
+          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
+            REG_MATCH_NULL_STRING_P (reg_info[*p]) 
+              = group_match_null_string_p (&p1, pend, reg_info);
+
+          /* Save the position in the string where we were the last time
+             we were at this open-group operator in case the group is
+             operated upon by a repetition operator, e.g., with `(a*)*b'
+             against `ab'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
+                             : regstart[*p];
+	  DEBUG_PRINT2 ("  old_regstart: %d\n", 
+			 POINTER_TO_OFFSET (old_regstart[*p]));
+
+          regstart[*p] = d;
+	  DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
+
+          IS_ACTIVE (reg_info[*p]) = 1;
+          MATCHED_SOMETHING (reg_info[*p]) = 0;
+
+	  /* Clear this whenever we change the register activity status.  */
+	  set_regs_matched_done = 0;
+          
+          /* This is the new highest active register.  */
+          highest_active_reg = *p;
+          
+          /* If nothing was active before, this is the new lowest active
+             register.  */
+          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+            lowest_active_reg = *p;
+
+          /* Move past the register number and inner group count.  */
+          p += 2;
+	  just_past_start_mem = p;
+
+          break;
+
+
+        /* The stop_memory opcode represents the end of a group.  Its
+           arguments are the same as start_memory's: the register
+           number, and the number of inner groups.  */
+	case stop_memory:
+	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+             
+          /* We need to save the string position the last time we were at
+             this close-group operator in case the group is operated
+             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
+             against `aba'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
+			   : regend[*p];
+	  DEBUG_PRINT2 ("      old_regend: %d\n", 
+			 POINTER_TO_OFFSET (old_regend[*p]));
+
+          regend[*p] = d;
+	  DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
+
+          /* This register isn't active anymore.  */
+          IS_ACTIVE (reg_info[*p]) = 0;
+
+	  /* Clear this whenever we change the register activity status.  */
+	  set_regs_matched_done = 0;
+
+          /* If this was the only register active, nothing is active
+             anymore.  */
+          if (lowest_active_reg == highest_active_reg)
+            {
+              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+            }
+          else
+            { /* We must scan for the new highest active register, since
+                 it isn't necessarily one less than now: consider
+                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
+                 new highest active register is 1.  */
+              unsigned char r = *p - 1;
+              while (r > 0 && !IS_ACTIVE (reg_info[r]))
+                r--;
+              
+              /* If we end up at register zero, that means that we saved
+                 the registers as the result of an `on_failure_jump', not
+                 a `start_memory', and we jumped to past the innermost
+                 `stop_memory'.  For example, in ((.)*) we save
+                 registers 1 and 2 as a result of the *, but when we pop
+                 back to the second ), we are at the stop_memory 1.
+                 Thus, nothing is active.  */
+	      if (r == 0)
+                {
+                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+                }
+              else
+                highest_active_reg = r;
+            }
+          
+          /* If just failed to match something this time around with a
+             group that's operated on by a repetition operator, try to
+             force exit from the ``loop'', and restore the register
+             information for this group that we had before trying this
+             last match.  */
+          if ((!MATCHED_SOMETHING (reg_info[*p])
+               || just_past_start_mem == p - 1)
+	      && (p + 2) < pend)              
+            {
+              boolean is_a_jump_n = false;
+              
+              p1 = p + 2;
+              mcnt = 0;
+              switch ((re_opcode_t) *p1++)
+                {
+                  case jump_n:
+		    is_a_jump_n = true;
+                  case pop_failure_jump:
+		  case maybe_pop_jump:
+		  case jump:
+		  case dummy_failure_jump:
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+		    if (is_a_jump_n)
+		      p1 += 2;
+                    break;
+                  
+                  default:
+                    /* do nothing */ ;
+                }
+	      p1 += mcnt;
+        
+              /* If the next operation is a jump backwards in the pattern
+	         to an on_failure_jump right before the start_memory
+                 corresponding to this stop_memory, exit from the loop
+                 by forcing a failure after pushing on the stack the
+                 on_failure_jump's jump in the pattern, and d.  */
+              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
+                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
+		{
+                  /* If this group ever matched anything, then restore
+                     what its registers were before trying this last
+                     failed match, e.g., with `(a*)*b' against `ab' for
+                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
+                     against `aba' for regend[3].
+                     
+                     Also restore the registers for inner groups for,
+                     e.g., `((a*)(b*))*' against `aba' (register 3 would
+                     otherwise get trashed).  */
+                     
+                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
+		    {
+		      unsigned r; 
+        
+                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
+                      
+		      /* Restore this and inner groups' (if any) registers.  */
+                      for (r = *p; r < *p + *(p + 1); r++)
+                        {
+                          regstart[r] = old_regstart[r];
+
+                          /* xx why this test?  */
+                          if (old_regend[r] >= regstart[r])
+                            regend[r] = old_regend[r];
+                        }     
+                    }
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
+
+                  goto fail;
+                }
+            }
+          
+          /* Move past the register number and the inner group count.  */
+          p += 2;
+          break;
+
+
+	/* \<digit> has been turned into a `duplicate' command which is
+           followed by the numeric value of <digit> as the register number.  */
+        case duplicate:
+	  {
+	    register const char *d2, *dend2;
+	    int regno = *p++;   /* Get which register to match against.  */
+	    DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
+
+	    /* Can't back reference a group which we've never matched.  */
+            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
+              goto fail;
+              
+            /* Where in input to try to start matching.  */
+            d2 = regstart[regno];
+            
+            /* Where to stop matching; if both the place to start and
+               the place to stop matching are in the same string, then
+               set to the place to stop, otherwise, for now have to use
+               the end of the first string.  */
+
+            dend2 = ((FIRST_STRING_P (regstart[regno]) 
+		      == FIRST_STRING_P (regend[regno]))
+		     ? regend[regno] : end_match_1);
+	    for (;;)
+	      {
+		/* If necessary, advance to next segment in register
+                   contents.  */
+		while (d2 == dend2)
+		  {
+		    if (dend2 == end_match_2) break;
+		    if (dend2 == regend[regno]) break;
+
+                    /* End of string1 => advance to string2. */
+                    d2 = string2;
+                    dend2 = regend[regno];
+		  }
+		/* At end of register contents => success */
+		if (d2 == dend2) break;
+
+		/* If necessary, advance to next segment in data.  */
+		PREFETCH ();
+
+		/* How many characters left in this segment to match.  */
+		mcnt = dend - d;
+                
+		/* Want how many consecutive characters we can match in
+                   one shot, so, if necessary, adjust the count.  */
+                if (mcnt > dend2 - d2)
+		  mcnt = dend2 - d2;
+                  
+		/* Compare that many; failure if mismatch, else move
+                   past them.  */
+		if (translate 
+                    ? bcmp_translate (d, d2, mcnt, translate) 
+                    : bcmp (d, d2, mcnt))
+		  goto fail;
+		d += mcnt, d2 += mcnt;
+
+		/* Do this because we've match some characters.  */
+		SET_REGS_MATCHED ();
+	      }
+	  }
+	  break;
+
+
+        /* begline matches the empty string at the beginning of the string
+           (unless `not_bol' is set in `bufp'), and, if
+           `newline_anchor' is set, after newlines.  */
+	case begline:
+          DEBUG_PRINT1 ("EXECUTING begline.\n");
+          
+          if (AT_STRINGS_BEG (d))
+            {
+              if (!bufp->not_bol) break;
+            }
+          else if (d[-1] == '\n' && bufp->newline_anchor)
+            {
+              break;
+            }
+          /* In all other cases, we fail.  */
+          goto fail;
+
+
+        /* endline is the dual of begline.  */
+	case endline:
+          DEBUG_PRINT1 ("EXECUTING endline.\n");
+
+          if (AT_STRINGS_END (d))
+            {
+              if (!bufp->not_eol) break;
+            }
+          
+          /* We have to ``prefetch'' the next character.  */
+          else if ((d == end1 ? *string2 : *d) == '\n'
+                   && bufp->newline_anchor)
+            {
+              break;
+            }
+          goto fail;
+
+
+	/* Match at the very beginning of the data.  */
+        case begbuf:
+          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
+          if (AT_STRINGS_BEG (d))
+            break;
+          goto fail;
+
+
+	/* Match at the very end of the data.  */
+        case endbuf:
+          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
+	  if (AT_STRINGS_END (d))
+	    break;
+          goto fail;
+
+
+        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
+           pushes NULL as the value for the string on the stack.  Then
+           `pop_failure_point' will keep the current value for the
+           string, instead of restoring it.  To see why, consider
+           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
+           then the . fails against the \n.  But the next thing we want
+           to do is match the \n against the \n; if we restored the
+           string value, we would be back at the foo.
+           
+           Because this is used only in specific cases, we don't need to
+           check all the things that `on_failure_jump' does, to make
+           sure the right things get saved on the stack.  Hence we don't
+           share its code.  The only reason to push anything on the
+           stack at all is that otherwise we would have to change
+           `anychar's code to do something besides goto fail in this
+           case; that seems worse than this.  */
+        case on_failure_keep_string_jump:
+          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
+          
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
+
+          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
+          break;
+
+
+	/* Uses of on_failure_jump:
+        
+           Each alternative starts with an on_failure_jump that points
+           to the beginning of the next alternative.  Each alternative
+           except the last ends with a jump that in effect jumps past
+           the rest of the alternatives.  (They really jump to the
+           ending jump of the following alternative, because tensioning
+           these jumps is a hassle.)
+
+           Repeats start with an on_failure_jump that points past both
+           the repetition text and either the following jump or
+           pop_failure_jump back to this on_failure_jump.  */
+	case on_failure_jump:
+        on_failure:
+          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
+
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
+
+          /* If this on_failure_jump comes right before a group (i.e.,
+             the original * applied to a group), save the information
+             for that group and all inner ones, so that if we fail back
+             to this point, the group's information will be correct.
+             For example, in \(a*\)*\1, we need the preceding group,
+             and in \(\(a*\)b*\)\2, we need the inner group.  */
+
+          /* We can't use `p' to check ahead because we push
+             a failure point to `p + mcnt' after we do this.  */
+          p1 = p;
+
+          /* We need to skip no_op's before we look for the
+             start_memory in case this on_failure_jump is happening as
+             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
+             against aba.  */
+          while (p1 < pend && (re_opcode_t) *p1 == no_op)
+            p1++;
+
+          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
+            {
+              /* We have a new highest active register now.  This will
+                 get reset at the start_memory we are about to get to,
+                 but we will have saved all the registers relevant to
+                 this repetition op, as described above.  */
+              highest_active_reg = *(p1 + 1) + *(p1 + 2);
+              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+                lowest_active_reg = *(p1 + 1);
+            }
+
+          DEBUG_PRINT1 (":\n");
+          PUSH_FAILURE_POINT (p + mcnt, d, -2);
+          break;
+
+
+        /* A smart repeat ends with `maybe_pop_jump'.
+	   We change it to either `pop_failure_jump' or `jump'.  */
+        case maybe_pop_jump:
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
+          {
+	    register unsigned char *p2 = p;
+
+            /* Compare the beginning of the repeat with what in the
+               pattern follows its end. If we can establish that there
+               is nothing that they would both match, i.e., that we
+               would have to backtrack because of (as in, e.g., `a*a')
+               then we can change to pop_failure_jump, because we'll
+               never have to backtrack.
+               
+               This is not true in the case of alternatives: in
+               `(a|ab)*' we do need to backtrack to the `ab' alternative
+               (e.g., if the string was `ab').  But instead of trying to
+               detect that here, the alternative has put on a dummy
+               failure point which is what we will end up popping.  */
+
+	    /* Skip over open/close-group commands.
+	       If what follows this loop is a ...+ construct,
+	       look at what begins its body, since we will have to
+	       match at least one of that.  */
+	    while (1)
+	      {
+		if (p2 + 2 < pend
+		    && ((re_opcode_t) *p2 == stop_memory
+			|| (re_opcode_t) *p2 == start_memory))
+		  p2 += 3;
+		else if (p2 + 6 < pend
+			 && (re_opcode_t) *p2 == dummy_failure_jump)
+		  p2 += 6;
+		else
+		  break;
+	      }
+
+	    p1 = p + mcnt;
+	    /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
+	       to the `maybe_finalize_jump' of this case.  Examine what 
+	       follows.  */
+
+            /* If we're at the end of the pattern, we can change.  */
+            if (p2 == pend)
+	      {
+		/* Consider what happens when matching ":\(.*\)"
+		   against ":/".  I don't really understand this code
+		   yet.  */
+  	        p[-3] = (unsigned char) pop_failure_jump;
+                DEBUG_PRINT1
+                  ("  End of pattern: change to `pop_failure_jump'.\n");
+              }
+
+            else if ((re_opcode_t) *p2 == exactn
+		     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
+	      {
+		register unsigned char c
+                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
+
+                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
+                  {
+  		    p[-3] = (unsigned char) pop_failure_jump;
+                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+                                  c, p1[5]);
+                  }
+                  
+		else if ((re_opcode_t) p1[3] == charset
+			 || (re_opcode_t) p1[3] == charset_not)
+		  {
+		    int not = (re_opcode_t) p1[3] == charset_not;
+                    
+		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+		      not = !not;
+
+                    /* `not' is equal to 1 if c would match, which means
+                        that we can't change to pop_failure_jump.  */
+		    if (!not)
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+	      }
+            else if ((re_opcode_t) *p2 == charset)
+	      {
+#ifdef DEBUG
+		register unsigned char c
+                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
+#endif
+
+                if ((re_opcode_t) p1[3] == exactn
+		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[4]
+			  && (p2[1 + p1[4] / BYTEWIDTH]
+			      & (1 << (p1[4] % BYTEWIDTH)))))
+                  {
+  		    p[-3] = (unsigned char) pop_failure_jump;
+                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+                                  c, p1[5]);
+                  }
+                  
+		else if ((re_opcode_t) p1[3] == charset_not)
+		  {
+		    int idx;
+		    /* We win if the charset_not inside the loop
+		       lists every character listed in the charset after.  */
+		    for (idx = 0; idx < (int) p2[1]; idx++)
+		      if (! (p2[2 + idx] == 0
+			     || (idx < (int) p1[4]
+				 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
+			break;
+
+		    if (idx == p2[1])
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+		else if ((re_opcode_t) p1[3] == charset)
+		  {
+		    int idx;
+		    /* We win if the charset inside the loop
+		       has no overlap with the one after the loop.  */
+		    for (idx = 0;
+			 idx < (int) p2[1] && idx < (int) p1[4];
+			 idx++)
+		      if ((p2[2 + idx] & p1[5 + idx]) != 0)
+			break;
+
+		    if (idx == p2[1] || idx == p1[4])
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+	      }
+	  }
+	  p -= 2;		/* Point at relative address again.  */
+	  if ((re_opcode_t) p[-1] != pop_failure_jump)
+	    {
+	      p[-1] = (unsigned char) jump;
+              DEBUG_PRINT1 ("  Match => jump.\n");
+	      goto unconditional_jump;
+	    }
+        /* Note fall through.  */
+
+
+	/* The end of a simple repeat has a pop_failure_jump back to
+           its matching on_failure_jump, where the latter will push a
+           failure point.  The pop_failure_jump takes off failure
+           points put on by this pop_failure_jump's matching
+           on_failure_jump; we got through the pattern to here from the
+           matching on_failure_jump, so didn't fail.  */
+        case pop_failure_jump:
+          {
+            /* We need to pass separate storage for the lowest and
+               highest registers, even though we don't care about the
+               actual values.  Otherwise, we will restore only one
+               register from the stack, since lowest will == highest in
+               `pop_failure_point'.  */
+            unsigned dummy_low_reg, dummy_high_reg;
+            unsigned char *pdummy;
+            const char *sdummy;
+
+            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
+            POP_FAILURE_POINT (sdummy, pdummy,
+                               dummy_low_reg, dummy_high_reg,
+                               reg_dummy, reg_dummy, reg_info_dummy);
+          }
+          /* Note fall through.  */
+
+          
+        /* Unconditionally jump (without popping any failure points).  */
+        case jump:
+	unconditional_jump:
+	  EXTRACT_NUMBER_AND_INCR (mcnt, p);	/* Get the amount to jump.  */
+          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
+	  p += mcnt;				/* Do the jump.  */
+          DEBUG_PRINT2 ("(to 0x%x).\n", p);
+	  break;
+
+	
+        /* We need this opcode so we can detect where alternatives end
+           in `group_match_null_string_p' et al.  */
+        case jump_past_alt:
+          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
+          goto unconditional_jump;
+
+
+        /* Normally, the on_failure_jump pushes a failure point, which
+           then gets popped at pop_failure_jump.  We will end up at
+           pop_failure_jump, also, and with a pattern of, say, `a+', we
+           are skipping over the on_failure_jump, so we have to push
+           something meaningless for pop_failure_jump to pop.  */
+        case dummy_failure_jump:
+          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
+          /* It doesn't matter what we push for the string here.  What
+             the code at `fail' tests is the value for the pattern.  */
+          PUSH_FAILURE_POINT (0, 0, -2);
+          goto unconditional_jump;
+
+
+        /* At the end of an alternative, we need to push a dummy failure
+           point in case we are followed by a `pop_failure_jump', because
+           we don't want the failure point for the alternative to be
+           popped.  For example, matching `(a|ab)*' against `aab'
+           requires that we match the `ab' alternative.  */
+        case push_dummy_failure:
+          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
+          /* See comments just above at `dummy_failure_jump' about the
+             two zeroes.  */
+          PUSH_FAILURE_POINT (0, 0, -2);
+          break;
+
+        /* Have to succeed matching what follows at least n times.
+           After that, handle like `on_failure_jump'.  */
+        case succeed_n: 
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
+
+          assert (mcnt >= 0);
+          /* Originally, this is how many times we HAVE to succeed.  */
+          if (mcnt > 0)
+            {
+               mcnt--;
+	       p += 2;
+               STORE_NUMBER_AND_INCR (p, mcnt);
+               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p, mcnt);
+            }
+	  else if (mcnt == 0)
+            {
+              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
+	      p[2] = (unsigned char) no_op;
+              p[3] = (unsigned char) no_op;
+              goto on_failure;
+            }
+          break;
+        
+        case jump_n: 
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
+
+          /* Originally, this is how many times we CAN jump.  */
+          if (mcnt)
+            {
+               mcnt--;
+               STORE_NUMBER (p + 2, mcnt);
+	       goto unconditional_jump;	     
+            }
+          /* If don't have to jump any more, skip over the rest of command.  */
+	  else      
+	    p += 4;		     
+          break;
+        
+	case set_number_at:
+	  {
+            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            p1 = p + mcnt;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
+	    STORE_NUMBER (p1, mcnt);
+            break;
+          }
+
+        case wordbound:
+          DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+          if (AT_WORD_BOUNDARY (d))
+	    break;
+          goto fail;
+
+	case notwordbound:
+          DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+	  if (AT_WORD_BOUNDARY (d))
+	    goto fail;
+          break;
+
+	case wordbeg:
+          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
+	  if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
+	    break;
+          goto fail;
+
+	case wordend:
+          DEBUG_PRINT1 ("EXECUTING wordend.\n");
+	  if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
+              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
+	    break;
+          goto fail;
+
+#ifdef emacs
+  	case before_dot:
+          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) >= point)
+  	    goto fail;
+  	  break;
+  
+  	case at_dot:
+          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) != point)
+  	    goto fail;
+  	  break;
+  
+  	case after_dot:
+          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
+          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
+  	    goto fail;
+  	  break;
+#if 0 /* not emacs19 */
+	case at_dot:
+          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+	  if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point)
+	    goto fail;
+	  break;
+#endif /* not emacs19 */
+
+	case syntaxspec:
+          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchsyntax;
+
+        case wordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
+	  mcnt = (int) Sword;
+        matchsyntax:
+	  PREFETCH ();
+	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
+	  d++;
+	  if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
+	    goto fail;
+          SET_REGS_MATCHED ();
+	  break;
+
+	case notsyntaxspec:
+          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchnotsyntax;
+
+        case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
+	  mcnt = (int) Sword;
+        matchnotsyntax:
+	  PREFETCH ();
+	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
+	  d++;
+	  if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
+	    goto fail;
+	  SET_REGS_MATCHED ();
+          break;
+
+#else /* not emacs */
+	case wordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
+	  PREFETCH ();
+          if (!WORDCHAR_P (d))
+            goto fail;
+	  SET_REGS_MATCHED ();
+          d++;
+	  break;
+	  
+	case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
+	  PREFETCH ();
+	  if (WORDCHAR_P (d))
+            goto fail;
+          SET_REGS_MATCHED ();
+          d++;
+	  break;
+#endif /* not emacs */
+          
+        default:
+          abort ();
+	}
+      continue;  /* Successfully executed one pattern command; keep going.  */
+
+
+    /* We goto here if a matching operation fails. */
+    fail:
+      if (!FAIL_STACK_EMPTY ())
+	{ /* A restart point is known.  Restore to that state.  */
+          DEBUG_PRINT1 ("\nFAIL:\n");
+          POP_FAILURE_POINT (d, p,
+                             lowest_active_reg, highest_active_reg,
+                             regstart, regend, reg_info);
+
+          /* If this failure point is a dummy, try the next one.  */
+          if (!p)
+	    goto fail;
+
+          /* If we failed to the end of the pattern, don't examine *p.  */
+	  assert (p <= pend);
+          if (p < pend)
+            {
+              boolean is_a_jump_n = false;
+              
+              /* If failed to a backwards jump that's part of a repetition
+                 loop, need to pop this failure point and use the next one.  */
+              switch ((re_opcode_t) *p)
+                {
+                case jump_n:
+                  is_a_jump_n = true;
+                case maybe_pop_jump:
+                case pop_failure_jump:
+                case jump:
+                  p1 = p + 1;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  p1 += mcnt;	
+
+                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
+                      || (!is_a_jump_n
+                          && (re_opcode_t) *p1 == on_failure_jump))
+                    goto fail;
+                  break;
+                default:
+                  /* do nothing */ ;
+                }
+            }
+
+          if (d >= string1 && d <= end1)
+	    dend = end_match_1;
+        }
+      else
+        break;   /* Matching at this starting point really fails.  */
+    } /* for (;;) */
+
+  if (best_regs_set)
+    goto restore_best_regs;
+
+  FREE_VARIABLES ();
+
+  return -1;         			/* Failure to match.  */
+} /* re_match_2 */
+
+
+/* Subroutine definitions for re_match_2.  */
+
+
+/* We are passed P pointing to a register number after a start_memory.
+   
+   Return true if the pattern up to the corresponding stop_memory can
+   match the empty string, and false otherwise.
+   
+   If we find the matching stop_memory, sets P to point to one past its number.
+   Otherwise, sets P to an undefined byte less than or equal to END.
+
+   We don't handle duplicates properly (yet).  */
+
+static boolean
+group_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  /* Point to after the args to the start_memory.  */
+  unsigned char *p1 = *p + 2;
+  
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and return true or
+	 false, as appropriate, when we get to one that can't, or to the
+         matching stop_memory.  */
+      
+      switch ((re_opcode_t) *p1)
+        {
+        /* Could be either a loop or a series of alternatives.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          
+          /* If the next operation is not a jump backwards in the
+	     pattern.  */
+
+	  if (mcnt >= 0)
+	    {
+              /* Go through the on_failure_jumps of the alternatives,
+                 seeing if any of the alternatives cannot match nothing.
+                 The last alternative starts with only a jump,
+                 whereas the rest start with on_failure_jump and end
+                 with a jump, e.g., here is the pattern for `a|b|c':
+
+                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
+                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
+                 /exactn/1/c						
+
+                 So, we have to first go through the first (n-1)
+                 alternatives and then deal with the last one separately.  */
+
+
+              /* Deal with the first (n-1) alternatives, which start
+                 with an on_failure_jump (see above) that jumps to right
+                 past a jump_past_alt.  */
+
+              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
+                {
+                  /* `mcnt' holds how many bytes long the alternative
+                     is, including the ending `jump_past_alt' and
+                     its number.  */
+
+                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3, 
+				                      reg_info))
+                    return false;
+
+                  /* Move to right after this alternative, including the
+		     jump_past_alt.  */
+                  p1 += mcnt;	
+
+                  /* Break if it's the beginning of an n-th alternative
+                     that doesn't begin with an on_failure_jump.  */
+                  if ((re_opcode_t) *p1 != on_failure_jump)
+                    break;
+		
+		  /* Still have to check that it's not an n-th
+		     alternative that starts with an on_failure_jump.  */
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
+                    {
+		      /* Get to the beginning of the n-th alternative.  */
+                      p1 -= 3;
+                      break;
+                    }
+                }
+
+              /* Deal with the last alternative: go back and get number
+                 of the `jump_past_alt' just before it.  `mcnt' contains
+                 the length of the alternative.  */
+              EXTRACT_NUMBER (mcnt, p1 - 2);
+
+              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
+                return false;
+
+              p1 += mcnt;	/* Get past the n-th alternative.  */
+            } /* if mcnt > 0 */
+          break;
+
+          
+        case stop_memory:
+	  assert (p1[1] == **p);
+          *p = p1 + 2;
+          return true;
+
+        
+        default: 
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    } /* while p1 < end */
+
+  return false;
+} /* group_match_null_string_p */
+
+
+/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
+   It expects P to be the first byte of a single alternative and END one
+   byte past the last. The alternative can contain groups.  */
+   
+static boolean
+alt_match_null_string_p (p, end, reg_info)
+    unsigned char *p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  unsigned char *p1 = p;
+  
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and break when we get 
+         to one that can't.  */
+      
+      switch ((re_opcode_t) *p1)
+        {
+	/* It's a loop.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+          break;
+          
+	default: 
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    }  /* while p1 < end */
+
+  return true;
+} /* alt_match_null_string_p */
+
+
+/* Deals with the ops common to group_match_null_string_p and
+   alt_match_null_string_p.  
+   
+   Sets P to one after the op and its arguments, if any.  */
+
+static boolean
+common_op_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  boolean ret;
+  int reg_no;
+  unsigned char *p1 = *p;
+
+  switch ((re_opcode_t) *p1++)
+    {
+    case no_op:
+    case begline:
+    case endline:
+    case begbuf:
+    case endbuf:
+    case wordbeg:
+    case wordend:
+    case wordbound:
+    case notwordbound:
+#ifdef emacs
+    case before_dot:
+    case at_dot:
+    case after_dot:
+#endif
+      break;
+
+    case start_memory:
+      reg_no = *p1;
+      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
+      ret = group_match_null_string_p (&p1, end, reg_info);
+      
+      /* Have to set this here in case we're checking a group which
+         contains a group and a back reference to it.  */
+
+      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
+        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
+
+      if (!ret)
+        return false;
+      break;
+          
+    /* If this is an optimized succeed_n for zero times, make the jump.  */
+    case jump:
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+      if (mcnt >= 0)
+        p1 += mcnt;
+      else
+        return false;
+      break;
+
+    case succeed_n:
+      /* Get to the number of times to succeed.  */
+      p1 += 2;		
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+      if (mcnt == 0)
+        {
+          p1 -= 4;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+        }
+      else
+        return false;
+      break;
+
+    case duplicate: 
+      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
+        return false;
+      break;
+
+    case set_number_at:
+      p1 += 4;
+
+    default:
+      /* All other opcodes mean we cannot match the empty string.  */
+      return false;
+  }
+
+  *p = p1;
+  return true;
+} /* common_op_match_null_string_p */
+
+
+/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
+   bytes; nonzero otherwise.  */
+   
+static int
+bcmp_translate (s1, s2, len, translate)
+     unsigned char *s1, *s2;
+     register int len;
+     char *translate;
+{
+  register unsigned char *p1 = s1, *p2 = s2;
+  while (len)
+    {
+      if (translate[*p1++] != translate[*p2++]) return 1;
+      len--;
+    }
+  return 0;
+}
+
+
+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length SIZE) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+   
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in BUFP on entry.
+   
+   We call regex_compile to do the actual compilation.  */
+
+const char *
+re_compile_pattern (pattern, length, bufp)
+     const char *pattern;
+     int length;
+     struct re_pattern_buffer *bufp;
+{
+  reg_errcode_t ret;
+  
+  /* GNU code is written to assume at least RE_NREGS registers will be set
+     (and at least one extra will be -1).  */
+  bufp->regs_allocated = REGS_UNALLOCATED;
+  
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub.  */
+  bufp->no_sub = 0;
+  
+  /* Match anchors at newline.  */
+  bufp->newline_anchor = 1;
+  
+  ret = regex_compile (pattern, length, re_syntax_options, bufp);
+
+  if (!ret)
+    return NULL;
+  return gettext (re_error_msgid[(int) ret]);
+}     
+
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#ifdef _REGEX_RE_COMP
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+re_comp (s)
+    const char *s;
+{
+  reg_errcode_t ret;
+  
+  if (!s)
+    {
+      if (!re_comp_buf.buffer)
+	return gettext ("No previous regular expression");
+      return 0;
+    }
+
+  if (!re_comp_buf.buffer)
+    {
+      re_comp_buf.buffer = (unsigned char *) malloc (200);
+      if (re_comp_buf.buffer == NULL)
+        return gettext (re_error_msgid[(int) REG_ESPACE]);
+      re_comp_buf.allocated = 200;
+
+      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
+      if (re_comp_buf.fastmap == NULL)
+	return gettext (re_error_msgid[(int) REG_ESPACE]);
+    }
+
+  /* Since `re_exec' always passes NULL for the `regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  re_comp_buf.newline_anchor = 1;
+
+  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
+  
+  if (!ret)
+    return NULL;
+
+  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
+  return (char *) gettext (re_error_msgid[(int) ret]);
+}
+
+
+int
+re_exec (s)
+    const char *s;
+{
+  const int len = strlen (s);
+  return
+    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+}
+#endif /* _REGEX_RE_COMP */
+
+
+/* POSIX.2 functions.  Don't define these for Emacs.  */
+
+#ifndef emacs
+
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' and `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (preg, pattern, cflags)
+    regex_t *preg;
+    const char *pattern; 
+    int cflags;
+{
+  reg_errcode_t ret;
+  unsigned syntax
+    = (cflags & REG_EXTENDED) ?
+      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+
+  /* regex_compile will allocate the space for the compiled pattern.  */
+  preg->buffer = 0;
+  preg->allocated = 0;
+  preg->used = 0;
+  
+  /* Don't bother to use a fastmap when searching.  This simplifies the
+     REG_NEWLINE case: if we used a fastmap, we'd have to put all the
+     characters after newlines into the fastmap.  This way, we just try
+     every character.  */
+  preg->fastmap = 0;
+  
+  if (cflags & REG_ICASE)
+    {
+      unsigned i;
+      
+      preg->translate = (char *) malloc (CHAR_SET_SIZE);
+      if (preg->translate == NULL)
+        return (int) REG_ESPACE;
+
+      /* Map uppercase characters to corresponding lowercase ones.  */
+      for (i = 0; i < CHAR_SET_SIZE; i++)
+        preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
+    }
+  else
+    preg->translate = NULL;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+
+  preg->no_sub = !!(cflags & REG_NOSUB);
+
+  /* POSIX says a null character in the pattern terminates it, so we 
+     can use strlen here in compiling the pattern.  */
+  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
+  
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN) ret = REG_EPAREN;
+  
+  return (int) ret;
+}
+
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+   
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+   
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+   
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+    const regex_t *preg;
+    const char *string; 
+    size_t nmatch; 
+    regmatch_t pmatch[]; 
+    int eflags;
+{
+  int ret;
+  struct re_registers regs;
+  regex_t private_preg;
+  int len = strlen (string);
+  boolean want_reg_info = !preg->no_sub && nmatch > 0;
+
+  private_preg = *preg;
+  
+  private_preg.not_bol = !!(eflags & REG_NOTBOL);
+  private_preg.not_eol = !!(eflags & REG_NOTEOL);
+  
+  /* The user has told us exactly how many registers to return
+     information about, via `nmatch'.  We have to pass that on to the
+     matching routines.  */
+  private_preg.regs_allocated = REGS_FIXED;
+  
+  if (want_reg_info)
+    {
+      regs.num_regs = nmatch;
+      regs.start = TALLOC (nmatch, regoff_t);
+      regs.end = TALLOC (nmatch, regoff_t);
+      if (regs.start == NULL || regs.end == NULL)
+        return (int) REG_NOMATCH;
+    }
+
+  /* Perform the searching operation.  */
+  ret = re_search (&private_preg, string, len,
+                   /* start: */ 0, /* range: */ len,
+                   want_reg_info ? &regs : (struct re_registers *) 0);
+  
+  /* Copy the register information to the POSIX structure.  */
+  if (want_reg_info)
+    {
+      if (ret >= 0)
+        {
+          unsigned r;
+
+          for (r = 0; r < nmatch; r++)
+            {
+              pmatch[r].rm_so = regs.start[r];
+              pmatch[r].rm_eo = regs.end[r];
+            }
+        }
+
+      /* If we needed the temporary register info, free the space now.  */
+      free (regs.start);
+      free (regs.end);
+    }
+
+  /* We want zero return to mean success, unlike `re_search'.  */
+  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+}
+
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+    int errcode;
+    const regex_t *preg;
+    char *errbuf;
+    size_t errbuf_size;
+{
+  const char *msg;
+  size_t msg_size;
+
+  if (errcode < 0
+      || errcode >= (sizeof (re_error_msgid) / sizeof (re_error_msgid[0])))
+    /* Only error codes returned by the rest of the code should be passed 
+       to this routine.  If we are given anything else, or if other regex
+       code generates an invalid error code, then the program has a bug.
+       Dump core so we can fix it.  */
+    abort ();
+
+  msg = gettext (re_error_msgid[errcode]);
+
+  msg_size = strlen (msg) + 1; /* Includes the null.  */
+  
+  if (errbuf_size != 0)
+    {
+      if (msg_size > errbuf_size)
+        {
+          strncpy (errbuf, msg, errbuf_size - 1);
+          errbuf[errbuf_size - 1] = 0;
+        }
+      else
+        strcpy (errbuf, msg);
+    }
+
+  return msg_size;
+}
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (preg)
+    regex_t *preg;
+{
+  if (preg->buffer != NULL)
+    free (preg->buffer);
+  preg->buffer = NULL;
+  
+  preg->allocated = 0;
+  preg->used = 0;
+
+  if (preg->fastmap != NULL)
+    free (preg->fastmap);
+  preg->fastmap = NULL;
+  preg->fastmap_accurate = 0;
+
+  if (preg->translate != NULL)
+    free (preg->translate);
+  preg->translate = NULL;
+}
+
+#endif /* not emacs  */
+
+
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
Index: /main/tags/2.38/gsdl/packages/mg/lib/regex.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/regex.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/regex.h	(revision 21083)
@@ -0,0 +1,497 @@
+/* Definitions for data structures and routines for the regular
+   expression library, version 0.12.
+
+   Copyright (C) 1985, 89, 90, 91, 92, 93, 95 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef __REGEXP_LIBRARY_H__
+#define __REGEXP_LIBRARY_H__
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+   <regex.h>.  */
+
+#if !defined (_POSIX_C_SOURCE) && !defined (_POSIX_SOURCE) && defined (VMS)
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+   should be there.  */
+#include <stddef.h>
+#endif
+
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals. 
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.  
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically, 
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES. 
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal. 
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+   without further backtracking.  */
+#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+
+
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */ 
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK							\
+  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL			\
+   | RE_NO_BK_PARENS            | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR               | RE_NO_EMPTY_RANGES			\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+#define RE_SYNTAX_POSIX_AWK 						\
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
+
+#define RE_SYNTAX_GREP							\
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP							\
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP						\
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON						\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC						\
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR				\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+   replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+
+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+#undef RE_DUP_MAX
+#endif
+#define RE_DUP_MAX ((1 << 15) - 1) 
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+ 
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum
+{
+  REG_NOERROR = 0,	/* Success.  */
+  REG_NOMATCH,		/* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  REG_BADPAT,		/* Invalid pattern.  */
+  REG_ECOLLATE,		/* Not implemented.  */
+  REG_ECTYPE,		/* Invalid character class name.  */
+  REG_EESCAPE,		/* Trailing backslash.  */
+  REG_ESUBREG,		/* Invalid back reference.  */
+  REG_EBRACK,		/* Unmatched left bracket.  */
+  REG_EPAREN,		/* Parenthesis imbalance.  */ 
+  REG_EBRACE,		/* Unmatched \{.  */
+  REG_BADBR,		/* Invalid contents of \{\}.  */
+  REG_ERANGE,		/* Invalid range end.  */
+  REG_ESPACE,		/* Ran out of memory.  */
+  REG_BADRPT,		/* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  REG_EEND,		/* Premature end.  */
+  REG_ESIZE,		/* Compiled pattern bigger than 2^16 bytes.  */
+  REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
+} reg_errcode_t;
+
+
+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields `buffer', `allocated', `fastmap',
+   `translate', and `no_sub' can be set.  After the pattern has been
+   compiled, the `re_nsub' field is available.  All other fields are
+   private to the regex routines.  */
+
+struct re_pattern_buffer
+{
+/* [[[begin pattern_buffer]]] */
+	/* Space that holds the compiled pattern.  It is declared as
+          `unsigned char *' because its elements are
+           sometimes used as array indexes.  */
+  unsigned char *buffer;
+
+	/* Number of bytes to which `buffer' points.  */
+  unsigned long allocated;
+
+	/* Number of bytes actually used in `buffer'.  */
+  unsigned long used;	
+
+        /* Syntax setting with which the pattern was compiled.  */
+  reg_syntax_t syntax;
+
+        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+           the fastmap, if there is one, to skip over impossible
+           starting points for matches.  */
+  char *fastmap;
+
+        /* Either a translate table to apply to all characters before
+           comparing them, or zero for no translation.  The translation
+           is applied to a pattern when it is compiled and to a string
+           when it is matched.  */
+  char *translate;
+
+	/* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+        /* Zero if this pattern cannot match the empty string, one else.
+           Well, in truth it's used only in `re_search_2', to see
+           whether or not we should use the fastmap, so we don't set
+           this absolutely perfectly; see `re_compile_fastmap' (the
+           `duplicate' case).  */
+  unsigned can_be_null : 1;
+
+        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+             for `max (RE_NREGS, re_nsub + 1)' groups.
+           If REGS_REALLOCATE, reallocate space if necessary.
+           If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+  unsigned regs_allocated : 2;
+
+        /* Set to zero when `regex_compile' compiles a pattern; set to one
+           by `re_compile_fastmap' if it updates the fastmap.  */
+  unsigned fastmap_accurate : 1;
+
+        /* If set, `re_match_2' does not return information about
+           subexpressions.  */
+  unsigned no_sub : 1;
+
+        /* If set, a beginning-of-line anchor doesn't match at the
+           beginning of the string.  */ 
+  unsigned not_bol : 1;
+
+        /* Similarly for an end-of-line anchor.  */
+  unsigned not_eol : 1;
+
+        /* If true, an anchor at a newline matches.  */
+  unsigned newline_anchor : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+
+/* Type for byte offsets within the string.  POSIX mandates this.  */
+typedef int regoff_t;
+
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  unsigned num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   `re_match_2' returns information about at least this many registers
+   the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+#define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+
+
+/* Declarations for routines.  */
+
+/* To avoid duplicating every routine declaration -- once with a
+   prototype (if we are ANSI), and once without (if we aren't) -- we
+   use the following macro to declare argument types.  This
+   unfortunately clutters up the declarations a bit, but I think it's
+   worth it.  */
+
+#if __STDC__
+
+#define _RE_ARGS(args) args
+
+#else /* not __STDC__ */
+
+#define _RE_ARGS(args) ()
+
+#endif /* not __STDC__ */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the `re_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global `re_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.  */
+extern const char *re_compile_pattern
+  _RE_ARGS ((const char *pattern, int length,
+             struct re_pattern_buffer *buffer));
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern int re_search
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+            int length, int start, int range, struct re_registers *regs));
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern int re_search_2
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, int range, struct re_registers *regs, int stop));
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern int re_match
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+             int length, int start, struct re_registers *regs));
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+extern int re_match_2 
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, struct re_registers *regs, int stop));
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least `NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers
+  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+             unsigned num_regs, regoff_t *starts, regoff_t *ends));
+
+#ifdef _REGEX_RE_COMP
+/* 4.2 bsd compatibility.  */
+extern char *re_comp _RE_ARGS ((const char *));
+extern int re_exec _RE_ARGS ((const char *));
+#endif
+
+/* POSIX compatibility.  */
+extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
+extern int regexec
+  _RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
+             regmatch_t pmatch[], int eflags));
+extern size_t regerror
+  _RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
+             size_t errbuf_size));
+extern void regfree _RE_ARGS ((regex_t *preg));
+
+#endif /* not __REGEXP_LIBRARY_H__ */
+
+
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
Index: /main/tags/2.38/gsdl/packages/mg/lib/rx.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/rx.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/rx.c	(revision 21083)
@@ -0,0 +1,7271 @@
+/*	Copyright (C) 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
+
+This file is part of the librx library.
+
+Librx 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, or (at your option)
+any later version.
+
+Librx 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 this software; see the file COPYING.LIB.  If not,
+write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
+02139, USA.  */
+
+/* NOTE!!!  AIX is so losing it requires this to be the first thing in the 
+ * file. 
+ * Do not put ANYTHING before it!  
+ */
+#if !defined (__GNUC__) && defined (_AIX)
+ #pragma alloca
+#endif
+
+/* To make linux happy? */
+#ifndef	_GNU_SOURCE
+#define	_GNU_SOURCE
+#endif
+
+#if HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+#  include <malloc.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+
+
+char rx_version_string[] = "GNU Rx version 0.07.1";
+
+			/* ``Too hard!''
+			 *	    -- anon.
+			 */
+
+
+
+#include <stdio.h>
+#include <ctype.h>
+#ifndef isgraph
+#define isgraph(c) (isprint (c) && !isspace (c))
+#endif
+#ifndef isblank
+#define isblank(c) ((c) == ' ' || (c) == '\t')
+#endif
+
+#include <sys/types.h>
+
+#undef MAX
+#undef MIN
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+typedef char boolean;
+#define false 0
+#define true 1
+
+#ifndef __GCC__
+#undef __inline__
+#define __inline__
+#endif
+
+/* Emacs already defines alloca, sometimes.  */
+#ifndef alloca
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else /* not __GNUC__ or HAVE_ALLOCA_H */
+#ifndef _AIX /* Already did AIX, up at the top.  */
+char *alloca ();
+#endif /* not _AIX */
+#endif /* not HAVE_ALLOCA_H */ 
+#endif /* not __GNUC__ */
+
+#endif /* not alloca */
+
+/* Memory management and stuff for emacs. */
+
+#define CHARBITS 8
+#define remalloc(M, S) (M ? realloc (M, S) : malloc (S))
+
+
+/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+ * use `alloca' instead of `malloc' for the backtracking stack.
+ *
+ * Emacs will die miserably if we don't do this.
+ */
+
+#ifdef REGEX_MALLOC
+#define REGEX_ALLOCATE malloc
+#else /* not REGEX_MALLOC  */
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#define REGEX_ALLOCATE _alloca
+#else
+#define REGEX_ALLOCATE alloca
+#endif /* __WIN32__ */
+#endif /* not REGEX_MALLOC */
+
+
+#ifdef RX_WANT_RX_DEFS
+#define RX_DECL extern
+#define RX_DEF_QUAL 
+#else
+#define RX_WANT_RX_DEFS
+#define RX_DECL static
+#define RX_DEF_QUAL static
+#endif
+#include "rx.h"
+#undef RX_DECL
+#define RX_DECL RX_DEF_QUAL
+
+
+#ifndef emacs
+
+#ifdef SYNTAX_TABLE
+extern char *re_syntax_table;
+#else /* not SYNTAX_TABLE */
+
+#ifdef __STDC__
+static void
+init_syntax_once (void)
+#else
+static void
+init_syntax_once ()
+#endif
+{
+   register int c;
+   static int done = 0;
+
+   if (done)
+     return;
+
+   bzero (re_syntax_table, sizeof re_syntax_table);
+
+   for (c = 'a'; c <= 'z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = 'A'; c <= 'Z'; c++)
+     re_syntax_table[c] = Sword;
+
+   for (c = '0'; c <= '9'; c++)
+     re_syntax_table[c] = Sword;
+
+   re_syntax_table['_'] = Sword;
+
+   done = 1;
+}
+#endif /* not SYNTAX_TABLE */
+#endif /* not emacs */
+
+
+/* Compile with `-DRX_DEBUG' and use the following flags.
+ *
+ * Debugging flags:
+ *   	rx_debug - print information as a regexp is compiled
+ * 	rx_debug_trace - print information as a regexp is executed
+ */
+
+#ifdef RX_DEBUG
+
+int rx_debug_compile = 0;
+int rx_debug_trace = 0;
+static struct re_pattern_buffer * dbug_rxb = 0;
+
+#ifdef __STDC__
+typedef void (*side_effect_printer) (struct rx *, void *, FILE *);
+#else
+typedef void (*side_effect_printer) ();
+#endif
+
+#ifdef __STDC__
+static void print_cset (struct rx *rx, rx_Bitset cset, FILE * fp);
+#else
+static void print_cset ();
+#endif
+
+#ifdef __STDC__
+static void
+print_rexp (struct rx *rx,
+	    struct rexp_node *node, int depth,
+	    side_effect_printer seprint, FILE * fp)
+#else
+static void
+print_rexp (rx, node, depth, seprint, fp)
+     struct rx *rx;
+     struct rexp_node *node;
+     int depth;
+     side_effect_printer seprint;
+     FILE * fp;
+#endif
+{
+  if (!node)
+    return;
+  else
+    {
+      switch (node->type)
+	{
+	case r_cset:
+	  {
+	    fprintf (fp, "%*s", depth, "");
+	    print_cset (rx, node->params.cset, fp);
+	    fputc ('\n', fp);
+	    break;
+	  }
+
+ 	case r_opt:
+	case r_star:
+	  fprintf (fp, "%*s%s\n", depth, "",
+		   node->type == r_opt ? "opt" : "star");
+	  print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
+	  break;
+
+	case r_2phase_star:
+	  fprintf (fp, "%*s2phase star\n", depth, "");
+	  print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
+	  print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
+	  break;
+
+
+	case r_alternate:
+	case r_concat:
+	  fprintf (fp, "%*s%s\n", depth, "",
+		   node->type == r_alternate ? "alt" : "concat");
+	  print_rexp (rx, node->params.pair.left, depth + 3, seprint, fp);
+	  print_rexp (rx, node->params.pair.right, depth + 3, seprint, fp);
+	  break;
+	case r_side_effect:
+	  fprintf (fp, "%*sSide effect: ", depth, "");
+	  seprint (rx, node->params.side_effect, fp);
+	  fputc ('\n', fp);
+	}
+    }
+}
+
+#ifdef __STDC__
+static void
+print_nfa (struct rx * rx,
+	   struct rx_nfa_state * n,
+	   side_effect_printer seprint, FILE * fp)
+#else
+static void
+print_nfa (rx, n, seprint, fp)
+     struct rx * rx;
+     struct rx_nfa_state * n;
+     side_effect_printer seprint;
+     FILE * fp;
+#endif
+{
+  while (n)
+    {
+      struct rx_nfa_edge *e = n->edges;
+      struct rx_possible_future *ec = n->futures;
+      fprintf (fp, "node %d %s\n", n->id,
+	       n->is_final ? "final" : (n->is_start ? "start" : ""));
+      while (e)
+	{
+	  fprintf (fp, "   edge to %d, ", e->dest->id);
+	  switch (e->type)
+	    {
+	    case ne_epsilon:
+	      fprintf (fp, "epsilon\n");
+	      break;
+	    case ne_side_effect:
+	      fprintf (fp, "side effect ");
+	      seprint (rx, e->params.side_effect, fp);
+	      fputc ('\n', fp);
+	      break;
+	    case ne_cset:
+	      fprintf (fp, "cset ");
+	      print_cset (rx, e->params.cset, fp);
+	      fputc ('\n', fp);
+	      break;
+	    }
+	  e = e->next;
+	}
+
+      while (ec)
+	{
+	  int x;
+	  struct rx_nfa_state_set * s;
+	  struct rx_se_list * l;
+	  fprintf (fp, "   eclosure to {");
+	  for (s = ec->destset; s; s = s->cdr)
+	    fprintf (fp, "%d ", s->car->id);
+	  fprintf (fp, "} (");
+	  for (l = ec->effects; l; l = l->cdr)
+	    {
+	      seprint (rx, l->car, fp);
+	      fputc (' ', fp);
+	    }
+	  fprintf (fp, ")\n");
+	  ec = ec->next;
+	}
+      n = n->next;
+    }
+}
+
+static char * efnames [] =
+{
+  "bogon",
+  "re_se_try",
+  "re_se_pushback",
+  "re_se_push0",
+  "re_se_pushpos",
+  "re_se_chkpos",
+  "re_se_poppos",
+  "re_se_at_dot",
+  "re_se_syntax",
+  "re_se_not_syntax",
+  "re_se_begbuf",
+  "re_se_hat",
+  "re_se_wordbeg",
+  "re_se_wordbound",
+  "re_se_notwordbound",
+  "re_se_wordend",
+  "re_se_endbuf",
+  "re_se_dollar",
+  "re_se_fail",
+};
+
+static char * efnames2[] =
+{
+  "re_se_win",
+  "re_se_lparen",
+  "re_se_rparen",
+  "re_se_backref",
+  "re_se_iter",
+  "re_se_end_iter",
+  "re_se_tv"
+};
+
+static char * inx_names[] = 
+{
+  "rx_backtrack_point",
+  "rx_do_side_effects",
+  "rx_cache_miss",
+  "rx_next_char",
+  "rx_backtrack",
+  "rx_error_inx",
+  "rx_num_instructions"
+};
+
+
+#ifdef __STDC__
+static void
+re_seprint (struct rx * rx, void * effect, FILE * fp)
+#else
+static void
+re_seprint (rx, effect, fp)
+     struct rx * rx;
+     void * effect;
+     FILE * fp;
+#endif
+{
+  if ((int)effect < 0)
+    fputs (efnames[-(int)effect], fp);
+  else if (dbug_rxb)
+    {
+      struct re_se_params * p = &dbug_rxb->se_params[(int)effect];
+      fprintf (fp, "%s(%d,%d)", efnames2[p->se], p->op1, p->op2);
+    }
+  else
+    fprintf (fp, "[complex op # %d]", (int)effect);
+}
+
+
+/* These are so the regex.c regression tests will compile. */
+void
+print_compiled_pattern (rxb)
+     struct re_pattern_buffer * rxb;
+{
+}
+
+void
+print_fastmap (fm)
+     char * fm;
+{
+}
+
+#endif /* RX_DEBUG */
+
+
+
+
+/* This page: Bitsets.  Completely unintersting. */
+
+#ifdef __STDC__
+RX_DECL int
+rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL int
+rx_bitset_is_equal (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  RX_subset s = b[0];
+  b[0] = ~a[0];
+
+  for (x = rx_bitset_numb_subsets(size) - 1; a[x] == b[x]; --x)
+    ;
+
+  b[0] = s;
+  return !x && s == a[0];
+}
+
+#ifdef __STDC__
+RX_DECL int
+rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL int
+rx_bitset_is_subset (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x = rx_bitset_numb_subsets(size) - 1;
+  while (x-- && (a[x] & b[x]) == a[x]);
+  return x == -1;
+}
+
+
+#ifdef __STDC__
+RX_DECL int
+rx_bitset_empty (int size, rx_Bitset set)
+#else
+RX_DECL int
+rx_bitset_empty (size, set)
+     int size;
+     rx_Bitset set;
+#endif
+{
+  int x;
+  RX_subset s = set[0];
+  set[0] = 1;
+  for (x = rx_bitset_numb_subsets(size) - 1; !set[x]; --x)
+    ;
+  set[0] = s;
+  return !s;
+}
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_null (int size, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_null (size, b)
+     int size;
+     rx_Bitset b;
+#endif
+{
+  bzero (b, rx_sizeof_bitset(size));
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_universe (int size, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_universe (size, b)
+     int size;
+     rx_Bitset b;
+#endif
+{
+  int x = rx_bitset_numb_subsets (size);
+  while (x--)
+    *b++ = ~(RX_subset)0;
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_complement (int size, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_complement (size, b)
+     int size;
+     rx_Bitset b;
+#endif
+{
+  int x = rx_bitset_numb_subsets (size);
+  while (x--)
+    {
+      *b = ~*b;
+      ++b;
+    }
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_assign (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] = b[x];
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_union (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_union (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] |= b[x];
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_intersection (int size,
+			rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_intersection (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] &= b[x];
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_difference (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] &=  ~ b[x];
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_revdifference (int size,
+			 rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_revdifference (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] = ~a[x] & b[x];
+}
+
+#ifdef __STDC__
+RX_DECL void
+rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b)
+#else
+RX_DECL void
+rx_bitset_xor (size, a, b)
+     int size;
+     rx_Bitset a;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  for (x = rx_bitset_numb_subsets(size) - 1; x >=0; --x)
+    a[x] ^= b[x];
+}
+
+
+#ifdef __STDC__
+RX_DECL unsigned long
+rx_bitset_hash (int size, rx_Bitset b)
+#else
+RX_DECL unsigned long
+rx_bitset_hash (size, b)
+     int size;
+     rx_Bitset b;
+#endif
+{
+  int x;
+  unsigned long hash = (unsigned long)rx_bitset_hash;
+
+  for (x = rx_bitset_numb_subsets(size) - 1; x >= 0; --x)
+    hash ^= rx_bitset_subset_val(b, x);
+
+  return hash;
+}
+
+
+RX_DECL RX_subset rx_subset_singletons [RX_subset_bits] = 
+{
+  0x1,
+  0x2,
+  0x4,
+  0x8,
+  0x10,
+  0x20,
+  0x40,
+  0x80,
+  0x100,
+  0x200,
+  0x400,
+  0x800,
+  0x1000,
+  0x2000,
+  0x4000,
+  0x8000,
+  0x10000,
+  0x20000,
+  0x40000,
+  0x80000,
+  0x100000,
+  0x200000,
+  0x400000,
+  0x800000,
+  0x1000000,
+  0x2000000,
+  0x4000000,
+  0x8000000,
+  0x10000000,
+  0x20000000,
+  0x40000000,
+  0x80000000
+};
+
+#ifdef RX_DEBUG
+
+#ifdef __STDC__
+static void
+print_cset (struct rx *rx, rx_Bitset cset, FILE * fp)
+#else
+static void
+print_cset (rx, cset, fp)
+     struct rx *rx;
+     rx_Bitset cset;
+     FILE * fp;
+#endif
+{
+  int x;
+  fputc ('[', fp);
+  for (x = 0; x < rx->local_cset_size; ++x)
+    if (RX_bitset_member (cset, x))
+      {
+	if (isprint(x))
+	  fputc (x, fp);
+	else
+	  fprintf (fp, "\\0%o ", x);
+      }
+  fputc (']', fp);
+}
+
+#endif /*  RX_DEBUG */
+
+
+
+
+static unsigned long rx_hash_masks[4] =
+{
+  0x12488421,
+  0x96699669,
+  0xbe7dd7eb,
+  0xffffffff
+};
+
+
+/* Hash tables */
+#ifdef __STDC__
+RX_DECL struct rx_hash_item * 
+rx_hash_find (struct rx_hash * table,
+	      unsigned long hash,
+	      void * value,
+	      struct rx_hash_rules * rules)
+#else
+RX_DECL struct rx_hash_item * 
+rx_hash_find (table, hash, value, rules)
+     struct rx_hash * table;
+     unsigned long hash;
+     void * value;
+     struct rx_hash_rules * rules;
+#endif
+{
+  rx_hash_eq eq = rules->eq;
+  int maskc = 0;
+  long mask = rx_hash_masks [0];
+  int bucket = (hash & mask) % 13;
+
+  while (table->children [bucket])
+    {
+      table = table->children [bucket];
+      ++maskc;
+      mask = rx_hash_masks[maskc];
+      bucket = (hash & mask) % 13;
+    }
+
+  {
+    struct rx_hash_item * it = table->buckets[bucket];
+    while (it)
+      if (eq (it->data, value))
+	return it;
+      else
+	it = it->next_same_hash;
+  }
+
+  return 0;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rx_hash_item *
+rx_hash_store (struct rx_hash * table,
+	       unsigned long hash,
+	       void * value,
+	       struct rx_hash_rules * rules)
+#else
+RX_DECL struct rx_hash_item *
+rx_hash_store (table, hash, value, rules)
+     struct rx_hash * table;
+     unsigned long hash;
+     void * value;
+     struct rx_hash_rules * rules;
+#endif
+{
+  rx_hash_eq eq = rules->eq;
+  int maskc = 0;
+  long mask = rx_hash_masks[0];
+  int bucket = (hash & mask) % 13;
+  int depth = 0;
+  
+  while (table->children [bucket])
+    {
+      table = table->children [bucket];
+      ++maskc;
+      mask = rx_hash_masks[maskc];
+      bucket = (hash & mask) % 13;
+      ++depth;
+    }
+  
+  {
+    struct rx_hash_item * it = table->buckets[bucket];
+    while (it)
+      if (eq (it->data, value))
+	return it;
+      else
+	it = it->next_same_hash;
+  }
+  
+  {
+    if (   (depth < 3)
+	&& (table->bucket_size [bucket] >= 4))
+      {
+	struct rx_hash * newtab = ((struct rx_hash *)
+				   rules->hash_alloc (rules));
+	if (!newtab)
+	  goto add_to_bucket;
+	bzero (newtab, sizeof (*newtab));
+	newtab->parent = table;
+	{
+	  struct rx_hash_item * them = table->buckets[bucket];
+	  unsigned long newmask = rx_hash_masks[maskc + 1];
+	  while (them)
+	    {
+	      struct rx_hash_item * save = them->next_same_hash;
+	      int new_buck = (them->hash & newmask) % 13;
+	      them->next_same_hash = newtab->buckets[new_buck];
+	      newtab->buckets[new_buck] = them;
+	      them->table = newtab;
+	      them = save;
+	      ++newtab->bucket_size[new_buck];
+	      ++newtab->refs;
+	    }
+	  table->refs = (table->refs - table->bucket_size[bucket] + 1);
+	  table->bucket_size[bucket] = 0;
+	  table->buckets[bucket] = 0;
+	  table->children[bucket] = newtab;
+	  table = newtab;
+	  bucket = (hash & newmask) % 13;
+	}
+      }
+  }
+ add_to_bucket:
+  {
+    struct rx_hash_item  * it = ((struct rx_hash_item *)
+				 rules->hash_item_alloc (rules, value));
+    if (!it)
+      return 0;
+    it->hash = hash;
+    it->table = table;
+    /* DATA and BINDING are to be set in hash_item_alloc */
+    it->next_same_hash = table->buckets [bucket];
+    table->buckets[bucket] = it;
+    ++table->bucket_size [bucket];
+    ++table->refs;
+    return it;
+  }
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules)
+#else
+RX_DECL void
+rx_hash_free (it, rules)
+     struct rx_hash_item * it;
+     struct rx_hash_rules * rules;
+#endif
+{
+  if (it)
+    {
+      struct rx_hash * table = it->table;
+      unsigned long hash = it->hash;
+      int depth = (table->parent
+		   ? (table->parent->parent
+		      ? (table->parent->parent->parent
+			 ? 3
+			 : 2)
+		      : 1)
+		   : 0);
+      int bucket = (hash & rx_hash_masks [depth]) % 13;
+      struct rx_hash_item ** pos = &table->buckets [bucket];
+      
+      while (*pos != it)
+	pos = &(*pos)->next_same_hash;
+      *pos = it->next_same_hash;
+      rules->free_hash_item (it, rules);
+      --table->bucket_size[bucket];
+      --table->refs;
+      while (!table->refs && depth)
+	{
+	  struct rx_hash * save = table;
+	  table = table->parent;
+	  --depth;
+	  bucket = (hash & rx_hash_masks [depth]) % 13;
+	  --table->refs;
+	  table->children[bucket] = 0;
+	  rules->free_hash (save, rules);
+	}
+    }
+}
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn,
+		    struct rx_hash_rules * rules)
+#else
+RX_DECL void
+rx_free_hash_table (tab, freefn, rules)
+     struct rx_hash * tab;
+     rx_hash_freefn freefn;
+     struct rx_hash_rules * rules;
+#endif
+{
+  int x;
+
+  for (x = 0; x < 13; ++x)
+    if (tab->children[x])
+      {
+	rx_free_hash_table (tab->children[x], freefn, rules);
+	rules->free_hash (tab->children[x], rules);
+      }
+    else
+      {
+	struct rx_hash_item * them = tab->buckets[x];
+	while (them)
+	  {
+	    struct rx_hash_item * that = them;
+	    them = that->next_same_hash;
+	    freefn (that);
+	    rules->free_hash_item (that, rules);
+	  }
+      }
+}
+
+
+
+
+/* Utilities for manipulating bitset represntations of characters sets. */
+
+#ifdef __STDC__
+RX_DECL rx_Bitset
+rx_cset (struct rx *rx)
+#else
+RX_DECL rx_Bitset
+rx_cset (rx)
+     struct rx *rx;
+#endif
+{
+  rx_Bitset b = (rx_Bitset) malloc (rx_sizeof_bitset (rx->local_cset_size));
+  if (b)
+    rx_bitset_null (rx->local_cset_size, b);
+  return b;
+}
+
+
+#ifdef __STDC__
+RX_DECL rx_Bitset
+rx_copy_cset (struct rx *rx, rx_Bitset a)
+#else
+RX_DECL rx_Bitset
+rx_copy_cset (rx, a)
+     struct rx *rx;
+     rx_Bitset a;
+#endif
+{
+  rx_Bitset cs = rx_cset (rx);
+
+  if (cs)
+    rx_bitset_union (rx->local_cset_size, cs, a);
+
+  return cs;
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_cset (struct rx * rx, rx_Bitset c)
+#else
+RX_DECL void
+rx_free_cset (rx, c)
+     struct rx * rx;
+     rx_Bitset c;
+#endif
+{
+  if (c)
+    free ((char *)c);
+}
+
+
+
+/* Hash table memory allocation policy for the regexp compiler */
+
+#ifdef __STDC__
+static struct rx_hash *
+compiler_hash_alloc (struct rx_hash_rules * rules)
+#else
+static struct rx_hash *
+compiler_hash_alloc (rules)
+     struct rx_hash_rules * rules;
+#endif
+{
+  return (struct rx_hash *)malloc (sizeof (struct rx_hash));
+}
+
+
+#ifdef __STDC__
+static struct rx_hash_item *
+compiler_hash_item_alloc (struct rx_hash_rules * rules, void * value)
+#else
+static struct rx_hash_item *
+compiler_hash_item_alloc (rules, value)
+     struct rx_hash_rules * rules;
+     void * value;
+#endif
+{
+  struct rx_hash_item * it;
+  it = (struct rx_hash_item *)malloc (sizeof (*it));
+  if (it)
+    {
+      it->data = value;
+      it->binding = 0;
+    }
+  return it;
+}
+
+
+#ifdef __STDC__
+static void
+compiler_free_hash (struct rx_hash * tab,
+		    struct rx_hash_rules * rules)
+#else
+static void
+compiler_free_hash (tab, rules)
+     struct rx_hash * tab;
+     struct rx_hash_rules * rules;
+#endif
+{
+  free ((char *)tab);
+}
+
+
+#ifdef __STDC__
+static void
+compiler_free_hash_item (struct rx_hash_item * item,
+			 struct rx_hash_rules * rules)
+#else
+static void
+compiler_free_hash_item (item, rules)
+     struct rx_hash_item * item;
+     struct rx_hash_rules * rules;
+#endif
+{
+  free ((char *)item);
+}
+
+
+
+/* This page: REXP_NODE (expression tree) structures. */
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rexp_node (struct rx *rx,
+	   enum rexp_node_type type)
+#else
+RX_DECL struct rexp_node *
+rexp_node (rx, type)
+     struct rx *rx;
+     enum rexp_node_type type;
+#endif
+{
+  struct rexp_node *n;
+
+  n = (struct rexp_node *)malloc (sizeof (*n));
+  bzero (n, sizeof (*n));
+  if (n)
+    n->type = type;
+  return n;
+}
+
+
+/* free_rexp_node assumes that the bitset passed to rx_mk_r_cset
+ * can be freed using rx_free_cset.
+ */
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_cset (struct rx * rx,
+	      rx_Bitset b)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_cset (rx, b)
+     struct rx * rx;
+     rx_Bitset b;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_cset);
+  if (n)
+    n->params.cset = b;
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_concat (struct rx * rx,
+		struct rexp_node * a,
+		struct rexp_node * b)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_concat (rx, a, b)
+     struct rx * rx;
+     struct rexp_node * a;
+     struct rexp_node * b;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_concat);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = b;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_alternate (struct rx * rx,
+		   struct rexp_node * a,
+		   struct rexp_node * b)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_alternate (rx, a, b)
+     struct rx * rx;
+     struct rexp_node * a;
+     struct rexp_node * b;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_alternate);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = b;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_opt (struct rx * rx,
+	     struct rexp_node * a)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_opt (rx, a)
+     struct rx * rx;
+     struct rexp_node * a;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_opt);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = 0;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_star (struct rx * rx,
+	      struct rexp_node * a)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_star (rx, a)
+     struct rx * rx;
+     struct rexp_node * a;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_star);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = 0;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_2phase_star (struct rx * rx,
+		     struct rexp_node * a,
+		     struct rexp_node * b)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_2phase_star (rx, a, b)
+     struct rx * rx;
+     struct rexp_node * a;
+     struct rexp_node * b;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_2phase_star);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = b;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_side_effect (struct rx * rx,
+		     rx_side_effect a)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_side_effect (rx, a)
+     struct rx * rx;
+     rx_side_effect a;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_side_effect);
+  if (n)
+    {
+      n->params.side_effect = a;
+      n->params.pair.right = 0;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node *
+rx_mk_r_data  (struct rx * rx,
+	       void * a)
+#else
+RX_DECL struct rexp_node *
+rx_mk_r_data  (rx, a)
+     struct rx * rx;
+     void * a;
+#endif
+{
+  struct rexp_node * n = rexp_node (rx, r_data);
+  if (n)
+    {
+      n->params.pair.left = a;
+      n->params.pair.right = 0;
+    }
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_rexp (struct rx * rx, struct rexp_node * node)
+#else
+RX_DECL void
+rx_free_rexp (rx, node)
+     struct rx * rx;
+     struct rexp_node * node;
+#endif
+{
+  if (node)
+    {
+      switch (node->type)
+	{
+	case r_cset:
+	  if (node->params.cset)
+	    rx_free_cset (rx, node->params.cset);
+
+	case r_side_effect:
+	  break;
+	  
+	case r_concat:
+	case r_alternate:
+	case r_2phase_star:
+	case r_opt:
+	case r_star:
+	  rx_free_rexp (rx, node->params.pair.left);
+	  rx_free_rexp (rx, node->params.pair.right);
+	  break;
+
+	case r_data:
+	  /* This shouldn't occur. */
+	  break;
+	}
+      free ((char *)node);
+    }
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rexp_node * 
+rx_copy_rexp (struct rx *rx,
+	   struct rexp_node *node)
+#else
+RX_DECL struct rexp_node * 
+rx_copy_rexp (rx, node)
+     struct rx *rx;
+     struct rexp_node *node;
+#endif
+{
+  if (!node)
+    return 0;
+  else
+    {
+      struct rexp_node *n = rexp_node (rx, node->type);
+      if (!n)
+	return 0;
+      switch (node->type)
+	{
+	case r_cset:
+	  n->params.cset = rx_copy_cset (rx, node->params.cset);
+	  if (!n->params.cset)
+	    {
+	      rx_free_rexp (rx, n);
+	      return 0;
+	    }
+	  break;
+
+	case r_side_effect:
+	  n->params.side_effect = node->params.side_effect;
+	  break;
+
+	case r_concat:
+	case r_alternate:
+	case r_opt:
+	case r_2phase_star:
+	case r_star:
+	  n->params.pair.left =
+	    rx_copy_rexp (rx, node->params.pair.left);
+	  n->params.pair.right =
+	    rx_copy_rexp (rx, node->params.pair.right);
+	  if (   (node->params.pair.left && !n->params.pair.left)
+	      || (node->params.pair.right && !n->params.pair.right))
+	    {
+	      rx_free_rexp  (rx, n);
+	      return 0;
+	    }
+	  break;
+	case r_data:
+	  /* shouldn't happen */
+	  break;
+	}
+      return n;
+    }
+}
+
+
+
+
+/* This page: functions to build and destroy graphs that describe nfa's */
+
+/* Constructs a new nfa node. */
+#ifdef __STDC__
+RX_DECL struct rx_nfa_state *
+rx_nfa_state (struct rx *rx)
+#else
+RX_DECL struct rx_nfa_state *
+rx_nfa_state (rx)
+     struct rx *rx;
+#endif
+{
+  struct rx_nfa_state * n = (struct rx_nfa_state *)malloc (sizeof (*n));
+  if (!n)
+    return 0;
+  bzero (n, sizeof (*n));
+  n->next = rx->nfa_states;
+  rx->nfa_states = n;
+  return n;
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_nfa_state (struct rx_nfa_state * n)
+#else
+RX_DECL void
+rx_free_nfa_state (n)
+  struct rx_nfa_state * n;
+#endif
+{
+  free ((char *)n);
+}
+
+
+/* This looks up an nfa node, given a numeric id.  Numeric id's are
+ * assigned after the nfa has been built.
+ */
+#ifdef __STDC__
+RX_DECL struct rx_nfa_state * 
+rx_id_to_nfa_state (struct rx * rx,
+		    int id)
+#else
+RX_DECL struct rx_nfa_state * 
+rx_id_to_nfa_state (rx, id)
+     struct rx * rx;
+     int id;
+#endif
+{
+  struct rx_nfa_state * n;
+  for (n = rx->nfa_states; n; n = n->next)
+    if (n->id == id)
+      return n;
+  return 0;
+}
+
+
+/* This adds an edge between two nodes, but doesn't initialize the 
+ * edge label.
+ */
+
+#ifdef __STDC__
+RX_DECL struct rx_nfa_edge * 
+rx_nfa_edge (struct rx *rx,
+	     enum rx_nfa_etype type,
+	     struct rx_nfa_state *start,
+	     struct rx_nfa_state *dest)
+#else
+RX_DECL struct rx_nfa_edge * 
+rx_nfa_edge (rx, type, start, dest)
+     struct rx *rx;
+     enum rx_nfa_etype type;
+     struct rx_nfa_state *start;
+     struct rx_nfa_state *dest;
+#endif
+{
+  struct rx_nfa_edge *e;
+  e = (struct rx_nfa_edge *)malloc (sizeof (*e));
+  if (!e)
+    return 0;
+  e->next = start->edges;
+  start->edges = e;
+  e->type = type;
+  e->dest = dest;
+  return e;
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_nfa_edge (struct rx_nfa_edge * e)
+#else
+RX_DECL void
+rx_free_nfa_edge (e)
+     struct rx_nfa_edge * e;
+#endif
+{
+  free ((char *)e);
+}
+
+
+/* This constructs a POSSIBLE_FUTURE, which is a kind epsilon-closure
+ * of an NFA.  These are added to an nfa automaticly by eclose_nfa.
+ */  
+
+#ifdef __STDC__
+static struct rx_possible_future * 
+rx_possible_future (struct rx * rx,
+		 struct rx_se_list * effects)
+#else
+static struct rx_possible_future * 
+rx_possible_future (rx, effects)
+     struct rx * rx;
+     struct rx_se_list * effects;
+#endif
+{
+  struct rx_possible_future *ec;
+  ec = (struct rx_possible_future *) malloc (sizeof (*ec));
+  if (!ec)
+    return 0;
+  ec->destset = 0;
+  ec->next = 0;
+  ec->effects = effects;
+  return ec;
+}
+
+
+#ifdef __STDC__
+static void
+rx_free_possible_future (struct rx_possible_future * pf)
+#else
+static void
+rx_free_possible_future (pf)
+     struct rx_possible_future * pf;
+#endif
+{
+  free ((char *)pf);
+}
+
+
+#ifdef __STDC__
+RX_DECL void
+rx_free_nfa (struct rx *rx)
+#else
+RX_DECL void
+rx_free_nfa (rx)
+     struct rx *rx;
+#endif
+{
+  while (rx->nfa_states)
+    {
+      while (rx->nfa_states->edges)
+	{
+	  switch (rx->nfa_states->edges->type)
+	    {
+	    case ne_cset:
+	      rx_free_cset (rx, rx->nfa_states->edges->params.cset);
+	      break;
+	    default:
+	      break;
+	    }
+	  {
+	    struct rx_nfa_edge * e;
+	    e = rx->nfa_states->edges;
+	    rx->nfa_states->edges = rx->nfa_states->edges->next;
+	    rx_free_nfa_edge (e);
+	  }
+	} /* while (rx->nfa_states->edges) */
+      {
+	/* Iterate over the partial epsilon closures of rx->nfa_states */
+	struct rx_possible_future * pf = rx->nfa_states->futures;
+	while (pf)
+	  {
+	    struct rx_possible_future * pft = pf;
+	    pf = pf->next;
+	    rx_free_possible_future (pft);
+	  }
+      }
+      {
+	struct rx_nfa_state *n;
+	n = rx->nfa_states;
+	rx->nfa_states = rx->nfa_states->next;
+	rx_free_nfa_state (n);
+      }
+    }
+}
+
+
+
+
+/* This page: translating a pattern expression into an nfa and doing the 
+ * static part of the nfa->super-nfa translation.
+ */
+
+/* This is the thompson regexp->nfa algorithm. 
+ * It is modified to allow for `side-effect epsilons.'  Those are
+ * edges that are taken whenever a similar epsilon edge would be,
+ * but which imply that some side effect occurs when the edge 
+ * is taken.
+ *
+ * Side effects are used to model parts of the pattern langauge 
+ * that are not regular (in the formal sense).
+ */
+
+#ifdef __STDC__
+RX_DECL int
+rx_build_nfa (struct rx *rx,
+	      struct rexp_node *rexp,
+	      struct rx_nfa_state **start,
+	      struct rx_nfa_state **end)
+#else
+RX_DECL int
+rx_build_nfa (rx, rexp, start, end)
+     struct rx *rx;
+     struct rexp_node *rexp;
+     struct rx_nfa_state **start;
+     struct rx_nfa_state **end;
+#endif
+{
+  struct rx_nfa_edge *edge;
+
+  /* Start & end nodes may have been allocated by the caller. */
+  *start = *start ? *start : rx_nfa_state (rx);
+
+  if (!*start)
+    return 0;
+
+  if (!rexp)
+    {
+      *end = *start;
+      return 1;
+    }
+
+  *end = *end ? *end : rx_nfa_state (rx);
+
+  if (!*end)
+    {
+      rx_free_nfa_state (*start);
+      return 0;
+    }
+
+  switch (rexp->type)
+    {
+    case r_data:
+      return 0;
+
+    case r_cset:
+      edge = rx_nfa_edge (rx, ne_cset, *start, *end);
+      if (!edge)
+	return 0;
+      edge->params.cset = rx_copy_cset (rx, rexp->params.cset);
+      if (!edge->params.cset)
+	{
+	  rx_free_nfa_edge (edge);
+	  return 0;
+	}
+      return 1;
+ 
+    case r_opt:
+      return (rx_build_nfa (rx, rexp->params.pair.left, start, end)
+	      && rx_nfa_edge (rx, ne_epsilon, *start, *end));
+
+    case r_star:
+      {
+	struct rx_nfa_state * star_start = 0;
+	struct rx_nfa_state * star_end = 0;
+	return (rx_build_nfa (rx, rexp->params.pair.left,
+			      &star_start, &star_end)
+		&& star_start
+		&& star_end
+		&& rx_nfa_edge (rx, ne_epsilon, star_start, star_end)
+		&& rx_nfa_edge (rx, ne_epsilon, *start, star_start)
+		&& rx_nfa_edge (rx, ne_epsilon, star_end, *end)
+
+		&& rx_nfa_edge (rx, ne_epsilon, star_end, star_start));
+      }
+
+    case r_2phase_star:
+      {
+	struct rx_nfa_state * star_start = 0;
+	struct rx_nfa_state * star_end = 0;
+	struct rx_nfa_state * loop_exp_start = 0;
+	struct rx_nfa_state * loop_exp_end = 0;
+
+	return (rx_build_nfa (rx, rexp->params.pair.left,
+			      &star_start, &star_end)
+		&& rx_build_nfa (rx, rexp->params.pair.right,
+				 &loop_exp_start, &loop_exp_end)
+		&& star_start
+		&& star_end
+		&& loop_exp_end
+		&& loop_exp_start
+		&& rx_nfa_edge (rx, ne_epsilon, star_start, *end)
+		&& rx_nfa_edge (rx, ne_epsilon, *start, star_start)
+		&& rx_nfa_edge (rx, ne_epsilon, star_end, *end)
+
+		&& rx_nfa_edge (rx, ne_epsilon, star_end, loop_exp_start)
+		&& rx_nfa_edge (rx, ne_epsilon, loop_exp_end, star_start));
+      }
+
+
+    case r_concat:
+      {
+	struct rx_nfa_state *shared = 0;
+	return
+	  (rx_build_nfa (rx, rexp->params.pair.left, start, &shared)
+	   && rx_build_nfa (rx, rexp->params.pair.right, &shared, end));
+      }
+
+    case r_alternate:
+      {
+	struct rx_nfa_state *ls = 0;
+	struct rx_nfa_state *le = 0;
+	struct rx_nfa_state *rs = 0;
+	struct rx_nfa_state *re = 0;
+	return (rx_build_nfa (rx, rexp->params.pair.left, &ls, &le)
+		&& rx_build_nfa (rx, rexp->params.pair.right, &rs, &re)
+		&& rx_nfa_edge (rx, ne_epsilon, *start, ls)
+		&& rx_nfa_edge (rx, ne_epsilon, *start, rs)
+		&& rx_nfa_edge (rx, ne_epsilon, le, *end)
+		&& rx_nfa_edge (rx, ne_epsilon, re, *end));
+      }
+
+    case r_side_effect:
+      edge = rx_nfa_edge (rx, ne_side_effect, *start, *end);
+      if (!edge)
+	return 0;
+      edge->params.side_effect = rexp->params.side_effect;
+      return 1;
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+/* RX_NAME_NFA_STATES identifies all nodes with outgoing non-epsilon
+ * transitions.  Only these nodes can occur in super-states.  
+ * All nodes are given an integer id. 
+ * The id is non-negative if the node has non-epsilon out-transitions, negative
+ * otherwise (this is because we want the non-negative ids to be used as 
+ * array indexes in a few places).
+ */
+
+#ifdef __STDC__
+RX_DECL void
+rx_name_nfa_states (struct rx *rx)
+#else
+RX_DECL void
+rx_name_nfa_states (rx)
+     struct rx *rx;
+#endif
+{
+  struct rx_nfa_state *n = rx->nfa_states;
+
+  rx->nodec = 0;
+  rx->epsnodec = -1;
+
+  while (n)
+    {
+      struct rx_nfa_edge *e = n->edges;
+
+      if (n->is_start)
+	n->eclosure_needed = 1;
+
+      while (e)
+	{
+	  switch (e->type)
+	    {
+	    case ne_epsilon:
+	    case ne_side_effect:
+	      break;
+
+	    case ne_cset:
+	      n->id = rx->nodec++;
+	      {
+		struct rx_nfa_edge *from_n = n->edges;
+		while (from_n)
+		  {
+		    from_n->dest->eclosure_needed = 1;
+		    from_n = from_n->next;
+		  }
+	      }
+	      goto cont;
+	    }
+	  e = e->next;
+	}
+      n->id = rx->epsnodec--;
+    cont:
+      n = n->next;
+    }
+  rx->epsnodec = -rx->epsnodec;
+}
+
+
+
+/* This page: data structures for the static part of the nfa->supernfa
+ * translation.
+ *
+ * There are side effect lists -- lists of side effects occuring
+ * along an uninterrupted, acyclic path of side-effect epsilon edges.
+ * Such paths are collapsed to single edges in the course of computing
+ * epsilon closures.  Such single edges are labled with a list of all
+ * the side effects entailed in crossing them.  Like lists of side
+ * effects are made == by the constructors below.
+ *
+ * There are also nfa state sets.  These are used to hold a list of all
+ * states reachable from a starting state for a given type of transition
+ * and side effect list.   These are also hash-consed.
+ */
+
+/* The next several functions compare, construct, etc. lists of side
+ * effects.  See ECLOSE_NFA (below) for details.
+ */
+
+/* Ordering of rx_se_list
+ * (-1, 0, 1 return value convention).
+ */
+
+#ifdef __STDC__
+static int 
+se_list_cmp (void * va, void * vb)
+#else
+static int 
+se_list_cmp (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  struct rx_se_list * a = (struct rx_se_list *)va;
+  struct rx_se_list * b = (struct rx_se_list *)vb;
+
+  return ((va == vb)
+	  ? 0
+	  : (!va
+	     ? -1
+	     : (!vb
+		? 1
+		: ((long)a->car < (long)b->car
+		   ? 1
+		   : ((long)a->car > (long)b->car
+		      ? -1
+		      : se_list_cmp ((void *)a->cdr, (void *)b->cdr))))));
+}
+
+
+#ifdef __STDC__
+static int 
+se_list_equal (void * va, void * vb)
+#else
+static int 
+se_list_equal (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  return !(se_list_cmp (va, vb));
+}
+
+static struct rx_hash_rules se_list_hash_rules =
+{
+  se_list_equal,
+  compiler_hash_alloc,
+  compiler_free_hash,
+  compiler_hash_item_alloc,
+  compiler_free_hash_item
+};
+
+
+#ifdef __STDC__
+static struct rx_se_list * 
+side_effect_cons (struct rx * rx,
+		  void * se, struct rx_se_list * list)
+#else
+static struct rx_se_list * 
+side_effect_cons (rx, se, list)
+     struct rx * rx;
+     void * se;
+     struct rx_se_list * list;
+#endif
+{
+  struct rx_se_list * l;
+  l = ((struct rx_se_list *) malloc (sizeof (*l)));
+  if (!l)
+    return 0;
+  l->car = se;
+  l->cdr = list;
+  return l;
+}
+
+
+#ifdef __STDC__
+static struct rx_se_list *
+hash_cons_se_prog (struct rx * rx,
+		   struct rx_hash * memo,
+		   void * car, struct rx_se_list * cdr)
+#else
+static struct rx_se_list *
+hash_cons_se_prog (rx, memo, car, cdr)
+     struct rx * rx;
+     struct rx_hash * memo;
+     void * car;
+     struct rx_se_list * cdr;
+#endif
+{
+  long hash = (long)car ^ (long)cdr;
+  struct rx_se_list template;
+
+  template.car = car;
+  template.cdr = cdr;
+  {
+    struct rx_hash_item * it = rx_hash_store (memo, hash,
+					      (void *)&template,
+					      &se_list_hash_rules);
+    if (!it)
+      return 0;
+    if (it->data == (void *)&template)
+      {
+	struct rx_se_list * consed;
+	consed = (struct rx_se_list *) malloc (sizeof (*consed));
+	*consed = template;
+	it->data = (void *)consed;
+      }
+    return (struct rx_se_list *)it->data;
+  }
+}
+     
+
+#ifdef __STDC__
+static struct rx_se_list *
+hash_se_prog (struct rx * rx, struct rx_hash * memo, struct rx_se_list * prog)
+#else
+static struct rx_se_list *
+hash_se_prog (rx, memo, prog)
+     struct rx * rx;
+     struct rx_hash * memo;
+     struct rx_se_list * prog;
+#endif
+{
+  struct rx_se_list * answer = 0;
+  while (prog)
+    {
+      answer = hash_cons_se_prog (rx, memo, prog->car, answer);
+      if (!answer)
+	return 0;
+      prog = prog->cdr;
+    }
+  return answer;
+}
+
+#ifdef __STDC__
+static int 
+nfa_set_cmp (void * va, void * vb)
+#else
+static int 
+nfa_set_cmp (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  struct rx_nfa_state_set * a = (struct rx_nfa_state_set *)va;
+  struct rx_nfa_state_set * b = (struct rx_nfa_state_set *)vb;
+
+  return ((va == vb)
+	  ? 0
+	  : (!va
+	     ? -1
+	     : (!vb
+		? 1
+		: (a->car->id < b->car->id
+		   ? 1
+		   : (a->car->id > b->car->id
+		      ? -1
+		      : nfa_set_cmp ((void *)a->cdr, (void *)b->cdr))))));
+}
+
+#ifdef __STDC__
+static int 
+nfa_set_equal (void * va, void * vb)
+#else
+static int 
+nfa_set_equal (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  return !nfa_set_cmp (va, vb);
+}
+
+static struct rx_hash_rules nfa_set_hash_rules =
+{
+  nfa_set_equal,
+  compiler_hash_alloc,
+  compiler_free_hash,
+  compiler_hash_item_alloc,
+  compiler_free_hash_item
+};
+
+
+#ifdef __STDC__
+static struct rx_nfa_state_set * 
+nfa_set_cons (struct rx * rx,
+	      struct rx_hash * memo, struct rx_nfa_state * state,
+	      struct rx_nfa_state_set * set)
+#else
+static struct rx_nfa_state_set * 
+nfa_set_cons (rx, memo, state, set)
+     struct rx * rx;
+     struct rx_hash * memo;
+     struct rx_nfa_state * state;
+     struct rx_nfa_state_set * set;
+#endif
+{
+  struct rx_nfa_state_set template;
+  struct rx_hash_item * node;
+  template.car = state;
+  template.cdr = set;
+  node = rx_hash_store (memo,
+			(((long)state) >> 8) ^ (long)set,
+			&template, &nfa_set_hash_rules);
+  if (!node)
+    return 0;
+  if (node->data == &template)
+    {
+      struct rx_nfa_state_set * l;
+      l = (struct rx_nfa_state_set *) malloc (sizeof (*l));
+      node->data = (void *) l;
+      if (!l)
+	return 0;
+      *l = template;
+    }
+  return (struct rx_nfa_state_set *)node->data;
+}
+
+
+#ifdef __STDC__
+static struct rx_nfa_state_set * 
+nfa_set_enjoin (struct rx * rx,
+		struct rx_hash * memo, struct rx_nfa_state * state,
+		struct rx_nfa_state_set * set)
+#else
+static struct rx_nfa_state_set * 
+nfa_set_enjoin (rx, memo, state, set)
+     struct rx * rx;
+     struct rx_hash * memo;
+     struct rx_nfa_state * state;
+     struct rx_nfa_state_set * set;
+#endif
+{
+  if (!set || state->id < set->car->id)
+    return nfa_set_cons (rx, memo, state, set);
+  if (state->id == set->car->id)
+    return set;
+  else
+    {
+      struct rx_nfa_state_set * newcdr
+	= nfa_set_enjoin (rx, memo, state, set->cdr);
+      if (newcdr != set->cdr)
+	set = nfa_set_cons (rx, memo, set->car, newcdr);
+      return set;
+    }
+}
+
+
+
+
+/* This page: computing epsilon closures.  The closures aren't total.
+ * Each node's closures are partitioned according to the side effects entailed
+ * along the epsilon edges.  Return true on success.
+ */ 
+
+struct eclose_frame
+{
+  struct rx_se_list *prog_backwards;
+};
+
+
+#ifdef __STDC__
+static int 
+eclose_node (struct rx *rx, struct rx_nfa_state *outnode,
+	     struct rx_nfa_state *node, struct eclose_frame *frame)
+#else
+static int 
+eclose_node (rx, outnode, node, frame)
+     struct rx *rx;
+     struct rx_nfa_state *outnode;
+     struct rx_nfa_state *node;
+     struct eclose_frame *frame;
+#endif
+{
+  struct rx_nfa_edge *e = node->edges;
+
+  /* For each node, we follow all epsilon paths to build the closure.
+   * The closure omits nodes that have only epsilon edges.
+   * The closure is split into partial closures -- all the states in
+   * a partial closure are reached by crossing the same list of
+   * of side effects (though not necessarily the same path).
+   */
+  if (node->mark)
+    return 1;
+  node->mark = 1;
+
+  if (node->id >= 0 || node->is_final)
+    {
+      struct rx_possible_future **ec;
+      struct rx_se_list * prog_in_order
+	= ((struct rx_se_list *)hash_se_prog (rx,
+					      &rx->se_list_memo,
+					      frame->prog_backwards));
+      int cmp;
+
+      ec = &outnode->futures;
+
+      while (*ec)
+	{
+	  cmp = se_list_cmp ((void *)(*ec)->effects, (void *)prog_in_order);
+	  if (cmp <= 0)
+	    break;
+	  ec = &(*ec)->next;
+	}
+      if (!*ec || (cmp < 0))
+	{
+	  struct rx_possible_future * saved = *ec;
+	  *ec = rx_possible_future (rx, prog_in_order);
+	  (*ec)->next = saved;
+	  if (!*ec)
+	    return 0;
+	}
+      if (node->id >= 0)
+	{
+	  (*ec)->destset = nfa_set_enjoin (rx, &rx->set_list_memo,
+					   node, (*ec)->destset);
+	  if (!(*ec)->destset)
+	    return 0;
+	}
+    }
+
+  while (e)
+    {
+      switch (e->type)
+	{
+	case ne_epsilon:
+	  if (!eclose_node (rx, outnode, e->dest, frame))
+	    return 0;
+	  break;
+	case ne_side_effect:
+	  {
+	    frame->prog_backwards = side_effect_cons (rx, 
+						      e->params.side_effect,
+						      frame->prog_backwards);
+	    if (!frame->prog_backwards)
+	      return 0;
+	    if (!eclose_node (rx, outnode, e->dest, frame))
+	      return 0;
+	    {
+	      struct rx_se_list * dying = frame->prog_backwards;
+	      frame->prog_backwards = frame->prog_backwards->cdr;
+	      free ((char *)dying);
+	    }
+	    break;
+	  }
+	default:
+	  break;
+	}
+      e = e->next;
+    }
+  node->mark = 0;
+  return 1;
+}
+
+
+#ifdef __STDC__
+RX_DECL int 
+rx_eclose_nfa (struct rx *rx)
+#else
+RX_DECL int 
+rx_eclose_nfa (rx)
+     struct rx *rx;
+#endif
+{
+  struct rx_nfa_state *n = rx->nfa_states;
+  struct eclose_frame frame;
+  static int rx_id = 0;
+  
+  frame.prog_backwards = 0;
+  rx->rx_id = rx_id++;
+  bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
+  bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
+  while (n)
+    {
+      n->futures = 0;
+      if (n->eclosure_needed && !eclose_node (rx, n, n, &frame))
+	return 0;
+      /* clear_marks (rx); */
+      n = n->next;
+    }
+  return 1;
+}
+
+
+/* This deletes epsilon edges from an NFA.  After running eclose_node,
+ * we have no more need for these edges.  They are removed to simplify
+ * further operations on the NFA.
+ */
+
+#ifdef __STDC__
+RX_DECL void 
+rx_delete_epsilon_transitions (struct rx *rx)
+#else
+RX_DECL void 
+rx_delete_epsilon_transitions (rx)
+     struct rx *rx;
+#endif
+{
+  struct rx_nfa_state *n = rx->nfa_states;
+  struct rx_nfa_edge **e;
+
+  while (n)
+    {
+      e = &n->edges;
+      while (*e)
+	{
+	  struct rx_nfa_edge *t;
+	  switch ((*e)->type)
+	    {
+	    case ne_epsilon:
+	    case ne_side_effect:
+	      t = *e;
+	      *e = t->next;
+	      rx_free_nfa_edge (t);
+	      break;
+
+	    default:
+	      e = &(*e)->next;
+	      break;
+	    }
+	}
+      n = n->next;
+    }
+}
+
+
+
+/* This page: storing the nfa in a contiguous region of memory for
+ * subsequent conversion to a super-nfa.
+ */
+
+/* This is for qsort on an array of nfa_states. The order
+ * is based on state ids and goes 
+ *		[0...MAX][MIN..-1] where (MAX>=0) and (MIN<0)
+ * This way, positive ids double as array indices.
+ */
+
+#ifdef __STDC__
+static int 
+nfacmp (void * va, void * vb)
+#else
+static int 
+nfacmp (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  struct rx_nfa_state **a = (struct rx_nfa_state **)va;
+  struct rx_nfa_state **b = (struct rx_nfa_state **)vb;
+  return (*a == *b		/* &&&& 3.18 */
+	  ? 0
+	  : (((*a)->id < 0) == ((*b)->id < 0)
+	     ? (((*a)->id  < (*b)->id) ? -1 : 1)
+	     : (((*a)->id < 0)
+		? 1 : -1)));
+}
+
+#ifdef __STDC__
+static int 
+count_hash_nodes (struct rx_hash * st)
+#else
+static int 
+count_hash_nodes (st)
+     struct rx_hash * st;
+#endif
+{
+  int x;
+  int count = 0;
+  for (x = 0; x < 13; ++x)
+    count += ((st->children[x])
+	      ? count_hash_nodes (st->children[x])
+	      : st->bucket_size[x]);
+  
+  return count;
+}
+
+
+#ifdef __STDC__
+static void 
+se_memo_freer (struct rx_hash_item * node)
+#else
+static void 
+se_memo_freer (node)
+     struct rx_hash_item * node;
+#endif
+{
+  free ((char *)node->data);
+}
+
+
+#ifdef __STDC__
+static void 
+nfa_set_freer (struct rx_hash_item * node)
+#else
+static void 
+nfa_set_freer (node)
+     struct rx_hash_item * node;
+#endif
+{
+  free ((char *)node->data);
+}
+
+
+/* This copies an entire NFA into a single malloced block of memory.
+ * Mostly this is for compatability with regex.c, though it is convenient
+ * to have the nfa nodes in an array.
+ */
+
+#ifdef __STDC__
+RX_DECL int 
+rx_compactify_nfa (struct rx *rx,
+		   void **mem, unsigned long *size)
+#else
+RX_DECL int 
+rx_compactify_nfa (rx, mem, size)
+     struct rx *rx;
+     void **mem;
+     unsigned long *size;
+#endif
+{
+  int total_nodec;
+  struct rx_nfa_state *n;
+  int edgec = 0;
+  int eclosec = 0;
+  int se_list_consc = count_hash_nodes (&rx->se_list_memo);
+  int nfa_setc = count_hash_nodes (&rx->set_list_memo);
+  unsigned long total_size;
+
+  /* This takes place in two stages.   First, the total size of the
+   * nfa is computed, then structures are copied.  
+   */   
+  n = rx->nfa_states;
+  total_nodec = 0;
+  while (n)
+    {
+      struct rx_nfa_edge *e = n->edges;
+      struct rx_possible_future *ec = n->futures;
+      ++total_nodec;
+      while (e)
+	{
+	  ++edgec;
+	  e = e->next;
+	}
+      while (ec)
+	{
+	  ++eclosec;
+	  ec = ec->next;
+	}
+      n = n->next;
+    }
+
+  total_size = (total_nodec * sizeof (struct rx_nfa_state)
+		+ edgec * rx_sizeof_bitset (rx->local_cset_size)
+		+ edgec * sizeof (struct rx_nfa_edge)
+		+ nfa_setc * sizeof (struct rx_nfa_state_set)
+		+ eclosec * sizeof (struct rx_possible_future)
+		+ se_list_consc * sizeof (struct rx_se_list)
+		+ rx->reserved);
+
+  if (total_size > *size)
+    {
+      *mem = remalloc (*mem, total_size);
+      if (*mem)
+	*size = total_size;
+      else
+	return 0;
+    }
+  /* Now we've allocated the memory; this copies the NFA. */
+  {
+    static struct rx_nfa_state **scratch = 0;
+    static int scratch_alloc = 0;
+    struct rx_nfa_state *state_base = (struct rx_nfa_state *) * mem;
+    struct rx_nfa_state *new_state = state_base;
+    struct rx_nfa_edge *new_edge =
+      (struct rx_nfa_edge *)
+	((char *) state_base + total_nodec * sizeof (struct rx_nfa_state));
+    struct rx_se_list * new_se_list =
+      (struct rx_se_list *)
+	((char *)new_edge + edgec * sizeof (struct rx_nfa_edge));
+    struct rx_possible_future *new_close =
+      ((struct rx_possible_future *)
+       ((char *) new_se_list
+	+ se_list_consc * sizeof (struct rx_se_list)));
+    struct rx_nfa_state_set * new_nfa_set =
+      ((struct rx_nfa_state_set *)
+       ((char *)new_close + eclosec * sizeof (struct rx_possible_future)));
+    char *new_bitset =
+      ((char *) new_nfa_set + nfa_setc * sizeof (struct rx_nfa_state_set));
+    int x;
+    struct rx_nfa_state *n;
+
+    if (scratch_alloc < total_nodec)
+      {
+	scratch = ((struct rx_nfa_state **)
+		   remalloc (scratch, total_nodec * sizeof (*scratch)));
+	if (scratch)
+	  scratch_alloc = total_nodec;
+	else
+	  {
+	    scratch_alloc = 0;
+	    return 0;
+	  }
+      }
+
+    for (x = 0, n = rx->nfa_states; n; n = n->next)
+      scratch[x++] = n;
+
+    qsort (scratch, total_nodec,
+	   sizeof (struct rx_nfa_state *), (int (*)())nfacmp);
+
+    for (x = 0; x < total_nodec; ++x)
+      {
+	struct rx_possible_future *eclose = scratch[x]->futures;
+	struct rx_nfa_edge *edge = scratch[x]->edges;
+	struct rx_nfa_state *cn = new_state++;
+	cn->futures = 0;
+	cn->edges = 0;
+	cn->next = (x == total_nodec - 1) ? 0 : (cn + 1);
+	cn->id = scratch[x]->id;
+	cn->is_final = scratch[x]->is_final;
+	cn->is_start = scratch[x]->is_start;
+	cn->mark = 0;
+	while (edge)
+	  {
+	    int indx = (edge->dest->id < 0
+			 ? (total_nodec + edge->dest->id)
+			 : edge->dest->id);
+	    struct rx_nfa_edge *e = new_edge++;
+	    rx_Bitset cset = (rx_Bitset) new_bitset;
+	    new_bitset += rx_sizeof_bitset (rx->local_cset_size);
+	    rx_bitset_null (rx->local_cset_size, cset);
+	    rx_bitset_union (rx->local_cset_size, cset, edge->params.cset);
+	    e->next = cn->edges;
+	    cn->edges = e;
+	    e->type = edge->type;
+	    e->dest = state_base + indx;
+	    e->params.cset = cset;
+	    edge = edge->next;
+	  }
+	while (eclose)
+	  {
+	    struct rx_possible_future *ec = new_close++;
+	    struct rx_hash_item * sp;
+	    struct rx_se_list ** sepos;
+	    struct rx_se_list * sesrc;
+	    struct rx_nfa_state_set * destlst;
+	    struct rx_nfa_state_set ** destpos;
+	    ec->next = cn->futures;
+	    cn->futures = ec;
+	    for (sepos = &ec->effects, sesrc = eclose->effects;
+		 sesrc;
+		 sesrc = sesrc->cdr, sepos = &(*sepos)->cdr)
+	      {
+		sp = rx_hash_find (&rx->se_list_memo,
+				   (long)sesrc->car ^ (long)sesrc->cdr,
+				   sesrc, &se_list_hash_rules);
+		if (sp->binding)
+		  {
+		    sesrc = (struct rx_se_list *)sp->binding;
+		    break;
+		  }
+		*new_se_list = *sesrc;
+		sp->binding = (void *)new_se_list;
+		*sepos = new_se_list;
+		++new_se_list;
+	      }
+	    *sepos = sesrc;
+	    for (destpos = &ec->destset, destlst = eclose->destset;
+		 destlst;
+		 destpos = &(*destpos)->cdr, destlst = destlst->cdr)
+	      {
+		sp = rx_hash_find (&rx->set_list_memo,
+				   ((((long)destlst->car) >> 8)
+				    ^ (long)destlst->cdr),
+				   destlst, &nfa_set_hash_rules);
+		if (sp->binding)
+		  {
+		    destlst = (struct rx_nfa_state_set *)sp->binding;
+		    break;
+		  }
+		*new_nfa_set = *destlst;
+		new_nfa_set->car = state_base + destlst->car->id;
+		sp->binding = (void *)new_nfa_set;
+		*destpos = new_nfa_set;
+		++new_nfa_set;
+	      }
+	    *destpos = destlst;
+	    eclose = eclose->next;
+	  }
+      }
+  }
+  rx_free_hash_table (&rx->se_list_memo, se_memo_freer, &se_list_hash_rules);
+  bzero (&rx->se_list_memo, sizeof (rx->se_list_memo));
+  rx_free_hash_table (&rx->set_list_memo, nfa_set_freer, &nfa_set_hash_rules);
+  bzero (&rx->set_list_memo, sizeof (rx->set_list_memo));
+
+  rx_free_nfa (rx);
+  rx->nfa_states = (struct rx_nfa_state *)*mem;
+  return 1;
+}
+
+
+
+/* The functions in the next several pages define the lazy-NFA-conversion used
+ * by matchers.  The input to this construction is an NFA such as 
+ * is built by compactify_nfa (rx.c).  The output is the superNFA.
+ */
+
+/* Match engines can use arbitrary values for opcodes.  So, the parse tree 
+ * is built using instructions names (enum rx_opcode), but the superstate
+ * nfa is populated with mystery opcodes (void *).
+ *
+ * For convenience, here is an id table.  The opcodes are == to their inxs
+ *
+ * The lables in re_search_2 would make good values for instructions.
+ */
+
+void * rx_id_instruction_table[rx_num_instructions] =
+{
+  (void *) rx_backtrack_point,
+  (void *) rx_do_side_effects,
+  (void *) rx_cache_miss,
+  (void *) rx_next_char,
+  (void *) rx_backtrack,
+  (void *) rx_error_inx
+};
+
+
+
+
+/* Memory mgt. for superstate graphs. */
+
+#ifdef __STDC__
+static char *
+rx_cache_malloc (struct rx_cache * cache, int bytes)
+#else
+static char *
+rx_cache_malloc (cache, bytes)
+     struct rx_cache * cache;
+     int bytes;
+#endif
+{
+  while (cache->bytes_left < bytes)
+    {
+      if (cache->memory_pos)
+	cache->memory_pos = cache->memory_pos->next;
+      if (!cache->memory_pos)
+	{
+	  cache->morecore (cache);
+	  if (!cache->memory_pos)
+	    return 0;
+	}
+      cache->bytes_left = cache->memory_pos->bytes;
+      cache->memory_addr = ((char *)cache->memory_pos
+			    + sizeof (struct rx_blocklist));
+    }
+  cache->bytes_left -= bytes;
+  {
+    char * addr = cache->memory_addr;
+    cache->memory_addr += bytes;
+    return addr;
+  }
+}
+
+#ifdef __STDC__
+static void
+rx_cache_free (struct rx_cache * cache,
+	       struct rx_freelist ** freelist, char * mem)
+#else
+static void
+rx_cache_free (cache, freelist, mem)
+     struct rx_cache * cache;
+     struct rx_freelist ** freelist;
+     char * mem;
+#endif
+{
+  struct rx_freelist * it = (struct rx_freelist *)mem;
+  it->next = *freelist;
+  *freelist = it;
+}
+
+
+/* The partially instantiated superstate graph has a transition 
+ * table at every node.  There is one entry for every character.
+ * This fills in the transition for a set.
+ */
+#ifdef __STDC__
+static void 
+install_transition (struct rx_superstate *super,
+		    struct rx_inx *answer, rx_Bitset trcset) 
+#else
+static void 
+install_transition (super, answer, trcset)
+     struct rx_superstate *super;
+     struct rx_inx *answer;
+     rx_Bitset trcset;
+#endif
+{
+  struct rx_inx * transitions = super->transitions;
+  int chr;
+  for (chr = 0; chr < 256; )
+    if (!*trcset)
+      {
+	++trcset;
+	chr += 32;
+      }
+    else
+      {
+	RX_subset sub = *trcset;
+	RX_subset mask = 1;
+	int bound = chr + 32;
+	while (chr < bound)
+	  {
+	    if (sub & mask)
+	      transitions [chr] = *answer;
+	    ++chr;
+	    mask <<= 1;
+	  }
+	++trcset;
+      }
+}
+
+
+#ifdef __STDC__
+static int
+qlen (struct rx_superstate * q)
+#else
+static int
+qlen (q)
+     struct rx_superstate * q;
+#endif
+{
+  int count = 1;
+  struct rx_superstate * it;
+  if (!q)
+    return 0;
+  for (it = q->next_recyclable; it != q; it = it->next_recyclable)
+    ++count;
+  return count;
+}
+
+#ifdef __STDC__
+static void
+check_cache (struct rx_cache * cache)
+#else
+static void
+check_cache (cache)
+     struct rx_cache * cache;
+#endif
+{
+  struct rx_cache * you_fucked_up = 0;
+  int total = cache->superstates;
+  int semi = cache->semifree_superstates;
+  if (semi != qlen (cache->semifree_superstate))
+    check_cache (you_fucked_up);
+  if ((total - semi) != qlen (cache->lru_superstate))
+    check_cache (you_fucked_up);
+}
+
+/* When a superstate is old and neglected, it can enter a 
+ * semi-free state.  A semi-free state is slated to die.
+ * Incoming transitions to a semi-free state are re-written
+ * to cause an (interpreted) fault when they are taken.
+ * The fault handler revives the semi-free state, patches
+ * incoming transitions back to normal, and continues.
+ *
+ * The idea is basicly to free in two stages, aborting 
+ * between the two if the state turns out to be useful again.
+ * When a free is aborted, the rescued superstate is placed
+ * in the most-favored slot to maximize the time until it
+ * is next semi-freed.
+ */
+
+#ifdef __STDC__
+static void
+semifree_superstate (struct rx_cache * cache)
+#else
+static void
+semifree_superstate (cache)
+     struct rx_cache * cache;
+#endif
+{
+  int disqualified = cache->semifree_superstates;
+  if (disqualified == cache->superstates)
+    return;
+  while (cache->lru_superstate->locks)
+    {
+      cache->lru_superstate = cache->lru_superstate->next_recyclable;
+      ++disqualified;
+      if (disqualified == cache->superstates)
+	return;
+    }
+  {
+    struct rx_superstate * it = cache->lru_superstate;
+    it->next_recyclable->prev_recyclable = it->prev_recyclable;
+    it->prev_recyclable->next_recyclable = it->next_recyclable;
+    cache->lru_superstate = (it == it->next_recyclable
+			     ? 0
+			     : it->next_recyclable);
+    if (!cache->semifree_superstate)
+      {
+	cache->semifree_superstate = it;
+	it->next_recyclable = it;
+	it->prev_recyclable = it;
+      }
+    else
+      {
+	it->prev_recyclable = cache->semifree_superstate->prev_recyclable;
+	it->next_recyclable = cache->semifree_superstate;
+	it->prev_recyclable->next_recyclable = it;
+	it->next_recyclable->prev_recyclable = it;
+      }
+    {
+      struct rx_distinct_future *df;
+      it->is_semifree = 1;
+      ++cache->semifree_superstates;
+      df = it->transition_refs;
+      if (df)
+	{
+	  df->prev_same_dest->next_same_dest = 0;
+	  for (df = it->transition_refs; df; df = df->next_same_dest)
+	    {
+	      df->future_frame.inx = cache->instruction_table[rx_cache_miss];
+	      df->future_frame.data = 0;
+	      df->future_frame.data_2 = (void *) df;
+	      /* If there are any NEXT-CHAR instruction frames that
+	       * refer to this state, we convert them to CACHE-MISS frames.
+	       */
+	      if (!df->effects
+		  && (df->edge->options->next_same_super_edge[0]
+		      == df->edge->options))
+		install_transition (df->present, &df->future_frame,
+				    df->edge->cset);
+	    }
+	  df = it->transition_refs;
+	  df->prev_same_dest->next_same_dest = df;
+	}
+    }
+  }
+}
+
+
+#ifdef __STDC__
+static void 
+refresh_semifree_superstate (struct rx_cache * cache,
+			     struct rx_superstate * super)
+#else
+static void 
+refresh_semifree_superstate (cache, super)
+     struct rx_cache * cache;
+     struct rx_superstate * super;
+#endif
+{
+  struct rx_distinct_future *df;
+
+  if (super->transition_refs)
+    {
+      super->transition_refs->prev_same_dest->next_same_dest = 0; 
+      for (df = super->transition_refs; df; df = df->next_same_dest)
+	{
+	  df->future_frame.inx = cache->instruction_table[rx_next_char];
+	  df->future_frame.data = (void *) super->transitions;
+	  /* CACHE-MISS instruction frames that refer to this state,
+	   * must be converted to NEXT-CHAR frames.
+	   */
+	  if (!df->effects
+	      && (df->edge->options->next_same_super_edge[0]
+		  == df->edge->options))
+	    install_transition (df->present, &df->future_frame,
+				df->edge->cset);
+	}
+      super->transition_refs->prev_same_dest->next_same_dest
+	= super->transition_refs;
+    }
+  if (cache->semifree_superstate == super)
+    cache->semifree_superstate = (super->prev_recyclable == super
+				  ? 0
+				  : super->prev_recyclable);
+  super->next_recyclable->prev_recyclable = super->prev_recyclable;
+  super->prev_recyclable->next_recyclable = super->next_recyclable;
+
+  if (!cache->lru_superstate)
+    (cache->lru_superstate
+     = super->next_recyclable
+     = super->prev_recyclable
+     = super);
+  else
+    {
+      super->next_recyclable = cache->lru_superstate;
+      super->prev_recyclable = cache->lru_superstate->prev_recyclable;
+      super->next_recyclable->prev_recyclable = super;
+      super->prev_recyclable->next_recyclable = super;
+    }
+  super->is_semifree = 0;
+  --cache->semifree_superstates;
+}
+
+#ifdef __STDC__
+static void
+rx_refresh_this_superstate (struct rx_cache * cache, struct rx_superstate * superstate)
+#else
+static void
+rx_refresh_this_superstate (cache, superstate)
+     struct rx_cache * cache;
+     struct rx_superstate * superstate;
+#endif
+{
+  if (superstate->is_semifree)
+    refresh_semifree_superstate (cache, superstate);
+  else if (cache->lru_superstate == superstate)
+    cache->lru_superstate = superstate->next_recyclable;
+  else if (superstate != cache->lru_superstate->prev_recyclable)
+    {
+      superstate->next_recyclable->prev_recyclable
+	= superstate->prev_recyclable;
+      superstate->prev_recyclable->next_recyclable
+	= superstate->next_recyclable;
+      superstate->next_recyclable = cache->lru_superstate;
+      superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
+      superstate->next_recyclable->prev_recyclable = superstate;
+      superstate->prev_recyclable->next_recyclable = superstate;
+    }
+}
+
+#ifdef __STDC__
+static void 
+release_superset_low (struct rx_cache * cache,
+		     struct rx_superset *set)
+#else
+static void 
+release_superset_low (cache, set)
+     struct rx_cache * cache;
+     struct rx_superset *set;
+#endif
+{
+  if (!--set->refs)
+    {
+      if (set->cdr)
+	release_superset_low (cache, set->cdr);
+
+      set->starts_for = 0;
+
+      rx_hash_free
+	(rx_hash_find
+	 (&cache->superset_table,
+	  (unsigned long)set->car ^ set->id ^ (unsigned long)set->cdr,
+	  (void *)set,
+	  &cache->superset_hash_rules),
+	 &cache->superset_hash_rules);
+      rx_cache_free (cache, &cache->free_supersets, (char *)set);
+    }
+}
+
+#ifdef __STDC__
+RX_DECL void 
+rx_release_superset (struct rx *rx,
+		     struct rx_superset *set)
+#else
+RX_DECL void 
+rx_release_superset (rx, set)
+     struct rx *rx;
+     struct rx_superset *set;
+#endif
+{
+  release_superset_low (rx->cache, set);
+}
+
+/* This tries to add a new superstate to the superstate freelist.
+ * It might, as a result, free some edge pieces or hash tables.
+ * If nothing can be freed because too many locks are being held, fail.
+ */
+
+#ifdef __STDC__
+static int
+rx_really_free_superstate (struct rx_cache * cache)
+#else
+static int
+rx_really_free_superstate (cache)
+     struct rx_cache * cache;
+#endif
+{
+  int locked_superstates = 0;
+  struct rx_superstate * it;
+
+  if (!cache->superstates)
+    return 0;
+
+  {
+    /* This is a total guess.  The idea is that we should expect as
+     * many misses as we've recently experienced.  I.e., cache->misses
+     * should be the same as cache->semifree_superstates.
+     */
+    while ((cache->hits + cache->misses) > cache->superstates_allowed)
+      {
+	cache->hits >>= 1;
+	cache->misses >>= 1;
+      }
+    if (  ((cache->hits + cache->misses) * cache->semifree_superstates)
+	< (cache->superstates		 * cache->misses))
+      {
+	semifree_superstate (cache);
+	semifree_superstate (cache);
+      }
+  }
+
+  while (cache->semifree_superstate && cache->semifree_superstate->locks)
+    {
+      refresh_semifree_superstate (cache, cache->semifree_superstate);
+      ++locked_superstates;
+      if (locked_superstates == cache->superstates)
+	return 0;
+    }
+
+  if (cache->semifree_superstate)
+    {
+      it = cache->semifree_superstate;
+      it->next_recyclable->prev_recyclable = it->prev_recyclable;
+      it->prev_recyclable->next_recyclable = it->next_recyclable;
+      cache->semifree_superstate = ((it == it->next_recyclable)
+				    ? 0
+				    : it->next_recyclable);
+      --cache->semifree_superstates;
+    }
+  else
+    {
+      while (cache->lru_superstate->locks)
+	{
+	  cache->lru_superstate = cache->lru_superstate->next_recyclable;
+	  ++locked_superstates;
+	  if (locked_superstates == cache->superstates)
+	    return 0;
+	}
+      it = cache->lru_superstate;
+      it->next_recyclable->prev_recyclable = it->prev_recyclable;
+      it->prev_recyclable->next_recyclable = it->next_recyclable;
+      cache->lru_superstate = ((it == it->next_recyclable)
+				    ? 0
+				    : it->next_recyclable);
+    }
+
+  if (it->transition_refs)
+    {
+      struct rx_distinct_future *df;
+      for (df = it->transition_refs,
+	   df->prev_same_dest->next_same_dest = 0;
+	   df;
+	   df = df->next_same_dest)
+	{
+	  df->future_frame.inx = cache->instruction_table[rx_cache_miss];
+	  df->future_frame.data = 0;
+	  df->future_frame.data_2 = (void *) df;
+	  df->future = 0;
+	}
+      it->transition_refs->prev_same_dest->next_same_dest =
+	it->transition_refs;
+    }
+  {
+    struct rx_super_edge *tc = it->edges;
+    while (tc)
+      {
+	struct rx_distinct_future * df;
+	struct rx_super_edge *tct = tc->next;
+	df = tc->options;
+	df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
+	while (df)
+	  {
+	    struct rx_distinct_future *dft = df;
+	    df = df->next_same_super_edge[0];
+	    
+	    
+	    if (dft->future && dft->future->transition_refs == dft)
+	      {
+		dft->future->transition_refs = dft->next_same_dest;
+		if (dft->future->transition_refs == dft)
+		  dft->future->transition_refs = 0;
+	      }
+	    dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
+	    dft->prev_same_dest->next_same_dest = dft->next_same_dest;
+	    rx_cache_free (cache, &cache->free_discernable_futures,
+			   (char *)dft);
+	  }
+	rx_cache_free (cache, &cache->free_transition_classes, (char *)tc);
+	tc = tct;
+      }
+  }
+  
+  if (it->contents->superstate == it)
+    it->contents->superstate = 0;
+  release_superset_low (cache, it->contents);
+  rx_cache_free (cache, &cache->free_superstates, (char *)it);
+  --cache->superstates;
+  return 1;
+}
+
+#ifdef __STDC__
+static char *
+rx_cache_get (struct rx_cache * cache,
+	      struct rx_freelist ** freelist)
+#else
+static char *
+rx_cache_get (cache, freelist)
+     struct rx_cache * cache;
+     struct rx_freelist ** freelist;
+#endif
+{
+  while (!*freelist && rx_really_free_superstate (cache))
+    ;
+  if (!*freelist)
+    return 0;
+  {
+    struct rx_freelist * it = *freelist;
+    *freelist = it->next;
+    return (char *)it;
+  }
+}
+
+#ifdef __STDC__
+static char *
+rx_cache_malloc_or_get (struct rx_cache * cache,
+			struct rx_freelist ** freelist, int bytes)
+#else
+static char *
+rx_cache_malloc_or_get (cache, freelist, bytes)
+     struct rx_cache * cache;
+     struct rx_freelist ** freelist;
+     int bytes;
+#endif
+{
+  if (!*freelist)
+    {
+      char * answer = rx_cache_malloc (cache, bytes);
+      if (answer)
+	return answer;
+    }
+
+  return rx_cache_get (cache, freelist);
+}
+
+#ifdef __STDC__
+static char *
+rx_cache_get_superstate (struct rx_cache * cache)
+#else
+static char *
+rx_cache_get_superstate (cache)
+	  struct rx_cache * cache;
+#endif
+{
+  char * answer;
+  int bytes = (   sizeof (struct rx_superstate)
+	       +  cache->local_cset_size * sizeof (struct rx_inx));
+  if (!cache->free_superstates
+      && (cache->superstates < cache->superstates_allowed))
+    {
+      answer = rx_cache_malloc (cache, bytes);
+      if (answer)
+	{
+	  ++cache->superstates;
+	  return answer;
+	}
+    }
+  answer = rx_cache_get (cache, &cache->free_superstates);
+  if (!answer)
+    {
+      answer = rx_cache_malloc (cache, bytes);
+      if (answer)
+	++cache->superstates_allowed;
+    }
+  ++cache->superstates;
+  return answer;
+}
+
+
+
+
+#ifdef __STDC__
+static int
+supersetcmp (void * va, void * vb)
+#else
+static int
+supersetcmp (va, vb)
+     void * va;
+     void * vb;
+#endif
+{
+  struct rx_superset * a = (struct rx_superset *)va;
+  struct rx_superset * b = (struct rx_superset *)vb;
+  return (   (a == b)
+	  || (a && b && (a->car == b->car) && (a->cdr == b->cdr)));
+}
+
+#ifdef __STDC__
+static struct rx_hash_item *
+superset_allocator (struct rx_hash_rules * rules, void * val)
+#else
+static struct rx_hash_item *
+superset_allocator (rules, val)
+     struct rx_hash_rules * rules;
+     void * val;
+#endif
+{
+  struct rx_cache * cache
+    = ((struct rx_cache *)
+       ((char *)rules
+	- (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
+  struct rx_superset * template = (struct rx_superset *)val;
+  struct rx_superset * newset
+    = ((struct rx_superset *)
+       rx_cache_malloc_or_get (cache,
+			       &cache->free_supersets,
+			       sizeof (*template)));
+  if (!newset)
+    return 0;
+  newset->refs = 0;
+  newset->car = template->car;
+  newset->id = template->car->id;
+  newset->cdr = template->cdr;
+  newset->superstate = 0;
+  rx_protect_superset (rx, template->cdr);
+  newset->hash_item.data = (void *)newset;
+  newset->hash_item.binding = 0;
+  return &newset->hash_item;
+}
+
+#ifdef __STDC__
+static struct rx_hash * 
+super_hash_allocator (struct rx_hash_rules * rules)
+#else
+static struct rx_hash * 
+super_hash_allocator (rules)
+     struct rx_hash_rules * rules;
+#endif
+{
+  struct rx_cache * cache
+    = ((struct rx_cache *)
+       ((char *)rules
+	- (unsigned long)(&((struct rx_cache *)0)->superset_hash_rules)));
+  return ((struct rx_hash *)
+	  rx_cache_malloc_or_get (cache,
+				  &cache->free_hash, sizeof (struct rx_hash)));
+}
+
+
+#ifdef __STDC__
+static void
+super_hash_liberator (struct rx_hash * hash, struct rx_hash_rules * rules)
+#else
+static void
+super_hash_liberator (hash, rules)
+     struct rx_hash * hash;
+     struct rx_hash_rules * rules;
+#endif
+{
+  struct rx_cache * cache
+    = ((struct rx_cache *)
+       (char *)rules - (long)(&((struct rx_cache *)0)->superset_hash_rules));
+  rx_cache_free (cache, &cache->free_hash, (char *)hash);
+}
+
+#ifdef __STDC__
+static void
+superset_hash_item_liberator (struct rx_hash_item * it,
+			      struct rx_hash_rules * rules)
+#else
+static void
+superset_hash_item_liberator (it, rules) /* Well, it does ya know. */
+     struct rx_hash_item * it;
+     struct rx_hash_rules * rules;
+#endif
+{
+}
+
+int rx_cache_bound = 128;
+static int rx_default_cache_got = 0;
+
+#ifdef __STDC__
+static int
+bytes_for_cache_size (int supers, int cset_size)
+#else
+static int
+bytes_for_cache_size (supers, cset_size)
+     int supers;
+     int cset_size;
+#endif
+{
+  /* What the hell is this? !!!*/
+  return (int)
+    ((float)supers *
+     (  (1.03 * (float) (  rx_sizeof_bitset (cset_size)
+			 + sizeof (struct rx_super_edge)))
+      + (1.80 * (float) sizeof (struct rx_possible_future))
+      + (float) (  sizeof (struct rx_superstate)
+		 + cset_size * sizeof (struct rx_inx))));
+}
+
+#ifdef __STDC__
+static void
+rx_morecore (struct rx_cache * cache)
+#else
+static void
+rx_morecore (cache)
+     struct rx_cache * cache;
+#endif
+{
+  if (rx_default_cache_got >= rx_cache_bound)
+    return;
+
+  rx_default_cache_got += 16;
+  cache->superstates_allowed = rx_cache_bound;
+  {
+    struct rx_blocklist ** pos = &cache->memory;
+    int size = bytes_for_cache_size (16, cache->local_cset_size);
+    while (*pos)
+      pos = &(*pos)->next;
+    *pos = ((struct rx_blocklist *)
+	    malloc (size + sizeof (struct rx_blocklist))); 
+    if (!*pos)
+      return;
+
+    (*pos)->next = 0;
+    (*pos)->bytes = size;
+    cache->memory_pos = *pos;
+    cache->memory_addr = (char *)*pos + sizeof (**pos);
+    cache->bytes_left = size;
+  }
+}
+
+static struct rx_cache default_cache = 
+{
+  {
+    supersetcmp,
+    super_hash_allocator,
+    super_hash_liberator,
+    superset_allocator,
+    superset_hash_item_liberator,
+  },
+  0,
+  0,
+  0,
+  0,
+  rx_morecore,
+
+  0,
+  0,
+  0,
+  0,
+  0,
+
+  0,
+  0,
+
+  0,
+
+  0,
+  0,
+  0,
+  0,
+  128,
+
+  256,
+  rx_id_instruction_table,
+
+  {
+    0,
+    0,
+    {0},
+    {0},
+    {0}
+  }
+};
+
+/* This adds an element to a superstate set.  These sets are lists, such
+ * that lists with == elements are ==.  The empty set is returned by
+ * superset_cons (rx, 0, 0) and is NOT equivelent to 
+ * (struct rx_superset)0.
+ */
+
+#ifdef __STDC__
+RX_DECL struct rx_superset *
+rx_superset_cons (struct rx * rx,
+		  struct rx_nfa_state *car, struct rx_superset *cdr)
+#else
+RX_DECL struct rx_superset *
+rx_superset_cons (rx, car, cdr)
+     struct rx * rx;
+     struct rx_nfa_state *car;
+     struct rx_superset *cdr;
+#endif
+{
+  struct rx_cache * cache = rx->cache;
+  if (!car && !cdr)
+    {
+      if (!cache->empty_superset)
+	{
+	  cache->empty_superset
+	    = ((struct rx_superset *)
+	       rx_cache_malloc_or_get (cache, &cache->free_supersets,
+				       sizeof (struct rx_superset)));
+	  if (!cache->empty_superset)
+	    return 0;
+	  bzero (cache->empty_superset, sizeof (struct rx_superset));
+	  cache->empty_superset->refs = 1000;
+	}
+      return cache->empty_superset;
+    }
+  {
+    struct rx_superset template;
+    struct rx_hash_item * hit;
+    template.car = car;
+    template.cdr = cdr;
+    template.id = car->id;
+    hit = rx_hash_store (&cache->superset_table,
+			 (unsigned long)car ^ car->id ^ (unsigned long)cdr,
+			 (void *)&template,
+			 &cache->superset_hash_rules);
+    return (hit
+	    ?  (struct rx_superset *)hit->data
+	    : 0);
+  }
+}
+
+/* This computes a union of two NFA state sets.  The sets do not have the
+ * same representation though.  One is a RX_SUPERSET structure (part
+ * of the superstate NFA) and the other is an NFA_STATE_SET (part of the NFA).
+ */
+
+#ifdef __STDC__
+RX_DECL struct rx_superset *
+rx_superstate_eclosure_union
+  (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl) 
+#else
+RX_DECL struct rx_superset *
+rx_superstate_eclosure_union (rx, set, ecl)
+     struct rx * rx;
+     struct rx_superset *set;
+     struct rx_nfa_state_set *ecl;
+#endif
+{
+  if (!ecl)
+    return set;
+
+  if (!set->car)
+    return rx_superset_cons (rx, ecl->car,
+			     rx_superstate_eclosure_union (rx, set, ecl->cdr));
+  if (set->car == ecl->car)
+    return rx_superstate_eclosure_union (rx, set, ecl->cdr);
+
+  {
+    struct rx_superset * tail;
+    struct rx_nfa_state * first;
+
+    if (set->car > ecl->car)
+      {
+	tail = rx_superstate_eclosure_union (rx, set->cdr, ecl);
+	first = set->car;
+      }
+    else
+      {
+	tail = rx_superstate_eclosure_union (rx, set, ecl->cdr);
+	first = ecl->car;
+      }
+    if (!tail)
+      return 0;
+    else
+      {
+	struct rx_superset * answer;
+	answer = rx_superset_cons (rx, first, tail);
+	if (!answer)
+	  {
+	    rx_protect_superset (rx, tail);
+	    rx_release_superset (rx, tail);
+	    return 0;
+	  }
+	else
+	  return answer;
+      }
+  }
+}
+
+
+
+
+
+/*
+ * This makes sure that a list of rx_distinct_futures contains
+ * a future for each possible set of side effects in the eclosure
+ * of a given state.  This is some of the work of filling in a
+ * superstate transition. 
+ */
+
+#ifdef __STDC__
+static struct rx_distinct_future *
+include_futures (struct rx *rx,
+		 struct rx_distinct_future *df, struct rx_nfa_state
+		 *state, struct rx_superstate *superstate) 
+#else
+static struct rx_distinct_future *
+include_futures (rx, df, state, superstate)
+     struct rx *rx;
+     struct rx_distinct_future *df;
+     struct rx_nfa_state *state;
+     struct rx_superstate *superstate;
+#endif
+{
+  struct rx_possible_future *future;
+  struct rx_cache * cache = rx->cache;
+  for (future = state->futures; future; future = future->next)
+    {
+      struct rx_distinct_future *dfp;
+      struct rx_distinct_future *insert_before = 0;
+      if (df)
+	df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
+      for (dfp = df; dfp; dfp = dfp->next_same_super_edge[0])
+	if (dfp->effects == future->effects)
+	  break;
+	else
+	  {
+	    int order = rx->se_list_cmp (rx, dfp->effects, future->effects);
+	    if (order > 0)
+	      {
+		insert_before = dfp;
+		dfp = 0;
+		break;
+	      }
+	  }
+      if (df)
+	df->next_same_super_edge[1]->next_same_super_edge[0] = df;
+      if (!dfp)
+	{
+	  dfp
+	    = ((struct rx_distinct_future *)
+	       rx_cache_malloc_or_get (cache, &cache->free_discernable_futures,
+				       sizeof (struct rx_distinct_future)));
+	  if (!dfp)
+	    return 0;
+	  if (!df)
+	    {
+	      df = insert_before = dfp;
+	      df->next_same_super_edge[0] = df->next_same_super_edge[1] = df;
+	    }
+	  else if (!insert_before)
+	    insert_before = df;
+	  else if (insert_before == df)
+	    df = dfp;
+
+	  dfp->next_same_super_edge[0] = insert_before;
+	  dfp->next_same_super_edge[1]
+	    = insert_before->next_same_super_edge[1];
+	  dfp->next_same_super_edge[1]->next_same_super_edge[0] = dfp;
+	  dfp->next_same_super_edge[0]->next_same_super_edge[1] = dfp;
+	  dfp->next_same_dest = dfp->prev_same_dest = dfp;
+	  dfp->future = 0;
+	  dfp->present = superstate;
+	  dfp->future_frame.inx = rx->instruction_table[rx_cache_miss];
+	  dfp->future_frame.data = 0;
+	  dfp->future_frame.data_2 = (void *) dfp;
+	  dfp->side_effects_frame.inx
+	    = rx->instruction_table[rx_do_side_effects];
+	  dfp->side_effects_frame.data = 0;
+	  dfp->side_effects_frame.data_2 = (void *) dfp;
+	  dfp->effects = future->effects;
+	}
+    }
+  return df;
+}
+
+
+
+
+/* This constructs a new superstate from its state set.  The only 
+ * complexity here is memory management.
+ */
+#ifdef __STDC__
+RX_DECL struct rx_superstate *
+rx_superstate (struct rx *rx,
+	       struct rx_superset *set)
+#else
+RX_DECL struct rx_superstate *
+rx_superstate (rx, set)
+     struct rx *rx;
+     struct rx_superset *set;
+#endif
+{
+  struct rx_cache * cache = rx->cache;
+  struct rx_superstate * superstate = 0;
+
+  /* Does the superstate already exist in the cache? */
+  if (set->superstate)
+    {
+      if (set->superstate->rx_id != rx->rx_id)
+	{
+	  /* Aha.  It is in the cache, but belongs to a superstate
+	   * that refers to an NFA that no longer exists.
+	   * (We know it no longer exists because it was evidently
+	   *  stored in the same region of memory as the current nfa
+	   *  yet it has a different id.)
+	   */
+	  superstate = set->superstate;
+	  if (!superstate->is_semifree)
+	    {
+	      if (cache->lru_superstate == superstate)
+		{
+		  cache->lru_superstate = superstate->next_recyclable;
+		  if (cache->lru_superstate == superstate)
+		    cache->lru_superstate = 0;
+		}
+	      {
+		superstate->next_recyclable->prev_recyclable
+		  = superstate->prev_recyclable;
+		superstate->prev_recyclable->next_recyclable
+		  = superstate->next_recyclable;
+		if (!cache->semifree_superstate)
+		  {
+		    (cache->semifree_superstate
+		     = superstate->next_recyclable
+		     = superstate->prev_recyclable
+		     = superstate);
+		  }
+		else
+		  {
+		    superstate->next_recyclable = cache->semifree_superstate;
+		    superstate->prev_recyclable
+		      = cache->semifree_superstate->prev_recyclable;
+		    superstate->next_recyclable->prev_recyclable
+		      = superstate;
+		    superstate->prev_recyclable->next_recyclable
+		      = superstate;
+		    cache->semifree_superstate = superstate;
+		  }
+		++cache->semifree_superstates;
+	      }
+	    }
+	  set->superstate = 0;
+	  goto handle_cache_miss;
+	}
+      ++cache->hits;
+      superstate = set->superstate;
+
+      rx_refresh_this_superstate (cache, superstate);
+      return superstate;
+    }
+
+ handle_cache_miss:
+
+  /* This point reached only for cache misses. */
+  ++cache->misses;
+#if RX_DEBUG
+  if (rx_debug_trace > 1)
+    {
+      struct rx_superset * setp = set;
+      fprintf (stderr, "Building a superstet %d(%d): ", rx->rx_id, set);
+      while (setp)
+	{
+	  fprintf (stderr, "%d ", setp->id);
+	  setp = setp->cdr;
+	}
+      fprintf (stderr, "(%d)\n", set);
+    }
+#endif
+  superstate = (struct rx_superstate *)rx_cache_get_superstate (cache);
+  if (!superstate)
+    return 0;
+
+  if (!cache->lru_superstate)
+    (cache->lru_superstate
+     = superstate->next_recyclable
+     = superstate->prev_recyclable
+     = superstate);
+  else
+    {
+      superstate->next_recyclable = cache->lru_superstate;
+      superstate->prev_recyclable = cache->lru_superstate->prev_recyclable;
+      (  superstate->prev_recyclable->next_recyclable
+       = superstate->next_recyclable->prev_recyclable
+       = superstate);
+    }
+  superstate->rx_id = rx->rx_id;
+  superstate->transition_refs = 0;
+  superstate->locks = 0;
+  superstate->is_semifree = 0;
+  set->superstate = superstate;
+  superstate->contents = set;
+  rx_protect_superset (rx, set);
+  superstate->edges = 0;
+  {
+    int x;
+    /* None of the transitions from this superstate are known yet. */
+    for (x = 0; x < rx->local_cset_size; ++x) /* &&&&& 3.8 % */
+      {
+	struct rx_inx * ifr = &superstate->transitions[x];
+	ifr->inx = rx->instruction_table [rx_cache_miss];
+	ifr->data = ifr->data_2 = 0;
+      }
+  }
+  return superstate;
+}
+
+
+
+/* This computes the destination set of one edge of the superstate NFA.
+ * Note that a RX_DISTINCT_FUTURE is a superstate edge.
+ * Returns 0 on an allocation failure.
+ */
+
+#ifdef __STDC__
+static int 
+solve_destination (struct rx *rx, struct rx_distinct_future *df)
+#else
+static int 
+solve_destination (rx, df)
+     struct rx *rx;
+     struct rx_distinct_future *df;
+#endif
+{
+  struct rx_super_edge *tc = df->edge;
+  struct rx_superset *nfa_state;
+  struct rx_superset *nil_set = rx_superset_cons (rx, 0, 0);
+  struct rx_superset *solution = nil_set;
+  struct rx_superstate *dest;
+
+  rx_protect_superset (rx, solution);
+  /* Iterate over all NFA states in the state set of this superstate. */
+  for (nfa_state = df->present->contents;
+       nfa_state->car;
+       nfa_state = nfa_state->cdr)
+    {
+      struct rx_nfa_edge *e;
+      /* Iterate over all edges of each NFA state. */
+      for (e = nfa_state->car->edges; e; e = e->next)
+        /* If we find an edge that is labeled with 
+	 * the characters we are solving for.....
+	 */
+	if (rx_bitset_is_subset (rx->local_cset_size,
+				 tc->cset, e->params.cset))
+	  {
+	    struct rx_nfa_state *n = e->dest;
+	    struct rx_possible_future *pf;
+	    /* ....search the partial epsilon closures of the destination
+	     * of that edge for a path that involves the same set of
+	     * side effects we are solving for.
+	     * If we find such a RX_POSSIBLE_FUTURE, we add members to the
+	     * stateset we are computing.
+	     */
+	    for (pf = n->futures; pf; pf = pf->next)
+	      if (pf->effects == df->effects)
+		{
+		  struct rx_superset * old_sol;
+		  old_sol = solution;
+		  solution = rx_superstate_eclosure_union (rx, solution,
+							   pf->destset);
+		  if (!solution)
+		    return 0;
+		  rx_protect_superset (rx, solution);
+		  rx_release_superset (rx, old_sol);
+		}
+	  }
+    }
+  /* It is possible that the RX_DISTINCT_FUTURE we are working on has 
+   * the empty set of NFA states as its definition.  In that case, this
+   * is a failure point.
+   */
+  if (solution == nil_set)
+    {
+      df->future_frame.inx = (void *) rx_backtrack;
+      df->future_frame.data = 0;
+      df->future_frame.data_2 = 0;
+      return 1;
+    }
+  dest = rx_superstate (rx, solution);
+  rx_release_superset (rx, solution);
+  if (!dest)
+    return 0;
+
+  {
+    struct rx_distinct_future *dft;
+    dft = df;
+    df->prev_same_dest->next_same_dest = 0;
+    while (dft)
+      {
+	dft->future = dest;
+	dft->future_frame.inx = rx->instruction_table[rx_next_char];
+	dft->future_frame.data = (void *) dest->transitions;
+	dft = dft->next_same_dest;
+      }
+    df->prev_same_dest->next_same_dest = df;
+  }
+  if (!dest->transition_refs)
+    dest->transition_refs = df;
+  else
+    {
+      struct rx_distinct_future *dft = dest->transition_refs->next_same_dest;
+      dest->transition_refs->next_same_dest = df->next_same_dest;
+      df->next_same_dest->prev_same_dest = dest->transition_refs;
+      df->next_same_dest = dft;
+      dft->prev_same_dest = df;
+    }
+  return 1;
+}
+
+
+/* This takes a superstate and a character, and computes some edges
+ * from the superstate NFA.  In particular, this computes all edges
+ * that lead from SUPERSTATE given CHR.   This function also 
+ * computes the set of characters that share this edge set.
+ * This returns 0 on allocation error.
+ * The character set and list of edges are returned through 
+ * the paramters CSETOUT and DFOUT.
+} */
+
+#ifdef __STDC__
+static int 
+compute_super_edge (struct rx *rx, struct rx_distinct_future **dfout,
+			  rx_Bitset csetout, struct rx_superstate *superstate,
+			  unsigned char chr)  
+#else
+static int 
+compute_super_edge (rx, dfout, csetout, superstate, chr)
+     struct rx *rx;
+     struct rx_distinct_future **dfout;
+     rx_Bitset csetout;
+     struct rx_superstate *superstate;
+     unsigned char chr;
+#endif
+{
+  struct rx_superset *stateset = superstate->contents;
+
+  /* To compute the set of characters that share edges with CHR, 
+   * we start with the full character set, and subtract.
+   */
+  rx_bitset_universe (rx->local_cset_size, csetout);
+  *dfout = 0;
+
+  /* Iterate over the NFA states in the superstate state-set. */
+  while (stateset->car)
+    {
+      struct rx_nfa_edge *e;
+      for (e = stateset->car->edges; e; e = e->next)
+	if (RX_bitset_member (e->params.cset, chr))
+	  {
+	    /* If we find an NFA edge that applies, we make sure there
+	     * are corresponding edges in the superstate NFA.
+	     */
+	    {
+	      struct rx_distinct_future * saved;
+	      saved = *dfout;
+	      *dfout = include_futures (rx, *dfout, e->dest, superstate);
+	      if (!*dfout)
+		{
+		  struct rx_distinct_future * df;
+		  df = saved;
+		  df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
+		  while (df)
+		    {
+		      struct rx_distinct_future *dft;
+		      dft = df;
+		      df = df->next_same_super_edge[0];
+
+		      if (dft->future && dft->future->transition_refs == dft)
+			{
+			  dft->future->transition_refs = dft->next_same_dest;
+			  if (dft->future->transition_refs == dft)
+			    dft->future->transition_refs = 0;
+			}
+		      dft->next_same_dest->prev_same_dest = dft->prev_same_dest;
+		      dft->prev_same_dest->next_same_dest = dft->next_same_dest;
+		      rx_cache_free (rx->cache,
+				     &rx->cache->free_discernable_futures,
+				     (char *)dft);
+		    }
+		  return 0;
+		}
+	    }
+	    /* We also trim the character set a bit. */
+	    rx_bitset_intersection (rx->local_cset_size,
+				    csetout, e->params.cset);
+	  }
+	else
+	  /* An edge that doesn't apply at least tells us some characters
+	   * that don't share the same edge set as CHR.
+	   */
+	  rx_bitset_difference (rx->local_cset_size, csetout, e->params.cset);
+      stateset = stateset->cdr;
+    }
+  return 1;
+}
+
+
+
+/* This is a constructor for RX_SUPER_EDGE structures.  These are
+ * wrappers for lists of superstate NFA edges that share character sets labels.
+ * If a transition class contains more than one rx_distinct_future (superstate
+ * edge), then it represents a non-determinism in the superstate NFA.
+ */
+
+#ifdef __STDC__
+static struct rx_super_edge *
+rx_super_edge (struct rx *rx,
+	       struct rx_superstate *super, rx_Bitset cset,
+	       struct rx_distinct_future *df) 
+#else
+static struct rx_super_edge *
+rx_super_edge (rx, super, cset, df)
+     struct rx *rx;
+     struct rx_superstate *super;
+     rx_Bitset cset;
+     struct rx_distinct_future *df;
+#endif
+{
+  struct rx_super_edge *tc =
+    (struct rx_super_edge *)rx_cache_malloc_or_get
+      (rx->cache, &rx->cache->free_transition_classes,
+       sizeof (struct rx_super_edge) + rx_sizeof_bitset (rx->local_cset_size));
+
+  if (!tc)
+    return 0;
+  tc->next = super->edges;
+  super->edges = tc;
+  tc->rx_backtrack_frame.inx = rx->instruction_table[rx_backtrack_point];
+  tc->rx_backtrack_frame.data = 0;
+  tc->rx_backtrack_frame.data_2 = (void *) tc;
+  tc->options = df;
+  tc->cset = (rx_Bitset) ((char *) tc + sizeof (*tc));
+  rx_bitset_assign (rx->local_cset_size, tc->cset, cset);
+  if (df)
+    {
+      struct rx_distinct_future * dfp = df;
+      df->next_same_super_edge[1]->next_same_super_edge[0] = 0;
+      while (dfp)
+	{
+	  dfp->edge = tc;
+	  dfp = dfp->next_same_super_edge[0];
+	}
+      df->next_same_super_edge[1]->next_same_super_edge[0] = df;
+    }
+  return tc;
+}
+
+
+/* There are three kinds of cache miss.  The first occurs when a
+ * transition is taken that has never been computed during the
+ * lifetime of the source superstate.  That cache miss is handled by
+ * calling COMPUTE_SUPER_EDGE.  The second kind of cache miss
+ * occurs when the destination superstate of a transition doesn't
+ * exist.  SOLVE_DESTINATION is used to construct the destination superstate.
+ * Finally, the third kind of cache miss occurs when the destination
+ * superstate of a transition is in a `semi-free state'.  That case is
+ * handled by UNFREE_SUPERSTATE.
+ *
+ * The function of HANDLE_CACHE_MISS is to figure out which of these
+ * cases applies.
+ */
+
+#ifdef __STDC__
+static void
+install_partial_transition  (struct rx_superstate *super,
+			     struct rx_inx *answer,
+			     RX_subset set, int offset)
+#else
+static void
+install_partial_transition  (super, answer, set, offset)
+     struct rx_superstate *super;
+     struct rx_inx *answer;
+     RX_subset set;
+     int offset;
+#endif
+{
+  int start = offset;
+  int end = start + 32;
+  RX_subset pos = 1;
+  struct rx_inx * transitions = super->transitions;
+  
+  while (start < end)
+    {
+      if (set & pos)
+	transitions[start] = *answer;
+      pos <<= 1;
+      ++start;
+    }
+}
+
+
+#ifdef __STDC__
+RX_DECL struct rx_inx *
+rx_handle_cache_miss
+  (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data) 
+#else
+RX_DECL struct rx_inx *
+rx_handle_cache_miss (rx, super, chr, data)
+     struct rx *rx;
+     struct rx_superstate *super;
+     unsigned char chr;
+     void *data;
+#endif
+{
+  int offset = chr / RX_subset_bits;
+  struct rx_distinct_future *df = data;
+
+  if (!df)			/* must be the shared_cache_miss_frame */
+    {
+      /* Perhaps this is just a transition waiting to be filled. */
+      struct rx_super_edge *tc;
+      RX_subset mask = rx_subset_singletons [chr % RX_subset_bits];
+
+      for (tc = super->edges; tc; tc = tc->next)
+	if (tc->cset[offset] & mask)
+	  {
+	    struct rx_inx * answer;
+	    df = tc->options;
+	    answer = ((tc->options->next_same_super_edge[0] != tc->options)
+		      ? &tc->rx_backtrack_frame
+		      : (df->effects
+			 ? &df->side_effects_frame
+			 : &df->future_frame));
+	    install_partial_transition (super, answer,
+					tc->cset [offset], offset * 32);
+	    return answer;
+	  }
+      /* Otherwise, it's a flushed or  newly encountered edge. */
+      {
+	char cset_space[1024];	/* this limit is far from unreasonable */
+	rx_Bitset trcset;
+	struct rx_inx *answer;
+
+	if (rx_sizeof_bitset (rx->local_cset_size) > sizeof (cset_space))
+	  return 0;		/* If the arbitrary limit is hit, always fail */
+				/* cleanly. */
+	trcset = (rx_Bitset)cset_space;
+	rx_lock_superstate (rx, super);
+	if (!compute_super_edge (rx, &df, trcset, super, chr))
+	  {
+	    rx_unlock_superstate (rx, super);
+	    return 0;
+	  }
+	if (!df)		/* We just computed the fail transition. */
+	  {
+	    static struct rx_inx
+	      shared_fail_frame = { 0, 0, (void *)rx_backtrack, 0 };
+	    answer = &shared_fail_frame;
+	  }
+	else
+	  {
+	    tc = rx_super_edge (rx, super, trcset, df);
+	    if (!tc)
+	      {
+		rx_unlock_superstate (rx, super);
+		return 0;
+	      }
+	    answer = ((tc->options->next_same_super_edge[0] != tc->options)
+		      ? &tc->rx_backtrack_frame
+		      : (df->effects
+			 ? &df->side_effects_frame
+			 : &df->future_frame));
+	  }
+	install_partial_transition (super, answer,
+				    trcset[offset], offset * 32);
+	rx_unlock_superstate (rx, super);
+	return answer;
+      }
+    }
+  else if (df->future) /* A cache miss on an edge with a future? Must be
+			* a semi-free destination. */
+    {				
+      if (df->future->is_semifree)
+	refresh_semifree_superstate (rx->cache, df->future);
+      return &df->future_frame;
+    }
+  else
+    /* no future superstate on an existing edge */
+    {
+      rx_lock_superstate (rx, super);
+      if (!solve_destination (rx, df))
+	{
+	  rx_unlock_superstate (rx, super);
+	  return 0;
+	}
+      if (!df->effects
+	  && (df->edge->options->next_same_super_edge[0] == df->edge->options))
+	install_partial_transition (super, &df->future_frame,
+				    df->edge->cset[offset], offset * 32);
+      rx_unlock_superstate (rx, super);
+      return &df->future_frame;
+    }
+}
+
+
+
+
+
+/* The rest of the code provides a regex.c compatable interface. */
+
+
+__const__ char *re_error_msg[] =
+{
+  0,						/* REG_NOUT */
+  "No match",					/* REG_NOMATCH */
+  "Invalid regular expression",			/* REG_BADPAT */
+  "Invalid collation character",		/* REG_ECOLLATE */
+  "Invalid character class name",		/* REG_ECTYPE */
+  "Trailing backslash",				/* REG_EESCAPE */
+  "Invalid back reference",			/* REG_ESUBREG */
+  "Unmatched [ or [^",				/* REG_EBRACK */
+  "Unmatched ( or \\(",				/* REG_EPAREN */
+  "Unmatched \\{",				/* REG_EBRACE */
+  "Invalid content of \\{\\}",			/* REG_BADBR */
+  "Invalid range end",				/* REG_ERANGE */
+  "Memory exhausted",				/* REG_ESPACE */
+  "Invalid preceding regular expression",	/* REG_BADRPT */
+  "Premature end of regular expression",	/* REG_EEND */
+  "Regular expression too big",			/* REG_ESIZE */
+  "Unmatched ) or \\)",				/* REG_ERPAREN */
+};
+
+
+
+
+/* 
+ * Macros used while compiling patterns.
+ *
+ * By convention, PEND points just past the end of the uncompiled pattern,
+ * P points to the read position in the pattern.  `translate' is the name
+ * of the translation table (`TRANSLATE' is the name of a macro that looks
+ * things up in `translate').
+ */
+
+
+/*
+ * Fetch the next character in the uncompiled pattern---translating it 
+ * if necessary. *Also cast from a signed character in the constant
+ * string passed to us by the user to an unsigned char that we can use
+ * as an array index (in, e.g., `translate').
+ */
+#define PATFETCH(c)							\
+ do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++;						\
+    c = translate[c];		 					\
+ } while (0)
+
+/* 
+ * Fetch the next character in the uncompiled pattern, with no
+ * translation.
+ */
+#define PATFETCH_RAW(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++; 						\
+  } while (0)
+
+/* Go backwards one character in the pattern.  */
+#define PATUNFETCH p--
+
+
+#define TRANSLATE(d) translate[(unsigned char) (d)]
+
+typedef unsigned regnum_t;
+
+/* Since offsets can go either forwards or backwards, this type needs to
+ * be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.
+ */
+typedef int pattern_offset_t;
+
+typedef struct
+{
+  struct rexp_node ** top_expression; /* was begalt */
+  struct rexp_node ** last_expression; /* was laststart */
+  pattern_offset_t inner_group_offset;
+  regnum_t regnum;
+} compile_stack_elt_t;
+
+typedef struct
+{
+  compile_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} compile_stack_type;
+
+
+#define INIT_COMPILE_STACK_SIZE 32
+
+#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+
+/* The next available element.  */
+#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+
+
+/* Set the bit for character C in a list.  */
+#define SET_LIST_BIT(c)                               \
+  (b[((unsigned char) (c)) / CHARBITS]               \
+   |= 1 << (((unsigned char) c) % CHARBITS))
+
+/* Get the next unsigned number in the uncompiled pattern.  */
+#define GET_UNSIGNED_NUMBER(num) 					\
+  { if (p != pend)							\
+     {									\
+       PATFETCH (c); 							\
+       while (isdigit (c)) 						\
+         { 								\
+           if (num < 0)							\
+              num = 0;							\
+           num = num * 10 + c - '0'; 					\
+           if (p == pend) 						\
+              break; 							\
+           PATFETCH (c);						\
+         } 								\
+       } 								\
+    }		
+
+#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#define IS_CHAR_CLASS(string)						\
+   (!strcmp (string, "alpha") || !strcmp (string, "upper")		\
+    || !strcmp (string, "lower") || !strcmp (string, "digit")		\
+    || !strcmp (string, "alnum") || !strcmp (string, "xdigit")		\
+    || !strcmp (string, "space") || !strcmp (string, "print")		\
+    || !strcmp (string, "punct") || !strcmp (string, "graph")		\
+    || !strcmp (string, "cntrl") || !strcmp (string, "blank"))
+
+
+
+/* These predicates are used in regex_compile. */
+
+/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+ * after an alternative or a begin-subexpression.  We assume there is at
+ * least one character before the ^.  
+ */
+
+#ifdef __STDC__
+static boolean
+at_begline_loc_p (__const__ char *pattern, __const__ char * p, reg_syntax_t syntax)
+#else
+static boolean
+at_begline_loc_p (pattern, p, syntax)
+     __const__ char *pattern;
+     __const__ char * p;
+     reg_syntax_t syntax;
+#endif
+{
+  __const__ char *prev = p - 2;
+  boolean prev_prev_backslash = ((prev > pattern) && (prev[-1] == '\\'));
+  
+    return
+      
+      (/* After a subexpression?  */
+       ((*prev == '(') && ((syntax & RE_NO_BK_PARENS) || prev_prev_backslash))
+       ||
+       /* After an alternative?  */
+       ((*prev == '|') && ((syntax & RE_NO_BK_VBAR) || prev_prev_backslash))
+       );
+}
+
+/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+ * at least one character after the $, i.e., `P < PEND'.
+ */
+
+#ifdef __STDC__
+static boolean
+at_endline_loc_p (__const__ char *p, __const__ char *pend, int syntax)
+#else
+static boolean
+at_endline_loc_p (p, pend, syntax)
+     __const__ char *p;
+     __const__ char *pend;
+     int syntax;
+#endif
+{
+  __const__ char *next = p;
+  boolean next_backslash = (*next == '\\');
+  __const__ char *next_next = (p + 1 < pend) ? (p + 1) : 0;
+  
+  return
+    (
+     /* Before a subexpression?  */
+     ((syntax & RE_NO_BK_PARENS)
+      ? (*next == ')')
+      : (next_backslash && next_next && (*next_next == ')')))
+    ||
+     /* Before an alternative?  */
+     ((syntax & RE_NO_BK_VBAR)
+      ? (*next == '|')
+      : (next_backslash && next_next && (*next_next == '|')))
+     );
+}
+
+
+
+unsigned char rx_id_translation[256] =
+{
+  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
+ 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
+ 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
+ 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
+ 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
+
+ 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
+ 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
+ 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
+ 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
+ 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
+ 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
+ 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
+
+ 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+ 220, 221, 222, 223, 224, 225, 226, 227, 228, 229,
+ 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
+ 250, 251, 252, 253, 254, 255
+};
+
+/* The compiler keeps an inverted translation table.
+ * This looks up/inititalize elements.
+ * VALID is an array of booleans that validate CACHE.
+ */
+
+#ifdef __STDC__
+static rx_Bitset
+inverse_translation (struct re_pattern_buffer * rxb,
+		     char * valid, rx_Bitset cache,
+		     unsigned char * translate, int c)
+#else
+static rx_Bitset
+inverse_translation (rxb, valid, cache, translate, c)
+     struct re_pattern_buffer * rxb;
+     char * valid;
+     rx_Bitset cache;
+     unsigned char * translate;
+     int c;
+#endif
+{
+  rx_Bitset cs
+    = cache + c * rx_bitset_numb_subsets (rxb->rx.local_cset_size); 
+
+  if (!valid[c])
+    {
+      int x;
+      int c_tr = TRANSLATE(c);
+      rx_bitset_null (rxb->rx.local_cset_size, cs);
+      for (x = 0; x < 256; ++x)	/* &&&& 13.37 */
+	if (TRANSLATE(x) == c_tr)
+	  RX_bitset_enjoin (cs, x);
+      valid[c] = 1;
+    }
+  return cs;
+}
+
+
+
+
+
+/* More subroutine declarations and macros for regex_compile.  */
+
+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and 
+   false if it's not.  */
+
+#ifdef __STDC__
+static boolean
+group_in_compile_stack (compile_stack_type compile_stack, regnum_t regnum)
+#else
+static boolean
+group_in_compile_stack (compile_stack, regnum)
+    compile_stack_type compile_stack;
+    regnum_t regnum;
+#endif
+{
+  int this_element;
+
+  for (this_element = compile_stack.avail - 1;  
+       this_element >= 0; 
+       this_element--)
+    if (compile_stack.stack[this_element].regnum == regnum)
+      return true;
+
+  return false;
+}
+
+
+/*
+ * Read the ending character of a range (in a bracket expression) from the
+ * uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+ * starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+ * Then we set the translation of all bits between the starting and
+ * ending characters (inclusive) in the compiled pattern B.
+ * 
+ * Return an error code.
+ * 
+ * We use these short variable names so we can use the same macros as
+ * `regex_compile' itself.  
+ */
+
+#ifdef __STDC__
+static reg_errcode_t
+compile_range (struct re_pattern_buffer * rxb, rx_Bitset cs,
+	       __const__ char ** p_ptr, __const__ char * pend,
+	       unsigned char * translate, reg_syntax_t syntax,
+	       rx_Bitset inv_tr,  char * valid_inv_tr)
+#else
+static reg_errcode_t
+compile_range (rxb, cs, p_ptr, pend, translate, syntax, inv_tr, valid_inv_tr)
+     struct re_pattern_buffer * rxb;
+     rx_Bitset cs;
+     __const__ char ** p_ptr;
+     __const__ char * pend;
+     unsigned char * translate;
+     reg_syntax_t syntax;
+     rx_Bitset inv_tr;
+     char * valid_inv_tr;
+#endif
+{
+  unsigned this_char;
+
+  __const__ char *p = *p_ptr;
+
+  unsigned char range_end;
+  unsigned char range_start = TRANSLATE(p[-2]);
+
+  if (p == pend)
+    return REG_ERANGE;
+
+  PATFETCH (range_end);
+
+  (*p_ptr)++;
+
+  if (range_start > range_end)
+    return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+
+  for (this_char = range_start; this_char <= range_end; this_char++)
+    {
+      rx_Bitset it =
+	inverse_translation (rxb, valid_inv_tr, inv_tr, translate, this_char);
+      rx_bitset_union (rxb->rx.local_cset_size, cs, it);
+    }
+  
+  return REG_NOERROR;
+}
+
+
+
+/* This searches a regexp for backreference side effects.
+ * It fills in the array OUT with 1 at the index of every register pair
+ * referenced by a backreference.
+ *
+ * This is used to help optimize patterns for searching.  The information is
+ * useful because, if the caller doesn't want register values, backreferenced
+ * registers are the only registers for which we need rx_backtrack.
+ */
+
+#ifdef __STDC__
+static void
+find_backrefs (char * out, struct rexp_node * rexp,
+	       struct re_se_params * params)
+#else
+static void
+find_backrefs (out, rexp, params)
+     char * out;
+     struct rexp_node * rexp;
+     struct re_se_params * params;
+#endif
+{
+  if (rexp)
+    switch (rexp->type)
+      {
+      case r_cset:
+      case r_data:
+	return;
+      case r_alternate:
+      case r_concat:
+      case r_opt:
+      case r_star:
+      case r_2phase_star:
+	find_backrefs (out, rexp->params.pair.left, params);
+	find_backrefs (out, rexp->params.pair.right, params);
+	return;
+      case r_side_effect:
+	if (   ((long)rexp->params.side_effect >= 0)
+	    && (params [(long)rexp->params.side_effect].se == re_se_backref))
+	  out[ params [(long)rexp->params.side_effect].op1] = 1;
+	return;
+      }
+}
+
+
+
+
+/* Returns 0 unless the pattern can match the empty string. */
+
+#ifdef __STDC__
+static int
+compute_fastset (struct re_pattern_buffer * rxb, struct rexp_node * rexp)
+#else
+static int
+compute_fastset (rxb, rexp)
+     struct re_pattern_buffer * rxb;
+     struct rexp_node * rexp;
+#endif
+{
+  if (!rexp)
+    return 1;
+  switch (rexp->type)
+    {
+    case r_data:
+      return 1;
+    case r_cset:
+      {
+	rx_bitset_union (rxb->rx.local_cset_size,
+			 rxb->fastset, rexp->params.cset);
+      }
+      return 0;
+    case r_concat:
+      return (compute_fastset (rxb, rexp->params.pair.left)
+	      && compute_fastset (rxb, rexp->params.pair.right));
+    case r_2phase_star:
+      compute_fastset (rxb, rexp->params.pair.left);
+      /* compute_fastset (rxb, rexp->params.pair.right);  nope... */
+      return 1;
+    case r_alternate:
+      return !!(compute_fastset (rxb, rexp->params.pair.left)
+		+ compute_fastset (rxb, rexp->params.pair.right));
+    case r_opt:
+    case r_star:
+      compute_fastset (rxb, rexp->params.pair.left);
+      return 1;
+    case r_side_effect:
+      return 1;
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+/* returns
+ *  1 -- yes, definately anchored by the given side effect.
+ *  2 -- maybe anchored, maybe the empty string.
+ *  0 -- definately not anchored
+ *  There is simply no other possibility.
+ */
+
+#ifdef __STDC__
+static int
+is_anchored (struct rexp_node * rexp, rx_side_effect se)
+#else
+static int
+is_anchored (rexp, se)
+     struct rexp_node * rexp;
+     rx_side_effect se;
+#endif
+{
+  if (!rexp)
+    return 2;
+  switch (rexp->type)
+    {
+    case r_cset:
+    case r_data:
+      return 0;
+    case r_concat:
+    case r_2phase_star:
+      {
+	int l = is_anchored (rexp->params.pair.left, se);
+	return (l == 2 ? is_anchored (rexp->params.pair.right, se) : l);
+      }
+    case r_alternate:
+      {
+	int l = is_anchored (rexp->params.pair.left, se);
+	int r = l ? is_anchored (rexp->params.pair.right, se) : 0;
+
+	if (l == r)
+	  return l;
+	else if ((l == 0) || (r == 0))
+	  return 0;
+	else
+	  return 2;
+      }
+    case r_opt:
+    case r_star:
+      return is_anchored (rexp->params.pair.left, se) ? 2 : 0;
+      
+    case r_side_effect:
+      return ((rexp->params.side_effect == se)
+	      ? 1 : 2);
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+/* This removes register assignments that aren't required by backreferencing.
+ * This can speed up explore_future, especially if it eliminates
+ * non-determinism in the superstate NFA.
+ * 
+ * NEEDED is an array of characters, presumably filled in by FIND_BACKREFS.
+ * The non-zero elements of the array indicate which register assignments
+ * can NOT be removed from the expression.
+ */
+
+#ifdef __STDC__
+static struct rexp_node *
+remove_unecessary_side_effects (struct rx * rx, char * needed,
+				struct rexp_node * rexp,
+				struct re_se_params * params)
+#else
+static struct rexp_node *
+remove_unecessary_side_effects (rx, needed, rexp, params)
+     struct rx * rx;
+     char * needed;
+     struct rexp_node * rexp;
+     struct re_se_params * params;
+#endif
+{
+  struct rexp_node * l;
+  struct rexp_node * r;
+  if (!rexp)
+    return 0;
+  else
+    switch (rexp->type)
+      {
+      case r_cset:
+      case r_data:
+	return rexp;
+      case r_alternate:
+      case r_concat:
+      case r_2phase_star:
+	l = remove_unecessary_side_effects (rx, needed,
+					    rexp->params.pair.left, params);
+	r = remove_unecessary_side_effects (rx, needed,
+					    rexp->params.pair.right, params);
+	if ((l && r) || (rexp->type != r_concat))
+	  {
+	    rexp->params.pair.left = l;
+	    rexp->params.pair.right = r;
+	    return rexp;
+	  }
+	else
+	  {
+	    rexp->params.pair.left = rexp->params.pair.right = 0;
+	    rx_free_rexp (rx, rexp);
+	    return l ? l : r;
+	  }
+      case r_opt:
+      case r_star:
+	l = remove_unecessary_side_effects (rx, needed,
+					    rexp->params.pair.left, params);
+	if (l)
+	  {
+	    rexp->params.pair.left = l;
+	    return rexp;
+	  }
+	else
+	  {
+	    rexp->params.pair.left = 0;
+	    rx_free_rexp (rx, rexp);
+	    return 0;
+	  }
+      case r_side_effect:
+	{
+	  int se = (long)rexp->params.side_effect;
+	  if (   (se >= 0)
+	      && (   ((enum re_side_effects)params[se].se == re_se_lparen)
+		  || ((enum re_side_effects)params[se].se == re_se_rparen))
+	      && (params [se].op1 > 0)
+	      && (!needed [params [se].op1]))
+	    {
+	      rx_free_rexp (rx, rexp);
+	      return 0;
+	    }
+	  else
+	    return rexp;
+	}
+      }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+
+#ifdef __STDC__
+static int
+pointless_if_repeated (struct rexp_node * node, struct re_se_params * params)
+#else
+static int
+pointless_if_repeated (node, params)
+     struct rexp_node * node;
+     struct re_se_params * params;
+#endif
+{
+  if (!node)
+    return 1;
+  switch (node->type)
+    {
+    case r_cset:
+      return 0;
+    case r_alternate:
+    case r_concat:
+    case r_2phase_star:
+      return (pointless_if_repeated (node->params.pair.left, params)
+	      && pointless_if_repeated (node->params.pair.right, params));
+    case r_opt:
+    case r_star:
+      return pointless_if_repeated (node->params.pair.left, params);
+    case r_side_effect:
+      switch ((enum re_side_effects) (((long)node->params.side_effect < 0)
+	      ? (enum re_side_effects) (long) node->params.side_effect
+	      : (enum re_side_effects)params[(long)node->params.side_effect].se))
+	{
+	case re_se_try:
+	case re_se_at_dot:
+	case re_se_begbuf:
+	case re_se_hat:
+	case re_se_wordbeg:
+	case re_se_wordbound:
+	case re_se_notwordbound:
+	case re_se_wordend:
+	case re_se_endbuf:
+	case re_se_dollar:
+	case re_se_fail:
+	case re_se_win:
+	  return 1;
+	case re_se_lparen:
+	case re_se_rparen:
+	case re_se_iter:
+	case re_se_end_iter:
+	case re_se_syntax:
+	case re_se_not_syntax:
+	case re_se_backref:
+	  return 0;
+	}
+    case r_data:
+    default:
+      return 0;
+    }
+}
+
+
+
+
+#ifdef __STDC__
+static int
+registers_on_stack (struct re_pattern_buffer * rxb,
+		    struct rexp_node * rexp, int in_danger,
+		    struct re_se_params * params)
+#else
+static int
+registers_on_stack (rxb, rexp, in_danger, params)
+     struct re_pattern_buffer * rxb;
+     struct rexp_node * rexp;
+     int in_danger;
+     struct re_se_params * params;
+#endif
+{
+  if (!rexp)
+    return 0;
+  else
+    switch (rexp->type)
+      {
+      case r_cset:
+      case r_data:
+	return 0;
+      case r_alternate:
+      case r_concat:
+	return (   registers_on_stack (rxb, rexp->params.pair.left,
+				       in_danger, params)
+		|| (registers_on_stack
+		    (rxb, rexp->params.pair.right,
+		     in_danger, params)));
+      case r_opt:
+	return registers_on_stack (rxb, rexp->params.pair.left, 0, params);
+      case r_star:
+	return registers_on_stack (rxb, rexp->params.pair.left, 1, params);
+      case r_2phase_star:
+	return
+	  (   registers_on_stack (rxb, rexp->params.pair.left, 1, params)
+	   || registers_on_stack (rxb, rexp->params.pair.right, 1, params));
+      case r_side_effect:
+	{
+	  int se = (long)rexp->params.side_effect;
+	  if (   in_danger
+	      && (se >= 0)
+	      && (params [se].op1 > 0)
+	      && (   ((enum re_side_effects)params[se].se == re_se_lparen)
+		  || ((enum re_side_effects)params[se].se == re_se_rparen)))
+	    return 1;
+	  else
+	    return 0;
+	}
+      }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+
+static char idempotent_complex_se[] =
+{
+#define RX_WANT_SE_DEFS 1
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#define RX_DEF_SE(IDEM, NAME, VALUE)	      
+#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     IDEM,
+#include "rx.h"
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#undef RX_WANT_SE_DEFS
+  23
+};
+
+static char idempotent_se[] =
+{
+  13,
+#define RX_WANT_SE_DEFS 1
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#define RX_DEF_SE(IDEM, NAME, VALUE)	      IDEM,
+#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     
+#include "rx.h"
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#undef RX_WANT_SE_DEFS
+  42
+};
+
+
+
+
+
+#ifdef __STDC__
+static int
+has_any_se (struct rx * rx,
+	    struct rexp_node * rexp)
+#else
+static int
+has_any_se (rx, rexp)
+     struct rx * rx;
+     struct rexp_node * rexp;
+#endif
+{
+  if (!rexp)
+    return 0;
+
+  switch (rexp->type)
+    {
+    case r_cset:
+    case r_data:
+      return 0;
+
+    case r_side_effect:
+      return 1;
+      
+    case r_2phase_star:
+    case r_concat:
+    case r_alternate:
+      return
+	(   has_any_se (rx, rexp->params.pair.left)
+	 || has_any_se (rx, rexp->params.pair.right));
+
+    case r_opt:
+    case r_star:
+      return has_any_se (rx, rexp->params.pair.left);
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+
+/* This must be called AFTER `convert_hard_loops' for a given REXP. */
+#ifdef __STDC__
+static int
+has_non_idempotent_epsilon_path (struct rx * rx,
+				 struct rexp_node * rexp,
+				 struct re_se_params * params)
+#else
+static int
+has_non_idempotent_epsilon_path (rx, rexp, params)
+     struct rx * rx;
+     struct rexp_node * rexp;
+     struct re_se_params * params;
+#endif
+{
+  if (!rexp)
+    return 0;
+
+  switch (rexp->type)
+    {
+    case r_cset:
+    case r_data:
+    case r_star:
+      return 0;
+
+    case r_side_effect:
+      return
+	!((long)rexp->params.side_effect > 0
+	  ? idempotent_complex_se [ params [(long)rexp->params.side_effect].se ]
+	  : idempotent_se [-(long)rexp->params.side_effect]);
+      
+    case r_alternate:
+      return
+	(   has_non_idempotent_epsilon_path (rx,
+					     rexp->params.pair.left, params)
+	 || has_non_idempotent_epsilon_path (rx,
+					     rexp->params.pair.right, params));
+
+    case r_2phase_star:
+    case r_concat:
+      return
+	(   has_non_idempotent_epsilon_path (rx,
+					     rexp->params.pair.left, params)
+	 && has_non_idempotent_epsilon_path (rx,
+					     rexp->params.pair.right, params));
+
+    case r_opt:
+      return has_non_idempotent_epsilon_path (rx,
+					      rexp->params.pair.left, params);
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+
+/* This computes rougly what it's name suggests.   It can (and does) go wrong 
+ * in the direction of returning spurious 0 without causing disasters.
+ */
+#ifdef __STDC__
+static int
+begins_with_complex_se (struct rx * rx, struct rexp_node * rexp)
+#else
+static int
+begins_with_complex_se (rx, rexp)
+     struct rx * rx;
+     struct rexp_node * rexp;
+#endif
+{
+  if (!rexp)
+    return 0;
+
+  switch (rexp->type)
+    {
+    case r_cset:
+    case r_data:
+      return 0;
+
+    case r_side_effect:
+      return ((long)rexp->params.side_effect >= 0);
+      
+    case r_alternate:
+      return
+	(   begins_with_complex_se (rx, rexp->params.pair.left)
+	 && begins_with_complex_se (rx, rexp->params.pair.right));
+
+
+    case r_concat:
+      return has_any_se (rx, rexp->params.pair.left);
+    case r_opt:
+    case r_star:
+    case r_2phase_star:
+      return 0;
+    }
+
+  /* this should never happen */
+  return 0;
+}
+
+
+
+/* This destructively removes some of the re_se_tv side effects from 
+ * a rexp tree.  In particular, during parsing re_se_tv was inserted on the
+ * right half of every | to guarantee that posix path preference could be 
+ * honored.  This function removes some which it can be determined aren't 
+ * needed.  
+ */
+
+#ifdef __STDC__
+static void
+speed_up_alt (struct rx * rx,
+	      struct rexp_node * rexp,
+	      int unposix)
+#else
+static void
+speed_up_alt (rx, rexp, unposix)
+     struct rx * rx;
+     struct rexp_node * rexp;
+     int unposix;
+#endif
+{
+  if (!rexp)
+    return;
+
+  switch (rexp->type)
+    {
+    case r_cset:
+    case r_data:
+    case r_side_effect:
+      return;
+
+    case r_opt:
+    case r_star:
+      speed_up_alt (rx, rexp->params.pair.left, unposix);
+      return;
+
+    case r_2phase_star:
+    case r_concat:
+      speed_up_alt (rx, rexp->params.pair.left, unposix);
+      speed_up_alt (rx, rexp->params.pair.right, unposix);
+      return;
+
+    case r_alternate:
+      /* the right child is guaranteed to be (concat re_se_tv <subexp>) */
+
+      speed_up_alt (rx, rexp->params.pair.left, unposix);
+      speed_up_alt (rx, rexp->params.pair.right->params.pair.right, unposix);
+      
+      if (   unposix
+	  || (begins_with_complex_se
+	      (rx, rexp->params.pair.right->params.pair.right))
+	  || !(   has_any_se (rx, rexp->params.pair.right->params.pair.right)
+	       || has_any_se (rx, rexp->params.pair.left)))
+	{
+	  struct rexp_node * conc = rexp->params.pair.right;
+	  rexp->params.pair.right = conc->params.pair.right;
+	  conc->params.pair.right = 0;
+	  rx_free_rexp (rx, conc);
+	}
+    }
+}
+
+
+
+
+
+
+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+   Returns one of error codes defined in `regex.h', or zero for success.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate'
+   fields are set in BUFP on entry.
+
+   If it succeeds, results are put in BUFP (if it returns an error, the
+   contents of BUFP are undefined):
+     `buffer' is the compiled pattern;
+     `syntax' is set to SYNTAX;
+     `used' is set to the length of the compiled pattern;
+     `fastmap_accurate' is set to zero;
+     `re_nsub' is set to the number of groups in PATTERN;
+     `not_bol' and `not_eol' are set to zero.
+   
+   The `fastmap' and `newline_anchor' fields are neither
+   examined nor set.  */
+
+
+
+#ifdef __STDC__
+RX_DECL reg_errcode_t
+rx_compile (__const__ char *pattern, int size,
+	    reg_syntax_t syntax,
+	    struct re_pattern_buffer * rxb) 
+#else
+RX_DECL reg_errcode_t
+rx_compile (pattern, size, syntax, rxb)
+     __const__ char *pattern;
+     int size;
+     reg_syntax_t syntax;
+     struct re_pattern_buffer * rxb;
+#endif
+{
+  RX_subset
+    inverse_translate [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
+  char
+    validate_inv_tr [CHAR_SET_SIZE * rx_bitset_numb_subsets(CHAR_SET_SIZE)];
+
+  /* We fetch characters from PATTERN here.  Even though PATTERN is
+     `char *' (i.e., signed), we declare these variables as unsigned, so
+     they can be reliably used as array indices.  */
+  register unsigned char c, c1;
+  
+  /* A random tempory spot in PATTERN.  */
+  __const__ char *p1;
+  
+  /* Keeps track of unclosed groups.  */
+  compile_stack_type compile_stack;
+
+  /* Points to the current (ending) position in the pattern.  */
+  __const__ char *p = pattern;
+  __const__ char *pend = pattern + size;
+  
+  /* How to translate the characters in the pattern.  */
+  unsigned char *translate = (rxb->translate
+			      ? rxb->translate
+			      : rx_id_translation);
+
+  /* When parsing is done, this will hold the expression tree. */
+  struct rexp_node * rexp = 0;
+
+  /* In the midst of compilation, this holds onto the regexp 
+   * first parst while rexp goes on to aquire additional constructs.
+   */
+  struct rexp_node * orig_rexp = 0;
+  struct rexp_node * fewer_side_effects = 0;
+
+  /* This and top_expression are saved on the compile stack. */
+  struct rexp_node ** top_expression = &rexp;
+  struct rexp_node ** last_expression = top_expression;
+  
+  /* Parameter to `goto append_node' */
+  struct rexp_node * append;
+
+  /* Counts open-groups as they are encountered.  This is the index of the
+   * innermost group being compiled.
+   */
+  regnum_t regnum = 0;
+
+  /* Place in the uncompiled pattern (i.e., the {) to
+   * which to go back if the interval is invalid.  
+   */
+  __const__ char *beg_interval;
+
+  struct re_se_params * params = 0;
+  int paramc = 0;		/* How many complex side effects so far? */
+
+  rx_side_effect side;		/* param to `goto add_side_effect' */
+
+  bzero (validate_inv_tr, sizeof (validate_inv_tr));
+
+  rxb->rx.instruction_table = rx_id_instruction_table;
+
+
+  /* Initialize the compile stack.  */
+  compile_stack.stack =  (( compile_stack_elt_t *) malloc ((INIT_COMPILE_STACK_SIZE) * sizeof ( compile_stack_elt_t)));
+  if (compile_stack.stack == 0)
+    return REG_ESPACE;
+
+  compile_stack.size = INIT_COMPILE_STACK_SIZE;
+  compile_stack.avail = 0;
+
+  /* Initialize the pattern buffer.  */
+  rxb->rx.cache = &default_cache;
+  rxb->syntax = syntax;
+  rxb->fastmap_accurate = 0;
+  rxb->not_bol = rxb->not_eol = 0;
+  rxb->least_subs = 0;
+  
+  /* Always count groups, whether or not rxb->no_sub is set.  
+   * The whole pattern is implicitly group 0, so counting begins
+   * with 1.
+   */
+  rxb->re_nsub = 0;
+
+#if !defined (emacs) && !defined (SYNTAX_TABLE)
+  /* Initialize the syntax table.  */
+   init_syntax_once ();
+#endif
+
+  /* Loop through the uncompiled pattern until we're at the end.  */
+  while (p != pend)
+    {
+      PATFETCH (c);
+
+      switch (c)
+        {
+        case '^':
+          {
+            if (   /* If at start of pattern, it's an operator.  */
+                   p == pattern + 1
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's come before.  */
+                || at_begline_loc_p (pattern, p, syntax))
+	      {
+		struct rexp_node * n
+		  = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_hat);
+		if (!n)
+		  return REG_ESPACE;
+		append = n;
+		goto append_node;
+	      }
+            else
+              goto normal_char;
+          }
+          break;
+
+
+        case '$':
+          {
+            if (   /* If at end of pattern, it's an operator.  */
+                   p == pend 
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's next.  */
+                || at_endline_loc_p (p, pend, syntax))
+	      {
+		struct rexp_node * n
+		  = rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)re_se_dollar);
+		if (!n)
+		  return REG_ESPACE;
+		append = n;
+		goto append_node;
+	      }
+             else
+               goto normal_char;
+           }
+           break;
+
+
+	case '+':
+        case '?':
+          if ((syntax & RE_BK_PLUS_QM)
+              || (syntax & RE_LIMITED_OPS))
+            goto normal_char;
+
+        handle_plus:
+        case '*':
+          /* If there is no previous pattern... */
+          if (pointless_if_repeated (*last_expression, params))
+            {
+              if (syntax & RE_CONTEXT_INVALID_OPS)
+                return REG_BADRPT;
+              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+                goto normal_char;
+            }
+
+          {
+            /* 1 means zero (many) matches is allowed.  */
+            char zero_times_ok = 0, many_times_ok = 0;
+
+            /* If there is a sequence of repetition chars, collapse it
+               down to just one (the right one).  We can't combine
+               interval operators with these because of, e.g., `a{2}*',
+               which should only match an even number of `a's.  */
+
+            for (;;)
+              {
+                zero_times_ok |= c != '+';
+                many_times_ok |= c != '?';
+
+                if (p == pend)
+                  break;
+
+                PATFETCH (c);
+
+                if (c == '*'
+                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+                  ;
+
+                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
+                  {
+                    if (p == pend) return REG_EESCAPE;
+
+                    PATFETCH (c1);
+                    if (!(c1 == '+' || c1 == '?'))
+                      {
+                        PATUNFETCH;
+                        PATUNFETCH;
+                        break;
+                      }
+
+                    c = c1;
+                  }
+                else
+                  {
+                    PATUNFETCH;
+                    break;
+                  }
+
+                /* If we get here, we found another repeat character.  */
+               }
+
+            /* Star, etc. applied to an empty pattern is equivalent
+               to an empty pattern.  */
+            if (!last_expression)
+              break;
+
+	    /* Now we know whether or not zero matches is allowed
+	     * and also whether or not two or more matches is allowed.
+	     */
+
+	    {
+	      struct rexp_node * inner_exp = *last_expression;
+	      int need_sync = 0;
+
+	      if (many_times_ok
+		  && has_non_idempotent_epsilon_path (&rxb->rx,
+						      inner_exp, params))
+		{
+		  struct rexp_node * pusher
+		    = rx_mk_r_side_effect (&rxb->rx,
+					   (rx_side_effect)re_se_pushpos);
+		  struct rexp_node * checker
+		    = rx_mk_r_side_effect (&rxb->rx,
+					   (rx_side_effect)re_se_chkpos);
+		  struct rexp_node * pushback
+		    = rx_mk_r_side_effect (&rxb->rx,
+					   (rx_side_effect)re_se_pushback);
+		  rx_Bitset cs = rx_cset (&rxb->rx);
+		  struct rexp_node * lit_t = rx_mk_r_cset (&rxb->rx, cs);
+		  struct rexp_node * fake_state
+		    = rx_mk_r_concat (&rxb->rx, pushback, lit_t);
+		  struct rexp_node * phase2
+		    = rx_mk_r_concat (&rxb->rx, checker, fake_state);
+		  struct rexp_node * popper
+		    = rx_mk_r_side_effect (&rxb->rx,
+					   (rx_side_effect)re_se_poppos);
+		  struct rexp_node * star
+		    = rx_mk_r_2phase_star (&rxb->rx, inner_exp, phase2);
+		  struct rexp_node * a
+		    = rx_mk_r_concat (&rxb->rx, pusher, star);
+		  struct rexp_node * whole_thing
+		    = rx_mk_r_concat (&rxb->rx, a, popper);
+		  if (!(pusher && star && pushback && lit_t && fake_state
+			&& lit_t && phase2 && checker && popper
+			&& a && whole_thing))
+		    return REG_ESPACE;
+		  RX_bitset_enjoin (cs, 't');
+		  *last_expression = whole_thing;
+		}
+	      else
+		{
+		  struct rexp_node * star =
+		    (many_times_ok ? rx_mk_r_star : rx_mk_r_opt)
+		      (&rxb->rx, *last_expression);
+		  if (!star)
+		    return REG_ESPACE;
+		  *last_expression = star;
+		  need_sync = has_any_se (&rxb->rx, *last_expression);
+		}
+	      if (!zero_times_ok)
+		{
+		  struct rexp_node * concat
+		    = rx_mk_r_concat (&rxb->rx, inner_exp,
+				      rx_copy_rexp (&rxb->rx,
+						    *last_expression));
+		  if (!concat)
+		    return REG_ESPACE;
+		  *last_expression = concat;
+		}
+	      if (need_sync)
+		{
+		  int sync_se = paramc;
+		  params = (params
+			    ? ((struct re_se_params *)
+			       realloc (params,
+					sizeof (*params) * (1 + paramc)))
+			    : ((struct re_se_params *)
+			       malloc (sizeof (*params))));
+		  if (!params)
+		    return REG_ESPACE;
+		  ++paramc;
+		  params [sync_se].se = re_se_tv;
+		  side = (rx_side_effect)sync_se;
+		  goto add_side_effect;
+		}
+	    }
+	    /* The old regex.c used to optimize `.*\n'.  
+	     * Maybe rx should too?
+	     */
+	  }
+	  break;
+
+
+	case '.':
+	  {
+	    rx_Bitset cs = rx_cset (&rxb->rx);
+	    struct rexp_node * n = rx_mk_r_cset (&rxb->rx, cs);
+	    if (!(cs && n))
+	      return REG_ESPACE;
+
+	    rx_bitset_universe (rxb->rx.local_cset_size, cs);
+	    if (!(rxb->syntax & RE_DOT_NEWLINE))
+	      RX_bitset_remove (cs, '\n');
+	    if (!(rxb->syntax & RE_DOT_NOT_NULL))
+	      RX_bitset_remove (cs, 0);
+
+	    append = n;
+	    goto append_node;
+	    break;
+	  }
+
+
+        case '[':
+	  if (p == pend) return REG_EBRACK;
+          {
+            boolean had_char_class = false;
+	    rx_Bitset cs = rx_cset (&rxb->rx);
+	    struct rexp_node * node = rx_mk_r_cset (&rxb->rx, cs);
+	    int is_inverted = *p == '^';
+	    
+	    if (!(node && cs))
+	      return REG_ESPACE;
+	    
+	    /* This branch of the switch is normally exited with
+	     *`goto append_node'
+	     */
+	    append = node;
+	    
+            if (is_inverted)
+	      p++;
+	    
+            /* Remember the first position in the bracket expression.  */
+            p1 = p;
+	    
+            /* Read in characters and ranges, setting map bits.  */
+            for (;;)
+              {
+                if (p == pend) return REG_EBRACK;
+		
+                PATFETCH (c);
+		
+                /* \ might escape characters inside [...] and [^...].  */
+                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
+                  {
+                    if (p == pend) return REG_EESCAPE;
+		    
+                    PATFETCH (c1);
+		    {
+		      rx_Bitset it = inverse_translation (rxb, 
+							  validate_inv_tr,
+							  inverse_translate,
+							  translate,
+							  c1);
+		      rx_bitset_union (rxb->rx.local_cset_size, cs, it);
+		    }
+                    continue;
+                  }
+		
+                /* Could be the end of the bracket expression.  If it's
+                   not (i.e., when the bracket expression is `[]' so
+                   far), the ']' character bit gets set way below.  */
+                if (c == ']' && p != p1 + 1)
+                  goto finalize_class_and_append;
+		
+                /* Look ahead to see if it's a range when the last thing
+                   was a character class.  */
+                if (had_char_class && c == '-' && *p != ']')
+                  return REG_ERANGE;
+		
+                /* Look ahead to see if it's a range when the last thing
+                   was a character: if this is a hyphen not at the
+                   beginning or the end of a list, then it's the range
+                   operator.  */
+                if (c == '-' 
+                    && !(p - 2 >= pattern && p[-2] == '[') 
+                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+                    && *p != ']')
+                  {
+                    reg_errcode_t ret
+                      = compile_range (rxb, cs, &p, pend, translate, syntax,
+				       inverse_translate, validate_inv_tr);
+                    if (ret != REG_NOERROR) return ret;
+                  }
+		
+                else if (p[0] == '-' && p[1] != ']')
+                  { /* This handles ranges made up of characters only.  */
+                    reg_errcode_t ret;
+		    
+		    /* Move past the `-'.  */
+                    PATFETCH (c1);
+                    
+                    ret = compile_range (rxb, cs, &p, pend, translate, syntax,
+					 inverse_translate, validate_inv_tr);
+                    if (ret != REG_NOERROR) return ret;
+                  }
+		
+                /* See if we're at the beginning of a possible character
+                   class.  */
+		
+		else if ((syntax & RE_CHAR_CLASSES)
+			 && (c == '[') && (*p == ':'))
+                  {
+                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+		    
+                    PATFETCH (c);
+                    c1 = 0;
+		    
+                    /* If pattern is `[[:'.  */
+                    if (p == pend) return REG_EBRACK;
+		    
+                    for (;;)
+                      {
+                        PATFETCH (c);
+                        if (c == ':' || c == ']' || p == pend
+                            || c1 == CHAR_CLASS_MAX_LENGTH)
+			  break;
+                        str[c1++] = c;
+                      }
+                    str[c1] = '\0';
+		    
+                    /* If isn't a word bracketed by `[:' and:`]':
+                       undo the ending character, the letters, and leave 
+                       the leading `:' and `[' (but set bits for them).  */
+                    if (c == ':' && *p == ']')
+                      {
+                        int ch;
+                        boolean is_alnum = !strcmp (str, "alnum");
+                        boolean is_alpha = !strcmp (str, "alpha");
+                        boolean is_blank = !strcmp (str, "blank");
+                        boolean is_cntrl = !strcmp (str, "cntrl");
+                        boolean is_digit = !strcmp (str, "digit");
+                        boolean is_graph = !strcmp (str, "graph");
+                        boolean is_lower = !strcmp (str, "lower");
+                        boolean is_print = !strcmp (str, "print");
+                        boolean is_punct = !strcmp (str, "punct");
+                        boolean is_space = !strcmp (str, "space");
+                        boolean is_upper = !strcmp (str, "upper");
+                        boolean is_xdigit = !strcmp (str, "xdigit");
+                        
+                        if (!IS_CHAR_CLASS (str)) return REG_ECTYPE;
+			
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);					
+			
+                        if (p == pend) return REG_EBRACK;
+			
+                        for (ch = 0; ch < 1 << CHARBITS; ch++)
+                          {
+                            if (   (is_alnum  && isalnum (ch))
+                                || (is_alpha  && isalpha (ch))
+                                || (is_blank  && isblank (ch))
+                                || (is_cntrl  && iscntrl (ch))
+                                || (is_digit  && isdigit (ch))
+                                || (is_graph  && isgraph (ch))
+                                || (is_lower  && islower (ch))
+                                || (is_print  && isprint (ch))
+                                || (is_punct  && ispunct (ch))
+                                || (is_space  && isspace (ch))
+                                || (is_upper  && isupper (ch))
+                                || (is_xdigit && isxdigit (ch)))
+			      {
+				rx_Bitset it =
+				  inverse_translation (rxb, 
+						       validate_inv_tr,
+						       inverse_translate,
+						       translate,
+						       ch);
+				rx_bitset_union (rxb->rx.local_cset_size,
+						 cs, it);
+			      }
+                          }
+                        had_char_class = true;
+                      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)    
+                          PATUNFETCH;
+			{
+			  rx_Bitset it =
+			    inverse_translation (rxb, 
+						 validate_inv_tr,
+						 inverse_translate,
+						 translate,
+						 '[');
+			  rx_bitset_union (rxb->rx.local_cset_size,
+					   cs, it);
+			}
+			{
+			  rx_Bitset it =
+			    inverse_translation (rxb, 
+						 validate_inv_tr,
+						 inverse_translate,
+						 translate,
+						 ':');
+			  rx_bitset_union (rxb->rx.local_cset_size,
+					   cs, it);
+			}
+                        had_char_class = false;
+                      }
+                  }
+                else
+                  {
+                    had_char_class = false;
+		    {
+		      rx_Bitset it = inverse_translation (rxb, 
+							  validate_inv_tr,
+							  inverse_translate,
+							  translate,
+							  c);
+		      rx_bitset_union (rxb->rx.local_cset_size, cs, it);
+		    }
+                  }
+              }
+
+	  finalize_class_and_append:
+	    if (is_inverted)
+	      {
+		rx_bitset_complement (rxb->rx.local_cset_size, cs);
+		if (syntax & RE_HAT_LISTS_NOT_NEWLINE)
+		  RX_bitset_remove (cs, '\n');
+	      }
+	    goto append_node;
+          }
+          break;
+
+
+	case '(':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_open;
+          else
+            goto normal_char;
+
+
+        case ')':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_close;
+          else
+            goto normal_char;
+
+
+        case '\n':
+          if (syntax & RE_NEWLINE_ALT)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+	case '|':
+          if (syntax & RE_NO_BK_VBAR)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+        case '{':
+	  if ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+	    goto handle_interval;
+	  else
+	    goto normal_char;
+
+
+        case '\\':
+          if (p == pend) return REG_EESCAPE;
+
+          /* Do not translate the character after the \, so that we can
+             distinguish, e.g., \B from \b, even if we normally would
+             translate, e.g., B to b.  */
+          PATFETCH_RAW (c);
+
+          switch (c)
+            {
+            case '(':
+              if (syntax & RE_NO_BK_PARENS)
+                goto normal_backslash;
+
+            handle_open:
+              rxb->re_nsub++;
+              regnum++;
+              if (COMPILE_STACK_FULL)
+                { 
+                  ((compile_stack.stack) =
+		   (compile_stack_elt_t *) realloc (compile_stack.stack, ( compile_stack.size << 1) * sizeof (
+													      compile_stack_elt_t)));
+                  if (compile_stack.stack == 0) return REG_ESPACE;
+
+                  compile_stack.size <<= 1;
+                }
+
+	      if (*last_expression)
+		{
+		  struct rexp_node * concat
+		    = rx_mk_r_concat (&rxb->rx, *last_expression, 0);
+		  if (!concat)
+		    return REG_ESPACE;
+		  *last_expression = concat;
+		  last_expression = &concat->params.pair.right;
+		}
+
+              /*
+	       * These are the values to restore when we hit end of this
+               * group.  
+	       */
+	      COMPILE_STACK_TOP.top_expression = top_expression;
+	      COMPILE_STACK_TOP.last_expression = last_expression;
+              COMPILE_STACK_TOP.regnum = regnum;
+	      
+              compile_stack.avail++;
+	      
+	      top_expression = last_expression;
+	      break;
+
+
+            case ')':
+              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
+
+            handle_close:
+              /* See similar code for backslashed left paren above.  */
+              if (COMPILE_STACK_EMPTY)
+                if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+                  goto normal_char;
+                else
+                  return REG_ERPAREN;
+
+              /* Since we just checked for an empty stack above, this
+                 ``can't happen''.  */
+
+              {
+                /* We don't just want to restore into `regnum', because
+                   later groups should continue to be numbered higher,
+                   as in `(ab)c(de)' -- the second group is #2.  */
+                regnum_t this_group_regnum;
+		struct rexp_node ** inner = top_expression;
+
+                compile_stack.avail--;
+		top_expression = COMPILE_STACK_TOP.top_expression;
+		last_expression = COMPILE_STACK_TOP.last_expression;
+                this_group_regnum = COMPILE_STACK_TOP.regnum;
+		{
+		  int left_se = paramc;
+		  int right_se = paramc + 1;
+
+		  params = (params
+			    ? ((struct re_se_params *)
+			       realloc (params,
+					(paramc + 2) * sizeof (params[0])))
+			    : ((struct re_se_params *)
+			       malloc (2 * sizeof (params[0]))));
+		  if (!params)
+		    return REG_ESPACE;
+		  paramc += 2;
+
+		  params[left_se].se = re_se_lparen;
+		  params[left_se].op1 = this_group_regnum;
+		  params[right_se].se = re_se_rparen;
+		  params[right_se].op1 = this_group_regnum;
+		  {
+		    struct rexp_node * left
+		      = rx_mk_r_side_effect (&rxb->rx,
+					     (rx_side_effect)left_se);
+		    struct rexp_node * right
+		      = rx_mk_r_side_effect (&rxb->rx,
+					     (rx_side_effect)right_se);
+		    struct rexp_node * c1
+		      = (*inner
+			 ? rx_mk_r_concat (&rxb->rx, left, *inner) : left);
+		    struct rexp_node * c2
+		      = rx_mk_r_concat (&rxb->rx, c1, right);
+		    if (!(left && right && c1 && c2))
+		      return REG_ESPACE;
+		    *inner = c2;
+		  }
+		}
+		break;
+	      }
+
+            case '|':					/* `\|'.  */
+              if ((syntax & RE_LIMITED_OPS) || (syntax & RE_NO_BK_VBAR))
+                goto normal_backslash;
+            handle_alt:
+              if (syntax & RE_LIMITED_OPS)
+                goto normal_char;
+
+	      {
+		struct rexp_node * alt
+		  = rx_mk_r_alternate (&rxb->rx, *top_expression, 0);
+		if (!alt)
+		  return REG_ESPACE;
+		*top_expression = alt;
+		last_expression = &alt->params.pair.right;
+		{
+		  int sync_se = paramc;
+
+		  params = (params
+			    ? ((struct re_se_params *)
+			       realloc (params,
+					(paramc + 1) * sizeof (params[0])))
+			    : ((struct re_se_params *)
+			       malloc (sizeof (params[0]))));
+		  if (!params)
+		    return REG_ESPACE;
+		  ++paramc;
+
+		  params[sync_se].se = re_se_tv;
+		  {
+		    struct rexp_node * sync
+		      = rx_mk_r_side_effect (&rxb->rx,
+					     (rx_side_effect)sync_se);
+		    struct rexp_node * conc
+		      = rx_mk_r_concat (&rxb->rx, sync, 0);
+
+		    if (!sync || !conc)
+		      return REG_ESPACE;
+
+		    *last_expression = conc;
+		    last_expression = &conc->params.pair.right;
+		  }
+		}
+	      }
+              break;
+
+
+            case '{': 
+              /* If \{ is a literal.  */
+              if (!(syntax & RE_INTERVALS)
+                     /* If we're at `\{' and it's not the open-interval 
+                        operator.  */
+                  || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                  || (p - 2 == pattern  &&  p == pend))
+                goto normal_backslash;
+
+            handle_interval:
+              {
+                /* If got here, then the syntax allows intervals.  */
+
+                /* At least (most) this many matches must be made.  */
+                int lower_bound = -1, upper_bound = -1;
+
+                beg_interval = p - 1;
+
+                if (p == pend)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else
+                      return REG_EBRACE;
+                  }
+
+                GET_UNSIGNED_NUMBER (lower_bound);
+
+                if (c == ',')
+                  {
+                    GET_UNSIGNED_NUMBER (upper_bound);
+                    if (upper_bound < 0) upper_bound = RE_DUP_MAX;
+                  }
+                else
+                  /* Interval such as `{1}' => match exactly once. */
+                  upper_bound = lower_bound;
+
+                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+                    || lower_bound > upper_bound)
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      return REG_BADBR;
+                  }
+
+                if (!(syntax & RE_NO_BK_BRACES)) 
+                  {
+                    if (c != '\\') return REG_EBRACE;
+                    PATFETCH (c);
+                  }
+
+                if (c != '}')
+                  {
+                    if (syntax & RE_NO_BK_BRACES)
+                      goto unfetch_interval;
+                    else 
+                      return REG_BADBR;
+                  }
+
+                /* We just parsed a valid interval.  */
+
+                /* If it's invalid to have no preceding re.  */
+                if (pointless_if_repeated (*last_expression, params))
+                  {
+                    if (syntax & RE_CONTEXT_INVALID_OPS)
+                      return REG_BADRPT;
+                    else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+                      goto unfetch_interval;
+		    /* was: else laststart = b; */
+                  }
+
+                /* If the upper bound is zero, don't want to iterate
+                 * at all.
+		 */
+                 if (upper_bound == 0)
+		   {
+		     if (*last_expression)
+		       {
+			 rx_free_rexp (&rxb->rx, *last_expression);
+			 *last_expression = 0;
+		       }
+		   }
+		else
+		  /* Otherwise, we have a nontrivial interval. */
+		  {
+		    int iter_se = paramc;
+		    int end_se = paramc + 1;
+		    params = (params
+			      ? ((struct re_se_params *)
+				 realloc (params,
+					  sizeof (*params) * (2 + paramc)))
+			      : ((struct re_se_params *)
+				 malloc (2 * sizeof (*params))));
+		    if (!params)
+		      return REG_ESPACE;
+		    paramc += 2;
+		    params [iter_se].se = re_se_iter;
+		    params [iter_se].op1 = lower_bound;
+		    params[iter_se].op2 = upper_bound;
+
+		    params[end_se].se = re_se_end_iter;
+		    params[end_se].op1 = lower_bound;
+		    params[end_se].op2 = upper_bound;
+		    {
+		      struct rexp_node * push0
+			= rx_mk_r_side_effect (&rxb->rx,
+					       (rx_side_effect)re_se_push0);
+		      struct rexp_node * start_one_iter
+			= rx_mk_r_side_effect (&rxb->rx,
+					       (rx_side_effect)iter_se);
+		      struct rexp_node * phase1
+			= rx_mk_r_concat (&rxb->rx, start_one_iter,
+					  *last_expression);
+		      struct rexp_node * pushback
+			= rx_mk_r_side_effect (&rxb->rx,
+					       (rx_side_effect)re_se_pushback);
+		      rx_Bitset cs = rx_cset (&rxb->rx);
+		      struct rexp_node * lit_t
+			= rx_mk_r_cset (&rxb->rx, cs);
+		      struct rexp_node * phase2
+			= rx_mk_r_concat (&rxb->rx, pushback, lit_t);
+		      struct rexp_node * loop
+			= rx_mk_r_2phase_star (&rxb->rx, phase1, phase2);
+		      struct rexp_node * push_n_loop
+			= rx_mk_r_concat (&rxb->rx, push0, loop);
+		      struct rexp_node * final_test
+			= rx_mk_r_side_effect (&rxb->rx,
+					       (rx_side_effect)end_se);
+		      struct rexp_node * full_exp
+			= rx_mk_r_concat (&rxb->rx, push_n_loop, final_test);
+
+		      if (!(push0 && start_one_iter && phase1
+			    && pushback && lit_t && phase2
+			    && loop && push_n_loop && final_test && full_exp))
+			return REG_ESPACE;
+
+		      RX_bitset_enjoin(cs, 't');
+
+		      *last_expression = full_exp;
+		    }
+		  }
+                beg_interval = 0;
+              }
+              break;
+
+            unfetch_interval:
+              /* If an invalid interval, match the characters as literals.  */
+               p = beg_interval;
+               beg_interval = 0;
+
+               /* normal_char and normal_backslash need `c'.  */
+               PATFETCH (c);	
+
+               if (!(syntax & RE_NO_BK_BRACES))
+                 {
+                   if (p > pattern  &&  p[-1] == '\\')
+                     goto normal_backslash;
+                 }
+               goto normal_char;
+
+#ifdef emacs
+            /* There is no way to specify the before_dot and after_dot
+               operators.  rms says this is ok.  --karl  */
+            case '=':
+	      side = (rx_side_effect)rx_se_at_dot;
+	      goto add_side_effect;
+              break;
+
+            case 's':
+	    case 'S':
+	      {
+		rx_Bitset cs = rx_cset (&rxb->rx);
+		struct rexp_node * set = rx_mk_r_cset (&rxb->rx, cs);
+		if (!(cs && set))
+		  return REG_ESPACE;
+		if (c == 'S')
+		  rx_bitset_universe (rxb->rx.local_cset_size, cs);
+
+		PATFETCH (c);
+		{
+		  int x;
+		  enum syntaxcode code = syntax_spec_code [c];
+		  for (x = 0; x < 256; ++x)
+		    {
+		      
+		      if (SYNTAX (x) == code)
+			{
+			  rx_Bitset it =
+			    inverse_translation (rxb, validate_inv_tr,
+						 inverse_translate,
+						 translate, x);
+			  rx_bitset_xor (rxb->rx.local_cset_size, cs, it);
+			}
+		    }
+		}
+		append = set;
+		goto append_node;
+	      }
+              break;
+#endif /* emacs */
+
+
+            case 'w':
+            case 'W':
+	      {
+		rx_Bitset cs = rx_cset (&rxb->rx);
+		struct rexp_node * n = (cs ? rx_mk_r_cset (&rxb->rx, cs) : 0);
+		if (!(cs && n))
+		  return REG_ESPACE;
+		if (c == 'W')
+		  rx_bitset_universe (rxb->rx.local_cset_size ,cs);
+		{
+		  int x;
+		  for (x = rxb->rx.local_cset_size - 1; x > 0; --x)
+		    if (SYNTAX(x) & Sword)
+		      RX_bitset_toggle (cs, x);
+		}
+		append = n;
+		goto append_node;
+	      }
+              break;
+
+/* With a little extra work, some of these side effects could be optimized
+ * away (basicly by looking at what we already know about the surrounding
+ * chars).  
+ */
+            case '<':
+	      side = (rx_side_effect)re_se_wordbeg;
+	      goto add_side_effect;
+              break;
+
+            case '>':
+              side = (rx_side_effect)re_se_wordend;
+	      goto add_side_effect;
+              break;
+
+            case 'b':
+              side = (rx_side_effect)re_se_wordbound;
+	      goto add_side_effect;
+              break;
+
+            case 'B':
+              side = (rx_side_effect)re_se_notwordbound;
+	      goto add_side_effect;
+              break;
+
+            case '`':
+	      side = (rx_side_effect)re_se_begbuf;
+	      goto add_side_effect;
+	      break;
+	      
+            case '\'':
+	      side = (rx_side_effect)re_se_endbuf;
+	      goto add_side_effect;
+              break;
+
+	    add_side_effect:
+	      {
+		struct rexp_node * se
+		  = rx_mk_r_side_effect (&rxb->rx, side);
+		if (!se)
+		  return REG_ESPACE;
+		append = se;
+		goto append_node;
+	      }
+	      break;
+
+            case '1': case '2': case '3': case '4': case '5':
+            case '6': case '7': case '8': case '9':
+              if (syntax & RE_NO_BK_REFS)
+                goto normal_char;
+
+              c1 = c - '0';
+
+              if (c1 > regnum)
+                return REG_ESUBREG;
+
+              /* Can't back reference to a subexpression if inside of it.  */
+              if (group_in_compile_stack (compile_stack, c1))
+		return REG_ESUBREG;
+
+	      {
+		int backref_se = paramc;
+		params = (params
+			  ? ((struct re_se_params *)
+			     realloc (params,
+				      sizeof (*params) * (1 + paramc)))
+			  : ((struct re_se_params *)
+			     malloc (sizeof (*params))));
+		if (!params)
+		  return REG_ESPACE;
+		++paramc;
+		params[backref_se].se = re_se_backref;
+		params[backref_se].op1 = c1;
+		side = (rx_side_effect)backref_se;
+		goto add_side_effect;
+	      }
+              break;
+
+            case '+':
+            case '?':
+              if (syntax & RE_BK_PLUS_QM)
+                goto handle_plus;
+              else
+                goto normal_backslash;
+
+            default:
+            normal_backslash:
+              /* You might think it would be useful for \ to mean
+                 not to translate; but if we don't translate it
+                 it will never match anything.  */
+              c = TRANSLATE (c);
+              goto normal_char;
+            }
+          break;
+
+
+	default:
+        /* Expects the character in `c'.  */
+	normal_char:
+	    {
+	      rx_Bitset cs = rx_cset(&rxb->rx);
+	      struct rexp_node * match = rx_mk_r_cset (&rxb->rx, cs);
+	      rx_Bitset it;
+	      if (!(cs && match))
+		return REG_ESPACE;
+	      it = inverse_translation (rxb, validate_inv_tr,
+					inverse_translate, translate, c);
+	      rx_bitset_union (CHAR_SET_SIZE, cs, it);
+	      append = match;
+
+	    append_node:
+	      /* This genericly appends the rexp APPEND to *LAST_EXPRESSION
+	       * and then parses the next character normally.
+	       */
+	      if (*last_expression)
+		{
+		  struct rexp_node * concat
+		    = rx_mk_r_concat (&rxb->rx, *last_expression, append);
+		  if (!concat)
+		    return REG_ESPACE;
+		  *last_expression = concat;
+		  last_expression = &concat->params.pair.right;
+		}
+	      else
+		*last_expression = append;
+	    }
+	} /* switch (c) */
+    } /* while p != pend */
+
+  
+  {
+    int win_se = paramc;
+    params = (params
+	      ? ((struct re_se_params *)
+		 realloc (params,
+			  sizeof (*params) * (1 + paramc)))
+	      : ((struct re_se_params *)
+		 malloc (sizeof (*params))));
+    if (!params)
+      return REG_ESPACE;
+    ++paramc;
+    params[win_se].se = re_se_win;
+    {
+      struct rexp_node * se
+	= rx_mk_r_side_effect (&rxb->rx, (rx_side_effect)win_se);
+      struct rexp_node * concat
+	= rx_mk_r_concat (&rxb->rx, rexp, se);
+      if (!(se && concat))
+	return REG_ESPACE;
+      rexp = concat;
+    }
+  }
+
+
+  /* Through the pattern now.  */
+
+  if (!COMPILE_STACK_EMPTY) 
+    return REG_EPAREN;
+
+      free (compile_stack.stack);
+
+  orig_rexp = rexp;
+#ifdef RX_DEBUG
+  if (rx_debug_compile)
+    {
+      dbug_rxb = rxb;
+      fputs ("\n\nCompiling ", stdout);
+      fwrite (pattern, 1, size, stdout);
+      fputs (":\n", stdout);
+      rxb->se_params = params;
+      print_rexp (&rxb->rx, orig_rexp, 2, re_seprint, stdout);
+    }
+#endif
+  {
+    rx_Bitset cs = rx_cset(&rxb->rx);
+    rx_Bitset cs2 = rx_cset(&rxb->rx);
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+    char * se_map = (char *) _alloca (paramc);
+#else
+    char * se_map = (char *) alloca (paramc);
+#endif
+    struct rexp_node * new_rexp = 0;
+
+
+    bzero (se_map, paramc);
+    find_backrefs (se_map, rexp, params);
+    fewer_side_effects =
+      remove_unecessary_side_effects (&rxb->rx, se_map,
+				      rx_copy_rexp (&rxb->rx, rexp), params);
+
+    speed_up_alt (&rxb->rx, rexp, 0);
+    speed_up_alt (&rxb->rx, fewer_side_effects, 1);
+
+    {
+      char * syntax_parens = rxb->syntax_parens;
+      if (syntax_parens == (char *)0x1)
+	rexp = remove_unecessary_side_effects
+	  (&rxb->rx, se_map, rexp, params);
+      else if (syntax_parens)
+	{
+	  int x;
+	  for (x = 0; x < paramc; ++x)
+	    if ((   (params[x].se == re_se_lparen)
+		 || (params[x].se == re_se_rparen))
+		&& (!syntax_parens [params[x].op1]))
+	      se_map [x] = 1;
+	  rexp = remove_unecessary_side_effects
+	    (&rxb->rx, se_map, rexp, params);
+	}
+    }
+
+    /* At least one more optimization would be nice to have here but i ran out 
+     * of time.  The idea would be to delay side effects.  
+     * For examle, `(abc)' is the same thing as `abc()' except that the
+     * left paren is offset by 3 (which we know at compile time).
+     * (In this comment, write that second pattern `abc(:3:)' 
+     * where `(:3:' is a syntactic unit.)
+     *
+     * Trickier:  `(abc|defg)'  is the same as `(abc(:3:|defg(:4:))'
+     * (The paren nesting may be hard to follow -- that's an alternation
+     *	of `abc(:3:' and `defg(:4:' inside (purely syntactic) parens
+     *  followed by the closing paren from the original expression.)
+     *
+     * Neither the expression tree representation nor the the nfa make
+     * this very easy to write. :(
+     */
+
+  /* What we compile is different than what the parser returns.
+   * Suppose the parser returns expression R.
+   * Let R' be R with unnecessary register assignments removed 
+   * (see REMOVE_UNECESSARY_SIDE_EFFECTS, above).
+   *
+   * What we will compile is the expression:
+   *
+   *    m{try}R{win}\|s{try}R'{win}
+   *
+   * {try} and {win} denote side effect epsilons (see EXPLORE_FUTURE).
+   * 
+   * When trying a match, we insert an `m' at the beginning of the 
+   * string if the user wants registers to be filled, `s' if not.
+   */
+    new_rexp =
+      rx_mk_r_alternate
+	(&rxb->rx,
+	 rx_mk_r_concat (&rxb->rx, rx_mk_r_cset (&rxb->rx, cs2), rexp),
+	 rx_mk_r_concat (&rxb->rx,
+			 rx_mk_r_cset (&rxb->rx, cs), fewer_side_effects));
+
+    if (!(new_rexp && cs && cs2))
+      return REG_ESPACE;
+    RX_bitset_enjoin (cs2, '\0'); /* prefixed to the rexp used for matching. */
+    RX_bitset_enjoin (cs, '\1'); /* prefixed to the rexp used for searching. */
+    rexp = new_rexp;
+  }
+
+#ifdef RX_DEBUG
+  if (rx_debug_compile)
+    {
+      fputs ("\n...which is compiled as:\n", stdout);
+      print_rexp (&rxb->rx, rexp, 2, re_seprint, stdout);
+    }
+#endif
+  {
+    struct rx_nfa_state *start = 0;
+    struct rx_nfa_state *end = 0;
+
+    if (!rx_build_nfa (&rxb->rx, rexp, &start, &end))
+      return REG_ESPACE;	/*  */
+    else
+      {
+	void * mem = (void *)rxb->buffer;
+	unsigned long size = rxb->allocated;
+	int start_id;
+	char * perm_mem;
+	int iterator_size = paramc * sizeof (params[0]);
+
+	end->is_final = 1;
+	start->is_start = 1;
+	rx_name_nfa_states (&rxb->rx);
+	start_id = start->id;
+#ifdef RX_DEBUG
+	if (rx_debug_compile)
+	  {
+	    fputs ("...giving the NFA: \n", stdout);
+	    dbug_rxb = rxb;
+	    print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
+	  }
+#endif
+	if (!rx_eclose_nfa (&rxb->rx))
+	  return REG_ESPACE;
+	else
+	  {
+	    rx_delete_epsilon_transitions (&rxb->rx);
+	    
+	    /* For compatability reasons, we need to shove the
+	     * compiled nfa into one chunk of malloced memory.
+	     */
+	    rxb->rx.reserved = (   sizeof (params[0]) * paramc
+				+  rx_sizeof_bitset (rxb->rx.local_cset_size));
+#ifdef RX_DEBUG
+	    if (rx_debug_compile)
+	      {
+		dbug_rxb = rxb;
+		fputs ("...which cooks down (uncompactified) to: \n", stdout);
+		print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
+	      }
+#endif
+	    if (!rx_compactify_nfa (&rxb->rx, &mem, &size))
+	      return REG_ESPACE;
+	    rxb->buffer = mem;
+	    rxb->allocated = size;
+	    rxb->rx.buffer = mem;
+	    rxb->rx.allocated = size;
+	    perm_mem = ((char *)rxb->rx.buffer
+			+ rxb->rx.allocated - rxb->rx.reserved);
+	    rxb->se_params = ((struct re_se_params *)perm_mem);
+	    bcopy (params, rxb->se_params, iterator_size);
+	    perm_mem += iterator_size;
+	    rxb->fastset = (rx_Bitset) perm_mem;
+	    rxb->start = rx_id_to_nfa_state (&rxb->rx, start_id);
+	  }
+	rx_bitset_null (rxb->rx.local_cset_size, rxb->fastset);
+	rxb->can_match_empty = compute_fastset (rxb, orig_rexp);
+	rxb->match_regs_on_stack =
+	  registers_on_stack (rxb, orig_rexp, 0, params); 
+	rxb->search_regs_on_stack =
+	  registers_on_stack (rxb, fewer_side_effects, 0, params);
+	if (rxb->can_match_empty)
+	  rx_bitset_universe (rxb->rx.local_cset_size, rxb->fastset);
+	rxb->is_anchored = is_anchored (orig_rexp, (rx_side_effect) re_se_hat);
+	rxb->begbuf_only = is_anchored (orig_rexp,
+					(rx_side_effect) re_se_begbuf);
+      }
+    rx_free_rexp (&rxb->rx, rexp);
+    if (params)
+      free (params);
+#ifdef RX_DEBUG
+    if (rx_debug_compile)
+      {
+	dbug_rxb = rxb;
+	fputs ("...which cooks down to: \n", stdout);
+	print_nfa (&rxb->rx, rxb->rx.nfa_states, re_seprint, stdout);
+      }
+#endif
+  }
+  return REG_NOERROR;
+}
+
+
+
+
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.  */
+
+__const__ char * rx_error_msg[] =
+{ 0,						/* REG_NOERROR */
+    "No match",					/* REG_NOMATCH */
+    "Invalid regular expression",		/* REG_BADPAT */
+    "Invalid collation character",		/* REG_ECOLLATE */
+    "Invalid character class name",		/* REG_ECTYPE */
+    "Trailing backslash",			/* REG_EESCAPE */
+    "Invalid back reference",			/* REG_ESUBREG */
+    "Unmatched [ or [^",			/* REG_EBRACK */
+    "Unmatched ( or \\(",			/* REG_EPAREN */
+    "Unmatched \\{",				/* REG_EBRACE */
+    "Invalid content of \\{\\}",		/* REG_BADBR */
+    "Invalid range end",			/* REG_ERANGE */
+    "Memory exhausted",				/* REG_ESPACE */
+    "Invalid preceding regular expression",	/* REG_BADRPT */
+    "Premature end of regular expression",	/* REG_EEND */
+    "Regular expression too big",		/* REG_ESIZE */
+    "Unmatched ) or \\)",			/* REG_ERPAREN */
+};
+
+
+
+
+
+char rx_slowmap [256] =
+{
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+};
+
+#ifdef __STDC__
+RX_DECL void
+rx_blow_up_fastmap (struct re_pattern_buffer * rxb)
+#else
+RX_DECL void
+rx_blow_up_fastmap (rxb)
+     struct re_pattern_buffer * rxb;
+#endif
+{
+  int x;
+  for (x = 0; x < 256; ++x)	/* &&&& 3.6 % */
+    rxb->fastmap [x] = !!RX_bitset_member (rxb->fastset, x);
+  rxb->fastmap_accurate = 1;
+}
+
+
+
+
+
+#if !defined(REGEX_MALLOC) && !defined(__GNUC__)
+#define RE_SEARCH_2_FN	inner_re_search_2
+#define RE_S2_QUAL static
+#else
+#define RE_SEARCH_2_FN	re_search_2
+#define RE_S2_QUAL 
+#endif
+
+struct re_search_2_closure
+{
+  __const__ char * string1;
+  int size1;
+  __const__ char * string2;
+  int size2;
+};
+
+
+static __inline__ enum rx_get_burst_return
+re_search_2_get_burst (pos, vclosure, stop)
+     struct rx_string_position * pos;
+     void * vclosure;
+     int stop;
+{
+  struct re_search_2_closure * closure;
+  closure = (struct re_search_2_closure *)vclosure;
+  if (!closure->string2)
+    {
+      int inset;
+
+      inset = pos->pos - pos->string;
+      if ((inset < -1) || (inset > closure->size1))
+	return rx_get_burst_no_more;
+      else
+	{
+	  pos->pos = (__const__ unsigned char *) closure->string1 + inset;
+	  pos->string = (__const__ unsigned char *) closure->string1;
+	  pos->size = closure->size1;
+	  pos->end = ((__const__ unsigned char *)
+		      MIN(closure->string1 + closure->size1,
+			  closure->string1 + stop));
+	  pos->offset = 0;
+	  return ((pos->pos < pos->end)
+		  ? rx_get_burst_ok
+		  :  rx_get_burst_no_more);
+	}
+    }
+  else if (!closure->string1)
+    {
+      int inset;
+
+      inset = pos->pos - pos->string;
+      pos->pos = (__const__ unsigned char *) closure->string2 + inset;
+      pos->string = (__const__ unsigned char *) closure->string2;
+      pos->size = closure->size2;
+      pos->end = ((__const__ unsigned char *)
+		  MIN(closure->string2 + closure->size2,
+		      closure->string2 + stop));
+      pos->offset = 0;
+      return ((pos->pos < pos->end)
+	      ? rx_get_burst_ok
+	      :  rx_get_burst_no_more);
+    }
+  else
+    {
+      int inset;
+
+      inset = pos->pos - pos->string + pos->offset;
+      if (inset < closure->size1)
+	{
+	  pos->pos = (__const__ unsigned char *) closure->string1 + inset;
+	  pos->string = (__const__ unsigned char *) closure->string1;
+	  pos->size = closure->size1;
+	  pos->end = ((__const__ unsigned char *)
+		      MIN(closure->string1 + closure->size1,
+			  closure->string1 + stop));
+	  pos->offset = 0;
+	  return rx_get_burst_ok;
+	}
+      else
+	{
+	  pos->pos = ((__const__ unsigned char *)
+		      closure->string2 + inset - closure->size1);
+	  pos->string = (__const__ unsigned char *) closure->string2;
+	  pos->size = closure->size2;
+	  pos->end = ((__const__ unsigned char *)
+		      MIN(closure->string2 + closure->size2,
+			  closure->string2 + stop - closure->size1));
+	  pos->offset = closure->size1;
+	  return ((pos->pos < pos->end)
+		  ? rx_get_burst_ok
+		  :  rx_get_burst_no_more);
+	}
+    }
+}
+
+
+static __inline__ enum rx_back_check_return
+re_search_2_back_check (pos, lparen, rparen, translate, vclosure, stop)
+     struct rx_string_position * pos;
+     int lparen;
+     int rparen;
+     unsigned char * translate;
+     void * vclosure;
+     int stop;
+{
+  struct rx_string_position there;
+  struct rx_string_position past;
+
+  there = *pos;
+  there.pos = there.string + lparen - there.offset;
+  re_search_2_get_burst (&there, vclosure, stop);
+
+  past = *pos;
+  past.pos = past.string + rparen - there.offset;
+  re_search_2_get_burst (&past, vclosure, stop);
+
+  ++pos->pos;
+  re_search_2_get_burst (pos, vclosure, stop);
+
+  while (   (there.pos != past.pos)
+	 && (pos->pos != pos->end))
+    if (TRANSLATE(*there.pos) != TRANSLATE(*pos->pos))
+      return rx_back_check_fail;
+    else
+      {
+	++there.pos;
+	++pos->pos;
+	if (there.pos == there.end)
+	  re_search_2_get_burst (&there, vclosure, stop);
+	if (pos->pos == pos->end)
+	  re_search_2_get_burst (pos, vclosure, stop);
+      }
+
+  if (there.pos != past.pos)
+    return rx_back_check_fail;
+  --pos->pos;
+  re_search_2_get_burst (pos, vclosure, stop);
+  return rx_back_check_pass;
+}
+
+static __inline__ int
+re_search_2_fetch_char (pos, offset, app_closure, stop)
+     struct rx_string_position * pos;
+     int offset;
+     void * app_closure;
+     int stop;
+{
+  struct re_search_2_closure * closure;
+  closure = (struct re_search_2_closure *)app_closure;
+  if (offset == 0)
+    {
+      if (pos->pos >= pos->string)
+	return *pos->pos;
+      else
+	{
+	  if (   (pos->string == (__const__ unsigned char *) closure->string2)
+	      && (closure->string1)
+	      && (closure->size1))
+	    return closure->string1[closure->size1 - 1];
+	  else
+	    return 0;		/* sure, why not. */
+	}
+    }
+  if (pos->pos == pos->end)
+    return *closure->string2;
+  else
+    return pos->pos[1];
+}
+     
+
+#ifdef __STDC__
+RE_S2_QUAL int
+RE_SEARCH_2_FN (struct re_pattern_buffer *rxb,
+		__const__ char * string1, int size1,
+		__const__ char * string2, int size2,
+		int startpos, int range,
+		struct re_registers *regs,
+		int stop)
+#else
+RE_S2_QUAL int
+RE_SEARCH_2_FN (rxb,
+		string1, size1, string2, size2, startpos, range, regs, stop)
+     struct re_pattern_buffer *rxb;
+     __const__ char * string1;
+     int size1;
+     __const__ char * string2;
+     int size2;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+     int stop;
+#endif
+{
+  int answer;
+  struct re_search_2_closure closure;
+  closure.string1 = string1;
+  closure.size1 = size1;
+  closure.string2 = string2;
+  closure.size2 = size2;
+  answer = rx_search (rxb, startpos, range, stop, size1 + size2,
+		      re_search_2_get_burst,
+		      re_search_2_back_check,
+		      re_search_2_fetch_char,
+		      (void *)&closure,
+		      regs,
+		      0,
+		      0);
+  switch (answer)
+    {
+    case rx_search_continuation:
+      abort ();
+    case rx_search_error:
+      return -2;
+    case rx_search_soft_fail:
+    case rx_search_fail:
+      return -1;
+    default:
+      return answer;
+    }
+}
+
+/* Export rx_search to callers outside this file.  */
+
+int
+re_rx_search (rxb, startpos, range, stop, total_size,
+	      get_burst, back_check, fetch_char,
+	      app_closure, regs, resume_state, save_state)
+     struct re_pattern_buffer * rxb;
+     int startpos;
+     int range;
+     int stop;
+     int total_size;
+     rx_get_burst_fn get_burst;
+     rx_back_check_fn back_check;
+     rx_fetch_char_fn fetch_char;
+     void * app_closure;
+     struct re_registers * regs;
+     struct rx_search_state * resume_state;
+     struct rx_search_state * save_state;
+{
+  return rx_search (rxb, startpos, range, stop, total_size,
+		    get_burst, back_check, fetch_char, app_closure,
+		    regs, resume_state, save_state);
+}
+
+#if !defined(REGEX_MALLOC) && !defined(__GNUC__)
+#ifdef __STDC__
+int
+re_search_2 (struct re_pattern_buffer *rxb,
+	     __const__ char * string1, int size1,
+	     __const__ char * string2, int size2,
+	     int startpos, int range,
+	     struct re_registers *regs,
+	     int stop)
+#else
+int
+re_search_2 (rxb, string1, size1, string2, size2, startpos, range, regs, stop)
+     struct re_pattern_buffer *rxb;
+     __const__ char * string1;
+     int size1;
+     __const__ char * string2;
+     int size2;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+     int stop;
+#endif
+{
+  int ret;
+  ret = inner_re_search_2 (rxb, string1, size1, string2, size2, startpos,
+			   range, regs, stop);
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+  _alloca (0);
+#else
+  alloca (0);
+#endif
+  return ret;
+}
+#endif
+
+
+/* Like re_search_2, above, but only one string is specified, and
+ * doesn't let you say where to stop matching.
+ */
+
+#ifdef __STDC__
+int
+re_search (struct re_pattern_buffer * rxb, __const__ char *string,
+	   int size, int startpos, int range,
+	   struct re_registers *regs)
+#else
+int
+re_search (rxb, string, size, startpos, range, regs)
+     struct re_pattern_buffer * rxb;
+     __const__ char * string;
+     int size;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+#endif
+{
+  return re_search_2 (rxb, 0, 0, string, size, startpos, range, regs, size);
+}
+
+#ifdef __STDC__
+int
+re_match_2 (struct re_pattern_buffer * rxb,
+	    __const__ char * string1, int size1,
+	    __const__ char * string2, int size2,
+	    int pos, struct re_registers *regs, int stop)
+#else
+int
+re_match_2 (rxb, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer * rxb;
+     __const__ char * string1;
+     int size1;
+     __const__ char * string2;
+     int size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+#endif
+{
+  struct re_registers some_regs;
+  regoff_t start;
+  regoff_t end;
+  int srch;
+  int save = rxb->regs_allocated;
+  struct re_registers * regs_to_pass = regs;
+
+  if (!regs)
+    {
+      some_regs.start = &start;
+      some_regs.end = &end;
+      some_regs.num_regs = 1;
+      regs_to_pass = &some_regs;
+      rxb->regs_allocated = REGS_FIXED;
+    }
+
+  srch = re_search_2 (rxb, string1, size1, string2, size2,
+		      pos, 1, regs_to_pass, stop);
+  if (regs_to_pass != regs)
+    rxb->regs_allocated = save;
+  if (srch < 0)
+    return srch;
+  return regs_to_pass->end[0] - regs_to_pass->start[0];
+}
+
+/* re_match is like re_match_2 except it takes only a single string.  */
+
+#ifdef __STDC__
+int
+re_match (struct re_pattern_buffer * rxb,
+	  __const__ char * string,
+	  int size, int pos,
+	  struct re_registers *regs)
+#else
+int
+re_match (rxb, string, size, pos, regs)
+     struct re_pattern_buffer * rxb;
+     __const__ char *string;
+     int size;
+     int pos;
+     struct re_registers *regs;
+#endif
+{
+  return re_match_2 (rxb, string, size, 0, 0, pos, regs, size);
+}
+
+
+
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+#ifdef __STDC__
+reg_syntax_t
+re_set_syntax (reg_syntax_t syntax)
+#else
+reg_syntax_t
+re_set_syntax (syntax)
+    reg_syntax_t syntax;
+#endif
+{
+  reg_syntax_t ret = re_syntax_options;
+
+  re_syntax_options = syntax;
+  return ret;
+}
+
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+#ifdef __STDC__
+void
+re_set_registers (struct re_pattern_buffer *bufp,
+		  struct re_registers *regs,
+		  unsigned num_regs,
+		  regoff_t * starts, regoff_t * ends)
+#else
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+     struct re_pattern_buffer *bufp;
+     struct re_registers *regs;
+     unsigned num_regs;
+     regoff_t * starts;
+     regoff_t * ends;
+#endif
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = (regoff_t) 0;
+    }
+}
+
+
+
+
+
+#ifdef __STDC__
+static int 
+cplx_se_sublist_len (struct rx_se_list * list)
+#else
+static int 
+cplx_se_sublist_len (list)
+     struct rx_se_list * list;
+#endif
+{
+  int x = 0;
+  while (list)
+    {
+      if ((long)list->car >= 0)
+	++x;
+      list = list->cdr;
+    }
+  return x;
+}
+
+
+/* For rx->se_list_cmp */
+
+#ifdef __STDC__
+static int 
+posix_se_list_order (struct rx * rx,
+		     struct rx_se_list * a, struct rx_se_list * b)
+#else
+static int 
+posix_se_list_order (rx, a, b)
+     struct rx * rx;
+     struct rx_se_list * a;
+     struct rx_se_list * b;
+#endif
+{
+  int al = cplx_se_sublist_len (a);
+  int bl = cplx_se_sublist_len (b);
+
+  if (!al && !bl)
+    return ((a == b)
+	    ? 0
+	    : ((a < b) ? -1 : 1));
+  
+  else if (!al)
+    return -1;
+
+  else if (!bl)
+    return 1;
+
+  else
+    {
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+      rx_side_effect * av = ((rx_side_effect *)
+			     _alloca (sizeof (rx_side_effect) * (al + 1)));
+      rx_side_effect * bv = ((rx_side_effect *)
+			     _alloca (sizeof (rx_side_effect) * (bl + 1)));
+#else
+      rx_side_effect * av = ((rx_side_effect *)
+			     alloca (sizeof (rx_side_effect) * (al + 1)));
+      rx_side_effect * bv = ((rx_side_effect *)
+			     alloca (sizeof (rx_side_effect) * (bl + 1)));
+#endif
+      struct rx_se_list * ap = a;
+      struct rx_se_list * bp = b;
+      int ai, bi;
+      
+      for (ai = al - 1; ai >= 0; --ai)
+	{
+	  while ((long)ap->car < 0)
+	    ap = ap->cdr;
+	  av[ai] = ap->car;
+	  ap = ap->cdr;
+	}
+      av[al] = (rx_side_effect)-2;
+      for (bi = bl - 1; bi >= 0; --bi)
+	{
+	  while ((long)bp->car < 0)
+	    bp = bp->cdr;
+	  bv[bi] = bp->car;
+	  bp = bp->cdr;
+	}
+      bv[bl] = (rx_side_effect)-1;
+
+      {
+	int ret;
+	int x = 0;
+	while (av[x] == bv[x])
+	  ++x;
+ 	ret = (((unsigned *)(av[x]) < (unsigned *)(bv[x])) ? -1 : 1);
+	return ret;
+      }
+    }
+}
+
+
+
+
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length SIZE) and puts the result in RXB.
+   Returns 0 if the pattern was valid, otherwise an error string.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in RXB on entry.
+
+   We call rx_compile to do the actual compilation.  */
+
+#ifdef __STDC__
+__const__ char *
+re_compile_pattern (__const__ char *pattern,
+		    int length,
+		    struct re_pattern_buffer * rxb)
+#else
+__const__ char *
+re_compile_pattern (pattern, length, rxb)
+     __const__ char *pattern;
+     int length;
+     struct re_pattern_buffer * rxb;
+#endif
+{
+  reg_errcode_t ret;
+
+  /* GNU code is written to assume at least RE_NREGS registers will be set
+     (and at least one extra will be -1).  */
+  rxb->regs_allocated = REGS_UNALLOCATED;
+
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub.  */
+  rxb->no_sub = 0;
+
+  rxb->rx.local_cset_size = 256;
+
+  /* Match anchors at newline.  */
+  rxb->newline_anchor = 1;
+ 
+  rxb->re_nsub = 0;
+  rxb->start = 0;
+  rxb->se_params = 0;
+  rxb->rx.nodec = 0;
+  rxb->rx.epsnodec = 0;
+  rxb->rx.instruction_table = 0;
+  rxb->rx.nfa_states = 0;
+  rxb->rx.se_list_cmp = posix_se_list_order;
+  rxb->rx.start_set = 0;
+
+  ret = rx_compile (pattern, length, re_syntax_options, rxb);
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+  _alloca (0);
+#else
+  alloca (0);
+#endif
+  return rx_error_msg[(int) ret];
+}
+
+
+
+#ifdef __STDC__
+int
+re_compile_fastmap (struct re_pattern_buffer * rxb)
+#else
+int
+re_compile_fastmap (rxb)
+     struct re_pattern_buffer * rxb;
+#endif
+{
+  rx_blow_up_fastmap (rxb);
+  return 0;
+}
+
+
+
+
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them if this is an Emacs or POSIX compilation.  */
+
+#if (!defined (emacs) && !defined (_POSIX_SOURCE)) || defined(USE_BSD_REGEX)
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer rx_comp_buf;
+
+#ifdef __STDC__
+char *
+re_comp (__const__ char *s)
+#else
+char *
+re_comp (s)
+    __const__ char *s;
+#endif
+{
+  reg_errcode_t ret;
+
+  if (!s || (*s == '\0'))
+    {
+      if (!rx_comp_buf.buffer)
+	return "No previous regular expression";
+      return 0;
+    }
+
+  if (!rx_comp_buf.fastmap)
+    {
+      rx_comp_buf.fastmap = (char *) malloc (1 << CHARBITS);
+      if (!rx_comp_buf.fastmap)
+	return "Memory exhausted";
+    }
+
+  /* Since `rx_exec' always passes NULL for the `regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  rx_comp_buf.newline_anchor = 1;
+
+  rx_comp_buf.re_nsub = 0;
+  rx_comp_buf.start = 0;
+  rx_comp_buf.se_params = 0;
+  rx_comp_buf.rx.nodec = 0;
+  rx_comp_buf.rx.epsnodec = 0;
+  rx_comp_buf.rx.instruction_table = 0;
+  rx_comp_buf.rx.nfa_states = 0;
+  rx_comp_buf.rx.start = 0;
+  rx_comp_buf.rx.se_list_cmp = posix_se_list_order;
+  rx_comp_buf.rx.local_cset_size = 256;
+
+  ret = rx_compile (s, strlen (s), re_syntax_options, &rx_comp_buf);
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+  _alloca (0);
+#else
+  alloca (0);
+#endif
+
+  /* Yes, we're discarding `__const__' here.  */
+  return (char *) rx_error_msg[(int) ret];
+}
+
+
+#ifdef __STDC__
+int
+re_exec (__const__ char *s)
+#else
+int
+re_exec (s)
+    __const__ char *s;
+#endif
+{
+  __const__ int len = strlen (s);
+  return
+    0 <= re_search (&rx_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+}
+#endif /* not emacs and not _POSIX_SOURCE */
+
+
+
+
+/* POSIX.2 functions.  Don't define these for Emacs.  */
+
+#if !defined(emacs)
+
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' and `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+
+#ifdef __STDC__
+int
+regcomp (regex_t * preg, __const__ char * pattern, int cflags)
+#else
+int
+regcomp (preg, pattern, cflags)
+    regex_t * preg;
+    __const__ char * pattern;
+    int cflags;
+#endif
+{
+  reg_errcode_t ret;
+  unsigned syntax
+    = cflags & REG_EXTENDED ? RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+
+  /* regex_compile will allocate the space for the compiled pattern.  */
+  preg->buffer = 0;
+  preg->allocated = 0;
+  preg->fastmap = malloc (256);
+  if (!preg->fastmap)
+    return REG_ESPACE;
+  preg->fastmap_accurate = 0;
+
+  if (cflags & REG_ICASE)
+    {
+      unsigned i;
+
+      preg->translate = (unsigned char *) malloc (256);
+      if (!preg->translate)
+        return (int) REG_ESPACE;
+
+      /* Map uppercase characters to corresponding lowercase ones.  */
+      for (i = 0; i < CHAR_SET_SIZE; i++)
+        preg->translate[i] = isupper (i) ? tolower (i) : i;
+    }
+  else
+    preg->translate = 0;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+
+  preg->no_sub = !!(cflags & REG_NOSUB);
+
+  /* POSIX says a null character in the pattern terminates it, so we
+     can use strlen here in compiling the pattern.  */
+  preg->re_nsub = 0;
+  preg->start = 0;
+  preg->se_params = 0;
+  preg->syntax_parens = 0;
+  preg->rx.nodec = 0;
+  preg->rx.epsnodec = 0;
+  preg->rx.instruction_table = 0;
+  preg->rx.nfa_states = 0;
+  preg->rx.local_cset_size = 256;
+  preg->rx.start = 0;
+  preg->rx.se_list_cmp = posix_se_list_order;
+  preg->rx.start_set = 0;
+  ret = rx_compile (pattern, strlen (pattern), syntax, preg);
+
+#ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+  _alloca (0);
+#else
+  alloca (0);
+#endif
+
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN) ret = REG_EPAREN;
+
+  return (int) ret;
+}
+
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+#ifdef __STDC__
+int
+regexec (__const__ regex_t *preg, __const__ char *string,
+	 size_t nmatch, regmatch_t pmatch[],
+	 int eflags)
+#else
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+    __const__ regex_t *preg;
+    __const__ char *string;
+    size_t nmatch;
+    regmatch_t pmatch[];
+    int eflags;
+#endif
+{
+  int ret;
+  struct re_registers regs;
+  regex_t private_preg;
+  int len = strlen (string);
+  boolean want_reg_info = !preg->no_sub && nmatch > 0;
+
+  private_preg = *preg;
+
+  private_preg.not_bol = !!(eflags & REG_NOTBOL);
+  private_preg.not_eol = !!(eflags & REG_NOTEOL);
+
+  /* The user has told us exactly how many registers to return
+   * information about, via `nmatch'.  We have to pass that on to the
+   * matching routines.
+   */
+  private_preg.regs_allocated = REGS_FIXED;
+
+  if (want_reg_info)
+    {
+      regs.num_regs = nmatch;
+      regs.start =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
+      regs.end =  (( regoff_t *) malloc ((nmatch) * sizeof ( regoff_t)));
+      if (regs.start == 0 || regs.end == 0)
+        return (int) REG_NOMATCH;
+    }
+
+  /* Perform the searching operation.  */
+  ret = re_search (&private_preg,
+		   string, len,
+                   /* start: */ 0,
+		   /* range: */ len,
+                   want_reg_info ? &regs : (struct re_registers *) 0);
+
+  /* Copy the register information to the POSIX structure.  */
+  if (want_reg_info)
+    {
+      if (ret >= 0)
+        {
+          unsigned r;
+
+          for (r = 0; r < nmatch; r++)
+            {
+              pmatch[r].rm_so = regs.start[r];
+              pmatch[r].rm_eo = regs.end[r];
+            }
+        }
+
+      /* If we needed the temporary register info, free the space now.  */
+      free (regs.start);
+      free (regs.end);
+    }
+
+  /* We want zero return to mean success, unlike `re_search'.  */
+  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+}
+
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   */
+
+#ifdef __STDC__
+size_t
+regerror (int errcode, __const__ regex_t *preg,
+	  char *errbuf, size_t errbuf_size)
+#else
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+    int errcode;
+    __const__ regex_t *preg;
+    char *errbuf;
+    size_t errbuf_size;
+#endif
+{
+  __const__ char *msg
+    = rx_error_msg[errcode] == 0 ? "Success" : rx_error_msg[errcode];
+  size_t msg_size = strlen (msg) + 1; /* Includes the 0.  */
+
+  if (errbuf_size != 0)
+    {
+      if (msg_size > errbuf_size)
+        {
+          strncpy (errbuf, msg, errbuf_size - 1);
+          errbuf[errbuf_size - 1] = 0;
+        }
+      else
+        strcpy (errbuf, msg);
+    }
+
+  return msg_size;
+}
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+#ifdef __STDC__
+void
+regfree (regex_t *preg)
+#else
+void
+regfree (preg)
+    regex_t *preg;
+#endif
+{
+  if (preg->buffer != 0)
+    free (preg->buffer);
+  preg->buffer = 0;
+  preg->allocated = 0;
+
+  if (preg->fastmap != 0)
+    free (preg->fastmap);
+  preg->fastmap = 0;
+  preg->fastmap_accurate = 0;
+
+  if (preg->translate != 0)
+    free (preg->translate);
+  preg->translate = 0;
+}
+
+#endif /* not emacs  */
+
+
+
+
+
Index: /main/tags/2.38/gsdl/packages/mg/lib/rx.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/rx.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/rx.h	(revision 21083)
@@ -0,0 +1,3755 @@
+#if !defined(RXH) || defined(RX_WANT_SE_DEFS)
+#define RXH
+
+/*	Copyright (C) 1992, 1993 Free Software Foundation, Inc.
+
+This file is part of the librx library.
+
+Librx 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, or (at your option)
+any later version.
+
+Librx 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 this software; see the file COPYING.LIB.  If not,
+write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA
+02139, USA.  */
+/*  t. lord	Wed Sep 23 18:20:57 1992	*/
+
+
+
+
+
+
+
+
+
+#ifndef RX_WANT_SE_DEFS
+
+/* This page: Bitsets */
+
+#ifndef RX_subset
+typedef unsigned int RX_subset;
+#define RX_subset_bits	(32)
+#define RX_subset_mask	(RX_subset_bits - 1)
+#endif
+
+typedef RX_subset * rx_Bitset;
+
+#ifdef __STDC__
+typedef void (*rx_bitset_iterator) (void *, int member_index);
+#else
+typedef void (*rx_bitset_iterator) ();
+#endif
+
+#define rx_bitset_subset(N)  ((N) / RX_subset_bits)
+#define rx_bitset_subset_val(B,N)  ((B)[rx_bitset_subset(N)])
+#define RX_bitset_access(B,N,OP) \
+  ((B)[rx_bitset_subset(N)] OP rx_subset_singletons[(N) & RX_subset_mask])
+#define RX_bitset_member(B,N)   RX_bitset_access(B, N, &)
+#define RX_bitset_enjoin(B,N)   RX_bitset_access(B, N, |=)
+#define RX_bitset_remove(B,N)   RX_bitset_access(B, N, &= ~)
+#define RX_bitset_toggle(B,N)   RX_bitset_access(B, N, ^= )
+#define rx_bitset_numb_subsets(N) (((N) + RX_subset_bits - 1) / RX_subset_bits)
+#define rx_sizeof_bitset(N)	(rx_bitset_numb_subsets(N) * sizeof(RX_subset))
+
+
+
+
+/* This page: Splay trees. */
+
+#ifdef __STDC__
+typedef int (*rx_sp_comparer) (void * a, void * b);
+#else
+typedef int (*rx_sp_comparer) ();
+#endif
+
+struct rx_sp_node 
+{
+  void * key;
+  void * data;
+  struct rx_sp_node * kids[2];
+};
+
+#ifdef __STDC__
+typedef void (*rx_sp_key_data_freer) (struct rx_sp_node *);
+#else
+typedef void (*rx_sp_key_data_freer) ();
+#endif
+
+
+
+/* giant inflatable hash trees */
+
+struct rx_hash_item
+{
+  struct rx_hash_item * next_same_hash;
+  struct rx_hash * table;
+  unsigned long hash;
+  void * data;
+  void * binding;
+};
+
+struct rx_hash
+{
+  struct rx_hash * parent;
+  int refs;
+  struct rx_hash * children[13];
+  struct rx_hash_item * buckets [13];
+  int bucket_size [13];
+};
+
+struct rx_hash_rules;
+
+#ifdef __STDC__
+/* should return like == */
+typedef int (*rx_hash_eq)(void *, void *);
+typedef struct rx_hash * (*rx_alloc_hash)(struct rx_hash_rules *);
+typedef void (*rx_free_hash)(struct rx_hash *,
+			    struct rx_hash_rules *);
+typedef struct rx_hash_item * (*rx_alloc_hash_item)(struct rx_hash_rules *,
+						    void *);
+typedef void (*rx_free_hash_item)(struct rx_hash_item *,
+				 struct rx_hash_rules *);
+#else
+typedef int (*rx_hash_eq)();
+typedef struct rx_hash * (*rx_alloc_hash)();
+typedef void (*rx_free_hash)();
+typedef struct rx_hash_item * (*rx_alloc_hash_item)();
+typedef void (*rx_free_hash_item)();
+#endif
+
+struct rx_hash_rules
+{
+  rx_hash_eq eq;
+  rx_alloc_hash hash_alloc;
+  rx_free_hash free_hash;
+  rx_alloc_hash_item hash_item_alloc;
+  rx_free_hash_item free_hash_item;
+};
+
+
+
+/* Forward declarations */
+
+struct rx_cache;
+struct rx_superset;
+struct rx;
+struct rx_se_list;
+
+
+
+
+/* 
+ * GLOSSARY
+ *
+ * regexp
+ * regular expression
+ * expression
+ * pattern - a `regular' expression.  The expression
+ *       need not be formally regular -- it can contain
+ *       constructs that don't correspond to purely regular
+ *       expressions.
+ *
+ * buffer
+ * string - the string (or strings) being searched or matched.
+ *
+ * pattern buffer - a structure of type `struct re_pattern_buffer'
+ *       This in turn contains a `struct rx', which holds the
+ *       NFA compiled from a pattern, as well as some of the state
+ *       of a matcher using the pattern.
+ *
+ * NFA - nondeterministic finite automata.  Some people
+ *       use this term to a member of the class of 
+ *       regular automata (those corresponding to a regular
+ *       language).  However, in this code, the meaning is
+ *       more general.  The automata used by Rx are comperable
+ *       in power to what are usually called `push down automata'.
+ *
+ *       Two NFA are built by rx for every pattern.  One is built
+ *       by the compiler.  The other is built from the first, on
+ *       the fly, by the matcher.  The latter is called the `superstate
+ *       NFA' because its states correspond to sets of states from
+ *       the first NFA.  (Joe Keane gets credit for the name
+ *       `superstate NFA').
+ *
+ * NFA edges
+ * epsilon edges
+ * side-effect edges - The NFA compiled from a pattern can have three
+ *       kinds of edges.  Epsilon edges can be taken freely anytime
+ *       their source state is reached.  Character set edges can be
+ *       taken when their source state is reached and when the next 
+ *       character in the buffer is a member of the set.  Side effect
+ *       edges imply a transition that can only be taken after the
+ *       indicated side effect has been successfully accomplished.
+ *       Some examples of side effects are:
+ *
+ *		Storing the current match position to record the
+ *              location of a parentesized subexpression.
+ *
+ *              Advancing the matcher over N characters if they
+ *              match the N characters previously matched by a 
+ *              parentesized subexpression.
+ *
+ *       Both of those kinds of edges occur in the NFA generated
+ *       by the pattern:  \(.\)\1
+ *
+ *       Epsilon and side effect edges are similar.  Unfortunately,
+ *       some of the code uses the name `epsilon edge' to mean
+ *       both epsilon and side effect edges.  For example,  the
+ *       function has_non_idempotent_epsilon_path computes the existance
+ *       of a non-trivial path containing only a mix of epsilon and
+ *       side effect edges.  In that case `nonidempotent epsilon' is being
+ *       used to mean `side effect'.
+ */
+
+
+
+
+
+
+/* LOW LEVEL PATTERN BUFFERS */
+
+/* Suppose that from some NFA state, more than one path through
+ * side-effect edges is possible.  In what order should the paths
+ * be tried?  A function of type rx_se_list_order answers that
+ * question.  It compares two lists of side effects, and says
+ * which list comes first.
+ */
+ 
+#ifdef __STDC__
+typedef int (*rx_se_list_order) (struct rx *,
+				 struct rx_se_list *, 
+				 struct rx_se_list *);
+#else
+typedef int (*rx_se_list_order) ();
+#endif
+
+
+
+/* Struct RX holds a compiled regular expression - that is, an nfa
+ * ready to be converted on demand to a more efficient superstate nfa.
+ * This is for the low level interface.  The high-level interfaces enclose
+ * this in a `struct re_pattern_buffer'.  
+ */
+struct rx
+{
+  /* The compiler assigns a unique id to every pattern.
+   * Like sequence numbers in X, there is a subtle bug here
+   * if you use Rx in a system that runs for a long time.
+   * But, because of the way the caches work out, it is almost
+   * impossible to trigger the Rx version of this bug.
+   *
+   * The id is used to validate superstates found in a cache
+   * of superstates.  It isn't sufficient to let a superstate
+   * point back to the rx for which it was compiled -- the caller
+   * may be re-using a `struct rx' in which case the superstate
+   * is not really valid.  So instead, superstates are validated
+   * by checking the sequence number of the pattern for which
+   * they were built.
+   */
+  int rx_id;
+
+  /* This is memory mgt. state for superstates.  This may be 
+   * shared by more than one struct rx.
+   */
+  struct rx_cache * cache;
+
+  /* Every regex defines the size of its own character set. 
+   * A superstate has an array of this size, with each element
+   * a `struct rx_inx'.  So, don't make this number too large.
+   * In particular, don't make it 2^16.
+   */
+  int local_cset_size;
+
+  /* After the NFA is built, it is copied into a contiguous region
+   * of memory (mostly for compatability with GNU regex).
+   * Here is that region, and it's size:
+   */
+  void * buffer;
+  unsigned long allocated;
+
+  /* Clients of RX can ask for some extra storage in the space pointed
+   * to by BUFFER.  The field RESERVED is an input parameter to the
+   * compiler.  After compilation, this much space will be available 
+   * at (buffer + allocated - reserved)
+   */
+  unsigned long reserved;
+
+  /* --------- The remaining fields are for internal use only. --------- */
+  /* --------- But! they must be initialized to 0.	       --------- */
+
+  /* NODEC is the number of nodes in the NFA with non-epsilon
+   * transitions. 
+   */
+  int nodec;
+
+  /* EPSNODEC is the number of nodes with only epsilon transitions. */
+  int epsnodec;
+
+  /* The sum (NODEC + EPSNODEC) is the total number of states in the
+   * compiled NFA.
+   */
+
+  /* Lists of side effects as stored in the NFA are `hash consed'..meaning
+   * that lists with the same elements are ==.  During compilation, 
+   * this table facilitates hash-consing.
+   */
+  struct rx_hash se_list_memo;
+
+  /* Lists of NFA states are also hashed. 
+   */
+  struct rx_hash set_list_memo;
+
+
+
+
+  /* The compiler and matcher must build a number of instruction frames.
+   * The format of these frames is fixed (c.f. struct rx_inx).  The values
+   * of the instructions is not fixed.
+   *
+   * An enumerated type (enum rx_opcode) defines the set of instructions
+   * that the compiler or matcher might generate.  When filling an instruction
+   * frame, the INX field is found by indexing this instruction table
+   * with an opcode:
+   */
+  void ** instruction_table;
+
+  /* The list of all states in an NFA.
+   * During compilation, the NEXT field of NFA states links this list.
+   * After compilation, all the states are compacted into an array,
+   * ordered by state id numbers.  At that time, this points to the base 
+   * of that array.
+   */
+  struct rx_nfa_state *nfa_states;
+
+  /* Every nfa begins with one distinguished starting state:
+   */
+  struct rx_nfa_state *start;
+
+  /* This orders the search through super-nfa paths.
+   * See the comment near the typedef of rx_se_list_order.
+   */
+  rx_se_list_order se_list_cmp;
+
+  struct rx_superset * start_set;
+};
+
+
+
+
+
+/* SYNTAX TREES */
+
+/* Compilation is in stages.  
+ *
+ * In the first stage, a pattern specified by a string is 
+ * translated into a syntax tree.  Later stages will convert
+ * the syntax tree into an NFA optimized for conversion to a
+ * superstate-NFA.
+ *
+ * This page is about syntax trees.
+ */
+
+enum rexp_node_type
+{
+  r_cset,			/* Match from a character set. `a' or `[a-z]'*/
+  r_concat,			/* Concat two subexpressions.   `ab' */
+  r_alternate,			/* Choose one of two subexpressions. `a\|b' */
+  r_opt,			/* Optional subexpression. `a?' */
+  r_star,			/* Repeated subexpression. `a*' */
+
+
+  /* A 2phase-star is a variation on a repeated subexpression.
+   * In this case, there are two subexpressions.  The first, if matched,
+   * begins a repitition (otherwise, the whole expression is matches the
+   * empth string).  
+   * 
+   * After matching the first subexpression, a 2phase star either finishes,
+   * or matches the second subexpression.  If the second subexpression is
+   * matched, then the whole construct repeats.
+   *
+   * 2phase stars are used in two circumstances.  First, they
+   * are used as part of the implementation of POSIX intervals (counted
+   * repititions).  Second, they are used to implement proper star
+   * semantics when the repeated subexpression contains paths of
+   * only side effects.  See rx_compile for more information.
+   */
+  r_2phase_star,
+
+
+  /* c.f. "typedef void * rx_side_effect" */
+  r_side_effect,
+
+  /* This is an extension type:  It is for transient use in source->source
+   * transformations (implemented over syntax trees).
+   */
+  r_data
+};
+
+/* A side effect is a matcher-specific action associated with
+ * transitions in the NFA.  The details of side effects are up
+ * to the matcher.  To the compiler and superstate constructors
+ * side effects are opaque:
+ */
+
+typedef void * rx_side_effect;
+
+/* Nodes in a syntax tree are of this type:
+ */
+struct rexp_node
+{
+  enum rexp_node_type type;
+  union
+  {
+    rx_Bitset cset;
+    rx_side_effect side_effect;
+    struct
+      {
+	struct rexp_node *left;
+	struct rexp_node *right;
+      } pair;
+    void * data;
+  } params;
+};
+
+
+
+
+/* NFA
+ *
+ * A syntax tree is compiled into an NFA.  This page defines the structure
+ * of that NFA.
+ */
+
+struct rx_nfa_state
+{
+  /* These are kept in a list as the NFA is being built. */
+  struct rx_nfa_state *next;
+
+  /* After the NFA is built, states are given integer id's.
+   * States whose outgoing transitions are all either epsilon or 
+   * side effect edges are given ids less than 0.  Other states
+   * are given successive non-negative ids starting from 0.
+   */
+  int id;
+
+  /* The list of NFA edges that go from this state to some other. */
+  struct rx_nfa_edge *edges;
+
+  /* If you land in this state, then you implicitly land
+   * in all other states reachable by only epsilon translations.
+   * Call the set of maximal paths to such states the epsilon closure
+   * of this state.
+   *
+   * There may be other states that are reachable by a mixture of
+   * epsilon and side effect edges.  Consider the set of maximal paths
+   * of that sort from this state.  Call it the epsilon-side-effect
+   * closure of the state.
+   * 
+   * The epsilon closure of the state is a subset of the epsilon-side-
+   * effect closure.  It consists of all the paths that contain 
+   * no side effects -- only epsilon edges.
+   * 
+   * The paths in the epsilon-side-effect closure  can be partitioned
+   * into equivalance sets. Two paths are equivalant if they have the
+   * same set of side effects, in the same order.  The epsilon-closure
+   * is one of these equivalance sets.  Let's call these equivalance
+   * sets: observably equivalant path sets.  That name is chosen
+   * because equivalance of two paths means they cause the same side
+   * effects -- so they lead to the same subsequent observations other
+   * than that they may wind up in different target states.
+   *
+   * The superstate nfa, which is derived from this nfa, is based on
+   * the observation that all of the paths in an observably equivalant
+   * path set can be explored at the same time, provided that the
+   * matcher keeps track not of a single nfa state, but of a set of
+   * states.   In particular, after following all the paths in an
+   * observably equivalant set, you wind up at a set of target states.
+   * That set of target states corresponds to one state in the
+   * superstate NFA.
+   *
+   * Staticly, before matching begins, it is convenient to analyze the
+   * nfa.  Each state is labeled with a list of the observably
+   * equivalant path sets who's union covers all the
+   * epsilon-side-effect paths beginning in this state.  This list is
+   * called the possible futures of the state.
+   *
+   * A trivial example is this NFA:
+   *             s1
+   *         A  --->  B
+   *
+   *             s2  
+   *            --->  C
+   *
+   *             epsilon           s1
+   *            --------->  D   ------> E
+   * 
+   * 
+   * In this example, A has two possible futures.
+   * One invokes the side effect `s1' and contains two paths,
+   * one ending in state B, the other in state E.
+   * The other invokes the side effect `s2' and contains only
+   * one path, landing in state C.
+   */
+  struct rx_possible_future *futures;
+
+
+  /* There are exactly two distinguished states in every NFA: */
+  unsigned int is_final:1;
+  unsigned int is_start:1;
+
+  /* These are used during NFA construction... */
+  unsigned int eclosure_needed:1;
+  unsigned int mark:1;
+};
+
+
+/* An edge in an NFA is typed: */
+enum rx_nfa_etype
+{
+  /* A cset edge is labled with a set of characters one of which
+   * must be matched for the edge to be taken.
+   */
+  ne_cset,
+
+  /* An epsilon edge is taken whenever its starting state is
+   * reached. 
+   */
+  ne_epsilon,
+
+  /* A side effect edge is taken whenever its starting state is
+   * reached.  Side effects may cause the match to fail or the
+   * position of the matcher to advance.
+   */
+  ne_side_effect		/* A special kind of epsilon. */
+};
+
+struct rx_nfa_edge
+{
+  struct rx_nfa_edge *next;
+  enum rx_nfa_etype type;
+  struct rx_nfa_state *dest;
+  union
+  {
+    rx_Bitset cset;
+    rx_side_effect side_effect;
+  } params;
+};
+
+
+
+/* A possible future consists of a list of side effects
+ * and a set of destination states.  Below are their
+ * representations.  These structures are hash-consed which
+ * means that lists with the same elements share a representation
+ * (their addresses are ==).
+ */
+
+struct rx_nfa_state_set
+{
+  struct rx_nfa_state * car;
+  struct rx_nfa_state_set * cdr;
+};
+
+struct rx_se_list
+{
+  rx_side_effect car;
+  struct rx_se_list * cdr;
+};
+
+struct rx_possible_future
+{
+  struct rx_possible_future *next;
+  struct rx_se_list * effects;
+  struct rx_nfa_state_set * destset;
+};
+
+
+
+
+/* This begins the description of the superstate NFA.
+ *
+ * The superstate NFA corresponds to the NFA in these ways:
+ *
+ * Every superstate NFA states SUPER correspond to sets of NFA states,
+ * nfa_states(SUPER).
+ *
+ * Superstate edges correspond to NFA paths.
+ *
+ * The superstate has no epsilon transitions;
+ * every edge has a character label, and a (possibly empty) side
+ * effect label.   The side effect label corresponds to a list of
+ * side effects that occur in the NFA.  These parts are referred
+ * to as:   superedge_character(EDGE) and superedge_sides(EDGE).
+ *
+ * For a superstate edge EDGE starting in some superstate SUPER,
+ * the following is true (in pseudo-notation :-):
+ *
+ *       exists DEST in nfa_states s.t. 
+ *         exists nfaEDGE in nfa_edges s.t.
+ *                 origin (nfaEDGE) == DEST
+ *              && origin (nfaEDGE) is a member of nfa_states(SUPER)
+ *              && exists PF in possible_futures(dest(nfaEDGE)) s.t.
+ * 	                sides_of_possible_future (PF) == superedge_sides (EDGE)
+ *
+ * also:
+ *
+ *      let SUPER2 := superedge_destination(EDGE)
+ *          nfa_states(SUPER2)
+ *           == union of all nfa state sets S s.t.
+ *                          exists PF in possible_futures(dest(nfaEDGE)) s.t.
+ * 	                       sides_of_possible_future (PF) == superedge_sides (EDGE)
+ *                          && S == dests_of_possible_future (PF) }
+ *
+ * Or in english, every superstate is a set of nfa states.  A given
+ * character and a superstate implies many transitions in the NFA --
+ * those that begin with an edge labeled with that character from a
+ * state in the set corresponding to the superstate.
+ * 
+ * The destinations of those transitions each have a set of possible
+ * futures.  A possible future is a list of side effects and a set of
+ * destination NFA states.  Two sets of possible futures can be
+ * `merged' by combining all pairs of possible futures that have the
+ * same side effects.  A pair is combined by creating a new future
+ * with the same side effect but the union of the two destination sets.
+ * In this way, all the possible futures suggested by a superstate
+ * and a character can be merged into a set of possible futures where
+ * no two elements of the set have the same set of side effects.
+ *
+ * The destination of a possible future, being a set of NFA states, 
+ * corresponds to a supernfa state.  So, the merged set of possible
+ * futures we just created can serve as a set of edges in the
+ * supernfa.
+ *
+ * The representation of the superstate nfa and the nfa is critical.
+ * The nfa has to be compact, but has to facilitate the rapid
+ * computation of missing superstates.  The superstate nfa has to 
+ * be fast to interpret, lazilly constructed, and bounded in space.
+ *
+ * To facilitate interpretation, the superstate data structures are 
+ * peppered with `instruction frames'.  There is an instruction set
+ * defined below which matchers using the supernfa must be able to
+ * interpret.
+ *
+ * We'd like to make it possible but not mandatory to use code
+ * addresses to represent instructions (c.f. gcc's computed goto).
+ * Therefore, we define an enumerated type of opcodes, and when
+ * writing one of these instructions into a data structure, use
+ * the opcode as an index into a table of instruction values.
+ * 
+ * Here are the opcodes that occur in the superstate nfa:
+ */
+ 
+
+/* Every superstate contains a table of instruction frames indexed 
+ * by characters.  A normal `move' in a matcher is to fetch the next
+ * character and use it as an index into a superstates transition
+ * table.
+ *
+ * In the fasted case, only one edge follows from that character.
+ * In other cases there is more work to do.
+ * 
+ * The descriptions of the opcodes refer to data structures that are
+ * described further below. 
+ */
+
+enum rx_opcode
+{
+  /* 
+   * BACKTRACK_POINT is invoked when a character transition in 
+   * a superstate leads to more than one edge.  In that case,
+   * the edges have to be explored independently using a backtracking
+   * strategy.
+   *
+   * A BACKTRACK_POINT instruction is stored in a superstate's 
+   * transition table for some character when it is known that that
+   * character crosses more than one edge.  On encountering this
+   * instruction, the matcher saves enough state to backtrack to this
+   * point in the match later.
+   */
+  rx_backtrack_point = 0,	/* data is (struct transition_class *) */
+
+  /* 
+   * RX_DO_SIDE_EFFECTS evaluates the side effects of an epsilon path.
+   * There is one occurence of this instruction per rx_distinct_future.
+   * This instruction is skipped if a rx_distinct_future has no side effects.
+   */
+  rx_do_side_effects = rx_backtrack_point + 1,
+
+  /* data is (struct rx_distinct_future *) */
+
+  /* 
+   * RX_CACHE_MISS instructions are stored in rx_distinct_futures whose
+   * destination superstate has been reclaimed (or was never built).
+   * It recomputes the destination superstate.
+   * RX_CACHE_MISS is also stored in a superstate transition table before
+   * any of its edges have been built.
+   */
+  rx_cache_miss = rx_do_side_effects + 1,
+  /* data is (struct rx_distinct_future *) */
+
+  /* 
+   * RX_NEXT_CHAR is called to consume the next character and take the
+   * corresponding transition.  This is the only instruction that uses 
+   * the DATA field of the instruction frame instead of DATA_2.
+   * (see EXPLORE_FUTURE in regex.c).
+   */
+  rx_next_char = rx_cache_miss + 1, /* data is (struct superstate *) */
+
+  /* RX_BACKTRACK indicates that a transition fails.
+   */
+  rx_backtrack = rx_next_char + 1, /* no data */
+
+  /* 
+   * RX_ERROR_INX is stored only in places that should never be executed.
+   */
+  rx_error_inx = rx_backtrack + 1, /* Not supposed to occur. */
+
+  rx_num_instructions = rx_error_inx + 1
+};
+
+/* An id_instruction_table holds the values stored in instruction
+ * frames.  The table is indexed by the enums declared above.
+ */
+extern void * rx_id_instruction_table[rx_num_instructions];
+
+/* The heart of the matcher is a `word-code-interpreter' 
+ * (like a byte-code interpreter, except that instructions
+ * are a full word wide).
+ *
+ * Instructions are not stored in a vector of code, instead,
+ * they are scattered throughout the data structures built
+ * by the regexp compiler and the matcher.  One word-code instruction,
+ * together with the arguments to that instruction, constitute
+ * an instruction frame (struct rx_inx).
+ *
+ * This structure type is padded by hand to a power of 2 because
+ * in one of the dominant cases, we dispatch by indexing a table
+ * of instruction frames.  If that indexing can be accomplished
+ * by just a shift of the index, we're happy.
+ *
+ * Instructions take at most one argument, but there are two
+ * slots in an instruction frame that might hold that argument.
+ * These are called data and data_2.  The data slot is only
+ * used for one instruction (RX_NEXT_CHAR).  For all other 
+ * instructions, data should be set to 0.
+ *
+ * RX_NEXT_CHAR is the most important instruction by far.
+ * By reserving the data field for its exclusive use, 
+ * instruction dispatch is sped up in that case.  There is
+ * no need to fetch both the instruction and the data,
+ * only the data is needed.  In other words, a `cycle' begins
+ * by fetching the field data.  If that is non-0, then it must
+ * be the destination state of a next_char transition, so
+ * make that value the current state, advance the match position
+ * by one character, and start a new cycle.  On the other hand,
+ * if data is 0, fetch the instruction and do a more complicated
+ * dispatch on that.
+ */
+
+struct rx_inx 
+{
+  void * data;
+  void * data_2;
+  void * inx;
+  void * fnord;
+};
+
+#ifndef RX_TAIL_ARRAY
+#define RX_TAIL_ARRAY  1
+#endif
+
+/* A superstate corresponds to a set of nfa states.  Those sets are
+ * represented by STRUCT RX_SUPERSET.  The constructors
+ * guarantee that only one (shared) structure is created for a given set.
+ */
+struct rx_superset
+{
+  int refs;			/* This is a reference counted structure. */
+
+  /* We keep these sets in a cache because (in an unpredictable way),
+   * the same set is often created again and again.  But that is also
+   * problematic -- compatibility with POSIX and GNU regex requires
+   * that we not be able to tell when a program discards a particular
+   * NFA (thus invalidating the supersets created from it).
+   *
+   * But when a cache hit appears to occur, we will have in hand the
+   * nfa for which it may have happened.  That is why every nfa is given
+   * its own sequence number.  On a cache hit, the cache is validated
+   * by comparing the nfa sequence number to this field:
+   */
+  int id;
+
+  struct rx_nfa_state * car;	/* May or may not be a valid addr. */
+  struct rx_superset * cdr;
+
+  /* If the corresponding superstate exists: */
+  struct rx_superstate * superstate;
+
+
+  /* There is another bookkeeping problem.  It is expensive to 
+   * compute the starting nfa state set for an nfa.  So, once computed,
+   * it is cached in the `struct rx'.
+   *
+   * But, the state set can be flushed from the superstate cache.
+   * When that happens, we can't know if the corresponding `struct rx'
+   * is still alive or if it has been freed or re-used by the program.
+   * So, the cached pointer to this set in a struct rx might be invalid
+   * and we need a way to validate it.
+   *
+   * Fortunately, even if this set is flushed from the cache, it is
+   * not freed.  It just goes on the free-list of supersets.
+   * So we can still examine it.  
+   *
+   * So to validate a starting set memo, check to see if the
+   * starts_for field still points back to the struct rx in question,
+   * and if the ID matches the rx sequence number.
+   */
+  struct rx * starts_for;
+
+  /* This is used to link into a hash bucket so these objects can
+   * be `hash-consed'.
+   */
+  struct rx_hash_item hash_item;
+};
+
+#define rx_protect_superset(RX,CON) (++(CON)->refs)
+
+/* The terminology may be confusing (rename this structure?).
+ * Every character occurs in at most one rx_super_edge per super-state.
+ * But, that structure might have more than one option, indicating a point
+ * of non-determinism. 
+ *
+ * In other words, this structure holds a list of superstate edges
+ * sharing a common starting state and character label.  The edges
+ * are in the field OPTIONS.  All superstate edges sharing the same
+ * starting state and character are in this list.
+ */
+struct rx_super_edge
+{
+  struct rx_super_edge *next;
+  struct rx_inx rx_backtrack_frame;
+  int cset_size;
+  rx_Bitset cset;
+  struct rx_distinct_future *options;
+};
+
+/* A superstate is a set of nfa states (RX_SUPERSET) along
+ * with a transition table.  Superstates are built on demand and reclaimed
+ * without warning.  To protect a superstate from this ghastly fate,
+ * use LOCK_SUPERSTATE. 
+ */
+struct rx_superstate
+{
+  int rx_id;			/* c.f. the id field of rx_superset */
+  int locks;			/* protection from reclamation */
+
+  /* Within a superstate cache, all the superstates are kept in a big
+   * queue.  The tail of the queue is the state most likely to be
+   * reclaimed.  The *recyclable fields hold the queue position of 
+   * this state.
+   */
+  struct rx_superstate * next_recyclable;
+  struct rx_superstate * prev_recyclable;
+
+  /* The supernfa edges that exist in the cache and that have
+   * this state as their destination are kept in this list:
+   */
+  struct rx_distinct_future * transition_refs;
+
+  /* The list of nfa states corresponding to this superstate: */
+  struct rx_superset * contents;
+
+  /* The list of edges in the cache beginning from this state. */
+  struct rx_super_edge * edges;
+
+  /* A tail of the recyclable queue is marked as semifree.  A semifree
+   * state has no incoming next_char transitions -- any transition
+   * into a semifree state causes a complex dispatch with the side
+   * effect of rescuing the state from its semifree state.
+   *
+   * An alternative to this might be to make next_char more expensive,
+   * and to move a state to the head of the recyclable queue whenever
+   * it is entered.  That way, popular states would never be recycled.
+   *
+   * But unilaterally making next_char more expensive actually loses.
+   * So, incoming transitions are only made expensive for states near
+   * the tail of the recyclable queue.  The more cache contention
+   * there is, the more frequently a state will have to prove itself
+   * and be moved back to the front of the queue.  If there is less 
+   * contention, then popular states just aggregate in the front of 
+   * the queue and stay there.
+   */
+  int is_semifree;
+
+
+  /* This keeps track of the size of the transition table for this
+   * state.  There is a half-hearted attempt to support variable sized
+   * superstates.
+   */
+  int trans_size;
+
+  /* Indexed by characters... */
+  struct rx_inx transitions[RX_TAIL_ARRAY];
+};
+
+
+/* A list of distinct futures define the edges that leave from a 
+ * given superstate on a given character.  c.f. rx_super_edge.
+ */
+
+struct rx_distinct_future
+{
+  struct rx_distinct_future * next_same_super_edge[2];
+  struct rx_distinct_future * next_same_dest;
+  struct rx_distinct_future * prev_same_dest;
+  struct rx_superstate * present;	/* source state */
+  struct rx_superstate * future;	/* destination state */
+  struct rx_super_edge * edge;
+
+
+  /* The future_frame holds the instruction that should be executed
+   * after all the side effects are done, when it is time to complete
+   * the transition to the next state.
+   *
+   * Normally this is a next_char instruction, but it may be a
+   * cache_miss instruction as well, depending on whether or not
+   * the superstate is in the cache and semifree.
+   * 
+   * If this is the only future for a given superstate/char, and
+   * if there are no side effects to be performed, this frame is
+   * not used (directly) at all.  Instead, its contents are copied
+   * into the transition table of the starting state of this dist. future.
+   */
+  struct rx_inx future_frame;
+
+  struct rx_inx side_effects_frame;
+  struct rx_se_list * effects;
+};
+
+#define rx_lock_superstate(R,S)  ((S)->locks++)
+#define rx_unlock_superstate(R,S) (--(S)->locks)
+
+
+
+/* This page destined for rx.h */
+
+struct rx_blocklist
+{
+  struct rx_blocklist * next;
+  int bytes;
+};
+
+struct rx_freelist
+{
+  struct rx_freelist * next;
+};
+
+struct rx_cache;
+
+#ifdef __STDC__
+typedef void (*rx_morecore_fn)(struct rx_cache *);
+#else
+typedef void (*rx_morecore_fn)();
+#endif
+
+/* You use this to control the allocation of superstate data 
+ * during matching.  Most of it should be initialized to 0.
+ *
+ * A MORECORE function is necessary.  It should allocate
+ * a new block of memory or return 0.
+ * A default that uses malloc is called `rx_morecore'.
+ *
+ * The number of SUPERSTATES_ALLOWED indirectly limits how much memory
+ * the system will try to allocate.  The default is 128.  Batch style
+ * applications that are very regexp intensive should use as high a number
+ * as possible without thrashing.
+ * 
+ * The LOCAL_CSET_SIZE is the number of characters in a character set.
+ * It is therefore the number of entries in a superstate transition table.
+ * Generally, it should be 256.  If your character set has 16 bits, 
+ * it is better to translate your regexps into equivalent 8 bit patterns.
+ */
+
+struct rx_cache
+{
+  struct rx_hash_rules superset_hash_rules;
+
+  /* Objects are allocated by incrementing a pointer that 
+   * scans across rx_blocklists.
+   */
+  struct rx_blocklist * memory;
+  struct rx_blocklist * memory_pos;
+  int bytes_left;
+  char * memory_addr;
+  rx_morecore_fn morecore;
+
+  /* Freelists. */
+  struct rx_freelist * free_superstates;
+  struct rx_freelist * free_transition_classes;
+  struct rx_freelist * free_discernable_futures;
+  struct rx_freelist * free_supersets;
+  struct rx_freelist * free_hash;
+
+  /* Two sets of superstates -- those that are semifreed, and those
+   * that are being used.
+   */
+  struct rx_superstate * lru_superstate;
+  struct rx_superstate * semifree_superstate;
+
+  struct rx_superset * empty_superset;
+
+  int superstates;
+  int semifree_superstates;
+  int hits;
+  int misses;
+  int superstates_allowed;
+
+  int local_cset_size;
+  void ** instruction_table;
+
+  struct rx_hash superset_table;
+};
+
+
+
+
+/* The lowest-level search function supports arbitrarily fragmented
+ * strings and (optionally) suspendable/resumable searches.
+ *
+ * Callers have to provide a few hooks.
+ */
+
+#ifndef __GNUC__
+#ifdef __STDC__
+#define __const__ const
+#else
+#define __const__
+#endif
+#endif
+
+/* This holds a matcher position */
+struct rx_string_position
+{
+  __const__ unsigned char * pos;	/* The current pos. */
+  __const__ unsigned char * string; /* The current string burst. */
+  __const__ unsigned char * end;	/* First invalid position >= POS. */
+  int offset;			/* Integer address of the current burst. */
+  int size;			/* Current string's size. */
+  int search_direction;		/* 1 or -1 */
+  int search_end;		/* First position to not try. */
+};
+
+
+enum rx_get_burst_return
+{
+  rx_get_burst_continuation,
+  rx_get_burst_error,
+  rx_get_burst_ok,
+  rx_get_burst_no_more
+};
+
+
+/* A call to get burst should make POS valid.  It might be invalid
+ * if the STRING field doesn't point to a burst that actually
+ * contains POS.
+ *
+ * GET_BURST should take a clue from SEARCH_DIRECTION (1 or -1) as to
+ * whether or not to pad to the left.  Padding to the right is always
+ * appropriate, but need not go past the point indicated by STOP.
+ *
+ * If a continuation is returned, then the reentering call to
+ * a search function will retry the get_burst.
+ */
+
+#ifdef __STDC__
+typedef enum rx_get_burst_return
+  (*rx_get_burst_fn) (struct rx_string_position * pos,
+		      void * app_closure,
+		      int stop);
+					       
+#else
+typedef enum rx_get_burst_return (*rx_get_burst_fn) ();
+#endif
+
+
+enum rx_back_check_return
+{
+  rx_back_check_continuation,
+  rx_back_check_error,
+  rx_back_check_pass,
+  rx_back_check_fail
+};
+
+/* Back_check should advance the position it is passed 
+ * over rparen - lparen characters and return pass iff
+ * the characters starting at POS match those indexed
+ * by [LPAREN..RPAREN].
+ *
+ * If a continuation is returned, then the reentering call to
+ * a search function will retry the back_check.
+ */
+
+#ifdef __STDC__
+typedef enum rx_back_check_return
+  (*rx_back_check_fn) (struct rx_string_position * pos,
+		       int lparen,
+		       int rparen,
+		       unsigned char * translate,
+		       void * app_closure,
+		       int stop);
+					       
+#else
+typedef enum rx_back_check_return (*rx_back_check_fn) ();
+#endif
+
+
+
+
+/* A call to fetch_char should return the character at POS or POS + 1.
+ * Returning continuations here isn't supported.  OFFSET is either 0 or 1
+ * and indicates which characters is desired.
+ */
+
+#ifdef __STDC__
+typedef int (*rx_fetch_char_fn) (struct rx_string_position * pos,
+				 int offset,
+				 void * app_closure,
+				 int stop);
+#else
+typedef int (*rx_fetch_char_fn) ();
+#endif
+
+
+enum rx_search_return
+{
+  rx_search_continuation = -4,
+  rx_search_error = -3,
+  rx_search_soft_fail = -2,	/* failed by running out of string */
+  rx_search_fail = -1		/* failed only by reaching failure states */
+  /* return values >= 0 indicate the position of a successful match */
+};
+
+
+
+
+
+
+
+/* regex.h
+ * 
+ * The remaining declarations replace regex.h.
+ */
+
+/* This is an array of error messages corresponding to the error codes.
+ */
+extern __const__ char *re_error_msg[];
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum
+{
+  REG_NOERROR = 0,	/* Success.  */
+  REG_NOMATCH,		/* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  REG_BADPAT,		/* Invalid pattern.  */
+  REG_ECOLLATE,		/* Not implemented.  */
+  REG_ECTYPE,		/* Invalid character class name.  */
+  REG_EESCAPE,		/* Trailing backslash.  */
+  REG_ESUBREG,		/* Invalid back reference.  */
+  REG_EBRACK,		/* Unmatched left bracket.  */
+  REG_EPAREN,		/* Parenthesis imbalance.  */ 
+  REG_EBRACE,		/* Unmatched \{.  */
+  REG_BADBR,		/* Invalid contents of \{\}.  */
+  REG_ERANGE,		/* Invalid range end.  */
+  REG_ESPACE,		/* Ran out of memory.  */
+  REG_BADRPT,		/* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  REG_EEND,		/* Premature end.  */
+  REG_ESIZE,		/* Compiled pattern bigger than 2^16 bytes.  */
+  REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp.  */
+} reg_errcode_t;
+
+/* The regex.c support, as a client of rx, defines a set of possible
+ * side effects that can be added to the edge lables of nfa edges.
+ * Here is the list of sidef effects in use.
+ */
+
+enum re_side_effects
+{
+#define RX_WANT_SE_DEFS 1
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#define RX_DEF_SE(IDEM, NAME, VALUE)	      NAME VALUE,
+#define RX_DEF_CPLX_SE(IDEM, NAME, VALUE)     NAME VALUE,
+#include "rx.h"
+#undef RX_DEF_SE
+#undef RX_DEF_CPLX_SE
+#undef RX_WANT_SE_DEFS
+   re_floogle_flap = 65533
+};
+
+/* These hold paramaters for the kinds of side effects that are possible
+ * in the supported pattern languages.  These include things like the 
+ * numeric bounds of {} operators and the index of paren registers for 
+ * subexpression measurement or backreferencing.
+ */
+struct re_se_params
+{
+  enum re_side_effects se;
+  int op1;
+  int op2;
+};
+
+typedef unsigned reg_syntax_t;
+
+struct re_pattern_buffer
+{
+  struct rx rx;
+  reg_syntax_t syntax;		/* See below for syntax bit definitions. */
+
+  unsigned int no_sub:1;	/* If set, don't  return register offsets. */
+  unsigned int not_bol:1;	/* If set, the anchors ('^' and '$') don't */
+  unsigned int not_eol:1;	/*     match at the ends of the string.  */  
+  unsigned int newline_anchor:1;/* If true, an anchor at a newline matches.*/
+  unsigned int least_subs:1;	/* If set, and returning registers, return
+				 * as few values as possible.  Only 
+				 * backreferenced groups and group 0 (the whole
+				 * match) will be returned.
+				 */
+
+  /* If true, this says that the matcher should keep registers on its
+   * backtracking stack.  For many patterns, we can easily determine that
+   * this isn't necessary.
+   */
+  unsigned int match_regs_on_stack:1;
+  unsigned int search_regs_on_stack:1;
+
+  /* is_anchored and begbuf_only are filled in by rx_compile. */
+  unsigned int is_anchored:1;	/* Anchorded by ^? */
+  unsigned int begbuf_only:1;	/* Anchored to char position 0? */
+
+  
+  /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+   * for `max (RE_NREGS, re_nsub + 1)' groups.
+   * If REGS_REALLOCATE, reallocate space if necessary.
+   * If REGS_FIXED, use what's there.  
+   */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+  unsigned int regs_allocated:2;
+
+  
+  /* Either a translate table to apply to all characters before
+   * comparing them, or zero for no translation.  The translation
+   * is applied to a pattern when it is compiled and to a string
+   * when it is matched.
+   */
+  unsigned char * translate;
+
+  /* If this is a valid pointer, it tells rx not to store the extents of 
+   * certain subexpressions (those corresponding to non-zero entries).
+   * Passing 0x1 is the same as passing an array of all ones.  Passing 0x0
+   * is the same as passing an array of all zeros.
+   * The array should contain as many entries as their are subexps in the 
+   * regexp.
+   *
+   * For POSIX compatability, when using regcomp and regexec this field
+   * is zeroed and ignored.
+   */
+  char * syntax_parens;
+
+	/* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+  void * buffer;		/* Malloced memory for the nfa. */
+  unsigned long allocated;	/* Size of that memory. */
+
+  /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+   * the fastmap, if there is one, to skip over impossible
+   * starting points for matches.  */
+  char *fastmap;
+
+  unsigned int fastmap_accurate:1; /* These three are internal. */
+  unsigned int can_match_empty:1;  
+  struct rx_nfa_state * start;	/* The nfa starting state. */
+
+  /* This is the list of iterator bounds for {lo,hi} constructs.
+   * The memory pointed to is part of the rx->buffer.
+   */
+  struct re_se_params *se_params;
+
+  /* This is a bitset representation of the fastmap.
+   * This is a true fastmap that already takes the translate
+   * table into account.
+   */
+  rx_Bitset fastset;
+};
+
+/* Type for byte offsets within the string.  POSIX mandates this.  */
+typedef int regoff_t;
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  unsigned num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+
+
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals. 
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.  
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically, 
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES. 
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal. 
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+
+
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */ 
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK							\
+  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL			\
+   | RE_NO_BK_PARENS            | RE_NO_BK_REFS				\
+   | RE_NO_BK_VAR               | RE_NO_EMPTY_RANGES			\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+#define RE_SYNTAX_POSIX_AWK 						\
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
+
+#define RE_SYNTAX_GREP							\
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP							\
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP						\
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON						\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC						\
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR				\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+   replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+#undef RE_DUP_MAX
+#endif
+#define RE_DUP_MAX ((1 << 15) - 1) 
+
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+ 
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+ * `re_match_2' returns information about at least this many registers
+ * the first time a `regs' structure is passed. 
+ *
+ * Also, this is the greatest number of backreferenced subexpressions
+ * allowed in a pattern being matched without caller-supplied registers.
+ */
+#ifndef RE_NREGS
+#define RE_NREGS 30
+#endif
+
+extern int rx_cache_bound;
+extern char rx_version_string[];
+
+
+
+
+#ifdef RX_WANT_RX_DEFS
+
+/* This is decls to the interesting subsystems and lower layers
+ * of rx.  Everything which doesn't have a public counterpart in 
+ * regex.c is declared here.
+ */
+
+
+#ifdef __STDC__
+typedef void (*rx_hash_freefn) (struct rx_hash_item * it);
+#else /* ndef __STDC__ */
+typedef void (*rx_hash_freefn) ();
+#endif /* ndef __STDC__ */
+
+
+
+
+
+#ifdef __STDC__
+RX_DECL int rx_bitset_is_equal (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL int rx_bitset_is_subset (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL int rx_bitset_empty (int size, rx_Bitset set);
+RX_DECL void rx_bitset_null (int size, rx_Bitset b);
+RX_DECL void rx_bitset_universe (int size, rx_Bitset b);
+RX_DECL void rx_bitset_complement (int size, rx_Bitset b);
+RX_DECL void rx_bitset_assign (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL void rx_bitset_union (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL void rx_bitset_intersection (int size,
+				     rx_Bitset a, rx_Bitset b);
+RX_DECL void rx_bitset_difference (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL void rx_bitset_revdifference (int size,
+				      rx_Bitset a, rx_Bitset b);
+RX_DECL void rx_bitset_xor (int size, rx_Bitset a, rx_Bitset b);
+RX_DECL unsigned long rx_bitset_hash (int size, rx_Bitset b);
+RX_DECL struct rx_hash_item * rx_hash_find (struct rx_hash * table,
+					    unsigned long hash,
+					    void * value,
+					    struct rx_hash_rules * rules);
+RX_DECL struct rx_hash_item * rx_hash_store (struct rx_hash * table,
+					     unsigned long hash,
+					     void * value,
+					     struct rx_hash_rules * rules);
+RX_DECL void rx_hash_free (struct rx_hash_item * it, struct rx_hash_rules * rules);
+RX_DECL void rx_free_hash_table (struct rx_hash * tab, rx_hash_freefn freefn,
+				 struct rx_hash_rules * rules);
+RX_DECL rx_Bitset rx_cset (struct rx *rx);
+RX_DECL rx_Bitset rx_copy_cset (struct rx *rx, rx_Bitset a);
+RX_DECL void rx_free_cset (struct rx * rx, rx_Bitset c);
+RX_DECL struct rexp_node * rexp_node (struct rx *rx,
+				      enum rexp_node_type type);
+RX_DECL struct rexp_node * rx_mk_r_cset (struct rx * rx,
+					 rx_Bitset b);
+RX_DECL struct rexp_node * rx_mk_r_concat (struct rx * rx,
+					   struct rexp_node * a,
+					   struct rexp_node * b);
+RX_DECL struct rexp_node * rx_mk_r_alternate (struct rx * rx,
+					      struct rexp_node * a,
+					      struct rexp_node * b);
+RX_DECL struct rexp_node * rx_mk_r_opt (struct rx * rx,
+					struct rexp_node * a);
+RX_DECL struct rexp_node * rx_mk_r_star (struct rx * rx,
+					 struct rexp_node * a);
+RX_DECL struct rexp_node * rx_mk_r_2phase_star (struct rx * rx,
+						struct rexp_node * a,
+						struct rexp_node * b);
+RX_DECL struct rexp_node * rx_mk_r_side_effect (struct rx * rx,
+						rx_side_effect a);
+RX_DECL struct rexp_node * rx_mk_r_data  (struct rx * rx,
+					  void * a);
+RX_DECL void rx_free_rexp (struct rx * rx, struct rexp_node * node);
+RX_DECL struct rexp_node * rx_copy_rexp (struct rx *rx,
+					 struct rexp_node *node);
+RX_DECL struct rx_nfa_state * rx_nfa_state (struct rx *rx);
+RX_DECL void rx_free_nfa_state (struct rx_nfa_state * n);
+RX_DECL struct rx_nfa_state * rx_id_to_nfa_state (struct rx * rx,
+						  int id);
+RX_DECL struct rx_nfa_edge * rx_nfa_edge (struct rx *rx,
+					  enum rx_nfa_etype type,
+					  struct rx_nfa_state *start,
+					  struct rx_nfa_state *dest);
+RX_DECL void rx_free_nfa_edge (struct rx_nfa_edge * e);
+RX_DECL void rx_free_nfa (struct rx *rx);
+RX_DECL int rx_build_nfa (struct rx *rx,
+			  struct rexp_node *rexp,
+			  struct rx_nfa_state **start,
+			  struct rx_nfa_state **end);
+RX_DECL void rx_name_nfa_states (struct rx *rx);
+RX_DECL int rx_eclose_nfa (struct rx *rx);
+RX_DECL void rx_delete_epsilon_transitions (struct rx *rx);
+RX_DECL int rx_compactify_nfa (struct rx *rx,
+			       void **mem, unsigned long *size);
+RX_DECL void rx_release_superset (struct rx *rx,
+				  struct rx_superset *set);
+RX_DECL struct rx_superset * rx_superset_cons (struct rx * rx,
+					       struct rx_nfa_state *car, struct rx_superset *cdr);
+RX_DECL struct rx_superset * rx_superstate_eclosure_union
+  (struct rx * rx, struct rx_superset *set, struct rx_nfa_state_set *ecl);
+RX_DECL struct rx_superstate * rx_superstate (struct rx *rx,
+					      struct rx_superset *set);
+RX_DECL struct rx_inx * rx_handle_cache_miss
+  (struct rx *rx, struct rx_superstate *super, unsigned char chr, void *data);
+RX_DECL reg_errcode_t rx_compile (__const__ char *pattern, int size,
+				  reg_syntax_t syntax,
+				  struct re_pattern_buffer * rxb);
+RX_DECL void rx_blow_up_fastmap (struct re_pattern_buffer * rxb);
+#else /* STDC */
+RX_DECL int rx_bitset_is_equal ();
+RX_DECL int rx_bitset_is_subset ();
+RX_DECL int rx_bitset_empty ();
+RX_DECL void rx_bitset_null ();
+RX_DECL void rx_bitset_universe ();
+RX_DECL void rx_bitset_complement ();
+RX_DECL void rx_bitset_assign ();
+RX_DECL void rx_bitset_union ();
+RX_DECL void rx_bitset_intersection ();
+RX_DECL void rx_bitset_difference ();
+RX_DECL void rx_bitset_revdifference ();
+RX_DECL void rx_bitset_xor ();
+RX_DECL unsigned long rx_bitset_hash ();
+RX_DECL struct rx_hash_item * rx_hash_find ();
+RX_DECL struct rx_hash_item * rx_hash_store ();
+RX_DECL void rx_hash_free ();
+RX_DECL void rx_free_hash_table ();
+RX_DECL rx_Bitset rx_cset ();
+RX_DECL rx_Bitset rx_copy_cset ();
+RX_DECL void rx_free_cset ();
+RX_DECL struct rexp_node * rexp_node ();
+RX_DECL struct rexp_node * rx_mk_r_cset ();
+RX_DECL struct rexp_node * rx_mk_r_concat ();
+RX_DECL struct rexp_node * rx_mk_r_alternate ();
+RX_DECL struct rexp_node * rx_mk_r_opt ();
+RX_DECL struct rexp_node * rx_mk_r_star ();
+RX_DECL struct rexp_node * rx_mk_r_2phase_star ();
+RX_DECL struct rexp_node * rx_mk_r_side_effect ();
+RX_DECL struct rexp_node * rx_mk_r_data  ();
+RX_DECL void rx_free_rexp ();
+RX_DECL struct rexp_node * rx_copy_rexp ();
+RX_DECL struct rx_nfa_state * rx_nfa_state ();
+RX_DECL void rx_free_nfa_state ();
+RX_DECL struct rx_nfa_state * rx_id_to_nfa_state ();
+RX_DECL struct rx_nfa_edge * rx_nfa_edge ();
+RX_DECL void rx_free_nfa_edge ();
+RX_DECL void rx_free_nfa ();
+RX_DECL int rx_build_nfa ();
+RX_DECL void rx_name_nfa_states ();
+RX_DECL int rx_eclose_nfa ();
+RX_DECL void rx_delete_epsilon_transitions ();
+RX_DECL int rx_compactify_nfa ();
+RX_DECL void rx_release_superset ();
+RX_DECL struct rx_superset * rx_superset_cons ();
+RX_DECL struct rx_superset * rx_superstate_eclosure_union ();
+RX_DECL struct rx_superstate * rx_superstate ();
+RX_DECL struct rx_inx * rx_handle_cache_miss ();
+RX_DECL reg_errcode_t rx_compile ();
+RX_DECL void rx_blow_up_fastmap ();
+#endif /* STDC */
+
+
+#endif /* RX_WANT_RX_DEFS */
+
+
+
+
+#ifdef __STDC__
+extern int re_search_2 (struct re_pattern_buffer *rxb,
+			__const__ char * string1, int size1,
+			__const__ char * string2, int size2,
+			int startpos, int range,
+			struct re_registers *regs,
+			int stop);
+extern int re_search (struct re_pattern_buffer * rxb, __const__ char *string,
+		      int size, int startpos, int range,
+		      struct re_registers *regs);
+extern int re_match_2 (struct re_pattern_buffer * rxb,
+		       __const__ char * string1, int size1,
+		       __const__ char * string2, int size2,
+		       int pos, struct re_registers *regs, int stop);
+extern int re_match (struct re_pattern_buffer * rxb,
+		     __const__ char * string,
+		     int size, int pos,
+		     struct re_registers *regs);
+extern reg_syntax_t re_set_syntax (reg_syntax_t syntax);
+extern void re_set_registers (struct re_pattern_buffer *bufp,
+			      struct re_registers *regs,
+			      unsigned num_regs,
+			      regoff_t * starts, regoff_t * ends);
+extern __const__ char * re_compile_pattern (__const__ char *pattern,
+					int length,
+					struct re_pattern_buffer * rxb);
+extern int re_compile_fastmap (struct re_pattern_buffer * rxb);
+extern char * re_comp (__const__ char *s);
+extern int re_exec (__const__ char *s);
+extern int regcomp (regex_t * preg, __const__ char * pattern, int cflags);
+extern int regexec (__const__ regex_t *preg, __const__ char *string,
+		    size_t nmatch, regmatch_t pmatch[],
+		    int eflags);
+extern size_t regerror (int errcode, __const__ regex_t *preg,
+			char *errbuf, size_t errbuf_size);
+extern void regfree (regex_t *preg);
+
+#else /* STDC */
+extern int re_search_2 ();
+extern int re_search ();
+extern int re_match_2 ();
+extern int re_match ();
+extern reg_syntax_t re_set_syntax ();
+extern void re_set_registers ();
+extern __const__ char * re_compile_pattern ();
+extern int re_compile_fastmap ();
+extern char * re_comp ();
+extern int re_exec ();
+extern int regcomp ();
+extern int regexec ();
+extern size_t regerror ();
+extern void regfree ();
+
+#endif /* STDC */
+
+
+
+
+#ifdef RX_WANT_RX_DEFS
+
+struct rx_counter_frame
+{
+  int tag;
+  int val;
+  struct rx_counter_frame * inherited_from; /* If this is a copy. */
+  struct rx_counter_frame * cdr;
+};
+
+struct rx_backtrack_frame
+{
+  char * counter_stack_sp;
+
+  /* A frame is used to save the matchers state when it crosses a 
+   * backtracking point.  The `stk_' fields correspond to variables
+   * in re_search_2 (just strip off thes `stk_').  They are documented
+   * tere.
+   */
+  struct rx_superstate * stk_super;
+  unsigned int stk_c;
+  struct rx_string_position stk_test_pos;
+  int stk_last_l;
+  int stk_last_r;
+  int stk_test_ret;
+
+  /* This is the list of options left to explore at the backtrack
+   * point for which this frame was created. 
+   */
+  struct rx_distinct_future * df;
+  struct rx_distinct_future * first_df;
+
+#ifdef RX_DEBUG
+   int stk_line_no;
+#endif
+};
+
+struct rx_stack_chunk
+{
+  struct rx_stack_chunk * next_chunk;
+  int bytes_left;
+  char * sp;
+};
+
+enum rx_outer_entry
+{
+  rx_outer_start,
+  rx_outer_fastmap,
+  rx_outer_test,
+  rx_outer_restore_pos
+};
+
+enum rx_fastmap_return
+{
+  rx_fastmap_continuation,
+  rx_fastmap_error,
+  rx_fastmap_ok,
+  rx_fastmap_fail
+};
+
+enum rx_fastmap_entry
+{
+  rx_fastmap_start,
+  rx_fastmap_string_break
+};
+
+enum rx_test_return
+{
+  rx_test_continuation,
+  rx_test_error,
+  rx_test_fail,
+  rx_test_ok
+};
+
+enum rx_test_internal_return
+{
+  rx_test_internal_error,
+  rx_test_found_first,
+  rx_test_line_finished
+};
+
+enum rx_test_match_entry
+{
+  rx_test_start,
+  rx_test_cache_hit_loop,
+  rx_test_backreference_check,
+  rx_test_backtrack_return
+};
+
+struct rx_search_state
+{
+  /* Two groups of registers are kept.  The group with the register state
+   * of the current test match, and the group that holds the state at the end
+   * of the best known match, if any.
+   *
+   * For some patterns, there may also be registers saved on the stack.
+   */
+  unsigned num_regs;		/* Includes an element for register zero. */
+  regoff_t * lparen;		/* scratch space for register returns */
+  regoff_t * rparen;
+  regoff_t * best_lpspace;	/* in case the user doesn't want these */
+  regoff_t * best_rpspace;	/* values, we still need space to store
+				 * them.  Normally, this memoryis unused
+				 * and the space pointed to by REGS is 
+				 * used instead.
+				 */
+  
+  int last_l;			/* Highest index of a valid lparen. */
+  int last_r;			/* It's dual. */
+  
+  int * best_lparen;		/* This contains the best known register */
+  int * best_rparen;		/* assignments. 
+				 * This may point to the same mem as
+				 * best_lpspace, or it might point to memory
+				 * passed by the caller.
+				 */
+  int best_last_l;		/* best_last_l:best_lparen::last_l:lparen */
+  int best_last_r;
+
+
+  unsigned char * translate;  
+
+  struct rx_string_position outer_pos;
+
+  struct rx_superstate * start_super;
+  int nfa_choice;
+  int first_found;		/* If true, return after finding any match. */
+  int ret_val;
+
+  /* For continuations... */
+  enum rx_outer_entry outer_search_resume_pt;
+  struct re_pattern_buffer * saved_rxb;
+  int saved_startpos;
+  int saved_range;
+  int saved_stop;
+  int saved_total_size;
+  rx_get_burst_fn saved_get_burst;
+  rx_back_check_fn saved_back_check;
+  struct re_registers * saved_regs;
+  
+  /**
+   ** state for fastmap
+   **/
+  char * fastmap;
+  int fastmap_chr;
+  int fastmap_val;
+
+  /* for continuations in the fastmap procedure: */
+  enum rx_fastmap_entry fastmap_resume_pt;
+
+  /**
+   ** state for test_match 
+   **/
+
+  /* The current superNFA position of the matcher. */
+  struct rx_superstate * super;
+  
+  /* The matcher interprets a series of instruction frames.
+   * This is the `instruction counter' for the interpretation.
+   */
+  struct rx_inx * ifr;
+  
+  /* We insert a ghost character in the string to prime
+   * the nfa.  test_pos.pos, test_pos.str_half, and test_pos.end_half
+   * keep track of the test-match position and string-half.
+   */
+  unsigned char c;
+  
+  /* Position within the string. */
+  struct rx_string_position test_pos;
+
+  struct rx_stack_chunk * counter_stack;
+  struct rx_stack_chunk * backtrack_stack;
+  int backtrack_frame_bytes;
+  int chunk_bytes;
+  struct rx_stack_chunk * free_chunks;
+
+  /* To return from this function, set test_ret and 
+   * `goto test_do_return'.
+   *
+   * Possible return values are:
+   *     1   --- end of string while the superNFA is still going
+   *     0   --- internal error (out of memory)
+   *	-1   --- search completed by reaching the superNFA fail state
+   *    -2   --- a match was found, maybe not the longest.
+   *
+   * When the search is complete (-1), best_last_r indicates whether
+   * a match was found.
+   *
+   * -2 is return only if search_state.first_found is non-zero.
+   *
+   * if search_state.first_found is non-zero, a return of -1 indicates no match,
+   * otherwise, best_last_r has to be checked.
+   */
+  int test_ret;
+
+  int could_have_continued;
+  
+#ifdef RX_DEBUG
+  int backtrack_depth;
+  /* There is a search tree with every node as set of deterministic
+   * transitions in the super nfa.  For every branch of a 
+   * backtrack point is an edge in the tree.
+   * This counts up a pre-order of nodes in that tree.
+   * It's saved on the search stack and printed when debugging. 
+   */
+  int line_no;
+  int lines_found;
+#endif
+
+
+  /* For continuations within the match tester */
+  enum rx_test_match_entry test_match_resume_pt;
+  struct rx_inx * saved_next_tr_table;
+  struct rx_inx * saved_this_tr_table;
+  int saved_reg;
+  struct rx_backtrack_frame * saved_bf;
+  
+};
+
+
+
+extern char rx_slowmap[];
+extern unsigned char rx_id_translation[];
+
+static __inline__ void
+init_fastmap (rxb, search_state)
+     struct re_pattern_buffer * rxb;
+     struct rx_search_state * search_state;
+{
+  search_state->fastmap = (rxb->fastmap
+			   ? (char *)rxb->fastmap
+			   : (char *)rx_slowmap);
+  /* Update the fastmap now if not correct already. 
+   * When the regexp was compiled, the fastmap was computed
+   * and stored in a bitset.  This expands the bitset into a
+   * character array containing 1s and 0s.
+   */
+  if ((search_state->fastmap == rxb->fastmap) && !rxb->fastmap_accurate)
+    rx_blow_up_fastmap (rxb);
+  search_state->fastmap_chr = -1;
+  search_state->fastmap_val = 0;
+  search_state->fastmap_resume_pt = rx_fastmap_start;
+}
+
+static __inline__ void
+uninit_fastmap (rxb, search_state)
+     struct re_pattern_buffer * rxb;
+     struct rx_search_state * search_state;
+{
+  /* Unset the fastmap sentinel */
+  if (search_state->fastmap_chr >= 0)
+    search_state->fastmap[search_state->fastmap_chr]
+      = search_state->fastmap_val;
+}
+
+static __inline__ int
+fastmap_search (rxb, stop, get_burst, app_closure, search_state)
+     struct re_pattern_buffer * rxb;
+     int stop;
+     rx_get_burst_fn get_burst;
+     void * app_closure;
+     struct rx_search_state * search_state;
+{
+  enum rx_fastmap_entry pc;
+
+  if (0)
+    {
+    return_continuation:
+      search_state->fastmap_resume_pt = pc;
+      return rx_fastmap_continuation;
+    }
+
+  pc = search_state->fastmap_resume_pt;
+
+  switch (pc)
+    {
+    default:
+      return rx_fastmap_error;
+    case rx_fastmap_start:
+    init_fastmap_sentinal:
+      /* For the sake of fast fastmapping, set a sentinal in the fastmap.
+       * This sentinal will trap the fastmap loop when it reaches the last
+       * valid character in a string half.
+       *
+       * This must be reset when the fastmap/search loop crosses a string 
+       * boundry, and before returning to the caller.  So sometimes,
+       * the fastmap loop is restarted with `continue', othertimes by
+       * `goto init_fastmap_sentinal'.
+       */
+      if (search_state->outer_pos.size)
+	{
+	  search_state->fastmap_chr = ((search_state->outer_pos.search_direction == 1)
+				       ? *(search_state->outer_pos.end - 1)
+				       : *search_state->outer_pos.string);
+	  search_state->fastmap_val
+	    = search_state->fastmap[search_state->fastmap_chr];
+	  search_state->fastmap[search_state->fastmap_chr] = 1;
+	}
+      else
+	{
+	  search_state->fastmap_chr = -1;
+	  search_state->fastmap_val = 0;
+	}
+      
+      if (search_state->outer_pos.pos >= search_state->outer_pos.end)
+	goto fastmap_hit_bound;
+      else
+	{
+	  if (search_state->outer_pos.search_direction == 1)
+	    {
+	      if (search_state->fastmap_val)
+		{
+		  for (;;)
+		    {
+		      while (!search_state->fastmap[*search_state->outer_pos.pos])
+			++search_state->outer_pos.pos;
+		      return rx_fastmap_ok;
+		    }
+		}
+	      else
+		{
+		  for (;;)
+		    {
+		      while (!search_state->fastmap[*search_state->outer_pos.pos])
+			++search_state->outer_pos.pos;
+		      if (*search_state->outer_pos.pos != search_state->fastmap_chr)
+			return rx_fastmap_ok;
+		      else 
+			{
+			  ++search_state->outer_pos.pos;
+			  if (search_state->outer_pos.pos == search_state->outer_pos.end)
+			    goto fastmap_hit_bound;
+			}
+		    }
+		}
+	    }
+	  else
+	    {
+	      __const__ unsigned char * bound;
+	      bound = search_state->outer_pos.string - 1;
+	      if (search_state->fastmap_val)
+		{
+		  for (;;)
+		    {
+		      while (!search_state->fastmap[*search_state->outer_pos.pos])
+			--search_state->outer_pos.pos;
+		      return rx_fastmap_ok;
+		    }
+		}
+	      else
+		{
+		  for (;;)
+		    {
+		      while (!search_state->fastmap[*search_state->outer_pos.pos])
+			--search_state->outer_pos.pos;
+		      if ((*search_state->outer_pos.pos != search_state->fastmap_chr) || search_state->fastmap_val)
+			return rx_fastmap_ok;
+		      else 
+			{
+			  --search_state->outer_pos.pos;
+			  if (search_state->outer_pos.pos == bound)
+			    goto fastmap_hit_bound;
+			}
+		    }
+		}
+	    }
+	}
+      
+    case rx_fastmap_string_break:
+    fastmap_hit_bound:
+      {
+	/* If we hit a bound, it may be time to fetch another burst
+	 * of string, or it may be time to return a continuation to 
+ 	 * the caller, or it might be time to fail.
+	 */
+
+	int burst_state;
+	burst_state = get_burst (&search_state->outer_pos, app_closure, stop);
+	switch (burst_state)
+	  {
+	  default:
+	  case rx_get_burst_error:
+	    return rx_fastmap_error;
+	  case rx_get_burst_continuation:
+	    {
+	      pc = rx_fastmap_string_break;
+	      goto return_continuation;
+	    }
+	  case rx_get_burst_ok:
+	    goto init_fastmap_sentinal;
+	  case rx_get_burst_no_more:
+	    /* ...not a string split, simply no more string. 
+	     *
+	     * When searching backward, running out of string
+	     * is reason to quit.
+	     *
+	     * When searching forward, we allow the possibility
+	     * of an (empty) match after the last character in the
+	     * virtual string.  So, fall through to the matcher
+	     */
+	    return (  (search_state->outer_pos.search_direction == 1)
+		    ? rx_fastmap_ok
+		    : rx_fastmap_fail);
+	  }
+      }
+    }
+
+}
+
+
+
+
+#ifdef emacs
+/* The `emacs' switch turns on certain matching commands
+ * that make sense only in Emacs. 
+ */
+#include "sysfuncs.h"
+#include "lisp.h"
+#include "buffer.h"
+#include "syntax.h"
+#endif /* emacs */
+
+/* Setting RX_MEMDBUG is useful if you have dbmalloc.  Maybe with similar
+ * packages too.
+ */
+#ifdef RX_MEMDBUG
+#include <malloc.h>
+#endif /* RX_RX_MEMDBUG */
+
+/* We used to test for `BSTRING' here, but only GCC and Emacs define
+ * `BSTRING', as far as I know, and neither of them use this code.  
+ */
+#if HAVE_STRING_H || STDC_HEADERS
+#include <string.h>
+
+#ifndef bcmp
+#define bcmp(s1, s2, n)	memcmp ((s1), (s2), (n))
+#endif
+
+#ifndef bcopy
+#define bcopy(s, d, n)	memcpy ((d), (s), (n))
+#endif
+
+#ifndef bzero
+#define bzero(s, n)	memset ((s), 0, (n))
+#endif
+
+#else /*  HAVE_STRING_H || STDC_HEADERS */
+#include <strings.h>
+#endif   /* not (HAVE_STRING_H || STDC_HEADERS) */
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else /* not STDC_HEADERS */
+char *malloc ();
+char *realloc ();
+#endif /* not STDC_HEADERS */
+
+
+
+
+
+/* How many characters in the character set.  */
+#define CHAR_SET_SIZE (1 << CHARBITS)
+
+#ifndef emacs
+/* Define the syntax basics for \<, \>, etc.
+ * This must be nonzero for the wordchar and notwordchar pattern
+ * commands in re_match_2.
+ */
+#ifndef Sword 
+#define Sword 1
+#endif
+#define SYNTAX(c) re_syntax_table[c]
+#ifdef SYNTAX_TABLE
+extern char *re_syntax_table;
+#else
+RX_DECL char re_syntax_table[CHAR_SET_SIZE];
+#endif
+#endif /* not emacs */
+
+
+/* Test if at very beginning or at very end of the virtual concatenation
+ *  of `string1' and `string2'.  If only one string, it's `string2'.  
+ */
+
+#define AT_STRINGS_BEG() \
+  (   -1		 \
+   == ((search_state.test_pos.pos - search_state.test_pos.string) \
+       + search_state.test_pos.offset))
+
+#define AT_STRINGS_END() \
+  (   (total_size - 1)	 \
+   == ((search_state.test_pos.pos - search_state.test_pos.string) \
+       + search_state.test_pos.offset))
+
+
+/* Test if POS + 1 points to a character which is word-constituent.  We have
+ * two special cases to check for: if past the end of string1, look at
+ * the first character in string2; and if before the beginning of
+ * string2, look at the last character in string1.
+ *
+ * Assumes `string1' exists, so use in conjunction with AT_STRINGS_BEG ().  
+ */
+#define LETTER_P(POS,OFF)						\
+  (   SYNTAX (fetch_char(POS, OFF, app_closure, stop))			\
+   == Sword)
+
+/* Test if the character at D and the one after D differ with respect
+ * to being word-constituent.  
+ */
+#define AT_WORD_BOUNDARY(d)						\
+  (AT_STRINGS_BEG () || AT_STRINGS_END () || LETTER_P (d,0) != LETTER_P (d, 1))
+
+
+#ifdef RX_SUPPORT_CONTINUATIONS
+#define RX_STACK_ALLOC(BYTES) malloc(BYTES)
+#define RX_STACK_FREE(MEM) free(MEM)
+#else
+#define RX_STACK_ALLOC(BYTES) alloca(BYTES)
+#define RX_STACK_FREE(MEM) \
+      ((struct rx_stack_chunk *)MEM)->next_chunk = search_state.free_chunks; \
+      search_state.free_chunks = ((struct rx_stack_chunk *)MEM);
+
+#endif
+
+#define PUSH(CHUNK_VAR,BYTES)   \
+  if (!CHUNK_VAR || (CHUNK_VAR->bytes_left < (BYTES)))  \
+    {					\
+      struct rx_stack_chunk * new_chunk;	\
+      if (search_state.free_chunks)			\
+	{				\
+	  new_chunk = search_state.free_chunks;	\
+	  search_state.free_chunks = search_state.free_chunks->next_chunk; \
+	}				\
+      else				\
+	{				\
+	  new_chunk = (struct rx_stack_chunk *)RX_STACK_ALLOC(search_state.chunk_bytes); \
+	  if (!new_chunk)		\
+	    {				\
+	      search_state.ret_val = 0;		\
+	      goto test_do_return;	\
+	    }				\
+	}				\
+      new_chunk->sp = (char *)new_chunk + sizeof (struct rx_stack_chunk); \
+      new_chunk->bytes_left = (search_state.chunk_bytes \
+			       - (BYTES) \
+			       - sizeof (struct rx_stack_chunk)); \
+      new_chunk->next_chunk = CHUNK_VAR; \
+      CHUNK_VAR = new_chunk;		\
+    } \
+  else \
+    (CHUNK_VAR->sp += (BYTES)), (CHUNK_VAR->bytes_left -= (BYTES))
+
+#define POP(CHUNK_VAR,BYTES) \
+  if (CHUNK_VAR->sp == ((char *)CHUNK_VAR + sizeof(*CHUNK_VAR))) \
+    { \
+      struct rx_stack_chunk * new_chunk = CHUNK_VAR->next_chunk; \
+      RX_STACK_FREE(CHUNK_VAR); \
+      CHUNK_VAR = new_chunk; \
+    } \
+  else \
+    (CHUNK_VAR->sp -= BYTES), (CHUNK_VAR->bytes_left += BYTES)
+
+
+
+#define SRCH_TRANSLATE(C)  search_state.translate[(unsigned char) (C)]
+
+
+
+
+
+#ifdef __STDC__
+RX_DECL __inline__ int
+rx_search  (struct re_pattern_buffer * rxb,
+	    int startpos,
+	    int range,
+	    int stop,
+	    int total_size,
+	    rx_get_burst_fn get_burst,
+	    rx_back_check_fn back_check,
+	    rx_fetch_char_fn fetch_char,
+	    void * app_closure,
+	    struct re_registers * regs,
+	    struct rx_search_state * resume_state,
+	    struct rx_search_state * save_state)
+#else
+RX_DECL __inline__ int
+rx_search  (rxb, startpos, range, stop, total_size,
+	    get_burst, back_check, fetch_char,
+	    app_closure, regs, resume_state, save_state)
+     struct re_pattern_buffer * rxb;
+     int startpos;
+     int range;
+     int stop;
+     int total_size;
+     rx_get_burst_fn get_burst;
+     rx_back_check_fn back_check;
+     rx_fetch_char_fn fetch_char;
+     void * app_closure;
+     struct re_registers * regs;
+     struct rx_search_state * resume_state;
+     struct rx_search_state * save_state;
+#endif
+{
+  int pc;
+  int test_state;
+  struct rx_search_state search_state;
+
+  search_state.free_chunks = 0;
+  if (!resume_state)
+    pc = rx_outer_start;
+  else
+    {
+      search_state = *resume_state;
+      regs = search_state.saved_regs;
+      rxb = search_state.saved_rxb;
+      startpos = search_state.saved_startpos;
+      range = search_state.saved_range;
+      stop = search_state.saved_stop;
+      total_size = search_state.saved_total_size;
+      get_burst = search_state.saved_get_burst;
+      back_check = search_state.saved_back_check;
+      pc = search_state.outer_search_resume_pt;
+      if (0)
+	{
+	return_continuation:
+	  if (save_state)
+	    {
+	      *save_state = search_state;
+	      save_state->saved_regs = regs;
+	      save_state->saved_rxb = rxb;
+	      save_state->saved_startpos = startpos;
+	      save_state->saved_range = range;
+	      save_state->saved_stop = stop;
+	      save_state->saved_total_size = total_size;
+	      save_state->saved_get_burst = get_burst;
+	      save_state->saved_back_check = back_check;
+	      save_state->outer_search_resume_pt = pc;
+	    }
+	  return rx_search_continuation;
+	}
+    }
+
+  switch (pc)
+    {
+    case rx_outer_start:
+      search_state.ret_val = rx_search_fail;
+      (  search_state.lparen
+       = search_state.rparen
+       = search_state.best_lpspace
+       = search_state.best_rpspace
+       = 0);
+      
+      /* figure the number of registers we may need for use in backreferences.
+       * the number here includes an element for register zero.  
+       */
+      search_state.num_regs = rxb->re_nsub + 1;
+      
+      
+      /* check for out-of-range startpos.  */
+      if ((startpos < 0) || (startpos > total_size))
+	return rx_search_fail;
+      
+      /* fix up range if it might eventually take us outside the string. */
+      {
+	int endpos;
+	endpos = startpos + range;
+	if (endpos < -1)
+	  range = (-1 - startpos);
+	else if (endpos > (total_size + 1))
+	  range = total_size - startpos;
+      }
+      
+      /* if the search isn't to be a backwards one, don't waste time in a
+       * long search for a pattern that says it is anchored.
+       */
+      if (rxb->begbuf_only && (range > 0))
+	{
+	  if (startpos > 0)
+	    return rx_search_fail;
+	  else
+	    range = 1;
+	}
+      
+      /* decide whether to use internal or user-provided reg buffers. */
+      if (!regs || rxb->no_sub)
+	{
+	  search_state.best_lpspace =
+	    (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t));
+	  search_state.best_rpspace =
+	    (regoff_t *)REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t));
+	  search_state.best_lparen = search_state.best_lpspace;
+	  search_state.best_rparen = search_state.best_rpspace;
+	}
+      else
+	{	
+	  /* have the register data arrays been allocated?  */
+	  if (rxb->regs_allocated == REGS_UNALLOCATED)
+	    { /* no.  so allocate them with malloc.  we need one
+		 extra element beyond `search_state.num_regs' for the `-1' marker
+		 gnu code uses.  */
+	      regs->num_regs = MAX (RE_NREGS, rxb->re_nsub + 1);
+	      regs->start = ((regoff_t *)
+			     malloc (regs->num_regs * sizeof ( regoff_t)));
+	      regs->end = ((regoff_t *)
+			   malloc (regs->num_regs * sizeof ( regoff_t)));
+	      if (regs->start == 0 || regs->end == 0)
+		return rx_search_error;
+	      rxb->regs_allocated = REGS_REALLOCATE;
+	    }
+	  else if (rxb->regs_allocated == REGS_REALLOCATE)
+	    { /* yes.  if we need more elements than were already
+		 allocated, reallocate them.  if we need fewer, just
+		 leave it alone.  */
+	      if (regs->num_regs < search_state.num_regs + 1)
+		{
+		  regs->num_regs = search_state.num_regs + 1;
+		  regs->start = ((regoff_t *)
+				 realloc (regs->start,
+					  regs->num_regs * sizeof (regoff_t)));
+		  regs->end = ((regoff_t *)
+			       realloc (regs->end,
+					regs->num_regs * sizeof ( regoff_t)));
+		  if (regs->start == 0 || regs->end == 0)
+		    return rx_search_error;
+		}
+	    }
+	  else if (rxb->regs_allocated != REGS_FIXED)
+	    return rx_search_error;
+	  
+	  if (regs->num_regs < search_state.num_regs + 1)
+	    {
+	      search_state.best_lpspace =
+		((regoff_t *)
+		 REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)));
+	      search_state.best_rpspace =
+		((regoff_t *)
+		 REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)));
+	      search_state.best_lparen = search_state.best_lpspace;
+	      search_state.best_rparen = search_state.best_rpspace;
+	    }
+	  else
+	    {
+	      search_state.best_lparen = regs->start;
+	      search_state.best_rparen = regs->end;
+	    }
+	}
+      
+      search_state.lparen =
+	(regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t));
+      search_state.rparen =
+	(regoff_t *) REGEX_ALLOCATE (search_state.num_regs * sizeof(regoff_t)); 
+      
+      if (! (   search_state.best_rparen
+	     && search_state.best_lparen
+	     && search_state.lparen && search_state.rparen))
+	return rx_search_error;
+      
+      search_state.best_last_l = search_state.best_last_r = -1;
+      
+      search_state.translate = (rxb->translate
+				? rxb->translate
+				: rx_id_translation);
+      
+      
+      
+      /*
+       * two nfa's were compiled.  
+       * `0' is complete.
+       * `1' faster but gets registers wrong and ends too soon.
+       */
+      search_state.nfa_choice = (regs && !rxb->least_subs) ? '\0' : '\1';
+      
+      /* we have the option to look for the best match or the first
+       * one we can find.  if the user isn't asking for register information,
+       * we don't need to find the best match.
+       */
+      search_state.first_found = !regs;
+      
+      if (range >= 0)
+	{
+	  search_state.outer_pos.search_end = startpos + range;
+	  search_state.outer_pos.search_direction = 1;
+	}
+      else
+	{
+	  search_state.outer_pos.search_end = startpos + range;
+	  search_state.outer_pos.search_direction = -1;
+	}
+      
+      /* the vacuous search always turns up nothing. */
+      if ((search_state.outer_pos.search_direction == 1)
+	  ? (startpos > search_state.outer_pos.search_end)
+	  : (startpos < search_state.outer_pos.search_end))
+	return rx_search_fail;
+      
+      /* now we build the starting state of the supernfa. */
+      {
+	struct rx_superset * start_contents;
+	struct rx_nfa_state_set * start_nfa_set;
+	
+	/* we presume here that the nfa start state has only one
+	 * possible future with no side effects.  
+	 */
+	start_nfa_set = rxb->start->futures->destset;
+	if (   rxb->rx.start_set
+	    && (rxb->rx.start_set->starts_for == &rxb->rx))
+	  start_contents = rxb->rx.start_set;
+	else
+	  {
+	    start_contents =
+	      rx_superstate_eclosure_union (&rxb->rx,
+					    rx_superset_cons (&rxb->rx, 0, 0),
+					    start_nfa_set);
+	    
+	    if (!start_contents)
+	      return rx_search_fail;
+	    
+	    start_contents->starts_for = &rxb->rx;
+	    rxb->rx.start_set = start_contents;
+	  }
+	if (   start_contents->superstate
+	    && (start_contents->superstate->rx_id == rxb->rx.rx_id))
+	  {
+	    search_state.start_super = start_contents->superstate;
+	    rx_lock_superstate (&rxb->rx, search_state.start_super);
+	  }
+	else
+	  {
+	    rx_protect_superset (&rxb->rx, start_contents);
+	    
+	    search_state.start_super = rx_superstate (&rxb->rx, start_contents);
+	    if (!search_state.start_super)
+	      return rx_search_fail;
+	    rx_lock_superstate (&rxb->rx, search_state.start_super);
+	    rx_release_superset (&rxb->rx, start_contents);
+	  }
+      }
+      
+      
+      /* The outer_pos tracks the position within the strings
+       * as seen by loop that calls fastmap_search.
+       *
+       * The caller supplied get_burst function actually 
+       * gives us pointers to chars.
+       * 
+       * Communication with the get_burst function is through an
+       * rx_string_position structure.  Here, the structure for
+       * outer_pos is initialized.   It is set to point to the
+       * NULL string, at an offset of STARTPOS.  STARTPOS is out
+       * of range of the NULL string, so the first call to 
+       * getburst will patch up the rx_string_position to point
+       * to valid characters.
+       */
+
+      (  search_state.outer_pos.string
+       = search_state.outer_pos.end
+       = 0);
+
+      search_state.outer_pos.offset = 0;
+      search_state.outer_pos.size = 0;
+      search_state.outer_pos.pos = (unsigned char *)startpos;
+      init_fastmap (rxb, &search_state);
+
+      search_state.fastmap_resume_pt = rx_fastmap_start;
+    case rx_outer_fastmap:
+      /* do { */
+    pseudo_do:
+      {
+	{
+	  int fastmap_state;
+	  fastmap_state = fastmap_search (rxb, stop, get_burst, app_closure,
+					  &search_state);
+	  switch (fastmap_state)
+	    {
+	    case rx_fastmap_continuation:
+	      pc = rx_outer_fastmap;
+	      goto return_continuation;
+	    case rx_fastmap_fail:
+	      goto finish;
+	    case rx_fastmap_ok:
+	      break;
+	    }
+	}
+	
+	/* now the fastmap loop has brought us to a plausible 
+	 * starting point for a match.  so, it's time to run the
+	 * nfa and see if a match occured.
+	 */
+	startpos = (  search_state.outer_pos.pos
+		    - search_state.outer_pos.string
+		    + search_state.outer_pos.offset);
+/*|*/	if ((range > 0) && (startpos == search_state.outer_pos.search_end))
+/*|*/	  goto finish;
+      }
+
+      search_state.test_match_resume_pt = rx_test_start;
+      /* do interrupted for entry point... */
+    case rx_outer_test:
+      /* ...do continued */
+      {
+	goto test_match;
+      test_returns_to_search:
+	switch (test_state)
+	  {
+	  case rx_test_continuation:
+	    pc = rx_outer_test;
+	    goto return_continuation;
+	  case rx_test_error:
+	    search_state.ret_val = rx_search_error;
+	    goto finish;
+	  case rx_test_fail:
+	    break;
+	  case rx_test_ok:
+	    goto finish;
+	  }
+	search_state.outer_pos.pos += search_state.outer_pos.search_direction;
+	startpos += search_state.outer_pos.search_direction;
+#if 0
+/*|*/	if (search_state.test_pos.pos < search_state.test_pos.end)
+/*|*/	  break;
+#endif
+      }
+      /* do interrupted for entry point... */
+    case rx_outer_restore_pos:
+      {
+	int x;
+	x = get_burst (&search_state.outer_pos, app_closure, stop);
+	switch (x)
+	  {
+	  case rx_get_burst_continuation:
+	    pc = rx_outer_restore_pos;
+	    goto return_continuation;
+	  case rx_get_burst_error:
+	    search_state.ret_val = rx_search_error;
+	    goto finish;
+	  case rx_get_burst_no_more:
+	    if (rxb->can_match_empty)
+	      break;
+	    goto finish;
+	  case rx_get_burst_ok:
+	    break;
+	  }
+      } /* } while (...see below...) */
+
+      if ((search_state.outer_pos.search_direction == 1)
+	  ? (startpos < search_state.outer_pos.search_end)
+	  : (startpos > search_state.outer_pos.search_end))
+	goto pseudo_do;
+
+	
+    finish:
+      uninit_fastmap (rxb, &search_state);
+      if (search_state.start_super)
+	rx_unlock_superstate (&rxb->rx, search_state.start_super);
+      
+#ifdef regex_malloc
+      if (search_state.lparen) free (search_state.lparen);
+      if (search_state.rparen) free (search_state.rparen);
+      if (search_state.best_lpspace) free (search_state.best_lpspace);
+      if (search_state.best_rpspace) free (search_state.best_rpspace);
+#endif
+      return search_state.ret_val;
+    }
+
+
+ test_match:
+  {
+    enum rx_test_match_entry test_pc;
+    int inx;
+    test_pc = search_state.test_match_resume_pt;
+    if (test_pc == rx_test_start)
+      {
+#ifdef RX_DEBUG
+	search_state.backtrack_depth = 0;
+#endif
+	search_state.last_l = search_state.last_r = 0;
+	search_state.lparen[0] = startpos;
+	search_state.super = search_state.start_super;
+	search_state.c = search_state.nfa_choice;
+	search_state.test_pos.pos = search_state.outer_pos.pos - 1;    
+	search_state.test_pos.string = search_state.outer_pos.string;
+	search_state.test_pos.end = search_state.outer_pos.end;
+	search_state.test_pos.offset = search_state.outer_pos.offset;
+	search_state.test_pos.size = search_state.outer_pos.size;
+	search_state.test_pos.search_direction = 1;
+	search_state.counter_stack = 0;
+	search_state.backtrack_stack = 0;
+	search_state.backtrack_frame_bytes =
+	  (sizeof (struct rx_backtrack_frame)
+	   + (rxb->match_regs_on_stack
+	      ? sizeof (regoff_t) * (search_state.num_regs + 1) * 2
+	      : 0));
+	search_state.chunk_bytes = search_state.backtrack_frame_bytes * 64;
+	search_state.test_ret = rx_test_line_finished;
+	search_state.could_have_continued = 0;
+      }  
+    /* This is while (1)...except that the body of the loop is interrupted 
+     * by some alternative entry points.
+     */
+  pseudo_while_1:
+    switch (test_pc)
+      {
+      case rx_test_cache_hit_loop:
+	goto resume_continuation_1;
+      case rx_test_backreference_check:
+	goto resume_continuation_2;
+      case rx_test_backtrack_return:
+	goto resume_continuation_3;
+      case rx_test_start:
+#ifdef RX_DEBUG
+	/* There is a search tree with every node as set of deterministic
+	 * transitions in the super nfa.  For every branch of a 
+	 * backtrack point is an edge in the tree.
+	 * This counts up a pre-order of nodes in that tree.
+	 * It's saved on the search stack and printed when debugging. 
+	 */
+	search_state.line_no = 0;
+	search_state.lines_found = 0;
+#endif
+	
+      top_of_cycle:
+	/* A superstate is basicly a transition table, indexed by 
+	 * characters from the string being tested, and containing 
+	 * RX_INX (`instruction frame') structures.
+	 */
+	search_state.ifr = &search_state.super->transitions [search_state.c];
+	
+      recurse_test_match:
+	/* This is the point to which control is sent when the
+	 * test matcher `recurses'.  Before jumping here, some variables
+	 * need to be saved on the stack and the next instruction frame
+	 * has to be computed.
+	 */
+	
+      restart:
+	/* Some instructions don't advance the matcher, but just
+	 * carry out some side effects and fetch a new instruction.
+	 * To dispatch that new instruction, `goto restart'.
+	 */
+	
+	{
+	  struct rx_inx * next_tr_table;
+	  struct rx_inx * this_tr_table;
+	  /* The fastest route through the loop is when the instruction 
+	   * is RX_NEXT_CHAR.  This case is detected when SEARCH_STATE.IFR->DATA
+	   * is non-zero.  In that case, it points to the next
+	   * superstate. 
+	   *
+	   * This allows us to not bother fetching the bytecode.
+	   */
+	  next_tr_table = (struct rx_inx *)search_state.ifr->data;
+	  this_tr_table = search_state.super->transitions;
+	  while (next_tr_table)
+	    {
+#ifdef RX_DEBUG_0
+	      if (rx_debug_trace)
+		{
+		  struct rx_superset * setp;
+		  
+		  fprintf (stderr, "%d %d>> re_next_char @ %d (%d)",
+			   search_state.line_no,
+			   search_state.backtrack_depth,
+			   (search_state.test_pos.pos - search_state.test_pos.string
+			    + search_state.test_pos.offset), search_state.c);
+		  
+		  search_state.super =
+		    ((struct rx_superstate *)
+		     ((char *)this_tr_table
+		      - ((unsigned long)
+			 ((struct rx_superstate *)0)->transitions)));
+		  
+		  setp = search_state.super->contents;
+		  fprintf (stderr, "   superstet (rx=%d, &=%x: ",
+			   rxb->rx.rx_id, setp);
+		  while (setp)
+		    {
+		      fprintf (stderr, "%d ", setp->id);
+		      setp = setp->cdr;
+		    }
+		  fprintf (stderr, "\n");
+		}
+#endif
+	      this_tr_table = next_tr_table;
+	      ++search_state.test_pos.pos;
+	      if (search_state.test_pos.pos == search_state.test_pos.end)
+		{
+		  int burst_state;
+		try_burst_1:
+		  burst_state = get_burst (&search_state.test_pos,
+					   app_closure, stop);
+		  switch (burst_state)
+		    {
+		    case rx_get_burst_continuation:
+		      search_state.saved_this_tr_table = this_tr_table;
+		      search_state.saved_next_tr_table = next_tr_table;
+		      test_pc = rx_test_cache_hit_loop;
+		      goto test_return_continuation;
+		      
+		    resume_continuation_1:
+		      /* Continuation one jumps here to do its work: */
+		      search_state.saved_this_tr_table = this_tr_table;
+		      search_state.saved_next_tr_table = next_tr_table;
+		      goto try_burst_1;
+		      
+		    case rx_get_burst_ok:
+		      /* get_burst succeeded...keep going */
+		      break;
+		      
+		    case rx_get_burst_no_more:
+		      search_state.test_ret = rx_test_line_finished;
+		      search_state.could_have_continued = 1;
+		      goto test_do_return;
+		      
+		    case rx_get_burst_error:
+		      /* An error... */
+		      search_state.test_ret = rx_test_internal_error;
+		      goto test_do_return;
+		    }
+		}
+	      search_state.c = *search_state.test_pos.pos;
+	      search_state.ifr = this_tr_table + search_state.c;
+	      next_tr_table = (struct rx_inx *)search_state.ifr->data;
+	    } /* Fast loop through cached transition tables */
+	  
+	  /* Here when we ran out of cached next-char transitions. 
+	   * So, it will be necessary to do a more expensive
+	   * dispatch on the current instruction.  The superstate
+	   * pointer is allowed to become invalid during next-char
+	   * transitions -- now we must bring it up to date.
+	   */
+	  search_state.super =
+	    ((struct rx_superstate *)
+	     ((char *)this_tr_table
+	      - ((unsigned long)
+		 ((struct rx_superstate *)0)->transitions)));
+	}
+	
+	/* We've encountered an instruction other than next-char.
+	 * Dispatch that instruction:
+	 */
+	inx = (int)search_state.ifr->inx;
+#ifdef RX_DEBUG_0
+	if (rx_debug_trace)
+	  {
+	    struct rx_superset * setp = search_state.super->contents;
+	    
+	    fprintf (stderr, "%d %d>> %s @ %d (%d)", search_state.line_no,
+		     search_state.backtrack_depth,
+		     inx_names[inx],
+		     (search_state.test_pos.pos - search_state.test_pos.string
+		      + (test_pos.half == 0 ? 0 : size1)), search_state.c);
+	    
+	    fprintf (stderr, "   superstet (rx=%d, &=%x: ",
+		     rxb->rx.rx_id, setp);
+	    while (setp)
+	      {
+		fprintf (stderr, "%d ", setp->id);
+		setp = setp->cdr;
+	      }
+	    fprintf (stderr, "\n");
+	  }
+#endif
+	switch ((enum rx_opcode)inx)
+	  {
+	  case rx_do_side_effects:
+	    
+	    /*  RX_DO_SIDE_EFFECTS occurs when we cross epsilon 
+	     *  edges associated with parentheses, backreferencing, etc.
+	     */
+	    {
+	      struct rx_distinct_future * df =
+		(struct rx_distinct_future *)search_state.ifr->data_2;
+	      struct rx_se_list * el = df->effects;
+	      /* Side effects come in lists.  This walks down
+	       * a list, dispatching.
+	       */
+	      while (el)
+		{
+		  long effect;
+		  effect = (long)el->car;
+		  if (effect < 0)
+		    {
+#ifdef RX_DEBUG_0
+		      if (rx_debug_trace)
+			{
+			  struct rx_superset * setp = search_state.super->contents;
+			  
+			  fprintf (stderr, "....%d %d>> %s\n", search_state.line_no,
+				   search_state.backtrack_depth,
+				   efnames[-effect]);
+			}
+#endif
+		      switch ((enum re_side_effects) effect)
+
+			{
+			case re_se_pushback:
+			  search_state.ifr = &df->future_frame;
+			  if (!search_state.ifr->data)
+			    {
+			      struct rx_superstate * sup;
+			      sup = search_state.super;
+			      rx_lock_superstate (rx, sup);
+			      if (!rx_handle_cache_miss (&rxb->rx,
+							 search_state.super,
+							 search_state.c,
+							 (search_state.ifr
+							  ->data_2)))
+				{
+				  rx_unlock_superstate (rx, sup);
+				  search_state.test_ret = rx_test_internal_error;
+				  goto test_do_return;
+				}
+			      rx_unlock_superstate (rx, sup);
+			    }
+			  /* --search_state.test_pos.pos; */
+			  search_state.c = 't';
+			  search_state.super
+			    = ((struct rx_superstate *)
+			       ((char *)search_state.ifr->data
+				- (long)(((struct rx_superstate *)0)
+					 ->transitions)));
+			  goto top_of_cycle;
+			  break;
+			case re_se_push0:
+			  {
+			    struct rx_counter_frame * old_cf
+			      = (search_state.counter_stack
+				 ? ((struct rx_counter_frame *)
+				    search_state.counter_stack->sp)
+				 : 0);
+			    struct rx_counter_frame * cf;
+			    PUSH (search_state.counter_stack,
+				  sizeof (struct rx_counter_frame));
+			    cf = ((struct rx_counter_frame *)
+				  search_state.counter_stack->sp);
+			    cf->tag = re_se_iter;
+			    cf->val = 0;
+			    cf->inherited_from = 0;
+			    cf->cdr = old_cf;
+			    break;
+			  }
+			case re_se_fail:
+			  goto test_do_return;
+			case re_se_begbuf:
+			  if (!AT_STRINGS_BEG ())
+			    goto test_do_return;
+			  break;
+			case re_se_endbuf:
+			  if (!AT_STRINGS_END ())
+			    goto test_do_return;
+			  break;
+			case re_se_wordbeg:
+			  if (   LETTER_P (&search_state.test_pos, 1)
+			      && (   AT_STRINGS_BEG()
+				  || !LETTER_P (&search_state.test_pos, 0)))
+			    break;
+			  else
+			    goto test_do_return;
+			case re_se_wordend:
+			  if (   !AT_STRINGS_BEG ()
+			      && LETTER_P (&search_state.test_pos, 0)
+			      && (AT_STRINGS_END ()
+				  || !LETTER_P (&search_state.test_pos, 1)))
+			    break;
+			  else
+			    goto test_do_return;
+			case re_se_wordbound:
+			  if (AT_WORD_BOUNDARY (&search_state.test_pos))
+			    break;
+			  else
+			    goto test_do_return;
+			case re_se_notwordbound:
+			  if (!AT_WORD_BOUNDARY (&search_state.test_pos))
+			    break;
+			  else
+			    goto test_do_return;
+			case re_se_hat:
+			  if (AT_STRINGS_BEG ())
+			    {
+			      if (rxb->not_bol)
+				goto test_do_return;
+			      else
+				break;
+			    }
+			  else
+			    {
+			      char pos_c = *search_state.test_pos.pos;
+			      if (   (SRCH_TRANSLATE (pos_c)
+				      == SRCH_TRANSLATE('\n'))
+				  && rxb->newline_anchor)
+				break;
+			      else
+				goto test_do_return;
+			    }
+			case re_se_dollar:
+			  if (AT_STRINGS_END ())
+			    {
+			      if (rxb->not_eol)
+				goto test_do_return;
+			      else
+				break;
+			    }
+			  else
+			    {
+			      if (   (   SRCH_TRANSLATE (fetch_char
+						    (&search_state.test_pos, 1,
+						     app_closure, stop))
+				      == SRCH_TRANSLATE ('\n'))
+				  && rxb->newline_anchor)
+				break;
+			      else
+				goto test_do_return;
+			    }
+			  
+			case re_se_try:
+			  /* This is the first side effect in every
+			   * expression.
+			   *
+			   *  FOR NO GOOD REASON...get rid of it...
+			   */
+			  break;
+			  
+			case re_se_pushpos:
+			  {
+			    int urhere =
+			      ((int)(search_state.test_pos.pos
+				     - search_state.test_pos.string)
+			       + search_state.test_pos.offset);
+			    struct rx_counter_frame * old_cf
+			      = (search_state.counter_stack
+				 ? ((struct rx_counter_frame *)
+				    search_state.counter_stack->sp)
+				 : 0);
+			    struct rx_counter_frame * cf;
+			    PUSH(search_state.counter_stack,
+				 sizeof (struct rx_counter_frame));
+			    cf = ((struct rx_counter_frame *)
+				  search_state.counter_stack->sp);
+			    cf->tag = re_se_pushpos;
+			    cf->val = urhere;
+			    cf->inherited_from = 0;
+			    cf->cdr = old_cf;
+			    break;
+			  }
+			  
+			case re_se_chkpos:
+			  {
+			    int urhere =
+			      ((int)(search_state.test_pos.pos
+				     - search_state.test_pos.string)
+			       + search_state.test_pos.offset);
+			    struct rx_counter_frame * cf
+			      = ((struct rx_counter_frame *)
+				 search_state.counter_stack->sp);
+			    if (cf->val == urhere)
+			      goto test_do_return;
+			    cf->val = urhere;
+			    break;
+			  }
+			  break;
+			  
+			case re_se_poppos:
+			  POP(search_state.counter_stack,
+			      sizeof (struct rx_counter_frame));
+			  break;
+			  
+			  
+			case re_se_at_dot:
+			case re_se_syntax:
+			case re_se_not_syntax:
+#ifdef emacs
+			  /* 
+			   * this release lacks emacs support
+			   */
+#endif
+			  break;
+			case re_se_win:
+			case re_se_lparen:
+			case re_se_rparen:
+			case re_se_backref:
+			case re_se_iter:
+			case re_se_end_iter:
+			case re_se_tv:
+			case re_floogle_flap:
+			  search_state.ret_val = 0;
+			  goto test_do_return;
+			}
+		    }
+		  else
+		    {
+#ifdef RX_DEBUG_0
+		      if (rx_debug_trace)
+			fprintf (stderr, "....%d %d>> %s %d %d\n", search_state.line_no,
+				 search_state.backtrack_depth,
+				 efnames2[rxb->se_params [effect].se],
+				 rxb->se_params [effect].op1,
+				 rxb->se_params [effect].op2);
+#endif
+		      switch (rxb->se_params [effect].se)
+			{
+			case re_se_win:
+			  /* This side effect indicates that we've 
+			   * found a match, though not necessarily the 
+			   * best match.  This is a fancy assignment to 
+			   * register 0 unless the caller didn't 
+			   * care about registers.  In which case,
+			   * this stops the match.
+			   */
+			  {
+			    int urhere =
+			      ((int)(search_state.test_pos.pos
+				     - search_state.test_pos.string)
+			       + search_state.test_pos.offset);
+			    
+			    if (   (search_state.best_last_r < 0)
+				|| (urhere + 1 > search_state.best_rparen[0]))
+			      {
+				/* Record the best known and keep
+				 * looking.
+				 */
+				int x;
+				for (x = 0; x <= search_state.last_l; ++x)
+				  search_state.best_lparen[x] = search_state.lparen[x];
+				search_state.best_last_l = search_state.last_l;
+				for (x = 0; x <= search_state.last_r; ++x)
+				  search_state.best_rparen[x] = search_state.rparen[x];
+				search_state.best_rparen[0] = urhere + 1;
+				search_state.best_last_r = search_state.last_r;
+			      }
+			    /* If we're not reporting the match-length 
+			     * or other register info, we need look no
+			     * further.
+			     */
+			    if (search_state.first_found)
+			      {
+				search_state.test_ret = rx_test_found_first;
+				goto test_do_return;
+			      }
+			  }
+			  break;
+			case re_se_lparen:
+			  {
+			    int urhere =
+			      ((int)(search_state.test_pos.pos
+				     - search_state.test_pos.string)
+			       + search_state.test_pos.offset);
+			    
+			    int reg = rxb->se_params [effect].op1;
+#if 0
+			    if (reg > search_state.last_l)
+#endif
+			      {
+				search_state.lparen[reg] = urhere + 1;
+				/* In addition to making this assignment,
+				 * we now know that lower numbered regs
+				 * that haven't already been assigned,
+				 * won't be.  We make sure they're
+				 * filled with -1, so they can be
+				 * recognized as unassigned.
+				 */
+				if (search_state.last_l < reg)
+				  while (++search_state.last_l < reg)
+				    search_state.lparen[search_state.last_l] = -1;
+			      }
+			    break;
+			  }
+			  
+			case re_se_rparen:
+			  {
+			    int urhere =
+			      ((int)(search_state.test_pos.pos
+				     - search_state.test_pos.string)
+			       + search_state.test_pos.offset);
+			    int reg = rxb->se_params [effect].op1;
+			    search_state.rparen[reg] = urhere + 1;
+			    if (search_state.last_r < reg)
+			      {
+				while (++search_state.last_r < reg)
+				  search_state.rparen[search_state.last_r]
+				    = -1;
+			      }
+			    break;
+			  }
+			  
+			case re_se_backref:
+			  {
+			    int reg = rxb->se_params [effect].op1;
+			    if (   reg > search_state.last_r
+				|| search_state.rparen[reg] < 0)
+			      goto test_do_return;
+			    
+			    {
+			      int backref_status;
+			    check_backreference:
+			      backref_status
+				= back_check (&search_state.test_pos,
+					      search_state.lparen[reg],
+					      search_state.rparen[reg],
+					      search_state.translate,
+					      app_closure,
+					      stop);
+			      switch (backref_status)
+				{
+				case rx_back_check_continuation:
+				  search_state.saved_reg = reg;
+				  test_pc = rx_test_backreference_check;
+				  goto test_return_continuation;
+				resume_continuation_2:
+				  reg = search_state.saved_reg;
+				  goto check_backreference;
+				case rx_back_check_fail:
+				  /* Fail */
+				  goto test_do_return;
+				case rx_back_check_pass:
+				  /* pass --
+				   * test_pos now advanced to last
+				   * char matched by backref
+				   */
+				  break;
+				}
+			    }
+			    break;
+			  }
+			case re_se_iter:
+			  {
+			    struct rx_counter_frame * csp
+			      = ((struct rx_counter_frame *)
+				 search_state.counter_stack->sp);
+			    if (csp->val == rxb->se_params[effect].op2)
+			      goto test_do_return;
+			    else
+			      ++csp->val;
+			    break;
+			  }
+			case re_se_end_iter:
+			  {
+			    struct rx_counter_frame * csp
+			      = ((struct rx_counter_frame *)
+				 search_state.counter_stack->sp);
+			    if (csp->val < rxb->se_params[effect].op1)
+			      goto test_do_return;
+			    else
+			      {
+				struct rx_counter_frame * source = csp;
+				while (source->inherited_from)
+				  source = source->inherited_from;
+				if (!source || !source->cdr)
+				  {
+				    POP(search_state.counter_stack,
+					sizeof(struct rx_counter_frame));
+				  }
+				else
+				  {
+				    source = source->cdr;
+				    csp->val = source->val;
+				    csp->tag = source->tag;
+				    csp->cdr = 0;
+				    csp->inherited_from = source;
+				  }
+			      }
+			    break;
+			  }
+			case re_se_tv:
+			  /* is a noop */
+			  break;
+			case re_se_try:
+			case re_se_pushback:
+			case re_se_push0:
+			case re_se_pushpos:
+			case re_se_chkpos:
+			case re_se_poppos:
+			case re_se_at_dot:
+			case re_se_syntax:
+			case re_se_not_syntax:
+			case re_se_begbuf:
+			case re_se_hat:
+			case re_se_wordbeg:
+			case re_se_wordbound:
+			case re_se_notwordbound:
+			case re_se_wordend:
+			case re_se_endbuf:
+			case re_se_dollar:
+			case re_se_fail:
+			case re_floogle_flap:
+			  search_state.ret_val = 0;
+			  goto test_do_return;
+			}
+		    }
+		  el = el->cdr;
+		}
+	      /* Now the side effects are done,
+	       * so get the next instruction.
+	       * and move on.
+	       */
+	      search_state.ifr = &df->future_frame;
+	      goto restart;
+	    }
+	    
+	  case rx_backtrack_point:
+	    {
+	      /* A backtrack point indicates that we've reached a
+	       * non-determinism in the superstate NFA.  This is a
+	       * loop that exhaustively searches the possibilities.
+	       *
+	       * A backtracking strategy is used.  We keep track of what
+	       * registers are valid so we can erase side effects.
+	       *
+	       * First, make sure there is some stack space to hold 
+	       * our state.
+	       */
+	      
+	      struct rx_backtrack_frame * bf;
+	      
+	      PUSH(search_state.backtrack_stack,
+		   search_state.backtrack_frame_bytes);
+#ifdef RX_DEBUG_0
+	      ++search_state.backtrack_depth;
+#endif
+	      
+	      bf = ((struct rx_backtrack_frame *)
+		    search_state.backtrack_stack->sp);
+	      {
+		bf->stk_super = search_state.super;
+		/* We prevent the current superstate from being
+		 * deleted from the superstate cache.
+		 */
+		rx_lock_superstate (&rxb->rx, search_state.super);
+#ifdef RX_DEBUG_0
+		bf->stk_search_state.line_no = search_state.line_no;
+#endif
+		bf->stk_c = search_state.c;
+		bf->stk_test_pos = search_state.test_pos;
+		bf->stk_last_l = search_state.last_l;
+		bf->stk_last_r = search_state.last_r;
+		bf->df = ((struct rx_super_edge *)
+			  search_state.ifr->data_2)->options;
+		bf->first_df = bf->df;
+		bf->counter_stack_sp = (search_state.counter_stack
+					? search_state.counter_stack->sp
+					: 0);
+		bf->stk_test_ret = search_state.test_ret;
+		if (rxb->match_regs_on_stack)
+		  {
+		    int x;
+		    regoff_t * stk =
+		      (regoff_t *)((char *)bf + sizeof (*bf));
+		    for (x = 0; x <= search_state.last_l; ++x)
+		      stk[x] = search_state.lparen[x];
+		    stk += x;
+		    for (x = 0; x <= search_state.last_r; ++x)
+		      stk[x] = search_state.rparen[x];
+		  }
+	      }
+	      
+	      /* Here is a while loop whose body is mainly a function
+	       * call and some code to handle a return from that
+	       * function.
+	       *
+	       * From here on for the rest of `case backtrack_point' it
+	       * is unsafe to assume that the search_state copies of 
+	       * variables saved on the backtracking stack are valid
+	       * -- so read their values from the backtracking stack.
+	       *
+	       * This lets us use one generation fewer stack saves in
+	       * the call-graph of a search.
+	       */
+	      
+	    while_non_det_options:
+#ifdef RX_DEBUG_0
+	      ++search_state.lines_found;
+	      if (rx_debug_trace)
+		fprintf (stderr, "@@@ %d calls %d @@@\n",
+			 search_state.line_no, search_state.lines_found);
+	      
+	      search_state.line_no = search_state.lines_found;
+#endif
+	      
+	      if (bf->df->next_same_super_edge[0] == bf->first_df)
+		{
+		  /* This is a tail-call optimization -- we don't recurse
+		   * for the last of the possible futures.
+		   */
+		  search_state.ifr = (bf->df->effects
+				      ? &bf->df->side_effects_frame
+				      : &bf->df->future_frame);
+		  
+		  rx_unlock_superstate (&rxb->rx, search_state.super);
+		  POP(search_state.backtrack_stack,
+		      search_state.backtrack_frame_bytes);
+#ifdef RX_DEBUG
+		  --search_state.backtrack_depth;
+#endif
+		  goto restart;
+		}
+	      else
+		{
+		  if (search_state.counter_stack)
+		    {
+		      struct rx_counter_frame * old_cf
+			= ((struct rx_counter_frame *)search_state.counter_stack->sp);
+		      struct rx_counter_frame * cf;
+		      PUSH(search_state.counter_stack, sizeof (struct rx_counter_frame));
+		      cf = ((struct rx_counter_frame *)search_state.counter_stack->sp);
+		      cf->tag = old_cf->tag;
+		      cf->val = old_cf->val;
+		      cf->inherited_from = old_cf;
+		      cf->cdr = 0;
+		    }			
+		  /* `Call' this test-match block */
+		  search_state.ifr = (bf->df->effects
+				      ? &bf->df->side_effects_frame
+				      : &bf->df->future_frame);
+		  goto recurse_test_match;
+		}
+	      
+	      /* Returns in this block are accomplished by
+	       * goto test_do_return.  There are two cases.
+	       * If there is some search-stack left,
+	       * then it is a return from a `recursive' call.
+	       * If there is no search-stack left, then
+	       * we should return to the fastmap/search loop.
+	       */
+	      
+	    test_do_return:
+	      
+	      if (!search_state.backtrack_stack)
+		{
+#ifdef RX_DEBUG_0
+		  if (rx_debug_trace)
+		    fprintf (stderr, "!!! %d bails returning %d !!!\n",
+			     search_state.line_no, search_state.test_ret);
+#endif
+		  
+		  /* No more search-stack -- this test is done. */
+		  if (search_state.test_ret)
+		    goto return_from_test_match;
+		  else
+		    goto error_in_testing_match;
+		}
+	      
+	      /* Returning from a recursive call to 
+	       * the test match block:
+	       */
+	      
+	      bf = ((struct rx_backtrack_frame *)
+		    search_state.backtrack_stack->sp);
+#ifdef RX_DEBUG_0
+	      if (rx_debug_trace)
+		fprintf (stderr, "+++ %d returns %d (to %d)+++\n",
+			 search_state.line_no,
+			 search_state.test_ret,
+			 bf->stk_search_state.line_no);
+#endif
+	      
+	      while (search_state.counter_stack
+		     && (!bf->counter_stack_sp
+			 || (bf->counter_stack_sp
+			     != search_state.counter_stack->sp)))
+		{
+		  POP(search_state.counter_stack,
+		      sizeof (struct rx_counter_frame));
+		}
+	      
+	      if (search_state.test_ret == rx_test_error)
+		{
+		  POP (search_state.backtrack_stack,
+		       search_state.backtrack_frame_bytes);
+		  goto test_do_return;
+		}
+	      
+	      /* If a non-longest match was found and that is good 
+	       * enough, return immediately.
+	       */
+	      if (   (search_state.test_ret == rx_test_found_first)
+		  && search_state.first_found)
+		{
+		  rx_unlock_superstate (&rxb->rx, bf->stk_super);
+		  POP (search_state.backtrack_stack,
+		       search_state.backtrack_frame_bytes);
+		  goto test_do_return;
+		}
+	      
+	      search_state.test_ret = bf->stk_test_ret;
+	      search_state.last_l = bf->stk_last_l;
+	      search_state.last_r = bf->stk_last_r;
+	      bf->df = bf->df->next_same_super_edge[0];
+	      search_state.super = bf->stk_super;
+	      search_state.c = bf->stk_c;
+#ifdef RX_DEBUG_0
+	      search_state.line_no = bf->stk_search_state.line_no;
+#endif
+	      
+	      if (rxb->match_regs_on_stack)
+		{
+		  int x;
+		  regoff_t * stk =
+		    (regoff_t *)((char *)bf + sizeof (*bf));
+		  for (x = 0; x <= search_state.last_l; ++x)
+		    search_state.lparen[x] = stk[x];
+		  stk += x;
+		  for (x = 0; x <= search_state.last_r; ++x)
+		    search_state.rparen[x] = stk[x];
+		}
+	      
+	      {
+		int x;
+	      try_burst_2:
+		x = get_burst (&bf->stk_test_pos, app_closure, stop);
+		switch (x)
+		  {
+		  case rx_get_burst_continuation:
+		    search_state.saved_bf = bf;
+		    test_pc = rx_test_backtrack_return;
+		    goto test_return_continuation;
+		  resume_continuation_3:
+		    bf = search_state.saved_bf;
+		    goto try_burst_2;
+		  case rx_get_burst_no_more:
+		    /* Since we've been here before, it is some kind of
+		     * error that we can't return.
+		     */
+		  case rx_get_burst_error:
+		    search_state.test_ret = rx_test_internal_error;
+		    goto test_do_return;
+		  case rx_get_burst_ok:
+		    break;
+		  }
+	      }
+	      search_state.test_pos = bf->stk_test_pos;
+	      goto while_non_det_options;
+	    }
+	    
+	    
+	  case rx_cache_miss:
+	    /* Because the superstate NFA is lazily constructed,
+	     * and in fact may erode from underneath us, we sometimes
+	     * have to construct the next instruction from the hard way.
+	     * This invokes one step in the lazy-conversion.
+	     */
+	    search_state.ifr = rx_handle_cache_miss (&rxb->rx,
+						     search_state.super,
+						     search_state.c,
+						     search_state.ifr->data_2);
+	    if (!search_state.ifr)
+	      {
+		search_state.test_ret = rx_test_internal_error;
+		goto test_do_return;
+	      }
+	    goto restart;
+	    
+	  case rx_backtrack:
+	    /* RX_BACKTRACK means that we've reached the empty
+	     * superstate, indicating that match can't succeed
+	     * from this point.
+	     */
+	    goto test_do_return;
+	    
+	  case rx_next_char:
+	  case rx_error_inx:
+	  case rx_num_instructions:
+	    search_state.ret_val = 0;
+	    goto test_do_return;
+	  }
+	goto pseudo_while_1;
+      }
+    
+    /* Healthy exits from the test-match loop do a 
+     * `goto return_from_test_match'   On the other hand, 
+     * we might end up here.
+     */
+  error_in_testing_match:
+    test_state = rx_test_error;
+    goto test_returns_to_search;
+    
+    /***** fastmap/search loop body
+     *	      considering the results testing for a match
+     */
+    
+  return_from_test_match:
+    
+    if (search_state.best_last_l >= 0)
+      {
+	if (regs && (regs->start != search_state.best_lparen))
+	  {
+	    bcopy (search_state.best_lparen, regs->start,
+		   regs->num_regs * sizeof (int));
+	    bcopy (search_state.best_rparen, regs->end,
+		   regs->num_regs * sizeof (int));
+	  }
+	if (regs && !rxb->no_sub)
+	  {
+	    int q;
+	    int bound = (regs->num_regs > search_state.num_regs
+			 ? regs->num_regs
+			 : search_state.num_regs);
+	    regoff_t * s = regs->start;
+	    regoff_t * e = regs->end;
+	    for (q = search_state.best_last_l + 1;  q < bound; ++q)
+	      s[q] = e[q] = -1;
+	  }
+	search_state.ret_val = search_state.best_lparen[0];
+	test_state = rx_test_ok;
+	goto test_returns_to_search;
+      }
+    else
+      {
+	test_state = rx_test_fail;
+	goto test_returns_to_search;
+      }
+    
+  test_return_continuation:
+    search_state.test_match_resume_pt = test_pc;
+    test_state = rx_test_continuation;
+    goto test_returns_to_search;
+  }
+}
+
+
+
+#endif /* RX_WANT_RX_DEFS */
+
+
+
+#else /* RX_WANT_SE_DEFS */
+  /* Integers are used to represent side effects.
+   *
+   * Simple side effects are given negative integer names by these enums.
+   * 
+   * Non-negative names are reserved for complex effects.
+   *
+   * Complex effects are those that take arguments.  For example, 
+   * a register assignment associated with a group is complex because
+   * it requires an argument to tell which group is being matched.
+   * 
+   * The integer name of a complex effect is an index into rxb->se_params.
+   */
+ 
+  RX_DEF_SE(1, re_se_try, = -1)		/* Epsilon from start state */
+
+  RX_DEF_SE(0, re_se_pushback, = re_se_try - 1)
+  RX_DEF_SE(0, re_se_push0, = re_se_pushback -1)
+  RX_DEF_SE(0, re_se_pushpos, = re_se_push0 - 1)
+  RX_DEF_SE(0, re_se_chkpos, = re_se_pushpos -1)
+  RX_DEF_SE(0, re_se_poppos, = re_se_chkpos - 1)
+
+  RX_DEF_SE(1, re_se_at_dot, = re_se_poppos - 1)	/* Emacs only */
+  RX_DEF_SE(0, re_se_syntax, = re_se_at_dot - 1) /* Emacs only */
+  RX_DEF_SE(0, re_se_not_syntax, = re_se_syntax - 1) /* Emacs only */
+
+  RX_DEF_SE(1, re_se_begbuf, = re_se_not_syntax - 1) /* match beginning of buffer */
+  RX_DEF_SE(1, re_se_hat, = re_se_begbuf - 1) /* match beginning of line */
+
+  RX_DEF_SE(1, re_se_wordbeg, = re_se_hat - 1) 
+  RX_DEF_SE(1, re_se_wordbound, = re_se_wordbeg - 1)
+  RX_DEF_SE(1, re_se_notwordbound, = re_se_wordbound - 1)
+
+  RX_DEF_SE(1, re_se_wordend, = re_se_notwordbound - 1)
+  RX_DEF_SE(1, re_se_endbuf, = re_se_wordend - 1)
+
+  /* This fails except at the end of a line. 
+   * It deserves to go here since it is typicly one of the last steps 
+   * in a match.
+   */
+  RX_DEF_SE(1, re_se_dollar, = re_se_endbuf - 1)
+
+  /* Simple effects: */
+  RX_DEF_SE(1, re_se_fail, = re_se_dollar - 1)
+
+  /* Complex effects.  These are used in the 'se' field of 
+   * a struct re_se_params.  Indexes into the se array
+   * are stored as instructions on nfa edges.
+   */
+  RX_DEF_CPLX_SE(1, re_se_win, = 0)
+  RX_DEF_CPLX_SE(1, re_se_lparen, = re_se_win + 1)
+  RX_DEF_CPLX_SE(1, re_se_rparen, = re_se_lparen + 1)
+  RX_DEF_CPLX_SE(0, re_se_backref, = re_se_rparen + 1)
+  RX_DEF_CPLX_SE(0, re_se_iter, = re_se_backref + 1) 
+  RX_DEF_CPLX_SE(0, re_se_end_iter, = re_se_iter + 1)
+  RX_DEF_CPLX_SE(0, re_se_tv, = re_se_end_iter + 1)
+
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.c	(revision 21083)
@@ -0,0 +1,72 @@
+/**************************************************************************
+ *
+ * simplefrenchstem.c -- a simple french stemmer
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "simplefrenchstem.h"
+
+
+
+/* =========================================================================
+ * Function: simplefrenchstem
+ * Description: a simple french stemmer
+ * Input: a word string with the length in the first byte
+ * Output: the stemmed word
+ * ========================================================================= */
+
+void simplefrenchstem (unsigned char *word) {      
+  unsigned short out[256]; /* temp space */
+  unsigned short *wordstart; /* points to first letter of word */
+  int last;                  /* last points to the last character */
+
+  /* decode */
+  utf8_word_to_unicode (word, out, 255);
+  wordstart = out + 1;
+  last = out[0]-1;
+  
+
+  if (last > 4) {
+    if (wordstart[last]=='x') {
+      if (wordstart[last-1]=='u' && wordstart[last-2]=='a') {
+	wordstart[last-1]='l';
+      }
+      last--;
+
+    } else {
+      if (last>=0 && wordstart[last]=='s') last--;
+      if (last>=0 && wordstart[last]=='r') last--;
+      if (last>=0 && wordstart[last]=='e') last--;
+
+      /* letter with accent e + ' -- there are two possible encodings  */
+      if (last>=0 && wordstart[last]==0xe9) { 
+	last--;
+      } else if (last>=1 && wordstart[last-1]=='e' && wordstart[last]==0x301) {
+	last -= 2; 
+      }
+
+      if (last >= 1 && wordstart[last]==wordstart[last-1]) last--;
+    }  /* end else */
+
+    out[0] = (unsigned char)(last+1);
+  } /* end if (len > 4) */
+
+  /* re-code, make sure the result is not longer than the input */
+  unicode_to_utf8_word (out, word, word[0]+1);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/simplefrenchstem.h	(revision 21083)
@@ -0,0 +1,50 @@
+/**************************************************************************
+ *
+ * simplefrenchstem.h -- a simple french stemmer
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:04  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/25 07:55:37  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/24 06:37:53  rjmcnab
+
+   Incorporated the french stemmer better.
+
+
+ */
+
+#ifndef SIMPLEFRENCHSTEM_H
+#define SIMPLEFRENCHSTEM_H
+
+void simplefrenchstem (unsigned char *word);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/sptree.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/sptree.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/sptree.c	(revision 21083)
@@ -0,0 +1,391 @@
+/**************************************************************************
+ *
+ * sptree.c -- Splay tree code
+ * Copyright (C) 1994  Gary Eddy, Alistair Moffat and Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#include	"sysfuncs.h"
+#include	"sptree.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:04  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:45  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:50  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#define TRACE(w)
+
+#define POOL_SIZE 1024
+
+
+typedef struct node_rec node;
+
+struct node_rec
+  {
+    node *left, *rght;
+    node *par;
+    char *datsun;
+  };
+
+struct pool
+  {
+    int length, pos;
+    struct pool *next;
+    node nodes[POOL_SIZE];
+  };
+
+static node *SP_splay ();
+
+#define	CNULL	((char *) NULL)
+#define	NNULL	((node *) NULL)
+#define	SNULL	((Splay_Tree *) NULL)
+
+
+/*
+ *    createset():
+ *              allocates memory for and initialises a set.
+ *
+ *      Accesses outside variables:     none
+ *
+ *      Return value...:                none
+ */
+
+Splay_Tree *
+SP_createset (int (*cmp) (void *, void *))
+{
+  Splay_Tree *S;
+
+  if (!(S = (Splay_Tree *) malloc (sizeof (Splay_Tree))))
+    return (SNULL);
+  S->cmp = cmp;
+  S->root = CNULL;
+  S->no_of_items = 0;
+  S->mem_in_use = sizeof (Splay_Tree);
+  S->pool = NULL;
+  S->pool_chunks = 1024;
+  return S;
+}				/* createset() */
+
+
+
+static node *
+SP_get_node (Splay_Tree * S)
+{
+  struct pool *p = S->pool;
+  if (!p || p->pos == p->length)
+    {
+      p = malloc (sizeof (struct pool));
+      if (!p)
+	return NULL;
+      S->mem_in_use += sizeof (struct pool);
+      p->length = POOL_SIZE;
+      p->pos = 0;
+      p->next = S->pool;
+      S->pool = p;
+    }
+  return &(p->nodes[p->pos++]);
+}
+
+
+
+/*
+ *    SP_freeset():
+ *              free the memory allocated to a splay tree. Note this Does not
+ *              free the data in the tree you must do this yourself.
+ *
+ *      Accesses outside variables:     none
+ *
+ *      Return value...:                none
+ */
+
+void 
+SP_freeset (Splay_Tree * S)
+{
+  while (S->pool)
+    {
+      struct pool *p = S->pool;
+      S->pool = p->next;
+      free (p);
+    }
+  free (S);
+}
+
+
+/*
+ *    insert():
+ *              inserts the item given into the set given in the order
+ *              specified by the comparison function in the set 
+ *              definition.
+ *
+ *      Accesses outside variables:     none
+ *
+ *      Return value...:                none
+ */
+
+
+void *
+SP_insert (void *item, Splay_Tree * S)
+{
+  int dir = 0;
+  register node *curr, *prev;
+  node *tmp;
+
+  prev = NNULL;
+  curr = (node *) S->root;
+  for (; curr;)
+    {
+      prev = curr;
+      dir = S->cmp (item, curr->datsun);
+      if (dir < 0)
+	curr = curr->left;
+      else
+	curr = curr->rght;
+    }
+  if (!(tmp = SP_get_node (S)))
+    return NULL;
+  tmp->datsun = item;
+
+  if (prev == NNULL)
+    S->root = (char *) tmp;
+  else if (dir < 0)
+    prev->left = tmp;
+  else
+    prev->rght = tmp;
+
+  tmp->par = prev;
+  tmp->left = NNULL;
+  tmp->rght = NNULL;
+  S->no_of_items++;
+  S->root = (char *) SP_splay (tmp);
+  return (tmp->datsun);
+}				/* insert() */
+
+/*
+ *    get_first():
+ *              returns a pointer to the first item in the set. If the set 
+ *              is empty a NULL pointer is returned.
+ *
+ *      Accesses outside variables:     none
+ */
+
+void *
+SP_get_first (Splay_Tree * S)
+{
+  node *curr, *prev;
+
+  for (curr = (node *) S->root, prev = NNULL; curr;
+       prev = curr, curr = curr->left)
+    ;				/* NULLBODY */
+
+  if (prev)
+    S->root = (char *) SP_splay (prev);
+  return (prev ? prev->datsun : CNULL);
+}				/* get_first() */
+
+/*
+ *    get_next():
+ *              returns the in-order successor of the currently fingered
+ *              item of the set. If no item is fingered or if there is 
+ *              no in-order successor a NULL pointer is returned.
+ *
+ *      Accesses outside variables:     none
+ */
+
+void *
+SP_get_next (Splay_Tree * S)
+{
+  node *curr, *prev;
+
+  curr = (node *) S->root;
+  if (!curr || !curr->rght)
+    return (CNULL);
+
+  for (prev = curr, curr = curr->rght; curr;
+       prev = curr, curr = curr->left)
+    ;				/* NULLBODY */
+
+  if (prev)
+    S->root = (char *) SP_splay (prev);
+  return (prev ? prev->datsun : CNULL);
+}				/* get_next() */
+
+/*
+ *    deletemin():
+ *              removes the first element in the set and returns a
+ *              pointer to it. If the set is empty a NULL pointer 
+ *              is returned.
+ *
+ *      Accesses outside variables:     none
+ */
+
+void *
+SP_deletemin (Splay_Tree * S)
+{
+  node *tmp;
+  char *dat;
+
+  dat = SP_get_first (S);
+  if (dat)
+    {
+      tmp = (node *) S->root;
+      S->root = (char *) tmp->rght;
+      if (S->root)
+	((node *) S->root)->par = NULL;
+    }
+  S->no_of_items--;
+  return dat;
+}				/* deletemin() */
+
+
+/*
+ *    member():
+ *              searches the given set for an item which matches (has
+ *              the same key) and returns a pointer to a copy of that item.
+ *              If no matching item is found a NULL pointer is 
+ *              returned.
+ *
+ *      Accesses outside variables:     none
+ */
+
+void *
+SP_member (void *dat, Splay_Tree * S)
+{
+  register node *curr;
+  register int dir;
+  static int calls = 0;
+
+  TRACE ("in member");
+  for (curr = (node *) S->root; curr;)
+    {
+      TRACE ("call to cmp");
+      dir = S->cmp (dat, curr->datsun);
+      TRACE ("out of cmp");
+      if (dir < 0)
+	curr = curr->left;
+      else if (dir > 0)
+	curr = curr->rght;
+      else
+	{
+	  /* splay occasionaly to speed up execution */
+	  if ((calls++ % 4) == 0 && curr)
+	    S->root = (char *) SP_splay (curr);
+	  TRACE ("out of member");
+	  return (curr->datsun);
+	}
+    }
+  TRACE ("out of member");
+  return (CNULL);
+}				/* member() */
+
+#define	ROTATEL(p,q) 					\
+	do{						\
+		p->par = q->par;			\
+		q->par = p;				\
+		q->rght = p->left;			\
+		if(q->rght)				\
+			q->rght->par = q;		\
+		p->left = q;				\
+		if(p->par)				\
+			if(q == p->par->left)		\
+				p->par->left = p;	\
+			else				\
+				p->par->rght = p;	\
+	}while(0)
+
+#define	ROTATER(p,q) 					\
+	do{						\
+		p->par = q->par;			\
+		q->par = p;				\
+		q->left = p->rght;			\
+		if(q->left)				\
+			q->left->par = q;		\
+		p->rght = q;				\
+		if(p->par)				\
+			if(q == p->par->left)		\
+				p->par->left = p;	\
+			else				\
+				p->par->rght = p;	\
+	}while(0)
+
+
+/*
+ *    splay():
+ *              i
+ *
+ *      Accesses outside variables:     i
+ *
+ *      Return value...:                i
+ */
+
+static node *
+SP_splay (p)
+     register node *p;
+{
+  register node *q, *g;
+
+  q = p->par;
+  /* splay the tree about p */
+  while (q != NNULL)
+    {
+      g = q->par;
+      if (p == q->left)
+	{
+	  if (g == NNULL)
+	    ROTATER (p, q);
+	  else if (q == g->left)
+	    {
+	      ROTATER (q, g);
+	      ROTATER (p, q);
+	    }
+	  else
+	    {
+	      ROTATER (p, q);
+	      ROTATEL (p, g);
+	    }
+	}
+      else
+	{
+	  if (g == NNULL)
+	    ROTATEL (p, q);
+	  else if (q == g->rght)
+	    {
+	      ROTATEL (q, g);
+	      ROTATEL (p, q);
+	    }
+	  else
+	    {
+	      ROTATEL (p, q);
+	      ROTATER (p, g);
+	    }
+	}
+      q = p->par;
+    }
+  return (p);
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/sptree.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/sptree.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/sptree.h	(revision 21083)
@@ -0,0 +1,47 @@
+/**************************************************************************
+ *
+ * sptree.h -- Splay tree code
+ * Copyright (C) 1994  Gary Eddy and Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef SPTREE_H
+#define SPTREE_H
+
+typedef struct set_rec Splay_Tree;
+
+struct set_rec
+  {
+    int no_of_items;
+    unsigned long mem_in_use;
+    int (*cmp) (void *, void *);
+    void *root;
+    void *pool;
+    int pool_chunks;
+  };
+
+Splay_Tree *SP_createset (int (*cmp) (void *, void *));
+void *SP_insert (void *item, Splay_Tree * S);
+void *SP_get_first (Splay_Tree * S);
+void *SP_get_next (Splay_Tree * S);
+void *SP_deletemin (Splay_Tree * S);
+void *SP_member (void *dat, Splay_Tree * S);
+void SP_freeset (Splay_Tree * S);
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/strcasecmp.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/strcasecmp.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/strcasecmp.c	(revision 21083)
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific written prior permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strcasecmp.c	5.5 (Berkeley) 11/24/87";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char charmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+int
+strcasecmp(s1, s2)
+    char *s1, *s2;
+{
+    register unsigned char u1, u2;
+
+    for (;;) {
+	u1 = (unsigned char) *s1++;
+	u2 = (unsigned char) *s2++;
+	if (charmap[u1] != charmap[u2]) {
+	    return charmap[u1] - charmap[u2];
+	}
+	if (u1 == '\0') {
+	    return 0;
+	}
+    }
+}
+
Index: /main/tags/2.38/gsdl/packages/mg/lib/strstr.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/strstr.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/strstr.c	(revision 21083)
@@ -0,0 +1,44 @@
+/* strstr.c -- return the offset of one string within another
+   Copyright (C) 1989, 1990 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by Mike Rendell <michael@cs.mun.ca>.  */
+
+/* Return the starting address of string S2 in S1;
+   return 0 if it is not found. */
+
+char *
+strstr (s1, s2)
+     char *s1;
+     char *s2;
+{
+  int i;
+  char *p1;
+  char *p2;
+  char *s = s1;
+
+  for (p2 = s2, i = 0; *s; p2 = s2, i++, s++)
+    {
+      for (p1 = s; *p1 && *p2 && *p1 == *p2; p1++, p2++)
+	;
+      if (!*p2)
+	break;
+    }
+  if (!*p2)
+    return s1 + i;
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/lib/timing.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/timing.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/timing.c	(revision 21083)
@@ -0,0 +1,234 @@
+/**************************************************************************
+ *
+ * timing.c -- Program timing routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:05  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:32:49  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/08/22  00:24:53  tes
+   * Initial placement under CVS.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+#include "timing.h"
+
+
+/*
+ * Return the time in seconds since 00:00:00 GMT, Jan. 1, 1970 to the
+ * best precision possible
+ *
+ */
+double 
+RealTime (void)
+{
+  return ((double) time (NULL));
+}
+
+
+
+/*
+ * Return the amount of system and user CPU used by the process to date to 
+ * the best precision possible. If user is non-null then it is initialised to 
+ * the user time. If sys is non-null then it is initialised to the system time.
+ *
+ */
+double 
+CPUTime (double *user, double *sys)
+{
+
+#if defined(HAVE_TIMES)
+
+  struct tms buffer;
+  static double clk_tck = 0;
+  double u, s;
+
+  times (&buffer);
+
+  if (clk_tck == 0)
+    clk_tck = CLK_TCK;
+
+  u = (double) buffer.tms_utime / clk_tck;
+  s = (double) buffer.tms_stime / clk_tck;
+  if (user)
+    *user = u;
+  if (sys)
+    *sys = s;
+  return u + s;
+
+#elif defined(HAVE_GETRUSAGE)
+
+  struct rusage ruse;
+  getrusage (RUSAGE_SELF, &ruse);
+  if (user)
+    *user = (double) ruse.ru_utime.tv_sec +
+      (double) ruse.ru_utime.tv_usec / 1000000;
+  if (sys)
+    *sys = (double) ruse.ru_stime.tv_sec +
+      (double) ruse.ru_stime.tv_usec / 1000000;
+  return ((double) ruse.ru_utime.tv_sec + ruse.ru_stime.tv_sec +
+	((double) ruse.ru_utime.tv_usec + ruse.ru_stime.tv_usec) / 1000000);
+
+#else
+
+  /* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  if (user) *user = 0.0;
+  if (sys) *sys = 0.0;
+  return 0.0;
+#else
+  -->Can NOT find a system time routine to use ! !!
+#endif  /* __WIN32__ */
+
+#endif
+
+}
+
+
+
+
+/*
+ * Get the Real and CPU time and store them in a ProgTime structure
+ */
+void 
+GetTime (ProgTime * StartTime)
+{
+  StartTime->RealTime = RealTime ();
+  StartTime->CPUTime = CPUTime (NULL, NULL);
+}
+
+
+
+
+/*
+ * Display the Real and CPU time elapsed since the StartTime anf FinishTime 
+ * structures were initialised. If FinishTime is NULL then FinishTime is
+ * Now.
+ */
+char *
+ElapsedTime (ProgTime * StartTime,
+	     ProgTime * FinishTime)
+{
+  static char buf[50];
+  double Real, CPU, hour, min, sec;
+  if (!FinishTime)
+    {
+      Real = RealTime () - StartTime->RealTime;
+      CPU = CPUTime (NULL, NULL) - StartTime->CPUTime;
+    }
+  else
+    {
+      Real = FinishTime->RealTime - StartTime->RealTime;
+      CPU = FinishTime->CPUTime - StartTime->CPUTime;
+    }
+  hour = floor (CPU / 3600);
+  min = floor ((CPU - hour * 3600) / 60);
+  sec = CPU - hour * 3600 - min * 60;
+  sprintf (buf, "%02.0f:%02.0f:%05.2f cpu, %02d:%02d:%02d elapsed.",
+	   hour, min, sec,
+	   ((int) ceil (Real)) / 3600,
+	   (((int) ceil (Real)) % 3600) / 60, ((int) ceil (Real)) % 60);
+  return (buf);
+}
+
+
+#define MILLION 1000000
+
+/* ===============================================================================
+ * Function: cputime_string
+ * Description:
+ *      Prints out given cpu time into a string buffer.
+ * Input: cpu-time in clock_t or timeval format
+ * Output: pointer to internal buffer 
+ * =============================================================================== */
+
+#ifdef HAVE_TIMES
+char *
+cputime_string (clock_t clk)
+{
+  static char buf[15];
+  double CPU, hour, min, sec;
+
+  CPU = (double) clk / (double) CLK_TCK;
+  hour = floor (CPU / 3600);
+  min = floor ((CPU - hour * 3600) / 60);
+  sec = CPU - hour * 3600 - min * 60;
+  sprintf (buf, "%02.0f:%02.0f:%05.2f", hour, min, sec);
+  return (buf);
+}
+#else
+char *
+cputime_string (struct timeval *t)
+{
+  static char buf[15];
+  double CPU, hour, min, sec;
+
+  CPU = (double) t->tv_sec + (double) t->tv_usec / MILLION;
+  hour = floor (CPU / 3600);
+  min = floor ((CPU - hour * 3600) / 60);
+  sec = CPU - hour * 3600 - min * 60;
+  sprintf (buf, "%02.0f:%02.0f:%05.2f", hour, min, sec);
+  return (buf);
+}
+#endif
+
+
+
+/* ===============================================================================
+ * Function: time_normalise
+ * Description:
+ *      If the micro-second component is negative or over a million,
+ *      then must take the over/under flow and add it to the second component.
+ * Usage:
+ *      Use this routine when you have just been doing straight addition and
+ *      subtraction on the micro-second component. For this could lead to a
+ *      negative number or over a million.
+ *
+ * =============================================================================== */
+
+#ifndef HAVE_TIMES
+
+#ifndef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+static 
+#endif
+void
+time_normalise (struct timeval *t)
+{
+  while (t->tv_usec < 0)
+    {
+      t->tv_usec += MILLION;
+      t->tv_sec--;
+    }
+  while (t->tv_usec > MILLION)
+    {
+      t->tv_usec -= MILLION;
+      t->tv_sec++;
+    }
+}
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/timing.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/timing.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/timing.h	(revision 21083)
@@ -0,0 +1,75 @@
+/**************************************************************************
+ *
+ * timing.h -- Program timing routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_TIMING
+#define H_TIMING
+
+
+#ifdef HAVE_TIMES
+# if TIME_WITH_SYS_TIME
+#  include <sys/times.h>
+#  include <time.h>
+#  ifndef CLK_TCK
+#   define CLK_TCK sysconf(_SC_CLK_TCK)
+#  endif
+# else
+#  if HAVE_SYS_TIME_H
+#   include <sys/time.h>
+#  else
+#   include <time.h>
+#  endif
+# endif
+#else
+/* [RPAP - Feb 97: WIN32 Port] */
+# ifdef __WIN32__
+   struct timeval { long tv_sec, tv_usec; };
+# else
+#  include <sys/time.h>
+#  include <sys/resource.h>
+# endif
+#endif
+
+
+typedef struct
+  {
+    double RealTime, CPUTime;
+  }
+ProgTime;
+
+double RealTime (void);
+
+double CPUTime (double *user, double *sys);
+
+void GetTime (ProgTime * StartTime);
+
+/* FinishTime may be NULL */
+char *ElapsedTime (ProgTime * StartTime, ProgTime * FinishTime);
+
+#ifdef HAVE_TIMES
+char *cputime_string (clock_t clk);
+#else
+void time_normalise (struct timeval *t);
+char *cputime_string (struct timeval *t);
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/unitool.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/unitool.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/unitool.c	(revision 21083)
@@ -0,0 +1,1756 @@
+#include "unitool.h"
+#include "sysfuncs.h"
+
+
+/* unicode_cat_data is a combination of the letter, digit, and
+ * space information in a form that is quick to look up.
+ * The information about each byte is stored in two bits
+ *
+ * 00 - neither letter, digit or space
+ * 01 - letter
+ * 10 - space
+ * 11 - digit
+ *
+ * You can test for letter | space by looking at the right
+ * column
+ */
+unsigned long *unicode_cat_data=NULL;
+
+
+typedef struct unidecompose {
+  unsigned short ch;
+  unsigned short str[3];
+} unidecompose;
+
+typedef struct unirelate {
+  unsigned short ch1;
+  unsigned short ch2;
+} unirelate;
+
+typedef struct unirange {
+  unsigned short first;
+  unsigned short last;
+} unirange;
+
+
+
+/* This decomposition data only includes canonical decompositional
+ * characters.  Any unused bytes are set to 0x0. */
+
+#define NUM_DECOMPOSE_INFO 1269
+static const unidecompose decompose_info[NUM_DECOMPOSE_INFO] = {
+  {0xC0,0x41,0x300,0x0}, {0xC1,0x41,0x301,0x0}, {0xC2,0x41,0x302,0x0}, 
+  {0xC3,0x41,0x303,0x0}, {0xC4,0x41,0x308,0x0}, {0xC5,0x41,0x30A,0x0}, 
+  {0xC7,0x43,0x327,0x0}, {0xC8,0x45,0x300,0x0}, {0xC9,0x45,0x301,0x0}, 
+  {0xCA,0x45,0x302,0x0}, {0xCB,0x45,0x308,0x0}, {0xCC,0x49,0x300,0x0}, 
+  {0xCD,0x49,0x301,0x0}, {0xCE,0x49,0x302,0x0}, {0xCF,0x49,0x308,0x0}, 
+  {0xD1,0x4E,0x303,0x0}, {0xD2,0x4F,0x300,0x0}, {0xD3,0x4F,0x301,0x0}, 
+  {0xD4,0x4F,0x302,0x0}, {0xD5,0x4F,0x303,0x0}, {0xD6,0x4F,0x308,0x0}, 
+  {0xD9,0x55,0x300,0x0}, {0xDA,0x55,0x301,0x0}, {0xDB,0x55,0x302,0x0}, 
+  {0xDC,0x55,0x308,0x0}, {0xDD,0x59,0x301,0x0}, {0xE0,0x61,0x300,0x0}, 
+  {0xE1,0x61,0x301,0x0}, {0xE2,0x61,0x302,0x0}, {0xE3,0x61,0x303,0x0}, 
+  {0xE4,0x61,0x308,0x0}, {0xE5,0x61,0x30A,0x0}, {0xE7,0x63,0x327,0x0}, 
+  {0xE8,0x65,0x300,0x0}, {0xE9,0x65,0x301,0x0}, {0xEA,0x65,0x302,0x0}, 
+  {0xEB,0x65,0x308,0x0}, {0xEC,0x69,0x300,0x0}, {0xED,0x69,0x301,0x0}, 
+  {0xEE,0x69,0x302,0x0}, {0xEF,0x69,0x308,0x0}, {0xF1,0x6E,0x303,0x0}, 
+  {0xF2,0x6F,0x300,0x0}, {0xF3,0x6F,0x301,0x0}, {0xF4,0x6F,0x302,0x0}, 
+  {0xF5,0x6F,0x303,0x0}, {0xF6,0x6F,0x308,0x0}, {0xF9,0x75,0x300,0x0}, 
+  {0xFA,0x75,0x301,0x0}, {0xFB,0x75,0x302,0x0}, {0xFC,0x75,0x308,0x0}, 
+  {0xFD,0x79,0x301,0x0}, {0xFF,0x79,0x308,0x0}, {0x100,0x41,0x304,0x0}, 
+  {0x101,0x61,0x304,0x0}, {0x102,0x41,0x306,0x0}, {0x103,0x61,0x306,0x0}, 
+  {0x104,0x41,0x328,0x0}, {0x105,0x61,0x328,0x0}, {0x106,0x43,0x301,0x0}, 
+  {0x107,0x63,0x301,0x0}, {0x108,0x43,0x302,0x0}, {0x109,0x63,0x302,0x0}, 
+  {0x10A,0x43,0x307,0x0}, {0x10B,0x63,0x307,0x0}, {0x10C,0x43,0x30C,0x0}, 
+  {0x10D,0x63,0x30C,0x0}, {0x10E,0x44,0x30C,0x0}, {0x10F,0x64,0x30C,0x0}, 
+  {0x112,0x45,0x304,0x0}, {0x113,0x65,0x304,0x0}, {0x114,0x45,0x306,0x0}, 
+  {0x115,0x65,0x306,0x0}, {0x116,0x45,0x307,0x0}, {0x117,0x65,0x307,0x0}, 
+  {0x118,0x45,0x328,0x0}, {0x119,0x65,0x328,0x0}, {0x11A,0x45,0x30C,0x0}, 
+  {0x11B,0x65,0x30C,0x0}, {0x11C,0x47,0x302,0x0}, {0x11D,0x67,0x302,0x0}, 
+  {0x11E,0x47,0x306,0x0}, {0x11F,0x67,0x306,0x0}, {0x120,0x47,0x307,0x0}, 
+  {0x121,0x67,0x307,0x0}, {0x122,0x47,0x327,0x0}, {0x123,0x67,0x327,0x0}, 
+  {0x124,0x48,0x302,0x0}, {0x125,0x68,0x302,0x0}, {0x128,0x49,0x303,0x0}, 
+  {0x129,0x69,0x303,0x0}, {0x12A,0x49,0x304,0x0}, {0x12B,0x69,0x304,0x0}, 
+  {0x12C,0x49,0x306,0x0}, {0x12D,0x69,0x306,0x0}, {0x12E,0x49,0x328,0x0}, 
+  {0x12F,0x69,0x328,0x0}, {0x130,0x49,0x307,0x0}, {0x134,0x4A,0x302,0x0}, 
+  {0x135,0x6A,0x302,0x0}, {0x136,0x4B,0x327,0x0}, {0x137,0x6B,0x327,0x0}, 
+  {0x139,0x4C,0x301,0x0}, {0x13A,0x6C,0x301,0x0}, {0x13B,0x4C,0x327,0x0}, 
+  {0x13C,0x6C,0x327,0x0}, {0x13D,0x4C,0x30C,0x0}, {0x13E,0x6C,0x30C,0x0}, 
+  {0x143,0x4E,0x301,0x0}, {0x144,0x6E,0x301,0x0}, {0x145,0x4E,0x327,0x0}, 
+  {0x146,0x6E,0x327,0x0}, {0x147,0x4E,0x30C,0x0}, {0x148,0x6E,0x30C,0x0}, 
+  {0x14C,0x4F,0x304,0x0}, {0x14D,0x6F,0x304,0x0}, {0x14E,0x4F,0x306,0x0}, 
+  {0x14F,0x6F,0x306,0x0}, {0x150,0x4F,0x30B,0x0}, {0x151,0x6F,0x30B,0x0}, 
+  {0x154,0x52,0x301,0x0}, {0x155,0x72,0x301,0x0}, {0x156,0x52,0x327,0x0}, 
+  {0x157,0x72,0x327,0x0}, {0x158,0x52,0x30C,0x0}, {0x159,0x72,0x30C,0x0}, 
+  {0x15A,0x53,0x301,0x0}, {0x15B,0x73,0x301,0x0}, {0x15C,0x53,0x302,0x0}, 
+  {0x15D,0x73,0x302,0x0}, {0x15E,0x53,0x327,0x0}, {0x15F,0x73,0x327,0x0}, 
+  {0x160,0x53,0x30C,0x0}, {0x161,0x73,0x30C,0x0}, {0x162,0x54,0x327,0x0}, 
+  {0x163,0x74,0x327,0x0}, {0x164,0x54,0x30C,0x0}, {0x165,0x74,0x30C,0x0}, 
+  {0x168,0x55,0x303,0x0}, {0x169,0x75,0x303,0x0}, {0x16A,0x55,0x304,0x0}, 
+  {0x16B,0x75,0x304,0x0}, {0x16C,0x55,0x306,0x0}, {0x16D,0x75,0x306,0x0}, 
+  {0x16E,0x55,0x30A,0x0}, {0x16F,0x75,0x30A,0x0}, {0x170,0x55,0x30B,0x0}, 
+  {0x171,0x75,0x30B,0x0}, {0x172,0x55,0x328,0x0}, {0x173,0x75,0x328,0x0}, 
+  {0x174,0x57,0x302,0x0}, {0x175,0x77,0x302,0x0}, {0x176,0x59,0x302,0x0}, 
+  {0x177,0x79,0x302,0x0}, {0x178,0x59,0x308,0x0}, {0x179,0x5A,0x301,0x0}, 
+  {0x17A,0x7A,0x301,0x0}, {0x17B,0x5A,0x307,0x0}, {0x17C,0x7A,0x307,0x0}, 
+  {0x17D,0x5A,0x30C,0x0}, {0x17E,0x7A,0x30C,0x0}, {0x1A0,0x4F,0x31B,0x0}, 
+  {0x1A1,0x6F,0x31B,0x0}, {0x1AF,0x55,0x31B,0x0}, {0x1B0,0x75,0x31B,0x0}, 
+  {0x1CD,0x41,0x30C,0x0}, {0x1CE,0x61,0x30C,0x0}, {0x1CF,0x49,0x30C,0x0}, 
+  {0x1D0,0x69,0x30C,0x0}, {0x1D1,0x4F,0x30C,0x0}, {0x1D2,0x6F,0x30C,0x0}, 
+  {0x1D3,0x55,0x30C,0x0}, {0x1D4,0x75,0x30C,0x0}, {0x1D5,0xDC,0x304,0x0}, 
+  {0x1D6,0xFC,0x304,0x0}, {0x1D7,0xDC,0x301,0x0}, {0x1D8,0xFC,0x301,0x0}, 
+  {0x1D9,0xDC,0x30C,0x0}, {0x1DA,0xFC,0x30C,0x0}, {0x1DB,0xDC,0x300,0x0}, 
+  {0x1DC,0xFC,0x300,0x0}, {0x1DE,0xC4,0x304,0x0}, {0x1DF,0xE4,0x304,0x0}, 
+  {0x1E0,0x41,0x307,0x304}, {0x1E1,0x61,0x307,0x304}, {0x1E2,0xC6,0x304,0x0}, 
+  {0x1E3,0xE6,0x304,0x0}, {0x1E6,0x47,0x30C,0x0}, {0x1E7,0x67,0x30C,0x0}, 
+  {0x1E8,0x4B,0x30C,0x0}, {0x1E9,0x6B,0x30C,0x0}, {0x1EA,0x4F,0x328,0x0}, 
+  {0x1EB,0x6F,0x328,0x0}, {0x1EC,0x1EA,0x304,0x0}, {0x1ED,0x1EB,0x304,0x0}, 
+  {0x1EE,0x1B7,0x30C,0x0}, {0x1EF,0x292,0x30C,0x0}, {0x1F0,0x6A,0x30C,0x0}, 
+  {0x1F4,0x47,0x301,0x0}, {0x1F5,0x67,0x301,0x0}, {0x1FA,0xC5,0x301,0x0}, 
+  {0x1FB,0xE5,0x301,0x0}, {0x1FC,0xC6,0x301,0x0}, {0x1FD,0xE6,0x301,0x0}, 
+  {0x1FE,0xD8,0x301,0x0}, {0x1FF,0xF8,0x301,0x0}, {0x200,0x41,0x30F,0x0}, 
+  {0x201,0x61,0x30F,0x0}, {0x202,0x41,0x311,0x0}, {0x203,0x61,0x311,0x0}, 
+  {0x204,0x45,0x30F,0x0}, {0x205,0x65,0x30F,0x0}, {0x206,0x45,0x311,0x0}, 
+  {0x207,0x65,0x311,0x0}, {0x208,0x49,0x30F,0x0}, {0x209,0x69,0x30F,0x0}, 
+  {0x20A,0x49,0x311,0x0}, {0x20B,0x69,0x311,0x0}, {0x20C,0x4F,0x30F,0x0}, 
+  {0x20D,0x6F,0x30F,0x0}, {0x20E,0x4F,0x311,0x0}, {0x20F,0x6F,0x311,0x0}, 
+  {0x210,0x52,0x30F,0x0}, {0x211,0x72,0x30F,0x0}, {0x212,0x52,0x311,0x0}, 
+  {0x213,0x72,0x311,0x0}, {0x214,0x55,0x30F,0x0}, {0x215,0x75,0x30F,0x0}, 
+  {0x216,0x55,0x311,0x0}, {0x217,0x75,0x311,0x0}, {0x310,0x306,0x307,0x0}, 
+  {0x340,0x300,0x0,0x0}, {0x341,0x301,0x0,0x0}, {0x343,0x313,0x0,0x0}, 
+  {0x344,0x308,0x30D,0x0}, {0x374,0x2B9,0x0,0x0}, {0x37E,0x3B,0x0,0x0}, 
+  {0x385,0xA8,0x30D,0x0}, {0x386,0x391,0x30D,0x0}, {0x387,0xB7,0x0,0x0}, 
+  {0x388,0x395,0x30D,0x0}, {0x389,0x397,0x30D,0x0}, {0x38A,0x399,0x30D,0x0}, 
+  {0x38C,0x39F,0x30D,0x0}, {0x38E,0x3A5,0x30D,0x0}, {0x38F,0x3A9,0x30D,0x0}, 
+  {0x390,0x3B9,0x344,0x0}, {0x3AA,0x399,0x308,0x0}, {0x3AB,0x3A5,0x308,0x0}, 
+  {0x3AC,0x3B1,0x30D,0x0}, {0x3AD,0x3B5,0x30D,0x0}, {0x3AE,0x3B7,0x30D,0x0}, 
+  {0x3AF,0x3B9,0x30D,0x0}, {0x3B0,0x3C5,0x344,0x0}, {0x3CA,0x3B9,0x308,0x0}, 
+  {0x3CB,0x3C5,0x308,0x0}, {0x3CC,0x3BF,0x30D,0x0}, {0x3CD,0x3C5,0x30D,0x0}, 
+  {0x3CE,0x3C9,0x30D,0x0}, {0x3D3,0x3D2,0x30D,0x0}, {0x3D4,0x3D2,0x308,0x0}, 
+  {0x401,0x415,0x308,0x0}, {0x403,0x413,0x301,0x0}, {0x407,0x406,0x308,0x0}, 
+  {0x40C,0x41A,0x301,0x0}, {0x40E,0x423,0x306,0x0}, {0x419,0x418,0x306,0x0}, 
+  {0x439,0x438,0x306,0x0}, {0x451,0x435,0x308,0x0}, {0x453,0x433,0x301,0x0}, 
+  {0x457,0x456,0x308,0x0}, {0x45C,0x43A,0x301,0x0}, {0x45E,0x443,0x306,0x0}, 
+  {0x476,0x474,0x30F,0x0}, {0x477,0x475,0x30F,0x0}, {0x4C1,0x416,0x306,0x0}, 
+  {0x4C2,0x436,0x306,0x0}, {0x4D0,0x410,0x306,0x0}, {0x4D1,0x430,0x306,0x0}, 
+  {0x4D2,0x410,0x308,0x0}, {0x4D3,0x430,0x308,0x0}, {0x4D6,0x415,0x306,0x0}, 
+  {0x4D7,0x435,0x306,0x0}, {0x4DA,0x4D8,0x308,0x0}, {0x4DB,0x4D9,0x308,0x0}, 
+  {0x4DC,0x416,0x308,0x0}, {0x4DD,0x436,0x308,0x0}, {0x4DE,0x417,0x308,0x0}, 
+  {0x4DF,0x437,0x308,0x0}, {0x4E2,0x418,0x304,0x0}, {0x4E3,0x438,0x304,0x0}, 
+  {0x4E4,0x418,0x308,0x0}, {0x4E5,0x438,0x308,0x0}, {0x4E6,0x41E,0x308,0x0}, 
+  {0x4E7,0x43E,0x308,0x0}, {0x4EA,0x4E8,0x308,0x0}, {0x4EB,0x4E9,0x308,0x0}, 
+  {0x4EE,0x423,0x304,0x0}, {0x4EF,0x443,0x304,0x0}, {0x4F0,0x423,0x308,0x0}, 
+  {0x4F1,0x443,0x308,0x0}, {0x4F2,0x423,0x30B,0x0}, {0x4F3,0x443,0x30B,0x0}, 
+  {0x4F4,0x427,0x308,0x0}, {0x4F5,0x447,0x308,0x0}, {0x4F8,0x42B,0x308,0x0}, 
+  {0x4F9,0x44B,0x308,0x0}, {0x929,0x928,0x93C,0x0}, {0x931,0x930,0x93C,0x0}, 
+  {0x934,0x933,0x93C,0x0}, {0x958,0x915,0x93C,0x0}, {0x959,0x916,0x93C,0x0}, 
+  {0x95A,0x917,0x93C,0x0}, {0x95B,0x91C,0x93C,0x0}, {0x95C,0x921,0x93C,0x0}, 
+  {0x95D,0x922,0x93C,0x0}, {0x95E,0x92B,0x93C,0x0}, {0x95F,0x92F,0x93C,0x0}, 
+  {0x9B0,0x9AC,0x9BC,0x0}, {0x9CB,0x9C7,0x9BE,0x0}, {0x9CC,0x9C7,0x9D7,0x0}, 
+  {0x9DC,0x9A1,0x9BC,0x0}, {0x9DD,0x9A2,0x9BC,0x0}, {0x9DF,0x9AF,0x9BC,0x0}, 
+  {0xA59,0xA16,0xA3C,0x0}, {0xA5A,0xA17,0xA3C,0x0}, {0xA5B,0xA1C,0xA3C,0x0}, 
+  {0xA5C,0xA21,0xA3C,0x0}, {0xA5E,0xA2B,0xA3C,0x0}, {0xB48,0xB47,0xB56,0x0}, 
+  {0xB4B,0xB47,0xB3E,0x0}, {0xB4C,0xB47,0xB57,0x0}, {0xB5C,0xB21,0xB3C,0x0}, 
+  {0xB5D,0xB22,0xB3C,0x0}, {0xB5F,0xB2F,0xB3C,0x0}, {0xB94,0xB92,0xBD7,0x0}, 
+  {0xBCA,0xBC6,0xBBE,0x0}, {0xBCB,0xBC7,0xBBE,0x0}, {0xBCC,0xBC6,0xBD7,0x0}, 
+  {0xC48,0xC46,0xC56,0x0}, {0xCC0,0xCBF,0xCD5,0x0}, {0xCC7,0xCC6,0xCD5,0x0}, 
+  {0xCC8,0xCC6,0xCD6,0x0}, {0xCCA,0xCC6,0xCC2,0x0}, {0xCCB,0xCC6,0xCC2,0xCD5}, 
+  {0xD4A,0xD46,0xD3E,0x0}, {0xD4B,0xD47,0xD3E,0x0}, {0xD4C,0xD46,0xD57,0x0}, 
+  {0xE33,0xE4D,0xE32,0x0}, {0xEB3,0xECD,0xEB2,0x0}, {0xF43,0xF42,0xFB7,0x0}, 
+  {0xF4D,0xF4C,0xFB7,0x0}, {0xF52,0xF51,0xFB7,0x0}, {0xF57,0xF56,0xFB7,0x0}, 
+  {0xF5C,0xF5B,0xFB7,0x0}, {0xF69,0xF40,0xFB5,0x0}, {0xF73,0xF72,0xF71,0x0}, 
+  {0xF75,0xF71,0xF74,0x0}, {0xF76,0xFB2,0xF80,0x0}, {0xF77,0xF76,0xF71,0x0}, 
+  {0xF78,0xFB3,0xF80,0x0}, {0xF79,0xF78,0xF71,0x0}, {0xF81,0xF80,0xF71,0x0}, 
+  {0xF93,0xF92,0xFB7,0x0}, {0xF9D,0xF9C,0xFB7,0x0}, {0xFA2,0xFA1,0xFB7,0x0}, 
+  {0xFA7,0xFA6,0xFB7,0x0}, {0xFAC,0xFAB,0xFB7,0x0}, {0xFB9,0xF90,0xFB5,0x0}, 
+  {0x1E00,0x41,0x325,0x0}, {0x1E01,0x61,0x325,0x0}, {0x1E02,0x42,0x307,0x0}, 
+  {0x1E03,0x62,0x307,0x0}, {0x1E04,0x42,0x323,0x0}, {0x1E05,0x62,0x323,0x0}, 
+  {0x1E06,0x42,0x331,0x0}, {0x1E07,0x62,0x331,0x0}, {0x1E08,0xC7,0x301,0x0}, 
+  {0x1E09,0xE7,0x301,0x0}, {0x1E0A,0x44,0x307,0x0}, {0x1E0B,0x64,0x307,0x0}, 
+  {0x1E0C,0x44,0x323,0x0}, {0x1E0D,0x64,0x323,0x0}, {0x1E0E,0x44,0x331,0x0}, 
+  {0x1E0F,0x64,0x331,0x0}, {0x1E10,0x44,0x327,0x0}, {0x1E11,0x64,0x327,0x0}, 
+  {0x1E12,0x44,0x32D,0x0}, {0x1E13,0x64,0x32D,0x0}, {0x1E14,0x112,0x300,0x0}, 
+  {0x1E15,0x113,0x300,0x0}, {0x1E16,0x112,0x301,0x0}, {0x1E17,0x113,0x301,0x0}, 
+  {0x1E18,0x45,0x32D,0x0}, {0x1E19,0x65,0x32D,0x0}, {0x1E1A,0x45,0x330,0x0}, 
+  {0x1E1B,0x65,0x330,0x0}, {0x1E1C,0x114,0x327,0x0}, {0x1E1D,0x115,0x327,0x0}, 
+  {0x1E1E,0x46,0x307,0x0}, {0x1E1F,0x66,0x307,0x0}, {0x1E20,0x47,0x304,0x0}, 
+  {0x1E21,0x67,0x304,0x0}, {0x1E22,0x48,0x307,0x0}, {0x1E23,0x68,0x307,0x0}, 
+  {0x1E24,0x48,0x323,0x0}, {0x1E25,0x68,0x323,0x0}, {0x1E26,0x48,0x308,0x0}, 
+  {0x1E27,0x68,0x308,0x0}, {0x1E28,0x48,0x327,0x0}, {0x1E29,0x68,0x327,0x0}, 
+  {0x1E2A,0x48,0x32E,0x0}, {0x1E2B,0x68,0x32E,0x0}, {0x1E2C,0x49,0x330,0x0}, 
+  {0x1E2D,0x69,0x330,0x0}, {0x1E2E,0xCF,0x301,0x0}, {0x1E2F,0xEF,0x301,0x0}, 
+  {0x1E30,0x4B,0x301,0x0}, {0x1E31,0x6B,0x301,0x0}, {0x1E32,0x4B,0x323,0x0}, 
+  {0x1E33,0x6B,0x323,0x0}, {0x1E34,0x4B,0x331,0x0}, {0x1E35,0x6B,0x331,0x0}, 
+  {0x1E36,0x4C,0x323,0x0}, {0x1E37,0x6C,0x323,0x0}, {0x1E38,0x1E36,0x304,0x0}, 
+  {0x1E39,0x1E37,0x304,0x0}, {0x1E3A,0x4C,0x331,0x0}, {0x1E3B,0x6C,0x331,0x0}, 
+  {0x1E3C,0x4C,0x32D,0x0}, {0x1E3D,0x6C,0x32D,0x0}, {0x1E3E,0x4D,0x301,0x0}, 
+  {0x1E3F,0x6D,0x301,0x0}, {0x1E40,0x4D,0x307,0x0}, {0x1E41,0x6D,0x307,0x0}, 
+  {0x1E42,0x4D,0x323,0x0}, {0x1E43,0x6D,0x323,0x0}, {0x1E44,0x4E,0x307,0x0}, 
+  {0x1E45,0x6E,0x307,0x0}, {0x1E46,0x4E,0x323,0x0}, {0x1E47,0x6E,0x323,0x0}, 
+  {0x1E48,0x4E,0x331,0x0}, {0x1E49,0x6E,0x331,0x0}, {0x1E4A,0x4E,0x32D,0x0}, 
+  {0x1E4B,0x6E,0x32D,0x0}, {0x1E4C,0xD5,0x301,0x0}, {0x1E4D,0xF5,0x301,0x0}, 
+  {0x1E4E,0xD5,0x308,0x0}, {0x1E4F,0xF5,0x308,0x0}, {0x1E50,0x14C,0x300,0x0}, 
+  {0x1E51,0x14D,0x300,0x0}, {0x1E52,0x14C,0x301,0x0}, {0x1E53,0x14D,0x301,0x0}, 
+  {0x1E54,0x50,0x301,0x0}, {0x1E55,0x70,0x301,0x0}, {0x1E56,0x50,0x307,0x0}, 
+  {0x1E57,0x70,0x307,0x0}, {0x1E58,0x52,0x307,0x0}, {0x1E59,0x72,0x307,0x0}, 
+  {0x1E5A,0x52,0x323,0x0}, {0x1E5B,0x72,0x323,0x0}, {0x1E5C,0x1E5A,0x304,0x0}, 
+  {0x1E5D,0x1E5B,0x304,0x0}, {0x1E5E,0x52,0x331,0x0}, {0x1E5F,0x72,0x331,0x0}, 
+  {0x1E60,0x53,0x307,0x0}, {0x1E61,0x73,0x307,0x0}, {0x1E62,0x53,0x323,0x0}, 
+  {0x1E63,0x73,0x323,0x0}, {0x1E64,0x15A,0x307,0x0}, {0x1E65,0x15B,0x307,0x0}, 
+  {0x1E66,0x160,0x307,0x0}, {0x1E67,0x161,0x307,0x0}, {0x1E68,0x1E62,0x307,0x0}, 
+  {0x1E69,0x1E63,0x307,0x0}, {0x1E6A,0x54,0x307,0x0}, {0x1E6B,0x74,0x307,0x0}, 
+  {0x1E6C,0x54,0x323,0x0}, {0x1E6D,0x74,0x323,0x0}, {0x1E6E,0x54,0x331,0x0}, 
+  {0x1E6F,0x74,0x331,0x0}, {0x1E70,0x54,0x32D,0x0}, {0x1E71,0x74,0x32D,0x0}, 
+  {0x1E72,0x55,0x324,0x0}, {0x1E73,0x75,0x324,0x0}, {0x1E74,0x55,0x330,0x0}, 
+  {0x1E75,0x75,0x330,0x0}, {0x1E76,0x55,0x32D,0x0}, {0x1E77,0x75,0x32D,0x0}, 
+  {0x1E78,0x168,0x301,0x0}, {0x1E79,0x169,0x301,0x0}, {0x1E7A,0x16A,0x308,0x0}, 
+  {0x1E7B,0x16B,0x308,0x0}, {0x1E7C,0x56,0x303,0x0}, {0x1E7D,0x76,0x303,0x0}, 
+  {0x1E7E,0x56,0x323,0x0}, {0x1E7F,0x76,0x323,0x0}, {0x1E80,0x57,0x300,0x0}, 
+  {0x1E81,0x77,0x300,0x0}, {0x1E82,0x57,0x301,0x0}, {0x1E83,0x77,0x301,0x0}, 
+  {0x1E84,0x57,0x308,0x0}, {0x1E85,0x77,0x308,0x0}, {0x1E86,0x57,0x307,0x0}, 
+  {0x1E87,0x77,0x307,0x0}, {0x1E88,0x57,0x323,0x0}, {0x1E89,0x77,0x323,0x0}, 
+  {0x1E8A,0x58,0x307,0x0}, {0x1E8B,0x78,0x307,0x0}, {0x1E8C,0x58,0x308,0x0}, 
+  {0x1E8D,0x78,0x308,0x0}, {0x1E8E,0x59,0x307,0x0}, {0x1E8F,0x79,0x307,0x0}, 
+  {0x1E90,0x5A,0x302,0x0}, {0x1E91,0x7A,0x302,0x0}, {0x1E92,0x5A,0x323,0x0}, 
+  {0x1E93,0x7A,0x323,0x0}, {0x1E94,0x5A,0x331,0x0}, {0x1E95,0x7A,0x331,0x0}, 
+  {0x1E96,0x68,0x331,0x0}, {0x1E97,0x74,0x308,0x0}, {0x1E98,0x77,0x30A,0x0}, 
+  {0x1E99,0x79,0x30A,0x0}, {0x1E9B,0x17F,0x307,0x0}, {0x1EA0,0x41,0x323,0x0}, 
+  {0x1EA1,0x61,0x323,0x0}, {0x1EA2,0x41,0x309,0x0}, {0x1EA3,0x61,0x309,0x0}, 
+  {0x1EA4,0xC2,0x301,0x0}, {0x1EA5,0xE2,0x301,0x0}, {0x1EA6,0xC2,0x300,0x0}, 
+  {0x1EA7,0xE2,0x300,0x0}, {0x1EA8,0xC2,0x309,0x0}, {0x1EA9,0xE2,0x309,0x0}, 
+  {0x1EAA,0xC2,0x303,0x0}, {0x1EAB,0xE2,0x303,0x0}, {0x1EAC,0xC2,0x323,0x0}, 
+  {0x1EAD,0xE2,0x323,0x0}, {0x1EAE,0x102,0x301,0x0}, {0x1EAF,0x103,0x301,0x0}, 
+  {0x1EB0,0x102,0x300,0x0}, {0x1EB1,0x103,0x300,0x0}, {0x1EB2,0x102,0x309,0x0}, 
+  {0x1EB3,0x103,0x309,0x0}, {0x1EB4,0x102,0x303,0x0}, {0x1EB5,0x103,0x303,0x0}, 
+  {0x1EB6,0x102,0x323,0x0}, {0x1EB7,0x103,0x323,0x0}, {0x1EB8,0x45,0x323,0x0}, 
+  {0x1EB9,0x65,0x323,0x0}, {0x1EBA,0x45,0x309,0x0}, {0x1EBB,0x65,0x309,0x0}, 
+  {0x1EBC,0x45,0x303,0x0}, {0x1EBD,0x65,0x303,0x0}, {0x1EBE,0xCA,0x301,0x0}, 
+  {0x1EBF,0xEA,0x301,0x0}, {0x1EC0,0xCA,0x300,0x0}, {0x1EC1,0xEA,0x300,0x0}, 
+  {0x1EC2,0xCA,0x309,0x0}, {0x1EC3,0xEA,0x309,0x0}, {0x1EC4,0xCA,0x303,0x0}, 
+  {0x1EC5,0xEA,0x303,0x0}, {0x1EC6,0xCA,0x323,0x0}, {0x1EC7,0xEA,0x323,0x0}, 
+  {0x1EC8,0x49,0x309,0x0}, {0x1EC9,0x69,0x309,0x0}, {0x1ECA,0x49,0x323,0x0}, 
+  {0x1ECB,0x69,0x323,0x0}, {0x1ECC,0x4F,0x323,0x0}, {0x1ECD,0x6F,0x323,0x0}, 
+  {0x1ECE,0x4F,0x309,0x0}, {0x1ECF,0x6F,0x309,0x0}, {0x1ED0,0xD4,0x301,0x0}, 
+  {0x1ED1,0xF4,0x301,0x0}, {0x1ED2,0xD4,0x300,0x0}, {0x1ED3,0xF4,0x300,0x0}, 
+  {0x1ED4,0xD4,0x309,0x0}, {0x1ED5,0xF4,0x309,0x0}, {0x1ED6,0xD4,0x303,0x0}, 
+  {0x1ED7,0xF4,0x303,0x0}, {0x1ED8,0xD4,0x323,0x0}, {0x1ED9,0xF4,0x323,0x0}, 
+  {0x1EDA,0x1A0,0x301,0x0}, {0x1EDB,0x1A1,0x301,0x0}, {0x1EDC,0x1A0,0x300,0x0}, 
+  {0x1EDD,0x1A1,0x300,0x0}, {0x1EDE,0x1A0,0x309,0x0}, {0x1EDF,0x1A1,0x309,0x0}, 
+  {0x1EE0,0x1A0,0x303,0x0}, {0x1EE1,0x1A1,0x303,0x0}, {0x1EE2,0x1A0,0x323,0x0}, 
+  {0x1EE3,0x1A1,0x323,0x0}, {0x1EE4,0x55,0x323,0x0}, {0x1EE5,0x75,0x323,0x0}, 
+  {0x1EE6,0x55,0x309,0x0}, {0x1EE7,0x75,0x309,0x0}, {0x1EE8,0x1AF,0x301,0x0}, 
+  {0x1EE9,0x1B0,0x301,0x0}, {0x1EEA,0x1AF,0x300,0x0}, {0x1EEB,0x1B0,0x300,0x0}, 
+  {0x1EEC,0x1AF,0x309,0x0}, {0x1EED,0x1B0,0x309,0x0}, {0x1EEE,0x1AF,0x303,0x0}, 
+  {0x1EEF,0x1B0,0x303,0x0}, {0x1EF0,0x1AF,0x323,0x0}, {0x1EF1,0x1B0,0x323,0x0}, 
+  {0x1EF2,0x59,0x300,0x0}, {0x1EF3,0x79,0x300,0x0}, {0x1EF4,0x59,0x323,0x0}, 
+  {0x1EF5,0x79,0x323,0x0}, {0x1EF6,0x59,0x309,0x0}, {0x1EF7,0x79,0x309,0x0}, 
+  {0x1EF8,0x59,0x303,0x0}, {0x1EF9,0x79,0x303,0x0}, {0x1F00,0x3B1,0x313,0x0}, 
+  {0x1F01,0x3B1,0x314,0x0}, {0x1F02,0x1F00,0x300,0x0}, {0x1F03,0x1F01,0x300,0x0}, 
+  {0x1F04,0x1F00,0x301,0x0}, {0x1F05,0x1F01,0x301,0x0}, {0x1F06,0x1F00,0x342,0x0}, 
+  {0x1F07,0x1F01,0x342,0x0}, {0x1F08,0x391,0x313,0x0}, {0x1F09,0x391,0x314,0x0}, 
+  {0x1F0A,0x1F08,0x300,0x0}, {0x1F0B,0x1F09,0x300,0x0}, {0x1F0C,0x1F08,0x301,0x0}, 
+  {0x1F0D,0x1F09,0x301,0x0}, {0x1F0E,0x1F08,0x342,0x0}, {0x1F0F,0x1F09,0x342,0x0}, 
+  {0x1F10,0x3B5,0x313,0x0}, {0x1F11,0x3B5,0x314,0x0}, {0x1F12,0x1F10,0x300,0x0}, 
+  {0x1F13,0x1F11,0x300,0x0}, {0x1F14,0x1F10,0x301,0x0}, {0x1F15,0x1F11,0x301,0x0}, 
+  {0x1F18,0x395,0x313,0x0}, {0x1F19,0x395,0x314,0x0}, {0x1F1A,0x1F18,0x300,0x0}, 
+  {0x1F1B,0x1F19,0x300,0x0}, {0x1F1C,0x1F18,0x301,0x0}, {0x1F1D,0x1F19,0x301,0x0}, 
+  {0x1F20,0x3B7,0x313,0x0}, {0x1F21,0x3B7,0x314,0x0}, {0x1F22,0x1F20,0x300,0x0}, 
+  {0x1F23,0x1F21,0x300,0x0}, {0x1F24,0x1F20,0x301,0x0}, {0x1F25,0x1F21,0x301,0x0}, 
+  {0x1F26,0x1F20,0x342,0x0}, {0x1F27,0x1F21,0x342,0x0}, {0x1F28,0x397,0x313,0x0}, 
+  {0x1F29,0x397,0x314,0x0}, {0x1F2A,0x1F28,0x300,0x0}, {0x1F2B,0x1F29,0x300,0x0}, 
+  {0x1F2C,0x1F28,0x301,0x0}, {0x1F2D,0x1F29,0x301,0x0}, {0x1F2E,0x1F28,0x342,0x0}, 
+  {0x1F2F,0x1F29,0x342,0x0}, {0x1F30,0x3B9,0x313,0x0}, {0x1F31,0x3B9,0x314,0x0}, 
+  {0x1F32,0x1F30,0x300,0x0}, {0x1F33,0x1F31,0x300,0x0}, {0x1F34,0x1F30,0x301,0x0}, 
+  {0x1F35,0x1F31,0x301,0x0}, {0x1F36,0x1F30,0x342,0x0}, {0x1F37,0x1F31,0x342,0x0}, 
+  {0x1F38,0x399,0x313,0x0}, {0x1F39,0x399,0x314,0x0}, {0x1F3A,0x1F38,0x300,0x0}, 
+  {0x1F3B,0x1F39,0x300,0x0}, {0x1F3C,0x1F38,0x301,0x0}, {0x1F3D,0x1F39,0x301,0x0}, 
+  {0x1F3E,0x1F38,0x342,0x0}, {0x1F3F,0x1F39,0x342,0x0}, {0x1F40,0x3BF,0x313,0x0}, 
+  {0x1F41,0x3BF,0x314,0x0}, {0x1F42,0x1F40,0x300,0x0}, {0x1F43,0x1F41,0x300,0x0}, 
+  {0x1F44,0x1F40,0x301,0x0}, {0x1F45,0x1F41,0x301,0x0}, {0x1F48,0x39F,0x313,0x0}, 
+  {0x1F49,0x39F,0x314,0x0}, {0x1F4A,0x1F48,0x300,0x0}, {0x1F4B,0x1F49,0x300,0x0}, 
+  {0x1F4C,0x1F48,0x301,0x0}, {0x1F4D,0x1F49,0x301,0x0}, {0x1F50,0x3C5,0x313,0x0}, 
+  {0x1F51,0x3C5,0x314,0x0}, {0x1F52,0x1F50,0x300,0x0}, {0x1F53,0x1F51,0x300,0x0}, 
+  {0x1F54,0x1F50,0x301,0x0}, {0x1F55,0x1F51,0x301,0x0}, {0x1F56,0x1F50,0x342,0x0}, 
+  {0x1F57,0x1F51,0x342,0x0}, {0x1F59,0x3A5,0x314,0x0}, {0x1F5B,0x1F59,0x300,0x0}, 
+  {0x1F5D,0x1F59,0x301,0x0}, {0x1F5F,0x1F59,0x342,0x0}, {0x1F60,0x3C9,0x313,0x0}, 
+  {0x1F61,0x3C9,0x314,0x0}, {0x1F62,0x1F60,0x300,0x0}, {0x1F63,0x1F61,0x300,0x0}, 
+  {0x1F64,0x1F60,0x301,0x0}, {0x1F65,0x1F61,0x301,0x0}, {0x1F66,0x1F60,0x342,0x0}, 
+  {0x1F67,0x1F61,0x342,0x0}, {0x1F68,0x3A9,0x313,0x0}, {0x1F69,0x3A9,0x314,0x0}, 
+  {0x1F6A,0x1F68,0x300,0x0}, {0x1F6B,0x1F69,0x300,0x0}, {0x1F6C,0x1F68,0x301,0x0}, 
+  {0x1F6D,0x1F69,0x301,0x0}, {0x1F6E,0x1F68,0x342,0x0}, {0x1F6F,0x1F69,0x342,0x0}, 
+  {0x1F70,0x3B1,0x300,0x0}, {0x1F71,0x3B1,0x301,0x0}, {0x1F72,0x3B5,0x300,0x0}, 
+  {0x1F73,0x3B5,0x301,0x0}, {0x1F74,0x3B7,0x300,0x0}, {0x1F75,0x3B7,0x301,0x0}, 
+  {0x1F76,0x3B9,0x300,0x0}, {0x1F77,0x3B9,0x301,0x0}, {0x1F78,0x3BF,0x300,0x0}, 
+  {0x1F79,0x3BF,0x301,0x0}, {0x1F7A,0x3C5,0x300,0x0}, {0x1F7B,0x3C5,0x301,0x0}, 
+  {0x1F7C,0x3C9,0x300,0x0}, {0x1F7D,0x3C9,0x301,0x0}, {0x1F80,0x1F00,0x345,0x0}, 
+  {0x1F81,0x1F01,0x345,0x0}, {0x1F82,0x1F02,0x345,0x0}, {0x1F83,0x1F03,0x345,0x0}, 
+  {0x1F84,0x1F04,0x345,0x0}, {0x1F85,0x1F05,0x345,0x0}, {0x1F86,0x1F06,0x345,0x0}, 
+  {0x1F87,0x1F07,0x345,0x0}, {0x1F88,0x1F08,0x345,0x0}, {0x1F89,0x1F09,0x345,0x0}, 
+  {0x1F8A,0x1F0A,0x345,0x0}, {0x1F8B,0x1F0B,0x345,0x0}, {0x1F8C,0x1F0C,0x345,0x0}, 
+  {0x1F8D,0x1F0D,0x345,0x0}, {0x1F8E,0x1F0E,0x345,0x0}, {0x1F8F,0x1F0F,0x345,0x0}, 
+  {0x1F90,0x1F20,0x345,0x0}, {0x1F91,0x1F21,0x345,0x0}, {0x1F92,0x1F22,0x345,0x0}, 
+  {0x1F93,0x1F23,0x345,0x0}, {0x1F94,0x1F24,0x345,0x0}, {0x1F95,0x1F25,0x345,0x0}, 
+  {0x1F96,0x1F26,0x345,0x0}, {0x1F97,0x1F27,0x345,0x0}, {0x1F98,0x1F28,0x345,0x0}, 
+  {0x1F99,0x1F29,0x345,0x0}, {0x1F9A,0x1F2A,0x345,0x0}, {0x1F9B,0x1F2B,0x345,0x0}, 
+  {0x1F9C,0x1F2C,0x345,0x0}, {0x1F9D,0x1F2D,0x345,0x0}, {0x1F9E,0x1F2E,0x345,0x0}, 
+  {0x1F9F,0x1F2F,0x345,0x0}, {0x1FA0,0x1F60,0x345,0x0}, {0x1FA1,0x1F61,0x345,0x0}, 
+  {0x1FA2,0x1F62,0x345,0x0}, {0x1FA3,0x1F63,0x345,0x0}, {0x1FA4,0x1F64,0x345,0x0}, 
+  {0x1FA5,0x1F65,0x345,0x0}, {0x1FA6,0x1F66,0x345,0x0}, {0x1FA7,0x1F67,0x345,0x0}, 
+  {0x1FA8,0x1F68,0x345,0x0}, {0x1FA9,0x1F69,0x345,0x0}, {0x1FAA,0x1F6A,0x345,0x0}, 
+  {0x1FAB,0x1F6B,0x345,0x0}, {0x1FAC,0x1F6C,0x345,0x0}, {0x1FAD,0x1F6D,0x345,0x0}, 
+  {0x1FAE,0x1F6E,0x345,0x0}, {0x1FAF,0x1F6F,0x345,0x0}, {0x1FB0,0x3B1,0x306,0x0}, 
+  {0x1FB1,0x3B1,0x304,0x0}, {0x1FB2,0x1F70,0x345,0x0}, {0x1FB3,0x3B1,0x345,0x0}, 
+  {0x1FB4,0x1F71,0x345,0x0}, {0x1FB6,0x3B1,0x342,0x0}, {0x1FB7,0x1FB6,0x345,0x0}, 
+  {0x1FB8,0x391,0x306,0x0}, {0x1FB9,0x391,0x304,0x0}, {0x1FBA,0x391,0x300,0x0}, 
+  {0x1FBB,0x391,0x301,0x0}, {0x1FBC,0x391,0x345,0x0}, {0x1FBE,0x3B9,0x0,0x0}, 
+  {0x1FC1,0xA8,0x342,0x0}, {0x1FC2,0x1F74,0x345,0x0}, {0x1FC3,0x3B7,0x345,0x0}, 
+  {0x1FC4,0x1F75,0x345,0x0}, {0x1FC6,0x3B7,0x342,0x0}, {0x1FC7,0x1FC6,0x345,0x0}, 
+  {0x1FC8,0x395,0x300,0x0}, {0x1FC9,0x395,0x301,0x0}, {0x1FCA,0x397,0x300,0x0}, 
+  {0x1FCB,0x397,0x301,0x0}, {0x1FCC,0x397,0x345,0x0}, {0x1FCD,0x1FBF,0x300,0x0}, 
+  {0x1FCE,0x1FBF,0x301,0x0}, {0x1FCF,0x1FBF,0x342,0x0}, {0x1FD0,0x3B9,0x306,0x0}, 
+  {0x1FD1,0x3B9,0x304,0x0}, {0x1FD2,0x3CA,0x300,0x0}, {0x1FD3,0x3CA,0x301,0x0}, 
+  {0x1FD6,0x3B9,0x342,0x0}, {0x1FD7,0x3CA,0x342,0x0}, {0x1FD8,0x399,0x306,0x0}, 
+  {0x1FD9,0x399,0x304,0x0}, {0x1FDA,0x399,0x300,0x0}, {0x1FDB,0x399,0x301,0x0}, 
+  {0x1FDD,0x1FFE,0x300,0x0}, {0x1FDE,0x1FFE,0x301,0x0}, {0x1FDF,0x1FFE,0x342,0x0}, 
+  {0x1FE0,0x3C5,0x306,0x0}, {0x1FE1,0x3C5,0x304,0x0}, {0x1FE2,0x3CB,0x300,0x0}, 
+  {0x1FE3,0x3CB,0x301,0x0}, {0x1FE4,0x3C1,0x313,0x0}, {0x1FE5,0x3C1,0x314,0x0}, 
+  {0x1FE6,0x3C5,0x342,0x0}, {0x1FE7,0x3CB,0x342,0x0}, {0x1FE8,0x3A5,0x306,0x0}, 
+  {0x1FE9,0x3A5,0x304,0x0}, {0x1FEA,0x3A5,0x300,0x0}, {0x1FEB,0x3A5,0x301,0x0}, 
+  {0x1FEC,0x3A1,0x314,0x0}, {0x1FED,0xA8,0x300,0x0}, {0x1FEE,0xA8,0x301,0x0}, 
+  {0x1FEF,0x60,0x0,0x0}, {0x1FF2,0x1F7C,0x345,0x0}, {0x1FF3,0x3C9,0x345,0x0}, 
+  {0x1FF4,0x1F79,0x345,0x0}, {0x1FF6,0x3C9,0x342,0x0}, {0x1FF7,0x1FF6,0x345,0x0}, 
+  {0x1FF8,0x39F,0x300,0x0}, {0x1FF9,0x39F,0x301,0x0}, {0x1FFA,0x3A9,0x300,0x0}, 
+  {0x1FFB,0x3A9,0x301,0x0}, {0x1FFC,0x3A9,0x345,0x0}, {0x1FFD,0xB4,0x0,0x0}, 
+  {0x2000,0x2002,0x0,0x0}, {0x2001,0x2003,0x0,0x0}, {0x2126,0x3A9,0x0,0x0}, 
+  {0x212A,0x4B,0x0,0x0}, {0x212B,0xC5,0x0,0x0}, {0x2204,0x2203,0x338,0x0}, 
+  {0x2209,0x2208,0x338,0x0}, {0x220C,0x220B,0x338,0x0}, {0x2224,0x2223,0x338,0x0}, 
+  {0x2226,0x2225,0x338,0x0}, {0x2241,0x7E,0x338,0x0}, {0x2244,0x2243,0x338,0x0}, 
+  {0x2247,0x2245,0x338,0x0}, {0x2249,0x2248,0x338,0x0}, {0x2260,0x3D,0x338,0x0}, 
+  {0x2262,0x2261,0x338,0x0}, {0x226D,0x224D,0x338,0x0}, {0x226E,0x3C,0x338,0x0}, 
+  {0x226F,0x3E,0x338,0x0}, {0x2270,0x2264,0x338,0x0}, {0x2271,0x2265,0x338,0x0}, 
+  {0x2274,0x2272,0x338,0x0}, {0x2275,0x2273,0x338,0x0}, {0x2278,0x2276,0x338,0x0}, 
+  {0x2279,0x2277,0x338,0x0}, {0x2280,0x227A,0x338,0x0}, {0x2281,0x227B,0x338,0x0}, 
+  {0x2284,0x2282,0x338,0x0}, {0x2285,0x2283,0x338,0x0}, {0x2288,0x2286,0x338,0x0}, 
+  {0x2289,0x2287,0x338,0x0}, {0x22AC,0x22A2,0x338,0x0}, {0x22AD,0x22A8,0x338,0x0}, 
+  {0x22AE,0x22A9,0x338,0x0}, {0x22AF,0x22AB,0x338,0x0}, {0x22E0,0x227C,0x338,0x0}, 
+  {0x22E1,0x227D,0x338,0x0}, {0x22E2,0x2291,0x338,0x0}, {0x22E3,0x2292,0x338,0x0}, 
+  {0x22EA,0x22B2,0x338,0x0}, {0x22EB,0x22B3,0x338,0x0}, {0x22EC,0x22B4,0x338,0x0}, 
+  {0x22ED,0x22B5,0x338,0x0}, {0x2329,0x3008,0x0,0x0}, {0x232A,0x3009,0x0,0x0}, 
+  {0x304C,0x304B,0x3099,0x0}, {0x304E,0x304D,0x3099,0x0}, {0x3050,0x304F,0x3099,0x0}, 
+  {0x3052,0x3051,0x3099,0x0}, {0x3054,0x3053,0x3099,0x0}, {0x3056,0x3055,0x3099,0x0}, 
+  {0x3058,0x3057,0x3099,0x0}, {0x305A,0x3059,0x3099,0x0}, {0x305C,0x305B,0x3099,0x0}, 
+  {0x305E,0x305D,0x3099,0x0}, {0x3060,0x305F,0x3099,0x0}, {0x3062,0x3061,0x3099,0x0}, 
+  {0x3065,0x3064,0x3099,0x0}, {0x3067,0x3066,0x3099,0x0}, {0x3069,0x3068,0x3099,0x0}, 
+  {0x3070,0x306F,0x3099,0x0}, {0x3071,0x306F,0x309A,0x0}, {0x3073,0x3072,0x3099,0x0}, 
+  {0x3074,0x3072,0x309A,0x0}, {0x3076,0x3075,0x3099,0x0}, {0x3077,0x3075,0x309A,0x0}, 
+  {0x3079,0x3078,0x3099,0x0}, {0x307A,0x3078,0x309A,0x0}, {0x307C,0x307B,0x3099,0x0}, 
+  {0x307D,0x307B,0x309A,0x0}, {0x3094,0x3046,0x3099,0x0}, {0x309E,0x309D,0x3099,0x0}, 
+  {0x30AC,0x30AB,0x3099,0x0}, {0x30AE,0x30AD,0x3099,0x0}, {0x30B0,0x30AF,0x3099,0x0}, 
+  {0x30B2,0x30B1,0x3099,0x0}, {0x30B4,0x30B3,0x3099,0x0}, {0x30B6,0x30B5,0x3099,0x0}, 
+  {0x30B8,0x30B7,0x3099,0x0}, {0x30BA,0x30B9,0x3099,0x0}, {0x30BC,0x30BB,0x3099,0x0}, 
+  {0x30BE,0x30BD,0x3099,0x0}, {0x30C0,0x30BF,0x3099,0x0}, {0x30C2,0x30C1,0x3099,0x0}, 
+  {0x30C5,0x30C4,0x3099,0x0}, {0x30C7,0x30C6,0x3099,0x0}, {0x30C9,0x30C8,0x3099,0x0}, 
+  {0x30D0,0x30CF,0x3099,0x0}, {0x30D1,0x30CF,0x309A,0x0}, {0x30D3,0x30D2,0x3099,0x0}, 
+  {0x30D4,0x30D2,0x309A,0x0}, {0x30D6,0x30D5,0x3099,0x0}, {0x30D7,0x30D5,0x309A,0x0}, 
+  {0x30D9,0x30D8,0x3099,0x0}, {0x30DA,0x30D8,0x309A,0x0}, {0x30DC,0x30DB,0x3099,0x0}, 
+  {0x30DD,0x30DB,0x309A,0x0}, {0x30F4,0x30A6,0x3099,0x0}, {0x30F7,0x30EF,0x3099,0x0}, 
+  {0x30F8,0x30F0,0x3099,0x0}, {0x30F9,0x30F1,0x3099,0x0}, {0x30FA,0x30F2,0x3099,0x0}, 
+  {0x30FE,0x30FD,0x3099,0x0}, {0xF900,0x8C48,0x0,0x0}, {0xF901,0x66F4,0x0,0x0}, 
+  {0xF902,0x8ECA,0x0,0x0}, {0xF903,0x8CC8,0x0,0x0}, {0xF904,0x6ED1,0x0,0x0}, 
+  {0xF905,0x4E32,0x0,0x0}, {0xF906,0x53E5,0x0,0x0}, {0xF907,0x9F9C,0x0,0x0}, 
+  {0xF908,0x9F9C,0x0,0x0}, {0xF909,0x5951,0x0,0x0}, {0xF90A,0x91D1,0x0,0x0}, 
+  {0xF90B,0x5587,0x0,0x0}, {0xF90C,0x5948,0x0,0x0}, {0xF90D,0x61F6,0x0,0x0}, 
+  {0xF90E,0x7669,0x0,0x0}, {0xF90F,0x7F85,0x0,0x0}, {0xF910,0x863F,0x0,0x0}, 
+  {0xF911,0x87BA,0x0,0x0}, {0xF912,0x88F8,0x0,0x0}, {0xF913,0x908F,0x0,0x0}, 
+  {0xF914,0x6A02,0x0,0x0}, {0xF915,0x6D1B,0x0,0x0}, {0xF916,0x70D9,0x0,0x0}, 
+  {0xF917,0x73DE,0x0,0x0}, {0xF918,0x843D,0x0,0x0}, {0xF919,0x916A,0x0,0x0}, 
+  {0xF91A,0x99F1,0x0,0x0}, {0xF91B,0x4E82,0x0,0x0}, {0xF91C,0x5375,0x0,0x0}, 
+  {0xF91D,0x6B04,0x0,0x0}, {0xF91E,0x721B,0x0,0x0}, {0xF91F,0x862D,0x0,0x0}, 
+  {0xF920,0x9E1E,0x0,0x0}, {0xF921,0x5D50,0x0,0x0}, {0xF922,0x6FEB,0x0,0x0}, 
+  {0xF923,0x85CD,0x0,0x0}, {0xF924,0x8964,0x0,0x0}, {0xF925,0x62C9,0x0,0x0}, 
+  {0xF926,0x81D8,0x0,0x0}, {0xF927,0x881F,0x0,0x0}, {0xF928,0x5ECA,0x0,0x0}, 
+  {0xF929,0x6717,0x0,0x0}, {0xF92A,0x6D6A,0x0,0x0}, {0xF92B,0x72FC,0x0,0x0}, 
+  {0xF92C,0x90CE,0x0,0x0}, {0xF92D,0x4F86,0x0,0x0}, {0xF92E,0x51B7,0x0,0x0}, 
+  {0xF92F,0x52DE,0x0,0x0}, {0xF930,0x64C4,0x0,0x0}, {0xF931,0x6AD3,0x0,0x0}, 
+  {0xF932,0x7210,0x0,0x0}, {0xF933,0x76E7,0x0,0x0}, {0xF934,0x8001,0x0,0x0}, 
+  {0xF935,0x8606,0x0,0x0}, {0xF936,0x865C,0x0,0x0}, {0xF937,0x8DEF,0x0,0x0}, 
+  {0xF938,0x9732,0x0,0x0}, {0xF939,0x9B6F,0x0,0x0}, {0xF93A,0x9DFA,0x0,0x0}, 
+  {0xF93B,0x788C,0x0,0x0}, {0xF93C,0x797F,0x0,0x0}, {0xF93D,0x7DA0,0x0,0x0}, 
+  {0xF93E,0x83C9,0x0,0x0}, {0xF93F,0x9304,0x0,0x0}, {0xF940,0x9E7F,0x0,0x0}, 
+  {0xF941,0x8AD6,0x0,0x0}, {0xF942,0x58DF,0x0,0x0}, {0xF943,0x5F04,0x0,0x0}, 
+  {0xF944,0x7C60,0x0,0x0}, {0xF945,0x807E,0x0,0x0}, {0xF946,0x7262,0x0,0x0}, 
+  {0xF947,0x78CA,0x0,0x0}, {0xF948,0x8CC2,0x0,0x0}, {0xF949,0x96F7,0x0,0x0}, 
+  {0xF94A,0x58D8,0x0,0x0}, {0xF94B,0x5C62,0x0,0x0}, {0xF94C,0x6A13,0x0,0x0}, 
+  {0xF94D,0x6DDA,0x0,0x0}, {0xF94E,0x6F0F,0x0,0x0}, {0xF94F,0x7D2F,0x0,0x0}, 
+  {0xF950,0x7E37,0x0,0x0}, {0xF951,0x96FB,0x0,0x0}, {0xF952,0x52D2,0x0,0x0}, 
+  {0xF953,0x808B,0x0,0x0}, {0xF954,0x51DC,0x0,0x0}, {0xF955,0x51CC,0x0,0x0}, 
+  {0xF956,0x7A1C,0x0,0x0}, {0xF957,0x7DBE,0x0,0x0}, {0xF958,0x83F1,0x0,0x0}, 
+  {0xF959,0x9675,0x0,0x0}, {0xF95A,0x8B80,0x0,0x0}, {0xF95B,0x62CF,0x0,0x0}, 
+  {0xF95C,0x6A02,0x0,0x0}, {0xF95D,0x8AFE,0x0,0x0}, {0xF95E,0x4E39,0x0,0x0}, 
+  {0xF95F,0x5BE7,0x0,0x0}, {0xF960,0x6012,0x0,0x0}, {0xF961,0x7387,0x0,0x0}, 
+  {0xF962,0x7570,0x0,0x0}, {0xF963,0x5317,0x0,0x0}, {0xF964,0x78FB,0x0,0x0}, 
+  {0xF965,0x4FBF,0x0,0x0}, {0xF966,0x5FA9,0x0,0x0}, {0xF967,0x4E0D,0x0,0x0}, 
+  {0xF968,0x6CCC,0x0,0x0}, {0xF969,0x6578,0x0,0x0}, {0xF96A,0x7D22,0x0,0x0}, 
+  {0xF96B,0x53C3,0x0,0x0}, {0xF96C,0x585E,0x0,0x0}, {0xF96D,0x7701,0x0,0x0}, 
+  {0xF96E,0x8449,0x0,0x0}, {0xF96F,0x8AAA,0x0,0x0}, {0xF970,0x6BBA,0x0,0x0}, 
+  {0xF971,0x8FB0,0x0,0x0}, {0xF972,0x6C88,0x0,0x0}, {0xF973,0x62FE,0x0,0x0}, 
+  {0xF974,0x82E5,0x0,0x0}, {0xF975,0x63A0,0x0,0x0}, {0xF976,0x7565,0x0,0x0}, 
+  {0xF977,0x4EAE,0x0,0x0}, {0xF978,0x5169,0x0,0x0}, {0xF979,0x51C9,0x0,0x0}, 
+  {0xF97A,0x6881,0x0,0x0}, {0xF97B,0x7CE7,0x0,0x0}, {0xF97C,0x826F,0x0,0x0}, 
+  {0xF97D,0x8AD2,0x0,0x0}, {0xF97E,0x91CF,0x0,0x0}, {0xF97F,0x52F5,0x0,0x0}, 
+  {0xF980,0x5442,0x0,0x0}, {0xF981,0x5973,0x0,0x0}, {0xF982,0x5EEC,0x0,0x0}, 
+  {0xF983,0x65C5,0x0,0x0}, {0xF984,0x6FFE,0x0,0x0}, {0xF985,0x792A,0x0,0x0}, 
+  {0xF986,0x95AD,0x0,0x0}, {0xF987,0x9A6A,0x0,0x0}, {0xF988,0x9E97,0x0,0x0}, 
+  {0xF989,0x9ECE,0x0,0x0}, {0xF98A,0x529B,0x0,0x0}, {0xF98B,0x66C6,0x0,0x0}, 
+  {0xF98C,0x6B77,0x0,0x0}, {0xF98D,0x8F62,0x0,0x0}, {0xF98E,0x5E74,0x0,0x0}, 
+  {0xF98F,0x6190,0x0,0x0}, {0xF990,0x6200,0x0,0x0}, {0xF991,0x649A,0x0,0x0}, 
+  {0xF992,0x6F23,0x0,0x0}, {0xF993,0x7149,0x0,0x0}, {0xF994,0x7489,0x0,0x0}, 
+  {0xF995,0x79CA,0x0,0x0}, {0xF996,0x7DF4,0x0,0x0}, {0xF997,0x806F,0x0,0x0}, 
+  {0xF998,0x8F26,0x0,0x0}, {0xF999,0x84EE,0x0,0x0}, {0xF99A,0x9023,0x0,0x0}, 
+  {0xF99B,0x934A,0x0,0x0}, {0xF99C,0x5217,0x0,0x0}, {0xF99D,0x52A3,0x0,0x0}, 
+  {0xF99E,0x54BD,0x0,0x0}, {0xF99F,0x70C8,0x0,0x0}, {0xF9A0,0x88C2,0x0,0x0}, 
+  {0xF9A1,0x8AAA,0x0,0x0}, {0xF9A2,0x5EC9,0x0,0x0}, {0xF9A3,0x5FF5,0x0,0x0}, 
+  {0xF9A4,0x637B,0x0,0x0}, {0xF9A5,0x6BAE,0x0,0x0}, {0xF9A6,0x7C3E,0x0,0x0}, 
+  {0xF9A7,0x7375,0x0,0x0}, {0xF9A8,0x4EE4,0x0,0x0}, {0xF9A9,0x56F9,0x0,0x0}, 
+  {0xF9AA,0x5BE7,0x0,0x0}, {0xF9AB,0x5DBA,0x0,0x0}, {0xF9AC,0x601C,0x0,0x0}, 
+  {0xF9AD,0x73B2,0x0,0x0}, {0xF9AE,0x7469,0x0,0x0}, {0xF9AF,0x7F9A,0x0,0x0}, 
+  {0xF9B0,0x8046,0x0,0x0}, {0xF9B1,0x9234,0x0,0x0}, {0xF9B2,0x96F6,0x0,0x0}, 
+  {0xF9B3,0x9748,0x0,0x0}, {0xF9B4,0x9818,0x0,0x0}, {0xF9B5,0x4F8B,0x0,0x0}, 
+  {0xF9B6,0x79AE,0x0,0x0}, {0xF9B7,0x91B4,0x0,0x0}, {0xF9B8,0x96B8,0x0,0x0}, 
+  {0xF9B9,0x60E1,0x0,0x0}, {0xF9BA,0x4E86,0x0,0x0}, {0xF9BB,0x50DA,0x0,0x0}, 
+  {0xF9BC,0x5BEE,0x0,0x0}, {0xF9BD,0x5C3F,0x0,0x0}, {0xF9BE,0x6599,0x0,0x0}, 
+  {0xF9BF,0x6A02,0x0,0x0}, {0xF9C0,0x71CE,0x0,0x0}, {0xF9C1,0x7642,0x0,0x0}, 
+  {0xF9C2,0x84FC,0x0,0x0}, {0xF9C3,0x907C,0x0,0x0}, {0xF9C4,0x9F8D,0x0,0x0}, 
+  {0xF9C5,0x6688,0x0,0x0}, {0xF9C6,0x962E,0x0,0x0}, {0xF9C7,0x5289,0x0,0x0}, 
+  {0xF9C8,0x677B,0x0,0x0}, {0xF9C9,0x67F3,0x0,0x0}, {0xF9CA,0x6D41,0x0,0x0}, 
+  {0xF9CB,0x6E9C,0x0,0x0}, {0xF9CC,0x7409,0x0,0x0}, {0xF9CD,0x7559,0x0,0x0}, 
+  {0xF9CE,0x786B,0x0,0x0}, {0xF9CF,0x7D10,0x0,0x0}, {0xF9D0,0x985E,0x0,0x0}, 
+  {0xF9D1,0x516D,0x0,0x0}, {0xF9D2,0x622E,0x0,0x0}, {0xF9D3,0x9678,0x0,0x0}, 
+  {0xF9D4,0x502B,0x0,0x0}, {0xF9D5,0x5D19,0x0,0x0}, {0xF9D6,0x6DEA,0x0,0x0}, 
+  {0xF9D7,0x8F2A,0x0,0x0}, {0xF9D8,0x5F8B,0x0,0x0}, {0xF9D9,0x6144,0x0,0x0}, 
+  {0xF9DA,0x6817,0x0,0x0}, {0xF9DB,0x7387,0x0,0x0}, {0xF9DC,0x9686,0x0,0x0}, 
+  {0xF9DD,0x5229,0x0,0x0}, {0xF9DE,0x540F,0x0,0x0}, {0xF9DF,0x5C65,0x0,0x0}, 
+  {0xF9E0,0x6613,0x0,0x0}, {0xF9E1,0x674E,0x0,0x0}, {0xF9E2,0x68A8,0x0,0x0}, 
+  {0xF9E3,0x6CE5,0x0,0x0}, {0xF9E4,0x7406,0x0,0x0}, {0xF9E5,0x75E2,0x0,0x0}, 
+  {0xF9E6,0x7F79,0x0,0x0}, {0xF9E7,0x88CF,0x0,0x0}, {0xF9E8,0x88E1,0x0,0x0}, 
+  {0xF9E9,0x91CC,0x0,0x0}, {0xF9EA,0x96E2,0x0,0x0}, {0xF9EB,0x533F,0x0,0x0}, 
+  {0xF9EC,0x6EBA,0x0,0x0}, {0xF9ED,0x541D,0x0,0x0}, {0xF9EE,0x71D0,0x0,0x0}, 
+  {0xF9EF,0x7498,0x0,0x0}, {0xF9F0,0x85FA,0x0,0x0}, {0xF9F1,0x96A3,0x0,0x0}, 
+  {0xF9F2,0x9C57,0x0,0x0}, {0xF9F3,0x9E9F,0x0,0x0}, {0xF9F4,0x6797,0x0,0x0}, 
+  {0xF9F5,0x6DCB,0x0,0x0}, {0xF9F6,0x81E8,0x0,0x0}, {0xF9F7,0x7ACB,0x0,0x0}, 
+  {0xF9F8,0x7B20,0x0,0x0}, {0xF9F9,0x7C92,0x0,0x0}, {0xF9FA,0x72C0,0x0,0x0}, 
+  {0xF9FB,0x7099,0x0,0x0}, {0xF9FC,0x8B58,0x0,0x0}, {0xF9FD,0x4EC0,0x0,0x0}, 
+  {0xF9FE,0x8336,0x0,0x0}, {0xF9FF,0x523A,0x0,0x0}, {0xFA00,0x5207,0x0,0x0}, 
+  {0xFA01,0x5EA6,0x0,0x0}, {0xFA02,0x62D3,0x0,0x0}, {0xFA03,0x7CD6,0x0,0x0}, 
+  {0xFA04,0x5B85,0x0,0x0}, {0xFA05,0x6D1E,0x0,0x0}, {0xFA06,0x66B4,0x0,0x0}, 
+  {0xFA07,0x8F3B,0x0,0x0}, {0xFA08,0x884C,0x0,0x0}, {0xFA09,0x964D,0x0,0x0}, 
+  {0xFA0A,0x898B,0x0,0x0}, {0xFA0B,0x5ED3,0x0,0x0}, {0xFA0C,0x5140,0x0,0x0}, 
+  {0xFA0D,0x55C0,0x0,0x0}, {0xFA10,0x585A,0x0,0x0}, {0xFA12,0x6674,0x0,0x0}, 
+  {0xFA15,0x51DE,0x0,0x0}, {0xFA16,0x732A,0x0,0x0}, {0xFA17,0x76CA,0x0,0x0}, 
+  {0xFA18,0x793C,0x0,0x0}, {0xFA19,0x795E,0x0,0x0}, {0xFA1A,0x7965,0x0,0x0}, 
+  {0xFA1B,0x798F,0x0,0x0}, {0xFA1C,0x9756,0x0,0x0}, {0xFA1D,0x7CBE,0x0,0x0}, 
+  {0xFA1E,0x7FBD,0x0,0x0}, {0xFA20,0x8612,0x0,0x0}, {0xFA22,0x8AF8,0x0,0x0}, 
+  {0xFA25,0x9038,0x0,0x0}, {0xFA26,0x90FD,0x0,0x0}, {0xFA2A,0x98EF,0x0,0x0}, 
+  {0xFA2B,0x98FC,0x0,0x0}, {0xFA2C,0x9928,0x0,0x0}, {0xFA2D,0x9DB4,0x0,0x0}, 
+  {0xFB1F,0x5F2,0x5B7,0x0}, {0xFB2A,0x5E9,0x5C1,0x0}, {0xFB2B,0x5E9,0x5C2,0x0}, 
+  {0xFB2C,0x5E9,0x5BC,0x5C1}, {0xFB2D,0x5E9,0x5BC,0x5C2}, {0xFB2E,0x5D0,0x5B7,0x0}, 
+  {0xFB2F,0x5D0,0x5B8,0x0}, {0xFB30,0x5D0,0x5BC,0x0}, {0xFB31,0x5D1,0x5BC,0x0}, 
+  {0xFB32,0x5D2,0x5BC,0x0}, {0xFB33,0x5D3,0x5BC,0x0}, {0xFB34,0x5D4,0x5BC,0x0}, 
+  {0xFB35,0x5D5,0x5BC,0x0}, {0xFB36,0x5D6,0x5BC,0x0}, {0xFB38,0x5D8,0x5BC,0x0}, 
+  {0xFB39,0x5D9,0x5BC,0x0}, {0xFB3A,0x5DA,0x5BC,0x0}, {0xFB3B,0x5DB,0x5BC,0x0}, 
+  {0xFB3C,0x5DC,0x5BC,0x0}, {0xFB3E,0x5DE,0x5BC,0x0}, {0xFB40,0x5E0,0x5BC,0x0}, 
+  {0xFB41,0x5E1,0x5BC,0x0}, {0xFB43,0x5E3,0x5BC,0x0}, {0xFB44,0x5E4,0x5BC,0x0}, 
+  {0xFB46,0x5E6,0x5BC,0x0}, {0xFB47,0x5E7,0x5BC,0x0}, {0xFB48,0x5E8,0x5BC,0x0}, 
+  {0xFB49,0x5E9,0x5BC,0x0}, {0xFB4A,0x5EA,0x5BC,0x0}, {0xFB4B,0x5D5,0x5B9,0x0}, 
+  {0xFB4C,0x5D1,0x5BF,0x0}, {0xFB4D,0x5DB,0x5BF,0x0}, {0xFB4E,0x5E4,0x5BF,0x0} 
+};
+
+
+/* All upper-case translations are included here */
+
+#define NUM_TOUPPER_INFO 677
+static const unirelate toupper_info[NUM_TOUPPER_INFO] = {
+  {0x61,0x41}, {0x62,0x42}, {0x63,0x43}, {0x64,0x44}, {0x65,0x45}, 
+  {0x66,0x46}, {0x67,0x47}, {0x68,0x48}, {0x69,0x49}, {0x6A,0x4A}, 
+  {0x6B,0x4B}, {0x6C,0x4C}, {0x6D,0x4D}, {0x6E,0x4E}, {0x6F,0x4F}, 
+  {0x70,0x50}, {0x71,0x51}, {0x72,0x52}, {0x73,0x53}, {0x74,0x54}, 
+  {0x75,0x55}, {0x76,0x56}, {0x77,0x57}, {0x78,0x58}, {0x79,0x59}, 
+  {0x7A,0x5A}, {0xE0,0xC0}, {0xE1,0xC1}, {0xE2,0xC2}, {0xE3,0xC3}, 
+  {0xE4,0xC4}, {0xE5,0xC5}, {0xE6,0xC6}, {0xE7,0xC7}, {0xE8,0xC8}, 
+  {0xE9,0xC9}, {0xEA,0xCA}, {0xEB,0xCB}, {0xEC,0xCC}, {0xED,0xCD}, 
+  {0xEE,0xCE}, {0xEF,0xCF}, {0xF0,0xD0}, {0xF1,0xD1}, {0xF2,0xD2}, 
+  {0xF3,0xD3}, {0xF4,0xD4}, {0xF5,0xD5}, {0xF6,0xD6}, {0xF8,0xD8}, 
+  {0xF9,0xD9}, {0xFA,0xDA}, {0xFB,0xDB}, {0xFC,0xDC}, {0xFD,0xDD}, 
+  {0xFE,0xDE}, {0xFF,0x178}, {0x101,0x100}, {0x103,0x102}, {0x105,0x104}, 
+  {0x107,0x106}, {0x109,0x108}, {0x10B,0x10A}, {0x10D,0x10C}, {0x10F,0x10E}, 
+  {0x111,0x110}, {0x113,0x112}, {0x115,0x114}, {0x117,0x116}, {0x119,0x118}, 
+  {0x11B,0x11A}, {0x11D,0x11C}, {0x11F,0x11E}, {0x121,0x120}, {0x123,0x122}, 
+  {0x125,0x124}, {0x127,0x126}, {0x129,0x128}, {0x12B,0x12A}, {0x12D,0x12C}, 
+  {0x12F,0x12E}, {0x131,0x49}, {0x133,0x132}, {0x135,0x134}, {0x137,0x136}, 
+  {0x13A,0x139}, {0x13C,0x13B}, {0x13E,0x13D}, {0x140,0x13F}, {0x142,0x141}, 
+  {0x144,0x143}, {0x146,0x145}, {0x148,0x147}, {0x14B,0x14A}, {0x14D,0x14C}, 
+  {0x14F,0x14E}, {0x151,0x150}, {0x153,0x152}, {0x155,0x154}, {0x157,0x156}, 
+  {0x159,0x158}, {0x15B,0x15A}, {0x15D,0x15C}, {0x15F,0x15E}, {0x161,0x160}, 
+  {0x163,0x162}, {0x165,0x164}, {0x167,0x166}, {0x169,0x168}, {0x16B,0x16A}, 
+  {0x16D,0x16C}, {0x16F,0x16E}, {0x171,0x170}, {0x173,0x172}, {0x175,0x174}, 
+  {0x177,0x176}, {0x17A,0x179}, {0x17C,0x17B}, {0x17E,0x17D}, {0x17F,0x53}, 
+  {0x183,0x182}, {0x185,0x184}, {0x188,0x187}, {0x18C,0x18B}, {0x192,0x191}, 
+  {0x199,0x198}, {0x1A1,0x1A0}, {0x1A3,0x1A2}, {0x1A5,0x1A4}, {0x1A8,0x1A7}, 
+  {0x1AD,0x1AC}, {0x1B0,0x1AF}, {0x1B4,0x1B3}, {0x1B6,0x1B5}, {0x1B9,0x1B8}, 
+  {0x1BD,0x1BC}, {0x1C5,0x1C4}, {0x1C6,0x1C4}, {0x1C8,0x1C7}, {0x1C9,0x1C7}, 
+  {0x1CB,0x1CA}, {0x1CC,0x1CA}, {0x1CE,0x1CD}, {0x1D0,0x1CF}, {0x1D2,0x1D1}, 
+  {0x1D4,0x1D3}, {0x1D6,0x1D5}, {0x1D8,0x1D7}, {0x1DA,0x1D9}, {0x1DC,0x1DB}, 
+  {0x1DD,0x18E}, {0x1DF,0x1DE}, {0x1E1,0x1E0}, {0x1E3,0x1E2}, {0x1E5,0x1E4}, 
+  {0x1E7,0x1E6}, {0x1E9,0x1E8}, {0x1EB,0x1EA}, {0x1ED,0x1EC}, {0x1EF,0x1EE}, 
+  {0x1F2,0x1F1}, {0x1F3,0x1F1}, {0x1F5,0x1F4}, {0x1FB,0x1FA}, {0x1FD,0x1FC}, 
+  {0x1FF,0x1FE}, {0x201,0x200}, {0x203,0x202}, {0x205,0x204}, {0x207,0x206}, 
+  {0x209,0x208}, {0x20B,0x20A}, {0x20D,0x20C}, {0x20F,0x20E}, {0x211,0x210}, 
+  {0x213,0x212}, {0x215,0x214}, {0x217,0x216}, {0x253,0x181}, {0x254,0x186}, 
+  {0x256,0x189}, {0x257,0x18A}, {0x259,0x18F}, {0x25B,0x190}, {0x260,0x193}, 
+  {0x263,0x194}, {0x268,0x197}, {0x269,0x196}, {0x26F,0x19C}, {0x272,0x19D}, 
+  {0x275,0x19F}, {0x283,0x1A9}, {0x288,0x1AE}, {0x28A,0x1B1}, {0x28B,0x1B2}, 
+  {0x292,0x1B7}, {0x3AC,0x386}, {0x3AD,0x388}, {0x3AE,0x389}, {0x3AF,0x38A}, 
+  {0x3B1,0x391}, {0x3B2,0x392}, {0x3B3,0x393}, {0x3B4,0x394}, {0x3B5,0x395}, 
+  {0x3B6,0x396}, {0x3B7,0x397}, {0x3B8,0x398}, {0x3B9,0x399}, {0x3BA,0x39A}, 
+  {0x3BB,0x39B}, {0x3BC,0x39C}, {0x3BD,0x39D}, {0x3BE,0x39E}, {0x3BF,0x39F}, 
+  {0x3C0,0x3A0}, {0x3C1,0x3A1}, {0x3C2,0x3A3}, {0x3C3,0x3A3}, {0x3C4,0x3A4}, 
+  {0x3C5,0x3A5}, {0x3C6,0x3A6}, {0x3C7,0x3A7}, {0x3C8,0x3A8}, {0x3C9,0x3A9}, 
+  {0x3CA,0x3AA}, {0x3CB,0x3AB}, {0x3CC,0x38C}, {0x3CD,0x38E}, {0x3CE,0x38F}, 
+  {0x3D0,0x392}, {0x3D1,0x398}, {0x3D5,0x3A6}, {0x3D6,0x3A0}, {0x3E3,0x3E2}, 
+  {0x3E5,0x3E4}, {0x3E7,0x3E6}, {0x3E9,0x3E8}, {0x3EB,0x3EA}, {0x3ED,0x3EC}, 
+  {0x3EF,0x3EE}, {0x3F0,0x39A}, {0x3F1,0x3A1}, {0x3F2,0x3A3}, {0x430,0x410}, 
+  {0x431,0x411}, {0x432,0x412}, {0x433,0x413}, {0x434,0x414}, {0x435,0x415}, 
+  {0x436,0x416}, {0x437,0x417}, {0x438,0x418}, {0x439,0x419}, {0x43A,0x41A}, 
+  {0x43B,0x41B}, {0x43C,0x41C}, {0x43D,0x41D}, {0x43E,0x41E}, {0x43F,0x41F}, 
+  {0x440,0x420}, {0x441,0x421}, {0x442,0x422}, {0x443,0x423}, {0x444,0x424}, 
+  {0x445,0x425}, {0x446,0x426}, {0x447,0x427}, {0x448,0x428}, {0x449,0x429}, 
+  {0x44A,0x42A}, {0x44B,0x42B}, {0x44C,0x42C}, {0x44D,0x42D}, {0x44E,0x42E}, 
+  {0x44F,0x42F}, {0x451,0x401}, {0x452,0x402}, {0x453,0x403}, {0x454,0x404}, 
+  {0x455,0x405}, {0x456,0x406}, {0x457,0x407}, {0x458,0x408}, {0x459,0x409}, 
+  {0x45A,0x40A}, {0x45B,0x40B}, {0x45C,0x40C}, {0x45E,0x40E}, {0x45F,0x40F}, 
+  {0x461,0x460}, {0x463,0x462}, {0x465,0x464}, {0x467,0x466}, {0x469,0x468}, 
+  {0x46B,0x46A}, {0x46D,0x46C}, {0x46F,0x46E}, {0x471,0x470}, {0x473,0x472}, 
+  {0x475,0x474}, {0x477,0x476}, {0x479,0x478}, {0x47B,0x47A}, {0x47D,0x47C}, 
+  {0x47F,0x47E}, {0x481,0x480}, {0x491,0x490}, {0x493,0x492}, {0x495,0x494}, 
+  {0x497,0x496}, {0x499,0x498}, {0x49B,0x49A}, {0x49D,0x49C}, {0x49F,0x49E}, 
+  {0x4A1,0x4A0}, {0x4A3,0x4A2}, {0x4A5,0x4A4}, {0x4A7,0x4A6}, {0x4A9,0x4A8}, 
+  {0x4AB,0x4AA}, {0x4AD,0x4AC}, {0x4AF,0x4AE}, {0x4B1,0x4B0}, {0x4B3,0x4B2}, 
+  {0x4B5,0x4B4}, {0x4B7,0x4B6}, {0x4B9,0x4B8}, {0x4BB,0x4BA}, {0x4BD,0x4BC}, 
+  {0x4BF,0x4BE}, {0x4C2,0x4C1}, {0x4C4,0x4C3}, {0x4C8,0x4C7}, {0x4CC,0x4CB}, 
+  {0x4D1,0x4D0}, {0x4D3,0x4D2}, {0x4D5,0x4D4}, {0x4D7,0x4D6}, {0x4D9,0x4D8}, 
+  {0x4DB,0x4DA}, {0x4DD,0x4DC}, {0x4DF,0x4DE}, {0x4E1,0x4E0}, {0x4E3,0x4E2}, 
+  {0x4E5,0x4E4}, {0x4E7,0x4E6}, {0x4E9,0x4E8}, {0x4EB,0x4EA}, {0x4EF,0x4EE}, 
+  {0x4F1,0x4F0}, {0x4F3,0x4F2}, {0x4F5,0x4F4}, {0x4F9,0x4F8}, {0x561,0x531}, 
+  {0x562,0x532}, {0x563,0x533}, {0x564,0x534}, {0x565,0x535}, {0x566,0x536}, 
+  {0x567,0x537}, {0x568,0x538}, {0x569,0x539}, {0x56A,0x53A}, {0x56B,0x53B}, 
+  {0x56C,0x53C}, {0x56D,0x53D}, {0x56E,0x53E}, {0x56F,0x53F}, {0x570,0x540}, 
+  {0x571,0x541}, {0x572,0x542}, {0x573,0x543}, {0x574,0x544}, {0x575,0x545}, 
+  {0x576,0x546}, {0x577,0x547}, {0x578,0x548}, {0x579,0x549}, {0x57A,0x54A}, 
+  {0x57B,0x54B}, {0x57C,0x54C}, {0x57D,0x54D}, {0x57E,0x54E}, {0x57F,0x54F}, 
+  {0x580,0x550}, {0x581,0x551}, {0x582,0x552}, {0x583,0x553}, {0x584,0x554}, 
+  {0x585,0x555}, {0x586,0x556}, {0x1E01,0x1E00}, {0x1E03,0x1E02}, {0x1E05,0x1E04}, 
+  {0x1E07,0x1E06}, {0x1E09,0x1E08}, {0x1E0B,0x1E0A}, {0x1E0D,0x1E0C}, {0x1E0F,0x1E0E}, 
+  {0x1E11,0x1E10}, {0x1E13,0x1E12}, {0x1E15,0x1E14}, {0x1E17,0x1E16}, {0x1E19,0x1E18}, 
+  {0x1E1B,0x1E1A}, {0x1E1D,0x1E1C}, {0x1E1F,0x1E1E}, {0x1E21,0x1E20}, {0x1E23,0x1E22}, 
+  {0x1E25,0x1E24}, {0x1E27,0x1E26}, {0x1E29,0x1E28}, {0x1E2B,0x1E2A}, {0x1E2D,0x1E2C}, 
+  {0x1E2F,0x1E2E}, {0x1E31,0x1E30}, {0x1E33,0x1E32}, {0x1E35,0x1E34}, {0x1E37,0x1E36}, 
+  {0x1E39,0x1E38}, {0x1E3B,0x1E3A}, {0x1E3D,0x1E3C}, {0x1E3F,0x1E3E}, {0x1E41,0x1E40}, 
+  {0x1E43,0x1E42}, {0x1E45,0x1E44}, {0x1E47,0x1E46}, {0x1E49,0x1E48}, {0x1E4B,0x1E4A}, 
+  {0x1E4D,0x1E4C}, {0x1E4F,0x1E4E}, {0x1E51,0x1E50}, {0x1E53,0x1E52}, {0x1E55,0x1E54}, 
+  {0x1E57,0x1E56}, {0x1E59,0x1E58}, {0x1E5B,0x1E5A}, {0x1E5D,0x1E5C}, {0x1E5F,0x1E5E}, 
+  {0x1E61,0x1E60}, {0x1E63,0x1E62}, {0x1E65,0x1E64}, {0x1E67,0x1E66}, {0x1E69,0x1E68}, 
+  {0x1E6B,0x1E6A}, {0x1E6D,0x1E6C}, {0x1E6F,0x1E6E}, {0x1E71,0x1E70}, {0x1E73,0x1E72}, 
+  {0x1E75,0x1E74}, {0x1E77,0x1E76}, {0x1E79,0x1E78}, {0x1E7B,0x1E7A}, {0x1E7D,0x1E7C}, 
+  {0x1E7F,0x1E7E}, {0x1E81,0x1E80}, {0x1E83,0x1E82}, {0x1E85,0x1E84}, {0x1E87,0x1E86}, 
+  {0x1E89,0x1E88}, {0x1E8B,0x1E8A}, {0x1E8D,0x1E8C}, {0x1E8F,0x1E8E}, {0x1E91,0x1E90}, 
+  {0x1E93,0x1E92}, {0x1E95,0x1E94}, {0x1E9B,0x1E60}, {0x1EA1,0x1EA0}, {0x1EA3,0x1EA2}, 
+  {0x1EA5,0x1EA4}, {0x1EA7,0x1EA6}, {0x1EA9,0x1EA8}, {0x1EAB,0x1EAA}, {0x1EAD,0x1EAC}, 
+  {0x1EAF,0x1EAE}, {0x1EB1,0x1EB0}, {0x1EB3,0x1EB2}, {0x1EB5,0x1EB4}, {0x1EB7,0x1EB6}, 
+  {0x1EB9,0x1EB8}, {0x1EBB,0x1EBA}, {0x1EBD,0x1EBC}, {0x1EBF,0x1EBE}, {0x1EC1,0x1EC0}, 
+  {0x1EC3,0x1EC2}, {0x1EC5,0x1EC4}, {0x1EC7,0x1EC6}, {0x1EC9,0x1EC8}, {0x1ECB,0x1ECA}, 
+  {0x1ECD,0x1ECC}, {0x1ECF,0x1ECE}, {0x1ED1,0x1ED0}, {0x1ED3,0x1ED2}, {0x1ED5,0x1ED4}, 
+  {0x1ED7,0x1ED6}, {0x1ED9,0x1ED8}, {0x1EDB,0x1EDA}, {0x1EDD,0x1EDC}, {0x1EDF,0x1EDE}, 
+  {0x1EE1,0x1EE0}, {0x1EE3,0x1EE2}, {0x1EE5,0x1EE4}, {0x1EE7,0x1EE6}, {0x1EE9,0x1EE8}, 
+  {0x1EEB,0x1EEA}, {0x1EED,0x1EEC}, {0x1EEF,0x1EEE}, {0x1EF1,0x1EF0}, {0x1EF3,0x1EF2}, 
+  {0x1EF5,0x1EF4}, {0x1EF7,0x1EF6}, {0x1EF9,0x1EF8}, {0x1F00,0x1F08}, {0x1F01,0x1F09}, 
+  {0x1F02,0x1F0A}, {0x1F03,0x1F0B}, {0x1F04,0x1F0C}, {0x1F05,0x1F0D}, {0x1F06,0x1F0E}, 
+  {0x1F07,0x1F0F}, {0x1F10,0x1F18}, {0x1F11,0x1F19}, {0x1F12,0x1F1A}, {0x1F13,0x1F1B}, 
+  {0x1F14,0x1F1C}, {0x1F15,0x1F1D}, {0x1F20,0x1F28}, {0x1F21,0x1F29}, {0x1F22,0x1F2A}, 
+  {0x1F23,0x1F2B}, {0x1F24,0x1F2C}, {0x1F25,0x1F2D}, {0x1F26,0x1F2E}, {0x1F27,0x1F2F}, 
+  {0x1F30,0x1F38}, {0x1F31,0x1F39}, {0x1F32,0x1F3A}, {0x1F33,0x1F3B}, {0x1F34,0x1F3C}, 
+  {0x1F35,0x1F3D}, {0x1F36,0x1F3E}, {0x1F37,0x1F3F}, {0x1F40,0x1F48}, {0x1F41,0x1F49}, 
+  {0x1F42,0x1F4A}, {0x1F43,0x1F4B}, {0x1F44,0x1F4C}, {0x1F45,0x1F4D}, {0x1F51,0x1F59}, 
+  {0x1F53,0x1F5B}, {0x1F55,0x1F5D}, {0x1F57,0x1F5F}, {0x1F60,0x1F68}, {0x1F61,0x1F69}, 
+  {0x1F62,0x1F6A}, {0x1F63,0x1F6B}, {0x1F64,0x1F6C}, {0x1F65,0x1F6D}, {0x1F66,0x1F6E}, 
+  {0x1F67,0x1F6F}, {0x1F70,0x1FBA}, {0x1F71,0x1FBB}, {0x1F72,0x1FC8}, {0x1F73,0x1FC9}, 
+  {0x1F74,0x1FCA}, {0x1F75,0x1FCB}, {0x1F76,0x1FDA}, {0x1F77,0x1FDB}, {0x1F78,0x1FF8}, 
+  {0x1F79,0x1FF9}, {0x1F7A,0x1FEA}, {0x1F7B,0x1FEB}, {0x1F7C,0x1FFA}, {0x1F7D,0x1FFB}, 
+  {0x1F80,0x1F88}, {0x1F81,0x1F89}, {0x1F82,0x1F8A}, {0x1F83,0x1F8B}, {0x1F84,0x1F8C}, 
+  {0x1F85,0x1F8D}, {0x1F86,0x1F8E}, {0x1F87,0x1F8F}, {0x1F90,0x1F98}, {0x1F91,0x1F99}, 
+  {0x1F92,0x1F9A}, {0x1F93,0x1F9B}, {0x1F94,0x1F9C}, {0x1F95,0x1F9D}, {0x1F96,0x1F9E}, 
+  {0x1F97,0x1F9F}, {0x1FA0,0x1FA8}, {0x1FA1,0x1FA9}, {0x1FA2,0x1FAA}, {0x1FA3,0x1FAB}, 
+  {0x1FA4,0x1FAC}, {0x1FA5,0x1FAD}, {0x1FA6,0x1FAE}, {0x1FA7,0x1FAF}, {0x1FB0,0x1FB8}, 
+  {0x1FB1,0x1FB9}, {0x1FB3,0x1FBC}, {0x1FC3,0x1FCC}, {0x1FD0,0x1FD8}, {0x1FD1,0x1FD9}, 
+  {0x1FE0,0x1FE8}, {0x1FE1,0x1FE9}, {0x1FE5,0x1FEC}, {0x1FF3,0x1FFC}, {0x2170,0x2160}, 
+  {0x2171,0x2161}, {0x2172,0x2162}, {0x2173,0x2163}, {0x2174,0x2164}, {0x2175,0x2165}, 
+  {0x2176,0x2166}, {0x2177,0x2167}, {0x2178,0x2168}, {0x2179,0x2169}, {0x217A,0x216A}, 
+  {0x217B,0x216B}, {0x217C,0x216C}, {0x217D,0x216D}, {0x217E,0x216E}, {0x217F,0x216F}, 
+  {0x24D0,0x24B6}, {0x24D1,0x24B7}, {0x24D2,0x24B8}, {0x24D3,0x24B9}, {0x24D4,0x24BA}, 
+  {0x24D5,0x24BB}, {0x24D6,0x24BC}, {0x24D7,0x24BD}, {0x24D8,0x24BE}, {0x24D9,0x24BF}, 
+  {0x24DA,0x24C0}, {0x24DB,0x24C1}, {0x24DC,0x24C2}, {0x24DD,0x24C3}, {0x24DE,0x24C4}, 
+  {0x24DF,0x24C5}, {0x24E0,0x24C6}, {0x24E1,0x24C7}, {0x24E2,0x24C8}, {0x24E3,0x24C9}, 
+  {0x24E4,0x24CA}, {0x24E5,0x24CB}, {0x24E6,0x24CC}, {0x24E7,0x24CD}, {0x24E8,0x24CE}, 
+  {0x24E9,0x24CF}, {0xFF41,0xFF21}, {0xFF42,0xFF22}, {0xFF43,0xFF23}, {0xFF44,0xFF24}, 
+  {0xFF45,0xFF25}, {0xFF46,0xFF26}, {0xFF47,0xFF27}, {0xFF48,0xFF28}, {0xFF49,0xFF29}, 
+  {0xFF4A,0xFF2A}, {0xFF4B,0xFF2B}, {0xFF4C,0xFF2C}, {0xFF4D,0xFF2D}, {0xFF4E,0xFF2E}, 
+  {0xFF4F,0xFF2F}, {0xFF50,0xFF30}, {0xFF51,0xFF31}, {0xFF52,0xFF32}, {0xFF53,0xFF33}, 
+  {0xFF54,0xFF34}, {0xFF55,0xFF35}, {0xFF56,0xFF36}, {0xFF57,0xFF37}, {0xFF58,0xFF38}, 
+  {0xFF59,0xFF39}, {0xFF5A,0xFF3A} 
+};
+
+
+
+/* All lower-case translations are included here */
+
+#define NUM_TOLOWER_INFO 705
+static const unirelate tolower_info[NUM_TOLOWER_INFO] = {
+  {0x41,0x61}, {0x42,0x62}, {0x43,0x63}, {0x44,0x64}, {0x45,0x65}, 
+  {0x46,0x66}, {0x47,0x67}, {0x48,0x68}, {0x49,0x69}, {0x4A,0x6A}, 
+  {0x4B,0x6B}, {0x4C,0x6C}, {0x4D,0x6D}, {0x4E,0x6E}, {0x4F,0x6F}, 
+  {0x50,0x70}, {0x51,0x71}, {0x52,0x72}, {0x53,0x73}, {0x54,0x74}, 
+  {0x55,0x75}, {0x56,0x76}, {0x57,0x77}, {0x58,0x78}, {0x59,0x79}, 
+  {0x5A,0x7A}, {0xC0,0xE0}, {0xC1,0xE1}, {0xC2,0xE2}, {0xC3,0xE3}, 
+  {0xC4,0xE4}, {0xC5,0xE5}, {0xC6,0xE6}, {0xC7,0xE7}, {0xC8,0xE8}, 
+  {0xC9,0xE9}, {0xCA,0xEA}, {0xCB,0xEB}, {0xCC,0xEC}, {0xCD,0xED}, 
+  {0xCE,0xEE}, {0xCF,0xEF}, {0xD0,0xF0}, {0xD1,0xF1}, {0xD2,0xF2}, 
+  {0xD3,0xF3}, {0xD4,0xF4}, {0xD5,0xF5}, {0xD6,0xF6}, {0xD8,0xF8}, 
+  {0xD9,0xF9}, {0xDA,0xFA}, {0xDB,0xFB}, {0xDC,0xFC}, {0xDD,0xFD}, 
+  {0xDE,0xFE}, {0x100,0x101}, {0x102,0x103}, {0x104,0x105}, {0x106,0x107}, 
+  {0x108,0x109}, {0x10A,0x10B}, {0x10C,0x10D}, {0x10E,0x10F}, {0x110,0x111}, 
+  {0x112,0x113}, {0x114,0x115}, {0x116,0x117}, {0x118,0x119}, {0x11A,0x11B}, 
+  {0x11C,0x11D}, {0x11E,0x11F}, {0x120,0x121}, {0x122,0x123}, {0x124,0x125}, 
+  {0x126,0x127}, {0x128,0x129}, {0x12A,0x12B}, {0x12C,0x12D}, {0x12E,0x12F}, 
+  {0x130,0x69}, {0x132,0x133}, {0x134,0x135}, {0x136,0x137}, {0x139,0x13A}, 
+  {0x13B,0x13C}, {0x13D,0x13E}, {0x13F,0x140}, {0x141,0x142}, {0x143,0x144}, 
+  {0x145,0x146}, {0x147,0x148}, {0x14A,0x14B}, {0x14C,0x14D}, {0x14E,0x14F}, 
+  {0x150,0x151}, {0x152,0x153}, {0x154,0x155}, {0x156,0x157}, {0x158,0x159}, 
+  {0x15A,0x15B}, {0x15C,0x15D}, {0x15E,0x15F}, {0x160,0x161}, {0x162,0x163}, 
+  {0x164,0x165}, {0x166,0x167}, {0x168,0x169}, {0x16A,0x16B}, {0x16C,0x16D}, 
+  {0x16E,0x16F}, {0x170,0x171}, {0x172,0x173}, {0x174,0x175}, {0x176,0x177}, 
+  {0x178,0xFF}, {0x179,0x17A}, {0x17B,0x17C}, {0x17D,0x17E}, {0x181,0x253}, 
+  {0x182,0x183}, {0x184,0x185}, {0x186,0x254}, {0x187,0x188}, {0x189,0x256}, 
+  {0x18A,0x257}, {0x18B,0x18C}, {0x18E,0x1DD}, {0x18F,0x259}, {0x190,0x25B}, 
+  {0x191,0x192}, {0x193,0x260}, {0x194,0x263}, {0x196,0x269}, {0x197,0x268}, 
+  {0x198,0x199}, {0x19C,0x26F}, {0x19D,0x272}, {0x19F,0x275}, {0x1A0,0x1A1}, 
+  {0x1A2,0x1A3}, {0x1A4,0x1A5}, {0x1A7,0x1A8}, {0x1A9,0x283}, {0x1AC,0x1AD}, 
+  {0x1AE,0x288}, {0x1AF,0x1B0}, {0x1B1,0x28A}, {0x1B2,0x28B}, {0x1B3,0x1B4}, 
+  {0x1B5,0x1B6}, {0x1B7,0x292}, {0x1B8,0x1B9}, {0x1BC,0x1BD}, {0x1C4,0x1C6}, 
+  {0x1C5,0x1C6}, {0x1C7,0x1C9}, {0x1C8,0x1C9}, {0x1CA,0x1CC}, {0x1CB,0x1CC}, 
+  {0x1CD,0x1CE}, {0x1CF,0x1D0}, {0x1D1,0x1D2}, {0x1D3,0x1D4}, {0x1D5,0x1D6}, 
+  {0x1D7,0x1D8}, {0x1D9,0x1DA}, {0x1DB,0x1DC}, {0x1DE,0x1DF}, {0x1E0,0x1E1}, 
+  {0x1E2,0x1E3}, {0x1E4,0x1E5}, {0x1E6,0x1E7}, {0x1E8,0x1E9}, {0x1EA,0x1EB}, 
+  {0x1EC,0x1ED}, {0x1EE,0x1EF}, {0x1F1,0x1F3}, {0x1F2,0x1F3}, {0x1F4,0x1F5}, 
+  {0x1FA,0x1FB}, {0x1FC,0x1FD}, {0x1FE,0x1FF}, {0x200,0x201}, {0x202,0x203}, 
+  {0x204,0x205}, {0x206,0x207}, {0x208,0x209}, {0x20A,0x20B}, {0x20C,0x20D}, 
+  {0x20E,0x20F}, {0x210,0x211}, {0x212,0x213}, {0x214,0x215}, {0x216,0x217}, 
+  {0x386,0x3AC}, {0x388,0x3AD}, {0x389,0x3AE}, {0x38A,0x3AF}, {0x38C,0x3CC}, 
+  {0x38E,0x3CD}, {0x38F,0x3CE}, {0x391,0x3B1}, {0x392,0x3B2}, {0x393,0x3B3}, 
+  {0x394,0x3B4}, {0x395,0x3B5}, {0x396,0x3B6}, {0x397,0x3B7}, {0x398,0x3B8}, 
+  {0x399,0x3B9}, {0x39A,0x3BA}, {0x39B,0x3BB}, {0x39C,0x3BC}, {0x39D,0x3BD}, 
+  {0x39E,0x3BE}, {0x39F,0x3BF}, {0x3A0,0x3C0}, {0x3A1,0x3C1}, {0x3A3,0x3C3}, 
+  {0x3A4,0x3C4}, {0x3A5,0x3C5}, {0x3A6,0x3C6}, {0x3A7,0x3C7}, {0x3A8,0x3C8}, 
+  {0x3A9,0x3C9}, {0x3AA,0x3CA}, {0x3AB,0x3CB}, {0x3E2,0x3E3}, {0x3E4,0x3E5}, 
+  {0x3E6,0x3E7}, {0x3E8,0x3E9}, {0x3EA,0x3EB}, {0x3EC,0x3ED}, {0x3EE,0x3EF}, 
+  {0x401,0x451}, {0x402,0x452}, {0x403,0x453}, {0x404,0x454}, {0x405,0x455}, 
+  {0x406,0x456}, {0x407,0x457}, {0x408,0x458}, {0x409,0x459}, {0x40A,0x45A}, 
+  {0x40B,0x45B}, {0x40C,0x45C}, {0x40E,0x45E}, {0x40F,0x45F}, {0x410,0x430}, 
+  {0x411,0x431}, {0x412,0x432}, {0x413,0x433}, {0x414,0x434}, {0x415,0x435}, 
+  {0x416,0x436}, {0x417,0x437}, {0x418,0x438}, {0x419,0x439}, {0x41A,0x43A}, 
+  {0x41B,0x43B}, {0x41C,0x43C}, {0x41D,0x43D}, {0x41E,0x43E}, {0x41F,0x43F}, 
+  {0x420,0x440}, {0x421,0x441}, {0x422,0x442}, {0x423,0x443}, {0x424,0x444}, 
+  {0x425,0x445}, {0x426,0x446}, {0x427,0x447}, {0x428,0x448}, {0x429,0x449}, 
+  {0x42A,0x44A}, {0x42B,0x44B}, {0x42C,0x44C}, {0x42D,0x44D}, {0x42E,0x44E}, 
+  {0x42F,0x44F}, {0x460,0x461}, {0x462,0x463}, {0x464,0x465}, {0x466,0x467}, 
+  {0x468,0x469}, {0x46A,0x46B}, {0x46C,0x46D}, {0x46E,0x46F}, {0x470,0x471}, 
+  {0x472,0x473}, {0x474,0x475}, {0x476,0x477}, {0x478,0x479}, {0x47A,0x47B}, 
+  {0x47C,0x47D}, {0x47E,0x47F}, {0x480,0x481}, {0x490,0x491}, {0x492,0x493}, 
+  {0x494,0x495}, {0x496,0x497}, {0x498,0x499}, {0x49A,0x49B}, {0x49C,0x49D}, 
+  {0x49E,0x49F}, {0x4A0,0x4A1}, {0x4A2,0x4A3}, {0x4A4,0x4A5}, {0x4A6,0x4A7}, 
+  {0x4A8,0x4A9}, {0x4AA,0x4AB}, {0x4AC,0x4AD}, {0x4AE,0x4AF}, {0x4B0,0x4B1}, 
+  {0x4B2,0x4B3}, {0x4B4,0x4B5}, {0x4B6,0x4B7}, {0x4B8,0x4B9}, {0x4BA,0x4BB}, 
+  {0x4BC,0x4BD}, {0x4BE,0x4BF}, {0x4C1,0x4C2}, {0x4C3,0x4C4}, {0x4C7,0x4C8}, 
+  {0x4CB,0x4CC}, {0x4D0,0x4D1}, {0x4D2,0x4D3}, {0x4D4,0x4D5}, {0x4D6,0x4D7}, 
+  {0x4D8,0x4D9}, {0x4DA,0x4DB}, {0x4DC,0x4DD}, {0x4DE,0x4DF}, {0x4E0,0x4E1}, 
+  {0x4E2,0x4E3}, {0x4E4,0x4E5}, {0x4E6,0x4E7}, {0x4E8,0x4E9}, {0x4EA,0x4EB}, 
+  {0x4EE,0x4EF}, {0x4F0,0x4F1}, {0x4F2,0x4F3}, {0x4F4,0x4F5}, {0x4F8,0x4F9}, 
+  {0x531,0x561}, {0x532,0x562}, {0x533,0x563}, {0x534,0x564}, {0x535,0x565}, 
+  {0x536,0x566}, {0x537,0x567}, {0x538,0x568}, {0x539,0x569}, {0x53A,0x56A}, 
+  {0x53B,0x56B}, {0x53C,0x56C}, {0x53D,0x56D}, {0x53E,0x56E}, {0x53F,0x56F}, 
+  {0x540,0x570}, {0x541,0x571}, {0x542,0x572}, {0x543,0x573}, {0x544,0x574}, 
+  {0x545,0x575}, {0x546,0x576}, {0x547,0x577}, {0x548,0x578}, {0x549,0x579}, 
+  {0x54A,0x57A}, {0x54B,0x57B}, {0x54C,0x57C}, {0x54D,0x57D}, {0x54E,0x57E}, 
+  {0x54F,0x57F}, {0x550,0x580}, {0x551,0x581}, {0x552,0x582}, {0x553,0x583}, 
+  {0x554,0x584}, {0x555,0x585}, {0x556,0x586}, {0x10A0,0x10D0}, {0x10A1,0x10D1}, 
+  {0x10A2,0x10D2}, {0x10A3,0x10D3}, {0x10A4,0x10D4}, {0x10A5,0x10D5}, {0x10A6,0x10D6}, 
+  {0x10A7,0x10D7}, {0x10A8,0x10D8}, {0x10A9,0x10D9}, {0x10AA,0x10DA}, {0x10AB,0x10DB}, 
+  {0x10AC,0x10DC}, {0x10AD,0x10DD}, {0x10AE,0x10DE}, {0x10AF,0x10DF}, {0x10B0,0x10E0}, 
+  {0x10B1,0x10E1}, {0x10B2,0x10E2}, {0x10B3,0x10E3}, {0x10B4,0x10E4}, {0x10B5,0x10E5}, 
+  {0x10B6,0x10E6}, {0x10B7,0x10E7}, {0x10B8,0x10E8}, {0x10B9,0x10E9}, {0x10BA,0x10EA}, 
+  {0x10BB,0x10EB}, {0x10BC,0x10EC}, {0x10BD,0x10ED}, {0x10BE,0x10EE}, {0x10BF,0x10EF}, 
+  {0x10C0,0x10F0}, {0x10C1,0x10F1}, {0x10C2,0x10F2}, {0x10C3,0x10F3}, {0x10C4,0x10F4}, 
+  {0x10C5,0x10F5}, {0x1E00,0x1E01}, {0x1E02,0x1E03}, {0x1E04,0x1E05}, {0x1E06,0x1E07}, 
+  {0x1E08,0x1E09}, {0x1E0A,0x1E0B}, {0x1E0C,0x1E0D}, {0x1E0E,0x1E0F}, {0x1E10,0x1E11}, 
+  {0x1E12,0x1E13}, {0x1E14,0x1E15}, {0x1E16,0x1E17}, {0x1E18,0x1E19}, {0x1E1A,0x1E1B}, 
+  {0x1E1C,0x1E1D}, {0x1E1E,0x1E1F}, {0x1E20,0x1E21}, {0x1E22,0x1E23}, {0x1E24,0x1E25}, 
+  {0x1E26,0x1E27}, {0x1E28,0x1E29}, {0x1E2A,0x1E2B}, {0x1E2C,0x1E2D}, {0x1E2E,0x1E2F}, 
+  {0x1E30,0x1E31}, {0x1E32,0x1E33}, {0x1E34,0x1E35}, {0x1E36,0x1E37}, {0x1E38,0x1E39}, 
+  {0x1E3A,0x1E3B}, {0x1E3C,0x1E3D}, {0x1E3E,0x1E3F}, {0x1E40,0x1E41}, {0x1E42,0x1E43}, 
+  {0x1E44,0x1E45}, {0x1E46,0x1E47}, {0x1E48,0x1E49}, {0x1E4A,0x1E4B}, {0x1E4C,0x1E4D}, 
+  {0x1E4E,0x1E4F}, {0x1E50,0x1E51}, {0x1E52,0x1E53}, {0x1E54,0x1E55}, {0x1E56,0x1E57}, 
+  {0x1E58,0x1E59}, {0x1E5A,0x1E5B}, {0x1E5C,0x1E5D}, {0x1E5E,0x1E5F}, {0x1E60,0x1E61}, 
+  {0x1E62,0x1E63}, {0x1E64,0x1E65}, {0x1E66,0x1E67}, {0x1E68,0x1E69}, {0x1E6A,0x1E6B}, 
+  {0x1E6C,0x1E6D}, {0x1E6E,0x1E6F}, {0x1E70,0x1E71}, {0x1E72,0x1E73}, {0x1E74,0x1E75}, 
+  {0x1E76,0x1E77}, {0x1E78,0x1E79}, {0x1E7A,0x1E7B}, {0x1E7C,0x1E7D}, {0x1E7E,0x1E7F}, 
+  {0x1E80,0x1E81}, {0x1E82,0x1E83}, {0x1E84,0x1E85}, {0x1E86,0x1E87}, {0x1E88,0x1E89}, 
+  {0x1E8A,0x1E8B}, {0x1E8C,0x1E8D}, {0x1E8E,0x1E8F}, {0x1E90,0x1E91}, {0x1E92,0x1E93}, 
+  {0x1E94,0x1E95}, {0x1EA0,0x1EA1}, {0x1EA2,0x1EA3}, {0x1EA4,0x1EA5}, {0x1EA6,0x1EA7}, 
+  {0x1EA8,0x1EA9}, {0x1EAA,0x1EAB}, {0x1EAC,0x1EAD}, {0x1EAE,0x1EAF}, {0x1EB0,0x1EB1}, 
+  {0x1EB2,0x1EB3}, {0x1EB4,0x1EB5}, {0x1EB6,0x1EB7}, {0x1EB8,0x1EB9}, {0x1EBA,0x1EBB}, 
+  {0x1EBC,0x1EBD}, {0x1EBE,0x1EBF}, {0x1EC0,0x1EC1}, {0x1EC2,0x1EC3}, {0x1EC4,0x1EC5}, 
+  {0x1EC6,0x1EC7}, {0x1EC8,0x1EC9}, {0x1ECA,0x1ECB}, {0x1ECC,0x1ECD}, {0x1ECE,0x1ECF}, 
+  {0x1ED0,0x1ED1}, {0x1ED2,0x1ED3}, {0x1ED4,0x1ED5}, {0x1ED6,0x1ED7}, {0x1ED8,0x1ED9}, 
+  {0x1EDA,0x1EDB}, {0x1EDC,0x1EDD}, {0x1EDE,0x1EDF}, {0x1EE0,0x1EE1}, {0x1EE2,0x1EE3}, 
+  {0x1EE4,0x1EE5}, {0x1EE6,0x1EE7}, {0x1EE8,0x1EE9}, {0x1EEA,0x1EEB}, {0x1EEC,0x1EED}, 
+  {0x1EEE,0x1EEF}, {0x1EF0,0x1EF1}, {0x1EF2,0x1EF3}, {0x1EF4,0x1EF5}, {0x1EF6,0x1EF7}, 
+  {0x1EF8,0x1EF9}, {0x1F08,0x1F00}, {0x1F09,0x1F01}, {0x1F0A,0x1F02}, {0x1F0B,0x1F03}, 
+  {0x1F0C,0x1F04}, {0x1F0D,0x1F05}, {0x1F0E,0x1F06}, {0x1F0F,0x1F07}, {0x1F18,0x1F10}, 
+  {0x1F19,0x1F11}, {0x1F1A,0x1F12}, {0x1F1B,0x1F13}, {0x1F1C,0x1F14}, {0x1F1D,0x1F15}, 
+  {0x1F28,0x1F20}, {0x1F29,0x1F21}, {0x1F2A,0x1F22}, {0x1F2B,0x1F23}, {0x1F2C,0x1F24}, 
+  {0x1F2D,0x1F25}, {0x1F2E,0x1F26}, {0x1F2F,0x1F27}, {0x1F38,0x1F30}, {0x1F39,0x1F31}, 
+  {0x1F3A,0x1F32}, {0x1F3B,0x1F33}, {0x1F3C,0x1F34}, {0x1F3D,0x1F35}, {0x1F3E,0x1F36}, 
+  {0x1F3F,0x1F37}, {0x1F48,0x1F40}, {0x1F49,0x1F41}, {0x1F4A,0x1F42}, {0x1F4B,0x1F43}, 
+  {0x1F4C,0x1F44}, {0x1F4D,0x1F45}, {0x1F59,0x1F51}, {0x1F5B,0x1F53}, {0x1F5D,0x1F55}, 
+  {0x1F5F,0x1F57}, {0x1F68,0x1F60}, {0x1F69,0x1F61}, {0x1F6A,0x1F62}, {0x1F6B,0x1F63}, 
+  {0x1F6C,0x1F64}, {0x1F6D,0x1F65}, {0x1F6E,0x1F66}, {0x1F6F,0x1F67}, {0x1F88,0x1F80}, 
+  {0x1F89,0x1F81}, {0x1F8A,0x1F82}, {0x1F8B,0x1F83}, {0x1F8C,0x1F84}, {0x1F8D,0x1F85}, 
+  {0x1F8E,0x1F86}, {0x1F8F,0x1F87}, {0x1F98,0x1F90}, {0x1F99,0x1F91}, {0x1F9A,0x1F92}, 
+  {0x1F9B,0x1F93}, {0x1F9C,0x1F94}, {0x1F9D,0x1F95}, {0x1F9E,0x1F96}, {0x1F9F,0x1F97}, 
+  {0x1FA8,0x1FA0}, {0x1FA9,0x1FA1}, {0x1FAA,0x1FA2}, {0x1FAB,0x1FA3}, {0x1FAC,0x1FA4}, 
+  {0x1FAD,0x1FA5}, {0x1FAE,0x1FA6}, {0x1FAF,0x1FA7}, {0x1FB8,0x1FB0}, {0x1FB9,0x1FB1}, 
+  {0x1FBA,0x1F70}, {0x1FBB,0x1F71}, {0x1FBC,0x1FB3}, {0x1FC8,0x1F72}, {0x1FC9,0x1F73}, 
+  {0x1FCA,0x1F74}, {0x1FCB,0x1F75}, {0x1FCC,0x1FC3}, {0x1FD8,0x1FD0}, {0x1FD9,0x1FD1}, 
+  {0x1FDA,0x1F76}, {0x1FDB,0x1F77}, {0x1FE8,0x1FE0}, {0x1FE9,0x1FE1}, {0x1FEA,0x1F7A}, 
+  {0x1FEB,0x1F7B}, {0x1FEC,0x1FE5}, {0x1FF8,0x1F78}, {0x1FF9,0x1F79}, {0x1FFA,0x1F7C}, 
+  {0x1FFB,0x1F7D}, {0x1FFC,0x1FF3}, {0x2160,0x2170}, {0x2161,0x2171}, {0x2162,0x2172}, 
+  {0x2163,0x2173}, {0x2164,0x2174}, {0x2165,0x2175}, {0x2166,0x2176}, {0x2167,0x2177}, 
+  {0x2168,0x2178}, {0x2169,0x2179}, {0x216A,0x217A}, {0x216B,0x217B}, {0x216C,0x217C}, 
+  {0x216D,0x217D}, {0x216E,0x217E}, {0x216F,0x217F}, {0x24B6,0x24D0}, {0x24B7,0x24D1}, 
+  {0x24B8,0x24D2}, {0x24B9,0x24D3}, {0x24BA,0x24D4}, {0x24BB,0x24D5}, {0x24BC,0x24D6}, 
+  {0x24BD,0x24D7}, {0x24BE,0x24D8}, {0x24BF,0x24D9}, {0x24C0,0x24DA}, {0x24C1,0x24DB}, 
+  {0x24C2,0x24DC}, {0x24C3,0x24DD}, {0x24C4,0x24DE}, {0x24C5,0x24DF}, {0x24C6,0x24E0}, 
+  {0x24C7,0x24E1}, {0x24C8,0x24E2}, {0x24C9,0x24E3}, {0x24CA,0x24E4}, {0x24CB,0x24E5}, 
+  {0x24CC,0x24E6}, {0x24CD,0x24E7}, {0x24CE,0x24E8}, {0x24CF,0x24E9}, {0xFF21,0xFF41}, 
+  {0xFF22,0xFF42}, {0xFF23,0xFF43}, {0xFF24,0xFF44}, {0xFF25,0xFF45}, {0xFF26,0xFF46}, 
+  {0xFF27,0xFF47}, {0xFF28,0xFF48}, {0xFF29,0xFF49}, {0xFF2A,0xFF4A}, {0xFF2B,0xFF4B}, 
+  {0xFF2C,0xFF4C}, {0xFF2D,0xFF4D}, {0xFF2E,0xFF4E}, {0xFF2F,0xFF4F}, {0xFF30,0xFF50}, 
+  {0xFF31,0xFF51}, {0xFF32,0xFF52}, {0xFF33,0xFF53}, {0xFF34,0xFF54}, {0xFF35,0xFF55}, 
+  {0xFF36,0xFF56}, {0xFF37,0xFF57}, {0xFF38,0xFF58}, {0xFF39,0xFF59}, {0xFF3A,0xFF5A}
+};
+
+
+
+#define NUM_TOSIMPLIFIED_INFO 2145
+static const unirelate tosimplified_info[NUM_TOSIMPLIFIED_INFO] = {
+  {0x4E48,0x9EBD}, {0x4E82,0x4E71}, {0x4E9E,0x4E9A}, {0x4F47,0x4F2B}, {0x4F59,0x9980}, 
+  {0x4F86,0x6765}, {0x4F96,0x4ED1}, {0x4FE0,0x4FA0}, {0x5000,0x4F25}, {0x5006,0x4FE9}, 
+  {0x5009,0x4ED3}, {0x500B,0x4E2A}, {0x5011,0x4EEC}, {0x502B,0x4F26}, {0x5049,0x4F1F}, 
+  {0x5074,0x4FA7}, {0x5075,0x4FA6}, {0x5096,0x4F27}, {0x5098,0x4F1E}, {0x5099,0x5907}, 
+  {0x50AD,0x4F63}, {0x50B3,0x4F20}, {0x50B4,0x4F1B}, {0x50B5,0x503A}, {0x50B7,0x4F24}, 
+  {0x50BE,0x503E}, {0x50C2,0x507B}, {0x50C5,0x4EC5}, {0x50C9,0x4F65}, {0x50D1,0x4FA8}, 
+  {0x50D5,0x4EC6}, {0x50DE,0x4F2A}, {0x50E5,0x4FA5}, {0x50E8,0x507E}, {0x50F9,0x4EF7}, 
+  {0x5100,0x4EEA}, {0x5102,0x4FAC}, {0x5104,0x4EBF}, {0x5108,0x4FA9}, {0x5109,0x4FED}, 
+  {0x5110,0x50A7}, {0x5114,0x4FE6}, {0x5115,0x4FAA}, {0x511F,0x507F}, {0x512A,0x4F18}, 
+  {0x5132,0x50A8}, {0x5137,0x4FEA}, {0x513A,0x50A9}, {0x513B,0x50A5}, {0x513C,0x4FE8}, 
+  {0x5152,0x513F}, {0x5169,0x4E24}, {0x51C8,0x51C0}, {0x51CD,0x51BB}, {0x51F1,0x51EF}, 
+  {0x5244,0x522D}, {0x5247,0x5219}, {0x525B,0x521A}, {0x526E,0x5250}, {0x5274,0x5240}, 
+  {0x5275,0x521B}, {0x5283,0x5212}, {0x5287,0x5267}, {0x5289,0x5218}, {0x528A,0x523D}, 
+  {0x528C,0x523F}, {0x528D,0x5251}, {0x5291,0x5242}, {0x52C1,0x52B2}, {0x52D5,0x52A8}, 
+  {0x52D9,0x52A1}, {0x52DB,0x52CB}, {0x52DD,0x80DC}, {0x52DE,0x52B3}, {0x52E2,0x52BF}, 
+  {0x52F1,0x52A2}, {0x52F5,0x52B1}, {0x52F8,0x529D}, {0x532D,0x5326}, {0x532F,0x6C47}, 
+  {0x5331,0x532E}, {0x5340,0x533A}, {0x5354,0x534F}, {0x5399,0x538D}, {0x53A0,0x5395}, 
+  {0x53AD,0x538C}, {0x53B2,0x5389}, {0x53B4,0x53A3}, {0x53C3,0x53C2}, {0x53E2,0x4E1B}, 
+  {0x540E,0x5F8C}, {0x54BC,0x5459}, {0x54E1,0x5458}, {0x5504,0x5457}, {0x554F,0x95EE}, 
+  {0x5553,0x542F}, {0x555E,0x54D1}, {0x559A,0x5524}, {0x55AA,0x4E27}, {0x55AC,0x4E54}, 
+  {0x55AE,0x5355}, {0x55B2,0x54DF}, {0x55C6,0x545B}, {0x55C7,0x556C}, {0x55CE,0x5417}, 
+  {0x55DA,0x545C}, {0x55E9,0x5522}, {0x55F6,0x54D4}, {0x5606,0x53F9}, {0x560D,0x55BD}, 
+  {0x5614,0x5455}, {0x5616,0x5567}, {0x5617,0x5C1D}, {0x561C,0x551B}, {0x5629,0x54D7}, 
+  {0x562E,0x5520}, {0x562F,0x5578}, {0x5630,0x53FD}, {0x5635,0x54D3}, {0x5638,0x5452}, 
+  {0x565D,0x549D}, {0x5660,0x54D2}, {0x5665,0x54DD}, {0x5666,0x54D5}, {0x566F,0x55F3}, 
+  {0x5672,0x54D9}, {0x5674,0x55B7}, {0x5678,0x5428}, {0x5680,0x549B}, {0x5687,0x5413}, 
+  {0x568C,0x54DC}, {0x5695,0x565C}, {0x5699,0x556E}, {0x56A6,0x5456}, {0x56A8,0x5499}, 
+  {0x56B3,0x55BE}, {0x56B4,0x4E25}, {0x56B6,0x5624}, {0x56C0,0x556D}, {0x56C1,0x55EB}, 
+  {0x56C2,0x56A3}, {0x56C5,0x5181}, {0x56C8,0x5453}, {0x56D1,0x5631}, {0x5707,0x56F5}, 
+  {0x570B,0x56FD}, {0x570D,0x56F4}, {0x5712,0x56ED}, {0x5713,0x5706}, {0x5716,0x56FE}, 
+  {0x5718,0x56E2}, {0x57E1,0x57AD}, {0x57F7,0x6267}, {0x5805,0x575A}, {0x580A,0x57A9}, 
+  {0x5816,0x57B4}, {0x581D,0x57DA}, {0x582F,0x5C27}, {0x5831,0x62A5}, {0x5834,0x573A}, 
+  {0x584A,0x5757}, {0x584B,0x8314}, {0x584F,0x57B2}, {0x5852,0x57D8}, {0x5857,0x6D82}, 
+  {0x5862,0x575E}, {0x5864,0x57D9}, {0x5875,0x5C18}, {0x5879,0x5811}, {0x588A,0x57AB}, 
+  {0x589C,0x5760}, {0x58AE,0x5815}, {0x58B3,0x575F}, {0x58BB,0x5899}, {0x58BE,0x57A6}, 
+  {0x58C7,0x575B}, {0x58D3,0x538B}, {0x58D8,0x5792}, {0x58D9,0x5739}, {0x58DA,0x5786}, 
+  {0x58DE,0x574F}, {0x58DF,0x5784}, {0x58E0,0x5785}, {0x58E2,0x575C}, {0x58E9,0x575D}, 
+  {0x58EF,0x58EE}, {0x58FA,0x58F6}, {0x58FD,0x5BFF}, {0x5922,0x68A6}, {0x593E,0x5939}, 
+  {0x5950,0x5942}, {0x5969,0x5941}, {0x596A,0x593A}, {0x596C,0x5956}, {0x596E,0x594B}, 
+  {0x599D,0x5986}, {0x5A41,0x5A04}, {0x5A66,0x5987}, {0x5A6D,0x5A05}, {0x5AA7,0x5A32}, 
+  {0x5ABD,0x5988}, {0x5AD7,0x59AA}, {0x5AF5,0x59A9}, {0x5AFB,0x5A34}, {0x5B00,0x59AB}, 
+  {0x5B08,0x5A06}, {0x5B0B,0x5A75}, {0x5B0C,0x5A07}, {0x5B19,0x5AF1}, {0x5B21,0x5AD2}, 
+  {0x5B2A,0x5AD4}, {0x5B30,0x5A74}, {0x5B38,0x5A76}, {0x5B4C,0x5A08}, {0x5B6B,0x5B59}, 
+  {0x5B78,0x5B66}, {0x5B7F,0x5B6A}, {0x5BE2,0x5BDD}, {0x5BE6,0x5B9E}, {0x5BE7,0x5B81}, 
+  {0x5BE9,0x5BA1}, {0x5BEB,0x5199}, {0x5BEC,0x5BBD}, {0x5BF5,0x5BA0}, {0x5BF6,0x5B9D}, 
+  {0x5C07,0x5C06}, {0x5C08,0x4E13}, {0x5C0B,0x5BFB}, {0x5C0D,0x5BF9}, {0x5C0E,0x5BFC}, 
+  {0x5C37,0x5C34}, {0x5C62,0x5C61}, {0x5C64,0x5C42}, {0x5C68,0x5C66}, {0x5C6C,0x5C5E}, 
+  {0x5CA1,0x5188}, {0x5CF4,0x5C98}, {0x5CF6,0x5C9B}, {0x5CFD,0x5CE1}, {0x5D0D,0x5D03}, 
+  {0x5D17,0x5C97}, {0x5D22,0x5CE5}, {0x5D2C,0x5CBD}, {0x5D50,0x5C9A}, {0x5D81,0x5D5D}, 
+  {0x5D84,0x5D2D}, {0x5D87,0x5C96}, {0x5D97,0x5D02}, {0x5DA0,0x5CE4}, {0x5DA7,0x5CC4}, 
+  {0x5DB8,0x5D58}, {0x5DBA,0x5CAD}, {0x5DBC,0x5C7F}, {0x5DCB,0x5CBF}, {0x5DD2,0x5CE6}, 
+  {0x5DD4,0x5DC5}, {0x5DF0,0x5DEF}, {0x5E25,0x5E05}, {0x5E2B,0x5E08}, {0x5E33,0x5E10}, 
+  {0x5E36,0x5E26}, {0x5E40,0x5E27}, {0x5E43,0x5E0F}, {0x5E57,0x5E3C}, {0x5E58,0x5E3B}, 
+  {0x5E5F,0x5E1C}, {0x5E63,0x5E01}, {0x5E6B,0x5E2E}, {0x5E6C,0x5E31}, {0x5E79,0x5E72}, 
+  {0x5E7E,0x51E0}, {0x5EAB,0x5E93}, {0x5EDF,0x5E99}, {0x5EE0,0x5382}, {0x5EE1,0x5E91}, 
+  {0x5EE2,0x5E9F}, {0x5EE3,0x5E7F}, {0x5EEC,0x5E90}, {0x5EF3,0x5385}, {0x5F33,0x5F2A}, 
+  {0x5F35,0x5F20}, {0x5F48,0x5F39}, {0x5F4C,0x5F25}, {0x5F4E,0x5F2F}, {0x5F8C,0x540E}, 
+  {0x5F91,0x5F84}, {0x5F9E,0x4ECE}, {0x5FA0,0x5F95}, {0x5FA9,0x590D}, {0x5FB9,0x5F7B}, 
+  {0x60B5,0x6005}, {0x60B6,0x95F7}, {0x60E1,0x6076}, {0x60F1,0x607C}, {0x60F2,0x607D}, 
+  {0x60FB,0x607B}, {0x611B,0x7231}, {0x611C,0x60EC}, {0x6134,0x6006}, {0x6137,0x607A}, 
+  {0x613E,0x5FFE}, {0x614B,0x6001}, {0x6158,0x60E8}, {0x615A,0x60ED}, {0x615F,0x6078}, 
+  {0x6163,0x60EF}, {0x6164,0x60AB}, {0x616A,0x6004}, {0x616B,0x6002}, {0x616E,0x8651}, 
+  {0x6173,0x60AD}, {0x6176,0x5E86}, {0x6182,0x5FE7}, {0x618A,0x60EB}, {0x6190,0x601C}, 
+  {0x6191,0x51ED}, {0x6192,0x6126}, {0x619A,0x60EE}, {0x61A4,0x6124}, {0x61AB,0x60AF}, 
+  {0x61AE,0x6003}, {0x61B2,0x5BAA}, {0x61B6,0x5FC6}, {0x61C7,0x6073}, {0x61C9,0x5E94}, 
+  {0x61CC,0x603F}, {0x61DF,0x603C}, {0x61E3,0x61D1}, {0x61E8,0x6079}, {0x61F2,0x60E9}, 
+  {0x61F6,0x61D2}, {0x61F7,0x6000}, {0x61F8,0x60AC}, {0x61FA,0x5FCF}, {0x61FC,0x60E7}, 
+  {0x61FE,0x6151}, {0x6200,0x604B}, {0x6207,0x6206}, {0x6214,0x620B}, {0x6227,0x6217}, 
+  {0x6229,0x622C}, {0x6230,0x6218}, {0x6232,0x620F}, {0x633E,0x631F}, {0x6368,0x820D}, 
+  {0x636B,0x626A}, {0x6383,0x626B}, {0x6384,0x62A1}, {0x6399,0x6323}, {0x63C0,0x62E3}, 
+  {0x63DA,0x626C}, {0x63DB,0x6362}, {0x63EE,0x6325}, {0x640D,0x635F}, {0x6417,0x6363}, 
+  {0x6436,0x62A2}, {0x6451,0x63B4}, {0x645C,0x63BC}, {0x645F,0x6402}, {0x646F,0x631A}, 
+  {0x6473,0x62A0}, {0x6476,0x629F}, {0x647B,0x63BA}, {0x6488,0x635E}, {0x6493,0x6320}, 
+  {0x649F,0x6322}, {0x64A3,0x63B8}, {0x64A5,0x62E8}, {0x64AB,0x629A}, {0x64B2,0x6251}, 
+  {0x64B3,0x63FF}, {0x64BB,0x631E}, {0x64BE,0x631D}, {0x64BF,0x6361}, {0x64C1,0x62E5}, 
+  {0x64C4,0x63B3}, {0x64C7,0x62E9}, {0x64CA,0x51FB}, {0x64CB,0x6321}, {0x64D4,0x62C5}, 
+  {0x64DA,0x636E}, {0x64E0,0x6324}, {0x64EC,0x62DF}, {0x64EF,0x6448}, {0x64F0,0x62E7}, 
+  {0x64F1,0x6401}, {0x64F2,0x63B7}, {0x64F4,0x6269}, {0x64F7,0x64B7}, {0x64FA,0x6446}, 
+  {0x64FB,0x64DE}, {0x64FC,0x64B8}, {0x64FE,0x6270}, {0x6504,0x6445}, {0x6506,0x64B5}, 
+  {0x650F,0x62E2}, {0x6514,0x62E6}, {0x6516,0x6484}, {0x6519,0x6400}, {0x651B,0x64BA}, 
+  {0x651D,0x6444}, {0x6522,0x6512}, {0x6523,0x631B}, {0x6524,0x644A}, {0x652A,0x6405}, 
+  {0x652C,0x63FD}, {0x6557,0x8D25}, {0x6575,0x654C}, {0x6578,0x6570}, {0x6582,0x655B}, 
+  {0x6583,0x6BD9}, {0x6595,0x6593}, {0x65AC,0x65A9}, {0x65B7,0x65AD}, {0x6642,0x65F6}, 
+  {0x6649,0x664B}, {0x665D,0x663C}, {0x6688,0x6655}, {0x6689,0x6656}, {0x66A2,0x7545}, 
+  {0x66AB,0x6682}, {0x66C4,0x6654}, {0x66C7,0x6619}, {0x66C9,0x6653}, {0x66D6,0x66A7}, 
+  {0x66E0,0x65F7}, {0x66EC,0x6652}, {0x66F8,0x4E66}, {0x6703,0x4F1A}, {0x6727,0x80E7}, 
+  {0x6771,0x4E1C}, {0x6898,0x67A7}, {0x689D,0x6761}, {0x689F,0x67AD}, {0x68C4,0x5F03}, 
+  {0x68D6,0x67A8}, {0x68D7,0x67A3}, {0x68DF,0x680B}, {0x68E7,0x6808}, {0x68F2,0x6816}, 
+  {0x690F,0x6860}, {0x694A,0x6768}, {0x6953,0x67AB}, {0x6968,0x6862}, {0x696D,0x4E1A}, 
+  {0x6975,0x6781}, {0x69AA,0x6769}, {0x69AE,0x8363}, {0x69BF,0x6864}, {0x69CB,0x6784}, 
+  {0x69CD,0x67AA}, {0x69E7,0x6920}, {0x69F3,0x6868}, {0x6A01,0x6869}, {0x6A02,0x4E50}, 
+  {0x6A05,0x679E}, {0x6A13,0x697C}, {0x6A19,0x6807}, {0x6A1E,0x67A2}, {0x6A23,0x6837}, 
+  {0x6A38,0x6734}, {0x6A39,0x6811}, {0x6A3A,0x6866}, {0x6A48,0x6861}, {0x6A4B,0x6865}, 
+  {0x6A5F,0x673A}, {0x6A62,0x692D}, {0x6A89,0x67FD}, {0x6A94,0x6863}, {0x6A9C,0x6867}, 
+  {0x6AA2,0x68C0}, {0x6AA3,0x6A2F}, {0x6AB3,0x69DF}, {0x6AB8,0x67E0}, {0x6ABB,0x69DB}, 
+  {0x6AC3,0x67DC}, {0x6AD3,0x6A79}, {0x6ADA,0x6988}, {0x6ADB,0x6809}, {0x6ADD,0x691F}, 
+  {0x6ADE,0x6A7C}, {0x6ADF,0x680E}, {0x6AE7,0x69E0}, {0x6AE8,0x680C}, {0x6AEA,0x67A5}, 
+  {0x6AEC,0x6987}, {0x6AF3,0x680A}, {0x6AF8,0x6989}, {0x6AFB,0x6A31}, {0x6B04,0x680F}, 
+  {0x6B0A,0x6743}, {0x6B0F,0x6924}, {0x6B12,0x683E}, {0x6B16,0x6984}, {0x6B1E,0x68C2}, 
+  {0x6B3D,0x94A6}, {0x6B50,0x6B27}, {0x6B5F,0x6B24}, {0x6B61,0x6B22}, {0x6B72,0x5C81}, 
+  {0x6B77,0x5386}, {0x6B78,0x5F52}, {0x6B98,0x6B8B}, {0x6B9E,0x6B92}, {0x6BA4,0x6B87}, 
+  {0x6BAB,0x6B9A}, {0x6BAE,0x6B93}, {0x6BAF,0x6BA1}, {0x6BB2,0x6B7C}, {0x6BBA,0x6740}, 
+  {0x6BBB,0x58F3}, {0x6BC6,0x6BB4}, {0x6BFF,0x6BF5}, {0x6C08,0x6BE1}, {0x6C0C,0x6C07}, 
+  {0x6C23,0x6C14}, {0x6C2B,0x6C22}, {0x6C2C,0x6C29}, {0x6D79,0x6D43}, {0x6D87,0x6CFE}, 
+  {0x6DEA,0x6CA6}, {0x6DF5,0x6E0A}, {0x6DF6,0x6D9E}, {0x6DFA,0x6D45}, {0x6E19,0x6DA3}, 
+  {0x6E26,0x6DA1}, {0x6E2C,0x6D4B}, {0x6E3E,0x6D51}, {0x6E5E,0x6D48}, {0x6E6F,0x6C64}, 
+  {0x6E96,0x51C6}, {0x6E9D,0x6C9F}, {0x6EC4,0x6CA7}, {0x6EC5,0x706D}, {0x6ECC,0x6DA4}, 
+  {0x6ECE,0x8365}, {0x6EEC,0x6CAA}, {0x6EEF,0x6EDE}, {0x6EF2,0x6E17}, {0x6EF7,0x5364}, 
+  {0x6EF8,0x6D52}, {0x6EFF,0x6EE1}, {0x6F01,0x6E14}, {0x6F1A,0x6CA4}, {0x6F22,0x6C49}, 
+  {0x6F23,0x6D9F}, {0x6F2C,0x6E0D}, {0x6F32,0x6DA8}, {0x6F38,0x6E10}, {0x6F3F,0x6D46}, 
+  {0x6F41,0x988D}, {0x6F51,0x6CFC}, {0x6F54,0x6D01}, {0x6F59,0x6CA9}, {0x6F5B,0x6F5C}, 
+  {0x6F64,0x6DA6}, {0x6F6F,0x6D54}, {0x6F70,0x6E83}, {0x6F77,0x6ED7}, {0x6F7F,0x6DA0}, 
+  {0x6F80,0x6DA9}, {0x6F86,0x6D47}, {0x6F87,0x6D9D}, {0x6F97,0x6DA7}, {0x6FA0,0x6E11}, 
+  {0x6FA4,0x6CFD}, {0x6FA9,0x6CF6}, {0x6FAE,0x6D4D}, {0x6FB1,0x6DC0}, {0x6FC1,0x6D4A}, 
+  {0x6FC3,0x6D53}, {0x6FD5,0x6E7F}, {0x6FD8,0x6CDE}, {0x6FDF,0x6D4E}, {0x6FE4,0x6D9B}, 
+  {0x6FEB,0x6EE5}, {0x6FF0,0x6F4D}, {0x6FF1,0x6EE8}, {0x6FFA,0x6E85}, {0x6FFC,0x6CFA}, 
+  {0x6FFE,0x6EE4}, {0x7005,0x6EE2}, {0x7006,0x6E0E}, {0x7009,0x6CFB}, {0x700B,0x6E16}, 
+  {0x700F,0x6D4F}, {0x7015,0x6FD2}, {0x7018,0x6CF8}, {0x701D,0x6CA5}, {0x701F,0x6F47}, 
+  {0x7020,0x6F46}, {0x7027,0x6CF7}, {0x7028,0x6FD1}, {0x7032,0x6F4B}, {0x703E,0x6F9C}, 
+  {0x7043,0x6CA3}, {0x7044,0x6EE0}, {0x7051,0x6D12}, {0x7055,0x6F13}, {0x7058,0x6EE9}, 
+  {0x705D,0x704F}, {0x7063,0x6E7E}, {0x7064,0x6EE6}, {0x7067,0x6EDF}, {0x70CF,0x4E4C}, 
+  {0x70F4,0x70C3}, {0x7121,0x65E0}, {0x7149,0x70BC}, {0x7152,0x709C}, {0x7162,0x8315}, 
+  {0x7165,0x7115}, {0x7169,0x70E6}, {0x716C,0x7080}, {0x7192,0x8367}, {0x7197,0x709D}, 
+  {0x71B1,0x70ED}, {0x71BE,0x70BD}, {0x71C1,0x70E8}, {0x71C8,0x706F}, {0x71D2,0x70E7}, 
+  {0x71D9,0x70EB}, {0x71DC,0x7116}, {0x71DF,0x8425}, {0x71E6,0x707F}, {0x71ED,0x70DB}, 
+  {0x71F4,0x70E9}, {0x71FC,0x70EC}, {0x71FE,0x7118}, {0x720D,0x70C1}, {0x7210,0x7089}, 
+  {0x721B,0x70C2}, {0x722D,0x4E89}, {0x7232,0x4E3A}, {0x723A,0x7237}, {0x723E,0x5C14}, 
+  {0x7258,0x724D}, {0x727D,0x7275}, {0x7296,0x8366}, {0x72A2,0x728A}, {0x72A7,0x727A}, 
+  {0x72C0,0x72B6}, {0x72F9,0x72ED}, {0x72FD,0x72C8}, {0x7319,0x72F0}, {0x7336,0x72B9}, 
+  {0x733B,0x72F2}, {0x7341,0x72B8}, {0x7344,0x72F1}, {0x7345,0x72EE}, {0x7368,0x72EC}, 
+  {0x736A,0x72EF}, {0x736B,0x7303}, {0x7370,0x72DE}, {0x7372,0x83B7}, {0x7375,0x730E}, 
+  {0x7377,0x72B7}, {0x7378,0x517D}, {0x737A,0x736D}, {0x737B,0x732E}, {0x737C,0x7315}, 
+  {0x7380,0x7321}, {0x73FE,0x73B0}, {0x743F,0x73F2}, {0x744B,0x73AE}, {0x7463,0x7410}, 
+  {0x7469,0x83B9}, {0x746A,0x739B}, {0x7489,0x740F}, {0x74A3,0x7391}, {0x74A6,0x7477}, 
+  {0x74B0,0x73AF}, {0x74BD,0x73BA}, {0x74CA,0x743C}, {0x74CF,0x73D1}, {0x74D4,0x748E}, 
+  {0x74DA,0x74D2}, {0x750C,0x74EF}, {0x7523,0x4EA7}, {0x755D,0x4EA9}, {0x7562,0x6BD5}, 
+  {0x756B,0x753B}, {0x7576,0x5F53}, {0x7587,0x7574}, {0x758A,0x53E0}, {0x75D9,0x75C9}, 
+  {0x7602,0x75D6}, {0x760B,0x75AF}, {0x760D,0x75A1}, {0x7613,0x75EA}, {0x761E,0x7617}, 
+  {0x7621,0x75AE}, {0x7627,0x759F}, {0x763B,0x7618}, {0x7642,0x7597}, {0x7646,0x75E8}, 
+  {0x7647,0x75EB}, {0x7649,0x7605}, {0x7658,0x75A0}, {0x765F,0x762A}, {0x7662,0x75D2}, 
+  {0x7664,0x7596}, {0x7665,0x75C7}, {0x7667,0x75AC}, {0x7669,0x765E}, {0x766C,0x7663}, 
+  {0x766D,0x763F}, {0x766E,0x763E}, {0x7670,0x75C8}, {0x7671,0x762B}, {0x7672,0x766B}, 
+  {0x767C,0x53D1}, {0x769A,0x7691}, {0x76B8,0x76B2}, {0x76BA,0x76B1}, {0x76DE,0x76CF}, 
+  {0x76E1,0x5C3D}, {0x76E3,0x76D1}, {0x76E4,0x76D8}, {0x76E7,0x5362}, {0x775C,0x7741}, 
+  {0x775E,0x7750}, {0x7798,0x770D}, {0x779E,0x7792}, {0x77BC,0x7751}, {0x77DA,0x77A9}, 
+  {0x77EF,0x77EB}, {0x7864,0x7856}, {0x7868,0x7817}, {0x786F,0x781A}, {0x78A9,0x7855}, 
+  {0x78AD,0x7800}, {0x78B8,0x781C}, {0x78BA,0x786E}, {0x78BC,0x7801}, {0x78DA,0x7816}, 
+  {0x78E3,0x789C}, {0x78E7,0x789B}, {0x78EF,0x77F6}, {0x78FD,0x7857}, {0x790E,0x7840}, 
+  {0x7919,0x788D}, {0x7926,0x77FF}, {0x792A,0x783A}, {0x792B,0x783E}, {0x792C,0x77FE}, 
+  {0x7931,0x783B}, {0x798D,0x7978}, {0x798E,0x796F}, {0x79AA,0x7985}, {0x79AE,0x793C}, 
+  {0x79B0,0x7962}, {0x79B1,0x7977}, {0x7A2E,0x79CD}, {0x7A31,0x79F0}, {0x7A4C,0x7A23}, 
+  {0x7A4D,0x79EF}, {0x7A4E,0x9896}, {0x7A61,0x7A51}, {0x7A62,0x79FD}, {0x7A69,0x7A33}, 
+  {0x7AA9,0x7A9D}, {0x7AAA,0x6D3C}, {0x7AAE,0x7A77}, {0x7AB6,0x7AAD}, {0x7ABA,0x7AA5}, 
+  {0x7AC4,0x7A9C}, {0x7AC5,0x7A8D}, {0x7AC7,0x7AA6}, {0x7AC8,0x7076}, {0x7ACA,0x7A83}, 
+  {0x7AEA,0x7AD6}, {0x7AF6,0x7ADE}, {0x7B46,0x7B14}, {0x7B67,0x7B15}, {0x7B8B,0x7B3A}, 
+  {0x7B8F,0x7B5D}, {0x7BC0,0x8282}, {0x7BC4,0x8303}, {0x7BC9,0x7B51}, {0x7BCB,0x7BA7}, 
+  {0x7BE4,0x7B03}, {0x7BE9,0x7B5B}, {0x7BF3,0x7B5A}, {0x7C00,0x7BA6}, {0x7C0D,0x7BD3}, 
+  {0x7C1E,0x7BAA}, {0x7C21,0x7B80}, {0x7C23,0x7BD1}, {0x7C2B,0x7BAB}, {0x7C3D,0x7B7E}, 
+  {0x7C3E,0x5E18}, {0x7C43,0x7BEE}, {0x7C4C,0x7B79}, {0x7C5C,0x7BA8}, {0x7C5F,0x7C41}, 
+  {0x7C60,0x7B3C}, {0x7C69,0x7B3E}, {0x7C6A,0x7C16}, {0x7C6C,0x7BF1}, {0x7C6E,0x7BA9}, 
+  {0x7CDD,0x7CC1}, {0x7CDE,0x7CAA}, {0x7CE7,0x7CAE}, {0x7CF2,0x7C9D}, {0x7CF4,0x7C74}, 
+  {0x7CF6,0x7C9C}, {0x7CF9,0x7E9F}, {0x7CFE,0x7EA0}, {0x7D00,0x7EAA}, {0x7D02,0x7EA3}, 
+  {0x7D04,0x7EA6}, {0x7D05,0x7EA2}, {0x7D06,0x7EA1}, {0x7D07,0x7EA5}, {0x7D08,0x7EA8}, 
+  {0x7D09,0x7EAB}, {0x7D0B,0x7EB9}, {0x7D0D,0x7EB3}, {0x7D10,0x7EBD}, {0x7D13,0x7EBE}, 
+  {0x7D14,0x7EAF}, {0x7D15,0x7EB0}, {0x7D17,0x7EB1}, {0x7D19,0x7EB8}, {0x7D1A,0x7EA7}, 
+  {0x7D1B,0x7EB7}, {0x7D1C,0x7EAD}, {0x7D21,0x7EBA}, {0x7D30,0x7EC6}, {0x7D31,0x7EC2}, 
+  {0x7D32,0x7EC1}, {0x7D33,0x7EC5}, {0x7D39,0x7ECD}, {0x7D3A,0x7EC0}, {0x7D3C,0x7ECB}, 
+  {0x7D3F,0x7ED0}, {0x7D40,0x7ECC}, {0x7D42,0x7EC8}, {0x7D44,0x7EC4}, {0x7D46,0x7ECA}, 
+  {0x7D4E,0x7ED7}, {0x7D50,0x7ED3}, {0x7D5D,0x7ED4}, {0x7D5E,0x7EDE}, {0x7D61,0x7EDC}, 
+  {0x7D62,0x7EDA}, {0x7D66,0x7ED9}, {0x7D68,0x7ED2}, {0x7D71,0x7EDF}, {0x7D72,0x4E1D}, 
+  {0x7D73,0x7EDB}, {0x7D76,0x7EDD}, {0x7D79,0x7EE2}, {0x7D81,0x7ED1}, {0x7D83,0x7EE1}, 
+  {0x7D86,0x7EE0}, {0x7D88,0x7EE8}, {0x7D89,0x7EE3}, {0x7D8F,0x7EE5}, {0x7D93,0x7ECF}, 
+  {0x7D9C,0x7EFC}, {0x7D9E,0x7F0D}, {0x7DA2,0x7EF8}, {0x7DA3,0x7EFB}, {0x7DAB,0x7EBF}, 
+  {0x7DAC,0x7EF6}, {0x7DAD,0x7EF4}, {0x7DB0,0x7EFE}, {0x7DB1,0x7EB2}, {0x7DB2,0x7F51}, 
+  {0x7DB3,0x7EF7}, {0x7DB4,0x7F00}, {0x7DB8,0x7EB6}, {0x7DB9,0x7EFA}, {0x7DBA,0x7EEE}, 
+  {0x7DBB,0x7EFD}, {0x7DBD,0x7EF0}, {0x7DBE,0x7EEB}, {0x7DBF,0x7EF5}, {0x7DC4,0x7EF2}, 
+  {0x7DC7,0x7F01}, {0x7DCA,0x7D27}, {0x7DCB,0x7EEF}, {0x7DD1,0x7EFF}, {0x7DD2,0x7EEA}, 
+  {0x7DD4,0x7EF1}, {0x7DD7,0x7F03}, {0x7DD8,0x7F04}, {0x7DD9,0x7F02}, {0x7DDD,0x7F09}, 
+  {0x7DDE,0x7F0E}, {0x7DE0,0x7F14}, {0x7DE1,0x7F17}, {0x7DE3,0x7F18}, {0x7DE6,0x7F0C}, 
+  {0x7DE8,0x7F16}, {0x7DE9,0x7F13}, {0x7DEC,0x7F05}, {0x7DEF,0x7EAC}, {0x7DF1,0x7F11}, 
+  {0x7DF2,0x7F08}, {0x7DF4,0x7EC3}, {0x7DF6,0x7F0F}, {0x7DF9,0x7F07}, {0x7E08,0x8426}, 
+  {0x7E09,0x7F19}, {0x7E0A,0x7F22}, {0x7E0B,0x7F12}, {0x7E10,0x7EC9}, {0x7E11,0x7F23}, 
+  {0x7E1B,0x7F1A}, {0x7E1D,0x7F1C}, {0x7E1E,0x7F1F}, {0x7E1F,0x7F1B}, {0x7E23,0x53BF}, 
+  {0x7E27,0x7EE6}, {0x7E2B,0x7F1D}, {0x7E2D,0x7F21}, {0x7E2E,0x7F29}, {0x7E31,0x7EB5}, 
+  {0x7E32,0x7F27}, {0x7E35,0x7F26}, {0x7E36,0x7D77}, {0x7E37,0x7F15}, {0x7E39,0x7F25}, 
+  {0x7E3D,0x603B}, {0x7E3E,0x7EE9}, {0x7E45,0x7F2B}, {0x7E46,0x7F2A}, {0x7E52,0x7F2F}, 
+  {0x7E54,0x7EC7}, {0x7E55,0x7F2E}, {0x7E5A,0x7F2D}, {0x7E5E,0x7ED5}, {0x7E62,0x7F0B}, 
+  {0x7E69,0x7EF3}, {0x7E6A,0x7ED8}, {0x7E6D,0x8327}, {0x7E6E,0x7F30}, {0x7E6F,0x7F33}, 
+  {0x7E70,0x7F32}, {0x7E73,0x7F34}, {0x7E79,0x7ECE}, {0x7E7C,0x7EE7}, {0x7E7D,0x7F24}, 
+  {0x7E7E,0x7F31}, {0x7E88,0x7F2C}, {0x7E8A,0x7EA9}, {0x7E8C,0x7EED}, {0x7E8F,0x7F20}, 
+  {0x7E93,0x7F28}, {0x7E96,0x7EA4}, {0x7E98,0x7F35}, {0x7E9C,0x7F06}, {0x7F4C,0x7F42}, 
+  {0x7F70,0x7F5A}, {0x7F77,0x7F62}, {0x7F85,0x7F57}, {0x7F86,0x7F74}, {0x7F88,0x7F81}, 
+  {0x7FA5,0x7F9F}, {0x7FA9,0x4E49}, {0x7FD2,0x4E60}, {0x7FF9,0x7FD8}, {0x802C,0x8027}, 
+  {0x802E,0x8022}, {0x8056,0x5723}, {0x805E,0x95FB}, {0x806F,0x8054}, {0x8070,0x806A}, 
+  {0x8072,0x58F0}, {0x8073,0x8038}, {0x8075,0x8069}, {0x8076,0x8042}, {0x8077,0x804C}, 
+  {0x8079,0x804D}, {0x807D,0x542C}, {0x807E,0x804B}, {0x8085,0x8083}, {0x8105,0x80C1}, 
+  {0x811B,0x80EB}, {0x8139,0x80C0}, {0x814E,0x80BE}, {0x8156,0x80E8}, {0x8161,0x8136}, 
+  {0x8166,0x8111}, {0x816B,0x80BF}, {0x8178,0x80A0}, {0x819A,0x80A4}, {0x81A0,0x80F6}, 
+  {0x81A9,0x817B}, {0x81BD,0x80C6}, {0x81BE,0x810D}, {0x81BF,0x8113}, {0x81C9,0x8138}, 
+  {0x81CD,0x8110}, {0x81CF,0x8191}, {0x81D8,0x814A}, {0x81DA,0x80EA}, {0x81DF,0x810F}, 
+  {0x81E0,0x8114}, {0x81E8,0x4E34}, {0x81FA,0x53F0}, {0x8207,0x4E0E}, {0x8208,0x5174}, 
+  {0x8209,0x4E3E}, {0x820A,0x65E7}, {0x8259,0x8231}, {0x8264,0x8223}, {0x8266,0x8230}, 
+  {0x826B,0x823B}, {0x8271,0x8270}, {0x8277,0x8273}, {0x82BB,0x520D}, {0x82E7,0x82CE}, 
+  {0x838A,0x5E84}, {0x8396,0x830E}, {0x83A2,0x835A}, {0x83A7,0x82CB}, {0x83EF,0x534E}, 
+  {0x8407,0x82CC}, {0x840A,0x83B1}, {0x842C,0x4E07}, {0x8435,0x83B4}, {0x8449,0x53F6}, 
+  {0x8452,0x836D}, {0x8464,0x836E}, {0x8466,0x82C7}, {0x8477,0x8364}, {0x8493,0x83BC}, 
+  {0x8494,0x83B3}, {0x84BC,0x82CD}, {0x84C0,0x836A}, {0x84CB,0x76D6}, {0x84EE,0x83B2}, 
+  {0x84EF,0x82C1}, {0x84FD,0x835C}, {0x851E,0x848C}, {0x8523,0x848B}, {0x8526,0x8311}, 
+  {0x852D,0x836B}, {0x8541,0x8368}, {0x8546,0x8487}, {0x854E,0x835E}, {0x8552,0x836C}, 
+  {0x8553,0x82B8}, {0x8555,0x83B8}, {0x8558,0x835B}, {0x8562,0x8489}, {0x8569,0x8361}, 
+  {0x856A,0x829C}, {0x856D,0x8427}, {0x8577,0x84E3}, {0x8588,0x835F}, {0x858A,0x84DF}, 
+  {0x858C,0x8297}, {0x8594,0x8537}, {0x859F,0x83B6}, {0x85A6,0x8350}, {0x85A9,0x8428}, 
+  {0x85BA,0x8360}, {0x85CD,0x84DD}, {0x85CE,0x8369}, {0x85DD,0x827A}, {0x85E5,0x836F}, 
+  {0x85EA,0x85AE}, {0x85F4,0x8574}, {0x85F6,0x82C8}, {0x85F9,0x853C}, {0x85FA,0x853A}, 
+  {0x8604,0x8572}, {0x8606,0x82A6}, {0x8607,0x82CF}, {0x860B,0x82F9}, {0x861A,0x85D3}, 
+  {0x861E,0x8539}, {0x8622,0x830F}, {0x862D,0x5170}, {0x863A,0x84E0}, {0x863F,0x841D}, 
+  {0x8655,0x5904}, {0x865C,0x864F}, {0x865F,0x53F7}, {0x8667,0x4E8F}, {0x86FA,0x86F1}, 
+  {0x8706,0x86AC}, {0x8755,0x8680}, {0x8766,0x867E}, {0x8778,0x8717}, {0x8784,0x86F3}, 
+  {0x879E,0x8682}, {0x87A2,0x8424}, {0x87BB,0x877C}, {0x87C4,0x86F0}, {0x87C8,0x8748}, 
+  {0x87CE,0x87A8}, {0x87E3,0x866E}, {0x87EC,0x8749}, {0x87EF,0x86F2}, {0x87F2,0x866B}, 
+  {0x87F6,0x86CF}, {0x87FB,0x8681}, {0x8805,0x8747}, {0x8806,0x867F}, {0x8810,0x86F4}, 
+  {0x8811,0x877E}, {0x881F,0x8721}, {0x8823,0x86CE}, {0x8831,0x86CA}, {0x8836,0x8695}, 
+  {0x883B,0x86EE}, {0x8846,0x4F17}, {0x8853,0x672F}, {0x885B,0x536B}, {0x885D,0x51B2}, 
+  {0x8879,0x53EA}, {0x88CA,0x8885}, {0x88CF,0x91CC}, {0x88DC,0x8865}, {0x88DD,0x88C5}, 
+  {0x8932,0x88E4}, {0x8933,0x88E2}, {0x8938,0x891B}, {0x893B,0x4EB5}, {0x8947,0x88E5}, 
+  {0x8956,0x8884}, {0x895D,0x88E3}, {0x8960,0x88C6}, {0x8964,0x8934}, {0x896A,0x889C}, 
+  {0x896F,0x886C}, {0x8972,0x88AD}, {0x898B,0x89C1}, {0x898F,0x89C4}, {0x8993,0x89C5}, 
+  {0x8996,0x89C6}, {0x8998,0x89C7}, {0x89A1,0x89CB}, {0x89A6,0x89CE}, {0x89AA,0x4EB2}, 
+  {0x89AC,0x89CA}, {0x89AF,0x89CF}, {0x89B2,0x89D0}, {0x89B7,0x89D1}, {0x89BA,0x89C9}, 
+  {0x89BD,0x89C8}, {0x89BF,0x89CC}, {0x89C0,0x89C2}, {0x89F4,0x89DE}, {0x89F6,0x89EF}, 
+  {0x89F8,0x89E6}, {0x8A01,0x8BA0}, {0x8A02,0x8BA2}, {0x8A03,0x8BA3}, {0x8A08,0x8BA1}, 
+  {0x8A0A,0x8BAF}, {0x8A0C,0x8BA7}, {0x8A0E,0x8BA8}, {0x8A10,0x8BA6}, {0x8A13,0x8BAD}, 
+  {0x8A15,0x8BAA}, {0x8A16,0x8BAB}, {0x8A18,0x8BB0}, {0x8A1B,0x8BB9}, {0x8A1D,0x8BB6}, 
+  {0x8A1F,0x8BBC}, {0x8A23,0x8BC0}, {0x8A25,0x8BB7}, {0x8A2A,0x8BBF}, {0x8A2D,0x8BBE}, 
+  {0x8A31,0x8BB8}, {0x8A34,0x8BC9}, {0x8A36,0x8BC3}, {0x8A3A,0x8BCA}, {0x8A41,0x8BC2}, 
+  {0x8A46,0x8BCB}, {0x8A4E,0x8BB5}, {0x8A50,0x8BC8}, {0x8A52,0x8BD2}, {0x8A54,0x8BCF}, 
+  {0x8A55,0x8BC4}, {0x8A58,0x8BCE}, {0x8A5B,0x8BC5}, {0x8A5E,0x8BCD}, {0x8A61,0x8BE9}, 
+  {0x8A62,0x8BE2}, {0x8A63,0x8BE3}, {0x8A66,0x8BD5}, {0x8A69,0x8BD7}, {0x8A6B,0x8BE7}, 
+  {0x8A6C,0x8BDF}, {0x8A6D,0x8BE1}, {0x8A6E,0x8BE0}, {0x8A70,0x8BD8}, {0x8A71,0x8BDD}, 
+  {0x8A72,0x8BE5}, {0x8A73,0x8BE6}, {0x8A75,0x8BDC}, {0x8A7C,0x8BD9}, {0x8A7F,0x8BD6}, 
+  {0x8A84,0x8BD4}, {0x8A85,0x8BDB}, {0x8A86,0x8BD3}, {0x8A87,0x5938}, {0x8A8D,0x8BA4}, 
+  {0x8A91,0x8BF3}, {0x8A92,0x8BF6}, {0x8A95,0x8BDE}, {0x8A98,0x8BF1}, {0x8A9A,0x8BEE}, 
+  {0x8A9E,0x8BED}, {0x8AA0,0x8BDA}, {0x8AA1,0x8BEB}, {0x8AA3,0x8BEC}, {0x8AA4,0x8BEF}, 
+  {0x8AA5,0x8BF0}, {0x8AA6,0x8BF5}, {0x8AA8,0x8BF2}, {0x8AAC,0x8BF4}, {0x8AB0,0x8C01}, 
+  {0x8AB2,0x8BFE}, {0x8AB6,0x8C07}, {0x8AB9,0x8BFD}, {0x8ABC,0x8C0A}, {0x8ABF,0x8C03}, 
+  {0x8AC2,0x8C04}, {0x8AC4,0x8C06}, {0x8AC7,0x8C08}, {0x8AC9,0x8BFF}, {0x8ACB,0x8BF7}, 
+  {0x8ACD,0x8BE4}, {0x8ACF,0x8BF9}, {0x8AD1,0x8BFC}, {0x8AD2,0x8C05}, {0x8AD6,0x8BBA}, 
+  {0x8AD7,0x8C02}, {0x8ADB,0x8C00}, {0x8ADC,0x8C0D}, {0x8ADE,0x8C1D}, {0x8AE2,0x8BE8}, 
+  {0x8AE4,0x8C14}, {0x8AE6,0x8C1B}, {0x8AE7,0x8C10}, {0x8AEB,0x8C0F}, {0x8AED,0x8C15}, 
+  {0x8AEE,0x8C18}, {0x8AF1,0x8BB3}, {0x8AF3,0x8C19}, {0x8AF6,0x8C0C}, {0x8AF7,0x8BBD}, 
+  {0x8AF8,0x8BF8}, {0x8AFA,0x8C1A}, {0x8AFC,0x8C16}, {0x8AFE,0x8BFA}, {0x8B00,0x8C0B}, 
+  {0x8B01,0x8C12}, {0x8B02,0x8C13}, {0x8B04,0x8A8A}, {0x8B05,0x8BCC}, {0x8B0A,0x8C0E}, 
+  {0x8B0E,0x8C1C}, {0x8B10,0x8C27}, {0x8B14,0x8C11}, {0x8B16,0x8C21}, {0x8B17,0x8C24}, 
+  {0x8B19,0x8C26}, {0x8B1A,0x8C25}, {0x8B1B,0x8BB2}, {0x8B1D,0x8C22}, {0x8B21,0x8C23}, 
+  {0x8B28,0x8C1F}, {0x8B2B,0x8C2A}, {0x8B2C,0x8C2C}, {0x8B2D,0x8C2B}, {0x8B33,0x8BB4}, 
+  {0x8B39,0x8C28}, {0x8B3E,0x8C29}, {0x8B49,0x8BC1}, {0x8B4E,0x8C32}, {0x8B4F,0x8BA5}, 
+  {0x8B56,0x8C2E}, {0x8B58,0x8BC6}, {0x8B59,0x8C2F}, {0x8B5A,0x8C2D}, {0x8B5C,0x8C31}, 
+  {0x8B6B,0x8C35}, {0x8B6F,0x8BD1}, {0x8B70,0x8BAE}, {0x8B74,0x8C34}, {0x8B77,0x62A4}, 
+  {0x8B7D,0x8A89}, {0x8B80,0x8BFB}, {0x8B8A,0x53D8}, {0x8B8E,0x96E0}, {0x8B92,0x8C17}, 
+  {0x8B93,0x8BA9}, {0x8B95,0x8C30}, {0x8B96,0x8C36}, {0x8B9C,0x8C20}, {0x8B9E,0x8C33}, 
+  {0x8C48,0x5C82}, {0x8C50,0x4E30}, {0x8C9D,0x8D1D}, {0x8C9E,0x8D1E}, {0x8CA0,0x8D1F}, 
+  {0x8CA1,0x8D22}, {0x8CA2,0x8D21}, {0x8CA7,0x8D2B}, {0x8CA8,0x8D27}, {0x8CA9,0x8D29}, 
+  {0x8CAA,0x8D2A}, {0x8CAB,0x8D2F}, {0x8CAC,0x8D23}, {0x8CAF,0x8D2E}, {0x8CB0,0x8D33}, 
+  {0x8CB2,0x8D40}, {0x8CB3,0x8D30}, {0x8CB4,0x8D35}, {0x8CB6,0x8D2C}, {0x8CB7,0x4E70}, 
+  {0x8CB8,0x8D37}, {0x8CBA,0x8D36}, {0x8CBB,0x8D39}, {0x8CBC,0x8D34}, {0x8CBD,0x8D3B}, 
+  {0x8CBF,0x8D38}, {0x8CC0,0x8D3A}, {0x8CC1,0x8D32}, {0x8CC2,0x8D42}, {0x8CC3,0x8D41}, 
+  {0x8CC4,0x8D3F}, {0x8CC5,0x8D45}, {0x8CC7,0x8D44}, {0x8CC8,0x8D3E}, {0x8CCA,0x8D3C}, 
+  {0x8CD1,0x8D48}, {0x8CD2,0x8D4A}, {0x8CD3,0x5BBE}, {0x8CD5,0x8D47}, {0x8CDA,0x8D49}, 
+  {0x8CDC,0x8D50}, {0x8CDE,0x8D4F}, {0x8CE0,0x8D54}, {0x8CE1,0x8D53}, {0x8CE2,0x8D24}, 
+  {0x8CE3,0x5356}, {0x8CE4,0x8D31}, {0x8CE6,0x8D4B}, {0x8CE7,0x8D55}, {0x8CEA,0x8D28}, 
+  {0x8CEB,0x8D4D}, {0x8CEC,0x8D26}, {0x8CED,0x8D4C}, {0x8CF4,0x8D56}, {0x8CFA,0x8D5A}, 
+  {0x8CFB,0x8D59}, {0x8CFC,0x8D2D}, {0x8CFD,0x8D5B}, {0x8CFE,0x8D5C}, {0x8D04,0x8D3D}, 
+  {0x8D05,0x8D58}, {0x8D08,0x8D60}, {0x8D0A,0x8D5E}, {0x8D0B,0x8D5D}, {0x8D0D,0x8D61}, 
+  {0x8D0F,0x8D62}, {0x8D10,0x8D46}, {0x8D16,0x8D4E}, {0x8D1B,0x8D63}, {0x8D1C,0x8D43}, 
+  {0x8D95,0x8D76}, {0x8D99,0x8D75}, {0x8DA8,0x8D8B}, {0x8DB2,0x8DB1}, {0x8E10,0x8DF5}, 
+  {0x8E34,0x8E0A}, {0x8E4C,0x8DC4}, {0x8E55,0x8DF8}, {0x8E63,0x8E52}, {0x8E7A,0x8DF7}, 
+  {0x8E89,0x8DB8}, {0x8E8A,0x8E0C}, {0x8E8B,0x8DFB}, {0x8E8D,0x8DC3}, {0x8E91,0x8E2F}, 
+  {0x8E92,0x8DDE}, {0x8E93,0x8E2C}, {0x8E9A,0x8DF9}, {0x8EA1,0x8E51}, {0x8EA5,0x8E7F}, 
+  {0x8EA6,0x8E9C}, {0x8EAA,0x8E8F}, {0x8EC0,0x8EAF}, {0x8ECA,0x8F66}, {0x8ECB,0x8F67}, 
+  {0x8ECC,0x8F68}, {0x8ECD,0x519B}, {0x8ED2,0x8F69}, {0x8ED4,0x8F6B}, {0x8EDB,0x8F6D}, 
+  {0x8EDF,0x8F6F}, {0x8EE4,0x8F77}, {0x8EEB,0x8F78}, {0x8EF2,0x8F71}, {0x8EF8,0x8F74}, 
+  {0x8EF9,0x8F75}, {0x8EFA,0x8F7A}, {0x8EFB,0x8F72}, {0x8EFC,0x8F76}, {0x8EFE,0x8F7C}, 
+  {0x8F03,0x8F83}, {0x8F05,0x8F82}, {0x8F07,0x8F81}, {0x8F09,0x8F7D}, {0x8F0A,0x8F7E}, 
+  {0x8F12,0x8F84}, {0x8F14,0x8F85}, {0x8F15,0x8F7B}, {0x8F1B,0x8F86}, {0x8F1C,0x8F8E}, 
+  {0x8F1D,0x8F89}, {0x8F1E,0x8F8B}, {0x8F1F,0x8F8D}, {0x8F25,0x8F8A}, {0x8F26,0x8F87}, 
+  {0x8F29,0x8F88}, {0x8F2A,0x8F6E}, {0x8F2F,0x8F91}, {0x8F33,0x8F8F}, {0x8F38,0x8F93}, 
+  {0x8F3B,0x8F90}, {0x8F3E,0x8F97}, {0x8F3F,0x8206}, {0x8F42,0x6BC2}, {0x8F44,0x8F96}, 
+  {0x8F45,0x8F95}, {0x8F46,0x8F98}, {0x8F49,0x8F6C}, {0x8F4D,0x8F99}, {0x8F4E,0x8F7F}, 
+  {0x8F54,0x8F9A}, {0x8F5F,0x8F70}, {0x8F61,0x8F94}, {0x8F62,0x8F79}, {0x8F64,0x8F73}, 
+  {0x8FA6,0x529E}, {0x8FAD,0x8F9E}, {0x8FAE,0x8FAB}, {0x8FAF,0x8FA9}, {0x8FB2,0x519C}, 
+  {0x9015,0x8FF3}, {0x9019,0x8FD9}, {0x9023,0x8FDE}, {0x9032,0x8FDB}, {0x904B,0x8FD0}, 
+  {0x904E,0x8FC7}, {0x9054,0x8FBE}, {0x9055,0x8FDD}, {0x905C,0x900A}, {0x905E,0x9012}, 
+  {0x9060,0x8FDC}, {0x9069,0x9002}, {0x9072,0x8FDF}, {0x9077,0x8FC1}, {0x9078,0x9009}, 
+  {0x907A,0x9057}, {0x907C,0x8FBD}, {0x9081,0x8FC8}, {0x9084,0x8FD8}, {0x9087,0x8FE9}, 
+  {0x908A,0x8FB9}, {0x908F,0x903B}, {0x9090,0x9026}, {0x90DF,0x90CF}, {0x90F5,0x90AE}, 
+  {0x9106,0x90D3}, {0x9109,0x4E61}, {0x9112,0x90B9}, {0x9114,0x90AC}, {0x9116,0x90E7}, 
+  {0x9127,0x9093}, {0x912D,0x90D1}, {0x9130,0x90BB}, {0x9132,0x90F8}, {0x9134,0x90BA}, 
+  {0x9136,0x90D0}, {0x913A,0x909D}, {0x9148,0x90E6}, {0x9196,0x915D}, {0x919C,0x4E11}, 
+  {0x91AB,0x533B}, {0x91AC,0x9171}, {0x91C0,0x917F}, {0x91C1,0x8845}, {0x91C3,0x917E}, 
+  {0x91C5,0x917D}, {0x91CB,0x91CA}, {0x91D2,0x9485}, {0x91D3,0x9486}, {0x91D4,0x9487}, 
+  {0x91D5,0x948C}, {0x91D7,0x948A}, {0x91D8,0x9489}, {0x91D9,0x948B}, {0x91DD,0x9488}, 
+  {0x91E3,0x9493}, {0x91E4,0x9490}, {0x91E7,0x948F}, {0x91E9,0x9492}, {0x91F5,0x9497}, 
+  {0x91F7,0x948D}, {0x91F9,0x9495}, {0x91FA,0x948E}, {0x9200,0x94AF}, {0x9201,0x94AB}, 
+  {0x9204,0x94AD}, {0x9208,0x949A}, {0x9209,0x94A0}, {0x920D,0x949D}, {0x920E,0x94A9}, 
+  {0x9210,0x94A4}, {0x9211,0x94A3}, {0x9214,0x949E}, {0x9215,0x94AE}, {0x921E,0x94A7}, 
+  {0x9223,0x9499}, {0x9225,0x94AC}, {0x9226,0x949B}, {0x9227,0x94AA}, {0x922E,0x94CC}, 
+  {0x9230,0x94C8}, {0x9233,0x94B6}, {0x9234,0x94C3}, {0x9237,0x94B4}, {0x9238,0x94B9}, 
+  {0x9239,0x94CD}, {0x923A,0x94B0}, {0x923D,0x94B8}, {0x923E,0x94C0}, {0x923F,0x94BF}, 
+  {0x9240,0x94BE}, {0x9245,0x949C}, {0x9248,0x94CA}, {0x9249,0x94C9}, {0x924D,0x94CB}, 
+  {0x9251,0x94C2}, {0x9255,0x94B7}, {0x9257,0x94B3}, {0x925A,0x94C6}, {0x925B,0x94C5}, 
+  {0x925E,0x94BA}, {0x9262,0x94B5}, {0x9266,0x94B2}, {0x926C,0x94BC}, {0x926D,0x94BD}, 
+  {0x9278,0x94F0}, {0x927A,0x94D2}, {0x927B,0x94EC}, {0x927F,0x94EA}, {0x9280,0x94F6}, 
+  {0x9283,0x94F3}, {0x9285,0x94DC}, {0x9291,0x94E3}, {0x9293,0x94E8}, {0x9296,0x94E2}, 
+  {0x9298,0x94ED}, {0x929A,0x94EB}, {0x929C,0x8854}, {0x92A0,0x94D1}, {0x92A3,0x94F7}, 
+  {0x92A5,0x94F1}, {0x92A6,0x94DF}, {0x92A8,0x94F5}, {0x92A9,0x94E5}, {0x92AA,0x94D5}, 
+  {0x92AB,0x94EF}, {0x92AC,0x94D0}, {0x92B1,0x94DE}, {0x92B7,0x9500}, {0x92B9,0x9508}, 
+  {0x92BB,0x9511}, {0x92BC,0x9509}, {0x92C1,0x94DD}, {0x92C3,0x9512}, {0x92C5,0x950C}, 
+  {0x92C7,0x94A1}, {0x92CC,0x94E4}, {0x92CF,0x94D7}, {0x92D2,0x950B}, {0x92DD,0x950A}, 
+  {0x92DF,0x9513}, {0x92E3,0x94D8}, {0x92E4,0x9504}, {0x92E5,0x9503}, {0x92E6,0x9514}, 
+  {0x92E8,0x9507}, {0x92EA,0x94FA}, {0x92ED,0x9510}, {0x92EE,0x94D6}, {0x92EF,0x9506}, 
+  {0x92F0,0x9502}, {0x92F1,0x94FD}, {0x92F6,0x950D}, {0x92F8,0x952F}, {0x92FC,0x94A2}, 
+  {0x9301,0x951E}, {0x9306,0x9516}, {0x9307,0x952B}, {0x9308,0x9529}, {0x9310,0x9525}, 
+  {0x9312,0x9515}, {0x9315,0x951F}, {0x9318,0x9524}, {0x9319,0x9531}, {0x931A,0x94EE}, 
+  {0x931B,0x951B}, {0x931F,0x952C}, {0x9320,0x952D}, {0x9322,0x94B1}, {0x9326,0x9526}, 
+  {0x9328,0x951A}, {0x932B,0x9521}, {0x932E,0x9522}, {0x932F,0x9519}, {0x9332,0x5F55}, 
+  {0x9333,0x9530}, {0x9338,0x94FC}, {0x9340,0x951D}, {0x9341,0x9528}, {0x9343,0x952A}, 
+  {0x9346,0x9494}, {0x9347,0x9534}, {0x934B,0x9505}, {0x934D,0x9540}, {0x9354,0x9537}, 
+  {0x9358,0x94E1}, {0x935B,0x953B}, {0x9364,0x9538}, {0x9365,0x9532}, {0x9369,0x9518}, 
+  {0x936C,0x9539}, {0x9370,0x953E}, {0x9375,0x952E}, {0x9376,0x9536}, {0x937A,0x9517}, 
+  {0x937E,0x953A}, {0x9382,0x9541}, {0x9384,0x953F}, {0x9387,0x9545}, {0x938A,0x9551}, 
+  {0x9396,0x9501}, {0x9398,0x9549}, {0x93A2,0x94A8}, {0x93A3,0x84E5}, {0x93A6,0x954F}, 
+  {0x93A7,0x94E0}, {0x93A9,0x94E9}, {0x93AA,0x953C}, {0x93AC,0x9550}, {0x93AE,0x9547}, 
+  {0x93B0,0x9552}, {0x93B3,0x954D}, {0x93B5,0x9553}, {0x93B8,0x954C}, {0x93BF,0x954E}, 
+  {0x93C3,0x955E}, {0x93C7,0x955F}, {0x93C8,0x94FE}, {0x93CC,0x9546}, {0x93CD,0x9559}, 
+  {0x93D1,0x955D}, {0x93D7,0x94FF}, {0x93D8,0x9535}, {0x93DC,0x9557}, {0x93DD,0x9558}, 
+  {0x93DE,0x955B}, {0x93DF,0x94F2}, {0x93E1,0x955C}, {0x93E2,0x9556}, {0x93E4,0x9542}, 
+  {0x93E8,0x933E}, {0x93F5,0x94E7}, {0x93F7,0x9564}, {0x93F9,0x956A}, {0x9403,0x94D9}, 
+  {0x940B,0x94F4}, {0x9410,0x9563}, {0x9412,0x94F9}, {0x9413,0x9566}, {0x9414,0x9561}, 
+  {0x9418,0x949F}, {0x9419,0x956B}, {0x941D,0x9562}, {0x9420,0x9568}, {0x9426,0x950E}, 
+  {0x9427,0x950F}, {0x9428,0x9544}, {0x942E,0x9570}, {0x9432,0x956F}, {0x9433,0x956D}, 
+  {0x9435,0x94C1}, {0x9438,0x94CE}, {0x943A,0x94DB}, {0x943F,0x9571}, {0x9444,0x94F8}, 
+  {0x944A,0x956C}, {0x944C,0x9554}, {0x9452,0x9274}, {0x9454,0x9572}, {0x9460,0x94C4}, 
+  {0x9463,0x9573}, {0x9465,0x9565}, {0x946D,0x9567}, {0x9470,0x94A5}, {0x9472,0x9576}, 
+  {0x9477,0x954A}, {0x9479,0x9569}, {0x947C,0x9523}, {0x947D,0x94BB}, {0x947E,0x92AE}, 
+  {0x947F,0x51FF}, {0x9577,0x957F}, {0x9580,0x95E8}, {0x9582,0x95E9}, {0x9583,0x95EA}, 
+  {0x9586,0x95EB}, {0x9589,0x95ED}, {0x958B,0x5F00}, {0x958C,0x95F6}, {0x958E,0x95F3}, 
+  {0x958F,0x95F0}, {0x9591,0x95F2}, {0x9593,0x95F4}, {0x9594,0x95F5}, {0x9598,0x95F8}, 
+  {0x95A1,0x9602}, {0x95A3,0x9601}, {0x95A5,0x9600}, {0x95A8,0x95FA}, {0x95A9,0x95FD}, 
+  {0x95AB,0x9603}, {0x95AC,0x9606}, {0x95AD,0x95FE}, {0x95B2,0x9605}, {0x95B6,0x960A}, 
+  {0x95B9,0x9609}, {0x95BB,0x960E}, {0x95BC,0x960F}, {0x95BD,0x960D}, {0x95BE,0x9608}, 
+  {0x95BF,0x960C}, {0x95C3,0x9612}, {0x95C8,0x95F1}, {0x95CA,0x9614}, {0x95CB,0x9615}, 
+  {0x95CC,0x9611}, {0x95D0,0x9617}, {0x95D4,0x9616}, {0x95D5,0x9619}, {0x95D6,0x95EF}, 
+  {0x95DC,0x5173}, {0x95DE,0x961A}, {0x95E1,0x9610}, {0x95E5,0x95FC}, {0x9658,0x9649}, 
+  {0x965D,0x9655}, {0x9663,0x9635}, {0x9670,0x9634}, {0x9673,0x9648}, {0x9678,0x9646}, 
+  {0x967D,0x9633}, {0x9689,0x9667}, {0x968A,0x961F}, {0x968E,0x9636}, {0x9695,0x9668}, 
+  {0x969B,0x9645}, {0x96A8,0x968F}, {0x96AA,0x9669}, {0x96B1,0x9690}, {0x96B4,0x9647}, 
+  {0x96B8,0x96B6}, {0x96D6,0x867D}, {0x96D9,0x53CC}, {0x96DB,0x96CF}, {0x96DC,0x6742}, 
+  {0x96E2,0x79BB}, {0x96E3,0x96BE}, {0x96F2,0x4E91}, {0x96FB,0x7535}, {0x9727,0x96FE}, 
+  {0x973D,0x9701}, {0x9742,0x96F3}, {0x9744,0x972D}, {0x9748,0x7075}, {0x975A,0x9753}, 
+  {0x975C,0x9759}, {0x9768,0x9765}, {0x978F,0x5DE9}, {0x97BD,0x9792}, {0x97C3,0x9791}, 
+  {0x97C9,0x97AF}, {0x97CB,0x97E6}, {0x97CC,0x97E7}, {0x97D3,0x97E9}, {0x97D9,0x97EA}, 
+  {0x97DC,0x97EC}, {0x97DE,0x97EB}, {0x97FF,0x54CD}, {0x9801,0x9875}, {0x9802,0x9876}, 
+  {0x9803,0x9877}, {0x9805,0x9879}, {0x9806,0x987A}, {0x9807,0x9878}, {0x9808,0x987B}, 
+  {0x980A,0x987C}, {0x980C,0x9882}, {0x980E,0x9880}, {0x980F,0x9883}, {0x9810,0x9884}, 
+  {0x9811,0x987D}, {0x9812,0x9881}, {0x9813,0x987F}, {0x9817,0x9887}, {0x9818,0x9886}, 
+  {0x981C,0x988C}, {0x9821,0x9889}, {0x9824,0x9890}, {0x9826,0x988F}, {0x982D,0x5934}, 
+  {0x9830,0x988A}, {0x9837,0x9894}, {0x9838,0x9888}, {0x983B,0x9891}, {0x983D,0x9893}, 
+  {0x9846,0x9897}, {0x984C,0x9898}, {0x984D,0x989D}, {0x984E,0x989A}, {0x9853,0x989B}, 
+  {0x9854,0x989C}, {0x9858,0x613F}, {0x9859,0x98A1}, {0x985B,0x98A0}, {0x985E,0x7C7B}, 
+  {0x9862,0x989F}, {0x9865,0x98A2}, {0x9867,0x987E}, {0x986B,0x98A4}, {0x986C,0x98A5}, 
+  {0x986F,0x663E}, {0x9870,0x98A6}, {0x9871,0x9885}, {0x9873,0x989E}, {0x9874,0x98A7}, 
+  {0x98A8,0x98CE}, {0x98AE,0x98D1}, {0x98AF,0x98D2}, {0x98B6,0x98D3}, {0x98BC,0x98D5}, 
+  {0x98C4,0x98D8}, {0x98C6,0x98D9}, {0x98C8,0x98DA}, {0x98DB,0x98DE}, {0x98E0,0x9963}, 
+  {0x98E9,0x9968}, {0x98EA,0x996A}, {0x98EB,0x996B}, {0x98ED,0x996C}, {0x98EF,0x996D}, 
+  {0x98F2,0x996E}, {0x98F4,0x9974}, {0x98FC,0x9972}, {0x98FD,0x9971}, {0x98FE,0x9970}, 
+  {0x9903,0x997A}, {0x9905,0x997C}, {0x9909,0x9977}, {0x990A,0x517B}, {0x990C,0x9975}, 
+  {0x9911,0x997D}, {0x9912,0x9981}, {0x9913,0x997F}, {0x9918,0x4F59}, {0x991B,0x9984}, 
+  {0x991E,0x996F}, {0x9921,0x9985}, {0x9928,0x9986}, {0x9933,0x9967}, {0x9937,0x9987}, 
+  {0x993C,0x9969}, {0x993E,0x998F}, {0x993F,0x998A}, {0x9943,0x998D}, {0x9945,0x9992}, 
+  {0x9948,0x9990}, {0x9949,0x9991}, {0x994A,0x9993}, {0x994B,0x9988}, {0x994C,0x9994}, 
+  {0x9951,0x9965}, {0x9952,0x9976}, {0x9957,0x98E8}, {0x995C,0x990D}, {0x995E,0x998B}, 
+  {0x9962,0x9995}, {0x99AC,0x9A6C}, {0x99AD,0x9A6D}, {0x99AE,0x51AF}, {0x99B1,0x9A6E}, 
+  {0x99B3,0x9A70}, {0x99B4,0x9A6F}, {0x99C1,0x9A73}, {0x99D0,0x9A7B}, {0x99D1,0x9A7D}, 
+  {0x99D2,0x9A79}, {0x99D4,0x9A75}, {0x99D5,0x9A7E}, {0x99D8,0x9A80}, {0x99D9,0x9A78}, 
+  {0x99DB,0x9A76}, {0x99DD,0x9A7C}, {0x99DF,0x9A77}, {0x99E1,0x9A82}, {0x99E2,0x9A88}, 
+  {0x99ED,0x9A87}, {0x99F1,0x9A86}, {0x99FF,0x9A8F}, {0x9A01,0x9A8B}, {0x9A05,0x9A93}, 
+  {0x9A0D,0x9A92}, {0x9A0E,0x9A91}, {0x9A0F,0x9A90}, {0x9A16,0x9A9B}, {0x9A19,0x9A97}, 
+  {0x9A2B,0x9A9E}, {0x9A2D,0x9A98}, {0x9A2E,0x9A9D}, {0x9A30,0x817E}, {0x9A36,0x9A7A}, 
+  {0x9A37,0x9A9A}, {0x9A38,0x9A9F}, {0x9A3E,0x9AA1}, {0x9A40,0x84E6}, {0x9A41,0x9A9C}, 
+  {0x9A42,0x9A96}, {0x9A43,0x9AA0}, {0x9A44,0x9AA2}, {0x9A45,0x9A71}, {0x9A4A,0x9A85}, 
+  {0x9A4D,0x9A81}, {0x9A4F,0x9AA3}, {0x9A55,0x9A84}, {0x9A57,0x9A8C}, {0x9A5A,0x60CA}, 
+  {0x9A5B,0x9A7F}, {0x9A5F,0x9AA4}, {0x9A62,0x9A74}, {0x9A64,0x9AA7}, {0x9A65,0x9AA5}, 
+  {0x9A6A,0x9A8A}, {0x9AAF,0x80AE}, {0x9ACF,0x9AC5}, {0x9AD4,0x4F53}, {0x9AD5,0x9ACC}, 
+  {0x9AD6,0x9ACB}, {0x9B06,0x677E}, {0x9B22,0x9B13}, {0x9B25,0x6597}, {0x9B27,0x95F9}, 
+  {0x9B29,0x960B}, {0x9B2E,0x9604}, {0x9B31,0x90C1}, {0x9B4E,0x9B49}, {0x9B58,0x9B47}, 
+  {0x9B5A,0x9C7C}, {0x9B6F,0x9C81}, {0x9B74,0x9C82}, {0x9B77,0x9C7F}, {0x9B81,0x9C85}, 
+  {0x9B83,0x9C86}, {0x9B8E,0x9C87}, {0x9B90,0x9C90}, {0x9B91,0x9C8D}, {0x9B92,0x9C8B}, 
+  {0x9B9A,0x9C92}, {0x9B9D,0x9C9E}, {0x9B9E,0x9C95}, {0x9BAA,0x9C94}, {0x9BAB,0x9C9B}, 
+  {0x9BAD,0x9C91}, {0x9BAE,0x9C9C}, {0x9BC0,0x9CA7}, {0x9BC1,0x9CA0}, {0x9BC7,0x9CA9}, 
+  {0x9BC9,0x9CA4}, {0x9BCA,0x9CA8}, {0x9BD4,0x9CBB}, {0x9BD6,0x9CAD}, {0x9BDB,0x9CB7}, 
+  {0x9BDD,0x9CB4}, {0x9BE1,0x9CB1}, {0x9BE2,0x9CB5}, {0x9BE4,0x9CB2}, {0x9BE7,0x9CB3}, 
+  {0x9BE8,0x9CB8}, {0x9BEA,0x9CAE}, {0x9BEB,0x9CB0}, {0x9BF0,0x9CB6}, {0x9BF4,0x9CBA}, 
+  {0x9BFD,0x9CAB}, {0x9BFF,0x9CCA}, {0x9C08,0x9CBD}, {0x9C09,0x9CC7}, {0x9C0D,0x9CC5}, 
+  {0x9C10,0x9CC4}, {0x9C12,0x9CC6}, {0x9C13,0x9CC3}, {0x9C20,0x9CCB}, {0x9C23,0x9CA5}, 
+  {0x9C25,0x9CCF}, {0x9C28,0x9CCE}, {0x9C29,0x9CD0}, {0x9C2D,0x9CCD}, {0x9C31,0x9CA2}, 
+  {0x9C32,0x9CCC}, {0x9C33,0x9CD3}, {0x9C35,0x9CD8}, {0x9C37,0x9CA6}, {0x9C39,0x9CA3}, 
+  {0x9C3B,0x9CD7}, {0x9C3E,0x9CD4}, {0x9C45,0x9CD9}, {0x9C48,0x9CD5}, {0x9C49,0x9CD6}, 
+  {0x9C52,0x9CDF}, {0x9C54,0x9CDD}, {0x9C56,0x9CDC}, {0x9C57,0x9CDE}, {0x9C58,0x9C9F}, 
+  {0x9C5D,0x9CBC}, {0x9C5F,0x9C8E}, {0x9C67,0x9CE2}, {0x9C6D,0x9C9A}, {0x9C78,0x9C88}, 
+  {0x9C7A,0x9CA1}, {0x9CE5,0x9E1F}, {0x9CE9,0x9E20}, {0x9CEC,0x51EB}, {0x9CF3,0x51E4}, 
+  {0x9CF4,0x9E23}, {0x9CF6,0x9E22}, {0x9D06,0x9E29}, {0x9D07,0x9E28}, {0x9D09,0x9E26}, 
+  {0x9D15,0x9E35}, {0x9D1B,0x9E33}, {0x9D1D,0x9E32}, {0x9D1F,0x9E31}, {0x9D23,0x9E2A}, 
+  {0x9D26,0x9E2F}, {0x9D28,0x9E2D}, {0x9D2F,0x9E38}, {0x9D30,0x9E39}, {0x9D3B,0x9E3F}, 
+  {0x9D3F,0x9E3D}, {0x9D42,0x9E3A}, {0x9D51,0x9E43}, {0x9D52,0x9E46}, {0x9D53,0x9E41}, 
+  {0x9D5C,0x9E48}, {0x9D5D,0x9E45}, {0x9D60,0x9E44}, {0x9D61,0x9E49}, {0x9D6A,0x9E4C}, 
+  {0x9D6C,0x9E4F}, {0x9D6F,0x9E4E}, {0x9D72,0x9E4A}, {0x9D87,0x9E2B}, {0x9D89,0x9E51}, 
+  {0x9D93,0x9E4B}, {0x9D98,0x9E55}, {0x9D9A,0x9E57}, {0x9DA5,0x9E5B}, {0x9DA9,0x9E5C}, 
+  {0x9DAF,0x83BA}, {0x9DB4,0x9E64}, {0x9DBB,0x9E58}, {0x9DBC,0x9E63}, {0x9DC0,0x9E5A}, 
+  {0x9DC2,0x9E5E}, {0x9DC4,0x9E21}, {0x9DD3,0x9E67}, {0x9DD7,0x9E25}, {0x9DD9,0x9E37}, 
+  {0x9DDA,0x9E68}, {0x9DE5,0x9E36}, {0x9DE6,0x9E6A}, {0x9DEF,0x9E69}, {0x9DF2,0x9E6B}, 
+  {0x9DF3,0x9E47}, {0x9DF8,0x9E6C}, {0x9DF9,0x9E70}, {0x9DFA,0x9E6D}, {0x9E0C,0x9E71}, 
+  {0x9E15,0x9E2C}, {0x9E1A,0x9E66}, {0x9E1B,0x9E73}, {0x9E1D,0x9E42}, {0x9E1E,0x9E3E}, 
+  {0x9E7A,0x9E7E}, {0x9E7C,0x7877}, {0x9E7D,0x76D0}, {0x9E97,0x4E3D}, {0x9EA5,0x9EA6}, 
+  {0x9EA9,0x9EB8}, {0x9EBD,0x4E48}, {0x9ECC,0x9EC9}, {0x9EDE,0x70B9}, {0x9EE8,0x515A}, 
+  {0x9EF2,0x9EEA}, {0x9EF7,0x9EE9}, {0x9EFD,0x9EFE}, {0x9EFF,0x9F0B}, {0x9F09,0x9F0D}, 
+  {0x9F4A,0x9F50}, {0x9F4B,0x658B}, {0x9F4F,0x9F51}, {0x9F52,0x9F7F}, {0x9F54,0x9F80}, 
+  {0x9F59,0x9F85}, {0x9F5C,0x9F87}, {0x9F5F,0x9F83}, {0x9F60,0x9F86}, {0x9F61,0x9F84}, 
+  {0x9F66,0x9F88}, {0x9F6A,0x9F8A}, {0x9F6C,0x9F89}, {0x9F72,0x9F8B}, {0x9F77,0x9F8C}, 
+  {0x9F8D,0x9F99}, {0x9F90,0x5E9E}, {0x9F94,0x9F9A}, {0x9F95,0x9F9B}, {0x9F9C,0x9F9F}
+};
+
+
+
+/* the letters correspond to unicode characters which
+ * have Lu, Ll, Lt, Lm, Lo, Mn, Mc, or Me in their
+ * GENERAL CATEGORY */
+
+#define NUM_LETTER_INFO 274
+static const unirange letter_info[NUM_LETTER_INFO] = {
+  {0x41,0x5a}, {0x61,0x7a}, {0xaa,0xaa}, {0xb5,0xb5}, 
+  {0xba,0xba}, {0xc0,0xd6}, {0xd8,0xf6}, {0xf8,0x1f5}, 
+  {0x1fa,0x217}, {0x250,0x2a8}, {0x2b0,0x2b8}, {0x2bb,0x2c1}, 
+  {0x2d0,0x2d1}, {0x2e0,0x2e4}, {0x300,0x345}, {0x360,0x361}, 
+  {0x37a,0x37a}, {0x386,0x386}, {0x388,0x38a}, {0x38c,0x38c}, 
+  {0x38e,0x3a1}, {0x3a3,0x3ce}, {0x3d0,0x3d6}, {0x3da,0x3da}, 
+  {0x3dc,0x3dc}, {0x3de,0x3de}, {0x3e0,0x3e0}, {0x3e2,0x3f3}, 
+  {0x401,0x40c}, {0x40e,0x44f}, {0x451,0x45c}, {0x45e,0x481}, 
+  {0x483,0x486}, {0x490,0x4c4}, {0x4c7,0x4c8}, {0x4cb,0x4cc}, 
+  {0x4d0,0x4eb}, {0x4ee,0x4f5}, {0x4f8,0x4f9}, {0x531,0x556}, 
+  {0x559,0x559}, {0x561,0x587}, {0x591,0x5a1}, {0x5a3,0x5b9}, 
+  {0x5bb,0x5bd}, {0x5bf,0x5bf}, {0x5c1,0x5c2}, {0x5c4,0x5c4}, 
+  {0x5d0,0x5ea}, {0x5f0,0x5f2}, {0x621,0x63a}, {0x640,0x652}, 
+  {0x670,0x6b7}, {0x6ba,0x6be}, {0x6c0,0x6ce}, {0x6d0,0x6d3}, 
+  {0x6d5,0x6e8}, {0x6ea,0x6ed}, {0x901,0x903}, {0x905,0x939}, 
+  {0x93c,0x94d}, {0x951,0x954}, {0x958,0x963}, {0x981,0x983}, 
+  {0x985,0x98c}, {0x98f,0x990}, {0x993,0x9a8}, {0x9aa,0x9b0}, 
+  {0x9b2,0x9b2}, {0x9b6,0x9b9}, {0x9bc,0x9bc}, {0x9be,0x9c4}, 
+  {0x9c7,0x9c8}, {0x9cb,0x9cd}, {0x9d7,0x9d7}, {0x9dc,0x9dd}, 
+  {0x9df,0x9e3}, {0x9f0,0x9f1}, {0xa02,0xa02}, {0xa05,0xa0a}, 
+  {0xa0f,0xa10}, {0xa13,0xa28}, {0xa2a,0xa30}, {0xa32,0xa33}, 
+  {0xa35,0xa36}, {0xa38,0xa39}, {0xa3c,0xa3c}, {0xa3e,0xa42}, 
+  {0xa47,0xa48}, {0xa4b,0xa4d}, {0xa59,0xa5c}, {0xa5e,0xa5e}, 
+  {0xa70,0xa74}, {0xa81,0xa83}, {0xa85,0xa8b}, {0xa8d,0xa8d}, 
+  {0xa8f,0xa91}, {0xa93,0xaa8}, {0xaaa,0xab0}, {0xab2,0xab3}, 
+  {0xab5,0xab9}, {0xabc,0xac5}, {0xac7,0xac9}, {0xacb,0xacd}, 
+  {0xae0,0xae0}, {0xb01,0xb03}, {0xb05,0xb0c}, {0xb0f,0xb10}, 
+  {0xb13,0xb28}, {0xb2a,0xb30}, {0xb32,0xb33}, {0xb36,0xb39}, 
+  {0xb3c,0xb43}, {0xb47,0xb48}, {0xb4b,0xb4d}, {0xb56,0xb57}, 
+  {0xb5c,0xb5d}, {0xb5f,0xb61}, {0xb82,0xb83}, {0xb85,0xb8a}, 
+  {0xb8e,0xb90}, {0xb92,0xb95}, {0xb99,0xb9a}, {0xb9c,0xb9c}, 
+  {0xb9e,0xb9f}, {0xba3,0xba4}, {0xba8,0xbaa}, {0xbae,0xbb5}, 
+  {0xbb7,0xbb9}, {0xbbe,0xbc2}, {0xbc6,0xbc8}, {0xbca,0xbcd}, 
+  {0xbd7,0xbd7}, {0xc01,0xc03}, {0xc05,0xc0c}, {0xc0e,0xc10}, 
+  {0xc12,0xc28}, {0xc2a,0xc33}, {0xc35,0xc39}, {0xc3e,0xc44}, 
+  {0xc46,0xc48}, {0xc4a,0xc4d}, {0xc55,0xc56}, {0xc60,0xc61}, 
+  {0xc82,0xc83}, {0xc85,0xc8c}, {0xc8e,0xc90}, {0xc92,0xca8}, 
+  {0xcaa,0xcb3}, {0xcb5,0xcb9}, {0xcbe,0xcc4}, {0xcc6,0xcc8}, 
+  {0xcca,0xccd}, {0xcd5,0xcd6}, {0xcde,0xcde}, {0xce0,0xce1}, 
+  {0xd02,0xd03}, {0xd05,0xd0c}, {0xd0e,0xd10}, {0xd12,0xd28}, 
+  {0xd2a,0xd39}, {0xd3e,0xd43}, {0xd46,0xd48}, {0xd4a,0xd4d}, 
+  {0xd57,0xd57}, {0xd60,0xd61}, {0xe01,0xe2e}, {0xe30,0xe3a}, 
+  {0xe40,0xe4e}, {0xe81,0xe82}, {0xe84,0xe84}, {0xe87,0xe88}, 
+  {0xe8a,0xe8a}, {0xe8d,0xe8d}, {0xe94,0xe97}, {0xe99,0xe9f}, 
+  {0xea1,0xea3}, {0xea5,0xea5}, {0xea7,0xea7}, {0xeaa,0xeab}, 
+  {0xead,0xeae}, {0xeb0,0xeb9}, {0xebb,0xebd}, {0xec0,0xec4}, 
+  {0xec6,0xec6}, {0xec8,0xecd}, {0xedc,0xedd}, {0xf18,0xf19}, 
+  {0xf35,0xf35}, {0xf37,0xf37}, {0xf39,0xf39}, {0xf40,0xf47}, 
+  {0xf49,0xf69}, {0xf71,0xf84}, {0xf86,0xf87}, {0xf90,0xf95}, 
+  {0xf97,0xf97}, {0xf99,0xfad}, {0xfb1,0xfb7}, {0xfb9,0xfb9}, 
+  {0x10a0,0x10c5}, {0x10d0,0x10f6}, {0x1100,0x1159}, {0x115f,0x11a2}, 
+  {0x11a8,0x11f9}, {0x1e00,0x1e9b}, {0x1ea0,0x1ef9}, {0x1f00,0x1f15}, 
+  {0x1f18,0x1f1d}, {0x1f20,0x1f45}, {0x1f48,0x1f4d}, {0x1f50,0x1f57}, 
+  {0x1f59,0x1f59}, {0x1f5b,0x1f5b}, {0x1f5d,0x1f5d}, {0x1f5f,0x1f7d}, 
+  {0x1f80,0x1fb4}, {0x1fb6,0x1fbc}, {0x1fbe,0x1fbe}, {0x1fc2,0x1fc4}, 
+  {0x1fc6,0x1fcc}, {0x1fd0,0x1fd3}, {0x1fd6,0x1fdb}, {0x1fe0,0x1fec}, 
+  {0x1ff2,0x1ff4}, {0x1ff6,0x1ffc}, {0x207f,0x207f}, {0x20d0,0x20e1}, 
+  {0x2102,0x2102}, {0x2107,0x2107}, {0x210a,0x2113}, {0x2115,0x2115}, 
+  {0x2118,0x211d}, {0x2124,0x2124}, {0x2126,0x2126}, {0x2128,0x2128}, 
+  {0x212a,0x2131}, {0x2133,0x2138}, {0x3005,0x3005}, {0x302a,0x302f}, 
+  {0x3031,0x3035}, {0x3041,0x3094}, {0x3099,0x309e}, {0x30a1,0x30fa}, 
+  {0x30fc,0x30fe}, {0x3105,0x312c}, {0x3131,0x318e}, {0x4e00,0x9fa5}, 
+  {0xac00,0xd7a3}, {0xf900,0xfa2d}, {0xfb00,0xfb06}, {0xfb13,0xfb17}, 
+  {0xfb1e,0xfb28}, {0xfb2a,0xfb36}, {0xfb38,0xfb3c}, {0xfb3e,0xfb3e}, 
+  {0xfb40,0xfb41}, {0xfb43,0xfb44}, {0xfb46,0xfbb1}, {0xfbd3,0xfd3d}, 
+  {0xfd50,0xfd8f}, {0xfd92,0xfdc7}, {0xfdf0,0xfdfb}, {0xfe20,0xfe23}, 
+  {0xfe70,0xfe72}, {0xfe74,0xfe74}, {0xfe76,0xfefc}, {0xff21,0xff3a}, 
+  {0xff41,0xff5a}, {0xff66,0xffbe}, {0xffc2,0xffc7}, {0xffca,0xffcf}, 
+  {0xffd2,0xffd7}, {0xffda,0xffdc}
+};
+
+
+/* the digits correspond to unicode characters which
+ * have Nd in their GENERAL CATEGORY */
+
+#define NUM_DIGIT_INFO 16
+static const unirange digit_info[NUM_DIGIT_INFO] = {
+  {0x30,0x39}, {0x660,0x669}, {0x6f0,0x6f9}, {0x966,0x96f}, 
+  {0x9e6,0x9ef}, {0xa66,0xa6f}, {0xae6,0xaef}, {0xb66,0xb6f}, 
+  {0xbe7,0xbef}, {0xc66,0xc6f}, {0xce6,0xcef}, {0xd66,0xd6f}, 
+  {0xe50,0xe59}, {0xed0,0xed9}, {0xf20,0xf29}, {0xff10,0xff19}
+};
+
+
+/* the spaces correspond to unicode characters which
+ * have Zs, Zl, or Zp in their GENERAL CATEGORY */
+
+#define NUM_SPACE_INFO 5
+static const unirange space_info[NUM_SPACE_INFO] = {
+  {0x20,0x20}, {0xa0,0xa0}, {0x2000,0x200b}, {0x2028,0x2029}, 
+  {0x3000,0x3000}
+};
+
+
+
+/* parse_utf8_char parses the next utf-8 character, placing its
+ * unicode equivalent in *value. The length of the utf-8 character
+ * is returned */
+int parse_utf8_char(const unsigned char *here,
+		    const unsigned char *end,
+		    unsigned short *value) {
+  unsigned short c1;
+  unsigned short c2;
+  unsigned short c3;
+  
+  *value = 0; /* will be the value for illegal characters */
+  
+  if (here <= end) {
+    c1 = (unsigned short)(*here);
+    
+    if (c1 <= 0x7f) {
+      /* found a one-byte character */
+      *value = c1;
+      return 1;
+      
+    } else if (c1 >= 0xc0 && c1 <= 0xdf && here+1 <= end &&
+	       (c2=(unsigned short)(*(here+1))) >= 0x80) {
+      /* found a two-byte character */
+      *value = ((c1 & 0x1f) << 6) + (c2 & 0x3f);
+      return 2;
+      
+    } else if (c1 >= 0xe0 && c1 <= 0xef && here+2 <= end &&
+	       (c2=(unsigned int)(*(here+1))) >= 0x80 &&
+	       (c3=(unsigned int)(*(here+2))) >= 0x80) {
+      /* found a three-byte character */
+      *value = ((c1 & 0xf) << 12) + ((c2 & 0x3f) << 6) +
+	(c3 & 0x3f);
+      return 3;
+      
+    } else {
+      /* error in encoding, return the length as 1 */
+      return 1;
+    }
+  }
+
+  /* end of string */
+  return 0;
+}
+
+
+/* output_utf8_char encodes a unicode character as a UTF-8 character.
+ * The length of the encoding is returned. If the string was not
+ * long enough to encode the character 0 is returned. */
+int output_utf8_char (unsigned short value,
+		      unsigned char *here,
+		      unsigned char *end) {
+  int len = (int)(end - here + 1); /* end is the last character */
+  if (value < 0x80) {
+    /* will be encoded in one byte */
+    if (len >= 1) {
+      *here = (unsigned char)value;
+      return 1;
+    }
+
+  } else if (value < 0x800) {
+    /* will be encoded in two bytes */
+    if (len >= 2) {
+      *here++ = 0xc0 | (unsigned char)((value >> 6) & 0x1f);
+      *here = 0x80 | (unsigned char)(value & 0x3f);
+
+      return 2;
+    }
+
+  } else {
+    /* will be encoded in three bytes */
+    if (len >= 3) {
+      *here++ = 0xe0 | (unsigned char)((value >> 12) & 0xf);
+      *here++ = 0x80 | (unsigned char)((value >> 6) & 0x3f);
+      *here = 0x80 | (unsigned char)(value & 0x3f);
+      return 3;
+    }
+  }
+
+  return 0;
+}
+
+
+static int lookup_decompose_table (unsigned short value) {
+  int first = 0;
+  int last = NUM_DECOMPOSE_INFO;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < decompose_info[here].ch) {
+      last = here;
+    } else if (value > decompose_info[here].ch) {
+      first = here+1;
+    } else {
+      return here;
+    }
+  }
+
+  return -1;
+}
+
+/* decompose_str will decompose a unicode string into its canonical
+ * equivalents. NULL is returned if the input array was not 
+ * large enough to contain the fully decomposed string (the array
+ * will be in a correct, but partially decomposed state). The input 
+ * must be null-terminated. */
+unsigned short *decompose_str (unsigned short *input,
+			       int max_output_len) {
+  int curpos = 0;
+  int curlen = unicode_strlen (input);
+  int tablepos = 0;
+  int leninc;
+  int i;
+
+  while (input[curpos] != 0) {
+    tablepos = lookup_decompose_table (input[curpos]);
+    if (tablepos >= 0) {
+      /* found a decomposition */
+      leninc = unicode_strnlen (decompose_info[tablepos].str, 3)-1;
+      if (curlen+leninc < max_output_len) {
+	/* enough space for this decomposition */
+
+	if (leninc > 1) {
+	  /* we have to shift the array along */
+	  for (i=curlen-1; i>=curpos; i--) {
+	    input[i+leninc] = input[i];
+	  }
+	  input[curlen+leninc] = 0;
+	  curlen += leninc;
+	}
+
+	/* decompose the character */
+	for (i=0; i<=leninc; i++) {
+	  input[curpos+i] = decompose_info[tablepos].str[i];
+	}
+
+	/* note: curpos is not incremented because the decomposed */
+	/*       characters might need decomposing */
+
+      } else {
+	/* no space left in string */
+	return NULL;
+      }
+
+    } else {
+      /* the character cannot be decomposed */
+      curpos++;
+    }
+  }
+
+  return input;
+}
+
+
+
+/* unicode_cat_data is a combination of the letter, digit, and
+ * space information in a form that is quick to look up.
+ * The information about each byte is stored in two bits
+ *
+ * 00 - neither letter, digit or space
+ * 01 - letter
+ * 10 - space
+ * 11 - digit
+ *
+ * You can test for letter | space by looking at the right
+ * column
+ */
+unsigned long *unicode_cat_data;
+
+void create_unicat_data () {
+  int i=0;
+  int min_start=0;
+  int min_end=0;
+  register unsigned long min_value=0; /* filling the whole byte */
+  
+  const unirange *letter_here = letter_info;
+  const unirange *letter_end = letter_info+NUM_LETTER_INFO;
+  const unirange *digit_here = digit_info;
+  const unirange *digit_end = digit_info+NUM_DIGIT_INFO;
+  const unirange *space_here = space_info;
+  const unirange *space_end = space_info+NUM_SPACE_INFO;
+
+  if (unicode_cat_data != NULL) return;
+  unicode_cat_data = malloc (0x10000/4);
+  if (unicode_cat_data == NULL) return;
+  
+  while (i <= 0xffff) {
+    /* decide what to fill with next */
+    min_start = i;
+    min_end = 0xffff;
+    min_value = 0; /* 00 */
+    
+    while (letter_here < letter_end && letter_here->last < i) letter_here++;
+    if (letter_here < letter_end && letter_here->last <= min_end) {
+      min_start = letter_here->first;
+      min_end = letter_here->last;
+      min_value = 0x55555555; /* 01 */
+    }
+    
+    while (digit_here < digit_end && digit_here->last < i) digit_here++;
+    if (digit_here < digit_end && digit_here->last <= min_end) {
+      min_start = digit_here->first;
+      min_end = digit_here->last;
+      min_value = 0xffffffff; /* 11 */
+    }
+    
+    while (space_here < space_end && space_here->last < i) space_here++;
+    if (space_here < space_end && space_here->last <= min_end) {
+      min_start = space_here->first;
+      min_end = space_here->last;
+      min_value = 0xaaaaaaaa; /* 10 */
+    }
+
+    if (min_start < i) min_start = i;
+    else if (min_start > i) {
+      min_end = min_start-1;
+      min_start = i;
+      min_value = 0; /* 00 */
+    }
+
+    /* fill the entries from min_start to min_end with min_value */
+    while (i <= min_end) {
+      /* special version for common case */
+      if (i % 16 == 0) {
+	unicode_cat_data[i/16] = min_value; /* doesn't matter if too long */
+	i += 16;
+	if (i > min_end) {
+	  i = min_end+1;
+	  break;
+	}
+	
+      } else {
+	register unsigned long mask = 3 << ((i % 16) * 2);
+	unicode_cat_data[i/16] = (unicode_cat_data[i/16] & (~mask)) |
+				  (min_value & mask);
+	i++;
+      }
+    }
+  }
+}
+
+/* does a binary search on a range table */
+static int in_unirange (const unirange *info, int num_info,
+			unsigned short value) {
+  int first = 0;
+  int last = num_info;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < info[here].first) {
+      last = here;
+    } else if (value > info[here].last) {
+      first = here+1;
+    } else {
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+
+
+/* tests to see whether 'value' is a valid Unicode letter */
+int is_unicode_letter (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(letter_info, NUM_LETTER_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x1);
+}
+
+/* tests to see whether 'value' is a valid Unicode digit */
+int is_unicode_digit (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(digit_info, NUM_DIGIT_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x3);
+}
+
+/* tests to see whether 'value' is a valid Unicode letter or 
+ * digit */
+int is_unicode_letdig (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return (in_unirange(letter_info, NUM_LETTER_INFO, value) ||
+	    in_unirange(digit_info, NUM_DIGIT_INFO, value));
+    
+  }
+
+  return ((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x1);
+}
+
+/* tests to see whether 'value' is a valid space
+ * The test includes both "C" spaces and "Unicode" spaces, i.e. 
+ * form-feed, newline, carriage return, horizontal tab,
+ * vertical tab, and the Zs, Zl, and Zp Unicode categorizations */
+int is_unicode_space (unsigned short value) {
+  if (value < 0x80) return isspace (value);
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(space_info, NUM_SPACE_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x2);
+}
+
+/* returns the length of the unicode string */
+int unicode_strlen (const unsigned short *str) {
+  int len = 0;
+
+  /* keep going till you find the null-terminator */
+  while (*str != 0) {
+    len++;
+    str++;
+  }
+
+  return len;
+}
+
+/* returns the length of the unicode string, up to a maximum */
+int unicode_strnlen (const unsigned short *str, int max_length) {
+  int len = 0;
+
+  /* keep going till you find the null-terminator */
+  while (*str != 0 && len < max_length ) {
+    len++;
+    str++;
+  }
+
+  return len;
+}
+
+
+/* Does a binary search on a relate table, returns -1 if it is not
+ * found. */
+static int search_unirelate (const unirelate *info, int num_info,
+			     unsigned short value) {
+  int first = 0;
+  int last = num_info;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < info[here].ch1) {
+      last = here;
+    } else if (value > info[here].ch1) {
+      first = here+1;
+    } else {
+      return here;
+    }
+  }
+
+  return -1;
+}
+
+
+/* returns the upper-case equivalent of value */
+unsigned short unicode_toupper (unsigned short value) {
+  int related = search_unirelate (toupper_info, NUM_TOUPPER_INFO, value);
+  if (related >= 0) {
+    value = toupper_info[related].ch2;
+  }
+  return value;
+}
+
+/* returns the lower-case equivalent of value */
+unsigned short unicode_tolower (unsigned short value) {
+  int related = search_unirelate (tolower_info, NUM_TOLOWER_INFO, value);
+  if (related >= 0) {
+    value = tolower_info[related].ch2;
+  }
+  return value;
+}
+
+/* returns the simplified Chinese character equivalent of 
+ * another Chinese character */
+unsigned short unicode_tosimplified (unsigned short value) {
+  int related = search_unirelate (tosimplified_info, NUM_TOSIMPLIFIED_INFO, value);
+  if (related >= 0) {
+    value = tosimplified_info[related].ch2;
+  }
+  return value;
+}
+
+
+/* converts a utf-8 word (string with length stored in the first byte
+ * to a Unicode array. To handle all situations the output buffer should
+ * be 256 unsigned shorts long. The output will also have the length as
+ * the first entry. */
+unsigned short *utf8_word_to_unicode (const unsigned char *input,
+				      unsigned short *output,
+				      int max_output_length) {
+  int inlen = *input;
+  const unsigned char *inhere = input+1;
+  const unsigned char *inend = &inhere[inlen-1];
+  unsigned short c;
+  int clen;
+  
+  int outlen = 0;
+  unsigned short *outhere = output+1;
+  
+  while (inhere <= inend && inlen < max_output_length-1) {
+    /* decode the character */
+    clen = parse_utf8_char (inhere, inend, &c);
+    inhere += clen;
+
+    if (clen > 0) {
+      /* store the character */
+      *outhere = c;
+      outhere++;
+      outlen++;
+    }
+  }
+
+  output[0] = outlen;
+  return output;
+}
+
+
+/* converts a unicode word buffer (with the length stored in the
+ * entry) to a utf8 encoded word output (with the length stored in
+ * the first byte. Only 255 bytes (not characters) can be stored 
+ * in the output. */
+unsigned char *unicode_to_utf8_word (const unsigned short *input,
+				     unsigned char *output,
+				     int max_output_length) {
+  int inlen = *input;
+  const unsigned short *word = input + 1;
+  int in_i = 0;
+  int clen;
+
+  int outlen = 0;
+  unsigned char *outhere = output+1;
+  unsigned char *outend = output+max_output_length;
+
+  while (in_i < inlen) {
+    if ((clen=output_utf8_char(word[in_i], outhere, outend)) == 0) {
+      /* ran out of space to encode the character */
+      break;
+    }
+
+    outhere += clen;
+    outlen += clen;
+    in_i++;
+  }
+
+  output[0] = outlen;
+
+  return output;
+}
+
Index: /main/tags/2.38/gsdl/packages/mg/lib/unitool.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/unitool.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/unitool.h	(revision 21083)
@@ -0,0 +1,88 @@
+#ifndef UNITOOL_H
+#define UNITOOL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This module is based on Unicode 2.1 */
+
+
+/* parse_utf8_char parses the next utf-8 character, placing its
+ * unicode equivalent in *value. The length of the utf-8 character
+ * is returned. end is the address of the last character. */
+int parse_utf8_char (const unsigned char *here,
+		     const unsigned char *end,
+		     unsigned short *value);
+
+/* output_utf8_char encodes a unicode character as a UTF-8 character.
+ * The length of the encoding is returned. If the string was not
+ * long enough to encode the character 0 is returned. end is the
+ * address of the last character */
+int output_utf8_char (unsigned short value,
+		      unsigned char *here,
+		      unsigned char *end);
+
+/* decompose_str will decompose a unicode string into its canonical
+ * equivalents. NULL is returned if the input array was not 
+ * large enough to contain the fully decomposed string (the array
+ * will be in a correct, but partially decomposed state). The input 
+ * must be null-terminated. */
+unsigned short *decompose_str (unsigned short *input,
+			       int max_output_len);
+
+/* tests to see whether 'value' is a valid Unicode letter */
+int is_unicode_letter (unsigned short value);
+
+/* tests to see whether 'value' is a valid Unicode digit */
+int is_unicode_digit (unsigned short value);
+
+/* tests to see whether 'value' is a valid Unicode letter or 
+ * digit */
+int is_unicode_letdig (unsigned short value);
+
+/* tests to see whether 'value' is a valid space
+ * The test includes both "C" spaces and "Unicode" spaces, i.e. 
+ * form-feed, newline, carriage return, horizontal tab,
+ * vertical tab, and the Zs, Zl, and Zp Unicode categorizations */
+int is_unicode_space (unsigned short value);
+
+/* returns the length of the unicode string */
+int unicode_strlen (const unsigned short *str);
+
+/* returns the length of the unicode string, up to a maximum */
+int unicode_strnlen (const unsigned short *str, int max_length);
+
+/* returns the upper-case equivalent of value */
+unsigned short unicode_toupper (unsigned short value);
+
+/* returns the lower-case equivalent of value */
+unsigned short unicode_tolower (unsigned short value);
+
+/* returns the simplified Chinese character equivalent of 
+ * another Chinese character */
+unsigned short unicode_tosimplified (unsigned short value);
+
+
+/* converts a utf-8 word (string with length stored in the first byte
+ * to a Unicode array. To handle all situations the output buffer should
+ * be 256 unsigned shorts long. The output will also have the length as
+ * the first entry. */
+unsigned short *utf8_word_to_unicode (const unsigned char *input,
+				      unsigned short *output,
+				      int max_output_length);
+
+/* converts a unicode word buffer (with the length stored in the
+ * entry) to a utf8 encoded word output (with the length stored in
+ * the first byte. Only 255 bytes (not characters) can be stored 
+ * in the output. */
+unsigned char *unicode_to_utf8_word (const unsigned short *input,
+				     unsigned char *output,
+				     int max_output_length);
+
+#ifdef __cplusplus
+	   }
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/lib/win32in.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/win32in.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/win32in.c	(revision 21083)
@@ -0,0 +1,86 @@
+#include "longlong.h"
+
+/* This module provides an equivalent of <netinet/in.h> on  */
+/* unix systems. */
+
+unsigned long htonl(unsigned long x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 24) & 0x000000FF) | ((x >> 8) & 0x0000FF00) |
+		((x << 8) & 0x00FF0000) | ((x << 24) & 0xFF000000);
+#endif
+
+	return x;
+}
+
+mg_ullong ntohll(mg_ullong x)
+{
+#if defined (LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = 
+	  ((x >> 56) & 0x00000000000000FF) | ((x >> 40) & 0x000000000000FF00) |
+	  ((x >> 24) & 0x0000000000FF0000) | ((x >> 8)  & 0x00000000FF000000) |
+	  ((x << 8)  & 0x000000FF00000000) | ((x << 24) & 0x0000FF0000000000) |
+		((x << 40) & 0x00FF000000000000) | ((x << 56) & 0xFF00000000000000);
+#endif
+  return x;
+}
+
+unsigned long ntohl(unsigned long x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 24) & 0x000000FF) | ((x >> 8) & 0x0000FF00) |
+		((x << 8) & 0x00FF0000) | ((x << 24) & 0xFF000000);
+#endif
+	return x;
+}
+
+unsigned short htons(unsigned short x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 8) & 0x00FF) | ((x << 8) & 0xFF00);
+#endif
+	return x;
+}
+
+unsigned short ntohs(unsigned short x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 8) & 0x00FF) | ((x << 8) & 0xFF00);
+#endif
+	return x;
+}
+
+/* just to test stuff
+#include <stdio.h>
+
+main () {
+	long x;
+	short sx;
+
+	x = 0x000000FF;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0x0000FF00;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0x00FF0000;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0xFF000000;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n\n",(int)x);
+
+	sx = 0x00FF;
+	printf ("before %i, ",(int)sx);
+	sx = htons (sx);
+	printf ("after %i\n",(int)sx);
+
+	sx = 0xFF00;
+	printf ("before %i, ",(int)sx);
+	sx = htons (sx);
+	printf ("after %i\n",(int)sx);
+}
+*/
Index: /main/tags/2.38/gsdl/packages/mg/lib/win32in.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/win32in.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/win32in.h	(revision 21083)
@@ -0,0 +1,10 @@
+/* This module provides an equivalent of <netinet/in.h> on  */
+/* unix systems. */
+
+#include "longlong.h"
+
+unsigned long htonl(unsigned long x);
+unsigned long ntohl(unsigned long x);
+mg_ullong ntohll(mg_ullong x);
+unsigned short htons(unsigned short x);
+unsigned short ntohs(unsigned short x);
Index: /main/tags/2.38/gsdl/packages/mg/lib/xmalloc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/lib/xmalloc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/lib/xmalloc.c	(revision 21083)
@@ -0,0 +1,111 @@
+/* xmalloc.c -- malloc with out of memory checking
+   Copyright (C) 1990, 91, 92, 93, 94 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#if __STDC__
+#define VOID void
+#else
+#define VOID char
+#endif
+
+#include <sys/types.h>
+
+#if STDC_HEADERS
+#include <stdlib.h>
+#else
+VOID *malloc ();
+VOID *realloc ();
+void free ();
+#endif
+
+/* This is for other GNU distributions with internationalized messages.
+   The GNU C Library itself does not yet support such messages.  */
+#if HAVE_LIBINTL_H
+# include <libintl.h>
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+/* Exit value when the requested amount of memory is not available.
+   The caller may set it to some other value.  */
+int xmalloc_exit_failure = EXIT_FAILURE;
+
+#if defined(__WIN32__)
+void error (int, int, const char *, ...);
+#else
+#if __STDC__ && (HAVE_VPRINTF || HAVE_DOPRNT)
+void error (int, int, const char *, ...);
+#else
+void error (int, int, char *, char *, char *, char *, char *, char *, char *, char *, char *);
+#endif
+#endif;
+
+static VOID *
+fixup_null_alloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = 0;
+  if (n == 0)
+    p = malloc ((size_t) 1);
+  if (p == 0)
+    error (xmalloc_exit_failure, 0, gettext ("Memory exhausted"));
+  return p;
+}
+
+/* Allocate N bytes of memory dynamically, with error checking.  */
+
+VOID *
+xmalloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = malloc (n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+   with error checking.
+   If P is NULL, run xmalloc.  */
+
+VOID *
+xrealloc (p, n)
+     VOID *p;
+     size_t n;
+{
+  if (p == 0)
+    return xmalloc (n);
+  p = realloc (p, n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_compression_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_compression_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_compression_dict.1	(revision 21083)
@@ -0,0 +1,219 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_compression_dict 1 \*(Dt CITRI
+.SH NAME
+mg_compression_dict \- build a compression dictionary.
+.SH SYNOPSIS
+.B mg_compression_dict
+[
+.B \-h
+]
+[
+.BR \-C " |"
+.BR \-P " |"
+.B  \-S
+]
+.if n .ti +9n
+[
+.BR \-0 " |"
+.BR \-1 " |"
+.BR \-2 " |"
+.B  \-3
+]
+[
+.BR \-H " |"
+.BR \-B " |"
+.BR \-D " |"
+.BR \-Y " |"
+.B  \-M
+]
+.if n .ti +9n
+.if t .ti +.5i
+[
+.BI \-l " lookback"
+]
+[
+.BI \-k " mem"
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_compression_dict
+builds a compression dictionary based on the statistics gathered
+during the first pass over the text.  The options to the program are
+mainly concerned with limiting the amount of memory the dictionary
+will use and with how the text compressor will cope with any novel
+words found during the compression phase.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-C
+Build a complete dictionary from the statistics file.  If during the
+text compression phase a novel word is found, then the compressor will
+produce an error message and stop.
+.TP
+.B \-P
+Build a partial dictionary from the statistics file.  This dictionary
+assumes that the statistics file are based on the entire text.  The
+statistics of words not includes in the dictionary are used to
+calculate the escape probability.  If novel words are being coded
+character by character, then there may not be a Huffman code for every
+possible character.  This means that the compressor may fail if a novel
+word contains a novel character.
+.TP
+.B \-S
+Build a seed dictionary from the statistics file.  This dictionary
+assumes that the statistics file is based on only a portion of the
+text to be compressed.  The probability of a novel word is based on the
+number of words that have only occurred once.  If novel words are being
+coded character by character, then the Huffman codes for characters are
+based on the frequency of characters in the dictionary.
+.TP
+.B \-0
+All words from the statistics file are included in the built
+dictionary.
+.TP
+.B \-1
+Words are included in the dictionary until the dictionary reaches the
+desired size.  Words are selected for the dictionary based on the order
+they occurred in the source text.
+.TP
+.B \-2
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.
+.TP
+.B \-3
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.  Words are the shuffled back and forth between the
+`keep' and `discard' lists to find the `optimal' set of words that
+should be in the dictionary.
+.TP
+.B \-H
+This specifies that novel words will be coded character by character
+using Huffman codes.
+.TP
+.B \-B
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using binary codes.  The binary code represents their occurrence
+position in the auxiliary dictionary.
+.TP
+.B \-D
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using delta codes.  The delta code represents their occurrence position
+in the auxiliary dictionary.
+.TP
+.B \-Y
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This generally
+produces better compression than
+.B \-B
+or
+.BR \-D .
+.TP
+.B \-M
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This method is
+adaptive within documents, and generally produces better compression
+than
+.BR \-B ,
+.B \-D
+or
+.BR \-Y .
+.TP
+.BI \-l " lookback"
+The generated dictionary is designed to be front coded when it is
+loaded into memory.  Under normal circumstances, a front-coded
+dictionary would require scanning from the beginning in order to find
+any particular word.  However, every
+.I lookback
+words in the dictionary, the whole word is stored and a pointer to that
+word maintained.  E.g., if
+.I lookback
+is 4, then every fourth word is stored in its entirety.
+.TP
+.BI \-k " mem"
+This limits the amount of memory to use for the generated
+dictionary.  Words are selected for the dictionary based of the text
+statistics, and whether
+.BR \-0 , " \-1" , " \-2"
+or
+.B \-3
+is specified.  The memory is calculated assuming a lookback of 0,
+irrespective of what actual lookback is specified.  This means that if
+a non-zero lookback is given, the dictionary will actually occupy
+less space than specified by
+.BR \-k .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.stats
+Statistics about the source text.
+.TP
+.B *.text.dict
+Compression dictionary for the source text.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_decompress_text.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_decompress_text.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_decompress_text.1	(revision 21083)
@@ -0,0 +1,78 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_decompress_text 1 \*(Dt CITRI
+.SH NAME
+mg_decompress_text \- decompresses the compressed text of a collection
+.SH SYNOPSIS
+.B mg_decompress_text
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_decompress_text
+decompresses the compressed text of a collection, inserts paragraph and
+document markers, writing the output to
+.IR stdout ".  "
+This program was created
+to be used as a type of
+.BR mg_get (1).
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.text
+Compressed documents.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.invf.paragraph
+Paragraph counts for documents.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_passes (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_fast_comp_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_fast_comp_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_fast_comp_dict.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_fast_comp_dict 1 \*(Dt CITRI
+.SH NAME
+mg_fast_comp_dict \- build a fast loading compression dictionary
+.SH SYNOPSIS
+.B mg_fast_comp_dict
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_fast_comp_dict
+builds a fast-loading compression dictionary from the standard
+compression dictionary.  The new dictionary has the property that
+.BR mgquery (1)
+can load it in very quickly, making the startup time for
+.BR mgquery (1)
+much shorter.  The new dictionary is larger on disk than the original,
+but they are no different when it comes to memory usage.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.dict
+Compression dictionary.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get.1	(revision 21083)
@@ -0,0 +1,154 @@
+.TH mg_get 1 "31 January 1994"
+.SH NAME
+mg_get \- output source texts for processing
+.SH SYNOPSIS
+ 
+.B mg_get
+.I collection-name
+.RB [ \-init | \-i | \-text\fP|\fB\-t\fP|\fB\-cleanup\fP|\fB\-c\fP]
+.SH DESCRIPTION
+.LP
+This program is the default one used by mgbuild to generate the source text for the MG system. Any program may be used to generate the source text for mgbuild as long as it confirms to the interface specified here. 
+.SH OPTIONS
+.LP
+The
+.I collection\-name
+must appear before any other option. Only the first option has any significance. If no option is specified
+.B \-text
+is assumed.
+.RS
+.TP
+.BR \-init " and " \-i
+The program is called once with this flag at the start of building a collection.
+.TP
+.BR \-text " and " \-t
+The program is called with this flag multiple times during the building of a collection. The program outputs (on stdout) the text of the collection. \*(lq\fBDocuments\fP\*(rq within the collection are separated with by ctrl-B's (ASCII code 2). \*(lq\fBParagraphs\fP\*(rq within the collection are separated with ctrl-C's (ASCII code 3). A collection need not contain paragraphs unless a level 3 inverted file is being generated (see 
+.B mgbuild 
+and 
+.BR mg_passes ). 
+.TP
+.BR \-cleanup " and " \-c
+The program is called once with this flag at the completion of building a collection.
+.SH ENVIRONMENT
+.TP
+.SB MGDATA
+If this environment variable exists then its value is used a the default 
+directory where the mg collection files are. If this variable does not exist
+then the directory \*(lq\fB.\fP\*(rq is used by default. The command line 
+option 
+.BI \-d " directory"
+overrides the directory in 
+.BR MGDATA .
+.TP
+.SB MG_GETRC
+This environment variable specifies where the file containing the users 
+mg source configurations is. If not set, mg_get uses a default of 
+.B \*\~/.mg_getrc.
+
+This file contains TAB delimited lines of the form
+.RS 
+.RS 
+.I CollectionName
+.I CollectionType
+.I files or directory
+.RE
+
+.I CollectionName
+is the name of the collection supplied to mg_get.
+
+.I CollectionType
+specifies how mg_get should process the
+named files and directories and are descibed below.
+
+.I files or directory
+is either a list of files separted by blanks or a single directory.
+Some of the
+.I CollectionTypes
+deal with files and others with just a single directory.
+Any files used ending with .gz or .Z are decompressed with gzip before
+processing. References to '~' expands to the users HOME directory.
+
+.I CollectionType
+is one of
+.RS
+.TP
+.BR PARA
+For text based documents. The list of files specified are treated as
+a series of paragraphs separated by blank lines. Each paragraph becomes
+a seperate document on the indexed collection.
+.TP
+.BR MAIL
+for mail files. The list of files specified are treated as UNIX mail
+files separated by lines starting with 'From'. Each mail message becomes
+a seperate document on the indexed collection. As a extra feature any
+embedded tarmail encoded contents (enclosed by a 'xbtoa Begin' and 'xbtoa End'
+pair are removed.
+.TP
+.BR DIR
+(and DIR2)
+For a single directory of files. Each file in the directory (and in any of
+it's subdirectories) are treated as a single document. With
+.I DIR
+the pathname of the file is prefixed to the contents of each file as an
+extra line while this is not done for
+.I DIR2
+collections.
+.TP
+.BR BIB
+for biblography files. The list of files specified are treated as
+a series of biblography files (eg BIBTEX or TROFF) separated by lines
+starting with '@'. Each reference  becomes a seperate document on the indexed
+collection.
+.TP
+.BR TXTIMG
+for integrated collections of text and images. The single directory should
+contain files that have the same prefix if they are related. For example,
+monaLisa.pgm might be a gray-level image, and monaLisa.txt would be a textual
+file describing the image. The suffixes recognised are:
+.BR   .txt
+for  ascii text
+.BR  .ptm
+for  scanned text stored as a bilevel image
+.BR  .pbm
+for a black and white image (typically a line drawing)
+.BR  .pgm
+for a gray-scale image
+.BR In addition, if no corresponding ascii text file is found for
+a .pbm or .pgm file, then one is created with suffix .tmp.txt,
+and it stores the name of the image file (in principle it could
+store the OCR of a .txt.pbm file). At present the .tmp.txt files
+are deleted by the '-cleanup' option.
+
+.SH "EXAMPLE"
+
+An example ~/.mg_getrc file might look like:
+   alice   PARA    /users/alice13a.txt.Z
+   mail95  MAIL    ~/MAIL/1995/*
+   doc     DIR     ~/documents
+   bibs    BIB     ~/etc/REFS/*.bib ~/etc/REFS/CC/*.bib
+   letters DIR     ~/LETTERS
+   davinci TXTIMG  ~/images/davinci
+
+.SH "SEE ALSO"
+.LP
+.BR mg_compression_dict (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_make_fast_dict (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1)
+
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_get_merge.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_get_merge 1 \*(Dt CITRI
+.SH NAME
+mg_get_merge \- output source texts for processing
+.SH SYNOPSIS
+.B mg_get_merge
+.I collection-name
+.if n .ti +9n
+[
+.BR \-init " |"
+.BR \-i " |"
+.BR \-text " |"
+.BR \-t " |"
+.BR \-cleanup " |"
+.B  \-c
+]
+.SH DESCRIPTION
+This program is the default one used by
+.BR mgmerge (1)
+to generate the source text for new documents to appended to
+an
+.BR mg (1)
+system database.
+Its function is exactly the same as
+.BR mg_get (1)
+except that it generates the 
+.I new 
+documents to be added to an
+.BR mg (1)
+system database that has already been built using
+.BR mgbuild(1).
+Any program may be used to generate the source
+text for
+.BR mgmerge (1),
+as long as it confirms to the interface specified
+here.
+.SH OPTIONS
+The
+.I collection-name
+must appear before any other option.  Only the first option has any
+significance.  If no option is specified,
+.B \-text
+is assumed.
+.TP "\w'\fB\-cleanup\fP and \fB\-c\fP'u+2n"
+.BR \-init " and " \-i
+The program is called once with this flag at the start of merging a
+collection.
+.TP
+.BR \-text " and " \-t
+The program is called with this flag multiple times during the
+merging of a collection.  The program outputs (on
+.IR stdout )
+the text of the collection.
+.I Documents
+within the collection are separated by ctrl-B's (ASCII code 2).
+.TP
+.BR \-cleanup " and " \-c
+The program is called once with this flag at the completion of
+merging a collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_get (1),
+.BR mgbuild (1),
+.BR mgmerge (1),
+.BR mg_text_merge (1),
+.BR mg_invf_merge (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_hilite_words.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_hilite_words.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_hilite_words.1	(revision 21083)
@@ -0,0 +1,95 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_hilite_words 1 \*(Dt CITRI
+.SH NAME
+mg_hilite_words \- display text and highlight particular words which it contains
+.SH SYNOPSIS
+.B mg_hilite_words
+.if n .ti +9n
+[
+.B --stem_method [0-3]
+]
+.if n .ti +9n
+[
+.B --stemmer [english|lovin|french|simplefrench]
+]
+.if n .ti +9n
+[
+.B --style [bold|underline|italic|emphasis|strong]
+]
+.if n .ti +9n
+[
+.B --pager [less|more|html|???]
+]
+.if n .ti +9n
+.I list-of-words-to-highlight
+
+.SH DESCRIPTION
+.B mg_hilite_words
+reads text from stdin and outputs it into a pager such as
+less. It's command arguments include a list of stemmed words
+which if extracted from the text will be highlighted on the output
+using a highlighting style.
+
+It has been extended to output the highlighted text using html
+straight to stdout.
+
+.SH OPTIONS
+Options may appear in any order, but the
+.IR list-of-words-to-highlight ,
+must be last.
+.TP
+.B --stem_method [0-3]
+This option allows one to set the stemming method for the extraction of
+the words from the incoming text.
+This should match the way the inverted file index was created.
+The default is 3, which is fold and stem.
+.TP
+.B --stemmer [english|lovin|french|simplefrench]
+This option allows you to select the stemmer to use.  The
+default is the English stemmer.
+.TP
+.B --style [bold|underline|italic|emphasis|strong]
+This option sets the highlighting style.
+.IR Bold 
+and 
+.IR underline
+are utilised by the pager or for html output.
+.IR Italic,
+.IR emphasis,
+and
+.IR strong
+can only be used for html output.
+.TP
+.B --pager [less|more|html|???]
+One can use the standard 
+.IR less
+or
+.IR more
+pages for displaying the highlighted text.
+Or one can generate highlighted html using the paging setting of
+.IR html.
+One can also specify a custom pager of their own choosing (i.e. ???).
+.TP
+.B list-of-words-to-highlight
+Each word is taken as a command line argument.
+Each word should already be stemmed and folded according to
+the stem option.
+.SH USAGE
+This program was written primarily to be called by 
+.IR mgquery(1)
+.
+When the user selects the mode of "hilite" then this program
+is called for displaying the query-result documents instead of
+just the pager.
+.SH "SEE ALSO"
+.na
+.BR mgquery (1).
+
+
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dict.1	(revision 21083)
@@ -0,0 +1,104 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_dict 1 \*(Dt CITRI
+.SH NAME
+mg_invf_dict \- build an `on-disk' stemmed dictionary
+.SH SYNOPSIS
+.B mg_invf_dict
+[
+.B \-h
+]
+[
+.B \-F
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_invf_dict
+builds an `on-disk' stemmed dictionary from the
+compressed stemmed dictionary that the
+.BR mgquery (1)
+program can access.  Each entry in the dictionary contains the disk
+pointer to the associated inverted file entry, and various other pieces
+of information about the stemmed word.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " num"
+The dictionary is stored in blocks on disk; this option is used to set
+the block size.  The default is 4-KB blocks.
+.TP
+.B \-F
+This option causes the disk blocks to be aligned on the appropriate
+boundaries.  For example, if 4-KB blocks are used, they will be aligned
+in the file on 4-KB boundaries.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dump.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dump.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_dump.1	(revision 21083)
@@ -0,0 +1,142 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_dump 1 \*(Dt CITRI
+.SH NAME
+mg_invf_dump \- Dump out an inverted file in ASCII
+.SH SYNOPSIS
+.B mg_invf_dump
+[
+.B \-h
+]
+[
+.B \-b
+]
+[
+.B \-w
+]
+[
+.B \-t
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program dumps out an inverted file produced by the
+.BR mg (1)
+system as ASCII numbers.  This program could be used in conjunction
+with
+.BR mgdictlist (1)
+to write simple shell programs that work with the inverted files.  The
+output from the program looks something like this:
+.LP
+.RS
+.ft 3
+.nf
+6 337
+1
+ 1 1
+1
+ 5 1
+1
+ 2 1
+1
+ 1 1
+4
+ 1 3
+ 2 7
+ 3 2
+ 5 2
+1
+ 1 1
+ . . .
+.fi
+.ft
+.RE
+The first number (6) is the number of documents in the collection.  It
+is followed by the number of different terms in the collection.  For
+each term, the number of different documents it occurs in follows. The
+document numbers that the term occurs in are listed next.  If
+.B \-w
+is specified, then the number of times the term occurred in the
+document is printed alongside the document number.
+If
+.B \-t
+is specified, the term itself is also displayed in quotes.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-b
+This option will cause the output from the program to be in fixed-size
+binary numbers, rather than in ASCII.
+.TP
+.B \-w
+If the inverted file is a level-2 or level-3 inverted file, this causes
+the word counts per document to be output.
+.TP
+.B \-t
+This option causes each term to be displayed along with the number of
+documents it appears in. The term is printed in quotes,
+as in "the".
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf.dict
+The compressed stemmed dictionary.
+.TP
+.B *.invf.ORG
+The original inverted file saved by
+.BR mg_invf_rebuild .
+.TP
+.B *.invf
+The inverted file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_merge.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_merge 1 \*(Dt CITRI
+.SH NAME
+mg_invf_merge \- Merge two inverted files and stemmed dictionaries
+.SH SYNOPSIS
+.B mg_invf_merge
+[
+.B \-h
+]
+[
+.B \-s
+]
+[
+.B \-w
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program takes two
+.BR mg (1)
+database compressed text files and appends the second to
+the first.
+It is part of the
+.BR mgmerge (1)
+addition to the
+.BR mg (1)
+package.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-s
+This option will cause a slow merge to be performed on the inverted files,
+where each inverted file entry is decoded and recoded.
+The default is a fast merge. Accumulated fast merges slowly degrade
+compression performance on the resulting inverted file so
+a periodic slow merge is recommended.
+.TP
+.B \-w
+By default the database .weights file is updated with
+new weights for the new documents in
+.B mg_text_merge.
+The
+.B -w
+option turns this step off.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.old.invf.dict
+The old compressed stemmed dictionary.
+.TP
+.B *.new.invf.dict
+The new compressed stemmed dictionary.
+.TP
+.B *.invf.dict
+The resulting merged compressed stemmed dictionary.
+.TP
+.B *.old.invf.ORG
+The original inverted file saved by
+.BR mg_invf_rebuild .
+.TP
+.B *.old.invf
+The old inverted file.
+.TP
+.B *.new.invf
+The new inverted file.
+.TP
+.B *.invf
+The resulting merged inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgmerge (1),
+.BR mg_get_merge (1),
+.BR mg_text_merge (1),
+.BR mg_invf_rebuild (1),
+.BR mg_invf_dict (1),
+.BR mg_weights_build (1),
+.BR mgquery (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_rebuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_rebuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_invf_rebuild.1	(revision 21083)
@@ -0,0 +1,156 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_rebuild 1 \*(Dt CITRI
+.SH NAME
+mg_invf_rebuild \- Rebuild an mg inverted file with or without skips.
+.SH SYNOPSIS
+.B mg_invf_rebuild
+.RB [ \-h ]
+.if n .ti +9n
+[
+.BR \-0 " |"
+.B \-1
+[
+.BI \-k " num"
+] |
+.B \-2
+[
+.BI \-s " num"
+]
+[
+.BI \-m " num"
+]
+]
+.if n .ti +9n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_invf_rebuild
+builds a new inverted file, with or without skipping, from an old
+inverted file.  This file uses
+.I *.invf.ORG
+and
+.I *.invf.idx.ORG
+as the
+source from which it builds
+.I *.invf
+and
+.IR *.invf.idx .
+If
+.I *.invf.ORG
+or
+.I *.invf.idx.ORG
+do not exist, the program renames
+.I *.invf
+or
+.I *.invf.idx
+to
+.I *.invf.ORG
+or
+.I *.invf.idx.ORG
+as appropriate.  The old inverted file may contain skipping.  This
+means that it is possible to delete the
+.I *.ORG
+files
+after the new inverted file is built.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-m\fP \fInum\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-0
+This generates a non-skipped inverted file.  This option is normally
+only needed if the
+.I *.ORG
+files have been deleted.
+.TP
+.B \-1
+This generates a skipped inverted file.  The
+.BI \-k " num"
+argument specifies the number of pointers hopped over with each skip.
+.TP
+.B \-2
+This option generates a skipped inverted file.  The skipped inverted
+file is built so that it is `optimal' for ranking using a specific
+number of accumulators.  Each term in the inverted file has a
+different skip length.  The arguments
+.BR \-s " and " \-m
+control the sizes of the skips.
+.TP
+.BI \-k " num"
+This specifies the number of pointers that should be hopped over with
+each skip.  This option is only valid if
+.B \-1
+is specified.
+.TP
+.BI \-m " num"
+This specifies the intended number of accumulators that will be used
+when ranking queries are done on the collection.
+.TP
+.BI \-s " num"
+This specifies the minimum size for skips.  If the calculation of the
+optimal skip size results in a number smaller than
+.IR num ,
+the skip size is set to
+.IR num .
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.ORG
+Original inverted file.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.invf.idx.ORG
+The original index into the inverted file.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_passes.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_passes.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_passes.1	(revision 21083)
@@ -0,0 +1,441 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_passes 1 \*(Dt CITRI
+.SH NAME
+mg_passes \- builds mg databases
+.SH SYNOPSIS
+.B mg_passes
+[
+.B \-h
+]
+[
+.B \-G
+]
+[
+.B \-S
+]
+[
+.B \-D
+]
+[
+.B \-W
+]
+.if n .ti +9n
+[
+.BR \-1 " |"
+.BR \-2 " |"
+.B  \-3
+]
+[
+.BI \-C " compstatpoint"
+]
+.if n .ti +9n
+[
+.BI \-n " tracename"
+]
+.if t .ti +.5i
+[
+.BI \-b " bufsize"
+]
+[
+.BI \-m " memlimit"
+]
+.if n .ti +9n
+[
+.BI \-c " numchunks"
+]
+[
+.BI \-a " stemmer"
+]
+[
+.BI \-s " stemmethod"
+]
+[
+.BI \-t " tracepos"
+]
+.if n .ti +9n
+[
+.B \-T1
+]
+[
+.B \-T2
+]
+.if t .ti +.5i
+[
+.B \-I1
+]
+[
+.B \-I2
+]
+.if n .ti +9n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+[
+.I filename(s)
+]
+.SH DESCRIPTION
+.B mg_passes
+is the program that does most of the work when building
+.BR mg (1)
+database systems.  The input documents can come from either
+.I stdin
+or from a list of files on the command line.  Individual documents
+must be separated with control-B characters.  In general,
+.B mg_passes
+must be run twice to build a database, first with the
+.B \-T1
+and
+.B \-I1
+options, and second with the
+.B \-T2
+and
+.B \-I2
+options.  Several other programs must be run in order to get an
+.BR mg (1)
+database that is ready for the
+.BR mgquery (1)
+program.  The
+.SB EXAMPLE
+section below gives an example of how to build a complete
+.BR mg (1)
+database.
+.SH OPTIONS
+Options may appear in any order, but the
+.IR filename(s) ,
+if specified, must be last.
+.TP "\w'\fB\-C\fP \fIcompstatpoint\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-G
+Treat SGML tags as non-words when building the inverted file.  An SGML
+tag is anything between angle brackets, i.e., `<' and `>'.
+.TP
+.B \-S
+This option causes a special pass to be executed.  It is up to a user
+to modify
+.I mg.special.c
+in the source code to do something with the documents it is given.
+.TP
+.B \-D
+If
+.B mg_passes
+fails, then print the document that caused the failure to the trace
+file if tracing is active, or to
+.I stderr
+if it is not.
+.TP
+.B \-W
+This option enables the generation of the weights file when
+.B \-I2
+is specified.  It causes
+.B \-I2
+to use a little more memory and CPU.
+.TP
+.B \-1
+Produce a level-1 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+A level-1 inverted file makes it possible for
+.BR mgquery (1)
+to do Boolean queries.  Ranked queries can still be done,
+although the quality of the ranking is abysmal.
+.TP
+.B \-2
+Produce a level-2 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+This is the default when neither
+.BR \-1 ", " "\-2 " "or " \-3
+is specified.
+A level-2 inverted file makes it possible for
+.BR mgquery (1)
+to do Boolean queries and cosine-ranked queries.
+.TP
+.B \-3
+Produce a level-3 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+This has been implemented to enable paragraph-level inversion.
+Paragraphs are delimited by control-C characters in the source text.
+.TP
+.BI \-C " compstatpoint"
+This option causes statistics on the compression performance to be
+output to a file called
+.IR *.compression.stats .
+.I compstatpoint
+specifies the interval between outputting each line of statistics.  The
+units of
+.I compstatpoint
+are kilobytes of source text.  E.g., if
+.I compstatpoint
+is 10, then a line is output to the file every 10 KB of input
+source.  Each line of the file consists of 4 numbers The first number
+is the amount of input text, in bytes, processed so far.  The second
+number is the amount of input text, in bytes, processed since the
+last line was output to the file.  The third number is the number of
+output bytes generated since the last line was output to the file, and
+the fourth number is the compression achieved since the last line was
+output, i.e., the third number divided by the second number.
+.TP
+.BI \-n " tracename"
+This specifies the filename to use for the trace log, if tracing is
+enabled using the
+.B \-t
+option.  If
+.BI \-n " tracename"
+is not given and tracing is enabled, a default trace filename will be
+used.
+.TP
+.BI \-s " stemmethod"
+This specifies the method to use to \*(lqstem\*(rq the words in the
+inverted file dictionary.  This is a bit mask specifying the
+operations to do on words as they are parsed out of the text, where
+bit number 0 is the low-order (rightmost) bit.  Bit 0 does case
+folding, and bit 1 does simple stemming, so the value 3 for
+.I stemmethod
+does both case folding and stemming.
+.TP
+.BI \-a " stemmer"
+This specifies the stemmer to use when stemming words.  This
+is a description of the language the stemmer is intended for
+or a description of the stemmer.  Valid options include:
+english, lovin, french, and simplefrench.
+.TP
+.BI \-b " bufsize"
+Specify the size of the document buffer in kilobytes.  If any document
+is larger than
+.IR bufsize ,
+the program will abort with an error message.  This should probably be
+replaced with some system which automatically increases the buffer
+size as required.  The default size is 3072 KB (3 MB).
+.TP
+.BI \-m " memlimit"
+Maximum amount of memory to use for the pass-2 file inversion in
+megabytes.  This option is only useful when used in conjunction with
+the option
+.BR \-I1 .
+The larger this value, the faster the pass-2 inversion will proceed.
+The default value is 5 MB.
+.TP
+.BI \-c " numchunks"
+The maximum number of inversion chunks to write to disk.  Each chunk
+will be approximately as large as
+.IR memlimit .
+This option is only useful when used in conjunction with the option
+.BR \-I2 .
+The larger this value, the faster the pass-2 inversion will proceed.
+The default value is 5 MB.
+.TP
+.BI \-t " tracepos"
+This option activates tracing.  A line will be generated in the
+trace file for every
+.I tracepos
+input bytes processed.  The default name for the trace file can be
+overridden using the
+.BI \-n " tracename"
+option.
+.TP
+.B \-T1
+Generate the
+.I *.text.stats
+file.
+.TP
+.B \-T2
+Generate the
+.IR *.text ,
+.IR *.text.idx ,
+and possibly the
+.I *.text.dict.aux
+files.  Using this option requires that the
+.I *.text.dict
+file be present.
+.TP
+.B \-I1
+Generate the
+.IR *.invf.dict ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files.
+.TP
+.B \-I2
+Generate the
+.I *.invf
+and
+.I *.invf.idx
+files.  Using this option requires
+that the
+.IR *.invf.dict.hash ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files
+be present.  The
+.I *.invf.dict.hash
+file is generated by
+.BR mg_perf_hash_build (1)
+from the
+.I *.invf.dict.build
+file.  If the
+.B \-W
+option is specified, the
+.I *.weight
+file will also be generated.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is to be
+written.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection that will be
+created.
+.TP
+.I filename(s)
+This specifies the source text. If this is not specified, then the
+program expects the source text from
+.IR stdin .
+.SH EXAMPLE
+What follows is a UNIX
+.BR csh (1)
+script as an example of how to build an
+.BR mg (1)
+document collection.
+.LP
+.nf
+.DT
+.ft B
+.I #! /bin/csh
+.I
+# The first argument on the command line specifies the
+.I
+#   source of the text
+set source = ($1)
+.PP
+.I
+# The second argument is the name of the collection
+set text = ($2)
+.PP
+.I
+# Create *.text.stats,  *.invf.dict.build,
+.I
+#   *.invf.chunk and *.invf.chunks.trans
+${source} | mg_passes -T1 -I1 -m 1 -t 1 -f ${text}
+.PP
+.I
+# Create *.text.dict
+mg_compression_dict -f ${text}
+.PP
+.I
+# Create *.invf.dict.hash
+mg_perf_hash_build -f ${text}
+.PP
+.I
+# Create *.text,  *.text.idx,
+.I
+#   *.invf and *.invf.idx
+${source} | mg_passes -T2 -I2 -c 2 -t 1 -f ${text}
+.PP
+.I
+# Create *.text.idx.wgt and *.weight.approx
+mg_weights_build -f ${text} -b 8
+.PP
+.I
+# Create *.invf.dict
+mg_invf_dict -f ${text} -b 4096
+.PP
+.I
+# Create *.text.dict
+mg_fast_comp_dict -f ${text}
+.ft R
+.fi
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.chunk
+Inverted file chunk descriptor file.  When the inverted file is
+created it is created in chunks that use no more than a set amount of
+memory.  This file describes those chunks.
+.TP
+.B *.invf.chunk.trans
+Word-occurrence-order to lexical-order translation file.  The
+.B *.invf.chunk
+file is written in word-occurrence order but is required by
+.B \-I2
+to be in lexical order.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for an order-preserving perfect hash function.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.trace
+The default trace file.
+.TP
+.B *.compression.stats
+Statistics about the compression of the text.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_perf_hash_build.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_perf_hash_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_perf_hash_build.1	(revision 21083)
@@ -0,0 +1,89 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_perf_hash_build 1 \*(Dt CITRI
+.SH NAME
+mg_perf_hash_build \- generate an order-preserving hash function for the stemmed dictionary
+.SH SYNOPSIS
+.B mg_perf_hash_build
+[
+.B \-h
+]
+[
+.BI \-r " rndseed"
+]
+[
+.BI \-d  " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_perf_hash_build
+generates an order-preserving hashing function from the compressed
+stemmed dictionary and writes it out to disk.
+.BR mg_passes (1)
+will make use of the hash function when it builds the inverted file.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-r " rndseed"
+This specifies the random seed to be used in the generation of the
+hash function; it must be an integer.  If this is not specified, the
+current time will be used as the random seed.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf.dict
+Stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for a order-preserving perfect hash function.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_stem_idx.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_stem_idx.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_stem_idx.1	(revision 21083)
@@ -0,0 +1,95 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_stem_idx 1 \*(Dt CITRI
+.SH NAME
+mg_stem_idx \- builds a stem index file
+.SH SYNOPSIS
+.B mg_stem_idx
+[
+.B \-h
+]
+[
+.B \-F
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.B \-s 1|2|3
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_stem_idx
+generates a stem index file for a collection that is to be built with
+stem indexes.  This program should be called three times: once for each
+.B -s
+parameter.  It uses the stemmed dictionary to create the stem index which
+contains pointers into the stemmed dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " num"
+The dictionary is stored in blocks on disk; this option is used to set
+the block size.  The default is 4-KB blocks.
+.TP
+.B \-F
+This option causes the disk blocks to be aligned on the appropriate
+boundaries.  For example, if 4-KB blocks are used, they will be aligned
+in the file on 4-KB boundaries.
+.TP
+.B -s 1|2|3
+The stem method to apply for the stem index.
+.br
+1 = casefolded and non-stemmed
+.br
+2 = non-casefolded and stemmed
+.br
+3 = casefolded and stemmed
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.invf.dict.blocked
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked.1
+Stem index with stem index method 1.
+.TP
+.B *.invf.dict.blocked.2
+Stem index with stem index method 2.
+.TP
+.B *.invf.dict.blocked.3
+Stem index with stem index method 3.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_invf_dict (1),
+.BR mgstemidxlist (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_estimate.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_estimate.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_estimate.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_text_estimate 1 \*(Dt CITRI
+.SH NAME
+mg_text_estimate \- Estimate the size of the compressed text based on the text statistics and a compression dictionary.
+.SH SYNOPSIS
+.B mg_text_estimate
+[
+.B \-h
+]
+[
+.BR \-H " |"
+.BR \-B " |"
+.BR \-D " |"
+.BR \-Y " |"
+.B \-M
+]
+.if n .ti +9n
+.I stats-dict
+.I compression-dict
+.SH DESCRIPTION
+This program estimates the size of the compressed text that would be
+generated if text with certain statistics were compressed with a
+particular dictionary.  This program has no real use in the
+.BR mg (1)
+system, except for experimenting with the
+.BR mg_compression_dict (1)
+program.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-m\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-H
+This specifies that novel words will be coded character by character
+using Huffman codes.
+.TP
+.B \-B
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using binary codes.  The binary code represents their occurrence
+position in the auxiliary dictionary.
+.TP
+.B \-D
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using delta codes.  The delta code represents their occurrence position
+in the auxiliary dictionary.
+.TP
+.B \-Y
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This generally
+produces better compression than
+.B \-B
+or
+.BR \-D .
+.TP
+.B \-M
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This method is
+adaptive within documents, and generally produces better compression
+than
+.BR \-B ,
+.B \-D
+or
+.BR \-Y .
+.SH FILES
+.TP 20
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_text_merge.1	(revision 21083)
@@ -0,0 +1,76 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_text_merge 1 \*(Dt CITRI
+.SH NAME
+mg_text_merge \- Append one compressed text file to another
+.SH SYNOPSIS
+.B mg_text_merge
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program takes two
+.BR mg (1)
+database inverted files and stemmed
+dictionaries, named "old" and "new" respectively, and creates
+a merged stemmed dictionary and inverted file.
+It is part of the
+.BR mgmerge (1)
+addition to the
+.BR mg (1)
+package.
+The two compressed text files are
+.IR "name" .old.text
+and
+.IR "name" .new.text.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.old.text
+The old compressed text.
+.TP
+.B *.new.text
+The new compressed text that will be appended
+.TP
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgmerge (1),
+.BR mg_get_merge (1),
+.BR mg_invf_merge (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mgquery (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mg_weights_build.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mg_weights_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mg_weights_build.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_weights_build 1 \*(Dt CITRI
+.SH NAME
+mg_weights_build \- builds the approximate weights file
+.SH SYNOPSIS
+.B mg_weights_build
+[
+.B \-h
+]
+[
+.B \-s
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_weights_build
+is the program that generates the approximate weights file and the
+interleaved text index and exact weights file.  To do this, it uses
+the text index and either the exact weights file, or the inverted file
+and stemmed dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-s
+Save the weights generated from the
+.I *.invf
+and
+.I *.invf.dict
+file in a
+.I *.weight
+file.
+.TP
+.BI \-b " num"
+This specifies the number of bits of precision that should be used for
+the approximate weights.  If not specified, it defaults to 8.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgbilevel.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgbilevel.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgbilevel.1	(revision 21083)
@@ -0,0 +1,116 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbilevel 1 \*(Dt CITRI
+.SH NAME
+mgbilevel \- compresses a bilevel image using a specified template
+.SH SYNOPSIS
+.B mgbilevel
+.B \-e
+[
+.B \-t
+.I \*(lqstring\*(rq
+]
+.I infile
+[
+.I \>compressed-outfile
+]
+.nf
+or
+.fi
+.B mgbilevel
+.B \-d
+.I compressed-infile
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+.B mgbilevel
+performs (up to) a two-stage template-based compression.  The
+user can specify the template to be used in the compression process.  The
+default template size is a two-stage template 22/10.  The compressed file
+contains the template type in the stream.  The output files are written
+to
+.IR stdout .
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-t\fP \fI\*(lqstring\*(rq\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-e
+Compresses
+.I infile
+using a template specified, and writes to
+.IR compressed-outfile .
+.TP
+.B \-d
+Decompresses
+.I compressed-infile
+using the template contained in the compressed file.  Writes to
+.IR outfile .
+.TP
+\fB\-t \fP\fI\*(lqstring\*(rq\fP
+This option specifies which template combination is to
+be used in the compression.  Five different characters
+can occur in the string: `.' for a pixel not
+included in the template, `p' for a pixel included in the 1st
+level template, `2' for a pixel included in the 2nd level
+template (a subset of the 1st level), `*' denoting the position
+of the
+.I current
+pixel, and a `;' denoting the end of each template line.
+The default template is a two-level 22/10 template:
+.IP
+.RS
+.nf
+\&.ppppp.;
+pp222pp;
+p22222p;
+p22*.\|.\|.;
+.fi
+.RE
+.IP
+This would be specified on the command line as:
+.nf
+\&\fB\-T\fP ".ppppp.;pp222pp;p22222p;p22*.\|.\|.;"
+.fi
+.TP
+.I infile
+This is the input
+.I .pbm
+file to be compressed.
+.TP
+.I outfile
+This is the decompressed
+.I .pbm
+file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild.1	(revision 21083)
@@ -0,0 +1,169 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbuild 1 \*(Dt CITRI
+.SH NAME
+mgbuild \- build an mg system database
+.SH SYNOPSIS
+.B mgbuild
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.BI \-d " mgdata dir"
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgbuild
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely build an
+.BR mg (1)
+system database ready for queries to be made
+by
+.BR mgquery.
+This program makes use of the
+.BR mg_get (1)
+script to obtain the text of the collection.
+.SH OPTIONS
+Options can occur in any order, but the collection name must be last.
+.TP "\w'\fIcollection-name\fP'u+2n"
+.BI \-c
+This specifies whether the
+.I get
+program is \*(lqcomplex\*(rq.  If a
+.I get
+program is \*(lqcomplex\*(rq, then it requires initialisation and
+cleanup with the
+.B \-i
+and
+.B \-c
+options.
+.TP
+.BI \-g " get"
+This specifies the program to use for getting the source text for the
+build.  If no
+.B \-g
+option is given, the default program
+.BR mg_get (1)
+is used.
+.TP
+.BI \-s " source"
+The
+.B mgbuild
+program consists of two parts.  The first part initializes variables
+to default values.  The second part uses these variables to control
+how the
+.BR mg (1)
+database is built.  This option specifies a program to execute between
+the first and second parts.  The details of what the variables are, and
+how they may be changed, are in comments in the
+.B mgbuild
+program.
+.TP
+.BI \-d " mgdata dir"
+Setting this option allows one to override the MGDATA environment variable.
+.TP
+.I collection-name
+This is the collection name, as required by the
+.BR mg_get (1)
+program.  It serves both as a
+.I case
+statement selector, and as the name of a subdirectory that holds the
+indexing files.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.chunk
+Inverted file chunk descriptor file.  When the inverted file is
+created, it is written in chunks that use no more than a set amount of
+memory.  This file describes those chunks.
+.TP
+.B *.invf.chunk.trans
+Word-occurrence-order to lexical-order translation file.  The
+.B *.invf.chunk
+file is written in word-occurrence order but is required by
+.B \-N2
+to be in lexical order.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for an order-preserving perfect hash function.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Text statistics.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild_4.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild_4.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgbuild_4.1	(revision 21083)
@@ -0,0 +1,53 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbuild_4 1 \*(Dt CITRI
+.SH NAME
+mgbuild_4 \- build an mg system database using 4 passes instead of 2
+.SH SYNOPSIS
+.B mgbuild_4
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.BI \-d " mgdata dir"
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgbuild_4
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely build an
+.BR mg (1)
+system database ready for queries to be made
+by
+.BR mgquery.
+This program makes use of the
+.BR mg_get (1)
+script to obtain the text of the collection.
+In 
+.BR mgbuild (1)
+the build is done by two passes over the input text. The first
+pass creates the compressed text dictionary and inverted file dictionary,
+the second pass creates the compressed text and inverted file. What 
+.BR mgbuild_4
+does is use a separate pass for each function. This will be slower but will
+not require as much RAM at one time. Therefore, if your build is failing
+due to running short of memory, then 
+.BR mgbuild_4
+is worth a try.
+.SH "SEE ALSO"
+.na
+.BR mgbuild (1)
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgdictlist.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgdictlist.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgdictlist.1	(revision 21083)
@@ -0,0 +1,72 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgdictlist 1 \*(Dt CITRI
+.SH NAME
+mgdictlist \- list the contents of a dictionary
+.SH SYNOPSIS
+.B mgdictlist
+[
+.B \-q
+]
+.I filename
+.SH DESCRIPTION
+.B mgdictlist
+lists the contents of either a compressed compression dictionary, a
+text statistics file, or a compressed stemmed dictionary.  Unlike all
+the other programs in the
+.BR mg (1)
+suite, it is necessary to specify the complete pathname of the
+dictionary to list.
+.SH OPTIONS
+The
+.I filename
+must be last.
+.TP "\w'\fIfilename\fP'u+2n"
+.B \-q
+Generate an abbreviated output (machine-readable rather than
+human-readable).
+.TP
+.I filename
+This is the name of the dictionary to list.
+.B mgdictlist
+automatically detects whether the file is a compressed compression
+dictionary, text statistics file, or a compressed stemmed dictionary.
+.SH FILES
+.TP 20
+.B *.text.dict
+Text statistics file.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.invf.build
+Compressed stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgfelics.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgfelics.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgfelics.1	(revision 21083)
@@ -0,0 +1,103 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgfelics 1 \*(Dt CITRI
+.SH NAME
+mgfelics \- fast and efficient lossless image (de)compression
+.SH SYNOPSIS
+.B mgfelics
+.B \-e
+[
+.BI \-k " n"
+]
+.I infile
+[
+.I \>compressed-outfile
+]
+.br
+or
+.br
+.B mgfelics
+.B \-d
+.I compressed-infile
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+.B mgfelics
+is a lossless compression process which can (de)compress portable
+bitmap files in
+.I pgm
+format.
+.B mgfelics
+writes to
+.IR stdout .
+.SH OPTIONS
+.TP "\w'\fB\-k\fP \fIn\fP'u+2n"
+.BI \-k " n"
+An integer parameter (< 32) which controls the compression speed and
+ratio.  The value of
+.I n
+is included in the output stream, and therefore is not needed in the
+decompression stage.  The default value of
+.I n
+is equal to the number of bits required to represent each grey level.
+.TP
+.B \-e
+Encodes the file
+.IR infile ,
+sending the output to
+.IR stdout .
+.TP
+.B \-d
+Decodes the file from
+.IR compressed-infile ,
+sending the output to
+.IR stdout .
+.SH NOTE
+.B mgfelics
+uses a combination of adjusted binary and Rice codes, the choice of
+which for any given pixel depends on the environment as determined by
+the intensity values of neighbouring pixels.  The result is a very
+fast and lossless algorithm for compressing grayscale images.  The
+optional parameter
+.BI \-k " n"
+corresponds to the maximum exponent of the same name in Rice encoding.
+Smaller values of
+.BI \-k " n"
+can result in significant improvement in compression times with a
+corresponding loss in compression ratio.  However the reduction in
+compression ratio with a small
+.BI \-k " n"
+parameter may be insignificant for many images.
+.SH REFERENCES
+Algorithm by Paul G. Howard and Jeffrey Scott Vitter
+of Brown University, RI, and Duke University, NC, respectively.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgmerge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgmerge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgmerge.1	(revision 21083)
@@ -0,0 +1,175 @@
+`.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgmerge 1 \*(Dt CITRI
+.SH NAME
+mgmerge \- update an mg system database with new documents
+.SH SYNOPSIS
+.B mgmerge
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.B \-S
+]
+[
+.B \-w
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgmerge
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely merge a current
+.BR mg (1)
+system database ready with some new documents, saving the need for a complete
+database rebuild with
+.B mgbuild.
+It does this by building a second
+.BR mg (1)
+system database from the new documents and then merging this database
+with the old one.
+This program makes use of the
+.BR mg_get_merge (1)
+script to obtain the text of the collection.
+.B mgmerge
+cannot edit or delete documents already in a database; only new documents
+can be added.
+.SH OPTIONS
+Options can occur in any order, but the collection name must be last.
+.TP "\w'\fIcollection-name\fP'u+2n"
+.BI \-c
+This specifies whether the
+.I get
+program is \*(lqcomplex\*(rq.  If a
+.I get
+program is \*(lqcomplex\*(rq, then it requires initialisation and
+cleanup with the
+.B \-i
+and
+.B \-c
+options.
+.TP
+.BI \-g " get"
+This specifies the program to use for getting the source text for the
+build.  If no
+.B \-g
+option is given, the default program
+.BR mg_get_merge (1)
+is used.
+.TP
+.BI \-s " source"
+The
+.B mgmerge
+program consists of two parts.  The first part initializes variables
+to default values.  The second part uses these variables to control
+how the
+.BR mg (1)
+database is built.  This option specifies a program to execute between
+the first and second parts.  The details of what the variables are, and
+how they may be changed, are in comments in the
+.B mgmerge
+program.
+If this option is used, the program should ideally be the same one that
+was called by
+.BR mgbuild (1)
+to build the database since some parameters need to be consistent between
+.B mgbuild
+and
+.B mgmerge.
+.TP
+.B \-S
+This option will cause a slow merge to be performed on the inverted files,
+where each inverted file entry is decoded and recoded.
+The default is a fast merge. Accumulated fast merges slowly degrade
+compression performance on the resulting inverted file so
+a periodic slow merge is recommended.
+.TP
+.B \-w
+Adding new documents can have an effect on the weight of the previous ones.
+By default the weights for documents already in the collection are not 
+recomputed since the change in their values is usually small.
+This option forces new weights to be recomputed.
+Periodic use of this option, as for the "-S" option, is recomended,
+otherwise query rankings may become inaccurate.
+.TP
+.I collection-name
+This is the collection name, as required by the
+.BR mg_get_merge (1)
+program.  It serves both as a
+.I case
+statement selector, and as the name of a subdirectory that holds the
+indexing files.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+Note that a temporary directory under the
+.B MGDATA
+directory is used to perform the merge.
+The default name for this directory is
+.BR MERGE .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Text statistics.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgbuild (1),
+.BR mg_get_merge (1),
+.BR mg_get (1),
+.BR mg_invf_merge (1),
+.BR mg_text_merge (1),
+.BR mg_query (1),
+.BR mg_weights_build (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgquery.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgquery.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgquery.1	(revision 21083)
@@ -0,0 +1,693 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgquery 1 \*(Dt CITRI
+.SH NAME
+mgquery \- query program for the mg system
+.SH SYNOPSIS
+.B mgquery
+[
+.B \-h
+]
+[
+.B \-D
+]
+[
+.BI \-f " name"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+[
+.I collection-name
+]
+.SH DESCRIPTION
+.B mgquery
+enables users to make Boolean or ranked queries from a data base
+generated by the
+.BR mg (1)
+system.  It accepts queries from
+.I stdin
+and sends the retrieved documents to
+.IR stdout .
+Information on the resource usage of
+.B mgquery
+as it processes queries can be obtained interactively.
+.SH OPTIONS
+Options may appear in any order, but the
+.IR collection-name ,
+if specified, must be last.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-D
+This option causes the entire text to be decompressed and sent to
+.IR stdout .
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection that will be
+used.  If a collection with the specified base
+.I name
+does not exist, an error message will be displayed and
+.B mgquery
+will exit.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.SH USAGE
+Prior to processing the command line arguments, the
+.B mgquery
+program attempts to read in a startup script called
+.IR ./.mgrc .
+If that fails, it attempts to read in the file
+.IR $HOME/.mgrc .
+The startup file can only contain commands\(emno queries are
+permitted in the
+.I .mgrc
+file.  Lines starting with \*(lq\fB#\fP\*(rq in the file are comments.
+The most common use for the
+.I .mgrc
+file is to personalise the initial values of the predefined parameters
+with
+.B .set
+commands.
+.LP
+The input to
+.B mgquery
+consists of a series of input lines.  The backslash
+character
+.RB (\*(lq \e \*(rq)
+is used at the end of lines to indicate
+that input continues on the next line.
+.LP
+Input lines on which the first character is a dot
+.RB (\*(lq . \*(rq)
+are commands to the
+.B mgquery
+program.  Input lines that do not start with a dot are queries.
+.LP
+A query consists of two parts.  One part is a Boolean or ranked query
+that identifies documents.  The second part is a post-processing
+pattern matching operation.  Any text between the first speech mark
+(\*(lq) and the last speech mark (\*(rq) is considered to be a
+post-processing pattern.
+.SH COMMANDS
+The
+.B mgquery
+program can accept the following commands.
+.TP 17
+.B .help
+Display several pages of help text.
+.TP
+.B .quit
+Quit the program.
+.TP
+.B .warranty
+Display the
+.BR mg (1)
+warranty.
+.TP
+.B .conditions
+Display the conditions of use and distribution of
+.BR mg (1).
+.TP
+.BI ".set " "name value"
+Set the parameter
+.I name
+to the specified
+.IR value .
+If the parameter is a Boolean
+.I value
+and the
+.I value
+is omitted, the parameter will be inverted (i.e., if it was
+.IR true ,
+then it will change to
+.IR false ;
+if it was
+.IR false ,
+then it will change to
+.IR true ).
+.TP
+.BI ".unset " name
+Delete the parameter
+.I name
+from the currently-defined parameters.
+.TP
+.B .reset
+Reset the parameters to the state that they had after the processing
+of the
+.B mgquery
+command line.
+.TP
+.B .display
+Display the values of all the currently-defined parameters.
+.TP
+.B .push
+Push the currently-defined parameters onto a stack.
+.TP
+.B .pop
+Pops a set of parameters off the stack, replacing the currently-defined
+ones.
+.TP
+.BI ".output " arg
+This is used to specify where to send the text of the documents.  Once
+the
+.B .output
+command is specified, all subsequent output will be sent to the place
+specified by
+.IR arg .
+If
+.I arg
+is not specified subsequent output will be directed to
+.IR stdout .
+.I Arg
+may be any of the following.
+.RS
+.TP 13
+.BI "> " filename
+Send output to the specified file.
+.TP
+.BI ">> " filename
+Append output to the specified file.
+.TP
+.BI "| " command
+Pipe the output to
+.IR command ,
+which is executed by
+.IR sh .
+.RE
+.TP
+.BI ".input " arg
+This is used to specify where input (queries and commands) comes
+from.  Once the
+.B .input
+command is specified all subsequent input will be come from the place
+specified by
+.IR arg .
+If
+.I arg
+is not specified subsequent input will come from
+.IR stdin .
+.RS
+.TP 13
+.BI "< " filename
+Get input from the specified file.
+.TP
+.BI "| " command
+The input comes from the standard output of
+.IR command ,
+which is executed by
+.IR sh .
+.RE
+.SH PARAMETERS
+The following parameters are predefined and have special
+significance.  Each parameter will be followed by its default
+value.  Parameters are initialised before the
+.I .mgrc
+file is read or the command line arguments are processed.
+.TP 17
+.BI accumulator_method " `array'"
+This parameter is used during ranking, and specifies how the
+weight for each document should be accumulated.  The following
+methods are available:
+.IR array ,
+.IR splay_tree ,
+.IR hash_table ,
+and
+.IR list .
+.TP
+.BI briefstats " `off'"
+This is a Boolean parameter that determines whether the
+totals for disk, memory and time usage statistics will be
+displayed at the end of each query.
+.IR Note :
+this takes precedence over the parameters
+.BR diskstats ,
+.BR memstats " and " timestats .
+This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI buffer " `1048576'"
+When the documents are being read in, they are read into a
+buffer of this size and then displayed from this buffer.  If
+the documents are larger than this buffer, the buffer is
+expanded automatically.  Having a large buffer gives a very
+slight performance improvement, because it allows the order of
+disk operations to be optimised.  The buffer size is measured
+in bytes.
+.TP
+.BI diskstats " `off'"
+This is a Boolean parameter that determines whether the disk
+usage statistics for the preceding query will be displayed
+after each query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI doc_sepstr " `---------------------------------- %n\en\'"
+This specifies the string that will be used to separate
+documents when they are displayed for `Boolean' or `docnums'
+queries.  The standard C escape character sequences
+may be used to place special characters in the
+string.  For example, a newline would be `\en'.  To include a `%',
+use the sequence `%%'.  To include the
+.BR mg (1)
+document number, use the sequence `%n'.  The following escape character
+sequences are available
+.nf
+.ta 1.7iL
+.B Sequence	Meaning
+`\e\e'	backslash
+`\eb'	backspace
+`\ef'	formfeed
+`\en'	newline
+`\er'	carriage return
+`\et'	tab
+`\e"'	speech marks
+`\e''	quote mark
+`\ex\fIhh\fP'	ASCII code in hexadecimal
+`\ennn'	ASCII code in octal
+.fi
+.TP
+.BI expert " `false'"
+If this is
+.IR true ,
+then much of the dialogue output is suppressed.  This parameter may
+take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI hash_tbl_size " `1000'"
+One of the options during ranking queries is to use a hash
+table to accumulate the weights for each document.  The hash
+table is a simple chained type.  This parameter specifies the
+size of the hash table and may take any value between 8 and
+268435456 (2^28).
+.TP
+.BI heads_length " `50'"
+When the mode is
+.BR heads ,
+this specifies the number of characters that will be output for each
+document.
+.TP
+.BI maxdocs " `all'"
+The maximum number of documents to display in response to a
+query.  This parameter may take on a numeric value between 1
+and 429467295 (2^32 - 1) or the word
+.IR all .
+.TP
+.BI maxparas " `1000'"
+The maximum number of paragraphs to identify during a ranked
+query with paragraph indexing.  After the paragraphs have been
+identified, the paragraphs are converted into documents, and
+because some of the paragraphs may refer to the same documents
+the final number of answers may be less than
+.BR maxparas .
+The
+.B maxdocs
+parameter will then be applied.  This parameter may take on a numeric
+value between 1 and 429467295 (2^32 - 1).
+.TP
+.BI max_accumulators " `50000'"
+This parameter limits the number of different paragraph and
+document numbers to be accumulated during ranked queries when
+the parameter
+.B accumulator_method
+is set to
+.IR splay_tree ,
+.IR hash_table ,
+or
+.IR list .
+This parameter may take any value between 8 and 268435456 (2^28).
+.TP
+.BI max_terms " `all'"
+This parameter limits the number of terms that will actually
+be used during a ranked query.  If more terms than the number
+specified by
+.B max_terms
+are entered, then the extra terms will be discarded.  If
+.B sorted_terms
+is on, then the limiting will be done after the terms have been
+sorted.  This parameter may take any value between 1 and 429467295
+(2^32 - 1), or the word
+.IR all.
+.TP
+.BI memstats " `off'"
+This is a Boolean parameter that determines whether the memory
+usage statistics for the preceding query will be displayed
+after each query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI mgdir " `.'"
+This is set to the directory where the
+.BR mg (1)
+data files may be found.  If
+the environment variable
+.B MGDATA
+exists, then this is instead initialised to the value of
+.BR MGDATA .
+The value of this parameter may be changed, either in the
+.I .mgrc
+file with a
+.BI ".set mgdir "directory
+command, or from the command line using the
+.BI \-d " directory"
+option.  Once the \*(lq\fB>\fP\*(rq prompt appears, changing this
+parameter will have no effect.
+.TP
+.BI mgname " `bible'"
+This is set to the name of the
+.BR mg (1)
+collection that is to be used for the session.  The value of this
+parameter may be changed, either in the
+.I .mgrc
+file with a
+.BI ".set mgname "name
+command, or from the command line using the
+.BI \-f " name"
+option.  Once the \*(lq\fB>\fP\*(rq prompt appears, changing this
+parameter will have no effect.
+.TP
+.BI mode " `text'"
+This specifies how documents should be displayed when they
+are retrieved.  It may take six different values:
+.IR text ,
+.IR hilite ,
+.IR docnums ,
+.IR heads ,
+.IR silent ,
+or
+.IR count .
+.I text
+displays the contents of the document.
+.I hilite
+displays the contents of the document and highlights any of the 
+stemmed query terms.
+.I docnums
+displays only the document numbers.
+.I heads
+is used to print out the head of each document.
+.I silent
+retrieves all the documents but displays nothing except how many
+documents were retrieved.  This mode is intended to be used in timing
+experiments.
+.I count
+does the minimum
+amount of work required to determine how many documents would
+be retrieved, but does not retrieve them.
+.TP
+.BI optimise_type " `1'"
+There are three types of boolean query optimisation (parse tree
+rearrangement). Type 0 leaves parse tree unaltered. Type 1 optimises
+for AND of terms and AND of OR of terms. Type 2 converts the tree
+into DNF (an experiment :-).
+.TP
+.BI pager " `more'"
+This is the name of the program that will be used to display
+the help and the retrieved documents.  If the environment
+variable
+.B PAGER
+is defined, then
+.B pager
+takes on that value.
+.TP
+.BI hilite_style " `bold'"
+This specifies the type of highlighting method.
+It may take one of two different values:
+.IR bold,
+or
+.IR underline.
+.TP
+.BI para_sepstr " `\en######## PARAGRAPH %n ########\en'"
+This specifies the string that will be used to separate paragraphs.
+The standard C escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written
+as `\en'.  To include a `%', use the sequence `%%'.  To include the
+paragraph number within the document, use the sequence `%n'.
+.TP
+.BI para_start " `***** Weight = %w *****\en'"
+This specifies the string that will be used at the head of paragraphs
+for a paragraph-level index following a ranked query.  The standard
+C-language escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written as
+`\en'.  To include a `%', use the sequence `%%'.  To include the
+paragraph weight, use the sequence `%w'.
+.TP
+.BI qfreq " `true'"
+This determine whether the ranked queries will take into account the
+number of times each query term is specified.  When this is
+.IR true ,
+the number of times a term appears in the query is used in the
+ranking.  When this is
+.IR false ,
+all query terms are assumed to occur only once.  This parameter may
+take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI query  " `Boolean'"
+This specifies the type of queries that are to be specified.
+It can take four different values:
+.IR Boolean ,
+.IR ranked ,
+.IR docnums " or " approx-ranked.
+.I Boolean
+is for Boolean queries.
+The
+.BR yacc (1)
+grammar for Boolean queries is as follows.
+.IP
+.nf
+        query   : or;
+.IP
+        or      : or '|' and
+                | and ;
+.IP
+        and     : and '&' not
+                | and not
+                | not ;
+.IP
+        not     : term
+                | '!' not ;
+.IP
+        term    : TERM
+                | '(' or ')' ;
+.fi
+.IP
+.IR ranked " and " approx-ranked
+are for queries ranked by the cosine measure.
+.I approx-ranked
+uses only the low-precision document lengths, and therefore only
+produces an approximation to full cosine ranking.
+.IP
+.nf
+        query   : TERM
+                | query TERM ;
+.fi
+.IP
+.I docnums
+allows the entry of document numbers.  Multiple numbers separated by
+spaces may be specified, or ranges separated by hyphens.
+.IP
+.nf
+        query   : range
+                | query range ;
+.IP
+        range   : num
+                | num '-' num ;
+.fi
+.TP
+.BI ranked_doc_sepstr " `-------------------------------- %n %w\en'"
+This specifies the string that will be used to separate documents when
+they are displayed for `ranked' or `approx-ranked' queries.  The
+standard C escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written as
+`\en'.  To include a `%', use the sequence `%%'.  To include the
+.BR mg (1)
+document number, use the sequence `%n'.  To include the document
+weight, use the sequence `%w'.
+.TP
+.BI sizestats " `false'"
+If this is
+.IR true ,
+then various numbers are output at the end of each query indicating
+what went on during the query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI skip_dump " `skips.%d'"
+If this parameter is set, then a file will be produced in the current
+directory during ranked queries on skipped inverted files when
+.B accumulator_method
+is set to
+.IR splay_tree ,
+.IR hash_table ,
+or
+.IR list .
+The name of the file is the value of this parameter.  A `%d' in the
+file name will be replaced with the process id of
+.BR mgquery .
+This file will contain information about the usage of skips during the
+query processing.  This option is expensive; use
+.B .unset skip_dump
+to obtain optimal performance.
+.TP
+.BI sorted_terms " `on'"
+This specifies whether or not the terms should be sorted into
+decreasing occurrence in documents so that the least-often occurring
+terms are processed first when ranked queries are being done.  When
+this is
+.IR true ,
+the terms are sorted.  When this is
+.IR false ,
+the terms are not sorted, and are instead processed in order of
+occurrence.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI stop_at_max_accum " `on'"
+This specifies what should happen when the maximum number of
+accumulators set by
+.B max_accumulators
+is reached.  When this is
+.IR true ,
+the processing of terms is stopped at the completion of the current
+term.  When this is
+.IR false ,
+processing continues but no new accumulators are created.  This
+parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI terminator " `'"
+This specifies the string that will be output after the last document
+from the previous query has been output.  The standard C escape
+character sequences may be used to place special characters in the
+string.  For example, a newline would be written as `\en'.  To include
+a `%', use the sequence `%%'.
+.TP
+.BI timestats " `false'"
+If this is
+.IR true ,
+then the time to process a query is displayed in both real time and
+CPU time.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI verbatim " `off'"
+This is a Boolean parameter that determines whether the program
+should attempt to do a regular-expression match on the retrieved
+text.  If verbatim is
+.I on
+and a post-processing string is specified with the query, then the
+post-processing string will be searched for in the documents just
+before they are displayed.  If the string is found, the document will
+be displayed; if not, the document will not be displayed.  If verbatim
+is
+.IR off ,
+the post-processing string will be considered a regular expression
+as in
+.BR egrep (1)
+or
+.BR vi (1).
+E.g., if verbatim is
+.I on,
+\*(lq\fBand.*the\fP\*(rq will look for the 8-character sequence
+\*(lq\fBand.*the\fP\*(rq.  If verbatim is
+.IR off ,
+\*(lq\fBand.*the\fP\*(rq will look for the sequence
+\*(lq\fBand\fP\*(rq followed somewhere later in the document by the
+sequence \*(lq\fBthe\fP\*(rq.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.I .mgrc
+.B mgquery
+startup file
+.TP
+.B help.mg
+Help file for
+.BR mgquery .
+The contents of this file is displayed with the
+.B .help
+command.
+.TP
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+The `on-disk' stemmed dictionary.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.dict
+Compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR egrep (1),
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1),
+.BR vi (1),
+.BR yacc (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgstat.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgstat.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgstat.1	(revision 21083)
@@ -0,0 +1,131 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgstat 1 \*(Dt CITRI
+.SH NAME
+mgstat \- print out statistics about a document collection
+.SH SYNOPSIS
+.B mgstat
+[
+.B \-h
+]
+[
+.B \-E
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgstat
+prints out various statistics about an existing
+.BR mg (1)
+document collection.  Depending on the size of the collection, sizes
+will be printed in either kilobytes or megabytes.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stdout .
+.TP
+.B \-E
+This option forces sizes to be printed in bytes rather than kilobytes
+or megabytes.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text
+Compressed documents.
+.TP
+.B *.invf
+Inverted file.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.TP
+.B *.invf.dict.blocked
+Compressed stemmed dictionary and index into the inverted file merged
+into an inverted file.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.invf.chunk
+Maps stemmed terms from occurrence order to lexical order.
+.TP
+.B *.invf.chunk.trans
+Describes where the source text is broken up into chunks for the
+inversion pass.
+.TP
+.B *.invf.dict.hash
+A perfect hash function for the terms in the stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgstemidxlist.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgstemidxlist.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgstemidxlist.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgstemidxlist 1 \*(Dt CITRI
+.SH NAME
+mgstemidxlist \- dumps the stem index file to STDOUT in ASCII format
+.SH SYNOPSIS
+.B mgstemidxlist
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.B \-s 1|2|3
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgstemidxlist
+is a utility program which passes through the stem index and displays
+the information.  (This program was used for debugging but is included
+for completeness!)  The header information is printed out, then for each
+block in the file the block header is displayed.  For each word in the
+stem index, the output is formatted as:
+
+.RS
+.I number_of_references \*(lqword\*(rq
+.br
+.RS
+.I "->  number_of_cases block 3-in-4_block offset"
+.br
+.I "->  ..."
+.RE
+.RE
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B -s 1|2|3
+The stem index file with the associated stem method.
+.br
+1 = casefolded and non-stemmed
+.br
+2 = non-casefolded and stemmed
+.br
+3 = casefolded and stemmed
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.invf.dict.blocked.1
+Stem index with stem index method 1.
+.TP
+.B *.invf.dict.blocked.2
+Stem index with stem index method 2.
+.TP
+.B *.invf.dict.blocked.3
+Stem index with stem index method 3.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_invf_dict (1),
+.BR mg_stem_idx (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgtic.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgtic.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgtic.1	(revision 21083)
@@ -0,0 +1,137 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgtic 1 \*(Dt CITRI
+.SH NAME
+mgtic \- textual image compression.
+.SH SYNOPSIS
+.B mgtic
+.B \-e
+[
+.B \-L
+]
+[
+.B \-Q
+]
+[
+.B \-X
+]
+.I libraryfile
+.I infile
+.if n .ti +9n
+[
+.I \>compressed\-outfile
+]
+.nf
+or
+.fi
+.B mgtic
+.B \-d
+[
+.B \-L
+]
+[
+.BI \-X " libraryfile"
+]
+.I compressed-infile
+.if n .ti +9n
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+This is the main routine in the
+.B mgtic
+system.
+.B mgtic
+is used to
+processes a series of files, and by using the
+.I libraryfile
+produced by
+.BR mgticbuild (1),
+compresses input files with respect to the marks contained in the
+library.  On the CCITT test faxes, lossless mode achieved around 20:1
+compression, and lossy, around 40:1 compression.  On more textual
+images, the amount of compression is determined by the resolution of
+the original file, and the amount of noise in the image.  By default,
+.B mgtic
+will reconstruct a lossy version of the image.  This
+can be changed to lossless by using the
+.B \-L
+option.
+.SH OPTIONS
+Options may appear in any order, but must come before the input
+filenames.
+.TP "\w'\fB\-X\fP \fI[libraryfile]\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-e
+Encode
+.I infile
+with respect to the library.
+.TP
+.B \-d
+Decodes
+.IR compressed-infile
+with respect to the library.
+.TP
+.B \-l
+This specifies lossy mode, and is the default mode for (de)compression.
+Do not generate the residue.  If used in encoding mode, does not store
+the residue in the output.  If used in decoding mode, the residue (if
+it exists) is ignored.
+.TP
+.B \-L
+Use lossless mode for (de)compression, which generates the residue.
+If used in encoding mode, this stores the residue in the compressed
+output.  If used in decoding mode (assuming the residue is present),
+this allows the original file to be recovered exactly.
+.TP
+.BI \-R\  filename
+Stores the residue as an external file
+.I filename
+which could possibly be stored on another medium.  During
+decompression, if the residue file specified does not relate to the
+compressed file, the resulting decompressed image will be a mess.
+Note that only the width and height of the residue image is checked.
+.TP
+.BI \-Q
+Uses a quicker form of compression.  This option decreases the time
+spent looking for a good match during encoding.  On average this
+option decreases compression ratios, but increases compression speed.
+.TP
+.BI \-X " [libraryfile]"
+Use an external library file, instead of (de)compressing the library
+within the normal stream.  When decoding, the
+.B \-X
+option must be followed by the
+.IR libraryfile .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgticbuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgticbuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgticbuild.1	(revision 21083)
@@ -0,0 +1,61 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticbuild 1 \*(Dt CITRI
+.SH NAME
+mgticbuild \- build a library of marks from training documents
+.SH SYNOPSIS
+.B mgticbuild
+[
+.B \-h
+]
+.I "libraryfile infile1 infile2 .\|.\|."
+.SH DESCRIPTION
+.B mgticbuild
+builds an uncompressed library of marks that have been
+extracted from a series of input files.  If the
+.I libraryfile
+does
+not exist, it is created, otherwise new marks are appended to the
+file.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.TP
+.I infile(s)
+The training files; the only currently-supported format is
+.IR pbm .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgticdump.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgticdump.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgticdump.1	(revision 21083)
@@ -0,0 +1,55 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticdump 1 \*(Dt CITRI
+.SH NAME
+mgticdump \- displays the library in a user-friendly manner
+.SH SYNOPSIS
+.B mgticdump
+[
+.B \-h
+]
+.I libraryfile
+.SH DESCRIPTION
+.B mgticdump
+displays the marks in a library in a user-viewable form.  The output
+is to
+.I stdout
+and is in a plain ASCII form.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgticprune.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgticprune.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgticprune.1	(revision 21083)
@@ -0,0 +1,91 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticprune 1 \*(Dt CITRI
+.SH NAME
+mgticprune \- prunes the library to remove duplicates
+.SH SYNOPSIS
+.B mgticprune
+[
+.BI \-a " n"
+]
+[
+.BI \-s " n"
+]
+[
+.B \-Q
+]
+.I libraryfile
+.if n .ti +9n
+[
+.I pruned-libraryfile
+]
+.SH DESCRIPTION
+.B mgticprune
+examines
+.I libraryfile
+and removes duplicate marks.  If
+.I pruned-libraryfile
+is not specified,
+.I libraryfile
+is overwritten with the marks in the pruned library.  The Combined
+Symbol Independent Strategy (CSIS) method is used to match marks.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIpruned-libraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-a " n"
+Prune marks when their area is under or equal to the threshold,
+.IR n .
+The default value is\ 3.
+.TP
+.BI \-s " n"
+Prune marks when their width and height is under or equal to
+the threshold,
+.IR n .
+The default value is\ 0.
+.TP
+.BI \-Q
+Use a quicker method of pruning.  The number of iterations through the
+averaging and pruning processes is decreased.  This usually reduces
+time by a half, but compression ratios decrease.
+.TP
+.I libraryfile
+This specifies the name of the library file
+.TP
+.I pruned-libraryfile
+This specifies the name of the prune library, after duplicates and
+matches have been removed.  If this file is not specified, then
+.I libraryfile
+will be overwritten.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/mgticstat.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/mgticstat.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/mgticstat.1	(revision 21083)
@@ -0,0 +1,57 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticstat 1 \*(Dt CITRI
+.SH NAME
+mgticstat \- displays the statistics for the library
+.SH SYNOPSIS
+.B mgticstat
+[
+.B \-h
+]
+.I libraryfile
+.SH DESCRIPTION
+.B mgticstat
+displays statistics about the
+.I libraryfile
+file.
+The output of this program contains the average mark size, average
+centroid position, and the number of marks with an area less than or
+equal to a few powers of\ 2.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1).
Index: /main/tags/2.38/gsdl/packages/mg/man/man1/xmg.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/man/man1/xmg.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/man/man1/xmg.1	(revision 21083)
@@ -0,0 +1,130 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH xmg 1 \*(Dt CITRI
+.SH NAME
+xmg \- An X interface to mgquery
+.SH SYNOPSIS
+.B xmg
+[
+.I collection-name
+]
+.SH DESCRIPTION
+.B xmg
+is an X interface to the
+.BR mg (1)
+information retrieval system.
+.PP
+Type a query in the ``Query'' box.  The escape key clears the query text.
+.PP
+The first line or so of each matching document is listed.
+.PP
+Click on any line to show the complete document.
+.PP
+Shift-click to show the document in a new window.
+.PP
+Press
+.I Next
+and
+.I Previous
+to cycle through the list of documents (shift works here too).
+.PP
+If you change the query, existing windows continue to refer to the
+original query.
+.PP
+You can select either Boolean or ranked queries:
+.RS
+.TP "\w'\fIBoolean queries:\fP'u+2n"
+.I "Boolean queries:"
+use ``&'' for AND, ``|'' for OR, ``!'' for NOT, and parentheses for
+grouping.
+.TP
+.I "Ranked queries:"
+Documents are listed in order of relevance.  A weight is shown
+alongside each.  Weights are normalized to 100 for the most relevant
+document.  Choose
+.I "Approximate Ranking"
+for greater retrieval speed.
+.RE
+.PP
+In document windows (other than the main window):
+.RS
+.br
+Typing `n' = next document;
+.br
+Typing `N' = next document in new window;
+.br
+Typing `p' = previous document;
+.br
+Typing `P' = previous document in new window;
+.br
+Typing `q' = close window.
+.RE
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.TP
+.SB Xdefaults
+To override the default font options, use RESOURCE_MANAGER properties
+like the following in your
+.I .Xdefaults
+file:
+.IP
+.RS
+.nf
+.I "xmg.textfont: fixed"
+.I "xmg.buttonfont: fixed"
+.fi
+.RE
+.IP
+To override the default query type of ranked, use
+.IP
+.RS
+.I "xmg.querytype: boolean"
+.RE
+.IP
+To override the default collection name (the first one listed by
+.BR ls (1)
+from your MGDATA environment variable), use
+.IP
+.RS
+.I "xmg.collection: mail93"
+.RE
+.SH "SEE ALSO"
+.na
+.BR ls (1),
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/mkinstalldirs
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/mkinstalldirs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/mkinstalldirs	(revision 21083)
@@ -0,0 +1,32 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
Index: /main/tags/2.38/gsdl/packages/mg/src/images/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/Makefile.in	(revision 21083)
@@ -0,0 +1,217 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the MG system
+# Copyright (C) 1994  Neil Sharman
+#
+# 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.
+#
+#       @(#)Makefile.in	1.10 22 Mar 1994
+#
+###########################################################################
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+subdir = src/images
+top_srcdir = @top_srcdir@
+transform = @program_transform_name@
+ 
+CC = @CC@
+CFLAGS = @CFLAGS@ 
+CPPFLAGS = @CPPFLAGS@
+DEFS = @DEFS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBS = ../../lib/libmg.a @LIBS@
+GSDLOS = @gsdlos@
+TOUCH = echo timestamp >
+ 
+bindir = ../../../../bin/$(GSDLOS)
+datadir = $(prefix)/share
+libexecdir = $(exec_prefix)/libexec
+localedir = $(datadir)/locale
+mandir = $(prefix)/man/man1
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+ 
+
+ANSI2KNR = @ANSI2KNR@
+o = .@U@o
+ 
+.SUFFIXES: ._c ._o
+.c._c:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $@
+._c._o:
+	@echo $(COMPILE) $<
+	@rm -f _$*.c
+	@ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $*._c
+	@echo $(COMPILE) $*._c
+	@rm -f _$*.c
+	@ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+ 
+INCLUDES = -I../../../.. -I../.. -I../../lib -I.
+
+
+SOURCES = \
+  arithcode.c     extractor.c     mgbilevel.c     mgticdump.c     utils.c \
+  bilevel.c       felics.c        mgfelics.c      mgticprune.c    mgticstat.c\
+  codeoffsets.c   marklist.c      mgtic.c         pbmtools.c      lstevent.c \
+  codesyms.c      match.c         mgticbuild.c    sortmarks.c     ppm.c  
+
+
+ 
+HEADERS = \
+  arithcode.h     codeoffsets.h   marklist.h      sortmarks.h \
+  basictypes.h    codesyms.h      match.h         utils.h     \
+  bilevel.h       extractor.h     pbmtools.h      model.h
+
+MISC          = Makefile.in 
+
+ALLFILES      =	$(SOURCES) $(HEADERS) $(MISC) $(MAN)
+
+DISTFILES     = $(ALLFILES) 
+
+EXEC          = mgfelics mgbilevel mgtic mgticbuild mgticprune mgticstat \
+                mgticdump
+
+MAN           = mgfelics.1 mgbilevel.1 mgtic.1 mgticbuild.1  mgticprune.1 \
+                mgticstat.1 mgticdump.1
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+all: $(EXEC)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+FELICS_OBJS = felics$o mgfelics$o utils$o
+
+mgfelics: $(FELICS_OBJS)
+	$(LINK) $(FELICS_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+BILEVEL_OBJS = \
+	arithcode$o bilevel$o extractor$o marklist$o mgbilevel$o \
+	pbmtools$o utils$o
+            
+mgbilevel: $(BILEVEL_OBJS)
+	$(LINK) $(BILEVEL_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+TIC_OBJS = \
+	mgtic$o extractor$o marklist$o pbmtools$o utils$o match$o \
+	sortmarks$o codesyms$o ppm$o lstevent$o arithcode$o codeoffsets$o bilevel$o
+
+mgtic: $(TIC_OBJS) 
+	$(LINK) $(TIC_OBJS) $(LIBS) 
+
+TICBUILD_OBJS = mgticbuild$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticbuild: $(TICBUILD_OBJS)
+	$(LINK) $(TICBUILD_OBJS) $(LIBS)
+ 
+TICPRUNE_OBJS = \
+	mgticprune$o extractor$o marklist$o pbmtools$o \
+	utils$o match$o
+
+mgticprune: $(TICPRUNE_OBJS)
+	$(LINK) $(TICPRUNE_OBJS) $(LIBS)
+ 
+TICSTAT_OBJS = mgticstat$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticstat: $(TICSTAT_OBJS)
+	$(LINK) $(TICSTAT_OBJS) $(LIBS) 
+ 
+TICDUMP = mgticdump$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticdump: $(TICDUMP)
+	$(LINK) $(TICDUMP) $(LIBS) 
+ 
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+ansi2knr: ansi2knr.o
+	$(LINK) ansi2knr.o $(LIBS)
+
+install: execinstall #maninstall
+uninstall: execuninstall manuninstall
+
+execinstall: $(EXEC)
+	for name in $(EXEC); do \
+	  $(INSTALL_PROGRAM) $$name \
+	  $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+execuninstall:
+	for name in $(EXEC); do \
+	 rm -f $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+maninstall: $(MAN)
+	$(top_srcdir)/mkinstalldirs $(mandir); \
+	for f in $(MAN); do \
+	  $(INSTALL_DATA) $$f $(mandir)/$$f ;\
+	done
+
+manuninstall: $(MAN)
+	for f in $(MAN); do \
+	  rm -f $(mandir)/$$f ;\
+	done
+
+
+mostlyclean:
+	rm -f *$o _*.c _*.o *._c *._o core core.*
+ 
+clean: mostlyclean
+	rm -f $(EXEC)
+ 
+distclean: clean
+	rm -f ansi2knr
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+ 
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	  || cp -p $(srcdir)/$$file $(distdir); \
+	done
+
+# screws up distclean (jrm21) 
+#Makefile: Makefile.in ../../../../config.status
+#	cd ../../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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:
Index: /main/tags/2.38/gsdl/packages/mg/src/images/WIN32.MAK
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/WIN32.MAK	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/WIN32.MAK	(revision 21083)
@@ -0,0 +1,201 @@
+# Generated automatically from Makefile.in by configure.
+###########################################################################
+#
+# Makefile.in -- Makefile for the MG system
+# Copyright (C) 1994  Neil Sharman
+#
+# 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.
+#
+#       @(#)Makefile.in	1.10 22 Mar 1994
+#
+###########################################################################
+
+#PACKAGE = mg
+#VERSION = 1.2
+ 
+#SHELL = /bin/sh
+#exec_prefix = ${prefix}
+#prefix = /home/rpeeters/mg/mg-1.3.2
+#srcdir = .
+#subdir = src/images
+#top_srcdir = ../..
+#transform = s,x,x,
+ 
+CC = cl
+#CFLAGS = -g -O -Wall 
+CPPFLAGS = 
+DEFS = -DHAVE_CONFIG_H -D__WIN32__ -D_LITTLE_ENDIAN
+#INSTALL = /usr/local/gnu/bin/install -c
+#INSTALL_DATA = ${INSTALL} -m 644
+#INSTALL_PROGRAM = ${INSTALL}
+LDFLAGS = 
+LIBS = ..\..\lib\libmg.lib 
+#TOUCH = echo timestamp >
+ 
+#bindir = $(exec_prefix)/bin
+#datadir = $(prefix)/share
+#libexecdir = $(exec_prefix)/libexec
+#localedir = $(datadir)/locale
+#mandir = $(prefix)/man/man1
+ 
+COMPILE = $(CC) -c $(DEFS) -I. -I..\.. -I..\..\lib
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+ 
+
+o = .obj
+e = .exe
+ 
+
+SOURCES = \
+  arithcode.c     extractor.c     mgbilevel.c     mgticdump.c     utils.c \
+  bilevel.c       felics.c        mgfelics.c      mgticprune.c    mgticstat.c\
+  codeoffsets.c   marklist.c      mgtic.c         pbmtools.c      lstevent.c \
+  codesyms.c      match.c         mgticbuild.c    sortmarks.c     ppm.c  
+
+
+ 
+HEADERS = \
+  arithcode.h     codeoffsets.h   marklist.h      sortmarks.h \
+  basictypes.h    codesyms.h      match.h         utils.h     \
+  bilevel.h       extractor.h     pbmtools.h      model.h
+
+MISC          = Makefile.in 
+
+ALLFILES      =	$(SOURCES) $(HEADERS) $(MISC) $(MAN)
+
+DISTFILES     = $(ALLFILES) 
+
+EXEC          = mgfelics$e mgbilevel$e mgtic$e mgticbuild$e mgticprune$e mgticstat$e \
+                mgticdump$e
+
+MAN           = mgfelics.1 mgbilevel.1 mgtic.1 mgticbuild.1  mgticprune.1 \
+                mgticstat.1 mgticdump.1
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+all: $(EXEC)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+FELICS_OBJS = felics$o mgfelics$o utils$o
+
+mgfelics$e: $(FELICS_OBJS)
+	$(LINK) $(FELICS_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+BILEVEL_OBJS = \
+	arithcode$o bilevel$o extractor$o marklist$o mgbilevel$o \
+	pbmtools$o utils$o
+            
+mgbilevel$e: $(BILEVEL_OBJS)
+	$(LINK) $(BILEVEL_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+TIC_OBJS = \
+	mgtic$o extractor$o marklist$o pbmtools$o utils$o match$o \
+	sortmarks$o codesyms$o ppm$o lstevent$o arithcode$o codeoffsets$o bilevel$o
+
+mgtic$e: $(TIC_OBJS) 
+	$(LINK) $(TIC_OBJS) $(LIBS) 
+
+TICBUILD_OBJS = mgticbuild$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticbuild$e: $(TICBUILD_OBJS)
+	$(LINK) $(TICBUILD_OBJS) $(LIBS)
+ 
+TICPRUNE_OBJS = \
+	mgticprune$o extractor$o marklist$o pbmtools$o \
+	utils$o match$o
+
+mgticprune$e: $(TICPRUNE_OBJS)
+	$(LINK) $(TICPRUNE_OBJS) $(LIBS)
+ 
+TICSTAT_OBJS = mgticstat$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticstat$e: $(TICSTAT_OBJS)
+	$(LINK) $(TICSTAT_OBJS) $(LIBS) 
+ 
+TICDUMP = mgticdump$o extractor$o marklist$o pbmtools$o utils$o
+
+mgticdump$e: $(TICDUMP)
+	$(LINK) $(TICDUMP) $(LIBS) 
+ 
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+#ansi2knr: ansi2knr.o
+#	$(LINK) ansi2knr.o $(LIBS)
+#
+install: execinstall maninstall
+uninstall: execuninstall manuninstall
+
+#execinstall: $(EXEC)
+#	$(top_srcdir)/mkinstalldirs $(bindir); \
+#	for name in $(EXEC); do \
+#	  $(INSTALL_PROGRAM) $$name \
+#	  $(bindir)/`echo $$name | sed '$(transform)'`; \
+#	done
+
+#execuninstall:
+#	for name in $(EXEC); do \
+#	 rm -f $(bindir)/`echo $$name | sed '$(transform)'`; \
+#	done
+
+maninstall: $(MAN)
+	$(top_srcdir)/mkinstalldirs $(mandir); \
+	for f in $(MAN); do \
+	  $(INSTALL_DATA) $$f $(mandir)/$$f ;\
+	done
+
+manuninstall: $(MAN)
+	for f in $(MAN); do \
+	  rm -f $(mandir)/$$f ;\
+	done
+
+
+mostlyclean:
+	rm -f *$o _*.c _*.o *._c *._o core core.*
+ 
+clean: mostlyclean
+	rm -f $(EXEC)
+ 
+distclean: clean
+	rm -f ansi2knr
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+ 
+#dist: $(DISTFILES)
+#	for file in $(DISTFILES); do \
+#	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+#	  || cp -p $(srcdir)/$$file $(distdir); \
+#	done
+ 
+#Makefile: Makefile.in ../../config.status
+#	cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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:
Index: /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.c	(revision 21083)
@@ -0,0 +1,471 @@
+/**************************************************************************
+ *
+ * arithcode.c -- Arithmetic coding
+ * Copyright (C) 1994  Alistair Moffat
+ *
+ * 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.
+ *
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *	Arithmetic encoding. Taken largely from Witten, Neal, Cleary,
+ *		CACM, 1987, p520.
+ *	Includes bitfiddling routines.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "arithcode.h"
+
+
+FILE *arith_in, *arith_out;
+
+/*
+   $log$
+ */
+
+static char *RCSID = "$Id$";
+
+#undef BECAREFUL
+#define INTEGRATED
+
+
+codevalue S_low = 0, S_high = 0, S_value = 0;
+long S_bitstofollow = 0;
+int S_buffer = 0, S_bitstogo = 0;
+
+long cmpbytes = 0, rawbytes = 0;
+
+#ifdef INTEGRATED
+long CountOfBitsOut;
+#endif
+
+
+/*==================================*/
+
+#define BITPLUSFOLLOW(b)		\
+{	OUTPUTBIT((b));			\
+	while (bitstofollow)		\
+	{	OUTPUTBIT(!(b));	\
+		bitstofollow -= 1;	\
+	}				\
+}
+
+#ifdef INTEGRATED
+#define OUTPUTBIT(b)			\
+{	buffer >>= 1;			\
+	if (b) buffer |= 0x80;	 	\
+	bitstogo -= 1;			\
+	if (bitstogo==0)		\
+	{	putc(buffer, arith_out);	\
+		bitstogo = 8;		\
+		cmpbytes += 1;		\
+	}				\
+	CountOfBitsOut++;		\
+}
+#else
+#define OUTPUTBIT(b)			\
+{	buffer >>= 1;			\
+	if (b) buffer |= 0x80;	 	\
+	bitstogo -= 1;			\
+	if (bitstogo==0)		\
+	{	putc(buffer, arith_out);	\
+		bitstogo = 8;		\
+		cmpbytes += 1;		\
+	}				\
+}
+#endif
+
+#define ADDNEXTINPUTBIT(v)		\
+{	if (bitstogo==0)		\
+	{	buffer = getc(arith_in);	\
+		bitstogo = 8;		\
+	}				\
+	v = (v<<1)+(buffer&1);		\
+	buffer >>= 1;			\
+	bitstogo -=1;			\
+}
+
+/*==================================*/
+
+void
+arithmetic_encode (lbnd, hbnd, totl)
+     int lbnd, hbnd, totl;
+{
+  register codevalue low, high;
+
+#ifdef BECAREFUL
+  if (!(0 <= lbnd && lbnd < hbnd && hbnd <= totl && totl < maxfrequency))
+    {
+      fprintf (stderr, "(corrupt file) coding error: %d %d %d\n", lbnd, hbnd, totl);
+      abort ();
+    }
+#endif
+
+  {
+    register codevalue range;
+    range = S_high - S_low + 1;
+    high = S_low + range * hbnd / totl - 1;
+    low = S_low + range * lbnd / totl;
+  }
+
+  {
+    register codevalue H;
+    register long bitstofollow;
+    register int buffer, bitstogo;
+
+    bitstofollow = S_bitstofollow;
+    buffer = S_buffer;
+    bitstogo = S_bitstogo;
+    H = half;
+
+    for (;;)
+      {
+	if (high < H)
+	  {
+	    BITPLUSFOLLOW (0);
+	  }
+	else if (low >= H)
+	  {
+	    BITPLUSFOLLOW (1);
+	    low -= H;
+	    high -= H;
+	  }
+	else if (low >= firstqtr && high < thirdqtr)
+	  {
+	    bitstofollow++;
+	    low -= firstqtr;
+	    high -= firstqtr;
+	  }
+	else
+	  break;
+	low += low;
+	high += high;
+	high++;
+      }
+    S_bitstofollow = bitstofollow;
+    S_buffer = buffer;
+    S_bitstogo = bitstogo;
+    S_low = low;
+    S_high = high;
+  }
+}
+
+/*==================================*/
+
+/* Made into a macro 
+
+   codevalue
+   arithmetic_decode_target(totl)
+   register int totl;
+   {    return (((S_value-S_low+1)*totl-1) / (S_high -S_low+1));
+   } 
+ */
+
+/*==================================*/
+
+void
+arithmetic_decode (lbnd, hbnd, totl)
+     int lbnd, hbnd, totl;
+{
+  register codevalue low, high;
+
+#ifdef BECAREFUL
+  if (!(0 <= lbnd && lbnd < hbnd && hbnd <= totl && totl < maxfrequency))
+    {
+      fprintf (stderr, "(corrupt file) coding error: %d %d %d\n", lbnd, hbnd, totl);
+      abort ();
+    }
+#endif
+
+  {
+    register codevalue range;
+    range = S_high - S_low + 1;
+    high = S_low + range * hbnd / totl - 1;
+    low = S_low + range * lbnd / totl;
+  }
+
+  {
+    register codevalue value, H;
+    register int buffer, bitstogo;
+
+    buffer = S_buffer;
+    bitstogo = S_bitstogo;
+    H = half;
+    value = S_value;
+
+    for (;;)
+      {
+	if (high < H)
+	  {			/* nothing */
+	  }
+	else if (low >= H)
+	  {
+	    value -= H;
+	    low -= H;
+	    high -= H;
+	  }
+	else if (low >= firstqtr && high < thirdqtr)
+	  {
+	    value -= firstqtr;
+	    low -= firstqtr;
+	    high -= firstqtr;
+	  }
+	else
+	  break;
+	low += low;
+	high += high;
+	high += 1;
+	ADDNEXTINPUTBIT (value);
+      }
+    S_buffer = buffer;
+    S_bitstogo = bitstogo;
+    S_low = low;
+    S_high = high;
+    S_value = value;
+  }
+}
+
+/*==================================*/
+
+
+static void
+startoutputingbits ()
+{
+  S_buffer = 0;
+  S_bitstogo = 8;
+}
+
+static void
+startinputingbits ()
+{
+  S_buffer = 0;
+  S_bitstogo = 0;
+}
+
+static void
+doneoutputingbits ()
+{				/* write another byte if necessary */
+  if (S_bitstogo < 8)
+    {
+      putc (S_buffer >> S_bitstogo, arith_out);
+      cmpbytes += 1;
+    }
+}
+
+/*==================================*/
+
+static void
+startencoding ()
+{
+  S_low = 0;
+  S_high = topvalue;
+  S_bitstofollow = 0;
+}
+
+static void
+startdecoding ()
+{
+  register int i;
+  register int buffer, bitstogo;
+  S_low = 0;
+  S_high = topvalue;
+  S_value = 0;
+  bitstogo = S_bitstogo;
+  buffer = S_buffer;
+  for (i = 0; i < codevaluebits; i++)
+    ADDNEXTINPUTBIT (S_value);
+  S_bitstogo = bitstogo;
+  S_buffer = buffer;
+}
+
+static void
+doneencoding ()
+{
+  register long bitstofollow;
+  register int buffer, bitstogo;
+  bitstofollow = S_bitstofollow;
+  buffer = S_buffer;
+  bitstogo = S_bitstogo;
+  bitstofollow += 1;
+  if (S_low < firstqtr)
+    {
+      BITPLUSFOLLOW (0);
+    }
+  else
+    {
+      BITPLUSFOLLOW (1);
+    }
+  S_bitstofollow = bitstofollow;
+  S_buffer = buffer;
+  S_bitstogo = bitstogo;
+}
+
+
+
+void 
+EncodeGammaDist (int Off)
+/* Encode Off with probability distribution derived from the Elias gamma distribution. */
+{
+  int Len, i;
+
+  Off++;
+  for (Len = 31; Len >= 0 && !(Off & (1 << Len)); Len--);
+
+  for (i = Len; i >= 0; i--)
+    arithmetic_encode (0, 1, 2);
+  arithmetic_encode (1, 2, 2);
+
+  for (i = Len - 1; i >= 0; i--)
+    if (Off & (1 << i))
+      arithmetic_encode (1, 2, 2);
+    else
+      arithmetic_encode (0, 1, 2);
+}
+
+
+
+int 
+DecodeGammaDist ()
+/* Decode next Off using probability distribution derived from the Elias gamma distribution. Inverse of EncodeGammaDist. */
+{
+  int i = 1, Len = 0, bit;
+
+  do
+    {
+      bit = arithmetic_decode_target (2) < 1 ? 0 : 1;
+      if (bit)
+	arithmetic_decode (1, 2, 2);
+      else
+	{
+	  arithmetic_decode (0, 1, 2);
+	  Len++;
+	}
+    }
+  while (!bit);
+
+  Len--;
+  while (Len-- > 0)
+    {
+      bit = arithmetic_decode_target (2) < 1 ? 0 : 1;
+      if (bit)
+	arithmetic_decode (1, 2, 2);
+      else
+	arithmetic_decode (0, 1, 2);
+      i = (i << 1) | bit;
+    }
+  return (i - 1);
+}
+
+
+
+
+
+void 
+EncodeGammaSigned (int snum, int *pos, int *neg)
+{
+  if (snum >= 0)
+    arithmetic_encode (0, *pos, *pos + (*neg)), (*pos)++;
+  else
+    arithmetic_encode (*pos, *pos + (*neg), *pos + (*neg)), (*neg)++;
+  if (*pos + (*neg) >= maxfrequency)
+    {
+      *pos = (*pos + 1) / 2;
+      *neg = (*neg + 1) / 2;
+    }
+  EncodeGammaDist (abs (snum));
+}
+
+
+int 
+DecodeGammaSigned (int *pos, int *neg)
+{
+  int signedpos = 1;
+  if (arithmetic_decode_target (*pos + (*neg)) < *pos)
+    arithmetic_decode (0, *pos, *pos + (*neg)), (*pos)++;
+  else
+    arithmetic_decode (*pos, *pos + (*neg), *pos + (*neg)), (*neg)++, signedpos = 0;
+
+  if (*pos + (*neg) >= maxfrequency)
+    {
+      *pos = (*pos + 1) / 2;
+      *neg = (*neg + 1) / 2;
+    }
+
+  if (signedpos)
+    return DecodeGammaDist ();
+  else
+    return (-DecodeGammaDist ());
+}
+
+
+void 
+InitArithEncoding (void)
+{
+  S_low = 0, S_high = 0, S_value = 0;
+  S_bitstofollow = 0;
+  S_buffer = 0, S_bitstogo = 0;
+  cmpbytes = 0, rawbytes = 0;
+
+  startoutputingbits ();
+  startencoding ();
+}
+
+void 
+InitArithDecoding (void)
+{
+  S_low = 0, S_high = 0, S_value = 0;
+  S_bitstofollow = 0;
+  S_buffer = 0, S_bitstogo = 0;
+  cmpbytes = 0, rawbytes = 0;
+
+  startinputingbits ();
+  startdecoding ();
+}
+
+void 
+CloseDownArithEncoding (void)
+{
+  doneencoding ();
+  doneoutputingbits ();
+}
+
+void 
+CloseDownArithDecoding (void)
+{
+}
+
+
+
+
+
+/* encode that famous number, 42 uses 12 bits */
+void 
+EncodeChecksum ()
+{
+  EncodeGammaDist (42);
+}
+
+void 
+DecodeChecksum (char str[])
+{
+  if (DecodeGammaDist () != 42)
+    {
+      fprintf (stderr, "%s: checksum error, file corrupt.\n", str);
+      exit (1);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/arithcode.h	(revision 21083)
@@ -0,0 +1,78 @@
+/**************************************************************************
+ *
+ * arithcode.h -- Arithmetic coding
+ * Copyright (C) 1994  Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef _arithcode_h
+#define _arithcode_h
+
+extern FILE *arith_in, *arith_out;
+
+#define codevaluebits 16
+#if (codevaluebits<16)
+typedef unsigned short codevalue;
+#else
+typedef unsigned long codevalue;
+#endif
+
+#define topvalue ((codevalue)((1<<codevaluebits)-1))
+#define maxfrequency ((topvalue+1)/4 + 1)
+
+#define firstqtr (topvalue/4+1)
+#define half     (2*firstqtr)
+#define thirdqtr (3*firstqtr)
+
+#define	escape_event	U->totalcnt-U->notfound, U->totalcnt, U->totalcnt
+
+void arithmetic_encode ();
+codevalue arithmetic_decode_target ();
+
+#define	arithmetic_decode_target(totl)	\
+	(  ((S_value-S_low+1)*(totl)-1) / (S_high-S_low+1)  )
+
+void arithmetic_decode ();
+
+
+extern codevalue S_low, S_high, S_value;
+extern long S_bitstofollow;
+extern int S_buffer, S_bitstogo;
+
+extern long cmpbytes, rawbytes;
+
+extern long CountOfBitsOut;
+
+void EncodeGammaDist (int Off);
+int DecodeGammaDist ();
+
+void EncodeGammaSigned (int snum, int *pos, int *neg);
+int DecodeGammaSigned (int *pos, int *neg);
+
+
+void InitArithEncoding (void);
+void InitArithDecoding (void);
+
+void CloseDownArithEncoding (void);
+void CloseDownArithDecoding (void);
+
+void EncodeChecksum ();
+void DecodeChecksum (char str[]);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/basictypes.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/basictypes.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/basictypes.h	(revision 21083)
@@ -0,0 +1,34 @@
+/**************************************************************************
+ *
+ * basictypes.h -- base data types
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ * This file contains information relating to the base data types
+ *
+ **************************************************************************/
+
+#ifndef __basictypes_h
+#define __basictypes_h
+
+typedef unsigned long Pixel;
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.c	(revision 21083)
@@ -0,0 +1,747 @@
+/**************************************************************************
+ *
+ * bilevel.c -- Compress a bilevel bitmap
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ *  
+ *  
+ *  This is the code used to compress a bitmap.  The template is given in
+ *  the following format. 
+ *   '.'  = pixel not used
+ *   'p'  = pixel used in 1st order context (the superset)
+ *   '2'  = pixel used in 2nd order context (the subset)
+ *   ';'  = marker used to denote the end of a row in the template
+ *   '*'  = the current context pixel.
+ *  for instance, the common 22/10 template would be shown as:
+ *     ".ppppp.;"
+ *     "pp222pp;"
+ *     "p22222p;"
+ *     "p22*...;"
+ * 
+ **************************************************************************/
+
+
+#include "sysfuncs.h"
+
+#include "bilevel.h"
+#include "extractor.h"
+#include "pbmtools.h"
+#include "marklist.h"
+#include "arithcode.h"
+#include "utils.h"
+
+
+
+#define INITVALUE 2
+#define INCREMENT 4
+
+#define MAX_T_W 32
+
+/* note memory usage is 2*TEMPLATESIZE*sizeof(prob), which is currently 4.9 Mb */
+#define TEMPLATESIZE 612317
+
+
+#define HASH(x) ((x)%TEMPLATESIZE)
+
+
+typedef struct
+  {
+    unsigned short s, n;
+  }
+prob;				/* set and notset */
+typedef struct
+  {
+    short int x, y;
+  }
+coordinate;
+
+coordinate MM[MAX_T_W][MAX_T_W];	/* the actual (x,y) positions */
+unsigned int MMcount[MAX_T_W];	/* number of bits in this row of the template */
+unsigned int MMmask[MAX_T_W];	/* the "current" mask value */
+unsigned int MMbits[MAX_T_W];	/* the bitmask to mask out higher bits */
+unsigned int MMrows;		/* total number of rows */
+unsigned int MM2level[MAX_T_W];	/* bitmask to calculate the 2nd level mask */
+int twolevel, curr_row, surr;
+
+prob *P = NULL;			/* probability array, up to N bits */
+prob *P2 = NULL;
+
+void 
+bl_clearmodel ()
+{
+  int i;
+
+  P = (prob *) malloc (TEMPLATESIZE * sizeof (prob));
+  if (!P)
+    error_msg ("bl_clearmodel()", "not enough memory.", "");
+
+  P2 = (prob *) malloc (TEMPLATESIZE * sizeof (prob));
+  if (!P2)
+    error_msg ("bl_clearmodel()", "not enough memory.", "");
+
+  for (i = 0; i < TEMPLATESIZE; i++)
+    {
+      P[i].s = P[i].n = INITVALUE;
+      P2[i].s = P2[i].n = INITVALUE;
+    }
+}
+
+
+void 
+bl_freemodel ()
+{
+  free (P);
+  free (P2);
+}
+
+
+
+
+#define update_counts(p, pixel)                        \
+    pixel ? (p->s+=INCREMENT) : (p->n+=INCREMENT);     \
+                                                       \
+    if(p->s+p->n >= (unsigned)(maxfrequency)) {        \
+       p->s=(p->s+1)/(unsigned)2;                      \
+       p->n=(p->n+1)/(unsigned)2;                      \
+    }
+
+
+
+
+/* mask is the bigger one, mask2l is smaller one */
+static void 
+bl_encode_in_context (unsigned long mask, unsigned long mask2l, unsigned long pixel)
+{
+  register int twol, t;
+  prob *p = &P[mask];
+  prob *p2 = &P2[mask2l];
+
+  twol = twolevel && (p->s + p->n < (unsigned) (2 * INITVALUE + 5 * INCREMENT));
+
+  t = twol ? (p2->s + p2->n) : (p->s + p->n);
+
+  if (twol == 0)
+    {
+      if (pixel)
+	arithmetic_encode (0, p->s, t);
+      else
+	arithmetic_encode (p->s, t, t);
+      update_counts (p, pixel);
+    }
+  else
+    {
+      if (pixel)
+	arithmetic_encode (0, p2->s, t);
+      else
+	arithmetic_encode (p2->s, t, t);
+      update_counts (p2, pixel);
+      update_counts (p, pixel);
+    }
+}
+
+
+static void 
+bl_decode_in_context (unsigned long mask, unsigned long mask2l, unsigned long *val)
+{
+  register int twol, pixel, t;
+  prob *p = &P[mask];
+  prob *p2 = &P2[mask2l];
+
+
+  if (twolevel && (p->s + p->n < (unsigned) (2 * INITVALUE + 5 * INCREMENT)))
+    {
+      pixel = arithmetic_decode_target (p2->s + p2->n) < p2->s, twol = 1;
+    }
+  else
+    {
+      pixel = arithmetic_decode_target (p->s + p->n) < p->s, twol = 0;
+    }
+
+  t = twol ? (p2->s + p2->n) : (p->s + p->n);
+
+  if (twol == 0)
+    {
+      if (pixel)
+	arithmetic_decode (0, p->s, t);
+      else
+	arithmetic_decode (p->s, t, t);
+      update_counts (p, pixel);
+    }
+  else
+    {
+      if (pixel)
+	arithmetic_decode (0, p2->s, t);
+      else
+	arithmetic_decode (p2->s, t, t);
+      update_counts (p2, pixel);
+      update_counts (p, pixel);
+    }
+
+  *val = pixel;
+}
+
+static void 
+bl_string_to_array (char inputstr[], char parsestr[], int *w, int *h)
+{
+  int r, c;
+  int i, j, lastc, p, l;
+  int xc, yc;
+  int foundstatus;
+
+  surr = twolevel = 0;
+  for (i = 0; i < MAX_T_W; i++)
+    MMcount[i] = MM2level[i] = 0;
+  MMrows = 0;
+
+  for (i = 0; i < (int) strlen (inputstr); i++)
+    {
+      p = inputstr[i];
+      if ((p != '.') && (p != '2') && (p != '*') && (p != 'p') && (p != ';'))
+	{
+	  fprintf (stderr, "Template string can only contain [.p2*;], not \"%c\".\n", inputstr[i]);
+	  exit (1);
+	}
+    }
+
+  /* get the width and height, test rectangularity... */
+  parsestr[l = 0] = 0;
+  for (c = 0, r = 0, lastc = -1, p = 0; p < (int) strlen (inputstr); p++)
+    {
+      if ((inputstr[p] == ';'))
+	{
+	  r++;
+	  if (lastc != -1)
+	    {			/* this is the 2nd row at least */
+	      if (lastc != c)
+		{
+		  fprintf (stderr, "The rows have to be the same width. "
+			   "Row %d has width %d (previous row has width %d)\n", r, c, lastc);
+		  exit (1);
+		}
+	    }
+	  lastc = c;
+	  c = 0;
+	}
+      else
+	{
+	  c++;
+	  parsestr[l] = inputstr[p];
+	  parsestr[++l] = 0;
+	}
+    }
+
+  if (c != 0)
+    lastc = c;
+  *w = lastc;
+  *h = r;
+  if ((*w) <= 0)
+    {
+      fprintf (stderr, "Must have at least one column!\n");
+      exit (1);
+    }
+  if ((*h) <= 0)
+    {
+      fprintf (stderr, "Must have at least one row! Terminate each row with a ';'\n");
+      exit (1);
+    }
+  if ((*w > MAX_T_W) || (*h > MAX_T_W))
+    {
+      fprintf (stderr, "template size bigger than internal threshold of %d\n", MAX_T_W);
+      exit (1);
+    }
+
+  /* get the (x,y) position of the current (*) pixel */
+  for (xc = -1, yc = 0, i = 0; i < *w; i++)
+    for (j = 0; j < *h; j++)
+      if (parsestr[j * (*w) + i] == '*')
+	{
+	  if (xc >= 0)
+	    {
+	      fprintf (stderr, "There can only be ONE current ('*') pixel.\n");
+	      exit (1);
+	    }
+	  xc = i;
+	  yc = j;
+	  curr_row = j + 1;
+	}
+  if (xc < 0)
+    error_msg ("bl_string_to_array", "Error in mask, no current ('*') pixel.", "");
+  /* found the position (xc,yc) */
+
+
+  /* convert parsestr[] into a MM[][] structure */
+  for (j = 0; j < *h; j++)
+    {
+      foundstatus = 0;
+      for (i = 0; i < *w; i++)
+	{
+	  p = j * (*w) + i;
+	  if ((parsestr[p] == 'p') || (parsestr[p] == '2'))
+	    {
+	      if (!foundstatus)
+		foundstatus = 1;
+	      MM2level[j] = MM2level[j] * 2 | (parsestr[p] == '2');
+	      if (parsestr[p] == '2')
+		twolevel = 1;
+
+	      MM[j][MMcount[j]].x = i - xc;
+	      MM[j][MMcount[j]++].y = j - yc;
+	      if (((i - xc) >= 0) && ((j - yc) >= 0))
+		surr = 1;
+	    }
+	  else
+	    {
+	      if (foundstatus == 1)
+		foundstatus = 2;
+	    }
+
+	}
+      if (foundstatus)
+	MMrows++;
+      MMbits[j] = (1 << MMcount[j]) - 1;
+    }
+
+  /* reverse matrix, so [][0] is the closest to the right */
+  {
+    coordinate temp;
+    for (i = 0; i < MMrows; i++)
+      for (j = 0; j < MMcount[i] / (unsigned) 2; j++)
+	{
+	  temp = MM[i][MMcount[i] - 1 - j];
+	  MM[i][MMcount[i] - 1 - j] = MM[i][j];
+	  MM[i][j] = temp;
+	}
+  }
+}
+
+
+
+
+
+
+
+
+void 
+bl_writetemplate (char inputstr[])
+{
+  register int i, j;
+  int w, h;
+  char ind[255];
+  char *str;
+
+  str = (char *) malloc (strlen (inputstr) * sizeof (char) + 2);
+
+  bl_string_to_array (inputstr, str, &w, &h);
+
+  EncodeGammaDist (surr);
+  EncodeGammaDist (w);
+  EncodeGammaDist (h);
+  ind['.'] = 0;
+  ind['p'] = 1;
+  ind['2'] = 2;
+  ind['*'] = 3;
+  for (j = 0; j < h; j++)
+    for (i = 0; i < w; i++)
+      EncodeGammaDist (ind[(int) str[j * w + i]]);
+
+  free (str);
+}
+
+
+void 
+bl_readtemplate ()
+{
+  register int i, j;
+  int w, h, p;
+  char ind[4];
+  char *inputstr, *str;
+
+  surr = DecodeGammaDist (surr);
+  if (surr)
+    {
+      fprintf (stderr, "It's fine compressing an image using a 'surrounding' template, but I can't "
+	       "decompress it!\n");
+      exit (1);
+    }
+  w = DecodeGammaDist ();
+  h = DecodeGammaDist ();
+
+  inputstr = (char *) malloc ((w + 2) * h * sizeof (char) + 2);
+  ind[0] = '.';
+  ind[1] = 'p';
+  ind[2] = '2';
+  ind[3] = '*';
+  for (p = 0, j = 0; j < h; j++)
+    {
+      for (i = 0; i < w; i++)
+	{
+	  inputstr[p++] = ind[DecodeGammaDist ()];
+	}
+      inputstr[p++] = ';';
+      inputstr[p] = 0;
+    }
+
+  str = (char *) malloc (strlen (inputstr) * sizeof (char) + 2);
+  bl_string_to_array (inputstr, str, &w, &h);
+}
+
+
+
+
+
+/* Currently if there are more than 32 bits, the topmost 32 will be discarded, if the 
+   topbits are to be used in compression, define _MORETHAN32 */
+#undef _MORETHAN32
+
+void 
+bl_compress_mark (marktype d)
+{
+  register int r, c;
+  register int i, j;
+  register unsigned long mask, mask2level;
+  char *array[MAX_T_W];
+
+
+  for (i = 0; i < MAX_T_W; i++)
+    {
+      array[i] = (char *) calloc ((size_t) d.w + 2 * MAX_T_W + 1, (size_t) sizeof (char));
+      array[i] = array[i] + MAX_T_W;
+    }
+
+  EncodeGammaDist (d.w);
+  EncodeGammaDist (d.h);
+
+  for (r = 0; r < min (curr_row, d.h); r++)
+    for (c = 0; c < d.w; c++)
+      array[r % MAX_T_W][c] = pbm_getpixel (d.bitmap, c, r);
+
+  for (r = 0; r < d.h; r++)
+    {
+      if (V)
+	if (r && (r % 200 == 0))
+	  fprintf (stderr, ".");
+
+      if (r + curr_row < d.h)
+	for (c = 0; c < d.w; c++)
+	  array[(r + curr_row) % MAX_T_W][c] = pbm_getpixel (d.bitmap, c, r + curr_row);
+      else
+	for (c = 0; c < d.w; c++)
+	  array[(r + curr_row) % MAX_T_W][c] = 0;
+
+      for (c = 0; c < d.w; c++)
+	{
+	  for (mask = 0, mask2level = 0, i = 0; i < MMrows; i++)
+	    {
+	      if (c != 0)
+		{
+		  MMmask[i] = (MMmask[i] * 2);
+		  MMmask[i] |= array[(r + MM[i][0].y + MAX_T_W) % MAX_T_W][c + MM[i][0].x];
+		}
+	      else
+		{
+		  for (MMmask[i] = 0, j = MMcount[i] - 1; j >= 0; j--)
+		    MMmask[i] = 2 * MMmask[i] | array[(r + MM[i][j].y + MAX_T_W) % MAX_T_W][c + MM[i][j].x];
+		}
+	      MMmask[i] &= MMbits[i];
+#ifdef _MORETHAN32
+	      mask = ((mask * 8191) << MMcount[i]) | MMmask[i];
+	      mask2level = ((mask2level * 499) << MMcount[i]) | (MMmask[i] & MM2level[i]);
+#else
+	      mask = (mask << MMcount[i]) | MMmask[i];
+	      mask2level = (mask2level << MMcount[i]) | (MMmask[i] & MM2level[i]);
+#endif
+	    }
+
+	  mask = HASH (mask);
+	  mask2level = HASH (mask2level);
+
+	  bl_encode_in_context (mask, mask2level, pbm_getpixel (d.bitmap, c, r));
+	}
+    }
+  for (i = 0; i < MAX_T_W; i++)
+    free (array[i] - MAX_T_W);
+}
+
+
+
+void 
+bl_decompress_mark (marktype * d)
+{
+  register int r, c;
+  register int i, j;
+  unsigned long pix;
+  register unsigned long mask, mask2level;
+  char *array[MAX_T_W];
+
+
+  d->w = DecodeGammaDist ();
+  d->h = DecodeGammaDist ();
+
+  d->bitmap = pbm_allocarray (d->w, d->h);
+  for (i = 0; i < MAX_T_W; i++)
+    {
+      array[i] = (char *) calloc ((size_t) d->w + 2 * MAX_T_W + 1, (size_t) sizeof (char));
+      array[i] = array[i] + MAX_T_W;
+    }
+
+  for (r = 0; r < d->h; r++)
+    {
+      if (V)
+	if (r && (r % 200 == 0))
+	  fprintf (stderr, ".");
+      for (c = 0; c < d->w; c++)
+	array[r % MAX_T_W][c] = pbm_getpixel (d->bitmap, c, r);
+      for (c = 0; c < d->w; c++)
+	{
+	  for (mask = 0, mask2level = 0, i = 0; i < MMrows; i++)
+	    {
+	      if (c != 0)
+		{
+		  MMmask[i] = (MMmask[i] * 2);
+		  MMmask[i] |= array[(r + MM[i][0].y + MAX_T_W) % MAX_T_W][c + MM[i][0].x];
+		}
+	      else
+		{
+		  for (MMmask[i] = 0, j = MMcount[i] - 1; j >= 0; j--)	/* get all pixels */
+		    MMmask[i] = 2 * MMmask[i] | array[(r + MM[i][j].y + MAX_T_W) % MAX_T_W][c + MM[i][j].x];
+		}
+	      MMmask[i] &= MMbits[i];
+
+#ifdef _MORETHAN32
+	      mask = ((mask * 8191) << MMcount[i]) | MMmask[i];
+	      mask2level = ((mask2level * 499) << MMcount[i]) | (MMmask[i] & MM2level[i]);
+#else
+	      mask = (mask << MMcount[i]) | MMmask[i];
+	      mask2level = (mask2level << MMcount[i]) | (MMmask[i] & MM2level[i]);
+#endif
+	    }
+
+	  mask = HASH (mask);
+	  mask2level = HASH (mask2level);
+
+	  bl_decode_in_context (mask, mask2level, &pix);
+	  if (pix)
+	    {
+	      pbm_putpixel (d->bitmap, c, r, pix);
+	      array[r % MAX_T_W][c] = pix;
+	    }
+	}
+    }
+  for (i = 0; i < MAX_T_W; i++)
+    free (array[i] - MAX_T_W);
+}
+
+
+
+void 
+bl_compress (marktype d, char inputstr[])
+{
+  bl_clearmodel ();
+  bl_writetemplate (inputstr);
+  bl_compress_mark (d);
+  bl_freemodel ();
+}
+
+
+void 
+bl_decompress (marktype * d)
+{
+  bl_clearmodel ();
+  bl_readtemplate ();
+  bl_decompress_mark (d);
+  bl_freemodel ();
+}
+
+
+
+
+
+
+/* 
+   The bitmap in d2, can be examined clairvoyantly.  The ordering of the
+   params is therefore non-clairvoyant, and clairvoyant in that order.
+
+ */
+/*
+   coordinate M1[6]={        { 0,-2},
+   {-1,-1},{ 0,-1}, {1,-1},
+   {-2,0},  {-1, 0}};
+   };
+   coordinate M2[13]={       { 0,-2},
+   {-1,-1}, { 0,-1},   {1, -1},
+   {-2,0}, {-1, 0}, { 0, 0},   { 1, 0},  {2,0},
+   {-1, 1}, { 0, 1},   { 1, 1},
+   { 0, 2}
+ */
+
+coordinate M1[6] =
+{
+  {0, -2},
+  {-2, 0},
+  {1, -1},
+  {-1, -1},
+  {0, -1},
+  {-1, 0}};
+coordinate M2[13] =
+{
+  {0, -2},
+  {1, -1},
+  {-2, 0},
+  {2, 0},
+  {-1, 1},
+  {1, 1},
+  {0, 2},
+  {-1, -1},
+  {0, -1},
+  {1, 0},
+  {-1, 0},
+  {0, 1},
+  {0, 0}
+};
+#define M1S 6
+#define M1S_2level 3
+#define M2S 13
+#define M2S_2level 6
+
+
+void 
+bl_clair_compress (marktype d1, marktype d2)
+{
+  register int r, c;
+  register int i, j, n;
+  register unsigned long mask, mask2level = 0;
+  int cols, rows;
+  int gap;
+  Pixel **b1, **b2;
+
+
+  bl_clearmodel ();
+  twolevel = 1;
+
+  b1 = d1.bitmap;
+  b2 = d2.bitmap;
+  cols = d1.w;
+  rows = d1.h;
+
+  gap = max (50, rows / 10);
+
+  EncodeGammaDist (cols);
+  EncodeGammaDist (rows);
+
+  for (r = 0; r < rows; r++)
+    {
+      if (V)
+	if (!(r % gap))
+	  fprintf (stderr, ".");
+      for (c = 0; c < cols; c++)
+	{
+
+	  mask = 0;
+	  for (n = 0; n < M1S; n++)
+	    {
+	      i = c + M1[n].x;
+	      j = r + M1[n].y;
+	      mask = (2 * mask) | pbm_getpixel_trunc (b1, i, j, cols, rows);
+	    }
+
+	  mask2level = mask & ((1 << M1S_2level) - 1);
+
+	  for (n = 0; n < M2S; n++)
+	    {
+	      i = c + M2[n].x;
+	      j = r + M2[n].y;
+	      mask = (2 * mask) | pbm_getpixel_trunc (b2, i, j, cols, rows);
+	    }
+
+	  mask2level = (mask2level << M2S_2level) | (mask & ((1 << M2S_2level) - 1));
+
+	  bl_encode_in_context (mask, mask2level, pbm_getpixel (b1, c, r));
+
+	}
+    }
+  if (V)
+    fprintf (stderr, "\n");
+  bl_freemodel ();
+}
+
+
+void 
+bl_clair_decompress (marktype d1, marktype d2)
+{
+  register int r, c;
+  register int i, j, n;
+  register unsigned long mask, mask2level = 0;
+  unsigned long p;
+  int cols, rows;
+  int gap;
+  Pixel **b1, **b2;
+
+  bl_clearmodel ();
+  twolevel = 1;
+
+  b1 = d1.bitmap;
+  b2 = d2.bitmap;
+  cols = d1.w;
+  rows = d1.h;
+
+  gap = max (50, rows / 10);
+
+  i = DecodeGammaDist ();
+  j = DecodeGammaDist ();
+  if ((i != cols) || (j != rows))
+    error_msg ("bl_clair_decompress", "incorrect size of residue image", "");
+
+  if (V)
+    fprintf (stderr, "cols=%d rows=%d\n", cols, rows);
+
+  for (r = 0; r < rows; r++)
+    {
+      if (V)
+	if (!(r % gap))
+	  fprintf (stderr, ".");
+      for (c = 0; c < cols; c++)
+	{
+	  mask = 0;
+	  for (n = 0; n < M1S; n++)
+	    {
+	      i = c + M1[n].x;
+	      j = r + M1[n].y;
+	      mask = (2 * mask) | pbm_getpixel_trunc (b1, i, j, cols, rows);
+	    }
+	  mask2level = mask & ((1 << M1S_2level) - 1);
+	  for (n = 0; n < M2S; n++)
+	    {
+	      i = c + M2[n].x;
+	      j = r + M2[n].y;
+	      mask = (2 * mask) | pbm_getpixel_trunc (b2, i, j, cols, rows);
+	    }
+	  mask2level = (mask2level << M2S_2level) | (mask & ((1 << M2S_2level) - 1));
+
+
+	  bl_decode_in_context (mask, mask2level, &p);
+	  if (p)
+	    pbm_putpixel (b1, c, r, 1);
+	}
+    }
+  if (V)
+    fprintf (stderr, "\n");
+  bl_freemodel ();
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/bilevel.h	(revision 21083)
@@ -0,0 +1,47 @@
+/**************************************************************************
+ *
+ * bilevel.h -- Compress a bilevel bitmap
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __BILEVEL_H
+#define __BILEVEL_H
+
+#include "marklist.h"
+
+/* must be called before the start of de/compression */
+void bl_clearmodel ();
+void bl_freemodel ();
+
+/* writes the template to the stream, and sets up the de/compression params */
+void bl_writetemplate (char inputstr[]);
+void bl_readtemplate ();
+
+/* actually performs the de/compression */
+void bl_compress (marktype d, char str[]);
+void bl_compress_mark (marktype d);
+void bl_decompress (marktype * d);
+void bl_decompress_mark (marktype * d);
+
+/* clairvoyantly de/compress d1 with respect to clairvoyantly viewable d2 */
+void bl_clair_compress (marktype d1, marktype d2);
+void bl_clair_decompress (marktype d1, marktype d2);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.c	(revision 21083)
@@ -0,0 +1,257 @@
+/**************************************************************************
+ *
+ * codeoffsets.c -- Functions which code the mark offsets
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "arithcode.h"
+#include "utils.h"
+
+#define TOP_INC 2
+#define MID_INC 1
+#define BOT_INC 1
+
+
+void 
+EncodeOffsets (marklistptr symbol_list, int nsyms)
+{
+  int xpos = 1, xneg = 1, ypos = 1, yneg = 1;
+  marklistptr step;
+  int found;
+  int dox = 0, leveltop = 1, levelmid = 1, levelbot = 1;
+  elemlist xlist, ylist;	/* all previous offsets */
+  int p, f, t, xoff, yoff, symnum, count;
+  elemlist *xcond, *ycond;	/* previous offsets conditioned on symbol num */
+
+  xcond = (elemlist *) malloc (nsyms * sizeof (elemlist));
+  if (!xcond)
+    error_msg ("EncodeOffsets", "Out of memory...", "");
+  ycond = (elemlist *) malloc (nsyms * sizeof (elemlist));
+  if (!ycond)
+    error_msg ("EncodeOffsets", "Out of memory...", "");
+
+  for (t = 0; t < nsyms; t++)
+    {
+      xcond[t].head = ycond[t].head = NULL;
+      xcond[t].tot = ycond[t].tot = 0;
+    }
+  xlist.head = NULL;
+  xlist.tot = 0;
+  ylist.head = NULL;
+  ylist.tot = 0;
+  for (step = symbol_list, count = 0; step; step = step->next, count++)
+    {
+      xoff = step->data.xoffset;
+      yoff = step->data.yoffset;
+      symnum = step->data.symnum;
+      for (dox = 1; dox >= 0; dox--)
+	{
+	  /* encode the offsets, x first then y */
+
+	  if (dox)
+	    found = elem_find (&xcond[symnum], xoff, &p, &f, &t);
+	  else
+	    found = elem_find (&ycond[symnum], yoff, &p, &f, &t);
+
+	  if (found)
+	    {
+	      arithmetic_encode (0, leveltop, leveltop + levelmid + levelbot);
+	      leveltop += TOP_INC;
+	      arithmetic_encode (p, f, t);
+	    }
+	  else
+	    {
+	      if (dox)
+		found = elem_find (&xlist, xoff, &p, &f, &t);
+	      else
+		found = elem_find (&ylist, yoff, &p, &f, &t);
+
+	      if (found)
+		{
+		  arithmetic_encode (leveltop, leveltop + levelmid, leveltop + levelmid + levelbot);
+		  levelmid += MID_INC;
+		  arithmetic_encode (p, f, t);
+		}
+	      else
+		{
+		  arithmetic_encode (leveltop + levelmid, leveltop + levelmid + levelbot, leveltop + levelmid + levelbot);
+		  levelbot += BOT_INC;
+		  if (dox)
+		    EncodeGammaSigned (xoff, &xpos, &xneg);
+		  else
+		    EncodeGammaSigned (yoff, &ypos, &yneg);
+		}
+	    }
+	  if (dox)
+	    {
+	      elem_add (&xlist, xoff);
+	      elem_add (&xcond[symnum], xoff);
+	    }
+	  else
+	    {
+	      elem_add (&ylist, yoff);
+	      elem_add (&ycond[symnum], yoff);
+	    }
+
+	  if (leveltop + levelmid >= maxfrequency)
+	    {
+	      leveltop = (leveltop + 1) / 2;
+	      levelmid = (levelmid + 1) / 2;
+	      levelbot = (levelbot + 1) / 2;
+	    }
+	}
+    }
+  for (t = 0; t < nsyms; t++)
+    {
+      elem_free (&xcond[t]);
+      elem_free (&ycond[t]);
+    }
+  elem_free (&xlist);
+  elem_free (&ylist);
+  if (V)
+    fprintf (stderr, "offset models: top %d, mid %d, bot %d\n", (leveltop - 1) / TOP_INC, (levelmid - 1) / MID_INC, (levelbot - 1) / BOT_INC);
+}
+
+
+
+
+
+void 
+DecodeOffsets (marklistptr symbol_list, int nsyms)
+{
+  int xpos = 1, xneg = 1, ypos = 1, yneg = 1;
+  marklistptr step;
+  int i, target, dox;
+  int leveltop = 1, levelmid = 1, levelbot = 1;
+  elemlist xlist, ylist;
+  int p, f, t, xoff = 0, yoff = 0, symnum, count = 0;
+  elemlist *xcond, *ycond;
+
+  xcond = (elemlist *) malloc (nsyms * sizeof (elemlist));
+  if (!xcond)
+    error_msg ("EncodeOffsets", "Out of memory...", "");
+  ycond = (elemlist *) malloc (nsyms * sizeof (elemlist));
+  if (!ycond)
+    error_msg ("EncodeOffsets", "Out of memory...", "");
+
+  for (i = 0; i < nsyms; i++)
+    {
+      xcond[i].head = ycond[i].head = NULL;
+      xcond[i].tot = ycond[i].tot = 0;
+    }
+
+  xlist.head = NULL;
+  xlist.tot = 0;
+  ylist.head = NULL;
+  ylist.tot = 0;
+
+  for (step = symbol_list, count = 0; step; step = step->next, count++)
+    {
+      symnum = step->data.symnum;
+      for (dox = 1; dox >= 0; dox--)
+	{
+	  /* decode x offset first, then y */
+	  target = arithmetic_decode_target (leveltop + levelmid + levelbot);
+	  if (target < leveltop)
+	    {
+	      arithmetic_decode (0, leveltop, leveltop + levelmid + levelbot);
+	      leveltop += TOP_INC;
+
+	      if (dox)
+		i = arithmetic_decode_target (xcond[symnum].tot);
+	      else
+		i = arithmetic_decode_target (ycond[symnum].tot);
+
+	      if (dox)
+		{
+		  elem_getrange (&xcond[symnum], i, &xoff);
+		  elem_find (&xcond[symnum], xoff, &p, &f, &t);
+		}
+	      else
+		{
+		  elem_getrange (&ycond[symnum], i, &yoff);
+		  elem_find (&ycond[symnum], yoff, &p, &f, &t);
+		}
+	      arithmetic_decode (p, f, t);
+	    }
+	  else if (target < leveltop + levelmid)
+	    {
+	      arithmetic_decode (leveltop, leveltop + levelmid, leveltop + levelmid + levelbot);
+	      levelmid += MID_INC;
+
+	      if (dox)
+		i = arithmetic_decode_target (xlist.tot);
+	      else
+		i = arithmetic_decode_target (ylist.tot);
+
+	      if (dox)
+		{
+		  elem_getrange (&xlist, i, &xoff);
+		  elem_find (&xlist, xoff, &p, &f, &t);
+		}
+	      else
+		{
+		  elem_getrange (&ylist, i, &yoff);
+		  elem_find (&ylist, yoff, &p, &f, &t);
+		}
+	      arithmetic_decode (p, f, t);
+	    }
+	  else
+	    {
+	      arithmetic_decode (leveltop + levelmid, leveltop + levelmid + levelbot, leveltop + levelmid + levelbot);
+	      levelbot += BOT_INC;
+	      if (dox)
+		xoff = DecodeGammaSigned (&xpos, &xneg);
+	      else
+		yoff = DecodeGammaSigned (&ypos, &yneg);
+	    }
+
+	  if (dox)
+	    {
+	      step->data.xoffset = xoff;
+	      elem_add (&xlist, xoff);
+	      elem_add (&xcond[symnum], xoff);
+	    }
+	  else
+	    {
+	      step->data.yoffset = yoff;
+	      elem_add (&ylist, yoff);
+	      elem_add (&ycond[symnum], yoff);
+	    }
+
+	  if (leveltop + levelmid >= maxfrequency)
+	    {
+	      leveltop = (leveltop + 1) / 2;
+	      levelmid = (levelmid + 1) / 2;
+	      levelbot = (levelbot + 1) / 2;
+	    }
+	}
+    }
+  for (t = 0; t < nsyms; t++)
+    {
+      elem_free (&xcond[t]);
+      elem_free (&ycond[t]);
+    }
+  elem_free (&xlist);
+  elem_free (&ylist);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/codeoffsets.h	(revision 21083)
@@ -0,0 +1,32 @@
+/**************************************************************************
+ *
+ * codeoffsets.h -- Functions which code the mark offsets
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __CODEOFFSETS_H
+#define __CODEOFFSETS_H
+
+#include "marklist.h"
+
+void EncodeOffsets (marklistptr MarkList, int num_symbols);
+void DecodeOffsets (marklistptr MarkList, int num_symbols);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.c	(revision 21083)
@@ -0,0 +1,96 @@
+/**************************************************************************
+ *
+ * codesyms.c -- Functions which code the symbol sequence
+ * Copyright (C) 1994  Hugh Emberson
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "arithcode.h"
+#include "marklist.h"
+#include "pbmtools.h"
+#include "utils.h"
+#include "codesyms.h"
+
+int charsetsize = 256;
+
+void 
+EncodeSymbols (marklistptr MarkList, int NSyms)
+{
+  marklistptr step;
+  unsigned short Events[PPM_CHUNK];
+  int j = 0;
+
+  charsetsize = max (NSyms, 256);
+
+  step = MarkList;
+  while (step)
+    {
+      Events[j] = step->data.symnum;
+
+      assert (Events[j] > 0 || Events[j] < (unsigned) NSyms);
+
+      j++;
+
+      if (j == PPM_CHUNK)
+	{
+	  encodestring (Events, PPM_CHUNK);
+	  j = 0;
+	}
+      step = step->next;
+    };
+
+  if (j != 0)
+    encodestring (Events, j);
+
+  encodestring (Events, 0);
+}
+
+
+marklistptr 
+DecodeSymbols (int NSyms)
+{
+  marklistptr MarkList = NULL;
+  unsigned short Events[PPM_CHUNK];
+  int j, n;
+  marktype d;
+
+  charsetsize = max (NSyms, 256);
+
+  do
+    {
+      decodestring (Events, &n);
+
+      for (j = 0; j < n; j++)
+	{
+	  d.symnum = Events[j];
+	  marklist_add (&MarkList, d);
+	}
+    }
+  while (n != 0);
+
+  return MarkList;
+}
+
+void 
+InitPPM (void)
+{
+  kbytes = 896;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/codesyms.h	(revision 21083)
@@ -0,0 +1,44 @@
+/**************************************************************************
+ *
+ * codesyms.h -- Functions which code the symbol sequence
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+#ifndef _CodeSymbols_h_
+#define _CodeSymbols_h_
+
+#include "marklist.h"
+#include "arithcode.h"
+
+#ifndef FIXEDORDER
+#define FIXEDORDER	3
+#endif
+
+#define PPM_CHUNK	1024
+
+extern int kbytes;
+extern void decodestring ();
+extern void encodestring ();
+
+void EncodeSymbols (marklistptr MarkList, int NSyms);
+marklistptr DecodeSymbols (int NSyms);
+
+void InitPPM (void);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/extractor.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/extractor.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/extractor.c	(revision 21083)
@@ -0,0 +1,423 @@
+/**************************************************************************
+ *
+ * extractor.c -- Functions related to extracting marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "extractor.h"
+#include "pbmtools.h"
+#include "marklist.h"
+#include "utils.h"
+
+
+/* 
+   'splitjoined' defines whether the extractor modules tries to break
+   "seemingly" merged/joined marks.
+ */
+int splitjoined = 1;
+
+#define MAX_FILL_STACK_SIZE 10000
+
+/* RunRegionFill uses line conherence to implement a better fill
+   routine.  The stack has currently got 10000 elements, although the
+   biggest I have encountered used a maximum stack size of 1294.  usage:
+   RunRegionFill(bitmap,mark,i,j,xpos,ypos); xpos and ypos are the top
+   left corners of the mark.  */
+
+int maxst = 0, st = 0;
+struct
+  {
+    int x, y;
+  }
+a[MAX_FILL_STACK_SIZE];
+
+#define push(i,j) a[st].x=i;a[st].y=j;st++;if(st>MAX_FILL_STACK_SIZE){error_msg ("extractor/flood_fill","woooo! Fill stack overflow!","");}
+#define pop(i,j) st--;i=a[st].x;j=a[st].y
+
+void 
+RunRegionFill (Pixel ** bitmap, marktype * mark, int i, int j, int xl, int yt, int cols, int rows)
+{
+  int l, r, t, start_up, start_down;
+
+  push (i, j);
+  while (st > 0)
+    {
+      if (st > maxst)
+	maxst = st;
+
+      pop (l, j);
+      r = l;
+
+      while (pbm_getpixel (bitmap, l - 1, j))
+	l--;
+      while (pbm_getpixel (bitmap, r + 1, j))
+	r++;
+      start_up = start_down = 1;
+      for (t = min (r + 1, cols - 1); t >= max (l - 1, 0); t--)
+	{
+	  if ((t >= l) && (t <= r))
+	    {
+	      pbm_putpixel (bitmap, t, j, 0);
+
+	      if (mark)
+		pbm_putpixel (mark->bitmap, t - xl, j - yt, 1);
+	    }
+
+	  if ((j - 1 >= 0) && (pbm_getpixel (bitmap, t, j - 1)))
+	    {
+	      if (start_up)
+		{
+		  push (t, j - 1);
+		  start_up = 0;
+		}
+	    }
+	  else
+	    start_up = 1;
+	  if ((j + 1 < rows) && (pbm_getpixel (bitmap, t, j + 1)))
+	    {
+	      if (start_down)
+		{
+		  push (t, j + 1);
+		  start_down = 0;
+		}
+	    }
+	  else
+	    start_down = 1;
+	}
+    }
+}
+
+
+
+
+/*
+
+   ExtractNextMark starts at (tx,ty) and looks for a set (==1) pixel.
+   The mark is then boundary traced to give an outline {The process is a
+   4-pixel exterior check -- giving 8 way connectivity}, and then
+   RunRegionFill is used to remove the mark and set the pixels in the
+   mark.
+
+   usage: ExtractNextMark(bitmap,&marklist,&startx,&starty,int cols,int rows);
+   Defines:
+   gp - gets a pixel, but returns 0 for outside regions.
+   boundary_{x,y}comp - returns the {x,y} component of the direction.
+   dir 0=right, 1=down, 2=left, 3=up.
+ */
+
+#define gp(i,j) ( (((i)<0)||((j)<0)||((i)>=cols)||((j)>=rows))? 0 : pbm_getpixel(bitmap,(i),(j)))
+
+#define boundary_xcomp(x) (x==0?1:(x==2?-1 : 0))
+#define boundary_ycomp(x) (x==1?1:(x==3?-1 : 0))
+
+int 
+ExtractNextMark (Pixel ** bitmap, marklistptr * marklist, int *tx, int *ty, int cols, int rows)
+{
+  int i, j, xl, xr, yt, yb;
+  register int dir, tempdir;
+  marktype d;
+
+  xl = INT_MAX;
+  xr = (-1);
+  yt = INT_MAX;
+  yb = (-1);
+
+  i = *tx;
+  j = *ty;
+  if ((i < 0) || (j < 0))
+    error_msg ("ExtractNextMark()", "Stupid values for x,y in findnextmark()", "");
+  while (!pbm_getpixel (bitmap, i, j))
+    {
+      i++;
+      if (i >= cols)
+	{
+	  i = 0;
+	  j++;
+	  if (j >= rows)
+	    return 0;
+	}
+    }
+
+  *tx = i;
+  *ty = j;
+  dir = 0;
+  j = j - 1;			/* start above */
+  do
+    {
+      if (i > xr)
+	xr = i - 1;
+      if (i < xl)
+	xl = i + 1;
+      if (j < yt)
+	yt = j + 1;
+      if (j > yb)
+	yb = j - 1;
+      tempdir = (dir + 1) % 4;
+      if (gp (i + boundary_xcomp (tempdir), j + boundary_ycomp (tempdir)) == 0)
+	dir = tempdir;
+      else
+	{
+	  tempdir = dir;
+	  if (gp (i + boundary_xcomp (tempdir), j + boundary_ycomp (tempdir)) == 0)
+	    dir = tempdir;
+	  else
+	    {
+	      tempdir = (dir + 3) % 4;
+	      if (gp (i + boundary_xcomp (tempdir), j + boundary_ycomp (tempdir)) == 0)
+		dir = tempdir;
+	      else
+		dir = (dir + 2) % 4;
+	    }
+	}
+      i += boundary_xcomp (dir);
+      j += boundary_ycomp (dir);
+    }
+  while ((i != (*tx)) || (j != (*ty - 1)));
+
+  d.w = (xr - xl + 1);
+  d.h = (yb - yt + 1);
+  d.xpos = xl;
+  d.ypos = yt;
+  d.bitmap = pbm_allocarray (d.w, d.h);
+
+  RunRegionFill (bitmap, &d, *tx, *ty, xl, yt, cols, rows);
+
+  marktype_calc_features (&d, "?");
+  marklist_add (marklist, d);
+
+  *tx = *tx + 1;
+  return 1;
+}
+
+
+
+
+static void 
+normalise (float *p, int w)
+{
+  int x;
+  float mx;
+
+  mx = p[0];
+  for (x = 0; x < w; x++)
+    if (p[x] > mx)
+      mx = p[x];
+  if (mx != 0)
+    {
+      for (x = 0; x < w; x++)
+	p[x] = p[x] / mx;
+    }
+}
+
+
+
+#define MAXPROFILE 1000
+float profile[MAXPROFILE], p2[MAXPROFILE];
+
+
+static int 
+possibly_joined (marktype * d)
+{
+  float aspect;
+  int i, n, x, y;
+  int leftable, l2;
+
+
+  aspect = d->w / (float) d->h;
+
+  if ((aspect >= 1.1) || (d->w < MAXPROFILE))
+    {
+      /* examine it more closely */
+
+
+      /* set up profile[] with a vertical profile */
+      for (x = 0; x < d->w; x++)
+	{
+	  profile[x] = 0;
+	  for (y = 0; y < d->h; y++)
+	    if (pbm_getpixel (d->bitmap, x, y))
+	      profile[x]++;
+	}
+
+      /* average the profile from (up to) 3 either way */
+      for (x = 0; x < d->w; x++)
+	{
+	  n = 0;
+	  p2[x] = 0;
+	  for (i = x - 3; i <= x + 3; i++)
+	    if ((i >= 0) && (i < d->w))
+	      {
+		n++;
+		p2[x] += profile[x];
+	      }
+	  p2[x] = p2[x] / (float) n;
+	}
+      for (x = 0; x < d->w; x++)
+	profile[x] = p2[x];
+
+      /* normalise profile[] */
+      normalise (profile, d->w);
+
+      /* find a little local minimum, with profile <0.25, make p2[] either 0 or 1 */
+      for (x = 0; x < d->w; x++)
+	p2[x] = 0;
+      for (x = 3; x < d->w - 3; x++)
+	{
+	  if (((profile[x - 2] - profile[x]) > 0.00) &&
+	      ((profile[x + 2] - profile[x]) > 0.00) &&
+	      (profile[x] < .25))
+	    p2[x] = 1;
+	}
+
+      /* travel rightwards, checking aspect ratio, looking at p2 now */
+      leftable = l2 = 0;
+      for (x = 0; x < d->w; x++)
+	if (p2[x] == 1)
+	  {
+	    if ((fabs ((abs (x - leftable) / (float) d->h) - 0.7) > 0.3) &&
+		(fabs ((abs (x - l2) / (float) d->h) - 0.7) > 0.3))
+	      p2[x] = 0;
+	    if (p2[x] == 1)
+	      {
+		leftable = l2;
+		l2 = x;
+	      }
+	  }
+
+      /* travel inwards, checking widths of chars, looking at p2 */
+      /* if a char has an aspect ratio of <= ? kill it */
+      l2 = 0;
+      leftable = d->w - 1;
+      x = 0;
+      y = d->w - 1;
+      while (x <= y)
+	{
+	  if (p2[x])
+	    {
+	      if (abs (x - l2) < max (d->h * 0.6, 5))
+		p2[x] = 0;
+	      if (p2[x])
+		l2 = x;
+	    }
+	  if (p2[y])
+	    {
+	      if (abs (y - leftable) < max (d->h * 0.6, 5))
+		p2[y] = 0;
+	      if (p2[y])
+		leftable = y;
+	    }
+	  x++;
+	  y--;
+	}
+
+
+      for (x = 0; x < d->w; x++)
+	if (p2[x])
+	  return 1;
+    }
+  return 0;
+}
+
+
+static void 
+split_mark (marklistptr * list, marktype * joinedmark)
+{
+  marktype new, old;
+  int x, found = 0, left = 0;
+  int i, j;
+  int oldw, oldh;
+  int overwrite = 1;
+
+  old = marktype_copy (*joinedmark);
+  oldw = joinedmark->w;
+  oldh = joinedmark->h;
+  for (x = 0; x < old.w; x++)
+    if (p2[x])
+      {
+	found = x;
+	break;
+      }
+  do
+    {
+      /* split at (found) position */
+      new.w = found + 1 - left;
+      new.h = old.h;
+      new.xpos = old.xpos + left;
+      new.ypos = old.ypos;
+      new.bitmap = pbm_allocarray (new.w, new.h);
+
+      for (i = 0; i < new.w; i++)
+	for (j = 0; j < new.h; j++)
+	  pbm_putpixel (new.bitmap, i, j, pbm_getpixel (old.bitmap, left + i, j));
+
+      marktype_adj_bound (&new);
+
+      if (overwrite)
+	{
+	  overwrite = 0;
+	  pbm_freearray (&(joinedmark->bitmap), oldh);
+	  *joinedmark = new;
+	}
+      else
+	marklist_add (list, new);
+
+
+      p2[found] = 0;
+      left = found;
+      found = 0;
+      for (x = left; x < old.w; x++)
+	if (p2[x])
+	  {
+	    found = x;
+	    break;
+	  }
+      if (left == old.w - 1)
+	break;			/* if we've got to the right */
+      if (found == 0)
+	found = old.w - 1;
+    }
+  while (found);
+  pbm_freearray (&(old.bitmap), oldh);
+}
+
+
+
+
+
+void 
+ExtractAllMarks (Pixel ** bitmap, marklistptr * list, int cols, int rows)
+{
+  int startx, starty, count;
+  marklistptr step;
+
+  startx = starty = 0;
+  while (ExtractNextMark (bitmap, list, &startx, &starty, cols, rows))
+    ;
+
+  if (splitjoined)
+    for (step = (*list), count = 0; step; step = step->next, count++)
+      if (possibly_joined (&(step->data)))
+	split_mark (list, &(step->data));
+
+  for (step = (*list), count = 0; step; step = step->next, count++)
+    step->data.symnum = count;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/extractor.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/extractor.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/extractor.h	(revision 21083)
@@ -0,0 +1,38 @@
+/**************************************************************************
+ *
+ * extractor.h -- Functions related to extracting marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef _EXTRACTOR_H_
+#define _EXTRACTOR_H_
+
+#include "marklist.h"
+#include "pbmtools.h"
+
+extern int splitjoined;
+
+void RunRegionFill (Pixel ** bitmap, marktype * mark, int i, int j, int xl, int yt, int cols, int rows);
+
+int ExtractNextMark (Pixel ** bitmap, marklistptr * marklist, int *tx, int *ty, int cols, int rows);
+void ExtractAllMarks (Pixel ** bitmap, marklistptr * marklist, int cols, int rows);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/felics.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/felics.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/felics.c	(revision 21083)
@@ -0,0 +1,340 @@
+/**************************************************************************
+ *
+ * felics.c -- The main guts of the felics algorithm
+ * Copyright (C) 1994  Neil Sharman and Kerry Guise
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+
+
+#undef putw
+#define putw(x)	{					\
+	short z;					\
+	byteptr = (unsigned char *)(x);			\
+	for (z = 0; z < sizeof(int); z++)		\
+		(void) putc((int) byteptr[z], fp_out);	\
+}
+#define INTSIZE sizeof(int) * 8
+#define BOOLEAN short
+#define TRUE 1
+#define FALSE 0
+
+#define IN_RANGE 0
+#define OUT_OF_RANGE 1
+#define BELOW_RANGE 0
+#define ABOVE_RANGE 1
+
+
+void 
+encode (unsigned int *line, int width, int height, int maxval, int maxk,
+	FILE * fp_in, FILE * fp_out, int (*get) (FILE *))
+{
+  int x, y;
+  unsigned long P, L, H, N1, N2, delta;
+  unsigned long cumul_param[256][INTSIZE];
+  unsigned max_cumul;
+
+  memset (cumul_param, '0', sizeof (cumul_param));
+
+  if (maxk)
+    max_cumul = maxk;
+  else
+    CEILLOG_2 (maxval, max_cumul);
+
+  ENCODE_START (fp_out)
+
+    for (y = 0; y < height; y++)
+    for (x = 0; x < width; x++)
+      {
+	if (y > 0)
+	  {
+	    if (x > 0)
+	      {			/* ******** */
+		N1 = line[x];	/* ****1*** */
+		N2 = line[x - 1];	/* ***2P*** */
+	      }			/* ******** */
+	    else
+	      {			/* |******* */
+		N1 = line[x];	/* |12***** */
+		N2 = line[x + 1];	/* |P***** */
+	      }			/* |******* */
+	  }
+	else
+	  {
+	    if (x > 1)
+	      {
+		N1 = line[x - 1];	/* -------- */
+		N2 = line[x - 2];	/* **12P*** */
+	      }			/* ******** */
+	    else if (x > 0)
+	      {
+		N1 = line[x - 1];	/* +------- */
+		N2 = N1;	/* |3P***** */
+	      }			/* |******* */
+	    else
+	      {
+		line[x] = get (fp_in);	/* +------- */
+		BINARY_ENCODE (line[x] + 1, maxval + 1);	/* |P****** */
+		continue;	/* |******* */
+	      }
+	  }
+
+
+	H = N1 > N2 ? N1 : N2;
+	L = N1 < N2 ? N1 : N2;
+	delta = H - L;
+
+	line[x] = P = get (fp_in);
+
+	if ((L <= P) && (P <= H))
+	  {
+	    /* IN-RANGE */
+	    unsigned long range, logofrange, thresh, numlong;
+	    int nbits;
+
+	    ENCODE_BIT (IN_RANGE);
+
+	    P -= L;
+
+	    range = delta + 1;
+
+	    if (range > 1)
+	      {
+		/* 2**i <= delta + 1 < 2**(i+1) ; find i ... */
+		CEILLOG_2 (range, logofrange);
+
+		/* number of n-bit values in the range */
+		thresh = (1 << logofrange) - range;
+
+		/* number of n+1-bit values in the range */
+		numlong = range - thresh;
+
+		/* rotate the n-bit codes into the centre */
+		P -= (numlong >> 1);
+		if ((long) P < 0)
+		  P += range;
+
+		if (P < thresh)
+		  nbits = logofrange - 1;
+		else
+		  {
+		    nbits = logofrange;
+		    P += thresh;
+		  }
+		while (--nbits >= 0)
+		  ENCODE_BIT ((P >> nbits) & 1);
+	      }
+	  }
+	else
+	  {
+	    /* OUT_OF_RANGE */
+	    unsigned long diff, parm, i, min;
+
+	    ENCODE_BIT (OUT_OF_RANGE);
+
+	    if (P < L)
+	      {
+		ENCODE_BIT (BELOW_RANGE);
+		diff = L - P - 1;
+	      }
+	    else
+	      {
+		ENCODE_BIT (ABOVE_RANGE);
+		diff = P - H - 1;
+	      }
+
+	    /* Now code 'diff' as a Golomb-Rice code */
+
+	    parm = 0;
+	    min = cumul_param[delta][0];
+	    for (i = 1; i < max_cumul; i++)
+	      if (cumul_param[delta][i] < min)
+		{
+		  min = cumul_param[delta][i];
+		  parm = i;
+		}
+
+	    UNARY_ENCODE ((diff >> parm) + 1);
+	    BINARY_ENCODE ((diff & ((1 << parm) - 1)) + 1, 1 << parm);
+
+	    for (i = 0; i < max_cumul; i++)
+	      cumul_param[delta][i] += (diff >> i) + 1 + i;
+	  }
+
+      }
+
+  ENCODE_DONE
+
+}
+
+
+
+
+
+
+void 
+decode (unsigned int *line, int width, int height, int maxval, int maxk,
+	FILE * fp_in, FILE * fp_out)
+{
+  int x, y;
+  unsigned int P, L, H, N1, N2, delta;
+  unsigned long cumul_param[256][INTSIZE];
+  unsigned max_cumul;
+
+  memset (cumul_param, '0', sizeof (cumul_param));
+
+  if (maxk)
+    max_cumul = maxk;
+  else
+    CEILLOG_2 (maxval, max_cumul);
+
+  DECODE_START (fp_in);
+
+  for (y = 0; y < height; y++)
+    for (x = 0; x < width; x++)
+      {
+	if (y > 0)
+	  {
+	    if (x > 0)
+	      {			/* ******** */
+		N1 = line[x];	/* ****1*** */
+		N2 = line[x - 1];	/* ***2P*** */
+	      }			/* ******** */
+	    else
+	      {			/* |******* */
+		N1 = line[x];	/* |12***** */
+		N2 = line[x + 1];	/* |P***** */
+	      }			/* |******* */
+	  }
+	else
+	  {
+	    if (x > 1)
+	      {
+		N1 = line[x - 1];	/* -------- */
+		N2 = line[x - 2];	/* **12P*** */
+	      }			/* ******** */
+	    else if (x > 0)
+	      {
+		N1 = line[x - 1];	/* +------- */
+		N2 = N1;	/* |3P***** */
+	      }			/* |******* */
+	    else
+	      {
+		BINARY_DECODE (line[x], maxval + 1);
+		line[x]--;
+		if (maxval < 256)
+		  putc (line[x], fp_out);	/* +------- */
+		else		/* |P****** */
+		  fprintf (fp_out, "%u ", line[x]);	/* |******* */
+		continue;
+	      }
+	  }
+
+
+	H = N1 > N2 ? N1 : N2;
+	L = N1 < N2 ? N1 : N2;
+	delta = H - L;
+
+	if (DECODE_BIT == IN_RANGE)
+	  {
+	    unsigned long i, range, logofrange, thresh, numlong;
+	    unsigned xx, l;
+
+	    range = delta + 1;
+
+	    if (range > 1)
+	      {
+		/* 2**i <= delta + 1 < 2**(i+1) ; find i ... */
+		CEILLOG_2 (range, logofrange);
+
+		/* number of n-bit values in the range */
+		thresh = (1 << logofrange) - range;
+		for (P = i = 0; i < logofrange - 1; i++)
+		  DECODE_ADD (P);
+		xx = P;
+		l = logofrange - 1;
+		if (P >= thresh)
+		  {
+		    DECODE_ADD (P);
+		    xx = P;
+		    l++;
+		    P -= thresh;
+		  }
+
+		/* number of n+1-bit values in the range */
+		numlong = range - thresh;
+
+		/* rotate the n-bit codes into the centre */
+		P += (numlong >> 1);
+		if ((long) P >= range)
+		  P -= range;
+
+		P += L;
+	      }
+	    else
+	      P = L;
+	  }
+	else
+	  {
+	    int out_of_range = DECODE_BIT;
+	    unsigned long diff, unary, binary, i, min, parm;
+
+	    /* Now code 'diff' as a Golomb-Rice code */
+
+	    parm = 0;
+	    min = cumul_param[delta][0];
+	    for (i = 1; i < max_cumul; i++)
+	      if (cumul_param[delta][i] < min)
+		{
+		  min = cumul_param[delta][i];
+		  parm = i;
+		}
+
+	    UNARY_DECODE (unary);
+	    diff = (unary - 1) << parm;
+	    BINARY_DECODE (binary, 1 << parm);
+	    diff |= binary - 1;
+
+	    for (i = 0; i < max_cumul; i++)
+	      cumul_param[delta][i] += (diff >> i) + 1 + i;
+
+	    if (out_of_range == BELOW_RANGE)
+	      {
+		P = L - diff - 1;
+	      }
+	    else
+	      {
+		P = diff + H + 1;
+	      }
+	  }
+
+	line[x] = P;
+
+	if (maxval < 256)
+	  (void) putc (P, fp_out);
+	else
+	  fprintf (fp_out, "%u ", P);
+      }
+
+  DECODE_DONE
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/lstevent.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/lstevent.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/lstevent.c	(revision 21083)
@@ -0,0 +1,421 @@
+/**************************************************************************
+ *
+ * lstevent.c -- Routines to implement "events" using MTF lists.
+ * Copyright (C) 1987  Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "arithcode.h"
+#include "model.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:26  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:33:37  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:41:40  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+void
+write_method ()
+{
+  fprintf (stderr, "C");
+}
+
+
+/*===========================================*/
+
+/*
+ * [Rodney Brown - Sep/95]
+ * On IBM RS/6000 AIX version 3.2 the compiler defines NULL as (void *)0
+ * when in ANSI mode. Hence the (event) and (point) casts
+ */
+
+
+#define GETNEWNODE(e,node)		\
+do 					\
+{	node = p32(numnodes) ;		\
+	node->eventnum = (event)e ;	\
+	node->count = increment ;	\
+	node->foll.totalcnt = 0 ;	\
+	node->foll.notfound = 0 ;	\
+	node->foll.list = (point)NULL ;	\
+	numnodes += 1 ;			\
+	nfreenodes -= 1 ;		\
+}					\
+while (false)
+
+/*===========================================*/
+
+#define INSERTNODE(U,node)		\
+do					\
+{	node->next = U->list ;		\
+	U->list = p16(node) ;		\
+	U->totalcnt += increment;	\
+}					\
+while (false)
+
+/*===========================================*/
+
+int
+halvelist (p)
+     register eventnode *p;
+{
+  register int sum = 0;
+  while (p != ENULL)
+    {
+      sum += p->count = (p->count + 1) / 2;
+      p = p32 (p->next);
+    }
+  return (sum);
+}
+
+/*===========================================*/
+
+void
+halveallcounts (U)
+     register eventset *U;
+{
+  U->notfound = (U->notfound + 1) / 2;
+  U->totalcnt = U->notfound;
+  U->totalcnt += halvelist (p32 (U->list));
+}
+
+/*===========================================*/
+
+eventnode *
+encode_event_noex (U, e, success)
+     register eventset *U;
+     event e;
+     boolean *success;
+{
+  register eventnode *pnode, *node;
+  register int lbnd, totl;
+
+  if (U->list == (point)NULL)
+    {
+      *success = false;
+      U->notfound += increment;
+      U->totalcnt += increment;
+      GETNEWNODE (e, node);
+      INSERTNODE (U, node);
+      return (node);
+    }
+
+  lbnd = 0;
+  pnode = ENULL;
+  node = p32 (U->list);
+  while (node != ENULL)
+    {
+      if (e == node->eventnum)
+	break;
+      lbnd += node->count;
+      pnode = node;
+      node = p32 (node->next);
+    }
+
+  totl = U->totalcnt;
+
+  if (node == ENULL)
+    {				/* event not found in list */
+      if ((totl > U->notfound))
+	arithmetic_encode (totl - U->notfound, totl, totl);
+      U->notfound += increment;
+      U->totalcnt += increment;
+      *success = false;
+      GETNEWNODE (e, node);
+      INSERTNODE (U, node);
+    }
+  else
+    {				/* found in the list, so go ahead and code */
+      arithmetic_encode (lbnd, lbnd + node->count, totl);
+      node->count += increment;
+      U->totalcnt += increment;
+      *success = true;
+      /* and move to front */
+      if (pnode != ENULL)
+	{
+	  pnode->next = node->next;
+	  node->next = U->list;
+	  U->list = p16 (node);
+	}
+    }
+  if (U->totalcnt > maxtotalcnt)
+    halveallcounts (U);
+  return (node);
+}
+
+/*===========================================*/
+
+eventnode *
+decode_event_noex (U, success, e)
+     register eventset *U;
+     boolean *success;
+     event *e;
+{
+  register eventnode *node, *pnode;
+  register int tget, lbnd, totl;
+
+  if (U->list == (point)NULL)
+    {
+      *success = false;
+      U->totalcnt += increment;
+      U->notfound += increment;
+      GETNEWNODE (NULL, node);
+      INSERTNODE (U, node);
+      return (node);
+    }
+  totl = U->totalcnt;
+  tget = arithmetic_decode_target (totl);
+
+  if (tget >= totl - U->notfound)
+    {
+      if (totl > U->notfound)
+	arithmetic_decode (totl - U->notfound, totl, totl);
+      U->totalcnt += increment;
+      U->notfound += increment;
+      *success = false;
+      GETNEWNODE (NULL, node);
+      INSERTNODE (U, node);
+    }
+  else
+    {
+      pnode = ENULL;
+      node = p32 (U->list);
+      lbnd = 0;
+      for (;;)
+	{
+	  if (tget < (lbnd += node->count))
+	    break;
+	  pnode = node;
+	  node = p32 (node->next);
+	}
+
+      arithmetic_decode (lbnd - node->count, lbnd, totl);
+      node->count += increment;
+      U->totalcnt += increment;
+      *e = node->eventnum;
+      *success = true;
+      /* and move to front */
+      if (pnode != ENULL)
+	{
+	  pnode->next = node->next;
+	  node->next = U->list;
+	  U->list = p16 (node);
+	}
+    }
+  if (U->totalcnt > maxtotalcnt)
+    halveallcounts (U);
+  return (node);
+}
+
+/*===========================================*/
+
+eventnode *
+encode_event (U, e, success)
+     register eventset *U;
+     event e;
+     boolean *success;
+{
+  register eventnode *pnode, *node, *p;
+  register int lbnd, totl;
+
+  if (U->list == (point)NULL)
+    {
+      *success = false;
+      U->notfound += increment;
+      U->totalcnt += increment;
+      GETNEWNODE (e, node);
+      INSERTNODE (U, node);
+      return (node);
+    }
+
+  lbnd = 0;
+  pnode = ENULL;
+  node = p32 (U->list);
+  while (node != ENULL)
+    {
+      if (!excluded[node->eventnum])
+	{
+	  if (e == node->eventnum)
+	    break;
+	  lbnd += node->count;
+	}
+      pnode = node;
+      node = p32 (node->next);
+    }
+
+  if (node == ENULL)
+    {				/* event not found in list, and whole list has been scanned */
+      totl = lbnd + U->notfound;
+      if ((totl > U->notfound))
+	arithmetic_encode (totl - U->notfound, totl, totl);
+      U->notfound += increment;
+      U->totalcnt += increment;
+      *success = false;
+      GETNEWNODE (e, node);
+      INSERTNODE (U, node);
+    }
+  else
+    {				/* found in the list, so go ahead and code */
+      /* first, total up rest of list */
+      totl = lbnd + node->count;
+      p = p32 (node->next);
+      while (p != ENULL)
+	{
+	  if (!excluded[p->eventnum])
+	    totl += p->count;
+	  p = p32 (p->next);
+	}
+      totl += U->notfound;
+
+      arithmetic_encode (lbnd, lbnd + node->count, totl);
+      node->count += increment;
+      U->totalcnt += increment;
+      *success = true;
+      /* and move to front */
+      if (pnode != ENULL)
+	{
+	  pnode->next = node->next;
+	  node->next = U->list;
+	  U->list = p16 (node);
+	}
+    }
+  if (U->totalcnt > maxtotalcnt)
+    halveallcounts (U);
+  return (node);
+}
+
+/*===========================================*/
+
+eventnode *
+decode_event (U, success, e)
+     register eventset *U;
+     boolean *success;
+     event *e;
+{
+  register eventnode *node, *pnode;
+  register int tget, lbnd, totl;
+
+  if (U->list == (point)NULL)
+    {
+      *success = false;
+      U->totalcnt += increment;
+      U->notfound += increment;
+      GETNEWNODE (NULL, node);
+      INSERTNODE (U, node);
+      return (node);
+    }
+  totl = 0;
+  node = p32 (U->list);
+  while (node != ENULL)
+    {
+      if (!excluded[node->eventnum])
+	totl += node->count;
+      node = p32 (node->next);
+    }
+  totl += U->notfound;
+  tget = arithmetic_decode_target (totl);
+
+  if (tget >= totl - U->notfound)
+    {
+      if (totl > U->notfound)
+	arithmetic_decode (totl - U->notfound, totl, totl);
+      U->totalcnt += increment;
+      U->notfound += increment;
+      *success = false;
+      GETNEWNODE (NULL, node);
+      INSERTNODE (U, node);
+    }
+  else
+    {
+      pnode = ENULL;
+      node = p32 (U->list);
+      lbnd = 0;
+      for (;;)
+	{
+	  if (!excluded[node->eventnum])
+	    {
+	      lbnd += node->count;
+	      if (tget < lbnd)
+		break;
+	    }
+	  pnode = node;
+	  node = p32 (node->next);
+	}
+
+      arithmetic_decode (lbnd - node->count, lbnd, totl);
+      node->count += increment;
+      U->totalcnt += increment;
+      *e = node->eventnum;
+      *success = true;
+      /* and move to front */
+      if (pnode != ENULL)
+	{
+	  pnode->next = node->next;
+	  node->next = U->list;
+	  U->list = p16 (node);
+	}
+    }
+  if (U->totalcnt > maxtotalcnt)
+    halveallcounts (U);
+  return (node);
+}
+
+/*===========================================*/
+
+eventnode *
+newnode (e)
+     event e;
+{
+  register eventnode *node;
+  GETNEWNODE (e, node);
+  node->next = (point)NULL;
+  node->prev = (point)NULL;
+  return (node);
+}
+
+/*===========================================*/
+
+/* not required in this version */
+
+#if 0
+eventnode *
+addevent (U, e)
+     register eventset *U;
+     event e;
+{
+  register eventnode *node;
+  /* get an event node */
+  GETNEWNODE (e, node);
+  INSERTNODE (U, node);
+  if (U->totalcnt > maxtotalcnt)
+    halveallcounts (U);
+  return (node);
+}
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/marklist.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/marklist.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/marklist.c	(revision 21083)
@@ -0,0 +1,827 @@
+/**************************************************************************
+ *
+ * marklist.c -- Functions managing the list of marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "utils.h"
+
+void 
+marktype_dump (marktype d)
+{
+  fprintf (stderr, "symnum: %d\n", d.symnum);
+  fprintf (stderr, "xpos: %d, ypos: %d\n", d.xpos, d.ypos);
+  fprintf (stderr, "w: %d, h: %d\n", d.w, d.h);
+  fprintf (stderr, "xcen: %d, ycen: %d\n", d.xcen, d.ycen);
+  write_library_mark (stderr, d);
+}
+
+
+/* copy, including make a copy of the bitmap */
+marktype 
+marktype_copy (marktype d)
+{
+  marktype d2;
+  int i, j;
+
+  d2 = d;
+  d2.bitmap = pbm_allocarray (d2.w, d2.h);
+  for (i = 0; i < d2.w; i++)
+    for (j = 0; j < d2.h; j++)
+      pbm_putpixel (d2.bitmap, i, j, pbm_getpixel (d.bitmap, i, j));
+  return d2;
+}
+
+
+float 
+marktype_density (marktype d)
+{
+  return d.set / (float) (d.w * d.h);
+}
+
+
+
+void 
+marktype_calc_centroid (marktype * b)
+{
+  int r, c;
+  int count = 0;
+  int xtot = 0, ytot = 0;
+
+  for (r = 0; r < b->h; r++)
+    for (c = 0; c < b->w; c++)
+      if (pbm_getpixel (b->bitmap, c, r))
+	{
+	  count++;
+	  xtot += c;
+	  ytot += r;
+	}
+  if (count)
+    {
+      xtot /= count;
+      ytot /= count;
+    }
+  b->xcen = xtot;
+  b->ycen = ytot;
+}
+
+
+
+static void 
+marktype_area (marktype * d)
+{
+  int x, y;
+  int set = 0;
+
+  for (y = 0; y < d->h; y++)
+    for (x = 0; x < d->w; x++)
+      if (pbm_getpixel (d->bitmap, x, y))
+	set++;
+  d->set = set;
+}
+
+
+static void 
+marktype_h_runs (marktype * d)
+{
+  int x, y;
+  int inrun = 0, num = 0;
+  int foundblack = 0;
+
+  for (y = 0; y < d->h; y++)
+    {
+      inrun = 0;
+      foundblack = 0;
+      for (x = 0; x < d->w; x++)
+	{
+	  if ((!foundblack) && (pbm_getpixel (d->bitmap, x, y)))
+	    foundblack = 1;
+	  if ((foundblack) && (pbm_getpixel (d->bitmap, x, y) == 0))
+	    inrun = 1;
+	  if ((inrun) && (pbm_getpixel (d->bitmap, x, y)))
+	    {
+	      num++;
+	      inrun = 0;
+	      foundblack = 0;
+	    }
+	}
+    }
+  d->h_runs = num;
+}
+
+static void 
+marktype_v_runs (marktype * d)
+{
+  int x, y;
+  int inrun = 0, num = 0;
+  int foundblack = 0;
+
+
+  for (x = 0; x < d->w; x++)
+    {
+      inrun = 0;
+      foundblack = 0;
+      for (y = 0; y < d->h; y++)
+	{
+	  if ((!foundblack) && (pbm_getpixel (d->bitmap, x, y)))
+	    foundblack = 1;
+	  if ((foundblack) && (pbm_getpixel (d->bitmap, x, y) == 0))
+	    inrun = 1;
+	  if ((inrun) && (pbm_getpixel (d->bitmap, x, y)))
+	    {
+	      num++;
+	      inrun = 0;
+	      foundblack = 0;
+	    }
+	}
+    }
+  d->v_runs = num;
+}
+
+
+/* assume we already have the centroid! */
+static void 
+marktype_prog_cent (marktype * d)
+{
+  int x, y;
+  int xtot = 0, ytot = 0;
+  int num = 0;
+
+  xtot = ytot = num = 0;
+  for (x = 0; x < d->xcen; x++)
+    for (y = 0; y < d->ycen; y++)
+      if (pbm_getpixel (d->bitmap, x, y))
+	{
+	  xtot += x;
+	  ytot += y;
+	  num++;
+	}
+  if (num == 0)
+    {
+      d->xcen1 = -1;
+      d->ycen1 = -1;
+    }
+  else
+    {
+      d->xcen1 = xtot / num;
+      d->ycen1 = ytot / num;
+    }
+
+
+  xtot = ytot = num = 0;
+  for (x = d->xcen; x < d->w; x++)
+    for (y = 0; y < d->ycen; y++)
+      if (pbm_getpixel (d->bitmap, x, y))
+	{
+	  xtot += x;
+	  ytot += y;
+	  num++;
+	}
+  if (num == 0)
+    {
+      d->xcen2 = -1;
+      d->ycen2 = -1;
+    }
+  else
+    {
+      d->xcen2 = xtot / num;
+      d->ycen2 = ytot / num;
+    }
+
+
+
+  xtot = ytot = num = 0;
+  for (x = 0; x < d->xcen; x++)
+    for (y = d->ycen; y < d->h; y++)
+      if (pbm_getpixel (d->bitmap, x, y))
+	{
+	  xtot += x;
+	  ytot += y;
+	  num++;
+	}
+
+
+  if (num == 0)
+    {
+      d->xcen3 = -1;
+      d->ycen3 = -1;
+    }
+  else
+    {
+      d->xcen3 = xtot / num;
+      d->ycen3 = ytot / num;
+    }
+
+  xtot = ytot = num = 0;
+  for (x = d->xcen; x < d->w; x++)
+    for (y = d->ycen; y < d->h; y++)
+      if (pbm_getpixel (d->bitmap, x, y))
+	{
+	  xtot += x;
+	  ytot += y;
+	  num++;
+	}
+  if (num == 0)
+    {
+      d->xcen4 = -1;
+      d->ycen4 = -1;
+    }
+  else
+    {
+      d->xcen4 = xtot / num;
+      d->ycen4 = ytot / num;
+    }
+}
+
+
+
+/* call this to get all features */
+void 
+marktype_calc_features (marktype * d, char str[])
+{
+  if (strlen (str))
+    strcpy (d->name, str);
+  marktype_calc_centroid (d);
+  marktype_area (d);
+  marktype_prog_cent (d);
+  marktype_h_runs (d);
+  marktype_v_runs (d);
+}
+
+
+
+
+
+void 
+marktype_adj_bound (marktype * m)
+{
+  int x, y, w, h;
+  int xpos, ypos;
+  int top = 0, left = 0, right = 0, bot = 0;
+  marktype temp;
+
+  w = m->w;
+  h = m->h;
+  xpos = m->xpos;
+  ypos = m->ypos;
+
+  for (y = 0; y < h; y++)
+    for (x = 0; x < w; x++)
+      if (pbm_getpixel (m->bitmap, x, y))
+	{
+	  top = y;
+	  x = w;
+	  y = h;
+	}
+
+  for (y = h - 1; y >= 0; y--)
+    for (x = 0; x < w; x++)
+      if (pbm_getpixel (m->bitmap, x, y))
+	{
+	  bot = y;
+	  x = w;
+	  y = -1;
+	}
+
+  for (x = 0; x < w; x++)
+    for (y = 0; y < h; y++)
+      if (pbm_getpixel (m->bitmap, x, y))
+	{
+	  left = x;
+	  x = w;
+	  y = h;
+	}
+
+  for (x = w - 1; x >= 0; x--)
+    for (y = 0; y < h; y++)
+      if (pbm_getpixel (m->bitmap, x, y))
+	{
+	  right = x;
+	  x = -1;
+	  y = h;
+	}
+
+  temp.w = right - left + 1;
+  temp.h = bot - top + 1;
+  temp.xpos = xpos + left;
+  temp.ypos = ypos + top;
+  temp.bitmap = pbm_allocarray (temp.w, temp.h);
+
+  for (x = 0; x < temp.w; x++)
+    for (y = 0; y < temp.h; y++)
+      pbm_putpixel (temp.bitmap, x, y, pbm_getpixel (m->bitmap, x + left, y + top));
+
+  pbm_freearray (&(m->bitmap), h);
+
+  marktype_calc_features (&temp, "?");
+  *m = temp;
+}
+
+
+
+
+
+
+/* returns a newly created mark reprenting the average of the marklist */
+void 
+marklist_average (marklistptr list, marktype * avgmark)
+{
+  int w = 0, h = 0;
+  int t = INT_MAX, b = 0, l = INT_MAX, r = 0, matched = 0;
+  marktype d, temp;
+  marklistptr step;
+  static int a[100][100];
+  int x, y;
+
+  if (list == NULL)
+    error_msg ("marklist_average", "Can't average 'nothing'!", "");
+
+  for (step = list; step; step = step->next)
+    {
+      matched++;
+      temp = step->data;
+      w = max (w, temp.w);
+      h = max (h, temp.h);
+      r = max (r, temp.xcen);
+      l = min (l, temp.xcen);
+      b = max (b, temp.ycen);
+      t = min (t, temp.ycen);
+    }
+  w = w + (r - l);
+  h = h + (b - t);
+  if ((w >= 100) || (h >= 100))
+    matched = 0;
+
+  if (matched > 1)
+    {
+      int x_off, y_off;
+      for (x = 0; x < w; x++)
+	for (y = 0; y < h; y++)
+	  a[x][y] = 0;
+
+      for (step = list; step; step = step->next)
+	{
+	  x_off = r - step->data.xcen;
+	  y_off = b - step->data.ycen;
+	  for (x = 0; x < step->data.w; x++)
+	    for (y = 0; y < step->data.h; y++)
+	      if (pbm_getpixel (step->data.bitmap, x, y))
+		a[x + x_off][y + y_off]++;
+	}
+
+      d.w = w;
+      d.h = h;
+      d.bitmap = pbm_allocarray (w, h);
+      for (x = 0; x < w; x++)
+	for (y = 0; y < h; y++)
+	  if (a[x][y] > max (1, (matched / 2)))		/* > gives better CR than >= */
+	    pbm_putpixel (d.bitmap, x, y, 1);
+      marktype_adj_bound (&d);
+      strcpy (d.name, "?");
+      marktype_calc_centroid (&d);
+    }
+  else
+    d = marktype_copy (list->data);
+
+  *avgmark = d;
+}
+
+
+
+
+
+
+void 
+marklist_setnull (marklistptr * list)
+{
+  *list = NULL;
+}
+
+
+marklistptr 
+marklist_add (marklistptr * list, marktype m)
+{
+  marklistptr p;
+
+  if (*list == NULL)
+    {
+      *list = (marklistptr) malloc (sizeof (marklisttype));
+      if ((*list) == NULL)
+	error_msg ("marklist_add", "OUT of Memory in marklist_add", "");
+      p = *list;
+    }
+  else
+    {
+      p = *list;
+      while (p->next != NULL)
+	p = p->next;
+      p->next = (marklistptr) malloc (sizeof (marklisttype));
+      if (p->next == NULL)
+	error_msg ("marklist_add", "OUT of Memory in marklist_add", "");
+      p = p->next;
+    }
+  p->data = m;
+  p->next = NULL;
+  return p;
+
+}
+
+
+
+marklistptr 
+marklist_addcopy (marklistptr * list, marktype m)
+{
+  marktype d;
+
+  d = marktype_copy (m);
+  return marklist_add (list, d);
+}
+
+
+
+int 
+marklist_length (marklistptr list)
+{
+  int count = 0;
+
+  while (list)
+    {
+      count++;
+      list = list->next;
+    }
+  return count;
+}
+
+
+
+
+
+void 
+marklist_dump (marklistptr list)
+{
+  int count = 0;
+  marktype d;
+
+  while (list)
+    {
+      d = list->data;
+      marktype_dump (d);
+
+      count++;
+      list = list->next;
+    }
+}
+
+
+
+
+/* pos starts from 0, to up marklist_length-1 */
+marklistptr 
+marklist_getat (marklistptr list, int pos, marktype * d)
+{
+  int count = 0;
+
+  while (list)
+    {
+      if (count == pos)
+	{
+	  *d = list->data;
+	  return list;
+	}
+      count++;
+      list = list->next;
+    }
+  fprintf (stderr, "marklist_getat(): access off ends of list: pos %d\n", pos);
+  return NULL;
+}
+
+
+
+void 
+marklist_free (marklistptr * list)
+{
+  marklistptr n;
+
+  while ((*list) != NULL)
+    {
+      n = (*list)->next;
+      pbm_freearray (&((*list)->data.bitmap), (*list)->data.h);
+      free ((*list));
+      (*list) = n;
+    }
+}
+
+
+
+int 
+marklist_removeat (marklistptr * list, int pos)
+{
+  marklistptr c, n, p = NULL;
+  int count = 0;
+
+  if ((pos == 0) && (*list))
+    {				/* if removing the 1st element */
+      *list = (*list)->next;
+      return 1;
+    }
+  else
+    {
+      c = *list;
+      while (c)
+	{
+	  if (count == pos)
+	    {			/* two cases, no previous, >=1 previous */
+	      if (p == NULL)	/* no previous */
+		{
+		  n = c->next;
+		  pbm_freearray (&c->data.bitmap, c->data.h);
+		  free (c);
+		  c = n;
+		  return 1;
+		}
+	      else
+		/* >=1 previous */
+		{
+		  n = c->next;
+		  pbm_freearray (&c->data.bitmap, c->data.h);
+		  free (c);
+		  p->next = n;
+		  return 1;
+		}
+	    }
+	  count++;
+	  p = c;
+	  c = c->next;
+	}
+    }
+  fprintf (stderr, "marklist_removeat(): access off ends of list: pos %d\n", pos);
+  return 0;			/* nothing was removed */
+}
+
+
+
+marklistptr 
+marklist_next (marklistptr list)
+{
+  return list->next;
+}
+
+
+/* only writes out ascii form */
+void 
+write_library_mark (FILE * fp, marktype d)
+{
+  int r, c, rows, cols;
+  int xtot = d.xcen, ytot = d.ycen;
+
+  rows = d.h;
+  cols = d.w;
+
+  fprintf (fp, "Mark: %d\n", d.symnum);
+  fprintf (fp, "Char: %s\n", d.name);
+  fprintf (fp, "Cols: %d Rows: %d\n", d.w, d.h);
+  for (r = 0; r < d.h; r++)
+    {
+      for (c = 0; c < d.w; c++)
+	if ((r == ytot) && (c == xtot))
+	  putc (pbm_getpixel (d.bitmap, c, r) ? 'C' : '!', fp);
+	else
+	  putc (pbm_getpixel (d.bitmap, c, r) ? 'X' : '.', fp);
+      putc ('\n', fp);
+    }
+}
+
+
+
+/* only reads in ascii library */
+int 
+read_library_mark (FILE * fp, marktype * d)
+{
+  int r, c, rows, cols, numread, ch1 = 'C';
+  char str1[100], str2[100];
+
+  numread = fscanf (fp, "%s %d\n", str1, &(d->symnum));
+  if ((numread != 2) || (strcmp (str1, "Mark:") != 0))
+    return 0;
+  fscanf (fp, "%s %s\n", str1, (d->name));
+  fscanf (fp, "%s %d %s %d\n", str1, &(d->w), str2, &(d->h));
+  cols = d->w;
+  rows = d->h;
+  d->bitmap = pbm_allocarray (cols, rows);
+  for (r = 0; r < rows; r++)
+    {
+      for (c = 0; c < cols; c++)
+	{
+	  ch1 = getc (fp);
+	  if ((ch1 == 'X') || (ch1 == 'C'))
+	    pbm_putpixel (d->bitmap, c, r, 1);
+	  else
+	    pbm_putpixel (d->bitmap, c, r, 0);
+	}
+      ch1 = getc (fp);
+    }
+  marktype_calc_features (d, "?");
+
+  return 1;
+}
+
+
+
+
+
+
+
+int 
+read_library (char libraryname[], marklistptr * library)
+{
+  int err, count;
+  FILE *lib;
+  marktype d;
+  marklistptr step;
+
+  lib = fopen (libraryname, "rb");
+  if (lib == NULL)
+    error_msg ("read_library()", "Trouble opening library file", "");
+  *library = NULL;
+  count = 0;
+  while (!isEOF (lib))
+    {
+      err = read_library_mark (lib, &d);
+      if (!err)
+	error_msg ("read_library()", "unknown format of the library file.", "");
+      d.symnum = count;
+      count++;
+      if ((*library) == NULL)
+	step = marklist_add (library, d);
+      else
+	step = marklist_add (&step, d);
+    }
+  count = marklist_length (*library);
+  fclose (lib);
+
+  return count;
+}
+
+
+
+
+
+
+/**********************************************************************
+
+'elem' routines for coding offsets
+
+the elem datatype contains the 3 params for arithmetic coding,
+stored as a no-duplicates order linked list.
+
+************************************************************************/
+
+
+
+
+void 
+elem_add (elemlist * list, int num)
+{
+  elemptr temp, nn;
+  int p, f;
+
+  list->tot++;
+  if (list->head == NULL)
+    {
+      list->head = (elemptr) malloc (sizeof (elem));
+      if ((list->head) == NULL)
+	error_msg ("", "ekk", "");
+      temp = list->head;
+      temp->next = NULL;
+      temp->num = num;
+      temp->pos = 0;
+      temp->freq = 1;
+    }
+  else
+    {				/* add to list */
+      temp = list->head;
+      p = 0;
+      f = 0;
+      while ((num > temp->num) && (temp->next != NULL))
+	{
+	  p = temp->pos;
+	  f = temp->freq;
+	  temp = temp->next;
+	}
+
+      if (temp->num == num)
+	temp->freq++;
+      else
+	{			/* insert it */
+	  nn = (elemptr) malloc (sizeof (elem));
+	  if (nn == NULL)
+	    error_msg ("", "ekk", "");
+
+	  if (num < temp->num)
+	    {
+	      nn->num = temp->num;
+	      nn->pos = temp->pos;
+	      nn->freq = temp->freq;
+	      nn->next = temp->next;
+	      temp->num = num;
+	      temp->pos = p + f;
+	      temp->freq = 1;
+	      temp->next = nn;
+	    }
+	  else
+	    {
+	      nn->next = temp->next;
+	      temp->next = nn;
+	      nn->pos = temp->pos + temp->freq;
+	      nn->num = num;
+	      nn->freq = 1;
+	      temp = nn;
+	    }
+	}
+    }
+  /* update frequencies */
+  temp = temp->next;
+  if (temp)
+    do
+      {
+	temp->pos++;
+	temp = temp->next;
+      }
+    while (temp);
+}
+
+
+void 
+elem_free (elemlist * list)
+{
+  elemptr n, p;
+
+  p = list->head;
+  while (p != NULL)
+    {
+      n = p->next;
+      free (p);
+      p = n;
+    }
+  list->head = NULL;
+}
+
+int 
+elem_find (elemlist * list, int n, int *p, int *f, int *t)
+{
+  elemptr temp;
+
+  temp = list->head;
+  while (temp)
+    {
+      if (temp->num == n)
+	{
+	  *p = temp->pos;
+	  *f = temp->freq + temp->pos;
+	  *t = list->tot;
+	  return 1;
+	}
+      temp = temp->next;
+    }
+  return 0;
+}
+
+
+int 
+elem_getrange (elemlist * list, int range, int *num)
+{
+  elemptr temp;
+
+  temp = list->head;
+  while (temp)
+    {
+      if ((range >= temp->pos) && (range < (temp->pos + temp->freq)))
+	{
+	  *num = temp->num;
+	  return 1;
+	}
+      temp = temp->next;
+    }
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/marklist.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/marklist.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/marklist.h	(revision 21083)
@@ -0,0 +1,114 @@
+/**************************************************************************
+ *
+ * marklist.h -- Functions managing the list of marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __MARKLIST_H
+#define __MARKLIST_H
+
+#include "sysfuncs.h"
+#include "basictypes.h"
+
+typedef struct
+  {
+    int symnum;
+    int xpos, ypos;
+    int w, h;
+    int xcen, ycen;
+    int xoffset, yoffset;
+    char name[10];
+    Pixel **bitmap;
+
+    int xcen1, ycen1;
+    int xcen2, ycen2;
+    int xcen3, ycen3;
+    int xcen4, ycen4;
+    int set;
+    int h_runs;
+    int v_runs;
+  }
+marktype;
+
+
+typedef struct marklisttype *marklistptr;
+typedef struct marklisttype
+  {
+    marktype data;
+    marklistptr next;
+  }
+marklisttype;
+
+
+void marktype_dump (marktype d);
+marktype marktype_copy (marktype d);
+
+float marktype_density (marktype d);
+void marktype_calc_centroid (marktype * b);
+void marktype_calc_features (marktype * d, char str[]);
+void marktype_adj_bound (marktype * m);
+
+void marklist_average (marklistptr list, marktype * avgmark);
+void marklist_setnull (marklistptr * list);
+marklistptr marklist_add (marklistptr * list, marktype m);
+marklistptr marklist_addcopy (marklistptr * list, marktype m);
+int marklist_length (marklistptr list);
+void marklist_dump (marklistptr list);
+marklistptr marklist_getat (marklistptr list, int pos, marktype * d);
+void marklist_free (marklistptr * list);
+int marklist_removeat (marklistptr * list, int pos);
+marklistptr marklist_next (marklistptr list);
+
+void write_library_mark (FILE * fp, marktype d);
+int read_library_mark (FILE * fp, marktype * d);
+int read_library (char libraryname[], marklistptr * library);
+
+
+
+
+
+
+/* 
+   The 'elem' structure is an ordered linked list, with fields corresponding
+   directly to the arithmetic coding routines.  
+ */
+typedef struct elem *elemptr;
+typedef struct elem
+  {
+    int num;
+    int pos;
+    int freq;
+    elemptr next;
+  }
+elem;
+
+typedef struct elemlist
+  {
+    elemptr head;
+    int tot;
+  }
+elemlist;
+
+void elem_add (elemlist * list, int num);
+void elem_free (elemlist * list);
+int elem_find (elemlist * list, int n, int *p, int *f, int *t);
+int elem_getrange (elemlist * list, int range, int *num);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/match.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/match.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/match.c	(revision 21083)
@@ -0,0 +1,417 @@
+/**************************************************************************
+ *
+ * match.c -- Functions related to matching marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "utils.h"
+
+
+/* error mask goes from 0..8, single pixel errors are worth nothing */
+int 
+WXOR_match (marktype b1, marktype b2)
+{
+  int r, c, i, j;
+  int minr, minc;
+  int maxr, maxc;
+  int offx, offy;
+  int p1, p2;
+  int count = 0;
+  marktype d;
+
+  offx = b1.xcen - b2.xcen;
+  offy = b1.ycen - b2.ycen;
+
+  minc = min (0, offx);
+  minr = min (0, offy);
+
+  maxc = max (b1.w, b2.w + offx);
+  maxr = max (b1.h, b2.h + offy);
+
+  d.w = maxc - minc + 1;
+  d.h = maxr - minr + 1;
+  d.bitmap = pbm_allocarray (d.w, d.h);
+
+
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      {
+	if ((r >= 0) && (c >= 0) && (r < b1.h) && (c < b1.w))
+	  p1 = pbm_getpixel (b1.bitmap, c, r);
+	else
+	  p1 = 0;		/* 0 = back ground colour */
+	if ((r - offy >= 0) && (c - offx >= 0) && (r - offy < b2.h) && (c - offx < b2.w))
+	  p2 = pbm_getpixel (b2.bitmap, c - offx, r - offy);
+	else
+	  p2 = 0;		/* background colour */
+	pbm_putpixel (d.bitmap, c - minc, r - minr, p1 != p2);
+      }
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      if (pbm_getpixel (d.bitmap, c - minc, r - minr))
+	for (i = -1; i <= 1; i++)
+	  for (j = -1; j <= 1; j++)
+	    if ((r + j >= 0) && (c + i >= 0) && (r + j < d.h) && (c + i < d.w) && ((i != 0) || (j != 0)) && (pbm_getpixel (d.bitmap, c + i - minc, r + j - minr)))
+	      count++;
+  pbm_freearray (&d.bitmap, d.h);
+  return count;
+}
+
+
+
+/* define an array for most matches, if it is a massive mark, then WXOR is called */
+#define S_SIZE 500
+
+static unsigned char scratch[S_SIZE][S_SIZE], sc2[S_SIZE][S_SIZE];
+
+
+
+
+/* Weighted AND-NOT */
+
+int 
+WAN_match (marktype b1, marktype b2)
+{
+  int r, c, i, j;
+  int minr, minc;
+  int maxr, maxc;
+  int offx, offy;
+  int p1, p2;
+  int count = 0;
+
+  offx = b1.xcen - b2.xcen;
+  offy = b1.ycen - b2.ycen;
+
+  minc = min (0, offx);
+  minr = min (0, offy);
+
+  maxc = max (b1.w, b2.w + offx);
+  maxr = max (b1.h, b2.h + offy);
+
+  if (((maxc - minc) >= S_SIZE) || ((maxr - minr) >= S_SIZE))
+    return WXOR_match (b1, b2);
+
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      {
+	scratch[r - minr][c - minc] = sc2[r - minr][c - minc] = 0;
+	if ((r >= 0) && (c >= 0) && (r < b1.h) && (c < b1.w))
+	  p1 = pbm_getpixel (b1.bitmap, c, r);
+	else
+	  p1 = 0;		/* 0 == background colour */
+	if ((r - offy >= 0) && (c - offx >= 0) && (r - offy < b2.h) && (c - offx < b2.w))
+	  p2 = pbm_getpixel (b2.bitmap, c - offx, r - offy);
+	else
+	  p2 = 0;
+
+	if ((p1 == 0) && (p2 == 1))	/* p1 not set, p2 = set */
+	  scratch[r - minr][c - minc] = 1;
+	if ((p1 == 1) && (p2 == 0))	/* p1 set, p2 not set */
+	  sc2[r - minr][c - minc] = 1;
+      }
+
+  count = 0;
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      if (scratch[r - minr][c - minc])
+	for (i = -1; i <= 1; i++)
+	  for (j = -1; j <= 1; j++)
+	    if ((r + j >= minr) && (c + i >= minc) && (r + j < maxr) && (c + i < maxc) && ((i != 0) || (j != 0)) && scratch[r - minr + j][c - minc + i])
+	      count++;
+
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      if (sc2[r - minr][c - minc])
+	for (i = -1; i <= 1; i++)
+	  for (j = -1; j <= 1; j++)
+	    if ((r + j >= minr) && (c + i >= minc) && (r + j < maxr) && (c + i < maxc) && ((i != 0) || (j != 0)) && sc2[r - minr + j][c - minc + i])
+	      count++;
+
+  return count;
+}
+
+/* oc 8 must be in a clock wise order, with oc[0] a corner */
+struct
+{
+  int x, y;
+}
+oc[8] =
+{
+  {
+    -1, -1
+  }
+  ,
+  {
+    0, -1
+  }
+  ,
+  {
+    1, -1
+  }
+  ,
+  {
+    1, 0
+  }
+  ,
+  {
+    1, 1
+  }
+  ,
+  {
+    0, 1
+  }
+  ,
+  {
+    -1, 1
+  }
+  ,
+  {
+    -1, 0
+  }
+};
+
+
+
+static void 
+xormatchscratch (marktype * b1, marktype * b2, int minr, int maxr, int minc, int maxc, int offx, int offy)
+{
+  int r, c, rmm, roo, coo;
+  int p1, p2;
+  Pixel **bm1 = b1->bitmap, **bm2 = b2->bitmap;
+  int w1 = b1->w, h1 = b1->h, w2 = b2->w, h2 = b2->h;
+
+  for (r = minr; r < maxr; r++)
+    {
+      rmm = r - minr;
+      roo = r - offy;
+      p1 = 0;
+      for (c = minc; c < 0; c++)
+	{
+	  coo = c - offx;
+	  scratch[rmm][c - minc] = sc2[rmm][c - minc] = 0;
+	  if ((coo >= 0) && (roo >= 0) && (coo < w2) && (roo < h2))
+	    p2 = pbm_getpixel (bm2, coo, roo);
+	  else
+	    p2 = 0;		/* background */
+	  scratch[rmm][c - minc] = p1 != p2;
+	}
+      for (c = 0; c < maxc; c++)
+	{
+	  coo = c - offx;
+	  scratch[rmm][c - minc] = sc2[rmm][c - minc] = 0;
+	  if ((r >= 0) && (c < w1) && (r < h1))
+	    p1 = pbm_getpixel (bm1, c, r);
+	  else
+	    p1 = 0;		/* background */
+	  if ((coo >= 0) && (roo >= 0) && (coo < w2) && (roo < h2))
+	    p2 = pbm_getpixel (bm2, coo, roo);
+	  else
+	    p2 = 0;		/* background */
+	  scratch[rmm][c - minc] = p1 != p2;
+	}
+    }
+}
+
+
+
+int 
+CSIS_match (marktype * b1, marktype * b2)
+{
+  int r, c, i;
+  int minr, minc;
+  int maxr, maxc;
+  int offx, offy, fepcount;
+  int totscratch = 0;
+
+
+  offx = b1->xcen - b2->xcen;
+  offy = b1->ycen - b2->ycen;
+
+  minc = min (0, offx);
+  minr = min (0, offy);
+
+  maxc = max (b1->w, b2->w + offx);
+  maxr = max (b1->h, b2->h + offy);
+
+  if (((maxc - minc) >= S_SIZE) || ((maxr - minr) >= S_SIZE))
+    return WXOR_match (*b1, *b2);
+
+  /* set the scratch array to 1 if there is an XOR match */
+
+  xormatchscratch (b1, b2, minr, maxr, minc, maxc, offx, offy);
+  /* We how have the XOR map. Scratch contains the number of neighbours, 1=1 neighbour set...etc */
+
+  /* CSIS rule 1, if FEP (four error pels) then exit */
+  fepcount = 0;
+  for (r = minr; r < maxr - 1; r++)
+    for (c = minc; c < maxc - 1; c++)
+      if ((scratch[r - minr][c - minc]) && (scratch[r - minr + 1][c - minc]) &&
+	  (scratch[r - minr][c - minc + 1]) && (scratch[r - minr + 1][c - minc + 1]))
+	{
+	  fepcount++;
+	  if (fepcount == 1)
+	    return 10001;
+	}
+
+  /* foreach set pixel, update scratch with the number of pels around in five dir's. 
+     FPN (five-pel neighbour hood) */
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      if (scratch[r - minr][c - minc])
+	{
+	  sc2[r - minr][c - minc] = 1;	/* itself */
+	  for (i = 1; i < 8; i += 3)
+	    if (((r + oc[i].y) >= minr) && ((c + oc[i].x) >= minc) && ((r + oc[i].y) < maxr) && ((c + oc[i].x) < maxc))
+	      if (scratch[r + oc[i].y - minr][c + oc[i].x - minc])
+		sc2[r - minr][c - minc]++;
+	}
+  /* now scratch has the value of the FPN - 1=single error, 5=4 neighbouring errors etc... */
+
+  /* set scratch and sc2 to be the same */
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      totscratch += scratch[r - minr][c - minc] = sc2[r - minr][c - minc];
+
+  for (r = minr; r < maxr; r++)
+    for (c = minc; c < maxc; c++)
+      {
+	/* CSIS rule 2i: an error pel has 2 or more neighbours---this num is the same as PMS */
+	if (scratch[r - minr][c - minc] >= 3)
+	  if ((r - minr >= 1) && (c - minc >= 1) && (r - minr < (maxr - 1)) && (c - minc < (maxc - 1)))
+	    {
+	      int i, numsep = 0;
+	      /* find how many neighbours a set pixel has, only check the 4 edges-FPN */
+	      for (i = 1; i < 8; i += 2)
+		if (scratch[r + oc[i].y - minr][c + oc[i].x - minc])	/* if a scratch pixel is set */
+		  {
+		    if ((scratch[r + oc[(i + 2) % 8].y - minr][c + oc[(i + 2) % 8].x - minc] == 0) &&
+			(scratch[r + oc[(i + 6) % 8].y - minr][c + oc[(i + 6) % 8].x - minc] == 0)
+		      )
+		      numsep++;
+		  }
+
+	      if ((b1->w >= 12) || (b2->w >= 12) || (b1->h >= 12) || (b2->h >= 12))
+		{
+
+		  /* PMS rule 2ii: at least two of its neigh. error p's aren't connected */
+		  if (numsep >= 2)
+		    {
+		      int i, j, p, p2, same;
+
+		      /* PMS rule 2(iii), look for regions in the original images of 3x3 the same */
+		      if ((c >= 0) && (r >= 0) && (c < b1->w) && (r < b1->h))
+			{
+			  p = pbm_getpixel (b1->bitmap, c, r);
+			  same = 0;
+			  for (i = -1; i <= 1; i++)
+			    for (j = -1; j <= 1; j++)
+			      {
+				if ((c + i >= 0) && (r + j >= 0) && (c + i < b1->w) && (r + j < b1->h))
+				  p2 = pbm_getpixel (b1->bitmap, c + i, r + j);
+				else
+				  p2 = 0;
+				if (p2 == p)
+				  same++;
+			      }	/* i,j loop */
+			  /* PMS rule 2(iii) */
+			  if (same == 9)
+			    {
+			      return 10002;
+			    }
+			}	/* (*b1) in range */
+
+		      if ((c - offx >= 0) && (r - offy >= 0) && (c - offx < b2->w) && (r - offy < b2->h))
+			{
+			  p = pbm_getpixel (b2->bitmap, c - offx, r - offy);
+			  same = 0;
+			  for (i = -1; i <= 1; i++)
+			    for (j = -1; j <= 1; j++)
+			      {
+				if ((c + i - offx >= 0) && (r + j - offy >= 0) && (c + i - offx < b2->w) && (r + j - offy < b2->h))
+				  p2 = pbm_getpixel (b2->bitmap, c + i - offx, r + j - offy);
+				else
+				  p2 = 0;
+				if (p2 == p)
+				  same++;
+			      }	/* i,j loop */
+			  /* PMS rule 2(iii) */
+			  if (same == 9)
+			    {
+			      return 10003;
+			    }
+			}
+		    }
+		}
+	      else
+		{		/* do the CSIS rule */
+		  /* CSIS rule 2ii: at least two of its neigh. error p's aren't connected */
+		  if (numsep >= 2)
+		    {
+		      int i, p, p2, same;
+
+		      /* PMS rule 2(iii), look for regions in the original images of 3x3 the same */
+		      if ((c >= 0) && (r >= 0) && (c < b1->w) && (r < b1->h))
+			{
+			  p = pbm_getpixel (b1->bitmap, c, r);
+			  same = 1;
+			  for (i = 1; i < 8; i += 2)
+			    if ((c + oc[i].x >= 0) && (r + oc[i].y >= 0) && (c + oc[i].x < b1->w) && (r + oc[i].y < b1->h))
+			      p2 = pbm_getpixel (b1->bitmap, c + oc[i].x, r + oc[i].y);
+			    else
+			      p2 = 0;
+			  if (p2 == p)
+			    same++;
+
+			  /* CSIS rule 2(iii) */
+			  if (same == 5)
+			    {
+			      return 10002;
+			    }
+			}
+
+		      if ((c - offx >= 0) && (r - offy >= 0) && (c - offx < b2->w) && (r - offy < b2->h))
+			{
+			  p = pbm_getpixel (b2->bitmap, c - offx, r - offy);
+			  same = 1;
+			  for (i = 1; i < 8; i += 2)
+			    if ((c + oc[i].x - offx >= 0) && (r + oc[i].y - offy >= 0) && (c + oc[i].x - offx < b2->w) && (r + oc[i].y - offy < b2->h))
+			      p2 = pbm_getpixel (b2->bitmap, c + oc[i].x - offx, r + oc[i].y - offy);
+			    else
+			      p2 = 0;
+			  if (p2 == p)
+			    same++;
+
+			  /* CSIS rule 2(iii) */
+			  if (same == 5)
+			    {
+			      return 10003;
+			    }
+			}
+		    }
+		}
+	    }
+      }
+
+  return totscratch;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/match.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/match.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/match.h	(revision 21083)
@@ -0,0 +1,47 @@
+/**************************************************************************
+ *
+ * match.h -- Functions related to matching marks
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __MATCH_H
+#define __MATCH_H
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "utils.h"
+
+
+/*
+   #define NOT_SCREENED(b1,b2) ((abs(b1.w-b2.w)<=4) && (abs(b1.h-b2.h)<=4))
+ */
+
+#define NOT_SCREENED(b1,b2) ((abs(b1.xcen-b2.xcen)+abs(b1.ycen-b2.ycen))<=3)
+
+#define MATCH_VAL 1000
+#define MATCH(b1,b2) (CSIS_match(b1,b2))
+
+int XOR_match (marktype b1, marktype b2);
+int WXOR_match (marktype b1, marktype b2);
+int WAN_match (marktype b1, marktype b2);
+int PMS_match (marktype b1, marktype b2);
+int CSIS_match (marktype * b1, marktype * b2);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.1	(revision 21083)
@@ -0,0 +1,116 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbilevel 1 \*(Dt CITRI
+.SH NAME
+mgbilevel \- compresses a bilevel image using a specified template
+.SH SYNOPSIS
+.B mgbilevel
+.B \-e
+[
+.B \-t
+.I \*(lqstring\*(rq
+]
+.I infile
+[
+.I \>compressed-outfile
+]
+.nf
+or
+.fi
+.B mgbilevel
+.B \-d
+.I compressed-infile
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+.B mgbilevel
+performs (up to) a two-stage template-based compression.  The
+user can specify the template to be used in the compression process.  The
+default template size is a two-stage template 22/10.  The compressed file
+contains the template type in the stream.  The output files are written
+to
+.IR stdout .
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-t\fP \fI\*(lqstring\*(rq\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-e
+Compresses
+.I infile
+using a template specified, and writes to
+.IR compressed-outfile .
+.TP
+.B \-d
+Decompresses
+.I compressed-infile
+using the template contained in the compressed file.  Writes to
+.IR outfile .
+.TP
+\fB\-t \fP\fI\*(lqstring\*(rq\fP
+This option specifies which template combination is to
+be used in the compression.  Five different characters
+can occur in the string: `.' for a pixel not
+included in the template, `p' for a pixel included in the 1st
+level template, `2' for a pixel included in the 2nd level
+template (a subset of the 1st level), `*' denoting the position
+of the
+.I current
+pixel, and a `;' denoting the end of each template line.
+The default template is a two-level 22/10 template:
+.IP
+.RS
+.nf
+\&.ppppp.;
+pp222pp;
+p22222p;
+p22*.\|.\|.;
+.fi
+.RE
+.IP
+This would be specified on the command line as:
+.nf
+\&\fB\-T\fP ".ppppp.;pp222pp;p22222p;p22*.\|.\|.;"
+.fi
+.TP
+.I infile
+This is the input
+.I .pbm
+file to be compressed.
+.TP
+.I outfile
+This is the decompressed
+.I .pbm
+file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgbilevel.c	(revision 21083)
@@ -0,0 +1,149 @@
+/**************************************************************************
+ *
+ * mgbilevel.c -- Program to compress/decompress bilevel images
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "utils.h"
+#include "pbmtools.h"
+#include "arithcode.h"
+#include "bilevel.h"
+
+
+
+static char default_template[] =
+{
+  ".ppppp.;"
+  "pp222pp;"
+  "p22222p;"
+  "p22*...;"
+};
+
+void 
+Encode_bitmap (marktype b, char template[])
+{
+  InitArithEncoding ();
+
+  bl_compress (b, template);
+
+  CloseDownArithEncoding ();
+}
+
+void 
+Decode_bitmap (marktype * b)
+{
+  InitArithDecoding ();
+
+  bl_decompress (b);
+
+  CloseDownArithDecoding ();
+}
+
+
+void 
+usage ()
+{
+  fprintf (stderr,
+	   "usage:\n"
+	   "       mgbilevel -e  [-t \"string\"]  infile      >compressed\n"
+	   "or\n"
+	   "       mgbilevel -d                 compressed  >outfile\n");
+  exit (1);
+}
+
+#define BUF_SIZE 65536
+
+void 
+main (int argc, char *args[])
+{
+  marktype d;
+  char *filename = NULL, *template = NULL;
+  Pixel **bitmap;
+  int encode = 0, decode = 0, i;
+  char buffer[BUF_SIZE];
+
+  if (argc < 2)
+    usage ();
+  template = default_template;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (args[i], "-e") == 0)
+	encode = 1;
+      else if (strcmp (args[i], "-d") == 0)
+	decode = 1;
+      else if (strcmp (args[i], "-h") == 0)
+	usage ();
+      else if (strcmp (args[i], "-t") == 0)
+	{
+	  template = args[i + 1];
+	  i++;
+	}
+      else if (args[i][0] == '-')
+	error_msg (args[0], "unknown switch:", args[i]);
+      else if (!filename)
+	filename = args[i];
+      else
+	error_msg (args[0], "only specify 1 filename", "");
+    }
+  if (encode == decode)
+    {
+      fprintf (stderr, "You must specify either encode XOR decode.\n");
+      exit (1);
+    }
+
+  if (!filename)
+    {
+      fprintf (stderr, "You must specify a filename.\n");
+      exit (1);
+    }
+
+  if (encode)
+    {
+      bitmap = pbm_readnamedfile (filename, &d.w, &d.h);
+      if (bitmap == NULL)
+	error_msg (args[0], "problem reading bitmap", "");
+
+      arith_out = stdout;
+      setbuffer (stdout, buffer, BUF_SIZE);
+      magic_write (stdout, MAGIC_BILEVEL);
+      if (bitmap)
+	{
+	  d.bitmap = bitmap;
+	  Encode_bitmap (d, template);
+	}
+    }
+  else if (decode)
+    {
+      FILE *tpin;
+      tpin = fopen (filename, "rb");
+      if (!tpin)
+	error_msg ("mgbilevel", "Can't open file:", filename);
+      arith_in = tpin;
+      setbuffer (tpin, buffer, BUF_SIZE);
+      magic_check (tpin, MAGIC_BILEVEL);
+      Decode_bitmap (&d);
+      fclose (tpin);
+
+      setbuffer (stdout, buffer, BUF_SIZE);
+      pbm_writefile (stdout, d.bitmap, d.w, d.h);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.1	(revision 21083)
@@ -0,0 +1,103 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgfelics 1 \*(Dt CITRI
+.SH NAME
+mgfelics \- fast and efficient lossless image (de)compression
+.SH SYNOPSIS
+.B mgfelics
+.B \-e
+[
+.BI \-k " n"
+]
+.I infile
+[
+.I \>compressed-outfile
+]
+.br
+or
+.br
+.B mgfelics
+.B \-d
+.I compressed-infile
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+.B mgfelics
+is a lossless compression process which can (de)compress portable
+bitmap files in
+.I pgm
+format.
+.B mgfelics
+writes to
+.IR stdout .
+.SH OPTIONS
+.TP "\w'\fB\-k\fP \fIn\fP'u+2n"
+.BI \-k " n"
+An integer parameter (< 32) which controls the compression speed and
+ratio.  The value of
+.I n
+is included in the output stream, and therefore is not needed in the
+decompression stage.  The default value of
+.I n
+is equal to the number of bits required to represent each grey level.
+.TP
+.B \-e
+Encodes the file
+.IR infile ,
+sending the output to
+.IR stdout .
+.TP
+.B \-d
+Decodes the file from
+.IR compressed-infile ,
+sending the output to
+.IR stdout .
+.SH NOTE
+.B mgfelics
+uses a combination of adjusted binary and Rice codes, the choice of
+which for any given pixel depends on the environment as determined by
+the intensity values of neighbouring pixels.  The result is a very
+fast and lossless algorithm for compressing grayscale images.  The
+optional parameter
+.BI \-k " n"
+corresponds to the maximum exponent of the same name in Rice encoding.
+Smaller values of
+.BI \-k " n"
+can result in significant improvement in compression times with a
+corresponding loss in compression ratio.  However the reduction in
+compression ratio with a small
+.BI \-k " n"
+parameter may be insignificant for many images.
+.SH REFERENCES
+Algorithm by Paul G. Howard and Jeffrey Scott Vitter
+of Brown University, RI, and Duke University, NC, respectively.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgfelics.c	(revision 21083)
@@ -0,0 +1,155 @@
+/**************************************************************************
+ *
+ * mgfelics.c -- Program to compress/decompress grey scale images
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "utils.h"
+
+
+#define MAXKVALUE 32
+
+
+
+void encode (unsigned int *line, int width, int height, int maxval, int maxk,
+	     FILE * fp_in, FILE * fp_out, int (*get) (FILE *));
+
+void decode (unsigned int *line, int width, int height, int maxval, int maxk,
+	     FILE * fp_in, FILE * fp_out);
+
+
+void 
+usage (char *prog)
+{
+  fprintf (stderr, "usage:\n");
+  fprintf (stderr, "\t%s -e [-k n]   infile    [>compressed]\n"
+	   "or\n"
+	   "\t%s -d  compressed-infile   [>outfile]\n", prog, prog);
+  exit (1);
+}
+
+
+
+
+int 
+main (int argc, char **argv)
+{
+  FILE *fp_in = (stdin), *fp_out = (stdout);
+  int width, height, maxval;
+  u_long magic;
+  char *filename = NULL;
+  unsigned int *line;
+  int maxk = 0;
+  int i;
+  int encode_flag = 0, decode_flag = 0;
+
+  if (argc < 2)
+    usage (argv[0]);
+
+  for (i = 1; i < argc; i++)
+    {
+      if (!strcmp (argv[i], "-h"))
+	usage (argv[0]);
+      else if (!strcmp (argv[i], "-e"))
+	encode_flag = 1;
+      else if (!strcmp (argv[i], "-d"))
+	decode_flag = 1;
+      else if (!strcmp (argv[i], "-k"))
+	{
+	  maxk = atoi (argv[++i]);
+	}
+      else if (argv[i][0] == '-')
+	error_msg (argv[0], "unknown switch:", argv[i]);
+      else if (!filename)
+	filename = argv[i];
+      else
+	error_msg (argv[0], "too many filenames specified.", "");
+    }
+
+  if (encode_flag == decode_flag)
+    error_msg (argv[0], "please specify either encode XOR decode.", "");
+
+  if (!filename)
+    error_msg (argv[0], "please specify a filename.", "");
+
+  if ((encode_flag) && (maxk >= MAXKVALUE))
+    {				/* to fit into 32 bit integers */
+      fprintf (stderr, "%s: k value of %d is too large; it must be less than %d\n",
+	       argv[0], maxk, MAXKVALUE);
+      exit (1);
+    }
+
+
+  if ((fp_in = fopen (filename, "rb")) == NULL)
+    error_msg (argv[0], "unable to open file:", filename);
+
+  /* read file header to determine the type and dimensions */
+
+
+  magic = magic_read (fp_in);
+  if (magic != MAGIC_FELICS)
+    {
+      rewind (fp_in);
+      magic = getmagicno_short_pop (fp_in);
+    }
+
+  if ((decode_flag && (magic != MAGIC_FELICS)) ||
+      (encode_flag && ((magic != MAGIC_P2) && (magic != MAGIC_P5))))
+    {
+      fclose (fp_in);
+      error_msg (argv[0], encode_flag ? "only PGM files can be used." : "only felics compressed files can be used.", "");
+    }
+
+  width = gethint (fp_in);
+  height = gethint (fp_in);
+  maxval = gethint (fp_in);
+
+  if ((line = (unsigned int *) malloc (width * sizeof (int *))) == NULL)
+    {
+      fclose (fp_in);
+      error_msg (argv[0], "unable to allocate memory,", "");
+    }
+
+
+  if (encode_flag)
+    {
+      magic_write (fp_out, MAGIC_FELICS);
+      fprintf (fp_out, "%d\n%d\n%d\n%d\n", width, height, maxval, maxk);
+      encode (line, width, height, maxval, maxk, fp_in, fp_out,
+	      magic == MAGIC_P2 ? getint : fgetc);
+    }
+  else if (decode_flag)
+    {
+      if (maxk)
+	warn (argv[0], "k value not required for decompression, ignored.", "");
+
+      maxk = gethint (fp_in);
+      fprintf (fp_out, "P%d\n%d %d\n%d\n", maxval < 256 ? 5 : 2,
+	       width, height, maxval);
+      decode (line, width, height, maxval, maxk, fp_in, fp_out);
+    }
+
+
+  fclose (fp_in);
+  fclose (fp_out);
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.1	(revision 21083)
@@ -0,0 +1,137 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgtic 1 \*(Dt CITRI
+.SH NAME
+mgtic \- textual image compression.
+.SH SYNOPSIS
+.B mgtic
+.B \-e
+[
+.B \-L
+]
+[
+.B \-Q
+]
+[
+.B \-X
+]
+.I libraryfile
+.I infile
+.if n .ti +9n
+[
+.I \>compressed\-outfile
+]
+.nf
+or
+.fi
+.B mgtic
+.B \-d
+[
+.B \-L
+]
+[
+.BI \-X " libraryfile"
+]
+.I compressed-infile
+.if n .ti +9n
+[
+.I \>outfile
+]
+.SH DESCRIPTION
+This is the main routine in the
+.B mgtic
+system.
+.B mgtic
+is used to
+processes a series of files, and by using the
+.I libraryfile
+produced by
+.BR mgticbuild (1),
+compresses input files with respect to the marks contained in the
+library.  On the CCITT test faxes, lossless mode achieved around 20:1
+compression, and lossy, around 40:1 compression.  On more textual
+images, the amount of compression is determined by the resolution of
+the original file, and the amount of noise in the image.  By default,
+.B mgtic
+will reconstruct a lossy version of the image.  This
+can be changed to lossless by using the
+.B \-L
+option.
+.SH OPTIONS
+Options may appear in any order, but must come before the input
+filenames.
+.TP "\w'\fB\-X\fP \fI[libraryfile]\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-e
+Encode
+.I infile
+with respect to the library.
+.TP
+.B \-d
+Decodes
+.IR compressed-infile
+with respect to the library.
+.TP
+.B \-l
+This specifies lossy mode, and is the default mode for (de)compression.
+Do not generate the residue.  If used in encoding mode, does not store
+the residue in the output.  If used in decoding mode, the residue (if
+it exists) is ignored.
+.TP
+.B \-L
+Use lossless mode for (de)compression, which generates the residue.
+If used in encoding mode, this stores the residue in the compressed
+output.  If used in decoding mode (assuming the residue is present),
+this allows the original file to be recovered exactly.
+.TP
+.BI \-R\  filename
+Stores the residue as an external file
+.I filename
+which could possibly be stored on another medium.  During
+decompression, if the residue file specified does not relate to the
+compressed file, the resulting decompressed image will be a mess.
+Note that only the width and height of the residue image is checked.
+.TP
+.BI \-Q
+Uses a quicker form of compression.  This option decreases the time
+spent looking for a good match during encoding.  On average this
+option decreases compression ratios, but increases compression speed.
+.TP
+.BI \-X " [libraryfile]"
+Use an external library file, instead of (de)compressing the library
+within the normal stream.  When decoding, the
+.B \-X
+option must be followed by the
+.IR libraryfile .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgtic.c	(revision 21083)
@@ -0,0 +1,596 @@
+/**************************************************************************
+ *
+ * mgtic.c -- Program to compress/decompress textual images
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************
+ *
+ * This file is the basis of mgtic, which compresses the components of an
+ * image. 
+ * The compressed file contains the following sections:
+ *         mgtic magic_no
+ *         mgtic version
+ *         lossy/lossless flag 
+ *         internal/external library flag 
+ *         cols, rows, number of marks, library size
+ *         [library sequence]
+ *         symbol sequence
+ *         offset sequence
+ *         [residue bitmap]
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+#include "match.h"
+#include "sortmarks.h"
+#include "codesyms.h"
+#include "arithcode.h"
+#include "codeoffsets.h"
+#include "bilevel.h"
+
+static char library_template[] =
+{
+  ".ppppp.;"
+  "pp222pp;"
+  "p22222p;"
+  "p22*...;"
+};
+
+void 
+usage ()
+{
+  fprintf (stderr, "usage: \n"
+	"\tmgtic -e [-L] [-Q] [-X]  libraryfile   infile    [>compressed]\n"
+	   "or\n"
+	   "\tmgtic -d [-L] [-X libraryfile]  compressed  [>outfile]\n");
+  exit (1);
+}
+
+
+/* encode the list of marks 'list', w.r.t. the library 'library' */
+void 
+match_sequence (marklistptr list, marklistptr library, marklistptr * symbol_list, Pixel ** recon, int quick)
+{
+  int carryx, carryy, gap;
+  int lastx = 0, lasty = 0;
+  int i, j;
+  marktype d, d2;
+  marklistptr liststep, librarystep;
+  int score, found;
+  int r, c;
+  int p;
+
+  carryx = carryy = 0;
+  gap = max (1, marklist_length (list) / 10);
+
+  for (liststep = list, i = 0; liststep; liststep = liststep->next, i++)
+    {
+      if (V)
+	if (!(i % gap))
+	  fprintf (stderr, ".");
+      d = liststep->data;
+
+      found = -1;
+      score = INT_MAX;
+      for (librarystep = library, j = 0; librarystep; librarystep = librarystep->next, j++)
+	{
+	  d2 = librarystep->data;
+
+	  if (NOT_SCREENED (d2, d))
+	    if ((p = MATCH (&d, &d2)) < MATCH_VAL)
+	      {
+		if (p < score)
+		  {
+		    score = p;
+		    found = j;
+		    if (quick)
+		      break;
+		  }
+	      }
+	}
+      /*
+         if(found<0){
+         for(librarystep=library,j=0; librarystep; librarystep=librarystep->next,j++){
+         d2=librarystep->data;
+
+         if((p=MATCH(&d,&d2))<MATCH_VAL){
+         if(p<score){
+         score=p;found=j; if(quick) break;
+         }
+         }
+         }
+         }
+       */
+      if (found >= 0)
+	{
+	  liststep->data.symnum = found;
+	  marklist_getat (library, found, &d2);
+	  d2.symnum = found;
+
+	  d2.xoffset = d.xpos - lastx + carryx;		/* propagate changes to next mark */
+	  d2.yoffset = d.ypos - lasty + carryy;
+	  carryx = (d2.xcen - d.xcen);	/* offet centroids because thats where we match them! */
+	  carryy = (d2.ycen - d.ycen);
+	  d2.xoffset -= carryx;	/* make the changes to this mark */
+	  d2.yoffset -= carryy;
+	  lastx = d.xpos + d2.w;
+	  lasty = d.ypos;
+
+	  marklist_add (symbol_list, d2);
+
+	  /* add to the reconstructed image--this is the lossy version */
+	  for (r = 0; r < d2.h; r++)
+	    for (c = 0; c < d2.w; c++)
+	      if (pbm_getpixel (d2.bitmap, c, r))
+		pbm_putpixel_trunc (recon, d.xpos + c - carryx, d.ypos + r - carryy, 1, d2.w, d2.h);
+	}
+      else
+	{
+	  /* didn't match at all..hopefully noise */
+	  if ((liststep->data.w >= 10) || (liststep->data.w >= 10))
+	    {
+	      fprintf (stderr, "mgtic: warning, unable to match a char.\n");
+	      write_library_mark (stderr, liststep->data);
+	    }
+	  if (V)
+	    fprintf (stderr, "x");
+	  liststep->data.symnum = -1;
+	}
+    }
+  if (V)
+    fprintf (stderr, "\n");
+}
+
+
+
+
+void 
+main (int argc, char *args[])
+{
+  int i, n, r, c, ch;
+  FILE *inf;
+  marklistptr library = NULL, list = NULL, step = NULL;
+  marklistptr symbol_list = NULL;
+  marktype d, d2;
+  Pixel **bitmap, **recon, **bitmapcopy;
+  char *splitfilename = NULL;
+  int cols, rows, count, librarysize, lossy = 1;
+  int quick = 0;
+  int ticencode = 0, ticdecode = 0, external = 0;
+  char *libraryname = NULL, *infile = NULL;
+  char *s1 = NULL, *s2 = NULL;
+  char bufferin[BUFSIZ], bufferout[BUFSIZ];
+
+  if (argc < 2)
+    usage ();
+
+  while ((ch = getopt (argc, args, "edlLQhvXR:")) != -1)
+    switch (ch)
+      {
+      case 'e':
+	ticencode = 1;
+	break;
+      case 'd':
+	ticdecode = 1;
+	break;
+      case 'l':
+	lossy = 1;
+	break;
+      case 'L':
+	lossy = 0;
+	break;
+      case 'Q':
+	quick = 1;
+	break;
+      case 'v':
+	V = 1;
+	break;
+      case 'X':
+	external = 1;
+	break;
+      case 'R':
+	splitfilename = optarg;
+	break;
+      case 'h':
+      case '?':
+	usage ();
+      }
+
+  for (i = 1; i < argc; i++)
+    if (args[i][0] != '-')
+      if (strcmp (args[i - 1], "-R"))
+	{			/* ignore arg following -R, ie. -R <filename> */
+	  if (!s1)
+	    s1 = args[i];
+	  else if (!s2)
+	    s2 = args[i];
+	  else
+	    error_msg (args[0], "too many filenames", "");
+	}
+
+  if (ticencode == ticdecode)
+    error_msg (args[0], "please specify either encode XOR decode", "");
+
+  if (ticencode)
+    {
+	  /*****************
+	    ENCODING STAGE
+	  *****************/
+      long PrevBits = 0;
+      long BITS_header = 0, BITS_symbols = 0, BITS_offsets = 0, BITS_residue = 0,
+        BITS_footer = 0, BITS_library = 0;
+
+      libraryname = s1;
+      if (!libraryname)
+	error_msg (args[0], "please specify a library file", "");
+      infile = s2;
+      if (!infile)
+	error_msg (args[0], "please specify a file name", "");
+
+      inf = fopen (infile, "rb");
+      if (inf == NULL)
+	error_msg (args[0], "Trouble opening file:", infile);
+      setbuf (inf, bufferin);
+
+      count = librarysize = read_library (libraryname, &library);
+
+      if (V)
+	fprintf (stderr, "%s: processing...\n", args[0]);
+
+      if (pbm_isapbmfile (inf))
+	{
+	  if (V)
+	    fprintf (stderr, "reading file %s...\n", infile);
+	  bitmap = pbm_readfile (inf, &cols, &rows);
+	  fclose (inf);
+
+	  bitmapcopy = pbm_copy (bitmap, cols, rows);
+
+	  if (V)
+	    fprintf (stderr, "extracting...");
+	  ExtractAllMarks (bitmap, &list, cols, rows);
+	  if (V)
+	    fprintf (stderr, "(%d marks)\n", marklist_length (list));
+
+	  /* sort into reading order */
+	  if (V)
+	    fprintf (stderr, "sorting...\n");
+	  list = sortmarks (list);
+
+	  pbm_freearray (&bitmap, rows);	/* clear old version */
+	  bitmap = bitmapcopy;	/* point to the copy */
+	  recon = pbm_allocarray (cols, rows);
+
+	  if (V)
+	    fprintf (stderr, "matching...");
+
+	  match_sequence (list, library, &symbol_list, recon, quick);
+
+
+	  PrevBits = 0;
+	  setbuf (stdout, bufferout);
+	  /* start output */
+	  magic_write (stdout, MAGIC_TIC);
+	  InitArithEncoding ();
+
+	  EncodeGammaDist (1);	/* version 1 of the program */
+	  EncodeGammaDist (lossy);	/* lossy=1 = no residue */
+	  EncodeGammaDist (external);	/* 1== external file */
+
+	  count = marklist_length (symbol_list);
+	  if (V)
+	    fprintf (stderr, "encoding cols, rows, and number of symbols=%d\n", count);
+
+	  EncodeGammaDist (cols);
+	  EncodeGammaDist (rows);
+	  EncodeGammaDist (count);
+	  EncodeGammaDist (librarysize);
+
+	  BITS_header = CountOfBitsOut - PrevBits;
+	  PrevBits = CountOfBitsOut;
+
+
+	  /* output the library sequence */
+	  if (external == 0)
+	    {
+	      if (V)
+		fprintf (stderr, "encoding library\n");
+
+	      bl_clearmodel ();
+	      bl_writetemplate (library_template);
+	      for (step = library; step; step = step->next)
+		bl_compress_mark (step->data);
+	      bl_freemodel ();
+	      BITS_library = CountOfBitsOut - PrevBits;
+	      PrevBits = CountOfBitsOut;
+	    }
+
+	  /* output the symbol sequence */
+	  if (V)
+	    fprintf (stderr, "encoding symbol sequence\n");
+	  InitPPM ();
+	  EncodeSymbols (symbol_list, count);
+	  BITS_symbols = CountOfBitsOut - PrevBits;
+	  PrevBits = CountOfBitsOut;
+
+
+	  /* output the offset sequence */
+	  if (V)
+	    fprintf (stderr, "encoding offset sequence\n");
+	  EncodeOffsets (symbol_list, count);
+	  BITS_offsets = CountOfBitsOut - PrevBits;
+	  PrevBits = CountOfBitsOut;
+
+	  EncodeChecksum ();	/* code lossy checksum */
+
+	  /* calculate the residue...and compress it---if need be! */
+	  if (!lossy)
+	    {
+	      if (V)
+		fprintf (stderr, "encoding residue...\n");
+
+	      d.bitmap = bitmap;
+	      d.h = rows;
+	      d.w = cols;
+	      d2.bitmap = recon;
+	      d2.h = rows;
+	      d2.w = cols;
+
+	      if (splitfilename)
+		{
+		  FILE *temp;
+
+		  CloseDownArithEncoding ();
+		  fclose (stdout);
+		  /* no residue result */
+		  BITS_footer = CountOfBitsOut - PrevBits;
+
+		  temp = fopen (splitfilename, "wb");
+		  if (temp == NULL)
+		    error_msg (args[0], "Trouble creating file:", splitfilename);
+
+		  arith_out = temp;
+		  InitArithEncoding ();
+		  bl_clair_compress (d, d2);
+		  CloseDownArithEncoding ();
+		  BITS_residue = CountOfBitsOut;
+		  fclose (temp);
+		}
+	      else
+		{
+		  bl_clair_compress (d, d2);
+		  BITS_residue = CountOfBitsOut - PrevBits;
+		  PrevBits = CountOfBitsOut;
+		  EncodeChecksum ();	/* code lossless checksum */
+		  CloseDownArithEncoding ();
+		  BITS_footer = CountOfBitsOut - PrevBits;
+		}
+	    }
+	  else
+	    {
+	      if (V)
+		fprintf (stderr, "not encoding residue..lossy mode\n");
+	      CloseDownArithEncoding ();
+	      BITS_footer = CountOfBitsOut - PrevBits;
+	    }
+
+	  /* because we edit the values above */
+	  CountOfBitsOut = BITS_header + BITS_library + BITS_symbols + BITS_offsets + BITS_residue + BITS_footer;
+
+	  fprintf (stderr, "bits: header=%ld, library=%ld, "
+		   "symbols=%ld, offsets=%ld, residue=%ld, footer=%ld\n",
+		   BITS_header, BITS_library, BITS_symbols,
+		   BITS_offsets, BITS_residue, BITS_footer);
+	  fprintf (stderr, "total bits: %ld, ", CountOfBitsOut);
+	  fprintf (stderr, "Lossy CR: %4.2f", (cols * rows) / (float) (CountOfBitsOut - BITS_residue));
+	  if (external)
+	    fprintf (stderr, " (excluding external lib)");
+	  fprintf (stderr, ", Lossless CR: %4.2f\n", (!lossy) * (cols * rows) / (float) (CountOfBitsOut));
+	}
+      else
+	error_msg (args[0], "unknown format of bitmap--expecting PBM.", "");
+    }
+  else
+    {
+	  /*****************
+	    DECODING STAGE
+	  *****************/
+      int lastx, lasty;
+      librarysize = 0;
+
+      if (external)
+	{
+	  libraryname = s1;
+	  infile = s2;
+	  count = librarysize = read_library (libraryname, &library);
+	}
+      else
+	{
+	  infile = s1;
+	  if (infile && s2)
+	    error_msg (args[0], "too many filenames", "");
+	}
+
+      if (!freopen (infile, "rb", stdin))
+	error_msg (args[0], "Trouble opening file:", infile);
+
+
+      if (V)
+	fprintf (stderr, "decompressing...\n");
+
+      setbuf (stdin, bufferin);
+      magic_check (stdin, MAGIC_TIC);
+
+      InitArithDecoding ();
+
+      {
+	int version = DecodeGammaDist ();
+	if (version != 1)
+	  error_msg (args[0], "Need later version of decompressor.", "");
+      }
+
+      {
+	int templossy = DecodeGammaDist ();
+	if (!lossy)
+	  lossy = templossy;	/* can only choose if encoded file is lossless */
+	if (V)
+	  {
+	    if (lossy)
+	      fprintf (stderr, "lossy mode\n");
+	    else
+	      fprintf (stderr, "lossless mode\n");
+	  }
+      }
+
+      if (DecodeGammaDist ())
+	{			/* if compressed file doesn't contain library */
+	  if (!external)
+	    error_msg (args[0], "compressed file doesn't contain library, specify externally", "");
+	  external = 1;
+	}
+      else
+	{			/* if compressed file contains library */
+	  if (external)
+	    fprintf (stderr, "ignoring external library file\n");
+	  external = 0;
+	}
+
+      cols = DecodeGammaDist ();
+      rows = DecodeGammaDist ();
+      count = DecodeGammaDist ();
+
+      i = DecodeGammaDist ();	/* librarysize */
+      if (external)
+	{
+	  if (i > librarysize)
+	    error_msg (args[0], "external library file is too small!", "");
+	  else if (i < librarysize)
+	    fprintf (stderr, "%s: warning, expecting a different (smaller) library.\n", args[0]);
+	}
+      librarysize = i;
+
+      if (V)
+	fprintf (stderr, "cols %d, rows %d, num syms %d, library size %d\n", cols, rows, count, librarysize);
+
+      /* decode library */
+      if (external == 0)
+	{
+	  if (V)
+	    fprintf (stderr, "reading library\n");
+	  bl_clearmodel ();
+	  bl_readtemplate ();
+	  for (n = 0; n < librarysize; n++)
+	    {
+	      bl_decompress_mark (&d);
+	      d.symnum = n;
+	      if (library == NULL)
+		step = marklist_add (&library, d);
+	      else
+		step = marklist_add (&step, d);
+	    }
+	  bl_freemodel ();
+	  if (V)
+	    fprintf (stderr, "read %d marks from library\n", marklist_length (library));
+	}
+
+      recon = pbm_allocarray (cols, rows);
+
+      /* decode symbols */
+      InitPPM ();
+      if (V)
+	fprintf (stderr, "decompressing %d symbols\n", count);
+      symbol_list = DecodeSymbols (count);
+
+      /* decode offsets */
+      if (V)
+	fprintf (stderr, "reading offsets...\n");
+      DecodeOffsets (symbol_list, count);
+      lastx = lasty = 0;
+      for (step = symbol_list; step; step = step->next)
+	{
+	  lastx = lastx + step->data.xoffset;
+	  lasty = lasty + step->data.yoffset;
+
+	  marklist_getat (library, step->data.symnum, &d2);
+	  for (r = 0; r < d2.h; r++)
+	    for (c = 0; c < d2.w; c++)
+	      if (pbm_getpixel (d2.bitmap, c, r))
+		pbm_putpixel_trunc (recon, lastx + c, lasty + r, 1, cols, rows);	/* we don't care, already warned them! */
+	  lastx += d2.w;
+	}
+
+      DecodeChecksum (args[0]);
+
+      /* decode the residue */
+      if (!lossy)
+	{
+	  if (V)
+	    fprintf (stderr, "decoding residue...\n");
+
+	  bitmap = pbm_allocarray (cols, rows);
+	  d.bitmap = bitmap;
+	  d.w = d2.w = cols;
+	  d.h = d2.h = rows;
+
+	  d2.bitmap = recon;
+
+	  /* NOTE: the 2nd argument is clairvoyantly compressed */
+	  if (splitfilename)
+	    {
+	      FILE *temp;
+
+	      CloseDownArithDecoding ();
+	      fclose (stdin);
+
+	      temp = fopen (splitfilename, "rb");
+	      if (temp == NULL)
+		error_msg (args[0], "Trouble opening file:", splitfilename);
+
+	      arith_in = temp;
+	      InitArithDecoding ();
+	      bl_clair_decompress (d, d2);
+	      CloseDownArithDecoding ();
+	      fclose (temp);
+	    }
+	  else
+	    {
+	      bl_clair_decompress (d, d2);
+	      DecodeChecksum (args[0]);
+	      CloseDownArithDecoding ();
+	    }
+	  pbm_freearray (&recon, rows);
+	  recon = bitmap;	/* point to the bitmap */
+	}
+      else
+	{
+	  CloseDownArithDecoding ();
+	}
+
+      if (V)
+	fprintf (stderr, "writing pbm file...\n");
+      setbuf (stdout, bufferout);
+      pbm_writefile (stdout, recon, cols, rows);
+      pbm_freearray (&recon, rows);
+    }				/* end decoding */
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.1	(revision 21083)
@@ -0,0 +1,61 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticbuild 1 \*(Dt CITRI
+.SH NAME
+mgticbuild \- build a library of marks from training documents
+.SH SYNOPSIS
+.B mgticbuild
+[
+.B \-h
+]
+.I "libraryfile infile1 infile2 .\|.\|."
+.SH DESCRIPTION
+.B mgticbuild
+builds an uncompressed library of marks that have been
+extracted from a series of input files.  If the
+.I libraryfile
+does
+not exist, it is created, otherwise new marks are appended to the
+file.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.TP
+.I infile(s)
+The training files; the only currently-supported format is
+.IR pbm .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticbuild.c	(revision 21083)
@@ -0,0 +1,145 @@
+/**************************************************************************
+ *
+ * mgticbuild.c -- Program to build the textual image library
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+
+
+void 
+usage ()
+{
+  fprintf (stderr, "usage: \n"
+	"\tmgticbuild   libraryfile   infile.pbm  [infile2 infile3 ...]\n");
+  exit (1);
+}
+
+void 
+main (int argc, char *args[])
+{
+  int i;
+  FILE *lib = NULL, *inf = NULL;
+  marklistptr list = NULL, step;
+  Pixel **bitmap;
+  int cols, rows;
+  int count, pos = 0;
+  char *libraryname = NULL;
+
+  if (argc < 2)
+    usage ();
+
+  for (i = 1; i < argc; i++)
+    {
+      if (!strcmp (args[i], "-v"))
+	V = 1;
+      else if (!strcmp (args[i], "-h"))
+	usage ();
+      else if (args[i][0] == '-')
+	error_msg (args[0], "unknown switch:", args[i]);
+      else if (!libraryname)
+	libraryname = args[i];
+      else
+	pos = i;
+    }
+
+  if (!libraryname)
+    error_msg (args[0], "please specify a library file", "");
+  if (pos < 2)
+    usage ();
+
+  count = 0;
+  for (i = pos; i < argc; i++)
+    if (args[i][0] != '-')
+      {
+	inf = fopen (args[i], "rb");
+	count = 0;
+	if (inf == NULL)
+	  fprintf (stderr, "Trouble opening file: %s\n", args[i]);
+	else
+	  {
+	    if (pbm_isapbmfile (inf))
+	      {
+		if (V)
+		  fprintf (stderr, "%s: processing...\n", args[0]);
+		if (V)
+		  fprintf (stderr, "reading file %s...", args[i]);
+		bitmap = pbm_readfile (inf, &cols, &rows);
+		if (V && (count == 0))
+		  fprintf (stderr, "building...");
+
+		list = NULL;
+
+		ExtractAllMarks (bitmap, &list, cols, rows);
+
+		if (V)
+		  fprintf (stderr, "writing...");
+
+		if ((!lib) && (marklist_length (list)))
+		  {
+		    lib = fopen (libraryname, "r");
+		    if (lib)
+		      {
+			fclose (lib);
+			lib = fopen (libraryname, "ab");
+			if (lib == NULL)
+			  error_msg (args[0], "trouble appending library file", "");
+			fprintf (stderr, "\nwarning: appending library file: %s\n", libraryname);
+		      }
+		    else
+		      {
+			lib = fopen (libraryname, "wb");
+			if (lib == NULL)
+			  error_msg (args[0], "trouble creating library file", "");
+		      }
+		  }		/* if !lib */
+
+		step = list;
+		while (step)
+		  {
+		    step->data.symnum = count;
+		    write_library_mark (lib, step->data);
+		    count++;
+		    step = step->next;
+		  }
+		pbm_freearray (&bitmap, rows);
+	      }
+	    else
+	      fprintf (stderr, "warning: %s is not a PBM file.\n", args[i]);
+	    fclose (inf);
+	  }
+	if (count)
+	  {
+	    if (V)
+	      fprintf (stderr, "%d marks written.\n", count);
+	  }
+	else
+	  fprintf (stderr, "No marks written!\n");
+      }
+
+  if (lib)
+    fclose (lib);
+  marklist_free (&list);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.1	(revision 21083)
@@ -0,0 +1,55 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticdump 1 \*(Dt CITRI
+.SH NAME
+mgticdump \- displays the library in a user-friendly manner
+.SH SYNOPSIS
+.B mgticdump
+[
+.B \-h
+]
+.I libraryfile
+.SH DESCRIPTION
+.B mgticdump
+displays the marks in a library in a user-viewable form.  The output
+is to
+.I stdout
+and is in a plain ASCII form.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticdump.c	(revision 21083)
@@ -0,0 +1,86 @@
+/**************************************************************************
+ *
+ * mgticdump.c -- Program to dump out a library in a human readable form
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+
+
+void 
+usage ()
+{
+  fprintf (stderr, "usage:\n"
+	   "\tmgticdump   libraryfile\n");
+  exit (1);
+}
+
+
+
+void 
+main (int argc, char *args[])
+{
+  FILE *lib;
+  int count, i;
+  marktype d;
+  char *libraryname = NULL;
+  FILE *outf = (stdout);
+
+  if (argc < 2)
+    usage ();
+
+  for (i = 1; i < argc; i++)
+    {
+      if (!strcmp (args[i], "-h"))
+	usage ();
+      else if (args[i][0] == '-')
+	error_msg (args[0], "unknown switch:", args[i]);
+      else if (!libraryname)
+	libraryname = args[i];
+      else
+	error_msg (args[0], "too many filenames", "");
+    }
+
+  if (!libraryname)
+    error_msg (args[0], "please specify a library file", "");
+
+
+  lib = fopen (libraryname, "rb");
+  if (lib == NULL)
+    error_msg (args[0], "trouble opening library file:", libraryname);
+
+  count = 0;
+  while (!isEOF (lib))
+    {
+      read_library_mark (lib, &d);
+
+      write_library_mark (outf, d);
+      count++;
+
+      pbm_freearray (&d.bitmap, d.h);
+    }
+  fprintf (stderr, "count=%d", count);
+  fclose (lib);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.1	(revision 21083)
@@ -0,0 +1,91 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticprune 1 \*(Dt CITRI
+.SH NAME
+mgticprune \- prunes the library to remove duplicates
+.SH SYNOPSIS
+.B mgticprune
+[
+.BI \-a " n"
+]
+[
+.BI \-s " n"
+]
+[
+.B \-Q
+]
+.I libraryfile
+.if n .ti +9n
+[
+.I pruned-libraryfile
+]
+.SH DESCRIPTION
+.B mgticprune
+examines
+.I libraryfile
+and removes duplicate marks.  If
+.I pruned-libraryfile
+is not specified,
+.I libraryfile
+is overwritten with the marks in the pruned library.  The Combined
+Symbol Independent Strategy (CSIS) method is used to match marks.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIpruned-libraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-a " n"
+Prune marks when their area is under or equal to the threshold,
+.IR n .
+The default value is\ 3.
+.TP
+.BI \-s " n"
+Prune marks when their width and height is under or equal to
+the threshold,
+.IR n .
+The default value is\ 0.
+.TP
+.BI \-Q
+Use a quicker method of pruning.  The number of iterations through the
+averaging and pruning processes is decreased.  This usually reduces
+time by a half, but compression ratios decrease.
+.TP
+.I libraryfile
+This specifies the name of the library file
+.TP
+.I pruned-libraryfile
+This specifies the name of the prune library, after duplicates and
+matches have been removed.  If this file is not specified, then
+.I libraryfile
+will be overwritten.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticprune.c	(revision 21083)
@@ -0,0 +1,393 @@
+/**************************************************************************
+ *
+ * mgticprune.c -- Program to prune a textual image library
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+#include "match.h"
+
+marklistptr *avglib = NULL;
+int avglibsize;
+int libsize = 0;
+
+
+void 
+usage ()
+{
+  fprintf (stderr, "usage:\n"
+    "\tmgticbuild [-a n]  [-s n]  [-Q]   libraryfile   [pruned-library]\n");
+  exit (1);
+}
+
+
+
+
+/* foreach list in the avglib[] array, an average mark is returned */
+marklistptr 
+average_library ()
+{
+  marklistptr librarylist;
+  int i;
+  marktype avgmark;
+
+  librarylist = NULL;
+  for (i = 0; i < libsize; i++)
+    {
+      if (avglib[i])
+	{
+	  marklist_average (avglib[i], &avgmark);
+	  avgmark.symnum = i;
+	  marklist_addcopy (&librarylist, avgmark);
+	}
+    }
+  return librarylist;
+}
+
+
+void 
+average_space_enlarge ()
+{
+  int j;
+
+  if (libsize >= avglibsize)
+    {
+      avglib = (marklistptr *) realloc (avglib, (avglibsize + 100) * sizeof (marklistptr));
+      if (!avglib)
+	error_msg ("mgticprune", "out of memory in reallocating..", "");
+      for (j = avglibsize; j < avglibsize + 100; j++)
+	avglib[j] = NULL;
+      avglibsize += 100;
+    }
+}
+
+
+/* for each mark in 'origlist', if it can't be matched with one in 
+   'librarylist', then add to the librarylist, and update the relevant
+   avglib[] position */
+void 
+greedy_add (marklistptr origlist, marklistptr * librarylist)
+{
+  marklistptr step, step_i;
+  int i, j, notfound;
+  marktype d_i;
+
+  for (i = 0, step_i = origlist; step_i; i++, step_i = step_i->next)
+    {
+      d_i = step_i->data;
+
+      notfound = 1;
+      for (j = 0, step = *librarylist; step; j++, step = step->next)
+	{
+	  if (NOT_SCREENED (d_i, step->data))
+	    if (MATCH (&d_i, &step->data) < MATCH_VAL)
+	      {
+		d_i.symnum = j;
+		marklist_addcopy (&avglib[j], d_i);
+		notfound = 0;
+		break;
+	      }
+	}
+
+      if (notfound)
+	{
+	  d_i.symnum = libsize;
+	  marklist_addcopy (librarylist, d_i);
+	  marklist_addcopy (&avglib[libsize], d_i);
+	  libsize++;
+	  if (libsize >= avglibsize)
+	    average_space_enlarge ();
+	}
+    }
+}
+
+
+
+/* for each mark in 'library', if another matches with it, remove
+   one copy from the library, and erase the relevant avglib[] */
+void 
+greedy_prune (marklistptr * library)
+{
+  int count;
+  int i, j;
+  marklistptr step;
+  marktype d;
+
+  count = marklist_length (*library);
+  /* an invariant, all marks <i have been kept in the pruned library */
+  for (i = 0; i < count; i++)
+    {
+      marklist_getat (*library, i, &d);
+
+      for (j = 0, step = *library; j < i; j++, step = step->next)
+	{
+	  if (NOT_SCREENED (d, step->data))
+	    if (MATCH (&d, &step->data) < MATCH_VAL)
+	      {
+		/* [i,d] has matched with library element [j,d2]. */
+		marklist_removeat (library, i);		/* because we kill it here */
+		marklist_free (&avglib[d.symnum]);
+		avglib[d.symnum] = NULL;
+		i--, count--;
+		break;
+	      }
+	}
+    }
+}
+
+
+void 
+prune_on_size (marklistptr * list, int sizethres)
+{
+  int count, i;
+  marktype d;
+
+  if (sizethres)
+    {
+      count = marklist_length (*list);
+      i = 0;
+      do
+	{
+	  marklist_getat (*list, i, &d);
+	  if ((d.w <= sizethres) && (d.h <= sizethres))
+	    {
+	      marklist_removeat (list, i);
+	      i--;
+	      count--;
+	    }
+	  i++;
+	}
+      while (i < count);
+    }
+}
+
+
+
+void 
+prune_on_area (marklistptr * list, int areathres)
+{
+  int count, i;
+  marktype d;
+
+  if (areathres)
+    {
+      count = marklist_length (*list);
+      i = 0;
+      do
+	{
+	  marklist_getat (*list, i, &d);
+	  if (d.set <= areathres)
+	    {
+	      marklist_removeat (list, i);
+	      i--;
+	      count--;
+	    }
+	  i++;
+	}
+      while (i < count);
+    }
+}
+
+
+void 
+averagedout_addagain (marklistptr origlist, marklistptr * librarylist)
+{
+  marklistptr step, stepi;
+  int notfound;
+  int i, j;
+
+  for (i = 0, step = origlist; step; i++, step = step->next)
+    {
+      notfound = 1;
+
+      for (j = 0, stepi = *librarylist; stepi; j++, stepi = stepi->next)
+	if (NOT_SCREENED (step->data, stepi->data))
+	  if (MATCH (&step->data, &stepi->data) < MATCH_VAL)
+	    {
+	      notfound = 0;
+	      break;
+	    }
+
+      if (notfound)
+	{
+	  marklist_addcopy (librarylist, step->data);
+	  marklist_addcopy (&avglib[libsize], step->data);
+	  libsize++;
+	  if (libsize >= avglibsize)
+	    average_space_enlarge ();
+	}
+    }
+}
+
+
+
+
+
+void 
+main (int argc, char *args[])
+{
+  int i;
+  FILE *lib;
+
+  marklistptr origlist = NULL, librarylist = NULL;
+  marklistptr step;
+  char tempn[1000], sysstr[1000];
+  int count;
+  char *libraryname = NULL, *prunename = NULL;
+  int sizethres = 3, areathres = 0;
+  int pass;
+  int num_passes = 3;
+  int overwrite = 0;
+
+  V = 0;
+
+  if (argc < 2)
+    usage ();
+
+  for (i = 1; i < argc; i++)
+    {
+      if (!strcmp (args[i], "-v"))
+	V = 1;
+      else if (!strcmp (args[i], "-h"))
+	usage ();
+      else if (!strcmp (args[i], "-Q"))
+	{
+	  num_passes = 0;
+	}
+      else if (!strcmp (args[i], "-s"))
+	{
+	  i++;
+	  if ((i < argc) && (isinteger (args[i])))
+	    sizethres = atoi (args[i]);
+	  else
+	    error_msg (args[0], "follow the -s option with a numeric arg >=0", "");
+	}
+      else if (!strcmp (args[i], "-a"))
+	{
+	  i++;
+	  if ((i < argc) && (isinteger (args[i])))
+	    areathres = atoi (args[i]);
+	  else
+	    error_msg (args[0], "follow the -a option with a numeric arg >=0", "");
+	}
+      else if (args[i][0] == '-')
+	error_msg (args[0], "unknown switch:", args[i]);
+      else if (!libraryname)
+	libraryname = args[i];
+      else if (!prunename)
+	prunename = args[i];
+      else
+	error_msg (args[0], "too many filenames", "");
+    }
+
+  if (!libraryname)
+    error_msg (args[0], "please specify a library file", "");
+
+  if (V)
+    fprintf (stderr, "%s: processing...\n", args[0]);
+
+  overwrite = 0;
+  if (!prunename)
+    {
+      prunename = libraryname;
+      if (V)
+	fprintf (stderr, "overwriting previous library file.\n");
+      overwrite = 1;
+    }
+
+  if (overwrite)
+    {
+      tmpnam (tempn);
+    }
+  else
+    strcpy (tempn, prunename);
+
+
+  avglibsize = count = read_library (libraryname, &origlist);
+  if (V)
+    fprintf (stderr, "%d marks...", count);
+
+  avglib = (marklistptr *) malloc (count * sizeof (marklistptr));
+  if (!avglib)
+    error_msg (args[0], "out of memory", "");
+  for (i = 0; i < avglibsize; i++)
+    avglib[i] = NULL;
+
+
+  prune_on_size (&origlist, sizethres);
+
+  prune_on_area (&origlist, areathres);
+  if (V)
+    fprintf (stderr, "after threshold pruning, %d marks\n", count = marklist_length (origlist));
+
+
+  if (V)
+    fprintf (stderr, "starting greedy library creation...\n");
+
+  greedy_add (origlist, &librarylist);
+
+
+  for (pass = 0; pass < num_passes; pass++)
+    {
+      marklist_free (&librarylist);
+      if (V)
+	fprintf (stderr, "averaging...\n");
+      librarylist = average_library ();
+      averagedout_addagain (origlist, &librarylist);
+      greedy_prune (&librarylist);
+      if (V)
+	fprintf (stderr, "after pass %d greedy prune %d marks\n", 1 + pass, marklist_length (librarylist));
+    }
+
+
+  lib = fopen (tempn, "wb");
+  if (lib == NULL)
+    error_msg (args[0], "trouble creating prune-library file.", "");
+
+
+  if (V)
+    fprintf (stderr, "writing to file: %s...", prunename);
+  for (step = librarylist, count = 0; step; step = step->next, count++)
+    {
+      step->data.symnum = count;
+      write_library_mark (lib, step->data);
+    }
+
+  if (V)
+    fprintf (stderr, "%d marks.\n", count);
+  fclose (lib);
+
+  if (overwrite)
+    {
+      sprintf (sysstr, "mv %s %s", tempn, prunename);
+      system (sysstr);		/* move temp to proper name */
+    }
+
+  for (i = 0; i < avglibsize; i++)
+    {
+      marklist_free (&avglib[i]);
+      free (avglib[i]);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.1	(revision 21083)
@@ -0,0 +1,57 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgticstat 1 \*(Dt CITRI
+.SH NAME
+mgticstat \- displays the statistics for the library
+.SH SYNOPSIS
+.B mgticstat
+[
+.B \-h
+]
+.I libraryfile
+.SH DESCRIPTION
+.B mgticstat
+displays statistics about the
+.I libraryfile
+file.
+The output of this program contains the average mark size, average
+centroid position, and the number of marks with an area less than or
+equal to a few powers of\ 2.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fIlibraryfile\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.I libraryfile
+This specifies the name of the library file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/mgticstat.c	(revision 21083)
@@ -0,0 +1,130 @@
+/**************************************************************************
+ *
+ * mgticstat.c -- Program to print out stats about a textual image library
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+
+void 
+usage ()
+{
+  fprintf (stderr, "usage:\n"
+	   "\tmgticstat   libraryfile\n");
+  exit (1);
+}
+
+void 
+main (int argc, char *args[])
+{
+  FILE *lib, *outf = (stdout);
+  int count;
+  int small1, small2, small4, small9, small16, small25, small36, small49,
+    small64, small81, small100;
+  marktype d;
+  int avx, avy;
+  int hhh, www, i;
+  int avruns_h = 0, avruns_v = 0;
+  int av_area = 0;
+  char *libraryname = NULL;
+
+
+  if (argc < 2)
+    usage ();
+
+  for (i = 1; i < argc; i++)
+    {
+      if (!strcmp (args[i], "-v"))
+	V = 1;
+      else if (!strcmp (args[i], "-h"))
+	usage ();
+      else if (args[i][0] == '-')
+	error_msg (args[0], "unknown switch:", args[i]);
+      else if (!libraryname)
+	libraryname = args[i];
+      else
+	error_msg (args[0], "too many filenames", "");
+    }
+
+  if (!libraryname)
+    error_msg (args[0], "please specify a library file", "");
+
+
+  lib = fopen (libraryname, "r");
+  if (lib == NULL)
+    error_msg (args[0], "Trouble opening library file", "");
+
+  count = 0;
+  small1 = small2 = small4 = small9 = small16 = small25 = small36 = small49 = small64 = small81 = small100 = 0;
+  avx = avy = 0;
+  www = hhh = 0;
+  while (!isEOF (lib))
+    {
+      if (!read_library_mark (lib, &d))
+	error_msg (args[0], "error in library file", "");
+
+      av_area += d.set;
+      if (d.set <= 1)
+	small1++;
+      if (d.set <= 2)
+	small2++;
+      if (d.set <= 4)
+	small4++;
+      if (d.set <= 9)
+	small9++;
+      if (d.set <= 16)
+	small16++;
+      if (d.set <= 25)
+	small25++;
+      if (d.set <= 36)
+	small36++;
+      if (d.set <= 49)
+	small49++;
+      if (d.set <= 64)
+	small64++;
+      if (d.set <= 81)
+	small81++;
+      if (d.set <= 100)
+	small100++;
+      avx += d.xcen;
+      avy += d.ycen;
+      www += d.w;
+      hhh += d.h;
+      avruns_h += d.h_runs;
+      avruns_v += d.v_runs;
+      pbm_freearray (&d.bitmap, d.h);
+      count++;
+      if (count % 5000 == 0)
+	fprintf (outf, "%dk ", count / 1000);
+    }
+  fprintf (outf, "number of marks=%d\n", count);
+  fprintf (outf, "average area=%d\n", av_area / count);
+  fprintf (outf, "area <=1:%d, <=2:%d, <=4:%d, <=9:%d, <=16:%d, <=25:%d, <=36:%d, <=49:%d, <=64:%d, <=81:%d, <=100:%d\n", small1, small2, small4, small9, small16, small25, small36, small49, small64, small81, small100);
+
+  fprintf (outf, "average num runs, horizontal=%d, vertical=%d\n", avruns_h / count, avruns_v / count);
+  fprintf (outf, "average centroid position=(%d,%d)\n", avx / count, avy / count);
+  fprintf (outf, "average width=%d, average height=%d\n", www / count, hhh / count);
+  fclose (lib);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/model.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/model.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/model.h	(revision 21083)
@@ -0,0 +1,92 @@
+/**************************************************************************
+ *
+ * model.h -- Part pf PPM data compression
+ * Copyright (C) 1987  Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#define defaultkbytes	896
+#define minkbytes	56
+#define maxkbytes	((65536/1024)*sizeof(eventnode))
+
+#ifndef increment
+#define	increment	8
+#endif
+#ifndef halveat
+#define halveat		64
+#endif
+#define maxtotalcnt 	(increment*halveat)
+
+typedef int boolean;
+#define false           0
+#define true            1
+
+typedef short event;
+typedef unsigned short point;
+
+typedef struct
+  {
+    short totalcnt;
+    short notfound;
+    point list;			/* list storing the event records */
+  }
+eventset;
+
+typedef struct
+  {
+    event eventnum;
+    short count;
+    point next, prev;
+    eventset foll;
+  }
+eventnode, *eventptr;
+
+#define memsize		(kbytes*1024)
+#define maxnodes	(memsize/sizeof(eventnode))
+/* #define charsetsize     256 -- MAHE */
+#define nchars          (charsetsize+1)
+
+extern int charsetsize;		/* -- MAHE */
+
+extern eventptr E;
+extern long kbytes;
+extern point numnodes, nfreenodes;
+extern boolean excluded[];	/* -- MAHE */
+
+#define ENULL		(E)
+
+typedef unsigned u;
+#define p32(p)	(E+p)
+#define p16(p)	(p-E)
+
+/* in ppm.c */
+void write_model ();
+void encodestring ();
+void decodestring ();
+void encodefile ();
+void decodefile ();
+
+/* in lstevent.c */
+void write_method ();
+eventnode *encode_event_noex ();
+eventnode *decode_event_noex ();
+eventnode *encode_event ();
+eventnode *decode_event ();
+/* eventnode *addevent(); */
+eventnode *newnode ();
Index: /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.c	(revision 21083)
@@ -0,0 +1,288 @@
+/**************************************************************************
+ *
+ * pbmtools.c -- Routines for dealing with portable bitmap files (PBM)
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "pbmtools.h"
+#include "extractor.h"
+#include "utils.h"
+
+
+
+void 
+pbm_putpixel_range (Pixel ** bitmap, int c, int r, int val, int cols, int rows)
+{
+  if (((c) >= 0) && ((c) < cols) && ((r) >= 0) && ((r) < rows))
+    pbm_putpixel (bitmap, c, r, val);
+  else
+    fprintf (stderr, "putpitxel (%d %d) outside (%d %d)\n", c, r, cols, rows);
+}
+
+int 
+pbm_getpixel_range (Pixel ** bitmap, int c, int r, int cols, int rows)
+{
+  if (((c) >= 0) && ((c) < cols) && ((r) >= 0) && ((r) < rows))
+    return pbm_getpixel (bitmap, c, r);
+  else
+    {
+      fprintf (stderr, "getpixel (%d %d) outside (%d %d)\n", c, r, cols, rows);
+      return 0;
+    }
+}
+
+
+
+
+
+/*
+   Returns 1 if *fp points to a PBM (magic is P1 or P4) file.
+   leaves the fp in it's original position.
+   usage: if(pbm_isapbmfile(fp)) process(fp);
+ */
+int 
+pbm_isapbmfile (FILE * fp)
+{
+  u_long magic;
+
+  magic = getmagicno_short (fp);
+  if ((magic == MAGIC_P4) || (magic == MAGIC_P1))
+    return 1;
+  else
+    return 0;
+}
+
+
+/*
+   Frees the memory used in the bitmap structure.
+   usage: pbm_freearray(&bitmap);
+   Sets bitmap to be NULL on return.
+ */
+void 
+pbm_freearray (Pixel *** bitmap, int rows)
+{
+  int r;
+  if (rows == 0)
+    rows++;
+  for (r = 0; r < rows; r++)
+    free ((*bitmap)[r]);
+  free (*bitmap);
+  (*bitmap) = NULL;
+}
+
+
+/*
+   This function allocates the bitmap.
+   usage: bitmap=pbm_allocarray(cols,rows);
+ */
+Pixel **
+pbm_allocarray (int cols, int rows)
+{
+  Pixel **p;
+  int i, newc = (cols + PBITS) / PBITS;
+
+  if (cols == 0)
+    cols++;
+  if (rows == 0)
+    rows++;
+  p = (Pixel **) malloc (rows * sizeof (Pixel *));
+  if (p == NULL)
+    error_msg ("pbm_allocarray", "out of memory", "");
+  for (i = 0; i < rows; i++)
+    {
+      p[i] = (Pixel *) calloc (newc, sizeof (Pixel));
+      if (p[i] == NULL)
+	error_msg ("pbm_allocarray", "out of memory", "");
+    }
+  return p;
+}
+
+
+
+Pixel **
+pbm_copy (Pixel ** bitmap, int cols, int rows)
+{
+  Pixel **p;
+  int newc = (cols + PBITS) / PBITS;
+  int x, y;
+
+  p = pbm_allocarray (cols, rows);
+  for (x = 0; x < newc; x++)
+    for (y = 0; y < rows; y++)
+      p[y][x] = bitmap[y][x];
+  return p;
+}
+
+
+
+
+/*
+   Reads in a pbm file and returns a pointer to the allocated bitmap, 
+   in the P4 format.
+   Assumes fp was opened and keeps it that way.
+   usage: bitmap=pbm_readfile(fp,&cols,&rows);
+ */
+Pixel **
+pbm_readfile (FILE * fp, int *cols, int *rows)
+{
+  Pixel **p = NULL;
+  char s[100];
+  unsigned char *buf;
+  int r, c, ii = 0;
+  int p1 = 0;
+  int arg;
+
+
+  do
+    {
+      readline (s, fp);
+    }
+  while (s[0] == '#');
+
+  if (strcmp (s, "P1") == 0)
+    p1 = 1;
+  else if (strcmp (s, "P4") == 0)
+    p1 = 0;
+  else
+    error_msg ("pbm_readfile", "only pbm files are supported", "");
+
+  do
+    {
+      readline (s, fp);
+    }
+  while (s[0] == '#');
+
+  arg = sscanf (s, "%d %d", cols, rows);
+  if (arg == 1)
+    {
+      readline (s, fp);
+      arg = sscanf (s, "%d", rows);
+      if (arg != 1)
+	error_msg ("pbm_readfile", "bizzare pbm format", "");
+    }
+  p = pbm_allocarray (*cols, *rows);
+  buf = (unsigned char *) malloc ((*cols + 2) * sizeof (unsigned char));
+  if (!buf)
+    error_msg ("pbm_readfile", "out of memory", "");
+
+  if (p1)
+    {
+      for (r = 0; r < *rows; r++)
+	for (c = 0; c < *cols; c++)
+	  {
+	    fscanf (fp, "%d", &ii);
+	    pbm_putpixel (p, c, r, ii);
+	  }
+    }
+  else
+    {
+      for (r = 0; r < *rows; r++)
+	{
+	  c = 0;
+	  fread (buf, 1, (*cols + 7) / 8, fp);
+	  for (c = 0; c < *cols; c++)
+	    {
+	      if (!(c % 8))
+		ii = buf[c / 8];
+	      if (ii < 0)
+		error_msg ("pbm_readfile", "file reading error", "");
+	      pbm_putpixel (p, c, r, (ii & 128) ? 1 : 0);
+	      ii <<= 1;
+	    }
+	}
+    }				/* p4 type */
+  free (buf);
+  return p;
+}
+
+
+/*
+   Writes a pbm file given a file pointer and bitmap. Assumes that
+   fp is already open, and keeps in that way.
+   usage: pbm_writefile(fp,bitmap,cols,rows);
+ */
+void 
+pbm_writefile (FILE * fp, Pixel ** bitmap, int cols, int rows)
+{
+  int r, c, ii = 0, j;
+  unsigned char *buf;
+
+  buf = (unsigned char *) malloc (((cols + 14) / 8) * sizeof (unsigned char));
+
+  fprintf (fp, "%s\n", "P4");
+  fprintf (fp, "%d %d\n", cols, rows);
+
+  for (r = 0; r < rows; r++)
+    {
+      for (c = 0; c < cols; c += 8)
+	{
+	  ii = 0;
+	  for (j = 0; j < 8; j++)
+	    if (c + j < cols)
+	      {
+		if (pbm_getpixel (bitmap, c + j, r))
+		  ii |= (128 >> j);
+	      }
+	  buf[c / 8] = ii;
+	}
+      fwrite (buf, 1, (cols + 7) / 8, fp);
+    }
+  free (buf);
+/*      putc('\n',fp);   if this line is included programs don't say things like 'short image' &c, but then again,
+   in most cases a 'cmp' between the original will fail because of the last byte...sigh, "standards". */
+}
+
+#define BUF_SIZE 131072
+char buffer[BUF_SIZE];
+
+void 
+pbm_writenamedfile (char fn[], Pixel ** bitmap, int cols, int rows)
+{
+  FILE *tempfp;
+
+  tempfp = fopen (fn, "wb");
+  if (tempfp == NULL)
+    error_msg ("pbm_writenamedfile", "can't open file:", fn);
+  setbuffer (tempfp, buffer, BUF_SIZE);
+  pbm_writefile (tempfp, bitmap, cols, rows);
+  fclose (tempfp);
+}
+
+
+
+Pixel **
+pbm_readnamedfile (char fn[], int *cols, int *rows)
+{
+  FILE *tempfp;
+  Pixel **temp;
+
+  tempfp = fopen (fn, "rb");
+  if (tempfp == NULL)
+    return NULL;
+  setbuffer (tempfp, buffer, BUF_SIZE);
+
+  temp = pbm_readfile (tempfp, cols, rows);
+
+  fclose (tempfp);
+  return temp;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/pbmtools.h	(revision 21083)
@@ -0,0 +1,86 @@
+/**************************************************************************
+ *
+ * pbmtools.h -- Routines for dealing with portable bitmap files (PBM)
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __PBMTOOLS_H
+#define __PBMTOOLS_H
+
+#include "sysfuncs.h"
+#include "basictypes.h"
+
+#include "utils.h"
+#include "marklist.h"
+
+#define PBITS 32
+#define PSH 5
+
+
+/* The next two are ordered pixels col0=left, cols31=right */
+
+/*
+   #define pbm_getpixel(bitmap,c,r)  \
+   ((bitmap[r][(c)>>PSH] >> ((PBITS-1)-((c)&(PBITS-1))))&1)
+   #define pbm_putpixel(bitmap,c,r,val) \
+   if((val))  \
+   bitmap[r][(c)>>PSH] |=  (((unsigned)1<<(PBITS-1)) >> ((c)&(PBITS-1))); \
+   else \
+   bitmap[r][(c)>>PSH] &= ~(((unsigned)1<<(PBITS-1)) >> ((c)&(PBITS-1))) 
+ */
+
+
+
+
+/* The next two defines are ordered pixel cols0=right, cols31=left */
+
+#define pbm_getpixel(bitmap,c,r)                            \
+         ((bitmap[r][(c)>>PSH] >> ((c)&(PBITS-1)))&1)
+#define pbm_putpixel(bitmap,c,r,val)                        \
+         if((val))                                          \
+              bitmap[r][(c)>>PSH] |= (1<<((c)&(PBITS-1)));  \
+         else                                               \
+              bitmap[r][(c)>>PSH] &= ~(1<<((c)&(PBITS-1)))
+
+
+#define pbm_putpixel_trunc(bitmap,c,r,val,cols,rows) \
+       if(((c)>=0)&&((c)<cols)&&((r)>=0)&&((r)<rows)) \
+             pbm_putpixel(bitmap,c,r,val)
+
+#define pbm_getpixel_trunc(bitmap,c,r,cols,rows)       \
+       ((((c)>=0)&&((c)<cols)&&((r)>=0)&&((r)<rows)) ?  \
+             pbm_getpixel(bitmap,c,r) : 0)
+
+
+
+
+int pbm_isapbmfile (FILE * fp);
+void pbm_freearray (Pixel *** bitmap, int rows);
+Pixel **pbm_copy (Pixel ** bitmap, int cols, int rows);
+Pixel **pbm_allocarray (int cols, int rows);
+Pixel **pbm_readfile (FILE * fp, int *cols, int *rows);
+Pixel **pbm_readnamedfile (char fn[], int *cols, int *rows);
+void pbm_writefile (FILE * fp, Pixel ** bitmap, int cols, int rows);
+void pbm_writenamedfile (char fn[], Pixel ** bitmap, int cols, int rows);
+
+void pbm_putpixel_range (Pixel ** bitmap, int c, int r, int val, int cols, int rows);
+int pbm_getpixel_range (Pixel ** bitmap, int c, int r, int cols, int rows);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/ppm.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/ppm.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/ppm.c	(revision 21083)
@@ -0,0 +1,585 @@
+/**************************************************************************
+ *
+ * ppm.c -- PPM data compression
+ * Copyright (C) 1987  Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "arithcode.h"
+#include "model.h"
+
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:33  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:33:55  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:42:02  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+/* FIXEDORDER sets the maximum context length that will be used.
+   Making FIXEDORDER large increases the compression if there is enough
+   space to store the model, but when space limit is reached increasing
+   FIXEDORDER will decrease compression because of model thrashing.
+   Third order (FIXEDORDER=3) is suitable for a few hundred Kb of model
+   space, FIXEDORDER=1 is suitable for a few tens of kB.
+   This version requires that FIXEDORDER be a preprocessor rather
+   than runtime variable to allow loops to be unrolled and make for faster
+   execution. Maximum in this implementation is 3 */
+
+#ifndef FIXEDORDER
+#define FIXEDORDER	3
+#endif
+
+/* global variables */
+eventptr E = NULL;		/* array of eventnodes */
+point numnodes = 0, nfreenodes = 0;
+long kbytes = defaultkbytes;
+/*boolean               excluded[nchars]={false};  - MAHE */
+boolean excluded[16384] =
+{false};			/* excluded characters */
+
+/* local variables */
+#define defaultchunksize        4096	/* compression chunks */
+
+#define EOSchar         (charsetsize)
+
+unsigned chunksize = defaultchunksize;
+eventptr s[FIXEDORDER + 1] =
+{NULL},				/* current contexts */
+  t[FIXEDORDER + 1] =
+{NULL};				/* new contexts */
+
+#if (FIXEDORDER==3)
+#define SHIFT_ST	s[1] = t[0]; s[2] = t[1] ; s[3] = t[2]
+#else
+#if (FIXEDORDER==2)
+#define SHIFT_ST	s[1] = t[0]; s[2] = t[1]
+#else
+#if (FIXEDORDER==1)
+#define SHIFT_ST	s[1] = t[0]
+#else
+#define SHIFT_ST
+#endif
+#endif
+#endif
+
+/* follow a character list and set the exclusions */
+#define SET_EX(p)				\
+do						\
+{	register eventptr q;			\
+	q = p32((p32(p))->next);		\
+	for (; q!=ENULL; q=p32(q->next))	\
+		excluded[q->eventnum] = true;	\
+}						\
+while (false)
+
+/* clear the exclusions */
+#define CLEAR_EX(p)				\
+do						\
+{	register eventptr q;			\
+	q = p32((p32(p))->next);		\
+	for (; q!=ENULL; q=p32(q->next))	\
+		excluded[q->eventnum] = false;	\
+}						\
+while (false)
+
+/*==================================*/
+
+void
+write_model ()
+{
+  fprintf (stderr, "ppm");
+  write_method ();
+#ifdef NOEXCLUSIONS
+  fprintf (stderr, "nx");
+#endif
+  fprintf (stderr, "-o%1d", FIXEDORDER);
+  fprintf (stderr, "-k%ld", kbytes);
+}
+
+/*==================================*/
+
+void
+encode_in_order (n, e)
+     int n;
+     event e;
+/* encode character e in order n */
+{
+  boolean encoded;
+  int i, c;
+  t[n] = encode_event_noex (&s[n]->foll, e, &encoded);
+  if (encoded)
+    c = n;
+  else
+    for (c = n - 1; c >= 0; c--)
+      {
+#ifdef NOEXCLUSIONS
+	t[c] = encode_event_noex (&s[c]->foll, e, &encoded);
+#else
+	SET_EX (s[c + 1]->foll.list);
+	t[c] = encode_event (&s[c]->foll, e, &encoded);
+#endif
+	if (encoded)
+	  break;
+      }
+  if (!encoded)
+    arithmetic_encode (e, e + 1, nchars);
+  for (i = c + 1; i <= n; i++)
+    if (i > 0)
+      t[i]->prev = p16 (t[i - 1]);
+    else
+      t[0]->prev = p16 (s[0]);
+  for (i = c - 1; i >= 0; i--)
+    t[i] = p32 (t[i + 1]->prev);
+#ifndef NOEXCLUSIONS
+  if (c != n)
+    CLEAR_EX (s[c + 1]->foll.list);
+#endif
+  SHIFT_ST;
+}
+
+/*==================================*/
+
+/* not required in this version */
+
+#if 0
+
+void
+decode_in_order (n, e)
+     int n;
+     event *e;
+{
+  boolean decoded;
+  int i, c;
+  t[n] = decode_event_noex (&s[n]->foll, &decoded, e);
+  if (decoded)
+    c = n;
+  else
+    for (c = n - 1; c >= 0; c--)
+      {
+#ifdef NOEXCLUSIONS
+	t[c] = decode_event_noex (&s[c]->foll, &decoded, e);
+#else
+	SET_EX (s[c + 1]->foll.list);
+	t[c] = decode_event (&s[c]->foll, &decoded, e);
+#endif
+	if (decoded)
+	  break;
+      }
+  if (!decoded)
+    {
+      *e = arithmetic_decode_target (nchars);
+      arithmetic_decode (*e, *e + 1, nchars);
+    }
+  for (i = c + 1; i <= n; i++)
+    {
+      t[i]->eventnum = *e;
+      if (i > 0)
+	t[i]->prev = p16 (t[i - 1]);
+      else
+	t[0]->prev = p16 (s[0]);
+    }
+  {
+    register int i;
+    for (i = c - 1; i >= 0; i--)
+      t[i] = p32 (t[i + 1]->prev);
+  }
+#ifndef NOEXCLUSIONS
+  if (c != n)
+    CLEAR_EX (s[c + 1]->foll.list);
+#endif
+  SHIFT_ST;
+}
+
+#endif
+
+/*==================================*/
+
+void
+start_model ()
+{
+  int i;
+  /* is this the first call? */
+  if (E == NULL)
+    E = (eventptr) malloc ((unsigned) kbytes * 1024);
+  /* start off with no information */
+  numnodes = 0;
+  nfreenodes = maxnodes;
+  for (i = 0; i <= FIXEDORDER; i++)
+    {
+      s[i] = newnode (NULL);
+      if (i > 0)
+	s[i]->prev = p16 (s[i - 1]);
+    }
+}
+
+/*==================================*/
+
+void
+encodestring (str, n)
+     unsigned short *str;
+     int n;
+/* encode all n characters of the supplied string str */
+{
+  event e;
+  boolean encoded;
+  register eventptr S, T;
+  int i;
+#ifndef NOEXCLUSIONS
+  register eventptr Sex;
+#endif
+
+  if (E == NULL)
+    start_model ();
+  /* set the initial context node */
+  S = s[FIXEDORDER];
+
+  for (i = 0; i < n; i++)
+    {
+      /* encode one character */
+      e = *str++;
+      /* this next monstrosity is logically equivalent to 
+         encode_in_order(FIXEDORDER,e)
+         the loop has been unrolled to make it all go faster */
+      for (;;)
+	{
+	  T = encode_event_noex (&S->foll, e, &encoded);
+	  if (encoded)
+	    break;
+	  t[FIXEDORDER] = T;
+
+#ifdef NOEXCLUSIONS
+#if (FIXEDORDER>2)
+	  S = p32 (S->prev);
+	  t[2] = encode_event_noex (&S->foll, e, &encoded);
+	  t[3]->prev = p16 (t[2]);
+	  if (encoded)
+	    break;
+#endif
+
+#if (FIXEDORDER>1)
+	  S = p32 (S->prev);
+	  t[1] = encode_event_noex (&S->foll, e, &encoded);
+	  t[2]->prev = p16 (t[1]);
+	  if (encoded)
+	    break;
+#endif
+
+#if (FIXEDORDER>0)
+	  S = p32 (S->prev);
+	  t[0] = encode_event_noex (&S->foll, e, &encoded);
+	  t[1]->prev = p16 (t[0]);
+	  if (encoded)
+	    break;
+#endif
+#else
+#if (FIXEDORDER>2)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[2] = encode_event (&S->foll, e, &encoded);
+	  t[3]->prev = p16 (t[2]);
+	  if (encoded)
+	    {
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>1)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[1] = encode_event (&S->foll, e, &encoded);
+	  t[2]->prev = p16 (t[1]);
+	  if (encoded)
+	    {
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>0)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[0] = encode_event (&S->foll, e, &encoded);
+	  t[1]->prev = p16 (t[0]);
+	  if (encoded)
+	    {
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+	  CLEAR_EX (Sex->foll.list);
+#endif
+#endif
+
+	  arithmetic_encode (e, e + 1, nchars);
+	  t[0]->prev = p16 (s[0]);
+	  break;
+	}
+      /* phew! Update the current context to the latest node */
+      S = p32 (T->prev);
+
+      /* is there a danger of running out of space? */
+      if (nfreenodes <= FIXEDORDER)
+	{
+	  start_model ();
+	  S = s[FIXEDORDER];
+	}
+    }
+
+  /* save the current contexts for the various order submodels */
+  s[FIXEDORDER] = S;
+  for (i = FIXEDORDER; i > 0; i--)
+    s[i - 1] = p32 (s[i]->prev);
+  /* and send the terminator character */
+  encode_in_order (FIXEDORDER, EOSchar);
+  /* and check the space again */
+  if (nfreenodes <= FIXEDORDER)
+    start_model ();
+}
+
+/*==================================*/
+
+void
+decodestring (str, n)
+     unsigned short *str;
+     int *n;
+{
+  event e;
+  boolean decoded;
+  register eventptr S, T;
+#ifndef NOEXCLUSIONS
+  register eventptr Sex;
+#endif
+
+  /* just mimic the corresponding encoding actions */
+  if (E == NULL)
+    start_model ();
+  S = s[FIXEDORDER];
+
+  *n = 0;
+  for (;;)
+    {				/* logically equivalent to "decode_in_order(FIXEDORDER,&e)" */
+
+      for (;;)
+	{
+	  T = decode_event_noex (&S->foll, &decoded, &e);
+	  if (decoded)
+	    break;
+	  t[FIXEDORDER] = T;
+
+#ifdef NOEXCLUSIONS
+#if (FIXEDORDER>2)
+	  S = p32 (S->prev);
+	  t[2] = decode_event_noex (&S->foll, &decoded, &e);
+	  t[3]->prev = p16 (t[2]);
+	  if (decoded)
+	    {
+	      t[3]->eventnum = e;
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>1)
+	  S = p32 (S->prev);
+	  t[1] = decode_event_noex (&S->foll, &decoded, &e);
+	  t[2]->prev = p16 (t[1]);
+	  if (decoded)
+	    {
+#if (FIXEDORDER>2)
+	      t[3]->eventnum =
+#endif
+		t[2]->eventnum = e;
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>0)
+	  S = p32 (S->prev);
+	  t[0] = decode_event_noex (&S->foll, &decoded, &e);
+	  t[1]->prev = p16 (t[0]);
+	  if (decoded)
+	    {
+#if (FIXEDORDER>2)
+	      t[3]->eventnum =
+#endif
+#if (FIXEDORDER>1)
+		t[2]->eventnum =
+#endif
+		t[1]->eventnum = e;
+	      break;
+	    }
+#endif
+#else
+#if (FIXEDORDER>2)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[2] = decode_event (&S->foll, &decoded, &e);
+	  t[3]->prev = p16 (t[2]);
+	  if (decoded)
+	    {
+	      t[3]->eventnum = e;
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>1)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[1] = decode_event (&S->foll, &decoded, &e);
+	  t[2]->prev = p16 (t[1]);
+	  if (decoded)
+	    {
+#if (FIXEDORDER>2)
+	      t[3]->eventnum =
+#endif
+		t[2]->eventnum = e;
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+#endif
+
+#if (FIXEDORDER>0)
+	  Sex = S;
+	  SET_EX (Sex->foll.list);
+	  S = p32 (S->prev);
+	  t[0] = decode_event (&S->foll, &decoded, &e);
+	  t[1]->prev = p16 (t[0]);
+	  if (decoded)
+	    {
+#if (FIXEDORDER>2)
+	      t[3]->eventnum =
+#endif
+#if (FIXEDORDER>1)
+		t[2]->eventnum =
+#endif
+		t[1]->eventnum = e;
+	      CLEAR_EX (Sex->foll.list);
+	      break;
+	    }
+	  CLEAR_EX (Sex->foll.list);
+#endif
+#endif
+
+	  e = arithmetic_decode_target (nchars);
+	  arithmetic_decode (e, e + 1, nchars);
+#if (FIXEDORDER>2)
+	  t[3]->eventnum =
+#endif
+#if (FIXEDORDER>1)
+	    t[2]->eventnum =
+#endif
+#if (FIXEDORDER>0)
+	    t[1]->eventnum =
+#endif
+	    t[0]->eventnum = e;
+	  t[0]->prev = p16 (s[0]);
+	  break;
+	}
+      S = p32 (T->prev);
+
+      /* check the space requirements */
+      if (nfreenodes <= FIXEDORDER)
+	{
+	  start_model ();
+	  S = s[FIXEDORDER];
+	}
+      /* are we done?  or do we save the char */
+      if (e == EOSchar)
+	break;
+      *str++ = e;
+      (*n)++;
+    }
+  s[FIXEDORDER] = S;
+}
+
+
+#if 0				/* Writing my own version of this - MAHE */
+void
+encodefile ()
+/* encodes a file by breaking into a sequence of fixed length chunks */
+{
+  unsigned char *str;
+  int c, n = 0;
+
+  str = (unsigned char *) malloc ((unsigned) chunksize);
+  startoutputingbits ();
+  startencoding ();
+
+  /* to encode the file, break it into chunks and encode the
+     chunks one by one */
+  while ((c = getchar ()) != EOF)
+    {
+      str[n++] = c;
+      if (n == chunksize)
+	{
+	  encodestring (str, n);
+	  rawbytes += n;
+	  n = 0;
+	}
+    }
+  /* send final partial chunk */
+  if (n > 0)
+    {
+      encodestring (str, n);
+      rawbytes += n;
+    }
+  /* send EOF as an empty string */
+  encodestring (str, 0);
+  doneencoding ();
+  doneoutputingbits ();
+}
+
+void
+decodefile ()
+{
+  unsigned char *str;
+  int n, i;
+
+  str = (unsigned char *) malloc ((unsigned) chunksize);
+  startinputingbits ();
+  startdecoding ();
+  for (;;)
+    {
+      decodestring (str, &n);
+      if (n == 0)
+	break;
+      for (i = 0; i < n; i++)
+	putchar ((int) str[i]);
+      rawbytes += n;
+    }
+}
+
+#endif /* #if 0 */
Index: /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.c	(revision 21083)
@@ -0,0 +1,93 @@
+/**************************************************************************
+ *
+ * sortmarks.c -- Functions which sort the marks into a "readable sequence"
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "marklist.h"
+#include "sortmarks.h"
+
+#define GAP 4
+
+
+
+static int 
+CmpOnY (const void *e1, const void *e2)
+{
+  return (((marktype *) e1)->ycen * 0 + ((marktype *) e1)->ypos) -
+    (((marktype *) e2)->ycen * 0 + ((marktype *) e2)->ypos);
+}
+
+static int 
+CmpOnX (const void *e1, const void *e2)
+{
+  return (((marktype *) e1)->xcen * 0 + ((marktype *) e1)->xpos) -
+    (((marktype *) e2)->xcen * 0 + ((marktype *) e2)->xpos);
+}
+
+
+
+
+
+
+
+
+marklistptr 
+sortmarks (marklistptr listofmarks)
+{
+  marktype *table;
+  int count = 0;
+  int i, s, e;
+
+
+  table = calloc ((unsigned int) marklist_length (listofmarks), sizeof (marklisttype));
+
+  while (listofmarks)
+    {
+      table[count] = listofmarks->data;
+      marklist_removeat (&listofmarks, 0);
+      count++;
+    }
+
+  /* sort first on the y position of their centroids */
+  qsort ((void *) table, (unsigned int) (count), sizeof (*table), CmpOnY);
+
+  for (s = 0; s < count;)
+    {
+      int c;
+
+      for (e = s + 1, c = 0; (e < count) &&
+	   ((table[e].ypos + table[e].ycen * 0) - (table[e - 1].ypos + table[e - 1].ycen * 0) <= GAP); c++, e++);
+
+      if (e < count && c >= 1)
+	qsort (&table[s], (unsigned int) (e - s), sizeof (*table), CmpOnX);
+      s = e;
+    }
+
+  for (i = 0; i < count; i++)
+    {
+      table[i].symnum = i;
+      marklist_add (&listofmarks, table[i]);
+    }
+
+  return listofmarks;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/sortmarks.h	(revision 21083)
@@ -0,0 +1,30 @@
+/**************************************************************************
+ *
+ * sortmarks.h -- Functions which sort the marks into a "readable sequence"
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef _SortMarks_h_
+#define _SortMarks_h_
+
+marklistptr sortmarks (marklistptr listofmarks);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/images/utils.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/utils.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/utils.c	(revision 21083)
@@ -0,0 +1,270 @@
+/**************************************************************************
+ *
+ * utils.c -- Functions which are common utilities for the image programs
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "utils.h"
+
+
+int V = 0;
+
+
+int 
+isEOF (FILE * fp)
+{
+  int ch;
+
+  ch = getc (fp);
+  ungetc (ch, fp);
+  if (ch == EOF)
+    return 1;
+  return 0;
+}
+
+
+int 
+getmagicno_short (FILE * fp)
+{
+  int ch1, ch2;
+  ch1 = getc (fp);
+  if (ch1 == EOF)
+    {
+      ungetc (ch1, fp);
+      return 0;
+    }
+  ch2 = getc (fp);
+  if (ch2 == EOF)
+    {
+      ungetc (ch2, fp);
+      return 0;
+    }
+  ungetc (ch2, fp);
+  ungetc (ch1, fp);
+
+  return ((ch1 << 8) | ch2);
+}
+
+int 
+getmagicno_short_pop (FILE * fp)
+{
+  int ch1, ch2;
+  ch1 = getc (fp);
+  if (ch1 == EOF)
+    return 0;
+  ch2 = getc (fp);
+  if (ch2 == EOF)
+    return 0;
+
+  return ((ch1 << 8) | ch2);  
+}
+
+int 
+getmagicno_byte (FILE * fp)
+{
+  int ch1;
+  ch1 = getc (fp);
+  if (ch1 == EOF)
+    {
+      ungetc (ch1, fp);
+      return 0;
+    }
+  ungetc (ch1, fp);
+  return (ch1);
+}
+
+
+int 
+getmagicno_long (FILE * fp)
+{
+  int ch1, ch2, ch3, ch4;
+  ch1 = getc (fp);
+  if (ch1 == EOF)
+    {
+      ungetc (ch1, fp);
+      return 0;
+    }
+  ch2 = getc (fp);
+  if (ch2 == EOF)
+    {
+      ungetc (ch2, fp);
+      return 0;
+    }
+  ch3 = getc (fp);
+  if (ch3 == EOF)
+    {
+      ungetc (ch3, fp);
+      return 0;
+    }
+  ch4 = getc (fp);
+  if (ch4 == EOF)
+    {
+      ungetc (ch4, fp);
+      return 0;
+    }
+  ungetc (ch4, fp);
+  ungetc (ch3, fp);
+  ungetc (ch2, fp);
+  ungetc (ch1, fp);
+
+  return ((ch1 << 24) | (ch2 << 16) | (ch3 << 8) | (ch4));
+}
+
+
+
+
+void 
+error_msg (char *prog, char *message, char *extra)
+{
+  fprintf (stderr, "%s: %s %s\n", prog, message, extra);
+  exit (1);
+}
+
+void 
+warn (char *prog, char *message, char *extra)
+{
+  fprintf (stderr, "%s: %s %s\n", prog, message, extra);
+}
+
+
+
+void 
+readline (char str[], FILE * fp)
+{
+  int i = 0, ch;
+
+  while (((ch = fgetc (fp)) != '\n') && (!feof (fp)))
+    str[i++] = ch;
+  str[i] = '\0';
+}
+
+
+
+
+
+
+
+int 
+getint (FILE * fp)
+{
+  register char ch;
+  register unsigned int i = 0;
+
+  do
+    {
+      ch = getc (fp);
+      if (feof (fp))
+	return EOF;
+    }
+  while (ch < '0' || ch > '9');
+
+  do
+    {
+      i = i * 10 + ch - '0';
+      ch = getc (fp);
+      if (feof (fp))
+	return EOF;
+    }
+  while (ch >= '0' && ch <= '9');
+
+  return i;
+}
+
+/* get_header_int i.e. get an integer from a PNM header ; basically  
+   the same as
+   above except for comment checking ; above kept because of lower  
+   overhead */
+
+unsigned int 
+gethint (FILE * fp)
+{
+  register char ch, prev = '\0';
+  register unsigned int i = 0;
+
+  do
+    {
+      ch = getc (fp);
+      if ((ch == '#') && (prev == '\n'))
+	while (((ch = getc (fp)) != '\n') && !(feof (fp)));
+      prev = ch;
+      if (feof (fp))
+	return EOF;
+    }
+  while (ch < '0' || ch > '9');
+
+  do
+    {
+      i = i * 10 + ch - '0';
+      ch = getc (fp);
+      if (feof (fp))
+	return EOF;
+    }
+  while (ch >= '0' && ch <= '9');
+
+  return i;
+}
+
+
+
+
+void 
+magic_write (FILE * fp, u_long magic_num)
+{
+  HTONUL(magic_num);  /* [RPAP - Jan 97: Endian Ordering] */
+  if (fwrite (&magic_num, sizeof (magic_num), 1, fp) != 1)
+    error_msg ("magic num", "Couldn't write magic number.", "");
+}
+
+
+void 
+magic_check (FILE * fp, u_long magic_num)
+{
+  u_long magic;
+  if (fread (&magic, sizeof (magic), 1, fp) != 1 || NTOHUL(magic) != magic_num)  /* [RPAP - Jan 97: Endian Ordering] */
+    error_msg ("magic num", "Incorrect magic number.", "");
+}
+
+
+u_long 
+magic_read (FILE * fp)
+{
+  u_long magic;
+  if (fread (&magic, sizeof (magic), 1, fp) != 1)
+    error_msg ("magic num", "Couldn't read magic number.", "");
+  return NTOHUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+}
+
+
+
+
+int 
+isinteger (char s[])
+{
+  int i = 0;
+
+  for (i = 0; s[i] != '\0'; i++)
+    if (!isdigit (s[i]))
+      return 0;
+  return 1;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/images/utils.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/images/utils.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/images/utils.h	(revision 21083)
@@ -0,0 +1,75 @@
+/**************************************************************************
+ *
+ * utils.h -- Functions which are common utilities for the image programs
+ * Copyright (C) 1994  Stuart Inglis
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef __UTILS_H
+#define __UTILS_H
+
+#include "sysfuncs.h"
+
+extern int V;
+
+#define DEBUG
+
+#define min(a,b) ((a)<(b) ? (a) : (b))
+#define max(a,b) ((a)>(b) ? (a) : (b))
+
+#define GEN_MAGIC(a,b,c,d) ((unsigned long)(((a)<<24) + ((b)<<16) + \
+                                            ((c)<<8) + (d)))
+ 
+/* --- MG magic file codes [TS:Aug/95] --- */
+#define MAGIC_FELICS            GEN_MAGIC('M','G','F','X')
+#define MAGIC_BILEVEL           GEN_MAGIC('M','G','B','I')
+#define MAGIC_TIC               GEN_MAGIC('M','G','T','C')
+#define IS_MAGIC(a) ((((u_long)(a)) & 0xffff0000) == MAGIC_XXXX)
+/* --------------------------------------- */
+
+#define MAGIC_P1      0x5031	/* P1   - pbm */
+#define MAGIC_P2      0x5032	/* P2   - pgm */
+#define MAGIC_P3      0x5033	/* P3   - ppm */
+#define MAGIC_P4      0x5034	/* P4   - rawbits pbm */
+#define MAGIC_P5      0x5035	/* P5   - rawbits pgm */
+#define MAGIC_P6      0x5036	/* P6   - rawbits ppm */
+
+int isEOF (FILE * fp);
+int getmagicno_byte (FILE * fp);
+int getmagicno_short (FILE * fp);
+int getmagicno_short_pop (FILE * fp);
+int getmagicno_long (FILE * fp);
+
+
+
+void error_msg (char *prog, char *message, char *extra);
+void warn (char *prog, char *message, char *extra);
+
+void readline (char str[], FILE * fp);
+
+void magic_write (FILE * fp, u_long magic_num);
+void magic_check (FILE * fp, u_long magic_num);
+u_long magic_read (FILE * fp);
+/* kerry's code */
+
+int getint (FILE * fp);
+unsigned int gethint (FILE * fp);
+int isinteger (char s[]);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/Makefile.in	(revision 21083)
@@ -0,0 +1,152 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the MG system
+# Copyright (C) 1994  Neil Sharman
+#
+# 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.
+#
+#       @(#)Makefile.in	1.10 22 Mar 1994
+#
+###########################################################################
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+subdir = src/scripts
+top_srcdir = @top_srcdir@
+transform = @program_transform_name@
+GSDLOS = @gsdlos@
+ 
+DEFS = @DEFS@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+TOUCH = echo timestamp >
+ 
+bindir = ../../../../bin/$(GSDLOS)
+datadir = $(prefix)/share
+libexecdir = $(exec_prefix)/libexec
+localedir = $(datadir)/locale
+mandir = $(prefix)/man/man1
+ 
+SHFILES       =	mgbuild.sh mgbuild_4.sh mg_get.sh xmg.sh  mg_get_merge.sh mgmerge.sh
+
+MISC          = Makefile.in 
+
+ALLFILES      =	$(SHFILES) $(MISC) $(MAN)
+
+DISTFILES     = $(ALLFILES) 
+
+EXEC          = mgbuild mg_get xmg mg_get_merge mgmerge mgbuild_4
+
+MAN           = mgbuild.1 mgbuild_4.1 mg_get.1 xmg.1 mg_get_merge.1 mgmerge.1
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+all:	$(EXEC)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+mgbuild : mgbuild.sh
+	@rm -f $@
+	cat mgbuild.sh >$@
+	chmod +x $@
+
+mgbuild_4 : mgbuild_4.sh
+	@rm -f $@
+	cat mgbuild_4.sh >$@
+	chmod +x $@
+
+mg_get : mg_get.sh
+	@rm -f $@
+	cat mg_get.sh >$@
+	chmod +x $@
+
+mgmerge : mgmerge.sh
+	@rm -f $@
+	cat mgmerge.sh >$@
+	chmod +x $@
+
+mg_get_merge : mg_get_merge.sh
+	@rm -f $@
+	cat mg_get_merge.sh >$@
+	chmod +x $@
+
+xmg : xmg.sh
+	@rm -f $@
+	cat xmg.sh >$@
+	chmod +x $@
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+install: execinstall #maninstall
+uninstall: execuninstall manuninstall
+
+execinstall: $(EXEC)
+	for name in $(EXEC); do \
+	  $(INSTALL_PROGRAM) $$name \
+	  $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+execuninstall:
+	for name in $(EXEC); do \
+	 rm -f $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+maninstall: $(MAN)
+	$(top_srcdir)/mkinstalldirs $(mandir); \
+	for f in $(MAN); do \
+	  $(INSTALL_DATA) $$f $(mandir)/$$f ;\
+	done
+
+manuninstall: $(MAN)
+	for f in $(MAN); do \
+	  rm -f $(mandir)/$$f ;\
+	done
+
+mostlyclean:
+ 
+clean: mostlyclean
+	rm -f $(EXEC)
+ 
+distclean: clean
+	rm -f ansi2knr
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+ 
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	  || cp -p $(srcdir)/$$file $(distdir); \
+	done
+
+# screws up distclean (jrm21) 
+#Makefile: Makefile.in ../../../../config.status
+#	cd ../../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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:
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.1	(revision 21083)
@@ -0,0 +1,154 @@
+.TH mg_get 1 "31 January 1994"
+.SH NAME
+mg_get \- output source texts for processing
+.SH SYNOPSIS
+ 
+.B mg_get
+.I collection-name
+.RB [ \-init | \-i | \-text\fP|\fB\-t\fP|\fB\-cleanup\fP|\fB\-c\fP]
+.SH DESCRIPTION
+.LP
+This program is the default one used by mgbuild to generate the source text for the MG system. Any program may be used to generate the source text for mgbuild as long as it confirms to the interface specified here. 
+.SH OPTIONS
+.LP
+The
+.I collection\-name
+must appear before any other option. Only the first option has any significance. If no option is specified
+.B \-text
+is assumed.
+.RS
+.TP
+.BR \-init " and " \-i
+The program is called once with this flag at the start of building a collection.
+.TP
+.BR \-text " and " \-t
+The program is called with this flag multiple times during the building of a collection. The program outputs (on stdout) the text of the collection. \*(lq\fBDocuments\fP\*(rq within the collection are separated with by ctrl-B's (ASCII code 2). \*(lq\fBParagraphs\fP\*(rq within the collection are separated with ctrl-C's (ASCII code 3). A collection need not contain paragraphs unless a level 3 inverted file is being generated (see 
+.B mgbuild 
+and 
+.BR mg_passes ). 
+.TP
+.BR \-cleanup " and " \-c
+The program is called once with this flag at the completion of building a collection.
+.SH ENVIRONMENT
+.TP
+.SB MGDATA
+If this environment variable exists then its value is used a the default 
+directory where the mg collection files are. If this variable does not exist
+then the directory \*(lq\fB.\fP\*(rq is used by default. The command line 
+option 
+.BI \-d " directory"
+overrides the directory in 
+.BR MGDATA .
+.TP
+.SB MG_GETRC
+This environment variable specifies where the file containing the users 
+mg source configurations is. If not set, mg_get uses a default of 
+.B \*\~/.mg_getrc.
+
+This file contains TAB delimited lines of the form
+.RS 
+.RS 
+.I CollectionName
+.I CollectionType
+.I files or directory
+.RE
+
+.I CollectionName
+is the name of the collection supplied to mg_get.
+
+.I CollectionType
+specifies how mg_get should process the
+named files and directories and are descibed below.
+
+.I files or directory
+is either a list of files separted by blanks or a single directory.
+Some of the
+.I CollectionTypes
+deal with files and others with just a single directory.
+Any files used ending with .gz or .Z are decompressed with gzip before
+processing. References to '~' expands to the users HOME directory.
+
+.I CollectionType
+is one of
+.RS
+.TP
+.BR PARA
+For text based documents. The list of files specified are treated as
+a series of paragraphs separated by blank lines. Each paragraph becomes
+a seperate document on the indexed collection.
+.TP
+.BR MAIL
+for mail files. The list of files specified are treated as UNIX mail
+files separated by lines starting with 'From'. Each mail message becomes
+a seperate document on the indexed collection. As a extra feature any
+embedded tarmail encoded contents (enclosed by a 'xbtoa Begin' and 'xbtoa End'
+pair are removed.
+.TP
+.BR DIR
+(and DIR2)
+For a single directory of files. Each file in the directory (and in any of
+it's subdirectories) are treated as a single document. With
+.I DIR
+the pathname of the file is prefixed to the contents of each file as an
+extra line while this is not done for
+.I DIR2
+collections.
+.TP
+.BR BIB
+for biblography files. The list of files specified are treated as
+a series of biblography files (eg BIBTEX or TROFF) separated by lines
+starting with '@'. Each reference  becomes a seperate document on the indexed
+collection.
+.TP
+.BR TXTIMG
+for integrated collections of text and images. The single directory should
+contain files that have the same prefix if they are related. For example,
+monaLisa.pgm might be a gray-level image, and monaLisa.txt would be a textual
+file describing the image. The suffixes recognised are:
+.BR   .txt
+for  ascii text
+.BR  .ptm
+for  scanned text stored as a bilevel image
+.BR  .pbm
+for a black and white image (typically a line drawing)
+.BR  .pgm
+for a gray-scale image
+.BR In addition, if no corresponding ascii text file is found for
+a .pbm or .pgm file, then one is created with suffix .tmp.txt,
+and it stores the name of the image file (in principle it could
+store the OCR of a .txt.pbm file). At present the .tmp.txt files
+are deleted by the '-cleanup' option.
+
+.SH "EXAMPLE"
+
+An example ~/.mg_getrc file might look like:
+   alice   PARA    /users/alice13a.txt.Z
+   mail95  MAIL    ~/MAIL/1995/*
+   doc     DIR     ~/documents
+   bibs    BIB     ~/etc/REFS/*.bib ~/etc/REFS/CC/*.bib
+   letters DIR     ~/LETTERS
+   davinci TXTIMG  ~/images/davinci
+
+.SH "SEE ALSO"
+.LP
+.BR mg_compression_dict (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_make_fast_dict (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1)
+
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get.sh	(revision 21083)
@@ -0,0 +1,447 @@
+#! /bin/csh -f
+###########################################################################
+#
+# mg_get.sh -- script to get text for mgbuild
+# Copyright (C) 1994  Tim Bell
+# Changed to allow it to be driven from a file ~/.mg_getrc
+# by Bruce McKenzie, Oct 1994
+#
+# 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.
+#
+#       @(#)mg_get.sh	1.11 25 Mar 1994
+#
+###########################################################################
+#
+# "mg_get" formats the text for mgbuild by collecting the appropriate
+#   documents, and outputing them with control-B after each document.
+#   The name of the text must be supplied as an argument.
+#   mg_get is called with -i (init) first, then with -t (text) each time the 
+#   text is needed, then with -c (cleanup).
+#   e.g. mg_get alice -t
+#
+# The file ~/.mg_get contains lines of the form:
+#     name	TYPE	files and directories
+# where name is the name supplied to mg_get, TYPE is one of
+# PARA, MAIL, DIR, DIR2, BIB or TXTIMG and says how mg_get should process the
+# named files and directories
+#
+###########################################################################
+
+if ($?MG_GETRC) then
+  set mg_getrc = $MG_GETRC
+else
+  set mg_getrc = ~/.mg_getrc
+endif
+
+# Added by [TS:May/95]
+# if we don't have an mg_getrc file in existence then create a default one
+if !(-e $mg_getrc) then 
+  echo "Can not find a .mg_getrc, so creating a default one: $mg_getrc"
+
+  if ($?MGSAMPLE) then
+    set SampleData = $MGSAMPLE
+  else
+    set SampleData = ./SampleData
+  endif
+
+  cat > $mg_getrc << END
+alice	PARA	$SampleData/alice13a.txt.Z
+davinci	TXTIMG	$SampleData/davinci
+mailfiles	MAIL	~/mbox ~/.sentmail
+allfiles	DIR	~/Mail
+mods	LINESEP	$SampleData/MODIFICATIONS
+bible	PLAIN	$SampleData/bible/genesis.txt.Z $SampleData/bible/revelation.txt.Z
+END
+endif
+
+if (! $?MGIMAGEVIEWER) then
+  setenv MGIMAGEVIEWER "xv -"
+endif
+
+set rm = /bin/rm
+
+switch ($#argv)
+  case 1:
+  set flag = '-text'
+  breaksw
+
+  case 2:
+  set flag = $2
+  switch ($flag)
+     case '-i':
+	set flag = '-init'
+	breaksw
+     case '-t':
+	set flag = '-text'
+	breaksw
+     case '-c':
+	set flag = '-cleanup'
+	breaksw
+     case '-init':
+     case '-text':
+     case '-cleanup':
+     breaksw
+     default:
+     echo 'Usage: mg_get <document> [-i | -t | -c]'
+     exit(1)
+     endsw
+  breaksw
+
+  default:
+  echo 'Usage: get <document> [-i | -t | -c]'
+  exit(1)
+  endsw
+
+set COLLECTION = $1
+set TYPE  = `grep \^$1 $mg_getrc | cut -f2`
+set FILES = `grep \^$1 $mg_getrc | cut -f3`
+
+set bindir = $0
+set bindir = $bindir:h
+
+switch ($TYPE)
+  case PLAIN:
+# Just outputs the given text, assumes ^Bs already inserted 
+  switch ($flag)
+     case '-init':
+     breaksw
+
+     case '-text':
+      foreach f ($FILES)
+	if ($f:e == 'Z') then
+	  set decoder=zcat
+	else if ($f:e == 'gz') then
+	  set decoder=gunzip
+	else
+	  set decoder=cat
+	endif
+        $decoder < $f
+      end
+     breaksw #-text
+
+     case '-cleanup':
+     breaksw
+  endsw #flag
+  breaksw
+
+  case LINESEP:
+# Assumes that the documents are separated by a line of =====
+  switch ($flag)
+     case '-init':
+     breaksw
+
+     case '-text':
+      foreach f ($FILES)
+	if ($f:e == 'Z') then
+	  set decoder=zcat
+	else if ($f:e == 'gz') then
+	  set decoder=gunzip
+	else
+	  set decoder=cat
+	endif
+        $decoder < $f |  sed -e '/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/s/.*//' < $f
+      end
+     breaksw #-text
+
+     case '-cleanup':
+     breaksw
+  endsw #flag
+  breaksw
+
+  case PARA:
+# Splits the file at blank lines, which corresponds to paragraphs.
+  switch ($flag)
+     case '-init':
+     breaksw
+
+     case '-text':
+      foreach f ($FILES)
+	if ($f:e == 'Z') then
+	  set decoder=zcat
+	else if ($f:e == 'gz') then
+	  set decoder=gunzip
+	else
+	  set decoder=cat
+	endif
+      $decoder <$f |awk '   /^ *$/ {if (b!=1) printf "";b=1} \
+		\!/^ *$/ {print;b=0} \
+		 END {printf ""}'
+       end #foreach
+     breaksw #-text
+
+     case '-cleanup':
+     breaksw
+  endsw #flag
+  breaksw
+
+  case BIB:
+# Takes a list of files that contain bibliographies, and splits them up 
+#   by putting ^B after each reference. Assumes that each reference
+#   begins with a line '^@'.
+
+  switch ($flag)
+    case '-init':
+    breaksw
+ 
+    case '-text':
+      foreach f ($FILES)
+	if ($f:e == 'Z') then
+	  set decoder=zcat
+	else if ($f:e == 'gz') then
+	  set decoder=gunzip
+	else
+	  set decoder=cat
+	endif
+      $decoder <$f |awk '/^@/&&NR!=1{printf ""} {print $0} END{print ""}'
+      end # foreach
+    breaksw #-text
+ 
+    case '-cleanup':
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #BIB
+
+  case MAIL:
+# Takes a list of files that contain mail, and splits them up 
+#   by putting ^B after each message. Assumes that each message
+#   begins with a line '^From '.
+
+  switch ($flag)
+    case '-init':
+    breaksw
+ 
+    case '-text':
+      foreach f ($FILES)
+	if ($f:e == 'Z') then
+	  set decoder=zcat
+	else if ($f:e == 'gz') then
+	  set decoder=gunzip
+	else
+	  set decoder=cat
+	endif
+      $decoder <$f| awk '/xbtoa Begin/,/xbtoa End/ {next} /^From /&&NR!=1{printf ""} {print $0} END{print ""}'
+      end # foreach
+    breaksw #-text
+ 
+    case '-cleanup':
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #MAIL
+
+  case DIR:
+# Recursively concatenates every file in every subdirectory of the given
+#   directory.
+
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text'
+      find $FILES -type f -name '*.gz' -exec echo '<' {} '>' \;		\
+			 -exec gzcat {} \; -exec echo -n '' \;
+      find $FILES -type f -name '*.Z' -exec echo '<' {} '>' \;		\
+			 -exec zcat {} \; -exec echo -n '' \;
+#     find $FILES -type f -not -regex '.*\.\(gz\|Z\)' -exec echo '<' {} \
+#			'>' \; -exec cat {} \; -exec echo -n '' \;
+      find $FILES -type f \! \( -name '*.gz' -o -name '*.Z' \) \
+			-exec echo '<' {} '>' \; \
+			-exec cat {} \; -exec echo -n '' \;
+
+    breaksw
+
+    case '-cleanup':
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #DIR
+
+
+
+  case DIR2:
+# Recursively concatenates every file in every subdirectory of the given
+#   directory. Does not include filename
+
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text'
+      find $FILES -type f -name '*.gz'  		\
+			 -exec gzcat {} \; -exec echo -n '' \;
+      find $FILES -type f -name '*.Z' 	 		\
+			 -exec zcat {} \; -exec echo -n '' \;
+#     find $FILES -type f -not -regex '.*\.\(gz\|Z\)'	\
+#			-exec cat {} \; -exec echo -n '' \;
+      find $FILES -type f \! \( -name '*.gz' -o -name '*.Z' \) \
+			-exec cat {} \; -exec echo -n '' \;
+    breaksw
+
+    case '-cleanup':
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #DIR2
+
+
+
+
+  case TXTIMG:
+# compress and index the collection of text and images
+# (this code is suitable for all sorts of integrated collections
+#  of text and images)
+# Files that are related have the same prefix. For example,
+#  monaLisa.pgm might be a gray-level image, and
+#  monaLisa.txt would be a textual file describing the image.
+# The suffixes recognised are:
+#    .txt	ascii text
+#    .ptm	scanned text stored as a bilevel image
+#    .pbm	a black and white image (typically a line drawing)
+#    .pgm	a gray-scale image
+# In addition, if no corresponding ascii text file is found for
+#  a .pbm or .pgm file, then one is created with suffix .tmp.txt,
+#  and it stores the name of the image file (in principle it could
+#  store the OCR of a .txt.pbm file). At present the .tmp.txt files
+#  are deleted by the '-cleanup' option.
+  
+#### the next two 'set' statements define which directory the files
+#    come from, and where they will be stored. This is the only
+#    part of this code that is specific to the 'davinci' collection
+  set sourceDir = $FILES
+  set targetDir = $MGDATA/$COLLECTION
+
+  switch ($flag)
+    case '-init':
+      mkdir $targetDir >&/dev/null	   # create the directory to store
+					   # compressed images in
+      $rm -rf $targetDir/* >&/dev/null     # in case it already existed
+    
+      # take care if no match to foreach statements
+      set nonomatch
+
+      # process all pbm (black and white) images of text
+      foreach f ($sourceDir/*.ptm)
+        if ($f == "$sourceDir/*.ptm") then
+                break
+        endif
+	set base = $f:t
+	
+        $bindir/mgticbuild $targetDir/$base:r.ticlib.$$ $f
+        $bindir/mgticprune $targetDir/$base:r.ticlib.$$
+
+	$bindir/mgtic -L -e $targetDir/$base:r.ticlib.$$ $f >$targetDir/$base:r.tic
+	$rm $targetDir/$base:r.ticlib.$$
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do OCR here to get its contents
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '#######' $f > $r.tmp
+	endif
+      end
+      # process all pgm (gray scale) images
+      foreach f ($sourceDir/*.pgm)
+        if ($f == "$sourceDir/*.pgm") then
+                break
+        endif
+	set base = $f:t
+	$bindir/mgfelics -e $f >$targetDir/$base:r.flx
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do image recognition here to create one(!)
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '#######' $f > $r.tmp
+	endif
+      end
+      # process all pbm (black and white) images
+      foreach f ($sourceDir/*.pbm)
+        if ($f == "$sourceDir/*.pbm") then
+                break
+        endif
+	set base = $f:t
+	$bindir/mgbilevel -e $f >$targetDir/$base:r.blv
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do drawing recognition here to create one(!)
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '####### No corresponding text file available for this image' >$r.tmp
+	    echo 'Original image file name was' $f >> $r.tmp
+	endif
+      end
+      unset nonomatch
+    breaksw #-init
+
+    case '-text'
+      # take care if no match to foreach statements
+      set nonomatch
+
+      #output each text file and tmp.txt, with names of other associated files
+
+      foreach f ($sourceDir/*.txt $sourceDir/*.tmp)
+        if ($f == "$sourceDir/*.txt") then
+           continue
+        endif
+        if ($f == "$sourceDir/*.tmp") then
+           continue
+        endif
+	set r = $f:r	#root name of file
+	set base = $r:t
+        set first_image = 1 # set so that I print out image header once
+                            # also signifies if header printed out at all
+
+	foreach d ($targetDir/$base.*)
+          if ($d == "$targetDir/$base.*") then
+                break
+          endif
+
+          if ($first_image) then
+            set first_image = 0
+            echo '::::::::::'  #separate the image information from the text
+            echo 'Image(s) available:'
+          endif
+
+	  switch ($d:e)	# work out decoding method from suffix
+            case 'tic':
+              echo 'MGDATA (mgtic -d ' $d '  | '$MGIMAGEVIEWER') '
+            breaksw
+            case 'flx':
+              echo 'MGDATA (mgfelics -d ' $d '  | '$MGIMAGEVIEWER')'
+            breaksw
+            case 'blv':
+              echo 'MGDATA (mgbilevel -d ' $d '  | '$MGIMAGEVIEWER')'
+	    breaksw
+	  endsw # $d:e (suffix)
+
+	end #foreach d (associated file)
+
+        if (! $first_image) then
+	  echo '::::::::::'  #separate the image information from the text
+        endif
+
+	cat $f  # output the text associated with the images
+	echo -n ''
+      end #foreach f (text file)
+      unset nonomatch
+    breaksw #-text
+
+    case '-cleanup':
+      #remove temporary text files
+      $rm $sourceDir/*.tmp
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #IMGTXT
+
+
+  default:
+    echo 'Sorry, I do not know how to get' $1
+    exit 1	
+endsw
+exit 0
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_get_merge 1 \*(Dt CITRI
+.SH NAME
+mg_get_merge \- output source texts for processing
+.SH SYNOPSIS
+.B mg_get_merge
+.I collection-name
+.if n .ti +9n
+[
+.BR \-init " |"
+.BR \-i " |"
+.BR \-text " |"
+.BR \-t " |"
+.BR \-cleanup " |"
+.B  \-c
+]
+.SH DESCRIPTION
+This program is the default one used by
+.BR mgmerge (1)
+to generate the source text for new documents to appended to
+an
+.BR mg (1)
+system database.
+Its function is exactly the same as
+.BR mg_get (1)
+except that it generates the 
+.I new 
+documents to be added to an
+.BR mg (1)
+system database that has already been built using
+.BR mgbuild(1).
+Any program may be used to generate the source
+text for
+.BR mgmerge (1),
+as long as it confirms to the interface specified
+here.
+.SH OPTIONS
+The
+.I collection-name
+must appear before any other option.  Only the first option has any
+significance.  If no option is specified,
+.B \-text
+is assumed.
+.TP "\w'\fB\-cleanup\fP and \fB\-c\fP'u+2n"
+.BR \-init " and " \-i
+The program is called once with this flag at the start of merging a
+collection.
+.TP
+.BR \-text " and " \-t
+The program is called with this flag multiple times during the
+merging of a collection.  The program outputs (on
+.IR stdout )
+the text of the collection.
+.I Documents
+within the collection are separated by ctrl-B's (ASCII code 2).
+.TP
+.BR \-cleanup " and " \-c
+The program is called once with this flag at the completion of
+merging a collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_get (1),
+.BR mgbuild (1),
+.BR mgmerge (1),
+.BR mg_text_merge (1),
+.BR mg_invf_merge (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mg_get_merge.sh	(revision 21083)
@@ -0,0 +1,313 @@
+#! /bin/csh -f
+###########################################################################
+#
+# mg_get_merge.sh -- script to get text for mgbuild
+# Copyright (C) 1994  Tim Bell, Shane Hudson (mods. for merging)
+#
+# 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.
+#
+#
+###########################################################################
+#
+# "mg_get_merge" formats the text for mgbuild by collecting the appropriate
+#   documents, and outputing them with control-B after each document.
+#   The name of the text must be supplied as an argument.
+#   mg_get is called with -i (init) first, then with -t (text) each time the 
+#   text is needed, then with -c (cleanup).
+#   e.g. mg_get alice -t
+#
+###########################################################################
+
+
+
+# The directory containing the data files is stored in the environment
+#   variable MGSAMPLE
+
+if ($?MGSAMPLE) then
+  set SampleData = $MGSAMPLE
+else
+  set SampleData = ./SampleData
+endif
+
+if (! $?MGIMAGEVIEWER) then
+  setenv MGIMAGEVIEWER "xv -"
+endif
+
+set rm = /bin/rm
+
+switch ($#argv)
+  case 1:
+  set flag = '-text'
+  breaksw
+
+  case 2:
+  set flag = $2
+  switch ($flag)
+     case '-i':
+	set flag = '-init'
+	breaksw
+     case '-t':
+	set flag = '-text'
+	breaksw
+     case '-c':
+	set flag = '-cleanup'
+	breaksw
+     case '-init':
+     case '-text':
+     case '-cleanup':
+     breaksw
+     default:
+     echo 'Usage: get <document> [-i | -t | -c]'
+     exit(1)
+     endsw
+  breaksw
+
+  default:
+  echo 'Usage: get <document> [-i | -t | -c]'
+  exit(1)
+  endsw
+
+set bindir = $0
+set bindir = $bindir:h
+
+switch ($1)
+  case alice:
+  switch ($flag)
+     case '-init':
+     breaksw
+
+     case '-text':
+	echo "This is a test document 1 2 3 4 5 6 7 8 9 "
+	echo ""
+	echo "A B C"
+     breaksw
+
+     case '-cleanup':
+     breaksw
+  endsw #flag
+  breaksw
+
+  case bible:
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text':
+       # use uncompressed file if it exists
+       # revelation.txt already contains '^B' characters between verses
+       if (-e $SampleData/bible/revelation.txt) then
+          cat $SampleData/bible/revelation.txt
+       else
+          uncompress <$SampleData/bible/revelation.txt.Z
+    breaksw #-text
+
+    case '-cleanup':
+    breaksw #-cleanup
+
+  endsw #flag
+  breaksw #bible
+
+
+
+  case mailfiles:
+# Takes a list of files that contain mail, and splits them up 
+#   by putting ^B after each message. Assumes that each message
+#   begins with a line '^From '.
+# If messages are already in individual files, use "get allfiles"
+#   rather than this one.
+# The EXTRA documents added are in files in the directory mailextra
+#### The variable 'mailfiles' contains a list of files to be split up
+  set mailfiles = '~/mbox ~/.sentmail'
+  set mailextra = '~/extra/*'
+
+  switch ($flag)
+    case '-init':
+    breaksw
+
+    case '-text':
+      foreach f ($mailextra)
+	awk '/^From /&&NR!=1{print ""} {print $0} END{print ""}' $f
+      end # foreach
+    breaksw #-text
+
+    case '-cleanup':
+    breaksw #-cleanup
+
+  endsw #flag
+  breaksw #mailfiles
+
+
+
+  case allfiles:
+# Recursively concatenates every file in every subdirectory of the given
+#   directory.
+
+# The variable 'directory' on the next line contains the directory to be used
+  set directory = ~/Mail
+
+# The date of the file ".mgbuildtime" in 'directory' is the last
+# build or merge. At the start of the merge ("-init" argument) the
+# file ".mgmergetime" is touched. Only files newer than ".mgbuildtime"
+# but older than ".mgmergetime" are output by mg_get_merge
+
+  switch ($flag)
+    case '-init':
+        touch $directory/.mgmergetime
+    breaksw
+
+    case '-text'
+      find $directory -type f -newer $directory/.mgbuildtime \! -newer $directory/.mgmergetime \! -name '.*' -exec echo '<' {} '>' \; -exec cat {} \; -exec echo -n '' \;
+    breaksw
+
+    case '-cleanup':
+        touch $directory/.mgmergetime
+        touch $directory/.mgbuildtime
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #allfiles
+
+
+
+
+  case davinci:
+# compress and index the DaVinci collection of text and images
+# (this code is suitable for all sorts of integrated collections
+#  of text and images)
+# It assumes that all files are in one directory ($sourceDir).
+# Files that are related have the same prefix. For example,
+#  monaLisa.img.pgm might be a gray-level image, and
+#  monaLisa.txt.txt would be a textual file describing the image.
+# The suffixes recognised are:
+#    .txt.txt	ascii text
+#    .txt.pbm	scanned text stored as a bilevel image
+#    .img.pbm	a black and white image (typically a line drawing)
+#    .img.pgm	a gray-scale image
+# In addition, if no corresponding ascii text file is found for
+#  a .pbm or .pgm file, then one is created with suffix .tmp.txt,
+#  and it stores the name of the image file (in principle it could
+#  store the OCR of a .txt.pbm file). At present the .tmp.txt files
+#  are deleted by the '-cleanup' option.
+  
+#### the next two 'set' statements define which directory the files
+#    come from, and where they will be stored. This is the only
+#    part of this code that is specific to the 'davinci' collection
+  set sourceDir = $SampleData/davinci
+  set targetDir = $MGDATA/davinci
+
+  switch ($flag)
+    case '-init':
+      mkdir $targetDir >&/dev/null	   #create the directory to store
+					   # compressed images in
+      $rm -rf $targetDir/* >&/dev/null #in case it already existed
+    
+      # process all pbm (black and white) images of text
+      foreach f ($sourceDir/*.ptm)
+	set base = $f:t
+	
+        $bindir/mgticbuild $targetDir/$base:r.ticlib.$$ $f
+        $bindir/mgticprune $targetDir/$base:r.ticlib.$$
+
+	$bindir/mgtic -L -e $targetDir/$base:r.ticlib.$$ $f >$targetDir/$base:r.tic
+	$rm $targetDir/$base:r.ticlib.$$
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do OCR here to get its contents
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '#######' $f > $r.tmp
+	endif
+      end
+      # process all pgm (gray scale) images
+      foreach f ($sourceDir/*.pgm)
+	set base = $f:t
+	$bindir/mgfelics -e $f >$targetDir/$base:r.flx
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do image recognition here to create one(!)
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '#######' $f > $r.tmp
+	endif
+      end
+      # process all pbm (black and white) images
+      foreach f ($sourceDir/*.pbm)
+	set base = $f:t
+	$bindir/mgbilevel -e $f >$targetDir/$base:r.blv
+	set r = $f:r	#root name of file
+	if (! (-e $r.txt || -e $r.tmp)) then
+	# creates a file; could do drawing recognition here to create one(!)
+	    echo "No corresponding txt file for" $f "- creating" $r.tmp
+	    echo '####### No corresponding text file available for this image' >$r.tmp
+	    echo 'Original image file name was' $f >> $r.tmp
+	endif
+      end
+    breaksw #-init
+
+    case '-text'
+      #output each text file and tmp.txt, with names of other associated files
+      foreach f ($sourceDir/*.txt $sourceDir/*.tmp)
+	set r = $f:r	#root name of file
+	set base = $r:t
+	set n = `/bin/ls $sourceDir/$base.* | wc -l`
+	if ($n != 1) then # more files than just the text one
+	 echo '::::::::::'  #separate the image information from the text
+	 echo 'Image(s) available:'
+	 foreach d ($targetDir/$base.*)
+	  switch ($d:e)	# work out decoding method from suffix
+            case 'tic':
+              echo 'MGDATA (mgtic -d ' $d '  | '$MGIMAGEVIEWER') '
+            breaksw
+            case 'flx':
+              echo 'MGDATA (mgfelics -d ' $d '  | '$MGIMAGEVIEWER')'
+            breaksw
+            case 'blv':
+              echo 'MGDATA (mgbilevel -d ' $d '  | '$MGIMAGEVIEWER')'
+	    breaksw
+	  endsw # $d:e (suffix)
+	 end #foreach d (associated file)
+	echo '::::::::::'  #separate the image information from the text
+	endif # if more than one file
+	cat $f  # output the text associated with the images
+	echo -n ''
+      end #foreach f (text file)
+    breaksw #-text
+
+    case '-cleanup':
+      #remove temporary text files
+      $rm $sourceDir/*.tmp
+    breaksw #-cleanup
+  endsw #flag
+  breaksw #davinci
+
+
+#---------------------------
+  case mods:
+# Splits the modifications file at the mod separator "--------"
+  switch ($flag)
+     case '-init':
+     breaksw
+ 
+     case '-text':
+       sed -e 's/^---.*//g' < ${SampleData}/MODIFICATIONS
+     breaksw
+ 
+     case '-cleanup':
+     breaksw
+  endsw #flag
+  breaksw #mods
+
+  default:
+    echo 'Sorry, I do not know how to get' $1
+    exit 1	
+endsw
+exit 0
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.1	(revision 21083)
@@ -0,0 +1,169 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbuild 1 \*(Dt CITRI
+.SH NAME
+mgbuild \- build an mg system database
+.SH SYNOPSIS
+.B mgbuild
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.BI \-d " mgdata dir"
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgbuild
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely build an
+.BR mg (1)
+system database ready for queries to be made
+by
+.BR mgquery.
+This program makes use of the
+.BR mg_get (1)
+script to obtain the text of the collection.
+.SH OPTIONS
+Options can occur in any order, but the collection name must be last.
+.TP "\w'\fIcollection-name\fP'u+2n"
+.BI \-c
+This specifies whether the
+.I get
+program is \*(lqcomplex\*(rq.  If a
+.I get
+program is \*(lqcomplex\*(rq, then it requires initialisation and
+cleanup with the
+.B \-i
+and
+.B \-c
+options.
+.TP
+.BI \-g " get"
+This specifies the program to use for getting the source text for the
+build.  If no
+.B \-g
+option is given, the default program
+.BR mg_get (1)
+is used.
+.TP
+.BI \-s " source"
+The
+.B mgbuild
+program consists of two parts.  The first part initializes variables
+to default values.  The second part uses these variables to control
+how the
+.BR mg (1)
+database is built.  This option specifies a program to execute between
+the first and second parts.  The details of what the variables are, and
+how they may be changed, are in comments in the
+.B mgbuild
+program.
+.TP
+.BI \-d " mgdata dir"
+Setting this option allows one to override the MGDATA environment variable.
+.TP
+.I collection-name
+This is the collection name, as required by the
+.BR mg_get (1)
+program.  It serves both as a
+.I case
+statement selector, and as the name of a subdirectory that holds the
+indexing files.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.chunk
+Inverted file chunk descriptor file.  When the inverted file is
+created, it is written in chunks that use no more than a set amount of
+memory.  This file describes those chunks.
+.TP
+.B *.invf.chunk.trans
+Word-occurrence-order to lexical-order translation file.  The
+.B *.invf.chunk
+file is written in word-occurrence order but is required by
+.B \-N2
+to be in lexical order.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for an order-preserving perfect hash function.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Text statistics.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild.sh	(revision 21083)
@@ -0,0 +1,339 @@
+#!/bin/csh -f
+###########################################################################
+#
+# mgbuild.sh -- Script used to build mg text collection.
+# Copyright (C) 1994  Neil Sharman
+#
+# 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.
+#
+#       @(#)mgbuild.sh	1.9 16 Mar 1994
+#
+###########################################################################
+#  mg.build
+# Creates a Full Text Retrieval database
+#
+#  @(#)mgbuild.sh	1.9 16 Mar 1994
+#
+
+set complex = ""
+
+# Parse the command line arguments
+while ($#argv >= 1)
+  if ("$1" == "-s") then
+    shift
+    if ($#argv >= 1) then
+      set source = $1
+      shift
+    endif
+  else if ("$1" == "-d") then
+    shift
+    if ($#argv >= 1) then
+      set mgdata = $1
+      shift
+    endif
+  else if ("$1" == "-g") then
+    shift
+    if ($#argv >= 1) then
+      set get = $1
+      shift
+    endif
+  else if ("$1" == "-c") then
+    set complex = "-text"
+    shift
+  else
+    if ($?text == "0") then
+      set text = $1
+    endif
+    shift
+  endif
+    
+end
+
+if ($?text == "0") then
+  set prog = $0
+  echo "USAGE:"
+  echo "     "$prog:t" [-s config-script] [-g get-program] [-d mgdata dir] [-c] source"
+  echo ""
+  echo " The config-script is only needed if a non-standard build is required."
+  echo " The get-program defaults to mg_get if not specified."
+  exit 1	
+endif
+
+set bindir = $0
+set bindir = $bindir:h
+
+# if $pipe == 1 then pipe in the source text using $get and $text otherwise
+# read the source text directly from the file names specified in $input_files
+set pipe = 1
+
+if ($?get == "0") then
+  set complex = "-text"
+  set get = $bindir/mg_get
+endif
+
+if ($?mgdata) then
+  setenv MGDATA $mgdata
+endif
+
+if (-e $MGDATA/${text}.chunks) then
+  set input_files = `cat $MGDATA/${text}.chunks`
+endif
+
+# Set the stemming method
+#   Bit 0 = case folding
+#   Bit 1 = S stemmer
+set stem_method = 3
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then build collection with full indexes to blocked file
+# overriding stem_method (stem_method will be set to 0)
+# Otherwise don't build with indexes
+set do_indexes = 0
+
+
+# If do_text == 1 then do the text component of building a mg database. 
+# Otherwise don't do the text component.
+set do_text = 1
+
+
+# If do_invf == 1 then do the inversion component of building a mg database. 
+# Otherwise don't do the inversion component.
+set do_invf = 1
+
+
+# If do_pass1 == 1 then do pass1 of building a mg database. 
+# Otherwise don't do pass1.
+set do_pass1 = 1
+
+# If do_pass2 == 1 then do pass2 of building a mg database. 
+# Otherwise don't do pass2.
+set do_pass2 = 1
+
+
+# $invf_mem specifies the amount of memory to use for the pass2 inversion
+set invf_mem = 32
+
+
+# $num_chunks specifies the number of interium chunks of inverted file that
+# may be written to disc before a merge into the invf file is done
+set num_chunks = 3
+
+# $invf_level specifies the level of the inverted file that will be generated.
+set invf_level = 2
+
+
+# If $strip_sgml == 1 then sgml tags are stripped from the inversion phase.
+# Otherwise sgml tags are kepted.
+set strip_sgml = 1
+
+
+# $trace specifies the interval between trace entries in Mb.
+# If this is not set no trace entries will be generated.
+set trace = 10
+
+
+# $weight_bits specifies the number of bits of precision bo be given to the 
+# approximate weights.
+set weight_bits = 6
+
+
+# $mcd specifies the commandline arguments for the mg_compression_dict program
+#### Note: Set -S so novel words can be encoded, as this will happen if
+#### mgmerge is used.
+set mcd = -S
+
+
+# Source the parameter file to modify parameters of the build.
+if ($?source) then
+  source ${source}
+endif
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then set stem_method = 0
+if ("$do_indexes" == "1") then
+  set stem_method = 0
+endif
+
+
+# Generate the collection name.
+set coll_name = ${text}
+if ("$invf_level" == "3") then
+  set coll_name = ${text}-p
+endif
+
+# Generate the directory for the collection.
+if (-e $MGDATA/${coll_name}) then
+else
+  mkdir $MGDATA/${coll_name}
+endif
+
+# Generate the base name for the collection.
+set bname = ${coll_name}/${coll_name}
+
+
+#build up the command lines for pass 1 and 2
+set pass1 = (-f ${bname} -${invf_level} -m ${invf_mem} -s ${stem_method})
+set pass2 = (-f ${bname} -${invf_level} -c ${num_chunks})
+
+if ($strip_sgml) then
+  set pass1 = (${pass1} -G)
+  set pass2 = (${pass2} -G)
+endif
+
+if ($?trace) then
+  set pass1 = (${pass1} -t ${trace})
+  set pass2 = (${pass2} -t ${trace})
+endif
+
+if ($do_text) then
+  set pass1 = (${pass1} -T1)
+  set pass2 = (${pass2} -T2)
+endif
+
+if ($do_invf) then
+  set pass1 = (${pass1} -I1)
+  set pass2 = (${pass2} -I2)
+endif
+  
+if ($?trace_name) then
+  set pass1 = (${pass1} -n ${trace_name})
+  set pass2 = (${pass2} -n ${trace_name})
+endif
+  
+if ($?comp_stats) then
+  set pass2 = (${pass2} -C ${comp_stats})
+endif
+
+echo "-----------------------------------"
+echo "`uname -n`, `date`"
+echo "${text} --> ${bname}"
+echo "-----------------------------------"
+if ($pipe) then
+  if ("$complex" != "") then
+    echo "$get $text -init"
+    $get $text -init
+    if ("$status" != "0") exit 1 
+    echo "-----------------------------------"
+  endif  
+endif
+
+if (${do_pass1}) then
+  if ($pipe) then
+    if ($?pass1filter) then
+      echo "$get $text $complex | $pass1filter | mg_passes ${pass1}"
+      $get $text $complex| $pass1filter | $bindir/mg_passes ${pass1}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass1}"
+      $get $text $complex| $bindir/mg_passes ${pass1}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass1} ${input_files}
+    $bindir/mg_passes ${pass1} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+
+  echo "mg_perf_hash_build -f ${bname}"
+  $bindir/mg_perf_hash_build -f ${bname}
+  if ("$status" != "0") exit 1 
+
+  echo "-----------------------------------"
+  echo "mg_compression_dict -f ${bname} ${mcd}"
+  $bindir/mg_compression_dict -f ${bname} ${mcd}
+  if ("$status" != "0") exit 1 
+  echo "-----------------------------------"
+endif
+
+if (${do_pass2}) then
+  if ($pipe) then
+    if ($?pass2filter) then
+      echo "$get $text $complex | $pass2filter | mg_passes ${pass2}"
+      $get $text $complex | $pass2filter | $bindir/mg_passes ${pass2}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass2}"
+      $get $text $complex | $bindir/mg_passes ${pass2}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass2} ${input_files}
+    $bindir/mg_passes ${pass2} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+endif
+
+echo "mg_weights_build -f ${bname} -b ${weight_bits}"
+$bindir/mg_weights_build -f ${bname} -b ${weight_bits}
+if ("$status" != "0") exit 1 
+
+echo "-----------------------------------"
+
+echo "mg_invf_dict -f ${bname} -b 4096"
+$bindir/mg_invf_dict -f ${bname} -b 4096
+if ("$status" != "0") exit 1 
+
+echo "-----------------------------------"
+
+# [RPAP - Jan 97: Stem Index Change]
+if ("$do_indexes" == "1") then
+  echo "mg_stem_idx -f ${bname} -b 4096 -s1"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s1
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${bname} -b 4096 -s2"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s2
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${bname} -b 4096 -s3"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s3
+  if ("$status" != "0") exit 1 
+
+  echo "-----------------------------------"
+endif
+
+echo "mgstat -f ${bname} -E"
+$bindir/mgstat -f ${bname} -E
+if ("$status" != "0") exit 1 
+
+if ($pipe) then
+  if ("$complex" != "") then
+    echo "-----------------------------------"
+    echo "$get $text -cleanup"
+    $get $text -cleanup
+    if ("$status" != "0") exit 1 
+  endif
+endif
+
+echo "-----------------------------------"
+echo "`uname -n`, `date`"
+echo "-----------------------------------"
+
+echo "-- The fast-loading compression dictionary has not been built."
+echo "-- If you wish to build it, execute the following command:"
+echo "-- "$bindir/mg_fast_comp_dict -f ${bname}
+
+echo "-----------------------------------"
+
+echo ""
+
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.1	(revision 21083)
@@ -0,0 +1,53 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgbuild_4 1 \*(Dt CITRI
+.SH NAME
+mgbuild_4 \- build an mg system database using 4 passes instead of 2
+.SH SYNOPSIS
+.B mgbuild_4
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.BI \-d " mgdata dir"
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgbuild_4
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely build an
+.BR mg (1)
+system database ready for queries to be made
+by
+.BR mgquery.
+This program makes use of the
+.BR mg_get (1)
+script to obtain the text of the collection.
+In 
+.BR mgbuild (1)
+the build is done by two passes over the input text. The first
+pass creates the compressed text dictionary and inverted file dictionary,
+the second pass creates the compressed text and inverted file. What 
+.BR mgbuild_4
+does is use a separate pass for each function. This will be slower but will
+not require as much RAM at one time. Therefore, if your build is failing
+due to running short of memory, then 
+.BR mgbuild_4
+is worth a try.
+.SH "SEE ALSO"
+.na
+.BR mgbuild (1)
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgbuild_4.sh	(revision 21083)
@@ -0,0 +1,435 @@
+#!/bin/csh -f
+###########################################################################
+#
+# mgbuild_4.sh -- Script used to build mg text collection in 4 passes.
+# Copyright (C) 1994  Neil Sharman; Modified by tes@kbs 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 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.
+#
+#
+###########################################################################
+#
+# Does an mgbuild in 4 passes instead of 2 passes.
+# This is useful if one does not have as much RAM and a large collection.
+#
+
+set complex = ""
+
+# ************ parse the command line arguments ************
+
+while ($#argv >= 1)
+  if ("$1" == "-s" || "$1" == "--source") then
+    shift
+    if ($#argv >= 1) then
+      set source = $1
+      shift
+    endif
+  else if ("$1" == "-g" || "$1" == "--get") then
+    shift
+    if ($#argv >= 1) then
+      set get = $1
+      shift
+    endif
+  else if ("$1" == "-c" || "$1" == "--complex") then
+    set complex = "-text"
+    shift
+  else
+    if (! $?text ) then
+      set text = $1
+    endif
+    shift
+  endif
+    
+end
+
+if (! $?text ) then
+  set prog = $0
+  echo "USAGE:"
+  echo "     "$prog:t" [-s config-script] [-g get-program] [-c] source"
+  echo ""
+  echo " The config-script is only needed if a non-standard build is required."
+  echo " The get-program defaults to mg_get if not specified."
+  exit 1	
+endif
+
+set bindir = `which $0` # find which one we are executing
+set bindir = $bindir:h # use it as the bindir path
+
+# ************ set up shell variables ************
+# Override these by providing a script to source using the -s option
+
+# if $pipe == 1 then pipe in the source text using $get and $text otherwise
+# read the source text directly from the file names specified in $input_files
+set pipe = 1
+
+set get_options = ""
+
+
+if (! $?get ) then
+  set complex = "-text"
+  set get = $bindir/mg_get $get_options
+endif
+
+
+if (-e $MGDATA/${text}.chunks) then
+  set input_files = `cat $MGDATA/${text}.chunks`
+endif
+
+# Set the stemming method
+#   Bit 0 = case folding
+#   Bit 1 = S stemmer
+set stem_method = 3
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then build collection with full indexes to blocked file
+# overriding stem_method (stem_method will be set to 0)
+# Otherwise don't build with indexes
+set do_indexes = 0
+
+
+# whether to build weights or not
+set do_weights = 1
+
+# If do_pass1 == 1 then do pass1 of building a mg database. 
+# Otherwise don't do pass1.
+# Text 1st pass
+set do_pass1 = 1
+
+# If do_pass2 == 1 then do pass2 of building a mg database. 
+# Otherwise don't do pass2.
+# Text 2nd pass
+set do_pass2 = 1
+
+# If do_pass3 == 1 then do pass3 of building a mg database. 
+# Otherwise don't do pass3.
+# Invf 1st pass
+set do_pass3 = 1
+
+# If do_pass4 == 1 then do pass4 of building a mg database. 
+# Otherwise don't do pass4.
+# Invf 2nd pass
+set do_pass4 = 1
+
+# Buffer size used by mg_passes
+# Should be big enough to hold largest document
+# In Kilobytes
+set buf_size = 3072
+
+# $invf_mem specifies the amount of memory to use for the pass2 inversion
+set invf_mem = 5
+
+# $num_chunks specifies the number of interium chunks of inverted file that
+# may be written to disc before a merge into the invf file is done
+set num_chunks = 3
+
+# $invf_level specifies the level of the inverted file that will be generated.
+set invf_level = 2
+
+
+# If $strip_sgml == 1 then sgml tags are stripped from the inversion phase.
+# Otherwise sgml tags are kepted.
+set strip_sgml = 1
+
+
+# $trace specifies the interval between trace entries in Mb.
+# If this is not set no trace entries will be generated.
+set trace = 10
+
+
+# $weight_bits specifies the number of bits of precision bo be given to the 
+# approximate weights.
+set weight_bits = 6
+
+
+# $mcd specifies the commandline arguments for the mg_compression_dict program
+set mcd = -C
+
+
+# Source the parameter file to modify parameters of the build.
+if ($?source) then
+  source ${source}
+endif
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then set stem_method = 0
+if ("$do_indexes" == "1") then
+  set stem_method = 0
+endif
+
+
+# Generate the collection name.
+set coll_name = ${text}
+if ("$invf_level" == "3") then
+  set coll_name = ${text}-p
+endif
+
+# Generate the directory for the collection.
+if (-e $MGDATA/${coll_name}) then
+else
+  mkdir $MGDATA/${coll_name}
+endif
+
+# Generate the base name for the collection.
+set bname = ${coll_name}/${coll_name}
+
+# ************ set up pass parameters ************
+
+if ($do_pass1) then
+  set pass1_text = (-f ${bname} -T1)
+endif
+
+if ($do_pass2) then
+  set pass2_text = (-f ${bname} -T2)
+endif
+
+if ($do_pass3) then
+  set pass3_invf = (-f ${bname} -${invf_level} -m ${invf_mem} -s ${stem_method})
+  set pass3_invf = (${pass3_invf} -N1)
+endif
+
+if ($do_pass4) then
+  set pass4_invf = (-f ${bname} -${invf_level} -N2)
+endif
+
+if ($strip_sgml) then
+  set pass1_text = (${pass1_text} -G)
+  set pass2_text = (${pass2_text} -G)
+  set pass3_invf = (${pass3_invf} -G)
+  set pass4_invf = (${pass4_invf} -G)
+endif
+
+if ($?trace) then
+  set pass1_text = (${pass1_text} -t ${trace})
+  set pass2_text = (${pass2_text} -t ${trace})
+  set pass3_invf = (${pass3_invf} -t ${trace})
+  set pass4_invf = (${pass4_invf} -t ${trace})
+endif
+
+if ($?trace_name) then
+  set pass1_text = (${pass1_text} -n ${trace_name})
+  set pass2_text = (${pass2_text} -n ${trace_name})
+  set pass3_invf = (${pass3_invf} -n ${trace_name})
+  set pass4_invf = (${pass4_invf} -n ${trace_name})
+endif
+
+if ($buf_size) then
+  set pass1_text = (${pass1_text} -b ${buf_size})
+  set pass2_text = (${pass2_text} -b ${buf_size})
+  set pass3_invf = (${pass3_invf} -b ${buf_size})
+  set pass4_invf = (${pass4_invf} -b ${buf_size})
+endif
+  
+if ($?comp_stats) then
+  set pass2_text = (${pass2_text} -C ${comp_stats})
+endif
+
+echo "-----------------------------------"
+echo "`uname -n`, `date`"
+echo "${text} --> ${bname}"
+echo "-----------------------------------"
+
+# ************ init get ************
+
+if ($pipe) then
+  if ("$complex" != "") then
+    echo "$get $text -init"
+    $get $text -init
+    if ("$status" != "0") exit 1 
+    echo "-----------------------------------"
+  endif  
+endif
+
+# ************************************* T E X T **********************************
+
+# ************ pass 1_text ************
+
+if (${do_pass1}) then
+  if ($pipe) then
+    if ($?pass1filter) then
+      echo "$get $text $complex | $pass1filter | mg_passes ${pass1_text}"
+      $get $text $complex| $pass1filter | $bindir/mg_passes ${pass1_text}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass1_text}"
+      $get $text $complex| $bindir/mg_passes ${pass1_text}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass1_text} ${input_files}
+    $bindir/mg_passes ${pass1_text} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+endif
+
+# ************ compression dict  ************
+if ($do_pass2) then 
+  echo "mg_compression_dict -f ${bname} ${mcd}"
+  $bindir/mg_compression_dict -f ${bname} ${mcd}
+  if ("$status" != "0") exit 1 
+  echo "-----------------------------------"
+endif
+
+# ************ pass 2_text ************
+if (${do_pass2}) then
+  if ($pipe) then
+    if ($?pass2filter) then
+      echo "$get $text $complex | $pass2filter | mg_passes ${pass2_text}"
+      $get $text $complex| $pass2filter | $bindir/mg_passes ${pass2_text}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass2_text}"
+      $get $text $complex| $bindir/mg_passes ${pass2_text}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass2_text} ${input_files}
+    $bindir/mg_passes ${pass2_text} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+endif
+
+# ************************************* I N V F **********************************
+
+# ************ pass 3_invf ************
+if (${do_pass3}) then
+  if ($pipe) then
+    if ($?pass3filter) then
+      echo "$get $text $complex | $pass3filter | mg_passes ${pass3_invf}"
+      $get $text $complex| $pass3filter | $bindir/mg_passes ${pass3_invf}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass3_invf}"
+      $get $text $complex| $bindir/mg_passes ${pass3_invf}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass3_invf} ${input_files}
+    $bindir/mg_passes ${pass3_invf} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+endif
+
+# ************ perfect hash  ************
+if ($do_pass4) then
+  echo "mg_perf_hash_build -f ${bname}"
+  $bindir/mg_perf_hash_build -f ${bname}
+  if ("$status" != "0") exit 1 
+
+  echo "-----------------------------------"
+endif
+
+# ************ pass 4_invf ************
+if (${do_pass4}) then
+  if ($pipe) then
+    if ($?pass4filter) then
+      echo "$get $text $complex | $pass4filter | mg_passes ${pass4_invf}"
+      $get $text $complex| $pass4filter | $bindir/mg_passes ${pass4_invf}
+      if ("$status" != "0") exit 1 
+    else
+      echo "$get $text $complex | mg_passes ${pass4_invf}"
+      $get $text $complex| $bindir/mg_passes ${pass4_invf}
+      if ("$status" != "0") exit 1 
+    endif
+  else
+    echo mg_passes ${pass4_invf} ${input_files}
+    $bindir/mg_passes ${pass4_invf} ${input_files}
+    if ("$status" != "0") exit 1 
+  endif
+  echo "-----------------------------------"
+endif
+
+
+# ************ build invf dictionary ************
+
+if ($do_pass4) then
+  echo "mg_invf_dict -f ${bname} -b 4096"
+  $bindir/mg_invf_dict -f ${bname} -b 4096
+  if ("$status" != "0") exit 1 
+  echo "-----------------------------------"
+endif
+
+# ******** build indexes to stem dict *********
+
+# [RPAP - Jan 97: Stem Index Change]
+if ($do_pass4 && "$do_indexes" == "1") then
+  echo "mg_stem_idx -f ${bname} -b 4096 -s1"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s1
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${bname} -b 4096 -s2"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s2
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${bname} -b 4096 -s3"
+  $bindir/mg_stem_idx -f ${bname} -b 4096 -s3
+  if ("$status" != "0") exit 1 
+
+  echo "-----------------------------------"
+endif
+
+# ************ build weights ************
+
+if ($do_pass4 && $do_weights) then
+  echo "mg_weights_build -f ${bname} -b ${weight_bits} "
+  $bindir/mg_weights_build -f ${bname} -b ${weight_bits}
+  if ("$status" != "0") exit 1 
+  echo "-----------------------------------"
+endif
+
+# *******************************************************************************
+
+
+# ************ print out statistics ************
+if ($do_pass1 && $do_pass2 && $do_pass3 && $do_pass4) then
+  echo "mgstat -f ${bname} -E"
+  $bindir/mgstat -f ${bname} -E
+  if ("$status" != "0") exit 1 
+endif
+
+
+# ************ cleanup get ************
+
+if ($pipe) then
+  if ("$complex" != "") then
+    echo "-----------------------------------"
+    echo "$get $text -cleanup"
+    $get $text -cleanup
+    if ("$status" != "0") exit 1 
+  endif
+endif
+
+echo "-----------------------------------"
+echo "`uname -n`, `date`"
+echo "-----------------------------------"
+
+if ($do_pass2) then
+  echo "-- The fast-loading compression dictionary has not been built."
+  echo "-- If you wish to build it, execute the following command:"
+  echo "-- "$bindir/mg_fast_comp_dict -f ${bname}
+
+  echo "-----------------------------------"
+endif
+
+echo ""
+
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.1	(revision 21083)
@@ -0,0 +1,175 @@
+`.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgmerge 1 \*(Dt CITRI
+.SH NAME
+mgmerge \- update an mg system database with new documents
+.SH SYNOPSIS
+.B mgmerge
+[
+.B \-c
+]
+[
+.BI \-g " get"
+]
+[
+.BI \-s " source"
+]
+[
+.B \-S
+]
+[
+.B \-w
+]
+.I collection-name
+.SH DESCRIPTION
+.B mgmerge
+is a
+.B csh
+script that executes all the appropriate programs in the correct order
+to completely merge a current
+.BR mg (1)
+system database ready with some new documents, saving the need for a complete
+database rebuild with
+.B mgbuild.
+It does this by building a second
+.BR mg (1)
+system database from the new documents and then merging this database
+with the old one.
+This program makes use of the
+.BR mg_get_merge (1)
+script to obtain the text of the collection.
+.B mgmerge
+cannot edit or delete documents already in a database; only new documents
+can be added.
+.SH OPTIONS
+Options can occur in any order, but the collection name must be last.
+.TP "\w'\fIcollection-name\fP'u+2n"
+.BI \-c
+This specifies whether the
+.I get
+program is \*(lqcomplex\*(rq.  If a
+.I get
+program is \*(lqcomplex\*(rq, then it requires initialisation and
+cleanup with the
+.B \-i
+and
+.B \-c
+options.
+.TP
+.BI \-g " get"
+This specifies the program to use for getting the source text for the
+build.  If no
+.B \-g
+option is given, the default program
+.BR mg_get_merge (1)
+is used.
+.TP
+.BI \-s " source"
+The
+.B mgmerge
+program consists of two parts.  The first part initializes variables
+to default values.  The second part uses these variables to control
+how the
+.BR mg (1)
+database is built.  This option specifies a program to execute between
+the first and second parts.  The details of what the variables are, and
+how they may be changed, are in comments in the
+.B mgmerge
+program.
+If this option is used, the program should ideally be the same one that
+was called by
+.BR mgbuild (1)
+to build the database since some parameters need to be consistent between
+.B mgbuild
+and
+.B mgmerge.
+.TP
+.B \-S
+This option will cause a slow merge to be performed on the inverted files,
+where each inverted file entry is decoded and recoded.
+The default is a fast merge. Accumulated fast merges slowly degrade
+compression performance on the resulting inverted file so
+a periodic slow merge is recommended.
+.TP
+.B \-w
+Adding new documents can have an effect on the weight of the previous ones.
+By default the weights for documents already in the collection are not 
+recomputed since the change in their values is usually small.
+This option forces new weights to be recomputed.
+Periodic use of this option, as for the "-S" option, is recomended,
+otherwise query rankings may become inaccurate.
+.TP
+.I collection-name
+This is the collection name, as required by the
+.BR mg_get_merge (1)
+program.  It serves both as a
+.I case
+statement selector, and as the name of a subdirectory that holds the
+indexing files.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+Note that a temporary directory under the
+.B MGDATA
+directory is used to perform the merge.
+The default name for this directory is
+.BR MERGE .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Text statistics.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgbuild (1),
+.BR mg_get_merge (1),
+.BR mg_get (1),
+.BR mg_invf_merge (1),
+.BR mg_text_merge (1),
+.BR mg_query (1),
+.BR mg_weights_build (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/mgmerge.sh	(revision 21083)
@@ -0,0 +1,417 @@
+#!/bin/csh -f
+###########################################################################
+#
+# mgmerge.sh -- Script used to build mg text collection.
+# Copyright (C) 1994  Neil Sharman, Shane Hudson (mods. for merging)
+#
+# 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.
+#
+#
+###########################################################################
+
+set complex = ""
+set slow_merge = ""
+set guess_weights = "-w "
+# [RPAP - Feb 97: Level 3 Merge]
+set text_pass = 1
+
+# Parse the command line arguments
+while ($#argv >= 1)
+  if ("$1" == "-s") then
+    shift
+    if ($#argv >= 1) then
+      set source = $1
+      shift
+    endif
+  else if ("$1" == "-g") then
+    shift
+    if ($#argv >= 1) then
+      set get = $1
+      shift
+    endif
+  else if ("$1" == "-c") then
+    set complex = "-text"
+    shift
+  else if ("$1" == "-S") then
+# set slow merge option in mg_invf_merge
+    set slow_merge = "-s "
+    shift
+  else if ("$1" == "-w") then
+# turn weights guessing off (rebuild weights file from scratch)
+    set guess_weights = ""
+    shift
+
+# [RPAP - Feb 97: Level 3 Merge]
+  else if ("$1" == "-T") then
+# turn text pass off
+    set text_pass = 0
+    shift
+
+  else
+    if ($?text == "0") then
+      set text = $1
+    endif
+    shift
+  endif
+    
+end
+
+if ($?text == "0") then
+  set prog = $0
+  echo "USAGE:"
+  echo "     "$prog:t" [-s config-script] [-g get-program] [-c] source"
+  echo ""
+  echo " The config-script is only needed if a non-standard build is required."
+  echo " The get-program defaults to mg_get if not specified."
+  exit 1	
+endif
+
+set bindir = $0
+set bindir = $bindir:h
+
+# if $pipe == 1 then pipe in the source text using $get and $text otherwise
+# read the source text directly from the file names specified in $input_files
+set pipe = 1
+
+if ($?get == "0") then
+  set complex = "-text"
+  set get = $bindir/mg_get_merge
+endif
+
+if (-e $MGDATA/${text}.chunks) then
+  set input_files = `cat $MGDATA/${text}.chunks`
+endif
+
+# Set the inversion method this may be either "I" or "N"
+# N is memory-efficient, I is faster for small collections
+set invf_method = N
+
+
+# Set the stemming method
+#   Bit 0 = case folding
+#   Bit 1 = S stemmer
+set stem_method = 3
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then build collection with full indexes to blocked file
+# overriding stem_method (stem_method will be set to 0)
+# Otherwise don't build with indexes
+set do_indexes = 0
+
+
+# $invf_mem specifies the amount of memory to use for the pass2 inversion
+# This only has an effect if $invf_method is "N".
+set invf_mem = 32
+
+
+# $num_chunks specifies the number of interium chunks of inverted file that
+# may be written to disc before a merge into the invf file is done
+# This only has an effect if $invf_method is "N".
+set num_chunks = 3
+
+# $invf_level specifies the level of the inverted file that will be generated.
+# Note: The value *MUST* be the same as was used to build the collection
+# that is being merged.
+# In the current mg_invf_merge implementation the maximum level is 2. 
+# Paragraph-level inversion (invf_level = 3) is NOT supported.
+set invf_level = 2
+
+
+# If $strip_sgml == 1 then sgml tags are stripped from the inversion phase.
+# Otherwise sgml tags are kepted.
+set strip_sgml = 1
+
+
+# $trace specifies the interval between trace entries in Mb.
+# If this is not set no trace entries will be generated.
+set trace = 10
+
+
+# $weight_bits specifies the number of bits of precision bo be given to the 
+# approximate weights.
+set weight_bits = 6
+
+
+# $mcd specifies the commandline arguments for the mg_compression_dict program
+set mcd = -S
+
+# $merge_name is the name of the subdirectory under ${MGDATA} where
+# the mergeing steps will be performed. There should NOT be an mg
+# collection with this name! The default is "MERGE"
+set merge = "MERGE"
+
+# Source the parameter file to modify parameters of the build.
+if ($?source) then
+  source ${source}
+endif
+
+
+# [RPAP - Jan 97: Stem Index Change]
+# If do_indexes == 1 then set stem_method = 0
+if ($do_indexes) then
+  set stem_method = 0
+endif
+
+
+# Generate the collection name.
+set coll_name = ${text}
+
+# Generate the directory where merging will take place
+if (-e $MGDATA/${merge}) then
+else
+  mkdir $MGDATA/${merge}
+endif
+
+# Generate the base name for the collection.
+# [RPAP - Feb 97: Level 3 Merge]
+set bname = ${coll_name}
+
+# generate the old, new and merge names in the $merge directory
+set oldname = ${merge}/${coll_name}.old
+set newname = ${merge}/${coll_name}.new
+set mergename = ${merge}/${coll_name}
+
+# build up the command lines for pass 1 and 2 to build a
+# dummy collection for the new documents
+set pass1 = (-f ${newname} -${invf_level} -m ${invf_mem} -s ${stem_method})
+set pass2 = (-f ${newname} -${invf_level} -c ${num_chunks})
+
+if ($strip_sgml) then
+  set pass1 = (${pass1} -G)
+  set pass2 = (${pass2} -G)
+endif
+
+if ($?trace) then
+  set pass1 = (${pass1} -t ${trace})
+  set pass2 = (${pass2} -t ${trace})
+endif
+
+# Note that a -T1 pass isnt done since the old .text.stats file is used
+# as the compression model for compressing the new documents.
+
+# [RPAP - Feb 97: Level 3 Merge]
+# Do not perform -T2 pass if text_pass == 0
+if ($text_pass) then
+  set pass2 = (${pass2} -T2)
+endif
+
+set pass1 = (${pass1} -${invf_method}1)
+set pass2 = (${pass2} -${invf_method}2)
+
+
+if ($?trace_name) then
+  set pass1 = (${pass1} -n ${trace_name})
+  set pass2 = (${pass2} -n ${trace_name})
+endif
+  
+if ($?comp_stats) then
+  set pass2 = (${pass2} -C ${comp_stats})
+endif
+
+########################################################################
+# Here is where mgmerge goes to work.
+
+echo "--------------------------------------------------------------"
+echo "`uname -n`, `date`"
+echo "MGMERGE collection: ${bname}"
+echo "--------------------------------------------------------------"
+echo "FIRST PHASE: build new collection from new documents"
+echo "--------------------------------------------------------------"
+
+# move and rename the text dictionary file
+# [RPAP - Feb 97: Level 3 Merge] - only if performing text pass
+if ($text_pass) then
+  mv $MGDATA/${bname}.text.dict $MGDATA/${newname}.text.dict
+endif
+
+if ($pipe) then
+  if ("$complex" != "") then
+    echo ">> $get $text -init"
+    $get $text -init
+    if ("$status" != "0") exit 1 
+    echo "-----------------------------------"
+  endif  
+endif
+
+if ($pipe) then
+  if ($?pass1filter) then
+    echo ">> $get $text $complex | $pass1filter | mg_passes ${pass1}"
+    $get $text $complex| $pass1filter | $bindir/mg_passes ${pass1}
+    if ("$status" != "0") exit 1 
+  else
+    echo ">> $get $text $complex | mg_passes ${pass1}"
+    $get $text $complex| $bindir/mg_passes ${pass1}
+    if ("$status" != "0") exit 1 
+  endif
+else
+  echo ">> mg_passes ${pass1} ${input_files}"
+  $bindir/mg_passes ${pass1} ${input_files}
+  if ("$status" != "0") exit 1 
+endif
+echo "-----------------------------------"
+
+echo "mg_perf_hash_build -f ${newname}"
+$bindir/mg_perf_hash_build -f ${newname}
+if ("$status" != "0") exit 1 
+echo "-----------------------------------"
+
+if ($pipe) then
+  if ($?pass2filter) then
+    echo ">> $get $text $complex | $pass2filter | mg_passes ${pass2}"
+    $get $text $complex | $pass2filter | $bindir/mg_passes ${pass2}
+    if ("$status" != "0") exit 1 
+  else
+    echo ">> $get $text $complex | mg_passes ${pass2}"
+    $get $text $complex | $bindir/mg_passes ${pass2}
+    if ("$status" != "0") exit 1 
+  endif
+else
+  echo ">> mg_passes ${pass2} ${input_files}"
+  $bindir/mg_passes ${pass2} ${input_files}
+  if ("$status" != "0") exit 1 
+endif
+echo "-----------------------------------"
+
+if ($pipe) then
+  if ("$complex" != "") then
+    echo "-----------------------------------"
+    echo ">> $get $text -cleanup"
+    $get $text -cleanup
+    if ("$status" != "0") exit 1 
+  endif
+endif
+
+echo "---------------------------------------"
+date
+echo "--------------------------------------------------------------"
+echo "SECOND PHASE: merge the two collections"
+echo "--------------------------------------------------------------"
+
+# move the appropriate files from the base directory to the merge dir
+echo "(moving files....)"
+# [RPAP - Feb 97: Level 3 Merge]
+# Move files if doing text pass
+if ($text_pass) then
+  mv $MGDATA/${bname}.text       $MGDATA/${oldname}.text
+  mv $MGDATA/${bname}.text.idx   $MGDATA/${oldname}.text.idx
+else
+# Need this file if building weights
+  cp -d $MGDATA/${bname}.text.idx   $MGDATA/${mergename}.text.idx
+endif
+mv $MGDATA/${bname}.invf       $MGDATA/${oldname}.invf
+mv $MGDATA/${bname}.invf.idx   $MGDATA/${oldname}.invf.idx
+mv $MGDATA/${bname}.invf.dict  $MGDATA/${oldname}.invf.dict
+# the old weight file may be used for the new file
+mv $MGDATA/${bname}.weight     $MGDATA/${mergename}.weight
+# EOC: the old invf.paragraph file may be used for the new file for Level 3 Invf
+if (-e $MGDATA/${bname}.invf.paragraph) then
+  mv $MGDATA/${bname}.invf.paragraph  $MGDATA/${mergename}.invf.paragraph
+endif
+echo "---------------------------------------"
+
+# [RPAP - Feb 97: Level 3 Merge]
+# Only merge text if doing text pass
+if ($text_pass) then
+  echo ">> mg_text_merge -f ${mergename}"
+  $bindir/mg_text_merge -f $mergename
+  echo "---------------------------------------"
+endif
+
+echo ">> mg_invf_merge ${slow_merge}${guess_weights} -f ${mergename}"
+$bindir/mg_invf_merge ${slow_merge}${guess_weights} -f ${mergename}
+echo "---------------------------------------"
+
+#remove .weight file, so a new one will be created by mg_weights_build
+if ("$guess_weights" == "") then
+  echo "rm ${mergename}.weight"
+  rm $MGDATA/${mergename}.weight
+endif
+
+# mv $MGDATA/${mergename}.weight $MGDATA/${mergename}.w2
+
+echo ">> mg_weights_build -f ${mergename} -b ${weight_bits}"
+$bindir/mg_weights_build -f ${mergename} -b ${weight_bits}
+if ("$status" != "0") exit 1 
+
+echo "---------------------------------------"
+
+echo ">> mg_invf_dict -f ${mergename} -b 4096"
+$bindir/mg_invf_dict -f ${mergename} -b 4096
+
+# [RPAP - Jan 97: Stem Index Change]
+if ($do_indexes) then
+  echo "-----------------------------------"
+
+  echo "mg_stem_idx -f ${mergename} -b 4096 -s1"
+  $bindir/mg_stem_idx -f ${mergename} -b 4096 -s1
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${mergename} -b 4096 -s2"
+  $bindir/mg_stem_idx -f ${mergename} -b 4096 -s2
+  if ("$status" != "0") exit 1 
+
+  echo ""
+
+  echo "mg_stem_idx -f ${mergename} -b 4096 -s3"
+  $bindir/mg_stem_idx -f ${mergename} -b 4096 -s3
+  if ("$status" != "0") exit 1 
+endif
+
+echo "--------------------------------------------------------------"
+
+# move files back to base dir
+# [RPAP - Feb 97: Level 3 Merge]
+# mv the text files if doing text pass
+if ($text_pass) then
+  mv $MGDATA/${oldname}.text         $MGDATA/${bname}.text
+  mv $MGDATA/${mergename}.text.idx   $MGDATA/${bname}.text.idx
+  mv $MGDATA/${newname}.text.dict    $MGDATA/${bname}.text.dict
+endif
+mv $MGDATA/${mergename}.invf       $MGDATA/${bname}.invf
+mv $MGDATA/${mergename}.invf.idx   $MGDATA/${bname}.invf.idx
+mv $MGDATA/${mergename}.invf.dict  $MGDATA/${bname}.invf.dict
+mv $MGDATA/${mergename}.invf.dict.blocked  $MGDATA/${bname}.invf.dict.blocked
+
+# [RPAP - Jan 97: Stem Index Change]
+if ($do_indexes) then
+  mv $MGDATA/${mergename}.invf.dict.blocked.1 $MGDATA/${bname}.invf.dict.blocked.1
+  mv $MGDATA/${mergename}.invf.dict.blocked.2 $MGDATA/${bname}.invf.dict.blocked.2
+  mv $MGDATA/${mergename}.invf.dict.blocked.3 $MGDATA/${bname}.invf.dict.blocked.3
+endif
+
+mv $MGDATA/${mergename}.weight     $MGDATA/${bname}.weight
+mv $MGDATA/${mergename}.weight.approx $MGDATA/${bname}.weight.approx
+mv $MGDATA/${mergename}.text.idx.wgt $MGDATA/${bname}.text.idx.wgt
+
+# EOC: mv .invf.paragraph file if exists
+if (-e $MGDATA/${mergename}.invf.paragraph) then
+  mv $MGDATA/${mergename}.invf.paragraph   $MGDATA/${bname}.invf.paragraph
+endif
+
+# remove old files in the MERGE directory
+rm -f $MGDATA/${merge}/*
+
+echo "mgstat -f ${bname} -E"
+$bindir/mgstat -f ${bname} -E
+if ("$status" != "0") exit 1 
+
+echo "--------------------------------------------------------------"
+echo "`uname -n`, `date`"
+echo "--------------------------------------------------------------"
+
+echo ""
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.1	(revision 21083)
@@ -0,0 +1,130 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH xmg 1 \*(Dt CITRI
+.SH NAME
+xmg \- An X interface to mgquery
+.SH SYNOPSIS
+.B xmg
+[
+.I collection-name
+]
+.SH DESCRIPTION
+.B xmg
+is an X interface to the
+.BR mg (1)
+information retrieval system.
+.PP
+Type a query in the ``Query'' box.  The escape key clears the query text.
+.PP
+The first line or so of each matching document is listed.
+.PP
+Click on any line to show the complete document.
+.PP
+Shift-click to show the document in a new window.
+.PP
+Press
+.I Next
+and
+.I Previous
+to cycle through the list of documents (shift works here too).
+.PP
+If you change the query, existing windows continue to refer to the
+original query.
+.PP
+You can select either Boolean or ranked queries:
+.RS
+.TP "\w'\fIBoolean queries:\fP'u+2n"
+.I "Boolean queries:"
+use ``&'' for AND, ``|'' for OR, ``!'' for NOT, and parentheses for
+grouping.
+.TP
+.I "Ranked queries:"
+Documents are listed in order of relevance.  A weight is shown
+alongside each.  Weights are normalized to 100 for the most relevant
+document.  Choose
+.I "Approximate Ranking"
+for greater retrieval speed.
+.RE
+.PP
+In document windows (other than the main window):
+.RS
+.br
+Typing `n' = next document;
+.br
+Typing `N' = next document in new window;
+.br
+Typing `p' = previous document;
+.br
+Typing `P' = previous document in new window;
+.br
+Typing `q' = close window.
+.RE
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.TP
+.SB Xdefaults
+To override the default font options, use RESOURCE_MANAGER properties
+like the following in your
+.I .Xdefaults
+file:
+.IP
+.RS
+.nf
+.I "xmg.textfont: fixed"
+.I "xmg.buttonfont: fixed"
+.fi
+.RE
+.IP
+To override the default query type of ranked, use
+.IP
+.RS
+.I "xmg.querytype: boolean"
+.RE
+.IP
+To override the default collection name (the first one listed by
+.BR ls (1)
+from your MGDATA environment variable), use
+.IP
+.RS
+.I "xmg.collection: mail93"
+.RE
+.SH "SEE ALSO"
+.na
+.BR ls (1),
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/scripts/xmg.sh	(revision 21083)
@@ -0,0 +1,1376 @@
+#!/usr/local/bin/wish -f
+# Edit the line above to point to your version of wish
+#
+###############################################################################
+#
+# xmg -- X interface to the mg information retrieval system
+# Copyright (C) 1994  Bruce McKenzie, Ian Witten and Craig Nevill-Manning
+#
+# 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.
+#
+#       @(#)xmg.sh	1.4 25 Mar 1994
+#
+###############################################################################
+#
+# "xmg" is an X interface to the mg information retrieval system.
+#
+# Type a query in the "Query" box.
+# The first line or so of each matching document is listed.
+# Click on any line to show the complete document.
+# Shift-click to show the document in a new window.
+# Press Next and Previous to cycle through the list of documents (Shift works
+#   here too). 
+# If you change the query, existing windows continue to refer to the original
+#   query. 
+# 
+# You can select either Boolean or Ranked queries.
+# Boolean queries: use "&" for AND, "|" for OR, "!" for NOT, and parentheses
+# for grouping 
+# Ranked queries:  - documents are listed in order of relevance; a weight is
+# 		     shown alongside each 
+#                  - weights are normalized to 100 for the most relevant
+#		     document 
+#                  - choose Approximate Ranking for greater retrieval speed. 
+# 
+# In document windows (other than the main window): 
+#		Typing 'n' = next document
+#		Typing 'N' = next document in new window
+#		Typing 'p' = previous document
+#		Typing 'P' = previous document in new window
+#		Typing 'q' = close window
+#
+###############################################################################
+
+# Date: 13 March 1994
+# Authors: Bruce McKenzie, Ian Witten and Craig Nevill-Manning
+
+###############################################################################
+# Customizing xmg
+###############################################################################
+
+# To override the default font options, use RESOURCE_MANAGER properties like
+# the following in your .Xdefaults file
+#
+#	xmg.textfont: fixed
+#	xmg.buttonfont: fixed
+#
+# To override the default query type of ranked, use
+#
+#	xmg.querytype: boolean
+#
+# To override the default collection name (the first one listed by /bin/ls from
+# your MGDATA environment variable), use
+#
+#	xmg.collection: mail93
+
+###############################################################################
+# Global variables
+###############################################################################
+
+#   genuine constants:
+#
+#	env		the environment variables
+#	Terminator	terminator for mgquery
+#	MaxWindowHeight	the maximum height permitted for a document window
+#	ListBoxLength	the number of items in the document list
+#	HeadLength	the length document head displayed in the list box
+#	ImageString	the string at the start of a document associated
+#			with an image
+#
+#   things that rarely get changed:
+#
+#	querytype	the current query type (boolean, ranked, approx-ranked)
+#	booleanquery	says whether the query is boolean or ranked
+#	approxquery	says whether ranking is to be approximate or not
+#	collection	the name of the document collection being used
+#	fileId		file identifer for a pipe to the mgquery process
+#       errorOccurred	flag to say that there has been an I/O error on the
+#			current collection
+#
+#   things that reflect items in the main panel
+#
+#	query		the current query
+#	hits		number of hits for the current query
+#	display		shell command to display the image associated with
+#			the last document retrieved
+#	scrolledto	document prefixes have been obtained for all documents
+#			up to this position in the document list
+#
+#   static variable needed in just one procedure
+#
+#	top_rank	weight associated with the first document retrieved
+#	windowname	unique id for each document window
+
+###############################################################################
+# High-level procedures
+###############################################################################
+
+proc SaveDocument {w} {
+  set file [FSBox "Save document to file:"]
+
+  if {$file != ""} {
+    if [file exists $file] {
+      toplevel .r
+      wm title .r "\n"
+      .r configure -borderwidth 2 -relief raised 
+      focus .r
+      label .r.message -text "The file already exists"
+      button .r.replace -text "Replace" -width 10 -height 2 \
+          -command "destroy .r; WriteDocument $file \"w\" $w" 
+      button .r.append -text "Append" -width 10 -height 2 \
+          -command "destroy .r; WriteDocument $file \"a\" $w"
+      button .r.cancel -text "Cancel" -command {destroy .r} -width 10 -height 2
+      pack .r.message -side top -pady 10 -padx 20
+      pack .r.replace .r.append .r.cancel -side left -pady 10 -padx 20
+
+    } else {
+       WriteDocument $file "w" $w
+    }
+  }
+}
+
+proc Dialog {text command} {
+      if {![winfo exists .r] } { toplevel .r }
+      wm title .r "\n"
+      .r configure -borderwidth 2 -relief raised 
+      focus .r
+      label .r.message -text $text
+      button .r.ok -text "OK" -width 10 -height 2 \
+          -command "destroy .r $command"
+      pack .r.message -side top -pady 10 -padx 20
+      pack .r.ok -side bottom -pady 10 -padx 20
+}
+
+proc WriteDocument {file mode w} {
+    if {[catch {set f [open $file $mode]}] == 0} {
+        if [winfo exists $w] {
+            puts $f [$w get 0.0 end]
+        } else {
+            Dialog "Unable to save text" ""
+        }
+        flush $f
+        close $f
+    } else {
+        Dialog "Unable to open file for writing" "; SaveDocument $w"
+    }
+}
+
+# Send a query to mg and enter the response in the document list
+#
+proc sendQuery {window} {
+    global query hits querytype errorOccurred scrolledto
+
+    .m.t.q.retrieved.label configure -foreground Gray
+    .m.t.q.retrieved.hits configure -foreground Gray
+
+    sendto ".set query \"$querytype\""
+    sendto ".set mode \"docnums\""
+    foreach f "sdocnums sdocs srank" { $window.$f delete 0 end }
+    disableButton .m.d.buttons.previous
+    disableButton .m.d.buttons.next
+    if {[string index $query 0] == "." || [string length $query] > 255} {
+        set doclist ""
+    } else { set doclist [sendandget $query] }
+
+    if {$errorOccurred} {
+        enterText .m.d.text [mgqueryFailure]
+        .m.t.q.retrieved.label configure -foreground Black
+        .m.t.q.retrieved.hits configure -foreground Black 
+        update
+        return
+    }
+    sendto ".set query \"DocNums\""
+    sendto ".set mode  \"text\""
+    .m.t.q.retrieved.label configure -foreground Black
+    .m.t.q.retrieved.hits configure -foreground Black 
+    set hits [llength $doclist]
+    set i 0
+    global top_rank
+
+    scan [lindex $doclist 0] "%d %f %d" d rank size
+    set top_rank $rank
+    if {$top_rank == 0} {set top_rank 1}
+
+    while {$i < $hits} {
+	scan [lindex $doclist $i] "%d %f %d" d rank size
+        if {$rank == "Inf"} {set rank 1}
+	if {$querytype == "boolean"} {
+	    $window.srank insert end ""
+	} else {
+	    $window.srank insert end \
+		[format "%3.0f" [expr $rank / $top_rank * 99 + 1]]
+	}
+	$window.sdocnums insert end [format " %d" $d]
+	incr i
+    }
+
+    set scrolledto 0
+    scroll $window 0
+    bind $window.sdocs <ButtonRelease-1> \
+	"showDocument $window.sdocs %y .m.d \"$doclist\" \"$query\""
+    bind $window.sdocs <Shift-ButtonRelease-1> \
+	"showDocument $window.sdocs %y New \"$doclist\" \"$query\""
+    enterText .m.d.text ""
+}
+
+# Scrolling routine for the document list
+#
+proc scroll {window n} {
+    global hits scrolledto ListBoxLength Terminator fileId ImageString
+
+    $window.sdocnums yview $n
+    $window.sdocs yview $n
+    $window.srank yview $n
+    set last $n
+    if {$last <= 0} {set last 0}
+    incr last $ListBoxLength
+    if {$last > $hits} {set last $hits}
+
+#    .m config -cursor {watch}
+#    update
+    sendto ".set mode \"heads\""
+    sendto ".set terminator \"\""
+    while {$scrolledto < $last} {
+	if {[scan [$window.sdocnums get $scrolledto] "%d" d] == 1} {
+            sendto $d
+            gets $fileId line
+            set i [string first " " $line]
+            if {$i != -1} {set line [string range $line [expr $i + 1] end]}
+            if {[string compare $ImageString [string range $line 0 9]] == 0} {
+                set line [getImageDocumentHead $d]
+            }
+	    $window.sdocs insert $scrolledto $line
+	}
+	incr scrolledto
+    }
+    sendto ".set terminator \"$Terminator\\n\""
+    sendto ".set mode text"
+#   .m config -cursor {}
+}
+
+proc getImageDocumentHead {d} {
+    global HeadLength ImageString fileId
+
+    sendto ".set heads_length 1000"
+    sendto $d
+    gets $fileId line
+
+    set line [string range $line 11 end]
+
+    set s [string first $ImageString $line]
+    if {$s != -1} {
+        incr s 11
+        set line [string range $line $s [expr $s + $HeadLength]]
+    }
+  
+    sendto ".set heads_length $HeadLength"
+
+    return "* $line"
+}
+
+# Show document from the document list
+#
+proc showDocument {window y newWindow doclist query} {
+    showThisDocument [$window nearest $y] $doclist $newWindow $query
+}
+
+proc adjacentDocument {index doclist window q button} {
+    global ListBoxLength
+
+    showThisDocument $index $doclist $window $q
+
+    if {$window == ".m.d"} {
+      set first [.m.t.q.r.sdocs nearest 0]
+      if {$index < $first || $index >= $first + $ListBoxLength} {
+          scroll .m.t.q.r [expr $index - $ListBoxLength / 2]
+      }
+      .m.t.q.r.sdocs select from $index
+    } 
+}
+
+
+# Show document with this index in the document list
+#
+proc showThisDocument {index doclist window q} {
+    global collection MaxWindowHeight display windowname
+
+    set document ""
+    scan [lindex $doclist $index] "%d %f" document rank
+    if {$document == ""} { return }
+    set textlist [sendandget $document]
+	
+    if {[string length $display] != 0} { exec csh -c $display >& /dev/null & }
+	
+# throw away the first line
+    set text [join [lrange $textlist 1 end] "\n"]
+
+# if necessary, create a new window for this document
+    if {$window == "New"} {
+        .m.t.q.r.sdocs select clear
+	set window .m.document$windowname
+        incr windowname
+        set existing ""
+        set raised 0
+        foreach w [lrange [winfo children .m] 2 end] {
+           if {[lindex [$w.docnum configure -text] 4] == $index && \
+               [lindex [$w.query configure -text] 4] == $q} {
+              if {$raised} {
+                 closeDocumentWindow $w
+              } else {
+                  raise $w
+		  getFocus $w
+                  set window $w
+                  set raised 1
+              }
+           }
+        }
+  
+        if {!$raised} {
+   	    toplevel $window
+            $window configure -borderwidth 2 -relief raised
+            wm protocol $window WM_TAKE_FOCUS "getFocus $window"
+	    getFocus $window
+	    makeDocumentPanel $window
+            bind $window q "$window.buttons.close invoke"
+            label $window.docnum -text $index
+            label $window.query -text $q
+       }
+    }
+
+# configure the window for this document
+    set rows [expr [llength $textlist] - 1]
+    if {$window != ".m.d"} {
+	wm title $window "$collection \"$q\""
+	wm iconname $window "$document"
+	$window.text configure -height $rows
+	if {$rows > $MaxWindowHeight} {
+	    $window.text configure -height $MaxWindowHeight
+	}
+    }
+
+# show the document text in the window
+    enterText $window.text $text
+
+# configure the window's Previous and Next buttons
+    if {$index == 0} {
+        disableButton $window.buttons.previous
+    } else {
+	set newindex [expr $index-1]
+	bindBoth $window previous $newindex $doclist $q
+        bind $window p [bind $window.buttons.previous <1>]
+        bind $window P [bind $window.buttons.previous <Shift-1>]
+    }
+    if {$index == [expr [llength $doclist]-1]} {
+	disableButton $window.buttons.next 
+    } else {
+	set newindex [expr $index+1]
+	bindBoth $window next $newindex $doclist $q
+        bind $window n [bind $window.buttons.next <1>]
+        bind $window N [bind $window.buttons.next <Shift-1>]
+    }
+
+    if {$window != ".m.d"} { $window.docnum configure -text $index }
+
+    if {[string length $display] != 0} { 
+        set on "{
+            if \[winfo exists $window\] \{
+                 $window.buttons.image configure \
+                   -foreground Black
+                 update\}
+        }"
+        set off "{
+            if \[winfo exists $window\] \{
+                 $window.buttons.image configure \
+                   -foreground [lindex [.m.d configure -background] 4]
+                 update\}
+        }"
+        set t 0
+        while {$t < 5} {
+            after [expr $t * 1000] eval $on
+            after [expr $t * 1000 + 500] eval $off
+            incr t
+        }   
+    }
+}
+
+# Bind both Button-1 and Shift-Button-1 commands
+#
+proc bindBoth {window button index doclist query} {
+    $window.buttons.$button configure -state normal
+    bind $window.buttons.$button <Button-1> \
+	"adjacentDocument $index \"$doclist\" $window \"$query\" $button"
+    bind $window.buttons.$button <Shift-Button-1> \
+	"adjacentDocument $index \"$doclist\" New \"$query\" $button"
+}
+
+# Change the type of query
+#
+proc changeQuerytype {name element op} {
+    global querytype booleanquery approxquery
+
+    if {$booleanquery} {
+	.m.t.b.type.approx configure -state disabled
+	.m.t.q.retrieved.weight configure \
+             -foreground [lindex [.m configure -background] 4]
+	set querytype boolean
+    } else {
+	.m.t.b.type.approx configure -state normal
+	.m.t.q.retrieved.weight configure -foreground Black
+	if {$approxquery} {
+	    set querytype "approx-ranked"
+	} else {
+	    set querytype "ranked"
+	}
+    }
+}
+
+proc enterText {window text} {
+    $window configure -state normal
+    $window delete 0.0 end
+    $window insert 0.0 $text
+    $window configure -state disabled
+}
+
+###############################################################################
+# IO and initialization
+###############################################################################
+
+# Send a message to mg and return the reply
+#
+proc sendandget {message} {
+    global fileId Terminator display errorOccurred ImageString
+    set display ""
+
+    .m config -cursor {watch}
+    update idletasks
+    set reply ""
+    sendto "$message\n"
+    if {$message != "" && !$errorOccurred} {
+        gets $fileId line
+    	while {[string compare $Terminator $line] != 0} {
+            lappend reply $line;
+            gets $fileId line
+        }
+
+        if {[string compare $ImageString [lindex $reply 1]] == 0 } {
+          if {[string compare "MGDATA" [string range [lindex $reply 3] 0 5]] == 0} {
+             set display [string range [lindex $reply 3] 7 end];
+          }
+          set reply [lrange $reply 4 end]
+        }
+    }
+
+    .m config -cursor {}
+    return $reply
+}
+    
+# Send a message to mg
+#
+proc sendto {message} {
+    global fileId errorOccurred
+
+    puts $fileId $message
+    set errorOccurred [catch {flush $fileId}]
+}
+
+# Reinitialise mgquery to work with a new document collection
+#
+proc reInitMG {c} {
+    global fileId
+    catch {close $fileId}
+    initMG $c
+}
+
+# Initialize mgquery to work with a specified text collection
+#
+proc initMG {c} {
+    global query hits fileId collection Terminator env errorOccurred
+    global HeadLength
+
+    set collection $c
+    set query ""
+    set hits 0
+    set errorOccurred 0
+
+    foreach f "sdocs srank" { .m.t.q.r.$f delete 0 end }
+    enterText .m.d.text ""
+    .m.t.b.collect.m configure -text $collection
+    foreach w [winfo children .m] {
+	if {[string first ".m.document" $w] == 0} { closeDocumentWindow $w }
+    }
+
+    disableButton .m.d.buttons.previous 
+    disableButton .m.d.buttons.next
+
+    if {$c != ""} {
+        set f $env(MGDATA)/$c
+
+        if {[file exists $f] && [file readable $f]} {
+    	    set fileId [open "| mgquery $collection" RDWR]
+	    sendto ".set expert \"true\""
+	    sendto ".set terminator \"$Terminator\\n\""
+	    sendto ".set pager \"cat\""
+            sendto ".set heads_length $HeadLength"
+	    return
+        }
+    }
+    bind .m.t.q.e.entry <Return> {null}
+    enterText .m.d.text [initializationFailure]
+    update
+}
+
+# Routine to obtain values from RESOURCE_MANAGER
+#
+proc query_resource {option class default} {
+	set val [option get . $option $class]
+	if {[string length $val] == 0} { return $default }
+	return $val
+}
+
+
+proc disableButton {b} {
+    bind $b <Button-1> {null}
+    bind $b <Shift-Button-1> {null}
+    $b configure -state disabled
+}
+
+proc null {} {}
+
+###############################################################################
+# Setting up windows
+###############################################################################
+
+proc removeFromWindowList {window} {
+    global stacking
+
+    set i 0
+    while {$i < [llength $stacking]} {
+      if {$window == [lindex $stacking $i]} {
+         set stacking [lreplace $stacking $i $i]
+      }
+      incr i
+    }
+}
+
+proc getFocus {window} {
+    global stacking
+
+    focus $window
+    removeFromWindowList $window
+    set stacking [linsert $stacking 0 $window]
+}
+
+proc closeDocumentWindow {w} {
+   global stacking
+   removeFromWindowList $w
+   set t [lindex $stacking 0]
+
+   if {$t != ""} {
+     focus $t
+     raise $t
+  }
+  destroy $w
+}
+
+# Make a "document" panel, including Previous, Next, and Close buttons
+#
+proc makeDocumentPanel {window} {
+    frame $window.buttons
+    button $window.buttons.previous -text "Previous" -width 10 -state disabled
+    button $window.buttons.next -text "Next" -width 10 -state disabled
+    button $window.buttons.close -text "Close" -width 10 \
+	-command "closeDocumentWindow $window"
+    button $window.buttons.save -text "Save" -width 10 \
+        -command "SaveDocument $window.text"
+
+    label $window.buttons.image -text "Fetching image..." \
+            -foreground [lindex [$window configure -background] 4]
+    pack $window.buttons.previous $window.buttons.next -side left
+    pack $window.buttons.image -side left -padx 10
+    pack $window.buttons.close $window.buttons.save -side right 
+    pack $window.buttons -side top -fill x 
+
+    text $window.text -borderwidth 2 -relief raised \
+             -setgrid true -width 80 -state disabled
+
+    $window.text configure -yscrollcommand "$window.sy set" 
+    scrollbar $window.sy -relief flat -command "$window.text yview"
+    pack $window.sy -side right -fill y 
+    pack $window.text -side top -expand yes -fill both
+}
+
+# Make the "buttons" panel, with the query type and collection name
+#
+proc mkButtons {window} {
+    global collection booleanquery approxquery env
+    frame $window.type
+    label $window.type.label -text "Query type"
+
+    radiobutton $window.type.boolean -text "Boolean" -variable booleanquery \
+	  -value 1 -relief flat
+
+    radiobutton $window.type.ranked -text "Ranked" -variable booleanquery \
+	  -value 0 -relief flat
+
+    checkbutton $window.type.approx -text "Approximate" -variable approxquery \
+	  -relief flat
+
+    trace variable booleanquery w changeQuerytype
+    trace variable approxquery w changeQuerytype
+
+    pack $window.type.label   -side top -anchor w
+    pack $window.type.boolean -side top -anchor w -padx 12
+    pack $window.type.ranked  -side top -anchor w -padx 12
+    pack $window.type.approx  -side top -anchor w -padx 36
+
+    pack $window.type -side top -anchor w -pady 12
+
+    frame $window.collect
+    label $window.collect.label -text "Collection: "
+    pack $window.collect.label -side left -anchor w
+
+    getViewer
+
+    set dirs [getMGDATA]
+    set collection ""
+    if {$dirs != ""} { set collection [lindex $dirs 0] }
+   
+    menubutton $window.collect.m -menu $window.collect.m.menu \
+	-relief sunken
+    menu $window.collect.m.menu
+    foreach c $dirs {
+        if {[file readable $env(MGDATA)/$c] && 
+            [file isdirectory $env(MGDATA)/$c]} {
+    	    $window.collect.m.menu add command -label $c \
+	        -command "reInitMG $c"
+        }
+    }
+    pack $window.collect.m -side left
+    pack $window.collect -side bottom -anchor w
+
+
+}
+
+# Check that the MGDATA environment variable is set, and is non-null
+#
+proc getMGDATA {} {
+    global env
+
+    set MGDATA 0
+    foreach i [array names env] {
+	if {$i == "MGDATA"} {
+	    set dirs [exec /bin/ls $env(MGDATA)]
+	    if {[info exists dirs]} { return $dirs }
+	}
+    }
+
+    return ""
+}
+
+proc getViewer {} {
+    global env
+
+    set viewer 0
+    foreach i [array names env] {
+	if {$i == "MGIMAGEVIEWER"} {set viewer $env(MGIMAGEVIEWER)}
+    }
+
+    if {$viewer == 0} {set env(MGIMAGEVIEWER) "xloadimage -quiet -fit stdin"}
+}
+
+# Make the "query" panel, with the query and list of retrieved documents
+#
+proc mkQuery {window} {
+    global hits ListBoxLength
+
+# at the top of the "query" panel is the "entry" frame
+    frame $window.e
+    label $window.e.label -text "Query"
+    entry $window.e.entry -relief sunk -width 47 -textvariable query
+    pack $window.e.label -side left
+    pack $window.e.entry -side right -expand yes -fill x
+    focus default $window.e.entry
+    focus $window.e.entry
+
+    bind $window.e.entry <Control-Key> {null}
+    bind $window.e.entry <Return> "sendQuery $window.r"
+    bind $window.e.entry <Escape> { set query "" }
+    bind $window.e.entry <2> {
+	%W insert insert [selection get STRING]
+	tk_entrySeeCaret %W
+    }
+
+# next is the "retrieved" frame
+    frame $window.retrieved
+    label $window.retrieved.weight -text "Weight"
+    label $window.retrieved.label -text "   Documents retrieved: "
+    label $window.retrieved.hits -width 4 -relief sunk -textvariable hits
+    set documentsRetrieved 0
+    pack $window.retrieved.weight $window.retrieved.label \
+        $window.retrieved.hits -side left
+
+# next is the "results" frame (note that the docnums listbox doesn't appear on
+# the screen)
+    frame $window.r
+    scrollbar $window.r.sscroll -relief sunken -command "scroll $window.r"
+#    bind $window.r.sscroll <ButtonRelease-1> "updateSdocs $window.r.sdocs $window.r.sdocnums"
+    listbox $window.r.sdocnums
+    listbox $window.r.sdocs -relief sunken \
+            -setgrid 1 -geometry 50x$ListBoxLength
+    listbox $window.r.srank -yscroll "$window.r.sscroll set" \
+            -setgrid 1 -geometry 4x$ListBoxLength
+  
+    bind $window.r.srank <Any-1> {null}
+    bind $window.r.srank <Any-2> {null}
+    bind $window.r.srank <Any-3> {null}
+
+    bind $window.r.srank <Any-B1-Motion> {null}
+    bind $window.r.srank <Any-B2-Motion> {null}
+    bind $window.r.srank <Any-B3-Motion> {null}
+
+    bind $window.r.sdocs <Any-2> {null}
+    bind $window.r.sdocs <Any-B2-Motion> {null}
+
+    pack $window.r.sscroll -side right -fill y
+    pack $window.r.srank -side left 
+    pack $window.r.sdocs -side left -fill x -expand yes
+
+# pack them up
+    pack $window.e -side top -anchor e -pady 10 -fill x -expand yes
+    pack $window.retrieved -anchor w
+    pack $window.r -side bottom -anchor e -pady 10 -fill x -expand yes
+}
+
+# Make a "help" window
+#
+proc mkHelp {} {
+    if [winfo exists .help] { destroy .help }
+    toplevel .help
+    wm title .help "X interface to the mg information retrieval system"
+    wm iconname .help "About xmg"
+    frame .help.buttons
+    button .help.buttons.close -text Close -command "destroy .help" -width 10
+    button .help.buttons.help -text Help -width 10
+    button .help.buttons.conditions -text Conditions -width 10
+    button .help.buttons.warranty -text Warranty -width 10
+    button .help.buttons.bugs -text Bugs -width 10
+
+    frame .help.t
+    text .help.t.text -relief raised -bd 2 -setgrid true -height 24 -width 95
+    .help.t.text configure -yscrollcommand ".help.t.sy set" 
+    scrollbar .help.t.sy -relief flat -command ".help.t.text yview"
+    
+    pack .help.buttons.close .help.buttons.help -side right -fill x
+    pack .help.buttons.conditions .help.buttons.warranty \
+         .help.buttons.bugs -side left
+    pack .help.buttons -side bottom -fill x
+
+    pack .help.t.text -side left -expand yes -fill both
+    pack .help.t.sy -side right -fill y 
+    pack .help.t -side top -fill both -expand yes
+    enterText .help.t.text [HelpText]
+    grayButton help
+}
+
+proc grayButton {button} {
+    bind .help.buttons.help <1> "enterText .help.t.text \[HelpText\]
+         grayButton help" 
+    .help.buttons.help configure -state normal
+
+    bind .help.buttons.bugs <1> "enterText .help.t.text \[Bugs\]
+         grayButton bugs" 
+    .help.buttons.bugs configure -state normal
+
+    bind .help.buttons.warranty <1> "enterText .help.t.text \[Warranty\]
+         grayButton warranty"
+    .help.buttons.warranty configure -state normal
+
+    bind .help.buttons.conditions <1> "enterText .help.t.text \[Conditions\]
+         grayButton conditions" 
+    .help.buttons.conditions configure -state normal
+    disableButton .help.buttons.$button
+}
+
+# The text for errors in the MG environment variable
+#
+
+
+proc bookDetails {} {
+  return { \
+
+ This X interface was written by Bruce McKenzie, Ian Witten and Craig Nevill-Manning.  
+ For information on mg, see
+             Witten, I.H.,  Moffat, A. and Bell, T.C. (1994) "Managing gigabytes: compressing
+             and indexing documents and images." Van Nostrand Reinhold, New York.
+             ISBN 0-442-01863-0, US $54.95; call 1 (800) 544-0550 to order.
+}
+}
+
+proc initializationFailure {} {
+    return [format "%s\n%s" {\
+In order to run XMG you need to have already created and indexed some document collections,
+ and placed them in a directory whose name is given by the environment variable MGDATA.
+ Your MGDATA variable is unset or does not specify a directory with files in; therefore XMG
+ cannot proceed.
+} [bookDetails]]
+}
+
+proc mgqueryFailure {} {
+    return [format "%s\n%s" {\
+In order to run XMG you need to have already created and indexed some document collections,
+ and placed them in a directory whose name is given by the environment variable MGDATA.
+ There is a problem with the collection that you have chosen. Please re-index the collection before
+ you use it again.
+} [bookDetails]]
+
+}
+
+# The text for the help message
+#
+proc HelpText {} {
+    return [format "%s\n%s" {\
+This is an X interface to the mg information retrieval system.
+
+ Type a query in the "Query" box.
+ The first line or so of each matching document is listed. 
+ Click on any line to show the complete document.
+ Shift-click to show the document in its own window
+ Press Next and Previous to cycle through the list of documents (Shift works here too).
+ In document windows (other than the main window), typing n or p shows the next and previous 
+ documents; N or P creates a new window for them. q closes the most recently created window.
+ If you change the query, existing windows continue to refer to the original query.
+ 
+ You can select either Boolean or Ranked queries.
+ Boolean queries: use & for AND, | for OR, ! for NOT, and parentheses for grouping
+ Ranked queries:  documents are listed in order of relevance; a weight is shown alongside each
+                                  weights are normalized to 100 for the most relevant document
+                                  choose Approximate Ranking for greater retrieval speed. 
+ } [bookDetails]]
+}
+
+proc reformat {text} {
+    regsub -all "\n *\n *" $text "BLEQUEWFI" text
+    regsub -all "\[ \t\n\r\]+" $text " " text
+    regsub -all "BLEQUEWFI" $text "\n\n" text
+    return $text
+}
+
+proc Conditions {} {
+    return [reformat [join [sendandget ".conditions\nTHISWILLNEVERMATCHANYTHING\n"] "\n"]]
+}
+
+proc Warranty {} {
+    return [reformat [join [sendandget ".warranty\nTHISWILLNEVERMATCHANYTHING\n"] "\n"]]
+}
+
+proc Bugs {} {
+    return [reformat {
+Known shortcomings of xmg include:
+
+    Slow picture viewing.  Pictures are decompressed in their entirety before a window is created 
+        for the picture.  This often results in a long delay with no feedback. Moreover, when 
+        an image's document is displayed repeatedly, multiple identical images are shown.
+
+    Sequential viewing.  There is no way of going to the next document in the collection to see the
+        context of documents that have been retrieved.  This would be trivial to implement but
+        conflicts with the interpretation of the "previous" and "next" buttons.
+    }]
+}
+
+###############################################################################
+# The main program
+###############################################################################
+
+scan [info tclversion] "%d.%d" major minor
+
+if {$major < 7} {
+    puts "xmg requires version 7.0 of the tcl interpreter. You are using version $major.$minor"
+    exit
+}
+
+# Default font settings
+set defaulttextfont   -adobe-times-medium-r-normal--14-140-75-75-p-74-iso8859-1
+set defaultbuttonfont -adobe-times-bold-r-normal--14-140-75-75-p-77-iso8859-1
+set textfont   [query_resource textfont Textfont $defaulttextfont]
+set buttonfont [query_resource buttonfont Buttonfont $defaultbuttonfont]
+
+set MaxWindowHeight 10
+set HeadLength 100
+set scrolledto 0
+set ListBoxLength 12
+set windowname 0
+set Terminator "RECORD_END"
+set fileId ""
+set query ""
+set ImageString "::::::::::"
+set stacking ".m.t"
+
+tk_listboxSingleSelect Listbox
+option add *Text.wrap word
+
+option add *Text.font $textfont
+option add *Listbox.font $textfont
+option add *Entry.font $textfont
+
+option add *Button.font $buttonfont
+option add *Menubutton.font $buttonfont
+option add *Radiobutton.font $buttonfont
+option add *Checkbutton.font $buttonfont
+option add *Label.font $buttonfont
+option add *Menu.font $buttonfont
+
+wm title . "Managing Gigabytes"
+wm iconname . "xmg"
+frame .m -borderwidth 5 -relief raised
+
+# top part of frame
+frame .m.t
+
+# on the left side of the top part is the "buttons" panel
+frame .m.t.b
+mkButtons .m.t.b
+
+# on the right side is the "query" panel
+frame .m.t.q
+mkQuery .m.t.q
+
+set q [query_resource querytype Querytype approx-ranked]
+set booleanquery [expr \"$q\" == \"boolean\"]
+set approxquery [expr \"$q\" == \"approx-ranked\"]
+# the above lines will trigger changeQuerytype
+
+pack .m.t.b -side left -anchor nw
+pack .m.t.q -side right -anchor ne -fill both -expand yes
+
+# at the bottom is the "document" panel
+frame .m.d
+makeDocumentPanel .m.d
+
+.m.d.buttons.close configure -text "Exit" \
+    -command "destroy ."
+button .m.d.buttons.help -text "Help" -width 10 \
+	-command "mkHelp"
+
+pack .m.d.buttons.help -side right
+pack .m.t -side top -fill x -expand yes
+pack .m.d -side bottom -fill both -expand yes
+
+pack .m -fill both -expand yes
+wm geometry . +300+85
+
+set collection [query_resource collection Collection $collection]
+if {$argc>0} { set collection $argv }
+
+enterText .m.d.text [HelpText]
+
+initMG $collection
+
+###############################################################################
+###############################################################################
+# The following file selection box procedure was written by Andrew Donkin
+# of the University of Waikato. 
+###############################################################################
+
+proc FSBox { {fsBoxMessage "Select file:"}} {
+# xf ignore me 5
+  global fsBox
+
+  set fsBox(name) ""
+  set fsBox(internalPath) [pwd]
+  set fsBox(pattern) "*"
+  set fsBox(all) 0
+
+  # build widget structure
+
+  # start build of toplevel
+  if {"[info commands XFDestroy]" != ""} {
+    catch {XFDestroy .fsBox}
+  } {
+    catch {destroy .fsBox}
+  }
+  toplevel .fsBox -borderwidth 0
+  wm geometry .fsBox 350x300 
+  wm title .fsBox {File select box}
+  wm maxsize .fsBox 1000 1000
+  wm minsize .fsBox 100 100
+  # end build of toplevel
+
+  label .fsBox.message1 -anchor c -text "$fsBoxMessage"
+  frame .fsBox.frame1  -borderwidth 0  -relief raised
+
+  button .fsBox.frame1.ok  -text "OK"  -command "
+      global fsBox
+      set fsBox(name) \[.fsBox.file.file get\]
+      set fsBox(path) \[.fsBox.path.path get\]
+
+      set fsBox(internalPath) \[.fsBox.path.path get\]
+
+      if {\"\[info commands XFDestroy\]\" != \"\"} {
+        catch {XFDestroy .fsBox}
+      } {
+        catch {destroy .fsBox}
+      }"
+
+  button .fsBox.frame1.rescan -text "Rescan" -command {
+      global fsBox
+      FSBoxFSShow [.fsBox.path.path get] [.fsBox.pattern.pattern get] $fsBox(all)
+  }
+
+  button .fsBox.frame1.cancel -text "Cancel" -command "
+      global fsBox
+      set fsBox(name) {}
+      set fsBox(path) {}
+
+      if {\"\[info commands XFDestroy\]\" != \"\"} {
+        catch {XFDestroy .fsBox}
+      } {
+        catch {destroy .fsBox}
+      }"
+
+  frame .fsBox.path -borderwidth 0 -relief raised
+  frame .fsBox.path.paths 
+  label .fsBox.path.paths.paths -borderwidth 0 -text "Pathname:"
+
+  entry .fsBox.path.path -relief sunken
+  .fsBox.path.path insert 0 $fsBox(internalPath)
+  frame .fsBox.pattern -borderwidth 0 -relief raised
+  frame .fsBox.pattern.patterns 
+
+  label .fsBox.pattern.patterns.patterns -borderwidth 0 -text "Selection pattern:"
+  entry .fsBox.pattern.pattern -relief sunken
+  .fsBox.pattern.pattern insert 0 $fsBox(pattern)
+  
+  frame .fsBox.files -borderwidth 0 -relief raised
+  scrollbar .fsBox.files.vscroll -relief raised -command ".fsBox.files.files yview"
+  scrollbar .fsBox.files.hscroll -orient horiz -relief raised -command ".fsBox.files.files xview" 
+  listbox .fsBox.files.files -exportselection false -relief raised -xscrollcommand \
+        ".fsBox.files.hscroll set" -yscrollcommand ".fsBox.files.vscroll set"
+  frame .fsBox.file -borderwidth 0 -relief raised
+  label .fsBox.file.labelfile -text "Filename:"
+  entry .fsBox.file.file -relief sunken
+  focus .fsBox.file.file
+
+  .fsBox.file.file delete 0 end
+  .fsBox.file.file insert 0 $fsBox(name)
+  
+  checkbutton .fsBox.pattern.all -offvalue 0 -onvalue 1 -text "Show all files" -variable fsBox(all) -command {
+      global fsBox
+      FSBoxFSShow [.fsBox.path.path get] [.fsBox.pattern.pattern get] $fsBox(all)
+    }
+
+  FSBoxFSShow $fsBox(internalPath) $fsBox(pattern) $fsBox(all)
+
+  # bindings
+  bind .fsBox.files.files <Double-Button-1> "FSBoxFSFileSelectDouble %W %y"
+  bind .fsBox.files.files <ButtonPress-1> "FSBoxFSFileSelect %W %y"
+  bind .fsBox.files.files <Button1-Motion> "FSBoxFSFileSelect %W %y"
+  bind .fsBox.files.files <Shift-Button1-Motion> "FSBoxFSFileSelect %W %y"
+  bind .fsBox.files.files <Shift-ButtonPress-1> "FSBoxFSFileSelect %W %y"
+
+  bind .fsBox.path.path <Return> {
+    global fsBox
+    FSBoxFSShow [.fsBox.path.path get] [.fsBox.pattern.pattern get] $fsBox(all)
+    .fsBox.file.file icursor end
+    focus .fsBox.file.file}
+  catch "bind .fsBox.path.path <Up> {}"
+  bind .fsBox.path.path <Down> {
+    .fsBox.file.file icursor end
+    focus .fsBox.file.file}
+
+  bind .fsBox.file.file <Return> "
+    global fsBox
+    set fsBox(name) \[.fsBox.file.file get\]
+    set fsBox(path) \[.fsBox.path.path get\]
+    set fsBox(internalPath) \[.fsBox.path.path get\]
+
+    if {\"\[info commands XFDestroy\]\" != \"\"} {
+      catch {XFDestroy .fsBox}
+    } {
+      catch {destroy .fsBox}
+    }"
+  bind .fsBox.file.file <Up> {.fsBox.path.path icursor end
+    focus .fsBox.path.path}
+  bind .fsBox.file.file <Down> {.fsBox.pattern.pattern icursor end
+    focus .fsBox.pattern.pattern}
+
+  bind .fsBox.pattern.pattern <Return> {
+    global fsBox
+    FSBoxFSShow [.fsBox.path.path get] [.fsBox.pattern.pattern get] $fsBox(all)}
+  bind .fsBox.pattern.pattern <Up> {
+    .fsBox.file.file icursor end
+    focus .fsBox.file.file}
+  catch "bind .fsBox.pattern.pattern <Down> {}"
+
+  # packing
+  pack .fsBox.files.vscroll -side left -fill y 
+  pack .fsBox.files.hscroll -side bottom -fill x
+  pack .fsBox.files.files -side left -fill both -expand yes
+
+  pack .fsBox.file.labelfile -side left
+  pack .fsBox.file.file -side left -fill  both -expand yes
+
+  pack .fsBox.frame1.ok -side left -fill both -expand yes
+  pack .fsBox.frame1.rescan -side left -fill both -expand yes
+  pack .fsBox.frame1.cancel -side left -fill both -expand yes
+
+  pack .fsBox.path.paths.paths -side left
+
+  pack .fsBox.pattern.patterns.patterns -side left
+
+  pack .fsBox.path.paths -side left
+  pack .fsBox.path.path -side left -fill both -expand yes
+
+  pack .fsBox.pattern.patterns -side left
+  pack .fsBox.pattern.all -side right -fill both
+  pack .fsBox.pattern.pattern -side left -fill both -expand yes
+
+  pack .fsBox.message1 -side top -fill both
+  pack .fsBox.frame1 -side bottom -fill both
+  pack .fsBox.pattern -side bottom -fill both
+  pack .fsBox.file -side bottom -fill both
+  pack .fsBox.path -side bottom -fill both
+  pack .fsBox.files -side left -fill both -expand yes
+
+  update idletask
+  grab .fsBox
+  tkwait window .fsBox
+
+  if {"[string trim $fsBox(path)]" != "" ||
+      "[string trim $fsBox(name)]" != ""} {
+    if {"[string trimleft [string trim $fsBox(name)] /]" == ""} {
+      return [string trimright [string trim $fsBox(path)] /]
+    } {
+      return [string trimright [string trim $fsBox(path)] /]/[string trimleft [string trim $fsBox(name)] /]
+    }
+  }
+}
+
+proc FSBoxBindSelectOne { fsBoxW fsBoxY} {
+# xf ignore me 6
+
+  set fsBoxNearest [$fsBoxW nearest $fsBoxY]
+  if {$fsBoxNearest >= 0} {
+    $fsBoxW select from $fsBoxNearest
+    $fsBoxW select to $fsBoxNearest
+  }
+}
+
+proc FSBoxFSFileSelect { fsBoxW fsBoxY} {
+# xf ignore me 6
+  global fsBox
+
+  FSBoxBindSelectOne $fsBoxW $fsBoxY
+  set fsBoxNearest [$fsBoxW nearest $fsBoxY]
+  if {$fsBoxNearest >= 0} {
+    set fsBoxTmpEntry [$fsBoxW get $fsBoxNearest]
+    if {"[string index $fsBoxTmpEntry           [expr [string length $fsBoxTmpEntry]-1]]" == "/" ||
+        "[string index $fsBoxTmpEntry           [expr [string length $fsBoxTmpEntry]-1]]" == "@"} {
+      set fsBoxFileName [string range $fsBoxTmpEntry 0             [expr [string length $fsBoxTmpEntry]-2]]
+      if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]] &&
+          ![IsASymlink [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
+        set fsBoxFileName $fsBoxTmpEntry
+      }
+    } {
+      if {"[string index $fsBoxTmpEntry             [expr [string length $fsBoxTmpEntry]-1]]" == "*"} {
+        set fsBoxFileName [string range $fsBoxTmpEntry 0           [expr [string length $fsBoxTmpEntry]-2]]
+        if {![file executable $fsBox(internalPath)/$fsBoxFileName]} {
+          set fsBoxFileName $fsBoxTmpEntry
+        }
+      } {
+        set fsBoxFileName $fsBoxTmpEntry
+      }
+    }
+    if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
+      set fsBox(name) $fsBoxFileName
+      .fsBox.file.file delete 0 end
+      .fsBox.file.file insert 0 $fsBox(name)
+    }
+  }
+}
+
+proc FSBoxFSFileSelectDouble { fsBoxW fsBoxY} {
+# xf ignore me 6
+  global fsBox
+
+  FSBoxBindSelectOne $fsBoxW $fsBoxY
+  set fsBoxNearest [$fsBoxW nearest $fsBoxY]
+  if {$fsBoxNearest >= 0} {
+    set fsBoxTmpEntry [$fsBoxW get $fsBoxNearest]
+    if {"$fsBoxTmpEntry" == "../"} {
+      set fsBoxTmpEntry [string trimright [string trim $fsBox(internalPath)] "@/"]
+      if {"$fsBoxTmpEntry" == ""} {
+        return
+      }
+      FSBoxFSShow [file dirname $fsBoxTmpEntry]         [.fsBox.pattern.pattern get] $fsBox(all)
+      .fsBox.path.path delete 0 end
+      .fsBox.path.path insert 0 $fsBox(internalPath)
+    } {
+      if {"[string index $fsBoxTmpEntry [expr [string length $fsBoxTmpEntry]-1]]" == "/" ||
+          "[string index $fsBoxTmpEntry [expr [string length $fsBoxTmpEntry]-1]]" == "@"} {
+        set fsBoxFileName [string range $fsBoxTmpEntry 0               [expr [string length $fsBoxTmpEntry]-2]]
+        if {![IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]] &&
+            ![IsASymlink [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
+          set fsBoxFileName $fsBoxTmpEntry
+        }
+      } {
+        if {"[string index $fsBoxTmpEntry [expr [string length $fsBoxTmpEntry]-1]]" == "*"} {
+          set fsBoxFileName [string range $fsBoxTmpEntry 0                 [expr [string length $fsBoxTmpEntry]-2]]
+          if {![file executable $fsBox(internalPath)/$fsBoxFileName]} {
+            set fsBoxFileName $fsBoxTmpEntry
+          }
+        } {
+          set fsBoxFileName $fsBoxTmpEntry
+        }
+      }
+      if {[IsADir [string trimright $fsBox(internalPath)/$fsBoxFileName @]]} {
+        set fsBox(internalPath) "[string trimright $fsBox(internalPath) {/@}]/$fsBoxFileName"
+        FSBoxFSShow $fsBox(internalPath) [.fsBox.pattern.pattern get] $fsBox(all)
+        .fsBox.path.path delete 0 end
+        .fsBox.path.path insert 0 $fsBox(internalPath)
+      } {
+        set fsBox(name) $fsBoxFileName
+        set fsBox(path) $fsBox(internalPath)
+        if {"[info commands XFDestroy]" != ""} {
+          catch {XFDestroy .fsBox}
+        } {
+          catch {destroy .fsBox}
+        }
+      }
+    }
+  }
+}
+
+proc FSBoxFSShow { fsBoxPath fsBoxPattern fsBoxAll} {
+# xf ignore me 6
+  global fsBox
+
+  set fsBox(pattern) $fsBoxPattern
+
+  if {[file exists $fsBoxPath] && [file readable $fsBoxPath] &&
+      [IsADir $fsBoxPath]} {
+    set fsBox(internalPath) $fsBoxPath
+  } {
+    if {[file exists $fsBoxPath] && [file readable $fsBoxPath] &&
+        [IsAFile $fsBoxPath]} {
+      set fsBox(internalPath) [file dirname $fsBoxPath]
+      .fsBox.file.file delete 0 end
+      .fsBox.file.file insert 0 [file tail $fsBoxPath]
+      set fsBoxPath $fsBox(internalPath)
+    } {
+      while {"$fsBoxPath" != "" && "$fsBoxPath" != "/" &&
+             ![file isdirectory $fsBoxPath]} {
+        set fsBox(internalPath) [file dirname $fsBoxPath]
+         set fsBoxPath $fsBox(internalPath)
+      }
+    }
+  }
+  if {"$fsBoxPath" == ""} {
+    set fsBoxPath "/"
+    set fsBox(internalPath) "/"
+  }
+  .fsBox.path.path delete 0 end
+  .fsBox.path.path insert 0 $fsBox(internalPath)
+
+  if {[.fsBox.files.files size] > 0} {
+    .fsBox.files.files delete 0 end
+  }
+  if {$fsBoxAll} {
+    if {[catch "exec ls -F -a $fsBoxPath" fsBoxResult]} {
+      puts stderr "$fsBoxResult"
+    }
+  } {
+    if {[catch "exec ls -F $fsBoxPath" fsBoxResult]} {
+      puts stderr "$fsBoxResult"
+    }
+  }
+  set fsBoxElementList [lsort $fsBoxResult]
+
+  foreach fsBoxCounter [winfo children .fsBox.pattern.patterns.patterns] {
+    if {[string length [info commands XFDestroy]] > 0} {
+      catch {XFDestroy $fsBoxCounter}
+    } {
+      catch {destroy $fsBoxCounter}
+    }
+  }
+  menu .fsBox.pattern.patterns.patterns.menu
+
+  if {"$fsBoxPath" != "/"} {
+    .fsBox.files.files insert end "../"
+  }
+  foreach fsBoxCounter $fsBoxElementList {
+    if {[string match $fsBoxPattern $fsBoxCounter] ||
+        [IsADir [string trimright $fsBoxPath/$fsBoxCounter "/@"]]} {
+      if {"$fsBoxCounter" != "../" &&
+          "$fsBoxCounter" != "./"} {
+        .fsBox.files.files insert end $fsBoxCounter
+      }
+    }
+  }
+}
+
+proc IsADir { pathName} {
+# xf ignore me 5
+  if {[file isdirectory $pathName]} {
+    return 1
+  } {
+    catch "file type $pathName" fileType
+    if {"$fileType" == "link"} {
+      if {[catch "file readlink $pathName" linkName]} {
+        return 0
+      }
+      catch "file type $linkName" fileType
+      while {"$fileType" == "link"} {
+        if {[catch "file readlink $linkName" linkName]} {
+          return 0
+        }
+        catch "file type $linkName" fileType
+      }
+      return [file isdirectory $linkName]
+    }
+  }
+  return 0
+}
+
+proc IsAFile { fileName} {
+# xf ignore me 5
+  if {[file isfile $fileName]} {
+    return 1
+  } {
+    catch "file type $fileName" fileType
+    if {"$fileType" == "link"} {
+      if {[catch "file readlink $fileName" linkName]} {
+        return 0
+      }
+      catch "file type $linkName" fileType
+      while {"$fileType" == "link"} {
+        if {[catch "file readlink $linkName" linkName]} {
+          return 0
+        }
+        catch "file type $linkName" fileType
+      }
+      return [file isfile $linkName]
+    }
+  }
+  return 0
+}
+
+proc IsASymlink { fileName} {
+# xf ignore me 5
+  catch "file type $fileName" fileType
+  if {"$fileType" == "link"} {
+    return 1
+  }
+  return 0
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/GCC.mak
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/GCC.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/GCC.mak	(revision 21083)
@@ -0,0 +1,205 @@
+###########################################################################
+#
+# gcc win32 makefile -- mg\src\text
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+
+AR = ar
+RANLIB = ranlib
+CC = gcc
+DELETE = del
+INSTALL = copy
+
+o = .o
+e = .exe
+/ = \\
+
+CPPFLAGS = -g
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM -DHAVE_CONFIG_H \
+       -D_LITTLE_ENDIAN
+LIBS = ..$/..$/lib$/libmg.a
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c $o
+.c$o:
+	$(COMPILE) $<
+ 
+INCLUDES = -I"..$/.." -I"..$/..$/lib"
+
+
+SOURCES = \
+  backend.c               locallib.c              mg_weights_build.c   \
+  bool_optimiser.c        mg.special.c            mgdictlist.c         \
+  bool_parser.c           mg_compression_dict.c   mgquery.c            \
+  bool_query.c            mg_errors.c             mgstat.c             \
+  bool_tester.c           mg_fast_comp_dict.c     mg_decompress_text.c \
+  bool_tree.c             mg_files.c              query.docnums.c      \
+  commands.c              mg_hilite_words.c       query.ranked.c       \
+  comp_dict.c             mg_invf_dict.c          read_line.c          \
+  environment.c           mg_invf_dump.c          stem_search.c        \
+  mg_invf_merge.c         stemmer.c               mg_stem_idx.c        \
+  mg_invf_rebuild.c       term_lists.c            mgstemidxlist.c      \
+  invf_get.c              mg_passes.c             text.pass1.c         \
+  ivf.pass1.c             mg_perf_hash_build.c    text.pass2.c         \
+  ivf.pass2.c             mg_text_estimate.c      text_get.c           \
+  lists.c                 mg_text_merge.c         weights.c            \
+  query_term_list.c       words.c
+
+HEADERS = \
+  backend.h          conditions.h       locallib.h         term_lists.h \
+  bool_optimiser.h   environment.h      mg.h               text.h       \
+  bool_parser.h      globals.h          mg_errors.h        text_get.h   \
+  bool_query.h       hash.h             mg_files.h         warranty.h   \
+  bool_tree.h        help.mg.h          mg_merge.h         weights.h    \
+  build.h            invf.h             read_line.h        words.h      \
+  commands.h         invf_get.h         stem_search.h                   \
+  comp_dict.h        lists.h            stemmer.h                       \
+  query_term_list.h
+
+EXEC = \
+  mgquery$e mg_weights_build$e mgstat$e mg_invf_dump$e \
+  mg_invf_dict$e mg_invf_rebuild$e mgdictlist$e \
+  mg_passes$e mg_perf_hash_build$e mg_compression_dict$e \
+  mg_text_estimate$e mg_fast_comp_dict$e mg_hilite_words$e \
+  mg_invf_merge$e mg_text_merge$e bool_tester$e \
+  mg_stem_idx$e  mgstemidxlist$e mg_decompress_text$e
+
+all:    $(EXEC) libtextin.a
+
+HILITE_OBJS = mg_hilite_words$o stemmer$o locallib$o words$o
+mg_hilite_words$e: $(HILITE_OBJS)
+	$(LINK) $(HILITE_OBJS) $(LIBS)
+
+BOOL_OBJS = bool_tree$o bool_parser$o bool_optimiser$o bool_tester$o \
+	    term_lists$o stemmer$o stem_search$o mg_errors$o query_term_list$o \
+	    words$o
+bool_tester$e: $(BOOL_OBJS)
+	$(LINK) $(BOOL_OBJS) $(LIBS)
+
+QUERY_OBJS = \
+	mgquery$o locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o bool_query$o \
+	query_term_list$o words$o
+mgquery$e: $(QUERY_OBJS)
+	$(LINK) $(QUERY_OBJS) $(LIBS)
+
+commands$o : help.mg.h warranty.h conditions.h
+
+PASSES_OBJS = \
+	mg_passes$o text.pass1$o comp_dict$o stemmer$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o \
+	words$o
+mg_passes$e: $(PASSES_OBJS)
+	$(LINK) $(PASSES_OBJS) $(LIBS)
+
+WEIGHTS_BUILD_OBJS = mg_weights_build$o mg_files$o
+mg_weights_build$e: $(WEIGHTS_BUILD_OBJS)
+	$(LINK) $(WEIGHTS_BUILD_OBJS) $(LIBS)
+
+COMP_DICT_OBJS = mg_compression_dict$o mg_files$o locallib$o
+mg_compression_dict$e: $(COMP_DICT_OBJS)
+	$(LINK) $(COMP_DICT_OBJS) $(LIBS)
+
+FAST_COMP_OBJS = mg_fast_comp_dict$o mg_files$o locallib$o
+mg_fast_comp_dict$e: $(FAST_COMP_OBJS)
+	$(LINK) $(FAST_COMP_OBJS) $(LIBS)
+
+TEXT_EST_OBJS = mg_text_estimate$o locallib$o comp_dict$o mg_files$o
+mg_text_estimate$e: $(TEXT_EST_OBJS)
+	$(LINK) $(TEXT_EST_OBJS) $(LIBS)
+
+STAT_OBJS = mgstat$o mg_files$o locallib$o
+mgstat$e: $(STAT_OBJS)
+	$(LINK) $(STAT_OBJS) $(LIBS)
+
+INVF_DUMP_OBJS = mg_invf_dump$o locallib$o mg_files$o
+mg_invf_dump$e: $(INVF_DUMP_OBJS)
+	$(LINK) $(INVF_DUMP_OBJS) $(LIBS)
+
+INVF_DICT_OBJS = mg_invf_dict$o mg_files$o locallib$o
+mg_invf_dict$e: $(INVF_DICT_OBJS)
+	$(LINK) $(INVF_DICT_OBJS) $(LIBS)
+
+INVF_REB_OBJS = mg_invf_rebuild$o locallib$o
+mg_invf_rebuild$e: $(INVF_REB_OBJS)
+	$(LINK) $(INVF_REB_OBJS) $(LIBS)
+
+DICTLIST_OBJS = mgdictlist$o locallib$o
+mgdictlist$e: $(DICTLIST_OBJS)
+	$(LINK) $(DICTLIST_OBJS) $(LIBS)
+
+PERF_HASH_OBJS = mg_perf_hash_build$o mg_files$o
+mg_perf_hash_build$e: $(PERF_HASH_OBJS)
+	$(LINK) $(PERF_HASH_OBJS) $(LIBS)
+
+STEM_IDX_OBJS = mg_stem_idx$o mg_files$o stemmer$o locallib$o \
+                mg_errors$o term_lists$o
+mg_stem_idx$e: $(STEM_IDX_OBJS)
+	$(LINK) $(STEM_IDX_OBJS) $(LIBS)
+
+STEM_IDX_LIST_OBJS = mgstemidxlist$o mg_files$o
+mgstemidxlist$e: $(STEM_IDX_LIST_OBJS)
+	$(LINK) $(STEM_IDX_LIST_OBJS) $(LIBS)
+
+DECOMPRESS_TEXT_OBJS = mg_decompress_text$o query_term_list$o mg_files$o mg_errors$o \
+                       text_get$o locallib$o backend$o stem_search$o \
+                       term_lists$o stemmer$o weights$o invf_get$o lists$o
+mg_decompress_text$e: $(DECOMPRESS_TEXT_OBJS)
+	$(LINK) $(DECOMPRESS_TEXT_OBJS) $(LIBS)
+
+TEXT_MERGE_OBJS = mg_text_merge$o mg_files$o locallib$o
+mg_text_merge$e: $(TEXT_MERGE_OBJS)
+	$(LINK) $(TEXT_MERGE_OBJS) $(LIBS)
+
+INVF_MERGE_OBJS = mg_invf_merge$o mg_files$o locallib$o
+mg_invf_merge$e: $(INVF_MERGE_OBJS)
+	$(LINK) $(INVF_MERGE_OBJS) $(LIBS)
+
+install: 
+	$(INSTALL) *$e ..$/..$/..$/..$/bin$/windows
+
+LIB_OBJS = \
+	query_term_list$o \
+	locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o \
+	bool_query$o words$o
+
+libtextin.a: $(LIB_OBJS)
+	$(DELETE) libtextin.a
+	$(AR) cru libtextin.a $(LIB_OBJS)
+	$(RANLIB) libtextin.a
+
+clean:
+	$(DELETE) *$o 
+	$(DELETE) *$e
Index: /main/tags/2.38/gsdl/packages/mg/src/text/MGPASS.C
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/MGPASS.C	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/MGPASS.C	(revision 21083)
@@ -0,0 +1,507 @@
+/**************************************************************************
+ *
+ * mgpass.cpp -- Driver for the various passes -
+
+	V1 -  removed all the pipe processing and replaced with
+	      code to directly explore a directory of files.
+	V2 -  rebuilt to extract non text files from web browser
+	      'catch' file.  Also to display progress count
+			   GH/WJR
+
+ * Copyright (C) 1994  Neil Sharman, ..
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include <malloc.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <io.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "memlib.h"
+#include "messages.h"
+
+#include "longlong.h"
+
+#include "mg_files.h"
+#include "mg.h"
+#include "build.h"
+#include "text.h"
+#include "stemmer.h"
+
+/*
+   $Log$
+   Revision 1.2  2001/09/20 02:32:00  cs025
+   a few fixes for compiling under windows with new long long stuff in mg
+
+   Revision 1.1  1999/08/10 21:17:39  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.5  1998/12/02 01:32:40  sjboddie
+   fixed 1 missing semi-colon..
+
+   Revision 1.4  1998/12/02 00:57:10  rjmcnab
+
+   Fixed to compile with the changes to the stemming.
+
+   Revision 1.3  1998/11/24 03:39:23  rjmcnab
+
+   Fixed a small error in the windows compilation
+
+   Revision 1.2  1998/11/24 01:29:39  rjmcnab
+
+   Fixed a few problems with the windows build
+
+   Revision 1.1  1998/11/17 09:34:12  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:57  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:52  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#define MAX_PASSES 5
+
+#define SPECIAL 1
+#define TEXT_PASS_1 2
+#define TEXT_PASS_2 4
+#define IVF_PASS_1 8
+#define IVF_PASS_2 16
+
+#define MIN_BUF 8192
+#define path_length 256
+
+unsigned long buf_size = 3 * 1024 * 1024;       /* 3Mb */
+unsigned long invf_buffer_size = 5 * 1024 * 1024;       /* 5Mb */
+unsigned long ChunkLimit = 0;
+char InvfLevel = 2;
+char SkipSGML = 0;
+char MakeWeights = 0;
+FILE *Comp_Stats = NULL;
+int comp_stat_point = 0;
+mg_ullong bytes_processed = 0;
+int num_docs = 0;
+mg_ullong bytes_received = 0;
+int stem_method = 0;
+int stemmer_num = 0; /* default to the Lovin stemmer */
+
+static char Passes = 0;
+static unsigned long trace = 0;
+static int Dump = 0;
+static char **files = NULL;
+static int num_files = 0;
+static char *trace_name = NULL;
+
+static char dirname[path_length], wildname[path_length];
+static int by_para = 0, recurse = 0, html_catch = 0;
+static char *buffer;
+char *line_start, *data_end, *base, *scan;
+
+typedef struct pass_data
+  {
+    char *name;
+    int (*init) (char *);
+    int (*process) (u_char *, int);
+    int (*done) (char *);
+  }
+pass_data;
+
+static pass_data PassData[MAX_PASSES] =
+{
+  {"special", init_special, process_special, done_special},
+  {"text.pass1", init_text_1, process_text_1, done_text_1},
+  {"text.pass2", init_text_2, process_text_2, done_text_2},
+  {"ivf.pass1", init_ivf_1, process_ivf_1, done_ivf_1},
+  {"ivf.pass2", init_ivf_2, process_ivf_2, done_ivf_2},
+};
+
+static char *usage_str = "\nUSAGE:\n"
+"  %s [-h] [-G] [-D] [-1|-2|-3] [-T1] [-T2] [-I1] [-I2] [-N1]\n"
+"  %*s [-N2] [-W] [-S] [-b buffer-size] [-d dictionary-directory]\n"
+"  %*s [-t trace-point Mb] [-m invf-memory] [-c chunk-limit]\n"
+"  %*s [-n trace-name] [-C comp-stat-size] [-s stem_method] -f doc-collection-name\n"
+"  %*s [source directory\\] [source file]\n";
+
+static void usage (char *err)
+{
+  if (err) Message (err);
+  fprintf (stderr, usage_str, msg_prefix, strlen (msg_prefix), "",
+    strlen (msg_prefix), "", strlen (msg_prefix), "");
+  exit (1);
+}
+
+void do_process(char *buffer, int num)
+{
+  int pass;
+  if (num == 0) Message ("Warning : Processing zero length document");
+  num_docs++;
+  bytes_processed += num;
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+	if (PassData[pass].process((u_char *)buffer, num) == COMPERROR)
+	   FatalError(1, "Error during file processing");
+}
+
+int refill(int in_fd)
+{
+  int num, bitleft;
+  bitleft = data_end - base;
+  memmove(buffer, base, bitleft);
+  if (buf_size - bitleft < MIN_BUF)
+    FatalError(1, "Paragraph too big for buffer");
+  num = read(in_fd, &buffer[bitleft], buf_size - bitleft);
+  line_start -= (base - buffer);
+  scan -= (base - buffer);
+  base = buffer;
+  data_end = buffer + bitleft + num;
+  if (num > 0) return 1; else return 0;
+}
+
+char *scanpara(int in_fd)
+{
+  int num, blank, in_blank, at_end;
+  num = read(in_fd,buffer,buf_size);
+  in_blank = 1;  base = buffer;  line_start = buffer;  scan = buffer;
+  data_end = buffer + num;  at_end = 0;
+  for (;;) {
+    blank = 1;  line_start = scan;                   // Get a line
+    while (scan < data_end  &&  *scan != '\n')
+      if (*scan++ > ' ') blank = 0;
+    if (scan >= data_end) {
+      if (refill(in_fd)) {
+	while (scan < data_end  &&  *scan != '\n')
+	  if (*scan++ > ' ') blank = 0;
+	if (scan < data_end) scan++;
+	}
+      else at_end = 1;
+      }
+    else scan++;
+    if (line_start < scan) {                         // If we have a line
+      if (in_blank) {
+	if (!blank) { in_blank = 0; base = line_start; }
+	}
+      else {
+	if (blank) {
+	  do_process(base, line_start - base);
+	  in_blank = 1;  base = line_start;
+	  }
+	}
+      }
+    if (at_end) break;
+    }
+  if (in_blank) base = scan;
+  if (scan + 2 <= buffer + buf_size) {
+    *scan++ = 26;  *scan++ = 10;
+    }
+  if (base < scan) do_process(base, scan - base);
+  return NULL;
+}
+
+char *scanfile(int in_fd)
+{
+  int num = read(in_fd,buffer,buf_size);  /*expect to read the whole file*/
+  if (num < 0) return "file locked";
+  if (num >= buf_size-1) return "file too long";
+  do_process(buffer, num);
+  return NULL;
+}
+
+void search(char *dname, char *fname)
+{
+  long dirtag;  struct _finddata_t dirinfo;  int in_fd;  char *res;
+  char search_name[path_length], found_name[path_length];
+
+  sprintf(search_name, "%s%s", dname, fname);    /*Scan files*/
+  dirtag = _findfirst(search_name, &dirinfo);
+  if (dirtag >= 0) {
+    do {
+      if ((dirinfo.attrib & (_A_SUBDIR | _A_HIDDEN | _A_SYSTEM)) == 0) {
+	sprintf(found_name,"%s%s",dname,dirinfo.name);
+	in_fd = open(found_name,O_RDONLY|O_BINARY);
+	if (in_fd >= 0) {
+	  if (by_para)
+	    res = scanpara(in_fd);
+	  else
+	    res = scanfile(in_fd);
+	  if (res != NULL) {
+	    Message("Error %s in processing file %s\n", res, found_name);
+	    exit(1);
+	    }
+	  close(in_fd);
+	  }
+	}
+      } while (_findnext(dirtag, &dirinfo) == 0);
+    _findclose(dirtag);
+    }
+
+  if (recurse == 0) return;
+
+  sprintf(search_name, "%s*.*", dname);          /*Look for subdirs*/
+  dirtag = _findfirst(search_name, &dirinfo);
+  if (dirtag < 0) return;
+  do {
+    if ( ((dirinfo.attrib & (_A_HIDDEN | _A_SYSTEM)) == 0)  &&
+	 ((dirinfo.attrib & _A_SUBDIR) != 0)  &&
+	 strcmp(dirinfo.name,".") != 0 &&
+	 strcmp(dirinfo.name,"..") != 0) {
+      sprintf(found_name,"%s%s",dname,dirinfo.name);
+      strcat(found_name,"\\");
+      search(found_name,fname);
+      }
+    } while (_findnext(dirtag, &dirinfo) == 0);
+  _findclose(dirtag);
+}
+
+static int toobig(int n)
+{
+  if (n > path_length) {
+    printf("Cannot handle urls > %d characters in length\n", path_length);
+    exit(1);
+    }
+  return 0;
+}
+
+void scan_catch(char *dname, char *fname)
+{
+  int in_fd, urllen, conlen, filesize;  char catch_name[path_length];
+  int filecount = 0;
+  enum { filekind_redirected, filekind_text, filekind_other } filekind;
+  sprintf(catch_name, "%s%s", dname, fname);
+  in_fd = open(catch_name,O_RDONLY|O_BINARY);
+  if (in_fd < 0)
+    FatalError(1, "Couldn't open catch file \"%s\"", catch_name);
+  for (;;) {
+    filecount++;  if (filecount%100 == 0) { printf("%d\r", filecount);  fflush(stdout); }
+    if (read(in_fd, &urllen, sizeof(int)) != sizeof(int) || toobig(urllen) ||
+	read(in_fd, catch_name, urllen) != urllen ||
+	read(in_fd, &conlen, sizeof(int)) != sizeof(int) || toobig(conlen) ||
+	read(in_fd, catch_name, conlen) != conlen) break;
+    if (conlen >= 1 && *catch_name == '@')
+      filekind = filekind_redirected;
+    else {
+      if (conlen >= 4 && strncmp(catch_name, "text", 4) == 0)
+	filekind = filekind_text;
+      else
+	filekind = filekind_other;
+      if (read(in_fd, &filesize, sizeof(int)) != sizeof(int))
+	FatalError(1, "File read failed for size field");
+      if (filesize > buf_size)
+	FatalError(1, "File too large (%d > %d)", filesize, buf_size);
+      if (read(in_fd, buffer, filesize) != filesize)
+	FatalError(1, "Failed to read file data");
+      }
+    if (filekind == filekind_text) do_process(buffer, filesize);
+    }
+  close(in_fd);
+}
+
+static void driver (FILE * Trace, char *file_name)
+{
+  int pass;
+
+  buffer = (char *)Xmalloc (buf_size);
+
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      {
+	if (PassData[pass].init (file_name) == COMPERROR)
+	  FatalError (1, "Error during init of \"%s\"",PassData[pass].name);
+      }
+
+  if (html_catch == 0) search(dirname, wildname);
+		  else scan_catch(dirname, wildname);
+
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      {
+	if (PassData[pass].done (file_name) == COMPERROR)
+	  FatalError (1, "Error during done of \"%s\"", PassData[pass].name);
+      }
+
+
+  free (buffer);
+}
+
+void main (int argc, char **argv)
+{
+  int ch;
+  char *filename = NULL;
+  FILE *Trace = NULL;
+
+  msg_prefix = argv[0];
+
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "hC:WHGpSD123f:d:b:T:I:t:m:N:c:n:s:")) != -1)
+    {
+      switch (ch)
+	{
+	case 'H':
+	  html_catch = 1;
+	  break;
+	case 'G':
+	  SkipSGML = 1;
+	  break;
+	case 'p':
+	  by_para = 1;
+	  break;
+	case 'S':
+	  Passes |= SPECIAL;
+	  break;
+	case '1':
+	  InvfLevel = 1;
+	  break;
+	case '2':
+	  InvfLevel = 2;
+	  break;
+	case '3':
+	  InvfLevel = 3;
+	  break;
+	case 'f':
+	  filename = optarg;
+	  break;
+	case 'n':
+	  trace_name = optarg;
+	  break;
+	case 'D':
+	  Dump = 1;
+	  break;
+	case 'W':
+	  MakeWeights = 1;
+	  break;
+	case 'd':
+	  set_basepath (optarg);
+	  break;
+	case 's':
+	  stem_method = atoi (optarg) & STEMMER_MASK;
+	  break;
+	case 'b':
+	  buf_size = atoi (optarg) * 1024;
+	  break;
+	case 'C':
+	  comp_stat_point = atoi (optarg) * 1024;
+	  break;
+	case 'c':
+	  ChunkLimit = atoi (optarg);
+	  break;
+	case 'm':
+	  invf_buffer_size = (int) (atof (optarg) * 1024 * 1024);
+	  break;
+	case 'I':
+	case 'N': /* N kept for compatability */
+	  if (*optarg == '1')
+	    Passes |= IVF_PASS_1;
+	  else if (*optarg == '2')
+	    Passes |= IVF_PASS_2;
+	  else
+	    usage ("Invalid pass number");
+	  break;
+	case 'T':
+	  if (*optarg == '1')
+	    Passes |= TEXT_PASS_1;
+	  else if (*optarg == '2')
+	    Passes |= TEXT_PASS_2;
+	  else
+	    usage ("Invalid pass number");
+	  break;
+	case 't':
+	  trace = (unsigned long) (atof (optarg) * 1024 * 1024);
+	  break;
+	case 'h':
+	case '?':
+	  usage (NULL);
+	}
+    }
+
+  if (!filename || *filename == '\0')
+    FatalError (1, "A document collection name must be specified.");
+
+  if (buf_size < MIN_BUF)
+    FatalError (1, "The buffer size must exceed 1024 bytes.");
+
+  if ((Passes & (IVF_PASS_1 | IVF_PASS_2)) == (IVF_PASS_1 | IVF_PASS_2))
+    FatalError (1, "I1 and I2 cannot be done simultaneously.");
+
+  if ((Passes & (TEXT_PASS_1 | TEXT_PASS_2)) == (TEXT_PASS_1 | TEXT_PASS_2))
+    FatalError (1, "T1 and T2 cannot be done simultaneously.");
+
+  if (!Passes)
+    FatalError (1, "S, T1, T2, I1 or I2 must be specified.");
+
+  if (argc - optind == 1) {
+    strcpy(dirname,"");
+    strcpy(wildname,argv[optind]);
+    }
+  else if (argc - optind == 2) {
+    strcpy(dirname,argv[optind]);
+    strcpy(wildname,argv[optind+1]);
+    }
+  else FatalError(1, "Finder code requires directory and filespec.");
+
+  if (strrchr(wildname,'*') != NULL  ||  strrchr(wildname,'?') != NULL)
+    recurse = 1;
+
+  if (trace)
+    {
+      if (!trace_name)
+	trace_name = make_name (filename, TRACE_SUFFIX, NULL);
+      if (!(Trace = fopen (trace_name, "a")))
+	Message ("Unable to open \"%s\". No tracing will be done.", trace_name);
+      else
+	setbuf (Trace, NULL);
+    }
+  else
+    Trace = NULL;
+
+  if (comp_stat_point)
+    {
+      char *name = make_name (filename, COMPRESSION_STATS_SUFFIX, NULL);
+      if (!(Comp_Stats = fopen (name, "wb")))
+	Message ("Unable to open \"%s\". No comp. stats. will be generated.",
+		 name);
+    }
+
+
+  if (Trace)
+    {
+      int i;
+      fprintf (Trace, "\n\n\t\t-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
+      for (i = 0; i < argc; i++)
+	fprintf (Trace, "%s ", argv[i]);
+      fprintf (Trace, "\n\n");
+    }
+
+  driver (Trace, filename);
+
+  if (Trace)
+    fclose (Trace);
+
+  if (Comp_Stats)
+    fclose (Comp_Stats);
+
+  exit (0);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/Makefile.in	(revision 21083)
@@ -0,0 +1,386 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the MG system
+# Copyright (C) 1994  Neil Sharman;  1995 Tim Shimmin
+#
+# 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.
+#
+#       @(#)Makefile.in	1.10 22 Mar 1994
+#
+###########################################################################
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+subdir = src/text
+top_srcdir = @top_srcdir@
+transform = @program_transform_name@
+ 
+AR = ar
+CC = @CC@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+#LIBS = ../../lib/libmg.a -lm
+LIBS = ../../lib/libmg.a @LIBS@
+TOUCH = echo timestamp >
+AWK = @AWK@
+YACC = @YACC@
+GSDLOS = @gsdlos@
+
+##########################################
+# Uncomment for compiling for the nzdl project
+#
+CFLAGS = @CFLAGS@ -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM
+##########################################
+
+ 
+bindir = ../../../../bin/$(GSDLOS)
+datadir = $(prefix)/share
+libexecdir = $(exec_prefix)/libexec
+localedir = $(datadir)/locale
+mandir = $(prefix)/man/man1
+ 
+COMPILE = $(CC) -c $(DEFS) $(TREC_MODE) $(READLINE) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+ 
+
+ANSI2KNR = @ANSI2KNR@
+o = .@U@o
+ 
+.SUFFIXES: ._c ._o
+.c._c:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $@
+._c._o:
+	@echo $(COMPILE) $<
+	@rm -f _$*.c
+	@ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $*._c
+	@echo $(COMPILE) $*._c
+	@rm -f _$*.c
+	@ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+ 
+INCLUDES = -I../../../.. -I../.. -I../../lib -I.
+
+#############################################################################
+#
+# Uncomment (and possibly edit) the following lines if you wish
+# to use the GNU readline library for the input in mgquery
+# 
+#READLINE = -DGNU_READLINE -I/opt/gnu/include/readline -L/opt/gnu/lib
+#READLINE_LIBS = -lreadline -ltermcap
+#
+#
+#############################################################################
+
+#############################################################################
+#
+# When working with the trec collection this should be uncommented.
+#
+# TREC_MODE = -DTREC_MODE
+#
+#
+#############################################################################
+
+SOURCES = \
+  backend.c               locallib.c              mg_weights_build.c   \
+  bool_optimiser.c        mg.special.c            mgdictlist.c         \
+  bool_parser.c           mg_compression_dict.c   mgquery.c            \
+  bool_query.c            mg_errors.c             mgstat.c             \
+  bool_tester.c           mg_fast_comp_dict.c     mg_decompress_text.c \
+  bool_tree.c             mg_files.c              query.docnums.c      \
+  commands.c              mg_hilite_words.c       query.ranked.c       \
+  comp_dict.c             mg_invf_dict.c          read_line.c          \
+  environment.c           mg_invf_dump.c          stem_search.c        \
+  mg_invf_merge.c         stemmer.c               mg_stem_idx.c        \
+  mg_invf_rebuild.c       term_lists.c            mgstemidxlist.c      \
+  invf_get.c              mg_passes.c             text.pass1.c         \
+  ivf.pass1.c             mg_perf_hash_build.c    text.pass2.c         \
+  ivf.pass2.c             mg_text_estimate.c      text_get.c           \
+  lists.c                 mg_text_merge.c         weights.c            \
+  query_term_list.c       words.c
+
+HEADERS = \
+  backend.h          conditions.h       locallib.h         term_lists.h \
+  bool_optimiser.h   environment.h      mg.h               text.h       \
+  bool_parser.h      globals.h          mg_errors.h        text_get.h   \
+  bool_query.h       hash.h             mg_files.h         warranty.h   \
+  bool_tree.h        help.mg.h          mg_merge.h         weights.h    \
+  build.h            invf.h             read_line.h        words.h      \
+  commands.h         invf_get.h         stem_search.h                   \
+  comp_dict.h        lists.h            stemmer.h                       \
+  query_term_list.h
+
+
+MISC          = Makefile.in help.mg.src bool_parser.y warranty.src conditions.src
+
+ALLFILES      =	$(SOURCES) $(HEADERS) $(MISC) $(MAN)
+
+DISTFILES     = $(ALLFILES) 
+
+EXEC          = mgquery mg_weights_build mgstat mg_invf_dump mg_invf_dict \
+                mg_invf_rebuild mgdictlist mg_passes mg_perf_hash_build \
+                mg_compression_dict mg_text_estimate mg_fast_comp_dict \
+                mg_hilite_words mg_invf_merge mg_text_merge bool_tester \
+                mg_stem_idx mgstemidxlist mg_decompress_text
+
+MAN           = mgquery.1 mg_weights_build.1 mgstat.1 mg_invf_dump.1 mg_invf_dict.1 \
+                mg_invf_rebuild.1 mgdictlist.1 mg_passes.1 mg_perf_hash_build.1 \
+                mg_compression_dict.1 mg_text_estimate.1 mg_fast_comp_dict.1 \
+                mg_hilite_words.1 mg_invf_merge.1 mg_text_merge.1 \
+                mg_stem_idx.1 mgstemidxlist.1 mg_decompress_text.1 
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+all:	$(EXEC) libtextin.a 
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+help.mg.h : help.mg.src
+	sed -e 's/\\/\\\\/g' -e 's/\"/\\\"/g' help.mg.src | $(AWK) '/^#/ { next; };{ if (x == 0) printf("static char *help_str[] = {\n\"%s\\n\"", $$0); else printf(",\n\"%s\\n\"", $$0); x = 1; }; END { printf("};\n"); }' - >help.mg.h
+
+warranty.h : warranty.src
+	sed  -e 's/\\/\\\\/g' -e 's/\"/\\\"/g' warranty.src | $(AWK) '/^#/ { next; };{ if (x == 0) printf("static char *warranty_str[] = {\n\"%s\\n\"", $$0); else printf(",\n\"%s\\n\"", $$0); x = 1; }; END { printf("};\n"); }' - >warranty.h
+
+conditions.h : conditions.src
+	sed -e 's/\\/\\\\/g' -e 's/\"/\\\"/g' conditions.src | $(AWK) '/^#/ { next; };{ if (x == 0) printf("static char *cond_str[] = {\n\"%s\\n\"", $$0); else printf(",\n\"%s\\n\"", $$0); x = 1; }; END { printf("};\n"); }' - >conditions.h
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+HILITE_OBJS = mg_hilite_words$o stemmer$o locallib$o words$o
+
+mg_hilite_words: $(HILITE_OBJS)
+	$(LINK) $(HILITE_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+bool_parser.c: bool_parser.y
+	$(YACC) $?
+	mv y.tab.c $@
+
+BOOL_OBJS = bool_tree$o bool_parser$o bool_optimiser$o bool_tester$o \
+            term_lists$o stemmer$o stem_search$o mg_errors$o query_term_list$o \
+	    words$o
+
+bool_tester: $(BOOL_OBJS)
+	$(LINK) $(BOOL_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+QUERY_OBJS = \
+	mgquery$o locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o bool_query$o \
+	query_term_list$o words$o
+
+mgquery: $(QUERY_OBJS)	
+	$(LINK) $(READLINE) $(QUERY_OBJS) $(READLINE_LIBS) $(LIBS)
+
+commands$o : help.mg.h warranty.h conditions.h
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+PASSES_OBJS = \
+	mg_passes$o text.pass1$o comp_dict$o stemmer$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o \
+	words$o
+
+mg_passes: $(PASSES_OBJS)
+	$(LINK) $(PASSES_OBJS) $(LIBS) 
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+WEIGHTS_BUILD_OBJS = mg_weights_build$o mg_files$o
+
+mg_weights_build: $(WEIGHTS_BUILD_OBJS)
+	$(LINK) $(WEIGHTS_BUILD_OBJS) $(LIBS)
+
+COMP_DICT_OBJS = mg_compression_dict$o mg_files$o locallib$o
+
+mg_compression_dict: $(COMP_DICT_OBJS)
+	$(LINK) $(COMP_DICT_OBJS) $(LIBS)
+
+FAST_COMP_OBJS = mg_fast_comp_dict$o mg_files$o locallib$o
+
+mg_fast_comp_dict: $(FAST_COMP_OBJS)
+	$(LINK) $(FAST_COMP_OBJS) $(LIBS)
+
+TEXT_EST_OBJS = mg_text_estimate$o locallib$o comp_dict$o mg_files$o
+
+mg_text_estimate: $(TEXT_EST_OBJS)
+	$(LINK) $(TEXT_EST_OBJS) $(LIBS)
+
+STAT_OBJS = mgstat$o mg_files$o locallib$o
+
+mgstat:	$(STAT_OBJS)
+	$(LINK) $(STAT_OBJS) $(LIBS)
+
+INVF_DUMP_OBJS = mg_invf_dump$o locallib$o mg_files$o
+
+mg_invf_dump: $(INVF_DUMP_OBJS)
+	$(LINK) $(INVF_DUMP_OBJS) $(LIBS)
+
+INVF_DICT_OBJS = mg_invf_dict$o mg_files$o locallib$o
+
+mg_invf_dict: $(INVF_DICT_OBJS)
+	$(LINK) $(INVF_DICT_OBJS) $(LIBS)
+
+INVF_REB_OBJS = mg_invf_rebuild$o locallib$o
+
+mg_invf_rebuild: $(INVF_REB_OBJS)
+	$(LINK) $(INVF_REB_OBJS) $(LIBS)
+
+DICTLIST_OBJS = mgdictlist$o locallib$o
+
+mgdictlist: $(DICTLIST_OBJS)
+	$(LINK) $(DICTLIST_OBJS) $(LIBS)
+
+PERF_HASH_OBJS = mg_perf_hash_build$o mg_files$o
+
+mg_perf_hash_build: $(PERF_HASH_OBJS)
+	$(LINK) $(PERF_HASH_OBJS) $(LIBS)
+
+STEM_IDX_OBJS = \
+                mg_stem_idx$o mg_files$o stemmer$o locallib$o \
+                mg_errors$o term_lists$o
+
+mg_stem_idx: $(STEM_IDX_OBJS)
+	$(LINK) $(STEM_IDX_OBJS) $(LIBS)
+
+STEM_IDX_LIST_OBJS = mgstemidxlist$o mg_files$o
+
+mgstemidxlist: $(STEM_IDX_LIST_OBJS)
+	$(LINK) $(STEM_IDX_LIST_OBJS) $(LIBS)
+
+DECOMPRESS_TEXT_OBJS = \
+                mg_decompress_text.o query_term_list.o mg_files.o mg_errors.o \
+                text_get.o locallib.o backend.o stem_search.o \
+                term_lists.o stemmer.o weights.o invf_get.o lists.o
+
+mg_decompress_text: $(DECOMPRESS_TEXT_OBJS)
+	$(LINK) $(DECOMPRESS_TEXT_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+TEXT_MERGE_OBJS = mg_text_merge$o mg_files$o locallib$o
+
+mg_text_merge: $(TEXT_MERGE_OBJS)
+	$(LINK) $(TEXT_MERGE_OBJS) $(LIBS)
+
+INVF_MERGE_OBJS = mg_invf_merge$o mg_files$o locallib$o
+
+mg_invf_merge: $(INVF_MERGE_OBJS)
+	$(LINK) $(INVF_MERGE_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+ansi2knr: ansi2knr.o
+	$(LINK) ansi2knr.o $(LIBS)
+
+install: execinstall #maninstall
+uninstall: execuninstall manuninstall
+
+execinstall: $(EXEC)
+	for name in $(EXEC); do \
+	  $(INSTALL_PROGRAM) $$name \
+	  $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+execuninstall:
+	for name in $(EXEC); do \
+	 rm -f $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+maninstall: $(MAN)
+	$(top_srcdir)/mkinstalldirs $(mandir); \
+	for f in $(MAN); do \
+	  $(INSTALL_DATA) $$f $(mandir)/$$f ;\
+	done
+
+manuninstall: $(MAN)
+	for f in $(MAN); do \
+	  rm -f $(mandir)/$$f ;\
+	done
+
+# words$o,  removed to avoid conflict with mgpp libtextin.a
+LIB_OBJS = \
+	query_term_list$o \
+	locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o \
+	bool_query$o 
+
+libtextin.a: $(LIB_OBJS)
+	rm -f libtextin.a
+	$(AR) cru libtextin.a $(LIB_OBJS)
+	$(RANLIB) libtextin.a
+
+mostlyclean:
+	rm -f *$o _*.c _*.o *._c *._o core core.*
+ 
+clean: mostlyclean
+	rm -f $(EXEC) libtextin.a
+ 
+distclean: clean
+	rm -f ansi2knr
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+ 
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	  || cp -p $(srcdir)/$$file $(distdir); \
+	done
+ 
+# This screws up distclean, and isn't needed as configure makes the
+# Makefile. (jrm21)
+#Makefile: Makefile.in ../../../../config.status
+#	cd ../../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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 exc
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/WIN32.MAK
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/WIN32.MAK	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/WIN32.MAK	(revision 21083)
@@ -0,0 +1,223 @@
+###########################################################################
+#
+# win32 makefile -- mg\src\text
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..\..\..
+
+CC = cl
+CPPFLAGS =
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM -DHAVE_CONFIG_H \
+       -D__WIN32__ -D_LITTLE_ENDIAN
+INCLUDES = -I"$(GSDLHOME)\packages\mg\src\text" -I"$(GSDLHOME)\packages\mg" \
+	   -I"$(GSDLHOME)\packages\mg\lib" -I"$(GSDLHOME)"
+LDFLAGS =
+
+LIBS = "$(GSDLHOME)\packages\mg\lib\libmg.lib"
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .c .obj .cpp
+.c.obj:
+	$(COMPILE) $<
+.cpp.obj:
+	$(COMPILE) $<
+
+o = .obj
+e = .exe
+
+SOURCES = \
+  backend.c               locallib.c              mg_weights_build.c   \
+  bool_optimiser.c        mg.special.c            mgdictlist.c         \
+  bool_parser.c           mg_compression_dict.c   mgquery.c            \
+  bool_query.c            mg_errors.c             mgstat.c             \
+  bool_tester.c           mg_fast_comp_dict.c     mg_decompress_text.c \
+  bool_tree.c             mg_files.c              query.docnums.c      \
+  commands.c              mg_hilite_words.c       query.ranked.c       \
+  comp_dict.c             mg_invf_dict.c          read_line.c          \
+  environment.c           mg_invf_dump.c          stem_search.c        \
+  mg_invf_merge.c         stemmer.c               mg_stem_idx.c        \
+  mg_invf_rebuild.c       term_lists.c            mgstemidxlist.c      \
+  invf_get.c              mg_passes.c             text.pass1.c         \
+  ivf.pass1.c             mg_perf_hash_build.c    text.pass2.c         \
+  ivf.pass2.c             mg_text_estimate.c      text_get.c           \
+  lists.c                 mg_text_merge.c         weights.c            \
+  mgpass.c                query_term_list.c       words.c
+
+HEADERS = \
+  backend.h          conditions.h       locallib.h         term_lists.h \
+  bool_optimiser.h   environment.h      mg.h               text.h       \
+  bool_parser.h      globals.h          mg_errors.h        text_get.h   \
+  bool_query.h       hash.h             mg_files.h         warranty.h   \
+  bool_tree.h        help.mg.h          mg_merge.h         weights.h    \
+  build.h            invf.h             read_line.h        words.h      \
+  commands.h         invf_get.h         stem_search.h                   \
+  comp_dict.h        lists.h            stemmer.h          query_term_list.h
+
+EXEC          = mgquery$e mg_weights_build$e mgstat$e \
+		mg_invf_dump$e     mg_invf_dict$e \
+		mg_invf_rebuild$e     mgdictlist$e \
+		mg_passes$e     mg_perf_hash_build$e \
+		mg_compression_dict$e     mg_text_estimate$e \
+		mg_fast_comp_dict$e \
+		mg_hilite_words$e     mg_invf_merge$e \
+		mg_text_merge$e     bool_tester$e  mgpass$e \
+		mg_stem_idx$e  mgstemidxlist$e \
+                mg_decompress_text$e
+
+all:    $(EXEC) libtextin.lib
+
+HILITE_OBJS = mg_hilite_words$o stemmer$o locallib$o words$o
+mg_hilite_words$e: $(HILITE_OBJS)
+	$(LINK) $(HILITE_OBJS) $(LIBS)
+
+BOOL_OBJS = bool_tree$o bool_parser$o bool_optimiser$o bool_tester$o \
+	    term_lists$o stemmer$o stem_search$o mg_errors$o query_term_list$o \
+	    words$o
+bool_tester$e: $(BOOL_OBJS)
+	$(LINK) $(BOOL_OBJS) $(LIBS)
+
+QUERY_OBJS = \
+	mgquery$o locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o bool_query$o \
+	query_term_list$o words$o
+mgquery$e: $(QUERY_OBJS)
+	$(LINK) $(READLINE) $(QUERY_OBJS) $(READLINE_LIBS) $(LIBS)
+
+commands$o : help.mg.h warranty.h conditions.h
+
+PASSES_OBJS = \
+	mg_passes$o text.pass1$o comp_dict$o stemmer$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o \
+	words$o
+mg_passes$e: $(PASSES_OBJS)
+	$(LINK) $(PASSES_OBJS) $(LIBS)
+
+PASS_OBJS = \
+	words$o mgpass$o text.pass1$o comp_dict$o stemmer$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o
+mgpass$e: $(PASS_OBJS)
+	$(LINK) $(PASS_OBJS) $(LIBS)
+
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib\
+ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib\
+ odbccp32.lib
+
+BUILDER_OBJS = \
+	builder$o
+builder$e: $(BUILDER_OBJS)
+	$(LINK) $(BUILDER_OBJS) $(LIBS) $(LINK32_FLAGS)
+
+WEIGHTS_BUILD_OBJS = mg_weights_build$o mg_files$o
+mg_weights_build$e: $(WEIGHTS_BUILD_OBJS)
+	$(LINK) $(WEIGHTS_BUILD_OBJS) $(LIBS)
+
+COMP_DICT_OBJS = mg_compression_dict$o mg_files$o locallib$o
+mg_compression_dict$e: $(COMP_DICT_OBJS)
+	$(LINK) $(COMP_DICT_OBJS) $(LIBS)
+
+FAST_COMP_OBJS = mg_fast_comp_dict$o mg_files$o locallib$o
+mg_fast_comp_dict$e: $(FAST_COMP_OBJS)
+	$(LINK) $(FAST_COMP_OBJS) $(LIBS)
+
+TEXT_EST_OBJS = mg_text_estimate$o locallib$o comp_dict$o mg_files$o
+mg_text_estimate$e: $(TEXT_EST_OBJS)
+	$(LINK) $(TEXT_EST_OBJS) $(LIBS)
+
+STAT_OBJS = mgstat$o mg_files$o locallib$o
+mgstat$e: $(STAT_OBJS)
+	$(LINK) $(STAT_OBJS) $(LIBS)
+
+INVF_DUMP_OBJS = mg_invf_dump$o locallib$o mg_files$o
+mg_invf_dump$e: $(INVF_DUMP_OBJS)
+	$(LINK) $(INVF_DUMP_OBJS) $(LIBS)
+
+INVF_DICT_OBJS = mg_invf_dict$o mg_files$o locallib$o
+mg_invf_dict$e: $(INVF_DICT_OBJS)
+	$(LINK) $(INVF_DICT_OBJS) $(LIBS)
+
+INVF_REB_OBJS = mg_invf_rebuild$o locallib$o
+mg_invf_rebuild$e: $(INVF_REB_OBJS)
+	$(LINK) $(INVF_REB_OBJS) $(LIBS)
+
+DICTLIST_OBJS = mgdictlist$o locallib$o
+mgdictlist$e: $(DICTLIST_OBJS)
+	$(LINK) $(DICTLIST_OBJS) $(LIBS)
+
+PERF_HASH_OBJS = mg_perf_hash_build$o mg_files$o
+mg_perf_hash_build$e: $(PERF_HASH_OBJS)
+	$(LINK) $(PERF_HASH_OBJS) $(LIBS)
+
+STEM_IDX_OBJS = mg_stem_idx$o mg_files$o stemmer$o locallib$o \
+                mg_errors$o term_lists$o
+mg_stem_idx$e: $(STEM_IDX_OBJS)
+	$(LINK) $(STEM_IDX_OBJS) $(LIBS)
+
+STEM_IDX_LIST_OBJS = mgstemidxlist$o mg_files$o
+mgstemidxlist$e: $(STEM_IDX_LIST_OBJS)
+	$(LINK) $(STEM_IDX_LIST_OBJS) $(LIBS)
+
+DECOMPRESS_TEXT_OBJS = mg_decompress_text$o query_term_list$o mg_files$o mg_errors$o \
+                       text_get$o locallib$o backend$o stem_search$o \
+                       term_lists$o stemmer$o weights$o invf_get$o lists$o
+mg_decompress_text$e: $(DECOMPRESS_TEXT_OBJS)
+	$(LINK) $(DECOMPRESS_TEXT_OBJS) $(LIBS)
+
+TEXT_MERGE_OBJS = mg_text_merge$o mg_files$o locallib$o
+mg_text_merge$e: $(TEXT_MERGE_OBJS)
+	$(LINK) $(TEXT_MERGE_OBJS) $(LIBS)
+
+INVF_MERGE_OBJS = mg_invf_merge$o mg_files$o locallib$o
+mg_invf_merge$e: $(INVF_MERGE_OBJS)
+	$(LINK) $(INVF_MERGE_OBJS) $(LIBS)
+
+install: 
+	if NOT EXIST "$(GSDLHOME)\bin\windows" mkdir "$(GSDLHOME)\bin\windows"
+	for %%i in ($(EXEC)) do \
+	  copy %%i "$(GSDLHOME)\bin\windows"
+
+# words$o,  removed to avoid conflict with mgpp libtextin.a
+LIB_OBJS = \
+	query_term_list$o \
+	locallib$o lists$o \
+	query.ranked$o query.docnums$o stem_search$o \
+	environment$o commands$o weights$o text_get$o stemmer$o \
+	read_line$o mg_errors$o backend$o invf_get$o \
+	term_lists$o bool_tree$o bool_parser$o bool_optimiser$o \
+	bool_query$o
+
+libtextin.lib: $(LIB_OBJS)
+	if EXIST libtextin.lib del libtextin.lib
+	lib /out:libtextin.lib $(LIB_OBJS)
+
+clean:
+	del *$o 
+	del $(EXEC)
Index: /main/tags/2.38/gsdl/packages/mg/src/text/backend.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/backend.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/backend.c	(revision 21083)
@@ -0,0 +1,838 @@
+/**************************************************************************
+ *
+ * backend.c -- Underlying routines for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "timing.h"
+#include "filestats.h"
+#include "sptree.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+#include "mg_files.h"
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "stem_search.h"
+#include "invf_get.h"
+#include "text_get.h"
+#include "weights.h"
+#include "locallib.h"
+#include "mg_errors.h"
+
+
+static File *
+OpenFile (char *base, char *suffix, unsigned long magic, int *ok)
+{
+  char FileName[512];
+  File *F;
+  sprintf (FileName, "%s%s", base, suffix);
+  if (!(F = Fopen (FileName, "rb", 0)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      mg_errno = MG_NOFILE;
+      MgErrorData (FileName);
+      if (ok)
+	*ok = 0;
+      return (NULL);
+    }
+  if (magic)
+    {
+      unsigned long m;
+      if (fread ((char *) &m, sizeof (m), 1, F->f) == 0)
+	{
+	  mg_errno = MG_READERR;
+	  MgErrorData (FileName);
+	  if (ok)
+	    *ok = 0;
+	  Fclose (F);
+	  return (NULL);
+	}
+      NTOHUL(m);  /* [RPAP - Jan 97: Endian Ordering] */
+      if (m != magic)
+	{
+	  mg_errno = MG_BADMAGIC;
+	  MgErrorData (FileName);
+	  if (ok)
+	    *ok = 0;
+	  Fclose (F);
+	  return (NULL);
+	}
+    }
+  return (F);
+}
+
+
+static int 
+open_all_files (query_data * qd)
+{
+  int ok = 1;
+
+  qd->File_text = OpenFile (qd->textpathname, TEXT_SUFFIX, /* [RJM 06/97: text filename] */
+			    MAGIC_TEXT, &ok);
+  qd->File_fast_comp_dict = OpenFile (qd->textpathname, /* [RJM 06/97: text filename] */
+				      TEXT_DICT_FAST_SUFFIX, MAGIC_FAST_DICT, NULL);
+  if (!qd->File_fast_comp_dict)
+    {
+      qd->File_comp_dict = OpenFile (qd->textpathname, /* [RJM 06/97: text filename] */
+				     TEXT_DICT_SUFFIX, MAGIC_DICT, &ok);
+      qd->File_aux_dict = OpenFile (qd->textpathname, /* [RJM 06/97: text filename] */
+				    TEXT_DICT_AUX_SUFFIX, MAGIC_AUX_DICT, NULL);
+    }
+  else
+    qd->File_comp_dict = qd->File_aux_dict = NULL;
+
+  qd->File_stem = OpenFile (qd->pathname, INVF_DICT_BLOCKED_SUFFIX,
+			    MAGIC_STEM, &ok);
+
+  /* [RPAP - Jan 97: Stem Index Change]
+     These will fail if collection not built with stem indexes */
+  qd->File_stem1 = OpenFile (qd->pathname, INVF_DICT_BLOCKED_1_SUFFIX,
+			     MAGIC_STEM_1, NULL);
+  qd->File_stem2 = OpenFile (qd->pathname, INVF_DICT_BLOCKED_2_SUFFIX,
+			     MAGIC_STEM_2, NULL);
+  qd->File_stem3 = OpenFile (qd->pathname, INVF_DICT_BLOCKED_3_SUFFIX,
+			     MAGIC_STEM_3, NULL);
+
+  qd->File_invf = OpenFile (qd->pathname, INVF_SUFFIX,
+			    MAGIC_INVF, &ok);
+
+  /* These will fail if a level 1 inverted file was created because there 
+     will be no document weights */
+  qd->File_text_idx_wgt = OpenFile (qd->pathname, TEXT_IDX_WGT_SUFFIX,
+				    MAGIC_TEXI_WGT, NULL);
+  qd->File_weight_approx = OpenFile (qd->pathname, APPROX_WEIGHTS_SUFFIX,
+				     MAGIC_WGHT_APPROX, NULL);
+  if (qd->File_text_idx_wgt == NULL && qd->File_weight_approx == NULL)
+    qd->File_text_idx = OpenFile (qd->textpathname, /* [RJM 06/97: text filename] */
+				  TEXT_IDX_SUFFIX, MAGIC_TEXI, NULL);
+  else
+    qd->File_text_idx = NULL;
+
+
+  if (!ok)
+    {
+      Fclose (qd->File_text);
+      if (qd->File_fast_comp_dict)
+	Fclose (qd->File_fast_comp_dict);
+      if (qd->File_comp_dict)
+	Fclose (qd->File_comp_dict);
+      Fclose (qd->File_stem);
+
+      /* [RPAP - Jan 97: Stem Index Change] */
+      if (qd->File_stem1)
+	Fclose (qd->File_stem1);
+      if (qd->File_stem2)
+	Fclose (qd->File_stem2);
+      if (qd->File_stem3)
+	Fclose (qd->File_stem3);
+
+      Fclose (qd->File_invf);
+      if (qd->File_text_idx_wgt)
+	Fclose (qd->File_text_idx_wgt);
+      if (qd->File_weight_approx)
+	Fclose (qd->File_weight_approx);
+      if (qd->File_text_idx)
+	Fclose (qd->File_text_idx);
+      return (-1);
+    }
+  return (0);
+
+}
+
+static void 
+close_all_files (query_data * qd)
+{
+  Fclose (qd->File_text);
+  if (qd->File_fast_comp_dict)
+    Fclose (qd->File_fast_comp_dict);
+  if (qd->File_aux_dict)
+    Fclose (qd->File_aux_dict);
+  if (qd->File_comp_dict)
+    Fclose (qd->File_comp_dict);
+  Fclose (qd->File_stem);
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (qd->File_stem1)
+    Fclose (qd->File_stem1);
+  if (qd->File_stem2)
+    Fclose (qd->File_stem2);
+  if (qd->File_stem3)
+    Fclose (qd->File_stem3);
+
+  Fclose (qd->File_invf);
+  if (qd->File_text_idx_wgt)
+    Fclose (qd->File_text_idx_wgt);
+  if (qd->File_weight_approx)
+    Fclose (qd->File_weight_approx);
+  if (qd->File_text_idx)
+    Fclose (qd->File_text_idx);
+}
+
+/* If textname is equal to null then name will be used instead */
+/* [RJM 06/97: text filename] */
+query_data *
+InitQuerySystem (char *dir, char *name, char *textname, InitQueryTimes * iqt)
+{
+  query_data *qd;
+  char *s;
+
+  if (textname == NULL) textname = name; /* [RJM 06/97: text filename] */
+
+  if (!(qd = Xmalloc (sizeof (query_data))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  bzero ((char *) qd, sizeof (*qd));
+
+  qd->mem_in_use = qd->max_mem_in_use = 0;
+
+  qd->doc_pos = qd->buf_in_use = 0;
+  qd->TextBufferLen = 0;
+  qd->DL = NULL;
+
+  /* [RPAP - Feb 97: Term Frequency] */
+  qd->TL = NULL;
+  qd->QTL = NULL;
+
+  qd->TextBuffer = NULL;
+
+  qd->tot_hops_taken = 0;
+  qd->tot_num_of_ptrs = 0;
+  qd->tot_num_of_accum = 0;
+  qd->tot_num_of_terms = 0;
+  qd->tot_num_of_ans = 0;
+  qd->tot_text_idx_lookups = 0;
+
+  qd->hops_taken = 0;
+  qd->num_of_ptrs = 0;
+  qd->num_of_accum = 0;
+  qd->num_of_terms = 0;
+  qd->num_of_ans = 0;
+  qd->text_idx_lookups = 0;
+
+  qd->pathname = NULL; /* RJM 06/97: text filename] */
+  qd->textpathname = NULL; /* RJM 06/97: text filename] */
+
+  s = strrchr (dir, '/');
+  if (s && *(s + 1) == '\0')
+    {
+      /* [RJM 06/97: text filename] */
+      if (!(qd->pathname = Xmalloc (strlen (dir) + strlen (name) + 1)) ||
+	  !(qd->textpathname = Xmalloc (strlen (dir) + strlen (textname) + 1)))
+	{
+	  mg_errno = MG_NOMEM;
+	  if (qd->pathname) Xfree (qd->pathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+      sprintf (qd->pathname, "%s%s", dir, name);
+      sprintf (qd->textpathname, "%s%s", dir, textname); /* [RJM 06/97: text filename] */
+    }
+
+  else
+    {
+      /* [RJM 06/97: text filename] */
+      if (!(qd->pathname = Xmalloc (strlen (dir) + strlen (name) + 2)) ||
+	  !(qd->textpathname = Xmalloc (strlen (dir) + strlen (textname) + 2)))
+	{
+	  mg_errno = MG_NOMEM;
+	  if (qd->pathname) Xfree (qd->pathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+      if (dir == NULL || dir[0] == '\0') {
+	sprintf (qd->pathname, "%s", name);
+	sprintf (qd->textpathname, "%s", textname); /* [RJM 06/97: text filename] */
+      } else {
+	sprintf (qd->pathname, "%s%s", dir, name);
+	sprintf (qd->textpathname, "%s%s", dir, textname); /* [RJM 06/97: text filename] */
+      }
+#else
+      sprintf (qd->pathname, "%s/%s", dir, name);
+      sprintf (qd->textpathname, "%s/%s", dir, textname); /* [RJM 06/97: text filename] */
+#endif
+    }
+
+  if (open_all_files (qd) == -1)
+    {
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+
+  if (iqt)
+    GetTime (&iqt->Start);
+
+  /* Initialise the stemmed dictionary system */
+  if (!(qd->sd = ReadStemDictBlk (qd->File_stem)))
+    {
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if ((qd->sd->sdh.indexed & 7) && qd->File_stem1 && qd->File_stem2 && qd->File_stem3)
+    {
+      if (!(qd->sd->stem1 = ReadStemIdxBlk (qd->File_stem1)))
+	{
+	  FreeStemDict (qd->sd);
+	  close_all_files (qd);
+	  Xfree (qd->pathname);
+	  Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+      if (!(qd->sd->stem2 = ReadStemIdxBlk (qd->File_stem2)))
+	{
+	  FreeStemDict (qd->sd);
+	  close_all_files (qd);
+	  Xfree (qd->pathname);
+	  Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+      if (!(qd->sd->stem3 = ReadStemIdxBlk (qd->File_stem3)))
+	{
+	  FreeStemDict (qd->sd);
+	  close_all_files (qd);
+	  Xfree (qd->pathname);
+	  Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+      }
+  else if (qd->sd->sdh.indexed != 0)
+    {
+      FreeStemDict (qd->sd);
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+  else
+    {
+      if (qd->File_stem1)
+	Fclose (qd->File_stem1);
+      if (qd->File_stem2)
+	Fclose (qd->File_stem2);
+      if (qd->File_stem3)
+	Fclose (qd->File_stem3);
+      qd->File_stem1 = NULL;
+      qd->File_stem2 = NULL;
+      qd->File_stem3 = NULL;
+      qd->sd->stem1 = NULL;
+      qd->sd->stem2 = NULL;
+      qd->sd->stem3 = NULL;
+    }
+
+  if (iqt)
+    GetTime (&iqt->StemDict);
+  if (qd->File_weight_approx)
+    {
+      if (!(qd->awd = LoadDocWeights (qd->File_weight_approx,
+				      qd->sd->sdh.num_of_docs)))
+	{
+	  FreeStemDict (qd->sd);
+	  close_all_files (qd);
+	  Xfree (qd->pathname);
+	  Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+	  Xfree (qd);
+	  return (NULL);
+	}
+    }
+  else
+    qd->awd = NULL;
+
+
+  if (iqt)
+    GetTime (&iqt->ApproxWeights);
+
+  if (!(qd->cd = LoadCompDict (qd->File_comp_dict, qd->File_aux_dict,
+			       qd->File_fast_comp_dict)))
+    {
+      if (qd->awd)
+	FreeWeights (qd->awd);
+      FreeStemDict (qd->sd);
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+
+  if (iqt)
+    GetTime (&iqt->CompDict);
+
+  if (!(qd->id = InitInvfFile (qd->File_invf, qd->sd)))
+    {
+      FreeCompDict (qd->cd);
+      if (qd->awd)
+	FreeWeights (qd->awd);
+      FreeStemDict (qd->sd);
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+  if ((qd->File_text_idx_wgt == NULL || qd->File_weight_approx == NULL) &&
+      qd->id->ifh.InvfLevel >= 2)
+    {
+      FreeInvfData (qd->id);
+      FreeCompDict (qd->cd);
+      if (qd->awd)
+	FreeWeights (qd->awd);
+      FreeStemDict (qd->sd);
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      mg_errno = MG_INVERSION;
+      return (NULL);
+    }
+  if (iqt)
+    GetTime (&iqt->Invf);
+
+  if (!(qd->td = LoadTextData (qd->File_text, qd->File_text_idx_wgt,
+			       qd->File_text_idx)))
+    {
+      FreeInvfData (qd->id);
+      FreeCompDict (qd->cd);
+      if (qd->awd)
+	FreeWeights (qd->awd);
+      FreeStemDict (qd->sd);
+      close_all_files (qd);
+      Xfree (qd->pathname);
+      Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+      Xfree (qd);
+      return (NULL);
+    }
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) || defined(NZDL)
+
+/*
+
+This code is based on the TREC_MODE code below to read the .paragraph
+file to determine what document numbers correspond to what paragraphs.
+This code is more space efficient, reading in the .paragraph file
+into memory as an accumulate docnum array.  Eg.  the .paragraph may contain
+
+	[5 3 6 4 7 9 4]
+
+indicating the first document has 5 paragraphs, the next 3, etc.
+This will be stored in memory as
+
+	[0 5 8 14 18 25 34 38]
+
+so a binary search can be performed.  The first 0 is for convenience;
+it prevents testing boundary conditions.
+
+
+The TREC_MODE code does this differently; it stores the array
+
+	[1 1 1 1 1 2 2 2 3 3 3 3 3 3 ....]
+
+allowing directy paragraph to docnum conversion, at the expense
+of memory.
+
+*/ 
+  qd->paragraph = NULL;
+
+  if (qd->id->ifh.InvfLevel == 3)
+    {
+      unsigned long magic;
+      FILE *paragraph;
+      int i;
+      char paraFile[512];
+
+      sprintf(paraFile, "%s%s", qd->pathname, INVF_PARAGRAPH_SUFFIX);
+      paragraph = fopen(paraFile, "rb");
+      if (!paragraph)
+	FatalError(1, "Unable to open 'paraFile'.", paraFile);
+
+      fread((void *)&magic, sizeof(magic), 1, paragraph);
+      qd->paragraph = Xmalloc((qd->td->cth.num_of_docs+1)*sizeof(int));
+      qd->paragraph[0] = 0;
+      for (i = 1; i <= qd->td->cth.num_of_docs; i++)
+	{
+	  int count;
+
+	  if (fread((void *)&count, sizeof(count), 1, paragraph) != 1)
+	    FatalError(1, "Unexpected EOF while reading '%s'.", paraFile);
+	  NTOHSI(count);  /* [RPAP - Jan 97: Endian Ordering] */
+	  qd->paragraph[i] = qd->paragraph[i-1]+count;
+	}
+
+      fclose (paragraph); /* [RJM 07/98: Memory Leak] */
+    }
+  
+  
+#endif
+
+#ifdef TREC_MODE
+  {
+    extern char *trec_ids;
+    extern long *trec_paras;
+    int size;
+    char FileName[512];
+    FILE *f;
+    if (!strstr (qd->pathname, "trec"))
+      goto error;
+    sprintf (FileName, "%s%s", qd->pathname, ".DOCIDS");
+    if (!(f = fopen (FileName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+      {
+	Message ("Unable to open \"%s\"", FileName);
+	goto error;
+      }
+    fseek (f, 0, 2);
+    size = ftell (f);
+    fseek (f, 0, 0);
+    trec_ids = Xmalloc (size);
+    if (!trec_ids)
+      {
+	fclose (f);
+	goto error;
+      }
+    fread (trec_ids, 1, size, f);
+    fclose (f);
+    if (qd->id->ifh.InvfLevel == 3)
+      {
+	int i, d;
+	unsigned long magic;
+	trec_paras = Xmalloc (qd->sd->sdh.num_of_docs * sizeof (long));
+	if (!trec_paras)
+	  {
+	    Xfree (trec_ids);
+	    trec_ids = NULL;
+	    goto error;
+	  }
+	sprintf (FileName, "%s%s", qd->pathname, INVF_PARAGRAPH_SUFFIX);
+	if (!(f = fopen (FileName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+	  {
+	    Message ("Unable to open \"%s\"", FileName);
+	    goto error;
+	  }
+	if (fread ((char *) &magic, sizeof (magic), 1, f) != 1 ||
+	    NTOHUL(magic) != MAGIC_PARAGRAPH)  /* [RPAP - Jan 97: Endian Ordering] */
+	  {
+	    fclose (f);
+	    Message ("Bad magic number in \"%s\"", FileName);
+	    goto error;
+	  }
+
+	for (d = i = 0; i < qd->td->cth.num_of_docs; i++)
+	  {
+	    int count;
+	    if (fread ((char *) &count, sizeof (count), 1, f) != 1)
+	      {
+		fclose (f);
+		goto error;
+	      }
+	    NTOHSI(count);  /* [RPAP - Jan 97: Endian Ordering] */
+	    while (count--)
+	      trec_paras[d++] = i;
+	  }
+	fclose (f);
+      }
+    goto ok;
+  error:
+    if (trec_ids)
+      Xfree (trec_ids);
+    if (trec_paras)
+      Xfree (trec_paras);
+    trec_ids = NULL;
+    trec_paras = NULL;
+  ok:
+    ;
+  }
+#endif
+
+  if (iqt)
+    GetTime (&iqt->Text);
+
+  return (qd);
+}
+
+
+
+
+
+
+/*
+ * Change the amount of memory currently in use
+ *
+ */
+void 
+ChangeMemInUse (query_data * qd, long delta)
+{
+  qd->mem_in_use += delta;
+  if (qd->mem_in_use > qd->max_mem_in_use)
+    qd->max_mem_in_use = qd->mem_in_use;
+}
+
+
+void 
+FinishQuerySystem (query_data * qd)
+{
+/* [RJM 07/98: Memory Leak] */
+#if defined(PARADOCNUM) || defined(NZDL)
+  if (qd->paragraph != NULL) {
+    Xfree (qd->paragraph);
+    qd->paragraph = NULL;
+  }
+#endif
+
+  FreeTextData (qd->td);
+  FreeInvfData (qd->id);
+  FreeCompDict (qd->cd);
+  if (qd->awd)
+    FreeWeights (qd->awd);
+  FreeStemDict (qd->sd);
+  close_all_files (qd);
+  Xfree (qd->textpathname); /* [RJM 06/97: text filename] */
+  Xfree (qd->pathname);
+  FreeQueryDocs (qd);
+  if (qd->TL != NULL) FreeTermList(&qd->TL);         /* [RJM 07/98: Memory Leak] */
+  if (qd->QTL != NULL) FreeQueryTermList(&qd->QTL);  /* [RJM 07/98: Memory Leak] */
+  Xfree (qd);
+
+  /* other global stuff hanging around */
+  MgErrorDeinit ();
+}
+
+
+void 
+ResetFileStats (query_data * qd)
+{
+  ZeroFileStats (qd->File_text);
+  if (qd->File_comp_dict)
+    ZeroFileStats (qd->File_comp_dict);
+  if (qd->File_fast_comp_dict)
+    ZeroFileStats (qd->File_fast_comp_dict);
+  ZeroFileStats (qd->File_stem);
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (qd->File_stem1)
+    ZeroFileStats (qd->File_stem1);
+  if (qd->File_stem2)
+    ZeroFileStats (qd->File_stem2);
+  if (qd->File_stem3)
+    ZeroFileStats (qd->File_stem3);
+
+  ZeroFileStats (qd->File_invf);
+  if (qd->File_text_idx_wgt)
+    ZeroFileStats (qd->File_text_idx_wgt);
+  if (qd->File_weight_approx)
+    ZeroFileStats (qd->File_weight_approx);
+  if (qd->File_text_idx)
+    ZeroFileStats (qd->File_text_idx);
+}
+
+
+void 
+TransFileStats (query_data * qd)
+{
+  qd->File_text->Current = qd->File_text->Cumulative;
+  if (qd->File_comp_dict)
+    qd->File_comp_dict->Current = qd->File_comp_dict->Cumulative;
+  if (qd->File_fast_comp_dict)
+    qd->File_fast_comp_dict->Current = qd->File_fast_comp_dict->Cumulative;
+  qd->File_stem->Current = qd->File_stem->Cumulative;
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (qd->File_stem1)
+    qd->File_stem1->Current = qd->File_stem1->Cumulative;
+  if (qd->File_stem2)
+    qd->File_stem2->Current = qd->File_stem2->Cumulative;
+  if (qd->File_stem3)
+    qd->File_stem3->Current = qd->File_stem3->Cumulative;
+
+  qd->File_invf->Current = qd->File_invf->Cumulative;
+  if (qd->File_text_idx_wgt)
+    qd->File_text_idx_wgt->Current = qd->File_text_idx_wgt->Cumulative;
+  if (qd->File_weight_approx)
+    qd->File_weight_approx->Current = qd->File_weight_approx->Cumulative;
+  if (qd->File_text_idx)
+    qd->File_text_idx->Current = qd->File_text_idx->Cumulative;
+}
+
+
+void 
+FreeTextBuffer (query_data * qd)
+{
+  if (qd->TextBuffer)
+    {
+      Xfree (qd->TextBuffer);
+      ChangeMemInUse (qd, -qd->TextBufferLen);
+    }
+  qd->TextBuffer = NULL;
+  qd->TextBufferLen = 0;
+}
+
+void 
+FreeQueryDocs (query_data * qd)
+{
+  qd->doc_pos = 0;
+  qd->buf_in_use = 0;
+  if (qd->DL)
+    {
+      int i;
+      for (i = 0; i < qd->DL->num; i++)
+	if (qd->DL->DE[i].CompTextBuffer)
+	  {
+	    Xfree (qd->DL->DE[i].CompTextBuffer);
+	    qd->DL->DE[i].CompTextBuffer = NULL;
+	    ChangeMemInUse (qd, -qd->DL->DE[i].Len);
+	  }
+      Xfree (qd->DL);
+    }
+  qd->DL = NULL;
+  FreeTextBuffer (qd);
+}
+
+int 
+LoadCompressedText (query_data * qd, int max_mem)
+{
+  DocEntry *DE;
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return -1;
+
+  DE = &qd->DL->DE[qd->doc_pos];
+  if (!DE->CompTextBuffer)
+    {
+      int i;
+      DocEntry *de;
+      for (i = 0, de = qd->DL->DE; i < qd->DL->num; i++, de++)
+	if (de->CompTextBuffer)
+	  {
+	    Xfree (de->CompTextBuffer);
+	    de->CompTextBuffer = NULL;
+	    ChangeMemInUse (qd, -de->Len);
+	  }
+      if (LoadBuffers (qd, &qd->DL->DE[qd->doc_pos], max_mem,
+		       qd->DL->num - qd->doc_pos) == -1)
+	return -1;
+    }
+  return 0;
+}
+
+int 
+GetDocNum (query_data * qd)
+{
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return -1;
+  return qd->DL->DE[qd->doc_pos].DocNum;
+}
+
+DocEntry *
+GetDocChain (query_data * qd)
+{
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return NULL;
+  return &(qd->DL->DE[qd->doc_pos]);
+}
+
+float 
+GetDocWeight (query_data * qd)
+{
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return -1;
+  return qd->DL->DE[qd->doc_pos].Weight;
+}
+
+long 
+GetDocCompLength (query_data * qd)
+{
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return -1;
+  return qd->DL->DE[qd->doc_pos].Len;
+}
+
+
+u_char *
+GetDocText (query_data * qd, unsigned long *len)
+{
+  DocEntry *DE;
+  int ULen;
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return NULL;
+
+  DE = &qd->DL->DE[qd->doc_pos];
+
+  if (!DE->CompTextBuffer)
+    {
+      fprintf (stderr, "The compressed text buffer is NULL\n");
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  FreeTextBuffer (qd);
+
+  qd->TextBufferLen = (int) (qd->td->cth.ratio * 1.01 *
+			     DE->Len) + 100;
+  if (!(qd->TextBuffer = Xmalloc (qd->TextBufferLen)))
+    {
+      fprintf (stderr, "No memory for TextBuffer\n");
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  DecodeText (qd->cd, (u_char *) (DE->CompTextBuffer), DE->Len,
+	      (u_char *) (qd->TextBuffer), &ULen);
+  qd->TextBuffer[ULen] = '\0';
+
+  if (ULen >= qd->TextBufferLen)
+    {
+      fprintf (stderr, "%d >= %d\n", ULen, qd->TextBufferLen);
+      mg_errno = MG_BUFTOOSMALL;
+      return (NULL);
+    }
+
+  if (len)
+    *len = ULen;
+
+  return qd->TextBuffer;
+}
+
+int 
+NextDoc (query_data * qd)
+{
+  if (qd->DL == NULL || qd->doc_pos >= qd->DL->num)
+    return 0;
+  qd->doc_pos++;
+  return qd->doc_pos < qd->DL->num;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/backend.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/backend.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/backend.h	(revision 21083)
@@ -0,0 +1,263 @@
+/**************************************************************************
+ *
+ * backend.h -- Underlying routines and datastructures for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef BACKEND_H
+#define BACKEND_H
+
+#include "sysfuncs.h"
+
+#include "timing.h"
+#include "lists.h"
+#include "term_lists.h"
+#include "query_term_list.h"  /* [RPAP - Feb 97: Term Frequency] */
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+
+
+typedef struct invf_data
+  {
+    File *InvfFile;
+    unsigned long N;
+    unsigned long Nstatic;	/* N parameter for decoding inverted file entries */
+    struct invf_file_header ifh;
+  }
+invf_data;
+
+typedef struct text_data
+  {
+    File *TextFile;
+    File *TextIdxFile;
+    File *TextIdxWgtFile;
+    long current_pos;
+    struct
+      {
+	unsigned long Start;
+	float Weight;
+      }
+     *idx_data;
+    compressed_text_header cth;
+  }
+text_data;
+
+
+typedef struct auxiliary_dict
+  {
+    aux_frags_header afh[2];
+    u_char *word_data[2];
+    u_char **words[2];
+    int blk_start[2][33], blk_end[2][33];	/* blk_start and blk_end are required
+						   for the hybrid methods */
+  }
+auxiliary_dict;
+
+
+typedef struct compression_dict
+  {
+    compression_dict_header cdh;
+    comp_frags_header *cfh[2];
+    unsigned long MemForCompDict;
+    u_char ***values[2];
+    u_char *escape[2];
+    huff_data *chars_huff[2];
+    u_long **chars_vals[2];
+    huff_data *lens_huff[2];
+    u_long **lens_vals[2];
+    auxiliary_dict *ad;
+    int fast_loaded;
+  }
+compression_dict;
+
+
+typedef struct stemmed_idx   /* [RPAP - Jan 97: Stem Index Change] */
+  {
+    File *stem_idx_file;
+    struct stem_idx_header sih;
+    u_char **index;
+    unsigned long *pos;
+    int active;
+    u_char *buffer;
+    unsigned long MemForStemIdx;
+  }
+stemmed_idx;
+
+
+typedef struct stemmed_dict
+  {
+    File *stem_file;
+    struct stem_dict_header sdh;
+    u_char **index;
+    unsigned long *pos;
+    int active;
+    u_char *buffer;
+    unsigned long MemForStemDict;
+
+    /* [RPAP - Jan 97: Stem Index Change] */
+    stemmed_idx *stem1;
+    stemmed_idx *stem2;
+    stemmed_idx *stem3;
+  }
+stemmed_dict;
+
+
+typedef struct approx_weights_data
+  {
+    double L;
+    double B;
+    unsigned long *DocWeights;
+    char bits;
+    float *table;
+    unsigned long mask;
+    unsigned long MemForWeights;
+    unsigned long num_of_docs;
+  }
+approx_weights_data;
+
+
+typedef struct RankedQueryInfo
+  {
+    int QueryFreqs;
+    int Exact;           /* use exact weights for ranking or not */
+    long MaxDocsToRetrieve;	/* may be -1 for all */
+    long MaxParasToRetrieve;
+    int Sort;        
+    char AccumMethod;		/* 'A' = array,  'S' = splay tree,  'H' = hash_table */
+    long MaxAccums;		/* may be -1 for all */
+    long MaxTerms;		/* may be -1 for all */
+    int StopAtMaxAccum; /* Stop at maximum accumulator or not */
+    long HashTblSize;
+    char *skip_dump;
+  }
+RankedQueryInfo;
+
+
+
+typedef struct BooleanQueryInfo
+  {
+    long MaxDocsToRetrieve;
+  }
+BooleanQueryInfo;
+
+
+/* [TS:24/Aug/94] - maximum number of characters in term string */
+#define MAXTERMSTRLEN 1023
+
+typedef struct query_data
+  {
+    stemmed_dict *sd;
+    compression_dict *cd;
+    approx_weights_data *awd;
+    invf_data *id;
+    text_data *td;
+#if defined(PARADOCNUM) || defined(NZDL)
+    int *paragraph;
+#endif
+    char *pathname;
+    char *textpathname; /* [RJM 06/97: text filename] */
+    File *File_text;
+    File *File_comp_dict;
+    File *File_aux_dict;
+    File *File_fast_comp_dict;
+    File *File_text_idx_wgt;
+    File *File_text_idx;
+    File *File_stem;
+
+    /* [RPAP - Jan 97: Stem Index Change] */
+    File *File_stem1;
+    File *File_stem2;
+    File *File_stem3;
+
+    File *File_invf;
+    File *File_weight_approx;
+    unsigned long mem_in_use, max_mem_in_use;
+    unsigned long num_of_ptrs, tot_num_of_ptrs;
+    unsigned long num_of_terms, tot_num_of_terms;
+    unsigned long num_of_accum, tot_num_of_accum;
+    unsigned long num_of_ans, tot_num_of_ans;
+    unsigned long hops_taken, tot_hops_taken;
+    unsigned long text_idx_lookups, tot_text_idx_lookups;
+    unsigned long max_buffers;
+    unsigned doc_pos;
+    unsigned buf_in_use;
+    DocList *DL;
+    TermList *TL;		/* [TS:Oct/94] - so term list for query can easily be accessed */
+    u_char *TextBuffer;
+    int TextBufferLen;
+    QueryTermList *QTL;    /* [RPAP - Feb 97: Term Frequency] */
+  }
+query_data;
+
+
+
+typedef struct InitQueryTimes
+  {
+    ProgTime Start;
+    ProgTime StemDict;
+    ProgTime ApproxWeights;
+    ProgTime CompDict;
+    ProgTime Invf;
+    ProgTime Text;
+  }
+InitQueryTimes;
+
+
+/* [RJM 06/97: text filename] */
+query_data *InitQuerySystem (char *dir, char *name, char *textname, InitQueryTimes * iqt);
+
+void ChangeMemInUse (query_data * qd, long delta);
+
+void FinishQuerySystem (query_data * qd);
+
+void ResetFileStats (query_data * qd);
+
+void TransFileStats (query_data * qd);
+
+void ChangeMemInUse (query_data * qd, long delta);
+
+void RankedQuery (query_data * qd, char *Query, RankedQueryInfo * rqi);
+
+void BooleanQuery (query_data * qd, char *Query, BooleanQueryInfo * bqi,
+		   int stem_method);
+
+void DocnumsQuery (query_data * qd, char *QueryLine);
+
+void FreeTextBuffer (query_data * qd);
+
+void FreeQueryDocs (query_data * qd);
+
+int LoadCompressedText (query_data * qd, int max_mem);
+
+int GetDocNum (query_data * qd);
+
+float GetDocWeight (query_data * qd);
+
+long GetDocCompLength (query_data * qd);
+
+u_char *GetDocText (query_data * qd, unsigned long *len);
+
+DocEntry *GetDocChain (query_data * qd);
+
+int NextDoc (query_data * qd);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.c	(revision 21083)
@@ -0,0 +1,1108 @@
+/**************************************************************************
+ *
+ * bool_optimiser -- optimise boolean parse tree
+ * Copyright (C) 1994,95  Tim Shimmin
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:42  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:20  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1995/07/27  04:54:55  tes
+   * Committing optimiser before I add the code
+   * to find diff-nodes in any kind of tree.
+   *
+   * Revision 1.3  1994/10/20  00:02:55  tes
+   * Fixed bug with bool_optimiser:
+   *   - it couldn't handle "false | false"
+   *   - it couldn't handle "true & true"
+   * These would collapse into an empty list and cause an error.
+   *
+   * Revision 1.2  1994/10/18  06:11:02  tes
+   * The boolean optimiser seems to be modifying the parse tree
+   * like it is supposed to.
+   * Paragraph ranking now works without any text files if required to.
+   *
+   * Revision 1.1  1994/10/12  01:15:28  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "bool_tree.h"
+#include "term_lists.h"
+#include "messages.h"
+
+typedef int (*CompFunc) (const void *, const void *);
+typedef void (*TreeFunc) (bool_tree_node *);
+
+/* --- routines --- */
+static void PermeateNots (bool_tree_node * tree);
+static void DoubleNeg (bool_tree_node * not_tree);
+static void AndDeMorgan (bool_tree_node * not_tree);
+static void OrDeMorgan (bool_tree_node * not_tree);
+static int AndDistribute (bool_tree_node * tree);
+static void DNF_Distribute (bool_tree_node * tree);
+static void ReplaceWithChildren (bool_tree_node * tree);
+static void CollapseTree (bool_tree_node * tree);
+static void AndTrueFalse (bool_tree_node * and_tree);
+static void OrTrueFalse (bool_tree_node * or_tree);
+static void TF_Idempotent (bool_tree_node * tree);
+static void AndNotToDiff (bool_tree_node * and_tree, TreeFunc recurs_func);
+static void DiffDNF (bool_tree_node * or_node);
+static void DiffTree (bool_tree_node * tree);
+static void AndSort (bool_tree_node * and_tree, TermList * tl, CompFunc comp);
+static void AndOrSort (bool_tree_node * tree, TermList * tl);
+static void AndSortDNF (bool_tree_node * or_node, TermList * tl);
+static void MarkOrTerms (bool_tree_node * tree, TermList * tl);
+static int calc_sum_ft (bool_tree_node * term_tree, TermList * tl);
+static int AndOrSort_comp (const void *A, const void *B);
+static int AndSort_comp (const void *A, const void *B);
+
+/* =========================================================================
+ * Function: OptimiseBoolTree
+ * Description: 
+ *      For case 2:
+ *        Do three major steps:
+ *        (i) put into standard form
+ *            -> put into DNF (disjunctive normal form - or of ands)
+ *            Use DeMorgan's, Double-negative, Distributive rules
+ *        (ii) simplify
+ *             apply idempotency rules
+ *        (iii) ameliorate
+ *              convert &! to diff nodes, order terms by frequency,...
+ *     Could also do the matching idempotency laws i.e. ...
+ *     (A | A), (A | !A), (A & !A), (A & A), (A & (A | B)), (A | (A & B)) 
+ *     Job for future.... ;-) 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+OptimiseBoolTree (bool_tree_node * parse_tree, TermList * tl, int type)
+{
+  switch (type)
+    {
+    case 1:
+      /* --- sorts for and of or-terms --- */
+      PermeateNots (parse_tree);
+      TF_Idempotent (parse_tree);
+      CollapseTree (parse_tree);
+      DiffTree (parse_tree);
+      MarkOrTerms (parse_tree, tl);
+      AndOrSort (parse_tree, tl);
+      break;
+    case 2:
+      /* --- put into DNF --- */
+      PermeateNots (parse_tree);
+      TF_Idempotent (parse_tree);
+      DNF_Distribute (parse_tree);
+      CollapseTree (parse_tree);
+      AndSortDNF (parse_tree, tl);
+      DiffDNF (parse_tree);
+      break;
+    default:
+      /* --- do nothing --- */
+      break;
+    }				/*switch */
+}				/*OptimiseBoolTree */
+
+/* =========================================================================
+ * Function: DoubleNeg
+ * Description: 
+ *      !(!(a) = a
+ *      Assumes binary tree.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+static void
+DoubleNeg (bool_tree_node * not_tree)
+{
+  bool_tree_node *child = BOOL_CHILD (not_tree);
+  bool_tree_node *a = BOOL_CHILD (child);
+  bool_tree_node *sibling = BOOL_SIBLING (not_tree);
+
+  /* copy a into not tree */
+  bcopy (a, not_tree, sizeof (bool_tree_node));
+
+  BOOL_SIBLING (not_tree) = sibling;
+
+  Xfree (child);
+  Xfree (a);
+
+}
+
+/* =========================================================================
+ * Function: AndDeMorgan
+ * Description: 
+ *      DeMorgan's rule for 'not' of an 'and'  i.e. !(a & b) <=> (!a) | (!b)
+ *      Assumes Binary Tree
+ * Input: 
+ *      not of and tree
+ * Output: 
+ *      or of not trees
+ * ========================================================================= */
+
+static void
+AndDeMorgan (bool_tree_node * not_tree)
+{
+  bool_tree_node *child = BOOL_CHILD (not_tree);
+  bool_tree_node *a = BOOL_CHILD (child);
+  bool_tree_node *b = BOOL_SIBLING (a);
+  bool_tree_node *new_not = NULL;
+
+  /* change 'not' to 'or' */
+  BOOL_TAG (not_tree) = N_or;
+
+  /* change 'and' to 'not' */
+  BOOL_TAG (child) = N_not;
+
+  /* 'a' no longer has a sibling */
+  BOOL_SIBLING (a) = NULL;
+
+  /* 'a's old sibling is now a child of a new not */
+  new_not = CreateBoolTreeNode (N_not, b, NULL);
+  BOOL_SIBLING (child) = new_not;
+}
+
+/* =========================================================================
+ * Function: OrDeMorgan
+ * Description: 
+ *      DeMorgan's rule for 'not' of an 'or' i.e. !(a | b) <=> (!a) & (!b)
+ *      Assumes Binary Tree
+ * Input: 
+ *      not of and tree
+ * Output: 
+ *      or of not trees
+ * ========================================================================= */
+
+static void
+OrDeMorgan (bool_tree_node * not_tree)
+{
+  bool_tree_node *child = BOOL_CHILD (not_tree);
+  bool_tree_node *a = BOOL_CHILD (child);
+  bool_tree_node *b = BOOL_SIBLING (a);
+  bool_tree_node *new_not = NULL;
+
+  /* change 'not' to 'and' */
+  BOOL_TAG (not_tree) = N_and;
+
+  /* change 'or' to 'not' */
+  BOOL_TAG (child) = N_not;
+
+  /* 'a' no longer has a sibling */
+  BOOL_SIBLING (a) = NULL;
+
+  /* 'a's old sibling is now a child of a new not */
+  new_not = CreateBoolTreeNode (N_not, b, NULL);
+  BOOL_SIBLING (child) = new_not;
+}
+
+/* =========================================================================
+ * Function: PermeateNots
+ * Description: 
+ *      Use DeMorgan's and Double-negative
+ *      Assumes tree in binary form (i.e. No ands/ors collapsed)
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+PermeateNots (bool_tree_node * tree)
+{
+  if (!tree)
+    return;
+
+  if (BOOL_TAG (tree) == N_not)
+    {
+      switch (BOOL_TAG (BOOL_CHILD (tree)))
+	{
+	case N_not:
+	  DoubleNeg (tree);
+/** NOTE: I do not go on to do the children **/
+	  /* I permeate the nots on the tree here & leave it at that */
+	  /* In this case I do not know what type 'tree' will end up */
+	  PermeateNots (tree);
+	  return;
+	case N_and:
+	  AndDeMorgan (tree);
+	  break;
+	case N_or:
+	  OrDeMorgan (tree);
+	  break;
+	default:
+	  /* leave alone */
+	  break;
+	}
+    }
+
+  /* Permeate Nots for children */
+  if (BOOL_HAS_CHILD (tree))
+    {
+      PermeateNots (BOOL_CHILD (tree));
+      PermeateNots (BOOL_SIBLING (BOOL_CHILD (tree)));
+    }
+
+}
+
+/* =========================================================================
+ * Function: DNF_Distribute
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+
+#define ITER_LIMIT 500		/* if reach limit then probably in trouble */
+
+static void
+DNF_Distribute (bool_tree_node * tree)
+{
+  int i = 0;
+
+  /* multiple passes until no change */
+  /* not very smart :-( */
+  while (1)
+    {
+      if (AndDistribute (tree) == 0)
+	return;
+      if (i == ITER_LIMIT)
+	FatalError (1, "DNF infinite loop");
+      i++;
+    }				/*while */
+
+}
+
+/* =========================================================================
+ * Function: AndDistribute
+ * Description: 
+ *      (a | b) & A <=> (a & A) | (b & A)
+ * Input: 
+ *      binary tree of "AND" , "OR"s.
+ * Output: 
+ *      return 1 if changed the tree
+ *      return 0 if there was NO change (no distributive rule to apply)
+ * ========================================================================= */
+
+static int
+AndDistribute (bool_tree_node * tree)
+{
+  if (!tree)
+    return 0;
+
+  if (BOOL_TAG (tree) != N_and)
+    {
+      /* try the children if got some */
+      if (BOOL_TAG (tree) == N_or)
+	{
+	  bool_tree_node *left_child = BOOL_CHILD (tree);
+	  int left = AndDistribute (left_child);
+	  int right = AndDistribute (BOOL_SIBLING (left_child));
+	  return (left || right);
+	}
+
+      /* no children, then no change */
+      return 0;
+    }
+
+  /* AND case */
+  {
+    /* we have to check the children to see if can distribute */
+    bool_tree_node *left_child = BOOL_CHILD (tree);
+    bool_tree_node *right_child = BOOL_SIBLING (left_child);
+    int swap = 0;
+
+    /* If "or" on the right side then do a swap */
+    /* This is done for code simplicity */
+    if (BOOL_TAG (right_child) == N_or)
+      {
+	/* do a swap */
+	bool_tree_node *temp;
+	temp = right_child;
+	right_child = left_child;
+	left_child = temp;
+
+	BOOL_SIBLING (left_child) = right_child;
+	BOOL_SIBLING (right_child) = NULL;
+	BOOL_CHILD (tree) = left_child;
+
+	swap = 1;
+      }
+
+    /* do the actual distribution */
+    if (swap || BOOL_TAG (left_child) == N_or)
+      {
+	bool_tree_node *A = right_child;
+	bool_tree_node *A_copy = CopyBoolTree (A);
+	bool_tree_node *a = BOOL_CHILD (left_child);
+	bool_tree_node *b = BOOL_SIBLING (a);
+
+	/* then can distribute away ... */
+	BOOL_TAG (tree) = N_or;
+	BOOL_TAG (left_child) = N_and;
+	BOOL_SIBLING (left_child) = CreateBoolTreeNode (N_and, b, A);
+	BOOL_SIBLING (a) = A_copy;
+
+	AndDistribute (tree);
+	return 1;
+      }
+
+    /* if "and" of something other than "or" s then try the children */
+    {
+      int left = AndDistribute (left_child);
+      int right = AndDistribute (right_child);
+      return (left || right);
+    }
+  }				/* AND case */
+
+}				/*AndDistribute */
+
+/* =========================================================================
+ * Function: CollapseTree
+ * Description: 
+ *      Collapse "and" and "or"s.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+CollapseTree (bool_tree_node * tree)
+{
+  if (!tree)
+    return;
+
+  if ((BOOL_TAG (tree) == N_and) || (BOOL_TAG (tree) == N_or))
+    {
+      bool_tree_node *child = BOOL_CHILD (tree);
+      while (child)
+	{
+	  while (BOOL_TAG (child) == BOOL_TAG (tree))
+	    {
+	      ReplaceWithChildren (child);
+	    }
+	  CollapseTree (child);
+	  child = BOOL_SIBLING (child);
+	}
+    }
+
+  /* assume "not"s permeated */
+  return;
+}
+
+/* =========================================================================
+ * Function: ReplaceWithChildren
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+ReplaceWithChildren (bool_tree_node * tree)
+{
+  bool_tree_node *next = BOOL_SIBLING (tree);
+  bool_tree_node *child = BOOL_CHILD (tree);
+  bool_tree_node *last = LastBoolSibling (child);
+
+  bcopy ((char *) child, (char *) tree, sizeof (bool_tree_node));
+  Xfree (child);
+  BOOL_SIBLING (last) = next;
+
+}
+
+/* =========================================================================
+ * Function: TF_Idempotent
+ * Description: 
+ *      Applies Idempotency laws which refer to True or False (hence "TF")
+ *      uses the true or false idempotent rules
+ * Input: 
+ *      operates on n-ary trees (not restricted to binary)
+ * Output: 
+ * ========================================================================= */
+
+static void
+TF_Idempotent (bool_tree_node * tree)
+{
+  bool_tree_node *child = NULL;
+
+  while (tree)
+    {
+      if (BOOL_HAS_CHILD (tree))
+	{
+	  child = BOOL_CHILD (tree);
+	  TF_Idempotent (child);
+	}
+
+      /* --- process node --- */
+      switch (BOOL_TAG (tree))
+	{
+	case N_not:
+	  child = BOOL_CHILD (tree);
+
+	  /* if true then falsify */
+	  if (BOOL_TAG (child) == N_all)
+	    {
+	      BOOL_TAG (tree) = N_none;
+	      BOOL_CHILD (tree) = NULL;
+	      Xfree (child);
+	      break;
+	    }
+
+	  /* if false then trueify */
+	  if (BOOL_TAG (child) == N_none)
+	    {
+	      BOOL_TAG (tree) = N_all;
+	      BOOL_CHILD (tree) = NULL;
+	      Xfree (child);
+	      break;
+	    }
+
+	  break;
+	case N_and:
+	  AndTrueFalse (tree);
+	  break;
+	case N_or:
+	  OrTrueFalse (tree);
+	  break;
+
+	default:
+	  /* do nothing */
+	  break;
+	}			/*switch */
+
+      tree = BOOL_SIBLING (tree);
+    }				/*while */
+}				/*TF_Idempotent */
+
+/* =========================================================================
+ * Function: AndTrueFalse
+ * Description: 
+ *      If any "false" then falsify whole tree 
+ *      If any "true" then delete them
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+AndTrueFalse (bool_tree_node * and_tree)
+{
+  bool_tree_node *child = BOOL_CHILD (and_tree);
+
+  bool_tree_node *prev = NULL;
+
+  while (child)
+    {
+      if (BOOL_TAG (child) == N_none)
+	{
+	  FreeBoolTree (&(BOOL_CHILD (and_tree)));
+	  BOOL_TAG (and_tree) = N_none;
+	  return;
+	}
+
+      if (BOOL_TAG (child) == N_all)
+	{
+	  bool_tree_node *sibling = BOOL_SIBLING (child);
+
+	  /* --- link over child --- */
+	  if (!prev)
+	    {
+	      BOOL_CHILD (and_tree) = sibling;
+	    }
+	  else
+	    {
+	      BOOL_SIBLING (prev) = sibling;
+	    }
+
+	  Xfree (child);
+	  child = sibling;
+	}
+      else
+	{
+	  prev = child;
+	  child = BOOL_SIBLING (child);
+	}
+    }				/*while */
+
+  child = BOOL_CHILD (and_tree);
+
+  /* if no children ... */
+  /* => all have been true */
+  if (!child)
+    {
+      BOOL_TAG (and_tree) = N_all;
+      return;
+    }
+
+  /* If only one child ... */
+  if (!BOOL_SIBLING (child))
+    {
+      /* replace the parent with child - move it up */
+      bool_tree_node *save_sibling = BOOL_SIBLING (and_tree);
+      bcopy ((char *) child, (char *) and_tree, sizeof (bool_tree_node));
+      BOOL_SIBLING (and_tree) = save_sibling;
+      Xfree (child);
+    }
+
+}				/*AndTrueFalse */
+
+/* =========================================================================
+ * Function: OrTrueFalse
+ * Description: 
+ *      If any "true" then trueify whole tree 
+ *      If any "false" then delete them 
+ *      ***** NOTE: This is a reflection of AndTrueFalse *****
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+OrTrueFalse (bool_tree_node * or_tree)
+{
+  bool_tree_node *child = BOOL_CHILD (or_tree);
+
+  bool_tree_node *prev = NULL;
+
+  while (child)
+    {
+      if (BOOL_TAG (child) == N_all)
+	{
+	  FreeBoolTree (&(BOOL_CHILD (or_tree)));
+	  BOOL_TAG (or_tree) = N_all;
+	  return;
+	}
+
+      if (BOOL_TAG (child) == N_none)
+	{
+	  bool_tree_node *sibling = BOOL_SIBLING (child);
+	  if (!prev)
+	    {
+	      BOOL_CHILD (or_tree) = sibling;
+	    }
+	  else
+	    {
+	      BOOL_SIBLING (prev) = sibling;
+	    }
+	  Xfree (child);
+	  child = sibling;
+
+	}
+      else
+	{
+	  prev = child;
+	  child = BOOL_SIBLING (child);
+	}
+    }				/*while */
+
+  child = BOOL_CHILD (or_tree);
+
+  /* if no children ... */
+  /* => all have been false */
+  if (!child)
+    {
+      BOOL_TAG (or_tree) = N_none;
+      return;
+    }
+
+  /* If only one child ... */
+  if (!BOOL_SIBLING (child))
+    {
+      /* replace the parent with child - move it up */
+      bool_tree_node *save_sibling = BOOL_SIBLING (or_tree);
+      bcopy ((char *) child, (char *) or_tree, sizeof (bool_tree_node));
+      BOOL_SIBLING (or_tree) = save_sibling;
+      Xfree (child);
+    }
+
+}				/*AndTrueFalse */
+
+/* =========================================================================
+ * Function: AndNotToDiff
+ * Description: 
+ *      Convert an "And" tree with possibly some negated terms into
+ *      a "And - neg-terms". 
+ * Input: 
+ *      Expects "And" of only literals - as tree should be in DNF form.
+ *      This means that no recursion is necessary.
+ * Output: 
+ * ========================================================================= */
+
+static void
+AndNotToDiff (bool_tree_node * and_tree, TreeFunc recurs_func)
+{
+
+  /* -------------------------------------------------- */
+  /* --- Divide the children up into positive and negative literals --- */
+  /* Preserves ordering of children */
+  bool_tree_node *pos = NULL;
+  bool_tree_node *neg = NULL;
+  bool_tree_node *last_pos = NULL;
+  bool_tree_node *last_neg = NULL;
+
+  bool_tree_node *child = BOOL_CHILD (and_tree);
+  while (child)
+    {
+      bool_tree_node *next = BOOL_SIBLING (child);
+      if (BOOL_TAG (child) == N_not)
+	{
+	  /* add to end of neg list */
+	  if (!neg)
+	    neg = child;
+	  else
+	    BOOL_SIBLING (last_neg) = child;
+	  last_neg = child;
+	}
+      else
+	{
+	  /* add to end of pos list */
+	  if (!pos)
+	    pos = child;
+	  else
+	    BOOL_SIBLING (last_pos) = child;
+	  last_pos = child;
+	}
+      child = next;
+    }				/*while */
+  if (last_pos)
+    BOOL_SIBLING (last_pos) = NULL;
+  if (last_neg)
+    BOOL_SIBLING (last_neg) = NULL;
+  /* -------------------------------------------------- */
+
+  if (!neg)			/* no negtives => no subtraction */
+    {
+      /* fix up parent's child link */
+      BOOL_CHILD (and_tree) = pos;
+      return;
+    }
+
+  if (!pos)			/* no positives = all negatives */
+    {
+      /* Choose one of the negs for the left-hand-side of the subtraction */
+      /* In particular, choose the first */
+      pos = neg;
+      neg = BOOL_SIBLING (neg);
+      BOOL_SIBLING (pos) = NULL;
+    }
+
+  /* Get rid of all '!' from not nodes */
+  /* Make a list out of the children */
+  {
+    bool_tree_node *n = neg;
+    bool_tree_node *next = NULL;
+
+    neg = BOOL_CHILD (neg);
+    while (n)
+      {
+	bool_tree_node *c = BOOL_CHILD (n);
+	next = BOOL_SIBLING (n);
+	Xfree (n);
+	if (next)
+	  BOOL_SIBLING (c) = BOOL_CHILD (next);
+	n = next;
+      }
+  }
+
+  /* --- restructure the tree with "and" and "diff" --- */
+  BOOL_TAG (and_tree) = N_diff;
+  if (!BOOL_SIBLING (pos))	/* i.e. only one pos */
+    {
+      /* (A & !B & !C & !D & ...) ==> A - (B,C,D,...) */
+
+      BOOL_CHILD (and_tree) = pos;
+      BOOL_SIBLING (pos) = neg;
+    }
+  else
+    {
+      /* (A & !C & B & !D & ...) ==> (A & B & ....) - (C, D, ...) */
+
+      bool_tree_node *n = CreateBoolNode (N_and);
+      BOOL_CHILD (and_tree) = n;
+      BOOL_CHILD (n) = pos;
+      BOOL_SIBLING (n) = neg;
+    }				/*if */
+
+  if (recurs_func)
+    {
+      recurs_func (BOOL_CHILD (and_tree));
+    }
+
+}				/*AndNotToDiff */
+
+/* =========================================================================
+ * Function: DiffTree
+ * Description: 
+ *      Applies "AndNotToNeg" to each conjunct.
+ *      Unlike DiffDNF, this routine will search throughout the tree for
+ *      "and"-nodes. It will call AndNotToNeg with this as its recursive 
+ *      routine.
+ * Date: 27/July/95
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+DiffTree (bool_tree_node * tree)
+{
+  bool_tree_node *t = tree;
+
+  while (t)
+    {
+      if (BOOL_TAG (t) == N_and)
+	{
+	  AndNotToDiff (t, DiffTree);
+	}
+      t = BOOL_SIBLING (t);
+    }				/*while */
+
+}				/*DiffTree */
+
+/* =========================================================================
+ * Function: DiffDNF
+ * Description: 
+ *      Applies "AndNotToNeg" to each conjunct.
+ * Input: 
+ *      A DNF tree
+ * Output: 
+ *      A tree possibly with some diffs in it.
+ * ========================================================================= */
+
+static void
+DiffDNF (bool_tree_node * DNF_tree)
+{
+
+  if (BOOL_TAG (DNF_tree) == N_or)
+    {
+      bool_tree_node *child = BOOL_CHILD (DNF_tree);
+
+      while (child)
+	{
+	  if (BOOL_TAG (child) == N_and)
+	    {
+	      AndNotToDiff (child, NULL);
+	    }
+	  child = BOOL_SIBLING (child);
+	}
+    }
+  else if (BOOL_TAG (DNF_tree) == N_and)
+    {
+      AndNotToDiff (DNF_tree, NULL);
+    }
+}
+
+/* =========================================================================
+ * Function: AndSort_comp 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+/* Module variable, "term_list",  used as parameter for comparison function */
+/* The comparison function only allows certain fixed parameters */
+static TermList *term_list;
+
+static int
+AndSort_comp (const void *A, const void *B)
+{
+  const bool_tree_node *const *a = A;
+  const bool_tree_node *const *b = B;
+
+  if (BOOL_TAG (*a) == N_term && BOOL_TAG (*b) == N_term)
+    {
+      /* look up in term list */
+      int a_doc_count = GetNthWE (term_list, BOOL_TERM (*a))->doc_count;
+      int b_doc_count = GetNthWE (term_list, BOOL_TERM (*b))->doc_count;
+
+      return a_doc_count - b_doc_count;
+    }
+
+  if (BOOL_TAG (*a) == N_term && BOOL_TAG (*b) != N_term)
+    return -1;
+
+  if (BOOL_TAG (*a) != N_term && BOOL_TAG (*b) == N_term)
+    return 1;
+
+  return 0;
+}				/*AndSort_comp */
+
+/* =========================================================================
+ * Function: AndSort
+ * Description: 
+ *      Sort the list of nodes by increasing doc_count 
+ *      Using some Neil Sharman code - pretty straight forward.
+ *      Note: not-terms are sent to the end of the list
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+AndSort (bool_tree_node * and_tree, TermList * tl, CompFunc comp)
+{
+  bool_tree_node **list = NULL;
+  bool_tree_node *child = NULL;
+  int count = 0;
+  int i = 0;
+
+  if (BOOL_TAG (and_tree) != N_and)
+    return;
+
+  /* --- Convert linked list into an array for sorting --- */
+  child = BOOL_CHILD (and_tree);
+  count = 0;
+  while (child)
+    {
+      count++;
+      child = BOOL_SIBLING (child);
+    }
+
+  if (!(list = Xmalloc (sizeof (bool_tree_node *) * count)))
+    return;
+
+  child = BOOL_CHILD (and_tree);
+  for (i = 0; i < count; i++)
+    {
+      list[i] = child;
+      child = BOOL_SIBLING (child);
+    }
+  /* ----------------------------------------------------- */
+
+  term_list = tl;
+  qsort (list, count, sizeof (bool_tree_node *), comp);
+
+  /* --- Convert array back into linked list --- */
+  for (i = 0; i < count - 1; i++)
+    BOOL_SIBLING (list[i]) = list[i + 1];
+  BOOL_SIBLING (list[count - 1]) = NULL;
+  BOOL_CHILD (and_tree) = list[0];
+  Xfree (list);
+  /* ----------------------------------------------------- */
+
+}				/*AndSort */
+
+/* =========================================================================
+ * Function: AndSortDNF
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+
+static void
+AndSortDNF (bool_tree_node * DNF_tree, TermList * tl)
+{
+
+  if (BOOL_TAG (DNF_tree) == N_or)
+    {
+      bool_tree_node *child = BOOL_CHILD (DNF_tree);
+
+      while (child)
+	{
+	  if (BOOL_TAG (child) == N_and)
+	    {
+	      AndSort (child, tl, AndSort_comp);
+	    }
+	  child = BOOL_SIBLING (child);
+	}
+    }
+  else if (BOOL_TAG (DNF_tree) == N_and)
+    {
+      AndSort (DNF_tree, tl, AndSort_comp);
+    }
+}
+
+/* =========================================================================
+ * Function: MarkOrTerms
+ * Description: 
+ *      Mark or-nodes whose children are all terms.
+ *      Also store the sum of the ft's of these nodes.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+MarkOrTerms (bool_tree_node * tree, TermList * tl)
+{
+  if (BOOL_TAG (tree) == N_or)
+    {
+      int found_non_term = 0;
+      bool_tree_node *child = BOOL_CHILD (tree);
+
+      /* --- check to see if got all terms --- */
+      while (child)
+	{
+	  if (BOOL_TAG (child) != N_term)
+	    {
+	      found_non_term = 1;
+	    }
+	  if (BOOL_HAS_CHILD (tree))
+	    {
+	      MarkOrTerms (child, tl);
+	    }
+	  child = BOOL_SIBLING (child);
+	}			/*while */
+
+      if (!found_non_term)
+	{
+	  /* Must have all terms for the OR node */
+	  /* So change its tag and calculate its sum */
+	  BOOL_TAG (tree) = N_or_terms;
+	  BOOL_SUM_FT (tree) = calc_sum_ft (tree, tl);
+	}			/*if */
+      /* ------------------------------------- */
+
+    }				/*if OR node */
+
+  else if (BOOL_HAS_CHILD (tree))
+    {
+      bool_tree_node *child = BOOL_CHILD (tree);
+      while (child)
+	{
+	  MarkOrTerms (child, tl);
+	  child = BOOL_SIBLING (child);
+	}
+    }
+
+}				/*MarkOrTerms */
+
+/* =========================================================================
+ * Function: calc_sum_ft
+ * Description: 
+ *      Sums up the ft's of all the terms 
+ * Input: 
+ *      Assumes that the tree only contains terms in it 
+ * Output: 
+ *      the ft sum
+ * ========================================================================= */
+static int
+calc_sum_ft (bool_tree_node * term_tree, TermList * tl)
+{
+  int sum_ft = 0;
+  bool_tree_node *child = BOOL_CHILD (term_tree);
+  while (child)
+    {
+      sum_ft += GetNthWE (tl, BOOL_TERM (child))->doc_count;
+      child = BOOL_SIBLING (child);
+    }
+  return sum_ft;
+}
+
+/* =========================================================================
+ * Function: AndOrSort
+ * Description: 
+ *      This is like an AndSort of just terms. 
+ *      The difference is that we are now also 
+ *      considering sorting with <or of terms> by using the sum of f_t's.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+static void
+AndOrSort (bool_tree_node * tree, TermList * tl)
+{
+  if (BOOL_HAS_CHILD (tree))
+    {
+
+      if (BOOL_TAG (tree) == N_and)
+	{
+	  AndSort (tree, tl, AndOrSort_comp);
+	}
+
+      /* Check out any children down the tree */
+      /* Probably a waste of time */
+      {
+	bool_tree_node *child = BOOL_CHILD (tree);
+	while (child)
+	  {
+	    AndOrSort (child, tl);
+	    child = BOOL_SIBLING (child);
+	  }
+      }				/*do the tree */
+
+    }				/*if has children */
+}				/*AndOrSort */
+
+/* =========================================================================
+ * Function: AndOrSort_comp
+ * Description: 
+ *      Comparison function used to order "term"s and "or_terms"s.
+ *      It's purpose is to be used by a sort routine.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+static int
+AndOrSort_comp (const void *A, const void *B)
+{
+  const bool_tree_node *const *a = A;
+  const bool_tree_node *const *b = B;
+
+  if (BOOL_TAG (*a) == N_term && BOOL_TAG (*b) == N_term)
+    {
+      /* look up in term list */
+      int a_doc_count = GetNthWE (term_list, BOOL_TERM (*a))->doc_count;
+      int b_doc_count = GetNthWE (term_list, BOOL_TERM (*b))->doc_count;
+
+      return a_doc_count - b_doc_count;
+    }
+
+  if (BOOL_TAG (*a) == N_term && BOOL_TAG (*b) == N_or_terms)
+    {
+      /* look up in term list */
+      int a_doc_count = GetNthWE (term_list, BOOL_TERM (*a))->doc_count;
+      int b_doc_count = BOOL_SUM_FT (*b);
+
+      return a_doc_count - b_doc_count;
+    }
+
+  if (BOOL_TAG (*a) == N_or_terms && BOOL_TAG (*b) == N_term)
+    {
+      /* look up in term list */
+      int a_doc_count = BOOL_SUM_FT (*a);
+      int b_doc_count = GetNthWE (term_list, BOOL_TERM (*b))->doc_count;
+
+      return a_doc_count - b_doc_count;
+    }
+
+  if (BOOL_TAG (*a) == N_or_terms && BOOL_TAG (*b) == N_or_terms)
+    {
+      /* look up in term list */
+      int a_doc_count = BOOL_SUM_FT (*a);
+      int b_doc_count = BOOL_SUM_FT (*b);
+
+      return a_doc_count - b_doc_count;
+    }
+
+  if ((BOOL_TAG (*a) == N_term || BOOL_TAG (*a) == N_or_terms) &&
+      (BOOL_TAG (*b) != N_term && BOOL_TAG (*b) != N_or_terms))
+    return -1;
+
+  if ((BOOL_TAG (*a) != N_term && BOOL_TAG (*a) != N_or_terms) &&
+      (BOOL_TAG (*b) == N_term || BOOL_TAG (*b) == N_or_terms))
+    return 1;
+
+  return 0;
+}				/*AndOrSort_comp */
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_optimiser.h	(revision 21083)
@@ -0,0 +1,62 @@
+/**************************************************************************
+ *
+ * bool_optimiser -- optimise boolean parse tree
+ * Copyright (C) 1994  Tim Shimmin
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:42  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:23  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1995/03/14  05:15:21  tes
+   * Updated the boolean query optimiser to do different types of optimisation.
+   * A query environment variable "optimise_type" specifies which one is to be
+   * used. Type 1 is the new one which is faster than 2.
+   *
+   * Revision 1.1  1994/10/20  03:56:32  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/10/18  06:11:03  tes
+   * The boolean optimiser seems to be modifying the parse tree
+   * like it is supposed to.
+   * Paragraph ranking now works without any text files if required to.
+   *
+   * Revision 1.1  1994/10/12  01:15:29  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+#ifndef BOOL_OPTIMISER_H
+#define BOOL_OPTIMISER_H
+
+#include "bool_tree.h"
+#include "term_lists.h"
+
+void OptimiseBoolTree (bool_tree_node * parse_tree, TermList * term_list, int type);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.c	(revision 21083)
@@ -0,0 +1,1197 @@
+
+/*  A Bison parser, made from bool_parser.y
+ by  GNU Bison version 1.27
+  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define	TERM	257
+
+#line 24 "bool_parser.y"
+
+ 
+#include "sysfuncs.h"
+
+#include "messages.h"
+ 
+#include "memlib.h"
+#include "words.h"
+#include "stemmer.h"
+#include "term_lists.h"
+#include "bool_tree.h"
+/* [RPAP - Jan 97: Stem Index Change] */
+#include "backend.h"     /* for stemmed_dict def */
+#include "stem_search.h"
+
+#include "query_term_list.h"  /* [RPAP - Feb 97: Term Frequency] */
+
+/* --- routines --- */
+static int query_lex();
+static int yyerror(char *);
+#define yylex() query_lex(&ch_buf, end_buf)
+ 
+/* --- module variables --- */
+static char *ch_buf; /* ptr to the character query line buffer */
+static char *end_buf; /* ptr to the last character of the line buffer */
+static bool_tree_node *tree_base = NULL;
+static TermList **term_list;
+static int stemmer_num;
+static int stem_method;
+/* [RPAP - Jan 97: Stem Index Change] */
+stemmed_dict *p__sd;
+static int indexed;
+/* [RPAP - Feb 97: Term Frequency] */
+static QueryTermList **query_term_list;
+static int word_num;
+static u_long count;
+static u_long doc_count;
+static u_long invf_ptr;
+static u_long invf_len;
+
+#line 66 "bool_parser.y"
+typedef union {
+  char *text;
+  bool_tree_node *node;
+} YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		20
+#define	YYFLAG		-32768
+#define	YYNTBASE	11
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 257 ? yytranslate[x] : 16)
+
+static const char yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     8,     2,     2,     2,     2,     9,     2,     4,
+     5,     6,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     7,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,    10,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     3
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     2,     4,     8,    10,    12,    14,    17,    21,    24,
+    26,    30
+};
+
+static const short yyrhs[] = {    15,
+     0,     3,     0,     4,    15,     5,     0,     6,     0,     7,
+     0,    12,     0,     8,    13,     0,    14,     9,    13,     0,
+    14,    13,     0,    13,     0,    15,    10,    14,     0,    14,
+     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+    76,    80,    81,    82,    83,    86,    87,    90,    91,    92,
+    95,    96
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","TERM","'('",
+"')'","'*'","'_'","'!'","'&'","'|'","query","term","not","and","or", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    11,    12,    12,    12,    12,    13,    13,    14,    14,    14,
+    15,    15
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     3,     1,     1,     1,     2,     3,     2,     1,
+     3,     1
+};
+
+static const short yydefact[] = {     0,
+     2,     0,     4,     5,     0,     6,    10,    12,     1,     0,
+     7,     0,     9,     0,     3,     8,    11,     0,     0,     0
+};
+
+static const short yydefgoto[] = {    18,
+     6,     7,     8,     9
+};
+
+static const short yypact[] = {    10,
+-32768,    10,-32768,-32768,    10,-32768,-32768,     2,    -9,    14,
+-32768,    10,-32768,    10,-32768,-32768,     2,     4,    15,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,    -5,   -12,    18
+};
+
+
+#define	YYLAST		24
+
+
+static const short yytable[] = {    11,
+    14,    17,    13,    19,     1,     2,    16,     3,     4,     5,
+    12,    13,     1,     2,    20,     3,     4,     5,    15,    10,
+     0,     0,     0,    14
+};
+
+static const short yycheck[] = {     5,
+    10,    14,     8,     0,     3,     4,    12,     6,     7,     8,
+     9,    17,     3,     4,     0,     6,     7,     8,     5,     2,
+    -1,    -1,    -1,    10
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/lib/bison.simple"
+/* This file comes from bison-1.27.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+	 instead, just don't use alloca.  */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include <malloc.h>  */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+		 and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT 	goto yyabortlab
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+
+#line 216 "/usr/lib/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  if (yyfree_stacks)
+	    {
+	      free (yyss);
+	      free (yyvs);
+#ifdef YYLSP_NEEDED
+	      free (yyls);
+#endif
+	    }
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+		   size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+		   size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+		   size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 76 "bool_parser.y"
+{ tree_base = yyvsp[0].node;;
+    break;}
+case 2:
+#line 80 "bool_parser.y"
+{ yyval.node = CreateBoolTermNode(term_list, yyvsp[0].text, 1, word_num, count, doc_count, invf_ptr, invf_len, stemmer_num); ;
+    break;}
+case 3:
+#line 81 "bool_parser.y"
+{ yyval.node = yyvsp[-1].node; ;
+    break;}
+case 4:
+#line 82 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_all, NULL, NULL); ;
+    break;}
+case 5:
+#line 83 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_none, NULL, NULL); ;
+    break;}
+case 7:
+#line 87 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_not, yyvsp[0].node, NULL); ;
+    break;}
+case 8:
+#line 90 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_and, yyvsp[-2].node, yyvsp[0].node); ;
+    break;}
+case 9:
+#line 91 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_and, yyvsp[-1].node, yyvsp[0].node); ;
+    break;}
+case 11:
+#line 95 "bool_parser.y"
+{ yyval.node = CreateBoolTreeNode(N_or, yyvsp[-2].node, yyvsp[0].node); ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 542 "/usr/lib/bison.simple"
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 99 "bool_parser.y"
+
+ 
+/* Bison on one mips machine defined "const" to be nothing but
+   then did not undef it */
+#ifdef const
+#undef const
+#endif
+
+/**************************************************************************/ 
+
+
+/* =========================================================================
+ * Function: query_lex
+ * Description:
+ *      Hand written lexical analyser for the parser.
+ * Input:
+ *      ptr = ptr to a ptr into character query-line buffer
+ *      end = ptr to last char in buffer
+ * Output:
+ *      yylval.text = the token's text
+ * Notes:
+ *      does NOT produce WILD tokens at the moment
+ * ========================================================================= */
+ 
+/* [RPAP - Jan 97: Stem Index Change]
+   state mode:
+      0 = Read next token
+      1 = Output word
+      2 = Output '|' or ')'
+ */
+static int query_lex(char **ptr, const char *end)
+{
+  char *buf_ptr = *ptr;
+  static int mode = 0;
+  static int termnum = 0;
+  static TermList *Terms = NULL;
+
+  if (mode == 0)
+    {
+      /* jump over whitespace */
+      while (isspace(*buf_ptr))
+	buf_ptr++;
+ 
+      if (inaword(buf_ptr, end))
+	{
+	  static char word[MAXSTEMLEN + 1]; /* [RJM 07/98: Memory Leak] */
+	  char *sWord = Xmalloc(MAXSTEMLEN + 1);
+	  int stem_to_apply, method_using = -1;
+
+	  PARSE_STEM_WORD(word, buf_ptr, end);
+
+	  /* Extract any parameters */
+	  stem_to_apply = stem_method;
+	  while (buf_ptr <= end)
+	    {
+	      int stem_param, param_type;
+	      char param[MAXPARAMLEN + 1];
+
+	      param_type = 0;
+	      PARSE_OPT_TERM_PARAM (param, param_type, buf_ptr, end);
+	      if (!param_type)
+		break;
+
+	      if (param_type == STEMPARAM)
+		{
+		  stem_param = atoi (param);
+		  if (errno != ERANGE && indexed && stem_param >= 0 && stem_param <= 3)
+		    method_using = stem_to_apply = stem_param;
+		}
+	    }
+
+	  bcopy ((char *) word, (char *) sWord, *word + 1);
+	  stemmer (stem_to_apply, stemmer_num, sWord);
+
+	  if (stem_to_apply == 0 || !indexed || p__sd == NULL)
+	    {
+	      /* [RPAP - Feb 97: Term Frequency] */
+	      word_num = FindWord (p__sd, sWord, &count, &doc_count, &invf_ptr, &invf_len);
+	      if (word_num == -1)
+		count = doc_count = invf_ptr = invf_len = 0;
+	      AddQueryTerm (query_term_list, (u_char *) word, count, method_using);
+
+	      yylval.text = word;
+	      *ptr = buf_ptr; /* fix up ptr */
+	      Xfree (sWord);
+	      return TERM;
+	    }
+	  else
+	    {
+	      *ptr = buf_ptr; /* fix up ptr */
+	      termnum = 0;
+	      ResetTermList (&Terms);
+	      if (FindWords (p__sd, (u_char *) sWord, stem_to_apply, &Terms) > 0)
+		{
+		  /* [RPAP - Feb 97: Term Frequency] */ 
+		  int i, freq = 0;
+		  for (i = 0; i < Terms->num; i++)
+		    freq += Terms->TE[i].WE.count;
+		  AddQueryTerm (query_term_list, word, freq, method_using);
+
+		  Xfree (sWord);
+		  mode = 1;
+		  return '(';
+		}
+	      else
+		{
+		  /* Word does not exists - include in tree anyway */
+		  Xfree (sWord);
+
+		  /* [RPAP - Feb 97: Term Frequency] */
+		  word_num = -1;
+		  count = doc_count = invf_ptr = invf_len = 0;
+		  AddQueryTerm (query_term_list, (u_char *) word, count, method_using);
+
+		  yylval.text = word;
+		  return TERM;
+		}
+	    }
+	}
+      else /* NON-WORD */
+	{
+	  if (*buf_ptr == '\0')
+	    {
+	      /* return null-char if it is one */
+	      *ptr = buf_ptr; /* fix up ptr */
+	      return 0;
+	    }
+	  else
+	    {
+	      /* return 1st char, and delete from buffer */
+	      char c = *buf_ptr++;
+	      *ptr = buf_ptr; /* fix up ptr */
+	      return c;
+	    }
+	}
+    }
+  else if (mode == 1)
+    {
+      yylval.text = Terms->TE[termnum].Word;
+      
+      /* [RPAP - Feb 97: Term Frequency] */
+      word_num = Terms->TE[termnum].WE.word_num;
+      count = Terms->TE[termnum].WE.count;
+      doc_count = Terms->TE[termnum].WE.doc_count;
+      invf_ptr = Terms->TE[termnum].WE.invf_ptr;
+      invf_len = Terms->TE[termnum].WE.invf_len;
+
+      termnum++;
+      mode = 2;
+      return TERM;
+    }
+  else  /* mode == 2 */
+    {
+      if (termnum >= Terms->num)
+	{
+	  mode = 0;
+	  return ')';
+	}
+      else
+	{
+	  mode = 1;
+	  return '|';
+	}
+    }
+}/*query_lex*/
+
+/* =========================================================================
+ * Function: yyerror
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */ 
+static int yyerror(char *s)
+{
+  Message("%s", s);
+  return(1);
+}
+
+ 
+/* =========================================================================
+ * Function: ParseBool
+ * Description:
+ *      Parse a boolean query string into a term-list and a boolean parse tree
+ * Input:
+ *      query_line = query line string
+ *      query_len = query line length
+ *      the_stem_method = stem method id used for stemming
+ * Output:
+ *      the_term_list = the list of terms
+ *      res = parser result code
+ * ========================================================================= */
+ 
+bool_tree_node *
+ParseBool(char *query_line, int query_len,
+          TermList **the_term_list, int the_stemmer_num, int the_stem_method, int *res,
+	  stemmed_dict * the_sd, int is_indexed,   /* [RPAP - Jan 97: Stem Index Change] */
+	  QueryTermList **the_query_term_list)  /* [RPAP - Feb 97: Term Frequency] */
+{
+  /* global variables to be accessed by bison/yacc created parser */
+  term_list = the_term_list;
+  stemmer_num = the_stemmer_num;
+  stem_method = the_stem_method;
+  ch_buf = query_line;
+  end_buf = query_line + query_len;
+  p__sd = the_sd;   /* [RPAP - Jan 97: Stem Index Change] */
+  indexed = is_indexed;  /* [RPAP - Jan 97: Stem Index Change] */
+  query_term_list = the_query_term_list; /* [RPAP - Feb 97: Term Frequency] */
+
+  FreeBoolTree(&(tree_base));
+ 
+  ResetTermList(term_list);
+  ResetQueryTermList(query_term_list);  /* [RPAP - Feb 97: Term Frequency] */
+
+  *res = yyparse();
+ 
+  return tree_base;
+}
+ 
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**************************************************************************
+ *
+ * filename -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:43  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:40  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:26  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:56:33  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.1  1994/10/12  01:15:31  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+#ifndef BOOL_PARSER_H
+#define BOOL_PARSER_H
+
+#include "backend.h"
+#include "term_lists.h"
+#include "invf.h"
+
+bool_tree_node *ParseBool (char *query_line, int query_len,
+			   TermList ** the_term_list, int the_stemmer_num, 
+			   int the_stem_method, int *res,
+			   stemmed_dict * the_sd, int is_indexed,  /* [RPAP - Jan 97: Stem Index Change] */
+			   QueryTermList ** the_query_term_list);  /* [RPAP - Feb 97: Term Frequency] */
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.y
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.y	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_parser.y	(revision 21083)
@@ -0,0 +1,317 @@
+/**************************************************************************
+ *
+ * bool_parser - boolean query parser
+ * Copyright (C) 1994  Neil Sharman & Tim Shimmin
+ *
+ * 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.
+ *
+ *
+ **************************************************************************/
+ 
+/**************************************************************************/
+%{
+ 
+#include "sysfuncs.h"
+
+#include "messages.h"
+ 
+#include "memlib.h"
+#include "words.h"
+#include "stemmer.h"
+#include "term_lists.h"
+#include "bool_tree.h"
+/* [RPAP - Jan 97: Stem Index Change] */
+#include "backend.h"     /* for stemmed_dict def */
+#include "stem_search.h"
+
+#include "query_term_list.h"  /* [RPAP - Feb 97: Term Frequency] */
+
+/* --- routines --- */
+static int query_lex();
+static int yyerror(char *);
+#define yylex() query_lex(&ch_buf, end_buf)
+ 
+/* --- module variables --- */
+static char *ch_buf; /* ptr to the character query line buffer */
+static char *end_buf; /* ptr to the last character of the line buffer */
+static bool_tree_node *tree_base = NULL;
+static TermList **term_list;
+static int stemmer_num;
+static int stem_method;
+/* [RPAP - Jan 97: Stem Index Change] */
+stemmed_dict *p__sd;
+static int indexed;
+/* [RPAP - Feb 97: Term Frequency] */
+static QueryTermList **query_term_list;
+static int word_num;
+static u_long count;
+static u_long doc_count;
+static u_long invf_ptr;
+static u_long invf_len;
+%}
+ 
+ 
+%union {
+  char *text;
+  bool_tree_node *node;
+}
+ 
+%token <text> TERM
+%type <node> query term not and or
+ 
+%%
+ 
+query: or  { tree_base = $1;}
+;
+ 
+ 
+term:     TERM  { $$ = CreateBoolTermNode(term_list, $1, 1, word_num, count, doc_count, invf_ptr, invf_len, stemmer_num); }
+        | '(' or ')' { $$ = $2; }
+        | '*' { $$ = CreateBoolTreeNode(N_all, NULL, NULL); }
+        | '_' { $$ = CreateBoolTreeNode(N_none, NULL, NULL); }
+;
+ 
+not:      term
+        | '!' not { $$ = CreateBoolTreeNode(N_not, $2, NULL); }
+;
+ 
+and:      and '&' not { $$ = CreateBoolTreeNode(N_and, $1, $3); }
+        | and not { $$ = CreateBoolTreeNode(N_and, $1, $2); }
+        | not
+;
+ 
+or:       or '|' and { $$ = CreateBoolTreeNode(N_or, $1, $3); }
+        | and
+;
+ 
+%%
+ 
+/* Bison on one mips machine defined "const" to be nothing but
+   then did not undef it */
+#ifdef const
+#undef const
+#endif
+
+/**************************************************************************/ 
+
+
+/* =========================================================================
+ * Function: query_lex
+ * Description:
+ *      Hand written lexical analyser for the parser.
+ * Input:
+ *      ptr = ptr to a ptr into character query-line buffer
+ *      end = ptr to last char in buffer
+ * Output:
+ *      yylval.text = the token's text
+ * Notes:
+ *      does NOT produce WILD tokens at the moment
+ * ========================================================================= */
+ 
+/* [RPAP - Jan 97: Stem Index Change]
+   state mode:
+      0 = Read next token
+      1 = Output word
+      2 = Output '|' or ')'
+ */
+static int query_lex(char **ptr, const char *end)
+{
+  char *buf_ptr = *ptr;
+  static int mode = 0;
+  static int termnum = 0;
+  static TermList *Terms = NULL;
+
+  if (mode == 0)
+    {
+      /* jump over whitespace */
+      while (isspace(*buf_ptr))
+	buf_ptr++;
+ 
+      if (inaword(buf_ptr, end))
+	{
+	  static char word[MAXSTEMLEN + 1]; /* [RJM 07/98: Memory Leak] */
+	  char *sWord = Xmalloc(MAXSTEMLEN + 1);
+	  int stem_to_apply, method_using = -1;
+
+	  PARSE_STEM_WORD(word, buf_ptr, end);
+
+	  /* Extract any parameters */
+	  stem_to_apply = stem_method;
+	  while (buf_ptr <= end)
+	    {
+	      int stem_param, param_type;
+	      char param[MAXPARAMLEN + 1];
+
+	      param_type = 0;
+	      PARSE_OPT_TERM_PARAM (param, param_type, buf_ptr, end);
+	      if (!param_type)
+		break;
+
+	      if (param_type == STEMPARAM)
+		{
+		  stem_param = atoi (param);
+		  if (errno != ERANGE && indexed && stem_param >= 0 && stem_param <= 3)
+		    method_using = stem_to_apply = stem_param;
+		}
+	    }
+
+	  bcopy ((char *) word, (char *) sWord, *word + 1);
+	  stemmer (stem_to_apply, stemmer_num, sWord);
+
+	  if (stem_to_apply == 0 || !indexed || p__sd == NULL)
+	    {
+	      /* [RPAP - Feb 97: Term Frequency] */
+	      word_num = FindWord (p__sd, sWord, &count, &doc_count, &invf_ptr, &invf_len);
+	      if (word_num == -1)
+		count = doc_count = invf_ptr = invf_len = 0;
+	      AddQueryTerm (query_term_list, (u_char *) word, count, method_using);
+
+	      yylval.text = word;
+	      *ptr = buf_ptr; /* fix up ptr */
+	      Xfree (sWord);
+	      return TERM;
+	    }
+	  else
+	    {
+	      *ptr = buf_ptr; /* fix up ptr */
+	      termnum = 0;
+	      ResetTermList (&Terms);
+	      if (FindWords (p__sd, (u_char *) sWord, stem_to_apply, &Terms) > 0)
+		{
+		  /* [RPAP - Feb 97: Term Frequency] */ 
+		  int i, freq = 0;
+		  for (i = 0; i < Terms->num; i++)
+		    freq += Terms->TE[i].WE.count;
+		  AddQueryTerm (query_term_list, word, freq, method_using);
+
+		  Xfree (sWord);
+		  mode = 1;
+		  return '(';
+		}
+	      else
+		{
+		  /* Word does not exists - include in tree anyway */
+		  Xfree (sWord);
+
+		  /* [RPAP - Feb 97: Term Frequency] */
+		  word_num = -1;
+		  count = doc_count = invf_ptr = invf_len = 0;
+		  AddQueryTerm (query_term_list, (u_char *) word, count, method_using);
+
+		  yylval.text = word;
+		  return TERM;
+		}
+	    }
+	}
+      else /* NON-WORD */
+	{
+	  if (*buf_ptr == '\0')
+	    {
+	      /* return null-char if it is one */
+	      *ptr = buf_ptr; /* fix up ptr */
+	      return 0;
+	    }
+	  else
+	    {
+	      /* return 1st char, and delete from buffer */
+	      char c = *buf_ptr++;
+	      *ptr = buf_ptr; /* fix up ptr */
+	      return c;
+	    }
+	}
+    }
+  else if (mode == 1)
+    {
+      yylval.text = Terms->TE[termnum].Word;
+      
+      /* [RPAP - Feb 97: Term Frequency] */
+      word_num = Terms->TE[termnum].WE.word_num;
+      count = Terms->TE[termnum].WE.count;
+      doc_count = Terms->TE[termnum].WE.doc_count;
+      invf_ptr = Terms->TE[termnum].WE.invf_ptr;
+      invf_len = Terms->TE[termnum].WE.invf_len;
+
+      termnum++;
+      mode = 2;
+      return TERM;
+    }
+  else  /* mode == 2 */
+    {
+      if (termnum >= Terms->num)
+	{
+	  mode = 0;
+	  return ')';
+	}
+      else
+	{
+	  mode = 1;
+	  return '|';
+	}
+    }
+}/*query_lex*/
+
+/* =========================================================================
+ * Function: yyerror
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */ 
+static int yyerror(char *s)
+{
+  Message("%s", s);
+  return(1);
+}
+
+ 
+/* =========================================================================
+ * Function: ParseBool
+ * Description:
+ *      Parse a boolean query string into a term-list and a boolean parse tree
+ * Input:
+ *      query_line = query line string
+ *      query_len = query line length
+ *      the_stem_method = stem method id used for stemming
+ * Output:
+ *      the_term_list = the list of terms
+ *      res = parser result code
+ * ========================================================================= */
+ 
+bool_tree_node *
+ParseBool(char *query_line, int query_len,
+          TermList **the_term_list, int the_stemmer_num, int the_stem_method, int *res,
+	  stemmed_dict * the_sd, int is_indexed,   /* [RPAP - Jan 97: Stem Index Change] */
+	  QueryTermList **the_query_term_list)  /* [RPAP - Feb 97: Term Frequency] */
+{
+  /* global variables to be accessed by bison/yacc created parser */
+  term_list = the_term_list;
+  stemmer_num = the_stemmer_num;
+  stem_method = the_stem_method;
+  ch_buf = query_line;
+  end_buf = query_line + query_len;
+  p__sd = the_sd;   /* [RPAP - Jan 97: Stem Index Change] */
+  indexed = is_indexed;  /* [RPAP - Jan 97: Stem Index Change] */
+  query_term_list = the_query_term_list; /* [RPAP - Feb 97: Term Frequency] */
+
+  FreeBoolTree(&(tree_base));
+ 
+  ResetTermList(term_list);
+  ResetQueryTermList(query_term_list);  /* [RPAP - Feb 97: Term Frequency] */
+
+  *res = yyparse();
+ 
+  return tree_base;
+}
+ 
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.c	(revision 21083)
@@ -0,0 +1,353 @@
+/**************************************************************************
+ *
+ * bool_query.c -- Boolean query evaluation
+ * Copyright (C) 1994  Neil Sharman & Tim Shimmin
+ *
+ * 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.
+ *
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "filestats.h"
+#include "timing.h"
+#include "sptree.h"
+
+
+#include "mg.h"
+#include "text.h"
+#include "invf.h"
+#include "lists.h"
+#include "term_lists.h"
+#include "backend.h"
+#include "words.h"
+#include "stemmer.h"
+#include "stem_search.h"
+#include "invf_get.h"
+#include "text_get.h"
+#include "read_line.h"
+#include "bool_tree.h"
+#include "bool_parser.h"
+#include "bool_optimiser.h"
+#include "environment.h"
+
+
+/**********************
+  [RPAP - Feb 97: Term Frequency]
+
+  Shifted to bool_parser.y
+
+  *********************/
+
+/* =========================================================================
+ * Function: ReadInTermInfo
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+/**************************
+static void 
+ReadInTermInfo (query_data * qd)
+{
+  int i;
+  TermList *tl = qd->TL;
+
+  for (i = 0; i < tl->num; i++)
+    {
+      TermEntry *te = &(tl->TE[i]);
+      WordEntry *we = &(te->WE);
+
+       we->word_num = FindWord (qd->sd, te->Word,
+			       &we->count, &we->doc_count,
+			       &we->invf_ptr, &we->invf_len);
+      if (we->word_num == -1)
+	we->count = we->doc_count = 0;
+    }
+}
+
+***********************/
+
+
+
+/* =========================================================================
+ * Function: FindNoneTerms 
+ * Description: 
+ *      Set any terms which are not in dictionary to N_none (i.e. false)
+ *      Assumes a prior call to ReadInTermInfo
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void 
+FindNoneTerms (query_data * qd, bool_tree_node * tree)
+{
+  if (BOOL_HAS_CHILD (tree))
+    {
+      bool_tree_node *child = BOOL_CHILD (tree);
+      while (child)
+	{
+	  FindNoneTerms (qd, child);
+	  child = BOOL_SIBLING (child);
+	}
+    }
+  else if (BOOL_TAG (tree) == N_term)
+    {
+      int doc_count = qd->TL->TE[BOOL_TERM (tree)].WE.doc_count;
+      if (!doc_count)
+	BOOL_TAG (tree) = N_none;
+    }
+
+}				/*FindNoneTerms */
+
+/* =========================================================================
+ * Function: ReduceList
+ * Description: 
+ *      Go thru doc-set and get rid of all docs which are unmarked
+ *      The motivation for this routine is in the case of CNF queries.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+ReduceList (DocList * cset)
+{
+  DocEntry *src;
+  DocEntry *dest;
+
+  src = dest = cset->DE;
+  for (src = dest = cset->DE; src < cset->DE + cset->num; src++)
+    {
+      if (src->or_included)
+	{
+	  src->or_included = 0;
+	  *dest++ = *src;
+	}
+    }
+  cset->num = dest - cset->DE;
+
+}				/*ReduceList */
+
+/* =========================================================================
+ * Function: BooleanGet
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+static DocList *
+BooleanGet (query_data * qd, bool_tree_node * n,
+	    BooleanQueryInfo * bqi)
+{
+  if (n)
+    {
+      DocList *res = NULL;
+      switch (BOOL_TAG (n))
+	{
+	case N_all:
+	  Message ("Unexpected \"all\" node in the parse tree.");
+	  res = MakeDocList (0);
+	  break;
+	case N_not:
+	  Message ("Unexpected \"not\" node in the parse tree.");
+	  res = MakeDocList (0);
+	  break;
+	case N_none:
+	  {
+	    res = MakeDocList (0);
+	    break;
+	  }
+	case N_diff:
+	  {
+	    res = BooleanGet (qd, BOOL_CHILD (n), bqi);
+	    n = BOOL_SIBLING (BOOL_CHILD (n));
+	    while (n)
+	      {
+		bool_tree_node *next = BOOL_SIBLING (n);
+		if (BOOL_TAG (n) == N_term)
+		  {
+		    WordEntry *we = GetNthWE (qd->TL, BOOL_TERM (n));
+		    res = GetDocsOp (qd, we, op_diff_terms, res);
+		  }
+		else
+		  res = DiffLists (res, BooleanGet (qd, n, bqi));
+		n = next;
+	      }
+	    break;
+	  }
+	case N_and:
+	  {
+	    res = BooleanGet (qd, BOOL_CHILD (n), bqi);		/* initial fill of c-set */
+	    n = BOOL_SIBLING (BOOL_CHILD (n));
+	    while (n)
+	      {
+		bool_tree_node *next = BOOL_SIBLING (n);
+		switch (BOOL_TAG (n))
+		  {
+		  case N_term:
+		    {
+		      WordEntry *we = GetNthWE (qd->TL, BOOL_TERM (n));
+		      res = GetDocsOp (qd, we, op_and_terms, res);
+		    }
+		    break;
+		  case N_or_terms:
+		    {
+		      bool_tree_node *child = BOOL_CHILD (n);
+		      /* note: all children are terms - predetermined */
+		      while (child)
+			{
+			  WordEntry *we = GetNthWE (qd->TL, BOOL_TERM (child));
+			  res = GetDocsOp (qd, we, op_and_or_terms, res);
+			  child = BOOL_SIBLING (child);
+			}
+		      ReduceList (res);
+		    }
+		    break;
+		  default:
+		    res = IntersectLists (res, BooleanGet (qd, n, bqi));
+		  }		/*switch */
+		n = next;
+	      }
+	    break;
+	  }
+	case N_or:
+	case N_or_terms:
+	  {
+	    res = BooleanGet (qd, BOOL_CHILD (n), bqi);
+	    n = BOOL_SIBLING (BOOL_CHILD (n));
+	    while (n)
+	      {
+		bool_tree_node *next = BOOL_SIBLING (n);
+		res = MergeLists (res, BooleanGet (qd, n, bqi));
+		n = next;
+	      }
+	    break;
+	  }
+	case N_term:
+	  {
+	    res = GetDocsOp (qd, GetNthWE (qd->TL, BOOL_TERM (n)), op_term, NULL);
+	    break;
+	  }
+	}
+      return (res ? res : MakeDocList (0));
+    }
+  else
+    return MakeDocList (0);
+}
+
+/* =========================================================================
+ * Function: AdjustParaDocs
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+static int 
+DE_comp (void *a, void *b)
+{
+  return ((DocEntry *) a)->SeekPos - ((DocEntry *) b)->SeekPos;
+}
+
+static void
+AdjustParaDocs (query_data * qd, DocList * Docs)
+{
+  DocEntry *DE = Docs->DE;
+  int s, d;
+  Splay_Tree *SP;
+
+
+  /* Make the doc-list contain only references to unique
+   * real documents. So can get rid of cases where there
+   * are multiple paragraphs for a real document.
+   */
+
+  /* Note: [TS: 29/Sep/94] */
+  /* reads in seek-pos for docnums so can compare docs */
+  /* seek-pos used as real doc identifier */
+  /* whereas doc-num entries refer to paragraphs -- I think */
+  for (s = 0; s < Docs->num; s++)
+    FetchDocStart (qd, DE[s].DocNum, &DE[s].SeekPos, &DE[s].Len);
+
+  Message ("Original Number = %d\n", Docs->num);
+  SP = SP_createset (DE_comp);
+  d = 0;
+  for (s = 0; s < Docs->num; s++)
+    if (!SP_member (&DE[s], SP))
+      {
+	DE[d] = DE[s];
+	SP_insert (&DE[d], SP);
+	d++;
+      }
+  SP_freeset (SP);
+  Docs->num = d;
+  Message ("Final Number = %d\n", Docs->num);
+}
+
+/* =========================================================================
+ * Function: BooleanQuery 
+ * Description: 
+ *      The main control function for the boolean query.
+ * Input: 
+ * Output: 
+ *      qd->DL
+ * ========================================================================= */
+
+void 
+BooleanQuery (query_data * qd, char *Query, BooleanQueryInfo * bqi,
+	      int stem_method)
+{
+  bool_tree_node *tree;
+  DocList *Docs;
+  int res = 0;
+
+  tree = ParseBool (Query, MAXLINEBUFFERLEN, &(qd->TL), 
+		    qd->sd->sdh.stemmer_num, stem_method, &res,
+		    qd->sd, qd->sd->sdh.indexed,         /* [RPAP - Jan 97: Stem Index Change] */
+		    &(qd->QTL));                         /* [RPAP - Feb 97: Term Frequency] */
+
+  /* [TS:Aug/94] no longer tries to continue after parse failure */
+  if (res != 0)			/* failed the parse */
+    {
+      qd->DL = NULL;		/* have empty doc-list */
+      return;
+    }
+
+  /* [RPAP - Feb 97: Term Frequency] */
+  /*  ReadInTermInfo (qd); */
+
+  FindNoneTerms (qd, tree);
+
+  OptimiseBoolTree (tree, qd->TL, atoi (GetEnv ("optimise_type")));
+
+  qd->hops_taken = qd->num_of_ptrs = 0;
+  qd->num_of_terms = 0;
+
+  Docs = BooleanGet (qd, tree, bqi);
+
+/* [RPAP - Feb 97: NZDL Specifics] */
+#if !defined(PARABOOLEANMATCHES) && !defined(NZDL)
+  if (qd->id->ifh.InvfLevel == 3)
+    {
+      AdjustParaDocs (qd, Docs);
+    }
+#endif
+
+  if (bqi->MaxDocsToRetrieve != -1 && Docs->num > bqi->MaxDocsToRetrieve)
+    Docs->num = bqi->MaxDocsToRetrieve;
+
+  FreeQueryDocs (qd);
+
+  qd->DL = Docs;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_query.h	(revision 21083)
@@ -0,0 +1,52 @@
+/**************************************************************************
+ *
+ * bool_query.h -- boolean query processing
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:45  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:28  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:56:36  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.1  1994/10/12  01:15:33  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+#ifndef BOOL_QUERY_H
+#define BOOL_QUERY_H
+
+#include "backend.h"
+
+void BooleanQuery (query_data * qd, char *Query, BooleanQueryInfo * bqi,
+		   int stem_method);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_tester.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_tester.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_tester.c	(revision 21083)
@@ -0,0 +1,182 @@
+/**************************************************************************
+ *
+ * bool_tester -- used to test bool_tree, bool_parser, bool_optimiser
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.2  2000/03/05 22:58:24  sjboddie
+   compiler complained about using stdin and stdout to do global
+   initialization - variables were never changed so they were
+   replaced with #defines
+
+   Revision 1.1  1999/08/10 21:17:45  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:41  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:29  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1995/03/14  05:15:23  tes
+   * Updated the boolean query optimiser to do different types of optimisation.
+   * A query environment variable "optimise_type" specifies which one is to be
+   * used. Type 1 is the new one which is faster than 2.
+   *
+   * Revision 1.2  1994/10/18  06:11:05  tes
+   * The boolean optimiser seems to be modifying the parse tree
+   * like it is supposed to.
+   * Paragraph ranking now works without any text files if required to.
+   *
+   * Revision 1.1  1994/10/12  01:15:33  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "local_strings.h"
+#include "term_lists.h"
+#include "bool_tree.h"
+#include "bool_parser.h"
+#include "bool_optimiser.h"
+#include "query_term_list.h"  /* [RPAP - Feb 97: Term Frequency] */
+
+#define MAX_LINE_LEN  255
+#define STEMMER_NUM 0 /* Lovin's stemmer */
+#define STEM_METHOD 3
+
+/* Newer compilers complain when you use stdin and stdout to do global 
+initialization. Since they're static we'll just use #defines instead
+static FILE *file_in = stdin;
+static FILE *file_out = stdout;
+*/
+#define FILE_IN stdin
+#define FILE_OUT stdout
+
+static char line[MAX_LINE_LEN + 1];
+
+/* --- prototypes --- */
+static char *prompt (char *str);
+
+
+/* =========================================================================
+ * Function: main
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int main (int argc, char *argv[])
+{
+  bool_tree_node *tree = NULL;
+  TermList *term_list = NULL;
+  QueryTermList *query_term_list = NULL;  /* [RPAP - Feb 97: Term Frequency] */
+  int opt_type = 0;
+
+  while (1)
+    {
+      int res = 0;
+      int len = 0;
+
+      /* get a line */
+      if (!prompt ("Please enter boolean expression..."))
+	break;
+
+      len = strlen (line) - 1;	/* -1 => ignore the \n */
+
+      tree = ParseBool (line, len, &term_list, STEMMER_NUM, STEM_METHOD, &res,
+			NULL, 0,             /* [RPAP - Jan 97: Stem Index Change] */
+			&query_term_list);   /* [RPAP - Feb 97: Term Frequency] */
+
+      {
+	int done = 0;
+	while (!done)
+	  {
+	    if (!prompt ("Which type of optimisation 1 or 2 ?"))
+	      break;
+	    opt_type = atoi (line);
+	    done = (opt_type == 1 || opt_type == 2);
+	  }
+      }
+
+      if (!prompt ("Do you want to assign doc_counts to terms ?"))
+	break;
+
+      if (toupper (line[0]) == 'Y')
+	{
+	  /* cycle thru terms asking for doc_counts */
+	  int i;
+	  for (i = 0; i < term_list->num; i++)
+	    {
+	      char str[80];
+	      TermEntry *te = &(term_list->TE[i]);
+
+	      sprintf (str, "Please enter doc count for term '%s'",
+		       str255_to_string (te->Word, NULL));
+	      prompt (str);
+	      te->WE.doc_count = atoi (line);
+	      printf ("doc_count = %ld\n", te->WE.doc_count);
+	    }			/*for */
+	}			/*if */
+
+
+      if (res == 0)
+	{
+	  fprintf (FILE_OUT, "\n***Parsed Expression***\n");
+	  PrintBoolTree (tree, FILE_OUT);
+	  fputc ('\n', FILE_OUT);
+	  OptimiseBoolTree (tree, term_list, opt_type);
+	  fprintf (FILE_OUT, "\n***Optimised Expression ***\n");
+	  PrintBoolTree (tree, FILE_OUT);
+	  fputc ('\n', FILE_OUT);
+	}
+
+    }
+  return 0;
+}
+
+/* =========================================================================
+ * Function: 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static char *
+prompt (char *str)
+{
+  fprintf (FILE_OUT, "\n%s\n", str);
+  return fgets (line, MAX_LINE_LEN, FILE_IN);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.c	(revision 21083)
@@ -0,0 +1,292 @@
+/**************************************************************************
+ *
+ * bool_tree.c -- Boolean parse tree ADT
+ * Copyright (C) 1994  Tim Shimmin
+ *
+ * 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.
+ *
+ *       @(#)query.bool.y	1.9 16 Mar 1994
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "bool_tree.h"
+
+static char *RCSID = "$Id$";
+
+
+/* =========================================================================
+ * Function: CreateBoolNode
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+bool_tree_node *
+CreateBoolNode (N_Tag tag)
+{
+  bool_tree_node *n;
+  if (!(n = Xmalloc (sizeof (bool_tree_node))))
+    FatalError (1, "Can not create bool_tree_node for boolean query");
+  n->tag = tag;
+  BOOL_SIBLING (n) = NULL;
+  return n;
+}
+
+/* =========================================================================
+ * Function: 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+bool_tree_node *
+CreateBoolTermNode (TermList ** tl, char *text, int Count, int word_num,
+		    u_long count, u_long doc_count, u_long invf_ptr, u_long invf_len,  /* [RPAP - Feb 97: Term Frequency] */
+		    int stemmer_num) 
+{
+  bool_tree_node *n = NULL;
+
+  /* allocate bool_tree_node */
+  n = CreateBoolNode (N_term);
+
+  BOOL_TERM (n) = AddTerm (tl, (u_char *) text, Count, word_num, count, doc_count, 
+			   invf_ptr, invf_len, stemmer_num);  /* [RPAP - Feb 97: Term Frequency] */
+
+  return n;
+}
+
+
+/* =========================================================================
+ * Function: CreateTreeNode
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+bool_tree_node *
+CreateBoolTreeNode (N_Tag tag, bool_tree_node * left, bool_tree_node * right)
+{
+  bool_tree_node *n = CreateBoolNode (tag);
+
+  BOOL_CHILD (n) = left;
+  if (left)
+    BOOL_SIBLING (left) = right;
+  if (right)
+    BOOL_SIBLING (right) = NULL;
+
+  return (n);
+}
+
+/* =========================================================================
+ * Function: 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+EqualBoolNodes (bool_tree_node * a, bool_tree_node * b)
+{
+  if (BOOL_TAG (a) == N_term && BOOL_TAG (a) == N_term)
+    return BOOL_TERM (a) == BOOL_TERM (b);
+  return 0;
+}
+
+/* =========================================================================
+ * Function: FreeBoolTree
+ * Description: 
+ *      Notes: does not fix up any parent or sibling links around given tree
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void 
+FreeTree (bool_tree_node * tree)
+{
+  bool_tree_node *sibling;
+
+  while (tree)
+    {
+      if (BOOL_HAS_CHILD (tree))
+	FreeTree (BOOL_CHILD (tree));
+      sibling = BOOL_SIBLING (tree);
+      Xfree (tree);
+      tree = sibling;
+    }
+}
+
+void 
+FreeBoolTree (bool_tree_node ** the_tree)
+{
+  bool_tree_node *tree = *the_tree;
+
+  if (!tree)
+    return;
+
+  FreeTree (tree);
+  *the_tree = NULL;
+/*********************************/
+  /* THIS IS POTENTIALLY DANGEROUS */
+  /* FIX UP LATER */
+  /* Need to correct the links for parent/siblings */
+/*********************************/
+
+}
+
+/* =========================================================================
+ * Function: PrintBoolTree
+ * Description: 
+ *      Print out a text version of the tree to the file
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+PrintBinaryOp (bool_tree_node * tree, FILE * file, char op)
+{
+  bool_tree_node *child = NULL;
+  assert (BOOL_HAS_CHILD (tree));
+
+  child = BOOL_CHILD (tree);
+  while (child)
+    {
+      PrintBoolTree (child, file);
+      child = BOOL_SIBLING (child);
+      if (child)
+	fprintf (file, " %c ", op);
+    }
+}
+
+static void
+PrintUnaryOp (bool_tree_node * tree, FILE * file, char op)
+{
+  bool_tree_node *child = NULL;
+
+  fprintf (file, " %c ", op);
+  assert (BOOL_HAS_CHILD (tree));
+  child = BOOL_CHILD (tree);
+  PrintBoolTree (child, file);
+}
+
+void
+PrintBoolTree (bool_tree_node * tree, FILE * file)
+{
+  if (!tree)
+    return;
+
+  fprintf (file, "(");
+  switch (BOOL_TAG (tree))
+    {
+    case N_term:
+      fprintf (file, "term %d", BOOL_TERM (tree));
+      break;
+    case N_and:
+      PrintBinaryOp (tree, file, '&');
+      break;
+    case N_or:
+      PrintBinaryOp (tree, file, '|');
+      break;
+    case N_or_terms:
+      PrintBinaryOp (tree, file, '+');
+      break;
+    case N_diff:
+      PrintBinaryOp (tree, file, '-');
+      break;
+    case N_not:
+      PrintUnaryOp (tree, file, '!');
+      break;
+    case N_all:
+      fprintf (file, " TRUE ");
+      break;
+    case N_none:
+      fprintf (file, " FALSE ");
+      break;
+    default:
+      break;
+    }
+
+  fprintf (file, ")");
+}
+
+
+/* =========================================================================
+ * Function: CopyBoolTree
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+bool_tree_node *
+CopyBoolTree (bool_tree_node * tree)
+{
+  bool_tree_node *sibling = NULL;
+  bool_tree_node *tree_copy = NULL;
+  bool_tree_node *prev = NULL;
+
+  if (!tree)
+    return NULL;
+
+  sibling = tree;
+  prev = NULL;
+  while (sibling)
+    {
+      /* copy sibling */
+      bool_tree_node *sibling_copy = (bool_tree_node *) malloc (sizeof (bool_tree_node));
+      if (!sibling_copy)
+	FatalError (1, "No memory for bool tree copy");
+      bcopy ((char *) sibling, (char *) sibling_copy, sizeof (bool_tree_node));
+
+      if (BOOL_HAS_CHILD (sibling))
+	{
+	  BOOL_CHILD (sibling_copy) = CopyBoolTree (BOOL_CHILD (sibling));
+	}
+
+      /* do the link up of copies */
+      if (prev)
+	BOOL_SIBLING (prev) = sibling_copy;
+      else
+	tree_copy = sibling_copy;
+      prev = sibling_copy;
+
+      sibling = BOOL_SIBLING (sibling);
+    }
+  return tree_copy;
+}
+
+
+/* =========================================================================
+ * Function: LastBoolSibling
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+bool_tree_node *
+LastBoolSibling (bool_tree_node * tree)
+{
+
+  if (!tree)
+    return NULL;
+
+  do
+    {
+      tree = BOOL_SIBLING (tree);
+    }
+  while (BOOL_SIBLING (tree));
+
+  return tree;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/bool_tree.h	(revision 21083)
@@ -0,0 +1,110 @@
+/**************************************************************************
+ *
+ * bool_tree.h -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:46  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:42  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:31  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1995/03/14  05:15:25  tes
+   * Updated the boolean query optimiser to do different types of optimisation.
+   * A query environment variable "optimise_type" specifies which one is to be
+   * used. Type 1 is the new one which is faster than 2.
+   *
+   * Revision 1.2  1994/10/18  06:11:07  tes
+   * The boolean optimiser seems to be modifying the parse tree
+   * like it is supposed to.
+   * Paragraph ranking now works without any text files if required to.
+   *
+   * Revision 1.1  1994/10/12  01:15:35  tes
+   * Found bugs in the existing boolean query optimiser.
+   * So decided to rewrite it.
+   * I accidentally deleted query.bool.y, but I have replaced it
+   * with bool_parser.y (which I have forgotten to add here ! ;-(
+   *
+ */
+
+#ifndef BOOL_TREE_H
+#define BOOL_TREE_H
+
+#include "sysfuncs.h"
+#include "term_lists.h"
+
+typedef enum
+  {
+    N_term, N_and, N_or, N_diff, N_none, N_all,
+    N_not, N_or_terms
+  }
+N_Tag;
+
+typedef struct bool_tree_node
+  {
+    N_Tag tag;
+    struct bool_tree_node *sibling;
+    union
+      {
+	struct bool_tree_node *child;
+	int term_id;
+      }
+    fields;
+    int sum_ft;			/* for or_terms nodes */
+  }
+bool_tree_node;
+
+
+#define BOOL_HAS_CHILD(n) (\
+			(n)->tag==N_and || \
+			(n)->tag==N_or || (n)->tag==N_or_terms || \
+			(n)->tag==N_not || (n)->tag==N_diff)
+#define BOOL_TAG(n) ((n)->tag)
+#define BOOL_SIBLING(n) ((n)->sibling)
+#define BOOL_TERM(n) ((n)->fields.term_id)
+#define BOOL_CHILD(n) ((n)->fields.child)
+#define BOOL_SUM_FT(n) ((n)->sum_ft)
+
+bool_tree_node *CreateBoolNode (N_Tag tag);
+bool_tree_node *CopyBoolTree (bool_tree_node * tree);
+bool_tree_node *CreateBoolTermNode (TermList ** tl, char *text, int Count, int word_num,
+				    u_long count, u_long doc_count, u_long invf_ptr, 
+				    u_long invf_len, int stemmer_num);
+bool_tree_node *CreateBoolTreeNode (N_Tag tag,
+			     bool_tree_node * left, bool_tree_node * right);
+void FreeBoolTree (bool_tree_node ** tree);
+void PrintBoolTree (bool_tree_node * tree, FILE * file);
+bool_tree_node *LastBoolSibling (bool_tree_node * tree);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/build.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/build.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/build.h	(revision 21083)
@@ -0,0 +1,171 @@
+/**************************************************************************
+ *
+ * build.h -- Global information for the passes of mg_passes
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_BUILD
+#define H_BUILD
+
+#include "longlong.h"
+
+#define	TERMPARAGRAPH	'\003'
+
+
+int init_special (char *file_name);
+int init_text_1 (char *file_name);
+int init_text_2 (char *file_name);
+int init_invf_1 (char *file_name);
+int init_invf_2 (char *file_name);
+int init_ivf_1 (char *file_name);
+int init_ivf_2 (char *file_name);
+/*
+ * file_name  IN      The name of the dictionary file
+ * 
+ * returns      COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot read file
+ */
+
+
+
+
+
+int process_special (u_char * s_in, int l_in);
+int process_text_1 (u_char * s_in, int l_in);
+int process_text_2 (u_char * s_in, int l_in);
+int process_invf_1 (u_char * s_in, int l_in);
+int process_invf_2 (u_char * s_in, int l_in);
+int process_ivf_1 (u_char * s_in, int l_in);
+int process_ivf_2 (u_char * s_in, int l_in);
+/*
+ * s_in               IN      The binary string to be compressed
+ * l_in         IN      The number of characters in s_in
+ *
+ * returns      COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot read file
+ *
+ * The calling routine is responsible for ensuring that s_out is long 
+ * enough.
+ */
+
+
+
+
+
+int done_special (char *filename);
+int done_text_1 (char *filename);
+int done_text_2 (char *filename);
+int done_invf_1 (char *filename);
+int done_invf_2 (char *filename);
+int done_ivf_1 (char *filename);
+int done_ivf_2 (char *filename);
+/*
+ * returns    COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot write file
+ */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+extern char InvfLevel;
+/*
+ * This will determine the level of the inverted file it can take on the
+ * values 1, 2, or 3.
+ *
+ * Level 1: The inverted file contains only document numbers making it possible
+ *          to do only boolean queries.
+ * 
+ * Level 2: The inverted file also contains word counts per document making it
+ *          possible to do cosine ranked queries.
+ *
+ * Level 3: The inverted file contains word positions.
+ */
+
+
+extern unsigned long buf_size;
+/*
+ * The size of the document input buffer.
+ */
+
+extern unsigned long ChunkLimit;
+/*
+ * The maximum number of chunks that can be written to disk.
+ */
+
+extern unsigned long invf_buffer_size;
+/*
+ * The amount of memory to allocate to the invertion buffer.
+ */
+
+extern char SkipSGML;
+/*
+ * 1 if SGML tags are to be considered non-words when building the 
+ * inverted file.
+ */
+
+extern char MakeWeights;
+/*
+ * 1 if the weights file should be generated.
+ */
+
+extern FILE *Comp_Stats;
+/*
+ * Contains a file pointer to the file where compression stats should be sent
+ */
+
+extern int comp_stat_point;
+/*
+ * Generate a compression stat entry every comp_stat_point bytes 
+ */
+
+extern mg_ullong bytes_processed;
+/*
+ * The number of bytes processed. NOTE: This excludes document separators.
+ */
+
+extern mg_ullong bytes_received;
+/*
+ * The number of bytes processed. NOTE: This includes document separators.
+ */
+
+
+extern int stemmer_num;
+/*
+ * The stemmer to use for stemming words for the inverted file.
+ * see stemmer.h
+ */
+
+extern int stem_method;
+/*
+ * The method to use for stemming words for the inverted file.
+ * see stemmer.h
+ */
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/commands.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/commands.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/commands.c	(revision 21083)
@@ -0,0 +1,582 @@
+/**************************************************************************
+ *
+ * commands.c -- mgquery command processing functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:47  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:32  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:41:22  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+
+#include "environment.h"
+#include "mg.h"
+#include "locallib.h"
+#include "backend.h"		/* for qd */
+#include "term_lists.h"		/* for MAXTERMSTRLEN */
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+# define OPENPIPE        _popen
+# define CLOSEPIPE       _pclose
+#else
+# define OPENPIPE        popen
+# define CLOSEPIPE       pclose
+#endif
+
+extern char *PathName;
+extern FILE *OutFile, *InFile;
+extern int OutPipe, InPipe;
+extern int Quitting;
+
+char *CommandsErrorStr = NULL;
+
+/* [TS: June/95] */
+/* current qd for use by any commands */
+static query_data *the_qd = NULL;
+
+
+#include "help.mg.h"
+#include "warranty.h"
+#include "conditions.h"
+
+static void 
+CmdQuit (void)
+{
+  Quitting = 1;
+}
+
+static void 
+CmdPush (void)
+{
+  PushEnv ();
+}
+
+
+static void 
+CmdPop (void)
+{
+  PopEnv ();
+  if (EnvStackHeight () == 1)
+    PushEnv ();
+}
+
+static void 
+CmdHelp (void)
+{
+  FILE *more;
+  int i;
+
+  if (!(more = OPENPIPE (GetDefEnv ("pager", "more"), "w")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf (stderr, "ERROR : Unable to run more\n");
+      return;
+    }
+  for (i = 0; i < sizeof (help_str) / sizeof (help_str[0]); i++)
+    fputs (help_str[i], more);
+
+  CLOSEPIPE (more);  /* [RPAP - Feb 97: WIN32 Port] */
+}
+
+
+static void 
+CmdWarranty (void)
+{
+  FILE *more;
+  int i;
+
+  if (!(more = OPENPIPE (GetDefEnv ("pager", "more"), "w")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf (stderr, "ERROR : Unable to run more\n");
+      return;
+    }
+  for (i = 0; i < sizeof (warranty_str) / sizeof (warranty_str[0]); i++)
+    fputs (warranty_str[i], more);
+
+  CLOSEPIPE (more);  /* [RPAP - Feb 97: WIN32 Port] */
+}
+
+
+static void 
+CmdConditions (void)
+{
+  FILE *more;
+  int i;
+
+  if (!(more = OPENPIPE (GetDefEnv ("pager", "more"), "w")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf (stderr, "ERROR : Unable to run more\n");
+      return;
+    }
+  for (i = 0; i < sizeof (cond_str) / sizeof (cond_str[0]); i++)
+    fputs (cond_str[i], more);
+
+  CLOSEPIPE (more);
+}
+
+static void 
+CmdReset (void)
+{
+  while (EnvStackHeight () > 1)
+    PopEnv ();
+  PushEnv ();
+}
+
+static void 
+CmdDisplay (void)
+{
+  int i;
+  size_t l = 0;
+  char *name;
+  for (i = 0; (name = GetEnvName (i)) != NULL; i++)
+    if (strlen (name) > l)
+      l = strlen (name);
+
+  for (i = 0; (name = GetEnvName (i)) != NULL; i++)
+    printf ("%-*s = \"%s\"\n", (int) l, name, GetEnv (name));
+}
+
+static void 
+CmdQueryTerms (void)
+{
+  static char terms_str[MAXTERMSTRLEN + 1];
+
+  if (the_qd && the_qd->TL)
+    {
+      ConvertTermsToString (the_qd->TL, terms_str);
+      printf ("%s\n", terms_str);
+      fflush (stdout);
+    }
+
+}
+
+
+static void 
+CmdSet (char *name, char *value)
+{
+  if (!*name)
+    {
+      CommandsErrorStr = "Blank names are not permitted";
+      return;
+    }
+  switch (SetEnv (name, value, NULL))
+    {
+    case -1:
+      CommandsErrorStr = "Out of memory\n";
+      break;
+    case -2:
+      CommandsErrorStr = ConstraintErrorStr;
+      break;
+    }
+}
+
+static void 
+CmdUnset (char *name)
+{
+  if (!*name)
+    {
+      CommandsErrorStr = "Blank names are not permitted";
+      return;
+    }
+  if (UnsetEnv (name, 0) == -1)
+    CommandsErrorStr = "Specified name does not exist";
+}
+
+
+
+
+
+
+/*
+ * Do the .input command 
+ */
+static void 
+CmdInput (char *param1, char *param2)
+{
+  enum
+  {
+    READ, APPEND, PIPEFROM
+  }
+  mode;
+  FILE *NewInput;
+  char *buf, *s;
+
+  /* join the two parameters together */
+  buf = Xmalloc (strlen (param1) + strlen (param2) + 1);
+  strcpy (buf, param1);
+  strcat (buf, param2);
+  s = buf;
+
+
+  while (*s == ' ' || *s == '\t')
+    s++;
+
+  if (*s == '<')
+    {
+      s++;
+      mode = READ;
+    }
+  else if (*s == '|')
+    {
+      mode = PIPEFROM;
+      s++;
+    }
+  else
+    {
+      if (InPipe)
+	CLOSEPIPE (InFile);  /* [RPAP - Feb 97: WIN32 Port] */
+      else if (InFile != stdin)
+	fclose (InFile);
+      InPipe = 0;
+      InFile = stdin;
+      Xfree (buf);
+      return;
+    }
+
+  while (*s == ' ' || *s == '\t')
+    s++;
+
+  if (*s)
+    {
+      if (mode == READ)
+	NewInput = fopen (s, "r");
+      else
+	NewInput = OPENPIPE (s, "r");  /* [RPAP - Feb 97: WIN32 Port] */
+
+      if (NewInput)
+	{
+	  if (InPipe)
+	    CLOSEPIPE (InFile);  /* [RPAP - Feb 97: WIN32 Port] */
+	  else if (InFile != stdin)
+	    fclose (InFile);
+	  InPipe = (mode == PIPEFROM);
+	  InFile = NewInput;
+	}
+      else
+	CommandsErrorStr = "Bad input file/pipe";
+    }
+  else
+    {
+      if (InPipe)
+	CLOSEPIPE (InFile);  /* [RPAP - Feb 97: WIN32 Port] */
+      else if (InFile != stdin)
+	fclose (InFile);
+      InPipe = 0;
+      InFile = stdin;
+    }
+  Xfree (buf);
+}
+
+
+
+static void 
+CmdOutput (char *param1, char *param2)
+{
+  enum
+  {
+    WRITE, APPEND, PIPETO
+  }
+  mode;
+  char *buf, *s;
+  FILE *NewOutput;
+
+  /* join the two parameters together */
+  buf = Xmalloc (strlen (param1) + strlen (param2) + 1);
+  strcpy (buf, param1);
+  strcat (buf, param2);
+  s = buf;
+
+  while (*s == ' ' || *s == '\t')
+    s++;
+
+  if (*s == '>')
+    {
+      s++;
+      mode = APPEND;
+      if (*s == '>')
+	s++;
+      else
+	mode = WRITE;
+    }
+  else if (*s == '|')
+    {
+      mode = PIPETO;
+      s++;
+    }
+  else
+    {
+      if (OutPipe)
+	CLOSEPIPE (OutFile);  /* [RPAP - Feb 97: WIN32 Port] */
+      else if (OutFile != stdout)
+	fclose (OutFile);
+      OutPipe = 0;
+      OutFile = stdout;
+      Xfree (buf);
+      return;
+    }
+
+  while (*s == ' ' || *s == '\t')
+    s++;
+
+  if (*s)
+    {
+      if (mode == PIPETO)
+	NewOutput = OPENPIPE (s, "w");  /* [RPAP - Feb 97: WIN32 Port] */
+      else
+	NewOutput = fopen (s, mode == WRITE ? "w" : "a");
+      if (NewOutput)
+	{
+	  if (OutPipe)
+	    CLOSEPIPE (OutFile);  /* [RPAP - Feb 97: WIN32 Port] */
+	  else if (OutFile != stdout)
+	    fclose (OutFile);
+	  OutPipe = (mode == PIPETO);
+	  OutFile = NewOutput;
+	}
+      else
+	CommandsErrorStr = "Bad output file/pipe";
+    }
+  else
+    {
+      if (OutPipe)
+	CLOSEPIPE (OutFile);  /* [RPAP - Feb 97: WIN32 Port] */
+      else if (OutFile != stdout)
+	fclose (OutFile);
+      OutPipe = 0;
+      OutFile = stdout;
+    }
+  Xfree (buf);
+}
+
+
+
+static char *
+ParseArg (char *line, char *buffer)
+{
+  if (*line == '\"')
+    {
+      line++;
+      while (*line != '\"' && *line != '\0')
+	{
+	  if (*line == '\\')
+	    *buffer++ = *line++;
+	  if (*line != '\0')
+	    *buffer++ = *line++;
+	}
+      if (*line == '\"')
+	line++;
+    }
+  else
+    while (*line != ' ' && *line != '\t' && *line != '\0')
+      {
+	if (*line == '\\')
+	  line++;
+	if (*line != '\0')
+	  *buffer++ = *line++;
+      }
+  *buffer = '\0';
+  while (*line == ' ' || *line == '\t')
+    line++;
+  return (line);
+}
+
+
+
+char *
+ProcessCommands (char *line, query_data * qd)
+{
+  struct
+  {
+    char *Command;
+    void (*action) (void);
+    void (*action1) (char *);
+    void (*action2) (char *, char *);
+  }
+   *dc, dot_command[] =
+  {
+    {
+      "set", NULL, NULL, CmdSet
+    }
+    ,
+    {
+      "input", NULL, NULL, CmdInput
+    }
+    ,
+    {
+      "output", NULL, NULL, CmdOutput
+    }
+    ,
+    {
+      "unset", NULL, CmdUnset, NULL
+    }
+    ,
+    {
+      "help", CmdHelp, NULL, NULL
+    }
+    ,
+    {
+      "reset", CmdReset, NULL, NULL
+    }
+    ,
+    {
+      "display", CmdDisplay, NULL, NULL
+    }
+    ,
+    {
+      "push", CmdPush, NULL, NULL
+    }
+    ,
+    {
+      "quit", CmdQuit, NULL, NULL
+    }
+    ,
+    {
+      "pop", CmdPop, NULL, NULL
+    }
+    ,
+    {
+      "warranty", CmdWarranty, NULL, NULL
+    }
+    ,
+    {
+      "conditions", CmdConditions, NULL, NULL
+    }
+    ,
+    {
+      "queryterms", CmdQueryTerms, NULL, NULL
+    }
+  };
+
+
+  char command[512];
+  char param1[512], param2[512];
+  CommandsErrorStr = NULL;
+  the_qd = qd;			/* set globally to be accessed by command functions if needed */
+  while (*line == ' ' || *line == '\t')
+    line++;
+  while (*line == '.')
+    {
+      int i;
+      line++;
+      for (i = 0; isalpha (*line) && i < 512; i++, line++)
+	command[i] = tolower (*line);
+      while (*line == ' ' || *line == '\t')
+	line++;
+      if (i != 512)
+	{
+	  command[i] = '\0';
+	  for (i = 0, dc = dot_command; i < NUMOF (dot_command); i++, dc++)
+	    if (!strcmp (dc->Command, command))
+	      {
+		if (dc->action)
+		  dc->action ();
+		else if (dc->action1)
+		  {
+		    line = ParseArg (line, param1);
+		    dc->action1 (param1);
+		    break;
+		  }
+		else if (dc->action2)
+		  {
+		    line = ParseArg (line, param1);
+		    line = ParseArg (line, param2);
+		    dc->action2 (param1, param2);
+		    break;
+		  }
+		if (CommandsErrorStr)
+		  *line = '\0';
+		break;
+	      }
+	  if (i == NUMOF (dot_command))
+	    i = 100;
+	}
+      if (i == 100)
+	{
+	  CommandsErrorStr = "Illegal command";
+	  *line = '\0';
+	}
+      while (*line == ' ' || *line == '\t')
+	line++;
+    }
+  return (line);
+}
+
+
+
+
+
+void 
+read_mgrc_file (void)
+{
+  char line[1000];
+  char FileName[256];
+  int LineNum = 0;
+  FILE *mgrc;
+
+  strcpy (FileName, ".mgrc");
+  mgrc = fopen (FileName, "r");
+
+  if (!mgrc)
+    {
+      char *home_path = getenv ("HOME");
+      if (home_path)
+	{
+	  sprintf (FileName, "%s/.mgrc", home_path);
+	  mgrc = fopen (FileName, "r");
+	}
+    }
+
+  if (!mgrc)
+    return;
+
+  while (fgets (line, sizeof (line), mgrc))
+    {
+      char *s, linebuf[1000];
+      LineNum++;
+      if ((s = strchr (line, '\n')) != NULL)
+	*s = '\0';
+      strcpy (linebuf, line);
+      if ((s = strchr (line, '#')) != NULL)
+	*s = '\0';
+      if (!*line)
+	continue;
+      ProcessCommands (line, NULL);
+      if (CommandsErrorStr)
+	Message ("%s\n%s : ERROR in line %d of %s\n%s : %s\n",
+		 linebuf,
+		 msg_prefix, LineNum, FileName,
+		 msg_prefix, CommandsErrorStr);
+    }
+  fclose (mgrc);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/commands.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/commands.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/commands.h	(revision 21083)
@@ -0,0 +1,33 @@
+/**************************************************************************
+ *
+ * commands.h -- mgquery command processing functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef COMMANDS_H
+#define COMMANDS_H
+
+#include "backend.h"
+
+extern char *CommandsErrorStr;
+char *ProcessCommands (char *line, query_data * qd);
+void read_mgrc_file (void);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.c	(revision 21083)
@@ -0,0 +1,255 @@
+/**************************************************************************
+ *
+ * comp_dict.c -- Functions for loading the compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "huffman.h"
+#include "local_strings.h"
+#include "memlib.h"
+#include "messages.h"
+
+#include "mg.h"
+#include "hash.h"
+#include "text.h"
+#include "comp_dict.h"
+#include "locallib.h"
+#include "mg_files.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:48  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:34  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:41  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:24  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+compression_dict_header cdh;
+compressed_text_header cth;
+comp_frags_header cfh[2];
+
+dict_hash_table *ht[2];
+
+huff_data char_huff[2];
+huff_data lens_huff[2];
+u_long *char_codes[2], *lens_codes[2];
+u_long Words_disk = 0;
+u_long Chars_disk = 0;
+
+
+static dict_hash_table *
+ReadInWords (FILE * dict, comp_frags_header * cfh,
+	     int esc)
+{
+  int i;
+  u_char *allwords, *prev = NULL;
+  dict_hash_table *ht;
+  u_char **words;
+  u_long ht_size;
+
+  ht_size = prime (cfh->hd.num_codes * HASH_RATIO);
+  if (!(ht = Xmalloc (sizeof (dict_hash_table) +
+		      (ht_size - 1) * sizeof (ht->table[0]))))
+    {
+      Message ("no memory for hash_table\n");
+      return NULL;
+    }
+
+  ht->size = ht_size;
+  ht->hd = &cfh->hd;
+
+  if (!(ht->codes = Generate_Huffman_Codes (&cfh->hd, NULL)))
+    {
+      Message ("no memory for huffman codes\n");
+      return NULL;
+    }
+
+  if (!(ht->words = Xmalloc (sizeof (u_char *) * cfh->hd.num_codes)))
+    {
+      Message ("no memory for word pointers\n");
+      return NULL;
+    }
+  words = ht->words;
+
+  bzero ((char *) ht->table, ht_size * sizeof (ht->table[0]));
+
+  if (!(allwords = Xmalloc (sizeof (u_char) * cfh->uncompressed_size)))
+    {
+      Message ("no memory for words\n");
+      return NULL;
+    }
+
+  for (i = 0; i < cfh->hd.num_codes; i++, words++)
+    {
+      register int val, copy;
+      val = fgetc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      *words = allwords;
+
+      memcpy (allwords + 1, prev + 1, copy);
+      fread (allwords + copy + 1, sizeof (u_char), val, dict);
+      *allwords = val + copy;
+
+      Words_disk += val + 1;
+
+      /* insert into the hash table */
+      if (i < cfh->hd.num_codes - esc)
+	{
+	  register u_char **wptr;
+	  register int tsize = ht->size;
+	  register unsigned long hashval, step;
+
+	  HASH (hashval, step, allwords, tsize);
+
+	  wptr = ht->table[hashval];
+	  for (; wptr;)
+	    {
+	      hashval += step;
+	      if (hashval >= tsize)
+		hashval -= tsize;
+	      wptr = ht->table[hashval];
+	    }
+	  ht->table[hashval] = words;
+	}
+      prev = allwords;
+      allwords += *allwords + 1;
+    }
+  return ht;
+}
+
+
+
+int 
+LoadCompressionDictionary (char *dict_file_name)
+{
+  FILE *dict;
+  int which;
+  if (!(dict = open_named_file (dict_file_name, "rb", MAGIC_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return COMPERROR;
+
+  Words_disk = sizeof (u_long);
+
+  if (Read_cdh (dict, &cdh, NULL, &Words_disk) == -1)
+    goto error;
+
+  for (which = 0; which < 2; which++)
+    switch (cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  if (Read_cfh (dict, &cfh[which], NULL, &Words_disk) == -1)
+	    goto error;
+
+	  if (!(ht[which] = ReadInWords (dict, &cfh[which], 0)))
+	    goto error;
+
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    {
+	      if (Read_cfh (dict, &cfh[which], NULL, &Words_disk) == -1)
+		goto error;
+	      if (!(ht[which] = ReadInWords (dict, &cfh[which], 1)))
+		goto error;
+	    }
+	  else
+	    ht[which] = NULL;
+	  if (Read_Huffman_Data (dict, &char_huff[which], NULL,
+				 &Chars_disk) == -1)
+	    goto error;
+	  if (!(char_codes[which] =
+		Generate_Huffman_Codes (&char_huff[which], NULL)))
+	    goto error;
+	  if (Read_Huffman_Data (dict, &lens_huff[which], NULL,
+				 &Chars_disk) == -1)
+	    goto error;
+	  if (!(lens_codes[which] =
+		Generate_Huffman_Codes (&lens_huff[which], NULL)))
+	    goto error;
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    {
+	      if (Read_cfh (dict, &cfh[which], NULL, &Words_disk) == -1)
+		goto error;
+	      if (!(ht[which] = ReadInWords (dict, &cfh[which], 1)))
+		goto error;
+	    }
+	  else
+	    ht[which] = NULL;
+	  switch (cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      if (Read_Huffman_Data (dict, &char_huff[which], NULL,
+				     &Chars_disk) == -1)
+		goto error;
+	      if (!(char_codes[which] =
+		    Generate_Huffman_Codes (&char_huff[which], NULL)))
+		goto error;
+	      if (Read_Huffman_Data (dict, &lens_huff[which], NULL,
+				     &Chars_disk) == -1)
+		goto error;
+	      if (!(lens_codes[which] =
+		    Generate_Huffman_Codes (&lens_huff[which], NULL)))
+		goto error;
+	      break;
+	    case MG_NOVEL_BINARY:
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    case MG_NOVEL_HYBRID_MTF:
+	      break;
+	    default:
+	      FatalError (1, "Bad novel method");
+	    }
+	}
+	break;
+      default:
+	FatalError (1, "Bad dictionary kind\n");
+      }
+
+  return (COMPALLOK);
+
+
+error:
+  fclose (dict);
+  return (COMPERROR);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/comp_dict.h	(revision 21083)
@@ -0,0 +1,59 @@
+/**************************************************************************
+ *
+ * comp_dict.h -- Functions for loading the compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+
+
+#define HASH_RATIO 2
+
+
+
+
+typedef struct dict_hash_table
+  {
+    u_long size;
+    huff_data *hd;
+    u_long *codes;
+    u_char **words;
+    u_char **table[1];
+  }
+dict_hash_table;
+
+
+
+
+extern compression_dict_header cdh;
+extern compressed_text_header cth;
+extern comp_frags_header cfh[2];
+
+extern dict_hash_table *ht[2];
+
+extern huff_data char_huff[2];
+extern huff_data lens_huff[2];
+extern u_long *char_codes[2], *lens_codes[2];
+extern u_long Words_disk;
+extern u_long Chars_disk;
+
+
+
+int LoadCompressionDictionary (char *dict_file_name);
Index: /main/tags/2.38/gsdl/packages/mg/src/text/conditions.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/conditions.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/conditions.h	(revision 21083)
@@ -0,0 +1,226 @@
+static char *cond_str[] = {
+"		    GNU GENERAL PUBLIC LICENSE\n",
+"   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n",
+"\n",
+"  0. This License applies to any program or other work which contains\n",
+"a notice placed by the copyright holder saying it may be distributed\n",
+"under the terms of this General Public License.  The \"Program\", below,\n",
+"refers to any such program or work, and a \"work based on the Program\"\n",
+"means either the Program or any derivative work under copyright law:\n",
+"that is to say, a work containing the Program or a portion of it,\n",
+"either verbatim or with modifications and/or translated into another\n",
+"language.  (Hereinafter, translation is included without limitation in\n",
+"the term \"modification\".)  Each licensee is addressed as \"you\".\n",
+"\n",
+"Activities other than copying, distribution and modification are not\n",
+"covered by this License; they are outside its scope.  The act of\n",
+"running the Program is not restricted, and the output from the Program\n",
+"is covered only if its contents constitute a work based on the\n",
+"Program (independent of having been made by running the Program).\n",
+"Whether that is true depends on what the Program does.\n",
+"\n",
+"  1. You may copy and distribute verbatim copies of the Program's\n",
+"source code as you receive it, in any medium, provided that you\n",
+"conspicuously and appropriately publish on each copy an appropriate\n",
+"copyright notice and disclaimer of warranty; keep intact all the\n",
+"notices that refer to this License and to the absence of any warranty;\n",
+"and give any other recipients of the Program a copy of this License\n",
+"along with the Program.\n",
+"\n",
+"You may charge a fee for the physical act of transferring a copy, and\n",
+"you may at your option offer warranty protection in exchange for a fee.\n",
+"\n",
+"  2. You may modify your copy or copies of the Program or any portion\n",
+"of it, thus forming a work based on the Program, and copy and\n",
+"distribute such modifications or work under the terms of Section 1\n",
+"above, provided that you also meet all of these conditions:\n",
+"\n",
+"    a) You must cause the modified files to carry prominent notices\n",
+"    stating that you changed the files and the date of any change.\n",
+"\n",
+"    b) You must cause any work that you distribute or publish, that in\n",
+"    whole or in part contains or is derived from the Program or any\n",
+"    part thereof, to be licensed as a whole at no charge to all third\n",
+"    parties under the terms of this License.\n",
+"\n",
+"    c) If the modified program normally reads commands interactively\n",
+"    when run, you must cause it, when started running for such\n",
+"    interactive use in the most ordinary way, to print or display an\n",
+"    announcement including an appropriate copyright notice and a\n",
+"    notice that there is no warranty (or else, saying that you provide\n",
+"    a warranty) and that users may redistribute the program under\n",
+"    these conditions, and telling the user how to view a copy of this\n",
+"    License.  (Exception: if the Program itself is interactive but\n",
+"    does not normally print such an announcement, your work based on\n",
+"    the Program is not required to print an announcement.)\n",
+"
+\n",
+"These requirements apply to the modified work as a whole.  If\n",
+"identifiable sections of that work are not derived from the Program,\n",
+"and can be reasonably considered independent and separate works in\n",
+"themselves, then this License, and its terms, do not apply to those\n",
+"sections when you distribute them as separate works.  But when you\n",
+"distribute the same sections as part of a whole which is a work based\n",
+"on the Program, the distribution of the whole must be on the terms of\n",
+"this License, whose permissions for other licensees extend to the\n",
+"entire whole, and thus to each and every part regardless of who wrote it.\n",
+"\n",
+"Thus, it is not the intent of this section to claim rights or contest\n",
+"your rights to work written entirely by you; rather, the intent is to\n",
+"exercise the right to control the distribution of derivative or\n",
+"collective works based on the Program.\n",
+"\n",
+"In addition, mere aggregation of another work not based on the Program\n",
+"with the Program (or with a work based on the Program) on a volume of\n",
+"a storage or distribution medium does not bring the other work under\n",
+"the scope of this License.\n",
+"\n",
+"  3. You may copy and distribute the Program (or a work based on it,\n",
+"under Section 2) in object code or executable form under the terms of\n",
+"Sections 1 and 2 above provided that you also do one of the following:\n",
+"\n",
+"    a) Accompany it with the complete corresponding machine-readable\n",
+"    source code, which must be distributed under the terms of Sections\n",
+"    1 and 2 above on a medium customarily used for software interchange; or,\n",
+"\n",
+"    b) Accompany it with a written offer, valid for at least three\n",
+"    years, to give any third party, for a charge no more than your\n",
+"    cost of physically performing source distribution, a complete\n",
+"    machine-readable copy of the corresponding source code, to be\n",
+"    distributed under the terms of Sections 1 and 2 above on a medium\n",
+"    customarily used for software interchange; or,\n",
+"\n",
+"    c) Accompany it with the information you received as to the offer\n",
+"    to distribute corresponding source code.  (This alternative is\n",
+"    allowed only for noncommercial distribution and only if you\n",
+"    received the program in object code or executable form with such\n",
+"    an offer, in accord with Subsection b above.)\n",
+"\n",
+"The source code for a work means the preferred form of the work for\n",
+"making modifications to it.  For an executable work, complete source\n",
+"code means all the source code for all modules it contains, plus any\n",
+"associated interface definition files, plus the scripts used to\n",
+"control compilation and installation of the executable.  However, as a\n",
+"special exception, the source code distributed need not include\n",
+"anything that is normally distributed (in either source or binary\n",
+"form) with the major components (compiler, kernel, and so on) of the\n",
+"operating system on which the executable runs, unless that component\n",
+"itself accompanies the executable.\n",
+"\n",
+"If distribution of executable or object code is made by offering\n",
+"access to copy from a designated place, then offering equivalent\n",
+"access to copy the source code from the same place counts as\n",
+"distribution of the source code, even though third parties are not\n",
+"compelled to copy the source along with the object code.\n",
+"
+\n",
+"  4. You may not copy, modify, sublicense, or distribute the Program\n",
+"except as expressly provided under this License.  Any attempt\n",
+"otherwise to copy, modify, sublicense or distribute the Program is\n",
+"void, and will automatically terminate your rights under this License.\n",
+"However, parties who have received copies, or rights, from you under\n",
+"this License will not have their licenses terminated so long as such\n",
+"parties remain in full compliance.\n",
+"\n",
+"  5. You are not required to accept this License, since you have not\n",
+"signed it.  However, nothing else grants you permission to modify or\n",
+"distribute the Program or its derivative works.  These actions are\n",
+"prohibited by law if you do not accept this License.  Therefore, by\n",
+"modifying or distributing the Program (or any work based on the\n",
+"Program), you indicate your acceptance of this License to do so, and\n",
+"all its terms and conditions for copying, distributing or modifying\n",
+"the Program or works based on it.\n",
+"\n",
+"  6. Each time you redistribute the Program (or any work based on the\n",
+"Program), the recipient automatically receives a license from the\n",
+"original licensor to copy, distribute or modify the Program subject to\n",
+"these terms and conditions.  You may not impose any further\n",
+"restrictions on the recipients' exercise of the rights granted herein.\n",
+"You are not responsible for enforcing compliance by third parties to\n",
+"this License.\n",
+"\n",
+"  7. If, as a consequence of a court judgment or allegation of patent\n",
+"infringement or for any other reason (not limited to patent issues),\n",
+"conditions are imposed on you (whether by court order, agreement or\n",
+"otherwise) that contradict the conditions of this License, they do not\n",
+"excuse you from the conditions of this License.  If you cannot\n",
+"distribute so as to satisfy simultaneously your obligations under this\n",
+"License and any other pertinent obligations, then as a consequence you\n",
+"may not distribute the Program at all.  For example, if a patent\n",
+"license would not permit royalty-free redistribution of the Program by\n",
+"all those who receive copies directly or indirectly through you, then\n",
+"the only way you could satisfy both it and this License would be to\n",
+"refrain entirely from distribution of the Program.\n",
+"\n",
+"If any portion of this section is held invalid or unenforceable under\n",
+"any particular circumstance, the balance of the section is intended to\n",
+"apply and the section as a whole is intended to apply in other\n",
+"circumstances.\n",
+"\n",
+"It is not the purpose of this section to induce you to infringe any\n",
+"patents or other property right claims or to contest validity of any\n",
+"such claims; this section has the sole purpose of protecting the\n",
+"integrity of the free software distribution system, which is\n",
+"implemented by public license practices.  Many people have made\n",
+"generous contributions to the wide range of software distributed\n",
+"through that system in reliance on consistent application of that\n",
+"system; it is up to the author/donor to decide if he or she is willing\n",
+"to distribute software through any other system and a licensee cannot\n",
+"impose that choice.\n",
+"\n",
+"This section is intended to make thoroughly clear what is believed to\n",
+"be a consequence of the rest of this License.\n",
+"
+\n",
+"  8. If the distribution and/or use of the Program is restricted in\n",
+"certain countries either by patents or by copyrighted interfaces, the\n",
+"original copyright holder who places the Program under this License\n",
+"may add an explicit geographical distribution limitation excluding\n",
+"those countries, so that distribution is permitted only in or among\n",
+"countries not thus excluded.  In such case, this License incorporates\n",
+"the limitation as if written in the body of this License.\n",
+"\n",
+"  9. The Free Software Foundation may publish revised and/or new versions\n",
+"of the General Public License from time to time.  Such new versions will\n",
+"be similar in spirit to the present version, but may differ in detail to\n",
+"address new problems or concerns.\n",
+"\n",
+"Each version is given a distinguishing version number.  If the Program\n",
+"specifies a version number of this License which applies to it and \"any\n",
+"later version\", you have the option of following the terms and conditions\n",
+"either of that version or of any later version published by the Free\n",
+"Software Foundation.  If the Program does not specify a version number of\n",
+"this License, you may choose any version ever published by the Free Software\n",
+"Foundation.\n",
+"\n",
+"  10. If you wish to incorporate parts of the Program into other free\n",
+"programs whose distribution conditions are different, write to the author\n",
+"to ask for permission.  For software which is copyrighted by the Free\n",
+"Software Foundation, write to the Free Software Foundation; we sometimes\n",
+"make exceptions for this.  Our decision will be guided by the two goals\n",
+"of preserving the free status of all derivatives of our free software and\n",
+"of promoting the sharing and reuse of software generally.\n",
+"\n",
+"			    NO WARRANTY\n",
+"\n",
+"  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n",
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n",
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n",
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n",
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n",
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n",
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n",
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n",
+"REPAIR OR CORRECTION.\n",
+"\n",
+"  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n",
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n",
+"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n",
+"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n",
+"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n",
+"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n",
+"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n",
+"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n",
+"POSSIBILITY OF SUCH DAMAGES.\n",
+"\n",
+"		     END OF TERMS AND CONDITIONS\n"};
Index: /main/tags/2.38/gsdl/packages/mg/src/text/conditions.src
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/conditions.src	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/conditions.src	(revision 21083)
@@ -0,0 +1,225 @@
+		    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
Index: /main/tags/2.38/gsdl/packages/mg/src/text/environment.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/environment.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/environment.c	(revision 21083)
@@ -0,0 +1,678 @@
+/**************************************************************************
+ *
+ * environment.c -- mgquery environment functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:17:50  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:37  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.5  1995/03/14  05:15:26  tes
+   * Updated the boolean query optimiser to do different types of optimisation.
+   * A query environment variable "optimise_type" specifies which one is to be
+   * used. Type 1 is the new one which is faster than 2.
+   *
+   * Revision 1.4  1994/11/25  03:47:43  tes
+   * Committing files before adding the merge stuff.
+   *
+   * Revision 1.3  1994/10/20  03:56:43  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:25  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "locallib.h"
+#include "local_strings.h"
+#include "messages.h"
+
+#include "environment.h"
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+# define STRCASECMP      stricmp
+#else
+# define STRCASECMP      strcasecmp
+#endif
+
+typedef struct
+  {
+    char *Name, *Data;
+    char *(*Constraint) (char *Old, char *New);
+  }
+EEntry;
+
+typedef struct Env
+  {
+    EEntry *Environment;
+    int NumEnv;
+    struct Env *Next;
+  }
+Env;
+
+
+char *ConstraintErrorStr;
+
+static Env Base =
+{NULL, 0, NULL};
+
+
+/*
+ * Add name and data to the environment (data may be NULL)
+ * All names are converted to lower case
+ * returns 0 on success, -1 on memory failure or -2 on constraint failure
+ */
+int 
+SetEnv (char *name, char *data, char *(*Constraint) (char *, char *))
+{
+  int i;
+  EEntry *newenv, *env = Base.Environment;
+
+  if (data && *data == '\0')
+    data = NULL;
+
+  /* search for name in the environment */
+  for (i = 0; i < Base.NumEnv && STRCASECMP (name, env->Name); i++, env++);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* if not found the increase the environment size */
+  if (i >= Base.NumEnv)
+    {
+      if (Constraint)
+	{
+	  data = Constraint (NULL, data);
+	  if (!data)
+	    return (-2);
+	}
+      /* allocate memory for the new environment */
+      newenv = Base.Environment ?
+	Xrealloc (Base.Environment, sizeof (EEntry) * (Base.NumEnv + 1)) :
+	Xmalloc (sizeof (EEntry) * (Base.NumEnv + 1));
+      if (!newenv)
+	return (-1);
+      Base.Environment = newenv;
+      env = &newenv[Base.NumEnv];
+      env->Data = NULL;
+      env->Name = NULL;
+      env->Constraint = Constraint;
+      env->Name = Xstrdup (name);
+      if (!env->Name)
+	return (-1);
+      Base.NumEnv++;
+      for (i = 0; env->Name[i]; i++)
+	env->Name[i] = tolower (env->Name[i]);
+    }
+  if (env->Constraint)
+    {
+      data = env->Constraint (env->Data, data);
+      if (!data)
+	return (-2);
+    }
+  if (env->Data)
+    Xfree (env->Data);
+  env->Data = NULL;
+  if (data && *data != '\0')
+    {
+      env->Data = Xstrdup (data);
+      if (!env->Data)
+	return (-1);
+    }
+  return (0);
+}
+
+
+
+/*
+ * Returns the data associated with name. If Data = NULL then this routine
+ * returns a pointer to "". If the specified name does not exist then this 
+ * routine returns NULL.
+ */
+char *
+GetEnv (char *name)
+{
+  int i;
+  EEntry *env = Base.Environment;
+  /* search for name in the environment */
+  for (i = 0; i < Base.NumEnv && STRCASECMP (name, env->Name); i++, env++);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  if (i >= Base.NumEnv)
+    return (NULL);
+
+  return (env->Data ? env->Data : "");
+}
+
+/*
+ * Returns the data associated with name. If Data = NULL then this routine
+ * returns a pointer to "". If the specified name does not exist then this 
+ * routine returns default.
+ */
+char *
+GetDefEnv (char *name, char *def)
+{
+  char *data = GetEnv (name);
+  return (data ? data : def);
+}
+
+
+
+/*
+ * This function pushes the environment on to a stack and duplicated it in 
+ * the current stack.
+ *
+ */
+int 
+PushEnv (void)
+{
+  Env *env = Xmalloc (sizeof (Env));
+  int i;
+  *env = Base;
+  Base.Next = env;
+  Base.Environment = NULL;
+  Base.NumEnv = 0;
+  for (i = 0; i < env->NumEnv; i++)
+    if (SetEnv (env->Environment[i].Name, env->Environment[i].Data,
+		env->Environment[i].Constraint))
+      return (-1);
+  return (0);
+}
+
+int 
+PopEnv (void)
+{
+  Env *env;
+  int i;
+  if (!Base.Next)
+    return (-1);
+  for (i = 0; i < Base.NumEnv; i++)
+    {
+      Xfree (Base.Environment[i].Name);
+      if (Base.Environment[i].Data)
+	Xfree (Base.Environment[i].Data);
+    }
+  if (Base.Environment)
+    Xfree (Base.Environment);
+  env = Base.Next;
+  Base = *env;
+  Xfree (env);
+  return (0);
+}
+
+
+/*
+ * Count the number of environments on the stack, including the current one.
+ *
+ */
+int 
+EnvStackHeight (void)
+{
+  int i = 1;
+  Env *env = &Base;
+  while (env->Next)
+    {
+      i++;
+      env = env->Next;
+    }
+  return (i);
+}
+
+/*
+ * Delete environment variable name. If name does not exist it returns -1
+ * otherwise it returns 0
+ */
+int 
+UnsetEnv (char *name, int Force)
+{
+  int i;
+  EEntry *env = Base.Environment;
+  /* search for name in the environment */
+  for (i = 0; i < Base.NumEnv && STRCASECMP (name, env->Name); i++, env++);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  if (i >= Base.NumEnv ||
+      (Base.Environment[i].Constraint && !Force))
+    return (-1);
+  Xfree (Base.Environment[i].Name);
+  if (Base.Environment[i].Data)
+    Xfree (Base.Environment[i].Data);
+  for (i++; i < Base.NumEnv; i++)
+    Base.Environment[i - 1] = Base.Environment[i];
+  Base.NumEnv--;
+  if (Base.NumEnv == 0)
+    {
+      Xfree (Base.Environment);
+      Base.Environment = NULL;
+    }
+  return (0);
+}
+
+
+
+
+
+
+
+
+/*
+ * Returns the name of environment variable number i or NULL if i is greater 
+ * than or equal to the number of environment variables. Names start from
+ * zero. 
+ */
+char *
+GetEnvName (int i)
+{
+  return (i < Base.NumEnv ? Base.Environment[i].Name : NULL);
+}
+
+static char *BooleanStrs[] =
+{"false", "true", "no", "yes", "off", "on"};
+
+static char *
+BooleanCons (char *Old, char *New)
+{
+  int i;
+  int old = -1, new = -1;
+  if (Old)
+    for (i = 0; i < sizeof (BooleanStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (Old, BooleanStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  old = i;
+	  break;
+	}
+  if (New)
+    for (i = 0; i < sizeof (BooleanStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (New, BooleanStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  new = i;
+	  break;
+	}
+  if (new >= 0)
+    return (New);
+  if (!New)
+    return (BooleanStrs[Old ? old ^ 1 : 0]);
+  ConstraintErrorStr = "Invalid argument [true|false|yes|no|on|off] required";
+  return (NULL);
+}
+
+/*
+ * returns 0 or 1  for a boolean string
+ * or default on a error
+ */
+int 
+BooleanEnv (char *data, int def)
+{
+  int i;
+  if (!data)
+    return (def);
+  for (i = 0; i < sizeof (BooleanStrs) / sizeof (char *); i++)
+    if (!STRCASECMP (data, BooleanStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+      return (i & 1);
+  return (def);
+}
+
+/*
+ * returns the value for a integer string
+ * or default on a error
+ */
+long 
+IntEnv (char *data, long def)
+{
+  long val;
+  char *ptr;
+  if (!data)
+    return (def);
+  val = strtol (data, &ptr, 10);
+  return *ptr ? def : val;
+}
+
+static char *
+NumberCmp (char *num, int min, int max)
+{
+  char *err;
+  int val;
+  static char Err[100];
+  ConstraintErrorStr = "Not a valid number";
+  if (!num)
+    return (NULL);
+  val = strtol (num, &err, 10);
+  if (*err)
+    return (NULL);
+  sprintf (Err, "Not in legal range [%d <= num <= %d]", min, max);
+  ConstraintErrorStr = Err;
+  if (val < min || val > max)
+    return (NULL);
+  return (num);
+}
+
+/*ARGSUSED */
+static char *
+MaxDocsCons (char *Old, char *New)
+{
+  if (!STRCASECMP (New, "all"))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (New);
+  return (NumberCmp (New, 1, ((unsigned) (~0)) >> 1));
+}
+
+/*ARGSUSED */
+static char *
+MaxTermsCons (char *Old, char *New)
+{
+  if (!STRCASECMP (New, "all"))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (New);
+  return (NumberCmp (New, 1, ((unsigned) (~0)) >> 1));
+}
+
+/* ARGSUSED */
+static char *
+BufferCons (char *Old, char *New)
+{
+  return (NumberCmp (New, 0, 16 * 1024 * 1024));
+}
+
+/* ARGSUSED */
+static char *
+MaxNodesCons (char *Old, char *New)
+{
+  if (!STRCASECMP (New, "all"))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (New);
+  return (NumberCmp (New, 8, 256 * 1024 * 1024));
+}
+
+/* ARGSUSED */
+static char *
+MaxHashCons (char *Old, char *New)
+{
+  return (NumberCmp (New, 8, 256 * 1024 * 1024));
+}
+
+/* ARGSUSED */
+static char *
+MaxParasCons (char *Old, char *New)
+{
+  return (NumberCmp (New, 1, 256 * 1024 * 1024));
+}
+
+/* ARGSUSED */
+static char *
+MaxHeadsCons (char *Old, char *New)
+{
+  return (NumberCmp (New, 1, 1000));
+}
+
+/* ARGSUSED */
+char *
+OptimiseCons (char *Old, char *New)
+{
+  return (NumberCmp (New, 0, 2));
+}
+
+
+
+/*
+ * Makes sure that New is a valid query type
+ *
+ */
+/* ARGSUSED */
+static char *
+QueryCons (char *Old, char *New)
+{
+  static char *QueryStrs[] =
+  {
+    "boolean", "ranked",
+    "docnums", "approx-ranked"};
+  int i;
+  int new = -1;
+  if (New)
+    for (i = 0; i < sizeof (QueryStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (New, QueryStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  new = i;
+	  break;
+	}
+  if (new >= 0)
+    return (New);
+  ConstraintErrorStr = "Invalid argument [boolean|ranked|docnums|approx-ranked] required";
+  return (NULL);
+}
+
+/*
+ * Makes sure that New is a valid accum type
+ *
+ */
+/* ARGSUSED */
+static char *
+AccumCons (char *Old, char *New)
+{
+  static char *AccumStrs[] =
+  {
+    "array", "splay_tree", "hash_table", "list"};
+  int i;
+  int new = -1;
+  if (New)
+    for (i = 0; i < sizeof (AccumStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (New, AccumStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  new = i;
+	  break;
+	}
+  if (new >= 0)
+    return (New);
+  ConstraintErrorStr = "Invalid argument "
+    "[array|splay_tree|hash_table|list] required";
+  return (NULL);
+}
+
+
+
+/*
+ * Makes sure that New is a valid output type type
+ *
+ */
+/* ARGSUSED */
+static char *
+OutputTypeCons (char *Old, char *New)
+{
+  static char *OutputTypeStrs[] =
+  {"text", "silent", "docnums",
+   "count", "heads", "hilite"
+#ifdef TREC_MODE
+   ,"extras_for_trec"
+#endif
+  };
+
+  int i;
+  int new = -1;
+  if (New)
+    for (i = 0; i < sizeof (OutputTypeStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (New, OutputTypeStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  new = i;
+	  break;
+	}
+  if (new >= 0)
+    return (New);
+  ConstraintErrorStr = "Invalid argument [text|silent|docnums|heads|count|hilite"
+#ifdef TREC_MODE
+    "|extras_for_trec"
+#endif
+    "] required";
+  return (NULL);
+}
+
+/*
+ * Makes sure that New is a valid query type
+ *
+ */
+/* ARGSUSED */
+char *
+HiliteStyleCons (char *Old, char *New)
+{
+  static char *StyleStrs[] =
+  {"bold", "underline"};
+  int i;
+  int new = -1;
+  if (New)
+    for (i = 0; i < sizeof (StyleStrs) / sizeof (char *); i++)
+      if (!STRCASECMP (New, StyleStrs[i]))  /* [RPAP - Feb 97: WIN32 Port] */
+	{
+	  new = i;
+	  break;
+	}
+  if (new >= 0)
+    return (New);
+  ConstraintErrorStr = "Invalid argument [bold|underline] required";
+  return (NULL);
+}
+
+/* =========================================================================
+ * Function: get_output_type
+ * Description:
+ *      Map a mode string onto a mode char e.g. OUTPUT_????
+ * Input:
+ * Output:
+ *      The mode char which is a subrange value.
+ * ========================================================================= */
+
+char
+get_output_type (void)
+{
+  char *env_str = GetDefEnv ("mode", "text");
+  char ch1 = toupper (env_str[0]);
+  char ch2 = toupper (env_str[1]);
+
+  switch (ch1)
+    {
+    case 'T':
+      return OUTPUT_TEXT;
+    case 'S':
+      return OUTPUT_SILENT;
+    case 'E':
+      return OUTPUT_EXTRAS;
+    case 'C':
+      return OUTPUT_COUNT;
+    case 'D':
+      return OUTPUT_DOCNUMS;
+    case 'H':
+      if (ch2 == 'E')
+	return OUTPUT_HEADERS;
+      else
+	return OUTPUT_HILITE;
+    default:
+      FatalError (1, "Problem in output type switch");
+    }
+
+  return '\0';			/*shouldn't reach here -- keep compiler happy */
+}
+
+/* =========================================================================
+ * Function: get_query_type
+ * Description:
+ *      Map a query type string onto a char.
+ * Input:
+ * Output:
+ *      Query type char.
+ * ========================================================================= */
+
+char
+get_query_type (void)
+{
+  char *env_str = GetDefEnv ("query", "boolean");
+  char ch1 = toupper (env_str[0]);
+
+  switch (ch1)
+    {
+    case 'R':
+      return QUERY_RANKED;
+    case 'A':
+      return QUERY_APPROX;
+    case 'B':
+      return QUERY_BOOLEAN;
+    case 'D':
+      return QUERY_DOCNUMS;
+    default:
+      FatalError (1, "Problem in query type switch");
+    }
+
+  return '\0';			/*shouldn't reach here */
+}
+
+
+
+/*
+ * This initialises certain environment variables
+ *
+ */
+void 
+InitEnv (void)
+{
+  SetEnv ("hilite_style", "underline", HiliteStyleCons);	/*[TS:Sep/94] */
+  SetEnv ("briefstats", "off", BooleanCons);
+  SetEnv ("diskstats", "off", BooleanCons);
+  SetEnv ("expert", "false", BooleanCons);
+  SetEnv ("mgdir", getenv ("MGDATA") ? getenv ("MGDATA") : ".", NULL);
+  SetEnv ("mgname", "", NULL);
+  SetEnv ("maxdocs", "all", MaxDocsCons);
+  SetEnv ("memstats", "off", BooleanCons);
+  SetEnv ("mode", "text", OutputTypeCons);
+  SetEnv ("pager", getenv ("PAGER") ? getenv ("PAGER") : "more", NULL);
+  SetEnv ("qfreq", "true", BooleanCons);
+  SetEnv ("query", "boolean", QueryCons);
+  SetEnv ("sizestats", "off", BooleanCons);
+  SetEnv ("timestats", "off", BooleanCons);
+  SetEnv ("verbatim", "off", BooleanCons);
+  SetEnv ("sorted_terms", "on", BooleanCons);
+  SetEnv ("accumulator_method", "array", AccumCons);
+  SetEnv ("stop_at_max_accum", "off", BooleanCons);
+  SetEnv ("buffer", "1048576", BufferCons);
+  SetEnv ("max_accumulators", "50000", MaxNodesCons);
+  SetEnv ("max_terms", "all", MaxTermsCons);
+  SetEnv ("maxparas", "1000", MaxParasCons);
+  SetEnv ("hash_tbl_size", "1000", MaxHashCons);
+  SetEnv ("skip_dump", "skips.%d", NULL);
+  SetEnv ("ranked_doc_sepstr", "---------------------------------- %n %w\\n", NULL);
+  SetEnv ("doc_sepstr", "---------------------------------- %n\\n", NULL);
+  SetEnv ("para_sepstr", "\\n######## PARAGRAPH %n ########\\n", NULL);
+  SetEnv ("para_start", "***** Weight = %w *****\\n", NULL);
+  SetEnv ("terminator", "", NULL);
+  SetEnv ("heads_length", "50", MaxHeadsCons);
+  SetEnv ("optimise_type", "1", OptimiseCons);	/*[TS:Mar/95] */
+  SetEnv ("casefold", "on", BooleanCons);  /* [RPAP - Jan 97: Stem Index Change] */
+  SetEnv ("stem", "on", BooleanCons);  /* [RPAP - Jan 97: Stem Index Change] */
+  SetEnv ("term_freq", "off", BooleanCons);  /* [RPAP - Feb 97: Term Frequency] */
+}
+
+
+void 
+UninitEnv (void)
+{
+  char *name;
+  while (PopEnv () == 0);
+  while ((name = GetEnvName (0)) != 0)
+    UnsetEnv (name, 1);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/environment.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/environment.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/environment.h	(revision 21083)
@@ -0,0 +1,61 @@
+/**************************************************************************
+ *
+ * environment.h -- mgquery environment functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef ENVIRONMENT_H
+#define ENVIRONMENT_H
+
+#define OUTPUT_TEXT     'T'
+#define OUTPUT_HEADERS  'H'
+#define OUTPUT_SILENT   'S'
+#define OUTPUT_EXTRAS   'E'
+#define OUTPUT_HILITE   'I'
+#define OUTPUT_COUNT    'C'
+#define OUTPUT_DOCNUMS  'D'
+
+#define QUERY_RANKED    'R'
+#define QUERY_APPROX    'A'
+#define QUERY_BOOLEAN   'B'
+#define QUERY_DOCNUMS   'D'
+
+
+char get_output_type (void);
+char get_query_type (void);
+
+extern char *ConstraintErrorStr;
+int SetEnv (char *name, char *data, char *(*Constraint) (char *, char *));
+char *GetEnv (char *name);
+char *GetDefEnv (char *name, char *def);
+int UnsetEnv (char *name, int Force);
+char *de_escape_string (char *s);
+int PushEnv (void);
+int PopEnv (void);
+int EnvStackHeight (void);
+char *GetEnvName (int i);
+int BooleanEnv (char *data, int def);
+long IntEnv (char *data, long def);
+
+void InitEnv (void);
+void UninitEnv (void);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/globals.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/globals.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/globals.h	(revision 21083)
@@ -0,0 +1,32 @@
+/**************************************************************************
+ *
+ * globals.h -- Some global stuff for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_GLOBALS
+#define H_GLOBALS
+
+
+extern FILE *OutFile;
+extern FILE *InFile;
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/hash.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/hash.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/hash.h	(revision 21083)
@@ -0,0 +1,44 @@
+/**************************************************************************
+ *
+ * hash.h -- Hash function
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_HASH
+#define H_HASH
+
+
+
+#define HASH(h, step, wd, tablesize)			\
+	do {						\
+		register u_char *p=wd;			\
+		register long len = *p++;		\
+		register unsigned long hval;		\
+		if (len>25) len = 25;			\
+		for (hval=0; len; len--)		\
+		  hval = (hval << 5) - hval + *p++;	\
+		step = hval % (tablesize - 2) + 1;	\
+		h = hval % tablesize;			\
+	} while (0)
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.h	(revision 21083)
@@ -0,0 +1,320 @@
+static char *help_str[] = {
+"\n",
+"			  HELP for mgquery\n",
+"		   ================================\n",
+"\n",
+"The text is a summary of the information in the \"mgquery\" manual pages.\n",
+"\n",
+"The input to 'mgquery' consists of a series of input lines. The backslash\n",
+"character (\"\\\") is used at the end of lines to indicate that input \n",
+"continues on the next line.\n",
+"\n",
+"Input lines on which the first character is a dot (\".\") are commands to\n",
+"the mgquery program. Input lines that do not start with a dot are queries.\n",
+"\n",
+"A query consists of two parts. One part is a boolean or ranked query that\n",
+"identifies documents. The second part is a post-processing pattern matching\n",
+"operation. Any text between the first speech mark (\") and the last speech\n",
+"mark is considered to the a post-processing pattern. \n",
+"\n",
+"\n",
+"The following command are available :-\n",
+"\n",
+"    .help	     - displays this text.\n",
+"    .quit            - quits the program.\n",
+"    .set name value  - sets parameter \"name\" to \"value\" . If the parameter\n",
+"                       is a boolean parameter and value is omitted the\n",
+"	    	       parameter will be inverted (i.e. if it is true it\n",
+"		       will change to false, if it is false it will change\n",
+"		       to true).\n",
+"    .unset name      - deletes parameter \"name\"\n",
+"    .reset           - sets all the parameters to their initial state.\n",
+"    .display         - displays the values of all the current parameters.\n",
+"    .push            - pushes the current parameters on to a stack.\n",
+"    .pop             - destroys the current parameters and pops a new set\n",
+"                       of parameters off the stack.\n",
+"    .output arg      - This is used to specify where to send the documents.\n",
+"                       Arg may one be of the following:\n",
+"		       > filename  : Send output to the specified file.\n",
+"		       >> filename : Append output to the specified file.\n",
+"                       | command   : The output is piped into command, \n",
+"                                     which is executed by sh.\n",
+"    .input arg       - This is used to specify where input comes from.\n",
+"                       Arg may one be of the following:\n",
+"		       < filename  : Get the input from the specified\n",
+"                                     file.\n",
+"                       | command   : The input comes from the standard\n",
+"                                     output of command, which is executed\n",
+"                                     by sh.\n",
+"\n",
+"On startup the mgquery program reads from the file .mgrc a sequence \n",
+"of commands (NOTE: The .mgrc file may not contain any queries). mgquery \n",
+"first looks for .mgrc in the current directory and then in the users home \n",
+"directory. Lines starting with a '#' in the .mgrc file are considered to\n",
+"be comments and are ignored.\n",
+"\n",
+"The following parameters (used in the .set and .unset commands) are \n",
+"predefined and have special significance :-\n",
+"\n",
+"accumulator_method = `array'\n",
+"	This parameter is used during ranking, and specifies how the\n",
+"	weight for each document should be accumulated. The following\n",
+"	methods are available `array', `splay_tree', `hash_table', and\n",
+"	`list'.\n",
+"\n",
+"briefstats = `off'\n",
+"	This is a boolean parameter that determines whether the the\n",
+"	totals for disk, memory and time usage statistics will be \n",
+"	displayed. at the end of each query. \n",
+"	NOTE: this takes precedence over the parameters \"diskstats\",\n",
+"	\"memstats\" and \"timestats\". This parameter may take the values \n",
+"	`yes', `no', `true', `false', `on' or `off'.\n",
+"\n",
+"buffer = `1048576'\n",
+"	When the documents are being read in they are read into a \n",
+"	buffer of this size and then displayed from this buffer. If \n",
+"        the documents are larger than this buffer the buffer is\n",
+"	expanded automatically. Having a large buffer gives a very\n",
+"	slight performance improvement because it allows the order of \n",
+"	disk operations to be optimised. The buffer size is measured\n",
+"	in bytes.\n",
+"\n",
+"diskstats = `off'\n",
+"	This is a boolean parameter that determines whether the disk\n",
+"	usage statistics for the preceding query will be displayed\n",
+"	after each query. This parameter may take the values `yes',\n",
+"	`no', `true', `false', `on' or `off'.\n",
+"\n",
+"doc_sepstr = `---------------------------------- %n\\n'\n",
+"	This specifies the string that will be used to separate \n",
+"	documents when they are displayed for `boolean' or `docnums'\n",
+"	queries. The standard C escape character sequences (see the \n",
+"	man page) may be used to place special characters in the \n",
+"	string. For example, a newline would the `\\n'. To include a `%'\n",
+"	use the sequence `%%'. To include the MG document number use\n",
+"	the sequence `%n'.\n",
+"\n",
+"expert = `false'\n",
+"	If this is true then a lot of the waffle that the program \n",
+"	spits out is suppressed. This parameter may take the values\n",
+"	`yes', `no', `true', `false', `on' or `off'.\n",
+"\n",
+"hash_tbl_size = `1000'\n",
+"	One of the options during ranking queries is to use a hash \n",
+"	table to accumulate the weights for each document. The hash \n",
+"	table is a simple chained type. This parameter specifies the \n",
+"	size of the hash table and may take any value between 8 and\n",
+"	268435456. \n",
+"\n",
+"heads_length = `50'\n",
+"	When the mode is `heads' this specifies the number of \n",
+"	characters that	will be output for each document.\n",
+"\n",
+"maxdocs = `all'\n",
+"	The maximum number of documents to display in response to a\n",
+"	query. This parameter may take on a numeric value between 1 \n",
+"	and 429467295 or the word `all'.\n",
+"\n",
+"maxparas = `1000'\n",
+"	The maximum number of paragraphs to identify during a ranked\n",
+"	query with paragraph indexing. After the paragraphs have been\n",
+"	identified the paragraphs are converted into documents, and \n",
+"	because some of the paragraphs may refer to the same documents \n",
+"	the final number of answers may be less that maxparas. The \n",
+"	maxdocs parameter will then be applied. This parameter may \n",
+"	take on a numeric value between 1 and 429467295.\n",
+"\n",
+"max_accumulators = `50000'\n",
+"	This parameter limits the number of different paragraph/\n",
+"	document numbers to be accumulated during ranked queries when \n",
+"	the parameter `accumulator_method` is set to `splay_tree',\n",
+"	`hash_table', or `list'.  This parameter may take any value \n",
+"	between 8 and 268435456.\n",
+"\n",
+"max_terms = `all'\n",
+"	This parameter limits the number of terms that will actually\n",
+"	be used during a ranked query. If more terms than the number\n",
+"	specified by max_terms are entered, then the extra terms will\n",
+"	be discarded. If `sorted_terms' is on then the limiting will \n",
+"	be done after the terms have been sorted. This parameter may\n",
+"	take any value between 1 and 429467295 or the word `all'.\n",
+"\n",
+"memstats = `off'\n",
+"	This is a boolean parameter that determines whether the memory \n",
+"	usage statistics for the preceding query will be displayed\n",
+"	after each query. This parameter may take the values `yes', \n",
+"	`no', `true', `false', `on' or `off'.\n",
+"\n",
+"mgdir = `.'\n",
+"	This specifies the directory where the MG files may be found.\n",
+"	If the environment variable `MGDATA' is set then `mgdir' is\n",
+"	initialised to the value in `MGDATA'.\n",
+"\n",
+"mgname = `'\n",
+"	This specifies the name of the MG database to process.\n",
+"\n",
+"mode = `text'\n",
+"	This specifies how documents should be displayed when they\n",
+"	are retrieved it may take four different values `text', \n",
+"	`docnums', `silent', `heads' or `count'. `text' displays \n",
+"	the contents of the document. `docnums' displays only the\n",
+"	document numbers. `Silent' retrieves all the documents but\n",
+"	displays nothing except how many documents were retrieved.\n",
+"	This mode is intended to be used in timing experiments. \n",
+"	`Heads` is used to print out the head of each document.\n",
+"	`Count' does the minimum amount of work required to determine\n",
+"	how many documents would be retrieved, but does not retrieve\n",
+"	them.\n",
+"\n",
+"pager = `more'\n",
+"	This is the name of the program that will be used to display\n",
+"	the help and the retrieved documents. If the environment \n",
+"	variable \"PAGER\" is defined then `pager' takes on that value.\n",
+"\n",
+"para_sepstr = `\\n######## PARAGRAPH %n ########\\n'\n",
+"	This specifies the string that will be used to separate \n",
+"	paragraphs. The standard C escape character sequences (see the \n",
+"	man page) may be used to place special characters in the \n",
+"	string. For example, a newline would the `\\n'. To include a `%'\n",
+"	use the sequence `%%'. To include the paragraph number within\n",
+"	the document use the sequence `%n'.\n",
+"\n",
+"para_start = `***** Weight = %w *****\\n'\n",
+"	This specifies the string that will be used at the head of \n",
+"	paragraphs for a paraghaph level index following a ranked query.\n",
+"	The standard C escape character sequences (see the man page)\n",
+"	may be used to place special characters in the string. For \n",
+"	example, a newline would the `\\n'. To include a `%' use the\n",
+"	sequence `%%'. To include the paragraph weight use the \n",
+"	sequence `%w'.\n",
+"\n",
+"qfreq = `true'\n",
+"	This determine whether the ranked queries will take into \n",
+"	account the number of times each query term is specified.\n",
+"	When this is `true' the number of times a term appears in\n",
+"	the query is used in the ranking. When this is `false' all \n",
+"	query term are assumed to occur only once. This parameter\n",
+"	may take the values `yes', `no', `true', `false', `on' or\n",
+"	`off'.\n",
+"\n",
+"query = `boolean'\n",
+"	This specifies the type of queries that are to be specified.\n",
+"	It can take four different values `boolean', `ranked', \n",
+"	`docnums' or `approx-ranked'. \n",
+"\n",
+"	`boolean' is for boolean queries. \n",
+"		The yacc grammar for boolean queries is as follows :-\n",
+"\n",
+"		query   : or;\n",
+" \n",
+"		or      : or '|' and\n",
+"		        | and ;	\n",
+" \n",
+"		and     : and '&' not\n",
+"        		| and not\n",
+"        		| not ;\n",
+"\n",
+"		not     : term\n",
+"		        | '!' not ;\n",
+" \n",
+"		term    : TERM\n",
+"		        | '(' or ')' ;\n",
+" \n",
+"\n",
+"\n",
+"\n",
+"	`ranked' and `approx-ranked' are for queries ranked by the\n",
+"		cosine measure. `approx-ranked' uses only the low\n",
+"		precision document lengths, and therefore only\n",
+"		produces an approximation to full cosine ranking.\n",
+"\n",
+"		query   : TERM\n",
+"      			| query TERM ;\n",
+"	\n",
+"	`docnums' allows the entry of document numbers. Multiple \n",
+"		numbers separated by spaces may be specified\n",
+"		or ranges separated by hyphens.\n",
+"\n",
+"\n",
+"		query   : range\n",
+"			| query range ;\n",
+"\n",
+"\n",
+"		range   : num\n",
+"			| num '-' num ;\n",
+"\n",
+"\n",
+"ranked_doc_sepstr = `---------------------------------- %n %w\\n'\n",
+"	This specifies the string that will be used to separate \n",
+"	documents when they are displayed for `ranked' or \n",
+"	`approx-ranked'	queries. The standard C escape character \n",
+"	sequences (see the man page) may be used to place special\n",
+"	characters in the string. For example, a newline would the\n",
+"	`\\n'. To include a `%' use the sequence `%%'. To include the\n",
+"	MG document number use the sequence `%n'. To include the\n",
+"	document weight use the sequence `%w'.\n",
+"\n",
+"sizestats = `false'\n",
+"	If this is true then various numbers are output at the end\n",
+"	of each query indicating what went on during the query. \n",
+"	This parameter may take the values `yes', `no', `true', \n",
+"	`false', `on' or `off'.\n",
+"\n",
+"skip_dump = `skips.%d'\n",
+"	If this parameter is set then during ranked queries on skipped\n",
+"	inverted files when `accumulator_method' is set to `splay_tree',\n",
+"	`hash_table', or `list` a file will be produced in the current\n",
+"	directory. The name of the file is the value of this parameter,\n",
+"	a `%d' in the file name will be replaced with the process id of\n",
+"	mgquery. This file will contain information about the usage of\n",
+"	skips during the query processing. This option is expensive; \n",
+"	use `.unset skip_dump' to obtain optimal performance.\n",
+"\n",
+"sorted_terms = `on'\n",
+"	This specifies whether of not the terms should be sorted into\n",
+"	decreasing occurrence in documents so that the least often\n",
+"	occurring terms are processed first when ranked queries are\n",
+"	being done. When this is true the terms are sorted. When this\n",
+"	is false the terms are not sorted and are instead processed in\n",
+"	order of occurrence. This parameter may take the values `yes',\n",
+"	`no', `true', `false', `on' or `off'.\n",
+"\n",
+"\n",
+"stop_at_max_accum = `on'\n",
+"	This specifies what should happen when the maximum number of\n",
+"	accumulators set by `max_accumulators' is reached. When this\n",
+"	is true the the processing of terms is stopped at the completion\n",
+"	of the current term. When this is false processing continues but\n",
+"	no new accumulators are created. This parameter may take the \n",
+"	values `yes', `no', `true', `false', `on' or `off'.\n",
+"\n",
+"terminator = `'\n",
+"	This specifies the string that will be output after the	last\n",
+"	document from the previous query has been output. The standard\n",
+"	C escape character sequences (see the man page) may be used to\n",
+"	place special characters in the string. For example, a newline\n",
+"	would the `\\n'. To include a `%' use the sequence `%%'.\n",
+"	\n",
+"\n",
+"timestats = `false'\n",
+"	If this is true then the time to process a query is displayed\n",
+"	in both real time and CPU time. This parameter may take the\n",
+"	values `yes', `no', `true', `false', `on' or `off'.\n",
+"\n",
+"verbatim = `off'\n",
+"	This is a boolean parameter that determines whether the program\n",
+"	should attempt to do a regular expression match on the retrieved\n",
+"	text. If verbatim is `on' and a post-processing strng is specified\n",
+"	with the query then the post-processing string will be searched for\n",
+"	in the documents just before they are displayed. If the string is\n",
+"	found the document will be displayed, if not the document will not\n",
+"	be displayed. If verbatim is `off' the post-processing string will\n",
+"	be considered a regular expression like in `vi' or `egrep'.\n",
+"	E.G. If verbatim is `on', \"and.*the\" will look for the 8 character\n",
+"	     sequence \"and.*the\". If verbatim is `off', \"and.*the\" will\n",
+"	     look for the sequence \"and\" followed somewhere later in the\n",
+"	     document by the sequence \"the\".\n",
+"	This parameter may take the values `yes', `no', `true', `false',\n",
+"	`on' or `off'.\n",
+"\n",
+"\n"};
Index: /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.src
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.src	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/help.mg.src	(revision 21083)
@@ -0,0 +1,347 @@
+###########################################################################
+#
+# help.mg.src -- Source for the help command
+# Copyright (C) 1994  Neil Sharman
+#
+# 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.
+#
+#       @(#)help.mg.src	1.8 21 Mar 1994
+#
+###########################################################################
+#
+# The help file for mgquery.  
+# Lines starting with '#' are treated as comments and are discarded when
+# the 'help.mg.h' file is produced
+#
+###########################################################################
+
+			  HELP for mgquery
+		   ================================
+
+The text is a summary of the information in the "mgquery" manual pages.
+
+The input to 'mgquery' consists of a series of input lines. The backslash
+character ("\") is used at the end of lines to indicate that input 
+continues on the next line.
+
+Input lines on which the first character is a dot (".") are commands to
+the mgquery program. Input lines that do not start with a dot are queries.
+
+A query consists of two parts. One part is a boolean or ranked query that
+identifies documents. The second part is a post-processing pattern matching
+operation. Any text between the first speech mark (") and the last speech
+mark is considered to the a post-processing pattern. 
+
+
+The following command are available :-
+
+    .help	     - displays this text.
+    .quit            - quits the program.
+    .set name value  - sets parameter "name" to "value" . If the parameter
+                       is a boolean parameter and value is omitted the
+	    	       parameter will be inverted (i.e. if it is true it
+		       will change to false, if it is false it will change
+		       to true).
+    .unset name      - deletes parameter "name"
+    .reset           - sets all the parameters to their initial state.
+    .display         - displays the values of all the current parameters.
+    .push            - pushes the current parameters on to a stack.
+    .pop             - destroys the current parameters and pops a new set
+                       of parameters off the stack.
+    .output arg      - This is used to specify where to send the documents.
+                       Arg may one be of the following:
+		       > filename  : Send output to the specified file.
+		       >> filename : Append output to the specified file.
+                       | command   : The output is piped into command, 
+                                     which is executed by sh.
+    .input arg       - This is used to specify where input comes from.
+                       Arg may one be of the following:
+		       < filename  : Get the input from the specified
+                                     file.
+                       | command   : The input comes from the standard
+                                     output of command, which is executed
+                                     by sh.
+
+On startup the mgquery program reads from the file .mgrc a sequence 
+of commands (NOTE: The .mgrc file may not contain any queries). mgquery 
+first looks for .mgrc in the current directory and then in the users home 
+directory. Lines starting with a '#' in the .mgrc file are considered to
+be comments and are ignored.
+
+The following parameters (used in the .set and .unset commands) are 
+predefined and have special significance :-
+
+accumulator_method = `array'
+	This parameter is used during ranking, and specifies how the
+	weight for each document should be accumulated. The following
+	methods are available `array', `splay_tree', `hash_table', and
+	`list'.
+
+briefstats = `off'
+	This is a boolean parameter that determines whether the the
+	totals for disk, memory and time usage statistics will be 
+	displayed. at the end of each query. 
+	NOTE: this takes precedence over the parameters "diskstats",
+	"memstats" and "timestats". This parameter may take the values 
+	`yes', `no', `true', `false', `on' or `off'.
+
+buffer = `1048576'
+	When the documents are being read in they are read into a 
+	buffer of this size and then displayed from this buffer. If 
+        the documents are larger than this buffer the buffer is
+	expanded automatically. Having a large buffer gives a very
+	slight performance improvement because it allows the order of 
+	disk operations to be optimised. The buffer size is measured
+	in bytes.
+
+diskstats = `off'
+	This is a boolean parameter that determines whether the disk
+	usage statistics for the preceding query will be displayed
+	after each query. This parameter may take the values `yes',
+	`no', `true', `false', `on' or `off'.
+
+doc_sepstr = `---------------------------------- %n\n'
+	This specifies the string that will be used to separate 
+	documents when they are displayed for `boolean' or `docnums'
+	queries. The standard C escape character sequences (see the 
+	man page) may be used to place special characters in the 
+	string. For example, a newline would the `\n'. To include a `%'
+	use the sequence `%%'. To include the MG document number use
+	the sequence `%n'.
+
+expert = `false'
+	If this is true then a lot of the waffle that the program 
+	spits out is suppressed. This parameter may take the values
+	`yes', `no', `true', `false', `on' or `off'.
+
+hash_tbl_size = `1000'
+	One of the options during ranking queries is to use a hash 
+	table to accumulate the weights for each document. The hash 
+	table is a simple chained type. This parameter specifies the 
+	size of the hash table and may take any value between 8 and
+	268435456. 
+
+heads_length = `50'
+	When the mode is `heads' this specifies the number of 
+	characters that	will be output for each document.
+
+maxdocs = `all'
+	The maximum number of documents to display in response to a
+	query. This parameter may take on a numeric value between 1 
+	and 429467295 or the word `all'.
+
+maxparas = `1000'
+	The maximum number of paragraphs to identify during a ranked
+	query with paragraph indexing. After the paragraphs have been
+	identified the paragraphs are converted into documents, and 
+	because some of the paragraphs may refer to the same documents 
+	the final number of answers may be less that maxparas. The 
+	maxdocs parameter will then be applied. This parameter may 
+	take on a numeric value between 1 and 429467295.
+
+max_accumulators = `50000'
+	This parameter limits the number of different paragraph/
+	document numbers to be accumulated during ranked queries when 
+	the parameter `accumulator_method` is set to `splay_tree',
+	`hash_table', or `list'.  This parameter may take any value 
+	between 8 and 268435456.
+
+max_terms = `all'
+	This parameter limits the number of terms that will actually
+	be used during a ranked query. If more terms than the number
+	specified by max_terms are entered, then the extra terms will
+	be discarded. If `sorted_terms' is on then the limiting will 
+	be done after the terms have been sorted. This parameter may
+	take any value between 1 and 429467295 or the word `all'.
+
+memstats = `off'
+	This is a boolean parameter that determines whether the memory 
+	usage statistics for the preceding query will be displayed
+	after each query. This parameter may take the values `yes', 
+	`no', `true', `false', `on' or `off'.
+
+mgdir = `.'
+	This specifies the directory where the MG files may be found.
+	If the environment variable `MGDATA' is set then `mgdir' is
+	initialised to the value in `MGDATA'.
+
+mgname = `'
+	This specifies the name of the MG database to process.
+
+mode = `text'
+	This specifies how documents should be displayed when they
+	are retrieved it may take four different values `text', 
+	`docnums', `silent', `heads' or `count'. `text' displays 
+	the contents of the document. `docnums' displays only the
+	document numbers. `Silent' retrieves all the documents but
+	displays nothing except how many documents were retrieved.
+	This mode is intended to be used in timing experiments. 
+	`Heads` is used to print out the head of each document.
+	`Count' does the minimum amount of work required to determine
+	how many documents would be retrieved, but does not retrieve
+	them.
+
+pager = `more'
+	This is the name of the program that will be used to display
+	the help and the retrieved documents. If the environment 
+	variable "PAGER" is defined then `pager' takes on that value.
+
+para_sepstr = `\n######## PARAGRAPH %n ########\n'
+	This specifies the string that will be used to separate 
+	paragraphs. The standard C escape character sequences (see the 
+	man page) may be used to place special characters in the 
+	string. For example, a newline would the `\n'. To include a `%'
+	use the sequence `%%'. To include the paragraph number within
+	the document use the sequence `%n'.
+
+para_start = `***** Weight = %w *****\n'
+	This specifies the string that will be used at the head of 
+	paragraphs for a paraghaph level index following a ranked query.
+	The standard C escape character sequences (see the man page)
+	may be used to place special characters in the string. For 
+	example, a newline would the `\n'. To include a `%' use the
+	sequence `%%'. To include the paragraph weight use the 
+	sequence `%w'.
+
+qfreq = `true'
+	This determine whether the ranked queries will take into 
+	account the number of times each query term is specified.
+	When this is `true' the number of times a term appears in
+	the query is used in the ranking. When this is `false' all 
+	query term are assumed to occur only once. This parameter
+	may take the values `yes', `no', `true', `false', `on' or
+	`off'.
+
+query = `boolean'
+	This specifies the type of queries that are to be specified.
+	It can take four different values `boolean', `ranked', 
+	`docnums' or `approx-ranked'. 
+
+	`boolean' is for boolean queries. 
+		The yacc grammar for boolean queries is as follows :-
+
+		query   : or;
+ 
+		or      : or '|' and
+		        | and ;	
+ 
+		and     : and '&' not
+        		| and not
+        		| not ;
+
+		not     : term
+		        | '!' not ;
+ 
+		term    : TERM
+		        | '(' or ')' ;
+ 
+
+
+
+	`ranked' and `approx-ranked' are for queries ranked by the
+		cosine measure. `approx-ranked' uses only the low
+		precision document lengths, and therefore only
+		produces an approximation to full cosine ranking.
+
+		query   : TERM
+      			| query TERM ;
+	
+	`docnums' allows the entry of document numbers. Multiple 
+		numbers separated by spaces may be specified
+		or ranges separated by hyphens.
+
+
+		query   : range
+			| query range ;
+
+
+		range   : num
+			| num '-' num ;
+
+
+ranked_doc_sepstr = `---------------------------------- %n %w\n'
+	This specifies the string that will be used to separate 
+	documents when they are displayed for `ranked' or 
+	`approx-ranked'	queries. The standard C escape character 
+	sequences (see the man page) may be used to place special
+	characters in the string. For example, a newline would the
+	`\n'. To include a `%' use the sequence `%%'. To include the
+	MG document number use the sequence `%n'. To include the
+	document weight use the sequence `%w'.
+
+sizestats = `false'
+	If this is true then various numbers are output at the end
+	of each query indicating what went on during the query. 
+	This parameter may take the values `yes', `no', `true', 
+	`false', `on' or `off'.
+
+skip_dump = `skips.%d'
+	If this parameter is set then during ranked queries on skipped
+	inverted files when `accumulator_method' is set to `splay_tree',
+	`hash_table', or `list` a file will be produced in the current
+	directory. The name of the file is the value of this parameter,
+	a `%d' in the file name will be replaced with the process id of
+	mgquery. This file will contain information about the usage of
+	skips during the query processing. This option is expensive; 
+	use `.unset skip_dump' to obtain optimal performance.
+
+sorted_terms = `on'
+	This specifies whether of not the terms should be sorted into
+	decreasing occurrence in documents so that the least often
+	occurring terms are processed first when ranked queries are
+	being done. When this is true the terms are sorted. When this
+	is false the terms are not sorted and are instead processed in
+	order of occurrence. This parameter may take the values `yes',
+	`no', `true', `false', `on' or `off'.
+
+
+stop_at_max_accum = `on'
+	This specifies what should happen when the maximum number of
+	accumulators set by `max_accumulators' is reached. When this
+	is true the the processing of terms is stopped at the completion
+	of the current term. When this is false processing continues but
+	no new accumulators are created. This parameter may take the 
+	values `yes', `no', `true', `false', `on' or `off'.
+
+terminator = `'
+	This specifies the string that will be output after the	last
+	document from the previous query has been output. The standard
+	C escape character sequences (see the man page) may be used to
+	place special characters in the string. For example, a newline
+	would the `\n'. To include a `%' use the sequence `%%'.
+	
+
+timestats = `false'
+	If this is true then the time to process a query is displayed
+	in both real time and CPU time. This parameter may take the
+	values `yes', `no', `true', `false', `on' or `off'.
+
+verbatim = `off'
+	This is a boolean parameter that determines whether the program
+	should attempt to do a regular expression match on the retrieved
+	text. If verbatim is `on' and a post-processing strng is specified
+	with the query then the post-processing string will be searched for
+	in the documents just before they are displayed. If the string is
+	found the document will be displayed, if not the document will not
+	be displayed. If verbatim is `off' the post-processing string will
+	be considered a regular expression like in `vi' or `egrep'.
+	E.G. If verbatim is `on', "and.*the" will look for the 8 character
+	     sequence "and.*the". If verbatim is `off', "and.*the" will
+	     look for the sequence "and" followed somewhere later in the
+	     document by the sequence "the".
+	This parameter may take the values `yes', `no', `true', `false',
+	`on' or `off'.
+
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/invf.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/invf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/invf.h	(revision 21083)
@@ -0,0 +1,79 @@
+/**************************************************************************
+ *
+ * invf.h -- Data structures for inverted files
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+
+#ifndef H_INVF
+#define H_INVF
+
+/* NOTE: This does not include the magic number */
+struct invf_dict_header
+  {
+    unsigned long lookback;
+    unsigned long dict_size;
+    unsigned long total_bytes;
+    unsigned long index_string_bytes;
+    double input_bytes; /* [RJM 07/97: 4G limit] */
+    unsigned long num_of_docs;
+    unsigned long static_num_of_docs;
+    unsigned long num_of_words;
+    unsigned long stemmer_num;
+    unsigned long stem_method;
+  };
+
+struct stem_dict_header
+  {
+    unsigned long lookback;
+    unsigned long block_size;
+    unsigned long num_blocks;
+    unsigned long blocks_start;
+    unsigned long index_chars;
+    unsigned long num_of_docs;
+    unsigned long static_num_of_docs;
+    unsigned long num_of_words;
+    unsigned long stemmer_num;
+    unsigned long stem_method;
+    unsigned long indexed;       /* [RPAP - Jan 97: Stem Index Change] */
+  };
+
+struct invf_file_header
+  {
+    unsigned long no_of_words;
+    unsigned long no_of_ptrs;
+    unsigned long skip_mode;
+    unsigned long params[16];
+    unsigned long InvfLevel;
+  };
+
+/* [RPAP - Jan 97: Stem Index Change] */
+struct stem_idx_header
+  {
+    unsigned long lookback;
+    unsigned long block_size;
+    unsigned long num_blocks;
+    unsigned long blocks_start;
+    unsigned long index_chars;
+    unsigned long num_of_words;
+  };
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.c	(revision 21083)
@@ -0,0 +1,1666 @@
+/**************************************************************************
+ *
+ * invf_get.c -- Inverted file reading routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "filestats.h"
+#include "timing.h"
+#include "bitio_gen.h"
+#include "bitio_m_mem.h"
+#include "bitio_m.h"
+#include "sptree.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "invf_get.h"
+#include "mg_errors.h"
+
+#define SKIPPING
+#define SHORT_CUT
+
+struct pool
+  {
+    int length, pos;
+    struct pool *next;
+    Invf_Doc_Entry ide[1];
+  };
+
+static int skip_header = 0;
+
+static char skip_header_text0[] =
+"#######################################################################\n"
+"#\n"
+"# 1\tWord number.\n"
+"# 2\tNumber of time the word occurs in the collection.\n"
+"# 3\tNumber of documents the word occurs in.\n"
+"# 4\tThe word.\n"
+"# 5\tNumber of docnum/word_count entries decoded.\n"
+"# 6\tNumber of hits.\n"
+"# 7\tNumber of entries in the splay tree or hash table.\n"
+"# 8\tAmount added to the accumulators while while processing this word.\n"
+"#\n"
+"#######################################################################\n";
+
+static char skip_header_text1[] =
+"#######################################################################\n"
+"#\n"
+"# 1\tWord number.\n"
+"# 2\tNumber of time the word occurs in the collection.\n"
+"# 3\tNumber of documents the word occurs in.\n"
+"# 4\tThe word.\n"
+"# 5\tNumber of skips taken in evaluating the inverted file entry.\n"
+"# 6\tNumber of docnum/word_count entries decoded.\n"
+"# 7\tNumber of hits.\n"
+"# 8\tNumber of entries in the splay tree or hash table.\n"
+"# 9\tAmount added to the accumulators while while processing this word.\n"
+"#\n"
+"#######################################################################\n";
+
+
+static char skip_header_text2[] =
+"#######################################################################\n"
+"#\n"
+"#  1\tWord number.\n"
+"#  2\tNumber of time the word occurs in the collection.\n"
+"#  3\tNumber of documents the word occurs in.\n"
+"#  4\tThe word.\n"
+"#  5\tSkip size.\n"
+"#  6\tNumber of skips taken in evaluating the inverted file entry.\n"
+"#  7\tNumber of docnum/word_count entries decoded.\n"
+"#  8\tNumber of hits.\n"
+"#  9\tNumber of entries in the splay tree or hash table.\n"
+"# 10\tAmount added to the accumulators while while processing this word.\n"
+"#\n"
+"#######################################################################\n";
+
+static char *skip_header_text[] =
+{skip_header_text0,
+ skip_header_text1,
+ skip_header_text2};
+
+
+
+
+
+
+
+
+/**************************************************************************
+ *
+ * Code for the hash table.
+ *
+ */
+
+static Hash_Table *
+HT_create (query_data * qd, unsigned max_entries,
+	   unsigned max_size)
+{
+  unsigned es, hts;
+  Hash_Table *HT;
+  if (max_entries == 0)
+    max_entries = 8192;
+  es = sizeof (Hash_Table) + sizeof (Invf_Doc_EntryH) * (max_entries - 1);
+  hts = sizeof (Invf_Doc_EntryH *) * max_size;
+
+  HT = Xmalloc (es);
+  if (!HT)
+    return NULL;
+
+  HT->HashTable = Xmalloc (hts);
+  if (!(HT->HashTable))
+    {
+      Xfree (HT);
+      return NULL;
+    }
+
+  ChangeMemInUse (qd, es + hts);
+  bzero ((char *) (HT->HashTable), hts);
+  HT->max = max_entries;
+  HT->num = 0;
+  HT->Suplimentary_Entries = NULL;
+  HT->Suplimentary_Size = 0;
+  HT->Suplimentary_Num = 0;
+  HT->Head = NULL;
+  HT->size = max_size;
+  return HT;
+}
+
+
+static void 
+HT_Sup_create (query_data * qd, Hash_Table * HT, unsigned max_size)
+{
+  int es = sizeof (Invf_Doc_EntryH) * max_size;
+  HT->Suplimentary_Entries = Xmalloc (es);
+  if (!HT->Suplimentary_Entries)
+    return;
+  HT->Suplimentary_Size = max_size;
+  HT->Suplimentary_Num = 0;
+  ChangeMemInUse (qd, es);
+}
+
+static void 
+HT_Sup_Add (Hash_Table * HT, unsigned long DN, float Sum)
+{
+  Invf_Doc_EntryH *IDEH;
+  IDEH = &HT->Suplimentary_Entries[HT->Suplimentary_Num++];
+  IDEH->next = NULL;
+  IDEH->IDE.DocNum = DN;
+  IDEH->IDE.Sum = Sum;
+}
+
+Invf_Doc_Entry *
+HT_find (Hash_Table * HT, unsigned long DN)
+{
+  Invf_Doc_EntryH *IDEH;
+  if (!HT->HashTable)
+    FatalError (1, "Accessing the hash_table through HT_find after HT_sort");
+  IDEH = HT->HashTable[DN % HT->size];
+  while (IDEH)
+    {
+      if (IDEH->IDE.DocNum == DN)
+	return &(IDEH->IDE);
+      IDEH = IDEH->next;
+    }
+  return NULL;
+}
+
+
+static int 
+HT_insert (Hash_Table * HT,
+	   unsigned long DN, float Sum)
+{
+  Invf_Doc_EntryH **IDEH;
+  if (HT->num == HT->max)
+    return 0;
+  IDEH = &(HT->HashTable[DN % HT->size]);
+  while (*IDEH)
+    IDEH = &((*IDEH)->next);
+  *IDEH = &(HT->IDEH[HT->num++]);
+  (*IDEH)->next = NULL;
+  (*IDEH)->IDE.DocNum = DN;
+  (*IDEH)->IDE.Sum = Sum;
+  return 1;
+}
+
+
+void 
+HT_free (query_data * qd, Hash_Table * HT)
+{
+  unsigned es;
+  es = sizeof (Hash_Table) + sizeof (Invf_Doc_EntryH) * HT->max +
+    sizeof (Invf_Doc_EntryH *) * HT->size;
+  if (HT->HashTable)
+    Xfree (HT->HashTable);
+  if (HT->Suplimentary_Entries)
+    {
+      Xfree (HT->Suplimentary_Entries);
+      es += sizeof (Invf_Doc_EntryH) * HT->Suplimentary_Size;
+    }
+  Xfree (HT);
+  ChangeMemInUse (qd, -es);
+}
+
+
+static int 
+IDEH_comp (const void *a, const void *b)
+{
+  const Invf_Doc_EntryH *A = a;
+  const Invf_Doc_EntryH *B = b;
+  return A->IDE.DocNum - B->IDE.DocNum;
+}
+
+static void 
+HT_sort (query_data * qd, Hash_Table * HT)
+{
+  int i;
+  Invf_Doc_EntryH *l, *r, **b;
+  unsigned es = sizeof (Invf_Doc_EntryH *) * HT->size;
+  if (HT->HashTable)
+    Xfree (HT->HashTable);
+  HT->size = 0;
+  HT->HashTable = NULL;
+  ChangeMemInUse (qd, -es);
+
+  qsort (HT->IDEH, HT->num, sizeof (Invf_Doc_EntryH), IDEH_comp);
+
+  for (i = 0; i < HT->num - 1; i++)
+    HT->IDEH[i].next = &HT->IDEH[i + 1];
+  HT->IDEH[i].next = NULL;
+  l = HT->IDEH;
+
+  if (HT->Suplimentary_Entries)
+    {
+      for (i = 0; i < HT->Suplimentary_Num - 1; i++)
+	HT->Suplimentary_Entries[i].next = &HT->Suplimentary_Entries[i + 1];
+      HT->Suplimentary_Entries[i].next = NULL;
+    }
+  r = HT->Suplimentary_Entries;
+
+  b = &HT->Head;
+
+  while (l || r)
+    {
+      if (r && (!l || (l->IDE.DocNum > r->IDE.DocNum)))
+	{
+	  *b = r;
+	  b = &r->next;
+	  r = *b;
+	}
+      else
+	{
+	  *b = l;
+	  b = &l->next;
+	  l = *b;
+	}
+    }
+  *b = NULL;
+}
+
+
+
+
+
+
+/**************************************************************************
+ *
+ * Code for the hash table.
+ *
+ */
+
+static List_Table *
+LT_create (query_data * qd, unsigned max_entries)
+{
+  unsigned es;
+  List_Table *LT;
+  if (max_entries == 0)
+    max_entries = 8192;
+  es = sizeof (List_Table) + sizeof (Invf_Doc_Entry) * (max_entries - 1);
+
+  LT = Xmalloc (es);
+  if (!LT)
+    return NULL;
+
+  ChangeMemInUse (qd, es);
+  LT->max = max_entries;
+  LT->num = 0;
+  return LT;
+}
+
+
+
+Invf_Doc_Entry *
+LT_find (List_Table * LT, unsigned long DN)
+{
+  int l = 0;
+  int r = LT->num - 1;
+  int m, c;
+  while (l <= r)
+    {
+      m = (l + r) / 2;
+      c = DN - LT->IDE[m].DocNum;
+      if (c < 0)
+	r = m - 1;
+      else if (c > 0)
+	l = m + 1;
+      else
+	return &LT->IDE[m];
+    }
+  return NULL;
+}
+
+static List_Table *
+LT_add (query_data * qd, List_Table * LT,
+	unsigned long DN, float Sum)
+{
+  Invf_Doc_Entry *ide;
+
+  /* increase the size of the list if there is not enough */
+  /* room for this entry */
+  if (LT->num == LT->max)
+    {
+      int old, new, max_entries;
+      old = sizeof (List_Table) + sizeof (Invf_Doc_Entry) * LT->max;
+      max_entries = LT->max + (LT->max >> 1);
+      new = sizeof (List_Table) + sizeof (Invf_Doc_Entry) * max_entries;
+
+      LT = Xrealloc (LT, new);
+      if (!LT)
+	return NULL;
+
+      ChangeMemInUse (qd, new - old);
+      LT->max = max_entries;
+    }
+
+  /* add the entry to the end of the list */
+  ide = &LT->IDE[LT->num];
+  ide->DocNum = DN;
+  ide->Sum = Sum;
+  LT->num++;
+
+  return LT;
+}
+
+
+void 
+LT_free (query_data * qd, List_Table * LT)
+{
+  unsigned es;
+  es = sizeof (List_Table) + sizeof (Invf_Doc_Entry) * LT->max;
+  Xfree (LT);
+  ChangeMemInUse (qd, -es);
+}
+
+
+static int 
+IDE_comp (const void *a, const void *b)
+{
+  const Invf_Doc_Entry *A = a;
+  const Invf_Doc_Entry *B = b;
+  return A->DocNum - B->DocNum;
+}
+
+static void 
+LT_sort (List_Table * LT)
+{
+  qsort (LT->IDE, LT->num, sizeof (Invf_Doc_Entry), IDE_comp);
+}
+
+
+/* [RJM 07/97: Ranked Required Terms] */
+/* accumulators with a sum less than or equal to 0.0 are to be deleted */
+static void 
+LT_pack (List_Table * LT)
+{
+  int s, d = 0;
+  for (s = 0; s < LT->num; s++) {
+      if (LT->IDE[s].Sum <= 0.0) {
+	/* ignore this accumulator */
+
+      } else if (d > 0 && LT->IDE[s].DocNum == LT->IDE[d-1].DocNum) {
+	LT->IDE[d-1].Sum += LT->IDE[s].Sum;
+
+      } else {
+	if (d != s) LT->IDE[d] = LT->IDE[s];
+	d++;
+      }
+  }
+
+  if (LT->num) LT->num = d;
+}
+
+
+/**************************************************************************/
+
+
+
+invf_data *
+InitInvfFile (File * InvfFile, stemmed_dict * sd)
+{
+  invf_data *id;
+  if (!(id = Xmalloc (sizeof (invf_data))))
+    {
+      mg_errno = MG_NOMEM;
+      return NULL;
+    }
+
+  id->InvfFile = InvfFile;
+
+  Fread (&id->ifh, sizeof (id->ifh), 1, InvfFile);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  {
+    int i;
+    
+    NTOHUL(id->ifh.no_of_words);
+    NTOHUL(id->ifh.no_of_ptrs);
+    NTOHUL(id->ifh.skip_mode);
+    for (i = 0; i < 16; i++)
+      NTOHUL(id->ifh.params[i]);
+    NTOHUL(id->ifh.InvfLevel);
+  }
+
+  id->N = sd->sdh.num_of_docs;
+  id->Nstatic = sd->sdh.static_num_of_docs;
+
+  return (id);
+}
+
+
+void 
+FreeInvfData (invf_data * id)
+{
+  Xfree (id);
+}
+
+/****************************************************************************/
+
+
+static void 
+CalcBlks (query_data * qd, WordEntry * we, int *blk,
+	  int *dn_blk, int *len_blk, int *k, int *p)
+{
+  *p = we->doc_count;
+
+  *blk = BIO_Bblock_Init (qd->id->Nstatic, *p);
+  switch (qd->id->ifh.skip_mode)
+    {
+    case 1:
+      {
+	unsigned long len;
+	if (*p <= qd->id->ifh.params[0])
+	  *k = 0;
+	else
+	  {
+	    *k = qd->id->ifh.params[0];
+	    len = BIO_Bblock_Bound (qd->id->N, *p);
+	    if (qd->id->ifh.InvfLevel >= 2)
+	      len += we->count;
+	    *dn_blk = BIO_Bblock_Init (qd->sd->sdh.num_of_docs, (*p + *k - 1) / *k);
+	    *len_blk = BIO_Bblock_Init (len, (*p + *k - 1) / *k);
+	  }
+	break;
+      }
+    case 2:
+      {
+	unsigned long len;
+	if (*p <= qd->id->ifh.params[1])
+	  *k = 0;
+	else
+	  {
+	    *k = (int) (2 * sqrt (((double) (*p)) / qd->id->ifh.params[0]));
+	    if (*k <= qd->id->ifh.params[1])
+	      *k = qd->id->ifh.params[1];
+	    len = BIO_Bblock_Bound (qd->id->N, *p);
+	    if (qd->id->ifh.InvfLevel >= 2)
+	      len += we->count;
+	    *dn_blk = BIO_Bblock_Init (qd->sd->sdh.num_of_docs,
+				       (*p + *k - 1) / *k);
+	    *len_blk = BIO_Bblock_Init (len, (*p + *k - 1) / *k);
+	  }
+	break;
+      }
+    default:
+      *k = 0;
+    }
+}
+
+
+/* =========================================================================
+ * Function: GetDocsOp
+ * Description: 
+ *      if op == op_term then 
+ *        look up term in invf and decode all its entries/documents
+ *      if op == op_and_terms then 
+ *        go thru L, testing if it exists in invf using skips  
+ *        if it does exist then overwrite the entry nearer the start of the list
+ *      if op == op_and_or_terms then
+ *        go thru L, testing if it exists in invf using skips  
+ *        BUT only mark ones which are found - keep list intact
+ *      if op == op_diff_terms then     >>>> NOT tested <<<<
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+DocList *
+GetDocsOp (query_data * qd, WordEntry * we, Op_types op, DocList * L)
+{
+  u_char *buffer;
+  DocEntry *src = NULL, *dest = NULL;
+  int i;			/* index counter into inverted list */
+  unsigned long pos;
+  int next_start, next_doc_num, next_i;
+  int block_counter;		/* within counter in block */
+  int dn_blk = 0, len_blk = 0;
+  int skip_size, have_skipping;
+  int blk;			/* bblock control parameter */
+  int ft;			/* The number of documents the word occurs in */
+  unsigned long CurrDoc = 0;	/* NOTE: Document numbers start at 1 */
+  float Weight;
+
+  /* ... AND empty */
+  if (op == op_and_terms && (!L || !L->num))
+    {
+      if (L)
+	Xfree (L);
+      return MakeDocList (0);
+    }
+
+  if (op == op_term)
+    L = MakeDocList (we->doc_count);
+
+  CalcBlks (qd, we, &blk, &dn_blk, &len_blk, &skip_size, &ft);
+  have_skipping = (skip_size != 0);
+  if (!(buffer = Xmalloc (we->invf_len)))
+    return MakeDocList (0);
+
+  ChangeMemInUse (qd, we->invf_len);
+
+  qd->num_of_terms++;
+
+  /* --- Read an inverted file entry for the given word --- */
+  Fseek (qd->File_invf, we->invf_ptr, 0);
+  Fread (buffer, sizeof (char), we->invf_len, qd->File_invf);
+
+  /* Read from the buffer */
+  DECODE_START (buffer, we->invf_len);
+
+  Weight = qd->sd->sdh.num_of_words / (100 * log2 ((float) we->count + 1));
+
+  if (op != op_term)
+    dest = src = L->DE;
+  i = pos = 0;
+  next_i = next_start = next_doc_num = 0;
+  block_counter = skip_size - 1;
+
+  /* Go thru the elements of an inverted list for a term */
+  /* May not go sequentially if skipping is done */
+  while (i < ft && ((op == op_term) || src - L->DE < L->num))
+    {
+      unsigned long diff, Temp;
+
+      if (have_skipping)
+	{
+
+	  /* --- Skip to next block --- */
+	  if (op != op_term && i + skip_size < ft &&
+	      src->DocNum > next_doc_num && next_doc_num >= 0)
+	    {
+	    ShortCut:
+	      i = next_i;
+	      DECODE_SEEK (next_start);
+	      pos = next_start;
+	      CurrDoc = next_doc_num;
+	      qd->hops_taken++;
+	      block_counter = skip_size - 1;
+	    }
+
+	  /* --- Decode the skip block header --- */
+	  if (block_counter == skip_size - 1)
+	    {
+	      if (i + skip_size < ft)
+		{
+		  /* --- Decode the skip block header --- */
+		  int doc_diff, pos_diff;
+		  BBLOCK_DECODE_L (doc_diff, dn_blk, pos);
+		  next_doc_num += doc_diff;
+		  next_i += skip_size;
+		  BBLOCK_DECODE_L (pos_diff, len_blk, pos);
+		  next_start = pos + pos_diff;
+		}
+	      else
+		next_doc_num = -1;
+	    }
+
+	  /* --- Do a skip if c-set doc is higher than block header doc --- */
+	  if (op != op_term && i + skip_size < ft &&
+	      src->DocNum > next_doc_num && next_doc_num >= 0)
+	    goto ShortCut;
+
+
+	}			/*if skipping */
+
+      /* --- increment CurrDoc --- */
+      if (have_skipping && block_counter == 0 && i != ft - 1)
+	CurrDoc = next_doc_num;
+      else
+	{
+	  BBLOCK_DECODE_L (diff, blk, pos);
+	  CurrDoc += diff;
+	}
+
+      /* --- If have f_dt's then eat them up --- */
+      if (qd->id->ifh.InvfLevel >= 2)
+	GAMMA_DECODE_L (Temp, pos);	/* discard word count */
+
+      /* --- Increment counters --- */
+      qd->num_of_ptrs++;
+      i++;
+      block_counter--;
+      if (block_counter < 0)	/* ??? Why would this happen ? */
+	block_counter = skip_size - 1;
+
+      switch (op)
+	{
+	case op_term:
+	  /* --- Add the doc from invf onto the c-set list --- */
+	  L->DE[L->num].DocNum = CurrDoc;
+	  L->DE[L->num].Weight = Weight;
+	  L->DE[L->num].SeekPos = 0;
+	  L->DE[L->num].Len = 0;
+	  L->DE[L->num].CompTextBuffer = NULL;
+	  L->DE[L->num].Next = NULL;
+	  L->DE[L->num].or_included = 0;
+	  L->num++;
+	  break;
+
+	case op_and_terms:
+	case op_and_or_terms:
+	  /* --- see if have a match and save it --- */
+
+	  while (src < (L->DE + L->num) && CurrDoc > src->DocNum)
+	    {
+	      src++;
+	    }
+	  /* Unless at end of list, assert(CurrDoc <= src->DocNum) */
+
+	  /* --- Accept the doc as a candidate --- */
+	  if (src < (L->DE + L->num) && CurrDoc == src->DocNum)
+	    {
+	      if (op == op_and_terms)
+		{
+		  *dest++ = *src;
+		}
+	      else
+		{
+		  src->or_included = 1;
+		}
+	      src++;		/* Move onto next one */
+	    }
+
+	  /* If the next one to try has already been tried then move on again */
+	  if (op == op_and_or_terms)
+	    {
+	      while (src < (L->DE + L->num) && src->or_included)
+		src++;
+	    }
+
+	  break;
+
+	case op_diff_terms:
+	  while (src < (L->DE + L->num) && src->DocNum < CurrDoc)
+	    *dest++ = *src++;
+	  if (src < (L->DE + L->num) && src->DocNum == CurrDoc)
+	    src++;
+	  break;
+
+	default:
+	  break;
+	}			/*switch */
+
+    }				/*while traversing invf */
+
+  if (op == op_and_terms || op == op_diff_terms)
+    {
+      if (op == op_diff_terms)
+	while (src - L->DE < L->num)
+	  *dest++ = *src++;
+
+      /* update size of c-set */
+      L->num = dest - L->DE;
+    }
+  DECODE_DONE
+
+    Xfree (buffer);
+  ChangeMemInUse (qd, -we->invf_len);
+
+  return (L);
+}
+
+
+
+
+
+
+
+float *
+CosineDecode (query_data * qd, TermList * Terms, RankedQueryInfo * rqi)
+{
+  float *AccumulatedWeights;
+  int j, num_docs, num_terms;
+  int seen_must_match = 0; /* [RJM 07/97: Ranked Required Terms] says whether to 'and' queries or not */
+
+  num_docs = qd->sd->sdh.num_of_docs;
+  /* Create the array for the documents */
+  if (!(AccumulatedWeights = Xmalloc (num_docs * sizeof (float))))
+      return (NULL);
+
+  bzero ((char *) AccumulatedWeights, sizeof (float) * num_docs);
+  ChangeMemInUse (qd, sizeof (float) * num_docs);
+
+  if (rqi->MaxTerms == -1)
+    num_terms = Terms->num;
+  else
+    num_terms = rqi->MaxTerms < Terms->num ? rqi->MaxTerms : Terms->num;
+
+
+  /* For each word in the list . . . */
+  for (j = 0; j < num_terms; j++)
+    {
+      u_char *buffer;
+      int i, kd;
+      unsigned long next_mjr_dn = 0;
+      unsigned long CurrDocNum = 0;	/* NOTE: Document numbers start at 1 */
+      unsigned long LastDocNum = 0; /* [RJM 07/97: Ranked Required Terms] */
+      unsigned long TempDocNum = 0; /* [RJM 07/97: Ranked Required Terms] */
+      double Wqt, WordLog;
+      int dn_blk = 0, len_blk = 0, k;
+      int blk;			/* bblock control parameter */
+      int p;			/* The number of documents the word occurs in */
+      int require_match = Terms->TE[j].require_match; /* [RJM 07/97: Ranked Required Terms] */
+      WordEntry *we = &Terms->TE[j].WE;
+      CalcBlks (qd, we, &blk, &dn_blk, &len_blk, &k, &p);
+      if (!(buffer = Xmalloc (we->invf_len)))
+	break;
+
+      ChangeMemInUse (qd, we->invf_len);
+
+      Fseek (qd->File_invf, we->invf_ptr, 0);
+      Fread (buffer, sizeof (char), we->invf_len, qd->File_invf);
+
+      /* Read from the buffer */
+      DECODE_START (buffer, we->invf_len);
+
+      WordLog = log ((double) num_docs / (double) we->max_doc_count);  /* [RPAP - Jan 97: Stem Index Change] */
+
+      Wqt = (rqi->QueryFreqs ? Terms->TE[j].Count : 1) * WordLog;
+
+      qd->num_of_terms++;
+
+      kd = 0;
+      for (i = 0; i < p; i++, kd++)
+	{
+	  int Count;		/* The number of times the word occurs in a document */
+	  double Wdt;
+	  unsigned long diff;
+	  if (kd == k)
+	    {
+	      kd = 0;
+	    }
+	  if (k && kd == 0)
+	    if (i + k < p)
+	      {
+		int temp;
+		BBLOCK_DECODE (next_mjr_dn, dn_blk);
+		next_mjr_dn += CurrDocNum;
+		BBLOCK_DECODE (temp, len_blk);
+	      }
+	  if (k && kd == k - 1 && i != p - 1)
+	    CurrDocNum = next_mjr_dn;
+	  else
+	    {
+	      BBLOCK_DECODE (diff, blk);
+	      CurrDocNum += diff;
+	    }
+	  if (qd->id->ifh.InvfLevel >= 2)
+	    GAMMA_DECODE (Count);
+	  else
+	    Count = (double) we->count / p;
+	  Wdt = Count * WordLog;
+
+	  /* [RJM 07/97: Ranked Required Terms] */
+	  /* zero the weights of intermediate documents if this term is required to match */
+	  if (require_match == 1) {
+	    for (TempDocNum = LastDocNum+1; TempDocNum < CurrDocNum; TempDocNum++)
+	      AccumulatedWeights[TempDocNum - 1] = 0.0;
+	  }
+
+	  /* [RJM 07/97: Ranked Required Terms] */
+	  /* if a term has been required to match before, the weight we are */
+	  /* adding to must be non-zero */
+	  if (!seen_must_match || (AccumulatedWeights[CurrDocNum - 1] > 0.0)) {
+	      AccumulatedWeights[CurrDocNum - 1] += Wqt * Wdt;
+	  }
+
+	  qd->num_of_ptrs++;
+	  LastDocNum = CurrDocNum; /* [RJM 07/97: Ranked Required Terms] */
+	}
+
+      DECODE_DONE
+
+	Xfree (buffer);
+      ChangeMemInUse (qd, -we->invf_len);
+
+      /* [RJM 07/97: Ranked Required Terms] */
+      /* zero the remaining weights if this term is required to match */
+      if (require_match == 1) {
+	for (TempDocNum = LastDocNum+1; TempDocNum <= num_docs; TempDocNum++)
+	  AccumulatedWeights[TempDocNum - 1] = 0.0;
+	seen_must_match = 1;
+      }
+    }
+  return AccumulatedWeights;
+}
+
+
+
+static int 
+doc_comp (void *a, void *b)
+{
+  return ((Invf_Doc_Entry *) a)->DocNum - ((Invf_Doc_Entry *) b)->DocNum;
+}
+
+
+static Invf_Doc_Entry *
+get_ide (query_data * qd, Invf_Doc_Entry_Pool * pool)
+{
+  struct pool *p = pool->pool;
+  if (!p || p->pos == p->length)
+    {
+      register unsigned size = sizeof (struct pool) +
+      (pool->pool_chunks - 1) * sizeof (Invf_Doc_Entry);
+      p = malloc (size);
+      if (!p)
+	return NULL;
+      ChangeMemInUse (qd, size);
+      p->length = pool->pool_chunks;
+      p->pos = 0;
+      p->next = pool->pool;
+      pool->pool = p;
+    }
+  return &(p->ide[p->pos++]);
+}
+
+
+void 
+free_ide_pool (query_data * qd, Invf_Doc_Entry_Pool * pool)
+{
+  while (pool->pool)
+    {
+      struct pool *p = pool->pool;
+      pool->pool = p->next;
+      ChangeMemInUse (qd, -(sizeof (struct pool) + (p->length - 1) *
+			    sizeof (Invf_Doc_Entry)));
+      free (p);
+    }
+  pool->pool = NULL;
+}
+
+
+FILE *
+open_skip (char *sd)
+{
+  char buf[256];
+  if (sd == NULL || *sd == '\0')
+    return NULL;
+  sprintf (buf, sd, getpid ());
+  return fopen (buf, "a");
+}
+
+
+
+Splay_Tree *
+CosineDecodeSplay (query_data * qd, TermList * Terms,
+		   RankedQueryInfo * rqi, Invf_Doc_Entry_Pool * pool)
+{
+  Splay_Tree *Doc_Set;
+  int j, num_docs, num_terms, MoreAccum;
+  int Anding = 0;
+  FILE *sk = open_skip (rqi->skip_dump);
+  u_char indent = 0;
+  if (sk)
+    {
+      if (!skip_header)
+	{
+	  skip_header = 1;
+	  fprintf (sk, "%s", skip_header_text[qd->id->ifh.skip_mode]);
+	  fprintf (sk, "\nSkipping method %ld\n", qd->id->ifh.skip_mode);
+	  switch (qd->id->ifh.skip_mode)
+	    {
+	    case 1:
+	      fprintf (sk, "Skipping is every %ld docnums\n",
+		       qd->id->ifh.params[0]);
+	      break;
+	    case 2:
+	      fprintf (sk, "Max nodes = %ld\nNo skips smaller or equal to %ld\n",
+		       qd->id->ifh.params[0], qd->id->ifh.params[1]);
+	      break;
+	    }
+	}
+      fprintf (sk, "\n\t\t\t-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
+      for (j = 0; j < Terms->num; j++)
+	if (Terms->TE[j].Word[0] > indent)
+	  indent = Terms->TE[j].Word[0];
+    }
+
+  num_docs = qd->sd->sdh.num_of_docs;
+  /* Create the array for the documents */
+  Doc_Set = SP_createset (doc_comp);
+
+  pool->pool = NULL;
+  pool->pool_chunks = 1024;
+
+  if (rqi->MaxTerms == -1)
+    num_terms = Terms->num;
+  else
+    num_terms = rqi->MaxTerms < Terms->num ? rqi->MaxTerms : Terms->num;
+
+  MoreAccum = 1;
+
+  /* For each word in the list . . . */
+  for (j = 0; j < num_terms; j++)
+    {
+      int Abort = 0;
+      u_char *buffer;
+      int pos, i;
+      unsigned long CurrDocNum = 0;	/* NOTE: Document numbers start at 1 */
+      double Wqt, WordLog;
+      int dn_blk = 0, len_blk = 0, k, kd;
+      int blk;			/* bblock control parameter */
+      int p;			/* The number of documents the word occurs in */
+      WordEntry *we = &Terms->TE[j].WE;
+      Invf_Doc_Entry *next = NULL;
+      int next_i, next_doc_num, next_start;
+      int skips_taken = 0, ptrs_dec = 0;
+      double total_added = 0.0;
+      int hits = 0;
+      if (sk)
+	{
+	  fprintf (sk, "%3d : %8ld %6ld \"%.*s\"%*s", j, we->count,
+		 we->doc_count, Terms->TE[j].Word[0], Terms->TE[j].Word + 1,
+		   indent - Terms->TE[j].Word[0], "");
+	}
+
+      CalcBlks (qd, we, &blk, &dn_blk, &len_blk, &k, &p);
+      if (!(buffer = Xmalloc (we->invf_len)))
+	break;
+
+      ChangeMemInUse (qd, we->invf_len);
+
+      if (sk && qd->id->ifh.skip_mode == 2)
+	fprintf (sk, "%4d", k);
+
+      Fseek (qd->File_invf, we->invf_ptr, 0);
+      Fread (buffer, sizeof (char), we->invf_len, qd->File_invf);
+
+      /* Read from the buffer */
+      DECODE_START (buffer, we->invf_len);
+
+      WordLog = log ((double) num_docs / (double) we->max_doc_count);  /* [RPAP - Jan 97: Stem Index Change] */
+
+      Wqt = (rqi->QueryFreqs ? Terms->TE[j].Count : 1) * WordLog;
+
+      qd->num_of_terms++;
+
+      if (rqi->MaxAccums != -1 && Doc_Set->no_of_items >= rqi->MaxAccums)
+	{
+	  MoreAccum = 0;
+	  Anding = 1;
+	  next = SP_get_first (Doc_Set);
+	}
+      i = pos = 0;
+      next_i = next_start = next_doc_num = 0;
+      kd = k - 1;
+      while (i < p && (!Anding || next))
+	{
+	  int Count;		/* The number of times the occurs in a document */
+	  double Wdt;
+	  unsigned long diff;
+	  Invf_Doc_Entry ent, *mem;
+	  if (k)
+	    {
+	      if (Anding && i + k < p && next->DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		{
+		  i = next_i;
+		  DECODE_SEEK (next_start);
+		  pos = next_start;
+		  CurrDocNum = next_doc_num;
+		  qd->hops_taken++;
+		  skips_taken++;
+		  kd = k - 1;
+		}
+	      if (kd == k - 1)
+		if (i + k < p)
+		  {
+		    int doc_diff, pos_diff;
+		    BBLOCK_DECODE_L (doc_diff, dn_blk, pos);
+		    next_doc_num += doc_diff;
+		    next_i += k;
+		    BBLOCK_DECODE_L (pos_diff, len_blk, pos);
+		    next_start = pos + pos_diff;
+		  }
+		else
+		  next_doc_num = -1;
+	      if (Anding && i + k < p && next->DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		continue;
+	    }
+	  if (k && kd == 0 && i != p - 1)
+	    CurrDocNum = next_doc_num;
+	  else
+	    {
+	      BBLOCK_DECODE_L (diff, blk, pos);
+	      CurrDocNum += diff;
+	    }
+	  qd->num_of_ptrs++;
+	  ptrs_dec++;
+	  if (qd->id->ifh.InvfLevel >= 2)
+	    GAMMA_DECODE_L (Count, pos);
+	  else
+	    Count = (double) we->count / p;
+	  i++;
+	  kd--;
+	  if (kd < 0)
+	    kd = k - 1;
+	  Wdt = Count * WordLog;
+
+
+	  if (Anding)
+	    {
+	      while (next && next->DocNum < CurrDocNum - 1)
+		next = SP_get_next (Doc_Set);
+	      if (next && next->DocNum == CurrDocNum - 1)
+		{
+		  next->Sum += Wqt * Wdt;
+		  total_added += Wqt * Wdt;
+		  hits++;
+		}
+	      if (next && next->DocNum <= CurrDocNum - 1)
+		next = SP_get_next (Doc_Set);
+	      goto NextDocNum;
+	    }
+	  ent.DocNum = CurrDocNum - 1;
+	  if ((mem = SP_member (&ent, Doc_Set)) == NULL)
+	    {
+	      hits++;
+	      if (rqi->MaxAccums != -1 &&
+		  Doc_Set->no_of_items >= rqi->MaxAccums &&
+		  !MoreAccum)
+		goto NextDocNum;
+	      if ((mem = get_ide (qd, pool)) == NULL)
+		return NULL;
+	      ChangeMemInUse (qd, sizeof (*mem));
+	      mem->DocNum = CurrDocNum - 1;
+	      mem->Sum = 0;
+	      ChangeMemInUse (qd, -Doc_Set->mem_in_use);
+	      if (SP_insert (mem, Doc_Set) == NULL)
+		{
+		  Message ("Unable to allocate memory for a splay node");
+		  Abort = 1;
+		  goto FastAbort;
+		}
+	      ChangeMemInUse (qd, Doc_Set->mem_in_use);
+	      if (rqi->MaxAccums != -1 &&
+		  Doc_Set->no_of_items >= rqi->MaxAccums &&
+		  rqi->StopAtMaxAccum)
+		Abort = 1;
+	    }
+
+	  mem->Sum += Wqt * Wdt;
+	  total_added += Wqt * Wdt;
+
+	NextDocNum:
+	  ;
+	}
+
+    FastAbort:
+
+      DECODE_DONE
+
+	Xfree (buffer);
+      ChangeMemInUse (qd, -we->invf_len);
+      if (sk)
+	{
+	  if (qd->id->ifh.skip_mode != 0)
+	    fprintf (sk, " %6d", skips_taken);
+	  fprintf (sk, " %6d %6d %6d%12.2f\n",
+		   ptrs_dec, hits, Doc_Set->no_of_items, total_added);
+	}
+      if (Abort)
+	break;
+    }
+  if (sk)
+    fclose (sk);
+  return Doc_Set;
+}
+
+
+
+
+Hash_Table *
+CosineDecodeHash (query_data * qd, TermList * Terms,
+		  RankedQueryInfo * rqi)
+{
+  int j, num_docs, num_terms, MoreAccum;
+  Hash_Table *HT;
+  int Anding = 0;
+  int Sorted = 0;
+  FILE *sk = open_skip (rqi->skip_dump);
+  u_char indent = 0;
+  if (sk)
+    {
+      if (!skip_header)
+	{
+	  skip_header = 1;
+	  fprintf (sk, "%s", skip_header_text[qd->id->ifh.skip_mode]);
+	  fprintf (sk, "\nSkipping method %ld\n", qd->id->ifh.skip_mode);
+	  switch (qd->id->ifh.skip_mode)
+	    {
+	    case 1:
+	      fprintf (sk, "Skipping is every %ld docnums\n",
+		       qd->id->ifh.params[0]);
+	      break;
+	    case 2:
+	      fprintf (sk, "Max nodes = %ld\nNo skips smaller or equal to %ld\n",
+		       qd->id->ifh.params[0], qd->id->ifh.params[1]);
+	      break;
+	    }
+	}
+      fprintf (sk, "\n\t\t\t-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
+      for (j = 0; j < Terms->num; j++)
+	if (Terms->TE[j].Word[0] > indent)
+	  indent = Terms->TE[j].Word[0];
+    }
+
+  num_docs = qd->sd->sdh.num_of_docs;
+  /* Create the array for the documents */
+  HT = HT_create (qd, rqi->MaxAccums, rqi->HashTblSize);
+  if (!HT)
+    return NULL;
+
+  if (rqi->MaxTerms == -1)
+    num_terms = Terms->num;
+  else
+    num_terms = rqi->MaxTerms < Terms->num ? rqi->MaxTerms : Terms->num;
+
+  MoreAccum = 1;
+
+  /* For each word in the list . . . */
+  for (j = 0; j < num_terms; j++)
+    {
+      int Abort = 0;
+      u_char *buffer;
+      int pos;
+      int i;
+      unsigned long CurrDocNum = 0;	/* NOTE: Document numbers start at 1 */
+      double Wqt, WordLog;
+      int dn_blk = 0, len_blk = 0, k, kd;
+      int blk;			/* bblock control parameter */
+      int p;			/* The number of documents the word occurs in */
+      WordEntry *we = &Terms->TE[j].WE;
+      Invf_Doc_EntryH *next = NULL;
+      int next_i, next_doc_num, next_start;
+      int skips_taken = 0, ptrs_dec = 0;
+      double total_added = 0.0;
+      int hits = 0;
+      if (sk)
+	{
+	  fprintf (sk, "%3d : %8ld %6ld \"%.*s\"%*s", j, we->count,
+		 we->doc_count, Terms->TE[j].Word[0], Terms->TE[j].Word + 1,
+		   indent - Terms->TE[j].Word[0], "");
+	}
+
+      CalcBlks (qd, we, &blk, &dn_blk, &len_blk, &k, &p);
+      if (!(buffer = Xmalloc (we->invf_len)))
+	break;
+
+      ChangeMemInUse (qd, we->invf_len);
+
+      if (sk && qd->id->ifh.skip_mode == 2)
+	fprintf (sk, "%4d", k);
+
+      Fseek (qd->File_invf, we->invf_ptr, 0);
+      Fread (buffer, sizeof (char), we->invf_len, qd->File_invf);
+
+      /* Read from the buffer */
+      DECODE_START (buffer, we->invf_len);
+
+      WordLog = log ((double) num_docs / (double) we->max_doc_count);  /* [RPAP - Jan 97: Stem Index Change] */
+
+      Wqt = (rqi->QueryFreqs ? Terms->TE[j].Count : 1) * WordLog;
+
+      qd->num_of_terms++;
+
+      if (rqi->MaxAccums != -1 && HT->num >= rqi->MaxAccums)
+	{
+	  MoreAccum = 0;
+	  Anding = 1;
+	  if (!Sorted)
+	    {
+	      HT_sort (qd, HT);
+	      Sorted = 1;
+	    }
+	  next = HT->Head;
+	}
+      i = pos = 0;
+      next_i = next_start = next_doc_num = 0;
+      kd = k - 1;
+      while (i < p && (!Anding || next))
+	{
+	  int Count;		/* The number of times the occurs in a document */
+	  double Wdt;
+	  unsigned long diff;
+	  Invf_Doc_Entry *mem;
+	  if (k)
+	    {
+	      if (Anding && i + k < p && next->IDE.DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		{
+#ifdef SHORT_CUT
+		ShortCut:
+#endif
+		  i = next_i;
+		  DECODE_SEEK (next_start);
+		  pos = next_start;
+		  CurrDocNum = next_doc_num;
+		  qd->hops_taken++;
+		  skips_taken++;
+		  kd = k - 1;
+		}
+	      if (kd == k - 1)
+		{
+		  if (i + k < p)
+		    {
+		      int doc_diff, pos_diff;
+		      BBLOCK_DECODE_L (doc_diff, dn_blk, pos);
+		      next_doc_num += doc_diff;
+		      next_i += k;
+		      BBLOCK_DECODE_L (pos_diff, len_blk, pos);
+		      next_start = pos + pos_diff;
+		    }
+		  else
+		    next_doc_num = -1;
+		}
+#ifdef SHORT_CUT
+	      if (Anding && i + k < p && next->IDE.DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		goto ShortCut;
+#else
+	      if (Anding && i + k < p && next->IDE.DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		continue;
+#endif
+	    }
+	  if (k && kd == 0 && i != p - 1)
+	    {
+	      CurrDocNum = next_doc_num;
+	    }
+	  else
+	    {
+	      BBLOCK_DECODE_L (diff, blk, pos);
+	      CurrDocNum += diff;
+	    }
+	  qd->num_of_ptrs++;
+	  ptrs_dec++;
+	  if (qd->id->ifh.InvfLevel >= 2)
+	    GAMMA_DECODE_L (Count, pos);
+	  else
+	    Count = (double) we->count / p;
+	  i++;
+	  kd--;
+	  if (kd < 0)
+	    kd = k - 1;
+
+
+	  if (Anding)
+	    {
+	      while (next && next->IDE.DocNum < CurrDocNum - 1)
+		next = next->next;
+	      if (next && next->IDE.DocNum == CurrDocNum - 1)
+		{
+		  Wdt = Count * WordLog;
+		  next->IDE.Sum += Wqt * Wdt;
+		  total_added += Wqt * Wdt;
+		  hits++;
+		}
+	      if (next && next->IDE.DocNum <= CurrDocNum - 1)
+		next = next->next;
+	      goto NextDocNum;
+	    }
+	  if ((mem = HT_find (HT, CurrDocNum - 1)) == NULL)
+	    {
+	      if (rqi->MaxAccums != -1 && HT->num >= rqi->MaxAccums &&
+		  !MoreAccum)
+		goto NextDocNum;
+	      Wdt = Count * WordLog;
+	      if (!HT_insert (HT, CurrDocNum - 1, Wqt * Wdt))
+		{
+		  if (!HT->Suplimentary_Entries)
+		    HT_Sup_create (qd, HT, we->doc_count - i + 1);
+		  HT_Sup_Add (HT, CurrDocNum - 1, Wqt * Wdt);
+		}
+	      if (rqi->MaxAccums != -1 && HT->num >= rqi->MaxAccums &&
+		  rqi->StopAtMaxAccum)
+		Abort = 1;
+	    }
+	  else
+	    {
+	      Wdt = Count * WordLog;
+	      mem->Sum += Wqt * Wdt;
+	      total_added += Wqt * Wdt;
+	      hits++;
+	    }
+
+	NextDocNum:
+	  ;
+	}
+
+      DECODE_DONE
+
+	Xfree (buffer);
+      ChangeMemInUse (qd, -we->invf_len);
+      if (sk)
+	{
+	  if (qd->id->ifh.skip_mode != 0)
+	    fprintf (sk, " %6d", skips_taken);
+	  fprintf (sk, " %6d %6d %6d%12.2f\n",
+	       ptrs_dec, hits, HT->num + HT->Suplimentary_Num, total_added);
+	}
+      if (Abort)
+	break;
+    }
+  if (sk)
+    fclose (sk);
+  if (!HT->Head)
+    HT_sort (qd, HT);
+  return HT;
+}
+
+
+
+List_Table *
+CosineDecodeList (query_data * qd, TermList * Terms,
+		  RankedQueryInfo * rqi)
+{
+  int j, num_docs, num_terms, MoreAccum;
+  List_Table *LT;
+  int Anding = 0;
+  int Sorted = 0;
+  int has_grown = 0; /* [RJM 07/97: Ranked Required Match] whether elements have been added lately */
+  FILE *sk = open_skip (rqi->skip_dump);
+  u_char indent = 0;
+  if (sk)
+    {
+      if (!skip_header)
+	{
+	  skip_header = 1;
+	  fprintf (sk, "%s", skip_header_text[qd->id->ifh.skip_mode]);
+	  fprintf (sk, "\nSkipping method %ld\n", qd->id->ifh.skip_mode);
+	  switch (qd->id->ifh.skip_mode)
+	    {
+	    case 1:
+	      fprintf (sk, "Skipping is every %ld docnums\n",
+		       qd->id->ifh.params[0]);
+	      break;
+	    case 2:
+	      fprintf (sk, "Max nodes = %ld\nNo skips smaller or equal to %ld\n",
+		       qd->id->ifh.params[0], qd->id->ifh.params[1]);
+	      break;
+	    }
+	}
+      fprintf (sk, "\n\t\t\t-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
+      for (j = 0; j < Terms->num; j++)
+	if (Terms->TE[j].Word[0] > indent)
+	  indent = Terms->TE[j].Word[0];
+    }
+
+  num_docs = qd->sd->sdh.num_of_docs;
+
+  /* Create the list for the documents */
+  LT = LT_create (qd, rqi->MaxAccums);
+  if (!LT)
+    return NULL;
+
+  if (rqi->MaxTerms == -1)
+    num_terms = Terms->num;
+  else
+    num_terms = rqi->MaxTerms < Terms->num ? rqi->MaxTerms : Terms->num;
+
+  MoreAccum = 1;
+
+  /* For each word in the list . . . */
+  for (j = 0; j < num_terms; j++)
+    {
+      int Abort = 0;
+      u_char *buffer;
+      int pos;
+      int i, n = 0;
+      unsigned long CurrDocNum = 0;	/* NOTE: Document numbers start at 1 */
+      unsigned long LastDocNum = 0;	/* [RJM 07/97: Ranked Required Match] */
+      int this_item = 0; /* [RJM 07/97: Ranked Required Match] points to the next possible LT to delete */
+      double Wqt, WordLog;
+      int dn_blk = 0, len_blk = 0, k, kd;
+      int blk;			/* bblock control parameter */
+      int p;			/* The number of documents the word occurs in */
+      int require_match = Terms->TE[j].require_match; /* [RJM 07/97: Ranked Required Match] */
+      WordEntry *we = &Terms->TE[j].WE;
+      Invf_Doc_Entry *next = NULL;
+      int next_i, next_doc_num, next_start;
+      int skips_taken = 0, ptrs_dec = 0;
+      double total_added = 0.0;
+      int hits = 0;
+
+      if (sk)
+	{
+	  fprintf (sk, "%3d : %8ld %6ld \"%.*s\"%*s", j, we->count,
+		 we->doc_count, Terms->TE[j].Word[0], Terms->TE[j].Word + 1,
+		   indent - Terms->TE[j].Word[0], "");
+	}
+
+      CalcBlks (qd, we, &blk, &dn_blk, &len_blk, &k, &p);
+      if (!(buffer = Xmalloc (we->invf_len)))
+	break;
+
+      ChangeMemInUse (qd, we->invf_len);
+
+      if (sk && qd->id->ifh.skip_mode == 2)
+	fprintf (sk, "%4d", k);
+
+      Fseek (qd->File_invf, we->invf_ptr, 0);
+      Fread (buffer, sizeof (char), we->invf_len, qd->File_invf);
+
+      /* Read from the buffer */
+      DECODE_START (buffer, we->invf_len);
+
+      WordLog = log ((double) num_docs / (double) we->max_doc_count);  /* [RPAP - Jan 97: Stem Index Change] */
+
+      Wqt = (rqi->QueryFreqs ? Terms->TE[j].Count : 1) * WordLog;
+
+      qd->num_of_terms++;
+
+      if (rqi->MaxAccums != -1 && LT->num >= rqi->MaxAccums)
+	MoreAccum = 0;
+
+      if ((rqi->MaxAccums != -1 && LT->num >= rqi->MaxAccums) || Anding)
+	{
+	  Anding = 1;
+	  if (!Sorted || has_grown)
+	    {
+	      LT_sort (LT);
+	      LT_pack (LT);
+	      Sorted = 1;
+	      has_grown = 0;
+	    }
+	  next = LT->IDE;
+	  n = 0;
+	}
+
+      /* [RJM 07/97: Ranked Required Terms] */
+      /* make sure that the document list is set up correctly for */
+      /* requiring a term to match */
+      if (require_match == 1) {
+	if (!Sorted || has_grown) {
+	  LT_sort (LT);
+	  LT_pack (LT);
+	  Sorted = 1;
+	  has_grown = 0;
+	}
+	/* this_item is already set to zero */
+      }
+
+      i = pos = 0;
+      next_i = next_start = next_doc_num = 0;
+      kd = k - 1;
+      while (i < p && (!Anding || n < LT->num))
+	{
+	  int Count;		/* The number of times the occurs in a document */
+	  double Wdt;
+	  unsigned long diff;
+	  Invf_Doc_Entry *mem;
+
+	  /* deal with skipping */
+	  if (k)
+	    {
+	      /* see if we should take a skip */
+	      if (Anding && i + k < p && next->DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		{
+		  i = next_i;
+		  DECODE_SEEK (next_start);
+		  pos = next_start;
+		  CurrDocNum = next_doc_num;
+		  qd->hops_taken++;
+		  skips_taken++;
+		  kd = k - 1;
+		}
+	      if (kd == k - 1)
+		if (i + k < p)
+		  {
+		    int doc_diff, pos_diff;
+		    BBLOCK_DECODE_L (doc_diff, dn_blk, pos);
+		    next_doc_num += doc_diff;
+		    next_i += k;
+		    BBLOCK_DECODE_L (pos_diff, len_blk, pos);
+		    next_start = pos + pos_diff;
+		  }
+		else
+		  next_doc_num = -1;
+
+	      /* should we take another skip? */
+	      if (Anding && i + k < p && next->DocNum > next_doc_num &&
+		  next_doc_num >= 0)
+		continue;
+	    }
+	  if (k && kd == 0 && i != p - 1)
+	    CurrDocNum = next_doc_num;
+	  else
+	    {
+	      BBLOCK_DECODE_L (diff, blk, pos);
+	      CurrDocNum += diff;
+	    }
+	  qd->num_of_ptrs++;
+	  ptrs_dec++;
+	  if (qd->id->ifh.InvfLevel >= 2)
+	    GAMMA_DECODE_L (Count, pos);
+	  else
+	    Count = (double) we->count / p;
+	  i++;
+	  kd--;
+	  if (kd < 0)
+	    kd = k - 1;
+	  Wdt = Count * WordLog;
+
+	  /* [RJM 07/97: Ranked Required Terms] */
+	  /* if this is a required match we must remove all accumulators */
+	  /* of intermediate documents */
+	  if (require_match == 1) {
+	    while (this_item < LT->num && LT->IDE[this_item].DocNum < CurrDocNum - 1) {
+	      if (LastDocNum==0 ||(LT->IDE[this_item].DocNum > LastDocNum - 1))
+		LT->IDE[this_item].Sum = -1000.0; /* mark for deletion */
+	      this_item++;
+	    }
+	  }
+
+	  if (Anding)
+	    {
+	      while (n < LT->num && next->DocNum < CurrDocNum - 1)
+		{
+		  next++;
+		  n++;
+		}
+	      if (n < LT->num && next->DocNum == CurrDocNum - 1)
+		{
+		  next->Sum += Wqt * Wdt;
+		  total_added += Wqt * Wdt;
+		  hits++;
+		}
+	      if (n < LT->num && next->DocNum <= CurrDocNum - 1)
+		{
+		  next++;
+		  n++;
+		}
+	      goto NextDocNum;
+	    }
+	  if (!Anding)
+	    {
+	      if (rqi->MaxAccums != -1 && LT->num >= rqi->MaxAccums &&
+		  !MoreAccum)
+		goto NextDocNum;
+	      LT = LT_add (qd, LT, CurrDocNum - 1, Wqt * Wdt);
+	      if (!LT)
+		{
+		  Abort = 1;
+		  goto FastAbort;
+		}
+
+	      /* the list of accumulators just got bigger */
+	      has_grown = 1;
+
+	      if (rqi->MaxAccums != -1 && LT->num >= rqi->MaxAccums &&
+		  rqi->StopAtMaxAccum)
+		Abort = 1;
+
+
+	    }
+	  else if ((mem = LT_find (LT, CurrDocNum - 1)))
+	    {
+	      mem->Sum += Wqt * Wdt;
+	      total_added += Wqt * Wdt;
+	      hits++;
+	    }
+
+	NextDocNum:
+
+	  LastDocNum = CurrDocNum;
+	}
+
+    FastAbort:
+
+      DECODE_DONE
+
+	Xfree (buffer);
+      ChangeMemInUse (qd, -we->invf_len);
+      if (sk)
+	{
+	  if (qd->id->ifh.skip_mode != 0)
+	    fprintf (sk, " %6d", skips_taken);
+	  fprintf (sk, " %6d %6d %6d%12.2f\n",
+		   ptrs_dec, hits, LT->num, total_added);
+	}
+      if (Abort)
+	break;
+
+      /* [RJM 07/97: Ranked Required Terms] */
+      /* remove the remaining accumulators if this term is required to match */
+      if (require_match == 1) {
+	while (this_item < LT->num) {
+	  if (LT->IDE[this_item].DocNum > LastDocNum - 1)
+	    LT->IDE[this_item].Sum = -1000.0; /* mark for deletion */
+	  this_item++;
+	}
+	Anding = 1; /* no more documents should be added */
+
+	/* Get rid of any documents which have been deleted */
+	LT_pack (LT);
+      }
+    }
+
+  if (sk)
+    fclose (sk);
+  return LT;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/invf_get.h	(revision 21083)
@@ -0,0 +1,103 @@
+/**************************************************************************
+ *
+ * invf_get.h -- Inverted file reading routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_INVF_GET
+#define H_INVF_GET
+
+typedef struct Invf_Doc_Entry
+  {
+    int DocNum;
+    float Sum;
+  }
+Invf_Doc_Entry;
+
+typedef struct Invf_Doc_Entry_Pool
+  {
+    void *pool;
+    unsigned pool_chunks;
+  }
+Invf_Doc_Entry_Pool;
+
+typedef struct Invf_Doc_EntryH
+  {
+    Invf_Doc_Entry IDE;
+    struct Invf_Doc_EntryH *next;
+  }
+Invf_Doc_EntryH;
+
+typedef struct Hash_Table
+  {
+    Invf_Doc_EntryH *Suplimentary_Entries;
+    int Suplimentary_Size;
+    int Suplimentary_Num;
+    unsigned max;
+    unsigned num;
+    unsigned size;
+    Invf_Doc_EntryH **HashTable;
+    Invf_Doc_EntryH *Head;
+    Invf_Doc_EntryH IDEH[1];
+  }
+Hash_Table;
+
+typedef struct List_Table
+  {
+    unsigned max;
+    unsigned num;
+    Invf_Doc_Entry IDE[1];
+  }
+List_Table;
+
+typedef enum
+  {
+    op_term, op_and_terms, op_and_or_terms, op_diff_terms
+  }
+Op_types;
+
+/*Invf_Doc_Entry *HT_find(Hash_Table *HT, unsigned long DN); */
+void HT_free (query_data * qd, Hash_Table * HT);
+void LT_free (query_data * qd, List_Table * LT);
+
+invf_data *InitInvfFile (File * InvfFile, stemmed_dict * sd);
+void FreeInvfData (invf_data * id);
+
+DocList *GetDocs (query_data * qd, WordEntry * we, BooleanQueryInfo * bqi);
+
+float *CosineDecode (query_data * qd, TermList * Terms, RankedQueryInfo * rqi);
+
+void free_ide_pool (query_data * qd, Invf_Doc_Entry_Pool * pool);
+
+Splay_Tree *CosineDecodeSplay (query_data * qd, TermList * Terms,
+			 RankedQueryInfo * rqi, Invf_Doc_Entry_Pool * pool);
+
+Hash_Table *CosineDecodeHash (query_data * qd, TermList * Terms,
+			      RankedQueryInfo * rqi);
+List_Table *CosineDecodeList (query_data * qd, TermList * Terms,
+			      RankedQueryInfo * rqi);
+
+
+DocList *GetDocsOp (query_data * qd, WordEntry * we, Op_types op, DocList * L);
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass1.c	(revision 21083)
@@ -0,0 +1,822 @@
+/**************************************************************************
+ *
+ * ivf.pass1.c -- Memory efficient pass 1 inversion
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include "local_strings.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "mg.h"
+#include "build.h"
+#include "locallib.h"
+#include "words.h"
+#include "stemmer.h"
+#include "hash.h"
+
+#include "longlong.h"
+
+/*
+   $Log$
+   Revision 1.2  2001/09/21 12:46:42  kjm18
+   updated mg to be in line with mg_1.3f. Now uses long long for some variables
+   to enable indexing of very large collections.
+
+   Revision 1.1  1999/08/10 21:17:54  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1998/12/17 09:12:50  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:43  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:44  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.6  1995/01/16  03:57:05  tes
+   * Fixed bug for index_string_bytes which was calculated
+   * by adding the suffix lengths except for every lookback (block)
+   * number of words. This was incorrect as invf.dict is fully
+   * front coded - perhaps it was partially coded in the past.
+   * This would only affect a statistic - hence the reason why the
+   * bug could exist ;-)
+   *
+   * Revision 1.5  1994/11/29  00:31:59  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.3  1994/10/20  03:56:48  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:34  tes
+   * For version 1.1
+   *
+ */
+
+/*
+ *  Modified:
+ *   - long long bit counts for inverted file
+ *     (1999-08-05 Tim Bell <bhat@cs.mu.oz.au>)
+ */
+static char *RCSID = "$Id$";
+
+#define LOGLOOKBACK	2
+#define POOL_SIZE 1024*1024
+#define HASH_POOL_SIZE 8192
+#define INITIAL_HASH_SIZE 7927
+
+#define INIT_CHECK_FRAC 0.10
+#define CHECK_FRAC 0.75
+#define CHECK_CLOSE 0.999
+#define PARA_DIV 1.5
+#define NORM_DIV 1.0
+
+
+typedef struct hash_rec
+  {
+    unsigned long fcnt;		/* fragment frequency */
+    unsigned long lfcnt;	/* local fragment frequency */
+    unsigned long fnum;		/* last fragment to use stem */
+    unsigned long wcnt;		/* stem frequency */
+    unsigned long lwcnt;	/* local stem frequency */
+    u_char *word;
+  }
+hash_rec;
+
+
+
+
+
+
+
+
+static unsigned long words_read = 0, words_diff = 0, bytes_diff = 0;
+static unsigned long outputbytes = 0;
+static unsigned long inputbytes = 0;
+static unsigned long MaxMemInUse = 0;
+static unsigned long MemInUse = 0;
+static unsigned long ChunksWritten = 0;
+
+
+static FILE *ic;		/* The invf block file */
+static stdio_bitio_state sbs;
+
+static hash_rec **HashTable;
+static unsigned long HashSize;
+static unsigned long HashUsed;
+static u_char *Pool;
+static int PoolLeft;
+
+static hash_rec *hr_pool;
+static int hr_PoolLeft;
+
+static hash_rec **first_occr;
+static int max_first_occr;
+
+static mg_ullong L1_bits = 0;
+static mg_ullong L2_bits = 0;
+static mg_ullong L3_bits = 0;
+static unsigned long L1_ohead = 0;
+static unsigned long L2_ohead = 0;
+static unsigned long L3_ohead = 0;
+static unsigned long callnum = 0, lcallnum = 0, wordnum = 0, lwordnum = 0;
+static unsigned long ptrcnt = 0;
+static unsigned long checknum;
+static long max_mem = 0;
+
+
+static void 
+ChangeMem (int Change)
+{
+  MemInUse += Change;
+  if (MemInUse > MaxMemInUse)
+    MaxMemInUse = MemInUse;
+}
+
+
+
+int 
+init_ivf_1 (char *file_name)
+{
+  if (!(ic = create_file (file_name, INVF_CHUNK_SUFFIX, "wb", MAGIC_CHUNK,
+			  MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+  fwrite ("    ", sizeof (u_long), 1, ic);	/* Space for the maxmem */
+  ENCODE_START (ic)
+    ENCODE_PAUSE (sbs)
+
+    if (!(Pool = Xmalloc (POOL_SIZE)))
+    {
+      Message ("Unable to allocate memory for pool");
+      return (COMPERROR);
+    }
+  PoolLeft = POOL_SIZE;
+  ChangeMem (POOL_SIZE);
+
+  if (!(hr_pool = Xmalloc (HASH_POOL_SIZE * sizeof (hash_rec))))
+    {
+      Message ("Unable to allocate memory for pool");
+      return (COMPERROR);
+    }
+  hr_PoolLeft = HASH_POOL_SIZE;
+  ChangeMem (HASH_POOL_SIZE * sizeof (hash_rec));
+
+  HashSize = INITIAL_HASH_SIZE;
+  HashUsed = 0;
+  if (!(HashTable = Xmalloc (sizeof (hash_rec *) * HashSize)))
+    {
+      Message ("Unable to allocate memory for table");
+      return (COMPERROR);
+    }
+  ChangeMem (sizeof (hash_rec *) * HashSize);
+  bzero ((char *) HashTable, sizeof (hash_rec *) * HashSize);
+  max_first_occr = 8192;
+  if (!(first_occr = Xmalloc (sizeof (hash_rec *) * max_first_occr)))
+    {
+      Message ("Unable to allocate memory for first_occur");
+      return (COMPERROR);
+    }
+  ChangeMem (sizeof (hash_rec *) * max_first_occr);
+
+  checknum = (invf_buffer_size * INIT_CHECK_FRAC) /
+    (InvfLevel == 3 ? PARA_DIV : NORM_DIV);
+
+  return (COMPALLOK);
+}
+
+
+
+static unsigned long 
+mem_reqd (void)
+{
+  register int i;
+  register unsigned long total = 0;
+/*  register unsigned long N = InvfLevel == 3 ? lwordnum : lcallnum; */
+  register unsigned long N = lcallnum;
+  for (i = 0; i < HashUsed; i++)
+    {
+      register hash_rec *ent = first_occr[i];
+/*      register unsigned long p = InvfLevel == 3 ? ent->lwcnt : ent->lfcnt; */
+      register unsigned long p = ent->lfcnt;
+      if (p)
+	total += BIO_Bblock_Bound (N, p);
+      if (InvfLevel >= 2)
+	total += ent->lwcnt;
+    }
+
+  total = (total + 7) >> 3;
+  return total;
+}
+
+static unsigned long 
+max_mem_reqd (void)
+{
+  register int i;
+  register unsigned long total = 0;
+/*  register unsigned long N = InvfLevel == 3 ? wordnum : callnum; */
+  register unsigned long N = callnum;
+  for (i = 0; i < HashUsed; i++)
+    {
+      register hash_rec *ent = first_occr[i];
+/*      register unsigned long p = InvfLevel == 3 ? ent->wcnt : ent->fcnt; */
+      register unsigned long p = ent->fcnt;
+      if (p)
+	total += BIO_Bblock_Bound (N, p);
+      if (InvfLevel >= 2)
+	total += ent->wcnt;
+    }
+
+  total = (total + 7) >> 3;
+  return total;
+}
+
+
+static void 
+dump_dict (unsigned long mem)
+{
+  int i;
+
+  ChunksWritten++;
+
+  ENCODE_CONTINUE (sbs)
+
+    GAMMA_ENCODE (lcallnum + 1);
+  if (mem > max_mem)
+    max_mem = mem;
+  GAMMA_ENCODE (mem + 1);
+  lwordnum = lcallnum = 0;
+  GAMMA_ENCODE (HashUsed + 1);
+  for (i = 0; i < HashUsed; i++)
+    {
+      hash_rec *ent = first_occr[i];
+      GAMMA_ENCODE (ent->lwcnt + 1);
+      if (ent->lwcnt >= 2)
+	GAMMA_ENCODE (ent->lfcnt);
+      ent->lwcnt = ent->lfcnt = 0;
+    }
+  ptrcnt = 0;
+  ENCODE_PAUSE (sbs)
+}
+
+
+
+static int 
+process_doc (u_char * s_in, int l_in)
+{
+  u_char *end = s_in + l_in - 1;
+
+  callnum++;
+  lcallnum++;
+  inputbytes += l_in;
+
+  if (!inaword (s_in, end))
+    if (SkipSGML)
+      PARSE_NON_STEM_WORD_OR_SGML_TAG (s_in, end);
+    else
+      PARSE_NON_STEM_WORD (s_in, end);
+  /*
+   ** Alternately parse off words and non-words from the input
+   ** stream beginning with a non-word. Each token is then
+   ** inserted into the set if it does not exist or has it's
+   ** frequency count incremented if it does.
+   */
+  while (s_in <= end)
+    {
+      u_char Word[MAXSTEMLEN + 1];
+
+      PARSE_STEM_WORD (Word, s_in, end);
+      
+      stemmer (stem_method, stemmer_num, Word);
+      if (SkipSGML)
+	PARSE_NON_STEM_WORD_OR_SGML_TAG (s_in, end);
+      else
+	PARSE_NON_STEM_WORD (s_in, end);
+
+      words_read++;
+      wordnum++;
+      lwordnum++;
+      /* Search the hash table for Word */
+      {
+	register unsigned long hashval, step;
+	register int hsize = HashSize;
+	HASH (hashval, step, Word, hsize);
+	for (;;)
+	  {
+	    register u_char *s1;
+	    register u_char *s2;
+	    register int len;
+	    register hash_rec *ent;
+	    ent = HashTable[hashval];
+	    if (!ent)
+	      {
+		int len = *Word + 1;
+		if (!hr_PoolLeft)
+		  {
+		    if (!(hr_pool = Xmalloc (HASH_POOL_SIZE *
+					     sizeof (hash_rec))))
+		      {
+			Message ("Unable to allocate memory for pool");
+			return (COMPERROR);
+		      }
+		    hr_PoolLeft = HASH_POOL_SIZE;
+		    ChangeMem (HASH_POOL_SIZE * sizeof (hash_rec));
+		  }
+		ent = hr_pool++;
+		hr_PoolLeft--;
+		if (len > PoolLeft)
+		  {
+		    if (!(Pool = Xmalloc (POOL_SIZE)))
+		      {
+			Message ("Unable to allocate memory for pool");
+			return (COMPERROR);
+		      }
+		    PoolLeft = POOL_SIZE;
+		    ChangeMem (POOL_SIZE);
+		  }
+		ent->wcnt = 1;
+		ent->fcnt = 1;
+		ent->lwcnt = 1;
+		ent->lfcnt = 1;
+		ent->fnum = callnum;
+		ent->word = Pool;
+		memcpy (Pool, Word, len);
+		Pool += len;
+		PoolLeft -= len;
+		if (HashUsed == max_first_occr - 1)
+		  {
+		    ChangeMem (-sizeof (hash_rec *) * max_first_occr);
+		    max_first_occr *= 2;
+		    if (!(first_occr = Xrealloc (first_occr, sizeof (hash_rec *) *
+						 max_first_occr)))
+		      {
+			Message ("Unable to allocate memory for first_occr");
+			return (COMPERROR);
+		      }
+		    ChangeMem (sizeof (hash_rec *) * max_first_occr);
+		  }
+		first_occr[HashUsed] = ent;
+		HashUsed++;
+		HashTable[hashval] = ent;
+		bytes_diff += Word[0];
+		break;
+	      }
+
+	    /* Compare the words */
+	    s1 = Word;
+	    s2 = ent->word;
+	    len = *s1 + 1;
+	    for (; len; len--)
+	      if (*s1++ != *s2++)
+		break;
+
+	    if (len)
+	      {
+		hashval = (hashval + step);
+		if (hashval >= hsize)
+		  hashval -= hsize;
+	      }
+	    else
+	      {
+		ent->wcnt++;
+		ent->lwcnt++;
+		if (callnum > ent->fnum)
+		  {
+		    ptrcnt++;
+		    ent->fcnt++;
+		    ent->lfcnt++;
+		    ent->fnum = callnum;
+		  }
+		break;
+	      }
+	  }
+      }
+
+      if (HashUsed >= HashSize >> 1)
+	{
+	  hash_rec **ht;
+	  unsigned long size;
+	  unsigned long i;
+	  size = prime (HashSize * 2);
+	  if (!(ht = Xmalloc (sizeof (hash_rec *) * size)))
+	    {
+	      Message ("Unable to allocate memory for table");
+	      return (COMPERROR);
+	    }
+	  bzero ((char *) ht, sizeof (hash_rec *) * size);
+	  ChangeMem (sizeof (hash_rec *) * size);
+
+	  for (i = 0; i < HashSize; i++)
+	    if (HashTable[i])
+	      {
+		register u_char *wptr;
+		hash_rec *ent;
+		register unsigned long hashval, step;
+
+		wptr = HashTable[i]->word;
+		HASH (hashval, step, wptr, size);
+		ent = ht[hashval];
+		while (ent)
+		  {
+		    hashval += step;
+		    if (hashval >= size)
+		      hashval -= size;
+		    ent = ht[hashval];
+		  }
+		ht[hashval] = HashTable[i];
+	      }
+	  Xfree (HashTable);
+	  ChangeMem (-sizeof (hash_rec *) * HashSize);
+	  HashTable = ht;
+	  HashSize = size;
+	}
+
+    }
+
+  if (ptrcnt >= checknum)
+    {
+      unsigned long mem;
+      /*fprintf(stderr, "Checking at %u . . . ", ptrcnt); */
+      mem = mem_reqd ();
+      if (mem >= invf_buffer_size * CHECK_CLOSE)
+	{
+	  /*fprintf(stderr, "Got a match\n"); */
+	  dump_dict (mem);
+	  checknum = (invf_buffer_size * INIT_CHECK_FRAC) /
+	    (InvfLevel == 3 ? PARA_DIV : NORM_DIV);
+	}
+      else
+	{
+	  checknum = checknum * ((CHECK_FRAC * (invf_buffer_size - mem)) / mem) +
+	    checknum;
+	  if (checknum <= ptrcnt)
+	    checknum = ptrcnt + 1;
+	  /*fprintf(stderr, "Next check at %u\n", checknum); */
+	}
+    }
+  return (COMPALLOK);
+
+}				/* encode */
+
+
+int 
+process_ivf_1 (u_char * s_in, int l_in)
+{
+  if (InvfLevel <= 2)
+    return process_doc (s_in, l_in);
+  else
+    {
+      int pos = 0;
+      u_char *start = s_in;
+      while (pos < l_in)
+	{
+	  if (s_in[pos] == TERMPARAGRAPH)
+	    {
+	      int len = pos + s_in + 1 - start;
+	      if (process_doc (start, len) != COMPALLOK)
+		return (COMPERROR);
+	      start = s_in + pos + 1;
+	    }
+	  pos++;
+	}
+      if (start < s_in + pos)
+	return process_doc (start, pos + s_in - start);
+    }
+  return COMPALLOK;
+}
+
+static int 
+PackHashTable (void)
+{
+  int s, d;
+  for (s = d = 0; s < HashSize; s++)
+    if (HashTable[s])
+      HashTable[d++] = HashTable[s];
+  ChangeMem (-sizeof (hash_rec *) * HashSize);
+  ChangeMem (sizeof (hash_rec *) * HashUsed);
+  if (!(HashTable = Xrealloc (HashTable, sizeof (hash_rec *) * HashUsed)))
+    {
+      Message ("Out of memory");
+      return COMPERROR;
+    }
+  HashSize = HashUsed;
+  return COMPALLOK;
+}
+
+
+
+
+
+static int 
+ent_comp (const void *A, const void *B)
+{
+  u_char *s1 = (*((hash_rec **) A))->word;
+  u_char *s2 = (*((hash_rec **) B))->word;
+
+  return (casecompare (s1, s2)); /* [RPAP - Jan 97: Stem Index Change] */
+}				/* stem_comp */
+
+
+
+
+
+/*
+ * void count_text()
+ *
+ * The maths used in this function is described in the paper "Coding for 
+ * Compression in Full-Text Retrieval Systems"
+ *
+ */
+static void 
+count_text ()
+{
+  int i;
+  mg_ullong oldL12_bits = 0;
+  for (i = 0; i < HashUsed; i++)
+    {
+      hash_rec *wrd = HashTable[i];
+      /* estimate size of a level 1 inverted file */
+      L1_bits += (int) (0.99 + wrd->fcnt * (1.6 + log2 (1.0 * callnum / wrd->fcnt)));
+      L1_ohead += BIO_Gamma_Length (wrd->fcnt);
+
+      L2_bits += BIO_Unary_Length (wrd->wcnt);
+      L2_ohead += BIO_Gamma_Length (wrd->wcnt - wrd->fcnt + 1);
+
+      L3_bits += (int) (0.99 + wrd->wcnt *
+		  (1.6 + log2 (1.0 * words_read / (wrd->wcnt + callnum))));
+      L3_ohead += 0;
+
+      /* check for overflow */
+      if (L1_bits + L2_bits < oldL12_bits) {
+	fprintf(stderr, "ERROR: Inverted file size will probably overflow %d byte unsigned integer\n", sizeof (mg_ullong));
+	fprintf(stderr, "       counter in pass 2.\n");
+	if (sizeof (mg_ullong) < 8) {
+	  fprintf(stderr, "       Try compiling with GCC to enable use of 8 bytes for this counter.\n");
+	}
+	fprintf(stderr, "       Build aborted.\n");
+	exit(1);
+      }
+      oldL12_bits = L1_bits + L2_bits;
+    }
+  L3_bits = (L3_bits + L2_bits + L1_bits + 7) / 8;
+  L3_ohead = (L3_ohead + L2_ohead + L1_ohead + 7) / 8;
+  L2_bits = (L2_bits + L1_bits + 7) / 8;
+  L2_ohead = (L2_ohead + L1_ohead + 7) / 8;
+  L1_bits = (L1_bits + 7) / 8;
+  L1_ohead = (L1_ohead + 7) / 8;
+}				/* count_text */
+
+
+
+/*
+ *    write_stem_file():
+ *              writes out the stemmed dictionary file
+ *              in the following format 
+ *                      lookback value (int)
+ *                      totalbytes value (int)
+ *                      indexstringbytes (int)
+ *                      for each word 
+ *                        wordlen (4 bits)
+ *                        prefix match (4 bits)
+ *                        word (wordlen bytes)
+ *                        word frequency (int)
+ *                        word count (int)
+ *
+ *      Accesses outside variables:     
+ *
+ *      Return value...:                
+ */
+
+static void 
+write_stem_file (char *file_name)
+{
+  long j;
+  struct invf_dict_header idh;
+  long lookback = (1 << LOGLOOKBACK);	/* ???? */
+  long totalbytes = 0;		/* The sum of the length of all words, including 
+				   the length byte */
+  long indexstringbytes = 0;	/* The amount of space required to store the 
+				   words in the diction, this takes into account 
+				   the prefixes */
+  u_char *lastword = NULL;	/* A pointer to the last word processed */
+  FILE *sp;
+
+
+  /* Calculate the size of certain things */
+  for (j = 0; j < HashSize; j++)
+    {
+      u_char *word = HashTable[j]->word;
+      indexstringbytes += word[0] + 2;
+      totalbytes += word[0] + 1;
+      if (lastword)
+	indexstringbytes -= prefixlen (lastword, word);
+      lastword = word;
+    }
+
+  lastword = NULL;
+
+  if (!(sp = create_file (file_name, INVF_DICT_SUFFIX, "wb", MAGIC_STEM_BUILD,
+			  MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL2(lookback, idh.lookback);
+  HTONUL2(HashSize, idh.dict_size);
+  HTONUL2(totalbytes, idh.total_bytes);
+  HTONUL2(indexstringbytes, idh.index_string_bytes);
+  HTOND2(inputbytes, idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  HTONUL2(callnum, idh.num_of_docs);
+  HTONUL2(callnum, idh.static_num_of_docs);
+  HTONUL2(words_read, idh.num_of_words);
+  HTONUL2(stemmer_num, idh.stemmer_num);
+  HTONUL2(stem_method, idh.stem_method);
+
+  fwrite ((char *) &idh, sizeof (idh), 1, sp);
+  outputbytes += sizeof (idh);
+
+  for (j = 0; j < HashSize; j++)
+    {
+      int i;
+      unsigned long wcnt, fcnt;  /* [RPAP - Jan 97: Endian Ordering] */
+      hash_rec *ent = HashTable[j];
+      if (lastword != NULL)
+	/* look for prefix match with prev string */
+	i = prefixlen (lastword, ent->word);
+      else
+	i = 0;
+      fputc (i, sp);
+      fputc (ent->word[0] - i, sp);
+      fwrite ((char *) ent->word + i + 1, sizeof (u_char), ent->word[0] - i, sp);
+      outputbytes += ent->word[0] - i + 1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL2(ent->fcnt, fcnt);
+      fwrite ((char *) &(fcnt), sizeof (fcnt), 1, sp);
+
+      outputbytes += sizeof (ent->fcnt);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL2(ent->wcnt, wcnt);
+      fwrite ((char *) &(wcnt), sizeof (wcnt), 1, sp);
+
+      outputbytes += sizeof (ent->wcnt);
+      lastword = ent->word;
+    }
+
+  fclose (sp);
+}				/* write_stem_file() */
+
+
+
+/*
+ *    write_codes():
+ *              calls functions to assign and write out codes and
+ *              then prints out stats about execution results.
+ *
+ *      Accesses outside variables:     z
+ *
+ *      Return value...:                z
+ */
+
+static void 
+write_codes (char *file_name)
+{
+  unsigned long dicts = 0;
+  outputbytes = 0;
+  write_stem_file (file_name);
+  dicts = outputbytes;
+
+#ifndef SILENT
+  Message ("Chunks written      : %d\n",
+	   ChunksWritten);
+  if (InvfLevel == 3)
+    Message ("Paragraphs          : %8d\n", callnum);
+  Message ("Peak memory usage   : %10.1f Mb\n",
+	   (double) MaxMemInUse / 1024.0 / 1024.0);
+  Message ("Stems size          : %10.1f kB  %5.2f%%\n",
+	   (double) dicts / 1024, (double) 100 * dicts / inputbytes);
+  Message ("Lev 1 inverted file : %10.1f kB  %5.2f%%\n",
+	   (double) (L1_bits + L1_ohead) / 1024,
+	   (double) 100 * (L1_bits + L1_ohead) / inputbytes);
+  Message ("Lev 2 inverted file : %10.1f kB  %5.2f%%\n",
+	   (double) (L2_bits + L2_ohead) / 1024,
+	   (double) 100 * (L2_bits + L2_ohead) / inputbytes);
+  Message ("Lev 3 inverted file : %10.1f kB  %5.2f%%\n",
+	   (double) (L3_bits + L3_ohead) / 1024,
+	   (double) 100 * (L3_bits + L3_ohead) / inputbytes);
+  Message ("Record addresses    : %10.1f kB  %5.2f%%\n",
+	   (double) words_diff * 4 / 1024, (double) 100 * words_diff * 4 / inputbytes);
+#endif
+}				/* write_codes() */
+
+
+
+void 
+write_num_file (char *file_name)
+{
+
+  int i;
+  FILE *f;
+
+  for (i = 0; i < HashSize; i++)
+    HashTable[i]->fnum = i;
+
+  if (!(f = create_file (file_name, INVF_CHUNK_TRANS_SUFFIX, "wb",
+			 MAGIC_CHUNK_TRANS, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return;
+
+#if 1
+  ENCODE_START (f)
+
+    for (i = 0; i < HashSize; i++)
+    BINARY_ENCODE (first_occr[i]->fnum + 1, HashSize + 1);
+
+  ENCODE_DONE;
+#else
+  for (i = 0; i < HashSize; i++)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      unsigned long fnum;
+      HTONUL2(first_occur[i]->fnum, fnum);
+      fwrite ((char *) &fnum, sizeof (unsigned long), 1, f);
+    }
+#endif
+
+  fclose (f);
+}
+
+
+
+
+int 
+done_ivf_1 (char *FileName)
+{
+  char *temp_str = msg_prefix;
+  msg_prefix = "ivf.pass1";
+#ifndef SILENT
+  Message ("Mem reqd for 1 chunk: %8u bytes\n",
+	   max_mem_reqd ());
+#endif
+  if (lcallnum)
+    dump_dict (mem_reqd ());
+
+  if (PackHashTable () == COMPERROR)
+    return COMPERROR;
+
+  qsort (HashTable, HashUsed, sizeof (hash_rec *), ent_comp);
+
+  count_text ();
+  write_codes (FileName);
+
+  ENCODE_CONTINUE (sbs)
+    GAMMA_ENCODE (1);
+  ENCODE_DONE
+    fseek (ic, sizeof (long), 0);
+  
+  HTONSL(max_mem);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&max_mem, sizeof (max_mem), 1, ic);
+  NTOHSL(max_mem);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  fclose (ic);
+
+  write_num_file (FileName);
+
+  msg_prefix = temp_str;
+
+  return (COMPALLOK);
+}				/* done_encode */
Index: /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass2.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass2.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/ivf.pass2.c	(revision 21083)
@@ -0,0 +1,1145 @@
+/**************************************************************************
+ *
+ * ivf.pass2.c -- Memory efficient pass 2 inversion
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.2  2001/09/21 12:46:42  kjm18
+   updated mg to be in line with mg_1.3f. Now uses long long for some variables
+   to enable indexing of very large collections.
+
+ * Revision 1.2  1997/08/02  05:01:57  wew
+ * changed literal values of 32 for the bit size of magic numbers of
+ * files to sizeof (unsigned long) * 8, increased the gap at the start
+ * of the invf during processing to 200 bytes
+
+   Revision 1.1  1999/08/10 21:17:54  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1998/12/17 09:12:51  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:43  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:45  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:49  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:35  tes
+   * For version 1.1
+   *
+ */
+
+/*
+ *  Modified:
+ *   - long long disk pointers and bit counts for inverted file
+ *     (1999-08-03 Tim Bell <bhat@cs.mu.oz.au>)
+ *     Code provided by Owen de Kretser <oldk@cs.mu.oz.au>
+ */
+
+static char *RCSID = "$Id$";
+
+#include "local_strings.h"
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "stemmer.h"
+#include "perf_hash.h"
+#include "bitio_m.h"
+#include "bitio_m_mems.h"
+#include "bitio_gen.h"
+#include "bitio_random.h"
+#include "bitio_stdio.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "locallib.h"
+#include "mg.h"
+#include "build.h"
+#include "words.h"
+#include "hash.h"
+
+#include "longlong.h"
+
+#ifdef USE_LONG_LONG
+#define BIO_Random_Seek_X BIO_Random_Seek_LL
+#define BIO_Random_Tell_X BIO_Random_Tell_LL
+#else
+#define BIO_Random_Seek_X BIO_Random_Seek
+#define BIO_Random_Tell_X BIO_Random_Tell
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+#include <io.h>
+#endif
+
+#ifndef RND_BUF_SIZE
+#define RND_BUF_SIZE 8*1024
+/*#define RND_BUF_SIZE 128 */
+#endif
+
+#define print_fsize(file)\
+do\
+  {\
+    struct stat file_state;\
+    fstat(fileno(invf_out), &file_state);\
+    Message("len(invf) = %ld", file_state.st_size);\
+  }while(0)
+
+typedef struct word_rec
+  {
+    unsigned long ptr;
+    unsigned long last;
+  }
+word_rec;
+
+typedef struct invf_state_rec
+  {
+    mg_ullong Disk_Ptr;
+    mg_ullong Disk_Last;
+    unsigned long Disk_B;
+  }
+invf_state_rec;
+
+typedef struct chunk
+  {
+    unsigned long start_doc;
+    unsigned long params_pos;
+    unsigned long disk_pos;
+    unsigned long N;
+  }
+chunk;
+
+
+static FILE *dict;		/* Stemmed dictionary file */
+static FILE *hash;		/* Stemmed dictionary hash file */
+static FILE *invf;		/* Inverted file */
+static FILE *invf_in;		/* Inverted file */
+static FILE *invf_out;		/* Inverted file */
+static FILE *invf_idx;		/* Inverted index file */
+static FILE *count;		/* Count file */
+static FILE *count_trans;	/* Count translation file */
+static FILE *invf_state;	/* Inverted file State */
+static FILE *chunk_state;	/* Chunk state */
+static FILE *chunks;		/* Chunk state */
+static FILE *invf_para = NULL;	/* Paragraph counts file */
+static FILE *weights = NULL;	/* Weights file */
+
+static stdio_bitio_state sbs;
+static random_bitio_state crbs;
+static chunk *chunk_data = NULL;
+static random_bitio_state rbs, rbsp;
+
+static int docs_left = 0, next_docs_left = 0;
+static unsigned long N;
+
+static word_rec *WordRecs;
+static u_char *lg_bs;
+static float *idf = NULL;
+
+static char *MemoryBuffer = NULL;
+static unsigned long MemBufSize;
+static unsigned long BufToUse;
+static struct invf_dict_header idh;
+
+static perf_hash_data *phd;
+
+static unsigned long *word_list = NULL;
+static unsigned long wl_size = 0;
+
+static unsigned long dict_size;
+static unsigned long no_of_ptrs = 0;
+static unsigned long chunks_read = 0;
+static unsigned long Disk_pos = 0;
+static unsigned long callnum = 0;
+static unsigned long wordnum = 0;
+
+static unsigned long totalIbytes = 0;
+static unsigned long totalDbytes = 0;
+static unsigned long totalHbytes = 0;
+
+static unsigned long MemInUse = 0;
+static unsigned long MaxMemInUse = 0;
+static unsigned long max_buffer_len;
+
+void 
+ChangeMemInUse (int mem)
+{
+  MemInUse += mem;
+  if (MemInUse > MaxMemInUse)
+    MaxMemInUse = MemInUse;
+}
+
+
+
+
+static int 
+open_files (char *file_name)
+{
+  char FName[200];
+
+  if (!(dict = open_file (file_name, INVF_DICT_SUFFIX, "rb",
+			  MAGIC_STEM_BUILD, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+
+  if (!(hash = open_file (file_name, INVF_DICT_HASH_SUFFIX, "rb",
+			  MAGIC_HASH, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+
+  if (!(count = open_file (file_name, INVF_CHUNK_SUFFIX, "rb",
+			   MAGIC_CHUNK, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+  fread (&max_buffer_len, sizeof (max_buffer_len), 1, count);
+  NTOHUL(max_buffer_len);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  BIO_Stdio_Decode_Start (count, &sbs);
+  next_docs_left = BIO_Stdio_Gamma_Decode (&sbs, NULL) - 1;
+
+  if (!(count_trans = open_file (file_name, INVF_CHUNK_TRANS_SUFFIX, "rb",
+				 MAGIC_CHUNK_TRANS, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+
+  if (!(invf = create_file (file_name, INVF_SUFFIX, "w+b",
+			    MAGIC_INVF, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+  fflush (invf);
+  if (!(invf_in = open_file (file_name, INVF_SUFFIX, "rb",
+			     MAGIC_INVF, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+  if (!(invf_out = create_file (file_name, INVF_SUFFIX, "wb",
+				MAGIC_INVF, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+  BIO_Random_Start (invf, RND_BUF_SIZE, &rbs);
+  BIO_Random_Start (invf, RND_BUF_SIZE, &rbsp);
+  ChangeMemInUse (RND_BUF_SIZE * 2);
+
+  if (!(invf_idx = create_file (file_name, INVF_IDX_SUFFIX, "wb",
+				MAGIC_INVI, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return (COMPERROR);
+
+  if (InvfLevel == 3)
+    if (!(invf_para = create_file (file_name, INVF_PARAGRAPH_SUFFIX, "wb",
+				   MAGIC_PARAGRAPH, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+      return (COMPERROR);
+
+  sprintf (FName, FILE_NAME_FORMAT ".%ld", get_basepath (), file_name,
+	   ".invf.state", (long) getpid ());  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(invf_state = fopen (FName, "w+b")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      Message ("Unable to create \"%s\"", FName);
+      return (COMPERROR);
+    }
+  unlink (FName);
+
+  sprintf (FName, FILE_NAME_FORMAT ".%ld", get_basepath (), file_name,
+	   ".chunk.state", (long) getpid ());  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(chunk_state = fopen (FName, "w+b")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      Message ("Unable to create \"%s\"", FName);
+      return (COMPERROR);
+    }
+  unlink (FName);
+  BIO_Random_Start (chunk_state, RND_BUF_SIZE, &crbs);
+  ChangeMemInUse (RND_BUF_SIZE);
+
+  sprintf (FName, FILE_NAME_FORMAT ".%ld", get_basepath (), file_name,
+	   ".chunks", (long) getpid ());  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(chunks = fopen (FName, "w+b")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      Message ("Unable to create \"%s\"", FName);
+      return (COMPERROR);
+    }
+  unlink (FName);
+
+  return (COMPALLOK);
+}
+
+
+
+
+
+#define ISR_CACHE 1024
+#define ISR_ENTRY_SIZE (sizeof(mg_ullong)*2 + sizeof(unsigned long))
+
+invf_state_rec *
+in_cache (int pos)
+{
+  static char isr_data[ISR_CACHE * ISR_ENTRY_SIZE];
+  static invf_state_rec isr;
+  static int isr_base = 0, isr_num = -1, isr_pos = -1;
+  if (isr_pos >= 0)
+    bcopy ((char *) &isr, &isr_data[isr_pos * ISR_ENTRY_SIZE], ISR_ENTRY_SIZE);
+  if (pos < isr_base || pos >= isr_base + isr_num)
+    {
+      if (isr_num >= 0)
+	{
+	  fseek (invf_state, isr_base * ISR_ENTRY_SIZE, 0);
+	  fwrite (isr_data, 1, ISR_ENTRY_SIZE * isr_num, invf_state);
+	}
+      isr_base = pos;
+      fseek (invf_state, isr_base * ISR_ENTRY_SIZE, 0);
+      fread (isr_data, 1, ISR_ENTRY_SIZE * ISR_CACHE, invf_state);
+      isr_num = ISR_CACHE;
+    }
+  isr_pos = pos - isr_base;
+  bcopy (&isr_data[isr_pos * ISR_ENTRY_SIZE], (char *) &isr, ISR_ENTRY_SIZE);
+  return &isr;
+}
+
+
+
+
+
+unsigned long 
+occur_to_lexical (long occ)
+{
+  static long pos = -1;
+  static random_bitio_state rbs;
+  static int val = 0;
+  if (pos == -1)
+    {
+      BIO_Random_Start (count_trans, RND_BUF_SIZE, &rbs);
+      pos = 0x7fffffff;
+    }
+  if (occ < pos)
+    {
+      if (occ == -1)
+	{
+	  BIO_Random_Done (&rbs);
+	  return 0;
+	}
+      BIO_Random_Seek_X (sizeof (unsigned long) * 8, &rbs);
+      pos = 0;
+    }
+  while (pos <= occ)
+    {
+      val = BIO_Random_Binary_Decode (dict_size + 1, &rbs, NULL) - 1;
+      pos++;
+    }
+  return (val);
+}
+
+
+void 
+add_chunk_state (unsigned long pos, unsigned long start_doc,
+		 unsigned long N)
+{
+  chunk_data[chunks_read].params_pos = pos;
+  chunk_data[chunks_read].start_doc = start_doc;
+  chunk_data[chunks_read].N = N;
+  chunks_read++;
+}
+
+
+int 
+init_ivf_2 (char *file_name)
+{
+  u_char prev[MAXSTEMLEN + 1];
+  int i;
+  mg_ullong totalIbits;
+  mg_ullong lasttotalIbits;
+  double logN = 0.0;
+
+  
+  if (open_files (file_name) == COMPERROR)
+    return COMPERROR;
+
+
+  /* Read in the stemmed dictionary file header */
+  fread ((char *) &idh, sizeof (idh), 1, dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  dict_size = idh.dict_size;
+
+  N = idh.num_of_docs;
+
+  if (!(phd = read_perf_hash_data (hash)))
+    {
+      Message ("Unable to read in hash data");
+      return COMPERROR;
+    }
+  totalHbytes = sizeof (perf_hash_data) + sizeof (u_char) * 256 +
+    sizeof (int) * (phd->MAX_N + 1) + sizeof (int *) * 3 * phd->MAX_CH +
+    sizeof (long) * phd->MAX_CH * phd->MAX_L;
+
+  if (!(WordRecs = Xmalloc (sizeof (word_rec) * idh.dict_size)))
+    {
+      Message ("No memory for word entries");
+      return COMPERROR;
+    }
+  totalDbytes += sizeof (word_rec) * idh.dict_size;
+
+  /* separate storage for the log(b) values, one byte each */
+  if (!(lg_bs = Xmalloc (sizeof (u_char) * idh.dict_size)))
+    {
+      Message ("No memory for lg b's");
+      return COMPERROR;
+    }
+  totalDbytes += sizeof (u_char) * idh.dict_size;
+
+  if (MakeWeights)
+    {
+      /* separate storage for the idf values, one single each */
+      if (!(idf = Xmalloc (sizeof (float) * idh.dict_size)))
+	{
+	  Message ("No memory for idf's");
+	  return COMPERROR;
+	}
+      totalDbytes += sizeof (float) * idh.dict_size;
+
+      if (!(weights = create_file (file_name, WEIGHTS_SUFFIX, "wb",
+				 MAGIC_WGHT, MG_CONTINUE))) { /* [RPAP - Feb 97: WIN32 Port] */
+	Message ("Couldn't open weights file for writing");
+	return (COMPERROR);
+      }
+    }
+  else
+    {
+      unlink (make_name (file_name, WEIGHTS_SUFFIX, NULL));
+    }
+
+  chunk_data = Xmalloc (sizeof (chunk) * (ChunkLimit + 2));
+  totalDbytes += sizeof (chunk) * (ChunkLimit + 2);
+
+  totalIbits = sizeof (unsigned long) * 8;		/* The magic number */
+  totalIbits += 8 * 200;	/* A 200 byte gap */
+
+  if (MakeWeights)
+    {
+      wl_size = 1024;
+      if (!(word_list = Xmalloc (sizeof (*word_list) * wl_size)))
+	{
+	  Message ("No memory for word_list");
+	  return COMPERROR;
+	}
+
+      logN = log ((double) N);
+    }
+
+  for (i = 0; i < idh.dict_size; i++)
+    {
+      invf_state_rec *isr;
+      register unsigned long copy, suff, p;
+      unsigned long fcnt, wcnt;
+
+      lasttotalIbits = totalIbits;
+      
+      copy = fgetc (dict);
+      suff = fgetc (dict);
+      *prev = copy + suff;
+      fread (prev + copy + 1, sizeof (u_char), suff, dict);
+
+      fread ((char *) &fcnt, sizeof (fcnt), 1, dict);
+      fread ((char *) &wcnt, sizeof (wcnt), 1, dict);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      WordRecs[i].last = 0;
+      WordRecs[i].ptr = 0;
+
+      p = fcnt;
+
+      if (MakeWeights)
+	idf[i] = logN - log ((double) fcnt);
+
+
+      isr = in_cache (i);
+
+      isr->Disk_Last = 0;
+      isr->Disk_Ptr = totalIbits;
+
+      isr->Disk_B = BIO_Bblock_Init (N, p);
+
+      totalIbits += BIO_Bblock_Bound_b (N, p, isr->Disk_B);
+
+      if (InvfLevel >= 2)
+	totalIbits += BIO_Gamma_Bound (wcnt, fcnt);
+
+#ifdef USE_LONG_LONG
+      totalIbits = (totalIbits + 7ull) & 0xfffffffffffffff8ull;
+#else
+      totalIbits = (totalIbits + 7ul) & 0xfffffff8ul;
+#endif
+
+      if (totalIbits < lasttotalIbits) {
+	fprintf(stderr, "ERROR: The totalIbits counter (%d byte unsigned integer) has overflowed.\n", sizeof (mg_ullong));
+	if (sizeof (mg_ullong) < 8) {
+	  fprintf(stderr, "       Try compiling with GCC to enable use of 8 bytes for this counter.\n");
+	}
+	fprintf(stderr, "       Build aborted.\n");
+	exit(1);
+      }
+    }
+
+
+  /* now convert to bytes, and actually get the space */
+#ifdef USE_LONG_LONG
+  totalIbytes = (totalIbits + 7ull) >> 3ull;
+#else
+  totalIbytes = (totalIbits + 7ul) >> 3ul;
+#endif
+
+  return (COMPALLOK);
+
+}
+
+
+
+
+
+static void 
+LoadCounts (void)
+{
+  unsigned long numwords, i, last_total;
+  static unsigned long local_N = 0;
+  unsigned long totalIbits, crbs_pos;
+  word_rec *wr;
+  unsigned long *counts;
+
+  if (MemoryBuffer == NULL)
+    {
+      MemBufSize = sizeof (unsigned long) * dict_size;
+      if (max_buffer_len > MemBufSize)
+	MemBufSize = max_buffer_len;
+      if (!(MemoryBuffer = Xmalloc (MemBufSize)))
+	FatalError (1, "Unable to allocate memory for buffer");
+      ChangeMemInUse (MemBufSize);
+    }
+
+  counts = (unsigned long *) MemoryBuffer;
+  bzero ((char *) counts, sizeof (unsigned long) * dict_size);
+
+  docs_left = next_docs_left;
+  if (!docs_left)
+    FatalError (1, "The number of docs in the current chunk is 0");
+
+  BufToUse = BIO_Stdio_Gamma_Decode (&sbs, NULL) - 1;
+
+  numwords = BIO_Stdio_Gamma_Decode (&sbs, NULL) - 1;
+
+  local_N = docs_left;
+
+
+
+  for (wr = WordRecs, i = 0; i < dict_size; i++, wr++)
+    wr->ptr = 0;
+
+  bzero ((char *) lg_bs, dict_size);
+
+  for (i = 0; i < numwords; i++)
+    {
+      unsigned long word_num, wcnt, fcnt, p;
+      word_num = occur_to_lexical (i);
+
+      wr = &WordRecs[word_num];
+
+      wcnt = BIO_Stdio_Gamma_Decode (&sbs, NULL) - 1;
+      if (wcnt >= 2)
+	fcnt = BIO_Stdio_Gamma_Decode (&sbs, NULL);
+      else
+	fcnt = wcnt;
+
+      p = fcnt;
+
+      if (wcnt)
+	{
+	  register unsigned long length;
+	  counts[word_num] = p;
+	  length = BIO_Bblock_Bound (local_N, p);
+	  if (InvfLevel >= 2)
+	    length += wcnt;
+	  wr->ptr = length;
+	  lg_bs[word_num] = floorlog_2 (BIO_Bblock_Init_W (local_N, p));
+	}
+
+    }
+
+  crbs_pos = BIO_Random_Tell (&crbs);
+
+  totalIbits = 0;
+  last_total = 0;
+  for (wr = WordRecs, i = 0; i < dict_size; i++, wr++)
+    {
+      register unsigned long length;
+      length = wr->ptr;
+      wr->last = callnum;
+      BIO_Random_Gamma_Encode (counts[i] + 1, &crbs, NULL);
+      if (counts[i])
+	{
+	  if (i)
+	    BIO_Random_Delta_Encode (totalIbits - last_total + 1, &crbs, NULL);
+	  else
+	    BIO_Random_Delta_Encode (1, &crbs, NULL);
+
+	  last_total = totalIbits;
+	}
+      wr->ptr = totalIbits;
+      totalIbits += length;
+    }
+  add_chunk_state (crbs_pos, callnum, local_N);
+
+  if ((totalIbits + 7ul) >> 3ul > BufToUse)
+    FatalError (1, "Pointers exceed buffer size");
+
+  next_docs_left = BIO_Stdio_Gamma_Decode (&sbs, NULL) - 1;
+}
+
+
+
+
+static void 
+DumpChunk (void)
+{
+  chunk_data[chunks_read - 1].disk_pos = Disk_pos << 3;
+  fseek (chunks, Disk_pos, 0);
+  fwrite (MemoryBuffer, sizeof (char), BufToUse, chunks);
+  Disk_pos += BufToUse;
+}
+
+
+
+
+static void 
+DiskMerge (void)
+{
+  random_bitio_state *rbsi;
+  random_bitio_state *chks = NULL;
+  unsigned long *chunk_ptrs;
+  int i;
+
+  BIO_Random_Flush (&crbs);
+
+  chunk_ptrs = Xmalloc (chunks_read * sizeof (unsigned long));
+  ChangeMemInUse (chunks_read * sizeof (unsigned long));
+  bzero ((char *) chunk_ptrs, chunks_read * sizeof (unsigned long));
+
+  rbsi = Xmalloc (chunks_read * sizeof (random_bitio_state));
+  ChangeMemInUse (chunks_read * sizeof (random_bitio_state));
+  for (i = 0; i < chunks_read; i++)
+    {
+      rbsi[i] = crbs;
+      rbsi[i].Buf = Xmalloc (rbsi[i].len);
+      ChangeMemInUse (rbsi[i].len);
+      bcopy ((char *) (crbs.Buf), (char *) (rbsi[i].Buf), rbsi[i].len);
+      BIO_Random_Seek (chunk_data[i].params_pos, &rbsi[i]);
+    }
+
+  if (chunks_read > 1)
+    {
+      int j;
+      chks = Xmalloc ((chunks_read - 1) * sizeof (random_bitio_state));
+      ChangeMemInUse ((chunks_read - 1) * sizeof (random_bitio_state));
+      BIO_Random_Start (chunks, RND_BUF_SIZE, &chks[0]);
+      ChangeMemInUse (RND_BUF_SIZE);
+      for (j = 1; j < chunks_read - 1; j++)
+	{
+	  chks[j] = chks[0];
+	  chks[j].Buf = Xmalloc (chks[0].len);
+	  ChangeMemInUse (chks[0].len);
+	  bcopy ((char *) (chks[0].Buf), (char *) (chks[j].Buf), chks[0].len);
+	}
+    }
+  for (i = 0; i < dict_size; i++)
+    {
+      int j;
+      invf_state_rec *isr = in_cache (i);
+      register int B;
+
+      BIO_Random_Seek_X (isr->Disk_Ptr, &rbs);	/* Position in invf file */
+
+      B = isr->Disk_B;
+
+      for (j = 0; j < chunks_read; j++)
+	{
+	  int p;
+	  p = BIO_Random_Gamma_Decode (&rbsi[j], NULL) - 1;
+
+	  if (p)
+	    {
+	      int ptr, b;
+	      chunk_ptrs[j] += BIO_Random_Delta_Decode (&rbsi[j], NULL) - 1;
+	      ptr = chunk_ptrs[j];
+	      b = 1 << floorlog_2 (BIO_Bblock_Init_W (chunk_data[j].N, p));
+
+	      if (j == chunks_read - 1)
+		{
+		  int k, CurrDoc;
+		  DECODE_START ((u_char *) MemoryBuffer, ptr)
+		    CurrDoc = isr->Disk_Last;
+		  for (k = 0; k < p; k++)
+		    {
+		      register unsigned long x, tf;
+		      BBLOCK_DECODE (x, b);
+		      if (k == 0)
+			x = x + chunk_data[j].start_doc - isr->Disk_Last;
+		      CurrDoc += x;
+		      BIO_Random_Bblock_Encode (x, B, &rbs, NULL);
+		      if (InvfLevel >= 2)
+			{
+			  UNARY_DECODE (tf);
+			  BIO_Random_Gamma_Encode (tf, &rbs, NULL);
+			}
+		    }
+		  DECODE_DONE
+		    isr->Disk_Last = CurrDoc;
+		}
+	      else
+		{
+		  int k, CurrDoc;
+		  random_bitio_state *Chks = chks + j;
+		  BIO_Random_Seek (chunk_data[j].disk_pos + ptr, Chks);
+		  CurrDoc = isr->Disk_Last;
+		  for (k = 0; k < p; k++)
+		    {
+		      register unsigned long x, tf;
+		      x = BIO_Random_Bblock_Decode (b, Chks, NULL);
+		      if (k == 0)
+			x = x + chunk_data[j].start_doc - isr->Disk_Last;
+		      CurrDoc += x;
+		      BIO_Random_Bblock_Encode (x, B, &rbs, NULL);
+		      if (InvfLevel >= 2)
+			{
+			  tf = BIO_Random_Unary_Decode (Chks, NULL);
+			  BIO_Random_Gamma_Encode (tf, &rbs, NULL);
+			}
+		    }
+		  isr->Disk_Last = CurrDoc;
+		}
+	    }
+	}
+
+      isr->Disk_Ptr = BIO_Random_Tell_X (&rbs);
+
+    }
+  if (chunks_read > 1)
+    {
+      int j;
+      for (j = 0; j < chunks_read - 1; j++)
+	{
+	  Xfree (chks[j].Buf);
+	  ChangeMemInUse (-chks[j].len);
+	}
+      Xfree (chks);
+      ChangeMemInUse (-(chunks_read - 1) * sizeof (random_bitio_state));
+    }
+
+  for (i = 0; i < chunks_read; i++)
+    {
+      Xfree (rbsi[i].Buf);
+      ChangeMemInUse (-rbsi[i].len);
+    }
+  Xfree (rbsi);
+  ChangeMemInUse (-chunks_read * sizeof (random_bitio_state));
+  chunks_read = 0;
+  Xfree (chunk_ptrs);
+  ChangeMemInUse (-chunks_read * sizeof (unsigned long));
+  Disk_pos = 0;
+  BIO_Random_Seek (0, &crbs);
+}
+
+static void 
+MergeIn (void)
+{
+  static int disk_chunks = 0;
+  static header = 0;
+  if (!header)
+    {
+      fprintf (stderr, "ivf.pass2 : ");
+      header = 1;
+    }
+  if (disk_chunks == ChunkLimit || next_docs_left == 0)
+    {
+      fprintf (stderr, "M");
+      DiskMerge ();
+      disk_chunks = 0;
+    }
+  else
+    {
+      fprintf (stderr, "-");
+      DumpChunk ();
+      disk_chunks++;
+    }
+  if (next_docs_left == 0)
+    fprintf (stderr, "\n");
+}
+
+
+static int 
+wl_comp (const void *a, const void *b)
+{
+  return *((int *) a) - *((int *) b);
+}
+
+static int 
+process_doc (u_char * s_in, int l_in)
+{
+  int res;
+  u_char *end = s_in + l_in - 1;
+  unsigned long tocode;
+  unsigned long wl_pos = 0;
+
+  if (!docs_left)
+    LoadCounts ();
+
+  callnum++;
+
+  if (!inaword (s_in, end))
+    if (SkipSGML)
+      PARSE_NON_STEM_WORD_OR_SGML_TAG (s_in, end);
+    else
+      PARSE_NON_STEM_WORD (s_in, end);
+
+  while (s_in <= end)
+    {
+      u_char Word[MAXSTEMLEN + 1];
+
+      PARSE_STEM_WORD (Word, s_in, end);
+      stemmer (idh.stem_method, idh.stemmer_num, Word);
+      if (SkipSGML)
+	PARSE_NON_STEM_WORD_OR_SGML_TAG (s_in, end);
+      else
+	PARSE_NON_STEM_WORD (s_in, end);
+
+      if (*Word == 0)
+	continue;
+
+      res = perf_hash (phd, Word);
+
+      {
+	word_rec *arr = &WordRecs[res];
+	int b = 1 << lg_bs[res];
+	wordnum++;
+
+	tocode = callnum;
+
+	ENCODE_START ((u_char *) MemoryBuffer, arr->ptr)
+
+	  if (tocode > arr->last)
+	  {
+	    register int x;
+	    x = tocode - arr->last - 1;
+	    BBLOCK_ENCODE (x + 1, b);
+	    if (InvfLevel >= 2)
+	      ENCODE_BIT (1);
+	    no_of_ptrs++;
+	    arr->last = tocode;
+	  }
+	else if (InvfLevel >= 2)
+	  {
+	    __pos--;
+	    ENCODE_BIT (0);
+	    ENCODE_BIT (1);
+	  }
+	arr->ptr = __pos;
+	ENCODE_DONE
+      }
+
+      if (MakeWeights)
+	{
+	  if (wl_pos >= wl_size)
+	    {
+	      wl_size += (wl_size >> 1);
+	      word_list = Xrealloc (word_list, sizeof (*word_list) * wl_size);
+	    }
+	  word_list[wl_pos++] = res;
+	}
+    }
+  if (MakeWeights)
+    {
+      float doc_weight = 0.0;
+      if (wl_pos)
+	{
+	  unsigned long *wl = word_list;
+	  unsigned long i, count, val;
+	  qsort (wl, wl_pos, sizeof (*wl), wl_comp);
+	  count = 1;
+	  val = *wl++;
+	  for (i = 1; i <= wl_pos; i++, wl++)
+	    if (i == wl_pos || val != *wl)
+	      {
+		double weight = count * idf[val];
+		doc_weight += weight * weight;
+		count = 1;
+		val = *wl;
+	      }
+	    else
+	      count++;
+	}
+      HTONF(doc_weight);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite ((char *) &doc_weight, sizeof (doc_weight), 1, weights);
+    }
+  docs_left--;
+  if (!docs_left)
+    MergeIn ();
+
+  return COMPALLOK;
+}
+
+int 
+process_ivf_2 (u_char * s_in, int l_in)
+{
+  if (InvfLevel <= 2)
+    return process_doc (s_in, l_in);
+  else
+    {
+      int count = 0;
+      int pos = 0;
+      u_char *start = s_in;
+      while (pos < l_in)
+	{
+	  if (s_in[pos] == TERMPARAGRAPH)
+	    {
+	      int len = pos + s_in + 1 - start;
+	      if (process_doc (start, len) != COMPALLOK)
+		return (COMPERROR);
+	      start = s_in + pos + 1;
+	      count++;
+	    }
+	  pos++;
+	}
+      if (start < s_in + pos)
+	{
+	  if (process_doc (start, pos + s_in - start) != COMPALLOK)
+	    return (COMPERROR);
+	  count++;
+	}
+      HTONSI(count);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite ((char *) &count, sizeof (count), 1, invf_para);
+    }
+  return COMPALLOK;
+}
+
+
+
+
+
+static void 
+stats (unsigned long len)
+{
+#ifndef SILENT
+  fseek (count, 0, 2);
+  fseek (count_trans, 0, 2);
+  fseek (invf_state, 0, 2);
+  fseek (invf, 0, 0);
+  fseek (invf, 0, 2);
+  fseek (chunks, 0, 2);
+  fseek (chunk_state, 0, 2);
+  Message ("File sizes\n");
+  Message ("  Chunk desc    : %10u bytes\n", ftell (count));
+  Message ("  Chunk trans   : %10u bytes\n", ftell (count_trans));
+  Message ("  Chunks        : %10u bytes\n", ftell (chunks));
+  Message ("  Chunk state   : %10u bytes\n", ftell (chunk_state));
+  Message ("  Invf state    : %10u bytes\n", ftell (invf_state));
+  Message ("  Peak invf     : %10u bytes\n", len);
+  Message ("  Final invf    : %10u bytes\n", ftell (invf));
+  Message ("Peak disk usage : %10.2f %%\n",
+	   (double) (ftell (count) + ftell (count_trans) +
+		     ftell (invf_state) + ftell (chunks) +
+		     ftell (chunk_state) + len) / ftell (invf) * 100.0);
+#endif
+}
+
+
+/* ARGSUSED */
+int 
+done_ivf_2 (char *FileName)
+{
+  long i;
+  mg_ullong totalIbits;
+  unsigned long invf_len;
+  unsigned long bytes_output;
+  struct invf_file_header ifh;
+
+  if (weights)
+    fclose (weights);
+  if (invf_para)
+    fclose (invf_para);
+
+  free_perf_hash (phd);
+
+  free (MemoryBuffer);
+  ChangeMemInUse (-MemBufSize);
+
+  BIO_Random_Done (&rbs);
+  BIO_Random_Done (&rbsp);
+  fflush (invf);
+
+  fseek (invf, 0, 2);
+  invf_len = ftell (invf);
+
+  fseek (invf_out, sizeof (long), 0);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL2(dict_size, ifh.no_of_words);
+  HTONUL2(no_of_ptrs, ifh.no_of_ptrs);
+  ifh.skip_mode = 0;
+  bzero ((char *) ifh.params, sizeof (ifh.params));
+  HTONUL2(InvfLevel, ifh.InvfLevel);
+  fwrite ((char *) &ifh, sizeof (ifh), 1, invf_out);
+
+  bytes_output = ftell (invf_out);
+
+  totalIbits = sizeof (unsigned long) * 8;		/* The magic number */
+  totalIbits += 8 * 200;	/* A 200 byte gap */
+
+  /* find the right place in the file to start reading p values */
+  fseek (dict, sizeof (unsigned long) + sizeof (struct invf_dict_header), 0);
+  for (i = 0; i < dict_size; i++)
+    {
+      invf_state_rec *isr;
+      unsigned long fcnt, wcnt, s, e;
+      register unsigned long p;
+      u_char dummy1, dummy2[MAXSTEMLEN + 1];
+
+      /* output location to the invf_idx  */
+      HTONUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite ((char *) &bytes_output, sizeof (bytes_output), 1, invf_idx);
+      NTOHUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+
+      /* read an entry for a word, just to get p value */
+      dummy1 = fgetc (dict);
+      dummy1 = fgetc (dict);
+      fread (dummy2, sizeof (u_char), dummy1, dict);
+      fread ((char *) &fcnt, sizeof (fcnt), 1, dict);
+      fread ((char *) &wcnt, sizeof (wcnt), 1, dict);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      p = fcnt;
+
+      isr = in_cache (i);
+
+      e = (isr->Disk_Ptr + 7ul) >> 3ul;
+      s = totalIbits >> 3;
+
+      fseek (invf_in, s, 0);
+      while (s < e)
+	{
+	  u_char c = getc (invf_in);
+	  if (s == e - 1)
+	    {
+	      u_char ands[8] =
+	      {0xff, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
+	      c &= ands[isr->Disk_Ptr & 7ul];
+	    }
+	  putc (c, invf_out);
+	  bytes_output++;
+	  s++;
+	}
+
+      totalIbits += BIO_Bblock_Bound_b (N, p, isr->Disk_B);
+      if (InvfLevel >= 2)
+	totalIbits += BIO_Gamma_Bound (wcnt, fcnt);
+#ifdef USE_LONG_LONG
+      totalIbits = (totalIbits + 7ull) & 0xfffffffffffffff8ull;
+#else
+      totalIbits = (totalIbits + 7ul) & 0xfffffff8ul;
+#endif
+
+    }
+
+  fclose (invf_in);
+
+  /* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  if (!(_chsize (_fileno (invf_out), bytes_output)))
+    Message ("Could not truncate invf.");
+#else
+  ftruncate (fileno (invf_out), bytes_output);
+#endif
+
+  fclose (invf_out);
+
+  HTONUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite ((char *) &bytes_output, sizeof (bytes_output), 1, invf_idx);
+  NTOHUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  fclose (invf_idx);
+
+#ifndef SILENT
+  {
+    char *temp_str = msg_prefix;
+    unsigned long total;
+    msg_prefix = "ivf.pass2";
+    stats (invf_len);
+    Message ("Pass two data structures      : %6.3f Mbyte\n",
+	     (double) totalDbytes / 1024 / 1024);
+    total = totalDbytes;
+    Message ("Pass two hash structure(s)    : %6.3f Mbyte\n",
+	     (double) totalHbytes / 1024 / 1024);
+    total += totalHbytes;
+    Message ("Peak extra memory in use      : %6.3f Mbyte\n",
+	     (double) MaxMemInUse / 1024 / 1024);
+    total += MaxMemInUse;
+    Message ("Peak total memory in use      : %6.3f Mbyte\n",
+	     (double) total / 1024 / 1024);
+    msg_prefix = temp_str;
+  }
+#endif
+
+  Xfree (WordRecs);
+  Xfree (lg_bs);
+
+  /* Free the memory allocated for the BIO_Random */
+  occur_to_lexical (-1);
+
+  BIO_Random_Done (&crbs);
+
+  fclose (invf);
+  fclose (dict);
+  fclose (hash);
+  fclose (count);
+  fclose (count_trans);
+  fclose (chunk_state);
+  fclose (chunks);
+  fclose (invf_state);
+  return (COMPALLOK);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/lists.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/lists.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/lists.c	(revision 21083)
@@ -0,0 +1,214 @@
+/**************************************************************************
+ *
+ * lists.c -- List processing functions for boolean queries
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+
+#include "lists.h"
+#include "local_strings.h"
+#include "locallib.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:01  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1999/07/01 09:30:48  rjmcnab
+   Changes for better match reporting.
+
+   Revision 1.1  1998/11/17 09:34:47  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:50  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:37  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+
+
+/*
+ * Make a DocList large enough to hold num entries 
+ */
+DocList *
+MakeDocList (int num)
+{
+  DocList *d;
+  if (!(d = Xmalloc (sizeof (DocList) + sizeof (DocEntry) * (num - 1))))
+    return (NULL);
+  d->num = 0;
+  d->total_retrieved = 0;
+  d->is_approx = 0;
+  return (d);
+}
+
+
+/*
+ * Change the size of a DocList so that it can hold num entries 
+ */
+DocList *
+ResizeDocList (DocList * d, int num)
+{
+  if (!(d = Xrealloc (d, sizeof (DocList) + sizeof (DocEntry) * (num - 1))))
+    return (NULL);
+  return (d);
+}
+
+
+/* IntersectLists () */
+/* Returns the intersection of List1 and List2 by deleting from List1 all */
+/* entries not in List2.  All of List2 is freed, and the nodes of List1 not */
+/* included in the resultant list are freed. */
+/* On exit the intersection of the lists is returned, or NULL on empty */
+/* intersection. */
+/* Assumes that both lists are ordered on increasing Value. */
+DocList *
+IntersectLists (DocList * List1, DocList * List2)
+{
+  DocEntry *s1, *d1, *s2;
+  if (!List2 || !List1)
+    {
+      if (List1)
+	Xfree (List1);
+      if (List2)
+	Xfree (List2);
+      return (MakeDocList (0));
+    }
+  d1 = s1 = List1->DE;
+  s2 = List2->DE;
+  while (s1 - List1->DE < List1->num && s2 - List2->DE < List2->num)
+    {
+      if (s1->DocNum == s2->DocNum)
+	*d1++ = *s1++;
+      if (s1 - List1->DE < List1->num)
+	while (s2 - List2->DE < List2->num && s2->DocNum < s1->DocNum)
+	  s2++;
+      if (s2 - List2->DE < List2->num)
+	while (s1 - List1->DE < List1->num && s1->DocNum < s2->DocNum)
+	  s1++;
+    }
+  List1->num = d1 - List1->DE;
+  Xfree (List2);
+  return (List1);
+}
+
+
+/* DiffLists () */
+/* Returns the difference of List1 and List2 by deleting from List1 all */
+/* entries in List2.  All of List2 is freed, and the nodes of List1 not */
+/* included in the resultant list are freed. */
+/* On exit the differrence of the lists is returned, or NULL on empty */
+/* intersection. */
+/* Assumes that both lists are ordered on increasing Value. */
+DocList *
+DiffLists (DocList * List1, DocList * List2)
+{
+  DocEntry *s1, *d1, *s2;
+  if (!List1)
+    {
+      if (List2)
+	Xfree (List2);
+      return (MakeDocList (0));
+    }
+  if (!List2)
+    return (List1);
+  d1 = s1 = List1->DE;
+  s2 = List2->DE;
+  while (s1 - List1->DE < List1->num)
+    {
+      if (s2 - List2->DE == List2->num)
+	*d1++ = *s1++;
+      else
+	{
+	  if (s1->DocNum == s2->DocNum)
+	    {
+	      s1++;
+	      s2++;
+	    }
+	  else if (s1->DocNum < s2->DocNum)
+	    *d1++ = *s1++;
+	  else
+	    s2++;
+	}
+    }
+  List1->num = d1 - List1->DE;
+  Xfree (List2);
+  return (List1);
+}
+
+/* MergeLists () */
+/* Finds the union of two lists and returns the head of the new list formed. */
+/* Assumes that both lists are ordered on increasing Value. */
+DocList *
+MergeLists (DocList * List1, DocList * List2)
+{
+  DocList *NewList;
+  DocEntry *d, *s1, *s2;
+  if (!List1)
+    {
+      if (List2)
+	return (List2);
+      else
+	return (MakeDocList (0));
+    }
+  if (!List2)
+    return (List1);
+  if (!(NewList = MakeDocList (List1->num + List2->num)))
+    {
+      Xfree (List1);
+      Xfree (List2);
+      return (NULL);
+    }
+
+  s1 = List1->DE;
+  s2 = List2->DE;
+  d = NewList->DE;
+  while (s1 - List1->DE < List1->num || s2 - List2->DE < List2->num)
+    {
+      if (s1 - List1->DE >= List1->num)
+	*d++ = *s2++;
+      else if (s2 - List2->DE >= List2->num)
+	*d++ = *s1++;
+      else if (s1->DocNum == s2->DocNum)
+	{
+	  *d = *s1++;
+	  (d++)->Weight += (s2++)->Weight;
+	}
+      else if (s1->DocNum < s2->DocNum)
+	*d++ = *s1++;
+      else
+	*d++ = *s2++;
+    }
+  NewList->num = d - NewList->DE;
+  Xfree (List1);
+  Xfree (List2);
+  return (NewList);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/lists.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/lists.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/lists.h	(revision 21083)
@@ -0,0 +1,59 @@
+/**************************************************************************
+ *
+ * lists.h -- List processing functions for boolean queries
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_LISTS
+#define H_LISTS
+
+
+
+typedef struct DocEntry
+  {
+    float Weight;
+    int DocNum;
+    unsigned long SeekPos;	/* position in the text file in bytes */
+    unsigned long Len;		/* length of the document in bytes */
+    char *CompTextBuffer;
+    struct DocEntry *Next;
+    short or_included;		/*[TS:Mar/95] whether included in an AND of ORed-terms */
+  }
+DocEntry;
+
+typedef struct DocList
+  {
+    int num;
+    int total_retrieved; /* valid if > 0 */
+    int is_approx;       /* whether total_retrieved is approximate */
+    DocEntry DE[1];
+  }
+DocList;
+
+DocList *MakeDocList (int num);
+DocList *ResizeDocList (DocList * d, int num);
+DocList *IntersectLists (DocList * List1, DocList * List2);
+DocList *DiffLists (DocList * List1, DocList * List2);
+DocList *MergeLists (DocList * List1, DocList * List2);
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/locallib.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/locallib.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/locallib.c	(revision 21083)
@@ -0,0 +1,304 @@
+/**************************************************************************
+ *
+ * locallib.c -- Misc functions
+ * Copyright (C) 1994  Gary Eddy, Alistair Moffat and Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "bitio_gen.h"
+#include "huffman.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "locallib.h"
+#include "text.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:02  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:49  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:51  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:38  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+int 
+vecentropy (int *A, int n)
+{
+  int total = 0, i;
+  double bits = 0.0;
+
+  for (i = 0; i < n; i++)
+    total += A[i];
+  for (i = 0; i < n; i++)
+    if (A[i])
+      bits += A[i] * log2 (1.0 * total / A[i]);
+  return ((int) (bits + 0.9999));
+
+}
+
+static void 
+siftdown (int *A, int i, int n)
+{
+  int ms, t;
+
+  while (2 * i + 1 <= n - 1)
+    {
+      if (2 * i + 1 == n - 1 || A[2 * i + 1] < A[2 * i + 2])
+	ms = 2 * i + 1;
+      else
+	ms = 2 * i + 2;
+      if (A[i] > A[ms])
+	{
+	  t = A[i];
+	  A[i] = A[ms];
+	  A[ms] = t;
+	}
+      i = ms;
+    }
+}
+
+static void 
+buildheap (int *A, int n)
+{
+  int i;
+  for (i = n / 2 - 1; i >= 0; i--)
+    siftdown (A, i, n);
+}
+
+int 
+huffcodebits (unsigned long *A, int n)
+{
+  int i, j, tot = 0, bits = 0, v1, v2, *B;
+
+  B = (int *) Xmalloc (n * sizeof (int));
+  j = 0;
+  for (i = 0; i < n; i++)
+    {
+      if (A[i])
+	{
+	  tot += (B[j++] = A[i]);
+	}
+    }
+  n = j;
+
+  if (n == 0 || tot == 0)
+    return (0);
+
+  buildheap (B, n);
+  while (n > 1)
+    {
+      v1 = B[0];
+      B[0] = B[n - 1];
+      n--;
+      siftdown (B, 0, n);
+      v2 = B[0];
+      B[0] = v1 + v2;
+      siftdown (B, 0, n);
+      bits += v1 + v2;
+    }
+  Xfree (B);
+  return (bits);
+}
+
+
+int 
+modelbits (unsigned long *A, int n)
+{
+  int i, bits = 0, last, N = 0;
+
+  last = -1;
+  for (i = 0; i < n; i++)
+    {
+      if (A[i])
+	{
+	  bits += BIO_Gamma_Length (i - last) + BIO_Gamma_Length (A[i]);
+	  last = i;
+	  N++;
+	}
+    }
+  if (N == 0)
+    return (0);
+  bits += BIO_Gamma_Length (N);
+  return (bits);
+}
+
+
+
+
+
+/* Find the next prime number larger than p */
+int 
+prime (int p)
+{
+  int limit;
+  p += (p & 1) + 1;
+  limit = (int) sqrt ((double) p) + 1;
+  do
+    {
+      int j;
+      while (limit * limit < p)
+	limit++;
+      for (j = 3; j <= limit && p % j; j += 2)
+	;			/* NULLBODY */
+      if (j > limit)
+	break;
+      p += 2;
+    }
+  while (1);
+  return (p);
+}
+
+
+
+int 
+Read_cdh (FILE * f, compression_dict_header * cdh, u_long * mem,
+	  u_long * disk)
+{
+  if (disk)
+    (*disk) += sizeof (*cdh);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  if (fread (cdh, sizeof (*cdh), 1, f) == 1)
+    {
+      int i;
+      NTOHUL(cdh->dict_type);
+      NTOHUL(cdh->novel_method);
+      for (i = 0; i < TEXT_PARAMS; i++)
+	NTOHUL(cdh->params[i]);
+      NTOHUL(cdh->num_words[0]);
+      NTOHUL(cdh->num_words[1]);
+      NTOHUL(cdh->num_word_chars[0]);
+      NTOHUL(cdh->num_word_chars[1]);
+      NTOHUL(cdh->lookback);
+      return 0;
+    }
+  else
+    return -1;
+}
+
+
+int 
+F_Read_cdh (File * f, compression_dict_header * cdh, u_long * mem,
+	    u_long * disk)
+{
+  if (disk)
+    (*disk) += sizeof (*cdh);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  if (Fread (cdh, sizeof (*cdh), 1, f) == 1)
+    {
+      int i;
+      NTOHUL(cdh->dict_type);
+      NTOHUL(cdh->novel_method);
+      for (i = 0; i < TEXT_PARAMS; i++)
+	NTOHUL(cdh->params[i]);
+      NTOHUL(cdh->num_words[0]);
+      NTOHUL(cdh->num_words[1]);
+      NTOHUL(cdh->num_word_chars[0]);
+      NTOHUL(cdh->num_word_chars[1]);
+      NTOHUL(cdh->lookback);
+      return 0;
+    }
+  else
+    return -1;
+}
+
+
+int 
+Read_cfh (FILE * f, comp_frags_header * cfh, u_long * mem, u_long * disk)
+{
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (Read_Huffman_Data (f, &cfh->hd, mem, disk) == -1)
+    return -1;
+  if (fread (&cfh->uncompressed_size,
+	     sizeof (cfh->uncompressed_size), 1, f) != 1)
+    return -1;
+  NTOHUL(cfh->uncompressed_size);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (disk)
+    (*disk) += sizeof (cfh->uncompressed_size);
+
+  bzero ((char *) cfh->huff_words_size, sizeof (cfh->huff_words_size));
+
+  if (fread (cfh->huff_words_size + cfh->hd.mincodelen,
+	     sizeof (*cfh->huff_words_size),
+	     cfh->hd.maxcodelen - cfh->hd.mincodelen + 1, f) !=
+      cfh->hd.maxcodelen - cfh->hd.mincodelen + 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = cfh->hd.mincodelen; i < cfh->hd.maxcodelen + 1; i++)
+    NTOHUL(cfh->huff_words_size[i]);
+
+  if (disk)
+    (*disk) += sizeof (*cfh->huff_words_size) *
+      (cfh->hd.maxcodelen - cfh->hd.mincodelen + 1);
+  return 0;
+}
+
+
+
+int 
+F_Read_cfh (File * f, comp_frags_header * cfh, u_long * mem, u_long * disk)
+{
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (F_Read_Huffman_Data (f, &cfh->hd, mem, disk) == -1)
+    return -1;
+  if (Fread (&cfh->uncompressed_size,
+	     sizeof (cfh->uncompressed_size), 1, f) != 1)
+    return -1;
+  NTOHUL(cfh->uncompressed_size);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (disk)
+    (*disk) += sizeof (cfh->uncompressed_size);
+
+  bzero ((char *) cfh->huff_words_size, sizeof (cfh->huff_words_size));
+
+  if (Fread (cfh->huff_words_size + cfh->hd.mincodelen,
+	     sizeof (*cfh->huff_words_size),
+	     cfh->hd.maxcodelen - cfh->hd.mincodelen + 1, f) !=
+      cfh->hd.maxcodelen - cfh->hd.mincodelen + 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = cfh->hd.mincodelen; i < cfh->hd.maxcodelen + 1; i++)
+    NTOHUL(cfh->huff_words_size[i]);
+
+  if (disk)
+    (*disk) += sizeof (*cfh->huff_words_size) *
+      (cfh->hd.maxcodelen - cfh->hd.mincodelen + 1);
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/locallib.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/locallib.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/locallib.h	(revision 21083)
@@ -0,0 +1,52 @@
+/**************************************************************************
+ *
+ * locallib.h -- Misc functions
+ * Copyright (C) 1994  Gary Eddy, Alistair Moffat and Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef LOCALLIB_H
+#define LOCALLIB_H
+
+#include "sysfuncs.h"
+
+#include "text.h"
+
+#define NUMOF(a) (sizeof(a)/sizeof((a)[0]))
+
+int vecentropy (int *A, int n);
+
+int huffcodebits (unsigned long *A, int n);
+
+int modelbits (unsigned long *A, int n);
+
+int prime (int p);
+
+
+int Read_cdh (FILE * f, compression_dict_header * cdh, u_long * mem, u_long * disk);
+
+int Read_cfh (FILE * f, comp_frags_header * cfh, u_long * mem, u_long * disk);
+
+int F_Read_cdh (File * f, compression_dict_header * cdh, u_long * mem,
+		u_long * disk);
+
+int F_Read_cfh (File * f, comp_frags_header * cfh, u_long * mem, u_long * disk);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg.h	(revision 21083)
@@ -0,0 +1,42 @@
+/**************************************************************************
+ *
+ * mg.h -- General header file
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_MG
+#define H_MG
+
+
+#define COMPALLOK	(0)
+#define COMPERROR	(-1)
+
+#define MAXSTRING       3000000
+#define BUFFERSIZE      (MAXSTRING+30000)
+
+
+
+
+#define	MAXLN	65536
+#define WORDS           1
+#define NONWORDS        0
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg.special.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg.special.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg.special.c	(revision 21083)
@@ -0,0 +1,115 @@
+/**************************************************************************
+ *
+ * mg.special.c -- Special pass for mg_passes
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "mg.h"
+#include "build.h"
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:03  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:34:51  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:53  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:44  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+FILE *fp;
+
+
+int 
+init_special (char *FileName)
+{
+  char FName[200];
+  sprintf (FName, "%s%s", FileName, ".docnums");
+  if (!(fp = fopen (FName, "w")))
+    return (COMPERROR);
+  return (COMPALLOK);
+}
+
+
+
+
+int 
+process_special (u_char * s_in, int l_in)
+{
+  static int un = 1;
+  char *s_done = (char *) (s_in + l_in);
+  for (; (char *) s_in != s_done; s_in++)
+    if (*s_in == '<')
+      {
+	if (strncmp ((char *) s_in, "<DOCNO>", 7) == 0)
+	  {
+	    char *s_end = (char *) (s_in + 1);
+	    for (; s_end != s_done; s_end++)
+	      if (*s_end == '<')
+		if (strncmp (s_end, "</DOCNO>", 8) == 0)
+		  break;
+	    if (s_end == s_done)
+	      {
+		fprintf (fp, "NO DOC ID %d\n", un++);
+		return COMPALLOK;
+	      }
+	    s_in += 7;
+	    while (s_end != (char *) s_in &&
+		   (*(s_end - 1) == ' ' || *(s_end - 1) == '\n'))
+	      s_end--;
+	    while ((char *) s_in != s_end &&
+		   (*s_in == ' ' || *s_in == '\n'))
+	      s_in++;
+	    for (; (char *) s_in != s_end; s_in++)
+	      putc (*s_in, fp);
+	    putc ('\n', fp);
+	    return (COMPALLOK);
+	  }
+      }
+  fprintf (fp, "NO DOC ID %d\n", un++);
+  return (COMPALLOK);
+}
+
+
+
+
+
+
+
+
+int 
+done_special (char *FileName)
+{
+  fclose (fp);
+  return COMPALLOK;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.1	(revision 21083)
@@ -0,0 +1,219 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_compression_dict 1 \*(Dt CITRI
+.SH NAME
+mg_compression_dict \- build a compression dictionary.
+.SH SYNOPSIS
+.B mg_compression_dict
+[
+.B \-h
+]
+[
+.BR \-C " |"
+.BR \-P " |"
+.B  \-S
+]
+.if n .ti +9n
+[
+.BR \-0 " |"
+.BR \-1 " |"
+.BR \-2 " |"
+.B  \-3
+]
+[
+.BR \-H " |"
+.BR \-B " |"
+.BR \-D " |"
+.BR \-Y " |"
+.B  \-M
+]
+.if n .ti +9n
+.if t .ti +.5i
+[
+.BI \-l " lookback"
+]
+[
+.BI \-k " mem"
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_compression_dict
+builds a compression dictionary based on the statistics gathered
+during the first pass over the text.  The options to the program are
+mainly concerned with limiting the amount of memory the dictionary
+will use and with how the text compressor will cope with any novel
+words found during the compression phase.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-C
+Build a complete dictionary from the statistics file.  If during the
+text compression phase a novel word is found, then the compressor will
+produce an error message and stop.
+.TP
+.B \-P
+Build a partial dictionary from the statistics file.  This dictionary
+assumes that the statistics file are based on the entire text.  The
+statistics of words not includes in the dictionary are used to
+calculate the escape probability.  If novel words are being coded
+character by character, then there may not be a Huffman code for every
+possible character.  This means that the compressor may fail if a novel
+word contains a novel character.
+.TP
+.B \-S
+Build a seed dictionary from the statistics file.  This dictionary
+assumes that the statistics file is based on only a portion of the
+text to be compressed.  The probability of a novel word is based on the
+number of words that have only occurred once.  If novel words are being
+coded character by character, then the Huffman codes for characters are
+based on the frequency of characters in the dictionary.
+.TP
+.B \-0
+All words from the statistics file are included in the built
+dictionary.
+.TP
+.B \-1
+Words are included in the dictionary until the dictionary reaches the
+desired size.  Words are selected for the dictionary based on the order
+they occurred in the source text.
+.TP
+.B \-2
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.
+.TP
+.B \-3
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.  Words are the shuffled back and forth between the
+`keep' and `discard' lists to find the `optimal' set of words that
+should be in the dictionary.
+.TP
+.B \-H
+This specifies that novel words will be coded character by character
+using Huffman codes.
+.TP
+.B \-B
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using binary codes.  The binary code represents their occurrence
+position in the auxiliary dictionary.
+.TP
+.B \-D
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using delta codes.  The delta code represents their occurrence position
+in the auxiliary dictionary.
+.TP
+.B \-Y
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This generally
+produces better compression than
+.B \-B
+or
+.BR \-D .
+.TP
+.B \-M
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This method is
+adaptive within documents, and generally produces better compression
+than
+.BR \-B ,
+.B \-D
+or
+.BR \-Y .
+.TP
+.BI \-l " lookback"
+The generated dictionary is designed to be front coded when it is
+loaded into memory.  Under normal circumstances, a front-coded
+dictionary would require scanning from the beginning in order to find
+any particular word.  However, every
+.I lookback
+words in the dictionary, the whole word is stored and a pointer to that
+word maintained.  E.g., if
+.I lookback
+is 4, then every fourth word is stored in its entirety.
+.TP
+.BI \-k " mem"
+This limits the amount of memory to use for the generated
+dictionary.  Words are selected for the dictionary based of the text
+statistics, and whether
+.BR \-0 , " \-1" , " \-2"
+or
+.B \-3
+is specified.  The memory is calculated assuming a lookback of 0,
+irrespective of what actual lookback is specified.  This means that if
+a non-zero lookback is given, the dictionary will actually occupy
+less space than specified by
+.BR \-k .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.stats
+Statistics about the source text.
+.TP
+.B *.text.dict
+Compression dictionary for the source text.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_compression_dict.c	(revision 21083)
@@ -0,0 +1,1084 @@
+/**************************************************************************
+ *
+ * mg_compression_dict.c -- Routines for reading the compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_gen.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "timing.h"
+#include "mgheap.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "invf.h"
+#include "text.h"
+#include "words.h"
+#include "mg.h"
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+/*
+   $Log$
+   Revision 1.2  1999/12/10 15:04:25  cs025
+   Incorrect use of NTOHUL on a double value (num_bytes).
+
+   Revision 1.1  1999/08/10 21:18:04  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.4  1999/01/15 03:05:51  rjmcnab
+
+   Renamed lib/heap to be lib/mgheap (it was causing some problems with
+   some versions of the STL libraries which contained a heap.h)
+
+   Revision 1.3  1998/12/17 09:12:52  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:44  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:52  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:54  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:45  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+/* #define DEBUG1 */
+
+/* #define DEBUG */
+
+#define is_power_of_two(a) ((a) != 0 && (((a) & ((a)-1)) == 0))
+
+#define MAX_RECALCULATIONS 100
+
+typedef struct WordData
+  {
+    u_long freq, occur_num;
+    float saving;
+    float char_bit_cost;
+    u_long num_trans;
+    u_char *word;
+  }
+WordData;
+
+static WordData *Words[2];
+static u_long Num[2];
+static u_long chars[2];
+
+#define KIND(p) (((p) >= Words[0] && (p) < Words[0] + Num[0]) ? 0 : 1)
+#define IsWord(p) (((p) >= Words[1] && (p) < Words[1] + Num[1]) ? 1 : 0)
+#define IsNonWord(p) (((p) >= Words[0] && (p) < Words[0] + Num[0]) ? 1 : 0)
+
+
+typedef struct DictData
+  {
+    WordData **wd;
+    u_long num_wds;
+    u_long chars;
+  }
+DictData;
+
+typedef DictData DictInfo[2];
+
+static DictInfo keep, discard, all;
+static compression_stats_header csh;
+
+static char *file_name = "";
+static u_long novel_method = MG_NOVEL_HUFFMAN_CHARS;
+
+
+static void ReadInWords (char *);
+static void Select_on (int k, heap_comp hc);
+static void Method3 (int k);
+static void Select_all (void);
+static u_long WriteOutWords (char *, u_long, int);
+static int DecFreqIncWL (void *a, void *b);
+static int OccuranceOrder (void *a, void *b);
+
+
+
+int main (int argc, char **argv)
+{
+  ProgTime StartTime;
+  int ch;
+  char type = 'C';
+  char mode = '0';
+  int lookback = 2;
+  double k = 0;
+  u_long mem_reqd;
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "0123CPSf:d:l:hk:HBDYM")) != -1)
+    switch (ch)
+      {
+      case 'H':
+	novel_method = MG_NOVEL_HUFFMAN_CHARS;
+	break;
+      case 'B':
+	novel_method = MG_NOVEL_BINARY;
+	break;
+      case 'D':
+	novel_method = MG_NOVEL_DELTA;
+	break;
+      case 'Y':
+	novel_method = MG_NOVEL_HYBRID;
+	break;
+      case 'M':
+	novel_method = MG_NOVEL_HYBRID_MTF;
+	break;
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'C':
+      case 'P':
+      case 'S':
+	type = ch;
+	break;
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+	mode = ch;
+	break;
+      case 'l':
+	lookback = atoi (optarg);
+	if (!is_power_of_two (lookback))
+	  FatalError (1, "The lookback value must be a power of 2");
+	lookback = floorlog_2 (lookback);
+	break;
+      case 'k':
+	k = atof (optarg) * 1024;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-l lookback] [-f input_file]"
+	"[-d data directory] [-h] [-0|-1|-2|-3] [-C|-P|-S] [-k mem (Kb)]\n",
+		 argv[0]);
+	exit (1);
+      }
+  GetTime (&StartTime);
+
+  ReadInWords (file_name);
+
+  if (type == 'C')
+    {
+      Select_all ();
+      mem_reqd = WriteOutWords (file_name, MG_COMPLETE_DICTIONARY, lookback);
+    }
+  else
+    {
+      switch (mode)
+	{
+	case '0':
+	  Select_all ();
+	  break;
+	case '1':
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+	  Select_on ((int) k, OccuranceOrder);
+	  break;
+	case '2':
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+	  Select_on ((int) k, DecFreqIncWL);
+	  break;
+	case '3':
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+	  Method3 ((int) k);
+	  break;
+	}
+      if (type == 'P')
+	{
+	  mem_reqd = WriteOutWords (file_name, MG_PARTIAL_DICTIONARY, lookback);
+	}
+      else
+	{
+	  mem_reqd = WriteOutWords (file_name, MG_SEED_DICTIONARY, lookback);
+	}
+    }
+
+  Message ("Num words           : %8u -> %8u\n", Num[1], keep[1].num_wds);
+  Message ("Num non-words       : %8u -> %8u\n", Num[0], keep[0].num_wds);
+  Message ("Chars of words      : %8u -> %8u\n", chars[1], keep[1].chars);
+  Message ("Chars of non-words  : %8u -> %8u\n", chars[0], keep[0].chars);
+  Message ("Mem usage           : %8u -> %8u\n",
+	   (Num[0] + Num[1]) * sizeof (char *) + chars[0] + chars[1],
+	     (keep[0].num_wds + keep[1].num_wds) * sizeof (char *) +
+	   keep[0].chars + keep[1].chars);
+  Message ("Actual mem required : %8u\n", mem_reqd);
+
+  Message ("%s", ElapsedTime (&StartTime, NULL));
+  return 0;
+}
+
+
+
+
+static void 
+ReadInWords (char *filename)
+{
+  FILE *f;
+  unsigned long i;
+  f = open_file (filename, TEXT_STATS_DICT_SUFFIX, "rb",
+		 MAGIC_STATS_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread (&csh, sizeof (csh), 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes);
+
+  for (i = 0; i < 2; i++)
+    {
+      frags_stats_header fsh;
+      char *buf;
+      WordData *wd;
+      int j;
+      chars[i] = 0;
+
+      fread (&fsh, sizeof (fsh), 1, f);
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fsh.num_frags);
+      NTOHUL(fsh.mem_for_frags);
+
+      Num[i] = all[i].num_wds = fsh.num_frags;
+
+      /* The +1 on the following line is to leave room for the esc code. */
+      all[i].wd = Xmalloc (sizeof (WordData *) * Num[i] + 1);
+
+      buf = Xmalloc (fsh.mem_for_frags);
+      wd = Words[i] = Xmalloc (sizeof (WordData) * Num[i]);
+      for (j = 0; j < Num[i]; j++, wd++)
+	{
+	  int len;
+	  fread (&wd->freq, sizeof (wd->freq), 1, f);
+	  NTOHUL(wd->freq);  /* [RPAP - Jan 97: Endian Ordering] */
+	  fread (&wd->occur_num, sizeof (wd->occur_num), 1, f);
+	  NTOHUL(wd->occur_num);  /* [RPAP - Jan 97: Endian Ordering] */
+	  len = fgetc (f);
+	  wd->word = (u_char *) buf;
+	  *buf++ = len;
+	  fread (buf, len, 1, f);
+	  buf += len;
+	  all[i].wd[j] = wd;
+	}
+      chars[i] = fsh.mem_for_frags - fsh.num_frags;
+    }
+  fclose (f);
+}
+
+
+static void 
+Alloc_keep_discard (void)
+{
+  keep[0].num_wds = 0;
+  keep[0].wd = Xmalloc ((Num[0] + 1) * sizeof (WordData *));
+  keep[1].num_wds = 0;
+  keep[1].wd = Xmalloc ((Num[1] + 1) * sizeof (WordData *));
+  discard[0].num_wds = 0;
+  discard[0].wd = Xmalloc ((Num[0] + 1) * sizeof (WordData *));
+  discard[1].num_wds = 0;
+  discard[1].wd = Xmalloc ((Num[1] + 1) * sizeof (WordData *));
+}
+
+
+static int 
+sort_comp (const void *a, const void *b)
+{
+  WordData *aa = *(WordData **) a;
+  WordData *bb = *(WordData **) b;
+  return casecompare (aa->word, bb->word);  /* [RPAP - Jan 97: Stem Index Change] */
+}
+
+
+
+static void 
+SortAndCount_DictData (DictData * dd)
+{
+  int i;
+  WordData **wd;
+  qsort (dd->wd, dd->num_wds, sizeof (WordData *), sort_comp);
+  dd->chars = 0;
+  wd = dd->wd;
+  for (i = 0; i < dd->num_wds; i++, wd++)
+    dd->chars += (*wd)->word[0];
+}
+
+
+static void 
+Select_all (void)
+{
+  int i;
+  Alloc_keep_discard ();
+  keep[0].num_wds = Num[0];
+  for (i = 0; i < Num[0]; i++)
+    keep[0].wd[i] = Words[0] + i;
+  keep[1].num_wds = Num[1];
+  for (i = 0; i < Num[1]; i++)
+    keep[1].wd[i] = Words[1] + i;
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+}
+
+
+
+
+static int 
+DecFreqIncWL (void *a, void *b)
+{
+  WordData *aa = *(WordData **) a;
+  WordData *bb = *(WordData **) b;
+  if (aa->freq > bb->freq)
+    return -1;
+  else if (aa->freq < bb->freq)
+    return 1;
+  else
+    return bb->word[0] - aa->word[0];
+}
+
+
+static int 
+OccuranceOrder (void *a, void *b)
+{
+  WordData *aa = *(WordData **) a;
+  WordData *bb = *(WordData **) b;
+  if (aa->occur_num > bb->occur_num)
+    return 1;
+  else if (aa->occur_num < bb->occur_num)
+    return -1;
+  else
+    return 0;
+}
+
+
+static void 
+Select_on (int k, heap_comp hc)
+{
+  int i, num, mem;
+  WordData **wd;
+
+  Alloc_keep_discard ();
+
+  num = Num[0] + Num[1];
+  wd = Xmalloc (num * sizeof (WordData *));
+  for (i = 0; i < Num[0]; i++)
+    wd[i] = Words[0] + i;
+  for (i = 0; i < Num[1]; i++)
+    wd[i + Num[0]] = Words[1] + i;
+
+  heap_build (wd, sizeof (*wd), num, hc);
+
+  mem = 0;
+  while (k > mem && num)
+    {
+      int idx;
+      WordData *word = wd[0];
+#ifdef DEBUG
+      fprintf (stderr, "%4d:%4d:%8d :%8d :%8d : \"%s\"\n",
+	       keep[0].num_wds, keep[1].num_wds,
+	       mem, word->freq, word->occur_num, word2str (word->word));
+#endif
+      mem += sizeof (u_char *) + word->word[0];
+      heap_deletehead (wd, sizeof (*wd), &num, hc);
+      idx = KIND (word);
+      keep[idx].wd[keep[idx].num_wds++] = word;
+    }
+
+  for (i = 0; i < num; i++)
+    {
+      WordData *word = wd[i];
+      int idx = KIND (word);
+      discard[idx].wd[discard[idx].num_wds++] = word;
+    }
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+  SortAndCount_DictData (&discard[0]);
+  SortAndCount_DictData (&discard[1]);
+
+  assert (keep[0].num_wds + discard[0].num_wds == Num[0]);
+  assert (keep[1].num_wds + discard[1].num_wds == Num[1]);
+
+}
+
+
+
+static int 
+BigSaving (void *a, void *b)
+{
+  WordData *aa = *(WordData **) a;
+  WordData *bb = *(WordData **) b;
+  return (aa->saving > bb->saving) ? -1 : (aa->saving < bb->saving);
+}
+
+static int 
+SmallSaving (void *a, void *b)
+{
+  WordData *aa = *(WordData **) a;
+  WordData *bb = *(WordData **) b;
+  return (aa->saving < bb->saving) ? -1 : (aa->saving > bb->saving);
+}
+
+
+static void 
+CalcCharCounts (WordData ** wd, int num,
+		char *char_lens[2], char *len_lens[2],
+		u_long escape[2])
+{
+  long char_freqs[2][256];
+  long len_freqs[2][16];
+  huff_data hd;
+  int i;
+  escape[0] = 0;
+  escape[1] = 0;
+  bzero ((char *) char_freqs, sizeof (char_freqs));
+  bzero ((char *) len_freqs, sizeof (len_freqs));
+  for (i = 0; i < num; i++, wd++)
+    {
+      u_long freq = (*wd)->freq;
+      u_char *buf = (*wd)->word;
+      int len = *buf++;
+      int idx = KIND (*wd);
+      len_freqs[idx][len] += freq;
+      escape[idx] += freq;
+      for (; len; len--, buf++)
+	char_freqs[idx][(u_long) (*buf)] += freq;
+    }
+  Generate_Huffman_Data (256, char_freqs[0], &hd, NULL);
+  char_lens[0] = hd.clens;
+  Generate_Huffman_Data (256, char_freqs[1], &hd, NULL);
+  char_lens[1] = hd.clens;
+
+  Generate_Huffman_Data (16, len_freqs[0], &hd, NULL);
+  len_lens[0] = hd.clens;
+  Generate_Huffman_Data (16, len_freqs[1], &hd, NULL);
+  len_lens[1] = hd.clens;
+}
+
+
+
+
+
+
+
+
+
+void 
+CalcBitCost (WordData ** discard_word, int discard_num,
+	     WordData ** keep_word, int keep_num, double freqs_trans[2],
+	     u_long escape[2], int num_trans)
+{
+  char *char_lens[2];
+  char *len_lens[2];
+  double esc[2];
+  int j;
+  CalcCharCounts (discard_word, discard_num, char_lens, len_lens, escape);
+  esc[0] = -log2 (escape[0] / (freqs_trans[0] + escape[0]));
+  esc[1] = -log2 (escape[1] / (freqs_trans[1] + escape[1]));
+  for (j = 0; j < discard_num; j++, discard_word++)
+    {
+      float cbc, wbc;
+      u_char *buf = (*discard_word)->word;
+      int len = *buf++;
+      u_long freq = (*discard_word)->freq;
+      int idx = KIND (*discard_word);
+
+      cbc = len_lens[idx][len];
+      for (; len; len--, buf++)
+	cbc += char_lens[idx][(u_long) (*buf)];
+
+      (*discard_word)->char_bit_cost = (cbc + esc[idx]) * freq;
+
+      wbc = -log2 (freq / (freqs_trans[idx] + escape[idx])) * freq;
+
+      (*discard_word)->saving = ((*discard_word)->char_bit_cost - wbc) /
+	(sizeof (char *) + (*discard_word)->word[0]);
+
+      (*discard_word)->num_trans = num_trans;
+    }
+  for (j = 0; j < keep_num; j++, keep_word++)
+    {
+      float cbc, wbc;
+      u_char *buf = (*keep_word)->word;
+      int len = *buf++;
+      u_long freq = (*keep_word)->freq;
+      int idx = KIND (*keep_word);
+
+      cbc = len_lens[idx][len];
+      for (; len; len--, buf++)
+	cbc += char_lens[idx][(u_long) (*buf)];
+
+      (*keep_word)->char_bit_cost = (cbc + esc[idx]) * freq;
+
+      wbc = -log2 (freq / (freqs_trans[idx] + escape[idx])) * freq;
+
+      (*keep_word)->saving = ((*keep_word)->char_bit_cost - wbc) /
+	(sizeof (char *) + (*keep_word)->word[0]);
+
+      (*keep_word)->num_trans = num_trans;
+    }
+  Xfree (char_lens[0]);
+  Xfree (char_lens[1]);
+  Xfree (len_lens[0]);
+  Xfree (len_lens[1]);
+}
+
+
+
+static void 
+Method3 (int k)
+{
+  int i, keep_num, discard_num, mem, num_trans, recalc_reqd;
+  int keep_to_discard = 0;
+  int discard_to_keep = 0;
+  int recalcs = 0;
+  double freqs_trans[2], total;
+  u_long escape[2];
+  WordData **keep_heap, **discard_heap;
+
+  freqs_trans[0] = freqs_trans[1] = 0;
+  num_trans = 0;
+
+  discard_num = Num[0] + Num[1];
+  discard_heap = Xmalloc (discard_num * sizeof (WordData *));
+
+  keep_num = 0;
+  keep_heap = Xmalloc (discard_num * sizeof (WordData *));
+
+
+  for (i = 0; i < Num[0]; i++)
+    discard_heap[i] = Words[0] + i;
+  for (i = 0; i < Num[1]; i++)
+    discard_heap[i + Num[0]] = Words[1] + i;
+
+  heap_build (discard_heap, sizeof (*discard_heap), discard_num, DecFreqIncWL);
+
+  mem = 0;
+  while (k > mem && discard_num)
+    {
+      WordData *word = discard_heap[0];
+      mem += sizeof (u_char *) + word->word[0];
+      heap_deletehead (discard_heap, sizeof (word), &discard_num, DecFreqIncWL);
+      keep_heap[keep_num++] = word;
+      freqs_trans[KIND (word)] += word->freq;
+      num_trans++;
+    }
+
+  CalcBitCost (discard_heap, discard_num, keep_heap, keep_num,
+	       freqs_trans, escape, num_trans);
+  heap_build (discard_heap, sizeof (*discard_heap), discard_num, BigSaving);
+  heap_build (keep_heap, sizeof (*keep_heap), keep_num, SmallSaving);
+
+  total = 0;
+  recalc_reqd = 0;
+  while (keep_num && discard_num)
+    {
+      if ((keep_num && keep_heap[0]->num_trans < num_trans) ||
+	  (discard_num && discard_heap[0]->num_trans < num_trans))
+	{
+	  if (keep_num && keep_heap[0]->num_trans < num_trans)
+	    {
+	      WordData *word = keep_heap[0];
+	      int idx = KIND (word);
+	      float wbc;
+#ifdef DEBUG1
+	      fprintf (stderr, "KEEP \"%s\" %.2f ->", word2str (word->word),
+		       word->saving);
+#endif
+	      wbc = -log2 (word->freq / (freqs_trans[idx] + escape[idx])) *
+		word->freq;
+	      word->saving = (word->char_bit_cost - wbc) /
+		(sizeof (char *) + word->word[0]);
+#ifdef DEBUG1
+	      fprintf (stderr, " %.2f\n", word->saving);
+#endif
+	      word->num_trans = num_trans;
+	      heap_changedhead (keep_heap, sizeof (word), keep_num, SmallSaving);
+	    }
+
+	  if (discard_num && discard_heap[0]->num_trans < num_trans)
+	    {
+	      WordData *word = discard_heap[0];
+	      int idx = KIND (word);
+	      float wbc;
+#ifdef DEBUG1
+	      fprintf (stderr, "DISCARD \"%s\" %.2f ->", word2str (word->word),
+		       word->saving);
+#endif
+	      wbc = -log2 (word->freq / (freqs_trans[idx] + escape[idx])) *
+		word->freq;
+	      word->saving = (word->char_bit_cost - wbc) /
+		(sizeof (char *) + word->word[0]);
+#ifdef DEBUG1
+	      fprintf (stderr, " %.2f\n", word->saving);
+#endif
+	      word->num_trans = num_trans;
+	      heap_changedhead (discard_heap, sizeof (word),
+				discard_num, BigSaving);
+	    }
+	}
+      else if (keep_heap[0]->saving < discard_heap[0]->saving)
+	{
+	  assert (keep_num && discard_num);
+	  if (keep_num && mem + sizeof (char *) + discard_heap[0]->word[0] > k)
+	    {
+	      /* Transfer the word at the top of the keep heap to the
+	         discard heap. */
+	      WordData *word = keep_heap[0];
+	      int idx = KIND (word);
+	      heap_deletehead (keep_heap, sizeof (word), &keep_num, SmallSaving);
+	      discard_heap[discard_num] = word;
+	      heap_additem (discard_heap, sizeof (word), &discard_num,
+			    BigSaving);
+	      freqs_trans[idx] -= word->freq;
+	      mem -= sizeof (u_char *) + word->word[0];
+	      num_trans++;
+	      total += word->saving;
+	      keep_to_discard++;
+#ifdef DEBUG
+	      fprintf (stderr,
+		       "KEEP -> DISCARD %8d :%8d :%8.0f :%8.0f : \"%s\"\n",
+		       mem, word->freq, word->char_bit_cost,
+		       word->saving, word2str (word->word));
+#endif
+	    }
+	  else
+	    {
+	      /* Transfer the word at the top of the discard heap to the
+	         keep heap. */
+	      WordData *word = discard_heap[0];
+	      int idx = KIND (word);
+	      heap_deletehead (discard_heap, sizeof (word),
+			       &discard_num, BigSaving);
+	      keep_heap[keep_num] = word;
+	      heap_additem (keep_heap, sizeof (word), &keep_num, SmallSaving);
+	      freqs_trans[idx] += word->freq;
+	      mem += sizeof (u_char *) + word->word[0];
+	      num_trans++;
+	      total += word->saving;
+	      discard_to_keep++;
+#ifdef DEBUG
+	      fprintf (stderr,
+		       "DISCARD -> KEEP %8d :%8d :%8.0f :%8.0f : \"%s\"\n",
+		       mem, word->freq, word->char_bit_cost,
+		       word->saving, word2str (word->word));
+#endif
+	    }
+
+	  recalc_reqd = 1;
+
+	}
+      else
+	{
+	  if (recalc_reqd == 0)
+	    break;
+#ifdef DEBUG1
+	  fprintf (stderr, "--------------\n");
+#endif
+	  if (recalcs == MAX_RECALCULATIONS)
+	    break;
+	  CalcBitCost (discard_heap, discard_num, keep_heap, keep_num,
+		       freqs_trans, escape, num_trans);
+	  heap_build (discard_heap, sizeof (*discard_heap),
+		      discard_num, BigSaving);
+	  heap_build (keep_heap, sizeof (keep_heap), keep_num, SmallSaving);
+	  recalc_reqd = 0;
+	  recalcs++;
+	}
+    }
+
+  Alloc_keep_discard ();
+
+  for (i = 0; i < discard_num; i++)
+    {
+      WordData *word = discard_heap[i];
+      int idx = KIND (word);
+      assert (IsWord (word) || IsNonWord (word));
+      discard[idx].wd[discard[idx].num_wds++] = word;
+    }
+  for (i = 0; i < keep_num; i++)
+    {
+      WordData *word = keep_heap[i];
+      int idx = KIND (word);
+      assert (IsWord (word) || IsNonWord (word));
+      keep[idx].wd[keep[idx].num_wds++] = word;
+    }
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+  SortAndCount_DictData (&discard[0]);
+  SortAndCount_DictData (&discard[1]);
+
+  assert (keep[0].num_wds + discard[0].num_wds == Num[0]);
+  assert (keep[1].num_wds + discard[1].num_wds == Num[1]);
+  Message ("Keep -> Discard        : %8d", keep_to_discard);
+  Message ("Discard -> Keep        : %8d", discard_to_keep);
+  Message ("Huffman Recalculations : %8d", recalcs);
+  if (recalcs == MAX_RECALCULATIONS)
+    Message ("WARNING: The number of recalculations == %d", MAX_RECALCULATIONS);
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+ *****									*****
+ *****			Dictionary saving code				*****
+ *****									*****
+ ****************************************************************************/
+
+
+
+static void 
+Write_cdh (FILE * f, compression_dict_header * cdh)
+{
+  /* [RPAP - Jan 97: Endian Ordering] */
+  int i;
+  compression_dict_header tmp = *cdh;
+  HTONUL(tmp.dict_type);
+  HTONUL(tmp.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    HTONUL(tmp.params[i]);
+  HTONUL(tmp.num_words[0]);
+  HTONUL(tmp.num_words[1]);
+  HTONUL(tmp.num_word_chars[0]);
+  HTONUL(tmp.num_word_chars[1]);
+  HTONUL(tmp.lookback);
+
+  fwrite (&tmp, sizeof (tmp), 1, f);
+}
+
+
+static void 
+Write_words (FILE * f, DictData * dd)
+{
+  int i;
+  u_char *curr, *prev = NULL;
+  for (i = 0; i < dd->num_wds; i++)
+    {
+      int len;
+      curr = dd->wd[i]->word;
+      if (prev)
+	/* look for prefix match with prev string */
+	len = prefixlen (prev, curr);
+      else
+	len = 0;
+      fputc ((len << 4) + (curr[0] - len), f);
+      fwrite (curr + len + 1, sizeof (u_char), curr[0] - len, f);
+      prev = curr;
+    }
+
+}
+
+
+static int 
+Uncompressed_size (DictData * dd)
+{
+  int i, us;
+  for (us = i = 0; i < dd->num_wds; i++)
+    us += dd->wd[i]->word[0];
+  return us;
+}
+
+
+static u_long 
+Write_data (FILE * f, DictData * dd, int lookback)
+{
+  u_long mem_reqd;
+  huff_data *hd;
+  int i; 
+  u_long us = dd->num_wds;
+  long *freqs;
+  u_long huff_words_size[MAX_HUFFCODE_LEN + 1];
+  u_long lencounts[MAX_HUFFCODE_LEN + 1];
+  u_char *lastword[MAX_HUFFCODE_LEN + 1];
+
+  if (!(freqs = Xmalloc ((dd->num_wds) * sizeof (*freqs))))
+    FatalError (1, "Unable to allocate memory for freqs");
+
+  for (i = 0; i < dd->num_wds; i++)
+    {
+      freqs[i] = dd->wd[i]->freq;
+      us += dd->wd[i]->word[0];
+    }
+
+  if (!(hd = Generate_Huffman_Data (dd->num_wds, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  Xfree (freqs), freqs = NULL;
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+  HTONUL(us);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&us, sizeof (us), 1, f);
+  NTOHUL(us);  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+/* Calculate the amount of memory that will be required to store the text for
+   each different huffman code len. Every 1<<lookback words for each different
+   codelen length will not be prefixed by previous strings. */
+
+
+  bzero ((char *) &huff_words_size, sizeof (huff_words_size));
+  bzero ((char *) &lencounts, sizeof (lencounts));
+
+  mem_reqd = 0;
+
+  for (i = 0; i < dd->num_wds; i++)
+    {
+      int codelen = hd->clens[i];
+      u_char *word = dd->wd[i]->word;
+
+      if (!codelen)
+	FatalError (1, "The length of a code for a word was zero");
+
+      huff_words_size[codelen] += word[0] + 1;
+      mem_reqd += word[0] + (lookback != 0);
+#if 0
+      if ((lencounts[codelen] & ((1 << lookback) - 1)) == 0)
+	lastword[codelen] = word;
+      else
+	huff_words_size[codelen] -= prefixlen (lastword[codelen], word);
+#else
+      if ((lencounts[codelen] & ((1 << lookback) - 1)) != 0)
+	{
+	  int save = prefixlen (lastword[codelen], word);
+	  mem_reqd -= save;
+	  huff_words_size[codelen] -= save;
+	}
+      else
+	{
+	  mem_reqd += sizeof (u_char *);
+	}
+      lastword[codelen] = word;
+#endif
+      lencounts[codelen]++;
+    }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+    HTONUL(huff_words_size[i]);
+
+  fwrite (huff_words_size + hd->mincodelen, sizeof (*huff_words_size),
+	  hd->maxcodelen - hd->mincodelen + 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+    NTOHUL(huff_words_size[i]);
+
+  Write_words (f, dd);
+
+  Xfree (hd->clens);
+  Xfree (hd);
+
+  return mem_reqd;
+}
+
+
+
+static void 
+Write_charfreqs (FILE * f, DictData * dd, int words,
+		 int zero_freq_permitted)
+{
+  int j;
+  long freqs[256];
+  WordData **wd = dd->wd;
+  huff_data *hd;
+
+  bzero ((char *) freqs, sizeof (freqs));
+
+  for (j = 0; j < dd->num_wds; j++, wd++)
+    {
+      u_char *buf = (*wd)->word;
+      int len = *buf++;
+      for (; len; len--, buf++)
+	freqs[(u_long) (*buf)] += (*wd)->freq;
+    }
+
+  if (!zero_freq_permitted)
+    for (j = 0; j < 256; j++)
+      if (!freqs[j] && PESINAWORD (j) == words)
+	freqs[j] = 1;
+
+  if (!(hd = Generate_Huffman_Data (256, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+  Xfree (hd->clens);
+  Xfree (hd);
+}
+
+
+
+
+static void 
+Write_wordlens (FILE * f, DictData * dd, int zero_freq_permitted)
+{
+  int j;
+  long freqs[16];
+  WordData **wd = dd->wd;
+  huff_data *hd;
+
+  bzero ((char *) freqs, sizeof (freqs));
+
+  for (j = 0; j < dd->num_wds; j++, wd++)
+    freqs[(*wd)->word[0]] += (*wd)->freq;
+
+  if (!zero_freq_permitted)
+    for (j = 0; j < 16; j++)
+      if (!freqs[j])
+	freqs[j] = 1;
+
+  if (!(hd = Generate_Huffman_Data (16, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+
+  Xfree (hd->clens);
+  Xfree (hd);
+}
+
+
+
+static u_long 
+WriteOutWords (char *file_name, u_long type, int lookback)
+{
+  FILE *f;
+  int i;
+  u_long mem_reqd = 0;
+
+  compression_dict_header cdh;
+  f = create_file (file_name, TEXT_DICT_SUFFIX, "w+b",
+		   MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  bzero((char *) &cdh, sizeof(cdh));
+
+  cdh.dict_type = type;
+  cdh.novel_method = (type == MG_SEED_DICTIONARY) ? novel_method :
+    MG_NOVEL_HUFFMAN_CHARS;
+
+  cdh.num_words[1] = keep[1].num_wds;
+  cdh.num_words[0] = keep[0].num_wds;
+  cdh.num_word_chars[1] = Uncompressed_size (&keep[1]);
+  cdh.num_word_chars[0] = Uncompressed_size (&keep[0]);
+  cdh.lookback = lookback;
+
+  Write_cdh (f, &cdh);
+
+  for (i = 0; i < 2; i++)
+    switch (type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  mem_reqd += Write_data (f, &keep[i], lookback);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (keep[i].num_wds)
+	    {
+	      int j;
+	      WordData esc;
+	      esc.freq = 0;
+	      esc.word = (u_char *) "";
+	      keep[i].wd[keep[i].num_wds++] = &esc;
+	      for (j = 0; j < discard[i].num_wds; j++)
+		esc.freq += discard[i].wd[j]->freq;
+	      if (!esc.freq)
+		esc.freq++;
+	      mem_reqd += Write_data (f, &keep[i], lookback);
+	    }
+	  Write_charfreqs (f, &discard[i], i, 1);
+	  Write_wordlens (f, &discard[i], 1);
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (keep[i].num_wds)
+	    {
+	      int j;
+	      WordData esc;
+	      esc.freq = 0;
+	      esc.word = (u_char *) "";
+	      keep[i].wd[keep[i].num_wds++] = &esc;
+	      for (j = 0; j < all[i].num_wds; j++)
+		if (all[i].wd[j]->freq == 1)
+		  esc.freq++;
+	      if (!esc.freq)
+		esc.freq++;
+	      mem_reqd += Write_data (f, &keep[i], lookback);
+	    }
+	  switch (novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      Write_charfreqs (f, &all[i], i, 0);
+	      Write_wordlens (f, &all[i], 0);
+	      break;
+	    case MG_NOVEL_BINARY:
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    case MG_NOVEL_HYBRID_MTF:
+	      break;
+	    default:
+	      FatalError (1, "Bad novel method");
+	    }
+	}
+	break;
+      }
+  fclose (f);
+  return mem_reqd;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.1	(revision 21083)
@@ -0,0 +1,78 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_decompress_text 1 \*(Dt CITRI
+.SH NAME
+mg_decompress_text \- decompresses the compressed text of a collection
+.SH SYNOPSIS
+.B mg_decompress_text
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_decompress_text
+decompresses the compressed text of a collection, inserts paragraph and
+document markers, writing the output to
+.IR stdout ".  "
+This program was created
+to be used as a type of
+.BR mg_get (1).
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.text
+Compressed documents.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.invf.paragraph
+Paragraph counts for documents.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_passes (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_decompress_text.c	(revision 21083)
@@ -0,0 +1,167 @@
+#include "sysfuncs.h"
+
+#include "filestats.h"
+#include "netorder.h"
+#include "memlib.h"
+#include "messages.h"
+#include "huffman.h"
+#include "bitio_m_mem.h"
+#include "bitio_m.h"
+#include "bitio_stdio.h"
+#include "huffman_stdio.h"
+
+#include "mg_files.h"
+#include "mg.h"
+#include "backend.h"  /* compressed_dict struct */
+#include "text_get.h"
+#include "words.h"
+
+#define EOD         '\002'
+#define EOP         '\003'
+
+/* These are defined in mgquery, and they need to be here for backend.o */
+/* Messy I know but this was meant to be a quick hack :-) */
+#if defined(PARADOCNUM) || defined(NZDL)
+int *Paragraph = NULL;
+int Documents = 0;
+#endif
+
+int
+main (int argc, char **argv)
+{
+  FILE *text, *text_idx, *para;
+  File *text_comp_dict = NULL, *text_aux_dict = NULL, *text_fast_comp_dict = NULL;
+
+  int ch;
+  unsigned long start, finish, len;
+  u_long total_chars = 0;
+  u_char *c_buffer = 0;
+  int buf_len = -1;
+  u_char *uc_buffer = 0;
+  int ULen;
+  compression_dict *cd = NULL;
+  compressed_text_header cth;
+  u_long doc;
+  int count;
+  char *filename = "";
+  char path[512];
+  opterr = 0;
+  msg_prefix = argv[0];
+
+  while ((ch = getopt (argc, argv, "f:d:h")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	filename = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-h] [-d directory] -f name\n",
+		 argv[0]);
+	exit (1);
+      }
+
+  /* Open files */
+  text = open_file (filename, TEXT_SUFFIX, "rb", MAGIC_TEXT, MG_ABORT);
+  fread ((char *)&cth, sizeof (cth), 1, text);
+
+  text_idx = open_file (filename, TEXT_IDX_SUFFIX, "rb", MAGIC_TEXI, MG_ABORT);
+  fread ((char *)&cth, sizeof (cth), 1, text_idx);
+
+  NTOHUL(cth.num_of_docs);
+  NTOHD(cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(cth.num_of_words);
+  NTOHUL(cth.length_of_longest_doc);
+  NTOHD(cth.ratio);
+
+  para = open_file (filename, INVF_PARAGRAPH_SUFFIX, "rb", MAGIC_PARAGRAPH, MG_CONTINUE);
+
+  sprintf (path, FILE_NAME_FORMAT, get_basepath(), filename, TEXT_DICT_FAST_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(text_fast_comp_dict = Fopen (path, "rb", MAGIC_FAST_DICT)))
+    {
+      sprintf (path, FILE_NAME_FORMAT, get_basepath(), filename, TEXT_DICT_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+      text_comp_dict = Fopen (path, "rb", MAGIC_DICT);
+      if (!text_comp_dict)
+	FatalError (1, "Could not open compressed dictionary");
+      sprintf (path, FILE_NAME_FORMAT, get_basepath(), filename, TEXT_DICT_AUX_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+      text_aux_dict = Fopen (path, "rb", MAGIC_AUX_DICT);
+    }
+
+  cd = LoadCompDict (text_comp_dict, text_aux_dict, text_fast_comp_dict);
+
+
+  /* Uncompress text */
+
+  doc = 1;
+  fread ((char *)&start, sizeof (start), 1, text_idx);
+  if (para)
+    fread ((char *)&count, sizeof (count), 1, para);
+  else
+    count = 1;
+
+  for (;;)
+    {
+      fread ((char *) &finish, sizeof (finish), 1, text_idx);
+      len = finish - start;
+      
+      if ((int) len > buf_len)
+	{
+	  if (c_buffer)
+	    {
+	      Xfree (c_buffer);
+	      Xfree (uc_buffer);
+	    }
+	  if (!(c_buffer = Xmalloc (len)))
+	    FatalError (1, "Cannot allocate memory for compressed buffer");
+	  if (!(uc_buffer = Xmalloc ((int) (cth.ratio * 1.01 * len) + 100)))
+	    FatalError (1, "Cannot allocate memory for uncompressed buffer");
+	  buf_len = len;
+	}
+
+      fread (c_buffer, 1, len, text);
+      DecodeText (cd, c_buffer, len, uc_buffer, &ULen);
+      fwrite (uc_buffer, ULen, sizeof (u_char), stdout);
+      fflush (stdout);
+
+      total_chars += ULen;
+
+      if (++doc > cth.num_of_docs)
+	{
+	  if (para)
+	    fputc (EOP, stdout);
+	  fputc (EOD, stdout);
+	  fflush (stdout);
+	  break;
+	}
+
+      if (!--count)
+	{
+	  /* End of document */
+	  fputc (EOD, stdout);
+	  if (para)
+	    fread ((char *)&count, sizeof (count), 1, para);
+	  else
+	    count = 1;
+	}
+      else
+	fputc (EOP, stdout);
+      fflush (stdout);
+      start = finish;
+    }
+
+  /* Close files */
+
+  fclose (text);
+  fclose (text_idx);
+  if (para)
+    fclose (para);
+
+#if 0
+  printf ("\n#Total chars output = %lu\n", total_chars);
+#endif
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.c	(revision 21083)
@@ -0,0 +1,73 @@
+/**************************************************************************
+ *
+ * mg_errors.c -- Error related stuff for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+#include "mg_errors.h"
+
+
+
+int mg_errno = MG_NOERROR;
+
+char *mg_errorstrs[] =
+{
+  "No error",
+  "Out of memory",
+  "File \"%s\" not found",
+  "Bad magic number in \"%s\"",
+  "Error reading \"%s\"",
+  "MG_BUFTOOSMALL",
+  "Files required for level 2 and 3 inversion are missing"};
+
+
+/* [RJM 07/98: Memory Leak] -- rest of file */
+
+static char null_data[] = "";
+char *mg_error_data = null_data;
+
+
+void MgErrorData (char *s)
+{
+  /* free the current error string, unless it is the null string */
+  if ((mg_error_data != NULL) && (mg_error_data != null_data)) {
+    Xfree (mg_error_data);
+    mg_error_data = null_data;
+  }
+
+  /* make a copy of the string */
+  mg_error_data = Xstrdup (s);
+
+  /* if the alloc failed set the error to the null string */
+  if (!mg_error_data) mg_error_data = null_data;
+}
+
+
+void MgErrorDeinit (void)
+{
+  /* free the current error string, unless it is the null string */
+  if ((mg_error_data != NULL) && (mg_error_data != null_data)) {
+    Xfree (mg_error_data);
+    mg_error_data = null_data;
+  }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_errors.h	(revision 21083)
@@ -0,0 +1,39 @@
+/**************************************************************************
+ *
+ * mg_errors.h -- Error related stuff for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+extern int mg_errno;
+extern char *mg_error_data;
+extern char *mg_errorstrs[];
+
+
+#define MG_NOERROR 0
+#define MG_NOMEM 1
+#define MG_NOFILE 2
+#define MG_BADMAGIC 3
+#define MG_READERR 4
+#define MG_BUFTOOSMALL 5
+#define MG_INVERSION 6
+
+void MgErrorData (char *s);
+void MgErrorDeinit (void);
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_fast_comp_dict 1 \*(Dt CITRI
+.SH NAME
+mg_fast_comp_dict \- build a fast loading compression dictionary
+.SH SYNOPSIS
+.B mg_fast_comp_dict
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_fast_comp_dict
+builds a fast-loading compression dictionary from the standard
+compression dictionary.  The new dictionary has the property that
+.BR mgquery (1)
+can load it in very quickly, making the startup time for
+.BR mgquery (1)
+much shorter.  The new dictionary is larger on disk than the original,
+but they are no different when it comes to memory usage.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.dict
+Compression dictionary.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_fast_comp_dict.c	(revision 21083)
@@ -0,0 +1,798 @@
+/**************************************************************************
+ *
+ * mg_fast_comp_dict.c -- Program to generate a fast compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:06  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:44  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:34:57  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:55  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:47  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "filestats.h"
+#include "huffman.h"
+#include "timing.h"
+#include "messages.h"
+#include "memlib.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "local_strings.h"
+#include "mg.h"
+#include "text.h"
+#include "invf.h"
+#include "lists.h"
+#include "backend.h"
+#include "mg_files.h"
+#include "locallib.h"
+#include "words.h"
+
+
+
+#define ALIGN_SIZE(p,t) (((p) + (sizeof(t)-1)) & (~(sizeof(t)-1)))
+
+#define WORDNO(p, base) ((((char*)(p))-((char*)(base)))/sizeof(u_char*))
+#define FIXUP(p) (fixup[WORDNO(p,buffer)/8] |= (1<<(WORDNO(p, buffer) & 7)))
+
+#define IS_FIXUP(p) ((fixup[WORDNO(p,buffer)/8] & (1<<(WORDNO(p, buffer) & 7))) != 0)
+
+#define FIXUP_VALS(vals) do {						\
+	int i;								\
+	for (i=0; i < MAX_HUFFCODE_LEN+1; i++)				\
+	  FIXUP(&vals[i]);						\
+      } while(0)
+
+
+
+static u_long mem_for_comp_dict (char *filename);
+static void load_comp_dict (char *filename);
+static void save_fast_dict (char *filename);
+static void unfixup_buffer (void);
+
+
+static void *buffer;
+static void *cur;
+static u_char *fixup;
+static u_long mem, fixup_mem;
+
+int main (int argc, char **argv)
+{
+  ProgTime StartTime;
+  int ch;
+  char *filename = "";
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "f:d:h")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	filename = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file] [-d data directory] [-h]\n",
+		 argv[0]);
+	exit (1);
+      }
+  GetTime (&StartTime);
+
+  mem = mem_for_comp_dict (filename);
+
+  fixup_mem = (ALIGN_SIZE (mem, u_char *) / sizeof (u_char *) + 7) / 8;
+
+  cur = buffer = Xmalloc (mem);
+  bzero (buffer, mem);
+  fixup = Xmalloc (fixup_mem);
+  bzero (fixup, fixup_mem);
+
+  Message ("Estimated memory for fast_dict %u", mem);
+  Message ("Estimated memory for fixups %u", fixup_mem);
+
+  load_comp_dict (filename);
+
+  Message ("Actual memory for fast_dict %u", (char *) cur - (char *) buffer);
+
+  if ((u_long) cur > (u_long) buffer + mem)
+    FatalError (1, "The buffer was not big enough for the dictionary");
+
+  {
+    /* [RPAP - Jan 97: Endian Ordering] */
+    compression_dict *cd = (compression_dict *) buffer;
+    int i, which;
+
+    /* cfh */
+    for (which = 0; which <= 1; which++)
+      {
+	int j;
+	
+	HTONSI(cd->cfh[which]->hd.num_codes);
+	HTONSI(cd->cfh[which]->hd.mincodelen);
+	HTONSI(cd->cfh[which]->hd.maxcodelen);
+	for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	  {
+	    HTONSI(cd->cfh[which]->hd.lencount[j]);
+	    HTONUL(cd->cfh[which]->hd.min_code[j]);
+	  }
+	HTONUL(cd->cfh[which]->uncompressed_size);
+	for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	  HTONUL(cd->cfh[which]->huff_words_size[j]);
+      }
+    HTONUL(cd->MemForCompDict);
+    /* ad */
+    if (cd->cdh.novel_method == MG_NOVEL_BINARY ||
+	cd->cdh.novel_method == MG_NOVEL_DELTA ||
+	cd->cdh.novel_method == MG_NOVEL_HYBRID ||
+	cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+      for (which = 0; which <= 1; which++)
+	{
+	  int j;
+	  
+	  HTONUL(cd->ad->afh[which].num_frags);
+	  HTONUL(cd->ad->afh[which].mem_for_frags);
+	  for (j = 0; j < 33; j++)
+	    {
+	      HTONSI(cd->ad->blk_start[which][j]);
+	      HTONSI(cd->ad->blk_end[which][j]);
+	    }
+	}
+    /* cdh */
+    HTONUL(cd->cdh.dict_type);
+    HTONUL(cd->cdh.novel_method);
+    for (i = 0; i < TEXT_PARAMS; i++)
+      HTONUL(cd->cdh.params[which]);
+    HTONUL(cd->cdh.num_words[0]);
+    HTONUL(cd->cdh.num_words[1]);
+    HTONUL(cd->cdh.num_word_chars[0]);
+    HTONUL(cd->cdh.num_word_chars[1]);
+    HTONUL(cd->cdh.lookback);
+    HTONSI(cd->fast_loaded);
+  }
+
+  unfixup_buffer ();
+
+  save_fast_dict (filename);
+
+  Message ("%s", ElapsedTime (&StartTime, NULL));
+  return 0;
+}
+
+
+
+static void 
+unfixup_buffer ()
+{
+  u_long *p;
+  for (p = buffer; (u_long) p < (u_long) cur; p++)
+    {
+      if (IS_FIXUP (p))
+	*p = *p - (u_long) buffer;
+    }
+}
+
+
+
+
+static u_long 
+mem_for_aux_dict (compression_dict_header * cdh, char *filename)
+{
+  int i;
+  u_long mem = sizeof (auxiliary_dict);
+  FILE *aux;
+
+  aux = open_file (filename, TEXT_DICT_AUX_SUFFIX, "rb",
+		   MAGIC_AUX_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  for (i = 0; i <= 1; i++)
+    {
+      aux_frags_header afh;
+      fread (&afh, sizeof (afh), 1, aux);
+      NTOHUL(afh.num_frags);  /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(afh.mem_for_frags);  /* [RPAP - Jan 97: Endian Ordering] */
+      mem += afh.num_frags * sizeof (u_char *);
+      mem = ALIGN_SIZE (mem + afh.mem_for_frags, u_char *);
+      fseek (aux, afh.mem_for_frags, SEEK_CUR);
+    }
+  fclose (aux);
+
+  return mem;
+}
+
+
+
+static u_long 
+mem_for_words (FILE * dict, compression_dict_header * cdh,
+	       comp_frags_header * cfh)
+{
+  u_long mem = 0;
+  u_long i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+
+  lookback = cdh->lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++)
+    {
+      ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+      mem_reqd += cfh->huff_words_size[i];
+    }
+
+  mem += ptrs_reqd * sizeof (u_char *);
+  mem += (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **);
+  mem += mem_reqd;
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val;
+      for (val = getc (dict) & 0xf; val; val--)
+	getc (dict);
+    }
+  return ALIGN_SIZE (mem, u_char *);
+}
+
+
+
+
+static u_long 
+mem_for_comp_dict (char *filename)
+{
+  u_long mem = sizeof (compression_dict);
+  compression_dict_header cdh;
+  comp_frags_header cfh;
+  FILE *dict;
+  int which;
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  dict = open_file (filename, TEXT_DICT_SUFFIX, "rb",
+		    MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread (&cdh, sizeof (cdh), 1, dict);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cdh.dict_type);
+  NTOHUL(cdh.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    NTOHUL(cdh.params[i]);
+  NTOHUL(cdh.num_words[0]);
+  NTOHUL(cdh.num_words[1]);
+  NTOHUL(cdh.num_word_chars[0]);
+  NTOHUL(cdh.num_word_chars[1]);
+  NTOHUL(cdh.lookback);
+
+  for (which = 0; which < 2; which++)
+    switch (cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  mem += sizeof (comp_frags_header);
+	  Read_cfh (dict, &cfh, NULL, NULL);
+
+	  /* Don't need to count the space for the clens of the huffman data */
+
+	  mem += mem_for_words (dict, &cdh, &cfh);
+	  if (cfh.hd.clens)
+	    Xfree (cfh.hd.clens);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  huff_data hd;
+	  if (cdh.num_words[which])
+	    {
+	      mem += sizeof (comp_frags_header);
+	      Read_cfh (dict, &cfh, NULL, NULL);
+
+	      /* Don't need to count the space for the clens of the
+	         huffman data */
+
+	      mem += mem_for_words (dict, &cdh, &cfh);
+	      if (cfh.hd.clens)
+		Xfree (cfh.hd.clens);
+
+	    }
+
+	  mem += sizeof (hd);
+	  Read_Huffman_Data (dict, &hd, NULL, NULL);
+	  if (hd.clens)
+	    Xfree (hd.clens);
+	  mem += hd.num_codes * sizeof (unsigned long);
+	  mem += (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+	  mem += sizeof (hd);
+	  Read_Huffman_Data (dict, &hd, NULL, NULL);
+	  if (hd.clens)
+	    Xfree (hd.clens);
+	  mem += hd.num_codes * sizeof (unsigned long);
+	  mem += (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  huff_data hd;
+	  if (cdh.num_words[which])
+	    {
+	      mem += sizeof (comp_frags_header);
+	      Read_cfh (dict, &cfh, NULL, NULL);
+
+	      /* Don't need to count the space for the clens of the
+	         huffman data */
+
+	      mem += mem_for_words (dict, &cdh, &cfh);
+	      if (cfh.hd.clens)
+		Xfree (cfh.hd.clens);
+
+	    }
+	  switch (cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      mem += sizeof (hd);
+	      Read_Huffman_Data (dict, &hd, NULL, NULL);
+	      if (hd.clens)
+		Xfree (hd.clens);
+	      mem += hd.num_codes * sizeof (unsigned long);
+	      mem += (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+	      mem += sizeof (hd);
+	      Read_Huffman_Data (dict, &hd, NULL, NULL);
+	      if (hd.clens)
+		Xfree (hd.clens);
+	      mem += hd.num_codes * sizeof (unsigned long);
+	      mem += (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+	      break;
+	    case MG_NOVEL_BINARY:
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    case MG_NOVEL_HYBRID_MTF:
+	      break;
+	    }
+	  break;
+	}
+      }
+  fclose (dict);
+
+  if (cdh.novel_method == MG_NOVEL_BINARY ||
+      cdh.novel_method == MG_NOVEL_DELTA ||
+      cdh.novel_method == MG_NOVEL_HYBRID ||
+      cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    mem += mem_for_aux_dict (&cdh, filename);
+
+  return ALIGN_SIZE (mem, u_char *);
+}
+
+
+
+void *
+getmem (u_long size, int align)
+{
+  void *res;
+  cur = (void *) (((u_long) cur + (align - 1)) & (~(align - 1)));
+  res = cur;
+  cur = (char *) cur + size;
+  if ((long) cur > (long) buffer + mem)
+    FatalError (1, "The buffer was not big enough for the dictionary");
+  return res;
+}
+
+
+
+
+
+
+
+
+
+
+
+static auxiliary_dict *
+LoadAuxDict (compression_dict_header * cdh,
+	     char *filename)
+{
+  auxiliary_dict *ad;
+  int i;
+  FILE *aux;
+
+  aux = open_file (filename, TEXT_DICT_AUX_SUFFIX, "rb",
+		   MAGIC_AUX_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  ad = getmem (sizeof (auxiliary_dict), sizeof (u_char *));
+
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+      u_char *pos;
+
+      fread (&ad->afh[i], sizeof (aux_frags_header), 1, aux);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(ad->afh[i].num_frags);
+      NTOHUL(ad->afh[i].mem_for_frags);
+
+      ad->word_data[i] = getmem (ad->afh[i].mem_for_frags, 1);
+      FIXUP (&ad->word_data[i]);
+
+      ad->words[i] = getmem (ad->afh[i].num_frags * sizeof (u_char *),
+			     sizeof (u_char *));
+      FIXUP (&ad->words[i]);
+
+      fread (ad->word_data[i], ad->afh[i].mem_for_frags, sizeof (u_char), aux);
+
+      pos = ad->word_data[i];
+      for (j = 0; j < ad->afh[i].num_frags; j++)
+	{
+	  ad->words[i][j] = pos;
+	  FIXUP (&ad->words[i][j]);
+	  pos += *pos + 1;
+	}
+      if (cdh->novel_method == MG_NOVEL_HYBRID ||
+	  cdh->novel_method == MG_NOVEL_HYBRID_MTF)
+	{
+	  int num;
+	  num = 1;
+	  ad->blk_start[i][0] = 0;
+	  ad->blk_end[i][0] = cdh->num_words[i] - 1;
+	  while (num < 33)
+	    {
+	      ad->blk_start[i][num] = ad->blk_end[i][num - 1] + 1;
+	      ad->blk_end[i][num] = ad->blk_start[i][num] +
+		(ad->blk_end[i][num - 1] - ad->blk_start[i][num - 1]) * 2;
+	      num++;
+	    }
+	}
+    }
+  fclose (aux);
+  return (ad);
+}
+
+
+
+
+
+static u_char ***
+ReadInWords (FILE * dict, compression_dict * cd,
+	     comp_frags_header * cfh, u_char ** escape)
+{
+  int i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+  int num_set[MAX_HUFFCODE_LEN + 1];
+  u_char *next_word[MAX_HUFFCODE_LEN + 1];
+  u_char **vals;
+  u_char ***values;
+  u_char word[MAXWORDLEN + 1];
+  u_char last_word[MAX_HUFFCODE_LEN + 1][MAXWORDLEN + 1];
+
+  lookback = cd->cdh.lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++)
+    {
+      ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+      mem_reqd += cfh->huff_words_size[i];
+    }
+
+  vals = getmem (ptrs_reqd * sizeof (*vals), sizeof (u_char *));
+
+  values = getmem ((MAX_HUFFCODE_LEN + 1) * sizeof (u_char **), sizeof (u_char **));
+
+  next_word[0] = getmem (mem_reqd, sizeof (char));
+
+  cd->MemForCompDict += ptrs_reqd * sizeof (*vals) +
+    (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **) +
+    mem_reqd;
+
+  values[0] = vals;
+  FIXUP (&values[0]);
+  values[0][0] = next_word[0];
+  FIXUP (&values[0][0]);
+  for (i = 1; i <= cfh->hd.maxcodelen; i++)
+    {
+      int next_start = (values[i - 1] - vals) +
+      ((cfh->hd.lencount[i - 1] + ((1 << lookback) - 1)) >> lookback);
+      values[i] = &vals[next_start];
+      FIXUP (&values[i]);
+      next_word[i] = next_word[i - 1] + cfh->huff_words_size[i - 1];
+      values[i][0] = next_word[i];
+      FIXUP (&values[i][0]);
+    }
+
+  bzero ((char *) num_set, sizeof (num_set));
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val, copy;
+      register int len = cfh->hd.clens[i];
+      val = getc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      fread (word + copy + 1, sizeof (u_char), val, dict);
+      *word = val + copy;
+
+      if ((num_set[len] & ((1 << lookback) - 1)) == 0)
+	{
+	  values[len][num_set[len] >> lookback] = next_word[len];
+	  FIXUP (&values[len][num_set[len] >> lookback]);
+	  memcpy (next_word[len], word, *word + 1);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    {
+	      *escape = next_word[len];
+	      FIXUP (escape);
+	    }
+	  next_word[len] += *word + 1;
+	}
+      else
+	{
+	  copy = prefixlen (last_word[len], word);
+	  memcpy (next_word[len] + 1, word + copy + 1, *word - copy);
+	  *next_word[len] = (copy << 4) + (*word - copy);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    {
+	      *escape = next_word[len];
+	      FIXUP (escape);
+	    }
+	  next_word[len] += (*word - copy) + 1;
+	}
+      memcpy (last_word[len], word, *word + 1);
+      num_set[len]++;
+    }
+  if (cfh->hd.clens)
+    Xfree (cfh->hd.clens);
+  cfh->hd.clens = NULL;
+  return values;
+}
+
+
+static unsigned long **
+Generate_Fast_Huffman_Vals (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *fcode[MAX_HUFFCODE_LEN + 1];
+  unsigned long **values;
+  unsigned long *vals;
+
+  if (!data)
+    return (NULL);
+  vals = getmem (data->num_codes * sizeof (*vals), sizeof (long *));
+  values = getmem ((MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *),
+		   sizeof (long *));
+
+  bzero ((char *) values, (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *));
+
+  if (mem)
+    *mem += data->num_codes * sizeof (*vals) +
+      (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+  fcode[0] = values[0] = &vals[0];
+  FIXUP (&values[0]);
+  for (i = 1; i <= data->maxcodelen; i++)
+    {
+      fcode[i] = values[i] = &vals[(values[i - 1] - vals) + data->lencount[i - 1]];
+      FIXUP (&values[i]);
+    }
+
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      *fcode[(int) (data->clens[i])]++ = i;
+  return (values);
+}
+
+
+
+static void 
+load_comp_dict (char *filename)
+{
+  FILE *dict;
+  int which;
+  compression_dict *cd;
+
+  cd = getmem (sizeof (compression_dict), sizeof (u_char *));
+  cd->fast_loaded = 1;
+
+  dict = open_file (filename, TEXT_DICT_SUFFIX, "rb",
+		    MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  Read_cdh (dict, &cd->cdh, NULL, NULL);
+
+  for (which = 0; which < 2; which++)
+    switch (cd->cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  cd->cfh[which] = getmem (sizeof (*cd->cfh[which]), sizeof (u_char *));
+	  cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	  Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL);
+
+	  cd->values[which] = ReadInWords (dict, cd, cd->cfh[which], NULL);
+	  FIXUP (&cd->cfh[which]);
+	  FIXUP (&cd->values[which]);
+	  cd->escape[which] = NULL;
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  huff_data *hd;
+	  u_long **vals;
+	  if (cd->cdh.num_words[which])
+	    {
+	      cd->cfh[which] = getmem (sizeof (*cd->cfh[which]), sizeof (u_char *));
+	      cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	      Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL);
+	      cd->values[which] = ReadInWords (dict, cd, cd->cfh[which],
+					       &cd->escape[which]);
+	      FIXUP (&cd->cfh[which]);
+	      FIXUP (&cd->values[which]);
+	      FIXUP (&cd->escape[which]);
+	    }
+
+	  hd = getmem (sizeof (huff_data), sizeof (char *));
+	  cd->MemForCompDict += sizeof (huff_data);
+	  Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL);
+	  vals = Generate_Fast_Huffman_Vals (hd, &cd->MemForCompDict);
+	  cd->chars_huff[which] = hd;
+	  FIXUP (&cd->chars_huff[which]);
+	  cd->chars_vals[which] = vals;
+	  FIXUP (&cd->chars_vals[which]);
+	  if (hd->clens)
+	    Xfree (hd->clens);
+	  hd->clens = NULL;
+
+	  hd = getmem (sizeof (huff_data), sizeof (char *));
+	  cd->MemForCompDict += sizeof (huff_data);
+	  Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL);
+	  vals = Generate_Fast_Huffman_Vals (hd, &cd->MemForCompDict);
+	  cd->lens_huff[which] = hd;
+	  FIXUP (&cd->lens_huff[which]);
+	  cd->lens_vals[which] = vals;
+	  FIXUP (&cd->lens_vals[which]);
+	  if (hd->clens)
+	    Xfree (hd->clens);
+	  hd->clens = NULL;
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  huff_data *hd;
+	  u_long **vals;
+	  if (cd->cdh.num_words[which])
+	    {
+	      cd->cfh[which] = getmem (sizeof (*cd->cfh[which]), sizeof (u_char *));
+	      cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	      Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL);
+	      cd->values[which] = ReadInWords (dict, cd, cd->cfh[which],
+					       &cd->escape[which]);
+	      FIXUP (&cd->cfh[which]);
+	      FIXUP (&cd->values[which]);
+	      FIXUP (&cd->escape[which]);
+	    }
+	  switch (cd->cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      hd = getmem (sizeof (huff_data), sizeof (char *));
+	      cd->MemForCompDict += sizeof (huff_data);
+	      Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL);
+	      vals = Generate_Fast_Huffman_Vals (hd, &cd->MemForCompDict);
+	      cd->chars_huff[which] = hd;
+	      FIXUP (&cd->chars_huff[which]);
+	      cd->chars_vals[which] = vals;
+	      FIXUP (&cd->chars_vals[which]);
+	      if (hd->clens)
+		Xfree (hd->clens);
+	      hd->clens = NULL;
+
+	      hd = getmem (sizeof (huff_data), sizeof (char *));
+	      cd->MemForCompDict += sizeof (huff_data);
+	      Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL);
+	      vals = Generate_Fast_Huffman_Vals (hd, &cd->MemForCompDict);
+	      cd->lens_huff[which] = hd;
+	      FIXUP (&cd->lens_huff[which]);
+	      cd->lens_vals[which] = vals;
+	      FIXUP (&cd->lens_vals[which]);
+	      if (hd->clens)
+		Xfree (hd->clens);
+	      hd->clens = NULL;
+	      break;
+	    case MG_NOVEL_BINARY:
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    case MG_NOVEL_HYBRID_MTF:
+	      break;
+	    }
+	  break;
+	}
+      }
+  fclose (dict);
+
+
+  if (cd->cdh.novel_method == MG_NOVEL_BINARY ||
+      cd->cdh.novel_method == MG_NOVEL_DELTA ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    {
+      cd->ad = LoadAuxDict (&cd->cdh, filename);
+      FIXUP (&cd->ad);
+    }
+}
+
+
+static void 
+save_fast_dict (char *filename)
+{
+  FILE *fdict;
+
+  fdict = create_file (filename, TEXT_DICT_FAST_SUFFIX, "wb",
+		       MAGIC_FAST_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  {
+    u_long *p;
+    for (p = buffer; (u_long) p < (u_long) cur; p++)
+      {
+	if (IS_FIXUP (p))
+	  HTONUL(*p);
+      }
+  }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(mem);
+  HTONUL(fixup_mem);
+
+  fwrite (&mem, sizeof (mem), 1, fdict);
+  fwrite (&fixup_mem, sizeof (fixup_mem), 1, fdict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(mem);
+  NTOHUL(fixup_mem);
+
+  fwrite (buffer, sizeof (u_char), mem, fdict);
+  fwrite (fixup, sizeof (u_char), fixup_mem, fdict);
+
+  fclose (fdict);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.c	(revision 21083)
@@ -0,0 +1,261 @@
+/**************************************************************************
+ *
+ * mg_files.c -- Routines for handling files for the auxillary programs
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+
+
+/* This must contain a valid path without a trailing slash */
+static char *basepath = NULL;
+
+
+
+/* This sets the base path for all file operations */
+void 
+set_basepath (const char *bp)
+{
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  basepath = "";
+#else
+  char *s;
+  /* Free the memory for the base path if it has already been allocated */
+  if (basepath)
+    {
+      Xfree (basepath);
+      basepath = NULL;
+    }
+
+  if (!bp || *bp == '\0')
+    bp = ".";
+
+  s = strrchr (bp, '/');
+  if (s && *(s + 1) == '\0')
+    {
+      basepath = Xmalloc (strlen (bp) + 2);
+      if (!basepath)
+	return;
+      strcpy (basepath, bp);
+      strcat (basepath, ".");
+    }
+  else
+    basepath = Xstrdup (bp);
+#endif
+}
+
+
+
+/* return the currently defined basepath */
+char *
+get_basepath (void)
+{
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  return basepath;
+}
+
+
+
+/* This generates the name of a file. It places the name in the buffer
+   specified or if that is NULL it uses a static buffer. */
+char *
+make_name (const char *name, const char *suffix, char *buffer)
+{
+  static char path[512];
+  if (!buffer)
+    buffer = path;
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (buffer, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return buffer;
+}
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+open_named_file (const char *name, const char *mode,
+		 u_long magic_num, int err_mode)
+{
+  unsigned long magic;
+  FILE *f = NULL;
+  char *err;
+  f = fopen (name, mode);
+
+  if (!f)
+    {
+      err = "Unable to open \"%s\"";
+      goto error;
+    }
+
+  if (magic_num)
+    {
+      if (fread (&magic, sizeof (magic), 1, f) != 1)
+	{
+	  err = "No magic number \"%s\"";
+	  goto error;
+	}
+
+      NTOHUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+
+      if (!IS_MAGIC (magic))
+	{
+	  err = "No MG magic number \"%s\"";
+	  goto error;
+	}
+
+      if (magic != magic_num)
+	{
+	  err = "Wrong MG magic number \"%s\"";
+	  goto error;
+	}
+    }
+  return f;
+
+error:
+  if (f)
+    fclose (f);
+  if (err_mode == MG_ABORT)
+    FatalError (1, err, name);
+  if (err_mode == MG_MESSAGE)
+    Message (err, name);
+  return NULL;
+}
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+open_file (const char *name, const char *suffix, const char *mode,
+	   u_long magic_num, int err_mode)
+{
+  char path[512];
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (path, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return open_named_file (path, mode, magic_num, err_mode);
+}
+
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+create_named_file (const char *name, const char *mode,
+		   u_long magic_num, int err_mode)
+{
+  FILE *f = NULL;
+  char *err;
+  f = fopen (name, mode);
+
+  if (!f)
+    {
+      err = "Unable to open \"%s\"";
+      goto error;
+    }
+
+  if (magic_num)
+    HTONUL(magic_num);  /* [RPAP - Jan 97: Endian Ordering] */
+    if (fwrite (&magic_num, sizeof (magic_num), 1, f) != 1)
+      {
+	err = "Couldn't write magic number \"%s\"";
+	goto error;
+      }
+
+  return f;
+
+error:
+  if (f)
+    fclose (f);
+  if (err_mode == MG_ABORT)
+    FatalError (1, err, name);
+  if (err_mode == MG_MESSAGE)
+    Message (err, name);
+  return NULL;
+}
+
+
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+create_file (const char *name, const char *suffix, const char *mode,
+	     u_long magic_num, int err_mode)
+{
+  char path[512];
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (path, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return create_named_file (path, mode, magic_num, err_mode);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_files.h	(revision 21083)
@@ -0,0 +1,329 @@
+/**************************************************************************
+ *
+ * mg_files.h -- Routines for handling files for the auxillary programs
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef MG_FILES_H
+#define MG_FILES_H
+
+#include "sysfuncs.h"
+
+/* Magic numbers for the different types of files */
+
+#define GEN_MAGIC(a,b,c,d) ((unsigned long)(((a)<<24) + ((b)<<16) + \
+					    ((c)<<8) + (d)))
+
+#define MAGIC_XXXX		GEN_MAGIC('M','G', 0 , 0)
+#define MAGIC_STATS_DICT	GEN_MAGIC('M','G','S','D')
+#define MAGIC_AUX_DICT		GEN_MAGIC('M','G','A','D')
+#define MAGIC_FAST_DICT		GEN_MAGIC('M','G','F','D')
+#define MAGIC_DICT		GEN_MAGIC('M','G','D', 0 )
+#define MAGIC_STEM_BUILD	GEN_MAGIC('M','G','S', 0 )
+#define MAGIC_HASH		GEN_MAGIC('M','G','H', 0 )
+#define MAGIC_STEM		GEN_MAGIC('M','G','s', 0 )
+#define MAGIC_CHUNK		GEN_MAGIC('M','G','C', 0 )
+#define MAGIC_CHUNK_TRANS	GEN_MAGIC('M','G','c', 0 )
+#define MAGIC_TEXT		GEN_MAGIC('M','G','T', 0 )
+#define MAGIC_TEXI		GEN_MAGIC('M','G','t', 0 )
+#define MAGIC_TEXI_WGT		GEN_MAGIC('M','G','t','W')
+#define MAGIC_INVF		GEN_MAGIC('M','G','I', 0 )
+#define MAGIC_INVI		GEN_MAGIC('M','G','i', 0 )
+#define MAGIC_WGHT		GEN_MAGIC('M','G','W', 0 )
+#define MAGIC_WGHT_APPROX	GEN_MAGIC('M','G','w', 0 )
+#define MAGIC_PARAGRAPH		GEN_MAGIC('M','G','P', 0 )
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAGIC_STEM_1            GEN_MAGIC('M','G','s','1')
+#define MAGIC_STEM_2            GEN_MAGIC('M','G','s','2')
+#define MAGIC_STEM_3            GEN_MAGIC('M','G','s','3')
+
+#define IS_MAGIC(a) ((((u_long)(a)) & 0xffff0000) == MAGIC_XXXX)
+
+
+/* err_mode values for open_file and create_file */
+#define MG_ABORT 0
+#define MG_MESSAGE 1
+#define MG_CONTINUE 2
+
+
+
+
+
+/* File suffixes */
+
+
+/* The compression dictionary built by txt.pass1 */
+#ifdef SHORT_SUFFIX
+# define TEXT_STATS_DICT_SUFFIX	 ".tsd"
+#else
+# define TEXT_STATS_DICT_SUFFIX	 ".text.stats"
+#endif
+
+/* The compression dictionary built by text.pass1 and comp_dict.process */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_SUFFIX	 ".td"
+#else
+# define TEXT_DICT_SUFFIX	 ".text.dict"
+#endif
+
+/* The compression dictionary built by mg_make_fast_dict */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_FAST_SUFFIX	 ".tdf"
+#else
+# define TEXT_DICT_FAST_SUFFIX	 ".text.dict.fast"
+#endif
+
+/* The auxilary dictionary built by text.pass2 */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_AUX_SUFFIX	 ".tda"
+#else
+# define TEXT_DICT_AUX_SUFFIX	 ".text.dict.aux"
+#endif
+
+/* The compressed text build by text.pass2 */
+#ifdef SHORT_SUFFIX
+# define TEXT_SUFFIX		 ".t"
+#else
+# define TEXT_SUFFIX		 ".text"
+#endif
+
+/* The combined compressed text index and document weight file */
+#ifdef SHORT_SUFFIX
+# define TEXT_IDX_WGT_SUFFIX	 ".tiw"
+#else
+# define TEXT_IDX_WGT_SUFFIX	 ".text.idx.wgt"
+#endif
+
+/* The compressed text index file */
+#ifdef SHORT_SUFFIX
+# define TEXT_IDX_SUFFIX	 	".ti"
+#else
+# define TEXT_IDX_SUFFIX	 	".text.idx"
+#endif
+
+/* The dictionary of stemmed words build by invf.pass1 and ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_SUFFIX         ".id"
+#else
+# define INVF_DICT_SUFFIX         ".invf.dict"
+#endif
+
+/* The dictionary of stemmed words build by stem.process */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_SUFFIX ".idb"
+#else
+# define INVF_DICT_BLOCKED_SUFFIX ".invf.dict.blocked"
+#endif
+
+/* The exact document weights file build by make.weights, invf.pass2,
+   or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define WEIGHTS_SUFFIX           ".w"
+#else
+# define WEIGHTS_SUFFIX           ".weight"
+#endif
+
+/* The approximate weights file built by make.weights */
+#ifdef SHORT_SUFFIX
+# define APPROX_WEIGHTS_SUFFIX    ".wa"
+#else
+# define APPROX_WEIGHTS_SUFFIX    ".weight.approx"
+#endif
+
+/* The inverted file build by invf.pass2 or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define INVF_SUFFIX              ".i"
+#else
+# define INVF_SUFFIX              ".invf"
+#endif
+
+/* The inverted file index build by invf.pass2 or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define INVF_IDX_SUFFIX          ".ii"
+#else
+# define INVF_IDX_SUFFIX          ".invf.idx"
+#endif
+
+/* The inverted file chunk descriptor built by ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_CHUNK_SUFFIX        ".ic"
+#else
+# define INVF_CHUNK_SUFFIX        ".invf.chunk"
+#endif
+
+/* The word index translation file built by ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_CHUNK_TRANS_SUFFIX  ".ict"
+#else
+# define INVF_CHUNK_TRANS_SUFFIX  ".invf.chunk.trans"
+#endif
+
+/* The hashed stemmed dictionary built by make.perf_hash */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_HASH_SUFFIX    ".idh"
+#else
+# define INVF_DICT_HASH_SUFFIX    ".invf.dict.hash"
+#endif
+
+/* The paragraph descriptior file built by invf.pass1 or ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_PARAGRAPH_SUFFIX    ".ip"
+#else
+# define INVF_PARAGRAPH_SUFFIX    ".invf.paragraph"
+#endif
+
+/* The trace file build by mg.builder. */
+#ifdef SHORT_SUFFIX
+# define TRACE_SUFFIX             ".trc"
+#else
+# define TRACE_SUFFIX             ".trace"
+#endif
+
+/* The compression stats file build by mg.builder. */
+#ifdef SHORT_SUFFIX
+# define COMPRESSION_STATS_SUFFIX ".cs"
+#else
+# define COMPRESSION_STATS_SUFFIX ".compression.stats"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The casefolded index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_1_SUFFIX ".ib1"
+#else
+# define INVF_DICT_BLOCKED_1_SUFFIX ".invf.dict.blocked.1"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The stemmed index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_2_SUFFIX ".ib2"
+#else
+# define INVF_DICT_BLOCKED_2_SUFFIX ".invf.dict.blocked.2"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The casefolded and stemmed  index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_3_SUFFIX ".ib3"
+#else
+# define INVF_DICT_BLOCKED_3_SUFFIX ".invf.dict.blocked.3"
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+#define FILE_NAME_FORMAT "%s%s%s"
+#else
+#define FILE_NAME_FORMAT "%s/%s%s"
+#endif
+
+
+/* This sets the base path for all file operations */
+void set_basepath (const char *bp);
+
+
+/* return the currently defined basepath */
+char *get_basepath (void);
+
+
+
+
+/* This generates the name of a file. It places the name in the buffer
+   specified or if that is NULL it uses a static buffer. */
+char *make_name (const char *name, const char *suffix, char *buffer);
+
+
+
+
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *open_named_file (const char *name, const char *mode,
+		       u_long magic_num, int err_mode);
+
+
+
+
+/* This will open the specified file and check its magic number.
+
+   err_mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *open_file (const char *name, const char *suffix, const char *mode,
+		 u_long magic_num, int err_mode);
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *create_named_file (const char *name, const char *mode,
+			 u_long magic_num, int err_mode);
+
+
+
+/* This will create the specified file and set its magic number.
+
+   err_mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *create_file (const char *name, const char *suffix, const char *mode,
+		   u_long magic_num, int err_mode);
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.1	(revision 21083)
@@ -0,0 +1,95 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_hilite_words 1 \*(Dt CITRI
+.SH NAME
+mg_hilite_words \- display text and highlight particular words which it contains
+.SH SYNOPSIS
+.B mg_hilite_words
+.if n .ti +9n
+[
+.B --stem_method [0-3]
+]
+.if n .ti +9n
+[
+.B --stemmer [english|lovin|french|simplefrench]
+]
+.if n .ti +9n
+[
+.B --style [bold|underline|italic|emphasis|strong]
+]
+.if n .ti +9n
+[
+.B --pager [less|more|html|???]
+]
+.if n .ti +9n
+.I list-of-words-to-highlight
+
+.SH DESCRIPTION
+.B mg_hilite_words
+reads text from stdin and outputs it into a pager such as
+less. It's command arguments include a list of stemmed words
+which if extracted from the text will be highlighted on the output
+using a highlighting style.
+
+It has been extended to output the highlighted text using html
+straight to stdout.
+
+.SH OPTIONS
+Options may appear in any order, but the
+.IR list-of-words-to-highlight ,
+must be last.
+.TP
+.B --stem_method [0-3]
+This option allows one to set the stemming method for the extraction of
+the words from the incoming text.
+This should match the way the inverted file index was created.
+The default is 3, which is fold and stem.
+.TP
+.B --stemmer [english|lovin|french|simplefrench]
+This option allows you to select the stemmer to use.  The
+default is the English stemmer.
+.TP
+.B --style [bold|underline|italic|emphasis|strong]
+This option sets the highlighting style.
+.IR Bold 
+and 
+.IR underline
+are utilised by the pager or for html output.
+.IR Italic,
+.IR emphasis,
+and
+.IR strong
+can only be used for html output.
+.TP
+.B --pager [less|more|html|???]
+One can use the standard 
+.IR less
+or
+.IR more
+pages for displaying the highlighted text.
+Or one can generate highlighted html using the paging setting of
+.IR html.
+One can also specify a custom pager of their own choosing (i.e. ???).
+.TP
+.B list-of-words-to-highlight
+Each word is taken as a command line argument.
+Each word should already be stemmed and folded according to
+the stem option.
+.SH USAGE
+This program was written primarily to be called by 
+.IR mgquery(1)
+.
+When the user selects the mode of "hilite" then this program
+is called for displaying the query-result documents instead of
+just the pager.
+.SH "SEE ALSO"
+.na
+.BR mgquery (1).
+
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_hilite_words.c	(revision 21083)
@@ -0,0 +1,693 @@
+/**************************************************************************
+ *
+ * mg_hilite_words -- display text and highlight particular words which 
+ *                    it contains
+ * Copyright (C) 1994 Tim Shimmin
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "getopt.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "stemmer.h"
+#include "words.h"
+
+
+/*
+ * Description
+ * -----------
+ *   Hilite_words reads text from stdin and outputs it into a pager such as
+ *   less. It's command arguments include a list of stemmed words 
+ *   which if extracted from the text will be highlighted on the output.
+ *
+ * Implementation
+ * --------------
+ *   Extracting of words - using PARSE_STEM_WORD & stemmer
+ *   
+ *   Highlighting of words - for standard pager:
+ *                             using back-space character code
+ *                             e.g. bolded a = "a\ba", underlined a = "_\ba"
+ *                         - for pager==html:
+ *                             use some of the standard html character 
+ *                             formatting tags
+ *
+ *   Storage of words - using hashtable (set) of size equalling a constant
+ *                      times the number of words
+ * 
+ * Usage
+ * -----
+ *   mg_hilite_words --stem_method [0-3] 
+ *                   --style [bold|underline|italic|emphasis|strong]
+ *                   --pager [less|more|html|???]
+ *                   --terminator [terminator-string]
+ *                   list-of-words-to-highlight
+ */
+
+/*
+ * Modifications:
+ *
+ * 21/Apr/95: To handle outputting html tags to stdout
+ *
+ */
+
+/* --- constants --- */
+
+/* highlighting styles */
+#define HILITE_MAX      5	/* the number of styles */
+#define BOLD 		0
+#define UNDERLINE	1
+#define ITALIC     	2
+#define EMPHASIS     	3
+#define STRONG     	4
+
+/* maximum length of line buffer */
+#define MAX_LINE_BUFFER 200
+
+/* set pager to this to get html hilited text to stdout */
+#define HTML_OUT "html"
+
+/* output types */
+#define PAGER 0
+#define HTML  1
+
+/* --- types --- */
+
+typedef u_char *Word;
+
+/* --- globals --- */
+
+/* keep in synch with constants */
+static char *hilite_names[] =
+{"bold", "underline", "italic", "emphasis", "strong"};
+static char *hilite_tags[] =
+{"B", "", "I", "EM", "STRONG"};
+static short hilite_style = BOLD;
+static char *pager = "less";
+static int stemmer_num = 0;	/* Lovin's stemmer */
+static int stem_method = 3;	/* fold & stem */
+static char **word_list;
+static int num_of_words = 0;
+static int output_type = PAGER;
+static char *terminator = NULL;
+
+/* --- prototypes --- */
+
+static Word copy_c_word (char *w);
+static void process_words (char **words, int num_of_words);
+static int get_line (u_char * line, int n, FILE * stream);
+static void process_text (FILE * input_file, FILE * output_file);
+static void copy_word (u_char * w1, u_char * w2);
+static void process_buffer (u_char * s_in, int len, FILE * output_file);
+static void output_word (u_char * s_start, u_char * s_finish, FILE * output_file);
+static void output_hilite_word (u_char * s_start, u_char * s_finish,
+				FILE * output_file);
+static void process_args (int argc, char *argv[]);
+static void print_line (u_char * line, int n, FILE * stream);
+
+
+/******************************** word set ************************************/
+
+#include "hash.h"
+#include "locallib.h"
+
+#define SIZE_FACTOR 2
+
+typedef Word *WordSet;
+static WordSet set_of_words = NULL;
+static int hash_size = 0;
+
+/* prototypes - set routines */
+static void set_create (int num_of_words);
+static void set_add (Word word);
+static int set_member (Word word);
+static void set_print (void);
+
+/* =========================================================================
+ * Function: set_print
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+set_print (void)
+{
+  int i = 0;
+
+  for (i = 0; i < hash_size; i++)
+    {
+      Word word = set_of_words[i];
+
+      if (word)
+	{
+	  int len = *word++;
+
+	  fprintf (stderr, "[%d] = ", i);
+	  while (len--)
+	    fputc (*word++, stderr);
+	  fputc ('\n', stderr);
+	}
+    }
+
+}
+
+
+/* =========================================================================
+ * Function: set_create
+ * Description: 
+ *      Allocate memory for the set
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+set_create (int num_of_words)
+{
+  WordSet set;
+
+  hash_size = prime (num_of_words * SIZE_FACTOR);
+  set = (WordSet) malloc (hash_size * sizeof (Word));
+  if (!set)
+    FatalError (1, "Runout of memory for word hashtable");
+  bzero ((char *) set, hash_size * sizeof (Word));  /* [RPAP - Feb 97: WIN32 Port] */
+
+  set_of_words = set;
+
+}
+
+/* =========================================================================
+ * Function: set_add
+ * Description: 
+ *      Add a string element to the set.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+set_add (Word word)
+{
+  int hash_val;
+  int hash_step;
+
+  HASH (hash_val, hash_step, word, hash_size);
+
+  /* loop around in case of collisions and need to step */
+  while (1)
+    {
+
+      Word entry = set_of_words[hash_val];
+
+      /* if doesn't exist then */
+      if (!entry)
+	{
+	  set_of_words[hash_val] = word;
+	  break;
+	}
+
+      /* if we have a matching word */
+      if (compare (entry, word) == 0)
+	break;
+
+      /* if collides with a different word */
+      hash_val = (hash_val + hash_step) % hash_size;
+
+    }
+}
+
+
+/* =========================================================================
+ * Function: set_member
+ * Description: 
+ *      Tests whether a string is a member of the set
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static int
+set_member (Word word)
+{
+  int hash_val;
+  int hash_step;
+
+  HASH (hash_val, hash_step, word, hash_size);
+
+  /* loop around in case of collisions and need to step */
+  while (1)
+    {
+
+      Word entry = set_of_words[hash_val];
+
+      /* if doesn't exist then */
+      if (!entry)
+	return 0;
+
+      /* if we have a matching word */
+      if (compare (entry, word) == 0)
+	return 1;
+
+      /* if collides with a different word */
+      hash_val = (hash_val + hash_step) % hash_size;
+
+    }
+}
+
+/******************************** end of word set ******************************/
+
+
+
+/* =========================================================================
+ * Function: copy_c_word
+ * Description: 
+ *      Allocate enough memory and copy word over
+ * Input: 
+ *      w = null terminated string (c_word)
+ * Output: 
+ *      word with length in 1st byte
+ * ========================================================================= */
+
+static Word
+copy_c_word (char *w)
+{
+  int len = strlen (w);
+  Word w_copy = (Word) malloc (len + 1);
+  Word w_ptr = NULL;
+  int j = 0;
+
+  if (!w_copy)
+    FatalError (1, "Not enough memory to copy a word");
+
+  w_copy[0] = len;
+  w_ptr = w_copy + 1;
+  for (j = 0; j < len; j++)
+    *w_ptr++ = *w++;
+
+  return w_copy;
+}
+
+/* =========================================================================
+ * Function: process_words
+ * Description: 
+ *      Go through the stemmed words and add to word set
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+process_words (char **words, int num_of_words)
+{
+  int i = 0;
+
+  set_create (num_of_words);
+
+  for (i = 0; i < num_of_words; i++)
+    {
+      Word word = copy_c_word (words[i]);
+      set_add (word);
+    }
+
+}
+
+/* =========================================================================
+ * Function: get_line
+ * Description: 
+ *      Equivalent of fgets for u_char*.
+ *      But returns length of read-in line.
+ *      Expects to see a '\n' before an EOF
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static int
+get_line (u_char * line, int n, FILE * stream)
+{
+  int i = 0;
+  int ch = '\0';
+
+  while (1)
+    {
+      if (i == n)
+	return i;
+
+      ch = fgetc (stream);
+
+      if (ch == EOF)
+	{
+	  if (!feof (stream))
+	    FatalError (1, "Error on reading a line from stdin");
+	  return EOF;
+	}
+
+      if (ch == '\n')
+	return i;
+
+      *line++ = ch;
+      i++;
+    }
+
+}
+
+/* =========================================================================
+ * Function: print_line
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+print_line (u_char * line, int n, FILE * stream)
+{
+
+  while (n--)
+    {
+      fputc (*line++, stream);
+    }
+  fputc ('\n', stream);
+
+}
+
+/* =========================================================================
+ * Function: process_text
+ * Description: 
+ *      Go through the text from input_file and highlight to output_file 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+process_text (FILE * input_file, FILE * output_file)
+{
+  static u_char line_buffer[MAX_LINE_BUFFER];
+
+
+  while (1)
+    {
+      int len = get_line (line_buffer, MAX_LINE_BUFFER, input_file);
+
+      if (len == EOF)
+	break;
+      process_buffer (line_buffer, len, output_file);
+
+    }
+}
+
+/* =========================================================================
+ * Function: copy_word
+ * Description: 
+ *      Copies w2 into w1. Assumes both have storage allocated.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+copy_word (u_char * w1, u_char * w2)
+{
+  int i;
+  int len = w2[0];
+
+  for (i = 0; i <= len; i++)
+    *w1++ = *w2++;
+
+}
+
+/* =========================================================================
+ * Function: process_buffer
+ * Description: 
+ *      Parse & stem words of line buffer
+ *      Based on the usage of PARSEing in other mg files.
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+static void
+process_buffer (u_char * s_in, int len, FILE * output_file)
+{
+  u_char *end = s_in + len - 1;
+  u_char *s_start = NULL;
+
+  if (!inaword (s_in, end))
+    {
+      s_start = s_in;
+      PARSE_NON_STEM_WORD (s_in, end);
+      output_word (s_start, s_in - 1, output_file);
+    }
+
+  while (s_in <= end)
+    {
+      u_char word[MAXSTEMLEN + 1];
+
+      s_start = s_in;
+      PARSE_STEM_WORD (word, s_in, end);
+
+      stemmer (stem_method, stemmer_num, word);
+
+      if (set_member (word))	/* output with highlighting */
+	{
+	  output_hilite_word (s_start, s_start + word[0] - 1, output_file);
+	  s_start += word[0];	/* step over hilited output */
+	}
+      output_word (s_start, s_in - 1, output_file);
+
+      s_start = s_in;
+      PARSE_NON_STEM_WORD (s_in, end);
+      output_word (s_start, s_in - 1, output_file);
+
+    }				/*while */
+
+  fputc ('\n', output_file);
+  fflush (output_file);
+
+}				/*process_buffer */
+
+/* =========================================================================
+ * Function: output_word
+ * Description: 
+ *      Output a word which lies from s_start to s_finish in buffer
+ * Input: 
+ *      s_start = ptr to 1st char
+ *      s_finish = ptr to last char
+ * Output: 
+ * ========================================================================= */
+
+static void
+output_word (u_char * s_start, u_char * s_finish, FILE * output_file)
+{
+  while (s_start <= s_finish)
+    {
+      fputc (*s_start++, output_file);
+    }
+}
+
+
+/* =========================================================================
+ * Function: output_hilite_word
+ * Description: 
+ *      Highlight a word (with length in 1st byte)
+ *      Pager highlighting:
+ *        Highlighting is either by bolding or underlining using
+ *        the method used by UNIX utilities More(1) and Less(1)
+ *      HTML highlighting:
+ *        use the appropriate start and end tags around the word
+ * ========================================================================= */
+
+static void
+output_hilite_word (u_char * s_start, u_char * s_finish, FILE * output_file)
+{
+
+  if (output_type == HTML)
+    {
+      char *hilite_tag = hilite_tags[hilite_style];
+
+      /* print start tag */
+      fprintf (output_file, "<%s>", hilite_tag);
+
+      output_word (s_start, s_finish, output_file);
+
+      /* print end tag */
+      fprintf (output_file, "</%s>", hilite_tag);
+    }
+
+  else
+    /* PAGER */
+    {
+      /* use backspaces around each letter */
+      while (s_start <= s_finish)
+	{
+	  switch (hilite_style)
+	    {
+	    case BOLD:
+	      fputc (*s_start, output_file);
+	      fputc ('\b', output_file);
+	      fputc (*s_start, output_file);
+	      break;
+	    case UNDERLINE:
+	      fputc ('_', output_file);
+	      fputc ('\b', output_file);
+	      fputc (*s_start, output_file);
+	      break;
+	    default:
+	      fputc (*s_start, output_file);
+	    }
+	  s_start++;
+	}			/*while */
+    }
+}
+
+/* =========================================================================
+ * Function: process_args
+ * Description: 
+ *      sets the global variables:
+ *              hilite_style, pager, num_of_words, word_list
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+struct option long_opts[] =
+{
+  {"style", required_argument, 0, 's'},
+  {"terminator", required_argument, 0, 't'},
+  {"pager", required_argument, 0, 'p'},
+  {"stem_method", required_argument, 0, 'm'},
+  {"stemmer", required_argument, 0, 'a'},
+  {0, 0, 0, 0}
+};
+
+static void
+process_args (int argc, char *argv[])
+{
+  int ch;
+
+
+  opterr = 0;
+  while ((ch = getopt_long (argc, argv, "s:p:t:m:a:", long_opts, (int *) 0)) != -1)
+    {
+      switch (ch)
+	{
+	case 's':
+	  {
+	    int i;
+	    for (i = 0; i < HILITE_MAX; i++)
+	      if (strcmp (optarg, hilite_names[i]) == 0)
+		break;
+
+	    if (i < HILITE_MAX)
+	      hilite_style = i;
+	  }
+	  break;
+	case 'a':
+	  stemmer_num = stemmernumber (optarg);
+	  break;
+	case 't':
+	  terminator = optarg;
+	  break;
+	case 'm':
+	  stem_method = atoi (optarg);
+	  break;
+	case 'p':
+	  pager = optarg;
+	  break;
+	default:
+	  FatalError (1, "Usage: \n"
+		      "mg_hilite_words --stem_method [0-3]\n"
+	  "                --stemmer [english|lovin|french|simplefrench]\n"
+	  "                --style [bold|underline|italic|emphasis|strong]\n"
+		      "                --pager [less|more|html|???]\n");
+	}
+    }
+
+  num_of_words = argc - optind;
+
+  word_list = &argv[optind];
+
+  /* fix up output type */
+  if (strcmp (pager, HTML_OUT) == 0)
+    output_type = HTML;
+  else
+    output_type = PAGER;
+
+}
+
+/* =========================================================================
+ * Function: main
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+main (int argc, char *argv[])
+{
+  FILE *output = NULL;
+
+  process_args (argc, argv);
+
+  /* set output file */
+  if (output_type == PAGER)
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+    output = _popen (pager, "w");
+#else
+    output = popen (pager, "w");
+#endif
+  else
+    output = stdout;
+
+  if (!output)
+    FatalError (1, "Unable to run \"%s\"\n", pager);
+
+  if (num_of_words < 1)
+    {
+      int ch;
+
+      /* just echo the input */
+      /* better not to call this program at all ;-) */
+      while ((ch = fgetc (stdin)) != EOF)
+	{
+	  fputc (ch, output);
+	}
+    }
+  else
+    {
+      /* set up hash table for words */
+      process_words (word_list, num_of_words);
+
+
+      /* Go thru lines of text from stdin and 
+       * output words with hilite info if
+       * words parse into existence in the hash table 
+       */
+      process_text (stdin, output);
+    }
+
+  if (terminator)
+    fprintf (output, "%s\n", terminator);
+
+  if (output != stdout)
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+    _pclose (output);
+#else
+    pclose (output);
+#endif
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.1	(revision 21083)
@@ -0,0 +1,104 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_dict 1 \*(Dt CITRI
+.SH NAME
+mg_invf_dict \- build an `on-disk' stemmed dictionary
+.SH SYNOPSIS
+.B mg_invf_dict
+[
+.B \-h
+]
+[
+.B \-F
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_invf_dict
+builds an `on-disk' stemmed dictionary from the
+compressed stemmed dictionary that the
+.BR mgquery (1)
+program can access.  Each entry in the dictionary contains the disk
+pointer to the associated inverted file entry, and various other pieces
+of information about the stemmed word.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " num"
+The dictionary is stored in blocks on disk; this option is used to set
+the block size.  The default is 4-KB blocks.
+.TP
+.B \-F
+This option causes the disk blocks to be aligned on the appropriate
+boundaries.  For example, if 4-KB blocks are used, they will be aligned
+in the file on 4-KB boundaries.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dict.c	(revision 21083)
@@ -0,0 +1,344 @@
+/**************************************************************************
+ *
+ * mg_invf_dict.c -- Program to build the blocked stemmed dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "locallib.h"
+#include "words.h"
+#include "mg.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:08  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:45  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:03  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1994/11/29  00:32:00  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.3  1994/10/20  03:56:56  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:49  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+int block_size = 1024 * 4;
+
+int force = 0;
+
+static void process_files (char *filename);
+
+int main (int argc, char **argv)
+{
+  char *file_name = "";
+  int ch;
+  msg_prefix = argv[0];
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "f:d:b:Fh")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'b':
+	block_size = atoi (optarg);
+	break;
+      case 'F':
+	force = 1;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file]"
+		 "[-d data directory] [-b num] [-F] [-h]\n", argv[0]);
+	exit (1);
+      }
+
+  process_files (file_name);
+  return 0;
+}
+
+
+
+
+static void 
+process_files (char *filename)
+{
+  FILE *id, *idb, *tmp, *ii;
+  unsigned long i, pos, num, First_word, invf_ptr, invf_len;
+  unsigned long last_ptr = 0;
+  char *FName;
+  struct invf_dict_header idh;
+  struct stem_dict_header sdh;
+  u_char prev[MAXSTEMLEN + 1];
+  u_char *buffer;
+  unsigned short *pointers;
+  int buf_in_use;
+  unsigned short ptrs_in_use, word_num;
+
+  id = open_file (filename, INVF_DICT_SUFFIX, "rb", MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  ii = open_file (filename, INVF_IDX_SUFFIX, "rb", MAGIC_INVI, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  idb = create_file (filename, INVF_DICT_BLOCKED_SUFFIX, "w+b", MAGIC_STEM,
+		     MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  FName = make_name (filename, ".tmp", NULL);
+  if (!(tmp = fopen (FName, "w+b")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open \"%s\".\n", FName);
+
+  /* Delete the file now */
+  unlink (FName);
+
+  fread (&idh, sizeof (idh), 1, id);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  sdh.lookback = idh.lookback;
+  sdh.block_size = block_size;
+  sdh.num_blocks = 0;
+  sdh.index_chars = 0;
+  sdh.blocks_start = 0;
+  sdh.num_of_docs = idh.num_of_docs;
+  sdh.static_num_of_docs = idh.static_num_of_docs;
+  sdh.num_of_words = idh.num_of_words;
+  sdh.stemmer_num = idh.stemmer_num;
+  sdh.stem_method = idh.stem_method;
+  sdh.indexed = 0;  /* [RPAP - Jan 97: Stem Index Change] */
+
+  fwrite (&sdh, sizeof (sdh), 1, idb);
+
+  if (!(buffer = Xmalloc (block_size + 512)))
+    FatalError (1, "Unable to allocate memory for \"buffer\"\n");
+  if (!(pointers = Xmalloc (block_size + 512)))
+    FatalError (1, "Unable to allocate memory for \"buffer\"\n");
+
+  buf_in_use = 0;
+  pos = 0;
+  word_num = 0;
+  ptrs_in_use = 0;
+  First_word = 0;
+  for (i = 0; i < idh.dict_size; i++)
+    {
+      register unsigned long extra, copy, suff;
+      unsigned long wcnt, fcnt;
+
+      /* build a new word on top of prev */
+      copy = getc (id);
+      suff = getc (id);
+      *prev = copy + suff;
+      fread (prev + copy + 1, sizeof (u_char), suff, id);
+
+      /* read other data, but no need to store it */
+      fread (&fcnt, sizeof (fcnt), 1, id);
+      fread (&wcnt, sizeof (wcnt), 1, id);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      /* read in the inverted file position */
+      fread (&invf_ptr, sizeof (invf_ptr), 1, ii);
+      NTOHUL(invf_ptr);  /* [RPAP - Jan 97: Endian Ordering] */
+      if (word_num % idh.lookback == 0)
+	extra = copy + sizeof (*pointers);
+      else
+	extra = 0;
+      if ((ptrs_in_use + 1) * sizeof (*pointers) + sizeof (ptrs_in_use) + extra +
+	  buf_in_use + suff + 1 + sizeof (fcnt) + sizeof (wcnt) +
+	  sizeof (First_word) + sizeof (invf_ptr) + sizeof (invf_len) > block_size)
+	{
+	  int chunk;
+	  invf_len = invf_ptr - last_ptr;
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  HTONUL(First_word);
+	  HTONUL(invf_len);
+	  HTONUS(word_num);
+
+	  fwrite (&First_word, sizeof (First_word), 1, tmp);
+	  fwrite (&invf_len, sizeof (invf_len), 1, tmp);
+	  fwrite (&word_num, sizeof (word_num), 1, tmp);
+	  fwrite (pointers, sizeof (*pointers), ptrs_in_use, tmp);
+	  fwrite (buffer, sizeof (u_char), buf_in_use, tmp);
+	  bzero ((char *) buffer, block_size);
+	  chunk = buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	    sizeof (ptrs_in_use) + sizeof (First_word) + sizeof (invf_len);
+	  if (force && chunk < block_size)
+	    {
+	      fwrite (buffer, sizeof (u_char), block_size - chunk, tmp);
+	      chunk = block_size;
+	    }
+
+	  pos += chunk;
+
+	  buf_in_use = 0;
+	  word_num = 0;
+	  ptrs_in_use = 0;
+	  sdh.num_blocks++;
+	}
+
+      if (word_num % idh.lookback == 0)
+	{
+	  HTONUS2(buf_in_use, pointers[ptrs_in_use++]);  /* [RPAP - Jan 97: Endian Ordering] */
+	  suff += copy;
+	  copy = 0;
+	}
+      buffer[buf_in_use++] = copy;
+      buffer[buf_in_use++] = suff;
+      bcopy ((char *) (prev + copy + 1), (char *) (buffer + buf_in_use), suff);
+      buf_in_use += suff;
+      HTONUL(fcnt);  /* [RPAP - Jan 97: Endian Ordering] */
+      bcopy ((char *) &fcnt, (char *) (buffer + buf_in_use), sizeof (fcnt));
+      buf_in_use += sizeof (fcnt);
+      HTONUL(wcnt);  /* [RPAP - Jan 97: Endian Ordering] */
+      bcopy ((char *) &wcnt, (char *) (buffer + buf_in_use), sizeof (wcnt));
+      buf_in_use += sizeof (wcnt);
+      last_ptr = invf_ptr;
+      HTONUL(invf_ptr);  /* [RPAP - Jan 97: Endian Ordering] */
+      bcopy ((char *) &invf_ptr, (char *) (buffer + buf_in_use), sizeof (invf_ptr));
+      NTOHUL(invf_ptr);  /* [RPAP - Jan 97: Endian Ordering] */
+      buf_in_use += sizeof (invf_ptr);
+      if (buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	  sizeof (ptrs_in_use) > block_size)
+	FatalError (1, "Fatal Internal Error # 34876234\n");
+      if (word_num == 0)
+	{
+	  fwrite (prev, sizeof (u_char), *prev + 1, idb);
+	  HTONUL(pos);  /* [RPAP - Jan 97: Endian Ordering] */
+	  fwrite (&pos, sizeof (pos), 1, idb);
+	  NTOHUL(pos);  /* [RPAP - Jan 97: Endian Ordering] */
+	  sdh.index_chars += *prev + 1;
+	  First_word = i;
+	}
+      word_num++;
+    }
+  if (buf_in_use)
+    {
+      int chunk;
+      fread (&invf_ptr, sizeof (invf_ptr), 1, ii);
+      NTOHUL(invf_ptr);  /* [RPAP - Jan 97: Endian Ordering] */
+      invf_len = invf_ptr - last_ptr;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(First_word);
+      HTONUL(invf_len);
+      HTONUS(word_num);
+
+      fwrite (&First_word, sizeof (First_word), 1, tmp);
+      fwrite (&invf_len, sizeof (invf_len), 1, tmp);
+      fwrite (&word_num, sizeof (word_num), 1, tmp);
+      fwrite (pointers, sizeof (*pointers), ptrs_in_use, tmp);
+      fwrite (buffer, sizeof (u_char), buf_in_use, tmp);
+      bzero ((char *) buffer, block_size);
+      chunk = buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	sizeof (ptrs_in_use) + sizeof (First_word) + sizeof (invf_len);
+      if (force && chunk < block_size)
+	{
+	  fwrite (buffer, sizeof (u_char), block_size - chunk, tmp);
+	  chunk = block_size;
+	}
+
+      sdh.num_blocks++;
+    }
+  fclose (id);
+  fclose (ii);
+
+  rewind (tmp);
+  sdh.blocks_start = sdh.index_chars + sizeof (u_long) + sizeof (sdh) +
+    sdh.num_blocks * sizeof (pos);
+  if (force)
+    {
+      int amount;
+      amount = sdh.blocks_start % block_size;
+      if (amount != 0)
+	{
+	  bzero ((char *) buffer, block_size);
+	  fwrite (buffer, sizeof (u_char), block_size - amount, idb);
+	  sdh.blocks_start += block_size - amount;
+	}
+    }
+
+  while ((num = fread (buffer, sizeof (u_char), block_size, tmp)) != 0)
+    fwrite (buffer, sizeof (u_char), num, idb);
+  fclose (tmp);
+
+  /* skip over the magic number */
+  fseek (idb, sizeof (u_long), 0);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(sdh.lookback);
+  HTONUL(sdh.block_size);
+  HTONUL(sdh.num_blocks);
+  HTONUL(sdh.blocks_start);
+  HTONUL(sdh.index_chars);
+  HTONUL(sdh.num_of_docs);
+  HTONUL(sdh.static_num_of_docs);
+  HTONUL(sdh.num_of_words);
+  HTONUL(sdh.stemmer_num);
+  HTONUL(sdh.stem_method);
+  HTONUL(sdh.indexed);
+
+  fwrite (&sdh, sizeof (sdh), 1, idb);
+  fclose (idb);
+
+
+  Message ("Block size = %d\n", block_size);
+  Message ("Number of blocks written = %d\n", NTOHUL(sdh.num_blocks));
+
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.1	(revision 21083)
@@ -0,0 +1,142 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_dump 1 \*(Dt CITRI
+.SH NAME
+mg_invf_dump \- Dump out an inverted file in ASCII
+.SH SYNOPSIS
+.B mg_invf_dump
+[
+.B \-h
+]
+[
+.B \-b
+]
+[
+.B \-w
+]
+[
+.B \-t
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program dumps out an inverted file produced by the
+.BR mg (1)
+system as ASCII numbers.  This program could be used in conjunction
+with
+.BR mgdictlist (1)
+to write simple shell programs that work with the inverted files.  The
+output from the program looks something like this:
+.LP
+.RS
+.ft 3
+.nf
+6 337
+1
+ 1 1
+1
+ 5 1
+1
+ 2 1
+1
+ 1 1
+4
+ 1 3
+ 2 7
+ 3 2
+ 5 2
+1
+ 1 1
+ . . .
+.fi
+.ft
+.RE
+The first number (6) is the number of documents in the collection.  It
+is followed by the number of different terms in the collection.  For
+each term, the number of different documents it occurs in follows. The
+document numbers that the term occurs in are listed next.  If
+.B \-w
+is specified, then the number of times the term occurred in the
+document is printed alongside the document number.
+If
+.B \-t
+is specified, the term itself is also displayed in quotes.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-b
+This option will cause the output from the program to be in fixed-size
+binary numbers, rather than in ASCII.
+.TP
+.B \-w
+If the inverted file is a level-2 or level-3 inverted file, this causes
+the word counts per document to be output.
+.TP
+.B \-t
+This option causes each term to be displayed along with the number of
+documents it appears in. The term is printed in quotes,
+as in "the".
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf.dict
+The compressed stemmed dictionary.
+.TP
+.B *.invf.ORG
+The original inverted file saved by
+.BR mg_invf_rebuild .
+.TP
+.B *.invf
+The inverted file.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_dump.c	(revision 21083)
@@ -0,0 +1,226 @@
+/**************************************************************************
+ *
+ * mg_invf_dump.c -- Program to dump uot an inverted fil
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "messages.h"
+#include "timing.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "words.h"
+#include "invf.h"
+
+extern unsigned long S_btg;
+
+/*
+   $Log$
+   Revision 1.2  2001/06/12 01:41:39  kjm18
+   changed the help message
+
+   Revision 1.1  1999/08/10 21:18:09  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:46  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:05  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/11/29  00:32:01  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.2  1994/09/20  04:41:50  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+static void process_files (char *filename);
+
+int binary = 0;
+int word_counts = 0;
+int term_dump = 0;
+
+
+int main (int argc, char **argv)
+{
+  ProgTime start;
+  char *dir_name, *file_name = "";
+  int ch;
+  msg_prefix = argv[0];
+  dir_name = getenv ("MGDATA");
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "hbwtf:d:")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+        set_basepath(optarg);
+	break;
+      case 'b':
+	binary = 1;
+	break;
+      case 'w':
+	word_counts = 1;
+	break;
+      case 't':
+	term_dump = 1;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-h] [-b] [-w] [-t] [-f input_file]"
+		 "[-d data directory]\n"
+		 "(b - binary mode, w - wordcount, t - term dump)\n", argv[0]);
+	exit (1);
+      }
+  GetTime (&start);
+  process_files (file_name);
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  return 0;
+}
+
+static void 
+process_files (char *name)
+{
+  unsigned long N, Nstatic, k;
+  FILE *dict;
+  FILE *invf;
+  struct invf_dict_header idh;
+  struct invf_file_header ifh;
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  dict = open_file (name, INVF_DICT_SUFFIX, "rb", MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread ((char *) &idh, sizeof (idh), 1, dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  if (!(invf = open_file (name, INVF_SUFFIX ".ORG", "rb", MAGIC_INVF, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    invf = open_file (name, INVF_SUFFIX, "rb", MAGIC_INVF, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread ((char *) &ifh, sizeof (ifh), 1, invf);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(ifh.no_of_words);
+  NTOHUL(ifh.no_of_ptrs);
+  NTOHUL(ifh.skip_mode);
+  for (i = 0; i < 16; i++)
+    NTOHUL(ifh.params[i]);
+  NTOHUL(ifh.InvfLevel);
+
+  if (ifh.skip_mode != 0)
+    FatalError (1, "The invf file contains skips. Unable to dump.");
+
+  DECODE_START (invf)
+    N = idh.num_of_docs;
+  Nstatic = idh.static_num_of_docs;
+  if (binary)
+    {
+      fwrite ((char *) &N, sizeof (N), 1, stdout);
+      fwrite ((char *) &ifh.no_of_words, sizeof (ifh.no_of_words), 1, stdout);
+    }
+  else
+    printf ("%ld %ld\n", N, ifh.no_of_words);
+  for (k = 0; k < ifh.no_of_words; k++)
+    {
+      int i, blk, doc;
+      register unsigned long suff, prefix;
+      unsigned long fcnt, wcnt;
+      char term[MAXSTEMLEN + 1];
+
+      prefix = fgetc (dict);
+      suff = fgetc (dict);
+      fread (&term[prefix], sizeof (char), suff, dict);
+      fread ((char *) &fcnt, sizeof (fcnt), 1, dict);
+      fread ((char *) &wcnt, sizeof (wcnt), 1, dict);
+      term[prefix + suff] = '\0';
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      if (binary)
+	fwrite ((char *) &fcnt, sizeof (fcnt), 1, stdout);
+      else
+	{
+	  if (term_dump)
+	    printf ("%ld    \"%s\"\n", fcnt, term);
+	  else
+	    printf ("%ld\n", fcnt);
+	}
+      blk = BIO_Bblock_Init (Nstatic, fcnt);
+      for (doc = i = 0; i < fcnt; i++)
+	{
+	  int num;
+	  BBLOCK_DECODE (num, blk);
+	  doc += num;
+	  if (binary)
+	    fwrite ((char *) &doc, sizeof (doc), 1, stdout);
+	  else
+	    printf (" %d", doc);
+	  if (ifh.InvfLevel >= 2)
+	    {
+	      int count;
+	      GAMMA_DECODE (count);
+	      if (word_counts)
+		if (binary)
+		  fwrite ((char *) &count, sizeof (count), 1, stdout);
+		else
+		  printf (" %d", count);
+	    }
+	  if (!binary)
+	    putchar ('\n');
+	}
+      while (__btg)
+	DECODE_BIT;
+    }
+  DECODE_DONE
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_merge 1 \*(Dt CITRI
+.SH NAME
+mg_invf_merge \- Merge two inverted files and stemmed dictionaries
+.SH SYNOPSIS
+.B mg_invf_merge
+[
+.B \-h
+]
+[
+.B \-s
+]
+[
+.B \-w
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program takes two
+.BR mg (1)
+database compressed text files and appends the second to
+the first.
+It is part of the
+.BR mgmerge (1)
+addition to the
+.BR mg (1)
+package.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-s
+This option will cause a slow merge to be performed on the inverted files,
+where each inverted file entry is decoded and recoded.
+The default is a fast merge. Accumulated fast merges slowly degrade
+compression performance on the resulting inverted file so
+a periodic slow merge is recommended.
+.TP
+.B \-w
+By default the database .weights file is updated with
+new weights for the new documents in
+.B mg_text_merge.
+The
+.B -w
+option turns this step off.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.old.invf.dict
+The old compressed stemmed dictionary.
+.TP
+.B *.new.invf.dict
+The new compressed stemmed dictionary.
+.TP
+.B *.invf.dict
+The resulting merged compressed stemmed dictionary.
+.TP
+.B *.old.invf.ORG
+The original inverted file saved by
+.BR mg_invf_rebuild .
+.TP
+.B *.old.invf
+The old inverted file.
+.TP
+.B *.new.invf
+The new inverted file.
+.TP
+.B *.invf
+The resulting merged inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgmerge (1),
+.BR mg_get_merge (1),
+.BR mg_text_merge (1),
+.BR mg_invf_rebuild (1),
+.BR mg_invf_dict (1),
+.BR mg_weights_build (1),
+.BR mgquery (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_merge.c	(revision 21083)
@@ -0,0 +1,852 @@
+/**************************************************************************
+ *
+ * mg_invf_merge.c -- description
+ * Copyright (C) 1995  Shane Hudson (shane@cosc.canterbury.ac.nz)
+ *
+ * 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.
+ *
+ * Last edited:  31 March, 1995 
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "locallib.h"
+#include "local_strings.h"
+#include "messages.h"
+#include "timing.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "bitio_m.h"
+#include "bitio_gen.h"
+#include "bitio_stdio.h"
+
+#include "mg.h"
+#include "mg_merge.h"
+#include "mg_files.h"
+#include "invf.h"
+#include "words.h"
+
+typedef char FileName[256];
+
+
+/*
+ *  The merge_info struct contains all the data for an inverted file and
+ *  lexicon. We declare 3 merge_info variables, m[OLD] m[NEW] and m[MERGE].
+ */
+typedef struct merge_info_type
+  {
+    FileName fname;
+    FILE *invf;
+    FILE *dict;
+    FILE *idx;
+    FILE *para;  /* [RPAP - Feb 97: Level 3 Merge] */
+    struct invf_dict_header idh;
+    struct invf_file_header ifh;
+    u_long nDocs;
+
+    /* Lexicon processing variables */
+    u_long fcnt, wcnt;
+    int suff, pref;
+    unsigned char term[MAXSTEMLEN + 1];
+    u_long term_count;
+    int done;
+
+    /* Variables used for merging */
+    struct stdio_bitio_state sbs;	/* for bit-based I/O on inverted files */
+    u_long nTerms;		/* = number of invf entries */
+    int *fcntlist;		/* store fcnt values read in from the lexicons */
+
+  }
+merge_info;
+
+
+/***************************************************
+ **** GLOBALS ****
+ ***************************************************/
+
+merge_info m[3];		/*  m[OLD], m[NEW] and m[MERGE] */
+u_long magicsize;		/* how big is magic number? currently always 4 */
+u_long Nstatic;			/* static # of documents in file */
+
+float *DocWeightBuffer;
+int weightOption = 0;		/* true if weights file is to be appended */
+
+/*** Globals for processing the lexicons -- see readTerm() and writeTerm() 
+ ***/
+ProgTime start;			/* for printing elapsed time */
+unsigned char prevTerm[MAXSTEMLEN + 1];
+
+/*** Globals for merging -- see processEntry() 
+ ***/
+char *mergedata;		/* stores value OLD/NEW/MERGE for each term */
+int fastMerge = 1;		/* True if fast merge selected. Default = true */
+
+u_long oldIdxValue;		/* stores last read value from m[OLD].idx
+				   Used to calculate entry lengths */
+u_long bytes_output;		/* for writing .invf.idx file */
+u_long oldOnlyBits = 0;		/* entries in old only */
+u_long oldMergeBits = 0;	/* entries in old that are merged with 
+				   a new entry */
+
+/**************************************************************************/
+
+
+/*=======================================================================
+ * init_merge_invf(): open files, initialise globals, etc
+ *=======================================================================*/
+int 
+init_merge_invf ()
+{
+  prevTerm[0] = prevTerm[1] = 0;
+
+    /***
+     *  open .dict files
+     ***/
+  m[OLD].dict = open_file (m[OLD].fname, INVF_DICT_SUFFIX, "rb",
+			   MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  magicsize = ftell (m[OLD].dict);
+  fread (&(m[OLD].idh), sizeof (m[OLD].idh), 1, m[OLD].dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[OLD].idh.lookback);
+  NTOHUL(m[OLD].idh.dict_size);
+  NTOHUL(m[OLD].idh.total_bytes);
+  NTOHUL(m[OLD].idh.index_string_bytes);
+  NTOHD(m[OLD].idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(m[OLD].idh.num_of_docs);
+  NTOHUL(m[OLD].idh.static_num_of_docs);
+  NTOHUL(m[OLD].idh.num_of_words);
+  NTOHUL(m[OLD].idh.stemmer_num);
+  NTOHUL(m[OLD].idh.stem_method);
+
+  m[NEW].dict = open_file (m[NEW].fname, INVF_DICT_SUFFIX, "rb",
+			   MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  fread (&(m[NEW].idh), sizeof (m[NEW].idh), 1, m[NEW].dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[NEW].idh.lookback);
+  NTOHUL(m[NEW].idh.dict_size);
+  NTOHUL(m[NEW].idh.total_bytes);
+  NTOHUL(m[NEW].idh.index_string_bytes);
+  NTOHD(m[NEW].idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(m[NEW].idh.num_of_docs);
+  NTOHUL(m[NEW].idh.static_num_of_docs);
+  NTOHUL(m[NEW].idh.num_of_words);
+  NTOHUL(m[NEW].idh.stemmer_num);
+  NTOHUL(m[NEW].idh.stem_method);
+
+  m[MERGE].dict = create_file (m[MERGE].fname, INVF_DICT_SUFFIX, "wb",
+			       MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* write space for header */
+  fwrite ((char *) &(m[OLD].idh), sizeof (m[OLD].idh), 1, m[MERGE].dict);
+
+  m[OLD].nDocs = m[OLD].idh.num_of_docs;
+  m[NEW].nDocs = m[NEW].idh.num_of_docs;
+  Nstatic = m[OLD].idh.static_num_of_docs;
+  m[OLD].nTerms = m[OLD].idh.dict_size;
+  m[NEW].nTerms = m[NEW].idh.dict_size;
+  m[MERGE].nDocs = m[OLD].nDocs + m[NEW].nDocs;
+  m[MERGE].nTerms = 0;
+
+  /* Set up weight buffer for weights of new documents */
+  if (!(DocWeightBuffer = Xmalloc (m[NEW].nDocs * sizeof (*DocWeightBuffer))))
+    {
+      Message ("Insufficient memory\n");
+      return COMPERROR;
+    }
+  bzero ((char *) DocWeightBuffer, m[NEW].nDocs * sizeof (*DocWeightBuffer));
+
+    /***
+     *  open .invf files
+     *  Try ".ORG" extension first for m[OLD].invf since an inverted file
+     *  with skips may have been created.
+     ****/
+  if (!(m[OLD].invf = open_file (m[OLD].fname, INVF_SUFFIX ".ORG", "rb",
+				 MAGIC_INVF, MG_CONTINUE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    m[OLD].invf = open_file (m[OLD].fname, INVF_SUFFIX, "rb",
+			     MAGIC_INVF, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  fread (&(m[OLD].ifh), sizeof (m[OLD].ifh), 1, m[OLD].invf);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[OLD].ifh.no_of_words);
+  NTOHUL(m[OLD].ifh.no_of_ptrs);
+  NTOHUL(m[OLD].ifh.skip_mode);
+  {
+    int i;
+    for (i = 0; i < 16; i++)
+      NTOHUL(m[OLD].ifh.params[i]);
+  }
+  NTOHUL(m[OLD].ifh.InvfLevel);
+
+  m[NEW].invf = open_file (m[NEW].fname, INVF_SUFFIX, "rb",
+			   MAGIC_INVF, MG_ABORT);
+  fread (&(m[NEW].ifh), sizeof (m[NEW].ifh), 1, m[NEW].invf);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[NEW].ifh.no_of_words);
+  NTOHUL(m[NEW].ifh.no_of_ptrs);
+  NTOHUL(m[NEW].ifh.skip_mode);
+  {
+    int i;
+    for (i = 0; i < 16; i++)
+      NTOHUL(m[NEW].ifh.params[i]);
+  }
+  NTOHUL(m[NEW].ifh.InvfLevel);
+
+  if (m[OLD].ifh.skip_mode != 0)
+    FatalError (1, "The old invf file contains skips. Unable to merge.");
+
+  if (m[OLD].ifh.InvfLevel != m[NEW].ifh.InvfLevel)
+    FatalError (1, "The two invf files have different inversion levels!");
+
+  /********** [RPAP - Feb 97: Level 3 Merge]
+
+  if ((m[OLD].ifh.InvfLevel > 2) || (m[NEW].ifh.InvfLevel > 2))
+    FatalError (1, "mgmerge cannot handle level 3 inverted files!");
+
+    *************/
+
+  m[MERGE].invf = create_file (m[MERGE].fname, INVF_SUFFIX, "wb",
+			       MAGIC_INVF, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* write space for header in inverted file */
+  m[MERGE].ifh.no_of_words = m[MERGE].ifh.no_of_ptrs = 0;
+  m[MERGE].ifh.skip_mode = 0;
+  m[MERGE].ifh.InvfLevel = 2;
+  {
+    int i;
+    for (i = 0; i < 16; i++)
+      m[MERGE].ifh.params[i] = 0;
+  }
+  fwrite ((char *) &(m[MERGE].ifh), sizeof (m[MERGE].ifh), 1, m[MERGE].invf);
+
+    /***
+     *  open .invf.idx files
+     ***/
+  m[OLD].idx = open_file (m[OLD].fname, INVF_IDX_SUFFIX, "rb",
+			  MAGIC_INVI, MG_ABORT);
+  fread (&oldIdxValue, sizeof (u_long), 1, m[OLD].idx);
+  NTOHUL(oldIdxValue);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  m[NEW].idx = open_file (m[NEW].fname, INVF_IDX_SUFFIX, "rb",
+			  MAGIC_INVI, MG_ABORT);
+
+  m[MERGE].idx = create_file (m[MERGE].fname, INVF_IDX_SUFFIX, "wb",
+			      MAGIC_INVI, MG_ABORT);
+
+
+  /* [RPAP - Feb 97: Level 3 Merge] */
+
+    /***
+     *  open .invf.parargraph files
+     ***/
+  if (m[OLD].ifh.InvfLevel == 3)
+    {
+      m[OLD].para = NULL;
+      m[NEW].para = open_file (m[NEW].fname, INVF_PARAGRAPH_SUFFIX, "rb",
+			       MAGIC_PARAGRAPH, MG_ABORT);
+      m[MERGE].para = open_file (m[MERGE].fname, INVF_PARAGRAPH_SUFFIX, "rb+",
+				 MAGIC_PARAGRAPH, MG_ABORT);
+    }
+  else
+    {
+      m[OLD].para = NULL;
+      m[NEW].para = NULL;
+      m[MERGE].para = NULL;
+    }
+
+  return OK;
+}
+
+
+/*=======================================================================
+ * procEntry_slow(): merge an entry, slow method
+ *=======================================================================*/
+void 
+procEntry_slow (int tnum, int type, u_long oldN, u_long newN, u_long mergeN)
+/* 
+ *  Process an invf entry. 
+ *  Slow Merge. (Always decode/re-encode).
+ *
+ *  tnum is the entry number, type = OLD or NEW or MERGE.
+ *  oldN, newN and mergeN are the N parameters for Bblock coding.
+ *  They are passed so other procEntry_fast can call this one
+ *  when a decode/recode is needed to save repeating code.
+ */
+{
+  int doc = 0;
+  int fcntOLD = m[OLD].fcntlist[tnum];
+  int fcntNEW = m[NEW].fcntlist[tnum];
+  int inblk, outblk;
+  u_long inbits = 0, outbits = 0;
+
+  /* write .invf.idx pointer */
+  HTONUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&bytes_output, sizeof (u_long), 1, m[MERGE].idx);
+  NTOHUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  outblk = BIO_Bblock_Init (mergeN, (fcntOLD + fcntNEW));
+
+/*** OLD entry -> merge entry ***/
+  if (type != NEW)
+    {
+      int i;
+      inblk = BIO_Bblock_Init (oldN, fcntOLD);
+      for (i = 0; i < fcntOLD; i++)
+	{
+	  int num;
+	  num = BIO_Stdio_Bblock_Decode (inblk, &(m[OLD].sbs), &inbits);
+	  doc += num;
+	  BIO_Stdio_Bblock_Encode (num, outblk, &(m[MERGE].sbs), &outbits);
+	  if (m[OLD].ifh.InvfLevel >= 2)	/* frequencies */
+	    {
+	      num = BIO_Stdio_Gamma_Decode (&(m[OLD].sbs), &inbits);
+	      BIO_Stdio_Gamma_Encode (num, &(m[MERGE].sbs), &outbits);
+	    }
+	}
+      if (type == OLD)
+	oldOnlyBits += (inbits + m[OLD].sbs.Btg);
+      else
+	oldMergeBits += (inbits + m[OLD].sbs.Btg);
+    }
+
+/*** NEW entry -> merge entry ***/
+  if (type != OLD)
+    {
+      int i;
+      int offset;
+      double logN = log ((double) m[MERGE].nDocs);
+      double idf = logN - log ((double) (fcntOLD + fcntNEW));
+
+      inblk = BIO_Bblock_Init (newN, fcntNEW);
+      offset = (m[OLD].nDocs - doc);	/* amount to be added to 1ST pointer */
+      for (i = 0; i < fcntNEW; i++)
+	{
+	  register int num;
+	  register double weight;
+	  num = BIO_Stdio_Bblock_Decode (inblk, &(m[NEW].sbs), &inbits);
+	  if (i == 0)
+	    num += offset;
+	  doc += num;
+	  BIO_Stdio_Bblock_Encode (num, outblk, &(m[MERGE].sbs), &outbits);
+	  if (m[OLD].ifh.InvfLevel >= 2)	/* frequencies */
+	    {
+	      num = BIO_Stdio_Gamma_Decode (&(m[NEW].sbs), &inbits);
+	      BIO_Stdio_Gamma_Encode (num, &(m[MERGE].sbs), &outbits);
+	      weight = num * idf;
+	      DocWeightBuffer[doc - m[OLD].nDocs - 1] += weight * weight;
+	    }
+	}
+    }
+/*** Now the padding bits ***/
+  while (m[OLD].sbs.Btg)
+    BIO_Stdio_Decode_Bit (&(m[OLD].sbs));
+  while (m[NEW].sbs.Btg)
+    BIO_Stdio_Decode_Bit (&(m[NEW].sbs));
+  while (m[MERGE].sbs.Btg != 8)
+    {
+      BIO_Stdio_Encode_Bit (0, &(m[MERGE].sbs));
+      outbits++;
+    }
+  bytes_output += (outbits >> 3);
+  return;
+}
+
+
+/*=======================================================================
+ * procEntry_fast(): merge an entry, WITHOUT decoding if it's in the
+ *                   old inverted file only
+ *=======================================================================*/
+void 
+procEntry_fast (int tnum, int type)
+/*
+ *  Merge an invf entry. 
+ *  Faster Method : Copy (don't re-code) entries for terms only in IFold.
+ *  The N parameter is Nstatic, from m[OLD].idh.static_num_of_docs.
+ *  If entry type isnt OLD, just call procEntry_slow()
+ */
+{
+  u_long newIdxValue, len = 0;
+
+  /* Calculate IFold entry length in bytes if not NEW type */
+  if (type != NEW)		/* read in an index number from m[OLD].idx */
+    {
+      fread (&newIdxValue, sizeof (u_long), 1, m[OLD].idx);
+      NTOHUL(newIdxValue);  /* [RPAP - Jan 97: Endian Ordering] */
+      len = newIdxValue - oldIdxValue;
+      oldIdxValue = newIdxValue;
+    }
+
+  if (type != OLD)		/* must decode/recode */
+    procEntry_slow (tnum, type, Nstatic, m[NEW].nDocs, Nstatic);
+  else
+    {
+      /* write .invf.idx pointer */
+      HTONUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite (&bytes_output, sizeof (u_long), 1, m[MERGE].idx);
+      NTOHUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+
+      /* copy entry */
+      {
+	int i;
+	char c;
+	for (i = 0; i < len; i++)
+	  {
+	    c = fgetc (m[OLD].invf);
+	    fputc (c, m[MERGE].invf);
+	  }
+      }
+      bytes_output += len;
+      oldOnlyBits += (len * 8);
+    }
+  return;
+}
+
+
+/*=======================================================================
+ * processEntry(): merge an entry. Call either procEntry_slow() or
+ *                 procEntry_fast.
+ *=======================================================================*/
+void 
+processEntry (int tnum, int type)
+/* 
+ *  Read an entry from IFold and/or IFnew, and write to IFmerge.
+ *  tnum is the term number, type is OLD or NEW or MERGE
+ */
+{
+  if (fastMerge)
+    procEntry_fast (tnum, type);
+  else
+    procEntry_slow (tnum, type, Nstatic, m[NEW].nDocs, m[MERGE].nDocs);
+  return;
+}
+
+
+/*=======================================================================
+ * readTerm()
+ *=======================================================================*/
+void 
+readTerm (int x)
+/*
+ *  Read the next term from the appropriate ".invf.dict" file.
+ *  x should be either OLD or NEW.
+ *  Sets m[x].done to true when that lexicon has been completely read.
+ */
+{
+  int i;
+
+  if (m[x].term_count >= m[x].nTerms)
+    {
+      m[x].term[0] = 0;
+      m[x].done = 1;
+      return;
+    }
+  m[x].pref = fgetc (m[x].dict);
+  m[x].suff = fgetc (m[x].dict);
+  m[x].term[0] = m[x].pref + m[x].suff;
+
+  for (i = 0; i < m[x].suff; i++)
+    {
+      m[x].term[m[x].pref + i + 1] = fgetc (m[x].dict);
+    }
+  m[x].term_count = m[x].term_count + 1;
+
+  fread ((char *) &(m[x].fcnt), sizeof (u_long), 1, m[x].dict);
+  fread ((char *) &(m[x].wcnt), sizeof (u_long), 1, m[x].dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[x].fcnt);
+  NTOHUL(m[x].wcnt);
+
+  return;
+}
+
+
+/*=======================================================================
+ * writeTerm()
+ *=======================================================================*/
+void 
+writeTerm (int x)
+/*
+ *  Write the current term to m[MERGE].dict file.
+ *  x is OLD, NEW or MERGE.
+ */
+{
+  unsigned char i, prefix, suffix;
+  if (x == MERGE)
+    {
+      m[MERGE].fcnt = m[OLD].fcnt + m[NEW].fcnt;
+      m[MERGE].wcnt = m[OLD].wcnt + m[NEW].wcnt;
+      m[MERGE].pref = m[OLD].pref;
+      m[MERGE].suff = m[OLD].suff;
+      memcpy (m[MERGE].term, m[OLD].term, m[OLD].term[0] + 1);
+    }
+  if (x == OLD)
+    {
+      m[MERGE].fcnt = m[OLD].fcnt;
+      m[MERGE].wcnt = m[OLD].wcnt;
+    }
+  if (x == NEW)
+    {
+      m[MERGE].fcnt = m[NEW].fcnt;
+      m[MERGE].wcnt = m[NEW].wcnt;
+    }
+  prefix = prefixlen (prevTerm, m[x].term);
+  suffix = m[x].term[0] - prefix;
+  fputc (prefix, m[MERGE].dict);	/* prefix length */
+  fputc (suffix, m[MERGE].dict);	/* suffix length */
+  for (i = 0; i < suffix; i++)
+    fputc (m[x].term[prefix + i + 1], m[MERGE].dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(m[MERGE].fcnt);
+  HTONUL(m[MERGE].wcnt);
+
+  fwrite ((char *) &(m[MERGE].fcnt), sizeof (m[MERGE].fcnt), 1, m[MERGE].dict);
+  fwrite ((char *) &(m[MERGE].wcnt), sizeof (m[MERGE].wcnt), 1, m[MERGE].dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(m[MERGE].fcnt);
+  NTOHUL(m[MERGE].wcnt);
+
+  memcpy (prevTerm, m[x].term, prefix + suffix + 1);
+  m[MERGE].idh.total_bytes += m[x].term[0] + 1;
+  m[MERGE].idh.index_string_bytes += m[x].term[0] + 2 - prefix;
+  fflush (m[MERGE].dict);
+}
+
+
+/*=======================================================================
+ * process_merge_invf(): The main loop
+ *=======================================================================*/
+int 
+process_merge_invf (void)
+/*
+ *  The main function to merge the lexicons and inverted files.
+ */
+{
+/*** Some extra Initialisation stuff first ***/
+
+  m[OLD].term[0] = m[NEW].term[0] = '\0';
+  m[OLD].term_count = m[NEW].term_count = 0;
+  m[OLD].done = m[NEW].done = 0;
+  m[MERGE].idh.total_bytes = m[MERGE].idh.index_string_bytes = 0;
+
+/*** malloc arrays: mergedata, m[OLD].fcntlist, m[NEW].fcntlist ***/
+  mergedata = malloc ((m[OLD].nTerms + m[NEW].nTerms) * sizeof (char));
+  if (mergedata == 0)
+    {
+      fprintf (stderr, "MALLOC error!\n");
+      exit (1);
+    }
+  {
+    int i;
+    for (i = 0; i < 2; i++)
+      {
+	m[i].fcntlist = malloc ((m[OLD].nTerms + m[NEW].nTerms) * sizeof (int));
+	if (m[i].fcntlist == 0)
+	  {
+	    fprintf (stderr, "MALLOC error!\n");
+	    exit (1);
+	  }
+      }
+  }
+
+/*========================*/
+/***    LEXICON PASS    ***/
+/*========================*/
+
+/*** read first terms ***/
+  readTerm (OLD);
+  readTerm (NEW);
+
+  m[MERGE].nTerms = 0;
+  while (m[OLD].done == 0 || m[NEW].done == 0)
+    {
+      int i;
+      if (m[OLD].done)
+	i = 1; /* NEW will always be greater */
+      else if (m[NEW].done)
+	i = -1; /* OLD will always be greater */
+      else
+	i = casecompare (m[OLD].term, m[NEW].term);
+
+      if (i < 0)
+	{			/* term in OLD only */
+	  mergedata[m[MERGE].nTerms] = (char) OLD;
+	  m[OLD].fcntlist[m[MERGE].nTerms] = m[OLD].fcnt;
+	  m[NEW].fcntlist[m[MERGE].nTerms] = 0;
+	  m[MERGE].nTerms++;
+	  writeTerm (OLD);
+	  readTerm (OLD);
+	}
+      if (i == 0)
+	{			/* term in both lexions */
+	  mergedata[m[MERGE].nTerms] = (char) MERGE;
+	  m[OLD].fcntlist[m[MERGE].nTerms] = m[OLD].fcnt;
+	  m[NEW].fcntlist[m[MERGE].nTerms] = m[NEW].fcnt;
+	  m[MERGE].nTerms++;
+	  writeTerm (MERGE);
+	  readTerm (OLD);
+	  readTerm (NEW);
+	}
+      if (i > 0)
+	{			/* term in NEW only */
+	  mergedata[m[MERGE].nTerms] = (char) NEW;
+	  m[NEW].fcntlist[m[MERGE].nTerms] = m[NEW].fcnt;
+	  m[OLD].fcntlist[m[MERGE].nTerms] = 0;
+	  m[MERGE].nTerms++;
+	  writeTerm (NEW);
+	  readTerm (NEW);
+	}
+    }/*while*/
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  /* print some results about terms */
+  {
+    fprintf (stderr, "   Terms: OLD = %ld,  NEW = %ld,  MERGE = %ld\n",
+	     m[OLD].nTerms, m[NEW].nTerms, m[MERGE].nTerms);
+    fprintf (stderr, "   In OLD only: %ld,  In NEW only: %ld,  BOTH: %ld\n",
+	     (m[MERGE].nTerms - m[NEW].nTerms),
+	     (m[MERGE].nTerms - m[OLD].nTerms),
+	     (m[OLD].nTerms + m[NEW].nTerms - m[MERGE].nTerms));
+  }
+
+
+/*========================*/
+/***      INVF PASS     ***/
+/*========================*/
+
+  bytes_output = ftell (m[MERGE].invf);
+  BIO_Stdio_Decode_Start (m[OLD].invf, &m[OLD].sbs);
+  BIO_Stdio_Decode_Start (m[NEW].invf, &m[NEW].sbs);
+  BIO_Stdio_Encode_Start (m[MERGE].invf, &m[MERGE].sbs);
+  {
+    int i;
+    for (i = 0; i < m[MERGE].nTerms; i++)
+      {
+	processEntry (i, mergedata[i]);
+      }
+    /* write final .invf.idx pointer */
+    HTONUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+    fwrite (&bytes_output, sizeof (u_long), 1, m[MERGE].idx);
+    NTOHUL(bytes_output);  /* [RPAP - Jan 97: Endian Ordering] */
+
+    fprintf (stderr, "Old invf: old only bits: %ld, merged bits: %ld\n",
+	     oldOnlyBits, oldMergeBits);
+  }
+
+  return OK;
+}
+
+
+/*=======================================================================
+ * done_merge_invf(): write headers, close files, append weights to
+ *                     weights file
+ *=======================================================================*/
+int 
+done_merge_invf (void)
+{
+/*** write new lexicon header ***/
+  m[MERGE].idh.dict_size = m[MERGE].nTerms;
+  m[MERGE].idh.lookback = m[OLD].idh.lookback;
+  m[MERGE].idh.input_bytes = m[OLD].idh.input_bytes + m[NEW].idh.input_bytes;
+  m[MERGE].idh.total_bytes = m[OLD].idh.total_bytes + m[NEW].idh.total_bytes;
+  m[MERGE].idh.num_of_docs = m[MERGE].nDocs;
+  m[MERGE].idh.num_of_words = m[OLD].idh.num_of_words + m[NEW].idh.num_of_words;
+  m[MERGE].idh.stemmer_num = m[OLD].idh.stemmer_num;
+  m[MERGE].idh.stem_method = m[OLD].idh.stem_method;
+
+  /* if fastMerge, static num of docs stays the same! */
+  if (fastMerge)
+    m[MERGE].idh.static_num_of_docs = m[OLD].idh.static_num_of_docs;
+  else
+    m[MERGE].idh.static_num_of_docs = m[MERGE].nDocs;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(m[MERGE].idh.lookback);
+  HTONUL(m[MERGE].idh.dict_size);
+  HTONUL(m[MERGE].idh.total_bytes);
+  HTONUL(m[MERGE].idh.index_string_bytes);
+  HTOND(m[MERGE].idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  HTONUL(m[MERGE].idh.num_of_docs);
+  HTONUL(m[MERGE].idh.static_num_of_docs);
+  HTONUL(m[MERGE].idh.num_of_words);
+  HTONUL(m[MERGE].idh.stemmer_num);
+  HTONUL(m[MERGE].idh.stem_method);
+
+  fseek (m[MERGE].dict, magicsize, 0);
+  fwrite (&(m[MERGE].idh), sizeof (struct invf_dict_header), 1, m[MERGE].dict);
+
+/*** write new inverted file header ***/
+  m[MERGE].ifh.no_of_words = m[MERGE].nTerms;
+  m[MERGE].ifh.no_of_ptrs = m[OLD].ifh.no_of_ptrs + m[NEW].ifh.no_of_ptrs;
+  m[MERGE].ifh.skip_mode = m[OLD].ifh.skip_mode;
+  m[MERGE].ifh.InvfLevel = m[OLD].ifh.InvfLevel;
+
+  /* ifh.params[16] -- I have NO IDEA what these do!!!!! */
+  /* only set if a inverted file is in skipped format, I think */
+  {
+    int i;
+    for (i = 0; i < 16; i++)
+      m[MERGE].ifh.params[i] = m[OLD].ifh.params[i];
+  }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(m[MERGE].ifh.no_of_words);
+  HTONUL(m[MERGE].ifh.no_of_ptrs);
+  HTONUL(m[MERGE].ifh.skip_mode);
+  {
+    int i;
+    for (i = 0; i < 16; i++)
+      HTONUL(m[MERGE].ifh.params[i]);
+  }
+  HTONUL(m[MERGE].ifh.InvfLevel);
+
+  fseek (m[MERGE].invf, magicsize, 0);	/* go to start of header */
+  fwrite (&(m[MERGE].ifh), sizeof (struct invf_file_header), 1, m[MERGE].invf);
+
+/*** Write new document weights --- leave old weights alone ***/
+  if ((weightOption) && (m[OLD].ifh.InvfLevel >= 2))
+    {
+      FILE *weightfile = open_file (m[MERGE].fname, WEIGHTS_SUFFIX, "r+b",
+				    MAGIC_WGHT, MG_CONTINUE);  /* [RPAP - Feb 97: WIN32 Port] */
+      if (weightfile)
+	{
+	  u_long i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+	  fprintf (stderr, "writing new weights: Nnew = %ld\n", m[NEW].nDocs);
+	  fseek (weightfile, 0, 2);	/* end of file */
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  for (i = 0; i < m[NEW].nDocs; i++)
+	    HTONF(DocWeightBuffer[i]);
+
+	  fwrite ((char *) DocWeightBuffer, sizeof (float), m[NEW].nDocs,
+		  weightfile);
+	}
+      fclose (weightfile);
+    }
+
+
+  /* [RPAP - Feb 97: Level 3 Merge] */
+  if (m[OLD].ifh.InvfLevel == 3)
+    {
+      /* Update paragraph file */
+      int buffer_size = 1000;
+      u_char *buffer;
+      int num;
+
+      if (!(buffer = (u_char *) Xmalloc (buffer_size)))
+	FatalError (1, "Could not allocate memory for paragraph buffer");
+
+      fseek (m[MERGE].para, 0, SEEK_END);
+      while ((num = fread ((char *) buffer, sizeof (*buffer), buffer_size, m[NEW].para)) != 0)
+	fwrite ((char *) buffer, sizeof (*buffer), num, m[MERGE].para);
+
+      Xfree (buffer);
+    }
+
+/*** close files ***/
+  fclose (m[MERGE].invf);
+  fclose (m[OLD].invf);
+  fclose (m[NEW].invf);
+  fclose (m[MERGE].dict);
+  fclose (m[OLD].dict);
+  fclose (m[NEW].dict);
+  fclose (m[MERGE].idx);
+  fclose (m[OLD].idx);
+  fclose (m[NEW].idx);
+
+  /* [RPAP - Feb 97: Level 3 Merge] */
+  if (m[OLD].ifh.InvfLevel == 3)
+    {
+      fclose (m[NEW].para);
+      fclose (m[MERGE].para);
+    }
+
+  return OK;
+}
+
+
+/*=======================================================================
+ * usage()
+ *=======================================================================*/
+void 
+usage (char *progname)
+{
+  fprintf (stderr, "usage:  %s [-s] [-w] [-d directory] -f mg_collection\n",
+	   progname);
+  fprintf (stderr, "  example: %s -s -w -f MERGE/mailfiles\n", progname);
+  exit (1);
+}
+
+
+/*=======================================================================
+ * main()
+ *=======================================================================*/
+int 
+main (int argc, char *argv[])
+{
+  int ch;
+  char *progname;
+  progname = argv[0];
+  m[MERGE].fname[0] = '\0';
+
+  /* message and timing information */
+  msg_prefix = argv[0];
+
+  while ((ch = getopt (argc, argv, "f:d:swh")) != -1)
+    switch (ch)
+      {
+      case 'f':
+	strcpy (m[MERGE].fname, optarg);
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 's':
+	fastMerge = 0;
+	break;
+      case 'w':
+	weightOption = 1;
+	break;
+      case 'h':
+      case '?':
+      default:
+	usage (progname);
+      }
+
+  if (m[MERGE].fname[0] == '\0')
+    usage (progname);
+  strcpy (m[OLD].fname, m[MERGE].fname);
+  strcat (m[OLD].fname, ".old");
+  strcpy (m[NEW].fname, m[MERGE].fname);
+  strcat (m[NEW].fname, ".new");
+
+  GetTime (&start);
+  init_merge_invf ();
+  process_merge_invf ();
+  done_merge_invf ();
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  exit (0);
+}
+
+/*************************************************************************/
+/*   EOF: mg_invf_merge_new.c                                            */
+/*************************************************************************/
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.1	(revision 21083)
@@ -0,0 +1,156 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_invf_rebuild 1 \*(Dt CITRI
+.SH NAME
+mg_invf_rebuild \- Rebuild an mg inverted file with or without skips.
+.SH SYNOPSIS
+.B mg_invf_rebuild
+.RB [ \-h ]
+.if n .ti +9n
+[
+.BR \-0 " |"
+.B \-1
+[
+.BI \-k " num"
+] |
+.B \-2
+[
+.BI \-s " num"
+]
+[
+.BI \-m " num"
+]
+]
+.if n .ti +9n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_invf_rebuild
+builds a new inverted file, with or without skipping, from an old
+inverted file.  This file uses
+.I *.invf.ORG
+and
+.I *.invf.idx.ORG
+as the
+source from which it builds
+.I *.invf
+and
+.IR *.invf.idx .
+If
+.I *.invf.ORG
+or
+.I *.invf.idx.ORG
+do not exist, the program renames
+.I *.invf
+or
+.I *.invf.idx
+to
+.I *.invf.ORG
+or
+.I *.invf.idx.ORG
+as appropriate.  The old inverted file may contain skipping.  This
+means that it is possible to delete the
+.I *.ORG
+files
+after the new inverted file is built.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-m\fP \fInum\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-0
+This generates a non-skipped inverted file.  This option is normally
+only needed if the
+.I *.ORG
+files have been deleted.
+.TP
+.B \-1
+This generates a skipped inverted file.  The
+.BI \-k " num"
+argument specifies the number of pointers hopped over with each skip.
+.TP
+.B \-2
+This option generates a skipped inverted file.  The skipped inverted
+file is built so that it is `optimal' for ranking using a specific
+number of accumulators.  Each term in the inverted file has a
+different skip length.  The arguments
+.BR \-s " and " \-m
+control the sizes of the skips.
+.TP
+.BI \-k " num"
+This specifies the number of pointers that should be hopped over with
+each skip.  This option is only valid if
+.B \-1
+is specified.
+.TP
+.BI \-m " num"
+This specifies the intended number of accumulators that will be used
+when ranking queries are done on the collection.
+.TP
+.BI \-s " num"
+This specifies the minimum size for skips.  If the calculation of the
+optimal skip size results in a number smaller than
+.IR num ,
+the skip size is set to
+.IR num .
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.ORG
+Original inverted file.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.invf.idx.ORG
+The original index into the inverted file.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_invf_rebuild.c	(revision 21083)
@@ -0,0 +1,564 @@
+/**************************************************************************
+ *
+ * mg_invf_rebuild.c -- Program to rebuild an inverted file with skipping
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "timing.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "locallib.h"
+#include "words.h"
+#include "mg.h"
+
+#define LEN 40
+#define WRD 1
+
+typedef struct invf_info
+  {
+    unsigned long doc_num, count, bits_so_far, count_bits;
+  }
+invf_info;
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:11  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:46  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:10  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1994/11/29  00:32:03  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.3  1994/10/20  03:56:56  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:51  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+static char pathname[256];
+
+static void process_files (char *filename);
+
+static int k = -1;
+static int mode = 0;
+static int max_nodes = -1;
+static int mins = -1;
+
+void 
+usage (char *pgname)
+{
+  fprintf (stderr, "usage: %s [-f input_file]"
+       "[-d data directory] -0|-1|-2 [-k num] [-m num] [-s num]\n", pgname);
+  printf ("Mode 0: (the default)\n");
+  printf ("\tk, m, and s have no meaning and if specified produce an error\n");
+  printf ("Mode 1:\n");
+  printf ("\tm, and s have no meaning and if specified produce an error\n");
+  printf ("\tk The size of skips\n");
+  printf ("Mode 2:\n");
+  printf ("\tk has no meaning and if specified will produce an error\n");
+  printf ("\tm is the the number of accumulators that will be used for the\n");
+  printf ("\t  ranking. The program builds an inverted file that is \n");
+  printf ("\t  \"optimal\" for that number of accumulators.\n");
+  printf ("\ts is the minimum size for skips.\n");
+  exit (1);
+}
+
+
+
+int main (int argc, char **argv)
+{
+  ProgTime start;
+  char *dir_name, *file_name = "";
+  int ch;
+  msg_prefix = argv[0];
+  dir_name = getenv ("MGDATA");
+  strcpy (pathname, dir_name ? dir_name : ".");
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "012hf:d:k:b:s:m:")) != -1)
+    switch (ch)
+      {
+      case '0':
+	mode = 0;
+	break;
+      case '1':
+	mode = 1;
+	break;
+      case '2':
+	mode = 2;
+	break;
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	strcpy (pathname, optarg);
+	break;
+      case 'k':
+	k = atoi (optarg);
+	break;
+      case 'm':
+	max_nodes = atoi (optarg);
+	break;
+      case 's':
+	mins = atoi (optarg);
+	if (mins < 1)
+	  FatalError (1, "The number for the -m option must be greater"
+		      " than or equal to 1");
+	break;
+      case 'h':
+      case '?':
+	usage (argv[0]);
+      }
+
+  if ((mode == 0 && (k != -1 || max_nodes != -1 || mins != -1)) ||
+      (mode == 1 && (max_nodes != -1 || mins != -1)) ||
+      (mode == 2 && (k != -1)))
+    {
+      Message ("Illegal parameters for mode");
+      usage (argv[0]);
+    }
+
+  if (mode == 1 && k == -1)
+    {
+      k = 8;
+      Message ("k is required for mode 1: defaulting k to %d", k);
+    }
+  if (mode == 2 && max_nodes == -1)
+    {
+      max_nodes = 1024;
+      Message ("m is required for mode 2: defaulting m to %d", max_nodes);
+    }
+  if (mode == 2 && mins == -1)
+    {
+      mins = 1;
+      Message ("s is required for mode 2: defaulting s to %d", mins);
+    }
+
+
+  GetTime (&start);
+  process_files (file_name);
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  Message ("**** Don\'t forget to rebuild the stemmed dictionary with mg_invf_dict. ****\n");
+  Message ("**** If the collection was built with stem indexes don\'t forget to     ****\n");
+  Message ("**** rebuild them with mg_stem_idx.                                     ****\n");
+
+  return 0;
+}
+
+
+
+
+
+static void 
+process_files (char *filename)
+{
+  FILE *in, *out, *idx, *odx, *dict;
+  unsigned long magic, outmode, N, in_k, out_k;
+  unsigned long bits_out, bytes_out, i, j;
+  stdio_bitio_state out_buf, in_buf;
+  struct invf_dict_header idh;
+  struct invf_file_header ifh_in, ifh_out;
+  char FName[256];
+
+  outmode = mode;
+
+  /* open .invf.ORG, rename .invf if have to */
+  sprintf (FName, FILE_NAME_FORMAT ".ORG", pathname, filename, INVF_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(in = fopen (FName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      char fname[256];
+      sprintf (fname, FILE_NAME_FORMAT, pathname, filename, INVF_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+      rename (fname, FName);
+      if (!(in = fopen (FName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+	FatalError (1, "Unable to open \"%s\".\n", FName);
+    }
+  else
+    {
+      char fname[256];
+      sprintf (fname, FILE_NAME_FORMAT, pathname, filename, INVF_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+      unlink (fname);
+    }
+  Message ("Opening \"%s\"\n", FName);
+
+  /* check the magic number for .invf.ORG */
+  if (fread (&magic, sizeof (magic), 1, in) != 1 || NTOHUL(magic) != MAGIC_INVF)  /* [RPAP - Jan 97: Endian Ordering] */
+    FatalError (1, "Bad magic number in \"%s\".\n", FName);
+
+
+  /* open .invf.idx.ORG, rename .invf.idx if have to */
+  sprintf (FName, FILE_NAME_FORMAT ".ORG", pathname, filename, INVF_IDX_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  if (!(idx = fopen (FName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      char fname[256];
+      sprintf (fname, FILE_NAME_FORMAT, pathname, filename, INVF_IDX_SUFFIX);
+      rename (fname, FName);
+      if (!(idx = fopen (FName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+	FatalError (1, "Unable to open \"%s\".\n", FName);
+    }
+  else
+    {
+      char fname[256];
+      sprintf (fname, FILE_NAME_FORMAT, pathname, filename, INVF_IDX_SUFFIX);
+      unlink (fname);
+    }
+  Message ("Opening \"%s\"\n", FName);
+
+  /* check the magic number for .invf.idx.ORG */
+  if (fread (&magic, sizeof (magic), 1, idx) != 1 || NTOHUL(magic) != MAGIC_INVI)  /* [RPAP - Jan 97: Endian Ordering] */
+    FatalError (1, "Bad magic number in \"%s\".\n", FName);
+
+  sprintf (FName, FILE_NAME_FORMAT, pathname, filename, INVF_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  Message ("Creating \"%s\"\n", FName);
+  if (!(out = fopen (FName, "wb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open \"%s\".\n", FName);
+
+  sprintf (FName, FILE_NAME_FORMAT, pathname, filename, INVF_IDX_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  Message ("Creating \"%s\"\n", FName);
+  if (!(odx = fopen (FName, "wb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open \"%s\".\n", FName);
+
+  sprintf (FName, FILE_NAME_FORMAT, pathname, filename, INVF_DICT_SUFFIX);  /* [RPAP - Feb 97: WIN32 Port] */
+  Message ("Opening \"%s\"\n", FName);
+  if (!(dict = fopen (FName, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open \"%s\".\n", FName);
+
+  if (fread (&magic, sizeof (magic), 1, dict) != 1 || NTOHUL(magic) != MAGIC_STEM_BUILD)  /* [RPAP - Jan 97: Endian Ordering] */
+    FatalError (1, "Bad magic number in \"%s\".\n", FName);
+
+  fread ((char *) &idh, sizeof (idh), 1, dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  HTONUL2(MAGIC_INVF, magic);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite ((char *) &magic, sizeof (magic), 1, out);
+
+  fread ((char *) &ifh_in, sizeof (ifh_in), 1, in);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(ifh_in.no_of_words);
+  NTOHUL(ifh_in.no_of_ptrs);
+  NTOHUL(ifh_in.skip_mode);
+  for (i = 0; i < 16; i++)
+    NTOHUL(ifh_in.params[i]);
+  NTOHUL(ifh_in.InvfLevel);
+
+  ifh_out = ifh_in;
+  ifh_out.skip_mode = outmode;
+  bzero ((char *) ifh_out.params, sizeof (ifh_out.params));
+  switch (outmode)
+    {
+    case 0:
+      break;
+    case 1:
+      ifh_out.params[0] = k;
+      break;
+    case 2:
+      ifh_out.params[0] = max_nodes;
+      ifh_out.params[1] = mins;
+      break;
+    }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(ifh_out.no_of_words);
+  HTONUL(ifh_out.no_of_ptrs);
+  HTONUL(ifh_out.skip_mode);
+  for (i = 0; i < 16; i++)
+    HTONUL(ifh_out.params[i]);
+  HTONUL(ifh_out.InvfLevel);
+
+  fwrite ((char *) &ifh_out, sizeof (ifh_out), 1, out);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(ifh_out.no_of_words);
+  NTOHUL(ifh_out.no_of_ptrs);
+  NTOHUL(ifh_out.skip_mode);
+  for (i = 0; i < 16; i++)
+    NTOHUL(ifh_out.params[i]);
+  NTOHUL(ifh_out.InvfLevel);
+
+  Message ("The file is a level %d inverted file.\n", ifh_in.InvfLevel);
+
+  bits_out = ftell (out) * 8;
+
+
+  HTONUL2(MAGIC_INVI, magic);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite ((char *) &magic, sizeof (magic), 1, odx);
+
+  DECODE_START (in)
+    DECODE_PAUSE (in_buf)
+
+    ENCODE_START (out)
+    ENCODE_PAUSE (out_buf)
+
+    N = idh.num_of_docs;
+
+  for (i = 0; i < ifh_in.no_of_words; i++)
+    {
+      unsigned long blk, p;
+      unsigned long odn_blk = 0, olen_blk = 0;
+      unsigned long idn_blk = 0, ilen_blk = 0;
+      register unsigned long suff;
+      unsigned long fcnt, wcnt, doc_num, bits_so_far, last_major;
+      unsigned long next_mjr_dn, kd;
+      char dummy2[MAXSTEMLEN + 1];
+      invf_info *ii;
+
+      fgetc (dict);
+      suff = fgetc (dict);
+      fread (dummy2, sizeof (u_char), suff, dict);
+      fread ((char *) &fcnt, sizeof (fcnt), 1, dict);
+      fread ((char *) &wcnt, sizeof (wcnt), 1, dict);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      HTONUL2(bits_out >> 3, bytes_out);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite ((char *) &bytes_out, sizeof (bytes_out), 1, odx);
+      NTOHUL(bytes_out);  /* [RPAP - Jan 97: Endian Ordering] */
+
+      p = fcnt;
+      blk = BIO_Bblock_Init (idh.static_num_of_docs, p);
+      switch (outmode)
+	{
+	case 1:
+	  {
+	    unsigned long len;
+	    if (p <= ifh_out.params[0])
+	      out_k = 0;
+	    else
+	      {
+		out_k = ifh_out.params[0];
+		len = BIO_Bblock_Bound (N, p);
+		if (ifh_in.InvfLevel >= 2)
+		  len += wcnt;
+		odn_blk = BIO_Bblock_Init (idh.num_of_docs, (p + out_k - 1) / out_k);
+		olen_blk = BIO_Bblock_Init (len, (p + out_k - 1) / out_k);
+	      }
+	    break;
+	  }
+	case 2:
+	  {
+	    unsigned long len;
+	    if (p <= mins)
+	      out_k = 0;
+	    else
+	      {
+		out_k = (int) (2 * sqrt ((double) p / max_nodes));
+		if (out_k <= mins)
+		  out_k = mins;
+		len = BIO_Bblock_Bound (N, p);
+		if (ifh_in.InvfLevel >= 2)
+		  len += wcnt;
+		odn_blk = BIO_Bblock_Init (idh.num_of_docs,
+					   (p + out_k - 1) / out_k);
+		olen_blk = BIO_Bblock_Init (len, (p + out_k - 1) / out_k);
+	      }
+	    break;
+	  }
+	default:
+	  out_k = 0;
+	}
+
+      switch (ifh_in.skip_mode)
+	{
+	case 1:
+	  {
+	    unsigned long len;
+	    if (p <= ifh_in.params[0])
+	      in_k = 0;
+	    else
+	      {
+		in_k = ifh_in.params[0];
+		len = BIO_Bblock_Bound (N, p);
+		if (ifh_in.InvfLevel >= 2)
+		  len += wcnt;
+		idn_blk = BIO_Bblock_Init (idh.num_of_docs, (p + in_k - 1) / in_k);
+		ilen_blk = BIO_Bblock_Init (len, (p + in_k - 1) / in_k);
+	      }
+	    break;
+	  }
+	case 2:
+	  {
+	    unsigned long len;
+	    if (p <= ifh_in.params[1])
+	      {
+		in_k = 0;
+	      }
+	    else
+	      {
+		in_k = (int) (2 * sqrt ((double) p / ifh_in.params[0]));
+		if (in_k <= ifh_in.params[1])
+		  in_k = ifh_in.params[1];
+		len = BIO_Bblock_Bound (N, p);
+		if (ifh_in.InvfLevel >= 2)
+		  len += wcnt;
+		idn_blk = BIO_Bblock_Init (idh.num_of_docs,
+					   (p + in_k - 1) / in_k);
+		ilen_blk = BIO_Bblock_Init (len, (p + in_k - 1) / in_k);
+	      }
+	    break;
+	  }
+	default:
+	  in_k = 0;
+	}
+
+      if (!(ii = Xmalloc (sizeof (invf_info) * p)))
+	FatalError (1, "Unable to allocate memory for \"ii\"\n");
+
+      doc_num = bits_so_far = 0;
+      next_mjr_dn = 0;
+      kd = 0;
+      DECODE_CONTINUE (in_buf)
+	for (j = 0; j < p; j++, kd++)
+	{
+	  unsigned long doc_diff, count = 0;
+	  if (kd == in_k)
+	    kd = 0;
+	  if (in_k && kd == 0 && j + in_k < p)
+	    {
+	      int temp;
+	      BBLOCK_DECODE (next_mjr_dn, idn_blk);
+	      next_mjr_dn += doc_num;
+	      BBLOCK_DECODE (temp, ilen_blk);
+	    }
+	  ii[j].bits_so_far = bits_so_far;
+	  if (in_k && kd == in_k - 1 && j != p - 1)
+	    {
+	      int count;
+	      BBLOCK_LENGTH (next_mjr_dn - doc_num, blk, count);
+	      bits_so_far += count;
+	      doc_num = next_mjr_dn;
+	    }
+	  else
+	    {
+	      BBLOCK_DECODE_L (doc_diff, blk, bits_so_far);
+	      doc_num += doc_diff;
+	    }
+	  ii[j].doc_num = doc_num;
+	  if (ifh_in.InvfLevel >= 2)
+	    {
+	      int count_bits = 0;
+	      GAMMA_DECODE_L (count, count_bits);
+	      ii[j].count_bits = count_bits;
+	      bits_so_far += count_bits;
+	      ii[j].count = count;
+	    }
+	}
+
+      /* read till a byte boundary */
+      while (__btg)
+	{
+	  DECODE_BIT;
+	  bits_so_far++;
+	}
+
+      DECODE_PAUSE (in_buf)
+
+	doc_num = bits_so_far = 0;
+      last_major = 0;
+      kd = 0;
+      ENCODE_CONTINUE (out_buf)
+	for (j = 0; j < p; j++, kd++)
+	{
+	  if (kd == out_k)
+	    kd = 0;
+	  if (out_k && kd == 0)
+	    {
+	      if (j + out_k < p)
+		{
+		  int num = ii[j + out_k - 1].doc_num - last_major;
+		  BBLOCK_ENCODE_L (num, odn_blk, bits_out);
+		  last_major = ii[j + out_k - 1].doc_num;
+
+		  num = ii[j + out_k - 1].bits_so_far + ii[j + out_k - 1].count_bits -
+		    bits_so_far;
+		  BBLOCK_ENCODE_L (num, olen_blk, bits_out);
+		  bits_so_far = ii[j + out_k].bits_so_far;
+		}
+	    }
+	  if (!(out_k && kd == out_k - 1 && j != p - 1))
+	    BBLOCK_ENCODE_L (ii[j].doc_num - doc_num, blk, bits_out);
+	  doc_num = ii[j].doc_num;
+	  if (ifh_in.InvfLevel >= 2)
+	    GAMMA_ENCODE_L (ii[j].count, bits_out);
+	}
+
+      /* write till a byte boundary */
+      while (__btg != 8)
+	{
+	  ENCODE_BIT (0);
+	  bits_out++;
+	}
+      ENCODE_PAUSE (out_buf)
+
+	Xfree (ii);
+
+    }
+  ENCODE_CONTINUE (out_buf)
+    ENCODE_DONE
+
+    HTONUL2(bits_out >> 3, bytes_out);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite ((char *) &bytes_out, sizeof (bytes_out), 1, odx);
+  NTOHUL(bytes_out);
+
+  fclose (idx);
+  fclose (odx);
+  fclose (in);
+  fclose (out);
+  fclose (dict);
+
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_merge.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_merge.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_merge.h	(revision 21083)
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * mgmerge.h --- mgmerge #defines, etc
+ * Copyright (C) 1995  Shane Hudson (shane@cosc.canterbury.ac.nz)
+ *
+ * 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.
+ *
+ * $Id$
+ * Last edtited: November 12 1994
+ *
+ **************************************************************************/
+
+#ifndef MGMERGE_H
+#define MGMERGE_H
+
+typedef unsigned char byte;
+
+#define OLD 0
+#define NEW 1
+#define MERGE 2
+
+#define OK 0
+#define ERROR_MGMERGE 1
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.1	(revision 21083)
@@ -0,0 +1,441 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_passes 1 \*(Dt CITRI
+.SH NAME
+mg_passes \- builds mg databases
+.SH SYNOPSIS
+.B mg_passes
+[
+.B \-h
+]
+[
+.B \-G
+]
+[
+.B \-S
+]
+[
+.B \-D
+]
+[
+.B \-W
+]
+.if n .ti +9n
+[
+.BR \-1 " |"
+.BR \-2 " |"
+.B  \-3
+]
+[
+.BI \-C " compstatpoint"
+]
+.if n .ti +9n
+[
+.BI \-n " tracename"
+]
+.if t .ti +.5i
+[
+.BI \-b " bufsize"
+]
+[
+.BI \-m " memlimit"
+]
+.if n .ti +9n
+[
+.BI \-c " numchunks"
+]
+[
+.BI \-a " stemmer"
+]
+[
+.BI \-s " stemmethod"
+]
+[
+.BI \-t " tracepos"
+]
+.if n .ti +9n
+[
+.B \-T1
+]
+[
+.B \-T2
+]
+.if t .ti +.5i
+[
+.B \-I1
+]
+[
+.B \-I2
+]
+.if n .ti +9n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+[
+.I filename(s)
+]
+.SH DESCRIPTION
+.B mg_passes
+is the program that does most of the work when building
+.BR mg (1)
+database systems.  The input documents can come from either
+.I stdin
+or from a list of files on the command line.  Individual documents
+must be separated with control-B characters.  In general,
+.B mg_passes
+must be run twice to build a database, first with the
+.B \-T1
+and
+.B \-I1
+options, and second with the
+.B \-T2
+and
+.B \-I2
+options.  Several other programs must be run in order to get an
+.BR mg (1)
+database that is ready for the
+.BR mgquery (1)
+program.  The
+.SB EXAMPLE
+section below gives an example of how to build a complete
+.BR mg (1)
+database.
+.SH OPTIONS
+Options may appear in any order, but the
+.IR filename(s) ,
+if specified, must be last.
+.TP "\w'\fB\-C\fP \fIcompstatpoint\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-G
+Treat SGML tags as non-words when building the inverted file.  An SGML
+tag is anything between angle brackets, i.e., `<' and `>'.
+.TP
+.B \-S
+This option causes a special pass to be executed.  It is up to a user
+to modify
+.I mg.special.c
+in the source code to do something with the documents it is given.
+.TP
+.B \-D
+If
+.B mg_passes
+fails, then print the document that caused the failure to the trace
+file if tracing is active, or to
+.I stderr
+if it is not.
+.TP
+.B \-W
+This option enables the generation of the weights file when
+.B \-I2
+is specified.  It causes
+.B \-I2
+to use a little more memory and CPU.
+.TP
+.B \-1
+Produce a level-1 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+A level-1 inverted file makes it possible for
+.BR mgquery (1)
+to do Boolean queries.  Ranked queries can still be done,
+although the quality of the ranking is abysmal.
+.TP
+.B \-2
+Produce a level-2 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+This is the default when neither
+.BR \-1 ", " "\-2 " "or " \-3
+is specified.
+A level-2 inverted file makes it possible for
+.BR mgquery (1)
+to do Boolean queries and cosine-ranked queries.
+.TP
+.B \-3
+Produce a level-3 inverted file.  This option is only useful when
+specified with
+.BR "\-I1 ".
+This has been implemented to enable paragraph-level inversion.
+Paragraphs are delimited by control-C characters in the source text.
+.TP
+.BI \-C " compstatpoint"
+This option causes statistics on the compression performance to be
+output to a file called
+.IR *.compression.stats .
+.I compstatpoint
+specifies the interval between outputting each line of statistics.  The
+units of
+.I compstatpoint
+are kilobytes of source text.  E.g., if
+.I compstatpoint
+is 10, then a line is output to the file every 10 KB of input
+source.  Each line of the file consists of 4 numbers The first number
+is the amount of input text, in bytes, processed so far.  The second
+number is the amount of input text, in bytes, processed since the
+last line was output to the file.  The third number is the number of
+output bytes generated since the last line was output to the file, and
+the fourth number is the compression achieved since the last line was
+output, i.e., the third number divided by the second number.
+.TP
+.BI \-n " tracename"
+This specifies the filename to use for the trace log, if tracing is
+enabled using the
+.B \-t
+option.  If
+.BI \-n " tracename"
+is not given and tracing is enabled, a default trace filename will be
+used.
+.TP
+.BI \-s " stemmethod"
+This specifies the method to use to \*(lqstem\*(rq the words in the
+inverted file dictionary.  This is a bit mask specifying the
+operations to do on words as they are parsed out of the text, where
+bit number 0 is the low-order (rightmost) bit.  Bit 0 does case
+folding, and bit 1 does simple stemming, so the value 3 for
+.I stemmethod
+does both case folding and stemming.
+.TP
+.BI \-a " stemmer"
+This specifies the stemmer to use when stemming words.  This
+is a description of the language the stemmer is intended for
+or a description of the stemmer.  Valid options include:
+english, lovin, french, and simplefrench.
+.TP
+.BI \-b " bufsize"
+Specify the size of the document buffer in kilobytes.  If any document
+is larger than
+.IR bufsize ,
+the program will abort with an error message.  This should probably be
+replaced with some system which automatically increases the buffer
+size as required.  The default size is 3072 KB (3 MB).
+.TP
+.BI \-m " memlimit"
+Maximum amount of memory to use for the pass-2 file inversion in
+megabytes.  This option is only useful when used in conjunction with
+the option
+.BR \-I1 .
+The larger this value, the faster the pass-2 inversion will proceed.
+The default value is 5 MB.
+.TP
+.BI \-c " numchunks"
+The maximum number of inversion chunks to write to disk.  Each chunk
+will be approximately as large as
+.IR memlimit .
+This option is only useful when used in conjunction with the option
+.BR \-I2 .
+The larger this value, the faster the pass-2 inversion will proceed.
+The default value is 5 MB.
+.TP
+.BI \-t " tracepos"
+This option activates tracing.  A line will be generated in the
+trace file for every
+.I tracepos
+input bytes processed.  The default name for the trace file can be
+overridden using the
+.BI \-n " tracename"
+option.
+.TP
+.B \-T1
+Generate the
+.I *.text.stats
+file.
+.TP
+.B \-T2
+Generate the
+.IR *.text ,
+.IR *.text.idx ,
+and possibly the
+.I *.text.dict.aux
+files.  Using this option requires that the
+.I *.text.dict
+file be present.
+.TP
+.B \-I1
+Generate the
+.IR *.invf.dict ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files.
+.TP
+.B \-I2
+Generate the
+.I *.invf
+and
+.I *.invf.idx
+files.  Using this option requires
+that the
+.IR *.invf.dict.hash ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files
+be present.  The
+.I *.invf.dict.hash
+file is generated by
+.BR mg_perf_hash_build (1)
+from the
+.I *.invf.dict.build
+file.  If the
+.B \-W
+option is specified, the
+.I *.weight
+file will also be generated.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is to be
+written.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection that will be
+created.
+.TP
+.I filename(s)
+This specifies the source text. If this is not specified, then the
+program expects the source text from
+.IR stdin .
+.SH EXAMPLE
+What follows is a UNIX
+.BR csh (1)
+script as an example of how to build an
+.BR mg (1)
+document collection.
+.LP
+.nf
+.DT
+.ft B
+.I #! /bin/csh
+.I
+# The first argument on the command line specifies the
+.I
+#   source of the text
+set source = ($1)
+.PP
+.I
+# The second argument is the name of the collection
+set text = ($2)
+.PP
+.I
+# Create *.text.stats,  *.invf.dict.build,
+.I
+#   *.invf.chunk and *.invf.chunks.trans
+${source} | mg_passes -T1 -I1 -m 1 -t 1 -f ${text}
+.PP
+.I
+# Create *.text.dict
+mg_compression_dict -f ${text}
+.PP
+.I
+# Create *.invf.dict.hash
+mg_perf_hash_build -f ${text}
+.PP
+.I
+# Create *.text,  *.text.idx,
+.I
+#   *.invf and *.invf.idx
+${source} | mg_passes -T2 -I2 -c 2 -t 1 -f ${text}
+.PP
+.I
+# Create *.text.idx.wgt and *.weight.approx
+mg_weights_build -f ${text} -b 8
+.PP
+.I
+# Create *.invf.dict
+mg_invf_dict -f ${text} -b 4096
+.PP
+.I
+# Create *.text.dict
+mg_fast_comp_dict -f ${text}
+.ft R
+.fi
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.chunk
+Inverted file chunk descriptor file.  When the inverted file is
+created it is created in chunks that use no more than a set amount of
+memory.  This file describes those chunks.
+.TP
+.B *.invf.chunk.trans
+Word-occurrence-order to lexical-order translation file.  The
+.B *.invf.chunk
+file is written in word-occurrence order but is required by
+.B \-I2
+to be in lexical order.
+.TP
+.B *.invf.dict.build
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for an order-preserving perfect hash function.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.trace
+The default trace file.
+.TP
+.B *.compression.stats
+Statistics about the compression of the text.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_passes.c	(revision 21083)
@@ -0,0 +1,635 @@
+/**************************************************************************
+ *
+ * mg_passes.c -- Driver for the various passes
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#ifdef HAVE_MALLINFO
+# include <malloc.h> 
+#endif
+
+#include "memlib.h"
+#include "messages.h"
+#include "timing.h"
+
+#include "longlong.h"
+
+#include "mg_files.h"
+#include "mg.h"
+#include "build.h"
+#include "text.h"
+#include "stemmer.h"
+
+
+/*
+   $Log$
+   Revision 1.3  2001/09/21 12:46:42  kjm18
+   updated mg to be in line with mg_1.3f. Now uses long long for some variables
+   to enable indexing of very large collections.
+
+   Revision 1.2  2001/06/12 23:23:42  jrm21
+   fixed a bug where mg_passes segfaults when trying to print the usage message.
+
+   Revision 1.1  1999/08/10 21:18:12  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1998/12/17 09:12:53  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:47  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:13  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:57  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:52  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#define MAX_PASSES 5
+
+#define SPECIAL 1
+#define TEXT_PASS_1 2
+#define TEXT_PASS_2 4
+#define IVF_PASS_1 8
+#define IVF_PASS_2 16
+
+#define MIN_BUF 8192
+#define	TERMRECORD	'\002'
+
+unsigned long buf_size = 3 * 1024 * 1024;	/* 3Mb */
+unsigned long invf_buffer_size = 5 * 1024 * 1024;	/* 5Mb */
+unsigned long ChunkLimit = 0;
+char InvfLevel = 2;
+char SkipSGML = 0;
+char MakeWeights = 0;
+FILE *Comp_Stats = NULL;
+int comp_stat_point = 0;
+mg_ullong bytes_processed = 0;
+mg_ullong bytes_received = 0;
+int stemmer_num = 0; /* default to the lovin stemmer */
+int stem_method = 0;
+
+static char Passes = 0;
+static unsigned long trace = 0;
+static int Dump = 0;
+static char **files = NULL;
+static int num_files = 0;
+static char *trace_name = NULL;
+
+
+typedef struct pass_data
+  {
+    char *name;
+    int (*init) (char *);
+    int (*process) (u_char *, int);
+    int (*done) (char *);
+#ifdef HAVE_TIMES
+    clock_t init_time;
+    clock_t process_time;
+    clock_t done_time;
+#else
+    struct timeval init_time;
+    struct timeval process_time;
+    struct timeval done_time;
+#endif
+  }
+pass_data;
+
+#ifdef HAVE_TIMES
+#define NULL_TIMES 0, 0, 0
+#else
+#define NULL_TIMES {0, 0}, {0, 0}, {0, 0}
+#endif
+
+static pass_data PassData[MAX_PASSES] =
+{
+  {"special", init_special, process_special, done_special, NULL_TIMES},
+  {"text.pass1", init_text_1, process_text_1, done_text_1, NULL_TIMES},
+  {"text.pass2", init_text_2, process_text_2, done_text_2, NULL_TIMES},
+  {"ivf.pass1", init_ivf_1, process_ivf_1, done_ivf_1, NULL_TIMES},
+  {"ivf.pass2", init_ivf_2, process_ivf_2, done_ivf_2, NULL_TIMES},
+};
+
+static char *usage_str = "\nUSAGE:\n"
+"  %s [-h] [-G] [-D] [-1|-2|-3] [-T1] [-T2] [-I1] [-I2] [-N1]\n"
+"  %*s [-N2] [-W] [-S] [-b buffer-size] [-d dictionary-directory]\n"
+"  %*s [-t trace-point Mb] [-m invf-memory] [-c chunk-limit]\n"
+"  %*s [-n trace-name] [-C comp-stat-size] [-s stem_method]\n"
+"  %*s [-a stemmer] -f doc-collection-name\n";
+
+
+
+
+
+
+
+
+
+static void 
+usage (char *err)
+{
+  if (err)
+    Message (err);
+  fprintf (stderr, usage_str, msg_prefix, strlen (msg_prefix), "",
+	   strlen (msg_prefix), "",strlen (msg_prefix), "",
+	   strlen (msg_prefix),"");
+  exit (1);
+}
+
+
+
+
+#if 0
+static char *
+str_comma (unsigned long u)
+{
+  static char buf[20];
+  unsigned long a, b, c, d;
+  a = u / 1000000000;
+  u -= a * 1000000000;
+  b = u / 1000000;
+  u -= b * 1000000;
+  c = u / 1000;
+  u -= c * 1000;
+  d = u;
+
+  if (a)
+    sprintf (buf, "%u,%03u,%03u,%03u", a, b, c, d);
+  else if (b)
+    sprintf (buf, "%u,%03u,%03u", b, c, d);
+  else if (c)
+    sprintf (buf, "%u,%03u", c, d);
+  else
+    sprintf (buf, "%u", d);
+  return (buf);
+}
+#endif
+
+
+
+
+int 
+open_next_file (int in_fd)
+{
+  if (in_fd > 0)
+    close (in_fd);
+  if (num_files == 0)
+    return (-1);
+  if ((in_fd = open (files[0], O_RDONLY)) == -1)
+    FatalError (1, "Cannot open %s", files[0]);
+  files++;
+  num_files--;
+  return (in_fd);
+}
+
+
+static void 
+driver (int in_fd, FILE * Trace, char *file_name)
+{
+  int pass, num = 1;
+
+  char *buffer = Xmalloc (buf_size);
+  unsigned long num_docs = 0;
+  unsigned long block_bytes = 0;
+  register int buf_left = buf_size;
+  register char *look_pos = buffer;
+  register char *end_pos = buffer;
+
+  ProgTime StartTime, InitTime, ProcTime, DoneTime;
+
+  GetTime (&StartTime);
+
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      {
+	pass_data *pd = &PassData[pass];
+#ifdef HAVE_TIMES
+	struct tms tims;
+	times (&tims);
+	pd->init_time -= tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	struct rusage ru;
+
+	getrusage (RUSAGE_SELF, &ru);
+	pd->init_time.tv_sec -= ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	pd->init_time.tv_usec -= ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+#endif
+	if (pd->init (file_name) == COMPERROR)
+	  FatalError (1, "Error during init of \"%s\"", pd->name);
+
+#ifdef HAVE_TIMES
+	times (&tims);
+	pd->init_time += tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	getrusage (RUSAGE_SELF, &ru);
+	pd->init_time.tv_sec += ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	pd->init_time.tv_usec += ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+	time_normalise (&pd->init_time);
+#endif
+      }
+
+  GetTime (&InitTime);
+  for (;;)
+    {
+      int len = 0;
+      char *base = look_pos;
+
+      while (look_pos != end_pos && *look_pos != TERMRECORD)
+	look_pos++;
+
+      while (look_pos == end_pos)
+	{
+	  if (buf_left < MIN_BUF)
+	    {
+	      bcopy (base, buffer, end_pos - base);
+	      look_pos = buffer + (end_pos - base);
+	      buf_left = buf_size - (end_pos - base);
+	      end_pos = look_pos;
+	      base = buffer;
+	    }
+	  if (buf_left)
+	    {
+    	      num = read (in_fd, end_pos, buf_left);
+	      if (num < 0) num = 0; /* RJM - quick hack :-) */
+	      if (num == 0)
+		if ((in_fd = open_next_file (in_fd)) != -1)
+		  num = read (in_fd, end_pos, buf_left);
+	      bytes_received += num;
+	      buf_left -= num;
+	      end_pos += num;
+	    }
+	  while (look_pos < end_pos && *look_pos != TERMRECORD)
+	    look_pos++;
+	  if (buf_left == 0 && base == buffer && look_pos == end_pos)
+	    {
+	      Message ("Unable to find document terminator (i.e ^B)"
+		       " in the document");
+	      FatalError (1, "The document is in excess of %d chars long",
+			  look_pos - base);
+	    }
+	  if (!num)
+	    break;
+	}
+      len = look_pos++ - base;
+
+      if (!num && base == end_pos)
+	break;
+
+      bytes_processed += len;
+
+#ifndef QUIET
+      if (!len)
+	Message ("Warning : Processing zero length document");
+#endif
+
+      for (pass = 0; pass < MAX_PASSES; pass++)
+	if (Passes & (1 << pass))
+	  {
+	    register pass_data *pd = &PassData[pass];
+
+#ifdef HAVE_TIMES
+	    struct tms tims;
+	    times (&tims);
+	    pd->process_time -= tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	    struct rusage ru;
+	    register struct timeval *tv = &pd->process_time;
+
+	    getrusage (RUSAGE_SELF, &ru);
+	    tv->tv_sec -= ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	    tv->tv_usec -= ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+#endif
+
+	    if (pd->process ((u_char *) base, len) == COMPERROR)
+	      {
+		Message ("Error during processing of \"%s\"", pd->name);
+		if (Dump || Trace)
+		  {
+		    int i;
+		    FILE *f = Trace ? Trace : stderr;
+		    fprintf (f, "-=- * -=- * -=- * -=- * -=- * -=- * -=-\n");
+		    for (i = 0; i < len; i++)
+		      {
+			char ch = base[i];
+			if (ch == '\1' || ch == '\2')
+			  ch = '\n';
+			putc (ch, f);
+		      }
+		    fprintf (f, "-=- * -=- * -=- * -=- * -=- * -=- * -=-\n");
+		  }
+		if (Trace)
+		  fprintf (Trace, "%11" ULL_FS " bytes |%7lu docs | %s\n",
+			   bytes_processed, num_docs,
+			   ElapsedTime (&StartTime, NULL));
+		exit (1);
+	      }
+
+#ifdef HAVE_TIMES
+	    times (&tims);
+	    pd->process_time += tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	    getrusage (RUSAGE_SELF, &ru);
+	    tv->tv_sec += ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	    tv->tv_usec += ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+#endif
+	  }
+      num_docs++;
+      if (Trace)
+	{
+	  block_bytes += (look_pos - base);
+	  if (block_bytes >= trace)
+	    {
+#ifdef HAVE_MALLINFO
+	      struct mallinfo mi;
+	      mi = mallinfo ();
+	      block_bytes -= trace;
+	      fprintf (Trace, "%11" ULL_FS " bytes |%7lu docs |%7.3f Mb | %s\n",
+		       bytes_processed, num_docs, mi.arena / 1024.0 / 1024.0,
+		       ElapsedTime (&StartTime, NULL));
+#else
+	      block_bytes -= trace;
+	      fprintf (Trace, "%11" ULL_FS " bytes |%7lu docs | %s\n",
+		       bytes_processed, num_docs,
+		       ElapsedTime (&StartTime, NULL));
+#endif
+	    }
+	}
+      if (!num && look_pos - 1 == end_pos)
+	break;
+    }
+
+#ifndef HAVE_TIMES
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      time_normalise (&PassData[pass].process_time);
+#endif
+
+  GetTime (&ProcTime);
+
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      {
+	pass_data *pd = &PassData[pass];
+#ifdef HAVE_TIMES
+	struct tms tims;
+	times (&tims);
+	pd->done_time -= tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	struct rusage ru;
+
+	getrusage (RUSAGE_SELF, &ru);
+	pd->done_time.tv_sec -= ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	pd->done_time.tv_usec -= ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+#endif
+	if (pd->done (file_name) == COMPERROR)
+	  FatalError (1, "Error during done of \"%s\"", pd->name);
+
+#ifdef HAVE_TIMES
+	times (&tims);
+	pd->done_time += tims.tms_utime + tims.tms_stime;
+#elif defined(HAVE_GETRUSAGE)  /* [RPAP - Feb 97: WIN32 Port] */
+	getrusage (RUSAGE_SELF, &ru);
+	pd->done_time.tv_sec += ru.ru_utime.tv_sec + ru.ru_stime.tv_sec;
+	pd->done_time.tv_usec += ru.ru_utime.tv_usec + ru.ru_stime.tv_usec;
+	time_normalise (&pd->done_time);
+#endif
+      }
+  if (Trace)
+    {
+#ifdef HAVE_MALLINFO
+      struct mallinfo mi;
+      mi = mallinfo ();
+      fprintf (Trace, "%11" ULL_FS " bytes |%7lu docs |%7.3f Mb | %s\n",
+	       bytes_processed, num_docs, mi.arena / 1024.0 / 1024.0,
+	       ElapsedTime (&StartTime, NULL));
+#else
+      fprintf (Trace, "%11" ULL_FS " bytes |%7lu docs | %s\n",
+	       bytes_processed, num_docs,
+	       ElapsedTime (&StartTime, NULL));
+#endif
+    }
+
+  GetTime (&DoneTime);
+
+  Message ("");
+  Message ("%10s      :    init         process        done", "");
+  for (pass = 0; pass < MAX_PASSES; pass++)
+    if (Passes & (1 << pass))
+      {
+	pass_data *pd = &PassData[pass];
+	char it[15], pt[15], dt[15];
+#ifdef HAVE_TIMES
+	strcpy (it, cputime_string (pd->init_time));
+	strcpy (pt, cputime_string (pd->process_time));
+	strcpy (dt, cputime_string (pd->done_time));
+#else
+	strcpy (it, cputime_string (&pd->init_time));
+	strcpy (pt, cputime_string (&pd->process_time));
+	strcpy (dt, cputime_string (&pd->done_time));
+#endif
+	Message ("%-10s      : %s   %s   %s", pd->name, it, pt, dt);
+      }
+  Message ("");
+  Message ("Init time       : %s", ElapsedTime (&StartTime, &InitTime));
+  Message ("Process time    : %s", ElapsedTime (&InitTime, &ProcTime));
+  Message ("Done time       : %s", ElapsedTime (&ProcTime, &DoneTime));
+  Message ("Total time      : %s", ElapsedTime (&StartTime, &DoneTime));
+  Message ("Documents       : %u", num_docs);
+  Message ("Bytes received  : %" ULL_FS, bytes_received);
+  Message ("Bytes processed : %" ULL_FS, bytes_processed);
+  Message ("Process Rate    : %.1f kB per cpu second",
+   (double) bytes_processed / (ProcTime.CPUTime - InitTime.CPUTime) / 1024);
+  free (buffer);
+}
+
+
+
+int main (int argc, char **argv)
+{
+  int ch, in_fd;
+  char *filename = NULL;
+  FILE *Trace = NULL;
+
+  msg_prefix = argv[0];
+
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "hC:WGSD123f:d:b:T:I:t:m:N:c:n:s:a:")) != -1)
+    {
+      switch (ch)
+	{
+	case 'G':
+	  SkipSGML = 1;
+	  break;
+	case 'S':
+	  Passes |= SPECIAL;
+	  break;
+	case '1':
+	  InvfLevel = 1;
+	  break;
+	case '2':
+	  InvfLevel = 2;
+	  break;
+	case '3':
+	  InvfLevel = 3;
+	  break;
+	case 'f':
+	  filename = optarg;
+	  break;
+	case 'n':
+	  trace_name = optarg;
+	  break;
+	case 'D':
+	  Dump = 1;
+	  break;
+	case 'W':
+	  MakeWeights = 1;
+	  break;
+	case 'd':
+	  set_basepath (optarg);
+	  break;
+	case 'a':
+	  stemmer_num = stemmernumber (optarg);
+	  break;
+	case 's':
+	  stem_method = atoi (optarg) & STEMMER_MASK;
+	  break;
+	case 'b':
+	  buf_size = atoi (optarg) * 1024;
+	  break;
+	case 'C':
+	  comp_stat_point = atoi (optarg) * 1024;
+	  break;
+	case 'c':
+	  ChunkLimit = atoi (optarg);
+	  break;
+	case 'm':
+	  invf_buffer_size = (int) (atof (optarg) * 1024 * 1024);
+	  break;
+	case 'I':
+	case 'N': /* N kept for compatability */
+	  if (*optarg == '1')
+	    Passes |= IVF_PASS_1;
+	  else if (*optarg == '2')
+	    Passes |= IVF_PASS_2;
+	  else
+	    usage ("Invalid pass number");
+	  break;
+	case 'T':
+	  if (*optarg == '1')
+	    Passes |= TEXT_PASS_1;
+	  else if (*optarg == '2')
+	    Passes |= TEXT_PASS_2;
+	  else
+	    usage ("Invalid pass number");
+	  break;
+	case 't':
+	  trace = (unsigned long) (atof (optarg) * 1024 * 1024);
+	  break;
+	case 'h':
+	case '?':
+	  usage (NULL);
+	}
+    }
+
+  if (!filename || *filename == '\0')
+    FatalError (1, "A document collection name must be specified.");
+
+  if (buf_size < MIN_BUF)
+    FatalError (1, "The buffer size must exceed 1024 bytes.");
+
+  if ((Passes & (IVF_PASS_1 | IVF_PASS_2)) == (IVF_PASS_1 | IVF_PASS_2))
+    FatalError (1, "I1 and I2 cannot be done simultaneously.");
+
+  if ((Passes & (TEXT_PASS_1 | TEXT_PASS_2)) == (TEXT_PASS_1 | TEXT_PASS_2))
+    FatalError (1, "T1 and T2 cannot be done simultaneously.");
+
+  if (!Passes)
+    FatalError (1, "S, T1, T2, I1 or I2 must be specified.");
+
+  if (optind < argc)
+    {
+      if ((in_fd = open (argv[optind], O_RDONLY)) == -1)
+	FatalError (1, "Cannot open %s", argv[optind]);
+      files = &argv[optind + 1];
+      num_files = argc - (optind + 1);
+    }
+  else
+    in_fd = 0;			/* stdin */
+
+
+  if (trace)
+    {
+      if (!trace_name)
+	trace_name = make_name (filename, TRACE_SUFFIX, NULL);
+      if (!(Trace = fopen (trace_name, "a")))
+	Message ("Unable to open \"%s\". No tracing will be done.", trace_name);
+      else
+	setbuf (Trace, NULL);
+    }
+  else
+    Trace = NULL;
+
+  if (comp_stat_point)
+    {
+      char *name = make_name (filename, COMPRESSION_STATS_SUFFIX, NULL);
+      if (!(Comp_Stats = fopen (name, "wb")))  /* [RPAP - Feb 97: WIN32 Port] */
+	Message ("Unable to open \"%s\". No comp. stats. will be generated.",
+		 name);
+    }
+
+
+  if (Trace)
+    {
+      int i;
+      fprintf (Trace, "\n\n\t\t-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
+      for (i = 0; i < argc; i++)
+	fprintf (Trace, "%s ", argv[i]);
+      fprintf (Trace, "\n\n");
+    }
+
+  driver (in_fd, Trace, filename);
+
+  if (Trace)
+    fclose (Trace);
+
+  if (Comp_Stats)
+    fclose (Comp_Stats);
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.1	(revision 21083)
@@ -0,0 +1,89 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_perf_hash_build 1 \*(Dt CITRI
+.SH NAME
+mg_perf_hash_build \- generate an order-preserving hash function for the stemmed dictionary
+.SH SYNOPSIS
+.B mg_perf_hash_build
+[
+.B \-h
+]
+[
+.BI \-r " rndseed"
+]
+[
+.BI \-d  " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_perf_hash_build
+generates an order-preserving hashing function from the compressed
+stemmed dictionary and writes it out to disk.
+.BR mg_passes (1)
+will make use of the hash function when it builds the inverted file.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-r " rndseed"
+This specifies the random seed to be used in the generation of the
+hash function; it must be an integer.  If this is not specified, the
+current time will be used as the random seed.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf.dict
+Stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for a order-preserving perfect hash function.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_perf_hash_build.c	(revision 21083)
@@ -0,0 +1,183 @@
+/**************************************************************************
+ *
+ * mg_perf_hash_build.c -- Program to build a perfect hash function
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "timing.h"
+#include "local_strings.h"
+#include "perf_hash.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "locallib.h"
+#include "words.h"
+#include "mg.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:13  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:47  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:15  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:58  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:53  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+#define POOL_SIZE 1024*1024
+
+static void process_files (char *filename);
+
+int r = -1;
+
+int main (int argc, char **argv)
+{
+  ProgTime start;
+  char *file_name = "";
+  int ch;
+  msg_prefix = argv[0];
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "f:d:r:h")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'r':
+	r = atoi (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file]"
+		 "[-d data directory] [-r random seed] [-h]\n", argv[0]);
+	exit (1);
+      }
+
+  GetTime (&start);
+  process_files (file_name);
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  return 0;
+}
+
+
+
+
+
+static void 
+process_files (char *filename)
+{
+  FILE *dict, *hash;
+  unsigned long i;
+  u_char prev[MAXSTEMLEN + 1];
+  struct invf_dict_header idh;
+  perf_hash_data *phd;
+  u_char *pool;
+  int pool_left;
+  u_char **starts;
+
+
+  dict = open_file (filename, INVF_DICT_SUFFIX, "rb",
+		    MAGIC_STEM_BUILD, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread ((char *) &idh, sizeof (idh), 1, dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  hash = create_file (filename, INVF_DICT_HASH_SUFFIX, "wb",
+		      MAGIC_HASH, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  if (!(pool = Xmalloc (POOL_SIZE)))
+    FatalError (1, "Out of memory");
+  pool_left = POOL_SIZE;
+
+  if (!(starts = Xmalloc (sizeof (u_char *) * idh.dict_size)))
+    FatalError (1, "Out of memory");
+
+  for (i = 0; i < idh.dict_size; i++)
+    {
+      register unsigned long copy, suff, l;
+      unsigned long wcnt, fcnt;
+
+      /* build a new word on top of prev */
+      copy = getc (dict);
+      suff = getc (dict);
+      *prev = copy + suff;
+      fread (prev + copy + 1, sizeof (u_char), suff, dict);
+
+      /* read other data, but no need to store it */
+      fread (&fcnt, sizeof (fcnt), 1, dict);
+      fread (&wcnt, sizeof (wcnt), 1, dict);
+
+      l = *prev + 1;
+      if (pool_left < l)
+	{
+	  pool = Xmalloc (POOL_SIZE);
+	  pool_left = POOL_SIZE;
+	}
+      starts[i] = pool;
+      bcopy ((char *) prev, (char *) pool, l);
+      pool += l;
+      pool_left -= l;
+    }
+  if (!(phd = gen_hash_func (idh.dict_size, starts, r)))
+    FatalError (1, "Unable to generate hash function");
+  if (write_perf_hash_data (hash, phd) == -1)
+    FatalError (1, "Unable to write hash function");
+  fclose (dict);
+  fclose (hash);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.1	(revision 21083)
@@ -0,0 +1,95 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_stem_idx 1 \*(Dt CITRI
+.SH NAME
+mg_stem_idx \- builds a stem index file
+.SH SYNOPSIS
+.B mg_stem_idx
+[
+.B \-h
+]
+[
+.B \-F
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.B \-s 1|2|3
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_stem_idx
+generates a stem index file for a collection that is to be built with
+stem indexes.  This program should be called three times: once for each
+.B -s
+parameter.  It uses the stemmed dictionary to create the stem index which
+contains pointers into the stemmed dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " num"
+The dictionary is stored in blocks on disk; this option is used to set
+the block size.  The default is 4-KB blocks.
+.TP
+.B \-F
+This option causes the disk blocks to be aligned on the appropriate
+boundaries.  For example, if 4-KB blocks are used, they will be aligned
+in the file on 4-KB boundaries.
+.TP
+.B -s 1|2|3
+The stem method to apply for the stem index.
+.br
+1 = casefolded and non-stemmed
+.br
+2 = non-casefolded and stemmed
+.br
+3 = casefolded and stemmed
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.invf.dict.blocked
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked.1
+Stem index with stem index method 1.
+.TP
+.B *.invf.dict.blocked.2
+Stem index with stem index method 2.
+.TP
+.B *.invf.dict.blocked.3
+Stem index with stem index method 3.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_invf_dict (1),
+.BR mgstemidxlist (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_stem_idx.c	(revision 21083)
@@ -0,0 +1,892 @@
+/**************************************************************************
+ *
+ * mg_stem_idx.c -- Memory efficient stem index builder
+ * Copyright (C) 1997  Ross Peeters
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "filestats.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "invf.h"
+#include "mg.h"
+#include "locallib.h"
+#include "backend.h"     /* For struct stemmed_dict */
+#include "words.h"
+#include "stemmer.h"
+#include "hash.h"
+#include "local_strings.h"
+
+typedef struct PosEntry
+{
+  unsigned int num_cases;
+  unsigned int blk;
+  unsigned short blk_index;
+  unsigned short offset;
+}
+PosEntry;
+
+
+typedef struct PosList
+{
+  unsigned int list_size;
+  unsigned int num_entries;
+  PosEntry PE[1];
+}
+PosList;
+
+
+typedef struct idx_hash_rec
+{
+  u_char *word;
+  PosList *PL;
+}
+idx_hash_rec;
+
+
+#define POOL_SIZE 1024*1024
+#define HASH_POOL_SIZE 8192
+#define INITIAL_HASH_SIZE 7927
+
+
+static unsigned long MaxMemInUse = 0;
+static unsigned long MemInUse = 0;
+
+static idx_hash_rec **IdxHashTable;
+static unsigned long IdxHashSize;
+static unsigned long IdxHashUsed;
+static u_char *IdxPool;
+static int IdxPoolLeft;
+
+static idx_hash_rec *idx_hr_pool;
+static int idx_hr_PoolLeft;
+
+static idx_hash_rec **idx_first_occr;
+static int idx_max_first_occr;
+
+int block_size = 1024 * 4;
+
+int force = 0;
+
+static long lookback = 4;
+
+static void 
+ChangeMem (int Change)
+{
+  MemInUse += Change;
+  if (MemInUse > MaxMemInUse)
+    MaxMemInUse = MemInUse;
+}
+
+
+/* =========================================================================
+ * Function: MakePosList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+PosList *
+MakePosList (int n)
+{
+  PosList *pl;
+  int list_size = (n == 0 ? 1 : n);	/* always allocate at least one node */
+
+  pl = Xmalloc (sizeof (PosList) + (list_size - 1) * sizeof (PosEntry));
+  if (!pl)
+    FatalError (1, "Unable to allocate term list");
+  ChangeMem (sizeof (PosList) + (list_size - 1) * sizeof (PosEntry));
+
+  pl->num_entries = n;
+  pl->list_size = list_size;
+
+  return pl;
+}
+
+/* =========================================================================
+ * Function: ResizePosList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+#define GROWTH_FACTOR 2
+#define MIN_SIZE 2
+
+static void
+ResizePosList (PosList ** pos_list)
+{
+  PosList *pl = *pos_list;
+
+  ChangeMem (-(sizeof (PosList) + (pl->list_size - 1) * sizeof (PosEntry)));
+  if (pl->num_entries > pl->list_size)
+    {
+      if (pl->list_size)
+	pl->list_size *= GROWTH_FACTOR;
+      else
+	pl->list_size = MIN_SIZE;
+    }
+  pl = Xrealloc (pl, sizeof (PosList) + (pl->list_size - 1) * sizeof (PosEntry));
+
+  if (!pl)
+    FatalError (1, "Unable to resize pos list");
+  ChangeMem (sizeof (PosList) + (pl->list_size - 1) * sizeof (PosEntry));
+
+  *pos_list = pl;
+}
+
+
+/* =========================================================================
+ * Function: FreePosList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+void
+FreePosList (PosList ** the_pl)
+{
+  PosList *pl = *the_pl;
+
+  ChangeMem (-(sizeof(PosList) + sizeof (PosEntry) * (pl->list_size - 1)));
+  Xfree (pl);
+
+  *the_pl = NULL;
+}
+
+
+/* =========================================================================
+ * Function: ResetPosList
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+ResetPosList (PosList ** pl)
+{
+  if (*pl)
+    FreePosList (pl);
+  *pl = MakePosList (0);
+}
+
+/* =========================================================================
+ * Function: AddPosEntry
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+AddPosEntry (PosList ** pos_list, PosEntry * pe)
+{
+  PosList *pl = *pos_list;
+
+  pl->num_entries++;
+  ResizePosList (pos_list);
+  pl = *pos_list;
+
+  /* copy the structure contents */
+  bcopy ((char *) pe, (char *) &(pl->PE[pl->num_entries - 1]), sizeof (PosEntry));
+
+  return pl->num_entries - 1;
+}
+
+
+/* Modified from stem_search.c */
+stemmed_dict *
+ReadStemDictBlk (File * stem_file)
+{
+  unsigned long i;
+  stemmed_dict *sd;
+  u_char *buffer;
+
+  if (!(sd = Xmalloc (sizeof (stemmed_dict))))
+    FatalError (1, "Could not allocate memory for stemmed dict");
+
+
+  sd->stem_file = stem_file;
+  sd->MemForStemDict = 0;
+
+  Fread (&sd->sdh, sizeof (sd->sdh), 1, stem_file);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(sd->sdh.lookback);
+  NTOHUL(sd->sdh.block_size);
+  NTOHUL(sd->sdh.num_blocks);
+  NTOHUL(sd->sdh.blocks_start);
+  NTOHUL(sd->sdh.index_chars);
+  NTOHUL(sd->sdh.num_of_docs);
+  NTOHUL(sd->sdh.static_num_of_docs);
+  NTOHUL(sd->sdh.num_of_words);
+  NTOHUL(sd->sdh.stemmer_num);
+  NTOHUL(sd->sdh.stem_method);
+  NTOHUL(sd->sdh.indexed);
+
+  if (!(buffer = Xmalloc (sd->sdh.index_chars)))
+    {
+      Xfree (sd);
+      FatalError (1, "Could not allocate memory for stemmed dict");
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.index_chars;
+
+  if (!(sd->index = Xmalloc (sd->sdh.num_blocks * sizeof (*sd->index))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      FatalError (1, "Could not allocate memory for stemmed dict");
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.num_blocks * sizeof (*sd->index);
+
+  if (!(sd->pos = Xmalloc (sd->sdh.num_blocks * sizeof (*sd->pos))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      Xfree (sd->index);
+      FatalError (1, "Could not allocate memory for stemmed dict");
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.num_blocks * sizeof (*sd->pos);
+
+  if (!(sd->buffer = Xmalloc (sd->sdh.block_size * sizeof (*sd->buffer))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      Xfree (sd->index);
+      Xfree (sd->buffer);
+      FatalError (1, "Could not allocate memory for stemmed dict");
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.block_size * sizeof (*sd->buffer);
+
+  sd->active = -1;
+
+  for (i = 0; i < sd->sdh.num_blocks; i++)
+    {
+      register u_char len;
+      sd->index[i] = buffer;
+      len = Getc (stem_file);
+      *buffer++ = len;
+      Fread (buffer, sizeof (u_char), len, stem_file);
+      buffer += len;
+      Fread (&sd->pos[i], sizeof (*sd->pos), 1, stem_file);
+      NTOHUL(sd->pos[i]);  /* [RPAP - Jan 97: Endian Ordering] */
+    }
+
+  return sd;
+}
+
+
+void
+mg_init_process ()
+{
+  /* Allocate memory for idx hash table */
+
+  if (!(IdxPool = Xmalloc (POOL_SIZE)))
+    FatalError (1, "Unable to allocate memory for idx pool");
+  IdxPoolLeft = POOL_SIZE;
+  ChangeMem (POOL_SIZE);
+
+  if (!(idx_hr_pool = Xmalloc (HASH_POOL_SIZE * sizeof (idx_hash_rec))))
+    FatalError (1, "Unable to allocate memory for idx pool");
+  idx_hr_PoolLeft = HASH_POOL_SIZE;
+  ChangeMem (HASH_POOL_SIZE * sizeof (idx_hash_rec));
+
+  IdxHashSize = INITIAL_HASH_SIZE;
+  IdxHashUsed = 0;
+  if (!(IdxHashTable = Xmalloc (sizeof (idx_hash_rec *) * IdxHashSize)))
+    FatalError (1, "Unable to allocate memory for idx table");
+  ChangeMem (sizeof (idx_hash_rec *) * IdxHashSize);
+  bzero ((char *) IdxHashTable, sizeof (idx_hash_rec *) * IdxHashSize);
+  idx_max_first_occr = 8192;
+  if (!(idx_first_occr = Xmalloc (sizeof (idx_hash_rec *) * idx_max_first_occr)))
+    FatalError (1, "Unable to allocate memory for idx_first_occur");
+  ChangeMem (sizeof (idx_hash_rec *) * idx_max_first_occr);
+}
+
+
+void
+PackIdxHashTable (void)
+{
+  int s, d;
+  for (s = d = 0; s < IdxHashSize; s++)
+    if (IdxHashTable[s])
+      IdxHashTable[d++] = IdxHashTable[s];
+  ChangeMem (-sizeof (idx_hash_rec *) * IdxHashSize);
+  ChangeMem (sizeof (idx_hash_rec *) * IdxHashUsed);
+  if (!(IdxHashTable = Xrealloc (IdxHashTable, sizeof (idx_hash_rec *) * IdxHashUsed)))
+    FatalError (1, "Out of memory");
+  IdxHashSize = IdxHashUsed;
+}
+
+
+void
+process_stem_dict (stemmed_dict * sd, int stem_method)
+{
+  int block;
+  short blk_index = -1;
+  int wordnum = -1;
+  PosEntry *prevPE = NULL;
+  idx_hash_rec *prevIdx = NULL;
+  u_char word[MAXSTEMLEN + 1];
+  u_char prev[MAXSTEMLEN + 1];
+
+  /* For each block in stem dict... */
+  for (block = 0; block < sd->sdh.num_blocks; block++)
+    {
+      register unsigned int res;
+      int num_indexes;
+      unsigned long *first_word, *last_invf_len;
+      unsigned short *num_words;
+      u_char *base;
+      unsigned short *index;
+
+      /* Read block into buffer */
+      Fseek (sd->stem_file, sd->pos[block] + sd->sdh.blocks_start, 0);
+      Fread (sd->buffer, sd->sdh.block_size, sizeof (u_char), sd->stem_file);
+      sd->active = sd->pos[block];
+
+      /* Move through block header */
+      first_word = (unsigned long *) (sd->buffer);
+      NTOHUL(*first_word);  /* [RPAP - Jan 97: Endian Ordering] */
+      last_invf_len = (unsigned long *) (first_word + 1);
+      NTOHUL(*last_invf_len);  /* [RPAP - Jan 97: Endian Ordering] */
+      num_words = (unsigned short *) (last_invf_len + 1);
+      NTOHUS(*num_words);  /* [RPAP - Jan 97: Endian Ordering] */
+      index = num_words + 1;
+      num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+
+      {
+	/* [RPAP - Jan 97: Endian Ordering] */
+	int i;
+	for (i = 0; i < num_indexes; i++)
+	  NTOHUS(index[i]);
+      }
+
+      base = (u_char *) (index + num_indexes);
+      blk_index = -1;
+
+      /* For each word in block... */
+      for (res = 0; res < *num_words; res++)
+	{
+	  unsigned copy, suff;
+	  register idx_hash_rec *idx_ent = 0;
+
+	  /* Update blk_index */
+	  if (!(res % sd->sdh.lookback))
+	    blk_index++;
+
+	  copy = *base++;
+	  suff = *base++;
+	  bcopy ((char *) base, (char *) (prev + copy + 1), suff);
+	  base += suff;
+	  *prev = copy + suff;
+
+	  /* Skip irrelevant word info */
+	  base += sizeof (u_long);
+	  base += sizeof (u_long);
+	  base += sizeof (u_long);
+
+	  /* Stem word */
+	  bcopy ((char *) prev, (char *) word, *prev + 1);
+	  stemmer (stem_method, sd->sdh.stemmer_num, word);
+
+	  /* Check if word follows straight on from previous word */
+	  if (prevIdx && !compare (word, prevIdx->word))
+	    prevPE->num_cases++;
+
+	  else
+	    {
+	      /* Search the idx hash table for word */
+	      register unsigned long hashval, step;
+	      register int hsize = IdxHashSize;
+	      HASH (hashval, step, word, hsize);
+	      for (;;)
+		{
+		  register u_char *s1;
+		  register u_char *s2;
+		  register int len;
+		  idx_ent = IdxHashTable[hashval];
+		  if (!idx_ent)
+		    {
+		      /* Create a next entry in the hash table */
+		      int len = *word + 1;
+		      if (!idx_hr_PoolLeft)
+			{
+			  if (!(idx_hr_pool = Xmalloc (HASH_POOL_SIZE *
+						       sizeof (idx_hash_rec))))
+			    FatalError (1, "Unable to allocate memory for pool");
+			  idx_hr_PoolLeft = HASH_POOL_SIZE;
+			  ChangeMem (HASH_POOL_SIZE * sizeof (idx_hash_rec));
+			}
+		      idx_ent = idx_hr_pool++;
+		      idx_hr_PoolLeft--;
+		      if (len > IdxPoolLeft)
+			{
+			  if (!(IdxPool = Xmalloc (POOL_SIZE)))
+			    FatalError (1, "Unable to allocate memory for pool");
+			  IdxPoolLeft = POOL_SIZE;
+			  ChangeMem (POOL_SIZE);
+			}
+		      wordnum++;
+
+		      idx_ent->word = IdxPool;
+		      idx_ent->PL = MakePosList (0);
+		      {
+			PosEntry PE;
+			PE.num_cases = 1;
+			PE.blk = block;
+			PE.blk_index = (unsigned short) blk_index;
+			PE.offset = res % sd->sdh.lookback;
+			AddPosEntry (&(idx_ent->PL), &PE);
+		      }
+		      prevIdx = idx_ent;
+		      prevPE = &(idx_ent->PL->PE[idx_ent->PL->num_entries - 1]);
+
+		      bcopy ((char *) word, (char *) IdxPool, len);
+		      IdxPool += len;
+		      IdxPoolLeft -= len;
+		      if (IdxHashUsed == idx_max_first_occr - 1)
+			{
+			  ChangeMem (-sizeof (idx_hash_rec *) * idx_max_first_occr);
+			  idx_max_first_occr *= 2;
+			  if (!(idx_first_occr = Xrealloc (idx_first_occr, sizeof (idx_hash_rec *) *
+							   idx_max_first_occr)))
+			    FatalError (1, "Unable to allocate memory for idx_first_occr");
+			  ChangeMem (sizeof (idx_hash_rec *) * idx_max_first_occr);
+			}
+		      idx_first_occr[IdxHashUsed] = idx_ent;
+		      IdxHashUsed++;
+		      IdxHashTable[hashval] = idx_ent;
+		      break;
+		    }
+		  
+		  /* Compare the words */
+		  s1 = word;
+		  s2 = idx_ent->word;
+		  len = *s1 + 1;
+		  for (; len; len--)
+		    if (*s1++ != *s2++)
+		      break;
+		  
+		  if (len)
+		    {
+		      /* Entry is not the right one - move to next hash index */
+		      hashval = (hashval + step);
+		      if (hashval >= hsize)
+			hashval -= hsize;
+		    }
+		  else
+		    {
+		      /* Entry is correct - added PosEntry to word */
+		      PosEntry PE;
+		      PE.num_cases = 1;
+		      PE.blk = block;
+		      PE.blk_index = (unsigned short) blk_index;
+		      PE.offset = res % sd->sdh.lookback;
+		      AddPosEntry (&(idx_ent->PL), &PE);
+		      prevIdx = idx_ent;
+		      prevPE = &(idx_ent->PL->PE[idx_ent->PL->num_entries - 1]);
+		      break;
+		    }
+		}      
+	    }
+
+	  if (IdxHashUsed >= IdxHashSize >> 1)
+	    {
+	      idx_hash_rec **ht;
+	      unsigned long size;
+	      unsigned long i;
+	      size = prime (IdxHashSize * 2);
+	      if (!(ht = Xmalloc (sizeof (idx_hash_rec *) * size)))
+		FatalError (1, "Unable to allocate memory for idx table");
+	      bzero ((char *) ht, sizeof (idx_hash_rec *) * size);
+	      ChangeMem (sizeof (idx_hash_rec *) * size);
+
+	      for (i = 0; i < IdxHashSize; i++)
+		if (IdxHashTable[i])
+		  {
+		    register u_char *wptr;
+		    idx_hash_rec *ent;
+		    register unsigned long hashval, step;
+		    
+		    wptr = IdxHashTable[i]->word;
+		    HASH (hashval, step, wptr, size);
+		    ent = ht[hashval];
+		    while (ent)
+		      {
+			hashval += step;
+			if (hashval >= size)
+			  hashval -= size;
+			ent = ht[hashval];
+		      }
+		    ht[hashval] = IdxHashTable[i];
+		  }
+	      Xfree (IdxHashTable);
+	      ChangeMem (-sizeof (idx_hash_rec *) * IdxHashSize);
+	      IdxHashTable = ht;
+	      IdxHashSize = size;
+	    }
+	  
+	} /* end for each word */
+
+    } /* end for each block */
+
+}
+ 
+static int 
+idx_comp (const void *A, const void *B)
+{
+  u_char *s1 = (*((idx_hash_rec **) A))->word;
+  u_char *s2 = (*((idx_hash_rec **) B))->word;
+  return (casecompare (s1, s2));
+}
+
+
+void
+save_idx (char * filename, int stem_method)
+{
+  char *FName;
+  unsigned long i, j, pos, First_word, num;
+  struct stem_idx_header sih;
+  u_char *buffer, *last_word = NULL;
+  unsigned short *pointers;
+  int buf_in_use;
+  unsigned short ptrs_in_use, word_num;
+  FILE *idbi = NULL, *tmp = NULL;
+
+  FName = make_name (filename, ".tmp", NULL);
+  if (!(tmp = fopen (FName, "w+b")))
+    FatalError (1, "Unable to open \"%s\".\n", FName);
+
+  /* Delete the file now */
+  unlink (FName);
+
+  /* Create appropriate stem index file */
+  switch (stem_method)
+    {
+    case (1):
+      {
+	idbi = create_file (filename, INVF_DICT_BLOCKED_1_SUFFIX, "wb", MAGIC_STEM_1,
+			    MG_ABORT);
+	break;
+      }
+
+    case (2):
+      {
+	idbi = create_file (filename, INVF_DICT_BLOCKED_2_SUFFIX, "wb", MAGIC_STEM_2,
+			    MG_ABORT);
+	break;
+      }
+    case (3):
+      {
+	idbi = create_file (filename, INVF_DICT_BLOCKED_3_SUFFIX, "wb", MAGIC_STEM_3,
+			    MG_ABORT);
+	break;
+      }
+    }
+
+  if (!idbi)
+    FatalError (1, "Could NOT create .invf.blocked.%d file", stem_method);
+
+  PackIdxHashTable();
+  qsort (IdxHashTable, IdxHashUsed, sizeof (idx_hash_rec *), idx_comp);
+
+  sih.lookback = lookback;
+  sih.block_size = block_size;
+  sih.num_blocks = 0;
+  sih.blocks_start = 0;
+  sih.index_chars = 0;
+  sih.num_of_words = IdxHashUsed;
+
+  fwrite ((char *) &sih, sizeof (sih), 1, idbi);
+
+  if (!(buffer = Xmalloc (block_size + 512)))
+    FatalError (1, "Unable to allocate memory for \"buffer\"\n");
+  if (!(pointers = Xmalloc (block_size + 512)))
+    FatalError (1, "Unable to allocate memory for \"buffer\"\n");
+
+  buf_in_use = 0;
+  pos = 0;
+  word_num = 0;
+  ptrs_in_use = 0;
+  First_word = 0;
+
+  /* For each word in the hashtable... */
+  for (i = 0; i < IdxHashUsed; i++)
+    {
+      register unsigned long extra, copy, suff;
+      register struct idx_hash_rec *ent = IdxHashTable[i];
+
+      /* build a new word on top of prev */
+      if (last_word != NULL)
+	copy = prefixlen (last_word, ent->word);
+      else
+	copy = 0;
+      suff = *(ent->word) - copy;
+      last_word = ent->word;
+
+      if (word_num % sih.lookback == 0)
+	/* Will need copy chars to add + a pointer in index */
+	extra = copy + sizeof (*pointers);
+      else
+	extra = 0;
+      if ((ptrs_in_use + 1) * sizeof (*pointers) + sizeof (ptrs_in_use) + extra +
+	  buf_in_use + sizeof (First_word) + suff + 1 + sizeof (ent->PL->num_entries) + 
+	  ent->PL->num_entries * sizeof (PosEntry) > block_size)
+	{
+	  /* Dump buffer to tmp file */
+	  int chunk;
+	  HTONUL(First_word);  /* [RPAP - Jan 97: Endian Ordering] */
+	  HTONUS(word_num);  /* [RPAP - Jan 97: Endian Ordering] */
+	  fwrite (&First_word, sizeof (First_word), 1, tmp);
+	  fwrite (&word_num, sizeof (word_num), 1, tmp);
+	  fwrite (pointers, sizeof (*pointers), ptrs_in_use, tmp);
+	  fwrite (buffer, sizeof (u_char), buf_in_use, tmp);
+	  bzero ((char *) buffer, block_size);
+	  chunk = buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	    sizeof (ptrs_in_use) + sizeof (First_word);
+	  if (force && chunk < block_size)
+	    {
+	      fwrite (buffer, sizeof (u_char), block_size - chunk, tmp);
+	      chunk = block_size;
+	    }
+
+	  pos += chunk;
+
+	  buf_in_use = 0;
+	  word_num = 0;
+	  ptrs_in_use = 0;
+	  sih.num_blocks++;
+
+	  /* Check that entry will fit into new block */
+	  if (sizeof (*pointers) + sizeof (ptrs_in_use) + extra + sizeof (First_word) +
+	      suff + 1 + sizeof (ent->PL->num_entries) + 
+	      ent->PL->num_entries * sizeof (PosEntry) > block_size)
+	    FatalError (1, "Block size to small");
+
+	}
+
+      if (word_num % sih.lookback == 0)
+	{
+	  HTONUS2(buf_in_use, pointers[ptrs_in_use++]);  /* [RPAP - Jan 97: Endian Ordering] */
+	  suff += copy;
+	  copy = 0;
+	}
+
+      /* Output Word information */
+      buffer[buf_in_use++] = copy;
+      buffer[buf_in_use++] = suff;
+      bcopy ((char *) (ent->word + copy + 1), (char *) (buffer + buf_in_use), suff);
+      buf_in_use += suff;
+      HTONUI(ent->PL->num_entries);  /* [RPAP - Jan 97: Endian Ordering] */
+      bcopy ((char *) &(ent->PL->num_entries), (char *) (buffer + buf_in_use), sizeof (ent->PL->num_entries));
+      NTOHUI(ent->PL->num_entries);  /* [RPAP - Jan 97: Endian Ordering] */
+      buf_in_use += sizeof (ent->PL->num_entries);
+
+      for (j = 0; j < ent->PL->num_entries; j++)
+	{
+	  register PosEntry *pe = &(ent->PL->PE[j]);
+	  HTONUI(pe->num_cases);  /* [RPAP - Jan 97: Endian Ordering] */
+	  bcopy ((char *) &(pe->num_cases), (char *) (buffer + buf_in_use), sizeof (pe->num_cases));
+	  buf_in_use += sizeof (pe->num_cases);
+	  HTONUI(pe->blk);  /* [RPAP - Jan 97: Endian Ordering] */
+	  bcopy ((char *) &(pe->blk), (char *) (buffer + buf_in_use), sizeof (pe->blk));
+	  buf_in_use += sizeof (pe->blk);
+	  HTONUS(pe->blk_index);  /* [RPAP - Jan 97: Endian Ordering] */
+	  bcopy ((char *) &(pe->blk_index), (char *) (buffer + buf_in_use), sizeof (pe->blk_index));
+	  buf_in_use += sizeof (pe->blk_index);
+	  HTONUS(pe->offset);  /* [RPAP - Jan 97: Endian Ordering] */
+	  bcopy ((char *) &(pe->offset), (char *) (buffer + buf_in_use), sizeof (pe->offset));
+	  buf_in_use += sizeof (pe->offset);
+	}
+
+      if (buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	  sizeof (ptrs_in_use) > block_size)
+	FatalError (1, "Fatal Internal Error # 64209258\n");
+
+      if (word_num == 0)
+	{
+	  /* Write word to main index */
+	  fwrite (ent->word, sizeof (u_char), *(ent->word) + 1, idbi);
+	  HTONUL(pos);  /* [RPAP - Jan 97: Endian Ordering] */
+	  fwrite (&pos, sizeof (pos), 1, idbi);
+	  NTOHUL(pos);  /* [RPAP - Jan 97: Endian Ordering] */
+	  sih.index_chars += *(ent->word) + 1;
+	  First_word = i;
+	}
+      word_num++;
+    } /* end for each word */
+
+  if (buf_in_use)
+    {
+      /* Write last buffer to tmp file */
+      int chunk;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(First_word);
+      HTONUS(word_num);
+
+      fwrite (&First_word, sizeof (First_word), 1, tmp);
+      fwrite (&word_num, sizeof (word_num), 1, tmp);
+      fwrite (pointers, sizeof (*pointers), ptrs_in_use, tmp);
+      fwrite (buffer, sizeof (u_char), buf_in_use, tmp);
+      bzero ((char *) buffer, block_size);
+      chunk = buf_in_use + ptrs_in_use * sizeof (*pointers) +
+	sizeof (ptrs_in_use) + sizeof (First_word);
+      if (force && chunk < block_size)
+	{
+	  fwrite (buffer, sizeof (u_char), block_size - chunk, tmp);
+	  chunk = block_size;
+	}
+
+      sih.num_blocks++;
+    }
+
+  rewind (tmp);
+  sih.blocks_start = sih.index_chars + sizeof (u_long) + sizeof (sih) +
+    sih.num_blocks * sizeof (pos);
+  if (force)
+    {
+      int amount;
+      amount = sih.blocks_start % block_size;
+      if (amount != 0)
+	{
+	  bzero ((char *) buffer, block_size);
+	  fwrite (buffer, sizeof (u_char), block_size - amount, idbi);
+	  sih.blocks_start += block_size - amount;
+	}
+    }
+
+  while ((num = fread (buffer, sizeof (u_char), block_size, tmp)) != 0)
+    fwrite (buffer, sizeof (u_char), num, idbi);
+  fclose (tmp);
+
+  /* skip over the magic number */
+  fseek (idbi, sizeof (u_long), 0);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(sih.lookback);
+  HTONUL(sih.block_size);
+  HTONUL(sih.num_blocks);
+  HTONUL(sih.blocks_start);
+  HTONUL(sih.index_chars);
+  HTONUL(sih.num_of_words);
+
+  fwrite (&sih, sizeof (sih), 1, idbi);
+  fclose (idbi);
+
+#ifndef SILENT
+  Message ("Stem %d:\n", stem_method);
+  Message ("     Block size   : %10d\n", block_size);
+  Message ("     Num_blocks   : %10d\n", NTOHUL(sih.num_blocks));  /* [RPAP - Jan 97: Endian Ordering] */
+  Message ("     Max mem used : %10.1f Mb\n", (double) MaxMemInUse / 1024.0 / 1024.0);
+  Message ("     Num_of_words : %10d\n", NTOHUL(sih.num_of_words));  /* [RPAP - Jan 97: Endian Ordering] */
+#endif
+}
+
+
+void
+UpdateStemDict (char * filename, int stem_method)
+{
+  FILE *idb;
+  struct stem_dict_header sdh;
+
+  if (!(idb = open_file (filename, INVF_DICT_BLOCKED_SUFFIX, "r+b",
+			 MAGIC_STEM, MG_CONTINUE)))
+    FatalError (1, "Could not update stemmed dict");
+
+  fread ((char *) &sdh, sizeof (sdh), 1, idb);
+  NTOHUL(sdh.indexed);  /* [RPAP - Jan 97: Endian Ordering] */
+  sdh.indexed |= 1 << (stem_method - 1);
+  HTONUL(sdh.indexed);
+  fseek (idb, sizeof (u_long), 0);
+  fwrite ((char *) &sdh, sizeof (sdh), 1, idb);
+  fclose (idb);
+}
+
+
+
+/* Main */
+int main (int argc, char **argv)
+{
+  File *idb;    /* File to .invf.dict.blocked */
+  char *filename = "";
+  stemmed_dict *sd;   /* Stemmed dictionary */
+  int ch;
+  char path[512];
+  int stem_method = 0;
+
+  msg_prefix = argv[0];
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "f:d:b:hFs:")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	filename = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'b':
+	block_size = atoi (optarg);
+	break;
+      case 'F':
+	force = 1;
+	break;
+      case 's':
+	stem_method = atoi (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-d directory] "
+		 "[-b num] [-F] [-h] -s 1|2|3 -f name\n", argv[0]);
+	exit (1);
+      }
+
+  if (stem_method < 1 || stem_method > 3)
+    FatalError (1, "Stem method must be 1, 2 or 3");
+
+  /* Open required stem dict file */
+  sprintf (path, FILE_NAME_FORMAT, get_basepath (), filename, INVF_DICT_BLOCKED_SUFFIX);
+  if (!(idb = Fopen (path, "rb", MAGIC_STEM)))
+    FatalError (1, "Unable to open \"%s\"", path);
+
+  /* Read in idb header and index to blocks */
+  if (!(sd = ReadStemDictBlk (idb)))
+    FatalError (1, "Could not read stemmed dictionary");
+
+  /* Process stemmed dictionary */
+  mg_init_process ();
+  process_stem_dict (sd, stem_method);
+  save_idx (filename, stem_method);
+ 
+  /* Close stemmed dict */
+  Fclose (idb);
+
+  /* Update stemmed dict */
+  UpdateStemDict (filename, stem_method);
+
+  return 0;
+}
+
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_text_estimate 1 \*(Dt CITRI
+.SH NAME
+mg_text_estimate \- Estimate the size of the compressed text based on the text statistics and a compression dictionary.
+.SH SYNOPSIS
+.B mg_text_estimate
+[
+.B \-h
+]
+[
+.BR \-H " |"
+.BR \-B " |"
+.BR \-D " |"
+.BR \-Y " |"
+.B \-M
+]
+.if n .ti +9n
+.I stats-dict
+.I compression-dict
+.SH DESCRIPTION
+This program estimates the size of the compressed text that would be
+generated if text with certain statistics were compressed with a
+particular dictionary.  This program has no real use in the
+.BR mg (1)
+system, except for experimenting with the
+.BR mg_compression_dict (1)
+program.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-m\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-H
+This specifies that novel words will be coded character by character
+using Huffman codes.
+.TP
+.B \-B
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using binary codes.  The binary code represents their occurrence
+position in the auxiliary dictionary.
+.TP
+.B \-D
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using delta codes.  The delta code represents their occurrence position
+in the auxiliary dictionary.
+.TP
+.B \-Y
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This generally
+produces better compression than
+.B \-B
+or
+.BR \-D .
+.TP
+.B \-M
+This specifies that the size of an auxiliary dictionary will be
+estimated.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This method is
+adaptive within documents, and generally produces better compression
+than
+.BR \-B ,
+.B \-D
+or
+.BR \-Y .
+.SH FILES
+.TP 20
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_estimate.c	(revision 21083)
@@ -0,0 +1,581 @@
+/**************************************************************************
+ *
+ * mg_text_estimate.c -- Program to estimate the compressed text size
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_gen.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "timing.h"
+#include "mgheap.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "invf.h"
+#include "text.h"
+#include "words.h"
+#include "mg.h"
+#include "comp_dict.h"
+#include "hash.h"
+
+
+
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:14  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.4  1999/01/15 03:05:51  rjmcnab
+
+   Renamed lib/heap to be lib/mgheap (it was causing some problems with
+   some versions of the STL libraries which contained a heap.h)
+
+   Revision 1.3  1998/12/17 09:12:53  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:48  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:19  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:56:59  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:54  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+typedef struct stats_t
+  {
+    u_long freq, occur;
+    u_long len;
+  }
+stats_t;
+
+static u_long huff_count = 0;
+static u_long escape_count = 0;
+
+
+char mode = 'H';
+
+/* [RJM 07/97: 4G limit] */
+static double ReadInWordsStandard (char *name, double *num_bytes);
+static double ReadInWordsSpecial (char *name, double *num_bytes,
+				  double *num_extra_bytes,
+				  u_long *aux_compressed);
+
+
+
+
+int main (int argc, char **argv)
+{
+  char *stats_dict = NULL, *comp_dict = NULL;
+  ProgTime StartTime;
+  double num_bytes, num_extra_bytes = 0; /* [RJM 07/97: 4G limit] */
+  u_long aux_compressed;
+  int ch;
+  double bytes;
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "BMDYHh")) != -1)
+    switch (ch)
+      {
+      case 'B':
+	Message ("The compressed text size for this method cannot be\n"
+		 "estimated exactly, so an upper bound will be calculated.");
+	mode = ch;
+	break;
+      case 'M':
+	Message ("The compressed text size for this method cannot be\n"
+		 "estimated exactly, so an upper bound will be calculated.");
+	mode = 'Y';
+	break;
+      case 'D':
+      case 'Y':
+      case 'H':
+	mode = ch;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-h] [B|M|D|Y|H] stats_dict comp_dict\n",
+		 argv[0]);
+	exit (1);
+      }
+
+  if (optind < argc)
+    stats_dict = argv[optind++];
+  else
+    stats_dict = NULL;
+  if (optind < argc)
+    comp_dict = argv[optind++];
+  else
+    {
+      fprintf (stderr, "usage: %s [-h] [B|M|D|Y|H] stats_dict comp_dict\n",
+	       argv[0]);
+      exit (1);
+    }
+
+
+
+  GetTime (&StartTime);
+
+  if (LoadCompressionDictionary (comp_dict) == COMPERROR)
+    exit (1);
+
+  if (mode == 'H')
+    bytes = ReadInWordsStandard (stats_dict, &num_bytes);
+  else
+    bytes = ReadInWordsSpecial (stats_dict, &num_bytes, &num_extra_bytes,
+				&aux_compressed);
+
+
+  Message ("Compressed Text %.2f Mb ( %.0f bytes   %0.3f %%)",
+	   bytes / 1024.0 / 1024, bytes, bytes * 100 / num_bytes);
+  Message ("Words portion of the dictionary %.2f Mb ( %.0f bytes   %0.3f %%)",
+	   Words_disk / 1024.0 / 1024, Words_disk * 1.0,
+	   (Words_disk * 100.0) / num_bytes);
+  if (mode == 'H')
+    Message ("Huffman info for chars in dictionary %.2f Mb ( %.0f bytes   %0.3f %%)",
+	     Chars_disk / 1024.0 / 1024, Chars_disk * 1.0,
+	     (Chars_disk * 100.0) / num_bytes);
+  else
+    {
+      Message ("Aux dictionary (Uncompressed) %.2f Mb ( %.0f bytes   %0.3f %%)",
+	       num_extra_bytes / 1024.0 / 1024, num_extra_bytes * 1.0,
+	       (num_extra_bytes * 100.0) / num_bytes);
+      Message ("Aux dictionary (Compressed)   %.2f Mb ( %.0f bytes   %0.3f %%)",
+	       aux_compressed / 1024.0 / 1024, aux_compressed * 1.0,
+	       (aux_compressed * 100.0) / num_bytes);
+    }
+  Message ("Words and non-words in the text %u", huff_count + escape_count);
+  Message ("Words and non-words coded by escapes %u ( %0.3f %%)", escape_count,
+	   escape_count * 100.0 / huff_count);
+  Message ("%s", ElapsedTime (&StartTime, NULL));
+  return 0;
+}
+
+
+
+
+
+static double 
+ReadInWordsStandard (char *name, double *num_bytes)
+{
+  compression_stats_header csh;
+  FILE *f;
+  u_long which;
+  double bytes, bits = 0;
+
+  f = open_named_file (name, "rb", MAGIC_STATS_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread (&csh, sizeof (csh), 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  for (which = 0; which < 2; which++)
+    {
+      frags_stats_header fsh;
+      int j;
+      fread (&fsh, sizeof (fsh), 1, f);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fsh.num_frags);
+      NTOHUL(fsh.mem_for_frags);
+
+      for (j = 0; j < fsh.num_frags; j++)
+	{
+	  int len, freq, res, occur_num;
+	  u_char Word[16];
+	  fread (&freq, sizeof (freq), 1, f);
+	  fread (&occur_num, sizeof (occur_num), 1, f);
+	  len = fgetc (f);
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  NTOHSI(freq);
+	  NTOHSI(occur_num);
+
+	  Word[0] = len;
+	  fread (Word + 1, len, 1, f);
+
+	  /* Search the hash table for Word */
+	  if (ht[which])
+	    {
+	      register unsigned long hashval, step;
+	      register int tsize = ht[which]->size;
+	      register u_char **wptr;
+	      HASH (hashval, step, Word, tsize);
+	      for (;;)
+		{
+		  register u_char *s1;
+		  register u_char *s2;
+		  register int len;
+		  wptr = ht[which]->table[hashval];
+		  if (wptr == NULL)
+		    {
+		      res = COMPERROR;
+		      break;
+		    }
+
+		  /* Compare the words */
+		  s1 = Word;
+		  s2 = *wptr;
+		  len = *s1 + 1;
+		  for (; len; len--)
+		    if (*s1++ != *s2++)
+		      break;
+
+		  if (len)
+		    {
+		      hashval += step;
+		      if (hashval >= tsize)
+			hashval -= tsize;
+		    }
+		  else
+		    {
+		      res = ht[which]->table[hashval] - ht[which]->words;
+		      break;
+		    }
+		}
+	    }
+	  else
+	    res = COMPERROR;
+
+	  /* Check that the word was found in the dictionary */
+	  if (res == COMPERROR)
+	    {
+	      escape_count += freq;
+	      if (cdh.dict_type == MG_COMPLETE_DICTIONARY)
+		Message ("Unknown word \"%.*s\"\n", *Word, Word + 1);
+	      if (cdh.dict_type == MG_PARTIAL_DICTIONARY)
+		{
+		  unsigned i;
+		  if (ht[which])
+		    {
+		      res = ht[which]->hd->num_codes - 1;
+		      bits += ht[which]->hd->clens[res] * freq;
+		    }
+		  bits += lens_huff[which].clens[Word[0]] * freq;
+		  for (i = 0; i < Word[0]; i++)
+		    bits += char_huff[which].clens[Word[i + 1]] * freq;
+		}
+	      if (cdh.dict_type == MG_SEED_DICTIONARY)
+		{
+		  unsigned i;
+		  if (ht[which])
+		    {
+		      res = ht[which]->hd->num_codes - 1;
+		      bits += ht[which]->hd->clens[res] * freq;
+		    }
+		  bits += lens_huff[which].clens[Word[0]] * freq;
+		  for (i = 0; i < Word[0]; i++)
+		    bits += char_huff[which].clens[Word[i + 1]] * freq;
+		}
+	    }
+	  else
+	    {
+	      bits += ht[which]->hd->clens[res] * freq;
+	      huff_count += freq;
+	    }
+	}
+    }
+  fclose (f);
+
+
+  /*
+   * The 5.5 bits added on per document consist of
+   *   1 bit for the word/non-word flag at the start of the document.
+   *   1 bit on average for document termination.
+   *   3.5 bits on average for padding to a byte boundary.
+   */
+  bits += 5.5 * csh.num_docs;
+
+  bytes = bits / 8 + sizeof (compressed_text_header) + sizeof (u_long);
+
+  *num_bytes = csh.num_bytes;
+
+  return bytes;
+}
+
+
+static int 
+stats_comp (const void *a, const void *b)
+{
+  return ((stats_t *) a)->occur - ((stats_t *) b)->occur;
+}
+
+
+
+
+
+static double 
+ReadInWordsSpecial (char *name, double *num_bytes,
+		    double *num_extra_bytes,
+		    u_long *aux_compressed)
+{
+  compression_stats_header csh;
+  FILE *f;
+  u_long magic, which;
+  double bytes, bits = 0;
+  double size[2];
+
+  if (!(f = fopen (name, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open file \"%s\"\n", name);
+
+  if (fread (&magic, sizeof (magic), 1, f) != 1)
+    FatalError (1, "Unable to read magic number");
+
+  NTOHUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (magic != MAGIC_STATS_DICT)
+    FatalError (1, "Bad magic number");
+
+  fread (&csh, sizeof (csh), 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  for (which = 0; which < 2; which++)
+    {
+      stats_t *stats;
+      frags_stats_header fsh;
+      int j, num = 0;
+      long lens[16], chars[256];
+
+      bzero ((char *) lens, sizeof (lens));
+      bzero ((char *) chars, sizeof (chars));
+
+      fread (&fsh, sizeof (fsh), 1, f);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fsh.num_frags);
+      NTOHUL(fsh.mem_for_frags);
+
+      stats = Xmalloc (fsh.num_frags * sizeof (*stats));
+      if (!stats)
+	FatalError (1, "Unable to allocate memory for stats");
+      for (j = 0; j < fsh.num_frags; j++)
+	{
+	  int len, res;
+	  u_char Word[16];
+	  fread (&stats[num].freq, sizeof (stats[num].freq), 1, f);
+	  fread (&stats[num].occur, sizeof (stats[num].occur), 1, f);
+	  len = fgetc (f);
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  NTOHSI(stats[num].freq);
+	  NTOHSI(stats[num].occur);
+
+	  stats[num].len = len + 1;
+
+	  Word[0] = len;
+	  fread (Word + 1, len, 1, f);
+
+	  /* Search the hash table for Word */
+	  if (ht[which])
+	    {
+	      register unsigned long hashval, step;
+	      register int tsize = ht[which]->size;
+	      register u_char **wptr;
+	      HASH (hashval, step, Word, tsize);
+	      for (;;)
+		{
+		  register u_char *s1;
+		  register u_char *s2;
+		  register int len;
+		  wptr = ht[which]->table[hashval];
+		  if (wptr == NULL)
+		    {
+		      res = COMPERROR;
+		      break;
+		    }
+
+		  /* Compare the words */
+		  s1 = Word;
+		  s2 = *wptr;
+		  len = *s1 + 1;
+		  for (; len; len--)
+		    if (*s1++ != *s2++)
+		      break;
+
+		  if (len)
+		    {
+		      hashval += step;
+		      if (hashval >= tsize)
+			hashval -= tsize;
+		    }
+		  else
+		    {
+		      res = ht[which]->table[hashval] - ht[which]->words;
+		      break;
+		    }
+		}
+	    }
+	  else
+	    res = COMPERROR;
+
+	  assert (stats[num].freq > 0);
+
+	  /* Check that the word was found in the dictionary */
+	  if (res == COMPERROR)
+	    {
+	      if (cdh.dict_type == MG_COMPLETE_DICTIONARY)
+		Message ("Unknown word \"%.*s\"\n", *Word, Word + 1);
+	      if ((cdh.dict_type == MG_PARTIAL_DICTIONARY ||
+		   cdh.dict_type == MG_SEED_DICTIONARY) &&
+		  ht[which])
+		{
+		  int k;
+		  res = ht[which]->hd->num_codes - 1;
+		  bits += ht[which]->hd->clens[res] * stats[num].freq;
+		  lens[Word[0]]++;
+		  for (k = 0; k < (int) Word[0]; k++)
+		    chars[Word[k + 1]]++;
+		}
+	      num++;
+	    }
+	  else
+	    {
+	      bits += ht[which]->hd->clens[res] * stats[num].freq;
+	    }
+	}
+
+      {
+	int j, num_buckets = 0;
+	int start[10], end[10];
+	long flens[16], fchars[256];
+
+	for (j = 0; j < 256; j++)
+	  if (!chars[j] && PESINAWORD (j) == which)
+	    fchars[j] = 1;
+	  else
+	    fchars[j] = chars[j];
+	for (j = 0; j < 16; j++)
+	  if (!lens[j])
+	    flens[j] = 1;
+	  else
+	    flens[j] = lens[j];
+
+	size[which] = Calculate_Huffman_Size (16, flens, lens) +
+	  Calculate_Huffman_Size (256, fchars, chars);
+
+
+	qsort (stats, num, sizeof (*stats), stats_comp);
+
+
+	if (mode == 'Y')
+	  {
+	    int k;
+	    num_buckets = 1;
+	    start[0] = 0;
+	    end[0] = cdh.num_words[which] - 1;
+	    Message ("There are %d novel %swords", num, which ? "" : "non-");
+	    while (end[num_buckets - 1] < num)
+	      {
+		start[num_buckets] = end[num_buckets - 1] + 1;
+		end[num_buckets] = start[num_buckets] +
+		  (end[num_buckets - 1] - start[num_buckets - 1]) * 2;
+		num_buckets++;
+	      }
+	    for (k = 0; k < num_buckets; k++)
+	      Message ("Bucket %d   %d <= x <= %d\n", k + 1, start[k], end[k]);
+	  }
+
+	for (j = 0; j < num; j++)
+	  {
+	    (*num_extra_bytes) += stats[j].len;
+	    switch (mode)
+	      {
+	      case 'D':
+		bits += BIO_Delta_Length (j + 1) * stats[j].freq;
+		break;
+	      case 'B':
+		bits += BIO_Binary_Length (j + 1, num) * stats[j].freq;
+		break;
+	      case 'Y':
+		{
+		  int k = 0;
+		  while (j > end[k])
+		    k++;
+		  if (!(j - start[k] + 1 >= 1 &&
+			j - start[k] + 1 <= end[k] - start[k] + 1))
+		    {
+		      Message ("k = %d, j = %d", k, j);
+		      assert (j - start[k] + 1 >= 1 &&
+			      j - start[k] + 1 <= end[k] - start[k] + 1);
+		    }
+		  else
+		    {
+		      bits += (BIO_Gamma_Length (k + 1) +
+			       BIO_Binary_Length (j - start[k] + 1,
+						  end[k] - start[k] + 1)) *
+			stats[j].freq;
+		    }
+		}
+	      }
+	  }
+	if (mode == 'B' && num)
+	  bits += BIO_Delta_Length (num) * csh.num_docs;
+      }
+      Xfree (stats);
+    }
+  fclose (f);
+
+  *aux_compressed = (size[0] + size[1]) / 8;
+
+  /*
+   * The 5.5 bits added on per document consist of
+   *   1 bit for the word/non-word flag at the start of the document.
+   *   1 bit on average for document termination.
+   *   3.5 bits on average for padding to a byte boundary.
+   */
+  bits += 5.5 * csh.num_docs;
+
+  bytes = bits / 8 + sizeof (compressed_text_header) + sizeof (u_long);
+
+  *num_bytes = csh.num_bytes;
+
+  return bytes;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.1	(revision 21083)
@@ -0,0 +1,76 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_text_merge 1 \*(Dt CITRI
+.SH NAME
+mg_text_merge \- Append one compressed text file to another
+.SH SYNOPSIS
+.B mg_text_merge
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+This program takes two
+.BR mg (1)
+database inverted files and stemmed
+dictionaries, named "old" and "new" respectively, and creates
+a merged stemmed dictionary and inverted file.
+It is part of the
+.BR mgmerge (1)
+addition to the
+.BR mg (1)
+package.
+The two compressed text files are
+.IR "name" .old.text
+and
+.IR "name" .new.text.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.old.text
+The old compressed text.
+.TP
+.B *.new.text
+The new compressed text that will be appended
+.TP
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mgmerge (1),
+.BR mg_get_merge (1),
+.BR mg_invf_merge (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mgquery (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_text_merge.c	(revision 21083)
@@ -0,0 +1,249 @@
+/**************************************************************************
+ *
+ * mg_text_merge.c --- merge  *.text, *.text.idx files
+ *                     part of the mgmerge utility
+ * Copyright (C) 1995 Shane Hudson (shane@cosc.canterbury.ac.nz)
+ *
+ * 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.
+ *
+ * $Id$
+ * Last edited:  November 11 1994
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "messages.h"
+#include "timing.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "locallib.h"
+#include "mg.h"
+#include "mg_merge.h"
+#include "mg_files.h"
+#include "text.h"
+
+
+/**** GLOBALS ****/
+FILE *text[3], *idx[3];
+
+typedef char FileName[256];
+FileName old_name, new_name, merge_name;
+
+long magicsize;			/* == where the header in a file begins */
+
+compressed_text_header cth[3];
+
+/*=======================================================================
+ * init_merge_text(): open files, set up global variables, etc
+ *=======================================================================*/
+int 
+init_merge_text ()
+{
+
+  /* open .text files */
+  text[OLD] = open_file (old_name, TEXT_SUFFIX, "r+b",
+			 MAGIC_TEXT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  magicsize = ftell (text[OLD]);
+  fread (&cth[OLD], sizeof (cth[OLD]), 1, text[OLD]);
+
+  text[NEW] = open_file (new_name, TEXT_SUFFIX, "rb+",
+			 MAGIC_TEXT, MG_ABORT);
+  fread (&cth[NEW], sizeof (cth[NEW]), 1, text[NEW]);
+
+  /* open .text.idx files */
+  idx[OLD] = open_file (old_name, TEXT_IDX_SUFFIX, "rb+",
+			MAGIC_TEXI, MG_ABORT);
+  fread (&cth[OLD], sizeof (cth[OLD]), 1, idx[OLD]);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cth[OLD].num_of_docs);
+  NTOHD(cth[OLD].num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(cth[OLD].num_of_words);
+  NTOHUL(cth[OLD].length_of_longest_doc);
+  NTOHD(cth[OLD].ratio);
+
+  idx[NEW] = open_file (new_name, TEXT_IDX_SUFFIX, "rb+",
+			MAGIC_TEXI, MG_ABORT);
+  fread (&cth[NEW], sizeof (cth[NEW]), 1, idx[NEW]);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cth[NEW].num_of_docs);
+  NTOHD(cth[NEW].num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(cth[NEW].num_of_words);
+  NTOHUL(cth[NEW].length_of_longest_doc);
+  NTOHD(cth[NEW].ratio);
+
+  idx[MERGE] = create_file (merge_name, TEXT_IDX_SUFFIX, "wb",
+			    MAGIC_TEXI, MG_ABORT);
+  return OK;
+}
+
+
+/*=======================================================================
+ * process_merge_text(): merge the files
+ *=======================================================================*/
+int 
+process_merge_text (void)
+{
+  int i;
+  u_long data, offset;
+  byte c;
+
+  /* update and write merged header to .text and .text.idx files */
+  /* they have the exact same header */
+  cth[MERGE].num_of_docs = cth[OLD].num_of_docs
+    + cth[NEW].num_of_docs;
+  cth[MERGE].num_of_bytes = cth[OLD].num_of_bytes
+    + cth[NEW].num_of_bytes;
+  cth[MERGE].num_of_words = cth[OLD].num_of_words;
+  cth[MERGE].length_of_longest_doc =
+    (cth[OLD].length_of_longest_doc > cth[NEW].length_of_longest_doc
+     ? cth[OLD].length_of_longest_doc
+     : cth[NEW].length_of_longest_doc);
+  cth[MERGE].ratio = ((cth[OLD].num_of_bytes * cth[OLD].ratio) +
+		      (cth[NEW].num_of_bytes * cth[NEW].ratio))
+    / cth[MERGE].num_of_bytes;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(cth[MERGE].num_of_docs);
+  HTOND(cth[MERGE].num_of_bytes); /* [RJM 07/97: 4G limit] */
+  HTONUL(cth[MERGE].num_of_words);
+  HTONUL(cth[MERGE].length_of_longest_doc);
+  HTOND(cth[MERGE].ratio);
+
+  fwrite (&cth[MERGE], sizeof (cth[MERGE]), 1, idx[MERGE]);
+  fseek (text[OLD], magicsize, 0);
+  fwrite (&cth[MERGE], sizeof (cth[MERGE]), 1, text[OLD]);
+
+  /*
+   *  Update *.text.idx:  need to know where each new doc starts
+   *  in the appended .text file
+   */
+  for (i = 0; i < cth[OLD].num_of_docs; i++)
+    {
+      fread (&data, sizeof (u_long), 1, idx[OLD]);
+      fwrite (&data, sizeof (u_long), 1, idx[MERGE]);
+    }
+
+  /* offset is the amount to add to each entry from idx[NEW] */
+  fread (&offset, sizeof (u_long), 1, idx[OLD]);
+  NTOHUL(offset);  /* [RPAP - Jan 97: Endian Ordering] */
+  offset -= (4 + sizeof (cth[OLD]));	/* 4 for the magic number */
+
+  for (i = 0; i < cth[NEW].num_of_docs; i++)
+    {
+      fread (&data, sizeof (u_long), 1, idx[NEW]);
+      NTOHUL(data);  /* [RPAP - Jan 97: Endian Ordering] */
+      data += offset;
+      HTONUL(data);  /* [RPAP - Jan 97: Endian Ordering] */
+      fwrite (&data, sizeof (u_long), 1, idx[MERGE]);
+    }
+  /* write last u_long in idx[MERGE] (= length of file) */
+  fread (&data, sizeof (u_long), 1, idx[NEW]);
+  NTOHUL(data);  /* [RPAP - Jan 97: Endian Ordering] */
+  data += offset;
+  HTONUL(data);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&data, sizeof (u_long), 1, idx[MERGE]);
+
+/******* update .text *******/
+  /* simply cat's the files together, except for the headers 
+   * and magic numbers, of course
+   */
+  fseek (text[OLD], 0L, 2);
+  while (!feof (text[NEW]))
+    {
+      fread (&c, sizeof (c), 1, text[NEW]);
+      if (!feof (text[NEW]))
+	fwrite (&c, sizeof (c), 1, text[OLD]);
+    }
+
+  return OK;
+}
+
+
+
+/*=======================================================================
+ * done_merge_text(): close files.
+ *=======================================================================*/
+int 
+done_merge_text (void)
+{
+  fclose (idx[MERGE]);
+  fclose (text[OLD]);
+  fclose (idx[OLD]);
+  fclose (text[NEW]);
+  fclose (idx[NEW]);
+
+  fprintf (stderr, "mg_text_merge: %ld documents added to %s\n",
+	   cth[NEW].num_of_docs, merge_name);
+
+  return OK;
+}
+
+
+/*=======================================================================
+ * usage()
+ *=======================================================================*/
+void 
+usage (char *progname)
+{
+  fprintf (stderr, "usage:  %s -f collection_name\n", progname);
+  exit (1);
+}
+
+
+/*=======================================================================
+ * main()
+ *=======================================================================*/
+int main (int argc, char *argv[])
+{
+  char *progname;
+  ProgTime start;
+  int ch;			/* for command line processing */
+
+  progname = argv[0];
+  msg_prefix = argv[0];
+  merge_name[0] = '\0';
+
+  while ((ch = getopt (argc, argv, "f:d:h")) != -1)
+    switch (ch)
+      {
+      case 'f':
+	strcpy (merge_name, optarg);
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'h':
+      case '?':
+      default:
+	usage (progname);
+      }
+
+  if (merge_name[0] == '\0')
+    usage (progname);
+  strcpy (old_name, merge_name);
+  strcat (old_name, ".old");
+  strcpy (new_name, merge_name);
+  strcat (new_name, ".new");
+
+  GetTime (&start);
+  init_merge_text ();
+  process_merge_text ();
+  done_merge_text ();
+  Message ("%s\n", ElapsedTime (&start, NULL));
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.1	(revision 21083)
@@ -0,0 +1,112 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mg_weights_build 1 \*(Dt CITRI
+.SH NAME
+mg_weights_build \- builds the approximate weights file
+.SH SYNOPSIS
+.B mg_weights_build
+[
+.B \-h
+]
+[
+.B \-s
+]
+[
+.BI \-b " num"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mg_weights_build
+is the program that generates the approximate weights file and the
+interleaved text index and exact weights file.  To do this, it uses
+the text index and either the exact weights file, or the inverted file
+and stemmed dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-s
+Save the weights generated from the
+.I *.invf
+and
+.I *.invf.dict
+file in a
+.I *.weight
+file.
+.TP
+.BI \-b " num"
+This specifies the number of bits of precision that should be used for
+the approximate weights.  If not specified, it defaults to 8.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mg_weights_build.c	(revision 21083)
@@ -0,0 +1,508 @@
+/**************************************************************************
+ *
+ * mg_weights_build.c -- Program to build the document weights file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_gen.h"
+#include "bitio_m.h"
+#include "bitio_m_stdio.h"
+#include "timing.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "invf.h"
+#include "text.h"
+#include "words.h"
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:16  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:49  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:22  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1994/11/29  00:32:05  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.3  1994/10/20  03:57:00  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:55  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+unsigned char bits = 8;
+static char *file_name = "";
+static char *text_file_name = "";
+static unsigned long NumPara = 0;
+static unsigned long StaticNumOfDocs = 0;
+
+unsigned long get_NumPara (void);
+unsigned long get_StaticNumOfDocs (void);
+void GenerateWeights (void);
+void Make_weight_approx (void);
+void Make_text_idx_wgt (void);
+
+
+int main (int argc, char **argv)
+{
+  ProgTime StartTime;
+  int ch;
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "f:t:d:b:sh")) != -1) /* [RJM 10/98 - Text Filename] */
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	file_name = optarg;
+	if (strlen(text_file_name) == 0) text_file_name = optarg;
+	break;
+      /* [RJM 10/98 - Text Filename] */
+      case 't':		/* text input file */
+	text_file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'b':
+	bits = atoi (optarg);
+	if (bits > 32)
+	  {
+	    fprintf (stderr, "b may only take values 0-32\n");
+	    exit (1);
+	  }
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file]"
+		 "[-d data directory] [-b bits] [-s] [-h]\n", argv[0]);
+	exit (1);
+      }
+  GetTime (&StartTime);
+
+  GenerateWeights ();
+
+  Make_weight_approx ();
+
+  Make_text_idx_wgt ();
+
+  Message ("%s", ElapsedTime (&StartTime, NULL));
+
+  return 0;
+}
+
+
+
+
+unsigned long 
+get_NumPara (void)
+{
+  struct invf_dict_header idh;
+  FILE *invf_dict;
+  if (NumPara)
+    return (NumPara);
+  invf_dict = open_file (file_name, INVF_DICT_SUFFIX, "rb", MAGIC_STEM_BUILD,
+			 MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  fread ((char *) &idh, sizeof (idh), 1, invf_dict);
+  fclose (invf_dict);
+  NTOHUL2(idh.num_of_docs, NumPara);  /* [RPAP - Jan 97: Endian Ordering] */
+  return NumPara;
+}
+
+
+
+unsigned long 
+get_StaticNumOfDocs (void)
+/* the static number of documents is the N parameter used to
+ * decode document gaps in the inverted file encoded using
+ * the Bblock method.
+ */
+{
+  struct invf_dict_header idh;
+  FILE *invf_dict;
+  if (StaticNumOfDocs)
+    return (StaticNumOfDocs);
+  invf_dict = open_file (file_name, INVF_DICT_SUFFIX, "rb", MAGIC_STEM_BUILD,
+			 MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  fread ((char *) &idh, sizeof (idh), 1, invf_dict);
+  fclose (invf_dict);
+  NTOHUL2(idh.static_num_of_docs, StaticNumOfDocs);  /* [RPAP - Jan 97: Endian Ordering] */
+  return StaticNumOfDocs;
+}
+
+
+
+void GenerateWeights (void) {
+  FILE *dict, *invf, *f, *idx;
+  struct invf_dict_header idh;
+  struct invf_file_header ifh;
+  int i;
+  double logN;
+  float *DocWeights;
+
+  /* make sure the globals NumPara and StaticNumOfDocs are loaded */
+  get_NumPara ();
+  get_StaticNumOfDocs ();
+
+  /* check to see if the weights file has already been built */
+  if ((f = open_file (file_name, WEIGHTS_SUFFIX, "rb", MAGIC_WGHT,
+		      MG_CONTINUE)) != NULL) {
+      fclose (f);
+      return;
+  }
+  Message ("The file \"%s.weight\" does not exist.", file_name);
+  Message ("Building the weight data from the file \"%s.invf\".", file_name);
+
+  logN = log ((double) NumPara);
+
+  /* allocate memory for the weights */
+  if (!(DocWeights = Xmalloc (sizeof (float) * (NumPara + 1))))
+      FatalError (1, "No memory for doc weights");
+  bzero ((char *) DocWeights, sizeof (float) * (NumPara + 1));
+
+  /* open the .invf.dict file and read in its header */
+  dict = open_file (file_name, INVF_DICT_SUFFIX, "rb", MAGIC_STEM_BUILD,
+		    MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  fread ((char *) &idh, sizeof (idh), 1, dict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  /* open .invf.idx */
+  idx = open_file (file_name, INVF_IDX_SUFFIX, "rb", MAGIC_INVI,
+		   MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* open .invf and read in its header */
+  invf = open_file (file_name, INVF_SUFFIX, "rb", MAGIC_INVF,
+		    MG_ABORT);
+  fread ((char *) &ifh, sizeof (ifh), 1, invf);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(ifh.no_of_words);
+  NTOHUL(ifh.no_of_ptrs);
+  NTOHUL(ifh.skip_mode);
+  for (i = 0; i <= 15; i++)
+    NTOHUL(ifh.params[i]);
+  NTOHUL(ifh.InvfLevel);
+
+  /* make sure the inverted file does not contain skips and is not level 1 */
+  if (ifh.skip_mode != 0)
+    FatalError (0, "Can\'t make weights file from a skipped inverted file.");
+  if (ifh.InvfLevel == 1)
+    FatalError (0, "Can\'t make weights file from level 1 inverted file.");
+
+  DECODE_START (invf)
+
+    /* process each word adding its contributions to the document weights */
+    for (i = 0; i < ifh.no_of_words; i++)
+    {
+      u_char dummy1, dummy2[MAXSTEMLEN + 1];
+      unsigned long fcnt, wcnt, blk, CurrDoc, p, j;
+      float idf;
+
+      /* give a little feedback every 4096 words */
+      if ((i & 0xfff) == 0)
+	fprintf (stderr, ".");
+
+      /* read an entry for a word, just to get p value */
+      dummy1 = fgetc (dict);
+      dummy1 = fgetc (dict);
+      fread (dummy2, sizeof (u_char), dummy1, dict);
+      fread ((char *) &fcnt, sizeof (fcnt), 1, dict);
+      fread ((char *) &wcnt, sizeof (wcnt), 1, dict);
+
+      dummy2[dummy1] = '\0';
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      p = fcnt;
+
+      idf = logN - log ((double) fcnt);
+      blk = BIO_Bblock_Init (StaticNumOfDocs, p);
+      CurrDoc = 0;
+
+      /* check the inverted file index entry for this word */
+      {
+	unsigned long loc;
+	fread ((char *) &loc, sizeof (loc), 1, idx);
+	NTOHUL(loc);  /* [RPAP - Jan 97: Endian Ordering] */
+	if (ftell (invf) != loc)
+	  {
+	    FatalError (1, "Word %d  %d != %d", i, ftell (invf), loc);
+	  }
+      }
+
+      for (j = 0; j < p; j++)
+	{
+	  unsigned long x, tf;
+	  BBLOCK_DECODE (x, blk);
+	  CurrDoc += x;
+
+	  if (CurrDoc > idh.num_of_docs) {
+	    FatalError (1, "CurrDoc = %d, number of documents = %d", 
+			CurrDoc, idh.num_of_docs);
+	  }	  
+
+	  if (ifh.InvfLevel >= 2)
+	    {
+	      double weight;
+	      GAMMA_DECODE (tf);
+	      weight = tf * idf;
+	      DocWeights[CurrDoc - 1] += weight * weight;
+	    }
+	}
+      
+      while (__btg)
+	DECODE_BIT;
+    }
+
+  DECODE_DONE
+
+  fclose (dict);
+  fclose (invf);
+  fprintf (stderr, "\n");
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < NumPara; i++)
+    HTONF(DocWeights[i]);
+
+  f = create_file (file_name, WEIGHTS_SUFFIX, "wb", MAGIC_WGHT,
+		   MG_ABORT);
+
+  fwrite ((char *) DocWeights, sizeof (float), NumPara, f);
+  fclose (f);
+  Xfree (DocWeights);
+}
+
+
+
+
+
+
+
+
+
+
+
+void 
+Make_weight_approx (void)
+{
+  int i, pos, max;
+  unsigned long buf;
+  double U, L, B;
+  FILE *approx, *exact;
+
+  exact = open_file (file_name, WEIGHTS_SUFFIX, "rb", MAGIC_WGHT,
+		     MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* calculate U and L */
+  L = 1e300;
+  U = 0;
+  for (i = 0; i < NumPara; i++)
+    {
+      float wgt;
+      fread ((char *) &wgt, sizeof (wgt), 1, exact);
+      NTOHF(wgt);  /* [RPAP - Jan 97: Endian Ordering] */
+      wgt = sqrt (wgt);
+      if (wgt > U)
+	U = wgt;
+      if (wgt > 0 && wgt < L)
+	L = wgt;
+
+    }
+  fseek (exact, sizeof (u_long), SEEK_SET);
+
+  B = pow (U / L, pow (2.0, -(double) bits));
+
+  fprintf (stderr, "L = %f\n", L);
+  fprintf (stderr, "U = %f\n", U);
+  fprintf (stderr, "B = %f\n", B);
+
+
+
+  approx = create_file (file_name, APPROX_WEIGHTS_SUFFIX, "wb",
+			MAGIC_WGHT_APPROX, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fwrite ((char *) &bits, sizeof (bits), 1, approx);
+  HTOND(L);  /* [RPAP - Jan 97: Endian Ordering] */
+  HTOND(B);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite ((char *) &L, sizeof (L), 1, approx);
+  fwrite ((char *) &B, sizeof (B), 1, approx);
+  NTOHD(L);  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHD(B);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  max = bits == 32 ? 0xffffffff : (1 << bits) - 1;
+  for (buf = pos = i = 0; i < NumPara; i++)
+    {
+      unsigned long fx;
+      float wgt;
+      fread ((char *) &wgt, sizeof (wgt), 1, exact);
+      NTOHF(wgt);  /* [RPAP - Jan 97: Endian Ordering] */
+      wgt = sqrt (wgt);
+      if (wgt == 0)
+	{
+	  wgt = L;
+#ifndef QUIET
+	  Message ("Warning: Document %d had a weight of 0.", i);
+#endif
+	}
+      fx = (int) floor (log (wgt / L) / log (B));
+
+      if (fx > max)
+	fx = max;
+
+      buf |= (fx << pos);
+      pos += bits;
+
+      if (pos >= MAXBITS)
+	{
+	  HTONUL(buf);
+	  fwrite ((char *) &buf, sizeof (buf), 1, approx);
+	  buf = fx >> (bits - (pos - MAXBITS));
+	  pos = pos - MAXBITS;
+	}
+    }
+  if (pos > 0)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(buf);
+      fwrite ((char *) &buf, sizeof (buf), 1, approx);
+    }
+
+  fclose (approx);
+  fclose (exact);
+}
+
+
+
+
+
+void 
+Make_text_idx_wgt (void)
+{
+  compressed_text_header cth;
+  int i;
+  FILE *idx_wgt, *idx, *para, *exact;
+
+  idx_wgt = create_file (file_name, TEXT_IDX_WGT_SUFFIX, "wb", MAGIC_TEXI_WGT,
+			 MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  /* [RJM 10/98 - Text Filename] */
+  idx = open_file (text_file_name, TEXT_IDX_SUFFIX, "rb", MAGIC_TEXI,
+		   MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+  if (fread (&cth, sizeof (cth), 1, idx) != 1)
+    FatalError (1, "Unable to read header of index file");
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cth.num_of_docs);
+  NTOHD(cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(cth.num_of_words);
+  NTOHUL(cth.length_of_longest_doc);
+  NTOHD(cth.ratio);
+
+  exact = open_file (file_name, WEIGHTS_SUFFIX, "rb", MAGIC_WGHT,
+		     MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  get_NumPara ();
+  if (cth.num_of_docs != NumPara)
+    {
+      Message ("The number of documents does not equal "
+	       "the number of paragraphs.");
+      Message ("Using the \"%s.invf.paragraph\" file\n", file_name);
+      para = open_file (file_name, INVF_PARAGRAPH_SUFFIX, "rb", MAGIC_PARAGRAPH,
+			MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+    }
+  else
+    para = NULL;
+
+  {
+    struct
+      {
+	unsigned long Start;
+	float Weight;
+      }
+    data;
+    for (i = 0; i < cth.num_of_docs; i++)
+      {
+	int count;
+	fread ((char *) &data.Start, sizeof (unsigned long), 1, idx);
+	if (para && i < cth.num_of_docs)
+	  {
+	    /* [RPAP - Jan 97: Endian Ordering] */
+	    fread ((char *) &count, sizeof (count), 1, para);
+	    NTOHSI(count);
+	  }
+	else
+	  count = 1;
+	while (count--)
+	  {
+	    fread ((char *) &data.Weight, sizeof (float), 1, exact);
+	    NTOHF(data.Weight);  /* [RPAP - Jan 97: Endian Ordering] */
+	    data.Weight = sqrt (data.Weight);
+	    HTONF(data.Weight);  /* [RPAP - Jan 97: Endian Ordering] */
+	    fwrite ((char *) &data, sizeof (data), 1, idx_wgt);
+	  }
+      }
+    /* Write out the extra entry for the idx file */
+    fread ((char *) &data.Start, sizeof (unsigned long), 1, idx);
+    data.Weight = 0;
+    fwrite((char*)&data, sizeof(data), 1, idx_wgt);
+  }
+
+  fclose (idx_wgt);
+  fclose (idx);
+  fclose (exact);
+  if (para)
+    fclose (para);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.1	(revision 21083)
@@ -0,0 +1,72 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgdictlist 1 \*(Dt CITRI
+.SH NAME
+mgdictlist \- list the contents of a dictionary
+.SH SYNOPSIS
+.B mgdictlist
+[
+.B \-q
+]
+.I filename
+.SH DESCRIPTION
+.B mgdictlist
+lists the contents of either a compressed compression dictionary, a
+text statistics file, or a compressed stemmed dictionary.  Unlike all
+the other programs in the
+.BR mg (1)
+suite, it is necessary to specify the complete pathname of the
+dictionary to list.
+.SH OPTIONS
+The
+.I filename
+must be last.
+.TP "\w'\fIfilename\fP'u+2n"
+.B \-q
+Generate an abbreviated output (machine-readable rather than
+human-readable).
+.TP
+.I filename
+This is the name of the dictionary to list.
+.B mgdictlist
+automatically detects whether the file is a compressed compression
+dictionary, text statistics file, or a compressed stemmed dictionary.
+.SH FILES
+.TP 20
+.B *.text.dict
+Text statistics file.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.invf.build
+Compressed stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgdictlist.c	(revision 21083)
@@ -0,0 +1,405 @@
+/**************************************************************************
+ *
+ * mgdictlist.c -- Program to list a dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "messages.h"
+#include "memlib.h"
+#include "local_strings.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "text.h"
+#include "invf.h"
+#include "locallib.h"
+#include "words.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:17  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:49  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:24  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1994/11/29  00:32:07  tes
+   * Committing the new merged files and changes.
+   *
+   * Revision 1.3  1994/10/20  03:57:01  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:56  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+int quick = 0;
+int no_of_words[2];
+u_long maxcodelen[2];
+
+char *dictname = "";
+
+
+
+
+void 
+DumpStemDict (FILE * f)
+{
+  struct invf_dict_header idh;
+  int i;
+  u_char prev[MAXSTEMLEN + 1];
+
+  fread (&idh, sizeof (idh), 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(idh.lookback);
+  NTOHUL(idh.dict_size);
+  NTOHUL(idh.total_bytes);
+  NTOHUL(idh.index_string_bytes);
+  NTOHD(idh.input_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(idh.num_of_docs);
+  NTOHUL(idh.static_num_of_docs);
+  NTOHUL(idh.num_of_words);
+  NTOHUL(idh.stemmer_num);
+  NTOHUL(idh.stem_method);
+
+  if (quick)
+    printf ("%ld\n", idh.dict_size);
+  else
+    {
+      printf ("# lookback           = %lu\n", idh.lookback);
+      printf ("# dict size          = %lu\n", idh.dict_size);
+      printf ("# total bytes        = %lu\n", idh.total_bytes);
+      printf ("# index string bytes = %lu\n", idh.index_string_bytes);
+      printf ("# input bytes        = %.0f\n", idh.input_bytes); /* [RJM 07/97: 4G limit] */
+      printf ("# num of docs        = %lu\n", idh.num_of_docs);
+      printf ("# static num of docs = %lu\n", idh.static_num_of_docs);
+      printf ("# num of words       = %lu\n", idh.num_of_words);
+      printf ("#\n");
+    }
+
+  for (i = 0; i < idh.dict_size; i++)
+    {
+      register unsigned long copy, suff;
+      unsigned long wcnt, fcnt;
+
+      /* build a new word on top of prev */
+      copy = getc (f);
+      suff = getc (f);
+      *prev = copy + suff;
+      fread (prev + copy + 1, sizeof (u_char), suff, f);
+
+      /* read other data, but no need to store it */
+      fread (&fcnt, sizeof (fcnt), 1, f);
+      fread (&wcnt, sizeof (wcnt), 1, f);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fcnt);
+      NTOHUL(wcnt);
+
+      if (!quick)
+	{
+	  printf ("%d: %8ld ", i, wcnt);
+	  printf ("/ %5ld ", fcnt);
+	  printf ("%2d %2ld\t\"", *prev, copy);
+	}
+      printf ("%s", word2str (prev));
+      if (quick)
+	printf (" %ld %ld\n", wcnt, fcnt);
+      else
+	{
+	  putchar ('"');
+	  putchar ('\n');
+	}
+    }
+}
+
+
+
+
+void 
+ReadInWords (FILE * f)
+{
+  comp_frags_header cfh;
+  u_long *codes;
+  u_char prev[MAXSTEMLEN + 1];
+  int i;
+
+  if (Read_cfh (f, &cfh, NULL, NULL) == -1)
+    FatalError (1, "Unable to read in the dictionary");
+
+  printf ("#\n");
+  printf ("#   max code len       = %u\n", cfh.hd.maxcodelen);
+  printf ("#   total bytes        = %lu\n", cfh.uncompressed_size);
+  printf ("#\n");
+
+  if (!(codes = Generate_Huffman_Codes (&cfh.hd, NULL)))
+    FatalError (1, "no memory for huffman codes\n");
+
+  for (i = 0; i < cfh.hd.num_codes; i++)
+    {
+      register int val, copy, j, k;
+      char code[33];
+      val = fgetc (f);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      fread (prev + copy + 1, sizeof (u_char), val, f);
+      *prev = val + copy;
+
+      for (k = 0, j = cfh.hd.clens[i] - 1; j >= 0; j--, k++)
+	code[k] = '0' + ((codes[i] >> j) & 1);
+      code[k] = '\0';
+
+      printf ("%d: %2d : %*s : \"%s\"\n", i, cfh.hd.clens[i],
+	      cfh.hd.maxcodelen, code, word2str (prev));
+    }
+  Xfree (codes);
+  Xfree (cfh.hd.clens);
+}
+
+
+void 
+ReadCharHuffman (FILE * f, char *title)
+{
+  int i;
+  huff_data hd;
+  u_long *codes;
+
+  if (Read_Huffman_Data (f, &hd, NULL, NULL) == -1)
+    FatalError (1, "Unable to read huffman data");
+
+  if (!(codes = Generate_Huffman_Codes (&hd, NULL)))
+    FatalError (1, "no memory for huffman codes\n");
+
+  printf ("#\n# %s\n#\n", title);
+  for (i = 0; i < hd.num_codes; i++)
+    if (hd.clens[i])
+      {
+	int j, k;
+	char code[33];
+	for (k = 0, j = hd.clens[i] - 1; j >= 0; j--, k++)
+	  code[k] = '0' + ((codes[i] >> j) & 1);
+	code[k] = '\0';
+	printf ("%2d : %*s : \"%s\"\n", hd.clens[i],
+		hd.maxcodelen, code, char2str (i));
+      }
+  Xfree (codes);
+  Xfree (hd.clens);
+}
+
+
+void 
+ReadLenHuffman (FILE * f, char *title)
+{
+  int i;
+  huff_data hd;
+  u_long *codes;
+
+  if (Read_Huffman_Data (f, &hd, NULL, NULL) == -1)
+    FatalError (1, "Unable to read huffman data");
+
+  if (!(codes = Generate_Huffman_Codes (&hd, NULL)))
+    FatalError (1, "no memory for huffman codes\n");
+
+  printf ("#\n# %s\n#\n", title);
+  for (i = 0; i < hd.num_codes; i++)
+    if (hd.clens[i])
+      {
+	int j, k;
+	char code[33];
+	for (k = 0, j = hd.clens[i] - 1; j >= 0; j--, k++)
+	  code[k] = '0' + ((codes[i] >> j) & 1);
+	code[k] = '\0';
+	printf ("%2d : %*s : %d\n", hd.clens[i],
+		hd.maxcodelen, code, i);
+      }
+  Xfree (codes);
+  Xfree (hd.clens);
+}
+
+
+
+
+
+void 
+DumpTextDict (FILE * f)
+{
+  struct compression_dict_header cdh;
+  int which;
+
+  if (Read_cdh (f, &cdh, NULL, NULL) == -1)
+    FatalError (1, "Unable to read dictionary header");
+  switch (cdh.dict_type)
+    {
+    case MG_COMPLETE_DICTIONARY:
+      printf ("# COMPLETE DICTIONARY\n");
+      break;
+    case MG_PARTIAL_DICTIONARY:
+      printf ("# PARTIAL DICTIONARY\n");
+      break;
+    case MG_SEED_DICTIONARY:
+      printf ("# SEED DICTIONARY\n");
+      break;
+    }
+  printf ("# num words          = %lu\n", cdh.num_words[1]);
+  printf ("# num word chars     = %lu\n", cdh.num_word_chars[1]);
+  printf ("# num non-words      = %lu\n", cdh.num_words[0]);
+  printf ("# num non-word chars = %lu\n", cdh.num_word_chars[0]);
+  printf ("# lookback           = %lu\n", cdh.lookback);
+
+  for (which = 0; which < 2; which++)
+    switch (cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  ReadInWords (f);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    ReadInWords (f);
+
+	  ReadCharHuffman (f, "Characters");
+	  ReadLenHuffman (f, "Lengths");
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    ReadInWords (f);
+
+	  ReadCharHuffman (f, "Characters");
+	  ReadLenHuffman (f, "Lengths");
+	}
+	break;
+      }
+}
+
+
+
+
+void 
+DumpStatsDict (FILE * f)
+{
+  int i;
+  compression_stats_header csh;
+
+  fread (&csh, sizeof (csh), 1, f);
+
+  for (i = 0; i < 2; i++)
+    {
+      int j;
+      frags_stats_header fsh;
+
+      fread (&fsh, sizeof (fsh), 1, f);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fsh.num_frags);
+      NTOHUL(fsh.mem_for_frags);
+
+      if (!quick)
+	printf ("#\n# num %9s      = %lu\n#\n", i ? "words" : "non-words",
+		fsh.num_frags);
+
+      for (j = 0; j < fsh.num_frags; j++)
+	{
+	  u_char Word[16];
+	  u_long freq, occur_num;
+
+	  fread (&freq, sizeof (freq), 1, f);
+	  fread (&occur_num, sizeof (occur_num), 1, f);
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  NTOHUL(freq);
+	  NTOHUL(occur_num);
+
+	  Word[0] = fgetc (f);
+	  fread (Word + 1, Word[0], 1, f);
+	  printf ("%d: %7ld : %7ld : \"%s\"\n", j, freq,
+		  occur_num, word2str (Word));
+	}
+    }
+}
+
+
+int main (int argc, char **argv)
+{
+  FILE *fp;
+  unsigned long magic = 0;
+
+  if (argc < 2)
+    FatalError (1, "A file name must be specified");
+  dictname = argv[1];
+  if (strcmp (dictname, "-q") == 0)
+    {
+      quick = 1;
+      if (argc < 3)
+	FatalError (1, "A file name must be specified");
+      dictname = argv[2];
+    }
+  if (!(fp = fopen (dictname, "rb")))  /* [RPAP - Feb 97: WIN32 Port] */
+    FatalError (1, "Unable to open \"%s\"", dictname);
+
+  fread (&magic, sizeof (magic), 1, fp);
+
+  NTOHUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  switch (magic)
+    {
+    case MAGIC_STEM_BUILD:
+      if (!quick)
+	printf ("# Contents of STEM file \"%s\"\n#\n", dictname);
+      DumpStemDict (fp);
+      break;
+    case MAGIC_DICT:
+      if (!quick)
+	printf ("# Contents of DICT file \"%s\"\n#\n", dictname);
+      DumpTextDict (fp);
+      break;
+    case MAGIC_STATS_DICT:
+      if (!quick)
+	printf ("# Contents of STATS file \"%s\"\n#\n", dictname);
+      DumpStatsDict (fp);
+      break;
+    default:
+      FatalError (1, "Bad magic number. \"%s\" cannot be dumped", dictname);
+    }
+  fclose (fp);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.1	(revision 21083)
@@ -0,0 +1,693 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgquery 1 \*(Dt CITRI
+.SH NAME
+mgquery \- query program for the mg system
+.SH SYNOPSIS
+.B mgquery
+[
+.B \-h
+]
+[
+.B \-D
+]
+[
+.BI \-f " name"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +9n
+[
+.I collection-name
+]
+.SH DESCRIPTION
+.B mgquery
+enables users to make Boolean or ranked queries from a data base
+generated by the
+.BR mg (1)
+system.  It accepts queries from
+.I stdin
+and sends the retrieved documents to
+.IR stdout .
+Information on the resource usage of
+.B mgquery
+as it processes queries can be obtained interactively.
+.SH OPTIONS
+Options may appear in any order, but the
+.IR collection-name ,
+if specified, must be last.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-D
+This option causes the entire text to be decompressed and sent to
+.IR stdout .
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection that will be
+used.  If a collection with the specified base
+.I name
+does not exist, an error message will be displayed and
+.B mgquery
+will exit.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.SH USAGE
+Prior to processing the command line arguments, the
+.B mgquery
+program attempts to read in a startup script called
+.IR ./.mgrc .
+If that fails, it attempts to read in the file
+.IR $HOME/.mgrc .
+The startup file can only contain commands\(emno queries are
+permitted in the
+.I .mgrc
+file.  Lines starting with \*(lq\fB#\fP\*(rq in the file are comments.
+The most common use for the
+.I .mgrc
+file is to personalise the initial values of the predefined parameters
+with
+.B .set
+commands.
+.LP
+The input to
+.B mgquery
+consists of a series of input lines.  The backslash
+character
+.RB (\*(lq \e \*(rq)
+is used at the end of lines to indicate
+that input continues on the next line.
+.LP
+Input lines on which the first character is a dot
+.RB (\*(lq . \*(rq)
+are commands to the
+.B mgquery
+program.  Input lines that do not start with a dot are queries.
+.LP
+A query consists of two parts.  One part is a Boolean or ranked query
+that identifies documents.  The second part is a post-processing
+pattern matching operation.  Any text between the first speech mark
+(\*(lq) and the last speech mark (\*(rq) is considered to be a
+post-processing pattern.
+.SH COMMANDS
+The
+.B mgquery
+program can accept the following commands.
+.TP 17
+.B .help
+Display several pages of help text.
+.TP
+.B .quit
+Quit the program.
+.TP
+.B .warranty
+Display the
+.BR mg (1)
+warranty.
+.TP
+.B .conditions
+Display the conditions of use and distribution of
+.BR mg (1).
+.TP
+.BI ".set " "name value"
+Set the parameter
+.I name
+to the specified
+.IR value .
+If the parameter is a Boolean
+.I value
+and the
+.I value
+is omitted, the parameter will be inverted (i.e., if it was
+.IR true ,
+then it will change to
+.IR false ;
+if it was
+.IR false ,
+then it will change to
+.IR true ).
+.TP
+.BI ".unset " name
+Delete the parameter
+.I name
+from the currently-defined parameters.
+.TP
+.B .reset
+Reset the parameters to the state that they had after the processing
+of the
+.B mgquery
+command line.
+.TP
+.B .display
+Display the values of all the currently-defined parameters.
+.TP
+.B .push
+Push the currently-defined parameters onto a stack.
+.TP
+.B .pop
+Pops a set of parameters off the stack, replacing the currently-defined
+ones.
+.TP
+.BI ".output " arg
+This is used to specify where to send the text of the documents.  Once
+the
+.B .output
+command is specified, all subsequent output will be sent to the place
+specified by
+.IR arg .
+If
+.I arg
+is not specified subsequent output will be directed to
+.IR stdout .
+.I Arg
+may be any of the following.
+.RS
+.TP 13
+.BI "> " filename
+Send output to the specified file.
+.TP
+.BI ">> " filename
+Append output to the specified file.
+.TP
+.BI "| " command
+Pipe the output to
+.IR command ,
+which is executed by
+.IR sh .
+.RE
+.TP
+.BI ".input " arg
+This is used to specify where input (queries and commands) comes
+from.  Once the
+.B .input
+command is specified all subsequent input will be come from the place
+specified by
+.IR arg .
+If
+.I arg
+is not specified subsequent input will come from
+.IR stdin .
+.RS
+.TP 13
+.BI "< " filename
+Get input from the specified file.
+.TP
+.BI "| " command
+The input comes from the standard output of
+.IR command ,
+which is executed by
+.IR sh .
+.RE
+.SH PARAMETERS
+The following parameters are predefined and have special
+significance.  Each parameter will be followed by its default
+value.  Parameters are initialised before the
+.I .mgrc
+file is read or the command line arguments are processed.
+.TP 17
+.BI accumulator_method " `array'"
+This parameter is used during ranking, and specifies how the
+weight for each document should be accumulated.  The following
+methods are available:
+.IR array ,
+.IR splay_tree ,
+.IR hash_table ,
+and
+.IR list .
+.TP
+.BI briefstats " `off'"
+This is a Boolean parameter that determines whether the
+totals for disk, memory and time usage statistics will be
+displayed at the end of each query.
+.IR Note :
+this takes precedence over the parameters
+.BR diskstats ,
+.BR memstats " and " timestats .
+This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI buffer " `1048576'"
+When the documents are being read in, they are read into a
+buffer of this size and then displayed from this buffer.  If
+the documents are larger than this buffer, the buffer is
+expanded automatically.  Having a large buffer gives a very
+slight performance improvement, because it allows the order of
+disk operations to be optimised.  The buffer size is measured
+in bytes.
+.TP
+.BI diskstats " `off'"
+This is a Boolean parameter that determines whether the disk
+usage statistics for the preceding query will be displayed
+after each query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI doc_sepstr " `---------------------------------- %n\en\'"
+This specifies the string that will be used to separate
+documents when they are displayed for `Boolean' or `docnums'
+queries.  The standard C escape character sequences
+may be used to place special characters in the
+string.  For example, a newline would be `\en'.  To include a `%',
+use the sequence `%%'.  To include the
+.BR mg (1)
+document number, use the sequence `%n'.  The following escape character
+sequences are available
+.nf
+.ta 1.7iL
+.B Sequence	Meaning
+`\e\e'	backslash
+`\eb'	backspace
+`\ef'	formfeed
+`\en'	newline
+`\er'	carriage return
+`\et'	tab
+`\e"'	speech marks
+`\e''	quote mark
+`\ex\fIhh\fP'	ASCII code in hexadecimal
+`\ennn'	ASCII code in octal
+.fi
+.TP
+.BI expert " `false'"
+If this is
+.IR true ,
+then much of the dialogue output is suppressed.  This parameter may
+take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI hash_tbl_size " `1000'"
+One of the options during ranking queries is to use a hash
+table to accumulate the weights for each document.  The hash
+table is a simple chained type.  This parameter specifies the
+size of the hash table and may take any value between 8 and
+268435456 (2^28).
+.TP
+.BI heads_length " `50'"
+When the mode is
+.BR heads ,
+this specifies the number of characters that will be output for each
+document.
+.TP
+.BI maxdocs " `all'"
+The maximum number of documents to display in response to a
+query.  This parameter may take on a numeric value between 1
+and 429467295 (2^32 - 1) or the word
+.IR all .
+.TP
+.BI maxparas " `1000'"
+The maximum number of paragraphs to identify during a ranked
+query with paragraph indexing.  After the paragraphs have been
+identified, the paragraphs are converted into documents, and
+because some of the paragraphs may refer to the same documents
+the final number of answers may be less than
+.BR maxparas .
+The
+.B maxdocs
+parameter will then be applied.  This parameter may take on a numeric
+value between 1 and 429467295 (2^32 - 1).
+.TP
+.BI max_accumulators " `50000'"
+This parameter limits the number of different paragraph and
+document numbers to be accumulated during ranked queries when
+the parameter
+.B accumulator_method
+is set to
+.IR splay_tree ,
+.IR hash_table ,
+or
+.IR list .
+This parameter may take any value between 8 and 268435456 (2^28).
+.TP
+.BI max_terms " `all'"
+This parameter limits the number of terms that will actually
+be used during a ranked query.  If more terms than the number
+specified by
+.B max_terms
+are entered, then the extra terms will be discarded.  If
+.B sorted_terms
+is on, then the limiting will be done after the terms have been
+sorted.  This parameter may take any value between 1 and 429467295
+(2^32 - 1), or the word
+.IR all.
+.TP
+.BI memstats " `off'"
+This is a Boolean parameter that determines whether the memory
+usage statistics for the preceding query will be displayed
+after each query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI mgdir " `.'"
+This is set to the directory where the
+.BR mg (1)
+data files may be found.  If
+the environment variable
+.B MGDATA
+exists, then this is instead initialised to the value of
+.BR MGDATA .
+The value of this parameter may be changed, either in the
+.I .mgrc
+file with a
+.BI ".set mgdir "directory
+command, or from the command line using the
+.BI \-d " directory"
+option.  Once the \*(lq\fB>\fP\*(rq prompt appears, changing this
+parameter will have no effect.
+.TP
+.BI mgname " `bible'"
+This is set to the name of the
+.BR mg (1)
+collection that is to be used for the session.  The value of this
+parameter may be changed, either in the
+.I .mgrc
+file with a
+.BI ".set mgname "name
+command, or from the command line using the
+.BI \-f " name"
+option.  Once the \*(lq\fB>\fP\*(rq prompt appears, changing this
+parameter will have no effect.
+.TP
+.BI mode " `text'"
+This specifies how documents should be displayed when they
+are retrieved.  It may take six different values:
+.IR text ,
+.IR hilite ,
+.IR docnums ,
+.IR heads ,
+.IR silent ,
+or
+.IR count .
+.I text
+displays the contents of the document.
+.I hilite
+displays the contents of the document and highlights any of the 
+stemmed query terms.
+.I docnums
+displays only the document numbers.
+.I heads
+is used to print out the head of each document.
+.I silent
+retrieves all the documents but displays nothing except how many
+documents were retrieved.  This mode is intended to be used in timing
+experiments.
+.I count
+does the minimum
+amount of work required to determine how many documents would
+be retrieved, but does not retrieve them.
+.TP
+.BI optimise_type " `1'"
+There are three types of boolean query optimisation (parse tree
+rearrangement). Type 0 leaves parse tree unaltered. Type 1 optimises
+for AND of terms and AND of OR of terms. Type 2 converts the tree
+into DNF (an experiment :-).
+.TP
+.BI pager " `more'"
+This is the name of the program that will be used to display
+the help and the retrieved documents.  If the environment
+variable
+.B PAGER
+is defined, then
+.B pager
+takes on that value.
+.TP
+.BI hilite_style " `bold'"
+This specifies the type of highlighting method.
+It may take one of two different values:
+.IR bold,
+or
+.IR underline.
+.TP
+.BI para_sepstr " `\en######## PARAGRAPH %n ########\en'"
+This specifies the string that will be used to separate paragraphs.
+The standard C escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written
+as `\en'.  To include a `%', use the sequence `%%'.  To include the
+paragraph number within the document, use the sequence `%n'.
+.TP
+.BI para_start " `***** Weight = %w *****\en'"
+This specifies the string that will be used at the head of paragraphs
+for a paragraph-level index following a ranked query.  The standard
+C-language escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written as
+`\en'.  To include a `%', use the sequence `%%'.  To include the
+paragraph weight, use the sequence `%w'.
+.TP
+.BI qfreq " `true'"
+This determine whether the ranked queries will take into account the
+number of times each query term is specified.  When this is
+.IR true ,
+the number of times a term appears in the query is used in the
+ranking.  When this is
+.IR false ,
+all query terms are assumed to occur only once.  This parameter may
+take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI query  " `Boolean'"
+This specifies the type of queries that are to be specified.
+It can take four different values:
+.IR Boolean ,
+.IR ranked ,
+.IR docnums " or " approx-ranked.
+.I Boolean
+is for Boolean queries.
+The
+.BR yacc (1)
+grammar for Boolean queries is as follows.
+.IP
+.nf
+        query   : or;
+.IP
+        or      : or '|' and
+                | and ;
+.IP
+        and     : and '&' not
+                | and not
+                | not ;
+.IP
+        not     : term
+                | '!' not ;
+.IP
+        term    : TERM
+                | '(' or ')' ;
+.fi
+.IP
+.IR ranked " and " approx-ranked
+are for queries ranked by the cosine measure.
+.I approx-ranked
+uses only the low-precision document lengths, and therefore only
+produces an approximation to full cosine ranking.
+.IP
+.nf
+        query   : TERM
+                | query TERM ;
+.fi
+.IP
+.I docnums
+allows the entry of document numbers.  Multiple numbers separated by
+spaces may be specified, or ranges separated by hyphens.
+.IP
+.nf
+        query   : range
+                | query range ;
+.IP
+        range   : num
+                | num '-' num ;
+.fi
+.TP
+.BI ranked_doc_sepstr " `-------------------------------- %n %w\en'"
+This specifies the string that will be used to separate documents when
+they are displayed for `ranked' or `approx-ranked' queries.  The
+standard C escape character sequences may be used to place special
+characters in the string.  For example, a newline would be written as
+`\en'.  To include a `%', use the sequence `%%'.  To include the
+.BR mg (1)
+document number, use the sequence `%n'.  To include the document
+weight, use the sequence `%w'.
+.TP
+.BI sizestats " `false'"
+If this is
+.IR true ,
+then various numbers are output at the end of each query indicating
+what went on during the query.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI skip_dump " `skips.%d'"
+If this parameter is set, then a file will be produced in the current
+directory during ranked queries on skipped inverted files when
+.B accumulator_method
+is set to
+.IR splay_tree ,
+.IR hash_table ,
+or
+.IR list .
+The name of the file is the value of this parameter.  A `%d' in the
+file name will be replaced with the process id of
+.BR mgquery .
+This file will contain information about the usage of skips during the
+query processing.  This option is expensive; use
+.B .unset skip_dump
+to obtain optimal performance.
+.TP
+.BI sorted_terms " `on'"
+This specifies whether or not the terms should be sorted into
+decreasing occurrence in documents so that the least-often occurring
+terms are processed first when ranked queries are being done.  When
+this is
+.IR true ,
+the terms are sorted.  When this is
+.IR false ,
+the terms are not sorted, and are instead processed in order of
+occurrence.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI stop_at_max_accum " `on'"
+This specifies what should happen when the maximum number of
+accumulators set by
+.B max_accumulators
+is reached.  When this is
+.IR true ,
+the processing of terms is stopped at the completion of the current
+term.  When this is
+.IR false ,
+processing continues but no new accumulators are created.  This
+parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI terminator " `'"
+This specifies the string that will be output after the last document
+from the previous query has been output.  The standard C escape
+character sequences may be used to place special characters in the
+string.  For example, a newline would be written as `\en'.  To include
+a `%', use the sequence `%%'.
+.TP
+.BI timestats " `false'"
+If this is
+.IR true ,
+then the time to process a query is displayed in both real time and
+CPU time.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.TP
+.BI verbatim " `off'"
+This is a Boolean parameter that determines whether the program
+should attempt to do a regular-expression match on the retrieved
+text.  If verbatim is
+.I on
+and a post-processing string is specified with the query, then the
+post-processing string will be searched for in the documents just
+before they are displayed.  If the string is found, the document will
+be displayed; if not, the document will not be displayed.  If verbatim
+is
+.IR off ,
+the post-processing string will be considered a regular expression
+as in
+.BR egrep (1)
+or
+.BR vi (1).
+E.g., if verbatim is
+.I on,
+\*(lq\fBand.*the\fP\*(rq will look for the 8-character sequence
+\*(lq\fBand.*the\fP\*(rq.  If verbatim is
+.IR off ,
+\*(lq\fBand.*the\fP\*(rq will look for the sequence
+\*(lq\fBand\fP\*(rq followed somewhere later in the document by the
+sequence \*(lq\fBthe\fP\*(rq.  This parameter may take the values
+.IR yes ", " no ", "
+.IR true ", " false ", "
+.IR on " or " off .
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.I .mgrc
+.B mgquery
+startup file
+.TP
+.B help.mg
+Help file for
+.BR mgquery .
+The contents of this file is displayed with the
+.B .help
+command.
+.TP
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+The `on-disk' stemmed dictionary.
+.TP
+.B *.text
+Compressed documents.
+.TP
+.B *.text.dict
+Compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR egrep (1),
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgstat (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1),
+.BR vi (1),
+.BR yacc (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgquery.c	(revision 21083)
@@ -0,0 +1,1495 @@
+/**************************************************************************
+ *
+ * mgquery.c -- The   M G Q U E R Y   program
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:18  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1999/01/08 00:33:46  rjmcnab
+
+   Enabled mg and the library software to read in more than one index
+   at a time.
+
+   Revision 1.2  1998/11/25 07:55:49  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:29  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:57:02  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:41:58  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#if defined(HAVE_SYS_PROCFS_H) && defined(HAVE_PR_BRKSIZE) && \
+    (__STDC__ == 0)
+/* STDC test was included to allow cc -Xc on SunOS 5 to work */
+#define USE_PROCESS_MEM
+#endif
+
+#ifdef USE_PROCESS_MEM
+# include <sys/procfs.h>
+#endif
+
+#ifdef HAVE_GETRUSAGE
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# endif
+# include <sys/resource.h>
+#endif
+
+#ifndef HAVE_GETPAGESIZE
+# include "getpagesize.h"
+#endif
+ 
+#if WITH_REGEX
+# include <regex.h>
+#else
+# include <rx.h>
+#endif
+
+
+#include <stdarg.h>
+#include <signal.h>
+
+#include "messages.h"
+#include "timing.h"
+#include "memlib.h"
+#include "local_strings.h"  /* [RPAP - Feb 97: Term Frequency] */
+
+#include "filestats.h"
+#include "invf.h"
+#include "text.h"
+#include "mg.h"
+#include "lists.h"
+#include "backend.h"
+#include "environment.h"
+#include "globals.h"
+#include "read_line.h"
+#include "mg_errors.h"
+#include "commands.h"
+#include "text_get.h"
+#include "term_lists.h"
+#include "query_term_list.h"
+
+
+FILE *OutFile = NULL, *InFile = NULL;
+int OutPipe = 0, InPipe = 0;
+int Quitting = 0;
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) ||  defined(NZDL)
+int GetDocNumFromParaNum(query_data *qd, int paranum) {
+  int Documents = qd->td->cth.num_of_docs;
+  int *Paragraph = qd->paragraph;
+  int low = 1, high = Documents;
+  int mid = (low+high)/2;
+
+  while ((mid = (low+high)/2) >=1 && mid <= Documents)
+    {
+      if (paranum > Paragraph[mid])
+	low = mid+1;
+      else if (paranum <= Paragraph[mid-1])
+	high = mid-1;
+      else
+	return mid;
+    }
+  FatalError(1, "Bad paragraph number.\n");
+}
+#endif
+
+#ifdef TREC_MODE
+char *trec_ids = NULL;
+long *trec_paras = NULL;
+#endif
+
+static volatile int PagerRunning = 0;
+static volatile int Ctrl_C = 0;
+
+
+/*****************************************************************************/
+
+typedef enum
+  {
+    S_Time, S_Mem, S_Size, S_File
+  }
+S_Type;
+
+static struct Stat
+  {
+    S_Type typ;
+    char *name;
+    char *text;
+  }
+ *Stats = NULL;
+static int NumStats = 0;
+
+static void 
+Clear_Stats (void)
+{
+  if (Stats)
+    {
+      int i;
+      for (i = 0; i < NumStats; i++)
+	{
+	  if (Stats[i].name)
+	    Xfree (Stats[i].name);
+	  if (Stats[i].text)
+	    Xfree (Stats[i].text);
+	}
+      Xfree (Stats);
+      Stats = NULL;
+      NumStats = 0;
+    }
+}
+
+static void 
+Add_Stats (S_Type typ, char *name, char *fmt,...)
+{
+  char buf[1024];
+  va_list args;
+  va_start (args, fmt);
+  vsprintf (buf, fmt, args);
+  if (Stats)
+    Stats = Xrealloc (Stats, (++NumStats) * sizeof (*Stats));
+  else
+    Stats = Xmalloc ((++NumStats) * sizeof (*Stats));
+  Stats[NumStats - 1].typ = typ;
+  Stats[NumStats - 1].name = Xstrdup (name);
+  Stats[NumStats - 1].text = Xstrdup (buf);
+}
+
+static void 
+Display_Stats (FILE * f)
+{
+  static char *sep = "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-="
+  "-=-=-=-=-=-=-=-=-=-=-";
+  char *names[] =
+  {"Time:  ", "Memory:", "Sizes: ", "Disk:  ", "       "};
+  int i, last_typ = -1;
+  size_t len = 0;
+  if (NumStats == 0)
+    return;
+  fprintf (f, "%s\n", sep);
+  for (i = 0; i < NumStats; i++)
+    if (strlen (Stats[i].name) > len)
+      len = strlen (Stats[i].name);
+  for (i = 0; i < NumStats; i++)
+    {
+      int typ = 4;
+      if (Stats[i].typ != last_typ)
+	typ = last_typ = Stats[i].typ;
+      fprintf (f, "%s %-*s %s\n", names[typ], (int) len, Stats[i].name, Stats[i].text);
+    }
+  fprintf (f, "%s\n", sep);
+}
+
+/*****************************************************************************/
+
+
+static void 
+QueryTimeStats (ProgTime * Start, ProgTime * invf, ProgTime * text)
+{
+  if (!BooleanEnv (GetEnv ("briefstats"), 0))
+    {
+      Add_Stats (S_Time, "invf", ElapsedTime (Start, invf));
+      Add_Stats (S_Time, "text", ElapsedTime (invf, text));
+    }
+  Add_Stats (S_Time, "total", ElapsedTime (Start, text));
+}
+
+static void 
+StartUpTimeStats (InitQueryTimes * iqt)
+{
+  if (!BooleanEnv (GetEnv ("briefstats"), 0))
+    {
+      Add_Stats (S_Time, "dict [stem]", ElapsedTime (&iqt->Start,
+						     &iqt->StemDict));
+      Add_Stats (S_Time, "weights", ElapsedTime (&iqt->StemDict,
+						 &iqt->ApproxWeights));
+      Add_Stats (S_Time, "dict [text]", ElapsedTime (&iqt->ApproxWeights,
+						     &iqt->CompDict));
+      Add_Stats (S_Time, "Inverted", ElapsedTime (&iqt->CompDict,
+						  &iqt->Invf));
+      Add_Stats (S_Time, "Compressed", ElapsedTime (&iqt->Invf,
+						    &iqt->Text));
+    }
+  Add_Stats (S_Time, "total", ElapsedTime (&iqt->Start, &iqt->Text));
+}
+
+
+
+
+#ifdef USE_PROCESS_MEM
+static u_long 
+process_mem (void)
+{
+  prstatus_t pr;
+  static int fd = -1;
+  if (fd == -1)
+    {
+      char buf[128];
+      sprintf (buf, "/proc/%ld", (long) getpid ());
+      fd = open (buf, O_RDONLY);
+    }
+  if (fd == -1 || ioctl (fd, PIOCSTATUS, &pr) == -1)
+    return 0;
+  return pr.pr_brksize;
+}
+#endif
+
+
+
+
+static void 
+MemStats (query_data * qd)
+{
+  if (!BooleanEnv (GetEnv ("briefstats"), 0))
+    {
+#ifdef HAVE_GETRUSAGE
+      struct rusage rusage;
+      getrusage (RUSAGE_SELF, &rusage);
+
+      Add_Stats (S_Mem, "process mem", "%7.3f Mb",
+	    (double) (rusage.ru_maxrss * getpagesize () / 1024.0 / 1024.0));
+#endif
+#ifdef USE_PROCESS_MEM
+      Add_Stats (S_Mem, "process mem", "%7.3f Mb",
+		 (double) (process_mem () / 1024.0 / 1024.0));
+#endif
+      Add_Stats (S_Mem, "dict [stem]", "%7.1f kB",
+		 (double) qd->sd->MemForStemDict / 1024);
+      Add_Stats (S_Mem, "dict [text]", "%7.1f kB",
+		 (double) qd->cd->MemForCompDict / 1024);
+      if (qd->awd)
+	Add_Stats (S_Mem, "weights", "%7.1f kB",
+		   (double) qd->awd->MemForWeights / 1024);
+    }
+  if (qd->awd)
+    Add_Stats (S_Mem, "total [peak]", "%7.1f kB",
+	       (double) (qd->max_mem_in_use + qd->sd->MemForStemDict +
+		   qd->cd->MemForCompDict + qd->awd->MemForWeights) / 1024);
+  else
+    Add_Stats (S_Mem, "total [peak]", "%7.1f kB",
+	       (double) (qd->max_mem_in_use + qd->sd->MemForStemDict +
+			 qd->cd->MemForCompDict) / 1024);
+
+}
+
+
+
+static void 
+SizeStats (query_data * qd)
+{
+  Add_Stats (S_Size, "skips", "%7d", qd->hops_taken);
+  Add_Stats (S_Size, "pointers", "%7d", qd->num_of_ptrs);
+  Add_Stats (S_Size, "accumulators", "%7d", qd->num_of_accum);
+  Add_Stats (S_Size, "terms", "%7d", qd->num_of_terms);
+  Add_Stats (S_Size, "answers", "%7d", qd->num_of_ans);
+  Add_Stats (S_Size, "index lookups", "%7d", qd->text_idx_lookups);
+}
+
+static void 
+TotalSizeStats (query_data * qd)
+{
+  Add_Stats (S_Size, "skips", "%7d", qd->tot_hops_taken);
+  Add_Stats (S_Size, "pointers", "%7d", qd->tot_num_of_ptrs);
+  Add_Stats (S_Size, "accumulators", "%7d", qd->tot_num_of_accum);
+  Add_Stats (S_Size, "terms", "%7d", qd->tot_num_of_terms);
+  Add_Stats (S_Size, "answers", "%7d", qd->tot_num_of_ans);
+  Add_Stats (S_Size, "index lookups", "%7d", qd->tot_text_idx_lookups);
+}
+
+
+static void 
+StatFile (File * F)
+{
+  static unsigned long NumBytes = 0, NumSeeks = 0, NumReads = 0;
+  if (F)
+    if ((int) F != -1)
+      {
+	if (!BooleanEnv (GetEnv ("briefstats"), 0))
+	  Add_Stats (S_File, F->name, "%7.1f kB (%3d seeks, %7d reads)",
+		   (double) F->Current.NumBytes / 1024, F->Current.NumSeeks,
+		     F->Current.NumReads);
+	NumBytes += F->Current.NumBytes;
+	NumSeeks += F->Current.NumSeeks;
+	NumReads += F->Current.NumReads;
+      }
+    else
+      {
+	Add_Stats (S_File, "total", "%7.1f kB (%3d seeks, %7d reads)",
+		   (double) NumBytes / 1024, NumSeeks, NumReads);
+	NumSeeks = NumReads = NumBytes = 0;
+      }
+
+}
+
+
+static void 
+File_Stats (query_data * qd)
+{
+  StatFile (qd->File_comp_dict);
+  StatFile (qd->File_fast_comp_dict);
+  StatFile (qd->File_text_idx_wgt);
+  StatFile (qd->File_text);
+  StatFile (qd->File_stem);
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (qd->sd->sdh.indexed)
+    {
+      StatFile (qd->File_stem1);
+      StatFile (qd->File_stem2);
+      StatFile (qd->File_stem3);
+    }
+
+  StatFile (qd->File_invf);
+  StatFile (qd->File_weight_approx);
+  StatFile (qd->File_text_idx);
+  StatFile ((File *) (-1));
+}
+
+
+char *
+get_query (query_data * qd)
+{
+  char *line, *LinePtr;
+  WritePrompt ();
+  do
+    {
+      do
+	{
+	  line = GetMultiLine ();
+	  if (line == NULL)
+	    {
+	      if (stdin == InFile)
+		return (NULL);	/* EOF */
+	      if (InPipe)
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+		_pclose (InFile);
+#else
+		pclose (InFile);
+#endif
+	      else
+		fclose (InFile);
+	      InPipe = 0;
+	      InFile = stdin;
+	    }
+	}
+      while (line == NULL);
+      LinePtr = ProcessCommands (line, qd);
+      if (CommandsErrorStr)
+	fprintf (stderr, "%s\n", CommandsErrorStr);
+    }
+  while (*LinePtr == '\0' && !Quitting);
+  return (LinePtr);
+}
+
+
+/* This is executed when a SIGPIPE is detected
+   i.e. If some one quits out of the PAGER, this is executed */
+#ifdef HAVE_SIGCONTEXT
+static RETSIGTYPE 
+SIGPIPE_handler (int sig, int code,
+		 struct sigcontext *scp, char *addr)
+#else
+static RETSIGTYPE 
+SIGPIPE_handler (int sig)
+#endif
+{
+  /* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  signal (sig, SIG_IGN);
+#else
+  signal (SIGPIPE, SIG_IGN);
+#endif
+  PagerRunning = 0;
+}
+
+/* This is executed when a SIGINT (i.e. CTRL-C) is detected */
+#ifdef  HAVE_SIGCONTEXT
+static RETSIGTYPE 
+SIGINT_handler (int sig, int code,
+		struct sigcontext *scp, char *addr)
+#else
+static RETSIGTYPE 
+SIGINT_handler (int sig)
+#endif
+{
+  Ctrl_C = 1;
+}
+
+
+
+static char *post_proc = NULL;
+
+
+
+void 
+GetPostProc (char *line)
+{
+  char *start, *finish;
+  if (post_proc)
+    {
+      Xfree (post_proc);
+      post_proc = NULL;
+    }
+  start = strchr (line, '\"');
+  finish = strrchr (line, '\"');
+  if (start != finish)
+    {
+      /* found a pattern */
+      *finish = '\0';
+      post_proc = Xstrdup (start + 1);
+      strcpy (start, finish + 1);
+      if (BooleanEnv (GetEnv ("verbatim"), 1) == 0)
+	{
+	  char *s;
+	  s = re_comp (post_proc);
+	  if (!s)
+	    {
+	      Xfree (post_proc);
+	      post_proc = NULL;
+	    }
+	}
+    }
+  else if (start != NULL)
+    {
+      /* found a single speech mark. Delete It. */
+      strcpy (start, start + 1);
+    }
+}
+
+int 
+PostProc (char *UDoc, int verbatim)
+{
+  if (!post_proc)
+    return 1;
+
+  if (verbatim) {
+    return (strstr (UDoc, post_proc) != NULL);
+  }
+  return re_exec ((char *) UDoc);
+}
+
+
+
+static DocEntry *
+in_chain (int para, int ip, DocEntry * dc)
+{
+  while (dc)
+    {
+      if (dc->DocNum - ip == para)
+	return dc;
+      dc = dc->Next;
+    }
+  return NULL;
+}
+
+/* num should be greater than or equal to 1 */
+int 
+RawDocOutput (query_data * qd, u_long num, FILE * Output)
+{
+  static last_pos = 0;
+  static u_char *c_buffer = 0;
+  static int buf_len = -1;
+  static u_char *uc_buffer = 0;
+  u_long pos, len;
+  int ULen;
+
+  FetchDocStart (qd, num, &pos, &len);
+
+  if ((int) len > buf_len)
+    {
+      if (c_buffer)
+	{
+	  Xfree (c_buffer);
+	  Xfree (uc_buffer);
+	}
+      if (!(c_buffer = Xmalloc (len)))
+	return -1;
+      if (!(uc_buffer = Xmalloc ((int) (qd->td->cth.ratio * 1.01 *
+					len) + 100)))
+	return -1;
+      buf_len = len;
+    }
+  if (last_pos != pos)
+    Fseek (qd->td->TextFile, pos, 0);
+  Fread (c_buffer, 1, len, qd->td->TextFile);
+  last_pos = pos + len;
+  DecodeText (qd->cd, c_buffer, len, uc_buffer, &ULen);
+  fwrite (uc_buffer, ULen, sizeof (u_char), Output);
+  return 0;
+}
+
+
+void 
+StringOut (FILE * Output, char *string,
+	   int intvalid, unsigned long intval,
+	   int floatvalid, double floatval)
+{
+  char *s;
+  for (s = string; *s; s++)
+    if (*s == '%' &&
+	(*(s + 1) == 'n' || *(s + 1) == 'w' || *(s + 1) == '%'))
+      {
+	s++;
+	switch (*s)
+	  {
+	  case 'n':
+	    if (intvalid)
+	      fprintf (Output, "%lu", intval);
+	    else
+	      fprintf (Output, "%%n");
+	    break;
+	  case 'w':
+	    if (floatvalid)
+	      fprintf (Output, "%f", floatval);
+	    else
+	      fprintf (Output, "%%w");
+	    break;
+	  case '%':
+	    fputc ('%', Output);
+	  }
+      }
+    else
+      fputc (*s, Output);
+}
+
+
+void 
+HeaderOut (FILE * Output, u_char * UDoc, unsigned long ULen, int heads_length)
+{
+  int i, space = 1, num = 0;
+  for (i = 0; i < ULen && num < heads_length; i++)
+    {
+      char c = UDoc[i];
+      if (c == '\02')
+	break;
+
+      if (isspace (c) || c == '\01' || c == '\03')
+	{
+	  if (!space)
+	    {
+	      fputc (' ', Output);
+	      num++;
+	    }
+	  space = 1;
+	}
+      else
+	{
+	  space = 0;
+	  fputc (c, Output);
+	  num++;
+	}
+    }
+}
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) || defined(NZDL)
+void PrintDocNum(FILE *output, char query_type,
+		 int docnum, int indexnum, float weight)
+{
+  if (query_type == 'R' || query_type == 'A')
+    fprintf(output, "%7d.%-7d  %6.4f\n", docnum, indexnum, weight);
+  else
+    fprintf(output, "%7d.%-7d\n", docnum, indexnum);
+}
+#endif
+
+static int 
+ProcessDocs (query_data * qd, int num, int verbatim,
+	     char OutputType, FILE * Output)
+{
+  int max_buf = 0;
+  int DocCount = 0;
+  char *doc_sepstr = NULL;
+  char *para_sepstr = NULL;
+  char *para_start = NULL;
+  int heads_length = atoi (GetDefEnv ("heads_length", "50"));
+  char QueryType = get_query_type ();
+  int need_text = (OutputType == OUTPUT_TEXT || OutputType == OUTPUT_HILITE ||
+		   OutputType == OUTPUT_HEADERS || OutputType == OUTPUT_SILENT || 
+		   post_proc); /* [RJM June 1997 -- fixing post retrieval scan] */
+
+  if (OutputType == OUTPUT_TEXT || OutputType == OUTPUT_HILITE)
+    {
+      if (QueryType == QUERY_APPROX || QueryType == QUERY_RANKED)
+	{
+	  doc_sepstr = de_escape_string (
+				    Xstrdup (GetDefEnv ("ranked_doc_sepstr",
+			   "---------------------------------- %n %w\\n")));
+	}
+      else
+	{
+	  doc_sepstr = de_escape_string (
+					  Xstrdup (GetDefEnv ("doc_sepstr",
+			      "---------------------------------- %n\\n")));
+	}
+      para_sepstr = de_escape_string (
+				       Xstrdup (GetDefEnv ("para_sepstr",
+				  "\\n######## PARAGRAPH %n ########\\n")));
+
+      para_start = de_escape_string (
+				      Xstrdup (GetDefEnv ("para_start",
+					    "***** Weight = %w *****\\n")));
+    }
+
+  if (need_text)
+    {
+      max_buf = atoi (GetDefEnv ("buffer", "1048576"));
+    }
+
+  do
+    {
+      u_char *UDoc = NULL;
+      unsigned long ULen;
+
+      if (need_text)
+	{
+	  /* load the compressed text */
+	  if (LoadCompressedText (qd, max_buf))
+	    {
+	      Message ("Unable to load compressed text.");
+	      FatalError (1, "This is probably due to lack of memory.");
+	    }
+
+	  /* uncompress the loaded text */
+	  UDoc = GetDocText (qd, &ULen);
+	  if (UDoc == NULL)
+	    FatalError (1, "UDoc is unexpectedly NULL");
+	}
+
+      if (!UDoc || PostProc ((char *) UDoc, verbatim))
+	{
+	  switch (OutputType)
+	    {
+	    case OUTPUT_COUNT:
+	    case OUTPUT_SILENT:
+	      break;
+	    case OUTPUT_DOCNUMS:	/* This prints out the docnums string */
+	      if (PagerRunning)
+		{
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) || defined(NZDL)
+		  int doc_num = GetDocNum(qd);
+
+		  if (qd->paragraph)
+		    {
+		      if (qd->id->ifh.InvfLevel == 3 &&
+			  (QueryType == 'R' || QueryType == 'A'))
+			{
+			  /* Print weights for each paragraph in document */
+			  
+
+			  int true_doc_num = GetDocNumFromParaNum(qd, doc_num);
+
+			  /* Get number of paragraphs in this document */
+
+			  int num_paragraphs = 
+			    qd->paragraph[true_doc_num]-qd->paragraph[true_doc_num-1];
+
+			  int init_para = FetchInitialParagraph(qd->td,
+								doc_num);
+			  DocEntry *de, *doc_chain = GetDocChain(qd);
+			  int i;
+
+			  for (i = 0; i < num_paragraphs; i++)
+			    {
+			      if ((de = in_chain(i, init_para, doc_chain)))
+				PrintDocNum(Output, QueryType,
+					    true_doc_num, init_para+i,
+					    de->Weight);
+			    }
+			}
+		      else
+			PrintDocNum(Output, QueryType,
+				    GetDocNumFromParaNum(qd, GetDocNum(qd)),
+				    GetDocNum(qd),
+				    GetDocWeight(qd));
+		    }
+		  else
+		    {
+		      PrintDocNum(Output, QueryType,
+				  doc_num, doc_num, GetDocWeight(qd));
+		    }
+#else
+		fprintf (Output, "%7d   %6.4f   %7lu\n", GetDocNum (qd),
+			 GetDocWeight (qd), GetDocCompLength (qd));
+#endif
+		}
+	      break;
+	    case OUTPUT_HEADERS:	/* This prints out the headers of the documents */
+	      if (PagerRunning)
+		fprintf (Output, "%d ", GetDocNum (qd));
+	      HeaderOut (Output, UDoc, ULen, heads_length);
+	      if (PagerRunning)
+		fputc ('\n', Output);
+	      break;
+#if TREC_MODE
+	    case OUTPUT_EXTRAS:	/* This prints out the docnums string */
+	      if (PagerRunning && trec_ids)
+		{
+		  long DN, PN = GetDocNum (qd) - 1;
+		  if (trec_paras)
+		    DN = trec_paras[PN];
+		  else
+		    DN = PN;
+		  fprintf (Output, "%-14.14s  %8ld  %10.5f\n",
+			   &trec_ids[DN * 14], PN + 1, GetDocWeight (qd));
+		}
+	      break;
+#endif
+	    case OUTPUT_TEXT:
+	    case OUTPUT_HILITE:
+	      {
+		int j, para = -1, curr_para = 0;
+		int init_para = -1;
+		DocEntry *de, *doc_chain = NULL;
+		register char ch = ' ';
+		register char lch = '\n';
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) || defined(NZDL)
+		if (qd->id->ifh.InvfLevel == 3)
+		  {
+		    init_para = FetchInitialParagraph(qd->td, GetDocNum(qd));
+		    
+		    StringOut(Output, para_sepstr, 
+			      1, init_para+curr_para,
+			      0, 0);
+
+		  }
+		else
+		  StringOut(Output, doc_sepstr, 
+			    1, GetDocNum(qd),
+			    QueryType == 'A' || QueryType == 'R',
+			    GetDocWeight(qd));
+
+#else
+		int p_on = 0;
+
+		if (PagerRunning)
+		  {
+		    StringOut (Output, doc_sepstr,
+			       1, GetDocNum (qd),
+			       QueryType == 'A' || QueryType == 'R',
+			       GetDocWeight (qd));
+		  }
+		if (qd->id->ifh.InvfLevel == 3)
+		  {
+		    init_para = FetchInitialParagraph (qd->td, GetDocNum (qd));
+		    doc_chain = GetDocChain (qd);
+		    para = GetDocNum (qd) - init_para;
+
+		    StringOut (Output, para_sepstr,
+			       1, curr_para + 1,
+			       0, 0);
+
+		    if ((de = in_chain (0, init_para, doc_chain)))
+		      StringOut (Output, para_start,
+				 0, 0,
+				 1, de->Weight);
+
+		    if (doc_chain->DocNum - init_para == 0)
+		      p_on = 1;
+		  }
+#endif
+		for (j = 0; j < ULen; j++)
+		  {
+		    ch = UDoc[j];
+		    switch (ch)
+		      {
+		      case '\02':
+			break;
+		      case '\01':
+			ch = '\n';
+		      case '\03':
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(PARADOCNUM) || defined(NZDL)
+			/* print paragraph numbers only if this is
+			   a level 3 index */
+			if (qd->id->ifh.InvfLevel == 3)
+			  {
+			    curr_para++;
+			    StringOut(Output, para_sepstr, 
+				      1, init_para+curr_para,
+				      0, 0);
+			  }
+#else
+			p_on = 0;
+			curr_para++;
+			StringOut (Output, para_sepstr,
+				   1, curr_para + 1,
+				   0, 0);
+			lch = *(strchr (para_sepstr, '\0') - 1);
+			if ((de = in_chain (curr_para, init_para, doc_chain)))
+			  StringOut (Output, para_start,
+				     0, 0,
+				     1, de->Weight);
+			if (doc_chain &&
+			    doc_chain->DocNum - init_para == curr_para)
+			  p_on = 1;
+#endif
+			break;
+		      default:
+			{
+			  if (PagerRunning)
+			    {
+			      fputc (ch, Output);
+/* [RPAP - Feb 97: NZDL Additions] */
+#if !defined(PARADOCNUM) && !defined(NZDL)
+			      if (p_on && isprint (ch))
+				{
+				  fputc ('\b', Output);
+				  fputc ('_', Output);
+				}
+#endif
+			    }
+
+			  lch = ch;
+			}
+		      }
+		  }
+		if (PagerRunning && lch != '\n')
+		  fputc ('\n', Output);
+/* [RPAP - Feb 97: NZDL Additions] */
+#if !defined(PARADOCNUM) && !defined(NZDL)
+		p_on = 0;
+#endif
+	      }
+	    }
+	  if (PagerRunning)
+	    fflush (Output);
+
+	  DocCount++; /* moved within if statement [RJM June 1997 -- fixing post retrieval scan] */
+	}
+    }
+  while (NextDoc (qd) && PagerRunning && (!Ctrl_C));
+
+  if (need_text)
+    {
+      FreeTextBuffer (qd);
+    }
+
+  if (OutputType == OUTPUT_TEXT || OutputType == OUTPUT_HILITE)
+    {
+      Xfree (doc_sepstr);
+      Xfree (para_sepstr);
+      Xfree (para_start);
+    }
+
+  return (DocCount);
+}
+
+
+void 
+output_terminator (FILE * out)
+{
+  char *terminator = Xstrdup (GetDefEnv ("terminator", ""));
+  de_escape_string (terminator);
+  fputs (terminator, out);
+  Xfree (terminator);
+}
+
+
+
+
+/* MoreDocs () */
+/* Displays all documents in list  DocList. */
+/* Documents are fetched, then decompressed and displayed according to the */
+/* format implied in  FormString(). */
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+# define HILITE_PAGER "mg_hilite_words.exe"
+#else
+# define HILITE_PAGER "mg_hilite_words"
+#endif
+
+#define MAX_HILITE_PAGER_STR 80	/* for command & its options */
+
+static void 
+MoreDocs (query_data * qd, char *Query, char OutputType)
+{
+  static char terms_str[MAXTERMSTRLEN + 1];
+  int DocCount = 0;		/* number of actual matches */
+  FILE *Output = NULL;
+  int using_pipe = 0;
+  char *pager = NULL;
+
+  Ctrl_C = 0;
+
+  qd->num_of_ans = qd->DL->num;
+
+  /* [RPAP - Feb 97: WIN32 Port] */
+#ifndef __WIN32__
+  signal (SIGPIPE, SIGPIPE_handler);
+#endif
+  signal (SIGINT, SIGINT_handler);
+
+  PagerRunning = 1;
+  if (isatty (fileno (OutFile)) && GetEnv ("pager") &&
+      OutputType != OUTPUT_HILITE &&
+      OutputType != OUTPUT_SILENT && OutputType != OUTPUT_COUNT)
+    {
+      pager = GetEnv ("pager");
+    }
+  else if (isatty (fileno (OutFile)) && OutputType == OUTPUT_HILITE)
+    {
+      /* concat the pager and its word argument strings */
+      ConvertTermsToString (qd->TL, terms_str);
+      pager = Xmalloc (MAX_HILITE_PAGER_STR + strlen (terms_str) + 1);
+      if (!pager)
+	{
+	  fprintf (stderr, "Unable to allocate memory for highlighting\n");
+	  return;
+	}
+      sprintf (pager, "%s --style=%s --pager=%s --stem_method=%ld --stemmer=%ld %s",
+	       HILITE_PAGER,
+	       GetEnv ("hilite_style"),
+	       GetEnv ("pager"),
+	       qd->sd->sdh.stem_method,
+	       qd->sd->sdh.stemmer_num,
+	       terms_str);
+
+    }
+  else
+    {
+      Output = OutFile;
+    }
+
+/* [RPAP - Feb 97: NZDL Additions] */
+#if defined(OUTPUTSTEMMEDWORDS) || defined(NZDL)
+  if (!isatty(fileno(OutFile)) && get_query_type() != QUERY_DOCNUMS)
+    {
+      ConvertTermsToString(qd->TL, terms_str);
+      fprintf(Output, "%s\n", terms_str);
+    }
+#endif
+  if (pager)
+    {
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+      Output = _popen (pager, "w");
+#else
+      Output = popen (pager, "w");
+#endif
+      using_pipe = (Output != NULL);
+      if (!using_pipe)
+	{
+	  fprintf (stderr, "Unable to run \"%s\"\n", pager);
+	  return;
+	}
+    }
+
+
+  if (qd->DL->num > 0)
+    {
+      if (OutputType == OUTPUT_COUNT && !post_proc)
+	DocCount = qd->DL->num;
+      else {
+	DocCount = ProcessDocs (qd, qd->DL->num,
+				BooleanEnv (GetEnv ("verbatim"), 1),
+				OutputType, Output);
+      }
+    }
+
+  if (PagerRunning)
+    {
+      output_terminator (Output);
+      fflush (Output);
+    }
+
+  if (OutputType == OUTPUT_HILITE && pager)
+    free (pager);		/* as needed to malloc to create the pager string */
+
+  if (using_pipe)
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+    _pclose (Output);
+#else
+    pclose (Output);
+#endif
+
+  if (qd->DL->num == 0)
+    fprintf (stderr, "No entries correspond to that query.\n");
+  else
+    {
+      if (OutputType == OUTPUT_COUNT)
+	fprintf (stderr, "%d documents match.\n", DocCount);
+      else
+	fprintf (stderr, "%d documents retrieved.\n", DocCount);
+    }
+
+  signal (SIGINT, SIG_DFL);
+}
+
+
+void 
+start_up_stats (query_data * qd, InitQueryTimes iqt)
+{
+  Clear_Stats ();
+  if (BooleanEnv (GetEnv ("timestats"), 0) ||
+      BooleanEnv (GetEnv ("briefstats"), 0))
+    StartUpTimeStats (&iqt);
+
+  if (BooleanEnv (GetEnv ("diskstats"), 0) ||
+      BooleanEnv (GetEnv ("briefstats"), 0))
+    File_Stats (qd);
+
+  if (BooleanEnv (GetEnv ("memstats"), 0) ||
+      BooleanEnv (GetEnv ("briefstats"), 0))
+    MemStats (qd);
+
+}
+
+
+void 
+shut_down_stats (query_data * qd, ProgTime * start,
+		 ProgTime * invf, ProgTime * text)
+{
+  Clear_Stats ();
+  if (BooleanEnv (GetEnv ("timestats"), 0) ||
+      BooleanEnv (GetEnv ("briefstats"), 0))
+    QueryTimeStats (start, invf, text);
+
+  if (BooleanEnv (GetEnv ("diskstats"), 0) ||
+      BooleanEnv (GetEnv ("briefstats"), 0))
+    {
+      TransFileStats (qd);
+      File_Stats (qd);
+    }
+
+  if (BooleanEnv (GetEnv ("sizestats"), 0))
+    TotalSizeStats (qd);
+}
+
+
+
+char *wordfreqword2str (u_char * s)
+{
+  static char buf[1024];
+  int i, len = (int) *s++;
+
+  for (i = 0; i < len; i++)
+    {
+      buf[i] = (char)s[i];
+    }
+  buf[len] = '\0';
+
+  return buf;
+}
+
+
+/* [RPAP - Feb 97: Term Frequency] */
+/*********************************
+ * PrintQueryTermFreq
+ *
+ * Prints the query terms and their respective frequencies within the collection
+ *********************************/
+void
+PrintQueryTermFreqs (QueryTermList *qtl)
+{
+  int i;
+
+  /* Print the number of terms */
+  fprintf (OutFile, "%d\n", qtl->num);
+
+  /* Print the terms and their respective frequency within the collection */
+  for (i = 0; i < qtl->num; i++)
+    if (qtl->QTE[i].stem_method == -1)
+      /* Using default stem method - don't print stem method beside term */
+      fprintf (OutFile, "%s %d\n", wordfreqword2str (qtl->QTE[i].Term), qtl->QTE[i].Count);
+    else
+      /* Term was forced with a stem, print stem method with term */
+      fprintf (OutFile, "%s#%d %d\n", wordfreqword2str (qtl->QTE[i].Term), qtl->QTE[i].stem_method, qtl->QTE[i].Count);
+}
+
+
+void 
+query (void)
+{
+  ProgTime TotalStartTime, TotalInvfTime, TotalTextTime;
+  InitQueryTimes iqt;
+  query_data *qd;
+
+  TotalStartTime.RealTime = TotalStartTime.CPUTime = 0;
+  TotalInvfTime.RealTime = TotalInvfTime.CPUTime = 0;
+  TotalTextTime.RealTime = TotalTextTime.CPUTime = 0;
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  qd = InitQuerySystem (GetDefEnv ("mgdir", ".\\"),
+                        GetDefEnv ("mgname", ""),
+			GetDefEnv ("textname", NULL), /* [RJM 06/97: text filename] */
+			&iqt);
+#else
+  qd = InitQuerySystem (GetDefEnv ("mgdir", "./"),
+                        GetDefEnv ("mgname", ""),
+			GetDefEnv ("textname", NULL), /* [RJM 06/97: text filename] */
+                        &iqt);
+#endif
+
+  if (!qd)
+    FatalError (1, mg_errorstrs[mg_errno], mg_error_data);
+  start_up_stats (qd, iqt);
+
+
+  while (1)
+    {
+      ProgTime StartTime, InvfTime, TextTime;
+      char QueryType;
+      char OutputType;
+      char *line;
+      ResetFileStats (qd);
+      qd->max_mem_in_use = qd->mem_in_use = 0;
+
+      qd->tot_hops_taken += qd->hops_taken;
+      qd->tot_num_of_ptrs += qd->num_of_ptrs;
+      qd->tot_num_of_accum += qd->num_of_accum;
+      qd->tot_num_of_terms += qd->num_of_terms;
+      qd->tot_num_of_ans += qd->num_of_ans;
+      qd->tot_text_idx_lookups += qd->text_idx_lookups;
+      qd->hops_taken = qd->num_of_ptrs = 0;
+      qd->num_of_accum = qd->num_of_ans = qd->num_of_terms = 0;
+      qd->text_idx_lookups = 0;
+
+      Display_Stats (stderr);
+      Clear_Stats ();
+      line = get_query (qd);
+      if (!line || Quitting)
+	break;
+
+      GetPostProc (line);
+
+      GetTime (&StartTime);
+
+      FreeQueryDocs (qd);
+
+      QueryType = get_query_type ();
+      OutputType = get_output_type ();
+      /* No point in hiliting words on a docnum query */
+      if (OutputType == OUTPUT_HILITE && QueryType == QUERY_DOCNUMS)
+	OutputType = OUTPUT_TEXT;
+
+      switch (QueryType)
+	{
+	case QUERY_BOOLEAN:
+	  {
+	    char *maxdocs;
+	    BooleanQueryInfo bqi;
+	    maxdocs = GetDefEnv ("maxdocs", "all");
+	    bqi.MaxDocsToRetrieve = strcmp (maxdocs, "all") ? atoi (maxdocs) : -1;
+	    /* [RPAP - Jan 97: Stem Index Change] */
+	    if (qd->sd->sdh.indexed)
+	      BooleanQuery (qd, line, &bqi, (BooleanEnv (GetEnv ("casefold"), 0) |
+					     (BooleanEnv (GetEnv ("stem"), 0) << 1)));
+	    else
+	      BooleanQuery (qd, line, &bqi, qd->sd->sdh.stem_method);
+
+	    break;
+	  }
+	case QUERY_APPROX:
+	case QUERY_RANKED:
+	  {
+	    char *maxdocs;
+	    char *maxterms;
+	    char *maxaccum;
+	    RankedQueryInfo rqi;
+	    maxdocs = GetDefEnv ("maxdocs", "all");
+	    maxterms = GetDefEnv ("max_terms", "all");
+	    maxaccum = GetDefEnv ("max_accumulators", "all");
+	    rqi.Sort = BooleanEnv (GetEnv ("sorted_terms"), 0);
+	    rqi.QueryFreqs = BooleanEnv (GetEnv ("qfreq"), 1);
+	    rqi.Exact = QueryType == QUERY_RANKED;
+	    rqi.MaxDocsToRetrieve = strcmp (maxdocs, "all") ? atoi (maxdocs) : -1;
+	    rqi.MaxTerms = strcmp (maxterms, "all") ? atoi (maxterms) : -1;
+	    rqi.MaxParasToRetrieve = rqi.MaxDocsToRetrieve;
+	    if (qd->id->ifh.InvfLevel == 3 && GetEnv ("maxparas"))
+	      rqi.MaxParasToRetrieve = atoi (GetEnv ("maxparas"));
+	    rqi.AccumMethod = toupper (*GetDefEnv ("accumulator_method", "A"));
+	    rqi.MaxAccums = strcmp (maxaccum, "all") ? atoi (maxaccum) : -1;
+	    rqi.HashTblSize = IntEnv (GetEnv ("hash_tbl_size"), 1000);
+	    rqi.StopAtMaxAccum = BooleanEnv (GetEnv ("stop_at_max_accum"), 0);
+	    rqi.skip_dump = GetEnv ("skip_dump");
+	    RankedQuery (qd, line, &rqi);
+	    break;
+	  }
+	case QUERY_DOCNUMS:
+	  {
+	    DocnumsQuery (qd, line);
+	    break;
+	  }
+	}
+
+      GetTime (&InvfTime);
+
+      /* [RPAP - Feb 97: Term Frequency] */
+      if (qd->QTL && BooleanEnv (GetEnv ("term_freq"), 0))
+	PrintQueryTermFreqs (qd->QTL);
+
+      if (qd->DL)
+	MoreDocs (qd, line, OutputType);
+
+      GetTime (&TextTime);
+
+      if (BooleanEnv (GetEnv ("timestats"), 0) ||
+	  BooleanEnv (GetEnv ("briefstats"), 0))
+	QueryTimeStats (&StartTime, &InvfTime, &TextTime);
+
+      if (BooleanEnv (GetEnv ("diskstats"), 0) ||
+	  BooleanEnv (GetEnv ("briefstats"), 0))
+	File_Stats (qd);
+
+      if (BooleanEnv (GetEnv ("memstats"), 0) ||
+	  BooleanEnv (GetEnv ("briefstats"), 0))
+	MemStats (qd);
+
+      if (BooleanEnv (GetEnv ("sizestats"), 0))
+	SizeStats (qd);
+
+      TotalInvfTime.RealTime += InvfTime.RealTime - StartTime.RealTime;
+      TotalInvfTime.CPUTime += InvfTime.CPUTime - StartTime.CPUTime;
+      TotalTextTime.RealTime += TextTime.RealTime - StartTime.RealTime;
+      TotalTextTime.CPUTime += TextTime.CPUTime - StartTime.CPUTime;
+    }
+
+  if (isatty (fileno (InFile)) && !Quitting)
+    fprintf (stderr, "\n");
+
+  shut_down_stats (qd, &TotalStartTime, &TotalInvfTime, &TotalTextTime);
+
+  Display_Stats (stderr);
+
+}
+
+
+void 
+search_for_collection (char *name)
+{
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  char *dir = GetDefEnv ("mgdir", ".\\");
+#else
+  char *dir = GetDefEnv ("mgdir", "./");
+#endif
+  char buffer[512];
+  struct stat stat_buf;
+  if (strrchr (dir, '/') && *(strrchr (dir, '/') + 1) != '\0')
+    {
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+      sprintf (buffer, "%s", dir);
+#else
+      sprintf (buffer, "%s/", dir);
+#endif
+      SetEnv ("mgdir", buffer, NULL);
+      dir = GetEnv ("mgdir");
+    }
+
+  sprintf (buffer, "%s.text", name);
+  if (stat (buffer, &stat_buf) != -1)
+    {
+      if ((stat_buf.st_mode & S_IFREG) != 0)
+	{
+	  /* The name is a directory */
+	  SetEnv ("mgname", name, NULL);
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+          SetEnv ("mgdir", ".\\", NULL);
+#else
+	  SetEnv ("mgdir", "./", NULL);
+#endif
+	  return;
+	}
+    }
+
+  sprintf (buffer, "%s%s", dir, name);
+  if (stat (buffer, &stat_buf) != -1)
+    {
+      if ((stat_buf.st_mode & S_IFDIR) != 0)
+	{
+	  /* The name is a directory */
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+          sprintf (buffer, "%s%s", name, name);
+#else
+	  sprintf (buffer, "%s/%s", name, name);
+#endif
+	  SetEnv ("mgname", buffer, NULL);
+	  return;
+	}
+    }
+
+  /* Look in the current directory last */
+  if (stat (name, &stat_buf) != -1)
+    {
+      if ((stat_buf.st_mode & S_IFDIR) != 0)
+	{
+	  /* The name is a directory */
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+          sprintf (buffer, "%s%s", name, name);
+          SetEnv ("mgdir", ".\\", NULL);
+#else
+	  sprintf (buffer, "%s/%s", name, name);
+          SetEnv ("mgdir", "./", NULL);
+#endif
+	  SetEnv ("mgname", buffer, NULL);
+	  return;
+	}
+    }
+
+  SetEnv ("mgname", name, NULL);
+}
+
+/* main () */
+/* Initialises global variables based on command line switches, and opens */
+/* files.  Then calls  query ()  to perform the querying. */
+int main (int argc, char **argv)
+{
+  ProgTime StartTime;
+  int decomp = 0;
+  int ch;
+
+  msg_prefix = argv[0];
+  GetTime (&StartTime);
+
+  /* Initialise the environment with default values */
+
+  InitEnv ();
+
+  read_mgrc_file ();
+
+  OutFile = stdout;
+  InFile = stdin;
+
+  opterr = 0;
+  /* [RJM 06/97: text filename] */
+  while ((ch = getopt (argc, argv, "Df:d:t:h")) != -1) {
+    switch (ch) {
+      case 'f':
+	SetEnv ("mgname", optarg, NULL);
+	break;
+      case 'd':
+	SetEnv ("mgdir", optarg, NULL);
+	break;
+      case 't': /* [RJM 06/97: text filename] */
+	SetEnv ("textname", optarg, NULL);
+	break;
+      case 'D':
+	decomp = 1;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-D] [-f base name of collection] "
+		 "[-t base name of files for text] " /* [RJM 06/97: text filename] */
+		 "[-d data directory] [collection]\n", argv[0]);
+	exit (1);
+    }      
+  }
+
+  PushEnv ();
+
+  if (decomp == 0)
+    {
+
+      Init_ReadLine ();
+
+      /* write a first prompt, let the user start thinking */
+      if (!BooleanEnv (GetEnv ("expert"), 0) && isatty (fileno (InFile)))
+	{
+	  fprintf (stderr, "\n\n\t     FULL TEXT RETRIEVAL QUERY PROGRAM\n");
+	  fprintf (stderr, "%24s%s\n\n", "", *"21 Mar 1994" == '%' ? __DATE__ : "21 Mar 1994");
+	  fprintf (stderr, "\n");
+	  fprintf (stderr, "  mgquery version " VERSION ", Copyright (C) 1994 Neil Sharman\n");
+	  fprintf (stderr, "  mgquery comes with ABSOLUTELY NO WARRANTY; for details type `.warranty'\n");
+	  fprintf (stderr, "  This is free software, and you are welcome to redistribute it\n");
+	  fprintf (stderr, "  under certain conditions; type `.conditions' for details.\n");
+	  fprintf (stderr, "\n");
+	}
+    }
+  if (optind < argc)
+    search_for_collection (argv[optind]);
+
+  if (decomp == 0)
+    {
+      query ();
+    }
+  else
+    {
+      int i;
+      InitQueryTimes iqt;
+      query_data *qd;
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+      qd = InitQuerySystem (GetDefEnv ("mgdir", ".\\"),
+                            GetDefEnv ("mgname", ""),
+                            GetDefEnv ("textname", NULL), /* [RJM 06/97: text filename] */
+                            &iqt);
+#else
+      qd = InitQuerySystem (GetDefEnv ("mgdir", "./"),
+			    GetDefEnv ("mgname", ""),
+                            GetDefEnv ("textname", NULL), /* [RJM 06/97: text filename] */
+			    &iqt);
+#endif
+      if (!qd)
+	FatalError (1, mg_errorstrs[mg_errno], mg_error_data);
+
+
+      start_up_stats (qd, iqt);
+
+      Display_Stats (stderr);
+      for (i = 0; i < qd->td->cth.num_of_docs; i++)
+	{
+	  RawDocOutput (qd, i + 1, stdout);
+	  putc ('\2', stdout);
+	}
+      Message ("%s", ElapsedTime (&StartTime, NULL));
+
+      FinishQuerySystem (qd);
+    }
+
+  UninitEnv ();
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.1	(revision 21083)
@@ -0,0 +1,131 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgstat 1 \*(Dt CITRI
+.SH NAME
+mgstat \- print out statistics about a document collection
+.SH SYNOPSIS
+.B mgstat
+[
+.B \-h
+]
+[
+.B \-E
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgstat
+prints out various statistics about an existing
+.BR mg (1)
+document collection.  Depending on the size of the collection, sizes
+will be printed in either kilobytes or megabytes.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stdout .
+.TP
+.B \-E
+This option forces sizes to be printed in bytes rather than kilobytes
+or megabytes.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text
+Compressed documents.
+.TP
+.B *.invf
+Inverted file.
+.TP
+.B *.text.idx.wgt
+Interleaved index into the compressed documents and document weights.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.TP
+.B *.invf.dict.blocked
+Compressed stemmed dictionary and index into the inverted file merged
+into an inverted file.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.invf.chunk
+Maps stemmed terms from occurrence order to lexical order.
+.TP
+.B *.invf.chunk.trans
+Describes where the source text is broken up into chunks for the
+inversion pass.
+.TP
+.B *.invf.dict.hash
+A perfect hash function for the terms in the stemmed dictionary.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_compression_dict (1),
+.BR mg_fast_comp_dict (1),
+.BR mg_get (1),
+.BR mg_invf_dict (1),
+.BR mg_invf_dump (1),
+.BR mg_invf_rebuild (1),
+.BR mg_passes (1),
+.BR mg_perf_hash_build (1),
+.BR mg_text_estimate (1),
+.BR mg_weights_build (1),
+.BR mgbilevel (1),
+.BR mgbuild (1),
+.BR mgdictlist (1),
+.BR mgfelics (1),
+.BR mgquery (1),
+.BR mgtic (1),
+.BR mgticbuild (1),
+.BR mgticdump (1),
+.BR mgticprune (1),
+.BR mgticstat (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgstat.c	(revision 21083)
@@ -0,0 +1,403 @@
+/**************************************************************************
+ *
+ * mgstat.c -- Program to generate statistics on a text collection
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "mg.h"
+#include "words.h"
+#include "invf.h"
+#include "text.h"
+#include "longlong.h"
+
+/*
+   $Log$
+   Revision 1.2  2001/09/21 12:46:42  kjm18
+   updated mg to be in line with mg_1.3f. Now uses long long for some variables
+   to enable indexing of very large collections.
+
+   Revision 1.1  1999/08/10 21:18:19  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:50  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:31  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:41:59  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+char *search_for_collection (char *name);
+int process_file (char *, char *, int);
+void ProcessDict (char *);
+void ProcessStem (char *);
+long ProcessStemBlk (char *name);  /* [RPAP - Jan 97: Stem Index Change] */
+
+static mg_ullong inputbytes = 0;
+static mg_ullong total = 0;
+
+
+
+
+
+int main (int argc, char **argv)
+{
+  mg_ullong sub_total;
+  int fast;
+  char *file_name = "";
+  int ch;
+  int exact = 0;
+  long indexed = 0; /* [RPAP - Jan 97: Stem Index Change] */
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "Ehf:d:")) != -1)
+    switch (ch)
+      {
+      case 'E':
+	exact = 1;
+	break;
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file]"
+		 "[-d data directory] [-h]\n", argv[0]);
+	exit (1);
+      }
+
+  if (optind < argc)
+    file_name = search_for_collection (argv[optind]);
+
+  ProcessDict (file_name);
+  ProcessStem (file_name);
+  indexed = ProcessStemBlk (file_name); /* [RPAP - Jan 97: Stem Index Change] */
+
+  {
+    char Name[256];
+    char *s;
+    sprintf (Name, FILE_NAME_FORMAT, get_basepath (), file_name, "");
+    s = strrchr (Name, '/');
+    if (s)
+      *s = '\0';
+    printf ("\nThe collection is in \"%s\"\n", Name);
+  }
+
+
+  printf ("\n\t\tFiles required by mgquery\n");
+  process_file (file_name, TEXT_SUFFIX, exact);
+  process_file (file_name, INVF_SUFFIX, exact);
+  process_file (file_name, TEXT_IDX_WGT_SUFFIX, exact);
+  process_file (file_name, APPROX_WEIGHTS_SUFFIX, exact);
+  process_file (file_name, INVF_DICT_BLOCKED_SUFFIX, exact);
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (indexed)
+    {
+      process_file (file_name, INVF_DICT_BLOCKED_1_SUFFIX, exact);
+      process_file (file_name, INVF_DICT_BLOCKED_2_SUFFIX, exact);
+      process_file (file_name, INVF_DICT_BLOCKED_3_SUFFIX, exact);
+    }
+
+  fast = process_file (file_name, TEXT_DICT_FAST_SUFFIX, exact);
+  if (!fast)
+    {
+      process_file (file_name, TEXT_DICT_SUFFIX, exact);
+      process_file (file_name, TEXT_DICT_AUX_SUFFIX, exact);
+    }
+
+
+  process_file (NULL, "SUB TOTAL", exact);
+  sub_total = total;
+  total = 0;
+
+  printf ("\n\t\tFiles NOT required by mgquery\n");
+  if (fast)
+    {
+      process_file (file_name, TEXT_DICT_SUFFIX, exact);
+      process_file (file_name, TEXT_DICT_AUX_SUFFIX, exact);
+    }
+  process_file (file_name, INVF_DICT_SUFFIX, exact);
+  process_file (file_name, INVF_IDX_SUFFIX, exact);
+  process_file (file_name, TEXT_STATS_DICT_SUFFIX, exact);
+  process_file (file_name, TEXT_IDX_SUFFIX, exact);
+  process_file (file_name, WEIGHTS_SUFFIX, exact);
+  process_file (file_name, INVF_CHUNK_SUFFIX, exact);
+  process_file (file_name, INVF_CHUNK_TRANS_SUFFIX, exact);
+  process_file (file_name, INVF_DICT_HASH_SUFFIX, exact);
+  process_file (file_name, INVF_PARAGRAPH_SUFFIX, exact);
+  process_file (NULL, "SUB TOTAL", exact);
+  total += sub_total;
+  printf ("\n");
+  process_file (NULL, "TOTAL", exact);
+  return 0;
+
+}
+
+
+
+char *
+search_for_collection (char *name)
+{
+  char *dir = get_basepath ();
+  static char buffer[512];
+  struct stat stat_buf;
+
+  /* Look in the current directory first */
+  if (stat (name, &stat_buf) != -1)
+    {
+      if (S_ISDIR(stat_buf.st_mode))
+	{
+	  /* The name is a directory */
+	  sprintf (buffer, "%s/%s", name, name);
+	  set_basepath (".");
+	  return buffer;
+	}
+    }
+
+  sprintf (buffer, "%s.text", name);
+  if (stat (buffer, &stat_buf) != -1)
+    {
+      if (S_ISREG(stat_buf.st_mode))
+	{
+	  /* The name is a directory */
+	  set_basepath (".");
+	  return name;
+	}
+    }
+  sprintf (buffer, "%s/%s", dir, name);
+  if (stat (buffer, &stat_buf) != -1)
+    {
+      if (S_ISDIR(stat_buf.st_mode))
+	{
+	  /* The name is a directory */
+	  sprintf (buffer, "%s/%s", name, name);
+	  return buffer;
+	}
+    }
+  return name;
+}
+
+
+
+
+
+
+void 
+ProcessDict (char *name)
+{
+  FILE *f;
+  compression_dict_header cdh;
+  int have_cdh = 0;
+  compressed_text_header cth;
+  int have_cth = 0;
+
+  if ((f = open_file (name, TEXT_DICT_SUFFIX, "rb", MAGIC_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      Read_cdh (f, &cdh, NULL, NULL);
+      fclose (f);
+      have_cdh = 1;
+    }
+
+  if ((f = open_file (name, TEXT_SUFFIX, "rb", MAGIC_TEXT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fread ((char *) &cth, sizeof (cth), 1, f);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(cth.num_of_docs);
+      NTOHD(cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+      NTOHUL(cth.num_of_words);
+      NTOHUL(cth.length_of_longest_doc);
+      NTOHD(cth.ratio);
+
+      fclose (f);
+      have_cth = 1;
+    }
+
+  if (have_cth)
+    {
+      inputbytes = cth.num_of_bytes;
+      printf ("Input bytes                        : %10" ULL_FS ", %8.2f Mbyte\n",
+	      cth.num_of_bytes, (double) cth.num_of_bytes / 1024 / 1024);
+      printf ("Documents                          : %10lu\n", cth.num_of_docs);
+      printf ("Words in collection [dict]         : %10lu\n", cth.num_of_words);
+      printf ("Longest doc in collection [dict]   : %10lu characters\n",
+	      cth.length_of_longest_doc);
+      printf ("Maximum ratio                      : %10.2f\n", cth.ratio);
+    }
+
+  if (have_cdh)
+    {
+      printf ("Words in dict                      : %10lu\n", cdh.num_words[1]);
+      printf ("Non-words in dict                  : %10lu\n", cdh.num_words[0]);
+      printf ("Total chars of distinct words      : %10lu\n", cdh.num_word_chars[1]);
+      printf ("Total chars of distinct non-words  : %10lu\n", cdh.num_word_chars[0]);
+    }
+
+}
+
+
+
+
+
+
+
+
+void 
+ProcessStem (char *name)
+{
+  FILE *f;
+  struct invf_dict_header idh;
+
+  if (!(f = open_file (name, INVF_DICT_SUFFIX, "rb",
+		       MAGIC_STEM_BUILD, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return;
+  fread ((char *) &idh, sizeof (idh), 1, f);
+  printf ("Words in collection [stem]         : %10ld\n", NTOHUL(idh.num_of_words));  /* [RPAP - Jan 97: Endian Ordering] */
+  printf ("Words in stem                      : %10ld\n", NTOHUL(idh.dict_size));  /* [RPAP - Jan 97: Endian Ordering] */
+  printf ("Indexed fragments                  : %10ld\n", NTOHUL(idh.num_of_docs));  /* [RPAP - Jan 97: Endian Ordering] */
+  printf ("Total chars of stem words          : %10ld\n", NTOHUL(idh.total_bytes));  /* [RPAP - Jan 97: Endian Ordering] */
+  fclose (f);
+}
+
+
+
+
+
+/* [RPAP - Jan 97: Stem Index Change] */
+long 
+ProcessStemBlk (char *name)
+{
+  FILE *f;
+  struct stem_dict_header sdh;
+
+  if (!(f = open_file (name, INVF_DICT_BLOCKED_SUFFIX, "rb",
+		       MAGIC_STEM, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return 0;
+  fread ((char *) &sdh, sizeof (sdh), 1, f);
+  fclose (f);
+  return NTOHUL(sdh.indexed);  /* [RPAP - Jan 97: Endian Ordering] */
+}
+
+
+
+
+int 
+process_file (char *name, char *ext, int exact)
+{
+  static double scale = 0;
+  static char *units;
+  struct stat buf;
+  if (scale == 0)
+    {
+      /* So can get output in Mb or Kb, */
+      /* will divide by a scale of 1024(Kb) or 1024*1024(Mb) */
+      /* Note: if inputbytes==0, then use 1024 as default */
+      scale = inputbytes > 10 * 1000 * 1000 ? 1024 * 1024 : 1024;
+      units = scale == 1024 ? "Kb" : "Mb";
+    }
+  if (name)
+    {
+      char Name[256];
+      sprintf (Name, FILE_NAME_FORMAT, get_basepath (), name, ext);
+      if (!stat (Name, &buf))
+	{
+	  char fname[256];
+	  char *nam = strrchr (name, '/');
+	  nam = nam ? nam + 1 : name;
+	  sprintf (fname, "%s%s", nam, ext);
+
+	  if (inputbytes == 0.0)
+	    {
+	      if (exact)
+		printf ("%s%*s: %10ld bytes   %7.3f%%\n", fname,
+			35 - (int) strlen (fname), "",
+			buf.st_size,
+			100.0 * buf.st_size / inputbytes);
+	      else
+		printf ("%s%*s: %8.2f %s   %7.3f%%\n", fname,
+			35 - (int) strlen (fname), "",
+			buf.st_size / scale,
+			units,
+			100.0 * buf.st_size / inputbytes);
+	    }
+	  else
+	    {
+	      if (exact)
+		printf ("%s%*s: %10ld bytes\n", fname,
+			35 - (int) strlen (fname), "",
+			buf.st_size);
+	      else
+		printf ("%s%*s: %8.2f %s\n", fname,
+			35 - (int) strlen (fname), "",
+			buf.st_size / scale,
+			units);
+	    }
+	  total += buf.st_size;
+	  return 1;
+	}
+      else
+	return 0;
+    }
+  else
+    {
+      if (inputbytes == 0.0)
+	{
+	  if (exact)
+	    printf ("%-34s : %10" ULL_FS " bytes   %7.3f%%\n", ext,
+		    total,
+		    100.0 * total / inputbytes);
+	  else
+	    printf ("%-34s : %8.2f %s   %7.3f%%\n", ext,
+		    total / scale, units,
+		    100.0 * total / inputbytes);
+	}
+      else
+	{
+	  if (exact)
+	    printf ("%-34s : %10" ULL_FS " bytes\n", ext, total);
+	  else
+	    printf ("%-34s : %8.2f %s\n", ext,
+		    total / scale, units);
+	}
+    }
+  return 1;
+
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.1	(revision 21083)
@@ -0,0 +1,86 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.Id $Id$
+.\"------------------------------------------------------------
+.TH mgstemidxlist 1 \*(Dt CITRI
+.SH NAME
+mgstemidxlist \- dumps the stem index file to STDOUT in ASCII format
+.SH SYNOPSIS
+.B mgstemidxlist
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.B \-s 1|2|3
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgstemidxlist
+is a utility program which passes through the stem index and displays
+the information.  (This program was used for debugging but is included
+for completeness!)  The header information is printed out, then for each
+block in the file the block header is displayed.  For each word in the
+stem index, the output is formatted as:
+
+.RS
+.I number_of_references \*(lqword\*(rq
+.br
+.RS
+.I "->  number_of_cases block 3-in-4_block offset"
+.br
+.I "->  ..."
+.RE
+.RE
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B -s 1|2|3
+The stem index file with the associated stem method.
+.br
+1 = casefolded and non-stemmed
+.br
+2 = non-casefolded and stemmed
+.br
+3 = casefolded and stemmed
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the
+.BR mg (1)
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 25
+.B *.invf.dict.blocked.1
+Stem index with stem index method 1.
+.TP
+.B *.invf.dict.blocked.2
+Stem index with stem index method 2.
+.TP
+.B *.invf.dict.blocked.3
+Stem index with stem index method 3.
+.SH "SEE ALSO"
+.na
+.BR mg (1),
+.BR mg_invf_dict (1),
+.BR mg_stem_idx (1).
Index: /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/mgstemidxlist.c	(revision 21083)
@@ -0,0 +1,245 @@
+/**************************************************************************
+ *
+ * mgstemidxlist.c -- Text dumper for the stem indexes
+ * Copyright (C) 1997  Ross Peeters
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "messages.h"
+#include "memlib.h"
+#include "local_strings.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "mg.h"
+#include "invf.h"
+#include "words.h"
+#include "backend.h"
+
+void
+read_3_in_4 (FILE * idbi)
+{
+  unsigned long i;
+  stemmed_idx *si;
+  u_char *buffer;
+  int block = 0;
+
+  if (!(si = Xmalloc (sizeof (stemmed_idx))))
+    {
+      return;
+    }
+
+  si->MemForStemIdx = 0;
+
+  fread (&(si->sih), sizeof (si->sih), 1, idbi);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(si->sih.lookback);
+  NTOHUL(si->sih.block_size);
+  NTOHUL(si->sih.num_blocks);
+  NTOHUL(si->sih.blocks_start);
+  NTOHUL(si->sih.index_chars);
+  NTOHUL(si->sih.num_of_words);
+
+  if (!(buffer = Xmalloc (si->sih.index_chars)))
+    {
+      Xfree (si);
+      return;
+    };
+  si->MemForStemIdx += si->sih.index_chars;
+
+  if (!(si->index = Xmalloc (si->sih.num_blocks * sizeof (*si->index))))
+    {
+      Xfree (si);
+      Xfree (buffer);
+      return;
+    };
+  si->MemForStemIdx += si->sih.num_blocks * sizeof (*si->index);
+
+  if (!(si->pos = Xmalloc (si->sih.num_blocks * sizeof (*si->pos))))
+    {
+      Xfree (si->index);
+      Xfree (si);
+      Xfree (buffer);
+      return;
+    };
+  si->MemForStemIdx += si->sih.num_blocks * sizeof (*si->pos);
+
+  if (!(si->buffer = Xmalloc (si->sih.block_size * sizeof (*si->buffer))))
+    {
+      Xfree (buffer);
+      Xfree (si->index);
+      Xfree (si->buffer);
+      Xfree (si);
+      return;
+    };
+  si->MemForStemIdx += si->sih.block_size * sizeof (*si->buffer);
+
+  si->active = -1;
+
+  for (i = 0; i < si->sih.num_blocks; i++)
+    {
+      register u_char len;
+      si->index[i] = buffer;
+      len = fgetc (idbi);
+      *buffer++ = len;
+      fread (buffer, sizeof (u_char), len, idbi);
+      buffer += len;
+      fread (&si->pos[i], sizeof (*si->pos), 1, idbi);
+      NTOHUL(si->pos[i]);  /* [RPAP - Jan 97: Endian Ordering] */
+    }
+
+  printf ("# lookback     = %lu\n", si->sih.lookback);
+  printf ("# block_size   = %lu\n", si->sih.block_size);
+  printf ("# num_blocks   = %lu\n", si->sih.num_blocks);
+  printf ("# blocks_start = %lu\n", si->sih.blocks_start);
+  printf ("# index_chars  = %lu\n", si->sih.index_chars);
+  printf ("# num_of_words = %lu\n", si->sih.num_of_words);
+
+  block = 0;
+  while (block < si->sih.num_blocks)
+    {
+      unsigned long *first_word;
+      unsigned short *num_words;
+      unsigned short *index;
+      long res;
+      u_char *base;
+      int num_indexes;
+
+      /* Read in next block */
+      fseek (idbi, si->pos[block] + si->sih.blocks_start, 0);
+      fread (si->buffer, si->sih.block_size, sizeof (u_char), idbi);
+      si->active = si->pos[block];
+
+      first_word = (unsigned long *) (si->buffer);
+      NTOHUL(*first_word);  /* [RPAP - Jan 97: Endian Ordering] */
+      num_words = (unsigned short *) (first_word + 1);
+      NTOHUS(*num_words);  /* [RPAP - Jan 97: Endian Ordering] */
+      index = num_words + 1;
+      num_indexes = ((*num_words - 1) / si->sih.lookback) + 1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = 0; i < num_indexes; i++)
+	NTOHUS(index[i]);
+
+      base = (u_char *) (index + num_indexes);
+      base += index[0];
+
+      printf ("\n# block      = %d\n", block);
+      printf ("# first_word = %lu\n", *first_word);
+      printf ("# num_words  = %u\n", *num_words);
+
+      res = 0;
+      while (res < *num_words)
+	{
+	  unsigned copy, suff;
+	  u_char prev[MAXSTEMLEN + 1];
+	  unsigned int num_entries, num_cases, blk;
+	  unsigned short blk_index, offset;
+
+	  /* Read word entry */
+	  copy = *base++;
+	  suff = *base++;
+	  bcopy ((char *) base, (char *) (prev + copy + 1), suff);
+	  *prev = copy + suff;
+	  base += suff;
+	  bcopy ((char *) base, (char *) &num_entries, sizeof (num_entries));
+	  base += sizeof (num_entries);
+	  NTOHUI(num_entries);  /* [RPAP - Jan 97: Endian Ordering] */
+	  printf ("%u \"%s\"\n", num_entries, word2str (prev));
+
+	  /* For all the PosEntries for the word... */
+	  for (i = 0; i < num_entries; i++)
+	    {
+	      bcopy ((char *) base, (char *) &num_cases, sizeof (num_cases));
+	      NTOHUI(num_cases);  /* [RPAP - Jan 97: Endian Ordering] */
+	      base += sizeof (num_cases);
+	      bcopy ((char *) base, (char *) &blk, sizeof (blk));
+	      NTOHUI(blk);  /* [RPAP - Jan 97: Endian Ordering] */
+	      base += sizeof (blk);
+	      bcopy ((char *) base, (char *) &blk_index, sizeof (blk_index));
+	      NTOHUS(blk_index);  /* [RPAP - Jan 97: Endian Ordering] */
+	      base += sizeof (blk_index);
+	      bcopy ((char *) base, (char *) &offset, sizeof (offset));
+	      NTOHUS(offset);  /* [RPAP - Jan 97: Endian Ordering] */
+	      base += sizeof (offset);
+
+	      printf ("    -> %4u %4u %4u %4u\n", num_cases, blk, blk_index, offset);
+	    }
+	  res++;
+	}
+      block++;
+    }
+  fclose (idbi);
+}
+
+int
+main (int argc, char **argv)
+{
+  FILE *idbi;
+  char *filename = "";
+  int ch;
+  int stem_method = 0;
+
+  msg_prefix = argv[0];
+  opterr = 0;
+  while ((ch = getopt (argc, argv, "f:d:hs:")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	filename = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 's':
+	stem_method = atoi (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-d data directory] [-h] -s 1|2|3 -f name\n", argv[0]);
+	exit (1);
+      }
+
+  /* Open required files */
+  switch (stem_method)
+    {
+    case (1):
+      idbi = open_file (filename, INVF_DICT_BLOCKED_1_SUFFIX, "rb", MAGIC_STEM_1,
+			MG_ABORT);
+      break;
+    case (2):
+      idbi = open_file (filename, INVF_DICT_BLOCKED_2_SUFFIX, "rb", MAGIC_STEM_2,
+			MG_ABORT);
+      break;
+    case (3):
+      idbi = open_file (filename, INVF_DICT_BLOCKED_3_SUFFIX, "rb", MAGIC_STEM_3,
+			MG_ABORT);
+      break;
+    default:
+      FatalError (1, "Stem method must be 1, 2 or 3\n");
+    }
+
+  if (!idbi)
+    FatalError (1, "Could NOT open file");
+
+  read_3_in_4 (idbi);
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/query.docnums.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/query.docnums.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/query.docnums.c	(revision 21083)
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * query.docnums.c -- Docnums query evaluation
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "filestats.h"
+#include "timing.h"
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+
+
+static DocList *
+AddToDocList (DocList * Docs, int res)
+{
+  int j;
+  /* Search the list for the word */
+  for (j = 0; j < Docs->num; j++)
+    if (Docs->DE[j].DocNum == res)
+      break;
+
+  /* Increment the weight if the word is in the list */
+  if (j < Docs->num)
+    Docs->DE[j].Weight++;
+  else
+    {
+      /* Create a new entry in the list for the new document */
+      Docs = ResizeDocList (Docs, Docs->num + 1);
+      Docs->DE[Docs->num].DocNum = res;
+      Docs->DE[Docs->num].Weight = 1;
+      Docs->DE[Docs->num].SeekPos = 0;
+      Docs->DE[Docs->num].Len = 0;
+      Docs->DE[Docs->num].CompTextBuffer = NULL;
+      Docs->DE[Docs->num].Next = NULL;
+      Docs->num++;
+    }
+  return (Docs);
+}
+
+void 
+DocnumsQuery (query_data * qd, char *QueryLine)
+{
+  DocList *Docs = MakeDocList (0);
+  unsigned long start = 0, finish;
+  int range = 0; /* is there a range or not ? */
+
+  /* find the start of the first word */
+  while (*QueryLine)
+    {
+      char *end;
+      finish = strtol (QueryLine, &end, 10);
+      if (end != (char *) QueryLine && finish >= 1 &&
+	  finish <= qd->sd->sdh.num_of_docs)
+	{
+	  unsigned long i;
+	  if (!range)
+	    start = finish;
+	  else
+	    range = 0;
+	  for (i = start; i <= finish; i++)
+	    Docs = AddToDocList (Docs, i);
+	  while (*end == ' ' || *end == '\t' || *end == '\n')
+	    end++;
+	  if (*end == '-')
+	    {
+	      start = finish;
+	      range = 1;
+	      end++;
+	    }
+	}
+      else
+	break;
+      QueryLine = end;
+    }
+  FreeQueryDocs (qd);
+
+  qd->DL = Docs;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/query.ranked.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/query.ranked.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/query.ranked.c	(revision 21083)
@@ -0,0 +1,991 @@
+/**************************************************************************
+ *
+ * query.ranked.c -- Ranked query evaluation
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "filestats.h"
+#include "messages.h"
+#include "timing.h"
+#include "sptree.h"
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "stem_search.h"
+#include "weights.h"
+#include "text_get.h"
+#include "invf_get.h"
+#include "words.h"
+#include "stemmer.h"
+#include "locallib.h"
+#include "environment.h"
+#include "term_lists.h"
+#include "local_strings.h"
+#include "query_term_list.h"  /* [RPAP - Feb 97: Term Frequency] */
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:20  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:50  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:34  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.4  1994/11/25  03:47:46  tes
+   * Committing files before adding the merge stuff.
+   *
+   * Revision 1.3  1994/10/20  03:57:03  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:42:04  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+/*************************************************************************/
+
+typedef struct HeapEntry
+  {
+    float Weight;
+    float *OrgWeight;
+    int DocNum;
+    u_long SeekPos;		/* position in the text file in bytes */
+    u_long Len;			/* length of the document in bytes */
+  }
+HeapEntry;
+
+typedef int (*HeapComp) (HeapEntry *, HeapEntry *);
+
+typedef struct Heap
+  {
+    int NumItems;
+    int MaxSize;
+    HeapComp HC;
+    HeapEntry HE[1];
+  }
+Heap;
+
+
+Heap *
+Heap_Make (int size, HeapComp hc)
+{
+  Heap *H;
+  H = Xmalloc (sizeof (Heap) + (size - 1) * sizeof (HeapEntry));
+  if (!H)
+    return NULL;
+  H->NumItems = 0;
+  H->MaxSize = size;
+  H->HC = hc;
+  return H;
+}
+
+int 
+Heap_Size (Heap * H)
+{
+  return sizeof (Heap) + H->MaxSize * sizeof (HeapEntry);
+}
+
+HeapEntry *
+Heap_GetHead (Heap * H)
+{
+  if (H && H->NumItems)
+    return &H->HE[0];
+  else
+    return NULL;
+}
+
+
+
+void 
+Heap_Heapify (Heap * H, int i)
+{
+  register int curr, child;
+  curr = i;
+  child = curr * 2;
+  while (child <= H->NumItems)
+    {
+      if (child < H->NumItems && H->HC (&H->HE[child], &H->HE[child - 1]) > 0)
+	child++;
+      if (H->HC (&H->HE[curr - 1], &H->HE[child - 1]) < 0)
+	{
+	  HeapEntry temp = H->HE[child - 1];
+	  H->HE[child - 1] = H->HE[curr - 1];
+	  H->HE[curr - 1] = temp;
+	  curr = child;
+	  child = 2 * child;
+	}
+      else
+	break;
+    }
+}
+
+
+void 
+Heap_Build (Heap * H)
+{
+  register int i;
+  for (i = H->NumItems / 2; i > 0; i--)
+    Heap_Heapify (H, i);
+}
+
+
+void 
+Heap_Sort (Heap * H)
+{
+  register int i;
+  for (i = H->NumItems; i > 1; i--)
+    {
+      HeapEntry temp = H->HE[0];
+      H->HE[0] = H->HE[i - 1];
+      H->HE[i - 1] = temp;
+      H->NumItems--;
+      Heap_Heapify (H, 1);
+    }
+}
+
+
+void 
+Heap_DeleteHead (Heap * H)
+{
+  H->HE[0] = H->HE[--H->NumItems];
+  Heap_Heapify (H, 1);
+}
+
+int 
+Heap_Lesser (HeapEntry * a, HeapEntry * b)
+{
+  return (a->Weight > b->Weight ? -1 :
+	  (a->Weight == b->Weight ? 0 : 1));
+}
+
+
+int 
+Heap_Greater (HeapEntry * a, HeapEntry * b)
+{
+  return (a->Weight > b->Weight ? 1 :
+	  (a->Weight == b->Weight ? 0 : -1));
+}
+
+int 
+Make_Exact_Root (query_data * qd, Heap * H)
+{
+  int num = 0;
+  HeapEntry *he = H->HE;
+  while (he->SeekPos == 0)
+    {
+      he->Weight = he->Weight *
+	GetLowerApproxDocWeight (qd->awd, he->DocNum - 1) /
+	FetchDocStart (qd, he->DocNum, &he->SeekPos, &he->Len);
+      Heap_Heapify (H, 1);
+      num++;
+    }
+  return num;
+}
+
+void 
+Heap_Dump (Heap * H, int num)
+{
+  int i, l, lines, r;
+  if (num > H->NumItems)
+    num = H->NumItems;
+  lines = (num + 3) / 4;
+  for (l = 0; l < lines; l++)
+    for (r = 0; r < 4; r++)
+      {
+	i = lines * r + l;
+	if (i < num)
+	  fprintf (stderr, "[%2d] %7.4f", i, H->HE[i].Weight);
+	fprintf (stderr, r == 3 ? "\n" : "        ");
+      }
+  fprintf (stderr, "\n");
+}
+
+/*************************************************************************/
+
+
+
+
+
+
+int 
+doc_count_comp (const void *A, const void *B)
+{
+  const TermEntry *a = A;
+  const TermEntry *b = B;
+  return (a->WE.doc_count - b->WE.doc_count);
+}
+
+/* =========================================================================
+ * Function: ParseRankedQuery
+ * Description:
+ *      Takes a string query line and extracts the terms in the query
+ *      which exist in the stemmed dictionary.
+ *      Optionally sorts the terms into ascending order by doc. number.
+ * Input:
+ *      stemmed dictionary, query line, sort-flag
+ * Output:
+ *      A list of terms.
+ * ========================================================================= */
+
+/* [RPAP - Jan 97: Stem Index Change] */
+static TermList *
+ParseRankedQuery (stemmed_dict * sd, char *QueryLine, int Sort, int indexed,
+		  QueryTermList **query_term_list)  /* [RPAP - Feb 97: Term Frequency] */
+{
+  u_char Word[MAXSTEMLEN + 1];
+  u_char sWord[MAXSTEMLEN + 1];
+  u_char *end, *s_in;
+  int default_stem_method = 0;
+  TermList *Terms = MakeTermList(0);
+
+  s_in = (u_char *) QueryLine;
+  end = s_in + strlen ((char *) s_in) - 1;
+  *query_term_list = MakeQueryTermList(0);  /* [RPAP - Feb 97: Term Frequency] */
+
+  if (indexed)
+    default_stem_method = BooleanEnv (GetEnv ("casefold"), 0) | (BooleanEnv (GetEnv ("stem"), 0) << 1);
+  else
+    default_stem_method = sd->sdh.stem_method;
+
+  while (s_in <= end)
+    {
+      int j;
+      long num_entries, word_num;
+      unsigned long count, doc_count, invf_ptr, invf_len;
+      int weight_to_apply, stem_to_apply;
+      int method_using = -1;
+
+      /* 0=optional, 1=mustmatch */
+      int require_match = 0; /* [RJM 07/97: Ranked Required Terms] */
+
+      /* Skip over the non word separator taking note of any parameters */
+      PARSE_RANKED_NON_STEM_WORD (require_match, s_in, end); /* [RJM 07/97: Ranked Required Terms] */
+      if (s_in > end) break;
+
+      /* Get a word and stem it */
+      PARSE_STEM_WORD (Word, s_in, end);
+
+      /* Extract any parameters */
+      weight_to_apply = 1;
+      stem_to_apply = default_stem_method;
+      while (s_in <= end)
+	{
+	  int stem_param, weight_param, param_type;
+	  char param[MAXPARAMLEN + 1];
+
+	  param_type = 0;
+	  PARSE_OPT_TERM_PARAM (param, param_type, s_in, end);
+	  if (!param_type)
+	    break;
+
+	  switch (param_type)
+	    {
+	    case (WEIGHTPARAM):
+	      weight_param = atoi (param);
+	      if (errno != ERANGE && weight_param > 0)
+		weight_to_apply = weight_param;
+	      break;
+
+	    case (STEMPARAM):
+	      stem_param = atoi (param);
+	      if (errno != ERANGE && indexed && stem_param >= 0 && stem_param <= 3)
+		method_using = stem_to_apply = stem_param;
+	      break;
+	    }
+	}
+
+      bcopy ((char *) Word, (char *) sWord, *Word + 1);
+      stemmer (stem_to_apply, sd->sdh.stemmer_num, sWord);
+
+      if (!indexed || stem_to_apply == 0)
+	{
+	  /* Look for the word in the already identified terms */
+	  for (j = 0; j < Terms->num; j++)
+	    if (compare (Terms->TE[j].Word, Word) == 0)
+	      break;
+
+	  /* Increment the weight if the word is in the list */
+	  /* Update the require match attribute */
+	  if (j < Terms->num)
+	    {
+	      Terms->TE[j].Count = ((Terms->TE[j].Count + weight_to_apply > INT_MAX) ?
+				    INT_MAX : (Terms->TE[j].Count + weight_to_apply));
+	      Terms->TE[j].require_match = require_match; /* [RJM 07/97: Ranked Require match] */
+	      AddQueryTerm (query_term_list, Word, Terms->TE[j].WE.count, method_using);  /* [RPAP - Feb 97: Term Frequency] */
+	    }
+	  else
+	    {
+	      /* Look for it in the stemmed dictionary */
+	      if ((word_num = FindWord (sd, sWord, &count, &doc_count,
+					&invf_ptr, &invf_len)) != -1)
+		{
+		  /* Search the list for the word */
+		  for (j = 0; j < Terms->num; j++)
+		    if (Terms->TE[j].WE.word_num == word_num)
+		      break;
+
+		  /* Increment the weight if the word is in the list */
+		  if (j < Terms->num)
+		    {
+		      Terms->TE[j].Count = ((Terms->TE[j].Count + weight_to_apply > INT_MAX) ?
+					    INT_MAX : (Terms->TE[j].Count + weight_to_apply));
+		      Terms->TE[j].require_match = require_match; /* [RJM 07/97: Ranked Require match] */
+		      AddQueryTerm (query_term_list, Word, Terms->TE[j].WE.count, method_using);  /* [RPAP - Feb 97: Term Frequency] */
+		    }
+		  else
+		    {
+		      /* Create a new entry in the list for the new word */
+		      TermEntry te;
+
+		      te.WE.word_num = word_num;
+		      te.WE.count = count;
+		      te.WE.doc_count = doc_count;
+		      te.WE.max_doc_count = doc_count;
+		      te.WE.invf_ptr = invf_ptr;
+		      te.WE.invf_len = invf_len;
+		      te.Count = weight_to_apply;
+		      te.Word = copy_string (Word);
+		      if (!te.Word)
+			FatalError (1, "Could NOT create memory to add term");
+		      te.Stem = NULL;
+		      te.require_match = require_match;
+
+		      AddTermEntry (&Terms, &te);
+
+		      /* [RPAP - Feb 97: Term Frequency] */
+		      AddQueryTerm (query_term_list, Word, count, method_using);
+		    }
+		}
+	      /* [RPAP - Feb 97: Term Frequency] */
+	      else
+		AddQueryTerm (query_term_list, Word, 0, method_using);
+	    }
+	}
+      else
+	{
+	  int total_count = 0;  /* [RPAP - Feb 97: Term Frequency] */
+	  TermList *tempList = MakeTermList (0);
+	  if ((num_entries = FindWords (sd, sWord, stem_to_apply, &tempList)) > 0)
+	    {
+	      int i;
+	      u_long max_doc_count = 0;
+
+	      /* get the maximum doc count */
+	      for (i = 0; i < tempList->num; i++)
+		{
+		  if (tempList->TE[i].WE.doc_count > max_doc_count)
+		    max_doc_count = tempList->TE[i].WE.doc_count;
+		  total_count += tempList->TE[i].WE.count;  /* [RPAP - Feb 97: Term Frequency] */
+		}
+
+	      for (i = 0; i < tempList->num; i++)
+		{
+		  /* Look for the word(s) in the already identified terms */
+		  for (j = 0; j < Terms->num; j++) 
+		    {
+		      if (compare (Terms->TE[j].Word, tempList->TE[i].Word) == 0)
+			{
+			  /* found the word */
+			  /* Modify weight */
+			  Terms->TE[j].Count = ((Terms->TE[j].Count + weight_to_apply > INT_MAX) ?
+						INT_MAX : (Terms->TE[j].Count + weight_to_apply));
+			  if (Terms->TE[j].WE.max_doc_count < max_doc_count)
+			    Terms->TE[j].WE.max_doc_count = max_doc_count;
+			  break;
+			}
+		    }
+
+		  if (j == Terms->num)
+		    {
+		      /* word was not found */
+		      tempList->TE[i].WE.max_doc_count = max_doc_count;
+		      tempList->TE[i].Count = weight_to_apply;
+
+		      /* We cannot require a term to match if it is expanded */
+		      /* into multiple terms :-( */
+		      tempList->TE[i].require_match = 0; /* [RJM 07/97: Ranked Required Terms] */
+
+		      AddTermEntry (&Terms, &tempList->TE[i]);
+		    }
+		}
+	    }
+	  /* [RPAP - Feb 97: Term Frequency] */
+	  AddQueryTerm (query_term_list, Word, total_count, method_using);
+
+	  if (tempList != NULL) Xfree(tempList); /* [RJM 07/98: Memory Leak] */
+	} /* end indexed */
+    } /* end while */
+
+  if (Sort)
+    /* Sort the terms in ascending order by doc_count */
+    qsort (Terms->TE, Terms->num, sizeof (TermEntry), doc_count_comp);
+  return (Terms);
+}
+
+
+
+
+static int 
+DE_comp (void *a, void *b)
+{
+  return ((DocEntry *) a)->SeekPos - ((DocEntry *) b)->SeekPos;
+}
+
+
+
+
+
+/*
+ * This function is given a list of term numbers and it returns a list
+ * of document numbers based on the cosine document weighting system.
+ * This puts the entries in an array.
+ * inverted file.
+ * If MaxDocs == -1 then it means all 
+ */
+static DocList *
+CosineGet (query_data * qd, TermList * Terms, RankedQueryInfo * rqi) {
+  DocList *Docs;
+  float *AccumulatedWeights = NULL;
+  Splay_Tree *ST = NULL;
+  Splay_Tree *Para_ST = NULL;
+  Hash_Table *HT = NULL;
+  List_Table *LT = NULL;
+  Heap *H;
+  HeapEntry *he;
+  register float *fptr = NULL;
+  register Invf_Doc_Entry *ide = NULL;
+  register Invf_Doc_EntryH *ideh = NULL;
+  int BackEnd, NumExact, MaxExact, NumParas;
+  int MaxDocs = 0, MaxParas = 0;
+  int i;
+  Invf_Doc_Entry_Pool ide_pool;
+  ide_pool.pool = NULL;
+
+  qd->hops_taken = qd->num_of_ptrs = qd->num_of_accum = 0;
+
+  switch (rqi->AccumMethod)
+    {
+    case 'S':
+      ST = CosineDecodeSplay (qd, Terms, rqi, &ide_pool);
+      if (!ST)
+	return NULL;
+      break;
+    case 'A':
+      AccumulatedWeights = CosineDecode (qd, Terms, rqi);
+      if (!AccumulatedWeights)
+	return NULL;
+      break;
+    case 'H':
+      HT = CosineDecodeHash (qd, Terms, rqi);
+      if (!HT)
+	return NULL;
+      break;
+    case 'L':
+      LT = CosineDecodeList (qd, Terms, rqi);
+      if (!LT)
+	return NULL;
+      break;
+    }
+
+#if 0
+  if (rqi->UseSplayTree)
+    {
+
+      AccumulatedWeights = CosineDecode (qd, Terms, rqi);
+      fptr = AccumulatedWeights;
+      ide = SP_get_first (ST);
+      for (i = 0; i < qd->sd->sdh.num_of_docs; i++)
+	{
+	  if (AccumulatedWeights[i] != 0)
+	    {
+	      if (i != ide->DocNum)
+		fprintf (stderr, "Sum mismatch for %d %f %d %f\n", i + 1,
+			 AccumulatedWeights[i], ide->DocNum + 1, ide->Sum);
+	      ide = SP_get_next (ST);
+	    }
+	}
+    }
+#endif
+
+  switch (rqi->AccumMethod)
+    {
+    case 'S':
+      MaxParas = ST->no_of_items;
+      break;
+    case 'A':
+      {				/* count the number of non-zero document weights */
+	register int i = qd->sd->sdh.num_of_docs;
+	register float *d;
+	MaxParas = 0;
+	for (d = AccumulatedWeights; i; i--, d++)
+	  if (*d)
+	    MaxParas++;
+      }
+      break;
+    case 'H':
+      MaxParas = HT->num + HT->Suplimentary_Num;
+      break;
+    case 'L':
+      MaxParas = LT->num;
+      break;
+    }
+
+  if (rqi->MaxParasToRetrieve != -1 && MaxParas > rqi->MaxParasToRetrieve)
+    MaxParas = rqi->MaxParasToRetrieve;
+  MaxDocs = MaxParas;
+
+  /* Allocate memory for the heap */
+  Docs = MakeDocList (MaxDocs);
+  ChangeMemInUse (qd, sizeof (DocEntry) * MaxDocs);
+
+  H = Heap_Make (MaxDocs, Heap_Lesser);
+
+
+  /* Get the sums from the array divide the sums by the 
+     document weights which we retrieve from the ".idx.wgt" file and put
+     the resulting data into a heap */
+
+
+  he = H->HE;
+  H->NumItems = MaxDocs;
+  switch (rqi->AccumMethod)
+    {
+    case 'S':
+      {
+	ide = SP_get_first (ST);
+	for (i = 0; i < H->NumItems; i++, ide = SP_get_next (ST), he++)
+	  {
+	    he->DocNum = ide->DocNum + 1;
+	    he->OrgWeight = &ide->Sum;
+	    qd->num_of_accum++;
+	  }
+      }
+      break;
+    case 'A':
+      {
+	fptr = AccumulatedWeights;
+	for (i = 0; i < H->NumItems; i++, fptr++, he++)
+	  {
+	    he->DocNum = i + 1;
+	    he->OrgWeight = fptr;
+	    if (*fptr)
+	      qd->num_of_accum++;
+	  }
+      }
+      break;
+    case 'H':
+      {
+	ideh = HT->Head;
+	for (i = 0; i < H->NumItems; i++, ideh = ideh->next, he++)
+	  {
+	    he->DocNum = ideh->IDE.DocNum + 1;
+	    he->OrgWeight = &ideh->IDE.Sum;
+	    qd->num_of_accum++;
+	  }
+      }
+      break;
+    case 'L':
+      {
+	ide = LT->IDE;
+	for (i = 0; i < H->NumItems; i++, ide++, he++)
+	  {
+	    he->DocNum = ide->DocNum + 1;
+	    he->OrgWeight = &ide->Sum;
+	    qd->num_of_accum++;
+	  }
+      }
+      break;
+    }
+
+  he = H->HE;
+  for (i = 0; i < H->NumItems; i++, he++)
+    {
+      *he->OrgWeight /= GetLowerApproxDocWeight (qd->awd, he->DocNum - 1);
+      he->Weight = *he->OrgWeight;
+      *he->OrgWeight = 0;
+      he->SeekPos = he->Len = 0;
+    }
+
+  Heap_Build (H);
+
+  he = H->HE;
+  switch (rqi->AccumMethod)
+    {
+    case 'S':
+      {
+	for (i = MaxDocs; i < ST->no_of_items; i++, ide = SP_get_next (ST))
+	  {
+	    ide->Sum /= GetLowerApproxDocWeight (qd->awd, ide->DocNum);
+	    qd->num_of_accum++;
+	    if (ide->Sum <= he->Weight)
+	      continue;
+	    *he->OrgWeight = he->Weight;
+	    he->DocNum = ide->DocNum + 1;
+	    he->Weight = ide->Sum;
+	    he->OrgWeight = &ide->Sum;
+	    *he->OrgWeight = 0;
+	    Heap_Heapify (H, 1);
+	  }
+      }
+      break;
+    case 'A':
+      {
+	for (i = MaxDocs; i < qd->sd->sdh.num_of_docs; i++, fptr++)
+	  {
+	    if (!*fptr)
+	      continue;
+	    qd->num_of_accum++;
+	    *fptr /= GetLowerApproxDocWeight (qd->awd, i);
+	    if (*fptr <= he->Weight)
+	      continue;
+	    *he->OrgWeight = he->Weight;
+	    he->DocNum = i + 1;
+	    he->Weight = *fptr;
+	    he->OrgWeight = fptr;
+	    *he->OrgWeight = 0;
+	    Heap_Heapify (H, 1);
+	  }
+      }
+      break;
+    case 'H':
+      {
+	for (; ideh; ideh = ideh->next)
+	  {
+	    qd->num_of_accum++;
+	    ideh->IDE.Sum /=
+	      GetLowerApproxDocWeight (qd->awd, ideh->IDE.DocNum);
+	    if (ideh->IDE.Sum <= he->Weight)
+	      continue;
+	    *he->OrgWeight = he->Weight;
+	    he->DocNum = ideh->IDE.DocNum + 1;
+	    he->Weight = ideh->IDE.Sum;
+	    he->OrgWeight = &ideh->IDE.Sum;
+	    *he->OrgWeight = 0;
+	    Heap_Heapify (H, 1);
+	  }
+      }
+      break;
+    case 'L':
+      {
+	for (i = MaxDocs; i < LT->num; i++, ide++)
+	  {
+	    qd->num_of_accum++;
+	    ide->Sum /=
+	      GetLowerApproxDocWeight (qd->awd, ide->DocNum);
+	    if (ide->Sum <= he->Weight)
+	      continue;
+	    *he->OrgWeight = he->Weight;
+	    he->DocNum = ide->DocNum + 1;
+	    he->Weight = ide->Sum;
+	    he->OrgWeight = &ide->Sum;
+	    *he->OrgWeight = 0;
+	    Heap_Heapify (H, 1);
+	  }
+      }
+      break;
+    }
+
+
+  if (rqi->Exact && qd->id->ifh.InvfLevel != 3)
+    {
+      HeapEntry *he = H->HE;
+
+      for (i = 0; i < H->NumItems; i++, he++)
+	{
+	  he->Weight = he->Weight *
+	    GetLowerApproxDocWeight (qd->awd, he->DocNum - 1) /
+	    FetchDocStart (qd, he->DocNum, &he->SeekPos, &he->Len);
+	}
+
+      Heap_Build (H);
+
+      he = H->HE;
+
+      switch (rqi->AccumMethod)
+	{
+	case 'S':
+	  {
+	    ide = SP_get_first (ST);
+	    for (i = 0; i < ST->no_of_items; i++, ide = SP_get_next (ST))
+	      {
+		u_long SeekPos, Len;
+		float Weight;
+		if (!ide->Sum)
+		  continue;
+		if (ide->Sum <= he->Weight)
+		  continue;
+		Weight = ide->Sum *
+		  GetLowerApproxDocWeight (qd->awd, ide->DocNum) /
+		  FetchDocStart (qd, ide->DocNum + 1, &SeekPos, &Len);
+		if (Weight <= he->Weight)
+		  continue;
+		he->DocNum = ide->DocNum + 1;
+		he->OrgWeight = &ide->Sum;
+		he->Weight = Weight;
+		he->SeekPos = SeekPos;
+		he->Len = Len;
+		ide->Sum = 0;
+		Heap_Heapify (H, 1);
+	      }
+	  }
+	  break;
+
+	  /* up to here */
+
+	case 'A':
+	  {
+	    fptr = AccumulatedWeights;
+	    for (i = 0; i < qd->sd->sdh.num_of_docs; i++, fptr++)
+	      {
+		u_long SeekPos, Len;
+		float Weight;
+		if (!*fptr)
+		  continue;
+		if (*fptr <= he->Weight)
+		  continue;
+		Weight = *fptr *
+		  GetLowerApproxDocWeight (qd->awd, i) /
+		  FetchDocStart (qd, i + 1, &SeekPos, &Len);
+		if (Weight <= he->Weight)
+		  continue;
+		he->DocNum = i + 1;
+		he->OrgWeight = fptr;
+		he->Weight = Weight;
+		he->SeekPos = SeekPos;
+		he->Len = Len;
+		*fptr = 0;
+		Heap_Heapify (H, 1);
+	      }
+	  }
+	  break;
+	case 'H':
+	  {
+	    ideh = HT->Head;
+	    for (ideh = HT->Head; ideh; ideh = ideh->next)
+	      {
+		u_long SeekPos, Len;
+		float Weight;
+		if (!ideh->IDE.Sum)
+		  continue;
+		if (ideh->IDE.Sum <= he->Weight)
+		  continue;
+		Weight = ideh->IDE.Sum *
+		  GetLowerApproxDocWeight (qd->awd, ideh->IDE.DocNum) /
+		  FetchDocStart (qd, ideh->IDE.DocNum + 1, &SeekPos, &Len);
+		if (Weight <= he->Weight)
+		  continue;
+		he->DocNum = ideh->IDE.DocNum + 1;
+		he->OrgWeight = &ideh->IDE.Sum;
+		he->Weight = Weight;
+		he->SeekPos = SeekPos;
+		he->Len = Len;
+		ideh->IDE.Sum = 0;
+		Heap_Heapify (H, 1);
+	      }
+	  }
+	  break;
+	case 'L':
+	  {
+	    ide = LT->IDE;
+	    for (i = 0; i < LT->num; i++, ide++)
+	      {
+		u_long SeekPos, Len;
+		float Weight;
+		if (!ide->Sum)
+		  continue;
+		if (ide->Sum <= he->Weight)
+		  continue;
+		Weight = ide->Sum *
+		  GetLowerApproxDocWeight (qd->awd, ide->DocNum) /
+		  FetchDocStart (qd, ide->DocNum + 1, &SeekPos, &Len);
+		if (Weight <= he->Weight)
+		  continue;
+		he->DocNum = ide->DocNum + 1;
+		he->OrgWeight = &ide->Sum;
+		he->Weight = Weight;
+		he->SeekPos = SeekPos;
+		he->Len = Len;
+		ide->Sum = 0;
+		Heap_Heapify (H, 1);
+	      }
+	  }
+	  break;
+	}
+    }
+
+
+
+  H->HC = Heap_Greater;
+  Heap_Build (H);
+
+
+  MaxDocs = H->NumItems;
+  if (rqi->MaxDocsToRetrieve != -1 && MaxDocs > rqi->MaxDocsToRetrieve)
+    MaxDocs = rqi->MaxDocsToRetrieve;
+
+  /* Alarm */
+
+  he = H->HE;
+  BackEnd = H->NumItems - 1;
+  NumExact = 0;
+  MaxExact = H->NumItems;
+  NumParas = 0;
+  Para_ST = SP_createset (DE_comp);
+  while (H->NumItems && Docs->num < MaxDocs)
+    {
+      DocEntry DocEnt;
+      DocEntry *mem;
+
+      if (rqi->Exact)
+	{
+	  if (H->HE[0].SeekPos == 0)
+	    NumExact += Make_Exact_Root (qd, H);
+	}
+      else
+	FetchDocStart (qd, he->DocNum, &he->SeekPos, &he->Len);
+
+      NumParas++;
+
+      DocEnt.DocNum = he->DocNum;
+      DocEnt.Weight = he->Weight;
+      DocEnt.Len = he->Len;
+      DocEnt.SeekPos = he->SeekPos;
+      DocEnt.CompTextBuffer = NULL;
+      DocEnt.Next = NULL;
+
+      Heap_DeleteHead (H);
+
+      if (!(mem = SP_member (&DocEnt, Para_ST)))
+	{
+	  Docs->DE[Docs->num] = DocEnt;
+	  SP_insert (&Docs->DE[Docs->num], Para_ST);
+	  Docs->num++;
+	}
+      else
+	{
+	  DocEnt.Next = mem->Next;
+	  Docs->DE[BackEnd] = DocEnt;
+	  mem->Next = &Docs->DE[BackEnd--];
+	}
+    }
+  SP_freeset (Para_ST);
+
+  if (qd->id->ifh.InvfLevel == 3)
+    {
+      Message ("%d Paragraphs were required to get %d documents",
+	       NumParas, Docs->num);
+      if (NumExact == MaxExact)
+	{
+	  Message ("The exact weights of all %d paragraphs had to be calculated", MaxExact);
+	  Message ("to obtain %d paragraphs. This may mean that the the documents", NumParas);
+	  Message ("returned do not necessarly represent an exact cosine ranking.");
+	  Message ("This problem may be corrected by increasing \'maxparas\'.");
+	}
+    }
+#if 0
+  {
+    int i;
+    FILE *f = fopen ("top.paras", "w");
+    fprintf (f, "=========================\nTop Paragraphs\n");
+    for (i = 0; i < Docs->num; i++)
+      {
+	DocEntry *d;
+	fprintf (f, "<%d(%f)>  ", Heap[i].DocNum, Heap[i].Weight);
+	for (d = Heap[i].Next; d; d = d->Next)
+	  fprintf (f, "%d(%f)  ", d->DocNum, d->Weight);
+	fprintf (f, "\n");
+      }
+    fprintf (f, "=========================\n");
+    fclose (f);
+  }
+#endif
+
+  if (AccumulatedWeights)
+    {
+      Xfree (AccumulatedWeights);
+      ChangeMemInUse (qd, -sizeof (float) * qd->sd->sdh.num_of_docs);
+    }
+  if (ST)
+    {
+      int mem = ST->mem_in_use;
+      SP_freeset (ST);
+      ChangeMemInUse (qd, -mem);
+      free_ide_pool (qd, &ide_pool);
+    }
+  if (HT)
+    HT_free (qd, HT);
+
+  if (LT)
+    LT_free (qd, LT);
+
+  if (H) Xfree (H); /* [RJM 07/98: Memory Leak] */
+
+  return (Docs);
+}
+
+
+
+
+/* if MaxDocs == -1 it means all */
+void 
+RankedQuery (query_data *qd, char *Query, RankedQueryInfo *rqi)
+{
+  DocList *dl;
+
+  if (qd->TL)
+    FreeTermList (&(qd->TL));
+
+  /* [RPAP - Feb 97: Term Frequency] */
+  if (qd->QTL)
+    FreeQueryTermList (&(qd->QTL));
+
+  qd->TL = ParseRankedQuery (qd->sd, Query, rqi->Sort, qd->sd->sdh.indexed,  /* [RPAP - Jan 97: Stem Index Change] */
+			     &(qd->QTL));  /* [RPAP - Feb 97: Term Frequency] */
+
+  /*  PrintTermList (qd->TL, stderr); */
+
+  dl = CosineGet (qd, qd->TL, rqi);
+
+  if (!dl)
+    FatalError (1, "Out of memory\n");
+
+  FreeQueryDocs (qd);
+
+  qd->DL = dl;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.c	(revision 21083)
@@ -0,0 +1,225 @@
+/**************************************************************************
+ *
+ * filename -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:21  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:35:36  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:57:07  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+ */
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "local_strings.h"
+#include "query_term_list.h"
+#include "term_lists.h"  /* for MAXTERMSTRLEN */
+#include "messages.h"
+
+
+/* =========================================================================
+ * Function: MakeQueryTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+QueryTermList *
+MakeQueryTermList (int n)
+{
+  QueryTermList *t;
+  int list_size = (n == 0 ? 1 : n);	/* always allocate at least one node */
+
+  t = Xmalloc (sizeof (QueryTermList) + (list_size - 1) * sizeof (QueryTermEntry));
+  if (!t)
+    FatalError (1, "Unable to allocate query term list");
+
+  t->num = n;
+  t->list_size = list_size;
+
+  return t;
+}
+
+/* =========================================================================
+ * Function: ResizeQueryTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+#define GROWTH_FACTOR 2
+#define MIN_SIZE 2
+
+static void
+ResizeQueryTermList (QueryTermList ** query_list)
+{
+  QueryTermList *qtl = *query_list;
+
+  if (qtl->num > qtl->list_size)
+    {
+      if (qtl->list_size)
+	qtl->list_size *= GROWTH_FACTOR;
+      else
+	qtl->list_size = MIN_SIZE;
+    }
+  qtl = Xrealloc (qtl, sizeof (QueryTermList) + (qtl->list_size - 1) * sizeof (QueryTermEntry));
+
+  if (!qtl)
+    FatalError (1, "Unable to resize query term list");
+
+  *query_list = qtl;
+}
+
+/* =========================================================================
+ * Function: ConvertQueryTermsToString
+ * Description:
+ *      Convert term list into null-terminated string
+ * Input:
+ *      query_term_list = query list
+ * Output:
+ *      str = term string
+ * ========================================================================= */
+
+void
+ConvertQueryTermsToString (QueryTermList * query_term_list, char *str)
+{
+  int i = 0;
+  int total_len = 0;
+
+  /* terms_str should be preallocated */
+  if (!str)
+    return;
+
+  for (i = 0; i < query_term_list->num; i++)
+    {
+      unsigned char *word = query_term_list->QTE[i].Term;
+      int len = word[0];
+      total_len += len + 1;	/* +1 for space */
+      if (query_term_list->QTE[i].stem_method >= 0)
+	total_len += 2;         /* '#' and the stem number */
+      if (total_len > MAXTERMSTRLEN)
+	break;
+      strncpy (str, (char *) word + 1, len);
+      str += len;
+      if (query_term_list->QTE[i].stem_method >= 0)
+	{
+	  *str++ = '#';
+	  *str++ = '0' + query_term_list->QTE[i].stem_method;
+	}
+      if (i != (query_term_list->num) - 1)
+	{
+	  *str = ' ';
+	  str++;		/* add space gap */
+	}
+
+    }
+  *str = '\0';
+}
+
+/* =========================================================================
+ * Function: ResetTermList
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+ResetQueryTermList (QueryTermList ** qtl)
+{
+  if (*qtl)
+    FreeQueryTermList (qtl);
+  *qtl = MakeQueryTermList (0);
+}
+
+/* =========================================================================
+ * Function: AddQueryTermEntry
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+AddQueryTermEntry (QueryTermList ** query_term_list, QueryTermEntry * qte)
+{
+  QueryTermList *qtl = *query_term_list;
+
+  qtl->num++;
+  ResizeQueryTermList (query_term_list);
+  qtl = *query_term_list;
+
+  /* copy the structure contents */
+  bcopy ((char *) qte, (char *) &(qtl->QTE[qtl->num - 1]), sizeof (QueryTermEntry));
+
+  return qtl->num - 1;
+}
+
+
+
+/* =========================================================================
+ * Function: AddQueryTerm
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+AddQueryTerm (QueryTermList ** query_term_list, u_char * Term, int Count, int stem_method)
+{
+  /* Create a new entry in the list for the new word */
+  QueryTermEntry qte;
+
+  qte.Count = Count;
+  qte.stem_method = stem_method;
+  qte.Term = copy_string (Term);
+  if (!qte.Term)
+    FatalError (1, "Could NOT create memory to add term");
+
+  return AddQueryTermEntry (query_term_list, &qte);
+}
+
+/* =========================================================================
+ * Function: FreeQueryTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+void
+FreeQueryTermList (QueryTermList ** the_qtl)
+{
+  int j;
+  QueryTermList *qtl = *the_qtl;
+
+  for (j = 0; j < qtl->num; j++)
+    if (qtl->QTE[j].Term)
+      Xfree (qtl->QTE[j].Term);
+  Xfree (qtl);
+
+  *the_qtl = NULL;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/query_term_list.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**************************************************************************
+ *
+ * term_lists.h -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:21  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:35:37  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:57:08  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+ */
+
+#ifndef QUERY_TERM_LIST_H
+#define QUERY_TERM_LIST_H
+
+#include "sysfuncs.h"
+
+typedef struct QueryTermEntry
+  {
+    int Count;			/* The number of times the word occurs in the query */
+    u_char *Term;		/* The query term */
+    int stem_method;            /* The steming method to apply to the term : -1 is default */
+  }
+QueryTermEntry;
+
+typedef struct QueryTermList
+  {
+    int list_size;
+    int num;
+    QueryTermEntry QTE[1];
+  }
+QueryTermList;
+
+/* --- prototypes --- */
+void ConvertQueryTermsToString (QueryTermList * query_term_list, char *str);
+int AddQueryTerm (QueryTermList ** query_term_list, u_char * Term, int Count, int stem_method);
+void ResetQueryTermList (QueryTermList ** tl);
+void FreeQueryTermList (QueryTermList ** the_qtl);
+QueryTermList *MakeQueryTermList (int n);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/read_line.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/read_line.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/read_line.c	(revision 21083)
@@ -0,0 +1,214 @@
+/**************************************************************************
+ *
+ * read_line.c -- Input line reading routines for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+#ifdef GNU_READLINE
+#include "readline.h"
+#include "chardefs.h"
+#include "history.h"
+#endif
+
+
+#include "globals.h"
+#include "environment.h"
+#include "read_line.h"
+
+
+
+#ifdef GNU_READLINE
+int rl_bind_key (int, int (*)());
+
+
+void 
+Init_ReadLine (void)
+{
+  /* Make TAB just insert itself rather than do a file name completion */
+  rl_bind_key (TAB, rl_insert);
+}
+#else
+
+static FILE *rl_instream = NULL;
+static FILE *rl_outstream = NULL;
+
+void 
+Init_ReadLine (void)
+{
+  rl_instream = stdin;
+  rl_outstream = stdout;
+}
+
+static char *
+readline (char *pmt)
+{
+  static char buf[MAXLINEBUFFERLEN + 1];
+  char *s;
+
+  fprintf (rl_outstream, "%s", pmt);
+  s = fgets (buf, sizeof (buf), rl_instream);
+  if (s)
+    {
+      char *s1 = strrchr (s, '\n');
+      if (s1 && *(s1 + 1) == '\0')
+	*s1 = '\0';
+    }
+  return s ? Xstrdup (s) : NULL;
+}
+#endif
+
+/* WritePrompt() */
+/* Write out a prompt if user is a TTY */
+void 
+WritePrompt (void)
+{
+  if (isatty (fileno (InFile)))
+    {
+      if (!BooleanEnv (GetEnv ("expert"), 0))
+	fprintf (stderr, "Enter a command or query (.quit to terminate, .help for assistance).\n");
+    }
+}
+
+#ifdef GNU_READLINE
+static void memory_error_and_abort ();
+
+char *
+xmalloc (bytes)
+     int bytes;
+{
+  char *temp = (char *) Xmalloc (bytes);
+
+  if (!temp)
+    memory_error_and_abort ();
+  return (temp);
+}
+
+char *
+xrealloc (pointer, bytes)
+     char *pointer;
+     int bytes;
+{
+  char *temp;
+
+  if (!pointer)
+    temp = (char *) xmalloc (bytes);
+  else
+    temp = (char *) Xrealloc (pointer, bytes);
+
+  if (!temp)
+    memory_error_and_abort ();
+
+  return (temp);
+}
+
+static void
+memory_error_and_abort ()
+{
+  fprintf (stderr, "history: Out of virtual memory!\n");
+  abort ();
+}
+#endif
+
+
+/*
+ * This routine returns a pointer to the users entered line 
+ *
+ */
+static char *
+GetLine (char *pmt)
+{
+  static char *the_line = NULL;
+  if (the_line)
+    Xfree (the_line);
+  the_line = NULL;
+  rl_instream = InFile;
+  if (isatty (fileno (InFile)))
+    {
+      fputc ('\r', stderr);
+      if (!isatty (fileno (OutFile)))
+	rl_outstream = stderr;
+      else
+	rl_outstream = OutFile;
+      the_line = readline (pmt);
+    }
+  else
+    {
+      if (isatty (fileno (OutFile)))
+	{
+	  the_line = readline (pmt);
+	  fprintf (stderr, "%s\n", the_line ? the_line : "");
+	}
+      else
+	{
+	  the_line = readline ("");
+	  if (the_line)
+	    fprintf (stderr, "%s%s\n", pmt, the_line);
+	}
+    }
+#ifdef GNU_READLINE
+  if (the_line && *the_line)
+    add_history (the_line);
+#endif
+  return (the_line);
+}
+
+
+
+
+
+
+char *
+GetMultiLine (void)
+{
+  static char *line = NULL;
+  char *s;
+  if (line)
+    Xfree (line);
+  line = NULL;
+  if (!(s = GetLine ("> ")))
+    return (NULL);
+  if (!(line = Xstrdup (s)))
+    {
+      fprintf (stderr, "Unable to allocate memory for the line\n");
+      abort ();
+    }
+
+  while ((s = strrchr (line, '\\')) && *(s + 1) == '\0')
+    {
+      char *new;
+      *strrchr (line, '\\') = '\0';
+      if (!(s = GetLine ("? ")))
+	return (NULL);
+      if (!(new = Xmalloc (strlen (line) + strlen (s) + 2)))
+	{
+	  fprintf (stderr, "Unable to allocate memory for the line\n");
+	  abort ();
+	}
+      strcpy (new, line);
+      strcat (new, "\n");
+      strcat (new, s);
+      Xfree (line);
+      line = new;
+    }
+  return (line);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/read_line.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/read_line.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/read_line.h	(revision 21083)
@@ -0,0 +1,34 @@
+/**************************************************************************
+ *
+ * read_line.h -- Input line reading routines for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef READ_LINE_H
+#define READ_LINE_H
+
+#define MAXLINEBUFFERLEN  65535
+
+void Init_ReadLine (void);
+void WritePrompt (void);
+char *GetMultiLine (void);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.c	(revision 21083)
@@ -0,0 +1,772 @@
+/**************************************************************************
+ *
+ * stem_search.c -- Functions for searching the blocked stemmed dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "filestats.h"
+#include "timing.h"
+#include "local_strings.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "words.h"
+#include "locallib.h"
+#include "stem_search.h"
+#include "mg_errors.h"
+#include "term_lists.h"
+#include "stemmer.h"
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:22  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1999/07/02 00:18:55  rjmcnab
+   Changed so FindWords could be used in new ways.
+
+   Revision 1.2  1998/11/25 07:55:51  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:39  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:57:04  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:42:08  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+stemmed_dict *
+ReadStemDictBlk (File * stem_file)
+{
+  unsigned long i;
+  stemmed_dict *sd;
+  u_char *buffer;
+
+  if (!(sd = Xmalloc (sizeof (stemmed_dict))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  sd->stem_file = stem_file;
+  sd->MemForStemDict = 0;
+
+  Fread (&sd->sdh, sizeof (sd->sdh), 1, stem_file);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(sd->sdh.lookback);
+  NTOHUL(sd->sdh.block_size);
+  NTOHUL(sd->sdh.num_blocks);
+  NTOHUL(sd->sdh.blocks_start);
+  NTOHUL(sd->sdh.index_chars);
+  NTOHUL(sd->sdh.num_of_docs);
+  NTOHUL(sd->sdh.static_num_of_docs);
+  NTOHUL(sd->sdh.num_of_words);
+  NTOHUL(sd->sdh.stem_method);
+  NTOHUL(sd->sdh.indexed);
+
+  if (!(buffer = Xmalloc (sd->sdh.index_chars)))
+    {
+      Xfree (sd);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.index_chars;
+
+  if (!(sd->index = Xmalloc (sd->sdh.num_blocks * sizeof (*sd->index))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.num_blocks * sizeof (*sd->index);
+
+  if (!(sd->pos = Xmalloc (sd->sdh.num_blocks * sizeof (*sd->pos))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      Xfree (sd->index);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.num_blocks * sizeof (*sd->pos);
+
+  if (!(sd->buffer = Xmalloc (sd->sdh.block_size * sizeof (*sd->buffer))))
+    {
+      Xfree (sd);
+      Xfree (buffer);
+      Xfree (sd->index);
+      Xfree (sd->buffer);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  sd->MemForStemDict += sd->sdh.block_size * sizeof (*sd->buffer);
+
+  sd->active = -1;
+
+  for (i = 0; i < sd->sdh.num_blocks; i++)
+    {
+      register u_char len;
+      sd->index[i] = buffer;
+      len = Getc (stem_file);
+      *buffer++ = len;
+      Fread (buffer, sizeof (u_char), len, stem_file);
+      buffer += len;
+      Fread (&sd->pos[i], sizeof (*sd->pos), 1, stem_file);
+      NTOHUL(sd->pos[i]); /* [RPAP - Jan 97: Endian Ordering] */
+    }
+
+  mg_errno = MG_NOERROR;
+
+  /*  fprintf (stderr, "mem for stem dict = %i\n", sd->MemForStemDict); */
+
+  return sd;
+}
+
+
+/* [RPAP - Jan 97: Stem Index Change] */
+stemmed_idx *
+ReadStemIdxBlk (File * stem_idx_file)
+{
+  unsigned long i;
+  stemmed_idx *si;
+  u_char *buffer;
+
+  if (!(si = Xmalloc (sizeof (stemmed_idx))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  si->stem_idx_file = stem_idx_file;
+  si->MemForStemIdx = 0;
+
+  Fread (&si->sih, sizeof (si->sih), 1, stem_idx_file);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(si->sih.lookback);
+  NTOHUL(si->sih.block_size);
+  NTOHUL(si->sih.num_blocks);
+  NTOHUL(si->sih.blocks_start);
+  NTOHUL(si->sih.index_chars);
+  NTOHUL(si->sih.num_of_words);
+
+  if (!(buffer = Xmalloc (si->sih.index_chars)))
+    {
+      Xfree (si);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  si->MemForStemIdx += si->sih.index_chars;
+
+  if (!(si->index = Xmalloc (si->sih.num_blocks * sizeof (*si->index))))
+    {
+      Xfree (si);
+      Xfree (buffer);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  si->MemForStemIdx += si->sih.num_blocks * sizeof (*si->index);
+
+  if (!(si->pos = Xmalloc (si->sih.num_blocks * sizeof (*si->pos))))
+    {
+      Xfree (si->index);
+      Xfree (si);
+      Xfree (buffer);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  si->MemForStemIdx += si->sih.num_blocks * sizeof (*si->pos);
+
+  if (!(si->buffer = Xmalloc (si->sih.block_size * sizeof (*si->buffer))))
+    {
+      Xfree (buffer);
+      Xfree (si->index);
+      Xfree (si->buffer);
+      Xfree (si);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    };
+  si->MemForStemIdx += si->sih.block_size * sizeof (*si->buffer);
+
+  si->active = -1;
+
+  for (i = 0; i < si->sih.num_blocks; i++)
+    {
+      register u_char len;
+      si->index[i] = buffer;
+      len = Getc (stem_idx_file);
+      *buffer++ = len;
+      Fread (buffer, sizeof (u_char), len, stem_idx_file);
+      buffer += len;
+      Fread (&si->pos[i], sizeof (*si->pos), 1, stem_idx_file);
+      NTOHUL(si->pos[i]);  /* [RPAP - Jan 97: Endian Ordering] */
+    }
+  mg_errno = MG_NOERROR;
+
+  /*  fprintf (stderr, "mem for stem idx = %i\n", si->MemForStemIdx); */
+
+  return si;
+}
+
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* word should be appropriately stemed */
+static int
+GetIdxBlock (stemmed_idx * si, u_char * word)
+{
+  register int lo = 0, hi = si->sih.num_blocks - 1;
+  register int mid = 0, c = 0;
+
+  while (lo <= hi)
+    {
+      mid = (lo + hi) / 2;
+      c = casecompare (word, si->index[mid]);
+      if (c < 0)
+	hi = mid - 1;
+      else if (c > 0)
+	lo = mid + 1;
+      else
+	return mid;
+    }
+  return hi < 0 ? 0 : (c < 0 ? mid - 1 : mid);
+}
+
+
+static int 
+GetBlock (stemmed_dict * sd, u_char * Word)
+{
+  register int lo = 0, hi = sd->sdh.num_blocks - 1;
+  register int mid = 0, c = 0;
+  while (lo <= hi)
+    {
+      mid = (lo + hi) / 2;
+      c = casecompare (Word, sd->index[mid]);  /* [RPAP - Jan 97: Stem Index Change] */
+      if (c < 0)
+	hi = mid - 1;
+      else if (c > 0)
+	lo = mid + 1;
+      else
+	return mid;
+    }
+  return hi < 0 ? 0 : (c < 0 ? mid - 1 : mid);
+}
+
+
+/*
+ * This function looks up a word in the stemmed dictionary, it returns -1
+ * if the word cound not be found, and 0 if it successfully finds the word.
+ * If count is non-null the ulong it is pointing to is set to the number of 
+ * occurances of the stemmed word in the collection. i.e wcnt.
+ * If doc_count is non-null the ulong it is pointing to is set to the number
+ * of documents that the word occurs in. i.e fcnt
+ * If invf_ptr is non-null the ulong it is pointing to is set to the position
+ * of the inverted file where the entry for this word start.
+ */
+int 
+FindWord (stemmed_dict * sd, u_char * Word, unsigned long *count,
+	  unsigned long *doc_count, unsigned long *invf_ptr,
+	  unsigned long *invf_len)
+{
+  register int lo, hi, mid, c;
+  register unsigned int res;
+  int block, num_indexes;
+  unsigned long *first_word, *last_invf_len;
+  unsigned short *num_words;
+  u_char *base;
+  unsigned short *index;
+  u_char prev[MAXSTEMLEN + 1];
+
+  block = GetBlock (sd, Word);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  if (sd->active != sd->pos[block])
+    {
+      int i;
+
+      Fseek (sd->stem_file, sd->pos[block] + sd->sdh.blocks_start, 0);
+      Fread (sd->buffer, sd->sdh.block_size, sizeof (u_char), sd->stem_file);
+      sd->active = sd->pos[block];
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      first_word = (unsigned long *) (sd->buffer);
+      NTOHUL(*first_word);
+      last_invf_len = (unsigned long *) (first_word + 1);
+      NTOHUL(*last_invf_len);
+      num_words = (unsigned short *) (last_invf_len + 1);
+      NTOHUS(*num_words);
+      index = num_words + 1;
+      num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+
+      for (i = 0; i < num_indexes; i++)
+	NTOHUS(index[i]);
+    }
+  else
+    {
+      first_word = (unsigned long *) (sd->buffer);
+      last_invf_len = (unsigned long *) (first_word + 1);
+      num_words = (unsigned short *) (last_invf_len + 1);
+      index = num_words + 1;
+      num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+    }
+  base = (u_char *) (index + num_indexes);
+
+  lo = 0;
+  hi = num_indexes - 1;
+  while (lo <= hi)
+    {
+      mid = (lo + hi) / 2;
+      c = casecompare (Word, base + index[mid] + 1);  /* [RPAP - Jan 97: Stem Index Change] */
+      if (c < 0)
+	hi = mid - 1;
+      else if (c > 0)
+	lo = mid + 1;
+      else
+	{
+	  hi = mid;
+	  break;
+	}
+    }
+  if (hi < 0)
+    hi = 0;
+
+  res = hi * sd->sdh.lookback;
+  base += index[hi];
+
+  for (;;)
+    {
+      unsigned copy, suff;
+      unsigned long invfp;
+      if (res >= *num_words)
+	return (-1);
+      copy = *base++;
+      suff = *base++;
+      bcopy ((char *) base, (char *) (prev + copy + 1), suff);
+      base += suff;
+      *prev = copy + suff;
+
+      c = casecompare (Word, prev);   /* [RPAP - Jan 97: Stem Index Change] */
+      if (c < 0)
+	return (-1);
+
+      if (c == 0 && doc_count)
+	{
+	  bcopy ((char *) base, (char *) doc_count, sizeof (*doc_count));
+	  NTOHUL(*doc_count);  /* [RPAP - Jan 97: Endian Ordering] */
+	}
+      base += sizeof (*doc_count);
+
+      if (c == 0 && count)
+	{
+	  bcopy ((char *) base, (char *) count, sizeof (*count));
+	  NTOHUL(*count);  /* [RPAP - Jan 97: Endian Ordering] */
+	}
+      base += sizeof (*count);
+
+      if (c == 0 && invf_ptr)
+	{
+	  bcopy ((char *) base, (char *) &invfp, sizeof (invf_ptr));
+	  NTOHUL(invfp);  /* [RPAP - Jan 97: Endian Ordering] */
+	  *invf_ptr = invfp;
+	}
+      base += sizeof (*invf_ptr);
+
+      if (c == 0)
+	{
+	  /* Calculate invf_len is necessary */
+	  unsigned long next_invfp;
+	  if (!invf_len)
+	    return (*first_word + res);
+
+	  /* If the current word is the last word of the block the get the 
+	     length from last_invf_len */
+	  if (res == *num_words - 1)
+	    {
+	      *invf_len = *last_invf_len;
+	      return (*first_word + res);
+	    }
+
+	  /* Skip over most of the next word to get to the invf_ptr */
+	  base++;
+	  suff = *base++;
+	  base += suff + sizeof (unsigned long) * 2;
+	  bcopy ((char *) base, (char *) &next_invfp, sizeof (next_invfp));
+	  NTOHUL(next_invfp);  /* [RPAP - Jan 97: Endian Ordering] */
+	  *invf_len = next_invfp - invfp;
+	  return (*first_word + res);
+	}
+      res++;
+    }
+}
+
+
+/* [RPAP - Jan 97: Stem Index Change] */
+int 
+FindWords (stemmed_dict * sd, u_char * sWord, int stem_method, TermList ** tl)
+{
+  register unsigned int res;
+  unsigned int idx_res;
+  unsigned copy, suff;
+  int j, k;
+
+  int block, num_indexes;
+  unsigned long *first_word, *last_invf_len;
+  unsigned short *num_words;
+  u_char *base;
+  unsigned short *index;
+  u_char prev[MAXSTEMLEN + 1];
+
+  int idx_block, idx_num_indexes;
+  unsigned long *idx_first_word;
+  unsigned short *idx_num_words;
+  u_char *idx_base;
+  unsigned short *idx_index;
+  u_char idx_prev[MAXSTEMLEN + 1];
+
+  unsigned int num_entries, num_cases;
+  unsigned short blk_index, offset;
+  stemmed_idx * si = NULL;
+
+  /* handle stem_method 0 seperately */
+  if (stem_method == 0) {
+    TermEntry te;
+    if ((te.WE.word_num = FindWord (sd, sWord, &te.WE.count, &te.WE.doc_count,
+				   &te.WE.invf_ptr, &te.WE.invf_len)) != -1) {
+      te.WE.max_doc_count = te.WE.doc_count;
+
+      te.Count = 1;
+      te.Word = copy_string (sWord);
+      if (!te.Word)
+	FatalError (1, "Could NOT create memory to add term");
+      te.Stem = copy_string (sWord);
+      if (!te.Stem)
+	FatalError (1, "Could NOT create memory to add term");
+      /*      te.query_mask = NULL;*/
+      
+      AddTermEntry (tl, &te);
+      return (*tl)->num;
+      
+    } else {
+      /* didn't match */
+      return 0;
+    }
+  }
+  
+  if (stem_method == 1)
+    si = sd->stem1;
+  else if (stem_method == 2)
+    si = sd->stem2;
+  else
+    si = sd->stem3;
+
+  /* Locate block */
+  idx_block = GetIdxBlock (si, sWord);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  if (si->active != si->pos[idx_block])
+    {
+      Fseek (si->stem_idx_file, si->pos[idx_block] + si->sih.blocks_start, 0);
+      Fread (si->buffer, si->sih.block_size, sizeof (u_char), si->stem_idx_file);
+      si->active = si->pos[idx_block];
+
+      idx_first_word = (unsigned long *) (si->buffer);
+      NTOHUL(*idx_first_word);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_num_words = (unsigned short *) (idx_first_word + 1);
+      NTOHUS(*idx_num_words);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_index = idx_num_words + 1;
+      idx_num_indexes = ((*idx_num_words - 1) / si->sih.lookback) + 1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < idx_num_indexes; j++)
+	NTOHUS(idx_index[j]);
+    }
+  else
+    {
+      idx_first_word = (unsigned long *) (si->buffer);
+      idx_num_words = (unsigned short *) (idx_first_word + 1);
+      idx_index = idx_num_words + 1;
+      idx_num_indexes = ((*idx_num_words - 1) / si->sih.lookback) + 1;
+    }
+  idx_base = (u_char *) (idx_index + idx_num_indexes);
+  
+  {
+    /* Locate 3-in-4 block */
+    register int lo, hi, mid, c;
+    lo = 0;
+    hi = idx_num_indexes - 1;
+    while (lo <= hi)
+      {
+	mid = (lo + hi) / 2;
+	c = casecompare (sWord, idx_base + idx_index[mid] + 1);
+	if (c < 0)
+	  hi = mid - 1;
+	else if (c > 0)
+	  lo = mid + 1;
+	else
+	  {
+	    hi = mid;
+	    break;
+	  }
+      }
+    if (hi < 0)
+      hi = 0;
+
+    idx_res = hi * si->sih.lookback;
+    idx_base += idx_index[hi];
+  }
+
+  /* Locate actual word entry */
+  for (;;)
+    {
+      int c;
+      if (idx_res >= *idx_num_words)
+	return (-1);
+      copy = *idx_base++;
+      suff = *idx_base++;
+      bcopy ((char *) idx_base, (char *) (idx_prev + copy + 1), suff);
+      idx_base += suff;
+      *idx_prev = copy + suff;
+
+      c = casecompare (sWord, idx_prev);
+      if (c < 0)
+	return (-1);
+     
+      bcopy ((char *) idx_base, (char *) &num_entries, sizeof (num_entries));
+      NTOHUI(num_entries);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_base += sizeof (num_entries);
+      
+      if (c > 0)
+	idx_base += num_entries * (sizeof (num_cases) + sizeof (block) + 
+				   sizeof (blk_index) + sizeof (offset));
+
+      else
+	break;
+
+      idx_res++;
+    }
+
+  for (k = 0; k < num_entries; k++)
+    {
+      unsigned copy, suff;
+      unsigned long invfp;
+      /* Read next stem index pos */
+      bcopy ((char *) idx_base, (char *) &num_cases, sizeof (num_cases));
+      NTOHUI(num_cases);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_base += sizeof (num_cases);
+      bcopy ((char *) idx_base, (char *) &block, sizeof (block));
+      NTOHUI(block);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_base += sizeof (block);
+      bcopy ((char *) idx_base, (char *) &blk_index, sizeof (blk_index));
+      NTOHUS(blk_index);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_base += sizeof (blk_index);
+      bcopy ((char *) idx_base, (char *) &offset, sizeof (offset));
+      NTOHUS(offset);  /* [RPAP - Jan 97: Endian Ordering] */
+      idx_base += sizeof (offset);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      if (sd->active != sd->pos[block])
+	{
+	  Fseek (sd->stem_file, sd->pos[block] + sd->sdh.blocks_start, 0);
+	  Fread (sd->buffer, sd->sdh.block_size, sizeof (u_char), sd->stem_file);
+	  sd->active = sd->pos[block];
+
+	  first_word = (unsigned long *) (sd->buffer);
+	  NTOHUL(*first_word);  /* [RPAP - Jan 97: Endian Ordering] */
+	  last_invf_len = (unsigned long *) (first_word + 1);
+	  NTOHUL(*last_invf_len);  /* [RPAP - Jan 97: Endian Ordering] */
+	  num_words = (unsigned short *) (last_invf_len + 1);
+	  NTOHUS(*num_words);  /* [RPAP - Jan 97: Endian Ordering] */
+	  index = num_words + 1;
+	  num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+
+	  /* [RPAP - Jan 97: Endian Ordering] */
+	  for (j = 0; j < num_indexes; j++)
+	    NTOHUS(index[j]);
+	}
+      else
+	{
+	  first_word = (unsigned long *) (sd->buffer);
+	  last_invf_len = (unsigned long *) (first_word + 1);
+	  num_words = (unsigned short *) (last_invf_len + 1);
+	  index = num_words + 1;
+	  num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+	}
+      base = (u_char *) (index + num_indexes);
+      
+      res = blk_index * sd->sdh.lookback;
+      base += index[blk_index];
+      
+      for (j = 0; j < offset; j++)
+	{
+	  copy = *base++;
+	  suff = *base++;
+	  bcopy ((char *) base, (char *) (prev + copy + 1), suff);
+	  base += suff;
+	  *prev = copy + suff;
+	  base += sizeof (unsigned long);   /* skip doc_count */
+	  base += sizeof (unsigned long);   /* skip count */
+	  base += sizeof (unsigned long);   /* skip invf_ptr */
+	  res++;
+	}
+
+      for (j = 0; j < num_cases; j++)
+	{
+	  TermEntry te;
+	  
+	  if (res >= *num_words)
+	    return (-1);
+	  copy = *base++;
+	  suff = *base++;
+	  bcopy ((char *) base, (char *) (prev + copy + 1), suff);
+	  base += suff;
+	  *prev = copy + suff;
+	      
+	  te.Word = copy_string (prev);
+	  if (!te.Word)
+	    FatalError (1, "Could NOT create memory to add term");
+	  te.Stem = copy_string (prev);
+	  if (!te.Stem)
+	    FatalError (1, "Could NOT create memory to add term");
+	  stemmer (2, sd->sdh.stemmer_num, te.Stem);
+
+	  te.Count = 1;
+	  te.WE.word_num = *first_word + res;
+	  bcopy ((char *) base, (char *) &te.WE.doc_count, sizeof (te.WE.doc_count));
+	  NTOHUL(te.WE.doc_count);  /* [RPAP - Jan 97: Endian Ordering] */
+	  te.WE.max_doc_count = te.WE.doc_count;
+	  base += sizeof (te.WE.doc_count);
+	      
+	  bcopy ((char *) base, (char *) &te.WE.count, sizeof (te.WE.count));
+	  NTOHUL(te.WE.count);
+	  base += sizeof (te.WE.count);
+	      
+	  bcopy ((char *) base, (char *) &invfp, sizeof (te.WE.invf_ptr));
+	  NTOHUL(invfp);  /* [RPAP - Jan 97: Endian Ordering] */
+	  te.WE.invf_ptr = invfp;
+	  base += sizeof (te.WE.invf_ptr);
+		
+	  /* If the current word is the last word of the block the get the 
+	     length from last_invf_len */
+	  if (res == *num_words - 1)
+	    te.WE.invf_len = *last_invf_len;
+	  else
+	    {
+	      unsigned long next_invfp;
+	      u_char *oldbase = base;
+		  
+	      /* Skip over most of the next word to get to the invf_ptr */
+	      base++;
+	      suff = *base++;
+	      base += suff + sizeof (unsigned long) * 2;
+	      bcopy ((char *) base, (char *) &next_invfp, sizeof (next_invfp));
+	      NTOHUL(next_invfp);  /* [RPAP - Jan 97: Endian Ordering] */
+	      te.WE.invf_len = next_invfp - invfp;
+	      base = oldbase;
+	    }
+	      
+	  /* Add term entry to term list */
+	  /*	  te.query_mask = NULL;*/
+	  AddTermEntry (tl, &te);
+	      
+	  if (res == *num_words - 1 && j + 1 < num_cases)
+	    {
+	      int ii;
+	      /* Read in next block */
+	      block++;
+	      Fseek (sd->stem_file, sd->pos[block] + sd->sdh.blocks_start, 0);
+	      Fread (sd->buffer, sd->sdh.block_size, sizeof (u_char), sd->stem_file);
+	      sd->active = sd->pos[block];
+
+	      first_word = (unsigned long *) (sd->buffer);
+	      NTOHUL(*first_word);  /* [RPAP - Jan 97: Endian Ordering] */
+	      last_invf_len = (unsigned long *) (first_word + 1);
+	      NTOHUL(*last_invf_len);  /* [RPAP - Jan 97: Endian Ordering] */
+	      num_words = (unsigned short *) (last_invf_len + 1);
+	      NTOHUS(*num_words);  /* [RPAP - Jan 97: Endian Ordering] */
+	      index = num_words + 1;
+	      num_indexes = ((*num_words - 1) / sd->sdh.lookback) + 1;
+
+	      /* [RPAP - Jan 97: Endian Ordering] */
+	      for (ii = 0; ii < num_indexes; ii++)
+		NTOHUS(index[ii]);
+
+	      base = (u_char *) (index + num_indexes);
+	      base += index[0];
+	      res = 0;
+	      blk_index = 0;
+	    }
+	  else
+	    res++;
+	} /* end for num_cases */
+    } /* end for num_entries */
+  return (*tl)->num;
+}
+
+
+void 
+FreeStemDict (stemmed_dict * sd)
+{
+  /* [RPAP - Jan 97: Stem Index Change] */
+  if (sd->stem1)
+    FreeStemIdx (sd->stem1);
+  if (sd->stem2)
+    FreeStemIdx (sd->stem2);
+  if (sd->stem3)
+    FreeStemIdx (sd->stem3);
+
+  Xfree (sd->index[0]);
+  Xfree (sd->index);
+  Xfree (sd->buffer);
+  Xfree (sd->pos);
+  Xfree (sd);
+}
+
+/* [RPAP - Jan 97: Stem Index Change] */
+void
+FreeStemIdx (stemmed_idx * si)
+{
+  Xfree (si->index[0]);
+  Xfree (si->index);
+  Xfree (si->buffer);
+  Xfree (si->pos);
+  Xfree (si);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/stem_search.h	(revision 21083)
@@ -0,0 +1,43 @@
+/**************************************************************************
+ *
+ * stem_search.h -- Functions for searching the blocked stemmed dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_STEM_SEARCH
+#define H_STEM_SEARCH
+
+stemmed_dict *ReadStemDictBlk (File * stem_file);
+
+stemmed_idx *ReadStemIdxBlk (File * stem_idx_file);
+
+int FindWord (stemmed_dict * sd, u_char * Word, unsigned long *count,
+	      unsigned long *doc_count, unsigned long *invf_ptr,
+	      unsigned long *invf_len);
+
+/* [RPAP - Jan 97: Stem Index Change] */
+int FindWords (stemmed_dict * sd, u_char * sWord, int stem_method, TermList ** tl);
+
+void FreeStemDict (stemmed_dict * sd);
+
+/* [RPAP - Jan 97: Stem Index Change] */
+void FreeStemIdx (stemmed_idx * si);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.c	(revision 21083)
@@ -0,0 +1,142 @@
+/**************************************************************************
+ *
+ * stemmer.c -- The stemmer/case folder
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "stemmer.h"
+
+#include "lovinstem.h"
+#include "simplefrenchstem.h"
+#include "unitool.h"
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:23  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.3  1998/12/17 09:12:54  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.2  1998/11/25 07:55:51  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:42  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:57:05  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:42:10  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+#define LOVINSTEMMER        0
+#define SIMPLEFRENCHSTEMMER 1
+
+
+/* decode the utf-8 encoded unicode, casefold and then recode 
+ * making sure the final length doesn't exceed the original
+ * length */
+static void unicode_casefold (u_char *word) {
+  unsigned short out[256]; /* temp space */
+  int i;
+  int len;
+
+  /* decode */
+  utf8_word_to_unicode (word, out, 255);
+  len = out[0];
+
+  /* casefold and simplify-fold */
+  for (i=0; i<len; i++) {
+    out[i+1] = unicode_tosimplified(unicode_tolower(out[i+1]));
+  }
+
+  /* re-code */
+  unicode_to_utf8_word (out, word, word[0]+1);
+}
+
+
+int stemmernumber (u_char *stemmerdescription) {
+  u_char descript[MAX_STEM_DESCRIPTION_LEN];
+  int i;
+
+  /* copy and case-fold the description */
+  for (i=0; (stemmerdescription[i] != '\0') && 
+	 (i < MAX_STEM_DESCRIPTION_LEN-1); i++)
+    descript[i] = tolower (stemmerdescription[i]);
+  descript[i] = '\0';
+
+  /* map the description to its number */
+
+  if ((strcmp (descript, "0") == 0) ||
+      (strcmp (descript, "english") == 0) ||
+      (strcmp (descript, "lovin") == 0))
+    return LOVINSTEMMER;
+
+  if ((strcmp (descript, "1") == 1) ||
+      (strcmp (descript, "french") == 0) ||
+      (strcmp (descript, "simplefrench") == 0))
+    return SIMPLEFRENCHSTEMMER;
+
+  return -1;
+}
+
+
+
+/*
+ * Method 0 - Do not stem or case fold.
+ * Method 1 - Case fold.
+ * Method 2 - Stem.
+ * Method 3 - Case fold and stem.
+ *
+ * The stemmer number should be obtained using
+ * the stemmernumber function above.
+ */
+void 
+stemmer (int method, int stemmer, u_char *word) {
+  if (method & 1) {
+    unicode_casefold (word);
+  }
+
+  if (method & 2) {
+    switch (stemmer) {
+    case LOVINSTEMMER: lovinstem (word);
+      break;
+    case SIMPLEFRENCHSTEMMER: simplefrenchstem (word);
+      break;
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/stemmer.h	(revision 21083)
@@ -0,0 +1,64 @@
+/**************************************************************************
+ *
+ * stemmer.h -- The stemmer/case folder
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef STEMMER_H
+#define STEMMER_H
+
+#include "sysfuncs.h"
+
+#define STEMMER_MASK 3
+#define MAX_STEM_DESCRIPTION_LEN 16
+
+/* stemmernumber will return the stemmer for
+ * a description of the stemmer. Stemmer descriptions
+ * are not case sensitive. Valid descriptions are:
+ *
+ *   'English'
+ *   'Lovin'
+ *   'French'
+ *   'SimpleFrench'
+ *
+ * More than one description might result in the same
+ * stemmer number (for example, for stemming 'English'
+ * we currently use the 'Lovin' stemmer).
+ *
+ * stemmerdescription is a normal C, null-terminated,
+ * string.
+ *
+ * stemmernumber will return -1 if it doesn't know the
+ * stemmer description.
+ */
+int stemmernumber (u_char *stemmerdescription);
+
+/*
+ * Method 0 - Do not stem or case fold.
+ * Method 1 - Case fold.
+ * Method 2 - Stem.
+ * Method 3 - Case fold and stem.
+ *
+ * The stemmer number should be obtained using function
+ * stemmernumber above.
+ */
+void stemmer (int method, int stemmer, u_char * word);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.c	(revision 21083)
@@ -0,0 +1,331 @@
+/**************************************************************************
+ *
+ * filename -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:24  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:52  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:43  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:57:07  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "local_strings.h"
+#include "term_lists.h"
+#include "messages.h"
+#include "stemmer.h"
+
+TermList *query_term_list = NULL;
+
+/* =========================================================================
+ * Function: MakeTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+TermList *
+MakeTermList (int n)
+{
+  TermList *t;
+  int list_size = (n == 0 ? 1 : n);	/* always allocate at least one node */
+
+  t = Xmalloc (sizeof (TermList) + (list_size - 1) * sizeof (TermEntry));
+  if (!t)
+    FatalError (1, "Unable to allocate term list");
+
+  t->num = n;
+  t->list_size = list_size;
+
+  return t;
+}
+
+/* =========================================================================
+ * Function: ResizeTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+#define GROWTH_FACTOR 2
+#define MIN_SIZE 2
+
+static void
+ResizeTermList (TermList ** term_list)
+{
+  TermList *tl = *term_list;
+
+  if (tl->num > tl->list_size)
+    {
+      if (tl->list_size)
+	tl->list_size *= GROWTH_FACTOR;
+      else
+	tl->list_size = MIN_SIZE;
+    }
+  tl = Xrealloc (tl, sizeof (TermList) + (tl->list_size - 1) * sizeof (TermEntry));
+
+  if (!tl)
+    FatalError (1, "Unable to resize term list");
+
+  *term_list = tl;
+}
+
+/* =========================================================================
+ * Function: ConvertTermsToString
+ * Description:
+ *      Convert term list into null-terminated string
+ * Input:
+ *      query_term_list = term list
+ * Output:
+ *      str = term string
+ * ========================================================================= */
+
+void
+ConvertTermsToString (TermList * query_term_list, char *str)
+{
+  int i = 0;
+  int total_len = 0;
+
+  /* terms_str should be preallocated */
+  if (!str)
+    return;
+
+  for (i = 0; i < query_term_list->num; i++)
+    {
+      unsigned char *word = query_term_list->TE[i].Word;
+      int len = word[0];
+      total_len += len + 1;	/* +1 for space */
+      if (total_len > MAXTERMSTRLEN)
+	break;
+      strncpy (str, (char *) word + 1, len);
+      str += len;
+      if (i != (query_term_list->num) - 1)
+	{
+	  *str = ' ';
+	  str++;		/* add space gap */
+	}
+
+    }
+  *str = '\0';
+}
+
+/* =========================================================================
+ * Function: ResetTermList
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+ResetTermList (TermList ** tl)
+{
+  if (*tl)
+    FreeTermList (tl);
+  *tl = MakeTermList (0);
+}
+
+/* =========================================================================
+ * Function: AddTermEntry
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+AddTermEntry (TermList ** query_term_list, TermEntry * te)
+{
+  TermList *tl = *query_term_list;
+
+  tl->num++;
+  ResizeTermList (query_term_list);
+  tl = *query_term_list;
+
+  /* copy the structure contents */
+  bcopy ((char *) te, (char *) &(tl->TE[tl->num - 1]), sizeof (TermEntry));
+
+  return tl->num - 1;
+}
+
+
+
+/* =========================================================================
+ * Function: AddTerm
+ * Description: Used in boolean parser - see bool_tree   [RPAP - Feb 97: Term Frequency] 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+int
+AddTerm (TermList ** query_term_list, u_char * Word, int Count, int word_num,
+	 u_long count, u_long doc_count, u_long invf_ptr, u_long invf_len, int stemmer_num)  /* [RPAP - Feb 97: Term Frequency] */
+{
+  int j;
+  TermList *tl = *query_term_list;
+
+  /* Look for the word in the already identified terms */
+  for (j = 0; j < tl->num; j++)
+    {
+      TermEntry *te = &(tl->TE[j]);
+      if (compare (te->Word, Word) == 0)
+	{
+	  te->Count++;
+	  return j;
+	}
+    }
+
+
+  {
+    /* Create a new entry in the list for the new word */
+    TermEntry te;
+
+    /* [RPAP - Feb 97: Term Frequency] */
+    te.WE.word_num = word_num;
+    te.WE.count = count;
+    te.WE.doc_count = doc_count;
+    te.WE.max_doc_count = doc_count;   /* [RPAP - Jan 97: Stem Index Change] */
+    te.WE.invf_ptr = invf_ptr;
+    te.WE.invf_len = invf_len;
+    te.Count = Count;
+    te.Word = copy_string (Word);
+    if (!te.Word)
+      FatalError (1, "Could NOT create memory to add term");
+
+    /* [RPAP - Jan 97: Stem Index Change] */
+    te.Stem = copy_string (Word);
+    if (!te.Stem)
+      FatalError (1, "Could NOT create memory to add term");
+    stemmer (2, stemmer_num, te.Stem);
+
+    te.require_match = 0;  /* [RJM - 07/97: Ranked Required Terms] */
+
+    return AddTermEntry (query_term_list, &te);
+  }
+
+}
+
+/* =========================================================================
+ * Function: FreeTermList
+ * Description:
+ * Input:
+ * Output:
+ * ========================================================================= */
+
+void
+FreeTermList (TermList ** the_tl)
+{
+  int j;
+  TermList *tl = *the_tl;
+
+  for (j = 0; j < tl->num; j++)
+    {
+      if (tl->TE[j].Word)
+	Xfree (tl->TE[j].Word);
+      /* [RPAP - Jan 97: Stem Index Change] */
+      if (tl->TE[j].Stem)
+	Xfree (tl->TE[j].Stem);
+    }
+  Xfree (tl);
+
+  *the_tl = NULL;
+}
+
+/* =========================================================================
+ * Function: PrintWordEntry
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+PrintWordEntry (WordEntry * we, FILE * file)
+{
+  fprintf (file, "we->word_num = %d\n", we->word_num);
+  fprintf (file, "we->count = %ld\n", we->count);
+  fprintf (file, "we->doc_count = %ld\n", we->doc_count);
+  fprintf (file, "we->max_doc_count = %ld\n", we->max_doc_count);
+  fprintf (file, "we->invf_ptr = %ld\n", we->invf_ptr);
+  fprintf (file, "we->invf_len = %ld\n", we->invf_len);
+}
+
+/* =========================================================================
+ * Function: PrintTermEntry
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+PrintTermEntry (TermEntry * te, FILE * file)
+{
+
+  fprintf (file, "Term Entry\n");
+  fprintf (file, "te->Count = %d\n", te->Count);
+  fprintf (file, "te->Word = %s\n", str255_to_string (te->Word, NULL));
+  if (te->Stem != NULL)
+    fprintf (file, "te->Stem = %s\n", str255_to_string (te->Stem, NULL));  /* [RPAP - Jan 97: Stem Index Change] */
+  fprintf (file, "te->require_match = %i\n", te->require_match);  /* [RJM 07/97: Ranked Required Terms] */
+  PrintWordEntry (&(te->WE), file);
+
+}
+
+/* =========================================================================
+ * Function: PrintTermList
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+void
+PrintTermList (TermList * tl, FILE * file)
+{
+  int i;
+
+  fprintf (file, "Term List\n");
+  fprintf (file, "tl->list_size = %d\n", tl->list_size);
+  fprintf (file, "tl->num = %d\n", tl->num);
+
+  for (i = 0; i < tl->num; i++)
+    {
+      fprintf (file, "[%d]\n", i);
+      PrintTermEntry (&(tl->TE[i]), file);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/term_lists.h	(revision 21083)
@@ -0,0 +1,102 @@
+/**************************************************************************
+ *
+ * term_lists.h -- description
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:24  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/11/25 07:55:52  rjmcnab
+
+   Modified mg to that you can specify the stemmer you want
+   to use via a command line option. You specify it to
+   mg_passes during the build process. The number of the
+   stemmer that you used is stored within the inverted
+   dictionary header and the stemmed dictionary header so
+   the correct stemmer is used in later stages of building
+   and querying.
+
+   Revision 1.1  1998/11/17 09:35:44  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.1  1994/10/20  03:57:08  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+ */
+
+#ifndef TERM_LISTS_H
+#define TERM_LISTS_H
+
+#include "sysfuncs.h"
+
+#define MAXTERMSTRLEN 1023	/* maximum number of characters in term string */
+
+typedef struct WordEntry
+  {
+    int word_num;		/* Unique number for each different word */
+    u_long count;		/* Number of times the word occurs in the text */
+    u_long doc_count;		/* Number of documents that contain the word */
+    u_long max_doc_count;       /* [RPAP - Jan 97: Stem Index Change] */
+    u_long invf_ptr;		/* This is a byte position of the  
+				   inverted file entry corresponding to the word */
+    u_long invf_len;		/* This is the length of the inverted 
+				   file entry in bytes */
+  }
+WordEntry;
+
+typedef struct TermEntry
+  {
+    WordEntry WE;
+    int Count;			/* The number of times the word occurs in the query */
+    u_char *Word;		/* The word. */
+    u_char *Stem;               /* [RPAP - Jan 97: Stem Index Change] - The stemmed non-cf version of Word */
+    int require_match;          /* [RJM 07/97: Ranked Required Terms] 0=optional match, 1=must match */
+  }
+TermEntry;
+
+typedef struct TermList
+  {
+    int list_size;
+    int num;
+    TermEntry TE[1];
+  }
+TermList;
+
+#define GetNthWE(term_list, n) (&((term_list)->TE[(n)].WE))
+
+/* --- prototypes --- */
+void ConvertTermsToString (TermList * query_term_list, char *str);
+int AddTermEntry (TermList ** query_term_list, TermEntry * te);
+int AddTerm (TermList ** query_term_list, u_char * Word, int Count, int word_num,
+	     u_long count, u_long doc_count, u_long invf_ptr, u_long invf_len, /* [RPAP - Feb 97: Term Frequency] */
+	     int stemmer_num);  
+void ResetTermList (TermList ** tl);
+void FreeTermList (TermList ** the_tl);
+void PrintWordEntry (WordEntry * we, FILE * file);
+void PrintTermEntry (TermEntry * te, FILE * file);
+void PrintTermList (TermList * tl, FILE * file);
+TermList *MakeTermList (int n);
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/text.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/text.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/text.h	(revision 21083)
@@ -0,0 +1,176 @@
+/**************************************************************************
+ *
+ * text.h -- Header file for compression related stuff
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+
+#ifndef H_TEXT
+#define H_TEXT
+
+#include "huffman.h"
+
+
+
+
+
+/*****************************************************************************
+ *
+ * There are several different methods of compressing the text of the
+ * database. The following defines list the different methods of text
+ * compression
+ *
+ */
+
+
+/* The dictionary contains all the fragments that occur in the collection
+   i.e. escapes are not possible */
+#define MG_COMPLETE_DICTIONARY 0
+
+
+/* Certain words have been deleted from the dictionary. The words deleted
+   have been used to create the frequency huffman codes of the characters. 
+   This dictionary has an escape code and may be used to compress novel
+   words. This dictionary may fail if there is a novel character. */
+#define MG_PARTIAL_DICTIONARY 1
+
+
+/* This dictionary has an escape so that novel words and non-words can be 
+   coded. The method for coding the novel words and non-words is determined
+   by a dictionary parameter. */
+#define MG_SEED_DICTIONARY 2
+
+
+
+
+
+
+
+
+
+/*****************************************************************************
+ *
+ * With a seed dictionary there are several methods for coding the novel
+ * words and non-words the following defined values specify the different
+ * methods of coding.
+ *
+ */
+
+
+/* Code novel words and non-words character by character using huffman codes.
+   The huffman codes for the word and non-word lengths and characters are 
+   generated from the distribution of lengths and characters in the
+   dictionary. */
+#define MG_NOVEL_HUFFMAN_CHARS 0
+
+
+/* This method codes novel words using binary codes. The novel words are stored
+   in a auxillary dictionary which is built by pass two. */
+#define MG_NOVEL_BINARY 1
+
+
+/* This method codes novel words using delta codes. The novel words are stored
+   in a auxillary dictionary which is built by pass two. */
+#define MG_NOVEL_DELTA 2
+
+
+/* This method codes novel words using hybrid version of delta. The novel
+   words are stored in a auxillary dictionary which is built by pass two. */
+#define MG_NOVEL_HYBRID 3
+
+
+/* This method codes novel words using hybrid version of delta and a MTF
+   operation. The novel words are stored in a auxillary dictionary which
+   is built by pass two. */
+#define MG_NOVEL_HYBRID_MTF 4
+
+
+
+
+
+
+/* This specified an amount of extra space allocated in the
+   compression_dict_header for adding new parameters. As new
+   parameters are added this should be decreased. */
+#define TEXT_PARAMS 15
+
+
+
+typedef struct compression_dict_header
+  {
+    u_long dict_type;
+    u_long novel_method;
+    u_long params[TEXT_PARAMS];
+    u_long num_words[2];
+    u_long num_word_chars[2];
+    u_long lookback;
+  }
+compression_dict_header;
+
+
+typedef struct comp_frags_header
+  {
+    huff_data hd;
+    u_long uncompressed_size;
+    u_long huff_words_size[MAX_HUFFCODE_LEN + 1];
+  }
+comp_frags_header;
+
+
+
+typedef struct compressed_text_header
+  {
+    u_long num_of_docs;
+    u_long num_of_words;	/* number of words in collection */
+    double num_of_bytes; /* [RJM 07/97: 4G limit] */
+    double ratio;
+    u_long length_of_longest_doc;	/* (characters) */
+    u_long dummy;    /* added to make the structure the same on different architectures */
+  }
+compressed_text_header;
+
+
+typedef struct compression_stats_header
+  {
+    u_long num_docs;
+    u_long dummy;   /* added to make the structure the same on different architectures */
+    double num_bytes; /* [RJM 07/97: 4G limit] */
+  }
+compression_stats_header;
+
+
+typedef struct frags_stats_header
+  {
+    u_long num_frags;
+    u_long mem_for_frags;
+  }
+frags_stats_header;
+
+
+typedef struct aux_frags_header
+  {
+    u_long num_frags;
+    u_long mem_for_frags;
+  }
+aux_frags_header;
+
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/text.pass1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/text.pass1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/text.pass1.c	(revision 21083)
@@ -0,0 +1,408 @@
+/**************************************************************************
+ *
+ * text.pass1.c -- Text compression (Pass 1)
+ * Copyright (C) 1994  Neil Sharman, Gary Eddy and Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "huffman.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+#include "mg_files.h"
+#include "mg.h"
+#include "build.h"
+#include "locallib.h"
+#include "words.h"
+#include "text.h"
+#include "hash.h"
+#include "local_strings.h"
+/* for more meaningful messages - jrm21 (gsdl) */
+#ifdef HAVE_STRERROR
+#include <string.h>
+#include <errno.h>
+#endif
+
+#define POOL_SIZE 1024*1024
+#define INITIAL_HASH_SIZE 7927
+
+
+typedef struct hash_rec
+  {
+    unsigned long wcnt;		/* word frequency */
+    unsigned long occurance_num;
+    u_char *word;
+  }
+hash_rec;
+
+typedef struct dict_data
+  {
+    hash_rec *HashTable;
+    unsigned long HashSize;
+    unsigned long HashUsed;
+    unsigned long wordnum;
+    unsigned long words_read;
+    unsigned long bytes_diff;
+    huff_data hd;
+  }
+dict_data;
+
+
+
+static unsigned long LongestDoc = 0;
+static unsigned long occurance_num = 0;
+static dict_data DictData[2];
+
+static u_char *Pool;
+static int PoolLeft;
+static double inputbytes = 0; /* [RJM 07/97: 4G limit] */
+static unsigned long MaxMemInUse = 0;
+static unsigned long MemInUse = 0;
+static compression_stats_header csh =
+{0, 0.0}; /* [RJM 07/97: 4G limit] */
+
+
+static void 
+ChangeMem (int Change)
+{
+  MemInUse += Change;
+  if (MemInUse > MaxMemInUse)
+    MaxMemInUse = MemInUse;
+}
+
+
+
+
+int 
+init_text_1 (char *FileName)
+{
+  int which;
+
+  if (!(Pool = Xmalloc (POOL_SIZE)))
+    {
+      Message ("Unable to allocate memory for pool");
+      return (COMPERROR);
+    }
+  PoolLeft = POOL_SIZE;
+  ChangeMem (POOL_SIZE);
+
+  for (which = 1; which >= 0; which--)
+    {
+      u_char *word;
+      hash_rec *ent;
+      dict_data *dd = &DictData[which];
+
+      dd->wordnum = 0;
+      dd->words_read = 0;
+      dd->bytes_diff = 0;
+      dd->HashSize = INITIAL_HASH_SIZE;
+      dd->HashUsed = 0;
+
+      if (!(dd->HashTable = Xmalloc (sizeof (hash_rec) * dd->HashSize)))
+	{
+	  Message ("Unable to allocate memory for table");
+	  return (COMPERROR);
+	}
+      ChangeMem (sizeof (hash_rec) * dd->HashSize);
+      bzero ((char *) (dd->HashTable), sizeof (hash_rec) * dd->HashSize);
+
+      word = Pool;
+      *Pool++ = '\0';
+      PoolLeft--;
+      {
+	register u_char *wptr;
+	register int hsize = dd->HashSize;
+	register unsigned long hashval, step;
+
+	HASH (hashval, step, word, hsize);
+	wptr = (dd->HashTable + hashval)->word;
+	while (wptr)
+	  {
+	    hashval += step;
+	    if (hashval >= hsize)
+	      hashval -= hsize;
+	    wptr = (dd->HashTable + hashval)->word;
+	  }
+	ent = dd->HashTable + hashval;
+      }
+      ent->wcnt = 1;
+      ent->word = word;
+      dd->HashUsed = 1;
+    }
+  return (COMPALLOK);
+}
+
+
+
+
+int 
+process_text_1 (u_char * s_in, int l_in)
+{
+  int which;
+  u_char *end = s_in + l_in - 1;
+
+  if (l_in > LongestDoc)
+    LongestDoc = l_in;
+
+  csh.num_docs++;
+  csh.num_bytes += l_in;
+
+  which = inaword (s_in, end);
+  /*
+   ** Alternately parse off words and non-words from the input
+   ** stream beginning with a non-word. Each token is then
+   ** inserted into the set if it does not exist or has it's
+   ** frequency count incremented if it does.
+   */
+  for (; s_in <= end; which = !which)
+    {
+      u_char Word[MAXWORDLEN + 1];
+      dict_data *dd = &DictData[which];
+
+      /* First parse a word or non-word out of the string */
+      if (which)
+	PARSE_WORD (Word, s_in, end);
+      else
+	PARSE_NON_WORD (Word, s_in, end);
+
+      dd->wordnum++;
+      inputbytes += *Word;
+      dd->words_read++;
+
+      /* Search the hash table for Word */
+      {
+	register unsigned long hashval, step;
+	register int hsize = dd->HashSize;
+	HASH (hashval, step, Word, hsize);
+	for (;;)
+	  {
+	    register u_char *s1;
+	    register u_char *s2;
+	    register int len;
+	    register hash_rec *ent;
+	    ent = dd->HashTable + hashval;
+	    if (!ent->word)
+	      {
+		int len = *Word + 1;
+		if (len > PoolLeft)
+		  {
+		    if (!(Pool = Xmalloc (POOL_SIZE)))
+		      {
+			Message ("Unable to allocate memory for pool");
+			return (COMPERROR);
+		      }
+		    PoolLeft = POOL_SIZE;
+		    ChangeMem (POOL_SIZE);
+		  }
+		ent->occurance_num = occurance_num++;
+		ent->wcnt = 1;
+		ent->word = Pool;
+		memcpy (Pool, Word, len);
+		Pool += len;
+		PoolLeft -= len;
+		dd->HashUsed++;
+		dd->bytes_diff += Word[0];
+		break;
+	      }
+
+	    /* Compare the words */
+	    s1 = Word;
+	    s2 = ent->word;
+	    len = *s1 + 1;
+	    for (; len; len--)
+	      if (*s1++ != *s2++)
+		break;
+
+	    if (len)
+	      {
+		hashval = (hashval + step);
+		if (hashval >= hsize)
+		  hashval -= hsize;
+	      }
+	    else
+	      {
+		ent->wcnt++;
+		break;
+	      }
+	  }
+      }
+
+
+      if (dd->HashUsed >= dd->HashSize >> 1)
+	{
+	  hash_rec *ht;
+	  unsigned long size;
+	  unsigned long i;
+	  size = prime (dd->HashSize * 2);
+	  if (!(ht = Xmalloc (sizeof (hash_rec) * size)))
+	    {
+	      Message ("Unable to allocate memory for table");
+	      return (COMPERROR);
+	    }
+	  ChangeMem (sizeof (hash_rec) * size);
+	  bzero ((char *) ht, sizeof (hash_rec) * size);
+
+	  for (i = 0; i < dd->HashSize; i++)
+	    if (dd->HashTable[i].word)
+	      {
+		register u_char *wptr;
+		register unsigned long hashval, step;
+
+		wptr = dd->HashTable[i].word;
+		HASH (hashval, step, wptr, size);
+		wptr = (ht + hashval)->word;
+		while (wptr)
+		  {
+		    hashval += step;
+		    if (hashval >= size)
+		      hashval -= size;
+		    wptr = (ht + hashval)->word;
+		  }
+		ht[hashval] = dd->HashTable[i];
+	      }
+	  Xfree (dd->HashTable);
+	  ChangeMem (-sizeof (hash_rec) * dd->HashSize);
+	  dd->HashTable = ht;
+	  dd->HashSize = size;
+
+
+	}
+    }
+  return (COMPALLOK);
+}				/* encode */
+
+
+
+static int 
+PackHashTable (dict_data * dd)
+{
+  int s, d;
+  for (s = d = 0; s < dd->HashSize; s++)
+    if (dd->HashTable[s].word)
+      dd->HashTable[d++] = dd->HashTable[s];
+  ChangeMem (-sizeof (hash_rec) * dd->HashSize);
+  ChangeMem (sizeof (hash_rec) * dd->HashUsed);
+  if (!(dd->HashTable = Xrealloc (dd->HashTable,
+				  sizeof (hash_rec) * dd->HashUsed)))
+    {
+      Message ("Out of memory");
+      return COMPERROR;
+    }
+  dd->HashSize = dd->HashUsed;
+  return COMPALLOK;
+}
+
+
+
+
+
+static int 
+ent_comp (const void *s1, const void *s2)
+{
+  return casecompare (((hash_rec *) s1)->word, ((hash_rec *) s2)->word);
+}
+
+
+
+static void 
+WriteHashTable (FILE * fp, dict_data * dd)
+{
+  frags_stats_header fsh;
+  u_long j = 0;
+  u_char *curr;
+
+  if (PackHashTable (dd) == COMPERROR)
+    return;
+
+  qsort (dd->HashTable, dd->HashUsed, sizeof (hash_rec), ent_comp);
+
+  fsh.num_frags = dd->HashSize;
+  fsh.mem_for_frags = dd->HashSize;
+  for (j = 0; j < dd->HashSize; j++)
+    fsh.mem_for_frags += dd->HashTable[j].word[0];
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(fsh.num_frags);
+  HTONUL(fsh.mem_for_frags);
+
+  fwrite (&fsh, sizeof (fsh), 1, fp);
+
+  for (j = 0; j < dd->HashSize; j++)
+    {
+      curr = dd->HashTable[j].word;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(dd->HashTable[j].wcnt);
+      HTONUL(dd->HashTable[j].occurance_num);
+
+      fwrite (&dd->HashTable[j].wcnt, sizeof (dd->HashTable[j].wcnt), 1, fp);
+      fwrite (&dd->HashTable[j].occurance_num,
+	      sizeof (dd->HashTable[j].occurance_num), 1, fp);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(dd->HashTable[j].wcnt);
+      NTOHUL(dd->HashTable[j].occurance_num);
+
+      fwrite (curr, sizeof (u_char), curr[0] + 1, fp);
+    }
+}
+
+
+int 
+done_text_1 (char *file_name)
+{
+  char *temp_str;
+  FILE *fp;
+
+  if (!(fp = create_file (file_name, TEXT_STATS_DICT_SUFFIX, "wb",
+			  MAGIC_STATS_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf(stderr,"Couldn't create file %s%s:%s\n",
+	      file_name, TEXT_STATS_DICT_SUFFIX,
+#if defined(HAVE_STRERROR) || defined(__WIN32__)
+	      strerror(errno)
+#else
+	      " "
+#endif
+	      );
+      return COMPERROR;
+    }
+
+  temp_str = msg_prefix;
+  msg_prefix = "text.pass1";
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(csh.num_docs);
+  HTOND(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  fwrite (&csh, sizeof (csh), 1, fp);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  WriteHashTable (fp, &DictData[0]);
+  WriteHashTable (fp, &DictData[1]);
+  msg_prefix = temp_str;
+  return COMPALLOK;
+}				/* done_encode */
Index: /main/tags/2.38/gsdl/packages/mg/src/text/text.pass2.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/text.pass2.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/text.pass2.c	(revision 21083)
@@ -0,0 +1,788 @@
+/**************************************************************************
+ *
+ * text.pass2.c -- Text compression (Pass 2)
+ * Copyright (C) 1994  Neil Sharman, Gary Eddy and Alistair Moffat
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_m_mem.h"
+#include "bitio_m.h"
+#include "huffman.h"
+#include "bitio_stdio.h"
+#include "huffman_stdio.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg.h"
+#include "mg_files.h"
+#include "build.h"
+#include "words.h"
+#include "text.h"
+#include "hash.h"
+#include "locallib.h"
+#include "comp_dict.h"
+
+
+
+
+/*
+   $Log$
+   Revision 1.2  2002/01/22 02:41:14  jrm21
+   Try to print out an error if the aux file couldn't be written to.
+
+   Revision 1.1  1999/08/10 21:18:25  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.2  1998/12/17 09:12:54  rjmcnab
+
+   Altered mg to process utf-8 encoded Unicode. The main changes
+   are in the parsing of the input, the casefolding, and the stemming.
+
+   Revision 1.1  1998/11/17 09:35:47  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:57:10  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:42:14  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+#define POOL_SIZE 1024*256
+
+typedef struct char_pool
+  {
+    struct char_pool *next;
+    u_long left;
+    u_char *ptr;
+    u_char pool[POOL_SIZE];
+  }
+char_pool;
+
+typedef struct novel_hash_rec
+  {
+    u_long ordinal_num;
+    u_char *word;
+  }
+novel_hash_rec;
+
+
+#define INITIAL_HASH_SIZE 7927
+#define MAX_SWAPS 10000
+
+typedef struct novel_hash_table
+  {
+    novel_hash_rec *HashTable;
+    u_long HashSize, HashUsed;
+    char_pool *first_pool;
+    char_pool *pool;
+    u_long next_num, binary_start;
+    novel_hash_rec **code_to_nhr;
+  }
+novel_hash_table;
+
+
+static FILE *text, *text_idx;
+
+static u_char *comp_buffer;
+
+static u_long text_length;
+
+/* [RJM 07/97: 4G limit] */
+static double stats_in_tot_bytes = 0.0;
+static double stats_in_bytes = 0.0;
+static double stats_out_bytes = 0.0;
+
+
+static novel_hash_table nht[2];
+
+static u_long prefix_len = 0;
+
+int blk_start[2][33], blk_end[2][33];
+
+
+static char_pool *
+new_pool (char_pool * pool)
+{
+  char_pool *p = Xmalloc (sizeof (char_pool));
+  if (!p)
+    FatalError (1, "Unable to allocate memory for pool");
+  if (pool)
+    pool->next = p;
+  p->next = NULL;
+  p->left = POOL_SIZE;
+  p->ptr = p->pool;
+  return p;
+}
+
+
+
+int 
+init_text_2 (char *file_name)
+{
+  char path[512];
+  int i;
+
+  if (LoadCompressionDictionary (make_name (file_name, TEXT_DICT_SUFFIX,
+					    path)) == COMPERROR)
+    return COMPERROR;
+
+  if (!(text = create_file (file_name, TEXT_SUFFIX, "w+b",
+			    MAGIC_TEXT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return COMPERROR;
+
+  bzero ((char *) &cth, sizeof (cth));
+
+  if (fwrite (&cth, sizeof (cth), 1, text) != 1)
+    return COMPERROR;
+
+  text_length = sizeof (u_long) + sizeof (cth);
+
+  if (!(text_idx = create_file (file_name, TEXT_IDX_SUFFIX, "w+b",
+				MAGIC_TEXI, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return COMPERROR;
+
+  if (fwrite (&cth, sizeof (cth), 1, text_idx) != 1)
+    return COMPERROR;
+
+  if (!(comp_buffer = Xmalloc (sizeof (u_char) * buf_size)))
+    {
+      Message ("No memory for compression buffer");
+      return (COMPERROR);
+    }
+
+#if 0
+  MaxMemInUse += sizeof (u_char) * buf_size;
+#endif
+
+  if (cdh.novel_method != MG_NOVEL_HUFFMAN_CHARS)
+    for (i = 0; i <= 1; i++)
+      {
+	nht[i].HashSize = INITIAL_HASH_SIZE;
+	nht[i].HashTable = Xmalloc (sizeof (novel_hash_rec) * nht[i].HashSize);
+	bzero ((char *) nht[i].HashTable,
+	       sizeof (novel_hash_rec) * nht[i].HashSize);
+	nht[i].HashUsed = 0;
+	nht[i].HashSize = INITIAL_HASH_SIZE;
+	nht[i].pool = nht[i].first_pool = new_pool (NULL);
+	nht[i].next_num = 1;
+	nht[i].binary_start = 1;
+	if (cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+	  nht[i].code_to_nhr = Xmalloc (sizeof (novel_hash_rec *) *
+					((nht[i].HashSize >> 1) + 2));
+	else
+	  nht[i].code_to_nhr = NULL;
+	if (cdh.novel_method == MG_NOVEL_HYBRID ||
+	    cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+	  {
+	    int num;
+	    num = 1;
+	    blk_start[i][0] = 0;
+	    blk_end[i][0] = cdh.num_words[i] - 1;
+	    while (num < 33)
+	      {
+		blk_start[i][num] = blk_end[i][num - 1] + 1;
+		blk_end[i][num] = blk_start[i][num] +
+		  (blk_end[i][num - 1] - blk_start[i][num - 1]) * 2;
+		num++;
+	      }
+	  }
+      }
+
+  return (COMPALLOK);
+}
+
+
+
+int 
+ic (void *a, void *b)
+{
+  return *((int *) a) - *((int *) b);
+}
+
+
+
+/* #define DOCDUMP 477 */
+
+int 
+process_text_2 (u_char * s_in, int l_in)
+{
+  int which, byte_length;
+  u_char *end = s_in + l_in - 1;
+  int novels_used[2];
+  int swaps[2][MAX_SWAPS];
+
+  which = inaword (s_in, end);
+
+  ENCODE_START (comp_buffer, buf_size)
+
+    ENCODE_BIT (which);
+
+  if (cdh.novel_method == MG_NOVEL_BINARY)
+    {
+      DELTA_ENCODE_L (nht[0].binary_start, prefix_len);
+      DELTA_ENCODE_L (nht[1].binary_start, prefix_len);
+    }
+
+  novels_used[0] = novels_used[1] = 0;
+
+#ifdef DOCDUMP
+  if (cth.num_of_docs == DOCDUMP)
+    {
+      printf ("---------------------------------------------------\n");
+      printf ("which = %d\n", which);
+    }
+#endif
+
+  for (; s_in <= end; which = !which)
+    {
+      u_char Word[MAXWORDLEN + 1];
+      int res;
+
+      if (which)
+	cth.num_of_words++;
+
+      /* First parse a word or non-word out of the string */
+      if (which)
+	PARSE_WORD (Word, s_in, end);
+      else
+	PARSE_NON_WORD (Word, s_in, end);
+
+#ifdef DOCDUMP
+      if (cth.num_of_docs == DOCDUMP)
+	{
+	  printf ("%sword : \"%.*s\"", which ? "    " : "non-", Word[0], Word + 1);
+	}
+#endif
+
+      /* Search the hash table for Word */
+      if (ht[which])
+	{
+	  register unsigned long hashval, step;
+	  register int tsize = ht[which]->size;
+	  register u_char **wptr;
+	  HASH (hashval, step, Word, tsize);
+	  for (;;)
+	    {
+	      register u_char *s1;
+	      register u_char *s2;
+	      register int len;
+	      wptr = ht[which]->table[hashval];
+	      if (wptr == NULL)
+		{
+		  res = COMPERROR;
+		  break;
+		}
+
+	      /* Compare the words */
+	      s1 = Word;
+	      s2 = *wptr;
+	      len = *s1 + 1;
+	      for (; len; len--)
+		if (*s1++ != *s2++)
+		  break;
+
+	      if (len)
+		{
+		  hashval += step;
+		  if (hashval >= tsize)
+		    hashval -= tsize;
+		}
+	      else
+		{
+		  res = ht[which]->table[hashval] - ht[which]->words;
+		  break;
+		}
+	    }
+	}
+      else
+	res = COMPERROR;
+      /* Check that the word was found in the dictionary */
+      if (res == COMPERROR)
+	{
+	  if (cdh.dict_type == MG_COMPLETE_DICTIONARY)
+	    {
+	      Message ("Unknown word \"%.*s\"\n", *Word, Word + 1);
+	      return (COMPERROR);
+	    }
+	  if (cdh.dict_type == MG_PARTIAL_DICTIONARY)
+	    {
+	      u_long i;
+	      if (ht[which])
+		{
+		  res = ht[which]->hd->num_codes - 1;
+		  HUFF_ENCODE (res, ht[which]->codes, ht[which]->hd->clens);
+		}
+	      HUFF_ENCODE (Word[0], lens_codes[which], lens_huff[which].clens);
+	      for (i = 0; i < Word[0]; i++)
+		HUFF_ENCODE (Word[i + 1], char_codes[which],
+			     char_huff[which].clens);
+	    }
+	  if (cdh.dict_type == MG_SEED_DICTIONARY)
+	    {
+	      if (ht[which])
+		{
+		  res = ht[which]->hd->num_codes - 1;
+		  HUFF_ENCODE (res, ht[which]->codes, ht[which]->hd->clens);
+		}
+	      switch (cdh.novel_method)
+		{
+		case MG_NOVEL_HUFFMAN_CHARS:
+		  {
+		    u_long i;
+		    HUFF_ENCODE (Word[0], lens_codes[which],
+				 lens_huff[which].clens);
+		    for (i = 0; i < Word[0]; i++)
+		      HUFF_ENCODE (Word[i + 1], char_codes[which],
+				   char_huff[which].clens);
+		  }
+		  break;
+		case MG_NOVEL_BINARY:
+		case MG_NOVEL_DELTA:
+		case MG_NOVEL_HYBRID:
+		case MG_NOVEL_HYBRID_MTF:
+		  {
+		    register unsigned long hashval, step;
+		    register novel_hash_table *h = &nht[which];
+		    register int hsize = h->HashSize;
+		    register novel_hash_rec *ent;
+		    HASH (hashval, step, Word, hsize);
+		    for (;;)
+		      {
+			register u_char *s1, *s2;
+			register int len;
+			ent = h->HashTable + hashval;
+			if (!ent->word)
+			  {
+			    int len = *Word + 1;
+			    if (len > h->pool->left)
+			      h->pool = new_pool (h->pool);
+			    ent->word = h->pool->ptr;
+			    ent->ordinal_num = h->next_num++;
+			    if (cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+			      h->code_to_nhr[ent->ordinal_num - 1] = ent;
+			    memcpy (h->pool->ptr, Word, len);
+			    h->pool->ptr += len;
+			    h->pool->left -= len;
+			    h->HashUsed++;
+			    break;
+			  }
+			/* Compare the words */
+			s1 = Word;
+			s2 = ent->word;
+			len = *s1 + 1;
+			for (; len; len--)
+			  if (*s1++ != *s2++)
+			    break;
+
+			if (!len)
+			  break;
+
+			hashval = (hashval + step);
+			if (hashval >= hsize)
+			  hashval -= hsize;
+		      }
+
+		    switch (cdh.novel_method)
+		      {
+		      case MG_NOVEL_BINARY:
+			{
+			  BINARY_ENCODE (ent->ordinal_num, h->binary_start);
+			  if (ent->ordinal_num == h->binary_start)
+			    h->binary_start++;
+			}
+			break;
+		      case MG_NOVEL_DELTA:
+			{
+			  DELTA_ENCODE (ent->ordinal_num);
+			}
+			break;
+		      case MG_NOVEL_HYBRID:
+			{
+			  int k = 0;
+			  int j = ent->ordinal_num - 1;
+			  while (j > blk_end[which][k])
+			    k++;
+			  assert (j - blk_start[which][k] + 1 >= 1 &&
+				  j - blk_start[which][k] + 1 <=
+			       blk_end[which][k] - blk_start[which][k] + 1);
+
+			  GAMMA_ENCODE (k + 1);
+			  BINARY_ENCODE (j - blk_start[which][k] + 1,
+					 blk_end[which][k] -
+					 blk_start[which][k] + 1);
+			}
+			break;
+		      case MG_NOVEL_HYBRID_MTF:
+			{
+			  int k = 0;
+			  int j = ent->ordinal_num - 1;
+			  while (j > blk_end[which][k])
+			    k++;
+			  assert (j - blk_start[which][k] + 1 >= 1 &&
+				  j - blk_start[which][k] + 1 <=
+			       blk_end[which][k] - blk_start[which][k] + 1);
+			  GAMMA_ENCODE (k + 1);
+			  BINARY_ENCODE (j - blk_start[which][k] + 1,
+					 blk_end[which][k] -
+					 blk_start[which][k] + 1);
+
+			  if (ent->ordinal_num - 1 >= novels_used[which])
+			    {
+			      int a = novels_used[which];
+			      int b = ent->ordinal_num - 1;
+			      novel_hash_rec *temp;
+
+
+/*                            fprintf(stderr, "a = %d , b = %d\n", a, b);
+ */
+			      temp = h->code_to_nhr[a];
+			      h->code_to_nhr[a] = h->code_to_nhr[b];
+			      h->code_to_nhr[b] = temp;
+			      h->code_to_nhr[a]->ordinal_num = a + 1;
+			      h->code_to_nhr[b]->ordinal_num = b + 1;
+			      if (novels_used[which] == MAX_SWAPS)
+				FatalError (1, "Not enough mem for swapping");
+			      swaps[which][novels_used[which]] = b;
+			      novels_used[which]++;
+			    }
+			}
+			break;
+		      }
+		    if (h->HashUsed >= h->HashSize >> 1)
+		      {
+			novel_hash_rec *ht;
+			unsigned long size;
+			unsigned long i;
+			size = prime (h->HashSize * 2);
+			if (cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+			  {
+			    Xfree (h->code_to_nhr);
+			    h->code_to_nhr = Xmalloc (sizeof (novel_hash_rec *) *
+						      ((size >> 1) + 2));
+			  }
+			if (!(ht = Xmalloc (sizeof (novel_hash_rec) * size)))
+			  {
+			    Message ("Unable to allocate memory for table");
+			    return (COMPERROR);
+			  }
+			bzero ((char *) ht, sizeof (novel_hash_rec) * size);
+
+			for (i = 0; i < h->HashSize; i++)
+			  if (h->HashTable[i].word)
+			    {
+			      register u_char *wptr;
+			      register unsigned long hashval, step;
+
+			      wptr = h->HashTable[i].word;
+			      HASH (hashval, step, wptr, size);
+			      wptr = (ht + hashval)->word;
+			      while (wptr)
+				{
+				  hashval += step;
+				  if (hashval >= size)
+				    hashval -= size;
+				  wptr = (ht + hashval)->word;
+				}
+			      ht[hashval] = h->HashTable[i];
+			      if (cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+				h->code_to_nhr[ht[hashval].ordinal_num - 1] =
+				  &ht[hashval];
+			    }
+			Xfree (h->HashTable);
+			h->HashTable = ht;
+			h->HashSize = size;
+		      }
+		  }
+		  break;
+		}
+	    }
+	}
+      else
+	{
+	  HUFF_ENCODE (res, ht[which]->codes, ht[which]->hd->clens);
+#ifdef DOCDUMP
+	  if (cth.num_of_docs == DOCDUMP)
+	    {
+	      printf ("   %d %d\n", ht[which]->hd->clens[res],
+		      ht[which]->codes[res]);
+	    }
+#endif
+	}
+    }
+
+
+  /* Add a 1 bit onto the end of the buffer the remaining bits in the last
+     byte will all be zero */
+
+  ENCODE_BIT (1);
+
+  ENCODE_FLUSH;
+
+  byte_length = __pos - __base;
+  if (!__remaining)
+    {
+      Message ("The end of the buffer was probably overrun");
+      return COMPERROR;
+    }
+
+  ENCODE_DONE
+
+#ifdef DOCDUMP
+    if (cth.num_of_docs == DOCDUMP)
+    {
+      printf ("unused bits = %d\n", bits_unused);
+    }
+#endif
+
+  HTONUL(text_length);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&text_length, sizeof (text_length), 1, text_idx);
+  NTOHUL(text_length);  /* [RPAP - Jan 97: Endian Ordering] */
+  text_length += byte_length;
+
+#ifdef DOCDUMP
+  if (cth.num_of_docs == DOCDUMP)
+    {
+      int i;
+      for (i = 0; i < byte_length; i++)
+	printf ("%02x ", comp_buffer[i]);
+      printf ("\n");
+    }
+#endif
+
+  if (cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    for (which = 0; which <= 1; which++)
+      for (novels_used[which]--; novels_used[which] >= 0; novels_used[which]--)
+	{
+	  int a = novels_used[which];
+	  int b = swaps[which][novels_used[which]];
+	  novel_hash_rec *temp;
+	  temp = nht[which].code_to_nhr[a];
+	  nht[which].code_to_nhr[a] = nht[which].code_to_nhr[b];
+	  nht[which].code_to_nhr[b] = temp;
+	  nht[which].code_to_nhr[a]->ordinal_num = a + 1;
+	  nht[which].code_to_nhr[b]->ordinal_num = b + 1;
+	}
+
+
+  fwrite (comp_buffer, sizeof (*comp_buffer), byte_length, text);
+
+  if ((double) l_in / (double) byte_length > cth.ratio)
+    cth.ratio = (double) l_in / (double) byte_length;
+
+  cth.num_of_docs++;
+  if (l_in > cth.length_of_longest_doc)
+    cth.length_of_longest_doc = l_in;
+
+  cth.num_of_bytes += l_in;
+
+  if (Comp_Stats)
+    {
+      stats_in_tot_bytes += l_in;
+      stats_in_bytes += l_in;
+      stats_out_bytes += byte_length;
+      if (stats_in_bytes >= comp_stat_point)
+	{
+	  fprintf (Comp_Stats, "%10.0f %10.0f %10.0f %f\n", stats_in_tot_bytes,
+		   stats_in_bytes, stats_out_bytes,
+		   (double) stats_out_bytes / (double) stats_in_bytes);
+	  stats_in_bytes = 0.0;
+	  stats_out_bytes = 0.0;
+	}
+    }
+
+  return COMPALLOK;
+}
+
+
+
+
+
+
+int 
+write_aux_dict (char *FileName)
+{
+  int i;
+  FILE *aux;
+  if (!(aux = create_file (FileName, TEXT_DICT_AUX_SUFFIX, "wb",
+			   MAGIC_AUX_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf(stderr,"Couldn't create file %s%s:%s\n",
+              FileName, TEXT_DICT_AUX_SUFFIX,
+#if defined(HAVE_STRERROR) || defined(__WIN32__)
+              strerror(errno)
+#else
+              " "
+#endif
+              );
+      return COMPERROR;
+    }
+  for (i = 0; i <= 1; i++)
+    {
+      aux_frags_header afh;
+      char_pool *cp;
+
+      afh.num_frags = nht[i].HashUsed;
+      afh.mem_for_frags = 0;
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	afh.mem_for_frags += POOL_SIZE - cp->left;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(afh.num_frags);
+      HTONUL(afh.mem_for_frags);
+
+      fwrite (&afh, sizeof (afh), 1, aux);
+
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	fwrite (cp->pool, POOL_SIZE - cp->left, sizeof (u_char), aux);
+    }
+  fclose (aux);
+  return COMPALLOK;
+}
+
+
+void 
+estimate_compressed_aux_dict (void)
+{
+  int i;
+  u_long aux_compressed = 0, total_uncomp = 0;
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+      long chars[256], fchars[256];
+      long lens[16], flens[16];
+      char_pool *cp;
+      bzero ((char *) chars, sizeof (chars));
+      bzero ((char *) lens, sizeof (lens));
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	{
+	  u_char *buf = cp->pool;
+	  while (buf != cp->ptr)
+	    {
+	      int len = *buf++;
+	      lens[len]++;
+	      total_uncomp += len + 4;
+	      for (; len; len--)
+		chars[*buf++]++;
+	    }
+	}
+      for (j = 0; j < 256; j++)
+	if (!chars[j] && PESINAWORD (j) == i)
+	  fchars[j] = 1;
+	else
+	  fchars[j] = chars[j];
+      for (j = 0; j < 16; j++)
+	if (!lens[j])
+	  flens[j] = 1;
+	else
+	  flens[j] = lens[j];
+
+      aux_compressed += (Calculate_Huffman_Size (16, flens, lens) +
+			 Calculate_Huffman_Size (256, fchars, chars)) / 8;
+
+    }
+
+  Message ("Aux dictionary (Uncompressed) %.2f Mb ( %u bytes   %0.3f %%)",
+	   total_uncomp / 1024.0 / 1024, total_uncomp,
+	   (total_uncomp * 100.0) / bytes_processed);
+  Message ("Aux dictionary (Compressed)   %.2f Mb ( %.0f bytes   %0.3f %%)",
+	   aux_compressed / 1024.0 / 1024, aux_compressed * 1.0,
+	   (aux_compressed * 100.0) / bytes_processed);
+}
+
+
+
+
+
+
+int 
+done_text_2 (char *FileName)
+{
+  if (Comp_Stats)
+    fprintf (Comp_Stats, "%10.0f %10.0f %10.0f %f\n", stats_in_tot_bytes,
+	     stats_in_bytes, stats_out_bytes,
+	     (double) stats_out_bytes / (double) stats_in_bytes);
+
+  HTONUL(text_length);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&text_length, sizeof (text_length), 1, text_idx);
+  NTOHUL(text_length);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(cth.num_of_docs);
+  HTOND(cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+  HTONUL(cth.num_of_words);
+  HTONUL(cth.length_of_longest_doc);
+  HTOND(cth.ratio);
+
+  if (fseek (text_idx, sizeof (u_long), SEEK_SET) == -1 ||
+      fwrite (&cth, sizeof (cth), 1, text_idx) != 1)
+    return COMPERROR;
+  fclose (text_idx);
+
+  if (fseek (text, sizeof (u_long), SEEK_SET) == -1 ||
+      fwrite (&cth, sizeof (cth), 1, text) != 1)
+    return COMPERROR;
+  fclose (text);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cth.num_of_docs);
+  NTOHD(cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(cth.num_of_words);
+  NTOHUL(cth.length_of_longest_doc);
+  NTOHD(cth.ratio);
+  
+
+  Message ("Compressed Text %.2f Mb ( %u bytes   %0.3f %%)",
+	   text_length / 1024.0 / 1024.0, text_length,
+	   (text_length * 100.0) / bytes_processed);
+  Message ("Words portion of the dictionary %.2f Mb ( %.0f bytes   %0.3f %%)",
+	   Words_disk / 1024.0 / 1024, Words_disk * 1.0,
+	   (Words_disk * 100.0) / bytes_processed);
+
+  if (cdh.dict_type != MG_COMPLETE_DICTIONARY &&
+      (cdh.novel_method == MG_NOVEL_BINARY ||
+       cdh.novel_method == MG_NOVEL_DELTA ||
+       cdh.novel_method == MG_NOVEL_HYBRID ||
+       cdh.novel_method == MG_NOVEL_HYBRID_MTF))
+    {
+      if (write_aux_dict (FileName) == COMPERROR)
+	return COMPERROR;
+      estimate_compressed_aux_dict ();
+    }
+  else
+    {
+      if (cdh.dict_type != MG_COMPLETE_DICTIONARY)
+	Message ("Huffman info for chars in dictionary %.2f Mb"
+		 " ( %u bytes   %0.3f %%)",
+		 Chars_disk / 1024.0 / 1024, Chars_disk,
+		 (Chars_disk * 100.0) / bytes_processed);
+      unlink (make_name (FileName, TEXT_DICT_AUX_SUFFIX, NULL));
+    }
+
+  return (COMPALLOK);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/text_get.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/text_get.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/text_get.c	(revision 21083)
@@ -0,0 +1,1087 @@
+/**************************************************************************
+ *
+ * text_get.c -- Function for reading documents from the compressed text
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "filestats.h"
+#include "timing.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "huffman.h"
+#include "bitio_m_mem.h"
+#include "bitio_m.h"
+#include "bitio_stdio.h"
+#include "huffman_stdio.h"
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "text_get.h"
+#include "locallib.h"
+#include "words.h"
+#include "mg_errors.h"
+#include "local_strings.h"
+
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:26  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:35:48  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.3  1994/10/20  03:57:11  tes
+   * I have rewritten the boolean query optimiser and abstracted out the
+   * components of the boolean query.
+   *
+   * Revision 1.2  1994/09/20  04:42:15  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+
+
+/* FetchDocStart () 
+ * Reads into DocEnt the starting position of the document in the *.text file
+ * Where the first document is document number 1
+ * It returns the true weight of the document.
+ */
+
+
+
+
+static double 
+FetchDocStartLev1 (text_data * td, u_long DN,
+		   u_long * seek_pos, u_long * len)
+{
+  unsigned long data[2];
+  /* [TS:Sep/94] Fixed up the seek call to give the correct offset */
+  Fseek (td->TextIdxFile,
+	 sizeof (unsigned long) * (DN - 1) +	/* the doc offsets */
+	 sizeof (unsigned long) +	/* the magic number */
+	 sizeof (compressed_text_header),	/* the header */
+	 0);
+  Fread ((char *) &data, sizeof (data), 1, td->TextIdxFile);
+  
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(data[0]);
+  NTOHUL(data[1]);
+
+  *seek_pos = data[0];
+  *len = data[1] - data[0];
+  return (1.0);
+}
+
+#define MG_PAGE_SIZE 2048
+
+static int 
+LoadIdx (text_data * td, unsigned long DN)
+{
+  if (!td->idx_data)
+    {
+      td->idx_data = Xmalloc (sizeof (*(td->idx_data)) * MG_PAGE_SIZE);
+      if (!td->idx_data)
+	FatalError (1, "Out of memory in FDSL2");
+    }
+  if (td->current_pos == -1 || DN >= td->current_pos + MG_PAGE_SIZE - 1 ||
+      DN < td->current_pos)
+    {
+      int i, num;  /* [RPAP - Jan 97: Endian Ordering] */
+
+      long rn = (long) DN - (MG_PAGE_SIZE >> 1);
+      if (rn < 1)
+	rn = 1;
+      Fseek (td->TextIdxWgtFile, (sizeof (unsigned long) + sizeof (float)) *
+	       (rn - 1) + sizeof (unsigned long), 0);
+      num = Fread ((char *) td->idx_data, sizeof (*(td->idx_data)), MG_PAGE_SIZE, /* [RPAP - Jan 97: Endian Ordering] */
+		   td->TextIdxWgtFile);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = 0; i < num; i++)
+	{
+	  NTOHUL(td->idx_data[i].Start);
+	  NTOHF(td->idx_data[i].Weight);
+	}
+
+      td->current_pos = rn;
+    }
+  return DN - td->current_pos;
+}
+
+static double 
+FDSL2 (text_data * td, unsigned long DN, unsigned long *Pos)
+{
+  unsigned long pos = LoadIdx (td, DN);
+  *Pos = td->idx_data[pos].Start;
+  return (td->idx_data[pos].Weight);
+}
+
+
+static double 
+FetchDocStartLev2 (text_data * td, u_long DN,
+		   u_long * seek_pos, u_long * len)
+{
+  double Weight;
+  unsigned long s1, s2;
+  Weight = FDSL2 (td, DN, &s1);
+  do
+    {
+      DN++;
+      FDSL2 (td, DN, &s2);
+    }
+  while (s2 == s1);
+  *seek_pos = s1;
+  *len = s2 - s1;
+  return (Weight);
+}
+
+
+
+
+double 
+FetchDocStart (query_data * qd, u_long DN, u_long * seek_pos, u_long * len)
+{
+  qd->text_idx_lookups++;
+  if (qd->td->TextIdxWgtFile)
+    return FetchDocStartLev2 (qd->td, DN, seek_pos, len);
+  else
+    return FetchDocStartLev1 (qd->td, DN, seek_pos, len);
+}
+
+unsigned long 
+FetchInitialParagraph (text_data * td, unsigned long ParaNum)
+{
+  if (td->TextIdxWgtFile)
+    {
+      unsigned long pos;
+      unsigned long start;
+      int PN = ParaNum - 1;
+      pos = LoadIdx (td, ParaNum);
+      start = td->idx_data[pos].Start;
+      while (PN > 0)
+	{
+	  pos = LoadIdx (td, PN);
+	  if (td->idx_data[pos].Start != start)
+	    return PN + 1;
+	  PN--;
+	}
+      return PN + 1;
+    }
+  else
+    return ParaNum;
+}
+
+
+
+/* FetchCompressed () 
+ * Reads into buffer DocBuff the compressed form of document DocNum. 
+ * Where the first document is document number 1
+ */
+int 
+FetchCompressed (query_data * qd, char **DocBuff, DocEntry * DocEnt)
+{
+  if (!DocEnt->SeekPos)
+    FetchDocStart (qd, DocEnt->DocNum, &DocEnt->SeekPos, &DocEnt->Len);
+  if (!(*DocBuff = Xmalloc (DocEnt->Len)))
+    return (-1);
+
+  if (Fseek (qd->td->TextFile, DocEnt->SeekPos, 0) == -1)
+    FatalError (1, "Error when seeking into text file");
+#if 0
+  printf ("Loading compressed text %d %d\n", DocEnt->SeekPos, DocEnt->Len);
+#endif
+  if (Fread (*DocBuff, 1, DocEnt->Len, qd->td->TextFile) != DocEnt->Len)
+    FatalError (1, "Error when reading data");
+
+  return (DocEnt->Len);
+
+}
+
+
+text_data *
+LoadTextData (File * text, File * text_idx_wgt, File * text_idx)
+{
+  text_data *td;
+
+  if (!(td = Xmalloc (sizeof (text_data))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  td->TextFile = text;
+  td->TextIdxWgtFile = text_idx_wgt;
+  td->TextIdxFile = text_idx;
+  td->current_pos = -1;
+  td->idx_data = NULL;
+  Fread (&td->cth, sizeof (td->cth), 1, text);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(td->cth.num_of_docs);
+  NTOHD(td->cth.num_of_bytes); /* [RJM 07/97: 4G limit] */
+  NTOHUL(td->cth.num_of_words);
+  NTOHUL(td->cth.length_of_longest_doc);
+  NTOHD(td->cth.ratio);
+
+  return (td);
+}
+
+
+void 
+FreeTextData (text_data * td)
+{
+  if (td)
+    {
+      if (td->idx_data)
+	Xfree (td->idx_data);
+      Xfree (td);
+    }
+}
+
+
+static int 
+pts_comp (const void *A, const void *B)
+{
+  const DocEntry *const *a = A;
+  const DocEntry *const *b = B;
+  return (*a)->DocNum - (*b)->DocNum;
+}
+
+
+
+
+int 
+GetPosLens (query_data * qd, DocEntry * Docs, int num)
+{
+  DocEntry **pts;
+  int i, j;
+  if (!(pts = Xmalloc (num * sizeof (DocEntry *))))
+    {
+      mg_errno = MG_NOMEM;
+      return (-1);
+    }
+  for (i = j = 0; i < num; i++, Docs++)
+    if (!Docs->SeekPos)
+      pts[j++] = Docs;
+
+  if (j)
+    {
+      qsort (pts, j, sizeof (DocEntry *), pts_comp);
+      for (i = 0; i < j; i++)
+	FetchDocStart (qd, pts[i]->DocNum, &pts[i]->SeekPos, &pts[i]->Len);
+    }
+
+  Xfree (pts);
+  return (0);
+}
+
+
+
+
+
+int 
+LoadBuffers (query_data * qd, DocEntry * Docs, int max_mem, int num)
+{
+  DocEntry **pts;
+  int i, j;
+  int mem;
+
+  if (!num)
+    return (0);
+  if (!(pts = Xmalloc (num * sizeof (DocEntry *))))
+    {
+      mg_errno = MG_NOMEM;
+      return (-1);
+    }
+
+  mem = i = 0;
+  do
+    {
+      pts[i] = Docs;
+      mem += Docs->Len;
+      i++;
+      Docs++;
+    }
+  while (i < num && mem < max_mem);
+  if (i > 1)
+    qsort (pts, i, sizeof (DocEntry *), pts_comp);
+  for (j = 0; j < i; j++)
+    {
+      if (FetchCompressed (qd, &pts[j]->CompTextBuffer, pts[j]) == -1)
+	return (-1);
+      ChangeMemInUse (qd, pts[j]->Len);
+    }
+
+  Xfree (pts);
+
+  return (i);
+}
+
+
+
+
+
+void 
+FreeBuffers (query_data * qd, DocEntry * Docs, int num)
+{
+  int i;
+  for (i = 0; i < num; i++, Docs++)
+    if (Docs->CompTextBuffer)
+      {
+	Xfree (Docs->CompTextBuffer);
+	Docs->CompTextBuffer = NULL;
+	ChangeMemInUse (qd, -Docs->Len);
+      }
+}
+
+
+
+/****************************************************************************/
+
+static void 
+FreeAuxDict (auxiliary_dict * ad)
+{
+  if (!ad)
+    return;
+  if (ad->word_data[0])
+    Xfree (ad->word_data[0]);
+  if (ad->word_data[1])
+    Xfree (ad->word_data[1]);
+  if (ad->words[0])
+    Xfree (ad->words[0]);
+  if (ad->words[1])
+    Xfree (ad->words[1]);
+  Xfree (ad);
+}
+
+static auxiliary_dict *
+LoadAuxDict (compression_dict * cd, File * text_aux_dict)
+{
+  auxiliary_dict *ad;
+  int i;
+
+  if (!(ad = Xmalloc (sizeof (auxiliary_dict))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  bzero ((char *) ad, sizeof (*ad));
+
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+      u_char *pos;
+
+      Fread (&ad->afh[i], sizeof (aux_frags_header), 1, text_aux_dict);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(ad->afh[i].num_frags);
+      NTOHUL(ad->afh[i].mem_for_frags);
+
+      if (!(ad->word_data[i] = Xmalloc (ad->afh[i].mem_for_frags)))
+	{
+	  mg_errno = MG_NOMEM;
+	  FreeAuxDict (ad);
+	  return (NULL);
+	}
+      if (!(ad->words[i] = Xmalloc (ad->afh[i].num_frags * sizeof (u_char *))))
+	{
+	  mg_errno = MG_NOMEM;
+	  FreeAuxDict (ad);
+	  return (NULL);
+	}
+
+      Fread (ad->word_data[i], ad->afh[i].mem_for_frags, sizeof (u_char),
+	     text_aux_dict);
+
+      pos = ad->word_data[i];
+      for (j = 0; j < ad->afh[i].num_frags; j++)
+	{
+	  ad->words[i][j] = pos;
+	  pos += *pos + 1;
+	}
+      if (cd->cdh.novel_method == MG_NOVEL_HYBRID ||
+	  cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+	{
+	  int num;
+	  num = 1;
+	  ad->blk_start[i][0] = 0;
+	  ad->blk_end[i][0] = cd->cdh.num_words[i] - 1;
+	  while (num < 33)
+	    {
+	      ad->blk_start[i][num] = ad->blk_end[i][num - 1] + 1;
+	      ad->blk_end[i][num] = ad->blk_start[i][num] +
+		(ad->blk_end[i][num - 1] - ad->blk_start[i][num - 1]) * 2;
+	      num++;
+	    }
+	}
+    }
+  return (ad);
+}
+
+
+
+
+
+
+static u_char ***
+ReadInWords (File * dict, compression_dict * cd,
+	     comp_frags_header * cfh, u_char ** escape)
+{
+  int i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+  int num_set[MAX_HUFFCODE_LEN + 1];
+  u_char *next_word[MAX_HUFFCODE_LEN + 1];
+  u_char **vals;
+  u_char ***values;
+  u_char word[MAXWORDLEN + 1];
+  u_char last_word[MAX_HUFFCODE_LEN + 1][MAXWORDLEN + 1];
+
+  lookback = cd->cdh.lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++)
+    {
+      ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+      mem_reqd += cfh->huff_words_size[i];
+    }
+
+  if (!(vals = Xmalloc (ptrs_reqd * sizeof (*vals))))
+    return (NULL);
+
+  if (!(values = Xmalloc ((MAX_HUFFCODE_LEN + 1) * sizeof (u_char **))))
+    return (NULL);
+
+  if (!(next_word[0] = Xmalloc (mem_reqd))) return (NULL);
+
+  cd->MemForCompDict += ptrs_reqd * sizeof (*vals) +
+    (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **) +
+    mem_reqd;
+
+  values[0] = vals;
+  values[0][0] = next_word[0];
+  for (i = 1; i <= cfh->hd.maxcodelen; i++)
+    {
+      int next_start = (values[i - 1] - vals) +
+      ((cfh->hd.lencount[i - 1] + ((1 << lookback) - 1)) >> lookback);
+      values[i] = &vals[next_start];
+      next_word[i] = next_word[i - 1] + cfh->huff_words_size[i - 1];
+      values[i][0] = next_word[i];
+    }
+
+  bzero ((char *) num_set, sizeof (num_set));
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val, copy;
+      register int len = cfh->hd.clens[i];
+      val = Getc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      Fread (word + copy + 1, sizeof (u_char), val, dict);
+      *word = val + copy;
+
+      if ((num_set[len] & ((1 << lookback) - 1)) == 0)
+	{
+	  values[len][num_set[len] >> lookback] = next_word[len];
+	  memcpy (next_word[len], word, *word + 1);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    *escape = next_word[len];
+	  next_word[len] += *word + 1;
+	}
+      else
+	{
+	  copy = prefixlen (last_word[len], word);
+	  memcpy (next_word[len] + 1, word + copy + 1, *word - copy);
+	  *next_word[len] = (copy << 4) + (*word - copy);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    *escape = next_word[len];
+	  next_word[len] += (*word - copy) + 1;
+	}
+      memcpy (last_word[len], word, *word + 1);
+      num_set[len]++;
+    }
+  if (cfh->hd.clens)
+    Xfree (cfh->hd.clens);
+  cfh->hd.clens = NULL;
+  return values;
+}
+
+
+static compression_dict *
+Load_Comp_Dict (File * dict, File * aux_dict)
+{
+  int which;
+  compression_dict *cd;
+
+  if (!(cd = Xmalloc (sizeof (compression_dict))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  bzero ((char *) cd, sizeof (compression_dict));
+
+  cd->MemForCompDict = sizeof (compression_dict);
+
+  if (F_Read_cdh (dict, &cd->cdh, &cd->MemForCompDict, NULL) == -1)
+    return NULL;
+
+  for (which = 0; which < 2; which++)
+    switch (cd->cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  if (!(cd->cfh[which] = Xmalloc (sizeof (*cd->cfh[which]))))
+	    return NULL;
+	  cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	  if (F_Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL) == -1)
+	    return NULL;
+
+	  if (!(cd->values[which] = ReadInWords (dict, cd, cd->cfh[which],
+						 NULL)))
+	    return NULL;
+	  cd->escape[which] = NULL;
+
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  huff_data *hd;
+	  u_long **vals;
+	  if (cd->cdh.num_words[which])
+	    {
+	      if (!(cd->cfh[which] = Xmalloc (sizeof (*cd->cfh[which]))))
+		return NULL;
+	      cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	      if (F_Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL) == -1)
+		return NULL;
+
+	      if (!(cd->values[which] = ReadInWords (dict, cd, cd->cfh[which],
+						     &cd->escape[which])))
+		return NULL;
+	    }
+	  if (!(hd = Xmalloc (sizeof (huff_data))))
+	    return NULL;
+	  cd->MemForCompDict += sizeof (huff_data);
+	  if (F_Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL) == -1)
+	    return NULL;
+	  if (!(vals = Generate_Huffman_Vals (hd, &cd->MemForCompDict)))
+	    return NULL;
+	  if (hd->clens)
+	    Xfree (hd->clens);
+	  hd->clens = NULL;
+	  cd->chars_huff[which] = hd;
+	  cd->chars_vals[which] = vals;
+	  if (!(hd = Xmalloc (sizeof (huff_data))))
+	    return NULL;
+	  cd->MemForCompDict += sizeof (huff_data);
+	  if (F_Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL) == -1)
+	    return NULL;
+	  if (!(vals = Generate_Huffman_Vals (hd, &cd->MemForCompDict)))
+	    return NULL;
+	  cd->lens_huff[which] = hd;
+	  cd->lens_vals[which] = vals;
+	  if (hd->clens)
+	    Xfree (hd->clens);
+	  hd->clens = NULL;
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  huff_data *hd;
+	  u_long **vals;
+	  if (cd->cdh.num_words[which])
+	    {
+	      if (!(cd->cfh[which] = Xmalloc (sizeof (*cd->cfh[which]))))
+		return NULL;
+	      cd->MemForCompDict += sizeof (*cd->cfh[which]);
+	      if (F_Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL) == -1)
+		return NULL;
+
+	      if (!(cd->values[which] = ReadInWords (dict, cd, cd->cfh[which],
+						     &cd->escape[which])))
+		return NULL;
+	    }
+	  switch (cd->cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      if (!(hd = Xmalloc (sizeof (huff_data))))
+		return NULL;
+	      cd->chars_huff[which] = hd;
+	      cd->MemForCompDict += sizeof (huff_data);
+	      if (F_Read_Huffman_Data (dict, hd, &cd->MemForCompDict,
+				       NULL) == -1)
+		return NULL;
+	      if (!(vals = Generate_Huffman_Vals (hd, &cd->MemForCompDict)))
+		return NULL;
+	      cd->chars_vals[which] = vals;
+	      if (hd->clens)
+		Xfree (hd->clens);
+	      hd->clens = NULL;
+	      if (!(hd = Xmalloc (sizeof (huff_data))))
+		return NULL;
+	      cd->MemForCompDict += sizeof (huff_data);
+	      cd->lens_huff[which] = hd;
+	      if (F_Read_Huffman_Data (dict, hd, &cd->MemForCompDict
+				       ,NULL) == -1)
+		return NULL;
+	      if (!(vals = Generate_Huffman_Vals (hd, &cd->MemForCompDict)))
+		return NULL;
+	      cd->lens_vals[which] = vals;
+	      if (hd->clens)
+		Xfree (hd->clens);
+	      hd->clens = NULL;
+	      break;
+	    case MG_NOVEL_BINARY:
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    case MG_NOVEL_HYBRID_MTF:
+	      break;
+	    }
+	  break;
+	}
+      }
+
+  if (cd->cdh.novel_method == MG_NOVEL_BINARY ||
+      cd->cdh.novel_method == MG_NOVEL_DELTA ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    {
+      if (!aux_dict)
+	{
+	  mg_errno = MG_NOFILE;
+	  FreeCompDict (cd);
+	  return (NULL);
+	}
+
+      if (!(cd->ad = LoadAuxDict (cd, aux_dict)))
+	{
+	  FreeCompDict (cd);
+	  return (NULL);
+	}
+    }
+
+
+  mg_errno = MG_NOERROR;
+
+  cd->fast_loaded = 0;
+  return (cd);
+}
+
+#define WORDNO(p, base) ((((char*)(p))-((char*)(base)))/sizeof(u_char*))
+
+#define IS_FIXUP(p) ((fixup[WORDNO(p,cd)/8] & (1<<(WORDNO(p, cd) & 7))) != 0)
+
+
+static compression_dict *
+Load_Fast_Comp_Dict (File * text_fast_comp_dict)
+{
+  compression_dict *cd;
+  u_long *p, *end;
+  u_char *fixup;
+  u_long mem;
+  u_long fixup_mem;
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  Fread (&mem, sizeof (mem), 1, text_fast_comp_dict);
+  NTOHUL(mem);  /* [RPAP - Jan 97: Endian Ordering] */
+  Fread (&fixup_mem, sizeof (fixup_mem), 1, text_fast_comp_dict);
+  NTOHUL(fixup_mem);  /* [RPAP - Jan 97: Endian Ordering] */
+  if (!(cd = Xmalloc (mem)))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  end = (u_long *) (((u_char *) cd) + mem);
+  Fread (cd, sizeof (u_char), mem, text_fast_comp_dict);
+
+  if (!(fixup = Xmalloc (fixup_mem)))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  Fread (fixup, fixup_mem, sizeof (u_char), text_fast_comp_dict);
+
+  for (p = (u_long *) cd; (u_long) p < (u_long) end; p++)
+    if (IS_FIXUP (p))
+      {
+	NTOHUL(*p);  /* [RPAP - Jan 97: Endian Ordering] */
+	*p = *p + (u_long) cd;
+      }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  /* cdh */
+  NTOHUL(cd->cdh.dict_type);
+  NTOHUL(cd->cdh.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    NTOHUL(cd->cdh.params[i]);
+  NTOHUL(cd->cdh.num_words[0]);
+  NTOHUL(cd->cdh.num_words[1]);
+  NTOHUL(cd->cdh.num_word_chars[0]);
+  NTOHUL(cd->cdh.num_word_chars[1]);
+  NTOHUL(cd->cdh.lookback);
+  /* cfh */
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+
+      NTOHSI(cd->cfh[i]->hd.num_codes);
+      NTOHSI(cd->cfh[i]->hd.mincodelen);
+      NTOHSI(cd->cfh[i]->hd.maxcodelen);
+      for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	{
+	  NTOHSI(cd->cfh[i]->hd.lencount[j]);
+	  NTOHUL(cd->cfh[i]->hd.min_code[j]);
+	}
+      NTOHUL(cd->cfh[i]->uncompressed_size);
+      for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	NTOHUL(cd->cfh[i]->huff_words_size[j]);
+    }
+  NTOHUL(cd->MemForCompDict);
+  /* ad */
+  if (cd->cdh.novel_method == MG_NOVEL_BINARY ||
+      cd->cdh.novel_method == MG_NOVEL_DELTA ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    for (i = 0; i <= 1; i++)
+      {
+	int j;
+	
+	NTOHUL(cd->ad->afh[i].num_frags);
+	NTOHUL(cd->ad->afh[i].mem_for_frags);
+	for (j = 0; j < 33; j++)
+	  {
+	    NTOHSI(cd->ad->blk_start[i][j]);
+	    NTOHSI(cd->ad->blk_end[i][j]);
+	  }
+      }
+  NTOHSI(cd->fast_loaded);
+
+  Xfree (fixup);
+  return (cd);
+}
+
+
+
+
+compression_dict *
+LoadCompDict (File * text_comp_dict,
+	      File * text_aux_dict,
+	      File * text_fast_comp_dict)
+{
+  return text_fast_comp_dict ?
+    Load_Fast_Comp_Dict (text_fast_comp_dict) :
+    Load_Comp_Dict (text_comp_dict, text_aux_dict);
+}
+
+
+
+
+void 
+FreeCompDict (compression_dict * cd)
+{
+  int which;
+  if (cd->fast_loaded)
+    {
+      Xfree (cd);
+      return;
+    }
+  for (which = 0; which < 2; which++)
+    {
+      if (cd->cfh[which])
+	Xfree (cd->cfh[which]);
+      if (cd->chars_huff[which])
+	Xfree (cd->chars_huff[which]);
+      if (cd->lens_huff[which])
+	Xfree (cd->lens_huff[which]);
+      if (cd->values[which])
+	{
+	  Xfree (cd->values[which][0][0]); /* [RJM 07/98: Memory Leak] */
+	  Xfree (cd->values[which][0]);
+	  Xfree (cd->values[which]);
+	}
+      if (cd->chars_vals[which])
+	{
+	  Xfree (cd->chars_vals[which][0]);
+	  Xfree (cd->chars_vals[which]);
+	}
+      if (cd->lens_vals[which])
+	{
+	  Xfree (cd->lens_vals[which][0]);
+	  Xfree (cd->lens_vals[which]);
+	}
+    }
+  if (cd->ad)
+    FreeAuxDict (cd->ad);
+  Xfree (cd);
+}
+
+
+
+
+
+#define MY_HUFF_DECODE(len, code, mcodes)				\
+  do {									\
+    register unsigned long *__min_code = (mcodes);			\
+    register unsigned long *__mclen = __min_code;			\
+    register unsigned long __code = 0;					\
+    do									\
+      {									\
+        DECODE_ADD(__code);						\
+      }									\
+    while (__code < *++__mclen);					\
+    (len) = __mclen - __min_code;					\
+    (code) = __code - *__mclen;						\
+  } while(0);
+
+
+/*#define DUMPDOC */
+
+#define MAX_SWAPS 10000
+
+int 
+DecodeText (compression_dict * cd,
+	    u_char * s_in, int l_in, u_char * s_out, int *l_out)
+{
+  auxiliary_dict *ad = cd->ad;
+  int which;
+  u_long num_bits, bits;
+  u_char *ptr = s_out;
+  static int num = 0;
+  u_long binary_start[2];
+  int novels_used[2];
+  int swaps[2][MAX_SWAPS];
+  novels_used[0] = novels_used[1] = 0;
+
+  {
+    unsigned char bf = s_in[l_in - 1];
+    num_bits = 1;
+    while ((bf & 1) != 1)
+      {
+	num_bits++;
+	bf >>= 1;
+      }
+    num_bits = l_in * 8 - num_bits;
+  }
+
+  DECODE_START (s_in, l_in)
+
+    which = DECODE_BIT;
+  bits = 1;
+
+  if (cd->cdh.novel_method == MG_NOVEL_BINARY)
+    {
+      DELTA_DECODE_L (binary_start[0], bits);
+      DELTA_DECODE_L (binary_start[1], bits);
+    }
+
+
+  while (bits < num_bits)
+    {
+      register unsigned code, len;
+      register int r;
+      register u_char *t, *b = NULL;
+      u_char word[MAXWORDLEN + 1];
+
+#ifdef DUMPDOC
+      printf ("\n%d %d  ", bits, num_bits);
+#endif
+      if (cd->cfh[which])
+	{
+	  MY_HUFF_DECODE (len, code, cd->cfh[which]->hd.min_code);
+	  bits += len;
+
+	  r = code & ((1 << cd->cdh.lookback) - 1);
+	  t = cd->values[which][len][code >> cd->cdh.lookback];
+
+	  /* step through from base pointer */
+	  b = word + 1;
+	  while (r--)
+	    {
+	      register int copy = *t >> 4;
+	      memcpy (word + copy + 1, t + 1, *t & 0xf);
+	      word[0] = copy + (*t & 0xf);
+	      t += ((*t) & 0xf) + 1;
+	    }
+	}
+      else
+	t = NULL;
+      if (t == cd->escape[which])
+	{
+	  switch (cd->cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      {
+		int len, i;
+		int c;
+		HUFF_DECODE_L (len, cd->lens_huff[which]->min_code,
+			       cd->lens_vals[which], bits);
+		for (i = 0; i < len; i++)
+		  {
+		    HUFF_DECODE_L (c, cd->chars_huff[which]->min_code,
+				   cd->chars_vals[which], bits);
+		    *ptr++ = c;
+		  }
+	      }
+	      break;
+	    case MG_NOVEL_BINARY:
+	    case MG_NOVEL_DELTA:
+	    case MG_NOVEL_HYBRID:
+	    case MG_NOVEL_HYBRID_MTF:
+	      {
+		int idx = 0, len;
+		u_char *base;
+		switch (cd->cdh.novel_method)
+		  {
+		  case MG_NOVEL_BINARY:
+		    {
+		      BINARY_DECODE_L (idx, binary_start[which], bits);
+		      if (idx == binary_start[which])
+			binary_start[which]++;
+		      idx--;
+		    }
+		    break;
+		  case MG_NOVEL_DELTA:
+		    {
+		      DELTA_DECODE_L (idx, bits);
+		      idx--;
+		    }
+		    break;
+		  case MG_NOVEL_HYBRID:
+		    {
+		      int k;
+		      GAMMA_DECODE_L (k, bits);
+		      k--;
+		      BINARY_DECODE_L (idx,
+				       ad->blk_end[which][k] -
+				       ad->blk_start[which][k] + 1, bits);
+		      idx += ad->blk_start[which][k] - 1;
+		    }
+		    break;
+		  case MG_NOVEL_HYBRID_MTF:
+		    {
+		      int k;
+		      GAMMA_DECODE_L (k, bits);
+		      k--;
+		      BINARY_DECODE_L (idx,
+				       ad->blk_end[which][k] -
+				       ad->blk_start[which][k] + 1, bits);
+		      idx += ad->blk_start[which][k] - 1;
+		      if (idx >= novels_used[which])
+			{
+			  u_char *temp;
+			  temp = ad->words[which][idx];
+			  ad->words[which][idx] =
+			    ad->words[which][novels_used[which]];
+			  ad->words[which][novels_used[which]] = temp;
+			  swaps[which][novels_used[which]] = idx;
+			  idx = novels_used[which]++;
+			}
+		    }
+		    break;
+		  }
+		base = ad->words[which][idx];
+		len = *base++;
+#ifdef DUMPDOC
+		printf ("[[");
+#endif
+		for (; len; len--)
+		  {
+		    *ptr++ = *base++;
+#ifdef DUMPDOC
+		    putchar (*(base - 1));
+#endif
+		  }
+#ifdef DUMPDOC
+		printf ("]]");
+#endif
+	      }
+	      break;
+	    }
+	}
+      else
+	{
+	  /* copy over the matching prefix */
+	  r = (*t >> 4);
+	  while (r--)
+#ifndef DUMPDOC
+	    *ptr++ = *b++;
+#else
+	    {
+	      *ptr = *b++;
+	      putchar (*ptr);
+	      ptr++;
+	    }
+#endif
+
+	  /* and the stored suffix */
+	  r = ((*t) & 0xf);
+	  while (r--)
+#ifndef DUMPDOC
+	    *ptr++ = *++t;
+#else
+	    {
+	      *ptr = *++t;
+	      putchar (*ptr);
+	      ptr++;
+	    }
+#endif
+	}
+      which = !which;
+    }
+
+  DECODE_DONE
+
+    * l_out = ptr - s_out;
+  num += *l_out + 1;
+
+  if (cd->cdh.novel_method == MG_NOVEL_HYBRID_MTF)
+    for (which = 0; which <= 1; which++)
+      for (novels_used[which]--; novels_used[which] >= 0; novels_used[which]--)
+	{
+	  int a = novels_used[which];
+	  int b = swaps[which][novels_used[which]];
+	  u_char *temp;
+	  temp = ad->words[which][a];
+	  ad->words[which][a] = ad->words[which][b];
+	  ad->words[which][b] = temp;
+	}
+  return (COMPALLOK);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/text_get.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/text_get.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/text_get.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**************************************************************************
+ *
+ * text_get.h -- Function for reading documents from the compressed text
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_TEXT_GET
+#define H_TEXT_GET
+
+
+
+/* FetchDocStart () 
+ * Reads into DocEnt the starting position of the document in the *.text file
+ * Where the first document is document number 1
+ * It returns the true weight of the document.
+ */
+double FetchDocStart (query_data * qd, u_long DN, u_long * seek_pos, u_long * len);
+
+unsigned long FetchInitialParagraph (text_data * td, unsigned long ParaNum);
+
+
+/* FetchCompressed () 
+ * Reads into buffer DocBuff the compressed form of document DocNum. 
+ * Where the first document is document number 1
+ */
+int FetchCompressed (query_data * qd, char **DocBuff, DocEntry * DocEnt);
+
+text_data *LoadTextData (File * text, File * text_idx_wgt, File * text_idx);
+
+void FreeTextData (text_data * td);
+
+int GetPosLens (query_data * qd, DocEntry * Docs, int num);
+
+int LoadBuffers (query_data * qd, DocEntry * Docs, int max_mem, int num);
+
+void FreeBuffers (query_data * qd, DocEntry * Docs, int num);
+
+
+
+compression_dict *LoadCompDict (File * text_comp_dict,
+				File * text_aux_dict,
+				File * text_fast_comp_dict);
+
+void FreeCompDict (compression_dict * cd);
+
+
+int DecodeText (compression_dict * cd,
+		u_char * s_in, int l_in, u_char * s_out, int *l_out);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/warranty.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/warranty.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/warranty.h	(revision 21083)
@@ -0,0 +1,24 @@
+static char *warranty_str[] = {
+"			    NO WARRANTY\n",
+"\n",
+"  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n",
+"FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\n",
+"OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n",
+"PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n",
+"OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n",
+"MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\n",
+"TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\n",
+"PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n",
+"REPAIR OR CORRECTION.\n",
+"\n",
+"  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n",
+"WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n",
+"REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n",
+"INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n",
+"OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n",
+"TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n",
+"YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n",
+"PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n",
+"POSSIBILITY OF SUCH DAMAGES.\n",
+"\n",
+"		     END OF TERMS AND CONDITIONS\n"};
Index: /main/tags/2.38/gsdl/packages/mg/src/text/warranty.src
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/warranty.src	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/warranty.src	(revision 21083)
@@ -0,0 +1,23 @@
+			    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
Index: /main/tags/2.38/gsdl/packages/mg/src/text/weights.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/weights.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/weights.c	(revision 21083)
@@ -0,0 +1,158 @@
+/**************************************************************************
+ *
+ * weights.c -- Functions for reading the weights file in mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "filestats.h"
+#include "memlib.h"
+#include "messages.h"
+#include "timing.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg.h"
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "weights.h"
+#include "locallib.h"
+#include "mg_errors.h"
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+/*
+   $Log$
+   Revision 1.1  1999/08/10 21:18:27  sjboddie
+   renamed mg-1.3d directory mg
+
+   Revision 1.1  1998/11/17 09:35:51  rjmcnab
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:42:18  tes
+   * For version 1.1
+   *
+ */
+
+static char *RCSID = "$Id$";
+
+
+
+approx_weights_data *
+LoadDocWeights (File * weight_file,
+		unsigned long num_of_docs)
+{
+  approx_weights_data *awd;
+  int num;
+
+  if (!(awd = Xmalloc (sizeof (*awd))))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  Fseek (weight_file, sizeof (long), 0);
+  Fread (&awd->bits, sizeof (awd->bits), 1, weight_file);
+  Fread (&awd->L, sizeof (awd->L), 1, weight_file);
+  NTOHD(awd->L);  /* [RPAP - Jan 97: Endian Ordering] */
+  Fread (&awd->B, sizeof (awd->B), 1, weight_file);
+  NTOHD(awd->B);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  awd->mask = awd->bits == 32 ? 0xffffffff : (1 << awd->bits) - 1;
+
+  num = (num_of_docs * awd->bits + 31) / 32;
+  if (!(awd->DocWeights = Xmalloc (sizeof (unsigned long) * num)))
+    {
+      Xfree (awd);
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  Fread (awd->DocWeights, sizeof (unsigned long), num, weight_file);
+  {
+    /* [RPAP - Jan 97: Endian Ordering] */
+    unsigned long i;
+    for (i = 0; i < num; i++)
+      NTOHUL(awd->DocWeights[i]);
+  }
+
+  awd->MemForWeights = num * sizeof (unsigned long);
+  awd->num_of_docs = num_of_docs;
+
+  mg_errno = MG_NOERROR;
+
+  if (awd->bits <= 12)
+    {
+      int i, size = (1 << awd->bits);
+      if (!(awd->table = (float *) Xmalloc (size * sizeof (float))))
+	  return (awd);
+      awd->table[0] = awd->L;
+      for (i = 1; i < size; i++)
+	awd->table[i] = awd->table[i - 1] * awd->B;
+    }
+  else
+    awd->table = NULL;
+  return awd;
+}
+
+
+
+
+
+
+/*
+ * the first document in the collection has DocNum = 0
+ */
+float 
+GetLowerApproxDocWeight (approx_weights_data * awd, register int DocNum)
+{
+  register unsigned long c, Pos;
+  register unsigned long *dw;
+  if (awd == NULL)
+    return 1.0;
+#if 0
+  if (DocNum < 0 || DocNum >= awd->num_of_docs)
+    FatalError (1, "Something is wrong in \"GetDocWeight\" DocNum = %d\n",
+		DocNum);
+#endif
+  Pos = DocNum * awd->bits;
+  dw = &(awd->DocWeights[Pos / MAXBITS]);
+  Pos &= (MAXBITS - 1);
+  c = *dw >> Pos;
+  if (Pos + awd->bits > MAXBITS)
+    c |= *(dw + 1) << (MAXBITS - Pos);
+  c &= awd->mask;
+  if (awd->table)
+    return (awd->table[c]);
+  else
+    return (awd->L * pow (awd->B, (double) c));
+
+}
+
+void 
+FreeWeights (approx_weights_data * awd)
+{
+  Xfree (awd->DocWeights);
+  if (awd->table)
+    Xfree (awd->table);
+  Xfree (awd);
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/weights.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/weights.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/weights.h	(revision 21083)
@@ -0,0 +1,34 @@
+/**************************************************************************
+ *
+ * weights.h -- Functions for reading the weights file in mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#ifndef H_WEIGHTS
+#define H_WEIGHTS
+
+approx_weights_data *LoadDocWeights (File * weight_file,
+				     unsigned long num_of_docs);
+
+float GetLowerApproxDocWeight (approx_weights_data * awd, register int DocNum);
+
+void FreeWeights (approx_weights_data * awd);
+
+#endif
Index: /main/tags/2.38/gsdl/packages/mg/src/text/words.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/words.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/words.c	(revision 21083)
@@ -0,0 +1,11 @@
+#include "words.h"
+
+
+/* Takes the place of the old INAWORD macro. It determines
+   whether a given place in a UTF-8 encoded Unicode string
+   is part of a word. */
+int inaword (const u_char *here, const u_char *end) {
+  unsigned short c;
+  if (parse_utf8_char(here, end, &c) > 0) return is_unicode_letdig (c);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/mg/src/text/words.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/src/text/words.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/src/text/words.h	(revision 21083)
@@ -0,0 +1,387 @@
+/**************************************************************************
+ *
+ * words.h -- Macros for parsing out words from the source text
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "unitool.h"
+
+
+/*
+ * This has been cleaned up by Tim Shimmin. 
+ */
+
+/*
+ * ---NOTE---
+ *
+ * "WORD" refers to a word in the compressed text.
+ * "STEM" or "STEM_WORD" refers to a word for indexing on
+ *
+ */
+
+#define MAXWORDLEN	15
+	/* Maximum length in bytes of any word or non-word. Note that
+	   variations to MAXWORDLEN may have dramatic effects on the rest
+	   of the program, as the length and the prefix match are packed
+	   together into a four bit nibble, and there is not check that
+	   this is possible, i.e., leave MAXWORDLEN alone... */
+
+#define MAXSTEMLEN	255
+	/* Maximum length in bytes of any stem. Note that
+	   variations to MAXSTEMLEN may have dramatic effects on the rest
+	   of the program, , i.e., leave MAXSTEMLEN alone... */
+
+#define MAXNUMERIC	4
+	/* Maximum number of numeric characters permitted in a word.
+	   This avoids long sequences of numbers creating just one
+	   word occurrence for each number. At most 10,000 all numeric
+	   words will be permitted. */
+
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAXPARAMLEN     20
+        /* Maximum number of bytes to read for a parameter value for a
+	   term in a query. */
+#define WEIGHTPARAM     '/'
+#define STEMPARAM       '#'
+
+/* [RJM 07/97: Ranked Required Terms] */
+#define MUSTMATCHPARAM     '+'
+
+
+#define PESINAWORD(c)      (isalnum(c) || ((c) >= 0x80 && (c) <= 0xff))
+        /* The definition of what characters are permitted in a word.
+	   This macro is pessimistic, you cannot tell from a particular
+	   byte above 0x80 whether it is a character or not. This function
+	   is needed by various functions relating to huffman coding
+	   where frequency counts need to be primed, it should not be
+	   used in parsing the UTF-8 encoded input. */
+
+int inaword (const u_char *here, const u_char *end);
+        /* Takes the place of the old INAWORD macro. It determines
+	   whether a given place in a UTF-8 encoded Unicode string
+	   is part of a word. */
+
+
+/* =========================================================================
+ * Macro: PARSE_WORD
+ * Description: 
+ *      Extract a word out for compressing text
+ * Input: 
+ *      s_in = string start in buffer
+ *      end = string end in buffer
+ * Output: 
+ *      Word = extracted word with length in 1st byte
+ *      s_in = ptr to next character in buffer yet to be processed
+ * ========================================================================= */
+#define PARSE_WORD(Word, s_in, end)                                \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    register u_char *wptr = (Word)+1;                              \
+    register int length = 0;                                       \
+    register int numeric = 0;                                      \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (length+charlength <= MAXWORDLEN && charlength > 0 &&    \
+	   (is_unicode_letter(c) || (is_unicode_digit(c) &&        \
+				     ++numeric <= MAXNUMERIC))) {  \
+      while (charlength-- > 0) {                                   \
+        *wptr++ = *(s_in)++; length++;                             \
+      }                                                            \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+    *(Word) = length;                                              \
+  }while(0)
+
+  /*  
+#define PARSE_WORD(Word, s_in, end)                                  \
+  do {                                                               \
+	  register u_char  *wptr = (Word)+1;                         \
+	  register int    length = 0;                                \
+	  register int    c = *(s_in);                               \
+	  register int	numeric = 0;                                 \
+                                                                     \
+	  while( length < MAXWORDLEN && INAWORD(c) && (s_in)<=(end)) \
+	    {                                                        \
+	      if ((numeric += INNUMBER(c)) > MAXNUMERIC)             \
+		break;                                               \
+	      *wptr++ = c;                                           \
+	      length++;                                              \
+	      c = *++(s_in);                                         \
+	    }                                                        \
+	  *(Word) = length;                                          \
+  }while(0)
+  */
+
+
+/* =========================================================================
+ * Macro: PARSE_NON_WORD
+ * Description: 
+ *      Extract a non-word out for storing compressed text
+ * Input: as above
+ * Output: as above
+ * ========================================================================= */
+#define PARSE_NON_WORD(Word, s_in, end)                            \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    register u_char *wptr = (Word)+1;                              \
+    register int length = 0;                                       \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (length+charlength <= MAXWORDLEN && charlength > 0 &&    \
+	   !is_unicode_letdig(c)) {                                \
+      while (charlength-- > 0) {                                   \
+        *wptr++ = *(s_in)++; length++;                             \
+      }                                                            \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+    *(Word) = length;                                              \
+  }while(0)
+
+    /*
+#define PARSE_NON_WORD(Word, s_in, end)                            \
+  do {                                                             \
+	  register u_char  *wptr = (Word)+1;                       \
+	  register int    length = 0;                              \
+	  register int    c = *(s_in);                             \
+                                                                   \
+	  while( length < MAXWORDLEN && !INAWORD(c) && (s_in)<=(end) ) \
+	    {                                                      \
+	      *wptr++ = c;                                         \
+	      length++;                                            \
+	      c = *++(s_in);                                       \
+	    }                                                      \
+	  *(Word) = length;                                        \
+  }while(0)
+    */
+
+
+/* =========================================================================
+ * Macro: PARSE_STEM_WORD 
+ * Description: 
+ *      Extracts out Word.      
+ * Input: 
+ *      s_in points to 1st letter in buffer to test
+ *      end points to last letter in buffer
+ * Output: 
+ *      s_in is modified to move to next word
+ *      Returns Word filled in with length in 1st byte.
+ * ========================================================================= */
+#define PARSE_STEM_WORD(Word, s_in, end)                           \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    register u_char *wptr = (Word)+1;                              \
+    register int length = 0;                                       \
+    register int numeric = 0;                                      \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (length+charlength <= MAXSTEMLEN && charlength > 0 &&    \
+	   (is_unicode_letter(c) || (is_unicode_digit(c) &&        \
+				     ++numeric <= MAXNUMERIC))) {  \
+      while (charlength-- > 0) {                                   \
+        *wptr++ = *(s_in)++; length++;                             \
+      }                                                            \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+    *(Word) = length;                                              \
+  }while(0)
+
+    /*
+#define PARSE_STEM_WORD(Word, s_in, end)                      \
+  do                                                          \
+    {                                                         \
+      register u_char  *wptr = (Word)+1;                      \
+      register int    length = 0;                             \
+      register int    c = *(s_in);                            \
+      register int    numeric = 0;                            \
+                                                              \
+      while ( length < MAXSTEMLEN && INAWORD(c) && (s_in)<=(end)) \
+        {                                                     \
+ 	  if ((numeric += INNUMBER(c)) > MAXNUMERIC)          \
+	    break;                                            \
+	  *wptr++ = c;                                        \
+	  length++;                                           \
+	  c = *++(s_in);                                      \
+	}                                                     \
+      *(Word) = length;                                       \
+    }while(0)
+    */
+
+
+/* =========================================================================
+ * Macro: PARSE_NON_STEM_WORD 
+ * Description: 
+ *      Eat up non-word. Do not store non-word.
+ *      It is not needed in index only in text !
+ *      
+ * Input: as above but no Word needed
+ * Output: as above
+ * ========================================================================= */
+#define PARSE_NON_STEM_WORD(s_in, end)                             \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (charlength > 0 && !is_unicode_letdig(c)) {              \
+      (s_in) += charlength;                                        \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+  }while(0)
+
+    /*
+#define PARSE_NON_STEM_WORD(s_in, end)           \
+  do                                             \
+    {                                            \
+      while (!INAWORD(*(s_in)) && (s_in)<=(end)) \
+	(s_in)++;                                \
+    }while(0)
+    */
+
+
+/* =========================================================================
+ * Macro: PARSE_NON_STEM_WORD_OR_SGML_TAG 
+ * Description: 
+ *      Like PARSE_NON_STEM_WORD but also eats up SGML tags
+ * Input: as above
+ * Output: as above
+ * ========================================================================= */
+#define PARSE_NON_STEM_WORD_OR_SGML_TAG(s_in, end)                 \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (charlength > 0 && !is_unicode_letdig(c)) {              \
+      if (c == '<') {                                              \
+	while (charlength > 0 && c != '>') {                       \
+	  (s_in) += charlength;                                    \
+	  charlength = parse_utf8_char((s_in),(end),&c);           \
+	}                                                          \
+      }                                                            \
+      (s_in) += charlength;                                        \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+  }while(0)
+
+    /*
+#define PARSE_NON_STEM_WORD_OR_SGML_TAG(s_in, end) \
+  do                                               \
+    {                                              \
+      register int    c = *(s_in);                 \
+                                                   \
+      while (!INAWORD(c) && (s_in)<=(end))         \
+        {                                          \
+	  if (c == '<')                            \
+            {                                      \
+	      while (c != '>' && (s_in)<=(end))    \
+		c = *++(s_in);                     \
+            }                                      \
+	  if ((s_in)<=(end))                       \
+	    c = *++(s_in);                         \
+	}                                          \
+    }while(0)
+    */
+
+
+/* =========================================================================
+ * Macro: PARSE_OPT_TERM_PARAM     [RPAP - Jan 97: Stem Index Change]
+ * Description: 
+ *      Extracts out optional paramater for query term.
+ *      Needed only in parsing the query line !
+ *
+ *      Note: that this function has not been converted to use UTF-8
+ *            as it should still work as it is (only uses ascii
+ *            characters)
+ *      
+ * Input: as above but no Word needed
+ * Output: as above
+ * ========================================================================= */
+#define PARSE_OPT_TERM_PARAM(Param, type, s_in, end)                       \
+  do                                                                       \
+    {                                                                      \
+	  register u_char  *wptr = (Param);                                \
+	  register int    length = 0;                                      \
+	  register int    c = *(s_in);                                     \
+                                                                           \
+          if (c == WEIGHTPARAM || c == STEMPARAM)                          \
+	    {                                                              \
+	      type = c;                                                    \
+	      c = *++(s_in);                                               \
+	      while( length < MAXPARAMLEN && isdigit(c) && (s_in)<=(end))  \
+		{                                                          \
+	           *wptr++ = c;                                            \
+	           length++;                                               \
+	           c = *++(s_in);                                          \
+	        }                                                          \
+	      *wptr = '\0';                                                \
+              for (; isdigit(c) && (s_in)<=(end); c = *++(s_in))           \
+                ;                                                          \
+            }							           \
+    }while(0)
+
+/* =========================================================================
+ * Macro: PARSE_RANKED_NON_STEM_WORD    [RJM 07/97: Ranked Required Terms]
+ * Description: 
+ *      Eat up non-word. Do not store non-word.
+ *      If come across a match requirement store it in require_match
+ *      It is not needed in index only in text !
+ *      
+ * Input: as above
+ * Output: the requirement mode for the next term. -1=must not match,
+ *      0=optional match, 1=must match
+ * ========================================================================= */
+#define PARSE_RANKED_NON_STEM_WORD(require_match, s_in, end)       \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    unsigned short c;                                              \
+    (require_match) = 0;                                           \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (charlength > 0 && !is_unicode_letdig(c)) {              \
+      if (c == MUSTMATCHPARAM) (require_match) = 1;                \
+      (s_in) += charlength;                                        \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+  }while(0)
+
+    /*
+#define PARSE_RANKED_NON_STEM_WORD(require_match, s_in, end)         \
+  do {                                            \
+    (require_match) = 0;                          \
+    while (!INAWORD(*(s_in)) && (s_in)<=(end)) {  \
+      if (*(s_in) == MUSTMATCHPARAM) {            \
+        (require_match) = 1;                      \
+      }                                           \
+      (s_in)++;                                   \
+    }                                             \
+  } while (0)
+    */
+
Index: /main/tags/2.38/gsdl/packages/mg/stamp-h.in
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/stamp-h.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/stamp-h.in	(revision 21083)
@@ -0,0 +1,1 @@
+timestamp
Index: /main/tags/2.38/gsdl/packages/mg/stemmerinterface.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/stemmerinterface.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/stemmerinterface.c	(revision 21083)
@@ -0,0 +1,39 @@
+#include "lib/lovinstem.h"
+#include <stdio.h>
+#include <ctype.h>
+
+int main () {
+  char word[256];
+  char c;
+  int len;
+
+  c = fgetc (stdin);
+  while (!feof (stdin)) {
+    /* output non words */
+    while (!feof (stdin) && !isalnum (c)) {
+      fputc (c, stdout);
+      c = fgetc (stdin);
+    }
+
+    /* get the word */
+    len = 0;
+    while (!feof (stdin) && isalnum (c) && len < 255) {
+      len++;
+      word[len] = c;
+      c = fgetc (stdin);
+    }
+    word[0] = len;
+
+    /* if we found a word stem and output it */
+    if (len > 0) {
+      lovinstem (word);
+      len = 0;
+      while (len < word[0]) {
+        len++;
+        fputc(word[len], stdout);
+      }
+    }
+  }
+}
+
+
Index: /main/tags/2.38/gsdl/packages/mg/sysfuncs.h
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/sysfuncs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/sysfuncs.h	(revision 21083)
@@ -0,0 +1,356 @@
+/* System dependent definitions for GNU tar.
+   Copyright (C) 1994 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * [TS:Aug/95]
+ * Based on code from system.h file in GNU's tar package 
+ *
+ */
+
+#ifndef SYSFUNCS_H
+#define SYSFUNCS_H
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include <WIN32cfg.h>
+# else
+#  include <config.h>
+# endif
+#endif
+
+/* Declare alloca.  AIX requires this to be the first thing in the file.  */
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#ifdef _AIX
+#pragma alloca
+#else
+#ifndef alloca
+char *alloca ();
+#endif
+#endif
+#endif
+#endif
+
+#include <sys/types.h>
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95]
+ * Some extra include files that mg needs
+ */
+#include <stdlib.h>
+#include <math.h>
+
+#ifndef log2
+# ifndef M_LN2
+#  define M_LN2 0.69314718055994530942
+# endif
+# define log2(x) (log(x)/M_LN2)
+#endif
+
+
+#ifndef HAVE_SETBUFFER
+# define setbuffer(f, b, s)  setvbuf(f, b, _IOFBF, s)
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if defined(__MSDOS__)  && !defined(__WIN32__)
+# define SHORT_SUFFIX 1
+#endif
+
+
+
+#include <assert.h>
+
+/* ------------------------------------------------- */
+
+/* Declare a generic pointer type.  */
+#if __STDC__ || defined(__TURBOC__)
+#define voidstar void *
+#else
+#define voidstar char *
+#endif
+
+/* Declare ISASCII.  */
+
+#include <ctype.h>
+
+#if STDC_HEADERS
+#define ISASCII(Char) 1
+#else
+#ifdef isascii
+#define ISASCII(Char) isascii (Char)
+#else
+#if HAVE_ISASCII
+#define ISASCII(Char) isascii (Char)
+#else
+#define ISASCII(Char) 1
+#endif
+#endif
+#endif
+
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95] 
+ * The following is copied from GNU Autoconf.Info (1.1)   
+ * It sets up the approriate string and memory functions.
+ */
+
+#if STDC_HEADERS || HAVE_STRING_H
+#include <string.h>
+   /* An ANSI string.h and pre-ANSI memory.h might conflict */
+#if !STDC_HEADERS && HAVE_MEMORY_H
+#include <memory.h>
+#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
+#ifndef index
+/*#define index strchr 
+ *
+ * this is stuffing up our code so its commented out */
+#endif
+#ifndef rindex
+#define rindex strrchr
+#endif
+#ifndef bcopy
+#define bcopy(s, d, n) memcpy((d), (s), (n))
+#endif
+#ifndef bcmp
+#define bcmp(s1, s2, n) memcmp((s1), (s2), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n) memset((s), 0, (n))
+#endif
+#else /* not STDC_HEADERS and not HAVE_STRING_H */
+#include <strings.h>
+   /* memory.h and strings.h conflict on some systems */
+#endif
+/* ------------------------------------------------- */
+
+
+/* Declare errno.  */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+/* Declare open parameters.  */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#include <sys/file.h>
+#endif
+
+#ifndef	O_BINARY
+#define O_BINARY 0
+#endif
+#ifndef O_CREAT
+#define O_CREAT 0
+#endif
+#ifndef	O_NDELAY
+#define O_NDELAY 0
+#endif
+#ifndef	O_RDONLY
+#define O_RDONLY 0
+#endif
+#ifndef O_RDWR
+#define O_RDWR 2
+#endif
+
+/* Declare file status routines and bits.  */
+
+#include <sys/stat.h>
+
+#ifdef STAT_MACROS_BROKEN
+#undef S_ISBLK
+#undef S_ISCHR
+#undef S_ISDIR
+#undef S_ISFIFO
+#undef S_ISLNK
+#undef S_ISMPB
+#undef S_ISMPC
+#undef S_ISNWK
+#undef S_ISREG
+#undef S_ISSOCK
+#endif
+
+/* On MSDOS, there are missing things from <sys/stat.h>.  */
+#if defined(__MSDOS__)
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
+#endif
+
+#if defined(__GNUC__) && defined(__WIN32__)
+#include <limits.h>
+#endif
+
+#ifndef S_ISREG			/* POSIX.1 stat stuff missing */
+#define mode_t unsigned short
+#endif
+#if !defined(S_ISBLK) && defined(S_IFBLK)
+#define S_ISBLK(Mode) (((Mode) & S_IFMT) == S_IFBLK)
+#endif
+#if !defined(S_ISCHR) && defined(S_IFCHR)
+#define S_ISCHR(Mode) (((Mode) & S_IFMT) == S_IFCHR)
+#endif
+#if !defined(S_ISDIR) && defined(S_IFDIR)
+#define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
+#endif
+#if !defined(S_ISREG) && defined(S_IFREG)
+#define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
+#endif
+#if !defined(S_ISFIFO) && defined(S_IFIFO)
+#define S_ISFIFO(Mode) (((Mode) & S_IFMT) == S_IFIFO)
+#endif
+#if !defined(S_ISLNK) && defined(S_IFLNK)
+#define S_ISLNK(Mode) (((Mode) & S_IFMT) == S_IFLNK)
+#endif
+#if !defined(S_ISSOCK) && defined(S_IFSOCK)
+#define S_ISSOCK(Mode) (((Mode) & S_IFMT) == S_IFSOCK)
+#endif
+#if !defined(S_ISMPB) && defined(S_IFMPB)	/* V7 */
+#define S_ISMPB(Mode) (((Mode) & S_IFMT) == S_IFMPB)
+#define S_ISMPC(Mode) (((Mode) & S_IFMT) == S_IFMPC)
+#endif
+#if !defined(S_ISNWK) && defined(S_IFNWK)	/* HP/UX */
+#define S_ISNWK(Mode) (((Mode) & S_IFMT) == S_IFNWK)
+#endif
+
+#if !defined(S_ISCTG) && defined(S_IFCTG)	/* contiguous file */
+#define S_ISCTG(Mode) (((Mode) & S_IFMT) == S_IFCTG)
+#endif
+#if !defined(S_ISVTX)
+#define S_ISVTX 0001000
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if !defined(_POSIX_SOURCE) && !defined(__WIN32__)
+#include <sys/param.h>
+#endif
+
+/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION.  */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+
+/* Declare standard functions.  */
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+voidstar malloc ();
+voidstar realloc ();
+char *getenv ();
+#endif
+
+#include <stdio.h>
+
+#ifndef _POSIX_VERSION
+#ifdef __MSDOS__
+#include <io.h>
+#else
+off_t lseek ();
+#endif
+#endif
+
+#include <pathmax.h>
+
+/* Until getoptold function is declared in getopt.h, we need this here for
+   struct option.  */
+#include <getopt.h>
+
+#ifdef WITH_DMALLOC
+#undef HAVE_VALLOC
+#define DMALLOC_FUNC_CHECK
+#include <dmalloc.h>
+#endif
+
+/* Prototypes for external functions.  */
+
+#ifndef __P
+#if PROTOTYPES
+#define __P(Args) Args
+#else
+#define __P(Args) ()
+#endif
+#endif
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#if ENABLE_NLS
+#include <libintl.h>
+#define _(Text) gettext (Text)
+#else
+#define textdomain(Domain)
+#define _(Text) Text
+#endif
+
+/* Library modules.  */
+
+#if (HAVE_VPRINTF || HAVE_DOPRNT) && __STDC__
+/*void error __P ((int, int, const char *,...));*/
+void error (int, int, const char *,...);
+#else
+void error (int, int, char *, char *, char *, char *, char *, char *, char *, char *, char *);
+#endif
+
+#ifndef HAVE_STRSTR
+char *strstr __P ((const char *, const char *));
+#endif
+
+/* [RB/TS:Oct/95] commented out. Used by lib/gmalloc.c - but it defines it anyway ???
+ *#ifndef HAVE_VALLOC
+ *#define valloc(Size) malloc (Size)
+ *#endif
+ */
+
+voidstar xmalloc __P ((size_t));
+voidstar xrealloc __P ((voidstar, size_t));
+char *xstrdup __P ((const char *));
+
+/* [TS:Aug/95] 
+ * These were required by files which referred 
+ * to these as function pointers. 
+ * e.g. huffman.c - fread,  mgfelics.c - fgetc
+ */
+#ifndef HAVE_FREAD_DECL
+extern size_t   fread __P ((void *, size_t, size_t, FILE *));
+#endif
+#ifndef HAVE_FGETC_DECL
+extern int      fgetc __P ((FILE *));
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifndef u_long
+# define u_long unsigned long
+#endif
+#ifndef u_char
+# define u_char unsigned char
+#endif
+
+
+#endif /* SYSFUNCS_H */
Index: /main/tags/2.38/gsdl/packages/mg/test/Makefile
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/Makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/Makefile	(revision 21083)
@@ -0,0 +1,10 @@
+DISTFILES = Makefile q1 q2 q3 r1 r2 r3 mgrc1 mgrc2 mgrc3 testmg \
+            alice.sum simple_sum.c alice.len
+
+all: simple_sum
+
+dist:
+	ln $(DISTFILES) $(distdir)
+
+simple_sum: simple_sum.c
+	cc -o $@ $?
Index: /main/tags/2.38/gsdl/packages/mg/test/alice.len
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/alice.len	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/alice.len	(revision 21083)
@@ -0,0 +1,2 @@
+./mgdata/alice/alice.invf.dict.hash: 13256
+./mgdata/alice/alice.text.dict: 19321
Index: /main/tags/2.38/gsdl/packages/mg/test/alice.sum
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/alice.sum	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/alice.sum	(revision 21083)
@@ -0,0 +1,8 @@
+./mgdata/alice/alice.invf: 2618428 19209
+./mgdata/alice/alice.invf.chunk: 189460 2134
+./mgdata/alice/alice.invf.chunk.trans: 331998 2585
+./mgdata/alice/alice.invf.dict.blocked: 1030626 33214
+./mgdata/alice/alice.invf.idx: 309022 7572
+./mgdata/alice/alice.text: 5075885 40099
+./mgdata/alice/alice.text.idx: 185535 3380
+./mgdata/alice/alice.text.stats: 2432380 49146
Index: /main/tags/2.38/gsdl/packages/mg/test/mgrc1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/mgrc1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/mgrc1	(revision 21083)
@@ -0,0 +1,2 @@
+.set mode text
+.set query boolean
Index: /main/tags/2.38/gsdl/packages/mg/test/mgrc2
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/mgrc2	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/mgrc2	(revision 21083)
@@ -0,0 +1,2 @@
+.set mode text
+.set query ranked
Index: /main/tags/2.38/gsdl/packages/mg/test/mgrc3
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/mgrc3	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/mgrc3	(revision 21083)
@@ -0,0 +1,2 @@
+.set mode docnums
+.set query boolean
Index: /main/tags/2.38/gsdl/packages/mg/test/q1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/q1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/q1	(revision 21083)
@@ -0,0 +1,1 @@
+flamingo
Index: /main/tags/2.38/gsdl/packages/mg/test/q2
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/q2	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/q2	(revision 21083)
@@ -0,0 +1,1 @@
+flamingo
Index: /main/tags/2.38/gsdl/packages/mg/test/q3
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/q3	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/q3	(revision 21083)
@@ -0,0 +1,2 @@
+Rabbit & !(Alice | she)
+laser
Index: /main/tags/2.38/gsdl/packages/mg/test/r1
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/r1	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/r1	(revision 21083)
@@ -0,0 +1,46 @@
+> flamingo
+flamingo
+---------------------------------- 482
+  The chief difficulty Alice found at first was in managing her 
+flamingo:  she succeeded in getting its body tucked away, 
+comfortably enough, under her arm, with its legs hanging down, 
+but generally, just as she had got its neck nicely straightened 
+out, and was going to give the hedgehog a blow with its head, it 
+WOULD twist itself round and look up in her face, with such a 
+puzzled expression that she could not help bursting out laughing:  
+and when she had got its head down, and was going to begin again, 
+it was very provoking to find that the hedgehog had unrolled 
+itself, and was in the act of crawling away:  besides all this, 
+there was generally a ridge or furrow in the way wherever she 
+wanted to send the hedgehog to, and, as the doubled-up soldiers 
+were always getting up and walking off to other parts of the 
+ground, Alice soon came to the conclusion that it was a very 
+difficult game indeed. 
+---------------------------------- 487
+  Alice waited till the eyes appeared, and then nodded.  `It's no 
+use speaking to it,' she thought, `till its ears have come, or at 
+least one of them.'  In another minute the whole head appeared, 
+and then Alice put down her flamingo, and began an account of the 
+game, feeling very glad she had someone to listen to her.  The 
+Cat seemed to think that there was enough of it now in sight, and 
+no more of it appeared. 
+---------------------------------- 502
+  The hedgehog was engaged in a fight with another hedgehog, 
+which seemed to Alice an excellent opportunity for croqueting one 
+of them with the other:  the only difficulty was, that her 
+flamingo was gone across to the other side of the garden, where 
+Alice could see it trying in a helpless sort of way to fly up 
+into a tree. 
+---------------------------------- 503
+  By the time she had caught the flamingo and brought it back, 
+the fight was over, and both the hedgehogs were out of sight:  
+`but it doesn't matter much,' thought Alice, `as all the arches 
+are gone from the side of the ground.'  So she tucked it away 
+under her arm, that it might not escape again, and went back for 
+a little more conversation with her friend. 
+---------------------------------- 526
+  `I dare say you're wondering why I don't put my arm round your 
+waist,' the Duchess said after a pause:  `the reason is, that I'm 
+doubtful about the temper of your flamingo.  Shall I try the 
+experiment?' 
+5 documents retrieved.
Index: /main/tags/2.38/gsdl/packages/mg/test/r2
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/r2	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/r2	(revision 21083)
@@ -0,0 +1,46 @@
+> flamingo
+flamingo
+---------------------------------- 526 1.322623
+  `I dare say you're wondering why I don't put my arm round your 
+waist,' the Duchess said after a pause:  `the reason is, that I'm 
+doubtful about the temper of your flamingo.  Shall I try the 
+experiment?' 
+---------------------------------- 503 1.013693
+  By the time she had caught the flamingo and brought it back, 
+the fight was over, and both the hedgehogs were out of sight:  
+`but it doesn't matter much,' thought Alice, `as all the arches 
+are gone from the side of the ground.'  So she tucked it away 
+under her arm, that it might not escape again, and went back for 
+a little more conversation with her friend. 
+---------------------------------- 502 1.009519
+  The hedgehog was engaged in a fight with another hedgehog, 
+which seemed to Alice an excellent opportunity for croqueting one 
+of them with the other:  the only difficulty was, that her 
+flamingo was gone across to the other side of the garden, where 
+Alice could see it trying in a helpless sort of way to fly up 
+into a tree. 
+---------------------------------- 487 0.882496
+  Alice waited till the eyes appeared, and then nodded.  `It's no 
+use speaking to it,' she thought, `till its ears have come, or at 
+least one of them.'  In another minute the whole head appeared, 
+and then Alice put down her flamingo, and began an account of the 
+game, feeling very glad she had someone to listen to her.  The 
+Cat seemed to think that there was enough of it now in sight, and 
+no more of it appeared. 
+---------------------------------- 482 0.529432
+  The chief difficulty Alice found at first was in managing her 
+flamingo:  she succeeded in getting its body tucked away, 
+comfortably enough, under her arm, with its legs hanging down, 
+but generally, just as she had got its neck nicely straightened 
+out, and was going to give the hedgehog a blow with its head, it 
+WOULD twist itself round and look up in her face, with such a 
+puzzled expression that she could not help bursting out laughing:  
+and when she had got its head down, and was going to begin again, 
+it was very provoking to find that the hedgehog had unrolled 
+itself, and was in the act of crawling away:  besides all this, 
+there was generally a ridge or furrow in the way wherever she 
+wanted to send the hedgehog to, and, as the doubled-up soldiers 
+were always getting up and walking off to other parts of the 
+ground, Alice soon came to the conclusion that it was a very 
+difficult game indeed. 
+5 documents retrieved.
Index: /main/tags/2.38/gsdl/packages/mg/test/r3
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/r3	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/r3	(revision 21083)
@@ -0,0 +1,21 @@
+> Rabbit & !(Alice | she)
+Rabbit Alice she
+     14.14     
+    126.126    
+    143.143    
+    478.478    
+    701.701    
+    704.704    
+    705.705    
+    755.755    
+    774.774    
+    786.786    
+    788.788    
+    791.791    
+    793.793    
+    801.801    
+    803.803    
+15 documents retrieved.
+> laser
+laser
+No entries correspond to that query.
Index: /main/tags/2.38/gsdl/packages/mg/test/simple_sum.c
===================================================================
--- /main/tags/2.38/gsdl/packages/mg/test/simple_sum.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/mg/test/simple_sum.c	(revision 21083)
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * sum.c -- byte summing program
+ * Copyright (C) 1995  Tim Shimmin
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+$Log$
+Revision 1.1  1999/08/10 21:18:33  sjboddie
+renamed mg-1.3d directory mg
+
+Revision 1.1  1998/11/17 09:36:00  rjmcnab
+*** empty log message ***
+
+*/
+
+/*
+ * If given -l option then just prints the length.
+ * Normally prints the sum and the length for the file.
+ */
+
+static int length_only = 0;
+
+#include <stdio.h>
+
+void 
+output_sum(fname, input_file, output_file)
+char *fname;
+FILE *input_file;
+FILE *output_file;
+{
+  int ch = '\0';
+  unsigned long sum = 0;
+  unsigned long num_bytes = 0;
+
+  while((ch = getc(input_file))!=EOF){
+    sum += ch;
+    num_bytes++;
+  }
+
+  if (length_only)
+    fprintf(output_file, "%s: %ld\n", fname, num_bytes);
+  else
+    fprintf(output_file, "%s: %ld %ld\n", fname, sum, num_bytes);
+}
+
+void
+main(argc, argv)
+int argc;
+char *argv[];
+{
+  int i = 0;
+
+  /* use stdin */
+  if (argc == 1){
+    output_sum("-", stdin, stdout);
+    exit(0);
+  }
+
+  /* use args as file names for input */
+  for (i=1;i<argc; i++){
+    char *fname = argv[i];
+    FILE *input_file = NULL;
+    
+    if (!length_only && (argv[i][0] == '-') && (argv[i][1] =='l') ) 
+      { 
+        length_only = 1; 
+        continue;
+      }
+
+    input_file = fopen(fname, "r");
+    if (!input_file){
+      fprintf(stderr,"Could not open %s\n", fname);
+      continue;
+    }
+    else{
+      output_sum(fname, input_file, stdout);
+      fclose(input_file);
+    }
+  }/*for*/
+  exit(0);
+
+}
Index: /main/tags/2.38/gsdl/packages/pdftohtml/readme-gs.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/pdftohtml/readme-gs.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/pdftohtml/readme-gs.txt	(revision 21083)
@@ -0,0 +1,15 @@
+This is pdftohtml, which is based at:
+     http://www.ra.informatik.uni-stuttgart.de/~gosho/pdftohtml/
+
+The version is based on version 0.22, with some code included from
+version 0.31. It has been modified for Greenstone use, particularly
+the file xpdf/HtmlOutputDev.cc, in an attempt to get text and images
+in roughly the right place without using javascript or multiple pages.
+
+Known problems:
+      tables with text.
+      multi-column pages.
+      some image types don't get extracted.
+
+John McPherson.
+02 May 2001.
Index: /main/tags/2.38/gsdl/packages/rtftohtml/rtftohtml-gs.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/rtftohtml/rtftohtml-gs.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/rtftohtml/rtftohtml-gs.txt	(revision 21083)
@@ -0,0 +1,56 @@
+RTF TO HTML
+-----------
+
+This is based on version 2.7.5 of rtftohtml, which was last modified in
+November, 1994.
+It contains the text:
+###
+Initial Implementation by Chris Hector (cjh@cray.com)
+(c) 1994 by Chris Hector
+May be freely distributed.
+This translator was based on rtfskel.
+###
+The last known email address I can find for him is <cjh@cray.com>.
+I think that <chris@sunpack.com> might reach him, but I'm not sure.
+
+
+Versions 3.0 of rtftohtml and up are released under a shareware license,
+and available from http://www.logictran.com (although it now has a new
+name). You can download a free binary version of the software for most
+platforms from this site.
+
+
+
+
+rtftohtml is based on RTF Tools, which is (c) April 1994 by Paul DuBois
+<dubois@primate.wisc.edu>
+
+RTF Tools has the notice:
+##
+Distribution Availability
+This software may be redistributed without restriction and used for any
+purpose whatsoever.
+##
+
+The supplied version understands RTF version 1.2, while the
+latest version of the specification is RTF 1.6 (May 1999).
+
+I have added some of the newer rtf codes that were preventing some files from
+being parsed properly, but they are not acted on. Most of them do not
+actually affect the content anyway. Depending on how the rtf was created,
+there might be tags that cause us to trip up and fail. If you have
+rtf files that Greenstone is not extracting text from, please send me
+some email (jrm21@cs.waikato.ac.nz).
+
+Note - we extract but do not convert Windows Metafile Format (.wmf) images.
+On unix systems, these can be converted with newer versions of ImageMagick
+(ie "convert" version 4.2.9 or newer).
+Also, libwmf (for unix and windows) is available for conversion at:
+http://wvware.sourceforge.net/projects/libwmf.html
+but we do not include it here due to its dependencies
+(eg libttf for truetype fonts).
+
+Embedded images such as jpegs and pngs are extracted fine, though.
+
+John McPherson (jrm21@cs.waikato.ac.nz)
+June 2001.
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.pm	(revision 21083)
@@ -0,0 +1,198 @@
+#
+# $Id$
+
+package MIME::Base64;
+
+=head1 NAME
+
+MIME::Base64 - Encoding and decoding of base64 strings
+
+=head1 SYNOPSIS
+
+ use MIME::Base64;
+
+ $encoded = encode_base64('Aladdin:open sesame');
+ $decoded = decode_base64($encoded);
+
+=head1 DESCRIPTION
+
+This module provides functions to encode and decode strings into the
+Base64 encoding specified in RFC 2045 - I<MIME (Multipurpose Internet
+Mail Extensions)>. The Base64 encoding is designed to represent
+arbitrary sequences of octets in a form that need not be humanly
+readable. A 65-character subset ([A-Za-z0-9+/=]) of US-ASCII is used,
+enabling 6 bits to be represented per printable character.
+
+The following functions are provided:
+
+=over 4
+
+=item encode_base64($str, [$eol])
+
+Encode data by calling the encode_base64() function.  The first
+argument is the string to encode.  The second argument is the line
+ending sequence to use (it is optional and defaults to C<"\n">).  The
+returned encoded string is broken into lines of no more than 76
+characters each and it will end with $eol unless it is empty.  Pass an
+empty string as second argument if you do not want the encoded string
+broken into lines.
+
+=item decode_base64($str)
+
+Decode a base64 string by calling the decode_base64() function.  This
+function takes a single argument which is the string to decode and
+returns the decoded data.
+
+Any character not part of the 65-character base64 subset set is
+silently ignored.  Characters occuring after a '=' padding character
+are never decoded.
+
+If the length of the string to decode (after ignoring
+non-base64 chars) is not a multiple of 4 or padding occurs too ealy,
+then a warning is generated if perl is running under C<-w>.
+
+=back
+
+If you prefer not to import these routines into your namespace you can
+call them as:
+
+    use MIME::Base64 ();
+    $encoded = MIME::Base64::encode($decoded);
+    $decoded = MIME::Base64::decode($encoded);
+
+=head1 DIAGNOSTICS
+
+The following warnings might be generated if perl is invoked with the
+C<-w> switch:
+
+=over 4
+
+=item Premature end of base64 data
+
+The number of characters to decode is not a multiple of 4.  Legal
+base64 data should be padded with one or two "=" characters to make
+its length a multiple of 4.  The decoded result will anyway be as if
+the padding was there.
+
+=item Premature padding of base64 data
+
+The '=' padding character occurs as the first or second character
+in a base64 quartet.
+
+=back
+
+=head1 EXAMPLES
+
+If you want to encode a large file, you should encode it in chunks
+that are a multiple of 57 bytes.  This ensures that the base64 lines
+line up and that you do not end up with padding in the middle. 57
+bytes of data fills one complete base64 line (76 == 57*4/3):
+
+   use MIME::Base64 qw(encode_base64);
+
+   open(FILE, "/var/log/wtmp") or die "$!";
+   while (read(FILE, $buf, 60*57)) {
+       print encode_base64($buf);
+   }
+
+or if you know you have enough memory
+
+   use MIME::Base64 qw(encode_base64);
+   local($/) = undef;  # slurp
+   print encode_base64(<STDIN>);
+
+=head1 COPYRIGHT
+
+Copyright 1995-1999 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+Distantly based on LWP::Base64 written by Martijn Koster
+<m.koster@nexor.co.uk> and Joerg Reichelt <j.reichelt@nexor.co.uk> and
+code posted to comp.lang.perl <3pd2lp$6gf@wsinti07.win.tue.nl> by Hans
+Mulder <hansm@wsinti07.win.tue.nl>
+
+The XS implementation use code from metamail.  Copyright 1991 Bell
+Communications Research, Inc. (Bellcore)
+
+=cut
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION $OLD_CODE);
+
+require Exporter;
+require DynaLoader;
+@ISA = qw(Exporter DynaLoader);
+@EXPORT = qw(encode_base64 decode_base64);
+
+$VERSION = '2.11';
+
+eval { bootstrap MIME::Base64 $VERSION; };
+if ($@) {
+    # can't bootstrap XS implementation, use perl implementation
+    *encode_base64 = \&old_encode_base64;
+    *decode_base64 = \&old_decode_base64;
+
+    $OLD_CODE = $@;
+    #warn $@ if $^W;
+}
+
+# Historically this module has been implemented as pure perl code.
+# The XS implementation runs about 20 times faster, but the Perl
+# code might be more portable, so it is still here.
+
+use integer;
+
+sub old_encode_base64 ($;$)
+{
+    my $res = "";
+    my $eol = $_[1];
+    $eol = "\n" unless defined $eol;
+    pos($_[0]) = 0;                          # ensure start at the beginning
+    while ($_[0] =~ /(.{1,45})/gs) {
+	$res .= substr(pack('u', $1), 1);
+	chop($res);
+    }
+    $res =~ tr|` -_|AA-Za-z0-9+/|;               # `# help emacs
+    # fix padding at the end
+    my $padding = (3 - length($_[0]) % 3) % 3;
+    $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
+    # break encoded string into lines of no more than 76 characters each
+    if (length $eol) {
+	$res =~ s/(.{1,76})/$1$eol/g;
+    }
+    $res;
+}
+
+
+sub old_decode_base64 ($)
+{
+    local($^W) = 0; # unpack("u",...) gives bogus warning in 5.00[123]
+
+    my $str = shift;
+    my $res = "";
+
+    $str =~ tr|A-Za-z0-9+=/||cd;            # remove non-base64 chars
+    if (length($str) % 4) {
+	require Carp;
+	Carp::carp("Length of base64 data not a multiple of 4")
+    }
+    $str =~ s/=+$//;                        # remove padding
+    $str =~ tr|A-Za-z0-9+/| -_|;            # convert to uuencoded format
+    while ($str =~ /(.{1,60})/gs) {
+	my $len = chr(32 + length($1)*3/4); # compute length byte
+	$res .= unpack("u", $len . $1 );    # uudecode
+    }
+    $res;
+}
+
+# Set up aliases so that these functions also can be called as
+#
+#    MIME::Base64::encode();
+#    MIME::Base64::decode();
+
+*encode = \&encode_base64;
+*decode = \&decode_base64;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.xs
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.xs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Base64.xs	(revision 21083)
@@ -0,0 +1,215 @@
+/* $Id$
+
+Copyright 1997-1998 Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
+The tables and some of the code that used to be here was borrowed from
+metamail, which comes with this message:
+
+  Copyright (c) 1991 Bell Communications Research, Inc. (Bellcore)
+
+  Permission to use, copy, modify, and distribute this material 
+  for any purpose and without fee is hereby granted, provided 
+  that the above copyright notice and this permission notice 
+  appear in all copies, and that the name of Bellcore not be 
+  used in advertising or publicity pertaining to this 
+  material without the specific, prior written permission 
+  of an authorized representative of Bellcore.	BELLCORE 
+  MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY 
+  OF THIS MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS", 
+  WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
+
+*/
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+#ifdef __cplusplus
+}
+#endif
+
+#include "patchlevel.h"
+#if PATCHLEVEL <= 4 && !defined(PL_dowarn)
+   #define PL_dowarn dowarn
+#endif
+
+#define MAX_LINE  76 /* size of encoded lines */
+
+static char basis_64[] =
+   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+#define XX      255	/* illegal base64 char */
+#define EQ      254	/* padding */
+#define INVALID XX
+
+static unsigned char index_64[256] = {
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,62, XX,XX,XX,63,
+    52,53,54,55, 56,57,58,59, 60,61,XX,XX, XX,EQ,XX,XX,
+    XX, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
+    15,16,17,18, 19,20,21,22, 23,24,25,XX, XX,XX,XX,XX,
+    XX,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
+    41,42,43,44, 45,46,47,48, 49,50,51,XX, XX,XX,XX,XX,
+
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+    XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX, XX,XX,XX,XX,
+};
+
+
+
+MODULE = MIME::Base64		PACKAGE = MIME::Base64
+
+SV*
+encode_base64(sv,...)
+	SV* sv
+	PROTOTYPE: $;$
+
+	PREINIT:
+	char *str;     /* string to encode */
+	SSize_t len;   /* length of the string */
+	char *eol;     /* the end-of-line sequence to use */
+	STRLEN eollen; /* length of the EOL sequence */
+	char *r;       /* result string */
+	STRLEN rlen;   /* length of result string */
+	unsigned char c1, c2, c3;
+	int chunk;
+
+	CODE:
+	str = SvPV(sv, rlen); /* SvPV(sv, len) gives warning for signed len */
+	len = (SSize_t)rlen;
+
+	/* set up EOL from the second argument if present, default to "\n" */
+	if (items > 1 && SvOK(ST(1))) {
+	    eol = SvPV(ST(1), eollen);
+	} else {
+	    eol = "\n";
+	    eollen = 1;
+	}
+
+	/* calculate the length of the result */
+	rlen = (len+2) / 3 * 4;	 /* encoded bytes */
+	if (rlen) {
+	    /* add space for EOL */
+	    rlen += ((rlen-1) / MAX_LINE + 1) * eollen;
+	}
+
+	/* allocate a result buffer */
+	RETVAL = newSV(rlen ? rlen : 1);
+	SvPOK_on(RETVAL);	
+	SvCUR_set(RETVAL, rlen);
+	r = SvPVX(RETVAL);
+
+	/* encode */
+	for (chunk=0; len > 0; len -= 3, chunk++) {
+	    if (chunk == (MAX_LINE/4)) {
+		char *c = eol;
+		char *e = eol + eollen;
+		while (c < e)
+		    *r++ = *c++;
+		chunk = 0;
+	    }
+	    c1 = *str++;
+	    c2 = *str++;
+	    *r++ = basis_64[c1>>2];
+	    *r++ = basis_64[((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4)];
+	    if (len > 2) {
+		c3 = *str++;
+		*r++ = basis_64[((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6)];
+		*r++ = basis_64[c3 & 0x3F];
+	    } else if (len == 2) {
+		*r++ = basis_64[(c2 & 0xF) << 2];
+		*r++ = '=';
+	    } else { /* len == 1 */
+		*r++ = '=';
+		*r++ = '=';
+	    }
+	}
+	if (rlen) {
+	    /* append eol to the result string */
+	    char *c = eol;
+	    char *e = eol + eollen;
+	    while (c < e)
+		*r++ = *c++;
+	}
+	*r = '\0';  /* every SV in perl should be NUL-terminated */
+
+	OUTPUT:
+	RETVAL
+
+SV*
+decode_base64(sv)
+	SV* sv
+	PROTOTYPE: $
+
+	PREINIT:
+	STRLEN len;
+	register unsigned char *str = (unsigned char*)SvPV(sv, len);
+	unsigned char const* end = str + len;
+	char *r;
+	unsigned char c[4];
+
+	CODE:
+	{
+	    /* always enough, but might be too much */
+	    STRLEN rlen = len * 3 / 4;
+	    RETVAL = newSV(rlen ? rlen : 1);
+	}
+        SvPOK_on(RETVAL);
+        r = SvPVX(RETVAL);
+
+	while (str < end) {
+	    int i = 0;
+            do {
+		unsigned char uc = index_64[*str++];
+		if (uc != INVALID)
+		    c[i++] = uc;
+
+		if (str == end) {
+		    if (i < 4) {
+			if (i && PL_dowarn)
+			    warn("Premature end of base64 data");
+			if (i < 2) goto thats_it;
+			if (i == 2) c[2] = EQ;
+			c[3] = EQ;
+		    }
+		    break;
+		}
+            } while (i < 4);
+	    
+	    if (c[0] == EQ || c[1] == EQ) {
+		if (PL_dowarn) warn("Premature padding of base64 data");
+		break;
+            }
+	    /* printf("c0=%d,c1=%d,c2=%d,c3=%d\n", c[0],c[1],c[2],c[3]);/**/
+
+	    *r++ = (c[0] << 2) | ((c[1] & 0x30) >> 4);
+
+	    if (c[2] == EQ)
+		break;
+	    *r++ = ((c[1] & 0x0F) << 4) | ((c[2] & 0x3C) >> 2);
+
+	    if (c[3] == EQ)
+		break;
+	    *r++ = ((c[2] & 0x03) << 6) | c[3];
+	}
+
+      thats_it:
+	SvCUR_set(RETVAL, r - SvPVX(RETVAL));
+	*r = '\0';
+
+	OUTPUT:
+	RETVAL
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Changes
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Changes	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Changes	(revision 21083)
@@ -0,0 +1,119 @@
+1998-02-27   Gisle Aas <gisle@aas.no>
+
+   Release 2.11
+
+   Fixed bogues "Premature end of base64 data" warning.  Bug spotted
+   by Dwayne Jacques Fontenot.
+
+   Workaround for Redhat shipping trial releases of perl.
+
+
+
+1998-12-18   Gisle Aas <aas@sn.no>
+
+   Release 2.10
+
+   A tweak that should make compilation with some old perl5.00[23]
+   perls better.
+
+   A cast that make some compilers more happy.
+
+
+
+1998-11-13   Gisle Aas <aas@sn.no>
+
+   Release 2.09
+
+   The 2.08 release did not compile with perl5.005_53, because
+   all simple globals now need to be prefixed with "PL_".
+
+
+
+1998-10-22   Gisle Aas <aas@sn.no>
+
+   Release 2.08
+
+   Found another tweak to speed up decode_base64() with another 3%.
+
+   Improved MIME::Base64 documentation a little.
+
+
+
+1998-10-21   Gisle Aas <aas@sn.no>
+
+   Release 2.07
+
+   Faster and smarter C implementation of the decode_base64()
+   function.  The new decode_base64() was 25% faster when tested
+   on Linux, i586, gcc -O2.
+
+
+
+1998-07-15   Gisle Aas <aas@sn.no>
+
+   Release 2.06
+
+   The decode_base64() implemented in pure perl will only carp
+   (not croak) if length of data to decode is not a multiple 4.  This
+   actually made 'make test' fail after 'rm Base64.xs'.
+
+
+
+1998-01-27   Gisle Aas <aas@sn.no>
+
+   Release 2.05
+
+   The decode_base64() would previously allocate a too short buffer for the
+   result string when the trailing "==" padding was missing in the string to
+   be decoded.
+
+   The encode_base64() now allocate one byte less space in the result
+   strings returned.
+
+
+
+1997-12-02   Gisle Aas <aas@sn.no>
+
+   Release 2.04
+
+   Documentation expanded a bit.
+
+
+
+1997-07-10   Gisle Aas <aas@sn.no>
+
+   Release 2.03
+
+   Decode_base64() doesn't croak on premature ended data any more.
+   A warning is generated instead if running under -w.
+   
+
+
+1997-06-27   Gisle Aas <aas@sn.no>
+
+   Release 2.02
+
+   QuotedPrint fix by Roderick Schertler <roderick@argon.org>:
+
+      - Long lines were not broken unless they're at the beginning
+        of the text
+
+      - Lines near but not over 76 chars were broken when they
+        shouldn't be
+
+
+
+1997-06-13   Gisle Aas <aas@sn.no>
+
+   Release 2.01
+
+   Base64.xs: Avoid type convertion warnings with some compilers
+
+   Minor documentation updates
+
+
+
+1997-04-24   Gisle Aas <aas@sn.no>
+
+   Release 2.00, based on libwww-perl-5.08.
+
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/INSTALL.w3mir
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/INSTALL.w3mir	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/INSTALL.w3mir	(revision 21083)
@@ -0,0 +1,27 @@
+- You also have to get the MIME-Base64 package
+  (http://www.perl.com/CPAN/modules/by-module/MIME/)
+
+- Unpack it:
+
+    gzip -dc MIME-Base64-*.tar.gz | tar xvBf -
+
+- Install it:
+
+    cd MIME-Base64-*
+
+  Then, as above, either
+
+    perl Makefile.PL
+
+  or
+
+    perl Makefile.PL PREFIX=/some/dir
+
+  Continue:
+
+    make
+    make test      (it should print 'All tests successful.')
+    make install
+
+  Now MIME-Base64 should be installed and working.
+
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/MANIFEST
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/MANIFEST	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/MANIFEST	(revision 21083)
@@ -0,0 +1,9 @@
+Base64.pm	Bootstrap and perl implementation of MIME::Base64
+Base64.xs	Encoder and decoder written in C
+Changes		What's new
+MANIFEST	This file
+Makefile.PL	Writes the Makefile
+QuotedPrint.pm  MIME::QuotedPrint module, encoder and decoder
+README		Please do!
+t/base64.t	Test that it works
+t/quoted-print.t
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Makefile.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Makefile.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/Makefile.PL	(revision 21083)
@@ -0,0 +1,8 @@
+require 5.002;
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+    NAME	 => 'MIME::Base64',
+    VERSION_FROM => 'Base64.pm',
+    dist         => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
+);
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/QuotedPrint.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/QuotedPrint.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/QuotedPrint.pm	(revision 21083)
@@ -0,0 +1,115 @@
+#
+# $Id$
+
+package MIME::QuotedPrint;
+
+=head1 NAME
+
+MIME::QuotedPrint - Encoding and decoding of quoted-printable strings
+
+=head1 SYNOPSIS
+
+ use MIME::QuotedPrint;
+
+ $encoded = encode_qp($decoded);
+ $decoded = decode_qp($encoded);
+
+=head1 DESCRIPTION
+
+This module provides functions to encode and decode strings into the
+Quoted-Printable encoding specified in RFC 2045 - I<MIME (Multipurpose
+Internet Mail Extensions)>.  The Quoted-Printable encoding is intended
+to represent data that largely consists of bytes that correspond to
+printable characters in the ASCII character set.  Non-printable
+characters (as defined by english americans) are represented by a
+triplet consisting of the character "=" followed by two hexadecimal
+digits.
+
+The following functions are provided:
+
+=over 4
+
+=item encode_qp($str)
+
+This function will return an encoded version of the string given as
+argument.
+
+Note that encode_qp() does not change newlines C<"\n"> to the CRLF
+sequence even though this might be considered the right thing to do
+(RFC 2045 (Q-P Rule #4)).
+
+=item decode_qp($str);
+
+This function will return the plain text version of the string given
+as argument.
+
+=back
+
+
+If you prefer not to import these routines into your namespace you can
+call them as:
+
+  use MIME::QuotedPrint ();
+  $encoded = MIME::QuotedPrint::encode($decoded);
+  $decoded = MIME::QuotedPrint::decode($encoded);
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(encode_qp decode_qp);
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+
+sub encode_qp ($)
+{
+    my $res = shift;
+    $res =~ s/([^ \t\n!-<>-~])/sprintf("=%02X", ord($1))/eg;  # rule #2,#3
+    $res =~ s/([ \t]+)$/
+      join('', map { sprintf("=%02X", ord($_)) }
+		   split('', $1)
+      )/egm;                        # rule #3 (encode whitespace at eol)
+
+    # rule #5 (lines must be shorter than 76 chars, but we are not allowed
+    # to break =XX escapes.  This makes things complicated :-( )
+    my $brokenlines = "";
+    $brokenlines .= "$1=\n"
+	while $res =~ s/(.*?^[^\n]{73} (?:
+		 [^=\n]{2} (?! [^=\n]{0,1} $) # 75 not followed by .?\n
+		|[^=\n]    (?! [^=\n]{0,2} $) # 74 not followed by .?.?\n
+		|          (?! [^=\n]{0,3} $) # 73 not followed by .?.?.?\n
+	    ))//xsm;
+
+    "$brokenlines$res";
+}
+
+
+sub decode_qp ($)
+{
+    my $res = shift;
+    $res =~ s/[ \t]+?(\r?\n)/$1/g;  # rule #3 (trailing space must be deleted)
+    $res =~ s/=\r?\n//g;            # rule #5 (soft line breaks)
+    $res =~ s/=([\da-fA-F]{2})/pack("C", hex($1))/ge;
+    $res;
+}
+
+# Set up aliases so that these functions also can be called as
+#
+# MIME::QuotedPrint::encode();
+# MIME::QuotedPrint::decode();
+
+*encode = \&encode_qp;
+*decode = \&decode_qp;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/README
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/README	(revision 21083)
@@ -0,0 +1,38 @@
+This package contains a base64 encoder/decoder and a quoted-printable
+encoder/decoder.  These encoding methods are specified in RFC 2045 -
+MIME (Multipurpose Internet Mail Extensions).
+
+The Base64 encoding is designed to represent arbitrary sequences of
+octets in a form that need not be humanly readable. A 65-character
+subset ([A-Za-z0-9+/=]) of US-ASCII is used, enabling 6 bits to be
+represented per printable character.
+
+The quoted-printable encoding is intended to represent data that
+largely consists of bytes that correspond to printable characters in
+the ASCII character set.  Non-printable characters are represented by
+a triplet consisting of the character "=" followed by two hexadecimal
+digits.
+
+The MIME::Base64 and MIME::QuotedPrint modules used to be part of
+libwww-perl package.  They are now distributed separately (as this
+package).  The main improvement is that the base64 encoder/decoder is
+implemented by XS functions.  This makes it about 20 times faster than
+the old implementation as pure Perl.
+
+In order to install and use this package you will need Perl version
+5.002 or better.  Installation as usual:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+The library can also be installed without XS support (for instance because
+you don't have a working C compiler installed).  Simply remove the Base64.xs
+file before running 'perl Makefile.PL' and everything should work the same,
+although encoding and decoding will be much slower.
+
+Copyright 1995-1999 Gisle Aas <gisle@aas.no>
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/install.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/install.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/install.sh	(revision 21083)
@@ -0,0 +1,10 @@
+#!/bin/sh -v
+
+export PERL5LIB=$GSDLHOME/perllib/cpan/lib:$PERL5LIB
+export PATH=$GSDLHOME/perllib/cpan/bin:$PATH
+
+perl Makefile.PL PREFIX=$GSDLHOME/perllib/cpan
+
+make
+make test
+make install
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/base64.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/base64.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/base64.t	(revision 21083)
@@ -0,0 +1,362 @@
+use MIME::Base64;
+
+print "1..282\n";
+
+print "Testing MIME::Base64-", $MIME::Base64::VERSION, "\n";
+
+$testno = 1;
+
+encodeTest();
+decodeTest();
+
+# This used to generate a warning
+print "not " unless decode_base64(encode_base64("foo")) eq "foo";
+print "ok ", $testno++, "\n";
+
+sub encodeTest
+{
+    print "encode test\n";
+
+    my @encode_tests = (
+        [''    => ''],
+	['a'   => 'YQ=='],
+	['aa'  => 'YWE='],
+	['aaa' => 'YWFh'],
+
+	['aaa' => 'YWFh'],
+	['aaa' => 'YWFh'],
+	['aaa' => 'YWFh'],
+
+	["\000\377" => "AP8="],
+	["\377\000" => "/wA="],
+	["\000\000\000" => "AAAA"],
+
+	# from HTTP spec
+	['Aladdin:open sesame' => 'QWxhZGRpbjpvcGVuIHNlc2FtZQ=='],
+
+	['a' x 100 => 'YWFh' x 33 . 'YQ=='],
+
+	['Multipurpose Internet Mail Extensions: The Base64 Content-Transfer-Encoding is designed to represent sequences of octets in a form that is not humanly readable. '
+	=> "TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwgRXh0ZW5zaW9uczogVGhlIEJhc2U2NCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGlzIGRlc2lnbmVkIHRvIHJlcHJlc2VudCBzZXF1ZW5jZXMgb2Ygb2N0ZXRzIGluIGEgZm9ybSB0aGF0IGlzIG5vdCBodW1hbmx5IHJlYWRhYmxlLiA="],
+
+	# All values
+	["\000" => "AA=="],
+	["\001" => "AQ=="],
+	["\002" => "Ag=="],
+	["\003" => "Aw=="],
+	["\004" => "BA=="],
+	["\005" => "BQ=="],
+	["\006" => "Bg=="],
+	["\007" => "Bw=="],
+	["\010" => "CA=="],
+	["\011" => "CQ=="],
+	["\012" => "Cg=="],
+	["\013" => "Cw=="],
+	["\014" => "DA=="],
+	["\015" => "DQ=="],
+	["\016" => "Dg=="],
+	["\017" => "Dw=="],
+	["\020" => "EA=="],
+	["\021" => "EQ=="],
+	["\022" => "Eg=="],
+	["\023" => "Ew=="],
+	["\024" => "FA=="],
+	["\025" => "FQ=="],
+	["\026" => "Fg=="],
+	["\027" => "Fw=="],
+	["\030" => "GA=="],
+	["\031" => "GQ=="],
+	["\032" => "Gg=="],
+	["\033" => "Gw=="],
+	["\034" => "HA=="],
+	["\035" => "HQ=="],
+	["\036" => "Hg=="],
+	["\037" => "Hw=="],
+	["\040" => "IA=="],
+	["\041" => "IQ=="],
+	["\042" => "Ig=="],
+	["\043" => "Iw=="],
+	["\044" => "JA=="],
+	["\045" => "JQ=="],
+	["\046" => "Jg=="],
+	["\047" => "Jw=="],
+	["\050" => "KA=="],
+	["\051" => "KQ=="],
+	["\052" => "Kg=="],
+	["\053" => "Kw=="],
+	["\054" => "LA=="],
+	["\055" => "LQ=="],
+	["\056" => "Lg=="],
+	["\057" => "Lw=="],
+	["\060" => "MA=="],
+	["\061" => "MQ=="],
+	["\062" => "Mg=="],
+	["\063" => "Mw=="],
+	["\064" => "NA=="],
+	["\065" => "NQ=="],
+	["\066" => "Ng=="],
+	["\067" => "Nw=="],
+	["\070" => "OA=="],
+	["\071" => "OQ=="],
+	["\072" => "Og=="],
+	["\073" => "Ow=="],
+	["\074" => "PA=="],
+	["\075" => "PQ=="],
+	["\076" => "Pg=="],
+	["\077" => "Pw=="],
+	["\100" => "QA=="],
+	["\101" => "QQ=="],
+	["\102" => "Qg=="],
+	["\103" => "Qw=="],
+	["\104" => "RA=="],
+	["\105" => "RQ=="],
+	["\106" => "Rg=="],
+	["\107" => "Rw=="],
+	["\110" => "SA=="],
+	["\111" => "SQ=="],
+	["\112" => "Sg=="],
+	["\113" => "Sw=="],
+	["\114" => "TA=="],
+	["\115" => "TQ=="],
+	["\116" => "Tg=="],
+	["\117" => "Tw=="],
+	["\120" => "UA=="],
+	["\121" => "UQ=="],
+	["\122" => "Ug=="],
+	["\123" => "Uw=="],
+	["\124" => "VA=="],
+	["\125" => "VQ=="],
+	["\126" => "Vg=="],
+	["\127" => "Vw=="],
+	["\130" => "WA=="],
+	["\131" => "WQ=="],
+	["\132" => "Wg=="],
+	["\133" => "Ww=="],
+	["\134" => "XA=="],
+	["\135" => "XQ=="],
+	["\136" => "Xg=="],
+	["\137" => "Xw=="],
+	["\140" => "YA=="],
+	["\141" => "YQ=="],
+	["\142" => "Yg=="],
+	["\143" => "Yw=="],
+	["\144" => "ZA=="],
+	["\145" => "ZQ=="],
+	["\146" => "Zg=="],
+	["\147" => "Zw=="],
+	["\150" => "aA=="],
+	["\151" => "aQ=="],
+	["\152" => "ag=="],
+	["\153" => "aw=="],
+	["\154" => "bA=="],
+	["\155" => "bQ=="],
+	["\156" => "bg=="],
+	["\157" => "bw=="],
+	["\160" => "cA=="],
+	["\161" => "cQ=="],
+	["\162" => "cg=="],
+	["\163" => "cw=="],
+	["\164" => "dA=="],
+	["\165" => "dQ=="],
+	["\166" => "dg=="],
+	["\167" => "dw=="],
+	["\170" => "eA=="],
+	["\171" => "eQ=="],
+	["\172" => "eg=="],
+	["\173" => "ew=="],
+	["\174" => "fA=="],
+	["\175" => "fQ=="],
+	["\176" => "fg=="],
+	["\177" => "fw=="],
+	["\200" => "gA=="],
+	["\201" => "gQ=="],
+	["\202" => "gg=="],
+	["\203" => "gw=="],
+	["\204" => "hA=="],
+	["\205" => "hQ=="],
+	["\206" => "hg=="],
+	["\207" => "hw=="],
+	["\210" => "iA=="],
+	["\211" => "iQ=="],
+	["\212" => "ig=="],
+	["\213" => "iw=="],
+	["\214" => "jA=="],
+	["\215" => "jQ=="],
+	["\216" => "jg=="],
+	["\217" => "jw=="],
+	["\220" => "kA=="],
+	["\221" => "kQ=="],
+	["\222" => "kg=="],
+	["\223" => "kw=="],
+	["\224" => "lA=="],
+	["\225" => "lQ=="],
+	["\226" => "lg=="],
+	["\227" => "lw=="],
+	["\230" => "mA=="],
+	["\231" => "mQ=="],
+	["\232" => "mg=="],
+	["\233" => "mw=="],
+	["\234" => "nA=="],
+	["\235" => "nQ=="],
+	["\236" => "ng=="],
+	["\237" => "nw=="],
+	["\240" => "oA=="],
+	["\241" => "oQ=="],
+	["\242" => "og=="],
+	["\243" => "ow=="],
+	["\244" => "pA=="],
+	["\245" => "pQ=="],
+	["\246" => "pg=="],
+	["\247" => "pw=="],
+	["\250" => "qA=="],
+	["\251" => "qQ=="],
+	["\252" => "qg=="],
+	["\253" => "qw=="],
+	["\254" => "rA=="],
+	["\255" => "rQ=="],
+	["\256" => "rg=="],
+	["\257" => "rw=="],
+	["\260" => "sA=="],
+	["\261" => "sQ=="],
+	["\262" => "sg=="],
+	["\263" => "sw=="],
+	["\264" => "tA=="],
+	["\265" => "tQ=="],
+	["\266" => "tg=="],
+	["\267" => "tw=="],
+	["\270" => "uA=="],
+	["\271" => "uQ=="],
+	["\272" => "ug=="],
+	["\273" => "uw=="],
+	["\274" => "vA=="],
+	["\275" => "vQ=="],
+	["\276" => "vg=="],
+	["\277" => "vw=="],
+	["\300" => "wA=="],
+	["\301" => "wQ=="],
+	["\302" => "wg=="],
+	["\303" => "ww=="],
+	["\304" => "xA=="],
+	["\305" => "xQ=="],
+	["\306" => "xg=="],
+	["\307" => "xw=="],
+	["\310" => "yA=="],
+	["\311" => "yQ=="],
+	["\312" => "yg=="],
+	["\313" => "yw=="],
+	["\314" => "zA=="],
+	["\315" => "zQ=="],
+	["\316" => "zg=="],
+	["\317" => "zw=="],
+	["\320" => "0A=="],
+	["\321" => "0Q=="],
+	["\322" => "0g=="],
+	["\323" => "0w=="],
+	["\324" => "1A=="],
+	["\325" => "1Q=="],
+	["\326" => "1g=="],
+	["\327" => "1w=="],
+	["\330" => "2A=="],
+	["\331" => "2Q=="],
+	["\332" => "2g=="],
+	["\333" => "2w=="],
+	["\334" => "3A=="],
+	["\335" => "3Q=="],
+	["\336" => "3g=="],
+	["\337" => "3w=="],
+	["\340" => "4A=="],
+	["\341" => "4Q=="],
+	["\342" => "4g=="],
+	["\343" => "4w=="],
+	["\344" => "5A=="],
+	["\345" => "5Q=="],
+	["\346" => "5g=="],
+	["\347" => "5w=="],
+	["\350" => "6A=="],
+	["\351" => "6Q=="],
+	["\352" => "6g=="],
+	["\353" => "6w=="],
+	["\354" => "7A=="],
+	["\355" => "7Q=="],
+	["\356" => "7g=="],
+	["\357" => "7w=="],
+	["\360" => "8A=="],
+	["\361" => "8Q=="],
+	["\362" => "8g=="],
+	["\363" => "8w=="],
+	["\364" => "9A=="],
+	["\365" => "9Q=="],
+	["\366" => "9g=="],
+	["\367" => "9w=="],
+	["\370" => "+A=="],
+	["\371" => "+Q=="],
+	["\372" => "+g=="],
+	["\373" => "+w=="],
+	["\374" => "/A=="],
+	["\375" => "/Q=="],
+	["\376" => "/g=="],
+	["\377" => "/w=="],
+    );
+
+    for $test (@encode_tests) {
+	my($plain, $expected) = ($$test[0], $$test[1]);
+
+	my $encoded = encode_base64($plain, '');
+	if ($encoded ne $expected) {
+	    print "test $testno ($plain): expected $expected, got $encoded\n";
+            print "not ";
+	}
+	my $decoded = decode_base64($encoded);
+	if ($decoded ne $plain) {
+	    print "test $testno ($plain): expected $expected, got $encoded\n";
+            print "not ";
+	}
+
+	# Try the old C versions too
+	if ($encoded ne MIME::Base64::old_encode_base64($plain, '')) {
+	    print "old_encode_base64 give different result.\n";
+	    print "not ";
+        }
+	if ($plain ne MIME::Base64::old_decode_base64($encoded)) {
+	    print "old_decode_base64 give different result.\n";
+	    print "not ";
+        }
+		
+	print "ok $testno\n";
+	$testno++;
+    }
+}
+
+sub decodeTest
+{
+    print "decode test:\n";
+    local $SIG{__WARN__} = sub { print $_[0] };  # avoid warnings on stderr
+
+    my @decode_tests = (
+	['YWE='   => 'aa'],
+	[' YWE='  => 'aa'],
+	['Y WE='  => 'aa'],
+	['YWE= '  => 'aa'],
+	["Y\nW\r\nE=" => 'aa'],
+
+	# These will generate some warnings
+        ['YWE=====' => 'aa'],    # extra padding
+	['YWE'      => 'aa'],    # missing padding
+        ['YWFh====' => 'aaa'],
+        ['YQ'       => 'a'],
+        ['Y'        => ''],
+        [''         => ''],
+        [undef()    => ''],
+    );
+
+    for $test (@decode_tests) {
+	my($encoded, $expected) = ($$test[0], $$test[1]);
+
+	my $decoded = decode_base64($encoded);
+	if ($decoded ne $expected) {
+	    die "test $testno ($encoded): expected $expected, got $decoded\n";
+	}
+	print "ok $testno\n";
+	$testno++;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/quoted-print.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/quoted-print.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/MIME-Base64-2.11/t/quoted-print.t	(revision 21083)
@@ -0,0 +1,106 @@
+#!/local/bin/perl -w
+
+use MIME::QuotedPrint;
+
+$x70 = "x" x 70;
+
+@tests =
+  (
+   # plain ascii should not be encoded
+   ["quoted printable"  =>
+    "quoted printable"],
+
+   # 8-bit chars should be encoded
+   ["våre kjære norske tegn bør æres" =>
+    "v=E5re kj=E6re norske tegn b=F8r =E6res"],
+
+   # trailing space should be encoded
+   ["  " => "=20=20"],
+   ["\tt\t" => "\tt=09"],
+   ["test  \ntest\n\t \t \n" => "test=20=20\ntest\n=09=20=09=20\n"],
+
+   # "=" is special an should be decoded
+   ["=\n" => "=3D\n"],
+   ["\0\xff" => "=00=FF"],
+
+   # Very long lines should be broken (not more than 76 chars
+   ["The Quoted-Printable encoding is intended to represent data that largly consists of octets that correspond to printable characters in the ASCII character set." =>
+    "The Quoted-Printable encoding is intended to represent data that largly con=
+sists of octets that correspond to printable characters in the ASCII charac=
+ter set."
+    ],
+
+   # Long lines after short lines were broken through 2.01.
+   ["short line
+In America, any boy may become president and I suppose that's just one of the risks he takes. -- Adlai Stevenson" =>
+    "short line
+In America, any boy may become president and I suppose that's just one of t=
+he risks he takes. -- Adlai Stevenson"],
+
+   # My (roderick@argon.org) first crack at fixing that bug failed for
+   # multiple long lines.
+   ["College football is a game which would be much more interesting if the faculty played instead of the students, and even more interesting if the
+trustees played.  There would be a great increase in broken arms, legs, and necks, and simultaneously an appreciable diminution in the loss to humanity. -- H. L. Mencken" =>
+    "College football is a game which would be much more interesting if the facu=
+lty played instead of the students, and even more interesting if the
+trustees played.  There would be a great increase in broken arms, legs, and=
+ necks, and simultaneously an appreciable diminution in the loss to humanit=
+y. -- H. L. Mencken"],
+
+   # Don't break a line that's near but not over 76 chars.
+   ["$x70!23"		=> "$x70!23"],
+   ["$x70!234"		=> "$x70!234"],
+   ["$x70!2345"		=> "$x70!2345"],
+   ["$x70!23456"	=> "$x70!23456"],
+   ["$x70!23\n"		=> "$x70!23\n"],
+   ["$x70!234\n"	=> "$x70!234\n"],
+   ["$x70!2345\n"	=> "$x70!2345\n"],
+   ["$x70!23456\n"	=> "$x70!23456\n"],
+
+   # Not allowed to break =XX escapes using soft line break
+   ["$x70===xxxx" => "$x70=3D=\n=3D=3Dxxxx"],
+   ["$x70!===xxx" => "$x70!=3D=\n=3D=3Dxxx"],
+   ["$x70!!===xx" => "$x70!!=3D=\n=3D=3Dxx"],
+   ["$x70!!!===x" => "$x70!!!=\n=3D=3D=3Dx"],
+   #                            ^
+   #                    70123456|
+   #                           max
+   #                        line width
+);
+
+$notests = @tests + 2;
+print "1..$notests\n";
+
+$testno = 0;
+for (@tests) {
+    $testno++;
+    ($plain, $encoded) = @$_;
+    $x = encode_qp($plain);
+    if ($x ne $encoded) {
+	print "Encode test failed\n";
+	print "Got:      '$x'\n";
+	print "Expected: '$encoded'\n";
+	print "not ok $testno\n";
+	next;
+    }
+    $x = decode_qp($encoded);
+    if ($x ne $plain) {
+	print "Decode test failed\n";
+	print "Got:      '$x'\n";
+	print "Expected: '$plain'\n";
+	print "not ok $testno\n";
+	next;
+    }
+    print "ok $testno\n";
+}
+
+# Some extra testing for a case that was wrong until libwww-perl-5.09
+print "not " unless decode_qp("foo  \n\nfoo =\n\nfoo=20\n\n") eq
+                                "foo\n\nfoo \nfoo \n\n";
+$testno++; print "ok $testno\n";
+
+# Same test but with "\r\n" terminated lines
+print "not " unless decode_qp("foo  \r\n\r\nfoo =\r\n\r\nfoo=20\r\n\r\n") eq
+                                "foo\r\n\r\nfoo \r\nfoo \r\n\r\n";
+$testno++; print "ok $testno\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/ChangeLog
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/ChangeLog	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/ChangeLog	(revision 21083)
@@ -0,0 +1,1535 @@
+Tue Aug  4 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.36
+
+ o  The lwp-download script will call $ua->env_proxy now.
+
+ o  The lwp-request script allows content types (specified with the -c
+    option) with optional parameters like: multipart/mixed; boundary="--".
+
+ o  LWP::UserAgent will lowercase all authentication parameter names
+    before passing it to the authentication module.  Previous releases
+    ignored parameters like; Realm="Foo" (bacause Realm contained
+    upper case letters).
+
+ o  LWP::Protocol::ftp test for If-Modified-Since was wrong.
+
+ o  How the $url->abs method works can now be configured with the global
+    variables $URI::URL::ABS_ALLOW_RELATIVE_SCHEME and
+    $URI::URL::ABS_REMOTE_LEADING_DOTS.
+
+ o  The anonymous password guesser for ftp URLs will now call the external
+    `whoami` program any more.  Patch by Charles C. Fu <ccwf@bacchus.com>.
+
+ o  LWP::Protocol::http now allow dynamic requests without any
+    Content-Length specified when Content-Type is multipart/*
+
+ o  HTTP::Request::Common can now upload infinite files.
+    (Controlled by the $DYNAMIC_FILE_UPLOAD configuration variable.)
+
+
+
+Fri Jul 10 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.35
+
+ o  More lwp-rget patches from David D. Kilzer <ddkilzer@madison.dseg.ti.com>.
+    Adds the following new options: --iis, --keepext, --tolower
+
+ o  LWP::MediaTypes patches from MacEachern <dougm@pobox.com>.  Adds new
+    functions: add_type(), add_encoding(), read_media_types()
+
+
+
+Tue Jul  7 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.34
+
+ o  LWP::Protocol::ftp now try to use the MDTM command to support
+    the Last-Modified response header as well as
+    If-Modified-Since in requests.  Original and final patch by
+    Charles C. Fu <ccwf@bacchus.com>
+
+ o  $url->path_components will not escape "." any more.
+
+ o  WWW::RobotRules will now work for Mac text files too (lines delimited
+    by CR only).  Patch by Olly Betts <olly@muscat.co.uk>
+
+ o  lwp-rget support <area ..> links too.
+
+
+
+Thu May  7 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.33
+
+ o  LWP::Simple::get() did try to handle too many of the 3xx
+    codes as redirect when it bypasses full LWP.
+
+ o  LWP::UserAgent->mirror will now use utime(2) to set the
+    file modification time corresponding to the Last-Modified
+    header.
+
+ o  LWP::Protocol::http will not modify the HTTP::Request that
+    it is processing.  This avoids sticky Host header for
+    redirects.
+
+ o  URI::Heuristic and lwp-download documentation update.
+
+
+
+Wed Apr 15 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.32
+
+ o  Much improved HTTP::Daemon class. We now support persistent
+    connections.  Changes include:
+       - $c->get_request can be told to return after reading and
+         parsing headers only.
+       - $c->reason (new method)
+       - $c->read_buffer (new method)
+       - $c->proto_ge (new method)
+       - $c->force_last_request (new method)
+       - $c->send_response now support CODE reference content
+         and will use chunked transfer encoding for HTTP/1.1 clients.
+       - expanded the documentation.
+
+
+
+Fri Apr 10 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.31
+
+ o  Makefile.PL now checks that HTML::HeadParser is present.
+
+ o  Updated HTTP::Cookies according to draft-ietf-http-state-man-mec-08.txt
+    It now supports the .local domain and value less 'port' attribute in
+    the Set-Cookie2 header.
+
+ o  HTTP::Headers update:
+       - $h->content_type now always return a defined value
+       - $h->header($field) will now concatenate multi-valued header
+         fields with "," as separator in scalar context.
+
+ o  HTTP::Request::Common update:
+       - used to destroy the content of the  hash/array arguments
+         passed to its constructor functions.
+       - allow a hash reference to specify form-data content.
+       - you can override Content-Disposition for form-data now.
+       - set content-encoding for files if applicable
+       - default boundary string is now always "--000"
+
+ o  LWP::UserAgent will not follow more than 13 redirects
+    automatically.
+
+
+
+Wed Apr  1 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.30
+
+ o  Unbundled the following modules:
+
+       * HTML-Parser  (HTML::Parser, HTML::Entites, HTML::LinkExtor,...)
+       * HTML-Tree    (HTML::Element, HTML::TreeBuilder,...)
+       * Font-AFM     (Font::AFM, Font::Metrics::*)
+       * File-CounterFile
+
+ o  Simplified internal structure of HTML::Headers.  Hopefully,
+    nobody will notice.
+
+ o  New modules HTTP::Headers::Auth,  HTTP::Headers::ETag that adds
+    additional convenience methods to the HTTP::Headers class.
+
+ o  Removed split_etag_list() from HTTP::Headers::Util, in the hope
+    that nobody had starting using it.
+
+
+
+Tue Mar 24 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.22
+
+ o  HTTP::Cookies made more compatible with Netscape cookies.  Allow
+    the domain to match host, allow dots in the part of the hostname
+    not covered by domain.  Don't quote the cookie value even when it
+    contains non-token chars.  Based on patch from Kartik Subbarao
+    <subbarao@computer.org>.
+
+ o  Updated HTTP::Status to reflect <draft-ietf-http-v11-spec-rev-03>.
+    RC_MOVED_TEMPORARILY renamed to RC_FOUND.  Added codes
+    RC_TEMPORARY_REDIRECT (307) and RC_EXPECTATION_FAILED (417).
+    Slightly more documentation too.
+
+ o  The split_header_words() function HTTP::Headers::Util could go
+    into infinite loop on some header values.  Implemented split_etag_list()
+    too.  Added more documentation and test script for this module.
+
+ o  LWP::Simple now switch to full LWP implementation even for systems
+    that force all environment keys to be upper case.  Modification
+    suggested by Dale Couch <dcouch@training.orl.lmco.com>.
+
+ o  LWP::UserAgent allows redirects to a relative URL with scheme to be
+    made.  Suggested by Chris W. Unger <cunger@cas.org>.
+
+ o  Applied dtd2pm.pl patches from <peterm@zeta.org.au>.  It can now
+    extract information from the HTML40.dtd
+
+
+
+Thu Mar 12 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.21
+
+ o  lwp-rget patches from David D. Kilzer <ddkilzer@madison.dseg.ti.com>
+    (modified by Gisle).  Support the --hier  and the --auth options
+    and <frame>s.
+
+ o  File::CounterFile protect against bad $/ and $\ as suggested
+    by Frank Hoehne.
+ 
+ o  File::Listing used "next" when return was more appropriate.
+    Patch by erik@mediator.uni-c.dk.
+
+ o  HTML::Element support for multiple boolean attributes for a single
+    element.  Patch by Philip Guenther.
+
+ o  Can set $HTTP::Headers::TRANSLATE_UNDERSCORE to FALSE value to
+    suppress tr/_/-/ of header keys.
+
+ o  LWP::Protocol::http will not initialize the Host header if it is
+    already set. Patch by Ed Jordan.
+
+ o  LWP::Protocol::http did not handle responses with no header lines
+    correctly.  Patch by Daniel Buenzli <buenzli@rzu.unizh.ch>
+
+ o  $url->rel() handles path segments without leading "/" better.
+
+
+
+Fri Feb 13 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.20
+
+ o  Fixed the "500 Offset outside string" bug that affected perl
+    5.004_03 and older version of Perl.
+
+ o  Fixed a documentation typo spotted by Michael Quaranta
+    <quaranta@vnet.IBM.COM>
+
+ o  HTTP::Date: Protect against croaking from timegm/timelocal.
+
+
+
+Mon Jan 26 1998   Gisle Aas <aas@sn.no>
+
+ o  Release 5.19
+
+ o  HTML::Parser does not call $self->text() callback for empty text
+    any more.
+
+ o  LWP::Protocol::https was noisy when connections failed and the
+    script was running with '-w' (noise inherited from IO::Socket::INET)
+
+ o  $ua->use_alarm(BOOL) now gives a warning if running with -w
+
+
+
+Tue Jan 20 1998   Gisle Aas <aas@sn.no>
+
+ o  Developer release 5.18_05
+
+ o  HTTPS support based on my Crypt-SSLeay module.  The Net-SSLeay module
+    is not supported any more.
+
+ o  lwp-request documentation typo spotted Martijn Koster.
+
+ o  Removed superfluous \\ in the URI::Escape regex. This was also
+    spotted by Martijn.
+
+ o  File::Listing now handles timezones correctly.
+
+ o  Added $VERSION to modules that was missing it.
+
+ o  Added 'use strict' to several modules that was missing it.
+
+ o  LWP::Protocol::http now adds the Client-Peer header to responses and
+    has hooks for more callbacks.
+
+ o  LWP::Protocol::https adds Client-SSL-Cipher, Client-SSL-Cert-Subject
+    and Client-SSL-Cert-Issuer headers to the response.  The requests can
+    also be made conditional based on the peer certificate using the
+    If-SSL-Cert-Subject header in requests.
+
+ o  HTML::Parse is back.  (It was even used in lwpcook.pod)
+
+
+
+Wed Dec 17 1997   Gisle Aas <aas@sn.no>
+
+ o  Developer release 5.18_04
+
+ o  Makefile.PL fix based on report from Pon Hwa Lin <koala@fragment.com>
+
+ o  lwp-request will now print the response code message with -s and -S
+    options.
+
+ o  Hide IO::Socket::INET noise when running under -w
+
+ o  Don't set 'Content-Length: 0' in HTTP requests.
+
+ o  LWP::Protocol::http now calls LWP::Debug::conns again
+
+
+
+Tue Dec 16 1997   Gisle Aas <aas@sn.no>
+
+ o  Developer release 5.18_03
+
+ o  Got rid of alarms() and replaced LWP::Socket with IO::Socket::INET.
+    New protocol implementations for http, https, gopher, nntp.
+    $ua->use_alarm() is now a noop.
+
+ o  LWP::Protocol::ftp patch from  Tony Finch <fanf@demon.net>.
+
+ o  Removed depreciated modules from the distibution; HTML::Parse,
+    LWP::Socket, LWP::SecureSocket, LWP::IO, LWP::TkIO.
+
+
+
+Fri Dec 12 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.18
+
+ o  HTTP authorization patches from Tony Finch <fanf@demon.net>.
+    Allows "user:pass@" in HTTP URLs.
+
+ o  HTML::Parser patch by Brian McCauley <B.A.McCauley@bham.ac.uk>.
+    Pass original text to end() method.
+
+ o  The HTML::Parser->netscape_buggy_comment method is depreciated.
+    Use HTML::Parser->strict_comment instead.  The default value
+    has changed with the name.
+
+ o  Some HTML::Parser optimization tweaks.
+
+ o  New module named HTML::Filter
+
+ o  Updated HTTP::Headers to the latest HTTP spec.  Added knowledge
+    about the "Trailer", "Expect", "TE", "Accept-Range" headers.
+    "Public" header is gone.
+
+ o  Added some more header convenience methods: if_unmodified_since,
+    content_language, and proxy_authorization methods.
+
+ o  HTTP::{Request,Response}->clone can handle subclasses now.
+
+ o  HTTP::Request->url() can now undefine the URL.
+
+ o  HTTP::{Request,Response}->as_string format looks more like
+    the HTTP protocol formatting now.  Dashed lines above and
+    below is gone.
+
+ o  Documented HTTP::Response->status_line method
+
+ o  Compressed HTML::Response->error_as_HTML output
+
+ o  HTTP::Status updated to latest HTTP spec.  Added 
+    RC_REQUEST_RANGE_NOT_SATISFIABLE (416)
+
+
+
+Tue Dec  2 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.17
+
+ o  All authentication handling moved out of LWP::UserAgent and into
+    LWP::Authen::Basic and LWP::Authen::Digest.  We now also support
+    PROXY_AUTHENTICATION_REQUIRED responses.
+
+ o  HTML::Formatter will always add a blank line for <br>.
+
+ o  Avoid use of uninitialized value in HTTP::Daemon.
+
+ o  HTTP::Date allows seconds when recognizing 'ls -l' dates.  This
+    allows us to parse syslog time stamps.
+
+ o  HTTP::Request::Common::POST allows a hash reference as second
+    argument (in addition to an array reference).
+
+ o  LWP::Simple will initialize the $ua if it is exported.
+
+ o  Various documentation updates.
+
+
+
+Fri Nov 21 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.16
+
+ o  LWP::Simple::head() would die in array context because str2time
+    was not imported any more.
+
+ o  HTTP::Daemon->accept now takes an optional package argument like
+    IO::Socket->accept does.
+
+ o  Made HTTP::Request and HTTP::Response subclassable.
+
+ o  Added Proxy-Authorization example to lwpcook.
+
+
+
+Thu Nov  6 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.15
+
+ o  New module URI::Heuristic
+
+ o  The lwp-request script now use URI::Heuristic for it's URL arguments.
+    It means that 'lwp-request perl' will not get a file called "./perl"
+    but will fetch the page "http://www.perl.com" or something similar.
+    If you want to get the file you have to prefix it with "./".  Full
+    URLs are never affected by this.
+
+ o  LWP::Simple::get() will bypass LWP for simple HTTP requests.  This
+    should make it somewhat faster.
+
+ o  LWP::RobotUA has a new method called $ua->use_sleep() that
+    controls how niceness towards the servers are enforced.
+    Previously $ua->use_alarm() used to control this, but this did
+    not work well on Win32 systems.
+
+ o  URI::URL::rel() will handle URLs to a fragment within the same
+    document better. Initial patch from Nicolai Langfeldt
+    <janl@math.uio.no>.
+
+ o  HTML::Element don't consider </th>, </tr> and </td> optional any
+    more.  I wonder how Netscape managed to not implement this
+    correctly all this time.
+
+ o  Added lots of modern tags to HTML::AsSubs.
+
+ o  HTTP::Request::Common will read uploaded files in binmode().
+    This should be better for Win32 systems.  Contributed by
+    <Steve_Kilbane@cegelecproj.co.uk>.
+
+
+
+Sun Oct 12 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.14
+
+ o  HTML::Formatter patches from Andreas Gustafsson <gson@araneus.fi>.
+    The formatters handling of whitespace is much better now.  Thanks!
+
+ o  HTML::FormatText: can specify margins in the constructor.
+
+ o  URI::URL: the base will be absolutized internally now.
+
+ o  URI::URL will take advantage of void context provided by perl5.004.
+    This means that using $u->path and $u->query should be safer now.
+
+ o  URI::URL->print_on defaults to STDERR now (used to be STDOUT).
+
+ o  URI::URL: removed version 3 compatibility stuff ($COMPAT_VER_3).
+
+ o  $ua->mirror should work better on dosish systems (can not
+    rename when target file exists).
+
+ o  Typo in lwp-download prevented it from compiling.
+
+ o  Some minor documentations typos corrected.
+
+
+
+Sat Sep 20 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.13
+
+ o  Brand new module called HTTP::Cookies.  It stores cookies
+    (Set-Cookie and Set-Cookie2 headers) from responses and can
+    create appropriate Cookie headers for requests.  It can also
+    share cookie files with Netscape.
+
+ o  LWP::UserAgent now support the cookie_jar() attribute.  When
+    set to an HTTP::Cookies object, it will automatically manage
+    the cookies sent to the servers.  Off by default.
+
+ o  New header utility functions in HTTP::Headers::Util.
+
+ o  Win32 and OS/2 patches for the lwp-xxx utilities.  Turn on
+    binary mode by default (option to turn it off), avoid modifying $0,
+    and don't be confused about suffixes in the script names.
+    Contributed by Ben Coleman <bcoleman@mindspring.com>
+
+ o  OpenVMS patch for Font:AFM by Brad Hughes <brad@tmc.naecker.com>
+
+
+
+Fri Sep  5 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.12
+
+ o  decode_entities() would sometimes introduce ";" after
+    things that looked like they were entities.
+
+ o  HTML::LinkExtor knows about <applet code="...">
+
+ o  Patch from Gary Shea <shea@gtsdesign.com> that makes the
+    tests work even if perl is not called "perl"
+
+ o  HTTP::Date handles 12:00PM correctly now. Patch from
+    William York <william@mathworks.com>
+
+ o  HTTP::Request::Common don't quote the boundary string for
+    multipart/form-data messages any more.
+
+ o  Font::AFM works for encodings where .notdef is defined to
+    have some size.  Documentation and efficiency update.
+
+
+
+Wed Aug  6 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.11
+
+ o  Perl version 5.004 is now required for libwww-perl.
+
+ o  Win32 patches from Gurusamy Sarathy <gsar@engin.umich.edu>.
+    Now passes all tests on that platform.
+
+ o  HTTPS support contributed by Josh Kronengold <mneme@mcny.com>
+
+ o  Support hex entities &#xFF;  HTML::Entities::(en|de)code only
+    modify their argument in void context.
+
+ o  Fixed formatter bug with <font> tags which did not specify size.
+
+ o  Better HTML::HeadParser documentation
+
+ o  Fixed HTML::LinkExtor documentation typo spotted by Martijn.
+
+ o  HTTP::Request::Common now use CRLF for multipart/form-data
+
+
+
+Fri Jun 20 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.10
+
+ o  Make '+' a reserved URL character.  Decode unescaped '+' as
+    space in $url->query_form().
+
+ o  Use $Config{d_alarm} to determine default for $ua->use_alarm()
+
+
+
+Tue Jun 10 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.09
+
+ o  Removed the MIME modules from the distribution.  They are distributed
+    separately now.
+
+ o  Added a new module called HTTP::Request::Common
+
+ o  Improved HTTP::Status documentation.  It is now also possible
+    to import the is_client_error/is_server_error functions.
+
+ o  LWP::MediaTypes::guess_media_type() can now take an optional
+    HTTP::Header parameter.
+
+ o  LWP::Protocol ensures that scheme is legal as module name.
+
+ o  LWP::Protocol::http is not as strict when trying to verify the
+    method name.  It now also accepts responses without a message
+    on the status line.
+
+ o  WWW::RobotRules::AnyDBM_File: Some DBMs fail to allow multiple
+    opens of the same file.  Patch from Mark James <jamesm@skate.org>
+
+ o  Created Bundle::LWP
+
+
+
+Sat Apr  5 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.08
+
+ o  Made libwww-perl warning compatible with upcoming perl5.004beta2
+    (aka 5.003_98)
+
+ o  encode_base64() did not work properly if pos() of the string to
+    encode was different from 0.
+
+ o  HTML::Parser was confused about "</" when it did not start an end tag.
+
+ o  HTML::FormatPS will provide ISOLatin1Encoding in its output.
+
+ o  Calling HTML::LinkExtor->links will clear out old links.
+
+ o  url()->rel($base) would ignore the $base argument.
+
+ o  Don't croak() when setting url()->path().
+
+
+
+Tue Feb 11 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.07
+
+ o  Can limit the size of the response content with $ua->max_size()
+
+ o  Added time2iso() functions to HTTP::Date.
+
+ o  Made LWP::Protocol::http more portable to the MacPerl. /./ match
+    different things on MacPerl.
+
+
+
+Mon Jan 27 1997   Gisle Aas <aas@sn.no>
+
+ o  Release 5.06
+
+ o  URI::URL is now compatible with perl5.004 overloading.
+
+ o  HTML::HeadParser makes X-Meta-Name headers for <meta> elements
+    that does not specify an 'http-equiv' attribute.
+
+ o  URI::URL::ftp does not die if Net::Domain is not installed and
+    you ask for an anonymous username or password.
+
+ o  WWW::RobotRules:  The robots.txt parser did not ignore comment lines
+    as it should.
+
+ o  LWP::Protocol::http is more forgiving towards servers that return
+    bad responses.
+
+ o  Allow "?" before search string in gopher URLs.
+
+ o  LWP::Protocol::file did not escape funny filenames when generating
+    HTML directory listings.
+
+ o  LWP::Protocol::ftp now gets the Content-Encoding correct. 'CODE'
+    content in PUT requests also work now.
+
+ o  Relative locations in redirects did not work with URI::URL::strict.
+
+ o  OS/2 portability patches from Ilya Zakharevich
+
+ o  LWP::Authen::* patch from Doug MacEachern
+
+ o  Support experimental data:- URLs
+
+ o  Some tests (those using HTTP::Daemon) now die more gracefully if
+    IO::* modules is not installed.
+
+
+
+Wed Dec  4 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.05
+
+ o  LWP::UserAgent::simple_request: local($SIG{__DIE__}) protects us
+    against user defined die handlers.
+ 	
+ o  Use Net::Domain (instead of Sys::Hostname) to determine FQDN.  It
+    is used by URI::URL when it determines anonymous ftp login address.
+	
+ o  lwp-download: New program in the bin directory
+
+ o  HTML::Parser: Allow '_' in attribute names.  This makes it possible
+    to parse Netscape's bookmarks.html file.
+
+ o  HTTP::Daemon: Fixed chunked transfer encoding and multipart content
+    in get_request().  Support HTTP/0.9 clients.
+
+ o  Don't clobber regex variables when HTTP::Message delegates methods
+    to the header.
+
+ o  Base64::decode_base64 now checks that the length input string to
+    decode is a multiple of 4.
+
+ o  t/robot/rules-dbm.t clean up better and will use AnyDBM for dumping
+
+ o  File::CounterFile: $/ strikes again by Andreas König
+
+ o  File::Listing updates from William York <william@mathworks.com>. We
+    can now parse the MS-Windows ftp server listings.
+
+ o  HTTP::Date now supports the MS-Windows 'dir' date format.  Patch by
+    William York.
+
+ o  LWP::MediaTypes::media_suffix will return first type in scalar context.
+
+
+
+Tue Oct 22 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.04
+
+ o  Added HTTP::Daemon.  This is a HTTP/1.1 server class.  This means
+    that libwww-perl no longer is a client library only.  The HTTP::Daemon
+    is also used in the new test suite.
+
+ o  HTTP::Message support the protocol() method.  Used by HTTP::Daemon.
+
+ o  HTTP::Response can be constructed with a header and content as
+    argument.
+
+ o  Typo corrections in the documentation.
+
+ o  File::Listing::parse_dir accepts "GMT" as timezone now.
+
+ o  HTML::Parser will call the start() method with two new parameters;
+    $attrseq, $origtext.
+
+ o  Integrated HTML::FormatPS patches from
+    Jim Stern <jstern@world.northgrum.com>
+
+ o  Class modules don't inherit from AutoLoader any more.  They just
+    import the AUTOLOAD method.
+
+ o  LWP::Protocol will untaints scheme before loading protocol module.
+
+ o  Digest does not send "opaque" if it was not present in the request.
+    The "Extension" header is not returned any more.
+
+ o  New method: $url->crack that will return a list of the various
+    elements in a URI::URL.
+
+ o  WWW::RobotRules did not use the agent() method when determining
+    who we are.  This affected WWW::RobotRules::AnyDBM_File parsing
+    for robots.txt.  Visit count did not increment for
+    WWW::RobotRules::InCore.
+
+
+
+Tue Oct  1 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.03
+
+ o  Hakan Ardo's persistent robot rules is now part of the standard
+    distribution.  This is still experimental and might change in the
+    future.  It includes the new WWW::RobotRules::AnyDBM_File class
+    and updates to LWP::RobotUA.
+
+ o  HTML::Parser now supports buggy Netscape comment parsing.  Enable
+    it by calling $p->netscape_buggy_comment(1).  The previous version
+    of the parser could also (under very unlucky and unlikely
+    circumstances) call the $self->comment() method several times for
+    the same comment text.
+
+ o  HTML::Parser: Use new $p->eof to signal end of document instead of
+    $p->parse(undef).
+
+ o  HTML::Element::starttag() is now smarter about which quotes it
+    use around attribute values.
+
+ o  New HTTP::Response methods: current_age(), freshness_lifetime(),
+    is_fresh(), fresh_until().
+
+ o  HTTP::Message:  New method ($mess->content_ref) which will return
+    a reference to the current content.
+
+ o  URI::URL:  New method ($url->rel) which does the opposite of abs().
+    Example: url("http://host/a/b/c", "http://host/c/d/e")->rel would
+    return url("../../a/b/c", "http://host/c/d/e").  This was
+    suggested by Nicolai Langfeldt <janl@ifi.uio.no>
+
+ o  URI::URL:  $url->query_form can now take array references as value
+    specification.  For instance: $url->query_form(foo => ['bar', 'baz']
+
+ o  Avoid '"my" variable $var masks earlier declaration in same scope'
+    warnings in perl5.003_05.
+
+
+
+Wed Sep 11 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.02
+
+ o  lwp-rget:  Initialize proxy settings from envirionment
+
+ o  HTML::Entities::encode_entities: Don't encode $ and %
+
+ o  HTML::LinkExtor::links: Now works when no links were found.
+
+ o  HTTP::Headers::as_string: Allow \n in header value
+
+
+
+Tue Aug  1 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.01.
+
+ o  Updated ftp protocol module to be compatible with Net::FTP 
+    version 2.00 (the version found in libnet-1.00)
+
+ o  New HTML parser module called HTML::LinkExtor
+
+ o  Various documentation typo corrections.  Most of these contributed
+    by Bob Dalgleish.
+
+ o  HTML::HeadParser updates 'Content-Base' instead of 'Base'.  It also
+    updates the 'Link' header based on <link ...>
+
+ o  HTTP::Headers and HTTP::Status updated according to
+    draft-ietf-http-v11-spec-06
+
+ o  HTTP::Headers can now use "_" as alternative to "-" in field names.
+
+ o  HTTP::Response::base now looks for 'Content-Base',
+    'Content-Location' and 'Base' headers.
+
+ o  Avoid warning in LWP::MediaTypes if $ENV{HOME} is not defined.
+
+ o  The new $ua->parse_head() method can be used to turn off
+    automatic initialization of response headers from the <HEAD>
+    section of HTML documents.
+
+ o  Added eq() method for URI::URL objects
+
+ o  The HTML::Formatter recovers even if a handle method is not defined
+    for all tags found during traversal
+
+
+
+Sun May 26 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5.00.
+
+ o  LWP::Simple::head() now return something useful in scalar context.
+
+ o  Rewritten the HTML::Parse stuff.  Introduced the HTML::Parser class
+    that will tokenize a HTML document.  The rest of the old
+    HTML::Parse functionality has moved to HTML::TreeBuilder class.
+    Note, that the HTML stuff is still alpha.
+
+ o  Implemented HTML::HeadParser.  This is a lightweight parser for
+    the <HEAD> section of a HTML document.
+
+ o  HTML::Element had problem with presenting things like <foo
+    bar="bar">.
+
+ o  HTML::Entities: Included additional ISO-8859/1 entities listed in
+    RFC1866.
+
+ o  HTML::AsSubs exported 'header' instead of 'head'
+
+ o  We know about a few more of the HTML 3.2 element.
+
+ o  HTTP::Date had problems with years before 1970, because Time::Local
+    went into an infinite loop.  Check for this.
+
+ o  Added $header->title method.
+
+ o  Made $header->authorization_basic return "uname:passwd" in scalar
+    context
+
+ o  LWP::Protocol::collect() will let the HTML::HeadParser look at the
+    document content as it arrives.  This will initialize headers from
+    elements like <base href="...">, <title>...</title> and <meta
+    http-equiv="..." ...>.
+
+ o  Simplified $response->base implementation, because we don't have
+    to look into the content any more.
+
+ o  Added -quiet option to lwp-rget
+
+ o  Typo fixes and some documentation additions.
+
+
+
+Thu May  9 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b13
+
+ o  Made URI::URL::strict(0) the default.  I got tired of all this
+    eval { } stuff just to recover.  The URI::URL::strict'ness also
+    determine if calling some standard method that happens to be
+    illegal for some protocol scheme will croak or just be ignored.
+
+ o  Ensure correct $INPUT_RECORD_SEPARATOR and $OUTPUT_RECORD_SEPARATOR
+    at places where we <> or print.
+
+ o  Always localize $_ before any 'while(<FILE>) {}'-loops
+
+ o  Implemented $protocol->collect_once() and simplified several
+    of the protocol implementations by using it.
+
+ o  The HTML parser used to get it wrong if you were unlucky about the
+    breakup of the text. An example of broken behaviour was this:
+
+        $html = parse_html "<!-- A comment -";
+        $html = parse_html "-> and some text.";
+
+ o  The HTML parser does not ignore whitespace-only text any more.
+
+ o  HTML::Parse warnings are now optional and turned off by default.
+
+ o  New start for $html->as_HTML().
+
+ o  Fixed some typos
+
+
+
+Wed Apr 24 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b12
+
+ o  New utility program called 'lwp-rget'.
+
+ o  $response->base was broken for HTML documents
+
+ o  New fancy LWP::Debug import() method.  Can now turn on debugging with
+    "use LWP::Debug '+';"
+
+ o  Trap exceptions (die) from the response callback routine
+
+ o  The RobotUA now requires an e-mail address of the person reponsible
+    for the robot.
+
+ o  New $ua->from() method.
+
+ o  Support for gopher Index-Search (gopher type '7' requests).
+    Contributed by Harry Bochner <bochner@das.harvard.edu>
+
+ o  Cleaned up white-space usage in the source.
+
+
+
+Wed Apr  3 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b11
+
+ o  Implemented a NNTP protocol module.  The library can now fetch and
+    post news articles.
+
+ o  More documentation
+
+ o  Don't look at the URI header for redirects
+
+ o  New $res->base() method for HTTP::Responses
+
+ o  Graham Barr's patch to File::Listing to make it more OO internally
+
+ o  content_type() return value is canonicalized
+
+ o  $ua->request() does not die on bad URLs any more
+
+ o  LWP::MediaTypes merge all media.types files that if finds
+
+ o  FTP request with content to file or callback did not work
+
+ o  The value of HTTP Host: header is now $url->netloc;
+
+ o  The URI::URL constructor now accept URLs wrapped up in "<>"
+
+ o  $url->abs() now has a second optional argument that makes it accept
+    that relative URLs can have scheme, i.e. treat "http:img.gif" as a
+    relative URL.
+
+ o  Added prototypes to the HTTP::Status::is_xxx() functions
+
+ o  Added prototypes to the MIME:: encoding/decoding functions
+
+ o  Always return scheme for mailto and news URLs (as_string)
+
+ o  RobotRules patches from Henry A Rowley.
+
+ o  More tests
+
+ o  <SMALL> and <BIG> again
+
+
+
+Thu Mar 14 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b10
+
+ o  GET ftp://host/doc was never successful for normal files.
+
+ o  LWP::Socket: read_until() did not notice EOF condidtion.  I.e. if
+    a HTTP server closed the connection before any output was generated,
+    the we continued to read 0 bytes in a busy loop until the alarm()
+    killed us.
+
+ o  Added support for Digest Access Authentication.  Contributed by
+    Doug MacEachern <dougm@osf.org>.
+
+ o  Makefile.PL: check for MD5 library
+
+ o  No longer print message content in HTTP::Response::error_as_HTML()
+
+ o  Access to "file:/path" gave warning when the envirionment variable
+    no_proxy was set.
+
+ o  The http-post test sends a Content-Type header.  Some servers hang
+    if this header is missing.
+
+ o  HTML::Parse:
+     -   allow <SMALL> and <BIG> tags
+     -   allow empty attribute values
+
+
+
+Tue Mar  5 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b9
+
+ o  Started to write on the libwww-perl cookbook (lwpcook.pod)
+
+ o  The URI::URL module now exports the function url().  This is an
+    alternative (easy to use) constructor function.
+
+ o  Expanding relative file URLs starting with "#" did not work.
+
+ o  Fixed autoloaded DESTROY problem by adding empty DESTROY routine
+    to URI::URL.
+
+ o  Does not try generate password for ftp-URLs unless the username is
+    "anonymous" or "ftp"
+
+ o  The LWP::Simple user agent proxy settings are intialized from
+    the proxy environment variables. 
+
+ o  LWP::Protocol::ftp: Use the Net::FTP library to access ftp servers.
+    Convert directories to HTML on request (Accept: text/html).
+
+ o  New module HTTP::Negotiate
+
+ o  New module File::Listing
+
+ o  HTTP::Date::str2time can parse a few more formats, like the 'ls -l'
+    format and ISO 8601.  The function now also takes an optional second
+    parameter which specify a default time zone.
+
+ o  Added prototypes to the HTTP::Date functions.
+
+ o  The library adds a timestamp to responses ("Client-Date")
+
+ o  HTTP::Status:  Updated to proposed HTTP/1.1
+
+ o  HTTP::Headers: Updated to proposed HTTP/1.1
+
+ o  LWP::Protocol::http:  Updated to HTTP/1.1 methods
+
+ o  Took out stringify overloading in HTML::Element.
+
+
+
+Mon Feb 26 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b8
+
+ o  Renamed functions using thisStyleOfNames to this_style_of_names.
+    Provided a script called 'update_from_5b7'
+
+ o  Renamed the 'request' and 'mirror' scripts to 'lwp-request' and
+    'lwp-mirror'.  The GET, POST, HEAD aliases for 'lwp-request' are
+    the same.
+
+ o  Implemented LWP::RobotUA
+
+ o  Class name for RobotRules did not match the file name
+
+ o  URI::URL
+      - perl5.002gamma is required (because use vars).
+      - The leading slash in now part of the path if it is present.
+      - More documentation
+      - Use AutoLoader to speed things up.
+      - New class URI::URL::_login and made telnet, rlogin, tn3270
+        subclasses from this one.
+      - URI::URL::wais is better supported.
+      - URI::URL::news is better supported.
+      - New URI::URL::mailto methods: user/host
+
+ o  HTTP::Date::time2str now works correctly with '0' as argument
+
+ o  HTTP::Message delegates unknown methods to the headers.
+
+ o  HTTP::Request::uri is an alias for HTTP::Request::url.  Can set
+    the URL to undef.
+
+ o  Added convenience methods to HTTP::Headers for easy access to
+    frequently used headers.
+
+ o  Simplified LWP::Debug
+
+ o  Use standard AutoLoader for LWP::IO functions.
+
+ o  Played with the profiler (Devel::DProf) and made some things
+    go quicker.
+
+ o  Included the File::CounterFile module.  Excluded Mail::Cap module
+    as it is also part of the MailTools package.
+
+
+
+Mon Feb  5 1996   Gisle Aas <aas@sn.no>
+
+ o  Release 5b7
+
+ o  Perl5.002 is required now
+
+ o  Rewrite of the URI::URL module (version 4.00)
+      - escaping/unsafe stuff redone (and removed)
+      - URI::URL::_generic moved out of URL.pm
+      - netloc, path, params, query is now stored internally in escaped form
+      - new methods for URI::URL::_generic are:
+           epath
+           eparams
+           equery
+	   path_components
+           absolute_path
+      - new methods for URI::URL::http are:
+           keywords
+           query_form
+      - new methods for URI::URL::file are:
+           newlocal
+           local_path
+           unix_path
+           dos_path
+           mac_path
+           vms_path
+
+ o  URI::Escape now semi-compile regular expressions (by evaling an
+    anonymous sub).  Same techinque is also used in HTML::Entities.
+
+ o  HTTP::Date parser rewritten using regular expressions.
+
+ o  HTTP::Headers->as_string() now croaks if any field values
+    contain newline.
+
+ o  HTTP::Status constants use empty prototype.
+
+ o  Font metrics moved to a new subdirectory (lib/Font/Metrics)
+
+ o  Don't use the VERSION script any more (even if it was very clever)
+
+ o  HTML::Entities will now export the names decode_entities() and
+    encode_entities().
+
+ o  Andreas Koenig's black patch to HTML::Element.
+
+ o  The HTML::Formatter now knows about <menu> and <dir> tags
+
+ o  The construct "defined ref($arg)" did not work on perl5.002
+    becase ref now always return something defined.
+
+ o  LWP::UserAgent sends by default an 'User-Agent' header.
+
+ o  LWP::Simple sends 'User-Agent' header to servers.
+
+ o  Updated the LWP::Socket module to use the new Socket.pm interface.
+
+ o  LWP::Protocol::http sends the new HTTP/1.1 'Host' header.
+
+ o  LWP::Protocol::file use $url->local_path to get a file to open.
+    It also inserts a <BASE> tag in directories instead of a redirect.
+
+ o  MIME::Base64 routines can be called as MIME::Base64::encode() and
+    MIME::Base64::decode().  Same kind of thing for QuotedPrint.
+
+
+
+Mon Nov  6 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Release 5b6
+
+ o  Installation should work better for those that still runs
+    perl4 as 'perl'.  The mirror script is not installed by
+    default.
+
+ o  LWP::Socket::_getaddress() Numerical IP adresses did not work.
+
+ o  LWP::Socket::pushback() did not work.  This also avoids the bad
+    pp_select() core dump from perl.
+
+ o  LWP::IO now also selects on socket exceptions.
+
+ o  HTML::Parse:  Ignore <!DOCTYPE ...> regardless for case.  Some
+    bad insertElement() calls made infinite loops.
+
+ o  The uri.t test works better for places where /tmp is a sym-link.
+
+
+
+Sat Sep 16 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Release 5b5
+
+ o  newlocal URI::URL does not put "//localhost" into the URLs any
+    longer.
+
+ o  The request program: New -o option to reformat the HTML code
+    New -C option to provide credentials on the command line.
+    The -b option never worked.
+
+ o  LWP::Protocol::file now returns redirect for access to directories
+    where the trailing slash is missing.
+
+
+
+Thu Sep 14 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Speedups and bug fixes in the HTML parser.  The parser now
+    understands some more depreciated tags (like <xmp> and <listing>).
+
+ o  HTML::Elements are now stingified using perl overloading.
+    The interface to the traverse() callback has changed.
+
+ o  Implemented HTML formatters for plain text and Postscript.
+
+ o  Added lib/Font stuff to support the Postscript formatter.
+
+ o  Inspired by Tim Bunce, I implemented the HTML::AsSubs module.
+    Don't know if it is really useful.
+
+ o  The local/get test does not use /etc/passwd any more.
+
+
+
+Thu Sep  7 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Changed package name to libwww-perl-5xx
+
+ o  Made LWP::Protocol::ftp actually transfer data
+
+ o  Implemented methods for LWP::Socket to act as a server:
+    bind(), listen(), accept(), getsockname(), host(), port()
+
+
+
+Wed Sep  6 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Release 0.04
+
+ o  Implemented modules to parse HTML.
+
+
+
+Mon Sep  4 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Implemented Mail::Cap which will become part of the MailTools
+    package.
+
+ o  Moved Base64 to MIME::Base64.  Reimplemented MIME::Base64 by using
+    [un]pack("u",...)   Implemented LWP::MIME::QuotedPrint for
+    completness sake.  Routine names has changed as suggested by Tim
+    Bunce.
+
+ o  LWP::MediaType reads default types from media.types file.
+    guessMediaType() now also returns encodings.  New function mediaSuffix()
+
+ o  Pass $url to $ua->getBasicCredentials().  This also fixes security
+    hole with the old implementation of getBasicCredentials().
+
+ o  LWP::Protocol::file now sets Content-Encoding headers
+
+ o  Allow request content to be provided by a callback routine.
+
+ o  Fix bug that prevented response callback to work.  The first parameter
+    (data) is no longer a reference, because $_[0] is already a reference.
+    Don't callback unless successful response.  Callbacks during redirects
+    was confusing.
+
+ o  URI::URL.  Remove port from netloc if it is the default port.
+    Don't use anything, just require.
+
+ o  HTTP::Message->addContent() does not need a reference parameter.
+
+ o  LWP::Socket->open() has been renamed top LWP::Socket->connect()
+    LWP::Socket->close has gone.  Implemented new method LWP::Socket->read()
+    that returns as fast as it has some data to offer.  Implemented
+    LWP::Socket->pushback().
+
+ o  Does not die in LWP::UserAgent->request()
+
+ o  LWP::Socket now use LWP::IO for low level IO
+
+ o  Implemented LWP::TkIO as a replacement module for LWP::IO when using Tk.
+
+
+
+Thu Aug 17 1995   Gisle Aas <aas@oslonett.no>
+
+ o  $ua->redirectOK() for checking redirects
+
+ o  reorganized tests in the "t" directory.
+
+
+
+Fri Aug 11 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Release 0.03
+
+ o  Included RobotRules.pm from Martijn Koster
+
+
+
+Thu Aug 10 1995   Gisle Aas <aas@oslonett.no>
+
+ o  New module URI::Escape (URI::URL use this module for default
+    escaping) that provide the uri_escape() and uri_unescape()
+    functions.
+
+ o  Setting $url->scheme now changes the class of the object.
+
+ o  Made $httpurl->user() and $httpurl->password() illegal.
+    Likewise for other URL schemes.
+
+
+
+
+Wed Aug  9 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Reorganisation as discussed on <libwww-perl@ics.uci.edu>
+       LWP::Date       --> HTTP::Date
+       LWP::MIMEheader --> HTTP::Headers
+       LWP::StatusCode --> HTTP::Status
+       LWP::Message    --> HTTP::Message
+       LWP::Request    --> HTTP::Request
+       LWP::Response   --> HTTP::Response
+       LWP::MIMEtypes  --> LWP::MediaTypes
+
+ o  HTTP::Date parses ctime format with missing timezone as suggested
+    by Roy Fielding <fielding@beach.w3.org>
+
+ o  HTTP::Status and LWP::MediaTypes exports their functions by default.
+
+ o  Splitted up the URI::URL module.  Schemes are implemented by separate
+    files that are autoloaded when used.  Self test moved to "t/uri.t".
+
+
+       
+Mon Aug  7 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Applied patch from Marc Hedlund <hedlund@best.com>
+       - Update the @header_order according to the August 3rd draft.
+       - Added Response Header fields: 'Location', 'Public', 'Retry-After',
+         'Server', and 'WWW-Authenticate'.
+       - Moved 'unknown header' handling from &scan to &header. The old
+         implementation was forcing all unknown header-words to begin with
+	 an uppercase (as it should be), but disallowed other uppercase
+	 letters.
+       - updates the status code messages under the August
+         3rd HTTP/1.0 draft.  '203' became 'Non-Authoritative Information',
+	 '303' became 'See Other', and a new code,
+	 '411 Authorization Refused', was added.
+
+ o  Can remove multiple headers with single removeHeader() call in MIMEheader.
+
+ o  Can assign multiple field/value pairs in header() method of MIMEheader.
+
+ o  A field with multiple values is printed as separate values in
+    MIMEheader::as_string().
+
+ o  LWP::Response contain new attributes: previous() and request().  These
+    attributes are updated by the UserAgent.
+
+ o  Appended \n to some die statements in Socket so that line numbers are
+    suppressed in error messages.
+
+ o  Made UserAgent::clone work for reference members
+
+ o  Check for redirect loops and multiple authorization failures by
+    examination of the response chain.
+
+ o  Use "\015\012" instead of "\r\n" in protocol modules.  Some systems
+    define \r and \n differently.
+
+ o  request program can now handle documents that needs autorization by
+    prompting the user for username/password. Added new -S option to print
+    request/response chain.
+
+
+  
+Tue Jul 25 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Release 0.02
+
+ o  Included URI::URL in the release
+
+
+
+Mon Jul 24 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Incorporated Makemake.PL and VERSION from Andreas Koenig <koenig@mind.de>
+    As a result of this the following things have changed:
+       - programs in "bin" are extracted from .PL-files
+       - reintroduced "lib"
+       - "test" has been renamed as "t"
+       - test programs in "t" has been made Test::Harness compatible
+       - we now have a MANIFEST file
+       - no more need fro update_version, make-dist, lwp-install
+
+ o  Renamed bin/get to bin/request.  Links to it are now all upper case.
+
+ o  Proxy support in bin/request (provided by Martijn Koster)
+
+ o  UserAgent can now load proxy settings from environment
+
+ o  LWP::Protocol::ftp is under way but not really finished
+
+
+
+Tue Jul 18 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Implemented LWP::Protocol::gopher
+
+ o  Implemented LWP::Protocol::mailto
+
+ o  Fixed proxy typo
+
+
+
+Mon Jul 17 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Made release 0.01
+
+
+
+Mon Jul 17 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Don't loose first line of HTTP/0.9 requests
+
+ o  LWP::Socket use syswrite() for writing
+
+ o  Added RC_* documentation to LWP::StatusCode
+
+ o  LWP::Date now use hash to look up month numbers
+
+ o  Added -f option to "get"
+
+ o  Untabify
+
+ o  Added a "TODO" list
+
+ o  Fixed various typos
+
+
+
+Fri Jul 14 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Reorganized directories.  Moved LWP.pm up.  Moved file.pm and http.pm
+    into the LWP::Protocol direcotory.  Moved LWP out of the lib directory
+    and removed lib.
+
+ o  Implemented the "get" and "mirror" scripts in the "bin" directory.
+
+ o  Implemented "install-lwp", "update_version" and "make-dist".  The library
+    version number is found in the VERSION file.
+
+ o  Always adds 1900 to the year in LWP::Date
+
+ o  In LWP::MIMEheader:  Implemented clone(), removeHeader() and scan() 
+    methods.  Reimplemented asString.  Removed asMIME().  Moved "Good
+    Practice" into this file, and reimplemented it.
+
+ o  Moved "header" and "content" into LWP::Message class.  This change made
+    LWP::Request and LWP::Response much simpler.  Made clone() method
+    actually work.
+
+ o  LWP::Protocol::implementor does not die if it cannot load package.
+
+ o  Moved UserAgent convenience methods into LWP::Simple.  Made LWP::Simple
+    export LWP::StatusCode symbols and functions.
+
+ o  Implemented $ua->isProtocolSupported($scheme) method.
+
+ o  Nicer directory listing in LWP::Protocol::file.pm
+
+ o  Rely on URI::URL 3.00 behaviour for $url->full_path
+
+ o  Library version number now in LWP.pm.  You should be able to say
+    "use LWP 1.0;" if you need at least this version.
+
+ o  Various cleanups and arranging layout as I like it.  Use fooBar-style
+    (as opposed to foo_bar stype) everywhere.  This means that as_string()
+    now is called asString().
+
+ o  Added more documentation.
+
+
+
+Wed Jun 14 1995   Gisle Aas <aas@oslonett.no>
+
+ o  Removed lot of rendundant & before function calls.
+
+ o  $this --> $self
+
+ o  &collector passes content as a reference, don't want to copy so much
+
+ o  parameterlist to collect callback has been rearranged
+
+ o  Response::addContent gets a reference to the data
+
+ o  Added some callback documentation to UserAgent.pm
+
+ o  Protocol::file now uses the collector
+
+ o  Introduced LWP::Simple
+
+
+
+Sun Jun 11 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Added basic authentication support
+
+ o  Added mirroring of single documents
+
+ o  Change Protocol construction from whacky URL.pm (constructor returns
+    subclass) to more normal C++'ish way.
+
+
+
+Wed June 7 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Minor cleanups from printed code inspection
+
+
+
+Wed May 24 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Added redirection resolution
+
+ o  Added optional autoloading of protocols
+
+
+
+Tue May 23 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Separated socket stuff into separate module
+
+ o  Added HTTP proxy support
+
+ o  Made alarm handling optional
+
+ o  Added a LWP::Message for completeness sake
+
+ o  Added LWP::MemberMixin to reduce code duplication
+
+ o  Cosmetic changes to LWP::Date
+
+ o  Renamed LWP::Error to LWP::StatusCode
+
+ o  Renamed LWP::MIME to LWP::MIMEtype
+
+ o  Changed the tests to cope with all this
+
+It's getting there...
+
+
+
+Mon May 22 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Changed the socket reading to use sysread.  This will have to go
+    into a module of its own.
+
+
+
+Thu 18 May 1995   Martijn Koster <m.koster@nexor.co.uk>
+
+ o  Mentioned on libwww-perl that I had changed the classes around lots.
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/INSTALL.w3mir
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/INSTALL.w3mir	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/INSTALL.w3mir	(revision 21083)
@@ -0,0 +1,48 @@
+
+- Get libwww-perl from CPAN 
+  (http://www.perl.com/CPAN/modules/by-module/WWW/).  W3mir does not work
+  with LWP 5.40 and later versions.  Please get an earlier version.
+  It also does not work with the new URI package.  Use the URI package
+  enclosed in the older LWP.
+
+- Unpack it:
+
+    gzip -dc libwww-perl-*.tar.gz | tar xvBf -
+
+- Install it.  W3mir does not require the whole libwww-perl package and
+  all the packages that goes with it to work so you may follow these
+  install instructions instead of the libwww-perl install instructions
+  to get an easier install which will work with w3mir.
+
+    cd libwww-perl-*
+
+  Are you going to install it in the standard perl place (you need to
+  be the system administrator to do this)? If so:
+
+    perl Makefile.PL
+
+  If not (if you are a user):
+
+    perl Makefile.PL PREFIX=/some/dir
+
+  /some/dir could be ~ (as in your home directory).
+
+  IF you are installing an old LWP just for w3mir you can install both
+  the old LWP, the Base64 module and w3mir in a special PREFIX
+  separate from your usual install PREFIX.  This ensures that w3mir will
+  access the older version of LWP and that other software will access
+  the newer version.  If you do this make sure you install all of LWP,
+  Base64 and w3mir with the same PREFIX.
+
+  This step might produce some complaints;  A standard perl
+  installation will typically get messages about missing these
+  modules: IO::Socket, NET::FTP and MD5.  None of these need be
+  installed to run w3mir and so any error messages about these may
+  safely be ignored.
+
+    make
+    make test      (robot/ua and local/http might fail, that's OK)
+    make install
+
+  Now libwww-perl should be installed and working.
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/MANIFEST
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/MANIFEST	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/MANIFEST	(revision 21083)
@@ -0,0 +1,106 @@
+ChangeLog			History of this package
+MANIFEST			This file
+Makefile.PL			Makefile generator
+README				Get you started with this package
+TODO				The To-Do list for the library
+bin/lwp-download.PL             Writes bin/lwp-download script
+bin/lwp-mirror.PL		Writes bin/lwp-mirror script
+bin/lwp-request.PL		Writes bin/lwp-request script
+bin/lwp-rget.PL			Writes bin/lwp-rget script
+lwpcook.pod			Libwww-perl examples
+lib/Bundle/LWP.pm               Defines prereq modules
+lib/File/Listing.pm		Parse directory listings
+lib/HTTP/Cookies.pm             Cookie storage and management
+lib/HTTP/Daemon.pm		A simple httpd
+lib/HTTP/Date.pm		Date conversion routines
+lib/HTTP/Headers.pm		Class encapsulating HTTP Message headers
+lib/HTTP/Headers/Auth.pm	Some methods that deal with authorization.
+lib/HTTP/Headers/ETag.pm	Some methods that deal with entity tags
+lib/HTTP/Headers/Util.pm        Some utility functions for header values.
+lib/HTTP/Message.pm		Class encapsulating HTTP messages
+lib/HTTP/Negotiate.pm		Evaluate HTTP content negotiation algoritm
+lib/HTTP/Request.pm		Class encapsulating HTTP Requests
+lib/HTTP/Request/Common.pm      Generate common requests
+lib/HTTP/Response.pm		Class encapsulating HTTP Responses
+lib/HTTP/Status.pm		HTTP Status code processing
+lib/LWP.pm			Includes what you need
+lib/LWP/Authen/Basic.pm		Basic authentication scheme
+lib/LWP/Authen/Digest.pm	Digest authentication scheme
+lib/LWP/Debug.pm		Debugging support
+lib/LWP/MediaTypes.pm		Library for guessing media types
+lib/LWP/MemberMixin.pm		Helps you access %$self
+lib/LWP/Protocol.pm		Virtual base class for LWP protocols
+lib/LWP/Protocol/data.pm        Access to data URLs
+lib/LWP/Protocol/file.pm	Access local files
+lib/LWP/Protocol/ftp.pm		Access with the FTP protocol
+lib/LWP/Protocol/gopher.pm	Access with the Gopher protocol
+lib/LWP/Protocol/http.pm	Access with HTTP protocol
+lib/LWP/Protocol/https.pm	Access with HTTP protocol over SSL
+lib/LWP/Protocol/mailto.pm	Allows you to POST mail using sendmail
+lib/LWP/Protocol/nntp.pm	Handles access to news: and nntp: URLs
+lib/LWP/RobotUA.pm		Easy creation of conforming robots
+lib/LWP/Simple.pm		Procedural LWP interface
+lib/LWP/UserAgent.pm		A WWW UserAgent class
+lib/LWP/media.types		Mapping from file extentions media types
+lib/URI/Escape.pm		General URI escaping functions
+lib/URI/Heuristic.pm            User friendly URLs
+lib/URI/URL.pm			Class encapsulating URLs
+lib/URI/URL/_generic.pm		Implements generic hierarchical RL (RFC 1808)
+lib/URI/URL/_login.pm		Base class for telnet, tn3270 and rlogin
+lib/URI/URL/data.pm             Implements data URLs
+lib/URI/URL/file.pm		Implements file URLs
+lib/URI/URL/finger.pm		Implements finger URLs
+lib/URI/URL/ftp.pm		Implements ftp URLs
+lib/URI/URL/gopher.pm		Implements gopher URLs
+lib/URI/URL/http.pm		Implements http URLs
+lib/URI/URL/https.pm		Implements https URLs
+lib/URI/URL/mailto.pm		Implements mailto URLs
+lib/URI/URL/news.pm		Implements news URLs
+lib/URI/URL/nntp.pm		Implements nntp URLs
+lib/URI/URL/prospero.pm		Implements prospero URLs
+lib/URI/URL/rlogin.pm		Implements rlogin URLs
+lib/URI/URL/telnet.pm		Implements telnet URLs
+lib/URI/URL/tn3270.pm		Implements tn3270 URLs
+lib/URI/URL/wais.pm		Implements wais URLs
+lib/URI/URL/webster.pm		Implements webster URLs
+lib/URI/URL/whois.pm		Implements whois URLs
+lib/WWW/RobotRules.pm		Parse robot.txt files
+lib/WWW/RobotRules/AnyDBM_File.pm	Persistent robot rules
+t/README			How to run and set up tests
+t/TEST				Run tests
+t/base/common-req.t		Test HTTP::Request::Common module
+t/base/cookies.t                Test HTTP::Cookies module
+t/base/date.t			Test HTTP::Date module
+t/base/headers.t		Test HTTP::Headers module
+t/base/headers-auth.t		Test HTTP::Headers::Auth module
+t/base/headers-etag.t		Test HTTP::Headers::ETag module
+t/base/headers-util.t		Test HTTP::Headers::Util module
+t/base/listing.t		Test File::Listing module
+t/base/mediatypes.t		Test LWP::MediaTypes module
+t/base/message.t		Test HTTP::Request/HTTP::Response
+t/base/negotiate.t		Test HTTP::Negotiation module
+t/base/response.t		Test additional HTTP::Response methods
+t/base/status.t			Test HTTP::Status module
+t/local/autoload.t		Test autoloading of LWP::Protocol modules
+t/local/get.t			Try to get a local file
+t/local/http.t			Test http to local server
+t/local/protosub.t              Test with other protocol module
+t/net/cgi-bin/moved
+t/net/cgi-bin/nph-slowdata
+t/net/cgi-bin/slowread
+t/net/cgi-bin/test
+t/net/cgi-bin/timeout
+t/net/config.pl.dist		Suggested configuration for net tests
+t/net/http-get.t
+t/net/http-post.t
+t/net/http-timeout.t
+t/net/mirror.t
+t/net/moved.t
+t/net/proxy.t
+t/robot/rules-dbm.t		Test WWW::RobotRules::AnyDBM_File
+t/robot/rules.t			Test WWW::RobotRules
+t/robot/ua.t			Test LWP::RobotUA
+t/uri/abs-config.t              Test URI::URL configuration variables
+t/uri/base.t			Test URI::URL module
+t/uri/rel-base.t		Test URI::URL module some more
+t/uri/heuristic.t               Test URI::Heuristic module
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/Makefile.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/Makefile.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/Makefile.PL	(revision 21083)
@@ -0,0 +1,184 @@
+# This -*- perl -*- script writes the Makefile for libwww-perl
+# $Id$
+
+require 5.004;
+use strict;
+
+#--- Configuration section ---
+
+my @programs_to_install = qw(lwp-request lwp-mirror lwp-rget lwp-download);
+my @request_aliases     = qw(GET HEAD POST);
+
+#--- End Configuration - You should not have to change anything below this line
+
+
+# Allow us to suppress all program installation with the -n (library only)
+# option.  This is for those that don't want to mess with the configuration
+# section of this file.
+use Getopt::Std;
+use vars qw($opt_n);
+unless (getopts("n")) {
+    die "Usage: $0 [-n]\n";
+}
+@programs_to_install = () if $opt_n;
+
+
+# Check for non-standard modules that are used by this library.
+$| = 1;
+my $missing_modules = 0;
+
+print "Checking for HTML::Parser..";
+eval {
+    require HTML::HeadParser;
+};
+if ($@) {
+    print " failed\n";
+    $missing_modules++;
+    print <<EOT;
+$@
+The HTML::Parser is needed to extract correct <BASE> information from
+HTML so that we can resolv relative links correctly.
+
+EOT
+    sleep(2);  # Don't hurry too much
+} else {
+    print " ok\n";
+}
+
+print "Checking for MIME::Base64..";
+eval {
+    require MIME::Base64;
+    #MIME::Base64->require_version('2.00');
+};
+if ($@) {
+    print " failed\n";
+    $missing_modules++;
+    print <<EOT;
+$@
+The Base64 encoding is used in authentication headers in HTTP.
+
+EOT
+    sleep(2);  # Don't hurry too much
+} else {
+    print " ok\n";
+}
+
+print "Checking for Net::FTP......";
+eval {
+    require Net::FTP;
+    Net::FTP->require_version('2.00');
+};
+if ($@) {
+    print " failed\n";
+    $missing_modules++;
+    print <<EOT;
+$@
+The libwww-perl library normally use the Net::FTP module when
+accessing ftp servers.  You would have to install this package or
+configure your application to use a proxy server for making ftp
+requests work.  Net::FTP is part of the 'libnet' distribution.
+
+EOT
+    sleep(2);  # Don't hurry too much
+} else {
+    print " ok\n";
+}
+
+print "Checking for MD5 ..........";
+eval {
+    require MD5;
+};
+if ($@) {
+    print " failed\n";
+    $missing_modules++;
+    print <<EOT;
+$@
+The MD5 library is needed if you want to be able use the experimental
+"Digest Access Authentication" scheme.  Since very few servers
+implement this authentication scheme, you should normally not worry
+too much about this.
+
+EOT
+} else {
+    print " ok\n";
+}
+
+print <<EOT if $missing_modules;
+The missing modules can be obtained from CPAN.  Visit
+<URL:http://www.perl.com/CPAN/> to find a CPAN site near you.
+
+EOT
+
+
+# Ok, now it is time to really generate the Makefile
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+   NAME          => 'libwww-perl',
+   VERSION_FROM  => 'lib/LWP.pm',
+   PL_FILES      => { map {("bin/$_.PL" => "bin/$_")} @programs_to_install },
+   EXE_FILES     => [ map {"bin/$_"} @programs_to_install ],
+   'clean'       => { FILES => '$(EXE_FILES)' },
+   'dist'        => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
+);
+
+
+
+package MY;
+
+sub postamble
+{
+    my @m;
+    if (@request_aliases && grep($_ eq 'lwp-request', @programs_to_install)) {
+	push @m, "all ::\n";
+	if ($^O eq 'MSWin32') {
+	    push @m, "\t\$(FULLPERL) -e \"use Config; chdir q[\$(INST_EXE)]; "
+		    ."foreach (qw(@request_aliases)) { \" \\\n";
+	    push @m, <<'EOT';
+	-e "unlink \"$$_\"; " \
+	-e "system(\"copy lwp-request $$_\") && die; }"
+EOT
+	} else {
+	    push @m, "\t\$(FULLPERL) -e 'use Config; chdir q{\$(INST_EXE)}; "
+		    ."foreach (qw(@request_aliases)) {' \\\n";
+	    push @m, <<'EOT';
+	-e 'unlink "$$_";' \
+	-e 'system("$$Config{\"lns\"} lwp-request $$_") && die; }'
+EOT
+	}
+    }
+    join "", @m;
+}
+
+# What happens when we say 'make test'
+sub test
+{
+    q(
+TEST_VERBOSE=0
+
+test: all
+	$(FULLPERL) t/TEST $(TEST_VERBOSE)
+
+);
+}
+
+
+# Determine things that should *not* be installed
+sub libscan
+{
+    my($self, $path) = @_;
+    return '' if $path =~ m/.(pl|dtd|sgml)$/;
+    return '' if $path =~ m:\bCVS/:;
+    return '' if $path =~ m/~$/;
+    $path;
+}
+
+# Pass libwww-perl version number to pod2man
+sub manifypods
+{
+    my $self = shift;
+    my $ver = $self->{VERSION} || "";
+    local($_) = $self->SUPER::manifypods(@_);
+    s/pod2man\s*$/pod2man --release libwww-perl-$ver/m;
+    $_;
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/README
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/README	(revision 21083)
@@ -0,0 +1,124 @@
+                     L I B W W W - P E R L - 5
+                   -----------------------------
+
+Libwww-perl is a collection of Perl modules which provides a simple
+and consistent programming interface (API) to the World-Wide Web.  The
+main focus of the library is to provide classes and functions that
+allow you to write WWW clients, thus libwww-perl said to be a WWW
+client library. The library also contain modules that are of more
+general use and even classes that helps you implement simple HTTP
+servers.
+
+There are actually two versions of libwww-perl: one for Perl4, and one
+for Perl5. Both have a similar architecture, loosely based on the CERN
+Library of Common Code (nowadays known as 'w3c-libwww').
+
+The Perl4 version is still(?) maintained by Roy Fielding, and was the
+basis for tools such as MOMSpider. The perl4 version of libwww-perl
+and much more information about its libraries can be found at:
+http://www.ics.uci.edu/pub/websoft/libwww-perl/
+
+The Perl5 version (this package) is a complete rewrite for Perl5: the
+code is organized in Modules, provides an Object Oriented API, is
+updated for the latest HTTP and URL specification, and offers some
+extended functionality.
+
+Full HTTP/1.1 support is on its way.  Alpha releases of the LWPng
+package is currently available from CPAN.
+
+
+PREREQUISITES
+
+In order to install and use this package you will need Perl version
+5.004 or better.  Some modules within this package depend on other
+packages that are distributed separately from Perl.  We recommend that
+you have the following packages installed before you install
+libwww-perl:
+
+  MIME-Base64
+  HTML-Parser
+  libnet
+  MD5
+
+These packages should be available on CPAN.
+
+If you want to access sites using the https protocol, then you need to
+install the Crypt-SSLeay modules first.  (The Net::SSLeay module is not
+supported any more.)
+
+
+INSTALLATION
+
+You install libwww-perl, as you would install any perl module library,
+by running these commands:
+
+   perl Makefile.PL
+   make
+   make test
+   make install
+
+You can edit the configuration section of Makefile.PL to select which
+programs to install in addition to the library itself.  If you don't
+want to install any programs (only the library files) and don't want
+to mess with the Makefile.PL then pass the '-n' option to Makefile.PL:
+
+   perl Makefile.PL -n
+
+If you want to install a private copy of libwww-perl in your home
+directory, then you should try to produce the initial Makefile with
+something like this command:
+
+  perl Makefile.PL LIB=~/perl
+
+The Makefile.PL program will start out by checking your perl
+installation for a few packages that are recommended to be installed
+together with libwww-perl.
+
+Optional network tests are _not_ enabled automatically when you unpack
+this package.  Consult the t/README file for instructions on how to
+enable these tests.
+
+
+DOCUMENTATION
+
+See lib/LWP.pm for an overview of the library. See ChangeLog for
+recent changes.  POD style documentation is included in all modules
+and scripts.  These are normally converted to manual pages and
+installed as part of the "make install" process.  You should also be
+able to use the 'perldoc' utility to extract and read documentation
+from the module files directly.
+
+
+SUPPORT
+
+Question about how to use this library should be directed to the
+comp.lang.perl.modules USENET Newsgroup.  Bug reports and suggestions
+for improvements can be sendt to the <libwww-perl@ics.uci.edu> mailing
+list.  This mailing list is also the place for general discussions and
+development of the libwww-perl package.
+
+You can join the mailing list by sending a message to
+<libwww-perl-request@ics.uci.edu> with "Subscribe" as subject.
+            ^^^^^^^^
+
+AVAILABILITY
+
+The latest version of libwww-perl should always be available from:
+
+     http://www.linpro.no/lwp/
+
+The library is also available from the Comprehensive Perl Archive
+Network (CPAN).  Visit <URL:http://www.perl.com/CPAN/> to find a CPAN
+site near you.
+
+
+COPYRIGHT
+
+  © 1995-1998 Gisle Aas. All rights reserved.
+  © 1995 Martijn Koster. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+
+Enjoy!
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/TODO
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/TODO	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/TODO	(revision 21083)
@@ -0,0 +1,46 @@
+                                            $Date$
+
+This is a list over things that we plan to implement in libwww-perl-5.
+The order of items does not reflect priority.
+
+  o  HTTP/1.1 support is on its way.  This also includes support of
+     multiple parallel connections.  Take a look at LWPng (aka
+     libwww-perl-6).
+
+  o  Provide initial credentials so that we don't always have to get a
+     401 response first.  Both for Basic and Digest authentication.  This
+     is in fact implemented for LWPng.
+
+  o  HTTP::Request::Common::POST() should be able to create large
+     file upload requests by making a closure content.
+
+  o  Support PICS??
+
+  o  Cache previous ftp connections.  "Keep-Alive"?
+
+  o  Support MOVE, DELETE method for ftp.
+
+  o  Support If-Modified-Since for ftp.
+
+  o  Use Mail::Send to implement LWP::Protocol::mailto.  Today we just
+     invoke sendmail directly, which is not very portable.
+
+  o  The lwp-request -o processing should check for Content-Encoding as
+     well as Content-Type.
+
+  o  The lwp-request script should optionally consult Mail::Cap for
+     handling of media types.
+
+  o  The lwp-request script should use the callback interface so that it
+     prints data as it is received.
+
+  o  The lwp-mirror script should be able to work recursively.
+
+  o  Include more useful programs
+
+  o  More documentation
+
+  o  More tests
+
+  o  Fix bugs, if there are any...
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-download.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-download.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-download.PL	(revision 21083)
@@ -0,0 +1,248 @@
+use Config;
+use File::Basename qw(basename dirname);
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+	if ($Config{'osname'} eq 'VMS' or
+	    $Config{'osname'} eq 'OS2');  # "case-forgiving"
+open OUT,">$file" or die "Can't create $file: $!";
+chmod(0755, $file);
+print "Extracting $file (with variable substitutions)\n";
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'} -w
+
+!GROK!THIS!
+
+print OUT <<'!NO!SUBS!';
+# $Id$
+
+=head1 NAME
+
+lwp-download - fetch large files from the net
+
+=head1 SYNOPSIS
+
+ lwp-download [-a] <url> [<local file>]
+
+=head1 DESCRIPTION
+
+The I<lwp-download> program will down load the document specified by the URL
+given as the first command line argument to a local file.  The local
+filename used to save the document is guessed from the URL unless
+specified as the second command line argument.
+
+The I<lwp-download> program is implemented using the I<libwww-perl>
+library.  It is better suited to down load big files than the
+I<lwp-request> program because it does not store the file in memory.
+Another benefit is that it will keep you updated about its progress
+and that you don't have much options to worry about.
+
+Use the C<-a> option to save the file in text (ascii) mode.  Might make a
+difference on dosish systems.
+
+=head1 EXAMPLE
+
+Fetch the newest and greatest perl version:
+
+ $ lwp-download http://www.perl.com/CPAN/src/latest.tar.gz
+ Saving to 'latest.tar.gz'...
+ 1.47 MB received in 22 seconds (68.7 KB/sec)
+
+=head1 AUTHOR
+
+Gisle Aas <gisle@aas.no>
+
+=cut
+
+use LWP::UserAgent;
+use LWP::MediaTypes;
+use URI::URL;
+use strict;
+
+my $progname = $0;
+$progname =~ s,.*/,,;    # only basename left in progname
+$progname =~ s/\.\w*$//; # strip extension if any
+
+#parse option
+use Getopt::Std;
+my %opts;
+unless (getopts('a', \%opts)) {
+    usage();
+}
+my $opt_a = $opts{a}; # save in binary mode
+
+my $url = url(shift || usage());
+my $argfile = shift;
+
+my $ua = new LWP::UserAgent;
+
+$ua->agent("lwp-download/0.1 " . $ua->agent);
+$ua->env_proxy;
+
+my $req = new HTTP::Request GET => $url;
+
+my $file;      # name of file we download into
+my $length;    # total number of bytes to download
+my $flength;   # formatted length
+my $size = 0;  # number of bytes received
+my $start_t;   # start time of download
+my $last_dur;  # time of last callback
+
+my $shown = 0; # have we called the show() function yet
+
+$SIG{INT} = sub { die "Interrupted\n"; };
+
+$| = 1;  # autoflush
+
+my $res = $ua->request($req,
+  sub {
+      unless($file) {
+	  my $res = $_[1];
+	  unless ($argfile) {
+	      # must find a suitable name to use.  First thing
+	      # to do is to look for the "Content-Disposition"
+	      # header defined by RFC1806.  This is also supported
+	      # by Netscape
+	      my $cd = $res->header("Content-Disposition");
+	      if ($cd && $cd =~ /\bfilename\s*=\s*(\S+)/) {
+		  $file = $1;
+		  $file =~ s/;$//;
+		  $file =~ s/^([\"\'])(.*)\1$/$2/;
+	      }
+		
+	      # if this fails we try to make something from the URL
+	      unless ($file) {
+		  my $req = $res->request;  # now always there
+		  my $rurl = $req ? $req->url : $url;
+		  
+		  $file = ($rurl->path_components)[-1];
+		  unless (length $file) {
+		      $file = "index";
+		      my $suffix = media_suffix($res->content_type);
+		      $file .= ".$suffix" if $suffix;
+		  } elsif ($rurl->scheme eq 'ftp' ||
+			   $file =~ /\.tgz$/      ||
+			   $file =~ /\.tar(\.(Z|gz))?$/
+			  ) {
+		      # leave the filename as it was
+		  } else {
+		      my $ct = guess_media_type($file);
+		      unless ($ct eq $res->content_type) {
+			  # need a better suffix for this type
+			  my $suffix = media_suffix($res->content_type);
+			  $file .= ".$suffix" if $suffix;
+		      }
+		  }
+	      }
+
+	      # Check if the file is already present
+	      if (-f $file && -t) {
+		  print "Overwrite $file? [y] ";
+		  my $ans = <STDIN>;
+		  exit if !defined($ans) || !($ans =~ /^y?\n/);
+	      } else {
+		  print "Saving to '$file'...\n";
+	      }
+	  } else {
+	      $file = $argfile;
+	  }
+	  open(FILE, ">$file") || die "Can't open $file: $!";
+          binmode FILE unless $opt_a;
+	  $length = $res->content_length;
+	  $flength = fbytes($length) if defined $length;
+	  $start_t = time;
+	  $last_dur = 0;
+      }
+      $size += length($_[0]);
+      print FILE $_[0];
+      if (defined $length) {
+	  my $dur  = time - $start_t;
+	  if ($dur != $last_dur) {  # don't update too often
+	      $last_dur = $dur;
+	      my $perc = $size / $length;
+	      my $speed;
+	      $speed = fbytes($size/$dur) . "/sec" if $dur > 3;
+	      my $secs_left = fduration($dur/$perc - $dur);
+	      $perc = int($perc*100);
+	      my $show = "$perc% of $flength";
+	      $show .= " (at $speed, $secs_left remaining)" if $speed;
+	      show($show);
+	  }
+      } else {
+	  show( fbytes($size) . " received");
+      }
+  }
+);
+
+if ($res->is_success || $res->message =~ /^Interrupted/) {
+    show("");  # clear text
+    print "\r";
+    print fbytes($size);
+    print " of ", fbytes($length) if defined($length) && $length != $size;
+    print " received";
+    my $dur = time - $start_t;
+    if ($dur) {
+	my $speed = fbytes($size/$dur) . "/sec";
+	print " in ", fduration($dur), " ($speed)";
+    }
+    print "\n";
+    my $died = $res->header("X-Died");
+    if ($died || !$res->is_success) {
+	if (-t) {
+	    print "Transfer aborted.  Delete $file? [n] ";
+	    my $ans = <STDIN>;
+	    unlink($file) if defined($ans) && $ans =~ /^y\n/;
+	} else {
+	    print "Transfer aborted, $file kept\n";
+	}
+    }
+} else {
+    print "\n" if $shown;
+    print "$progname: Can't download: ", $res->code, " ", $res->message, "\n";
+    exit 1;
+}
+
+
+sub fbytes
+{
+    my $n = int(shift);
+    if ($n >= 1024 * 1024) {
+	return sprintf "%.3g MB", $n / (1024.0 * 1024);
+    } elsif ($n >= 1024) {
+	return sprintf "%.3g KB", $n / 1024.0;
+    } else {
+	return "$n bytes";
+    }
+}
+
+sub fduration
+{
+    use integer;
+    my $secs = int(shift);
+    my $hours = $secs / (60*60);
+    $secs -= $hours * 60*60;
+    my $mins = $secs / 60;
+    $secs %= 60;
+    if ($hours) {
+	return "$hours hours $mins minutes";
+    } elsif ($mins >= 2) {
+	return "$mins minutes";
+    } else {
+	$secs += $mins * 60;
+	return "$secs seconds";
+    }
+}
+
+sub show
+{
+    my $mess = shift;
+    print "\r$mess", (" " x (75 - length $mess));
+    $shown++;
+}
+
+sub usage
+{
+    die "Usage: $progname [-a] <url> [<lpath>]\n";
+}
+!NO!SUBS!
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-mirror.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-mirror.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-mirror.PL	(revision 21083)
@@ -0,0 +1,120 @@
+use Config;
+use File::Basename qw(basename dirname);
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+	if ($Config{'osname'} eq 'VMS' or
+	    $Config{'osname'} eq 'OS2');  # "case-forgiving"
+open OUT,">$file" or die "Can't create $file: $!";
+chmod(0755, $file);
+print "Extracting $file (with variable substitutions)\n";
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'} -w
+
+!GROK!THIS!
+
+print OUT <<'!NO!SUBS!';
+# $Id$
+#
+# Simple mirror utility using LWP
+
+=head1 NAME
+
+lwp-mirror - Simple mirror utility for WWW
+
+=head1 SYNOPSIS
+
+ lwp-mirror [-v] [-t timeout] <url> <local file>
+
+=head1 DESCRIPTION
+
+This program can be used to mirror a document from a WWW server.  The
+document is only transfered if the remote copy is newer than the local
+copy.  If the local copy is newer nothing happens.
+
+Use the C<-v> option to print the version number of this program.
+
+The timeout value specified with the C<-t> option.  The timeout value
+is the time that the program will wait for response from the remote
+server before it fails.  The default unit for the timeout value is
+seconds.  You might append "m" or "h" to the timeout value to make it
+minutes or hours, repectively.
+
+Because this program is implemented using the LWP library, it only
+supports the protocols that LWP supports.
+
+=head1 SEE ALSO
+
+L<lwp-request>, L<LWP>
+
+=head1 AUTHOR
+
+Gisle Aas <aas@a.sn.no>
+
+=cut
+
+
+use LWP::Simple;
+use Getopt::Std;
+
+$progname = $0;
+$progname =~ s,.*/,,;  # use basename only
+$progname =~ s/\.\w*$//; #strip extension if any
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+$opt_h = undef;  # print usage
+$opt_v = undef;  # print version
+$opt_t = undef;  # timeout
+
+unless (getopts("hvt:")) {
+    usage();
+}
+
+if ($opt_v) {
+    require LWP;
+    my $DISTNAME = 'libwww-perl-' . LWP::Version();
+    die <<"EOT";
+This is lwp-mirror version $VERSION ($DISTNAME)
+
+Copyright 1995-1996, Gisle Aas.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+EOT
+}
+
+$url  = shift or usage();
+$file = shift or usage();
+usage() if $opt_h or @ARGV;
+
+if (defined $opt_t) {
+    $opt_t =~ /^(\d+)([smh])?/;
+    die "$progname: Illegal timeout value!\n" unless defined $1;
+    $timeout = $1;
+    $timeout *= 60   if ($2 eq "m");
+    $timeout *= 3600 if ($2 eq "h");
+    $LWP::Simple::ua->timeout($timeout);
+}
+
+$rc = mirror($url, $file);
+
+if ($rc == 304) {
+    print STDERR "$progname: $file is up to date\n"
+} elsif (!is_success($rc)) {
+    print STDERR "$progname: $rc ", status_message($rc), "   ($url)\n";
+    exit 1;
+}
+exit;
+
+
+sub usage
+{
+    die <<"EOT";
+Usage: $progname [-options] <url> <file>
+    -v           print version number of program
+    -t <timeout> Set timeout value
+EOT
+}
+!NO!SUBS!
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-request.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-request.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-request.PL	(revision 21083)
@@ -0,0 +1,521 @@
+use Config;
+use File::Basename qw(basename dirname);
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+	if ($Config{'osname'} eq 'VMS' or
+	    $Config{'osname'} eq 'OS2');  # "case-forgiving"
+open OUT,">$file" or die "Can't create $file: $!";
+chmod(0755, $file);
+print "Extracting $file (with variable substitutions)\n";
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'} -w
+
+!GROK!THIS!
+
+print OUT <<'!NO!SUBS!';
+# $Id$
+#
+# Simple user agent using LWP library.
+
+=head1 NAME
+
+lwp-request, GET, HEAD, POST - Simple WWW user agent
+
+=head1 SYNOPSIS
+
+ lwp-request [-aeEdvhx] [-m method] [-b <base URL>] [-t <timeout>]
+             [-i <if-modified-since>] [-c <content-type>] [-C <credentials>]
+             [-p <proxy-url>] [-o <format>] <url>...
+
+=head1 DESCRIPTION
+
+This program can be used to send requests to WWW servers and your
+local file system. The request content for POST, PUT and CHECKIN
+methods is read from stdin.  The content of the response is printed on
+stdout.  Error messages are printed on stderr.  The program returns a
+status value indicating the number of URLs that failed.
+
+The options are:
+
+=over 4
+
+=item -m <method>
+
+Set which method to use for the request.  If this option is not used,
+then the method is derived from the name of the program.
+
+=item -f
+
+Force request through, even if the program believes that the method is
+illegal.  The server will probably reject the request.
+
+=item -b <url>
+
+This URL will be used as the base URL for the URLs that the method is
+applied to.  The base URL only takes effect for relative URLs.  If you
+do not provide this option and the URLs are relative, then they will
+be treated as files in the local file system.
+
+=item -t <timeout>
+
+Set the timeout value for the requests.  The timeout is the amount of
+time that the program will wait for a response from the remote server
+before it fails.  The default unit for the timeout value is seconds.
+You might append "m" or "h" to the timeout value to make it minutes or
+hours, respectively.  The default timeout is '3m', i.e. 3 minutes.
+
+=item -i <time>
+
+Set the If-Modified-Since header in the request. If I<time> it the
+name of a file, use the modification timestamp for this file. If
+I<time> is not a file, it is parsed as a literal date. Take a look at
+L<HTTP::Date> for recogniced formats.
+
+=item -c <content-type>
+
+Set the Content-Type for the request.  This option is only allowed for
+requests that take a content, i.e. POST, PUT and CHECKIN.  You can
+force methods to take content by using the C<-f> option together with
+C<-c>.  The default Content-Type for POST is
+C<application/x-www-form-urlencoded>.  The default Content-type for
+the others is C<text/plain>.
+
+=item -p <proxy-url>
+
+Set the proxy to be used for the requests.  The program also loads
+proxy settings from the environment.  You can disable this with the
+C<-P> option.
+
+=item -C <username>:<password>
+
+Provide credentials for documents that are protected by Basic
+Authentication.  If the document is protected and you did not specify
+the username and password with this option, then you will be prompted
+to provide these values.
+
+=back
+
+The following options controls what is displayed by the program:
+
+=over 4
+
+=item -u
+
+Print request method and absolute URL as requests are made.
+
+=item -U
+
+Print request headers in addition to request method and absolute URL.
+
+=item -s
+
+Print response status code.  This option is always on for HEAD requests.
+
+=item -S
+
+Print response status chain. This shows redirect and autorization
+requests that are handled by the library.
+
+=item -e
+
+Print response headers.  This option is always on for HEAD requests.
+
+=item -d
+
+Do B<not> print the content of the response.
+
+=item -o <format>
+
+Process HTML content in various ways before printing it.  If the
+content type of the response is not HTML, then this option has no
+effect.  The legal format values are; I<text>, I<ps>, I<links>,
+I<html> and I<dump>.
+
+If you specify the I<text> format then the HTML will be formatted as
+plain latin1 text.  If you specify the I<ps> format then it will be
+formatted as Postscript.
+
+The I<links> format will output all links found in the HTML document.
+Relative links will be expanded to absolute ones.
+
+The I<html> format will reformat the HTML code and the I<dump> format
+will just dump the HTML syntax tree.
+
+=item -v
+
+Print the version number of the program and quit.
+
+=item -h
+
+Print usage message and quit.
+
+=item -x
+
+Extra debugging output.
+
+=item -a
+
+Set text(ascii) mode for content input and output.  If this option is not 
+used, content input and output is done in binary mode.
+
+=back
+
+Because this program is implemented using the LWP library, it will
+only support the protocols that LWP supports.
+
+=head1 SEE ALSO
+
+L<lwp-mirror>, L<LWP>
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 AUTHOR
+
+Gisle Aas <aas@sn.no>
+
+=cut
+
+$progname = $0;
+$progname =~ s,.*/,,;  # use basename only
+$progname =~ s/\.\w*$//; # strip extension, if any
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+
+require LWP;
+require LWP::Debug;
+require URI::URL;
+
+use URI::Heuristic qw(uf_url);
+
+use HTTP::Status qw(status_message);
+use HTTP::Date qw(time2str str2time);
+
+
+# This table lists the methods that are allowed.  It should really be
+# a superset for all methods supported for every scheme that may be
+# supported by the library.  Currently it might be a bit too HTTP
+# specific.  You might use the -f option to force a method through.
+#
+# "" = No content in request, "C" = Needs content in request
+#
+%allowed_methods = (
+    GET        => "",
+    HEAD       => "",
+    POST       => "C",
+    PUT        => "C",
+    DELETE     => "",
+    TRACE      => "",
+    OPTIONS    => "",
+);
+
+
+# We make our own specialization of LWP::UserAgent that asks for
+# user/password if document is protected.
+{
+    package RequestAgent;
+    @ISA = qw(LWP::UserAgent);
+
+    sub new
+    { 
+	my $self = LWP::UserAgent::new(@_);
+	$self->agent("lwp-request/$main::VERSION");
+	$self;
+    }
+
+    sub get_basic_credentials
+    {
+	my($self, $realm, $uri) = @_;
+	if ($main::opt_C) {
+	    return split(':', $main::opt_C, 2);
+	} elsif (-t) {
+	    my $netloc = $uri->netloc;
+	    print "Enter username for $realm at $netloc: ";
+	    my $user = <STDIN>;
+	    chomp($user);
+	    return (undef, undef) unless length $user;
+	    print "Password: ";
+	    system("stty -echo");
+	    my $password = <STDIN>;
+	    system("stty echo");
+	    print "\n";  # because we disabled echo
+	    chomp($password);
+	    return ($user, $password);
+	} else {
+	    return (undef, undef)
+	}
+    }
+}
+
+$method = uc(lc($progname) eq "lwp-request" ? "GET" : $progname);
+
+# Parse command line
+use Getopt::Std;
+
+$opt_a = undef;  # content i/o in text(ascii) mode
+$opt_m = undef;  # set method
+$opt_f = undef;  # make request even if method is not in %allowed_methods
+$opt_b = undef;  # base url
+$opt_t = undef;  # timeout
+$opt_i = undef;  # if-modified-since
+$opt_c = undef;  # content type for POST
+$opt_C = undef;  # credidentials for basic authorization
+
+$opt_u = undef;  # display method, URL and headers of request
+$opt_U = undef;  # display request headers also
+$opt_s = undef;  # display status code
+$opt_S = undef;  # display whole chain of status codes
+$opt_e = undef;  # display response headers (default for HEAD)
+$opt_d = undef;  # don't display content
+
+$opt_h = undef;  # print usage
+$opt_v = undef;  # print version
+
+$opt_x = undef;  # extra debugging info
+$opt_p = undef;  # proxy URL
+$opt_P = undef;  # don't load proxy setting from environment
+
+$opt_o = undef;  # output format
+
+unless (getopts("axhvuUsSedPp:b:t:i:c:C:m:fo:")) {
+    usage();
+}
+
+if ($opt_v) {
+    require LWP;
+    my $DISTNAME = 'libwww-perl-' . LWP::Version();
+    die <<"EOT";
+This is lwp-request version $VERSION ($DISTNAME)
+
+Copyright 1995-1997, Gisle Aas.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+EOT
+}
+
+usage() if $opt_h || !@ARGV;
+
+LWP::Debug::level('+') if $opt_x;
+
+# Create the user agent object
+$ua = new RequestAgent;
+
+# Load proxy settings from *_proxy environment variables.
+$ua->env_proxy unless $opt_P;
+
+$method = uc($opt_m) if defined $opt_m;
+
+if ($opt_f) {
+    if ($opt_c) {
+        $allowed_methods{$method} = "C";  # force content
+    } else {
+        $allowed_methods{$method} = "";
+    }
+} elsif (!defined $allowed_methods{$method}) {
+    die "$progname: $method is not an allowed method\n";
+}
+
+if ($method eq "HEAD") {
+    $opt_s = 1;
+    $opt_e = 1 unless $opt_d;
+    $opt_d = 1;
+}
+
+if (defined $opt_t) {
+    $opt_t =~ /^(\d+)([smh])?/;
+    die "$progname: Illegal timeout value!\n" unless defined $1;
+    $timeout = $1;
+    $timeout *= 60   if ($2 eq "m");
+    $timeout *= 3600 if ($2 eq "h");
+    $ua->timeout($timeout);
+}
+
+if (defined $opt_i) {
+    if (-e $opt_i) {
+        $time = (stat _)[9];
+    } else {
+        $time = str2time($opt_i);
+        die "$progname: Illegal time syntax for -i option\n"
+            unless defined $time;
+    }
+    $opt_i = time2str($time);
+}
+
+$content = undef;
+if ($allowed_methods{$method} eq "C") {
+    # This request needs some content
+    unless (defined $opt_c) {
+        # set default content type
+        $opt_c = ($method eq "POST") ?
+              "application/x-www-form-urlencoded"
+            : "text/plain";
+    } else {
+        die "$progname: Illegal Content-type format\n"
+            unless $opt_c =~ m,^[\w\-]+/[\w\-]+(?:\s*;.*)?$,
+    }
+    print "Please enter content ($opt_c) to be ${method}ed:\n"
+        if -t;
+    binmode STDIN unless -t or $opt_a;
+    $content = join("", <STDIN>);
+} else {
+    die "$progname: Can't set Content-type for $method requests\n"
+        if defined $opt_c;
+}
+
+# Set up a request.  We will use the same request object for all URLs.
+$request = new HTTP::Request $method;
+$request->header('If-Modified-Since', $opt_i) if defined $opt_i;
+#$request->header('Accept', '*/*');
+if ($opt_c) { # will always be set for request that wants content
+    $request->header('Content-Type', $opt_c);
+    $request->header('Content-Length', length $content);  # Not really needed
+    $request->content($content);
+}
+
+
+$errors = 0;
+
+# Ok, now we perform the requests, one URL at a time
+while ($url = shift) {
+    # Create the URL object, but protect us against bad URLs
+    eval {
+	if ($url =~ /^\w+:/ || $opt_b) {  # is there any scheme specification
+	    $url = URI::URL->new($url, $opt_b);
+	} else {
+	    $url = uf_url($url);
+        }
+    };
+    if ($@) {
+	$@ =~ s/at\s+\S+\s+line\s\d+//;
+	print STDERR $@;
+	$errors++;
+	next;
+    }
+
+    $ua->proxy($url->scheme, $opt_p) if $opt_p;
+
+    # Send the request and get a response back from the server
+    $request->url($url);
+    $response = $ua->request($request);
+
+    if ($opt_u || $opt_U) {
+        my $url = $response->request->url->as_string;
+        print "$method $url\n";
+        print $response->request->headers_as_string, "\n" if $opt_U;
+    }
+
+    if ($opt_S) {
+	printResponseChain($response);
+    } elsif ($opt_s) {
+        print $response->status_line, "\n";
+    }
+
+    if ($opt_e) {
+        # Display headers
+        print $response->headers_as_string;
+        print "\n";  # separate headers and content
+    }
+
+    if ($response->is_success) {
+	unless ($opt_d) {
+	    if ($opt_o &&
+		$response->content_type eq 'text/html') {
+		require HTML::Parse;
+		my $html = HTML::Parse::parse_html($response->content);
+		{
+		    $opt_o eq 'ps' && do {
+			require HTML::FormatPS;
+			my $f = new HTML::FormatPS;
+			print $f->format($html);
+			last;
+		    };
+		    $opt_o eq 'text' && do {
+			require HTML::FormatText;
+			my $f = new HTML::FormatText;
+			print $f->format($html);
+			last;
+		    };
+		    $opt_o eq 'html' && do {
+			print $html->as_HTML;
+			last;
+		    };
+		    $opt_o eq 'links' && do {
+			my $base = $response->base;
+			for ( @{ $html->extract_links } ) {
+			    my($link, $elem) = @$_;
+			    my $tag = uc $elem->tag;
+			    $link = new URI::URL $link, $base;
+			    print "$tag\t", $link->abs->as_string, "\n";
+			}
+			last;
+		    };
+		    $opt_o eq 'dump' && do {
+			$html->dump;
+			last;
+		    };
+		    # It is bad to not notice this before now :-(
+		    die "Illegal -o option value ($opt_o)\n";
+		}
+	    } else {
+                binmode STDOUT unless $opt_a;
+		print $response->content;
+	    }
+	}
+    } else {
+        print STDERR $response->error_as_HTML unless $opt_d;
+        $errors++;
+    }
+}
+
+exit $errors;
+
+
+sub printResponseChain
+{
+    my($response) = @_;
+    return unless defined $response;
+    printResponseChain($response->previous);
+    my $method = $response->request->method;
+    my $url = $response->request->url->as_string;
+    my $code = $response->code;
+    print "$method $url --> ", $response->status_line, "\n";
+}
+
+
+sub usage
+{
+    die <<"EOT";
+Usage: $progname [-options] <url>...
+    -m <method>   use method for the request (default is '$method')
+    -f            make request even if $progname believes method is illegal
+    -b <base>     Use the specified URL as base
+    -t <timeout>  Set timeout value
+    -i <time>     Set the If-Modified-Since header on the request
+    -c <conttype> use this content-type for POST, PUT, CHECKIN
+    -a            Use text mode for content I/O
+    -p <proxyurl> use this as a proxy
+    -P            don't load proxy settings from environment
+
+    -u            Display method and URL before any response
+    -U            Display request headers (implies -u)
+    -s            Display response status code
+    -S            Display response status chain
+    -e            Display response headers
+    -d            Do not display content
+    -o <format>   Process HTML content in various ways
+
+    -v            Show program version
+    -h            Print this message
+
+    -x            Extra debugging output
+EOT
+}
+!NO!SUBS!
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-rget.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-rget.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/bin/lwp-rget.PL	(revision 21083)
@@ -0,0 +1,600 @@
+use Config;
+use File::Basename qw(basename dirname);
+chdir(dirname($0));
+($file = basename($0)) =~ s/\.PL$//;
+$file =~ s/\.pl$//
+	if ($Config{'osname'} eq 'VMS' or
+	    $Config{'osname'} eq 'OS2');  # "case-forgiving"
+open OUT,">$file" or die "Can't create $file: $!";
+chmod(0755, $file);
+print "Extracting $file (with variable substitutions)\n";
+
+print OUT <<"!GROK!THIS!";
+$Config{'startperl'} -w
+
+!GROK!THIS!
+
+print OUT <<'!NO!SUBS!';
+#line 18
+
+=head1 NAME
+
+lwp-rget - Retrieve WWW documents recursively
+
+=head1 SYNOPSIS
+
+ lwp-rget [--verbose] [--auth=USER:PASS] [--depth=N] [--hier] [--iis]
+	  [--keepext=mime/type[,mime/type]] [--limit=N] [--nospace]
+	  [--prefix=URL] [--sleep=N] [--tolower] <URL>
+ lwp-rget --version
+
+=head1 DESCRIPTION
+
+This program will retrieve a document and store it in a local file.  It
+will follow any links found in the document and store these documents
+as well, patching links so that they refer to these local copies.
+This process continues until there are no more unvisited links or the
+process is stopped by the one or more of the limits which can be
+controlled by the command line arguments.
+
+This program is useful if you want to make a local copy of a
+collection of documents or want to do web reading off-line.
+
+All documents are stored as plain files in the current directory. The
+file names chosen are derived from the last component of URL paths.
+
+The options are:
+
+=over 3
+
+=item --auth=USER:PASS<n>
+
+Set the authentication credentials to user "USER" and password "PASS" if
+any restricted parts of the web site are hit.  If there are restricted
+parts of the web site and authentication credentials are not available,
+those pages will not be downloaded.
+
+=item --depth=I<n>
+
+Limit the recursive level. Embedded images are always loaded, even if
+they fall outside the I<--depth>. This means that one can use
+I<--depth=0> in order to fetch a single document together with all
+inline graphics.
+
+The default depth is 5.
+
+=item --hier
+
+Download files into a hierarchy that mimics the web site structure.
+The default is to put all files in the current directory.
+
+=item --iis
+
+Sends an "Accept: */*" on all URL requests as a workaround for a bug in
+IIS 2.0.  If no Accept MIME header is present, IIS 2.0 returns with a
+"406 No acceptable objects were found" error.  Also converts any back
+slashes (\\) in URLs to forward slashes (/).
+
+=item --keepext=I<mime/type[,mime/type]>
+
+Keeps the current extension for the list MIME types.  Useful when
+downloading text/plain documents that shouldn't all be translated to
+*.txt files.
+
+=item --limit=I<n>
+
+Limit the number of documents to get.  The default limit is 50.
+
+=item --nospace
+
+Changes spaces in all URLs to underscore characters (_).  Useful when
+downloading files from sites serving URLs with spaces in them.	Does not
+remove spaces from fragments, e.g., "file.html#somewhere in here".
+
+=item --prefix=I<url_prefix>
+
+Limit the links to follow. Only URLs that start the prefix string are
+followed.
+
+The default prefix is set as the "directory" of the initial URL to
+follow.	 For instance if we start lwp-rget with the URL
+C<http://www.sn.no/foo/bar.html>, then prefix will be set to
+C<http://www.sn.no/foo/>.
+
+Use C<--prefix=''> if you don't want the fetching to be limited by any
+prefix.
+
+=item --sleep=I<n>
+
+Sleep I<n> seconds before retrieving each document. This options allows
+you to go slowly, not loading the server you visiting too much.
+
+=item --tolower
+
+Translates all links to lowercase.  Useful when downloading files from
+IIS since it does not serve files in a case sensitive manner.
+
+=item --verbose
+
+Make more noise while running.
+
+=item --quiet
+
+Don't make any noise.
+
+=item --version
+
+Print program version number and quit.
+
+=item --help
+
+Print the usage message and quit.
+
+=back
+
+Before the program exits the name of the file, where the initial URL
+is stored, is printed on stdout.  All used filenames are also printed
+on stderr as they are loaded.  This printing can be suppressed with
+the I<--quiet> option.
+
+=head1 SEE ALSO
+
+L<lwp-request>, L<LWP>
+
+=head1 AUTHOR
+
+Gisle Aas <aas@sn.no>
+
+=cut
+
+use strict;
+
+use Getopt::Long    qw(GetOptions);
+use URI::URL	    qw(url);
+use LWP::MediaTypes qw(media_suffix);
+
+use vars qw($VERSION);
+use vars qw($MAX_DEPTH $MAX_DOCS $PREFIX $VERBOSE $QUIET $SLEEP $HIER $AUTH $IIS $TOLOWER $NOSPACE %KEEPEXT);
+
+my $progname = $0;
+$progname =~ s|.*/||;  # only basename left
+$progname =~ s/\.\w*$//; #strip extension if any
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+#$Getopt::Long::debug = 1;
+#$Getopt::Long::ignorecase = 0;
+
+# Defaults
+$MAX_DEPTH = 5;
+$MAX_DOCS  = 50;
+
+GetOptions('version'  => \&print_version,
+	   'help'     => \&usage,
+	   'depth=i'  => \$MAX_DEPTH,
+	   'limit=i'  => \$MAX_DOCS,
+	   'verbose!' => \$VERBOSE,
+	   'quiet!'   => \$QUIET,
+	   'sleep=i'  => \$SLEEP,
+	   'prefix:s' => \$PREFIX,
+	   'hier'     => \$HIER,
+	   'auth=s'   => \$AUTH,
+	   'iis'      => \$IIS,
+	   'tolower'  => \$TOLOWER,
+	   'nospace'  => \$NOSPACE,
+	   'keepext=s' => \$KEEPEXT{'OPT'},
+	  ) || usage();
+
+sub print_version {
+    require LWP;
+    my $DISTNAME = 'libwww-perl-' . LWP::Version();
+    print <<"EOT";
+This is lwp-rget version $VERSION ($DISTNAME)
+
+Copyright 1996-1998, Gisle Aas.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+EOT
+    exit 0;
+}
+
+my $start_url = shift || usage();
+usage() if @ARGV;
+
+require LWP::UserAgent;
+my $ua = new LWP::UserAgent;
+$ua->agent("$progname/$VERSION " . $ua->agent);
+$ua->env_proxy;
+
+unless (defined $PREFIX) {
+    $PREFIX = url($start_url);	 # limit to URLs below this one
+    eval {
+	$PREFIX->eparams(undef);
+	$PREFIX->equery(undef);
+    };
+
+    $_ = $PREFIX->epath;
+    s|[^/]+$||;
+    $PREFIX->epath($_);
+    $PREFIX = $PREFIX->as_string;
+}
+
+%KEEPEXT = map { lc($_) => 1 } split(/\s*,\s*/, $KEEPEXT{'OPT'});
+
+print <<"" if $VERBOSE;
+START	  = $start_url
+MAX_DEPTH = $MAX_DEPTH
+MAX_DOCS  = $MAX_DOCS
+PREFIX	  = $PREFIX
+
+
+my $no_docs = 0;
+my %seen = ();	   # mapping from URL => local_file
+
+my $filename = fetch($start_url);
+print "$filename\n" unless $QUIET;
+
+sub fetch
+{
+    my($url, $type, $depth) = @_;
+
+    # Fix http://sitename.com/../blah/blah.html to
+    #	  http://sitename.com/blah/blah.html
+    $url = $url->as_string if (ref($url));
+    while ($url =~ s#(https?://[^/]+/)\.\.\/#$1#) {}
+
+    # Fix backslashes (\) in URL if $IIS defined
+    $url = fix_backslashes($url) if (defined $IIS);
+
+    $url = url($url) unless ref($url);
+    $type  ||= 'a';
+    # Might be the background attribute
+    $type = 'img' if ($type eq 'body' || $type eq 'td');
+    $depth ||= 0;
+
+    # Print the URL before we start checking...
+    my $out = (" " x $depth) . $url . " ";
+    $out .= "." x (60 - length($out));
+    print STDERR $out . " " if $VERBOSE;
+
+    # Can't get mailto things
+    if ($url->scheme eq 'mailto') {
+	print STDERR "*skipping mailto*\n" if $VERBOSE;
+	return $url->as_string;
+    }
+
+    # The $plain_url is a URL without the fragment part
+    my $plain_url = $url->clone;
+    $plain_url->frag(undef);
+
+    # Check PREFIX, but not for <IMG ...> links
+    if ($type ne 'img' and  $url->as_string !~ /^\Q$PREFIX/o) {
+	print STDERR "*outsider*\n" if $VERBOSE;
+	return $url->as_string;
+    }
+
+    # Translate URL to lowercase if $TOLOWER defined
+    $plain_url = to_lower($plain_url) if (defined $TOLOWER);
+
+    # If we already have it, then there is nothing to be done
+    my $seen = $seen{$plain_url->as_string};
+    if ($seen) {
+	my $frag = $url->frag;
+	$seen .= "#$frag" if defined($frag);
+	$seen = protect_frag_spaces($seen);
+	print STDERR "$seen (again)\n" if $VERBOSE;
+	return $seen;
+    }
+
+    # Too much or too deep
+    if ($depth > $MAX_DEPTH and $type ne 'img') {
+	print STDERR "*too deep*\n" if $VERBOSE;
+	return $url;
+    }
+    if ($no_docs > $MAX_DOCS) {
+	print STDERR "*too many*\n" if $VERBOSE;
+	return $url;
+    }
+
+    # Fetch document 
+    $no_docs++;
+    sleep($SLEEP) if $SLEEP;
+    my $req = HTTP::Request->new(GET => $url);
+    # See: http://ftp.sunet.se/pub/NT/mirror-microsoft/kb/Q163/7/74.TXT
+    $req->header ('Accept', '*/*') if (defined $IIS);  # GIF/JPG from IIS 2.0
+    $req->authorization_basic(split (/:/, $AUTH)) if (defined $AUTH);
+    my $res = $ua->request($req);
+
+    # Check outcome
+    if ($res->is_success) {
+	my $doc = $res->content;
+	my $ct = $res->content_type;
+	my $name = find_name($res->request->url, $ct);
+	print STDERR "$name\n" unless $QUIET;
+	$seen{$plain_url->as_string} = $name;
+
+	# If the file is HTML, then we look for internal links
+	if ($ct eq "text/html") {
+	    # Save an unprosessed version of the HTML document.	 This
+	    # both reserves the name used, and it also ensures that we
+	    # don't loose everything if this program is killed before
+	    # we finish.
+	    save($name, $doc);
+	    my $base = $res->base;
+
+	    # Follow and substitute links...
+	    $doc =~
+s/
+  (
+    <(img|a|body|area|frame|td)\b   # some interesting tag
+    [^>]+			    # still inside tag (not strictly correct)
+    \b(?:src|href|background)	    # some link attribute
+    \s*=\s*			    # =
+  )
+    (?:				    # scope of OR-ing
+	 (")([^"]*)"	|	    # value in double quotes  OR
+	 (')([^']*)'	|	    # value in single quotes  OR
+	    ([^\s>]+)		    # quoteless value
+    )
+/
+  new_link($1, lc($2), $3||$5, $4||$6||$7, $base, $name, $depth+1)
+/giex;
+	   # XXX
+	   # The regular expression above is not strictly correct.
+	   # It is not really possible to parse HTML with a single
+	   # regular expression, but it is faster.  Tags that might
+	   # confuse us include:
+	   #	<a alt="href" href=link.html>
+	   #	<a alt=">" href="link.html">
+	   #
+	}
+	save($name, $doc);
+	return $name;
+    } else {
+	print STDERR $res->code . " " . $res->message . "\n" if $VERBOSE;
+	$seen{$plain_url->as_string} = $url->as_string;
+	return $url->as_string;
+    }
+}
+
+sub new_link
+{
+    my($pre, $type, $quote, $url, $base, $localbase, $depth) = @_;
+
+    $url = protect_frag_spaces($url);
+
+    $url = fetch(url($url, $base)->abs, $type, $depth);
+    $url = url("file:$url", "file:$localbase")->rel
+	unless $url =~ /^[.+\-\w]+:/;
+
+    $url = unprotect_frag_spaces($url);
+
+    return $pre . $quote . $url . $quote;
+}
+
+
+sub protect_frag_spaces
+{
+    my ($url) = @_;
+
+    $url = $url->as_string if (ref($url));
+
+    if ($url =~ m/^([^#]*#)(.+)$/)
+    {
+      my ($base, $frag) = ($1, $2);
+      $frag =~ s/ /%20/g;
+      $url = $base . $frag;
+    }
+
+    return $url;
+}
+
+
+sub unprotect_frag_spaces
+{
+    my ($url) = @_;
+
+    $url = $url->as_string if (ref($url));
+
+    if ($url =~ m/^([^#]*#)(.+)$/)
+    {
+      my ($base, $frag) = ($1, $2);
+      $frag =~ s/%20/ /g;
+      $url = $base . $frag;
+    }
+
+    return $url;
+}
+
+
+sub fix_backslashes
+{
+    my ($url) = @_;
+    my ($base, $frag);
+
+    $url = $url->as_string if (ref($url));
+
+    if ($url =~ m/([^#]+)(#.*)/)
+    {
+      ($base, $frag) = ($1, $2);
+    }
+    else
+    {
+      $base = $url;
+      $frag = "";
+    }
+
+    $base =~ tr/\\/\//;
+    $base =~ s/%5[cC]/\//g;	# URL-encoded back slash is %5C
+
+    return $base . $frag;
+}
+
+
+sub to_lower
+{
+    my ($url) = @_;
+    my $was_object = 0;
+
+    if (ref($url))
+    {
+      $url = $url->as_string;
+      $was_object = 1;
+    }
+
+    if ($url =~ m/([^#]+)(#.*)/)
+    {
+      $url = lc($1) . $2;
+    }
+    else
+    {
+      $url = lc($url);
+    }
+
+    if ($was_object == 1)
+    {
+      return url($url);
+    }
+    else
+    {
+      return $url;
+    }
+}
+
+
+sub translate_spaces
+{
+    my ($url) = @_;
+    my ($base, $frag);
+
+    $url = $url->as_string if (ref($url));
+
+    if ($url =~ m/([^#]+)(#.*)/)
+    {
+      ($base, $frag) = ($1, $2);
+    }
+    else
+    {
+      $base = $url;
+      $frag = "";
+    }
+
+    $base =~ s/^ *//;	# Remove initial spaces from base
+    $base =~ s/ *$//;	# Remove trailing spaces from base
+
+    $base =~ tr/ /_/;
+    $base =~ s/%20/_/g; # URL-encoded space is %20
+
+    return $base . $frag;
+}
+
+
+sub mkdirp
+{
+    my($directory, $mode) = @_;
+    my @dirs = split(/\//, $directory);
+    my $path = shift(@dirs);   # build it as we go
+    my $result = 1;   # assume it will work
+
+    unless (-d $path) {
+	$result &&= mkdir($path, $mode);
+    }
+
+    foreach (@dirs) {
+	$path .= "/$_";
+	if ( ! -d $path) {
+	    $result &&= mkdir($path, $mode);
+	}
+    }
+
+    return $result;
+}
+
+
+sub find_name
+{
+    my($url, $type) = @_;
+    #print "find_name($url, $type)\n";
+
+    # Translate spaces in URL to underscores (_) if $NOSPACE defined
+    $url = translate_spaces($url) if (defined $NOSPACE);
+
+    # Translate URL to lowercase if $TOLOWER defined
+    $url = to_lower($url) if (defined $TOLOWER);
+
+    $url = url($url) unless ref($url);
+
+    my $path = $url->path;
+
+    # trim path until only the basename is left
+    $path =~ s|(.*/)||;
+    my $dirname = ".$1";
+    if (!$HIER) {
+	$dirname = "";
+    } elsif (! -d $dirname) {
+	mkdirp($dirname, 0775);
+    }
+
+    my $extra = "";  # something to make the name unique
+    my $suffix;
+
+    if ($KEEPEXT{lc($type)}) {
+        $suffix = ($path =~ m/\.(.*)/) ? $1 : "";
+    } else {
+        $suffix = media_suffix($type);
+    }
+
+    $path =~ s|\..*||;	# trim suffix
+    $path = "index" unless length $path;
+
+    while (1) {
+	# Construct a new file name
+	my $file = $dirname . $path . $extra;
+	$file .= ".$suffix" if $suffix;
+	# Check if it is unique
+	return $file unless -f $file;
+
+	# Try something extra
+	unless ($extra) {
+	    $extra = "001";
+	    next;
+	}
+	$extra++;
+    }
+}
+
+
+sub save
+{
+    my $name = shift;
+    #print "save($name,...)\n";
+    open(FILE, ">$name") || die "Can't save $name: $!";
+    binmode FILE;
+    print FILE $_[0];
+    close(FILE);
+}
+
+
+sub usage
+{
+    die <<"";
+Usage: $progname [options] <URL>
+Allowed options are:
+  --auth=USER:PASS  Set authentication credentials for web site
+  --depth=N	    Maximum depth to traverse (default is $MAX_DEPTH)
+  --hier	    Download into hierarchy (not all files into cwd)
+  --iis		    Workaround IIS 2.0 bug by sending "Accept: */*" MIME
+		    header; translates backslashes (\\) to forward slashes (/)
+  --keepext=type    Keep file extension for MIME types (comma-separated list)
+  --limit=N	    A limit on the number documents to get (default is $MAX_DOCS)
+  --nospace	    Translate spaces URLs (not #fragments) to underscores (_)
+  --version	    Print version number and quit
+  --verbose	    More output
+  --quiet	    No output
+  --sleep=SECS	    Sleep between gets, ie. go slowly
+  --prefix=PREFIX   Limit URLs to follow to those which begin with PREFIX
+  --tolower	    Translate all URLs to lowercase (useful with IIS servers)
+
+}
+!NO!SUBS!
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/install.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/install.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/install.sh	(revision 21083)
@@ -0,0 +1,10 @@
+#!/bin/sh -v
+
+export PERL5LIB=$GSDLHOME/perllib/cpan/lib:$PERL5LIB
+export PATH=$GSDLHOME/perllib/cpan/bin:$PATH
+
+perl Makefile.PL PREFIX=$GSDLHOME/perllib/cpan
+
+make
+make test
+make install
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/Bundle/LWP.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/Bundle/LWP.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/Bundle/LWP.pm	(revision 21083)
@@ -0,0 +1,38 @@
+package Bundle::LWP;
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+1;
+
+__END__
+
+=head1 NAME
+
+Bundle::LWP - A bundle to install all libwww-perl related modules
+
+=head1 SYNOPSIS
+
+ perl -MCPAN -e 'install Bundle::LWP'
+
+=head1 CONTENTS
+
+Net::FTP 2.00      - If you want ftp://-support
+
+MIME::Base64       - Used in authentication headers
+
+MD5                - Needed to do Digest authentication
+
+HTML::HeadParser   - To get the correct $res->base
+
+LWP                - The reason why you need the modules above
+
+=head1 DESCRIPTION
+
+This bundle defines all reqreq modules for libwww-perl.
+
+
+=head1 AUTHOR
+
+Gisle Aas E<lt>aas@sn.no>
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/File/Listing.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/File/Listing.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/File/Listing.pm	(revision 21083)
@@ -0,0 +1,314 @@
+#
+# $Id$
+
+package File::Listing;
+
+sub Version { $VERSION; }
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+=head1 NAME
+
+parse_dir - parse directory listing
+
+=head1 SYNOPSIS
+
+ use File::Listing;
+ for (parse_dir(`ls -l`)) {
+     ($name, $type, $size, $mtime, $mode) = @$_;
+     next if $type ne 'f'; # plain file
+     #...
+ }
+
+ # directory listing can also be read from a file
+ open(LISTING, "zcat ls-lR.gz|");
+ $dir = parse_dir(\*LISTING, '+0000');
+
+=head1 DESCRIPTION
+
+The parse_dir() routine can be used to parse directory
+listings. Currently it only understand Unix C<'ls -l'> and C<'ls -lR'>
+format.  It should eventually be able to most things you might get
+back from a ftp server file listing (LIST command), i.e. VMS listings,
+NT listings, DOS listings,...
+
+The first parameter to parse_dir() is the directory listing to parse.
+It can be a scalar, a reference to an array of directory lines or a
+glob representing a filehandle to read the directory listing from.
+
+The second parameter is the time zone to use when parsing time stamps
+in the listing. If this value is undefined, then the local time zone is
+assumed.
+
+The third parameter is the type of listing to assume.  The values will
+be strings like 'unix', 'vms', 'dos'.  Currently only 'unix' is
+implemented and this is also the default value.  Ideally, the listing
+type should be determined automatically.
+
+The fourth parameter specify how unparseable lines should be treated.
+Values can be 'ignore', 'warn' or a code reference.  Warn means that
+the perl warn() function will be called.  If a code reference is
+passed, then this routine will be called and the return value from it
+will be incorporated in the listing.  The default is 'ignore'.
+
+Only the first parameter is mandatory.  The parse_dir() prototype is
+($;$$$).
+
+The return value from parse_dir() is a list of directory entries.  In
+scalar context the return value is a reference to the list.  The
+directory entries are represented by an array consisting of [
+$filename, $filetype, $filesize, $filetime, $filemode ].  The
+$filetype value is one of the letters 'f', 'd', 'l' or '?'.  The
+$filetime value is converted to seconds since Jan 1, 1970.  The
+$filemode is a bitmask like the mode returned by stat().
+
+=head1 CREDITS
+
+Based on lsparse.pl (from Lee McLoughlin's ftp mirror package) and
+Net::FTP's parse_dir (Graham Barr).
+
+=cut
+
+require Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(parse_dir);
+
+use strict;
+
+use Carp ();
+use HTTP::Date qw(str2time);
+
+sub parse_dir ($;$$$)
+{
+   my($dir, $tz, $fstype, $error) = @_;
+
+   $fstype ||= 'unix';
+   $fstype = "File::Listing::" . lc $fstype;
+
+   my @args = $_[0];
+   push(@args, $tz) if(@_ >= 2);
+   push(@args, $error) if(@_ >= 4);
+
+   $fstype->parse(@args);
+}
+
+sub line { Carp::croak("Not implemented yet"); }
+sub init { } # Dummy sub
+
+sub file_mode ($)
+{
+    # This routine was originally borrowed from Graham Barr's
+    # Net::FTP package.
+
+    local $_ = shift;
+    my $mode = 0;
+    my($type,$ch);
+
+    s/^(.)// and $type = $1;
+
+    while (/(.)/g) {
+	$mode <<= 1;
+	$mode |= 1 if $1 ne "-" &&
+		      $1 ne 'S' &&
+		      $1 ne 't' &&
+		      $1 ne 'T';
+    }
+
+    $type eq "d" and $mode |= 0040000 or	# Directory
+      $type eq "l" and $mode |= 0120000 or	# Symbolic Link
+	$mode |= 0100000;			# Regular File
+
+    $mode |= 0004000 if /^...s....../i;
+    $mode |= 0002000 if /^......s.../i;
+    $mode |= 0001000 if /^.........t/i;
+
+    $mode;
+}
+
+sub parse
+{
+   my($pkg, $dir, $tz, $error) = @_;
+
+   # First let's try to determine what kind of dir parameter we have
+   # received.  We allow both listings, reference to arrays and
+   # file handles to read from.
+
+   if (ref($dir) eq 'ARRAY') {
+       # Already splitted up
+   } elsif (ref($dir) eq 'GLOB') {
+       # A file handle
+   } elsif (ref($dir)) {
+      Carp::croak("Illegal argument to parse_dir()");
+   } elsif ($dir =~ /^\*\w+(::\w+)+$/) {
+      # This scalar looks like a file handle, so we assume it is
+   } else {
+      # A normal scalar listing
+      $dir = [ split(/\n/, $dir) ];
+   }
+
+   $pkg->init();
+
+   my @files = ();
+   if (ref($dir) eq 'ARRAY') {
+       for (@$dir) {
+	   push(@files, $pkg->line($_, $tz, $error));
+       }
+   } else {
+       local($_);
+       while (<$dir>) {
+	   chomp;
+	   push(@files, $pkg->line($_, $tz, $error));
+       }
+   }
+   wantarray ? @files : \@files;
+}
+
+
+package File::Listing::unix;
+
+use HTTP::Date qw(str2time);
+
+# A place to remember current directory from last line parsed.
+use vars qw($curdir);
+no strict qw(vars);
+
+@ISA = qw(File::Listing);
+
+
+sub init
+{
+    $curdir = '';
+}
+
+sub line
+{
+    shift; # package name
+    local($_) = shift;
+    my($tz, $error) = @_;
+
+    s/\015//g;
+    #study;
+
+    my ($kind, $size, $date, $name);
+    if (($kind, $size, $date, $name) =
+	/^([\-FlrwxsStTdD]{10})                   # Type and permission bits
+	 .*                                       # Graps
+	 \D(\d+)                                  # File size
+	 \s+                                      # Some space
+	 (\w{3}\s+\d+\s+(?:\d{1,2}:\d{2}|\d{4}))  # Date
+	 \s+                                      # Some more space
+	 (.*)$                                    # File name
+	/x )
+
+    {
+	return if $name eq '.' || $name eq '..';
+	$name = "$curdir/$name" if length $curdir;
+	my $type = '?';
+	if ($kind =~ /^l/ && $name =~ /(.*) -> (.*)/ ) {
+	    $name = $1;
+	    $type = "l $2";
+	} elsif ($kind =~ /^[\-F]/) { # (hopefully) a regular file
+	    $type = 'f';
+	} elsif ($kind =~ /^[dD]/) {
+	    $type = 'd';
+	    $size = undef;  # Don't believe the reported size
+	}
+	return [$name, $type, $size, str2time($date, $tz), 
+              File::Listing::file_mode($kind)];
+
+    } elsif (/^(.+):$/ && !/^[dcbsp].*\s.*\s.*:$/ ) {
+	my $dir = $1;
+	return () if $dir eq '.';
+	$curdir = $dir;
+	return ();
+    } elsif (/^[Tt]otal\s+(\d+)$/ || /^\s*$/) {
+	return ();
+    } elsif (/not found/    || # OSF1, HPUX, and SunOS return
+             # "$file not found"
+             /No such file/ || # IRIX returns
+             # "UX:ls: ERROR: Cannot access $file: No such file or directory"
+                               # Solaris returns
+             # "$file: No such file or directory"
+             /cannot find/     # Windows NT returns
+             # "The system cannot find the path specified."
+             ) {
+	return () unless defined $error;
+	&$error($_) if ref($error) eq 'CODE';
+	warn "Error: $_\n" if $error eq 'warn';
+	return ();
+    } elsif ($_ eq '') {       # AIX, and Linux return nothing
+	return () unless defined $error;
+	&$error("No such file or directory") if ref($error) eq 'CODE';
+	warn "Warning: No such file or directory\n" if $error eq 'warn';
+	return ();
+    } else {
+        # parse failed, check if the dosftp parse understands it
+        return(File::Listing::dosftp->line($_,$tz,$error));
+    }
+
+}
+
+package File::Listing::dosftp;
+
+use HTTP::Date qw(str2time);
+
+# A place to remember current directory from last line parsed.
+use vars qw($curdir);
+no strict qw(vars);
+
+@ISA = qw(File::Listing);
+
+sub init
+{
+    $curdir = '';
+}
+
+sub line
+{
+    shift; # package name
+    local($_) = shift;
+    my($tz, $error) = @_;
+
+    s/\015//g;
+
+    my ($kind, $size, $date, $name);
+
+    # 02-05-96  10:48AM                 1415 src.slf
+    # 09-10-96  09:18AM       <DIR>          sl_util
+    if (($date,$size_or_dir,$name) =
+        /^(\d\d-\d\d-\d\d\s+\d\d:\d\d\wM)         # Date and time info
+         \s+                                      # Some space
+         (<\w{3}>|\d+)                            # Dir or Size
+         \s+                                      # Some more space
+         (.+)$                                    # File name
+        /x )
+    {
+	return if $name eq '.' || $name eq '..';
+	$name = "$curdir/$name" if length $curdir;
+	my $type = '?';
+	if ($size_or_dir eq '<DIR>') {
+	    $type = "d";
+            $size = ""; # directories have no size in the pc listing
+        } else {
+	    $type = 'f';
+            $size = $size_or_dir;
+	}
+	return [$name, $type, $size, str2time($date, $tz),
+              File::Listing::file_mode($kind)];
+
+    } else {
+	return () unless defined $error;
+	&$error($_) if ref($error) eq 'CODE';
+	warn "Can't parse: $_\n" if $error eq 'warn';
+	return ();
+    }
+
+}
+
+package File::Listing::vms;
+@File::Listing::unix::ISA = qw(File::Listing);
+
+package File::Listing::netware;
+@File::Listing::unix::ISA = qw(File::Listing);
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Cookies.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Cookies.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Cookies.pm	(revision 21083)
@@ -0,0 +1,725 @@
+package HTTP::Cookies;
+
+# Based on draft-ietf-http-state-man-mec-08.txt and
+# http://www.netscape.com/newsref/std/cookie_spec.html
+
+use strict;
+use HTTP::Date qw(str2time time2str);
+use HTTP::Headers::Util qw(split_header_words join_header_words);
+use LWP::Debug ();
+
+use vars qw($VERSION);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+=head1 NAME
+
+HTTP::Cookies - Cookie storage and management
+
+=head1 SYNOPSIS
+
+ use HTTP::Cookies;
+ $cookie_jar = HTTP::Cookies->new;
+
+ $cookie_jar->add_cookie_header($request);
+ $cookie_jar->extract_cookies($response);
+
+=head1 DESCRIPTION
+
+Cookies are a general mechanism which server side connections can use
+to both store and retrieve information on the client side of the
+connection.  For more information about cookies referrer to
+<URL:http://www.netscape.com/newsref/std/cookie_spec.html> and
+<URL:http://www.cookiecentral.com/>.  This module also implements the
+new style cookies as described in I<draft-ietf-http-state-man-mec-08.txt>.
+The two variants of cookies is supposed to be able to coexist happily.
+
+Instances of the class I<HTTP::Cookies> are able to store a collection
+of Set-Cookie2: and Set-Cookie:-headers and is able to use this
+information to initialize Cookie-headers in I<HTTP::Request> objects.
+The state of the I<HTTP::Cookies> can be saved and restored from
+files.
+
+=head1 METHODS
+
+The following methods are provided:
+
+=over 4
+
+=cut
+
+# A HTTP::Cookies object is a hash.  The main attribute is the
+# COOKIES 3 level hash:  $self->{COOKIES}{$domain}{$path}{$key}.
+
+
+=item $cookie_jar = HTTP::Cookies->new;
+
+The constructor.  Takes hash style parameters.  The following
+parameters are recognized:
+
+  file:            name of the file to restore and save cookies to
+  autosave:        should we save during destruction (bool)
+  ignore_discard:  save even cookies that are requested to be discarded (bool)
+
+Future parameters might include (not yet implemented):
+
+  max_cookies               300
+  max_cookies_per_domain    20
+  max_cookie_size           4096
+
+  no_cookies   list of domain names that we never return cookies to
+
+=cut
+
+sub new
+{
+    my $class = shift;
+    my $self = bless {
+	COOKIES => {},
+    }, $class;
+    my %cnf = @_;
+    for (keys %cnf) {
+	$self->{lc($_)} = $cnf{$_};
+    }
+    $self->load;
+    $self;
+}
+
+
+=item $cookie_jar->add_cookie_header($request);
+
+The add_cookie_header() method will set the appropriate Cookie:-header
+for the I<HTTP::Request> object given as argument.  The $request must
+have a valid url() attribute before this method is called.
+
+=cut
+
+sub add_cookie_header
+{
+    my $self = shift;
+    my $request = shift || return;
+    my $url = $request->url;
+    my $domain = $url->host;
+    $domain = "$domain.local" unless $domain =~ /\./;
+    my $secure_request = ($url->scheme eq "https");
+    my $req_path = $url->epath;
+    my $req_port = $url->port;
+    my $now = time();
+    $self->_normalize_path($req_path) if $req_path =~ /%/;
+
+    my @cval;    # cookie values for the "Cookie" header
+    my $set_ver;
+
+    while (($domain =~ tr/././) >= 2 || # must be at least 2 dots
+           $domain =~ /\.local$/)
+    {
+
+        LWP::Debug::debug("Checking $domain for cookies");
+	my $cookies = $self->{COOKIES}{$domain};
+	next unless $cookies;
+
+	# Want to add cookies corresponding to the most specific paths
+	# first (i.e. longest path first)
+	my $path;
+	for $path (sort {length($b) <=> length($a) } keys %$cookies) {
+            LWP::Debug::debug("- checking cookie path=$path");
+	    if (index($req_path, $path) != 0) {
+	        LWP::Debug::debug("  path $path:$req_path does not fit");
+		next;
+	    }
+
+	    my($key,$array);
+	    while (($key,$array) = each %{$cookies->{$path}}) {
+		my($version,$val,$port,$path_spec,$secure,$expires) = @$array;
+	        LWP::Debug::debug(" - checking cookie $key=$val");
+		if ($secure && !$secure_request) {
+		    LWP::Debug::debug("   not a secure requests");
+		    next;
+		}
+		if ($expires && $expires < $now) {
+		    LWP::Debug::debug("   expired");
+		    next;
+		}
+		if ($port) {
+		    my $found;
+		    if ($port =~ s/^_//) {
+			# The correponding Set-Cookie attribute was empty
+			$found++ if $port eq $req_port;
+			$port = "";
+		    } else {
+			my $p;
+			for $p (split(/,/, $port)) {
+			    $found++, last if $p eq $req_port;
+			}
+		    }
+		    unless ($found) {
+		        LWP::Debug::debug("   port $port:$req_port does not fit");
+			next;
+		    }
+		}
+	        LWP::Debug::debug("   it's a match");
+
+		# set version number of cookie header.
+	        # XXX: What should it be if multiple matching
+                #      Set-Cookie headers have different versions themselves
+		if (!$set_ver++) {
+		    if ($version >= 1) {
+			push(@cval, "\$Version=$version");
+		    } else {
+			$request->header(Cookie2 => "\$Version=1");
+		    }
+		}
+
+		# do we need to quote the value
+		if ($val =~ /\W/ && $version) {
+		    $val =~ s/([\\\"])/\\$1/g;
+		    $val = qq("$val");
+		}
+
+		# and finally remember this cookie
+		push(@cval, "$key=$val");
+		if ($version >= 1) {
+		    push(@cval, qq(\$Path="$path"))     if $path_spec;
+		    push(@cval, qq(\$Domain="$domain")) if $domain =~ /^\./;
+		    if (defined $port) {
+			my $p = '$Port';
+			$p .= qq(="$port") if length $port;
+			push(@cval, $p);
+		    }
+		}
+
+	    }
+        }
+
+    } continue {
+	# Try with a more general domain:  www.sol.no ==> .sol.no
+	$domain =~ s/^\.?[^.]*//;
+    }
+
+    $request->header(Cookie => join("; ", @cval)) if @cval;
+
+    $request;
+}
+
+
+=item $cookie_jar->extract_cookies($response);
+
+The extract_cookies() method will look for Set-Cookie: and
+Set-Cookie2:-headers in the I<HTTP::Response> object passed as
+argument.  If some of these headers are found they are used to update
+the state of the $cookie_jar.
+
+=cut
+
+sub extract_cookies
+{
+    my $self = shift;
+    my $response = shift || return;
+    my @set = split_header_words($response->_header("Set-Cookie2"));
+    my $netscape_cookies;
+    unless (@set) {
+	@set = $response->_header("Set-Cookie");
+	return $response unless @set;
+	$netscape_cookies++;
+    }
+
+    my $url = $response->request->url;
+    my $req_host = $url->host;
+    $req_host = "$req_host.local" unless $req_host =~ /\./;
+    my $req_port = $url->port;
+    my $req_path = $url->epath;
+    $self->_normalize_path($req_path) if $req_path =~ /%/;
+    
+    if ($netscape_cookies) {
+	# The old Netscape cookie format for Set-Cookie
+        # http://www.netscape.com/newsref/std/cookie_spec.html
+	# can for instance contain an unquoted "," in the expires
+	# field, so we have to use this ad-hoc parser.
+	my $now = time();
+	my @old = @set;
+	@set = ();
+	my $set;
+	for $set (@old) {
+	    my @cur;
+	    my $param;
+	    my $expires;
+	    for $param (split(/\s*;\s*/, $set)) {
+		my($k,$v) = split(/\s*=\s*/, $param, 2);
+		#print "$k => $v\n";
+		my $lc = lc($k);
+		if ($lc eq "expires") {
+		    push(@cur, "Max-Age" => str2time($v) - $now);
+		    $expires++;
+		} else {
+		    push(@cur, $k => $v);
+		}
+	    }
+	    push(@cur, "Port" => $req_port);
+	    push(@cur, "Discard" => undef) unless $expires;
+	    push(@cur, "Version" => 0);
+	    push(@set, \@cur);
+	}
+    }
+
+  SET_COOKIE:
+    for my $set (@set) {
+	next unless @$set >= 2;
+
+	my $key = shift @$set;
+	my $val = shift @$set;
+
+        LWP::Debug::debug("Set cookie $key => $val");
+
+	my %hash;
+	while (@$set) {
+	    my $k = shift @$set;
+	    my $v = shift @$set;
+	    my $lc = lc($k);
+	    # don't loose case distinction for unknown fields
+	    $k = $lc if $lc =~ /^(?:discard|domain|max-age|
+                                    path|port|secure|version)$/x;
+	    if ($k eq "discard" || $k eq "secure") {
+		$v = 1 unless defined $v;
+	    }
+	    next if exists $hash{$k};  # only first value is signigicant
+	    $hash{$k} = $v;
+	};
+
+	my %orig_hash = %hash;
+	my $version   = delete $hash{version};
+	$version = 1 unless defined($version);
+	my $discard   = delete $hash{discard};
+	my $secure    = delete $hash{secure};
+	my $maxage    = delete $hash{'max-age'};
+
+	# Check domain
+	my $domain  = delete $hash{domain};
+	if (defined($domain) && $domain ne $req_host) {
+	    if ($domain !~ /\./ && $domain ne "local") {
+	        LWP::Debug::debug("Domain $domain contains no dot");
+		next SET_COOKIE;
+	    }
+	    $domain = ".$domain" unless $domain =~ /^\./;
+	    if ($domain =~ /\.\d+$/) {
+	        LWP::Debug::debug("IP-address $domain illeagal as domain");
+		next SET_COOKIE;
+	    }
+	    my $len = length($domain);
+	    unless (substr($req_host, -$len) eq $domain) {
+	        LWP::Debug::debug("Domain $domain does not match host $req_host");
+		next SET_COOKIE;
+	    }
+	    my $hostpre = substr($req_host, 0, length($req_host) - $len);
+	    if ($hostpre =~ /\./ && !$netscape_cookies) {
+	        LWP::Debug::debug("Host prefix contain a dot: $hostpre => $domain");
+		next SET_COOKIE;
+	    }
+	} else {
+	    $domain = $req_host;
+	}
+
+	my $path = delete $hash{path};
+	my $path_spec;
+	if (defined $path) {
+	    $path_spec++;
+	    $self->_normalize_path($path) if $path =~ /%/;
+	    if (!$netscape_cookies &&
+                substr($req_path, 0, length($path)) ne $path) {
+	        LWP::Debug::debug("Path $path is not a prefix of $req_path");
+		next SET_COOKIE;
+	    }
+	} else {
+	    $path = $req_path;
+	    $path =~ s,/[^/]*$,,;
+	    $path = "/" unless length($path);
+	}
+
+	my $port;
+	if (exists $hash{port}) {
+	    $port = delete $hash{port};
+	    if (defined $port) {
+		$port =~ s/\s+//g;
+		my $found;
+		for my $p (split(/,/, $port)) {
+		    unless ($p =~ /^\d+$/) {
+		      LWP::Debug::debug("Bad port $port (not numeric)");
+			next SET_COOKIE;
+		    }
+		    $found++ if $p eq $req_port;
+		}
+		unless ($found) {
+		    LWP::Debug::debug("Request port ($req_port) not found in $port");
+		    next SET_COOKIE;
+		}
+	    } else {
+		$port = "_$req_port";
+	    }
+	}
+	$self->set_cookie($version,$key,$val,$path,$domain,$port,$path_spec,$secure,$maxage,$discard, \%hash)
+	    if $self->set_cookie_ok(\%orig_hash);
+    }
+
+    $response;
+}
+
+sub set_cookie_ok { 1 };
+
+=item $cookie_jar->set_cookie($version, $key, $val, $path, $domain, $port, $path_spec, $secure, $maxage, $discard, \%rest)
+
+The set_cookie() method updates the state of the $cookie_jar.  The
+$key, $val, $domain, $port and $path arguments are strings.  The
+$path_spec, $secure, $discard arguments are boolean values. The $maxage
+value is a number indicating number of seconds that this cookie will
+live.  A value <= 0 will delete this cookie.  The %rest are a place
+for various other attributes like "Comment" and "CommentURL".
+
+=cut
+
+sub set_cookie
+{
+    my $self = shift;
+    my($version,
+       $key, $val, $path, $domain, $port,
+       $path_spec, $secure, $maxage, $discard, $rest) = @_;
+
+    # there must always be at least 2 dots in a domain
+    return $self if ($domain =~ tr/././) < 2 &&
+                     $domain !~ /\.local$/;
+
+    # path and key can not be empty (key can't start with '$')
+    return $self if !defined($path) || $path !~ m,^/, ||
+	            !defined($key)  || $key  !~ m,[^\$],;
+
+    # ensure legal port
+    if (defined $port) {
+	return $self unless $port =~ /^_?\d+(?:,\d+)*$/;
+    }
+
+    my $expires;
+    if (defined $maxage) {
+	if ($maxage <= 0) {
+	    delete $self->{COOKIES}{$domain}{$path}{$key};
+	    return $self;
+	}
+	$expires = time() + $maxage;
+    }
+    $version = 0 unless defined $version;
+
+    my @array = ($version, $val,$port,
+		 $path_spec,
+		 $secure, $expires, $discard);
+    push(@array, {%$rest}) if defined($rest) && %$rest;
+    # trim off undefined values at end
+    pop(@array) while !defined $array[-1];
+
+    $self->{COOKIES}{$domain}{$path}{$key} = \@array;
+    $self;
+}
+
+=item $cookie_jar->save( [$file] );
+
+Calling this method file save the state of the $cookie_jar to a file.
+The state can then be restored later using the load() method.  If a
+filename is not specified we will use the name specified during
+construction.  If the attribute I<ignore_discared> is set, then we
+will even save cookies that are marked to be discarded.
+
+The default is to save a sequence of "Set-Cookie3" lines.  The
+"Set-Cookie3" is a proprietary LWP format, not known to be compatible
+with any other browser.  The I<HTTP::Cookies::Netscape> sub-class can
+be used to save in a format compatible with Netscape.
+
+=cut
+
+sub save
+{
+    my $self = shift;
+    my $file = shift || $self->{'file'} || return;
+    local(*FILE);
+    open(FILE, ">$file") or die "Can't open $file: $!";
+    print FILE "#LWP-Cookies-1.0\n";
+    print FILE $self->as_string(!$self->{ignore_discard});
+    close(FILE);
+    1;
+}
+
+=item $cookie_jar->load( [$file] );
+
+This method will read the cookies from the file and add them to the
+$cookie_jar.  The file must be in the format written by the save()
+method.
+
+=cut
+
+sub load
+{
+    my $self = shift;
+    my $file = shift || $self->{'file'} || return;
+    local(*FILE, $_);
+    open(FILE, $file) or return;
+    my $magic = <FILE>;
+    unless ($magic =~ /^\#LWP-Cookies-(\d+\.\d+)/) {
+	warn "$file does not seem to contain cookies";
+	return;
+    }
+    while (<FILE>) {
+	next unless s/^Set-Cookie3:\s*//;
+	chomp;
+	my $cookie;
+	for $cookie (split_header_words($_)) {
+	    my($key,$val) = splice(@$cookie, 0, 2);
+	    my %hash;
+	    while (@$cookie) {
+		my $k = shift @$cookie;
+		my $v = shift @$cookie;
+		$hash{$k} = $v;
+	    }
+	    my $version   = delete $hash{version};
+	    my $path      = delete $hash{path};
+	    my $domain    = delete $hash{domain};
+	    my $port      = delete $hash{port};
+	    my $expires   = str2time(delete $hash{expires});
+
+	    my $path_spec = exists $hash{path_spec}; delete $hash{path_spec};
+	    my $secure    = exists $hash{secure};    delete $hash{secure};
+	    my $discard   = exists $hash{discard};   delete $hash{discard};
+
+	    my @array =	($version,$val,$port,
+			 $path_spec,$secure,$expires,$discard);
+	    push(@array, \%hash) if %hash;
+	    $self->{COOKIES}{$domain}{$path}{$key} = \@array;
+	}
+    }
+    close(FILE);
+    1;
+}
+
+=item $cookie_jar->revert;
+
+Will revert to the state of last save.
+
+=cut
+
+sub revert
+{
+    my $self = shift;
+    $self->clear->load;
+    $self;
+}
+
+=item $cookie_jar->clear( [$domain, [$path, [$key] ] ]);
+
+Invoking this method without arguments will empty the whole
+$cookie_jar.  If given a single argument only cookies belonging to
+that domain will be removed.  If given two arguments, cookies
+belonging to the specified path within that domain is removed.  If
+given three arguments, then the cookie with the specified key, path
+and domain is removed.
+
+=cut
+
+sub clear
+{
+    my $self = shift;
+    if (@_ == 0) {
+	$self->{COOKIES} = {};
+    } elsif (@_ == 1) {
+	delete $self->{COOKIES}{$_[0]};
+    } elsif (@_ == 2) {
+	delete $self->{COOKIES}{$_[0]}{$_[1]};
+    } elsif (@_ == 3) {
+	delete $self->{COOKIES}{$_[0]}{$_[1]}{$_[2]};
+    } else {
+	require Carp;
+        Carp::carp('Usage: $c->clear([domain [,path [,key]]])');
+    }
+    $self;
+}
+
+sub DESTROY
+{
+    my $self = shift;
+    $self->save if $self->{'autosave'};
+}
+
+
+=item $cookie_jar->scan( \&callback );
+
+The argument is a subroutine that will be invoked for each cookie
+stored within the $cookie_jar.  The subroutine will be invoked with
+the following arguments:
+
+  0  version
+  1  key
+  2  val
+  3  path
+  4  domain
+  5  port
+  6  path_spec
+  7  secure
+  8  expires
+  9  discard
+ 10  hash
+
+=cut
+
+sub scan
+{
+    my($self, $cb) = @_;
+    my($domain,$path,$key);
+    for $domain (sort keys %{$self->{COOKIES}}) {
+	for $path (sort keys %{$self->{COOKIES}{$domain}}) {
+	    for $key (sort keys %{$self->{COOKIES}{$domain}{$path}}) {
+		my($version,$val,$port,$path_spec,
+		   $secure,$expires,$discard,$rest) =
+		       @{$self->{COOKIES}{$domain}{$path}{$key}};
+		$rest = {} unless defined($rest);
+		&$cb($version,$key,$val,$path,$domain,$port,
+		     $path_spec,$secure,$expires,$discard,$rest);
+	    }
+	}
+    }
+}
+
+=item $cookie_jar->as_string( [$skip_discard] );
+
+The as_string() method will return the state of the $cookie_jar
+represented as a sequence of "Set-Cookie3" header lines separated by
+"\n".  If given a argument that is TRUE, it will not return lines for
+cookies with the I<Discard> attribute.
+
+=cut
+
+sub as_string
+{
+    my($self, $skip_discard) = @_;
+    my @res;
+    $self->scan(sub {
+	my($version,$key,$val,$path,$domain,$port,
+	   $path_spec,$secure,$expires,$discard,$rest) = @_;
+	return if $discard && $skip_discard;
+	my @h = ($key, $val);
+	push(@h, "path", $path);
+	push(@h, "domain" => $domain);
+	push(@h, "port" => $port) if defined $port;
+	push(@h, "path_spec" => undef) if $path_spec;
+	push(@h, "secure" => undef) if $secure;
+	push(@h, "expires" => HTTP::Date::time2isoz($expires)) if $expires;
+	push(@h, "discard" => undef) if $discard;
+	my $k;
+	for $k (sort keys %$rest) {
+	    push(@h, $k, $rest->{$k});
+	}
+	push(@h, "version" => $version);
+	push(@res, "Set-Cookie3: " . join_header_words(\@h));
+    });
+    join("\n", @res, "");
+}
+
+
+sub _normalize_path  # so that plain string compare can be used
+{
+    shift;  # $self
+    my $x;
+    $_[0] =~ s/%([0-9a-fA-F][0-9a-fA-F])/
+	         $x = uc($1);
+                 $x eq "2F" || $x eq "25" ? "%$x" :
+                                            pack("c", hex($x));
+              /eg;
+    $_[0] =~ s/([\0-\x20\x7f-\xff])/sprintf("%%%02X",ord($1))/eg;
+}
+
+
+
+=back
+
+=head1 SUB CLASSES
+
+We also provide a subclass called I<HTTP::Cookies::Netscape> which make
+cookie loading and saving compatible with Netscape cookie files.  You
+should be able to have LWP share Netscape's cookies by constructing
+your $cookie_jar like this:
+
+ $cookie_jar = HTTP::Cookies::Netscape->new(
+                   File     => "$ENV{HOME}/.netscape/cookies",
+                   AutoSave => 1,
+               );
+
+Please note that the Netscape cookie file format is not able to store
+all the information available in the Set-Cookie2 headers, so you will
+probably loose some information if you save using this format.
+
+=cut
+
+package HTTP::Cookies::Netscape;
+
+use vars qw(@ISA);
+@ISA=qw(HTTP::Cookies);
+
+sub load
+{
+    my($self, $file) = @_;
+    $file ||= $self->{'file'} || return;
+    local(*FILE, $_);
+    my @cookies;
+    open(FILE, $file) || return;
+    my $magic = <FILE>;
+    unless ($magic =~ /^\# Netscape HTTP Cookie File/) {
+	warn "$file does not look like a netscape cookies file" if $^W;
+	close(FILE);
+	return;
+    }
+    my $now = time();
+    while (<FILE>) {
+	next if /^\s*\#/;
+	next if /^\s*$/;
+	chomp;
+	my($domain,$bool1,$path,$secure, $expires,$key,$val) = split(/\t/, $_);
+	$secure = ($secure eq "TRUE");
+	$self->set_cookie(undef,$key,$val,$path,$domain,undef,
+			  0,$secure,$expires-$now, 0);
+    }
+    close(FILE);
+    1;
+}
+
+sub save
+{
+    my($self, $file) = @_;
+    $file ||= $self->{'file'} || return;
+    local(*FILE, $_);
+    open(FILE, ">$file") || return;
+
+    print FILE <<EOT;
+# Netscape HTTP Cookie File
+# http://www.netscape.com/newsref/std/cookie_spec.html
+# This is a generated file!  Do not edit.
+
+EOT
+
+    my $now = time;
+    $self->scan(sub {
+	my($version,$key,$val,$path,$domain,$port,
+	   $path_spec,$secure,$expires,$discard,$rest) = @_;
+	return if $discard && !$self->{ignore_discard};
+	$expires ||= 0;
+	return if $now > $expires;
+	$secure = $secure ? "TRUE" : "FALSE";
+	my $bool = $domain =~ /^\./ ? "TRUE" : "FALSE";
+	print FILE join("\t", $domain, $bool, $path, $secure, $expires, $key, $val), "\n";
+    });
+    close(FILE);
+    1;
+}
+
+1;
+
+__END__
+
+=head1 COPYRIGHT
+
+Copyright 1997, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Daemon.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Daemon.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Daemon.pm	(revision 21083)
@@ -0,0 +1,805 @@
+# $Id$
+#
+
+use strict;
+
+package HTTP::Daemon;
+
+=head1 NAME
+
+HTTP::Daemon - a simple http server class
+
+=head1 SYNOPSIS
+
+  use HTTP::Daemon;
+  use HTTP::Status;
+
+  my $d = new HTTP::Daemon;
+  print "Please contact me at: <URL:", $d->url, ">\n";
+  while (my $c = $d->accept) {
+      while (my $r = $c->get_request) {
+	  if ($r->method eq 'GET' and $r->url->path eq "/xyzzy") {
+              # remember, this is *not* recommened practice :-)
+	      $c->send_file_response("/etc/passwd");
+	  } else {
+	      $c->send_error(RC_FORBIDDEN)
+	  }
+      }
+      $c->close;
+      undef($c);
+  }
+
+=head1 DESCRIPTION
+
+Instances of the I<HTTP::Daemon> class are HTTP/1.1 servers that
+listens on a socket for incoming requests. The I<HTTP::Daemon> is a
+sub-class of I<IO::Socket::INET>, so you can do socket operations
+directly on it too.
+
+The accept() method will return when a connection from a client is
+available. The returned value will be a reference to a object of the
+I<HTTP::Daemon::ClientConn> class which is another I<IO::Socket::INET>
+subclass. Calling the get_request() method on this object will read
+data from the client and return an I<HTTP::Request> object reference.
+
+This HTTP daemon does not fork(2) for you.  Your application, i.e. the
+user of the I<HTTP::Daemon> is reponsible for forking if that is
+desirable.  Also note that the user is responsible for generating
+responses that conforms to the HTTP/1.1 protocol.  The
+I<HTTP::Daemon::ClientConn> provide some methods that make this easier.
+
+=head1 METHODS
+
+The following is a list of methods that are new (or enhanced) relative
+to the I<IO::Socket::INET> base class.
+
+=over 4
+
+=cut
+
+
+use vars qw($VERSION @ISA $PROTO $DEBUG);
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use IO::Socket ();
+@ISA=qw(IO::Socket::INET);
+
+$PROTO = "HTTP/1.1";
+
+=item $d = new HTTP::Daemon
+
+The object constructor takes the same parameters as the
+I<IO::Socket::INET> constructor.  It can be called without specifying
+any parameters. The daemon will then set up a listen queue of 5
+connections and allocate some random port number.  A server that want
+to bind to some specific address on the standard HTTP port will be
+constructed like this:
+
+  $d = new HTTP::Daemon
+        LocalAddr => 'www.someplace.com',
+        LocalPort => 80;
+
+=cut
+
+sub new
+{
+    my($class, %args) = @_;
+    $args{Listen} ||= 5;
+    $args{Proto}  ||= 'tcp';
+    my $self = $class->SUPER::new(%args);
+    return undef unless $self;
+
+    my $host = $args{LocalAddr};
+    unless ($host) {
+	require Sys::Hostname;
+	$host = Sys::Hostname::hostname();
+    }
+    ${*$self}{'httpd_server_name'} = $host;
+    $self;
+}
+
+
+=item $c = $d->accept([$pkg])
+
+Same as I<IO::Socket::accept> but will return an
+I<HTTP::Daemon::ClientConn> reference by default.  It will return
+undef if you have specified a timeout and no connection is made within
+that time.
+
+=cut
+
+sub accept
+{
+    my $self = shift;
+    my $pkg = shift || "HTTP::Daemon::ClientConn";
+    my $sock = $self->SUPER::accept($pkg);
+    ${*$sock}{'httpd_daemon'} = $self if $sock;
+    $sock;
+}
+
+
+=item $d->url
+
+Returns a URL string that can be used to access the server root.
+
+=cut
+
+sub url
+{
+    my $self = shift;
+    my $url = "http://";
+    $url .= ${*$self}{'httpd_server_name'};
+    my $port = $self->sockport;
+    $url .= ":$port" if $port != 80;
+    $url .= "/";
+    $url;
+}
+
+
+=item $d->product_tokens
+
+Returns the name that this server will use to identify itself.  This
+is the string that is sent with the I<Server> response header.  The
+main reason to have this method is that subclasses can override it if
+they want to use another product name.
+
+=cut
+
+sub product_tokens
+{
+    "libwww-perl-daemon/$HTTP::Daemon::VERSION";
+}
+
+
+package HTTP::Daemon::ClientConn;
+
+use vars qw(@ISA $DEBUG);
+use IO::Socket ();
+@ISA=qw(IO::Socket::INET);
+*DEBUG = \$HTTP::Daemon::DEBUG;
+
+use HTTP::Request  ();
+use HTTP::Response ();
+use HTTP::Status;
+use HTTP::Date qw(time2str);
+use URI::URL qw(url);
+use LWP::MediaTypes qw(guess_media_type);
+use Carp ();
+
+my $CRLF = "\015\012";   # "\r\n" is not portable
+my $HTTP_1_0 = _http_version("HTTP/1.0");
+my $HTTP_1_1 = _http_version("HTTP/1.1");
+
+=back
+
+The I<HTTP::Daemon::ClientConn> is also a I<IO::Socket::INET>
+subclass. Instances of this class are returned by the accept() method
+of the I<HTTP::Daemon>.  The following additional methods are
+provided:
+
+=over 4
+
+=item $c->get_request([$headers_only])
+
+This method will read data from the client and turn it into a
+I<HTTP::Request> object which is then returned.  It returns C<undef>
+if reading of the request fails.  If it fails, then the
+I<HTTP::Daemon::ClientConn> object ($c) should be discarded, and you
+should not call this method again.  The $c->reason method might give
+you some information on why $c->get_request returned C<undef>.
+
+The $c->get_request method support HTTP/1.1 request content bodies,
+including I<chunked> transfer encoding with footer and self delimiting
+I<multipart/*> content types.
+
+The $c->get_request method will normally not return until the whole
+request has been received from the client.  This might not be what you
+want if the request is an upload of a multi-mega-byte file (and with
+chunked transfer encoding HTTP can even support infinite request
+messages - uploading live audio for instance).  If you pass a TRUE
+value as the $headers_only argument, then $c->get_request will return
+immediately after parsing the request headers and you are responsible
+for reading the rest of the request content (and if you are going to
+call $c->get_request again on the same connection you better read the
+correct number of bytes).
+
+=cut
+
+sub get_request
+{
+    my($self, $only_headers) = @_;
+    if (${*$self}{'httpd_nomore'}) {
+        $self->reason("No more requests from this connection");
+	return;
+    }
+
+    $self->reason("");
+    my $buf = ${*$self}{'httpd_rbuf'};
+    $buf = "" unless defined $buf;
+    
+    my $timeout = $ {*$self}{'io_socket_timeout'};
+    my $fdset = "";
+    vec($fdset, $self->fileno, 1) = 1;
+    local($_);
+
+  READ_HEADER:
+    while (1) {
+	# loop until we have the whole header in $buf
+	$buf =~ s/^(?:\015?\012)+//;  # ignore leading blank lines
+	if ($buf =~ /\012/) {  # potential, has at least one line
+	    if ($buf =~ /^\w+[^\012]+HTTP\/\d+\.\d+\015?\012/) {
+		if ($buf =~ /\015?\012\015?\012/) {
+		    last READ_HEADER;  # we have it
+		} elsif (length($buf) > 16*1024) {
+		    $self->send_error(413); # REQUEST_ENTITY_TOO_LARGE
+		    $self->reason("Very long header");
+		    return;
+		}
+	    } else {
+		last READ_HEADER;  # HTTP/0.9 client
+	    }
+	} elsif (length($buf) > 16*1024) {
+	    $self->send_error(414); # REQUEST_URI_TOO_LARGE
+	    $self->reason("Very long first line");
+	    return;
+	}
+	print STDERR "Need more data for complete header\n" if $DEBUG;
+	return unless $self->_need_more($buf, $timeout, $fdset);
+    }
+    if ($buf !~ s/^(\w+)[ \t]+(\S+)(?:[ \t]+(HTTP\/\d+\.\d+))?[^\012]*\012//) {
+	$self->send_error(400);  # BAD_REQUEST
+	$self->reason("Bad request line");
+	return;
+    }
+    my $proto = $3 || "HTTP/0.9";
+    my $r = HTTP::Request->new($1, url($2, $self->daemon->url));
+    $r->protocol($proto);
+    ${*$self}{'httpd_client_proto'} = $proto = _http_version($proto);
+
+    if ($proto >= $HTTP_1_0) {
+	# we expect to find some headers
+	my($key, $val);
+      HEADER:
+	while ($buf =~ s/^([^\012]*)\012//) {
+	    $_ = $1;
+	    s/\015$//;
+	    if (/^([\w\-]+)\s*:\s*(.*)/) {
+		$r->push_header($key, $val) if $key;
+		($key, $val) = ($1, $2);
+	    } elsif (/^\s+(.*)/) {
+		$val .= " $1";
+	    } else {
+		last HEADER;
+	    }
+	}
+	$r->push_header($key, $val) if $key;
+    }
+
+    my $conn = $r->header('Connection');
+    if ($proto >= $HTTP_1_1) {
+	${*$self}{'httpd_nomore'}++ if $conn && lc($conn) =~ /\bclose\b/;
+    } else {
+	${*$self}{'httpd_nomore'}++ unless $conn &&
+                                           lc($conn) =~ /\bkeep-alive\b/;
+    }
+
+    if ($only_headers) {
+	${*$self}{'httpd_rbuf'} = $buf;
+        return $r;
+    }
+
+    # Find out how much content to read
+    my $te  = $r->header('Transfer-Encoding');
+    my $ct  = $r->header('Content-Type');
+    my $len = $r->header('Content-Length');
+
+    if ($te && lc($te) eq 'chunked') {
+	# Handle chunked transfer encoding
+	my $body = "";
+      CHUNK:
+	while (1) {
+	    print STDERR "Chunked\n" if $DEBUG;
+	    if ($buf =~ s/^([^\012]*)\012//) {
+		my $chunk_head = $1;
+		unless ($chunk_head =~ /^([0-9A-Fa-f]+)/) {
+		    $self->send_error(400);
+		    $self->reason("Bad chunk header $chunk_head");
+		    return;
+		}
+		my $size = hex($1);
+		last CHUNK if $size == 0;
+
+		my $missing = $size - length($buf) + 2; # 2=CRLF at chunk end
+		# must read until we have a complete chunk
+		while ($missing > 0) {
+		    print STDERR "Need $missing more bytes\n" if $DEBUG;
+		    my $n = $self->_need_more($buf, $timeout, $fdset);
+		    return unless $n;
+		    $missing -= $n;
+		}
+		$body .= substr($buf, 0, $size);
+		substr($buf, 0, $size+2) = '';
+
+	    } else {
+		# need more data in order to have a complete chunk header
+		return unless $self->_need_more($buf, $timeout, $fdset);
+	    }
+	}
+	$r->content($body);
+
+	# pretend it was a normal entity body
+	$r->remove_header('Transfer-Encoding');
+	$r->header('Content-Length', length($body));
+
+	my($key, $val);
+      FOOTER:
+	while (1) {
+	    if ($buf !~ /\012/) {
+		# need at least one line to look at
+		return unless $self->_need_more($buf, $timeout, $fdset);
+	    } else {
+		$buf =~ s/^([^\012]*)\012//;
+		$_ = $1;
+		s/\015$//;
+		if (/^([\w\-]+)\s*:\s*(.*)/) {
+		    $r->push_header($key, $val) if $key;
+		    ($key, $val) = ($1, $2);
+		} elsif (/^\s+(.*)/) {
+		    $val .= " $1";
+		} elsif (!length) {
+		    last FOOTER;
+		} else {
+		    $self->reason("Bad footer syntax");
+		    return;
+		}
+	    }
+	}
+	$r->push_header($key, $val) if $key;
+
+    } elsif ($te) {
+	$self->send_error(501); 	# Unknown transfer encoding
+	$self->reason("Unknown transfer encoding '$te'");
+	return;
+
+    } elsif ($ct && lc($ct) =~ m/^multipart\/\w+\s*;.*boundary\s*=\s*(\w+)/) {
+	# Handle multipart content type
+	my $boundary = "$CRLF--$1--$CRLF";
+	my $index;
+	while (1) {
+	    $index = index($buf, $boundary);
+	    last if $index >= 0;
+	    # end marker not yet found
+	    return unless $self->_need_more($buf, $timeout, $fdset);
+	}
+	$index += length($boundary);
+	$r->content(substr($buf, 0, $index));
+	substr($buf, 0, $index) = '';
+
+    } elsif ($len) {
+	# Plain body specified by "Content-Length"
+	my $missing = $len - length($buf);
+	while ($missing > 0) {
+	    print "Need $missing more bytes of content\n" if $DEBUG;
+	    my $n = $self->_need_more($buf, $timeout, $fdset);
+	    return unless $n;
+	    $missing -= $n;
+	}
+	if (length($buf) > $len) {
+	    $r->content(substr($buf,0,$len));
+	    substr($buf, 0, $len) = '';
+	} else {
+	    $r->content($buf);
+	    $buf='';
+	}
+    }
+    ${*$self}{'httpd_rbuf'} = $buf;
+
+    $r;
+}
+
+sub _need_more
+{
+    my $self = shift;
+    #my($buf,$timeout,$fdset) = @_;
+    if ($_[1]) {
+	my($timeout, $fdset) = @_[1,2];
+	print STDERR "select(,,,$timeout)\n" if $DEBUG;
+	my $n = select($fdset,undef,undef,$timeout);
+	unless ($n) {
+	    $self->reason(defined($n) ? "Timeout" : "select: $!");
+	    return;
+	}
+    }
+    print STDERR "sysread()\n" if $DEBUG;
+    my $n = sysread($self, $_[0], 2048, length($_[0]));
+    $self->reason(defined($n) ? "Client closed" : "sysread: $!") unless $n;
+    $n;
+}
+
+=item $c->read_buffer([$new_value])
+
+Bytes read by $c->get_request, but not used are placed in the I<read
+buffer>.  The next time $c->get_request is called it will consume the
+bytes in this buffer before reading more data from the network
+connection itself.  The read buffer is invalid after $c->get_request
+has returned an undefined value.
+
+If you handle the reading of the request content yourself you need to
+empty this buffer before you read more and you need to place
+unconsumed bytes here.  You also need this buffer if you implement
+services like I<101 Switching Protocols>.
+
+This method always return the old buffer content and can optionally
+update the buffer content if you pass it an argument.
+
+=cut
+
+sub read_buffer
+{
+    my $self = shift;
+    my $old = ${*$self}{'httpd_rbuf'};
+    if (@_) {
+	${*$self}{'httpd_rbuf'} = shift;
+    }
+    $old;
+}
+
+
+=item $c->reason
+
+When $c->get_request returns C<undef> you can obtain a short string
+describing why it happened by calling $c->reason.
+
+=cut
+
+sub reason
+{
+    my $self = shift;
+    my $old = ${*$self}{'httpd_reason'};
+    if (@_) {
+        ${*$self}{'httpd_reason'} = shift;
+    }
+    $old;
+}
+
+
+=item $c->proto_ge($proto)
+
+Returns TRUE if the client announced a protocol with version number
+greater or equal to the given argument.  The $proto argument can be a
+string like "HTTP/1.1" or just "1.1".
+
+=cut
+
+sub proto_ge
+{
+    my $self = shift;
+    ${*$self}{'httpd_client_proto'} >= _http_version(shift);
+}
+
+sub _http_version
+{
+    local($_) = shift;
+    return 0 unless m,^(?:HTTP/)?(\d+)\.(\d+)$,i;
+    $1 * 1000 + $2;
+}
+
+=item $c->antique_client
+
+Returns TRUE if the client speaks the HTTP/0.9 protocol.  No status
+code and no headers should be returned to such a client.  This should
+be the same as !$c->proto_ge("HTTP/1.0").
+
+=cut
+
+sub antique_client
+{
+    my $self = shift;
+    ${*$self}{'httpd_client_proto'} < $HTTP_1_0;
+}
+
+
+=item $c->force_last_request
+
+Make sure that $c->get_request will not try to read more requests off
+this connection.  If you generate a response that is not self
+delimiting, then you should signal this fact by calling this method.
+
+This attribute is turned on automatically if the client announce
+protocol HTTP/1.0 or worse and does not include a "Connection:
+Keep-Alive" header.  It is also turned on automatically when HTTP/1.1
+or better clients send the "Connection: close" request header.
+
+=cut
+
+sub force_last_request
+{
+    my $self = shift;
+    ${*$self}{'httpd_nomore'}++;
+}
+
+
+=item $c->send_status_line( [$code, [$mess, [$proto]]] )
+
+Sends the status line back to the client.  If $code is omitted 200 is
+assumed.  If $mess is omitted, then a message corresponding to $code
+is inserted.  If $proto is missing the content of the
+$HTTP::Daemon::PROTO variable is used.
+
+=cut
+
+sub send_status_line
+{
+    my($self, $status, $message, $proto) = @_;
+    return if $self->antique_client;
+    $status  ||= RC_OK;
+    $message ||= status_message($status) || "";
+    $proto   ||= $HTTP::Daemon::PROTO || "HTTP/1.1";
+    print $self "$proto $status $message$CRLF";
+}
+
+=item $c->send_crlf
+
+Send the CRLF sequence to the client.
+
+=cut
+
+
+sub send_crlf
+{
+    my $self = shift;
+    print $self $CRLF;
+}
+
+
+=item $c->send_basic_header( [$code, [$mess, [$proto]]] )
+
+Sends the status line and the "Date:" and "Server:" headers back to
+the client.  This header is assumed to be continued and does not end
+with an empty CRLF line.
+
+=cut
+
+sub send_basic_header
+{
+    my $self = shift;
+    return if $self->antique_client;
+    $self->send_status_line(@_);
+    print $self "Date: ", time2str(time), $CRLF;
+    my $product = $self->daemon->product_tokens;
+    print $self "Server: $product$CRLF" if $product;
+}
+
+
+=item $c->send_response( [$res] )
+
+Takes a I<HTTP::Response> object as parameter and write it back to the
+client as the response.  We try hard to make sure that the response is
+self delimiting so that the connection can stay persistent for further
+request/response exchanges.
+
+The content attribute of the I<HTTP::Response> object can be a normal
+string or a subroutine reference.  If it is a subroutine, then
+whatever this callback routine returns will be written back to the
+client as the response content.  The routine will be called until it
+return an undefined or empty value.  If the client is HTTP/1.1 aware
+then we will use the chunked transfer encoding for the response.
+
+=cut
+
+sub send_response
+{
+    my $self = shift;
+    my $res = shift;
+    if (!ref $res) {
+	$res ||= RC_OK;
+	$res = HTTP::Response->new($res, @_);
+    }
+    my $content = $res->content;
+    my $chunked;
+    unless ($self->antique_client) {
+	my $code = $res->code;
+	$self->send_basic_header($code, $res->message, $res->protocol);
+	if ($code =~ /^(1\d\d|[23]04)$/) {
+	    # make sure content is empty
+	    $res->remove_header("Content-Length");
+	    $content = "";
+	} elsif ($res->request && $res->request->method eq "HEAD") {
+	    # probably OK
+	} elsif (ref($content) eq "CODE") {
+	    if ($self->proto_ge("HTTP/1.1")) {
+		$res->push_header("Transfer-Encoding" => "chunked");
+		$chunked++;
+	    } else {
+		$self->force_last_request;
+	    }
+	} elsif (length($content)) {
+	    $res->header("Content-Length" => length($content));
+	} else {
+	    $self->force_last_request;
+	}
+	print $self $res->headers_as_string($CRLF);
+	print $self $CRLF;  # separates headers and content
+    }
+    if (ref($content) eq "CODE") {
+	while (1) {
+	    my $chunk = &$content();
+	    last unless defined($chunk) && length($chunk);
+	    if ($chunked) {
+		printf $self "%x%s%s%s", length($chunk), $CRLF, $chunk, $CRLF;
+	    } else {
+		print $self $chunk;
+	    }
+	}
+	print $self "0$CRLF$CRLF" if $chunked;  # no trailers either
+    } elsif (length $content) {
+	print $self $content;
+    }
+}
+
+
+=item $c->send_redirect( $loc, [$code, [$entity_body]] )
+
+Sends a redirect response back to the client.  The location ($loc) can
+be an absolute or a relative URL. The $code must be one the redirect
+status codes, and it defaults to "301 Moved Permanently"
+
+=cut
+
+sub send_redirect
+{
+    my($self, $loc, $status, $content) = @_;
+    $status ||= RC_MOVED_PERMANENTLY;
+    Carp::croak("Status '$status' is not redirect") unless is_redirect($status);
+    $self->send_basic_header($status);
+    $loc = url($loc, $self->daemon->url) unless ref($loc);
+    $loc = $loc->abs;
+    print $self "Location: $loc$CRLF";
+    if ($content) {
+	my $ct = $content =~ /^\s*</ ? "text/html" : "text/plain";
+	print $self "Content-Type: $ct$CRLF";
+    }
+    print $self $CRLF;
+    print $self $content if $content;
+    $self->force_last_request;  # no use keeping the connection open
+}
+
+
+=item $c->send_error( [$code, [$error_message]] )
+
+Send an error response back to the client.  If the $code is missing a
+"Bad Request" error is reported.  The $error_message is a string that
+is incorporated in the body of the HTML entity body.
+
+=cut
+
+sub send_error
+{
+    my($self, $status, $error) = @_;
+    $status ||= RC_BAD_REQUEST;
+    Carp::croak("Status '$status' is not an error") unless is_error($status);
+    my $mess = status_message($status);
+    $error  ||= "";
+    $mess = <<EOT;
+<title>$status $mess</title>
+<h1>$status $mess</h1>
+$error
+EOT
+    unless ($self->antique_client) {
+        $self->send_basic_header($status);
+        print $self "Content-Type: text/html$CRLF";
+	print $self "Content-Length: " . length($mess) . $CRLF;
+        print $self $CRLF;
+    }
+    print $self $mess;
+    $status;
+}
+
+
+=item $c->send_file_response($filename)
+
+Send back a response with the specified $filename as content.  If the
+file happen to be a directory we will try to generate an HTML index
+of it.
+
+=cut
+
+sub send_file_response
+{
+    my($self, $file) = @_;
+    if (-d $file) {
+	$self->send_dir($file);
+    } elsif (-f _) {
+	# plain file
+	local(*F);
+	sysopen(F, $file, 0) or 
+	  return $self->send_error(RC_FORBIDDEN);
+	my($ct,$ce) = guess_media_type($file);
+	my($size,$mtime) = (stat _)[7,9];
+	unless ($self->antique_client) {
+	    $self->send_basic_header;
+	    print $self "Content-Type: $ct$CRLF";
+	    print $self "Content-Encoding: $ce$CRLF" if $ce;
+	    print $self "Content-Length: $size$CRLF" if $size;
+	    print $self "Last-Modified: ", time2str($mtime), "$CRLF" if $mtime;
+	    print $self $CRLF;
+	}
+	$self->send_file(\*F);
+	return RC_OK;
+    } else {
+	$self->send_error(RC_NOT_FOUND);
+    }
+}
+
+
+sub send_dir
+{
+    my($self, $dir) = @_;
+    $self->send_error(RC_NOT_FOUND) unless -d $dir;
+    $self->send_error(RC_NOT_IMPLEMENTED);
+}
+
+
+=item $c->send_file($fd);
+
+Copies the file back to the client.  The file can be a string (which
+will be interpreted as a filename) or a reference to an I<IO::Handle>
+or glob.
+
+=cut
+
+sub send_file
+{
+    my($self, $file) = @_;
+    my $opened = 0;
+    if (!ref($file)) {
+	local(*F);
+	open(F, $file) || return undef;
+	binmode(F);
+	$file = \*F;
+	$opened++;
+    }
+    my $cnt = 0;
+    my $buf = "";
+    my $n;
+    while ($n = sysread($file, $buf, 8*1024)) {
+	last if !$n;
+	$cnt += $n;
+	print $self $buf;
+    }
+    close($file) if $opened;
+    $cnt;
+}
+
+
+=item $c->daemon
+
+Return a reference to the corresponding I<HTTP::Daemon> object.
+
+=cut
+
+sub daemon
+{
+    my $self = shift;
+    ${*$self}{'httpd_daemon'};
+}
+
+=back
+
+=head1 SEE ALSO
+
+RFC 2068
+
+L<IO::Socket>, L<Apache>
+
+=head1 COPYRIGHT
+
+Copyright 1996-1998, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Date.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Date.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Date.pm	(revision 21083)
@@ -0,0 +1,330 @@
+# $Id$
+#
+package HTTP::Date;
+
+=head1 NAME
+
+HTTP::Date - date conversion routines
+
+=head1 SYNOPSIS
+
+ use HTTP::Date;
+
+ $string = time2str($time);    # Format as GMT ASCII time
+ $time = str2time($string);    # convert ASCII date to machine time
+
+=head1 DESCRIPTION
+
+This module provides two functions that deal with the HTTP date
+format.  The following functions are provided:
+
+=over 4
+
+=item time2str([$time])
+
+The time2str() function converts a machine time (seconds since epoch)
+to a string.  If the function is called without an argument, it will
+use the current time.
+
+The string returned is in the format defined by the HTTP/1.0
+specification.  This is a fixed length subset of the format defined by
+RFC 1123, represented in Universal Time (GMT).  An example of this
+format is:
+
+   Thu, 03 Feb 1994 17:09:00 GMT
+
+=item str2time($str [, $zone])
+
+The str2time() function converts a string to machine time.  It returns
+C<undef> if the format is unrecognized, or the year is not between 1970
+and 2038.  The function is able to parse the following formats:
+
+ "Wed, 09 Feb 1994 22:23:32 GMT"       -- HTTP format
+ "Thu Feb  3 17:03:55 GMT 1994"        -- ctime(3) format
+ "Thu Feb  3 00:00:00 1994",           -- ANSI C asctime() format
+ "Tuesday, 08-Feb-94 14:15:29 GMT"     -- old rfc850 HTTP format
+ "Tuesday, 08-Feb-1994 14:15:29 GMT"   -- broken rfc850 HTTP format
+
+ "03/Feb/1994:17:03:55 -0700"   -- common logfile format
+ "09 Feb 1994 22:23:32 GMT"     -- HTTP format (no weekday)
+ "08-Feb-94 14:15:29 GMT"       -- rfc850 format (no weekday)
+ "08-Feb-1994 14:15:29 GMT"     -- broken rfc850 format (no weekday)
+
+ "1994-02-03 14:15:29 -0100"    -- ISO 8601 format
+ "1994-02-03 14:15:29"          -- zone is optional
+ "1994-02-03"                   -- only date
+ "1994-02-03T14:15:29"          -- Use T as separator
+ "19940203T141529Z"             -- ISO 8601 compact format
+ "19940203"                     -- only date
+
+ "08-Feb-94"         -- old rfc850 HTTP format    (no weekday, no time)
+ "08-Feb-1994"       -- broken rfc850 HTTP format (no weekday, no time)
+ "09 Feb 1994"       -- proposed new HTTP format  (no weekday, no time)
+ "03/Feb/1994"       -- common logfile format     (no time, no offset)
+
+ "Feb  3  1994"      -- Unix 'ls -l' format
+ "Feb  3 17:03"      -- Unix 'ls -l' format
+
+ "11-15-96  03:52PM" -- Windows 'dir' format
+
+The parser ignores leading and trailing whitespace.  It also allow the
+seconds to be missing and the month to be numerical in most formats.
+
+The str2time() function takes an optional second argument that
+specifies the default time zone to use when converting the date.  This
+zone specification should be numerical (like "-0800" or "+0100") or
+"GMT".  This parameter is ignored if the zone is specified in the date
+string itself.  It this parameter is missing, and the date string
+format does not contain any zone specification then the local time
+zone is assumed.
+
+If the year is missing, then we assume that the date is the first
+matching date I<before> current time.
+
+=back
+
+=head1 BUGS
+
+Non-numerical time zones (like MET, PST) are all treated like GMT.
+Do not use them.  HTTP does not use them.
+
+The str2time() function has been told how to parse far too many
+formats.  This makes the module name misleading. To be sure it is
+really misleading you can also import the time2iso() and time2isoz()
+functions.  They work like time2str() but produce ISO-8601 formated
+strings (YYYY-MM-DD hh:mm:ss).
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+sub Version { $VERSION; }
+
+require 5.002;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(time2str str2time);
+@EXPORT_OK = qw(time2iso time2isoz);
+
+use Time::Local ();
+
+use strict;
+use vars qw(@DoW @MoY %MoY);
+
+#@DoW = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
+@DoW = qw(Sun Mon Tue Wed Thu Fri Sat);
+@MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+# Build %MoY hash
+my $i = 0;
+foreach(@MoY) {
+   $MoY{lc $_} = $i++;
+}
+
+my($current_month, $current_year) = (localtime)[4, 5];
+
+
+
+
+sub time2str (;$)
+{
+   my $time = shift;
+   $time = time unless defined $time;
+   my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($time);
+   sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
+	   $DoW[$wday],
+	   $mday, $MoY[$mon], $year+1900,
+	   $hour, $min, $sec);
+}
+
+
+
+sub str2time ($;$)
+{
+   local($_) = shift;
+   return undef unless defined;
+   my($default_zone) = @_;
+
+   # Remove useless weekday, if it exists
+   s/^\s*(?:sun|mon|tue|wed|thu|fri|sat)\w*,?\s*//i;
+
+   my($day, $mon, $yr, $hr, $min, $sec, $tz, $aorp);
+   my $offset = 0;  # used when compensating for timezone
+
+ PARSEDATE: {
+      # Then we are able to check for most of the formats with this regexp
+      ($day,$mon,$yr,$hr,$min,$sec,$tz) =
+	/^\s*
+	 (\d\d?)               # day
+	    (?:\s+|[-\/])
+	 (\w+)                 # month
+	    (?:\s+|[-\/])
+	 (\d+)                 # year
+	 (?:
+	       (?:\s+|:)       # separator before clock
+	    (\d\d?):(\d\d)     # hour:min
+	    (?::(\d\d))?       # optional seconds
+	 )?                    # optional clock
+	    \s*
+	 ([-+]?\d{2,4}|GMT|gmt)? # timezone
+	    \s*$
+	/x
+	  and last PARSEDATE;
+
+      # Try the ctime and asctime format
+      ($mon, $day, $hr, $min, $sec, $tz, $yr) =
+	/^\s*                  # allow intial whitespace
+	 (\w{1,3})             # month
+	    \s+
+	 (\d\d?)               # day
+	    \s+
+	 (\d\d?):(\d\d)        # hour:min
+	 (?::(\d\d))?          # optional seconds
+	    \s+
+	 (?:(GMT|gmt)\s+)?     # optional GMT timezone
+	 (\d+)                 # year
+	    \s*$               # allow trailing whitespace
+	/x
+	  and last PARSEDATE;
+
+      # Then the Unix 'ls -l' date format
+      ($mon, $day, $yr, $hr, $min, $sec) =
+	/^\s*
+	 (\w{3})               # month
+	    \s+
+	 (\d\d?)               # day
+	    \s+
+	 (?:
+	    (\d\d\d\d) |       # year
+	    (\d{1,2}):(\d{2})  # hour:min
+            (?::(\d\d))?       # optional seconds
+	 )
+	 \s*$
+       /x
+	 and last PARSEDATE;
+
+      # ISO 8601 format '1996-02-29 12:00:00 -0100' and variants
+      ($yr, $mon, $day, $hr, $min, $sec, $tz) =
+	/^\s*
+	  (\d{4})              # year
+	     [-\/]?
+	  (\d\d?)              # numerical month
+	     [-\/]?
+	  (\d\d?)              # day
+	 (?:
+	       (?:\s+|:|T|-)   # separator before clock
+	    (\d\d?):?(\d\d)    # hour:min
+	    (?::?(\d\d))?      # optional seconds
+	 )?                    # optional clock
+	    \s*
+	 ([-+]?\d\d?:?(:?\d\d)?
+	  |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
+	    \s*$
+	/x
+	  and last PARSEDATE;
+
+      # Windows 'dir' 11-12-96  03:52PM
+      ($mon, $day, $yr, $hr, $min, $aorp) =
+        /^\s*
+          (\d{2})                # numerical month
+             -
+          (\d{2})                # day
+             -
+          (\d{2})                # year
+             \s+
+          (\d\d?):(\d\d)([apAP][mM])  # hour:min AM or PM
+             \s*$
+        /x
+          and last PARSEDATE;
+
+      # If it is not recognized by now we give up
+      return undef;
+   }
+
+   # Translate month name to number
+   if ($mon =~ /^\d+$/) {
+     # numeric month
+     return undef if $mon < 1 || $mon > 12;
+     $mon--;
+   } else {
+     $mon = lc $mon;
+     return undef unless exists $MoY{$mon};
+     $mon = $MoY{$mon};
+   }
+
+   # If the year is missing, we assume some date before the current,
+   # because these date are mostly present on "ls -l" listings.
+   unless (defined $yr) {
+	$yr = $current_year;
+	$yr-- if $mon > $current_month;
+    }
+
+   # Then we check if the year is acceptable
+   return undef if $yr > 99 && $yr < 1900;  # We ignore these years
+   $yr += 100 if $yr < 50;  # a stupid thing to do???
+   $yr -= 1900 if $yr >= 1900;
+   # The $yr is now relative to 1900 (as expected by timelocal())
+
+   # timelocal() seems to go into an infinite loop if it is given out
+   # of range parameters.  Let's check the year at least.
+
+   # Epoch counter maxes out in year 2038, assuming "time_t" is 32 bit
+   return undef if $yr > 138;
+   return undef if $yr <  70;  # 1970 is Unix epoch
+
+   # Compensate for AM/PM
+   if ($aorp) {
+       $aorp = uc $aorp;
+       $hr = 0 if $hr == 12 && $aorp eq 'AM';
+       $hr += 12 if $aorp eq 'PM' && $hr != 12;
+   }
+
+   # Make sure things are defined
+   for ($sec, $min, $hr) {  $_ = 0 unless defined   }
+
+   # Should we compensate for the timezone?
+   $tz = $default_zone unless defined $tz;
+   return eval {Time::Local::timelocal($sec, $min, $hr, $day, $mon, $yr)}
+     unless defined $tz;
+
+   # We can calculate offset for numerical time zones
+   if ($tz =~ /^([-+])?(\d\d?):?(\d\d)?$/) {
+       $offset = 3600 * $2;
+       $offset += 60 * $3 if $3;
+       $offset *= -1 if $1 && $1 ne '-';
+   }
+   eval{Time::Local::timegm($sec, $min, $hr, $day, $mon, $yr) + $offset};
+}
+
+
+
+# And then some bloat because I happen to like the ISO 8601 time
+# format.
+
+sub time2iso (;$)
+{
+   my $time = shift;
+   $time = time unless defined $time;
+   my($sec,$min,$hour,$mday,$mon,$year) = localtime($time);
+   sprintf("%04d-%02d-%02d %02d:%02d:%02d",
+	   $year+1900, $mon+1, $mday, $hour, $min, $sec);
+}
+
+
+sub time2isoz (;$)
+{
+    my $time = shift;
+    $time = time unless defined $time;
+    my($sec,$min,$hour,$mday,$mon,$year) = gmtime($time);
+    sprintf("%04d-%02d-%02d %02d:%02d:%02dZ",
+            $year+1900, $mon+1, $mday, $hour, $min, $sec);
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers.pm	(revision 21083)
@@ -0,0 +1,540 @@
+#
+# $Id$
+
+package HTTP::Headers;
+
+=head1 NAME
+
+HTTP::Headers - Class encapsulating HTTP Message headers
+
+=head1 SYNOPSIS
+
+ require HTTP::Headers;
+ $h = new HTTP::Headers;
+
+=head1 DESCRIPTION
+
+The C<HTTP::Headers> class encapsulates HTTP-style message headers.
+The headers consist of attribute-value pairs, which may be repeated,
+and which are printed in a particular order.
+
+Instances of this class are usually created as member variables of the
+C<HTTP::Request> and C<HTTP::Response> classes, internal to the
+library.
+
+The following methods are available:
+
+=over 4
+
+=cut
+
+use strict;
+use vars qw($VERSION $TRANSLATE_UNDERSCORE);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use Carp ();
+
+# Could not use the AutoLoader becase several of the method names are
+# not unique in the first 8 characters.
+#use SelfLoader;
+
+
+# "Good Practice" order of HTTP message headers:
+#    - General-Headers
+#    - Request-Headers
+#    - Response-Headers
+#    - Entity-Headers
+# (From draft-ietf-http-v11-spec-rev-01, Nov 21, 1997)
+
+my @header_order = qw(
+   Cache-Control Connection Date Pragma Transfer-Encoding Upgrade Trailer Via
+
+   Accept Accept-Charset Accept-Encoding Accept-Language
+   Authorization Expect From Host
+   If-Modified-Since If-Match If-None-Match If-Range If-Unmodified-Since
+   Max-Forwards Proxy-Authorization Range Referer TE User-Agent
+
+   Accept-Ranges Age Location Proxy-Authenticate Retry-After Server Vary
+   Warning WWW-Authenticate
+
+   Allow Content-Base Content-Encoding Content-Language Content-Length
+   Content-Location Content-MD5 Content-Range Content-Type
+   ETag Expires Last-Modified
+);
+
+# Make alternative representations of @header_order.  This is used
+# for sorting and case matching.
+my $i = 0;
+my %header_order;
+my %standard_case;
+for (@header_order) {
+    my $lc = lc $_;
+    $header_order{$lc} = $i++;
+    $standard_case{$lc} = $_;
+}
+
+$TRANSLATE_UNDERSCORE = 1 unless defined $TRANSLATE_UNDERSCORE;
+
+
+
+=item $h = new HTTP::Headers
+
+Constructs a new C<HTTP::Headers> object.  You might pass some initial
+attribute-value pairs as parameters to the constructor.  I<E.g.>:
+
+ $h = new HTTP::Headers
+     Date         => 'Thu, 03 Feb 1994 00:00:00 GMT',
+     Content_Type => 'text/html; version=3.2',
+     Content_Base => 'http://www.sn.no/';
+
+=cut
+
+sub new
+{
+    my($class) = shift;
+    my $self = bless {}, $class;
+    $self->header(@_); # set up initial headers
+    $self;
+}
+
+
+=item $h->header($field [=> $value],...)
+
+Get or set the value of a header.  The header field name is not case
+sensitive.  To make the life easier for perl users who wants to avoid
+quoting before the => operator, you can use '_' as a synonym for '-'
+in header names (this behaviour can be suppressed by setting
+$HTTP::Headers::TRANSLATE_UNDERSCORE to a FALSE value).
+
+The header() method accepts multiple ($field => $value) pairs, so you
+can update several fields with a single invocation.
+
+The optional $value argument may be a scalar or a reference to a list
+of scalars. If the $value argument is undefined or not given, then the
+header is not modified.
+
+The old value of the last of the $field values is returned.
+Multi-valued fields will be concatenated with "," as separator in
+scalar context.
+
+ $header->header(MIME_Version => '1.0',
+		 User_Agent   => 'My-Web-Client/0.01');
+ $header->header(Accept => "text/html, text/plain, image/*");
+ $header->header(Accept => [qw(text/html text/plain image/*)]);
+ @accepts = $header->header('Accept');
+
+=cut
+
+sub header
+{
+    my $self = shift;
+    my($field, $val, @old);
+    while (($field, $val) = splice(@_, 0, 2)) {
+	@old = $self->_header($field, $val);
+    }
+    return @old if wantarray;
+    return $old[0] if @old <= 1;
+    join(", ", @old);
+}
+
+sub _header
+{
+    my($self, $field, $val, $push) = @_;
+    $field =~ tr/_/-/ if $TRANSLATE_UNDERSCORE;
+
+    # $push is only used interally sub push_header
+    Carp::croak('Need a field name') unless length($field);
+
+    my $lc_field = lc $field;
+    unless(defined $standard_case{$lc_field}) {
+	# generate a %stadard_case entry for this field
+	$field =~ s/\b(\w)/\u$1/g;
+	$standard_case{$lc_field} = $field;
+    }
+
+    my $h = $self->{$lc_field};
+    my @old = ref($h) ? @$h : (defined($h) ? ($h) : ());
+
+    if (defined $val) {
+	my @new = $push ? @old : ();
+	if (!ref($val)) {
+	    push(@new, $val);
+	} elsif (ref($val) eq 'ARRAY') {
+	    push(@new, @$val);
+	} else {
+	    Carp::croak("Unexpected field value $val");
+	}
+	$self->{$lc_field} = @new > 1 ? \@new : $new[0];
+    }
+    @old;
+}
+
+
+# Compare function which makes it easy to sort headers in the
+# recommended "Good Practice" order.
+sub _header_cmp
+{
+    # Unknown headers are assign a large value so that they are
+    # sorted last.  This also helps avoiding a warning from -w
+    # about comparing undefined values.
+    $header_order{$a} = 999 unless defined $header_order{$a};
+    $header_order{$b} = 999 unless defined $header_order{$b};
+
+    $header_order{$a} <=> $header_order{$b} || $a cmp $b;
+}
+
+
+=item $h->scan(\&doit)
+
+Apply a subroutine to each header in turn.  The callback routine is
+called with two parameters; the name of the field and a single value.
+If the header has more than one value, then the routine is called once
+for each value.  The field name passed to the callback routine has
+case as suggested by HTTP Spec, and the headers will be visited in the
+recommended "Good Practice" order.
+
+=cut
+
+sub scan
+{
+    my($self, $sub) = @_;
+    my $key;
+    foreach $key (sort _header_cmp keys %$self) {
+        next if $key =~ /^_/;
+	my $vals = $self->{$key};
+	if (ref($vals)) {
+	    my $val;
+	    for $val (@$vals) {
+		&$sub($standard_case{$key} || $key, $val);
+	    }
+	} else {
+	    &$sub($standard_case{$key} || $key, $vals);
+	}
+    }
+}
+
+
+=item $h->as_string([$endl])
+
+Return the header fields as a formatted MIME header.  Since it
+internally uses the C<scan()> method to build the string, the result
+will use case as suggested by HTTP Spec, and it will follow
+recommended "Good Practice" of ordering the header fieds.  Long header
+values are not folded. 
+
+The optional parameter specifies the line ending sequence to use.  The
+default is C<"\n">.  Embedded "\n" characters in the header will be
+substitued with this line ending sequence.
+
+=cut
+
+sub as_string
+{
+    my($self, $endl) = @_;
+    $endl = "\n" unless defined $endl;
+
+    my @result = ();
+    $self->scan(sub {
+	my($field, $val) = @_;
+	if ($val =~ /\n/) {
+	    # must handle header values with embedded newlines with care
+	    $val =~ s/\s+$//;          # trailing newlines and space must go
+	    $val =~ s/\n\n+/\n/g;      # no empty lines
+	    $val =~ s/\n([^\040\t])/\n $1/g;  # intial space for continuation
+	    $val =~ s/\n/$endl/g;      # substitute with requested line ending
+	}
+	push(@result, "$field: $val");
+    });
+
+    join($endl, @result, '');
+}
+
+
+# The remaining functions should autoloaded only when needed
+
+# A bug in 5.002gamma makes it risky to have POD text inside the
+# autoloaded section of the code, so we keep the documentation before
+# the __DATA__ token.
+
+=item $h->push_header($field, $val)
+
+Add a new field value of the specified header.  The header field name
+is not case sensitive.  The field need not already have a
+value. Previous values for the same field are retained.  The argument
+may be a scalar or a reference to a list of scalars.
+
+ $header->push_header(Accept => 'image/jpeg');
+
+=item $h->remove_header($field,...)
+
+This function removes the headers with the specified names.
+
+=item $h->clone
+
+Returns a copy of this HTTP::Headers object.
+
+=back
+
+=head1 CONVENIENCE METHODS
+
+The most frequently used headers can also be accessed through the
+following convenience methods.  These methods can both be used to read
+and to set the value of a header.  The header value is set if you pass
+an argument to the method.  The old header value is always returned.
+
+Methods that deal with dates/times always convert their value to system
+time (seconds since Jan 1, 1970) and they also expect this kind of
+value when the header value is set.
+
+=over 4
+
+=item $h->date
+
+This header represents the date and time at which the message was
+originated. I<E.g.>:
+
+  $h->date(time);  # set current date
+
+=item $h->expires
+
+This header gives the date and time after which the entity should be
+considered stale.
+
+=item $h->if_modified_since
+
+=item $h->if_unmodified_since
+
+This header is used to make a request conditional.  If the requested
+resource has (not) been modified since the time specified in this field,
+then the server will return a C<"304 Not Modified"> response instead of
+the document itself.
+
+=item $h->last_modified
+
+This header indicates the date and time at which the resource was last
+modified. I<E.g.>:
+
+  # check if document is more than 1 hour old
+  if ($h->last_modified < time - 60*60) {
+	...
+  }
+
+=item $h->content_type
+
+The Content-Type header field indicates the media type of the message
+content. I<E.g.>:
+
+  $h->content_type('text/html');
+
+The value returned will be converted to lower case, and potential
+parameters will be chopped off and returned as a separate value if in
+an array context.  This makes it safe to do the following:
+
+  if ($h->content_type eq 'text/html') {
+     # we enter this place even if the real header value happens to
+     # be 'TEXT/HTML; version=3.0'
+     ...
+  }
+
+=item $h->content_encoding
+
+The Content-Encoding header field is used as a modifier to the
+media type.  When present, its value indicates what additional
+encoding mechanism has been applied to the resource.
+
+=item $h->content_length
+
+A decimal number indicating the size in bytes of the message content.
+
+=item $h->content_language
+
+The natural language(s) of the intended audience for the message
+content.  The value is one or more language tags as defined by RFC
+1766.  Eg. "no" for Norwegian and "en-US" for US-English.
+
+=item $h->title
+
+The title of the document.  In libwww-perl this header will be
+initialized automatically from the E<lt>TITLE>...E<lt>/TITLE> element
+of HTML documents.  I<This header is no longer part of the HTTP
+standard.>
+
+=item $h->user_agent
+
+This header field is used in request messages and contains information
+about the user agent originating the request.  I<E.g.>:
+
+  $h->user_agent('Mozilla/1.2');
+
+=item $h->server
+
+The server header field contains information about the software being
+used by the originating server program handling the request.
+
+=item $h->from
+
+This header should contain an Internet e-mail address for the human
+user who controls the requesting user agent.  The address should be
+machine-usable, as defined by RFC822.  E.g.:
+
+  $h->from('Gisle Aas <aas@sn.no>');
+
+=item $h->referer
+
+Used to specify the address (URI) of the document from which the
+requested resouce address was obtained.
+
+=item $h->www_authenticate
+
+This header must be included as part of a "401 Unauthorized" response.
+The field value consist of a challenge that indicates the
+authentication scheme and parameters applicable to the requested URI.
+
+=item $h->proxy_authenticate
+
+This header must be included in a "407 Proxy Authentication Required"
+response.
+
+=item $h->authorization
+
+=item $h->proxy_authorization
+
+A user agent that wishes to authenticate itself with a server or a
+proxy, may do so by including these headers.
+
+=item $h->authorization_basic
+
+This method is used to get or set an authorization header that use the
+"Basic Authentication Scheme".  In array context it will return two
+values; the user name and the password.  In scalar context it will
+return I<"uname:password"> as a single string value.
+
+When used to set the header value, it expects two arguments.  I<E.g.>:
+
+  $h->authorization_basic($uname, $password);
+
+The method will croak if the $uname contains a colon ':'.
+
+=item $h->proxy_authorization_basic
+
+Same as authorization_basic() but will set the "Proxy-Authorization"
+header instead.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 1995-1998 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+1;
+
+#__DATA__
+
+sub clone
+{
+    my $self = shift;
+    my $clone = new HTTP::Headers;
+    $self->scan(sub { $clone->push_header(@_);} );
+    $clone;
+}
+
+sub push_header
+{
+    Carp::croak('Usage: $h->push_header($field, $val)') if @_ != 3;
+    shift->_header(@_, 'PUSH');
+}
+
+
+sub remove_header
+{
+    my($self, @fields) = @_;
+    my $field;
+    foreach $field (@fields) {
+	$field =~ tr/_/-/ if $TRANSLATE_UNDERSCORE;
+	delete $self->{lc $field};
+    }
+}
+
+# Convenience access functions
+
+sub _date_header
+{
+    require HTTP::Date;
+    my($self, $header, $time) = @_;
+    my($old) = $self->_header($header);
+    if (defined $time) {
+	$self->_header($header, HTTP::Date::time2str($time));
+    }
+    HTTP::Date::str2time($old);
+}
+
+sub date                { shift->_date_header('Date',                @_); }
+sub expires             { shift->_date_header('Expires',             @_); }
+sub if_modified_since   { shift->_date_header('If-Modified-Since',   @_); }
+sub if_unmodified_since { shift->_date_header('If-Unmodified-Since', @_); }
+sub last_modified       { shift->_date_header('Last-Modified',       @_); }
+
+# This is used as a private LWP extention.  The Client-Date header is
+# added as a timestamp to a response when it has been received.
+sub client_date         { shift->_date_header('Client-Date',         @_); }
+
+# The retry_after field is dual format (can also be a expressed as
+# number of seconds from now), so we don't provide an easy way to
+# access it until we have know how both these interfaces can be
+# addressed.  One possibility is to return a negative value for
+# relative seconds and a positive value for epoch based time values.
+#sub retry_after       { shift->_date_header('Retry-After',       @_); }
+
+sub content_type      {
+  my $ct = (shift->_header('Content-Type', @_))[0];
+  return '' unless defined($ct) && length($ct);
+  my @ct = split(/\s*;\s*/, lc($ct));
+  wantarray ? @ct : $ct[0];
+}
+
+sub title             { (shift->_header('Title',            @_))[0] }
+sub content_encoding  { (shift->_header('Content-Encoding', @_))[0] }
+sub content_language  { (shift->_header('Content-Language', @_))[0] }
+sub content_length    { (shift->_header('Content-Length',   @_))[0] }
+
+sub user_agent        { (shift->_header('User-Agent',       @_))[0] }
+sub server            { (shift->_header('Server',           @_))[0] }
+
+sub from              { (shift->_header('From',             @_))[0] }
+sub referer           { (shift->_header('Referer',          @_))[0] }
+sub warning           { (shift->_header('Warning',          @_))[0] }
+
+sub www_authenticate  { (shift->_header('WWW-Authenticate', @_))[0] }
+sub authorization     { (shift->_header('Authorization',    @_))[0] }
+
+sub proxy_authenticate  { (shift->_header('Proxy-Authenticate',  @_))[0] }
+sub proxy_authorization { (shift->_header('Proxy-Authorization', @_))[0] }
+
+sub authorization_basic       { shift->_basic_auth("Authorization",       @_) }
+sub proxy_authorization_basic { shift->_basic_auth("Proxy-Authorization", @_) }
+
+sub _basic_auth {
+    require MIME::Base64;
+    my($self, $h, $user, $passwd) = @_;
+    my($old) = $self->_header($h);
+    if (defined $user) {
+	Carp::croak("Basic authorization user name can't contain ':'")
+	  if $user =~ /:/;
+	$passwd = '' unless defined $passwd;
+	$self->_header($h => 'Basic ' .
+                             MIME::Base64::encode("$user:$passwd", ''));
+    }
+    if (defined $old && $old =~ s/^\s*Basic\s+//) {
+	my $val = MIME::Base64::decode($old);
+	return $val unless wantarray;
+	return split(/:/, $val, 2);
+    }
+    return;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Auth.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Auth.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Auth.pm	(revision 21083)
@@ -0,0 +1,94 @@
+package HTTP::Headers::Auth;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+require HTTP::Headers;
+package HTTP::Headers;
+
+BEGIN {
+    # we provide a new (and better) implementations below
+    undef(&www_authenticate);
+    undef(&proxy_authenticate);
+}
+
+require HTTP::Headers::Util;
+
+sub _parse_authenticate
+{
+    my @ret;
+    for (HTTP::Headers::Util::split_header_words(@_)) {
+	if (!defined($_->[1])) {
+	    # this is a new auth scheme
+	    push(@ret, lc(shift @$_) => {});
+	    shift @$_;
+	}
+	if (@ret) {
+	    # this a new parameter pair for the last auth scheme
+	    while (@$_) {
+		my $k = lc(shift @$_);
+		my $v = shift @$_;
+	        $ret[-1]{$k} = $v;
+	    }
+	} else {
+	    # something wrong, parameter pair without any scheme seen
+	    # IGNORE
+	}
+    }
+    @ret;
+}
+
+sub _authenticate
+{
+    my $self = shift;
+    my $header = shift;
+    my @old = $self->_header($header);
+    if (@_) {
+	$self->remove_header($header);
+	my @new = @_;
+	while (@new) {
+	    my $a_scheme = shift(@new);
+	    if ($a_scheme =~ /\s/) {
+		# assume complete valid value, pass it through
+		$self->push_header($header, $a_scheme);
+	    } else {
+		my @param;
+		if (@new) {
+		    my $p = $new[0];
+		    if (ref($p) eq "ARRAY") {
+			@param = @$p;
+			shift(@new);
+		    } elsif (ref($p) eq "HASH") {
+			@param = %$p;
+			shift(@new);
+		    }
+		}
+		my $val = ucfirst(lc($a_scheme));
+		if (@param) {
+		    my $sep = " ";
+		    while (@param) {
+			my $k = shift @param;
+			my $v = shift @param;
+			if ($v =~ /[^0-9a-zA-Z]/ || lc($k) eq "realm") {
+			    # must quote the value
+			    $v =~ s,([\\\"]),\\$1,g;
+			    $v = qq("$v");
+			}
+			$val .= "$sep$k=$v";
+			$sep = ", ";
+		    }
+		}
+		$self->push_header($header, $val);
+	    }
+	}
+    }
+    return unless defined wantarray;
+    wantarray ? _parse_authenticate(@old) : join(", ", @old);
+}
+
+
+sub www_authenticate    { shift->_authenticate("WWW-Authenticate", @_)   }
+sub proxy_authenticate  { shift->_authenticate("Proxy-Authenticate", @_) }
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/ETag.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/ETag.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/ETag.pm	(revision 21083)
@@ -0,0 +1,88 @@
+package HTTP::Header::ETag;
+
+use strict;
+use vars qw($VERSION);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+require HTTP::Date;
+
+require HTTP::Headers;
+package HTTP::Headers;
+
+sub _etags
+{
+    my $self = shift;
+    my $header = shift;
+    my @old = _split_etag_list($self->_header($header));
+    if (@_) {
+	$self->_header($header => join(", ", _split_etag_list(@_)));
+    }
+    wantarray ? @old : join(", ", @old);
+}
+
+sub etag          { shift->_etags("ETag", @_); }
+sub if_match      { shift->_etags("If-Match", @_); }
+sub if_none_match { shift->_etags("If-None-Match", @_); }
+
+sub if_range {
+    # Either a date or an entity-tag
+    my $self = shift;
+    my @old = $self->_header("If-Range");
+    if (@_) {
+	my $new = shift;
+	if (!defined $new) {
+	    $self->remove_header("If-Range");
+	} elsif ($new =~ /^\d+$/) {
+	    $self->_date_header("If-Range", $new);
+	} else {
+	    $self->_etags("If-Range", $new);
+	}
+    }
+    return unless defined(wantarray);
+    for (@old) {
+	my $t = HTTP::Date::str2time($_);
+	$_ = $t if $t;
+    }
+    wantarray ? @old : join(", ", @old);
+}
+
+
+# Split a list of entity tag values.  The return value is a list
+# consisting of one element per entity tag.  Suitable for parsing
+# headers like C<If-Match>, C<If-None-Match>.  You might even want to
+# use it on C<ETag> and C<If-Range> entity tag values, because it will
+# normalize them to the common form.
+#
+#  entity-tag	  = [ weak ] opaque-tag
+#  weak		  = "W/"
+#  opaque-tag	  = quoted-string
+
+
+sub _split_etag_list
+{
+    my(@val) = @_;
+    my @res;
+    for (@val) {
+        while (length) {
+            my $weak = "";
+	    $weak = "W/" if s,^\s*[wW]/,,;
+            my $etag = "";
+	    if (s/^\s*(\"[^\"\\]*(?:\\.[^\"\\]*)*\")//) {
+		push(@res, "$weak$1");
+            } elsif (s/^\s*,//) {
+                push(@res, qq(W/"")) if $weak;
+            } elsif (s/^\s*([^,\s]+)//) {
+                $etag = $1;
+		$etag =~ s/([\"\\])/\\$1/g;
+	        push(@res, qq($weak"$etag"));
+            } elsif (s/^\s+// || !length) {
+                push(@res, qq(W/"")) if $weak;
+            } else {
+	 	die "This should not happen: '$_'";
+            }
+        }
+   }
+   @res;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Util.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Util.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Headers/Util.pm	(revision 21083)
@@ -0,0 +1,180 @@
+package HTTP::Headers::Util;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT_OK=qw(split_header_words join_header_words);
+
+=head1 NAME
+
+HTTP::Headers::Util - Header value parsing utility functions
+
+=head1 SYNOPSIS
+
+  use HTTP::Headers::Util qw(split_header_words);
+  @values = split_header_words($h->header("Content-Type"));
+
+=head1 DESCRIPTION
+
+This module provide a few functions that helps parsing and
+construction of valid HTTP header values.  None of the functions are
+exported by default.
+
+The following functions are provided:
+
+=over 4
+
+
+=item split_header_words( @header_values )
+
+This function will parse the header values given as argument into a
+list of anonymous arrays containing key/value pairs.  The function
+know how to deal with ",", ";" and "=" as well as quoted values after
+"=".  A list of space separated tokens are parsed as if they were
+separated by ";".
+
+If the @header_values passed as argument contains multiple values,
+then they are treated as if they were a single value separated by
+comma ",".
+
+This means that this function is useful to parse header fields that
+follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
+the requirement for tokens).
+
+  headers           = #header
+  header            = (token | parameter) *( [";"] (token | parameter))
+
+  token             = 1*<any CHAR except CTLs or separators>
+  separators        = "(" | ")" | "<" | ">" | "@"
+                    | "," | ";" | ":" | "\" | <">
+                    | "/" | "[" | "]" | "?" | "="
+                    | "{" | "}" | SP | HT
+
+  quoted-string     = ( <"> *(qdtext | quoted-pair ) <"> )
+  qdtext            = <any TEXT except <">>
+  quoted-pair       = "\" CHAR
+
+  parameter         = attribute "=" value
+  attribute         = token
+  value             = token | quoted-string
+
+Each I<header> is represented by an anonymous array of key/value
+pairs.  If a token is recognized then the value will be C<undef>.
+Syntactically incorrect headers will not necessary be parsed as you
+would want.
+
+This is easier to describe with some examples:
+
+   split_header_words('foo="bar"; port="80,81"; discard, bar=baz')
+   split_header_words('text/html; charset="iso-8859-1");
+   split_header_words('Basic realm="\"foo\\bar\""');
+
+will return
+
+   [foo=>'bar', port=>'80,81', discard=> undef], [bar=>'baz' ]
+   ['text/html' => undef, charset => 'iso-8859-1']
+   [Basic => undef, realm => '"foo\bar"']
+
+=cut
+
+
+sub split_header_words
+{
+    my(@val) = @_;
+    my @res;
+    for (@val) {
+	my @cur;
+	while (length) {
+	    if (s/^\s*(=*[^\s=;,]+)//) {  # 'token' or parameter 'attribute'
+		push(@cur, $1);
+		# a quoted value
+		if (s/^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"//) {
+		    my $val = $1;
+		    $val =~ s/\\(.)/$1/g;
+		    push(@cur, $val);
+		# some unquoted value
+		} elsif (s/^\s*=\s*([^;,\s]*)//) {
+		    my $val = $1;
+		    $val =~ s/\s+$//;
+		    push(@cur, $val);
+		# no value, a lone token
+		} else {
+		    push(@cur, undef);
+		}
+	    } elsif (s/^\s*,//) {
+		push(@res, [@cur]) if @cur;
+		@cur = ();
+	    } elsif (s/^\s*;// || s/^\s+//) {
+		# continue
+	    } else {
+		die "This should not happen: '$_'";
+	    }
+	}
+	push(@res, \@cur) if @cur;
+    }
+    @res;
+}
+
+
+=item join_header_words( @arrays )
+
+This will do the opposite convertion of what split_header_words()
+does.  It takes a list of anonymous arrays as argument (or a list of
+key/value pairs) and produce a single header value.  Attribute values
+are quoted if needed.
+
+Example:
+
+   join_header_words(["text/plain" => undef, charset => "iso-8859/1"]);
+   join_header_words(""text/plain" => undef, charset => "iso-8859/1");
+
+will both return the string:
+
+   text/plain; charset="iso-8859/1"
+
+=cut
+
+sub join_header_words
+{
+    @_ = ([@_]) if @_ && !ref($_[0]);
+    my @res;
+    for (@_) {
+	my @cur = @$_;
+	my @attr;
+	while (@cur) {
+	    my $k = shift @cur;
+	    my $v = shift @cur;
+	    if (defined $v) {
+		if ($v =~ /^\w+$/) {
+		    $k .= "=$v";
+		} else {
+		    $v =~ s/([\"\\])/\\$1/g;  # escape " and \
+		    $k .= qq(="$v");
+		}
+	    }
+	    push(@attr, $k);
+	}
+	push(@res, join("; ", @attr)) if @attr;
+    }
+    join(", ", @res);
+}
+
+1;
+
+__END__
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 1997-1998, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Message.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Message.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Message.pm	(revision 21083)
@@ -0,0 +1,208 @@
+#
+# $Id$
+
+package HTTP::Message;
+
+=head1 NAME
+
+HTTP::Message - Class encapsulating HTTP messages
+
+=head1 SYNOPSIS
+
+ package HTTP::Request;  # or HTTP::Response
+ require HTTP::Message;
+ @ISA=qw(HTTP::Message);
+
+=head1 DESCRIPTION
+
+A C<HTTP::Message> object contains some headers and a content (body).
+The class is abstract, i.e. it only used as a base class for
+C<HTTP::Request> and C<HTTP::Response> and should never instantiated
+as itself.
+
+The following methods are available:
+
+=over 4
+
+=cut
+
+#####################################################################
+
+require HTTP::Headers;
+require Carp;
+use strict;
+use vars qw($VERSION $AUTOLOAD);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+=item $mess = new HTTP::Message;
+
+This is the object constructor.  It should only be called internally
+by this library.  External code should construct C<HTTP::Request> or
+C<HTTP::Response> objects.
+
+=cut
+
+sub new
+{
+    my($class, $header, $content) = @_;
+    if (defined $header) {
+	Carp::croak("Bad header argument") unless ref $header;
+	$header = $header->clone;
+    } else {
+	$header = HTTP::Headers->new;
+    }
+    $content = '' unless defined $content;
+    bless {
+	'_headers' => $header,
+	'_content' => $content,
+    }, $class;
+}
+
+
+=item $mess->clone()
+
+Returns a copy of the object.
+
+=cut
+
+sub clone
+{
+    my $self  = shift;
+    my $clone = HTTP::Message->new($self->{'_headers'}, $self->{'_content'});
+    $clone;
+}
+
+=item $mess->protocol([$proto])
+
+Sets the HTTP protocol used for the message.  The protocol() is a string
+like "HTTP/1.0" or "HTTP/1.1".
+
+=cut
+
+sub protocol { shift->_elem('_protocol',  @_); }
+
+=item $mess->content([$content])
+
+The content() method sets the content if an argument is given.  If no
+argument is given the content is not touched.  In either case the
+previous content is returned.
+
+=item $mess->add_content($data)
+
+The add_content() methods appends more data to the end of the previous
+content.
+
+=cut
+
+sub content   { shift->_elem('_content',  @_); }
+
+sub add_content
+{
+    my $self = shift;
+    if (ref($_[0])) {
+	$self->{'_content'} .= ${$_[0]};  # for backwards compatability
+    } else {
+	$self->{'_content'} .= $_[0];
+    }
+}
+
+=item $mess->content_ref
+
+The content_ref() method will return a reference to content string.
+It can be more efficient to access the content this way if the content
+is huge, and it can be used for direct manipulation of the content,
+for instance:
+
+  ${$res->content_ref} =~ s/\bfoo\b/bar/g;
+
+=cut
+
+sub content_ref
+{
+    my $self = shift;
+    \$self->{'_content'};
+}
+
+sub as_string
+{
+    "";  # To be overridden in subclasses
+}
+
+=item $mess->headers;
+
+Return the embedded HTTP::Headers object.
+
+=item $mess->headers_as_string([$endl])
+
+Call the HTTP::Headers->as_string() method for the headers in the
+message.
+
+=cut
+
+sub headers            { shift->{'_headers'};                }
+sub headers_as_string  { shift->{'_headers'}->as_string(@_); }
+
+=back
+
+All unknown C<HTTP::Message> methods are delegated to the
+C<HTTP::Headers> object that is part of every message.  This allows
+convenient access to these methods.  Refer to L<HTTP::Headers> for
+details of these methods:
+
+  $mess->header($field => $val);
+  $mess->scan(\&doit);
+  $mess->push_header($field => $val);
+  $mess->remove_header($field);
+
+  $mess->date;
+  $mess->expires;
+  $mess->if_modified_since;
+  $mess->if_unmodified_since;
+  $mess->last_modified;
+  $mess->content_type;
+  $mess->content_encoding;
+  $mess->content_length;
+  $mess->content_language
+  $mess->title;
+  $mess->user_agent;
+  $mess->server;
+  $mess->from;
+  $mess->referer;
+  $mess->www_authenticate;
+  $mess->authorization;
+  $mess->proxy_authorization;
+  $mess->authorization_basic;
+  $mess->proxy_authorization_basic;
+
+=cut
+
+
+# delegate all other method calls the the _headers object.
+sub AUTOLOAD
+{
+    my $self = shift;
+    my $method = substr($AUTOLOAD, rindex($AUTOLOAD, '::')+2);
+    return if $method eq "DESTROY";
+    $self->{'_headers'}->$method(@_);
+}
+
+# Private method to access members in %$self
+sub _elem
+{
+    my $self = shift;
+    my $elem = shift;
+    my $old = $self->{$elem};
+    $self->{$elem} = $_[0] if @_;
+    return $old;
+}
+
+1;
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Negotiate.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Negotiate.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Negotiate.pm	(revision 21083)
@@ -0,0 +1,505 @@
+# $Id$
+#
+
+package HTTP::Negotiate;
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+sub Version { $VERSION; }
+
+require 5.002;
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(choose);
+
+require HTTP::Headers;
+
+$DEBUG = 0;
+
+sub choose ($;$)
+{
+    my($variants, $request) = @_;
+    my(%accept);
+
+    unless (defined $request) {
+	# Create a request object from the CGI envirionment variables
+	$request = new HTTP::Headers;
+	$request->header('Accept', $ENV{HTTP_ACCEPT})
+	  if $ENV{HTTP_ACCEPT};
+	$request->header('Accept-Charset', $ENV{HTTP_ACCEPT_CHARSET})
+	  if $ENV{HTTP_ACCEPT_CHARSET};
+	$request->header('Accept-Encoding', $ENV{HTTP_ACCEPT_ENCODING})
+	  if $ENV{HTTP_ACCEPT_ENCODING};
+	$request->header('Accept-Language', $ENV{HTTP_ACCEPT_LANGUAGE})
+	  if $ENV{HTTP_ACCEPT_LANGUAGE};
+    }
+
+    # Get all Accept values from the request.  Build a hash initialized
+    # like this:
+    #
+    #   %accept = ( type =>     { 'audio/*'     => { q => 0.2, mbx => 20000 },
+    #                             'audio/basic' => { q => 1 },
+    #                           },
+    #               language => { 'no'          => { q => 1 },
+    #                           }
+    #             );
+
+    $request->scan(sub {
+	my($key, $val) = @_;
+	return unless $key =~ s/^Accept-?//;
+	my $type = lc $key;
+	$type = "type" unless length $key;
+	$val =~ s/\s+//g;
+	my $name;
+	for $name (split(/,/, $val)) {
+	    my(%param, $param);
+	    if ($name =~ s/;(.*)//) {
+		for $param (split(/;/, $1)) {
+		    my ($pk, $pv) = split(/=/, $param, 2);
+		    $param{$pk} = $pv;
+		}
+	    }
+	    $name = lc $name;
+	    if (defined $param{'q'}) {
+		$param{'q'} = 1 if $param{'q'} > 1;
+		$param{'q'} = 0 if $param{'q'} < 0;
+	    } else {
+		$param{'q'} = 1;
+	    }
+
+	    $param{'q'} = 1 unless defined $param{'q'};
+	    $accept{$type}{$name} = \%param;
+	}
+    });
+
+    # Check if any of the variants specify a language.  We do this
+    # because it influence how we treat those without (they default to
+    # 0.5 instead of 1).
+    my $any_lang = 0;
+    for $var (@$variants) {
+	if ($var->[5]) {
+	    $any_lang = 1;
+	    last;
+	}
+    }
+
+    if ($DEBUG) {
+	print "Netgotiantion parameters in the request\n";
+	for $type (keys %accept) {
+	    print " $type:\n";
+	    for $name (keys %{$accept{$type}}) {
+		print "    $name\n";
+		for $pv (keys %{$accept{$type}{$name}}) {
+		    print "      $pv = $accept{$type}{$name}{$pv}\n";
+		}
+	    }
+	}
+    }
+
+    my @Q = ();  # This is where we collect the results of the
+		 # quality calcualtions
+
+    # Calculate quality for all the variant's that are available.
+    for (@$variants) {
+	my($id, $qs, $ct, $enc, $cs, $lang, $bs) = @$_;
+	$qs = 1 unless defined $qs;
+	$bs = 0 unless defined $bs;
+	if ($DEBUG) {
+	    print "\nEvaluating $id ($ct)\n";
+	    printf "  qs   = %.3f\n", $qs;
+	    print  "  enc  = $enc\n"  if $enc && !ref($enc);
+	    print  "  enc  = @$enc\n" if $enc && ref($enc);
+	    print  "  cs   = $cs\n"   if $cs;
+	    print  "  lang = $lang\n" if $lang;
+	    print  "  bs   = $bs\n"   if $bs;
+	}
+
+	# Calculate encoding quality
+	my $qe = 1;
+	# If the variant has no assignes Content-Encoding, or if no
+	# Accept-Encoding field is present, then the value assigned
+	# is "qe=1".  If *all* of the variant's content encoddings
+	# are listed in the Accept-Encoding field, then the value
+	# assigned is "qw=1".  If *any* of the variant's content
+	# encodings are not listed in the provided Accept-Encoding
+	# field, then the value assigned is "qe=0"
+	if (exists $accept{'encoding'} && $enc) {
+	    my @enc = ref($enc) ? @$enc : ($enc);
+	    for (@enc) {
+		print "Is encoding $_ accepted? " if $DEBUG;
+		unless(exists $accept{'encoding'}{$_}) {
+		    print "no\n" if $DEBUG;
+		    $qe = 0;
+		    last;
+		} else {
+		    print "yes\n" if $DEBUG;
+		}
+	    }
+	}
+
+	# Calculate charset quality
+	my $qc  = 1;
+	# If the variant's media-type has not charset parameter,
+	# or the variant's charset is US-ASCII, or if no Accept-Charset
+	# field is present, then the value assigned is "qc=1".  If the
+	# variantæs charset is listed in the Accept-Charset field,
+	# then the value assigned is "qc=1.  Otherwise, if the variant's
+	# charset is not listed in the provided Accept-Encoding field,
+	# then the value assigned is "qc=0".
+	if (exists $accept{'charset'} && $cs && $cs ne 'us-ascii' ) {
+	    $qc = 0 unless $accept{'charset'}{$cs};
+	}
+
+	# Calculate language quality
+	my $ql  = 1;
+	if ($lang && exists $accept{'language'}) {
+	    my @lang = ref($lang) ? @$lang : ($lang);
+	    # If any of the variant's content languages are listed
+	    # in the Accept-Language field, the the value assigned is
+	    # the maximus of the "q" paramet values for thos language
+	    # tags.
+	    my $q = undef;
+	    for (@lang) {
+		next unless exists $accept{'language'}{$_};
+		my $this_q = $accept{'language'}{$_}{'q'};
+		$q = $this_q unless defined $q;
+		$q = $this_q if $this_q > $q;
+	    }
+	    unless (defined $q) {
+		# If there was no exact match and at least one of
+		# the Accept-Language field values is a complete
+		# subtag prefix of the content language tag(s), then
+		# the "q" parameter value of the largest matching
+		# prefix is used.
+		my $selected = undef;
+		for $al (keys %{ $accept{'language'} }) {
+		    if (substr($lang, 0, length($al)) eq $al) {
+			$selected = $al unless defined $selected;
+			$selected = $al if length($al) > length($selected);
+		    }
+		}
+		$q = $accept{'language'}{$selected}{'q'} if $selected;
+
+		# If none of the variant's content language tags or
+		# tag prefixes are listed in the provided
+		# Accept-Language field, then the value assigned
+		# is "ql=0.001"
+		$q = 0.001 unless defined $q;
+	    }
+	    $ql = $q;
+	} else {
+	    $ql = 0.5 if $any_lang && exists $accept{'language'};
+	}
+
+	my $q   = 1;
+	my $mbx = undef;
+	# If no Accept field is given, then the value assigned is "q=1".
+	# If at least one listed media range matches the variant's media
+	# type, then the "q" parameter value assigned to the most specific
+	# of those matched is used (e.g. "text/html;version=3.0" is more
+	# specific than "text/html", which is more specific than "text/*",
+	# which in turn is more specific than "*/*"). If not media range
+	# in the provided Accept field matches the variant's media type,
+	# then the value assigned is "q=0".
+	if (exists $accept{'type'} && $ct) {
+	    # First we clean up our content-type
+	    $ct =~ s/\s+//g;
+	    my $params = "";
+	    $params = $1 if $ct =~ s/;(.*)//;
+	    my($type, $subtype) = split("/", $ct, 2);
+	    my %param = ();
+	    for $param (split(/;/, $params)) {
+		my($pk,$pv) = split(/=/, $param, 2);
+		$param{$pk} = $pv;
+	    }
+
+	    my $sel_q = undef;
+	    my $sel_mbx = undef;
+	    my $sel_specificness = 0;
+
+	    ACCEPT_TYPE:
+	    for $at (keys %{ $accept{'type'} }) {
+		print "Consider $at...\n" if $DEBUG;
+		my($at_type, $at_subtype) = split("/", $at, 2);
+		# Is it a match on the type
+		next if $at_type    ne '*' && $at_type    ne $type;
+		next if $at_subtype ne '*' && $at_subtype ne $subtype;
+		my $specificness = 0;
+		$specificness++ if $at_type ne '*';
+		$specificness++ if $at_subtype ne '*';
+		# Let's see if content-type parameters also match
+		while (($pk, $pv) = each %param) {
+		    print "Check if $pk = $pv is true\n" if $DEBUG;
+		    next unless exists $accept{'type'}{$at}{$pk};
+		    next ACCEPT_TYPE
+		      unless $accept{'type'}{$at}{$pk} eq $pv;
+		    print "yes it is!!\n" if $DEBUG;
+		    $specificness++;
+		}
+		print "Hurray, type match with specificness = $specificness\n"
+		  if $DEBUG;
+
+		if (!defined($sel_q) || $sel_specificness < $specificness) {
+		    $sel_q   = $accept{'type'}{$at}{'q'};
+		    $sel_mbx = $accept{'type'}{$at}{'mbx'};
+		    $sel_specificness = $specificness;
+		}
+	    }
+	    $q   = $sel_q || 0;
+	    $mbx = $sel_mbx;
+	}
+
+	my $Q;
+	if (!defined($mbx) || $mbx >= $bs) {
+	    $Q = $qs * $qe * $qc * $ql * $q;
+	} else {
+	    $Q = 0;
+	    print "Variant's size is too large ==> Q=0\n" if $DEBUG;
+	}
+
+	if ($DEBUG) {
+	    $mbx = "undef" unless defined $mbx;
+	    printf "Q=%.3f", $Q;
+	    print "  (q=$q, mbx=$mbx, qe=$qe, qc=$qc, ql=$ql, qs=$qs)\n";
+	}
+
+	push(@Q, [$id, $Q, $bs]);
+    }
+
+
+    @Q = sort { $b->[1] <=> $a->[1] || $a->[2] <=> $b->[2] } @Q;
+
+    return @Q if wantarray;
+    return undef unless @Q;
+    return undef if $Q[0][1] == 0;
+    $Q[0][0];
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+choose - choose a variant of a document to serve (HTTP content negotiation)
+
+=head1 SYNOPSIS
+
+ use HTTP::Negotiate;
+
+ #  ID       QS     Content-Type   Encoding Char-Set        Lang   Size
+ $variants =
+  [['var1',  1.000, 'text/html',   undef,   'iso-8859-1',   'en',   3000],
+   ['var2',  0.950, 'text/plain',  'gzip',  'us-ascii',     'no',    400],
+   ['var3',  0.3,   'image/gif',   undef,   undef,          undef, 43555],
+  ];
+
+ @prefered = choose($variants, $request_headers);
+ $the_one  = choose($variants);
+
+=head1 DESCRIPTION
+
+This module provide a complete implementation of the HTTP content
+negotiation algorithm specified in F<draft-ietf-http-v11-spec-00.ps>
+chapter 12.  Content negotiation allows for the selection of a
+preferred content representation based upon attributes of the
+negotiable variants and the value of the various Accept* header fields
+in the request.
+
+The variants are ordered by preference by calling the function
+choose().
+
+The first parameter is a description of the variants that we can
+choose among.  The variants are described by a reference to an array.
+Each element in this array is an array with the values [$id, $qs,
+$content_type, $content_encoding, $charset, $content_language,
+$content_length].  The meaning of these values are described
+below. The $content_encoding and $content_language can be either a
+single scalar value or an array reference if there are several values.
+
+The second optional parameter is a reference to the request headers.
+This is used to look for "Accept*" headers.  You can pass a reference
+to either a HTTP::Request or a HTTP::Headers object.  If this
+parameter is missing, then the accept specification is initialized
+from the CGI environment variables HTTP_ACCEPT, HTTP_ACCEPT_CHARSET,
+HTTP_ACCEPT_ENCODING and HTTP_ACCEPT_LANGUAGE.
+
+In array context, choose() returns a list of variant
+identifier/calculated quality pairs.  The values are sorted by
+quality, highest quality first.  If the calculated quality is the same
+for two variants, then they are sorted by size (smallest first). I<E.g.>:
+
+  (['var1' => 1], ['var2', 0.3], ['var3' => 0]);
+
+Note that also zero quality variants are included in the return list
+even if these should never be served to the client.
+
+In scalar context, it returns the identifier of the variant with the
+highest score or C<undef> if none have non-zero quality.
+
+If the $HTTP::Negotiate::DEBUG variable is set to TRUE, then a lot of
+noise is generated on STDOUT during evaluation of choose().
+
+=head1 VARIANTS
+
+A variant is described by a list of the following values.  If the
+attribute does not make sense or is unknown for a variant, then use
+C<undef> instead.
+
+=over 3
+
+=item identifier
+
+This is just some string that you use as a name for the variant.  The
+identifier of the preferred variant is returned by choose().
+
+=item qs
+
+This is a number between 0.000 and 1.000 that describes the "source
+quality".  This is what F<draft-ietf-http-v11-spec-00.ps> says about this
+value:
+
+Source quality is measured by the content provider as representing the
+amount of degradation from the original source.  For example, a
+picture in JPEG form would have a lower qs when translated to the XBM
+format, and much lower qs when translated to an ASCII-art
+representation.  Note, however, that this is a function of the source
+- an original piece of ASCII-art may degrade in quality if it is
+captured in JPEG form.  The qs values should be assigned to each
+variant by the content provider; if no qs value has been assigned, the
+default is generally "qs=1".
+
+=item content-type
+
+This is the media type of the variant.  The media type does not
+include a charset attribute, but might contain other parameters.
+Examples are:
+
+  text/html
+  text/html;version=2.0
+  text/plain
+  image/gif
+  image/jpg
+
+=item content-encoding
+
+This is one or more content encodings that has been applied to the
+variant.  The content encoding is generally used as a modifier to the
+content media type.  The most common content encodings are:
+
+  gzip
+  compress
+
+=item content-charset
+
+This is the character set used when the variant contains textual
+content.  The charset value should generally be C<undef> or one of these:
+
+  us-ascii
+  iso-8859-1 ... iso-8859-9
+  iso-2022-jp
+  iso-2022-jp-2
+  iso-2022-kr
+  unicode-1-1
+  unicode-1-1-utf-7
+  unicode-1-1-utf-8
+
+=item content-language
+
+This describes one or more languages that are used in the variant.
+Language is described like this in F<draft-ietf-http-v11-spec-00.ps>: A
+language is in this context a natural language spoken, written, or
+otherwise conveyed by human beings for communication of information to
+other human beings.  Computer languages are explicitly excluded.
+
+The language tags are the same as those defined by RFC-1766.  Examples
+are:
+
+  no               Norwegian
+  en               International English
+  en-US            US English
+  en-cockney
+
+=item content-length
+
+This is the number of bytes used to represent the content.
+
+=back
+
+=head1 ACCEPT HEADERS
+
+The following Accept* headers can be used for describing content
+preferences in a request (This description is an edited extract from
+F<draft-ietf-http-v11-spec-00.ps>):
+
+=over 3
+
+=item Accept
+
+This header can be used to indicate a list of media ranges which are
+acceptable as a reponse to the request.  The "*" character is used to
+group media types into ranges, with "*/*" indicating all media types
+and "type/*" indicating all subtypes of that type.
+
+The parameter q is used to indicate the quality factor, which
+represents the user's preference for that range of media types.  The
+parameter mbx gives the maximum acceptable size of the response
+content. The default values are: q=1 and mbx=infinity. If no Accept
+header is present, then the client accepts all media types with q=1.
+
+For example:
+
+  Accept: audio/*;q=0.2;mbx=200000, audio/basic
+
+would mean: "I prefer audio/basic (of any size), but send me any audio
+type if it is the best available after an 80% mark-down in quality and
+its size is less than 200000 bytes"
+
+
+=item Accept-Charset
+
+Used to indicate what character sets are acceptable for the response.
+The "us-ascii" character set is assumed to be acceptable for all user
+agents.  If no Accept-Charset field is given, the default is that any
+charset is acceptable.  Example:
+
+  Accept-Charset: iso-8859-1, unicode-1-1
+
+
+=item Accept-Encoding
+
+Restricts the Content-Encoding values which are acceptable in the
+response.  If no Accept-Encoding field is present, the server may
+assume that the client will accept any content encoding.  An empty
+Accept-Encoding means that no content encoding is acceptable.  Example:
+
+  Accept-Encoding: compress, gzip
+
+
+=item Accept-Language
+
+This field is similar to Accept, but restrict the set of natural
+languages that are preferred as a response.  Each language may be
+given an associated quality value which represents an estimate of the
+user's comprehension of that language.  For example:
+
+  Accept-Language: no, en-gb;q=0.8, de;q=0.55
+
+would mean: "I prefer Norwegian, but will accept British English (with
+80% comprehension) or German (with 55% comprehension).
+
+=back
+
+
+=head1 COPYRIGHT
+
+Copyright 1996, Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 AUTHOR
+
+Gisle Aas <aas@sn.no>
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request.pm	(revision 21083)
@@ -0,0 +1,160 @@
+#
+# $Id$
+
+package HTTP::Request;
+
+=head1 NAME
+
+HTTP::Request - Class encapsulating HTTP Requests
+
+=head1 SYNOPSIS
+
+ require HTTP::Request;
+ $request = HTTP::Request->new(GET => 'http://www.oslonett.no/');
+
+=head1 DESCRIPTION
+
+C<HTTP::Request> is a class encapsulating HTTP style requests,
+consisting of a request line, some headers, and some (potentially empty)
+content. Note that the LWP library also uses this HTTP style requests
+for non-HTTP protocols.
+
+Instances of this class are usually passed to the C<request()> method
+of an C<LWP::UserAgent> object:
+
+ $ua = LWP::UserAgent->new;
+ $request = HTTP::Request->new(GET => 'http://www.oslonett.no/');
+ $response = $ua->request($request);
+
+C<HTTP::Request> is a subclass of C<HTTP::Message> and therefore
+inherits its methods.  The inherited methods often used are header(),
+push_header(), remove_header(), headers_as_string() and content().
+See L<HTTP::Message> for details.
+
+The following additional methods are available:
+
+=over 4
+
+=cut
+
+require HTTP::Message;
+@ISA = qw(HTTP::Message);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use URI::URL ();
+use strict;
+
+=item $r = HTTP::Request->new($method, $url, [$header, [$content]])
+
+Constructs a new C<HTTP::Request> object describing a request on the
+object C<$url> using method C<$method>.  The C<$url> argument can be
+either a string, or a reference to a C<URI::URL> object.  The $header
+argument should be a reference to an C<HTTP::Headers> object.
+
+=cut
+
+sub new
+{
+    my($class, $method, $url, $header, $content) = @_;
+    my $self = $class->SUPER::new($header, $content);
+    $self->method($method);
+    $self->url($url);
+    $self;
+}
+
+
+sub clone
+{
+    my $self = shift;
+    my $clone = bless $self->SUPER::clone, ref($self);
+    $clone->method($self->method);
+    $clone->url($self->url);
+    $clone;
+}
+
+
+=item $r->method([$val])
+
+=item $r->url([$val])
+
+These methods provide public access to the member variables containing
+respectively the method of the request and the URL object of the
+request.
+
+If an argument is given the member variable is given that as its new
+value. If no argument is given the value is not touched. In either
+case the previous value is returned.
+
+The url() method accept both a reference to a URI::URL object and a
+string as its argument.  If a string is given, then it should be
+parseable as an absolute URL.
+
+=cut
+
+sub method  { shift->_elem('_method', @_); }
+
+sub url
+{
+    my $self = shift;
+    my $old = $self->{'_url'};
+    if (@_) {
+	my $url = shift;
+	if (!defined $url) {
+	    # that's ok
+	} elsif (ref $url) {
+	    $url = $url->abs;
+	} else {
+	    $url = eval { URI::URL->new($url) };
+	}
+	$self->{'_url'} = $url;
+    }
+    $old;
+}
+
+*uri = \&url;  # this is the same for now
+
+=item $r->as_string()
+
+Method returning a textual representation of the request.
+Mainly useful for debugging purposes. It takes no arguments.
+
+=cut
+
+sub as_string
+{
+    my $self = shift;
+    my @result;
+    #push(@result, "---- $self -----");
+    my $req_line = $self->method || "[NO METHOD]";
+    my $url = $self->url;
+    $url = (defined $url) ? $url->as_string : "[NO URL]";
+    $req_line .= " $url";
+    my $proto = $self->protocol;
+    $req_line .= " $proto" if $proto;
+
+    push(@result, $req_line);
+    push(@result, $self->headers_as_string);
+    my $content = $self->content;
+    if (defined $content) {
+	push(@result, $content);
+    }
+    #push(@result, ("-" x 40));
+    join("\n", @result, "");
+}
+
+1;
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Headers>, L<HTTP::Message>, L<HTTP::Request::Common>
+
+=head1 COPYRIGHT
+
+Copyright 1995-1998 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request/Common.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request/Common.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Request/Common.pm	(revision 21083)
@@ -0,0 +1,389 @@
+# $Id$
+#
+package HTTP::Request::Common;
+
+use strict;
+use vars qw(@EXPORT @EXPORT_OK $VERSION $DYNAMIC_FILE_UPLOAD);
+
+$DYNAMIC_FILE_UPLOAD ||= 0;  # make it defined (don't know why)
+
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT =qw(GET HEAD PUT POST);
+@EXPORT_OK = qw($DYNAMIC_FILE_UPLOAD);
+
+require HTTP::Request;
+use Carp();
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+my $CRLF = "\015\012";   # "\r\n" is not portable
+
+sub GET  { _simple_req('GET',  @_); }
+sub HEAD { _simple_req('HEAD', @_); }
+sub PUT  { _simple_req('PUT' , @_); }
+
+sub POST
+{
+    my $url = shift;
+    my $req = HTTP::Request->new(POST => $url);
+    my $content;
+    $content = shift if @_ and ref $_[0];
+    my($k, $v);
+    while (($k,$v) = splice(@_, 0, 2)) {
+	if (lc($k) eq 'content') {
+	    $content = $v;
+	} else {
+	    $req->push_header($k, $v);
+	}
+    }
+    my $ct = $req->header('Content-Type');
+    unless ($ct) {
+	$ct = 'application/x-www-form-urlencoded';
+    } elsif ($ct eq 'form-data') {
+	$ct = 'multipart/form-data';
+    }
+
+    if (ref $content) {
+	if (lc($ct) eq 'multipart/form-data') {    #XXX: boundary="..."
+	    my $boundary;
+	    ($content, $boundary) = form_data($content, $boundary);
+	    $boundary = qq("$boundary") if $boundary =~ /\W/;
+	    $ct = qq(multipart/form-data; boundary=$boundary);
+	} else {
+	    # We use a temporary URI::URL object to format
+	    # the application/x-www-form-urlencoded content.
+	    require URI::URL;
+	    my $url = URI::URL->new('http:');
+	    $url->query_form(ref($content) eq "HASH" ? %$content : @$content);
+	    $content = $url->equery;
+	}
+    }
+
+    $req->header('Content-Type' => $ct);  # might be redundant
+    if (defined($content)) {
+	$req->header('Content-Length' =>
+		     length($content)) unless ref($content);
+	$req->content($content);
+    }
+    $req;
+}
+
+
+sub _simple_req
+{
+    my($method, $url) = splice(@_, 0, 2);
+    my $req = HTTP::Request->new($method => $url);
+    my($k, $v);
+    while (($k,$v) = splice(@_, 0, 2)) {
+	if (lc($k) eq 'content') {
+	    $req->add_content($v);
+	} else {
+	    $req->push_header($k, $v);
+	}
+    }
+    $req;
+}
+
+
+sub form_data   # RFC1867
+{
+    my($data, $boundary) = @_;
+    my @data = ref($data) eq "HASH" ? %$data : @$data;  # copy
+    my $fhparts;
+    my @parts;
+    my($k,$v);
+    while (($k,$v) = splice(@data, 0, 2)) {
+	if (!ref($v)) {
+	    $k =~ s/([\\\"])/\\$1/g;  # escape quotes and backslashes
+	    push(@parts,
+		 qq(Content-Disposition: form-data; name="$k"$CRLF$CRLF$v));
+	} else {
+	    my($file, $usename, @headers) = @$v;
+	    unless (defined $usename) {
+		$usename = $file;
+		$usename =~ s,.*/,, if defined($usename);
+	    }
+	    my $disp = qq(form-data; name="$k");
+	    $disp .= qq(; filename="$usename") if $usename;
+	    my $content = "";
+	    my $h = HTTP::Headers->new(@headers);
+	    my $ct = $h->header("Content-Type");
+	    if ($file) {
+		require Symbol;
+		my $fh = Symbol::gensym();
+		open($fh, $file) or Carp::croak("Can't open file $file: $!");
+		binmode($fh);
+		if ($DYNAMIC_FILE_UPLOAD) {
+		    # will read file later
+		    $content = $fh;
+		} else {
+		    local($/) = undef; # slurp files
+		    $content = <$fh>;
+		    close($fh);
+		    $h->header("Content-Length" => length($content));
+		}
+		unless ($ct) {
+		    require LWP::MediaTypes;
+		    $ct = LWP::MediaTypes::guess_media_type($file, $h);
+		}
+	    }
+	    if ($h->header("Content-Disposition")) {
+		# just to get it sorted first
+		$disp = $h->header("Content-Disposition");
+		$h->remove_header("Content-Disposition");
+	    }
+	    if ($h->header("Content")) {
+		$content = $h->header("Content");
+		$h->remove_header("Content");
+	    }
+	    my $head = join($CRLF, "Content-Disposition: $disp",
+			           $h->as_string($CRLF),
+			           "");
+	    if (ref $content) {
+		push(@parts, [$head, $content]);
+		$fhparts++;
+	    } else {
+		push(@parts, $head . $content);
+	    }
+	}
+    }
+    return "" unless @parts;
+
+    my $content;
+    if ($fhparts) {
+	$boundary = boundary(10) # hopefully enough randomness
+	    unless $boundary;
+
+	# add the boundaries to the @parts array
+	for (1..@parts-1) {
+	    splice(@parts, $_*2-1, 0, "$CRLF--$boundary$CRLF");
+	}
+	unshift(@parts, "--$boundary$CRLF");
+	push(@parts, "$CRLF--$boundary--$CRLF");
+
+	# set up a closure that will return content piecemeal
+	$content = sub {
+	    for (;;) {
+		return unless @parts;
+		my $p = shift @parts;
+		unless (ref $p) {
+		    $p .= shift @parts while @parts && !ref($parts[0]);
+		    return $p;
+		}
+		my($buf, $fh) = @$p;
+		my $n = read($fh, $buf, 2048, length($buf));
+		if ($n) {
+		    unshift(@parts, ["", $fh]);
+		} else {
+		    close($fh);
+		}
+		return $buf if length $buf;
+	    }
+	};
+
+    } else {
+	$boundary = boundary() unless $boundary;
+
+	my $bno = 0;
+      CHECK_BOUNDARY:
+	{
+	    for (@parts) {
+		if (index($_, "--$boundary") >= 0) {
+		    # must have a better boundary
+		    #warn "Need something better that '$boundary' as boundary\n";
+		    $boundary = boundary(++$bno);
+		    redo CHECK_BOUNDARY;
+		}
+	    }
+	    last;
+	}
+	$content = "--$boundary$CRLF" .
+	           join("$CRLF--$boundary$CRLF", @parts) .
+		   "$CRLF--$boundary--$CRLF";
+    }
+
+    wantarray ? ($content, $boundary) : $content;
+}
+
+
+sub boundary
+{
+    my $size = shift || return "000";
+    require MIME::Base64;
+    my $b = MIME::Base64::encode(join("", map chr(rand(256)), 1..$size*3), "");
+    $b =~ s/[\W]/X/g;  # ensure alnum only
+    $b;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+HTTP::Request::Common - Construct common HTTP::Request objects
+
+=head1 SYNOPSIS
+
+  use HTTP::Request::Common;
+  $ua = LWP::UserAgent->new;
+  $ua->request(GET 'http://www.sn.no/');
+  $ua->request(POST 'http://somewhere/foo', [foo => bar, bar => foo]);
+
+=head1 DESCRIPTION
+
+This module provide functions that return newly created HTTP::Request
+objects.  These functions are usually more convenient to use than the
+standard HTTP::Request constructor for these common requests.  The
+following functions are provided.
+
+=over 4
+
+=item GET $url, Header => Value,...
+
+The GET() function returns a HTTP::Request object initialized with the
+GET method and the specified URL.  Without additional arguments it
+is exactly equivalent to the following call
+
+  HTTP::Request->new(GET => $url)
+
+but is less clutter.  It also reads better when used together with the
+LWP::UserAgent->request() method:
+
+  my $ua = new LWP::UserAgent;
+  my $res = $ua->request(GET 'http://www.sn.no')
+  if ($res->is_success) { ...
+
+You can also initialize the header values in the request by specifying
+some key/value pairs as optional arguments.  For instance:
+
+  $ua->request(GET 'http://www.sn.no',
+	           If_Match => 'foo',
+                   From     => 'gisle@aas.no',
+              );
+
+A header key called 'Content' is special and when seen the value will
+initialize the content part of the request instead of setting a header.
+
+=item HEAD $url, [Header => Value,...]
+
+Like GET() but the method in the request is HEAD.
+
+=item PUT $url, [Header => Value,...]
+
+Like GET() but the method in the request is PUT.
+
+=item POST $url, [$form_ref], [Header => Value,...]
+
+This works mostly like GET() with POST as method, but this function
+also takes a second optional array or hash reference parameter
+($form_ref).  This argument can be used to pass key/value pairs for
+the form content.  By default we will initialize a request using the
+C<application/x-www-form-urlencoded> content type.  This means that
+you can emulate a HTML E<lt>form> POSTing like this:
+
+  POST 'http://www.perl.org/survey.cgi',
+       [ name   => 'Gisle Aas',
+         email  => 'gisle@aas.no',
+         gender => 'M',
+         born   => '1964',
+         perc   => '3%',
+       ];
+
+This will create a HTTP::Request object that looks like this:
+
+  POST http://www.perl.org/survey.cgi
+  Content-Length: 66
+  Content-Type: application/x-www-form-urlencoded
+
+  name=Gisle%20Aas&email=gisle%40aas.no&gender=M&born=1964&perc=3%25
+
+The POST method also supports the C<multipart/form-data> content used
+for I<Form-based File Upload> as specified in RFC 1867.  You trigger
+this content format by specifying a content type of C<'form-data'> as
+one of the request headers.  If one of the values in the $form_ref is
+an array reference, then it is treated as a file part specification
+with the following interpretation:
+
+  [ $file, $filename, Header => Value... ]
+
+The first value in the array ($file) is the name of a file to open.
+This file will be read an its content placed in the request.  The
+routine will croak if the file can't be opened.  Use an C<undef> as $file
+value if you want to specify the content directly.  The $filename is
+the filename to report in the request.  If this value is undefined,
+then the basename of the $file will be used.  You can specify an empty
+string as $filename if you don't want any filename in the request.
+
+Sending my F<~/.profile> to the survey used as example above can be
+achieved by this:
+
+  POST 'http://www.perl.org/survey.cgi',
+       Content_Type => 'form-data',
+       Content      => [ name  => 'Gisle Aas',
+                         email => 'gisle@aas.no',
+                         gender => 'M',
+                         born   => '1964',
+                         init   => ["$ENV{HOME}/.profile"],
+                       ]
+
+This will create a HTTP::Request object that almost looks this (the
+boundary and the content of your F<~/.profile> is likely to be
+different):
+
+  POST http://www.perl.org/survey.cgi
+  Content-Length: 388
+  Content-Type: multipart/form-data; boundary="6G+f"
+
+  --6G+f
+  Content-Disposition: form-data; name="name"
+  
+  Gisle Aas
+  --6G+f
+  Content-Disposition: form-data; name="email"
+  
+  gisle@aas.no
+  --6G+f
+  Content-Disposition: form-data; name="gender"
+  
+  M
+  --6G+f
+  Content-Disposition: form-data; name="born"
+  
+  1964
+  --6G+f
+  Content-Disposition: form-data; name="init"; filename=".profile"
+  Content-Type: text/plain
+  
+  PATH=/local/perl/bin:$PATH
+  export PATH
+
+  --6G+f--
+
+If you set the $DYNAMIC_FILE_UPLOAD variable (exportable) to some TRUE
+value, then you get back a request object with a subroutine closure as
+the content attribute.  This subroutine will read the content of any
+files on demand and return it in suitable chunks.  This allow you to
+upload arbitrary big files without using lots of memory.  You can even
+upload infinite files like F</dev/audio> if you wish.  Another
+difference is that there will be no Content-Length header defined for
+the request if you use this feature.  Not all servers (or server
+applications) like this.
+
+=back
+
+=head1 SEE ALSO
+
+L<HTTP::Request>, L<LWP::UserAgent>
+
+
+=head1 COPYRIGHT
+
+Copyright 1997-1998, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Response.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Response.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Response.pm	(revision 21083)
@@ -0,0 +1,396 @@
+#
+# $Id$
+
+package HTTP::Response;
+
+
+=head1 NAME
+
+HTTP::Response - Class encapsulating HTTP Responses
+
+=head1 SYNOPSIS
+
+ require HTTP::Response;
+
+=head1 DESCRIPTION
+
+The C<HTTP::Response> class encapsulate HTTP style responses.  A
+response consist of a response line, some headers, and a (potential
+empty) content. Note that the LWP library will use HTTP style
+responses also for non-HTTP protocol schemes.
+
+Instances of this class are usually created and returned by the
+C<request()> method of an C<LWP::UserAgent> object:
+
+ #...
+ $response = $ua->request($request)
+ if ($response->is_success) {
+     print $response->content;
+ } else {
+     print $response->error_as_HTML;
+ }
+
+C<HTTP::Response> is a subclass of C<HTTP::Message> and therefore
+inherits its methods.  The inherited methods often used are header(),
+push_header(), remove_header(), headers_as_string(), and content().
+The header convenience methods are also available.  See
+L<HTTP::Message> for details.
+
+The following additional methods are available:
+
+=over 4
+
+=cut
+
+
+require HTTP::Message;
+@ISA = qw(HTTP::Message);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use HTTP::Status ();
+use URI::URL ();
+use strict;
+
+
+=item $r = HTTP::Response->new($rc, [$msg, [$header, [$content]]])
+
+Constructs a new C<HTTP::Response> object describing a response with
+response code C<$rc> and optional message C<$msg>.  The message is a
+short human readable single line string that explains the response
+code.
+
+=cut
+
+sub new
+{
+    my($class, $rc, $msg, $header, $content) = @_;
+    my $self = $class->SUPER::new($header, $content);
+    $self->code($rc);
+    $self->message($msg);
+    $self;
+}
+
+
+sub clone
+{
+    my $self = shift;
+    my $clone = bless $self->SUPER::clone, ref($self);
+    $clone->code($self->code);
+    $clone->message($self->message);
+    $clone->request($self->request->clone) if $self->request;
+    # we don't clone previous
+    $clone;
+}
+
+=item $r->code([$code])
+
+=item $r->message([$message])
+
+=item $r->request([$request])
+
+=item $r->previous([$previousResponse])
+
+These methods provide public access to the member variables.  The
+first two containing respectively the response code and the message
+of the response.
+
+The request attribute is a reference the request that gave this
+response.  It does not have to be the same request as passed to the
+$ua->request() method, because there might have been redirects and
+authorization retries in between.
+
+The previous attribute is used to link together chains of responses.
+You get chains of responses if the first response is redirect or
+unauthorized.
+
+=cut
+
+sub code      { shift->_elem('_rc',      @_); }
+sub message   { shift->_elem('_msg',     @_); }
+sub previous  { shift->_elem('_previous',@_); }
+sub request   { shift->_elem('_request', @_); }
+
+=item $r->status_line
+
+Returns the string "E<lt>code> E<lt>message>".  If the message attribute
+is not set then the official name of E<lt>code> (see L<HTTP::Status>)
+is substituted.
+
+=cut
+
+sub status_line
+{
+    my $self = shift;
+    my $code = $self->{'_rc'}  || "000";
+    my $mess = $self->{'_msg'} || HTTP::Status::status_message($code) || "?";
+    return "$code $mess";
+}
+
+=item $r->base
+
+Returns the base URL for this response.  The return value will be a
+reference to a URI::URL object.
+
+The base URL is obtained from one the following sources (in priority
+order):
+
+=over 4
+
+=item 1.
+
+Embedded in the document content, for instance <BASE HREF="...">
+in HTML documents.
+
+=item 2.
+
+A "Content-Base:" or a "Content-Location:" header in the response.
+
+For backwards compatability with older HTTP implementations we will
+also look for the "Base:" header.
+
+
+=item 3.
+
+The URL used to request this response. This might not be the original
+URL that was passed to $ua->request() method, because we might have
+received some redirect responses first.
+
+=back
+
+When the LWP protocol modules produce the HTTP::Response object, then
+any base URL embedded in the document (step 1) will already have
+initialized the "Content-Base:" header. This means that this method
+only perform the last 2 steps (the content is not always available
+either).
+
+=cut
+
+sub base
+{
+    my $self = shift;
+    my $base = $self->header('Content-Base')     ||  # HTTP/1.1
+               $self->header('Content-Location') ||  # HTTP/1.1
+               $self->header('Base')             ||  # backwards compatability HTTP/1.0
+               $self->request->url;
+    $base = URI::URL->new($base) unless ref $base;
+    $base;
+}
+
+
+=item $r->as_string
+
+Method returning a textual representation of the response.  Mainly
+useful for debugging purposes. It takes no arguments.
+
+=cut
+
+sub as_string
+{
+    require HTTP::Status;
+    my $self = shift;
+    my @result;
+    #push(@result, "---- $self ----");
+    my $code = $self->code;
+    my $status_message = HTTP::Status::status_message($code) || "Unknown code";
+    my $message = $self->message || "";
+
+    my $status_line = "$code";
+    my $proto = $self->protocol;
+    $status_line = "$proto $status_line" if $proto;
+    $status_line .= " ($status_message)" if $status_message ne $message;
+    $status_line .= " $message";
+    push(@result, $status_line);
+    push(@result, $self->headers_as_string);
+    my $content = $self->content;
+    if (defined $content) {
+	push(@result, $content);
+    }
+    #push(@result, ("-" x 40));
+    join("\n", @result, "");
+}
+
+=item $r->is_info
+
+=item $r->is_success
+
+=item $r->is_redirect
+
+=item $r->is_error
+
+These methods indicate if the response was informational, sucessful, a
+redirection, or an error.
+
+=cut
+
+sub is_info     { HTTP::Status::is_info     (shift->{'_rc'}); }
+sub is_success  { HTTP::Status::is_success  (shift->{'_rc'}); }
+sub is_redirect { HTTP::Status::is_redirect (shift->{'_rc'}); }
+sub is_error    { HTTP::Status::is_error    (shift->{'_rc'}); }
+
+
+=item $r->error_as_HTML()
+
+Return a string containing a complete HTML document indicating what
+error occurred.  This method should only be called when $r->is_error
+is TRUE.
+
+=cut
+
+sub error_as_HTML
+{
+    my $self = shift;
+    my $title = 'An Error Occurred';
+    my $body  = $self->status_line;
+    return <<EOM;
+<HTML>
+<HEAD><TITLE>$title</TITLE></HEAD>
+<BODY>
+<H1>$title</h1>
+$body
+</BODY>
+</HTML>
+EOM
+}
+
+
+=item $r->current_age
+
+This function will calculate the "current age" of the response as
+specified by E<lt>draft-ietf-http-v11-spec-07> section 13.2.3.  The
+age of a response is the time since it was sent by the origin server.
+The returned value is a number representing the age in seconds.
+
+=cut
+
+sub current_age
+{
+    my $self = shift;
+    # Implementation of <draft-ietf-http-v11-spec-07> section 13.2.3
+    # (age calculations)
+    my $response_time = $self->client_date;
+    my $date = $self->date;
+
+    my $age = 0;
+    if ($response_time && $date) {
+	$age = $response_time - $date;  # apparent_age
+	$age = 0 if $age < 0;
+    }
+
+    my $age_v = $self->header('Age');
+    if ($age_v && $age_v > $age) {
+	$age = $age_v;   # corrected_received_age
+    }
+
+    my $request = $self->request;
+    if ($request) {
+	my $request_time = $request->date;
+	if ($request_time) {
+	    # Add response_delay to age to get 'corrected_initial_age'
+	    $age += $response_time - $request_time;
+	}
+    }
+    if ($response_time) {
+	$age += time - $response_time;
+    }
+    return $age;
+}
+
+
+=item $r->freshness_lifetime
+
+This function will calculate the "freshness lifetime" of the response
+as specified by E<lt>draft-ietf-http-v11-spec-07> section 13.2.4.  The
+"freshness lifetime" is the length of time between the generation of a
+response and its expiration time.  The returned value is a number
+representing the freshness lifetime in seconds.
+
+If the response does not contain an "Expires" or a "Cache-Control"
+header, then this function will apply some simple heuristic based on
+'Last-Modified' to determine a suitable lifetime.
+
+=cut
+
+sub freshness_lifetime
+{
+    my $self = shift;
+
+    # First look for the Cache-Control: max-age=n header
+    my @cc = $self->header('Cache-Control');
+    if (@cc) {
+	my $cc;
+	for $cc (@cc) {
+	    my $cc_dir;
+	    for $cc_dir (split(/\s*,\s*/, $cc)) {
+		if ($cc_dir =~ /max-age\s*=\s*(\d+)/i) {
+		    return $1;
+		}
+	    }
+	}
+    }
+
+    # Next possibility is to look at the "Expires" header
+    my $date = $self->date || $self->client_date || time;      
+    my $expires = $self->expires;
+    unless ($expires) {
+	# Must apply heuristic expiration
+	my $last_modified = $self->last_modified;
+	if ($last_modified) {
+	    my $h_exp = ($date - $last_modified) * 0.10;  # 10% since last-mod
+	    if ($h_exp < 60) {
+		return 60;  # minimum
+	    } elsif ($h_exp > 24 * 3600) {
+		# Should give a warning if more than 24 hours according to
+		# <draft-ietf-http-v11-spec-07> section 13.2.4, but I don't
+		# know how to do it from this function interface, so I just
+		# make this the maximum value.
+		return 24 * 3600;
+	    }
+	    return $h_exp;
+	} else {
+	    return 3600;  # 1 hour is fallback when all else fails
+	}
+    }
+    return $expires - $date;
+}
+
+
+=item $r->is_fresh
+
+Returns TRUE if the response is fresh, based on the values of
+freshness_lifetime() and current_age().  If the response is not longer
+fresh, then it has to be refetched or revalidated by the origin
+server.
+
+=cut
+
+sub is_fresh
+{
+    my $self = shift;
+    $self->freshness_lifetime > $self->current_age;
+}
+
+
+=item $r->fresh_until
+
+Returns the time when this entiy is no longer fresh.
+
+=cut
+
+sub fresh_until
+{
+    my $self = shift;
+    return $self->freshness_lifetime - $self->current_age + time;
+}
+
+1;
+
+=back 
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Status.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Status.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/HTTP/Status.pm	(revision 21083)
@@ -0,0 +1,233 @@
+#
+# $Id$
+
+package HTTP::Status;
+
+use strict;
+require 5.002;   # becase we use prototypes
+
+=head1 NAME
+
+HTTP::Status - HTTP Status code processing
+
+=head1 SYNOPSIS
+
+ use HTTP::Status;
+
+ if ($rc != RC_OK) {
+     print status_message($rc), "\n";
+ }
+
+ if (is_success($rc)) { ... }
+ if (is_error($rc)) { ... }
+ if (is_redirect($rc)) { ... }
+
+=head1 DESCRIPTION
+
+I<HTTP::Status> is a library of routines for defining and
+classification of HTTP status codes for libwww-perl.  Status codes are
+used to encode the overall outcome of a HTTP response message.  Codes
+correspond to those defined in F<draft-ietf-http-v11-spec-rev-03> (an
+update to RFC 2068).
+
+=head1 CONSTANTS
+
+The following constant functions can be used as mnemonic status code
+names:
+
+   RC_CONTINUE				(100)
+   RC_SWITCHING_PROTOCOLS		(101)
+
+   RC_OK				(200)
+   RC_CREATED				(201)
+   RC_ACCEPTED				(202)
+   RC_NON_AUTHORITATIVE_INFORMATION	(203)
+   RC_NO_CONTENT			(204)
+   RC_RESET_CONTENT			(205)
+   RC_PARTIAL_CONTENT			(206)
+
+   RC_MULTIPLE_CHOICES			(300)
+   RC_MOVED_PERMANENTLY			(301)
+   RC_FOUND				(302)
+   RC_SEE_OTHER				(303)
+   RC_NOT_MODIFIED			(304)
+   RC_USE_PROXY				(305)
+   RC_TEMPORARY_REDIRECT		(307)
+
+   RC_BAD_REQUEST			(400)
+   RC_UNAUTHORIZED			(401)
+   RC_PAYMENT_REQUIRED			(402)
+   RC_FORBIDDEN				(403)
+   RC_NOT_FOUND				(404)
+   RC_METHOD_NOT_ALLOWED		(405)
+   RC_NOT_ACCEPTABLE			(406)
+   RC_PROXY_AUTHENTICATION_REQUIRED	(407)
+   RC_REQUEST_TIMEOUT			(408)
+   RC_CONFLICT				(409)
+   RC_GONE				(410)
+   RC_LENGTH_REQUIRED			(411)
+   RC_PRECONDITION_FAILED		(412)
+   RC_REQUEST_ENTITY_TOO_LARGE		(413)
+   RC_REQUEST_URI_TOO_LARGE		(414)
+   RC_UNSUPPORTED_MEDIA_TYPE		(415)
+   RC_REQUEST_RANGE_NOT_SATISFIABLE     (416)
+   RC_EXPECTATION_FAILED		(417)
+
+   RC_INTERNAL_SERVER_ERROR		(500)
+   RC_NOT_IMPLEMENTED			(501)
+   RC_BAD_GATEWAY			(502)
+   RC_SERVICE_UNAVAILABLE		(503)
+   RC_GATEWAY_TIMEOUT			(504)
+   RC_HTTP_VERSION_NOT_SUPPORTED	(505)
+
+=cut
+
+#####################################################################
+
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(is_info is_success is_redirect is_error status_message);
+@EXPORT_OK = qw(is_client_error is_server_error);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+# Note also addition of mnemonics to @EXPORT below
+
+my %StatusCode = (
+    100 => 'Continue',
+    101 => 'Switching Protocols',
+    200 => 'OK',
+    201 => 'Created',
+    202 => 'Accepted',
+    203 => 'Non-Authoritative Information',
+    204 => 'No Content',
+    205 => 'Reset Content',
+    206 => 'Partial Content',
+    300 => 'Multiple Choices',
+    301 => 'Moved Permanently',
+    302 => 'Found',
+    303 => 'See Other',
+    304 => 'Not Modified',
+    305 => 'Use Proxy',
+    307 => 'Temporary Redirect',
+    400 => 'Bad Request',
+    401 => 'Unauthorized',
+    402 => 'Payment Required',
+    403 => 'Forbidden',
+    404 => 'Not Found',
+    405 => 'Method Not Allowed',
+    406 => 'Not Acceptable',
+    407 => 'Proxy Authentication Required',
+    408 => 'Request Timeout',
+    409 => 'Conflict',
+    410 => 'Gone',
+    411 => 'Length Required',
+    412 => 'Precondition Failed',
+    413 => 'Request Entity Too Large',
+    414 => 'Request-URI Too Large',
+    415 => 'Unsupported Media Type',
+    416 => 'Request Range Not Satisfiable',
+    417 => 'Expectation Failed',
+    500 => 'Internal Server Error',
+    501 => 'Not Implemented',
+    502 => 'Bad Gateway',
+    503 => 'Service Unavailable',
+    504 => 'Gateway Timeout',
+    505 => 'HTTP Version Not Supported',
+);
+
+my $mnemonicCode = '';
+my ($code, $message);
+while (($code, $message) = each %StatusCode) {
+    # create mnemonic subroutines
+    $message =~ tr/a-z \-/A-Z__/;
+    $mnemonicCode .= "sub RC_$message () { $code }\t";
+    # make them exportable
+    $mnemonicCode .= "push(\@EXPORT, 'RC_$message');\n";
+}
+# warn $mnemonicCode; # for development
+eval $mnemonicCode; # only one eval for speed
+die if $@;
+
+# backwards compatibility
+*RC_MOVED_TEMPORARILY = \&RC_FOUND;  # 302 was renamed in the standard
+push(@EXPORT, "RC_MOVED_TEMPORARILY");
+
+
+=head1 FUNCTIONS
+
+The following additional functions are provided.  Most of them are
+exported by default.
+
+=over 4
+
+=item status_message($code)
+
+The status_message() function will translate status codes to human
+readable strings. The string is the same as found in the constant
+names above.  If the $code is unknown, then C<undef> is returned.
+
+=cut
+
+sub status_message ($)
+{
+    $StatusCode{$_[0]};
+}
+
+=item is_info($code)
+
+Return TRUE if C<$code> is an I<Informational> status code.  This
+class of status code indicates a provisional response which can't have
+any content.
+
+=item is_success($code)
+
+Return TRUE if C<$code> is a I<Successful> status code.
+
+=item is_redirect($code)
+
+Return TRUE if C<$code> is a I<Redirection> status code. This class of
+status code indicates that further action needs to be taken by the
+user agent in order to fulfill the request.
+
+=item is_error($code)
+
+Return TRUE if C<$code> is an I<Error> status code.  The function
+return TRUE for both client error or a server error status codes.
+
+=item is_client_error($code)
+
+Return TRUE if C<$code> is an I<Client Error> status code. This class
+of status code is intended for cases in which the client seems to have
+erred.
+
+This function is B<not> exported by default.
+
+=item is_server_error($code)
+
+Return TRUE if C<$code> is an I<Server Error> status code. This class
+of status codes is intended for cases in which the server is aware
+that it has erred or is incapable of performing the request.
+
+This function is B<not> exported by default.
+
+=back
+
+=cut
+
+sub is_info         ($) { $_[0] >= 100 && $_[0] < 200; }
+sub is_success      ($) { $_[0] >= 200 && $_[0] < 300; }
+sub is_redirect     ($) { $_[0] >= 300 && $_[0] < 400; }
+sub is_error        ($) { $_[0] >= 400 && $_[0] < 600; }
+sub is_client_error ($) { $_[0] >= 400 && $_[0] < 500; }
+sub is_server_error ($) { $_[0] >= 500 && $_[0] < 600; }
+
+1;
+
+=head1 BUGS
+
+Wished @EXPORT_OK had been used instead of @EXPORT in the beginning.
+Now too much is exported by default.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP.pm	(revision 21083)
@@ -0,0 +1,593 @@
+#
+# $Id$
+
+package LWP;
+
+$VERSION = "5.36";
+sub Version { $VERSION; }
+
+require 5.004;
+require LWP::UserAgent;  # this should load everything you need
+
+1;
+
+__END__
+
+=head1 NAME
+
+LWP - Library for WWW access in Perl
+
+=head1 SYNOPSIS
+
+  use LWP;
+  print "This is libwww-perl-$LWP::VERSION\n";
+
+
+=head1 DESCRIPTION
+
+Libwww-perl is a collection of Perl modules which provides a simple
+and consistent programming interface (API) to the World-Wide Web.  The
+main focus of the library is to provide classes and functions that
+allow you to write WWW clients, thus libwww-perl said to be a WWW
+client library. The library also contain modules that are of more
+general use.
+
+Most modules in this library are object oriented.  The user
+agent, requests sent and responses received from the WWW server are
+all represented by objects.  This makes a simple and powerful
+interface to these services.  The interface should be easy to extend
+and customize for your needs.
+
+The main features of the library are:
+
+=over 3
+
+=item *
+
+Contains various reusable components (modules) that can be
+used separately or together.
+
+=item *
+
+Provides an object oriented model of HTTP-style communication.  Within
+this framework we currently support access to http, https, gopher, ftp, news,
+file, and mailto resources.
+
+=item *
+
+The library be used through the full object oriented interface or
+through a very simple procedural interface.
+
+=item *
+
+Support the basic and digest authorization schemes.
+
+=item *
+
+Transparent redirect handling.
+
+=item *
+
+Supports access through proxy servers.
+
+=item *
+
+URL handling (both absolute and relative URLs are supported).
+
+=item *
+
+A parser for F<robots.txt> files and a framework for constructing robots.
+
+=item *
+
+The library can cooperate with Tk.  A simple Tk-based GUI browser
+called 'tkweb' is distributed with the Tk extension for perl.
+
+=item *
+
+An implementation of the HTTP content negotiation algorithm that can
+be used both in protocol modules and in server scripts (like CGI
+scripts).
+
+=item *
+
+It can deal with HTTP cookies.
+
+=item *
+
+A simple command line client application called C<lwp-request>.
+
+=back
+
+
+=head1 HTTP STYLE COMMUNICATION
+
+
+The libwww-perl library is based on HTTP style communication. This
+section try to describe what that means.
+
+Let us start with this quote from the HTTP specification document
+<URL:http://www.w3.org/pub/WWW/Protocols/>:
+
+=over 3
+
+=item
+
+The HTTP protocol is based on a request/response paradigm. A client
+establishes a connection with a server and sends a request to the
+server in the form of a request method, URI, and protocol version,
+followed by a MIME-like message containing request modifiers, client
+information, and possible body content. The server responds with a
+status line, including the message's protocol version and a success or
+error code, followed by a MIME-like message containing server
+information, entity meta-information, and possible body content.
+
+=back
+
+What this means to libwww-perl is that communication always take place
+through these steps: First a I<request> object is created and
+configured. This object is then passed to a server and we get a
+I<response> object in return that we can examine. A request is always
+independent of any previous requests, i.e. the service is stateless.
+The same simple model is used for any kind of service we want to
+access.
+
+For example, if we want to fetch a document from a remote file server,
+then we send it a request that contains a name for that document and
+the response will contain the document itself.  If we access a search
+engine, then the content of the request will contain the query
+parameters and the response will contain the query result.  If we want
+to send a mail message to somebody then we send a request object which
+contains our message to the mail server and the response object will
+contain an acknowledgment that tells us that the message has been
+accepted and will be forwarded to the recipient(s).
+
+It is as simple as that!
+
+
+=head2 The Request Object
+
+The request object has the class name C<HTTP::Request> in
+libwww-perl. The fact that the class name use C<HTTP::> as a name
+prefix only implies that we use the HTTP model of communication. It
+does not limit the kind of services we can try to pass this I<request>
+to.  For instance, we will send C<HTTP::Request>s both to ftp and
+gopher servers, as well as to the local file system.
+
+The main attributes of the request objects are:
+
+=over 3
+
+=item *
+
+The B<method> is a short string that tells what kind of
+request this is.  The most used methods are B<GET>, B<PUT>,
+B<POST> and B<HEAD>.
+
+=item *
+
+The B<url> is a string denoting the protocol, server and
+the name of the "document" we want to access.  The B<url> might
+also encode various other parameters.
+
+=item *
+
+The B<headers> contain additional information about the
+request and can also used to describe the content.  The headers
+is a set of keyword/value pairs.
+
+=item *
+
+The B<content> is an arbitrary amount of data.
+
+=back
+
+=head2 The Response Object
+
+The response object has the class name C<HTTP::Response> in
+libwww-perl.  The main attributes of objects of this class are:
+
+=over 3
+
+=item *
+
+The B<code> is a numerical value that encode the overall
+outcome of the request.
+
+=item *
+
+The B<message> is a short (human readable) string that
+corresponds to the I<code>.
+
+=item *
+
+The B<headers> contain additional information about the
+response and they also describe the content.
+
+=item *
+
+The B<content> is an arbitrary amount of data.
+
+=back
+
+Since we don't want to handle all possible I<code> values directly in
+our programs, the libwww-perl response object have methods that can be
+used to query what kind of response this is.  The most commonly used
+response classification methods are:
+
+=over 3
+
+=item is_success()
+
+The request was was successfully received, understood or accepted.
+
+=item is_error()
+
+The request failed.  The server or the resource might not be
+available, access to the resource might be denied or other things might
+have failed for some reason.
+
+=back
+
+=head2 The User Agent
+
+Let us assume that we have created a I<request> object. What do we
+actually do with it in order to receive a I<response>?
+
+The answer is that you pass it on to a I<user agent> object and this
+object will take care of all the things that need to be done
+(low-level communication and error handling). The user agent will give
+you back a I<response> object. The user agent represents your
+application on the network and it provides you with an interface that
+can accept I<requests> and will return I<responses>.
+
+You should think about the user agent as an interface layer between
+your application code and the network.  Through this interface you are
+able to access the various servers on the network.
+
+The libwww-perl class name for the user agent is
+C<LWP::UserAgent>. Every libwww-perl application that wants to
+communicate should create at least one object of this kind. The main
+method provided by this object is request(). This method takes an
+C<HTTP::Request> object as argument and will (eventually) return a
+C<HTTP::Response> object.
+
+The user agent has many other attributes that lets you
+configure how it will interact with the network and with your
+application code.
+
+=over 3
+
+=item *
+
+The B<timeout> specify how much time we give remote servers in
+creating responses before the library disconnect and creates an
+internal I<timeout> response.
+
+=item *
+
+The B<agent> specify the name that your application should use when it
+presents itself on the network.
+
+=item *
+
+The B<from> attribute can be set to the e-mail address of the person
+responsible for running the application.  If this is set, then the
+address will be sent to the servers with every request.
+
+=item *
+
+The B<parse_head> specify whether we should initialize response
+headers from the E<lt>head> section of HTML documents.
+
+=item *
+
+The B<proxy> and B<no_proxy> specify if and when communication should
+go through a proxy server. <URL:http://www.w3.org/pub/WWW/Proxies/>
+
+=item *
+
+The B<credentials> provide a way to set up user names and
+passwords that is needed to access certain services.
+
+=back
+
+Many applications would want even more control over how they interact
+with the network and they get this by specializing the
+C<LWP::UserAgent> by sub-classing.  The library provide a
+specialization called C<LWP::RobotUA> that is used by robot
+applications.
+
+=head2 An Example
+
+This example shows how the user agent, a request and a response are
+represented in actual perl code:
+
+  # Create a user agent object
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+  $ua->agent("AgentName/0.1 " . $ua->agent);
+
+  # Create a request
+  my $req = new HTTP::Request POST => 'http://www.perl.com/cgi-bin/BugGlimpse';
+  $req->content_type('application/x-www-form-urlencoded');
+  $req->content('match=www&errors=0');
+
+  # Pass request to the user agent and get a response back
+  my $res = $ua->request($req);
+
+  # Check the outcome of the response
+  if ($res->is_success) {
+      print $res->content;
+  } else {
+      print "Bad luck this time\n";
+  }
+
+The $ua is created once when the application starts up.  New request
+objects are normally created for each request sent.
+
+
+=head1 NETWORK SUPPORT
+
+This section goes through the various protocol schemes and describe
+the HTTP style methods that are supported and the headers that might
+have any effect.
+
+For all requests, a "User-Agent" header is added and initialized from
+the $ua->agent value before the request is handed to the network
+layer.  In the same way, a "From" header is initialized from the
+$ua->from value.
+
+For all responses, the library will add a header called "Client-Date".
+This header will encode the time when the response was received by
+your application.  This format and semantics of the header is just
+like the server created "Date" header.  You can also encounter other
+"Client-XXX" headers.  They are all generated by the library
+internally and not something really passed on from the servers.
+
+=head2 HTTP Requests
+
+HTTP request are really just handed off to an HTTP server and it will
+decide what happens.  Few servers implement methods beside the usual
+"GET", "HEAD", "POST" and "PUT" but CGI-scripts can really implement
+any method they like.
+
+If the server is not available then the library will generate an
+internal error response.
+
+The library automatically adds a "Host" and a "Content-Length" header
+to the HTTP request before it is sent over the network.
+
+For GET request you might want to add the "If-Modified-Since" header
+to make the request conditional.
+
+For POST request you should add the "Content-Type" header.  When you
+try to emulate HTML E<lt>FORM> handling you should usually let the value
+of the "Content-Type" header be "application/x-www-form-urlencoded".
+See L<lwpcook> for examples of this.
+
+The libwww-perl HTTP implementation currently support the HTTP/1.0
+protocol.  HTTP/0.9 servers are also handled correctly.
+
+The library allows you to access proxy server through HTTP.  This
+means that you can set up the library to forward all types of request
+through the HTTP protocol module.  See L<LWP::UserAgent> for
+documentation of this.
+
+
+=head2 HTTPS Requests
+
+HTTPS requests are HTTP requests over an encrypted network connection
+using the SSL protocol developed by Netscape.  Everything about HTTP
+requests above also hold for HTTPS requests.  In addition the library
+will add the headers "Client-SSL-Cipher", "Client-SSL-Cert-Subject" and
+"Client-SSL-Cert-Issuer" to the response.  These headers denote the
+encryption method used and the name of the server owner.
+
+The request can contain the header "If-SSL-Cert-Subject" in order to
+make the request conditional on the content of the server certificate.
+If the certificate subject does not match, no request is sent to the
+server and an internally generated error response is returned.  The
+value of the "If-SSL-Cert-Subject" header is interpreted as a Perl
+regular expression.
+
+
+=head2 FTP Requests
+
+The library currently support GET, HEAD and PUT requests.  GET will
+retrieve a file or a directory listing from an FTP server.  PUT will
+store a file on a ftp server.
+
+You can specify a ftp account for servers that want this in addition
+user name and password.  This is specified by passing an "Account"
+header in the request.
+
+User name/password can be specified using basic authorization or be
+encoded in the URL.  Bad logins return an UNAUTHORIZED response with
+"WWW-Authenticate: Basic" and can be treated as basic authorization
+for HTTP.
+
+The library support ftp ASCII transfer mode by specifying the "type=a"
+parameter in the URL.
+
+Directory listings are by default returned unprocessed (as returned
+from the ftp server) with the content media type reported to be
+"text/ftp-dir-listing". The C<File::Listing> module provide functionality
+for parsing of these directory listing.
+
+The ftp module is also able to convert directory listings to HTML and
+this can be requested via the standard HTTP content negotiation
+mechanisms (add an "Accept: text/html" header in the request if you
+want this).
+
+The normal file retrievals, the "Content-Type" is guessed based on the
+file name suffix. See L<LWP::MediaTypes>.
+
+The "If-Modified-Since" request header works for servers that implement
+the MDTM command.  It will probably not work for directory listings though.
+
+Example:
+
+  $req = HTTP::Request->new(GET => 'ftp://me:passwd@ftp.some.where.com/');
+  $req->header(Accept => "text/html, */*;q=0.1");
+
+=head2 News Requests
+
+Access to the USENET News system is implemented through the NNTP
+protocol.  The name of the news server is obtained from the
+NNTP_SERVER environment variable and defaults to "news".  It is not
+possible to specify the hostname of the NNTP server in the news:-URLs.
+
+The library support GET and HEAD to retrieve news articles through the
+NNTP protocol.  You can also post articles to newsgroups by using
+(surprise!) the POST method.
+
+GET on newsgroups is not implemented yet.
+
+Examples:
+
+  $req = HTTP::Request->new(GET => 'news:abc1234@a.sn.no');
+
+  $req = HTTP::Request->new(POST => 'news:comp.lang.perl.test');
+  $req->header(Subject => 'This is a test',
+               From    => 'me@some.where.org');
+  $req->content(<<EOT);
+  This is the content of the message that we are sending to
+  the world.
+  EOT
+
+
+=head2 Gopher Request
+
+The library supports the GET and HEAD method for gopher request.  All
+request header values are ignored.  HEAD cheats and will return a
+response without even talking to server.
+
+Gopher menus are always converted to HTML.
+
+The response "Content-Type" is generated from the document type
+encoded (as the first letter) in the request URL path itself.
+
+Example:
+
+  $req = HTTP::Request->new(GET => 'gopher://gopher.sn.no/');
+
+
+
+=head2 File Request
+
+The library supports GET and HEAD methods for file requests.  The
+"If-Modified-Since" header is supported.  All other headers are
+ignored.  The I<host> component of the file URL must be empty or set
+to "localhost".  Any other I<host> value will be treated as an error.
+
+Directories are always converted to an HTML document.  For normal
+files, the "Content-Type" and "Content-Encoding" in the response are
+guessed based on the file suffix.
+
+Example:
+
+  $req = HTTP::Request->new(GET => 'file:/etc/passwd');
+
+
+=head2 Mailto Request
+
+You can send (aka "POST") mail messages using the library.  All
+headers specified for the request are passed on to the mail system.
+The "To" header is initialized from the mail address in the URL.
+
+Example:
+
+  $req = HTTP::Request->new(POST => 'mailto:libwww-perl-request@ics.uci.edu');
+  $req->header(Subject => "subscribe");
+  $req->content("Please subscribe me to the libwww-perl mailing list!\n");
+
+
+=head1 OVERVIEW OF CLASSES AND PACKAGES
+
+This table should give you a quick overview of the classes provided by the
+library. Indentation shows class inheritance.
+
+ LWP::MemberMixin   -- Access to member variables of Perl5 classes
+   LWP::UserAgent   -- WWW user agent class
+     LWP::RobotUA   -- When developing a robot applications
+   LWP::Protocol          -- Interface to various protocol schemes
+     LWP::Protocol::http  -- http:// access
+     LWP::Protocol::file  -- file:// access
+     LWP::Protocol::ftp   -- ftp:// access
+     ...
+
+ LWP::Authen::Basic -- Handle 401 and 407 responses
+ LWP::Authen::Digest
+
+ HTTP::Headers      -- MIME/RFC822 style header (used by HTTP::Message)
+ HTTP::Message      -- HTTP style message
+   HTTP::Request    -- HTTP request
+   HTTP::Response   -- HTTP response
+ HTTP::Daemon       -- A HTTP server class
+
+ URI::URL           -- Uniform Resource Locators
+
+ WWW::RobotRules    -- Parse robots.txt files
+   WWW::RobotRules::AnyDBM_File -- Persistent RobotRules
+
+The following modules provide various functions and definitions.
+
+ LWP                -- This file.  Library version number and documentation.
+ LWP::MediaTypes    -- MIME types configuration (text/html etc.)
+ LWP::Debug         -- Debug logging module
+ LWP::Simple        -- Simplified procedural interface for common functions
+ HTTP::Status       -- HTTP status code (200 OK etc)
+ HTTP::Date         -- Date parsing module for HTTP date formats
+ HTTP::Negotiate    -- HTTP content negotiation calculation
+ File::Listing      -- Parse directory listings
+
+
+=head1 MORE DOCUMENTATION
+
+All modules contain detailed information on the interfaces they
+provide.  The I<lwpcook> manpage is the libwww-perl cookbook that contain
+examples of typical usage of the library.  You might want to take a
+look at how the scripts C<lwp-request>, C<lwp-rget> and C<lwp-mirror>
+are implemented.
+
+=head1 BUGS
+
+The library can not handle multiple simultaneous requests yet.  Also,
+check out what's left in the TODO file.
+
+=head1 ACKNOWLEDGEMENTS
+
+This package owes a lot in motivation, design, and code, to the
+libwww-perl library for Perl 4, maintained by Roy Fielding
+E<lt>fielding@ics.uci.edu>.
+
+That package used work from Alberto Accomazzi, James Casey, Brooks
+Cutter, Martijn Koster, Oscar Nierstrasz, Mel Melchner, Gertjan van
+Oosten, Jared Rhine, Jack Shirazi, Gene Spafford, Marc VanHeyningen,
+Steven E. Brenner, Marion Hakanson, Waldemar Kebsch, Tony Sanders, and
+Larry Wall; see the libwww-perl-0.40 library for details.
+
+The primary architect for this Perl 5 library is Martijn Koster and
+Gisle Aas, with lots of help from Graham Barr, Tim Bunce, Andreas
+Koenig, Jared Rhine, and Jack Shirazi.
+
+
+=head1 COPYRIGHT
+
+  Copyright 1995-1998, Gisle Aas
+  Copyright 1995, Martijn Koster
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 AVAILABILITY
+
+The latest version of this library is likely to be available from:
+
+ http://www.sn.no/libwww-perl/
+
+The best place to discuss this code is on the
+<libwww-perl@ics.uci.edu> mailing list.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Basic.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Basic.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Basic.pm	(revision 21083)
@@ -0,0 +1,36 @@
+package LWP::Authen::Basic;
+use strict;
+
+require MIME::Base64;
+
+sub authenticate
+{
+    my($class, $ua, $proxy, $auth_param, $response,
+       $request, $arg, $size) = @_;
+
+    my($user, $pass) = $ua->get_basic_credentials($auth_param->{realm},
+                                                  $request->url, $proxy);
+    return $response unless defined $user and defined $pass;
+
+    my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
+    my $auth_value = "Basic " . MIME::Base64::encode("$user:$pass", "");
+
+    # Need to check this isn't a repeated fail!
+    my $r = $response;
+    while ($r) {
+	my $auth = $r->request->header($auth_header);
+	if ($auth && $auth eq $auth_value) {
+	    # here we know this failed before
+	    $response->header("Client-Warning" =>
+			      "Credentials for '$user' failed before");
+	    return $response;
+	}
+	$r = $r->previous;
+    }
+
+    my $referral = $request->clone;
+    $referral->header($auth_header => $auth_value);
+    return $ua->request($referral, $arg, $size, $response);
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Digest.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Digest.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Authen/Digest.pm	(revision 21083)
@@ -0,0 +1,73 @@
+package LWP::Authen::Digest;
+use strict;
+
+require MD5;
+
+sub authenticate
+{
+    my($class, $ua, $proxy, $auth_param, $response,
+       $request, $arg, $size) = @_;
+
+    my($user, $pass) = $ua->get_basic_credentials($auth_param->{realm},
+                                                  $request->url, $proxy);
+    return $response unless defined $user and defined $pass;
+
+    my $md5 = new MD5;
+
+    my(@digest);
+    $md5->add(join(":", $user, $auth_param->{realm}, $pass));
+    push(@digest, $md5->hexdigest);
+    $md5->reset;
+
+    push(@digest, $auth_param->{nonce});
+
+    $md5->add(join(":", $request->method, $request->url->path));
+    push(@digest, $md5->hexdigest);
+    $md5->reset;
+
+    $md5->add(join(":", @digest));
+    my($digest) = $md5->hexdigest;
+    $md5->reset;
+
+    my %resp = map { $_ => $auth_param->{$_} } qw(realm nonce opaque);
+    @resp{qw(username uri response)} = ($user, $request->url->path, $digest);
+
+    my(@order) = qw(username realm nonce uri response);
+    if($request->method =~ /^(?:POST|PUT)$/) {
+	$md5->add($request->content);
+	my $content = $md5->hexdigest;
+	$md5->reset;
+	$md5->add(join(":", @digest[0..1], $content));
+	$md5->reset;
+	$resp{"message-digest"} = $md5->hexdigest;
+	push(@order, "message-digest");
+    }
+    push(@order, "opaque");
+    my @pairs;
+    for (@order) {
+	next unless defined $resp{$_};
+	push(@pairs, "$_=" . qq("$resp{$_}"));
+    }
+
+    my $auth_header = $proxy ? "Proxy-Authorization" : "Authorization";
+    my $auth_value  = "Digest " . join(", ", @pairs);
+    
+    # Need to check this isn't a repeated fail!
+    my $r = $response;
+    while ($r) {
+	my $auth = $r->request->header($auth_header);
+	if ($auth && $auth eq $auth_value) {
+	    # here we know this failed before
+	    $response->header("Client-Warning" =>
+			      "Credentials for '$user' failed before");
+	    return $response;
+	}
+	$r = $r->previous;
+    }
+
+    my $referral = $request->clone;
+    $referral->header($auth_header => $auth_value);
+    return $ua->request($referral, $arg, $size, $response);
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Debug.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Debug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Debug.pm	(revision 21083)
@@ -0,0 +1,129 @@
+#!/usr/local/bin/perl -w
+#
+# $Id$
+#
+package LWP::Debug;
+
+=head1 NAME
+
+LWP::Debug - debug routines for the libwww-perl library
+
+=head1 SYNOPSIS
+
+ use LWP::Debug qw(+ -conns);
+
+ # Used internally in the library
+ LWP::Debug::trace('send()');
+ LWP::Debug::debug('url ok');
+ LWP::Debug::conns("read $n bytes: $data");
+
+=head1 DESCRIPTION
+
+LWP::Debug provides tracing facilities. The trace(), debug() and
+conns() function are called within the library and they log
+information at increasing levels of detail. Which level of detail is
+actually printed is controlled with the C<level()> function.
+
+The following functions are available:
+
+=over 4
+
+=item level(...)
+
+The C<level()> function controls the level of detail being
+logged. Passing '+' or '-' indicates full and no logging
+respectively. Inidividual levels can switched on and of by passing the
+name of the level with a '+' or '-' prepended.  The levels are:
+
+  trace   : trace function calls
+  debug   : print debug messages
+  conns   : show all data transfered over the connections
+
+The LWP::Debug module provide a special import() method that allows
+you to pass the level() arguments with initial use statement.  If a
+use argument start with '+' or '-' then it is passed to the level
+function, else the name is exported as usual.  The following two
+statements are thus equivalent (if you ignore that the second pollutes
+your namespace):
+
+  use LWP::Debug qw(+);
+  use LWP::Debug qw(level); level('+');
+
+=item trace($msg)
+
+The C<trace()> function is used for tracing function
+calls. The package and calling subroutine name is
+printed along with the passed argument. This should
+be called at the start of every major function.
+
+=item debug($msg)
+
+The C<debug()> function is used for high-granularity
+reporting of state in functions.
+
+=item conns($msg)
+
+The C<conns()> function is used to show data being
+transferred over the connections. This may generate
+considerable output.
+
+=back
+
+=cut
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(level trace debug conns);
+
+use Carp ();
+
+my @levels = qw(trace debug conns);
+%current_level = ();
+
+sub import
+{
+    my $pack = shift;
+    my $callpkg = caller(0);
+    my @symbols = ();
+    my @levels = ();
+    for (@_) {
+	if (/^[-+]/) {
+	    push(@levels, $_);
+	} else {
+	    push(@symbols, $_);
+	}
+    }
+    Exporter::export($pack, $callpkg, @symbols);
+    level(@levels);
+}
+
+sub level
+{
+    for (@_) {
+	if ($_ eq '+') {              # all on
+	    # switch on all levels
+	    %current_level = map { $_ => 1 } @levels;
+	} elsif ($_ eq '-') {           # all off
+	    %current_level = ();
+	} elsif (/^([-+])(\w+)$/) {
+	    $current_level{$2} = $1 eq '+';
+	} else {
+	    Carp::croak("Illegal level format $_");
+	}
+    }
+}
+
+sub trace  { _log(@_) if $current_level{'trace'}; }
+sub debug  { _log(@_) if $current_level{'debug'}; }
+sub conns  { _log(@_) if $current_level{'conns'}; }
+
+sub _log
+{
+    my $msg = shift;
+    $msg .= "\n" unless $msg =~ /\n$/;  # ensure trailing "\n"
+
+    my($package,$filename,$line,$sub) = caller(2);
+    print STDERR "$sub: $msg";
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MediaTypes.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MediaTypes.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MediaTypes.pm	(revision 21083)
@@ -0,0 +1,298 @@
+#
+# $Id$
+
+package LWP::MediaTypes;
+
+=head1 NAME
+
+LWP::MediaTypes - guess media type for a file or a URL
+
+=head1 SYNOPSIS
+
+ use LWP::MediaTypes qw(guess_media_type);
+ $type = guess_media_type("/tmp/foo.gif");
+
+=head1 DESCRIPTION
+
+This module provides functions for handling of media (also known as
+MIME) types and encodings.  The mapping from file extentions to media
+types is defined by the F<media.types> file.  If the F<~/.media.types>
+file exist it is used as a replacement.
+For backwards compatability we will also look for F<~/.mime.types>.
+
+The following functions are exported by default:
+
+=over 4
+
+=cut
+
+####################################################################
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(guess_media_type media_suffix);
+@EXPORT_OK = qw(add_type add_encoding);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+require LWP::Debug;
+use strict;
+
+# note: These hashes will also be filled with the entries found in
+# the 'media.types' file.
+
+my %suffixType = (
+    'txt'   => 'text/plain',
+    'html'  => 'text/html',
+    'gif'   => 'image/gif',
+    'jpg'   => 'image/jpeg',
+);
+
+my %suffixExt = (
+    'text/plain' => 'txt',
+    'text/html'  => 'h',
+    'image/gif'  => 'gif',
+    'image/jpeg' => 'jpg',
+);
+
+#XXX: there should be some way to define this in the media.types files.
+my %suffixEncoding = (
+    'Z'   => 'compress',
+    'gz'  => 'gzip',
+    'hqx' => 'x-hqx',
+    'uu'  => 'x-uuencode',
+    'z'   => 'x-pack'
+);
+
+sub _dump {
+    require Data::Dumper;
+    Data::Dumper->new([\%suffixType, \%suffixExt, \%suffixEncoding],
+		      [qw(*suffixType *suffixExt *suffixEncoding)])->Dump;
+}
+
+read_media_types();
+
+
+
+=item guess_media_type($filename_or_url, [$header_to_modify])
+
+This function tries to guess media type and encoding for given file.
+It returns the content-type, which is a string like C<"text/html">.
+In array context it also returns any content-encodings applied (in the
+order used to encode the file).  You can pass a URI::URL object
+reference, instead of the file name, as the first parameter too.
+
+If the type can not be deduced from looking at the file name only,
+then guess_media_type() will let the C<-T> Perl operator take a look.
+If this works (and C<-T> returns a TRUE value) then we return
+I<text/plain> as the type, otherwise we return
+I<application/octet-stream> as the type.
+
+The optional second argument should be a reference to a HTTP::Headers
+object (or any object that implement the $obj->header method in a
+similar way).  When present we will set the values of the
+'Content-Type' and 'Content-Encoding' for this header.
+
+=cut
+
+sub guess_media_type
+{
+    my($file, $header) = @_;
+    return undef unless defined $file;
+
+    my $fullname;
+    if (ref($file)) {
+	# assume URI::URL object
+	$file = $file->path;
+	#XXX should handle non http:, file: or ftp: URLs differently
+    } else {
+	$fullname = $file;  # enable peek at actual file
+    }
+
+    my @encoding = ();
+    my $ct = undef;
+    for (file_exts($file)) {
+	# first check this dot part as encoding spec
+	if (exists $suffixEncoding{$_}) {
+	    unshift(@encoding, $suffixEncoding{$_});
+	    next;
+	}
+	if (exists $suffixEncoding{lc $_}) {
+	    unshift(@encoding, $suffixEncoding{lc $_});
+	    next;
+	}
+
+	# check content-type
+	if (exists $suffixType{$_}) {
+	    $ct = $suffixType{$_};
+	    last;
+	}
+	if (exists $suffixType{lc $_}) {
+	    $ct = $suffixType{lc $_};
+	    last;
+	}
+
+	# don't know nothing about this dot part, bail out
+	last;
+    }
+    unless (defined $ct) {
+	# Take a look at the file
+	if (defined $fullname) {
+	    $ct = (-T $fullname) ? "text/plain" : "application/octet-stream";
+	} else {
+	    $ct = "application/octet-stream";
+	}
+    }
+
+    if ($header) {
+	$header->header('Content-Type' => $ct);
+	$header->header('Content-Encoding' => \@encoding) if @encoding;
+    }
+
+    wantarray ? ($ct, @encoding) : $ct;
+}
+
+
+=item media_suffix($type,...)
+
+This function will return all suffixes that can be used to denote the
+specified media type(s).  Wildcard types can be used.  In scalar
+context it will return the first suffix found.
+
+Examples:
+
+  @suffixes = media_suffix('image/*', 'audio/basic');
+  $suffix = media_suffix('text/html');
+
+=cut
+
+sub media_suffix {
+    if (!wantarray && @_ == 1 && $_[0] !~ /\*/) {
+	return $suffixExt{$_[0]};
+    }
+    my(@type) = @_;
+    my(@suffix, $ext, $type);
+    foreach (@type) {
+	if (s/\*/.*/) {
+	    while(($ext,$type) = each(%suffixType)) {
+		push(@suffix, $ext) if $type =~ /^$_$/;
+	    }
+	} else {
+	    while(($ext,$type) = each(%suffixType)) {
+		push(@suffix, $ext) if $type eq $_;
+	    }
+	}
+    }
+    wantarray ? @suffix : $suffix[0];
+}
+
+
+sub file_exts 
+{
+    my($file) = @_;
+    $file =~ s,.*/,,;   # only basename left
+    my @parts = reverse split(/\./, $file);
+    pop(@parts);        # never concider first part
+    @parts;
+}
+
+
+=back
+
+The following functions are only exported by explict request:
+
+=over 4
+
+=item add_type($type, @exts)
+
+Associate a list of file extensions with the given media type.
+
+Example:
+
+    add_type("x-world/x-vrml" => qw(wrl vrml));
+
+=cut
+
+sub add_type 
+{
+    my($type, @exts) = @_;
+    for my $ext (@exts) {
+	$ext =~ s/^\.//;
+	$suffixType{$ext} = $type;
+    }
+    $suffixExt{$type} = $exts[0] if @exts;
+}
+
+
+=item add_encoding($type, @ext)
+
+Associate a list of file extensions with and encoding type.
+
+Example:
+
+ add_encoding("x-gzip" => "gz");
+
+=cut
+
+sub add_encoding
+{
+    my($type, @exts) = @_;
+    for my $ext (@exts) {
+	$ext =~ s/^\.//;
+	$suffixEncoding{$ext} = $type;
+    }
+}
+
+
+=item read_media_types(@files)
+
+Parse a media types file from disk and add the type mappings found there.
+
+Example:
+
+    read_media_types("conf/mime.types");
+
+=cut
+
+sub read_media_types 
+{
+    my(@files) = @_;
+
+    local($/, $_) = ("\n", undef);  # ensure correct $INPUT_RECORD_SEPARATOR
+
+    my @priv_files = ();
+    push(@priv_files, "$ENV{HOME}/.media.types", "$ENV{HOME}/.mime.types")
+	if defined $ENV{HOME};  # Some doesn't have a home (for instance Win32)
+
+    # Try to locate "media.types" file, and initialize %suffixType from it
+    my $typefile;
+    unless (@files) {
+	@files = map {"$_/LWP/media.types"} @INC;
+	push @files, @priv_files;
+    }
+    for $typefile (@files) {
+	local(*TYPE);
+	open(TYPE, $typefile) || next;
+        LWP::Debug::debug("Reading media types from $typefile");
+	while (<TYPE>) {
+	    next if /^\s*#/; # comment line
+	    next if /^\s*$/; # blank line
+	    s/#.*//;         # remove end-of-line comments
+	    my($type, @exts) = split(' ', $_);
+	    add_type($type, @exts);
+	}
+	close(TYPE);
+    }
+}
+
+1;
+
+=back 
+
+=head1 COPYRIGHT
+
+Copyright 1995-1998 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MemberMixin.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MemberMixin.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/MemberMixin.pm	(revision 21083)
@@ -0,0 +1,46 @@
+#
+# $Id$
+
+package LWP::MemberMixin;
+
+=head1 NAME
+
+LWP::MemberMixin - Member access mixin class
+
+=head1 SYNOPSIS
+
+ package Foo;
+ require LWP::MemberMixin;
+ @ISA=qw(LWP::MemberMixin);
+
+=head1 DESCRIPTION
+
+A mixin class to get methods that provide easy access to member
+variables in the %$self.
+Ideally there should be better Perl langauge support for this.
+
+There is only one method provided:
+
+=over 4
+
+=item _elem($elem [, $val])
+
+Internal method to get/set the value of member variable
+C<$elem>. If C<$val> is defined it is used as the new value
+for the member variable.  If it is undefined the current
+value is not touched. In both cases the previous value of
+the member variable is returned.
+
+=back
+
+=cut
+
+sub _elem
+{
+    my($self, $elem, $val) = @_;
+    my $old = $self->{$elem};
+    $self->{$elem} = $val if defined $val;
+    return $old;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol.pm	(revision 21083)
@@ -0,0 +1,303 @@
+# $Id$
+
+package LWP::Protocol;
+
+=head1 NAME
+
+LWP::Protocol - Base class for LWP protocols
+
+=head1 SYNOPSIS
+
+ package LWP::Protocol::foo;
+ require LWP::Protocol;
+ @ISA=qw(LWP::Protocol);
+
+=head1 DESCRIPTION
+
+This class is used a the base class for all protocol implementations
+supported by the LWP library.
+
+When creating an instance of this class using
+C<LWP::Protocol::create($url)>, and you get an initialised subclass
+appropriate for that access method. In other words, the
+LWP::Protocol::create() function calls the constructor for one of its
+subclasses.
+
+All derived LWP::Protocol classes need to override the request()
+method which is used to service a request. The overridden method can
+make use of the collect() function to collect together chunks of data
+as it is received.
+
+The following methods and functions are provided:
+
+=over 4
+
+=cut
+
+#####################################################################
+
+require LWP::MemberMixin;
+@ISA = qw(LWP::MemberMixin);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use strict;
+use Carp ();
+use HTTP::Status 'RC_INTERNAL_SERVER_ERROR';
+require HTML::HeadParser;
+
+my %ImplementedBy = (); # scheme => classname
+
+
+=item $prot = new HTTP::Protocol;
+
+The LWP::Protocol constructor is inherited by subclasses. As this is a
+virtual base class this method should B<not> be called directly.
+
+=cut
+
+sub new
+{
+    my($class) = @_;
+
+    my $self = bless {
+	'timeout' => 0,
+	'parse_head' => 1,
+    }, $class;
+    $self;
+}
+
+
+=item $prot = LWP::Protocol::create($url)
+
+Create an object of the class implementing the protocol to handle the
+given scheme. This is a function, not a method. It is more an object
+factory than a constructor. This is the function user agents should
+use to access protocols.
+
+=cut
+
+sub create
+{
+    my $scheme = shift;
+    my $impclass = LWP::Protocol::implementor($scheme) or
+	Carp::croak("Protocol scheme '$scheme' is not supported");
+
+    # hand-off to scheme specific implementation sub-class
+    return $impclass->new($scheme);
+}
+
+
+=item $class = LWP::Protocol::implementor($scheme, [$class])
+
+Get and/or set implementor class for a scheme.  Returns '' if the
+specified scheme is not supported.
+
+=cut
+
+sub implementor
+{
+    my($scheme, $impclass) = @_;
+
+    if ($impclass) {
+	$ImplementedBy{$scheme} = $impclass;
+    }
+    my $ic = $ImplementedBy{$scheme};
+    return $ic if $ic;
+
+    return '' unless $scheme =~ /^([.+\-\w]+)$/;  # check valid URL schemes
+    $scheme = $1; # untaint
+    $scheme =~ s/[.+\-]/_/g;  # make it a legal module name
+
+    # scheme not yet known, look for a 'use'd implementation
+    $ic = "LWP::Protocol::$scheme";  # default location
+    $ic = "LWP::Protocol::nntp" if $scheme eq 'news'; #XXX ugly hack
+    no strict 'refs';
+    # check we actually have one for the scheme:
+    unless (defined @{"${ic}::ISA"}) {
+	# try to autoload it
+	eval "require $ic";
+	if ($@) {
+	    if ($@ =~ /^Can't locate/) { #' #emacs get confused by '
+		$ic = '';
+	    } else {
+		die "$@\n";
+	    }
+	}
+    }
+    $ImplementedBy{$scheme} = $ic if $ic;
+    $ic;
+}
+
+
+=item $prot->request(...)
+
+ $response = $protocol->request($request, $proxy, undef);
+ $response = $protocol->request($request, $proxy, '/tmp/sss');
+ $response = $protocol->request($request, $proxy, \&callback, 1024);
+
+Dispactches a request over the protocol, and returns a response
+object. This method needs to be overridden in subclasses.  Referer to
+L<LWP::UserAgent> for description of the arguments.
+
+=cut
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+    Carp::croak('LWP::Protocol::request() needs to be overridden in subclasses');
+}
+
+
+=item $prot->timeout($seconds)
+
+Get and set the timeout value in seconds
+
+
+=item $prot->parse_head($yesno)
+
+Should we initialize response headers from the <head> section of HTML
+documents.
+
+=cut
+
+sub timeout    { shift->_elem('timeout',    @_); }
+sub parse_head { shift->_elem('parse_head', @_); }
+sub max_size   { shift->_elem('max_size',   @_); }
+
+
+=item $prot->collect($arg, $response, $collector)
+
+Called to collect the content of a request, and process it
+appropriately into a scalar, file, or by calling a callback.  If $arg
+is undefined, then the content is stored within the $response.  If
+$arg is a simple scalar, then $arg is interpreted as a file name and
+the content is written to this file.  If $arg is a reference to a
+routine, then content is passed to this routine.
+
+The $collector is a routine that will be called and which is
+reponsible for returning pieces (as ref to scalar) of the content to
+process.  The $collector signals EOF by returning a reference to an
+empty sting.
+
+The return value from collect() is the $response object reference.
+
+B<Note:> We will only use the callback or file argument if
+$response->is_success().  This avoids sendig content data for
+redirects and authentization responses to the callback which would be
+confusing.
+
+=cut
+
+sub collect
+{
+    my ($self, $arg, $response, $collector) = @_;
+    my $content;
+    my($parse_head, $timeout, $max_size) =
+      @{$self}{qw(parse_head timeout max_size)};
+
+    my $parser;
+    if ($parse_head && $response->content_type eq 'text/html') {
+	$parser = HTML::HeadParser->new($response->{'_headers'});
+    }
+    my $content_size = 0;
+
+    if (!defined($arg) || !$response->is_success) {
+	# scalar
+	while ($content = &$collector, length $$content) {
+	    if ($parser) {
+		$parser->parse($$content) or undef($parser);
+	    }
+	    LWP::Debug::debug("read " . length($$content) . " bytes");
+	    $response->add_content($$content);
+	    $content_size += length($$content);
+	    if ($max_size && $content_size > $max_size) {
+		LWP::Debug::debug("Aborting because size limit exceeded");
+		my $tot = $response->header("Content-Length") || 0;
+		$response->header("X-Content-Range", "bytes 0-$content_size/$tot");
+		last;
+	    }
+	}
+    }
+    elsif (!ref($arg)) {
+	# filename
+	open(OUT, ">$arg") or
+	    return new HTTP::Response RC_INTERNAL_SERVER_ERROR,
+			  "Cannot write to '$arg': $!";
+        binmode(OUT);
+        local($\) = ""; # ensure standard $OUTPUT_RECORD_SEPARATOR
+	while ($content = &$collector, length $$content) {
+	    if ($parser) {
+		$parser->parse($$content) or undef($parser);
+	    }
+	    LWP::Debug::debug("read " . length($$content) . " bytes");
+	    print OUT $$content;
+	    $content_size += length($$content);
+	    if ($max_size && $content_size > $max_size) {
+		LWP::Debug::debug("Aborting because size limit exceeded");
+		my $tot = $response->header("Content-Length") || 0;
+		$response->header("X-Content-Range", "bytes 0-$content_size/$tot");
+		last;
+	    }
+	}
+	close(OUT);
+    }
+    elsif (ref($arg) eq 'CODE') {
+	# read into callback
+	while ($content = &$collector, length $$content) {
+	    if ($parser) {
+		$parser->parse($$content) or undef($parser);
+	    }
+	    LWP::Debug::debug("read " . length($$content) . " bytes");
+            eval {
+		&$arg($$content, $response, $self);
+	    };
+	    if ($@) {
+	        chomp($@);
+		$response->header('X-Died' => $@);
+		last;
+	    }
+	}
+    }
+    else {
+	return new HTTP::Response RC_INTERNAL_SERVER_ERROR,
+				  "Unexpected collect argument  '$arg'";
+    }
+    $response;
+}
+
+
+=item $prot->collect_once($arg, $response, $content)
+
+Can be called when the whole response content is available as
+$content.  This will invoke collect() with a collector callback that
+returns a reference to $content the first time and an empty string the
+next.
+
+=cut
+
+sub collect_once
+{
+    my($self, $arg, $response) = @_;
+    my $content = \ $_[3];
+    my $first = 1;
+    $self->collect($arg, $response, sub {
+	return $content if $first--;
+	return \ "";
+    });
+}
+
+1;
+
+=head1 SEE ALSO
+
+Inspect the F<LWP/Protocol/file.pm> and F<LWP/Protocol/http.pm> files
+for examples of usage.
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/data.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/data.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/data.pm	(revision 21083)
@@ -0,0 +1,53 @@
+#
+# $Id$
+#
+# Implements access to data:-URLs as specified in
+# draft-masinter-url-data-02.txt
+
+package LWP::Protocol::data;
+
+require HTTP::Response;
+require HTTP::Status;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use HTTP::Date qw(time2str);
+require LWP;  # needs version number
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size) = @_;
+
+    # check proxy
+    if (defined $proxy)
+    {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'You can not proxy with data';
+    }
+
+    # check method
+    if ($request->method ne 'GET') {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'Library does not allow method ' .
+				  "$method for 'data:' URLs";
+    }
+
+    my $url = $request->url;
+    my $response = new HTTP::Response &HTTP::Status::RC_OK, "Document follows";
+
+    my($media_type, $params) = $url->media_type;
+    $media_type .= ";$params" if $params;
+
+    my $data = $url->data;
+    $response->header('Content-Type'   => $media_type,
+		      'Content-Length' => length($data),
+		      'Date'           => time2str(time),
+		      'Server'         => "libwww-perl-internal/$LWP::VERSION"
+		     );
+    $response->content($data);
+
+    return $response;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/file.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/file.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/file.pm	(revision 21083)
@@ -0,0 +1,154 @@
+#
+# $Id$
+
+package LWP::Protocol::file;
+
+require LWP::Protocol;
+require LWP::MediaTypes;
+require HTTP::Request;
+require HTTP::Response;
+require HTTP::Status;
+require HTTP::Date;
+
+require URI::Escape;
+require HTML::Entities;
+
+use Carp;
+
+@ISA = qw(LWP::Protocol);
+
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size) = @_;
+
+    LWP::Debug::trace('()');
+
+    $size = 4096 unless defined $size and $size > 0;
+
+    # check proxy
+    if (defined $proxy)
+    {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'You can not proxy through the filesystem';
+    }
+
+    # check method
+    $method = $request->method;
+
+    unless ($method eq 'GET' || $method eq 'HEAD') {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'Library does not allow method ' .
+				  "$method for 'file:' URLs";
+    }
+
+    # check url
+    my $url = $request->url;
+
+    my $scheme = $url->scheme;
+    if ($scheme ne 'file') {
+	return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				  "LWP::file::request called for '$scheme'";
+    }
+
+    my $host = $url->host;
+    if ($host and $host !~ /^localhost$/i) {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST_CLIENT,
+				  'Only file://localhost/ allowed';
+    }
+
+    # URL OK, look at file
+    my $path  = $url->local_path;
+
+    # test file exists and is readable
+    unless (-e $path) {
+	return new HTTP::Response &HTTP::Status::RC_NOT_FOUND,
+				  "File `$path' does not exist";
+    }
+    unless (-r _) {
+	return new HTTP::Response &HTTP::Status::RC_FORBIDDEN,
+				  'User does not have read permission';
+    }
+
+    # looks like file exists
+    my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$filesize,
+       $atime,$mtime,$ctime,$blksize,$blocks)
+	    = stat(_);
+
+    # XXX should check Accept headers?
+
+    # check if-modified-since
+    my $ims = $request->header('If-Modified-Since');
+    if (defined $ims) {
+	my $time = HTTP::Date::str2time($ims);
+	if (defined $time and $time >= $mtime) {
+	    return new HTTP::Response &HTTP::Status::RC_NOT_MODIFIED,
+				      "$method $path";
+	}
+    }
+
+    # Ok, should be an OK response by now...
+    $response = new HTTP::Response &HTTP::Status::RC_OK;
+
+    # fill in response headers
+    $response->header('Last-Modified', HTTP::Date::time2str($mtime));
+
+    if (-d _) {         # If the path is a directory, process it
+	# generate the HTML for directory
+	opendir(D, $path) or
+	   return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				     "Cannot read directory '$path': $!";
+	my(@files) = sort readdir(D);
+	closedir(D);
+
+	# Make directory listing
+	for (@files) {
+	    $_ .= "/" if -d "$path/$_";
+	    my $furl = URI::Escape::uri_escape($_);
+	    my $desc = HTML::Entities::encode($_);
+	    $_ = qq{<LI><A HREF="$furl">$desc</A>};
+	}
+	# Ensure that the base URL is "/" terminated
+	my $base = $url->clone;
+	unless ($base->epath =~ m|/$|) {
+	    $base->epath($base->epath . "/");
+	}
+	my $html = join("\n",
+			"<HTML>\n<HEAD>",
+			"<TITLE>Directory $path</TITLE>",
+			"<BASE HREF=\"$base\">",
+			"</HEAD>\n<BODY>",
+			"<H1>Directory listing of $path</H1>",
+			"<UL>", @files, "</UL>",
+			"</BODY>\n</HTML>\n");
+
+	$response->header('Content-Type',   'text/html');
+	$response->header('Content-Length', length $html);
+
+	return $self->collect_once($arg, $response, $html);
+
+    } else {            # path is a regular file
+	my($type, @enc) = LWP::MediaTypes::guess_media_type($path);
+	$response->header('Content-Type',   $type) if $type;
+	$response->header('Content-Length', $filesize);
+	for (@enc) {
+	    $response->push_header('Content-Encoding', $_);
+	}
+
+	# read the file
+	open(F, $path) or return new
+	   HTTP::Response(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+			  "Cannot read file '$path': $!");
+	$response =  $self->collect($arg, $response, sub {
+	    my $content = "";
+	    my $bytes = sysread(F, $content, $size);
+	    return \$content if $bytes > 0;
+	    return \ "";
+	});
+	close(F);
+    }
+
+    $response;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/ftp.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/ftp.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/ftp.pm	(revision 21083)
@@ -0,0 +1,396 @@
+#
+# $Id$
+
+# Implementation of the ftp protocol (RFC 959). We let the Net::FTP
+# package do all the dirty work.
+
+package LWP::Protocol::ftp;
+
+use Carp ();
+
+use HTTP::Status ();
+use HTTP::Negotiate ();
+use HTTP::Response ();
+use LWP::MediaTypes ();
+use File::Listing ();
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use strict;
+eval {
+    require Net::FTP;
+    Net::FTP->require_version(2.00);
+};
+my $init_failed = $@;
+
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+    $size = 4096 unless $size;
+
+    LWP::Debug::trace('()');
+
+    # check proxy
+    if (defined $proxy)
+    {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'You can not proxy through the ftp');
+    }
+
+    my $url = $request->url;
+    if ($url->scheme ne 'ftp') {
+	my $scheme = $url->scheme;
+	return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+		       "LWP::Protocol::ftp::request called for '$scheme'");
+    }
+
+    # check method
+    my $method = $request->method;
+
+    unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'PUT') {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'Library does not allow method ' .
+				   "$method for 'ftp:' URLs");
+    }
+
+    if ($init_failed) {
+	return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				   $init_failed);
+    }
+
+    my $host     = $url->host;
+    my $port     = $url->port;
+    my $user     = $url->user;
+    my $password = $url->password;
+
+    # If a basic autorization header is present than we prefer these over
+    # the username/password specified in the URL.
+    {
+	my($u,$p) = $request->authorization_basic;
+	if (defined $u) {
+	    $user = $u;
+	    $password = $p;
+	}
+    }
+
+    # We allow the account to be specified in the "Account" header
+    my $acct     = $request->header('Account');
+
+    # try to make a connection
+    my $ftp = Net::FTP->new($host, Port => $port);
+    unless ($ftp) {
+       $@ =~ s/^Net::FTP: //;
+       return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR, $@);
+    }
+
+    # Create an initial response object
+    my $response = HTTP::Response->new(&HTTP::Status::RC_OK,
+				       "Document follows");
+    $response->request($request);
+
+    my $mess = $ftp->message;  # welcome message
+    LWP::Debug::debug($mess);
+    $mess =~ s|\n.*||s; # only first line left
+    $mess =~ s|\s*ready\.?$||;
+    # Make the version number more HTTP like
+    $mess =~ s|\s*\(Version\s*|/| and $mess =~ s|\)$||;
+    $response->header("Server", $mess);
+
+    $ftp->timeout($timeout) if $timeout;
+
+    LWP::Debug::debug("Logging in as $user (password $password)...");
+    unless ($ftp->login($user, $password, $acct)) {
+	# Unauthorized.  Let's fake a RC_UNAUTHORIZED response
+	my $res =  HTTP::Response->new(&HTTP::Status::RC_UNAUTHORIZED,
+				       scalar($ftp->message));
+	$res->header("WWW-Authenticate", qq(Basic Realm="FTP login"));
+	return $res;
+    }
+    LWP::Debug::debug($ftp->message);
+
+    # Get & fix the path
+    my @path =  $url->path_components;
+    shift(@path);  # There will always be an empty first component
+    pop(@path) while @path && $path[-1] eq '';  # remove empty tailing comps
+    my $remote_file = pop(@path);
+    $remote_file = '' unless defined $remote_file;
+
+    my $params = $url->params;
+    if (defined($params) && $params eq 'type=a') {
+	$ftp->ascii;
+    } else {
+	$ftp->binary;
+    }
+
+    for (@path) {
+	LWP::Debug::debug("CWD $_");
+	unless ($ftp->cwd($_)) {
+	    return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+				       "Can't chdir to $_");
+	}
+    }
+
+    if ($method eq 'GET' || $method eq 'HEAD') {
+	LWP::Debug::debug("MDTM");
+	if (my $mod_time = $ftp->mdtm($remote_file)) {
+	    $response->last_modified($mod_time);
+	    if (my $ims = $request->if_modified_since) {
+		if ($mod_time <= $ims) {
+		    $response->code(&HTTP::Status::RC_NOT_MODIFIED);
+		    $response->message("Not modified");
+		    return $response;
+		}
+	    }
+	}
+
+	my $data;  # the data handle
+	LWP::Debug::debug("retrieve file?");
+	if (length($remote_file) and $data = $ftp->retr($remote_file)) {
+	    my($type, @enc) = LWP::MediaTypes::guess_media_type($remote_file);
+	    $response->header('Content-Type',   $type) if $type;
+	    for (@enc) {
+		$response->push_header('Content-Encoding', $_);
+	    }
+	    my $mess = $ftp->message;
+	    LWP::Debug::debug($mess);
+	    if ($mess =~ /\((\d+)\s+bytes\)/) {
+		$response->header('Content-Length', "$1");
+	    }
+
+	    if ($method ne 'HEAD') {
+		# Read data from server
+		$response = $self->collect($arg, $response, sub {
+		    my $content = '';
+		    my $result = $data->read($content, $size);
+		    return \$content;
+		} );
+	    }
+	    unless ($data->close) {
+		# Something did not work too well
+		if ($method ne 'HEAD') {
+		    $response->code(&HTTP::Status::RC_INTERNAL_SERVER_ERROR);
+		    $response->message("FTP close response: " . $ftp->code .
+				       " " . $ftp->message);
+		}
+	    }
+	} elsif (!length($remote_file) || $ftp->code == 550) {
+	    # 550 not a plain file, try to list instead
+	    if (length($remote_file) && !$ftp->cwd($remote_file)) {
+		LWP::Debug::debug("chdir before listing failed");
+		return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+					   "File '$remote_file' not found");
+	    }
+
+	    # It should now be safe to try to list the directory
+	    LWP::Debug::debug("dir");
+	    my @lsl = $ftp->dir;
+
+	    # Try to figure out if the user want us to convert the
+	    # directory listing to HTML.
+	    my @variants =
+	      (
+	       ['html',  0.60, 'text/html'            ],
+	       ['dir',   1.00, 'text/ftp-dir-listing' ]
+	      );
+	    #$HTTP::Negotiate::DEBUG=1;
+	    my $prefer = HTTP::Negotiate::choose(\@variants, $request);
+
+	    my $content = '';
+
+	    if (!defined($prefer)) {
+		return HTTP::Response->new(&HTTP::Status::RC_NOT_ACCEPTABLE,
+			       "Neither HTML nor directory listing wanted");
+	    } elsif ($prefer eq 'html') {
+		$response->header('Content-Type' => 'text/html');
+		$content = "<HEAD><TITLE>File Listing</TITLE>\n";
+		my $base = $request->url->clone;
+		my $path = $base->epath;
+		$base->epath("$path/") unless $path =~ m|/$|;
+		$content .= qq(<BASE HREF="$base">\n</HEAD>\n);
+		$content .= "<BODY>\n<UL>\n";
+		for (File::Listing::parse_dir(\@lsl, 'GMT')) {
+		    my($name, $type, $size, $mtime, $mode) = @$_;
+		    $content .= qq(  <LI> <a href="$name">$name</a>);
+		    $content .= " $size bytes" if $type eq 'f';
+		    $content .= "\n";
+		}
+		$content .= "</UL></body>\n";
+	    } else {
+		$response->header('Content-Type', 'text/ftp-dir-listing');
+		$content = join("\n", @lsl, '');
+	    }
+
+	    $response->header('Content-Length', length($content));
+
+	    if ($method ne 'HEAD') {
+		$response = $self->collect_once($arg, $response, $content);
+	    }
+	} else {
+	    my $res = HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+			  "FTP return code " . $ftp->code);
+	    $res->content_type("text/plain");
+	    $res->content($ftp->message);
+	    return $res;
+	}
+    } elsif ($method eq 'PUT') {
+	# method must be PUT
+	unless (length($remote_file)) {
+	    return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				       "Must have a file name to PUT to");
+	}
+	my $data;
+	if ($data = $ftp->stor($remote_file)) {
+	    LWP::Debug::debug($ftp->message);
+	    LWP::Debug::debug("$data");
+	    my $content = $request->content;
+	    my $bytes = 0;
+	    if (defined $content) {
+		if (ref($content) eq 'SCALAR') {
+		    $bytes = $data->write($$content, length($$content));
+		} elsif (ref($content) eq 'CODE') {
+		    my($buf, $n);
+		    while (length($buf = &$content)) {
+			$n = $data->write($buf, length($buf));
+			last unless $n;
+			$bytes += $n;
+		    }
+		} elsif (!ref($content)) {
+		    if (defined $content && length($content)) {
+			$bytes = $data->write($content, length($content));
+		    }
+		} else {
+		    die "Bad content";
+		}
+	    }
+	    $data->close;
+	    LWP::Debug::debug($ftp->message);
+
+	    $response->code(&HTTP::Status::RC_CREATED);
+	    $response->header('Content-Type', 'text/plain');
+	    $response->content("$bytes bytes stored as $remote_file on $host\n")
+
+	} else {
+	    my $res = HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+					  "FTP return code " . $ftp->code);
+	    $res->content_type("text/plain");
+	    $res->content($ftp->message);
+	    return $res;
+	}
+    } else {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   "Illegal method $method");
+    }
+
+    $response;
+}
+
+1;
+
+__END__
+
+# This is what RFC 1738 has to say about FTP access:
+# --------------------------------------------------
+#
+# 3.2. FTP
+#
+#    The FTP URL scheme is used to designate files and directories on
+#    Internet hosts accessible using the FTP protocol (RFC959).
+#
+#    A FTP URL follow the syntax described in Section 3.1.  If :<port> is
+#    omitted, the port defaults to 21.
+#
+# 3.2.1. FTP Name and Password
+#
+#    A user name and password may be supplied; they are used in the ftp
+#    "USER" and "PASS" commands after first making the connection to the
+#    FTP server.  If no user name or password is supplied and one is
+#    requested by the FTP server, the conventions for "anonymous" FTP are
+#    to be used, as follows:
+#
+#         The user name "anonymous" is supplied.
+#
+#         The password is supplied as the Internet e-mail address
+#         of the end user accessing the resource.
+#
+#    If the URL supplies a user name but no password, and the remote
+#    server requests a password, the program interpreting the FTP URL
+#    should request one from the user.
+#
+# 3.2.2. FTP url-path
+#
+#    The url-path of a FTP URL has the following syntax:
+#
+#         <cwd1>/<cwd2>/.../<cwdN>/<name>;type=<typecode>
+#
+#    Where <cwd1> through <cwdN> and <name> are (possibly encoded) strings
+#    and <typecode> is one of the characters "a", "i", or "d".  The part
+#    ";type=<typecode>" may be omitted. The <cwdx> and <name> parts may be
+#    empty. The whole url-path may be omitted, including the "/"
+#    delimiting it from the prefix containing user, password, host, and
+#    port.
+#
+#    The url-path is interpreted as a series of FTP commands as follows:
+#
+#       Each of the <cwd> elements is to be supplied, sequentially, as the
+#       argument to a CWD (change working directory) command.
+#
+#       If the typecode is "d", perform a NLST (name list) command with
+#       <name> as the argument, and interpret the results as a file
+#       directory listing.
+#
+#       Otherwise, perform a TYPE command with <typecode> as the argument,
+#       and then access the file whose name is <name> (for example, using
+#       the RETR command.)
+#
+#    Within a name or CWD component, the characters "/" and ";" are
+#    reserved and must be encoded. The components are decoded prior to
+#    their use in the FTP protocol.  In particular, if the appropriate FTP
+#    sequence to access a particular file requires supplying a string
+#    containing a "/" as an argument to a CWD or RETR command, it is
+#    necessary to encode each "/".
+#
+#    For example, the URL <URL:ftp://myname@host.dom/%2Fetc/motd> is
+#    interpreted by FTP-ing to "host.dom", logging in as "myname"
+#    (prompting for a password if it is asked for), and then executing
+#    "CWD /etc" and then "RETR motd". This has a different meaning from
+#    <URL:ftp://myname@host.dom/etc/motd> which would "CWD etc" and then
+#    "RETR motd"; the initial "CWD" might be executed relative to the
+#    default directory for "myname". On the other hand,
+#    <URL:ftp://myname@host.dom//etc/motd>, would "CWD " with a null
+#    argument, then "CWD etc", and then "RETR motd".
+#
+#    FTP URLs may also be used for other operations; for example, it is
+#    possible to update a file on a remote file server, or infer
+#    information about it from the directory listings. The mechanism for
+#    doing so is not spelled out here.
+#
+# 3.2.3. FTP Typecode is Optional
+#
+#    The entire ;type=<typecode> part of a FTP URL is optional. If it is
+#    omitted, the client program interpreting the URL must guess the
+#    appropriate mode to use. In general, the data content type of a file
+#    can only be guessed from the name, e.g., from the suffix of the name;
+#    the appropriate type code to be used for transfer of the file can
+#    then be deduced from the data content of the file.
+#
+# 3.2.4 Hierarchy
+#
+#    For some file systems, the "/" used to denote the hierarchical
+#    structure of the URL corresponds to the delimiter used to construct a
+#    file name hierarchy, and thus, the filename will look similar to the
+#    URL path. This does NOT mean that the URL is a Unix filename.
+#
+# 3.2.5. Optimization
+#
+#    Clients accessing resources via FTP may employ additional heuristics
+#    to optimize the interaction. For some FTP servers, for example, it
+#    may be reasonable to keep the control connection open while accessing
+#    multiple URLs from the same server. However, there is no common
+#    hierarchical model to the FTP protocol, so if a directory change
+#    command has been given, it is impossible in general to deduce what
+#    sequence should be given to navigate to another directory for a
+#    second retrieval, if the paths are different.  The only reliable
+#    algorithm is to disconnect and reestablish the control connection.
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/gopher.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/gopher.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/gopher.pm	(revision 21083)
@@ -0,0 +1,215 @@
+#
+# $Id$
+
+# Implementation of the gopher protocol (RFC 1436)
+#
+# This code is based on 'wwwgopher.pl,v 0.10 1994/10/17 18:12:34 shelden'
+# which in turn is a vastly modified version of Oscar's http'get()
+# dated 28/3/94 in <ftp://cui.unige.ch/PUBLIC/oscar/scripts/http.pl>
+# including contributions from Marc van Heyningen and Martijn Koster.
+#
+
+package LWP::Protocol::gopher;
+
+use strict;
+use vars qw(@ISA);
+
+require HTTP::Response;
+require HTTP::Status;
+require IO::Socket;
+require IO::Select;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+
+my %gopher2mimetype = (
+    '0' => 'text/plain',                # 0 file
+    '1' => 'text/html',                 # 1 menu
+					# 2 CSO phone-book server
+					# 3 Error
+    '4' => 'application/mac-binhex40',  # 4 BinHexed Macintosh file
+    '5' => 'application/zip',           # 5 DOS binary archive of some sort
+    '6' => 'application/octet-stream',  # 6 UNIX uuencoded file.
+    '7' => 'text/html',                 # 7 Index-Search server
+					# 8 telnet session
+    '9' => 'application/octet-stream',  # 9 binary file
+    'h' => 'text/html',                 # html
+    'g' => 'image/gif',                 # gif
+    'I' => 'image/*',                   # some kind of image
+);
+
+my %gopher2encoding = (
+    '6' => 'x_uuencode',                # 6 UNIX uuencoded file.
+);
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+    LWP::Debug::trace('()');
+
+    $size = 4096 unless $size;
+
+    # check proxy
+    if (defined $proxy) {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'You can not proxy through the gopher');
+    }
+
+    my $url = $request->url;
+    die "bad scheme" if $url->scheme ne 'gopher';
+
+
+    my $method = $request->method;
+    unless ($method eq 'GET' || $method eq 'HEAD') {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'Library does not allow method ' .
+				   "$method for 'gopher:' URLs");
+    }
+
+    my $gophertype = $url->gtype;
+    unless (exists $gopher2mimetype{$gophertype}) {
+	return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED,
+				   'Library does not support gophertype ' .
+				   $gophertype);
+    }
+
+    my $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+    $response->header('Content-type' => $gopher2mimetype{$gophertype}
+					|| 'text/plain');
+    $response->header('Content-Encoding' => $gopher2encoding{$gophertype})
+	if exists $gopher2encoding{$gophertype};
+
+    if ($method eq 'HEAD') {
+	# XXX: don't even try it so we set this header
+	$response->header('Client-Warning' => 'Client answer only');
+	return $response;
+    }
+    
+    if ($gophertype eq '7' && ! $url->search) {
+      # the url is the prompt for a gopher search; supply boiler-plate
+      return $self->collect_once($arg, $response, <<"EOT");
+<HEAD>
+<TITLE>Gopher Index</TITLE>
+<ISINDEX>
+</HEAD>
+<BODY>
+<H1>$url<BR>Gopher Search</H1>
+This is a searchable Gopher index.
+Use the search function of your browser to enter search terms.
+</BODY>
+EOT
+    }
+
+    my $host = $url->host;
+    my $port = $url->port;
+
+    my $requestLine = "";
+
+    my $selector = $url->selector;
+    if (defined $selector) {
+	$requestLine .= $selector;
+	my $search = $url->search;
+	if (defined $search) {
+	    $requestLine .= "\t$search";
+	    my $string = $url->string;
+	    if (defined $string) {
+		$requestLine .= "\t$string";
+	    }
+	}
+    }
+    $requestLine .= "\015\012";
+
+    # potential request headers are just ignored
+
+    # Ok, lets make the request
+    my $socket = IO::Socket::INET->new(PeerAddr => $host,
+				       PeerPort => $port,
+				       Timeout  => $timeout);
+    die "Can't connect to $host:$port" unless $socket;
+    my $sel = IO::Select->new($socket);
+
+    {
+	die "write timeout" if $timeout && !$sel->can_write($timeout);
+	my $n = syswrite($socket, $requestLine, length($requestLine));
+	die $! unless defined($n);
+	die "short write" if $n != length($requestLine);
+    }
+
+    my $user_arg = $arg;
+
+    # must handle menus in a special way since they are to be
+    # converted to HTML.  Undefing $arg ensures that the user does
+    # not see the data before we get a change to convert it.
+    $arg = undef if $gophertype eq '1' || $gophertype eq '7';
+
+    # collect response
+    my $buf = '';
+    $response = $self->collect($arg, $response, sub {
+	die "read timeout" if $timeout && !$sel->can_read($timeout);
+        my $n = sysread($socket, $buf, $size);
+	die $! unless defined($n);
+	return \$buf;
+      } );
+
+    # Convert menu to HTML and return data to user.
+    if ($gophertype eq '1' || $gophertype eq '7') {
+	my $content = menu2html($response->content);
+	if (defined $user_arg) {
+	    $response = $self->collect_once($user_arg, $response, $content);
+	} else {
+	    $response->content($content);
+	}
+    }
+
+    $response;
+}
+
+
+sub gopher2url
+{
+    my($gophertype, $path, $host, $port) = @_;
+
+    my $url;
+
+    if ($gophertype eq '8' || $gophertype eq 'T') {
+	# telnet session
+	$url = URI::URL->new($gophertype eq '8' ? 'telnet:' : 'tn3270:');
+	$url->user($path) if defined $path;
+    } else {
+	$path = URI::Escape::uri_escape($path);
+	$url = URI::URL->new("gopher:/$gophertype$path");
+    }
+    $url->host($host);
+    $url->port($port);
+    $url;
+}
+
+sub menu2html {
+    my($menu) = @_;
+
+    $menu =~ s/\015//g;  # remove carriage return
+    my $tmp = <<"EOT";
+<HTML>
+<HEAD>
+   <TITLE>Gopher menu</TITLE>
+</HEAD>
+<BODY>
+<H1>Gopher menu</H1>
+EOT
+    for (split("\n", $menu)) {
+	last if /^\./;
+	my($pretty, $path, $host, $port) = split("\t");
+
+	$pretty =~ s/^(.)//;
+	my $type = $1;
+
+	my $url = gopher2url($type, $path, $host, $port)->as_string;
+	$tmp .= qq{<A HREF="$url">$pretty</A><BR>\n};
+    }
+    $tmp .= "</BODY>\n</HTML>\n";
+    $tmp;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/http.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/http.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/http.pm	(revision 21083)
@@ -0,0 +1,252 @@
+#
+# $Id$
+
+package LWP::Protocol::http;
+
+require LWP::Debug;
+require HTTP::Response;
+require HTTP::Status;
+require IO::Socket;
+require IO::Select;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+use strict;
+my $CRLF         = "\015\012";     # how lines should be terminated;
+				   # "\r\n" is not correct on all systems, for
+				   # instance MacPerl defines it to "\012\015"
+
+sub _new_socket
+{
+    my($self, $host, $port, $timeout) = @_;
+
+    local($^W) = 0;  # IO::Socket::INET can be noisy
+    my $sock = IO::Socket::INET->new(PeerAddr => $host,
+				     PeerPort => $port,
+				     Proto    => 'tcp',
+				     Timeout  => $timeout,
+				    );
+    unless ($sock) {
+	# IO::Socket::INET leaves additional error messages in $@
+	$@ =~ s/^.*?: //;
+	die "Can't connect to $host:$port ($@)";
+    }
+    $sock;
+}
+
+
+sub _check_sock
+{
+    #my($self, $req, $sock) = @_;
+}
+
+sub _get_sock_info
+{
+    my($self, $res, $sock) = @_;
+    $res->header("Client-Peer" =>
+		 $sock->peerhost . ":" . $sock->peerport);
+}
+
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+    LWP::Debug::trace('()');
+
+    $size ||= 4096;
+
+    # check method
+    my $method = $request->method;
+    unless ($method =~ /^[A-Za-z0-9_!\#\$%&\'*+\-.^\`|~]+$/) {  # HTTP token
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'Library does not allow method ' .
+				  "$method for 'http:' URLs";
+    }
+
+    my $url = $request->url;
+    my($host, $port, $fullpath);
+
+    # Check if we're proxy'ing
+    if (defined $proxy) {
+	# $proxy is an URL to an HTTP server which will proxy this request
+	$host = $proxy->host;
+	$port = $proxy->port;
+	$fullpath = $url->as_string;
+    }
+    else {
+	$host = $url->host;
+	$port = $url->port;
+	$fullpath = $url->full_path;
+    }
+
+    # connect to remote site
+    my $socket = $self->_new_socket($host, $port, $timeout);
+    $self->_check_sock($request, $socket);
+	    
+    my $sel = IO::Select->new($socket) if $timeout;
+
+    my $request_line = "$method $fullpath HTTP/1.0$CRLF";
+
+    my $h = $request->headers->clone;
+    my $cont_ref = $request->content_ref;
+    $cont_ref = $$cont_ref if ref($$cont_ref);
+    my $ctype = ref($cont_ref);
+
+    # If we're sending content we *have* to specify a content length
+    # otherwise the server won't know a messagebody is coming.
+    if ($ctype eq 'CODE') {
+	die 'No Content-Length header for request with dynamic content'
+	    unless defined($h->header('Content-Length')) ||
+		   $h->content_type =~ /^multipart\//;
+	# For HTTP/1.1 we could have used chunked transfer encoding...
+    } else {
+	$h->header('Content-Length' => length $$cont_ref)
+	        if defined($$cont_ref) && length($$cont_ref);
+    }
+    
+    # HTTP/1.1 will require us to send the 'Host' header, so we might
+    # as well start now.
+    my $hhost = $url->netloc;
+    $hhost =~ s/^([^\@]*)\@//;  # get rid of potential "user:pass@"
+    $h->header('Host' => $hhost) unless defined $h->header('Host');
+
+    # add authorization header if we need them.  HTTP URLs do
+    # not really support specification of user and password, but
+    # we allow it.
+    if (defined($1) && not $h->header('Authorization')) {
+	$h->authorization_basic($url->user, $url->password);
+    }
+
+    my $buf = $request_line . $h->as_string($CRLF) . $CRLF;
+    my $n;  # used for return value from syswrite/sysread
+
+    die "write timeout" if $timeout && !$sel->can_write($timeout);
+    $n = $socket->syswrite($buf, length($buf));
+    die $! unless defined($n);
+    die "short write" unless $n == length($buf);
+    LWP::Debug::conns($buf);
+
+    if ($ctype eq 'CODE') {
+	while ( ($buf = &$cont_ref()), defined($buf) && length($buf)) {
+	    die "write timeout" if $timeout && !$sel->can_write($timeout);
+	    $n = $socket->syswrite($buf, length($buf));
+	    die $! unless defined($n);
+	    die "short write" unless $n == length($buf);
+	    LWP::Debug::conns($buf);
+	}
+    } elsif (defined($$cont_ref) && length($$cont_ref)) {
+	die "write timeout" if $timeout && !$sel->can_write($timeout);
+	$n = $socket->syswrite($$cont_ref, length($$cont_ref));
+	die $! unless defined($n);
+	die "short write" unless $n == length($$cont_ref);
+	LWP::Debug::conns($buf);
+    }
+    
+    # read response line from server
+    LWP::Debug::debug('reading response');
+
+    my $response;
+    $buf = '';
+
+    # Inside this loop we will read the response line and all headers
+    # found in the response.
+    while (1) {
+	{
+	    die "read timeout" if $timeout && !$sel->can_read($timeout);
+	    $n = $socket->sysread($buf, $size, length($buf));
+	    die $! unless defined($n);
+	    die "unexpected EOF before status line seen" unless $n;
+	    LWP::Debug::conns($buf);
+	}
+	if ($buf =~ s/^(HTTP\/\d+\.\d+)[ \t]+(\d+)[ \t]*([^\012]*)\012//) {
+	    # HTTP/1.0 response or better
+	    my($ver,$code,$msg) = ($1, $2, $3);
+	    $msg =~ s/\015$//;
+	    LWP::Debug::debug("$ver $code $msg");
+	    $response = HTTP::Response->new($code, $msg);
+	    $response->protocol($ver);
+
+	    # ensure that we have read all headers.  The headers will be
+	    # terminated by two blank lines
+	    until ($buf =~ /^\015?\012/ || $buf =~ /\015?\012\015?\012/) {
+		# must read more if we can...
+		LWP::Debug::debug("need more header data");
+		die "read timeout" if $timeout && !$sel->can_read($timeout);
+		$n = $socket->sysread($buf, $size, length($buf));
+		die $! unless defined($n);
+		die "unexpected EOF before all headers seen" unless $n;
+		#LWP::Debug::conns($buf);
+	    }
+
+	    # now we start parsing the headers.  The strategy is to
+	    # remove one line at a time from the beginning of the header
+	    # buffer ($res).
+	    my($key, $val);
+	    while ($buf =~ s/([^\012]*)\012//) {
+		my $line = $1;
+
+		# if we need to restore as content when illegal headers
+		# are found.
+		my $save = "$line\012"; 
+
+		$line =~ s/\015$//;
+		last unless length $line;
+
+		if ($line =~ /^([a-zA-Z0-9_\-]+)\s*:\s*(.*)/) {
+		    $response->push_header($key, $val) if $key;
+		    ($key, $val) = ($1, $2);
+		} elsif ($line =~ /^\s+(.*)/) {
+		    unless ($key) {
+			$response->header("Client-Warning" =>
+					 => "Illegal continuation header");
+			$buf = "$save$buf";
+			last;
+		    }
+		    $val .= " $1";
+		} else {
+		    $response->header("Client-Warning" =>
+				      "Illegal header '$line'");
+		    $buf = "$save$buf";
+		    last;
+		}
+	    }
+	    $response->push_header($key, $val) if $key;
+	    last;
+
+	} elsif ((length($buf) >= 5 and $buf !~ /^HTTP\//) or
+		 $buf =~ /\012/ ) {
+	    # HTTP/0.9 or worse
+	    LWP::Debug::debug("HTTP/0.9 assume OK");
+	    $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+	    $response->protocol('HTTP/0.9');
+	    last;
+
+	} else {
+	    # need more data
+	    LWP::Debug::debug("need more status line data");
+	}
+    };
+    $response->request($request);
+    $self->_get_sock_info($response, $socket);
+
+
+    my $usebuf = length($buf) > 0;
+    $response = $self->collect($arg, $response, sub {
+        if ($usebuf) {
+	    $usebuf = 0;
+	    return \$buf;
+	}
+	die "read timeout" if $timeout && !$sel->can_read($timeout);
+	my $n = $socket->sysread($buf, $size);
+	die $! unless defined($n);
+	#LWP::Debug::conns($buf);
+	return \$buf;
+	} );
+
+    $socket->close;
+
+    $response;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/https.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/https.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/https.pm	(revision 21083)
@@ -0,0 +1,59 @@
+#
+# $Id$
+
+use strict;
+
+package LWP::Protocol::https;
+require Net::SSL;  # from Crypt-SSLeay
+
+use vars qw(@ISA);
+
+require LWP::Protocol::http;
+@ISA=qw(LWP::Protocol::http);
+
+sub _new_socket
+{
+    my($self, $host, $port, $timeout) = @_;
+    local($^W) = 0;  # IO::Socket::INET can be noisy
+    my $sock = Net::SSL->new(PeerAddr => $host,
+			     PeerPort => $port,
+			     Proto    => 'tcp',
+			     Timeout  => $timeout,
+			    );
+    unless ($sock) {
+	# IO::Socket::INET leaves additional error messages in $@
+	$@ =~ s/^.*?: //;
+	die "Can't connect to $host:$port ($@)";
+    }
+    $sock;
+}
+
+sub _check_sock
+{
+    my($self, $req, $sock) = @_;
+    my $check = $req->header("If-SSL-Cert-Subject");
+    if (defined $check) {
+	my $cert = $sock->get_peer_certificate ||
+	    die "Missing SSL certificate";
+	my $subject = $cert->subject_name;
+	die "Bad SSL certificate subject: '$subject' !~ /$check/"
+	    unless $subject =~ /$check/;
+	$req->remove_header("If-SSL-Cert-Subject");  # don't pass it on
+    }
+}
+
+sub _get_sock_info
+{
+    my $self = shift;
+    $self->SUPER::_get_sock_info(@_);
+    my($res, $sock) = @_;
+    $res->header("Client-SSL-Cipher" => $sock->get_cipher);
+    my $cert = $sock->get_peer_certificate;
+    if ($cert) {
+	$res->header("Client-SSL-Cert-Subject" => $cert->subject_name);
+	$res->header("Client-SSL-Cert-Issuer" => $cert->issuer_name);
+    }
+    $res->header("Client-SSL-Warning" => "Peer certificate not verified");
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/mailto.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/mailto.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/mailto.pm	(revision 21083)
@@ -0,0 +1,87 @@
+#
+# $Id$
+#
+# This module implements the mailto protocol.  It is just a simple
+# frontend to the Unix sendmail program.  In the long run this module
+# will built using the Mail::Send module.
+
+package LWP::Protocol::mailto;
+
+require LWP::Protocol;
+require HTTP::Request;
+require HTTP::Response;
+require HTTP::Status;
+
+use Carp;
+
+@ISA = qw(LWP::Protocol);
+
+$SENDMAIL = "/usr/lib/sendmail";
+
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size) = @_;
+
+    # check proxy
+    if (defined $proxy)
+    {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'You can not proxy with mail';
+    }
+
+    # check method
+    $method = $request->method;
+
+    if ($method ne 'POST') {
+	return new HTTP::Response &HTTP::Status::RC_BAD_REQUEST,
+				  'Library does not allow method ' .
+				  "$method for 'mailto:' URLs";
+    }
+
+    # check url
+    my $url = $request->url;
+
+    my $scheme = $url->scheme;
+    if ($scheme ne 'mailto') {
+	return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				  "LWP::file::request called for '$scheme'";
+    }
+    unless (-x $SENDMAIL) {
+	return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				  "You don't have $SENDMAIL";
+    }
+
+    open(SENDMAIL, "| $SENDMAIL -oi -t") or
+	return new HTTP::Response &HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				  "Can't run $SENDMAIL: $!";
+
+    my $addr = $url->encoded822addr;
+
+    $request->header('To', $addr);
+    print SENDMAIL $request->headers_as_string;
+    print SENDMAIL "\n";
+    my $content = $request->content;
+    if (defined $content) {
+	my $contRef = ref($content) ? $content : \$content;
+	if (ref($contRef) eq 'SCALAR') {
+	    print SENDMAIL $$contRef;
+	} elsif (ref($contRef) eq 'CODE') {
+	    # Callback provides data
+	    my $d;
+	    while (length($d = &$contRef)) {
+		print SENDMAIL $d;
+	    }
+	}
+    }
+    close(SENDMAIL);
+
+    my $response = new HTTP::Response &HTTP::Status::RC_ACCEPTED,
+				     'Mail accepted by sendmail';
+    $response->header('Content-Type', 'text/plain');
+    $response->content("Mail sent to <$addr>\n");
+
+    return $response;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/nntp.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/nntp.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Protocol/nntp.pm	(revision 21083)
@@ -0,0 +1,142 @@
+#
+# $Id$
+
+# Implementation of the Network News Transfer Protocol (RFC 977)
+#
+
+package LWP::Protocol::nntp;
+
+require LWP::Protocol;
+@ISA = qw(LWP::Protocol);
+
+require LWP::Debug;
+require HTTP::Response;
+require HTTP::Status;
+require Net::NNTP;
+
+use strict;
+
+
+sub request
+{
+    my($self, $request, $proxy, $arg, $size, $timeout) = @_;
+
+    LWP::Debug::trace('()');
+
+    $size = 4096 unless $size;
+
+    # Check for proxy
+    if (defined $proxy) {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'You can not proxy through NNTP');
+    }
+
+    # Check that the scheme is as expected
+    my $url = $request->url;
+    my $scheme = $url->scheme;
+    unless ($scheme eq 'news') {
+	return HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				   "LWP::Protocol::nntp::request called for '$scheme'");
+    }
+
+    # check for a valid method
+    my $method = $request->method;
+    unless ($method eq 'GET' || $method eq 'HEAD' || $method eq 'POST') {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   'Library does not allow method ' .
+				   "$method for 'news:' URLs");
+    }
+
+    # extract the identifier and check against posting to an article
+    my $groupart = $url->groupart;
+    my $is_art = $groupart =~ /@/;
+
+    if ($is_art && $method eq 'POST') {
+	return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST,
+				   "Can't post to an article <$groupart>");
+    }
+
+    my $nntp = Net::NNTP->new(undef,
+			      #Port    => 18574,
+			      Timeout => $timeout,
+			      #Debug   => 1,
+			     );
+    die "Can't connect to nntp server" unless $nntp;
+
+    # Check the initial welcome message from the NNTP server
+    if ($nntp->status != 2) {
+	return HTTP::Response->new(&HTTP::Status::RC_SERVICE_UNAVAILABLE,
+				   $nntp->message);
+    }
+    my $response = HTTP::Response->new(&HTTP::Status::RC_OK, "OK");
+
+    my $mess = $nntp->message;
+    LWP::Debug::debug($mess);
+
+    # Try to extract server name from greating message.
+    # Don't know if this works well for a large class of servers, but
+    # this works for our server.
+    $mess =~ s/\s+ready\b.*//;
+    $mess =~ s/^\S+\s+//;
+    $response->header(Server => $mess);
+
+
+    # First we handle posting of articles
+    if ($method eq 'POST') {
+	return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED,
+				   "POST not implemented yet");
+    }
+
+    # The method must be "GET" or "HEAD" by now
+    if (!$is_art) {
+	if (!$nntp->group($groupart)) {
+	    return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+				       $nntp->message);
+	}
+	return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED,
+				   "GET newsgroup not implemented yet");
+    }
+
+    # Send command to server to retrieve an article (or just the headers)
+    my $get = $method eq 'HEAD' ? "head" : "article";
+    my $art = $nntp->$get("<$groupart>");
+    unless ($art) {
+	return HTTP::Response->new(&HTTP::Status::RC_NOT_FOUND,
+				   $nntp->message);
+    }
+    LWP::Debug::debug($nntp->message);
+    
+    # Parse headers
+    my($key, $val);
+    while ($_ = shift @$art) {
+	if (/^\s+$/) {
+	    last;  # end of headers
+	} elsif (/^(\S+):\s*(.*)/) {
+	    $response->push_header($key, $val) if $key;
+	    ($key, $val) = ($1, $2);
+	} elsif (/^\s+(.*)/) {
+	    next unless $key;
+	    $val .= $1;
+	} else {
+	    unshift(@$art, $_);
+	    last;
+	}
+    }
+    $response->push_header($key, $val) if $key;
+
+    # Ensure that there is a Content-Type header
+    $response->header("Content-Type", "text/plain")
+	unless $response->header("Content-Type");
+
+    # Collect the body
+    $response = $self->collect_once($arg, $response, join("", @$art))
+      if @$art;
+
+    # Say godbye to the server
+    $nntp->quit;
+    $nntp = undef;
+
+    $response;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/RobotUA.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/RobotUA.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/RobotUA.pm	(revision 21083)
@@ -0,0 +1,285 @@
+# $Id$
+
+package LWP::RobotUA;
+
+require LWP::UserAgent;
+@ISA = qw(LWP::UserAgent);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+require WWW::RobotRules;
+require HTTP::Request;
+require HTTP::Response;
+
+use Carp ();
+use LWP::Debug ();
+use HTTP::Status ();
+use HTTP::Date qw(time2str);
+use strict;
+
+=head1 NAME
+
+LWP::RobotUA - A class for Web Robots
+
+=head1 SYNOPSIS
+
+  require LWP::RobotUA;
+  $ua = new LWP::RobotUA 'my-robot/0.1', 'me@foo.com';
+  $ua->delay(10);  # be very nice, go slowly
+  ...
+  # just use it just like a normal LWP::UserAgent
+  $res = $ua->request($req);
+
+=head1 DESCRIPTION
+
+This class implements a user agent that is suitable for robot
+applications.  Robots should be nice to the servers they visit.  They
+should consult the F<robots.txt> file to ensure that they are welcomed
+and they should not send too frequent requests.
+
+But, before you consider writing a robot take a look at
+<URL:http://info.webcrawler.com/mak/projects/robots/robots.html>.
+
+When you use a I<LWP::RobotUA> as your user agent, then you do not
+really have to think about these things yourself.  Just send requests
+as you do when you are using a normal I<LWP::UserAgent> and this
+special agent will make sure you are nice.
+
+=head1 METHODS
+
+The LWP::RobotUA is a sub-class of LWP::UserAgent and implements the
+same methods. In addition the following methods are provided:
+
+=over 4
+
+=cut
+
+
+#
+# Additional attributes in addition to those found in LWP::UserAgent:
+#
+# $self->{'delay'}    Required delay between request to the same
+#                     server in minutes.
+#
+# $self->{'rules'}     A WWW::RobotRules object
+#
+
+
+=item $ua = LWP::RobotUA->new($agent_name, $from, [$rules])
+
+Your robot's name and the mail address of the human responsible for
+the robot (i.e. you) is required by the constructor.
+
+Optionally it allows you to specify the I<WWW::RobotRules> object to
+use.
+
+=cut
+
+sub new
+{
+    my($class,$name,$from,$rules) = @_;
+
+    Carp::croak('LWP::RobotUA name required') unless $name;
+    Carp::croak('LWP::RobotUA from address required') unless $from;
+
+    my $self = new LWP::UserAgent;
+    $self = bless $self, $class;
+
+    $self->{'delay'} = 1;   # minutes
+    $self->{'agent'} = $name;
+    $self->{'from'}  = $from;
+    $self->{'use_sleep'} = 1;
+
+    if ($rules) {
+	$rules->agent($name);
+	$self->{'rules'} = $rules;
+    } else {
+	$self->{'rules'} = new WWW::RobotRules $name;
+    }
+
+    $self;
+}
+
+
+=item $ua->delay([$minutes])
+
+Set the minimum delay between requests to the same server.  The
+default is 1 minute.
+
+=item $ua->use_sleep([$boolean])
+
+Get/set a value indicating wether the UA should sleep() if request
+arrive to fast (before $ua->delay minutes has passed).  The default is
+TRUE.  If this value is FALSE then an internal SERVICE_UNAVAILABLE
+response will be generated.  It will have an Retry-After header that
+indicate when it is OK to send another request to this server.
+
+=cut
+
+sub delay     { shift->_elem('delay',     @_); }
+sub use_sleep { shift->_elem('use_sleep', @_); }
+
+sub agent
+{
+    my $self = shift;
+    my $old = $self->SUPER::agent(@_);
+    if (@_) {
+	# Changing our name means to start fresh
+	$self->{'rules'}->agent($self->{'agent'}); 
+    }
+    $old;
+}
+
+
+=item $ua->rules([$rules])
+
+Set/get which I<WWW::RobotRules> object to use. 
+
+=cut
+
+sub rules {
+    my $self = shift;
+    my $old = $self->_elem('rules', @_);
+    $self->{'rules'}->agent($self->{'agent'}) if @_;
+    $old;
+}
+
+
+=item $ua->no_visits($netloc)
+
+Returns the number of documents fetched from this server host. Yes I
+know, this method should probably have been named num_visits() or
+something like that :-(
+
+=cut
+
+sub no_visits
+{
+    my($self, $netloc) = @_;
+    $self->{'rules'}->no_visits($netloc);
+}
+
+*host_count = \&no_visits;  # backwards compatibility with LWP-5.02
+
+
+=item $ua->host_wait($netloc)
+
+Returns the number of seconds (from now) you must wait before you can
+make a new request to this host.
+
+=cut
+
+sub host_wait
+{
+    my($self, $netloc) = @_;
+    return undef unless defined $netloc;
+    my $last = $self->{'rules'}->last_visit($netloc);
+    if ($last) {
+	my $wait = int($self->{'delay'} * 60 - (time - $last));
+	$wait = 0 if $wait < 0;
+	return $wait;
+    }
+    return 0;
+}
+
+
+sub simple_request
+{
+    my($self, $request, $arg, $size) = @_;
+
+    LWP::Debug::trace('()');
+
+    # Do we try to access a new server?
+    my $allowed = $self->{'rules'}->allowed($request->url);
+
+    if ($allowed < 0) {
+	LWP::Debug::debug("Host is not visited before, or robots.txt expired.");
+	# fetch "robots.txt"
+	my $robot_url = $request->url->clone;
+	$robot_url->path("robots.txt");
+	$robot_url->params(undef);
+	$robot_url->query(undef);
+	LWP::Debug::debug("Requesting $robot_url");
+
+	# make access to robot.txt legal since this will be a recursive call
+	$self->{'rules'}->parse($robot_url, ""); 
+
+	my $robot_req = new HTTP::Request 'GET', $robot_url;
+	my $robot_res = $self->request($robot_req);
+	my $fresh_until = $robot_res->fresh_until;
+	if ($robot_res->is_success) {
+	    LWP::Debug::debug("Parsing robot rules");
+	    $self->{'rules'}->parse($robot_url, $robot_res->content, 
+				    $fresh_until);
+	} else {
+	    LWP::Debug::debug("No robots.txt file found");
+	    $self->{'rules'}->parse($robot_url, "", $fresh_until);
+	}
+
+	# recalculate allowed...
+	$allowed = $self->{'rules'}->allowed($request->url);
+    }
+
+    # Check rules
+    unless ($allowed) {
+	return new HTTP::Response
+	  &HTTP::Status::RC_FORBIDDEN, 'Forbidden by robots.txt';
+    }
+
+    my $netloc = $request->url->netloc;
+    my $wait = $self->host_wait($netloc);
+
+    if ($wait) {
+	LWP::Debug::debug("Must wait $wait seconds");
+	if ($self->{'use_sleep'}) {
+	    sleep($wait)
+	} else {
+	    my $res = new HTTP::Response
+	      &HTTP::Status::RC_SERVICE_UNAVAILABLE, 'Please, slow down';
+	    $res->header('Retry-After', time2str(time + $wait));
+	    return $res;
+	}
+    }
+
+    # Perform the request
+    my $res = $self->SUPER::simple_request($request, $arg, $size);
+
+    $self->{'rules'}->visit($netloc);
+
+    $res;
+}
+
+
+=item $ua->as_string
+
+Returns a text that describe the state of the UA.
+Mainly useful for debugging.
+
+=cut
+
+sub as_string
+{
+    my $self = shift;
+    my @s;
+    push(@s, "Robot: $self->{'agent'} operated by $self->{'from'}  [$self]");
+    push(@s, "    Minimum delay: " . int($self->{'delay'}*60) . "s");
+    push(@s, "    Will sleep if too early") if $self->{'use_sleep'};
+    push(@s, "    Rules = $self->{'rules'}");
+    join("\n", @s, '');
+}
+
+1;
+
+=back
+
+=head1 SEE ALSO
+
+L<LWP::UserAgent>, L<WWW::RobotRules>
+
+=head1 COPYRIGHT
+
+Copyright 1996-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Simple.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Simple.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/Simple.pm	(revision 21083)
@@ -0,0 +1,329 @@
+#
+# $Id$
+
+=head1 NAME
+
+get, head, getprint, getstore, mirror - Procedural LWP interface
+
+=head1 SYNOPSIS
+
+ perl -MLWP::Simple -e 'getprint "http://www.sn.no"'
+
+ use LWP::Simple;
+ $content = get("http://www.sn.no/")
+ if (mirror("http://www.sn.no/", "foo") == RC_NOT_MODIFIED) {
+     ...
+ }
+
+ if (is_success(getprint("http://www.sn.no/"))) {
+     ...
+ }
+
+=head1 DESCRIPTION
+
+This interface is intended for those who want a simplified view of the
+libwww-perl library.  It should also be suitable for one-liners.  If
+you need more control or access to the header fields in the requests
+sent and responses received you should use the full object oriented
+interface provided by the C<LWP::UserAgent> module.
+
+The following functions are provided (and exported) by this module:
+
+=over 3
+
+=item get($url)
+
+The get() function will fetch the document identified by the given URL
+and return it.  It returns C<undef> if it fails.  The $url argument can
+be either a simple string or a reference to a URI::URL object.
+
+You will not be able to examine the response code or response headers
+(like 'Content-Type') when you are accessing the web using this
+function.  If you need this information you should use the full OO
+interface (see L<LWP::UserAgent>).
+
+=item head($url)
+
+Get document headers. Returns the following 5 values if successful:
+($content_type, $document_length, $modified_time, $expires, $server)
+
+Returns an empty list if it fails.  In scalar context returns TRUE if
+successful.
+
+=item getprint($url)
+
+Get and print a document identified by a URL. The document is printed
+on STDOUT as data is received from the network.  If the request fails,
+then the status code and message is printed on STDERR.  The return
+value is the HTTP response code.
+
+=item getstore($url, $file)
+
+Gets a document identified by a URL and stores it in the file. The
+return value is the HTTP response code.
+
+=item mirror($url, $file)
+
+Get and store a document identified by a URL, using
+I<If-modified-since>, and checking of the I<Content-Length>.  Returns
+the HTTP response code.
+
+=back
+
+This module also exports the HTTP::Status constants and procedures.
+These can be used when you check the response code from getprint(),
+getstore() and mirror().  The constants are:
+
+   RC_CONTINUE
+   RC_SWITCHING_PROTOCOLS
+   RC_OK
+   RC_CREATED
+   RC_ACCEPTED
+   RC_NON_AUTHORITATIVE_INFORMATION
+   RC_NO_CONTENT
+   RC_RESET_CONTENT
+   RC_PARTIAL_CONTENT
+   RC_MULTIPLE_CHOICES
+   RC_MOVED_PERMANENTLY
+   RC_MOVED_TEMPORARILY
+   RC_SEE_OTHER
+   RC_NOT_MODIFIED
+   RC_USE_PROXY
+   RC_BAD_REQUEST
+   RC_UNAUTHORIZED
+   RC_PAYMENT_REQUIRED
+   RC_FORBIDDEN
+   RC_NOT_FOUND
+   RC_METHOD_NOT_ALLOWED
+   RC_NOT_ACCEPTABLE
+   RC_PROXY_AUTHENTICATION_REQUIRED
+   RC_REQUEST_TIMEOUT
+   RC_CONFLICT
+   RC_GONE
+   RC_LENGTH_REQUIRED
+   RC_PRECONDITION_FAILED
+   RC_REQUEST_ENTITY_TOO_LARGE
+   RC_REQUEST_URI_TOO_LARGE
+   RC_UNSUPPORTED_MEDIA_TYPE
+   RC_INTERNAL_SERVER_ERROR
+   RC_NOT_IMPLEMENTED
+   RC_BAD_GATEWAY
+   RC_SERVICE_UNAVAILABLE
+   RC_GATEWAY_TIMEOUT
+   RC_HTTP_VERSION_NOT_SUPPORTED
+
+The HTTP::Status classification functions are:
+
+=over 3
+
+=item is_success($rc)
+
+Check if response code indicated successfull request.
+
+=item is_error($rc)
+
+Check if response code indicated that an error occured.
+
+=back
+
+The module will also export the LWP::UserAgent object as C<$ua> if you
+ask for it explicitly.
+
+The user agent created by this module will identify itself as
+"LWP::Simple/#.##" (where "#.##" is the libwww-perl version number)
+and will initialize its proxy defaults from the environment (by
+calling $ua->env_proxy).
+
+=head1 SEE ALSO
+
+L<LWP>, L<LWP::UserAgent>, L<HTTP::Status>, L<lwp-request>,
+L<lwp-mirror>
+
+=cut
+
+
+package LWP::Simple;
+
+use strict;
+use vars qw($ua %loop_check $FULL_LWP @EXPORT @EXPORT_OK $VERSION);
+
+require Exporter;
+
+@EXPORT = qw(get head getprint getstore mirror);
+@EXPORT_OK = qw($ua);
+
+# I really hate this.  I was a bad idea to do it in the first place.
+# Wonder how to get rid of it???  (It even makes LWP::Simple 7% slower
+# for trivial tests)
+use HTTP::Status;
+push(@EXPORT, @HTTP::Status::EXPORT);
+
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+$FULL_LWP++ if grep {lc($_) eq "http_proxy"} keys %ENV;
+
+
+sub import
+{
+    my $pkg = shift;
+    my $callpkg = caller;
+    if (grep $_ eq '$ua', @_) {
+	$FULL_LWP++;
+	_init_ua();
+    }
+    Exporter::export($pkg, $callpkg, @_);
+}
+
+
+sub _init_ua
+{
+    require LWP;
+    require LWP::UserAgent;
+    require HTTP::Status;
+    require HTTP::Date;
+    $ua = new LWP::UserAgent;  # we create a global UserAgent object
+    my $ver = $LWP::VERSION = $LWP::VERSION;  # avoid warning
+    $ua->agent("LWP::Simple/$LWP::VERSION");
+    $ua->env_proxy;
+}
+
+
+sub get ($)
+{
+    %loop_check = ();
+    goto \&_get;
+}
+
+
+sub get_old ($)
+{
+    my($url) = @_;
+    _init_ua() unless $ua;
+
+    my $request = HTTP::Request->new(GET => $url);
+    my $response = $ua->request($request);
+
+    return $response->content if $response->is_success;
+    return undef;
+}
+
+
+sub head ($)
+{
+    my($url) = @_;
+    _init_ua() unless $ua;
+
+    my $request = HTTP::Request->new(HEAD => $url);
+    my $response = $ua->request($request);
+
+    if ($response->is_success) {
+	return $response unless wantarray;
+	return ($response->header('Content-Type'),
+		$response->header('Content-Length'),
+		HTTP::Date::str2time($response->header('Last-Modified')),
+		HTTP::Date::str2time($response->header('Expires')),
+		$response->header('Server'),
+	       );
+    }
+    return;
+}
+
+
+sub getprint ($)
+{
+    my($url) = @_;
+    _init_ua() unless $ua;
+
+    my $request = HTTP::Request->new(GET => $url);
+    local($\) = ""; # ensure standard $OUTPUT_RECORD_SEPARATOR
+    my $response = $ua->request($request, sub { print $_[0] });
+    unless ($response->is_success) {
+	print STDERR $response->status_line, " <URL:$url>\n";
+    }
+    $response->code;
+}
+
+
+sub getstore ($$)
+{
+    my($url, $file) = @_;
+    _init_ua() unless $ua;
+
+    my $request = HTTP::Request->new(GET => $url);
+    my $response = $ua->request($request, $file);
+
+    $response->code;
+}
+
+
+sub mirror ($$)
+{
+    my($url, $file) = @_;
+    _init_ua() unless $ua;
+    my $response = $ua->mirror($url, $file);
+    $response->code;
+}
+
+
+sub _get
+{
+    my $url = shift;
+    my $ret;
+    if (!$FULL_LWP && $url =~ m,^http://([^/:]+)(?::(\d+))?(/\S*)?$,) {
+	my $host = $1;
+	my $port = $2 || 80;
+	my $path = $3;
+	$path = "/" unless defined($path);
+	return _trivial_http_get($host, $port, $path);
+    } else {
+        _init_ua() unless $ua;
+	my $request = HTTP::Request->new(GET => $url);
+	my $response = $ua->request($request);
+	return $response->is_success ? $response->content : undef;
+    }
+}
+
+
+sub _trivial_http_get
+{
+   my($host, $port, $path) = @_;
+   #print "HOST=$host, PORT=$port, PATH=$path\n";
+
+   require IO::Socket;
+   local($^W) = 0;
+   my $sock = IO::Socket::INET->new(PeerAddr => $host,
+                                    PeerPort => $port,
+                                    Proto    => 'tcp',
+                                    Timeout  => 60) || return;
+   $sock->autoflush;
+   my $netloc = $host;
+   $netloc .= ":$port" if $port != 80;
+   print $sock join("\015\012" =>
+                    "GET $path HTTP/1.0",
+                    "Host: $netloc",
+                    "User-Agent: lwp-trivial/$VERSION",
+                    "", "");
+
+   my $buf = "";
+   my $n;
+   1 while $n = sysread($sock, $buf, 8*1024, length($buf));
+   return undef unless defined($n);
+
+   if ($buf =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
+       my $code = $1;
+       #print "CODE=$code\n$buf\n";
+       if ($code =~ /^30[1237]/ && $buf =~ /\012Location:\s*(\S+)/) {
+           # redirect
+           my $url = $1;
+           return undef if $loop_check{$url}++;
+           return _get($url);
+       }
+       return undef unless $code =~ /^2/;
+       $buf =~ s/.+?\015?\012\015?\012//s;  # zap header
+   }
+
+   return $buf;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/UserAgent.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/UserAgent.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/UserAgent.pm	(revision 21083)
@@ -0,0 +1,732 @@
+# $Id$
+
+package LWP::UserAgent;
+use strict;
+
+=head1 NAME
+
+LWP::UserAgent - A WWW UserAgent class
+
+=head1 SYNOPSIS
+
+ require LWP::UserAgent;
+ $ua = new LWP::UserAgent;
+
+ $request = new HTTP::Request('GET', 'file://localhost/etc/motd');
+
+ $response = $ua->request($request); # or
+ $response = $ua->request($request, '/tmp/sss'); # or
+ $response = $ua->request($request, \&callback, 4096);
+
+ sub callback { my($data, $response, $protocol) = @_; .... }
+
+=head1 DESCRIPTION
+
+The C<LWP::UserAgent> is a class implementing a simple World-Wide Web
+user agent in Perl. It brings together the HTTP::Request,
+HTTP::Response and the LWP::Protocol classes that form the rest of the
+core of libwww-perl library. For simple uses this class can be used
+directly to dispatch WWW requests, alternatively it can be subclassed
+for application-specific behaviour.
+
+In normal usage the application creates a UserAgent object, and then
+configures it with values for timeouts proxies, name, etc. The next
+step is to create an instance of C<HTTP::Request> for the request that
+needs to be performed. This request is then passed to the UserAgent
+request() method, which dispatches it using the relevant protocol,
+and returns a C<HTTP::Response> object.
+
+The basic approach of the library is to use HTTP style communication
+for all protocol schemes, i.e. you will receive an C<HTTP::Response>
+object also for gopher or ftp requests.  In order to achieve even more
+similarities with HTTP style communications, gopher menus and file
+directories will be converted to HTML documents.
+
+The request() method can process the content of the response in one of
+three ways: in core, into a file, or into repeated calls of a
+subroutine.  You choose which one by the kind of value passed as the
+second argument to request().
+
+The in core variant simply returns the content in a scalar attribute
+called content() of the response object, and is suitable for small
+HTML replies that might need further parsing.  This variant is used if
+the second argument is missing (or is undef).
+
+The filename variant requires a scalar containing a filename as the
+second argument to request(), and is suitable for large WWW objects
+which need to be written directly to the file, without requiring large
+amounts of memory. In this case the response object returned from
+request() will have empty content().  If the request fails, then the
+content() might not be empty, and the file will be untouched.
+
+The subroutine variant requires a reference to callback routine as the
+second argument to request() and it can also take an optional chuck
+size as third argument.  This variant can be used to construct
+"pipe-lined" processing, where processing of received chuncks can
+begin before the complete data has arrived.  The callback function is
+called with 3 arguments: the data received this time, a reference to
+the response object and a reference to the protocol object.  The
+response object returned from request() will have empty content().  If
+the request fails, then the the callback routine will not have been
+called, and the response->content() might not be empty.
+
+The request can be aborted by calling die() within the callback
+routine.  The die message will be available as the "X-Died" special
+response header field.
+
+The library also accepts that you put a subroutine reference as
+content in the request object.  This subroutine should return the
+content (possibly in pieces) when called.  It should return an empty
+string when there is no more content.
+
+=head1 METHODS
+
+The following methods are available:
+
+=over 4
+
+=cut
+
+
+use vars qw(@ISA $VERSION);
+
+require LWP::MemberMixin;
+@ISA = qw(LWP::MemberMixin);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+
+require URI::URL;
+require HTTP::Request;
+require HTTP::Response;
+
+use HTTP::Date ();
+
+use LWP ();
+use LWP::Debug ();
+use LWP::Protocol ();
+
+use Carp ();
+
+use AutoLoader ();
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;  # import the AUTOLOAD method
+
+
+=item $ua = new LWP::UserAgent;
+
+Constructor for the UserAgent.  Returns a reference to a
+LWP::UserAgent object.
+
+=cut
+
+sub new
+{
+    my($class, $init) = @_;
+    LWP::Debug::trace('()');
+
+    my $self;
+    if (ref $init) {
+	$self = $init->clone;
+    } else {
+	$self = bless {
+		'agent'       => "libwww-perl/$LWP::VERSION",
+		'from'        => undef,
+		'timeout'     => 3*60,
+		'proxy'       => undef,
+		'cookie_jar'  => undef,
+		'use_eval'    => 1,
+                'parse_head'  => 1,
+                'max_size'    => undef,
+		'no_proxy'    => [],
+	}, $class;
+    }
+}
+
+
+=item $ua->simple_request($request, [$arg [, $size]])
+
+This method dispatches a single WWW request on behalf of a user, and
+returns the response received.  The C<$request> should be a reference
+to a C<HTTP::Request> object with values defined for at least the
+method() and url() attributes.
+
+If C<$arg> is a scalar it is taken as a filename where the content of
+the response is stored.
+
+If C<$arg> is a reference to a subroutine, then this routine is called
+as chunks of the content is received.  An optional C<$size> argument
+is taken as a hint for an appropriate chunk size.
+
+If C<$arg> is omitted, then the content is stored in the response
+object itself.
+
+=cut
+
+sub simple_request
+{
+    my($self, $request, $arg, $size) = @_;
+    local($SIG{__DIE__});  # protect agains user defined die handlers
+
+    my($method, $url) = ($request->method, $request->url);
+
+    # Check that we have a METHOD and a URL first
+    return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST, "Method missing")
+	unless $method;
+    return HTTP::Response->new(&HTTP::Status::RC_BAD_REQUEST, "URL missing")
+	unless $url;
+
+    LWP::Debug::trace("$method $url");
+
+    # Locate protocol to use
+    my $scheme = '';
+    my $proxy = $self->_need_proxy($url);
+    if (defined $proxy) {
+	$scheme = $proxy->scheme;
+    } else {
+	$scheme = $url->scheme;
+    }
+    my $protocol;
+    eval {
+	$protocol = LWP::Protocol::create($scheme);
+    };
+    if ($@) {
+	$@ =~ s/\s+at\s+\S+\s+line\s+\d+\.?\s*//;  # remove file/line number
+	return HTTP::Response->new(&HTTP::Status::RC_NOT_IMPLEMENTED, $@)
+    }
+
+    # Extract fields that will be used below
+    my ($agent, $from, $timeout, $cookie_jar,
+        $use_eval, $parse_head, $max_size) =
+      @{$self}{qw(agent from timeout cookie_jar
+                  use_eval parse_head max_size)};
+
+    # Set User-Agent and From headers if they are defined
+    $request->header('User-Agent' => $agent) if $agent;
+    $request->header('From' => $from) if $from;
+    $cookie_jar->add_cookie_header($request) if $cookie_jar;
+
+    # Transfer some attributes to the protocol object
+    $protocol->parse_head($parse_head);
+    $protocol->max_size($max_size);
+    
+    my $response;
+    if ($use_eval) {
+	# we eval, and turn dies into responses below
+	eval {
+	    $response = $protocol->request($request, $proxy,
+					   $arg, $size, $timeout);
+	};
+	if ($@) {
+	    $@ =~ s/\s+at\s+\S+\s+line\s+\d+\.?\s*//;
+	    $response =
+	      HTTP::Response->new(&HTTP::Status::RC_INTERNAL_SERVER_ERROR,
+				  $@);
+	}
+    } else {
+	$response = $protocol->request($request, $proxy,
+				       $arg, $size, $timeout);
+	# XXX: Should we die unless $response->is_success ???
+    }
+
+    $response->request($request);  # record request for reference
+    $cookie_jar->extract_cookies($response) if $cookie_jar;
+    $response->header("Client-Date" => HTTP::Date::time2str(time));
+    return $response;
+}
+
+
+=item $ua->request($request, $arg [, $size])
+
+Process a request, including redirects and security.  This method may
+actually send several different simple reqeusts.
+
+The arguments are the same as for C<simple_request()>.
+
+=cut
+
+sub request
+{
+    my($self, $request, $arg, $size, $previous) = @_;
+
+    LWP::Debug::trace('()');
+
+    my $response = $self->simple_request($request, $arg, $size);
+
+    my $code = $response->code;
+    $response->previous($previous) if defined $previous;
+
+    LWP::Debug::debug('Simple result: ' . HTTP::Status::status_message($code));
+
+    if ($code == &HTTP::Status::RC_MOVED_PERMANENTLY or
+	$code == &HTTP::Status::RC_MOVED_TEMPORARILY) {
+
+	# Make a copy of the request and initialize it with the new URI
+	my $referral = $request->clone;
+
+	# And then we update the URL based on the Location:-header.
+	# Some servers erroneously return a relative URL for redirects,
+	# so make it absolute if it not already is.
+	my $referral_uri = (URI::URL->new($response->header('Location'),
+					  $response->base))->abs(undef,1);
+
+	$referral->url($referral_uri);
+
+	return $response unless $self->redirect_ok($referral);
+
+	# Check for loop in the redirects
+	my $count = 0;
+	my $r = $response;
+	while ($r) {
+	    if (++$count > 13 ||
+                $r->request->url->as_string eq $referral_uri->as_string) {
+		$response->header("Client-Warning" =>
+				  "Redirect loop detected");
+		return $response;
+	    }
+	    $r = $r->previous;
+	}
+
+	return $self->request($referral, $arg, $size, $response);
+
+    } elsif ($code == &HTTP::Status::RC_UNAUTHORIZED ||
+	     $code == &HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED
+	    )
+    {
+	my $proxy = ($code == &HTTP::Status::RC_PROXY_AUTHENTICATION_REQUIRED);
+	my $ch_header = $proxy ?  "Proxy-Authenticate" : "WWW-Authenticate";
+	my $challenge = $response->header($ch_header);
+	unless (defined $challenge) {
+	    $response->header("Client-Warning" => 
+			      "Missing Authenticate header");
+	    return $response;
+	}
+
+	require HTTP::Headers::Util;
+	$challenge =~ tr/,/;/;  # "," is used to separate auth-params!!
+	($challenge) = HTTP::Headers::Util::split_header_words($challenge);
+	my $scheme = lc(shift(@$challenge));
+	shift(@$challenge); # no value
+	$challenge = { @$challenge };  # make rest into a hash
+	for (keys %$challenge) {       # make sure all keys are lower case
+	    $challenge->{lc $_} = delete $challenge->{$_};
+	}
+
+	unless ($scheme =~ /^([a-z]+(?:-[a-z]+)*)$/) {
+	    $response->header("Client-Warning" => 
+			      "Bad authentication scheme '$scheme'");
+	    return $response;
+	}
+	$scheme = $1;  # untainted now
+	my $class = "LWP::Authen::\u$scheme";
+	$class =~ s/-/_/g;
+	
+	no strict 'refs';
+	unless (defined %{"$class\::"}) {
+	    # try to load it
+	    eval "require $class";
+	    if ($@) {
+		if ($@ =~ /^Can\'t locate/) {
+		    $response->header("Client-Warning" =>
+				      "Unsupport authentication scheme '$scheme'");
+		} else {
+		    $response->header("Client-Warning" => $@);
+		}
+		return $response;
+	    }
+	}
+	return $class->authenticate($self, $proxy, $challenge, $response,
+				    $request, $arg, $size);
+    }
+    return $response;
+}
+
+
+=item $ua->redirect_ok
+
+This method is called by request() before it tries to do any
+redirects.  It should return a true value if the redirect is allowed
+to be performed. Subclasses might want to override this.
+
+The default implementation will return FALSE for POST request and TRUE
+for all others.
+
+=cut
+
+sub redirect_ok
+{
+    # draft-ietf-http-v10-spec-02.ps from www.ics.uci.edu, specify:
+    #
+    # If the 30[12] status code is received in response to a request using
+    # the POST method, the user agent must not automatically redirect the
+    # request unless it can be confirmed by the user, since this might change
+    # the conditions under which the request was issued.
+
+    my($self, $request) = @_;
+    return 0 if $request->method eq "POST";
+    1;
+}
+
+
+=item $ua->credentials($netloc, $realm, $uname, $pass)
+
+Set the user name and password to be used for a realm.  It is often more
+useful to specialize the get_basic_credentials() method instead.
+
+=cut
+
+sub credentials
+{
+    my($self, $netloc, $realm, $uid, $pass) = @_;
+    @{ $self->{'basic_authentication'}{$netloc}{$realm} } = ($uid, $pass);
+}
+
+
+=item $ua->get_basic_credentials($realm, $uri, [$proxy])
+
+This is called by request() to retrieve credentials for a Realm
+protected by Basic Authentication or Digest Authentication.
+
+Should return username and password in a list.  Return undef to abort
+the authentication resolution atempts.
+
+This implementation simply checks a set of pre-stored member
+variables. Subclasses can override this method to e.g. ask the user
+for a username/password.  An example of this can be found in
+C<lwp-request> program distributed with this library.
+
+=cut
+
+sub get_basic_credentials
+{
+    my($self, $realm, $uri, $proxy) = @_;
+    return if $proxy;
+
+    my $netloc = $uri->netloc;
+    if (exists $self->{'basic_authentication'}{$netloc}{$realm}) {
+	return @{ $self->{'basic_authentication'}{$netloc}{$realm} };
+    }
+
+    return (undef, undef);
+}
+
+
+=item $ua->agent([$product_id])
+
+Get/set the product token that is used to identify the user agent on
+the network.  The agent value is sent as the "User-Agent" header in
+the requests. The default agent name is "libwww-perl/#.##", where
+"#.##" is substitued with the version numer of this library.
+
+The user agent string should be one or more simple product identifiers
+with an optional version number separated by the "/" character.
+Examples are:
+
+  $ua->agent('Checkbot/0.4 ' . $ua->agent);
+  $ua->agent('Mozilla/5.0');
+
+=item $ua->from([$email_address])
+
+Get/set the Internet e-mail address for the human user who controls
+the requesting user agent.  The address should be machine-usable, as
+defined in RFC 822.  The from value is send as the "From" header in
+the requests.  There is no default.  Example:
+
+  $ua->from('aas@sn.no');
+
+=item $ua->timeout([$secs])
+
+Get/set the timeout value in seconds. The default timeout() value is
+180 seconds, i.e. 3 minutes.
+
+=item $ua->cookie_jar([$cookies])
+
+Get/set the I<HTTP::Cookies> object to use.  The default is to have no
+cookie_jar, i.e. never automatically add "Cookie" headers to the
+requests.
+
+=item $ua->parse_head([$boolean])
+
+Get/set a value indicating wether we should initialize response
+headers from the E<lt>head> section of HTML documents. The default is
+TRUE.  Do not turn this off, unless you know what you are doing.
+
+=item $ua->max_size([$bytes])
+
+Get/set the size limit for response content.  The default is undef,
+which means that there is not limit.  If the returned response content
+is only partial, because the size limit was exceeded, then a
+"X-Content-Range" header will be added to the response.
+
+=cut
+
+sub timeout    { shift->_elem('timeout',   @_); }
+sub agent      { shift->_elem('agent',     @_); }
+sub from       { shift->_elem('from',      @_); }
+sub cookie_jar { shift->_elem('cookie_jar',@_); }
+sub parse_head { shift->_elem('parse_head',@_); }
+sub max_size   { shift->_elem('max_size',  @_); }
+
+# depreciated
+sub use_eval   { shift->_elem('use_eval',  @_); }
+sub use_alarm
+{
+    Carp::carp("LWP::UserAgent->use_alarm(BOOL) is a no-op")
+	if @_ > 1 && $^W;
+    "";
+}
+
+
+# Declarations of AutoLoaded methods
+sub clone;
+sub is_protocol_supported;
+sub mirror;
+sub proxy;
+sub env_proxy;
+sub no_proxy;
+sub _need_proxy;
+
+
+1;
+__END__
+
+
+=item $ua->clone;
+
+Returns a copy of the LWP::UserAgent object
+
+=cut
+
+
+sub clone
+{
+    my $self = shift;
+    my $copy = bless { %$self }, ref $self;  # copy most fields
+
+    # elements that are references must be handled in a special way
+    $copy->{'no_proxy'} = [ @{$self->{'no_proxy'}} ];  # copy array
+
+    $copy;
+}
+
+
+=item $ua->is_protocol_supported($scheme)
+
+You can use this method to query if the library currently support the
+specified C<scheme>.  The C<scheme> might be a string (like 'http' or
+'ftp') or it might be an URI::URL object reference.
+
+=cut
+
+sub is_protocol_supported
+{
+    my($self, $scheme) = @_;
+    if (ref $scheme) {
+	# assume we got a reference to an URI::URL object
+	$scheme = $scheme->abs->scheme;
+    } else {
+	Carp::croak("Illeal scheme '$scheme' passed to is_protocol_supported")
+	    if $scheme =~ /\W/;
+	$scheme = lc $scheme;
+    }
+    return LWP::Protocol::implementor($scheme);
+}
+
+
+=item $ua->mirror($url, $file)
+
+Get and store a document identified by a URL, using If-Modified-Since,
+and checking of the Content-Length.  Returns a reference to the
+response object.
+
+=cut
+
+sub mirror
+{
+    my($self, $url, $file) = @_;
+
+    LWP::Debug::trace('()');
+    my $request = new HTTP::Request('GET', $url);
+
+    if (-e $file) {
+	my($mtime) = (stat($file))[9];
+	if($mtime) {
+	    $request->header('If-Modified-Since' =>
+			     HTTP::Date::time2str($mtime));
+	}
+    }
+    my $tmpfile = "$file-$$";
+
+    my $response = $self->request($request, $tmpfile);
+    if ($response->is_success) {
+
+	my $file_length = (stat($tmpfile))[7];
+	my($content_length) = $response->header('Content-length');
+
+	if (defined $content_length and $file_length < $content_length) {
+	    unlink($tmpfile);
+	    die "Transfer truncated: " .
+		"only $file_length out of $content_length bytes received\n";
+	} elsif (defined $content_length and $file_length > $content_length) {
+	    unlink($tmpfile);
+	    die "Content-length mismatch: " .
+		"expected $content_length bytes, got $file_length\n";
+	} else {
+	    # OK
+	    if (-e $file) {
+		# Some dosish systems fail to rename if the target exists
+		chmod 0777, $file;
+		unlink $file;
+	    }
+	    rename($tmpfile, $file) or
+		die "Cannot rename '$tmpfile' to '$file': $!\n";
+
+	    if (my $lm = $response->last_modified) {
+		# make sure the file has the same last modification time
+		utime $lm, $lm, $file;
+	    }
+	}
+    } else {
+	unlink($tmpfile);
+    }
+    return $response;
+}
+
+=item $ua->proxy(...)
+
+Set/retrieve proxy URL for a scheme:
+
+ $ua->proxy(['http', 'ftp'], 'http://proxy.sn.no:8001/');
+ $ua->proxy('gopher', 'http://proxy.sn.no:8001/');
+
+The first form specifies that the URL is to be used for proxying of
+access methods listed in the list in the first method argument,
+i.e. 'http' and 'ftp'.
+
+The second form shows a shorthand form for specifying
+proxy URL for a single access scheme.
+
+=cut
+
+sub proxy
+{
+    my($self, $key, $proxy) = @_;
+
+    LWP::Debug::trace("$key, $proxy");
+
+    if (!ref($key)) {   # single scalar passed
+	my $old = $self->{'proxy'}{$key};
+	$self->{'proxy'}{$key} = $proxy;
+	return $old;
+    } elsif (ref($key) eq 'ARRAY') {
+	for(@$key) {    # array passed
+	    $self->{'proxy'}{$_} = $proxy;
+	}
+    }
+    return undef;
+}
+
+=item $ua->env_proxy()
+
+Load proxy settings from *_proxy environment variables.  You might
+specify proxies like this (sh-syntax):
+
+  gopher_proxy=http://proxy.my.place/
+  wais_proxy=http://proxy.my.place/
+  no_proxy="my.place"
+  export gopher_proxy wais_proxy no_proxy
+
+Csh or tcsh users should use the C<setenv> command to define these
+envirionment variables.
+
+=cut
+
+sub env_proxy {
+    my ($self) = @_;
+    my($k,$v);
+    while(($k, $v) = each %ENV) {
+	$k = lc($k);
+	next unless $k =~ /^(.*)_proxy$/;
+	$k = $1;
+	if ($k eq 'no') {
+	    $self->no_proxy(split(/\s*,\s*/, $v));
+	}
+	else {
+	    $self->proxy($k, $v);
+	}
+    }
+}
+
+=item $ua->no_proxy($domain,...)
+
+Do not proxy requests to the given domains.  Calling no_proxy without
+any domains clears the list of domains. Eg:
+
+ $ua->no_proxy('localhost', 'no', ...);
+
+=cut
+
+sub no_proxy {
+    my($self, @no) = @_;
+    if (@no) {
+	push(@{ $self->{'no_proxy'} }, @no);
+    }
+    else {
+	$self->{'no_proxy'} = [];
+    }
+}
+
+
+# Private method which returns the URL of the Proxy configured for this
+# URL, or undefined if none is configured.
+sub _need_proxy
+{
+    my($self, $url) = @_;
+
+    $url = new URI::URL($url) unless ref $url;
+
+    LWP::Debug::trace("($url)");
+
+    # check the list of noproxies
+
+    if (@{ $self->{'no_proxy'} }) {
+	my $host = $url->host;
+	return undef unless defined $host;
+	my $domain;
+	for $domain (@{ $self->{'no_proxy'} }) {
+	    if ($host =~ /$domain$/) {
+		LWP::Debug::trace("no_proxy configured");
+		return undef;
+	    }
+	}
+    }
+
+    # Currently configured per scheme.
+    # Eventually want finer granularity
+
+    my $scheme = $url->scheme;
+    if (exists $self->{'proxy'}{$scheme}) {
+
+	LWP::Debug::debug('Proxied');
+	return new URI::URL($self->{'proxy'}{$scheme});
+    }
+
+    LWP::Debug::debug('Not proxied');
+    undef;
+}
+
+1;
+
+=back
+
+=head1 SEE ALSO
+
+See L<LWP> for a complete overview of libwww-perl5.  See F<lwp-request> and
+F<lwp-mirror> for examples of usage.
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/media.types
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/media.types	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/LWP/media.types	(revision 21083)
@@ -0,0 +1,120 @@
+# $Id$
+#
+# This file defines the mapping from file name extentions to media types.
+# Media types where the subtype does not have the "x-" prefix should be
+# registered by IANA:
+#
+#   ftp://www.isi.edu/in-notes/iana/assignments/media-types/
+#
+# See also: RFC-1590
+
+# Text formats
+text/html			html htm
+text/plain			txt text pm el c h cc hh cxx hxx f90
+text/richtext			rtx
+text/tab-separated-values	tsv
+
+text/x-setext			etx
+text/x-pod			pod			# Perl documentation
+
+# Image formats
+image/png			png
+image/gif			gif			# Compuserve
+image/ief			ief
+image/jpeg			jpeg jpg jpe jfif
+image/tiff			tiff tif
+
+image/x-cmu-raster		ras
+image/x-portable-anymap		pnm
+image/x-portable-bitmap		pbm
+image/x-portable-graymap	pgm
+image/x-portable-pixmap		ppm
+image/x-rgb			rgb			# SGI IRIS
+image/x-xbitmap			xbm			# X Windows
+image/x-xpixmap			xpm			# X Windows
+image/x-xwindowdump		xwd			# X Windows
+image/x-bmp			bmp			# MS Windows
+image/x-targa			tga
+image/x-fits			fts
+
+
+# Audio formats
+audio/basic			au snd
+audio/x-aiff			aif aiff aifc
+audio/x-wav			wav			# MS Windows
+audio/x-mpeg-2			mp2			# MPEG layer 2 audio
+
+# Video formats
+video/mpeg			mpeg mpg mpe
+video/quicktime			qt
+video/x-msvideo			avi
+video/x-sgi-movie		mov
+
+# Message
+message/rfc822			mail
+message/partial
+message/external-body
+message/news			art
+
+# Applications
+application/octet-stream	bin
+application/postscript		ai eps ps
+application/oda			oda
+application/atomicmail
+application/andrew-insert
+application/slate
+application/wita
+application/dec-dx
+application/dca-rtf
+application/activemessage
+application/rtf			rft			# MS Word
+application/applefile
+application/mac-binhex40	hqx
+application/news-message-id
+application/news-transmission
+application/wordperfect5.1
+application/pdf			pdf
+application/zip			zip
+application/macwriteii
+application/msword
+application/remote-printing
+application/mathematica
+application/cybercash
+application/commonground
+application/iges
+application/riscos
+application/eshop
+
+application/x-mif		mif			# FrameMaker
+application/x-maker		fm
+application/x-csh		csh
+application/x-dvi		dvi
+application/x-hdf		hdf
+application/x-latex		latex
+application/x-netcdf		nc cdf
+application/x-sh		sh
+application/x-tcl		tcl
+application/x-perl		pl
+application/x-tex		tex
+application/x-texinfo		texinfo texi
+application/x-troff		t tr roff
+application/x-troff-man		man 1 2 3 4 5 6 7 8
+application/x-troff-me		me
+application/x-troff-ms		ms
+application/x-wais-source	src
+application/x-bcpio		bcpio
+application/x-cpio		cpio
+application/x-gtar		gtar			# GNU tar
+application/x-shar		shar
+application/x-sv4cpio		sv4cpio
+application/x-sv4crc		sv4crc
+application/x-tar		tar
+application/x-ustar		ustar
+
+# Multipart
+multipart/mixed
+multipart/alternative
+multipart/digest
+multipart/parallel
+multipart/appledouble
+multipart/header-set
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Escape.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Escape.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Escape.pm	(revision 21083)
@@ -0,0 +1,119 @@
+#
+# $Id$
+#
+
+package URI::Escape;
+use strict;
+
+=head1 NAME
+
+URI::Escape - Escape and unescape unsafe characters
+
+=head1 SYNOPSIS
+
+ use URI::Escape;
+ $safe = uri_escape("10% is enough\n");
+ $verysafe = uri_escape("foo", "\0-\377");
+ $str  = uri_unescape($safe);
+
+=head1 DESCRIPTION
+
+This module provide functions to escape and unescape URI strings.
+Some characters are regarded as "unsafe" and must be escaped in
+accordance with RFC 1738.  Escaped characters are represented by a
+triplet consisting of the character "%" followed by two hexadecimal
+digits.  The following functions are provided (and exported by
+default):
+
+=over 4
+
+=item uri_escape($string, [$unsafe])
+
+This function replaces all unsafe characters in the $string with their
+escape sequence and return the result.
+
+The uri_escape() function takes an optional second argument that
+overrides the set of characters that are to be escaped.  The set is
+specified as a string that can be used in a regular expression
+character class (between [ ]).  E.g.:
+
+  \x00-\x1f\x7f-\xff          # all control and hi-bit characters
+  a-z                         # all lower case characters
+  ^A-Za-z                     # everything not a letter
+
+The default set of characters to be escaped is:
+
+  \x00-\x20"#%;<>?{}|\\^~`\[\]\x7F-\xFF
+
+=item uri_unescape($string)
+
+Returns a string with all %XX sequences replaced with the actual
+character.
+
+=back
+
+The module can also export the %escapes hash which contains the
+mapping from all characters to the corresponding escape code.
+
+=head1 SEE ALSO
+
+L<URI::URL>
+
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION);
+use vars qw(%escapes);
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(uri_escape uri_unescape);
+@EXPORT_OK = qw(%escapes);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use Carp ();
+
+# Build a char->hex map
+for (0..255) {
+    $escapes{chr($_)} = sprintf("%%%02X", $_);
+}
+
+my %subst;  # compiled patternes
+
+sub uri_escape
+{
+    my($text, $patn) = @_;
+    return undef unless defined $text;
+    if (defined $patn){
+	unless (exists  $subst{$patn}) {
+	    # Because we can't compile regex we fake it with a cached sub
+	    $subst{$patn} =
+	      eval "sub {\$_[0] =~ s/([$patn])/\$escapes{\$1}/g; }";
+	    Carp::croak("uri_escape: $@") if $@;
+	}
+	&{$subst{$patn}}($text);
+    } else {
+	# Default unsafe characters. (RFC1738 section 2.2)
+	$text =~ s/([\x00-\x20\"#%;<>?{}|\\^~`\[\]\x7F-\xFF])/$escapes{$1}/g;
+    }
+    $text;
+}
+
+sub uri_unescape
+{
+    # Note from RFC1630:  "Sequences which start with a percent sign
+    # but are not followed by two hexadecimal characters are reserved
+    # for future extension"
+    my @copy = @_;
+    for (@copy) { s/%([\dA-Fa-f]{2})/chr(hex($1))/eg; }
+    wantarray ? @copy : $copy[0];
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Heuristic.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Heuristic.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/Heuristic.pm	(revision 21083)
@@ -0,0 +1,191 @@
+package URI::Heuristic;
+
+# $Id$
+
+=head1 NAME
+
+uf_urlstr - Expand URL using heuristics
+
+=head1 SYNOPSIS
+
+ use URI::Heuristic qw(uf_urlstr);
+ $url = uf_urlstr("perl");             # http://www.perl.com
+ $url = uf_urlstr("www.sol.no/sol");   # http://www.sol.no/sol
+ $url = uf_urlstr("aas");              # http://www.aas.no
+ $url = uf_urlstr("ftp.funet.fi");     # ftp://ftp.funet.fi
+ $url = uf_urlstr("/etc/passwd");      # file:/etc/passwd
+
+=head1 DESCRIPTION
+
+This module provide functions that expand strings into real absolute
+URLs using some builtin heuristics.  Strings that already represent
+absolute URLs (i.e. start with a C<scheme:> part) are never modified
+and are returned unchanged.  The main use of these functions are to
+allow abbreviated URLs similar to what many web browsers allow for URLs
+typed in by the user.
+
+The following functions are provided:
+
+=over 4
+
+=item uf_urlstr($str)
+
+The uf_urlstr() function will try to make the string passed as
+argument into a proper absolute URL string.  The "uf_" prefix stands
+for "User Friendly".
+
+=item uf_url($str)
+
+This functions work the same way as uf_urlstr() but it will
+return a C<URI::URL> object.
+
+=back
+
+=head1 ENVIRONMENT
+
+If the hostname portion of a URL does not contain any dots, then
+certain qualified guesses will be made.  These guesses are governed be
+the following two environment variables.
+
+=over 10
+
+=item COUNTRY
+
+This is the two letter country code (ISO 3166) for your location.  If
+the domain name of your host ends with two letters, then it is taken
+to be the default country. See also L<Locale::Country>.
+
+=item URL_GUESS_PATTERN
+
+Contain a space separated list of URL patterns to try.  The string
+"ACME" is for some reason used as a placeholder for the host name in
+the URL provided.  Example:
+
+ URL_GUESS_PATTERN="www.ACME.no www.ACME.se www.ACME.com"
+ export URL_GUESS_PATTERN
+
+Specifying URL_GUESS_PATTERN disables any guessing rules based on
+country.  An empty URL_GUESS_PATTERN disables any guessing that
+involves host name lookups.
+
+=back
+
+=head1 COPYRIGHT
+
+Copyright 1997-1998, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
+
+use strict;
+
+use vars qw(@EXPORT_OK $VERSION $MY_COUNTRY %LOCAL_GUESSING $DEBUG);
+
+require Exporter;
+*import = \&Exporter::import;
+@EXPORT_OK = qw(uf_url uf_urlstr);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+eval {
+    require Net::Domain;
+    my $fqdn = Net::Domain::hostfqdn();
+    $MY_COUNTRY = lc($1) if $fqdn =~ /\.([a-zA-Z]{2})$/;
+
+    # Some other heuristics to guess country?  Perhaps looking
+    # at some environment variable (LANG, LC_ALL, ???)
+    $MY_COUNTRY = $ENV{COUNTRY} if exists $ENV{COUNTRY};
+};
+
+%LOCAL_GUESSING =
+(
+ 'us' => [qw(www.ACME.gov www.ACME.mil)],
+ 'uk' => [qw(www.ACME.co.uk www.ACME.org.uk www.ACME.ac.uk)],
+ 'au' => [qw(www.ACME.com.au www.ACME.org.au www.ACME.edu.au)],
+ 'il' => [qw(www.ACME.co.il www.ACME.org.il www.ACME.net.il)],
+ # send corrections and new entries to <aas@sn.no>
+);
+
+
+sub uf_url ($)
+{
+    require URI::URL;
+    URI::URL->new(uf_urlstr($_[0]));
+}
+
+
+sub uf_urlstr ($)
+{
+    local($_) = @_;
+    print STDERR "uf_urlstr: resolving $_\n" if $DEBUG;
+    return unless defined;
+
+    s/^\s+//;
+    s/\s+$//;
+
+    if (/^(www|web|home)\./) {
+	$_ = "http://$_";
+
+    } elsif (/^(ftp|gopher|news|wais|http|https)\./) {
+	$_ = "$1://$_";
+
+    } elsif (m,^/,      ||          # absolute file name
+	     m,^\.\.?/, ||          # relative file name
+	     m,^[a-zA-Z]:[/\\],)    # dosish file name
+    {
+	$_ = "file:$_";
+
+    } elsif (/^\w+([\.\-]\w+)*\@(\w+\.)+\w{2,3}$/) {
+	$_ = "mailto:$_";
+
+    } elsif (!/^[.+\-\w]+:/) {      # no scheme specified
+	if (s/^(\w+(?:\.\w+)*)([\/:\?\#]|$)/$2/) {
+	    my $host = $1;
+
+	    if ($host !~ /\./ && $host ne "localhost") {
+		my @guess;
+		if (exists $ENV{URL_GUESS_PATTERN}) {
+		    @guess = map { s/\bACME\b/$host/; $_ }
+		             split(' ', $ENV{URL_GUESS_PATTERN});
+		} else {
+		    if ($MY_COUNTRY) {
+			my $special = $LOCAL_GUESSING{$MY_COUNTRY};
+			if ($special) {
+			    my @special = @$special;
+			    push(@guess, map { s/\bACME\b/$host/; $_ }
+                                               @special);
+			} else {
+			    push(@guess, "www.$host.$MY_COUNTRY");
+			}
+		    }
+		    push(@guess, map "www.$host.$_",
+			             "com", "org", "net", "edu", "int");
+		}
+
+
+		my $guess;
+		for $guess (@guess) {
+		    print STDERR "uf_urlstr: gethostbyname('$guess')..."
+		      if $DEBUG;
+		    if (gethostbyname($guess)) {
+			print STDERR "yes\n" if $DEBUG;
+			$host = $guess;
+			last;
+		    }
+		    print STDERR "no\n" if $DEBUG;
+		}
+	    }
+	    $_ = "http://$host$_";
+
+	} else {
+	    # pure junk, just return it unchanged...
+
+	}
+    }
+    print STDERR "uf_urlstr: ==> $_\n" if $DEBUG;
+
+    $_;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL.pm	(revision 21083)
@@ -0,0 +1,949 @@
+package URI::URL;
+
+$VERSION = "4.15";   # $Date$
+sub Version { $VERSION; }
+
+require 5.004;
+
+require Exporter;
+@ISA = qw(Exporter);
+@EXPORT = qw(url);
+
+require AutoLoader;
+*AUTOLOAD = \&AutoLoader::AUTOLOAD;
+
+use Carp ();
+
+# Basic lexical elements, taken from RFC 1738:
+#
+#  safe         = "$" | "-" | "_" | "." | "+"
+#  extra        = "!" | "*" | "'" | "(" | ")" | ","
+#  national     = "{" | "}" | "|" | "\" | "^" | "~" | "[" | "]" | "`"
+#  punctuation  = "<" | ">" | "#" | "%" | <">
+#  reserved     = ";" | "/" | "?" | ":" | "@" | "&" | "="
+#  escape       = "%" hex hex
+#  unreserved   = alpha | digit | safe | extra
+#  uchar        = unreserved | escape
+#  xchar        = unreserved | reserved | escape
+
+# draft-fielding-url-syntax-05.txt adds '+' to the reserved chars and
+# takes '~' out
+
+use strict;
+use vars qw($reserved $reserved_no_slash $reserved_no_form $unsafe
+	    $Debug $Strict_URL
+	   );
+
+$reserved          = ";\\/?:\\@&=+#%"; # RFC 1738 reserved pluss '#' and '%'
+$reserved_no_slash = ";?:\\@&=+#%";    # used when escaping path
+$reserved_no_form  = ";\\/?:\\@#%";    # used when escaping params and query
+
+# This is the unsafe characters (excluding those reserved)
+$unsafe   = "\x00-\x20{}|\\\\^\\[\\]`<>\"\x7F-\xFF";
+#$unsafe .= "~";  # according to RFC1738 but not to common practice
+
+$Debug         = 0;     # set to 1 to print URLs on creation
+$Strict_URL    = 0;     # see new()
+
+use overload ( '""' => 'as_string', 'fallback' => 1 );
+
+my %Implementor = (); # mapping from scheme to implementation class
+
+
+# Easy to use constructor
+sub url ($;$)
+{
+    URI::URL->new(@_);
+}
+
+
+# URI::URL objects are implemented as blessed hashes:
+#
+# Each of the URL components (scheme, netloc, user, password, host,
+# port, path, params, query, fragment) are stored under their
+# name. The netloc, path, params and query is stored in quoted
+# (escaped) form.  The others is stored unquoted (unescaped).
+#
+# Netloc is special since it is rendundant (same as
+# "user:password@host:port") and must be kept in sync with those.
+#
+# The '_str' key stores a cached stringified version of the URL
+# (by definition in quoted form).
+# The '_base' key stores the optional base of a relative URL.
+#
+# The '_orig_url' is used while debugging is on.
+#
+# Subclasses may add their own keys but must take great care to
+# avoid names which might be used in later verions of this module.
+
+sub new
+{
+    my($class, $init, $base) = @_;
+
+    my $self;
+    if (ref $init) {
+	$self = $init->clone;
+	$self->base($base) if $base;
+    } else {
+	$init = "" unless defined $init;
+	# RFC 1738 appendix suggest that we just ignore extra whitespace
+	$init =~ s/\s+//g;
+	# Also get rid of any <URL: > wrapper
+	$init =~ s/^<(?:URL:)?(.*)>$/$1/;
+
+	# We need a scheme to determine which class to use
+	my($scheme) = $init =~ m/^([.+\-\w]+):/;
+	if (!$scheme and $base){ # get scheme from base
+	    if (ref $base){ # may be object or just a string
+		$scheme = $base->scheme;
+	    } else {
+		$scheme = $1 if $base =~ m/^([.+\-\w]+):/;
+	    }
+	}
+	unless($scheme){
+	    Carp::croak("Unable to determine scheme for '$init'")
+		if $Strict_URL;
+	    $scheme = 'http';
+	}
+	my $impclass = URI::URL::implementor($scheme);
+	unless ($impclass) {
+	    Carp::croak("URI::URL scheme '$scheme' is not supported")
+		if $Strict_URL;
+	    # use generic as fallback
+	    require URI::URL::_generic;
+	    URI::URL::implementor($scheme, 'URI::URL::_generic');
+	    $impclass = 'URI::URL::_generic';
+	}
+
+	# hand-off to scheme specific implementation sub-class
+	$self->{'_orig_url'} = $init if $Debug;
+	$self = $impclass->new($init, $base);
+    }
+    $self->print_on('STDERR') if $Debug;
+    return $self;
+}
+
+
+sub clone
+{
+    my $self = shift;
+    # this work as long as none of the components are references themselves
+    bless { %$self }, ref $self;
+}
+
+
+sub implementor
+{
+    my($scheme, $impclass) = @_;
+    unless (defined $scheme) {
+	require URI::URL::_generic;
+	return 'URI::URL::_generic';
+    }
+
+    $scheme = lc($scheme);
+    if ($impclass) {
+	$impclass->_init_implementor($scheme);
+	my $old = $Implementor{$scheme};
+	$Implementor{$scheme} = $impclass;
+	return $old;
+    }
+
+    my $ic = $Implementor{$scheme};
+    return $ic if $ic;
+
+    # scheme not yet known, look for internal or
+    # preloaded (with 'use') implementation
+    $ic = "URI::URL::$scheme";  # default location
+    no strict 'refs';
+    # check we actually have one for the scheme:
+    unless (defined @{"${ic}::ISA"}) {
+	# Try to load it
+	eval { require "URI/URL/$scheme.pm"; };
+	die $@ if $@ && $@ !~ /Can\'t locate/;
+	$ic = '' unless defined @{"${ic}::ISA"};
+    }
+    if ($ic) {
+	$ic->_init_implementor($scheme);
+	$Implementor{$scheme} = $ic;
+    }
+    $ic;
+}
+
+
+sub _init_implementor
+{
+    my($class, $scheme) = @_;
+    # Remember that one implementor class may actually
+    # serve to implement several URL schemes.
+
+    if ($] < 5.003_17) {
+	no strict qw(refs);
+	# Setup overloading inheritace - experimental
+	%{"${class}::OVERLOAD"} = %URI::URL::OVERLOAD
+	    unless defined %{"${class}::OVERLOAD"};
+    }
+}
+
+
+# This private method help us implement access to the elements in the
+# URI::URL object hash (%$self).  You can set up access to an element
+# with a routine similar to this one:
+#
+#  sub component { shift->_elem('component', @_); }
+
+sub _elem
+{
+    my $self = shift;
+    my $elem = shift;
+    my $old = $self->{$elem};
+    if (@_) {
+	$self->{$elem} = shift;
+	$self->{'_str'} = '';        # void cached string
+    }
+    $old;
+}
+
+
+# Make all standard methods available to all kinds of URLs.  This allow
+# us to call these without to much worry when URI::URL::strict(0);
+
+sub bad_method;
+
+*netloc       = \&bad_method;
+*user         = \&bad_method;
+*password     = \&bad_method;
+*host         = \&bad_method;
+*port         = \&bad_method;
+*default_port = \&bad_method;
+
+*full_path    = \&bad_method;
+*epath        = \&bad_method;
+*eparams      = \&bad_method;
+*equery       = \&bad_method;
+
+*path         = \&bad_method;
+*path_components = \&bad_method;
+*params       = \&bad_method;
+*query        = \&bad_method;
+*frag         = \&bad_method;
+
+
+#
+# A U T O  L O A D I N G
+#
+# The rest of the methods are autoloaded because they should be less
+# frequently used.  We define stubs here so that inheritance works as
+# it should.
+sub newlocal;
+sub strict;
+sub base;
+sub scheme;
+sub crack;
+sub abs;
+sub rel;
+sub as_string;
+sub eq;
+sub print_on;
+
+# Don't need DESTROY but avoid trying to AUTOLOAD it.
+sub DESTROY { }
+
+1;
+__END__
+
+sub newlocal
+{
+    require URI::URL::file;
+    my $class = shift;
+    URI::URL::file->newlocal(@_);  # pass it on the the file class
+}
+
+sub strict
+{
+    return $Strict_URL unless @_;
+    my $old = $Strict_URL;
+    $Strict_URL = $_[0];
+    $old;
+}
+
+# Access some attributes of a URL object:
+sub base {
+    my $self = shift;
+    my $base  = $self->{'_base'};
+
+    if (@_) { # set
+	my $new_base = shift;
+	$new_base = $new_base->abs if ref($new_base);  # unsure absoluteness
+	$self->{_base} = $new_base;
+    }
+    return unless defined wantarray;
+
+    # The base attribute supports 'lazy' conversion from URL strings
+    # to URL objects. Strings may be stored but when a string is
+    # fetched it will automatically be converted to a URL object.
+    # The main benefit is to make it much cheaper to say:
+    #   new URI::URL $random_url_string, 'http:'
+    if (defined($base) && !ref($base)) {
+	$base = new URI::URL $base;
+	$self->_elem('_base', $base); # set new object
+    }
+    $base;
+}
+
+sub scheme {
+    my $self = shift;
+    my $old = $self->{'scheme'};
+    if (@_) {
+	my $new_scheme = shift;
+	if (defined($new_scheme) && length($new_scheme)) {
+	    # reparse URL with new scheme
+	    my $str = $self->as_string;
+	    $str =~ s/^[\w+\-.]+://;
+	    my $newself = new URI::URL "$new_scheme:$str";
+	    %$self = %$newself;
+	    bless $self, ref($newself);
+	} else {
+	    $self->{'scheme'} = undef;
+	}
+    }
+    $old;
+}
+
+sub crack
+{
+    # should be overridden by subclasses
+    my $self = shift;
+    ($self->scheme,  # 0: scheme
+     undef,          # 1: user
+     undef,          # 2: passwd
+     undef,          # 3: host
+     undef,          # 4: port
+     undef,          # 5: path
+     undef,          # 6: params
+     undef,          # 7: query
+     undef           # 8: fragment
+    )
+}
+
+# These are overridden by _generic (this is just a noop for those schemes that
+# do not wish to be a subclass of URI::URL::_generic)
+sub abs { shift->clone; }
+sub rel { shift->clone; }
+
+# This method should always be overridden in subclasses
+sub as_string {
+    "<URL>";
+}
+
+# Compare two URLs, subclasses will provide a more correct implementation
+sub eq {
+    my($self, $other) = @_;
+    $other = URI::URL->new($other, $self) unless ref $other;
+    ref($self) eq ref($other) &&
+      $self->scheme eq $other->scheme &&
+      $self->as_string eq $other->as_string;  # Case-sensitive
+}
+
+# This is set up as an alias for various methods
+sub bad_method {
+    my $self = shift;
+    my $scheme = $self->scheme;
+    Carp::croak("Illegal method called for $scheme: URL")
+	if $Strict_URL;
+    # Carp::carp("Illegal method called for $scheme: URL")
+    #     if $^W;
+    undef;
+}
+
+sub print_on
+{
+    no strict qw(refs);  # because we use strings as filehandles
+    my $self = shift;
+    my $fh = shift || 'STDERR';
+    my($k, $v);
+    print $fh "Dump of URI::URL $self...\n";
+    foreach $k (sort keys %$self){
+	$v = $self->{$k};
+	$v = 'UNDEF' unless defined $v;
+	print $fh "  $k\t'$v'\n";
+    }
+}
+
+1;
+
+
+#########################################################################
+#### D O C U M E N T A T I O N
+#########################################################################
+
+=head1 NAME
+
+URI::URL - Uniform Resource Locators (absolute and relative)
+
+=head1 SYNOPSIS
+
+ use URI::URL;
+
+ # Constructors
+ $url1 = new URI::URL 'http://www.perl.com/%7Euser/gisle.gif';
+ $url2 = new URI::URL 'gisle.gif', 'http://www.com/%7Euser';
+ $url3 = url 'http://www.sn.no/'; # handy constructor
+ $url4 = $url2->abs;       # get absolute url using base
+ $url5 = $url2->abs('http:/other/path');
+ $url6 = newlocal URI::URL 'test';
+
+ # Stringify URL
+ $str1 = $url->as_string;  # complete escaped URL string
+ $str2 = $url->full_path;  # escaped path+params+query
+ $str3 = "$url";           # use operator overloading
+
+ # Retrieving Generic-RL components:
+ $scheme   = $url->scheme;
+ $netloc   = $url->netloc; # see user,password,host,port below
+ $path     = $url->path;
+ $params   = $url->params;
+ $query    = $url->query;
+ $frag     = $url->frag;
+
+ # Accessing elements in their escaped form
+ $path     = $url->epath;
+ $params   = $url->eparams;
+ $query    = $url->equery;
+
+ # Retrieving Network location (netloc) components:
+ $user     = $url->user;
+ $password = $url->password;
+ $host     = $url->host;
+ $port     = $url->port;   # returns default if not defined
+
+ # Retrieve escaped path components as an array
+ @path     = $url->path_components;
+
+ # HTTP query-string access methods
+ @keywords = $url->keywords;
+ @form     = $url->query_form;
+
+ # All methods above can set the field values, e.g:
+ $url->scheme('http');
+ $url->host('www.w3.org');
+ $url->port($url->default_port);
+ $url->base($url5);                      # use string or object
+ $url->keywords(qw(dog bones));
+
+ # File methods
+ $url = new URI::URL "file:/foo/bar";
+ open(F, $url->local_path) or die;
+
+ # Compare URLs
+ if ($url->eq("http://www.sn.no")) or die;
+
+=head1 DESCRIPTION
+
+This module implements the URI::URL class representing Uniform
+Resource Locators (URL). URLs provide a compact string representation
+for resources available via the Internet. Both absolute (RFC 1738) and
+relative (RFC 1808) URLs are supported.
+
+URI::URL objects are created by calling new(), which takes as argument
+a string representation of the URL or an existing URL object reference
+to be cloned. Specific individual elements can then be accessed via
+the scheme(), user(), password(), host(), port(), path(), params(),
+query() and frag() methods.  In addition escaped versions of the path,
+params and query can be accessed with the epath(), eparams() and
+equery() methods.  Note that some URL schemes will support all these
+methods.
+
+The object constructor new() must be able to determine the scheme for
+the URL.  If a scheme is not specified in the URL itself, it will use
+the scheme specified by the base URL. If no base URL scheme is defined
+then new() will croak if URI::URL::strict(1) has been invoked,
+otherwise I<http> is silently assumed.  Once the scheme has been
+determined new() then uses the implementor() function to determine
+which class implements that scheme.  If no implementor class is
+defined for the scheme then new() will croak if URI::URL::strict(1)
+has been invoked, otherwise the internal generic URL class is assumed.
+
+Internally defined schemes are implemented by the
+URI::URL::I<scheme_name> module.  The URI::URL::implementor() function
+can be used to explicitly set the class used to implement a scheme if
+you want to override this.
+
+
+=head1 HOW AND WHEN TO ESCAPE
+
+
+=over 3
+
+=item This is an edited extract from a URI specification:
+
+The printability requirement has been met by specifying a safe set of
+characters, and a general escaping scheme for encoding "unsafe"
+characters. This "safe" set is suitable, for example, for use in
+electronic mail.  This is the canonical form of a URI.
+
+There is a conflict between the need to be able to represent many
+characters including spaces within a URI directly, and the need to be
+able to use a URI in environments which have limited character sets
+or in which certain characters are prone to corruption. This conflict
+has been resolved by use of an hexadecimal escaping method which may
+be applied to any characters forbidden in a given context. When URLs
+are moved between contexts, the set of characters escaped may be
+enlarged or reduced unambiguously.  The canonical form for URIs has
+all white spaces encoded.
+
+=item Notes:
+
+A URL string I<must>, by definition, consist of escaped
+components. Complete URLs are always escaped.
+
+The components of a URL string must be I<individually> escaped.  Each
+component of a URL may have a separate requirements regarding what
+must be escaped, and those requirements are also dependent on the URL
+scheme.
+
+Never escape an already escaped component string.
+
+=back
+
+This implementation expects an escaped URL string to be passed to
+new() and will return a fully escaped URL string from as_string()
+and full_path().
+
+Individual components can be manipulated in unescaped or escaped
+form. The following methods return/accept unescaped strings:
+
+    scheme                  path
+    user                    params
+    password                query
+    host                    frag
+    port
+
+The following methods return/accept partial I<escaped> strings:
+
+    netloc                  eparams
+    epath                   equery
+
+I<Partial escaped> means that only reserved characters
+(i.e. ':', '@', '/', ';', '?', '=', '&' in addition to '%', '.' and '#')
+needs to be escaped when they are to be treated as normal characters.
+I<Fully escaped> means that all unsafe characters are escaped. Unsafe
+characters are all all control characters (%00-%1F and %7F), all 8-bit
+characters (%80-%FF) as well
+as '{', '}', '|', '\', '^', '[', ']' '`', '"', '<' and '>'.
+Note that the character '~' is B<not> considered
+unsafe by this library as it is common practice to use it to reference
+personal home pages, but it is still unsafe according to RFC 1738.
+
+=head1 ADDING NEW URL SCHEMES
+
+New URL schemes or alternative implementations for existing schemes
+can be added to your own code. To create a new scheme class use code
+like:
+
+   package MYURL::foo;
+   @ISA = (URI::URL::implementor());   # inherit from generic scheme
+
+The 'URI::URL::implementor()' function call with no parameters returns
+the name of the class which implements the generic URL scheme
+behaviour (typically C<URI::URL::_generic>). All hierarchical schemes
+should be derived from this class.
+
+Your class can then define overriding methods (e.g., new(), _parse()
+as required).
+
+To register your new class as the implementor for a specific scheme
+use code like:
+
+   URI::URL::implementor('x-foo', 'MYURL::foo');
+
+Any new URL created for scheme 'x-foo' will be implemented by your
+C<MYURL::foo> class. Existing URLs will not be affected.
+
+
+=head1 FUNCTIONS
+
+=over 3
+
+=item $url = URI::URL->new( $url_string [, $base_url] )
+
+This is the object constructor.  It will create a new URI::URL object,
+initialized from the URL string.
+
+=item $url = URI::URL->newlocal($path);
+
+Returns an URL object that denotes a path within the local filesystem.
+Paths not starting with '/' are interpreted relative to the current
+working directory.  This constructor always return an absolute 'file'
+URL.
+
+=item $url = url($url_string, [, $base_url])
+
+Alternative constructor function.  The url() function is exported by
+the URI::URL module and is easier both to type and read than calling
+C<URI::URL->new> directly.  Useful for constructs like this:
+
+   $h = url($str)->host;
+
+This function is just a wrapper for URI::URL->new.
+
+=item URI::URL::strict($bool)
+
+If strict is true then we croak on errors.  The function returns the
+previous value.
+
+=item URI::URL::implementor([$scheme, [$class]])
+
+Use this function to get or set implementor class for a scheme.
+Returns '' if specified scheme is not supported.  Returns generic URL
+class if no scheme specified.
+
+=back
+
+=head1 METHODS
+
+This section describes the methods available for an URI::URL object.
+Note that some URL schemes will disallow some of these methods and
+will croak if they are used.  Some URL schemes add additional methods
+that are described in the sections to follow.
+
+Attribute access methods marked with (*) can take an optional argument
+to set the value of the attribute, and they always return the old
+value.
+
+=over 3
+
+=item $url->abs([$base])
+
+The abs() method attempts to return a new absolute URI::URL object
+for a given URL.  In order to convert a relative URL into an absolute
+one, a I<base> URL is required. You can associate a default base with a
+URL either by passing a I<base> to the new() constructor when a
+URI::URL is created or using the base() method on the object later.
+Alternatively you can specify a one-off base as a parameter to the
+abs() method.
+
+The rel() method will do the opposite transformation.
+
+Some older parsers used to allow the scheme name to be present in the
+relative URL if it was the same as the base URL scheme.  RFC1808 says
+that this should be avoided, but you can enable this old behaviour by
+setting the $URI::URL::ABS_ALLOW_RELATIVE_SCHEME variable to a TRUE
+value.  The difference is demonstrated by the following examples:
+
+  url("http:foo")->abs("http://host/a/b")     ==>  "http:foo"
+
+  local $URI::URL::ABS_ALLOW_RELATIVE_SCHEME = 1;
+  url("http:foo")->abs("http://host/a/b")     ==>  "http:/host/a/foo"
+
+You can also have the abs() method ignore if there is too many ".."
+segments in the relative URL by setting
+$URI::URL::ABS_REMOTE_LEADING_DOTS to a TRUE value.  The difference is
+demonstrated by the following examples:
+
+  url("../../../foo")->abs("http://host/a/b")   ==> "http://host/../../foo"
+
+  local $URI::URL::ABS_REMOTE_LEADING_DOTS = 1;
+  url("../../../foo")->abs("http://host/a/b")   ==> "http://host/foo"
+
+
+=item $url->as_string
+
+Returns a string representing the URL in its canonical form.  All
+unsafe characters will be escaped.  This method is overloaded as the
+perl "stringify" operator, which means that URLs can be used as
+strings in many contexts.
+
+=item $url->base (*)
+
+Get/set the base URL associated with the current URI::URL object.  The
+base URL matters when you call the abs() method.
+
+=item $url->clone
+
+Returns a copy of the current URI::URL object.
+
+=item $url->crack
+
+Return a 9 element array with the following content:
+
+   0: $url->scheme *)
+   1: $url->user
+   2: $url->password
+   3: $url->host
+   4: $url->port
+   5: $url->epath
+   6: $url->eparams
+   7: $url->equery
+   8: $url->frag
+
+All elements except I<scheme> will be undefined if the corresponding
+URL part is not available.
+
+B<Note:> The scheme (first element) returned by crack will aways be
+defined.  This is different from what the $url->scheme returns, since
+it will return I<undef> for relative URLs.
+
+=item $url->default_port
+
+Returns the default port number for the URL scheme that the URI::URL
+belongs too.
+
+=item $url->eparams (*)
+
+Get/set the URL parameters in escaped form.
+
+=item $url->epath (*)
+
+Get/set the URL path in escaped form.
+
+=item $url->eq($other_url)
+
+Compare two URLs to decide if they match or not.  The rules for how
+comparison is made varies for different parts of the URLs; scheme and
+netloc comparison is case-insensitive, and escaped chars match their
+%XX encoding unless they are "reserved" or "unsafe".
+
+=item $url->equery (*)
+
+Get/set the URL query string in escaped form.
+
+=item $url->full_path
+
+Returns the string "/path;params?query".  This is the string that is
+passed to a remote server in order to access the document.
+
+=item $url->frag (*)
+
+Get/set the fragment (unescaped)
+
+=item $url->host (*)
+
+Get/set the host (unescaped)
+
+=item $url->netloc (*)
+
+Get/set the network location in escaped form.  Setting the network
+location will affect 'user', 'password', 'host' and 'port'.
+
+=item $url->params (*)
+
+Get/set the URL parameters (unescaped)
+
+=item $url->password (*)
+
+Get/set the password (unescaped)
+
+=item $url->path (*)
+
+Get/set the path (unescaped).  This method will croak if any of the
+path components in the return value contain the "/" character.  You
+should use the epath() method to be safe.
+
+=item $url->path_components (*)
+
+Get/set the path using a list of unescaped path components.  The
+return value will loose the distinction beween '.' and '%2E'.  When
+setting a value, a '.' is converted to be a literal '.' and is
+therefore encoded as '%2E'.
+
+=item $url->port (*)
+
+Get/set the network port (unescaped)
+
+=item $url->rel([$base])
+
+Return a relative URL if possible.  This is the opposite of what the
+abs() method does.  For instance:
+
+   url("http://www.math.uio.no/doc/mail/top.html",
+       "http://www.math.uio.no/doc/linux/")->rel
+
+will return a relative URL with path set to "../mail/top.html" and
+with the same base as the original URL.
+
+If the original URL already is relative or the scheme or netloc does
+not match the base, then a copy of the original URL is returned.
+
+
+=item $url->print_on(*FILEHANDLE);
+
+Prints a verbose presentation of the contents of the URL object to
+the specified file handle (default STDERR).  Mainly useful for
+debugging.
+
+=item $url->scheme (*)
+
+Get/set the scheme for the URL.
+
+=item $url->query (*)
+
+Get/set the query string (unescaped).  This method will croak if the
+string returned contains both '+' and '%2B' or '=' together with '%3D'
+or '%26'.  You should use the equery() method to be safe.
+
+=item $url->user (*)
+
+Get/set the URL user name (unescaped)
+
+=back
+
+=head1 HTTP METHODS
+
+For I<http> URLs you may also access the query string using the
+keywords() and the query_form() methods.  Both will croak if the query
+is not of the correct format.  The encodings look like this:
+
+  word1+word2+word3..        # keywords
+  key1=val1&key2=val2...     # query_form
+
+Note: These functions does not return the old value when they are used
+to set a value of the query string.
+
+=over 3
+
+=item $url->keywords (*)
+
+The keywords() method returns a list of unescaped strings.  The method
+can also be used to set the query string by passing in the keywords as
+individual arguments to the method.
+
+=item $url->query_form (*)
+
+The query_form() method return a list of unescaped key/value pairs.
+If you assign the return value to a hash you might loose some values
+if the key is repeated (which it is allowed to do).
+
+This method can also be used to set the query sting of the URL like this:
+
+  $url->query_form(foo => 'bar', foo => 'baz', equal => '=');
+
+If the value part of a key/value pair is a reference to an array, then
+it will be converted to separate key/value pairs for each value.  This
+means that these two calls are equal:
+
+  $url->query_form(foo => 'bar', foo => 'baz');
+  $url->query_form(foo => ['bar', 'baz']);
+
+=back
+
+=head1 FILE METHODS
+
+The I<file> URLs implement the local_path() method that returns a path
+suitable for access to files within the current filesystem.  These
+methods can B<not> be used to set the path of the URL.
+
+=over 3
+
+=item $url->local_path
+
+This method is really just an alias for one of the methods below
+depending on what system you run on.
+
+=item $url->unix_path
+
+Returns a path suitable for use on a Unix system.  This method will
+croak if any of the path segments contains a "/" or a NULL character.
+
+=item $url->dos_path
+
+Returns a path suitable for use on a MS-DOS or MS-Windows system.
+
+=item $url->mac_path
+
+Returns a path suitable for use on a Macintosh system.
+
+=item $url->vms_path
+
+Returns a path suitable for use on a VMS system.  VMS is a trademark
+of Digital.
+
+=back
+
+=head1 GOPHER METHODS
+
+The methods access the parts that are specific for the gopher URLs.
+These methods access different parts of the $url->path.
+
+=over 3
+
+=item $url->gtype (*)
+
+=item $url->selector (*)
+
+=item $url->search (*)
+
+=item $url->string (*)
+
+=back
+
+=head1 NEWS METHODS
+
+=over 3
+
+=item $url->group (*)
+
+=item $url->article (*)
+
+=back
+
+=head1 WAIS METHODS
+
+The methods access the parts that are specific for the wais URLs.
+These methods access different parts of the $url->path.
+
+=over 3
+
+=item $url->database (*)
+
+=item $url->wtype (*)
+
+=item $url->wpath (*)
+
+=back
+
+=head1 MAILTO METHODS
+
+=over 3
+
+=item $url->address (*)
+
+The mail address can also be accessed with the netloc() method.
+
+=back
+
+
+=head1 WHAT A URL IS NOT
+
+URL objects do not, and should not, know how to 'get' or 'put' the
+resources they specify locations for, anymore than a postal address
+'knows' anything about the postal system. The actual access/transfer
+should be achieved by some form of transport agent class (see
+L<LWP::UserAgent>). The agent class can use the URL class, but should
+not be a subclass of it.
+
+=head1 AUTHORS / ACKNOWLEDGMENTS
+
+This module is (distantly) based on the C<wwwurl.pl> code in the
+libwww-perl distribution developed by Roy Fielding
+<fielding@ics.uci.edu>, as part of the Arcadia project at the
+University of California, Irvine, with contributions from Brooks
+Cutter.
+
+Gisle Aas <aas@sn.no>, Tim Bunce <Tim.Bunce@ig.co.uk>, Roy Fielding
+<fielding@ics.uci.edu> and Martijn Koster <m.koster@webcrawler.com>
+(in English alphabetical order) have collaborated on the complete
+rewrite for Perl 5, with input from other people on the libwww-perl
+mailing list.
+
+If you have any suggestions, bug reports, fixes, or enhancements, send
+them to the libwww-perl mailing list at <libwww-perl@ics.uci.edu>.
+
+=head1 COPYRIGHT
+
+Copyright 1995-1997 Gisle Aas.
+Copyright 1995 Martijn Koster.
+
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_generic.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_generic.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_generic.pm	(revision 21083)
@@ -0,0 +1,514 @@
+#####################################################################
+#
+#       Internal pre-defined generic scheme support
+#
+# In this implementation all schemes are subclassed from
+# URI::URL::_generic. This turns out to have reasonable mileage.
+# See also draft-ietf-uri-relative-url-06.txt
+
+package URI::URL::_generic;           # base support for generic-RL's
+require URI::URL;
+@ISA = qw(URI::URL);
+
+use URI::Escape qw(uri_escape uri_unescape %escapes);
+
+
+sub new {                               # inherited by subclasses
+    my($class, $init, $base) = @_;
+    my $url = bless { }, $class;        # create empty object
+    $url->_parse($init);                # parse $init into components
+    $url->base($base) if $base;
+    $url;
+}
+
+
+# Generic-RL parser
+# See draft-ietf-uri-relative-url-06.txt Section 2
+
+sub _parse {
+    my($self, $u, @comps) = @_;
+    return unless defined $u;
+
+    # Deside which components to parse (scheme & path is manatory)
+    @comps = qw(netloc query params frag) unless (@comps);
+    my %parse = map {$_ => 1} @comps;
+
+    # This parsing code is based on
+    #   draft-ietf-uri-relative-url-06.txt Section 2.4
+
+    # 2.4.1
+    $self->{'frag'} = uri_unescape($1)
+      if $parse{'frag'} && $u =~ s/#(.*)$//;
+    # 2.4.2
+    $self->{'scheme'} = lc($1) if $u =~ s/^\s*([\w\+\.\-]+)://;
+    # 2.4.3
+    $self->netloc("$1")	# passing $1 directly fails if netloc is autoloaded
+      if $parse{'netloc'} && $u =~ s!^//([^/]*)!!;
+    # 2.4.4
+    $self->{'query'} = $1
+      if $parse{'query'} && $u =~ s/\?(.*)//;
+    # 2.4.5
+    $self->{'params'} = $1
+      if $parse{'params'} && $u =~ s/;(.*)//;
+
+    # 2.4.6
+    #
+    # RFC 1738 says:
+    #
+    #     Note that the "/" between the host (or port) and the
+    #     url-path is NOT part of the url-path.
+    #
+    # however, RFC 1808, 2.4.6. says:
+    #
+    #    Even though the initial slash is not part of the URL path,
+    #    the parser must remember whether or not it was present so
+    #    that later processes can differentiate between relative
+    #    and absolute paths.  Often this is done by simply storing
+    #    he preceding slash along with the path.
+    #
+    # In version < 4.01 of URI::URL we used to strip the leading
+    # "/" when asked for $self->path().  This created problems for
+    # the consitency of the interface, so now we just consider the
+    # slash to be part of the path and we also make an empty path
+    # default to "/".
+
+    # we don't test for $parse{path} becase it is mandatory
+    $self->{'path'} = $u;
+}
+
+
+# Generic-RL stringify
+#
+sub as_string
+{
+    my $self = shift;
+    return $self->{'_str'} if $self->{'_str'};
+
+    my($scheme, $netloc, $frag) = @{$self}{qw(scheme netloc frag)};
+
+    my $u = $self->full_path(1);  # path+params+query
+
+    # rfc 1808 says:
+    #    Note that the fragment identifier (and the "#" that precedes
+    #    it) is not considered part of the URL.  However, since it is
+    #    commonly used within the same string context as a URL, a parser
+    #    must be able to recognize the fragment when it is present and
+    #    set it aside as part of the parsing process.
+    $u .= "#" . uri_escape($frag, $URI::URL::unsafe) if defined $frag;
+
+    $u = "//$netloc$u" if defined $netloc;
+    $u = "$scheme:$u" if $scheme;
+    # Inline: uri_escape($u, $URI::URL::unsafe);
+    $u =~ s/([$URI::URL::unsafe])/$escapes{$1}/go;
+    $self->{'_str'} = $u;  # set cache and return
+}
+
+# Generic-RL stringify full path "path;params?query"
+#
+sub full_path
+{
+    my($self, $dont_escape)  = @_;
+    my($path, $params, $query) = @{$self}{'path', 'params', 'query'};
+    my $p = '';
+    $p .= $path if defined $path;
+    # see comment in _parse 2.4.6 about the next line
+    $p = "/$p" if defined($self->{netloc}) && $p !~ m:^/:;
+    $p .= ";$params" if defined $params;
+    $p .= "?$query"  if defined $query;
+    return $p if $dont_escape;
+    # Inline: URI::Escape::uri_escape($p, $URI::URL::unsafe);
+    $p =~ s/([$URI::URL::unsafe])/$escapes{$1}/go;
+    $p;
+}
+
+# default_port()
+#
+# subclasses will usually want to override this
+#
+sub default_port { undef; }
+
+
+#####################################################################
+#
+# Methods to handle URL's elements
+
+# These methods always return the current value,
+# so you can use $url->path to read the current value.
+# If a new value is passed, e.g. $url->path('foo'),
+# it also sets the new value, and returns the previous value.
+# Use $url->path(undef) to set the value to undefined.
+
+sub netloc {
+    my $self = shift;
+    my $old = $self->_elem('netloc', @_);
+    return $old unless @_;
+
+    # update fields derived from netloc
+    my $nl = $self->{'netloc'} || '';
+    if ($nl =~ s/^([^:@]*):?(.*?)@//){
+	$self->{'user'}     = uri_unescape($1);
+	$self->{'password'} = uri_unescape($2) if $2 ne '';
+    }
+    if ($nl =~ /^([^:]*):?(\d*)$/){
+	my $port = $2;
+	# Since this happes so frequently, we inline this call:
+	#    my $host = uri_unescape($1);
+	my $host = $1;
+	$host =~ s/%([\dA-Fa-f]{2})/chr(hex($1))/eg;
+	$self->{'host'} = $host;
+	if ($port ne '') {
+	    $self->{'port'} = $port;
+	    if ($self->default_port == $port) {
+		$self->{'netloc'} =~ s/:\d+//;
+	    }
+	} elsif (defined $self->{'netloc'}) {
+	    $self->{'netloc'} =~ s/:$//;  # handle empty port spec
+	}
+    }
+    $self->{'_str'} = '';
+    $old;
+}
+
+
+# A U T O  L O A D E R
+# Don't remove this comment, it keeps AutoSplit happy!!
+# @ISA = qw(AutoLoader)
+#
+# The rest of the methods are only loaded on demand.  Stubs are neccesary
+# for inheritance to work.
+
+#sub netloc;  # because netloc is used by the _parse()
+sub user;
+sub password;
+sub host;
+sub port;
+sub _netloc_elem;
+sub epath;
+sub path;
+sub path_components;
+sub eparams;
+sub params;
+sub equery;
+sub query;
+sub frag;
+sub crack;
+sub abs;
+sub rel;
+sub eq;
+
+1;
+__END__
+
+
+# Fields derived from generic netloc:
+sub user     { shift->_netloc_elem('user',    @_); }
+sub password { shift->_netloc_elem('password',@_); }
+sub host     { shift->_netloc_elem('host',    @_); }
+
+sub port {
+    my $self = shift;
+    my $old = $self->_netloc_elem('port', @_);
+    defined($old) ? $old : $self->default_port;
+}
+
+sub _netloc_elem {
+    my($self, $elem, @val) = @_;
+    my $old = $self->_elem($elem, @val);
+    return $old unless @val;
+
+    # update the 'netloc' element
+    my $nl = '';
+    my $host = $self->{'host'};
+    if (defined $host) {  # can't be any netloc without any host
+	my $user = $self->{'user'};
+	$nl .= uri_escape($user, $URI::URL::reserved) if defined $user;
+	$nl .= ":" . uri_escape($self->{'password'}, $URI::URL::reserved)
+	  if defined($user) and defined($self->{'password'});
+	$nl .= '@' if length $nl;
+	$nl .= uri_escape($host, $URI::URL::reserved);
+	my $port = $self->{'port'};
+	$nl .= ":$port" if defined($port) && $port != $self->default_port;
+    }
+    $self->{'netloc'} = $nl;
+    $self->{'_str'} = '';
+    $old;
+}
+
+sub epath {
+     my $self = shift;
+     my $old = $self->_elem('path', @_);
+     return '/' if !defined($old) || !length($old);
+     return "/$old" if $old !~ m|^/| && defined $self->{'netloc'};
+     $old;
+}
+
+sub path {
+    my $self = shift;
+    my $old = $self->_elem('path',
+		      map uri_escape($_, $URI::URL::reserved_no_slash), @_);
+    return unless defined wantarray;
+    return '/' if !defined($old) || !length($old);
+    Carp::croak("Path components contain '/' (you must call epath)")
+	if $old =~ /%2[fF]/ and !@_;
+    $old = "/$old" if $old !~ m|^/| && defined $self->{'netloc'};
+    return uri_unescape($old);
+}
+
+sub path_components {
+    my $self = shift;
+    my $old = $self->{'path'};
+    $old = '' unless defined $old;
+    $old = "/$old" if $old !~ m|^/| && defined $self->{'netloc'};
+    if (@_) {
+	$self->_elem('path',
+		     join("/", map {uri_escape($_, $URI::URL::reserved)} @_));
+    }
+    map { uri_unescape($_) } split("/", $old, -1);
+}
+
+sub eparams  { shift->_elem('params',  @_); }
+
+sub params {
+    my $self = shift;
+    my $old = $self->_elem('params', map {uri_escape($_,$URI::URL::reserved_no_form)} @_);
+    return uri_unescape($old) if defined $old;
+    undef;
+}
+
+sub equery   { shift->_elem('query',   @_); }
+
+sub query {
+    my $self = shift;
+    my $old = $self->_elem('query', map { uri_escape($_, $URI::URL::reserved_no_form) } @_);
+    if (defined(wantarray) && defined($old)) {
+	if ($old =~ /%(?:26|2[bB]|3[dD])/) {  # contains escaped '=' '&' or '+'
+	    my $mess;
+	    for ($old) {
+		$mess = "Query contains both '+' and '%2B'"
+		  if /\+/ && /%2[bB]/;
+		$mess = "Form query contains escaped '=' or '&'"
+		  if /=/  && /%(?:3[dD]|26)/;
+	    }
+	    if ($mess) {
+		Carp::croak("$mess (you must call equery)");
+	    }
+	}
+	# Now it should be safe to unescape the string without loosing
+	# information
+	return uri_unescape($old);
+    }
+    undef;
+
+}
+
+# No efrag method because the fragment is always stored unescaped
+sub frag     { shift->_elem('frag', @_); }
+
+sub crack
+{
+    my $self = shift;
+    return $self unless wantarray;
+    my @c = @{$self}{qw(scheme user password host port path params query frag)};
+    if (!$c[0]) {
+	# try to determine scheme
+	my $base = $self->base;
+	$c[0] = $base->scheme if $base;
+	$c[0] ||= 'http';  # last resort, default in URI::URL::new
+    }
+    $c[4] ||= $self->default_port;
+    @c;
+}
+
+# Generic-RL: Resolving Relative URL into an Absolute URL
+#
+# Based on RFC1808 section 4
+#
+sub abs
+{
+    my($self, $base, $allow_relative_scheme) = @_;
+    $allow_relative_scheme = $URI::URL::ABS_ALLOW_RELATIVE_SCHEME if @_ < 3;
+    my $embed = $self->clone;
+
+    $base = $self->base unless $base;      # default to default base
+    return $embed unless $base;            # we have no base (step1)
+
+    $base = new URI::URL $base unless ref $base; # make obj if needed
+
+    my($scheme, $host, $path, $params, $query, $frag) =
+	@{$embed}{qw(scheme host path params query frag)};
+
+    # just use base if we are empty             (2a)
+    return $base->clone
+      unless grep(defined($_) && $_ ne '',
+		  $scheme,$host,$port,$path,$params,$query,$frag);
+
+    # if we have a scheme we must already be absolute   (2b),
+    #
+    # but sec. 5.2 also says: Some older parsers allow the scheme name
+    # to be present in a relative URL if it is the same as the base
+    # URL scheme.  This is considered to be a loophole in prior
+    # specifications of the partial URLs and should be avoided by
+    # future parsers.
+    #
+    # The old behavoir can be enabled by passing a TRUE value to the
+    # $allow_relative_scheme parameter.
+    return $embed if $scheme &&
+      (!$allow_relative_scheme || $scheme ne $base->{'scheme'});
+
+    $embed->{'_str'} = '';                      # void cached string
+    $embed->{'scheme'} = $base->{'scheme'};     # (2c)
+
+    return $embed if $embed->{'netloc'};        # (3)
+    $embed->netloc($base->{'netloc'});          # (3)
+
+    return $embed if $path =~ m:^/:;            # (4)
+
+    if ($path eq '') {                          # (5)
+	$embed->{'path'} = $base->{'path'};     # (5)
+
+	return $embed if defined $embed->{'params'}; # (5a)
+	$embed->{'params'} = $base->{'params'};      # (5a)
+
+	return $embed if defined $embed->{'query'};  # (5b)
+	$embed->{'query'} = $base->{'query'};        # (5b)
+
+	return $embed;
+    }
+
+    # (Step 6)  # draft 6 suggests stack based approach
+
+    my $basepath = $base->{'path'};
+    my $relpath  = $embed->{'path'};
+
+    $basepath =~ s!^/!!;
+    $basepath =~ s!/$!/.!;                # prevent empty segment
+    my @path = split('/', $basepath);     # base path into segments
+    pop(@path);                           # remove last segment
+
+    $relpath =~ s!/$!/.!;                 # prevent empty segment
+
+    push(@path, split('/', $relpath));    # append relative segments
+
+    my @newpath = ();
+    my $isdir = 0;
+    my $segment;
+
+    foreach $segment (@path) {            # left to right
+	if ($segment eq '.') {            # ignore "same" directory
+	    $isdir = 1;
+	}
+	elsif ($segment eq '..') {
+	    $isdir = 1;
+	    my $last = pop(@newpath);
+	    if (!defined $last) {         # nothing to pop
+		push(@newpath, $segment); # so must append
+	    }
+	    elsif ($last eq '..') {       # '..' cannot match '..'
+		# so put back again, and append
+		push(@newpath, $last, $segment);
+	    }
+	    #else
+		# it was a component,
+		# keep popped
+	} else {
+	    $isdir = 0;
+	    push(@newpath, $segment);
+	}
+    }
+
+    if ($URI::URL::ABS_REMOTE_LEADING_DOTS) {
+	shift @newpath while @newpath && $newpath[0] =~ /^\.\.?$/;
+    }
+
+    $embed->{'path'} = '/' . join('/', @newpath) .
+	($isdir && @newpath ? '/' : '');
+
+    $embed;
+}
+
+# The oposite of $url->abs.  Return a URL as much relative as possible
+sub rel {
+    my($self, $base) = @_;
+    my $rel = $self->clone;
+    $base = $self->base unless $base;
+    return $rel unless $base;
+    $base = new URI::URL $base unless ref $base;
+    $rel->base($base);
+
+    my($scheme, $netloc, $path) = @{$rel}{qw(scheme netloc path)};
+    if (!defined($scheme) && !defined($netloc)) {
+	# it is already relative
+	return $rel;
+    }
+
+    my($bscheme, $bnetloc, $bpath) = @{$base}{qw(scheme netloc path)};
+    for ($bscheme, $bnetloc, $netloc) { $_ = '' unless defined }
+
+    unless ($scheme eq $bscheme && $netloc eq $bnetloc) {
+	# different location, can't make it relative
+	return $rel;
+    }
+
+    for ($path, $bpath) {  $_ = "/$_" unless m,^/,; }
+
+    # Make it relative by eliminating scheme and netloc
+    $rel->{'scheme'} = undef;
+    $rel->netloc(undef);
+
+    # This loop is based on code from Nicolai Langfeldt <janl@ifi.uio.no>.
+    # First we calculate common initial path components length ($li).
+    my $li = 1;
+    while (1) {
+	my $i = index($path, '/', $li);
+	last if $i < 0 ||
+                $i != index($bpath, '/', $li) ||
+	        substr($path,$li,$i-$li) ne substr($bpath,$li,$i-$li);
+	$li=$i+1;
+    }
+    # then we nuke it from both paths
+    substr($path, 0,$li) = '';
+    substr($bpath,0,$li) = '';
+
+    if ($path eq $bpath && defined($rel->frag) && !defined($rel->equery)) {
+        $rel->epath('');
+    } else {
+        # Add one "../" for each path component left in the base path
+        $path = ('../' x $bpath =~ tr|/|/|) . $path;
+	$path = "./" if $path eq "";
+        $rel->epath($path);
+    }
+
+    $rel;
+}
+
+
+# Compare two URLs
+sub eq {
+    my($self, $other) = @_;
+    local($^W) = 0; # avoid warnings if we compare undef values
+    $other = URI::URL->new($other, $self) unless ref $other;
+
+    # Compare scheme and netloc
+    return 0 if ref($self) ne ref($other);                # must be same class
+    return 0 if $self->scheme ne $other->scheme;          # Always lower case
+    return 0 if lc($self->netloc) ne lc($other->netloc);  # Case-insensitive
+
+    # Compare full_path:
+    # According to <draft-ietf-http-v11-spec-05>:
+    # Characters other than those in the "reserved" and "unsafe" sets
+    # are equivalent to their %XX encodings.
+    my $fp1 = $self->full_path;
+    my $fp2 = $other->full_path;
+    for ($fp1, $fp2) {
+	s,%([\dA-Fa-f]{2}),
+	  my $x = $1;
+	  my $c = chr(hex($x));
+	  $c =~ /^[;\/?:\@&=+\"\#%<>\0-\040\177]/ ? "%\L$x" : $c;
+	,eg;
+    }
+    return 0 if $fp1 ne $fp2;
+    return 0 if $self->frag ne $other->frag;
+    1;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_login.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_login.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/_login.pm	(revision 21083)
@@ -0,0 +1,25 @@
+package URI::URL::_login;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+
+# Generic terminal logins.  This is used as a base class for 'telnet',
+# 'tn3270', and 'rlogin' URL schemes.
+
+
+sub _parse {
+    my($self, $init) = @_;
+    # All we want from _generic is the 'netloc' handling.
+    $self->URI::URL::_generic::_parse($init, 'netloc');
+}
+
+
+*path      = \&URI::URL::bad_method;
+*epath     = \&URI::URL::bad_method;
+*query     = \&URI::URL::bad_method;
+*equery    = \&URI::URL::bad_method;
+*params    = \&URI::URL::bad_method;
+*eparams   = \&URI::URL::bad_method;
+*frag      = \&URI::URL::bad_method;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/data.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/data.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/data.pm	(revision 21083)
@@ -0,0 +1,160 @@
+package URI::URL::data;
+
+# Implements data:-URLs as specified in draft-masinter-url-data-02.txt
+#
+# Abstract
+#
+# A new URL scheme, "data", is defined. It allows inclusion of small
+# data items as "immediate" data, as if it had been included externally.
+#
+# Description
+#
+# Some applications that use URLs also have a need to embed (small)
+# media type data directly inline. This document defines a new URL
+# scheme that would work like 'immediate addressing'. The URLs are of
+# the form:
+#
+#        data:[<mediatype>][;base64],<data>
+#
+
+require URI::URL;
+@ISA = qw(URI::URL);
+
+use URI::Escape;
+use MIME::Base64 ();
+
+# as defined in rfc1522.txt
+my $tspecial  = qq(()<>@,;:/[]?.=);
+my $tokenchar = qq([^\\s\000-\037\177-\377\Q$tspecial\E]);
+
+
+sub new {
+    my($class, $init, $base) = @_;
+
+    my $self = bless { }, $class;
+
+    $self->{'scheme'} = lc($1) if $init =~ s/^\s*([\w\+\.\-]+)://;
+    $self->{'frag'} = $1 if $init =~ s/\#(.*)$//;
+
+    my $type = "";
+    if ($init =~ s/^($tokenchar+\/$tokenchar+)//o) {
+	$type = $1;
+    }
+    while ($init =~ s/^;($tokenchar+)=([^,;]*)//o) {
+	# XXX should we unescape the parst
+	$type .= ";$1=$2";
+    }
+
+    $self->{'media_type'} = $type;
+
+    my $base64;
+    if ($init =~ s/^;base64//i) {
+	$base64 = 1;
+    }
+    
+    $init =~ s/^,//;
+    if ($base64) {
+	$self->{'base64'} = uri_unescape($init);
+    } else {
+	$self->{'data'} = uri_unescape($init);
+    }
+    $self->base($base) if $base;
+    $self;
+}
+
+sub media_type
+{
+    my $self = shift;
+    my $old = $self->{'media_type'};
+    if (@_) {
+	$self->{'media_type'} = shift || "";
+	delete $self->{'_str'};
+    }
+    my($type, $param) = split(/;/, $old, 2);
+    if ($type) {
+	$type = lc $type;
+    } else {
+	$type = "text/plain";
+	$param = "charset=US-ASCII" unless $param;
+    }
+    if (wantarray) {
+	return ($type, $param);
+    } else {
+	return $type;
+    }
+}
+
+sub data
+{
+    my $self = shift;
+    my $old_data;
+    my $old_base64;
+    $old_data = $self->{'data'};
+    $old_base64 = $self->{'base64'};
+    if (@_) {
+	if ($_[1]) { # base64 flag
+	    $self->{'base64'} = $_[0];
+	    delete $self->{'data'};
+	} else {
+	    $self->{'data'} = $_[0];
+	    delete $self->{'base64'};
+	}
+	delete $self->{'_str'};
+    }
+    unless (defined $old_data) {
+	$old_data = MIME::Base64::decode($old_base64);
+	$self->{'data'} = $old_data unless @_;
+    }
+    $old_data;
+}
+
+
+sub crack
+{
+    my $self = shift;
+    ($self->{'scheme'}
+     || 'data',          # scheme
+     undef,              # user
+     undef,              # passwd
+     undef,              # host
+     undef,              # port
+     $self->data,        # path
+     $self->{'media_type'},  # params
+     undef,              # query
+     $self->{'frag'}     # fragment
+    )
+}
+
+sub as_string {
+    my $self = shift;
+    return $self->{'_str'} if $self->{'_str'};
+    my $str = ($self->{'scheme'} || 'data') . ":";
+    $str .= $self->{'media_type'};
+    if (defined $self->{'base64'}) {
+	$str .= ";base64,$self->{'base64'}";
+    } else {
+	my $urlenc = uri_escape($self->{'data'});
+	my $base64 = MIME::Base64::encode($self->{'data'});
+	if (length($base64) + 7 < length($urlenc)) {
+	    $str .= ";base64,$base64";
+	    $self->{'base64'} = $base64;
+	} else {
+	    $str .= ",$urlenc";
+	}
+    }
+    $self->{'_str'} = $str;
+}
+
+sub eq {
+    my($self, $other) = @_;
+    return 0 if ref($self) ne ref($other);
+    return 0 if $self->scheme ne $other->scheme;
+
+    my $mt1 = join(";", $self->media_type);
+    my $mt2 = join(";", $other->media_type);
+    return 0 if $mt1 ne $mt2;
+
+    $self->data eq $other->data;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/file.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/file.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/file.pm	(revision 21083)
@@ -0,0 +1,165 @@
+package URI::URL::file;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+require Carp;
+require Config;
+
+# First we try to determine what kind of system we run on
+my $os = $Config::Config{'osname'};
+OS: {
+    $ostype = 'vms', last if $os eq 'VMS';
+    $ostype = 'dos', last if $os =~ /^(?:os2|mswin32|msdos)$/i;
+    $ostype = 'mac', last if $os eq "Mac";
+    $ostype = 'unix';  # The default
+}
+# NOTE: If you add more types to this list, remember to add a xxx_path
+# method as well.
+
+# This is the BNF found in RFC 1738:
+#
+# fileurl        = "file://" [ host | "localhost" ] "/" fpath
+# fpath          = fsegment *[ "/" fsegment ]
+# fsegment       = *[ uchar | "?" | ":" | "@" | "&" | "=" ]
+# Note that fsegment can contain '?' (query) but not ';' (param)
+
+sub _parse {
+    my($self, $init) = @_;
+    # The file URL can't have query
+    $self->URI::URL::_generic::_parse($init, qw(netloc path params frag));
+}
+
+# sub local_path { ... }
+#
+# Returns a path suitable for use on the local system (we just
+# set up an alias (derived from $ostype) to one of the path methods
+# defined below)
+*local_path = \&{$ostype . "_path"};
+
+*query  = \&URI::URL::bad_method;
+*equery = \&URI::URL::bad_method;
+
+# A U T O  L O A D E R
+# Don't remove this comment, it keeps AutoSplit happy!!
+# @ISA = qw(AutoLoader)
+#
+# These methods are autoloaded as needed
+sub newlocal;
+sub unix_path;
+sub dos_path ;
+sub mac_path ;
+sub vms_path ;
+1;
+__END__
+
+sub newlocal {
+    my($class, $path) = @_;
+
+    Carp::croak("Only implemented for Unix and OS/2 file systems")
+      unless $ostype eq "unix" or $^O =~ /os2|mswin32/i;
+    # XXX: Should implement the same thing for other systems
+
+    my $url = new URI::URL "file:";
+    unless (defined $path and
+    	    ($path =~ m:^/: or 
+	     ($^O eq 'os2' and Cwd::sys_is_absolute($path)) or
+	     ($^O eq 'MSWin32' and $path =~ m<^[A-Za-z]:[\\/]|^[\\/]{2}>))) {
+	require Cwd;
+	my $cwd = Cwd::fastcwd();
+	$cwd =~ s:/?$:/:; # force trailing slash on dir
+	$path = (defined $path) ? $cwd . $path : $cwd;
+    }
+    $url->path($path);
+    $url;
+}
+
+sub unix_path
+{
+    my $self = shift;
+    my @p;
+    for ($self->path_components) {
+	Carp::croak("Path component contains '/' or '\0'") if m|[\0/]|;
+	if (@p) {
+	    next unless length $_;   # skip empty path segments
+	    next if $_ eq '.';       # skip these too
+	    if ($_ eq '..' && $p[-1] ne '..') {  # go up one level
+		pop(@p) if $p[-1] ne '';
+		next;
+	    }
+	}
+	push(@p, $_);
+    }
+    shift(@p) if @p > 1 && $p[0] eq '.';   # './' rendundant if there is more
+    return '/' if !@p || (@p == 1 && $p[0] eq '');
+    join('/', @p);
+}
+
+sub dos_path
+{
+    my $self = shift;
+    my @p;
+    for ($self->path_components) {
+	Carp::croak("Path component contains '/' or '\\'") if m|[/\\]|;
+	push(@p, uc $_);
+    }
+    my $p = join("\\", @p);
+    $p =~ s/^\\([A-Z]:)/$1/;  # Fix drive letter specification
+    $p;
+}
+
+sub mac_path
+{
+    my $self = shift;
+    my @p;
+    for ($self->path_components) {
+	Carp::croak("Path component contains ':'") if /:/;
+	# XXX: Should probably want to do something about ".." and "."
+	# path segments.  I don't know how these are represented in
+	# the Machintosh file system.  If these are valid file names
+	# then we should split the path ourself, as $u->path_components
+	# loose the distinction between '.' and '%2E'.
+	push(@p, $_);
+    }
+    if (@p && $p[0] eq '') {
+	shift @p;
+    } else {
+	unshift(@p, '');
+    }
+    join(':', @p);
+}
+
+sub vms_path
+{
+    # ????? Can some VMS people please redo this function ??????
+
+    # This is implemented based on what RFC1738 (sec 3.10) says in the
+    # VMS file example:
+    #
+    #  DISK$USER:[MY.NOTES]NOTE123456.TXT
+    #
+    #      that might become
+    #
+    #  file:/disk$user/my/notes/note12345.txt
+    #
+    # BEWARE: I don't have a VMS machine myself so this is pure guesswork!!!
+
+    my $self = shift;
+    my @p = $self->path_components;
+    my $abs = 0;
+    if (@p && $p[0] eq '') {
+	shift @p;
+	$abs = 1;
+    }
+    # First I assume there must be a dollar in a disk spesification
+    my $p = '';
+    $p = uc(shift(@p)) . ":"  if @p && $p[0] =~ /\$/;
+    my $file = pop(@p);
+    $p .= "[" . join(".", map{uc($_)} @p) . "]" if @p;
+    $p .= uc $file;
+    # XXX: How is an absolute path different from a relative one??
+    $p =~ s/\[/[./ unless $abs;
+    # XXX: How is a directory denoted??
+    $p;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/finger.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/finger.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/finger.pm	(revision 21083)
@@ -0,0 +1,6 @@
+package URI::URL::finger;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+sub default_port { 79 }
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/ftp.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/ftp.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/ftp.pm	(revision 21083)
@@ -0,0 +1,76 @@
+package URI::URL::ftp;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+sub default_port { 21 }
+
+sub _parse {
+    my($self, $init) = @_;
+    # The ftp URLs can't have any query string
+    $self->URI::URL::_generic::_parse($init, qw(netloc path params frag));
+    1;
+}
+
+
+sub user
+{
+    my($self, @val) = @_;
+    my $old = $self->SUPER::user(@val);
+    defined $old ? $old : "anonymous";
+}
+
+BEGIN {
+    $whoami = undef;
+    $fqdn   = undef;
+}
+
+sub password
+{
+    my($self, @val) = @_;
+    my $old = $self->SUPER::password(@val);
+    unless (defined $old) {
+	my $user = $self->user;
+	if ($user eq 'anonymous' || $user eq 'ftp') {
+	    # anonymous ftp login password
+	    unless (defined $fqdn) {
+		eval {
+		    require Net::Domain;
+		    $fqdn = Net::Domain::hostfqdn();
+		};
+		if ($@) {
+		    $fqdn = '';
+		}
+	    }
+	    unless (defined $whoami) {
+		$whoami = $ENV{USER} || $ENV{LOGNAME} || $ENV{USERNAME};
+		unless ($whoami) {
+		    if ($^O eq 'MSWin32') { $whoami = Win32::LoginName() }
+		    else {
+		        $whoami = getlogin || getpwuid($<) || 'unknown';
+		    }
+		}
+	    }
+	    $old = "$whoami\@$fqdn";
+	} else {
+	    $old = "";
+	}
+    }
+    $old;
+}
+
+sub crack
+{
+    my $self = shift;
+    my @c = $self->SUPER::crack;
+    if ($c[3] && !$c[1]) {
+	# hostname defined, but user is undefined
+	$c[1] = $self->user;
+	$c[2] = $self->password;
+    }
+    @c;
+}
+
+*query  = \&URI::URL::bad_method;
+*equery = \&URI::URL::bad_method;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/gopher.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/gopher.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/gopher.pm	(revision 21083)
@@ -0,0 +1,82 @@
+package URI::URL::gopher;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+use URI::Escape qw(uri_unescape);
+
+sub default_port { 70 }
+
+sub _parse {
+    my($self, $init)   = @_;
+    $self->URI::URL::_generic::_parse($init, qw(netloc path));
+    $self->_parse_gopherpath;
+}
+
+sub path {
+    my $self = shift;
+    my $old = $self->URI::URL::_generic::path(@_);
+    return $old unless @_;
+    $self->_parse_gopherpath;
+    $old;
+}
+
+sub epath {
+    my $self = shift;
+    my $old = $self->URI::URL::_generic::epath(@_);
+    return $old unless @_;
+    $self->_parse_gopherpath;
+    $old;
+}
+
+sub _parse_gopherpath {
+    my $self = shift;
+    my $p = $self->{'path'};
+    # not according to RFC1738, but many popular browsers accept
+    # gopher URLs with a '?' before the search string.
+    $p =~ s/\?/\t/;
+    $p = uri_unescape($p);
+
+    if (defined($p) && $p ne '/' && $p =~ s!^/?(.)!!) {
+	$self->{'gtype'} = $1;
+    } else {
+	$self->{'gtype'} = "1";
+	$p = "";
+    }
+
+    delete $self->{'selector'};
+    delete $self->{'search'};
+    delete $self->{'string'};
+
+    my @parts = split(/\t/, $p, 3);
+    $self->{'selector'} = shift @parts if @parts;
+    $self->{'search'}   = shift @parts if @parts;
+    $self->{'string'}   = shift @parts if @parts;
+}
+
+
+sub gtype    { shift->_path_elem('gtype',    @_); }
+sub selector { shift->_path_elem('selector', @_); }
+sub search   { shift->_path_elem('search',   @_); }
+sub string   { shift->_path_elem('string',   @_); }
+
+sub _path_elem {
+    my($self, $elem, @val) = @_;
+    my $old = $self->_elem($elem, @val);
+    return $old unless @val;
+
+    # construct new path based on elements
+    my $path = "/$self->{'gtype'}";
+    $path .= "$self->{'selector'}" if defined $self->{'selector'};
+    $path .= "\t$self->{'search'}" if defined $self->{'search'};
+    $path .= "\t$self->{'string'}" if defined $self->{'string'};
+    $self->{'path'} = $path;
+
+    $old;
+}
+
+*params  = \&URI::URL::bad_method;
+*qparams = \&URI::URL::bad_method;
+*query   = \&URI::URL::bad_method;
+*equery  = \&URI::URL::bad_method;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/http.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/http.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/http.pm	(revision 21083)
@@ -0,0 +1,57 @@
+package URI::URL::http;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+sub default_port { 80 }
+
+require Carp;
+
+# @ISA = qw(AutoLoader)      # This comment is needed by AutoSplit.
+sub keywords;
+sub query_form;
+1;
+__END__
+
+# Handle ...?dog+bones type of query
+sub keywords {
+    my $self = shift;
+    $old = $self->{'query'};
+    if (@_) {
+	# Try to set query string
+	$self->equery(join('+', map { URI::Escape::uri_escape($_, $URI::URL::reserved) } @_));
+    }
+    return if !defined($old) || !defined(wantarray);
+
+    Carp::croak("Query is not keywords") if $old =~ /=/;
+    map { URI::Escape::uri_unescape($_) } split(/\+/, $old);
+}
+
+# Handle ...?foo=bar&bar=foo type of query
+sub query_form {
+    my $self = shift;
+    $old = $self->{'query'};
+    if (@_) {
+	# Try to set query string
+	my @query;
+	my($key,$vals);
+        my $esc = $URI::URL::reserved . $URI::URL::unsafe;
+	while (($key,$vals) = splice(@_, 0, 2)) {
+	    $key = '' unless defined $key;
+	    $key =  URI::Escape::uri_escape($key, $esc);
+	    $vals = [$vals] unless ref($vals) eq 'ARRAY';
+	    my $val;
+	    for $val (@$vals) {
+		$val = '' unless defined $val;
+		$val = URI::Escape::uri_escape($val, $esc);
+		push(@query, "$key=$val");
+	    }
+	}
+	$self->equery(join('&', @query));
+    }
+    return if !defined($old) || length($old) == 0 || !defined(wantarray);
+    Carp::croak("Query is not a form") unless $old =~ /=/;
+    map { s/\+/ /g; URI::Escape::uri_unescape($_) }
+	 map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old);
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/https.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/https.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/https.pm	(revision 21083)
@@ -0,0 +1,6 @@
+package URI::URL::https;
+require URI::URL::http;
+@ISA = qw(URI::URL::http);
+
+sub default_port { 443 }
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/mailto.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/mailto.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/mailto.pm	(revision 21083)
@@ -0,0 +1,78 @@
+package URI::URL::mailto;
+require URI::URL;
+@ISA = qw(URI::URL);
+
+use URI::Escape;
+
+sub new {
+    my($class, $init, $base) = @_;
+
+    my $self = bless { }, $class;
+    $self->{'scheme'} = lc($1) if $init =~ s/^\s*([\w\+\.\-]+)://;
+    $self->{'address'} = uri_unescape($init);
+    $self->base($base) if $base;
+    $self;
+}
+
+sub address { shift->_elem('address', @_); }
+
+# can use these as aliases
+*encoded822addr = \&address;   # URI::URL v3 compatibility
+*netloc         = \&address;
+
+sub user {
+    my $self = shift;
+    $old = $self->{'address'};
+    if (@_) {
+	my $new = $old;
+	$new =~ s/.*\@?/$_[0]\@/;
+	$self->{'address'} = $new;
+    }
+    $old =~ s/\@.*//;
+    $old;
+}
+
+sub host {
+    my $self = shift;
+    $old = $self->{'address'};
+    if (@_) {
+	my $new = $old;
+	$new =~ s/\@.*/\@$_[0]/;
+	$self->{'address'} = $new;
+    }
+    $old =~ s/.*\@//;
+    $old;
+}
+
+sub crack
+{
+    my $self = shift;
+    ('mailto',           # scheme
+     $self->user,        # user
+     undef,              # passwd
+     $self->host,        # host
+     undef,              # port
+     $self->{'address'}, # path
+     undef,              # params
+     undef,              # query
+     undef               # fragment
+    )
+}
+
+sub as_string {
+    my $self = shift;
+    my $str = ($self->{'scheme'} || "mailto") . ":";
+    $str .= uri_escape($self->{'address'}) if defined $self->{'address'};
+    $str;
+}
+
+sub eq {
+    my($self, $other) = @_;
+    $other = URI::URL->new($other) unless ref $other;
+
+    # Mail adresses are case-insensitive
+    $self->scheme eq $other->scheme &&
+      lc($self->{'address'}) eq lc($other->{'address'});
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/news.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/news.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/news.pm	(revision 21083)
@@ -0,0 +1,73 @@
+package URI::URL::news;
+require URI::URL;
+@ISA = qw(URI::URL);
+
+use URI::Escape;
+
+sub new {
+    my($class, $init, $base) = @_;
+    my $self = bless { }, $class;
+    $self->{'scheme'}  = lc($1) if $init =~ s/^\s*([\w\+\.\-]+)://;
+    $self->groupart(uri_unescape($init));
+    $self->base($base) if $base;
+    $self;
+}
+
+sub groupart {
+    my $self = shift;
+    my $old = $self->{'path'};
+    if (@_) {
+	my $p = shift;
+	if (defined $p && $p =~ /\@/) {
+	    # it is an message id
+	    $p =~ s/^<(.*)>$/$1/;  # "<" and ">" should not be part of it
+	}
+	$self->{'path'} = $p;
+    }
+    $old;
+}
+
+*path = \&groupart;
+
+sub article   {
+    my $self = shift;
+    Carp::croak("Illegal article id name (does not contain '\@')")
+      if @_ && $_[0] !~ /\@/;
+    my $old = $self->groupart(@_);
+    return undef if $old !~ /\@/;
+    $old;
+}
+
+
+sub group {
+    my $self = shift;
+    Carp::croak("Illegal group name (contains '\@')")
+      if @_ && $_[0] =~ /\@/;
+    my $old = $self->groupart(@_);
+    return undef if $old =~ /\@/;
+    $old;
+}
+
+sub crack
+{
+    my $self = shift;
+    ('news',             # scheme
+     undef,              # user
+     undef,              # passwd
+     undef,              # host
+     undef,              # port
+     $self->{'path'},    # path
+     undef,              # params
+     undef,              # query
+     undef               # fragment
+    )
+}
+
+
+sub as_string {
+    my $self = shift;
+    my $scheme = $self->{'scheme'} || "news";
+    "$scheme:" . uri_escape($self->{'path'});
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/nntp.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/nntp.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/nntp.pm	(revision 21083)
@@ -0,0 +1,44 @@
+package URI::URL::nntp;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+use URI::Escape;
+
+sub default_port { 119 }
+
+sub _parse {
+    my($self, $init) = @_;
+    $self->URI::URL::_generic::_parse($init, qw(netloc path frag));
+
+    my @parts = $self->path_components;
+    shift @parts if @parts && $parts[0] eq '';
+
+    $self->{'group'} = uri_unescape($parts[0]);
+    $self->{'digits'}= uri_unescape($parts[1]);
+}
+
+sub group   { shift->_elem('group',  @_); }
+sub digits  { shift->_elem('digits', @_); }
+sub article { shift->_elem('digits', @_); }
+
+sub as_string {
+    my $self = shift;
+    my $str = "$self->{'scheme'}:";
+    $str .= "//$self->{'netloc'}" if defined $self->{'netloc'};
+    $str .= "/" . uri_escape($self->{'group'}) . "/" .
+		  uri_escape($self->{'digits'});
+    $str;
+}
+
+# Standard methods are not legal for nntp URLs
+*path      = \&URI::URL::bad_method;
+*epath     = \&URI::URL::bad_method;
+*query     = \&URI::URL::bad_method;
+*equery    = \&URI::URL::bad_method;
+*params    = \&URI::URL::bad_method;
+*eparams   = \&URI::URL::bad_method;
+*frag      = \&URI::URL::bad_method;
+*user      = \&URI::URL::bad_method;
+*password  = \&URI::URL::bad_method;
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/prospero.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/prospero.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/prospero.pm	(revision 21083)
@@ -0,0 +1,27 @@
+package URI::URL::prospero;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+# RFC 1738 says:
+#
+#   A prospero URLs takes the form:
+#
+#      prospero://<host>:<port>/<hsoname>;<field>=<value>
+#
+#   where <host> and <port> are as described in Section 3.1. If :<port>
+#   is omitted, the port defaults to 1525. No username or password is
+#   allowed.
+#
+#   The <hsoname> is the host-specific object name in the Prospero
+#   protocol, suitably encoded.  This name is opaque and interpreted by
+#   the Prospero server.  The semicolon ";" is reserved and may not
+#   appear without quoting in the <hsoname>.
+
+sub default_port { 1525 }       # says rfc1738, section 3.11
+
+sub _parse {
+    my($self, $init) = @_;
+    $self->URI::URL::_generic::_parse($init, qw(netloc path params frag));
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/rlogin.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/rlogin.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/rlogin.pm	(revision 21083)
@@ -0,0 +1,7 @@
+package URI::URL::rlogin;
+require URI::URL::_login;
+@ISA = qw(URI::URL::_login);
+
+sub default_port { 513 }
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/telnet.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/telnet.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/telnet.pm	(revision 21083)
@@ -0,0 +1,7 @@
+package URI::URL::telnet;
+require URI::URL::_login;
+@ISA = qw(URI::URL::_login);
+
+sub default_port { 23 }
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/tn3270.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/tn3270.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/tn3270.pm	(revision 21083)
@@ -0,0 +1,7 @@
+package URI::URL::tn3270;
+require URI::URL::_login;
+@ISA = qw(URI::URL::_login);
+
+# sub default_port { 0 }
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/wais.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/wais.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/wais.pm	(revision 21083)
@@ -0,0 +1,50 @@
+package URI::URL::wais;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+use URI::Escape;
+
+# RFC 1738 says:
+#
+#   A WAIS URL takes one of the following forms:
+#
+#     wais://<host>:<port>/<database>
+#     wais://<host>:<port>/<database>?<search>
+#     wais://<host>:<port>/<database>/<wtype>/<wpath>
+#
+#   where <host> and <port> are as described in Section 3.1. If :<port>
+#   is omitted, the port defaults to 210.  The first form designates a
+#   WAIS database that is available for searching. The second form
+#   designates a particular search.  <database> is the name of the WAIS
+#   database being queried.
+
+
+sub default_port { 210 }
+
+sub _parse {
+    my($self, $init) = @_;
+    $self->URI::URL::_generic::_parse($init, qw(netloc path query frag));
+}
+
+# Set the path component with the specified number
+sub _path_comp
+{
+    my $self = shift;
+    my $no   = shift;
+    my @p = $self->path_components;
+    shift(@p) if @p && $p[0] eq '';
+    my $old = $p[$no];
+    if (@_) {
+	$p[$no] = $_[0];
+	$self->path_components(@p);
+    }
+    $old;
+}
+
+sub database { shift->_path_comp(0, @_); }
+sub wtype    { shift->_path_comp(1, @_); }
+sub wpath    { shift->_path_comp(2, @_); }
+
+*params   = \&URI::URL::bad_method;
+*eparams  = \&URI::URL::bad_method;
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/webster.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/webster.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/webster.pm	(revision 21083)
@@ -0,0 +1,6 @@
+package URI::URL::webster;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+sub default_port { 765 }
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/whois.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/whois.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/URI/URL/whois.pm	(revision 21083)
@@ -0,0 +1,6 @@
+package URI::URL::whois;
+require URI::URL::_generic;
+@ISA = qw(URI::URL::_generic);
+
+sub default_port { 43 }
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules.pm	(revision 21083)
@@ -0,0 +1,364 @@
+# $Id$
+
+package WWW::RobotRules;
+
+=head1 NAME
+
+WWW::RobotsRules - Parse robots.txt files
+
+=head1 SYNOPSIS
+
+ require WWW::RobotRules;
+ my $robotsrules = new WWW::RobotRules 'MOMspider/1.0';
+
+ use LWP::Simple qw(get);
+
+ $url = "http://some.place/robots.txt";
+ my $robots_txt = get $url;
+ $robotsrules->parse($url, $robots_txt);
+
+ $url = "http://some.other.place/robots.txt";
+ my $robots_txt = get $url;
+ $robotsrules->parse($url, $robots_txt);
+
+ # Now we are able to check if a URL is valid for those servers that
+ # we have obtained and parsed "robots.txt" files for.
+ if($robotsrules->allowed($url)) {
+     $c = get $url;
+     ...
+ }
+
+=head1 DESCRIPTION
+
+This module parses a F<robots.txt> file as specified in
+"A Standard for Robot Exclusion", described in
+<URL:http://info.webcrawler.com/mak/projects/robots/norobots.html>
+Webmasters can use the F<robots.txt> file to disallow conforming
+robots access to parts of their WWW server.
+
+The parsed file is kept in the WWW::RobotRules object, and this object
+provide methods to check if access to a given URL is prohibited.  The
+same WWW::RobotRules object can parse multiple F<robots.txt> files.
+
+The following methods are provided:
+
+=over 4
+
+=cut
+
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+sub Version { $VERSION; }
+
+
+use URI::URL ();
+use strict;
+
+
+=item $rules = new WWW::RobotRules 'MOMspider/1.0'
+
+This is the constructor for WWW::RobotRules objects.  The first 
+argument given to new() is the name of the robot. 
+
+=cut
+
+sub new {
+    my($class, $ua) = @_;
+
+    # This ugly hack is needed to ensure backwards compatability.
+    # The "WWW::RobotRules" class is now really abstract.
+    $class = "WWW::RobotRules::InCore" if $class eq "WWW::RobotRules";
+
+    my $self = bless { }, $class;
+    $self->agent($ua);
+    $self;
+}
+
+
+=item $rules->parse($url, $content, $fresh_until)
+
+The parse() method takes as arguments the URL that was used to
+retrieve the F</robots.txt> file, and the contents of the file.
+
+=cut
+
+sub parse {
+    my($self, $url, $txt, $fresh_until) = @_;
+
+    $url = new URI::URL $url unless ref($url);	# make it URL
+    my $netloc = $url->netloc;
+
+    $self->clear_rules($netloc);
+    $self->fresh_until($netloc, $fresh_until || (time + 365*24*3600));
+
+    my $ua;
+    my $is_me = 0;		# 1 iff this record is for me
+    my $is_anon = 0;		# 1 iff this record is for *
+    my @me_disallowed = ();	# rules disallowed for me
+    my @anon_disallowed = ();	# rules disallowed for *
+
+    # blank lines are significant, so turn CRLF into LF to avoid generating
+    # false ones
+    $txt =~ s/\015\012/\012/g;
+
+    # split at \012 (LF) or \015 (CR) (Mac text files have just CR for EOL)
+    for(split(/[\012\015]/, $txt)) {
+
+	# Lines containing only a comment are discarded completely, and
+        # therefore do not indicate a record boundary.
+	next if /^\s*\#/;
+
+	s/\s*\#.*//;        # remove comments at end-of-line
+
+	if (/^\s*$/) {	    # blank line
+	    last if $is_me; # That was our record. No need to read the rest.
+	    $is_anon = 0;
+	}
+        elsif (/^User-Agent:\s*(.*)/i) {
+	    $ua = $1;
+	    $ua =~ s/\s+$//;
+	    if ($is_me) {
+		# This record already had a User-agent that
+		# we matched, so just continue.
+	    }
+	    elsif ($ua eq '*') {
+		$is_anon = 1;
+	    }
+	    elsif($self->is_me($ua)) {
+		$is_me = 1;
+	    }
+	}
+	elsif (/^Disallow:\s*(.*)/i) {
+	    unless (defined $ua) {
+		warn "RobotRules: Disallow without preceding User-agent\n";
+		$is_anon = 1;  # assume that User-agent: * was intended
+	    }
+	    my $disallow = $1;
+	    $disallow =~ s/\s+$//;
+	    if (length $disallow) {
+		$disallow = URI::URL->new($disallow, $url)->full_path;
+	    }
+
+	    if ($is_me) {
+		push(@me_disallowed, $disallow);
+	    }
+	    elsif ($is_anon) {
+		push(@anon_disallowed, $disallow);
+	    }
+	}
+	else {
+	    warn "RobotRules: Unexpected line: $_\n";
+	}
+    }
+
+    if ($is_me) {
+	$self->push_rules($netloc, @me_disallowed);
+    } else {
+	$self->push_rules($netloc, @anon_disallowed);
+    }
+}
+
+# is_me()
+#
+# Returns TRUE if the given name matches the
+# name of this robot
+#
+sub is_me {
+    my($self, $ua) = @_;
+    my $me = $self->agent;
+    return index(lc($ua), lc($me)) >= 0;
+}
+
+=item $rules->allowed($url)
+
+Returns TRUE if this robot is allowed to retrieve this URL.
+
+=cut
+
+sub allowed {
+    my($self, $url) = @_;
+    $url = URI::URL->new($url) unless ref $url;	# make it URL
+
+    my $netloc = $url->netloc;
+
+    my $fresh_until = $self->fresh_until($netloc);
+    return -1 if !defined($fresh_until) || $fresh_until < time;
+
+    my $str = $url->full_path;
+    my $rule;
+    for $rule ($self->rules($netloc)) {
+	return 1 unless length $rule;
+	return 0 if index($str, $rule) == 0;
+    }
+    return 1;
+}
+
+# The following methods must be provided by the subclass.
+sub agent;
+sub visit;
+sub no_visits;
+sub last_visits;
+sub fresh_until;
+sub push_rules;
+sub clear_rules;
+sub rules;
+sub dump;
+
+package WWW::RobotRules::InCore;
+
+use vars qw(@ISA);
+@ISA = qw(WWW::RobotRules);
+
+=item $rules->agent([$name])
+
+Get/set the agent name. NOTE: Changing the agent name will clear the robots.txt
+rules and expire times out of the cache.
+
+=cut
+
+sub agent {
+    my ($self, $name) = @_;
+    my $old = $self->{'ua'};
+    if ($name) {
+	delete $self->{'loc'};   # all old info is now stale
+	$name =~ s!/?\s*\d+.\d+\s*$!!;  # loose version
+	$self->{'ua'}=$name;
+    }
+    $old;
+}
+
+sub visit {
+    my($self, $netloc, $time) = @_;
+    $time ||= time;
+    $self->{'loc'}{$netloc}{'last'} = $time;
+    
+    my $count = \$self->{'loc'}{$netloc}{'count'};
+    if (!defined $$count) {
+	$$count = 1;
+    } else {
+	$$count++;
+    }
+}
+
+sub no_visits {
+    my ($self, $netloc) = @_;
+    $self->{'loc'}{$netloc}{'count'};
+}
+
+sub last_visit {
+    my ($self, $netloc) = @_;
+    $self->{'loc'}{$netloc}{'last'};
+}
+
+sub fresh_until {
+    my ($self, $netloc, $fresh_until) = @_;
+    my $old = $self->{'loc'}{$netloc}{'fresh'};
+    if (defined $fresh_until) {
+	$self->{'loc'}{$netloc}{'fresh'} = $fresh_until;
+    }
+    $old;
+}
+
+sub push_rules {
+    my($self, $netloc, @rules) = @_;
+    push (@{$self->{'loc'}{$netloc}{'rules'}}, @rules);
+}
+
+sub clear_rules {
+    my($self, $netloc) = @_;
+    delete $self->{'loc'}{$netloc}{'rules'};
+}
+
+sub rules {
+    my($self, $netloc) = @_;
+    if (defined $self->{'loc'}{$netloc}{'rules'}) {
+	return @{$self->{'loc'}{$netloc}{'rules'}};
+    } else {
+	return ();
+    }
+}
+
+sub dump
+{
+    my $self = shift;
+    for (keys %$self) {
+	next if $_ eq 'loc';
+	print "$_ = $self->{$_}\n";
+    }
+    for (keys %{$self->{'loc'}}) {
+	my @rules = $self->rules($_);
+	print "$_: ", join("; ", @rules), "\n";
+	
+    }
+}
+
+1;
+
+__END__
+
+=back
+
+=head1 ROBOTS.TXT
+
+The format and semantics of the "/robots.txt" file are as follows
+(this is an edited abstract of
+<URL:http://info.webcrawler.com/mak/projects/robots/norobots.html>):
+
+The file consists of one or more records separated by one or more
+blank lines. Each record contains lines of the form
+
+  <field-name>: <value>
+
+The field name is case insensitive.  Text after the '#' character on a
+line is ignored during parsing.  This is used for comments.  The
+following <field-names> can be used:
+
+=over 3
+
+=item User-Agent
+
+The value of this field is the name of the robot the record is
+describing access policy for.  If more than one I<User-Agent> field is
+present the record describes an identical access policy for more than
+one robot. At least one field needs to be present per record.  If the
+value is '*', the record describes the default access policy for any
+robot that has not not matched any of the other records.
+
+=item Disallow
+
+The value of this field specifies a partial URL that is not to be
+visited. This can be a full path, or a partial path; any URL that
+starts with this value will not be retrieved
+
+=back
+
+=head1 ROBOTS.TXT EXAMPLES
+
+The following example "/robots.txt" file specifies that no robots
+should visit any URL starting with "/cyberworld/map/" or "/tmp/":
+
+  User-agent: *
+  Disallow: /cyberworld/map/ # This is an infinite virtual URL space
+  Disallow: /tmp/ # these will soon disappear
+
+This example "/robots.txt" file specifies that no robots should visit
+any URL starting with "/cyberworld/map/", except the robot called
+"cybermapper":
+
+  User-agent: *
+  Disallow: /cyberworld/map/ # This is an infinite virtual URL space
+
+  # Cybermapper knows where to go.
+  User-agent: cybermapper
+  Disallow:
+
+This example indicates that no robots should visit this site further:
+
+  # go away
+  User-agent: *
+  Disallow: /
+
+=head1 SEE ALSO
+
+L<LWP::RobotUA>, L<WWW::RobotRules::AnyDBM_File>
+
+=cut
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules/AnyDBM_File.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules/AnyDBM_File.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lib/WWW/RobotRules/AnyDBM_File.pm	(revision 21083)
@@ -0,0 +1,170 @@
+# $Id$
+
+package WWW::RobotRules::AnyDBM_File;
+
+require  WWW::RobotRules;
+@ISA = qw(WWW::RobotRules);
+$VERSION = sprintf("%d.%02d", q$Revision$ =~ /(\d+)\.(\d+)/);
+
+use Carp ();
+use AnyDBM_File;
+use Fcntl;
+use strict;
+
+=head1 NAME
+
+WWW::RobotRules::AnyDBM_File - Persistent RobotRules
+
+=head1 SYNOPSIS
+
+ require WWW::RobotRules::AnyDBM_File;
+ require LWP::RobotUA;
+
+ # Create a robot useragent that uses a diskcaching RobotRules
+ my $rules = new WWW::RobotRules::AnyDBM_File 'my-robot/1.0', 'cachefile';
+ my $ua = new WWW::RobotUA 'my-robot/1.0', 'me@foo.com', $rules;
+
+ # Then just use $ua as usual
+ $res = $ua->request($req);
+
+=head1 DESCRIPTION
+
+This is a subclass of I<WWW::RobotRules> that uses the AnyDBM_File
+package to implement persistent diskcaching of F<robots.txt> and host
+visit information.
+
+The constructor (the new() method) takes an extra argument specifying
+the name of the DBM file to use.  If the DBM file already exists, then
+you can specify undef as agent name as the name can be obtained from
+the DBM database.
+
+=cut
+
+sub new 
+{ 
+  my ($class, $ua, $file) = @_;
+  Carp::croak('WWW::RobotRules::AnyDBM_File filename required') unless $file;
+
+  my $self = bless { }, $class;
+  $self->{'filename'} = $file;
+  tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_CREAT|O_RDWR, 0640
+    or Carp::croak("Can't open $file: $!");
+  
+  if ($ua) {
+      $self->agent($ua);
+  } else {
+      # Try to obtain name from DBM file
+      $ua = $self->{'dbm'}{"|ua-name|"};
+      Carp::croak("No agent name specified") unless $ua;
+  }
+
+  $self;
+}
+
+sub agent {
+    my($self, $newname) = @_;
+    my $old = $self->{'dbm'}{"|ua-name|"};
+    if (defined $newname) {
+	$newname =~ s!/?\s*\d+.\d+\s*$!!;  # loose version
+	unless ($old && $old eq $newname) {
+	# Old info is now stale.
+	    my $file = $self->{'filename'};
+	    untie %{$self->{'dbm'}};
+	    tie %{$self->{'dbm'}}, 'AnyDBM_File', $file, O_TRUNC|O_RDWR, 0640;
+	    $self->{'dbm'}{"|ua-name|"} = $newname;
+	}
+    }
+    $old;
+}
+
+sub no_visits {
+    my ($self, $netloc) = @_;
+    my $t = $self->{'dbm'}{"$netloc|vis"};
+    return 0 unless $t;
+    (split(/;\s*/, $t))[0];
+}
+
+sub last_visit {
+    my ($self, $netloc) = @_;
+    my $t = $self->{'dbm'}{"$netloc|vis"};
+    return undef unless $t;
+    (split(/;\s*/, $t))[1];
+}
+
+sub fresh_until {
+    my ($self, $netloc, $fresh) = @_;
+    my $old = $self->{'dbm'}{"$netloc|exp"};
+    if ($old) {
+	$old =~ s/;.*//;  # remove cleartext
+    }
+    if (defined $fresh) {
+	$fresh .= "; " . localtime($fresh);
+	$self->{'dbm'}{"$netloc|exp"} = $fresh;
+    }
+    $old;
+}
+
+sub visit {
+    my($self, $netloc, $time) = @_;
+    $time ||= time;
+
+    my $count = 0;
+    my $old = $self->{'dbm'}{"$netloc|vis"};
+    if ($old) {
+	my $last;
+	($count,$last) = split(/;\s*/, $old);
+	$time = $last if $last > $time;
+    }
+    $count++;
+    $self->{'dbm'}{"$netloc|vis"} = "$count; $time; " . localtime($time);
+}
+
+sub push_rules {
+    my($self, $netloc, @rules) = @_;
+    my $cnt = 1;
+    $cnt++ while $self->{'dbm'}{"$netloc|r$cnt"};
+
+    foreach (@rules) {
+	$self->{'dbm'}{"$netloc|r$cnt"} = $_;
+	$cnt++;
+    }
+}
+
+sub clear_rules {
+    my($self, $netloc) = @_;
+    my $cnt = 1;
+    while ($self->{'dbm'}{"$netloc|r$cnt"}) {
+	delete $self->{'dbm'}{"$netloc|r$cnt"};
+	$cnt++;
+    }
+}
+
+sub rules {
+    my($self, $netloc) = @_;
+    my @rules = ();
+    my $cnt = 1;
+    while (1) {
+	my $rule = $self->{'dbm'}{"$netloc|r$cnt"};
+	last unless $rule;
+	push(@rules, $rule);
+	$cnt++;
+    }
+    @rules;
+}
+
+sub dump
+{
+}
+
+1;
+
+=head1 SEE ALSO
+
+L<WWW::RobotRules>, L<LWP::RobotUA>
+
+=head1 AUTHORS
+
+Hakan Ardo E<lt>hakan@munin.ub2.lu.se>, Gisle Aas E<lt>aas@sn.no>
+
+=cut
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lwpcook.pod
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lwpcook.pod	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/lwpcook.pod	(revision 21083)
@@ -0,0 +1,343 @@
+=head1 NAME
+
+lwpcook - libwww-perl cookbook
+
+=head1 DESCRIPTION
+
+This document contain some examples that show typical usage of the
+libwww-perl library.  You should consult the documentation for the
+individual modules for more detail.
+
+All examples should be runnable programs. You can, in most cases, test
+the code sections by piping the program text directly to perl.
+
+
+
+=head1 GET
+
+It is very easy to use this library to just fetch documents from the
+net.  The LWP::Simple module provides the get() function that return
+the document specified by its URL argument:
+
+  use LWP::Simple;
+  $doc = get 'http://www.sn.no/libwww-perl/';
+
+or, as a perl one-liner using the getprint() function:
+
+  perl -MLWP::Simple -e 'getprint "http://www.sn.no/libwww-perl/"'
+
+or, how about fetching the latest perl by running this command:
+
+  perl -MLWP::Simple -e '
+    getstore "ftp://ftp.sunet.se/pub/lang/perl/CPAN/src/latest.tar.gz",
+             "perl.tar.gz"'
+
+You will probably first want to find a CPAN site closer to you by
+running something like the following command:
+
+  perl -MLWP::Simple -e 'getprint "http://www.perl.com/perl/CPAN/CPAN.html"'
+
+Enough of this simple stuff!  The LWP object oriented interface gives
+you more control over the request sent to the server.  Using this
+interface you have full control over headers sent and how you want to
+handle the response returned.
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+  $ua->agent("$0/0.1 " . $ua->agent);
+  # $ua->agent("Mozilla/8.0") # pretend we are very capable browser
+
+  $req = new HTTP::Request 'GET' => 'http://www.sn.no/libwww-perl';
+  $req->header('Accept' => 'text/html');
+
+  # send request
+  $res = $ua->request($req);
+
+  # check the outcome
+  if ($res->is_success) {
+     print $res->content;
+  } else {
+     print "Error: " . $res->status_line . "\n";
+  }
+
+The lwp-request program (alias GET) that is distributed with the
+library can also be used to fetch documents from WWW servers.
+  
+
+
+=head1 HEAD
+
+If you just want to check if a document is present (i.e. the URL is
+valid) try to run code that looks like this:
+
+  use LWP::Simple;
+
+  if (head($url)) {
+     # ok document exists
+  }
+
+The head() function really returns a list of meta-information about
+the document.  The first three values of the list returned are the
+document type, the size of the document, and the age of the document.
+
+More control over the request or access to all header values returned
+require that you use the object oriented interface described for GET
+above.  Just s/GET/HEAD/g.
+
+
+=head1 POST
+
+There is no simple procedural interface for posting data to a WWW server.  You
+must use the object oriented interface for this. The most common POST
+operation is to access a WWW form application:
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+
+  my $req = new HTTP::Request 'POST','http://www.perl.com/cgi-bin/BugGlimpse';
+  $req->content_type('application/x-www-form-urlencoded');
+  $req->content('match=www&errors=0');
+
+  my $res = $ua->request($req);
+  print $res->as_string;
+
+Lazy people use the HTTP::Request::Common module to set up a suitable
+POST request message (it handles all the escaping issues) and has a
+suitable default for the content_type:
+
+  use HTTP::Request::Common qw(POST);
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+
+  my $req = POST 'http://www.perl.com/cgi-bin/BugGlimpse',
+                [ search => 'www', errors => 0 ];
+
+  print $ua->request($req)->as_string;
+
+The lwp-request program (alias POST) that is distributed with the
+library can also be used for posting data.
+
+
+
+=head1 PROXIES
+
+Some sites use proxies to go through fire wall machines, or just as
+cache in order to improve performance.  Proxies can also be used for
+accessing resources through protocols not supported directly (or
+supported badly :-) by the libwww-perl library.
+
+You should initialize your proxy setting before you start sending
+requests:
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+  $ua->env_proxy; # initialize from environment variables
+  # or
+  $ua->proxy(ftp  => 'http://proxy.myorg.com');
+  $ua->proxy(wais => 'http://proxy.myorg.com');
+  $ua->no_proxy(qw(no se fi));
+
+  my $req = new HTTP::Request 'wais://xxx.com/';
+  print $ua->request($req)->as_string;
+
+The LWP::Simple interface will call env_proxy() for you automatically.
+Applications that use the $ua->env_proxy() method will normally not
+use the $ua->proxy() and $ua->no_proxy() methods.
+
+Some proxies also require that you send it a username/password in
+order to let requests through.  You should be able to add the
+required header, with something like this:
+
+ use LWP::UserAgent;
+
+ $ua = new LWP::UserAgent;
+ $ua->proxy(['http', 'ftp'] => 'http://proxy.myorg.com');
+
+ $req = new HTTP::Request 'GET',"http://www.perl.com";
+ $req->proxy_authorization_basic("proxy_user", "proxy_password");
+
+ $res = $ua->request($req);
+ print $res->content if $res->is_success;
+
+Replace C<proxy.myorg.com>, C<proxy_user> and
+C<proxy_password> with something suitable for your site.
+
+
+=head1 ACCESS TO PROTECTED DOCUMENTS
+
+Documents protected by basic authorization can easily be accessed
+like this:
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+  $req = new HTTP::Request GET => 'http://www.sn.no/secret/';
+  $req->authorization_basic('aas', 'mypassword');
+  print $ua->request($req)->as_string;
+
+The other alternative is to provide a subclass of I<LWP::UserAgent> that
+overrides the get_basic_credentials() method. Study the I<lwp-request>
+program for an example of this.
+
+
+=head1 MIRRORING
+
+If you want to mirror documents from a WWW server, then try to run
+code similar to this at regular intervals:
+
+  use LWP::Simple;
+
+  %mirrors = (
+     'http://www.sn.no/'             => 'sn.html',
+     'http://www.perl.com/'          => 'perl.html',
+     'http://www.sn.no/libwww-perl/' => 'lwp.html',
+     'gopher://gopher.sn.no/'        => 'gopher.html',
+  );
+
+  while (($url, $localfile) = each(%mirrors)) {
+     mirror($url, $localfile);
+  }
+
+Or, as a perl one-liner:
+
+  perl -MLWP::Simple -e 'mirror("http://www.perl.com/", "perl.html")';
+
+The document will not be transfered unless it has been updated.
+
+
+
+=head1 LARGE DOCUMENTS
+
+If the document you want to fetch is too large to be kept in memory,
+then you have two alternatives.  You can instruct the library to write
+the document content to a file (second $ua->request() argument is a file
+name):
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+
+  my $req = new HTTP::Request 'GET',
+                'http://www.sn.no/~aas/perl/www/libwww-perl-5.00.tar.gz';
+  $res = $ua->request($req, "libwww-perl.tar.gz");
+  if ($res->is_success) {
+     print "ok\n";
+  }
+
+Or you can process the document as it arrives (second $ua->request()
+argument is a code reference):
+
+  use LWP::UserAgent;
+  $ua = new LWP::UserAgent;
+  $URL = 'ftp://ftp.unit.no/pub/rfc/rfc-index.txt';
+
+  my $expected_length;
+  my $bytes_received = 0;
+  $ua->request(HTTP::Request->new('GET', $URL),
+               sub {
+                   my($chunk, $res) = @_;
+                   $bytes_received += length($chunk);
+	           unless (defined $expected_length) {
+	              $expected_length = $res->content_length || 0;
+                   }
+		   if ($expected_length) {
+		        printf STDERR "%d%% - ",
+	                          100 * $bytes_received / $expected_length;
+                   }
+	           print STDERR "$bytes_received bytes received\n";
+
+                   # XXX Should really do something with the chunk itself
+	           # print $chunk;
+               });
+
+
+
+=head1 HTML FORMATTING
+
+It is easy to convert HTML code to "readable" text.
+
+  use LWP::Simple;
+  use HTML::Parse;
+  print parse_html(get 'http://www.sn.no/libwww-perl/')->format;
+
+
+
+=head1 PARSE URLS
+
+To access individual elements of a URL, try this:
+
+  use URI::URL;
+  $host = url("http://www.sn.no/")->host;
+
+or
+
+  use URI::URL;
+  $u = url("ftp://ftp.sn.no/test/aas;type=i");
+  print "Protocol scheme is ", $u->scheme, "\n";
+  print "Host is ", $u->host, " at port ", $u->port, "\n";
+
+or even
+
+  use URI::URL;
+  my($host,$port) = (url("ftp://ftp.sn.no/test/aas;type=i")->crack)[3,4];
+
+
+=head1 EXPAND RELATIVE URLS
+
+This code reads URLs and print expanded version.
+
+  use URI::URL;
+  $BASE = "http://www.sn.no/some/place?query";
+  while (<>) {
+     print url($_, $BASE)->abs->as_string, "\n";
+  }
+
+We can expand URLs in an HTML document by using the parser to build a
+tree that we then traverse:
+
+  %link_elements =
+  (
+   'a'    => 'href',
+   'img'  => 'src',
+   'form' => 'action',
+   'link' => 'href',
+  );
+
+  use HTML::Parse;
+  use URI::URL;
+
+  $BASE = "http://somewhere/root/";
+  $h = parse_htmlfile("xxx.html");
+  $h->traverse(\&expand_urls, 1);
+
+  print $h->as_HTML;
+
+  sub expand_urls
+  {
+     my($e, $start) = @_;
+     return 1 unless $start;
+     my $attr = $link_elements{$e->tag};
+     return 1 unless defined $attr;
+     my $url = $e->attr($attr);
+     return 1 unless defined $url;
+     $e->attr($attr, url($url, $BASE)->abs->as_string);
+  }
+
+
+
+=head1 BASE URL
+
+If you want to resolve relative links in a page you will have to
+determine which base URL to use.  The HTTP::Response objects now has a
+base() method.
+
+  $BASE = $res->base;
+
+
+
+=head1 COPYRIGHT
+
+Copyright 1996-1997, Gisle Aas
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/README
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/README	(revision 21083)
@@ -0,0 +1,24 @@
+Self test suite for the libwww-perl library
+-------------------------------------------
+
+Tests are invoked by running the ./TEST script, but usually you run
+the tests with "make test" at the top libwww-perl directory.  Use -v
+option for verbose tests.  You might run an individual test like this:
+
+  ./TEST -v base/date
+
+or all tests in a directory like this
+
+  ./TEST base
+
+You enable network tests by creating the "net/config.pl" file.  A good
+start is to make a copy of the "net/config.pl.dist" file.  For network
+tests you should also make a link from the cgi-bin directory of your
+http server to the "net/cgi-bin" directory.  You might also have to
+check that the interpreter line (#!.../perl) in the scripts is ok for
+your system.  The following setup works for my site:
+
+  ln -s `pwd`/net/cgi-bin ~www/cgi-bin/lwp
+  cp net/config.pl.dist net/config.pl
+  emacs net/config.pl                        # fix if necessary
+  ./TEST net
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/TEST
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/TEST	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/TEST	(revision 21083)
@@ -0,0 +1,39 @@
+#!/usr/local/bin/perl
+
+# This script is run Test::Harness on the tests found under the
+# "t" directory.
+
+# First we check if we already are within the "t" directory
+unless (-d "base") {
+    # try to move into test directory
+    chdir "t" or die "Can't chdir: $!";
+
+    # fix all relative library locations
+    foreach (@INC) {
+	$_ = "../$_" unless m,^/,;
+    }
+}
+# Pick up the library files from the ../blib directory
+unshift(@INC, "../blib/lib", "../blib/arch");
+#print "@INC\n";
+
+
+use Test::Harness;
+$Test::Harness::verbose = shift
+  if $ARGV[0] =~ /^\d+$/ || $ARGV[0] eq "-v";
+
+if (@ARGV) {
+    for (@ARGV) {
+	if (-d $_) {
+	    push(@tests, <$_/*.t>);
+	} else {
+            $_ .= ".t" unless /\.t$/;
+	    push(@tests, $_);
+	}
+    }
+} else {
+    @tests = (<base/*.t>, <uri/*.t>, <robot/*.t>, <local/*.t>);
+    push(@tests, <net/*.t>) if -f "net/config.pl";
+}
+
+runtests @tests;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/common-req.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/common-req.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/common-req.t	(revision 21083)
@@ -0,0 +1,193 @@
+print "1..19\n";
+
+use HTTP::Request::Common;
+
+$r = GET 'http://www.sn.no/';
+print $r->as_string;
+
+print "not " unless $r->method eq "GET" and $r->url eq "http://www.sn.no/";
+print "ok 1\n";
+
+$r = HEAD "http://www.sn.no/",
+     If_Match => 'abc',
+     From => 'aas@sn.no';
+print $r->as_string;
+
+print "not " unless $r->method eq "HEAD" and $r->url->eq("http://www.sn.no");
+print "ok 2\n";
+
+print "not " unless $r->header('If-Match') eq "abc" and $r->header("from") eq "aas\@sn.no";
+print "ok 3\n";
+
+$r = PUT "http://www.sn.no",
+     Content => 'foo';
+print $r->as_string;
+
+print "not " unless $r->method eq "PUT" and $r->url->netloc eq "www.sn.no";
+print "ok 4\n";
+
+print "not " if defined($r->header("Content"));
+print "ok 5\n";
+
+print "not " unless ${$r->content_ref} eq "foo" and
+                    $r->content eq "foo";
+print "ok 6\n";
+
+#--- Test POST requests ---
+
+$r = POST "http://www.sn.no", [foo => 'bar',
+                               baz => [qw(a b c)],
+                               foo => 'zoo=&',
+                               "space " => " + ",
+                              ],
+                              bar => 'foo';
+print $r->as_string;
+
+print "not " unless $r->method eq "POST" and
+                    $r->content_type eq "application/x-www-form-urlencoded" and
+                    $r->content_length == 58 and
+                    $r->header("bar") eq "foo";
+print "ok 7\n";
+
+print "not " unless $r->content eq "foo=bar&baz=a&baz=b&baz=c&foo=zoo%3D%26&space%20=%20%2B%20";
+print "ok 8\n";
+
+$r = POST "mailto:gisle\@aas.no",
+     Subject => "Heisan",
+     Content_Type => "text/plain",
+     Content => "Howdy\n";
+print $r->as_string;
+
+print "not " unless $r->method eq "POST" and
+                    $r->header("Subject") eq "Heisan" and
+                    $r->content eq "Howdy\n" and
+	            $r->content_type eq "text/plain";
+print "ok 9\n";
+
+#
+# POST for File upload
+#
+$file = "test-$$";
+open(FILE, ">$file") or die "Can't create $file: $!";
+print FILE "foo\nbar\nbaz\n";
+close(FILE);
+
+$r = POST 'http://www.perl.org/survey.cgi',
+       Content_Type => 'form-data',
+       Content      => [ name  => 'Gisle Aas',
+                         email => 'gisle@aas.no',
+                         gender => 'm',
+                         born   => '1964',
+                         file   => [$file],
+                       ];
+print $r->as_string;
+
+unlink($file) or warn "Can't unlink $file: $!";
+
+print "not " unless $r->method eq "POST" and
+	            $r->url->path eq "/survey.cgi" and
+                    $r->content_type eq "multipart/form-data" and
+	            $r->header(Content_type) =~ /boundary="?([^"]+)"?/;
+print "ok 10\n";
+$boundary = $1;
+
+$c = $r->content;
+$c =~ s/\r//g;
+@c = split(/--\Q$boundary/, $c);
+print "$c[5]\n";
+
+print "not " unless @c == 7 and $c[6] =~ /^--\n/;  # 5 parts + header & trailer
+print "ok 11\n";
+
+print "not " unless $c[2] =~ /^Content-Disposition:\s*form-data;\s*name="email"/m and
+                    $c[2] =~ /^gisle\@aas.no$/m;
+print "ok 12\n";
+
+print "not " unless $c[5] =~ /^Content-Disposition:\s*form-data;\s*name="file";\s*filename="$file"/m and
+	            $c[5] =~ /^Content-Type:\s*text\/plain$/m and
+	            $c[5] =~ /^foo\nbar\nbaz/m;
+print "ok 13\n";
+
+$r = POST 'http://www.perl.org/survey.cgi',
+      [ file => [ undef, "xxx", Content_type => "text/html", Content => "<h1>Hello, world!</h1>" ]],
+      Content_type => 'multipart/form-data';
+print $r->as_string;
+
+print "not " unless $r->content =~ /^--\S+\015\012Content-Disposition:\s*form-data;\s*name="file";\s*filename="xxx"/m and
+	            $r->content =~ /^Content-Type: text\/html/m and
+	            $r->content =~ /^<h1>Hello, world/m;
+print "ok 14\n";
+
+
+$r = POST 'http://www.perl.org/survey.cgi',
+      Content_type => 'multipart/form-data',
+      Content => [ file => [ undef, undef, Content => "foo"]];
+print $r->as_string;
+
+print "not " if $r->content =~ /filename=/;
+print "ok 15\n";
+
+
+# The POST routine can now also take a hash reference.
+my %hash = (foo => 42, bar => 24);
+$r = POST 'http://www.perl.org/survey.cgi', \%hash;
+print $r->as_string;
+print "not " unless $r->content =~ /foo=42/ &&
+                    $r->content =~ /bar=24/ &&
+                    $r->content_type eq "application/x-www-form-urlencoded" &&
+                    $r->content_length == 13;
+print "ok 16\n";
+
+ 
+#
+# POST for File upload
+#
+use HTTP::Request::Common qw($DYNAMIC_FILE_UPLOAD);
+
+$file = "test-$$";
+open(FILE, ">$file") or die "Can't create $file: $!";
+for (1..1000) {
+   print FILE "a" .. "z";
+}
+close(FILE);
+
+$DYNAMIC_FILE_UPLOAD++;
+$r = POST 'http://www.perl.org/survey.cgi',
+       Content_Type => 'form-data',
+       Content      => [ name  => 'Gisle Aas',
+                         email => 'gisle@aas.no',
+                         gender => 'm',
+                         born   => '1964',
+                         file   => [$file],
+                       ];
+print $r->as_string;
+
+print "not " unless $r->method eq "POST" and
+	            $r->url->path eq "/survey.cgi" and
+                    $r->content_type eq "multipart/form-data" and
+	            $r->header(Content_type) =~ /boundary="?([^"]+)"?/ and
+		    ref($r->content) eq "CODE";
+print "ok 17\n";
+$boundary = $1;
+
+print "not " unless length($boundary) > 10;
+print "ok 18\n";
+
+$code = $r->content;
+my $chunk;
+my @chunks;
+while (defined($chunk = &$code) && length $chunk) {
+   push(@chunks, $chunk);
+}
+
+unlink($file) or warn "Can't unlink $file: $!";
+
+$_ = join("", @chunks);
+
+print int(@chunks), " chunks, total size is ", length($_), " bytes\n";
+
+# should be close to expected size and number of chunks
+print "not " unless abs(@chunks - 15 < 3) and
+                    abs(length($_) - 26589) < 20;
+print "ok 19\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/cookies.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/cookies.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/cookies.t	(revision 21083)
@@ -0,0 +1,515 @@
+print "1..32\n";
+
+#use LWP::Debug '+';
+
+use HTTP::Cookies;
+use HTTP::Request;
+use HTTP::Response;
+
+#-------------------------------------------------------------------
+# First we check that it works for the original example at
+# http://www.netscape.com/newsref/std/cookie_spec.html
+
+# Client requests a document, and receives in the response:
+# 
+#       Set-Cookie: CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT
+# 
+# When client requests a URL in path "/" on this server, it sends:
+# 
+#       Cookie: CUSTOMER=WILE_E_COYOTE
+# 
+# Client requests a document, and receives in the response:
+# 
+#       Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
+# 
+# When client requests a URL in path "/" on this server, it sends:
+# 
+#       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
+# 
+# Client receives:
+# 
+#       Set-Cookie: SHIPPING=FEDEX; path=/fo
+# 
+# When client requests a URL in path "/" on this server, it sends:
+# 
+#       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001
+# 
+# When client requests a URL in path "/foo" on this server, it sends:
+# 
+#       Cookie: CUSTOMER=WILE_E_COYOTE; PART_NUMBER=ROCKET_LAUNCHER_0001; SHIPPING=FEDEX
+# 
+# The last Cookie is buggy, because both specifications says that the
+# most specific cookie must be sent first.  SHIPPING=FEDEX is the
+# most specific and should thus be first.
+
+$c = HTTP::Cookies->new;
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/");
+
+$res = HTTP::Response->new(200, "OK");
+$res->request($req);
+$res->header("Set-Cookie" => "CUSTOMER=WILE_E_COYOTE; path=/; expires=Wednesday, 09-Nov-99 23:12:40 GMT");
+$c->extract_cookies($res);
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/");
+$c->add_cookie_header($req);
+
+print "not " unless $req->header("Cookie") eq "CUSTOMER=WILE_E_COYOTE" &&
+                    $req->header("Cookie2") eq "\$Version=1";
+print "ok 1\n";
+
+$res->request($req);
+$res->header("Set-Cookie" => "PART_NUMBER=ROCKET_LAUNCHER_0001; path=/");
+$c->extract_cookies($res);
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/foo/bar");
+$c->add_cookie_header($req);
+
+$h = $req->header("Cookie");
+print "not " unless $h =~ /PART_NUMBER=ROCKET_LAUNCHER_0001/ &&
+                    $h =~ /CUSTOMER=WILE_E_COYOTE/;
+print "ok 2\n";
+
+$res->request($req);
+$res->header("Set-Cookie", "SHIPPING=FEDEX; path=/foo");
+$c->extract_cookies($res);
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/");
+$c->add_cookie_header($req);
+
+$h = $req->header("Cookie");
+print "not " unless $h =~ /PART_NUMBER=ROCKET_LAUNCHER_0001/ &&
+	            $h =~ /CUSTOMER=WILE_E_COYOTE/ &&
+	            $h !~ /SHIPPING=FEDEX/;
+print "ok 3\n";
+
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/foo/");
+$c->add_cookie_header($req);
+
+$h = $req->header("Cookie");
+print "not " unless $h =~ /PART_NUMBER=ROCKET_LAUNCHER_0001/ &&
+	            $h =~ /CUSTOMER=WILE_E_COYOTE/ &&
+		    $h =~ /^SHIPPING=FEDEX;/;
+print "ok 4\n";
+
+print $c->as_string;
+
+
+# Second Example transaction sequence:
+# 
+# Assume all mappings from above have been cleared.
+# 
+# Client receives:
+# 
+#       Set-Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001; path=/
+# 
+# When client requests a URL in path "/" on this server, it sends:
+# 
+#       Cookie: PART_NUMBER=ROCKET_LAUNCHER_0001
+# 
+# Client receives:
+# 
+#       Set-Cookie: PART_NUMBER=RIDING_ROCKET_0023; path=/ammo
+# 
+# When client requests a URL in path "/ammo" on this server, it sends:
+# 
+#       Cookie: PART_NUMBER=RIDING_ROCKET_0023; PART_NUMBER=ROCKET_LAUNCHER_0001
+# 
+#       NOTE: There are two name/value pairs named "PART_NUMBER" due to
+#       the inheritance of the "/" mapping in addition to the "/ammo" mapping. 
+
+$c = HTTP::Cookies->new;  # clear it
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/");
+$res = HTTP::Response->new(200, "OK");
+$res->request($req);
+$res->header("Set-Cookie", "PART_NUMBER=ROCKET_LAUNCHER_0001; path=/");
+
+$c->extract_cookies($res);
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/");
+$c->add_cookie_header($req);
+
+print "not " unless $req->header("Cookie") eq "PART_NUMBER=ROCKET_LAUNCHER_0001";
+print "ok 5\n";
+
+$res->request($req);
+$res->header("Set-Cookie", "PART_NUMBER=RIDING_ROCKET_0023; path=/ammo");
+$c->extract_cookies($res);
+
+$req = HTTP::Request->new(GET => "http://www.acme.com/ammo");
+$c->add_cookie_header($req);
+
+print "not " unless $req->header("Cookie") =~
+       /^PART_NUMBER=RIDING_ROCKET_0023;\s*PART_NUMBER=ROCKET_LAUNCHER_0001/;
+print "ok 6\n";
+
+print $c->as_string;
+undef($c);
+
+
+#-------------------------------------------------------------------
+# When there are no "Set-Cookie" header, then even responses
+# without any request URLs connected should be allowed.
+
+$c = HTTP::Cookies->new;
+$c->extract_cookies(HTTP::Response->new("200", "OK"));
+print "not " if count_cookies($c) != 0;
+print "ok 7\n";
+
+
+#-------------------------------------------------------------------
+# Then we test with the examples from draft-ietf-http-state-man-mec-03.txt
+#
+# 5.  EXAMPLES
+
+$c = HTTP::Cookies->new;
+
+# 
+# 5.1  Example 1
+# 
+# Most detail of request and response headers has been omitted.  Assume
+# the user agent has no stored cookies.
+# 
+#   1.  User Agent -> Server
+# 
+#       POST /acme/login HTTP/1.1
+#       [form data]
+# 
+#       User identifies self via a form.
+# 
+#   2.  Server -> User Agent
+# 
+#       HTTP/1.1 200 OK
+#       Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"
+# 
+#       Cookie reflects user's identity.
+
+$cookie = interact($c, 'http://www.acme.com/acme/login',
+                       'Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"');
+print "not " if $cookie;
+print "ok 8\n";
+
+# 
+#   3.  User Agent -> Server
+# 
+#       POST /acme/pickitem HTTP/1.1
+#       Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"
+#       [form data]
+# 
+#       User selects an item for ``shopping basket.''
+# 
+#   4.  Server -> User Agent
+# 
+#       HTTP/1.1 200 OK
+#       Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
+#               Path="/acme"
+# 
+#       Shopping basket contains an item.
+
+$cookie = interact($c, 'http://www.acme.com/acme/pickitem',
+		       'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"');
+print "not " unless $cookie =~ m(^\$Version="?1"?; Customer="?WILE_E_COYOTE"?; \$Path="/acme"$);
+print "ok 9\n";
+
+# 
+#   5.  User Agent -> Server
+# 
+#       POST /acme/shipping HTTP/1.1
+#       Cookie: $Version="1";
+#               Customer="WILE_E_COYOTE"; $Path="/acme";
+#               Part_Number="Rocket_Launcher_0001"; $Path="/acme"
+#       [form data]
+# 
+#       User selects shipping method from form.
+# 
+#   6.  Server -> User Agent
+# 
+#       HTTP/1.1 200 OK
+#       Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme"
+# 
+#       New cookie reflects shipping method.
+
+$cookie = interact($c, "http://www.acme.com/acme/shipping",
+		   'Shipping="FedEx"; Version="1"; Path="/acme"');
+
+print "not " unless $cookie =~ /^\$Version="?1"?;/ &&
+     $cookie =~ /Part_Number="?Rocket_Launcher_0001"?;\s*\$Path="\/acme"/ &&
+     $cookie =~ /Customer="?WILE_E_COYOTE"?;\s*\$Path="\/acme"/;
+print "ok 10\n";
+
+# 
+#   7.  User Agent -> Server
+# 
+#       POST /acme/process HTTP/1.1
+#       Cookie: $Version="1";
+#               Customer="WILE_E_COYOTE"; $Path="/acme";
+#               Part_Number="Rocket_Launcher_0001"; $Path="/acme";
+#               Shipping="FedEx"; $Path="/acme"
+#       [form data]
+# 
+#       User chooses to process order.
+# 
+#   8.  Server -> User Agent
+# 
+#       HTTP/1.1 200 OK
+# 
+#       Transaction is complete.
+
+$cookie = interact($c, "http://www.acme.com/acme/process");
+print "FINAL COOKIE: $cookie\n";
+print "not " unless $cookie =~ /Shipping="?FedEx"?;\s*\$Path="\/acme"/ &&
+                    $cookie =~ /WILE_E_COYOTE/;
+print "ok 11\n";
+
+# 
+# The user agent makes a series of requests on the origin server, after
+# each of which it receives a new cookie.  All the cookies have the same
+# Path attribute and (default) domain.  Because the request URLs all have
+# /acme as a prefix, and that matches the Path attribute, each request
+# contains all the cookies received so far.
+
+print $c->as_string;
+
+
+# 5.2  Example 2
+# 
+# This example illustrates the effect of the Path attribute.  All detail
+# of request and response headers has been omitted.  Assume the user agent
+# has no stored cookies.
+
+$c = HTTP::Cookies->new;
+
+# Imagine the user agent has received, in response to earlier requests,
+# the response headers
+# 
+# Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";
+#         Path="/acme"
+# 
+# and
+# 
+# Set-Cookie2: Part_Number="Riding_Rocket_0023"; Version="1";
+#         Path="/acme/ammo"
+
+interact($c, "http://www.acme.com/acme/ammo/specific",
+             'Part_Number="Rocket_Launcher_0001"; Version="1"; Path="/acme"',
+             'Part_Number="Riding_Rocket_0023"; Version="1"; Path="/acme/ammo"');
+
+# A subsequent request by the user agent to the (same) server for URLs of
+# the form /acme/ammo/...  would include the following request header:
+# 
+# Cookie: $Version="1";
+#         Part_Number="Riding_Rocket_0023"; $Path="/acme/ammo";
+#         Part_Number="Rocket_Launcher_0001"; $Path="/acme"
+# 
+# Note that the NAME=VALUE pair for the cookie with the more specific Path
+# attribute, /acme/ammo, comes before the one with the less specific Path
+# attribute, /acme.  Further note that the same cookie name appears more
+# than once.
+
+$cookie = interact($c, "http://www.acme.com/acme/ammo/...");
+print "not " unless $cookie =~ /Riding_Rocket_0023.*Rocket_Launcher_0001/;
+print "ok 12\n";
+
+# A subsequent request by the user agent to the (same) server for a URL of
+# the form /acme/parts/ would include the following request header:
+# 
+# Cookie: $Version="1"; Part_Number="Rocket_Launcher_0001"; $Path="/acme"
+# 
+# Here, the second cookie's Path attribute /acme/ammo is not a prefix of
+# the request URL, /acme/parts/, so the cookie does not get forwarded to
+# the server.
+
+$cookie = interact($c, "http://www.acme.com/acme/parts/");
+print "not " unless $cookie =~ /Rocket_Launcher_0001/ &&
+		    $cookie !~ /Riding_Rocket_0023/;
+print "ok 13\n";
+
+print $c->as_string;
+
+#-----------------------------------------------------------------------
+
+# Test rejection of Set-Cookie2 responses based on domain, path or port
+
+$c = HTTP::Cookies->new;
+
+# illegal domain (no embedded dots)
+$cookie = interact($c, "http://www.acme.com", 'foo=bar; domain=".com"');
+print "not " if count_cookies($c) > 0;
+print "ok 14\n";
+
+# legal domain
+$cookie = interact($c, "http://www.acme.com", 'foo=bar; domain="acme.com"');
+print "not " if count_cookies($c) != 1;
+print "ok 15\n";
+
+# illegal domain (host prefix "www.a" contains a dot)
+$cookie = interact($c, "http://www.a.acme.com", 'foo=bar; domain="acme.com"');
+print "not " if count_cookies($c) != 1;
+print "ok 16\n";
+
+# legal domain
+$cookie = interact($c, "http://www.a.acme.com", 'foo=bar; domain=".a.acme.com"');
+print "not " if count_cookies($c) != 2;
+print "ok 17\n";
+
+# can't use a IP-address as domain
+$cookie = interact($c, "http://125.125.125.125", 'foo=bar; domain="125.125.125"');
+print "not " if count_cookies($c) != 2;
+print "ok 18\n";
+
+# illegal path (must be prefix of request path)
+$cookie = interact($c, "http://www.sol.no", 'foo=bar; domain=".sol.no"; path="/foo"');
+print "not " if count_cookies($c) != 2;
+print "ok 19\n";
+
+# legal path
+$cookie = interact($c, "http://www.sol.no/foo/bar", 'foo=bar; domain=".sol.no"; path="/foo"');
+print "not " if count_cookies($c) != 3;
+print "ok 20\n";
+
+# illegal port (request-port not in list)
+$cookie = interact($c, "http://www.sol.no", 'foo=bar; domain=".sol.no"; port="90,100"');
+print "not " if count_cookies($c) != 3;
+print "ok 21\n";
+
+# legal port
+$cookie = interact($c, "http://www.sol.no", 'foo=bar; domain=".sol.no"; port="90,100, 80,8080"; max-age=100; Comment = "Just kidding! (\"|\\\\) "');
+print "not " if count_cookies($c) != 4;
+print "ok 22\n";
+
+# port attribute without any value (current port)
+$cookie = interact($c, "http://www.sol.no", 'foo9=bar; domain=".sol.no"; port; max-age=100;');
+print "not " if count_cookies($c) != 5;
+print "ok 23\n";
+
+# encoded path
+$cookie = interact($c, "http://www.sol.no/foo/", 'foo8=bar; path="/%66oo"');
+print "not " if count_cookies($c) != 6;
+print "ok 24\n";
+
+my $file = "lwp-cookies-$$.txt";
+$c->save($file);
+$old = $c->as_string;
+undef($c);
+
+$c = HTTP::Cookies->new;
+$c->load($file);
+unlink($file) || warn "Can't unlink $file: $!";
+
+print "not " unless $old eq $c->as_string;
+print "ok 25\n";
+
+undef($c);
+
+#
+# Try some URL encodings of the PATHs
+#
+$c = HTTP::Cookies->new;
+interact($c, "http://www.acme.com/foo%2f%25/%40%40%0Anew%E5/%E5", 'foo  =   bar; version    =   1');
+print $c->as_string;
+
+$cookie = interact($c, "http://www.acme.com/foo%2f%25/@@%0anewå/æøå", "bar=baz; path=\"/foo/\"; version=1");
+print "not " unless $cookie =~ /foo=bar/ && $cookie =~ /^\$version=\"?1\"?/i;
+print "ok 26\n";
+
+$cookie = interact($c, "http://www.acme.com/foo/%25/@@%0anewå/æøå");
+print "not " if $cookie;
+print "ok 27\n";
+
+undef($c);
+
+#
+# Try to use the Netscape cookie file format for saving
+#
+$file = "cookies-$$.txt";
+$c = HTTP::Cookies::Netscape->new(file => $file);
+interact($c, "http://www.acme.com/", "foo1=bar; max-age=100");
+interact($c, "http://www.acme.com/", "foo2=bar; port=\"80\"; max-age=100; Discard; Version=1");
+interact($c, "http://www.acme.com/", "foo3=bar; secure; Version=1");
+$c->save;
+undef($c);
+
+$c = HTTP::Cookies::Netscape->new(file => $file);
+print "not " unless count_cookies($c) == 1;     # 2 of them discarded on save
+print "ok 28\n";
+
+print "not " unless $c->as_string =~ /foo1=bar/;
+print "ok 29\n";
+undef($c);
+unlink($file);
+
+
+#
+# Some additional Netscape cookies test
+#
+$c = HTTP::Cookies->new;
+$req = HTTP::Request->new(POST => "http://foo.bar.acme.com/foo");
+
+# Netscape allows a host part that contains dots
+$res = HTTP::Response->new(200, "OK");
+$res->header(set_cookie => 'Customer=WILE_E_COYOTE; domain=.acme.com');
+$res->request($req);
+$c->extract_cookies($res);
+
+# and that the domain is the same as the host without adding a leading
+# dot to the domain.  Should not quote even if strange chars are used
+# in the cookie value.
+$res = HTTP::Response->new(200, "OK");
+$res->header(set_cookie => 'PART_NUMBER=3,4; domain=foo.bar.acme.com');
+$res->request($req);
+$c->extract_cookies($res);
+
+print $c->as_string;
+
+$req = HTTP::Request->new(POST => "http://foo.bar.acme.com/foo");
+$c->add_cookie_header($req);
+#print $req->as_string;
+print "not " unless $req->header("Cookie") =~ /PART_NUMBER=3,4/ &&
+	            $req->header("Cookie") =~ /Customer=WILE_E_COYOTE/;
+print "ok 30\n";
+
+
+
+# Test handling of local intranet hostnames without a dot
+$c->clear;
+print "---\n";
+#require LWP::Debug;
+#LWP::Debug::level('+');
+
+interact($c, "http://example/", "foo1=bar; PORT; Discard;");
+$_=interact($c, "http://example/", 'foo2=bar; domain=".local"');
+print "not " unless /foo1=bar/;
+print "ok 31\n";
+
+$_=interact($c, "http://example/", 'foo3=bar');
+$_=interact($c, "http://example/");
+print "Cookie: $_\n";
+print "not " unless /foo2=bar/ && count_cookies($c) == 3;
+print "ok 32\n";
+print $c->as_string;
+
+#-------------------------------------------------------------------
+
+sub interact
+{
+    my $c = shift;
+    my $url = shift;
+    my $req = HTTP::Request->new(POST => $url);
+    $c->add_cookie_header($req);
+    my $cookie = $req->header("Cookie");
+    my $res = HTTP::Response->new(200, "OK");
+    $res->request($req);
+    for (@_) { $res->push_header("Set-Cookie2" => $_) }
+    $c->extract_cookies($res);
+    return $cookie;
+}
+
+sub count_cookies
+{
+    my $c = shift;
+    my $no = 0;
+    $c->scan(sub { $no++ });
+    $no;
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/date.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/date.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/date.t	(revision 21083)
@@ -0,0 +1,165 @@
+use HTTP::Date;
+
+print "1..59\n";
+
+$no = 1;
+$| = 1;
+sub ok {
+   print "not " if $_[0];
+   print "ok $no\n";
+   $no++;
+}
+
+# test str2time for supported dates
+my(@tests) =
+(
+ 'Thu Feb  3 00:00:00 GMT 1994',        # ctime format
+ 'Thu Feb  3 00:00:00 1994',            # same as ctime, except no TZ
+
+ 'Thu, 03 Feb 1994 00:00:00 GMT',       # proposed new HTTP format
+ 'Thursday, 03-Feb-94 00:00:00 GMT',    # old rfc850 HTTP format
+ 'Thursday, 03-Feb-1994 00:00:00 GMT',  # broken rfc850 HTTP format
+
+ '03/Feb/1994:00:00:00 0000',   # common logfile format
+ '03/Feb/1994:01:00:00 +0100',  # common logfile format
+ '02/Feb/1994:23:00:00 -0100',  # common logfile format
+
+ '03 Feb 1994 00:00:00 GMT',    # HTTP format (no weekday)
+ '03-Feb-94 00:00:00 GMT',      # old rfc850 (no weekday)
+ '03-Feb-1994 00:00:00 GMT',    # broken rfc850 (no weekday)
+ '03-Feb-1994 00:00 GMT',       # broken rfc850 (no weekday, no seconds)
+ '03-Feb-1994 00:00',           # VMS dir listing format
+
+ '03-Feb-94',    # old rfc850 HTTP format    (no weekday, no time)
+ '03-Feb-1994',  # broken rfc850 HTTP format (no weekday, no time)
+ '03 Feb 1994',  # proposed new HTTP format  (no weekday, no time)
+ '03/Feb/1994',  # common logfile format     (no time, no offset)
+
+ #'Feb  3 00:00',     # Unix 'ls -l' format (can't really test it here)
+ 'Feb  3 1994',       # Unix 'ls -l' format
+
+ "02-03-94  12:00AM", # Windows 'dir' format
+
+ # ISO 8601 formats
+ '1994-02-03 00:00:00 +0000',
+ '1994-02-03',
+ '19940203',
+ '1994-02-03T00:00:00+0000',
+ '1994-02-02T23:00:00-0100',
+ '1994-02-02T23:00:00-01:00',
+ '1994-02-03T00:00:00 Z',
+ '19940203T000000Z',
+ '199402030000',
+
+ # A few tests with extra space at various places
+ '  03/Feb/1994      ',
+ '  03   Feb   1994  0:00  ',
+);
+
+my $time = 760233600;  # assume broken POSIX counting of seconds
+for (@tests) {
+    if (/GMT/i) {
+	$t = str2time($_);
+    } else {
+	$t = str2time($_, "GMT");
+    }
+    $t = "UNDEF" unless defined $t;
+    print "'$_'  =>  $t\n";
+    print $@ if $@;
+    print "not " if $t eq 'UNDEF' || $t != $time;
+    ok;
+}
+
+# test time2str
+die "time2str failed"
+    unless time2str($time) eq 'Thu, 03 Feb 1994 00:00:00 GMT';
+
+# test the 'ls -l' format with missing year$
+# round to nearest minute 3 days ago.
+$time = int((time - 3 * 24*60*60) /60)*60;
+($min, $hr, $mday, $mon) = (localtime $time)[1,2,3,4];
+$mon = (qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec))[$mon];
+$str = sprintf("$mon %02d %02d:%02d", $mday, $hr, $min);
+$t = str2time($str);
+$t = "UNDEF" unless defined $t;
+print "'$str'  =>  $t ($time)\n";
+print "not " if $t != $time;
+ok;
+
+# try some out of bounds date and some garbage.
+for ('03-Feb-1969', '03-Feb-2039',
+     undef, '', 'Garbage',
+     'Mandag 16. September 1996',
+     'Thu Feb  3 00:00:00 CET 1994',
+     'Thu, 03 Feb 1994 00:00:00 CET',
+     'Wednesday, 31-Dec-69 23:59:59 GMT',
+
+     '1980-00-01',
+     '1980-13-01',
+     '1980-01-00',
+     '1980-01-32',
+     '1980-01-01 25:00:00',
+     '1980-01-01 00:61:00',
+     '1980-01-01 00:00:61',
+    )
+{
+    my $bad = 0;
+    eval {
+	if (defined str2time $_) {
+	    print "str2time($_) is not undefined\n";
+	    $bad++;
+	}
+    };
+    print defined($_) ? "'$_'\n" : "undef\n";
+    print $@ if $@;
+    print "not " if $bad;
+    ok;
+}
+
+print "Testing AM/PM gruff...\n";
+
+$t = time2iso(str2time("11-12-96  0:00AM"));print "$t\n";
+ok($t ne "1996-11-12 00:00:00");
+
+$t = time2iso(str2time("11-12-96 12:00AM"));print "$t\n";
+ok($t ne "1996-11-12 00:00:00");
+
+$t = time2iso(str2time("11-12-96  0:00PM"));print "$t\n";
+ok($t ne "1996-11-12 12:00:00");
+
+$t = time2iso(str2time("11-12-96 12:00PM"));print "$t\n";
+ok($t ne "1996-11-12 12:00:00");
+
+
+$t = time2iso(str2time("11-12-96  1:05AM"));print "$t\n";
+ok($t ne "1996-11-12 01:05:00");
+
+$t = time2iso(str2time("11-12-96 12:05AM"));print "$t\n";
+ok($t ne "1996-11-12 00:05:00");
+
+$t = time2iso(str2time("11-12-96  1:05PM"));print "$t\n";
+ok($t ne "1996-11-12 13:05:00");
+
+$t = time2iso(str2time("11-12-96 12:05PM"));print "$t\n";
+ok($t ne "1996-11-12 12:05:00");
+
+
+
+# Test the str2iso routines
+use HTTP::Date qw(time2iso time2isoz);
+
+print "Testing time2iso functions\n";
+
+$a = time2iso;
+$b = time2iso(500000);
+print "LOCAL $a  $b\n";
+$az = time2isoz;
+$bz = time2isoz(500000);
+print "GMT   $az $bz\n";
+
+for ($a,  $b)  { ok if /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d$/;  }
+for ($az, $bz) { ok if /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\dZ$/; }
+
+
+
+print "HTTP::Date $HTTP::Date::VERSION tested ok\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-auth.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-auth.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-auth.t	(revision 21083)
@@ -0,0 +1,40 @@
+print "1..4\n";
+
+use HTTP::Response;
+use HTTP::Headers::Auth;
+
+$res = HTTP::Response->new(401);
+$res->push_header(WWW_Authenticate => qq(Foo realm="WallyWorld", foo=bar, Bar realm="WallyWorld2"));
+$res->push_header(WWW_Authenticate => qq(Basic Realm="WallyWorld", foo=bar, bar=baz));
+
+print $res->as_string;
+
+%auth = $res->www_authenticate;
+
+print "not " unless keys(%auth) == 3;
+print "ok 1\n";
+
+print "not " unless $auth{basic}{realm} eq "WallyWorld" &&
+                    $auth{bar}{realm} eq "WallyWorld2";
+print "ok 2\n";
+
+$a = $res->www_authenticate;
+print "not " unless $a eq 'Foo realm="WallyWorld", foo=bar, Bar realm="WallyWorld2", Basic Realm="WallyWorld", foo=bar, bar=baz';
+print "ok 3\n";
+
+$res->www_authenticate("Basic realm=foo1");
+print $res->as_string;
+
+$res->www_authenticate(Basic => {realm => foo2});
+print $res->as_string;
+
+$res->www_authenticate(Basic => [realm => foo3, foo=>33],
+Digest => {nonce=>"bar", foo=>'foo'});
+print $res->as_string;
+
+$_ = $res->as_string;
+
+print "not " unless /WWW-Authenticate: Basic realm="foo3", foo=33/ &&
+                    /WWW-Authenticate: Digest nonce=bar, foo=foo/;
+print "ok 4\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-etag.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-etag.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-etag.t	(revision 21083)
@@ -0,0 +1,28 @@
+print "1..4\n";
+
+require HTTP::Headers::ETag;
+
+$h = HTTP::Headers->new;
+$h->etag("tag1");
+print "not " unless $h->etag eq qq("tag1");
+print "ok 1\n";
+
+$h->etag("w/tag2");
+print "not " unless $h->etag eq qq(W/"tag2");
+print "ok 2\n";
+
+$h->if_match(qq(W/"foo", bar, baz), "bar");
+$h->if_none_match(333);
+
+$h->if_range("tag3");
+print "not " unless $h->if_range eq qq("tag3");
+print "ok 3\n";
+
+$t = time;
+$h->if_range($t);
+print "not " unless $h->if_range == $t;
+print "ok 4\n";
+
+
+print $h->as_string;
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-util.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-util.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers-util.t	(revision 21083)
@@ -0,0 +1,61 @@
+use strict;
+use HTTP::Headers::Util qw(split_header_words join_header_words);
+
+my $extra_tests = 2;
+
+my @s_tests = (
+
+   ["foo"                     => "foo"],
+   ["foo=bar"                 => "foo=bar"],
+   ["   foo   "               => "foo"],
+   ["foo="                    => 'foo=""'],
+   ["foo=bar bar=baz"         => "foo=bar; bar=baz"],
+   ["foo=bar;bar=baz"         => "foo=bar; bar=baz"],
+   ['foo bar baz'             => "foo; bar; baz"],
+   ['foo="\"" bar="\\\\"'     => 'foo="\""; bar="\\\\"'],
+   ['foo,,,bar'               => 'foo, bar'],
+   ['foo=bar,bar=baz'         => 'foo=bar, bar=baz'],
+
+   ['text/html; charset=iso-8859-1' =>
+    'text/html; charset="iso-8859-1"'],
+
+   ['foo="bar"; port="80,81"; discard, bar=baz' =>
+    'foo=bar; port="80,81"; discard, bar=baz'],
+
+   ['Basic realm="\"foo\\\\bar\""' =>
+    'Basic; realm="\"foo\\\\bar\""'],
+);
+
+print "1..", @s_tests + $extra_tests, "\n";
+
+my $testno = 1;
+
+print "split_header_words() tests\n";
+for (@s_tests) {
+   my($arg, $expect) = @$_;
+   my @arg = ref($arg) ? @$arg : $arg;
+
+   my $res = join_header_words(split_header_words(@arg));
+   if ($res ne $expect) {
+       print "\nUnexpected result: '$res'\n";
+       print "         Expected: '$expect'\n";
+       print "  when parsing '", join(", ", @arg), "'\n";
+       eval {
+	   require Data::Dumper;
+           my @p = split_header_words(@arg);
+           print Data::Dumper::Dumper(\@p);
+       };
+       print "not ";
+   }
+   print "ok ", $testno++, "\n";
+}
+
+
+print "Extra tests\n";
+# some extra tests
+print "not " unless join_header_words("foo" => undef, "bar" => "baz")
+                    eq "foo; bar=baz";
+print "ok ", $testno++, "\n";
+
+print "not " unless join_header_words() eq "";
+print "ok ", $testno++, "\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/headers.t	(revision 21083)
@@ -0,0 +1,128 @@
+require HTTP::Headers;
+
+print "1..11\n";
+
+$h = new HTTP::Headers
+	mime_version  => "1.0",
+	content_type  => "text/html";
+
+$h->header(URI => "http://www.oslonett.no/");
+
+if ($h->header("MIME-Version") eq "1.0") {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+if ($h->header('Uri') =~ /^http:/) {
+    print "ok 2\n";
+} else {
+    print "not ok 2\n";
+}
+
+
+$h->header("MY-header" => "foo",
+	   "Date" => "somedate",
+	   "Accept" => ["text/plain", "image/*"],
+	  );
+$h->push_header("accept" => "audio/basic");
+
+if ($h->header("date") eq "somedate") {
+     print "ok 3\n";
+}
+
+@accept = $h->header("accept");
+if (@accept == 3) {
+    print "ok 4\n";
+}
+
+$h->remove_header("uri", "date");
+
+
+$str = $h->as_string;
+print "\nHeader looks like this now:\n$str\n";
+
+$lines = ($str =~ tr/\n/\n/);
+
+if ($lines == 6) {
+    print "ok 5\n";
+} else {
+    print "Header has $lines lines\n";
+    print "not ok 5\n";
+}
+
+$h2 = $h->clone;
+
+$h->header("accept", "*/*");
+$h->remove_header("my-header");
+
+@accept = $h2->header("accept");
+if (@accept == 3) {
+    print "ok 6\n";
+}
+
+@accept = $h->header("accept");
+if (@accept == 1) {
+    print "ok 7\n";
+}
+
+# Check order of headers, but first remove this one
+$h2->remove_header('mime_version');
+
+# and add this general header
+$h2->header(Connection => 'close');
+
+@x = ();
+$h2->scan(sub {push(@x, shift);});
+
+$str = join(";", @x);
+$expected = "Connection;Accept;Accept;Accept;Content-Type;MY-Header";
+
+if ($str eq $expected) {
+    print "ok 8\n";
+} else {
+    print "Headers are '$str',\nexpected    '$expected'\n";
+    print "not ok 8\n";
+}
+
+# Check headers with embedded newlines:
+
+$h = new HTTP::Headers
+	a => "foo\n\n",
+	b => "foo\nbar",
+	c => "foo\n\nbar\n\n",
+	d => "foo\n\tbar";
+$str = $h->as_string("<<\n");
+print "-----\n$str------\n";
+
+print "not " unless $str =~ /^A:\s*foo<<\n
+                              B:\s*foo<<\n
+	                        \s+bar<<\n
+                              C:\s*foo<<\n
+                                \s+bar<<\n
+	                      D:\s*foo<<\n
+                                \t bar<<\n
+                             $/x;
+print "ok 9\n";
+
+
+# Check with FALSE $HTML::Headers::TRANSLATE_UNDERSCORE
+
+local($HTTP::Headers::TRANSLATE_UNDERSCORE);
+$HTTP::Headers::TRANSLATE_UNDERSCORE = undef;  # avoid -w warning
+
+$h = HTTP::Headers->new;
+
+$h->header(abc_abc   => "foo");
+$h->header("abc-abc" => "bar");
+
+#print $h->as_string;
+
+print "not " unless $h->header("ABC_ABC") eq "foo" &&
+                    $h->header("ABC-ABC") eq "bar";
+print "ok 10\n";
+
+$h->remove_header("Abc_Abc");
+print "not " unless !defined($h->header("abc_abc")) &&
+                    $h->header("ABC-ABC") eq "bar";
+print "ok 11\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/listing.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/listing.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/listing.t	(revision 21083)
@@ -0,0 +1,86 @@
+print "1..6\n";
+
+
+use File::Listing;
+
+$dir = <<'EOL';
+total 68
+drwxr-xr-x   4 aas      users        1024 Mar 16 15:47 .
+drwxr-xr-x  11 aas      users        1024 Mar 15 19:22 ..
+drwxr-xr-x   2 aas      users        1024 Mar 16 15:47 CVS
+-rw-r--r--   1 aas      users        2384 Feb 26 21:14 Debug.pm
+-rw-r--r--   1 aas      users        2145 Feb 26 20:09 IO.pm
+-rw-r--r--   1 aas      users        3960 Mar 15 18:05 MediaTypes.pm
+-rw-r--r--   1 aas      users         792 Feb 26 20:12 MemberMixin.pm
+drwxr-xr-x   3 aas      users        1024 Mar 15 18:05 Protocol
+-rw-r--r--   1 aas      users        5613 Feb 26 20:16 Protocol.pm
+-rw-r--r--   1 aas      users        5963 Feb 26 21:27 RobotUA.pm
+-rw-r--r--   1 aas      users        5071 Mar 16 12:25 Simple.pm
+-rw-r--r--   1 aas      users        8817 Mar 15 18:05 Socket.pm
+-rw-r--r--   1 aas      users        2121 Feb  5 14:22 TkIO.pm
+-rw-r--r--   1 aas      users       19628 Mar 15 18:05 UserAgent.pm
+-rw-r--r--   1 aas      users        2841 Feb  5 19:06 media.types
+
+CVS:
+total 5
+drwxr-xr-x   2 aas      users        1024 Mar 16 15:47 .
+drwxr-xr-x   4 aas      users        1024 Mar 16 15:47 ..
+-rw-r--r--   1 aas      users         545 Mar 16 15:47 Entries
+-rw-r--r--   1 aas      users          39 Mar 10 09:05 Repository
+-rw-r--r--   1 aas      users          19 Mar 10 09:05 Root
+
+Protocol:
+total 37
+drwxr-xr-x   3 aas      users        1024 Mar 15 18:05 .
+drwxr-xr-x   4 aas      users        1024 Mar 16 15:47 ..
+drwxr-xr-x   2 aas      users        1024 Mar 15 18:05 CVS
+-rw-r--r--   1 aas      users        4646 Feb 26 20:13 file.pm
+-rw-r--r--   1 aas      users       13006 Mar 15 18:05 ftp.pm
+-rw-r--r--   1 aas      users        5935 Mar  6 10:29 gopher.pm
+-rw-r--r--   1 aas      users        5453 Mar  6 10:29 http.pm
+-rw-r--r--   1 aas      users        2365 Feb 26 20:13 mailto.pm
+
+Protocol/CVS:
+total 5
+drwxr-xr-x   2 aas      users        1024 Mar 15 18:05 .
+drwxr-xr-x   3 aas      users        1024 Mar 15 18:05 ..
+-rw-r--r--   1 aas      users         238 Mar 15 18:05 Entries
+-rw-r--r--   1 aas      users          48 Mar 10 09:05 Repository
+-rw-r--r--   1 aas      users          19 Mar 10 09:05 Root
+EOL
+
+@dir = parse_dir($dir, undef, 'unix');
+
+print int(@dir) ." lines found\n";
+@dir != 25 && print "not ";
+print "ok 1\n";
+
+for (@dir) {
+   ($name, $type, $size, $mtime, $mode) = @$_;
+   $size ||= 0;  # ensure that it is defined
+   printf "%-25s $type %6d  ", $name, $size;
+   print scalar(localtime($mtime));
+   printf "  %06o", $mode;
+   print "\n";
+}
+
+# Pick out the Socket.pm line as the sample we check carefully
+($name, $type, $size, $mtime, $mode) = @{$dir[9]};
+
+$name eq "Socket.pm" || print "not ";
+print "ok 2\n";
+
+$type eq "f" || print "not ";
+print "ok 3\n";
+
+$size == 8817 || print "not ";
+print "ok 4\n";
+
+# Must be careful when checking the time stamps because we don't know
+# which year if this script lives for a long time.
+$timestring = scalar(localtime($mtime));
+$timestring =~ /Mar\s+15\s+18:05/ or print "not ";
+print "ok 5\n";
+
+$mode == 0100644 || print "not ";
+print "ok 6\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/mediatypes.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/mediatypes.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/mediatypes.t	(revision 21083)
@@ -0,0 +1,87 @@
+use LWP::MediaTypes;
+
+require URI::URL;
+
+$url1 = new URI::URL 'http://www/foo/test.gif?search+x#frag';
+$url2 = new URI::URL 'http:test';
+
+$file = "/etc/passwd";
+-r $file or $file = "./README";
+
+@tests =
+(
+ ["/this.dir/file.html" => "text/html",],
+ ["test.gif.htm"        => "text/html",],
+ ["test.txt.gz"         => "text/plain", "gzip"],
+ ["gif.foo"             => "application/octet-stream",],
+ ["lwp-0.03.tar.Z"      => "application/x-tar", "compress"],
+ [$file		        => "text/plain",],
+ ["/random/file"        => "application/octet-stream",],
+ ["/dev/null"	        => "text/plain",],
+ [$url1	        	=> "image/gif",],
+ [$url2	        	=> "application/octet-stream",],
+ ["x.ppm.Z.UU"		=> "image/x-portable-pixmap","compress","x-uuencode",],
+);
+
+$notests = @tests + 3;
+print "1..$notests\n";
+
+if (-f "$ENV{HOME}/.mime.types") {
+   warn "
+The MediaTypes test might fail because you have a private ~/.mime.types file
+If you get a failed test, try to move it away while testing.
+";
+}
+
+
+$testno = 1;
+for (@tests) {
+    ($file, $expectedtype, @expectedEnc) = @$_;
+    $type1 = guess_media_type($file);
+    ($type, @enc) = guess_media_type($file);
+    if ($type1 ne $type) {
+       print "guess_media_type does not return same content-type in scalar and array conext.\n";
+	next;
+    }
+    $type = "undef" unless defined $type;
+    if ($type eq $expectedtype and "@enc" eq "@expectedEnc") {
+	print "ok $testno\n";
+    } else {
+	print "expected '$expectedtype' for '$file', got '$type'\n";
+	print "encoding: expected: '@expectedEnc', got '@enc'\n"
+	  if @expectedEnc || @enc;
+	print "nok ok $testno\n";
+    }
+    $testno++;
+}
+
+@imgSuffix = media_suffix('image/*');
+print "Image suffixes: @imgSuffix\n";
+
+print "\n";
+require HTTP::Response;
+$r = new HTTP::Response 200, "Document follows";
+$r->title("file.tar.gz.uu");
+guess_media_type($r->title, $r);
+print $r->as_string;
+
+print "not " unless $r->content_type eq "application/x-tar";
+print "ok $testno\n"; $testno++;
+
+@enc = $r->header("Content-Encoding");
+print "not " unless "@enc" eq "gzip x-uuencode";
+print "ok $testno\n"; $testno++;
+
+#
+use LWP::MediaTypes qw(add_type add_encoding);
+add_type("x-world/x-vrml", qw(wrl vrml));
+add_encoding("x-gzip" => "gz");
+add_encoding(rot13 => "r13");
+
+@x = guess_media_type("foo.vrml.r13.gz");
+#print "@x\n";
+print "not " unless "@x" eq "x-world/x-vrml rot13 x-gzip";
+print "ok $testno\n"; $testno++;
+
+#print LWP::MediaTypes::_dump();
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/message.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/message.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/message.t	(revision 21083)
@@ -0,0 +1,104 @@
+print "1..15\n";
+
+require HTTP::Request;
+require HTTP::Response;
+
+$req = new HTTP::Request 'GET', "http://www.sn.no/";
+$req->header(
+	"if-modified-since" => "Thu, 03 Feb 1994 00:00:00 GMT",
+	"mime-version"      => "1.0");
+
+$str = $req->as_string;
+
+print $str;
+
+$str =~ /^GET/m || print "not ";
+print "ok 1\n";
+
+$req->header("MIME-Version") eq "1.0" || print "not ";
+print "ok 2\n";
+
+$req->content("gisle");
+$req->add_content(" aas");
+$req->add_content(\ " old interface is depreciated");
+
+${$req->content_ref} =~ s/\s+is\s+depreciated//;
+
+print "Content is: ", $req->content, "\n";
+
+$req->content eq "gisle aas old interface" || print "not ";
+print "ok 3\n";
+
+$req->if_modified_since == 760233600 || print "not ";
+print "ok 4\n";
+
+$time = time;
+
+$req->date($time);
+$timestr = gmtime($time);
+($month) = ($timestr =~ /^\S+\s+(\S+)/);  # extract month;
+
+print "These should represent the same time:\n\t", $req->header('Date'), "\n\t$timestr\n";
+
+$req->header('Date') =~ /\Q$month/ || print "not ";
+print "ok 5\n";
+
+$req->authorization_basic("gisle", "passwd");
+$auth = $req->header("Authorization");
+
+print "$auth\n";
+$auth =~ /Z2lzbGU6cGFzc3dk/ || print "not ";
+print "ok 6\n";
+
+($user, $pass) = $req->authorization_basic;
+($user eq "gisle" && $pass eq "passwd") || print "not ";
+print "ok 7\n";
+
+# Check the response
+$res = new HTTP::Response 200, "This message";
+
+$html = $res->error_as_HTML;
+print $html;
+
+($html =~ /<head>/i && $html =~ /This message/) || print "not ";
+print "ok 8\n";
+
+$res->is_success || print "not ";
+print "ok 9\n";
+
+$res->content_type("text/html;version=3.0");
+$res->content("<html>...</html>\n");
+
+$res2 = $res->clone;
+
+print $res2->as_string;
+
+$res2->header("cOntent-TYPE") eq "text/html;version=3.0" || print "not ";
+print "ok 10\n";
+
+$res2->code == 200 || print "not ";
+print "ok 11\n";
+
+$res2->content =~ />\.\.\.</ || print "not ";
+print "ok 12\n";
+
+# Check the base method:
+
+$res = new HTTP::Response 200, "This message";
+$res->request($req);
+$res->content_type("image/gif");
+
+$res->base eq "http://www.sn.no/" || print "not ";
+print "ok 13\n";
+
+$res->header('Base', 'http://www.sn.no/xxx/');
+
+$res->base eq "http://www.sn.no/xxx/" || print "not ";
+print "ok 14\n";
+
+# Check the AUTLOAD delegate method with regular expressions
+"This string contains text/html" =~ /(\w+\/\w+)/;
+$res->content_type($1);
+
+$res->content_type eq "text/html" || print "not ";
+print "ok 15\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/negotiate.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/negotiate.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/negotiate.t	(revision 21083)
@@ -0,0 +1,105 @@
+print "1..3\n";
+
+use HTTP::Request;
+use HTTP::Negotiate;
+
+
+$no = 1;
+sub ok
+{
+    print "ok " . $no++ . "\n";
+}
+
+sub not_ok
+{
+    print "not ";
+    ok;
+}
+
+
+ #  ID       QS     Content-Type             Encoding     Char-Set      Lang    Size
+ $variants =
+  [
+   ['var1',  0.950, 'text/plain',           ['uuencode',
+					     'compress'], 'iso-8859-2', 'se',    400],
+   ['var2',  1.000, 'text/html;version=2.0', 'gzip',      'iso-8859-1', 'en',   3000],
+   ['var3',  0.333, 'image/gif',            undef,        undef,        undef, 43555],
+ ];
+
+
+# First we try a request with not accept headers
+$request = new HTTP::Request 'GET', 'http://localhost/';
+@a = choose($variants, $request);
+show_res(@a);
+expect(\@a, [['var2' => 1],
+	     ['var1' => 0.95],
+	     ['var3' => 0.333]
+	    ]
+);
+
+
+$a = choose($variants, $request);
+print "The chosen one is '$a'\n";
+if ($a eq 'var2') {
+    ok;
+} else {
+    not_ok;
+}
+
+#------------------
+
+$request = new HTTP::Request 'GET', 'http://localhost/';
+$request->header('Accept', 'text/plain; q=0.55, image/gif; mbx=10000');
+$request->push_header('Accept', 'text/*; q=0.25');
+$request->header('Accept-Language', 'no, en');
+$request->header('Accept-Charset', 'iso-8859-1');
+$request->header('Accept-Encoding', 'gzip');
+
+@a = choose($variants, $request);
+show_res(@a);
+expect(\@a, [['var2' => 0.25],
+	     ['var1' => 0],
+	     ['var3' => 0]
+	    ]
+);
+
+
+
+
+#------------------
+
+sub expect
+{
+    my($res, $exp) = @_;
+    do {
+	$a = shift @$res;
+	$b = shift @$exp;
+	last if defined($a) ne defined($b);
+	if (defined($a)) {
+	    ($va, $qa) = @$a;
+	    ($vb, $qb) = @$b;
+	    if ($va ne $vb) {
+		print "$va == $vb ?\n";
+		not_ok;
+		return;
+	    }
+	    if (abs($qa - $qb) > 0.002) {
+		print "$qa ~= $qb ?\n";
+		not_ok;
+		return;
+	    }
+	}
+
+    } until (!defined($a) || !defined($b));
+    return not_ok if defined($a) ne defined($b);
+    ok;
+}
+
+sub show_res
+{
+    print "-------------\n";
+    for (@_) {
+	printf "%-6s %.3f\n", @$_;
+    }
+    print "-------------\n";
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/response.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/response.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/response.t	(revision 21083)
@@ -0,0 +1,86 @@
+
+# Test extra HTTP::Response methods.  Basic operation is tested in the
+# message.t test suite.
+
+
+print "1..7\n";
+
+
+use HTTP::Date;
+use HTTP::Request;
+use HTTP::Response;
+
+my $time = time;
+
+$req = HTTP::Request->new(GET => 'http://www.sn.no');
+$req->date($time - 30);
+
+$r = new HTTP::Response 200, "OK";
+$r->client_date($time - 20);
+$r->date($time - 25);
+$r->last_modified($time - 5000000);
+$r->request($req);
+
+print $r->as_string;
+
+$current_age = $r->current_age;
+
+if ($current_age < 35  || $current_age > 40) {
+    print "not ";
+}
+print "ok 1\n";
+
+$freshness_lifetime = $r->freshness_lifetime;
+if ($freshness_lifetime < 12 * 3600) {
+    print "not ";
+}
+print "ok 2\n";
+
+$is_fresh = $r->is_fresh;
+
+print "not " unless $is_fresh;
+print "ok 3\n";
+
+print "current_age        = $current_age\n";
+print "freshness_lifetime = $freshness_lifetime\n";
+print "response is ";
+print "not " unless $is_fresh;
+print "fresh\n";
+
+
+print "it will be fresh is ";
+print $freshness_lifetime - $current_age;
+print " more seconds\n";
+
+# OK, now we add an Expires header
+$r->expires($time);
+print $r->as_string;
+
+$freshness_lifetime = $r->freshness_lifetime;
+print "freshness_lifetime = $freshness_lifetime\n";
+print "not " unless $freshness_lifetime == 25;
+print "ok 4\n";
+$r->remove_header('expires');
+
+# Now we try the 'Age' header and the Cache-Contol:
+
+$r->header('Age', 300);
+$r->push_header('Cache-Control', 'junk');
+$r->push_header(Cache_Control => 'max-age = 10');
+
+print $r->as_string;
+
+$current_age = $r->current_age;
+$freshness_lifetime = $r->freshness_lifetime;
+
+print "current_age        = $current_age\n";
+print "freshness_lifetime = $freshness_lifetime\n";
+
+print "not " if $current_age < 300;
+print "ok 5\n";
+
+print "not " if $freshness_lifetime != 10;
+print "ok 6\n";
+
+print "not " unless $r->fresh_until;  # should return something
+print "ok 7\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/status.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/status.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/base/status.t	(revision 21083)
@@ -0,0 +1,32 @@
+use HTTP::Status;
+
+print "1..8\n";
+
+200 == RC_OK || print "not ";
+print "ok 1\n";
+
+is_success(RC_ACCEPTED) || print "not ";
+print "ok 2\n";
+
+is_error(RC_BAD_REQUEST) || print "not ";
+print "ok 3\n";
+
+is_redirect(RC_MOVED_PERMANENTLY) || print "not ";
+print "ok 4\n";
+
+is_success(RC_NOT_FOUND) && print "not ";
+print "ok 5\n";
+
+$mess = status_message(0);
+
+defined $mess && print "not ";
+print "ok 6\n";
+
+$mess = status_message(200);
+
+if ($mess =~ /ok/i) {
+    print "ok 7\n";
+}
+
+is_info(RC_CONTINUE) || print "not ";
+print "ok 8\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/autoload.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/autoload.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/autoload.t	(revision 21083)
@@ -0,0 +1,30 @@
+#
+# See if autoloading of protocol schemes work
+#
+
+print "1..1\n";
+
+require LWP::UserAgent;
+# note no LWP::Protocol::file;
+
+# localhost will not work on win32 (when networking is disabled)
+$url = $^O eq 'MSWin32' ? 'file:.' : 'file://localhost/';
+
+print "Trying to fetch " . (new URI::URL $url)->local_path . " ...\n";
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+$ua->timeout(30);               # timeout in seconds
+#$ua->use_alarm(0);               # don't use alarms
+#$ua->use_eval(0);                # don't eval, just die when thing go wrong
+				# (easier to read while debugging)
+
+my $request = new HTTP::Request('GET', $url);
+
+my $response = $ua->request($request, undef, undef);
+if ($response->is_success) {
+    print "ok 1\n";
+} else {
+    print $response->error_as_HTML;
+    print "not ok 1\n";
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/get.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/get.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/get.t	(revision 21083)
@@ -0,0 +1,85 @@
+#
+# Test retrieving a file with a 'file://' URL,
+#
+
+# First locate some suitable tmp-dir.  We need an absolute path.
+$TMPDIR = undef;
+for ("/tmp/", "/var/tmp", "/usr/tmp", "/local/tmp") {
+    if (open(TEST, ">$_/test-$$")) {
+        close(TEST);
+	unlink("$_/test-$$");
+	$TMPDIR = $_;
+	last;
+    }
+}
+$TMPDIR ||= $ENV{TEMP} if $^O eq 'MSWin32';
+unless ($TMPDIR) {
+   # Can't run any tests
+   print "1..0\n";
+   print "ok 1\n";
+   exit;
+}
+$TMPDIR =~ tr|\\|/|;
+print "1..2\n";
+
+use LWP::Simple;
+require LWP::Protocol::file;
+
+my $orig = "$TMPDIR/lwp-orig-$$";          # local file
+my $copy = "$TMPDIR/lwp-copy-$$"; 	    # downloaded copy
+
+# First we create the original
+open(OUT, ">$orig") or die "Cannot open $orig: $!";
+for (1..100) {
+    print OUT "This is line $_ of $orig\n";
+}
+close(OUT);
+
+
+# Then we make a test using getprint(), so we need to capture stdout
+open (OUT, ">$copy") or die "Cannot open $copy: $!";
+select(OUT);
+
+# do the retrieval
+getprint("file://localhost" . ($orig =~ m|^/| ? $orig : "/$orig"));
+
+close(OUT);
+select(STDOUT);
+
+# read and compare the files
+open(IN, $orig) or die "Cannot open '$orig': $!";
+undef($/);
+$origtext = <IN>;
+close(IN);
+open(IN, $copy) or die "Cannot open '$copy': $!";
+undef($/);
+$copytext = <IN>;
+close(IN);
+
+unlink($copy);
+
+if ($origtext eq $copytext) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+
+# Test getstore() function
+
+getstore("file:$orig", $copy);
+
+# Take a look at the new copy
+open(IN, $copy) or die "Cannot open '$copy': $!";
+undef($/);
+$copytext = <IN>;
+close(IN);
+
+unlink($orig);
+unlink($copy);
+
+if ($origtext eq $copytext) {
+    print "ok 2\n";
+} else {
+    print "not ok 2\n";
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/http.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/http.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/http.t	(revision 21083)
@@ -0,0 +1,319 @@
+$| = 1; # autoflush
+
+require IO::Socket;  # make sure this work before we try to make a HTTP::Daemon
+
+# First we make ourself a daemon in another process
+my $D = shift || '';
+if ($D eq 'daemon') {
+
+    require HTTP::Daemon;
+
+    my $d = new HTTP::Daemon Timeout => 10;
+
+    print "Please to meet you at: <URL:", $d->url, ">\n";
+    open(STDOUT, ">/dev/null");
+
+    while ($c = $d->accept) {
+	$r = $c->get_request;
+	if ($r) {
+	    my $p = ($r->url->path_components)[1];
+	    my $func = lc("httpd_" . $r->method . "_$p");
+	    if (defined &$func) {
+		&$func($c, $r);
+	    } else {
+		$c->send_error(404);
+	    }
+	}
+	$c = undef;  # close connection
+    }
+    print STDERR "HTTP Server terminated\n";
+    exit;
+}
+else {
+    use Config;
+    open(DAEMON, "$Config{'perlpath'} local/http.t daemon |") or die "Can't exec daemon: $!";
+}
+
+print "1..18\n";
+
+
+my $greeting = <DAEMON>;
+$greeting =~ /(<[^>]+>)/;
+
+require URI::URL;
+URI::URL->import;
+my $base = new URI::URL $1;
+
+print "Will access HTTP server at $base\n";
+
+require LWP::UserAgent;
+require HTTP::Request;
+$ua = new LWP::UserAgent;
+$ua->agent("Mozilla/0.01 " . $ua->agent);
+$ua->from('gisle@aas.no');
+
+#----------------------------------------------------------------
+print "Bad request...\n";
+$req = new HTTP::Request GET => url("/not_found", $base);
+$req->header(X_Foo => "Bar");
+$res = $ua->request($req);
+
+print "not " unless $res->is_error
+                and $res->code == 404
+                and $res->message =~ /not\s+found/i;
+print "ok 1\n";
+# we also expect a few headers
+print "not " if !$res->server and !$res->date;
+print "ok 2\n";
+
+#----------------------------------------------------------------
+print "Simple echo...\n";
+sub httpd_get_echo
+{
+    my($c, $req) = @_;
+    $c->send_basic_header(200);
+    print $c "Content-Type: text/plain\015\012";
+    $c->send_crlf;
+    print $c $req->as_string;
+}
+
+$req = new HTTP::Request GET => url("/echo/path_info?query", $base);
+$req->push_header(Accept => 'text/html');
+$req->push_header(Accept => 'text/plain; q=0.9');
+$req->push_header(Accept => 'image/*');
+$req->if_modified_since(time - 300);
+$req->header(Long_text => 'This is a very long header line
+which is broken between
+more than one line.');
+$req->header(X_Foo => "Bar");
+
+$res = $ua->request($req);
+#print $res->as_string;
+
+print "not " unless $res->is_success
+               and  $res->code == 200 && $res->message eq "OK";
+print "ok 3\n";
+
+$_ = $res->content;
+@accept = /^Accept:\s*(.*)/mg;
+
+print "not " unless /^From:\s*gisle\@aas\.no$/m
+                and /^Host:/m
+                and @accept == 3
+	        and /^Accept:\s*text\/html/m
+	        and /^Accept:\s*text\/plain/m
+	        and /^Accept:\s*image\/\*/m
+		and /^If-Modified-Since:\s*\w{3},\s+\d+/m
+                and /^Long-Text:\s*This.*broken between/m
+		and /^X-Foo:\s*Bar$/m
+		and /^User-Agent:\s*Mozilla\/0.01/m;
+print "ok 4\n";
+
+#----------------------------------------------------------------
+print "Send file...\n";
+
+my $file = "test-$$.html";
+open(FILE, ">$file") or die "Can't create $file: $!";
+binmode FILE or die "Can't binmode $file: $!";
+print FILE <<EOT;
+<html><title>En prøve</title>
+<h1>Dette er en testfil</h1>
+Jeg vet ikke hvor stor fila behøver å være heller, men dette
+er sikkert nok i massevis.
+EOT
+close(FILE);
+
+sub httpd_get_file
+{
+    my($c, $r) = @_;
+    my %form = $r->url->query_form;
+    my $file = $form{'name'};
+    $c->send_file_response($file);
+    unlink($file);
+}
+
+$req = new HTTP::Request GET => url("/file?name=$file", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+
+print "not " unless $res->is_success
+                and $res->content_type eq 'text/html'
+		and $res->content_length == 147
+		and $res->title eq 'En prøve'
+		and $res->content =~ /å være/;
+print "ok 5\n";		
+
+
+# A second try on the same file, should fail because we unlink it
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->is_error
+                and $res->code == 404;   # not found
+print "ok 6\n";
+		
+# Then try to list current directory
+$req = new HTTP::Request GET => url("/file?name=.", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->code == 501;   # NYI
+print "ok 7\n";
+
+
+#----------------------------------------------------------------
+print "Check redirect...\n";
+sub httpd_get_redirect
+{
+   my($c) = @_;
+   $c->send_redirect("/echo/redirect");
+}
+
+$req = new HTTP::Request GET => url("/redirect/foo", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+
+print "not " unless $res->is_success
+                and $res->content =~ m|/echo/redirect|;
+print "ok 8\n";
+print "not " unless $res->previous->is_redirect
+                and $res->previous->code == 301;
+print "ok 9\n";
+
+# Let's test a redirect loop too
+sub httpd_get_redirect2 { shift->send_redirect("/redirect3/") }
+sub httpd_get_redirect3 { shift->send_redirect("/redirect4/") }
+sub httpd_get_redirect4 { shift->send_redirect("/redirect5/") }
+sub httpd_get_redirect5 { shift->send_redirect("/redirect6/") }
+sub httpd_get_redirect6 { shift->send_redirect("/redirect2/") }
+
+$req->url(url("/redirect2", $base));
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->is_redirect
+                and $res->header("Client-Warning") =~ /loop detected/i;
+print "ok 10\n";
+$i = 1;
+while ($res->previous) {
+   $i++;
+   $res = $res->previous;
+}
+print "not " unless $i == 6;
+print "ok 11\n";
+
+#----------------------------------------------------------------
+print "Check basic authorization...\n";
+sub httpd_get_basic
+{
+    my($c, $r) = @_;
+    #print STDERR $r->as_string;
+    my($u,$p) = $r->authorization_basic;
+    if (defined($u) && $u eq 'ok 12' && $p eq 'xyzzy') {
+        $c->send_basic_header(200);
+	print $c "Content-Type: text/plain";
+	$c->send_crlf;
+	$c->send_crlf;
+	$c->print("$u\n");
+    } else {
+        $c->send_basic_header(401);
+	$c->print("WWW-Authenticate: Basic realm=\"libwww-perl\"\015\012");
+	$c->send_crlf;
+    }
+}
+
+{
+   package MyUA; @ISA=qw(LWP::UserAgent);
+   sub get_basic_credentials {
+      my($self, $realm, $uri, $proxy) = @_;
+      my $x =  $uri->rel($base);
+      if ($realm eq "libwww-perl" && $uri->rel($base) eq "basic") {
+	  return ("ok 12", "xyzzy");
+      } else {
+          return undef;
+      }
+   }
+}
+$req = new HTTP::Request GET => url("/basic", $base);
+$res = MyUA->new->request($req);
+#print $res->as_string;
+
+print "not " unless $res->is_success;
+print $res->content;
+
+# Let's try with a $ua that does not pass out credentials
+$res = $ua->request($req);
+print "not " unless $res->code == 401;
+print "ok 13\n";
+
+# Let's try to set credentials for this realm
+$ua->credentials($req->url->netloc, "libwww-perl", "ok 12", "xyzzy");
+$res = $ua->request($req);
+print "not " unless $res->is_success;
+print "ok 14\n";
+
+# Then illegal credentials
+$ua->credentials($req->url->netloc, "libwww-perl", "user", "passwd");
+$res = $ua->request($req);
+print "not " unless $res->code == 401;
+print "ok 15\n";
+
+
+#----------------------------------------------------------------
+print "Check proxy...\n";
+sub httpd_get_proxy
+{
+   my($c,$r) = @_;
+   if ($r->method eq "GET" and
+       $r->url->scheme eq "ftp") {
+       $c->send_basic_header(200);
+       $c->send_crlf;
+   } else {
+       $c->send_error;
+   }
+}
+
+$ua->proxy(ftp => $base);
+$req = new HTTP::Request GET => "ftp://ftp.perl.com/proxy";
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->is_success;
+print "ok 16\n";
+
+#----------------------------------------------------------------
+print "Check POSTing...\n";
+sub httpd_post_echo
+{
+   my($c,$r) = @_;
+   $c->send_basic_header;
+   $c->print("Content-Type: text/plain");
+   $c->send_crlf;
+   $c->send_crlf;
+   $c->print($r->as_string);
+}
+
+$req = new HTTP::Request POST => url("/echo/foo", $base);
+$req->content_type("application/x-www-form-urlencoded");
+$req->content("foo=bar&bar=test");
+$res = $ua->request($req);
+#print $res->as_string;
+
+$_ = $res->content;
+print "not " unless $res->is_success
+                and /^Content-Length:\s*16$/mi
+		and /^Content-Type:\s*application\/x-www-form-urlencoded$/mi
+		and /^foo=bar&bar=test/m;
+print "ok 17\n";		
+
+#----------------------------------------------------------------
+print "Terminating server...\n";
+sub httpd_get_quit
+{
+    my($c) = @_;
+    $c->send_error(503, "Bye, bye");
+    exit;  # terminate HTTP server
+}
+
+$req = new HTTP::Request GET => url("/quit", $base);
+$res = $ua->request($req);
+
+print "not " unless $res->code == 503 and $res->content =~ /Bye, bye/;
+print "ok 18\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/protosub.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/protosub.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/local/protosub.t	(revision 21083)
@@ -0,0 +1,73 @@
+#!perl
+
+print "1..6\n";
+
+# This test tries to make a custom protocol implementation by
+# subclassing of LWP::Protocol.
+
+
+use LWP::UserAgent ();
+use LWP::Protocol ();
+
+LWP::Protocol::implementor(http => 'myhttp');
+
+$ua = LWP::UserAgent->new;
+$ua->proxy('ftp' => "http://www.sn.no/");
+
+$req = HTTP::Request->new(GET => 'ftp://foo/');
+$req->header(Cookie => "perl=cool");
+
+$res = $ua->request($req);
+
+print $res->as_string;
+
+print "not " unless $res->code == 200;
+print "ok 5\n";
+print "not " unless $res->content eq "Howdy\n";
+print "ok 6\n";
+exit;
+
+
+#----------------------------------
+package myhttp;
+
+BEGIN {
+   @ISA=qw(LWP::Protocol);
+}
+
+sub new
+{
+    my $class = shift;
+    print "CTOR: $class->new(@_)\n";
+    my($prot) = @_;
+    print "not " unless $prot eq "http";
+    print "ok 1\n";
+    my $self = $class->SUPER::new(@_);
+    for (keys %$self) {
+	print "$_: $self->{$_}\n";
+    }
+    $self;
+}
+
+sub request
+{
+    my $self = shift;
+    print "REQUEST: $self->request(",
+       join(",", (map defined($_)? $_ : "UNDEF", @_)), ")\n";
+
+    my($request, $proxy, $arg, $size, $timeout) = @_;
+    print $request->as_string;
+
+    print "not " unless $proxy eq "http://www.sn.no/";
+    print "ok 2\n";
+    print "not " unless $request->url eq "ftp://foo/";
+    print "ok 3\n";
+    print "not " unless $request->header("cookie") eq "perl=cool";
+    print "ok 4\n";
+
+    my $res = HTTP::Response->new(200 => "OK");
+    $res->content_type("text/plain");
+    $res->date(time);
+    $self->collect_once($arg, $res, "Howdy\n");
+    $res;
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/moved
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/moved	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/moved	(revision 21083)
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+echo "Location: http://$SERVER_NAME:$SERVER_PORT/"
+echo
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/nph-slowdata
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/nph-slowdata	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/nph-slowdata	(revision 21083)
@@ -0,0 +1,26 @@
+#!/usr/local/bin/perl
+
+# This script outputs some data slowly. It can be used to check that
+# pipelined processing of response content really works.  We use syswrite
+# so that the script will notice when the connection is broken.
+
+out("HTTP/1.0 200 OK\r
+Content-Type: text/plain\r
+\r
+");
+
+for (1..5) {
+    out("The number is now $_\n");
+    sleep(1);
+}
+exit;
+
+
+sub out
+{
+    my $data = shift;
+    my $l = length $data;
+    if (syswrite(STDOUT, $data, $l) != $l) {
+	exit 1;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/slowread
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/slowread	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/slowread	(revision 21083)
@@ -0,0 +1,31 @@
+#!/usr/local/bin/perl
+
+# You might post large amount of data to this script.  It will read
+# it slowly.
+
+{ local($!) = 1; print "Content-Type: text/plain\n\n"; }
+
+$len = $ENV{CONTENT_LENGTH};
+
+unless ($len) {
+    system "env";
+    exit;
+}
+
+$size = 20;  # chunk size
+
+$content = '';
+$bytes = 0;
+
+sleep(1);
+while ($len > 0) {
+    $n = sysread(STDIN, $b, $size);
+    last if $n <= 0;
+    $len -= $n;
+    $bytes += $n;
+    $content .= $b;
+    sleep(1);
+}
+print "$bytes bytes read\n";
+
+	
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/test
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/test	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/test	(revision 21083)
@@ -0,0 +1,28 @@
+#!/usr/local/bin/perl
+
+$| = 1;
+print "Content-type: text/plain
+
+";
+
+if (@ARGV) {
+    print "ARGS: ";
+    print join(", ", map { $_ = qq{"$_"} } @ARGV);
+    print "\n\n";
+} else {
+    print "No command line arguments passed to script\n\n";
+}
+
+while (($key,$val) = each %ENV) {
+   print "$key=$val\n";
+}
+
+if ($ENV{CONTENT_LENGTH}) {
+    $len = $ENV{CONTENT_LENGTH};
+    while ($len) {
+	$n = sysread(STDIN, $content, $len, length $content);
+	last unless defined $n;
+	$len -= $n;
+    }
+    print "\nContent\n-------\n$content";
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/timeout
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/timeout	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/cgi-bin/timeout	(revision 21083)
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+sleep 20;
+
+echo "Content-type: text/plain"
+echo
+echo "Test"
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/config.pl.dist
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/config.pl.dist	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/config.pl.dist	(revision 21083)
@@ -0,0 +1,10 @@
+package net;
+
+# Configure these for you local system
+$httpserver  = "localhost:80";
+$cgidir      = "/cgi-bin/lwp";
+
+# Used for proxy test
+$ftp_proxy = "http://localhost/";
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-get.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-get.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-get.t	(revision 21083)
@@ -0,0 +1,43 @@
+#!/usr/local/bin/perl -w
+#
+# Check GET via HTTP.
+#
+
+print "1..2\n";
+
+require "net/config.pl";
+require LWP::Protocol::http;
+require LWP::UserAgent;
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+$netloc = $net::httpserver;
+$script = $net::cgidir . "/test";
+
+$url = new URI::URL("http://$netloc$script?query");
+
+my $request = new HTTP::Request('GET', $url);
+
+print "GET $url\n\n";
+
+my $response = $ua->request($request, undef, undef);
+
+my $str = $response->as_string;
+
+print "$str\n";
+
+if ($response->is_success and $str =~ /^REQUEST_METHOD=GET$/m) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+if ($str =~ /^QUERY_STRING=query$/m) {
+    print "ok 2\n";
+} else {
+    print "not ok 2\n";
+}
+
+# avoid -w warning
+$dummy = $net::httpserver;
+$dummy = $net::cgidir;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-post.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-post.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-post.t	(revision 21083)
@@ -0,0 +1,44 @@
+#!/usr/local/bin/perl -w
+#
+# Check POST via HTTP.
+#
+
+print "1..2\n";
+
+require "net/config.pl";
+require LWP::Protocol::http;
+require LWP::UserAgent;
+
+$netloc = $net::httpserver;
+$script = $net::cgidir . "/test";
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+$url = new URI::URL("http://$netloc$script");
+
+my $form = 'searchtype=Substring';
+
+my $request = new HTTP::Request('POST', $url, undef, $form);
+$request->header('Content-Type', 'application/x-www-form-urlencoded');
+
+my $response = $ua->request($request, undef, undef);
+
+my $str = $response->as_string;
+
+print "$str\n";
+
+if ($response->is_success and $str =~ /^REQUEST_METHOD=POST$/m) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+if ($str =~ /^CONTENT_LENGTH=(\d+)$/m && $1 == length($form)) {
+    print "ok 2\n";
+} else {
+    print "not ok 2\n";
+}
+
+# avoid -w warning
+$dummy = $net::httpserver;
+$dummy = $net::cgidir;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-timeout.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-timeout.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/http-timeout.t	(revision 21083)
@@ -0,0 +1,41 @@
+#
+# Check timeouts via HTTP.
+#
+
+print "1..1\n";
+
+require "net/config.pl";
+require HTTP::Status;
+require LWP::Protocol::http;
+require LWP::UserAgent;
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+$ua->timeout(4);
+
+$netloc = $net::httpserver;
+$script = $net::cgidir . "/timeout";
+
+$url = new URI::URL("http://$netloc$script");
+
+my $request = new HTTP::Request('GET', $url);
+
+print $request->as_string;
+
+my $response = $ua->request($request, undef);
+
+my $str = $response->as_string;
+
+print "$str\n";
+
+if ($response->is_error and
+    $str =~ /timeout/) {
+    print "ok 1\n";
+}
+else {
+    print "nok ok 1\n";
+}
+
+# avoid -w warning
+$dummy = $net::httpserver;
+$dummy = $net::cgidir;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/mirror.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/mirror.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/mirror.t	(revision 21083)
@@ -0,0 +1,34 @@
+#
+# Test mirroring a file
+#
+
+require "net/config.pl";
+require LWP::Protocol::http;
+require LWP::UserAgent;
+require HTTP::Status;
+
+print "1..2\n";
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+my $url = "http://$net::httpserver/";
+my $copy = "lwp-test-$$"; # downloaded copy
+
+my $response = $ua->mirror($url, $copy);
+
+if ($response->code == &HTTP::Status::RC_OK) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+# OK, so now do it again, should get Not-Modified
+$response = $ua->mirror($url, $copy);
+if ($response->code == &HTTP::Status::RC_NOT_MODIFIED) {
+    print "ok 2\n";
+} else {
+    print "nok ok 2\n";
+}
+unlink($copy);
+
+$net::httpserver = $net::httpserver;  # avoid -w warning
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/moved.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/moved.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/moved.t	(revision 21083)
@@ -0,0 +1,34 @@
+#!/usr/local/bin/perl -w
+#
+
+print "1..1\n";
+
+require "net/config.pl";
+require LWP::Debug;
+require LWP::UserAgent;
+
+$url = "http://$net::httpserver$net::cgidir/moved";
+
+#LWP::Debug::level('+trace');
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+$ua->timeout(30);               # timeout in seconds
+
+my $request = new HTTP::Request('GET', $url);
+
+print $request->as_string;
+
+my $response = $ua->request($request, undef, undef);
+
+print $response->as_string, "\n";
+
+if ($response->is_success) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
+
+
+# avoid -w warning
+$dummy = $net::httpserver;
+$dummy = $net::cgidir;
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/proxy.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/proxy.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/net/proxy.t	(revision 21083)
@@ -0,0 +1,36 @@
+#!/usr/local/bin/perl -w
+#
+# Test retrieving a file with a 'ftp://' URL,
+# via a HTTP proxy.
+#
+
+print "1..1\n";
+
+require "net/config.pl";
+unless (defined $net::ftp_proxy) {
+    print "not ok 1\n";
+    exit 0;
+}
+
+require LWP::Debug;
+require LWP::UserAgent;
+
+#LWP::Debug::level('+');
+
+my $ua = new LWP::UserAgent;    # create a useragent to test
+
+$ua->proxy('ftp', $net::ftp_proxy);
+
+my $url = new URI::URL('ftp://ftp.uninett.no/');
+
+my $request = new HTTP::Request('GET', $url);
+
+my $response = $ua->request($request, undef, undef);
+
+my $str = $response->as_string;
+
+if ($response->is_success) {
+    print "ok 1\n";
+} else {
+    print "not ok 1\n";
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules-dbm.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules-dbm.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules-dbm.t	(revision 21083)
@@ -0,0 +1,128 @@
+
+print "1..13\n";
+
+
+use WWW::RobotRules::AnyDBM_File;
+
+$file = "test-$$";
+
+$r = new WWW::RobotRules::AnyDBM_File "myrobot/2.0", $file;
+
+$r->parse("http://www.aas.no/robots.txt", "");
+
+$r->visit("www.aas.no");
+
+print "not " if $r->no_visits("www.aas.no") != 1;
+print "ok 1\n";
+
+
+$r->push_rules("www.sn.no", "/aas", "/per");
+$r->push_rules("www.sn.no", "/god", "/old");
+
+@r = $r->rules("www.sn.no");
+print "Rules: @r\n";
+
+print "not " if "@r" ne "/aas /per /god /old";
+print "ok 2\n";
+
+$r->clear_rules("per");
+$r->clear_rules("www.sn.no");
+
+@r = $r->rules("www.sn.no");
+print "Rules: @r\n";
+
+print "not " if "@r" ne "";
+print "ok 3\n";
+
+$r->visit("www.aas.no", time+10);
+$r->visit("www.sn.no");
+
+print "No visits: ", $r->no_visits("www.aas.no"), "\n";
+print "Last visit: ", $r->last_visit("www.aas.no"), "\n";
+print "Fresh until: ", $r->fresh_until("www.aas.no"), "\n";
+
+print "not " if $r->no_visits("www.aas.no") != 2;
+print "ok 4\n";
+
+print "not " if abs($r->last_visit("www.sn.no") - time) > 2;
+print "ok 5\n";
+
+$r = undef;
+
+# Try to reopen the database without a name specified
+$r = new WWW::RobotRules::AnyDBM_File undef, $file;
+$r->visit("www.aas.no");
+
+print "not " if $r->no_visits("www.aas.no") != 3;
+print "ok 6\n";
+
+print "Agent-Name: ", $r->agent, "\n";
+print "not " if $r->agent ne "myrobot";
+print "ok 7\n";
+
+$r = undef;
+
+print "*** Dump of database ***\n";
+tie(%cat, AnyDBM_File, $file, 0, 0644) or die "Can't tie: $!";
+while (($key,$val) = each(%cat)) {
+    print "$key\t$val\n";
+}
+print "******\n";
+
+untie %cat;
+
+# Try to open database with a different agent name
+$r = new WWW::RobotRules::AnyDBM_File "MOMSpider/2.0", $file;
+
+print "not " if $r->no_visits("www.sn.no");
+print "ok 8\n";
+
+# Try parsing
+$r->parse("http://www.sn.no:8080/robots.txt", <<EOT, (time + 3));
+
+User-Agent: *
+Disallow: /
+
+User-Agent: Momspider
+Disallow: /foo
+Disallow: /bar
+
+EOT
+
+@r = $r->rules("www.sn.no:8080");
+print "not " if "@r" ne "/foo /bar";
+print "ok 9\n";
+
+print "not " if $r->allowed("http://www.sn.no") >= 0;
+print "ok 10\n";
+
+print "not " if $r->allowed("http://www.sn.no:8080/foo/gisle");
+print "ok 11\n";
+
+sleep(5);  # wait until file has expired
+print "not " if $r->allowed("http://www.sn.no:8080/foo/gisle") >= 0;
+print "ok 12\n";
+
+
+$r = undef;
+
+print "*** Dump of database ***\n";
+tie(%cat, AnyDBM_File, $file, 0, 0644) or die "Can't tie: $!";
+while (($key,$val) = each(%cat)) {
+    print "$key\t$val\n";
+}
+print "******\n";
+
+untie %cat;			# Otherwise the next line fails on DOSish
+
+unlink "$file", "$file.pag", "$file.dir", "$file.db";
+
+# Try open a an emty database without specifying a name
+eval { 
+   $r = new WWW::RobotRules::AnyDBM_File undef, $file;
+};
+print $@;
+print "not " unless $@;  # should fail
+print "ok 13\n";
+
+unlink "$file", "$file.pag", "$file.dir", "$file.db";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/rules.t	(revision 21083)
@@ -0,0 +1,138 @@
+#!/local/bin/perl
+
+=head1 NAME
+
+robot-rules.t
+
+=head1 DESCRIPTION
+
+Test a number of different A</robots.txt> files against a number
+of different User-agents.
+
+=cut
+
+require WWW::RobotRules;
+use Carp;
+use strict;
+
+print "1..26\n"; # for Test::Harness
+
+# We test a number of different /robots.txt files,
+#
+
+my $content1 = <<EOM;
+# http://foo/robots.txt
+User-agent: *
+Disallow: /private
+Disallow: http://foo/also_private
+
+User-agent: MOMspider
+Disallow:
+EOM
+
+my $content2 = <<EOM;
+# http://foo/robots.txt
+User-agent: MOMspider
+ # comment which should be ignored
+Disallow: /private
+EOM
+
+my $content3 = <<EOM;
+# http://foo/robots.txt
+EOM
+
+my $content4 = <<EOM;
+# http://foo/robots.txt
+User-agent: *
+Disallow: /private
+
+User-agent: MOMspider
+Disallow: /this
+
+User-agent: Another
+Disallow: /that
+EOM
+
+# and a number of different robots:
+
+my @tests1 = (
+	   [$content1, 'MOMspider' =>
+	    1 => 'http://foo/private' => 1,
+	    2 => 'http://foo/also_private' => 1,
+	   ],
+
+	   [$content1, 'Wubble' =>
+	    3 => 'http://foo/private' => 0,
+	    4 => 'http://foo/also_private' => 0,
+	    5 => 'http://foo/other' => 1,
+	   ],
+
+	   [$content2, 'MOMspider' =>
+	    6 => 'http://foo/private' => 0,
+	    7 => 'http://foo/other' => 1,
+	   ],
+
+	   [$content2, 'Wubble' =>
+	    8  => 'http://foo/private' => 1,
+	    9  => 'http://foo/also_private' => 1,
+	    10 => 'http://foo/other' => 1,
+	   ],
+
+	   [$content3, 'MOMspider' =>
+	    11 => 'http://foo/private' => 1,
+	    12 => 'http://foo/other' => 1,
+	   ],
+
+	   [$content3, 'Wubble' =>
+	    13 => 'http://foo/private' => 1,
+	    14 => 'http://foo/other' => 1,
+	   ],
+
+	   [$content4, 'MOMspider' =>
+	    15 => 'http://foo/private' => 1,
+	    16 => 'http://foo/this' => 0,
+	    17 => 'http://foo/that' => 1,
+	   ],
+
+	   [$content4, 'Another' =>
+	    18 => 'http://foo/private' => 1,
+	    19 => 'http://foo/this' => 1,
+	    20 => 'http://foo/that' => 0,
+	   ],
+
+	   [$content4, 'Wubble' =>
+	    21 => 'http://foo/private' => 0,
+	    22 => 'http://foo/this' => 1,
+	    23 => 'http://foo/that' => 1,
+	   ],
+
+	   [$content4, 'Another/1.0' =>
+	    24 => 'http://foo/private' => 1,
+	    25 => 'http://foo/this' => 1,
+	    26 => 'http://foo/that' => 0,
+	   ],
+
+	   # when adding tests, remember to increase
+	   # the maximum at the top
+
+	  );
+
+my $t;
+
+for $t (@tests1) {
+    my ($content, $ua) = splice(@$t, 0, 2);
+
+    my $robotsrules = new WWW::RobotRules($ua);
+    $robotsrules->parse('http://foo/robots.txt', $content);
+
+    my ($num, $path, $expected);
+    while(($num, $path, $expected) = splice(@$t, 0, 3)) {
+	my $allowed = $robotsrules->allowed($path);
+	$allowed = 1 if $allowed;
+	if($allowed != $expected) {
+	    $robotsrules->dump;
+	    confess "Test Failed: $ua => $path ($allowed != $expected)";
+	}
+	print "ok $num\n";
+    }
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/ua.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/ua.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/robot/ua.t	(revision 21083)
@@ -0,0 +1,135 @@
+$| = 1; # autoflush
+
+require IO::Socket;  # make sure this work before we try to make a HTTP::Daemon
+
+# First we make ourself a daemon in another process
+my $D = shift || '';
+if ($D eq 'daemon') {
+
+    require HTTP::Daemon;
+
+    my $d = new HTTP::Daemon Timeout => 10;
+
+    print "Please to meet you at: <URL:", $d->url, ">\n";
+    open(STDOUT, $^O eq 'MSWin32' ? ">nul" : ">/dev/null");
+
+    while ($c = $d->accept) {
+	$r = $c->get_request;
+	if ($r) {
+	    my $p = ($r->url->path_components)[1];
+	    $p =~ s/\W//g;
+	    my $func = lc("httpd_" . $r->method . "_$p");
+	    #print STDERR "Calling $func...\n";
+            if (defined &$func) {
+		&$func($c, $r);
+	    } else {
+		$c->send_error(404);
+	    }
+	}
+	$c = undef;  # close connection
+    }
+    print STDERR "HTTP Server terminated\n";
+    exit;
+}
+else {
+    use Config;
+    open(DAEMON , "$Config{'perlpath'} robot/ua.t daemon |") or die "Can't exec daemon: $!";
+}
+
+print "1..7\n";
+
+
+$greating = <DAEMON>;
+$greating =~ /(<[^>]+>)/;
+
+require URI::URL;
+URI::URL->import;
+my $base = new URI::URL $1;
+
+print "Will access HTTP server at $base\n";
+
+require LWP::RobotUA;
+require HTTP::Request;
+$ua = new LWP::RobotUA 'lwp-spider/0.1', 'gisle@aas.no';
+$ua->delay(0.05);  # rather quick robot
+
+#----------------------------------------------------------------
+sub httpd_get_robotstxt
+{
+   my($c,$r) = @_;
+   $c->send_basic_header;
+   $c->print("Content-Type: text/plain");
+   $c->send_crlf;
+   $c->send_crlf;
+   $c->print("User-Agent: *
+Disallow: /private
+
+");
+}
+
+sub httpd_get_someplace
+{
+   my($c,$r) = @_;
+   $c->send_basic_header;
+   $c->print("Content-Type: text/plain");
+   $c->send_crlf;
+   $c->send_crlf;
+   $c->print("Okidok\n");
+}
+
+$req = new HTTP::Request GET => url("/someplace", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->is_success;
+print "ok 1\n";
+
+$req = new HTTP::Request GET => url("/private/place", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->code == 403
+                and $res->message =~ /robots.txt/;
+print "ok 2\n";
+
+$req = new HTTP::Request GET => url("/foo", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->code == 404;  # not found
+print "ok 3\n";
+
+# Let the robotua generate "Service unavailable/Retry After response";
+$ua->delay(1);
+$ua->use_sleep(0);
+$req = new HTTP::Request GET => url("/foo", $base);
+$res = $ua->request($req);
+#print $res->as_string;
+print "not " unless $res->code == 503   # Unavailable
+                and $res->header("Retry-After");
+print "ok 4\n";
+
+#----------------------------------------------------------------
+print "Terminating server...\n";
+sub httpd_get_quit
+{
+    my($c) = @_;
+    $c->send_error(503, "Bye, bye");
+    exit;  # terminate HTTP server
+}
+
+$ua->delay(0);
+$req = new HTTP::Request GET => url("/quit", $base);
+$res = $ua->request($req);
+
+print "not " unless $res->code == 503 and $res->content =~ /Bye, bye/;
+print "ok 5\n";
+
+#---------------------------------------------------------------
+$ua->delay(1);
+
+# host_wait() should be around 60s now
+print "not " unless abs($ua->host_wait($base->netloc) - 60) < 5;
+print "ok 6\n";
+
+# Number of visits to this place should be 
+print "not " unless $ua->no_visits($base->netloc) == 4;
+print "ok 7\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/abs-config.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/abs-config.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/abs-config.t	(revision 21083)
@@ -0,0 +1,35 @@
+print "1..6\n";
+
+use URI::URL qw(url);
+
+# Test configuration via some global variables.
+
+$URI::URL::ABS_REMOTE_LEADING_DOTS = 1;
+$URI::URL::ABS_ALLOW_RELATIVE_SCHEME = 1;
+
+$u1 = url("../../../../abc", "http://web/a/b");
+
+print "not " unless $u1->abs->as_string eq "http://web/abc";
+print "ok 1\n";
+
+{
+    local $URI::URL::ABS_REMOTE_LEADING_DOTS;
+    print "not " unless $u1->abs->as_string eq "http://web/../../../abc";
+    print "ok 2\n";
+}
+
+
+$u1 = url("http:../../../../abc", "http://web/a/b");
+print "not " unless $u1->abs->as_string eq "http://web/abc";
+print "ok 3\n";
+
+{
+   local $URI::URL::ABS_ALLOW_RELATIVE_SCHEME;
+   print "not " unless $u1->abs->as_string eq "http:../../../../abc";
+   print "ok 4\n";
+   print "not " unless $u1->abs(undef,1)->as_string eq "http://web/abc";
+   print "ok 5\n";
+}
+
+print "not " unless $u1->abs(undef,0)->as_string eq "http:../../../../abc";
+print "ok 6\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/base.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/base.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/base.t	(revision 21083)
@@ -0,0 +1,955 @@
+#!/local/bin/perl -w
+
+use URI::URL qw(url);
+use URI::Escape qw(uri_escape uri_unescape);
+
+use Carp;
+
+# _expect()
+#
+# Handy low-level object method tester which we insert as a method
+# in the URI::URL class
+#
+sub URI::URL::_expect {
+    my($self, $method, $expect, @args) = @_;
+    my $result = $self->$method(@args);
+    $expect = 'UNDEF' unless defined $expect;
+    $result = 'UNDEF' unless defined $result;
+    return 1 if $expect eq $result;
+    warn "'$self'->$method(@args) = '$result' " .
+		"(expected '$expect')\n";
+    $self->print_on('STDERR');
+    confess "Test Failed";
+}
+
+package main;
+
+# Must ensure that there is no relative paths in @INC because we will
+# chdir in the newlocal tests.
+chomp($pwd = ($^O =~ /mswin32/i ? `cd` : `pwd`));
+for (@INC) {
+    next if m|^/| or $^O =~ /os2|mswin32/i and m|^\w:[\\/]|;
+    print "Turn lib path $_ into $pwd/$_\n";
+    $_ = "$pwd/$_";
+
+}
+
+$| = 1;
+
+print "1..8\n";  # for Test::Harness
+
+# Do basic tests first.
+# Dies if an error has been detected, prints "ok" otherwise.
+
+print "Self tests for URI::URL version $URI::URL::VERSION...\n";
+
+scheme_parse_test();
+print "ok 1\n";
+
+parts_test();
+print "ok 2\n";
+
+escape_test();
+print "ok 3\n";
+
+newlocal_test();
+print "ok 4\n";
+
+absolute_test();
+print "ok 5\n";
+
+eq_test();
+print "ok 6\n";
+
+# Let's test makeing our own things
+URI::URL::strict(0);
+# This should work after URI::URL::strict(0)
+$url = new URI::URL "x-myscheme:something";
+# Since no implementor is registered for 'x-myscheme' then it will
+# be handeled by the URI::URL::_generic class
+$url->_expect('as_string' => 'x-myscheme:something');
+$url->_expect('path' => 'something');
+URI::URL::strict(1);
+
+# Let's try to make our URL subclass
+{
+    package MyURL;
+    @ISA = URI::URL::implementor();
+
+    sub _parse {
+	my($self, $init) = @_;
+	$self->URI::URL::_generic::_parse($init, qw(netloc path));
+    }
+
+    sub foo {
+	my $self = shift;
+	print ref($self)."->foo called for $self\n";
+    }
+}
+# Let's say that it implements the 'x-a+b.c' scheme (alias 'x-foo')
+URI::URL::implementor('x-a+b.c', 'MyURL');
+URI::URL::implementor('x-foo', 'MyURL');
+
+# Now we are ready to try our new URL scheme
+$url = new URI::URL 'x-a+b.c://foo/bar;a?b';
+$url->_expect('as_string', 'x-a+b.c://foo/bar;a?b');
+$url->_expect('path', '/bar;a?b');
+$url->foo;
+$newurl = new URI::URL 'xxx', $url;
+$newurl->foo;
+$url = new URI::URL 'yyy', 'x-foo:';
+$url->foo;
+
+print "ok 7\n";
+
+# Test the new wash&go constructor
+print "not " if url("../foo.html", "http://www.sn.no/a/b")->abs->as_string
+		ne 'http://www.sn.no/foo.html';
+print "ok 8\n";
+
+print "URI::URL version $URI::URL::VERSION ok\n";
+
+exit 0;
+
+
+
+
+#####################################################################
+#
+# scheme_parse_test()
+#
+# test parsing and retrieval methods
+
+sub scheme_parse_test {
+
+    print "scheme_parse_test:\n";
+
+    $tests = {
+	'hTTp://web1.net/a/b/c/welcome#intro'
+	=> {    'scheme'=>'http', 'host'=>'web1.net', 'port'=>80,
+		'path'=>'/a/b/c/welcome', 'frag'=>'intro','query'=>undef,
+		'epath'=>'/a/b/c/welcome', 'equery'=>undef,
+		'params'=>undef, 'eparams'=>undef,
+		'as_string'=>'http://web1.net/a/b/c/welcome#intro',
+		'full_path' => '/a/b/c/welcome' },
+
+	'http://web:1/a?query+text'
+	=> {    'scheme'=>'http', 'host'=>'web', 'port'=>1,
+		'path'=>'/a', 'frag'=>undef, 'query'=>'query+text' },
+
+	'http://web.net/'
+	=> {    'scheme'=>'http', 'host'=>'web.net', 'port'=>80,
+		'path'=>'/', 'frag'=>undef, 'query'=>undef,
+		'full_path' => '/',
+		'as_string' => 'http://web.net/' },
+
+	'http://web.net'
+	=> {    'scheme'=>'http', 'host'=>'web.net', 'port'=>80,
+		'path'=>'/', 'frag'=>undef, 'query'=>undef,
+		'full_path' => '/',
+		'as_string' => 'http://web.net/' },
+
+	'http:0'
+	 => {   'scheme'=>'http', 'path'=>'0', 'query'=>undef,
+		'as_string'=>'http:0', 'full_path'=>'0', },
+
+	'http:/0?0'
+	 => {   'scheme'=>'http', 'path'=>'/0', 'query'=>'0',
+		'as_string'=>'http:/0?0', 'full_path'=>'/0?0', },
+
+	'http://0:0/0/0;0?0#0'
+	 => {   'scheme'=>'http', 'host'=>'0', 'port'=>'0',
+		'path' => '/0/0', 'query'=>'0', 'params'=>'0',
+		'netloc'=>'0:0',
+		'frag'=>0, 'as_string'=>'http://0:0/0/0;0?0#0' },
+
+	'ftp://0%3A:%40@h:0/0?0'
+	=>  {   'scheme'=>'ftp', 'user'=>'0:', 'password'=>'@',
+		'host'=>'h', 'port'=>'0', 'path'=>'/0?0',
+		'query'=>undef, params=>undef,
+		'netloc'=>'0%3A:%40@h:0',
+		'as_string'=>'ftp://0%3A:%40@h:0/0?0' },
+
+	'ftp://usr:pswd@web:1234/a/b;type=i'
+	=> {    'host'=>'web', 'port'=>1234, 'path'=>'/a/b',
+		'user'=>'usr', 'password'=>'pswd',
+		'params'=>'type=i',
+		'as_string'=>'ftp://usr:pswd@web:1234/a/b;type=i' },
+
+	'ftp://host/a/b'
+	=> {    'host'=>'host', 'port'=>21, 'path'=>'/a/b',
+		'user'=>'anonymous',
+		'as_string'=>'ftp://host/a/b' },
+
+	'file://host/fseg/fs?g/fseg'
+	# don't escape ? for file: scheme
+	=> {    'host'=>'host', 'path'=>'/fseg/fs?g/fseg',
+		'as_string'=>'file://host/fseg/fs?g/fseg' },
+
+	'gopher://host'
+	=> {     'gtype'=>'1', 'as_string' => 'gopher://host/', },
+
+	'gopher://host/'
+	=> {     'gtype'=>'1', 'as_string' => 'gopher://host/', },
+
+	'gopher://gopher/2a_selector'
+	=> {    'gtype'=>'2', 'selector'=>'a_selector',
+		'as_string' => 'gopher://gopher/2a_selector', },
+
+	'mailto:libwww-perl@ics.uci.edu'
+	=> {    'address'       => 'libwww-perl@ics.uci.edu',
+		'encoded822addr'=> 'libwww-perl@ics.uci.edu',
+		'user'          => 'libwww-perl',
+		'host'          => 'ics.uci.edu',
+		'as_string'     => 'mailto:libwww-perl@ics.uci.edu', },
+
+	'news:*'
+	=> {    'groupart'=>'*', 'group'=>'*', as_string=>'news:*' },
+	'news:comp.lang.perl'
+	=> {    'group'=>'comp.lang.perl' },
+	'news:perl-faq/module-list-1-794455075@ig.co.uk'
+	=> {    'article'=>
+		    'perl-faq/module-list-1-794455075@ig.co.uk' },
+
+	'nntp://news.com/comp.lang.perl/42'
+	=> {    'group'=>'comp.lang.perl', 'digits'=>42 },
+
+	'telnet://usr:pswd@web:12345/'
+	=> {    'user'=>'usr', 'password'=>'pswd', 'host'=>'web' },
+	'rlogin://aas@a.sn.no'
+	=> {    'user'=>'aas', 'host'=>'a.sn.no' },
+	'tn3270://aas@ibm'
+	=> {    'user'=>'aas', 'host'=>'ibm',
+		'as_string'=>'tn3270://aas@ibm/'},
+
+	'wais://web.net/db'
+	=> { 'database'=>'db' },
+	'wais://web.net/db?query'
+	=> { 'database'=>'db', 'query'=>'query' },
+	'wais://usr:pswd@web.net/db/wt/wp'
+	=> {    'database'=>'db', 'wtype'=>'wt', 'wpath'=>'wp',
+		'password'=>'pswd' },
+    };
+
+    foreach $url_str (sort keys %$tests ){
+	print "Testing '$url_str'\n";
+	my $url = new URI::URL $url_str;
+	my $tests = $tests->{$url_str};
+	while( ($method, $exp) = each %$tests ){
+	    $exp = 'UNDEF' unless defined $exp;
+	    $url->_expect($method, $exp);
+	}
+    }
+}
+
+
+#####################################################################
+#
+# parts_test()          (calls netloc_test test)
+#
+# Test individual component part access functions
+#
+sub parts_test {
+    print "parts_test:\n";
+
+    # test storage part access/edit methods (netloc, user, password,
+    # host and port are tested by &netloc_test)
+
+    $url = new URI::URL 'file://web/orig/path';
+    $url->scheme('http');
+    $url->path('1info');
+    $url->query('key words');
+    $url->frag('this');
+    $url->_expect('as_string' => 'http://web/1info?key%20words#this');
+
+    $url->epath('%2f/%2f');
+    $url->equery('a=%26');
+    $url->_expect('full_path' => '/%2f/%2f?a=%26');
+
+    # At this point it should be impossible to access the members path()
+    # and query() without complaints.
+    eval { my $p = $url->path; print "Path is $p\n"; };
+    die "Path exception failed" unless $@;
+    eval { my $p = $url->query; print "Query is $p\n"; };
+    die "Query exception failed" unless $@;
+
+    # but we should still be able to set it 
+    $url->path("howdy");
+    $url->_expect('as_string' => 'http://web/howdy?a=%26#this');
+
+    # Test the path_components function
+    $url = new URI::URL 'file:%2f/%2f';
+    my $p;
+    $p = join('-', $url->path_components);
+    die "\$url->path_components returns '$p', expected '/-/'"
+      unless $p eq "/-/";
+    $url->host("localhost");
+    $p = join('-', $url->path_components);
+    die "\$url->path_components returns '$p', expected '-/-/'"
+      unless $p eq "-/-/";
+    $url->epath("/foo/bar/");
+    $p = join('-', $url->path_components);
+    die "\$url->path_components returns '$p', expected '-foo-bar-'"
+      unless $p eq "-foo-bar-";
+    $url->path_components("", "/etc", "\0", "..", "øse", "");
+    $url->_expect('full_path' => '/%2Fetc/%00/../%F8se/');
+
+    # Setting undef
+    $url = new URI::URL 'http://web/p;p?q#f';
+    $url->epath(undef);
+    $url->equery(undef);
+    $url->eparams(undef);
+    $url->frag(undef);
+    $url->_expect('as_string' => 'http://web/');
+
+    # Test http query access methods
+    $url->keywords('dog');
+    $url->_expect('as_string' => 'http://web/?dog');
+    $url->keywords(qw(dog bones));
+    $url->_expect('as_string' => 'http://web/?dog+bones');
+    $url->keywords(0,0);
+    $url->_expect('as_string' => 'http://web/?0+0');
+    $url->keywords('dog', 'bones', '#+=');
+    $url->_expect('as_string' => 'http://web/?dog+bones+%23%2B%3D');
+    $a = join(":", $url->keywords);
+    die "\$url->keywords did not work (returned '$a')" unless $a eq 'dog:bones:#+=';
+    # calling query_form is an error
+    eval { my $foo = $url->query_form; };
+    die "\$url->query_form should croak since query contains keywords not a form."
+      unless $@;
+
+    $url->query_form(a => 'foo', b => 'bar');
+    $url->_expect('as_string' => 'http://web/?a=foo&b=bar');
+    my %a = $url->query_form;
+    die "\$url->query_form did not work"
+      unless $a{a} eq 'foo' && $a{b} eq 'bar';
+
+    $url->query_form(a => undef, a => 'foo', '&=' => '&=+');
+    $url->_expect('as_string' => 'http://web/?a=&a=foo&%26%3D=%26%3D%2B');
+
+    my @a = $url->query_form;
+    die "Wrong length" unless @a == 6;
+    die "Bad keys from query_form"
+      unless $a[0] eq 'a' && $a[2] eq 'a' && $a[4] eq '&=';
+    die "Bad values from query_form"
+      unless $a[1] eq '' && $a[3] eq 'foo' && $a[5] eq '&=+';
+
+    # calling keywords is an error
+    eval { my $foo = $url->keywords; };
+    die "\$url->keywords should croak when query is a form"
+      unless $@;
+    # Try this odd one
+    $url->equery('&=&=b&a=&a&a=b=c&&a=b');
+    @a = $url->query_form;
+    #print join(":", @a), "\n";
+    die "Wrong length" unless @a == 16;
+    die "Wrong sequence" unless $a[4]  eq ""  && $a[5]  eq "b" &&
+                                $a[10] eq "a" && $a[11] eq "b=c";
+
+    # Try array ref values in the key value pairs
+    $url->query_form(a => ['foo', 'bar'], b => 'foo', c => ['bar', 'foo']);
+    $url->_expect('as_string', 'http://web/?a=foo&a=bar&b=foo&c=bar&c=foo');
+
+
+    netloc_test();
+    port_test();
+
+    $url->query(undef);
+    $url->_expect('query', undef);
+
+    $url = new URI::URL 'gopher://gopher/';
+    $url->port(33);
+    $url->gtype("3");
+    $url->selector("S");
+    $url->search("query");
+    $url->_expect('as_string', 'gopher://gopher:33/3S%09query');
+
+    $url->epath("45%09a");
+    $url->_expect('gtype' => '4');
+    $url->_expect('selector' => '5');
+    $url->_expect('search' => 'a');
+    $url->_expect('string' => undef);
+    $url->_expect('path' => "/45\ta");
+    $url->path("00\t%09gisle");
+    $url->_expect('search', '%09gisle');
+
+    # Let's test som other URL schemes
+    $url = new URI::URL 'news:';
+    $url->group("comp.lang.perl.misc");
+    $url->_expect('as_string' => 'news:comp.lang.perl.misc');
+    $url->article('<1234@a.sn.no>');
+    $url->_expect('as_string' => 'news:1234@a.sn.no'); # "<" and ">" are gone
+    # This one should be illegal
+    eval { $url->article("no.perl"); };
+    die "This one should really complain" unless $@;
+
+    $url = new URI::URL 'mailto:';
+    $url->user("aas");
+    $url->host("a.sn.no");
+    $url->_expect("as_string" => 'mailto:aas@a.sn.no');
+    $url->address('foo@bar');
+    $url->_expect("host" => 'bar');
+    $url->_expect("user" => 'foo');
+
+    $url = new URI::URL 'wais://host/database/wt/wpath';
+    $url->database('foo');
+    $url->_expect('as_string' => 'wais://host/foo/wt/wpath');
+    $url->wtype('bar');
+    $url->_expect('as_string' => 'wais://host/foo/bar/wpath');
+
+    # Test crack method for various URLs
+    my(@crack, $crack);
+    @crack = URI::URL->new("http://host/path;param?query#frag")->crack;
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "http*UNDEF*UNDEF*host*80*/path*param*query*frag";
+
+    @crack = URI::URL->new("foo/bar", "ftp://aas\@ftp.sn.no/")->crack;
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "ftp*UNDEF*UNDEF*UNDEF*21*foo/bar*UNDEF*UNDEF*UNDEF";
+
+    @crack = URI::URL->new('ftp://u:p@host/q?path')->crack;
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "ftp*u*p*host*21*/q?path*UNDEF*UNDEF*UNDEF";
+
+    @crack = URI::URL->new("ftp://ftp.sn.no/pub")->crack;    # Test anon ftp
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    die "No passwd in anonymous crack" unless $crack[2];
+    $crack[2] = 'passwd';  # easier to test when we know what it is
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "ftp*anonymous*passwd*ftp.sn.no*21*/pub*UNDEF*UNDEF*UNDEF";
+
+    @crack = URI::URL->new('mailto:aas@sn.no')->crack;
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "mailto*aas*UNDEF*sn.no*UNDEF*aas\@sn.no*UNDEF*UNDEF*UNDEF";
+
+    @crack = URI::URL->new('news:comp.lang.perl.misc')->crack;
+    die "Cracked result should be 9 elements" unless @crack == 9;
+    $crack = join("*", map { defined($_) ? $_ : "UNDEF" } @crack);
+    print "Cracked result: $crack\n";
+    die "Bad crack result" unless
+      $crack eq "news*UNDEF*UNDEF*UNDEF*UNDEF*comp.lang.perl.misc*UNDEF*UNDEF*UNDEF";
+}
+
+#
+# netloc_test()
+#
+# Test automatic netloc synchronisation
+#
+sub netloc_test {
+    print "netloc_test:\n";
+
+    my $url = new URI::URL 'ftp://anonymous:p%61ss@håst:12345';
+    $url->_expect('user', 'anonymous');
+    $url->_expect('password', 'pass');
+    $url->_expect('host', 'håst');
+    $url->_expect('port', 12345);
+    # Can't really know how netloc is represented since it is partially escaped
+    #$url->_expect('netloc', 'anonymous:pass@hst:12345');
+    $url->_expect('as_string' => 'ftp://anonymous:p%61ss@h%E5st:12345/');
+
+    # The '0' is sometimes tricky to get right
+    $url->user(0);
+    $url->password(0);
+    $url->host(0);
+    $url->port(0);
+    $url->_expect('netloc' => '0:0@0:0');
+    $url->host(undef);
+    $url->_expect('netloc' => '');
+    $url->host('h');
+    $url->user(undef);
+    $url->_expect('netloc' => 'h:0');
+    $url->user('');
+    $url->_expect('netloc' => ':0@h:0');
+    $url->password('');
+    $url->_expect('netloc' => ':@h:0');
+    $url->user('foo');
+    $url->_expect('netloc' => 'foo:@h:0');
+
+    # Let's try a simple one
+    $url->user('nemo');
+    $url->password('p2');
+    $url->host('hst2');
+    $url->port(2);
+    $url->_expect('netloc' => 'nemo:p2@hst2:2');
+
+    $url->user(undef);
+    $url->password(undef);
+    $url->port(undef);
+    $url->_expect('netloc' => 'hst2');
+    $url->_expect('port' => '21');  # the default ftp port
+
+    $url->port(21);
+    $url->_expect('netloc' => 'hst2');
+
+    # Let's try some reserved chars
+    $url->user("@");
+    $url->password(":-#-;-/-?");
+    $url->_expect('as_string' => 'ftp://%40:%3A-%23-%3B-%2F-%3F@hst2/');
+
+}
+
+#
+# port_test()
+#
+# Test port behaviour
+#
+sub port_test {
+    print "port_test:\n";
+
+    $url = URI::URL->new('http://foo/root/dir/');
+    my $port = $url->port;
+    die "Port undefined" unless defined $port;
+    die "Wrong port $port" unless $port == 80;
+    die "Wrong string" unless $url->as_string eq
+	'http://foo/root/dir/';
+
+    $url->port(8001);
+    $port = $url->port;
+    die "Port undefined" unless defined $port;
+    die "Wrong port $port" unless $port == 8001;
+    die "Wrong string" unless $url->as_string eq
+	'http://foo:8001/root/dir/';
+
+    $url->port(80);
+    $port = $url->port;
+    die "Port undefined" unless defined $port;
+    die "Wrong port $port" unless $port == 80;
+    die "Wrong string" unless $url->as_string eq
+	'http://foo/root/dir/';
+
+    $url->port(8001);
+    $url->port(undef);
+    $port = $url->port;
+    die "Port undefined" unless defined $port;
+    die "Wrong port $port" unless $port == 80;
+    die "Wrong string" unless $url->as_string eq
+	'http://foo/root/dir/';
+}
+
+
+#####################################################################
+#
+# escape_test()
+#
+# escaping functions
+
+sub escape_test {
+    print "escape_test:\n";
+
+    # supply escaped URL
+    $url = new URI::URL 'http://web/this%20has%20spaces';
+    # check component is unescaped
+    $url->_expect('path', '/this has spaces');
+
+    # modify the unescaped form
+    $url->path('this ALSO has spaces');
+    # check whole url is escaped
+    $url->_expect('as_string',
+		  'http://web/this%20ALSO%20has%20spaces');
+
+    $url = new URI::URL uri_escape('http://web/try %?#" those');
+    $url->_expect('as_string',
+		  'http://web/try%20%25%3F%23%22%20those');
+
+    my $all = pack('c*',0..255);
+    my $esc = uri_escape($all);
+    my $new = uri_unescape($esc);
+    die "uri_escape->uri_unescape mismatch" unless $all eq $new;
+    $url->path($all);
+    $url->_expect('full_path' => '/%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20!%22%23$%25%26\'()*%2B,-./0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF');
+
+    # test escaping uses uppercase (preferred by rfc1837)
+    $url = new URI::URL 'file://h/';
+    $url->path(chr(0x7F));
+    $url->_expect('as_string', 'file://h/%7F');
+
+    # reserved characters differ per scheme
+
+    ## XXX is this '?' allowed to be unescaped
+    $url = new URI::URL 'file://h/test?ing';
+    $url->_expect('path', '/test?ing');
+
+    $url = new URI::URL 'file://h/';
+    $url->epath('question?mark');
+    $url->_expect('as_string', 'file://h/question?mark');
+    # XXX Why should this be any different???
+    #     Perhaps we should not expect too much :-)
+    $url->path('question?mark');
+    $url->_expect('as_string', 'file://h/question%3Fmark');
+
+    # See what happens when set different elements to this ugly sting
+    my $reserved = ';/?:@&=#%';
+    $url->path($reserved . "foo");
+    $url->_expect('as_string', 'file://h/%3B/%3F%3A%40%26%3D%23%25foo');
+
+    $url->scheme('http');
+    $url->path('');
+    $url->_expect('as_string', 'http://h/');
+    $url->query($reserved);
+    $url->params($reserved);
+    $url->frag($reserved);
+    $url->_expect('as_string', 'http://h/;%3B%2F%3F%3A%40&=%23%25?%3B%2F%3F%3A%40&=%23%25#;/?:@&=#%');
+
+    $str = $url->as_string;
+    $url = new URI::URL $str;
+    die "URL changed" if $str ne $url->as_string;
+
+    $url = new URI::URL 'ftp:foo';
+    $url->user($reserved);
+    $url->host($reserved);
+    $url->_expect('as_string', 'ftp://%3B%2F%3F%3A%40%26%3D%23%25@%3B%2F%3F%3A%40%26%3D%23%25/foo');
+
+}
+
+
+#####################################################################
+#
+# newlocal_test()
+#
+
+sub newlocal_test {
+    print "newlocal_test:\n";
+    my $pwd = ($^O eq 'MSWin32' ? 'cd' : (-e '/bin/pwd' ? '/bin/pwd' : 'pwd'));
+    my $tmpdir = ($^O eq 'MSWin32' ? $ENV{TEMP} : '/tmp');
+    $tmpdir =~ tr|\\|/|;
+
+    my $savedir = `$pwd`;     # we don't use Cwd.pm because we want to check
+			      # that it get require'd corretly by URL.pm
+    chomp $savedir;
+
+    # cwd
+    chdir($tmpdir) or die $!;
+    my $dir = `$pwd`; $dir =~ tr|\\|/|;
+    chomp $dir; $dir = uri_escape($dir, ':');
+    $url = newlocal URI::URL;
+    $url->_expect('as_string', URI::URL->new("file:$dir/")->as_string);
+
+    print "Local directory is ". $url->local_path . "\n";
+
+    # absolute dir
+    chdir('/') or die $!;
+    $url = newlocal URI::URL '/usr/';
+    $url->_expect('as_string', 'file:/usr/');
+
+    # absolute file
+    $url = newlocal URI::URL '/vmunix';
+    $url->_expect('as_string', 'file:/vmunix');
+
+    # relative file
+    chdir($tmpdir) or die $!;
+    $dir = `$pwd`; $dir =~ tr|\\|/|;
+    chomp $dir; $dir = uri_escape($dir, ':');
+    $url = newlocal URI::URL 'foo';
+    $url->_expect('as_string', "file:$dir/foo");
+
+    # relative dir
+    chdir($tmpdir) or die $!;
+    $dir = `$pwd`; $dir =~ tr|\\|/|;
+    chomp $dir; $dir = uri_escape($dir, ':');
+    $url = newlocal URI::URL 'bar/';
+    $url->_expect('as_string', "file:$dir/bar/");
+
+    # 0
+    chdir('/') or die $!;
+    $dir = `$pwd`; $dir =~ tr|\\|/|;
+    chomp $dir; $dir = uri_escape($dir, ':');
+    $url = newlocal URI::URL '0';
+    $url->_expect('as_string', "file:${dir}0");
+
+    # Test access methods for file URLs
+    $url = new URI::URL 'file:/c:/dos';
+    $url->_expect('dos_path', 'C:\\DOS');
+    $url->_expect('unix_path', '/c:/dos');
+    $url->_expect('vms_path', '[C:]DOS');
+    eval { $url->mac_path; };  # This is not allowed since we have ':' in path
+    die "Mac_path generated when it should fail." unless $@;
+    $url = new URI::URL 'file:/foo/bar';
+    $url->_expect('unix_path', '/foo/bar');
+    $url->_expect('mac_path', 'foo:bar');
+
+    # Some edge cases
+    $url = new URI::URL 'file:';
+    $url->_expect('unix_path', '/');
+    $url = new URI::URL 'file:/';
+    $url->_expect('unix_path', '/');
+    $url = new URI::URL 'file:.';
+    $url->_expect('unix_path', '.');
+    $url = new URI::URL 'file:./foo';
+    $url->_expect('unix_path', 'foo');
+    $url = new URI::URL 'file:0';
+    $url->_expect('unix_path', '0');
+    $url = new URI::URL 'file:../../foo';
+    $url->_expect('unix_path', '../../foo');
+    $url = new URI::URL 'file:foo/../bar';
+    $url->_expect('unix_path', 'bar');
+
+    # Relative files
+    $url = new URI::URL 'file:foo/b%61r/Note.txt';
+    $url->_expect('unix_path', 'foo/bar/Note.txt');
+    $url->_expect('mac_path', ':foo:bar:Note.txt');
+    $url->_expect('dos_path', 'FOO\\BAR\\NOTE.TXT');
+    $url->_expect('vms_path', '[.FOO.BAR]NOTE.TXT');
+
+    # The VMS path found in RFC 1738 (section 3.10)
+    $url = new URI::URL 'file://vms.host.edu/disk$user/my/notes/note12345.txt';
+    $url->_expect('vms_path', 'DISK$USER:[MY.NOTES]NOTE12345.TXT');
+    $url->_expect('mac_path', 'disk$user:my:notes:note12345.txt');
+
+    chdir($savedir) or die $!;
+}
+
+
+#####################################################################
+#
+# absolute_test()
+#
+sub absolute_test {
+
+    print "Test relative/absolute URI::URL parsing:\n";
+
+    # Tests from draft-ietf-uri-relative-url-06.txt
+    # Copied verbatim from the draft, parsed below
+
+    @URI::URL::g::ISA = qw(URI::URL::_generic); # for these tests
+
+    my $base = 'http://a/b/c/d;p?q#f';
+
+    $absolute_tests = <<EOM;
+5.1.  Normal Examples
+
+      g:h        = <URL:g:h>
+      g          = <URL:http://a/b/c/g>
+      ./g        = <URL:http://a/b/c/g>
+      g/         = <URL:http://a/b/c/g/>
+      /g         = <URL:http://a/g>
+      //g        = <URL:http://g>
+      ?y         = <URL:http://a/b/c/d;p?y>
+      g?y        = <URL:http://a/b/c/g?y>
+      g?y/./x    = <URL:http://a/b/c/g?y/./x>
+      #s         = <URL:http://a/b/c/d;p?q#s>
+      g#s        = <URL:http://a/b/c/g#s>
+      g#s/./x    = <URL:http://a/b/c/g#s/./x>
+      g?y#s      = <URL:http://a/b/c/g?y#s>
+      ;x         = <URL:http://a/b/c/d;x>
+      g;x        = <URL:http://a/b/c/g;x>
+      g;x?y#s    = <URL:http://a/b/c/g;x?y#s>
+      .          = <URL:http://a/b/c/>
+      ./         = <URL:http://a/b/c/>
+      ..         = <URL:http://a/b/>
+      ../        = <URL:http://a/b/>
+      ../g       = <URL:http://a/b/g>
+      ../..      = <URL:http://a/>
+      ../../     = <URL:http://a/>
+      ../../g    = <URL:http://a/g>
+
+5.2.  Abnormal Examples
+
+   Although the following abnormal examples are unlikely to occur
+   in normal practice, all URL parsers should be capable of resolving
+   them consistently.  Each example uses the same base as above.
+
+   An empty reference resolves to the complete base URL:
+
+      <>         = <URL:http://a/b/c/d;p?q#f>
+
+   Parsers must be careful in handling the case where there are more
+   relative path ".." segments than there are hierarchical levels in
+   the base URL's path.  Note that the ".." syntax cannot be used to
+   change the <net_loc> of a URL.
+
+     ../../../g = <URL:http://a/../g>
+     ../../../../g = <URL:http://a/../../g>
+
+   Similarly, parsers must avoid treating "." and ".." as special
+   when they are not complete components of a relative path.
+
+      /./g       = <URL:http://a/./g>
+      /../g      = <URL:http://a/../g>
+      g.         = <URL:http://a/b/c/g.>
+      .g         = <URL:http://a/b/c/.g>
+      g..        = <URL:http://a/b/c/g..>
+      ..g        = <URL:http://a/b/c/..g>
+
+   Less likely are cases where the relative URL uses unnecessary or
+   nonsensical forms of the "." and ".." complete path segments.
+
+      ./../g     = <URL:http://a/b/g>
+      ./g/.      = <URL:http://a/b/c/g/>
+      g/./h      = <URL:http://a/b/c/g/h>
+      g/../h     = <URL:http://a/b/c/h>
+
+   Finally, some older parsers allow the scheme name to be present in
+   a relative URL if it is the same as the base URL scheme.  This is
+   considered to be a loophole in prior specifications of partial
+   URLs [1] and should be avoided by future parsers.
+
+      http:g     = <URL:http:g>
+      http:      = <URL:http:>
+EOM
+    # convert text to list like
+    # @absolute_tests = ( ['g:h' => 'g:h'], ...)
+
+    for $line (split("\n", $absolute_tests)) {
+	next unless $line =~ /^\s{6}/;
+	if ($line =~ /^\s+(\S+)\s*=\s*<URL:([^>]*)>/) {
+	    my($rel, $abs) = ($1, $2);
+	    $rel = '' if $rel eq '<>';
+	    push(@absolute_tests, [$rel, $abs]);
+	}
+	else {
+	    warn "illegal line '$line'";
+	}
+    }
+
+    # add some extra ones for good measure
+
+    push(@absolute_tests, ['x/y//../z' => 'http://a/b/c/x/y/z'],
+			  ['1'         => 'http://a/b/c/1'    ],
+			  ['0'         => 'http://a/b/c/0'    ],
+			  ['/0'        => 'http://a/0'        ],
+			  ['%2e/a'     => 'http://a/b/c/%2e/a'],  # %2e is '.'
+			  ['%2e%2e/a'  => 'http://a/b/c/%2e%2e/a'],
+	);
+
+    print "  Relative    +  Base  =>  Expected Absolute URL\n";
+    print "================================================\n";
+    for $test (@absolute_tests) {
+	my($rel, $abs) = @$test;
+	my $abs_url = new URI::URL $abs;
+	my $abs_str = $abs_url->as_string;
+
+	printf("  %-10s  +  $base  =>  %s\n", $rel, $abs);
+	my $u   = new URI::URL $rel, $base;
+	my $got = $u->abs;
+	$got->_expect('as_string', $abs_str);
+    }
+
+    # bug found and fixed in 1.9 by "J.E. Fritz" <FRITZ@gems.vcu.edu>
+    $base = new URI::URL 'http://host/directory/file';
+    my $relative = new URI::URL 'file', $base;
+    my $result = $relative->abs;
+
+    my ($a, $b) = ($base->path, $result->path);
+	die "'$a' and '$b' should be the same" unless $a eq $b;
+
+    # Counter the expectation of least surprise,
+    # section 6 of the draft says the URL should
+    # be canonicalised, rather than making a simple
+    # substitution of the last component.
+    # Better doublecheck someone hasn't "fixed this bug" :-)
+    $base = new URI::URL 'http://host/dir1/../dir2/file';
+    $relative = new URI::URL 'file', $base;
+    $result = $relative->abs;
+    die 'URL not canonicalised' unless $result eq 'http://host/dir2/file';
+
+    print "--------\n";
+    # Test various other kinds of URLs and how they like to be absolutized
+    for (["http://abc/", "news:45664545", "http://abc/"],
+	 ["news:abc",    "http://abc/",   "news:abc"],
+	 ["abc",         "file:/test?aas", "file:/abc"],
+	 ["gopher:",     "",               "gopher:"],
+	 ["?foo",        "http://abc/a",   "http://abc/a?foo"],
+	 ["?foo",        "file:/abc",      "file:/?foo"],
+	 ["#foo",        "http://abc/a",   "http://abc/a#foo"],
+	 ["#foo",        "file:a",         "file:a#foo"],
+	 ["#foo",        "file:/a",         "file:/a#foo"],
+	 ["#foo",        "file:/a",         "file:/a#foo"],
+	 ["#foo",        "file://localhost/a", "file://localhost/a#foo"],
+	 ['123@sn.no',   "news:comp.lang.perl.misc", 'news:123@sn.no'],
+	 ['no.perl',     'news:123@sn.no',           'news:no.perl'],
+	 ['mailto:aas@a.sn.no', "http://www.sn.no/", 'mailto:aas@a.sn.no'],
+
+	 # Test absolutizing with old behaviour.
+	 ['http:foo',     'http://h/a/b',   'http://h/a/foo'],
+	 ['http:/foo',    'http://h/a/b',   'http://h/foo'],
+	 ['http:?foo',    'http://h/a/b',   'http://h/a/b?foo'],
+	 ['http:#foo',    'http://h/a/b',   'http://h/a/b#foo'],
+	 ['http:?foo#bar','http://h/a/b',   'http://h/a/b?foo#bar'],
+	 ['file:/foo',    'http://h/a/b',   'file:/foo'],
+
+	)
+    {
+	my($url, $base, $expected_abs) = @$_;
+	my $rel = new URI::URL $url, $base;
+	my $abs = $rel->abs($base, 1);
+	printf("  %-12s+  $base  =>  %s\n", $rel, $abs);
+	$abs->_expect('as_string', $expected_abs);
+    }
+    print "absolute test ok\n";
+
+    # Test relative function
+    for (
+	 ["http://abc/a",   "http://abc",        "a"],
+	 ["http://abc/a",   "http://abc/b",      "a"],
+	 ["http://abc/a?q", "http://abc/b",      "a?q"],
+	 ["http://abc/a;p", "http://abc/b",      "a;p"],
+	 ["http://abc/a",   "http://abc/a/b/c/", "../../../a"],
+         ["http://abc/a/",  "http://abc/a/",     "./"],
+         ["http://abc/a#f", "http://abc/a",      "#f"],
+
+	 ["file:/etc/motd", "file:/",            "etc/motd"],
+	 ["file:/etc/motd", "file:/etc/passwd",  "motd"],
+	 ["file:/etc/motd", "file:/etc/rc2.d/",  "../motd"],
+	 ["file:/etc/motd", "file:/usr/lib/doc", "../../etc/motd"],
+         ["file:",          "file:/etc/",        "../"],
+         ["file:foo",       "file:/etc/",        "../foo"],
+
+	 ["mailto:aas",     "http://abc",        "mailto:aas"],
+
+	 # Nicolai Langfeldt's original example
+	 ["http://www.math.uio.no/doc/mail/top.html",
+	  "http://www.math.uio.no/doc/linux/", "../mail/top.html"],
+        )
+    {
+	my($abs, $base, $expect) = @$_;
+	printf "url('$abs', '$base')->rel eq '$expect'\n";
+	my $rel = URI::URL->new($abs, $base)->rel;
+	$rel->_expect('as_string', $expect);
+    }
+    print "relative test ok\n";
+}
+
+
+sub eq_test
+{
+    my $u1 = new URI::URL 'http://abc.com:80/~smith/home.html';
+    my $u2 = new URI::URL 'http://ABC.com/%7Esmith/home.html';
+    my $u3 = new URI::URL 'http://ABC.com:/%7esmith/home.html';
+
+    # Test all permutations of these tree
+    $u1->eq($u2) or die "1: $u1 ne $u2";
+    $u1->eq($u3) or die "2: $u1 ne $u3";
+    $u2->eq($u1) or die "3: $u2 ne $u1";
+    $u2->eq($u3) or die "4: $u2 ne $u3";
+    $u3->eq($u1) or die "5: $u3 ne $u1";
+    $u3->eq($u2) or die "6: $u3 ne $u2";
+
+    # Test empty path
+    my $u4 = new URI::URL 'http://www.sn.no';
+    $u4->eq("HTTP://WWW.SN.NO:80/") or die "7: $u4";
+    $u4->eq("http://www.sn.no:81") and die "8: $u4";
+
+    # Test mailto
+    my $u5 = new URI::URL 'mailto:AAS@SN.no';
+    $u5->eq('mailto:aas@sn.no') or die "9: $u5";
+
+    # Test reserved char
+    my $u6 = new URI::URL 'ftp://ftp/%2Fetc';
+    $u6->eq("ftp://ftp/%2fetc") or die "10: $u6";
+    $u6->eq("ftp://ftp://etc") and die "11: $u6";
+}
+
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/heuristic.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/heuristic.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/heuristic.t	(revision 21083)
@@ -0,0 +1,61 @@
+print "1..14\n";
+
+use URI::Heuristic qw(uf_urlstr uf_url);
+$URI::Heuristic::DEBUG++;
+open(STDERR, ">&STDOUT");  # redirect STDERR
+
+print "not " unless uf_urlstr("http://www.sn.no/") eq "http://www.sn.no/";
+print "ok 1\n";
+
+print "not " unless uf_urlstr("/etc/passwd") eq "file:/etc/passwd";
+print "ok 2\n";
+
+print "not " unless uf_urlstr("./foo.txt") eq "file:./foo.txt";
+print "ok 3\n";
+
+print "not " unless uf_urlstr("ftp.aas.no/lwp.tar.gz") eq "ftp://ftp.aas.no/lwp.tar.gz";
+print "ok 4\n";
+
+print "not " unless uf_urlstr("C:\\CONFIG.SYS") eq "file:C:\\CONFIG.SYS";
+print "ok 5\n";
+
+if (gethostbyname("www.netscape.com")) {
+    # DNS probably work, lets run test 6..8
+
+    $URI::Heuristic::MY_COUNTRY = "no";
+    print "not " unless uf_urlstr("perl/camel.gif") eq "http://www.perl.com/camel.gif";
+    print "ok 6\n";
+
+    $URI::Heuristic::MY_COUNTRY = "uk";
+    print "not " unless uf_urlstr("perl/camel.gif") eq "http://www.perl.co.uk/camel.gif";
+    print "ok 7\n";
+   
+    $ENV{URL_GUESS_PATTERN} = "www.ACME.org www.ACME.com";
+    print "not " unless uf_urlstr("perl") eq "http://www.perl.org";
+    print "ok 8\n";
+
+} else {
+    # don't make the inocent worry
+    print "Skipping test 6-8 because DNS does not work\n";
+    for (6..8) { print "ok $_\n"; }
+
+}
+
+$ENV{URL_GUESS_PATTERN} = "";
+print "not " unless uf_urlstr("perl") eq "http://perl";
+print "ok 9\n";
+
+print "not " unless uf_urlstr("http:80") eq "http:80";
+print "ok 10\n";
+
+print "not " unless uf_urlstr("mailto:gisle\@aas.no") eq "mailto:gisle\@aas.no";
+print "ok 11\n";
+
+print "not " unless uf_urlstr("gisle\@aas.no") eq "mailto:gisle\@aas.no";
+print "ok 12\n";
+
+print "not " unless uf_urlstr("Gisle.Aas\@aas.perl.org") eq "mailto:Gisle.Aas\@aas.perl.org";
+print "ok 13\n";
+
+print "not " unless uf_url("gopher.sn.no")->scheme eq "gopher";
+print "ok 14\n";
Index: /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/rel-base.t
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/rel-base.t	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/libwww-perl-5.36/t/uri/rel-base.t	(revision 21083)
@@ -0,0 +1,24 @@
+print "1..3\n";
+
+use URI::URL;
+
+# We used to have problems with URLs that used a base that was
+# not absolute itself.
+
+$u1 = url("/foo/bar", "http://www.acme.com/");
+$u2 = url("../foo/", $u1);
+$u3 = url("zoo/foo", $u2);
+
+$a1 = $u1->abs->as_string;
+$a2 = $u2->abs->as_string;
+$a3 = $u3->abs->as_string;
+
+print "$a1\n$a2\n$a3\n";
+
+print "not " unless $a1 eq "http://www.acme.com/foo/bar";
+print "ok 1\n";
+print "not " unless $a2 eq "http://www.acme.com/foo/";
+print "ok 2\n";
+print "not " unless $a3 eq "http://www.acme.com/foo/zoo/foo";
+print "ok 3\n";
+
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Artistic
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Artistic	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Artistic	(revision 21083)
@@ -0,0 +1,131 @@
+
+
+
+
+			 The "Artistic License"
+
+				Preamble
+
+The intent of this document is to state the conditions under which a
+Package may be copied, such that the Copyright Holder maintains some
+semblance of artistic control over the development of the package,
+while giving the users of the package the right to use and distribute
+the Package in a more-or-less customary fashion, plus the right to make
+reasonable modifications.
+
+Definitions:
+
+	"Package" refers to the collection of files distributed by the
+	Copyright Holder, and derivatives of that collection of files
+	created through textual modification.
+
+	"Standard Version" refers to such a Package if it has not been
+	modified, or has been modified in accordance with the wishes
+	of the Copyright Holder as specified below.
+
+	"Copyright Holder" is whoever is named in the copyright or
+	copyrights for the package.
+
+	"You" is you, if you're thinking about copying or distributing
+	this Package.
+
+	"Reasonable copying fee" is whatever you can justify on the
+	basis of media cost, duplication charges, time of people involved,
+	and so on.  (You will not be required to justify it to the
+	Copyright Holder, but only to the computing community at large
+	as a market that must bear the fee.)
+
+	"Freely Available" means that no fee is charged for the item
+	itself, though there may be fees involved in handling the item.
+	It also means that recipients of the item may redistribute it
+	under the same conditions they received it.
+
+1. You may make and give away verbatim copies of the source form of the
+Standard Version of this Package without restriction, provided that you
+duplicate all of the original copyright notices and associated disclaimers.
+
+2. You may apply bug fixes, portability fixes and other modifications
+derived from the Public Domain or from the Copyright Holder.  A Package
+modified in such a way shall still be considered the Standard Version.
+
+3. You may otherwise modify your copy of this Package in any way, provided
+that you insert a prominent notice in each changed file stating how and
+when you changed that file, and provided that you do at least ONE of the
+following:
+
+    a) place your modifications in the Public Domain or otherwise make them
+    Freely Available, such as by posting said modifications to Usenet or
+    an equivalent medium, or placing the modifications on a major archive
+    site such as uunet.uu.net, or by allowing the Copyright Holder to include
+    your modifications in the Standard Version of the Package.
+
+    b) use the modified Package only within your corporation or organization.
+
+    c) rename any non-standard executables so the names do not conflict
+    with standard executables, which must also be provided, and provide
+    a separate manual page for each non-standard executable that clearly
+    documents how it differs from the Standard Version.
+
+    d) make other distribution arrangements with the Copyright Holder.
+
+4. You may distribute the programs of this Package in object code or
+executable form, provided that you do at least ONE of the following:
+
+    a) distribute a Standard Version of the executables and library files,
+    together with instructions (in the manual page or equivalent) on where
+    to get the Standard Version.
+
+    b) accompany the distribution with the machine-readable source of
+    the Package with your modifications.
+
+    c) give non-standard executables non-standard names, and clearly
+    document the differences in manual pages (or equivalent), together
+    with instructions on where to get the Standard Version.
+
+    d) make other distribution arrangements with the Copyright Holder.
+
+5. You may charge a reasonable copying fee for any distribution of this
+Package.  You may charge any fee you choose for support of this
+Package.  You may not charge a fee for this Package itself.  However,
+you may distribute this Package in aggregate with other (possibly
+commercial) programs as part of a larger (possibly commercial) software
+distribution provided that you do not advertise this Package as a
+product of your own.  You may embed this Package's interpreter within
+an executable of yours (by linking); this shall be construed as a mere
+form of aggregation, provided that the complete Standard Version of the
+interpreter is so embedded.
+
+6. The scripts and library files supplied as input to or produced as
+output from the programs of this Package do not automatically fall
+under the copyright of this Package, but belong to whomever generated
+them, and may be sold commercially, and may be aggregated with this
+Package.  If such scripts or library files are aggregated with this
+Package via the so-called "undump" or "unexec" methods of producing a
+binary executable image, then distribution of such an image shall
+neither be construed as a distribution of this Package nor shall it
+fall under the restrictions of Paragraphs 3 and 4, provided that you do
+not represent such an executable image as a Standard Version of this
+Package.
+
+7. C subroutines (or comparably compiled subroutines in other
+languages) supplied by you and linked into this Package in order to
+emulate subroutines and variables of the language defined by this
+Package shall not be considered part of this Package, but are the
+equivalent of input as in Paragraph 6, provided these subroutines do
+not change the language in any way that would cause it to fail the
+regression tests for the language.
+
+8. Aggregation of this Package with a commercial distribution is always
+permitted provided that the use of this Package is embedded; that is,
+when no overt attempt is made to make this Package's interfaces visible
+to the end user of the commercial distribution.  Such use shall not be
+construed as a distribution of this Package.
+
+9. The name of the Copyright Holder may not be used to endorse or promote
+products derived from this software without specific prior written permission.
+
+10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
+IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+				The End
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Changes
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Changes	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Changes	(revision 21083)
@@ -0,0 +1,51 @@
+Fixes in 1.0.6:
+- -f works with binary files
+- w3mir will no longer use 'Referer: (commandline)' when a URL is derived
+  from the commandline/config file.
+- More errormessage fixes
+- Fixed install instructions to warn against LWP 5.40.
+
+Fixes in 1.0.5: 
+- Better error-messaged in -quiet mode 
+- Fixed quoting. Both " and ' quotes in documents are accepted. 
+- Fixed timeout handling. 
+- Fixed broken connection handling. Incomplete documents are 
+  deleted and retried.
+- Fixed URL mangling problem. In 1.0.3 URLs like ``foo.html#bar'' would
+  be rewritten to ``#bar''. This is quite bad and makes a lot of mirrors
+  un-useable. 
+- -v now prints LWPs version as well as w3mirs version
+
+Features/bugs in 1.0.5 
+- As earlier, w3mir does not support cookies. I have received a patch for
+  basic cookie support but have not yet incorporated it due to
+  time-restraints.
+- There actually exists web servers that break the HTTP standard rather
+  thoroughly by not sending a Content-type header (this is mandatory in
+  the standard). W3mir will not discover that a HTML file is HTML in this
+  case and will not extract URLs from it.
+- If you rewrite the ending filename URLs with Apply rules (as in 
+  index.htm -> index.html) and there are links to index.htm#foo the link
+  will be incorrect after mirroring. The solution is to avoid those
+  kinds of rules. This was meant to be fixed in 1.0.3 (which broke it as
+  described above), I will fix it when I get more time. The fix is to
+  remove the #fragment part of URLs when they pass thru the apply
+  machinery. Patches accepted. 
+
+Fixes in 1.0.3: 
+- The -R/remove option to remove files is no longer more destructive
+  than intended.
+- Files with 'unsafe' characters in their filename is now saved as
+  "foo bar" instead of "foo%20bar" 
+- The -B switch works once again. 
+
+Fixes in 1.0.2: 
+- W3mir now only newline converts HTML files, all other files are handled
+  as binary. This should ensure file-integrety even when working with
+   mis-configured servers. 
+
+Fixes in 1.0.1: 
+-fa option and corresponding configuration file directive works again. 
+- Added -nnc option and a corresponding configuration file directive. It
+  disables newline conversions, which could corrupt files the Webserver
+  mis-declares. The HOWTO explains the uses of -nnc 
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL	(revision 21083)
@@ -0,0 +1,117 @@
+This is how you install w3mir on a Unix system. Please see the file
+INSTALL.w32 for install instructions for win32 systems.
+
+INSTALLING PREREQUISITES:
+
+The prerequisites are the perl packages libwww-perl, and MIME-Base64.
+The w3mir install procedure will check for their presence and complain
+if they are not there, so if you are unsure what you have you might
+skip this part for now.
+
+- Get libwww-perl from CPAN 
+  (http://www.perl.com/CPAN/modules/by-module/WWW/).  W3mir does not work
+  with LWP 5.40 and later versions.  Please get an earlier version.
+  It also does not work with the new URI package.  Use the URI package
+  enclosed in the older LWP.
+
+- Unpack it:
+
+    gzip -dc libwww-perl-*.tar.gz | tar xvBf -
+
+- Install it.  W3mir does not require the whole libwww-perl package and
+  all the packages that goes with it to work so you may follow these
+  install instructions instead of the libwww-perl install instructions
+  to get an easier install which will work with w3mir.
+
+    cd libwww-perl-*
+
+  Are you going to install it in the standard perl place (you need to
+  be the system administrator to do this)? If so:
+
+    perl Makefile.PL
+
+  If not (if you are a user):
+
+    perl Makefile.PL PREFIX=/some/dir
+
+  /some/dir could be ~ (as in your home directory).
+
+  IF you are installing an old LWP just for w3mir you can install both
+  the old LWP, the Base64 module and w3mir in a special PREFIX
+  separate from your usual install PREFIX.  This ensures that w3mir will
+  access the older version of LWP and that other software will access
+  the newer version.  If you do this make sure you install all of LWP,
+  Base64 and w3mir with the same PREFIX.
+
+  This step might produce some complaints;  A standard perl
+  installation will typically get messages about missing these
+  modules: IO::Socket, NET::FTP and MD5.  None of these need be
+  installed to run w3mir and so any error messages about these may
+  safely be ignored.
+
+    make
+    make test      (robot/ua and local/http might fail, that's OK)
+    make install
+
+  Now libwww-perl should be installed and working.
+
+- You also have to get the MIME-Base64 package
+  (http://www.perl.com/CPAN/modules/by-module/MIME/)
+
+- Unpack it:
+
+    gzip -dc MIME-Base64-*.tar.gz | tar xvBf -
+
+- Install it:
+
+    cd MIME-Base64-*
+
+  Then, as above, either
+
+    perl Makefile.PL
+
+  or
+
+    perl Makefile.PL PREFIX=/some/dir
+
+  Continue:
+
+    make
+    make test      (it should print 'All tests successful.')
+    make install
+
+  Now MIME-Base64 should be installed and working.
+
+INSTALLING W3MIR:
+
+- Get w3mir (http://www.math.uio.no/~janl/w3mir/ or from CPAN)
+
+- Unpack it:
+
+     gzip -dc w3mir-*.tar.gz | tar xvBf -
+
+- Install it:
+
+     cd w3mir-*
+
+  Are you going to install it in the standard perl place? (You
+  probably need to be the system administrator to do this.)  If so:
+
+    perl Makefile.PL
+
+  If not (if you're a user):
+
+    perl Makefile.PL PREFIX=/some/dir
+
+  /some/dir could be ~ (as in your home directory).
+
+  then
+
+     make
+     make install
+
+w3mir should now be installed correctly.  And if it's installed in
+your path you can even run it.  If you use csh or tcsh you want to run
+'rehash' before the shell will find it.
+
+1999/04/14 - Nicolai Langfeldt
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL.w32
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL.w32	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/INSTALL.w32	(revision 21083)
@@ -0,0 +1,92 @@
+This file contains installation instructions for two different ports
+of Perl to win32.  One port is known as the 'ActivePerl' port, the
+other is known as 'the GS port'.
+
+********************************* ActivePerl **********************************
+
+This was written and submitted by Roland Bauer.  Thanks.  I have
+edited them slightly.
+
+How to install w3mir on Win95/AS-port (April 1999):
+===================================================
+
++ get and install winzip from http://www.winzip.com/
++ get and install ActivePerl (now Build 509) from http://www.activestate.com/
++ get nmake.exe from 
+  ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe
+  (or set switch make=nmake to make=dmake in Config.pm
+  and get dmake from GS port)
+
++ perl makefile.pl
++ nmake
++ nmake install
+
++ perl w3mir -h
++ perl w3mir http://xx.zz.zz/dir/
+
+
+Caveats:
+========
+
++ archive 1.0.6 from CPAN seems to be corrupted
+
++ &mkdir does not seem to work with dos-paths
+like 'D:/DIR1/DIR2'
+(so it is not possible to save to another harddisk)
+
+*********************************** GS Perl ***********************************
+
+These win32 installation instructions were written by Paul Hsiao and
+slightly edited by me. My thanks to Paul. It was current as of
+22-May-1998.
+
+
+WINZIP DOWNLOAD INSTRUCTIONS
+
+    The WinZip program can be accessed from the "Start" button, if the
+    program came with your system.  This software can be obtained from:
+ 
+                http://www.winzip.com/
+ 
+    Follow the installation instructions for the WinZip software as needed.
+
+ 
+PERL DOWNLOAD INSTRUCTIONS
+ 
+    The w3mir code will need access to version 5.003 or higher of the 
+    Perl interpreter and LWP library extensions in order for it to run. 
+    This software can be obtained from:
+ 
+                ftp://sunsite.uio.no/pub/languages/perl/CPAN/ports/win32/Standard
+ 
+    From this URL, select perl5.00402-bindist04-bc.tar.gz and download
+    to your PC into a folder of your choice.  In the folder, run WinZip
+    on this file.  For MS Windows 95, you need to update the registration: 
+    open C:\autoexec.bat  and add a line
+
+                path %path%;C:\Perl\bin;       
+    (C:\Perl\ is the path of the perl folder)  
+
+
+W3MIR DOWNLOAD AND INSTALLATION INSTRUCTIONS
+
+    You already have w3mir. Right? Unpack the .tar.gz file with
+    winzip.
+ 
+    Open a DOS prompt screen and go to the w3mir folder:
+ 
+        cd C:\w3mir-1.0.3
+ 
+    Type the install command for w3mir:
+ 
+        perl.exe Makefile.PL
+        make
+        make install
+ 
+    To test w3mir, type:
+ 
+    perl w3mir -h
+ 
+    If the screen displays all options (about 25 options), then 
+    w3mir is installed correctly.
+
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/MANIFEST
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/MANIFEST	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/MANIFEST	(revision 21083)
@@ -0,0 +1,15 @@
+Artistic
+Changes
+INSTALL
+INSTALL.w32
+MANIFEST
+Makefile.PL
+README
+example.cfg
+multiscope.cfg
+w3mir.PL
+w3mir-HOWTO.html
+w3mfix.PL
+htmlop.pm
+w3http.pm
+w3pdfuri.pm
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Makefile.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Makefile.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/Makefile.PL	(revision 21083)
@@ -0,0 +1,116 @@
+# -*-perl-*-
+# Makefile.PL for w3mir.
+# Note that the file 'MANIFEST' is quite significant in this context
+#
+# Notes:  Should unpack any tar.gz files in current directory and install
+#   them with identical arguments to Makefile.PL to this invocation.
+#   This is especially for making installation of w3mir easy 
+#   by installing libwww-perl and mime-base64 for the user before
+#   installing w3mir.  Cool eh?  That would require some changes.
+#
+# - janl 18/4/1997
+#
+# 19/04/99 janl: Added 'clean' target on tip from  Lupe Christoph
+#	and LWP max-version check to the LWP detection.
+# 
+
+# First just write the Makefile
+use ExtUtils::MakeMaker;
+
+WriteMakefile(
+    NAME	=> 'w3mir',
+    VERSION_FROM => 'w3mir.PL', # finds $VERSION
+    EXE_FILES => [ 'w3mir', 'w3mfix' ],
+    clean => { FILES => 'w3mir w3mfix' },
+    dist => { COMPRESS => 'gzip -f9', SUFFIX => 'gz' },
+);
+
+print "\n";
+
+# Find value of INSTALLSITELIB
+
+&read_makefile;
+$islib = resolve_make_var('INSTALLSITELIB');
+
+# Check for prerequisites
+
+$| = 1;
+my $missing_modules = 0;
+
+# libwww-perl
+print "Checking for libwww-perl:";
+
+eval "use lib '$islib'; require LWP;";
+
+if (!defined($LWP::VERSION)) {
+  print ' failed
+
+libwww seems to be missing.
+
+';
+  $missing_modules++;
+  sleep(2);
+} elsif ($LWP::VERSION<5.08 or $LWP::VERSION>=5.40) {
+  print ' failed
+
+libwww is version ',$LWP::VERSION,', I need version 5.08 to 5.39.
+Please see the INSTALL file.
+
+';
+  $missing_modules++;
+  sleep(2);
+} else {  
+  print " ok\n\n";
+}
+
+# MIME::Base64
+print "Checking for MIME::Base64:";
+
+eval "use lib '$islib'; require MIME::Base64;";
+
+if (!defined(&MIME::Base64::encode)) {
+  print ' failed
+
+MIME::Base64 seems to be missing.
+
+';
+  $missing_modules++;
+  sleep(2);
+} else {
+  print " ok\n\n";
+}
+
+
+print 'Please see the INSTALL file for instructions on how to get the
+missing/too old modules.
+
+' if $missing_modules;
+
+
+sub resolve_make_var ($) {
+
+  my($var) = shift @_;
+  my($val) = $make{$var};
+
+#  print "Resolving: ",$var,"=",$val,"\n";
+  
+  while ($val =~ s~\$\((\S+)\)~$make{$1}~g) {}
+#  print "Resolved: $var: $make{$var} -> $val\n";
+  $val;
+}
+
+
+sub read_makefile {
+
+  open(MAKEFILE, 'Makefile') || 
+    die "Could not open Makefile for reading: $!\n";
+
+  while (<MAKEFILE>) {
+    chomp;
+    next unless m/^([A-Z]+)\s*=\s*(\S+)$/;
+    $make{$1}=$2;
+#    print "Makevar: $1 = $2\n";
+  }
+
+  close(MAKEFILE)
+}
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/README
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/README	(revision 21083)
@@ -0,0 +1,133 @@
+PROPAGANDA:
+
+See http://www.math.uio.no/~janl/w3mir/ for propaganda.
+
+--------------------------------------------------------------------------
+Q: Where can I get a new version of w3mir?
+A: The w3mir homepage is at http://www.math.uio.no/~janl/w3mir/.
+   W3mir is also distributed on CPAN: http://www.perl.com/
+
+Q: Are there any mailing lists?
+A: Yes, see below.
+
+Q: Should I subscribe to any of the mailinglists?
+A: Yes, if you use w3mir at all you should subscribe to 
+   w3mir-info@usit.uio.no, send e-mail to janl@math.uio.no to be
+   subscribed.
+
+Q: I found a bug!
+A: See below.
+
+Q: How do it...
+A: There is a w3mir-HOWTO.html file in the distribution.  Read it.
+
+--------------------------------------------------------------------------
+BUGS:
+
+- -lc switch does not work too well.
+
+Please see below for how to report bugs.
+
+--------------------------------------------------------------------------
+FEATURES (NOT bugs):
+
+- URLs with two /es ('//') in the path component does not work
+  as some might expect.  According to my reading of the http/url spec.
+  it is an illegal construct, which is a Good Thing, because I don't
+  know how to handle it if it's legal.
+- If you start at http://foo/bar/ then index.html might be gotten twice.
+- Some documents point to a point above the server root, i.e.,
+  http://some.server/../stuff.html.  Netscape, and other browsers, in
+  defiance of the URL standard documents will change the URL to
+  http://some.server/stuff.html.  W3mir will not.
+
+--------------------------------------------------------------------------
+MAIL LISTS, REPORTING BUGS:
+
+Please send ideas (see todo lists further down please) and bug reports
+to w3mir-core@usit.uio.no, please include URL and command line/config
+file that triggered the bug. w3mir-info@usit.uio.no is mainly used for
+announcing new versions or bugs to w3mir users. You will get more
+information following that list than anywhere else. And it's very low
+volume. To subscribe to these lists email janl@math.uio.no. The
+w3mir-core list is intended for w3mir hackers only.
+
+--------------------------------------------------------------------------
+COPYRIGTHS:
+
+w3mir, w3http.pm, w3pdfuri.pm and htmlop.pm are free but it is
+Copyrighted by the various involved hackers.  If you want to copy,
+hack or distribte w3mir you can do that providing you comply with the
+'Artistic License' enclosed in the w3mir distribution in the file
+named Artistic.
+
+--------------------------------------------------------------------------
+CREDITS:
+
+- Oscar Nierstrasz: Wrote htget
+- Gorm Haug Eriksen: Started w3mir on the foundations of htget,
+	contributed code later.
+- Nicolai Langfeldt: Learning from Oscar and Gorms mistakes, rewrote
+  everything.
+- Chris Szurgot: Adapting to win32, good ideas and code contribs, 
+  Debugging.  And criticism.
+- Rik Faith: Uses w3mir extensively, not shy about complaining and
+  commenting and suggesting.  
+- The libwww-perl author(s) that made adding some new featres
+  ridicolously easy.
+
+--------------------------------------------------------------------------
+TODO LIST:
+
+* TODO, version 1.1:
+
+Some of these are speculative, some others are very useful.
+
+- CSS parsing/support at the same level as HTML
+- Full support for APPLETS/OBJECT tags.
+- Alias rules.  These would enable w3mir to map ukoln.bath.ac.uk and 
+  bubl.bath.ac.uk to www.ukoln.ac.uk and know that the objects contained
+  in these are all the same.  Another use would be to mirror from a mirror
+  instead of the _real_ site, since the original site to which you have
+  references are on a slow link while the mirror is on a fast link.
+- FTP support (easy if through a http style ftp proxy, but is that what
+  we want?)
+- SHTTP/SSL support
+- Add a 3rd argument to URL/Also that denotes the depth of documents to
+  be retrived under each, this would autimatically generate fetch/ignore
+  rules.  How well these work would be dependent on the order of the
+  URL/Also directives though.  Must be documented.
+- Retrive recursively until N-th order links are reached.  This
+  differs siginificantly from directory recursion which we do now.  When
+  this is done w3mir should also know the difference between inline and
+  external links, inline links should always be retrived.  Trivia question:
+  What order is needed to reach every findable document on the web from
+  Yahoo?
+- Integrate with cvs or rcs (or other version controll system) to make
+  retriver able to reproduce mirrored site for any given date.
+- Some text processing:  Adding and removing text/sgml comments when suitable
+  options and tags are found.
+- Put retrival date-stamps as comments in html files, to document the when
+  and how of how this document was retrived.
+- Example: If you're mirroring a site primarily to get to the papers, but
+  the site has n versions of each paper: foo.ps.gz, foo.ps.Z, foo.dvi.gz
+  foo.dvi.Z, foo.tar.gz, foo.zip and you only need one version.  Implement
+  a way to get only one version of documents provided in multipele versions,
+  something like multi axis preference list to get only the most attractive
+  version of the doc.
+- Logging of retrivals to file, need to change every print to a functioncall.
+- Your suggestion here.
+
+* TODO, http related
+- Use Keep-alive.  Then we should probably stop using 30 second pauses
+  between document retrivals.
+- HTTP/1.1?  HTTP/1.1 servers should do keep-alive even with 1.0 requests.
+- Separate quenes for each server, interleave requests.
+- Authentication is only done if challenged now.  If a document in a
+  directory needs authentication it is very likely that all other documents
+  in that directory and subdirectories require authentication.
+
+* If perl gets threads:
+- Make the retrival and analysis engines separate threads, and have each
+  one retrival thread pr. method/server/port and do paralell retrivals.
+- This makes http/1.1 easier too.
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/example.cfg
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/example.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/example.cfg	(revision 21083)
@@ -0,0 +1,120 @@
+# This is a example w3mir config file.  The file and options are fully
+# documented in the w3mir man page, and a lot is spelled out in the 
+# w3mir-HOWTO.  This file might not be completely updated, but the man
+# page should be.
+#
+# Comment lines start with '#'.  Comments are not allowed at end of
+# lines.  The keywords are not casesensitive, but some settings are,
+# notably fetch/ignore/apply settings, as well as the urls given.
+#
+# Available options: recurse, no-date-check, only-nonexistent, list-urls,
+# lowercase.  It is not default to recurse.  Options must be the
+# first directive to appear in the config file.
+# The options directive needs to be the first directive in the config file
+# and there can only be one.
+Options: recurse
+# Multipele options:
+# Options: recurse, only-nonexistent
+# This directive was previously named 'Fetch-options'
+#
+# Start here:
+URL: http://www.stud.ifi.uio.no/~janl/
+#
+#
+# How much noise to make, one of quiet, brief or chatty.  Default is brief
+#Verbosity: brief
+#
+# Initial referer.  Some servers are very picky....
+#Initial-Referer: http://foo.bar/
+#
+# Headers to disable for anonymitys sake: 
+#Disable-headers: referer, user
+#
+# Nicenes, robotrules can be true or false
+#Robot-Rules: true
+# Default pause between http connections is now 0 seconds 
+# Pause: 0
+# Pause between retries, in seconds.  If w3mir runs as a once-a-day thing
+# this can and should be high.  I suggest at least one hour (3600 seconds).
+#Retry-Pause: 600
+# How many times a failed retrival is retried.
+#Retries: 3
+#
+# URL selection.  Order is significant, first Fetch/Ignore rule overrides
+# later rules.  Supply as many as you want.  If not matched by ignore rules
+# a doc is gotten.  
+#Fetch: *.html
+#
+# Ignore urls we can't copy anyway.  Actually w3mir can copy
+# many cgi things with no problems.  But not always.
+Ignore: *.cgi
+Ignore: *-cgi
+Ignore: *.map
+#
+# RE variants are full perl REs.  Mix freely with the others.  These
+# must be legal perl REs, including the starting m and any
+# options you want, like 'i'.
+#
+#Fetch-RE: m/jpeg/
+#Ignore-RE: m/\.gif$/
+#
+# URL manipulation.  _All_ rules are applied in order.  If lowercasing
+# options is given that is done first.  This must be a legal perl
+# substitution RE.  Including the starting s and any options you want,
+# like 'g' and 'i'.
+#
+# This changes the name of all .gif files to .fif
+#Apply: s/\.gif$/.fif/
+#
+# HTTP Proxy server:
+#HTTP-Proxy: www-cache.uio.no:3128
+#
+# HTTP Proxy options: 
+# - 'revalidate': Force proxy to revalidate cached documents.
+# - 'refresh': Force proxy to get cached documents from server _again_.
+# - 'no-store': Use if the contents of the documents is sensitive.
+# - 'no-pragma': Force use of HTTP/1.1 'Cache-Control:' header.
+# If only 'refresh' is specified the default is to use the 'Pragma: no-cache'
+# HTTP/1.0 header, this can be overruled with the 'no-pragma' option.
+# You can be fairly sure any proxy will understand 'refresh', ONLY HTTP/1.1
+# proxies will understand 'revalidate' and 'no-store'.
+#proxy-options: refresh
+#
+# HTTP Proxy authentication.  The mechanism  is simpleminded, we either need
+# to authenticate ourselves with the proxy or not, and there can only be
+# one user/password tuple, domain/realm information is ignored...
+# HTTP-Proxy-user: foo
+# HTTP-Proxy-passwd: bar
+#
+# What to do with files, one of save, stdout or forget.
+#File-disposition: save
+#
+# Debug level
+#Debug: 0|1|2
+#
+# Umask, if not the default
+#Umask: 077
+#
+# HTML document editing options
+#Header: Mirrored from http://www.ifi.uio.no/~janl/ts/
+#Remove-nomirror: true
+#
+# Authentication:
+#Auth-domain: server:port/realm
+#Auth-user: me
+#Auth-passwd: my_password
+#
+# You can use '*' in place of server:port and/or realm:
+#Auth-domain: */*
+#Auth-user: otherme
+#Auth-passwd: otherpassword
+#
+
+# 'Fixup' is done by the external w3mfix program.  If you want a
+# mirror that's browseable in a filesystem (as opposed to via a http
+# server) just put this in:
+Fixup: run
+
+# Related is this, what is the name of the file the http server serves
+# when a directory URL is requested?  w3mir default is index.html.
+#Index-name: welcome.html
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/htmlop.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/htmlop.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/htmlop.pm	(revision 21083)
@@ -0,0 +1,656 @@
+# -*-perl-*-
+# htmlop.pl: Do operations on html documents.
+$VERSION=0.2.4;
+#
+# Original source from Bjørn Borud, without it I would not have atempted
+# this. In this incarnation it bears no resemblance to Bjørns code.
+# - Nicolai Langfeldt 18/11/95.
+# 
+# htmlop.pl does operations on html files, possebly many at a time.
+# Operations:
+# - Absolitify urls
+# - Relativify urls
+# - Gather list of urls
+# - Callback with url
+# - Canonify document w.r.t. SGML.
+#
+# Authors:
+# - Nicolai Langfeldt (janl@ifi.uio.no)
+# - Chris Szurgot (szurgot@itribe.net)
+#
+# Changes:
+# janl    18/11/95 - Initial version
+# szurgot 09/02/96 - Code in htmlop'process to remove <BASE> Tag if we are 
+#                    returning the form. An unchanged base destroys local 
+#                    fragments.
+# janl    22/02/96 - Added URLSUB functions.  <BASE> will only be removed from
+#		     the returned doc, never from the origninal doc.
+# janl    16/05/96 - Removed I* options and added single NODOC option/modifier
+#		     to replace them.
+# janl	  09/09/96 - Added URLPROC and NREL opcodes, for a better URL
+#		     processing model. -> 0.1.7
+# janl    24/09/96 - Various cosmetics, no longer inserting a !SGML tag,
+#		     only !DOCTYPE and HTML tags. -> 0.1.8
+# janl    11/10/96 - URLs in HTML 3.2 tags are now found.
+# janl     6/11/96 - Added netscape SCRIPT tag.
+# janl    20/11/96 - 'BORDER' is different from 'BORDER=0' -> 0.1.10
+# janl    06/11/96 - Added userdata argument to URLPROC.
+#   			Added SAVEURLS and USESAVED opcodes. -> 0.1.11
+# janl    11/04/97 - Changed to URI::URL and got into strict harness
+# janl	  13/04/97 - Fixed comment processing, extended it to processing
+#			directives. Bug reported by Chris Johnson. -> 0.1.12
+# janl    08/04/97 - Made ISMAP into ISMAP=, bad! -> 0.1.13
+# janl	  23/05/97 - Treating <script> and <style> as verbatim -> 0.1.14
+# janl	  06/06/97 - Canonify: <!SGML tag confused it and !DOCTYPE was mangled
+#			-> 0.1.15
+# janl	  30/07/97 - Now supporting <BASE> tag.
+#		   - Added TAGCALLBACK opcode -> 0.1.16
+# janl    16/10/97 - Empty string must be quoted, reported by Bart Barenburg
+#			-> 0.1.17
+# janl	  01/12/97 - More HTML URL tags/attributes recognized (Greg Lindhorst) 
+# janl	  13/12/97 - Can't delete the whole <BASE> tag.  Netscape has
+#		     extended it for frame use.  So only delete the HREF
+#		     attr -> 0.1.18
+# janl    01/01/98 - Realized applet/object support can't work and changed
+#		     so it's able to work, if conditions are right.
+# janl    04/01/98 - Added html 4.0 tags and attributes.
+# janl    08/02/98 - Hacked for speed.  Went from 43s to 9s on a 170K
+#		     document -> 0.2.  Thanks to Rune Frøysa who taunted me.
+# janl	  09/04/98 - More tolerant about what constitutes a newline -> 0.2.1
+# janl	  09/05/98 - Export %isdir -> 0.2.2
+# janl    13/04/99 - Remove leading /../ sequences in path component in
+#		     ABS code. -> 0.2.3
+# janl    28/05/99 - The code was buggy, now it's not. -> 0.2.4
+
+package htmlop;
+
+use URI::URL;
+
+use strict;
+# Global variables
+use vars qw($ABS $REL $LIST $CANON $URLSUB $NODOC $URLPROC $NREL);
+use vars qw($SAVEURL $USESAVED $TAGCALLBACK $debug %isdir);
+
+# These are for the smartrel routines
+my $url_origin;
+my $doc_top;
+my $doc_top_re;
+my $choped_url_or;
+
+# HTML operation codes for process_html.  The first argument is the
+# html document to do operations on.  It will not be changed.  If
+# NODOC is not passed a new document edited as specified will be
+# returned.  No more than one document will be returned by one
+# invocation of htmlop.
+
+$ABS = 1;			# Absolutify urls. Arg: Origin. The
+                                # ABS function absolutifies URLS,
+                                # assuming they are relative to the
+                                # argument.
+				# If a <BASE> tag is found the origin
+				# given by it will be used instead of
+				# the arguemnt given.
+
+$REL = 2;			# Relativize all urls. Arg: Origin.
+                                # The REL function simply removes the
+                                # argument string from any urls
+                                # matching it.  For this reason the
+                                # origin string is interprated as a
+                                # RE, which may have unexpected
+                                # results, unless RE specials are
+                                # escaped, which they should be.
+
+$LIST = 3;			# List all urls, Ret: urls
+
+$CANON = 4;			# See that missing opening (and
+                                # ending) SGML tags are injected.
+
+$URLSUB = 5;			# Do regular expression substitution
+                                # on urls.  Arg: RE, substitute.
+
+$NODOC = 6;			# Do not return a rebuilt document.
+                                # Saves memory, and time
+
+# NOTE: I SUSPECT URLPROC IS BROKEN IF A BASE TAG APPEARS IN THE TEXT.
+# THE URL PROCESSOR NEEDS TO BE PASSED htmlop::process' IDEA OF WHAT THE
+# BASE URL IS.
+
+$URLPROC = 7;			# Apply function on urls (process
+                                # urls).  Arg: Pointer to function to
+				# apply, userdata.  The function will
+				# be passed the url, modified by any
+				# previous operations and the
+				# userdata.  The function must return
+				# the new url.
+
+$NREL = 8;			# New relativisation function, works
+                                # much better than the old one. Arg:
+                                # Origin, Top.
+
+$SAVEURL = 9;			# Save urls in tag with modified name.
+				# Arg: attribute prefix.
+				# Example: <a href=foo> becomes
+				# <a href=foo w3mir-href=foo> if no other
+				# processing of the url is done.
+
+$USESAVED = 10;			# Use saved urls. Arg: attribute prefix
+
+$TAGCALLBACK = 11;		# Procedure to call for each Tag.
+				# Args: procedure, userdata (one item)
+
+				# Args to procedure: userdata, Base
+				# URL, tag name, reference to array of
+				# URL attributes, reference to hash of
+				# all attributes.  The base url is
+				# derived from the one used in ABS or
+				# the BASE tag.
+
+$debug=0;			# Debugging level in this package
+
+# process_html returns a array.  The first component of the array is
+# the new html document. The rest of the array is the urls.  If a
+# document is not to be returned a empty string is returned. If a url
+# list is not to be returned a empty array is returned.
+
+# HERE BE DRAGONS:
+
+# Where to find URLs in various tags.  The second compoent is a array
+# reference.
+
+my(%urls) = (
+	HEAD    => [ 'PROFILE' ],
+        BLOCKQUOTE => [ 'CITE' ],
+        Q 	=> [ 'CITE' ],
+        INS	=> [ 'CITE' ],
+	DEL	=> [ 'CITE' ],
+	A	=> [ 'HREF' ] ,
+	IMG	=> [ 'SRC' ,'LOWSRC' ,'USEMAP', 'LONGDESC' ] ,
+	EMBED	=> [ 'SRC' ],
+	FRAME	=> [ 'SRC', 'LONGDESC' ],
+        IFRAME  => [ 'SRC', 'LONGDESC' ],
+	BODY	=> [ 'BACKGROUND' ],
+	AREA	=> [ 'HREF' ],
+	LINK	=> [ 'HREF' ],
+
+	# The APPLET and OBJECT tags do not fit into my model for URL
+	# manipulation.  Just looking at CODEBASE might work, if the
+	# URL it names is a browseable directory...
+	APPLET	=> [ 'CODEBASE' ],  # If the codebase dir is browseable
+	OBJECT  => [ 'CODEBASE' ],  # Ditto.  Can't handle DATA attribute now
+
+	INPUT	=> [ 'SRC', 'USEMAP' ],
+	MAP	=> [ 'HREF' ],
+	SCRIPT	=> [ 'SRC', 'FOR' ],# 'FOR's semantics is not defined, the
+				    # attribute is just reserved for possible
+				    # future use...
+	BGSOUND => [ 'SRC' ],
+	FORM	=> [ 'ACTION' ],    # Is this asking for trouble?
+				    # Maybe it should just be absolutized...
+	     			    # On the other hand: It's CGI...
+	);
+
+my(%relative) = (
+	# Identify URL attributes containing urls that are relative to
+	# the named URL attribute.   When processing these they should
+        # be absolitized and then relativized relative to the BASE attribute.
+        # This is just window dressing for now; it is not used for anything.
+
+	# ARCHIVE is really a URI _list_.
+	CODEBASE => [ 'CLASSID', 'DATA', 'CODE', 'ARCHIVE' ],
+        );
+
+%isdir = (
+	# These tags refer to directories:
+	CODEBASE => 1
+	);
+
+# Tags that enclose bits we want to leave absolutely alone because they
+# are not very like HTML, or some such.
+
+# The material between the start and end tags is copied with no
+# processing at all.  The end tag is left to be processed.
+# The endtag match is case insensitive.
+my(%verbatim) = (
+        SCRIPT	=> quotemeta('</SCRIPT>'),	# Embeded scripts
+	STYLE	=> quotemeta('</STYLE>'),	# Embeded stylesheet
+	);
+
+# These are the functions that pick the HTML to pieces.  It will not
+# work esp. good on a random SGML document since the HTML application
+# of SGML has simpler quoting than it might.
+
+sub gettoken {
+  # Get one token from the argument, removing it from the argument.
+  # BUG: There should be whitespace at the end of the examined string.
+  my($c,$token,$i);
+  
+  # Skip whitespace and newlines
+  return '' unless defined(@_) && defined($_[0]);
+  $_[0] =~ s/^[\r\n\s]*//;
+  
+  return '' if ($_[0] eq '');
+  
+  $c = substr($_[0],0,1);
+  substr($_[0],0,1)='';
+  
+  if ($c eq '"' || $c eq "\'") { # Quoted material
+    $i=index($_[0],$c);
+    # End-quote missing, just gobble the rest of the doc
+    $i=length($_[0]) if $i == -1;
+    # Extract and remove token
+    $token=substr($_[0],0,$i);
+    substr($_[0],0,$i+1)='';
+  } elsif ($c eq '=') {
+    $token='=';
+  } else {			# Non-quoted material, ends in whitespace or =
+    $_[0] =~ m/[=\s\n\r]/;
+    $_[0] = $&.$';
+    $token=$c.$`;
+  }
+  # print "Token: '$token'\t\tRest: '",$_[0],"'\n";
+  return $token;
+}
+
+
+sub tagtoken {
+  # Pick the tag to pieces (also knonw as tokens). Return an
+  # associative array of attributes.  The attribute-names are changed
+  # to uppercase.  The attribute-values are left as is.
+  my($tok,$lasttok,%tokens);
+  # Append a space, gettoken needs it - silly? Yes! 
+  # Change it to test on boundrary things rather than ...?
+  $_[0].=' ';
+
+  $lasttok='';
+  while (1) {
+    last if (($tok=uc &gettoken($_[0])) eq '');
+
+    if ($tok eq '=') {
+#      print STDERR " -bad html-" if ($lasttok eq '');
+      $tokens{$lasttok}.=&gettoken($_[0]);
+      print STDERR "STORED: $lasttok = ",$tokens{$lasttok},"\n" if $debug;
+    } else {
+      $tokens{$tok}=undef;
+      $lasttok=$tok;
+    }
+  }
+  return %tokens;
+}
+
+
+sub gettag {
+  # Pick out the following things from the remaining html doc:
+  # Everything leading up to the first tag.  The first tag, and its
+  # contents.  Modify @_ directly to reduce number of copies of
+  # possebly huge documents kept in memory at once.  Return the body,
+  # the tag name, and the attributes (associative array)
+  my(%attr,$tagn,$tagc,$body,$tag,$doc);
+
+  $doc=\$_[0];
+
+  my($start,$end,$length);
+  
+  $start=index($$doc,'<');
+
+  if ($start<$[) {
+    # EOF
+    $body=$$doc;
+    $$doc='';
+    return ($body,'',());
+  }
+
+  $end=index($$doc,'>',$start+1);
+  
+  if ($end<$[) {
+    # This sucks, found no end of the tag...
+    $body=$$doc;
+    $$doc='';
+    return ($body,'',());
+  }
+
+  $length=$end-$start-1;
+
+  $body=substr($$doc,0,$start);
+  $tag=substr($$doc,$start+1,$length);
+
+  # This shortens the string in each itteration, some kind of mechanism
+  # to do it once in a while would speed things up further.  HOWEVER, when
+  # I tried to code this all I got was a _nasty_ memory leak.
+  substr($$doc,0,$end+1)='';
+
+#  print STDERR "------\n";
+  
+#  print STDERR "BODY: /$body/\n";
+  print STDERR "COMPLETE TAG: /$tag/\n" if $debug;
+#  print STDERR "REST: /",substr($$doc,0,20),"/\n";
+
+#  print STDERR "------\n";
+
+  # Examine tag contents
+  if ($tag =~ /^([!?]--)/ || $tag =~ /^(!\w+)/) {
+    # Comment or processing dicective, handle specially
+    $tagn=$&;
+    $tagc=$';
+    return ($body,$tagn,("$tagc",undef));
+  }
+
+  # Everything else
+  ($tagn,$tagc) = split(/[\s\n\r]+/,$tag,2);
+  $tagn="\U$tagn";
+
+  return ($body,$tagn,()) if !defined($tagc);
+  
+  return ($body,$tagn,&tagtoken($tagc));
+}
+
+
+# This is meant for general consumption:
+
+sub process {
+  # Process a html file.  Into one end you put a html file.  Out
+  # of the other end you get something dependent on the operations
+  # you specified.
+  # I cannot gobble my arguments. I need to examine them several times.
+  
+  my($arg,$doc,$i,$retdoc,$canon,$newdoc,@urllist,$Q,$cont);
+  my($origin,$baseurl);
+  
+  $origin=$baseurl='';
+
+  $retdoc=$canon=0;
+  
+  # Get the document from the argument list
+  $doc=shift(@_);
+  
+  $retdoc=1;
+  $i=0;
+  # Argument checking
+  while (defined($arg=$_[$i++])) {
+    if (! ($arg =~ /^\d+$/)) {
+      print STDERR "ERROR IN HTMLOP::process:\n";
+      print STDERR "Args: ",join(',',@_),"\n";
+      print STDERR "ARG: $arg is not a opcode.\n";
+      exit(1);
+    }
+    if ($arg == $ABS) {
+      $baseurl=$origin=$_[$i++];
+    } elsif ($arg == $REL || $arg == $SAVEURL || $arg == $USESAVED) {
+      $i++; # Skip one arg
+    } elsif ($arg == $URLSUB || $arg == $NREL || $arg == $URLPROC ||
+	     $arg == $TAGCALLBACK ) {
+      $i += 2; # Skip two args
+    } elsif ($arg == $LIST) { 
+      # do nothing
+    } elsif ($arg == $CANON) {
+      $canon=1;
+    } elsif ($arg == $NODOC) {
+      $retdoc=0;
+    } else {
+      die "htmlop: Incorrect invocation of html_process\n";
+    }
+  }
+  
+  my($endhtml)=0;	# Have we seen </html>?
+  my($SGML)=1;		# 1: !DOCTYPE not seen, 2: !DOCTYPE seen, -1: it's OK
+
+  # These are used to store the tag components
+  my($textpart);
+  my($tagname);
+  my(%attrval);
+
+  my($wholetag);	# The whole tag, put together again
+  my($moretag);		# TMP storage of tag attributes
+  my($attr);		# Looping thru attributes, misnomer.
+  my($RE);
+  my($subst);
+  my($prefix);
+  my($fun);		# Function to apply to url
+  my($verbatim)='';
+  my($url_o,$path);		# URL object Used in ABS to remove leading ..
+
+  # Welcome to the machine
+
+  $newdoc='';
+  while ($doc ne '') {
+    ($textpart,$tagname,%attrval)=&gettag($doc);
+    
+    # Process the tag
+    { # Need a way to get out of this, last is my friend
+      # 'Canonize'
+      if ($canon) {
+	$endhtml=1 if ($tagname eq '/HTML');
+	if ($SGML!=-1 && $canon && $tagname ne '!--' && $tagname ne '!SGML') {
+	  $wholetag=$tagname;
+	  $moretag=join('',keys %attrval);
+	  $wholetag.=' '.$moretag if ($moretag ne '');
+	  if ($SGML==1) {
+	    $SGML=2;
+	    if ($tagname eq '!DOCTYPE') {
+	      $tagname=$wholetag;
+	      %attrval=();
+	      last;
+	    }
+
+	    # We have no idea what DTD this doc follows so we put in
+	    # something kinda non-comitting
+	    $newdoc.='<!DOCTYPE HTML PUBLIC "html.dtd">'."\n";
+	  }
+	  if ($SGML==2) {
+	    $SGML=-1;
+	    if ($tagname eq 'HTML') {
+	      $tagname=$wholetag;
+	      %attrval=();
+	      last;
+	    }
+	    $newdoc.='<HTML>'."\n";
+	  }
+	}			# sgml!=-1
+      }				#canon
+
+      # Tack on text part before I bail out, if wanted
+      $newdoc.=$textpart if $retdoc;
+
+      if ($tagname eq 'BASE') {
+	if (exists($attrval{'HREF'})) {
+	  if ($origin) {
+	    $baseurl=(url($attrval{'HREF'})->abs($origin,1))->as_string;
+	  } else {
+	    $baseurl=$attrval{'HREF'};
+	  }
+	  # Get rid of the HREF attribute.  Netscape 4.0 puts (other) stuff
+	  # into BASE that is not found in the HTML 4.0 spec.
+	  delete $attrval{'HREF'};
+	  print STDERR "\nBase tag: $baseurl\n" if $debug;
+	}
+      }
+
+      # URL processing
+      $i=0;
+      while (defined($arg=$_[$i])) {
+	if (! ($arg =~ /^\d+$/)) {
+	  print STDERR "Args: ",join(',',@_),"\n";
+	  print STDERR "ARG: $arg ($i) is not a opcode.\n";
+	  exit(1);
+	}
+	$i++;
+	if ($arg == $ABS) {
+	  $origin=$baseurl || $_[$i++];
+	  $i++;
+	  # Want it to be a URL object
+	  $origin=url $origin unless ref $origin;
+	  print STDERR 'ABS: ',$origin->as_string,"\n" if $debug;
+	  next unless defined($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    if (defined($attrval{$attr})) {
+	      # Ugly: Remove leading /../ sequences in path component
+	      $url_o=url($attrval{$attr})->abs($origin,1);
+	      if (defined($path=$url_o->path)) {
+		# mailto: URLs does not have path components
+		$path =~ s~/\.\.(?=/)~~g;
+		$url_o->path($path);
+	      }
+	      $attrval{$attr}=$url_o->as_string;
+	    }
+	  }
+	} elsif ($arg == $REL) {
+	  $origin=$_[$i++];
+	  # Want it to be a string
+	  $origin=$origin->as_string if ref $origin;
+	  print STDERR 'REL: ',$origin,"\n" if $debug;
+	  next unless defined($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    $attrval{$attr} =~ s/^$origin//
+	      if defined($attrval{$attr});
+	  }
+	} elsif ($arg == $URLSUB) {
+	  $RE=$_[$i++];
+	  $subst=$_[$i++];
+	  warn "URLSUB: $RE -> $subst\n" if $debug;
+	  next unless defined($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    $attrval{$attr} =~ s/$RE/$subst/
+	      if defined($attrval{$attr});
+	  }
+	} elsif ($arg == $LIST) {
+	  warn "LIST;\n" if $debug;
+	  next unless exists($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    if (exists($attrval{$attr})) {
+	      $attrval{$attr}.='/'
+		if $isdir{$attr} && $attrval{$attr} =~ m~[^/]$~;
+	      push(@urllist,$attrval{$attr});
+	    }
+	  }
+	} elsif ($arg == $SAVEURL) {
+	  warn "SAVEURL;\n" if $debug;
+	  $prefix=$_[$i++];
+	  next unless exists($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    $attrval{"$prefix$attr"}=$attrval{$attr}
+	      if defined($attrval{$attr});
+	  }
+	} elsif ($arg == $USESAVED) {
+	  warn "USESAVED;\n" if $debug;
+	  $prefix=$_[$i++];
+	  next unless exists($urls{$tagname});
+	  foreach $attr (@{$urls{$tagname}}) {
+	    $attrval{$attr}=$attrval{"$prefix$attr"}
+	      if (defined($attrval{"$prefix$attr"}));
+	    # bug compatability, drop sometime after w3mir 1.0
+	    $attrval{$attr}=$attrval{"$prefix-$attr"}
+	      if (defined($attrval{"$prefix-$attr"}));
+	  }
+	} elsif ($arg == $NODOC) {
+	  warn "NODOC;\n" if $debug;
+	} elsif ($arg == $CANON) {
+	  warn "CANON;\n" if $debug;
+	} elsif ($arg == $URLPROC || $arg == $NREL) {
+	  # Apply a function to all urls.
+	  # NREL = Special case of $URLPROC, apply internal function.
+	  if ($arg == $URLPROC) {
+	    warn "URLPROC;\n" if $debug;
+	    $fun=$_[$i++];
+	    $arg=$_[$i++];
+	  } else {
+	    $fun=\&smartrel;
+	    $arg=undef;
+	    $url_origin=$_[$i++];
+	    $doc_top=$_[$i++];
+	    $doc_top_re=quotemeta $doc_top;
+	    ($choped_url_or=$url_origin) =~ s/^$doc_top_re//;
+	    warn "NREL $url_origin $doc_top\n" if $debug;
+	  }
+
+	  next unless (defined($urls{$tagname}));
+
+	  foreach $attr (@{$urls{$tagname}}) {
+	    $attrval{$attr}=&$fun($attrval{$attr},$arg)
+	      if defined($attrval{$attr});
+	  }
+	} elsif ($arg == $TAGCALLBACK) {
+	  $fun=$_[$i++];
+	  $arg=$_[$i++];
+	  warn "TAGCALLBACK($tagname);\n" if $debug;
+	  &$fun($arg,$baseurl,$tagname, 
+		(defined($urls{$tagname})?($urls{$tagname}):undef),
+		\%attrval);
+	} else {
+	  print STDERR "Internal error. opcode: $arg, i: $i, args: ",
+	  join(',',@_),"\n";
+	}
+      }
+      last;
+    }
+
+    # That ends URL processing
+
+    # Was this a verbatim leadin tag?  If yes, atempt to fish out text
+    # between here and the end tag, (minimal match) and substitute it
+    # with nothing.  The end tag is kept.  And the fished out text is
+    # re-inserted in the result with no changes.
+
+    $verbatim=$1 
+      if defined($verbatim{$tagname}) &&
+	($doc =~ s/^(.*?)($verbatim{$tagname})/$2/is);
+    
+    # Tack on the tag, if wanted.
+    if ($retdoc) {
+      if ($tagname) {
+	$newdoc.='<'.$tagname;
+	foreach $attr (keys %attrval) {
+	  $newdoc.=' '.$attr;
+	  if (defined($cont=$attrval{$attr})) {
+	    $Q='"';
+	    $Q="'" if $cont =~ m/\"/;
+	    $newdoc.='='.$Q.$cont.$Q;
+	  }
+	}
+	$newdoc.='>'.$verbatim;
+	$verbatim='';
+      }
+    }
+    print STDERR "NEW: $newdoc\n" if $debug > 2;
+  }
+  $newdoc.="</HTML>\n" if ($canon && !$endhtml);
+  return ($newdoc,@urllist);
+}
+
+
+sub smartrel {
+  # 'smart' relativisation function, uses .. to refer to things up to
+  # $doc_top level.  Outside that scope it stays absolute.
+  #
+  # The rel function itself is now in libwww-perl
+  
+  my($url_o)=@_;
+
+  return if (!(defined($url_o) && $url_o));
+  
+  $url_o=url $url_o unless ref $url_o;
+
+#  print STDERR "\nsmartrel: $url_o->as_string\n",
+#                 "    from: $url_origin\n",
+#                 "  within: $doc_top\n";
+  
+  # Check if within scope of our doc
+  $url_o = $url_o->rel($url_origin)
+    if $url_o->as_string =~ m/^$doc_top_re/;
+
+  return $url_o->as_string;
+}
+
+
+sub smart_setup {
+  # Setup routine for smartrel.
+
+  ($url_origin,$doc_top) = @_;
+
+  $url_origin=$url_origin->as_string if ref $url_origin;
+  $doc_top=$doc_top->as_string if ref $doc_top;
+
+  $doc_top_re=quotemeta $doc_top;
+
+  ($choped_url_or=$url_origin) =~ s/^$doc_top_re//;
+}
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/install.sh
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/install.sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/install.sh	(revision 21083)
@@ -0,0 +1,9 @@
+#!/bin/sh -v
+
+export PERL5LIB=$GSDLHOME/perllib/cpan/lib:$PERL5LIB
+export PATH=$GSDLHOME/perllib/cpan/bin:$PATH
+
+perl Makefile.PL PREFIX=$GSDLHOME/perllib/cpan
+
+make
+make install
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/multiscope.cfg
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/multiscope.cfg	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/multiscope.cfg	(revision 21083)
@@ -0,0 +1,46 @@
+# This file is meant to illustrate multiscope retrival.
+#
+# Available options: recurse, no-date-check, only-nonexistent, list-urls,
+# lowercase.  It is not default to recurse.  options must be the 
+# first directive in the the config file.
+Options: recurse
+# This directive was previously known as 'Fetch-options'
+#
+# This is the two argument form of URL:.  It fetches the first into the second
+URL: http://www.math.uio.no/~janl/ math/janl
+#
+# These says that any documents refered to that lives under these places
+# should be gotten too.  Into the named directories.  Two arguments are
+# required for 'Also:'.
+Also: http://www.math.uio.no/drift/personer/ math/drift
+Also: http://www.stud.ifi.uio.no/~janl/ ifi/janl
+Also: http://www.mi.uib.no/~nicolai/ math-uib/nicolai
+#
+# A more typical use would perhaps be:
+#   URL: http://www.math.uio.no/~janl/ janl
+#   Also: http://www.math.uio.no/images/ images
+# which would retrive the images refered to under
+# http://www.math.uio.no/~janl/ into a directory called images
+#
+# CD here before doing any work
+#cd: janlhomes
+#
+# Default pause is now 0.
+#Pause: 0
+#
+# Ignore urls we can't copy anyway.  Actually w3mir can copy
+# many cgi things with no problems.  But not always.
+Ignore: *.cgi
+Ignore: *-cgi
+Ignore: *.map
+#
+# Run fixup to get a filesystem browseable mirror
+Fixup: run
+# The options above will result in this directory hierarchy under
+# where you started w3mir:
+#
+# w3mir/math/janl		files from http://www.math.uio.no/~janl
+# w3mir/math/drift		from http://www.math.uio.no/drift/personer/
+# w3mir/ifi/janl		from http://www.stud.ifi.uio.no/~janl/
+# w3mir/math-uib/nicolai	from http://www.mi.uib.no/~nicolai/
+#
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3http.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3http.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3http.pm	(revision 21083)
@@ -0,0 +1,765 @@
+# -*- perl -*-
+# w3http.pm	--- send http requests, janl's 12" mix for w3mir
+#
+$VERSION=1.0.22;
+#
+# This implements http/1.0 requests.  We'll have problems with http/0.9
+# This is in no way specific to w3mir.
+#
+# IMPORTANT: The caller should initialize the C locale for some of the
+#   things here to work correctly (specifically the strftime function).
+#
+# This is a rewrite of http.pl by Oscar Nierstrasz; I copied the code he he
+# copied from the camel book.  Some functions written by Gorm Haug Eriksen
+# (gorm@usit.uio.no) has been used as is.
+#
+# Contributors:
+#   Nicolai Langfeldt, janl@ifi.uio.no
+#   Gorm Haug Eriksen, gorm@usit.uio.no
+#   Chris Szurgot, szurgot@itribe.net
+#   Bernhard Weisshuh, bkw@weisshuhn.de
+# Copying and modification is governed by the "Artistic License" enclosed in
+# the w3mir distribution
+#
+# gorm :
+# &w3http::get_last_modified  return the last modified stamp on a file in
+#                         the right format for use with http
+#
+# janl:
+# &http::query: Send a http query.  A completely general function to send a
+#   http query.  Will extract header values, http response code and, optionaly,
+#   convert text files to local linefeed format.
+#
+# Variables to examine after a query
+# $w3http::document: The document returned by the query, if any.
+# $w3http::doclen: The length of the document
+# $w3http::result: The numerical http result code.  It may take these values:
+# - Normal HTTP reply codes
+# -  98: OS error, permanent, errormessage in $!
+# -  99: Other permanent error: see $restext.
+# - 100: Transient error: Timeout/connection broken
+# $w3http::restext: The english(?) HTTP result or w3http generated message
+# $w3http::header: The http header returned.
+# $w3http::plaintexthtml: 1 if this doc is non-content-encoded text/html
+#	(as opposed to content-encoding: compressed content-type: text/html
+#       which needs decompression before we can inspect the html) 
+#	The tests are somewhat longwinded so I do it just once here.
+# %w3http::headval: Associative array of header values
+# $w3http::headval{'CONTENT-TYPE'}: Derived content type, stripped of charset
+#		qualifiers and other distractions.
+# $w3http::xfbytes: Transfered bytes, cumulative.  Document part only.
+# $w3http::headbytes: Bytes of headers received, cumulative.
+#
+# Variables that change http's behaviour/requests:
+# $w3http::agent: User agent, default is basename of $0
+# $w3http::from: Request is from, default is user@host
+# $w3http::version: The http version to use, only 1.0 is known to me.
+# $w3http::timeout: How long to wait for new data to arrive, default is 600sec
+# $w3http::buflen: Network read buffer size, default is 4096.  It might give a
+#	speedup to tune this for specific servers' so it matches their send
+#	size.  This size can be detected if we want to, I think.
+# $w3http::debug: 1 debuging output, 2, more, 3 queries and replies
+# $w3http::verbose: 0: say nothing, 1: print progress info
+# $w3http::convert: Convert text/* documents to local newline convention?
+#	The default is to do it.
+# $w3http::proxyserver: The name of the proxyserver to use.
+# $w3http::proxyport: The port of the proxyserver to use. 0 if no proxyserver.
+# $w3http::proxyuser: If this is set proxy authentication will be used.
+# $w3http::proxypasswd: The password for proxy authentication
+#
+# Things gotten from main:
+# - $main::win32: 1 if win32 restrictions apply to this system
+# - $main::nulldevice: Bit sink file/device on this system.
+#
+# History (european date format dd/mm/yy):
+#     janl ??/??/95 -- Rewrite finished
+#  szurgot ??/??/95 -- Win32 compatability
+#     janl 16/05/96 -- Added SAVEBIN option, based on idea by szurgot
+#  szurgot 03/05/96 -- Corrected typo in check for content-length against
+#                      retreive document length. Added test for zero-length
+#		       documents (Not retreived because not-modified)
+#  szurgot 19/05/96 -- Win32 adaptions, fixes.
+#     janl 19/05/96 -- Chris won an argument, and janl simplified http 
+#		       retrival loop (-> version 1.0.4)
+#     janl 09/09/96 -- Incorporated a patch submited by Michael Kriby -> 1.0.5
+#     janl 16/09/96 -- Support for authorization. -> 1.0.6
+#     janl 27/09/96 -- Support for Accept header, lack pointed out by
+# 			charles@ermine.ox.ac.uk: ... HTTP/1.1 (§14.1) says 
+#			``If no Accept header field is present, then it is
+#			assumed that the client accepts all media types,
+#			earlier versions of the protocol suggest that only
+#			text/plain and text/html will be offered by default.''
+#			This contradicts my memory of a http/1.0 draft.
+#			Also added $ACCEPT option.
+#     janl 20/10/96 -- Now uses HTTP::Date to produce HTTP timestamps -> 1.0.7
+#     janl 27/10/96 -- Didn't use to check if gethostbyname worked -> 1.0.8
+#     janl 02/12/96 -- Forgot a unlink when renaming temporary files.
+#     janl 21/02/97 -- Multipele $ACCEPT options work. -> 1.0.9
+#     janl 19/03/97 -- Now issues Host: header -> 1.0.10
+#     janl 10/04/97 -- Changed from wwwurl to URI::URL, and various related
+#                      changes. -> 1.0.11
+#     janl 09/05/97 -- Microsoft ISS servers are _so_ broken -> 1.0.12
+#                      (don't close the write end of the HTTP socket after
+#			sending a query to them)
+#     janl 12/05/97 -- New version of perl caught some typos, fixed
+#			longstanding bug in the newline conversion bit.
+#			-> 1.0.13
+#     janl 06/06/97 -- Demand Loading of MIME::BASE64 -> 1.0.14
+#     janl 01/12/97 -- FAT filesystems drops LSB of modtime.  Patch from
+#			Greg Lindhorst (gregli@microsoft.com)
+#                   -- whoami does not exist on win32, hardwire a default
+#			value (unknown) (also Greg L.) -> 1.0.15
+#     janl 01/22/98 -- Proxy authentication as outlined by Christian Geuer
+#     janl 02/20/98 -- Complex 'content-type' headers handled. -> 1.0.17
+#     janl 04/20/98 -- Only newline convert text/html, everything else is
+#			handled as binary. -> 1.0.18
+#     janl 12/05/98 -- Store tmpfile in its final destination directory
+#			avoiding asking movefile move it across filesystems.
+#			-> 1.0.19
+#     janl 01/08/98 -- Timeout fix from Michael Gusev, also flag short doc
+#			as error.
+#     janl 24/09/98 -- Better error handling -> 1.0.20
+#     bkw  17/12/98 -- Fixed problem with tempfile-generation when
+#                      running in forget-mode (-f)
+#     janl 05/01/99 -- Referer: dropped if argument not true -> 1.0.21
+#     janl 13/04/99 -- Added workaround for broken win32 perl resolving.
+
+package w3http;
+
+require 5.002;
+use Socket;
+use HTTP::Date;
+use Sys::Hostname;
+use URI::URL;
+
+# Suplementary libwww-perl:
+sub URI::URL::_generic::basename {
+  my $self = shift;
+  my @p = $self->path_components;
+  my $old = $p[-1];
+  if (@_) {
+    splice(@p, -1, 1, shift);
+    $self->path_components(@p)
+  }
+  $old;
+}
+
+
+END { 
+  # Remove tmp file and such in here.  That means that main:: gotta catch
+  # interrupt signals and exit on them, so ENDs are executed.
+}
+
+use strict;
+# Global variables, we want to share them:
+use vars qw($GET $HEAD $GETURL $HEADURL $IFMOD $IFMODF $AUTHORIZ $REFERER);
+use vars qw($SAVEBIN $ACCEPT $NOUSER $FREEHEAD $agent $version $timeout);
+use vars qw($debug $convert $proxyserver $proxyport $xfbytes $headbytes);
+use vars qw($verbose $result $restext $header $document);
+use vars qw($plaintexthtml %headval $progress $doclen $proxyuser);
+use vars qw($proxypasswd);
+
+my $hasAlarm;   # Win32 does not have any alarm
+my $chime;	# Has the alarm gone off yet?
+my %address;	# My own DNS cache
+my $savALRM;	# Saved ALRM handler
+my $savPIPE;	# Saved PIPE handler
+
+# The main:: program should detect if we're running on win32 or not,
+# somehow
+if ($main::win32) {
+  warn "win32\n";
+  # Compensate for lacks of win32 perl. 
+  $hasAlarm=0;
+  # Seems to be unavailable in win32/perl5.001.  It has to be in 5.003!
+#  eval "sub sockaddr_in {
+#	($port, $thataddr) = @_;
+#	$sockaddr = 'S n a4 x8';
+#	return pack($sockaddr, &AF_INET, $port, $thataddr);
+#    }";
+} else {
+  $hasAlarm=1;
+}
+
+
+# Find out some things
+my $thishost = hostname();
+my $proto = getprotobyname("tcp");
+
+(my $name, undef) = gethostbyname($thishost);
+chomp(my $user = $ENV{'LOGNAME'} || $ENV{'USER'} || `whoami` || 'unknown');
+my $from   = "$user\@$name";
+
+my $nl = "\r\n";
+# Default values, change by assignment in using-program.
+$agent  = $0; $agent =~ s~.*/~~; # Basename 
+$version= "1.0";
+$timeout= 600;			# Timeout while waiting for data/connection
+my $buflen = 4096;		# recv buffer length
+$debug = 0;			# Debuging output?
+$convert = 1;			# Convert newlines of text docs to local format
+$proxyserver='';		# Proxy server.
+$proxyport=0;			# Proxy server port. 0 if no proxy.
+$proxyuser='';			# Username for proxy authentication
+$proxypasswd='';		# Password for proxy authentication
+$xfbytes=0;			# 0 bytes transfered, cumulative
+$headbytes=0;			# 0 bytes of headers, cumulative
+$doclen=0;			# 0 bytes in doc, pr. document
+my $tmpfile="w3mir$$.tmp";	# Temporary filename
+$verbose=0;			# Verbosenes, 0: silent, 1: progress info
+
+# Query opcodes
+$GET = 1;			# GET query. Arg: host,port,path
+$HEAD = 2;			# HEAD query. Arg: host,port,path
+$GETURL = 3;			# GET query. Arg: url
+$HEADURL = 4;			# HEAD query. Arg: url
+# Here we lack PUT, which is not implemented
+# Modify query thus:
+$IFMOD = 101;			# If-modified after: Arg: HTTP-date-str
+$IFMODF = 102;			# If-modified after file: Arg: local-file-name
+$AUTHORIZ= 103;			# Basic authorization. Arg: 'user:password'
+$REFERER = 104;			# Referer: Arg: Referer 
+$SAVEBIN = 105;			# Write binary files to disk. Arg: File name
+				# If this opcode is used then main must provide
+				# a &main::movefile(oldname,newname) procedure
+				# that handles moving the tmp file to the
+				# final name/location.
+$ACCEPT  = 106;			# Accept header value: Arg: value
+$NOUSER  = 107;			# Don't insert user header.  Arg: none
+$FREEHEAD= 999;			# Freeform header, one line.  Arg: header
+
+sub query {
+  # Build and send a HTTP query.  And also receive response - janl 95/09/18
+  #
+  # Return codes: 0 if it didn't work.  1 if it did work.
+  # HTTP style result code in w3http::$result and message in w3http::$restext
+  
+  # We do next to no argument type checking btw.
+  
+  my($host,$port,$request,$query,$method,$inp,$linp,$saveto,$save,$arg);
+  my($start,$wantbytes,$thataddr,$err,$headb,$tmpf,$ldoc,$nouser,$q,$accept);
+  my($origreq,$req_o,$plaintext);
+  
+  # Something ought to be said
+  $result=99;
+  $restext='w3http: internal error';
+  $nouser=0;
+  
+  if ($version ne '1.0') {
+    warn "Unknown HTTP version $version, no request sent\n";
+    return 0;
+  }
+  
+  $accept=$saveto=$query='';
+  
+  # Find out what to ask for
+  
+  while (defined($arg=shift)) {
+    if ($arg == $GET) {
+      $host=shift;
+      $port=shift;
+      $request=shift;
+      $req_o=url 'http://'.$host.':'.$port.$request;
+      if ($proxyport) {
+	$query.='GET http://'.$req_o->as_string;
+      } else {
+	$query.='GET '.$req_o->epath;
+      }
+      $query.=' HTTP/'.$version.$nl;
+    } elsif ($arg == $HEAD) {
+      $host=shift;
+      $port=shift;
+      $request=shift;
+      $req_o=url 'http://'.$host.':'.$port.$request;
+      if ($proxyport) {
+	$query.='HEAD '.$req_o->as_string;
+      } else {
+	$query.='HEAD '.$req_o->epath;
+      }
+      $query.=' HTTP/'.$version.$nl;
+    } elsif ($arg == $GETURL) {
+      $req_o=shift;
+      $req_o=url $req_o unless ref $req_o;
+      ($method,undef,undef,$host,$port,$request,undef,$q) = $req_o->crack;
+      if ($proxyport) {
+	$query.='GET '.$req_o->as_string;
+      } else {
+	$q=$req_o->equery;
+	$query.='GET '.$request.($q?"?$q":'');
+      }
+      $query.=' HTTP/'.$version.$nl;
+    } elsif ($arg == $HEADURL) {
+      $req_o=shift;
+      $req_o=url $req_o unless ref $req_o;
+      if ($proxyport) {
+	$query.='HEAD '.$req_o->as_string;
+      } else {
+	$q=$req_o->equery;
+	$query.='HEAD '.$req_o->epath.($q?"?$q":'');
+      }
+      $query.=' HTTP/'.$version.$nl;
+    } elsif ($arg == $IFMOD) {
+      $query.='If-Modified-Since: '.(shift).$nl;
+    } elsif ($arg == $IFMODF) {
+      $query.='If-Modified-Since: '.&last_modified(shift).$nl;
+    } elsif ($arg == $AUTHORIZ) {
+      # Demand-load MIME::Base64
+      if (!defined(&MIME::Base64::encode)) {
+	eval "use MIME::Base64;";
+	die "w3http: Could not load MIME::Base64 module necessary for authentication\n"
+	  unless defined(&MIME::Base64::encode);
+      }
+      $query.='Authorization: Basic '.MIME::Base64::encode(shift,'').$nl;
+    } elsif ($arg == $REFERER) {
+      my($referer)=shift;
+      $query.='Referer: '.$referer.$nl if $referer;
+    } elsif ($arg == $SAVEBIN) {
+      $saveto=shift;
+    } elsif ($arg == $ACCEPT) {
+      $accept.='Accept: '.(shift).$nl;
+    } elsif ($arg == $NOUSER) {
+      $nouser=1;
+    } elsif ($arg == $FREEHEAD) {
+      $query.=(shift).$nl;
+    } else {
+      warn "Unknown http query opcode: $arg\n";
+    } 
+    # Insert the last parts of the query:
+  }
+  
+  $query.='Host: '.$req_o->netloc.$nl;
+  $query.='From: '.$from.$nl unless $nouser;
+
+  $accept='Accept: */*'.$nl unless $accept;
+
+  if ($proxyport) {
+    # Use proxy instead of originserver
+    $host=$proxyserver;
+    $port=$proxyport;
+
+    # Add authentication stuff to query
+    if ($proxyuser) {
+      # Demand-load MIME::Base64
+      if (!defined(&MIME::Base64::encode)) {
+	eval "use MIME::Base64;";
+	die "w3http: Could not load MIME::Base64 module necessary for authentication\n"
+	  unless defined(&MIME::Base64::encode);
+      }
+      
+      $query.='Proxy-Authorization: Basic '.
+	MIME::Base64::encode($proxyuser.':'.$proxypasswd);
+
+      print STDERR "\nProxyuser: [$proxyuser]\nProxypasswd: [$proxypasswd]\n"
+	if $debug>=2;
+    }
+  }
+  
+  $query.='User-Agent: '.$agent.$nl.$accept.$nl;
+  
+  # If we're using proxy then set up things...
+  print STDERR "\nQUERY:\n",$query,"---\n" if $debug>=2;
+
+  # win32 fix: this should be added in case of troubles with
+  # gethostbyname. possible reason: nameserver down?
+  if ($host =~ /^\d+(\.\d+){3}$/) {
+    # in case gethostbyname will not work ... ;-)
+    $address{$host} = pack 'C4', (split /\./, $host);
+  }
+  
+  # Find out who to ask, check if we know already
+  if (exists($address{$host})) {
+    # We know
+    $thataddr=$address{$host};
+  } else {
+    # Cache miss, get and remember.
+    (my $fqdn, undef, undef, undef, $thataddr) = gethostbyname($host);
+    # Hostname lookup failure?  Cache even misses.
+    if (defined($fqdn)) {
+      print STDERR "Lookup of $host:\nFQDN: $fqdn\n"
+	if $debug;
+      $address{$host}=$thataddr;
+      $address{$fqdn}=$thataddr if $fqdn ne $host;
+    } else {
+      $thataddr=$address{$host}=undef;
+    }
+  }    
+
+  # Check if lookup failure, return
+  if (!defined($thataddr)) {
+    $restext='Host lookup failure';
+    return;
+  }
+
+  $port=80 unless defined($port) && $port;
+
+  # When connected we might receive SIGPIPE.  I'm not sure if the
+  # default behaviour of dying is beneficial in that case.  If we get
+  # alarm a timeout has expired.
+  $savPIPE = $SIG{'PIPE'};
+  $savALRM = $SIG{'ALRM'};
+
+  $chime=0;			# There has been no alarm yet
+  $SIG{'ALRM'} = \&timeout;
+  $SIG{'PIPE'} = \&ignore;
+
+  # Close the socket, just in case, and ignore error returns
+  close(FS);
+  
+  socket(FS, AF_INET, SOCK_STREAM, $proto) or return &oserror;
+  warn "Got my socks on\n" if $debug;
+  
+  my $paddr = sockaddr_in($port, $thataddr);
+  connect(FS, $paddr) or return &oserror;
+  warn "Connected\n" if $debug;
+  
+  # Arrange timeout
+  alarm($timeout) if $hasAlarm;
+  
+  # We have, in fact, received SIGPIPE on this line:
+  send(FS,$query,0) or return &oserror;
+
+  if ($chime) {
+    $result=100;
+    $restext='timeout sending query';
+    return &resetsign;
+  }
+  
+  $header='';
+  $document='';
+  $inp=' 'x$buflen;
+  $doclen=$chime=$plaintext=$plaintexthtml=$save=0;
+
+  # Breaks some M$ ISS servers:
+  # shutdown(FS,1);  # Half-close socket, sending now not allowed
+  
+  print STDERR ", receiving header" if $verbose>0;
+  
+  # Retrive HTTP response HEADER.  Why do I use recv and not <FS>?
+  # Because then the timeout can work correctly!
+  while (1) {
+    # Set up alarm to ensure recv returns within a reasonable timeframe
+    alarm($timeout) if $hasAlarm;
+    $err = recv(FS,$inp,$buflen,0);
+    # recv returned, cancel alarm.
+    alarm(0) if $hasAlarm;
+    
+    # If there has been a timeout, then we quit now.  The recv man page
+    # does not seem to allow recv to return the bytes received up to
+    # the timeout.
+    if ($chime) {
+      $result=100;  
+      $restext='timeout fetching document';
+      $!=0;
+      if ($save) {
+	unlink($tmpf) || 
+	  warn "Could not unlink $tmpf: $!\n";
+      }
+      return &resetsign;
+    }
+    
+    # recv returnes the undefined value on error
+    if (!defined($err)) {
+      warn "Error in recv: $!\n";
+      last;
+    }
+    
+    $linp=length($inp);
+    
+    # If the returned input was 0 in length then we've gotten to the 
+    # end of the response.
+    last unless $linp;
+    
+    # Accounting
+    $xfbytes += $linp;
+    $doclen += $linp;
+    
+    # Accumulate input
+    $header.=$inp;
+
+    # eof(SOCKET) has strange semantics it seems
+    # last if eof(FS);
+    
+    # Check if header is complete
+    last if ($header =~ m/(\r?\n\r?\n)/);
+  }
+  
+  if (length($header)==0) {
+    $restext='the HTTP reply header is empty!';
+    return &resetsign;
+  }
+  
+  if ($header =~ m/(\r?\n\r?\n)/) {
+    $header=$`;
+    $document=$';
+  } else {
+    $header=$document;
+  }
+  
+  # Adjust accounting
+  $headb = length($header)+length($1);
+  $headbytes += $headb;
+  $xfbytes -= $headb;
+  $doclen -= $headb;
+  
+  # Pick headers to pieces
+  ($result,$restext,%headval)=&analyze_header($header);
+
+  print STDERR "REPLY:\n",$header,"\n---\n" if $debug>=2;
+
+  # Check if the document is a non-encoded text document. The contents
+  # could be (x-)?compress or (x-)gzip coded (compressed in other
+  # words).
+  
+  $plaintext=defined($headval{'CONTENT-TYPE'}) &&
+    (substr($headval{'CONTENT-TYPE'},0,5) eq 'text/' || 0) &&
+      !defined($headval{'content-encoding'});
+  $plaintexthtml=$plaintext && 
+    ($headval{'CONTENT-TYPE'} eq 'text/html');
+  
+  if ($result==200) {
+    
+    # Save this to a file, or not?  Never save html files.
+    if ($saveto && !$plaintexthtml) {
+      # We're going to save this document directly into a file.  This
+      # stresses the VM less when getting the large binares so often
+      # found at cool sites.
+      $save=1;
+
+      # Find a temporary filename
+      $tmpf=url "file:$saveto";
+      $tmpf->basename($tmpfile);
+      $tmpf=$tmpf->unix_path;
+      
+      # Find suitable final filename, one with no URL escapes
+      $saveto=(url "file:$saveto")->unix_path;
+
+      # If output to stdout then send it directly there rather than
+      # using disk unnecesarily.
+      $tmpf='-' if ($saveto eq '-');
+
+      # If output is nulldevice (running -f), use it also for tmpfile,
+      # since it would otherwise try to create it in /dev under unix.
+      $tmpf=$main::nulldevice if ($saveto eq $main::nulldevice);
+      
+      warn "USING TMPFILE: $tmpf\n" if $debug;
+      
+      open(SAVE,">$tmpf") || 
+	die "Could not open tmp file: $tmpf: $!\n";
+      binmode SAVE;		# It's a binary file...
+    }
+    
+    if ($verbose>0) {
+      print STDERR ", document";
+      print STDERR "->disk" if $save;
+    }
+    
+    # Now retrive document itself.  Se comments in header loop
+    $start=time;
+    $wantbytes = defined($headval{'content-length'})?
+      $headval{'content-length'}:0;
+    
+    $ldoc=length($document);
+    
+    while (1) {
+      alarm($timeout) if $hasAlarm;
+      recv(FS,$inp,$buflen,0);
+      alarm(0) if $hasAlarm;
+      
+      if ($chime) {
+	$result=100;
+	$restext='timeout fetching document';
+	$!=0;
+	if ($save) {
+	  unlink($tmpf) || 
+	    warn "Could not unlink $tmpf: $!\n";
+	}
+	return &resetsign;
+      }
+      
+      $linp=length($inp);
+      
+      last unless $linp || $ldoc;
+      $ldoc = 0;
+      
+      $xfbytes += $linp;
+      $doclen += $linp;
+      
+      if ($verbose>0 && time-$start>5) {
+	# Write progress info ... 
+	if ($wantbytes) {
+	  $progress = sprintf " %3d%%", $doclen/$wantbytes*100;
+	} else {
+	  $progress = sprintf " %d", $doclen;
+	}
+	print STDERR $progress, "\ch"x(length($progress));
+	# ...every 5 seconds
+	$start=time;
+      }
+      
+      $document.=$inp;
+      
+      if ($save) {
+	$err = print SAVE $document;
+	die "Error writing $tmpf: $!\n" unless $err;
+	$document='';
+      }
+
+      # The eof test seems to work very oddly for sockets.
+      # last if eof(FS);
+    }
+
+    close(FS);  # Close socket completely
+    
+    print STDERR "DOCUMENT:\n----\n",$document,"\n----\n" if $debug>=255;
+  
+    if ($wantbytes &&
+	$wantbytes != $doclen) {
+      $result=100;
+      $restext='transfer error; too many bytes in document';
+      $restext='document was incomplete' if ($wantbytes > $doclen) ;
+      print STDERR "SHORT DOCUMENT" if $debug>=16;
+      if ($save) {
+	unlink($tmpf) || warn "Could not unlink $tmpf: $!\n";
+      }
+      return &resetsign;
+    }
+    
+    # warn "XFB: $xfbytes, DL: $doclen\n";
+    if ($save) {
+      close(SAVE);
+      &main::movefile($tmpf,$saveto);
+    }
+    
+    # If this is a non-encoded text file and we're supposed to convert
+    # foreign newlines then we do it. It would be faster to do this
+    # with each chunk of input in the input loop, but this gives us
+    # two problems:
+    # - A \r\n newline could be split into two chunks.  Thus escaping
+    #   newline conversion.
+    # - It messes up the received bytes accounting rather badly.
+    #
+    # This used to be a test for $plaintext, the problem is that too
+    # many documents were typed as text/plain and so we corrupted
+    # binary files. This is bad. So now we're more paranoid about it:
+    # Only HTML gets converted.
+    if ($convert && $plaintexthtml) {
+      # Change non unix newlines to unix newlines. bare \r is known
+      # from macintosh (they hadta be different didn't they?), \r\n is
+      # known as 'network format' and from numerous systems, among
+      # them ms-dos.
+      $document =~ s~\r~\n~g unless $document =~ s~\r\n~\n~g;
+      warn "Newlines converted(?)\n" if $debug;
+    }
+    
+  }				# if $result == 200
+  
+  &resetsign;
+  return 1;
+}
+
+
+sub analyze_header {
+  my($header)=@_;
+  my($result,$restext,%headval,$hdln,$key,$value);
+  
+  # Summary of the http spec on headers (with my comments):
+  # - Each header line ends in CRLF (or just LF, or maybe even just CR,
+  #   anyways, it's easier if all is LF).
+  $header =~ s/\r/\n/mg unless $header =~ s/\r\n/\n/mg;
+  # - If a line starts with space then it's a continuation of the previous
+  #   line (these I fold into one line).
+  $header =~ s/\n\s/ /mg;
+  # - The header field names are case insensitive (so I convert them to
+  #   lowercase)
+  # - A field may appear twice, that is equivalent to listing the values
+  #   in a comma separated list (so I fold them into a comma separated list)n
+  # - The field name and the field value are separated by ': '
+  ($result,$restext) = $header =~ m~^HTTP/\d\.\d (\d\d\d) (.*)~;
+  # Shave off http result code from the header
+  $header =~ s~^.*\n~~;
+  
+  warn "Header:\n$header\n---\n" if $debug>=3;
+  
+  warn "Result: $result, Text: $restext\n" if $debug>=2;
+  
+  %headval=();
+  
+  foreach $hdln (split(/\r?\n/m,$header)) {
+    ($key,$value)=split(': ',$hdln,2);
+    $key="\L$key";
+    # Strip leading&trailing space off the reply, some servers use
+    # copious space after.
+    $value =~ s/^\s+|\s+$//g;
+    print STDERR "K: '$key', V: '$value'\n" if $debug>=2;
+    if (defined($headval{$key})) {
+      $headval{$key}.=", ".$value;
+    } else {
+      $headval{$key}=$value;
+    }
+  }
+
+  # See if there are any type parameters in the content-type header
+  # and if so remove them.
+  if (defined($headval{'content-type'})) {
+    my $val=$headval{'content-type'};
+    ($val,undef)=split(';',$val,2) if ($val =~ /;/);
+    $headval{'CONTENT-TYPE'}=$val;
+  }
+  
+  return ($result,$restext,%headval);
+}
+
+
+sub last_modified {
+  # will return the last modified time for a local file as a HTTP
+  # timestamp.
+  
+  my(@tmp) = stat($_[0]);	# file doesn't exist ok to fetch
+
+  # FAT file systems strip the LSB of the file time.  Add it back in
+  # here before asking the server about a modified file.  The only way
+  # this can fail is if the newer server file was saved one second
+  # after the first version (very unlikely).  This isn't needed for
+  # NTFS file systems, but there is no good portable Perl way to
+  # determine the file system type.
+  $tmp[9] = $tmp[9] | 1 if ( $main::win32 );
+
+  # now we got the last modified in a 32 bit integer.  time to convert
+  # it and return
+  return time2str($tmp[9]);
+}
+
+
+sub timeout {
+  # Set timeout flag.  The using procedure has to set other result codes.
+  $chime=1;			# When this is 1 then the alarm has gone off
+  print STDERR "TIMEOUT!!!!\n" if $debug>=16;
+}
+
+
+sub ignore {
+  warn "I got SIGPIPE, ignoring it...\n";
+}
+
+
+sub resetsign {
+  return 0 if !defined($savALRM);
+  $SIG{'ALRM'}=$savALRM;
+  undef $savALRM;
+#  $SIG{'PIPE'}=$savPIPE;
+  return 0;
+}
+
+
+sub oserror {
+  
+  resetsign;
+
+  $result=98;
+  $restext='w3http: OS error';
+  return 0;
+
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mfix.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mfix.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mfix.PL	(revision 21083)
@@ -0,0 +1,1070 @@
+# -*-perl-*-
+
+use Config;
+
+&read_makefile;
+$fullperl = resolve_make_var('FULLPERL') || $Config{'perlpath'};
+$islib = resolve_make_var('INSTALLSITELIB');
+
+$name = $0;
+$name =~ s~^.*/~~;
+$name =~ s~.PL$~~;
+
+open(OUT,"> $name") || 
+  die "Could open $name for writing: $!\n";
+
+print "writing $name\n";
+
+while (<DATA>) {
+  if (m~^\#!/.*/perl.*$~o) {
+    # This substitutes the path perl was installed at on this system
+    # _and_ removed any (-w) options.
+    print OUT "#!",$fullperl,$1,"\n";
+    next;
+  }
+  if (/^use lib/o) {
+    # This substitutes the actuall library install path
+    print OUT "use lib '$islib';\n";
+    next;
+  }
+  print OUT;
+}
+
+close(OUT);
+
+# Make it executable too, and writeable
+chmod 0755, $name;
+
+#### The library
+
+sub resolve_make_var ($) {
+
+  my($var) = shift @_;
+  my($val) = $make{$var};
+
+#  print "Resolving: ",$var,"=",$val,"\n";
+  
+  while ($val =~ s~\$\((\S+)\)~$make{$1}~g) {}
+#  print "Resolved: $var: $make{$var} -> $val\n";
+  $val;
+}
+
+
+sub read_makefile {
+
+  open(MAKEFILE, 'Makefile') || 
+    die "Could not open Makefile for reading: $!\n";
+
+  while (<MAKEFILE>) {
+    chomp;
+    next unless m/^([A-Z]+)\s*=\s*(\S+)$/;
+    $make{$1}=$2;
+#    print "Makevar: $1 = $2\n";
+  }
+
+  close(MAKEFILE)
+}
+
+__END__
+#!/local/bin/perl5 -w
+# Perl 5.002 or later.  w3mir is mostly tested with perl 5.004
+#
+# You might want to change or comment out this:
+use lib '/hom/janl/lib/perl';
+#
+# Can perform the following fixes:
+# - Rewrite redirected to URLs
+# - change .../ into .../index.html (or .../Welcome.html)
+# - change external links to point to some helpfull .html file ---- NOT IMPLEMENTED
+# - change links to documents not retrived to point to some helpfull
+#   .html file --- NOT IMPLEMENTED
+# - After adding a 'Also' directive we can edit the urls pointing to within
+#   the new space of the retrival scope, making the pointers consistent.
+
+# Method: 
+# 1 Gather list of all URLs to be rewritten:
+#   - Redirects: Just read the .redirs file
+#   - .../ into .../index.html: All can be found in the .referers file
+#     Remember to rewrite missing / redirects too...
+#   - external links: in the .referers file too
+#   - non-retrived documents: What files should be here (according to
+#	.referers file) but are not?
+# 2 Gather list of all documents needing editing
+# 3 Edit them
+#
+# 09/05/98 janl		- Only rewrite .../ to .../$indexname if the attribute
+#			  does not refer to a directory. -> 0.6.2
+# 12/05/98 janl		- Use ->local_path to determine filename -> 0.6.3
+# 22/05/98 janl		- .../#foo was not being rewritten to 
+#			  .../$indexname#foo -> 0.6.4
+#
+require 5.002;
+
+use vars qw($win32);
+
+# To figure out what kind of system this is
+BEGIN {
+  use Config;
+  $win32 = ( $Config{'osname'} eq 'MSWin32' ); 
+}
+
+use Carp;
+use htmlop;
+use URI::URL;
+use URI::Escape;
+
+use strict;
+
+my $VERSION;
+$VERSION='0.6.5';
+
+my $debug=0;			# Not debugging
+my $verbose=0;
+
+my $indexname='index.html';
+my $chdirto='';			# Place to chdir to after reading
+                                # config file
+
+my $infoloss=0;			# 1 if any URL translations (which
+                                # cause information loss) are in
+                                # effect.  If this is true we use the
+                                # SAVEURL operation.  What to get, and
+                                # not.  Text of user supplied
+                                # fetch/ignore rules
+
+my $doindex=1;			# append $indexname to /$ ?
+
+my $editthis='';		# Edit references matching this expression.
+
+my $files=0;			# How many files have I edited?
+my $rc='';
+
+my $rule_text="# User defined fetch/ignore rules\n";
+# Code ref to the rule procedure
+my $rule_code;
+
+# Code to prefix and postfix the generated code.  Prefix should make
+# $_ contain the url to match.  Postfix should return 1, the default
+# is to get the url/file.
+my $rule_prefix='$rule_code = sub { local($_) = shift;'."\n";
+my $rule_postfix=' return 1; } ';
+
+# Scope tests generated by URL/Also directives in cfg. The scope code
+# is just like the rule code, but used for program generated
+# fetch/ignore rules related to multiscope retrival.
+my $scope_fetch="# Automatic fetch rules for multiscope retrival\n";
+my $scope_ignore="# Automatic ignore rules for multiscope retrival\n";
+my $scope_code;
+
+my $scope_prefix='$scope_code = sub { local($_) = shift;'."\n";
+my $scope_postfix=' return 0; } ';
+
+# Function to apply to urls, se rule comments.
+my $user_apply_code;	# User specified apply code
+my $apply_code;		# w3mirs apply code
+my $apply_prefix='$apply_code = sub { local($_) = @_;'."\n";
+my $apply_lc=' $_ = lc $_; ';
+my $apply_postfix=' return $_; } ';
+my @user_apply;		# List of users apply rules.
+my @internal_apply;	# List of w3mirs apply rules.
+
+
+my $iinline='';			# inline RE code to make RE caseinsensitive 
+my $ipost='';			# RE postfix to make it caseinsensitive
+my $lc=0;			# Convert urls/filenames to lowercase?
+my $abs=0;			# Absolutify URLs?
+my $fixrc='';			# Name of w3mfix config file
+my $fixup=0;			# Do things needed to run fixup
+my $r=0;			# Recurse? no recursion = absolutify links
+my %rum_referers=();		# Array of referers, key: rum_url
+my %rum_redirected=();		# Array of redirected url: key: original url
+my %lf_edited=();		# Edited this file yet?
+my $list;			# List url on STDOUT?
+
+my %stat=();			# stat($lf_url): 'd' for dir, 'f' for others
+
+# ######################### Libwww-perl addons:
+
+sub URI::URL::_generic::unix_path {
+  my $self = (shift)->clone;
+
+  $self->frag(undef);
+  $self->scheme("file");
+  $self->unix_path;
+}
+
+
+sub URI::URL::_generic::basename {
+  my $self = shift;
+  my @p = $self->path_components;
+  my $old = $p[-1];
+  if (@_) {
+    splice(@p, -1, 1, shift);
+    $self->path_components(@p)
+  }
+  $old;
+}
+
+
+sub URI::URL::_generic::path_components {
+    my $self = shift;
+    my $old = $self->{'path'};
+    $old = '' unless defined $old;
+    $old = "/$old" if $old !~ m|^/| && defined $self->{'netloc'};
+    if (@_) {
+	$self->_elem('path',
+		     join("/", map { uri_escape($_,$URI::URL::reserved)
+				   } @_));
+    }
+    map { uri_unescape($_) } split("/", $old, -1);
+}
+
+
+# ######################### Configuration/argument parsing
+
+sub parse_args {
+  my $f;
+  my $i;
+
+  $i=0;
+
+  while ($f=shift) {
+    $i++;
+    # This is a demonstration against Getopts::Long.
+    if ($f =~ s/^-+//) {
+      $verbose=-1,next if $f eq 'q'; 		# Quiet
+      $verbose=1,next if $f eq 'c';		# Chatty
+      die "w3mfix version $VERSION\n" if $f eq 'v';	# Version
+      die "rtfm\n" if ($f eq 'help' || $f eq 'h' || $f eq '?');
+
+      if ($f eq 'editref') {
+	die "Sorry, can only have one -editref pr. run\n"
+	  if $editthis;
+	$editthis=quotemeta(shift);
+	next;
+      }
+
+      if ($f eq 'd') {	# Debugging level
+	$f=shift;
+	unless (($debug = $f) > 0) {
+	  die "w3mfix: debug level must be a number greater than zero.\n";
+	}
+	next;
+      }
+
+      # Those were all the options...
+      warn "w3mfix: Unknown option: -$f.  Use -h for usage info.\n";
+      exit(1);
+    } else {
+      # If we get this far then ... it's a configuration file name:
+      $rc = $f;
+      die "w3mfix: Got a non-option argument that wasn't the name of a\n".
+	"(configuration) file either\n"
+	  unless -f $f;
+    }
+  }
+}
+
+
+sub parse_cfg_file {
+  # Read the configuration file.  Aborts on errors.
+  # Ignores w3mir options w3mfix does not need itself.
+
+  my ( $file ) = @_ ;
+  my ($key, $value, $authserver,$authrealm,$authuser,$authpasswd);
+  my $i;
+
+  die "w3mfix: config file $file is not a file.\n" unless -f $file;
+  open(CFGF, $file) || die "Could not open config file $file: $!\n";
+
+  # print STDERR "Reading $file\n";
+
+  $i=0;
+
+  while (<CFGF>) {
+    # Trim off various junk
+    chomp;
+    s/^#.*//;
+    s/^\s+|\s$//g;
+    # Anything left?
+    next if $_ eq '';
+    # Examine remains
+    $i++;
+    ($key, $value) = split(/\s*:\s*/,$_,2);
+    $key = lc $key;
+
+    # These are no-ops in w3mfix
+    next if ( $key eq 'initial-referer' );
+    next if ( $key eq 'header' );
+    next if ( $key eq 'pause' );
+    next if ( $key eq 'retry-pause' );
+    next if ( $key eq 'retries' );
+    next if ( $key eq 'robot-rules' );
+    next if ( $key eq 'remove-nomirror' );
+    next if ( $key eq 'file-disposition' );
+    next if ( $key eq 'http-proxy' );
+    next if ( $key eq 'proxy-options' );
+    next if ( $key eq 'auth-domain' );
+    next if ( $key eq 'auth-user' );
+    next if ( $key eq 'auth-passwd' );
+    next if ( $key eq 'disable-headers' );
+    next if ( $key eq 'agent' );
+
+    $debug=numeric($value),next if ( $key eq 'debug' );
+    umask(numeric($value)),next if ( $key eq 'umask' );
+    $indexname=$value,next if ($key eq 'index-name');
+    $verbose=nway($value,'quiet','brief','chatty')-1,next
+      if ( $key eq 'verbosity' );
+
+    if ( $key eq 'cd' ) {
+      $chdirto=$value;
+      next;
+    }
+
+    if ($key eq 'url') {
+      my ($rum_url_o,$lf_dir,$rum_reurl,$rum_rebase);
+
+      # A two argument URL: line?
+      if ($value =~ m/^(.+)\s+(.+)/i) {
+	# Two arguments.
+	$rum_url_o=url $1;
+	# The last is a directory, it must end in /
+	$lf_dir=$2;
+	$lf_dir.='/' unless $lf_dir =~ m~/$~;
+
+	# The first is a URL, make it more canonical, find the base.
+	# The namespace confusion in this section is correct.(??)
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+	# print "URL: ",$rum_url_o->as_string,"\n";
+	# print "Base: $rum_rebase\n";
+
+	# Translate from rum space to lf space:
+	push(@internal_apply,"s/^".$rum_rebase."/".quotemeta($lf_dir)."/");
+
+	# That translation could lead to information loss.
+	$infoloss=1;
+
+	# Fetch rules tests the rum_url_o->as_string.  Fetch whatever
+	# matches the base.
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+
+	# Ignore whatever did not match the base.
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+
+      } else {
+	# $rum_url_o=root_quene($value);
+
+	$rum_url_o=url $value;
+
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+	# Translate from rum space to lf space:
+	push(@internal_apply,"s/^".$rum_rebase."//");
+
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+      }
+      next;
+    }
+
+    if ($key eq 'also' || $key eq 'also-quene') {
+      if ($value =~ m/^(.+)\s+(.+)/i) {
+	my ($rum_url_o,$lf_dir,$rum_reurl,$rum_rebase);
+	# Two arguments.
+	$rum_url_o=url $1;
+	$rum_url_o->host(lc $rum_url_o->host);
+	# The last is a directory, it must end in /
+	$lf_dir=$2;
+	$lf_dir.='/' unless $lf_dir =~ m~/$~;
+
+	# The first is a URL, find the base
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+	# Ok, now we can transform and select stuff the right way
+	push(@internal_apply,"s/^".$rum_rebase."/".quotemeta($lf_dir)."/");
+	$infoloss=1;
+
+	# Fetch rules tests the rum_url_o->as_string.  Fetch whatever
+	# matches the base.
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+
+	# Ignore whatever did not match the base.  This cures problem
+	# with '..' from base in in rum space pointing within the the
+	# scope in ra space.  We introduced a extra level (or more) of
+	# directories with the apply above.  Must do same with 'Also:'
+	# directives.
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+      } else {
+	die "Also: requires 2 arguments\n";
+      }
+      next;
+    }
+
+    if ($key eq 'quene') {
+      # root_quene($value);
+      next;
+    }
+
+    if ($key eq 'ignore-re' || $key eq 'fetch-re') {
+      # Check that it's a re, better that I am strict than for perl to
+      # make compilation errors.
+      unless ($value =~ /^m(.).*\1[gimosx]*$/) {
+	print STDERR "w3mfix: $value is not a recognized regular expression\n";
+	exit 1;
+      }
+    }
+
+    if ($key eq 'fetch' || $key eq 'fetch-re') {
+      my $expr=$value;
+      $expr = wild_re($expr).$ipost if ($key eq 'fetch');
+      $rule_text.=' return 1 if '.$expr.";\n";
+      next;
+    }
+
+    if ($key eq 'ignore' || $key eq 'ignore-re') {
+      my $expr=$value;
+      $expr = wild_re($expr).$ipost if ($key eq 'ignore');
+      $rule_text.=' return 0 if '.$expr.";\n";
+      next;
+    }
+
+
+    if ($key eq 'apply') {
+      unless ($value =~ /^s(.).*\1.*\1[gimosxe]*$/) {
+	print STDERR
+	  "w3mfix: '$value' is not a recognized regular expression\n";
+	exit 1;
+      }
+      push(@user_apply,$value) ;
+      $infoloss=1;
+      next;
+    }
+
+    if ($key eq 'options') {
+      
+      my($val,$nval);
+      foreach $val (split(/\s*,\s*/,lc $value)) {
+	if ($i==1) {
+	  $nval=nway($val,'recurse','no-date-check','only-nonexistent',
+		     'list-urls','lowercase','remove','batch','read-urls',
+		     'abs');
+	  $r=1,next if $nval==0;
+	  next if $nval==1;
+	  next if $nval==2;
+	  $list=1,next if $nval==3;
+	  if ($nval==4) {
+	    $lc=1;
+	    $iinline=($lc?"(?i)":"");
+	    $ipost=($lc?"i":"");
+	    next ;
+	  }
+	  next if $nval==5;
+	  next if $nval==6;
+	  next if $nval==7;
+	  $abs=1,next if $nval==8;
+        } else {
+	  die "w3mfix: options must be the first directive in the config file.\n";
+	}
+      }
+    }
+
+    if ($key eq 'fixup') {
+
+#      chomp($fixrc=`pwd` || '.');
+#      $fixrc.="/$file";
+#      warn "Fixrc: $fixrc\n";
+#      $fixup=1;
+
+      my($val,$nval);
+      foreach $val (split(/\s*,\s*/,lc $value)) {
+	$nval=nway($val,'on','run','noindex');
+	next if $nval==0;
+	next if $nval==1;
+	$doindex=0 if $nval==2;
+	# Ignore everyting else
+      }
+    }
+
+  }
+  close(CFGF);
+}
+
+sub wild_re {
+  # Here we translate unix wildcard subset to to perlre
+  local($_) = shift;
+  s#\*#\.\*#;
+  s#\?#\.#;
+  s#([\/\(\)\\\|\{\}\+)\$\^])#\\$1#g;
+  return $_ = '/'.$_.'/';
+}
+
+
+sub numeric {
+  # Check if argument is numeric?
+  my ( $number ) = @_ ;
+  return oct($number) if ($number =~ /\d+/ || $number =~ /\d+.\d+/);
+  die "Expected a number, got \"$number\"\n";
+}
+
+
+sub boolean {
+  my ( $boolean ) = @_ ;
+
+  $boolean = lc $boolean;
+
+  return 0 if ($boolean eq 'false' || $boolean eq 'off' || $boolean eq '0');
+  return 1 if ($boolean eq 'true' || $boolean eq 'on' || $boolean eq '1');
+  die "Expected a boolean, got \"$boolean\"\n";
+}
+
+
+sub nway {
+  my ( $value ) = shift;
+  my ( @values ) = @_;
+  my ( $val ) = 0;
+
+  $value = lc $value;
+  while (@_) {
+    return $val if $value eq shift;
+    $val++;
+  }
+  die "Expected one of ".join(", ",@values).", got \"$value\"\n";
+}
+
+
+sub stat {
+
+  my $file = shift;
+
+  if (exists($stat{$file})) {
+    print STDERR "++Cache hit: $file\n" if $debug;
+  } else {
+    stat($file);
+    if (-e _) {
+      $stat{$file}=(-d _)?'d':'f';
+    } else {
+      $stat{$file}='n';
+    }
+    print STDERR "--Cache miss: $file\n" if $debug;
+  }
+  return $stat{$file};
+}
+
+# ######################## Read 'state' files ##############################
+
+sub read_state {
+
+  my $reffile='.referers';
+  my $refered;
+  my @referers;
+
+  $reffile="referers" if $win32;
+
+  print STDERR "reading $reffile\n" if $verbose>0;
+  open(REFERERS,"< $reffile") ||
+    die "Could not open $reffile for reading: $!\n";
+
+  while (<REFERERS>) {
+    chomp;
+    ($refered,undef,@referers) = split(/\s+/);
+    $rum_referers{$refered}= [ @referers ];
+    # print STDERR $refered," <- ",join(' and ',@referers),"\n";
+  }
+
+  close(REFERERS);
+
+
+  # Read redirection report
+
+  my $redirfile='.redirs';
+  my $wrong;
+  my $right;
+  my $tmp;
+
+  $redirfile="redirs" if $win32;
+
+  print STDERR "reading $redirfile\n" if $verbose>0;
+  open(REDIRS,"< $redirfile") ||
+    die "Could not open $redirfile for reading: $!\n";
+
+  while (<REDIRS>) {
+    chomp;
+    ($wrong,undef,$right) = split(/\s+/);
+
+    $rum_redirected{$wrong}=$right;
+  }
+
+  close(REDIRS);
+}
+
+# ######################### Process every single tag ########################
+
+sub process_tag {
+  # Process a tag in html file
+  my $lf_referer = shift;
+  my $base_url = shift;
+  my $tag_name = shift;
+  my $url_attrs = shift;
+
+  # Retrun quickly if no URL attributes
+  return unless defined($url_attrs);
+
+  my $attrs = shift;
+
+  # Information loss through apply or processing in this procedure?
+  my $il = $infoloss; 
+  my $redirs;
+  my $stat;
+
+  my $rum_url;	# The absolute URL
+  my $lf_url;	# The local filesystem url
+  my $lf_url_o; # ... and it's object
+  my $key;
+  my $orig_rum_url;
+#  my $debug = 1;
+
+#  print STDERR "\nProcess Tag: $tag_name, URL attributes: ", join(', ',@{$url_attrs}),"\nOrigin:",$base_url,"\n"; # if $debug>2;
+
+  substr($lf_referer,0,0)='./' unless substr($lf_referer,0,1) eq '/';
+
+  foreach $key (@{$url_attrs}) {
+    if (defined($$attrs{$key})) {
+      $orig_rum_url=$rum_url=$$attrs{$key};
+
+      print STDERR "\n$key = $rum_url\n" if $debug;
+
+      # Apply redirects:
+      $redirs=0;
+      if (exists($rum_redirected{$rum_url})) {
+	$il=1;
+	while (exists($rum_redirected{$rum_url})) {
+	  die "Too many redirects in a row\n" if $redirs++>32;
+	  print STDERR "$rum_url -> ".$rum_redirected{$rum_url}."\n"
+	    if $debug;
+	  $rum_url=$rum_redirected{$rum_url};
+	}
+      }
+
+      # Apply program/user apply rules
+      $lf_url=apply($rum_url);
+
+      if (defined($lf_url)) {
+	# Apply directory/file check here
+	$stat=&stat($lf_url);
+
+	if ($stat eq 'f' && $lf_url =~ m~/$~) {
+	  # It's a file, remove trailing /
+	  print STDERR "****** File / fixup of $lf_url\n" if $debug;
+	  $il=1;
+	  substr($lf_url,length($lf_url)) = '';
+	} elsif ($stat eq 'd' && !($lf_url =~ m~/$~) ) {
+	  # It's a directory, add a trailing /
+	  print STDERR "****** Directory / fixup of $lf_url\n" if $debug;
+	  $il=1;
+	  $lf_url .= '/';
+	}
+
+	substr($lf_url,0,0)='./' unless substr($lf_url,0,1) eq '/';
+
+	$lf_url_o=url $lf_url;
+	my $tmp=$lf_url_o->clone;
+	$tmp->basename($indexname);
+
+	if ( $doindex && $lf_url_o->basename eq "" && 
+	     &stat($tmp->unix_path) eq 'f' &&
+	     !$htmlop::isdir{$key}) {
+	  $lf_url_o=$tmp;
+	  $il=1;
+	  print STDERR "indexname adjusted to ",$lf_url_o->as_string,"\n"
+	    if $debug;
+	}
+		 
+	# Save new value in the hash, make it a file url to get 'rel' working
+	$lf_url_o->scheme('file');
+	$$attrs{$key} = ($lf_url_o->rel("file:".$lf_referer))->as_string;
+
+	printf STDERR "Saved ".$$attrs{$key}."\n" if $debug;
+
+	# If there is potential information loss save the old value too
+	$$attrs{"W3MIR".$key}=$orig_rum_url if $il;
+
+      } elsif ($redirs>0) {
+	$$attrs{$key}=$rum_url;
+	print STDERR "Saved ".$$attrs{$key}."\n" if $debug;
+	$$attrs{"W3MIR".$key}=$orig_rum_url;
+      }
+    }
+  }
+}
+
+
+# ###################### Edit the URLs in one file... ########################
+
+sub edit_html_file {
+  # Check if it's a html file.  I know this tag is in all html
+  # files, because w3mir put it there.
+
+  my($lf_url)=shift;
+  my($rum_url)=shift;
+
+  # Figure out the filename for our local filesystem.
+  $lf_url.=$indexname if $lf_url =~ m~/$~ || $lf_url eq '';
+
+  # Stuff in need of unquoting?
+  $lf_url = (url "file:$lf_url")->local_path if $lf_url =~ /\%\d\d/;
+
+  if (exists($lf_edited{$lf_url})) {
+    print STDERR "Already edited $lf_url\n" if $debug;
+    return ;
+  }
+
+  $lf_edited{$lf_url}=1;
+
+  my $page;
+  my $newpage;
+  my $read;
+  my $atime;
+  my $mtime;
+
+  # dev  uno   mode  nlink uid   gid   rdev  size  atime mtime
+  (undef,undef,undef,undef,undef,undef,undef,undef,$atime,$mtime)
+    = stat($lf_url);
+
+  if (!open(TMPF,"< $lf_url\n")) {
+    warn "Cannot read $lf_url: $!\n" if $verbose>=0;
+    return;
+  }
+
+  $read=sysread(TMPF,$page,10240,0);
+  close(TMPF);
+
+  if (! $page =~ /<HTML/i) {
+    print STDERR "$lf_url is not html\n" if $verbose>0;
+    return ;
+  }
+
+  $files++;
+
+  print STDERR "w3mfix: $lf_url" if $verbose>=0;
+  
+  print STDERR "$lf_url is a html file\n" if $debug;
+
+  print STDERR " reading" if $verbose>0;
+  
+  open(TMPF,$lf_url) || 
+    die "Could not open $lf_url for reading: $!\n";
+  # read the whole file.
+  {
+    local($/)=undef;
+    $page = <TMPF>;
+  }
+  close(TMPF);
+
+  print STDERR " ",length($page)," bytes" if $verbose>0;
+
+  # It's a html document
+
+  print STDERR ", editing" if $verbose>0;
+
+  ($newpage,undef) = 
+    &htmlop::process($page, # $htmlop::NODOC,
+		     $htmlop::ABS,$rum_url,
+		     $htmlop::USESAVED,'W3MIR',
+		     $htmlop::TAGCALLBACK,\&process_tag,$lf_url);
+
+  open(TMPF,">$lf_url") ||
+    die "\nCould not open $lf_url for writing: $!\n";
+  
+  print STDERR ", saving" if $verbose>0;
+
+  if (length($newpage)) {
+    # This is ODD: close does not seem to flush the buffers.  So we
+    # force the issue.
+    local($|)=1;
+    print TMPF $newpage || 
+      die "\nCould not write to $lf_url (disk full?): $!\n";
+  }
+
+  close(TMPF) || 
+    die "\nCould not close $lf_url after writing: $!\n";
+
+  # Set times back to what they were.
+  utime $atime,$mtime,$lf_url;
+
+  print STDERR ".\n" if $verbose>=0;
+}
+
+# ############################### Scope test
+
+sub want_this {
+  # Find out if we want the url passed.  Just pass it on to the
+  # generated functions.
+  my($rum_url)=shift;
+
+  # Does scope rule want this?
+  return &$scope_code($rum_url) &&
+    # Does user rule want this too?
+    &$rule_code($rum_url) 
+  
+}
+
+# ############################### Apply the apply rules
+
+sub user_apply {
+  # Apply the user apply rules
+  return &$user_apply_code(shift);
+}
+
+
+sub internal_apply {
+  # Apply the w3mir generated apply rules
+  return &$apply_code(shift);
+}
+
+
+sub apply {
+  # Apply the user apply rules.  Then if URL is wanted return result of
+  # w3mir apply rules.  Return the undefined value otherwise.
+
+  my $url = user_apply(shift);
+
+  return undef unless want_this($url);
+
+  internal_apply($url);
+}
+
+# ############################### Decide what URLs to edit
+
+sub edit_as_needed {
+  my $rum_redirected;
+  my $rum_url;
+  my $o_rum_url;
+  my $rum_referer;
+  my $lf_url;
+  my $foo;
+  my $redirs;
+
+  if ($editthis) {
+
+    # Find the URLs that match $edithis
+    foreach $o_rum_url (keys %rum_referers) {
+      # Work on them if they (now) fall within the scope of retrival
+      $redirs=0;
+      $rum_url=$o_rum_url;
+      if (exists($rum_redirected{$o_rum_url})) {
+	while (exists($rum_redirected{$rum_url})) {
+	  die "Too many redirects in a row\n" if $redirs++>32;
+	  print STDERR "$rum_url -> ".$rum_redirected{$rum_url}."\n"
+	    if $debug;
+	  $rum_url=$rum_redirected{$rum_url};
+	}
+      }
+      next unless $rum_url =~ /$editthis/io;
+      next unless want_this($rum_url);
+      # Find and edit the documents containing references to $o_rum_url
+      foreach $rum_referer (@{$rum_referers{$o_rum_url}}) {
+	next if $rum_referer eq '(commandline)';
+	$lf_url=apply($rum_referer);
+	next unless defined($lf_url);
+	edit_html_file($lf_url,$rum_referer);
+      }
+    }
+    
+    # Don't do anything else when invoked thus
+    return;
+  }
+
+  if ($doindex) {
+    # Edit everything that refers anything with trailing /
+    foreach $rum_url (grep(/\/$/,keys %rum_referers)) {
+      foreach $rum_referer (@{$rum_referers{$rum_url}}) {
+	next if $rum_referer eq '(commandline)';
+	$lf_url=apply($rum_referer);
+	next unless defined($lf_url);
+	edit_html_file($lf_url,$rum_referer);
+      }
+    }
+  }
+
+  # Edit only redirected stuff
+  foreach $rum_redirected (keys %rum_redirected) {
+    # print "Redirected $rum_redirected\n";
+    foreach $rum_url (@{$rum_referers{$rum_redirected}}) {
+      # print "- Found in $rum_url\n";
+      $lf_url=apply($rum_url);
+      next unless defined($lf_url);
+      edit_html_file($lf_url,$rum_url);
+    }
+  }
+}
+
+# ############################### 'main'
+
+&parse_args(@ARGV);
+
+if (!$rc) {
+  $rc='.w3mirc';
+  $rc='w3mir.ini' if $win32;
+}
+
+print STDERR "w3mfix: rc file: $rc\n" if $verbose>0;
+
+&parse_cfg_file($rc);
+
+# $chdirto is ignored, w3mir already did it
+
+# Compile second order code
+
+# - The rum scope tests
+my $full_rules=$scope_prefix.$scope_fetch.$scope_ignore.$scope_postfix;
+eval $full_rules;
+
+# warn "Scope rules:\n-------------\n$full_rules\n---------------\n";
+
+die "Program generated rules did not compile.  The code is:\n----\n".
+  $full_rules."\n----\n"
+  if !defined($scope_code);
+
+$full_rules=$rule_prefix.$rule_text.$rule_postfix;
+eval $full_rules;
+
+# warn "User rules:\n-------------\n$full_rules\n---------------\n";
+
+# - The user specified rum tests
+die "Ignore/Fetch rules did not compile.  The code is:\n----\n".
+  $full_rules."\n----\n"
+  if !defined($rule_code);
+
+# - The user specified apply rules
+
+my $full_apply=$apply_prefix.($lc?$apply_lc:'').
+  join($ipost.";\n",@user_apply).(($#user_apply>=0)?$ipost:"").";\n".
+  $apply_postfix;
+eval $full_apply;
+
+die "User apply rules did not compile. The code is:
+----
+".$full_apply."
+----\n" if !defined($apply_code);
+
+$user_apply_code=$apply_code;
+
+# - The w3mir generated apply rules
+
+$full_apply=$apply_prefix.($lc?$apply_lc:'').
+  join($ipost.";\n",@internal_apply).(($#internal_apply>=0)?$ipost:"").";\n".
+  $apply_postfix;
+eval $full_apply;
+
+die "Internal apply rules did not compile.  The code is:
+----
+".$full_apply."
+----\n" if !defined($apply_code);
+
+&read_state;
+
+&edit_as_needed;
+
+exit 0;
+__END__
+# -*- perl -*-  There must be a blank line here:
+
+=head1 NAME
+
+w3mfix - fixup program for w3mir
+
+=head1 SYNOPSIS
+
+B<w3mfix> [B<options>] [B<configuration-file>]
+
+=head1 DESCRIPTION
+
+B<w3mfix> is the companion program to L<w3mir>.  It can be used for
+several URL editing operations usefull in different situations.  
+
+When starting B<w3mfix> will read it's configuration file.  It's name is 
+either .w3mirc (w3mir.ini on win32) or specified on the commandline.
+
+B<w3mfix> is controlled by the 'Fixup' directive of the configuration
+file (described in the L<w3mir> documentation).  B<w3mfix> is also
+affected by 'Index-name' and the one special commandline option it
+knows, as well as the directives/options controlling verbosity and
+debugging information.
+
+=head1 DESCRIPTION
+
+B<w3mfix> can rewrite URLs in these ways:
+
+=over 4
+
+=item * Rewrite URLs that resutled in redirects to point to the place
+redirected to.  This is needed in all cases and will always be fixed
+by B<w3mfix>.
+
+=item * Change URLs ending in .../ into .../index.html (or
+.../Welcome.html).  This is, probably, not needed when the mirror is
+meant do be used with a web-server.  It is usefull for browsing
+directly from disk or CDROM, but in this case it's, most often,
+required.  To disable this specify the I<noindex> option with the
+'Fixup' directive.
+
+The default is to transform URLs ending in .../ into .../index.html.
+
+To controll the name of the index file use the I<Index-name> directive
+as documented in L<w3mir>
+
+=item * Change URL links to documents outside the mirror to point to
+some local document.  Could be usefull if the mirror is destined for a
+CDROM to be used on a unconnected machine.
+
+THIS IS NOT YET IMPLEMENTED
+
+=item * Change URL links to documents that L<w3mir> was
+unable/forbidden to retrive to point to some local document.  Pointing
+these to a nice informative document is probably better than random
+error messages from the browser.
+
+THIS IS NOT YET IMPLEMENTED
+
+=item * And, least, but far from last, B<w3mfix> can be used to
+prepare an established mirror for enlargement.
+
+This feature is used thus: Add the new site or subsite to be mirrored
+on the configuration file (by adding B<Also:> and B<Also-quene:>
+directives).  Then run B<w3mfix> with the B<-editref> option.  When
+the B<-editref> option is specified B<w3mfix> will not perform any
+other editing tasks.
+
+E.g.; To add I<http://www.yahoo.com/Science/Artificial_Life/> to your
+mirror add something like
+
+	  Also: http://www.yahoo.com/Science/Artificial_Life/ yahoo
+
+to the configuration file, then run w3mfix:
+
+	  w3mfix -editref www.yahoo.com/Science/Artificial_Life
+
+This will cause all references to
+I<www.yahoo.com/Science/Artificial_Life> (and under) to be edited so they
+point to within the mirror.  After B<w3mfix> has finished you can run
+L<w3mir> in the normal manner.
+
+=back
+
+=head1 BUGS
+
+Naah.
+
+=head1 SEE ALSO
+
+L<w3mir>
+
+=head1 AUTHORS
+
+B<w3mir>s authors can be reached at I<w3mir-core@usit.uio.no>.
+B<w3mir>s home page is at http://www.math.uio.no/~janl/w3mir/
+
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir-HOWTO.html
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir-HOWTO.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir-HOWTO.html	(revision 21083)
@@ -0,0 +1,943 @@
+<!doctype html public "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>W3MIR HOWTO</title>
+<style type="text/css">
+<!--
+  body { background-color: white }
+  h1, h2, h3, b { font-family: sans-serif }
+  .red { color: red }
+-->
+</style>
+<body>
+<h1>W3MIR HOWTO</h1>
+
+<p><b>Corresponding to w3mir version 1.0.2 and above</b>
+
+<p>W3mir is an all purpose WWW copying and mirroring program.  Its
+main focus is copying complete directory structures keeping your copy
+browseable through a web server, or directly off a disk or CDROM if
+you want.  W3mir will fix URLs that are redirected and everything else
+that needs to be fixed to make your copy browseable.  But it also does
+odd jobs, retrieving single documents, batch getting several documents
+and more.  You may tell w3mir not to change anything in the retrieved
+documents.  W3mir has been in development quite a long time so you
+find options to do a lot of things needed when copying things off the
+web.
+
+<p>With w3mir you may copy the entire contents a web server.  Or just
+a directory hierarchy, or several related hierarchies off as many
+servers as you like.  They don't even have to be related.
+
+<p>W3mir supports HTML4, and has partial support for CSS, Java,
+ActiveX and Adobe Acrobat (PDF) files.  And it works on Win32
+machines.
+
+<p><b>Warning:</b> W3mir enables you to copy a lot of things off the
+Web, but remember, the things you retrieve might be copyrighted and
+the copy you make with w3mir might in fact be illegal to make and
+posses.
+
+<hr>
+
+<h2><a name="contents">Contents</a></h2>
+
+<p><a href="#intro">README</a> (You want to read this!  <b
+class="red">Really!</b>)
+
+<p><b>How do I...</b>
+<ol>
+  <li><p><a href="#copy">copy a file?</a>
+  <li><p><a href="#recurse">copy a directory hierarchy?</a>
+  <li><p><a href="#resources">copy the needed resource files from another
+    directory hierarchy?</a>
+  <li><p><a href="#ignore">avoid copying files I don't want or copy only
+    files I want?</a>
+  <li><p><a href="#rm">remove the files that are no longer on the
+    original site from the mirror?</a>
+  <li><p><a href="#depth">limit how deep w3mir will recurse?</a>
+  <li><p><a href="#memory">limit w3mirs memory usage?</a>
+  <li><p><a href="#multi">copy files from multiple sites?</a>
+  <li><p><a href="#alias">copy files from one server with several names?</a>
+  <li><p><a href="#aborted">restart a mirror process after stopping it
+    prematurely?</a>
+  <li><p><a href="#enlarge">enlarge or prune an established mirror?</a>
+  <li><p><a href="#cat">'cat' a file?</a>
+  <li><p><a href="#list">list URLs in a document?</a>
+  <li><p><a href="#robots">disable robots.txt obedience?</a>
+  <li><p><a href="#corrupt">stop w3mir from corrupting binary files?</a>
+  <li><p><a href="#auth">copy a site that wants user-name and password?</a>
+  <li><p><a href="#mauth">access a site that wants several different
+    user-names and passwords?</a>
+  <li><p><a href="#proxy">use a proxy server?</a>
+  <li><p><a href="#pauth">authenticate myself to a proxy server?</a>
+  <li><p><a href="#proxytweak">ensure that the proxy server ...?</a>
+  <li><p><a href="#batchget">batch get files with w3mir?</a>
+  <li><p><a href="#cgi">handle CGI?</a>
+  <li><p><a href="#imap">handle server side image-maps?</a>
+  <li><p><a href="#java">handle Java and ActiveX?</a>
+  <li><p><a href="#script">handle java-script and other script languages?</a>
+  <li><p><a href="#css">handle the other things with 'partial support'?</a>
+  <li><p><a href="#anon">keep my identity secret?</a>
+  <li><p><a href="#ns">pretend that I'm using Netscape, Internet
+    Explorer or Lynx?</a>
+  <li><p><a href="#other">do other things?</a>
+</ol>
+
+<hr>
+
+<h2><a name="intro">README</a></h2>
+
+<p>W3mir may be used in two, main, ways:
+
+<ul>
+  <li><p>To copy something random once.
+  <li><p>To keep a local mirror of some remote site
+</ul>
+
+<p>To copy something random once there is a high likeliness you can
+just start w3mir with some simple options and it will do the job you
+want it to.  Providing that the remote site is not too complex and
+your expectations of the copy aren't high :-) This is what wget, the
+gnu w3 mirroring program, does and is good at.
+
+<h3>Configuration file</h3>
+
+<p>Once you want to keep a copy of a remote site up-to-date over time,
+mirror something with server side image-maps, redirects or
+authentication you have to write a configuration file for w3mir.  This
+is what w3mir is good at, compared to wget.  Writing the file is not
+hard, and there are two example files in the w3mir distribution.  It
+will also be explained here.  The configuration file is typically
+called <tt>.w3mirc</tt> (<tt>w3mir.ini</tt> on win32 machines), and
+can be written with a simple text editor.  It is kept in the top
+directory of the mirror, where w3mir will find it when it starts.
+Please refer to the <a href="#contents">contents</a> for how to handle
+a specific problem with a configuration file.
+
+<hr>
+
+<h2>The answers:</h2>
+
+<hr>
+
+<h3><a name="copy">How do I copy a file?</a></h3>
+
+<p>To copy the top page off www.starwars.com:
+
+<p><tt>w3mir http://www.starwars.com/</tt>
+
+<p><b>Note:</b> it is <em>important</em> that you give the trailing
+slash for server names and directories.
+
+<hr>
+
+<h3><a name="recurse">How to I copy a directory hierarchy?</a></h3>
+
+<p>To copy the entire stuff about episode I from www.starwars.com
+which is stored in <tt>http://www.starwars.com/episode-i/</tt> (I don't
+recommend this, it's quite a lot of data):
+
+<p><tt>w3mir -r http://www.starwars.com/episode-i/</tt>
+
+<p>The corresponding configuration file is simple:
+
+<pre>
+Options: recurse
+URL: http://www.starwars.com/episode-i/
+Fixup: run
+</pre>
+
+<p>The <tt>-r</tt> option makes w3mir recurse down from the starting
+point.  It will only copy all the documents under
+http://www.starwars.com/episode-i/ that it sees referenced from those
+same documents.  W3mir will <em>not</em> retrieve documents from
+http://www.starwars.com/ because it is considered to be 'over' the
+starting point.
+
+<p>The command-line will get you a copy that is definitely browseable
+via a WEB server, and possibly browseable directly from a CDROM or
+hard-disk.  To ensure that it is browseable from CDROM and disk you
+need to use a configuration file with the <tt>Fixup: run</tt> line in.
+It causes w3mir to edit anything that needs editing after the mirror
+has completed, including fixing URLs that caused redirects.  The dirty
+work is done by w3mirs helper program w3mfix.  The directive will
+cause w3mfix to be run each time w3mir completes the mirror.
+
+<p><b>Note:</b> it is <em>important</em> that you give the trailing
+slash after the directory name.  Specifying
+<tt>http://www.starwars.com/episode-i</tt> and
+<tt>http://www.starwars.com/episode-i/</tt> is quite different in
+w3mirs eyes.  In the former case episode-i is considered to be a
+document within the / (top) directory of www.starwars.com and w3mir
+will recurse from /, which is a lot more than you wanted.  In the
+latter case w3mir understands that episode-i is a directory and will
+consider that directory to be the staring point, which is what you
+wanted.
+
+<hr>
+
+<h3><a name="resources">How do I copy the needed resource files from
+another directory hierarchy?</a></h3>
+
+<p>Some sites store their documents in one place, and puts their
+banners, icons and such in a separate directory called
+<tt>/images</tt>, <tt>/banners</tt>, <tt>/icons</tt>,
+<tt>/resources</tt> or some such.  Unless you retrieve these as well as
+the documents things will probably not be too colorful.  So, imagine
+that the starwars site stored all the images in one holding directory
+called <tt>/imagery</tt> and you want to copy all the stuff in it that
+the episode-i pages need.  Then you do this:
+
+<pre>
+Options: recurse
+URL: http://www.starwars.com/episode-i/ episode-i
+Also: http://www.starwars.com/imagery/ imagery
+Fixup: run
+</pre>
+
+<p>There are two changes here compared to the simpler file we started
+with: There is an extra argument at the end of the URL directive.  It
+tells w3mir to store everything gotten from
+<tt>http://www.starwars.com/episode-i/</tt> in the subdirectory
+<tt>episode-i</tt>.  The directory can be omitted, but I think its
+neater this way.  Then the new directive 'Also:'.  It tells w3mir that
+you also want whatever the documents under
+<tt>http://www.starwars.com/episode-i/</tt> references under
+<tt>http://www.starwars.com/imagery/</tt>.
+
+<p><b>Note:</b> this will only get stuff that was used by the
+documents under <tt>http://www.starwars.com/episode-i/</tt>, anything
+stored under <tt>http://www.starwars.com/imagery/</tt> which is not
+used will not be retrieved. If you want everything under
+<tt>imagery</tt> to be retrived use the <tt>Also-quene:</tt>
+directive.
+
+<hr>
+
+<h3><a name="ignore">How do I avoid copying files I don't want or copy
+only files I want?</a></h3>
+
+<p>To control what files w3mir copies you can use the
+<tt>Ignore:</tt>, <tt>Fetch:</tt>, <tt>Ignore-RE:</tt> and
+<tt>Fetch-RE:</tt> directives in the configuration file.  The embeded
+references to any file you chose to ignore, i.e., not copy, will point
+at the original site, <em>not</em> to the mirror.  This means that the
+mirror user may still get ahold of the file from the original source
+by simply clicking if she so desires.
+
+<p>If a site contains huge .wav audio files that you are not
+interested in you put
+
+<pre>
+Ignore: *.wav
+</pre>
+
+<p>in the configuration file.  You may ignore as many different
+filename patterns as you want.  If you are mirroring a site you want
+very few, specific files from, say all HTML (named
+<em>something</em><tt>.html</tt>) and all Mpeg video files (named
+<em>something</em><tt>.mpg</tt>) you can write this:
+
+<pre>
+Fetch: *.html
+Fetch: *.mpg
+Ignore: *
+</pre>
+
+<p>W3mir will test each filename against each Fetch/Ignore rule in
+sequence.  A html file will match the first line and be fetched.  Any
+mpg file will match the second line and be fetched.  All other files
+will match the third line, and be ignored.  This last line is needed
+because the default is to get any files which are not ignored.  By
+arranging fetch and ignore rules carefully you may retrieve exactly
+the filename patterns you want and not retrieve anything else.
+
+<p>If you decide you also want all Mpeg Layer 3 audio files
+(<em>something.</em><tt>mp3</tt>) from the site, after the mirror has
+been established.  Then you add this:
+
+<pre>
+Fetch: *.mp3
+</pre>
+
+<p>as the third line, making the <tt>Ignore: *</tt> line the forth and
+last.  Then you must fix all references to .mp3 files within the
+mirror by running w3mfix thus:
+
+<pre>
+w3mfix -editref .mp3
+</pre>
+
+<p>which will edit all references to .mp3 files, pointing them the
+right place, on your disk. Ditto when you remove a fetch rule, or add
+or remove an ignore rule. See the answer about <a
+href="#enlarge">enlarging and pruning</a> mirrors for more examples of
+using <tt>w3mfix -editme ...</tt>
+
+<p><b>Note:</b> when retrieving only a very limited set of files, as
+in the example above, you <em>must</em> retrieve the html files,
+because how else will w3mir find URLs of files to retrieve? Only html
+files contain links to other files.
+
+<p>Similarly, you may chose to not mirror whole branches of the
+original site.  If you for example mirror my home-pages, and you decide
+not to mirror the comics pages you can put
+
+<pre>
+Ignore: /ts/
+</pre>
+
+<p>or more precisely
+
+<pre>
+Ignore: http://www.ifi.uio.no/~janl/ts/
+</pre>
+
+<p>in the configuration file.  If you do this after having established
+the mirror you use w3mfix to fix the references:
+
+<pre>
+w3mfix -editref /ts/
+</pre>
+
+<p><tt>Fetch:</tt> and <tt>Ignore:</tt> rules can only use a very
+limited subset of the Unix wild-cards.  w3mir understands only '?',
+'*', and '[a-z]' ranges.
+
+<p><tt>Ignore-RE:</tt> and <tt>Fetch-RE:</tt> are the same as
+<tt>Fetch:</tt> and <tt>Ignore:</tt> except that they give you access
+to the full power of Regular Expressions to make rules for that to get
+or not to get. They support perls superset of the normal Unix regular
+expression syntax.  They must be completely specified, including the
+prefixed m, a delimiter of your choice (except the paired delimiters:
+parenthesis, brackets and braces), and any of the RE modifiers. I.e.,
+
+<pre>
+Ignore-RE: m/.gif$/i
+</pre>
+
+<p>or
+
+<pre>
+Ignore-RE: m~/.*/.*/.*/~
+</pre>
+
+<p>and so on.  "#" cannot be used as delimiter as it is the comment
+character in the configuration file.
+
+<p>There are some traps when using <tt>Ignore-RE</tt> and
+<tt>Fetch-RE</tt>, please see their documentation in <tt>mandoc
+w3mir</tt> for a more complete explanation.
+
+<hr>
+
+<h3><a name="depth">How do I limit how deep w3mir will recurse?</a></h3>
+
+<p>W3mir has no explicit mechanism to limit the depth of recursion,
+but the same result can be achieved with a simple <tt>Ignore</tt> rule:
+
+<pre>
+Ignore: /*/*/*/*/*/*/
+</pre>
+
+<p>This will ignore any URLs that contain at least 7 slashes ("/").
+Note that a URL contains three slashes that does not have anything to
+do with depth:
+
+<pre>
+http://www.ifi.uio.no/
+</pre>
+
+<p>so only the surplus slashes are used for depth in this match.  In the
+example above the limit is 4 levels from the top.  The
+<tt>Ignore:</tt> rule that is used to limit recursion depth must be
+listed before any <tt>Fetch:</tt> rules to be effective.
+
+<hr>
+
+<h3><a name="memory">How do I limit w3mirs memory usage?</a></h3>
+
+<p>In a mirror consisting of <em>many</em> files, such as a archive of
+an active mailinglist w3mir will build a very large referer table, in
+part for w3mir to use in the <tt>Referer:</tt> header and in part for
+w3mfix to use in fixing references.
+
+<p>If you disable both the <tt>Referer:</tt> header and don't use
+w3mfix w3mir will not build a referer table.  You do this in the
+configuration file:
+
+<pre>
+Disable-headers: referer
+Fixup: off
+</pre>
+
+<p>Please note the potential problems of turning off fixup described
+earlier in this howto.  There are normaly no problems associated with
+simple sites, but if there are redirects fixup <em>is</em> needed for
+a consistent mirror.
+
+<hr>
+
+<h3><a name="rm">How do I remove the files are no longer on the
+original site from the mirror?</a></h3>
+
+<p>Over time the site you mirror will add files, and quite possibly
+remove files.  Or you might introduce new <tt>Ignore:</tt> rules after
+establishing the mirror that reduces the files wanted in the mirror.
+
+<p>By default w3mir will not delete such old files, some people might
+want to keep the files even if they are removed from the original
+site.  To remove the old/unwanted files you add 'remove' to the
+<tt>Options:</tt> line.
+
+<hr>
+
+<h3><a name="multi">How do I copy files from multiple sites?</a></h3>
+
+<p>In the answer to the previous question we see how to mirror several
+related sites.  For example, say you want to mirror all my home-pages
+into one mirror:
+
+<pre>
+Option: recurse
+URL: http://www.math.uio.no/~janl/ math/janl
+Also: http://www.math.uio.no/drift/personer/ math/drift
+Also: http://www.ifi.uio.no/~janl/ ifi/janl
+Also: http://www.mi.uib.no/~nicolai/ math-uib/nicolai
+</pre>
+
+<p>As in the previous example this will only get documents that are
+referenced.  Any documents that are stored at these location but to
+which w3mir finds no references will not be retrieved.  So this will
+fail if the sites are not in any way related, or if you wanted
+<em>everything</em> stored at each site.
+
+<p>To mirror unrelated sites, or get it all you may specify that the
+given URL should be considered a starting-point as well:
+
+<pre>
+Also-quene: http://www.math.uio.no/drift/personer/ math/drift
+</pre>
+
+<p>and, if you want to add an additional starting-point within a already
+named site:
+
+<pre>
+Quene: http://www.math.uio.no/drift/personer/foo.html
+</pre>
+
+<p>Armed with that you should be able to get pretty much anything you
+like.
+
+<hr>
+
+<h3><a name="alias">How do I copy files from one server with several
+names?</a></h3>
+
+<p>Simple, the same way you mirror several servers with different
+names. The math department at University of Oslo has a web server
+known under two names: math-www.uio.no and www.math.uio.no, and both
+names are used in documents stored on it. To copy the whole server,
+one time only, give these URL and Also lines:
+
+<pre>
+URL: http://www.math.uio.no/ .
+Also: http://math-www.uio.no/ .
+</pre>
+
+<p>Note the period/dot (.) at the end of each line.  It means that
+w3mir will store the files in the current directory, i.e. documents
+from both servers will be stored in the same place.  But since w3mir
+asks to only get documents that are newer than the ones it already has
+any document gotten from the server under the www.math.uio.no name
+will not be gotten from the math-www.uio.no name as well.  ... w3mir
+will ask for the document, but the server will tell w3mir that its
+copy is current and there will be no additional transfer of the
+document.
+
+<hr>
+
+<h3><a name="enlarge">How do I enlarge or prune an established
+mirror?</a></h3>
+
+<p>This only works if you use a configuration file.
+
+<p>If you want to add a site or directory to a mirror you simply add
+the needed <tt>Also:</tt> or <tt>Also-Quene:</tt> to the configuration
+file and then you run w3mfix manually, with the -editref option.  If,
+you for example have established a mirror of my home-pages, but want to
+add my wife's home-page you add this
+
+<pre>
+Also: http://www.ifi.uio.no/~annen/ ifi/annen
+</pre>
+
+<p>to the configuration shown earlier.  Then you run w3mfix, and you want
+it to fix all URLs referencing her home-page, the distinguishing
+characteristic is the name 'annen':
+
+<pre>
+w3mfix -editref annen
+</pre>
+
+<p>but 
+
+<pre>
+w3mirx -editref http://www.ifi.uio.no/~annen/
+</pre>
+
+<p>would work too, but it's a lot more to type.  This fixes all the
+references to her home-page so that they point to the mirror instead of
+the original pages.
+
+<p>To prune (cut out something) a mirror you do the same.  Make the
+change in the configuration file and run 'w3mfix -editme ...' to fix
+the references to that which you removed.
+
+<hr>
+
+<h3><a name="cat">How do I 'cat' a file?</a></h3>
+
+<p>W3mir will output the fetched document to its standard output
+(normally your screen/window) if you specify the '-s' command line
+option.  The corresponding configuration file directive is 
+
+<pre>
+File-Disposition: stdout
+</pre>
+
+<hr>
+
+<h3><a name="list">How do I list URLs in a document?</a></h3>
+
+<p>To list the URLs in http://www.math.uio.no/:
+
+<pre>
+w3mir -q -f -l http://www.math.uio.no/
+</pre>
+
+<p>The <tt>-q</tt> switch causes w3mir to produce no other output
+which would disturb the URL listing.  The <tt>-f</tt> switch tells
+w3mir to forget the document once it has been analyzed, i.e., not save
+it on disk.  And finally, the <tt>-l</tt> switch makes w3mir list the
+URLs in the document.  You may combine <tt>-l</tt> with <tt>-r</tt>
+and you need not use it with <tt>-f</tt>.
+
+<p>In the configuration file you put <tt>list</tt> on the
+<tt>Options:</tt> line.
+
+<hr>
+
+<h3><a name="aborted">How to I restart a mirror process after stopping
+it prematurely?</a></h3>
+
+<p>You may just rerun the same command once more.  But that makes
+w3mir request all the documents you have already once more to see if a
+more recent version is available on the server.  You can save time by
+using the <tt>-fs</tt> (Fetch Some) option.  This makes w3mir only
+request documents it does not find on your disk.  E.g.:
+
+<p><tt>w3mir -fs -r http://www.starwars.com/</tt>
+
+<p>This is not something you would normally put in the configuration
+file, but you can, by adding 'only-nonexistent' on the 'Options:' line.
+
+<hr>
+
+<h3><a name="robots">How do I disable robots.txt obedience?</a></h3>
+
+<p>Normally w3mir will read and obey each sites robots.txt file,
+because w3mir wants to be a nice tool. However robots.txt was designed
+with something slightly different than the normal use of w3mir in
+mind, so if you want w3mir to disregard the robot rules you can use
+<tt>-drr</tt> (Disable Robot Rules) on the command-line, or the line
+
+<pre>
+Robot-Rules: off
+</pre>
+
+<p>in the configuration file.  The robot exclusion standard is
+described in <a
+href="http://info.webcrawler.com/mak/projects/robots/norobots.html">http://info.webcrawler.com/mak/projects/robots/norobots.htm</a>.
+
+<hr>
+
+<h3><a name="corrupt">How do I stop w3mir from corrupting binary
+files?</a></h3>
+     
+<p>During the normal course of events w3mir converts the newline
+format of fetched HTML documents to your systems native newline
+format. On Unix a newline consists of a single ASCII LF character, on
+Macintoshes it's a single ASCII CR character and on Dos/Windows it's a
+ASCII CR/LF pair. W3mir understands all these and all HTML files are
+saved in the format your operating system prefers.
+
+<p>If, and this is very unlikely, a web server identifies a binary
+file as HTML w3mir will very likely corrupt the file. If you discover
+a file which is obviously ruined in the mirror, but is not ruined when
+you view it on the original site do this:
+
+<ol>
+
+<li>Notify the webmaster on the original site that the file has the
+wrong MIME type
+
+<li>Use the <tt>-nnc</tt> (No Newline Conversion) option on the
+command line, or
+
+<pre>
+Options: no-newline-conv
+</pre>
+
+in the configuration file.
+
+<li>Remove the corrupt file(s).
+
+<li>Run "<tt>w3mir -fs</tt>...", to fetch only the deleted file(s)
+again.
+
+</ol>
+
+<hr>
+
+<h3><a name="auth">How do I copy a site that wants user-name and
+password?</a></h3>
+
+<p>This can only be done with a configuration file.  Being able to
+give this on the command-line would give the user-name and password away
+to other users of the system, so the ability to give authentication
+information that way has not been put in w3mir.
+
+<p>In the configuration file you put:
+
+<pre>
+Auth-domain: */*
+Auth-user: me
+Auth-passwd: my-password
+</pre>
+
+<p>This will cause w3mir to give the user-name and password each time
+the server asks.  There is no way to make w3mir give the user-name and
+password each time no matter if the server asks or not.
+
+<hr>
+
+<h3><a name="mauth">How do I access a site that wants several
+different user-names and passwords?</a></h3>
+
+<p>If you have several user-names and passwords across
+the server(s) that are copied you need a slightly more advanced
+version of this that associates each user-name/password with a
+authentication "domain".  "Domain" is a HTTP concept.  It is simply a
+grouping of files and documents within a "realm".  One file or a whole
+directory hierarchy can belong to a realm.  One server may have many
+realms.  A user may have separate passwords for each realm, or the
+same password for all the realms the user has access to.  A
+combination of a server name, server port and a realm is called a
+domain.
+
+<pre>
+Auth-domain: theserver:theport/therealm
+Auth-user: me
+Auth-passwd: my-password
+
+Auth-domain: theserver:theport/otherrealm
+Auth-user: other-me
+Auth-password: other-password
+</pre>
+
+W3mir will tell you what the name of the realm is if it is unable to
+authenticate itself with the server. You may also use '*' as the realm
+name if you only copy documents from one realm on that server.
+
+<hr>
+
+<h3><a name="proxy">How do I use a proxy server?</a></h3>
+
+<p>On some secured sites you have to access the Internet through proxy
+servers to get out of the internal network.
+
+<p>A proxy server has a host name, and a port you must use. On the
+command line you simply specify <tt>-P proxy-host-name:proxy-port</tt>. In
+the configuration file you put this:
+
+<pre>
+HTTP-Proxy: proxy-host-name:proxyport
+</pre>
+
+<p>The main advantage of working through proxy servers other than
+security is that you take advantage of any caching the proxy server
+which can speed up retrievals enormously.
+
+<p>Another use of the proxy option is to "prime" the proxy servers
+cache.  I.e. you can use w3mir to fetch the documents through the proxy
+server to ensure that the documents are cached there later when you
+want to read them with your browser.  If you also specify 
+
+<pre>
+File-Disposition: forget
+</pre>
+
+<p>it won't even use any space on your disk, w3mir will just process
+the documents looking for URLs and then <em>not</em> save them.
+
+<hr>
+
+<h3><a name="pauth">How do I authenticate myself to a proxy
+server?</a></h3>
+
+<p>Some proxy servers demands a user-name and password to let you use
+them.  W3mir does not support the domain concept in connection with
+proxy authentication because the author cannot imagine that it will be
+needed.  You need to put this in your configuration file:
+
+<pre>
+HTTP-Proxy-user: proxy-username
+HTTP-Proxy-passwd: proxy-password
+</pre>
+
+<hr>
+
+<h3><a name="proxytweak">How do I ensure that the proxy server
+...?</a></h3>
+
+<p>HTTP/1.0 proxy servers may be told to not use its current copy of
+a document if you specify the <tt>-pflush</tt> command-line option.  Or 
+
+<pre>
+Proxy-Options: refresh
+</pre>
+
+<p>in the configuration file.  This is useful if the proxy has an old
+copy of some document and does not realize that a newer version exists
+on the origin site.  W3mir uses the HTTP/1.0 version of this command
+by default.  You can force w3mir to use the HTTP/1.1 version by adding
+<tt>no-pragma</tt> to the line.  If you do this it will not work at
+all as you want unless the server knows the HTTP/1.1 protocol.
+
+
+<p>HTTP/1.1 proxy servers can be manipulated in a few more ways.  The
+configuration file <tt>Proxy-Options:</tt> directive also takes
+<tt>revalidate</tt> and <tt>no-store</tt> options.  The former tells
+the proxy server to check if there is any newer version available.
+This is, in principle, more network friendly than the <tt>refresh</tt>
+option since it will only cause a copy if there is a newer file
+available.  The <tt>no-store</tt> option tells the proxy server to not
+store the documents you transfer.  This might be useful if the
+documents are 'sensitive' or something like that, but if the proxy
+server does not understand HTTP/1.1 it will not obey this option, and
+it might store the document anyway because the functionality is not
+implemented, so you should not count on this to work.
+
+<hr>
+
+<h3><a name="batchget">How do I batch get files with w3mir?</a></h3>
+
+<p>Normally when fetching files w3mir will process each html (and PDF)
+file to find URLs in them for further retrievals.  This is
+time-consuming, and not always wanted.  Sometimes you simply want to
+get a file, or more, and save it, untouched:
+
+<pre>
+w3mir -B http://www.starwars.com/ http://www.ifi.uio.no/~janl/
+</pre>
+
+<p>There is a companion switch for <tt>-B</tt>, namely <tt>-I</tt>, it
+makes w3mir read URLs from its standard input, one pr. line.  Thus you
+can use w3mir in a pipe to batch get several files whose URLs you find
+in some way.  This is a stupid example:
+
+<pre>
+w3mir -q -l -f http://www.ifi.uio.no/ | w3mir -I -B
+</pre>
+
+<p><tt>-B</tt> may also be used with <tt>-r</tt>, but the only effect
+it will have then is to save the html files unchanged on disk, because
+to recurse w3mir <em>has</em> to examine all the html the documents
+for URLs.
+
+<p><b>Please note</b> that using <tt>-B</tt> combined with <tt>-r</tt>
+for mirroring will probably lead to a unstable mirror, because w3mir
+does not get a chance to manipulate the URLs in the documents as it
+needs to be able to maintain a mirror later, and most important of
+all, w3mir needs all html files to contain a &lt;HTML&gt; tag to be
+able to recognize a HTML file as a HTML file. When running with the
+<tt>-B</tt> switch w3mir will not ensure the presence of this and thus
+we must rely on the original documents author to be nice. This is a
+bad bet. In other words, <b>don't use <tt>-B</tt> for recursive
+mirroring</b>, only for batch copying/mirroring of single documents.
+
+<hr>
+
+<h3><a name="cgi">How do I handle CGI?</a></h3>
+
+<p>There is no way w3mir can duplicate the process that happens on the
+Web server when it comes to CGI.  For some CGI programs w3mir can
+simply copy the output and store on disk.  For other CGI programs this
+is not possible, and the only way out is to make w3mir not get the
+involved files using Ignore rules in the configuration file.  These
+will avoid a lot of cgi programs:
+
+<pre>
+Ignore: *.cgi
+Ignore: *-cgi
+</pre>
+
+<p>You might have to add other/more rules for some sites if they have
+other naming conventions or if it's simply impossible to tell from the
+file-name if it's a CGI or not.
+
+<p>When you add ignore rules this causes two things:
+
+<ol>
+<li><p>W3mir will not retrieve documents matching the rules
+<li><p>W3mir will make all references to matching documents point to
+  the site you mirrored from instead of pointing to a non-existent
+  file in the mirror.
+</ol>
+
+<hr>
+
+<h3><a name="imap">How do I handle server side image-maps?</a></h3>
+
+<p>Server side image-maps is yet another thing it's impossible for
+w3mir to relate to.  w3mir simply cannot handle them.  Put ignore
+rules in the configuration file:
+
+<pre>
+Ignore: *.map
+</pre>
+
+<p>W3mir has full support for client side image-maps though.
+
+<hr>
+
+<h3><a name="java">How do I handle Java and ActiveX?</a></h3>
+
+<p>Java and Active X objects are are included in html pages with a
+<tt>&lt;OBJECT&gt;</tt> or <tt>&lt;APPLET&gt;</tt> tag.  W3mir can
+handle these on one condition: The CODEBASE attribute names the
+directory where the program stores its resources (such as
+subprograms, graphic files, sound, text, and so on) and w3mir must
+have read access to this directory.  Otherwise w3mir is without hope,
+it's impossible to extract the name of the resources the program needs
+in any reliable way.
+
+<p>HTML4 supports a attribute that enumerates the resources the
+program needs, w3mir is not able to use this yet.
+
+<hr>
+
+<h3><a name="script">How do I handle java-script and other script
+languages?</a></h3>
+
+<p>W3mir does its best to pass scripts (java-script, perl-script,
+etc...) embedded in the HTML undamaged.  It cannot, however, extract
+any URLs the script generates and the browser would cause the document
+to refer to or embed in a page. 
+
+<p>It will however work if the script generates relative references
+and there is some other way for w3mir to access the referenced file in
+some other manner.  Or if the script generates absolute references and
+the person browsing the mirror has access to the site named, then the
+user will be able to browse the referenced documents via that other
+server.
+
+<hr>
+
+<h3><a name="css">How to I handle the other things with 'partial
+support'</a></h3>
+
+<p>W3mir has partial support for CSS.  This means that
+<tt>&lt;style&gt</tt> tags and the enclosed style data are passed
+undamaged by w3mir.  W3mir will also retrieve the external CSSes named
+in HTML documents.  But w3mir will <em>not</em> (yet) analyze the
+CSSes data to find URLs of other resources (such as fonts) named in
+these.
+
+<p>W3mir also has partial support for Adobe Acrobat (PDF) files.  This
+means that w3mir can extract URLs from PDF files, and get the named
+documents if you want them.  But w3mir cannot edit those URLs so that
+the PDF files point to the mirror instead of wherever on the original
+site they were pointing.  If the PDF files contain absolute URLs they
+will continue pointing to where they were pointing before.  However,
+if the PDF files contain relative references things will work out.
+
+<p>The reason that URLs in PDF files cannot be edited is that they are
+binary and contain byte pointers.  If the URLs length is changed the
+byte pointers will point to the wrong place in the document.  Writing
+code to correct these pointers would be quite complex.  But if you
+write it I will use it.
+
+<hr>
+
+<h3><a name="anon">How do I keep my identity secret?</a></h3>
+
+<p>The HTTP protocol has a header, <tt>User:</tt> which is recommended
+to use by robots, such as w3mir.  Another way to track you is looking
+at the 'Referer:' header w3mir gives in HTTP requests.  Both can be
+disabled:
+
+<pre>
+Disable-headers: referer, user
+</pre>
+
+<p>If you in addition use a proxy server that many other users use
+there is little probability you can be tracked (easily) by the server
+you are copying things from.  You are however much easier to track
+from the logs in the proxy server.  And a court order is quite likely
+to get you tracked in spite of any precautions you take.  
+
+<p>W3mir does not support cookies and thus you cannot be tracked with
+the help of that mechanism.
+
+<hr>
+
+<h3><a name="ns">How do I pretend that I'm using Netscape, Internet
+Explorer or Lynx?</a></h3>
+
+<p>Some web sites give you different documents when you ask for a
+specific URL based on what browser you use, or even what OS you appear
+to be using.  w3mir identifies itself with a string that looks like
+this:
+
+<p><tt>w3mir/<em>version</em>-<em>release-date</em></tt>
+
+<p>Netscape identifies itself with strings that look something like
+this:
+
+<p><tt>Mozilla/3.01 (X11; I; Linux 2.0.30 i586)</tt>
+
+<p>and Internet Explorer says it's something like this:
+
+<p><tt>Mozilla/2.0 (compatible; MSIE 3.02; Windows NT)</tt>
+
+<p>and Lynx says something like this
+
+<p><tt>Lynx/2.6  libwww-FM/2.14</tt>
+
+<p>You can change w3mirs identification with <tt>-agent 'string'</tt>
+on the command line.  In the configuration file you put
+
+<pre>
+Agent: Mozilla/3.01 (X11; I; Linux 2.0.30 i586)
+</pre>
+
+<p>to pretend w3mir is netscape 3.01.
+
+<hr>
+
+<h3><a name="other">How do I do other things?</a></h3>
+
+<p>This document is by no means a complete list of the things you can
+do with w3mir.  The w3mir man page (<tt>man w3mir</tt> or <tt>perldoc
+w3mir</tt> lists more things, and goes into more detail of how things
+work so you can use the knowledge to do neat things.  There are
+several things mentioned only in the man-page that helps you with
+tricky multi-server mirroring, and gives you better control of what to
+get and not to get and under what name to save it on disk.  And a
+couple of other things...
+
+<hr>
+<address>Nicolai Langfeldt 9/7/1998</address>
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir.PL
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir.PL	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3mir.PL	(revision 21083)
@@ -0,0 +1,3291 @@
+# -*-perl-*-
+
+use Config;
+
+&read_makefile;
+$fullperl = resolve_make_var('FULLPERL') || $Config{'perlpath'};
+$islib = resolve_make_var('INSTALLSITELIB');
+
+$name = $0;
+$name =~ s~^.*/~~;
+$name =~ s~.PL$~~;
+
+open(OUT,"> $name") || 
+  die "Could open $name for writing: $!\n";
+
+print "writing $name\n";
+
+while (<DATA>) {
+  if (m~^\#!/.*/perl.*$~o) {
+    # This substitutes the path perl was installed at on this system
+    # _and_ removed any (-w) options.
+    print OUT "#!",$fullperl,$1,"\n";
+    next;
+  }
+  if (/^use lib/o) {
+    # This substitutes the actuall library install path
+    print OUT "use lib '$islib';\n";
+    next;
+  }
+  print OUT;
+}
+
+close(OUT);
+
+# Make it executable too, and writeable
+chmod 0755, $name;
+
+#### The library
+
+sub resolve_make_var ($) {
+
+  my($var) = shift @_;
+  my($val) = $make{$var};
+
+#  print "Resolving: ",$var,"=",$val,"\n";
+  
+  while ($val =~ s~\$\((\S+)\)~$make{$1}~g) {}
+#  print "Resolved: $var: $make{$var} -> $val\n";
+  $val;
+}
+
+
+sub read_makefile {
+
+  open(MAKEFILE, 'Makefile') || 
+    die "Could not open Makefile for reading: $!\n";
+
+  while (<MAKEFILE>) {
+    chomp;
+    next unless m/^([A-Z]+)\s*=\s*(\S+)$/;
+    $make{$1}=$2;
+#    print "Makevar: $1 = $2\n";
+  }
+
+  close(MAKEFILE)
+}
+
+__END__
+#!/local/bin/perl5 -w
+# Perl 5.002 or later.  w3mir is mostly tested with perl 5.004
+#
+# You might want to change or comment out this:
+use lib '/hom/janl/lib/perl';
+#
+# Once upon a long time ago this was Oscar Nierstrasz's
+# <oscar@cui.unige.ch> htget script.
+#
+# Retrieves HTML pages, creating local copies in the _current_ 
+# directory. The script will check for the last-modified stamp on the
+# document, and will not fetch it if the document isn't changed.
+#
+# Bug list is in w3mir-README.
+#
+# Test cases for janl to use:
+#   w3mir -r -fs http://www.eff.org/ - infinite recursion!
+#     --- but cursory examination seems to indicate confused server...
+#   http://java.sun.com/progGuide/index.html check out the img things.
+#
+# Copyright Holders:
+#   Nicolai Langfeldt, janl@ifi.uio.no
+#   Gorm Haug Eriksen, gorm@usit.uio.no
+#   Chris Szurgot, szurgot@itribe.net
+#   Ed Jordan, ed@olympus.itl.net
+#   Alex Knowles, aknowles@avs.com aka ark.
+# Copying and modification is governed by the "Artistic License" enclosed in
+# the w3mir distribution
+#
+# History (European format date: dd/mm/yy):
+#  oscar 25/03/94 -- added -s option to send output to stdout
+#  oscar 28/03/94 -- made HTTP 1.0 the default
+#  oscar 30/05/94 -- special handling of directory URLs missing a trailing "/"
+#   gorm 20/02/95 -- added mirror capacity + fixed a couple of bugs
+#   janl 28/03/95 -- added a working commandline parser.
+#   janl 18/09/95 -- Changed to use a net http library.  Removed dependency of
+#		     url.pl.
+#   janl 19/09/95 -- Extensive rewrite. Simplified a lot, works better. 
+#		     HTML files are now saved in a new and improved manner,
+#		     which means they can be recognized as such w/o fancy
+#		     filename extention type rules.
+# szurgot 27/01/96-- Added "Plaintextmode" wrapper to binmode PAGE. 
+#                    binmode page is required under Win32, but broke modified
+#                    checking
+#                 -- Minor change added ; to "# '" strings for Emacs cperl-mode
+# szurgot 07/02/96-- When reading in local file for checking of URLs changed
+#                    local ($/) =0; to equal undef;
+#   janl 08/02/96 -- Added szurgot's changes and changed them :-)
+# szurgot 09/02/96-- Added code to strip /#.*$/ from urls when reading from 
+#                    local file
+#                 -- Added hasAlarm variable to w3http.pl. Set to 1 if you have
+#                    alarm(). 0 otherwise.
+#                 -- Moved code setting up the valid extensions list into the
+#                    args processing where it belonged
+#   janl 20/02/96 -- Added szurgot changes again.
+#		  -- Make timeout code work.
+#   		  -- and made another win32 test.
+#   janl 19/03/96 -- Worked through the code for handling not-modified 
+#    		     documents, it was a bit shabby after htmlop was intro'ed.
+#   janl 20/03/96 -- -l fix
+#   janl 23/04/96 -- Added -fs by request (by Rik Faith)
+#   janl 16/05/96 -- Made -R mandatory, added use and support for
+#			w3http::SAVEBIN
+# szurgot 19/05/96-- Win95 adaptions.
+#   janl 19/05/96 -- -C did not exactly work as expected.  Thanks to Petr
+#		     Novak for bug descriptions.
+#   janl 19/05/96 -- Changed logic for @didntget, @got and so on to use
+#		     @queue and %urlstat.
+#   janl 09/09/96 -- Removed -R switch.
+#   janl 14/09/96 -- Added ir (initial referer) switch
+#   janl 21/09/96 -- Made retry code saner.  There probably needs to be a
+#                    sleep before retry comencing switch.  When no tty is
+#                    present it should be fairly long.
+#   gorm 15/09/96 -- Added cr (check robot) switch. Default to 1 (on)
+#   janl 22/09/96 -- Modified gorms patch to use WWW::RobotRules.  Changed
+#		     robot switch to be consistent with current w3mir
+#                    practice.
+#   janl 27/09/96 -- Spelling corrections from charles.curran@ox.ac.uk
+#                 -- Folded in manual diffs from ark.
+#    ark 24/09/96 -- Simple facilities to edit the incomming file(s)
+#   janl 27/09/96 -- Added switch to enable <!--NOMIRROR--> editing and
+#		     foolproofed ark's patch a bit.
+#   janl 02/10/96 -- Added -umask switch.
+#		  -- Redirected documents did not have a meaningful referer
+#		     value (it was undefined).
+#		  -- Got w3mir into strict discipline, found some typos...
+#   janl 20/10/96 -- Mtime is preserved
+#   janl 21/10/96 -- -lc switch added.  Mtime preservation works better.
+#   janl 06/11/96 -- Treat 301 like 302.
+#   janl 02/12/96 -- Added config file code, fetch/ignore rules, apply
+#   janl 04/12/96 -- Better checking of config input.
+#   janl 06/12/96 -- Putting together the URL selection/editing brains.
+#   janl 07/12/96 -- Checking out some bugs.  Adding multiscope options.
+#   janl 12/12/96 -- Adding to and defeaturing the multiscope options.
+#   janl 13/12/96 -- Continuing work in multiscope stuff
+#                 -- Unreferenced file and empty directory removal works.
+#   janl 19/02/97 -- Can extract urls from adobe acrobat pdf files :-)
+#		     Important: It does _not_ edit urls, so they still
+#		     point at the original site(s).
+#   janl 21/02/97 -- Fix -lc bug related to case and the apply things.
+#		  -- only use SAVEURL if needed
+#   janl 11/03/97 -- Finish work on SAVEURL conditional.
+#		  -- Fixed directory removal code.
+#                 -- parse_args did not abort when unknown option/argument
+#		     was specified.
+#   janl 12/03/97 -- Made test case for -lc.  Didn't work.  Fixed it.  I think.
+#		     Realized we have bug w.r.t. hostname caseing.
+#   janl 13/03/97 -- All redirected to URLs within scope are now queued.  
+#		     That should make the mirror more complete, but it won't
+#		     help browsability when it comes to the redirected doc.
+#		  -- Moved robot retrival to the inside of the mirror loop
+#		     since we now possebly mirror several sites.
+#		  -- Changed 'fetch-options' to 'options'.
+#                 -- Added 'proxy-options'/-pflush to controll proxy server(s).
+#   janl 09/04/97 -- Started using URI::URL.
+#   janl 11/04/97 -- Debugging and using URI::URL more correctly various places
+#   janl 09/05/97 -- Added --agent switch
+#   janl 12/05/97 -- Simplified scope checks for root URL, changed URL 'apply'
+#		     processing.
+#		  -- Small output formating fix in the robot rules code.
+#		  -- Version is now 0.99
+#   janl 14/05/97 -- htmpop no-longer puts '<!DOCTYPE...' into doc, so check 
+#		     for '<HTML' instead
+#   janl 11/06/97 -- Made :port optional in server part of auth-domain.
+#			Always removing :80 from server part to match netloc.
+#   janl 22/07/97 -- More debugging of rewrite for new features -B, -I.
+#   janl 01/08/97 -- Fixed bug in RE quoting for Ignore/Fetch
+#   janl 04/08/97 -- s/writepage/write_page/g
+#   janl 07/09/97 -- 0.99b1 is released
+#   janl 19/09/97 -- Kaj Hejer discovers omissions in non-html-url-mining code.
+#                 -- 0.99b2 is released
+#   janl 24/09/97 -- Matt Chapman found bug in realm-name extraction.
+#   janl 10/10/97 -- Referer: header supression supressed User: header instead
+#		  -- Added fixup handling, writes .redirs and .referers
+#		     (no dot in win32)
+#  		  -- Read .w3mirc (w3mir.ini on win32) if present
+#		  -- Stop file removal code from removing these files
+#   janl 16/10/97 -- process_tag was mangling url attributes in tags with more
+#		     than one of them.  Problem found by Robert L. Binkley
+#   janl 04/12/97 -- Fixed problem with authentication, misplaced +
+#		  -- default inter-docuent pause is 0.  I figure it's better
+#		     to keep one httpd occupied in a steady stream than to
+#		     wait for it to die before we talk to it again.
+#   janl 13/12/97 -- The arguments to index.html in the form of index.html/foo
+#		     handling code was incomplete.  To make it complete would
+#		     have been hard, so it was removed.
+#		  -- If a URL changes from file to directory or vice versa
+#		     this is now handled.
+#   janl 11/01/98 -- PDF files with no URLs does not cause warnings now.
+#		  -- Close REFERERS and REDIRECTS before calling w3mfix
+#   janl 22/01/98 -- Proxy authentication as outlined by Christian Geuer
+#   janl 04/02/98 -- Version 1pre1
+#   janl 18/02/98 -- Fixed wild_re after tip by Prentiss Riddle.
+#		  -- Version 1pre2
+#   janl 20/02/98 -- w3http updated to handle complex content-types.
+#		  -- Fix wild_re more, bug noted by James Dumser
+#		  -- 1.0pre3
+#   janl 18/03/98 -- Version 1.0 is released
+#   janl 09/04/98 -- Added feature so user can disable newline conversion.
+#   janl 20/04/98 -- Only convert newlines in HTML files. -> 1.0.2
+#   janl 09/05/98 -- More carefull clean_disk code.
+#		  -- Check if the redirected URL was a root url, if so
+#		     issue a warning and exit.
+#   janl 12/05/98 -- use ->unix_path instead of ->as_string to derive local
+#		     filename.
+#   janl 25/05/98 -- -B didn't work too well.
+#   janl 09/07/98 -- Redirect to fragment broke us, less broken now -> 1.0.4
+#   janl 24/09/98 -- Better errormessages on errors -> 1.0.5
+#   janl 21/11/98 -- Fix errormessages better.
+#   janl 05/01/99 -- Drop 'Referer: (commandline)'
+#   janl 13/04/99 -- Add initial referer to root urls in batch mode.
+#
+# Variable name discipline:
+# - remote, umodified URL.  Variables prefixed 'rum_'
+# - local, filesystem.  Variables prefixed 'lf_'.
+# Use these prefixes so we know what we're working with at all times.
+# Also, URL objects are postfixed _o
+#
+# The apply rules and scope rules work this way:
+# - First apply the user rules to the remote url.
+# - Check if document is within scope after this.
+# - Then apply w3mir's rules to the result.  This results is the local,
+#   filesystem, name.
+#
+# We use features introduced in 5.002.
+require 5.002;
+
+# win32 and $nulldevice need to be globals, other modules use them.
+use vars qw($win32 $nulldevice);
+
+# To figure out what kind of system this is
+BEGIN {
+  use Config;
+  $win32 = ( $Config{'osname'} eq 'MSWin32' ); 
+}
+# More ways to die:
+use Carp;
+# Http module:
+use w3http;
+# html url extraction and manupulation:
+use htmlop;
+# Extract urls from adobe acrobat pdf files:
+use w3pdfuri;
+# Date computer:
+use HTTP::Date;
+# URLs:
+use URI::URL;
+# For flush method
+use FileHandle;
+
+# Full discipline:
+use strict;
+
+# Set params in the http package, HTTP protocol version:
+$w3http::version="1.0";
+
+# The defaults should be for a robotic http agent on good behaviour.
+my $debug=0;			# Debug level
+my $verbose=0;			# Verbosity level, -1 = quiet, 0 = normal, 1...
+my $pause=0;			# Pause between http requests
+my $retryPause=600;		# Pause between retries. 10 minutes.
+my $retry=3;			# Max 3 stabs pr. url.
+my $r=0;			# Recurse? no recursion = absolutify links
+my $remove=0;			# Remove files that are not there?
+my $s=0;			# 0: save on disk 1: stdout 2: just forget 'em
+my $useauth=0;			# Use authorization
+my %authdata;			# Authorization data
+my $check_robottxt = 1;		# Check robots.txt
+my $do_referer = 1;		# Send referers header
+my $do_user = 1;		# Send user header
+my $cache_header = '';		# The cache-control/pragma: no-cache header
+my $using_proxy = 0;		# Using proxy server or not?
+my $batch=0;			# Batch get URLs?
+my $read_urls=0;		# Get urls from STDIN?
+my $abs=0;			# Absolutify URLs?
+my $immediate_redir=0;		# Immediately follow a redirect?
+my @root_urls;			# This is where we start, the root documents
+my @root_dirs;			# The corresponding directories.  for remove
+my $chdirto='';			# Place to chdir to after reading config file
+my %nodelete=();		# Files that should not be deleted
+my $numarg=0;			# Number of arguments accepted.
+
+# Fixup related things
+my $fixrc='';			# Name of w3mfix config file
+my $fixup=1;			# Do things needed to run fixup
+my $runfix=0;			# Run w3mfix for user?
+my $fixopen=0;			# Fixup files open?
+
+my $indexname='index.html';
+
+my $VERSION;
+$VERSION='1.0.8';
+$w3http::agent = my $w3mir_agent = "w3mir/$VERSION-1999-05-28";
+my $iref='';			# Initial referer.  Must evaluate to false
+
+# Derived settings	
+my $mine_urls=0;		# Mine URLs from documents?
+my $process_urls=0;		# Perform (URL) processing of documents?
+
+# Queue of urls to get.
+my @rum_queue = ();
+my @urls = ();
+# URL status map.
+my %rum_urlstat = ();
+# Status codes:
+my $QUEUED   = 0;		# Queued but not gotten yet.
+my $TERROR   = 100;		# Transient error, retry later
+my $HLERR    = 101;		# Permanent error, give up
+my $GOTIT    = 200;		# Gotten. Note similarity to http result code
+my $NOTMOD   = 304;		# Not modified.
+# Negative codes for nonexistent files, easier to check.
+my $NEVERMIND= -1;		# Don't want it
+my $REDIR    = -302;		# Does not exist, redirected
+my $ENOTFND  = -404;		# Does not exist.
+my $OTHERERR = -600;		# Some other error happened
+my $FROBOTS  = -601;		# Forbidden by robots.txt rule
+
+# Directory/files survey:
+my %lf_file;		# What files are present in FS?  Disposition?  One of:
+my $FILEDEL=0;		# Delete file
+my $FILEHERE=1;		# File present in filesystem only
+my $FILETHERE=2;	# File present on server too.
+my %lf_dir;		# Number of files/dirs in dir.  If 0 dir is 
+			# eligible for deletion.
+
+my %fiddled=();		# If a file becomes a directory or a directory
+                        # becomes a file it is considered fiddled and
+                        # w3mir will not fiddle with it again in this
+                        # run.
+
+# Bitbucket device, very OS dependent.
+$nulldevice='/dev/null';
+$nulldevice='nul:' if ($win32);
+
+# What to get, and not.
+# Text of user supplied fetch/ignore rules
+my $rule_text=" # User defined fetch/ignore rules\n";
+# Code ref to the rule procedure
+my $rule_code;
+
+# Code to prefix and postfix the generated code.  Prefix should make
+# $_ contain the url to match.  Postfix should return 1, the default
+# is to get the url/file.
+my $rule_prefix='$rule_code = sub { local($_) = shift;'."\n";
+my $rule_postfix=" return 1;\n}";
+
+# Scope tests generated by URL/Also directives in cfg. The scope code
+# is just like the rule code, but used for program generated
+# fetch/ignore rules related to multiscope retrival.
+my $scope_fetch=" # Automatic fetch rules for multiscope retrival\n";
+my $scope_ignore=" # Automatic ignore rules for multiscope retrival\n";
+my $scope_code;
+
+my $scope_prefix='$scope_code = sub { local($_) = shift;'."\n";
+my $scope_postfix=" return 0;\n}";
+
+# Function to apply to urls, se rule comments.
+my $user_apply_code;	# User specified apply code
+my $apply_code;		# w3mirs apply code
+my $apply_prefix='$apply_code = sub { local($_) = @_;'."\n";
+my $apply_lc=' $_ = lc $_; ';
+my $apply_postfix='  return $_;'."\n}";
+my @user_apply;		# List of users apply rules.
+my @internal_apply;	# List of w3mirs apply rules.
+
+my $infoloss=0;		# 1 if any URL translations (which cause
+                        # information loss) are in effect.  If this is
+                        # true we use the SAVEURL operation.
+my $list;		# List url on STDOUT?
+my $edit;		# Edit doc? Remove <!--NOMIRROR>...<!--/NOMIRROR-->
+my $header;		# Text to insert in header
+my $lc=0;		# Convert urls/filenames to lowercase?
+my $fetch=0;		# What to fetch: -1: Some, 0: not modified 1: all
+my $convertnl=1;	# Convert newlines?
+
+# Non text/html formats we can extract urls from.  Function must take one
+# argument: the filename.
+my %knownformats = ( 'application/pdf', \&w3pdfuri::list,
+		     'application/x-pdf', \&w3pdfuri::list,
+		   );
+
+# Known 'magic numbers' of the known formats.  The value is used as
+# key in %knownformats.  the key part is a exact match for the
+# following <string> beginning at the first byte of the file.
+# This should probably be made more flexible, but not until we need it.
+
+my %knownmagic = ( '%PDF-', 'application/pdf' );
+
+my $iinline='';	# inline RE code to make RE caseinsensitive 
+my $ipost='';	# RE postfix to make it caseinsensitive
+
+usage() unless parse_args(@ARGV);
+
+{
+  my $w3mirc='.w3mirc';
+  
+  $w3mirc='w3mir.ini' if $win32;
+  
+  if (-f $w3mirc) {
+    parse_cfg_file($w3mirc);
+    $nodelete{$w3mirc}=1;
+  }
+}
+
+# Check arguments and options
+if ($#root_urls>=0) {
+  # OK
+} else {
+  print "URLs: $#rum_queue\n";
+  usage("No URLs given");
+}
+
+# Are we converting newlines today?
+$w3http::convert=0 unless $convertnl;
+
+if ($chdirto) {
+  &mkdir($chdirto.'/this-is-not-created-odd-or-what');
+  chdir($chdirto) || 
+    die "w3mir: Can't change working directory to '$chdirto': $!\n";
+}
+
+$SIG{'INT'}=sub { print STDERR "\nCaught SIGINT!\n"; exit 1; };
+$SIG{'QUIT'}=sub { print STDERR "\nCaught SIGQUIT!\n"; exit 1; };
+$SIG{'HUP'}=sub { print STDERR "\nCaught SIGHUP!\n"; exit 1; };
+
+&open_fixup if $fixup;
+
+# Derive how much document processing we should do.
+$mine_urls=( $r || $list );
+$process_urls=(!$batch && !$edit && !$header);
+# $abs can be set explicitly with -abs, and implicitly if not recursing
+$abs = 1 unless $r;
+print "Absolute references\n" if $abs && $debug;
+
+# Cache_controll specified but proxy not in use?
+die "w3mir: If you want to control a cache, use a proxy server!\n"
+  if ($cache_header && !$using_proxy);
+
+# Compile the second order code
+
+# - The rum scope tests
+my $full_rules=$scope_prefix.$scope_fetch.$scope_ignore.$scope_postfix;
+# warn "Scope rules:\n-------------\n$full_rules\n---------------\n";
+eval $full_rules;
+
+die "w3mir: Program generated rules did not compile.\nPlease report to w3mir-core\@usit.uio.no.  The code is:\n----\n".
+  $full_rules."\n----\n"
+  if !defined($scope_code);
+
+$full_rules=$rule_prefix.$rule_text.$rule_postfix;
+# warn "Fetch rules:\n-------------\n$full_rules\n---------------\n";
+eval $full_rules;
+
+# - The user specified rum tests
+die "w3mir: Ignore/Fetch rules did not compile.\nPlease report to w3mir-core\@usit.uio.no.  The code is:\n----\n".
+  $full_rules."\n----\n"
+  if !defined($rule_code);
+
+# - The user specified apply rules
+
+my $full_apply=$apply_prefix.($lc?$apply_lc:'').
+  join($ipost.";\n",@user_apply).(($#user_apply>=0)?$ipost:"").";\n".
+  $apply_postfix;
+eval $full_apply;
+
+die "w3mir: User apply rules did not compile.\nPlease report to w3mir-core\@usit.uio.no. The code is:
+----
+".$full_apply."
+----\n" if !defined($apply_code);
+
+$user_apply_code=$apply_code;
+
+# - The w3mir generated apply rules
+
+$full_apply=$apply_prefix.($lc?$apply_lc:'').
+  join($ipost.";\n",@internal_apply).(($#internal_apply>=0)?$ipost:"").";\n".
+  $apply_postfix;
+eval $full_apply;
+
+die "Internal apply rules did not compile.  The code is:
+----
+".$full_apply."
+----\n" if !defined($apply_code);
+
+# - Information loss via -lc?  There are other sources as well.
+$infoloss=1 if $lc;
+
+warn "Infoloss is $infoloss\n" if $debug;
+
+# More setup:
+
+$w3http::debug=$debug;
+
+$w3http::verbose=$verbose;
+
+my %rum_referers=();	# Array of referers, key: rum_url
+my $Robot_Blob;		# WWW::RobotsRules object, decides if rum_url is 
+			# forbidden to access for us.
+my $rum_url_o;		# rum url, mostly the current, the one we're getting
+my %gotrobots;		# Did I get robots.txt from site? key: url->netloc
+my($authuser,$authpass);# Username and password for authentication with server
+my @rum_newurls;	# List of rum_urls in document
+
+if ($check_robottxt) {
+  # Eval is only way to defer loading of module until we know it's needed?
+  eval 'use WWW::RobotRules;';
+
+  die "Could not load WWW::RobotRules, try -drr switch\n"
+    unless defined(&WWW::RobotRules::parse);
+
+  $Robot_Blob = new WWW::RobotRules $w3mir_agent;
+}
+
+# We have several main-modes of operation.  Here we select one
+if ($r) {
+
+  die "w3mir: No URLs?  Try 'w3mir -h' for help.\n"
+    if $#root_urls==-1;
+
+  warn "Recursive retrival comencing\n" if $debug;
+
+  die "w3mir: Sorry, you cannot combine -r/recurse with -I/read_urls\n"
+    if $read_urls;
+
+  # Recursive
+  my $url;
+  foreach $url (@root_urls) {
+    warn "Root url dequeued: $url\n" if $debug;
+    if (want_this($url)) {
+      queue($url);
+      &add_referer($url,$iref);
+    } else {
+      die "w3mir: Inconsistent configuration: Specified $url is not inside retrival scope\n";
+    }
+  }
+  mirror();
+
+} else {
+  if ($batch) {
+    warn "Batch retrival commencing\n" if $debug;
+    # Batch get
+    if ($read_urls) { 
+      # Get URLs from <STDIN>
+      while (<STDIN>) {
+	chomp;
+	&add_referer($_,$iref);
+	batch_get($_);
+      }
+    } else {
+      # Get URLs from commandline
+      my $url;
+      foreach $url (@root_urls) {
+	&add_referer($url,$iref);
+      }
+      foreach $url (@root_urls) {
+	batch_get($url);
+      }
+    }
+  } else {
+    warn "Single url retrival commencing\n" if $debug;
+
+    # A single URL, with all processing on
+    die "w3mir: You specified several URLs and not -B/batch\n"
+      if $#root_urls>0;
+    queue($root_urls[0]);
+    &add_referer($root_urls[0],$iref);
+    mirror();
+  }
+}
+
+&close_fixup if $fixup;
+
+# This should clean up files:
+&clean_disk if $remove;
+
+warn "w3mir: That's all (".$w3http::xfbytes.'+',$w3http::headbytes.
+  " bytes of it).\n" unless $verbose<0;
+
+if ($runfix) {
+  eval 'use Config;';
+  warn "Running w3mfix\n";
+  if ($win32) {
+    system($Config{'perlpath'}." w3mfix $fixrc");
+  } else {
+    system("w3mfix $fixrc");
+  }
+}
+
+exit 0;
+
+sub get_document {
+  # Get one document by HTTP ($1/rum_url_o).  Save in given filename ($2).
+  # Possebly returning references found in the document.  Caller must
+  # set up referer array, check wantedness and everything else.  We
+  # handle authentication here though.
+
+  my($rum_url_o)=shift;
+  my($lf_url)=shift;
+  croak("\$rum_url_o is empty") if !defined($rum_url_o) || !$rum_url_o;
+  croak("$lf_url is empty") if !defined($lf_url) || !$lf_url;
+
+  # Make sure it's an object
+  $rum_url_o = url $rum_url_o 
+    unless ref $rum_url_o;
+  
+  # Derive a filename from the url, the filename contains no URL-quoting
+  my($lf_name) = (url "file:$lf_url")->unix_path;
+
+  # Make all intermediate directories
+  &mkdir($lf_name) if $s==0;
+
+  my($rum_as_string) = $rum_url_o->as_string;
+
+  print STDERR "GET_DOCUMENT: '",$rum_as_string,"' -> '",$lf_name,"'\n"
+    if $debug;
+
+  my $hostport;
+  my $www_auth='';	# Value of that http reply header
+  my $page_ref;
+  my @rum_newurls;	# List of URLs extracted
+  my $url_extractor;
+  my $do_query;		# Do query or not?
+
+  if (defined($rum_urlstat{$rum_as_string}) && 
+      $rum_urlstat{$rum_as_string}>0) {
+    warn "w3mir: Internal error, ".$rum_as_string.
+      " queued several times\n";
+    next;
+  }
+
+  # Goto here if we want to retry b/c of authentication
+  try_again:
+
+  # Start building the extra http::query arguments again
+  my @EXTRASTUFF=();
+
+  # We'll start by assuming that we're doing the query.
+  $do_query=1;
+    
+  # If we're not checking the timestamp, or the file does not exist
+  # then we get the file unconditionally.  Otherwise we only want it
+  # if it's updated.
+
+  if ($fetch==1) {
+    # Nothing do do?
+  } else {
+    if (-f $lf_name) {
+      if ($fetch==-1) {
+	print STDERR "w3mir: ".($infoloss?$rum_as_string:$lf_name).
+	  ", already have it" if $verbose>=0;
+	if (!$mine_urls) {
+	  # If -fs and the file exists and we don't need to mine URLs
+	  # we're finished!
+	  warn "Already have it, no mining, returning!\n" if $debug;
+	  print STDERR "\n" if $verbose>=0;
+	  return;
+	}
+	$w3http::result=1304;	# Pretend it was 'not modified'
+	$do_query=0;
+      } else {
+	push(@EXTRASTUFF,$w3http::IFMODF,$lf_name);
+      }
+    }
+  }
+
+  if ($do_query) {
+
+    # Does the server want authorization for this file?  $www_auth is
+    # only set if authentication was requested the first time around.
+
+    # For testing:
+    # $www_auth='Basic realm="foo"';
+
+    if ($www_auth) {
+      my($authdata,$method,$realm);
+
+      ($method,$realm)= $www_auth =~ m/^(\S+)\s+realm=\"([^\"]+)\"/i;
+      $method=lc $method;
+      $realm=lc $realm;
+      die "w3mir: '$method' authentication needed, don't know that.\n"
+	if ($method ne 'basic');
+      
+      $hostport = $rum_url_o->netloc;
+      $authdata=$authdata{$hostport}{$realm} || $authdata{$hostport}{'*'} ||
+	$authdata{'*'}{$realm} || $authdata{'*'}{'*'};
+
+      if ($authdata) {
+	push(@EXTRASTUFF,$w3http::AUTHORIZ,$authdata);
+      } else {
+	print STDERR "w3mir: No authorization data for $hostport/$realm\n";
+	$rum_urlstat{$rum_as_string}=$NEVERMIND;
+	next;
+      }
+    }
+    
+    push(@EXTRASTUFF,$w3http::FREEHEAD,$cache_header)
+      if ($cache_header);
+
+    # Insert referer header data if at all
+    push(@EXTRASTUFF,$w3http::REFERER,$rum_referers{$rum_as_string}[0])
+      if ($do_referer && exists($rum_referers{$rum_as_string}));
+
+    push(@EXTRASTUFF,$w3http::NOUSER)
+      unless ($do_user);
+
+    # YES, $lf_url is right, w3http::query handles this like an url so
+    # the quoting must all be in place.
+    my $binfile=$lf_url;
+    $binfile='-' if $s==1;
+    $binfile=$nulldevice if $s==2;
+
+    if ($pause) {
+      print STDERR "w3mir: sleeping\n" if $verbose>0;
+      sleep($pause);
+    }
+
+    print STDERR "w3mir: ".($infoloss?$rum_as_string:$lf_name) 
+      unless $verbose<0;
+    print STDERR "\nFile: $lf_name\n" if $debug;
+
+    &w3http::query($w3http::GETURL,$rum_as_string,
+		   $w3http::SAVEBIN,$binfile,
+		   @EXTRASTUFF);
+
+    print STDERR "w3http::result: '",$w3http::result,
+    "' doc size: ", length($w3http::document),
+    " doc type: -",$w3http::headval{'CONTENT-TYPE'},
+    "- plaintexthtml: ",$w3http::plaintexthtml,"\n"
+      if $debug;
+
+    print "Result: ",$w3http::result," Recurse: $r, html: ",
+    $w3http::plaintexthtml,"\n" 
+      if $debug;
+
+  } # if $do_query
+    
+  if ($w3http::result==200) { # 200 OK 
+    $rum_urlstat{$rum_as_string}=$GOTIT;
+
+    if ($mine_urls || $process_urls) {
+
+      if ($w3http::plaintexthtml) {
+	# Only do URL manipulations if this is a html document with no
+	# special content-encoding.  We do not handle encodings, yet.
+
+	my $page;
+
+	print STDERR ($process_urls)?", processing":", url mining"
+	  if $verbose>0;
+	  
+	print STDERR "\nurl:'$lf_url'\n" 
+	  if $debug;
+
+	print "\nMining URLs: $mine_urls, Process: $process_urls\n" 
+	  if $debug;
+	    
+	($page,@rum_newurls) = 
+	  &htmlop::process($w3http::document,
+			   # Only get a new document if wanted
+			   $process_urls?():($htmlop::NODOC),
+			   $htmlop::CANON,
+			   $htmlop::ABS,$rum_url_o,
+			   # Only list urls if wanted
+			   $mine_urls?($htmlop::LIST):(),
+
+			   # If user wants absolute URLs do not
+			   # relativize them
+
+			   $abs?
+			   ():
+			   (
+			    $htmlop::TAGCALLBACK,\&process_tag,$lf_url,
+			    )
+			  );
+
+#	print "URL: ",join("\nURL: ",@rum_newurls),"\n";
+
+	if ($process_urls) {
+	  $page_ref=\$page;
+	  $w3http::document='';
+	} else {
+	  $page_ref=\$w3http::document;
+	}
+
+      } elsif ($s == 0 &&
+	       ($url_extractor = 
+		$knownformats{$w3http::headval{'CONTENT-TYPE'}})) {
+
+	# The knownformats extractors only work on disk files so write
+	# doc to disk if not there already (non-html text will not be)
+	write_page($lf_name,$w3http::document,1);
+
+	# Now we try our hand at fetching URIs from non-html files.
+	print STDERR ", mining URLs" if $verbose>=1;
+	@rum_newurls = &$url_extractor($lf_name);
+	# warn "URLs from PDF: ",join(', ',@rum_newurls),"\n";
+      }
+      
+      
+    } # if ($mine_urls || $process_urls)
+
+#    print "page_ref defined: ",defined($page_ref),"\n";
+#    print "plaintext: ",$w3http::plaintext,"\n";
+
+    $page_ref=\$w3http::document 
+      if !defined($page_ref) && $w3http::plaintexthtml;
+
+    if ($w3http::plaintexthtml) {
+      # ark: this is where I want to do my changes to the page strip
+      # out the <!--NOMIRROR-->...<!--/NOMIRROR--> Stuff.
+      $$page_ref=~ s/<(!--)?\s*NO\s*MIRROR\s*(--)?>[^\000]*?<(!--)?\s*\/NO\s*MIRROR\s*(--)?>//g 
+	if $edit;
+	  
+      if ($header) {
+	# ark: insert a header string at the start of the page
+	my $mirrorstr=$header;
+	$mirrorstr =~ s/\$url/$rum_as_string/g;
+	insert_at_start( $mirrorstr, $page_ref );
+      }
+    }
+
+    write_page($lf_name,$page_ref,0);
+
+    # print "New urls: ",join("\n",@rum_newurls),"\n";
+
+    return @rum_newurls;
+  }
+
+  if ($w3http::result==304 || #  304 Not modified
+      $w3http::result==1304) { # 1304 Have it
+
+    { 
+      # last = out of nesting
+
+      my $rum_urlstat;
+      my $rum_newurls;
+      
+      @rum_newurls=();
+      
+      print STDERR ", not modified"
+	if $verbose>=0 && $w3http::result==304;
+      
+      $rum_urlstat{$rum_as_string}=$NOTMOD;
+
+      last unless $mine_urls;
+      
+      $rum_newurls=get_references($lf_name);
+
+      # print "New urls: ",ref($rum_newurls),"\n";
+      
+      if (!ref($rum_newurls)) {
+	last;
+      } elsif (ref($rum_newurls) eq 'SCALAR') {
+	$page_ref=$rum_newurls;
+      } elsif (ref($rum_newurls) eq 'ARRAY') {
+	@rum_newurls=@$rum_newurls;
+	last;
+      } else {
+	die "\nw3mir: internal error: Unknown return type from get_references\n";
+      }
+      
+      # Check if it's a html file.  I know this tag is in all html
+      # files, because I put it there as I pull them in.
+      last unless $$page_ref =~ /<HTML/i;
+      
+      warn "$lf_name is a html file\n" if $debug;
+      
+      # It's a html document
+      print STDERR ", mining URLs" if $verbose>=1;
+      
+      # This will give us a list of absolute urls
+      (undef,@rum_newurls) = 
+	&htmlop::process($$page_ref,$htmlop::NODOC,
+			 $htmlop::ABS,$rum_as_string,
+			 $htmlop::USESAVED,'W3MIR',
+			 $htmlop::LIST);
+    }
+
+    print STDERR "\n" if $verbose>=0;
+    return @rum_newurls;
+  }
+	
+  if ($w3http::result==302 || $w3http::result==301) { # Redirect
+    # Cern and NCSA httpd sends 302 'redirect' if a ending / is
+    # forgotten on a url.  More recent httpds send 301 'permanent
+    # redirect' in this case.  Here we check if the difference in URLs
+    # is just a / and if so push the url again with the / added.  This
+    # code only works if the http server has the right idea about its
+    # own name.
+    #
+    # 18/3/97: Added code to queue redirected-to-URLs that are within
+    # the scope of the retrival.
+    my $new_rum_url;
+
+    $rum_urlstat{$rum_as_string}=$REDIR;
+
+    # Absolutify the new url, it might be relative to the requested
+    # document.  That's a ugly wart on some servers/admins.
+    $new_rum_url=url $w3http::headval{'location'};
+    $new_rum_url=$new_rum_url->abs($rum_url_o);
+
+    print REDIRS $rum_as_string,' -> ',$new_rum_url->as_string,"\n"
+      if $fixup;
+
+    if ($immediate_redir) {
+      print STDERR " =>> ",$new_rum_url->as_string,", getting that instead\n";
+      return get_document($new_rum_url,$lf_url);
+    }
+
+    # Some redirect to a fragment of another doc...
+    $new_rum_url->frag(undef);
+    $new_rum_url=$new_rum_url->as_string;
+
+    if ($rum_as_string.'/' eq $new_rum_url) {
+      if (grep { $rum_as_string eq $_; } @root_urls) {
+	print STDERR "\nw3mir: missing / in a start URL detected.  Please fix commandline/config file.\n";
+	exit(1);
+      }
+      print STDERR ", missing /\n";
+      queue($new_rum_url);
+      # Initialize referer to something meaningful
+      $rum_referers{$new_rum_url}=$rum_referers{$rum_as_string};
+    } else {
+      print STDERR " =>> $new_rum_url";
+      if (want_this($new_rum_url)) {
+	print STDERR ", getting that\n";
+	queue($new_rum_url);
+	$rum_referers{$new_rum_url}=$rum_referers{$rum_as_string};
+      } else {
+	print STDERR ", don't want it\n";
+      }
+    }
+    return ();
+  }
+
+  if ($w3http::result==403 || # Forbidden
+      $w3http::result==404 || # Not found
+      $w3http::result==406 || # Not Acceptable, hmm, belongs here?
+      $w3http::result==410) { # Gone - no forwarding address known
+
+    $rum_urlstat{$rum_as_string}=$ENOTFND;
+    &handleerror;
+    print STDERR "Was refered from: ",
+      join(',',@{$rum_referers{$rum_as_string}}),
+      "\n" if defined(@{$rum_referers{$rum_as_string}});
+    return ();
+  }
+
+  if ($w3http::result==407) {
+    # Proxy authentication requested
+    die "Proxy server requests authentication but failed to return the\n".
+      "REQUIRED Proxy-Authenticate header for this condition\n"
+	unless exists($w3http::headval{'proxy-authenticate'});
+
+    die "Proxy authentication is required for ".$w3http::headval{'proxy-authenticate'}."\n";
+  }
+
+  if ($w3http::result==401) {
+    # A www-authenticate reply header should acompany a 401 message.
+    if (!exists($w3http::headval{'www-authenticate'})) {
+      warn "w3mir: Server indicated authentication failure but gave no www-authenticate reply\n";
+      $rum_urlstat{$rum_as_string}=$NEVERMIND;
+    } else {
+      # Unauthorized
+      if ($www_auth) {
+	# Failed when authorization data was supplied.
+	$rum_urlstat{$rum_as_string}=$NEVERMIND;
+	print STDERR ", authorization failed data needed for ",
+	$w3http::headval{'www-authenticate'},"\n"
+	  if ($verbose>=0);
+      } else {
+	if ($useauth) {
+	  # First time failure, send back and retry at once with some known
+	  # user/passwd.
+	  $www_auth=$w3http::headval{'www-authenticate'};
+	  print STDERR ", retrying with authorization\n" unless $verbose<0;
+	  goto try_again;
+	} else {
+	  print ", authorization needed: ",
+	    $w3http::headval{'www-authenticate'},"\n";
+	  $rum_urlstat{$rum_as_string}=$NEVERMIND;
+	}
+      }
+    }
+    return ();
+  }
+   
+  # Something else.  
+  &handleerror;
+}
+
+
+sub robot_check {
+  # Check if URL is allowed by robots.txt, if we respect it at all
+  # that is.  Return 1 it allowed, 0 otherwise.
+
+  my($rum_url_o)=shift;
+  my $hostport;
+
+  if ($check_robottxt) {
+    
+    $hostport = $rum_url_o->netloc;
+    if (!exists($gotrobots{$hostport})) {
+      # Get robots.txt from the server
+      $gotrobots{$hostport}=1;
+      my $robourl="http://$hostport/robots.txt";
+      print STDERR "w3mir: $robourl" if ($verbose>=0);
+      &w3http::query($w3http::GETURL,$robourl);
+      $w3http::document='' if ($w3http::result != 200);
+      print STDERR ", processing" if $verbose>=1;
+      print STDERR "\n" if ($verbose>=0);
+      $Robot_Blob->parse($robourl,$w3http::document);
+    }
+
+    if (!$Robot_Blob->allowed($rum_url_o->as_string)) {
+      # It is forbidden
+      $rum_urlstat{$rum_url_o->as_string}=$FROBOTS;
+      warn "w3mir: ",$rum_url_o->as_string,": forbidden by robots.txt\n";
+      return 0;
+    }
+  }
+  return 1;
+}
+
+
+
+sub batch_get {
+  # Batch get _one_ document.
+  my $rum_url=shift;
+  my $lf_url;
+
+  $rum_url_o = url $rum_url;
+
+  return unless robot_check($rum_url_o);
+
+  ($lf_url=$rum_url) =~ s~.*/~~;
+  if (!defined($lf_url) || $lf_url eq '') {
+    ($lf_url=$rum_url) =~ s~/$~~;
+    $lf_url =~ s~.*/~~;
+    $lf_url .= "-$indexname";
+  }
+
+  warn "Batch get: $rum_url -> $lf_url\n" if $debug;
+
+  $immediate_redir=1; # Do follow redirects immediately
+
+  get_document($rum_url,$lf_url);
+}
+
+
+
+sub mirror {
+  # Mirror (or get) the requested url(s). Possibly recursively.
+  # Working from whatever cwd is at invocation we'll retrieve all
+  # files under it in the file hierarchy.
+  
+  my $rum_url;	# URL of the document we're getting now, defined at main level
+  my $lf_url;	# rum_url after apply - and 
+  my $new_lf_url;
+  my @new_rum_urls;
+  my $rum_ref;
+  
+  while (defined($rum_url = pop(@rum_queue))) {
+
+    warn "mirror: Poped $rum_url from queue\n" if $debug;
+
+    # Unwanted URLs should not be queued
+    die "Found url $rum_url that I don't want in queue!\n" 
+      unless defined($lf_url=apply($rum_url));
+
+    $rum_url_o = url $rum_url;
+
+    next unless robot_check($rum_url_o);
+
+    # Figure out the filename for our local filesystem.
+    $lf_url.=$indexname if $lf_url =~ m~/$~ || $lf_url eq '';
+
+    @new_rum_urls = get_document($rum_url_o,$lf_url);
+
+    print join("\n",@new_rum_urls),"\n" if ($list);
+
+    if ($r) {
+      foreach $rum_ref (@new_rum_urls) {
+	# warn "Recursive url: $rum_ref\n";
+	$new_lf_url=apply($rum_ref);
+	next unless $new_lf_url;
+
+	# warn "Want it\n";
+	$rum_ref =~ s/\#.*$//s;		# Clip off section marks
+	
+	add_referer($rum_ref,$rum_url_o->as_string);
+	queue($rum_ref);
+      }
+    }
+
+    @new_rum_urls=();
+
+    # Is the URL queue empty? Are there outstanding retries?  Refill
+    # the queue from the retry list.
+    if ($#rum_queue<0 && $retry-->0) {
+      foreach $rum_url_o (keys %rum_urlstat) {
+	$rum_url_o = url $rum_url_o;
+	if ($rum_urlstat{$rum_url_o->as_string}==100) {
+	  push(@rum_queue,$rum_url_o->as_string);
+	  $rum_urlstat{$rum_url_o->as_string}=0;
+	}
+      }
+      if ($#rum_queue>=0) {
+	warn "w3mir: Sleeping before retrying.  $retry more times left\n"
+	  if $verbose>=0;
+	sleep($retryPause);
+      }
+    }
+
+  }
+}
+
+
+sub get_references {
+  # Get references from a non-html-on-disk file.  Return references if
+  # we know how to find them.  Return reference do the complete page
+  # if it's html.  Return single numerical 0 if unknown format.
+
+  my($lf_url)=shift;
+  my($urlextractor)=shift;
+
+  my $read; # Buffer of stuff read from file to check filetype
+  my $magic;
+  my $url_extractor;
+  my $rum_ref;
+  my $page;
+
+  warn "w3mir: Looking at local $lf_url\n" if $debug;
+	
+  # Open file and read the first 10kilobytes for file-type-test
+  # purposes.
+  if (!open(TMPF,$lf_url)) {
+    warn "Unable to open $lf_url for reading: $!\n";
+    last;
+  }
+	
+  $page=' 'x10240;
+  $read=sysread(TMPF,$page,length($page),0);
+  close(TMPF);
+	
+  die "Error reading $lf_url: $!\n" if (!defined($read));
+
+  if (!defined($url_extractor)) {
+    $url_extractor=0;
+
+    # Check file against list of magic numbers.
+    foreach $magic (keys %knownmagic) {
+      if (substr($page,0,length($magic)) eq $magic) {
+	$url_extractor = $knownformats{$knownmagic{$magic}};
+	last;
+      }
+    }
+  }
+
+  # Found a extraction method, apply.
+  if ($url_extractor) {
+    print STDERR ", mining URLs" if $verbose>=1;
+    return [&$url_extractor($lf_url)];
+  }
+
+  if ($page =~ /<HTML/i) {
+    open(TMPF,$lf_url) || 
+      die "Could not open $lf_url for reading: $!\n";
+    # read the whole file.
+    local($/)=undef;
+    $page = <TMPF>;
+    close(TMPF);
+    return \$page;
+  }
+
+  return 0;
+}
+
+
+sub open_fixup {
+  # Open the referers and redirects files
+
+  my $reffile='.referers';
+  my $redirfile='.redirs';
+
+  if ($win32) {
+    $reffile="referers";
+    $redirfile="redirs";
+  }
+
+  $nodelete{$reffile} = $nodelete{$redirfile} = 1;
+
+  open(REDIRS,"> $redirfile") || 
+    die "Could not open $redirfile for writing: $!\n";
+
+  autoflush REDIRS 1;
+
+  open(REFERERS,"> $reffile") ||
+    die "Could not open $reffile for writing: $!\n";
+
+  $fixopen=1;
+  eval 'END { close_fixup; 0; }';
+}
+
+
+sub close_fixup {
+  # Close the fixup data files.  In the case of the referer file also
+  # write the entire content
+
+  return unless $fixopen;
+
+  my $referer;
+
+  foreach $referer (keys %rum_referers) {
+    print REFERERS $referer," <- ",join(' ',@{$rum_referers{$referer}}),"\n";
+  }
+
+  close(REFERERS) || warn "Error closing referers file: $!\n";
+  close(REDIRS) || warn "Error closing redirects file: $!\n";
+  $fixopen=0;
+}
+
+
+sub clean_disk {
+  # This procedure removes files that are not present on the server(s)
+  # anymore.
+  
+  # - To avoid removing files that were not fetched due to network
+  #   problems we only do blanket removal IFF all documents were
+  #   fetched w/o problems, eventually.  
+  # - In any case we can remove files the server said were not found
+
+  # The strategy has three main parts:
+  # 1. Find all files we have
+  # 2. Find what files we ought to have
+  # 3. Remove the difference
+  
+  my $complete_retrival=1;	# Flag saying IFF all documents were fetched
+  my $urlstat;			# Tmp storage
+  my $rum_url;
+  my $lf_url;
+  my $lf_dir;
+  my $dirs_to_remove;
+
+  # For fileremoval code
+  eval "use File::Find;" unless defined(&find);
+
+  die "w3mir: Could not load File::Find module.  Don't use -R switch.\n"
+    unless defined(&find);
+  
+  # This to shut up -w
+  $lf_dir=$File::Find::dir;
+
+  # ***** 1. Find out what files we have *****
+  #
+  # This does two things:  For each file or directory found:
+  # - Increases entry count for the container directory
+  # - If it's a file: $lf_file{relative_path}=$FILEHERE;
+
+  chop(@root_dirs);
+  print STDERR "Looking in: ",join(", ",@root_dirs),"\n" if $debug;
+
+  find(\&find_files,@root_dirs);
+
+  # ***** 2. Find out what files we ought to have *****
+  #
+  # First we loop over %rum_urlstat to determine what files are not
+  # present on the server(s).
+  foreach $rum_url (keys %rum_urlstat) {
+    # Figure out name of local file from rum_url
+    next unless defined($lf_url=apply($rum_url));
+
+    $lf_url.=$indexname if $lf_url =~ m~/$~ || $lf_url eq '';
+
+    # find prefixes ./, we must too.
+    $lf_url="./".$lf_url unless substr($lf_url,0,1) eq '/';
+
+    # Ignore if file does not exist here.
+    next unless exists($lf_file{$lf_url});
+    
+    # The apply rules can map several remote files to same local
+    # file.  If we decided to keep file already we stay with that.
+    next if $lf_file{$lf_url}==$FILETHERE;
+    
+    $urlstat=$rum_urlstat{$rum_url};
+
+    # Figure out the status code.
+    if ($urlstat==$GOTIT || $urlstat==$NOTMOD) {
+      # Present on server.  Keep.
+      $lf_file{$lf_url}=$FILETHERE;
+      next;
+    } elsif ($urlstat==$ENOTFND || $urlstat==$NEVERMIND ) {
+      # One of: not on server, can't get, don't want, access forbiden:
+      # Schedule for removal.
+      $lf_file{$lf_url}=$FILEDEL if exists($lf_file{$lf_url});
+      next;
+    } elsif ($urlstat==$OTHERERR || $urlstat==$TERROR) {
+      # Some error occured transfering.
+      $complete_retrival=0;	# The retrival was not complete. Delete less
+    } elsif ($urlstat==$QUEUED) {
+      warn "w3mir: Internal inconsistency, $rum_url marked as queued after retrival terminated\n";
+      $complete_retrival=0;	# Fishy. Be conservative about removing
+    } else {
+      $complete_retrival=0;
+      warn "w3mir: Warning: $rum_url is marked as $urlstat.\n".
+	"w3mir: Please report to w3mir-core\@usit.uio.no.\n";
+    }
+  }				# foreach %rum_urlstat
+
+  # ***** 3. Remove the difference *****
+
+  # Loop over all found files:
+  # - Should we have this file?
+  # - If not: Remove file and decrease directory entry count
+  # Loop as long as there are directories with 0 entry count:
+  # - Loop over all directories with 0 entry count:
+  #   - Remove directory
+  #   - Decrease entry count of parent
+  
+  warn "w3mir: Some error occured, conservative file removal\n"
+    if !$complete_retrival && $verbose>=0;
+
+  # Remove all files we don't want removed from list of files present:
+  foreach $lf_url (keys %nodelete) {
+    print STDERR "Not deleting: $lf_url\n" if $verbose>=1;
+    delete $lf_file{$lf_url} || delete $lf_file{'./'.$lf_url};
+  }
+  
+  # Remove files
+  foreach $lf_url (keys %lf_file) {
+    if (($complete_retrival && $lf_file{$lf_url}==$FILEHERE) ||
+	($lf_file{$lf_url} == $FILEDEL)) {
+      if (unlink $lf_url) {
+	($lf_dir)= $lf_url =~ m~^(.+)/~;
+	$lf_dir{$lf_dir}--;
+	$dirs_to_remove=1 if ($lf_dir{$lf_dir}==0);
+	warn "w3mir: removed file $lf_url\n" if $verbose>=0;
+      } else {
+	warn "w3mir: removal of file $lf_url failed: $!\n";
+      }
+    }
+  }
+  
+  # Remove empty directories
+  while ($dirs_to_remove) {
+    $dirs_to_remove=0;
+    foreach $lf_url (keys %lf_dir) {
+      next if $lf_url eq '.';
+      if ($lf_dir{$lf_url}==0) {
+	if (rmdir($lf_url)) {
+	  warn "w3mir: removed directory $lf_dir\n" if $verbose>=0;
+	  delete $lf_dir{$lf_url};
+	  ($lf_dir)= $lf_url =~ m~^(.+)/~;
+	  $lf_dir{$lf_dir}--;
+	  $dirs_to_remove=1 if ($lf_dir{$lf_dir}==0);
+	} else {
+	  warn "w3mir: removal of directory $lf_dir failed: $!\n";
+	}
+      }
+    }
+  }
+}
+
+
+sub find_files {
+  # This is called by the find procedure for every file/dir found.
+  
+  # This builds two hashes:
+  # lf_file{<file>}: 1: file exists
+  # lf_dir{<dir>): Number of files in directory.
+  
+  lstat($_);
+
+  $lf_dir{$File::Find::dir}++;
+
+  if (-f _) {
+    $lf_file{$File::Find::name}=$FILEHERE;
+  } elsif (-d _) {
+    # null
+    # Bug: If an empty directory exists it will not be removed
+  } else {
+    warn "w3mir: File $File::Find::name has unknown type.  Ignoring.\n";
+  }
+  return 0;
+  
+}
+
+
+sub handleerror {
+  # Handle error status of last http connection, will set the rum_urlstat
+  # appropriately and print a error message.
+
+  my $msg;
+  
+  if ($verbose<0) {
+    $msg="w3mir: ".$rum_url_o->as_string.": ";
+  } else {
+    $msg=": ";
+  }
+
+  if ($w3http::result == 98) {
+    # OS/Network error
+    $msg .= "$!";
+    $rum_urlstat{$rum_url_o->as_string}=$OTHERERR;
+  } elsif ($w3http::result == 100) {
+    # Some kind of error connecting or sending request
+    $msg .= $w3http::restext || "Timeout";
+    $rum_urlstat{$rum_url_o->as_string}=$TERROR;
+  } else {
+    # Other HTTP error
+    $rum_urlstat{$rum_url_o->as_string}=$OTHERERR;
+    $msg .= " ".$w3http::result." ".$w3http::restext;
+    $msg .= " =>> ".$w3http::headval{'location'}
+    if (defined($w3http::headval{'location'}));
+  }
+  print STDERR "$msg\n";
+}
+
+
+sub queue {
+  # Queue given url if appropriate and create a status entry for it
+  my($rum_url_o)=url $_[0];
+
+  croak("BUG: undefined \$rum_url_o")
+    if !defined($rum_url_o);
+
+  croak("BUG: undefined \$rum_url_o->as_string")
+    if !defined($rum_url_o->as_string);
+
+  croak("BUG: ".$rum_url_o->as_string." (fragnent) queued")
+    if $rum_url_o->as_string =~ /\#/;
+  
+  return if exists($rum_urlstat{$rum_url_o->as_string});
+  return unless want_this($rum_url_o->as_string);
+
+  warn "QUEUED: ",$rum_url_o->as_string,"\n" if $debug;
+  
+  # Note lack of scope checks.
+  $rum_urlstat{$rum_url_o->as_string}=$QUEUED;
+  push(@rum_queue,$rum_url_o->as_string);
+}
+
+
+sub root_queue {
+  # Queue function for root urls and directories.  One or the other might
+  # be boolean false, in that case, don't queue it.
+
+  my $root_url_o;
+
+  my($root_url)=shift;
+  my($root_dir)=shift;
+
+  die "w3mir: No fragments in start URLs :".$root_url."\n"
+    if $root_url =~ /\#/;
+
+  if ($root_dir) {
+    print "Root dir: $root_dir\n" if $debug;
+    $root_dir="./$root_dir" unless substr($root_dir,0,1) eq '/' or
+      substr($root_dir,0,2) eq './';
+    push(@root_dirs,$root_dir);
+  }
+
+
+  if ($root_url) {
+    $root_url_o=url $root_url;
+
+    # URL canonification, or what we do of it at least.
+    $root_url_o->host($root_url_o->host);
+
+    warn "Root queue: ".$root_url_o->as_string."\n" if $debug;
+
+    push(@root_urls,$root_url_o->as_string); 
+
+    return $root_url_o;
+ }
+
+}
+
+
+sub write_page {
+  # write a retrieved page to wherever it's supposed to be written.
+  # Added difficulty: all files but plaintext files have already been
+  # written to disk in w3http.
+  
+  # $s == 0 save to disk
+  # $s == 1 dump to stdout
+  # $s == 2 forget
+
+  my($lf_name,$page_ref,$silent) = @_;
+  my($verb);
+
+  if ($silent) {
+    $verb=-1;
+  } else {
+    $verb=$verbose;
+  }
+
+#  confess("\n\$page_ref undefined") if !defined($page_ref);
+  
+  if ($w3http::plaintexthtml) {
+    # I have it in memory
+    if ($s==0) {
+      print STDERR ", saving" if $verb>0;
+
+      while (-d $lf_name) {
+	# This will run once, maybe twice, $fiddled will be canged the
+	# first time
+	if (exists($fiddled{$lf_name})) {
+	  warn "Cannot save $lf_name, there is a directory in the way\n";
+	  return;
+	}
+
+	$fiddled{$lf_name}=1;
+
+	rm_rf($lf_name);
+	print STDERR "w3mir: $lf_name" if $verbose>=0;
+      }
+
+      if (!open(PAGE,">$lf_name")) {
+	warn "\nw3mir: can't open $lf_name for writing: $!\n";
+	return;
+      }
+      if (!$convertnl) {
+	binmode PAGE;
+	warn "BINMODE\n" if $debug;
+      }
+      if ($$page_ref ne '') {
+	print PAGE $$page_ref || die "w3mir: Error writing $lf_name: $!\n";
+      }
+      close(PAGE) || die "w3mir: Error closing $lf_name: $!\n";
+      print STDERR ": ", length($$page_ref), " bytes\n"
+	if $verb>=0;
+      setmtime($lf_name,$w3http::headval{'last-modified'})
+	if exists($w3http::headval{'last-modified'});
+    } elsif ($s==1) {
+      print $$page_ref ;
+    } elsif ($s==2) {
+      print STDERR ", got and forgot it.\n" unless $verb<0;
+    }
+  } else {
+    # Already written by http module, just emit a message if wanted
+    if ($s==0) {
+      print STDERR ": ",$w3http::doclen," bytes\n"
+	if $verb>=0;
+      setmtime($lf_name,$w3http::headval{'last-modified'})
+	  if exists($w3http::headval{'last-modified'});
+    } elsif ($s==2) {
+      print STDERR ", got and forgot it.\n" if $verb>=0;
+    }
+  }
+}
+
+
+sub setmtime {
+  # Set mtime of the given file
+  my($file,$time)=@_;
+  my($tm_sec,$tm_min,$tm_hour,$tm_mday,$tm_mon,$tm_year,$tm_wday,$tm_yday,
+     $tm_isdst,$tics);
+
+  $tm_isdst=0;
+  $tm_yday=-1;
+
+  carp("\$time is undefined"),return if !defined($time);
+
+  $tics=str2time($time);
+  utime(time, $tics, $file) || 
+      warn "Could not change mtime of $file: $!\n";
+}
+
+
+sub movefile {
+  # Rename a file.  Note that copy is not a good alternative, since
+  # copying over NFS is something we want to Avoid.
+
+  # Returns 0 if failure and 1 in case of sucess.
+
+  (my $old,my $new) = @_;
+
+  # Remove anything that might have the name already.
+  if (-d $new) {
+    print STDERR "\n" if $verbose>=0;
+    rm_rf($new);
+    $fiddled{$new}=1;
+    print STDERR "w3mir: $new" if $verbose>=0;
+  } elsif (-e $new) {
+    $fiddled{$new}=1;
+    if (unlink($new)) {
+      print STDERR "\nw3mir: removed $new\nw3mir: $new"
+	if $verbose>=0;
+    } else {
+      return 0;
+    }
+
+  }
+
+  if ($new ne '-' && $new ne $nulldevice) {
+    warn "MOVING $old -> $new\n" if $debug;
+    rename($old,$new) || 
+      warn "Could not rename $old to $new: $!\n",return 0;
+  }
+  return 1;
+}
+
+
+sub mkdir {
+  # Make all intermediate directories needed for a file, the file name
+  # is expected to be included in the argument!
+
+  # Reasons for not using File::Path::mkpath:
+  # - I already wrote this.
+  # - I get to be able to produce as good and precise errormessages as
+  #   unix and perl will allow me.  mkpath will not.
+  # - It's easier to find out if it worked or not.
+  
+  my($file) = @_;
+  my(@dirs) = split("/",$file);
+  my $path;
+  my $dir;
+  my $moved=0;
+
+  if (!$dirs[0]) {
+    shift @dirs;
+    $path='';
+  } else {
+    $path = '.';
+  }
+
+  # This removes the last element of the array, it's meant to shave
+  # off the file name leaving only the directory name, as a
+  # convenience, for the caller.
+  pop @dirs;
+  foreach $dir (@dirs) {
+    $path .= "/$dir";
+    stat($path);
+    # only make if it isn't already there
+    next if -d _;
+
+    while (!-d _) {
+      if (exists($fiddled{$path})) {
+	warn "Cannot make directory $path, there is a file in the way.\n";
+	return;
+      }
+
+      $fiddled{$path}=1;
+
+      if (!-e _) {
+	mkdir($path,0777);
+	last;
+      }
+
+      if (unlink($path)) {
+	warn "w3mir: removed file $path\n" if $verbose>=0;
+      } else {
+	warn "Unable to remove $path: $!\n";
+	next;
+      }
+    
+      warn "mkdir $path\n" if $debug;
+      mkdir($path,0777) ||
+	warn "Unable to create directory $path: $!\n";
+
+      stat($path);
+    }
+  }
+}
+
+
+sub add_referer {
+  # Add a referer to the list of referers of a document.  Unless it's
+  # already there.
+  # Don't mail me if you (only) think this is a bit like a toungetwiser:
+
+  # Don't remember referers if BOTH fixup and referer header is disabled.
+  return if $fixup==0 && $do_referer==0;
+
+  my($rum_referee,$rum_referer) = @_ ;
+  my $re_rum_referer;
+
+  if (exists($rum_referers{$rum_referee})) {
+    $re_rum_referer=quotemeta $rum_referer;
+    if (!grep(m/^$re_rum_referer$/,@{$rum_referers{$rum_referee}})) {
+      push(@{$rum_referers{$rum_referee}},$rum_referer);
+      # warn "$rum_referee <- $rum_referer pushed\n";
+    } else {
+      # warn "$rum_referee <- $rum_referer NOT pushed\n";
+    }
+  } else {
+    $rum_referers{$rum_referee}=[$rum_referer];
+    # warn "$rum_referee <- $rum_referer pushed\n";
+  }
+}
+
+
+sub user_apply {
+  # Apply the user apply rules
+
+  return &$user_apply_code(shift);
+
+# Debug version:
+#  my ($foo,$bar);
+#  $foo=shift;
+#  $bar=&$apply_code($foo);
+#  print STDERR "Apply: $foo -> $bar\n";
+#  return $bar;
+}
+
+sub internal_apply {
+  # Apply the w3mir generated apply rules
+
+  return &$apply_code(shift);
+}
+
+
+sub apply {
+  # Apply the user apply rules.  Then if URL is wanted return result of
+  # w3mir apply rules.  Return the undefined value otherwise.
+
+  my $url = user_apply(shift);
+
+  return undef unless want_this($url);
+
+  internal_apply($url);
+}
+
+
+sub want_this {
+  # Find out if we want the url passed.  Just pass it on to the
+  # generated functions.
+  my($rum_url)=shift;
+
+  # What about robot rules?
+
+  # Does scope rule want this?
+  return &$scope_code($rum_url) &&
+    # Does user rule want this too?
+    &$rule_code($rum_url) 
+  
+}
+
+
+sub process_tag {
+  # Process a tag in html file
+  my $lf_referer = shift;	# User argument
+  my $base_url = shift;		# Not used... why not?
+  my $tag_name = shift;
+  my $url_attrs = shift;
+
+  # Retrun quickly if no URL attributes
+  return unless defined($url_attrs);
+
+  my $attrs = shift;
+
+  my $rum_url;	# The absolute URL
+  my $lf_url;	# The local filesystem url
+  my $lf_url_o; # ... and it's object
+  my $key;
+
+  print STDERR "\nProcess Tag: $tag_name, URL attributes: ", 
+  join(', ',@{$url_attrs}),"\nbase_url: ",$base_url,"\nlf_referer: ",
+  $lf_referer,"\n" 
+    if $debug>2;
+
+  $lf_referer =~ s~^/~~;
+  $lf_referer = "file:/$lf_referer";
+
+  foreach $key (@{$url_attrs}) {
+    if (defined($$attrs{$key})) {
+      $rum_url=$$attrs{$key};
+      printf STDERR "$key = $rum_url\n" if $debug;
+      $lf_url=apply($rum_url);
+      if (defined($lf_url)) {
+
+	printf STDERR "Transformed to $lf_url\n" if $debug>2;
+
+	$lf_url =~ s~^/~~;  # Remove leading / to avoid doubeling
+	$lf_url_o=url "file:/$lf_url";
+
+	# Save new value in the hash
+	$$attrs{$key}=($lf_url_o->rel($lf_referer))->as_string;
+	print STDERR "New value: ",$$attrs{$key},"\n" if $debug>2;
+
+	# If there is potential information loss save the old value too
+	$$attrs{"W3MIR".$key}=$rum_url if $infoloss;
+      }
+    }
+  }
+}
+
+
+sub version {
+  eval 'require LWP;';
+  print $w3mir_agent,"\n";
+  print "LWP version ",$LWP::VERSION,"\n" if defined $LWP::VERSION;
+  print "Perl version: ",$],"\n";
+  exit(0);
+}
+
+
+sub parse_args {
+  my $f;
+  my $i;
+
+  $i=0;
+
+  while ($f=shift) {
+    $i++;
+    $numarg++;
+    # This is a demonstration against Getopts::Long.
+    if ($f =~ s/^-+//) {
+      $s=1,next if $f eq 's';			# Stdout
+      $r=1,next if $f eq 'r';			# Recurse
+      $fetch=1,next if $f eq 'fa';		# Fetch all, no date test
+      $fetch=-1,next if $f eq 'fs';	# Fetch those we don't already have.
+      $verbose=-1,next if $f eq 'q'; 		# Quiet
+      $verbose=1,next if $f eq 'c';		# Chatty
+      &version,next if $f eq 'v';		# Version
+      $pause=shift,next if $f eq 'p';		# Pause between requests
+      $retryPause=shift,next if $f eq 'rp';	# Pause between retries.
+      $s=2,$convertnl=0,next if $f eq 'f';	# Forget
+      $retry=shift,next if $f eq 't';		# reTry
+      $list=1,next if $f eq 'l';		# List urls
+      $iref=shift,next if $f eq 'ir';		# Initial referer
+      $check_robottxt = 0,next if $f eq 'drr';	# Disable robots.txt rules.
+      umask(oct(shift)),next if $f eq 'umask';
+      parse_cfg_file(shift),next if $f eq 'cfgfile';
+      usage(),exit 0 if ($f eq 'help' || $f eq 'h' || $f eq '?');
+      $remove=1,next if $f eq 'R';
+      $cache_header = 'Pragma: no-cache',next if $f eq 'pflush';
+      $w3http::agent=$w3mir_agent=shift,next if $f eq 'agent';
+      $abs=1,next if $f eq 'abs';
+      $convertnl=0,$batch=1,next if $f eq 'B';
+      $read_urls = 1,next if $f eq 'I';
+      $convertnl=0,next if $f eq 'nnc';
+
+      if ($f eq 'lc') {
+	if ($i == 1) {
+	  $lc=1;
+	  $iinline=($lc?"(?i)":"");
+	  $ipost=($lc?"i":"");
+	  next;
+	} else {
+	  die "w3mir: -lc must be the first argument on the commandline.\n";
+	}
+      }
+
+      if ($f eq 'P') {				# Proxy
+	($w3http::proxyserver,$w3http::proxyport)= 
+	  shift =~ /([^:]+):?(\d+)?/;
+	$w3http::proxyport=80 unless $w3http::proxyport;
+	$using_proxy=1;
+	next;
+      }
+    
+      if ($f eq 'd') {		# Debugging level
+	$f=shift;
+	unless (($debug = $f) > 0) {
+	  die "w3mir: debug level must be a number greater than zero.\n";
+	}
+	next;
+      }
+
+      # Those were all the options...
+      warn "w3mir: Unknown option: -$f.  Use -h for usage info.\n";
+      exit(1);
+      
+    } elsif ($f =~ /^http:/) {
+      my ($rum_url_o,$rum_reurl,$rum_rebase,$server);
+
+      $rum_url_o=root_queue($f,'./');
+
+      $rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+      push(@internal_apply,"s/^".$rum_rebase."//");
+      $scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+      $scope_ignore.="return 0 if m/^".
+	quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+
+    } else {
+      # If we get this far then the commandline is broken
+      warn "Unknown commandline argument: $f.  Use -h for usage info.\n";
+      $numarg--;
+      exit(1);
+    }
+  }
+  return 1;
+}
+
+
+sub parse_cfg_file {
+  # Read the configuration file.  Aborts on errors.  Not good to
+  # mirror something using the wrong config.
+
+  my ( $file ) = @_ ;
+  my ($key, $value, $authserver,$authrealm,$authuser,$authpasswd);
+  my $i;
+
+  die "w3mir: config file $file is not a file.\n" unless -f $file;
+  open(CFGF, $file) || die "Could not open config file $file: $!\n";
+
+  $i=0;
+
+  while (<CFGF>) {
+    # Trim off various junk
+    chomp;
+    s/^#.*//;
+    s/^\s+|\s$//g;
+    # Anything left?
+    next if $_ eq '';
+    # Examine remains
+    $i++;
+    $numarg++;
+
+    ($key, $value) = split(/\s*:\s*/,$_,2);
+    $key = lc $key;
+
+    $iref=$value,next if ( $key eq 'initial-referer' );
+    $header=$value,next if ( $key eq 'header' );
+    $pause=numeric($value),next if ( $key eq 'pause' );
+    $retryPause=numeric($value),next if ( $key eq 'retry-pause' );
+    $debug=numeric($value),next if ( $key eq 'debug' );
+    $retry=numeric($value),next if ( $key eq 'retries' );
+    umask(numeric($value)),next if ( $key eq 'umask' );
+    $check_robottxt=boolean($value),next if ( $key eq 'robot-rules' );
+    $edit=boolean($value),next if ($key eq 'remove-nomirror');
+    $indexname=$value,next if ($key eq 'index-name');
+    $s=nway($value,'save','stdout','forget'),next 
+      if ( $key eq 'file-disposition' );
+    $verbose=nway($value,'quiet','brief','chatty')-1,next
+      if ( $key eq 'verbosity' );
+    $w3http::proxyuser=$value,next if $key eq 'http-proxy-user';
+    $w3http::proxypasswd=$value,next if $key eq 'http-proxy-passwd';
+
+    if ( $key eq 'cd' ) {
+      $chdirto=$value;
+      warn "Use of 'cd' is discouraged\n" unless $verbose==-1;
+      next;
+    }
+    
+    if ($key eq 'http-proxy') {
+      ($w3http::proxyserver,$w3http::proxyport)= 
+	$value =~ /([^:]+):?(\d+)?/;
+      $w3http::proxyport=80 unless $w3http::proxyport;
+      $using_proxy=1;
+      next;
+    }
+
+    if ($key eq 'proxy-options') {
+      my($val,$nval,@popts,$pragma);
+      $pragma=1;
+      foreach $val (split(/\s*,\*/,lc $value)) {
+	$nval=nway($val,'no-pragma','revalidate','refresh','no-store',);
+	# Force use of Cache-control: header
+	$pragma=0 if ($nval==0);
+	# use to force proxy to revalidate
+	$pragma=0,push(@popts,'max-age=0') if ($nval==1);
+	# use to force proxy to refresh
+	push(@popts,'no-cache') if ($nval==2);
+	# use if information transfered is sensitive
+	$pragma=0,push(@popts,'no-store') if ($nval==3);
+      }
+      $cache_header=($pragma?'Pragma: ':'Cache-control: ').join(', ',@popts);
+      next;
+    }
+
+
+    if ($key eq 'url') {
+      my ($rum_url_o,$lf_dir,$rum_reurl,$rum_rebase);
+
+      # A two argument URL: line?
+      if ($value =~ m/^(.+)\s+(.+)/i) {
+	# Two arguments.
+	# The last is a directory, it must end in /
+	$lf_dir=$2;
+	$lf_dir.='/' unless $lf_dir =~ m~/$~;
+
+	$rum_url_o=root_queue($1,$lf_dir);
+
+	# The first is a URL, make it more canonical, find the base.
+	# The namespace confusion in this section is correct.(??)
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+	# print "URL: ",$rum_url_o->as_string,"\n";
+	# print "Base: $rum_rebase\n";
+
+	# Translate from rum space to lf space:
+	push(@internal_apply,"s/^".$rum_rebase."/".quotemeta($lf_dir)."/");
+
+	# That translation could lead to information loss.
+	$infoloss=1;
+
+	# Fetch rules tests the rum_url_o->as_string.  Fetch whatever
+	# matches the base.
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+
+	# Ignore whatever did not match the base.
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+
+      } else {
+	$rum_url_o=root_queue($value,'./');
+
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+	# Translate from rum space to lf space:
+	push(@internal_apply,"s/^".$rum_rebase."//");
+
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+      }
+      next;
+    }
+
+    if ($key eq 'also-quene') {
+      print STDERR 
+	"Found 'also-quene' keyword, please replace with 'also-queue'\n";
+      $key='also-queue';
+    }
+
+    if ($key eq 'also' || $key eq 'also-queue') {
+      if ($value =~ m/^(.+)\s+(.+)/i) {
+	my ($rum_url_o,$lf_dir,$rum_reurl,$rum_rebase);
+	# Two arguments.
+	# The last is a directory, it must end in /
+	# print STDERR "URL ",$1," DIR ",$2,"\n";
+	$lf_dir=$2;
+	$lf_dir.='/' unless $lf_dir =~ m~/$~;
+
+	if ($key eq 'also-queue') {
+	  $rum_url_o=root_queue($1,$lf_dir);
+	} else {
+	  root_queue("",$lf_dir);
+	  $rum_url_o=url $1;
+	  $rum_url_o->host(lc $rum_url_o->host);
+	}
+
+	# The first is a URL, find the base
+	$rum_rebase = quotemeta( ($rum_url_o->as_string =~ m~^(.*/)~)[0] );
+
+#	print "URL: $rum_url_o->as_string\n";
+#	print "Base: $rum_rebase\n";
+#	print "Server: $server\n";
+
+	# Ok, now we can transform and select stuff the right way
+	push(@internal_apply,"s/^".$rum_rebase."/".quotemeta($lf_dir)."/");
+	$infoloss=1;
+
+	# Fetch rules tests the rum_url_o->as_string.  Fetch whatever
+	# matches the base.
+	$scope_fetch.="return 1 if m/^".$rum_rebase."/".$ipost.";\n";
+
+	# Ignore whatever did not match the base.  This cures problem
+	# with '..' from base in in rum space pointing within the the
+	# scope in ra space.  We introduced a extra level (or more) of
+	# directories with the apply above.  Must do same with 'Also:'
+	# directives.
+	$scope_ignore.="return 0 if m/^".
+	  quotemeta("http://".$rum_url_o->netloc."/")."/".$ipost.";\n";
+      } else {
+	die "Also: requires 2 arguments\n";
+      }
+      next;
+    }
+
+    if ($key eq 'quene') {
+      print STDERR "Found 'quene' keyword, please replace with 'queue'\n";
+      $key='queue';
+    }
+
+    if ($key eq 'queue') {
+      root_queue($value,"");
+      next;
+    }
+
+    if ($key eq 'ignore-re' || $key eq 'fetch-re') {
+      # Check that it's a re, better that I am strict than for perl to
+      # make compilation errors.
+      unless ($value =~ /^m(.).*\1[gimosx]*$/) {
+	print STDERR "w3mir: $value is not a recognized regular expression\n";
+	exit 1;
+      }
+      # Fall-through to next cases!
+    }
+
+    if ($key eq 'fetch' || $key eq 'fetch-re') {
+      my $expr=$value;
+      $expr = wild_re($expr).$ipost if ($key eq 'fetch');
+      $rule_text.=' return 1 if '.$expr.";\n";
+      next;
+    }
+
+    if ($key eq 'ignore' || $key eq 'ignore-re') {
+      my $expr=$value;
+      $expr = wild_re($expr).$ipost if ($key eq 'ignore');
+      # print STDERR "Ignore expression: $expr\n";
+      $rule_text.=' return 0 if '.$expr.";\n";
+      next;
+    }
+
+
+    if ($key eq 'apply') {
+      unless ($value =~ /^s(.).*\1.*\1[gimosxe]*$/) {
+	print STDERR
+	  "w3mir: '$value' is not a recognized regular expression\n";
+	exit 1;
+      }
+      push(@user_apply,$value) ;
+      $infoloss=1;
+      next;
+    }
+
+    if ($key eq 'agent') {
+      $w3http::agent=$w3mir_agent=$value;
+      next;
+    }
+
+    # The authorization stuff:
+    if ($key eq 'auth-domain') {
+      $useauth=1;
+      ($authserver, $authrealm) = split('/',$value,2);
+      die "w3mir: server part of auth-domain has format server[:port]\n"
+	unless $authserver =~ /^(\S+(:\d+)?)$|^\*$/;
+      $authserver =~ s/:80$//;
+      die "w3mir: auth-domain '$value' is not valid\n"
+	if !defined($authserver) || !defined($authrealm);
+      $authrealm=lc $authrealm;
+    }
+
+    $authuser=$value if ($key eq 'auth-user');
+    $authpasswd=$value if ($key eq 'auth-passwd');
+
+    # Got a full authentication spec?
+    if ($authserver && $authrealm && $authuser && $authpasswd) {
+      $authdata{$authserver}{$authrealm}=$authuser.":".$authpasswd;
+      print "Authentication for $authserver/$authrealm is ".
+	"$authuser/$authpasswd\n" if $verbose>=0;
+      # exit;
+      # Invalidate tmp vars
+      $authserver=$authrealm=$authuser=$authpasswd=undef;
+      next;
+    }
+
+    next if $key eq 'auth-user' || $key eq 'auth-passwd' || 
+      $key eq 'auth-domain';
+
+    if ($key eq 'fetch-options') {
+      warn "w3mir: The 'fetch-options' directive has been renamed to 'options'\nw3mir: Please change your configuration file.\n";
+      $key='options';
+      # Fall through to 'options'!
+    }
+
+    if ($key eq 'options') {
+      
+      my($val,$nval);
+      foreach $val (split(/\s*,\s*/,lc $value)) {
+	if ($i==1) {
+	  $nval=nway($val,'recurse','no-date-check','only-nonexistent',
+		     'list-urls','lowercase','remove','batch','read-urls',
+		     'abs','no-newline-conv');
+	  $r=1,next if $nval==0;
+	  $fetch=1,next if $nval==1;
+	  $fetch=-1,next if $nval==2;
+	  $list=1,next if $nval==3;
+	  if ($nval==4) {
+	    $lc=1;
+	    $iinline=($lc?"(?i)":"");
+	    $ipost=($lc?"i":"");
+	    next ;
+	  }
+	  $remove=1,next if $nval==5;
+	  $convertnl=0,$batch=1,next if $nval==6;
+	  $read_urls=1,next if $nval==7;
+	  $abs=1,next if $nval==8;
+	  $convertnl=0,next if $nval==9;
+        } else {
+	    die "w3mir: options must be the first directive in the config file.\n";
+	}
+      }
+      next;
+    }
+
+    if ($key eq 'disable-headers') {
+      my($val,$nval);
+      foreach $val (split(/\s*,\s*/,lc $value)) {
+	$nval=nway($val,'referer','user');
+	$do_referer=0,next if $nval==0;
+	$do_user=0,next if $nval==1;
+      }
+      next;
+    }
+
+
+    if ($key eq 'fixup') {
+
+      $fixrc="$file";
+      # warn "Fixrc: $fixrc\n";
+
+      my($val,$nval);
+      foreach $val (split(/\s*,\s*/,lc $value)) {
+	$nval=nway($val,'on','run','noindex','off');
+	$runfix=1,next if $nval==1;
+	# Disable fixup
+	$fixup=0,next if $nval==3;
+	# Ignore everyting else
+      }
+      next;
+    }
+
+    die "w3mir: Unrecognized directive ('$key') in config file $file at line $.\n";
+
+  }
+  close(CFGF);
+
+  if (defined($w3http::proxypasswd) && $w3http::proxyuser) {
+    warn "Proxy authentication: ".$w3http::proxyuser.":".
+      $w3http::proxypasswd."\n" if $verbose>=0;
+  }
+
+}
+
+
+sub wild_re {
+  # Here we translate unix wildcard subset to to perlre
+  local($_) = shift;
+
+  # Quote anything that's RE and not wildcard: / ( ) \ | { } + $ ^
+  s~([\/\(\)\\\|\{\}\+)\$\^])~\\$1~g;
+  # . -> \.
+  s~\.~\\.~g;
+  # * -> .*
+  s~\*~\.\*~g;
+  # ? -> .
+  s~\?~\.~g;
+
+  # print STDERR "wild_re: $_\n";
+
+  return $_ = '/'.$_.'/';
+}
+
+
+sub numeric {
+  # Check if argument is numeric?
+  my ( $number ) = @_ ;
+  return oct($number) if ($number =~ /\d+/ || $number =~ /\d+.\d+/);
+  die "Expected a number, got \"$number\"\n";
+}
+
+
+sub boolean {
+  my ( $boolean ) = @_ ;
+
+  $boolean = lc $boolean;
+
+  return 0 if ($boolean eq 'false' || $boolean eq 'off' || $boolean eq '0');
+  return 1 if ($boolean eq 'true' || $boolean eq 'on' || $boolean eq '1');
+  die "Expected a boolean, got \"$boolean\"\n";
+}
+
+
+sub nway {
+  my ( $value ) = shift;
+  my ( @values ) = @_;
+  my ( $val ) = 0;
+
+  $value = lc $value;
+  while (@_) {
+    return $val if $value eq shift;
+    $val++;
+  }
+  die "Expected one of ".join(", ",@values).", got \"$value\"\n";
+}
+
+
+sub insert_at_start {
+  # ark: inserts the first arg at the top of the html in the second arg
+  # janl: The second arg must be a reference to a scalar.
+  my( $str, $text_ref ) = @_;
+  my( @possible ) =("<BODY.*?>", "</HEAD.*?>", "</TITLE.*?>", "<HTML.*?>" );
+  my( $f, $done );
+  
+  $done=0;
+  @_=@possible;
+  
+  while( $done!=1 && ($f=shift) ){
+    print "Searching for: $f\n";
+    if( $$text_ref =~ /$f/i ){
+      print "found it!\n";
+      $$text_ref =~ s/($f)/$1\n$str/i;
+      $done=1;
+    }
+  }
+}
+
+
+
+sub rm_rf {
+  # Recursively remove directories and other files
+  # File::Path::rmtree does a similar thing but the messages are wrong
+
+  my($remove)=shift;
+
+  eval "use File::Find;" unless defined(&finddepth);
+
+  die "w3mir: Could not load File::Find module when trying to remove $remove\n"
+    unless defined(&find);
+
+  finddepth(\&remove_everything,$remove);
+
+  if (rmdir($remove)) {
+    print STDERR "\nw3mir: removed directory $remove\n" if $verbose>=0;
+  } else {
+    print STDERR "w3mir: could not remove $remove: $!\n";
+  }
+}
+
+
+sub remove_everything {
+  # This does the removal
+  ((-d && rmdir($_)) || unlink($_)) && $verbose>=0 &&
+    print STDERR "w3mir: removed $File::Find::name\n";
+}
+
+
+
+sub usage {
+  my($message)=shift @_;
+
+  print STDERR "w3mir: $message\n" if $message;
+  
+  die 'w3mir: usage: w3mir [options] <single-http-url>
+          or: w3mir -B [-I] [options] [<http-urls>]
+
+    Options :
+	-agent <agent>	- Set the agent name.  Default is w3mir
+	-abs		- Force all URLs to be absolute.
+	-B		- Batch-get documents.
+	-I		- The URLs to get are read from standard input.
+	-c		- be more Chatty.
+	-cfgfile <file> - Read config from file
+	-d <debug-level>- set debug level to 1 or 2
+	-drr		- Disable robots.txt rules.
+	-f		- Forget all files, nothing is saved to disk.
+	-fa		- Fetch All, will not check timestamps.
+	-fs		- Fetch Some, do not fetch the files we already have.
+	-ir <referer>	- Initial referer.  For picky servers.
+	-l		- List URLs in the documents retrived.
+	-lc		- Convert all URLs (and filenames) to lowercase.
+				This does not work reliably.
+	-p <n>		- Pause n seconds before retriving each doc.
+	-q		- Quiet, error-messages only
+        -rp <n>		- Retry Pause in seconds.
+	-P <server:port>- Use host/port for proxy http requests
+        -pflush		- Flush proxy server.
+	-r		- Recursive mirroring.
+        -R		- Remove files not referenced or not present on server.
+	-s		- Send output to stdout instead of file
+	-t <n>		- How many times to (re)try getting a failed doc?
+        -umask <umask>  - Set umask for mirroring, must be usual octal format.
+	-nnc		- No Newline Conversion.  Disable newline conversions.
+	-v		- Show w3mir version.
+';
+}
+__END__
+# -*- perl -*- There must be a blank line here
+
+=head1 NAME
+
+w3mir - all purpose HTTP-copying and mirroring tool
+
+=head1 SYNOPSIS
+
+B<w3mir> [B<options>] [I<HTTP-URL>]
+
+B<w3mir> B<-B> [B<options>] <I<HTTP-URLS>>
+
+B<w3mir> is a all purpose HTTP copying and mirroring tool.  The
+main focus of B<w3mir> is to create and maintain a browsable copy of
+one, or several, remote WWW site(s).
+
+Used to the max w3mir can retrive the contents of several related
+sites and leave the mirror browseable via a local web server, or from
+a filesystem, such as directly from a CDROM.  
+
+B<w3mir> has options for all operations that are simple enough for
+options.  For authentication and passwords, multiple site retrievals
+and such you will have to resort to a L</CONFIGURATION-FILE>.  If
+browsing from a filesystem references ending in '/' needs to be
+rewritten to end in '/index.html', and in any case, if there are URLs
+that are redirected will need to be changed to make the mirror
+browseable, see the documentation of B<Fixup> in the
+L</CONFIGURATION-FILE> secton.
+
+B<w3mir>s default behavior is to do as little as possible and to be as
+nice as possible to the server(s) it is getting documents from.  You
+will need to read through the options list to make B<w3mir> do more
+complex, and, useful things.  Most of the things B<w3mir> can do is
+also documented in the w3mir-HOWTO which is available at the B<w3mir>
+home-page (F<http://www.math.uio.no/~janl/w3mir/>) as well as in the
+w3mir distribution bundle.
+
+=head1 DESCRIPTION
+
+You may specify many options and one HTTP-URL on the w3mir
+command line.
+
+A single HTTP URL I<must> be specified either on the command line or
+in a B<URL> directive in a configuration file.  If the URL refers to a
+directory it I<must> end with a "/", otherwise you might get surprised
+at what gets retrieved (e.g. rather more than you expect).
+
+Options must be prefixed with at least one - as shown below, you can
+use more if you want to. B<-cfgfile> is equivalent to B<--cfgfile> or
+even B<------cfgfile>.  Options cannot be I<clustered>, i.e., B<-r -R>
+is not equivalent to B<-rR>.
+
+=over 4
+
+=item B<-h> | B<-help> | B<-?>
+
+prints a brief summary of all command line options and exits.
+
+=item B<-cfgfile> F<file>
+
+Makes B<w3mir> read the given configuration file.  See the next section
+for how to write such a file.
+
+=item B<-r>
+
+Puts B<w3mir> into recursive mode.  The default is to fetch only one
+document and then quit.  'I<recursive>' mode means that all the
+documents linked to the given document that are fetched, and all they
+link to in turn and so on.  But only I<Iff> they are in the same
+directory or under the same directory as the start document.  Any
+document that is in or under the starting documents directory is said
+to be within the I<scope of retrieval>.
+
+=item B<-fa>
+
+Fetch All.  Normally B<w3mir> will only get the document if it has been
+updated since the last time it was fetched.  This switch turns that
+check off.
+
+=item B<-fs>
+
+Fetch Some.  Not the opposite of B<-fa>, but rather, fetch the ones we
+don't have already.  This is handy to restart copying of a site
+incompletely copied by earlier, interrupted, runs of B<w3mir>.
+
+=item B<-p> I<n>
+
+Pause for I<n> seconds between getting each document.  The default is
+30 seconds.
+
+=item B<-rp> I<n>
+
+Retry Pause, in seconds.  When B<w3mir> fails to get a document for some
+technical reason (timeout mainly) the document will be queued for a
+later retry.  The retry pause is how long B<w3mir> waits between
+finishing a mirror pass before starting a new one to get the still
+missing documents.  This should be a long time, so network conditions
+have a chance to get better.  The default is 600 seconds (10 minutes),
+which might be a bit too short, for batch running B<w3mir> I would
+suggest an hour (3600 seconds) or more.
+
+=item B<-t> I<n>
+
+Number of reTries.  If B<w3mir> cannot get all the documents by the
+I<n>th retry B<w3mir> gives up.  The default is 3.
+
+=item B<-drr>
+
+Disable Robot Rules.  The robot exclusion standard is described in
+http://info.webcrawler.com/mak/projects/robots/norobots.html.  By
+default B<w3mir> honors this standard.  This option causes B<w3mir> to
+ignore it.
+
+=item B<-nnc>
+
+No Newline Conversion.  Normally w3mir converts the newline format of
+all files that the web server says is a text file.  However, not all
+web servers are reliable, and so binary files may become corrupted due
+to the newline conversion w3mir performs.  Use this option to stop
+w3mir from converting newlines.  This also causes the file to be
+regarded as binary when written to disk, to disable the implicit
+newline conversion when saving text files on most non-Unix systems.
+
+This will probably be on by default in version 1.1 of w3mir, but not
+in version 1.0.
+
+=item B<-R>
+
+Remove files.  Normally B<w3mir> will not remove files that are no
+longer on the server/part of the retrieved web of files.  When this
+option is specified all files no longer needed or found on the servers
+will be removed.  If B<w3mir> fails to get a document for I<any> other
+reason the file will not be removed.
+
+=item B<-B>
+
+Batch fetch documents whose URLs are given on the commandline.
+
+In combination with the B<-r> and/or B<-l> switch all HTML and PDF
+documents will be mined for URLs, but the documents will be saved on
+disk unchanged.  When used with the B<-r> switch only one single URL
+is allowed.  When not used with the B<-r> switch no HTML/URL
+processing will be performed at all.  When the B<-B> switch is used
+with B<-r> w3mir will not do repeated mirrorings reliably since the
+changes w3mir needs to do, in the documents, to work reliably are not
+done.  In any case it's best not to use B<-R> in combination with
+B<-B> since that can result in deleting rather more documents than
+expected.  Hwowever, if the person writing the documents being copied
+is good about making references relative and placing the <HTML> tag at
+the beginning of documents there is a fair chance that things will
+work even so.  But I wouln't bet on it.  It will, however, work
+reliably for repeated mirroring if the B<-r> switch is not used.
+
+When the B<-B> switch is specified redirects for a given document will
+be followed no matter where they point.  The redirected-to document
+will be retrieved in the place of the original document.  This is a
+potential weakness, since w3mir can be directed to fetch any document
+anywhere on the web.
+
+Unless used with B<-r> all retrived files will be stored in one
+directory using the remote filename as the local filename.  I.e.,
+F<http://foo/bar/gazonk.html> will be saved as F<gazonk.html>.
+F<http://foo/bar/> will be saved as F<bar-index.html> so as to avoid
+name colitions for the common case of URLs ending in /.
+
+=item B<-I>
+
+This switch can only be used with the B<-B> switch, and only after it
+on the commandline or configuration file.  When given w3mir will get
+URLs from standard input (i.e., w3mir can be used as the end of a pipe
+that produces URLs.)  There should only be one URL pr. line of input.
+
+=item B<-q>
+
+Quiet.  Turns off all informational messages, only errors will be
+output.
+
+=item B<-c>
+
+Chatty.  B<w3mir> will output more progress information.  This can be
+used if you're watching B<w3mir> work.
+
+=item B<-v>
+
+Version.  Output B<w3mir>s version.
+
+=item B<-s>
+
+Copy the given document(s) to STDOUT.
+
+=item B<-f>
+
+Forget.  The retrieved documents are not saved on disk, they are just
+forgotten.  This can be used to prime the cache in proxy servers, or
+not save documents you just want to list the URLs in (see B<-l>).
+
+=item B<-l>
+
+List the URLs referred to in the retrieved document(s) on STDOUT.
+
+=item B<-umask> I<n>
+
+Sets the umask, i.e., the permission bits of all retrieved files.  The
+number is taken as octal unless it starts with a 0x, in which case
+it's taken as hexadecimal.  No matter what you set this to make sure
+you get write as well as read access to created files and directories.
+
+Typical values are: 
+
+=over 8
+
+=item 022
+
+let everyone read the files (and directories), only you can change
+them. 
+
+=item 027
+
+you and everyone in the same file-group as you can read, only you can
+change them.
+
+=item 077
+
+only you can read the files, only you can change them.
+
+=item 0
+
+everyone can read, write and change everything.
+
+=back
+
+The default is whatever was set when B<w3mir> was invoked.  022 is a
+reasonable value.
+
+This option has no meaning, or effect, on Win32 platforms.
+
+=item B<-P> I<server:port>
+
+Use the given server and port is a HTTP proxy server.  If no port is
+given port 80 is assumed (this is the normal HTTP port).  This is
+useful if you are inside a firewall, or use a proxy server to save
+bandwidth.
+
+=item B<-pflush>
+
+Proxy flush, force the proxy server to flush it's cache and re-get the
+document from the source.  The I<Pragma: no-cache> HTTP/1.0 header is
+used to implement this.
+
+=item B<-ir> I<referrer>
+
+Initial Referrer.  Set the referrer of the first retrieved document.
+Some servers are reluctant to serve certain documents unless this is
+set right.
+
+=item B<-agent> I<agent>
+
+Set the HTTP User-Agent fields value.  Some servers will serve
+different documents according to the WWW browsers capabilities.
+B<w3mir> normally has B<w3mir>/I<version> in this header field.
+Netscape uses things like B<Mozilla/3.01 (X11; I; Linux 2.0.30 i586)>
+and MSIE uses things like B<Mozilla/2.0 (compatible; MSIE 3.02;
+Windows NT)> (remember to enclose agent strings with spaces in with
+double quotes ("))
+
+=item B<-lc>
+
+Lower Case URLs. Some OSes, like W95 and NT, are not case sensitive
+when it comes to filenames.  Thus web masters using such OSes can case
+filenames differently in different places (apps.html, Apps.html,
+APPS.HTML).  If you mirror to a Unix machine this can result in one
+file on the server becoming many in the mirror.  This option
+lowercases all filenames so the mirror corresponds better with the
+server.
+
+If given it must be the first option on the command line.
+
+This option does not work perfectly.  Most especially for mixed case
+host-names.
+
+=item B<-d> I<n>
+
+Set the debug level.  A debug level higher than 0 will produce lots of
+extra output for debugging purposes.
+
+=item B<-abs>
+
+Force all URLs to be absolute.  If you retrive
+F<http://www.ifi.uio.no/~janl/index.html> and it references foo.html
+the referense is absolutified into
+F<http://www.ifi.uio.no/~janl/foo.html>.  In other words, you get
+absolute references to the origin site if you use this option.
+
+=back
+
+=head1 CONFIGURATION-FILE
+
+Most things can be mirrored with a (long) command line.  But multi
+server mirroring, authentication and some other things are only
+available through a configuration file.  A configuration file can
+either be specified with the B<-cfgfile> switch, but w3mir also looks
+for .w3mirc (w3mir.ini on Win32 platforms) in the directory where
+w3mir is started from.
+
+The configuration file consists of lines of comments and directives.
+A directive consists of a keyword followed by a colon (:) and then one
+or several arguments.
+
+ # This is a comment.  And the next line is a directive:
+ Options: recurse, remove
+
+A comment can only start at the beginning of a line.  The directive
+keywords are not case-sensitive, but the arguments I<might> be.
+
+=over 4
+
+=item Options: I<recurse> | I<no-date-check> | I<only-nonexistent> | I<list-urls> | I<lowercase> | I<remove> | I<batch> | I<input-urls> | I<no-newline-conv>
+
+This must be the first directive in a configuration file.  
+
+=over 8
+
+=item I<recurse>
+
+see B<-r> switch.
+
+=item I<no-date-check>
+
+see B<-fa> switch.
+
+=item I<only-nonexistent>
+
+see B<-fs> switch.
+
+=item I<list-urls>
+
+see B<-l> option.
+
+=item I<lowercase>
+
+see B<-lc> option. 
+
+=item I<remove>
+
+see B<-R> option.
+
+=item I<batch>
+
+see B<-B> option.
+
+=item I<input-urls>
+
+see B<-I> option.
+
+=item I<no-newline-conv>
+
+see B<-nnc> option.
+
+=back
+
+=item URL: I<HTTP-URL> [I<target-directory>]
+
+The URL directive may only appear once in any configuration file.
+
+Without the optional target directory argument it corresponds directly
+to the I<single-HTTP-URL> argument on the command line.  
+
+If the optional target directory is given all documents from under the
+given URL will be stored in that directory, and under.  The target
+directory is most likely only specified if the B<Also> directive is
+also specified.
+
+If the URL given refers to a directory it I<must> end in a "/",
+otherwise you might get quite surprised at what gets retrieved.
+
+Either one URL: directive or the single-HTTP-URL at the command-line
+I<must> be given.
+
+=item Also: I<HTTP-URL directory>
+
+This directive is only meaningful if the I<recurse> (or B<-r>)
+option is given.
+
+The directive enlarges the scope of a recursive retrieval to contain
+the given HTTP-URL and all documents in the same directory or under.
+Any documents retrieved because of this directive will be stored in the
+given directory of the mirror.
+
+In practice this means that if the documents to be retrieved are stored
+on several servers, or in several hierarchies on one server or any
+combination of those.  Then the B<Also> directive ensures that we get
+everything into one single mirror.
+
+This also means that if you're retrieving
+
+  URL: http://www.foo.org/gazonk/
+
+but it has inline icons or images stored in http://www.foo.org/icons/
+which you will also want to get, then that will be retrieved as well by
+entering
+
+  Also: http://www.foo.org/icons/ icons
+
+As with the URL directive, if the URL refers to a directory it I<must>
+end in a "/".
+
+Another use for it is when mirroring sites that have several names
+that all refer to the same (logical) server:
+
+  URL: http://www.midifest.com/
+  Also: http://midifest.com/ .
+
+At this point in time B<w3mir> has no mechanism to easily enlarge the
+scope of a mirror after it has been established.  That means that you
+should survey the documents you are going to retrieve to find out what
+icons, graphics and other things they refer to that you want.  And
+what other sites you might like to retrieve.  If you find out that
+something is missing you will have to delete the whole mirror, add the
+needed B<Also> directives and then reestablish the mirror.  This lack
+of flexibility in what to retrieve will be addressed at a later date.
+
+See also the B<Also-quene> directive.
+
+=item Also-quene: I<HTTP-URL directory>
+
+This is like Also, except that the URL itself is also quened.  The
+Also directive will not cause any documents to be retrived UNLESS they
+are referenced by some other document w3mir has already retrived.
+
+=item Quene: I<HTTP-URL>
+
+This is quenes the URL for retrival, but does not enlarge the scope of
+the retrival.  If the URL is outside the scope of retrival it will not
+be retrived anyway.
+
+The observant reader will see that B<Also-quene> is like B<Also>
+combined with B<Quene>.
+
+=item Initial-referer: I<referer>
+
+see B<-ir> option.
+
+=item Ignore: F<wildcard>
+
+=item Fetch: F<wildcard>
+
+=item Ignore-RE: F<regular-expression>
+
+=item Fetch-RE: F<regular-expression>
+
+These four are used to set up rules about which documents, within the
+scope of retrieval, should be gotten and which not.  The default is to
+get I<anything> that is within the scope of retrieval.  That may not
+be practical though.  This goes for CGI scripts, and especially server
+side image maps and other things that are executed/evaluated on the
+server.  There might be other things you want unfetched as well.
+
+B<w3mir> stores the I<Ignore>/I<Fetch> rules in a list.  When a
+document is considered for retrieval the URL is checked against the
+list in the same order that the rules appeared in the configuration
+file.  If the URL matches any rule the search stops at once.  If it
+matched a I<Ignore> rule the document is not fetched and any URLs in
+other documents pointing to it will point to the document at the
+original server (not inside the mirror).  If it matched a I<Fetch>
+rule the document is gotten.  If not matched by any ruøes the document
+is gotten.
+
+The F<wildcard>s are a very limited subset of Unix-wildcards.
+B<w3mir> understands only 'I<?>', 'I<*>', and 'I<[x-y]>' ranges.
+
+The F<perl-regular-expression> is perls superset of the normal Unix
+regular expression syntax.  They must be completely specified,
+including the prefixed m, a delimiter of your choice (except the
+paired delimiters: parenthesis, brackets and braces), and any of the
+RE modifiers. E.g.,
+
+  Ignore-RE: m/.gif$/i
+
+or
+
+  Ignore-RE: m~/.*/.*/.*/~
+
+and so on.  "#" cannot be used as delimiter as it is the comment
+character in the configuration file.  This also has the bad
+side-effect of making you unable to match fragment names (#foobar)
+directly.  Fortunately perl allows writing ``#'' as ``\043''.
+
+You must be very carefull of using the RE anchors (``^'' and ``$''
+with the RE versions of these and the I<Apply> directive. Given the
+rules:
+
+  Fetch-RE: m/foobar.cgi$/
+  Ignore: *.cgi
+
+the all files called ``foobar.cgi'' will be fetched. However, if the
+file is referenced as ``foobar.cgi?query=mp3'' it will I<not> be
+fetched since the ``$'' anchor will prevent it from matching the
+I<Fetch-RE> directive and then it will match the I<Ignore> directive
+instead. If you want to match ``foobar.cgi'' but not ``foobar.cgifu''
+you can use perls ``\b'' character class which matches a word
+boundrary:
+
+  Fetch-RE: m/foobar.cgi\b/
+  Ignore: *.cgi
+
+which will get ``foobar.cgi'' as well as ``foobar.cgi?query=mp3'' but
+not ``foobar.cgifu''. BUT, you must keep in mind that a lot of
+diffetent characters make a word boundrary, maybe something more
+subtle is needed.
+
+=item Apply: I<regular-expression>
+
+This is used to change a URL into another URL.  It is a potentially
+I<very> powerful feature, and it also provides ample chance for you to
+shoot your own foot. The whole aparatus is somewhat tenative, if you
+find there is a need for changes in how Apply rules work please
+E-mail. If you are going to use this feature please read the
+documentation for I<Fetch-RE> and I<Ignore-RE> first.
+
+The B<Apply> expressions are applied, in sequence, to the URLs in
+their absolute form. I.e., with the whole
+http://host:port/dir/ec/tory/file URL. It is only after this B<w3mir>
+checks if a document is within the scope of retrieval or not. That
+means that B<Apply> rules can be used to change certain URLs to fall
+inside the scope of retrieval, and vice versa.
+
+The I<regular-expression> is perls superset of the usual Unix regular
+expressions for substitution.  As with I<Fetch> and I<Ignore> rules it
+must be specified fully, with the I<s> and delimiting character.  It
+has the same restrictions with regards to delimiters. E.g.,
+
+  Apply: s~/foo/~/bar/~i
+
+to translate the path element I<foo> to I<bar> in all URLs.
+
+"#" cannot be used as delimiter as it is the comment character in the
+configuration file.
+
+Please note that w3mir expects that URLs identifying 'directories'
+keep idenfifying directories after application of Apply rules.  Ditto
+for files.
+
+=item Agent: I<agent>
+
+see B<-agent> option.
+
+=item Pause: I<n>
+
+see B<-p> option.
+
+=item Retry-Pause: I<n>
+
+see B<-rp> option.
+
+=item Retries: I<n>
+
+see B<-t> option.
+
+=item debug: I<n>
+
+see B<-d> option.
+
+=item umask I<n>
+
+see B<-umask> option.
+
+=item Robot-Rules: I<on> | I<off>
+
+Turn robot rules on of off.  See B<-drr> option.
+
+=item Remove-Nomirror: I<on> | I<off>
+
+If this is enabled sections between two consecutive
+
+  <!--NO MIRROR-->
+
+comments in a mirrored document will be removed.  This editing is
+performed even if batch getting is specified.
+
+=item Header: I<html/text>
+
+Insert this I<complete> html/text into the start of the document.
+This will be done even if batch is specified.
+
+=item File-Disposition: I<save> | I<stdout> | I<forget>
+
+What to do with a retrieved file.  The I<save> alternative is default.
+The two others correspond to the B<-s> and B<-f> options.  Only one
+may be specified.
+
+=item Verbosity: I<quiet> | I<brief> | I<chatty>
+
+How much B<w3mir> informs you of it's progress.  I<Brief> is the
+default.  The two others correspond to the B<-q> and B<-c> switches.
+
+=item Cd: I<directory>
+
+Change to given directory before starting work.  If it does not exist
+it will be quietly created.  Using this option breaks the 'fixup'
+code so consider not using it, ever.
+
+=item HTTP-Proxy: I<server:port>
+
+see the B<-P> switch.
+
+=item HTTP-Proxy-user: I<username>
+
+=item HTTP-Proxy-passwd: I<password>
+
+These two are is used to activate authentication with the proxy
+server.  L<w3mir> only supports I<basic> proxy autentication, and is
+quite simpleminded about it, if proxy authentication is on L<w3mir>
+will always give it to the proxy.  The domain concept is not supported
+with proxy-authentication.
+
+=item Proxy-Options: I<no-pragma> | I<revalidate> | I<refresh> | I<no-store>
+
+Set proxy options.  There are two ways to pass proxy options, HTTP/1.0
+compatible and HTTP/1.1 compatible.  Newer proxy-servers will
+understand the 1.1 way as well as 1.0.  With old proxy-servers only
+the 1.0 way will work.  L<w3mir> will prefer the 1.0 way.
+
+The only 1.0 compatible proxy-option is I<refresh>, it corresponds to
+the B<-pflush> option and forces the proxy server to pass the request
+to a upstream server to retrieve a I<fresh> copy of the document. 
+
+The I<no-pragma> option forces w3mir to use the HTTP/1.1 proxy
+control header, use this only with servers you know to be new,
+otherwise it won't work at all.  Use of any option but I<refresh> will
+also cause HTTP/1.1 to be used.  
+
+I<revalidate> forces the proxy server to contact the upstream server
+to validate that it has a fresh copy of the document.  This is nicer
+to the net than I<refresh> option which forces re-get of the document
+no matter if the server has a fresh copy already.
+
+I<no-store> forbids the proxy from storing the document in other than
+in transient storage.  This can be used when transferring sensitive
+documents, but is by no means any warranty that the document can't be
+found on any storage device on the proxy-server after the transfer.
+Cryptography, if legal in your contry, is the solution if you want the
+contents to be secret.
+
+I<refresh> corresponds to the HTTP/1.0 header I<Pragma: no-cache> or
+the identical HTTP/1.1 I<Cache-control> option.  I<revalidate> and
+I<no-store> corresponds to I<max-age=0> and I<no-store> respectively.
+
+=item Authorization
+
+B<w3mir> supports only the I<basic> authentication of HTTP/1.0.  This
+method can assign a password to a given user/server/I<realm>.  The
+"user" is your user-name on the server.  The "server" is the server.
+The I<realm> is a HTTP concept.  It is simply a grouping of files and
+documents.  One file or a whole directory hierarchy can belong to a
+realm.  One server may have many realms.  A user may have separate
+passwords for each realm, or the same password for all the realms the
+user has access to.  A combination of a server and a realm is called a
+I<domain>.
+
+=over 8
+
+=item Auth-Domain: I<server:port/realm>
+
+Give the server and port, and the belonging realm (making a domain)
+that the following authentication data holds for.  You may specify "*"
+wildcard for either of I<server:port> and I<realm>, this will work
+well if you only have one usernme and password on all the servers
+mirrored.
+
+=item Auth-User: I<user>
+
+Your user-name.
+
+=item Auth-Passwd: I<password>
+
+Your password.
+
+=back
+
+These three directives may be repeated, in clusters, as many times as
+needed to give the necessary authentication information
+
+=item Disable-Headers: I<referer> | I<user>
+
+Stop B<w3mir> from sending the given headers.  This can be used for
+anonymity, making your retrievals harder to track.  It will be even
+harder if you specify a generic B<Agent>, like Netscape.
+
+=item Fixup: I<...>
+
+This directive controls some aspects of the separate program w3mfix.
+w3mfix uses the same configuration file as w3mir since it needs a lot
+of the information in the B<w3mir> configuration file to do it's work
+correctly.  B<w3mfix> is used to make mirrors more browseable on
+filesystems (disk or CDROM), and to fix redirected URLs and some other
+URL editing.  If you want a mirror to be browseable of disk or CDROM
+you almost certainly need to run w3mfix.  In many cases it is not
+necessary when you run a mirror to be used through a WWW server.
+
+To make B<w3mir> write the data files B<w3mfix> needs, and do nothing
+else, simply put
+
+=over 8
+
+  Fixup: on
+
+=back
+
+in the configuration file.  To make B<w3mir> run B<w3mfix>
+automatically after each time B<w3mir> has completed a mirror run
+specify
+
+=over 8
+
+  Fixup: run
+
+=back
+
+L<w3mfix> is documented in a separate man page in a effort to not
+prolong I<this> manpage unnecessarily.
+
+=item Index-name: I<name-of-index-file>
+
+When retriving URLs ending in '/' w3mir needs to append a filename to
+store it localy.  The default value for this is 'index.html' (this is
+the most used, its use originated in the NCSA HTTPD as far as I know).
+Some WWW servers use the filename 'Welcome.html' or 'welcome.html'
+instead (this was the default in the old CERN HTTPD).  And servers
+running on limited OSes frequently use 'index.htm'.  To keep things
+consistent and sane w3mir and the server should use the same name.
+Put
+
+  Index-name: welcome.html
+
+when mirroring from a site that uses that convention.
+
+When doing a multiserver retrival where the servers use two or more
+different names for this you should use B<Apply> rules to make the
+names consistent within the mirror.
+
+When making a mirror for use with a WWW server, the mirror should use
+the same name as the new server for this, to acomplish that
+B<Index-name> should be combined with B<Apply>.
+
+Here is an example of use in the to latter cases when Welcome.html is
+the prefered I<index> name:
+
+  Index-name: Welcome.html
+  Apply: s~/index.html$~/Welcome.html~
+
+Similarly, if index.html is the prefered I<index> name.
+
+  Apply: s~/Welcome.html~/index.html~
+
+I<Index-name> is not needed since index.html is the default index name.
+
+=back
+
+=head1 EXAMPLES
+
+=over 4
+
+=item * Just get the latest Dr-Fun if it has been changed since the last
+time
+
+ w3mir http://sunsite.unc.edu/Dave/Dr-Fun/latest.jpg
+
+=item * Recursively fetch everything on the Star Wars site, remove
+what is no longer at the server from the mirror:
+
+ w3mir -R -r http://www.starwars.com/
+
+=item * Fetch the contents of the Sega site through a proxy, pausing
+for 30 seconds between each document
+
+ w3mir -r -p 30 -P www.foo.org:4321 http://www.sega.com/
+
+=item * Do everything according to F<w3mir.cfg>
+
+ w3mir -cfgfile w3mir.cfg
+
+=item * A simple configuration file
+
+ # Remember, options first, as many as you like, comma separated
+ Options: recurse, remove
+ #
+ # Start here:
+ URL: http://www.starwars.com/
+ #
+ # Speed things up
+ Pause: 0
+ #
+ # Don't get junk
+ Ignore: *.cgi
+ Ignore: *-cgi
+ Ignore: *.map
+ #
+ # Proxy:
+ HTTP-Proxy: www.foo.org:4321
+ #
+ # You _should_ cd away from the directory where the config file is.
+ cd: starwars
+ #
+ # Authentication:
+ Auth-domain: server:port/realm
+ Auth-user: me
+ Auth-passwd: my_password
+ #
+ # You can use '*' in place of server:port and/or realm:
+ Auth-domain: */*
+ Auth-user: otherme
+ Auth-user: otherpassword
+
+=item Also:
+
+ # Retrive all of janl's home pages:
+ Options: recurse
+ #
+ # This is the two argument form of URL:.  It fetches the first into the second
+ URL: http://www.math.uio.no/~janl/ math/janl
+ #
+ # These says that any documents refered to that lives under these places
+ # should be gotten too.  Into the named directories.  Two arguments are
+ # required for 'Also:'.
+ Also: http://www.math.uio.no/drift/personer/ math/drift
+ Also: http://www.ifi.uio.no/~janl/ ifi/janl
+ Also: http://www.mi.uib.no/~nicolai/ math-uib/nicolai
+ #
+ # The options above will result in this directory hierarchy under
+ # where you started w3mir:
+ # w3mir/math/janl		files from http://www.math.uio.no/~janl
+ # w3mir/math/drift		from http://www.math.uio.no/drift/personer/
+ # w3mir/ifi/janl		from http://www.ifi.uio.no/~janl/
+ # w3mir/math-uib/nicolai	from http://www.mi.uib.no/~nicolai/
+
+=item Ignore-RE and Fetch-RE
+
+ # Get only jpeg/jpg files, no gifs
+ Fetch-RE: m/\.jp(e)?g$/
+ Ignore-RE: m/\.gif$/
+
+=item Apply
+
+As I said earlier, B<Apply> has not been used for Real Work yet, that
+I know of.  But B<Apply> I<could>, be used to map all web servers at
+the university of Oslo inside the scope of retrieval very easily:
+
+  # Start at the main server
+  URL: http://www.uio.no/
+  # Change http://*.uio.no and http://129.240.* to be a subdirectory
+  # of http://www.uio.no/.
+  Apply: s~^http://(.*\.uio\.no(?:\d+)?)/~http://www.uio.no/$1/~i
+  Apply: s~^http://(129\.240\.[^:]*(?:\d+)?)/~http://www.uio.no/$1/~i
+
+
+=back
+
+There are two rather extensive example files in the B<w3mir> distribution.
+
+=head1 BUGS
+
+=over 4
+
+=item The -lc switch does not work too well.
+
+=back
+
+=head1 FEATURES
+
+These are not bugs.
+
+=over 4
+
+=item URLs with two /es ('//') in the path component does not work as
+some might expect.  According to my reading of the URL spec. it is an
+illegal construct, which is a Good Thing, because I don't know how to
+handle it if it's legal.
+
+=item If you start at http://foo/bar/ then index.html might be gotten
+twice.
+
+=item Some documents point to a point above the server root, i.e.,
+http://some.server/../stuff.html.  Netscape, and other browsers, in
+defiance of the URL standard documents will change the URL to
+http://some.server/stuff.html.  W3mir will not.
+
+=item Authentication is I<only> tried if the server requests it.  This
+might lead to a lot of extra connections going up and down, but that's
+the way it's gotta work for now.
+
+=back
+
+=head1 SEE ALSO
+
+L<w3mfix>
+
+=head1 AUTHORS
+
+B<w3mir>s authors can be reached at I<w3mir-core@usit.uio.no>.
+B<w3mir>s home page is at http://www.math.uio.no/~janl/w3mir/
Index: /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3pdfuri.pm
===================================================================
--- /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3pdfuri.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/w3mir/w3mir-1.0.8/w3pdfuri.pm	(revision 21083)
@@ -0,0 +1,64 @@
+# -*- perl -*-
+#
+# w3pdfuri.pm -- extract uris from a adobe acrobat pdf file.
+#     version 0.1
+$VERSION=0.1;
+#
+# Assumptions:
+# - File starts with %PDF
+# - All URLS match this RE: ^\/URI\s+\(([^)]*)\)\s*$  (found by inspection of
+#   one (1) pdf file (the reader.pdf in the acrobat distribution).
+# - pdf files are potentially very large, so we read it from disk
+#   record by record.
+# - Record separator is ^M
+#
+# History:
+# - 19/02/97 janl: Version 0.1, seems to work with PDF-1.2
+#
+
+package w3pdfuri;
+
+use strict;
+
+sub list ($) {
+  my ($file) = @_;
+
+  my @urls=();
+  local($/)="\r";
+
+  unless (open(PDF,"< $file")) {
+    warn "Could not open $file for input: $!\n";
+    return;
+  }
+
+  $_ = <PDF>;
+  unless (/^%PDF-/) {
+    warn "$file is not a PDF file.\n";
+    close(PDF);
+    return;
+  }
+  
+  while (<PDF>) {
+    chomp;
+    push(@urls,$1) if (m~^/URI\s+\(([^)]*)\)\s*$~);
+  }
+
+  close(PDF);
+
+  return @urls;
+}
+
+1;
+
+__END__
+
+# Test code
+print "reader.pdf: ",
+  join(",",list("/local/lib/acrobat/Reader/help/reader.pdf")),"\n";
+print "Acrobat.pdf: ",
+  join(",",list("/local/lib/acrobat/Reader/Acrobat.pdf")),"\n";
+print "License.pdf: ",
+  join(",",list("/local/lib/acrobat/Reader/License.pdf")),"\n";
+print "MapTypes.pdf: ",
+  join(",",list("/local/lib/acrobat/Reader/MapTypes.pdf")),"\n";
+list("/etc/services");
Index: /main/tags/2.38/gsdl/packages/wget/README
===================================================================
--- /main/tags/2.38/gsdl/packages/wget/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/wget/README	(revision 21083)
@@ -0,0 +1,12 @@
+wget - web site mirroring software
+
+This directory contains a version of the GNU wget program that was written by
+Hrvoje Niksic and others and distributed under the GNU General Public Licence
+
+The GNU wget homepage is http://www.cg.tuwien.ac.at/~prikryl/wget.html
+
+A couple of very small changes were made to this package by Stefan Boddie
+(sjboddie@cs.waikato.ac.nz). The USE_STDARG preprocessor definition was
+added to the VC++ makefile as it appeared to need it to compile on either
+VC++ 4.2 or VC++ 6.0. A change was also made to prevent backslashes from
+mistakenly being converted to "@5c" on windows.
Index: /main/tags/2.38/gsdl/packages/windows/crypt/README.TXT
===================================================================
--- /main/tags/2.38/gsdl/packages/windows/crypt/README.TXT	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/windows/crypt/README.TXT	(revision 21083)
@@ -0,0 +1,7 @@
+This directory contains a win32 port of the crypt library (see the enclosed
+README files for details). To compile with Microsoft Visual C++ unzip
+crypt.zip and run "nmake /f win32.mak" in the top level directory.
+
+Link crypt.lib with your project when compiling Greenstone.
+
+Stefan Boddie (sjboddie@cs.waikato.ac.nz)
Index: /main/tags/2.38/gsdl/packages/windows/gdbm/README.TXT
===================================================================
--- /main/tags/2.38/gsdl/packages/windows/gdbm/README.TXT	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/windows/gdbm/README.TXT	(revision 21083)
@@ -0,0 +1,7 @@
+This directory contains a win32 port of gdbm. To compile with Microsoft
+Visual C++ unzip gdbm.zip and run "nmake /f win32.mak" in the top level
+directory.
+
+Link gdbm.lib with your project when compiling Greenstone.
+
+Stefan Boddie (sjboddie@cs.waikato.ac.nz)
Index: /main/tags/2.38/gsdl/packages/wv/README
===================================================================
--- /main/tags/2.38/gsdl/packages/wv/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/wv/README	(revision 21083)
@@ -0,0 +1,16 @@
+wv - Microsoft Word converter
+
+This directory contains a version of the wv program.  It was originally
+written by Caolan McNamara and distributed under the GNU General Public
+License.  wv is now maintained by Dom Lachowicz and Martin Vermeer.  wv
+incorporates code from a variety of GPL programs from other sources.
+Thank you all.
+
+The wv homepage is http://wvware.sourceforge.net/
+
+We have included the source code here.  It is a slimmed-down version
+of wv version 0.7.1. It should handle documents created with Word 2 up
+to Word 2000. We have tested it on Linux (slackware 7), darwin (OS X
+10.1.3), cygwin, and solaris 2.8 (via sourceforge's compile farm).
+
+John McPherson -- Apr 2002
Index: /main/tags/2.38/gsdl/packages/xlhtml/README.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/xlhtml/README.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/xlhtml/README.txt	(revision 21083)
@@ -0,0 +1,19 @@
+This package contains two programs:
+* ppthtml, which converts Microsoft PowerPoint 95 and 97 files
+into html or xml, and
+* xlhtml, which converts Microsoft Excel 95 and 97 files.
+
+It has been slightly modified for greenstone use as we only want the
+ppt to html program and the xls to html program, and none of the other
+programs (summary/diagnostics, man pages, etc).
+
+This version (0.4.9.0) was the latest development snapshot at the
+time of writing.
+
+See http://www.xlhtml.org/ for newer versions or more info.
+
+xlhtml is released under the GNU GPL.
+
+20 Feb 2002
+John McPherson
+NZDL.
Index: /main/tags/2.38/gsdl/packages/yaz/CHANGELOG
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/CHANGELOG	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/CHANGELOG	(revision 21083)
@@ -0,0 +1,541 @@
+Possible compatibility problems with earlier versions marked with '*'.
+
+--- 1.6 2000/03/03
+
+Added configure option --enable-comp/disable-comp to control use
+of YAZ ASN.1 compiler. Use --disable-comp to use the old *coders
+located in sub directory asn.
+
+YAZ ASN.1 compiler renamed to yaz-comp in sub directory. It's installed
+in ${exec_prefix}/bin along with the other programs yaz-client and
+yaz-ztest.
+
+GNU automake used to maintain makefiles.
+
+Added several OID's.
+
+Changed retrieval module so that we can load records with no abstract
+syntax defined. Tagpaths in these records are fully composed of string
+tags.
+
+Implemented ISO ILL protocol. Refer to stuff in sub directory ill.
+
+--- 1.5 1999/12/10
+
+On UNIX, the generated makefile now supports a proper 'make install'.
+The prefix can be set via GNU configure to set the install location
+(default is /usr/local).
+
+* YAZ programs client and ztest were renamed to yaz-client and
+yaz-ztest to avoid conflicts when users install YAZ in "standard"
+locations, such as /usr/bin,/usr/local/bin,etc.
+
+* YAZ Header files were moved from include to include/yaz. YAZ Header
+files are referred to as include <yaz/log.h> rather than <log.h>.
+The YAZ include path (-I ..) is therefore the same as before. Programmers
+should update their #include statements or use -Ipath/include/yaz
+instead. The main motivation for doing this change is that YAZ header files
+can be installed in "standard" locations /usr/include,/usr/local/include 
+without introducing conflicts, since ALL YAZ header files are stored
+in subdirectory yaz (under /usr/include for example).
+
+Compilation of YAZ for WIN32 is now handled by an nmake-style makefile 
+rather than project/workspace files. We switched because project files
+are incompatible between Visual C++ 5 and 6. Refer to windows.txt for
+details.
+
+Changed name of logging function, logf, to yaz_log, to prevent name
+clash with some math-log functions. The YAZ header log.h defines logf
+to yaz_log (#define) so there should be no incompatibilities by this
+modification.
+
+Added bend_start/bend_stop handlers for server. These handler are
+called on start/stop of server. For windows they are called whenever
+a service is started/stopped.
+
+* YAZ now auto-generates decoders/encoders for the Z39.50 protocol using
+a fairly small ASN.1 compiler written in Tcl. The compiler is located
+in util/yc.tcl. The auto-generated C code structures are, in a few
+cases, incompatible with the old decoders. There are differences in the
+following C structures Z_DiagRec, Z_External, Z_SortRequest, Z_SortResponse,
+Z_AttributesPlusTerm, Z_ProximityOperator, Z_DefaultDiagFormat.
+The preprocessor variable ASN_COMPILED is defined when the compiled
+ASN.1 is being used. Encoder/decoder routines as well as the Z39.50
+protocol ASN.1 is located sub directory <tt>z39.50</tt>. If you
+wish to use the old encoders/decoders you can specify --disable-yc
+for configure.
+
+Assigned OID for old DB Update (VAL_DBUPDATE0). Updated YAZ compiled
+version so that it supports both new - and old version of DB Update
+
+* Added 'name' parameter to ODR encoder/decoder routines to facilitate
+pretty ODR print. Updated whole Z39.50 encoder/decoder to reflect the
+change. The name parameter can be set to 0 in which no name is specified
+for the construction. The macros odr_implicit and odr_explicit sets name
+parameter to zero for the construction involved. New macros
+odr_implicit_tag and odr_explicit_tag are similar to the others,
+except that a name parameter is added. For programmers' that don't use
+ODR they probably only need to change the call to z_APDU and z_External.
+
+Added access control facility by interfacing the TCP wrapper library.
+YAZ automatically attempts to find the TCP wrapper Library (-lwrap) and
+tcpd.h on Unix systems. For the server, option -d<daemon> specifies the
+name of the daemon and enables the access control as specified in
+hosts.allow/hosts.deny. Refer to man pages tcpd(8) and hosts_access(5).
+
+Fixed memory leak in ccl_find_str and ccl_qual_rm. Thanks to Hans van
+den Dool <H.M.vdnDool@kub.nl>.
+
+Added reference ID parameter to most functions in server API - refer
+to backend.h. Thanks to Hans van den Dool <H.M.vdnDool@kub.nl>.
+
+Changed name of ccl library to libccl.a (was ccl.a).
+
+Fixed bug in decoder for Explain (Category TargetInfo).
+
+Added support for GNU readline in client. Thanks to Jacob Poulsen
+<ja7@dbc.dk>. GNU configure attempts to detect if readline is available.
+
+* CHANGED DEFINITION OF ES: UPDATE (INCLUDING THE OID) to reflect the
+new definition from the ZIG. NOTE THIS IF YOU HAVE AN UPDATE
+IMPLEMENTATION! This change was made to the development version before
+the ZIG decided to retract the amendment. If any users MUST be
+compatible with the original Update definition, PLEASE CONTACT US, and
+we will include a separate definition corresponding to the old Update
+ES. Note that because of the change to the ASN.1 of the
+TaskPackageRecordStructure we cannot define a single structure that
+will support both versions.
+
+* Added const modifier to buffer parameter for some ODR/BER encoding
+routines: ber_dectag, ber_declen, odp_more_chunks, completeBER,
+completeWAIS, odr_dumpBER.
+
+Fixed bug in client.c which caused a crash when a scanResponse didn't
+contain positionOfTerm.
+
+* Fixed inconsistency in the ScanResponse/ListEntries protocol. This
+* will cause an error in a client if a non-YAZ target sends both a
+* list of Scan entries and non-surrogate diagnostics.
+
+Retrieval module enhancements. Tag sets may be typed in the reference
+to it. From the .abs-file the "tagset" directive takes a third optional
+integer type for the tag set referenced. From a .tag-file the "include"
+directive takes a third optional type as well. The old "type" directive
+in the tag set itself is still recognized but acts as the default type
+for the tag set.
+
+Backend interface change. Individual Scan terms returned from bend_scan
+may also be tagged as Surrogate Diagnostics. Refer to struct scan_entry
+in include/backend.h.
+
+Retrieval module enhancements. Multiple tag sets and attribute sets may
+be specified in abstract syntax specs. Revised the error/warning for
+logging messages reported by the retrieval module when reading the
+various spec files.
+
+Object Identifier system (oid_..) changed. The API is backwards
+compatible but the oid-routines now allocates new OID's when needed.
+Raw OID's may be specified in oid_getvalbyname.
+
+YAZ now uses GNU configure to generate Makefile(s).
+
+* Minor changes in some of the member names of DeleteResultSetRequest and
+DeleteResultSetResponse. See include/proto.h.
+
+* Changed some C definitions regarding EXPLAIN record syntax (prt-exp.h)
+and added member 'languages' in TargetInfo (which was missing).
+
+Changed the way attribute sets are handled in the retrieval
+module. These are now cached, just like the abstract syntaxes
+(schemas).
+
+Changed YAZ so that it links with compiled ASN.1.
+
+Added Explain-schema definitions and mapping routines. The following
+Explain categories have been implemented: AttributeDetails,
+AttributeSetInfo, DatabaseInfo, CategoryList and TargetInfo.
+
+Fixed minor bug in Windows version of Server Library.
+
+--- 1.4pl2+ 1998/4/17 (Released with Zebra)
+
+Added Extended Services to server (backend.h). Thanks to Charles Woodfield.
+
+Added EXTERNAL: UNIverse Resource Report (non-standard).
+
+Implemened odr_enum and odr_set_of functions to handle ASN.1 types
+ENUMERATED and SET OF.
+
+* Added 'const' to some of the char pointer arguments for the
+functions, data1_read_node, data1_getelementbytagname,
+data1_insert_taggeddata, data1_getesetbyname, data1_getelementbyname,
+data1_get_absyn.
+
+Fixed bug in data1_insert_taggeddata - the last_child member of
+parent wasn't initialised.
+
+* Changed data1_read_record and data1_read_node so that the supplied
+"SGML"-buffer is read-only. In particular the resulting data1 - tree
+doesn't refer to any parts of the "SGML"-buffer.
+
+Fixed bug in server library (Windows version of statserv_remove).
+
+* Changed code so that it compiles as C++. The type definition
+of Odr_fun which is a member of Odr_arm was changed. The result is,
+that an explicit typecast is needed for the fun pointer when
+using Odr_arm - as in:
+    {1, -1, -1, Z_IdAuthentication_idPass, (Odr_fun)z_IdPass},
+
+Updated TagSet-G and -M definitions (tagsetm.tag and tagsetg.tag).
+
+Implemented the new structured date and time definition as approved
+by the ZIG. Added schemaId element to the specificTag in Espec-1
+(also approved at the last ZIG). Thanks to RVDM.
+
+Added some Object identifiers (RVDM).
+
+Changed the Update Extended Service (RVDM).
+
+Added command "refid" to client which specifies referenceId for
+the following requests.
+
+Implemented extended service handling for server. See ztest.c
+for an example as well as backend.h. New handlers are registerd
+in the Init handler.
+
+* Changed interface for sort in server.
+
+Added new members to statserv_options_block. It allows a server
+to read options from another source than just the command line. Thanks
+to Charles Woodfield.
+
+* Changed definition of Z_Triple in file prt-grs.h - member boolean
+renamed to zboolean. Some C++ compilers complained about the name.
+
+Minor changes to gils.abs. Added index 's' (sort) on title
+and date/time-last-modified.
+
+--- 1.4pl2 1998/1/30
+
+Fixed bug in server library regarding inetd mode (-i). This bug
+was introduced by release 1.4.
+
+--- 1.4pl1 1998/1/29
+
+Added sort facility in client and backend server interface.
+
+Fixed problem with dependencies in Makefile(s).
+
+Fixed bugs for encoders/decoders of extended services and 
+SearchInfoReport.
+
+Implemented sub-tree feature for schemas. Sub-trees are
+referenced in *.abs-files. See explain.abs for an example
+of the use of this feature.
+
+Modified bib1.att; local attributes for ANY didn't include
+ANY itself (only affects use of the retrieval module).
+
+Fixed bug in plain SGML reader in function data1_read_node:
+tags with prefix "var" was incorrectly interpreted as variants.
+
+Added feature "sub-schemas" to enable references to - and definitions
+of - group of elements.
+
+* Removed member parent from type data1_element (in data1.h).
+
+Implemented function odr_nullval() that returns the value of
+ODR_NULLVAL.
+
+* Removed member num_children from data1_node (in data1.h).
+
+Made NT service interface part of the server library. The
+function statserv_main uses the NT service when required and
+calls the statserv_start / statserv_close routines.
+
+Routine zget_SearchRequest and zget_PresentRequest fills
+resultSetName/Id member with "default" instead of "Default".
+
+Fixed memory leak in server. Request queue member wasn't freed.
+
+Fixed nmem_exit so that memory is freed.
+
+--- 1.4 1997/10/2
+
+Revised the CCL parser utility to be thread safe.
+
+Added function, oid_ent_to_oid, to replace the function 
+oid_getoidbyent, which is not thread safe.
+
+* Added nmem_init and nmem_exit to initialize and release
+NMEM resources. Function nmem_init should be called once in the
+initial thread before NMEM/ODR is used. statserv.c and client.c
+have been changed accordingly. The change was necessary to make
+NMEM thread safe. The NMEM memory pool is shared amongst threads
+in a process. Unix-based applications will still work fine without
+calling this.
+
+Added NT Services interface for the the Z39.50 (statserv) Server. 
+Refer to the ztest.c source on the usage.
+
+Windows 95/NT port using MSVC5.0. Project files are included in the
+distribution.
+
+* Defined new 'global' handle for the retrieval (data1) system. The
+new handled, data1_handle, describes the state of the data1 system.
+This handle is passed as first argument to virtually all
+data1 related routines. The functions data1_create and data1_destroy
+creates and destroys a data1 handle respectively.
+
+Added ODR encode stream member to all backend request structures
+init, search, scan etc. This stream should be used to allocate all
+memory used for the response when thread safe operation is needed.
+
+Changed the comstack utility, cs_addstr, to be thread safe. The
+returned hostname string returned by the function is now part the
+COMSTACK instance.
+
+Added comstack utility, cs_straddr, which replaces the tcpip_strtoaddr
+function. The cs_straddr takes a COMSTACK handle as argument, so this
+function must be used after cs_create and before bind/connect.
+This function is thread safe.
+
+Moved test server to 'ztest' directory - generic server code still
+in 'server' directory.
+
+Made prefix query (pquery.c) utility thread safe.
+
+Added new function modifier YAZ_EXPORT to 'export' public DLL
+functions when using windows (see include/yconfig.h).
+
+Added definitions to the OID database (util/oid.c) (RVDM).
+
+Added new BIB-1 diagnostic messages to the handler diagbib1_str.
+
+Added call to ccl_rpn_delete in client program.
+
+Added ODR argument to ccl_rpn_query and ccl_scan_query to provide
+release of RPN structure.
+
+Added support for C++, headers uses extern "C" for public definitions.
+With input from RVDM.
+
+In handling of SEQUENCE OF: Counter set to zero when SEQUENCE OF is absent.
+Thanks to Ronald van der Meer (RVDM).
+
+Added initializers (zget_ routines) for a number of PDUs. Thanks to RVDM.
+
+Added support for private extensions to the OID database
+(oid_setprivateoids()). Thanks to RVDM.
+    
+Added optional, physical ANY (key replication)
+
+Fixed null-reference problem in GRS-1 output filter.
+
+Proximity operator added to Prefix Query Format (PQF).
+
+In test client command "base" accepts multiple databases.
+
+Fixed bug in cs_close stack that caused trouble with WINSOCK.
+
+--- 1.3 1996/10/11
+
+Fixed tagging bug in ResourceReportResponse PDU encoder/decode.
+
+Smallish bug-fixes in the new encoders/decoders (explain).
+
+Bug fixed in DeleteRequest.
+
+Fixed tagging bug of type 101 query in SearchRequest-Query PDU encoder/decoder.
+
+Fixed tagging bug in ResourceReportResponse PDU encoder/decode.
+
+Added SOIF syntax (using private OID for now) to retrieval module and client.
+
+Added Update extended service.
+
+Added SearchResult-1 additional info structure.
+
+Added optional CCL (ISO8777) interpreter as separate module. Available
+in linemode client.
+
+--- 1.2 1996/6/10 (1st anniversary release)
+
+Added Summary record syntax. Lightly tested.
+
+Added OPAC record syntax. Untested.
+
+Added ResourceReport service encoders/decoders. Untested.
+
+Fixed bug in z_Unit - wrong tagging on unitSystem.
+
+Fixed bug in the DiagRecs decoder.
+
+Added options for max PDU size and session timeout to frontend-server.
+
+Added documentation of query-language parsers and other supporting utilities.
+
+[frontend-server] Added Attribute set to the bend_scanrequest API.
+
+[frontend-server] NextResultSetPosition was sometimes set incorrectly when
+surrogate diagnostics were generated.
+
+[retrieval] Allow multiple local values for attribute.
+
+[retrieval] Allow multiple attributes per element in .abs files. index type.
+
+[retrieval] Added Summary tagset, abstract syntax, and d1-node/ASN filter.
+
+--- 1.1pl2  1996/4/10
+
+Minor changes, mostly specific to Zebra's requirements (retrieval)
+
+--- 1.1  1996/2/20
+
+Repaired bug in frontend server when running multiple listening
+endpoints in dynamic mode.
+
+z_External() now won't break if a known, ASN.1 value comes encapsulated
+in an octet-string. The value will pass through unmodified in an Odr_oct.
+
+Added a bit of code to the demo client to decode & display
+ASN.1-structured records represented in the octet-aligned branch of
+the EXTERNAL CHOICE. Thanks to CAS for prodding us to finally do this.
+
+Added z_ext_getentbyref() to the ASN module. Doc updated.
+
+* Completed the SCAN definition in the ASN module. This may break SCAN
+code based on older YAZ-versions at compile-time. The fix is easy -
+look in proto.h.
+
+* Added 'displayTerm' and OtherInformation to the TermInfo structure
+under the SCAN definition. Remember to initialize this, server-people.
+
+Comstack should now support the WAIS protocol in TCP/IP mode. Note
+that this does not extend to ODR and ASN.
+
+Comstack allows insertion of established socket (primarily for
+inetd-operation of servers). Doc updated.
+
+Front-end server can now start from the inetd in TCP mode. Doc
+updated.
+
+--- 1.0pl4 1996/1/24
+
+Added Sort PDU.
+
+Fixed small problem in SUTRS-filter. A newline was sometimes inserted before
+the rank and record number.
+
+Adjustments to the frontend server.
+
+Fixed diagnostic BER dumper. It ignored the file argument.
+
+--- 1.0pl3 1996/1/2
+
+Various changes to retrieval module.
+
+Changed the union discriminators of the protocol files from enums to
+ints paired with #defines.
+
+*Changed oident.class to oident.oclass to avoid a reserved word in C++
+ compilers.
+
+*Changed operator in the RPN structure to 'roperator', again to avoid a
+ conflict with C++.
+
+Fixed problems in Explain decoders/encoders.
+
+--- 1.0pl2 1995/12/6
+
+Memory bug in log module fixed.
+
+--- 1.0pl1 1995/12/5
+
+Occasional malloc() of 0 bytes fixed in d1_espec.c.
+
+Bug in Explain DatabaseInfo module fixed.
+
+Some '\r' snuck into one or two of the ret'l config tables. A curse on Windows.
+
+--- 1.0 1995/11/28
+
+The shift to v1.0 signals that we now consider the *core* functionality
+of YAZ reasonably stable (the core being more or less equivalent to
+Z39.50-1992). Some of the really nifty v3 stuff is still not heavily
+tested (Explain not at all - though that will happen soonish).
+
+Minor changes to code to support Windows port.
+
+Various minor changes after we're getting to use GRS-1 & co. more.
+
+Added Espec-1 format.
+
+Added VisibleString field body type to GRS-1. It is illegal acc. to my copy
+of the protocol and it cannot be selected when encoding (maps into 'string'
+when decoding). Needed to talk to some servers.
+
+Demo client can request simple element set names.
+
+Added Diagnostic Format encoders/decoders.
+
+Added simple Close handling to frontend server (no hooks for resource
+reporting yet), and demonstration client.
+
+Added cs_addrstr() command to COMSTACK to retrieve peer hostname/address.
+
+--- 1.0b3 1995/08/24
+
+Fixed bug in the frontend-server. The numberOfRecordsReturned field was
+handled incorrectly when records were requested in the searchResponse. This
+will only affect you if you use the frontend-server.
+
+Added GRS-1 encoders/decoders to the service-level API. Lightly tested.
+Test-client will ask for and print GRS1. Ztest will return dummy records
+on request.
+
+Added Explain encoders/decoders to the service-level API. Untested.
+
+Added Extended Services: Item Order encoders and decoders to the Service-
+level API. Untested. We could use a recent copy of the pertinent bits
+of the ILL protocol to add those bits.
+
+Added diagnostic format 1 encoders/decoders to the service-level API.
+Untested.
+
+Moved pretty-printing of structure-wrappers ({..}) from odr_seq.c to
+odr_cons.c, which causes a more correct output.
+
+Fixed handling of searchRequest in frontend server. NextResultSetPosition
+was always set to 0 when no records were requested in the searchRequest.
+
+* Added better external-handling. This shouldn't harm old code that
+*encodes* externals. It can break code that looks for a
+'single-ASN1-type' representation, since those types that are known
+are now decoded immediately. Look at the SUTRS sample code in
+seshigh.c and client.c. Documentation updated.
+
+Handling of structured records in bend_fetchresponse. Length -1 marks
+structured record, type is deduced from format field.
+
+--- 1.0b2 1995/06/27
+Fairly quick maintenance release to add SUTRS support.
+
+Fixed handling of SUTRS records in the demonstration client.
+
+* Added format field to the bend_fetchrequest and bend_fetchresponce
+structures of the backend API (frontend server). When the record is
+returned, the value of the format field is mapped to an OID. The
+value VAL_SUTRS will also cause a slightly different ASN.1 packaging
+of the record. The special value VAL_NONE in the bend_request means
+that no specific format was requested by the client. Documentation
+updated accordingly. Test server (ztest) will return a fixed dummy
+SUTRS record if your client requests SUTRS.
+
+Documentation updated accordingly.
+
+You can now set external libraries and RANLIB support in the top-level
+Makefile.
+
+--- 1.0b 1995/06/19
+First public release.
Index: /main/tags/2.38/gsdl/packages/yaz/GSDL_USAGE.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/GSDL_USAGE.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/GSDL_USAGE.html	(revision 21083)
@@ -0,0 +1,124 @@
+<html>
+<head>
+<title>Using the Z39.50 Client in Greenstone</title>
+</head>
+
+<body>
+<a name=top>
+<h1>Using the Z39.50 Client in Greenstone</h1>
+</a>
+<b>Table of Contents</b><br>
+<a href="#whatis">About: What is Z39.50?</a><br>
+<a href="#config">Configuring Greenstone - Adding Servers</a><br>
+<a href="#todo">Currently known problems, and TODO list</a><br>
+<a href="#contact">Contacting Us</a><br>
+
+
+
+<a name=whatis>
+<h2>What is Z39.50?</h2>
+</a>
+Z39.50 is an international client/server protocol for searching bibliographic
+data. It can use the Internet Protocol (TCP/IP), which makes the databases
+on a server available from almost anywhere around the globe. It is widely
+used, for example, in on-line library catalogues. It allows a user to search
+one or more databases and retrieve the results of the query.
+
+<p>
+Our implementation uses the YAZ z39.50 toolkit, written by
+<a href="http://www.indexdata.dk">Index Data</a>.
+
+
+
+<a name=config>
+<h2>Adding Servers</h2>
+</a>
+The file z3950.cfg in the etc/packages directory contains entries for
+each server. By default, no servers are set up, although the config file
+comes with two (commented out) example Z39.50 servers, both for servers
+of the United States' <b>Library of Congress</b>.
+<p>
+Each entry consists of:
+<ul>
+<li>A unique "short name" for internal use by Greenstone.</li>
+<li>The internet name or address of the server, and optionally the
+port that the server is running on if not the default port 210.</li>
+<li>The name of the database to search on that server.</li>
+<li>A string that provides a meaningful name for the "collection".</li>
+<li>An optional "About" string, providing some information about the database
+and/or server.</li>
+<li>Optional icon fields, which are displayed instead of the text on the
+front page.</li>
+</ul>
+The entries need only be separated by whitespace, but for the purposes of
+clarity the sample entry uses newlines and tabs.
+<p>
+The sample Library of Congress entry looks like this:
+<pre>
+LOC
+        z3950.loc.gov:7090
+        Voyager
+        "Library of Congress z39.50 server"
+        About  en  "This is the z39.50 interface to the US LoC catalogue
+           system. It contains approximately 12 million bibliographic records.
+           For server capabilities, look at
+	   &lt;a href=\"http://lcweb.loc.gov/z3950/lcserver.html\"&gt;their web pages&lt;/a&gt;."
+</pre>
+There is a list at the Library Of Congress website containing some 
+<a href="http://lcweb.loc.gov/z3950/agency/resources/testport.html">servers 
+publicly available for testing</a>.
+
+
+<a name=todo>
+<h2>Known Problems/Issues list</h2>
+</a>
+<ul>
+<li>Because of the open nature of the standard, our client may not work with
+some servers. Please notify the author (contact details below) of any
+such problems.</li>
+<li>Because of the large number of Marc fields, only the most frequently
+used fields have been given explicit names in the results. Furthermore,
+these are currently hard-coded to correspond to the USMARC field names.</li>
+<li><b>The z39.50 client will not work when fast-cgi is used!</b>. Currently,
+the use of the fast-cgi package (off by default) will disable the
+use of the z39.50 client code for Greenstone.</li>
+<li>There are spurious &lt;B&gt; tags in the title of the window when
+viewing an individual record.</li>
+<li>Greenstone will claim there are no collections if there are no
+sub-directories in the "collect" directory, even if there are configured
+z39.50 servers, although it will work if there are unbuilt collections.</li>
+</ul>
+
+<b>History</b><br>
+Jul 2001 - finally tracked down and fixed an annoying bug that caused
+greenstone to segfault when retrieving documents for some queries.<br>
+Jun 2001 - decided to drop href for field 856, as some examples have 
+explanatory text in the field as well as the URI.<br>
+Oct 2000 - cache results from server, so cut down the number of connections for
+a single query/document. Also added href for MARC field 856.<br>
+Aug 2000 - Various bug fixes and minor modifications.<br>
+Fri Aug 4 2000 - The z39.50 code is now "stable" in the main source code (in CVS).<br>
+Tue 1 Aug 2000 - selecting a field from the drop-down box now actually works. 
+This results in both quicker replies and more accurate results.<br>
+Mon 24 Jul 2000 - queries are now "AND"ed - for example, the query "computer 
+science" will now only return records that contain both words.<br>
+May-June 2000 - Code written.<br>
+
+<a name=contact>
+<h2>Contact Details</h2>
+</a>
+For general comments about Greenstone, or suggestions for improvements, send
+email to
+<a href="mailto:greenstone@cs.waikato.ac.nz?subject=z39.50 client in Greenstone">greenstone@cs.waikato.ac.nz</a><br>
+<br>
+For bug reports or questions about the z39.50 code itself, send email to
+the author, John McPherson -
+<a href="mailto:jrm21@cs.waikato.ac.nz?subject=z39.50 client in Greenstone"
+>jrm21@cs.waikato.ac.nz</a>.
+
+<p>
+<a href="#top">Back to top</a>
+<p>
+<address>Last modified: July 12, 2001 by John McPherson</address>
+</body>
+</html>
Index: /main/tags/2.38/gsdl/packages/yaz/LICENSE
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/LICENSE	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/LICENSE	(revision 21083)
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
Index: /main/tags/2.38/gsdl/packages/yaz/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/Makefile.am	(revision 21083)
@@ -0,0 +1,26 @@
+AUTOMAKE_OPTIONS = foreign 
+
+DIST_SUBDIRS=util odr z39.50 asn ill zutil comstack ccl tab retrieval server lib include client ztest doc
+
+SUBDIRS = @SUBDIRS_VAR@
+
+noinst_SCRIPTS = yaz-config
+SPEC_FILE=$(PACKAGE).spec
+EXTRA_DIST=$(SPEC_FILE) README LICENSE CHANGELOG TODO windows.txt
+
+yaz-config:
+	@echo "#!/bin/sh" >yaz-config
+	@echo "# YAZ settings for developers" >>yaz-config
+	@echo "YAZBIN=\"`pwd`/bin\"" >>yaz-config
+	@echo "YAZTAB=\"`pwd`/tab\"" >>yaz-config
+	@echo "YAZLIB=\"-L`pwd`/lib -lyaz @LIBS@\"" >>yaz-config
+	@echo "YAZINC=\"-I`pwd`/include\"" >>yaz-config
+	chmod +x yaz-config
+
+dist-hook:
+	mkdir $(distdir)/win
+	-cp $(srcdir)/win/* $(distdir)/win
+
+rpm: $(PACKAGE)-$(VERSION).tar.gz
+	cp $(PACKAGE)-$(VERSION).tar.gz /usr/src/redhat/SOURCES
+	rpm -ba $(SPEC_FILE)
Index: /main/tags/2.38/gsdl/packages/yaz/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/Makefile.in	(revision 21083)
@@ -0,0 +1,154 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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.
+
+#######
+# Modified for the NZDL Greenstone project. The original is still in
+# Makefile.am, for processing with automake.
+#######
+
+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 = .
+
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+DIST_SUBDIRS = util odr z39.50 asn ill zutil comstack ccl tab retrieval server lib include client ztest doc
+
+SUBDIRS = @SUBDIRS_VAR@
+
+SPEC_FILE = $(PACKAGE).spec
+EXTRA_DIST = $(SPEC_FILE) README LICENSE CHANGELOG TODO windows.txt
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = config.status config.cache config.log
+
+DIST_COMMON =  Makefile.am Makefile.in TODO aclocal.m4 configure \
+configure.in install-sh missing mkinstalldirs
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+
+
+all: all-recursive
+# make install should not do anything for greenstone (I hope...)
+install:
+clean: clean-recursive
+distclean: distclean-recursive
+	-rm -f Makefile $(CONFIG_CLEAN_FILES)
+
+
+# Don't want Makefile.in automatically re-generated from Makefile.am...
+#
+# .SUFFIXES:
+# $(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
+#	cd $(top_srcdir) && $(AUTOMAKE) --foreign --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)
+
+# 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.
+
+# @SET_MAKE@
+
+clean-recursive all-recursive:
+	set fnord $(MAKEFLAGS); amf=$$2; \
+	target=`echo $@ | sed s/-recursive//`; \
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  (cd $$subdir && $(MAKE) $$target) \
+	   || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
+	done;
+#	  echo "Making $$target in $$subdir"; 
+
+distclean-recursive:
+	for subdir in $(SUBDIRS); do \
+	(cd $$subdir && test -e Makefile && $(MAKE) distclean); done
+
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+
+
+.PHONY: all install clean distclean \
+	all-recursive distclean-recursive clean-recursive  \
+	distdir top_distdir yaz-config dist-hook rpm
+
+yaz-config:
+	@echo "#!/bin/sh" >yaz-config
+	@echo "# YAZ settings for developers" >>yaz-config
+	@echo "YAZBIN=\"`pwd`/bin\"" >>yaz-config
+	@echo "YAZTAB=\"`pwd`/tab\"" >>yaz-config
+	@echo "YAZLIB=\"-L`pwd`/lib -lyaz @LIBS@\"" >>yaz-config
+	@echo "YAZINC=\"-I`pwd`/include\"" >>yaz-config
+	chmod +x yaz-config
+
+dist-hook:
+	mkdir $(distdir)/win
+	-cp $(srcdir)/win/* $(distdir)/win
+
+rpm: $(PACKAGE)-$(VERSION).tar.gz
+	cp $(PACKAGE)-$(VERSION).tar.gz /usr/src/redhat/SOURCES
+	rpm -ba $(SPEC_FILE)
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/README.gsdl
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/README.gsdl	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/README.gsdl	(revision 21083)
@@ -0,0 +1,19 @@
+The YAZ toolkit is used by the GSDL receptionist
+when acting as a z39.50 client.
+
+Two files are linked against: 
+ client/yaz_client.o, which was modified from Index Data's sample 
+	client code, and
+
+ lib/libyaz.a, which contains all the z39.50 and MARC formatting code.
+	There is probably a lot of stuff in this library that does
+	not need to be there for our purposes, but for now it is,
+	merely wasting some disk space and some compile-time CPU.
+
+John McPherson
+3 August 2000
+
+yaz version 1.6
+
+September 2000:
+removed "ill" "server" "ztest" and "retrieval" subdirs.
Index: /main/tags/2.38/gsdl/packages/yaz/README.yaz
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/README.yaz	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/README.yaz	(revision 21083)
@@ -0,0 +1,141 @@
+
+Copyright (C) 1995-2000, Index Data ApS.
+See the file LICENSE for details.
+
+Compilation and installation instructions for YAZ 
+
+The primary output of the source here is the lib/libyaz.a library,
+which contains support functions for implementing the server or client
+role of Z39.50/SR.
+
+Windows programmers: refer to the file windows.txt which describes how
+to build the software using Microsoft Visual C++.
+
+On Unix, GNU configure is used to configure YAZ and generate Makefiles.
+Type "./configure", then "make" to build YAZ.
+
+Two test-programs of interest are generated when you type 'make' at the
+top level: ztest/yaz-ztest and client/yaz-client. Ztest is a dummy
+database server which returns canned responses to all queries. It's good
+for verifying that the protocol works ok, and ztest.c shows an
+implementation of a 'backend' interface.
+
+yaz-client is a linemode Z39.50 client. It supports a fair amount of the
+functionality of Z39.50v2/SR, but some things you need to enable or
+disable by recompilation. Its primary purpose is to excersise the
+package, and verify that the protocol works OK. It can be started by
+typing
+
+  yaz-client tcp:<hostname>:<port>[/<database>]
+
+at the UNIX prompt, to connect to a Z39.50 server.
+
+Use '?' to get a list of the available commands.
+
+The current query language for the find command is a bit awkward, but
+functional:
+
+ query     ::= ['@attrset' <attribute-set>] rpn
+ rpn       ::= complex | simple | attr rpn
+ complex   ::= operator rpn rpn
+ operator  ::= '@and' | '@or' | '@not' | '@prox' proximity
+ simple    ::= term | set.
+ term      ::= <word> | '"' <term> ... '"'.
+ set       ::= '@set' <setname>.
+ attr      ::= '@attr' [<attribute-set>] <number> '=' <number>.
+ proximity ::= exclusion distance ordered relation which unit
+ exclusion ::= '1' | '0' | 'void'
+ distance  ::= <number>
+ ordered   ::= '1' | '0'
+ relation  ::= <number>
+ which     ::= 'known' | 'private'
+ unit      ::= <number>
+
+Eg.:
+
+ Andersen
+
+ "Hans Andersen"
+
+ @and @attr 1=1 andersen @attr 1=4 @attr 4=2 duckling
+
+ @attrset Bib-1 @and @attr GILS 2=2008 Washington @attr 1=21 weather
+
+The sort command takes a sequence of sort specifications. A sort
+specification holds a field (sort criteria) and is followed by flags.
+If the sort critieria includes = it is assumed that the sort SortKey
+is of type sortAttributes using Bib-1. The integer before the = is
+the attribute type and the integer following the = is the attribute
+value. If no = is in the SortKey it is treated as a sortfield-type
+of type InternationalString. Flags observed are s (sort case
+sensitive), i (sort case insensitive), < (ascending), > (descending).
+Eg.:
+   1=4   i<                  (use is title, insensitive, ascending).
+   Title s>                  (String Title, sensitive, descending).
+
+The directories:
+
+doc     - Documentation.
+
+util    - Various little utility functions. Logging, memory debugging,
+	primitive ISO 2709 presentation for the yaz-client, etc. You'll
+	find the ASN.1 Compiler for YAZ here as well (yc.tcl).
+
+odr	- Open Data Representation. This module implements the BER
+	encoding rules. Documentation is found in the files odr-use.man
+	and odr.txt.
+
+asn     - This module implements the Z39.50/SR protocol. The best way
+	to find out how it works is to look in the sample
+	client/server code in server/seshigh.c. The interface is still
+        wholly described by the file proto.h which defines structure
+        and type definitions for each of the types introduced in the
+        protocol specification.
+
+z39.50  - This module implements the Z39.50 protocol. This module
+        does the same job as the 'asn' module except that the source
+        files are auto-generated using an YAZ' ASN.1 Compiler (YC).
+
+zutil   - This module implements a collection of Z39.50 utilities, such
+        as query parsing, EXTERNAL handling, etc.
+
+ill     - This module implements the ISO ILL protocol.
+
+comstack - This module implements the transport transparency
+	stack (COMSTACK). The comstack implements a generic interface
+	for exchanging BER-encoded records over a network. It supports
+	the 'American' mode of exchanging the records straight over
+	TCP/IP, and uses Peter Furniss' XTIMOSI package over RFC1006.
+	Look for documentation in the file comstack.man.
+
+rfc1006 - Xtimosi requires an implementation of the OSI transport
+	layer with an XTI-based API. Some systems (HP and DEC,
+	notably) provide this. For others, we provide an
+	implementation of the RFC1006 protocol (which is what
+	ISODE-based implementations often use). This module is not
+	needed if you don't use xtimosi, and it's not included in the
+	libyaz.a library.
+
+server  - This is the implementation of the server frontend. It
+	provides event-handling and server managament functions,
+	and calls the backend primitives (best documentation of these
+	is in the file include/backend.h).
+
+client  - A demonstration client. If we come upon a good design for a
+	higher level client API, that will live here.
+
+ztest   - A demonstration server that implements a backend.
+
+include - The various header files.
+
+lib     - The libraries. Primarily libyaz.a. The makefile gathers the
+          libraries from previous modules into libyaz.a.
+
+To get more information or assistance, send mail to yaz-help@indexdata.dk.
+
+We maintain a mailing-list for the purpose of announcing new versions of
+the software, bug-reports, discussion etc. You can sign up by sending
+mail to yaz-request@indexdata.dk and include the following command
+command in your email:
+    subscribe yaz-l
+
Index: /main/tags/2.38/gsdl/packages/yaz/TODO
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/TODO	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/TODO	(revision 21083)
@@ -0,0 +1,5 @@
+
+Complete Unicode support.
+
+Complete EXPLAIN support in retrieval module.
+
Index: /main/tags/2.38/gsdl/packages/yaz/aclocal.m4
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/aclocal.m4	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/aclocal.m4	(revision 21083)
@@ -0,0 +1,104 @@
+dnl aclocal.m4 generated automatically by aclocal 1.4
+
+dnl Copyright (C) 1994, 1995-8, 1999 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)])
+
Index: /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.am	(revision 21083)
@@ -0,0 +1,8 @@
+## $Id$
+
+noinst_LIBRARIES=libasn.a
+
+libasn_a_SOURCES = proto.c prt-rsc.c prt-acc.c prt-exp.c prt-grs.c prt-exd.c \
+	prt-dia.c prt-esp.c prt-arc.c prt-add.c prt-dat.c prt-univ.c
+
+INCLUDES=-I../include
Index: /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/Makefile.in	(revision 21083)
@@ -0,0 +1,268 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libasn.a
+
+libasn_a_SOURCES = proto.c prt-rsc.c prt-acc.c prt-exp.c prt-grs.c prt-exd.c 	prt-dia.c prt-esp.c prt-arc.c prt-add.c prt-dat.c prt-univ.c
+
+
+INCLUDES = -I../include
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libasn_a_LIBADD = 
+libasn_a_OBJECTS =  proto.o prt-rsc.o prt-acc.o prt-exp.o prt-grs.o \
+prt-exd.o prt-dia.o prt-esp.o prt-arc.o prt-add.o prt-dat.o prt-univ.o
+AR = ar
+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 = $(libasn_a_SOURCES)
+OBJECTS = $(libasn_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps asn/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libasn.a: $(libasn_a_OBJECTS) $(libasn_a_DEPENDENCIES)
+	-rm -f libasn.a
+	$(AR) cru libasn.a $(libasn_a_OBJECTS) $(libasn_a_LIBADD)
+	$(RANLIB) libasn.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 = asn
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
+
+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
+
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/asn/proto.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/proto.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/proto.c	(revision 21083)
@@ -0,0 +1,1843 @@
+/*
+ * Copyright (c) 1995-1999, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:45  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.61  1999/11/30 13:47:10  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.60  1999/06/11 16:45:59  adam
+ * Fixed minor bug in ScanRequest encoder.
+ *
+ * Revision 1.59  1999/04/21 11:46:00  adam
+ * Fixed bug in {en,de}coder for OtherInformation.
+ *
+ * Revision 1.58  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.57  1998/10/20 13:55:37  quinn
+ * Fixed Scan bug in asn and client
+ *
+ * Revision 1.56  1998/08/19 16:10:04  adam
+ * Changed som member names of DeleteResultSetRequest/Response.
+ *
+ * Revision 1.55  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.54  1996/11/11 13:14:46  adam
+ * Fixed tagging bug in z_ProximityOperator.
+ *
+ * Revision 1.53  1996/10/09 15:54:55  quinn
+ * Added SearchInfoReport
+ *
+ * Revision 1.52  1996/10/08  12:56:57  adam
+ * Bug fix: tagging of type 101 query.
+ *
+ * Revision 1.51  1996/07/26  14:07:21  quinn
+ * Small
+ *
+ * Revision 1.50  1996/07/26  13:36:15  quinn
+ * Various smallish
+ *
+ * Revision 1.49  1996/07/06  19:58:28  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.48  1996/06/10  08:53:33  quinn
+ * Added Summary,OPAC,ResourceReport
+ *
+ * Revision 1.47  1996/05/29  15:47:50  quinn
+ * Fixed in bug DiagRecs decoder. Thanks to Linda Harris.
+ *
+ * Revision 1.46  1996/04/10  11:39:42  quinn
+ * Fixed bug in UserInfo
+ *
+ * Revision 1.45  1996/02/23  10:00:25  quinn
+ * Fixes to SCAN
+ *
+ * Revision 1.44  1996/02/20  12:51:41  quinn
+ * Completed SCAN. Fixed problems with EXTERNAL.
+ *
+ * Revision 1.43  1996/02/10  12:22:49  quinn
+ * Work on SCAN
+ *
+ * Revision 1.42  1996/01/22  09:46:31  quinn
+ * Added Sort PDU. Moved StringList to main protocol file.
+ *
+ * Revision 1.41  1996/01/10  15:21:24  quinn
+ * Added links to access control PDUs
+ *
+ * Revision 1.40  1996/01/02  11:46:40  quinn
+ * Changed 'operator' to 'roperator' to avoid C++ conflict.
+ *
+ * Revision 1.39  1995/09/29  17:11:53  quinn
+ * Smallish
+ *
+ * Revision 1.38  1995/09/27  15:02:40  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.37  1995/08/21  09:10:15  quinn
+ * Smallish fixes to suppport new formats.
+ *
+ * Revision 1.36  1995/08/15  11:59:39  quinn
+ * Updated External
+ *
+ * Revision 1.35  1995/08/10  08:53:59  quinn
+ * Added Explain
+ *
+ * Revision 1.34  1995/06/19  17:01:48  quinn
+ * This should bring us in sync with the version distributed as 1.0b
+ *
+ * Revision 1.33  1995/06/19  13:39:56  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.32  1995/06/19  12:37:28  quinn
+ * Fixed a bug in the compspec.
+ *
+ * Revision 1.31  1995/06/16  13:15:56  quinn
+ * Fixed Defaultdiagformat.
+ *
+ * Revision 1.30  1995/06/15  15:42:01  quinn
+ * Fixed some v3 bugs
+ *
+ * Revision 1.29  1995/06/15  07:44:49  quinn
+ * Moving to v3.
+ *
+ * Revision 1.28  1995/06/14  15:26:35  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.27  1995/06/07  14:36:22  quinn
+ * Added CLOSE
+ *
+ * Revision 1.26  1995/06/02  09:49:13  quinn
+ * Adding access control
+ *
+ * Revision 1.25  1995/05/25  11:00:08  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.24  1995/05/22  13:58:18  quinn
+ * Fixed an ODR_NULLVAL.
+ *
+ * Revision 1.23  1995/05/22  11:30:18  quinn
+ * Adding Z39.50-1992 stuff to proto.c. Adding zget.c
+ *
+ * Revision 1.22  1995/05/17  08:40:56  quinn
+ * Added delete. Fixed some sequence_begins. Smallish.
+ *
+ * Revision 1.21  1995/05/16  08:50:24  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.20  1995/05/15  11:55:25  quinn
+ * Smallish.
+ *
+ * Revision 1.19  1995/04/11  11:58:35  quinn
+ * Fixed bug.
+ *
+ * Revision 1.18  1995/04/11  11:52:02  quinn
+ * Fixed possible buf in proto.c
+ *
+ * Revision 1.17  1995/04/10  10:22:22  quinn
+ * Added SCAN.
+ *
+ * Revision 1.16  1995/03/30  10:26:43  quinn
+ * Added Term structure
+ *
+ * Revision 1.15  1995/03/30  09:08:39  quinn
+ * Added Resource control protocol
+ *
+ * Revision 1.14  1995/03/29  08:06:13  quinn
+ * Added a few v3 elements
+ *
+ * Revision 1.13  1995/03/20  11:26:52  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.12  1995/03/20  09:45:09  quinn
+ * Working towards v3
+ *
+ * Revision 1.11  1995/03/17  10:17:25  quinn
+ * Added memory management.
+ *
+ * Revision 1.10  1995/03/15  11:17:40  quinn
+ * Fixed some return-checks from choice.. need better ay to handle those..
+ *
+ * Revision 1.9  1995/03/15  08:37:06  quinn
+ * Fixed protocol bugs.
+ *
+ * Revision 1.8  1995/03/14  16:59:24  quinn
+ * Fixed OPTIONAL flag in attributeelement
+ *
+ * Revision 1.7  1995/03/07  16:29:33  quinn
+ * Added authentication stuff.
+ *
+ * Revision 1.6  1995/03/01  14:46:03  quinn
+ * Fixed protocol bug in 8777query.
+ *
+ * Revision 1.5  1995/02/14  11:54:22  quinn
+ * Fixing include.
+ *
+ * Revision 1.4  1995/02/10  15:54:30  quinn
+ * Small adjustments.
+ *
+ * Revision 1.3  1995/02/09  15:51:39  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/06  21:26:07  quinn
+ * Repaired this evening's damages..
+ *
+ * Revision 1.1  1995/02/06  16:44:47  quinn
+ * First hack at Z/SR protocol
+ *
+ */
+
+#include <yaz/odr.h>
+
+#include <yaz/proto.h>
+
+/* ---------------------- GLOBAL DEFS ------------------- */
+
+/*
+ * We'll use a general octetstring here, since string operations are
+ * clumsy on long strings.
+ */
+int z_SUTRS(ODR o, Odr_oct **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_octetstring, p, ODR_UNIVERSAL,
+	ODR_GENERALSTRING, opt);
+}
+
+int z_ReferenceId(ODR o, Z_ReferenceId **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_octetstring, (Odr_oct**) p, ODR_CONTEXT, 2,
+			opt);
+}
+
+int z_DatabaseName(ODR o, Z_DatabaseName **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 105,
+	opt);
+}
+
+int z_ResultSetId(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_visiblestring, (char **) p, ODR_CONTEXT, 31,
+	opt);
+}
+
+int z_ElementSetName(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_visiblestring, p, ODR_CONTEXT, 103, opt);
+}
+
+int z_UserInformationField(ODR o, Z_External **p, int opt, const char *name)
+{
+    return odr_explicit(o, z_External, (Z_External **)p, ODR_CONTEXT,
+    	11, opt);
+}
+
+int z_InternationalString(ODR o, char **p, int opt, const char *name)
+{
+    return odr_generalstring(o, p, opt, 0);
+}
+
+int z_InfoCategory(ODR o, Z_InfoCategory **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_oid, &(*p)->categoryTypeId, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->categoryValue, ODR_CONTEXT, 2,
+		     0) &&
+	odr_sequence_end(o);
+}
+
+int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p, int opt,
+			   const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_OtherInfo_characterInfo,
+	 odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_OtherInfo_binaryInfo,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_OtherInfo_externallyDefinedInfo,
+	 (Odr_fun)z_External, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_OtherInfo_oid,
+	 (Odr_fun)odr_oid, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), name))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_InfoCategory, &(*p)->category, ODR_CONTEXT, 1, 1) &&
+	odr_choice(o, arm, &(*p)->information, &(*p)->which, name) &&
+	odr_sequence_end(o);
+}
+    
+int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt,
+		       const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    odr_implicit_settag(o, ODR_CONTEXT, 201);
+    if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
+	&(*p)->num_elements, name))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_StringOrNumeric_string,
+	 odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_StringOrNumeric_numeric,
+	 (Odr_fun)odr_integer, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_StringOrNumeric *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/*
+ * check tagging!!
+ */
+int z_Unit(ODR o, Z_Unit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_InternationalString, &(*p)->unitSystem, ODR_CONTEXT,
+	    1, 1) &&
+	odr_explicit(o, z_StringOrNumeric, &(*p)->unitType, ODR_CONTEXT,
+	    2, 1) &&
+	odr_explicit(o, z_StringOrNumeric, &(*p)->unit, ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->scaleFactor, ODR_CONTEXT, 4, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IntUnit(ODR o, Z_IntUnit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_Unit, &(*p)->unitUsed, ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_StringList(ODR o, Z_StringList **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_StringList *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_InternationalString, &(*p)->strings,
+	&(*p)->num_strings, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/* ---------------------- INITIALIZE SERVICE ------------------- */
+
+#if 1
+int z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt,
+			const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_visiblestring(o, &(*p)->user, 0, 0) &&
+    	odr_visiblestring(o, &(*p)->password, 0, 0) &&
+    	odr_visiblestring(o, &(*p)->account, 0, 0) &&
+    	odr_sequence_end(o);
+}
+#endif
+
+int z_IdPass(ODR o, Z_IdPass **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_visiblestring, &(*p)->groupId, ODR_CONTEXT, 0,
+		     1) &&
+    	odr_implicit(o, odr_visiblestring, &(*p)->userId, ODR_CONTEXT, 1, 1) &&
+    	odr_implicit(o, odr_visiblestring, &(*p)->password, ODR_CONTEXT, 2,
+	    1) &&
+    	odr_sequence_end(o);
+}
+
+int z_StrAuthentication(ODR o, char **p, int opt, const char *name)
+{
+    return odr_visiblestring(o, p, opt, 0);
+}
+
+int z_IdAuthentication(ODR o, Z_IdAuthentication **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{-1, -1, -1, Z_IdAuthentication_open, z_StrAuthentication, 0},
+	{-1, -1, -1, Z_IdAuthentication_idPass, (Odr_fun)z_IdPass, 0},
+	{-1, -1, -1, Z_IdAuthentication_anonymous, (Odr_fun)odr_null, 0},
+	{-1, -1, -1, Z_IdAuthentication_other, (Odr_fun)z_External, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_IdAuthentication *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_InitRequest(ODR o, Z_InitRequest **p, int opt, const char *name)
+{
+    Z_InitRequest *pp;
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	odr_implicit(o, odr_bitstring, &pp->protocolVersion,
+		     ODR_CONTEXT, 3, 0) &&
+	odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
+	odr_implicit(o, odr_integer, &pp->preferredMessageSize, ODR_CONTEXT,
+		     5, 0) &&
+	odr_implicit(o, odr_integer, &pp->maximumRecordSize,
+		     ODR_CONTEXT, 6, 0) &&
+	odr_explicit(o, z_IdAuthentication, &pp->idAuthentication,
+		     ODR_CONTEXT, 7, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationId,
+		     ODR_CONTEXT, 110, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationName,
+		     ODR_CONTEXT, 111, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
+	    ODR_CONTEXT, 112, 1) &&
+	z_UserInformationField(o, &pp->userInformationField, 1, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_InitResponse(ODR o, Z_InitResponse **p, int opt, const char *name)
+{
+    Z_InitResponse *pp;
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	odr_implicit(o, odr_bitstring, &pp->protocolVersion,
+		     ODR_CONTEXT, 3, 0) &&
+	odr_implicit(o, odr_bitstring, &pp->options, ODR_CONTEXT, 4, 0) &&
+	odr_implicit(o, odr_integer, &pp->preferredMessageSize,
+		     ODR_CONTEXT, 5, 0) &&
+	odr_implicit(o, odr_integer, &pp->maximumRecordSize,
+		     ODR_CONTEXT, 6, 0) &&
+	odr_implicit(o, odr_bool, &pp->result, ODR_CONTEXT, 12, 0) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationId,
+		     ODR_CONTEXT, 110, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationName,
+		     ODR_CONTEXT, 111, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->implementationVersion,
+		     ODR_CONTEXT, 112, 1) &&
+	z_UserInformationField(o, &pp->userInformationField, 1, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------ RESOURCE CONTROL ----------------*/
+
+int z_TriggerResourceControlRequest(ODR o, Z_TriggerResourceControlRequest **p,
+				    int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->requestedAction, ODR_CONTEXT,
+	    46, 0) &&
+	odr_implicit(o, odr_oid, &(*p)->prefResourceReportFormat,
+	    ODR_CONTEXT, 47, 1) &&
+	odr_implicit(o, odr_bool, &(*p)->resultSetWanted, ODR_CONTEXT,
+	    48, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ResourceControlRequest(ODR o, Z_ResourceControlRequest **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->suspendedFlag, ODR_CONTEXT, 39, 1)&&
+	odr_explicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
+	    40, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->partialResultsAvailable,
+	    ODR_CONTEXT, 41, 1) &&
+	odr_implicit(o, odr_bool, &(*p)->responseRequired, ODR_CONTEXT,
+	    42, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->triggeredRequestFlag,
+	    ODR_CONTEXT, 43, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ResourceControlResponse(ODR o, Z_ResourceControlResponse **p, int opt,
+			      const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->continueFlag, ODR_CONTEXT, 44, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->resultSetWanted, ODR_CONTEXT,
+	    45, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ SEARCH SERVICE ----------------------- */
+
+int z_DatabaseSpecificUnit(ODR o, Z_DatabaseSpecificUnit **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_DatabaseName(o, &(*p)->databaseName, 0, 0) &&
+    	z_ElementSetName(o, &(*p)->elementSetName, 0, 0) &&
+    	odr_sequence_end(o);
+}
+
+int z_DatabaseSpecific(ODR o, Z_DatabaseSpecific **p, int opt,
+		       const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_DatabaseSpecific *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+    odr_implicit_settag(o, ODR_CONTEXT, 1);
+    if (odr_sequence_of(o, (Odr_fun)z_DatabaseSpecificUnit, &(*p)->elements,
+    	&(*p)->num_elements, 0))
+    	return 1;
+    *p = 0;
+    return 0;
+}
+
+int z_ElementSetNames(ODR o, Z_ElementSetNames **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementSetNames_generic,
+	    z_ElementSetName, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSetNames_databaseSpecific,
+	    (Odr_fun)z_DatabaseSpecific, 0},
+	{-1, -1, -1, -1, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_ElementSetNames *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt && odr_ok(o);
+
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return 0;
+}
+
+/* ----------------------- RPN QUERY -----------------------*/
+
+int z_ComplexAttribute(ODR o, Z_ComplexAttribute **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+    	odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->list,
+	    &(*p)->num_list, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->semanticAction,
+	    &(*p)->num_semanticAction, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_AttributeElement(ODR o, Z_AttributeElement **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 121, Z_AttributeValue_numeric,
+	    (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 224, Z_AttributeValue_complex,
+	    (Odr_fun)z_ComplexAttribute, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 1, 1) &&
+    	odr_implicit(o, odr_integer, &(*p)->attributeType, ODR_CONTEXT,
+	    120, 0) &&
+	odr_choice(o, arm, &(*p)->value, &(*p)->which, 0) &&
+    	odr_sequence_end(o);
+}
+
+int z_Term(ODR o, Z_Term **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 45, Z_Term_general,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 215, Z_Term_numeric,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 216, Z_Term_characterString,
+	    odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 217, Z_Term_oid, (Odr_fun)odr_oid, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 218, Z_Term_dateTime, odr_cstring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 219, Z_Term_external,
+	 (Odr_fun) z_External, 0},
+	/* add intUnit here */
+	{ODR_IMPLICIT, ODR_CONTEXT, 221, Z_Term_null, (Odr_fun)odr_null, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction ==ODR_DECODE)
+    	*p = (Z_Term *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AttributesPlusTerm(ODR o, Z_AttributesPlusTerm **p, int opt,
+			 const char *name)
+{
+    if (!(odr_implicit_settag(o, ODR_CONTEXT, 102) &&
+    	odr_sequence_begin(o, p, sizeof(**p), 0)))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit_settag(o, ODR_CONTEXT, 44) &&
+    	odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
+	    &(*p)->num_attributes, 0) &&
+	z_Term(o, &(*p)->term, 0, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ResultSetPlusAttributes(ODR o, Z_ResultSetPlusAttributes **p, int opt,
+			      const char *name)
+{
+    if (!(odr_implicit_settag(o, ODR_CONTEXT, 214) &&
+    	odr_sequence_begin(o, p, sizeof(**p), 0)))
+    	return opt && odr_ok(o);
+    return
+    	z_ResultSetId(o, &(*p)->resultSet, 0, 0) &&
+    	odr_implicit_settag(o, ODR_CONTEXT, 44) &&
+    	odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
+	    &(*p)->num_attributes, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ProximityOperator(ODR o, Z_ProximityOperator **p, int opt,
+			const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxCode_known,
+	 (Odr_fun)odr_integer, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxCode_private,
+	 (Odr_fun)odr_integer, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_bool, &(*p)->exclusion, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->distance, ODR_CONTEXT, 2, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->ordered, ODR_CONTEXT, 3, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->relationType, ODR_CONTEXT, 4, 0) &&
+	odr_constructed_begin(o, &(*p)->proximityUnitCode,
+			      ODR_CONTEXT, 5, 0) &&
+	odr_choice(o, arm, &(*p)->proximityUnitCode, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_sequence_end(o);
+}
+
+int z_Operator(ODR o, Z_Operator **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Operator_and, (Odr_fun)odr_null, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Operator_or, (Odr_fun)odr_null, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Operator_and_not,
+	 (Odr_fun)odr_null, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Operator_prox,
+	 (Odr_fun)z_ProximityOperator, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!*p && o->direction != ODR_DECODE)
+    	return opt;
+    if (!odr_constructed_begin(o, p, ODR_CONTEXT, 46, 0))
+    	return opt && odr_ok(o);
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_Operator *)odr_malloc(o, sizeof(**p));
+
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
+    	odr_constructed_end(o))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Operand(ODR o, Z_Operand **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{-1, -1, -1, Z_Operand_APT, (Odr_fun)z_AttributesPlusTerm, 0},
+    	{-1, -1, -1, Z_Operand_resultSetId, (Odr_fun)z_ResultSetId, 0},
+    	{-1, -1, -1, Z_Operand_resultAttr,
+	 (Odr_fun)z_ResultSetPlusAttributes, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_Operand *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_RPNStructure(ODR o, Z_RPNStructure **p, int opt, const char *name);
+
+int z_Complex(ODR o, Z_Complex **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_RPNStructure(o, &(*p)->s1, 0, 0) &&
+    	z_RPNStructure(o, &(*p)->s2, 0, 0) &&
+    	z_Operator(o, &(*p)->roperator, 0, 0) &&
+    	odr_sequence_end(o);
+}
+
+int z_RPNStructure(ODR o, Z_RPNStructure **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_RPNStructure_simple,
+	 (Odr_fun)z_Operand, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_RPNStructure_complex,
+	 (Odr_fun)z_Complex, 0},
+    	{-1 -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_RPNStructure *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_RPNQuery(ODR o, Z_RPNQuery **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_oid(o, &(*p)->attributeSetId, 0, 0) &&
+    	z_RPNStructure(o, &(*p)->RPNStructure, 0, 0) &&
+    	odr_sequence_end(o);
+}
+
+/* -----------------------END RPN QUERY ----------------------- */
+
+int z_Query(ODR o, Z_Query **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Query_type_1,
+	 (Odr_fun)z_RPNQuery, 0},
+    	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Query_type_2,
+	 (Odr_fun)odr_octetstring, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 101, Z_Query_type_101,
+	 (Odr_fun)z_RPNQuery, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_Query *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SearchRequest(ODR o, Z_SearchRequest **p, int opt, const char *name)
+{
+    Z_SearchRequest *pp;
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	odr_implicit(o, odr_integer, &pp->smallSetUpperBound, ODR_CONTEXT,
+	    13, 0) &&
+	odr_implicit(o, odr_integer, &pp->largeSetLowerBound, ODR_CONTEXT,
+	    14, 0) &&
+	odr_implicit(o, odr_integer, &pp->mediumSetPresentNumber, ODR_CONTEXT,
+	    15, 0) &&
+	odr_implicit(o, odr_bool, &pp->replaceIndicator, ODR_CONTEXT, 16, 1) &&
+	odr_implicit(o, odr_visiblestring, &pp->resultSetName, ODR_CONTEXT,
+	    17, 9) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 18) &&
+	odr_sequence_of(o, z_DatabaseName, &pp->databaseNames,
+	    &pp->num_databaseNames, 0) &&
+	odr_explicit(o, z_ElementSetNames, &pp->smallSetElementSetNames,
+	    ODR_CONTEXT, 100, 1) &&
+	odr_explicit(o, z_ElementSetNames, &pp->mediumSetElementSetNames,
+	    ODR_CONTEXT, 101, 1) &&
+	odr_implicit(o, odr_oid, &pp->preferredRecordSyntax,
+	    ODR_CONTEXT, 104, 1) &&
+	odr_explicit(o, z_Query, &pp->query, ODR_CONTEXT, 21, 0) &&
+	odr_implicit_tag(o, z_OtherInformation, &(*p)->additionalSearchInfo,
+	    ODR_CONTEXT, 203, 1, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ RECORD ------------------------- */
+
+int z_DatabaseRecord(ODR o, Z_DatabaseRecord **p, int opt, const char *name)
+{
+    return z_External(o, (Z_External **) p, opt, 0);
+}
+
+int z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt,
+			const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{-1, -1, -1, Z_DiagForm_v2AddInfo, odr_visiblestring, 0},
+	{-1, -1, -1, Z_DiagForm_v3AddInfo, z_InternationalString, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, ODR_VISIBLESTRING, Z_DiagForm_v2AddInfo,
+	    odr_visiblestring, 0}, /* To cater to a bug in the CNIDR servers */
+	{-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_oid(o, &(*p)->diagnosticSetId, 1, 0) && /* SHOULD NOT BE OPT! */
+    	odr_integer(o, &(*p)->condition, 0, 0) &&
+	/*
+	 * I no longer recall what server tagged the addinfo.. but it isn't
+	 * hurting anyone, so...
+	 * We need to turn it into a choice, or something, because of
+	 * that damn generalstring in v3.
+	 */
+	odr_choice(o, arm, &(*p)->addinfo, &(*p)->which, 0) &&
+    	odr_sequence_end(o);
+}
+
+int z_DiagRec(ODR o, Z_DiagRec **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{-1, -1, -1, Z_DiagRec_defaultFormat, (Odr_fun)z_DefaultDiagFormat, 0},
+    	{-1, -1, -1, Z_DiagRec_externallyDefined, (Odr_fun)z_External, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_DiagRec *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_DiagRecs(ODR o, Z_DiagRecs **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_DiagRecs *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+	if (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->diagRecs,
+    	&(*p)->num_diagRecs, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_NamePlusRecord(ODR o, Z_NamePlusRecord **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_EXPLICIT, ODR_CONTEXT, 1, Z_NamePlusRecord_databaseRecord,
+	    (Odr_fun)z_DatabaseRecord, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_NamePlusRecord_surrogateDiagnostic,
+	    (Odr_fun)z_DiagRec, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
+	    0, 1) &&
+	odr_constructed_begin(o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
+	odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_sequence_end(o);
+}
+
+int z_NamePlusRecordList(ODR o, Z_NamePlusRecordList **p, int opt,
+			 const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_NamePlusRecordList *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_NamePlusRecord, &(*p)->records,
+	&(*p)->num_records, 0))
+    	return 1;
+    *p = 0;
+    return 0;
+}
+
+int z_Records(ODR o, Z_Records **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 28, Z_Records_DBOSD,
+	 (Odr_fun)z_NamePlusRecordList, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 130, Z_Records_NSD,
+	 (Odr_fun)z_DiagRec, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 205, Z_Records_multipleNSD,
+	    (Odr_fun)z_DiagRecs, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_Records *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/* ------------------------ ACCESS CTRL SERVICE ----------------------- */
+
+int z_AccessControlRequest(ODR o, Z_AccessControlRequest **p, int opt,
+			   const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 37, Z_AccessRequest_simpleForm,
+	    (Odr_fun)odr_octetstring, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessRequest_externallyDefined,
+	    (Odr_fun)z_External, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_AccessControlResponse(ODR o, Z_AccessControlResponse **p, int opt,
+			    const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 38, Z_AccessResponse_simpleForm,
+	    (Odr_fun)odr_octetstring, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessResponse_externallyDefined,
+	    (Odr_fun)z_External, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
+	odr_explicit(o, z_DiagRec, &(*p)->diagnostic, ODR_CONTEXT, 223, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ SCAN SERVICE -------------------- */
+
+int z_AttributeList(ODR o, Z_AttributeList **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_AttributeList *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+    odr_implicit_settag(o, ODR_CONTEXT, 44);
+    if (odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributes,
+    	&(*p)->num_attributes, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/*
+ * This is a temporary hack. We don't know just *what* old version of the
+ * protocol willow uses, so we'll just patiently wait for them to update
+ */
+static int willow_scan = 0;
+
+int z_WillowAttributesPlusTerm(ODR o, Z_AttributesPlusTerm **p, int opt,
+			       const char *name)
+{
+    if (!*p && o->direction != ODR_DECODE)
+    	return opt;
+    if (!odr_constructed_begin(o, p, ODR_CONTEXT, 4, 0))
+    {
+    	o->t_class = -1;
+    	return opt && odr_ok(o);
+    }
+    if (!odr_constructed_begin(o, p, ODR_CONTEXT, 1, 0))
+    	return 0;
+    if (!odr_constructed_begin(o, p, ODR_UNIVERSAL, ODR_SEQUENCE, 0))
+    	return 0;
+    if (!odr_implicit_settag(o, ODR_CONTEXT, 44))
+    	return 0;
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_AttributesPlusTerm*)odr_malloc(o, sizeof(**p));
+    if (!odr_sequence_of(o, (Odr_fun)z_AttributeElement, &(*p)->attributeList,
+	&(*p)->num_attributes, 0))
+	return 0;
+    if (!odr_sequence_end(o) || !odr_sequence_end(o))
+    	return 0;
+    if (!z_Term(o, &(*p)->term, 0, 0))
+    	return 0;
+    if (!odr_constructed_end(o))
+    	return 0;
+    willow_scan = 1;
+    return 1;
+}
+
+int z_AlternativeTerm(ODR o, Z_AlternativeTerm **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_AlternativeTerm *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    {
+    	o->t_class = -1;
+    	return opt && odr_ok(o);
+    }
+
+    if (odr_sequence_of(o, (Odr_fun)z_AttributesPlusTerm, &(*p)->terms,
+    	&(*p)->num_terms, 0))
+    	return 1;
+    *p = 0;
+    return opt && !o->error;
+}
+
+int z_ByDatabase(ODR o, Z_ByDatabase **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_DatabaseName(o, &(*p)->db, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->num, ODR_CONTEXT, 1, 1) &&
+	z_OtherInformation(o, &(*p)->otherDbInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ByDatabaseList(ODR o, Z_ByDatabaseList **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_ByDatabase, &(*p)->elements,
+			&(*p)->num_elements, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ScanOccurrences(ODR o, Z_ScanOccurrences **p, int opt, const char *name)
+{
+    Odr_arm arm[] =
+    {
+	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ScanOccurrences_global,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 3, Z_ScanOccurrences_byDatabase,
+	    (Odr_fun)z_ByDatabaseList, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_OccurrenceByAttributesElem(ODR o, Z_OccurrenceByAttributesElem **p,
+    int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_explicit(o, z_AttributeList, &(*p)->attributes, ODR_CONTEXT,
+	    1, 1) &&
+	z_ScanOccurrences(o, &(*p)->occurrences, 1, 0) &&
+	z_OtherInformation(o, &(*p)->otherOccurInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_OccurrenceByAttributes(ODR o, Z_OccurrenceByAttributes **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (!odr_sequence_of(o, (Odr_fun)z_OccurrenceByAttributesElem,
+			 &(*p)->elements, &(*p)->num_elements, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_TermInfo(ODR o, Z_TermInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	(willow_scan ? 
+    	    odr_implicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 1, 0) :
+	    z_Term(o, &(*p)->term, 0, 0)) &&
+	odr_implicit(o, z_InternationalString, &(*p)->displayTerm, ODR_CONTEXT,
+	    0, 1) &&
+	z_AttributeList(o, &(*p)->suggestedAttributes, 1, 0) &&
+	odr_implicit(o, z_AlternativeTerm, &(*p)->alternativeTerm,
+	    ODR_CONTEXT, 4, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->globalOccurrences, ODR_CONTEXT,
+	    2, 1) &&
+	odr_implicit(o, z_OccurrenceByAttributes, &(*p)->byAttributes,
+	    ODR_CONTEXT, 3, 1) &&
+	z_OtherInformation(o, &(*p)->otherTermInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_Entry(ODR o, Z_Entry **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Entry_termInfo,
+	 (Odr_fun)z_TermInfo, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Entry_surrogateDiagnostic,
+	    (Odr_fun)z_DiagRec, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_Entry *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ListEntries (ODR o, Z_ListEntries **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+	return opt && odr_ok (o);
+    return
+	odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun) z_Entry, &(*p)->entries,
+			 &(*p)->num_entries, 0) || odr_ok(o)) &&
+	odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun) z_DiagRec,
+			 &(*p)->nonsurrogateDiagnostics,
+			 &(*p)->num_nonsurrogateDiagnostics, 0) 
+	 || odr_ok(o)) &&
+	odr_sequence_end (o);
+}
+
+int z_ScanRequest(ODR o, Z_ScanRequest **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    willow_scan = 0;
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	odr_sequence_of(o, z_DatabaseName, &(*p)->databaseNames,
+			&(*p)->num_databaseNames, 0) &&
+	odr_oid(o, &(*p)->attributeSet, 1, 0) &&
+	(z_AttributesPlusTerm(o, &(*p)->termListAndStartPoint, 1, 0) ?
+	 ((*p)->termListAndStartPoint ? 1 : 
+	  z_WillowAttributesPlusTerm(o, &(*p)->termListAndStartPoint, 0, 0))
+	 : 0) &&
+	odr_implicit(o, odr_integer, &(*p)->stepSize, ODR_CONTEXT, 5, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->numberOfTermsRequested,
+		     ODR_CONTEXT, 6, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->preferredPositionInResponse,
+		     ODR_CONTEXT, 7, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+	odr_sequence_end(o);
+}
+
+int z_ScanResponse(ODR o, Z_ScanResponse **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->stepSize, ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->scanStatus, ODR_CONTEXT, 4, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->numberOfEntriesReturned,
+		     ODR_CONTEXT, 5, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->positionOfTerm,
+		     ODR_CONTEXT, 6, 1) &&
+	odr_implicit(o, z_ListEntries, &(*p)->entries, ODR_CONTEXT, 7, 1) &&
+	odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 8, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ SEARCHRESPONSE ----------------*/
+
+int z_NumberOfRecordsReturned(ODR o, int **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 24, opt);
+}
+
+int z_NextResultSetPosition(ODR o, int **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 25, opt);
+}
+
+int z_PresentStatus(ODR o, int **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 27, opt);
+}
+
+int z_SearchResponse(ODR o, Z_SearchResponse **p, int opt, const char *name)
+{
+    Z_SearchResponse *pp;
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	odr_implicit(o, odr_integer, &pp->resultCount, ODR_CONTEXT, 23, 0) &&
+    	z_NumberOfRecordsReturned(o, &pp->numberOfRecordsReturned, 0, 0) &&
+    	z_NextResultSetPosition(o, &pp->nextResultSetPosition, 0, 0) &&
+    	odr_implicit(o, odr_bool, &pp->searchStatus, ODR_CONTEXT, 22, 0) &&
+    	odr_implicit(o, odr_integer, &pp->resultSetStatus,
+		     ODR_CONTEXT, 26, 1) &&
+    	z_PresentStatus(o, &pp->presentStatus, 1, 0) &&
+    	z_Records(o, &pp->records, 1, 0) &&
+	odr_implicit(o, z_OtherInformation, &(*p)->additionalSearchInfo,
+		     ODR_CONTEXT, 203, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* --------------------- PRESENT SERVICE ---------------------- */
+
+int z_ElementSpec(ODR o, Z_ElementSpec **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSpec_elementSetName,
+	    odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementSpec_externalSpec,
+	    (Odr_fun)z_External, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_ElementSpec *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Specification(ODR o, Z_Specification **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 1, 1) &&
+	z_ElementSpec(o, &(*p)->elementSpec, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_DbSpecific(ODR o, Z_DbSpecific **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_DatabaseName, &(*p)->databaseName, ODR_CONTEXT,
+	    1, 0) &&
+	odr_implicit(o, z_Specification, &(*p)->spec, ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_CompSpec(ODR o, Z_CompSpec **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_bool, &(*p)->selectAlternativeSyntax, ODR_CONTEXT,
+		     1, 0) &&
+	odr_implicit(o, z_Specification, &(*p)->generic, ODR_CONTEXT, 2, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_DbSpecific, &(*p)->dbSpecific,
+			 &(*p)->num_dbSpecific, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 4) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->recordSyntax,
+			 &(*p)->num_recordSyntax, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_RecordComposition(ODR o, Z_RecordComposition **p, int opt,
+			const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_EXPLICIT, ODR_CONTEXT, 19, Z_RecordComp_simple,
+	 (Odr_fun)z_ElementSetNames, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 209, Z_RecordComp_complex,
+	 (Odr_fun)z_CompSpec, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_RecordComposition *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Range(ODR o, Z_Range **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->startingPosition,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->numberOfRecords,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_PresentRequest(ODR o, Z_PresentRequest **p, int opt, const char *name)
+{
+    Z_PresentRequest *pp;
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	z_ResultSetId(o, &pp->resultSetId, 0, 0) &&
+    	odr_implicit(o, odr_integer, &pp->resultSetStartPoint,
+		     ODR_CONTEXT, 30, 0) &&
+	odr_implicit(o, odr_integer, &pp->numberOfRecordsRequested,
+		     ODR_CONTEXT, 29, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 212) &&
+	(odr_sequence_of(o, (Odr_fun)z_Range, &(*p)->additionalRanges,
+			 &(*p)->num_ranges, 0) || odr_ok(o)) &&
+	z_RecordComposition(o, &(*p)->recordComposition, 1, 0) &&
+	odr_implicit(o, odr_oid, &(*p)->preferredRecordSyntax, ODR_CONTEXT,
+		     104, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->maxSegmentCount, ODR_CONTEXT,
+		     204, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->maxRecordSize, ODR_CONTEXT,
+		     206, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->maxSegmentSize, ODR_CONTEXT,
+		     207, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_PresentResponse(ODR o, Z_PresentResponse **p, int opt, const char *name)
+{
+    Z_PresentResponse *pp;
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    pp = *p;
+    return
+    	z_ReferenceId(o, &pp->referenceId, 1, 0) &&
+    	z_NumberOfRecordsReturned(o, &pp->numberOfRecordsReturned, 0, 0) &&
+    	z_NextResultSetPosition(o, &pp->nextResultSetPosition, 0, 0) &&
+    	z_PresentStatus(o, &pp->presentStatus, 0, 0) &&
+    	z_Records(o, &pp->records, 1, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+    	odr_sequence_end(o);
+}
+
+/* ----------------------DELETE -------------------------- */
+
+int z_DeleteSetStatus(ODR o, int **p, int opt, const char *name)
+{
+    return odr_implicit(o, odr_integer, p, ODR_CONTEXT, 33, opt);
+}
+
+int z_ListStatus(ODR o, Z_ListStatus **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ResultSetId(o, &(*p)->id, 0, 0) &&
+	z_DeleteSetStatus(o, &(*p)->status, 0, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_DeleteResultSetRequest(ODR o, Z_DeleteResultSetRequest **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->deleteFunction, ODR_CONTEXT, 32,
+	    0) &&
+	(odr_sequence_of(o, z_ResultSetId, &(*p)->resultSetList,
+			 &(*p)->num_resultSetList, 0) || odr_ok(o)) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ListStatuses (ODR o, Z_ListStatuses **p, int opt, const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_sequence_of (o, (Odr_fun) z_ListStatus, &(*p)->elements,
+			 &(*p)->num, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_DeleteResultSetResponse(ODR o, Z_DeleteResultSetResponse **p, int opt,
+			      const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, z_DeleteSetStatus, &(*p)->deleteOperationStatus,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit (o, z_ListStatuses,
+		      &(*p)->deleteListStatuses, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->numberNotDeleted, ODR_CONTEXT,
+		     34, 1) &&
+        odr_implicit (o, z_ListStatuses,
+		      &(*p)->bulkStatuses, ODR_CONTEXT, 35, 1) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->deleteMessage, ODR_CONTEXT,
+		     36, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ SEGMENT SERVICE -------------- */
+
+int z_Segment(ODR o, Z_Segment **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->numberOfRecordsReturned,
+		     ODR_CONTEXT, 24, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 0) &&
+	odr_sequence_of(o, (Odr_fun)z_NamePlusRecord, &(*p)->segmentRecords,
+			&(*p)->num_segmentRecords, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ CLOSE SERVICE ---------------- */
+
+int z_Close(ODR o, Z_Close **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->closeReason, ODR_CONTEXT, 211, 0)
+	&&
+	odr_implicit(o, odr_visiblestring, &(*p)->diagnosticInformation,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, odr_oid, &(*p)->resourceReportFormat, ODR_CONTEXT,
+		     4, 1) &&
+	odr_implicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
+		     5, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ APDU ------------------------- */
+
+int z_Permissions(ODR o, Z_Permissions **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->userId, ODR_CONTEXT,
+		     1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->allowableFunctions,
+			&(*p)->num_allowableFunctions, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ExtendedServicesRequest(ODR o, Z_ExtendedServicesRequest **p, int opt,
+			      const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->function, ODR_CONTEXT, 3, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->packageType, ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->packageName,
+		     ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->userId,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, z_IntUnit, &(*p)->retentionTime,
+		     ODR_CONTEXT, 7, 1) &&
+        odr_implicit(o, z_Permissions, &(*p)->permissions,
+		     ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->description,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_External, &(*p)->taskSpecificParameters,
+		     ODR_CONTEXT, 10, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->waitAction,
+		     ODR_CONTEXT, 11, 0) &&
+        z_ElementSetName(o, &(*p)->elements, 1, 0) &&
+        z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_ExtendedServicesResponse(ODR o, Z_ExtendedServicesResponse **p, int opt,
+			       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->operationStatus, ODR_CONTEXT,
+		     3, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 4) &&
+	(odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->diagnostics,
+			 &(*p)->num_diagnostics, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_External, &(*p)->taskPackage, ODR_CONTEXT, 5, 1) &&
+        z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+        odr_sequence_end(o);
+}
+
+/* ------------------------ SORT ------------------------- */
+
+int z_SortAttributes(ODR o, Z_SortAttributes **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_oid(o, &(*p)->id, 0, 0) &&
+	z_AttributeList(o, &(*p)->list, 0, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_SortKey(ODR o, Z_SortKey **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKey_sortField,
+	 z_InternationalString, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKey_elementSpec,
+	 (Odr_fun)z_Specification, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKey_sortAttributes,
+	 (Odr_fun)z_SortAttributes, 0},
+	{-1, -1, -1, -1, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SortDbSpecific(ODR o, Z_SortDbSpecific **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_DatabaseName(o, &(*p)->databaseName, 0, 0) &&
+	z_SortKey(o, &(*p)->dbSort, 0, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_SortDbSpecificList(ODR o, Z_SortDbSpecificList **p, int opt,
+			 const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_SortDbSpecific, &(*p)->dbSpecific,
+			&(*p)->num_dbSpecific, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SortElement(ODR o, Z_SortElement **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_EXPLICIT, ODR_CONTEXT, 1, Z_SortElement_generic,
+	 (Odr_fun)z_SortKey, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortElement_databaseSpecific,
+	 (Odr_fun)z_SortDbSpecificList, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SortMissingValueAction(ODR o, Z_SortMissingValueAction **p, int opt,
+			     const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortMissingValAct_abort,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortMissingValAct_null,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortMissingValAct_valData,
+	 (Odr_fun)odr_octetstring, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SortKeySpec(ODR o, Z_SortKeySpec **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_SortElement(o, &(*p)->sortElement, 0, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->sortRelation, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->caseSensitivity,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_explicit(o, z_SortMissingValueAction, &(*p)->missingValueAction,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_SortResponse(ODR o, Z_SortResponse **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->sortStatus, ODR_CONTEXT,
+		     3, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->resultSetStatus, ODR_CONTEXT,
+		     4, 1) &&
+	odr_implicit(o, z_DiagRecs, &(*p)->diagnostics, ODR_CONTEXT, 5, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_SortKeySpecList(ODR o, Z_SortKeySpecList **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_SortKeySpec, &(*p)->specs,
+			&(*p)->num_specs, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SortRequest(ODR o, Z_SortRequest **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, z_StringList, &(*p)->inputResultSetNames, 
+		     ODR_CONTEXT, 3, 0) &&
+	odr_implicit(o, z_InternationalString, &(*p)->sortedResultSetName,
+		     ODR_CONTEXT, 4, 0) &&
+	odr_implicit(o, z_SortKeySpecList, &(*p)->sortSequence, ODR_CONTEXT,
+		     5, 0) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ---------------------- Resource Report ---------------- */
+
+int z_ResourceReportRequest(ODR o, Z_ResourceReportRequest **p, int opt,
+			    const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, z_ReferenceId, &(*p)->opId, ODR_CONTEXT, 210, 1) &&
+	odr_implicit(o, odr_oid, &(*p)->prefResourceReportFormat, ODR_CONTEXT,
+		     49, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ResourceReportResponse(ODR o, Z_ResourceReportResponse **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        z_ReferenceId(o, &(*p)->referenceId, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->resourceReportStatus,
+		     ODR_CONTEXT, 50, 0) &&
+	odr_explicit(o, z_External, &(*p)->resourceReport, ODR_CONTEXT,
+		     51, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ------------------------ APDU ------------------------- */
+
+int z_APDU(ODR o, Z_APDU **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 20, Z_APDU_initRequest,
+	 (Odr_fun)z_InitRequest, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 21, Z_APDU_initResponse,
+	 (Odr_fun)z_InitResponse, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 22, Z_APDU_searchRequest,
+	 (Odr_fun)z_SearchRequest, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 23, Z_APDU_searchResponse,
+	 (Odr_fun)z_SearchResponse, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 24, Z_APDU_presentRequest,
+	 (Odr_fun)z_PresentRequest, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 25, Z_APDU_presentResponse,
+	 (Odr_fun)z_PresentResponse, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 26, Z_APDU_deleteResultSetRequest,
+	 (Odr_fun)z_DeleteResultSetRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 27, Z_APDU_deleteResultSetResponse,
+	 (Odr_fun)z_DeleteResultSetResponse, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 28, Z_APDU_accessControlRequest,
+	 (Odr_fun)z_AccessControlRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 29, Z_APDU_accessControlResponse,
+	 (Odr_fun)z_AccessControlResponse, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 30, Z_APDU_resourceControlRequest,
+	 (Odr_fun)z_ResourceControlRequest, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 31, Z_APDU_resourceControlResponse,
+	 (Odr_fun)z_ResourceControlResponse, 0},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 32, Z_APDU_triggerResourceControlRequest,
+	 (Odr_fun)z_TriggerResourceControlRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 33, Z_APDU_resourceReportRequest,
+	 (Odr_fun)z_ResourceReportRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 34, Z_APDU_resourceReportResponse,
+	 (Odr_fun)z_ResourceReportResponse, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 35, Z_APDU_scanRequest,
+	 (Odr_fun)z_ScanRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 36, Z_APDU_scanResponse,
+	 (Odr_fun)z_ScanResponse, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 43, Z_APDU_sortRequest,
+	 (Odr_fun)z_SortRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 44, Z_APDU_sortResponse,
+	 (Odr_fun)z_SortResponse, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 45, Z_APDU_segmentRequest,
+	 (Odr_fun)z_Segment, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 46, Z_APDU_extendedServicesRequest,
+	 (Odr_fun)z_ExtendedServicesRequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 47, Z_APDU_extendedServicesResponse,
+	 (Odr_fun)z_ExtendedServicesResponse},
+	{ODR_IMPLICIT, ODR_CONTEXT, 48, Z_APDU_close,
+	 (Odr_fun)z_Close, 0},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_APDU *)odr_malloc(o, sizeof(**p));
+    odr_setlenlen(o, 5);
+    if (!odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+    {
+    	if (o->direction == ODR_DECODE)
+	    *p = 0;
+	return opt && odr_ok(o);
+    }
+    return 1;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-acc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-acc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-acc.c	(revision 21083)
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:46  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.9  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.7  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.6  1998/01/05 09:04:57  adam
+ * Fixed bugs in encoders/decoders - Not operator (!) missing.
+ *
+ * Revision 1.5  1995/09/29 17:11:53  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:41  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/08/15  11:59:41  quinn
+ * Updated External
+ *
+ * Revision 1.2  1995/06/05  10:52:05  quinn
+ * Fixed some negligences.
+ *
+ * Revision 1.1  1995/06/02  09:49:15  quinn
+ * Adding access control
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_Encryption1(ODR o, Z_Encryption1 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_octetstring, &(*p)->cryptType,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, odr_octetstring, &(*p)->credential,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, odr_octetstring, &(*p)->data, ODR_CONTEXT, 3, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_EnumeratedPrompt1(ODR o, Z_EnumeratedPrompt1 **p, int opt,
+			const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->suggestedString, ODR_CONTEXT,
+		     2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_PromptId1(ODR o, Z_PromptId1 **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptId1_enumeratedPrompt,
+	 (Odr_fun)z_EnumeratedPrompt1, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptId1_nonEnumeratedPrompt,
+	 odr_visiblestring, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_PromptId1 *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_PromptInfo1(ODR o, Z_PromptInfo1 **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Challenge1_character,
+	 odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Challenge1_encrypted,
+	 (Odr_fun)z_Encryption1, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_PromptInfo1 *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ChallengeUnit1(ODR o, Z_ChallengeUnit1 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_PromptId1, &(*p)->promptId, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->defaultResponse,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_explicit(o, z_PromptInfo1, &(*p)->promptInfo,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->regExpr,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit(o, odr_null, &(*p)->responseRequired,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, odr_visiblestring, &(*p)->allowedValues,
+			 &(*p)->num_values, 0) || odr_ok(o)) &&
+	odr_implicit(o, odr_null, &(*p)->shouldSave, ODR_CONTEXT, 7, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 8, 1) &&
+	odr_implicit(o, z_External, &(*p)->diagnostic, ODR_CONTEXT, 9, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Challenge1(ODR o, Z_Challenge1 **p, int opt, const char *name)
+{
+    if (o->direction == ODR_ENCODE)
+    	*p = (Z_Challenge1 *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_ChallengeUnit1, &(*p)->list,
+			&(*p)->num_challenges, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ResponseUnit1(ODR o, Z_ResponseUnit1 **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Response1_string,
+	 odr_visiblestring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Response1_accept,
+	 (Odr_fun)odr_bool, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Response1_acknowledge,
+	 (Odr_fun)odr_null, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 4, Z_Response1_diagnostic,
+	 (Odr_fun)z_DiagRec, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Response1_encrypted,
+	 (Odr_fun)z_Encryption1, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_PromptId1, &(*p)->promptId, ODR_CONTEXT, 1, 0) &&
+	odr_constructed_begin(o, p, ODR_CONTEXT, 2, 0) &&
+	odr_choice(o, arm, &(*p)->u, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_sequence_end(o);
+}
+
+int z_Response1(ODR o, Z_Response1 **p, int opt, const char *name)
+{
+    if (o->direction == ODR_ENCODE)
+    	*p = (Z_Response1 *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_ResponseUnit1, &(*p)->list,
+			&(*p)->num_responses, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_PromptObject1(ODR o, Z_PromptObject1 **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptObject1_challenge,
+	 (Odr_fun)z_Challenge1, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptObject1_response,
+	 (Odr_fun)z_Response1, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+    	*p = (Z_PromptObject1 *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+    	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-add.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-add.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-add.c	(revision 21083)
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 1995-1999, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:47  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.6  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.5  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.4  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.3  1998/01/05 09:04:57  adam
+ * Fixed bugs in encoders/decoders - Not operator (!) missing.
+ *
+ * Revision 1.2  1997/04/30 08:52:02  quinn
+ * Null
+ *
+ * Revision 1.1  1996/10/10  11:52:18  quinn
+ * Added SearchResult additionalInfo
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_ResultsByDBList (ODR o, Z_ResultsByDBList **p, int opt, const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_sequence_of (o, z_DatabaseName, &(*p)->elements,
+        &(*p)->num, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ResultsByDB_elem (ODR o, Z_ResultsByDB_elem **p, int opt,
+			const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ResultsByDB_all,
+	 (Odr_fun)odr_null, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ResultsByDB_list,
+	 (Odr_fun)z_ResultsByDBList, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
+        odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+        odr_constructed_end (o) &&
+        odr_implicit (o, odr_integer,
+		      &(*p)->count, ODR_CONTEXT, 2, 1) &&
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->resultSetName, ODR_CONTEXT, 3, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_ResultsByDB (ODR o, Z_ResultsByDB **p, int opt, const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_sequence_of (o, (Odr_fun)z_ResultsByDB_elem, &(*p)->elements,
+			 &(*p)->num, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_QueryExpressionTerm (ODR o, Z_QueryExpressionTerm **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_explicit (o, z_Term,
+		      &(*p)->queryTerm, ODR_CONTEXT, 1, 0) &&
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->termComment, ODR_CONTEXT, 2, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_QueryExpression (ODR o, Z_QueryExpression **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryExpression_term,
+         (Odr_fun)z_QueryExpressionTerm, 0},
+        {ODR_EXPLICIT, ODR_CONTEXT, 2, Z_QueryExpression_query,
+	 (Odr_fun)z_Query, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_initmember(o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SearchInfoReport_elem (ODR o, Z_SearchInfoReport_elem **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->subqueryId, ODR_CONTEXT, 1, 1) &&
+        odr_implicit (o, odr_bool,
+		      &(*p)->fullQuery, ODR_CONTEXT, 2, 0) &&
+        odr_explicit (o, z_QueryExpression,
+		      &(*p)->subqueryExpression, ODR_CONTEXT, 3, 1) &&
+        odr_explicit (o, z_QueryExpression,
+		      &(*p)->subqueryInterpretation, ODR_CONTEXT, 4, 1) &&
+        odr_explicit (o, z_QueryExpression,
+		      &(*p)->subqueryRecommendation, ODR_CONTEXT, 5, 1) &&
+        odr_implicit (o, odr_integer,
+		      &(*p)->subqueryCount, ODR_CONTEXT, 6, 1) &&
+        odr_implicit (o, z_IntUnit,
+		      &(*p)->subqueryWeight, ODR_CONTEXT, 7, 1) &&
+        odr_implicit (o, z_ResultsByDB,
+		      &(*p)->resultsByDB, ODR_CONTEXT, 8, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt,
+			const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_sequence_of (o, (Odr_fun)z_SearchInfoReport_elem, &(*p)->elements,
+			 &(*p)->num, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-arc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-arc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-arc.c	(revision 21083)
@@ -0,0 +1,200 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:47  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.2  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.1  1996/06/10 08:55:20  quinn
+ * Added Summary, OPAC
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+/* ----------------------- Summary Record --------------- */
+
+int z_FormatSpec(ODR o, Z_FormatSpec **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->type,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->size, ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->bestPosn, ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_BriefBib(ODR o, Z_BriefBib **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->title,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_InternationalString, &(*p)->author,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->callNumber,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->recordType,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->bibliographicLevel,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, (Odr_fun)z_FormatSpec, &(*p)->format,
+			 &(*p)->num_format, 0) ||
+	 odr_ok(o)) &&
+	odr_implicit(o, z_InternationalString, &(*p)->publicationPlace,
+		     ODR_CONTEXT, 7, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->publicationDate,
+		     ODR_CONTEXT, 8, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->targetSystemKey,
+		     ODR_CONTEXT, 9, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->satisfyingElement,
+		     ODR_CONTEXT, 10, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->rank,
+		     ODR_CONTEXT, 11, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->documentId,
+		     ODR_CONTEXT, 12, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->abstract,
+		     ODR_CONTEXT, 13, 1) &&
+	z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ----------------------- Summary Record --------------- */
+
+int z_CircRecord(ODR o, Z_CircRecord **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_bool, &(*p)->availableNow, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->availabilityDate,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->availableThru,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->restrictions,
+		     ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->itemId,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit(o, odr_bool, &(*p)->renewable, ODR_CONTEXT, 6, 0) &&
+	odr_implicit(o, odr_bool, &(*p)->onHold, ODR_CONTEXT, 7, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
+		     ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->midspine,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->temporaryLocation,
+		     ODR_CONTEXT, 10, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Volume(ODR o, Z_Volume **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->enumeration,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->chronology,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_HoldingsAndCircData(ODR o, Z_HoldingsAndCircData **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->typeOfRecord,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->encodingLevel,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->format,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->receiptAcqStatus,
+		     ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->generalRetention,
+		     ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->completeness,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->dateOfReport,
+		     ODR_CONTEXT, 7, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->nucCode,
+		     ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->localLocation,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->shelvingLocation,
+		     ODR_CONTEXT, 10, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->callNumber,
+		     ODR_CONTEXT, 11, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->shelvingData,
+		     ODR_CONTEXT, 12, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->copyNumber,
+		     ODR_CONTEXT, 13, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->publicNote,
+		     ODR_CONTEXT, 14, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->reproductionNote,
+		     ODR_CONTEXT, 15, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->termsUseRepro,
+		     ODR_CONTEXT, 16, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->enumAndChron,
+		     ODR_CONTEXT, 17, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 18) &&
+	(odr_sequence_of(o, (Odr_fun)z_Volume, &(*p)->volumes,
+			 &(*p)->num_volumes, 0) ||
+	 odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 19) &&
+	(odr_sequence_of(o, (Odr_fun)z_CircRecord, &(*p)->circulationData,
+			 &(*p)->num_circulationData, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_HoldingsRecord(ODR o, Z_HoldingsRecord **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_HoldingsRecord_marcHoldingsRecord,
+	 (Odr_fun)z_External, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_HoldingsRecord_holdingsAndCirc,
+	 (Odr_fun)z_HoldingsAndCircData, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_OPACRecord(ODR o, Z_OPACRecord **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_External, &(*p)->bibliographicRecord,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_HoldingsRecord, &(*p)->holdingsData,
+			 &(*p)->num_holdingsData, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-dat.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-dat.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-dat.c	(revision 21083)
@@ -0,0 +1,193 @@
+/*
+ * This file is part of the YAZ toolkit:
+ * Copyright (c) 1998-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * Contribution by Ronald van Der Meer (RVDM):
+ *  Databasix Information Systems B.V., Utrecht, The Netherlands.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:48  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.2  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.1  1998/02/10 15:31:46  adam
+ * Implemented date and time structure. Changed the Update Extended
+ * Service.
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_MonthAndDay(ODR o, Z_MonthAndDay **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, odr_integer, &(*p)->month, ODR_CONTEXT, 2, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->day, ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Quarter(ODR o, Z_Quarter **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Quarter_first,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Quarter_second,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Quarter_third,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Quarter_fourth,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Season(ODR o, Z_Season **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Season_winter,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Season_spring,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Season_summer,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Season_autumn,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_PartOfYear(ODR o, Z_PartOfYear **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PartOfYear_monthAndDay,
+	 (Odr_fun) z_MonthAndDay, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PartOfYear_julianDay,
+	 (Odr_fun) odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_PartOfYear_weekNumber,
+	 (Odr_fun) odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_PartOfYear_quarter,
+	 (Odr_fun) z_Quarter, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_PartOfYear_season,
+	 (Odr_fun) z_Season, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Era(ODR o, Z_Era **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Era_decade, (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Era_century, (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Era_millennium, (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_DateFlags(ODR o, Z_DateFlags **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, odr_null, &(*p)->circa, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_Era, &(*p)->era, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Date(ODR o, Z_Date **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, odr_integer, &(*p)->year, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_PartOfYear, &(*p)->partOfYear, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_DateFlags, &(*p)->flags, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Zone(ODR o, Z_Zone **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Zone_local, (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Zone_utc, (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Zone_utcOffset,
+	 (Odr_fun)odr_integer, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Time(ODR o, Z_Time **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, odr_integer, &(*p)->hour, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->minute, ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->second, ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, z_IntUnit, &(*p)->partOfSecond, ODR_CONTEXT, 4, 1) &&
+	odr_implicit(o, z_Zone, &(*p)->zone, ODR_CONTEXT, 5, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_DateTime(ODR o, Z_DateTime **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, z_Date, &(*p)->z3950Date, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_Time, &(*p)->z3950Time, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-dia.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-dia.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-dia.c	(revision 21083)
@@ -0,0 +1,423 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:49  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.7  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.5  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.4  1996/01/22 09:46:34  quinn
+ * Added Sort PDU. Moved StringList to main protocol file.
+ *
+ * Revision 1.3  1995/09/29  17:11:54  quinn
+ * Smallish
+ *
+ * Revision 1.2  1995/09/27  15:02:41  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.1  1995/08/29  11:19:31  quinn
+ * Added Diagnostic Format
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_TooMany(ODR o, Z_TooMany **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->tooManyWhat, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->max, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_BadSpec(ODR o, Z_BadSpec **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_Specification, &(*p)->spec, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 2, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_Specification, &(*p)->goodOnes,
+	    &(*p)->num_goodOnes, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_DbUnavailWhy(ODR o, Z_DbUnavailWhy **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->reasonCode, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->message, ODR_CONTEXT,
+	    2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_DbUnavail(ODR o, Z_DbUnavail **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_DatabaseName, &(*p)->db, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_DbUnavailWhy, &(*p)->why, ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_Attribute(ODR o, Z_Attribute **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->id, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 3, 1) &&
+	odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 4, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_AttCombo(ODR o, Z_AttCombo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit(o, z_AttributeList, &(*p)->unsupportedCombination,
+	    ODR_CONTEXT, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_AttributeList, &(*p)->alternatives,
+	    &(*p)->num_alternatives, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_DiagTerm(ODR o, Z_DiagTerm **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->problem, ODR_CONTEXT, 1, 1) &&
+	odr_explicit(o, z_Term, &(*p)->term, ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_Proximity(ODR o, Z_Proximity **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Proximity_resultSets,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Proximity_badSet,
+	    (Odr_fun)z_InternationalString, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Proximity_relation,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Proximity_unit,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Proximity_distance,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_Proximity_attributes,
+	 (Odr_fun)z_AttributeList, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Proximity_ordered,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Proximity_exclusion,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Proximity *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AttrListList(ODR o, Z_AttrListList **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_AttrListList *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_AttributeList, &(*p)->lists,
+			&(*p)->num_lists, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Scan(ODR o, Z_Scan **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ScanD_nonZeroStepSize,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ScanD_specifiedStepSize,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ScanD_termList1,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ScanD_termList2,
+	 (Odr_fun)z_AttrListList, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ScanD_posInResponse,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_ScanD_resources,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_ScanD_endOfList,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Scan *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Sort(ODR o, Z_Sort **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortD_sequence,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortD_noRsName,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortD_tooMany,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortD_incompatible,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_SortD_generic,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_SortD_dbSpecific,
+	 (Odr_fun)odr_null, 0},
+#if 0
+	{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_SortD_sortElement,
+	 (Odr_fun)z_SortElement, 0},
+#endif
+	{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_SortD_key,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_SortD_action,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 9, Z_SortD_illegal,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 10, Z_SortD_inputTooLarge,
+	 (Odr_fun)z_StringList, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 11, Z_SortD_aggregateTooLarge,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Sort *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Segmentation(ODR o, Z_Segmentation **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SegmentationD_segments,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Segmentation *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ExtServices(ODR o, Z_ExtServices **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ExtServicesD_req,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ExtServicesD_permission,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ExtServicesD_immediate,
+	 (Odr_fun)odr_integer, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ExtServices *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_OidList(ODR o, Z_OidList **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_OidList *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->oids, &(*p)->num_oids, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AccessCtrl(ODR o, Z_AccessCtrl **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_AccessCtrlD_noUser,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_AccessCtrlD_refused,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AccessCtrlD_simple,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AccessCtrlD_oid,
+	 (Odr_fun)z_OidList, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_AccessCtrlD_alternative,
+	 (Odr_fun)z_OidList, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_AccessCtrlD_pwdInv,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_AccessCtrlD_pwdExp,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+	*p = (Z_AccessCtrl *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_RecordSyntax(ODR o, Z_RecordSyntax **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_oid, &(*p)->unsupportedSyntax,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->suggestedAlternatives,
+			 &(*p)->num_suggestedAlternatives, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_DiagFormat(ODR o, Z_DiagFormat **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1000, Z_DiagFormat_tooMany,
+	 (Odr_fun)z_TooMany, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1001, Z_DiagFormat_badSpec,
+	 (Odr_fun)z_BadSpec, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1002, Z_DiagFormat_dbUnavail,
+	 (Odr_fun)z_DbUnavail, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1003, Z_DiagFormat_unSupOp,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1004, Z_DiagFormat_attribute,
+	 (Odr_fun)z_Attribute, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1005, Z_DiagFormat_attCombo,
+	 (Odr_fun)z_AttCombo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1006, Z_DiagFormat_term,
+	 (Odr_fun)z_DiagTerm, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1007, Z_DiagFormat_proximity,
+	 (Odr_fun)z_Proximity, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1008, Z_DiagFormat_scan,
+	 (Odr_fun)z_Scan, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1009, Z_DiagFormat_sort,
+	 (Odr_fun)z_Sort, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1010, Z_DiagFormat_segmentation,
+	 (Odr_fun)z_Segmentation, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1011, Z_DiagFormat_extServices,
+	 (Odr_fun)z_ExtServices, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 1012, Z_DiagFormat_accessCtrl,
+	 (Odr_fun)z_AccessCtrl, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1013, Z_DiagFormat_recordSyntax,
+	 (Odr_fun)z_RecordSyntax, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+	*p = (Z_DiagFormat *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Diagnostic(ODR o, Z_Diagnostic **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Diagnostic_defaultDiagRec,
+	 (Odr_fun)z_DefaultDiagFormat, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Diagnostic_explicitDiagnostic,
+	 (Odr_fun)z_DiagFormat, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Diagnostic *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_DiagnosticUnit(ODR o, Z_DiagnosticUnit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_Diagnostic, &(*p)->diagnostic, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->message,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_DiagnosticFormat(ODR o, Z_DiagnosticFormat **p, int opt,
+		       const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_DiagnosticFormat *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_DiagnosticUnit, &(*p)->diagnostics,
+	&(*p)->num_diagnostics, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-esp.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-esp.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-esp.c	(revision 21083)
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:49  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.5  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.4  1999/04/20 09:56:47  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.3  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.2  1998/02/10 15:31:46  adam
+ * Implemented date and time structure. Changed the Update Extended
+ * Service.
+ *
+ * Revision 1.1  1995/10/12 10:34:37  quinn
+ * Added Espec-1.
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_OccurValues(ODR o, Z_OccurValues **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->start, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->howMany, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_Occurrences(ODR o, Z_Occurrences **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Occurrences_all,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Occurrences_last,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Occurrences_values,
+	 (Odr_fun)z_OccurValues, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_Occurrences *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SpecificTag(ODR o, Z_SpecificTag **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->schemaId, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
+	odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue, ODR_CONTEXT,
+		     2, 0) &&
+	odr_explicit(o, z_Occurrences, &(*p)->occurrences,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ETagUnit(ODR o, Z_ETagUnit **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ETagUnit_specificTag,
+	 (Odr_fun)z_SpecificTag, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ETagUnit_wildThing,
+	 (Odr_fun)z_Occurrences, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ETagUnit_wildPath,
+	 (Odr_fun)odr_null, 0},
+	{-1, -1, -1 -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ETagUnit *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ETagPath(ODR o, Z_ETagPath **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ETagPath *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_ETagUnit, &(*p)->tags,
+			&(*p)->num_tags, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_SimpleElement(ODR o, Z_SimpleElement **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_ETagPath, &(*p)->path, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_Variant, &(*p)->variantRequest,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_CompoPrimitives(ODR o, Z_CompoPrimitives **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_CompoPrimitives *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, z_InternationalString, &(*p)->primitives,
+			&(*p)->num_primitives, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_CompoSpecs(ODR o, Z_CompoSpecs **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_CompoSpecs *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_SimpleElement, &(*p)->specs,
+			&(*p)->num_specs, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_CompositeElement(ODR o, Z_CompositeElement **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_CompoElement_primitives,
+	 (Odr_fun)z_CompoPrimitives, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_CompoElement_specs,
+	 (Odr_fun)z_CompoSpecs, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_constructed_begin(o, &(*p)->elementList, ODR_CONTEXT, 1, 0) &&
+	odr_choice(o, arm, &(*p)->elementList, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_implicit(o, z_ETagPath, &(*p)->deliveryTag, ODR_CONTEXT, 2, 0) &&
+	odr_implicit(o, z_Variant, &(*p)->variantRequest, ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ElementRequest(ODR o, Z_ElementRequest **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ERequest_simpleElement,
+	 (Odr_fun)z_SimpleElement, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ERequest_compositeElement,
+	 (Odr_fun)z_CompositeElement, 0},
+	{-1, -1, -1 -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ElementRequest *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Espec1(ODR o, Z_Espec1 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->elementSetNames,
+			 &(*p)->num_elementSetNames, 0) || odr_ok(o)) &&
+	odr_implicit(o, odr_oid, &(*p)->defaultVariantSetId,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, z_Variant, &(*p)->defaultVariantRequest,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->defaultTagType,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)z_ElementRequest, &(*p)->elements,
+			 &(*p)->num_elements, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-exd.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-exd.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-exd.c	(revision 21083)
@@ -0,0 +1,417 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:50  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.10  1999/05/26 13:49:12  adam
+ * DB Update implemented in client (very basic).
+ *
+ * Revision 1.9  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.8  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.7  1998/02/10 15:31:46  adam
+ * Implemented date and time structure. Changed the Update Extended
+ * Service.
+ *
+ * Revision 1.6  1998/01/05 09:04:57  adam
+ * Fixed bugs in encoders/decoders - Not operator (!) missing.
+ *
+ * Revision 1.5  1997/04/30 08:52:02  quinn
+ * Null
+ *
+ * Revision 1.4  1996/10/10  12:35:12  quinn
+ * Added Update extended service.
+ *
+ * Revision 1.3  1995/09/29  17:11:54  quinn
+ * Smallish
+ *
+ * Revision 1.2  1995/09/27  15:02:41  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.1  1995/08/21  09:16:32  quinn
+ * Added Extended services + Item Order
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_TaskPackage(ODR o, Z_TaskPackage **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->packageType, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->packageName,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->userId,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_IntUnit, &(*p)->retentionTime, ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, z_Permissions, &(*p)->permissions,
+		     ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->description,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, odr_octetstring, &(*p)->targetReference,
+		     ODR_CONTEXT, 7, 0) &&
+        odr_implicit(o, odr_generalizedtime, &(*p)->creationDateTime,
+		     ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->taskStatus,
+		     ODR_CONTEXT, 9, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 10) &&
+	(odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->packageDiagnostics,
+			 &(*p)->num_packageDiagnostics, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_External, &(*p)->taskSpecificParameters,
+		     ODR_CONTEXT, 11, 0) &&
+	odr_sequence_end(o);
+}
+
+/* ----------------------- ITEM ORDER --------------------- */
+
+int z_IOTargetPart(ODR o, Z_IOTargetPart **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_External, &(*p)->statusOrErrorReport, ODR_CONTEXT,
+	    2, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->auxiliaryStatus, ODR_CONTEXT,
+	    3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IOResultSetItem(ODR o, Z_IOResultSetItem **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_InternationalString, &(*p)->resultSetId, ODR_CONTEXT,
+	    1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->item, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IOOriginPartNotToKeep(ODR o, Z_IOOriginPartNotToKeep **p, int opt,
+			    const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_IOResultSetItem, &(*p)->resultSetItem, ODR_CONTEXT,
+	    1, 0) &&
+	odr_implicit(o, z_External, &(*p)->itemRequest, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IOContact(ODR o, Z_IOContact **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
+	    1, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->phone, ODR_CONTEXT,
+	    2, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->email, ODR_CONTEXT,
+	    3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IOCreditCardInfo(ODR o, Z_IOCreditCardInfo **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, z_InternationalString, &(*p)->nameOnCard, ODR_CONTEXT,
+	    1, 0) &&
+	odr_implicit(o, z_InternationalString, &(*p)->expirationDate,
+	    ODR_CONTEXT, 2, 0) &&
+	odr_implicit(o, z_InternationalString, &(*p)->cardNumber, ODR_CONTEXT,
+	    3, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_IOBilling(ODR o, Z_IOBilling **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_IOBilling_billInvoice,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IOBilling_prepay,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IOBilling_depositAccount,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IOBilling_creditCard,
+	 (Odr_fun)z_IOCreditCardInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_IOBilling_cardInfoPreviouslySupplied,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_IOBilling_privateKnown,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_IOBilling_privateNotKnown,
+	 (Odr_fun)z_External, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_constructed_begin(o, &(*p)->paymentMethod,
+			      ODR_CONTEXT, 1, 0) &&
+	odr_choice(o, arm, &(*p)->paymentMethod, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_implicit(o, z_InternationalString, &(*p)->customerReference,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->customerPONumber,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IOOriginPartToKeep(ODR o, Z_IOOriginPartToKeep **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_External, &(*p)->supplDescription,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_IOContact, &(*p)->contact, ODR_CONTEXT, 2, 1) &&
+	odr_implicit(o, z_IOBilling, &(*p)->addlBilling,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_IORequest(ODR o, Z_IORequest **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return 
+    	odr_implicit(o, z_IOOriginPartToKeep, &(*p)->toKeep,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_IOOriginPartNotToKeep, &(*p)->notToKeep,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_IOTaskPackage(ODR o, Z_IOTaskPackage **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_IOOriginPartToKeep, &(*p)->originPart,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, z_IOTargetPart, &(*p)->targetPart,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ItemOrder(ODR o, Z_ItemOrder **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ItemOrder_esRequest,
+	 (Odr_fun)z_IORequest, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ItemOrder_taskPackage,
+	 (Odr_fun)z_IOTaskPackage, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ItemOrder *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+/* ----------------------- ITEM UPDATE -------------------- */
+
+int z_IUSuppliedRecordsId (ODR o, Z_IUSuppliedRecordsId **p, int opt,
+			   const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecordsId_timeStamp,
+         odr_generalizedtime, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecordsId_versionNumber,
+         z_InternationalString, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecordsId_previousVersion,
+         (Odr_fun)odr_external, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_initmember(o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_IUCorrelationInfo (ODR o, Z_IUCorrelationInfo **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->note, ODR_CONTEXT, 1, 1) &&
+        odr_implicit (o, odr_integer,
+		      &(*p)->id, ODR_CONTEXT, 2, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_IUSuppliedRecords_elem (ODR o, Z_IUSuppliedRecords_elem **p, int opt,
+			      const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecords_number,
+         (Odr_fun)odr_integer, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecords_string,
+         (Odr_fun)z_InternationalString, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecords_opaque,
+         (Odr_fun)odr_octetstring, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
+	  odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+	  odr_constructed_end (o)) || odr_ok(o)) &&
+        odr_explicit (o, z_IUSuppliedRecordsId,
+		      &(*p)->supplementalId, ODR_CONTEXT, 2, 1) &&
+        odr_implicit (o, z_IUCorrelationInfo,
+		      &(*p)->correlationInfo, ODR_CONTEXT, 3, 1) &&
+        odr_implicit (o, z_External,
+		      &(*p)->record, ODR_CONTEXT, 4, 0) &&
+        odr_sequence_end (o);
+}
+
+int z_IUSuppliedRecords (ODR o, Z_IUSuppliedRecords **p, int opt,
+			 const char *name)
+{
+    if (!odr_initmember (o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_sequence_of (o, (Odr_fun)z_IUSuppliedRecords_elem, &(*p)->elements,
+			 &(*p)->num, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_IUTaskPackageRecordStructure (ODR o, Z_IUTaskPackageRecordStructure **p,
+				    int opt, const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUTaskPackageRecordStructure_record,
+         (Odr_fun)odr_external, 0},
+        {ODR_EXPLICIT, ODR_CONTEXT, 2,
+	 Z_IUTaskPackageRecordStructure_surrogateDiagnostics,
+         (Odr_fun)z_DiagRecs, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        ((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, 0) &&
+	  odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+	  odr_constructed_end (o)) || odr_ok(o)) &&
+        odr_implicit (o, z_IUCorrelationInfo,
+		      &(*p)->correlationInfo, ODR_CONTEXT, 2, 1) &&
+        odr_implicit (o, odr_integer,
+		      &(*p)->recordStatus, ODR_CONTEXT, 3, 0) &&
+	odr_implicit (o, z_DiagRecs, 
+		      &(*p)->supplementalDiagnostics, ODR_CONTEXT, 4, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_IUOriginPartToKeep (ODR o, Z_IUOriginPartToKeep **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_implicit (o, odr_integer,
+		      &(*p)->action, ODR_CONTEXT, 1, 0) &&
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->databaseName, ODR_CONTEXT, 2, 0) &&
+        odr_implicit (o, odr_oid,
+		      &(*p)->schema, ODR_CONTEXT, 3, 1) &&
+        odr_implicit (o, z_InternationalString,
+		      &(*p)->elementSetName, ODR_CONTEXT, 4, 1) &&
+	odr_implicit (o, odr_external,
+		      &(*p)->actionQualifier, ODR_CONTEXT, 5, 1) &&
+        odr_sequence_end (o);
+}
+
+int z_IUTargetPart (ODR o, Z_IUTargetPart **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_implicit (o, odr_integer,
+		      &(*p)->updateStatus, ODR_CONTEXT, 1, 0) &&
+        odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+        (odr_sequence_of(o, (Odr_fun)z_DiagRec, &(*p)->globalDiagnostics,
+			 &(*p)->num_globalDiagnostics, 0) || odr_ok(o)) &&
+        odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+        odr_sequence_of(o, (Odr_fun)z_IUTaskPackageRecordStructure,
+			&(*p)->taskPackageRecords,
+			&(*p)->num_taskPackageRecords, 0) &&
+        odr_sequence_end (o);
+}
+
+int z_IUUpdateEsRequest (ODR o, Z_IUUpdateEsRequest **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_explicit (o, z_IUOriginPartToKeep,
+		      &(*p)->toKeep, ODR_CONTEXT, 1, 0) &&
+        odr_explicit (o, z_IUSuppliedRecords,
+		      &(*p)->notToKeep, ODR_CONTEXT, 2, 0) &&
+        odr_sequence_end (o);
+}
+
+int z_IUUpdateTaskPackage (ODR o, Z_IUUpdateTaskPackage **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+        return opt && odr_ok (o);
+    return
+        odr_explicit (o, z_IUOriginPartToKeep,
+		      &(*p)->originPart, ODR_CONTEXT, 1, 0) &&
+        odr_explicit (o, z_IUTargetPart,
+		      &(*p)->targetPart, ODR_CONTEXT, 2, 0) &&
+        odr_sequence_end (o);
+}
+
+int z_IUUpdate (ODR o, Z_IUUpdate **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = {
+        {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUUpdate_esRequest,
+         (Odr_fun)z_IUUpdateEsRequest, 0},
+        {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUUpdate_taskPackage,
+         (Odr_fun)z_IUUpdateTaskPackage, 0},
+        {-1, -1, -1, -1, 0, 0}
+    };
+    if (!odr_initmember(o, p, sizeof(**p)))
+        return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+        return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-exp.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-exp.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-exp.c	(revision 21083)
@@ -0,0 +1,1568 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:51  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.13  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.12  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.11  1999/03/18 12:57:13  adam
+ * Fixed bug in TargetInfo encoder/decoder.
+ *
+ * Revision 1.10  1998/05/18 13:06:52  adam
+ * Changed the way attribute sets are handled by the retriaval module.
+ * Extended Explain conversion / schema.
+ * Modified server and client to work with ASN.1 compiled protocol handlers.
+ *
+ * Revision 1.9  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1996/01/02 11:46:41  quinn
+ * Changed 'operator' to 'roperator' to avoid C++ conflict.
+ *
+ * Revision 1.7  1995/12/14  16:28:07  quinn
+ * More explain stuff.
+ *
+ * Revision 1.6  1995/12/14  11:09:09  quinn
+ * Fixed bug in tagging.
+ *
+ * Revision 1.5  1995/12/05  11:15:50  quinn
+ * Work.
+ *
+ * Revision 1.4  1995/09/29  17:11:54  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:42  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/08/15  11:59:43  quinn
+ * Updated External
+ *
+ * Revision 1.1  1995/08/10  08:54:02  quinn
+ * Added Explain
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_LanguageCode(ODR o, char **p, int opt, const char *name);
+int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt, const char *name);
+int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt, const char *name);
+int z_HumanString(ODR o, Z_HumanString **p, int opt, const char *name);
+int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt, const char *name);
+int z_IconObject(ODR o, Z_IconObject **p, int opt, const char *name);
+int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt, const char *name);
+int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt,
+		       const char *name);
+int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt,
+			const char *name);
+int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt,
+			  const char *name);
+int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt, const char *name);
+int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt, const char *name);
+int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt,
+		       const char *name);
+int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt,
+			 const char *name);
+int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt,
+			  const char *name);
+int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt, const char *name);
+int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt,
+			  const char *name);
+int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt,
+			 const char *name);
+int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt, const char *name);
+int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt,
+		       const char *name);
+int z_SearchKey(ODR o, Z_SearchKey **p, int opt, const char *name);
+int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt,
+			     const char *name);
+int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt,
+			 const char *name);
+int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt,
+		       const char *name);
+int z_Costs(ODR o, Z_Costs **p, int opt, const char *name);
+int z_Charge(ODR o, Z_Charge **p, int opt, const char *name);
+int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt, const char *name);
+int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt,
+			    const char *name);
+int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt,
+			   const char *name);
+int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt,
+			 const char *name);
+int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt,
+			  const char *name);
+int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt, const char *name);
+int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt, const char *name);
+int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt, const char *name);
+int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt, const char *name);
+int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt, const char *name);
+int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt, const char *name);
+int z_PathUnit(ODR o, Z_PathUnit **p, int opt, const char *name);
+int z_Path(ODR o, Z_Path **p, int opt, const char *name);
+int z_ElementInfoList(ODR o, Z_Path **p, int opt, const char *name);
+int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt, const char *name);
+int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt,
+			 const char *name);
+int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt, const char *name);
+int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt,
+		       const char *name);
+int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt,
+		       const char *name);
+int z_AttributeType(ODR o, Z_AttributeType **p, int opt, const char *name);
+int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt,
+			   const char *name);
+int z_TermListElement(ODR o, Z_TermListElement **p, int opt, const char *name);
+int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt, const char *name);
+int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt,
+			   const char *name);
+int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt,
+		       const char *name);
+int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt,
+			  const char *name);
+int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt,
+			   const char *name);
+int z_OmittedAttributeInterpretation(ODR o,
+				     Z_OmittedAttributeInterpretation **p,
+				     int opt, const char *name);
+int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt, const char *name);
+int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt, const char *name);
+int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt,
+			const char *name);
+int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt,
+			     const char *name);
+int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt,
+			const char *name);
+int z_RecordTag(ODR o, Z_RecordTag **p, int opt, const char *name);
+int z_SortDetails(ODR o, Z_SortDetails **p, int opt, const char *name);
+int z_SortKeyDetails(ODR o, Z_SortKeyDetails **p, int opt, const char *name);
+int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt,
+			    const char *name);
+int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt, const char *name);
+int z_VariantClass(ODR o, Z_VariantClass **p, int opt, const char *name);
+int z_VariantType(ODR o, Z_VariantType **p, int opt, const char *name);
+int z_VariantValue(ODR o, Z_VariantValue **p, int opt, const char *name);
+int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt,
+			 const char *name);
+int z_ValueSet(ODR o, Z_ValueSet **p, int opt, const char *name);
+int z_ValueRange(ODR o, Z_ValueRange **p, int opt, const char *name);
+int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt,
+		       const char *name);
+int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt, const char *name);
+int z_UnitType(ODR o, Z_UnitType **p, int opt, const char *name);
+int z_Units(ODR o, Z_Units **p, int opt, const char *name);
+int z_CategoryList(ODR o, Z_CategoryList **p, int opt, const char *name);
+int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt, const char *name);
+int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt, const char *name);
+
+int z_LanguageCode(ODR o, char **p, int opt, const char *name)
+{
+    return z_InternationalString(o, p, opt, 0);
+}
+
+int z_CommonInfo(ODR o, Z_CommonInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_generalizedtime, &(*p)->dateAdded,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_generalizedtime, &(*p)->dateChanged,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, odr_generalizedtime, &(*p)->expiry,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_LanguageCode, &(*p)->humanStringLanguage,
+		     ODR_CONTEXT, 3, 1) &&
+        z_OtherInformation(o, &(*p)->otherInfo, 1, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_LanguageCode, &(*p)->language, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->text, ODR_CONTEXT,
+		     1, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_HumanString(ODR o, Z_HumanString **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_HumanStringUnit, &(*p)->strings,
+			&(*p)->num_strings, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = 
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IconObjectUnit_ianaType,
+	 z_InternationalString, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IconObjectUnit_z3950type,
+	 z_InternationalString, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IconObjectUnit_otherType,
+	 z_InternationalString, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+    	odr_constructed_begin(o, &(*p)->bodyType, ODR_CONTEXT, 1, 0) &&
+	odr_choice(o, arm, &(*p)->bodyType, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+        odr_implicit(o, odr_octetstring, &(*p)->content, ODR_CONTEXT, 2, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_IconObject(ODR o, Z_IconObject **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_IconObjectUnit, &(*p)->elements,
+    	&(*p)->num, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ContactInfo(ODR o, Z_ContactInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->address,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->email,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->phone,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_NetworkAddressIA(ODR o, Z_NetworkAddressIA **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->hostAddress,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->port, ODR_CONTEXT, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_NetworkAddressOPA(ODR o, Z_NetworkAddressOPA **p, int opt,
+			const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->pSel,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->sSel,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->tSel,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->nSap,
+		     ODR_CONTEXT, 3, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_NetworkAddressOther(ODR o, Z_NetworkAddressOther **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->type,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->address,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_NetworkAddress_iA,
+	 (Odr_fun)z_NetworkAddressIA, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_NetworkAddress_oPA,
+	 (Odr_fun)z_NetworkAddressOPA, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_NetworkAddress_other,
+	    (Odr_fun)z_NetworkAddressOther, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+	odr_implicit_settag(o, ODR_CONTEXT, 0) &&
+	(odr_sequence_of(o, (Odr_fun)z_QueryTypeDetails,
+			 &(*p)->queryTypesSupported,
+			 &(*p)->num_queryTypesSupported, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->diagnosticsSets,
+			 &(*p)->num_diagnosticsSets, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->attributeSetIds,
+			 &(*p)->num_attributeSetIds, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->schemas,
+			 &(*p)->num_schemas, 0) ||
+	 odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 4) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->recordSyntaxes,
+			 &(*p)->num_recordSyntaxes, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->resourceChallenges,
+			 &(*p)->num_resourceChallenges, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_AccessRestrictions, &(*p)->restrictedAccess,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, z_Costs, &(*p)->costInfo, ODR_CONTEXT, 8, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 9) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->variantSets,
+			 &(*p)->num_variantSets, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 10) &&
+	(odr_sequence_of(o, (Odr_fun)z_ElementSetName, &(*p)->elementSetNames,
+			 &(*p)->num_elementSetNames, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 11) &&
+	(odr_sequence_of(o, (Odr_fun)z_InternationalString, &(*p)->unitSystems,
+			 &(*p)->num_unitSystems, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
+	 (Odr_fun)z_PrivateCapabilities, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
+	 (Odr_fun)z_RpnCapabilities, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
+	 (Odr_fun)z_Iso8777Capabilities, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_QueryTypeDetails_z39_58,
+	 (Odr_fun)z_HumanString, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_QueryTypeDetails_erpn,
+	 (Odr_fun)z_RpnCapabilities, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_QueryTypeDetails_rankedList,
+	 (Odr_fun)z_HumanString, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->roperator,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_PrivateCapabilities(ODR o, Z_PrivateCapabilities **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit_settag(o, ODR_CONTEXT, 0) &&
+	(odr_sequence_of(o, (Odr_fun)z_PrivateCapOperator, &(*p)->operators,
+			 &(*p)->num_operators, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun)z_SearchKey, &(*p)->searchKeys,
+			 &(*p)->num_searchKeys, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_HumanString, &(*p)->description,
+			 &(*p)->num_description, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_RpnCapabilities(ODR o, Z_RpnCapabilities **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+	odr_implicit_settag(o, ODR_CONTEXT, 0) &&
+	(odr_sequence_of(o, (Odr_fun)odr_integer, &(*p)->operators,
+			 &(*p)->num_operators, 0) || odr_ok(o)) &&
+        odr_implicit(o, odr_bool, &(*p)->resultSetAsOperandSupported,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->restrictionOperandSupported,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, z_ProximitySupport, &(*p)->proximity, ODR_CONTEXT,
+		     3, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_Iso8777Capabilities(ODR o, Z_Iso8777Capabilities **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+	odr_implicit_settag(o, ODR_CONTEXT, 0) &&
+	odr_sequence_of(o, (Odr_fun)z_SearchKey, &(*p)->searchKeys,
+			&(*p)->num_searchKeys, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->restrictions, ODR_CONTEXT,
+		     1, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_ProxSupportPrivate(ODR o, Z_ProxSupportPrivate **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->unit, ODR_CONTEXT, 0, 0) &&
+	odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxSupportUnit_known,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxSupportUnit_private,
+	 (Odr_fun)z_ProxSupportPrivate, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ProximitySupport(ODR o, Z_ProximitySupport **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_bool, &(*p)->anySupport, ODR_CONTEXT, 0, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun)z_ProxSupportUnit, &(*p)->unitsSupported,
+			 &(*p)->num_unitsSupported, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_SearchKey(ODR o, Z_SearchKey **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->searchKey,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, odr_integer, &(*p)->accessType, ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->accessText, ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->accessChallenges,
+			 &(*p)->num_accessChallenges, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt,
+			 const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_AccessRestrictionsUnit, &(*p)->elements,
+			&(*p)->num, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_CostsOtherCharge(ODR o, Z_CostsOtherCharge **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_HumanString, &(*p)->forWhat, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_Charge, &(*p)->charge, ODR_CONTEXT, 2, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_Costs(ODR o, Z_Costs **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_Charge, &(*p)->connectCharge, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_Charge, &(*p)->connectTime, ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_Charge, &(*p)->displayCharge, ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_Charge, &(*p)->searchCharge, ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_Charge, &(*p)->subscriptCharge, ODR_CONTEXT, 4, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)z_CostsOtherCharge, &(*p)->otherCharges,
+			 &(*p)->num_otherCharges, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_Charge(ODR o, Z_Charge **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_IntUnit, &(*p)->cost, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_Unit, &(*p)->perWhat, ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->text, ODR_CONTEXT, 3, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, z_DatabaseName, &(*p)->databases,
+	&(*p)->num_databases, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt,
+			    const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->defaultAttributeSet,
+		     ODR_CONTEXT, 0, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	odr_sequence_of(o, (Odr_fun)z_AttributeCombination,
+			&(*p)->legalCombinations,
+			&(*p)->num_legalCombinations, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt,
+			   const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_AttributeOccurrence, &(*p)->occurrences,
+			&(*p)->num_occurrences, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt,
+			 const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->attributes,
+			&(*p)->num_attributes, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_AttributeOccurrence(ODR o, Z_AttributeOccurrence **p, int opt,
+			  const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AttributeOcc_any_or_none,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AttributeOcc_specific,
+	 (Odr_fun)z_AttributeValueList, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->attributeType,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_null, &(*p)->mustBeSupplied, ODR_CONTEXT, 2, 1) &&
+	odr_choice(o, arm, &(*p)->attributeValues, &(*p)->which, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeValue(ODR o, Z_AttributeValue **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, z_StringOrNumeric, &(*p)->value, ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->subAttributes,
+			 &(*p)->num_subAttributes, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_StringOrNumeric, &(*p)->superAttributes,
+			 &(*p)->num_superAttributes, 0) || odr_ok(o)) &&
+        odr_implicit(o, odr_null, &(*p)->partialSupport, ODR_CONTEXT, 4, 1) &&
+	odr_sequence_end(o);
+}
+
+
+
+int z_TargetInfo(ODR o, Z_TargetInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo,
+		     ODR_CONTEXT, 0, 1) &&
+	odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->recentNews,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_IconObject, &(*p)->icon,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->namedResultSets,
+		     ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->multipleDBsearch,
+		     ODR_CONTEXT, 5, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->maxResultSets,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->maxResultSize,
+		     ODR_CONTEXT, 7, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->maxTerms,
+		     ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, z_IntUnit, &(*p)->timeoutInterval,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->welcomeMessage,
+		     ODR_CONTEXT, 10, 1) &&
+        odr_implicit(o, z_ContactInfo, &(*p)->contactInfo,
+		     ODR_CONTEXT, 11, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 12, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 13) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
+			 &(*p)->num_nicknames, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_HumanString, &(*p)->usageRest,
+		     ODR_CONTEXT, 14, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->paymentAddr,
+		     ODR_CONTEXT, 15, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 16, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 17) &&
+	(odr_sequence_of(o, (Odr_fun)z_DatabaseList, &(*p)->dbCombinations,
+			 &(*p)->num_dbCombinations, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 18) &&
+	(odr_sequence_of(o, (Odr_fun)z_NetworkAddress, &(*p)->addresses,
+			 &(*p)->num_addresses, 0) || odr_ok(o)) &&
+        odr_implicit_settag (o, ODR_CONTEXT, 101) &&
+        (odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->languages,
+			 &(*p)->num_languages, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_AccessInfo, &(*p)->commonAccessInfo,
+		     ODR_CONTEXT, 19, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_DatabaseInfo_actualNumber,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DatabaseInfo_approxNumber,
+	 (Odr_fun)odr_integer, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->name, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_null, &(*p)->explainDatabase, ODR_CONTEXT, 2, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, z_DatabaseName, &(*p)->nicknames,
+	    &(*p)->num_nicknames, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_IconObject, &(*p)->icon, ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->userFee, ODR_CONTEXT, 5, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 6, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->titleString,
+		     ODR_CONTEXT, 7, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 8) &&
+	(odr_sequence_of(o, (Odr_fun)z_HumanString, &(*p)->keywords,
+			 &(*p)->num_keywords, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_DatabaseList, &(*p)->associatedDbs,
+		     ODR_CONTEXT, 10, 1) &&
+        odr_implicit(o, z_DatabaseList, &(*p)->subDbs, ODR_CONTEXT, 11, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->disclaimers,
+		     ODR_CONTEXT, 12, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->news, ODR_CONTEXT, 13, 1) &&
+	((odr_constructed_begin(o, &(*p)->u.actualNumber,
+				ODR_CONTEXT, 14, 0) &&
+	  odr_choice(o, arm, &(*p)->u.actualNumber, &(*p)->which, 0) &&
+	  odr_constructed_end(o)) || odr_ok(o)) &&
+        odr_implicit(o, z_HumanString, &(*p)->defaultOrder,
+		     ODR_CONTEXT, 15, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->avRecordSize,
+		     ODR_CONTEXT, 16, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->maxRecordSize,
+		     ODR_CONTEXT, 17, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->hours, ODR_CONTEXT, 18, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->bestTime, ODR_CONTEXT, 19, 1) &&
+        odr_implicit(o, odr_generalizedtime, &(*p)->lastUpdate,
+		     ODR_CONTEXT, 20, 1) &&
+        odr_implicit(o, z_IntUnit, &(*p)->updateInterval,
+		     ODR_CONTEXT, 21, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->coverage, ODR_CONTEXT, 22, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->proprietary, ODR_CONTEXT, 23, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->copyrightText,
+		     ODR_CONTEXT, 24, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->copyrightNotice,
+		     ODR_CONTEXT, 25, 1) &&
+        odr_implicit(o, z_ContactInfo, &(*p)->producerContactInfo,
+		     ODR_CONTEXT, 26, 1) &&
+        odr_implicit(o, z_ContactInfo, &(*p)->supplierContactInfo,
+		     ODR_CONTEXT, 27, 1) &&
+        odr_implicit(o, z_ContactInfo, &(*p)->submissionContactInfo,
+		     ODR_CONTEXT, 28, 1) &&
+        odr_implicit(o, z_AccessInfo, &(*p)->accessInfo, ODR_CONTEXT, 29, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_TagTypeMapping(ODR o, Z_TagTypeMapping **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+    	odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 0, 0) &&
+	odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 1) &&
+	odr_implicit(o, odr_null, &(*p)->defaultTagType, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_SchemaInfo(ODR o, Z_SchemaInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name, ODR_CONTEXT,
+	    2, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 4) &&
+	(odr_sequence_of(o, (Odr_fun)z_TagTypeMapping, &(*p)->tagTypeMapping,
+			 &(*p)->num_tagTypeMapping, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)z_ElementInfo, &(*p)->recordStructure,
+			 &(*p)->num_recordStructure, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_ElementInfo(ODR o, Z_ElementInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->elementName,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_Path, &(*p)->elementTagPath, ODR_CONTEXT, 2, 0) &&
+        odr_explicit(o, z_ElementDataType, &(*p)->dataType,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 5, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_PathUnit(ODR o, Z_PathUnit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+    	odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 0) &&
+	odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_Path(ODR o, Z_Path **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    odr_implicit_settag(o, ODR_CONTEXT, 201);
+    if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
+			&(*p)->num, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ElementInfoList(ODR o, Z_Path **p, int opt, const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    odr_implicit_settag(o, ODR_CONTEXT, 201);
+    if (odr_sequence_of(o, (Odr_fun)z_OtherInformationUnit, &(*p)->list,
+			&(*p)->num, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementDataType_primitive,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementDataType_structured,
+	 (Odr_fun)z_ElementInfoList, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_TagSetInfoElements(ODR o, Z_TagSetInfoElements **p, int opt,
+			 const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt;
+    return
+    	odr_implicit(o, z_InternationalString, &(*p)->elementname,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->nicknames,
+			 &(*p)->num_nicknames, 0) || odr_ok(o)) &&
+	odr_explicit(o, z_StringOrNumeric, &(*p)->elementTag,
+		     ODR_CONTEXT, 3, 0) &&
+	odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 5, 1) &&
+	z_OtherInformation(o, &(*p)->otherTagInfo, 1, 0) &&
+   	odr_sequence_end(o);
+}
+
+int z_TagSetInfo(ODR o, Z_TagSetInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->tagSet, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 4) &&
+	(odr_sequence_of(o, (Odr_fun)z_TagSetInfoElements, &(*p)->elements,
+			 &(*p)->num_elements, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_RecordSyntaxInfo(ODR o, Z_RecordSyntaxInfo **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)odr_oid, &(*p)->transferSyntaxes,
+			 &(*p)->num_transferSyntaxes, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->asn1Module,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, (Odr_fun)z_ElementInfo, &(*p)->abstractStructure,
+	    &(*p)->num_abstractStructure, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeSetInfo(ODR o, Z_AttributeSetInfo **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->attributeSet, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_AttributeType, &(*p)->attributes,
+			 &(*p)->num_attributes, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 4, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeType(ODR o, Z_AttributeType **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->attributeType,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	odr_sequence_of(o, (Odr_fun)z_AttributeDescription,
+			&(*p)->attributeValues,
+			&(*p)->num_attributeValues, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeDescription(ODR o, Z_AttributeDescription **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->attributeValue,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_StringOrNumeric,
+			 &(*p)->equivalentAttributes,
+			 &(*p)->num_equivalentAttributes, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_TermListElement(ODR o, Z_TermListElement **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->title, ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->searchCost, ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->scanable, ODR_CONTEXT, 4, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->broader,
+			 &(*p)->num_broader, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->narrower,
+			 &(*p)->num_narrower, 0) || odr_ok(o)) &&
+	odr_sequence_end(o);
+}
+
+int z_TermListInfo(ODR o, Z_TermListInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+ 	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_TermListElement, &(*p)->termLists,
+			 &(*p)->num_termLists, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_ExtendedServicesInfo(ODR o, Z_ExtendedServicesInfo **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->type, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->privateType, ODR_CONTEXT, 3, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->restrictionsApply,
+		     ODR_CONTEXT, 5, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->feeApply, ODR_CONTEXT, 6, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->available, ODR_CONTEXT, 7, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->retentionSupported,
+		     ODR_CONTEXT, 8, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->waitAction, ODR_CONTEXT, 9, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 10, 1) &&
+        odr_implicit(o, z_External, &(*p)->specificExplain,
+		     ODR_CONTEXT, 11, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->esASN,
+		     ODR_CONTEXT, 12, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeDetails(ODR o, Z_AttributeDetails **p, int opt,
+		       const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_AttributeSetDetails,
+			 &(*p)->attributesBySet,
+			 &(*p)->num_attributesBySet, 0) && odr_ok(o)) &&
+        odr_implicit(o, z_AttributeCombinations, &(*p)->attributeCombinations,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeSetDetails(ODR o, Z_AttributeSetDetails **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->attributeSet,
+		     ODR_CONTEXT, 0, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	odr_sequence_of(o, (Odr_fun)z_AttributeTypeDetails,
+			&(*p)->attributesByType,
+			&(*p)->num_attributesByType, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_AttributeTypeDetails(ODR o, Z_AttributeTypeDetails **p, int opt,
+			   const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->attributeType,
+		     ODR_CONTEXT, 0, 0) &&
+        odr_implicit(o, z_OmittedAttributeInterpretation,
+		     &(*p)->defaultIfOmitted,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_AttributeValue, &(*p)->attributeValues,
+			 &(*p)->num_attributeValues, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_OmittedAttributeInterpretation(ODR o,
+				     Z_OmittedAttributeInterpretation **p,
+				     int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, z_StringOrNumeric, &(*p)->defaultValue,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->defaultDescription,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_EScanInfo(ODR o, Z_EScanInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->maxStepSize, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->collatingSequence,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->increasing, ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_TermListDetails(ODR o, Z_TermListDetails **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->termListName,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_AttributeCombinations, &(*p)->attributes,
+		     ODR_CONTEXT, 3, 1) &&
+	odr_implicit(o, z_EScanInfo, &(*p)->scanInfo, ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->estNumberTerms,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, (Odr_fun)z_Term, &(*p)->sampleTerms,
+	    &(*p)->num_sampleTerms, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_ElementSetDetails(ODR o, Z_ElementSetDetails **p, int opt,
+			const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_ElementSetName, &(*p)->elementSetName,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 5, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 6) &&
+	(odr_sequence_of(o, (Odr_fun)z_PerElementDetails,
+			 &(*p)->detailsPerElement,
+			 &(*p)->num_detailsPerElement, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_RetrievalRecordDetails(ODR o, Z_RetrievalRecordDetails **p, int opt,
+			     const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->schema, ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->recordSyntax, ODR_CONTEXT, 3, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)z_PerElementDetails,
+			 &(*p)->detailsPerElement,
+			 &(*p)->num_detailsPerElement, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_PerElementDetails(ODR o, Z_PerElementDetails **p, int opt,
+			const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_RecordTag, &(*p)->recordTag, ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_Path, &(*p)->schemaTags,
+			 &(*p)->num_schemaTags, 0) ||
+	 odr_ok(o)) &&
+        odr_implicit(o, odr_integer, &(*p)->maxSize, ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->minSize, ODR_CONTEXT, 4, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->avgSize, ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->fixedSize, ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, odr_bool, &(*p)->repeatable, ODR_CONTEXT, 8, 0) &&
+        odr_implicit(o, odr_bool, &(*p)->required, ODR_CONTEXT, 9, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 12, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->contents, ODR_CONTEXT, 13, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->billingInfo,
+		     ODR_CONTEXT, 14, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->restrictions,
+		     ODR_CONTEXT, 15, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 16) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->alternateNames,
+			 &(*p)->num_alternateNames, 0) || odr_ok(o)) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 17) &&
+	(odr_sequence_of(o, z_InternationalString, &(*p)->genericNames,
+			 &(*p)->num_genericNames, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_AttributeCombinations, &(*p)->searchAccess,
+		     ODR_CONTEXT, 18, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_RecordTag(ODR o, Z_RecordTag **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, z_StringOrNumeric, &(*p)->qualifier,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_SortDetails(ODR o, Z_SortDetails **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	(odr_sequence_of(o, (Odr_fun)z_SortKeyDetails, &(*p)->sortKeys,
+			 &(*p)->num_sortKeys, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_SortKeyDetails (ODR o, Z_SortKeyDetails **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetails_character,
+	 (Odr_fun) odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKeyDetails_numeric,
+	 (Odr_fun) odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKeyDetails_structured,
+	 (Odr_fun) z_HumanString, 0},
+	{-1, -1, -1, -1, (Odr_fun) 0, 0}
+    };
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+	return opt && odr_ok (o);
+    return
+	odr_implicit (o, z_HumanString,
+		      &(*p)->description, ODR_CONTEXT, 0, 1) &&
+	odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun) z_Specification,
+			 &(*p)->elementSpecifications,
+			 &(*p)->num_elementSpecifications, 0) || odr_ok(o)) &&
+	odr_implicit (o, z_AttributeCombinations,
+		      &(*p)->attributeSpecifications, ODR_CONTEXT, 2, 1) &&
+	((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 3, 0) &&
+	  odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+	  odr_constructed_end (o)) || odr_ok(o)) &&
+	odr_implicit (o, odr_integer,
+		      &(*p)->caseSensitivity, ODR_CONTEXT, 4, 1) &&
+	odr_sequence_end (o);
+}
+
+int z_ProcessingInformation(ODR o, Z_ProcessingInformation **p, int opt,
+			    const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_DatabaseName, &(*p)->databaseName,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->processingContext,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 3, 0) &&
+        odr_implicit(o, odr_oid, &(*p)->oid, ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, z_External, &(*p)->instructions, ODR_CONTEXT, 6, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_VariantSetInfo(ODR o, Z_VariantSetInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, odr_oid, &(*p)->variantSet, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_VariantClass, &(*p)->variants,
+			 &(*p)->num_variants, 0) || odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_VariantClass(ODR o, Z_VariantClass **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->variantClass, ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	odr_sequence_of(o, (Odr_fun)z_VariantType, &(*p)->variantTypes,
+			&(*p)->num_variantTypes, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_VariantType(ODR o, Z_VariantType **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->variantType,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, z_VariantValue, &(*p)->variantValue,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_VariantValue(ODR o, Z_VariantValue **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, odr_integer, &(*p)->dataType, ODR_CONTEXT, 0, 0) &&
+        odr_explicit(o, z_ValueSet, &(*p)->values, ODR_CONTEXT, 1, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt,
+			 const char *name)
+{
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_sequence_of(o, (Odr_fun)z_ValueDescription, &(*p)->elements,
+			&(*p)->num, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+    
+int z_ValueSet(ODR o, Z_ValueSet **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ValueSet_range,
+	 (Odr_fun)z_ValueRange, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueSet_enumerated,
+	 (Odr_fun)z_ValueSetEnumerated, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ValueRange(ODR o, Z_ValueRange **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_explicit(o, z_ValueDescription, &(*p)->lower, ODR_CONTEXT, 0, 1) &&
+        odr_explicit(o, z_ValueDescription, &(*p)->upper, ODR_CONTEXT, 1, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt,
+		       const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_NONE, -1, -1, Z_ValueDescription_integer,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_NONE, -1, -1, Z_ValueDescription_string,
+	 (Odr_fun)z_InternationalString, 0},
+	{ODR_NONE, -1, -1, Z_ValueDescription_octets,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_NONE, -1, -1, Z_ValueDescription_oid,
+	 (Odr_fun)odr_oid, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueDescription_unit,
+	 (Odr_fun)z_Unit, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ValueDescription_valueAndUnit,
+	 (Odr_fun)z_IntUnit, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_UnitInfo(ODR o, Z_UnitInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->unitSystem,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o,  (Odr_fun)z_UnitType, &(*p)->units, 
+			 &(*p)->num_units, 0) ||
+	 odr_ok(o)) &&
+        odr_sequence_end(o);
+}
+
+int z_UnitType(ODR o, Z_UnitType **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->unitType,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	odr_sequence_of(o, (Odr_fun)z_Units, &(*p)->units,
+			&(*p)->num_units, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_Units(ODR o, Z_Units **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->name,
+		     ODR_CONTEXT, 0, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->unit,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_CategoryList(ODR o, Z_CategoryList **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_CommonInfo, &(*p)->commonInfo, ODR_CONTEXT, 0, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	odr_sequence_of(o, (Odr_fun)z_CategoryInfo, &(*p)->categories,
+			&(*p)->num_categories, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_CategoryInfo(ODR o, Z_CategoryInfo **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_InternationalString, &(*p)->category,
+		     ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->originalCategory,
+		     ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, z_HumanString, &(*p)->description,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, z_InternationalString, &(*p)->asn1Module,
+		     ODR_CONTEXT, 4, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+    	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Explain_targetInfo,
+	 (Odr_fun)z_TargetInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Explain_databaseInfo,
+	 (Odr_fun)z_DatabaseInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Explain_schemaInfo,
+	 (Odr_fun)z_SchemaInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Explain_tagSetInfo,
+	 (Odr_fun)z_TagSetInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Explain_recordSyntaxInfo,
+	 (Odr_fun)z_RecordSyntaxInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Explain_attributeSetInfo,
+	 (Odr_fun)z_AttributeSetInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_Explain_termListInfo,
+	 (Odr_fun)z_TermListInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Explain_extendedServicesInfo,
+	 (Odr_fun)z_ExtendedServicesInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Explain_attributeDetails,
+	 (Odr_fun)z_AttributeDetails, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 9, Z_Explain_termListDetails,
+	 (Odr_fun)z_TermListDetails, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 10, Z_Explain_elementSetDetails,
+	 (Odr_fun)z_ElementSetDetails, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 11, Z_Explain_retrievalRecordDetails,
+	 (Odr_fun)z_RetrievalRecordDetails, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 12, Z_Explain_sortDetails,
+	 (Odr_fun)z_SortDetails, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 13, Z_Explain_processing,
+	 (Odr_fun)z_ProcessingInformation, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 14, Z_Explain_variants,
+	 (Odr_fun)z_VariantSetInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 15, Z_Explain_units,
+	 (Odr_fun)z_UnitInfo, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 100, Z_Explain_categoryList,
+	 (Odr_fun)z_CategoryList, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_initmember(o, p, sizeof(**p)))
+	return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+    	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-grs.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-grs.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-grs.c	(revision 21083)
@@ -0,0 +1,270 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:52  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.9  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.7  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.6  1997/05/14 06:53:23  adam
+ * C++ support.
+ *
+ * Revision 1.5  1995/10/18 16:12:20  quinn
+ * Added a couple of special cases to handle the WAIS server.
+ *
+ * Revision 1.4  1995/09/29  17:11:55  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:43  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/08/28  10:58:58  quinn
+ * Added extra choice-entry to data to catch visiblestring.
+ *
+ * Revision 1.1  1995/08/17  12:47:09  quinn
+ * Added GRS-1.
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt, const char *name);
+int z_ElementData(ODR o, Z_ElementData **p, int opt, const char *name);
+int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt, const char *name);
+int z_TagUnit(ODR o, Z_TagUnit **p, int opt, const char *name);
+int z_TagPath(ODR o, Z_TagPath **p, int opt, const char *name);
+int z_Order(ODR o, Z_Order **p, int opt, const char *name);
+int z_Usage(ODR o, Z_Usage **p, int opt, const char *name);
+int z_HitVector(ODR o, Z_HitVector **p, int opt, const char *name);
+int z_Triple(ODR o, Z_Triple **p, int opt, const char *name);
+int z_Variant(ODR o, Z_Variant **p, int opt, const char *name);
+
+int z_GenericRecord(ODR o, Z_GenericRecord **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_GenericRecord *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_TaggedElement, &(*p)->elements,
+			&(*p)->num_elements, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_TaggedElement(ODR o, Z_TaggedElement **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->tagType,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->tagOccurrence,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_explicit(o, z_ElementData, &(*p)->content,
+		     ODR_CONTEXT, 4, 0) &&
+        odr_implicit(o, z_ElementMetaData, &(*p)->metaData,
+		     ODR_CONTEXT, 5, 1) &&
+        odr_implicit(o, z_Variant, &(*p)->appliedVariant, ODR_CONTEXT, 6, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ElementData(ODR o, Z_ElementData **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_NONE, -1, -1, Z_ElementData_octets,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_numeric,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_date,
+	 (Odr_fun)odr_generalizedtime, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_ext,
+	 (Odr_fun)z_External, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_string,
+	 (Odr_fun)z_InternationalString, 0},
+	/* The entry below provides some backwards compatibility */
+	{ODR_NONE, -1, -1, Z_ElementData_string,
+	 (Odr_fun)odr_visiblestring, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_trueOrFalse,
+	 (Odr_fun)odr_bool, 0},
+	{ODR_NONE, -1, -1, Z_ElementData_oid,
+	 (Odr_fun)odr_oid, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementData_intUnit,
+	 (Odr_fun)z_IntUnit, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementData_elementNotThere,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ElementData_elementEmpty,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ElementData_noDataRequested,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ElementData_diagnostic,
+	 (Odr_fun)z_External, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_ElementData_subtree,
+	 (Odr_fun)z_GenericRecord, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (o->direction == ODR_DECODE)
+	*p = (Z_ElementData *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_ElementMetaData(ODR o, Z_ElementMetaData **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, z_Order, &(*p)->seriesOrder, ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_Usage, &(*p)->usageRight, ODR_CONTEXT, 2, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 3) &&
+	(odr_sequence_of(o, (Odr_fun)z_HitVector, &(*p)->hits,
+			 &(*p)->num_hits, 0) ||
+	 odr_ok(o)) &&
+        odr_implicit(o, z_InternationalString, &(*p)->displayName,
+		     ODR_CONTEXT, 4, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 5) &&
+	(odr_sequence_of(o, (Odr_fun)z_Variant, &(*p)->supportedVariants,
+			 &(*p)->num_supportedVariants, 0) || odr_ok(o)) &&
+        odr_implicit(o, z_InternationalString, &(*p)->message,
+		     ODR_CONTEXT, 6, 1) &&
+        odr_implicit(o, odr_octetstring, &(*p)->elementDescriptor,
+		     ODR_CONTEXT, 7, 1) &&
+        odr_implicit(o, z_TagPath, &(*p)->surrogateFor, ODR_CONTEXT, 8, 1) &&
+        odr_implicit(o, z_TagPath, &(*p)->surrogateElement,
+		     ODR_CONTEXT, 9, 1) &&
+        odr_implicit(o, z_External, &(*p)->other, ODR_CONTEXT, 99, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_TagUnit(ODR o, Z_TagUnit **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->tagType, ODR_CONTEXT, 1, 1) &&
+        odr_explicit(o, z_StringOrNumeric, &(*p)->tagValue,
+		     ODR_CONTEXT, 2, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->tagOccurrence,
+		     ODR_CONTEXT, 3, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_TagPath(ODR o, Z_TagPath **p, int opt, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+	*p = (Z_TagPath *)odr_malloc(o, sizeof(**p));
+    else if (!*p)
+	return opt;
+    if (odr_sequence_of(o, (Odr_fun)z_TagUnit, &(*p)->tags,
+			&(*p)->num_tags, 0))
+	return 1;
+    *p = 0;
+    return opt && odr_ok(o);
+}
+
+int z_Order(ODR o, Z_Order **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_bool, &(*p)->ascending, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, odr_integer, &(*p)->order, ODR_CONTEXT, 2, 0) &&
+        odr_sequence_end(o);
+}
+
+int z_Usage(ODR o, Z_Usage **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
+        odr_implicit(o, z_InternationalString, &(*p)->restriction, ODR_CONTEXT,
+		     2, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_HitVector(ODR o, Z_HitVector **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        z_Term(o, &(*p)->satisfier, 1, 0) &&
+        odr_implicit(o, z_IntUnit, &(*p)->offsetIntoElement,
+		     ODR_CONTEXT, 1, 1) &&
+        odr_implicit(o, z_IntUnit, &(*p)->length, ODR_CONTEXT, 2, 1) &&
+        odr_implicit(o, odr_integer, &(*p)->hitRank, ODR_CONTEXT, 3, 1) &&
+        odr_implicit(o, odr_octetstring, &(*p)->targetToken, ODR_CONTEXT,
+		     4, 1) &&
+        odr_sequence_end(o);
+}
+
+int z_Triple(ODR o, Z_Triple **p, int opt, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+	{ODR_NONE, -1, -1, Z_Triple_integer,
+	 (Odr_fun)odr_integer, 0},
+	{ODR_NONE, -1, -1, Z_Triple_internationalString,
+	 (Odr_fun)z_InternationalString, 0},
+	/* The entry below provides some backwards compatibility */
+	{ODR_NONE, -1, -1, Z_Triple_internationalString,
+	 (Odr_fun)odr_visiblestring, 0},
+	{ODR_NONE, -1, -1, Z_Triple_octetString,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_NONE, -1, -1, Z_Triple_oid,
+	 (Odr_fun)odr_oid, 0},
+	{ODR_NONE, -1, -1, Z_Triple_boolean,
+	 (Odr_fun)odr_bool, 0},
+	{ODR_NONE, -1, -1, Z_Triple_null,
+	 (Odr_fun)odr_null, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Triple_unit,
+	 (Odr_fun)z_Unit, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Triple_valueAndUnit,
+	 (Odr_fun)z_IntUnit, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_oid, &(*p)->variantSetId, ODR_CONTEXT, 0, 1) &&
+	odr_implicit(o, odr_integer, &(*p)->zclass, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 2, 0) &&
+	odr_constructed_begin(o, &(*p)->value, ODR_CONTEXT, 3, 0) &&
+	odr_choice(o, arm, &(*p)->value, &(*p)->which, 0) &&
+	odr_constructed_end(o) &&
+	odr_sequence_end(o);
+}
+
+int z_Variant(ODR o, Z_Variant **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+        return opt && odr_ok(o);
+    return
+        odr_implicit(o, odr_oid, &(*p)->globalVariantSetId,
+		     ODR_CONTEXT, 1, 1) &&
+	odr_implicit_settag(o, ODR_CONTEXT, 2) &&
+	odr_sequence_of(o, (Odr_fun)z_Triple, &(*p)->triples,
+			&(*p)->num_triples, 0) &&
+	odr_sequence_end(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-rsc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-rsc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-rsc.c	(revision 21083)
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:52  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.8  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.6  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.5  1995/09/29 17:11:55  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:43  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/06/02  09:49:15  quinn
+ * Adding access control
+ *
+ * Revision 1.2  1995/06/01  14:34:53  quinn
+ * Work
+ *
+ * Revision 1.1  1995/06/01  11:22:17  quinn
+ * Resource control
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+/* -------------------- Resource 1 ------------------------- */
+
+int z_Estimate1(ODR o, Z_Estimate1 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit(o, odr_integer, &(*p)->type, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->value, ODR_CONTEXT, 2, 0) &&
+	odr_implicit(o, odr_integer, &(*p)->currencyCode, ODR_CONTEXT, 3, 1) &&
+	odr_sequence_end(o);
+}
+
+int z_ResourceReport1(ODR o, Z_ResourceReport1 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	odr_sequence_of(o, (Odr_fun)z_Estimate1, &(*p)->estimates,
+			&(*p)->num_estimates, 0) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->message,
+		     ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+/* -------------------- Resource 2 ------------------------- */
+
+/* int z_StringOrNumeric(ODR, Z_StringOrNumeric **, int); */
+/* int z_IntUnit(ODR, Z_IntUnit **, int); */
+
+int z_Estimate2(ODR o, Z_Estimate2 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+    	return opt && odr_ok(o);
+    return
+    	odr_explicit(o, z_StringOrNumeric, &(*p)->type, ODR_CONTEXT, 1, 0) &&
+	odr_implicit(o, z_IntUnit, &(*p)->value, ODR_CONTEXT, 2, 0) &&
+	odr_sequence_end(o);
+}
+
+int z_ResourceReport2(ODR o, Z_ResourceReport2 **p, int opt, const char *name)
+{
+    if (!odr_sequence_begin(o, p, sizeof(**p), 0))
+	return opt && odr_ok(o);
+    return
+	odr_implicit_settag(o, ODR_CONTEXT, 1) &&
+	(odr_sequence_of(o, (Odr_fun)z_Estimate2, &(*p)->estimates,
+			 &(*p)->num_estimates, 0) || odr_ok(o)) &&
+	odr_implicit(o, odr_visiblestring, &(*p)->message,
+		     ODR_CONTEXT, 2, 1) &&
+	odr_sequence_end(o);
+}
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/asn/prt-univ.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/asn/prt-univ.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/asn/prt-univ.c	(revision 21083)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1998-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:53  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.3  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.1  1998/03/20 14:46:06  adam
+ * Added UNIverse Resource Reports.
+ *
+ */
+
+#include <yaz/proto.h>
+
+int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt,
+			  const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+	return opt && odr_ok (o);
+    return
+	z_StringOrNumeric(o, &(*p)->database, 0, 0) &&
+	z_StringOrNumeric(o, &(*p)->hits, 0, 0) &&
+	odr_sequence_end (o);
+}
+
+int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt,
+			       const char *name)
+{
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+	return opt && odr_ok (o);
+    return
+	z_StringOrNumeric(o, &(*p)->hitno, 0, 0) &&
+	odr_sequence_end (o);
+}
+
+int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt, const char *name)
+{
+    static Odr_arm arm[] = {
+	{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_UniverseReport_databaseHits,
+	 (Odr_fun) z_UniverseReportHits, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_UniverseReport_duplicate,
+	 (Odr_fun) z_UniverseReportDuplicate, 0},
+	{-1, -1, -1, -1, (Odr_fun) 0, 0}
+    };
+    if (!odr_sequence_begin (o, p, sizeof(**p), 0))
+	return opt && odr_ok (o);
+    return
+	odr_integer(o, &(*p)->totalHits, 0, 0) &&
+	odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+	odr_sequence_end (o);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.am	(revision 21083)
@@ -0,0 +1,12 @@
+## $Id$
+
+noinst_LIBRARIES = libccl.a
+
+noinst_PROGRAMS = cclsh
+
+INCLUDES=-I../include
+
+libccl_a_SOURCES = cclfind.c ccltoken.c cclerrms.c cclqual.c cclptree.c \
+  cclqfile.c cclstr.c
+cclsh_SOURCES=cclsh.c
+cclsh_LDADD = libccl.a
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/Makefile.in	(revision 21083)
@@ -0,0 +1,294 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libccl.a
+
+noinst_PROGRAMS = cclsh
+
+INCLUDES = -I../include
+
+libccl_a_SOURCES = cclfind.c ccltoken.c cclerrms.c cclqual.c cclptree.c   cclqfile.c cclstr.c
+
+cclsh_SOURCES = cclsh.c
+cclsh_LDADD = libccl.a
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libccl_a_LIBADD = 
+libccl_a_OBJECTS =  cclfind.o ccltoken.o cclerrms.o cclqual.o cclptree.o \
+cclqfile.o cclstr.o
+AR = ar
+PROGRAMS =  $(noinst_PROGRAMS)
+
+cclsh_OBJECTS =  cclsh.o
+cclsh_DEPENDENCIES =  libccl.a
+cclsh_LDFLAGS = 
+CFLAGS = @CFLAGS@
+COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@
+DIST_COMMON =  README Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libccl_a_SOURCES) $(cclsh_SOURCES)
+OBJECTS = $(libccl_a_OBJECTS) $(cclsh_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps ccl/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libccl.a: $(libccl_a_OBJECTS) $(libccl_a_DEPENDENCIES)
+	-rm -f libccl.a
+	$(AR) cru libccl.a $(libccl_a_OBJECTS) $(libccl_a_LIBADD)
+	$(RANLIB) libccl.a
+
+mostlyclean-noinstPROGRAMS:
+
+clean-noinstPROGRAMS:
+	-test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS)
+
+distclean-noinstPROGRAMS:
+
+maintainer-clean-noinstPROGRAMS:
+
+cclsh: $(cclsh_OBJECTS) $(cclsh_DEPENDENCIES)
+	@rm -f cclsh
+	$(LINK) $(cclsh_LDFLAGS) $(cclsh_OBJECTS) $(cclsh_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 = ccl
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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) $(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-noinstLIBRARIES mostlyclean-compile \
+		mostlyclean-noinstPROGRAMS mostlyclean-tags \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-noinstLIBRARIES clean-compile clean-noinstPROGRAMS \
+		clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-noinstLIBRARIES distclean-compile \
+		distclean-noinstPROGRAMS distclean-tags \
+		distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-noinstLIBRARIES \
+		maintainer-clean-compile \
+		maintainer-clean-noinstPROGRAMS 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-noinstPROGRAMS \
+distclean-noinstPROGRAMS clean-noinstPROGRAMS \
+maintainer-clean-noinstPROGRAMS 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:
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/README
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/README	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/README	(revision 21083)
@@ -0,0 +1,15 @@
+CCL test module
+
+This module is required to parse the queries given to the 'cli'
+test program. It is *not* a part of the YAZ module, and it is
+distributed under a different license.
+
+Eventually, the products of the EUROPAGATE will be made available to
+the general public, free of charge (the exact nature of the license is
+unknown at this point). Until then, you should *NOT* distribute copies
+of this software to organisations that are not partners in EUROPAGATE.
+
+If you need to distribute copies of YAZ to organisations which are not
+partners in EUROPAGATE, you should remove this module, and, if
+necessary, modify yazlib/tst.c to work wihout it. The test program is
+not essential to the general working of YAZ.
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclerrms.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclerrms.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclerrms.c	(revision 21083)
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/*
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:55  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.8  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.6  1997/09/29 08:56:37  adam
+ * Changed CCL parser to be thread safe. New type, CCL_parser, declared
+ * and a create/destructers ccl_parser_create/ccl_parser/destory has
+ * been added.
+ *
+ * Revision 1.5  1997/04/30 08:52:06  quinn
+ * Null
+ *
+ * Revision 1.4  1996/10/11  15:00:24  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.8  1995/05/16  09:39:25  adam
+ * LICENSE.
+ *
+ * Revision 1.7  1995/04/17  09:31:40  adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.6  1995/02/23  08:31:59  adam
+ * Changed header.
+ *
+ * Revision 1.4  1995/02/14  16:20:54  adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.3  1995/02/14  10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:06  adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1  1995/02/13  12:35:20  adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+/* Chas: Required for the correct definition of ccl_err_msg */
+#include <yaz/yaz-ccl.h>
+
+static char *err_msg_array[] = {
+    "Ok",
+    "Search word expected",
+    "')' expected",
+    "Set name expected",
+    "Operator expected",
+    "Unbalanced ')'",
+    "Unknown qualifier",
+    "Qualifiers applied twice",
+    "'=' expected",
+    "Bad relation",
+    "Left truncation not supported",
+    "Both left - and right truncation not supported",
+    "Right truncation not supported"
+};
+
+/*
+ * ccl_err_msg: return name of CCL error
+ * ccl_errno:   Error no.
+ * return:      Name of error.
+ */
+const char *ccl_err_msg (int ccl_errno)
+{
+    return err_msg_array[ccl_errno];
+}
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclfind.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclfind.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclfind.c	(revision 21083)
@@ -0,0 +1,907 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL find (to rpn conversion)
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:56  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.15  2000/02/24 23:49:13  adam
+ * Fixed memory allocation problem.
+ *
+ * Revision 1.14  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.13  1999/12/22 13:13:32  adam
+ * Search terms may include "operators" without causing error.
+ *
+ * Revision 1.12  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.11  1999/03/31 11:15:37  adam
+ * Fixed memory leaks in ccl_find_str and ccl_qual_rm.
+ *
+ * Revision 1.10  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.9  1997/09/29 08:56:37  adam
+ * Changed CCL parser to be thread safe. New type, CCL_parser, declared
+ * and a create/destructers ccl_parser_create/ccl_parser/destory has
+ * been added.
+ *
+ * Revision 1.8  1997/09/01 08:48:11  adam
+ * New windows NT/95 port using MSV5.0. Only a few changes made
+ * to avoid warnings.
+ *
+ * Revision 1.7  1997/05/14 06:53:26  adam
+ * C++ support.
+ *
+ * Revision 1.6  1997/04/30 08:52:06  quinn
+ * Null
+ *
+ * Revision 1.5  1996/10/11  15:00:24  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.16  1996/01/08  08:41:13  adam
+ * Removed unused function.
+ *
+ * Revision 1.15  1995/07/20  08:14:34  adam
+ * Qualifiers were observed too often. Instead tokens are treated as
+ * qualifiers only when separated by comma.
+ *
+ * Revision 1.14  1995/05/16  09:39:26  adam
+ * LICENSE.
+ *
+ * Revision 1.13  1995/04/17  09:31:42  adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.12  1995/03/20  15:27:43  adam
+ * Minor changes.
+ *
+ * Revision 1.11  1995/02/23  08:31:59  adam
+ * Changed header.
+ *
+ * Revision 1.9  1995/02/16  13:20:06  adam
+ * Spell fix.
+ *
+ * Revision 1.8  1995/02/14  19:59:42  adam
+ * Removed a syntax error.
+ *
+ * Revision 1.7  1995/02/14  19:55:10  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.6  1995/02/14  16:20:55  adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.5  1995/02/14  14:12:41  adam
+ * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
+ *
+ * Revision 1.4  1995/02/14  13:16:29  adam
+ * Left and/or right truncation implemented.
+ *
+ * Revision 1.3  1995/02/14  10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:07  adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1  1995/02/13  12:35:20  adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+/* returns type of current lookahead */
+#define KIND (cclp->look_token->kind)
+
+/* move one token forward */
+#define ADVANCE cclp->look_token = cclp->look_token->next
+
+/* 
+ * qual_val_type: test for existance of attribute type/value pair.
+ * qa:     Attribute array
+ * type:   Type of attribute to search for
+ * value:  Value of attribute to seach for
+ * return: 1 if found; 0 otherwise.
+ */
+static int qual_val_type (struct ccl_rpn_attr **qa, int type, int value)
+{
+    int i;
+    struct ccl_rpn_attr *q;
+
+    if (!qa)
+        return 0;
+    for (i = 0;  (q=qa[i]); i++)
+        while (q)
+	{
+            if (q->type == type && q->value == value)
+	        return 1;
+	    q = q->next;
+	}
+    return 0;
+}
+
+/*
+ * strxcat: concatenate strings.
+ * n:      Null-terminated Destination string 
+ * src:    Source string to be appended (not null-terminated)
+ * len:    Length of source string.
+ */
+static void strxcat (char *n, const char *src, int len)
+{
+    while (*n)
+	n++;
+    while (--len >= 0)
+	*n++ = *src++;
+    *n = '\0';
+}
+
+/*
+ * copy_token_name: Return copy of CCL token name
+ * tp:      Pointer to token info.
+ * return:  malloc(3) allocated copy of token name.
+ */
+static char *copy_token_name (struct ccl_token *tp)
+{
+    char *str = (char *)malloc (tp->len + 1);
+    ccl_assert (str);
+    memcpy (str, tp->name, tp->len);
+    str[tp->len] = '\0';
+    return str;
+}
+
+/*
+ * mk_node: Create RPN node.
+ * kind:   Type of node.
+ * return: pointer to allocated node.
+ */
+static struct ccl_rpn_node *mk_node (int kind)
+{
+    struct ccl_rpn_node *p;
+    p = (struct ccl_rpn_node *)malloc (sizeof(*p));
+    ccl_assert (p);
+    p->kind = kind;
+    return p;
+}
+
+/*
+ * ccl_rpn_delete: Delete RPN tree.
+ * rpn:   Pointer to tree.
+ */
+void ccl_rpn_delete (struct ccl_rpn_node *rpn)
+{
+    struct ccl_rpn_attr *attr, *attr1;
+    if (!rpn)
+        return;
+    switch (rpn->kind)
+    {
+    case CCL_RPN_AND:
+    case CCL_RPN_OR:
+    case CCL_RPN_NOT:
+        ccl_rpn_delete (rpn->u.p[0]);
+        ccl_rpn_delete (rpn->u.p[1]);
+        break;
+    case CCL_RPN_TERM:
+        free (rpn->u.t.term);
+        for (attr = rpn->u.t.attr_list; attr; attr = attr1)
+        {
+            attr1 = attr->next;
+            free (attr);
+        }
+        break;
+    case CCL_RPN_SET:
+        free (rpn->u.setname);
+        break;
+    case CCL_RPN_PROX:
+        ccl_rpn_delete (rpn->u.p[0]);
+        ccl_rpn_delete (rpn->u.p[1]);
+        break;
+    }
+    free (rpn);
+}
+
+static struct ccl_rpn_node *find_spec (CCL_parser cclp,
+				       struct ccl_rpn_attr **qa);
+
+static int is_term_ok (int look, int *list)
+{
+    for (;*list >= 0; list++)
+        if (look == *list)
+            return 1;
+    return 0;
+}
+
+static struct ccl_rpn_node *search_terms (CCL_parser cclp,
+					  struct ccl_rpn_attr **qa);
+
+/*
+ * add_attr: Add attribute (type/value) to RPN term node.
+ * p:     RPN node of type term.
+ * type:  Type of attribute
+ * value: Value of attribute
+ */
+static void add_attr (struct ccl_rpn_node *p, int type, int value)
+{
+    struct ccl_rpn_attr *n;
+
+    n = (struct ccl_rpn_attr *)malloc (sizeof(*n));
+    ccl_assert (n);
+    n->type = type;
+    n->value = value;
+    n->next = p->u.t.attr_list;
+    p->u.t.attr_list = n;
+}
+
+/*
+ * search_term: Parse CCL search term. 
+ * cclp:   CCL Parser
+ * qa:     Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_term_x (CCL_parser cclp,
+					   struct ccl_rpn_attr **qa,
+                                           int *term_list)
+{
+    struct ccl_rpn_attr *qa_tmp[2];
+    struct ccl_rpn_node *p;
+    struct ccl_token *lookahead = cclp->look_token;
+    int len = 0;
+    size_t no, i;
+    int left_trunc = 0;
+    int right_trunc = 0;
+    int mid_trunc = 0;
+    int relation_value = -1;
+    int position_value = -1;
+    int structure_value = -1;
+    int truncation_value = -1;
+    int completeness_value = -1;
+
+    if (!is_term_ok(KIND, term_list))
+    {
+        cclp->error_code = CCL_ERR_TERM_EXPECTED;
+        return NULL;
+    }
+    /* create the term node, but wait a moment before adding the term */
+    p = mk_node (CCL_RPN_TERM);
+    p->u.t.attr_list = NULL;
+    p->u.t.term = NULL;
+
+    if (!qa)
+    {
+        /* no qualifier(s) applied. Use 'term' if it is defined */
+
+        qa = qa_tmp;
+	ccl_assert (qa);
+	qa[0] = ccl_qual_search (cclp, "term", 4);
+	qa[1] = NULL;
+    }
+
+    /* go through all attributes and add them to the attribute list */
+    for (i=0; qa && qa[i]; i++)
+    {
+        struct ccl_rpn_attr *attr;
+
+        for (attr = qa[i]; attr; attr = attr->next)
+            if (attr->value > 0)
+	    {   /* deal only with REAL attributes (positive) */
+	        switch (attr->type)
+		{
+		case CCL_BIB1_REL:
+		    if (relation_value != -1)
+		        continue;
+		    relation_value = attr->value;
+		    break;
+		case CCL_BIB1_POS:
+		    if (position_value != -1)
+		        continue;
+		    position_value = attr->value;
+		    break;
+		case CCL_BIB1_STR:
+		    if (structure_value != -1)
+		        continue;
+		    structure_value = attr->value;
+		    break;
+		case CCL_BIB1_TRU:
+		    if (truncation_value != -1)
+		        continue;
+		    truncation_value = attr->value;
+		    break;
+		case CCL_BIB1_COM:
+		    if (completeness_value != -1)
+		        continue;
+		    completeness_value = attr->value;
+		    break;
+		}
+                add_attr (p, attr->type, attr->value);
+	    }
+    }
+    /* go through each TERM token. If no truncation attribute is yet
+       met, then look for left/right truncation markers (?) and
+       set left_trunc/right_trunc/mid_trunc accordingly */
+    for (no = 0; is_term_ok(lookahead->kind, term_list); no++)
+    {
+        for (i = 0; i<lookahead->len; i++)
+            if (truncation_value == -1 && lookahead->name[i] == '?')
+            {
+                if (no == 0 && i == 0 && lookahead->len >= 1)
+                    left_trunc = 1;
+                else if (!is_term_ok(lookahead->next->kind, term_list) &&
+                         i == lookahead->len-1 && i >= 1)
+                    right_trunc = 1;
+                else
+                    mid_trunc = 1;
+            }
+        len += 1+lookahead->len;
+	lookahead = lookahead->next;
+    }
+    /* len now holds the number of characters in the RPN term */
+    /* no holds the number of CCL tokens (1 or more) */
+
+    if (structure_value == -1 && 
+        qual_val_type (qa, CCL_BIB1_STR, CCL_BIB1_STR_WP))
+    {   /* no structure attribute met. Apply either structure attribute 
+           WORD or PHRASE depending on number of CCL tokens */
+        if (no == 1)
+            add_attr (p, CCL_BIB1_STR, 2);
+        else
+            add_attr (p, CCL_BIB1_STR, 1);
+    }
+
+    /* make the RPN token */
+    p->u.t.term = (char *)malloc (len);
+    ccl_assert (p->u.t.term);
+    p->u.t.term[0] = '\0';
+    for (i = 0; i<no; i++)
+    {
+        const char *src_str = cclp->look_token->name;
+        int src_len = cclp->look_token->len;
+        
+        if (i == 0 && left_trunc)
+        {
+            src_len--;
+            src_str++;
+        }
+        else if (i == no-1 && right_trunc)
+            src_len--;
+        if (src_len)
+        {
+            int len = strlen(p->u.t.term);
+            if (len &&
+                !strchr("-+", *src_str) &&
+                !strchr("-+", p->u.t.term[len-1]))
+            {
+                strcat (p->u.t.term, " ");
+            }
+        }
+	strxcat (p->u.t.term, src_str, src_len);
+        ADVANCE;
+    }
+    if (left_trunc && right_trunc)
+    {
+        if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_BOTH))
+        {
+            cclp->error_code = CCL_ERR_TRUNC_NOT_BOTH;
+            ccl_rpn_delete (p);
+            return NULL;
+        }
+        add_attr (p, CCL_BIB1_TRU, 3);
+    }
+    else if (right_trunc)
+    {
+        if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_RIGHT))
+        {
+            cclp->error_code = CCL_ERR_TRUNC_NOT_RIGHT;
+            ccl_rpn_delete (p);
+            return NULL;
+        }
+        add_attr (p, CCL_BIB1_TRU, 1);
+    }
+    else if (left_trunc)
+    {
+        if (!qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_LEFT))
+        {
+            cclp->error_code = CCL_ERR_TRUNC_NOT_LEFT;
+            ccl_rpn_delete (p);
+            return NULL;
+        }
+        add_attr (p, CCL_BIB1_TRU, 2);
+    }
+    else
+    {
+        if (qual_val_type (qa, CCL_BIB1_TRU, CCL_BIB1_TRU_CAN_NONE))
+            add_attr (p, CCL_BIB1_TRU, 100);
+    }
+    return p;
+}
+
+static struct ccl_rpn_node *search_term (CCL_parser cclp,
+					 struct ccl_rpn_attr **qa)
+{
+    static int list[] = {CCL_TOK_TERM, CCL_TOK_COMMA, -1};
+    return search_term_x(cclp, qa, list);
+}
+
+/*
+ * qualifiers: Parse CCL qualifiers and search terms. 
+ * cclp:   CCL Parser
+ * la:     Token pointer to RELATION token.
+ * qa:     Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *qualifiers (CCL_parser cclp, struct ccl_token *la,
+                                        struct ccl_rpn_attr **qa)
+{
+    struct ccl_token *lookahead = cclp->look_token;
+    struct ccl_rpn_attr **ap;
+    int no = 0;
+    int i, rel;
+#if 0
+    if (qa)
+    {
+        cclp->error_code = CCL_ERR_DOUBLE_QUAL;
+        return NULL;
+    }
+#endif
+    for (lookahead = cclp->look_token; lookahead != la;
+	 lookahead=lookahead->next)
+        no++;
+    if (qa)
+        for (i=0; qa[i]; i++)
+	    no++;
+    ap = (struct ccl_rpn_attr **)malloc ((no+1) * sizeof(*ap));
+    ccl_assert (ap);
+    for (i = 0; cclp->look_token != la; i++)
+    {
+        ap[i] = ccl_qual_search (cclp, cclp->look_token->name,
+				 cclp->look_token->len);
+        if (!ap[i])
+        {
+            cclp->error_code = CCL_ERR_UNKNOWN_QUAL;
+            free (ap);
+            return NULL;
+        }
+        ADVANCE;
+        if (KIND == CCL_TOK_COMMA)
+            ADVANCE;
+    }
+    if (qa)
+        while (*qa)
+	    ap[i++] = *qa++;
+    ap[i] = NULL;
+    if (!qual_val_type (ap, CCL_BIB1_REL, CCL_BIB1_REL_ORDER))
+    {                
+        /* unordered relation */
+        struct ccl_rpn_node *p;
+        if (KIND != CCL_TOK_EQ)
+        {
+            cclp->error_code = CCL_ERR_EQ_EXPECTED;
+            free (ap);
+            return NULL;
+        }
+        ADVANCE;
+        if (KIND == CCL_TOK_LP)
+        {
+            ADVANCE;
+            if (!(p = find_spec (cclp, ap)))
+            {
+                free (ap);
+                return NULL;
+            }
+            if (KIND != CCL_TOK_RP)
+            {
+                cclp->error_code = CCL_ERR_RP_EXPECTED;
+                ccl_rpn_delete (p);
+                free (ap);
+                return NULL;
+            }
+            ADVANCE;
+        }
+        else
+            p = search_terms (cclp, ap);
+        free (ap);
+        return p;
+    }
+    /* ordered relation ... */
+    rel = 0;
+    if (cclp->look_token->len == 1)
+    {
+        if (cclp->look_token->name[0] == '<')
+            rel = 1;
+        else if (cclp->look_token->name[0] == '=')
+            rel = 3;
+        else if (cclp->look_token->name[0] == '>')
+            rel = 5;
+    }
+    else if (cclp->look_token->len == 2)
+    {
+        if (!memcmp (cclp->look_token->name, "<=", 2))
+            rel = 2;
+        else if (!memcmp (cclp->look_token->name, ">=", 2))
+            rel = 4;
+        else if (!memcmp (cclp->look_token->name, "<>", 2))
+            rel = 6;
+    }
+    if (!rel)
+        cclp->error_code = CCL_ERR_BAD_RELATION;
+    else
+    {
+        struct ccl_rpn_node *p;
+
+        ADVANCE;                      /* skip relation */
+        if (KIND == CCL_TOK_TERM &&
+	    cclp->look_token->next->kind == CCL_TOK_MINUS)
+        {
+            struct ccl_rpn_node *p1;
+            if (!(p1 = search_term (cclp, ap)))
+	    {
+	        free (ap);
+	        return NULL;
+	    }
+            ADVANCE;                   /* skip '-' */
+            if (KIND == CCL_TOK_TERM)  /* = term - term  ? */
+            {
+                struct ccl_rpn_node *p2;
+                
+                if (!(p2 = search_term (cclp, ap)))
+		{
+                    ccl_rpn_delete (p1);
+		    free (ap);
+		    return NULL;
+		}
+                p = mk_node (CCL_RPN_AND);
+                p->u.p[0] = p1;
+                add_attr (p1, CCL_BIB1_REL, 4);
+                p->u.p[1] = p2;
+                add_attr (p2, CCL_BIB1_REL, 2);
+                free (ap);
+                return p;
+            }
+            else                       /* = term -    */
+            {
+                add_attr (p1, CCL_BIB1_REL, 4);
+                free (ap);
+                return p1;
+            }
+        }
+        else if (KIND == CCL_TOK_MINUS)   /* = - term  ? */
+        {
+            ADVANCE;
+            if (!(p = search_term (cclp, ap)))
+	    {
+	        free (ap);
+		return NULL;
+	    }
+            add_attr (p, CCL_BIB1_REL, 2);
+            free (ap);
+            return p;
+        }
+	else if (KIND == CCL_TOK_LP)
+	{
+            ADVANCE;
+            if (!(p = find_spec (cclp, ap)))
+            {
+                free (ap);
+                return NULL;
+            }
+            if (KIND != CCL_TOK_RP)
+            {
+                cclp->error_code = CCL_ERR_RP_EXPECTED;
+                ccl_rpn_delete (p);
+                free (ap);
+                return NULL;
+            }
+            ADVANCE;
+	    free (ap);
+	    return p;
+	}
+	else
+	{
+            if (!(p = search_terms (cclp, ap)))
+	    {
+	        free (ap);
+		return NULL;
+	    }
+            add_attr (p, CCL_BIB1_REL, rel);
+	    free (ap);
+	    return p;
+	}
+        cclp->error_code = CCL_ERR_TERM_EXPECTED;
+    }
+    free (ap);
+    return NULL;
+}
+
+/*
+ * search_terms: Parse CCL search terms - including proximity.
+ * cclp:   CCL Parser
+ * qa:     Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_terms (CCL_parser cclp,
+					  struct ccl_rpn_attr **qa)
+{
+    static int list[] = {
+        CCL_TOK_TERM, CCL_TOK_COMMA,CCL_TOK_EQ,
+        CCL_TOK_REL, CCL_TOK_MINUS, -1};
+    struct ccl_rpn_node *p1, *p2, *pn;
+    p1 = search_term_x (cclp, qa, list);
+    if (!p1)
+        return NULL;
+    while (1)
+    {
+	if (KIND == CCL_TOK_PROX)
+	{
+	    ADVANCE;
+	    p2 = search_term_x (cclp, qa, list);
+            if (!p2)
+            {
+                ccl_rpn_delete (p1);
+                return NULL;
+            }
+	    pn = mk_node (CCL_RPN_PROX);
+	    pn->u.p[0] = p1;
+	    pn->u.p[1] = p2;
+	    p1 = pn;
+	}
+	else if (is_term_ok(KIND, list))
+	{
+	    p2 = search_term_x (cclp, qa, list);
+            if (!p2)
+            {
+                ccl_rpn_delete (p1);
+                return NULL;
+            }
+	    pn = mk_node (CCL_RPN_PROX);
+	    pn->u.p[0] = p1;
+	    pn->u.p[1] = p2;
+	    p1 = pn;
+	}
+	else
+	    break;
+    }
+    return p1;
+}
+
+/*
+ * search_elements: Parse CCL search elements
+ * cclp:   CCL Parser
+ * qa:     Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *search_elements (CCL_parser cclp,
+					     struct ccl_rpn_attr **qa)
+{
+    struct ccl_rpn_node *p1;
+    struct ccl_token *lookahead;
+    if (KIND == CCL_TOK_LP)
+    {
+	ADVANCE;
+	p1 = find_spec (cclp, qa);
+        if (!p1)
+            return NULL;
+        if (KIND != CCL_TOK_RP)
+        {
+            cclp->error_code = CCL_ERR_RP_EXPECTED;
+            ccl_rpn_delete (p1);
+            return NULL;
+        }
+	ADVANCE;
+	return p1;
+    }
+    else if (KIND == CCL_TOK_SET)
+    {
+	ADVANCE;
+        if (KIND == CCL_TOK_EQ)
+            ADVANCE;
+        if (KIND != CCL_TOK_TERM)
+        {
+            cclp->error_code = CCL_ERR_SETNAME_EXPECTED;
+            return NULL;
+        }
+	p1 = mk_node (CCL_RPN_SET);
+	p1->u.setname = copy_token_name (cclp->look_token);
+	ADVANCE;
+	return p1;
+    }
+    lookahead = cclp->look_token;
+
+    while (lookahead->kind==CCL_TOK_TERM)
+    {
+        lookahead = lookahead->next;
+        if (lookahead->kind == CCL_TOK_REL || lookahead->kind == CCL_TOK_EQ)
+	    return qualifiers (cclp, lookahead, qa);
+        if (lookahead->kind != CCL_TOK_COMMA)
+            break;
+        lookahead = lookahead->next;
+    }
+    return search_terms (cclp, qa);
+}
+
+/*
+ * find_spec: Parse CCL find specification
+ * cclp:   CCL Parser
+ * qa:     Qualifier attributes already applied.
+ * return: pointer to node(s); NULL on error.
+ */
+static struct ccl_rpn_node *find_spec (CCL_parser cclp,
+				       struct ccl_rpn_attr **qa)
+{
+    struct ccl_rpn_node *p1, *p2, *pn;
+    if (!(p1 = search_elements (cclp, qa)))
+        return NULL;
+    while (1)
+    {
+	switch (KIND)
+	{
+	case CCL_TOK_AND:
+	    ADVANCE;
+	    p2 = search_elements (cclp, qa);
+            if (!p2)
+            {
+                ccl_rpn_delete (p1);
+                return NULL;
+            }
+	    pn = mk_node (CCL_RPN_AND);
+	    pn->u.p[0] = p1;
+	    pn->u.p[1] = p2;
+	    p1 = pn;
+	    continue;
+	case CCL_TOK_OR:
+	    ADVANCE;
+	    p2 = search_elements (cclp, qa);
+            if (!p2)
+            {
+                ccl_rpn_delete (p1);
+                return NULL;
+            }
+	    pn = mk_node (CCL_RPN_OR);
+	    pn->u.p[0] = p1;
+	    pn->u.p[1] = p2;
+	    p1 = pn;
+	    continue;
+	case CCL_TOK_NOT:
+	    ADVANCE;
+	    p2 = search_elements (cclp, qa);
+            if (!p2)
+            {
+                ccl_rpn_delete (p1);
+                return NULL;
+            }
+	    pn = mk_node (CCL_RPN_NOT);
+	    pn->u.p[0] = p1;
+	    pn->u.p[1] = p2;
+	    p1 = pn;
+	    continue;
+	}
+	break;
+    }
+    return p1;
+}
+
+struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list)
+{
+    struct ccl_rpn_node *p;
+
+    cclp->look_token = list;
+    p = find_spec (cclp, NULL);
+    if (p && KIND != CCL_TOK_EOL)
+    {
+        if (KIND == CCL_TOK_RP)
+            cclp->error_code = CCL_ERR_BAD_RP;
+        else
+            cclp->error_code = CCL_ERR_OP_EXPECTED;
+        ccl_rpn_delete (p);
+        p = NULL;
+    }
+    cclp->error_pos = cclp->look_token->name;
+    if (p)
+        cclp->error_code = CCL_ERR_OK;
+    else
+        cclp->error_code = cclp->error_code;
+    return p;
+}
+
+/*
+ * ccl_find: Parse CCL find - token representation
+ * bibset:  Bibset to be used for the parsing
+ * list:    List of tokens
+ * error:   Pointer to integer. Holds error no. on completion.
+ * pos:     Pointer to char position. Holds approximate error position.
+ * return:  RPN tree on successful completion; NULL otherwise.
+ */
+struct ccl_rpn_node *ccl_find (CCL_bibset bibset, struct ccl_token *list,
+                               int *error, const char **pos)
+{
+    struct ccl_rpn_node *p;
+    CCL_parser cclp = ccl_parser_create ();
+
+    cclp->bibset = bibset;
+
+    p = ccl_parser_find (cclp, list);
+
+    *error = cclp->error_code;
+    *pos = cclp->error_pos;
+
+    ccl_parser_destroy (cclp);
+
+    return p;
+}
+
+/*
+ * ccl_find_str: Parse CCL find - string representation
+ * bibset:  Bibset to be used for the parsing
+ * str:     String to be parsed
+ * error:   Pointer to integer. Holds error no. on completion.
+ * pos:     Pointer to char position. Holds approximate error position.
+ * return:  RPN tree on successful completion; NULL otherwise.
+ */
+struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
+                                   int *error, int *pos)
+{
+    CCL_parser cclp = ccl_parser_create ();
+    struct ccl_token *list;
+    struct ccl_rpn_node *p;
+
+    cclp->bibset = bibset;
+
+    list = ccl_parser_tokenize (cclp, str);
+    p = ccl_parser_find (cclp, list);
+
+    *error = cclp->error_code;
+    if (*error)
+        *pos = cclp->error_pos - str;
+    ccl_parser_destroy (cclp);
+    ccl_token_del (list);
+    return p;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclptree.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclptree.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclptree.c	(revision 21083)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL print rpn tree - infix notation
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:56  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.7  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.6  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.5  1997/04/30 08:52:06  quinn
+ * Null
+ *
+ * Revision 1.4  1996/10/11  15:00:25  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.6  1995/05/16  09:39:26  adam
+ * LICENSE.
+ *
+ * Revision 1.5  1995/02/23  08:31:59  adam
+ * Changed header.
+ *
+ * Revision 1.3  1995/02/15  17:42:16  adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.2  1995/02/14  19:55:11  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.1  1995/02/14  10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out)
+{
+
+    switch (rpn->kind)
+    {
+    case CCL_RPN_TERM:
+	fprintf (fd_out, "\"%s\"", rpn->u.t.term);
+        if (rpn->u.t.attr_list)
+        {
+            struct ccl_rpn_attr *attr;
+            for (attr = rpn->u.t.attr_list; attr; attr = attr->next)
+                fprintf (fd_out, " %d=%d", attr->type, attr->value);
+        }
+	break;
+    case CCL_RPN_AND:
+	fprintf (fd_out, "(");
+	ccl_pr_tree (rpn->u.p[0], fd_out);
+	fprintf (fd_out, ") and (");
+	ccl_pr_tree (rpn->u.p[1], fd_out);
+	fprintf (fd_out, ")");
+	break;
+    case CCL_RPN_OR:
+	fprintf (fd_out, "(");
+	ccl_pr_tree (rpn->u.p[0], fd_out);
+	fprintf (fd_out, ") or (");
+	ccl_pr_tree (rpn->u.p[1], fd_out);
+	fprintf (fd_out, ")");
+	break;
+    case CCL_RPN_NOT:
+	fprintf (fd_out, "(");
+	ccl_pr_tree (rpn->u.p[0], fd_out);
+	fprintf (fd_out, ") not (");
+	ccl_pr_tree (rpn->u.p[1], fd_out);
+	fprintf (fd_out, ")");
+	break;
+    case CCL_RPN_SET:
+	fprintf (fd_out, "set=%s", rpn->u.setname);
+	break;
+    case CCL_RPN_PROX:
+	fprintf (fd_out, "(");
+	ccl_pr_tree (rpn->u.p[0], fd_out);
+	fprintf (fd_out, ") prox (");
+	ccl_pr_tree (rpn->u.p[1], fd_out);
+	fprintf (fd_out, ")");
+	break;
+    default:
+	ccl_assert (0);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclqfile.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclqfile.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclqfile.c	(revision 21083)
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL qualifiers
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:57  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.3  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1997/04/30 08:52:06  quinn
+ * Null
+ *
+ * Revision 1.1  1996/10/11  15:00:25  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.3  1995/05/16  09:39:26  adam
+ * LICENSE.
+ *
+ * Revision 1.2  1995/05/11  14:03:56  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.1  1995/04/17  09:31:45  adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name)
+{
+    char qual_type[128];
+    int no_scan;
+    int pair[128];
+    int pair_no = 0;
+
+    while (1)
+    {
+        char *qual_value;
+        char *split;
+        
+        if (sscanf (cp, "%s%n", qual_type, &no_scan) != 1)
+            break;
+        
+        if (!(split = strchr (qual_type, '=')))
+            break;
+        cp += no_scan;
+        
+        *split++ = '\0';
+        while (1)
+        {
+            int type, value;
+
+            qual_value = split;
+            if ((split = strchr (qual_value, ',')))
+                *split++ = '\0';
+            value = atoi (qual_value);
+            switch (qual_type[0])
+            {
+            case 'u':
+            case 'U':
+                type = CCL_BIB1_USE;
+                break;
+            case 'r':
+            case 'R':
+                type = CCL_BIB1_REL;
+                if (!ccl_stricmp (qual_value, "o"))
+                    value = CCL_BIB1_REL_ORDER;
+                break;                
+            case 'p':
+            case 'P':
+                type = CCL_BIB1_POS;
+                break;
+            case 's':
+            case 'S':
+                type = CCL_BIB1_STR;
+                if (!ccl_stricmp (qual_value, "pw"))
+                    value = CCL_BIB1_STR_WP;
+                break;                
+            case 't':
+            case 'T':
+                type = CCL_BIB1_TRU;
+                if (!ccl_stricmp (qual_value, "l"))
+                    value = CCL_BIB1_TRU_CAN_LEFT;
+                else if (!ccl_stricmp (qual_value, "r"))
+                    value = CCL_BIB1_TRU_CAN_RIGHT;
+                else if (!ccl_stricmp (qual_value, "b"))
+                    value = CCL_BIB1_TRU_CAN_BOTH;
+                else if (!ccl_stricmp (qual_value, "n"))
+                    value = CCL_BIB1_TRU_CAN_NONE;
+                break;                
+            case 'c':
+            case 'C':
+                type = CCL_BIB1_COM;
+                break;                
+            default:
+                type = atoi (qual_type);
+            }
+            pair[pair_no*2] = type;
+            pair[pair_no*2+1] = value;
+            pair_no++;
+            if (!split)
+                break;
+        }
+    }
+    ccl_qual_add (bibset, qual_name, pair_no, pair);
+}
+
+/*
+ * ccl_qual_file: Read bibset definition from file.
+ * bibset:  Bibset
+ * inf:     FILE pointer.
+ *
+ * Each line format is:
+ *  <name> <t>=<v> <t>=<v> ....
+ *  Where <name> is name of qualifier;
+ *  <t>=<v> is a attribute definition pair where <t> is one of: 
+ *     u(use), r(relation), p(position), t(truncation), c(completeness) 
+ *     or plain integer.
+ *  <v> is an integer or special pseudo-value.
+ */
+void ccl_qual_file (CCL_bibset bibset, FILE *inf)
+{
+    char line[256];
+    char *cp;
+    char qual_name[128];
+    int  no_scan;
+
+    while (fgets (line, 255, inf))
+    {
+        cp = line;
+        if (*cp == '#')
+            continue;        /* ignore lines starting with # */
+        if (sscanf (cp, "%s%n", qual_name, &no_scan) != 1)
+            continue;        /* also ignore empty lines */
+        cp += no_scan;
+        ccl_qual_fitem (bibset, cp, qual_name);
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclqual.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclqual.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclqual.c	(revision 21083)
@@ -0,0 +1,246 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL qualifiers
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:58  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.13  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.12  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.11  1999/03/31 11:15:37  adam
+ * Fixed memory leaks in ccl_find_str and ccl_qual_rm.
+ *
+ * Revision 1.10  1998/07/07 15:49:40  adam
+ * Added braces to avoid warning.
+ *
+ * Revision 1.9  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1997/09/29 08:56:38  adam
+ * Changed CCL parser to be thread safe. New type, CCL_parser, declared
+ * and a create/destructers ccl_parser_create/ccl_parser/destory has
+ * been added.
+ *
+ * Revision 1.7  1997/09/01 08:48:12  adam
+ * New windows NT/95 port using MSV5.0. Only a few changes made
+ * to avoid warnings.
+ *
+ * Revision 1.6  1997/04/30 08:52:07  quinn
+ * Null
+ *
+ * Revision 1.5  1996/10/11  15:00:25  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.9  1995/05/16  09:39:27  adam
+ * LICENSE.
+ *
+ * Revision 1.8  1995/05/11  14:03:57  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.7  1995/04/17  09:31:46  adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.6  1995/02/23  08:32:00  adam
+ * Changed header.
+ *
+ * Revision 1.4  1995/02/14  19:55:12  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.3  1995/02/14  16:20:56  adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.2  1995/02/14  10:25:56  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.1  1995/02/13  15:15:07  adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/ccl.h>
+
+/* Definition of CCL_bibset pointer */
+struct ccl_qualifiers {
+    struct ccl_qualifier *list;
+};
+
+/*
+ * ccl_qual_add: Add qualifier to Bibset. If qualifier already
+ *               exists, then attributes are appendend to old
+ *               definition.
+ * name:    name of qualifier
+ * no:      No of attribute type/value pairs.
+ * pairs:   Attributes. pairs[0] first type, pair[1] first value,
+ *          ... pair[2*no-2] last type, pair[2*no-1] last value.
+ */
+void ccl_qual_add (CCL_bibset b, const char *name, int no, int *pairs)
+{
+    struct ccl_qualifier *q;
+    struct ccl_rpn_attr **attrp;
+
+    ccl_assert (b);
+    for (q = b->list; q; q = q->next)
+        if (!strcmp (name, q->name))
+            break;
+    if (!q)
+    {
+        struct ccl_qualifier *new_qual =
+	    (struct ccl_qualifier *)malloc (sizeof(*new_qual));
+        ccl_assert (new_qual);
+        
+        new_qual->next = b->list;
+        b->list = new_qual;
+        
+        new_qual->name = (char *)malloc (strlen(name)+1);
+        ccl_assert (new_qual->name);
+        strcpy (new_qual->name, name);
+        attrp = &new_qual->attr_list;
+    }
+    else
+    {
+        attrp = &q->attr_list;
+        while (*attrp)
+            attrp = &(*attrp)->next;
+    }
+    while (--no >= 0)
+    {
+        struct ccl_rpn_attr *attr;
+
+        attr = (struct ccl_rpn_attr *)malloc (sizeof(*attr));
+        ccl_assert (attr);
+        attr->type = *pairs++;
+        attr->value = *pairs++;
+        *attrp = attr;
+        attrp = &attr->next;
+    }
+    *attrp = NULL;
+}
+
+/*
+ * ccl_qual_mk: Make new (empty) bibset.
+ * return:   empty bibset.
+ */
+CCL_bibset ccl_qual_mk (void)
+{
+    CCL_bibset b = (CCL_bibset)malloc (sizeof(*b));
+    ccl_assert (b);
+    b->list = NULL;     
+    return b;
+}
+
+/*
+ * ccl_qual_rm: Delete bibset.
+ * b:        pointer to bibset
+ */
+void ccl_qual_rm (CCL_bibset *b)
+{
+    struct ccl_qualifier *q, *q1;
+
+    if (!*b)
+        return;
+    for (q = (*b)->list; q; q = q1)
+    {
+        struct ccl_rpn_attr *attr, *attr1;
+
+        for (attr = q->attr_list; attr; attr = attr1)
+	{
+	    attr1 = attr->next;
+	    free (attr);
+	}
+        q1 = q->next;
+	free (q->name);
+	free (q);
+    }
+    free (*b);
+    *b = NULL;
+}
+
+/*
+ * ccl_qual_search: Search for qualifier in bibset.
+ * b:      Bibset
+ * name:   Name of qualifier to search for (need no null-termination)
+ * len:    Length of name.
+ * return: Attribute info. NULL if not found.
+ */
+struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp,
+				      const char *name, size_t len)
+{
+    struct ccl_qualifier *q;
+
+    ccl_assert (cclp);
+    if (!cclp->bibset)
+	return NULL;
+    for (q = cclp->bibset->list; q; q = q->next)
+        if (strlen(q->name) == len)
+        {
+            if (cclp->ccl_case_sensitive)
+            {
+                if (!memcmp (name, q->name, len))
+                    return q->attr_list;
+            }
+            else
+            {
+                if (!ccl_memicmp (name, q->name, len))
+                    return q->attr_list;
+            }
+        }
+    return NULL;
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclsh.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclsh.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclsh.c	(revision 21083)
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL shell.
+ * Europagate 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:58  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.6  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.5  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ * Revision 1.4  1999/03/31 11:15:37  adam
+ * Fixed memory leaks in ccl_find_str and ccl_qual_rm.
+ *
+ * Revision 1.3  1997/04/30 08:52:07  quinn
+ * Null
+ *
+ * Revision 1.2  1996/10/11  15:00:25  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.11  1995/05/16  09:39:27  adam
+ * LICENSE.
+ *
+ * Revision 1.10  1995/05/11  14:03:57  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.9  1995/02/23  08:32:00  adam
+ * Changed header.
+ *
+ * Revision 1.7  1995/02/15  17:42:16  adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.6  1995/02/14  19:55:13  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.5  1995/02/14  16:20:57  adam
+ * Qualifiers are read from a file now.
+ *
+ * Revision 1.4  1995/02/14  14:12:42  adam
+ * Ranges for ordered qualfiers implemented (e.g. pd=1980-1990).
+ *
+ * Revision 1.3  1995/02/14  10:25:57  adam
+ * The constructions 'qualifier rel term ...' implemented.
+ *
+ * Revision 1.2  1995/02/13  15:15:07  adam
+ * Added handling of qualifiers. Not finished yet.
+ *
+ * Revision 1.1  1995/02/13  12:35:21  adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/ccl.h>
+
+static int debug = 0;
+static char *prog;
+
+int main (int argc, char **argv)
+{
+    CCL_bibset bibset;
+    FILE *bib_inf;
+    char *bib_fname;
+
+    prog = *argv;
+    bibset = ccl_qual_mk ();    
+    while (--argc > 0)
+    {
+        if (**++argv == '-')
+        {
+            switch (argv[0][1])
+            {
+            case 'd':
+                debug = 1;
+                break;
+            case 'b':
+                if (argv[0][2])
+                    bib_fname = argv[0]+2;
+                else if (argc > 0)
+                {
+                    --argc;
+                    bib_fname = *++argv;
+                }
+                else
+                {
+                    fprintf (stderr, "%s: missing bib filename\n", prog);
+                    exit (1);
+                }
+                bib_inf = fopen (bib_fname, "r");
+                if (!bib_inf)
+                {
+                    fprintf (stderr, "%s: cannot open %s\n", prog,
+                             bib_fname);
+                    exit (1);
+                }
+                ccl_qual_file (bibset, bib_inf);
+                fclose (bib_inf);
+                break;
+            default:
+                fprintf (stderr, "%s: unknown option '%s'\n",
+                    prog, *argv);
+                exit (1);
+            }
+        }
+        else
+        {
+            fprintf (stderr, "%s: no filenames, please\n", prog);
+            exit (1);
+        }
+    }
+    while (1)
+    {
+        char buf[80];
+        int i, error, pos;
+        struct ccl_rpn_node *rpn;
+
+	printf ("CCLSH>"); fflush (stdout);
+	if (!fgets (buf, 79, stdin))
+	    break;
+        for (i = 0; i<1; i++)
+        {
+	    rpn = ccl_find_str (bibset, buf, &error, &pos);
+            if (error)
+            {
+                printf ("%*s^ - ", 6+pos, " ");
+                printf ("%s\n", ccl_err_msg (error));
+            }
+            else
+            {
+		if (rpn && i == 0)
+		{
+		    ccl_pr_tree (rpn, stdout);
+		    putchar ('\n');
+		}
+            }
+            if (rpn)
+                ccl_rpn_delete(rpn);
+        }
+    }
+    putchar ('\n');
+    return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/cclstr.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/cclstr.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/cclstr.c	(revision 21083)
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL string compare utilities
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:59  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.3  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1997/04/30 08:52:07  quinn
+ * Null
+ *
+ * Revision 1.1  1996/10/11  15:00:26  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.3  1996/01/24  10:11:19  adam
+ * Added include of stdlib.h.
+ *
+ * Revision 1.2  1995/05/16  09:39:27  adam
+ * LICENSE.
+ *
+ * Revision 1.1  1995/05/11  14:03:57  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ */
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/ccl.h>
+
+static int ccli_toupper (int c)
+{
+    return toupper (c);
+}
+
+int (*ccl_toupper)(int c) = NULL;
+
+int ccl_stricmp (const char *s1, const char *s2)
+{
+    if (!ccl_toupper)
+        ccl_toupper = ccli_toupper;
+    while (*s1 && *s2)
+    {
+        int c1, c2;
+        c1 = (*ccl_toupper)(*s1);
+        c2 = (*ccl_toupper)(*s2);
+        if (c1 != c2)
+            return c1 - c2;
+        s1++;
+        s2++;
+    }
+    return (*ccl_toupper)(*s1) - (*ccl_toupper)(*s2);
+}
+
+int ccl_memicmp (const char *s1, const char *s2, size_t n)
+{
+    if (!ccl_toupper)
+        ccl_toupper = ccli_toupper;
+    while (1)
+    {
+        int c1, c2;
+
+        c1 = (*ccl_toupper)(*s1);
+        c2 = (*ccl_toupper)(*s2);
+        if (n <= 1 || c1 != c2)
+            return c1 - c2;
+        s1++;
+        s2++;
+        --n;
+    }
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/ccl/ccltoken.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/ccl/ccltoken.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/ccl/ccltoken.c	(revision 21083)
@@ -0,0 +1,419 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+/* CCL - lexical analysis
+ * Europagate, 1995
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:09:59  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.13  2000/02/08 10:39:53  adam
+ * Added a few functions to set name of operands, etc.
+ *
+ * Revision 1.12  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.11  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.10  1998/07/07 15:49:41  adam
+ * Added braces to avoid warning.
+ *
+ * Revision 1.9  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1997/09/29 08:56:38  adam
+ * Changed CCL parser to be thread safe. New type, CCL_parser, declared
+ * and a create/destructers ccl_parser_create/ccl_parser/destory has
+ * been added.
+ *
+ * Revision 1.7  1997/09/01 08:48:12  adam
+ * New windows NT/95 port using MSV5.0. Only a few changes made
+ * to avoid warnings.
+ *
+ * Revision 1.6  1997/04/30 08:52:07  quinn
+ * Null
+ *
+ * Revision 1.5  1996/10/11  15:00:26  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.10  1995/07/11  12:28:31  adam
+ * New function: ccl_token_simple (split into simple tokens) and
+ *  ccl_token_del (delete tokens).
+ *
+ * Revision 1.9  1995/05/16  09:39:28  adam
+ * LICENSE.
+ *
+ * Revision 1.8  1995/05/11  14:03:57  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.7  1995/04/19  12:11:24  adam
+ * Minor change.
+ *
+ * Revision 1.6  1995/04/17  09:31:48  adam
+ * Improved handling of qualifiers. Aliases or reserved words.
+ *
+ * Revision 1.5  1995/02/23  08:32:00  adam
+ * Changed header.
+ *
+ * Revision 1.3  1995/02/15  17:42:16  adam
+ * Minor changes of the api of this module. FILE* argument added
+ * to ccl_pr_tree.
+ *
+ * Revision 1.2  1995/02/14  19:55:13  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ * Node kind(s) in ccl_rpn_node have changed names.
+ *
+ * Revision 1.1  1995/02/13  12:35:21  adam
+ * First version of CCL. Qualifiers aren't handled yet.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <yaz/ccl.h>
+
+/*
+ * token_cmp: Compare token with keyword(s)
+ * kw:     Keyword list. Each keyword is separated by space.
+ * token:  CCL token.
+ * return: 1 if token string matches one of the keywords in list;
+ *         0 otherwise.
+ */
+static int token_cmp (CCL_parser cclp, const char *kw, struct ccl_token *token)
+{
+    const char *cp1 = kw;
+    const char *cp2;
+    if (!kw)
+        return 0;
+    while ((cp2 = strchr (cp1, ' ')))
+    {
+        if (token->len == (size_t) (cp2-cp1))
+        {
+            if (cclp->ccl_case_sensitive)
+            {
+                if (!memcmp (cp1, token->name, token->len))
+                    return 1;
+            }
+            else
+            {
+                if (!ccl_memicmp (cp1, token->name, token->len))
+                    return 1;
+            }
+        }
+	cp1 = cp2+1;
+    }
+    if (cclp->ccl_case_sensitive)
+        return token->len == strlen(cp1) 
+            && !memcmp (cp1, token->name, token->len);
+    return token->len == strlen(cp1) &&
+        !ccl_memicmp (cp1, token->name, token->len);
+}
+
+/*
+ * ccl_token_simple: tokenize CCL raw tokens
+ */
+struct ccl_token *ccl_token_simple (const char *command)
+{
+    const char *cp = command;
+    struct ccl_token *first = NULL;
+    struct ccl_token *last = NULL;
+
+    while (1)
+    {
+	while (*cp && strchr (" \t\r\n", *cp))
+	{
+	    cp++;
+	    continue;
+	}
+	if (!first)
+	{
+	    first = last = (struct ccl_token *)malloc (sizeof (*first));
+	    ccl_assert (first);
+	    last->prev = NULL;
+	}
+	else
+	{
+	    last->next = (struct ccl_token *)malloc (sizeof(*first));
+	    ccl_assert (last->next);
+	    last->next->prev = last;
+	    last = last->next;
+	}
+	last->next = NULL;
+	last->name = cp;
+	last->len = 1;
+	switch (*cp++)
+	{
+        case '\0':
+            last->kind = CCL_TOK_EOL;
+            return first;
+	case '\"':
+	    last->kind = CCL_TOK_TERM;
+	    last->name = cp;
+	    last->len = 0;
+	    while (*cp && *cp != '\"')
+	    {
+		cp++;
+		++ last->len;
+	    }
+	    if (*cp == '\"')
+		cp++;
+	    break;
+	default:
+	    while (*cp && !strchr (" \t\n\r", *cp))
+	    {
+		cp++;
+		++ last->len;
+	    }
+            last->kind = CCL_TOK_TERM;
+	}
+    }
+    return first;
+}
+
+
+/*
+ * ccl_tokenize: tokenize CCL command string.
+ * return: CCL token list.
+ */
+struct ccl_token *ccl_parser_tokenize (CCL_parser cclp, const char *command)
+{
+    const char *cp = command;
+    struct ccl_token *first = NULL;
+    struct ccl_token *last = NULL;
+
+    while (1)
+    {
+	while (*cp && strchr (" \t\r\n", *cp))
+	{
+	    cp++;
+	    continue;
+	}
+	if (!first)
+	{
+	    first = last = (struct ccl_token *)malloc (sizeof (*first));
+	    ccl_assert (first);
+	    last->prev = NULL;
+	}
+	else
+	{
+	    last->next = (struct ccl_token *)malloc (sizeof(*first));
+	    ccl_assert (last->next);
+	    last->next->prev = last;
+	    last = last->next;
+	}
+	last->next = NULL;
+	last->name = cp;
+	last->len = 1;
+	switch (*cp++)
+	{
+        case '\0':
+            last->kind = CCL_TOK_EOL;
+            return first;
+	case '(':
+	    last->kind = CCL_TOK_LP;
+	    break;
+	case ')':
+	    last->kind = CCL_TOK_RP;
+	    break;
+	case ',':
+	    last->kind = CCL_TOK_COMMA;
+	    break;
+	case '%':
+	case '!':
+	    last->kind = CCL_TOK_PROX;
+	    while (*cp == '%' || *cp == '!')
+	    {
+		++ last->len;
+		cp++;
+	    }
+	    break;
+	case '>':
+	case '<':
+	case '=':
+	    if (*cp == '=' || *cp == '<' || *cp == '>')
+	    {
+		cp++;
+		last->kind = CCL_TOK_REL;
+		++ last->len;
+	    }
+	    else if (cp[-1] == '=')
+		last->kind = CCL_TOK_EQ;
+	    else
+		last->kind = CCL_TOK_REL;
+	    break;
+	case '-':
+	    last->kind = CCL_TOK_MINUS;
+	    break;
+	case '\"':
+	    last->kind = CCL_TOK_TERM;
+	    last->name = cp;
+	    last->len = 0;
+	    while (*cp && *cp != '\"')
+	    {
+		cp++;
+		++ last->len;
+	    }
+	    if (*cp == '\"')
+		cp++;
+	    break;
+	default:
+	    while (*cp && !strchr ("(),%!><=- \t\n\r", *cp))
+	    {
+		cp++;
+		++ last->len;
+	    }
+	    if (token_cmp (cclp, cclp->ccl_token_and, last))
+	        last->kind = CCL_TOK_AND;
+	    else if (token_cmp (cclp, cclp->ccl_token_or, last))
+	        last->kind = CCL_TOK_OR;
+            else if (token_cmp (cclp, cclp->ccl_token_not, last))
+	        last->kind = CCL_TOK_NOT;
+	    else if (token_cmp (cclp, cclp->ccl_token_set, last))
+	        last->kind = CCL_TOK_SET;
+	    else
+		last->kind = CCL_TOK_TERM;
+	}
+    }
+    return first;
+}
+
+struct ccl_token *ccl_tokenize (const char *command)
+{
+    CCL_parser cclp = ccl_parser_create ();
+    struct ccl_token *list;
+
+    list = ccl_parser_tokenize (cclp, command);
+
+    ccl_parser_destroy (cclp);
+    return list;
+}
+
+/*
+ * ccl_token_del: delete CCL tokens
+ */
+void ccl_token_del (struct ccl_token *list)
+{
+    struct ccl_token *list1;
+
+    while (list) 
+    {
+        list1 = list->next;
+        free (list);
+        list = list1;
+    }
+}
+
+static char *ccl_strdup (const char *str)
+{
+    int len = strlen(str);
+    char *p = (char*) malloc (len+1);
+    strcpy (p, str);
+    return p;
+}
+
+CCL_parser ccl_parser_create (void)
+{
+    CCL_parser p = (CCL_parser)malloc (sizeof(*p));
+    if (!p)
+	return p;
+    p->look_token = NULL;
+    p->error_code = 0;
+    p->error_pos = NULL;
+    p->bibset = NULL;
+
+    p->ccl_token_and = ccl_strdup("and");
+    p->ccl_token_or = ccl_strdup("or");
+    p->ccl_token_not = ccl_strdup("not andnot");
+    p->ccl_token_set = ccl_strdup("set");
+    p->ccl_case_sensitive = 1;
+
+    return p;
+}
+
+void ccl_parser_destroy (CCL_parser p)
+{
+    if (!p)
+	return;
+    free (p->ccl_token_and);
+    free (p->ccl_token_or);
+    free (p->ccl_token_not);
+    free (p->ccl_token_set);
+    free (p);
+}
+
+void ccl_parser_set_op_and (CCL_parser p, const char *op)
+{
+    if (p && op)
+	p->ccl_token_and = ccl_strdup (op);
+}
+
+void ccl_parser_set_op_or (CCL_parser p, const char *op)
+{
+    if (p && op)
+	p->ccl_token_or = ccl_strdup (op);
+}
+void ccl_parser_set_op_not (CCL_parser p, const char *op)
+{
+    if (p && op)
+	p->ccl_token_not = ccl_strdup (op);
+}
+void ccl_parser_set_op_set (CCL_parser p, const char *op)
+{
+    if (p && op)
+	p->ccl_token_set = ccl_strdup (op);
+}
+
+void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag)
+{
+    if (p)
+	p->ccl_case_sensitive = case_sensitivity_flag;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/client/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/client/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/client/Makefile.in	(revision 21083)
@@ -0,0 +1,17 @@
+CC= @CC@
+CFLAGS= @CFLAGS@
+
+#INCLUDES = -I../include -DCCLRPN=1
+INCLUDES = -I../include
+
+OBJECTS = yaz_zclient.o
+
+yaz_zclient.o: yaz_zclient.c
+	$(CC) -c $(INCLUDES) $(CFLAGS) $<
+
+all: $(OBJECTS)
+
+clean:
+	rm -f $(OBJECTS)
+distclean: clean
+	rm -f Makefile
Index: /main/tags/2.38/gsdl/packages/yaz/client/yaz_zclient.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/client/yaz_zclient.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/client/yaz_zclient.c	(revision 21083)
@@ -0,0 +1,2068 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ */
+
+/* Modified for the GreenStone Digital Library project - johnmcp */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h> /* for isdigit() */
+#include <time.h>
+
+/* don't need functions from here, maybe only the other header files:
+function atoi_n needed by marc_display()
+#include <yaz/yconfig.h>
+#include <yaz/xmalloc.h>
+#include <yaz/log.h>
+#include <yaz/tpath.h>
+#include <yaz/options.h>
+#include <yaz/wrbuf.h>
+#include <yaz/nmem.h>
+#include <yaz/readconf.h>
+*/
+#include <yaz/yaz-util.h>
+
+#include <yaz/tcpip.h>
+
+#include <yaz/proto.h>
+
+/* only defines marc_display[_ex] (), which could be inline. May need
+   yaz/yconfig.h header file */
+#include <yaz/marcdisp.h>
+#include <yaz/diagbib1.h>
+
+#include <yaz/pquery.h>
+
+#ifdef ASN_COMPILED
+#include <yaz/ill.h>
+#endif
+
+#if HAVE_READLINE_READLINE_H
+#include <readline/readline.h>
+#endif
+#if HAVE_READLINE_HISTORY_H
+#include <readline/history.h>
+#endif
+
+#define C_PROMPT "Z> "
+
+static ODR out, in, print;              /* encoding and decoding streams */
+static FILE *apdu_file = 0;
+static COMSTACK conn = 0;               /* our z-association */
+static Z_IdAuthentication *auth = 0;    /* our current auth definition */
+static char *databaseNames[128];
+static Z_External *record_last = 0;
+static int num_databaseNames = 0;
+static int setnumber = 0;               /* current result set number */
+static int smallSetUpperBound = 0;
+static int largeSetLowerBound = 1;
+static int mediumSetPresentNumber = 0;
+static Z_ElementSetNames *elementSetNames = 0; 
+static int setno = 1;                   /* current set offset */
+static enum oid_proto protocol = PROTO_Z3950;      /* current app protocol */
+static enum oid_value recordsyntax = VAL_USMARC;
+static enum oid_value schema = VAL_NONE;
+static int sent_close = 0;
+static NMEM session_mem = NULL;      /* memory handle for init-response */
+static Z_InitResponse *session = 0;     /* session parameters */
+static char last_scan[512] = "0";
+static FILE *marcdump = 0;
+static char *refid = NULL;
+/*johnmcp*/
+Z_InitResponse *z_initresponse;
+typedef enum {
+    QueryType_Prefix,
+    QueryType_CCL,
+    QueryType_CCL2RPN
+} QueryType;
+
+static QueryType queryType = QueryType_Prefix;
+/*static QueryType queryType = QueryType_CCL;*/
+
+static void send_apdu(Z_APDU *a)
+{
+    char *buf;
+    int len;
+
+    if (!z_APDU(out, &a, 0, 0))
+    {
+        odr_perror(out, "Encoding APDU");
+        exit(1);
+    }
+    if (apdu_file)
+    {
+        z_APDU(print, &a, 0, 0);
+        odr_reset(print);
+    }
+    buf = odr_getbuf(out, &len, 0);
+    /* printf ("sending APDU of size %d\n", len); */
+    if (cs_put(conn, buf, len) < 0)
+    {
+        fprintf(stderr, "cs_put: %s", cs_errmsg(cs_errno(conn)));
+        exit(1);
+    }
+    odr_reset(out); /* release the APDU structure  */
+}
+
+static void print_refid (Z_ReferenceId *id)
+{
+    if (id)
+    {
+	printf ("ReferenceId: '%.*s'\n", id->len, id->buf);
+    }
+}
+
+static Z_ReferenceId *set_refid (ODR out)
+{
+    Z_ReferenceId *id;
+    if (!refid)
+	return 0;
+    id = (Z_ReferenceId *) odr_malloc (out, sizeof(*id));
+    id->size = id->len = strlen(refid);
+    id->buf = (unsigned char *) odr_malloc (out, id->len);
+    memcpy (id->buf, refid, id->len);
+    return id;
+}   
+
+/* INIT SERVICE ------------------------------- */
+
+static void send_initRequest()
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_initRequest);
+    Z_InitRequest *req = apdu->u.initRequest;
+
+    ODR_MASK_SET(req->options, Z_Options_search);
+    ODR_MASK_SET(req->options, Z_Options_present);
+    ODR_MASK_SET(req->options, Z_Options_namedResultSets);
+    ODR_MASK_SET(req->options, Z_Options_triggerResourceCtrl);
+    ODR_MASK_SET(req->options, Z_Options_scan);
+    ODR_MASK_SET(req->options, Z_Options_sort);
+    ODR_MASK_SET(req->options, Z_Options_extendedServices);
+    ODR_MASK_SET(req->options, Z_Options_delSet);
+
+    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_1);
+    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_2);
+    ODR_MASK_SET(req->protocolVersion, Z_ProtocolVersion_3);
+
+    *req->maximumRecordSize = 1024*1024;
+    *req->preferredMessageSize = 1024*1024;
+
+    req->idAuthentication = auth;
+
+    send_apdu(apdu);
+}
+
+char *z_get_initResponse()
+{
+  char *buffer;
+  size_t needed_length;
+  char *text_id="ID: ";
+  char *text_name="<br>\nName: ";
+  char *text_ver="<br>\nVersion: ";
+  int counter;
+
+  buffer=NULL;
+    /* save session parameters for later use */
+  /*    session_mem = odr_extract_mem(in);
+	session = res; */
+    if (!*session->result)
+      return NULL;
+
+    /* work out total string length needed. Note strlen(NULL) is a bad thing
+       to do. */
+    needed_length=strlen(text_id)+strlen(text_name)+strlen(text_ver)+
+      (session->implementationId?strlen(session->implementationId):0) +
+      (session->implementationName?strlen(session->implementationName):0) +
+      (session->implementationVersion?strlen(session->implementationVersion)
+       :0) +
+      (session->userInformationField?
+       strlen(session->userInformationField->u.octet_aligned->buf):0) +
+      1 /* for null char */ ;
+    if ((buffer=malloc((sizeof(char *)) * needed_length))==NULL) {
+      fprintf(stderr,"Malloc failed while initialising z39.50 server\n");
+      return (NULL);
+    }
+    /* can't pass NULL to sprintf as a (char *) */
+    sprintf(buffer,"%s%s%s%s%s%s",
+	    session->implementationId?text_id:"",
+	    session->implementationId?session->implementationId:"",
+	    session->implementationName?text_name:"",
+	    session->implementationName?session->implementationName:"",
+	    session->implementationVersion?text_ver:"",
+	    session->implementationVersion?session->implementationVersion:""
+	    );
+
+    /* if version 3, also check the other-information parameter of the
+       response. (But check version is 3 first) */
+    if (session->otherInfo)
+      /**** From prt-proto.h *********** (comment added by johnmcp)
+       typedef struct Z_OtherInformationUnit
+       .   {  Z_InfoCategory *category;        / * OPTIONAL * /
+       .      int which;
+       #define Z_OtherInfo_characterInfo 0
+       #define Z_OtherInfo_binaryInfo 1
+       #define Z_OtherInfo_externallyDefinedInfo 2
+       #define Z_OtherInfo_oid 3
+       .      union
+       .        {
+       .          char *characterInfo; 
+       .          Odr_oct *binaryInfo;
+       .          Z_External *externallyDefinedInfo;
+       .          Odr_oid *oid;
+       .        } information;
+       .   } Z_OtherInformationUnit;
+       
+       typedef struct Z_OtherInformation
+       {
+       int num_elements;
+       Z_OtherInformationUnit **list;
+       } Z_OtherInformation;
+      ************/
+      for (counter=0;counter<session->otherInfo->num_elements;counter++)
+	if (session->otherInfo->list[counter]->which ==
+	    Z_OtherInfo_characterInfo)
+	  {
+	    /* add this extra string to our buffer */
+	    int where=strlen(buffer);
+	    buffer=realloc(buffer,where+
+			   strlen(session->otherInfo->list[counter]->
+				  information.characterInfo));
+	    strcpy(buffer+where,
+		   session->otherInfo->list[counter]->
+		   information.characterInfo);
+	  }
+    return (buffer);
+}
+
+static int cmd_base(char *arg)
+{
+    int i;
+    char *cp;
+
+    if (!*arg)
+    {
+        printf("Usage: base <database> <database> ...\n");
+        return 0;
+    }
+    for (i = 0; i<num_databaseNames; i++)
+        xfree (databaseNames[i]);
+    num_databaseNames = 0;
+    while (1)
+    {
+        if (!(cp = strchr(arg, ' ')))
+            cp = arg + strlen(arg);
+        if (cp - arg < 1)
+            break;
+        databaseNames[num_databaseNames] = (char *)xmalloc (1 + cp - arg);
+        memcpy (databaseNames[num_databaseNames], arg, cp - arg);
+        databaseNames[num_databaseNames++][cp - arg] = '\0';
+        if (!*cp)
+            break;
+        arg = cp+1;
+    }
+    return 1;
+}
+
+
+int z_cmd_open(char *host_and_port, char *base)
+{
+    void *add;
+    CS_TYPE t;
+
+    if (conn)
+    {
+        printf("Already connected.\n");
+
+	cs_close (conn);
+	conn = NULL;
+	if (session_mem)
+	{
+	    nmem_destroy (session_mem);
+	    session_mem = NULL;
+	}
+    }
+
+    cmd_base (base);
+    t = tcpip_type;
+    protocol = PROTO_Z3950;
+
+    if (!(conn = cs_create(t, 1, protocol)))
+    {
+        perror("cs_create");
+        return 1;
+    }
+    if (!(add = cs_straddr(conn, host_and_port)))
+    {
+	perror(host_and_port);
+	return 1;
+    }
+
+    if (cs_connect(conn, add) < 0)
+    {
+      perror("connect"); 
+      cs_close(conn);
+      conn = 0;
+      return 1;
+    }
+    /* if here, we connected OK */
+    send_initRequest();
+    return 0;
+}
+
+int cmd_authentication(char *arg)
+{
+    static Z_IdAuthentication au;
+    static char open[256];
+
+    if (!*arg)
+    {
+        printf("Auth field set to null\n");
+        auth = 0;
+        return 1;
+    }
+    auth = &au;
+    au.which = Z_IdAuthentication_open;
+    au.u.open = open;
+    strcpy(open, arg);
+    return 1;
+}
+
+/* SEARCH SERVICE ------------------------------ */
+
+static void display_variant(Z_Variant *v, int level)
+{
+    int i;
+
+    for (i = 0; i < v->num_triples; i++)
+    {
+	printf("%*sclass=%d,type=%d", level * 4, "", *v->triples[i]->zclass,
+	    *v->triples[i]->type);
+	if (v->triples[i]->which == Z_Triple_internationalString)
+	    printf(",value=%s\n", v->triples[i]->value.internationalString);
+	else
+	    printf("\n");
+    }
+}
+
+static void display_grs1(Z_GenericRecord *r, int level)
+{
+    int i;
+
+    if (!r)
+        return;
+    for (i = 0; i < r->num_elements; i++)
+    {
+        Z_TaggedElement *t;
+
+        printf("%*s", level * 4, "");
+        t = r->elements[i];
+        printf("(");
+        if (t->tagType)
+            printf("%d,", *t->tagType);
+        else
+            printf("?,");
+        if (t->tagValue->which == Z_StringOrNumeric_numeric)
+            printf("%d) ", *t->tagValue->u.numeric);
+        else
+            printf("%s) ", t->tagValue->u.string);
+        if (t->content->which == Z_ElementData_subtree)
+        {
+            printf("\n");
+            display_grs1(t->content->u.subtree, level+1);
+        }
+        else if (t->content->which == Z_ElementData_string)
+            printf("%s\n", t->content->u.string);
+        else if (t->content->which == Z_ElementData_numeric)
+	    printf("%d\n", *t->content->u.numeric);
+	else if (t->content->which == Z_ElementData_oid)
+	{
+	    int *ip = t->content->u.oid;
+	    oident *oent;
+
+	    if ((oent = oid_getentbyoid(t->content->u.oid)))
+		printf("OID: %s\n", oent->desc);
+	    else
+	    {
+		printf("{");
+		while (ip && *ip >= 0)
+		    printf(" %d", *(ip++));
+		printf(" }\n");
+	    }
+	}
+	else if (t->content->which == Z_ElementData_noDataRequested)
+	    printf("[No data requested]\n");
+	else if (t->content->which == Z_ElementData_elementEmpty)
+	    printf("[Element empty]\n");
+	else if (t->content->which == Z_ElementData_elementNotThere)
+	    printf("[Element not there]\n");
+	else
+            printf("??????\n");
+	if (t->appliedVariant)
+	    display_variant(t->appliedVariant, level+1);
+	if (t->metaData && t->metaData->supportedVariants)
+	{
+	    int c;
+
+	    printf("%*s---- variant list\n", (level+1)*4, "");
+	    for (c = 0; c < t->metaData->num_supportedVariants; c++)
+	    {
+		printf("%*svariant #%d\n", (level+1)*4, "", c);
+		display_variant(t->metaData->supportedVariants[c], level + 2);
+	    }
+	}
+    }
+}
+
+static void print_record(const unsigned char *buf, size_t len)
+{
+   size_t i;
+   for (i = 0; i<len; i++)
+       if ((buf[i] <= 126 && buf[i] >= 32) || strchr ("\n\r\t\f", buf[i]))
+           fputc (buf[i], stdout);
+       else
+           printf ("\\X%02X", buf[i]);
+   /* add newline if not already added ... */
+   if (i <= 0 || buf[i-1] != '\n')
+       fputc ('\n', stdout);
+}
+
+static void display_record(Z_DatabaseRecord *p)
+{
+    Z_External *r = (Z_External*) p;
+    oident *ent = oid_getentbyoid(r->direct_reference);
+
+    record_last = r;
+    /*
+     * Tell the user what we got.
+     */
+    if (r->direct_reference)
+    {
+        printf("Record type: ");
+        if (ent)
+            printf("%s\n", ent->desc);
+        else if (!odr_oid(print, &r->direct_reference, 0, 0))
+        {
+            odr_perror(print, "print oid");
+            odr_reset(print);
+        }
+    }
+    /* Check if this is a known, ASN.1 type tucked away in an octet string */
+    if (ent && r->which == Z_External_octet)
+    {
+	Z_ext_typeent *type = z_ext_getentbyref(ent->value);
+	void *rr;
+
+	if (type)
+	{
+	    /*
+	     * Call the given decoder to process the record.
+	     */
+	    odr_setbuf(in, (char*)p->u.octet_aligned->buf,
+		p->u.octet_aligned->len, 0);
+	    if (!(*type->fun)(in, (char **)&rr, 0, 0))
+	    {
+		odr_perror(in, "Decoding constructed record.");
+		fprintf(stderr, "[Near %d]\n", odr_offset(in));
+		fprintf(stderr, "Packet dump:\n---------\n");
+		odr_dumpBER(stderr, (char*)p->u.octet_aligned->buf,
+		    p->u.octet_aligned->len);
+		fprintf(stderr, "---------\n");
+		exit(1);
+	    }
+	    /*
+	     * Note: we throw away the original, BER-encoded record here.
+	     * Do something else with it if you want to keep it.
+	     */
+	    r->u.sutrs = (Z_SUTRS *) rr; /* we don't actually check the type here. */
+	    r->which = type->what;
+	}
+    }
+    if (ent && ent->value == VAL_SOIF)
+        print_record((const unsigned char *) r->u.octet_aligned->buf, r->u.octet_aligned->len);
+    else if (r->which == Z_External_octet && p->u.octet_aligned->len)
+    {
+      /* johnmcp - this is called for USmarc for demo server, at least */
+        const char *octet_buf = (char*)p->u.octet_aligned->buf;
+	if (ent->value == VAL_TEXT_XML || ent->value == VAL_APPLICATION_XML ||
+            ent->value == VAL_HTML)
+            print_record((const unsigned char *) octet_buf,
+                         p->u.octet_aligned->len);
+	else
+        {
+	  /* johnmcp - here marc_display does the work */
+            if (marc_display (octet_buf, NULL) <= 0)
+            {
+                printf ("ISO2709 decoding failed, dumping record as is:\n");
+                print_record((const unsigned char*) octet_buf,
+                              p->u.octet_aligned->len);
+            }
+        }
+        if (marcdump) /*here (false) */
+            fwrite (octet_buf, 1, p->u.octet_aligned->len, marcdump);
+    }
+    else if (ent && ent->value == VAL_SUTRS)
+    {
+        if (r->which != Z_External_sutrs)
+        {
+            printf("Expecting single SUTRS type for SUTRS.\n");
+            return;
+        }
+        print_record(r->u.sutrs->buf, r->u.sutrs->len);
+    }
+    else if (ent && ent->value == VAL_GRS1)
+    {
+        if (r->which != Z_External_grs1)
+        {
+            printf("Expecting single GRS type for GRS.\n");
+            return;
+        }
+        display_grs1(r->u.grs1, 0);
+    }
+    else 
+    {
+        printf("Unknown record representation.\n");
+        if (!z_External(print, &r, 0, 0))
+        {
+            odr_perror(print, "Printing external");
+            odr_reset(print);
+        }
+    }
+}
+
+
+static void display_diagrecs(Z_DiagRec **pp, int num)
+{
+    int i;
+    oident *ent;
+    Z_DefaultDiagFormat *r;
+
+    printf("Diagnostic message(s) from database:\n");
+    for (i = 0; i<num; i++)
+    {
+	Z_DiagRec *p = pp[i];
+	if (p->which != Z_DiagRec_defaultFormat)
+	{
+	    printf("Diagnostic record not in default format.\n");
+	    return;
+	}
+	else
+	    r = p->u.defaultFormat;
+	if (!(ent = oid_getentbyoid(r->diagnosticSetId)) ||
+	    ent->oclass != CLASS_DIAGSET || ent->value != VAL_BIB1)
+	    printf("Missing or unknown diagset\n");
+	printf("    [%d] %s", *r->condition, diagbib1_str(*r->condition));
+#ifdef ASN_COMPILED
+	switch (r->which)
+	{
+	case Z_DefaultDiagFormat_v2Addinfo:
+	    printf (" -- v2 addinfo '%s'\n", r->u.v2Addinfo);
+	    break;
+	case Z_DefaultDiagFormat_v3Addinfo:
+	    printf (" -- v3 addinfo '%s'\n", r->u.v3Addinfo);
+	    break;
+	}
+#else
+	if (r->addinfo && *r->addinfo)
+	    printf(" -- '%s'\n", r->addinfo);
+	else
+	    printf("\n");
+#endif
+    }
+}
+
+
+static void display_nameplusrecord(Z_NamePlusRecord *p)
+{
+    if (p->databaseName)
+        printf("[%s]", p->databaseName);
+    if (p->which == Z_NamePlusRecord_surrogateDiagnostic)
+        display_diagrecs(&p->u.surrogateDiagnostic, 1);
+    else if (p->which == Z_NamePlusRecord_databaseRecord)
+        display_record(p->u.databaseRecord);
+}
+
+static void display_records(Z_Records *p)
+{
+    int i;
+
+    if (p->which == Z_Records_NSD)
+    {
+#ifdef ASN_COMPILED
+	Z_DiagRec dr, *dr_p = &dr;
+	dr.which = Z_DiagRec_defaultFormat;
+	dr.u.defaultFormat = p->u.nonSurrogateDiagnostic;
+	display_diagrecs (&dr_p, 1);
+#else
+	display_diagrecs (&p->u.nonSurrogateDiagnostic, 1);
+#endif
+    }
+    else if (p->which == Z_Records_multipleNSD)
+	display_diagrecs (p->u.multipleNonSurDiagnostics->diagRecs,
+			  p->u.multipleNonSurDiagnostics->num_diagRecs);
+    else 
+    {
+        printf("Records: %d\n", p->u.databaseOrSurDiagnostics->num_records);
+        for (i = 0; i < p->u.databaseOrSurDiagnostics->num_records; i++)
+            display_nameplusrecord(p->u.databaseOrSurDiagnostics->records[i]);
+    }
+}
+
+
+static int send_searchRequest(char *arg)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_searchRequest);
+    Z_SearchRequest *req = apdu->u.searchRequest;
+    Z_Query query;
+    int oid[OID_SIZE];
+    char setstring[100];
+    Z_RPNQuery *RPNquery;
+    /*    Odr_oct ccl_query; */
+
+    req->referenceId = set_refid (out);
+    if (!strcmp(arg, "@big")) /* strictly for troublemaking */
+    {
+        static unsigned char big[2100];
+        static Odr_oct bigo;
+
+        /* send a very big referenceid to test transport stack etc. */
+        memset(big, 'A', 2100);
+        bigo.len = bigo.size = 2100;
+        bigo.buf = big;
+        req->referenceId = &bigo;
+    }
+    
+    if (setnumber >= 0)
+    {
+        sprintf(setstring, "%d", ++setnumber);
+        req->resultSetName = setstring;
+    }
+    *req->smallSetUpperBound = smallSetUpperBound;
+    *req->largeSetLowerBound = largeSetLowerBound;
+    *req->mediumSetPresentNumber = mediumSetPresentNumber;
+    if (smallSetUpperBound > 0 || (largeSetLowerBound > 1 &&
+        mediumSetPresentNumber > 0))
+    {
+        oident prefsyn;
+
+        prefsyn.proto = protocol;
+        prefsyn.oclass = CLASS_RECSYN;
+        prefsyn.value = recordsyntax;
+        req->preferredRecordSyntax =
+            odr_oiddup(out, oid_ent_to_oid(&prefsyn, oid));
+        req->smallSetElementSetNames =
+            req->mediumSetElementSetNames = elementSetNames;
+    }
+    req->num_databaseNames = num_databaseNames;
+    req->databaseNames = databaseNames;
+
+    req->query = &query;
+    /* johnmcp - this is where we choose our query format. either ccl or rpn */
+    /*    switch (queryType)
+	  {
+	  case QueryType_Prefix: */
+    query.which = Z_Query_type_1;
+    RPNquery = p_query_rpn (out, protocol, arg);
+    if (!RPNquery)
+      {
+	printf("Prefix query error\n");
+	return (-1);
+      }
+    query.u.type_1 = RPNquery;
+    /* break;
+       case QueryType_CCL:
+       query.which = Z_Query_type_2;
+       query.u.type_2 = &ccl_query;
+       ccl_query.buf = (unsigned char*) arg;
+       ccl_query.len = strlen(arg);
+       break;
+       default:
+       printf ("Unsupported query type\n");
+       return 0;
+       }*/
+    send_apdu(apdu);
+    setno = 1;
+    /*    printf("Sent searchRequest.\n"); */
+    return 0;
+}
+
+static int process_searchResponse(Z_SearchResponse *res)
+{
+    print_refid (res->referenceId);
+    if (!(*res->searchStatus)) {
+      /* this should return an error instead of 0 docs found... one day... */
+      return 0;
+    }
+    setno += *res->numberOfRecordsReturned;
+    if (res->records)
+        display_records(res->records);
+    return *res->resultCount;
+}
+
+static void print_level(int iLevel)
+{
+    int i;
+    for (i = 0; i < iLevel * 4; i++)
+        printf(" ");
+}
+
+static void print_int(int iLevel, const char *pTag, int *pInt)
+{
+    if (pInt != NULL)
+    {
+        print_level(iLevel);
+        printf("%s: %d\n", pTag, *pInt);
+    }
+}
+
+static void print_string(int iLevel, const char *pTag, const char *pString)
+{
+    if (pString != NULL)
+    {
+        print_level(iLevel);
+        printf("%s: %s\n", pTag, pString);
+    }
+}
+
+static void print_oid(int iLevel, const char *pTag, Odr_oid *pOid)
+{
+    if (pOid != NULL)
+    {
+        int *pInt = pOid;
+
+        print_level(iLevel);
+        printf("%s:", pTag);
+        for (; *pInt != -1; pInt++)
+            printf(" %d", *pInt);
+        printf("\n");
+    }
+}
+
+static void print_referenceId(int iLevel, Z_ReferenceId *referenceId)
+{
+    if (referenceId != NULL)
+    {
+        int i;
+
+        print_level(iLevel);
+        printf("Ref Id (%d, %d): ", referenceId->len, referenceId->size);
+        for (i = 0; i < referenceId->len; i++)
+            printf("%c", referenceId->buf[i]);
+        printf("\n");
+    }
+}
+
+static void print_string_or_numeric(int iLevel, const char *pTag, Z_StringOrNumeric *pStringNumeric)
+{
+    if (pStringNumeric != NULL)
+    {
+        switch (pStringNumeric->which)
+        {
+            case Z_StringOrNumeric_string:
+                print_string(iLevel, pTag, pStringNumeric->u.string);
+                break;
+
+            case Z_StringOrNumeric_numeric:
+                print_int(iLevel, pTag, pStringNumeric->u.numeric);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("%s: valid type for Z_StringOrNumeric\n", pTag);
+                break;
+        }
+    }
+}
+
+static void print_universe_report_duplicate(int iLevel, Z_UniverseReportDuplicate *pUniverseReportDuplicate)
+{
+    if (pUniverseReportDuplicate != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report Duplicate: \n");
+        iLevel++;
+        print_string_or_numeric(iLevel, "Hit No", pUniverseReportDuplicate->hitno);
+    }
+}
+
+static void print_universe_report_hits(int iLevel, Z_UniverseReportHits *pUniverseReportHits)
+{
+    if (pUniverseReportHits != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report Hits: \n");
+        iLevel++;
+        print_string_or_numeric(iLevel, "Database", pUniverseReportHits->database);
+        print_string_or_numeric(iLevel, "Hits", pUniverseReportHits->hits);
+    }
+}
+
+static void print_universe_report(int iLevel, Z_UniverseReport *pUniverseReport)
+{
+    if (pUniverseReport != NULL)
+    {
+        print_level(iLevel);
+        printf("Universe Report: \n");
+        iLevel++;
+        print_int(iLevel, "Total Hits", pUniverseReport->totalHits);
+        switch (pUniverseReport->which)
+        {
+            case Z_UniverseReport_databaseHits:
+                print_universe_report_hits(iLevel, pUniverseReport->u.databaseHits);
+                break;
+
+            case Z_UniverseReport_duplicate:
+                print_universe_report_duplicate(iLevel, pUniverseReport->u.duplicate);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("Type: %d\n", pUniverseReport->which);
+                break;
+        }
+    }
+}
+
+static void print_external(int iLevel, Z_External *pExternal)
+{
+    if (pExternal != NULL)
+    {
+        print_level(iLevel);
+        printf("External: \n");
+        iLevel++;
+        print_oid(iLevel, "Direct Reference", pExternal->direct_reference);
+        print_int(iLevel, "InDirect Reference", pExternal->indirect_reference);
+        print_string(iLevel, "Descriptor", pExternal->descriptor);
+        switch (pExternal->which)
+        {
+            case Z_External_universeReport:
+                print_universe_report(iLevel, pExternal->u.universeReport);
+                break;
+
+            default:
+                print_level(iLevel);
+                printf("Type: %d\n", pExternal->which);
+                break;
+        }
+    }
+}
+
+static int process_resourceControlRequest (Z_ResourceControlRequest *req)
+{
+    printf ("Received ResourceControlRequest.\n");
+    print_referenceId(1, req->referenceId);
+    print_int(1, "Suspended Flag", req->suspendedFlag);
+    print_int(1, "Partial Results Available", req->partialResultsAvailable);
+    print_int(1, "Response Required", req->responseRequired);
+    print_int(1, "Triggered Request Flag", req->triggeredRequestFlag);
+    print_external(1, req->resourceReport);
+    return 0;
+}
+
+void process_ESResponse(Z_ExtendedServicesResponse *res)
+{
+    printf("process_ESResponse status=");
+    switch (*res->operationStatus)
+    {
+    case Z_ExtendedServicesResponse_done:
+	printf ("done\n");
+	break;
+    case Z_ExtendedServicesResponse_accepted:
+	printf ("accepted\n");
+	break;
+    case Z_ExtendedServicesResponse_failure:
+	printf ("failure\n");
+	display_diagrecs(res->diagnostics, res->num_diagnostics);
+	break;
+    }
+}
+
+#ifdef ASN_COMPILED
+
+const char *get_ill_element (void *clientData, const char *element)
+{
+    if (!strcmp (element, "ill,transaction-id,transaction-group-qualifier"))
+	return "1";
+    if (!strcmp (element, "ill,transaction-id,transaction-qualifier"))
+	return "1";
+    return 0;
+}
+
+#endif
+
+
+/* PRESENT SERVICE ----------------------------- */
+static int z_send_getbriefrecords(int starting, int set, int howmany) {
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_presentRequest);
+    Z_PresentRequest *req = apdu->u.presentRequest;
+    Z_RecordComposition compo;
+    oident prefsyn;
+    int nos = 1;
+    int oid[OID_SIZE];
+    /*    char *p;*/
+    char setstring[100]; 
+
+    req->referenceId = set_refid (out);
+    nos = howmany;
+
+    setno = starting;
+    setnumber=1;
+    sprintf(setstring, "%d", setnumber);
+    req->resultSetId = setstring;
+    req->resultSetStartPoint = &setno;
+    req->numberOfRecordsRequested = &nos;
+    prefsyn.proto = protocol;
+    prefsyn.oclass = CLASS_RECSYN;
+    prefsyn.value = recordsyntax;
+    req->preferredRecordSyntax =
+	odr_oiddup (out, oid_ent_to_oid(&prefsyn, oid));
+
+    if (schema != VAL_NONE)
+    {
+        oident prefschema;
+
+        prefschema.proto = protocol;
+        prefschema.oclass = CLASS_SCHEMA;
+        prefschema.value = schema;
+
+	req->recordComposition = &compo;
+	compo.which = Z_RecordComp_complex;
+	compo.u.complex = (Z_CompSpec *)
+	    odr_malloc(out, sizeof(*compo.u.complex));
+	compo.u.complex->selectAlternativeSyntax = (bool_t *) 
+	    odr_malloc(out, sizeof(bool_t));
+	*compo.u.complex->selectAlternativeSyntax = 0;
+
+	compo.u.complex->generic = (Z_Specification *)
+	    odr_malloc(out, sizeof(*compo.u.complex->generic));
+	compo.u.complex->generic->schema = (Odr_oid *)
+	    odr_oiddup(out, oid_ent_to_oid(&prefschema, oid));
+	if (!compo.u.complex->generic->schema)
+	{
+	    /* OID wasn't a schema! Try record syntax instead. */
+	    prefschema.oclass = CLASS_RECSYN;
+	    compo.u.complex->generic->schema = (Odr_oid *)
+		odr_oiddup(out, oid_ent_to_oid(&prefschema, oid));
+	}
+	if (!elementSetNames)
+	    compo.u.complex->generic->elementSpec = 0;
+	else
+	{
+	    compo.u.complex->generic->elementSpec = (Z_ElementSpec *)
+		odr_malloc(out, sizeof(Z_ElementSpec));
+	    compo.u.complex->generic->elementSpec->which =
+		Z_ElementSpec_elementSetName;
+	    compo.u.complex->generic->elementSpec->u.elementSetName =
+		elementSetNames->u.generic;
+	}
+	compo.u.complex->num_dbSpecific = 0;
+	compo.u.complex->dbSpecific = 0;
+	compo.u.complex->num_recordSyntax = 0;
+	compo.u.complex->recordSyntax = 0;
+    }
+    else if (elementSetNames)
+    {
+        req->recordComposition = &compo;
+        compo.which = Z_RecordComp_simple;
+        compo.u.simple = elementSetNames;
+    }
+    send_apdu(apdu);
+    return 0;
+}
+
+void process_close(Z_Close *req)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_close);
+    Z_Close *res = apdu->u.close;
+
+    static char *reasons[] =
+    {
+        "finished",
+        "shutdown",
+        "system problem",
+        "cost limit reached",
+        "resources",
+        "security violation",
+        "protocolError",
+        "lack of activity",
+        "peer abort",
+        "unspecified"
+    };
+
+    printf("Reason: %s, message: %s\n", reasons[*req->closeReason],
+        req->diagnosticInformation ? req->diagnosticInformation : "NULL");
+    if (sent_close)
+    {
+	cs_close (conn);
+	conn = NULL;
+	if (session_mem)
+	{
+	    nmem_destroy (session_mem);
+	    session_mem = NULL;
+	}
+	sent_close = 0;
+    }
+    else
+    {
+	*res->closeReason = Z_Close_finished;
+	send_apdu(apdu);
+	printf("Sent response.\n");
+	sent_close = 1;
+    }
+}
+
+
+
+int cmd_quit(char *arg)
+{
+    printf("See you later, alligator.\n");
+    exit(0);
+    return 0;
+}
+
+int cmd_cancel(char *arg)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_triggerResourceControlRequest);
+    Z_TriggerResourceControlRequest *req =
+        apdu->u.triggerResourceControlRequest;
+    bool_t rfalse = 0;
+    
+    if (!conn)
+    {
+        printf("Session not initialized yet\n");
+        return 0;
+    }
+    if (!ODR_MASK_GET(session->options, Z_Options_triggerResourceCtrl))
+    {
+        printf("Target doesn't support cancel (trigger resource ctrl)\n");
+        return 0;
+    }
+    *req->requestedAction = Z_TriggerResourceCtrl_cancel;
+    req->resultSetWanted = &rfalse;
+
+    send_apdu(apdu);
+    printf("Sent cancel request\n");
+    return 2;
+}
+
+int send_scanrequest(char *string, int pp, int num)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_scanRequest);
+    Z_ScanRequest *req = apdu->u.scanRequest;
+    
+    if (!(req->termListAndStartPoint =
+	  p_query_scan(out, protocol, &req->attributeSet, string)))
+    {
+	printf("Prefix query error\n");
+	return -1;
+    }
+    req->referenceId = set_refid (out);
+    req->num_databaseNames = num_databaseNames;
+    req->databaseNames = databaseNames;
+    req->numberOfTermsRequested = &num;
+    req->preferredPositionInResponse = &pp;
+    send_apdu(apdu);
+    return 2;
+}
+
+int send_sortrequest(char *arg, int newset)
+{
+    Z_APDU *apdu = zget_APDU(out, Z_APDU_sortRequest);
+    Z_SortRequest *req = apdu->u.sortRequest;
+    Z_SortKeySpecList *sksl = (Z_SortKeySpecList *)
+        odr_malloc (out, sizeof(*sksl));
+    char setstring[32];
+    char sort_string[32], sort_flags[32];
+    int off;
+    int oid[OID_SIZE];
+    oident bib1;
+
+    if (setnumber >= 0)
+	sprintf (setstring, "%d", setnumber);
+    else
+	sprintf (setstring, "default");
+
+    req->referenceId = set_refid (out);
+
+#ifdef ASN_COMPILED
+    req->num_inputResultSetNames = 1;
+    req->inputResultSetNames = (Z_InternationalString **)
+	odr_malloc (out, sizeof(*req->inputResultSetNames));
+    req->inputResultSetNames[0] = odr_strdup (out, setstring);
+#else
+    req->inputResultSetNames =
+	(Z_StringList *)odr_malloc (out, sizeof(*req->inputResultSetNames));
+    req->inputResultSetNames->num_strings = 1;
+    req->inputResultSetNames->strings =
+	(char **)odr_malloc (out, sizeof(*req->inputResultSetNames->strings));
+    req->inputResultSetNames->strings[0] =
+	odr_strdup (out, setstring);
+#endif
+
+    if (newset && setnumber >= 0)
+	sprintf (setstring, "%d", ++setnumber);
+
+    req->sortedResultSetName = odr_strdup (out, setstring);
+
+    req->sortSequence = sksl;
+    sksl->num_specs = 0;
+    sksl->specs = (Z_SortKeySpec **)odr_malloc (out, sizeof(sksl->specs) * 20);
+    
+    bib1.proto = protocol;
+    bib1.oclass = CLASS_ATTSET;
+    bib1.value = VAL_BIB1;
+    while ((sscanf (arg, "%31s %31s%n", sort_string, sort_flags, &off)) == 2 
+           && off > 1)
+    {
+	int i;
+	char *sort_string_sep;
+	Z_SortKeySpec *sks = (Z_SortKeySpec *)odr_malloc (out, sizeof(*sks));
+	Z_SortKey *sk = (Z_SortKey *)odr_malloc (out, sizeof(*sk));
+
+	arg += off;
+	sksl->specs[sksl->num_specs++] = sks;
+	sks->sortElement = (Z_SortElement *)odr_malloc (out, sizeof(*sks->sortElement));
+	sks->sortElement->which = Z_SortElement_generic;
+	sks->sortElement->u.generic = sk;
+	
+	if ((sort_string_sep = strchr (sort_string, '=')))
+	{
+	    Z_AttributeElement *el = (Z_AttributeElement *)odr_malloc (out, sizeof(*el));
+	    sk->which = Z_SortKey_sortAttributes;
+	    sk->u.sortAttributes =
+		(Z_SortAttributes *)odr_malloc (out, sizeof(*sk->u.sortAttributes));
+	    sk->u.sortAttributes->id = oid_ent_to_oid(&bib1, oid);
+	    sk->u.sortAttributes->list =
+		(Z_AttributeList *)odr_malloc (out, sizeof(*sk->u.sortAttributes->list));
+	    sk->u.sortAttributes->list->num_attributes = 1;
+	    sk->u.sortAttributes->list->attributes =
+		(Z_AttributeElement **)odr_malloc (out,
+			    sizeof(*sk->u.sortAttributes->list->attributes));
+	    sk->u.sortAttributes->list->attributes[0] = el;
+	    el->attributeSet = 0;
+	    el->attributeType = (int *)odr_malloc (out, sizeof(*el->attributeType));
+	    *el->attributeType = atoi (sort_string);
+	    el->which = Z_AttributeValue_numeric;
+	    el->value.numeric = (int *)odr_malloc (out, sizeof(*el->value.numeric));
+	    *el->value.numeric = atoi (sort_string_sep + 1);
+	}
+	else
+	{
+	    sk->which = Z_SortKey_sortField;
+	    sk->u.sortField = odr_strdup (out, sort_string);
+	}
+	sks->sortRelation = (int *)odr_malloc (out, sizeof(*sks->sortRelation));
+	*sks->sortRelation = Z_SortRelation_ascending;
+	sks->caseSensitivity = (int *)odr_malloc (out, sizeof(*sks->caseSensitivity));
+	*sks->caseSensitivity = Z_SortCase_caseSensitive;
+
+#ifdef ASN_COMPILED
+	sks->which = Z_SortKeySpec_null;
+	sks->u.null = odr_nullval ();
+#else
+	sks->missingValueAction = NULL;
+#endif
+
+	for (i = 0; sort_flags[i]; i++)
+	{
+	    switch (sort_flags[i])
+	    {
+	    case 'a':
+	    case 'A':
+	    case '>':
+		*sks->sortRelation = Z_SortRelation_descending;
+		break;
+	    case 'd':
+	    case 'D':
+	    case '<':
+		*sks->sortRelation = Z_SortRelation_ascending;
+		break;
+	    case 'i':
+	    case 'I':
+		*sks->caseSensitivity = Z_SortCase_caseInsensitive;
+		break;
+	    case 'S':
+	    case 's':
+		*sks->caseSensitivity = Z_SortCase_caseSensitive;
+		break;
+	    }
+	}
+    }
+    if (!sksl->num_specs)
+    {
+        printf ("Missing sort specifications\n");
+	return -1;
+    }
+    send_apdu(apdu);
+    return 2;
+}
+
+void display_term(Z_TermInfo *t)
+{
+    if (t->term->which == Z_Term_general)
+    {
+        printf("%.*s (%d)\n", t->term->u.general->len, t->term->u.general->buf,
+            t->globalOccurrences ? *t->globalOccurrences : -1);
+        sprintf(last_scan, "%.*s", t->term->u.general->len,
+            t->term->u.general->buf);
+    }
+    else
+        printf("Term type not general.\n");
+}
+
+void process_scanResponse(Z_ScanResponse *res)
+{
+    int i;
+    Z_Entry **entries = NULL;
+    int num_entries = 0;
+   
+    printf("Received ScanResponse\n"); 
+    print_refid (res->referenceId);
+    printf("%d entries", *res->numberOfEntriesReturned);
+    if (res->positionOfTerm)
+	printf (", position=%d", *res->positionOfTerm); 
+    printf ("\n");
+    if (*res->scanStatus != Z_Scan_success)
+        printf("Scan returned code %d\n", *res->scanStatus);
+    if (!res->entries)
+        return;
+    if ((entries = res->entries->entries))
+	num_entries = res->entries->num_entries;
+    for (i = 0; i < num_entries; i++)
+    {
+        int pos_term = res->positionOfTerm ? *res->positionOfTerm : -1;
+	if (entries[i]->which == Z_Entry_termInfo)
+	{
+	    printf("%c ", i + 1 == pos_term ? '*' : ' ');
+	    display_term(entries[i]->u.termInfo);
+	}
+	else
+	    display_diagrecs(&entries[i]->u.surrogateDiagnostic, 1);
+    }
+    if (res->entries->nonsurrogateDiagnostics)
+	display_diagrecs (res->entries->nonsurrogateDiagnostics,
+			  res->entries->num_nonsurrogateDiagnostics);
+}
+
+void process_sortResponse(Z_SortResponse *res)
+{
+    printf("Received SortResponse: status=");
+    switch (*res->sortStatus)
+    {
+    case Z_SortStatus_success:
+	printf ("success"); break;
+    case Z_SortStatus_partial_1:
+	printf ("partial"); break;
+    case Z_SortStatus_failure:
+	printf ("failure"); break;
+    default:
+	printf ("unknown (%d)", *res->sortStatus);
+    }
+    printf ("\n");
+    print_refid (res->referenceId);
+#ifdef ASN_COMPILED
+    if (res->diagnostics)
+        display_diagrecs(res->diagnostics,
+			 res->num_diagnostics);
+#else
+    if (res->diagnostics)
+        display_diagrecs(res->diagnostics->diagRecs,
+			 res->diagnostics->num_diagRecs);
+#endif
+}
+
+void process_deleteResultSetResponse (Z_DeleteResultSetResponse *res)
+{
+    printf("Got deleteResultSetResponse status=%d\n",
+	   *res->deleteOperationStatus);
+    if (res->deleteListStatuses)
+    {
+	int i;
+	for (i = 0; i < res->deleteListStatuses->num; i++)
+	{
+	    printf ("%s status=%d\n", res->deleteListStatuses->elements[i]->id,
+		    *res->deleteListStatuses->elements[i]->status);
+	}
+    }
+}
+
+int cmd_sort_generic(char *arg, int newset)
+{
+    if (!conn)
+    {
+        printf("Session not initialized yet\n");
+        return 0;
+    }
+    if (!ODR_MASK_GET(session->options, Z_Options_sort))
+    {
+        printf("Target doesn't support sort\n");
+        return 0;
+    }
+    if (*arg)
+    {
+        if (send_sortrequest(arg, newset) < 0)
+            return 0;
+	return 2;
+    }
+    return 0;
+}
+
+int cmd_sort(char *arg)
+{
+    return cmd_sort_generic (arg, 0);
+}
+
+int cmd_sort_newset (char *arg)
+{
+    return cmd_sort_generic (arg, 1);
+}
+
+int cmd_scan(char *arg)
+{
+    if (!conn)
+    {
+        printf("Session not initialized yet\n");
+        return 0;
+    }
+    if (!ODR_MASK_GET(session->options, Z_Options_scan))
+    {
+        printf("Target doesn't support scan\n");
+        return 0;
+    }
+    if (*arg)
+    {
+        if (send_scanrequest(arg, 1, 20) < 0)
+            return 0;
+    }
+    else
+        if (send_scanrequest(last_scan, 1, 20) < 0)
+            return 0;
+    return 2;
+}
+
+int cmd_schema(char *arg)
+{
+    if (!arg || !*arg)
+    {
+	schema = VAL_NONE;
+        return 1;
+    }
+    schema = oid_getvalbyname (arg);
+    if (schema == VAL_NONE)
+    {
+        printf ("unknown schema\n");
+        return 0;
+    }
+    return 1;
+}
+
+int cmd_format(char *arg)
+{
+    if (!arg || !*arg)
+    {
+        printf("Usage: format <recordsyntax>\n");
+        return 0;
+    }
+    recordsyntax = oid_getvalbyname (arg);
+    if (recordsyntax == VAL_NONE)
+    {
+        printf ("unknown record syntax\n");
+        return 0;
+    }
+    return 1;
+}
+
+int cmd_elements(char *arg)
+{
+    static Z_ElementSetNames esn;
+    static char what[100];
+
+    if (!arg || !*arg)
+    {
+	elementSetNames = 0;
+        return 1;
+    }
+    strcpy(what, arg);
+    esn.which = Z_ElementSetNames_generic;
+    esn.u.generic = what;
+    elementSetNames = &esn;
+    return 1;
+}
+
+int cmd_attributeset(char *arg)
+{
+    char what[100];
+
+    if (!arg || !*arg)
+    {
+	printf("Usage: attributeset <setname>\n");
+	return 0;
+    }
+    sscanf(arg, "%s", what);
+    if (p_query_attset (what))
+    {
+	printf("Unknown attribute set name\n");
+	return 0;
+    }
+    return 1;
+}
+
+int cmd_querytype (char *arg)
+{
+    if (!strcmp (arg, "ccl"))
+        queryType = QueryType_CCL;
+    else if (!strcmp (arg, "prefix") || !strcmp(arg, "rpn"))
+        queryType = QueryType_Prefix;
+    else
+    {
+        printf ("Querytype must be one of:\n");
+        printf (" prefix         - Prefix query\n");
+        printf (" ccl            - CCL query\n");
+        return 0;
+    }
+    return 1;
+}
+
+int cmd_refid (char *arg)
+{
+    xfree (refid);
+    refid = NULL;
+    if (*arg)
+    {
+	refid = (char *) xmalloc (strlen(arg)+1);
+	strcpy (refid, arg);
+    }
+    return 1;
+}
+
+int z_cmd_close(char *arg)
+{
+    Z_APDU *apdu;
+    Z_Close *req;
+    if (!conn)
+	return 1;
+
+    apdu = zget_APDU(out, Z_APDU_close);
+    req = apdu->u.close;
+    *req->closeReason = Z_Close_finished;
+    send_apdu(apdu);
+    sent_close = 1;
+    return 0;
+}
+
+void z_initialize(void)
+{
+    nmem_init();
+    if (!(out = odr_createmem(ODR_ENCODE)) ||
+        !(in = odr_createmem(ODR_DECODE)) ||
+        !(print = odr_createmem(ODR_PRINT)))
+    {
+        fprintf(stderr, "failed to allocate ODR streams\n");
+        exit(1);
+    }
+    setvbuf(stdout, 0, _IONBF, 0);
+    if (apdu_file)
+        odr_setprint(print, apdu_file);
+
+    cmd_base("Default");
+}
+
+static int z_getAPDU (Z_APDU **ret_apdu) {
+  int res;
+
+    char *netbuffer= 0;
+    int netbufferlen = 0;
+    Z_APDU *apdu;
+    
+    if ((res = cs_get(conn, &netbuffer, &netbufferlen)) < 0) {
+      perror("cs_get");
+      exit(1);
+    }
+    if (!res) {
+      printf("Target closed connection.\n");
+      exit(1);
+    }
+    odr_reset(in); /* release APDU from last round */
+    record_last = 0;
+    odr_setbuf(in, netbuffer, res, 0);
+    /* johnmcp */
+    if (!z_APDU(in, &apdu, 0, 0))
+      {
+	odr_perror(in, "Decoding incoming APDU");
+	fprintf(stderr, "[Near %d]\n", odr_offset(in));
+	fprintf(stderr, "Packet dump:\n---------\n");
+	odr_dumpBER(stderr, netbuffer, res);
+	fprintf(stderr, "---------\n");
+	if (apdu_file)
+	  z_APDU(print, &apdu, 0, 0);
+	exit(1);
+      }
+    if (apdu_file && !z_APDU(print, &apdu, 0, 0))
+      {
+	odr_perror(print, "Failed to print incoming APDU");
+	odr_reset(print);
+	return -1; /* was continue */
+      }
+    (*ret_apdu)=apdu;
+    return 0;
+}
+
+
+/* returns number found, arg is query string */
+int z_cmd_dosearch(char *arg)
+{
+  Z_APDU *apdu;
+  int matching;
+  int ret_val;
+  ret_val=send_searchRequest(arg);
+  if (ret_val==-1) {
+    /* prefix query error */
+    return (-1);
+  }
+  z_getAPDU(&apdu);
+  /* check return value??? */
+  if (apdu->which != Z_APDU_searchResponse)
+    {
+      printf("sendsearchRequest() was not replied with a searchResponse!\n");
+      return (-2);
+    }
+  /* let's keep going anyway... */
+  matching=process_searchResponse(apdu->u.searchResponse);
+  /* this assumes we want to take action on failure (-1) here rather than
+     whereever we were called from */
+  return (matching);
+}
+
+/* src must be NULL-terminated */
+static char *safeappendstr(char *dest, size_t *allocsize, 
+			  size_t *offset, char *src) {
+  /* allocsize is the amount of space currently allocated to dest,
+     offset is how far into dest we want to append src */
+  if (*offset + strlen(src) >= *allocsize) {
+    *allocsize+=strlen(src)+64; /* add some extra space to save on reallocs */
+    if ((dest=realloc(dest,*allocsize))==NULL) {
+      fprintf(stderr, "malloc failed while decoding marc record.\n");
+      return (NULL);
+    }
+  }
+  strcpy(dest+(*offset), src);
+  *offset+=strlen(src);
+  return (dest);
+}
+
+static char *getmarcfields(Z_DatabaseRecord *p, int titleonly) {
+  /* this code is based on marc_display(), with a couple of lines taken from
+     display_record() in the original client. */
+  /* if titleonly is non-zero, we only get a (the?) title field, otherwise
+     return the whole thing */
+  const char *buf=(char *)p->u.octet_aligned->buf;
+  char *title;      /* our string to return */
+  int title_maxlen=0; /* amount of space currently allocated */
+  int title_curlen=0;    /* amount of space actually used */
+  int entry_p;
+  int record_length;
+  int indicator_length;
+  int identifier_length;
+  int base_address;
+  int length_data_entry;
+  int length_starting;
+  int length_implementation;
+  FILE *outf;
+
+  /*  if (!outf) */
+  outf = stdout;
+
+  /* initialise our title. Start with 64 chars */
+  title_maxlen=64;
+  if((title=malloc(title_maxlen))==NULL) {
+    /* not quite sure where stderr will be going, but.... */
+    fprintf(stderr,"Malloc failed while decoding marc record\n");
+    return NULL;
+  }
+
+  if (!titleonly) {
+    strcpy(title,"<table border=1>\n");
+    title_curlen=strlen(title);
+  }
+  else  title_curlen=0;
+
+  record_length = atoi_n (buf, 5);
+  if (record_length < 25)
+    return (NULL); /* -1 */
+  if (isdigit(buf[10]))
+    indicator_length = atoi_n (buf+10, 1);
+  else
+    indicator_length = 2;
+  if (isdigit(buf[11]))
+    identifier_length = atoi_n (buf+11, 1);
+  else
+    identifier_length = 2;
+  base_address = atoi_n (buf+12, 4);
+  
+  length_data_entry = atoi_n (buf+20, 1);
+  length_starting = atoi_n (buf+21, 1);
+  length_implementation = atoi_n (buf+22, 1);
+  
+  if (0) /* debug */
+    {
+      fprintf (outf, "Record length         %5d\n", record_length);
+      fprintf (outf, "Indicator length      %5d\n", indicator_length);
+      fprintf (outf, "Identifier length     %5d\n", identifier_length);
+      fprintf (outf, "Base address          %5d\n", base_address);
+      fprintf (outf, "Length data entry     %5d\n", length_data_entry);
+      fprintf (outf, "Length starting       %5d\n", length_starting);
+      fprintf (outf, "Length implementation %5d\n", length_implementation);
+    }
+  for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+    {
+      entry_p += 3+length_data_entry+length_starting;
+      if (entry_p >= record_length)
+	return (NULL); /* -1 */
+    }
+  base_address = entry_p+1;
+  for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+    {
+      int data_length;
+      int data_offset;
+      int end_offset;
+      int i /*, j*/ ;
+      int startofstring;
+      int whichtag;
+      short int abbrtitle=0;
+      char tag[4];
+      memcpy (tag, buf+entry_p, 3);
+      entry_p += 3;
+      tag[3] = '\0';
+      whichtag=atoi(tag);
+      if (0) /* debug */
+	fprintf (outf, "Tag: ");
+      /* johnmcp 
+	 Relevant tags (for "main entry") - assume only one of these is set,
+	 as we will only return the first one found.
+	 100=personal name
+	 110=corporate name
+	 111=meeting name
+	 130=uniform title
+	 subfields: $a=personal name, $c=title/other, $d=date
+
+	 210=Abbreviated Title
+	 222=Key title
+	 240=uniform title
+	 243=collective uniform title
+	 245=title statement
+	 246=varying form of title
+	 247=former title or title variations
+	 subfields: $a=abbrev. title $b=qualifying info $2=source
+	 .          $6=linkage $8=link field and sequence number.
+      */
+      /*fprintf (outf, "%s ", tag); */
+      data_length = atoi_n (buf+entry_p, length_data_entry);
+      entry_p += length_data_entry;
+      data_offset = atoi_n (buf+entry_p, length_starting);
+      entry_p += length_starting;
+      i = data_offset + base_address;
+      end_offset = i+data_length-1;
+
+      if (0) /* debug */
+	fprintf (outf, " Ind: ");
+
+      /* memcmp (tag,"00",2) is true, then we DON'T have a control tag
+	 ie less than 10. */
+      /*if (memcmp (tag, "00", 2) && indicator_length)
+	{
+	for (j = 0; j<indicator_length; j++)
+	fprintf (outf, "%c", buf[i++]);
+	}
+      */
+      if (whichtag>=10) i+=indicator_length;
+      /* the control fields (<10) don't have leading chars. */
+
+
+      if (0) /* debug */
+	fprintf (outf, " Fields: ");
+
+      /* If we only want the title, then skip other fields */
+      if (titleonly &&(whichtag<200||whichtag>249)) {
+	/* skip this record */
+	continue;
+	i=end_offset;
+      }
+      
+      /* either titleonly is 0, or titleonly is 1 and whichtag is between
+	 200 and 249... */
+      if (!titleonly) {
+	/* This should probably be read in from a separate file.
+	   This is also hard-coded for USMARC/MARC21 fieldnames!!! */
+
+	/* print out what kind of tag this is */
+	char *tagname;
+	char *field_control1="<tr><td>Marc Control Number:</td><td>";
+	char *field_control3="<tr><td>Marc Organisation Code:</td><td>";
+	char *field_control5="<tr><td>Marc record Date Info.:</td><td>";
+	char *field_control8="<tr><td>Control Field (Marc info):</td><td>";
+	char *field_loc_nr="<tr><td>Lib. of Congress control #:</td><td>";
+	char *field_issn="<tr><td>ISSN Number:</td><td>";
+	char *field_catalog="<tr><td>Catalog agency:</td><td>";
+	char *field_lang="<tr><td>3-letter language code(s):</td><td>";
+	char *field_areacode="<tr><td>Geographic Area code:</td><td>";
+	char *field_cn_loc="<tr><td>Lib. of Congress Call #:</td><td>";
+	char *field_cn_dewdec="<tr><td>Dewey Decimal Call #:</td><td>";
+	char *field_cn_other="<tr><td>Other Classification Info.:</td><td>";
+	char *field_cn_gd="<tr><td>Govt. Document Call #:</td><td>";
+	char *field_personalname="<tr><td>Personal Name:</td><td>";
+	char *field_meetingname="<tr><td>Meeting Name:</td><td>";
+	char *field_maintitle="<tr><td>Title:</td><td>";
+	char *field_edition="<tr><td><Edition Information:</td><td>";
+	char *field_publication="<tr><td>Publication Info.:</td><td>";
+	char *field_physdesc="<tr><td>Physical Description:</td><td>";
+	char *field_series_title="<tr><td>Series Title:</td><td>";
+	char *field_series_statement="<tr><td>Series Statement:</td><td>";
+	char *field_note_general="<tr><td>Note:</td><td>";
+	char *field_note_bib="<tr><td>Bibliographic Note:</td><td>";
+	char *field_note_summary="<tr><td>Summary Note:</td><td>";
+	char *field_sub_note="<tr><td>Subject Notes:</td><td>";
+	char *field_sub_topic="<tr><td>Subject - Topic:</td><td>";
+	char *field_sub_geog="<tr><td>Subject - Location:</td><td>";
+	char *field_added_persname="<tr><td>Author Note - Name:</td><td>";
+	char *field_added_corpname="<tr><td>Author - Organisation:</td><td>";
+	char *field_uniform_title="<tr><td>Extra Title Information:</td><td>";
+	char *field_host_item="<tr><td>In:</td><td>";
+	char *field_series_corpname="<tr><td>Series - Organisation:</td><td>";
+	/*char *field_url="<tr><td>Electronic Access</td><td><a href=\"";*/
+	char *field_url="<tr><td>Electronic Access</td><td>";
+	/*char *field_other="<tr><td>(other field):</td><td>";*/
+	char tag_num[100];
+	switch (whichtag) {
+	case (1): {tagname=field_control1;break;}
+	case (3): {tagname=field_control3;break;}
+	case (5): {tagname=field_control5;break;}
+	case (8): {tagname=field_control8;break;}
+	case (10): {tagname=field_loc_nr;break;}
+	case (20): {tagname=field_issn;break;}
+	case (40): {tagname=field_catalog;break;}
+	case (41): {tagname=field_lang;break;}
+	case (43): {tagname=field_areacode;break;}
+	case (50): {tagname=field_cn_loc;break;}
+	case (82): {tagname=field_cn_dewdec;break;}
+	case (84): {tagname=field_cn_other;break;}
+	case (86): {tagname=field_cn_gd;break;}
+	case (100): {tagname=field_personalname;break;}
+	case (111): {tagname=field_meetingname;break;}
+	case (245): {tagname=field_maintitle;break;}
+	case (250): {tagname=field_edition;break;}
+	case (260): {tagname=field_publication;break;}
+	case (300): {tagname=field_physdesc;break;}
+	case (440): {tagname=field_series_title;break;}
+	case (490): {tagname=field_series_statement;break;}
+	case (500): {tagname=field_note_general;break;}
+	case (504): {tagname=field_note_bib;break;}
+	case (520): {tagname=field_note_summary;break;}
+	case (630): {tagname=field_sub_note;break;}
+	case (650): {tagname=field_sub_topic;break;}
+	case (651): {tagname=field_sub_geog;break;}
+	case (700): {tagname=field_added_persname;break;}
+	case (710): {tagname=field_added_corpname;break;}
+	case (730): {tagname=field_uniform_title;break;}
+	case (773): {tagname=field_host_item;break;}
+	case (810): {tagname=field_series_corpname;break;}
+	case (856): {tagname=field_url;break;}
+	default: 
+	  if (whichtag>=90&&whichtag<=99)
+	    tagname="<tr><td>Local Call #:</td><td>";
+	  else {
+	    /*tagname=field_other;*/
+	    
+	    /* The trailing '\0' seems to be necessary...?!? */
+	    sprintf(tag_num,"<tr><td>(field %d)</td><td>\n\0",whichtag);
+	    tagname=tag_num;
+	  }
+	}
+
+	/* add the field type */
+	title=safeappendstr(title, &title_maxlen, &title_curlen, tagname);
+      }
+
+      /* go through current field in current record */
+      while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
+	{
+	  /* this loop goes through byte by byte, to find end-of-field or
+	     end-of-record separator tags */
+
+	  /*	  if (memcmp (tag, "00", 2) && identifier_length)*/
+	  if ( ((titleonly==1&&whichtag==245)||(titleonly==0))
+	       && identifier_length)
+	    {
+	      if (buf[i]==ISO2709_IDFS) {
+		/*  this implies sub-fields for this field */
+		/* skip sub-field tag, but wrap $a sub-field with <b> & </b> 
+		   for HTML if titleonly==1 */
+		if (buf[i+1]=='a' && titleonly) {
+		  abbrtitle=1;
+		  title=safeappendstr(title,&title_maxlen,&title_curlen,"<b>");
+		}
+		i+=identifier_length; 
+	      }
+	      /* find end of this (sub-)field */
+	      startofstring=i;
+	      while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS &&
+		     buf[i] != ISO2709_FS && i < end_offset)
+		i++;
+		/*fprintf (outf, "%c", buf[i++]);*/
+
+	      /* this only happens the first time around */
+	      if (i==startofstring) continue;
+
+	      /* now put from $startofstring$ until $i$ into our 
+		 string to return */
+
+	      if (title_curlen+(i-startofstring)>=title_maxlen) {
+		/* we need to make more room - add max(64,needed) bytes */
+		if (title_curlen+(i-startofstring)-title_maxlen>63)
+		  title_maxlen+=(i-startofstring)+1;/*+1 for trailing \0 */
+		else
+		  title_maxlen+=64;
+		if ((title=realloc(title,title_maxlen))==NULL) {
+		  fprintf(stderr,"malloc failed decoding marc record\n");
+		  return (NULL);
+		}
+	      }
+
+	      strncpy(title+title_curlen,buf+startofstring,i-startofstring);
+	      title_curlen+=(i-startofstring);
+	      *(title+title_curlen)='\0';
+	      /* overwrite ISO2709_?S with \0 */
+	      /* *(title+title_curlen+i-startofstring)='\0';*/
+	      /*safeappendstr(title,&title_maxlen,
+		&title_curlen,buf+startofstring);*/
+
+	      /* if 'main' title, close HTML </B> tag */
+	      if (abbrtitle) {
+		title=safeappendstr(title,&title_maxlen,&title_curlen,"</b>");
+		abbrtitle=0;
+	      } 
+	      /* end of this marc sub--field                 
+		 buf[i]==ISO2709_RS if end of  record.
+		 buf[i]==ISO2709_FS if end of  field,
+		 buf[i]==ISO2709_IDFS if end of sub-field. */
+	      if (titleonly==0) {
+		if (buf[i]==ISO2709_IDFS) {
+		  /* there is a following sub-field, so only add whitespace */
+		  title=safeappendstr(title,&title_maxlen,&title_curlen," ");
+		}
+		else {
+		  /* end of record, so close HTML table row */
+#if 0
+		  if (whichtag==856) /* special case: this is a url! */
+		    title=safeappendstr(title,&title_maxlen,&title_curlen,
+					"\">Uniform Resource Locator</a>");
+#endif
+		  title=safeappendstr(title, &title_maxlen, &title_curlen,
+				      "</td></tr>\n");
+		}
+	      }  /* end of  if (titleonly==0)                */
+	    }    /* end of  if ( ((titleonly==1&&.......     */
+	  else { /* whichtag not matched  (if titleonly)     */
+	    /*fprintf (outf, "%c", buf[i++]);*/
+	    /* skip this char for now - should ideally skip whole field */
+	    i++;
+	  }
+	} /* end of while loop - at end of field or record */
+      /*fprintf (outf, "\n");*/
+      /*if (i < end_offset)
+	fprintf (outf, "-- separator but not at end of field\n");
+	if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS)
+	fprintf (outf, "-- no separator at end of field\n");
+      */
+    }
+
+  /* at end of whole record. */
+  if (!titleonly) 
+    title=safeappendstr(title, &title_maxlen, &title_curlen, "</table>\n");
+  return (title);
+
+}
+static char *getrecordtitle(Z_DatabaseRecord *record) {
+  return(getmarcfields(record,1));
+}
+
+char *z_getfullRecord(int start) {
+  Z_APDU *apdu;
+  Z_DatabaseRecord *record;
+  char *fullrecord;
+
+  fullrecord=NULL;
+  z_send_getbriefrecords(start,1,1); /* for now, use getbriefrecords */
+  z_getAPDU(&apdu);
+  
+  if (apdu->which != Z_APDU_presentResponse) {
+    /* out-of-order packets.... */
+    fprintf(stderr,"Not a present response to present request\n");
+    return NULL;
+  }
+  
+  /* just do some double checking */
+  if (*apdu->u.presentResponse->numberOfRecordsReturned!=1 ||
+      !apdu->u.presentResponse->records ) {
+    /* something bad has happened... johnmcp */
+    fprintf (stderr,"Error occured in yaz while getting record (GSDL)\n");
+  }
+
+  switch (apdu->u.presentResponse->records->which) {
+  case Z_Records_DBOSD: break; /* do nothing - this is a record */
+
+    /* otherwise we got a diagnostic message... */
+  case Z_Records_NSD:
+    switch (apdu->u.presentResponse->records->u.nonSurrogateDiagnostic->which){
+      /* these are both represented as char* in yaz, so either is OK */
+      /*    case Z_DefaultDiagForm_v2Addinfo:
+	    case Z_DefaultDiagForm_v3Addinfo: --wrong names*/
+    case Z_DiagnosticFormat_s_defaultDiagRec:
+    case Z_DiagnosticFormat_s_explicitDiagnostic:
+      return apdu->u.presentResponse->records->u.nonSurrogateDiagnostic
+	->u.v2Addinfo; /* return the error message */
+    default: ; /* this should happen for v3 of the spec... */
+    }
+  case Z_Records_multipleNSD: ; /* should handle one day... */
+  }
+
+  record=apdu->u.presentResponse->records->u.databaseOrSurDiagnostics->
+    records[0]->u.databaseRecord;
+
+  return(getmarcfields(record,0));
+}
+
+char **z_getrecordTitles(/*int resultset,*/ int starting, int howmany) {
+  Z_APDU *apdu;
+  char **titles;
+  /* titles will be an array of strings. The first element will really
+     be an int, saying how many strings follow. Ie 1st string in titles[1] */
+  int count;
+  int i;
+
+  titles=NULL;
+
+  /* WE SHOULD SET THE RECORD FORMAT SOMEWHERE..... USMARC (default)
+     but may also want SUTRS support. */
+
+  /* sends a presentRequest - we need to know the set number - johnmcp */
+  z_send_getbriefrecords(starting, 1, howmany);
+  /* CHECK RETURN VALUE (currently only 0) */
+  
+
+  z_getAPDU(&apdu);
+  if (apdu->which != Z_APDU_presentResponse) {
+    /* we got out-of-sync.... */
+    fprintf(stderr,"Not a present response to present request\n");
+    return NULL;
+  }
+  
+  print_refid (apdu->u.presentResponse->referenceId);
+  count=*apdu->u.presentResponse->numberOfRecordsReturned;
+  setno += count;
+  if (apdu->u.presentResponse->records) {
+    /* extract the titles from each record, and return it as an array of 
+       strings */
+    if (count==1 &&
+	apdu->u.presentResponse->records->which!=Z_Records_DBOSD) {
+      /* apdu->u.presentResponse->records->which gives a type:
+	 1=databaseOrSurDiagnostics | 2=nonSurrogateDiagnostic | 
+	 3=multipleNonSurDiagnostics.
+	 Type 1 implies it is a database record. FROM z-core.h,
+      NOT prt-proto.h!!!!! */
+
+      /* for type 2:
+	 apdu->u.presentResponse->records->u.nonSurrogateDiagnostic->which:
+	 1=v2Addinfo | 2=v3Addinfo, and u.v[23]Addinfo is a (char *).
+
+      */
+      titles=malloc(sizeof(char *));
+      titles[0]=(char *)0;
+      /* could put error message and titles[1], and set titles[0] to -1. */
+
+
+    }
+    else /* more than 1 rec returned, so ?has? to be db records (dblcheck!!)*/
+      {
+	titles=malloc(sizeof(char *)*count + 1);
+	/* check malloc succeeded... */
+	titles[0]=(char *)count;
+	for (i=1;i<=count;i++) {
+	  titles[i]=getrecordtitle(apdu->u.presentResponse->records->
+				   u.databaseOrSurDiagnostics->records[i-1]->
+				   u.databaseRecord);
+	}
+      } 
+  }
+  else {
+    titles=malloc(sizeof(char *));
+    titles[0]=(char *)0;
+  }
+  /*  printf ("nextResultSetPosition = %d\n",
+   *apdu->u.presentResponse->nextResultSetPosition); */
+  return (titles);
+}
+
+
+int z_getnextAPDU()
+{
+  Z_APDU *apdu;
+  apdu=NULL;
+  
+  z_getAPDU(&apdu);
+  
+  switch(apdu->which)
+    {
+    case Z_APDU_initResponse:
+      /* save session parameters for later use */
+      session_mem = odr_extract_mem(in);
+      session=apdu->u.initResponse;
+      /*process_initResponse();*/
+      break;
+    case Z_APDU_searchResponse:
+      process_searchResponse(apdu->u.searchResponse);
+      break;
+    case Z_APDU_scanResponse:
+      process_scanResponse(apdu->u.scanResponse);
+      break;
+    case Z_APDU_presentResponse:
+      print_refid (apdu->u.presentResponse->referenceId);
+      setno +=
+	*apdu->u.presentResponse->numberOfRecordsReturned;
+      if (apdu->u.presentResponse->records)
+	display_records(apdu->u.presentResponse->records);
+      else
+	printf("No records.\n");
+      printf ("nextResultSetPosition = %d\n",
+	      *apdu->u.presentResponse->nextResultSetPosition);
+      break;
+    case Z_APDU_sortResponse:
+      process_sortResponse(apdu->u.sortResponse);
+      break;
+    case Z_APDU_extendedServicesResponse:
+      printf("Got extended services response\n");
+      process_ESResponse(apdu->u.extendedServicesResponse);
+      break;
+    case Z_APDU_close:
+      printf("Target has closed the association.\n");
+      process_close(apdu->u.close);
+      break;
+    case Z_APDU_resourceControlRequest:
+      process_resourceControlRequest
+	(apdu->u.resourceControlRequest);
+      break;
+    case Z_APDU_deleteResultSetResponse:
+      process_deleteResultSetResponse(apdu->u.
+				      deleteResultSetResponse);
+      break;
+    default:
+      printf("Received unknown APDU type (%d).\n", 
+	     apdu->which);
+      exit(1);
+    }
+  
+  /*while (conn && cs_more(conn));*/
+  return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.am	(revision 21083)
@@ -0,0 +1,8 @@
+## $Id$
+
+noinst_LIBRARIES=libcomstack.a
+
+INCLUDES=-I../include
+
+libcomstack_a_SOURCES=comstack.c tcpip.c waislen.c 
+
Index: /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/comstack/Makefile.in	(revision 21083)
@@ -0,0 +1,265 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libcomstack.a
+
+INCLUDES = -I../include
+
+libcomstack_a_SOURCES = comstack.c tcpip.c waislen.c 
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libcomstack_a_LIBADD = 
+libcomstack_a_OBJECTS =  comstack.o tcpip.o waislen.o
+AR = ar
+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 = tar
+GZIP_ENV = --best
+SOURCES = $(libcomstack_a_SOURCES)
+OBJECTS = $(libcomstack_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps comstack/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libcomstack.a: $(libcomstack_a_OBJECTS) $(libcomstack_a_DEPENDENCIES)
+	-rm -f libcomstack.a
+	$(AR) cru libcomstack.a $(libcomstack_a_OBJECTS) $(libcomstack_a_LIBADD)
+	$(RANLIB) libcomstack.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 = comstack
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
+
+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
+
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/comstack/comstack.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/comstack/comstack.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/comstack/comstack.c	(revision 21083)
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1995-1998, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:04  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.6  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.5  1998/06/22 11:32:35  adam
+ * Added 'conditional cs_listen' feature.
+ *
+ * Revision 1.4  1997/09/29 07:16:14  adam
+ * Array cs_errlist no longer global.
+ *
+ * Revision 1.3  1997/09/01 08:49:14  adam
+ * New windows NT/95 port using MSV5.0. Minor changes only.
+ *
+ * Revision 1.2  1995/09/29 17:01:48  quinn
+ * More Windows work
+ *
+ * Revision 1.1  1995/06/14  09:58:20  quinn
+ * Renamed yazlib to comstack.
+ *
+ * Revision 1.2  1995/05/16  08:51:15  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/14  10:28:34  quinn
+ * Adding server-side support to tcpip.c and fixing bugs in nonblocking I/O
+ *
+ *
+ */
+
+#include <yaz/comstack.h>
+
+static const char *cs_errlist[] =
+{
+    "No error or unspecified error",
+    "System (lower-layer) error",
+    "Operation out of state",
+    "No data (operation would block)",
+    "New data while half of old buffer is on the line (flow control)",
+    "Permission denied"
+};
+
+const char *cs_errmsg(int n)
+{
+    return cs_errlist[n];
+}
Index: /main/tags/2.38/gsdl/packages/yaz/comstack/tcpip.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/comstack/tcpip.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/comstack/tcpip.c	(revision 21083)
@@ -0,0 +1,717 @@
+/*
+ * Copyright (c) 1995-1999, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:05  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.32  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.31  1999/04/29 07:31:23  adam
+ * Changed tcpip_strtoaddr_ex so that only part 'till '/' is considered
+ * part of hostname.
+ *
+ * Revision 1.30  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.29  1999/04/16 14:45:55  adam
+ * Added interface for tcpd wrapper for access control.
+ *
+ * Revision 1.28  1999/03/31 11:11:14  adam
+ * Function getprotobyname only called once. Minor change in tcpip_get
+ * to handle multi-threaded conditions.
+ *
+ * Revision 1.27  1999/02/02 13:57:31  adam
+ * Uses preprocessor define WIN32 instead of WINDOWS to build code
+ * for Microsoft WIN32.
+ *
+ * Revision 1.26  1999/01/08 11:23:14  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.25  1998/07/07 15:49:23  adam
+ * Added braces to avoid warning.
+ *
+ * Revision 1.24  1998/06/29 07:59:17  adam
+ * Minor fix.
+ *
+ * Revision 1.23  1998/06/23 15:37:50  adam
+ * Added type cast to prevent warning.
+ *
+ * Revision 1.22  1998/06/22 11:32:36  adam
+ * Added 'conditional cs_listen' feature.
+ *
+ * Revision 1.21  1998/05/20 09:55:32  adam
+ * Function tcpip_get treats EINPROGRESS error in the same way as
+ * EWOULDBLOCK. EINPROGRESS shouldn't be returned - but it is on
+ * Solaris in some cases.
+ *
+ * Revision 1.20  1998/05/18 10:10:40  adam
+ * Minor change to avoid C++ warning.
+ *
+ * Revision 1.19  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.18  1997/09/29 07:15:25  adam
+ * Changed use of setsockopt to avoid warnings on MSVC.
+ *
+ * Revision 1.17  1997/09/17 12:10:30  adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.16  1997/09/01 08:49:14  adam
+ * New windows NT/95 port using MSV5.0. Minor changes only.
+ *
+ * Revision 1.15  1997/05/14 06:53:33  adam
+ * C++ support.
+ *
+ * Revision 1.14  1997/05/01 15:06:32  adam
+ * Moved WINSOCK init. code to tcpip_init routine.
+ *
+ * Revision 1.13  1996/11/01 08:45:18  adam
+ * Bug fix: used close on MS-Windows. Fixed to closesocket.
+ *
+ * Revision 1.12  1996/07/06 19:58:30  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.11  1996/02/23  10:00:39  quinn
+ * WAIS Work
+ *
+ * Revision 1.10  1996/02/20  12:52:11  quinn
+ * WAIS protocol support.
+ *
+ * Revision 1.9  1996/02/10  12:23:11  quinn
+ * Enablie inetd operations fro TCP/IP stack
+ *
+ * Revision 1.8  1995/11/01  13:54:27  quinn
+ * Minor adjustments
+ *
+ * Revision 1.7  1995/10/30  12:41:16  quinn
+ * Added hostname lookup for server.
+ *
+ * Revision 1.6  1995/09/29  17:12:00  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/29  17:01:48  quinn
+ * More Windows work
+ *
+ * Revision 1.4  1995/09/28  10:12:26  quinn
+ * Windows-support changes
+ *
+ * Revision 1.3  1995/09/27  15:02:45  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/06/15  12:30:06  quinn
+ * Added @ as hostname alias for INADDR ANY.
+ *
+ * Revision 1.1  1995/06/14  09:58:20  quinn
+ * Renamed yazlib to comstack.
+ *
+ * Revision 1.20  1995/05/16  08:51:16  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.19  1995/04/10  10:24:08  quinn
+ * Some bug-fixes.
+ *
+ * Revision 1.18  1995/03/30  13:29:27  quinn
+ * Added REUSEADDR in tcpip_bind
+ *
+ * Revision 1.17  1995/03/27  08:36:10  quinn
+ * Some work on nonblocking operation in xmosi.c and rfct.c.
+ * Added protocol parameter to cs_create()
+ *
+ * Revision 1.16  1995/03/21  15:53:41  quinn
+ * Added rcvconnect
+ *
+ * Revision 1.15  1995/03/21  12:31:27  quinn
+ * Added check for EINPROGRESS on connect.
+ *
+ * Revision 1.14  1995/03/20  09:47:21  quinn
+ * Added server-side support to xmosi.c
+ * Fixed possible problems in rfct
+ * Other little mods
+ *
+ * Revision 1.13  1995/03/15  16:15:13  adam
+ * Removed p_write.
+ *
+ * Revision 1.12  1995/03/15  15:36:27  quinn
+ * Mods to support nonblocking I/O
+ *
+ * Revision 1.11  1995/03/15  08:37:57  quinn
+ * Now we're pretty much set for nonblocking I/O.
+ *
+ * Revision 1.10  1995/03/14  17:00:07  quinn
+ * Bug-fixes - added tracing info to tcpip.c
+ *
+ * Revision 1.9  1995/03/14  10:28:42  quinn
+ * Adding server-side support to tcpip.c and fixing bugs in nonblocking I/O
+ *
+ * Revision 1.8  1995/03/10  14:22:50  quinn
+ * Removed debug output.
+ *
+ * Revision 1.7  1995/03/10  11:44:59  quinn
+ * Fixes and debugging
+ *
+ * Revision 1.6  1995/03/07  10:26:55  quinn
+ * Initialized type field in the comstacks.
+ *
+ * Revision 1.5  1995/02/14  20:40:07  quinn
+ * Various stuff.
+ *
+ * Revision 1.4  1995/02/14  11:54:49  quinn
+ * Beginning to add full CCL.
+ *
+ * Revision 1.3  1995/02/10  18:58:10  quinn
+ * Fixed tcpip_get (formerly tcpip_read).
+ * Turned tst (cli) into a proper, event-driven thingy.
+ *
+ * Revision 1.2  1995/02/10  15:55:47  quinn
+ * Small things.
+ *
+ * Revision 1.1  1995/02/09  15:51:52  quinn
+ * Works better now.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#ifndef WIN32
+#include <unistd.h>
+#endif
+#include <errno.h>
+#include <fcntl.h>
+
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+#include <yaz/log.h>
+
+/* Chas added the following, so we get the definition of completeBER */
+#include <yaz/odr.h>
+
+int tcpip_close(COMSTACK h);
+int tcpip_put(COMSTACK h, char *buf, int size);
+int tcpip_get(COMSTACK h, char **buf, int *bufsize);
+int tcpip_connect(COMSTACK h, void *address);
+int tcpip_more(COMSTACK h);
+int tcpip_rcvconnect(COMSTACK h);
+int tcpip_bind(COMSTACK h, void *address, int mode);
+int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
+		 int (*check_ip)(void *cd, const char *a, int len, int type),
+		 void *cd);
+
+COMSTACK tcpip_accept(COMSTACK h);
+char *tcpip_addrstr(COMSTACK h);
+void *tcpip_straddr(COMSTACK h, const char *str);
+
+#undef TRACE_TCPIP
+#ifdef TRACE_TCPIP
+#define TRC(x) x
+#else
+#define TRC(X)
+#endif
+
+typedef struct tcpip_state
+{
+    char *altbuf; /* alternate buffer for surplus data */
+    int altsize;  /* size as xmalloced */
+    int altlen;   /* length of data or 0 if none */
+
+    int written;  /* -1 if we aren't writing */
+    int towrite;  /* to verify against user input */
+    int (*complete)(const unsigned char *buf, int len); /* length/comple. */
+    struct sockaddr_in addr;  /* returned by cs_straddr */
+    char buf[128]; /* returned by cs_addrstr */
+} tcpip_state;
+
+#ifdef WIN32
+static int tcpip_init (void)
+{
+    static int initialized = 0;
+    if (!initialized)
+    {
+        WORD requested;
+        WSADATA wd;
+
+        requested = MAKEWORD(1, 1);
+        if (WSAStartup(requested, &wd))
+            return 0;
+        initialized = 1;
+    }
+    return 1;
+}
+#else
+
+static int proto_number = 0;
+
+static int tcpip_init (void)
+{
+    struct protoent *proto;
+    /* only call getprotobyname once, in case it allocates memory */
+    if (!(proto = getprotobyname("tcp")))
+	return 0;
+    proto_number = proto->p_proto;
+    return 1;
+}
+#endif
+/*
+ * This function is always called through the cs_create() macro.
+ * s >= 0: socket has already been established for us.
+ */
+COMSTACK tcpip_type(int s, int blocking, int protocol)
+{
+    COMSTACK p;
+    tcpip_state *state;
+    int new_socket;
+#ifdef WIN32
+    unsigned long tru = 1;
+#endif
+
+    if (!tcpip_init ())
+        return 0;
+    if (s < 0)
+    {
+#ifdef WIN32
+	if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
+	    return 0;
+#else
+	if ((s = socket(AF_INET, SOCK_STREAM, proto_number)) < 0)
+	    return 0;
+#endif
+	new_socket = 1;
+    }
+    else
+	new_socket = 0;
+    if (!(p = (struct comstack *)xmalloc(sizeof(struct comstack))))
+	return 0;
+    if (!(state = (struct tcpip_state *)(p->cprivate =
+                                         xmalloc(sizeof(tcpip_state)))))
+	return 0;
+
+#ifdef WIN32
+    if (!(p->blocking = blocking) && ioctlsocket(s, FIONBIO, &tru) < 0)
+#else
+    if (!(p->blocking = blocking) && fcntl(s, F_SETFL, O_NONBLOCK) < 0)
+#endif
+	return 0;
+
+    p->iofile = s;
+    p->type = tcpip_type;
+    p->protocol = (enum oid_proto) protocol;
+
+    p->f_connect = tcpip_connect;
+    p->f_rcvconnect = tcpip_rcvconnect;
+    p->f_get = tcpip_get;
+    p->f_put = tcpip_put;
+    p->f_close = tcpip_close;
+    p->f_more = tcpip_more;
+    p->f_bind = tcpip_bind;
+    p->f_listen = tcpip_listen;
+    p->f_accept = tcpip_accept;
+    p->f_addrstr = tcpip_addrstr;
+    p->f_straddr = tcpip_straddr;
+
+    p->state = new_socket ? CS_UNBND : CS_IDLE; /* state of line */
+    p->event = CS_NONE;
+    p->cerrno = 0;
+    p->stackerr = 0;
+
+    state->altbuf = 0;
+    state->altsize = state->altlen = 0;
+    state->towrite = state->written = -1;
+    if (protocol == PROTO_WAIS)
+	state->complete = completeWAIS;
+    else
+	state->complete = completeBER;
+
+    p->timeout = COMSTACK_DEFAULT_TIMEOUT;
+    TRC(fprintf(stderr, "Created new TCPIP comstack\n"));
+
+    return p;
+}
+
+int tcpip_strtoaddr_ex(const char *str, struct sockaddr_in *add)
+{
+    struct hostent *hp;
+    char *p, buf[512];
+    short int port = 210;
+    unsigned tmpadd;
+
+    if (!tcpip_init ())
+        return 0;
+    TRC(fprintf(stderr, "tcpip_strtoaddress: %s\n", str ? str : "NULL"));
+    add->sin_family = AF_INET;
+    strncpy(buf, str, 511);
+    buf[511] = 0;
+    if ((p = strchr(buf, '/')))
+        *p = 0;
+    if ((p = strchr(buf, ':')))
+    {
+        *p = 0;
+        port = atoi(p + 1);
+    }
+    add->sin_port = htons(port);
+    if (!strcmp("@", buf))
+        add->sin_addr.s_addr = INADDR_ANY;
+    else if ((hp = gethostbyname(buf)))
+        memcpy(&add->sin_addr.s_addr, *hp->h_addr_list,
+	       sizeof(struct in_addr));
+    else if ((tmpadd = (unsigned) inet_addr(buf)) != 0)
+        memcpy(&add->sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
+    else
+        return 0;
+    return 1;
+}
+
+void *tcpip_straddr(COMSTACK h, const char *str)
+{
+    tcpip_state *sp = (tcpip_state *)h->cprivate;
+
+    if (!tcpip_strtoaddr_ex (str, &sp->addr))
+	return 0;
+    return &sp->addr;
+}
+
+struct sockaddr_in *tcpip_strtoaddr(const char *str)
+{
+    static struct sockaddr_in add;
+    
+    if (!tcpip_strtoaddr_ex (str, &add))
+	return 0;
+    return &add;
+}
+
+int tcpip_more(COMSTACK h)
+{
+    tcpip_state *sp = (tcpip_state *)h->cprivate;
+    
+    return sp->altlen && (*sp->complete)((unsigned char *) sp->altbuf,
+	sp->altlen);
+}
+
+/*
+ * connect(2) will block (sometimes) - nothing we can do short of doing
+ * weird things like spawning subprocesses or threading or some weird junk
+ * like that.
+ */
+int tcpip_connect(COMSTACK h, void *address)
+{
+    struct sockaddr_in *add = (struct sockaddr_in *)address;
+
+    TRC(fprintf(stderr, "tcpip_connect\n"));
+    if (connect(h->iofile, (struct sockaddr *) add, sizeof(*add)) < 0)
+    {
+#ifdef WIN32
+        if (WSAGetLastError() == WSAEWOULDBLOCK)
+#else
+        if (errno == EINPROGRESS)
+#endif
+            return 1;
+        return -1;
+    }
+    h->state = CS_DATAXFER;
+    return 0;
+}
+
+/*
+ * nop
+ */
+int tcpip_rcvconnect(COMSTACK h)
+{
+    TRC(fprintf(stderr, "tcpip_rcvconnect\n"));
+    return 0;
+}
+
+int tcpip_bind(COMSTACK h, void *address, int mode)
+{
+    struct sockaddr *addr = (struct sockaddr *)address;
+#ifdef WIN32
+    BOOL one = 1;
+#else
+    unsigned long one = 1;
+#endif
+
+    TRC(fprintf(stderr, "tcpip_bind\n"));
+    if (setsockopt(h->iofile, SOL_SOCKET, SO_REUSEADDR, (char*) 
+	&one, sizeof(one)) < 0)
+    {
+        h->cerrno = CSYSERR;
+        return -1;
+    }
+    if (bind(h->iofile, addr, sizeof(struct sockaddr_in)) < 0)
+    {
+        h->cerrno = CSYSERR;
+        return -1;
+    }
+    if (mode == CS_SERVER && listen(h->iofile, 3) < 0)
+    {
+        h->cerrno = CSYSERR;
+        return -1;
+    }
+    h->state = CS_IDLE;
+    return 0;
+}
+
+int tcpip_listen(COMSTACK h, char *raddr, int *addrlen,
+		 int (*check_ip)(void *cd, const char *a, int len, int t),
+		 void *cd)
+{
+    struct sockaddr_in addr;
+    int len = sizeof(addr);
+
+    TRC(fprintf(stderr, "tcpip_listen pid=%d\n", getpid()));
+    if (h->state != CS_IDLE)
+    {
+        h->cerrno = CSOUTSTATE;
+        return -1;
+    }
+    if ((h->newfd = accept(h->iofile, (struct sockaddr*)&addr, &len)) < 0)
+    {
+#ifdef WIN32
+        if (WSAGetLastError() == WSAEWOULDBLOCK)
+#else
+        if (errno == EWOULDBLOCK)
+#endif
+
+            h->cerrno = CSNODATA;
+        else
+            h->cerrno = CSYSERR;
+        return -1;
+    }
+    if (addrlen && (size_t) (*addrlen) >= sizeof(struct sockaddr_in))
+        memcpy(raddr, &addr, *addrlen = sizeof(struct sockaddr_in));
+    else if (addrlen)
+        *addrlen = 0;
+    if (check_ip && (*check_ip)(cd, (const char *) &addr,
+        sizeof(addr), AF_INET))
+    {
+	h->cerrno = CSDENY;
+#ifdef WIN32
+        closesocket(h->newfd);
+#else
+        close(h->newfd);
+#endif
+	return -1;
+    }
+    h->state = CS_INCON;
+    return 0;
+}
+
+COMSTACK tcpip_accept(COMSTACK h)
+{
+    COMSTACK cnew;
+    tcpip_state *state, *st = (tcpip_state *)h->cprivate;
+#ifdef WIN32
+    unsigned long tru = 1;
+#endif
+
+    TRC(fprintf(stderr, "tcpip_accept\n"));
+    if (h->state != CS_INCON)
+    {
+        h->cerrno = CSOUTSTATE;
+        return 0;
+    }
+    if (!(cnew = (COMSTACK)xmalloc(sizeof(*cnew))))
+    {
+        h->cerrno = CSYSERR;
+        return 0;
+    }
+    memcpy(cnew, h, sizeof(*h));
+    cnew->iofile = h->newfd;
+    if (!(state = (tcpip_state *)
+	  (cnew->cprivate = xmalloc(sizeof(tcpip_state)))))
+    {
+        h->cerrno = CSYSERR;
+        return 0;
+    }
+#ifdef WIN32
+    if (!cnew->blocking && ioctlsocket(cnew->iofile, FIONBIO, &tru) < 0)
+#else
+    if (!cnew->blocking && fcntl(cnew->iofile, F_SETFL, O_NONBLOCK) < 0)
+#endif
+        return 0;
+    state->altbuf = 0;
+    state->altsize = state->altlen = 0;
+    state->towrite = state->written = -1;
+    state->complete = st->complete;
+    cnew->state = CS_DATAXFER;
+    h->state = CS_IDLE;
+    return cnew;
+}
+
+#define CS_TCPIP_BUFCHUNK 4096
+
+/*
+ * Return: -1 error, >1 good, len of buffer, ==1 incomplete buffer,
+ * 0=connection closed.
+ */
+int tcpip_get(COMSTACK h, char **buf, int *bufsize)
+{
+    tcpip_state *sp = (tcpip_state *)h->cprivate;
+    char *tmpc;
+    int tmpi, berlen, rest, req, tomove;
+    int hasread = 0, res;
+
+    TRC(fprintf(stderr, "tcpip_get: bufsize=%d\n", *bufsize));
+    if (sp->altlen) /* switch buffers */
+    {
+        TRC(fprintf(stderr, "  %d bytes in altbuf (0x%x)\n", sp->altlen,
+            (unsigned) sp->altbuf));
+        tmpc = *buf;
+        tmpi = *bufsize;
+        *buf = sp->altbuf;
+        *bufsize = sp->altsize;
+        hasread = sp->altlen;
+        sp->altlen = 0;
+        sp->altbuf = tmpc;
+        sp->altsize = tmpi;
+    }
+    while (!(berlen = (*sp->complete)((unsigned char *)*buf, hasread)))
+    {
+        if (!*bufsize)
+        {
+            if (!(*buf = (char *)xmalloc(*bufsize = CS_TCPIP_BUFCHUNK)))
+                return -1;
+        }
+        else if (*bufsize - hasread < CS_TCPIP_BUFCHUNK)
+            if (!(*buf =(char *)xrealloc(*buf, *bufsize *= 2)))
+                return -1;
+        if ((res = recv(h->iofile, *buf + hasread, CS_TCPIP_BUFCHUNK, 0)) < 0)
+	{
+#ifdef WIN32
+            if (WSAGetLastError() == WSAEWOULDBLOCK)
+		break;
+	    else
+		return -1;
+#else
+	    if (errno == EWOULDBLOCK
+#ifdef EINPROGRESS
+		|| errno == EINPROGRESS
+#endif
+		)
+		break;
+            else if (errno == 0)
+		continue;
+	    else
+                return -1;
+#endif
+	}
+        if (!res)
+            return 0;
+        hasread += res;
+        TRC(fprintf(stderr, "  res=%d, hasread=%d\n", res, hasread));
+    }
+    TRC(fprintf(stderr, "  Out of read loop with hasread=%d, berlen=%d\n",
+        hasread, berlen));
+    /* move surplus buffer (or everything if we didn't get a BER rec.) */
+    if (hasread > berlen)
+    {
+        tomove = req = hasread - berlen;
+        rest = tomove % CS_TCPIP_BUFCHUNK;
+        if (rest)
+            req += CS_TCPIP_BUFCHUNK - rest;
+        if (!sp->altbuf)
+        {
+            if (!(sp->altbuf = (char *)xmalloc(sp->altsize = req)))
+                return -1;
+        } else if (sp->altsize < req)
+            if (!(sp->altbuf =(char *)xrealloc(sp->altbuf, sp->altsize = req)))
+                return -1;
+        TRC(fprintf(stderr, "  Moving %d bytes to altbuf(0x%x)\n", tomove,
+            (unsigned) sp->altbuf));
+        memcpy(sp->altbuf, *buf + berlen, sp->altlen = tomove);
+    }
+    if (berlen < CS_TCPIP_BUFCHUNK - 1)
+        *(*buf + berlen) = '\0';
+    return berlen ? berlen : 1;
+}
+
+/*
+ * Returns 1, 0 or -1
+ * In nonblocking mode, you must call again with same buffer while
+ * return value is 1.
+ */
+int tcpip_put(COMSTACK h, char *buf, int size)
+{
+    int res;
+    struct tcpip_state *state = (struct tcpip_state *)h->cprivate;
+
+    TRC(fprintf(stderr, "tcpip_put: size=%d\n", size));
+    if (state->towrite < 0)
+    {
+        state->towrite = size;
+        state->written = 0;
+    }
+    else if (state->towrite != size)
+    {
+        h->cerrno = CSWRONGBUF;
+        return -1;
+    }
+    while (state->towrite > state->written)
+    {
+        if ((res = send(h->iofile, buf + state->written, size -
+            state->written, 0)) < 0)
+        {
+#ifdef WIN32
+            if (WSAGetLastError() == WSAEWOULDBLOCK)
+#else
+            if (errno == EAGAIN)
+#endif
+            {
+                TRC(fprintf(stderr, "  Flow control stop\n"));
+                return 1;
+            }
+            h->cerrno = CSYSERR;
+            return -1;
+        }
+        state->written += res;
+        TRC(fprintf(stderr, "  Wrote %d, written=%d, nbytes=%d\n",
+            res, state->written, size));
+    }
+    state->towrite = state->written = -1;
+    TRC(fprintf(stderr, "  Ok\n"));
+    return 0;
+}
+
+int tcpip_close(COMSTACK h)
+{
+    tcpip_state *sp = (struct tcpip_state *)h->cprivate;
+
+    TRC(fprintf(stderr, "tcpip_close\n"));
+    if (h->iofile != -1)
+#ifdef WIN32
+        closesocket(h->iofile);
+#else
+        close(h->iofile);
+#endif
+    if (sp->altbuf)
+        xfree(sp->altbuf);
+    xfree(sp);
+    xfree(h);
+    return 0;
+}
+
+char *tcpip_addrstr(COMSTACK h)
+{
+    struct sockaddr_in addr;
+    tcpip_state *sp = (struct tcpip_state *)h->cprivate;
+    char *r, *buf = sp->buf;
+    size_t len;
+    struct hostent *host;
+    
+    len = sizeof(addr);
+    if (getpeername(h->iofile, (struct sockaddr*) &addr, &len) < 0)
+    {
+	h->cerrno = CSYSERR;
+	return 0;
+    }
+    if ((host = gethostbyaddr((char*)&addr.sin_addr, sizeof(addr.sin_addr),
+			      AF_INET)))
+	r = (char*) host->h_name;
+    else
+	r = inet_ntoa(addr.sin_addr);
+    sprintf(buf, "tcp:%s", r);
+    return buf;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/comstack/waislen.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/comstack/waislen.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/comstack/waislen.c	(revision 21083)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:06  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.5  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.4  1999/01/08 11:23:15  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.3  1996/02/29 14:23:13  adam
+ * Bug fix.
+ *
+ * Revision 1.2  1996/02/26  18:34:44  adam
+ * Bug fix.
+ *
+ * Revision 1.1  1996/02/20  13:02:58  quinn
+ * Wais length.
+ *
+ *
+ */
+
+#include <stdio.h>
+#include <yaz/comstack.h>
+#include <yaz/tcpip.h>
+/*
+ * Return length of WAIS package or 0
+ */
+int completeWAIS(const unsigned char *buf, int len)
+{
+    int i, lval = 0;
+
+    if (len < 25)
+	return 0;
+    if (*buf != '0')
+	return 0;
+    /* calculate length */
+    for (i = 0; i < 10; i++)
+	lval = lval * 10 + (buf[i] - '0');
+    lval += 25;
+    if (len >= lval)
+	return lval;
+    return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/configure
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/configure	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/configure	(revision 21083)
@@ -0,0 +1,1945 @@
+#! /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
+  --disable-comp          use old encoders, i.e. disable the YAZ ASN.1 Compiler"
+ac_help="$ac_help
+  --enable-tcpd           enable TCP wrapper for server if available"
+ac_help="$ac_help
+  --enable-threads        enable threads 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=include/yaz/yaz-version.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@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
+
+
+# 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:534: 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:564: 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:615: 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:647: 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 658 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:663: \"$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:689: 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:694: 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:703: \"$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:722: 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 how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:754: 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 769 "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:775: \"$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 786 "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:792: \"$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 803 "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:809: \"$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
+
+# 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:836: 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
+
+for ac_prog in sgml2txt
+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:868: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_have_sgml2txt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$have_sgml2txt"; then
+  ac_cv_prog_have_sgml2txt="$have_sgml2txt" # 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_have_sgml2txt="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+have_sgml2txt="$ac_cv_prog_have_sgml2txt"
+if test -n "$have_sgml2txt"; then
+  echo "$ac_t""$have_sgml2txt" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$have_sgml2txt" && break
+done
+test -n "$have_sgml2txt" || have_sgml2txt="no"
+
+for ac_prog in sgml2latex
+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:903: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_have_sgml2latex'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$have_sgml2latex"; then
+  ac_cv_prog_have_sgml2latex="$have_sgml2latex" # 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_have_sgml2latex="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+have_sgml2latex="$ac_cv_prog_have_sgml2latex"
+if test -n "$have_sgml2latex"; then
+  echo "$ac_t""$have_sgml2latex" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$have_sgml2latex" && break
+done
+test -n "$have_sgml2latex" || have_sgml2latex="no"
+
+for ac_prog in sgml2html
+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:938: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_have_sgml2html'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$have_sgml2html"; then
+  ac_cv_prog_have_sgml2html="$have_sgml2html" # 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_have_sgml2html="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+have_sgml2html="$ac_cv_prog_have_sgml2html"
+if test -n "$have_sgml2html"; then
+  echo "$ac_t""$have_sgml2html" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$have_sgml2html" && break
+done
+test -n "$have_sgml2html" || have_sgml2html="no"
+
+if test "$have_sgml2txt" = "no" -o "$have_sgml2latex" = "no" -o "$have_sgml2html" = "no"; then
+	DOCMODULE=""
+else
+	DOCMODULE="doc"
+fi
+
+
+
+# Check whether --enable-comp or --disable-comp was given.
+if test "${enable_comp+set}" = set; then
+  enableval="$enable_comp"
+  :
+else
+  enable_comp=yes
+fi
+
+if test "$enable_comp" = "yes"; then
+	ASNMODULE="z39.50"
+	ILLMODULE="ill"
+	ILLLIB=../ill/libill.a
+	ASN_MAKEFILES="z39.50/Makefile ill/Makefile"
+	cp -f include/yaz/z-proto.h include/yaz/proto.h
+else
+	ILLMODULE=""
+	ASNMODULE=asn
+	ILLLIB=""
+	ASN_MAKEFILES="asn/Makefile"
+	cp -f include/yaz/prt-proto.h include/yaz/proto.h
+fi
+checkBoth=0
+echo $ac_n "checking for connect""... $ac_c" 1>&6
+echo "configure:999: checking for connect" >&5
+if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1004 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char connect(); 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 connect();
+
+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_connect) || defined (__stub___connect)
+choke me
+#else
+connect();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1027: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_connect=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_connect=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_connect" = "no"; then
+	echo $ac_n "checking for main in -lsocket""... $ac_c" 1>&6
+echo "configure:1048: checking for main in -lsocket" >&5
+ac_lib_var=`echo socket'_'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="-lsocket  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1056 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1063: \"$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 -lsocket"
+else
+  echo "$ac_t""no" 1>&6
+checkBoth=1
+fi
+
+fi
+if test "$checkBoth" = "1"; then
+	oldLibs=$LIBS
+	LIBS="$LIBS -lsocket -lnsl"
+	echo $ac_n "checking for accept""... $ac_c" 1>&6
+echo "configure:1089: checking for accept" >&5
+if eval "test \"`echo '$''{'ac_cv_func_accept'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1094 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char accept(); 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 accept();
+
+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_accept) || defined (__stub___accept)
+choke me
+#else
+accept();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1117: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_accept=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_accept=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'accept`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+LIBS=$oldLibs
+fi
+
+fi
+echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:1139: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1144 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostbyname(); 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 gethostbyname();
+
+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_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for main in -lnsl""... $ac_c" 1>&6
+echo "configure:1185: checking for main in -lnsl" >&5
+ac_lib_var=`echo nsl'_'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="-lnsl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1193 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1200: \"$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 -lnsl"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6
+echo "configure:1223: checking for readline in -lreadline" >&5
+ac_lib_var=`echo readline'_'readline | 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="-lreadline  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1231 "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 readline();
+
+int main() {
+readline()
+; return 0; }
+EOF
+if { (eval echo configure:1242: \"$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 -lreadline"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_lib_readline_readline" = "no"; then
+	echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6
+echo "configure:1264: checking for readline in -lreadline" >&5
+ac_lib_var=`echo readline'_'readline | 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="-lreadline  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1272 "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 readline();
+
+int main() {
+readline()
+; return 0; }
+EOF
+if { (eval echo configure:1283: \"$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 -lreadline -ltermcap"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+echo $ac_n "checking for add_history in -lhistory""... $ac_c" 1>&6
+echo "configure:1305: checking for add_history in -lhistory" >&5
+ac_lib_var=`echo history'_'add_history | 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="-lhistory  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1313 "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 add_history();
+
+int main() {
+add_history()
+; return 0; }
+EOF
+if { (eval echo configure:1324: \"$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 -lhistory"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_lib_readline_readline" = "yes"; then
+	for ac_hdr in readline/readline.h readline/history.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1349: 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 1354 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1359: \"$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
+
+fi
+# Check whether --enable-tcpd or --disable-tcpd was given.
+if test "${enable_tcpd+set}" = set; then
+  enableval="$enable_tcpd"
+  :
+fi
+
+if test "$enable_tcpd" = "yes"; then
+	echo $ac_n "checking for working tcpd.h""... $ac_c" 1>&6
+echo "configure:1394: checking for working tcpd.h" >&5
+	oldLibs=$LIBS
+	LIBS="$LIBS -lwrap -lnsl"
+	cat > conftest.$ac_ext <<EOF
+#line 1398 "configure"
+#include "confdefs.h"
+#include <syslog.h>
+	#include <tcpd.h>
+	int allow_severity = LOG_INFO;
+	int deny_severity = LOG_WARNING;
+int main() {
+struct request_info request_info; int i;
+	i = hosts_access(&request_info);
+; return 0; }
+EOF
+if { (eval echo configure:1409: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  tcpd_ok=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  tcpd_ok=0
+fi
+rm -f conftest*
+	if test "$tcpd_ok" = "0"; then
+		echo "$ac_t""no" 1>&6
+		LIBS=$oldLibs
+	else
+		echo "$ac_t""yes" 1>&6
+		cat >> confdefs.h <<\EOF
+#define HAVE_TCPD_H 1
+EOF
+
+	fi
+fi
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1431: 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 1436 "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:1444: \"$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 1461 "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 1479 "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 1500 "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:1511: \"$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
+
+if test "$ac_cv_header_stdc" = "no"; then
+	echo "configure: warning: Your system doesn't seem to support ANSI C" 1>&2
+fi
+# Check whether --enable-threads or --disable-threads was given.
+if test "${enable_threads+set}" = set; then
+  enableval="$enable_threads"
+  :
+fi
+
+if test "$enable_threads" = "yes"; then
+	for ac_hdr in pthread.h threads.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1548: 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 1553 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1558: \"$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
+
+	echo $ac_n "checking for pthread_mutex_lock""... $ac_c" 1>&6
+echo "configure:1585: checking for pthread_mutex_lock" >&5
+if eval "test \"`echo '$''{'ac_cv_func_pthread_mutex_lock'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1590 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char pthread_mutex_lock(); 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 pthread_mutex_lock();
+
+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_pthread_mutex_lock) || defined (__stub___pthread_mutex_lock)
+choke me
+#else
+pthread_mutex_lock();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1613: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_pthread_mutex_lock=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_pthread_mutex_lock=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'pthread_mutex_lock`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	if test "$ac_cv_func_pthread_mutex_lock" = "no"; then
+		echo $ac_n "checking for main in -lpthread""... $ac_c" 1>&6
+echo "configure:1634: checking for main in -lpthread" >&5
+ac_lib_var=`echo pthread'_'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="-lpthread  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1642 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1649: \"$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 pthread | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+  LIBS="-lpthread $LIBS"
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+	fi
+	cat >> confdefs.h <<\EOF
+#define _REENTRANT 1
+EOF
+
+fi
+SUBDIRS_VAR="util odr $ASNMODULE zutil comstack ccl tab include lib client $DOCMODULE"
+
+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
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ 	`~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# 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
+
+trap 'rm -fr `echo "Makefile util/Makefile odr/Makefile z39.50/Makefile asn/Makefile zutil/Makefile comstack/Makefile ccl/Makefile tab/Makefile include/Makefile include/yaz/Makefile lib/Makefile client/Makefile doc/Makefile" | 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%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@RANLIB@%$RANLIB%g
+s%@have_sgml2txt@%$have_sgml2txt%g
+s%@have_sgml2latex@%$have_sgml2latex%g
+s%@have_sgml2html@%$have_sgml2html%g
+s%@ASNMODULE@%$ASNMODULE%g
+s%@ILLMODULE@%$ILLMODULE%g
+s%@ILLLIB@%$ILLLIB%g
+s%@SUBDIRS_VAR@%$SUBDIRS_VAR%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 util/Makefile odr/Makefile z39.50/Makefile asn/Makefile zutil/Makefile comstack/Makefile ccl/Makefile tab/Makefile include/Makefile include/yaz/Makefile lib/Makefile client/Makefile doc/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
+
+
+  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
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+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
+
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/configure.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/configure.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/configure.in	(revision 21083)
@@ -0,0 +1,111 @@
+dnl YAZ Toolkit
+dnl (c) Index Data 1994-2000
+dnl See the file LICENSE for details.
+dnl -- modified for NZDL / Greenstone
+AC_INIT(include/yaz/yaz-version.h)
+dnl -- AM_INIT_AUTOMAKE(yaz, 1.6)
+dnl
+dnl ------ Checking programs
+AC_PROG_CC
+AC_PROG_CPP
+dnl -- AC_PROG_INSTALL
+AC_PROG_RANLIB
+AC_CHECK_PROGS(have_sgml2txt,sgml2txt,no)
+AC_CHECK_PROGS(have_sgml2latex,sgml2latex,no)
+AC_CHECK_PROGS(have_sgml2html,sgml2html,no)
+if test "$have_sgml2txt" = "no" -o "$have_sgml2latex" = "no" -o "$have_sgml2html" = "no"; then
+	DOCMODULE=""
+else
+	DOCMODULE="doc"
+fi
+dnl 
+dnl ----- yaz-comp: The Yaz Compiler
+AC_SUBST(ASNMODULE)
+AC_SUBST(ILLMODULE)
+AC_SUBST(ILLLIB)
+AC_ARG_ENABLE(comp,[  --disable-comp          use old encoders, i.e. disable the YAZ ASN.1 Compiler], , enable_comp=yes)
+if test "$enable_comp" = "yes"; then
+	ASNMODULE="z39.50"
+	ILLMODULE="ill"
+	ILLLIB=../ill/libill.a
+	ASN_MAKEFILES="z39.50/Makefile ill/Makefile"
+	cp -f include/yaz/z-proto.h include/yaz/proto.h
+else
+	ILLMODULE=""
+	ASNMODULE=asn
+	ILLLIB=""
+	ASN_MAKEFILES="asn/Makefile"
+	cp -f include/yaz/prt-proto.h include/yaz/proto.h
+fi
+dnl
+dnl ----- Sockets
+checkBoth=0
+AC_CHECK_FUNC(connect)
+if test "$ac_cv_func_connect" = "no"; then
+	AC_CHECK_LIB(socket, main, LIBS="$LIBS -lsocket", checkBoth=1)
+fi
+if test "$checkBoth" = "1"; then
+	oldLibs=$LIBS
+	LIBS="$LIBS -lsocket -lnsl"
+	AC_CHECK_FUNC(accept, , [LIBS=$oldLibs])
+fi
+AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))
+dnl
+dnl ------ GNU Readline
+AC_CHECK_LIB(readline, readline, [LIBS="$LIBS -lreadline"])
+if test "$ac_cv_lib_readline_readline" = "no"; then
+	AC_CHECK_LIB(readline, readline, [LIBS="$LIBS -lreadline -ltermcap"])
+fi
+AC_CHECK_LIB(history, add_history, [LIBS="$LIBS -lhistory"])
+if test "$ac_cv_lib_readline_readline" = "yes"; then
+	AC_CHECK_HEADERS(readline/readline.h readline/history.h)
+fi
+dnl
+dnl ------ tcpd
+AC_ARG_ENABLE(tcpd,[  --enable-tcpd           enable TCP wrapper for server if available])
+if test "$enable_tcpd" = "yes"; then
+	AC_MSG_CHECKING(for working tcpd.h)
+	oldLibs=$LIBS
+	LIBS="$LIBS -lwrap -lnsl"
+	AC_TRY_LINK([#include <syslog.h>
+	#include <tcpd.h>
+	int allow_severity = LOG_INFO;
+	int deny_severity = LOG_WARNING;],
+	[struct request_info request_info; int i;
+	i = hosts_access(&request_info);],tcpd_ok=1, tcpd_ok=0)
+	if test "$tcpd_ok" = "0"; then
+		AC_MSG_RESULT(no)
+		LIBS=$oldLibs
+	else
+		AC_MSG_RESULT(yes)
+		AC_DEFINE(HAVE_TCPD_H)
+	fi
+fi
+dnl
+dnl ------ Headers
+AC_STDC_HEADERS
+if test "$ac_cv_header_stdc" = "no"; then
+	AC_MSG_WARN(Your system doesn't seem to support ANSI C)
+fi
+dnl
+dnl ------ Threads
+AC_ARG_ENABLE(threads, [  --enable-threads        enable threads if available])
+if test "$enable_threads" = "yes"; then
+	AC_CHECK_HEADERS(pthread.h threads.h)
+	AC_CHECK_FUNC(pthread_mutex_lock)
+	if test "$ac_cv_func_pthread_mutex_lock" = "no"; then
+		AC_CHECK_LIB(pthread, main)
+	fi
+	AC_DEFINE(_REENTRANT)
+fi
+dnl
+dnl retrieval $ILLMODULE server ztest
+SUBDIRS_VAR="util odr $ASNMODULE zutil comstack ccl tab include lib client $DOCMODULE"
+AC_SUBST(SUBDIRS_VAR)
+dnl
+dnl ------ Makefiles
+dnl
+dnl retrieval/Makefile ill/Makefile server/Makefile ztest/Makefile
+AC_OUTPUT(Makefile util/Makefile odr/Makefile z39.50/Makefile asn/Makefile zutil/Makefile comstack/Makefile ccl/Makefile tab/Makefile include/Makefile include/yaz/Makefile lib/Makefile client/Makefile doc/Makefile)
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.am	(revision 21083)
@@ -0,0 +1,28 @@
+## $Id$
+
+docdir=$(pkgdatadir)/doc
+
+doc_DATA = \
+ yaz.sgml yaz.txt yaz.ps profiles.sgml profiles.txt profiles.ps yaz.html \
+ yaz-1.html yaz-2.html yaz-3.html yaz-4.html yaz-5.html \
+ yaz-6.html yaz-7.html yaz-8.html yaz-9.html
+
+EXTRA_DIST = \
+ yaz.sgml yaz.txt yaz.ps profiles.sgml profiles.txt profiles.ps yaz.html \
+ yaz-1.html yaz-2.html yaz-3.html yaz-4.html yaz-5.html \
+ yaz-6.html yaz-7.html yaz-8.html yaz-9.html
+
+yaz.txt: yaz.sgml
+	sgml2txt -f yaz.sgml
+
+yaz.ps: yaz.sgml
+	sgml2latex -o ps yaz.sgml
+
+profiles.txt: profiles.sgml
+	sgml2txt -f profiles.sgml
+
+profiles.ps: profiles.sgml
+	sgml2latex -o ps profiles.sgml
+
+yaz.html: yaz.sgml
+	sgml2html yaz.sgml
Index: /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/Makefile.in	(revision 21083)
@@ -0,0 +1,171 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+docdir = $(pkgdatadir)/doc
+
+doc_DATA =   yaz.sgml yaz.txt yaz.ps profiles.sgml profiles.txt profiles.ps yaz.html  yaz-1.html yaz-2.html yaz-3.html yaz-4.html yaz-5.html  yaz-6.html yaz-7.html yaz-8.html yaz-9.html
+
+
+EXTRA_DIST =   yaz.sgml yaz.txt yaz.ps profiles.sgml profiles.txt profiles.ps yaz.html  yaz-1.html yaz-2.html yaz-3.html yaz-4.html yaz-5.html  yaz-6.html yaz-7.html yaz-8.html yaz-9.html
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+DATA =  $(doc_DATA)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = gtar
+GZIP_ENV = --best
+
+# gsdl - don't bother with docs
+all:
+install:
+clean:
+distclean:
+
+.SUFFIXES:
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-docDATA: $(doc_DATA)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(docdir)
+	@list='$(doc_DATA)'; for p in $$list; do \
+	  if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p"; \
+	    $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(docdir)/$$p; \
+	  else if test -f $$p; then \
+	    echo " $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p"; \
+	    $(INSTALL_DATA) $$p $(DESTDIR)$(docdir)/$$p; \
+	  fi; fi; \
+	done
+
+uninstall-docDATA:
+	@$(NORMAL_UNINSTALL)
+	list='$(doc_DATA)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(docdir)/$$p; \
+	done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = doc
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$file $(distdir)/$$file; \
+	  else \
+	    test -f $(distdir)/$$file \
+	    || ln $$d/$$file $(distdir)/$$file 2> /dev/null \
+	    || cp -p $$d/$$file $(distdir)/$$file || :; \
+	  fi; \
+	done
+
+.PHONY: uninstall-docDATA install-docDATA 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
+
+
+yaz.txt: yaz.sgml
+	sgml2txt -f yaz.sgml
+
+yaz.ps: yaz.sgml
+	sgml2latex -o ps yaz.sgml
+
+profiles.txt: profiles.sgml
+	sgml2txt -f profiles.sgml
+
+profiles.ps: profiles.sgml
+	sgml2latex -o ps profiles.sgml
+
+yaz.html: yaz.sgml
+	sgml2html yaz.sgml
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/doc/profiles.sgml
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/profiles.sgml	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/profiles.sgml	(revision 21083)
@@ -0,0 +1,666 @@
+<!doctype linuxdoc system>
+<article>
+<title>Specifying and Using Application (Database) Profiles
+<author>Index Data, <tt/info@indexdata.dk/
+<date>$Revision$
+<abstract>
+YAZ includes a subsystem to manage complex database records, driven
+by a set of configuration tables that reflect a given profile.
+Multiple database profiles can coexeist in the same server, or even
+the same database. The record management system is responsible for
+associating a given record with a specific profile, and processing it
+accordingly. This document describes the various file formats for data
+and configuration files which are used by the module.
+</abstract>
+
+<toc>
+
+<sect>Warnings
+
+<p>
+<itemize>
+<item>The subsystem descibed herein is under development. Not
+everything may work exactly as decribed, and details of the interface
+may change as the module matures.
+
+<item>The exact workings of the subsystem may depend on the
+application in which it is used. This document focuses on the use of
+the module in the <bf/Zebra/ information server which is distributed by Index
+Data as an independent package.
+</itemize>
+
+<sect>Introduction
+
+<p>
+The retrieval facilities of Z39.50 are extremely flexible and powerful.
+They allow any level of structuring of database records. They allow
+controlled re-use of attribute sets (for searching) and tag sets (for
+retrieval) between application profiles; they allow precise selection
+of the desired sub-elements of a database record; they allow different
+variants of a given data element to be represented and selected in a
+structured way; and finally they allow the exchange of any type and
+amount of data to be represented in a single database record.
+
+These powerful retrieval facilities are a recent addition to the
+protocol, and along with the flexible searching facilities, they make
+the protocol an extremely capable tool for precise, structured
+access to information systems. The retrieval facilities add new
+levels of flexibility and control to the protocol, which add to its
+value outside of its traditional domain of the library systems world.
+
+The new facilities, however, also add new complexity to the protocol,
+which is already troubles by a too-steep learning curve. We have seen
+many good projects severely hindered or even thwarted by the sheer
+complexity of implementing the Z39.50 protocol.
+
+At the same time, we feel that the most complex and powerful
+facilities of the protocol (Explain, structured retrieval, etc.), are
+also what the protocol needs to become more widespread, and to fulfill
+what we perceive to be its most noble potential: To provide
+everybody with standardised, well-structured access to the
+information resources of the world.
+
+The purpose of <bf/YAZ/, then, and of this module as well, is to
+<it/simplify/ the use of the protocol for programmers and
+administrators, by providing simple APIs and configuration systems to
+access the functionality of the protocol. The <bf/Retrieval/ module
+deals specifically with the advanced retrieval functions which were
+added to the protocol with version 3, or Z39.50-1994.
+
+<sect>Overview
+
+<sect1>External Data (record) Representation
+
+<p>
+The <bf/Retrieval/ module will eventually support a wide range of
+input formats, ranging from MARC data to USENET news archives. This
+section introduces what we think of as the <it/canonical/ format - the
+one that gives the most general access to the various elements of the
+retrieval functionality.
+
+The basic model presented by the Z39.50 retrieval system is that of a
+recursively defined tree structure, containing a list of tagged elements,
+which may in turn contain either data or more lists of tagged elements, and
+so forth.
+
+We elect to represent this structuring externally by using an
+&dquot;SGML-like&dquot; syntax. The <it/internal/ representation will
+be discussed later.
+
+Consider a record describing an information resource (such a record is
+sometimes known as a <it/locator record/). It might contain a field
+describing the distributor of the information resource, which might in
+turn be partitioned into various fields providing details about the
+distributor, like this:
+
+<tscreen><verb>
+<Distributor>
+    <Name> USGS/WRD &etago;Name>
+    <Organization> USGS/WRD &etago;Organization>
+    <Street-Address>
+	U.S. GEOLOGICAL SURVEY, 505 MARQUETTE, NW
+    &etago;Street-Address>
+    <City> ALBUQUERQUE &etago;City>
+    <State> NM &etago;State>
+    <Zip-Code> 87102 &etago;Zip-Code>
+    <Country> USA &etago;Country>
+    <Telephone> (505) 766-5560 &etago;Telephone>
+&etago;Distributor>
+</verb></tscreen>
+
+This is how data that the retrieval module reads from an input file
+might look.
+
+Depending on the database profile that is being used, it is likely
+that the data won't look like this when it's transmitted from the
+server to the client, however. Typically, the client will prefer to
+receive the data in a more rigid syntax, such as USMARC or GRS-1. To
+save transmission time and avoid ambiguities of language, the
+individual tags or field names, above, might be translated into
+numbers which are known by both the client and the server (by
+referring to a tag set).
+
+The retrieval module supports various types of conversions that might
+be carried out by the server based on requests from the client. To do
+this, it needs a set of configuration files to describe the
+application profile that the given record adheres to.
+
+<it>
+CAUTION: Because the tables described below serve the dual purpose of
+representing an external application profile and an internal database
+profile, the terminology and structuring used will sometimes be
+somewhat different from the one suggested in the the Z39.50-1995.
+</it>
+
+<sect1>The Abstract Syntax
+
+<p>
+The abstract syntax definition (ARS) is the focal point of the
+application profile description. For a given profile, it may state any
+or all of the following:
+
+<itemize>
+<item>The object identifier of the database schema associated with the
+profile, so that it can be referred to by the client.
+
+<item>The attribute set (which can possibly be a compound of multiple
+sets) which applies in the profile. This is used when indexing and
+searching the records belonging to the given profile.
+
+<item>The Tag set (again, this can consist of several different sets).
+This is used when reading the records from a file, to recognize the
+different tags, and when transmitting the record to the client -
+mapping the tags to their numerical representation, if they are
+known.
+
+<item>The variant set which is used in the profile. This provides a
+vocabulary for specifying the <it/forms/ of data that appear inside
+the records.
+
+<item>Element set names, which are a shorthand way for the client to
+ask for a subset of the data elements contained in a record. Element
+set names, in the retrieval module, are mapped to <it/element
+specifications/, which contain information equivalent to the
+<it/Espec-1/ syntax of Z39.50.
+
+<item>Map tables, which may specify mappings to <it/other/ database
+profiles, if desired.
+
+<item>Possibly, a set of rules describing the mapping of elements to a
+MARC representation.
+
+<item>A list of element description (this is the actual ARS of the
+profile), which lists the ways in which the various tags can be used
+and organized hierarchically.
+</itemize>
+
+Several of the entries above simply refer to other files, which describe the
+given objects.
+
+<sect>The Configuration Files
+
+<p>
+This section describes the syntax and use of the various tables which
+are used by the retrieval module.
+
+The number of different file types may appear daunting at first, but
+each type corresponds fairly clearly to a single aspect of the Z39.50
+retrieval facilities. Further, the average database administrator
+who's simply reusing an existing profile for which tables already
+exist, shouldn't have to worry too much about these tables.
+
+<sect1>The Abstract Syntax (.abs) Files
+
+<p>
+The name of this file type is slightly misleading, since, apart from
+the actual abstract syntax of the profile, it also includes most of
+the other definitions that go into a database profile.
+
+When a record in the canonical, SGML-like format is read from a file
+or from the database, the first tag of the file should reference the
+profile that governs the layout of the record. If the first tag of the
+record is <tt>&lt;gils&gt;</tt>, the system will look for the profile
+definition in the file <tt/gils.abs/. Profile definitions are cached,
+so they only have to be read once during the lifespan of the current
+process.
+
+The file may contain the following directives:
+
+<descrip>
+<tag>name <it/symbolic-name/</tag> This provides a shorthand name or
+description for the profile. Mostly useful for diagnostic purposes.
+
+<tag>reference <it/OID-name/</tag> The reference name of the OID for
+the profile. The reference names can be found in the <bf/util/
+module of <bf/YAZ/.
+
+<tag>attset <it/filename/</tag> The attribute set that is used for
+indexing and searching records belonging to this profile.
+
+<tag>tagset <it/filename/</tag> The tag set (if any) that describe
+that fields of the records.
+
+<tag>varset <it/filename/</tag> The variant set used in the profile.
+
+<tag>maptab <it/filename/</tag> (repeatable) This points to a
+conversion table that might be used if the client asks for the record
+in a different schema from the native one.
+
+<tag>marc <it/filename/</tag> Points to a file containing parameters
+for representing the record contents in the ISO2709 syntax. Read the
+description of the MARC representation facility below.
+
+<tag>esetname <it/name filename/</tag> (repeatable) Associates the
+given element set name with an element selection file. If an (@) is
+given in place of the filename, this corresponds to a null mapping for
+the given element set name.
+
+<tag>elm <it/path name attribute/</tag> (repeatable) Adds an element
+to the abstract record syntax of the schema. The <it/path/ follows the
+syntax which is suggested by the Z39.50 document - that is, a sequence
+of tags separated by slashes (/). Each tag is given as a
+comma-separated pair of tag type and -value surrounded by parenthesis.
+The <it/name/ is the name of the element, and the <it/attribute/
+specifies what attribute to use when indexing the element. A ! in
+place of the attribute name is equivalent to specifying an attribute
+name identical to the element name. A - in place of the attribute name
+specifies that no indexing is to take place for the given element.
+</descrip>
+
+<it>
+NOTE: The mechanism for controlling indexing is inadequate for
+complex databases, and will probably be moved into a separate
+configuration table eventually.
+</it>
+
+The following is an excerpt from the abstract syntax file for the GILS
+profile.
+
+<tscreen><verb>
+name gils
+reference GILS-schema
+attset gils.att
+tagset gils.tag
+varset var1.var
+
+maptab gils-usmarc.map
+
+# Element set names
+
+esetname VARIANT gils-variant.est  # for WAIS-compliance
+esetname B gils-b.est
+esetname G gils-g.est
+esetname W gils-b.est
+esetname F @
+
+elm (1,10)              rank                        -
+elm (1,12)              url                         -
+elm (1,14)              localControlNumber     Local-number
+elm (1,16)              dateOfLastModification Date/time-last-modified
+elm (2,1)               Title                       !
+elm (4,1)               controlIdentifier      Identifier-standard
+elm (2,6)               abstract               Abstract
+elm (4,51)              purpose                     !
+elm (4,52)              originator                  - 
+elm (4,53)              accessConstraints           !
+elm (4,54)              useConstraints              !
+elm (4,70)              availability                -
+elm (4,70)/(4,90)       distributor                 -
+elm (4,70)/(4,90)/(2,7) distributorName             !
+elm (4,70)/(4,90)/(2,10 distributorOrganization     !
+elm (4,70)/(4,90)/(4,2) distributorStreetAddress    !
+elm (4,70)/(4,90)/(4,3) distributorCity             !
+</verb></tscreen>
+
+<sect1>The Attribute Set (.att) Files
+
+<p>
+This file type describes the <bf/Use/ elements of an attribute set.
+It contains the following directives. 
+
+<descrip>
+
+<tag>name <it/symbolic-name/</tag> This provides a shorthand name or
+description for the attribute set. Mostly useful for diagnostic purposes.
+
+<tag>reference <it/OID-name/</tag> The reference name of the OID for
+the attribute set. The reference names can be found in the <bf/util/
+module of <bf/YAZ/.
+
+<tag>ordinal <it/integer/</tag> This value will be used to represent the
+attribute set in the index. Care should be taken that each attribute
+set has a unique ordinal value.
+
+<tag>include <it/filename/</tag> This directive, which can be
+repeated, is used to include another attribute set as a part of the
+current one. This is used when a new attribute set is defined as an
+extension to another set. For instance, many new attribute sets are
+defined as extensions to the <bf/bib-1/ set. This is an important
+feature of the retrieval system of Z39.50, as it ensures the highest
+possible level of interoperability, as those access points of your
+database which are derived from the external set (say, bib-1) can be used
+even by clients who are unaware of the new set.
+
+<tag>att <it/att-value att-name &lsqb;local-value&rsqb;/</tag> This
+repeatable directive
+introduces a new attribute to the set. The attribute value is stored
+in the index (unless a <it/local-value/ is given, in which case this
+is stored). The name is used to refer to the attribute from the
+<it/abstract syntax/.
+</descrip>
+
+This is an excerpt from the GILS attribute set definition. Notice how
+the file describing the <it/bib-1/ attribute set is referenced.
+
+<tscreen><verb>
+name gils
+reference GILS-attset
+include bib1.att
+ordinal 2
+
+att 2001		distributorName
+att 2002		indexTermsControlled
+att 2003		purpose
+att 2004		accessConstraints
+att 2005		useConstraints
+</verb></tscreen>
+
+<sect1>The Tag Set (.tag) Files
+
+<p>
+This file type defines the tagset of the profile, possibly by
+referencing other tag sets (most tag sets, for instance, will include
+tagsetG and tagsetM from the Z39.50 specification. The file may
+contain the following directives.
+
+<descrip>
+<tag>name <it/symbolic-name/</tag> This provides a shorthand name or
+description for the tag set. Mostly useful for diagnostic purposes.
+
+<tag>reference <it/OID-name/</tag> The reference name of the OID for
+the tag set. The reference names can be found in the <bf/util/
+module of <bf/YAZ/.
+
+<tag>type <it/integer/</tag> The type number of the tag within the schema
+profile.
+
+<tag>include <it/filename/</tag> (repeatable) This directive is used
+to include the definitions of other tag sets into the current one.
+
+<tag>tag <it/number names type/</tag> (repeatable) Introduces a new
+tag to the set. The <it/number/ is the tag number as used in the protocol
+(there is currently no mechanism for specifying string tags at this
+point, but this would be quick work to add). The <it/names/ parameter
+is a list of names by which the tag should be recognized in the input
+file format. The names should be separated by slashes (/). The
+<it/type/ is th recommended datatype of the tag. It should be one of
+the following:
+<itemize>
+<item>structured
+<item>string
+<item>numeric
+<item>bool
+<item>oid
+<item>generalizedtime
+<item>intunit
+<item>int
+<item>octetstring
+<item>null
+</itemize>
+</descrip>
+
+The following is an excerpt from the TagsetG definition file.
+
+<tscreen><verb>
+name tagsetg
+reference TagsetG
+type 2
+
+tag	1	title		string
+tag	2	author		string
+tag	3	publicationPlace string
+tag	4	publicationDate	string
+tag	5	documentId	string
+tag	6	abstract	string
+tag	7	name		string
+tag	8	date		generalizedtime
+tag	9	bodyOfDisplay	string
+tag	10	organization	string
+</verb></tscreen>
+
+<sect1>The Variant Set (.var) Files
+
+<p>
+The variant set file is a straightforward representation of the
+variant set definitions associated with the protocol. At present, only
+the <it/Variant-1/ set is known.
+
+These are the directives allowed in the file.
+
+<descrip>
+<tag>name <it/symbolic-name/</tag> This provides a shorthand name or
+description for the variant set. Mostly useful for diagnostic purposes.
+
+<tag>reference <it/OID-name/</tag> The reference name of the OID for
+the variant set, if one is required. The reference names can be found
+in the <bf/util/ module of <bf/YAZ/.
+
+<tag>class <it/integer class-name/</tag> (repeatable) Introduces a new
+class to the variant set.
+
+<tag>type <it/integer type-name datatype/</tag> (repeatable) Addes a
+new type to the current class (the one introduced by the most recent
+<bf/class/ directive). The type names belong to the same name space as
+the one used in the tag set definition file.
+</descrip>
+
+The following is an excerpt from the file describing the variant set
+<it/Variant-1/.
+
+<tscreen><verb>
+name variant-1
+reference Variant-1
+
+class 1 variantId
+
+  type	1	variantId		octetstring
+
+class 2 body
+
+  type	1	iana			string
+  type	2	z39.50			string
+  type	3	other			string
+</verb></tscreen>
+
+<sect1>The Element Set (.est) Files
+
+<p>
+The element set specification files describe a selection of a subset
+of the elements of a database record. The element selection mechanism
+is equivalent to the one supplied by the <it/Espec-1/ syntax of the
+Z39.50 specification. In fact, the internal representation of an
+element set specification is identical to the <it/Espec-1/ structure,
+and we'll refer you to the description of that structure for most of
+the detailed semantics of the directives below.
+
+<it>
+NOTE: Not all of the Espec-1 functionality has been implemented yet.
+The fields that are mentioned below all work as expected, unless
+otherwise is noted.
+</it>
+
+The directives available in the element set file are as follows:
+
+<descrip>
+<tag>defaultVariantSetId <it/OID-name/</tag> If variants are used in
+the following, this should provide the name of the variantset used
+(it's not currently possible to specify a different set in the
+individual variant request). In almost all cases (certainly all
+profiles known to us), the name <tt/Variant-1/ should be given here.
+
+<tag>defaultVariantRequest <it/variant-request/</tag> This directive
+provides a default variant request for
+use when the individual element requests (see below) do not contain a
+variant request. Variant requests consist of a blank-separated list of
+variant components. A variant compont is a comma-separated,
+parenthesized triple of variant class, type, and value (the two former
+values being represented as integers). The value can currently only be
+entered as a string (this will change to depend on the definition of
+the variant in question). The special value (@) is interpreted as a
+null value, however.
+
+<tag>simpleElement <it/path &lsqb;'variant' variant-request&rsqb;/</tag>
+This corresponds to a simple element request in <it/Espec-1/. The
+path consists of a sequence of tag-selectors, where each of these can
+consist of either:
+
+<itemize>
+<item>A simple tag, consisting of a comma-separated type-value pair in
+parenthesis, possibly followed by a colon (:) followed by an
+occurrences-specification (see below). The tag-value can be a number
+or a string. If the first character is an apostrophe ('), this forces
+the value to be interpreted as a string, even if it appears to be numerical.
+
+<item>A WildThing, represented as a question mark (?), possibly
+followed by a colon (:) followed by an occurrences specification (see
+below).
+
+<item>A WildPath, represented as an asterisk (*). Note that the last
+element of the path should not be a wildPath (wildpaths don't work in
+this version).
+</itemize>
+
+The occurrences-specification can be either the string <tt/all/, the
+string <tt/last/, or an explicit value-range. The value-range is
+represented as an integer (the starting point), possibly followed by a
+plus (+) and a second integer (the number of elements, default being
+one).
+
+The variant-request has the same syntax as the defaultVariantRequest
+above. Note that it may sometimes be useful to give an empty variant
+request, simlply to disable the default for a specific set of fields
+(we aren't certain if this is proper <it/Espec-1/, but it works in
+this implementation).
+</descrip>
+
+The following is an example of an element specification belonging to
+the GILS profile.
+
+<tscreen><verb>
+simpleelement (1,10)
+simpleelement (1,12)
+simpleelement (2,1)
+simpleelement (1,14)
+simpleelement (4,1)
+simpleelement (4,52)
+</verb></tscreen>
+
+<sect1>The Schema Mapping (.map) Files
+
+<p>
+Sometimes, the client might want to receive a database record in
+a schema that differs from the native schema of the record. For
+instance, a client might only know how to process WAIS records, while
+the database record is represented in a more specific schema, such as
+GILS. In this module, a mapping of data to one of the MARC formats is
+also thought of as a schema mapping (mapping the elements of the
+record into fields consistent with the given MARC specification, prior
+to actually converting the data to the ISO2709). This use of the
+object identifier for USMARC as a schema identifier represents an
+overloading of the OID which might not be entirely proper. However,
+it represents the dual role of schema and record syntax which
+is assumed by the MARC family in Z39.50.
+
+<it>
+NOTE: The schema-mapping functions are so far limited to a
+straightforward mapping of elements. This should be extended with
+mechanisms for conversions of the element contents, and conditional
+mappings of elements based on the record contents.
+</it>
+
+These are the directives of the schema mapping file format:
+
+<descrip>
+<tag>targetName <it/name/</tag> A symbolic name for the target schema
+of the table. Useful mostly for diagnostic purposes.
+
+<tag>targetRef <it/OID-name/</tag> An OID name for the target schema.
+This is used, for instance, by a server receiving a request to present
+a record in a different schema from the native one. The name, again,
+is found in the <bf/oid/ module of <bf/YAZ/.
+
+<tag>map <it/element-name target-path/</tag> (repeatable) Adds
+an element mapping rule to the table.
+</descrip>
+
+<sect1>The MARC (ISO2709) Representation (.mar) Files
+
+<p>
+This file provides rules for representing a record in the ISO2709
+format. The rules pertain mostly to the values of the constant-length
+header of the record.
+
+<it>NOTE: This will be described better.</it>
+
+<sect>The Input (Data) File Format
+
+<p>
+The retrieval module is designed to manage data derived from a
+variety of different input sources. When used on the client side, the
+source format may be GRS-1 ISO2709. On the server side, the source may
+be a structured ASCII file, augmented by a set of patterns that
+describe the structure of the document.
+
+What we think of as the native source format - the one that is
+guaranteed to provide complete access to the facilities of the module,
+is an &dquot;SGML-like&dquot; syntax, based on an inferred DTD, which
+is in turn based on the profile information from the various files
+mentioned in this document.
+
+Like SGML, an input record consists of tags and data. The tags are
+enclosed by brackets (&lt;...&gt;). As a general rule, each tag should
+be matched by a corresponding close tag, identified by the same tag
+name preceded by a slash (/).
+
+<sect>License
+
+<p>
+Copyright &copy; 1995-2000, Index Data.
+
+This is the Index Data &dquot;P&dquot; license - it applies exclusively to
+the record management module of the YAZ system, and to this
+document.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation, in whole or in part, for any purpose, is hereby granted,
+provided that:
+
+1. This copyright and permission notice appear in all copies of the
+software and its documentation. Notices of copyright or attribution
+which appear at the beginning of any file must remain unchanged.
+
+2. The names of Index Data or the individual authors may not be used to
+endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+<sect>About Index Data
+
+<p>
+Index Data is a consulting and software-development enterprise that
+specialises in library and information management systems. Our
+interests and expertise span a broad range of related fields, and one
+of our primary, long-term objectives is the development of a powerful
+information management
+system with open network interfaces and hypermedia capabilities.
+
+We make this software available free of charge, on a fairly unrestrictive
+license; as a service to the networking community, and to further the
+development of quality software for open network communication.
+
+We'll be happy to answer questions about the software, and about ourselves
+in general.
+
+<tscreen>
+Index Data
+Ryesgade 3
+DK-2200 Copenhagen N
+</tscreen>
+
+<p>
+<tscreen><verb>
+Phone: +45 3536 3672
+Fax  : +45 3536 0449
+Email: info@indexdata.dk
+</verb></tscreen>
+
+</article>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/profiles.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/profiles.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/profiles.txt	(revision 21083)
@@ -0,0 +1,792 @@
+  Specifying and Using Application (Database) Profiles
+  Index Data, info@indexdata.dk
+  $Revision$
+
+  YAZ includes a subsystem to manage complex database records, driven by
+  a set of configuration tables that reflect a given profile.  Multiple
+  database profiles can coexeist in the same server, or even the same
+  database. The record management system is responsible for associating
+  a given record with a specific profile, and processing it accordingly.
+  This document describes the various file formats for data and configu-
+  ration files which are used by the module.
+  ______________________________________________________________________
+
+  Table of Contents
+
+
+  1. Warnings
+
+  2. Introduction
+
+  3. Overview
+
+     3.1 External Data (record) Representation
+     3.2 The Abstract Syntax
+
+  4. The Configuration Files
+
+     4.1 The Abstract Syntax (.abs) Files
+     4.2 The Attribute Set (.att) Files
+     4.3 The Tag Set (.tag) Files
+     4.4 The Variant Set (.var) Files
+     4.5 The Element Set (.est) Files
+     4.6 The Schema Mapping (.map) Files
+     4.7 The MARC (ISO2709) Representation (.mar) Files
+
+  5. The Input (Data) File Format
+
+  6. License
+
+  7. About Index Data
+
+
+
+  ______________________________________________________________________
+
+  1.  Warnings
+
+
+  o  The subsystem descibed herein is under development. Not everything
+     may work exactly as decribed, and details of the interface may
+     change as the module matures.
+
+  o  The exact workings of the subsystem may depend on the application
+     in which it is used. This document focuses on the use of the module
+     in the Zebra information server which is distributed by Index Data
+     as an independent package.
+
+
+  2.  Introduction
+
+  The retrieval facilities of Z39.50 are extremely flexible and
+  powerful.  They allow any level of structuring of database records.
+  They allow controlled re-use of attribute sets (for searching) and tag
+  sets (for retrieval) between application profiles; they allow precise
+  selection of the desired sub-elements of a database record; they allow
+  different variants of a given data element to be represented and
+  selected in a structured way; and finally they allow the exchange of
+  any type and amount of data to be represented in a single database
+  record.
+
+  These powerful retrieval facilities are a recent addition to the
+  protocol, and along with the flexible searching facilities, they make
+  the protocol an extremely capable tool for precise, structured access
+  to information systems. The retrieval facilities add new levels of
+  flexibility and control to the protocol, which add to its value
+  outside of its traditional domain of the library systems world.
+
+  The new facilities, however, also add new complexity to the protocol,
+  which is already troubles by a too-steep learning curve. We have seen
+  many good projects severely hindered or even thwarted by the sheer
+  complexity of implementing the Z39.50 protocol.
+
+  At the same time, we feel that the most complex and powerful
+  facilities of the protocol (Explain, structured retrieval, etc.), are
+  also what the protocol needs to become more widespread, and to fulfill
+  what we perceive to be its most noble potential: To provide everybody
+  with standardised, well-structured access to the information resources
+  of the world.
+
+  The purpose of YAZ, then, and of this module as well, is to simplify
+  the use of the protocol for programmers and administrators, by
+  providing simple APIs and configuration systems to access the
+  functionality of the protocol. The Retrieval module deals specifically
+  with the advanced retrieval functions which were added to the protocol
+  with version 3, or Z39.50-1994.
+
+
+  3.  Overview
+
+  3.1.  External Data (record) Representation
+
+  The Retrieval module will eventually support a wide range of input
+  formats, ranging from MARC data to USENET news archives. This section
+  introduces what we think of as the canonical format - the one that
+  gives the most general access to the various elements of the retrieval
+  functionality.
+
+  The basic model presented by the Z39.50 retrieval system is that of a
+  recursively defined tree structure, containing a list of tagged
+  elements, which may in turn contain either data or more lists of
+  tagged elements, and so forth.
+
+  We elect to represent this structuring externally by using an "SGML-
+  like" syntax. The internal representation will be discussed later.
+
+  Consider a record describing an information resource (such a record is
+  sometimes known as a locator record). It might contain a field
+  describing the distributor of the information resource, which might in
+  turn be partitioned into various fields providing details about the
+  distributor, like this:
+
+
+
+
+
+
+
+
+
+
+
+
+  <Distributor>
+      <Name> USGS/WRD </Name>
+      <Organization> USGS/WRD </Organization>
+      <Street-Address>
+          U.S. GEOLOGICAL SURVEY, 505 MARQUETTE, NW
+      </Street-Address>
+      <City> ALBUQUERQUE </City>
+      <State> NM </State>
+      <Zip-Code> 87102 </Zip-Code>
+      <Country> USA </Country>
+      <Telephone> (505) 766-5560 </Telephone>
+  </Distributor>
+
+
+
+
+  This is how data that the retrieval module reads from an input file
+  might look.
+
+  Depending on the database profile that is being used, it is likely
+  that the data won't look like this when it's transmitted from the
+  server to the client, however. Typically, the client will prefer to
+  receive the data in a more rigid syntax, such as USMARC or GRS-1. To
+  save transmission time and avoid ambiguities of language, the
+  individual tags or field names, above, might be translated into
+  numbers which are known by both the client and the server (by
+  referring to a tag set).
+
+  The retrieval module supports various types of conversions that might
+  be carried out by the server based on requests from the client. To do
+  this, it needs a set of configuration files to describe the
+  application profile that the given record adheres to.
+
+  CAUTION: Because the tables described below serve the dual purpose of
+  representing an external application profile and an internal database
+  profile, the terminology and structuring used will sometimes be
+  somewhat different from the one suggested in the the Z39.50-1995.
+
+
+  3.2.  The Abstract Syntax
+
+  The abstract syntax definition (ARS) is the focal point of the
+  application profile description. For a given profile, it may state any
+  or all of the following:
+
+
+  o  The object identifier of the database schema associated with the
+     profile, so that it can be referred to by the client.
+
+  o  The attribute set (which can possibly be a compound of multiple
+     sets) which applies in the profile. This is used when indexing and
+     searching the records belonging to the given profile.
+
+  o  The Tag set (again, this can consist of several different sets).
+     This is used when reading the records from a file, to recognize the
+     different tags, and when transmitting the record to the client -
+     mapping the tags to their numerical representation, if they are
+     known.
+
+  o  The variant set which is used in the profile. This provides a
+     vocabulary for specifying the forms of data that appear inside the
+     records.
+
+  o  Element set names, which are a shorthand way for the client to ask
+     for a subset of the data elements contained in a record. Element
+     set names, in the retrieval module, are mapped to element
+     specifications, which contain information equivalent to the Espec-1
+     syntax of Z39.50.
+
+  o  Map tables, which may specify mappings to other database profiles,
+     if desired.
+
+  o  Possibly, a set of rules describing the mapping of elements to a
+     MARC representation.
+
+  o  A list of element description (this is the actual ARS of the
+     profile), which lists the ways in which the various tags can be
+     used and organized hierarchically.
+
+  Several of the entries above simply refer to other files, which
+  describe the given objects.
+
+
+  4.  The Configuration Files
+
+  This section describes the syntax and use of the various tables which
+  are used by the retrieval module.
+
+  The number of different file types may appear daunting at first, but
+  each type corresponds fairly clearly to a single aspect of the Z39.50
+  retrieval facilities. Further, the average database administrator
+  who's simply reusing an existing profile for which tables already
+  exist, shouldn't have to worry too much about these tables.
+
+
+  4.1.  The Abstract Syntax (.abs) Files
+
+  The name of this file type is slightly misleading, since, apart from
+  the actual abstract syntax of the profile, it also includes most of
+  the other definitions that go into a database profile.
+
+  When a record in the canonical, SGML-like format is read from a file
+  or from the database, the first tag of the file should reference the
+  profile that governs the layout of the record. If the first tag of the
+  record is <gils>, the system will look for the profile definition in
+  the file gils.abs. Profile definitions are cached, so they only have
+  to be read once during the lifespan of the current process.
+
+  The file may contain the following directives:
+
+
+     name symbolic-name
+        This provides a shorthand name or description for the profile.
+        Mostly useful for diagnostic purposes.
+
+
+     reference OID-name
+        The reference name of the OID for the profile. The reference
+        names can be found in the util module of YAZ.
+
+
+     attset filename
+        The attribute set that is used for indexing and searching
+        records belonging to this profile.
+
+
+     tagset filename
+        The tag set (if any) that describe that fields of the records.
+
+
+     varset filename
+        The variant set used in the profile.
+     maptab filename
+        (repeatable) This points to a conversion table that might be
+        used if the client asks for the record in a different schema
+        from the native one.
+
+
+     marc filename
+        Points to a file containing parameters for representing the
+        record contents in the ISO2709 syntax. Read the description of
+        the MARC representation facility below.
+
+
+     esetname name filename
+        (repeatable) Associates the given element set name with an
+        element selection file. If an (@) is given in place of the
+        filename, this corresponds to a null mapping for the given
+        element set name.
+
+
+     elm path name attribute
+        (repeatable) Adds an element to the abstract record syntax of
+        the schema. The path follows the syntax which is suggested by
+        the Z39.50 document - that is, a sequence of tags separated by
+        slashes (/). Each tag is given as a comma-separated pair of tag
+        type and -value surrounded by parenthesis.  The name is the name
+        of the element, and the attribute specifies what attribute to
+        use when indexing the element. A ! in place of the attribute
+        name is equivalent to specifying an attribute name identical to
+        the element name. A - in place of the attribute name specifies
+        that no indexing is to take place for the given element.
+
+  NOTE: The mechanism for controlling indexing is inadequate for complex
+  databases, and will probably be moved into a separate configuration
+  table eventually.
+
+  The following is an excerpt from the abstract syntax file for the GILS
+  profile.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  name gils
+  reference GILS-schema
+  attset gils.att
+  tagset gils.tag
+  varset var1.var
+
+  maptab gils-usmarc.map
+
+  # Element set names
+
+  esetname VARIANT gils-variant.est  # for WAIS-compliance
+  esetname B gils-b.est
+  esetname G gils-g.est
+  esetname W gils-b.est
+  esetname F @
+
+  elm (1,10)              rank                        -
+  elm (1,12)              url                         -
+  elm (1,14)              localControlNumber     Local-number
+  elm (1,16)              dateOfLastModification Date/time-last-modified
+  elm (2,1)               Title                       !
+  elm (4,1)               controlIdentifier      Identifier-standard
+  elm (2,6)               abstract               Abstract
+  elm (4,51)              purpose                     !
+  elm (4,52)              originator                  -
+  elm (4,53)              accessConstraints           !
+  elm (4,54)              useConstraints              !
+  elm (4,70)              availability                -
+  elm (4,70)/(4,90)       distributor                 -
+  elm (4,70)/(4,90)/(2,7) distributorName             !
+  elm (4,70)/(4,90)/(2,10 distributorOrganization     !
+  elm (4,70)/(4,90)/(4,2) distributorStreetAddress    !
+  elm (4,70)/(4,90)/(4,3) distributorCity             !
+
+
+
+
+
+  4.2.  The Attribute Set (.att) Files
+
+  This file type describes the Use elements of an attribute set.  It
+  contains the following directives.
+
+
+
+     name symbolic-name
+        This provides a shorthand name or description for the attribute
+        set. Mostly useful for diagnostic purposes.
+
+
+     reference OID-name
+        The reference name of the OID for the attribute set. The
+        reference names can be found in the util module of YAZ.
+
+
+     ordinal integer
+        This value will be used to represent the attribute set in the
+        index. Care should be taken that each attribute set has a unique
+        ordinal value.
+
+
+     include filename
+        This directive, which can be repeated, is used to include
+        another attribute set as a part of the current one. This is used
+        when a new attribute set is defined as an extension to another
+        set. For instance, many new attribute sets are defined as
+        extensions to the bib-1 set. This is an important feature of the
+        retrieval system of Z39.50, as it ensures the highest possible
+        level of interoperability, as those access points of your
+        database which are derived from the external set (say, bib-1)
+        can be used even by clients who are unaware of the new set.
+
+
+     att att-value att-name [local-value]
+        This repeatable directive introduces a new attribute to the set.
+        The attribute value is stored in the index (unless a local-value
+        is given, in which case this is stored). The name is used to
+        refer to the attribute from the abstract syntax.
+
+  This is an excerpt from the GILS attribute set definition. Notice how
+  the file describing the bib-1 attribute set is referenced.
+
+
+
+       name gils
+       reference GILS-attset
+       include bib1.att
+       ordinal 2
+
+       att 2001                distributorName
+       att 2002                indexTermsControlled
+       att 2003                purpose
+       att 2004                accessConstraints
+       att 2005                useConstraints
+
+
+
+
+
+  4.3.  The Tag Set (.tag) Files
+
+  This file type defines the tagset of the profile, possibly by
+  referencing other tag sets (most tag sets, for instance, will include
+  tagsetG and tagsetM from the Z39.50 specification. The file may
+  contain the following directives.
+
+
+     name symbolic-name
+        This provides a shorthand name or description for the tag set.
+        Mostly useful for diagnostic purposes.
+
+
+     reference OID-name
+        The reference name of the OID for the tag set. The reference
+        names can be found in the util module of YAZ.
+
+
+     type integer
+        The type number of the tag within the schema profile.
+
+
+     include filename
+        (repeatable) This directive is used to include the definitions
+        of other tag sets into the current one.
+
+
+     tag number names type
+        (repeatable) Introduces a new tag to the set. The number is the
+        tag number as used in the protocol (there is currently no
+        mechanism for specifying string tags at this point, but this
+        would be quick work to add). The names parameter is a list of
+        names by which the tag should be recognized in the input file
+        format. The names should be separated by slashes (/). The type
+        is th recommended datatype of the tag. It should be one of the
+        following:
+
+     o  structured
+
+     o  string
+
+     o  numeric
+
+     o  bool
+
+     o  oid
+
+     o  generalizedtime
+
+     o  intunit
+
+     o  int
+
+     o  octetstring
+
+     o  null
+
+  The following is an excerpt from the TagsetG definition file.
+
+
+
+       name tagsetg
+       reference TagsetG
+       type 2
+
+       tag     1       title           string
+       tag     2       author          string
+       tag     3       publicationPlace string
+       tag     4       publicationDate string
+       tag     5       documentId      string
+       tag     6       abstract        string
+       tag     7       name            string
+       tag     8       date            generalizedtime
+       tag     9       bodyOfDisplay   string
+       tag     10      organization    string
+
+
+
+
+
+  4.4.  The Variant Set (.var) Files
+
+  The variant set file is a straightforward representation of the
+  variant set definitions associated with the protocol. At present, only
+  the Variant-1 set is known.
+
+  These are the directives allowed in the file.
+
+
+     name symbolic-name
+        This provides a shorthand name or description for the variant
+        set. Mostly useful for diagnostic purposes.
+
+
+     reference OID-name
+        The reference name of the OID for the variant set, if one is
+        required. The reference names can be found in the util module of
+        YAZ.
+
+     class integer class-name
+        (repeatable) Introduces a new class to the variant set.
+
+
+     type integer type-name datatype
+        (repeatable) Addes a new type to the current class (the one
+        introduced by the most recent class directive). The type names
+        belong to the same name space as the one used in the tag set
+        definition file.
+
+  The following is an excerpt from the file describing the variant set
+  Variant-1.
+
+
+
+       name variant-1
+       reference Variant-1
+
+       class 1 variantId
+
+         type  1       variantId               octetstring
+
+       class 2 body
+
+         type  1       iana                    string
+         type  2       z39.50                  string
+         type  3       other                   string
+
+
+
+
+
+  4.5.  The Element Set (.est) Files
+
+  The element set specification files describe a selection of a subset
+  of the elements of a database record. The element selection mechanism
+  is equivalent to the one supplied by the Espec-1 syntax of the Z39.50
+  specification. In fact, the internal representation of an element set
+  specification is identical to the Espec-1 structure, and we'll refer
+  you to the description of that structure for most of the detailed
+  semantics of the directives below.
+
+  NOTE: Not all of the Espec-1 functionality has been implemented yet.
+  The fields that are mentioned below all work as expected, unless
+  otherwise is noted.
+
+  The directives available in the element set file are as follows:
+
+
+     defaultVariantSetId OID-name
+        If variants are used in the following, this should provide the
+        name of the variantset used (it's not currently possible to
+        specify a different set in the individual variant request). In
+        almost all cases (certainly all profiles known to us), the name
+        Variant-1 should be given here.
+
+
+     defaultVariantRequest variant-request
+        This directive provides a default variant request for use when
+        the individual element requests (see below) do not contain a
+        variant request. Variant requests consist of a blank-separated
+        list of variant components. A variant compont is a comma-
+        separated, parenthesized triple of variant class, type, and
+        value (the two former values being represented as integers). The
+        value can currently only be entered as a string (this will
+        change to depend on the definition of the variant in question).
+        The special value (@) is interpreted as a null value, however.
+
+
+     simpleElement path ['variant' variant-request]
+        This corresponds to a simple element request in Espec-1. The
+        path consists of a sequence of tag-selectors, where each of
+        these can consist of either:
+
+
+     o  A simple tag, consisting of a comma-separated type-value pair in
+        parenthesis, possibly followed by a colon (:) followed by an
+        occurrences-specification (see below). The tag-value can be a
+        number or a string. If the first character is an apostrophe ('),
+        this forces the value to be interpreted as a string, even if it
+        appears to be numerical.
+
+     o  A WildThing, represented as a question mark (?), possibly
+        followed by a colon (:) followed by an occurrences specification
+        (see below).
+
+     o  A WildPath, represented as an asterisk (*). Note that the last
+        element of the path should not be a wildPath (wildpaths don't
+        work in this version).
+
+        The occurrences-specification can be either the string all, the
+        string last, or an explicit value-range. The value-range is
+        represented as an integer (the starting point), possibly
+        followed by a plus (+) and a second integer (the number of
+        elements, default being one).
+
+        The variant-request has the same syntax as the
+        defaultVariantRequest above. Note that it may sometimes be
+        useful to give an empty variant request, simlply to disable the
+        default for a specific set of fields (we aren't certain if this
+        is proper Espec-1, but it works in this implementation).
+
+  The following is an example of an element specification belonging to
+  the GILS profile.
+
+
+
+       simpleelement (1,10)
+       simpleelement (1,12)
+       simpleelement (2,1)
+       simpleelement (1,14)
+       simpleelement (4,1)
+       simpleelement (4,52)
+
+
+
+
+
+  4.6.  The Schema Mapping (.map) Files
+
+  Sometimes, the client might want to receive a database record in a
+  schema that differs from the native schema of the record. For
+  instance, a client might only know how to process WAIS records, while
+  the database record is represented in a more specific schema, such as
+  GILS. In this module, a mapping of data to one of the MARC formats is
+  also thought of as a schema mapping (mapping the elements of the
+  record into fields consistent with the given MARC specification, prior
+  to actually converting the data to the ISO2709). This use of the
+  object identifier for USMARC as a schema identifier represents an
+  overloading of the OID which might not be entirely proper. However, it
+  represents the dual role of schema and record syntax which is assumed
+  by the MARC family in Z39.50.
+  NOTE: The schema-mapping functions are so far limited to a
+  straightforward mapping of elements. This should be extended with
+  mechanisms for conversions of the element contents, and conditional
+  mappings of elements based on the record contents.
+
+  These are the directives of the schema mapping file format:
+
+
+     targetName name
+        A symbolic name for the target schema of the table. Useful
+        mostly for diagnostic purposes.
+
+
+     targetRef OID-name
+        An OID name for the target schema.  This is used, for instance,
+        by a server receiving a request to present a record in a
+        different schema from the native one. The name, again, is found
+        in the oid module of YAZ.
+
+
+     map element-name target-path
+        (repeatable) Adds an element mapping rule to the table.
+
+
+  4.7.  The MARC (ISO2709) Representation (.mar) Files
+
+  This file provides rules for representing a record in the ISO2709
+  format. The rules pertain mostly to the values of the constant-length
+  header of the record.
+
+  NOTE: This will be described better.
+
+
+  5.  The Input (Data) File Format
+
+  The retrieval module is designed to manage data derived from a variety
+  of different input sources. When used on the client side, the source
+  format may be GRS-1 ISO2709. On the server side, the source may be a
+  structured ASCII file, augmented by a set of patterns that describe
+  the structure of the document.
+
+  What we think of as the native source format - the one that is
+  guaranteed to provide complete access to the facilities of the module,
+  is an "SGML-like" syntax, based on an inferred DTD, which is in turn
+  based on the profile information from the various files mentioned in
+  this document.
+
+  Like SGML, an input record consists of tags and data. The tags are
+  enclosed by brackets (<...>). As a general rule, each tag should be
+  matched by a corresponding close tag, identified by the same tag name
+  preceded by a slash (/).
+
+
+  6.  License
+
+  Copyright (C) 1995-2000, Index Data.
+
+  This is the Index Data "P" license - it applies exclusively to the
+  record management module of the YAZ system, and to this document.
+
+  Permission to use, copy, modify, distribute, and sell this software
+  and its documentation, in whole or in part, for any purpose, is hereby
+  granted, provided that:
+
+  1. This copyright and permission notice appear in all copies of the
+  software and its documentation. Notices of copyright or attribution
+  which appear at the beginning of any file must remain unchanged.
+
+  2. The names of Index Data or the individual authors may not be used
+  to endorse or promote products derived from this software without
+  specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+  WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN
+  NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+  INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
+  ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
+  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+  SOFTWARE.
+
+
+  7.  About Index Data
+
+  Index Data is a consulting and software-development enterprise that
+  specialises in library and information management systems. Our
+  interests and expertise span a broad range of related fields, and one
+  of our primary, long-term objectives is the development of a powerful
+  information management system with open network interfaces and
+  hypermedia capabilities.
+
+  We make this software available free of charge, on a fairly
+  unrestrictive license; as a service to the networking community, and
+  to further the development of quality software for open network
+  communication.
+
+  We'll be happy to answer questions about the software, and about
+  ourselves in general.
+
+
+       Index Data Ryesgade 3 DK-2200 Copenhagen N
+
+
+
+
+
+       Phone: +45 3536 3672
+       Fax  : +45 3536 0449
+       Email: info@indexdata.dk
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-1.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-1.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-1.html	(revision 21083)
@@ -0,0 +1,93 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: Introduction</TITLE>
+ <LINK HREF="yaz-2.html" REL=next>
+
+ <LINK HREF="yaz.html#toc1" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-2.html">Next</A>
+Previous
+<A HREF="yaz.html#toc1">Contents</A>
+<HR>
+<H2><A NAME="s1">1. Introduction</A></H2>
+
+<P>The <B>YAZ</B> toolkit offers several different levels of access to the
+Z39.50 and SR protocols. The level that you need to use depends on
+your requirements, and the role (server or client) that you
+want to implement.
+<P>The basic level, which is independent of the role, consists of three
+primary interfaces:
+<P>
+<UL>
+<LI><B>ASN</B>, which provides a C representation of the Z39.50/SR protocol
+packages (PDUs).</LI>
+<LI><B>ODR</B>, which encodes and decodes the packages according to the BER
+specification.</LI>
+<LI><B>COMSTACK</B>, which exchanges the encoded packages with a peer process
+over a network.</LI>
+</UL>
+<P>The ASN module represents the ASN.1 definition of the
+SR/Z39.50 protocol. It establishes a set of type and
+structure definitions, with one structure for each of the top-level
+PDUs, and one structure or type for each of the contained ASN.1 types.
+For primitive types, or other types that are defined by the ASN.1
+standard itself (such as the EXTERNAL type), the C representation is provided
+by the <B>ODR</B> (Open Data Representation) subsystem.
+<P><B>ODR</B> is a basic mechanism for representing an
+ASN.1 type in the C programming language, and for implementing BER
+encoders and decoders for values of that type. The types defined in
+the <B>ASN</B>
+module generally have the prefix <CODE>Z_</CODE>, and a suffix corresponding to
+the name of the type in the ASN.1
+specification of the protocol (generally Z39.50-1995). In the case of
+base types (those originating in the ASN.1 standard itself), the prefix
+<CODE>Odr_</CODE> is sometimes seen. Either way, look for
+the actual definition in either <CODE>proto.h</CODE> (for the types from the
+protocol), <CODE>odr.h</CODE> (for the primitive ASN.1 types, or <CODE>odr_use.h</CODE> (for the
+ASN.1 <I>useful</I> types). The <B>ASN</B> library also provides functions (which
+are, in turn, defined using <B>ODR</B> primitives) for encoding and decoding data
+values. Their general form is
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int z_xxx(ODR o, Z_xxx **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>(note the lower-case &quot;z&quot; in the function name)
+<P><I>NOTE: If you are using the premade definitions of the <B>ASN</B> module, and
+you are not adding new protocol of your own, the only parts of ODR
+that you need to worry about are documented in section
+<A HREF="yaz-5.html#odr-use">Using ODR</A>.</I>
+<P>When you have created a BER-encoded buffer, you can use the <B>COMSTACK</B>
+subsystem to transmit (or receive) data over the network. The <B>COMSTACK</B>
+module provides simple functions for establishing a connection
+(passively or actively, depending on the role of your application),
+and for exchanging BER-encoded PDUs over that connection. When you
+create a connection endpoint, you need to specify what transport to
+use (OSI or TCP/IP), and which protocol you want to use (SR or
+Z39.50). For the remainer of the connection's lifetime, you don't have
+to worry about the underlying transport protocol at all - the <B>COMSTACK</B>
+will ensure that the correct mechanism is used.
+<P>We call the combined interfaces to <B>ODR</B>, <B>ASN</B>, and <B>COMSTACK</B> the service
+level API. It's the API that most closely models the Z39.50/SR
+service/protocol definition, and it provides unlimited access to all
+fields and facilities of the protocol definitions.
+<P>The reason that the <B>YAZ</B> service-level API is a conglomerate of the
+APIs from three different submodules is twofold. First, we wanted to allow the
+user a choice of different options for each major task. For instance,
+if you don't like the protocol API provided by <B>ODR</B>/<B>ASN</B>, you
+can use SNACC or BERUtils instead, and still have the benefits of the
+transparent transport approach of the <B>COMSTACK</B> module. Secondly,
+we realise that you may have to fit the toolkit into an existing
+event-processing structure, in a way that
+is incompatible with the <B>COMSTACK</B> interface or some other part of <B>YAZ</B>.
+<P>
+<HR>
+<A HREF="yaz-2.html">Next</A>
+Previous
+<A HREF="yaz.html#toc1">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-2.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-2.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-2.html	(revision 21083)
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: Compilation and Installation</TITLE>
+ <LINK HREF="yaz-3.html" REL=next>
+ <LINK HREF="yaz-1.html" REL=previous>
+ <LINK HREF="yaz.html#toc2" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-3.html">Next</A>
+<A HREF="yaz-1.html">Previous</A>
+<A HREF="yaz.html#toc2">Contents</A>
+<HR>
+<H2><A NAME="s2">2. Compilation and Installation</A></H2>
+
+<P>The latest version of the software will generally be found at
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+http://ftp.indexdata.dk/pub/yaz/
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>We have tried our best to keep the software portable, and on many
+platforms, you should be able to compile everything with little or no changes.
+So far, the software has been ported
+to the following platforms with little or no difficulties.
+<P>
+<UL>
+<LI>Unix systems
+<UL>
+<LI>HP/UX</LI>
+<LI>SunOS/Solaris</LI>
+<LI>DEC Unix</LI>
+<LI>Linux</LI>
+<LI>IBM AIX</LI>
+<LI>Data General DG/UX (with some CFLAGS tinkering)</LI>
+<LI>SGI/IRIX</LI>
+<LI>DDE Supermax</LI>
+</UL>
+</LI>
+<LI>Non-unix systems
+<UL>
+<LI>Apple Macintosh (using the Codewarrior programming environment and the
+GUSI socket libraries)</LI>
+<LI>MS Windows 95/NT (Win32)</LI>
+<LI>IBM AS/400</LI>
+</UL>
+</LI>
+</UL>
+<P>If you move the software to other platforms, we'd be grateful if you'd
+let us know about it. If you run into difficulties, we will try to help if we
+can, and if you solve the problems, we would be happy to
+include your fixes in the next release. So far, we have mostly avoided
+#ifdefs for individual platforms, and we'd like to keep it that
+way as far as it makes sense.
+<P>We maintain a mailing-list for the purpose of announcing new releases and
+bug-fixes, as well as general discussion. Subscribe by sending mail to
+<CODE>yaz-request@indexdata.dk</CODE>. General questions and problems can be
+directed at <CODE>yaz-help@indexdata.dk</CODE>, or the address given at the top
+of this document.
+<P>
+<H2><A NAME="ss2.1">2.1 UNIX</A>
+</H2>
+
+<P>Note that if your system doesn't have a native ANSI C compiler, you may
+have to acquire one separately. We recommend gcc.
+<P>For UNIX we use GNU configure to create Makefiles for YAZ.
+Generally it should be sufficient to run configure without options:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+./configure
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The configure script attempts to use use the C compiler specified by
+the <CODE>CC</CODE> environment variable. If not set, GNU C will be used
+if it is available. The <CODE>CFLAGS</CODE> environment variable holds options
+to be passed to the C compiler. If you're using Bourne-compatible shell
+you may pass something like this to use a particular C compiler with
+optimization enabled:
+<BLOCKQUOTE><CODE>
+<PRE>
+  CC=/opt/ccs/bin/cc CFLAGS=-O ./configure
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>To customize <B>YAZ</B> the configure script also accepts a set of options.
+The most important are:
+<P>
+<DL>
+<DT><B><CODE>-</CODE><CODE>-prefix </CODE>path</B><DD><P>Specifies installation prefix. This is
+only needed if you run <CODE>make install</CODE> later to perform a
+"system" installation. The prefix is <CODE>/usr/local</CODE> if not
+specified.
+<P>
+<DT><B><CODE>-</CODE><CODE>-enable-comp </CODE></B><DD><P>YAZ will be built using
+the ASN.1 compiler for YAZ (default). If you wish to use the
+old decoders (in sub directory asn) use <CODE>--disable-comp</CODE> instead.
+<P>
+<DT><B><CODE>-</CODE><CODE>-enable-threads</CODE></B><DD><P>YAZ will be built using
+POSIX threads. Specifically, <CODE>_REENTRANT</CODE> will be defined
+during compilation.
+</DL>
+<P>When configured, build the software by typing:
+<BLOCKQUOTE><CODE>
+<PRE>
+  make
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Developers that do modifications to <B>YAZ</B> may wish to run
+<CODE>make depend</CODE> as well to generate object-header file
+dependencies.
+<P>The following files are generated by make
+<DL>
+<DT><B><CODE>lib/libyaz.a</CODE></B><DD><P>The <B>YAZ</B> programmers' library.
+<P>
+<DT><B><CODE>ztest/yaz-ztest</CODE></B><DD><P>A test Z39.50 server.
+<P>
+<DT><B><CODE>client/yaz-client</CODE></B><DD><P>A command mode Z39.50 client.
+<P>
+<DT><B><CODE>yaz-config</CODE></B><DD><P>A Bourne-shell script that holds build
+settings for <B>YAZ</B>.
+<P>
+</DL>
+<P>If you wish to install <B>YAZ</B> in system directories such as /usr/local/bin,
+/usr/local/lib) you can type:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+  make install
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>You probably need to have root access in order to perform this.
+You must specify the <CODE>--prefix</CODE> option for configure if you
+going to install in anything but /usr/local/.
+<P>
+<H2><A NAME="ss2.2">2.2 WIN32</A>
+</H2>
+
+<P><B>YAZ</B> is shipped with "makefiles" for the NMAKE tool that comes
+with Visual C++.
+<P>Start an MS-DOS prompt and switch the sub directory <CODE>WIN</CODE> where
+the file <CODE>makefile</CODE> is located. Customize the installation
+by editing the <CODE>makefile</CODE> file (for example by using notepad).
+<P>The following summarises the most important settings in that file:
+<P>
+<DL>
+<DT><B><CODE>NEW_Z3950</CODE></B><DD><P>If 1, the auto-generated decoder/encoders
+for Z39.50 as written by the ASN.1 compiler will be used. If 0, the old
+decoders for Z39.50 will be used. Note, when 1, the setting TCL should
+point to the Tcl shell on your system.
+<DT><B><CODE>DEBUG</CODE></B><DD><P>If set to 1, the software is
+compiled with debugging libraries. If set to 0, the software
+is compiled with release (non-debugging) libraries.
+</DL>
+<P>When satisfied with the settings in the makefile type
+<BLOCKQUOTE><CODE>
+<PRE>
+nmake
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The following is generated upon successful compilation:
+<DL>
+<DT><B><CODE>bin/yaz.dll</CODE></B><DD><P>A multithreaded DLL with everything
+except the frontend server library.
+<DT><B><CODE>lib/yaz.lib</CODE></B><DD><P>An import library for <CODE>yaz.dll</CODE>.
+<DT><B><CODE>lib/server.lib</CODE></B><DD><P>The frontend server library.
+<DT><B><CODE>bin/yaz-ztest.exe</CODE></B><DD><P>A test Z39.50 server.
+<DT><B><CODE>bin/yaz-client.exe</CODE></B><DD><P>A command mode Z39.50 client.
+</DL>
+<P>
+<HR>
+<A HREF="yaz-3.html">Next</A>
+<A HREF="yaz-1.html">Previous</A>
+<A HREF="yaz.html#toc2">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-3.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-3.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-3.html	(revision 21083)
@@ -0,0 +1,512 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: The ASN Module</TITLE>
+ <LINK HREF="yaz-4.html" REL=next>
+ <LINK HREF="yaz-2.html" REL=previous>
+ <LINK HREF="yaz.html#toc3" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-4.html">Next</A>
+<A HREF="yaz-2.html">Previous</A>
+<A HREF="yaz.html#toc3">Contents</A>
+<HR>
+<H2><A NAME="s3">3. The ASN Module</A></H2>
+
+<H2><A NAME="ss3.1">3.1 Introduction</A>
+</H2>
+
+<P>The <B>ASN</B> module provides you with a set of C struct definitions for the
+various PDUs of the protocol, as well as for the complex types
+appearing within the PDUs. For the primitive data types, the C
+representation often takes the form of an ordinary C language type,
+such as <CODE>int</CODE>. For ASN.1 constructs that have no direct
+representation in C, such as general octet strings and bit strings,
+the <B>ODR</B> module (see section 
+<A HREF="yaz-5.html#odr">ODR</A>) provides auxiliary
+definitions.
+<P>
+<H2><A NAME="ss3.2">3.2 Preparing PDUs</A>
+</H2>
+
+<P>A structure representing a complex ASN.1 type doesn't in itself contain the
+members of that type. Instead, the structure contains <I>pointers</I> to
+the members of the type. This is necessary, in part, to allow a mechanism for
+specifying which of the optional structure (SEQUENCE) members are
+present, and which are not. It follows that you will need to somehow
+provide space for the individual members of the structure, and
+set the pointers to refer to the members.
+<P>The conversion routines don't care how you allocate and maintain your
+C structures - they just follow the pointers that you provide.
+Depending on the complexity of your application, and your personal
+taste, there are at least three different approaches that you may take
+when you allocate the structures.
+<P>
+<UL>
+<LI>You can use static or automatic local variables in the function that
+prepares the PDU. This is a simple approach, and it provides the most
+efficient form of memory management. While it works well for flat
+PDUs like the InitReqest, it will generally not be sufficient for say,
+the generation of an arbitrarily complex RPN query structure.</LI>
+<LI>You can individually create the structure and its members using the
+<CODE>malloc</CODE>(2) function. If you want to ensure that the data is freed when
+it is no longer needed, you will have to define a function that
+individually releases each member of a structure before freeing the
+structure itself.</LI>
+<LI>You can use the <CODE>odr_malloc()</CODE> function (see section 
+<A HREF="yaz-5.html#odr-use">Using ODR</A> for details). When you use <CODE>odr_malloc()</CODE>, you can release
+all of the
+allocated data in a single operation, independent of any pointers and
+relations between the data. <CODE>odr_malloc()</CODE> is based on a
+&quot;nibble-memory&quot;
+scheme, in which large portions of memory are allocated, and then
+gradually handed out with each call to <CODE>odr_malloc()</CODE>. The next time you
+call <CODE>odr_reset()</CODE>, all of the memory allocated since the last call is
+recycled for future use (actually, it is placed on a free-list).</LI>
+<LI>You can combine all of the methods described here. This will often be
+the most practical approach. For instance, you might use <CODE>odr_malloc()</CODE> to
+allocate an entire structure and some of its elements, while you leave
+other elements pointing to global or per-session default variables.</LI>
+</UL>
+<P>The <B>ASN</B> module provides an important aid in creating new PDUs. For
+each of the PDU types (say, <CODE>Z_InitRequest</CODE>), a function is provided
+that allocates and initializes an instance of that PDU type for you.
+In the case of the InitRequest, the function is simply named
+<CODE>zget_InitRequest()</CODE>, and it sets up reasonable default value for all of
+the mandatory members. The optional members are generally initialized to null
+pointers. This last aspect is very important: it ensures that if the
+PDU definitions are extended after you finish your implementation
+(to accommodate
+new versions of the protocol, say), you won't get into trouble with
+uninitialized pointers in your structures. The functions use
+<CODE>odr_malloc()</CODE> to
+allocate the PDUs and its members, so you can free everything again with a
+single call to <CODE>odr_reset()</CODE>. We strongly recommend that you use the
+<CODE>zget_*</CODE>
+functions whenever you are preparing a PDU (in a C++ API, the
+<CODE>zget_</CODE>
+functions would probably be promoted to constructors for the
+individual types).
+<P>The prototype for the individual PDU types generally look like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Z_&lt;type> *zget_&lt;type>(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>eg.:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Z_InitRequest *zget_InitRequest(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <B>ODR</B> handle should generally be your encoding stream, but it
+needn't be.
+<P>As well as the individual PDU functions, a function <CODE>zget_APDU()</CODE> is
+provided, which allocates a toplevel Z-APDU of the type requested:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Z_APDU *zget_APDU(ODR o, int which);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>which</CODE> parameter is (of course) the discriminator belonging to the
+<CODE>Z_APDU</CODE> CHOICE type. All of the interface described here is provided by
+the <B>ASN</B> module, and you access it through the <CODE>proto.h</CODE> header file.
+<P>
+<H2><A NAME="oid"></A> <A NAME="ss3.3">3.3 Object Identifiers</A>
+</H2>
+
+<P>When you refer to object identifiers in your application, you need to
+be aware that SR and Z39.50 use two different set of OIDs to refer to
+the same objects. To handle this easily, <B>YAZ</B> provides a utility module
+to <B>ASN</B> which provides an internal representation of the OIDs used in
+both protocols. Each oid is described by a structure:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct oident
+{
+    enum oid_proto proto;
+    enum oid_class class;
+    enum oid_value value;
+    int oidsuffix[OID_SIZE];
+    char *desc;
+} oident;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>proto</CODE> field can be set to either <CODE>PROTO_SR</CODE> or
+<CODE>PROTO_Z3950</CODE>. The <CODE>class</CODE> might be, say, <CODE>CLASS_RECSYN</CODE>, and the
+<CODE>value</CODE> might be <CODE>VAL_USMARC</CODE> for the USMARC record format. Functions
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int *oid_ent_to_oid(struct oident *ent, int *dst);
+struct oident *oid_getentbyoid(int *o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>are provided to map between object identifiers and database entries.
+If you store a member of the <CODE>oid_proto</CODE> type in your association
+state information, it's a simple matter, at runtime, to generate the
+correct OID when you need it. For decoding, you can simply ignore the
+proto field, or if you're strict, you can verify that your peer is
+using the OID family from the correct protocol. The <CODE>desc</CODE> field is
+a short, human-readable name for the PDU, useful mainly for diagnostic
+output.
+<P><I>NOTE: The old function oid_getoidbyent still exists but is
+not thread safe. Use oid_ent_to_oid instead and pass an array of
+size OID_SIZE.</I>
+<P><I>NOTE: Plans are underway to merge the two protocols into a single
+definition, with one set of object identifiers. When this happens, the
+oid module will no longer be required to support protocol
+independence, but it should still be useful as a simple OID database.</I>
+<P>
+<H2><A NAME="ss3.4">3.4 EXTERNAL Data</A>
+</H2>
+
+<P>In order to achieve extensibility and adaptability to different
+application domains, the new version of the protocol defines many
+structures outside of the main ASN.1 specification, referencing them
+through ASN.1 EXTERNAL constructs. To simplify the construction and access
+to the externally referenced data, the <B>ASN</B> module defines a
+specialized version of the EXTERNAL construct, called <CODE>Z_External</CODE>.
+It is defined thus:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct Z_External
+{
+    Odr_oid *direct_reference;
+    int *indirect_reference;
+    char *descriptor;
+    enum
+    {
+        /* Generic types */
+        Z_External_single = 0,
+        Z_External_octet,
+        Z_External_arbitrary,
+
+        /* Specific types */
+        Z_External_SUTRS,
+        Z_External_explainRecord,
+        Z_External_resourceReport1,
+        Z_External_resourceReport2
+
+        ...
+
+    } which;
+    union
+    {
+        /* Generic types */
+        Odr_any *single_ASN1_type;
+        Odr_oct *octet_aligned;
+        Odr_bitmask *arbitrary;
+
+        /* Specific types */
+        Z_SUTRS *sutrs;
+        Z_ExplainRecord *explainRecord;
+        Z_ResourceReport1 *resourceReport1;
+        Z_ResourceReport2 *resourceReport2;
+
+        ...
+
+    } u;
+} Z_External;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>When decoding, the <B>ASN</B> module will attempt to determine which
+syntax describes the data by looking at the reference fields
+(currently only the direct-reference). For ASN.1 structured data, you
+need only consult the <CODE>which</CODE> field to determine the type of data.
+You can the access  the data directly through the union. When
+constructing data for encoding, you set the union pointer to point to
+the data, and set the <CODE>which</CODE> field accordingly. Remember also to
+set the direct (or indirect) reference to the correct OID for the data
+type. For non-ASN.1 data such as MARC records, use the
+<CODE>octet_aligned</CODE> arm of the union.
+<P>Some servers return ASN.1 structured data values (eg. database
+records) as BER-encoded records placed in the <CODE>octet-aligned</CODE>
+branch of the EXTERNAL CHOICE. The ASN-module will <I>not</I>
+automatically decode these records. To help you decode the records in
+the application, the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Z_ext_typeent *z_ext_gettypebyref(oid_value ref);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Can be used to retrieve information about the known, external data
+types. The function return a pointer to a static area, or NULL, if no
+match for the given direct reference is found. The <CODE>Z_ext_typeent</CODE>
+is defined as:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct Z_ext_typeent
+{
+    oid_value dref;    /* the direct-reference OID value. */
+    int what;          /* discriminator value for the external CHOICE */
+    Odr_fun fun;       /* decoder function */
+} Z_ext_typeent;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>what</CODE> member contains the Z_External union discriminator value
+for the given type: For the SUTRS record syntax, the value would be
+<CODE>Z_External_sutrs</CODE>. The <CODE>fun</CODE> member contains a pointer to the
+function which encodes/decodes the given type. Again, for the SUTRS
+record syntax, the value of <CODE>fun</CODE> would be <CODE>z_SUTRS</CODE> (a function
+pointer).
+<P>If you receive an EXTERNAL which contains an octet-string value that
+you suspect of being an ASN.1-structured data value, you can use
+<CODE>z_ext_gettypebyref</CODE> to look for the provided direct-reference. If
+the return value is different from NULL, you can use the provided
+function to decode the BER string (see section 
+<A HREF="yaz-5.html#odr-use">Using ODR</A>). 
+<P>If you want to <I>send</I> EXTERNALs containing ASN.1-structured values
+in the occtet-aligned branch of the CHOICE, this is possible too.
+However, on the encoding phase, it requires a somewhat involved
+juggling around of the various buffers involved.
+<P>If you need to add new, externally defined data types, you must update
+the struct above, in the source file <CODE>prt-ext.h</CODE>, as well as the
+encoder/decoder in the file <CODE>prt-ext.c</CODE>. When changing the latter,
+remember to update both the <CODE>arm</CODE> arrary and the list <CODE>type_table</CODE>,
+which drives the CHOICE biasing that is necessary to tell the
+different, structured types apart on decoding.
+<P><I>NOTE: Eventually, the EXTERNAL processing will most likely
+automatically insert the correct OIDs or indirect-refs. First,
+however, we need to determine how application-context management
+(specifically the presentation-context-list) should fit into the
+various modules.</I>
+<P>
+<H2><A NAME="ss3.5">3.5 PDU Contents Table</A>
+</H2>
+
+<P>We include, for reference, a listing of the fields of each top-level
+PDU, as well as their default settings.
+<P>
+<PRE>
+Z_InitRequest
+-------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+protocolVersion              Odr_bitmask         Empty bitmask
+options                      Odr_bitmask         Empty bitmask
+preferredMessageSize         int                 30*1024
+maximumRecordSize            int                 30*1024
+idAuthentication             Z_IdAuthentication  NULL
+implementationId             char*               "YAZ (id=81)"
+implementationName           char*               "Index Data/YAZ"
+implementationVersion        char*               YAZ_VERSION
+userInformationField         Z_UserInformation   NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_InitResponse
+--------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+protocolVersion              Odr_bitmask         Empty bitmask
+options                      Odr_bitmask         Empty bitmask
+preferredMessageSize         int                 30*1024
+maximumRecordSize            int                 30*1024
+result                       bool_t              TRUE
+implementationId             char*               "YAZ (id=81)"
+implementationName           char*               "Index Data/YAZ"
+implementationVersion        char*               YAZ_VERSION
+userInformationField         Z_UserInformat..    NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_SearchRequest
+---------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+smallSetUpperBound           int                 0
+largeSetLowerBound           int                 1
+mediumSetPresentNumber       int                 0
+replaceIndicator             bool_t              TRUE
+resultSetName                char*               "default"
+num_databaseNames            int                 0
+databaseNames                char**              NULL
+smallSetElementSetNames      Z_ElementSetNames   NULL
+mediumSetElementSetNames     Z_ElementSetNames   NULL
+preferredRecordSyntax        Odr_oid             NULL
+query                        Z_Query             NULL
+additionalSearchInfo         Z_OtherInformation  NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_SearchResponse
+----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+resultCount                  int                 0
+numberOfRecordsReturned      int                 0
+nextResultSetPosition        int                 0
+searchStatus                 bool_t              TRUE
+resultSetStatus              int                 NULL
+presentStatus                int                 NULL
+records                      Z_Records           NULL
+additionalSearchInfo         Z_OtherInformation  NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_PresentRequest
+----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+resultSetId                  char*               "default"
+resultSetStartPoint          int                 1
+numberOfRecordsRequested     int                 10
+num_ranges                   int                 0
+additionalRanges             Z_Range             NULL
+recordComposition            Z_RecordComposition NULL
+preferredRecordSyntax        Odr_oid             NULL
+maxSegmentCount              int                 NULL
+maxRecordSize                int                 NULL
+maxSegmentSize               int                 NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_PresentResponse
+-----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+numberOfRecordsReturned      int                 0
+nextResultSetPosition        int                 0
+presentStatus                int                 Z_PRES_SUCCESS
+records                      Z_Records           NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_DeleteResultSetRequest
+------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+deleteFunction               int                 Z_DeleteRequest_list
+num_ids                      int                 0
+resultSetList                char**              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_DeleteResultSetResponse
+-------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+deleteOperationStatus        int                 Z_DeleteStatus_success
+num_statuses                 int                 0
+deleteListStatuses           Z_ListStatus**      NULL
+numberNotDeleted             int                 NULL
+num_bulkStatuses             int                 0
+bulkStatuses                 Z_ListStatus        NULL
+deleteMessage                char*               NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ScanRequest
+-------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+num_databaseNames            int                 0
+databaseNames                char**              NULL
+attributeSet                 Odr_oid             NULL
+termListAndStartPoint        Z_AttributesPlus... NULL
+stepSize                     int                 NULL
+numberOfTermsRequested       int                 20
+preferredPositionInResponse  int                 NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ScanResponse
+--------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+stepSize                     int                 NULL
+scanStatus                   int                 Z_Scan_success
+numberOfEntriesReturned      int                 0
+positionOfTerm               int                 NULL
+entries                      Z_ListEntris        NULL
+attributeSet                 Odr_oid             NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_TriggerResourceControlRequest
+-------------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+requestedAction              int                 Z_TriggerResourceCtrl_resou..
+prefResourceReportFormat     Odr_oid             NULL
+resultSetWanted              bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ResourceControlRequest
+------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+suspendedFlag                bool_t              NULL
+resourceReport               Z_External          NULL
+partialResultsAvailable      int                 NULL
+responseRequired             bool_t              FALSE
+triggeredRequestFlag         bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ResourceControlResponse
+-------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+continueFlag                 bool_t              TRUE
+resultSetWanted              bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_AccessControlRequest
+----------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+which                        enum                Z_AccessRequest_simpleForm;
+u                            union               NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_AccessControlResponse
+-----------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+which                        enum                Z_AccessResponse_simpleForm
+u                            union               NULL
+diagnostic                   Z_DiagRec           NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_Segment
+---------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+numberOfRecordsReturned      int                 value=0
+num_segmentRecords           int                 0
+segmentRecords               Z_NamePlusRecord    NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_Close
+-------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+closeReason                  int                 Z_Close_finished
+diagnosticInformation        char*               NULL
+resourceReportFormat         Odr_oid             NULL
+resourceFormat               Z_External          NULL
+otherInfo                    Z_OtherInformation  NULL
+</PRE>
+<P>
+<HR>
+<A HREF="yaz-4.html">Next</A>
+<A HREF="yaz-2.html">Previous</A>
+<A HREF="yaz.html#toc3">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-4.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-4.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-4.html	(revision 21083)
@@ -0,0 +1,564 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: Supporting Tools</TITLE>
+ <LINK HREF="yaz-5.html" REL=next>
+ <LINK HREF="yaz-3.html" REL=previous>
+ <LINK HREF="yaz.html#toc4" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-5.html">Next</A>
+<A HREF="yaz-3.html">Previous</A>
+<A HREF="yaz.html#toc4">Contents</A>
+<HR>
+<H2><A NAME="s4">4. Supporting Tools</A></H2>
+
+<P>In support of the service API - primarily the ASN module, which
+provides the programmatic interface to the Z39.50 APDUs, YAZ contains
+a collection of tools that support the development of applications.
+<P>
+<H2><A NAME="ss4.1">4.1 Query Syntax Parsers</A>
+</H2>
+
+<P>Since the type-1 (RPN) query structure has no direct, useful string
+representation, every origin application needs to provide some form of
+mapping from a local query notation or representation to a
+<CODE>Z_RPNQuery</CODE> structure. Some programmers will prefer to construct
+the query manually, perhaps using <CODE>odr_malloc()</CODE> to simplify memory
+management. The YAZ distribution includes two separate,
+query-generating tools that may be of use to you.
+<P>
+<H3>Prefix Query Format</H3>
+
+<P>Since RPN or reverse polish notation is really just a fancy way of
+describing a suffix notation format (operator follows operands), it
+would seem that the confusion is total when we now introduce a prefix
+notation for RPN. The reason is one of simple laziness - it's somewhat
+simpler to interpret a prefix format, and this utility was designed
+for maximum simplicity, to provide a baseline representation for use
+in simple test applications and scripting environments (like Tcl). The
+demonstration client included with YAZ uses the PQF.
+<P>The PQF is defined by the pquery module in the YAZ library. The
+<CODE>pquery.h</CODE> file provides the declaration of the functions
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
+
+Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+      Odr_oid **attributeSetP, const char *qbuf);
+
+int p_query_attset (const char *arg);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The function <CODE>p_query_rpn()</CODE> takes as arguments an <B>ODR</B> stream
+(see section 
+<A HREF="yaz-5.html#odr">The ODR Module</A>) to provide a memory
+source (the structure created is released on the next call to
+<CODE>odr_reset()</CODE> on the stream/), a protocol identifier (one of the
+constants <CODE>PROTO_Z3950</CODE> and <CODE>PROTO_SR</CODE>), an attribute set
+reference, and finally a null-terminated string holding the query
+string.
+<P>If the parse went well, <CODE>p_query_rpn()</CODE> returns a pointer to a
+<CODE>Z_RPNQuery</CODE> structure which can be placed directly into a
+<CODE>Z_SearchRequest</CODE>.
+<P>The <CODE>p_query_attset</CODE> specifies which attribute set to use if
+the query doesn't specify one by the <CODE>@attrset</CODE> operator. The
+<CODE>p_query_attset</CODE> returns 0 if the argument is a valid attribute
+set specifier; otherwise the function returns -1.
+<P>The grammar of the PQF is as follows:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Query ::= [ AttSet ] QueryStruct.
+
+AttSet ::= string.
+
+QueryStruct ::= { Attribute } Simple | Complex.
+
+Attribute ::= '@attr' AttributeType '=' AttributeValue.
+
+AttributeType ::= integer.
+
+AttributeValue ::= integer.
+
+Complex ::= Operator QueryStruct QueryStruct.
+
+Operator ::= '@and' | '@or' | '@not' | '@prox' Proximity.
+
+Simple ::= ResultSet | Term.
+
+ResultSet ::= '@set' string.
+
+Term ::= string | '"' string '"'.
+
+Proximity ::= Exclusion Distance Ordered Relation WhichCode UnitCode.
+
+Exclusion ::= '1' | '0' | 'void'.
+
+Distance ::= integer.
+
+Ordered ::= '1' | '0'.
+
+Relation ::= integer.
+
+WhichCode ::= 'known' | 'private' | integer.
+
+UnitCode ::= integer.
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>You will note that the syntax above is a fairly faithful
+representation of RPN, except for the <CODE>Attibute</CODE>, which has been
+moved a step away from the term, allowing you to associate one or more
+attributes with an entire query structure. The parser will
+automatically apply the given attributes to each term as required.
+<P>The following are all examples of valid queries in the PQF.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+dylan
+
+"bob dylan"
+
+@or "dylan" "zimmerman"
+
+@set Result-1
+
+@or @and bob dylan @set Result-1
+
+@attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
+
+@attr 4=1 @attr 1=4 "self portrait"
+
+@prox 0 3 1 2 k 2 dylan zimmerman
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H3>Common Command Language</H3>
+
+<P>Not all users enjoy typing in prefix query structures and numerical
+attribute values, even in a minimalistic test client. In the library
+world, the more intuitive Common Command Language (or ISO 8777) has
+enjoyed some popularity - especially before the widespread
+availability of graphical interfaces. It is still useful in
+applications where you for some reason or other need to provide a
+symbolic language for expressing boolean query structures.
+<P>The EUROPAGATE research project working under the Libraries programme
+of the European Commission's DG XIII has, amongst other useful tools,
+implemented a general-purpose CCL parser which produces an output
+structure that can be trivially converted to the internal RPN
+representation of YAZ (The <CODE>Z_RPNQuery</CODE> structure). Since the CCL
+utility - along with the rest of the software produced by EUROPAGATE -
+is made freely available on a liberal license, it is included as a
+supplement to YAZ.
+<P>
+<H3>CCL Syntax</H3>
+
+<P>The CCL parser obeys the following grammar for the FIND argument.
+The syntax is annotated by in the lines prefixed by <CODE>--</CODE>.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+CCL-Find ::= CCL-Find Op Elements
+           | Elements.
+
+Op ::= "and" | "or" | "not"
+-- The above means that Elements are separated by boolean operators.
+
+Elements ::= '(' CCL-Find ')'
+           | Set
+           | Terms
+           | Qualifiers Relation Terms
+           | Qualifiers Relation '(' CCL-Find ')'
+           | Qualifiers '=' string '-' string
+-- Elements is either a recursive definition, a result set reference, a
+-- list of terms, qualifiers followed by terms, qualifiers followed
+-- by a recursive definition or qualifiers in a range (lower - upper).
+
+Set ::= 'set' = string
+-- Reference to a result set
+
+Terms ::= Terms Prox Term
+        | Term
+-- Proximity of terms.
+
+Term ::= Term string
+       | string
+-- This basically means that a term may include a blank
+
+Qualifiers ::= Qualifiers ',' string
+             | string
+-- Qualifiers is a list of strings separated by comma
+
+Relation ::= '=' | '>=' | '&lt;=' | '&lt;>' | '>' | '&lt;'
+-- Relational operators. This really doesn't follow the ISO8777
+-- standard.
+
+Prox ::= '%' | '!'
+-- Proximity operator
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The following queries are all valid:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+dylan
+
+"bob dylan"
+
+dylan or zimmerman
+
+set=1
+
+(dylan and bob) or set=1
+</PRE>
+</CODE></BLOCKQUOTE>
+
+Assuming that the qualifiers <CODE>ti</CODE>, <CODE>au</CODE> and <CODE>date</CODE> 
+are defined we may use:
+<BLOCKQUOTE><CODE>
+<PRE>
+ti=self portrait
+
+au=(bob dylan and slow train coming)
+
+date>1980 and (ti=((self portrait)))
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H3>CCL Qualifiers</H3>
+
+<P>
+<P>Qualifiers are used to direct the search to a particular searchable
+index, such as title (ti) and author indexes (au). The CCL standard
+itself doesn't specify a particular set of qualifiers, but it does
+suggest a few short-hand notations. You can customize the CCL parser
+to support a particular set of qualifiers to relect the current target
+profile. Traditionally, a qualifier would map to a particular
+use-attribute within the BIB-1 attribute set. However, you could also
+define qualifiers that would set, for example, the
+structure-attribute.
+<P>Consider a scenario where the target support ranked searches in the
+title-index. In this case, the user could specify
+<BLOCKQUOTE><CODE>
+<PRE>
+ti,ranked=knuth computer
+</PRE>
+</CODE></BLOCKQUOTE>
+
+and the <CODE>ranked</CODE> would map to structure=free-form-text
+(4=105) and the <CODE>ti</CODE> would map to title (1=4).
+<P>A "profile" with a set predefined CCL qualifiers can be read from a
+file. The YAZ client reads its CCL qualifiers from a file named
+<CODE>default.bib</CODE>. Each line in the file has the form:
+<P><I>qualifier-name</I>    <I>type</I>=<I>val</I> <I>type</I>=<I>val</I> ...
+<P>where <I>qualifier-name</I> is the name of the qualifier to be used
+(eg. <CODE>ti</CODE>), <I>type</I> is a BIB-1 category type and <I>val</I> is the
+corresponding BIB-1 attribute value. The <I>type</I> can be either
+numeric or it may be either <CODE>u</CODE> (use), <CODE>r</CODE> (relation), <CODE>p</CODE>
+(position), <CODE>s</CODE> (structure), <CODE>t</CODE> (truncation) or <CODE>c</CODE>
+(completeness). The <I>qualifier-name</I> <CODE>term</CODE> has a special
+meaning. The types and values for this definition is used when <I>no</I>
+qualifier is present.
+<P>Consider the following definition:
+<BLOCKQUOTE><CODE>
+<PRE>
+ti       u=4 s=1
+au       u=1 s=1
+term     s=105
+</PRE>
+</CODE></BLOCKQUOTE>
+
+Two qualifiers are defined, <CODE>ti</CODE> and <CODE>au</CODE>. They both set the
+structure-attribute to phrase (1). <CODE>ti</CODE> sets the use-attribute to
+4. <CODE>au</CODE> sets the use-attribute to 1. When no qualifiers are used
+in the query the structure-attribute is set to free-form-text (105).
+<P>
+<H3>CCL API</H3>
+
+<P>
+<P>All public definitions can be found in the header file <CODE>ccl.h</CODE>.
+A profile identifier is of type <CODE>CCL_bibset</CODE>. A profile must be
+created with the call to the function <CODE>ccl_qual_mk</CODE> which returns
+a profile handle of type <CODE>CCL_bibset</CODE>.
+<P>To read a file containing qualifier definitions the function
+<CODE>ccl_qual_file</CODE> may be convenient. This function takes an already
+opened <CODE>FILE</CODE> handle pointer as argument along with a
+<CODE>CCL_bibset</CODE> handle.
+<P>To parse a simple string with a FIND query use the function
+<BLOCKQUOTE><CODE>
+<PRE>
+struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
+                                   int *error, int *pos);
+</PRE>
+</CODE></BLOCKQUOTE>
+
+which takes the CCL profile (<CODE>bibset</CODE>) and query (<CODE>str</CODE>) as
+input. Upon successful completion the RPN tree is returned. If an
+error eccur, such as a syntax error, the integer pointed to by
+<CODE>error</CODE> holds the error code and <CODE>pos</CODE> holds the offset inside
+query string in which the parsing failed.
+<P>An english representation of the error may be obtained by calling
+the <CODE>ccl_err_msg</CODE> function. The error codes are listed in
+<CODE>ccl.h</CODE>.
+<P>To convert the CCL RPN tree (type <CODE>struct ccl_rpn_node *</CODE>) to the
+Z_RPNQuery of YAZ the function <CODE>ccl_rpn_query</CODE> must be used. This
+function which is part of YAZ is implemented in <CODE>yaz-ccl.c</CODE>.
+After calling this function the CCL RPN tree is probably no longer
+needed. The <CODE>ccl_rpn_delete</CODE> destroys the CCL RPN tree.
+<P>A CCL profile may be destroyed by calling the <CODE>ccl_qual_rm</CODE>
+function.
+<P>The token names for the CCL operators may be changed by setting the
+globals (all type <CODE>char *</CODE>) <CODE>ccl_token_and</CODE>, <CODE>ccl_token_or</CODE>,
+<CODE>ccl_token_not</CODE> and <CODE>ccl_token_set</CODE>.
+An operator may have aliases, i.e. there may be more than one name for
+the operator. To do this, separate each alias with a space character.
+<P>
+<H2><A NAME="ss4.2">4.2 Object Identifiers</A>
+</H2>
+
+<P>The basic YAZ representation of an OID is an array of integers,
+terminated with the value -1. The <B>ODR</B> module provides two
+utility-functions to create and copy this type of data elements:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Odr_oid *odr_getoidbystr(ODR o, char *str);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Creates an OID based on a string-based representation using dots (.)
+to separate elements in the OID.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Creates a copy of the OID referenced by the <I>o</I> parameter. Both
+functions take an <B>ODR</B> stream as parameter. This stream is used to
+allocate memory for the data elements, which is released on a
+subsequent call to <CODE>odr_reset()</CODE> on that stream.
+<P>The <B>OID</B> module provides a higher-level representation of the
+family of object identifers which describe the Z39.50 protocol and its
+related objects. The definition of the module interface is given in
+the <CODE>oid.h</CODE> file.
+<P>The interface is mainly based on the <CODE>oident</CODE> structure. The
+definition of this structure looks like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct oident
+{
+    oid_proto proto;
+    oid_class oclass;
+    oid_value value;
+    int oidsuffix[OID_SIZE];
+    char *desc;
+} oident;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <I>proto</I> field takes one of the values
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+PROTO_Z3950
+PROTO_SR
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>If you don't care about talking to SR-based implementations (few
+exist, and they may become fewer still if and when the ISO SR and ANSI
+Z39.50 documents are merged into a single standard), you can ignore
+this field on incoming packages, and always set it to PROTO_Z3950
+for outgoing packages.
+<P>The <I>oclass</I> field takes one of the values
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+CLASS_APPCTX
+CLASS_ABSYN
+CLASS_ATTSET
+CLASS_TRANSYN
+CLASS_DIAGSET
+CLASS_RECSYN
+CLASS_RESFORM
+CLASS_ACCFORM
+CLASS_EXTSERV
+CLASS_USERINFO
+CLASS_ELEMSPEC
+CLASS_VARSET
+CLASS_SCHEMA
+CLASS_TAGSET
+CLASS_GENERAL
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>corresponding to the OID classes defined by the Z39.50 standard.
+<P>Finally, the <I>value</I> field takes one of the values
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+VAL_APDU
+VAL_BER
+VAL_BASIC_CTX
+VAL_BIB1
+VAL_EXP1
+VAL_EXT1
+VAL_CCL1
+VAL_GILS
+VAL_WAIS
+VAL_STAS
+VAL_DIAG1
+VAL_ISO2709
+VAL_UNIMARC
+VAL_INTERMARC
+VAL_CCF
+VAL_USMARC
+VAL_UKMARC
+VAL_NORMARC
+VAL_LIBRISMARC
+VAL_DANMARC
+VAL_FINMARC
+VAL_MAB
+VAL_CANMARC
+VAL_SBN
+VAL_PICAMARC
+VAL_AUSMARC
+VAL_IBERMARC
+VAL_EXPLAIN
+VAL_SUTRS
+VAL_OPAC
+VAL_SUMMARY
+VAL_GRS0
+VAL_GRS1
+VAL_EXTENDED
+VAL_RESOURCE1
+VAL_RESOURCE2
+VAL_PROMPT1
+VAL_DES1
+VAL_KRB1
+VAL_PRESSET
+VAL_PQUERY
+VAL_PCQUERY
+VAL_ITEMORDER
+VAL_DBUPDATE
+VAL_EXPORTSPEC
+VAL_EXPORTINV
+VAL_NONE
+VAL_SETM
+VAL_SETG
+VAL_VAR1
+VAL_ESPEC1
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>again, corresponding to the specific OIDs defined by the standard.
+<P>The <I>desc</I> field contains a brief, mnemonic name for the OID in
+question.
+<P>The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+struct oident *oid_getentbyoid(int *o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>takes as argument an OID, and returns a pointer to a static area
+containing an <CODE>oident</CODE> structure. You typically use this function
+when you receive a PDU containing an OID, and you wish to branch out
+depending on the specific OID value.
+<P>The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int *oid_ent_to_oid(struct oident *ent, int *dst);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Takes as argument an <CODE>oident</CODE> structure - in which the <I>proto</I>,
+<I>oclass</I>, and <I>value</I> fields are assumed to be set correctly -
+and returns a pointer to a the buffer as given by <I>dst</I> 
+containing the base
+representation of the corresponding OID. The function returns
+NULL and the array dst is unchanged if a mapping couldn't place.
+The array <I>dst</I> should be at least of size <CODE>OID_SIZE</CODE>.
+<P>The <CODE>oid_ent_to_oid()</CODE> function can be used whenever you need to
+prepare a PDU containing one or more OIDs. The separation of the
+<I>protocol</I> element from the remainer of the OID-description makes
+it simple to write applications that can communicate with either
+Z39.50 or OSI SR-based applications.
+<P>The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+oid_value oid_getvalbyname(const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>takes as argument a mnemonic OID name, and returns the <I>value</I>
+field of the first entry in the database that contains the given name
+in its <I>desc</I> field.
+<P>Finally, the module provides the following utility functions, whose
+meaning should be obvious:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void oid_oidcpy(int *t, int *s);
+void oid_oidcat(int *t, int *s);
+int oid_oidcmp(int *o1, int *o2);
+int oid_oidlen(int *o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P><I>NOTE: The <B>OID</B> module has been criticized - and perhaps rightly so
+- for needlessly abstracting the
+representation of OIDs. Other toolkits use a simple
+string-representation of OIDs with good results. In practice, we have
+found the interface comfortable and quick to work with, and it is a
+simple matter (for what it's worth) to create applications compatible
+with both ISO SR and Z39.50. Finally, the use of the <CODE>oident</CODE>
+database is by no means mandatory. You can easily create your
+own system for representing OIDs, as long as it is compatible with the
+low-level integer-array representation of the ODR module.</I>
+<P>
+<H2><A NAME="ss4.3">4.3 Nibble Memory</A>
+</H2>
+
+<P>Sometimes when you need to allocate and construct a large,
+interconnected complex of structures, it can be a bit of a pain to
+release the associated memory again. For the structures describing the
+Z39.50 PDUs and related structures, it is convenient to use the
+memory-management system of the <B>ODR</B> subsystem (see
+<A HREF="yaz-5.html#odr-use">Using ODR</A>). However, in some circumstances
+where you might otherwise benefit from using a simple nibble memory
+management system, it may be impractical to use <CODE>odr_malloc()</CODE> and
+<B>odr_reset()</B>. For this purpose, the memory manager which also
+supports the <B>ODR</B> streams is made available in the <B>NMEM</B>
+module. The external interface to this module is given in the
+<CODE>nmem.h</CODE> file.
+<P>The following prototypes are given:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+NMEM nmem_create(void);
+void nmem_destroy(NMEM n);
+void *nmem_malloc(NMEM n, int size);
+void nmem_reset(NMEM n);
+int nmem_total(NMEM n);
+void nmem_init(void);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>nmem_create()</CODE> function returns a pointer to a memory control
+handle, which can be released again by <CODE>nmem_destroy()</CODE> when no
+longer needed. The function <CODE>nmem_malloc()</CODE> allocates a block of
+memory of the requested size. A call to <CODE>nmem_reset()</CODE> or
+<CODE>nmem_destroy()</CODE> will release all memory allocated on the handle
+since it was created (or since the last call to
+<CODE>nmem_reset()</CODE>. The function <CODE>nmem_total()</CODE> returns the number
+of bytes currently allocated on the handle.
+<P>Note that the nibble memory pool is shared amonst threads. Posix
+mutex'es and WIN32 Critical sections are introduced to keep the
+module thread safe. On WIN32 function <CODE>nmem_init()</CODE> initialises
+the Critical Section handle and should be called once before any
+other nmem function is used.
+<P>
+<HR>
+<A HREF="yaz-5.html">Next</A>
+<A HREF="yaz-3.html">Previous</A>
+<A HREF="yaz.html#toc4">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-5.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-5.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-5.html	(revision 21083)
@@ -0,0 +1,996 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: The ODR Module</TITLE>
+ <LINK HREF="yaz-6.html" REL=next>
+ <LINK HREF="yaz-4.html" REL=previous>
+ <LINK HREF="yaz.html#toc5" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-6.html">Next</A>
+<A HREF="yaz-4.html">Previous</A>
+<A HREF="yaz.html#toc5">Contents</A>
+<HR>
+<H2><A NAME="odr"></A> <A NAME="s5">5. The ODR Module</A></H2>
+
+<H2><A NAME="ss5.1">5.1 Introduction</A>
+</H2>
+
+<P><B>ODR</B> is the BER-encoding/decoding subsystem of <B>YAZ</B>. Care as been taken
+to isolate <B>ODR</B> from the rest of the package - specifically from the
+transport interface. <B>ODR</B> may be used in any context where basic
+ASN.1/BER representations are used.
+<P>If you are only interested in writing a Z39.50 implementation based on
+the PDUs that are already provided with <B>YAZ</B>, you only need to concern
+yourself with the section on managing ODR streams (section
+<A HREF="#odr-use">Using ODR</A>). Only if you need to
+implement ASN.1 beyond that which has been provided, should you
+worry about the second half of the documentation
+(section 
+<A HREF="#odr-prog">Programming with ODR</A>). If you use
+one of the higher-level interfaces, you can skip this section entirely.
+<P>This is important, so we'll repeat it for emphasis: <I>You do not
+need to read section 
+<A HREF="#odr-prog">Programming with ODR</A> to
+implement Z39.50 with <B>YAZ</B>.</I>
+<P>If you need a part of the protocol that isn't already in <B>YAZ</B>, you
+should
+contact the authors before going to work on it yourself: We
+might already be working on it. Conversely, if you implement a useful
+part of the protocol before us, we'd be happy to include it in a
+future release.
+<P>
+<H2><A NAME="odr-use"></A> <A NAME="ss5.2">5.2 Using ODR</A>
+</H2>
+
+<P>
+<H3>ODR Streams</H3>
+
+<P>Conceptually, the ODR stream is the source of encoded data in the
+decoding mode; when encoding, it is the receptacle for the encoded
+data. Before you can use an ODR stream it must be allocated. This is
+done with the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+ODR odr_createmem(int direction);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>odr_createmem()</CODE> function takes as argument one of three manifest
+constants: <CODE>ODR_ENCODE</CODE>, <CODE>ODR_DECODE</CODE>, or <CODE>ODR_PRINT</CODE>. An
+ODR stream can be
+in only one mode - it is not possible to change its mode once it's
+selected. Typically, your program will allocate at least two ODR
+streams - one for decoding, and one for encoding.
+<P>When you're done with the stream, you can use
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_destroy(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>to release the resources allocated for the stream.
+<P>
+<H3><A NAME="memory"></A> Memory Management</H3>
+
+<P>Two forms of memory management take place in the ODR system. The first
+one, which has to do with allocating little bits of memory (sometimes
+quite large bits of memory, actually) when a protocol package is
+decoded, and turned into a complex of interlinked structures. This
+section deals with this system, and how you can use it for your own
+purposes. The next section deals with the memory management which is
+required when encoding data - to make sure that a large enough buffer is
+available to hold the fully encoded PDU.
+<P>The <B>ODR</B> module has its own memory management system, which is
+used whenever memory is required. Specifically, it is used to allocate
+space for data when decoding incoming PDUs. You can use the memory
+system for your own purposes, by using the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void *odr_malloc(ODR o, int size);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>You can't use the normal <CODE>free</CODE>(2) routine to free memory allocated
+by this function, and <B>ODR</B> doesn't provide a parallel function. Instead,
+you can call
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_reset(ODR o, int size);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>when you are done with the
+memory: Everything allocated since the last call to <CODE>odr_reset()</CODE> is
+released. The <CODE>odr_reset()</CODE> call is also required to clear up an
+error condition on a stream.
+<P>The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_total(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>returns the number of bytes allocated on the stream since the last call to
+<CODE>odr_reset()</CODE>.
+<P>The memory subsystem of <B>ODR</B> is fairly efficient at allocating and
+releasing little bits of memory. Rather than managing the individual,
+small bits of space, the system maintains a freelist of larger chunks
+of memory, which are handed out in small bits. This scheme is
+generally known as a <I>nibble memory</I> system. It is very useful for
+maintaing short-lived constructions such as protocol PDUs.
+<P>If you want to retain a bit of memory beyond the next call to
+<CODE>odr_reset()</CODE>, you can use the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+ODR_MEM odr_extract_mem(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>This function will give you control of the memory recently allocated
+on the ODR stream. The memory will live (past calls to <CODE>odr_reset()</CODE>),
+until you call the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_release_mem(ODR_MEM p);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The opaque <CODE>ODR_MEM</CODE> handle has no other purpose than referencing
+the memory block for you until you want to release it.
+<P>You can use <CODE>odr_extract_mem()</CODE> repeatedly between allocating data,
+to retain individual control of separate chunks of data.
+<P>
+<H3>Encoding and Decoding Data</H3>
+
+<P>When encoding data, the ODR stream will write the encoded octet string
+in an internal buffer. To retrieve the data, use the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+char *odr_getbuf(ODR o, int *len, int *size);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The integer pointed to by len is set to the length of the encoded
+data, and a pointer to that data is returned. *<CODE>size</CODE> is set to the size
+of the buffer (unless <CODE>size</CODE> is null, signalling that you are
+not interested in the size). The next call to a primitive function
+using the same ODR stream will overwrite the data, unless a different
+buffer has been supplied using the call
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_setbuf(ODR o, char *buf, int len, int can_grow);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>which sets the encoding (or decoding) buffer used by <CODE>o</CODE> to
+<CODE>buf</CODE>,
+using the length <CODE>len</CODE>. Before a call to an encoding function,
+you can use <CODE>odr_setbuf()</CODE> to provide the stream with an encoding buffer
+of sufficient size (length). The <CODE>can_grow</CODE> parameter tells the encoding
+ODR stream whether it is allowed to use <CODE>realloc</CODE>(2) to increase the size
+of the buffer when necessary. The default condition of a new encoding
+stream is equivalent to the results of calling
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+odr_setbuf(stream, 0, 0, 1);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>In this case, the stream will allocate and reallocate memory as
+necessary. The stream reallocates memory by repeatedly doubling the
+size of the buffer - the result is that the buffer will typically
+reach its maximum, working size with only a small number of reallocation
+operations. The memory is freed by the stream when the latter is destroyed,
+unless it was assigned by the user with the <CODE>can_grow</CODE>
+parameter set to zero (in this case, you are expected to retain
+control of the memory yourself).
+<P>To assume full control of an encoded buffer, you must first call
+<CODE>odr_getbuf()</CODE> to fetch the buffer and its length. Next, you should
+call <CODE>odr_setbuf()</CODE> to provide a different buffer (or a null
+pointer) to the stream. In the simplest case, you will reuse the same
+buffer over and over again, and you will just need to call
+<CODE>odr_getbuf()</CODE> after each encoding operation to get the length and
+address of the buffer. Note that the stream may reallocate the buffer
+during an encoding operation, so it is necessary to retrieve the
+correct address after each encoding operation.
+<P>It is important to realise that the ODR stream will not release this
+memory when you call <CODE>odr_reset()</CODE>: It will merely update its
+internal pointers to prepare for the encoding of a new data value.
+When the stream is released by the <CODE>odr_destroy()</CODE> function, the
+memory given to it by odr_setbuf will be released <I>only</I> if the
+<CODE>can_grow</CODE> parameter to <CODE>odr_setbuf()</CODE> was nonzero. The
+<CODE>can_grow</CODE> parameter, in other words, is a way of signalling who
+is to own the buffer, you or the ODR stream. If you never call
+<CODE>odr_setbuf()</CODE> on your encoding stream, which is typically the
+case, the buffer allocated by the stream will belong to the stream by
+default.
+<P>When you wish to decode data, you should first call <CODE>odr_setbuf()</CODE>, to
+tell the decoding stream where to find the encoded data, and how long
+the buffer is (the <CODE>can_grow</CODE> parameter is ignored by a decoding
+stream). After this, you can call the function corresponding to the
+data you wish to decode (eg, <CODE>odr_integer()</CODE> odr <CODE>z_APDU()</CODE>).
+<P>Examples of encoding/decoding functions:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_integer(ODR o, int **p, int optional, const char *name);
+
+int z_APDU(ODR o, Z_APDU **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>If the data is absent (or
+doesn't match the tag corresponding to the type), the return value
+will be either 0 or 1 depending on the <CODE>optional</CODE> flag. If
+<CODE>optional</CODE>
+is 0 and the data is absent, an error flag will be raised in the
+stream, and you'll need to call <CODE>odr_reset()</CODE> before you can use the
+stream again. If <CODE>optional</CODE> is nonzero, the pointer <I>pointed to</I> by
+<CODE>p</CODE> will be set to the null value, and the function will return 1.
+The <CODE>name</CODE> argument is used to pretty-print the tag in question.
+It may be set to <CODE>NULL</CODE> if pretty-printing is not desired.
+<P>If the data value is found where it's expected, the pointer
+<I>pointed to</I> by the <CODE>p</CODE> argument will be set to point to the
+decoded type. The
+space for the type will be allocated and owned by the ODR stream, and
+it will live until you call <CODE>odr_reset()</CODE> on the stream. You cannot use
+<CODE>free</CODE>(2) to release the memory. You can decode several data elements
+(by repeated calls to <CODE>odr_setbuf()</CODE> and your decoding function), and
+new memory will be allocated each time. When you do call
+<CODE>odr_reset()</CODE>,
+everything decoded since the last call to <CODE>odr_reset()</CODE> will be
+released.
+<P>The use of the double indirection can be a little confusing at first
+(its purpose will become clear later on, hopefully),
+so an example is in order. We'll encode an integer value, and
+immediately decode it again using a different stream. A useless, but
+informative operation.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void do_nothing_useful(int value)
+{
+    ODR encode, decode;
+    int *valp, *resvalp;
+    char *bufferp;
+    int len;
+
+    /* allocate streams */
+    if (!(encode = odr_createmem(ODR_ENCODE)))
+        return;
+    if (!(decode = odr_createmem(ODR_DECODE)))
+        return;
+
+    valp = &amp;value;
+    if (odr_integer(encode, &amp;valp, 0, 0) == 0)
+    {
+        printf("encoding went bad\n");
+        return;
+    }
+    bufferp = odr_getbuf(encode, &amp;len);
+    printf("length of encoded data is %d\n", len);
+
+    /* now let's decode the thing again */
+    odr_setbuf(decode, bufferp, len);
+    if (odr_integer(decode, &amp;resvalp, 0, 0) == 0)
+    {
+        printf("decoding went bad\n");
+        return;
+    }
+    printf("the value is %d\n", *resvalp);
+
+    /* clean up */
+    odr_destroy(encode);
+    odr_destroy(decode);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>This looks like a lot of work, offhand. In practice, the ODR streams
+will typically be allocated once, in the beginning of your program (or at the
+beginning of a new network session), and the encoding and decoding
+will only take place in a few, isolated places in your program, so the
+overhead is quite manageable.
+<P>
+<H3>Diagnostics</H3>
+
+<P>The encoding/decoding functions all return 0 when an error occurs.
+Until you call <CODE>odr_reset()</CODE>, you cannot use the stream again, and
+any function called will immediately return 0.
+<P>To provide information to the programmer or administrator, the
+function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_perror(ODR o, char *message);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>is provided, which prints the <CODE>message</CODE> argument to <CODE>stderr</CODE>
+along with an error message from the stream.
+<P>You can also use the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_geterror(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>to get the current error number from the screen. The number will be
+one of these constants:
+<P>
+<DL>
+<DT><B>OMEMORY</B><DD><P>Memory allocation failed.
+<DT><B>OSYSERR</B><DD><P>A system- or library call has failed. The standard
+diagnostic variable <CODE>errno</CODE>
+should be examined to determine the actual error.
+<DT><B>OSPACE</B><DD><P>No more space for encoding. This will only occur when the user has
+explicitly provided a buffer for an encoding stream without allowing
+the system to allocate more space.
+<DT><B>OREQUIRED</B><DD><P>This is a common protocol error; A required data element was
+missing during
+encoding or decoding.
+<DT><B>OUNEXPECTED</B><DD><P>An unexpected data element was found during decoding.
+<DT><B>OOTHER</B><DD><P>Other error. This is typically an indication of misuse of
+the <B>ODR</B> system by the programmer, and also that the diagnostic
+system isn't as good as it should be, yet.
+</DL>
+<P>The character string array
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+char *odr_errlist[]
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>can be indexed by the error code to obtain a human-readable
+representation of the problem.
+<P>
+<H3>Summary and Synopsis</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+#include &lt;odr.h>
+
+ODR odr_createmem(int direction);
+
+void odr_destroy(ODR o);
+
+void odr_reset(ODR o);
+
+char *odr_getbuf(ODR o, int *len);
+
+void odr_setbuf(ODR o, char *buf, int len);
+
+void *odr_malloc(ODR o, int size);
+
+ODR_MEM odr_extract_mem(ODR o);
+
+void odr_release_mem(ODR_MEM r);
+
+int odr_geterror(ODR o);
+
+void odr_perror(char *message);
+
+extern char *odr_errlist[];
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H2><A NAME="odr-prog"></A> <A NAME="ss5.3">5.3 Programming with ODR</A>
+</H2>
+
+<P>The API of <B>ODR</B> is designed to reflect the structure of ASN.1, rather
+than BER itself. Future releases may be able to represent data in
+other external forms.
+<P>The interface is based loosely on that of the Sun Microsystems XDR routines.
+Specifically, each function which corresponds to an ASN.1 primitive
+type has a dual function. Depending on the settings of the ODR
+stream which is supplied as a parameter, the function may be used
+either to encode or decode data. The functions that can be built
+using these primitive functions, to represent more complex datatypes, share
+this quality. The result is that you only have to enter the definition
+for a type once - and you have the functionality of encoding, decoding
+(and pretty-printing) all in one unit. The resulting C source code is
+quite compact, and is a pretty straightforward representation of the
+source ASN.1 specification. Although no ASN.1 compiler is supplied
+with <B>ODR</B> at this time, it shouldn't be too difficult to write one, or
+perhaps even to adapt an existing compiler to output <B>ODR</B> routines
+(not surprisingly, writing encoders/decoders using <B>ODR</B> turns out
+to be boring work).
+<P>In many cases, the model of the XDR functions works quite well in this
+role. In
+others, it is less elegant. Most of the hassle comes from the optional
+SEQUENCE memebers which don't exist in XDR.
+<P>
+<H3>The Primitive ASN.1 Types</H3>
+
+<P>ASN.1 defines a number of primitive types (many of which correspond
+roughly to
+primitive types in structured programming languages, such as C).
+<P>
+<H3>INTEGER</H3>
+
+<P>The <B>ODR</B> function for encoding or decoding (or printing) the ASN.1
+INTEGER type looks like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_integer(ODR o, int **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>(we don't allow values that can't be contained in a C integer.)
+<P>This form is typical of the primitive <B>ODR</B> functions. They are named
+after the type of data that they encode or decode. They take an
+ODR
+stream, an indirect reference to the type in question, and an
+<CODE>optional</CODE> flag (corresponding to the OPTIONAL keyword of ASN.1) as
+parameters. They all return an integer value of either one or zero.
+When you use the primitive functions to construct encoders for complex
+types of your own, you should follow this model as well. This
+ensures that your new types can be reused as elements in yet more
+complex types.
+<P>The <CODE>o</CODE> parameter should obviously refer to a properly
+initialized ODR
+stream of the right type (encoding/decoding/printing) for the
+operation that you wish to perform.
+<P>When encoding or printing, the function first looks at *<CODE>p</CODE>. If
+*<CODE>p</CODE> (the
+pointer pointed to by <CODE>p</CODE>) is a null pointer, this is taken to mean that
+the data element is absent. If the <CODE>optional</CODE> parameter is nonzero,
+the function will return one (signifying success) without any further
+processing. If the <CODE>optional</CODE> is zero, an internal error flag is
+set in the ODR stream, and the function will return 0. No further
+operations can be carried out on the stream without a call to
+the function <CODE>odr_reset()</CODE>.
+<P>If *<CODE>p</CODE> is not a null pointer, it is expected to point to an instance of
+the data type. The data will be subjected to the encoding rules, and
+the result will be placed in the buffer held by the ODR stream.
+<P>The other ASN.1 primitives have similar functions that operate in
+similar manners:
+<P>
+<H3>BOOLEAN</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_bool(ODR o, bool_t **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H3>REAL</H3>
+
+<P>Not defined.
+<P>
+<H3>NULL</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_null(ODR o, bool_t **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>In this case, the value of **p is not important. If *p is different
+from the null pointer, the null value is present, otherwise it's
+absent.
+<P>
+<H3>OCTET STRING</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct odr_oct
+{
+    unsigned char *buf;
+    int len;
+    int size;
+} Odr_oct;
+
+int odr_octetstring(ODR o, Odr_oct **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>buf</CODE> field should point to the character array that holds the
+octetstring. The <CODE>len</CODE> field holds the actual length, while the
+<CODE>size</CODE>
+field gives the size of the allocated array (not of interest to you,
+in most cases). The character array need not be null terminated.
+<P>To make things a little easier, an alternative is given for string
+types that are not expected to contain embedded NULL characters (eg.
+VisibleString):
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_cstring(ODR o, char **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Which encoded or decodes between OCTETSTRING representations and
+null-terminates C strings.
+<P>Functions are provided for the derived string types, eg:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_visiblestring(ODR o, char **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H3>BIT STRING</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_bitstring(ODR o, Odr_bitmask **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The opaque type <CODE>Odr_bitmask</CODE> is only suitable for holding relatively brief bit
+strings, eg. for options fields, etc. The constant
+<CODE>ODR_BITMASK_SIZE</CODE>
+multiplied by 8 gives the maximum possible number of bits.
+<P>A set of macros are provided for manipulating the
+<CODE>Odr_bitmask</CODE>
+type:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void ODR_MASK_ZERO(Odr_bitmask *b);
+
+void ODR_MASK_SET(Odr_bitmask *b, int bitno);
+
+void ODR_MASK_CLEAR(Odr_bitmask *b, int bitno);
+
+int ODR_MASK_GET(Odr_bitmask *b, int bitno);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The functions are modelled after the manipulation functions that
+accompany the <CODE>fd_set</CODE> type used by the <CODE>select</CODE>(2) call.
+<CODE>ODR_MASK_ZERO</CODE> should always be called first on a new bitmask, to
+initialize the bits to zero.
+<P>
+<H3>OBJECT IDENTIFIER</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_oid(ODR o, Odr_oid **p, int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The C OID represenation is simply an array of integers, terminated by
+the value -1 (the <CODE>Odr_oid</CODE> type is synonymous with the <CODE>int</CODE>
+type). We suggest that you use the OID database module (see section
+<A HREF="yaz-3.html#oid">Object Identifiers</A>) to handle object identifiers
+in your application.
+<P>
+<H3><A NAME="tag-prim"></A> Tagging Primitive Types</H3>
+
+<P>The simplest way of tagging a type is to use the <CODE>odr_implicit_tag()</CODE> or
+<CODE>odr_explicit_tag()</CODE> macros:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_implicit_tag(ODR o, Odr_fun fun, int class, int tag, int
+                     optional, const char *name);
+
+int odr_explicit_tag(ODR o, Odr_fun fun, int class, int tag,
+                     int optional, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>To create a type derived from the integer type by implicit tagging, you
+might write:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MyInt ::= [210] IMPLICIT INTEGER
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>In the <B>ODR</B> system, this would be written like:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int myInt(ODR o, int **p, int optional, const char *name)
+{
+    return odr_implicit_tag(o, odr_integer, p,
+                   ODR_CONTEXT, 210, optional, name);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The function <CODE>myInt()</CODE> can then be used like any of the primitive
+functions provided by ODR. Note that the behavior of
+<CODE>odr_explicit()</CODE>
+and <CODE>odr_implicit()</CODE> macros act exactly the same as the functions they
+are applied to - they respond to error conditions, etc, in the same
+manner - they simply have three extra parameters. The class parameter may
+take one of the values: <CODE>ODR_CONTEXT</CODE>, <CODE>ODR_PRIVATE</CODE>,
+<CODE>ODR_UNIVERSAL</CODE>, or
+<CODE>ODR_APPLICATION</CODE>.
+<P>
+<H3>Constructed Types</H3>
+
+<P>Constructed types are created by combining primitive types. The
+<B>ODR</B>
+system only implements the SEQUENCE and SEQUENCE OF constructions
+(although adding the rest of the container types should be simple
+enough, if the need arises).
+<P>For implementing SEQUENCEs, the functions
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_sequence_begin(ODR o, void *p, int size, const char *name);
+int odr_sequence_end(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>are provided.
+<P>The <CODE>odr_sequence_begin()</CODE> function should be called in the beginning of a
+function that implements a SEQUENCE type. Its parameters are the
+<B>ODR</B>
+stream, a pointer (to a pointer to the type you're implementing), and
+the <CODE>size</CODE> of the type (typically a C structure). On encoding, it
+returns 1 if *<CODE>p</CODE> is a null pointer. The <CODE>size</CODE> parameter is ignored. On
+decoding, it returns 1 if the type is found in the data stream.
+<CODE>size</CODE>
+bytes of memory are allocated, and *<CODE>p</CODE> is set to point to this space.
+<CODE>odr_sequence_end()</CODE> is called at the end of the complex function. Assume
+that a type is defined like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MySequence ::= SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The corresponding ODR encoder/decoder function and the associated data
+structures could be written like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct MySequence
+{
+    int *intval;
+    bool_t *boolval;
+} MySequence;
+
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+        return optional &amp;&amp; odr_ok(o);
+    return
+        odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
+        odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
+        odr_sequence_end(o);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Note the 1 in the call to <CODE>odr_bool()</CODE>, to mark that the sequence
+member is optional. If either of the member types had been tagged, the
+macros <CODE>odr_implicit()</CODE> or <CODE>odr_explicit()</CODE> could have been used.
+The new
+function can be used exactly like the standard functions provided with
+<B>ODR</B>. It will encode, decode or pretty-print a data value of the
+<CODE>MySequence</CODE> type. We like to name types with an initial capital, as
+done in ASN.1 definitions, and to name the corresponding function with
+the first character of the name in lower case. You could, of course,
+name your structures, types, and functions any way you please - as
+long as you're consistent, and your code is easily readable.
+<CODE>odr_ok</CODE> is
+just that - a predicate that returns the state of the stream. It is
+used to ensure that the behaviour of the new type is compatible with
+the interface of the primitive types.
+<P>
+<H3>Tagging Constructed Types</H3>
+
+<P><I>NOTE: See section 
+<A HREF="#tag-prim">Tagging Primitive types</A>
+for information on how to tag the primitive types, as well as types
+that are already defined.</I>
+<P>
+<H3>Implicit Tagging</H3>
+
+<P>Assume the type above had been defined as
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MySequence ::= [10] IMPLICIT SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>You would implement this in <B>ODR</B> by calling the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_implicit_settag(ODR o, int class, int tag);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>which overrides the tag of the type immediately following it. The
+macro <CODE>odr_implicit()</CODE> works by calling <CODE>odr_implicit_settag()</CODE>
+immediately
+before calling the function pointer argument. Your type function could
+look like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_implicit_settag(o, ODR_CONTEXT, 10) == 0 ||
+        odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+        return optional &amp;&amp; odr_ok(o);
+    return
+        odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
+        odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
+        odr_sequence_end(o);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The definition of the structure <CODE>MySequence</CODE> would be the same.
+<P>
+<H3>Explicit Tagging</H3>
+
+<P>Explicit tagging of constructed types is a little more complicated,
+since you are in effect adding a level of construction to the data.
+<P>Assume the definition:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MySequence ::= [10] IMPLICIT SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Since the new type has an extra level of construction, two new functions
+are needed to encapsulate the base type:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_constructed_begin(ODR o, void *p, int class, int tag,
+       const char *name);
+
+int odr_constructed_end(ODR o);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Assume that the IMPLICIT in the type definition above were replaced
+with EXPLICIT (or that the IMPLICIT keyword were simply deleted, which
+would be equivalent). The structure definition would look the same,
+but the function would look like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_constructed_begin(o, p, ODR_CONTEXT, 10, name) == 0)
+        return optional &amp;&amp; odr_ok(o);
+    if (o->direction == ODR_DECODE)
+        *p = odr_malloc(o, sizeof(**p));
+    if (odr_sequence_begin(o, p, sizeof(**p), 0) == 0)
+    {
+        *p = 0; /* this is almost certainly a protocol error */
+        return 0;
+    }
+    return
+        odr_integer(o, &amp;(*p)->intval, 0, "intval") &amp;&amp;
+        odr_bool(o, &amp;(*p)->boolval, 1, "boolval") &amp;&amp;
+        odr_sequence_end(o) &amp;&amp;
+        odr_constructed_end(o);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Notice that the interface here gets kind of nasty. The reason is
+simple: Explicitly tagged, constructed types are fairly rare in
+the protocols that we care about, so the
+aesthetic annoyance (not to mention the dangers of a cluttered
+interface) is less than the time that would be required to develop a
+better interface. Nevertheless, it is far from satisfying, and it's a
+point that will be worked on in the future. One option for you would
+be to simply apply the <CODE>odr_explicit()</CODE> macro to the first function,
+and not
+have to worry about <CODE>odr_constructed_*</CODE> yourself. Incidentally, as you
+might have guessed, the <CODE>odr_sequence_</CODE> functions are themselves
+implemented using the <CODE>odr_constructed_</CODE> functions.
+<P>
+<H3>SEQUENCE OF</H3>
+
+<P>To handle sequences (arrays) of a apecific type, the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_sequence_of(ODR o, int (*fun)(ODR o, void *p, int optional),
+                        void *p, int *num, const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>fun</CODE> parameter is a pointer to the decoder/encoder
+function of the type. <CODE>p</CODE> is a pointer to an array of pointers to your
+type. <CODE>num</CODE> is the number of elements in the array.
+<P>Assume a type
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MyArray ::= SEQUENCE OF INTEGER
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The C representation might be
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct MyArray
+{
+    int num_elements;
+    int **elements;
+} MyArray;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>And the function might look like
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int myArray(ODR o, MyArray **p, int optional, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+        *p = odr_malloc(o, sizeof(**p));
+    if (odr_sequence_of(o, odr_integer, &amp;(*p)->elements,
+        &amp;(*p)->num_elements, name))
+        return 1;
+    *p = 0;
+    return optional &amp;&amp; odr_ok(o);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<H3>CHOICE Types</H3>
+
+<P>The choice type is used fairly often in some ASN.1 definitions, so
+some work has gone into streamlining its interface.
+<P>CHOICE types are handled by the function:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
+               const char *name);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>arm</CODE> array is used to describe each of the possible types that the
+CHOICE type may assume. Internally in your application, the CHOICE
+type is represented as a discriminated union. That is, a C union
+accompanied by an integer (or enum) identifying the active 'arm' of
+the union. <CODE>whichp</CODE> is a pointer to the union discriminator. When
+encoding, it is examined to determine the current type. When decoding,
+it is set to reference the type that was found in the input stream.
+<P>The Odr_arm type is defined thus:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct odr_arm
+{
+    int tagmode;
+    int class;
+    int tag;
+    int which;
+    Odr_fun fun;
+    char *name;
+} Odr_arm;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The interpretation of the fields are:
+<P>
+<DL>
+<DT><B>tagmode</B><DD><P>Either <CODE>ODR_IMPLICIT</CODE>, <CODE>ODR_EXPLICIT</CODE>, or <CODE>ODR_NONE</CODE>
+(-1) to mark
+no tagging.
+<DT><B>class, tag</B><DD><P>The class and tag of the type (-1 if no tagging is
+used).
+<DT><B>which</B><DD><P>The value of the discriminator that corresponds to
+this CHOICE element. Typically, it will be a #defined constant, or
+an enum member.
+<DT><B>fun</B><DD><P>A pointer to a function that implements the type of
+the CHOICE member. It may be either a standard <B>ODR</B> type or a type
+defined by yourself.
+<DT><B>name</B><DD><P>Name of tag.
+</DL>
+<P>A handy way to prepare the array for use by the <CODE>odr_choice()</CODE> function
+is to
+define it as a static, initialized array in the beginning of your
+decoding/encoding function. Assume the type definition:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+MyChoice ::= CHOICE {
+    untagged INTEGER,
+    tagged   [99] IMPLICIT INTEGER,
+    other    BOOLEAN
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Your C type might look like
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct MyChoice
+{
+    enum
+    {
+        MyChoice_untagged,
+        MyChoice_tagged,
+        MyChoice_other
+    } which;
+    union
+    {
+        int *untagged;
+        int *tagged;
+        bool_t *other;
+    } u;
+};
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>And your function could look like this:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int myChoice(ODR o, MyChoice **p, int optional, const char *name)
+{
+    static Odr_arm arm[] =
+    {
+        {-1, -1, -1, MyChoice_untagged, odr_integer, "untagged"},
+        {ODR_IMPLICIT, ODR_CONTEXT, 99, MyChoice_tagged, odr_integer, 
+                                                            "tagged"},
+        {-1, -1, -1, MyChoice_other, odr_boolean, "other"},
+        {-1, -1, -1, -1, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+        *p = odr_malloc(o, sizeof(**p);
+    else if (!*p)
+        return optional &amp;&amp; odr_ok(o);
+
+    if (odr_choice(o, arm, &amp;(*p)->u, &amp;(*p)->which), name)
+        return 1;
+    *p = 0;
+    return optional &amp;&amp; odr_ok(o);
+}
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>In some cases (say, a non-optional choice which is a member of a sequence),
+you can &quot;embed&quot; the union and its discriminator in the structure
+belonging to the enclosing type, and you won't need to fiddle with
+memory allocation to create a separate structure to wrap the
+discriminator and union.
+<P>The corresponding function is somewhat nicer in the Sun XDR interface.
+Most of the complexity of this interface comes from the possibility of
+declaring sequence elements (including CHOICEs) optional.
+<P>The ASN.1 specifictions naturally requires that each member of a
+CHOICE have a distinct tag, so they can be told apart on decoding.
+Sometimes it can be useful to define a CHOICE that has multiple types
+that share the same tag. You'll need some other mechanism, perhaps
+keyed to the context of the CHOICE type. In effect, we would like to
+introduce a level of context-sensitiveness to our ASN.1 specification.
+When encoding an internal representation, we have no problem, as long
+as each CHOICE member has a distinct discriminator value. For
+decoding, we need a way to tell the choice function to look for a
+specific arm of the table. The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void odr_choice_bias(ODR o, int what);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>provides this functionality. When called, it leaves a notice for the
+next call to <CODE>odr_choice()</CODE> to be called on the decoding
+stream <CODE>o</CODE> that only the <CODE>arm</CODE> entry with a <CODE>which</CODE> field
+equal to <CODE>what</CODE> should be tried.
+<P>The most important application (perhaps the only one, really) is in
+the definition of application-specific EXTERNAL encoders/decoders
+which will automatically decode an ANY member given the direct or
+indirect reference.
+<P>
+<H2><A NAME="ss5.4">5.4 Debugging</A>
+</H2>
+
+<P>The protocol modules are suffering somewhat from a lack of diagnostic
+tools at the moment. Specifically ways to pretty-print PDUs that
+aren't recognized by the system. We'll include something to this end
+in a not-too-distant release. In the meantime, what we do when we get
+packages we don't understand is to compile the ODR module with
+<CODE>ODR_DEBUG</CODE> defined. This causes the module to dump tracing
+information as it processes data units. With this output and the
+protocol specification (Z39.50), it is generally fairly easy to see
+what goes wrong.
+<P>
+<HR>
+<A HREF="yaz-6.html">Next</A>
+<A HREF="yaz-4.html">Previous</A>
+<A HREF="yaz.html#toc5">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-6.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-6.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-6.html	(revision 21083)
@@ -0,0 +1,562 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: The COMSTACK Module</TITLE>
+ <LINK HREF="yaz-7.html" REL=next>
+ <LINK HREF="yaz-5.html" REL=previous>
+ <LINK HREF="yaz.html#toc6" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-7.html">Next</A>
+<A HREF="yaz-5.html">Previous</A>
+<A HREF="yaz.html#toc6">Contents</A>
+<HR>
+<H2><A NAME="comstack"></A> <A NAME="s6">6. The COMSTACK Module</A></H2>
+
+<H2><A NAME="ss6.1">6.1 Introduction</A>
+</H2>
+
+<P>The <B>COMSTACK</B>
+subsystem provides a transparent interface to different types of transport
+stacks for the exchange of BER-encoded data. At present, the
+RFC1729 method (BER over TCP/IP), and Peter Furniss' XTImOSI
+stack are supported, but others may be added in time. The philosophy of the
+module is to provide a simple interface by hiding unused options and
+facilities of the underlying libraries. This is always done at the risk
+of losing generality, and it may prove that the interface will need
+extension later on.
+<P>The interface is implemented in such a fashion that only the
+sub-layers constructed to the transport methods that you wish to 
+use in your application are linked in.
+<P>You will note that even though simplicity was a goal in the design,
+the interface is still orders of magnitudes more complex than the
+transport systems found in many other packages. One reason is that
+the interface needs to support the somewhat different requirements of
+the different lower-layer communications stacks; another important reason is
+that the interface seeks to provide a more or less industrial-strength
+approach to asynchronous event-handling. When no function is allowed
+to block, things get more complex - particularly on the server
+side. We urge you to have a look at the demonstration client and server
+provided with the package. They are meant to be easily readable and
+instructive, while still being at least moderately useful.
+<P>
+<H2><A NAME="ss6.2">6.2 Common Functions</A>
+</H2>
+
+<H3>Managing Endpoints</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Creates an instance of the protocol stack - a communications endpoint.
+The
+<CODE>type</CODE>
+parameter determines the mode of communication. At present, the
+values
+<CODE>tcpip_type</CODE>
+and
+<CODE>mosi_type</CODE>
+are recognized. The function returns a null-pointer if a system error
+occurs. The <CODE>blocking</CODE> parameter should be one if you wish the
+association to operate in blocking mode, zero otherwise. The
+<CODE>protocol</CODE> field should be one of <CODE>PROTO_SR</CODE> or <CODE>PROTO_Z3950</CODE>.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_close(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Closes the connection (as elegantly as the lower layers will permit),
+and releases the resouces pointed to by the
+<CODE>handle</CODE>
+parameter. The
+<CODE>handle</CODE>
+should not be referenced again after this call.
+<P><I>NOTE:
+We really need a soft disconnect, don't we?</I>
+<P>
+<H3>Data Exchange</H3>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_put(COMSTACK handle, char *buf, int len);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Sends
+<CODE>buf</CODE>
+down the wire. In blocking mode, this function will return only when a
+full buffer has been written, or an error has occurred. In nonblocking
+mode, it's possible that the function will be unable to send the full
+buffer at once, which will be indicated by a return value of 1. The
+function will keep track of the number of octets already written; you
+should call it repeatedly with the same values of <CODE>buf</CODE> and
+<CODE>len</CODE>, until the buffer has been transmitted. When a full buffer
+has been sent, the function will return 0 for success. -1 indicates
+an error condition (see below).
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_get(COMSTACK handle, char **buf, int *size);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Receives a PDU from the peer. Returns the number of bytes
+read. In nonblocking mode, it is possible that not all of the packet can be
+read at once. In this case, the function returns 1. To simplify the
+interface, the function is
+responsible for managing the size of the buffer. It will be reallocated
+if necessary to contain large packages, and will sometimes be moved
+around internally by the subsystem when partial packages are read. Before
+calling
+<CODE>cs_get</CODE>
+for the fist time, the buffer can be initialized to the null pointer,
+and the length should also be set to 0 - cs_get will perform a
+<CODE>malloc</CODE>(2)
+on the buffer for you. When a full buffer has been read, the size of
+the package is returned (which will always be greater than 1). -1
+indicates an error condition.
+<P>See also the
+<CODE>cs_more()</CODE>
+function below.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_more(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>cs_more()</CODE> function should be used in conjunction with
+<CODE>cs_get</CODE>
+and
+<CODE>select</CODE>(2).
+The <CODE>cs_get()</CODE> function will sometimes (notably in the TCP/IP mode) read
+more than a single protocol package off the network. When this
+happens, the extra package is stored by the subsystem. After calling
+<CODE>cs_get()</CODE>, and before waiting for more input,
+You should always call
+<CODE>cs_more()</CODE>
+to check if there's a full protocol package already read. If
+<CODE>cs_more()</CODE>
+returns 1,
+<CODE>cs_get()</CODE>
+can be used to immediately fetch the new package. For the 
+mOSI
+subsystem, the function should always return 0, but if you want your
+stuff to be protocol independent, you should use it.
+<P><I>NOTE: The <CODE>cs_more()</CODE>
+function is required because the 
+RFC1729-method
+does not provide a way of separating individual PDUs, short of
+partially decoding the BER. Some other implementations will carefully
+nibble at the packet by calling
+<CODE>read</CODE>(2)
+several times. This was felt to be too inefficient (or at least
+clumsy) - hence the call for this extra function.</I>
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_look(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>This function is useful when you're operating in nonblocking
+mode. Call it when
+<CODE>select</CODE>(2)
+tells you there's something happening on the line. It returns one of
+the following values:
+<P>
+<DL>
+<DT><B>CS_NONE</B><DD><P>No event is pending. The data found on the line was
+not a complete package.
+<DT><B>CS_CONNECT</B><DD><P>A response to your connect request has been received. Call
+<CODE>cs_rcvconnect</CODE>
+to process the event and to finalize the connection establishment.
+<DT><B>CS_DISCON</B><DD><P>The other side has closed the connection (or maybe
+sent a disconnect
+request - but do we care? Maybe later). Call
+<CODE>cs_close</CODE> To close your end of the association as well.
+<DT><B>CS_LISTEN</B><DD><P>A connect request has been received. Call
+<CODE>cs_listen</CODE>
+to process the event.
+<DT><B>CS_DATA</B><DD><P>There's data to be found on the line. Call
+<CODE>cs_get</CODE>
+to get it.
+</DL>
+<P><I>NOTE:
+You should be aware that even if
+<CODE>cs_look()</CODE>
+tells you that there's an event event pending, the corresponding
+function may still return and tell you there was nothing to be found.
+This means that only part of a package was available for reading. The
+same event will show up again, when more data has arrived.</I>
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_fileno(COMSTACK h);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Returns the file descriptor of the association. Use this when
+file-level operations on the endpoint are required (<CODE>select</CODE>(2)
+operations, specifically).
+<P>
+<H2><A NAME="ss6.3">6.3 Client Side</A>
+</H2>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_connect(COMSTACK handle, void *address);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Initiate a connection with the target at <CODE>address</CODE> (more on
+addresses below). The function will return 0 on success, and 1 if
+the operation does not complete immediately (this will only
+happen on a nonblocking endpoint). In this case, use
+<CODE>cs_rcvconnect</CODE> to complete the operation, when <CODE>select</CODE>(2)
+reports input pending on the association.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_rcvconnect(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Complete a connect operation initiated by <CODE>cs_connect()</CODE>. It will
+return 0 on success; 1 if the operation has not yet completed (in this
+case, call the function again later); -1 if an error has occured.
+<P>
+<H2><A NAME="ss6.4">6.4 Server Side</A>
+</H2>
+
+<P>To establish a server under the <CODE>inetd</CODE> server, you can use
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+COMSTACK cs_createbysocket(int socket, CS_TYPE type, int blocking,
+                              int protocol);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <I>socket</I> parameter is an established socket (when your
+application is invoked from <CODE>inetd</CODE>, the socket will typically be
+0. The following parameters are identical to the ones for
+<CODE>cs_create</CODE>.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_bind(COMSTACK handle, void *address, int mode)
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Binds a local address to the endpoint. Read about addresses below. The
+<CODE>mode</CODE> parameter should be either <CODE>CS_CLIENT</CODE> or <CODE>CS_SERVER</CODE>.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int cs_listen(COMSTACK handle, char *addr, int *addrlen);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Call this to process incoming events on an endpoint that has been
+bound in listening mode. It will return 0 to indicate that the connect
+request has been received, 1 to signal a partial reception, and -1 to
+indicate an error condition.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+COMSTACK cs_accept(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>This finalises the server-side association establishment, after
+cs_listen has completed successfully. It returns a new connection
+endpoint, which represents the new association. The application will
+typically wish to fork off a process to handle the association at this
+point, and continue listen for new connections on the old <CODE>handle</CODE>.
+<P>You can use the call
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+char *cs_addrstr(COMSTACK);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>on an established connection to retrieve the hostname of the remote host.
+<P><I>NOTE: You may need to use this function with some care if your
+name server service is slow or unreliable</I>
+<P>
+<H2><A NAME="ss6.5">6.5 Addresses</A>
+</H2>
+
+<P>The low-level format of the addresses are different depending on the
+mode of communication you have chosen. A function is provided by each
+of the lower layers to map a user-friendly string-form address to the
+binary form required by the lower layers.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+struct netbuf *mosi_strtoaddr(char *str);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The format for TCP/IP addresses is straightforward:
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+&lt;host> [ ':' &lt;portnum> ]
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>hostname</CODE> can be either a domain name or an IP address. The
+port number, if omitted, defaults to 210.
+<P>For OSI, the format is
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+[ &lt;t-selector> '/' ] &lt;host> [ ':' &lt;port> ]
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The transport selector is given as an even number of hex digits.
+<P>You'll note that the address format for the OSI mode are just a subset
+of full presentation addresses. We use presentation addresses because
+xtimosi doesn't, in itself, allow access to the X.500 Directory
+service. We use a limited form, because we haven't yet come across an
+implementation that used more of the elements of a full p-address. It
+is a fairly simple matter to add the rest of the elements to the
+address format as needed, however: Xtimosi <I>does</I> support the full
+P-address structure.
+<P>In both transport modes, the special hostname &quot;@&quot; is mapped
+to any local address (the manifest constant INADDR_ANY). It is used
+to establish local listening endpoints in the server role.
+<P>When a connection has been established, you can use
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+char cs_addrstr(COMSTACK h);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>to retrieve the host name of the peer system. The function returns a pointer
+to a static area, which is overwritten on the next call to the function.
+<P><I>NOTE: We have left the issue of X.500 name-to-address mapping open, for the
+moment. It would be a simple matter to provide a table-based mapping,
+if desired. Alternately, we could use the X.500 client-function that
+is provided with the ISODE (although this would defeat some of the
+purpose of using ThinOSI in the first place. We have been told that it
+should be within the realm of the possible to implement a lightweight
+implementation of the necessary X.500 client capabilities on top of
+ThinOSI. This would be the ideal solution, we feel. On the other hand, it
+still remains to be seen just what role the Directory will play in a world
+populated by ThinOSI and other pragmatic solutions.</I>
+<P>
+<H2><A NAME="ss6.6">6.6 Diagnostics</A>
+</H2>
+
+<P>All functions return -1 if an error occurs. Typically, the functions
+will return 0 on success, but the data exchange functions
+(<CODE>cs_get</CODE>, <CODE>cs_put</CODE>, <CODE>cs_more</CODE>)
+follow special rules. Consult their descriptions.
+<P>When a function (including the data exchange functions) reports an
+error condition,
+use the function
+<CODE>cs_errno()</CODE>
+to determine the cause of the
+problem. The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void cs_perror(COMSTACK handle char *message);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>works like
+<CODE>perror</CODE>(2)
+and prints the
+<CODE>message</CODE>
+argument, along with a system message, to
+<CODE>stderr</CODE>.
+Use the character array
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+extern const char *cs_errlist[];
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>to get hold of the message, if you want to process it differently.
+The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+const char *cs_stackerr(COMSTACK handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Returns an error message from the lower layer, if one has been
+provided.
+<P>
+<H2><A NAME="ss6.7">6.7 Enabling OSI Communication</A>
+</H2>
+
+<H3>Installing Xtimosi</H3>
+
+<P>Although you will have to download Peter Furniss' XTI/mOSI
+implementation for yourself, we've tried to make the integration as
+simple as possible.
+<P>The latest version of xtimosi will generally be under
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+ftp://pluto.ulcc.ac.uk/ulcc/thinosi/xtimosi/
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>When you have downloaded and unpacked the archive, it will (we assume)
+have created a directory called <CODE>xtimosi</CODE>. We suggest that you place
+this directory <I>in the same directory</I> where you unpacked the
+<B>YAZ</B>
+distribution. This way, you shouldn't have to fiddle with the
+makefiles of <CODE>YAZ</CODE> beyond uncommenting a few lines.
+<P>Go to <CODE>xtimosi/src</CODE>, and type &quot;<CODE>make libmosi.a</CODE>&quot;.
+This should generally
+create the library, ready to use.
+<P><B>CAVEAT</B>
+<P><I>The currently available release of xtimosi has some inherent
+problems that make it disfunction on certain platforms - eg. the
+Digital OSF/1 workstations. It is supposedly primarily a
+compiler problem, and we hope to see a release that is generally
+portable. While we can't guarantee that it can be brought to work
+on your platform, we'll be happy to talk to you about problems
+that you might see, and relay information to the author of the
+software. There are some signs that the <B>gcc</B> compiler is more
+likely to produce a fully functional library, but this hasn't
+been verified (we think that the problem is limited to the use
+of hexadecimal escape-codes used in strings, which are silently
+ignored by some compilers).</I>
+<P><I>A problem has been encountered in the communication with
+ISODE-based applications. If the ISODE presentation-user calls
+<CODE>PReadRequest()</CODE> with a timeout value different from <CODE>OK</CODE> or <CODE>NOTOK</CODE>,
+he will get an immediate TIMEOUT abort when receiving large (&gt;2041
+bytes, which is the SPDU-size that the ISODE likes to work with) packages
+from an xtimosi-based implementation (probably most
+other implementations as well, in fact). It seems to be a flaw in the
+ISODE API, and the workaround (for ISODE users) is to either not
+use an explicit timeout (switching to either blocking or
+nonblocking mode), or to check that the timer really has expired
+before closing the connection.</I>
+<P>The next step in the installation is to modify the makefile in the toplevel
+<B>YAZ</B>
+directory. The place to change is in the top of the file, and is
+clearly marked with a comment.
+<P>Now run <CODE>make</CODE> in the <B>YAZ</B> toplevel directory (do a
+&quot;<CODE>make clean</CODE>&quot; first, if the
+system has been previously made without OSI support). Use the <B>YAZ</B>
+<B>ztest</B>
+and <B>client</B> demo programs to verify that OSI communication works OK. Then,
+you can go ahead and try to talk to other implementations.
+<P><I>NOTE: Our interoperability experience is limited to version
+7 of the Nordic SR-Nett package, which has had several
+protocol errors fixed from the earlier releases. If you have
+problems or successes in interoperating with other
+implementations, we'd be glad to hear about it, or to help
+you make things work, as our resources allow.</I>
+<P>If you write your own applications based on <B>YAZ</B>, and you wish to
+include OSI support, the procedure is equally simple. You should
+include the <CODE>xmosi.h</CODE> header file in addition to <CODE>comstack.h</CODE>.
+<CODE>xmosi.h</CODE>
+will define the manifest constant <CODE>mosi_type</CODE>, which you should pass
+to the <CODE>cs_create()</CODE> function. In
+addition, you should use the function <CODE>mosi_strtoaddr()</CODE> rather than
+<CODE>tcpip_strtoaddr()</CODE> when you need to prepare an address.
+<P>When you link your application, you should include (after the
+<CODE>libyaz.a</CODE>
+library) the <CODE>libmosi.a</CODE> library, and the <CODE>librfc.a</CODE> library
+provided with
+<B>YAZ</B> (for OSI transport).
+<P>As always, it can be very useful, if not essential, to have a look at the
+example applications
+to see how things are done.
+<P>
+<H3>OSI Transport</H3>
+
+<P>Xtimosi requires an implementation of the OSI transport service under
+the X/OPEN XTI API. We provide an implementation of the RFC1006
+encapsulation of OSI/TP0 in TCP/IP (through the Berkeley Sockets API),
+as an independent part of <B>YAZ</B> (it's found under the <CODE>rfc1006</CODE>
+directory). If you have access to an OSI transport provider under XTI,
+you should be able to make that work too, although it may require
+tinkering with the <CODE>mosi_strtoaddr()</CODE> function.
+<P>
+<H3>Presentation Context Management</H3>
+
+<P>To simplify the implementation, we use Peter Furniss' alternative (PRF)
+option format
+for the Control of the presentation negotiation phase. This format
+is enabled by default when you
+compile xtimosi.
+<P>The current version of <B>YAZ</B> does <I>not</I> support presentation-layer
+negotiation of response record formats. The primary reason is that we
+have had access to no other SR or Z39.50 implementations over OSI that
+used this
+method. Secondarily, we believe that the EXPLAIN facility is a superior
+mechanism for relaying target capabilities in this respect. This is not to
+say that we have no intentions of supporting presentation context
+negotiation - we have just hitherto given it a lower priority than other
+aspects of the protocol.
+<P>One thing is certain: The addition of this capability to <B>YAZ</B> should
+have only a minimal impact on existing applications, and on the
+interface to the software in general. Most likely, we will add an extra
+layer of interface to the processing of EXPLAIN records, which will
+convert back and forth between <CODE>oident</CODE> records (see section
+<A HREF="yaz-3.html#oid">Object Identifiers</A>) and direct or indirect
+references, given the current association setup. Implementations based
+on any of the higher-level interfaces will most likely not have to be
+changed at all.
+<P>
+<H2><A NAME="ss6.8">6.8 Summary and Synopsis</A>
+</H2>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+#include &lt;comstack.h>
+
+#include &lt;tcpip.h>      /* this is for TCP/IP support   */
+#include &lt;xmosi.h>      /* and this is for mOSI support */
+
+COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+
+COMSTACK cs_createbysocket(int s, CS_TYPE type, int blocking,
+                              int protocol);
+
+int cs_bind(COMSTACK handle, int mode);
+
+int cs_connect(COMSTACK handle, void *address);
+
+int cs_rcvconnect(COMSTACK handle);
+
+int cs_listen(COMSTACK handle);
+
+COMSTACK cs_accept(COMSTACK handle);
+
+int cs_put(COMSTACK handle, char *buf, int len);
+
+int cs_get(COMSTACK handle, char **buf, int *size);
+
+int cs_more(COMSTACK handle);
+
+int cs_close(COMSTACK handle);
+
+int cs_look(COMSTACK handle);
+
+struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+struct netbuf *mosi_strtoaddr(char *str);
+
+extern int cs_errno;
+
+void cs_perror(COMSTACK handle char *message);
+
+const char *cs_stackerr(COMSTACK handle);
+
+extern const char *cs_errlist[];
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<HR>
+<A HREF="yaz-7.html">Next</A>
+<A HREF="yaz-5.html">Previous</A>
+<A HREF="yaz.html#toc6">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-7.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-7.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-7.html	(revision 21083)
@@ -0,0 +1,548 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: Making an IR Interface for Your Database with YAZ</TITLE>
+ <LINK HREF="yaz-8.html" REL=next>
+ <LINK HREF="yaz-6.html" REL=previous>
+ <LINK HREF="yaz.html#toc7" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-8.html">Next</A>
+<A HREF="yaz-6.html">Previous</A>
+<A HREF="yaz.html#toc7">Contents</A>
+<HR>
+<H2><A NAME="server"></A> <A NAME="s7">7. Making an IR Interface for Your Database with YAZ</A></H2>
+
+<H2><A NAME="ss7.1">7.1 Introduction</A>
+</H2>
+
+<P><I>NOTE: If you aren't into documentation, a good way to learn how the
+backend interface works is to look at the backend.h file. Then,
+look at the small dummy-server in server/ztest.c. Finally, you can
+have a look at the seshigh.c file, which is where most of the
+logic of the frontend server is located. The backend.h file also
+makes a good reference, once you've chewed your way through
+the prose of this file.</I>
+<P>If you have a database system that you would like to make available by
+means of Z39.50/SR, <B>YAZ</B> basically offers your two options. You
+can use the APIs provided by the <B>ASN</B>, <B>ODR</B>, and <B>COMSTACK</B>
+modules to
+create and decode PDUs, and exchange them with a client. Using this
+low-level interface gives you access to all fields and options of the
+protocol, and you can construct your server as close to your existing
+database as you like. It is also a fairly involved process, requiring
+you to set up an event-handling mechanism, protocol state machine,
+etc. To simplify server implementation, we have implemented a compact
+and simple, but reasonably full-functioned server-frontend that will
+handle most of the protocol mechanics, while leaving you to
+concentrate on your database interface.
+<P><I>NOTE: The backend interface was designed in anticipation of a specific
+integration task, while still attempting to achieve some degree of
+generality. We realise fully that there are points where the
+interface can be improved significantly. If you have specific
+functions or parameters that you think could be useful, send us a
+mail (or better, sign on to the mailing list referred to in the
+toplevel README file). We will try to fit good suggestions into future
+releases, to the extent that it can be done without requiring
+too many structural changes in existing applications.</I>
+<P>
+<H2><A NAME="ss7.2">7.2 The Database Frontend</A>
+</H2>
+
+<P>We refer to this software as a generic database frontend. Your
+database system is the <I>backend database</I>, and the interface between
+the two is called the <I>backend API</I>. The backend API consists of a
+small number of function prototypes and structure definitions. You are
+required to provide the <B>main()</B> routine for the server (which can be
+quite simple), as well as functions to match each of the prototypes.
+The interface functions that you write can use any mechanism you like
+to communicate with your database system: You might link the whole
+thing together with your database application and access it by
+function calls; you might use IPC to talk to a database server
+somewhere; or you might link with third-party software that handles
+the communication for you (like a commercial database client library).
+At any rate, the functions will perform the tasks of:
+<P>
+<UL>
+<LI>Initialization.</LI>
+<LI>Searching.</LI>
+<LI>Fetching records.</LI>
+<LI>Scanning the database index (if you wish to implement SCAN).</LI>
+</UL>
+<P>(more functions will be added in time to support as much of
+Z39.50-1995 as possible).
+<P>Because the model where pipes or sockets are used to access the backend
+database is a fairly common one, we have added a mechanism that allows this
+communication to take place asynchronously. In this mode, the frontend
+server doesn't have to block while the backend database is processing
+a request, but can wait for additional PDUs from the client.
+<P>
+<H2><A NAME="ss7.3">7.3 The Backend API</A>
+</H2>
+
+<P>The headers files that you need to use the interface are in the
+include/ directory. They are called <CODE>statserv.h</CODE> and <CODE>backend.h</CODE>. They
+will include other files from the <CODE>include</CODE> directory, so you'll
+probably want to use the -I option of your compiler to tell it where
+to find the files. When you run <CODE>make</CODE> in the toplevel <B>YAZ</B> directory,
+everything you need to create your server is put the lib/libyaz.a
+library. If you want OSI as well, you'll also need to link in the
+<CODE>libmosi.a</CODE> library from the xtimosi distribution (see the mosi.txt
+file), a well as the <CODE>lib/librfc.a</CODE> library (to provide OSI transport
+over RFC1006/TCP).
+<P>
+<H2><A NAME="ss7.4">7.4 Your main() Routine</A>
+</H2>
+
+<P>As mentioned, your <B>main()</B> routine can be quite brief. If you want to
+initialize global parameters, or read global configuration tables,
+this is the place to do it. At the end of the routine, you should call
+the function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+int statserv_main(int argc, char **argv);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P><B>Statserv_main</B> will establish listening sockets according to the
+parameters given. When connection requests are received, the event
+handler will typically <B>fork()</B> to handle the new request. If you do use
+global variables, you should be aware, then, that these cannot be
+shared between associations, unless you explicitly disallow forking by
+command line parameters (we advise against this for any purposes
+except debugging, as a crash or hang in the server process will affect
+all users currently signed on to the server).
+<P>The server provides a mechanism for controlling some of its behavior
+without using command-line options. The function
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+statserv_options_block *statserv_getcontrol(void);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Will return a pointer to a <CODE>struct statserv_options_block</CODE> describing
+the current default settings of the server. The structure contains
+these elements:
+<P>
+<DL>
+<DT><B>int dynamic</B><DD><P>A boolean value, which determines whether the server
+will fork on each incoming request (TRUE), or not (FALSE). Default is
+TRUE.
+<DT><B>int loglevel</B><DD><P>Set this by ORing the constants defined in include/log.h.
+<DT><B>char logfile[ODR_MAXNAME+1]</B><DD><P>File for diagnostic output
+(&quot;&quot;: stderr).
+<DT><B>char apdufile[ODR_MAXNAME+1]</B><DD><P>Name of file for logging incoming and
+outgoing APDUs (&quot;&quot;: don't log APDUs, &quot;-&quot;: <CODE>stderr</CODE>).
+<DT><B>char default_listen[1024]</B><DD><P>Same form as the command-line
+specification of listener address. &quot;&quot;: no default listener address.
+Default is to listen at &quot;tcp:@:9999&quot;. You can only
+specify one default listener address in this fashion.
+<DT><B>enum oid_proto default_proto;</B><DD><P>Either <CODE>PROTO_SR</CODE> or <CODE>PROTO_Z3950</CODE>.
+Default is <CODE>PROTO_Z39_50</CODE>.
+<DT><B>int idle_timeout;</B><DD><P>Maximum session idletime, in minutes. Zero indicates
+no (infinite) timeout. Default is 120 minutes.
+<DT><B>int maxrecordsize;</B><DD><P>Maximum permissible record (message) size. Default
+is 1Mb. This amount of memory will only be allocated if a client requests a
+very large amount of records in one operation (or a big record). Set it
+to a lower number
+if you are worried about resource consumption on your host system.
+<DT><B>char configname[ODR_MAXNAME+1]</B><DD><P>Passed to the backend when a
+new connection is received.
+<DT><B>char setuid[ODR_MAXNAME+1]</B><DD><P>Set user id to the user specified,
+after binding the listener addresses.
+</DL>
+<P>The pointer returned by <CODE>statserv_getcontrol</CODE> points to a static area.
+You are allowed to change the contents of the structure, but the
+changes will not take effect before you call
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+void statserv_setcontrol(statserv_options_block *block);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>Note that you should generally update this structure <I>before</I> calling
+<CODE>statserv_main()</CODE>.
+<P>
+<H2><A NAME="ss7.5">7.5 The Backend Functions</A>
+</H2>
+
+<P>For each service of the protocol, the backend interface declares one or
+two functions. You are required to provide implementations of the
+functions representing the services that you wish to implement.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+bend_initresult *bend_init(bend_initrequest *r);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>This function is called once for each new connection request, after
+a new process has been forked, and an initRequest has been received
+from the client. The parameter and result structures are defined as
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+typedef struct bend_initrequest
+{
+    char *configname;
+} bend_initrequest;
+
+typedef struct bend_initresult
+{
+    int errcode;       /* 0==OK */
+    char *errstring;   /* system error string or NULL */
+    void *handle;      /* private handle to the backend module */
+} bend_initresult;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The <CODE>configname</CODE> of <CODE>bend_initrequest</CODE> is currently always set to
+&quot;default-config&quot;. We haven't had use for putting anything special in
+the initrequest yet, but something might go there if the need arises
+(account/password info would be obvious).
+<P>In general, the server frontend expects that the <CODE>bend_*result</CODE>
+pointer that you return is valid at least until the next call to a
+<CODE>bend_* function</CODE>. This applies to all of the functions described
+herein. The parameter structure passed to you in the call belongs to
+the server frontend, and you should not make assumptions about its
+contents after the current function call has completed. In other
+words, if you want to retain any of the contents of a request
+structure, you should copy them.
+<P>The <CODE>errcode</CODE> should be zero if the initialization of the backend went
+well. Any other value will be interpreted as an error. The
+<CODE>errstring</CODE> isn't used in the current version, but one option
+would be to stick it
+in the initResponse as a VisibleString. The <CODE>handle</CODE> is the most
+important parameter. It should be set to some value that uniquely
+identifies the current session to the backend implementation. It is
+used by the frontend server in any future calls to a backend function.
+The typical use is to set it to point to a dynamically allocated state
+structure that is private to your backend module.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                               int *fd);
+bend_searchresult *bend_searchresponse(void *handle);
+
+typedef struct bend_searchrequest
+{
+    char *setname;       /* name to give to this set */
+    int replace_set;     /* replace set, if it already exists */
+    int num_bases;       /* number of databases in list */
+    char **basenames;    /* databases to search */
+    Z_Query *query;      /* query structure */
+} bend_searchrequest;
+
+typedef struct bend_searchresult
+{
+    int hits;            /* number of hits */
+    int errcode;         /* 0==OK */
+    char *errstring;     /* system error string or NULL */
+} bend_searchresult;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The first thing to notice about the search request interface (as well
+as all of the following requests), is that it consists of two separate
+functions. The idea is to provide a simple facility for
+asynchronous communication with the backend server. When a
+searchrequest comes in, the server frontend will fill out the
+<CODE>bend_searchrequest</CODE> tructure, and call the <CODE>bend_search
+function</CODE>. The <CODE>fd</CODE>
+argument will point to an integer variable. If you are able to do
+asynchronous I/O with your database server, you should set *<CODE>fd</CODE> to the
+file descriptor you use for the communication, and return a null
+pointer. The server frontend will then <CODE>select()</CODE> on the *<CODE>fd</CODE>,
+and will call
+<CODE>bend_searchresult</CODE> when it sees that data is available. If you don't
+support asynchronous I/O, you should return a pointer to the
+<CODE>bend_searchresult</CODE> immediately, and leave *<CODE>fd</CODE> untouched. This
+construction is common to all of the <CODE>bend_</CODE> functions (except
+<CODE>bend_init</CODE>). Note that you can choose to support this facility in none,
+any, or all of the <CODE>bend_</CODE> functions, and you can respond
+differently on each request at run-time. The server frontend will
+adapt accordingly.
+<P>The <CODE>bend_searchrequest</CODE> is a fairly close approximation of a protocol
+searchRequest PDU. The <CODE>setname</CODE> is the resultSetName from the protocol. You
+are required to establish a mapping between the set name and whatever
+your backend database likes to use. Similarly, the <CODE>replace_set</CODE> is a
+boolean value corresponding to the resultSetIndicator field in the
+protocol. <CODE>Num_bases/basenames</CODE> is a length of/array of character
+pointers to the database names provided by the client. The <CODE>query</CODE> is the 
+full query structure as defined in the protocol ASN.1 specification.
+It can be either of the possible query types, and it's up to you to
+determine if you can handle the provided query type. Rather than
+reproduce the C interface here, we'll refer you to the structure
+definitions in the file <CODE>include/proto.h</CODE>. If you want to look at the
+attributeSetId OID of the RPN query, you can either match it against
+your own internal tables, or you can use the <CODE>oid_getentbyoid</CODE> function
+provided by <B>YAZ</B>.
+<P>The result structure contains a number of hits, and an
+<CODE>errcode/errstring</CODE> pair. If an error occurs during the search, or if
+you're unhappy with the request, you should set the errcode to a value
+from the BIB-1 diagnostic set. The value will then be returned to the
+user in a nonsurrogate diagnostic record in the response. The
+<CODE>errstring</CODE>, if provided, will go in the addinfo field. Look at the
+protocol definition for the defined error codes, and the suggested
+uses of the addinfo field.
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                             int *fd);
+bend_fetchresult *bend_fetchresponse(void *handle);
+
+typedef struct bend_fetchrequest
+{
+    char *setname;       /* set name */
+    int number;          /* record number */
+    oid_value format;
+} bend_fetchrequest;
+
+typedef struct bend_fetchresult
+{
+    char *basename;      /* name of database that provided record */
+    int len;             /* length of record */
+    char *record;        /* record */
+    int last_in_set;     /* is it?  */
+    oid_value format;
+    int errcode;         /* 0==success */
+    char *errstring;     /* system error string or NULL */
+} bend_fetchresult;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P><I>NOTE: The <CODE>bend_fetchresponse()</CODE> function is not yet supported
+in this version of the software. Your implementation of <CODE>bend_fetch()</CODE>
+should always return a pointer to a <CODE>bend_fetchresult</CODE>.</I>
+<P>The frontend server calls <CODE>bend_fetch</CODE> when it needs database records to
+fulfill a searchRequest or a presentRequest. The <CODE>setname</CODE> is simply the
+name of the result set that holds the reference to the desired record.
+The <CODE>number</CODE> is the offset into the set (with 1 being the first record
+in the set). The <CODE>format</CODE> field is the record format requested by the
+client (See section 
+<A HREF="yaz-3.html#oid">Object Identifiers</A>). The value
+<CODE>VAL_NONE</CODE> indicates that the client did not request a specific format.
+The <CODE>stream</CODE> argument is an <B>ODR</B> stream which should be used for
+allocating space for structured data records. The stream will be reset when
+all records have been assembled, and the response package has been transmitted.
+For unstructured data, the backend is responsible for maintaining a static
+or dynamic buffer for the record between calls.
+<P>In the result structure, the <CODE>basename</CODE> is the name of the
+database that holds the
+record. <CODE>Len</CODE> is the length of the record returned, in bytes, and
+<CODE>record</CODE>
+is a pointer to the record. <CODE>Last_in_set</CODE> should be nonzero only if the
+record returned is the last one in the given result set. <CODE>Errcode</CODE> and
+<CODE>errstring</CODE>, if given, will currently be interpreted as a global error
+pertaining to the set, and will be returned in a
+nonSurrogateDiagnostic.
+<P><I>NOTE: This is silly. Add a flag to say which is which.</I>
+<P>If the <CODE>len</CODE> field has the value -1, then <CODE>record</CODE> is assumed to point
+to a constructed data type. The <CODE>format</CODE> field will be used to determine
+which encoder should be used to serialize the data.
+<P><I>NOTE: If your backend generates structured records, it should use
+<CODE>odr_malloc()</CODE> on the provided stream for allocating data: This allows
+the frontend server to keep track of the record sizes.</I>
+<P>The <CODE>format</CODE> field is mapped to an object identifier in the direct
+reference of the resulting EXTERNAL representation of the record.
+<P><I>NOTE: The current version of <B>YAZ</B> only supports the direct reference
+mode.</I>
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                               int *fd);
+bend_deleteresult *bend_deleteresponse(void *handle);
+
+typedef struct bend_deleterequest
+{
+    char *setname;
+} bend_deleterequest;
+
+typedef struct bend_deleteresult
+{
+    int errcode;         /* 0==success */
+    char *errstring;     /* system error string or NULL */
+} bend_deleteresult;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P><I>NOTE: The &quot;delete&quot; function is not yet supported
+in this version of the software.</I>
+<P><I>NOTE: The delete set function definition is rather primitive, mostly
+because we
+have had no practical need for it as of yet. If someone wants
+to provide a full delete service, we'd be happy to add the
+extra parameters that are required. Are there clients out there
+that will actually delete sets they no longer need?</I>
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+bend_scanresult *bend_scan(void *handle, bend_scanrequest *r,
+    int *fd);
+bend_scanresult *bend_scanresponse(void *handle);
+
+typedef struct bend_scanrequest
+{
+    int num_bases;      /* number of elements in databaselist */
+    char **basenames;   /* databases to search */
+    Z_AttributesPlusTerm *term;
+    int term_position;  /* desired index of term in result list */
+    int num_entries;    /* number of entries requested */
+} bend_scanrequest;
+
+typedef struct bend_scanresult
+{
+    int num_entries;
+    struct scan_entry
+    {
+        char *term;
+        int occurrences;
+    } *entries;
+    int term_position;
+    enum
+    {
+        BEND_SCAN_SUCCESS,
+        BEND_SCAN_PARTIAL
+    } status;
+    int errcode;
+    char *errstring;
+} bend_scanresult;
+</PRE>
+</CODE></BLOCKQUOTE>
+<P><I>NOTE: The <CODE>bend_scanresponse()</CODE> function is not yet supported
+in this version of the software. Your implementation of <CODE>bend_scan()</CODE>
+should always return a pointer to a <CODE>bend_scanresult</CODE>.</I>
+<P>
+<H2><A NAME="ss7.6">7.6 Application Invocation</A>
+</H2>
+
+<P>The finished application has the following
+invocation syntax (by way of <CODE>statserv_main()</CODE>):
+<P>
+<BLOCKQUOTE><CODE>
+ 
+<PRE>
+appname [-szSu -a apdufile -l logfile -v loglevel]
+[listener ...]
+</PRE>
+ 
+</CODE></BLOCKQUOTE>
+<P>The options are
+<P>
+<DL>
+<DT><B>-a</B><DD><P>APDU file. Specify a file for dumping PDUs (for diagnostic purposes).
+The special name &quot;-&quot; sends output to <CODE>stderr</CODE>.
+<P>
+<DT><B>-S</B><DD><P>Don't fork on connection requests. This is good for debugging, but
+not recommended for real operation: Although the server is
+asynchronous and non-blocking, it can be nice to keep a software
+malfunction (okay then, a crash) from affecting all current users.
+<P>
+<DT><B>-s</B><DD><P>Use the SR protocol.
+<P>
+<DT><B>-z</B><DD><P>Use the Z39.50 protocol (default). These two options complement
+eachother. You can use both multiple times on the same command
+line, between listener-specifications (see below). This way, you
+can set up the server to listen for connections in both protocols
+concurrently, on different local ports.
+<P>
+<DT><B>-l</B><DD><P>The logfile.
+<P>
+<DT><B>-v</B><DD><P>The log level. Use a comma-separated list of members of the set
+{fatal,debug,warn,log,all,none}.
+<DT><B>-u</B><DD><P>Set user ID. Sets the real UID of the server process to that of the
+given user. It's useful if you aren't comfortable with having the
+server run as root, but you need to start it as such to bind a
+privileged port.
+<P>
+<DT><B>-w</B><DD><P>Working directory.
+<DT><B>-i</B><DD><P>Use this when running from the <CODE>inetd</CODE> server.
+<P>
+<DT><B>-t</B><DD><P>Idle session timeout, in minutes.
+<P>
+<DT><B>-k</B><DD><P>Maximum record size/message size, in kilobytes.
+<P>
+</DL>
+<P>A listener specification consists of a transport mode followed by a
+colon (:) followed by a listener address. The transport mode is
+either <CODE>osi</CODE> or <CODE>tcp</CODE>.
+<P>For TCP, an address has the form
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+hostname | IP-number [: portnumber]
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The port number defaults to 210 (standard Z39.50 port).
+<P>For osi, the address form is
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+[t-selector /] hostname | IP-number [: portnumber]
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>The transport selector is given as a string of hex digits (with an even
+number of digits). The default port number is 102 (RFC1006 port).
+<P>Examples
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+tcp:dranet.dra.com
+
+osi:0402/dbserver.osiworld.com:3000
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>In both cases, the special hostname &quot;@&quot; is mapped to
+the address INADDR_ANY, which causes the server to listen on any local
+interface. To start the server listening on the registered ports for
+Z39.50 and SR over OSI/RFC1006, and to drop root privileges once the
+ports are bound, execute the server like this (from a root shell):
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+my-server -u daemon tcp:@ -s osi:@
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>You can replace <CODE>daemon</CODE> with another user, eg. your own account, or
+a dedicated IR server account. <CODE>my-server</CODE> should be the name of your
+server application. You can test the procedure with the <CODE>ztest</CODE>
+application.
+<P>
+<H2><A NAME="ss7.7">7.7 Summary and Synopsis</A>
+</H2>
+
+<P>
+<BLOCKQUOTE><CODE>
+<PRE>
+#include &lt;backend.h>
+
+bend_initresult *bend_init(bend_initrequest *r);
+
+bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                                 int *fd);
+
+bend_searchresult *bend_searchresponse(void *handle);
+
+bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                               int *fd);
+
+bend_fetchresult *bend_fetchresponse(void *handle);
+
+bend_scanresult *bend_scan(void *handle, bend_scanrequest *r, int *fd);
+
+bend_scanresult *bend_scanresponse(void *handle);
+
+bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                                  int *fd);
+
+bend_deleteresult *bend_deleteresponse(void *handle);
+
+void bend_close(void *handle);
+</PRE>
+</CODE></BLOCKQUOTE>
+<P>
+<HR>
+<A HREF="yaz-8.html">Next</A>
+<A HREF="yaz-6.html">Previous</A>
+<A HREF="yaz.html#toc7">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-8.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-8.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-8.html	(revision 21083)
@@ -0,0 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: Future Directions</TITLE>
+ <LINK HREF="yaz-9.html" REL=next>
+ <LINK HREF="yaz-7.html" REL=previous>
+ <LINK HREF="yaz.html#toc8" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-9.html">Next</A>
+<A HREF="yaz-7.html">Previous</A>
+<A HREF="yaz.html#toc8">Contents</A>
+<HR>
+<H2><A NAME="s8">8. Future Directions</A></H2>
+
+<P>The software has been
+successfully ported to the Mac as well as Windows NT/95 - we'd like to
+test those ports better and make sure they work as they should.
+<P>We have a new and better version of the frontend server on the drawing
+board. Resources and external commitments will govern when we'll be
+able to do something real with it. Fetures should include greater
+flexibility, greter support for access/resource control, and easy
+support for Explain (possibly with Zebra as an extra database engine).
+<P>We now support all PDUs of Z39.50-1995. If there is one of the
+supporting structures that you need but can't find in the prt*.h
+files, send us a note; it may be on its way.
+<P>The 'retrieval' module needs to be finalized and documented. We think
+it can form a useful resource for people dealing with complex record
+structures, but for now, you'll mostly have to chew through the code
+yourself to make use of it. Not acceptable.
+<P>Other than that, YAZ generally moves in the directions which appear to
+make the most people happy (including ourselves, as prime users of the
+software). If there's something you'd like to see in here, then drop
+us a note and let's see what we can come up with.
+<P>
+<HR>
+<A HREF="yaz-9.html">Next</A>
+<A HREF="yaz-7.html">Previous</A>
+<A HREF="yaz.html#toc8">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz-9.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz-9.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz-9.html	(revision 21083)
@@ -0,0 +1,83 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference: License</TITLE>
+ <LINK HREF="yaz-10.html" REL=next>
+ <LINK HREF="yaz-8.html" REL=previous>
+ <LINK HREF="yaz.html#toc9" REL=contents>
+</HEAD>
+<BODY>
+<A HREF="yaz-10.html">Next</A>
+<A HREF="yaz-8.html">Previous</A>
+<A HREF="yaz.html#toc9">Contents</A>
+<HR>
+<H2><A NAME="s9">9. License</A></H2>
+
+<H2><A NAME="ss9.1">9.1 Index Data Copyright</A>
+</H2>
+
+<P>Copyright &copy; 1995-2000 Index Data.
+<P>Permission to use, copy, modify, distribute, and sell this software and
+its documentation, in whole or in part, for any purpose, is hereby granted,
+provided that:
+<P>1. This copyright and permission notice appear in all copies of the
+software and its documentation. Notices of copyright or attribution
+which appear at the beginning of any file must remain unchanged.
+<P>2. The names of Index Data or the individual authors may not be used to
+endorse or promote products derived from this software without specific
+prior written permission.
+<P>THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+<P>
+<H2><A NAME="ss9.2">9.2 Additional Copyright Statements</A>
+</H2>
+
+<P>The optional CCL query language interpreter is covered by the following
+license:
+<P>Copyright &copy; 1995, the EUROPAGATE consortium (see below).
+<P>The EUROPAGATE consortium members are:
+<P>University College Dublin
+Danmarks Teknologiske Videnscenter
+An Chomhairle Leabharlanna
+Consejo Superior de Investigaciones Cientificas
+<P>Permission to use, copy, modify, distribute, and sell this software and
+its documentation, in whole or in part, for any purpose, is hereby granted,
+provided that:
+<P>1. This copyright and permission notice appear in all copies of the
+software and its documentation. Notices of copyright or attribution
+which appear at the beginning of any file must remain unchanged.
+<P>2. The names of EUROPAGATE or the project partners may not be used to
+endorse or promote products derived from this software without specific
+prior written permission.
+<P>3. Users of this software (implementors and gateway operators) agree to
+inform the EUROPAGATE consortium of their use of the software. This
+information will be used to evaluate the EUROPAGATE project and the
+software, and to plan further developments. The consortium may use
+the information in later publications.
+<P>4. Users of this software agree to make their best efforts, when
+documenting their use of the software, to acknowledge the EUROPAGATE
+consortium, and the role played by the software in their work.
+<P>THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+USE OR PERFORMANCE OF THIS SOFTWARE.
+<P>
+<HR>
+<A HREF="yaz-10.html">Next</A>
+<A HREF="yaz-8.html">Previous</A>
+<A HREF="yaz.html#toc9">Contents</A>
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz.html
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz.html	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz.html	(revision 21083)
@@ -0,0 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
+<HTML>
+<HEAD>
+ <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
+ <TITLE>YAZ User's Guide and Reference</TITLE>
+ <LINK HREF="yaz-1.html" REL=next>
+
+
+</HEAD>
+<BODY>
+<A HREF="yaz-1.html">Next</A>
+Previous
+Contents
+<HR>
+<H1>YAZ User's Guide and Reference</H1>
+
+<H2>
+<A HREF="http://www.indexdata.dk/">Index Data</A>, <CODE>
+<A HREF="mailto:info@indexdata.dk">info@indexdata.dk</A></CODE></H2>$Revision$
+<P><HR>
+<EM>This document is the programmer's guide and reference to the YAZ
+package. YAZ is a compact toolkit that provides access to the
+Z39.50/SR protocol, as well as a set of higher-level tools for
+implementing the server and client roles, respectively.
+The documentation can be used on its own, or as a reference when looking
+at the example applications provided with the package.</EM>
+<HR>
+<P>
+<H2><A NAME="toc1">1.</A> <A HREF="yaz-1.html">Introduction</A></H2>
+
+<P>
+<H2><A NAME="toc2">2.</A> <A HREF="yaz-2.html">Compilation and Installation</A></H2>
+
+<UL>
+<LI><A HREF="yaz-2.html#ss2.1">2.1 UNIX</A>
+<LI><A HREF="yaz-2.html#ss2.2">2.2 WIN32</A>
+</UL>
+<P>
+<H2><A NAME="toc3">3.</A> <A HREF="yaz-3.html">The ASN Module</A></H2>
+
+<UL>
+<LI><A HREF="yaz-3.html#ss3.1">3.1 Introduction</A>
+<LI><A HREF="yaz-3.html#ss3.2">3.2 Preparing PDUs</A>
+<LI><A HREF="yaz-3.html#ss3.3">3.3 Object Identifiers</A>
+<LI><A HREF="yaz-3.html#ss3.4">3.4 EXTERNAL Data</A>
+<LI><A HREF="yaz-3.html#ss3.5">3.5 PDU Contents Table</A>
+</UL>
+<P>
+<H2><A NAME="toc4">4.</A> <A HREF="yaz-4.html">Supporting Tools</A></H2>
+
+<UL>
+<LI><A HREF="yaz-4.html#ss4.1">4.1 Query Syntax Parsers</A>
+<LI><A HREF="yaz-4.html#ss4.2">4.2 Object Identifiers</A>
+<LI><A HREF="yaz-4.html#ss4.3">4.3 Nibble Memory</A>
+</UL>
+<P>
+<H2><A NAME="toc5">5.</A> <A HREF="yaz-5.html">The ODR Module</A></H2>
+
+<UL>
+<LI><A HREF="yaz-5.html#ss5.1">5.1 Introduction</A>
+<LI><A HREF="yaz-5.html#ss5.2">5.2 Using ODR</A>
+<LI><A HREF="yaz-5.html#ss5.3">5.3 Programming with ODR</A>
+<LI><A HREF="yaz-5.html#ss5.4">5.4 Debugging</A>
+</UL>
+<P>
+<H2><A NAME="toc6">6.</A> <A HREF="yaz-6.html">The COMSTACK Module</A></H2>
+
+<UL>
+<LI><A HREF="yaz-6.html#ss6.1">6.1 Introduction</A>
+<LI><A HREF="yaz-6.html#ss6.2">6.2 Common Functions</A>
+<LI><A HREF="yaz-6.html#ss6.3">6.3 Client Side</A>
+<LI><A HREF="yaz-6.html#ss6.4">6.4 Server Side</A>
+<LI><A HREF="yaz-6.html#ss6.5">6.5 Addresses</A>
+<LI><A HREF="yaz-6.html#ss6.6">6.6 Diagnostics</A>
+<LI><A HREF="yaz-6.html#ss6.7">6.7 Enabling OSI Communication</A>
+<LI><A HREF="yaz-6.html#ss6.8">6.8 Summary and Synopsis</A>
+</UL>
+<P>
+<H2><A NAME="toc7">7.</A> <A HREF="yaz-7.html">Making an IR Interface for Your Database with YAZ</A></H2>
+
+<UL>
+<LI><A HREF="yaz-7.html#ss7.1">7.1 Introduction</A>
+<LI><A HREF="yaz-7.html#ss7.2">7.2 The Database Frontend</A>
+<LI><A HREF="yaz-7.html#ss7.3">7.3 The Backend API</A>
+<LI><A HREF="yaz-7.html#ss7.4">7.4 Your main() Routine</A>
+<LI><A HREF="yaz-7.html#ss7.5">7.5 The Backend Functions</A>
+<LI><A HREF="yaz-7.html#ss7.6">7.6 Application Invocation</A>
+<LI><A HREF="yaz-7.html#ss7.7">7.7 Summary and Synopsis</A>
+</UL>
+<P>
+<H2><A NAME="toc8">8.</A> <A HREF="yaz-8.html">Future Directions</A></H2>
+
+<P>
+<H2><A NAME="toc9">9.</A> <A HREF="yaz-9.html">License</A></H2>
+
+<UL>
+<LI><A HREF="yaz-9.html#ss9.1">9.1 Index Data Copyright</A>
+<LI><A HREF="yaz-9.html#ss9.2">9.2 Additional Copyright Statements</A>
+</UL>
+<P>
+<H2><A NAME="toc10">10.</A> <A HREF="yaz-10.html">About Index Data</A></H2>
+
+<HR>
+<A HREF="yaz-1.html">Next</A>
+Previous
+Contents
+</BODY>
+</HTML>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz.sgml
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz.sgml	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz.sgml	(revision 21083)
@@ -0,0 +1,3543 @@
+<!doctype linuxdoc system>
+<article>
+<title>YAZ User's Guide and Reference
+<author><htmlurl url="http://www.indexdata.dk/" name="Index Data">, <tt><htmlurl url="mailto:info@indexdata.dk" name="info@indexdata.dk"></>
+<date>$Revision$
+<abstract>
+This document is the programmer's guide and reference to the YAZ
+package. YAZ is a compact toolkit that provides access to the
+Z39.50/SR protocol, as well as a set of higher-level tools for
+implementing the server and client roles, respectively.
+The documentation can be used on its own, or as a reference when looking
+at the example applications provided with the package.
+</abstract>
+
+<toc>
+
+<sect>Introduction
+
+<p>
+The <bf/YAZ/ toolkit offers several different levels of access to the
+Z39.50 and SR protocols. The level that you need to use depends on
+your requirements, and the role (server or client) that you
+want to implement.
+
+The basic level, which is independent of the role, consists of three
+primary interfaces:
+
+<itemize>
+<item><bf/ASN/, which provides a C representation of the Z39.50/SR protocol
+packages (PDUs).
+<item><bf/ODR/, which encodes and decodes the packages according to the BER
+specification.
+<item><bf/COMSTACK/, which exchanges the encoded packages with a peer process
+over a network.
+</itemize>
+
+The ASN module represents the ASN.1 definition of the
+SR/Z39.50 protocol. It establishes a set of type and
+structure definitions, with one structure for each of the top-level
+PDUs, and one structure or type for each of the contained ASN.1 types.
+For primitive types, or other types that are defined by the ASN.1
+standard itself (such as the EXTERNAL type), the C representation is provided
+by the <bf/ODR/ (Open Data Representation) subsystem.
+
+<bf/ODR/ is a basic mechanism for representing an
+ASN.1 type in the C programming language, and for implementing BER
+encoders and decoders for values of that type. The types defined in
+the <bf/ASN/
+module generally have the prefix <tt/Z_/, and a suffix corresponding to
+the name of the type in the ASN.1
+specification of the protocol (generally Z39.50-1995). In the case of
+base types (those originating in the ASN.1 standard itself), the prefix
+<tt/Odr_/ is sometimes seen. Either way, look for
+the actual definition in either <tt/proto.h/ (for the types from the
+protocol), <tt/odr.h/ (for the primitive ASN.1 types, or <tt/odr_use.h/ (for the
+ASN.1 <it/useful/ types). The <bf/ASN/ library also provides functions (which
+are, in turn, defined using <bf/ODR/ primitives) for encoding and decoding data
+values. Their general form is
+
+<tscreen><verb>
+int z_xxx(ODR o, Z_xxx **p, int optional, const char *name);
+</verb></tscreen>
+
+(note the lower-case &dquot;z&dquot; in the function name)
+
+<it>
+NOTE: If you are using the premade definitions of the <bf/ASN/ module, and
+you are not adding new protocol of your own, the only parts of ODR
+that you need to worry about are documented in section
+<ref id="odr-use" name="Using ODR">.
+</it>
+
+When you have created a BER-encoded buffer, you can use the <bf/COMSTACK/
+subsystem to transmit (or receive) data over the network. The <bf/COMSTACK/
+module provides simple functions for establishing a connection
+(passively or actively, depending on the role of your application),
+and for exchanging BER-encoded PDUs over that connection. When you
+create a connection endpoint, you need to specify what transport to
+use (OSI or TCP/IP), and which protocol you want to use (SR or
+Z39.50). For the remainer of the connection's lifetime, you don't have
+to worry about the underlying transport protocol at all - the <bf/COMSTACK/
+will ensure that the correct mechanism is used.
+
+We call the combined interfaces to <bf/ODR/, <bf/ASN/, and <bf/COMSTACK/ the service
+level API. It's the API that most closely models the Z39.50/SR
+service/protocol definition, and it provides unlimited access to all
+fields and facilities of the protocol definitions.
+
+The reason that the <bf/YAZ/ service-level API is a conglomerate of the
+APIs from three different submodules is twofold. First, we wanted to allow the
+user a choice of different options for each major task. For instance,
+if you don't like the protocol API provided by <bf/ODR//<bf/ASN/, you
+can use SNACC or BERUtils instead, and still have the benefits of the
+transparent transport approach of the <bf/COMSTACK/ module. Secondly,
+we realise that you may have to fit the toolkit into an existing
+event-processing structure, in a way that
+is incompatible with the <bf/COMSTACK/ interface or some other part of <bf/YAZ/.
+
+<sect>Compilation and Installation
+
+<p>
+The latest version of the software will generally be found at
+
+<tscreen><verb>
+http://ftp.indexdata.dk/pub/yaz/
+</verb></tscreen>
+
+We have tried our best to keep the software portable, and on many
+platforms, you should be able to compile everything with little or no changes.
+So far, the software has been ported
+to the following platforms with little or no difficulties.
+
+<itemize>
+<item>Unix systems
+<itemize>
+<item>HP/UX
+<item>SunOS/Solaris
+<item>DEC Unix
+<item>Linux
+<item>IBM AIX
+<item>Data General DG/UX (with some CFLAGS tinkering)
+<item>SGI/IRIX
+<item>DDE Supermax
+</itemize>
+<item>Non-unix systems
+<itemize>
+<item>Apple Macintosh (using the Codewarrior programming environment and the
+GUSI socket libraries)
+<item>MS Windows 95/NT (Win32)
+<item>IBM AS/400
+</itemize>
+</itemize>
+
+If you move the software to other platforms, we'd be grateful if you'd
+let us know about it. If you run into difficulties, we will try to help if we
+can, and if you solve the problems, we would be happy to
+include your fixes in the next release. So far, we have mostly avoided
+&num;ifdefs for individual platforms, and we'd like to keep it that
+way as far as it makes sense.
+
+We maintain a mailing-list for the purpose of announcing new releases and
+bug-fixes, as well as general discussion. Subscribe by sending mail to
+<tt/yaz-request@indexdata.dk/. General questions and problems can be
+directed at <tt/yaz-help@indexdata.dk/, or the address given at the top
+of this document.
+
+<sect1>UNIX
+
+<p>
+Note that if your system doesn't have a native ANSI C compiler, you may
+have to acquire one separately. We recommend gcc.
+
+For UNIX we use GNU configure to create Makefiles for YAZ.
+Generally it should be sufficient to run configure without options:
+
+<tscreen><verb>
+./configure
+</verb></tscreen>
+
+The configure script attempts to use use the C compiler specified by
+the <tt/CC/ environment variable. If not set, GNU C will be used
+if it is available. The <tt/CFLAGS/ environment variable holds options
+to be passed to the C compiler. If you're using Bourne-compatible shell
+you may pass something like this to use a particular C compiler with
+optimization enabled:
+<tscreen><verb>
+  CC=/opt/ccs/bin/cc CFLAGS=-O ./configure
+</verb></tscreen>
+
+To customize <bf/YAZ/ the configure script also accepts a set of options.
+The most important are:
+
+<descrip>
+<tag><tt>-</tt><tt>-prefix </tt>path</tag> Specifies installation prefix. This is
+only needed if you run <tt>make install</tt> later to perform a
+"system" installation. The prefix is <tt>/usr/local</tt> if not
+specified.
+
+<tag><tt>-</tt><tt>-enable-comp </tt></tag> YAZ will be built using
+the ASN.1 compiler for YAZ (default). If you wish to use the
+old decoders (in sub directory asn) use <tt>--disable-comp</tt> instead.
+
+<tag><tt>-</tt><tt>-enable-threads</tt></tag> YAZ will be built using
+POSIX threads. Specifically, <tt>_REENTRANT</tt> will be defined
+during compilation.
+</descrip>
+
+When configured, build the software by typing:
+<tscreen><verb>
+  make
+</verb></tscreen>
+
+Developers that do modifications to <bf/YAZ/ may wish to run
+<tt>make depend</tt> as well to generate object-header file
+dependencies.
+
+The following files are generated by make
+<descrip>
+<tag><tt>lib/libyaz.a</tt></tag> The <bf/YAZ/ programmers' library.
+
+<tag><tt>ztest/yaz-ztest</tt></tag> A test Z39.50 server.
+
+<tag><tt>client/yaz-client</tt></tag> A command mode Z39.50 client.
+
+<tag><tt>yaz-config</tt></tag> A Bourne-shell script that holds build
+settings for <bf/YAZ/.
+
+</descrip>
+
+If you wish to install <bf/YAZ/ in system directories such as /usr/local/bin,
+/usr/local/lib) you can type:
+
+<tscreen><verb>
+  make install
+</verb></tscreen>
+
+You probably need to have root access in order to perform this.
+You must specify the <tt>--prefix</tt> option for configure if you
+going to install in anything but /usr/local/.
+
+<sect1>WIN32
+
+<p>
+<bf/YAZ/ is shipped with "makefiles" for the NMAKE tool that comes
+with Visual C++.
+
+Start an MS-DOS prompt and switch the sub directory <tt>WIN</tt> where
+the file <tt>makefile</tt> is located. Customize the installation
+by editing the <tt>makefile</tt> file (for example by using notepad).
+
+The following summarises the most important settings in that file:
+
+<descrip>
+<tag><tt>NEW_Z3950</tt></tag> If 1, the auto-generated decoder/encoders
+for Z39.50 as written by the ASN.1 compiler will be used. If 0, the old
+decoders for Z39.50 will be used. Note, when 1, the setting TCL should
+point to the Tcl shell on your system.
+<tag><tt>DEBUG</tt></tag> If set to 1, the software is
+compiled with debugging libraries. If set to 0, the software
+is compiled with release (non-debugging) libraries.
+</descrip>
+
+When satisfied with the settings in the makefile type
+<tscreen><verb>
+nmake
+</verb></tscreen>
+
+The following is generated upon successful compilation:
+<descrip>
+<tag><tt>bin/yaz.dll</tt></tag> A multithreaded DLL with everything
+except the frontend server library.
+<tag><tt>lib/yaz.lib</tt></tag> An import library for <tt>yaz.dll</tt>.
+<tag><tt>lib/server.lib</tt></tag> The frontend server library.
+<tag><tt>bin/yaz-ztest.exe</tt></tag> A test Z39.50 server.
+<tag><tt>bin/yaz-client.exe</tt></tag> A command mode Z39.50 client.
+</descrip>
+
+<sect>The ASN Module
+
+<sect1>Introduction
+
+<p>
+The <bf/ASN/ module provides you with a set of C struct definitions for the
+various PDUs of the protocol, as well as for the complex types
+appearing within the PDUs. For the primitive data types, the C
+representation often takes the form of an ordinary C language type,
+such as <tt/int/. For ASN.1 constructs that have no direct
+representation in C, such as general octet strings and bit strings,
+the <bf/ODR/ module (see section <ref id="odr" name="ODR">) provides auxiliary
+definitions.
+
+<sect1>Preparing PDUs
+
+<p>
+A structure representing a complex ASN.1 type doesn't in itself contain the
+members of that type. Instead, the structure contains <it/pointers/ to
+the members of the type. This is necessary, in part, to allow a mechanism for
+specifying which of the optional structure (SEQUENCE) members are
+present, and which are not. It follows that you will need to somehow
+provide space for the individual members of the structure, and
+set the pointers to refer to the members.
+
+The conversion routines don't care how you allocate and maintain your
+C structures - they just follow the pointers that you provide.
+Depending on the complexity of your application, and your personal
+taste, there are at least three different approaches that you may take
+when you allocate the structures.
+
+<itemize>
+<item>
+You can use static or automatic local variables in the function that
+prepares the PDU. This is a simple approach, and it provides the most
+efficient form of memory management. While it works well for flat
+PDUs like the InitReqest, it will generally not be sufficient for say,
+the generation of an arbitrarily complex RPN query structure.
+<item>
+You can individually create the structure and its members using the
+<tt/malloc/(2) function. If you want to ensure that the data is freed when
+it is no longer needed, you will have to define a function that
+individually releases each member of a structure before freeing the
+structure itself.
+<item>
+You can use the <tt/odr_malloc()/ function (see section <ref
+id="odr-use"
+name="Using ODR"> for details). When you use <tt/odr_malloc()/, you can release
+all of the
+allocated data in a single operation, independent of any pointers and
+relations between the data. <tt/odr_malloc()/ is based on a
+&dquot;nibble-memory&dquot;
+scheme, in which large portions of memory are allocated, and then
+gradually handed out with each call to <tt/odr_malloc()/. The next time you
+call <tt/odr_reset()/, all of the memory allocated since the last call is
+recycled for future use (actually, it is placed on a free-list).
+<item>
+You can combine all of the methods described here. This will often be
+the most practical approach. For instance, you might use <tt/odr_malloc()/ to
+allocate an entire structure and some of its elements, while you leave
+other elements pointing to global or per-session default variables.
+</itemize>
+
+The <bf/ASN/ module provides an important aid in creating new PDUs. For
+each of the PDU types (say, <tt/Z_InitRequest/), a function is provided
+that allocates and initializes an instance of that PDU type for you.
+In the case of the InitRequest, the function is simply named
+<tt/zget_InitRequest()/, and it sets up reasonable default value for all of
+the mandatory members. The optional members are generally initialized to null
+pointers. This last aspect is very important: it ensures that if the
+PDU definitions are extended after you finish your implementation
+(to accommodate
+new versions of the protocol, say), you won't get into trouble with
+uninitialized pointers in your structures. The functions use
+<tt/odr_malloc()/ to
+allocate the PDUs and its members, so you can free everything again with a
+single call to <tt/odr_reset()/. We strongly recommend that you use the
+<tt/zget_*/
+functions whenever you are preparing a PDU (in a C++ API, the
+<tt/zget_/
+functions would probably be promoted to constructors for the
+individual types).
+
+The prototype for the individual PDU types generally look like this:
+
+<tscreen><verb>
+Z_<type> *zget_<type>(ODR o);
+</verb></tscreen>
+
+eg.:
+
+<tscreen><verb>
+Z_InitRequest *zget_InitRequest(ODR o);
+</verb></tscreen>
+
+The <bf/ODR/ handle should generally be your encoding stream, but it
+needn't be.
+
+As well as the individual PDU functions, a function <tt/zget_APDU()/ is
+provided, which allocates a toplevel Z-APDU of the type requested:
+
+<tscreen><verb>
+Z_APDU *zget_APDU(ODR o, int which);
+</verb></tscreen>
+
+The <tt/which/ parameter is (of course) the discriminator belonging to the
+<tt/Z_APDU/ CHOICE type. All of the interface described here is provided by
+the <bf/ASN/ module, and you access it through the <tt/proto.h/ header file.
+
+<sect1>Object Identifiers<label id="oid">
+
+<p>
+When you refer to object identifiers in your application, you need to
+be aware that SR and Z39.50 use two different set of OIDs to refer to
+the same objects. To handle this easily, <bf/YAZ/ provides a utility module
+to <bf/ASN/ which provides an internal representation of the OIDs used in
+both protocols. Each oid is described by a structure:
+
+<tscreen><verb>
+typedef struct oident
+{
+    enum oid_proto proto;
+    enum oid_class class;
+    enum oid_value value;
+    int oidsuffix[OID_SIZE];
+    char *desc;
+} oident;
+</verb></tscreen>
+
+The <tt/proto/ field can be set to either <tt/PROTO_SR/ or
+<tt/PROTO_Z3950/. The <tt/class/ might be, say, <tt/CLASS_RECSYN/, and the
+<tt/value/ might be <tt/VAL_USMARC/ for the USMARC record format. Functions
+
+<tscreen><verb>
+int *oid_ent_to_oid(struct oident *ent, int *dst);
+struct oident *oid_getentbyoid(int *o);
+</verb></tscreen>
+
+are provided to map between object identifiers and database entries.
+If you store a member of the <tt/oid_proto/ type in your association
+state information, it's a simple matter, at runtime, to generate the
+correct OID when you need it. For decoding, you can simply ignore the
+proto field, or if you're strict, you can verify that your peer is
+using the OID family from the correct protocol. The <tt/desc/ field is
+a short, human-readable name for the PDU, useful mainly for diagnostic
+output.
+
+<it>
+NOTE: The old function oid_getoidbyent still exists but is
+not thread safe. Use oid_ent_to_oid instead and pass an array of
+size OID_SIZE.
+</it>
+
+<it>
+NOTE: Plans are underway to merge the two protocols into a single
+definition, with one set of object identifiers. When this happens, the
+oid module will no longer be required to support protocol
+independence, but it should still be useful as a simple OID database.
+</it>
+
+<sect1>EXTERNAL Data
+
+<p>
+In order to achieve extensibility and adaptability to different
+application domains, the new version of the protocol defines many
+structures outside of the main ASN.1 specification, referencing them
+through ASN.1 EXTERNAL constructs. To simplify the construction and access
+to the externally referenced data, the <bf/ASN/ module defines a
+specialized version of the EXTERNAL construct, called <tt/Z_External/.
+It is defined thus:
+
+<tscreen><verb>
+typedef struct Z_External
+{
+    Odr_oid *direct_reference;
+    int *indirect_reference;
+    char *descriptor;
+    enum
+    {
+	/* Generic types */
+	Z_External_single = 0,
+	Z_External_octet,
+	Z_External_arbitrary,
+
+	/* Specific types */
+	Z_External_SUTRS,
+	Z_External_explainRecord,
+	Z_External_resourceReport1,
+	Z_External_resourceReport2
+
+	...
+
+    } which;
+    union
+    {
+	/* Generic types */
+	Odr_any *single_ASN1_type;
+	Odr_oct *octet_aligned;
+	Odr_bitmask *arbitrary;
+
+	/* Specific types */
+	Z_SUTRS *sutrs;
+	Z_ExplainRecord *explainRecord;
+	Z_ResourceReport1 *resourceReport1;
+	Z_ResourceReport2 *resourceReport2;
+
+	...
+
+    } u;
+} Z_External;
+</verb></tscreen>
+
+When decoding, the <bf/ASN/ module will attempt to determine which
+syntax describes the data by looking at the reference fields
+(currently only the direct-reference). For ASN.1 structured data, you
+need only consult the <tt/which/ field to determine the type of data.
+You can the access  the data directly through the union. When
+constructing data for encoding, you set the union pointer to point to
+the data, and set the <tt/which/ field accordingly. Remember also to
+set the direct (or indirect) reference to the correct OID for the data
+type. For non-ASN.1 data such as MARC records, use the
+<tt/octet_aligned/ arm of the union.
+
+Some servers return ASN.1 structured data values (eg. database
+records) as BER-encoded records placed in the <tt/octet-aligned/
+branch of the EXTERNAL CHOICE. The ASN-module will <it/not/
+automatically decode these records. To help you decode the records in
+the application, the function
+
+<tscreen><verb>
+Z_ext_typeent *z_ext_gettypebyref(oid_value ref);
+</verb></tscreen>
+
+Can be used to retrieve information about the known, external data
+types. The function return a pointer to a static area, or NULL, if no
+match for the given direct reference is found. The <tt/Z_ext_typeent/
+is defined as:
+
+<tscreen><verb>
+typedef struct Z_ext_typeent
+{
+    oid_value dref;    /* the direct-reference OID value. */
+    int what;          /* discriminator value for the external CHOICE */
+    Odr_fun fun;       /* decoder function */
+} Z_ext_typeent;
+</verb></tscreen>
+
+The <tt/what/ member contains the Z_External union discriminator value
+for the given type: For the SUTRS record syntax, the value would be
+<tt/Z_External_sutrs/. The <tt/fun/ member contains a pointer to the
+function which encodes/decodes the given type. Again, for the SUTRS
+record syntax, the value of <tt/fun/ would be <tt/z_SUTRS/ (a function
+pointer).
+
+If you receive an EXTERNAL which contains an octet-string value that
+you suspect of being an ASN.1-structured data value, you can use
+<tt/z_ext_gettypebyref/ to look for the provided direct-reference. If
+the return value is different from NULL, you can use the provided
+function to decode the BER string (see section <ref id="odr-use"
+name="Using ODR">). 
+
+If you want to <it/send/ EXTERNALs containing ASN.1-structured values
+in the occtet-aligned branch of the CHOICE, this is possible too.
+However, on the encoding phase, it requires a somewhat involved
+juggling around of the various buffers involved.
+
+If you need to add new, externally defined data types, you must update
+the struct above, in the source file <tt/prt-ext.h/, as well as the
+encoder/decoder in the file <tt/prt-ext.c/. When changing the latter,
+remember to update both the <tt/arm/ arrary and the list <tt/type_table/,
+which drives the CHOICE biasing that is necessary to tell the
+different, structured types apart on decoding.
+
+<it>
+NOTE: Eventually, the EXTERNAL processing will most likely
+automatically insert the correct OIDs or indirect-refs. First,
+however, we need to determine how application-context management
+(specifically the presentation-context-list) should fit into the
+various modules.
+</it>
+
+<sect1>PDU Contents Table
+
+<p>
+We include, for reference, a listing of the fields of each top-level
+PDU, as well as their default settings.
+
+<verb>
+Z_InitRequest
+-------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+protocolVersion              Odr_bitmask         Empty bitmask
+options                      Odr_bitmask         Empty bitmask
+preferredMessageSize         int                 30*1024
+maximumRecordSize            int                 30*1024
+idAuthentication             Z_IdAuthentication  NULL
+implementationId             char*               "YAZ (id=81)"
+implementationName           char*               "Index Data/YAZ"
+implementationVersion        char*               YAZ_VERSION
+userInformationField         Z_UserInformation   NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_InitResponse
+--------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+protocolVersion              Odr_bitmask         Empty bitmask
+options                      Odr_bitmask         Empty bitmask
+preferredMessageSize         int                 30*1024
+maximumRecordSize            int                 30*1024
+result                       bool_t              TRUE
+implementationId             char*               "YAZ (id=81)"
+implementationName           char*               "Index Data/YAZ"
+implementationVersion        char*               YAZ_VERSION
+userInformationField         Z_UserInformat..    NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_SearchRequest
+---------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+smallSetUpperBound           int                 0
+largeSetLowerBound           int                 1
+mediumSetPresentNumber       int                 0
+replaceIndicator             bool_t              TRUE
+resultSetName                char*               "default"
+num_databaseNames            int                 0
+databaseNames                char**              NULL
+smallSetElementSetNames      Z_ElementSetNames   NULL
+mediumSetElementSetNames     Z_ElementSetNames   NULL
+preferredRecordSyntax        Odr_oid             NULL
+query                        Z_Query             NULL
+additionalSearchInfo         Z_OtherInformation  NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_SearchResponse
+----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+resultCount                  int                 0
+numberOfRecordsReturned      int                 0
+nextResultSetPosition        int                 0
+searchStatus                 bool_t              TRUE
+resultSetStatus              int                 NULL
+presentStatus                int                 NULL
+records                      Z_Records           NULL
+additionalSearchInfo         Z_OtherInformation  NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_PresentRequest
+----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+resultSetId                  char*               "default"
+resultSetStartPoint          int                 1
+numberOfRecordsRequested     int                 10
+num_ranges                   int                 0
+additionalRanges             Z_Range             NULL
+recordComposition            Z_RecordComposition NULL
+preferredRecordSyntax        Odr_oid             NULL
+maxSegmentCount              int                 NULL
+maxRecordSize                int                 NULL
+maxSegmentSize               int                 NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_PresentResponse
+-----------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+numberOfRecordsReturned      int                 0
+nextResultSetPosition        int                 0
+presentStatus                int                 Z_PRES_SUCCESS
+records                      Z_Records           NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_DeleteResultSetRequest
+------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+deleteFunction               int                 Z_DeleteRequest_list
+num_ids                      int                 0
+resultSetList                char**              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_DeleteResultSetResponse
+-------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+deleteOperationStatus        int                 Z_DeleteStatus_success
+num_statuses                 int                 0
+deleteListStatuses           Z_ListStatus**      NULL
+numberNotDeleted             int                 NULL
+num_bulkStatuses             int                 0
+bulkStatuses                 Z_ListStatus        NULL
+deleteMessage                char*               NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ScanRequest
+-------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+num_databaseNames            int                 0
+databaseNames                char**              NULL
+attributeSet                 Odr_oid             NULL
+termListAndStartPoint        Z_AttributesPlus... NULL
+stepSize                     int                 NULL
+numberOfTermsRequested       int                 20
+preferredPositionInResponse  int                 NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ScanResponse
+--------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+stepSize                     int                 NULL
+scanStatus                   int                 Z_Scan_success
+numberOfEntriesReturned      int                 0
+positionOfTerm               int                 NULL
+entries                      Z_ListEntris        NULL
+attributeSet                 Odr_oid             NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_TriggerResourceControlRequest
+-------------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+requestedAction              int                 Z_TriggerResourceCtrl_resou..
+prefResourceReportFormat     Odr_oid             NULL
+resultSetWanted              bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ResourceControlRequest
+------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+suspendedFlag                bool_t              NULL
+resourceReport               Z_External          NULL
+partialResultsAvailable      int                 NULL
+responseRequired             bool_t              FALSE
+triggeredRequestFlag         bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_ResourceControlResponse
+-------------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+continueFlag                 bool_t              TRUE
+resultSetWanted              bool_t              NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_AccessControlRequest
+----------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+which                        enum                Z_AccessRequest_simpleForm;
+u                            union               NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_AccessControlResponse
+-----------------------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+which                        enum                Z_AccessResponse_simpleForm
+u                            union               NULL
+diagnostic                   Z_DiagRec           NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_Segment
+---------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+numberOfRecordsReturned      int                 value=0
+num_segmentRecords           int                 0
+segmentRecords               Z_NamePlusRecord    NULL
+otherInfo                    Z_OtherInformation  NULL
+
+Z_Close
+-------
+Field                        Type                Default value
+
+referenceId                  Z_ReferenceId       NULL
+closeReason                  int                 Z_Close_finished
+diagnosticInformation        char*               NULL
+resourceReportFormat         Odr_oid             NULL
+resourceFormat               Z_External          NULL
+otherInfo                    Z_OtherInformation  NULL
+</verb>
+
+<sect>Supporting Tools
+
+<p>
+In support of the service API - primarily the ASN module, which
+provides the programmatic interface to the Z39.50 APDUs, YAZ contains
+a collection of tools that support the development of applications.
+
+<sect1>Query Syntax Parsers
+
+<p>
+Since the type-1 (RPN) query structure has no direct, useful string
+representation, every origin application needs to provide some form of
+mapping from a local query notation or representation to a
+<tt/Z_RPNQuery/ structure. Some programmers will prefer to construct
+the query manually, perhaps using <tt/odr_malloc()/ to simplify memory
+management. The YAZ distribution includes two separate,
+query-generating tools that may be of use to you.
+
+<sect2>Prefix Query Format
+
+<p>
+Since RPN or reverse polish notation is really just a fancy way of
+describing a suffix notation format (operator follows operands), it
+would seem that the confusion is total when we now introduce a prefix
+notation for RPN. The reason is one of simple laziness - it's somewhat
+simpler to interpret a prefix format, and this utility was designed
+for maximum simplicity, to provide a baseline representation for use
+in simple test applications and scripting environments (like Tcl). The
+demonstration client included with YAZ uses the PQF.
+
+The PQF is defined by the pquery module in the YAZ library. The
+<tt/pquery.h/ file provides the declaration of the functions
+
+<tscreen><verb>
+Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
+
+Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+      Odr_oid **attributeSetP, const char *qbuf);
+
+int p_query_attset (const char *arg);
+</verb></tscreen>
+
+The function <tt/p_query_rpn()/ takes as arguments an <bf/ODR/ stream
+(see section <ref id="odr" name="The ODR Module">) to provide a memory
+source (the structure created is released on the next call to
+<tt/odr_reset()/ on the stream/), a protocol identifier (one of the
+constants <tt/PROTO_Z3950/ and <tt/PROTO_SR/), an attribute set
+reference, and finally a null-terminated string holding the query
+string.
+
+If the parse went well, <tt/p_query_rpn()/ returns a pointer to a
+<tt/Z_RPNQuery/ structure which can be placed directly into a
+<tt/Z_SearchRequest/.
+
+The <tt/p_query_attset/ specifies which attribute set to use if
+the query doesn't specify one by the <tt/@attrset/ operator. The
+<tt/p_query_attset/ returns 0 if the argument is a valid attribute
+set specifier; otherwise the function returns -1.
+
+The grammar of the PQF is as follows:
+
+<tscreen><verb>
+Query ::= &lsqb; AttSet &rsqb; QueryStruct.
+
+AttSet ::= string.
+
+QueryStruct ::= { Attribute } Simple | Complex.
+
+Attribute ::= '@attr' AttributeType '=' AttributeValue.
+
+AttributeType ::= integer.
+
+AttributeValue ::= integer.
+
+Complex ::= Operator QueryStruct QueryStruct.
+
+Operator ::= '@and' | '@or' | '@not' | '@prox' Proximity.
+
+Simple ::= ResultSet | Term.
+
+ResultSet ::= '@set' string.
+
+Term ::= string | '"' string '"'.
+
+Proximity ::= Exclusion Distance Ordered Relation WhichCode UnitCode.
+
+Exclusion ::= '1' | '0' | 'void'.
+
+Distance ::= integer.
+
+Ordered ::= '1' | '0'.
+
+Relation ::= integer.
+
+WhichCode ::= 'known' | 'private' | integer.
+
+UnitCode ::= integer.
+</verb></tscreen>
+
+You will note that the syntax above is a fairly faithful
+representation of RPN, except for the <tt/Attibute/, which has been
+moved a step away from the term, allowing you to associate one or more
+attributes with an entire query structure. The parser will
+automatically apply the given attributes to each term as required.
+
+The following are all examples of valid queries in the PQF.
+
+<tscreen><verb>
+dylan
+
+"bob dylan"
+
+@or "dylan" "zimmerman"
+
+@set Result-1
+
+@or @and bob dylan @set Result-1
+
+@attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
+
+@attr 4=1 @attr 1=4 "self portrait"
+
+@prox 0 3 1 2 k 2 dylan zimmerman
+</verb></tscreen>
+
+<sect2>Common Command Language
+
+<p>
+Not all users enjoy typing in prefix query structures and numerical
+attribute values, even in a minimalistic test client. In the library
+world, the more intuitive Common Command Language (or ISO 8777) has
+enjoyed some popularity - especially before the widespread
+availability of graphical interfaces. It is still useful in
+applications where you for some reason or other need to provide a
+symbolic language for expressing boolean query structures.
+
+The EUROPAGATE research project working under the Libraries programme
+of the European Commission's DG XIII has, amongst other useful tools,
+implemented a general-purpose CCL parser which produces an output
+structure that can be trivially converted to the internal RPN
+representation of YAZ (The <tt/Z_RPNQuery/ structure). Since the CCL
+utility - along with the rest of the software produced by EUROPAGATE -
+is made freely available on a liberal license, it is included as a
+supplement to YAZ.
+
+<sect3>CCL Syntax
+<p>
+The CCL parser obeys the following grammar for the FIND argument.
+The syntax is annotated by in the lines prefixed by <tt/--/.
+
+<tscreen><verb>
+CCL-Find ::= CCL-Find Op Elements
+           | Elements.
+
+Op ::= "and" | "or" | "not"
+-- The above means that Elements are separated by boolean operators.
+
+Elements ::= '(' CCL-Find ')'
+           | Set
+           | Terms
+           | Qualifiers Relation Terms
+           | Qualifiers Relation '(' CCL-Find ')'
+           | Qualifiers '=' string '-' string
+-- Elements is either a recursive definition, a result set reference, a
+-- list of terms, qualifiers followed by terms, qualifiers followed
+-- by a recursive definition or qualifiers in a range (lower - upper).
+
+Set ::= 'set' = string
+-- Reference to a result set
+
+Terms ::= Terms Prox Term
+        | Term
+-- Proximity of terms.
+
+Term ::= Term string
+       | string
+-- This basically means that a term may include a blank
+
+Qualifiers ::= Qualifiers ',' string
+             | string
+-- Qualifiers is a list of strings separated by comma
+
+Relation ::= '=' | '>=' | '<=' | '<>' | '>' | '<'
+-- Relational operators. This really doesn't follow the ISO8777
+-- standard.
+
+Prox ::= '%' | '!'
+-- Proximity operator
+
+</verb></tscreen>
+
+The following queries are all valid:
+
+<tscreen><verb>
+dylan
+
+"bob dylan"
+
+dylan or zimmerman
+
+set=1
+
+(dylan and bob) or set=1
+
+</verb></tscreen>
+Assuming that the qualifiers <tt/ti/, <tt/au/ and <tt/date/ 
+are defined we may use:
+<tscreen><verb>
+ti=self portrait
+
+au=(bob dylan and slow train coming)
+
+date>1980 and (ti=((self portrait)))
+</verb></tscreen>
+
+<sect3>CCL Qualifiers
+<p>
+
+Qualifiers are used to direct the search to a particular searchable
+index, such as title (ti) and author indexes (au). The CCL standard
+itself doesn't specify a particular set of qualifiers, but it does
+suggest a few short-hand notations. You can customize the CCL parser
+to support a particular set of qualifiers to relect the current target
+profile. Traditionally, a qualifier would map to a particular
+use-attribute within the BIB-1 attribute set. However, you could also
+define qualifiers that would set, for example, the
+structure-attribute.
+
+Consider a scenario where the target support ranked searches in the
+title-index. In this case, the user could specify
+<tscreen><verb>
+ti,ranked=knuth computer
+</verb></tscreen>
+and the <tt/ranked/ would map to structure=free-form-text
+(4=105) and the <tt/ti/ would map to title (1=4).
+
+A "profile" with a set predefined CCL qualifiers can be read from a
+file. The YAZ client reads its CCL qualifiers from a file named
+<tt/default.bib/. Each line in the file has the form:
+
+<it/qualifier-name/    <it/type/=<it/val/ <it/type/=<it/val/ ...
+
+where <it/qualifier-name/ is the name of the qualifier to be used
+(eg. <tt/ti/), <it/type/ is a BIB-1 category type and <it/val/ is the
+corresponding BIB-1 attribute value. The <it/type/ can be either
+numeric or it may be either <tt/u/ (use), <tt/r/ (relation), <tt/p/
+(position), <tt/s/ (structure), <tt/t/ (truncation) or <tt/c/
+(completeness). The <it/qualifier-name/ <tt/term/ has a special
+meaning. The types and values for this definition is used when <it/no/
+qualifier is present.
+
+Consider the following definition:
+<tscreen><verb>
+ti       u=4 s=1
+au       u=1 s=1
+term     s=105
+</verb></tscreen>
+Two qualifiers are defined, <tt/ti/ and <tt/au/. They both set the
+structure-attribute to phrase (1). <tt/ti/ sets the use-attribute to
+4. <tt/au/ sets the use-attribute to 1. When no qualifiers are used
+in the query the structure-attribute is set to free-form-text (105).
+
+<sect3>CCL API
+<p>
+
+All public definitions can be found in the header file <tt/ccl.h/.
+A profile identifier is of type <tt/CCL_bibset/. A profile must be
+created with the call to the function <tt/ccl_qual_mk/ which returns
+a profile handle of type <tt/CCL_bibset/.
+
+To read a file containing qualifier definitions the function
+<tt/ccl_qual_file/ may be convenient. This function takes an already
+opened <tt/FILE/ handle pointer as argument along with a
+<tt/CCL_bibset/ handle.
+
+To parse a simple string with a FIND query use the function
+<tscreen><verb>
+struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
+                                   int *error, int *pos);
+</verb></tscreen>
+which takes the CCL profile (<tt/bibset/) and query (<tt/str/) as
+input. Upon successful completion the RPN tree is returned. If an
+error eccur, such as a syntax error, the integer pointed to by
+<tt/error/ holds the error code and <tt/pos/ holds the offset inside
+query string in which the parsing failed.
+
+An english representation of the error may be obtained by calling
+the <tt/ccl_err_msg/ function. The error codes are listed in
+<tt/ccl.h/.
+
+To convert the CCL RPN tree (type <tt/struct ccl_rpn_node */) to the
+Z_RPNQuery of YAZ the function <tt/ccl_rpn_query/ must be used. This
+function which is part of YAZ is implemented in <tt/yaz-ccl.c/.
+After calling this function the CCL RPN tree is probably no longer
+needed. The <tt/ccl_rpn_delete/ destroys the CCL RPN tree.
+
+A CCL profile may be destroyed by calling the <tt/ccl_qual_rm/
+function.
+
+The token names for the CCL operators may be changed by setting the
+globals (all type <tt/char */) <tt/ccl_token_and/, <tt/ccl_token_or/,
+<tt/ccl_token_not/ and <tt/ccl_token_set/.
+An operator may have aliases, i.e. there may be more than one name for
+the operator. To do this, separate each alias with a space character.
+
+<sect1>Object Identifiers
+
+<p>
+The basic YAZ representation of an OID is an array of integers,
+terminated with the value -1. The <bf/ODR/ module provides two
+utility-functions to create and copy this type of data elements:
+
+<tscreen><verb>
+Odr_oid *odr_getoidbystr(ODR o, char *str);
+</verb></tscreen>
+
+Creates an OID based on a string-based representation using dots (.)
+to separate elements in the OID.
+
+<tscreen><verb>
+Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
+</verb></tscreen>
+
+Creates a copy of the OID referenced by the <it/o/ parameter. Both
+functions take an <bf/ODR/ stream as parameter. This stream is used to
+allocate memory for the data elements, which is released on a
+subsequent call to <tt/odr_reset()/ on that stream.
+
+The <bf/OID/ module provides a higher-level representation of the
+family of object identifers which describe the Z39.50 protocol and its
+related objects. The definition of the module interface is given in
+the <tt/oid.h/ file.
+
+The interface is mainly based on the <tt/oident/ structure. The
+definition of this structure looks like this:
+
+<tscreen><verb>
+typedef struct oident
+{
+    oid_proto proto;
+    oid_class oclass;
+    oid_value value;
+    int oidsuffix[OID_SIZE];
+    char *desc;
+} oident;
+</verb></tscreen>
+
+The <it/proto/ field takes one of the values
+
+<tscreen><verb>
+PROTO_Z3950
+PROTO_SR
+</verb></tscreen>
+
+If you don't care about talking to SR-based implementations (few
+exist, and they may become fewer still if and when the ISO SR and ANSI
+Z39.50 documents are merged into a single standard), you can ignore
+this field on incoming packages, and always set it to PROTO_Z3950
+for outgoing packages.
+
+The <it/oclass/ field takes one of the values
+
+<tscreen><verb>
+CLASS_APPCTX
+CLASS_ABSYN
+CLASS_ATTSET
+CLASS_TRANSYN
+CLASS_DIAGSET
+CLASS_RECSYN
+CLASS_RESFORM
+CLASS_ACCFORM
+CLASS_EXTSERV
+CLASS_USERINFO
+CLASS_ELEMSPEC
+CLASS_VARSET
+CLASS_SCHEMA
+CLASS_TAGSET
+CLASS_GENERAL
+</verb></tscreen>
+
+corresponding to the OID classes defined by the Z39.50 standard.
+
+Finally, the <it/value/ field takes one of the values
+
+<tscreen><verb>
+VAL_APDU
+VAL_BER
+VAL_BASIC_CTX
+VAL_BIB1
+VAL_EXP1
+VAL_EXT1
+VAL_CCL1
+VAL_GILS
+VAL_WAIS
+VAL_STAS
+VAL_DIAG1
+VAL_ISO2709
+VAL_UNIMARC
+VAL_INTERMARC
+VAL_CCF
+VAL_USMARC
+VAL_UKMARC
+VAL_NORMARC
+VAL_LIBRISMARC
+VAL_DANMARC
+VAL_FINMARC
+VAL_MAB
+VAL_CANMARC
+VAL_SBN
+VAL_PICAMARC
+VAL_AUSMARC
+VAL_IBERMARC
+VAL_EXPLAIN
+VAL_SUTRS
+VAL_OPAC
+VAL_SUMMARY
+VAL_GRS0
+VAL_GRS1
+VAL_EXTENDED
+VAL_RESOURCE1
+VAL_RESOURCE2
+VAL_PROMPT1
+VAL_DES1
+VAL_KRB1
+VAL_PRESSET
+VAL_PQUERY
+VAL_PCQUERY
+VAL_ITEMORDER
+VAL_DBUPDATE
+VAL_EXPORTSPEC
+VAL_EXPORTINV
+VAL_NONE
+VAL_SETM
+VAL_SETG
+VAL_VAR1
+VAL_ESPEC1
+</verb></tscreen>
+
+again, corresponding to the specific OIDs defined by the standard.
+
+The <it/desc/ field contains a brief, mnemonic name for the OID in
+question.
+
+The function
+
+<tscreen><verb>
+struct oident *oid_getentbyoid(int *o);
+</verb></tscreen>
+
+takes as argument an OID, and returns a pointer to a static area
+containing an <tt/oident/ structure. You typically use this function
+when you receive a PDU containing an OID, and you wish to branch out
+depending on the specific OID value.
+
+The function
+
+<tscreen><verb>
+int *oid_ent_to_oid(struct oident *ent, int *dst);
+</verb></tscreen>
+
+Takes as argument an <tt/oident/ structure - in which the <it/proto/,
+<it/oclass/, and <it/value/ fields are assumed to be set correctly -
+and returns a pointer to a the buffer as given by <it/dst/ 
+containing the base
+representation of the corresponding OID. The function returns
+NULL and the array dst is unchanged if a mapping couldn't place.
+The array <it/dst/ should be at least of size <tt>OID_SIZE</tt>.
+
+The <tt/oid_ent_to_oid()/ function can be used whenever you need to
+prepare a PDU containing one or more OIDs. The separation of the
+<it/protocol/ element from the remainer of the OID-description makes
+it simple to write applications that can communicate with either
+Z39.50 or OSI SR-based applications.
+
+The function
+
+<tscreen><verb>
+oid_value oid_getvalbyname(const char *name);
+</verb></tscreen>
+
+takes as argument a mnemonic OID name, and returns the <it/value/
+field of the first entry in the database that contains the given name
+in its <it/desc/ field.
+
+Finally, the module provides the following utility functions, whose
+meaning should be obvious:
+
+<tscreen><verb>
+void oid_oidcpy(int *t, int *s);
+void oid_oidcat(int *t, int *s);
+int oid_oidcmp(int *o1, int *o2);
+int oid_oidlen(int *o);
+</verb></tscreen>
+
+<it>
+NOTE: The <bf/OID/ module has been criticized - and perhaps rightly so
+- for needlessly abstracting the
+representation of OIDs. Other toolkits use a simple
+string-representation of OIDs with good results. In practice, we have
+found the interface comfortable and quick to work with, and it is a
+simple matter (for what it's worth) to create applications compatible
+with both ISO SR and Z39.50. Finally, the use of the <tt/oident/
+database is by no means mandatory. You can easily create your
+own system for representing OIDs, as long as it is compatible with the
+low-level integer-array representation of the ODR module.
+</it>
+
+<sect1>Nibble Memory
+
+<p>
+Sometimes when you need to allocate and construct a large,
+interconnected complex of structures, it can be a bit of a pain to
+release the associated memory again. For the structures describing the
+Z39.50 PDUs and related structures, it is convenient to use the
+memory-management system of the <bf/ODR/ subsystem (see
+<ref id="odr-use" name="Using ODR">). However, in some circumstances
+where you might otherwise benefit from using a simple nibble memory
+management system, it may be impractical to use <tt/odr_malloc()/ and
+<bf/odr_reset()/. For this purpose, the memory manager which also
+supports the <bf/ODR/ streams is made available in the <bf/NMEM/
+module. The external interface to this module is given in the
+<tt/nmem.h/ file.
+
+The following prototypes are given:
+
+<tscreen><verb>
+NMEM nmem_create(void);
+void nmem_destroy(NMEM n);
+void *nmem_malloc(NMEM n, int size);
+void nmem_reset(NMEM n);
+int nmem_total(NMEM n);
+void nmem_init(void);
+</verb></tscreen>
+
+The <tt/nmem_create()/ function returns a pointer to a memory control
+handle, which can be released again by <tt/nmem_destroy()/ when no
+longer needed. The function <tt/nmem_malloc()/ allocates a block of
+memory of the requested size. A call to <tt/nmem_reset()/ or
+<tt/nmem_destroy()/ will release all memory allocated on the handle
+since it was created (or since the last call to
+<tt/nmem_reset()/. The function <tt/nmem_total()/ returns the number
+of bytes currently allocated on the handle.
+
+Note that the nibble memory pool is shared amonst threads. Posix
+mutex'es and WIN32 Critical sections are introduced to keep the
+module thread safe. On WIN32 function <tt/nmem_init()/ initialises
+the Critical Section handle and should be called once before any
+other nmem function is used.
+
+<sect>The ODR Module<label id="odr">
+
+<sect1>Introduction
+
+<p>
+<bf/ODR/ is the BER-encoding/decoding subsystem of <bf/YAZ/. Care as been taken
+to isolate <bf/ODR/ from the rest of the package - specifically from the
+transport interface. <bf/ODR/ may be used in any context where basic
+ASN.1/BER representations are used.
+
+If you are only interested in writing a Z39.50 implementation based on
+the PDUs that are already provided with <bf/YAZ/, you only need to concern
+yourself with the section on managing ODR streams (section
+<ref id="odr-use" name="Using ODR">). Only if you need to
+implement ASN.1 beyond that which has been provided, should you
+worry about the second half of the documentation
+(section <ref id="odr-prog" name="Programming with ODR">). If you use
+one of the higher-level interfaces, you can skip this section entirely.
+
+This is important, so we'll repeat it for emphasis: <it>You do not
+need to read section <ref id="odr-prog" name="Programming with ODR"> to
+implement Z39.50 with <bf/YAZ/.</it>
+
+If you need a part of the protocol that isn't already in <bf/YAZ/, you
+should
+contact the authors before going to work on it yourself: We
+might already be working on it. Conversely, if you implement a useful
+part of the protocol before us, we'd be happy to include it in a
+future release.
+
+<sect1>Using ODR<label id="odr-use">
+
+<p>
+<sect2>ODR Streams
+
+<p>
+Conceptually, the ODR stream is the source of encoded data in the
+decoding mode; when encoding, it is the receptacle for the encoded
+data. Before you can use an ODR stream it must be allocated. This is
+done with the function
+
+<tscreen><verb>
+ODR odr_createmem(int direction);
+</verb></tscreen>
+
+The <tt/odr_createmem()/ function takes as argument one of three manifest
+constants: <tt/ODR_ENCODE/, <tt/ODR_DECODE/, or <tt/ODR_PRINT/. An
+ODR stream can be
+in only one mode - it is not possible to change its mode once it's
+selected. Typically, your program will allocate at least two ODR
+streams - one for decoding, and one for encoding.
+
+When you're done with the stream, you can use
+
+<tscreen><verb>
+void odr_destroy(ODR o);
+</verb></tscreen>
+
+to release the resources allocated for the stream.
+
+<sect2>Memory Management<label id="memory">
+
+<p>
+Two forms of memory management take place in the ODR system. The first
+one, which has to do with allocating little bits of memory (sometimes
+quite large bits of memory, actually) when a protocol package is
+decoded, and turned into a complex of interlinked structures. This
+section deals with this system, and how you can use it for your own
+purposes. The next section deals with the memory management which is
+required when encoding data - to make sure that a large enough buffer is
+available to hold the fully encoded PDU.
+
+The <bf/ODR/ module has its own memory management system, which is
+used whenever memory is required. Specifically, it is used to allocate
+space for data when decoding incoming PDUs. You can use the memory
+system for your own purposes, by using the function
+
+<tscreen><verb>
+void *odr_malloc(ODR o, int size);
+</verb></tscreen>
+
+You can't use the normal <tt/free/(2) routine to free memory allocated
+by this function, and <bf/ODR/ doesn't provide a parallel function. Instead,
+you can call
+
+<tscreen><verb>
+void odr_reset(ODR o, int size);
+</verb></tscreen>
+
+when you are done with the
+memory: Everything allocated since the last call to <tt/odr_reset()/ is
+released. The <tt/odr_reset()/ call is also required to clear up an
+error condition on a stream.
+
+The function
+
+<tscreen><verb>
+int odr_total(ODR o);
+</verb></tscreen>
+
+returns the number of bytes allocated on the stream since the last call to
+<tt/odr_reset()/.
+
+The memory subsystem of <bf/ODR/ is fairly efficient at allocating and
+releasing little bits of memory. Rather than managing the individual,
+small bits of space, the system maintains a freelist of larger chunks
+of memory, which are handed out in small bits. This scheme is
+generally known as a <it/nibble memory/ system. It is very useful for
+maintaing short-lived constructions such as protocol PDUs.
+
+If you want to retain a bit of memory beyond the next call to
+<tt/odr_reset()/, you can use the function
+
+<tscreen><verb>
+ODR_MEM odr_extract_mem(ODR o);
+</verb></tscreen>
+
+This function will give you control of the memory recently allocated
+on the ODR stream. The memory will live (past calls to <tt/odr_reset()/),
+until you call the function
+
+<tscreen><verb>
+void odr_release_mem(ODR_MEM p);
+</verb></tscreen>
+
+The opaque <tt/ODR_MEM/ handle has no other purpose than referencing
+the memory block for you until you want to release it.
+
+You can use <tt/odr_extract_mem()/ repeatedly between allocating data,
+to retain individual control of separate chunks of data.
+
+<sect2>Encoding and Decoding Data
+
+<p>
+When encoding data, the ODR stream will write the encoded octet string
+in an internal buffer. To retrieve the data, use the function
+
+<tscreen><verb>
+char *odr_getbuf(ODR o, int *len, int *size);
+</verb></tscreen>
+
+The integer pointed to by len is set to the length of the encoded
+data, and a pointer to that data is returned. *<tt/size/ is set to the size
+of the buffer (unless <tt/size/ is null, signalling that you are
+not interested in the size). The next call to a primitive function
+using the same ODR stream will overwrite the data, unless a different
+buffer has been supplied using the call
+
+<tscreen><verb>
+void odr_setbuf(ODR o, char *buf, int len, int can_grow);
+</verb></tscreen>
+
+which sets the encoding (or decoding) buffer used by <tt/o/ to
+<tt/buf/,
+using the length <tt/len/. Before a call to an encoding function,
+you can use <tt/odr_setbuf()/ to provide the stream with an encoding buffer
+of sufficient size (length). The <tt/can_grow/ parameter tells the encoding
+ODR stream whether it is allowed to use <tt/realloc/(2) to increase the size
+of the buffer when necessary. The default condition of a new encoding
+stream is equivalent to the results of calling
+
+<tscreen><verb>
+odr_setbuf(stream, 0, 0, 1);
+</verb></tscreen>
+
+In this case, the stream will allocate and reallocate memory as
+necessary. The stream reallocates memory by repeatedly doubling the
+size of the buffer - the result is that the buffer will typically
+reach its maximum, working size with only a small number of reallocation
+operations. The memory is freed by the stream when the latter is destroyed,
+unless it was assigned by the user with the <tt/can_grow/
+parameter set to zero (in this case, you are expected to retain
+control of the memory yourself).
+
+To assume full control of an encoded buffer, you must first call
+<tt/odr_getbuf()/ to fetch the buffer and its length. Next, you should
+call <tt/odr_setbuf()/ to provide a different buffer (or a null
+pointer) to the stream. In the simplest case, you will reuse the same
+buffer over and over again, and you will just need to call
+<tt/odr_getbuf()/ after each encoding operation to get the length and
+address of the buffer. Note that the stream may reallocate the buffer
+during an encoding operation, so it is necessary to retrieve the
+correct address after each encoding operation.
+
+It is important to realise that the ODR stream will not release this
+memory when you call <tt/odr_reset()/: It will merely update its
+internal pointers to prepare for the encoding of a new data value.
+When the stream is released by the <tt/odr_destroy()/ function, the
+memory given to it by odr_setbuf will be released <it/only/ if the
+<tt/can_grow/ parameter to <tt/odr_setbuf()/ was nonzero. The
+<tt/can_grow/ parameter, in other words, is a way of signalling who
+is to own the buffer, you or the ODR stream. If you never call
+<tt/odr_setbuf()/ on your encoding stream, which is typically the
+case, the buffer allocated by the stream will belong to the stream by
+default.
+
+When you wish to decode data, you should first call <tt/odr_setbuf()/, to
+tell the decoding stream where to find the encoded data, and how long
+the buffer is (the <tt/can_grow/ parameter is ignored by a decoding
+stream). After this, you can call the function corresponding to the
+data you wish to decode (eg, <tt/odr_integer()/ odr <tt/z_APDU()/).
+
+Examples of encoding/decoding functions:
+
+<tscreen><verb>
+int odr_integer(ODR o, int **p, int optional, const char *name);
+
+int z_APDU(ODR o, Z_APDU **p, int optional, const char *name);
+</verb></tscreen>
+
+If the data is absent (or
+doesn't match the tag corresponding to the type), the return value
+will be either 0 or 1 depending on the <tt/optional/ flag. If
+<tt/optional/
+is 0 and the data is absent, an error flag will be raised in the
+stream, and you'll need to call <tt/odr_reset()/ before you can use the
+stream again. If <tt/optional/ is nonzero, the pointer <it/pointed to/ by
+<tt/p/ will be set to the null value, and the function will return 1.
+The <tt/name/ argument is used to pretty-print the tag in question.
+It may be set to <tt/NULL/ if pretty-printing is not desired.
+
+If the data value is found where it's expected, the pointer
+<it/pointed to/ by the <tt/p/ argument will be set to point to the
+decoded type. The
+space for the type will be allocated and owned by the ODR stream, and
+it will live until you call <tt/odr_reset()/ on the stream. You cannot use
+<tt/free/(2) to release the memory. You can decode several data elements
+(by repeated calls to <tt/odr_setbuf()/ and your decoding function), and
+new memory will be allocated each time. When you do call
+<tt/odr_reset()/,
+everything decoded since the last call to <tt/odr_reset()/ will be
+released.
+
+The use of the double indirection can be a little confusing at first
+(its purpose will become clear later on, hopefully),
+so an example is in order. We'll encode an integer value, and
+immediately decode it again using a different stream. A useless, but
+informative operation.
+
+<tscreen><verb>
+void do_nothing_useful(int value)
+{
+    ODR encode, decode;
+    int *valp, *resvalp;
+    char *bufferp;
+    int len;
+
+    /* allocate streams */
+    if (!(encode = odr_createmem(ODR_ENCODE)))
+    	return;
+    if (!(decode = odr_createmem(ODR_DECODE)))
+    	return;
+
+    valp = &ero;value;
+    if (odr_integer(encode, &ero;valp, 0, 0) == 0)
+    {
+    	printf("encoding went bad\n");
+	return;
+    }
+    bufferp = odr_getbuf(encode, &ero;len);
+    printf("length of encoded data is &percnt;d\n", len);
+
+    /* now let's decode the thing again */
+    odr_setbuf(decode, bufferp, len);
+    if (odr_integer(decode, &ero;resvalp, 0, 0) == 0)
+    {
+    	printf("decoding went bad\n");
+	return;
+    }
+    printf("the value is &percnt;d\n", *resvalp);
+
+    /* clean up */
+    odr_destroy(encode);
+    odr_destroy(decode);
+}
+</verb></tscreen>
+
+This looks like a lot of work, offhand. In practice, the ODR streams
+will typically be allocated once, in the beginning of your program (or at the
+beginning of a new network session), and the encoding and decoding
+will only take place in a few, isolated places in your program, so the
+overhead is quite manageable.
+
+<sect2>Diagnostics
+
+<p>
+The encoding/decoding functions all return 0 when an error occurs.
+Until you call <tt/odr_reset()/, you cannot use the stream again, and
+any function called will immediately return 0.
+
+To provide information to the programmer or administrator, the
+function
+
+<tscreen><verb>
+void odr_perror(ODR o, char *message);
+</verb></tscreen>
+
+is provided, which prints the <tt/message/ argument to <tt/stderr/
+along with an error message from the stream.
+
+You can also use the function
+
+<tscreen><verb>
+int odr_geterror(ODR o);
+</verb></tscreen>
+
+to get the current error number from the screen. The number will be
+one of these constants:
+
+<descrip>
+<tag/OMEMORY/Memory allocation failed.
+<tag/OSYSERR/A system- or library call has failed. The standard
+diagnostic variable <tt/errno/
+should be examined to determine the actual error.
+<tag/OSPACE/No more space for encoding. This will only occur when the user has
+explicitly provided a buffer for an encoding stream without allowing
+the system to allocate more space.
+<tag/OREQUIRED/This is a common protocol error; A required data element was
+missing during
+encoding or decoding.
+<tag/OUNEXPECTED/An unexpected data element was found during decoding.
+<tag/OOTHER/Other error. This is typically an indication of misuse of
+the <bf/ODR/ system by the programmer, and also that the diagnostic
+system isn't as good as it should be, yet.
+</descrip>
+
+The character string array
+
+<tscreen><verb>
+char *odr_errlist&lsqb;&rsqb;
+</verb></tscreen>
+
+can be indexed by the error code to obtain a human-readable
+representation of the problem.
+
+<sect2>Summary and Synopsis
+
+<p>
+<tscreen><verb>
+#include <odr.h>
+
+ODR odr_createmem(int direction);
+
+void odr_destroy(ODR o);
+
+void odr_reset(ODR o);
+
+char *odr_getbuf(ODR o, int *len);
+
+void odr_setbuf(ODR o, char *buf, int len);
+
+void *odr_malloc(ODR o, int size);
+
+ODR_MEM odr_extract_mem(ODR o);
+
+void odr_release_mem(ODR_MEM r);
+
+int odr_geterror(ODR o);
+
+void odr_perror(char *message);
+
+extern char *odr_errlist[];
+</verb></tscreen>
+
+<sect1>Programming with ODR<label id="odr-prog">
+
+<p>
+The API of <bf/ODR/ is designed to reflect the structure of ASN.1, rather
+than BER itself. Future releases may be able to represent data in
+other external forms.
+
+The interface is based loosely on that of the Sun Microsystems XDR routines.
+Specifically, each function which corresponds to an ASN.1 primitive
+type has a dual function. Depending on the settings of the ODR
+stream which is supplied as a parameter, the function may be used
+either to encode or decode data. The functions that can be built
+using these primitive functions, to represent more complex datatypes, share
+this quality. The result is that you only have to enter the definition
+for a type once - and you have the functionality of encoding, decoding
+(and pretty-printing) all in one unit. The resulting C source code is
+quite compact, and is a pretty straightforward representation of the
+source ASN.1 specification. Although no ASN.1 compiler is supplied
+with <bf/ODR/ at this time, it shouldn't be too difficult to write one, or
+perhaps even to adapt an existing compiler to output <bf/ODR/ routines
+(not surprisingly, writing encoders/decoders using <bf/ODR/ turns out
+to be boring work).
+
+In many cases, the model of the XDR functions works quite well in this
+role. In
+others, it is less elegant. Most of the hassle comes from the optional
+SEQUENCE memebers which don't exist in XDR.
+
+<sect2>The Primitive ASN.1 Types
+
+<p>
+ASN.1 defines a number of primitive types (many of which correspond
+roughly to
+primitive types in structured programming languages, such as C).
+
+<sect3>INTEGER
+
+<p>
+The <bf/ODR/ function for encoding or decoding (or printing) the ASN.1
+INTEGER type looks like this:
+
+<tscreen><verb>
+int odr_integer(ODR o, int **p, int optional, const char *name);
+</verb></tscreen>
+
+(we don't allow values that can't be contained in a C integer.)
+
+This form is typical of the primitive <bf/ODR/ functions. They are named
+after the type of data that they encode or decode. They take an
+ODR
+stream, an indirect reference to the type in question, and an
+<tt/optional/ flag (corresponding to the OPTIONAL keyword of ASN.1) as
+parameters. They all return an integer value of either one or zero.
+When you use the primitive functions to construct encoders for complex
+types of your own, you should follow this model as well. This
+ensures that your new types can be reused as elements in yet more
+complex types.
+
+The <tt/o/ parameter should obviously refer to a properly
+initialized ODR
+stream of the right type (encoding/decoding/printing) for the
+operation that you wish to perform.
+
+When encoding or printing, the function first looks at *<tt/p/. If
+*<tt/p/ (the
+pointer pointed to by <tt/p/) is a null pointer, this is taken to mean that
+the data element is absent. If the <tt/optional/ parameter is nonzero,
+the function will return one (signifying success) without any further
+processing. If the <tt/optional/ is zero, an internal error flag is
+set in the ODR stream, and the function will return 0. No further
+operations can be carried out on the stream without a call to
+the function <tt/odr_reset()/.
+
+If *<tt/p/ is not a null pointer, it is expected to point to an instance of
+the data type. The data will be subjected to the encoding rules, and
+the result will be placed in the buffer held by the ODR stream.
+
+The other ASN.1 primitives have similar functions that operate in
+similar manners:
+
+<sect3>BOOLEAN
+
+<p>
+<tscreen><verb>
+int odr_bool(ODR o, bool_t **p, int optional, const char *name);
+</verb></tscreen>
+
+<sect3>REAL
+
+<p>
+Not defined.
+
+<sect3>NULL
+
+<p>
+<tscreen><verb>
+int odr_null(ODR o, bool_t **p, int optional, const char *name);
+</verb></tscreen>
+
+In this case, the value of **p is not important. If *p is different
+from the null pointer, the null value is present, otherwise it's
+absent.
+
+<sect3>OCTET STRING
+
+<p>
+<tscreen><verb>
+typedef struct odr_oct
+{
+    unsigned char *buf;
+    int len;
+    int size;
+} Odr_oct;
+
+int odr_octetstring(ODR o, Odr_oct **p, int optional, const char *name);
+</verb></tscreen>
+
+The <tt/buf/ field should point to the character array that holds the
+octetstring. The <tt/len/ field holds the actual length, while the
+<tt/size/
+field gives the size of the allocated array (not of interest to you,
+in most cases). The character array need not be null terminated.
+
+To make things a little easier, an alternative is given for string
+types that are not expected to contain embedded NULL characters (eg.
+VisibleString):
+
+<tscreen><verb>
+int odr_cstring(ODR o, char **p, int optional, const char *name);
+</verb></tscreen>
+
+Which encoded or decodes between OCTETSTRING representations and
+null-terminates C strings.
+
+Functions are provided for the derived string types, eg:
+
+<tscreen><verb>
+int odr_visiblestring(ODR o, char **p, int optional, const char *name);
+</verb></tscreen>
+
+<sect3>BIT STRING
+
+<p>
+<tscreen><verb>
+int odr_bitstring(ODR o, Odr_bitmask **p, int optional, const char *name);
+</verb></tscreen>
+
+The opaque type <tt/Odr_bitmask/ is only suitable for holding relatively brief bit
+strings, eg. for options fields, etc. The constant
+<tt/ODR_BITMASK_SIZE/
+multiplied by 8 gives the maximum possible number of bits.
+
+A set of macros are provided for manipulating the
+<tt/Odr_bitmask/
+type:
+
+<tscreen><verb>
+void ODR_MASK_ZERO(Odr_bitmask *b);
+
+void ODR_MASK_SET(Odr_bitmask *b, int bitno);
+
+void ODR_MASK_CLEAR(Odr_bitmask *b, int bitno);
+
+int ODR_MASK_GET(Odr_bitmask *b, int bitno);
+</verb></tscreen>
+
+The functions are modelled after the manipulation functions that
+accompany the <tt/fd_set/ type used by the <tt/select/(2) call.
+<tt/ODR_MASK_ZERO/ should always be called first on a new bitmask, to
+initialize the bits to zero.
+
+<sect3>OBJECT IDENTIFIER
+
+<p>
+<tscreen><verb>
+int odr_oid(ODR o, Odr_oid **p, int optional, const char *name);
+</verb></tscreen>
+
+The C OID represenation is simply an array of integers, terminated by
+the value -1 (the <tt/Odr_oid/ type is synonymous with the <tt/int/
+type). We suggest that you use the OID database module (see section
+<ref id="oid" name="Object Identifiers">) to handle object identifiers
+in your application.
+
+<sect2>Tagging Primitive Types<label id="tag-prim">
+
+<p>
+The simplest way of tagging a type is to use the <tt/odr_implicit_tag()/ or
+<tt/odr_explicit_tag()/ macros:
+
+<tscreen><verb>
+int odr_implicit_tag(ODR o, Odr_fun fun, int class, int tag, int
+                     optional, const char *name);
+
+int odr_explicit_tag(ODR o, Odr_fun fun, int class, int tag,
+                     int optional, const char *name);
+</verb></tscreen>
+
+To create a type derived from the integer type by implicit tagging, you
+might write:
+
+<tscreen><verb>
+MyInt ::= &lsqb;210&rsqb; IMPLICIT INTEGER
+</verb></tscreen>
+
+In the <bf/ODR/ system, this would be written like:
+
+<tscreen><verb>
+int myInt(ODR o, int **p, int optional, const char *name)
+{
+    return odr_implicit_tag(o, odr_integer, p,
+                   ODR_CONTEXT, 210, optional, name);
+}
+</verb></tscreen>
+
+The function <tt/myInt()/ can then be used like any of the primitive
+functions provided by ODR. Note that the behavior of
+<tt/odr_explicit()/
+and <tt/odr_implicit()/ macros act exactly the same as the functions they
+are applied to - they respond to error conditions, etc, in the same
+manner - they simply have three extra parameters. The class parameter may
+take one of the values: <tt/ODR_CONTEXT/, <tt/ODR_PRIVATE/,
+<tt/ODR_UNIVERSAL/, or
+<tt/ODR_APPLICATION/.
+
+<sect2>Constructed Types
+
+<p>
+Constructed types are created by combining primitive types. The
+<bf/ODR/
+system only implements the SEQUENCE and SEQUENCE OF constructions
+(although adding the rest of the container types should be simple
+enough, if the need arises).
+
+For implementing SEQUENCEs, the functions
+
+<tscreen><verb>
+int odr_sequence_begin(ODR o, void *p, int size, const char *name);
+int odr_sequence_end(ODR o);
+</verb></tscreen>
+
+are provided.
+
+The <tt/odr_sequence_begin()/ function should be called in the beginning of a
+function that implements a SEQUENCE type. Its parameters are the
+<bf/ODR/
+stream, a pointer (to a pointer to the type you're implementing), and
+the <tt/size/ of the type (typically a C structure). On encoding, it
+returns 1 if *<tt/p/ is a null pointer. The <tt/size/ parameter is ignored. On
+decoding, it returns 1 if the type is found in the data stream.
+<tt/size/
+bytes of memory are allocated, and *<tt/p/ is set to point to this space.
+<tt/odr_sequence_end()/ is called at the end of the complex function. Assume
+that a type is defined like this:
+
+<tscreen><verb>
+MySequence ::= SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</verb></tscreen>
+
+The corresponding ODR encoder/decoder function and the associated data
+structures could be written like this:
+
+<tscreen><verb>
+typedef struct MySequence
+{
+    int *intval;
+    bool_t *boolval;
+} MySequence;
+
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+    	return optional &ero;&ero; odr_ok(o);
+    return
+    	odr_integer(o, &ero;(*p)->intval, 0, "intval") &ero;&ero;
+	odr_bool(o, &ero;(*p)->boolval, 1, "boolval") &ero;&ero;
+	odr_sequence_end(o);
+}
+</verb></tscreen>
+
+Note the 1 in the call to <tt/odr_bool()/, to mark that the sequence
+member is optional. If either of the member types had been tagged, the
+macros <tt/odr_implicit()/ or <tt/odr_explicit()/ could have been used.
+The new
+function can be used exactly like the standard functions provided with
+<bf/ODR/. It will encode, decode or pretty-print a data value of the
+<tt/MySequence/ type. We like to name types with an initial capital, as
+done in ASN.1 definitions, and to name the corresponding function with
+the first character of the name in lower case. You could, of course,
+name your structures, types, and functions any way you please - as
+long as you're consistent, and your code is easily readable.
+<tt/odr_ok/ is
+just that - a predicate that returns the state of the stream. It is
+used to ensure that the behaviour of the new type is compatible with
+the interface of the primitive types.
+
+<sect2>Tagging Constructed Types
+
+<p>
+<it>
+NOTE: See section <ref id="tag-prim" name="Tagging Primitive types">
+for information on how to tag the primitive types, as well as types
+that are already defined.
+</it>
+
+<sect3>Implicit Tagging
+
+<p>
+Assume the type above had been defined as
+
+<tscreen><verb>
+MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</verb></tscreen>
+
+You would implement this in <bf/ODR/ by calling the function
+
+<tscreen><verb>
+int odr_implicit_settag(ODR o, int class, int tag);
+</verb></tscreen>
+
+which overrides the tag of the type immediately following it. The
+macro <tt/odr_implicit()/ works by calling <tt/odr_implicit_settag()/
+immediately
+before calling the function pointer argument. Your type function could
+look like this:
+
+<tscreen><verb>
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_implicit_settag(o, ODR_CONTEXT, 10) == 0 ||
+    	odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+    	return optional &ero;&ero; odr_ok(o);
+    return
+    	odr_integer(o, &ero;(*p)->intval, 0, "intval") &ero;&ero;
+	odr_bool(o, &ero;(*p)->boolval, 1, "boolval") &ero;&ero;
+	odr_sequence_end(o);
+}
+</verb></tscreen>
+
+The definition of the structure <tt/MySequence/ would be the same.
+
+<sect3>Explicit Tagging
+
+<p>
+Explicit tagging of constructed types is a little more complicated,
+since you are in effect adding a level of construction to the data.
+
+Assume the definition:
+
+<tscreen><verb>
+MySequence ::= &lsqb;10&rsqb; IMPLICIT SEQUENCE {
+    intval INTEGER,
+    boolval BOOLEAN OPTIONAL }
+</verb></tscreen>
+
+Since the new type has an extra level of construction, two new functions
+are needed to encapsulate the base type:
+
+<tscreen><verb>
+int odr_constructed_begin(ODR o, void *p, int class, int tag,
+       const char *name);
+
+int odr_constructed_end(ODR o);
+</verb></tscreen>
+
+Assume that the IMPLICIT in the type definition above were replaced
+with EXPLICIT (or that the IMPLICIT keyword were simply deleted, which
+would be equivalent). The structure definition would look the same,
+but the function would look like this:
+
+<tscreen><verb>
+int mySequence(ODR o, MySequence **p, int optional, const char *name)
+{
+    if (odr_constructed_begin(o, p, ODR_CONTEXT, 10, name) == 0)
+    	return optional &ero;&ero; odr_ok(o);
+    if (o->direction == ODR_DECODE)
+    	*p = odr_malloc(o, sizeof(**p));
+    if (odr_sequence_begin(o, p, sizeof(**p), 0) == 0)
+    {
+    	*p = 0; /* this is almost certainly a protocol error */
+    	return 0;
+    }
+    return
+    	odr_integer(o, &ero;(*p)->intval, 0, "intval") &ero;&ero;
+	odr_bool(o, &ero;(*p)->boolval, 1, "boolval") &ero;&ero;
+	odr_sequence_end(o) &ero;&ero;
+	odr_constructed_end(o);
+}
+</verb></tscreen>
+
+Notice that the interface here gets kind of nasty. The reason is
+simple: Explicitly tagged, constructed types are fairly rare in
+the protocols that we care about, so the
+aesthetic annoyance (not to mention the dangers of a cluttered
+interface) is less than the time that would be required to develop a
+better interface. Nevertheless, it is far from satisfying, and it's a
+point that will be worked on in the future. One option for you would
+be to simply apply the <tt/odr_explicit()/ macro to the first function,
+and not
+have to worry about <tt/odr_constructed_*/ yourself. Incidentally, as you
+might have guessed, the <tt/odr_sequence_/ functions are themselves
+implemented using the <tt/odr_constructed_/ functions.
+
+<sect2>SEQUENCE OF
+
+<p>
+To handle sequences (arrays) of a apecific type, the function
+
+<tscreen><verb>
+int odr_sequence_of(ODR o, int (*fun)(ODR o, void *p, int optional),
+                        void *p, int *num, const char *name);
+</verb></tscreen>
+
+The <tt/fun/ parameter is a pointer to the decoder/encoder
+function of the type. <tt/p/ is a pointer to an array of pointers to your
+type. <tt/num/ is the number of elements in the array.
+
+Assume a type
+
+<tscreen><verb>
+MyArray ::= SEQUENCE OF INTEGER
+</verb></tscreen>
+
+The C representation might be
+
+<tscreen><verb>
+typedef struct MyArray
+{
+    int num_elements;
+    int **elements;
+} MyArray;
+</verb></tscreen>
+
+And the function might look like
+
+<tscreen><verb>
+int myArray(ODR o, MyArray **p, int optional, const char *name)
+{
+    if (o->direction == ODR_DECODE)
+    	*p = odr_malloc(o, sizeof(**p));
+    if (odr_sequence_of(o, odr_integer, &ero;(*p)->elements,
+	&ero;(*p)->num_elements, name))
+	return 1;
+    *p = 0;
+    return optional &ero;&ero; odr_ok(o);
+}
+</verb></tscreen>
+
+<sect2>CHOICE Types
+
+<p>
+The choice type is used fairly often in some ASN.1 definitions, so
+some work has gone into streamlining its interface.
+
+CHOICE types are handled by the function:
+
+<tscreen><verb>
+int odr_choice(ODR o, Odr_arm arm&lsqb;&rsqb;, void *p, void *whichp,
+               const char *name);
+</verb></tscreen>
+
+The <tt/arm/ array is used to describe each of the possible types that the
+CHOICE type may assume. Internally in your application, the CHOICE
+type is represented as a discriminated union. That is, a C union
+accompanied by an integer (or enum) identifying the active 'arm' of
+the union. <tt/whichp/ is a pointer to the union discriminator. When
+encoding, it is examined to determine the current type. When decoding,
+it is set to reference the type that was found in the input stream.
+
+The Odr_arm type is defined thus:
+
+<tscreen><verb>
+typedef struct odr_arm
+{
+    int tagmode;
+    int class;
+    int tag;
+    int which;
+    Odr_fun fun;
+    char *name;
+} Odr_arm;
+</verb></tscreen>
+
+The interpretation of the fields are:
+
+<descrip>
+<tag/tagmode/Either <tt/ODR_IMPLICIT/, <tt/ODR_EXPLICIT/, or <tt/ODR_NONE/
+(-1) to mark
+no tagging.
+<tag/class, tag/The class and tag of the type (-1 if no tagging is
+used).
+<tag/which/The value of the discriminator that corresponds to
+this CHOICE element. Typically, it will be a &num;defined constant, or
+an enum member.
+<tag/fun/A pointer to a function that implements the type of
+the CHOICE member. It may be either a standard <bf/ODR/ type or a type
+defined by yourself.
+<tag/name/Name of tag.
+</descrip>
+
+A handy way to prepare the array for use by the <tt/odr_choice()/ function
+is to
+define it as a static, initialized array in the beginning of your
+decoding/encoding function. Assume the type definition:
+
+<tscreen><verb>
+MyChoice ::= CHOICE {
+    untagged INTEGER,
+    tagged   &lsqb;99&rsqb; IMPLICIT INTEGER,
+    other    BOOLEAN
+}
+</verb></tscreen>
+
+Your C type might look like
+
+<tscreen><verb>
+typedef struct MyChoice
+{
+    enum
+    {
+    	MyChoice_untagged,
+	MyChoice_tagged,
+	MyChoice_other
+    } which;
+    union
+    {
+    	int *untagged;
+	int *tagged;
+	bool_t *other;
+    } u;
+};
+</verb></tscreen>
+
+And your function could look like this:
+
+<tscreen><verb>
+int myChoice(ODR o, MyChoice **p, int optional, const char *name)
+{
+    static Odr_arm arm&lsqb;&rsqb; =
+    {
+    	{-1, -1, -1, MyChoice_untagged, odr_integer, "untagged"},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 99, MyChoice_tagged, odr_integer, 
+                                                            "tagged"},
+	{-1, -1, -1, MyChoice_other, odr_boolean, "other"},
+	{-1, -1, -1, -1, 0}
+    };
+
+    if (o->direction == ODR_DECODE)
+    	*p = odr_malloc(o, sizeof(**p);
+    else if (!*p)
+    	return optional &ero;&ero; odr_ok(o);
+
+    if (odr_choice(o, arm, &ero;(*p)->u, &ero;(*p)->which), name)
+    	return 1;
+    *p = 0;
+    return optional &ero;&ero; odr_ok(o);
+}
+</verb></tscreen>
+
+In some cases (say, a non-optional choice which is a member of a sequence),
+you can &dquot;embed&dquot; the union and its discriminator in the structure
+belonging to the enclosing type, and you won't need to fiddle with
+memory allocation to create a separate structure to wrap the
+discriminator and union.
+
+The corresponding function is somewhat nicer in the Sun XDR interface.
+Most of the complexity of this interface comes from the possibility of
+declaring sequence elements (including CHOICEs) optional.
+
+The ASN.1 specifictions naturally requires that each member of a
+CHOICE have a distinct tag, so they can be told apart on decoding.
+Sometimes it can be useful to define a CHOICE that has multiple types
+that share the same tag. You'll need some other mechanism, perhaps
+keyed to the context of the CHOICE type. In effect, we would like to
+introduce a level of context-sensitiveness to our ASN.1 specification.
+When encoding an internal representation, we have no problem, as long
+as each CHOICE member has a distinct discriminator value. For
+decoding, we need a way to tell the choice function to look for a
+specific arm of the table. The function
+
+<tscreen><verb>
+void odr_choice_bias(ODR o, int what);
+</verb></tscreen>
+
+provides this functionality. When called, it leaves a notice for the
+next call to <tt/odr_choice()/ to be called on the decoding
+stream <tt/o/ that only the <tt/arm/ entry with a <tt/which/ field
+equal to <tt/what/ should be tried.
+
+The most important application (perhaps the only one, really) is in
+the definition of application-specific EXTERNAL encoders/decoders
+which will automatically decode an ANY member given the direct or
+indirect reference.
+
+<sect1>Debugging
+
+<p>
+The protocol modules are suffering somewhat from a lack of diagnostic
+tools at the moment. Specifically ways to pretty-print PDUs that
+aren't recognized by the system. We'll include something to this end
+in a not-too-distant release. In the meantime, what we do when we get
+packages we don't understand is to compile the ODR module with
+<tt/ODR_DEBUG/ defined. This causes the module to dump tracing
+information as it processes data units. With this output and the
+protocol specification (Z39.50), it is generally fairly easy to see
+what goes wrong.
+
+<sect>The COMSTACK Module<label id="comstack">
+
+<sect1>Introduction
+
+<p>
+The <bf/COMSTACK/
+subsystem provides a transparent interface to different types of transport
+stacks for the exchange of BER-encoded data. At present, the
+RFC1729 method (BER over TCP/IP), and Peter Furniss' XTImOSI
+stack are supported, but others may be added in time. The philosophy of the
+module is to provide a simple interface by hiding unused options and
+facilities of the underlying libraries. This is always done at the risk
+of losing generality, and it may prove that the interface will need
+extension later on.
+
+The interface is implemented in such a fashion that only the
+sub-layers constructed to the transport methods that you wish to 
+use in your application are linked in.
+
+You will note that even though simplicity was a goal in the design,
+the interface is still orders of magnitudes more complex than the
+transport systems found in many other packages. One reason is that
+the interface needs to support the somewhat different requirements of
+the different lower-layer communications stacks; another important reason is
+that the interface seeks to provide a more or less industrial-strength
+approach to asynchronous event-handling. When no function is allowed
+to block, things get more complex - particularly on the server
+side. We urge you to have a look at the demonstration client and server
+provided with the package. They are meant to be easily readable and
+instructive, while still being at least moderately useful.
+
+<sect1>Common Functions
+
+<sect2>Managing Endpoints
+
+<p>
+<tscreen><verb>
+COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+</verb></tscreen>
+
+Creates an instance of the protocol stack - a communications endpoint.
+The
+<tt/type/
+parameter determines the mode of communication. At present, the
+values
+<tt/tcpip_type/
+and
+<tt/mosi_type/
+are recognized. The function returns a null-pointer if a system error
+occurs. The <tt/blocking/ parameter should be one if you wish the
+association to operate in blocking mode, zero otherwise. The
+<tt/protocol/ field should be one of <tt/PROTO_SR/ or <tt/PROTO_Z3950/.
+
+<tscreen><verb>
+int cs_close(COMSTACK handle);
+</verb></tscreen>
+
+Closes the connection (as elegantly as the lower layers will permit),
+and releases the resouces pointed to by the
+<tt/handle/
+parameter. The
+<tt/handle/
+should not be referenced again after this call.
+
+<it>
+NOTE:
+We really need a soft disconnect, don't we?
+</it>
+
+<sect2>Data Exchange
+
+<p>
+<tscreen><verb>
+int cs_put(COMSTACK handle, char *buf, int len);
+</verb></tscreen>
+
+Sends
+<tt/buf/
+down the wire. In blocking mode, this function will return only when a
+full buffer has been written, or an error has occurred. In nonblocking
+mode, it's possible that the function will be unable to send the full
+buffer at once, which will be indicated by a return value of 1. The
+function will keep track of the number of octets already written; you
+should call it repeatedly with the same values of <tt/buf/ and
+<tt/len/, until the buffer has been transmitted. When a full buffer
+has been sent, the function will return 0 for success. -1 indicates
+an error condition (see below).
+
+<tscreen><verb>
+int cs_get(COMSTACK handle, char **buf, int *size);
+</verb></tscreen>
+
+Receives a PDU from the peer. Returns the number of bytes
+read. In nonblocking mode, it is possible that not all of the packet can be
+read at once. In this case, the function returns 1. To simplify the
+interface, the function is
+responsible for managing the size of the buffer. It will be reallocated
+if necessary to contain large packages, and will sometimes be moved
+around internally by the subsystem when partial packages are read. Before
+calling
+<tt/cs_get/
+for the fist time, the buffer can be initialized to the null pointer,
+and the length should also be set to 0 - cs_get will perform a
+<tt/malloc/(2)
+on the buffer for you. When a full buffer has been read, the size of
+the package is returned (which will always be greater than 1). -1
+indicates an error condition.
+
+See also the
+<tt/cs_more()/
+function below.
+
+<tscreen><verb>
+int cs_more(COMSTACK handle);
+</verb></tscreen>
+
+The <tt/cs_more()/ function should be used in conjunction with
+<tt/cs_get/
+and
+<tt/select/(2).
+The <tt/cs_get()/ function will sometimes (notably in the TCP/IP mode) read
+more than a single protocol package off the network. When this
+happens, the extra package is stored by the subsystem. After calling
+<tt/cs_get()/, and before waiting for more input,
+You should always call
+<tt/cs_more()/
+to check if there's a full protocol package already read. If
+<tt/cs_more()/
+returns 1,
+<tt/cs_get()/
+can be used to immediately fetch the new package. For the 
+mOSI
+subsystem, the function should always return 0, but if you want your
+stuff to be protocol independent, you should use it.
+
+<it>
+NOTE: The <tt/cs_more()/
+function is required because the 
+RFC1729-method
+does not provide a way of separating individual PDUs, short of
+partially decoding the BER. Some other implementations will carefully
+nibble at the packet by calling
+<tt/read/(2)
+several times. This was felt to be too inefficient (or at least
+clumsy) - hence the call for this extra function.
+</it>
+
+<tscreen><verb>
+int cs_look(COMSTACK handle);
+</verb></tscreen>
+
+This function is useful when you're operating in nonblocking
+mode. Call it when
+<tt/select/(2)
+tells you there's something happening on the line. It returns one of
+the following values:
+
+<descrip>
+<tag/CS_NONE/No event is pending. The data found on the line was
+not a complete package.
+<tag/CS_CONNECT/A response to your connect request has been received. Call
+<tt/cs_rcvconnect/
+to process the event and to finalize the connection establishment.
+<tag/CS_DISCON/The other side has closed the connection (or maybe
+sent a disconnect
+request - but do we care? Maybe later). Call
+<tt/cs_close/ To close your end of the association as well.
+<tag/CS_LISTEN/A connect request has been received. Call
+<tt/cs_listen/
+to process the event.
+<tag/CS_DATA/There's data to be found on the line. Call
+<tt/cs_get/
+to get it.
+</descrip>
+
+<it>
+NOTE:
+You should be aware that even if
+<tt/cs_look()/
+tells you that there's an event event pending, the corresponding
+function may still return and tell you there was nothing to be found.
+This means that only part of a package was available for reading. The
+same event will show up again, when more data has arrived.
+</it>
+
+<tscreen><verb>
+int cs_fileno(COMSTACK h);
+</verb></tscreen>
+
+Returns the file descriptor of the association. Use this when
+file-level operations on the endpoint are required (<tt/select/(2)
+operations, specifically).
+
+<sect1>Client Side
+
+<p>
+<tscreen><verb>
+int cs_connect(COMSTACK handle, void *address);
+</verb></tscreen>
+
+Initiate a connection with the target at <tt/address/ (more on
+addresses below). The function will return 0 on success, and 1 if
+the operation does not complete immediately (this will only
+happen on a nonblocking endpoint). In this case, use
+<tt/cs_rcvconnect/ to complete the operation, when <tt/select/(2)
+reports input pending on the association.
+
+<tscreen><verb>
+int cs_rcvconnect(COMSTACK handle);
+</verb></tscreen>
+
+Complete a connect operation initiated by <tt/cs_connect()/. It will
+return 0 on success; 1 if the operation has not yet completed (in this
+case, call the function again later); -1 if an error has occured.
+
+<sect1>Server Side
+
+<p>
+To establish a server under the <tt/inetd/ server, you can use
+
+<tscreen><verb>
+COMSTACK cs_createbysocket(int socket, CS_TYPE type, int blocking,
+                              int protocol);
+</verb></tscreen>
+
+The <it/socket/ parameter is an established socket (when your
+application is invoked from <tt/inetd/, the socket will typically be
+0. The following parameters are identical to the ones for
+<tt/cs_create/.
+
+<tscreen><verb>
+int cs_bind(COMSTACK handle, void *address, int mode)
+</verb></tscreen>
+
+Binds a local address to the endpoint. Read about addresses below. The
+<tt/mode/ parameter should be either <tt/CS_CLIENT/ or <tt/CS_SERVER/.
+
+<tscreen><verb>
+int cs_listen(COMSTACK handle, char *addr, int *addrlen);
+</verb></tscreen>
+
+Call this to process incoming events on an endpoint that has been
+bound in listening mode. It will return 0 to indicate that the connect
+request has been received, 1 to signal a partial reception, and -1 to
+indicate an error condition.
+
+<tscreen><verb>
+COMSTACK cs_accept(COMSTACK handle);
+</verb></tscreen>
+
+This finalises the server-side association establishment, after
+cs_listen has completed successfully. It returns a new connection
+endpoint, which represents the new association. The application will
+typically wish to fork off a process to handle the association at this
+point, and continue listen for new connections on the old <tt/handle/.
+
+You can use the call
+
+<tscreen><verb>
+char *cs_addrstr(COMSTACK);
+</verb></tscreen>
+
+on an established connection to retrieve the hostname of the remote host.
+
+<it>NOTE: You may need to use this function with some care if your
+name server service is slow or unreliable</it>
+
+<sect1>Addresses
+
+<p>
+The low-level format of the addresses are different depending on the
+mode of communication you have chosen. A function is provided by each
+of the lower layers to map a user-friendly string-form address to the
+binary form required by the lower layers.
+
+<tscreen><verb>
+struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+struct netbuf *mosi_strtoaddr(char *str);
+</verb></tscreen>
+
+The format for TCP/IP addresses is straightforward:
+
+<tscreen><verb>
+<host> &lsqb; ':' <portnum> &rsqb;
+</verb></tscreen>
+
+The <tt/hostname/ can be either a domain name or an IP address. The
+port number, if omitted, defaults to 210.
+
+For OSI, the format is
+
+<tscreen><verb>
+&lsqb; <t-selector> '/' &rsqb; <host> &lsqb; ':' <port> &rsqb;
+</verb></tscreen>
+
+The transport selector is given as an even number of hex digits.
+
+You'll note that the address format for the OSI mode are just a subset
+of full presentation addresses. We use presentation addresses because
+xtimosi doesn't, in itself, allow access to the X.500 Directory
+service. We use a limited form, because we haven't yet come across an
+implementation that used more of the elements of a full p-address. It
+is a fairly simple matter to add the rest of the elements to the
+address format as needed, however: Xtimosi <it/does/ support the full
+P-address structure.
+
+In both transport modes, the special hostname &dquot;@&dquot; is mapped
+to any local address (the manifest constant INADDR_ANY). It is used
+to establish local listening endpoints in the server role.
+
+When a connection has been established, you can use
+
+<tscreen><verb>
+char cs_addrstr(COMSTACK h);
+</verb></tscreen>
+
+to retrieve the host name of the peer system. The function returns a pointer
+to a static area, which is overwritten on the next call to the function.
+
+<it>
+NOTE: We have left the issue of X.500 name-to-address mapping open, for the
+moment. It would be a simple matter to provide a table-based mapping,
+if desired. Alternately, we could use the X.500 client-function that
+is provided with the ISODE (although this would defeat some of the
+purpose of using ThinOSI in the first place. We have been told that it
+should be within the realm of the possible to implement a lightweight
+implementation of the necessary X.500 client capabilities on top of
+ThinOSI. This would be the ideal solution, we feel. On the other hand, it
+still remains to be seen just what role the Directory will play in a world
+populated by ThinOSI and other pragmatic solutions.
+</it>
+
+<sect1>Diagnostics
+
+<p>
+All functions return -1 if an error occurs. Typically, the functions
+will return 0 on success, but the data exchange functions
+(<tt/cs_get/, <tt/cs_put/, <tt/cs_more/)
+follow special rules. Consult their descriptions.
+
+When a function (including the data exchange functions) reports an
+error condition,
+use the function
+<tt/cs_errno()/
+to determine the cause of the
+problem. The function
+
+<tscreen><verb>
+void cs_perror(COMSTACK handle char *message);
+</verb></tscreen>
+
+works like
+<tt/perror/(2)
+and prints the
+<tt/message/
+argument, along with a system message, to
+<tt/stderr/.
+Use the character array
+
+<tscreen><verb>
+extern const char *cs_errlist&lsqb;&rsqb;;
+</verb></tscreen>
+
+to get hold of the message, if you want to process it differently.
+The function
+
+<tscreen><verb>
+const char *cs_stackerr(COMSTACK handle);
+</verb></tscreen>
+
+Returns an error message from the lower layer, if one has been
+provided.
+
+<sect1>Enabling OSI Communication
+
+<sect2>Installing Xtimosi
+<p>
+Although you will have to download Peter Furniss' XTI/mOSI
+implementation for yourself, we've tried to make the integration as
+simple as possible.
+
+The latest version of xtimosi will generally be under
+
+<tscreen><verb>
+ftp://pluto.ulcc.ac.uk/ulcc/thinosi/xtimosi/
+</verb></tscreen>
+
+When you have downloaded and unpacked the archive, it will (we assume)
+have created a directory called <tt/xtimosi/. We suggest that you place
+this directory <it/in the same directory/ where you unpacked the
+<bf/YAZ/
+distribution. This way, you shouldn't have to fiddle with the
+makefiles of <tt/YAZ/ beyond uncommenting a few lines.
+
+Go to <tt>xtimosi/src</tt>, and type &dquot;<tt/make libmosi.a/&dquot;.
+This should generally
+create the library, ready to use.
+
+<bf/CAVEAT/
+
+<it>
+The currently available release of xtimosi has some inherent
+problems that make it disfunction on certain platforms - eg. the
+Digital OSF/1 workstations. It is supposedly primarily a
+compiler problem, and we hope to see a release that is generally
+portable. While we can't guarantee that it can be brought to work
+on your platform, we'll be happy to talk to you about problems
+that you might see, and relay information to the author of the
+software. There are some signs that the <bf/gcc/ compiler is more
+likely to produce a fully functional library, but this hasn't
+been verified (we think that the problem is limited to the use
+of hexadecimal escape-codes used in strings, which are silently
+ignored by some compilers).
+</it>
+
+<it>
+A problem has been encountered in the communication with
+ISODE-based applications. If the ISODE presentation-user calls
+<tt/PReadRequest()/ with a timeout value different from <tt/OK/ or <tt/NOTOK/,
+he will get an immediate TIMEOUT abort when receiving large (&gt;2041
+bytes, which is the SPDU-size that the ISODE likes to work with) packages
+from an xtimosi-based implementation (probably most
+other implementations as well, in fact). It seems to be a flaw in the
+ISODE API, and the workaround (for ISODE users) is to either not
+use an explicit timeout (switching to either blocking or
+nonblocking mode), or to check that the timer really has expired
+before closing the connection.
+</it>
+
+The next step in the installation is to modify the makefile in the toplevel
+<bf/YAZ/
+directory. The place to change is in the top of the file, and is
+clearly marked with a comment.
+
+Now run <tt/make/ in the <bf/YAZ/ toplevel directory (do a
+&dquot;<tt/make clean/&dquot; first, if the
+system has been previously made without OSI support). Use the <bf/YAZ/
+<bf/ztest/
+and <bf/client/ demo programs to verify that OSI communication works OK. Then,
+you can go ahead and try to talk to other implementations.
+
+<it>
+NOTE: Our interoperability experience is limited to version
+7 of the Nordic SR-Nett package, which has had several
+protocol errors fixed from the earlier releases. If you have
+problems or successes in interoperating with other
+implementations, we'd be glad to hear about it, or to help
+you make things work, as our resources allow.
+</it>
+
+If you write your own applications based on <bf/YAZ/, and you wish to
+include OSI support, the procedure is equally simple. You should
+include the <tt/xmosi.h/ header file in addition to <tt/comstack.h/.
+<tt/xmosi.h/
+will define the manifest constant <tt/mosi_type/, which you should pass
+to the <tt/cs_create()/ function. In
+addition, you should use the function <tt/mosi_strtoaddr()/ rather than
+<tt/tcpip_strtoaddr()/ when you need to prepare an address.
+
+When you link your application, you should include (after the
+<tt/libyaz.a/
+library) the <tt/libmosi.a/ library, and the <tt/librfc.a/ library
+provided with
+<bf/YAZ/ (for OSI transport).
+
+As always, it can be very useful, if not essential, to have a look at the
+example applications
+to see how things are done.
+
+<sect2>OSI Transport
+
+<p>
+Xtimosi requires an implementation of the OSI transport service under
+the X/OPEN XTI API. We provide an implementation of the RFC1006
+encapsulation of OSI/TP0 in TCP/IP (through the Berkeley Sockets API),
+as an independent part of <bf/YAZ/ (it's found under the <tt/rfc1006/
+directory). If you have access to an OSI transport provider under XTI,
+you should be able to make that work too, although it may require
+tinkering with the <tt/mosi_strtoaddr()/ function.
+
+<sect2>Presentation Context Management
+
+<p>
+To simplify the implementation, we use Peter Furniss' alternative (PRF)
+option format
+for the Control of the presentation negotiation phase. This format
+is enabled by default when you
+compile xtimosi.
+
+The current version of <bf/YAZ/ does <it/not/ support presentation-layer
+negotiation of response record formats. The primary reason is that we
+have had access to no other SR or Z39.50 implementations over OSI that
+used this
+method. Secondarily, we believe that the EXPLAIN facility is a superior
+mechanism for relaying target capabilities in this respect. This is not to
+say that we have no intentions of supporting presentation context
+negotiation - we have just hitherto given it a lower priority than other
+aspects of the protocol.
+
+One thing is certain: The addition of this capability to <bf/YAZ/ should
+have only a minimal impact on existing applications, and on the
+interface to the software in general. Most likely, we will add an extra
+layer of interface to the processing of EXPLAIN records, which will
+convert back and forth between <tt/oident/ records (see section
+<ref id="oid" name="Object Identifiers">) and direct or indirect
+references, given the current association setup. Implementations based
+on any of the higher-level interfaces will most likely not have to be
+changed at all.
+
+<sect1>Summary and Synopsis
+
+<p>
+<tscreen><verb>
+#include <comstack.h>
+
+#include <tcpip.h>      /* this is for TCP/IP support   */
+#include <xmosi.h>      /* and this is for mOSI support */
+
+COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+
+COMSTACK cs_createbysocket(int s, CS_TYPE type, int blocking,
+                              int protocol);
+
+int cs_bind(COMSTACK handle, int mode);
+
+int cs_connect(COMSTACK handle, void *address);
+
+int cs_rcvconnect(COMSTACK handle);
+
+int cs_listen(COMSTACK handle);
+
+COMSTACK cs_accept(COMSTACK handle);
+
+int cs_put(COMSTACK handle, char *buf, int len);
+
+int cs_get(COMSTACK handle, char **buf, int *size);
+
+int cs_more(COMSTACK handle);
+
+int cs_close(COMSTACK handle);
+
+int cs_look(COMSTACK handle);
+
+struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+struct netbuf *mosi_strtoaddr(char *str);
+
+extern int cs_errno;
+
+void cs_perror(COMSTACK handle char *message);
+
+const char *cs_stackerr(COMSTACK handle);
+
+extern const char *cs_errlist[];
+</verb></tscreen>
+
+<sect>Making an IR Interface for Your Database with YAZ<label id="server">
+
+<sect1>Introduction
+
+<p>
+<it>
+NOTE: If you aren't into documentation, a good way to learn how the
+backend interface works is to look at the backend.h file. Then,
+look at the small dummy-server in server/ztest.c. Finally, you can
+have a look at the seshigh.c file, which is where most of the
+logic of the frontend server is located. The backend.h file also
+makes a good reference, once you've chewed your way through
+the prose of this file.
+</it>
+
+If you have a database system that you would like to make available by
+means of Z39.50/SR, <bf/YAZ/ basically offers your two options. You
+can use the APIs provided by the <bf/ASN/, <bf/ODR/, and <bf/COMSTACK/
+modules to
+create and decode PDUs, and exchange them with a client. Using this
+low-level interface gives you access to all fields and options of the
+protocol, and you can construct your server as close to your existing
+database as you like. It is also a fairly involved process, requiring
+you to set up an event-handling mechanism, protocol state machine,
+etc. To simplify server implementation, we have implemented a compact
+and simple, but reasonably full-functioned server-frontend that will
+handle most of the protocol mechanics, while leaving you to
+concentrate on your database interface.
+
+<it>
+NOTE: The backend interface was designed in anticipation of a specific
+integration task, while still attempting to achieve some degree of
+generality. We realise fully that there are points where the
+interface can be improved significantly. If you have specific
+functions or parameters that you think could be useful, send us a
+mail (or better, sign on to the mailing list referred to in the
+toplevel README file). We will try to fit good suggestions into future
+releases, to the extent that it can be done without requiring
+too many structural changes in existing applications.
+</it>
+
+<sect1>The Database Frontend
+
+<p>
+We refer to this software as a generic database frontend. Your
+database system is the <it/backend database/, and the interface between
+the two is called the <it/backend API/. The backend API consists of a
+small number of function prototypes and structure definitions. You are
+required to provide the <bf/main()/ routine for the server (which can be
+quite simple), as well as functions to match each of the prototypes.
+The interface functions that you write can use any mechanism you like
+to communicate with your database system: You might link the whole
+thing together with your database application and access it by
+function calls; you might use IPC to talk to a database server
+somewhere; or you might link with third-party software that handles
+the communication for you (like a commercial database client library).
+At any rate, the functions will perform the tasks of:
+
+<itemize>
+<item>Initialization.
+<item>Searching.
+<item>Fetching records.
+<item>Scanning the database index (if you wish to implement SCAN).
+</itemize>
+
+(more functions will be added in time to support as much of
+Z39.50-1995 as possible).
+
+Because the model where pipes or sockets are used to access the backend
+database is a fairly common one, we have added a mechanism that allows this
+communication to take place asynchronously. In this mode, the frontend
+server doesn't have to block while the backend database is processing
+a request, but can wait for additional PDUs from the client.
+
+<sect1>The Backend API
+
+<p>
+The headers files that you need to use the interface are in the
+include/ directory. They are called <tt/statserv.h/ and <tt/backend.h/. They
+will include other files from the <tt/include/ directory, so you'll
+probably want to use the -I option of your compiler to tell it where
+to find the files. When you run <tt/make/ in the toplevel <bf/YAZ/ directory,
+everything you need to create your server is put the lib/libyaz.a
+library. If you want OSI as well, you'll also need to link in the
+<tt/libmosi.a/ library from the xtimosi distribution (see the mosi.txt
+file), a well as the <tt>lib/librfc.a</tt> library (to provide OSI transport
+over RFC1006/TCP).
+
+<sect1>Your main() Routine
+
+<p>
+As mentioned, your <bf/main()/ routine can be quite brief. If you want to
+initialize global parameters, or read global configuration tables,
+this is the place to do it. At the end of the routine, you should call
+the function
+
+<tscreen><verb>int statserv_main(int argc, char **argv);</verb></tscreen>
+
+<bf/Statserv_main/ will establish listening sockets according to the
+parameters given. When connection requests are received, the event
+handler will typically <bf/fork()/ to handle the new request. If you do use
+global variables, you should be aware, then, that these cannot be
+shared between associations, unless you explicitly disallow forking by
+command line parameters (we advise against this for any purposes
+except debugging, as a crash or hang in the server process will affect
+all users currently signed on to the server).
+
+The server provides a mechanism for controlling some of its behavior
+without using command-line options. The function
+
+<tscreen><verb>
+statserv_options_block *statserv_getcontrol(void);
+</verb></tscreen>
+
+Will return a pointer to a <tt/struct statserv_options_block/ describing
+the current default settings of the server. The structure contains
+these elements:
+
+<descrip>
+<tag/int dynamic/A boolean value, which determines whether the server
+will fork on each incoming request (TRUE), or not (FALSE). Default is
+TRUE.
+<tag/int loglevel/Set this by ORing the constants defined in include/log.h.
+<tag/char logfile&lsqb;ODR_MAXNAME+1&rsqb;/File for diagnostic output
+(&dquot;&dquot;: stderr).
+<tag/char apdufile&lsqb;ODR_MAXNAME+1&rsqb;/Name of file for logging incoming and
+outgoing APDUs (&dquot;&dquot;: don't log APDUs, &dquot;-&dquot;: <tt/stderr/).
+<tag/char default_listen&lsqb;1024&rsqb;/Same form as the command-line
+specification of listener address. &dquot;&dquot;: no default listener address.
+Default is to listen at &dquot;tcp:@:9999&dquot;. You can only
+specify one default listener address in this fashion.
+<tag/enum oid_proto default_proto;/Either <tt/PROTO_SR/ or <tt/PROTO_Z3950/.
+Default is <tt/PROTO_Z39_50/.
+<tag/int idle_timeout;/Maximum session idletime, in minutes. Zero indicates
+no (infinite) timeout. Default is 120 minutes.
+<tag/int maxrecordsize;/Maximum permissible record (message) size. Default
+is 1Mb. This amount of memory will only be allocated if a client requests a
+very large amount of records in one operation (or a big record). Set it
+to a lower number
+if you are worried about resource consumption on your host system.
+<tag/char configname&lsqb;ODR_MAXNAME+1&rsqb;/Passed to the backend when a
+new connection is received.
+<tag/char setuid&lsqb;ODR_MAXNAME+1&rsqb;/Set user id to the user specified,
+after binding the listener addresses.
+</descrip>
+
+The pointer returned by <tt/statserv_getcontrol/ points to a static area.
+You are allowed to change the contents of the structure, but the
+changes will not take effect before you call
+
+<tscreen><verb>
+void statserv_setcontrol(statserv_options_block *block);
+</verb></tscreen>
+
+Note that you should generally update this structure <it/before/ calling
+<tt/statserv_main()/.
+
+<sect1>The Backend Functions
+
+<p>
+For each service of the protocol, the backend interface declares one or
+two functions. You are required to provide implementations of the
+functions representing the services that you wish to implement.
+
+<tscreen><verb>bend_initresult *bend_init(bend_initrequest *r);</verb></tscreen>
+
+This function is called once for each new connection request, after
+a new process has been forked, and an initRequest has been received
+from the client. The parameter and result structures are defined as
+
+<tscreen>
+<verb>
+typedef struct bend_initrequest
+{
+    char *configname;
+} bend_initrequest;
+
+typedef struct bend_initresult
+{
+    int errcode;       /* 0==OK */
+    char *errstring;   /* system error string or NULL */
+    void *handle;      /* private handle to the backend module */
+} bend_initresult;
+</verb>
+</tscreen>
+
+The <tt/configname/ of <tt/bend_initrequest/ is currently always set to
+&dquot;default-config&dquot;. We haven't had use for putting anything special in
+the initrequest yet, but something might go there if the need arises
+(account/password info would be obvious).
+
+In general, the server frontend expects that the <tt/bend_*result/
+pointer that you return is valid at least until the next call to a
+<tt/bend_* function/. This applies to all of the functions described
+herein. The parameter structure passed to you in the call belongs to
+the server frontend, and you should not make assumptions about its
+contents after the current function call has completed. In other
+words, if you want to retain any of the contents of a request
+structure, you should copy them.
+
+The <tt/errcode/ should be zero if the initialization of the backend went
+well. Any other value will be interpreted as an error. The
+<tt/errstring/ isn't used in the current version, but one option
+would be to stick it
+in the initResponse as a VisibleString. The <tt/handle/ is the most
+important parameter. It should be set to some value that uniquely
+identifies the current session to the backend implementation. It is
+used by the frontend server in any future calls to a backend function.
+The typical use is to set it to point to a dynamically allocated state
+structure that is private to your backend module.
+
+<tscreen>
+<verb>
+bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                               int *fd);
+bend_searchresult *bend_searchresponse(void *handle);
+
+typedef struct bend_searchrequest
+{
+    char *setname;       /* name to give to this set */
+    int replace_set;     /* replace set, if it already exists */
+    int num_bases;       /* number of databases in list */
+    char **basenames;    /* databases to search */
+    Z_Query *query;      /* query structure */
+} bend_searchrequest;
+
+typedef struct bend_searchresult
+{
+    int hits;            /* number of hits */
+    int errcode;         /* 0==OK */
+    char *errstring;     /* system error string or NULL */
+} bend_searchresult;
+</verb>
+</tscreen>
+
+The first thing to notice about the search request interface (as well
+as all of the following requests), is that it consists of two separate
+functions. The idea is to provide a simple facility for
+asynchronous communication with the backend server. When a
+searchrequest comes in, the server frontend will fill out the
+<tt/bend_searchrequest/ tructure, and call the <tt/bend_search
+function/. The <tt/fd/
+argument will point to an integer variable. If you are able to do
+asynchronous I/O with your database server, you should set *<tt/fd/ to the
+file descriptor you use for the communication, and return a null
+pointer. The server frontend will then <tt/select()/ on the *<tt/fd/,
+and will call
+<tt/bend_searchresult/ when it sees that data is available. If you don't
+support asynchronous I/O, you should return a pointer to the
+<tt/bend_searchresult/ immediately, and leave *<tt/fd/ untouched. This
+construction is common to all of the <tt/bend_/ functions (except
+<tt/bend_init/). Note that you can choose to support this facility in none,
+any, or all of the <tt/bend_/ functions, and you can respond
+differently on each request at run-time. The server frontend will
+adapt accordingly.
+
+The <tt/bend_searchrequest/ is a fairly close approximation of a protocol
+searchRequest PDU. The <tt/setname/ is the resultSetName from the protocol. You
+are required to establish a mapping between the set name and whatever
+your backend database likes to use. Similarly, the <tt/replace_set/ is a
+boolean value corresponding to the resultSetIndicator field in the
+protocol. <tt>Num_bases/basenames</tt> is a length of/array of character
+pointers to the database names provided by the client. The <tt/query/ is the 
+full query structure as defined in the protocol ASN.1 specification.
+It can be either of the possible query types, and it's up to you to
+determine if you can handle the provided query type. Rather than
+reproduce the C interface here, we'll refer you to the structure
+definitions in the file <tt>include/proto.h</tt>. If you want to look at the
+attributeSetId OID of the RPN query, you can either match it against
+your own internal tables, or you can use the <tt/oid_getentbyoid/ function
+provided by <bf/YAZ/.
+
+The result structure contains a number of hits, and an
+<tt>errcode/errstring</tt> pair. If an error occurs during the search, or if
+you're unhappy with the request, you should set the errcode to a value
+from the BIB-1 diagnostic set. The value will then be returned to the
+user in a nonsurrogate diagnostic record in the response. The
+<tt/errstring/, if provided, will go in the addinfo field. Look at the
+protocol definition for the defined error codes, and the suggested
+uses of the addinfo field.
+
+<tscreen>
+<verb>
+bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                             int *fd);
+bend_fetchresult *bend_fetchresponse(void *handle);
+
+typedef struct bend_fetchrequest
+{
+    char *setname;       /* set name */
+    int number;          /* record number */
+    oid_value format;
+} bend_fetchrequest;
+
+typedef struct bend_fetchresult
+{
+    char *basename;      /* name of database that provided record */
+    int len;             /* length of record */
+    char *record;        /* record */
+    int last_in_set;     /* is it?  */
+    oid_value format;
+    int errcode;         /* 0==success */
+    char *errstring;     /* system error string or NULL */
+} bend_fetchresult;
+</verb>
+</tscreen>
+
+<it>
+NOTE: The <tt/bend_fetchresponse()/ function is not yet supported
+in this version of the software. Your implementation of <tt/bend_fetch()/
+should always return a pointer to a <tt/bend_fetchresult/.
+</it>
+
+The frontend server calls <tt/bend_fetch/ when it needs database records to
+fulfill a searchRequest or a presentRequest. The <tt/setname/ is simply the
+name of the result set that holds the reference to the desired record.
+The <tt/number/ is the offset into the set (with 1 being the first record
+in the set). The <tt/format/ field is the record format requested by the
+client (See section <ref id="oid" name="Object Identifiers">). The value
+<tt/VAL_NONE/ indicates that the client did not request a specific format.
+The <tt/stream/ argument is an <bf/ODR/ stream which should be used for
+allocating space for structured data records. The stream will be reset when
+all records have been assembled, and the response package has been transmitted.
+For unstructured data, the backend is responsible for maintaining a static
+or dynamic buffer for the record between calls.
+
+In the result structure, the <tt/basename/ is the name of the
+database that holds the
+record. <tt/Len/ is the length of the record returned, in bytes, and
+<tt/record/
+is a pointer to the record. <tt/Last_in_set/ should be nonzero only if the
+record returned is the last one in the given result set. <tt/Errcode/ and
+<tt/errstring/, if given, will currently be interpreted as a global error
+pertaining to the set, and will be returned in a
+nonSurrogateDiagnostic.
+
+<it>NOTE: This is silly. Add a flag to say which is which.</it>
+
+If the <tt/len/ field has the value -1, then <tt/record/ is assumed to point
+to a constructed data type. The <tt/format/ field will be used to determine
+which encoder should be used to serialize the data.
+
+<it>
+NOTE: If your backend generates structured records, it should use
+<tt/odr_malloc()/ on the provided stream for allocating data: This allows
+the frontend server to keep track of the record sizes.
+</it>
+
+The <tt/format/ field is mapped to an object identifier in the direct
+reference of the resulting EXTERNAL representation of the record.
+
+<it>NOTE: The current version of <bf/YAZ/ only supports the direct reference
+mode.</it>
+
+<tscreen>
+<verb>
+bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                               int *fd);
+bend_deleteresult *bend_deleteresponse(void *handle);
+
+typedef struct bend_deleterequest
+{
+    char *setname;
+} bend_deleterequest;
+
+typedef struct bend_deleteresult
+{
+    int errcode;         /* 0==success */
+    char *errstring;     /* system error string or NULL */
+} bend_deleteresult;
+</verb>
+</tscreen>
+
+<it>
+NOTE: The &dquot;delete&dquot; function is not yet supported
+in this version of the software.
+</it>
+
+<it>
+NOTE: The delete set function definition is rather primitive, mostly
+because we
+have had no practical need for it as of yet. If someone wants
+to provide a full delete service, we'd be happy to add the
+extra parameters that are required. Are there clients out there
+that will actually delete sets they no longer need?
+</it>
+
+<tscreen>
+<verb>
+bend_scanresult *bend_scan(void *handle, bend_scanrequest *r,
+    int *fd);
+bend_scanresult *bend_scanresponse(void *handle);
+
+typedef struct bend_scanrequest
+{
+    int num_bases;      /* number of elements in databaselist */
+    char **basenames;   /* databases to search */
+    Z_AttributesPlusTerm *term;
+    int term_position;  /* desired index of term in result list */
+    int num_entries;    /* number of entries requested */
+} bend_scanrequest;
+
+typedef struct bend_scanresult
+{
+    int num_entries;
+    struct scan_entry
+    {
+    	char *term;
+	int occurrences;
+    } *entries;
+    int term_position;
+    enum
+    {
+    	BEND_SCAN_SUCCESS,
+	BEND_SCAN_PARTIAL
+    } status;
+    int errcode;
+    char *errstring;
+} bend_scanresult;
+</verb>
+</tscreen>
+
+<it>
+NOTE: The <tt/bend_scanresponse()/ function is not yet supported
+in this version of the software. Your implementation of <tt/bend_scan()/
+should always return a pointer to a <tt/bend_scanresult/.
+</it>
+
+<sect1>Application Invocation
+
+<p>
+The finished application has the following
+invocation syntax (by way of <tt/statserv_main()/):
+
+<tscreen> <verb>
+appname &lsqb;-szSu -a apdufile -l logfile -v loglevel&rsqb;
+&lsqb;listener ...&rsqb;
+</verb> </tscreen>
+
+The options are
+
+<descrip>
+<tag/-a/APDU file. Specify a file for dumping PDUs (for diagnostic purposes).
+The special name &dquot;-&dquot; sends output to <tt/stderr/.
+
+<tag/-S/Don't fork on connection requests. This is good for debugging, but
+not recommended for real operation: Although the server is
+asynchronous and non-blocking, it can be nice to keep a software
+malfunction (okay then, a crash) from affecting all current users.
+
+<tag/-s/Use the SR protocol.
+
+<tag/-z/Use the Z39.50 protocol (default). These two options complement
+eachother. You can use both multiple times on the same command
+line, between listener-specifications (see below). This way, you
+can set up the server to listen for connections in both protocols
+concurrently, on different local ports.
+
+<tag/-l/The logfile.
+
+<tag/-v/The log level. Use a comma-separated list of members of the set
+{fatal,debug,warn,log,all,none}.
+<tag/-u/Set user ID. Sets the real UID of the server process to that of the
+given user. It's useful if you aren't comfortable with having the
+server run as root, but you need to start it as such to bind a
+privileged port.
+
+<tag/-w/Working directory.
+<tag/-i/Use this when running from the <tt/inetd/ server.
+
+<tag/-t/Idle session timeout, in minutes.
+
+<tag/-k/Maximum record size/message size, in kilobytes.
+
+</descrip>
+
+A listener specification consists of a transport mode followed by a
+colon (:) followed by a listener address. The transport mode is
+either <tt/osi/ or <tt/tcp/.
+
+For TCP, an address has the form
+
+<tscreen><verb>
+hostname | IP-number &lsqb;: portnumber&rsqb;
+</verb></tscreen>
+
+The port number defaults to 210 (standard Z39.50 port).
+
+For osi, the address form is
+
+<tscreen><verb>
+&lsqb;t-selector /&rsqb; hostname | IP-number &lsqb;: portnumber&rsqb;
+</verb></tscreen>
+
+The transport selector is given as a string of hex digits (with an even
+number of digits). The default port number is 102 (RFC1006 port).
+
+Examples
+
+<tscreen>
+<verb>
+tcp:dranet.dra.com
+
+osi:0402/dbserver.osiworld.com:3000
+</verb>
+</tscreen>
+
+In both cases, the special hostname &dquot;@&dquot; is mapped to
+the address INADDR_ANY, which causes the server to listen on any local
+interface. To start the server listening on the registered ports for
+Z39.50 and SR over OSI/RFC1006, and to drop root privileges once the
+ports are bound, execute the server like this (from a root shell):
+
+<tscreen><verb>
+my-server -u daemon tcp:@ -s osi:@
+</verb></tscreen>
+
+You can replace <tt/daemon/ with another user, eg. your own account, or
+a dedicated IR server account. <tt/my-server/ should be the name of your
+server application. You can test the procedure with the <tt/ztest/
+application.
+
+<sect1>Summary and Synopsis
+
+<p>
+<tscreen><verb>
+#include <backend.h>
+
+bend_initresult *bend_init(bend_initrequest *r);
+
+bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                                 int *fd);
+
+bend_searchresult *bend_searchresponse(void *handle);
+
+bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                               int *fd);
+
+bend_fetchresult *bend_fetchresponse(void *handle);
+
+bend_scanresult *bend_scan(void *handle, bend_scanrequest *r, int *fd);
+
+bend_scanresult *bend_scanresponse(void *handle);
+
+bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                                  int *fd);
+
+bend_deleteresult *bend_deleteresponse(void *handle);
+
+void bend_close(void *handle);
+</verb></tscreen>
+
+<sect>Future Directions
+
+<p>
+The software has been
+successfully ported to the Mac as well as Windows NT/95 - we'd like to
+test those ports better and make sure they work as they should.
+
+We have a new and better version of the frontend server on the drawing
+board. Resources and external commitments will govern when we'll be
+able to do something real with it. Fetures should include greater
+flexibility, greter support for access/resource control, and easy
+support for Explain (possibly with Zebra as an extra database engine).
+
+We now support all PDUs of Z39.50-1995. If there is one of the
+supporting structures that you need but can't find in the prt*.h
+files, send us a note; it may be on its way.
+
+The 'retrieval' module needs to be finalized and documented. We think
+it can form a useful resource for people dealing with complex record
+structures, but for now, you'll mostly have to chew through the code
+yourself to make use of it. Not acceptable.
+
+Other than that, YAZ generally moves in the directions which appear to
+make the most people happy (including ourselves, as prime users of the
+software). If there's something you'd like to see in here, then drop
+us a note and let's see what we can come up with.
+
+<sect>License
+
+<sect1>Index Data Copyright
+
+<p>
+Copyright &copy; 1995-2000 Index Data.
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation, in whole or in part, for any purpose, is hereby granted,
+provided that:
+
+1. This copyright and permission notice appear in all copies of the
+software and its documentation. Notices of copyright or attribution
+which appear at the beginning of any file must remain unchanged.
+
+2. The names of Index Data or the individual authors may not be used to
+endorse or promote products derived from this software without specific
+prior written permission.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+OF THIS SOFTWARE.
+
+<sect1>Additional Copyright Statements
+
+<p>
+The optional CCL query language interpreter is covered by the following
+license:
+
+Copyright &copy; 1995, the EUROPAGATE consortium (see below).
+
+The EUROPAGATE consortium members are:
+
+   University College Dublin
+   Danmarks Teknologiske Videnscenter
+   An Chomhairle Leabharlanna
+   Consejo Superior de Investigaciones Cientificas
+
+Permission to use, copy, modify, distribute, and sell this software and
+its documentation, in whole or in part, for any purpose, is hereby granted,
+provided that:
+
+1. This copyright and permission notice appear in all copies of the
+software and its documentation. Notices of copyright or attribution
+which appear at the beginning of any file must remain unchanged.
+
+2. The names of EUROPAGATE or the project partners may not be used to
+endorse or promote products derived from this software without specific
+prior written permission.
+
+3. Users of this software (implementors and gateway operators) agree to
+inform the EUROPAGATE consortium of their use of the software. This
+information will be used to evaluate the EUROPAGATE project and the
+software, and to plan further developments. The consortium may use
+the information in later publications.
+
+4. Users of this software agree to make their best efforts, when
+documenting their use of the software, to acknowledge the EUROPAGATE
+consortium, and the role played by the software in their work.
+
+THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+USE OR PERFORMANCE OF THIS SOFTWARE.
+
+<sect>About Index Data
+
+<p>
+Index Data is a consulting and software-development enterprise that
+specialises in library and information management systems. Our
+interests and expertise span a broad range of related fields, and one
+of our primary, long-term objectives is the development of a powerful
+information management
+system with open network interfaces and hypermedia capabilities.
+
+We make this software available free of charge, on a fairly unrestrictive
+license; as a service to the networking community, and to further the
+development of quality software for open network communication.
+
+We'll be happy to answer questions about the software, and about ourselves
+in general.
+
+<tscreen><verb>
+Index Data
+Ryesgade 3
+DK-2200 Copenhagen N
+</verb></tscreen>
+
+<p>
+<tscreen><verb>
+Phone: +45 3536 3672
+Fax  : +45 3536 0449
+Email: info@indexdata.dk
+</verb></tscreen>
+
+The <it>Hacker's Jargon File</it> has the following to say about the
+use of the
+prefix &dquot;YA&dquot; in the name of a software product.
+
+<it>
+Yet Another. adj. 1. Of your own work: A
+humorous allusion often used in titles to acknowledge that the
+topic is not original, though the content is.  As in &dquot;Yet Another
+AI Group&dquot; or &dquot;Yet Another Simulated Annealing Algorithm&dquot;.
+2. Of
+others' work: Describes something of which there are already far
+too many. 
+</it>
+
+</article>
Index: /main/tags/2.38/gsdl/packages/yaz/doc/yaz.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/doc/yaz.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/doc/yaz.txt	(revision 21083)
@@ -0,0 +1,4158 @@
+  YAZ User's Guide and Reference
+  Index Data, info@indexdata.dk
+  $Revision$
+
+  This document is the programmer's guide and reference to the YAZ pack-
+  age. YAZ is a compact toolkit that provides access to the Z39.50/SR
+  protocol, as well as a set of higher-level tools for implementing the
+  server and client roles, respectively.  The documentation can be used
+  on its own, or as a reference when looking at the example applications
+  provided with the package.
+  ______________________________________________________________________
+
+  Table of Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  1. Introduction
+
+  2. Compilation and Installation
+
+     2.1 UNIX
+     2.2 WIN32
+
+  3. The ASN Module
+
+     3.1 Introduction
+     3.2 Preparing PDUs
+     3.3 Object Identifiers
+     3.4 EXTERNAL Data
+     3.5 PDU Contents Table
+
+  4. Supporting Tools
+
+     4.1 Query Syntax Parsers
+        4.1.1 Prefix Query Format
+        4.1.2 Common Command Language
+           4.1.2.1 CCL Syntax
+           4.1.2.2 CCL Qualifiers
+           4.1.2.3 CCL API
+     4.2 Object Identifiers
+     4.3 Nibble Memory
+
+  5. The ODR Module
+
+     5.1 Introduction
+     5.2 Using ODR
+        5.2.1 ODR Streams
+        5.2.2 Memory Management
+        5.2.3 Encoding and Decoding Data
+        5.2.4 Diagnostics
+        5.2.5 Summary and Synopsis
+     5.3 Programming with ODR
+        5.3.1 The Primitive ASN.1 Types
+           5.3.1.1 INTEGER
+           5.3.1.2 BOOLEAN
+           5.3.1.3 REAL
+           5.3.1.4 NULL
+           5.3.1.5 OCTET STRING
+           5.3.1.6 BIT STRING
+           5.3.1.7 OBJECT IDENTIFIER
+        5.3.2 Tagging Primitive Types
+        5.3.3 Constructed Types
+        5.3.4 Tagging Constructed Types
+           5.3.4.1 Implicit Tagging
+           5.3.4.2 Explicit Tagging
+        5.3.5 SEQUENCE OF
+        5.3.6 CHOICE Types
+     5.4 Debugging
+
+  6. The COMSTACK Module
+
+     6.1 Introduction
+     6.2 Common Functions
+        6.2.1 Managing Endpoints
+        6.2.2 Data Exchange
+     6.3 Client Side
+     6.4 Server Side
+     6.5 Addresses
+     6.6 Diagnostics
+     6.7 Enabling OSI Communication
+        6.7.1 Installing Xtimosi
+        6.7.2 OSI Transport
+        6.7.3 Presentation Context Management
+     6.8 Summary and Synopsis
+
+  7. Making an IR Interface for Your Database with YAZ
+
+     7.1 Introduction
+     7.2 The Database Frontend
+     7.3 The Backend API
+     7.4 Your main() Routine
+     7.5 The Backend Functions
+     7.6 Application Invocation
+     7.7 Summary and Synopsis
+
+  8. Future Directions
+
+  9. License
+
+     9.1 Index Data Copyright
+     9.2 Additional Copyright Statements
+
+  10. About Index Data
+
+
+
+  ______________________________________________________________________
+
+  1.  Introduction
+
+  The YAZ toolkit offers several different levels of access to the
+  Z39.50 and SR protocols. The level that you need to use depends on
+  your requirements, and the role (server or client) that you want to
+  implement.
+
+  The basic level, which is independent of the role, consists of three
+  primary interfaces:
+
+
+  o  ASN, which provides a C representation of the Z39.50/SR protocol
+     packages (PDUs).
+
+  o  ODR, which encodes and decodes the packages according to the BER
+     specification.
+
+  o  COMSTACK, which exchanges the encoded packages with a peer process
+     over a network.
+
+  The ASN module represents the ASN.1 definition of the SR/Z39.50
+  protocol. It establishes a set of type and structure definitions, with
+  one structure for each of the top-level PDUs, and one structure or
+  type for each of the contained ASN.1 types.  For primitive types, or
+  other types that are defined by the ASN.1 standard itself (such as the
+  EXTERNAL type), the C representation is provided by the ODR (Open Data
+  Representation) subsystem.
+
+  ODR is a basic mechanism for representing an ASN.1 type in the C
+  programming language, and for implementing BER encoders and decoders
+  for values of that type. The types defined in the ASN module generally
+  have the prefix Z_, and a suffix corresponding to the name of the type
+  in the ASN.1 specification of the protocol (generally Z39.50-1995). In
+  the case of base types (those originating in the ASN.1 standard
+  itself), the prefix Odr_ is sometimes seen. Either way, look for the
+  actual definition in either proto.h (for the types from the protocol),
+  odr.h (for the primitive ASN.1 types, or odr_use.h (for the ASN.1
+  useful types). The ASN library also provides functions (which are, in
+  turn, defined using ODR primitives) for encoding and decoding data
+  values. Their general form is
+       int z_xxx(ODR o, Z_xxx **p, int optional, const char *name);
+
+
+
+
+  (note the lower-case "z" in the function name)
+
+  NOTE: If you are using the premade definitions of the ASN module, and
+  you are not adding new protocol of your own, the only parts of ODR
+  that you need to worry about are documented in section ``Using ODR''.
+
+  When you have created a BER-encoded buffer, you can use the COMSTACK
+  subsystem to transmit (or receive) data over the network. The COMSTACK
+  module provides simple functions for establishing a connection
+  (passively or actively, depending on the role of your application),
+  and for exchanging BER-encoded PDUs over that connection. When you
+  create a connection endpoint, you need to specify what transport to
+  use (OSI or TCP/IP), and which protocol you want to use (SR or
+  Z39.50). For the remainer of the connection's lifetime, you don't have
+  to worry about the underlying transport protocol at all - the COMSTACK
+  will ensure that the correct mechanism is used.
+
+  We call the combined interfaces to ODR, ASN, and COMSTACK the service
+  level API. It's the API that most closely models the Z39.50/SR
+  service/protocol definition, and it provides unlimited access to all
+  fields and facilities of the protocol definitions.
+
+  The reason that the YAZ service-level API is a conglomerate of the
+  APIs from three different submodules is twofold. First, we wanted to
+  allow the user a choice of different options for each major task. For
+  instance, if you don't like the protocol API provided by ODR/ASN, you
+  can use SNACC or BERUtils instead, and still have the benefits of the
+  transparent transport approach of the COMSTACK module. Secondly, we
+  realise that you may have to fit the toolkit into an existing event-
+  processing structure, in a way that is incompatible with the COMSTACK
+  interface or some other part of YAZ.
+
+
+  2.  Compilation and Installation
+
+  The latest version of the software will generally be found at
+
+
+
+       http://ftp.indexdata.dk/pub/yaz/
+
+
+
+
+  We have tried our best to keep the software portable, and on many
+  platforms, you should be able to compile everything with little or no
+  changes.  So far, the software has been ported to the following
+  platforms with little or no difficulties.
+
+
+  o  Unix systems
+
+  o  HP/UX
+
+  o  SunOS/Solaris
+
+  o  DEC Unix
+
+  o  Linux
+
+
+  o  IBM AIX
+
+  o  Data General DG/UX (with some CFLAGS tinkering)
+
+  o  SGI/IRIX
+
+  o  DDE Supermax
+
+  o  Non-unix systems
+
+  o  Apple Macintosh (using the Codewarrior programming environment and
+     the GUSI socket libraries)
+
+  o  MS Windows 95/NT (Win32)
+
+  o  IBM AS/400
+
+  If you move the software to other platforms, we'd be grateful if you'd
+  let us know about it. If you run into difficulties, we will try to
+  help if we can, and if you solve the problems, we would be happy to
+  include your fixes in the next release. So far, we have mostly avoided
+  #ifdefs for individual platforms, and we'd like to keep it that way as
+  far as it makes sense.
+
+  We maintain a mailing-list for the purpose of announcing new releases
+  and bug-fixes, as well as general discussion. Subscribe by sending
+  mail to yaz-request@indexdata.dk. General questions and problems can
+  be directed at yaz-help@indexdata.dk, or the address given at the top
+  of this document.
+
+
+  2.1.  UNIX
+
+  Note that if your system doesn't have a native ANSI C compiler, you
+  may have to acquire one separately. We recommend gcc.
+
+  For UNIX we use GNU configure to create Makefiles for YAZ.  Generally
+  it should be sufficient to run configure without options:
+
+
+
+       ./configure
+
+
+
+
+  The configure script attempts to use use the C compiler specified by
+  the CC environment variable. If not set, GNU C will be used if it is
+  available. The CFLAGS environment variable holds options to be passed
+  to the C compiler. If you're using Bourne-compatible shell you may
+  pass something like this to use a particular C compiler with
+  optimization enabled:
+
+
+         CC=/opt/ccs/bin/cc CFLAGS=-O ./configure
+
+
+
+
+  To customize YAZ the configure script also accepts a set of options.
+  The most important are:
+
+
+     --prefix path
+        Specifies installation prefix. This is only needed if you run
+        make install later to perform a "system" installation. The
+        prefix is /usr/local if not specified.
+
+
+     --enable-comp
+        YAZ will be built using the ASN.1 compiler for YAZ (default). If
+        you wish to use the old decoders (in sub directory asn) use
+        --disable-comp instead.
+
+
+     --enable-threads
+        YAZ will be built using POSIX threads. Specifically, _REENTRANT
+        will be defined during compilation.
+
+  When configured, build the software by typing:
+
+
+         make
+
+
+
+
+  Developers that do modifications to YAZ may wish to run make depend as
+  well to generate object-header file dependencies.
+
+  The following files are generated by make
+
+     lib/libyaz.a
+        The YAZ programmers' library.
+
+
+     ztest/yaz-ztest
+        A test Z39.50 server.
+
+
+     client/yaz-client
+        A command mode Z39.50 client.
+
+
+     yaz-config
+        A Bourne-shell script that holds build settings for YAZ.
+
+
+  If you wish to install YAZ in system directories such as
+  /usr/local/bin, /usr/local/lib) you can type:
+
+
+
+         make install
+
+
+
+
+  You probably need to have root access in order to perform this.  You
+  must specify the --prefix option for configure if you going to install
+  in anything but /usr/local/.
+
+
+  2.2.  WIN32
+
+  YAZ is shipped with "makefiles" for the NMAKE tool that comes with
+  Visual C++.
+
+  Start an MS-DOS prompt and switch the sub directory WIN where the file
+  makefile is located. Customize the installation by editing the
+  makefile file (for example by using notepad).
+
+  The following summarises the most important settings in that file:
+
+
+     NEW_Z3950
+        If 1, the auto-generated decoder/encoders for Z39.50 as written
+        by the ASN.1 compiler will be used. If 0, the old decoders for
+        Z39.50 will be used. Note, when 1, the setting TCL should point
+        to the Tcl shell on your system.
+
+     DEBUG
+        If set to 1, the software is compiled with debugging libraries.
+        If set to 0, the software is compiled with release (non-
+        debugging) libraries.
+
+  When satisfied with the settings in the makefile type
+
+
+       nmake
+
+
+
+
+  The following is generated upon successful compilation:
+
+     bin/yaz.dll
+        A multithreaded DLL with everything except the frontend server
+        library.
+
+     lib/yaz.lib
+        An import library for yaz.dll.
+
+     lib/server.lib
+        The frontend server library.
+
+     bin/yaz-ztest.exe
+        A test Z39.50 server.
+
+     bin/yaz-client.exe
+        A command mode Z39.50 client.
+
+
+  3.  The ASN Module
+
+  3.1.  Introduction
+
+  The ASN module provides you with a set of C struct definitions for the
+  various PDUs of the protocol, as well as for the complex types
+  appearing within the PDUs. For the primitive data types, the C
+  representation often takes the form of an ordinary C language type,
+  such as int. For ASN.1 constructs that have no direct representation
+  in C, such as general octet strings and bit strings, the ODR module
+  (see section ``ODR'') provides auxiliary definitions.
+
+
+  3.2.  Preparing PDUs
+
+  A structure representing a complex ASN.1 type doesn't in itself
+  contain the members of that type. Instead, the structure contains
+  pointers to the members of the type. This is necessary, in part, to
+  allow a mechanism for specifying which of the optional structure
+  (SEQUENCE) members are present, and which are not. It follows that you
+  will need to somehow provide space for the individual members of the
+  structure, and set the pointers to refer to the members.
+
+  The conversion routines don't care how you allocate and maintain your
+  C structures - they just follow the pointers that you provide.
+  Depending on the complexity of your application, and your personal
+  taste, there are at least three different approaches that you may take
+  when you allocate the structures.
+
+
+  o  You can use static or automatic local variables in the function
+     that prepares the PDU. This is a simple approach, and it provides
+     the most efficient form of memory management. While it works well
+     for flat PDUs like the InitReqest, it will generally not be
+     sufficient for say, the generation of an arbitrarily complex RPN
+     query structure.
+
+  o  You can individually create the structure and its members using the
+     malloc(2) function. If you want to ensure that the data is freed
+     when it is no longer needed, you will have to define a function
+     that individually releases each member of a structure before
+     freeing the structure itself.
+
+  o  You can use the odr_malloc() function (see section ``Using ODR''
+     for details). When you use odr_malloc(), you can release all of the
+     allocated data in a single operation, independent of any pointers
+     and relations between the data. odr_malloc() is based on a "nibble-
+     memory" scheme, in which large portions of memory are allocated,
+     and then gradually handed out with each call to odr_malloc(). The
+     next time you call odr_reset(), all of the memory allocated since
+     the last call is recycled for future use (actually, it is placed on
+     a free-list).
+
+  o  You can combine all of the methods described here. This will often
+     be the most practical approach. For instance, you might use
+     odr_malloc() to allocate an entire structure and some of its
+     elements, while you leave other elements pointing to global or per-
+     session default variables.
+
+  The ASN module provides an important aid in creating new PDUs. For
+  each of the PDU types (say, Z_InitRequest), a function is provided
+  that allocates and initializes an instance of that PDU type for you.
+  In the case of the InitRequest, the function is simply named
+  zget_InitRequest(), and it sets up reasonable default value for all of
+  the mandatory members. The optional members are generally initialized
+  to null pointers. This last aspect is very important: it ensures that
+  if the PDU definitions are extended after you finish your
+  implementation (to accommodate new versions of the protocol, say), you
+  won't get into trouble with uninitialized pointers in your structures.
+  The functions use odr_malloc() to allocate the PDUs and its members,
+  so you can free everything again with a single call to odr_reset(). We
+  strongly recommend that you use the zget_* functions whenever you are
+  preparing a PDU (in a C++ API, the zget_ functions would probably be
+  promoted to constructors for the individual types).
+
+  The prototype for the individual PDU types generally look like this:
+
+
+
+       Z_<type> *zget_<type>(ODR o);
+
+
+
+
+  eg.:
+
+
+
+       Z_InitRequest *zget_InitRequest(ODR o);
+
+
+  The ODR handle should generally be your encoding stream, but it
+  needn't be.
+
+  As well as the individual PDU functions, a function zget_APDU() is
+  provided, which allocates a toplevel Z-APDU of the type requested:
+
+
+
+       Z_APDU *zget_APDU(ODR o, int which);
+
+
+
+
+  The which parameter is (of course) the discriminator belonging to the
+  Z_APDU CHOICE type. All of the interface described here is provided by
+  the ASN module, and you access it through the proto.h header file.
+
+
+  3.3.  Object Identifiers
+
+  When you refer to object identifiers in your application, you need to
+  be aware that SR and Z39.50 use two different set of OIDs to refer to
+  the same objects. To handle this easily, YAZ provides a utility module
+  to ASN which provides an internal representation of the OIDs used in
+  both protocols. Each oid is described by a structure:
+
+
+
+       typedef struct oident
+       {
+           enum oid_proto proto;
+           enum oid_class class;
+           enum oid_value value;
+           int oidsuffix[OID_SIZE];
+           char *desc;
+       } oident;
+
+
+
+
+  The proto field can be set to either PROTO_SR or PROTO_Z3950. The
+  class might be, say, CLASS_RECSYN, and the value might be VAL_USMARC
+  for the USMARC record format. Functions
+
+
+
+       int *oid_ent_to_oid(struct oident *ent, int *dst);
+       struct oident *oid_getentbyoid(int *o);
+
+
+
+
+  are provided to map between object identifiers and database entries.
+  If you store a member of the oid_proto type in your association state
+  information, it's a simple matter, at runtime, to generate the correct
+  OID when you need it. For decoding, you can simply ignore the proto
+  field, or if you're strict, you can verify that your peer is using the
+  OID family from the correct protocol. The desc field is a short,
+  human-readable name for the PDU, useful mainly for diagnostic output.
+
+  NOTE: The old function oid_getoidbyent still exists but is not thread
+  safe. Use oid_ent_to_oid instead and pass an array of size OID_SIZE.
+
+  NOTE: Plans are underway to merge the two protocols into a single
+  definition, with one set of object identifiers. When this happens, the
+  oid module will no longer be required to support protocol
+  independence, but it should still be useful as a simple OID database.
+
+
+  3.4.  EXTERNAL Data
+
+  In order to achieve extensibility and adaptability to different
+  application domains, the new version of the protocol defines many
+  structures outside of the main ASN.1 specification, referencing them
+  through ASN.1 EXTERNAL constructs. To simplify the construction and
+  access to the externally referenced data, the ASN module defines a
+  specialized version of the EXTERNAL construct, called Z_External.  It
+  is defined thus:
+
+
+
+       typedef struct Z_External
+       {
+           Odr_oid *direct_reference;
+           int *indirect_reference;
+           char *descriptor;
+           enum
+           {
+               /* Generic types */
+               Z_External_single = 0,
+               Z_External_octet,
+               Z_External_arbitrary,
+
+               /* Specific types */
+               Z_External_SUTRS,
+               Z_External_explainRecord,
+               Z_External_resourceReport1,
+               Z_External_resourceReport2
+
+               ...
+
+           } which;
+           union
+           {
+               /* Generic types */
+               Odr_any *single_ASN1_type;
+               Odr_oct *octet_aligned;
+               Odr_bitmask *arbitrary;
+
+               /* Specific types */
+               Z_SUTRS *sutrs;
+               Z_ExplainRecord *explainRecord;
+               Z_ResourceReport1 *resourceReport1;
+               Z_ResourceReport2 *resourceReport2;
+
+               ...
+
+           } u;
+       } Z_External;
+
+
+
+
+  When decoding, the ASN module will attempt to determine which syntax
+  describes the data by looking at the reference fields (currently only
+  the direct-reference). For ASN.1 structured data, you need only
+  consult the which field to determine the type of data.  You can the
+  access  the data directly through the union. When constructing data
+  for encoding, you set the union pointer to point to the data, and set
+  the which field accordingly. Remember also to set the direct (or
+  indirect) reference to the correct OID for the data type. For non-
+  ASN.1 data such as MARC records, use the octet_aligned arm of the
+  union.
+
+  Some servers return ASN.1 structured data values (eg. database
+  records) as BER-encoded records placed in the octet-aligned branch of
+  the EXTERNAL CHOICE. The ASN-module will not automatically decode
+  these records. To help you decode the records in the application, the
+  function
+
+
+
+       Z_ext_typeent *z_ext_gettypebyref(oid_value ref);
+
+
+
+
+  Can be used to retrieve information about the known, external data
+  types. The function return a pointer to a static area, or NULL, if no
+  match for the given direct reference is found. The Z_ext_typeent is
+  defined as:
+
+
+
+       typedef struct Z_ext_typeent
+       {
+           oid_value dref;    /* the direct-reference OID value. */
+           int what;          /* discriminator value for the external CHOICE */
+           Odr_fun fun;       /* decoder function */
+       } Z_ext_typeent;
+
+
+
+
+  The what member contains the Z_External union discriminator value for
+  the given type: For the SUTRS record syntax, the value would be
+  Z_External_sutrs. The fun member contains a pointer to the function
+  which encodes/decodes the given type. Again, for the SUTRS record
+  syntax, the value of fun would be z_SUTRS (a function pointer).
+
+  If you receive an EXTERNAL which contains an octet-string value that
+  you suspect of being an ASN.1-structured data value, you can use
+  z_ext_gettypebyref to look for the provided direct-reference. If the
+  return value is different from NULL, you can use the provided function
+  to decode the BER string (see section ``Using ODR'').
+
+  If you want to send EXTERNALs containing ASN.1-structured values in
+  the occtet-aligned branch of the CHOICE, this is possible too.
+  However, on the encoding phase, it requires a somewhat involved
+  juggling around of the various buffers involved.
+
+  If you need to add new, externally defined data types, you must update
+  the struct above, in the source file prt-ext.h, as well as the
+  encoder/decoder in the file prt-ext.c. When changing the latter,
+  remember to update both the arm arrary and the list type_table, which
+  drives the CHOICE biasing that is necessary to tell the different,
+  structured types apart on decoding.
+
+  NOTE: Eventually, the EXTERNAL processing will most likely
+  automatically insert the correct OIDs or indirect-refs. First,
+  however, we need to determine how application-context management
+  (specifically the presentation-context-list) should fit into the
+  various modules.
+
+
+
+
+
+  3.5.  PDU Contents Table
+
+  We include, for reference, a listing of the fields of each top-level
+  PDU, as well as their default settings.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  Z_InitRequest
+  -------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  protocolVersion              Odr_bitmask         Empty bitmask
+  options                      Odr_bitmask         Empty bitmask
+  preferredMessageSize         int                 30*1024
+  maximumRecordSize            int                 30*1024
+  idAuthentication             Z_IdAuthentication  NULL
+  implementationId             char*               "YAZ (id=81)"
+  implementationName           char*               "Index Data/YAZ"
+  implementationVersion        char*               YAZ_VERSION
+  userInformationField         Z_UserInformation   NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_InitResponse
+  --------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  protocolVersion              Odr_bitmask         Empty bitmask
+  options                      Odr_bitmask         Empty bitmask
+  preferredMessageSize         int                 30*1024
+  maximumRecordSize            int                 30*1024
+  result                       bool_t              TRUE
+  implementationId             char*               "YAZ (id=81)"
+  implementationName           char*               "Index Data/YAZ"
+  implementationVersion        char*               YAZ_VERSION
+  userInformationField         Z_UserInformat..    NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_SearchRequest
+  ---------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  smallSetUpperBound           int                 0
+  largeSetLowerBound           int                 1
+  mediumSetPresentNumber       int                 0
+  replaceIndicator             bool_t              TRUE
+  resultSetName                char*               "default"
+  num_databaseNames            int                 0
+  databaseNames                char**              NULL
+  smallSetElementSetNames      Z_ElementSetNames   NULL
+  mediumSetElementSetNames     Z_ElementSetNames   NULL
+  preferredRecordSyntax        Odr_oid             NULL
+  query                        Z_Query             NULL
+  additionalSearchInfo         Z_OtherInformation  NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_SearchResponse
+  ----------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  resultCount                  int                 0
+  numberOfRecordsReturned      int                 0
+  nextResultSetPosition        int                 0
+  searchStatus                 bool_t              TRUE
+  resultSetStatus              int                 NULL
+  presentStatus                int                 NULL
+  records                      Z_Records           NULL
+  additionalSearchInfo         Z_OtherInformation  NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_PresentRequest
+  ----------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  resultSetId                  char*               "default"
+  resultSetStartPoint          int                 1
+  numberOfRecordsRequested     int                 10
+  num_ranges                   int                 0
+  additionalRanges             Z_Range             NULL
+  recordComposition            Z_RecordComposition NULL
+  preferredRecordSyntax        Odr_oid             NULL
+  maxSegmentCount              int                 NULL
+  maxRecordSize                int                 NULL
+  maxSegmentSize               int                 NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_PresentResponse
+  -----------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  numberOfRecordsReturned      int                 0
+  nextResultSetPosition        int                 0
+  presentStatus                int                 Z_PRES_SUCCESS
+  records                      Z_Records           NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_DeleteResultSetRequest
+  ------------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  deleteFunction               int                 Z_DeleteRequest_list
+  num_ids                      int                 0
+  resultSetList                char**              NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_DeleteResultSetResponse
+  -------------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  deleteOperationStatus        int                 Z_DeleteStatus_success
+  num_statuses                 int                 0
+  deleteListStatuses           Z_ListStatus**      NULL
+  numberNotDeleted             int                 NULL
+  num_bulkStatuses             int                 0
+  bulkStatuses                 Z_ListStatus        NULL
+  deleteMessage                char*               NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_ScanRequest
+  -------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  num_databaseNames            int                 0
+  databaseNames                char**              NULL
+  attributeSet                 Odr_oid             NULL
+  termListAndStartPoint        Z_AttributesPlus... NULL
+  stepSize                     int                 NULL
+  numberOfTermsRequested       int                 20
+  preferredPositionInResponse  int                 NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_ScanResponse
+  --------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  stepSize                     int                 NULL
+  scanStatus                   int                 Z_Scan_success
+  numberOfEntriesReturned      int                 0
+  positionOfTerm               int                 NULL
+  entries                      Z_ListEntris        NULL
+  attributeSet                 Odr_oid             NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_TriggerResourceControlRequest
+  -------------------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  requestedAction              int                 Z_TriggerResourceCtrl_resou..
+  prefResourceReportFormat     Odr_oid             NULL
+  resultSetWanted              bool_t              NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_ResourceControlRequest
+  ------------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  suspendedFlag                bool_t              NULL
+  resourceReport               Z_External          NULL
+  partialResultsAvailable      int                 NULL
+  responseRequired             bool_t              FALSE
+  triggeredRequestFlag         bool_t              NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_ResourceControlResponse
+  -------------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  continueFlag                 bool_t              TRUE
+  resultSetWanted              bool_t              NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_AccessControlRequest
+  ----------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  which                        enum                Z_AccessRequest_simpleForm;
+  u                            union               NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_AccessControlResponse
+  -----------------------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  which                        enum                Z_AccessResponse_simpleForm
+  u                            union               NULL
+  diagnostic                   Z_DiagRec           NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_Segment
+  ---------
+  Field                        Type                Default value
+  referenceId                  Z_ReferenceId       NULL
+  numberOfRecordsReturned      int                 value=0
+  num_segmentRecords           int                 0
+  segmentRecords               Z_NamePlusRecord    NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+  Z_Close
+  -------
+  Field                        Type                Default value
+
+  referenceId                  Z_ReferenceId       NULL
+  closeReason                  int                 Z_Close_finished
+  diagnosticInformation        char*               NULL
+  resourceReportFormat         Odr_oid             NULL
+  resourceFormat               Z_External          NULL
+  otherInfo                    Z_OtherInformation  NULL
+
+
+
+
+  4.  Supporting Tools
+
+  In support of the service API - primarily the ASN module, which
+  provides the programmatic interface to the Z39.50 APDUs, YAZ contains
+  a collection of tools that support the development of applications.
+
+
+  4.1.  Query Syntax Parsers
+
+  Since the type-1 (RPN) query structure has no direct, useful string
+  representation, every origin application needs to provide some form of
+  mapping from a local query notation or representation to a Z_RPNQuery
+  structure. Some programmers will prefer to construct the query
+  manually, perhaps using odr_malloc() to simplify memory management.
+  The YAZ distribution includes two separate, query-generating tools
+  that may be of use to you.
+
+
+  4.1.1.  Prefix Query Format
+
+  Since RPN or reverse polish notation is really just a fancy way of
+  describing a suffix notation format (operator follows operands), it
+  would seem that the confusion is total when we now introduce a prefix
+  notation for RPN. The reason is one of simple laziness - it's somewhat
+  simpler to interpret a prefix format, and this utility was designed
+  for maximum simplicity, to provide a baseline representation for use
+  in simple test applications and scripting environments (like Tcl). The
+  demonstration client included with YAZ uses the PQF.
+
+  The PQF is defined by the pquery module in the YAZ library. The
+  pquery.h file provides the declaration of the functions
+
+
+
+       Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
+
+       Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+             Odr_oid **attributeSetP, const char *qbuf);
+
+       int p_query_attset (const char *arg);
+
+
+
+
+  The function p_query_rpn() takes as arguments an ODR stream (see
+  section ``The ODR Module'') to provide a memory source (the structure
+  created is released on the next call to odr_reset() on the stream/), a
+  protocol identifier (one of the constants PROTO_Z3950 and PROTO_SR),
+  an attribute set reference, and finally a null-terminated string
+  holding the query string.
+
+  If the parse went well, p_query_rpn() returns a pointer to a
+  Z_RPNQuery structure which can be placed directly into a
+  Z_SearchRequest.
+
+  The p_query_attset specifies which attribute set to use if the query
+  doesn't specify one by the @attrset operator. The p_query_attset
+  returns 0 if the argument is a valid attribute set specifier;
+  otherwise the function returns -1.
+
+  The grammar of the PQF is as follows:
+
+
+
+       Query ::= [ AttSet ] QueryStruct.
+
+       AttSet ::= string.
+
+       QueryStruct ::= { Attribute } Simple | Complex.
+
+       Attribute ::= '@attr' AttributeType '=' AttributeValue.
+
+       AttributeType ::= integer.
+
+       AttributeValue ::= integer.
+
+       Complex ::= Operator QueryStruct QueryStruct.
+
+       Operator ::= '@and' | '@or' | '@not' | '@prox' Proximity.
+
+       Simple ::= ResultSet | Term.
+
+       ResultSet ::= '@set' string.
+
+       Term ::= string | '"' string '"'.
+
+       Proximity ::= Exclusion Distance Ordered Relation WhichCode UnitCode.
+
+       Exclusion ::= '1' | '0' | 'void'.
+
+       Distance ::= integer.
+
+       Ordered ::= '1' | '0'.
+
+       Relation ::= integer.
+
+       WhichCode ::= 'known' | 'private' | integer.
+
+       UnitCode ::= integer.
+
+
+
+
+  You will note that the syntax above is a fairly faithful
+  representation of RPN, except for the Attibute, which has been moved a
+  step away from the term, allowing you to associate one or more
+  attributes with an entire query structure. The parser will
+  automatically apply the given attributes to each term as required.
+
+  The following are all examples of valid queries in the PQF.
+
+
+       dylan
+
+       "bob dylan"
+
+       @or "dylan" "zimmerman"
+
+       @set Result-1
+
+       @or @and bob dylan @set Result-1
+
+       @attr 4=1 @and @attr 1=1 "bob dylan" @attr 1=4 "slow train coming"
+
+       @attr 4=1 @attr 1=4 "self portrait"
+
+       @prox 0 3 1 2 k 2 dylan zimmerman
+
+
+
+
+
+  4.1.2.  Common Command Language
+
+  Not all users enjoy typing in prefix query structures and numerical
+  attribute values, even in a minimalistic test client. In the library
+  world, the more intuitive Common Command Language (or ISO 8777) has
+  enjoyed some popularity - especially before the widespread
+  availability of graphical interfaces. It is still useful in
+  applications where you for some reason or other need to provide a
+  symbolic language for expressing boolean query structures.
+
+  The EUROPAGATE research project working under the Libraries programme
+  of the European Commission's DG XIII has, amongst other useful tools,
+  implemented a general-purpose CCL parser which produces an output
+  structure that can be trivially converted to the internal RPN
+  representation of YAZ (The Z_RPNQuery structure). Since the CCL
+  utility - along with the rest of the software produced by EUROPAGATE -
+  is made freely available on a liberal license, it is included as a
+  supplement to YAZ.
+
+
+  4.1.2.1.  CCL Syntax
+
+  The CCL parser obeys the following grammar for the FIND argument.  The
+  syntax is annotated by in the lines prefixed by --.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  CCL-Find ::= CCL-Find Op Elements
+             | Elements.
+
+  Op ::= "and" | "or" | "not"
+  -- The above means that Elements are separated by boolean operators.
+
+  Elements ::= '(' CCL-Find ')'
+             | Set
+             | Terms
+             | Qualifiers Relation Terms
+             | Qualifiers Relation '(' CCL-Find ')'
+             | Qualifiers '=' string '-' string
+  -- Elements is either a recursive definition, a result set reference, a
+  -- list of terms, qualifiers followed by terms, qualifiers followed
+  -- by a recursive definition or qualifiers in a range (lower - upper).
+
+  Set ::= 'set' = string
+  -- Reference to a result set
+
+  Terms ::= Terms Prox Term
+          | Term
+  -- Proximity of terms.
+
+  Term ::= Term string
+         | string
+  -- This basically means that a term may include a blank
+
+  Qualifiers ::= Qualifiers ',' string
+               | string
+  -- Qualifiers is a list of strings separated by comma
+
+  Relation ::= '=' | '>=' | '<=' | '<>' | '>' | '<'
+  -- Relational operators. This really doesn't follow the ISO8777
+  -- standard.
+
+  Prox ::= '%' | '!'
+  -- Proximity operator
+
+
+
+
+  The following queries are all valid:
+
+
+
+       dylan
+
+       "bob dylan"
+
+       dylan or zimmerman
+
+       set=1
+
+       (dylan and bob) or set=1
+
+
+
+
+  Assuming that the qualifiers ti, au and date are defined we may use:
+
+
+
+
+
+
+
+  ti=self portrait
+
+  au=(bob dylan and slow train coming)
+
+  date>1980 and (ti=((self portrait)))
+
+
+
+
+
+  4.1.2.2.  CCL Qualifiers
+
+
+  Qualifiers are used to direct the search to a particular searchable
+  index, such as title (ti) and author indexes (au). The CCL standard
+  itself doesn't specify a particular set of qualifiers, but it does
+  suggest a few short-hand notations. You can customize the CCL parser
+  to support a particular set of qualifiers to relect the current target
+  profile. Traditionally, a qualifier would map to a particular use-
+  attribute within the BIB-1 attribute set. However, you could also
+  define qualifiers that would set, for example, the structure-
+  attribute.
+
+  Consider a scenario where the target support ranked searches in the
+  title-index. In this case, the user could specify
+
+
+       ti,ranked=knuth computer
+
+
+
+
+  and the ranked would map to structure=free-form-text (4=105) and the
+  ti would map to title (1=4).
+
+  A "profile" with a set predefined CCL qualifiers can be read from a
+  file. The YAZ client reads its CCL qualifiers from a file named
+  default.bib. Each line in the file has the form:
+
+  qualifier-name    type=val type=val ...
+
+  where qualifier-name is the name of the qualifier to be used (eg. ti),
+  type is a BIB-1 category type and val is the corresponding BIB-1
+  attribute value. The type can be either numeric or it may be either u
+  (use), r (relation), p (position), s (structure), t (truncation) or c
+  (completeness). The qualifier-name term has a special meaning. The
+  types and values for this definition is used when no qualifier is
+  present.
+
+  Consider the following definition:
+
+
+       ti       u=4 s=1
+       au       u=1 s=1
+       term     s=105
+
+
+
+
+  Two qualifiers are defined, ti and au. They both set the structure-
+  attribute to phrase (1). ti sets the use-attribute to 4. au sets the
+  use-attribute to 1. When no qualifiers are used in the query the
+  structure-attribute is set to free-form-text (105).
+
+
+
+  4.1.2.3.  CCL API
+
+
+  All public definitions can be found in the header file ccl.h.  A
+  profile identifier is of type CCL_bibset. A profile must be created
+  with the call to the function ccl_qual_mk which returns a profile
+  handle of type CCL_bibset.
+
+  To read a file containing qualifier definitions the function
+  ccl_qual_file may be convenient. This function takes an already opened
+  FILE handle pointer as argument along with a CCL_bibset handle.
+
+  To parse a simple string with a FIND query use the function
+
+
+       struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset, const char *str,
+                                          int *error, int *pos);
+
+
+
+
+  which takes the CCL profile (bibset) and query (str) as input. Upon
+  successful completion the RPN tree is returned. If an error eccur,
+  such as a syntax error, the integer pointed to by error holds the
+  error code and pos holds the offset inside query string in which the
+  parsing failed.
+
+  An english representation of the error may be obtained by calling the
+  ccl_err_msg function. The error codes are listed in ccl.h.
+
+  To convert the CCL RPN tree (type struct ccl_rpn_node *) to the
+  Z_RPNQuery of YAZ the function ccl_rpn_query must be used. This
+  function which is part of YAZ is implemented in yaz-ccl.c.  After
+  calling this function the CCL RPN tree is probably no longer needed.
+  The ccl_rpn_delete destroys the CCL RPN tree.
+
+  A CCL profile may be destroyed by calling the ccl_qual_rm function.
+
+  The token names for the CCL operators may be changed by setting the
+  globals (all type char *) ccl_token_and, ccl_token_or, ccl_token_not
+  and ccl_token_set.  An operator may have aliases, i.e. there may be
+  more than one name for the operator. To do this, separate each alias
+  with a space character.
+
+
+  4.2.  Object Identifiers
+
+  The basic YAZ representation of an OID is an array of integers,
+  terminated with the value -1. The ODR module provides two utility-
+  functions to create and copy this type of data elements:
+
+
+
+       Odr_oid *odr_getoidbystr(ODR o, char *str);
+
+
+
+
+  Creates an OID based on a string-based representation using dots (.)
+  to separate elements in the OID.
+
+
+
+       Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
+
+
+  Creates a copy of the OID referenced by the o parameter. Both
+  functions take an ODR stream as parameter. This stream is used to
+  allocate memory for the data elements, which is released on a
+  subsequent call to odr_reset() on that stream.
+
+  The OID module provides a higher-level representation of the family of
+  object identifers which describe the Z39.50 protocol and its related
+  objects. The definition of the module interface is given in the oid.h
+  file.
+
+  The interface is mainly based on the oident structure. The definition
+  of this structure looks like this:
+
+
+
+       typedef struct oident
+       {
+           oid_proto proto;
+           oid_class oclass;
+           oid_value value;
+           int oidsuffix[OID_SIZE];
+           char *desc;
+       } oident;
+
+
+
+
+  The proto field takes one of the values
+
+
+
+       PROTO_Z3950
+       PROTO_SR
+
+
+
+
+  If you don't care about talking to SR-based implementations (few
+  exist, and they may become fewer still if and when the ISO SR and ANSI
+  Z39.50 documents are merged into a single standard), you can ignore
+  this field on incoming packages, and always set it to PROTO_Z3950 for
+  outgoing packages.
+
+  The oclass field takes one of the values
+
+
+
+       CLASS_APPCTX
+       CLASS_ABSYN
+       CLASS_ATTSET
+       CLASS_TRANSYN
+       CLASS_DIAGSET
+       CLASS_RECSYN
+       CLASS_RESFORM
+       CLASS_ACCFORM
+       CLASS_EXTSERV
+       CLASS_USERINFO
+       CLASS_ELEMSPEC
+       CLASS_VARSET
+       CLASS_SCHEMA
+       CLASS_TAGSET
+       CLASS_GENERAL
+
+
+
+
+  corresponding to the OID classes defined by the Z39.50 standard.
+
+  Finally, the value field takes one of the values
+
+
+
+       VAL_APDU
+       VAL_BER
+       VAL_BASIC_CTX
+       VAL_BIB1
+       VAL_EXP1
+       VAL_EXT1
+       VAL_CCL1
+       VAL_GILS
+       VAL_WAIS
+       VAL_STAS
+       VAL_DIAG1
+       VAL_ISO2709
+       VAL_UNIMARC
+       VAL_INTERMARC
+       VAL_CCF
+       VAL_USMARC
+       VAL_UKMARC
+       VAL_NORMARC
+       VAL_LIBRISMARC
+       VAL_DANMARC
+       VAL_FINMARC
+       VAL_MAB
+       VAL_CANMARC
+       VAL_SBN
+       VAL_PICAMARC
+       VAL_AUSMARC
+       VAL_IBERMARC
+       VAL_EXPLAIN
+       VAL_SUTRS
+       VAL_OPAC
+       VAL_SUMMARY
+       VAL_GRS0
+       VAL_GRS1
+       VAL_EXTENDED
+       VAL_RESOURCE1
+       VAL_RESOURCE2
+       VAL_PROMPT1
+       VAL_DES1
+       VAL_KRB1
+       VAL_PRESSET
+       VAL_PQUERY
+       VAL_PCQUERY
+       VAL_ITEMORDER
+       VAL_DBUPDATE
+       VAL_EXPORTSPEC
+       VAL_EXPORTINV
+       VAL_NONE
+       VAL_SETM
+       VAL_SETG
+       VAL_VAR1
+       VAL_ESPEC1
+
+
+
+
+  again, corresponding to the specific OIDs defined by the standard.
+
+  The desc field contains a brief, mnemonic name for the OID in
+  question.
+
+  The function
+
+
+
+       struct oident *oid_getentbyoid(int *o);
+
+
+
+
+  takes as argument an OID, and returns a pointer to a static area
+  containing an oident structure. You typically use this function when
+  you receive a PDU containing an OID, and you wish to branch out
+  depending on the specific OID value.
+
+  The function
+
+
+
+       int *oid_ent_to_oid(struct oident *ent, int *dst);
+
+
+
+
+  Takes as argument an oident structure - in which the proto, oclass,
+  and value fields are assumed to be set correctly - and returns a
+  pointer to a the buffer as given by dst containing the base
+  representation of the corresponding OID. The function returns NULL and
+  the array dst is unchanged if a mapping couldn't place.  The array dst
+  should be at least of size OID_SIZE.
+
+  The oid_ent_to_oid() function can be used whenever you need to prepare
+  a PDU containing one or more OIDs. The separation of the protocol
+  element from the remainer of the OID-description makes it simple to
+  write applications that can communicate with either Z39.50 or OSI SR-
+  based applications.
+
+  The function
+
+
+
+       oid_value oid_getvalbyname(const char *name);
+
+
+
+
+  takes as argument a mnemonic OID name, and returns the value field of
+  the first entry in the database that contains the given name in its
+  desc field.
+
+  Finally, the module provides the following utility functions, whose
+  meaning should be obvious:
+
+
+
+       void oid_oidcpy(int *t, int *s);
+       void oid_oidcat(int *t, int *s);
+       int oid_oidcmp(int *o1, int *o2);
+       int oid_oidlen(int *o);
+
+
+
+
+  NOTE: The OID module has been criticized - and perhaps rightly so -
+  for needlessly abstracting the representation of OIDs. Other toolkits
+  use a simple string-representation of OIDs with good results. In
+  practice, we have found the interface comfortable and quick to work
+  with, and it is a simple matter (for what it's worth) to create
+  applications compatible with both ISO SR and Z39.50. Finally, the use
+  of the oident database is by no means mandatory. You can easily create
+  your own system for representing OIDs, as long as it is compatible
+  with the low-level integer-array representation of the ODR module.
+
+
+  4.3.  Nibble Memory
+
+  Sometimes when you need to allocate and construct a large,
+  interconnected complex of structures, it can be a bit of a pain to
+  release the associated memory again. For the structures describing the
+  Z39.50 PDUs and related structures, it is convenient to use the
+  memory-management system of the ODR subsystem (see ``Using ODR'').
+  However, in some circumstances where you might otherwise benefit from
+  using a simple nibble memory management system, it may be impractical
+  to use odr_malloc() and odr_reset(). For this purpose, the memory
+  manager which also supports the ODR streams is made available in the
+  NMEM module. The external interface to this module is given in the
+  nmem.h file.
+
+  The following prototypes are given:
+
+
+
+       NMEM nmem_create(void);
+       void nmem_destroy(NMEM n);
+       void *nmem_malloc(NMEM n, int size);
+       void nmem_reset(NMEM n);
+       int nmem_total(NMEM n);
+       void nmem_init(void);
+
+
+
+
+  The nmem_create() function returns a pointer to a memory control
+  handle, which can be released again by nmem_destroy() when no longer
+  needed. The function nmem_malloc() allocates a block of memory of the
+  requested size. A call to nmem_reset() or nmem_destroy() will release
+  all memory allocated on the handle since it was created (or since the
+  last call to nmem_reset(). The function nmem_total() returns the
+  number of bytes currently allocated on the handle.
+
+  Note that the nibble memory pool is shared amonst threads. Posix
+  mutex'es and WIN32 Critical sections are introduced to keep the module
+  thread safe. On WIN32 function nmem_init() initialises the Critical
+  Section handle and should be called once before any other nmem
+  function is used.
+
+
+  5.  The ODR Module
+
+  5.1.  Introduction
+
+  ODR is the BER-encoding/decoding subsystem of YAZ. Care as been taken
+  to isolate ODR from the rest of the package - specifically from the
+  transport interface. ODR may be used in any context where basic
+  ASN.1/BER representations are used.
+
+  If you are only interested in writing a Z39.50 implementation based on
+  the PDUs that are already provided with YAZ, you only need to concern
+  yourself with the section on managing ODR streams (section ``Using
+  ODR''). Only if you need to implement ASN.1 beyond that which has been
+  provided, should you worry about the second half of the documentation
+  (section ``Programming with ODR''). If you use one of the higher-level
+  interfaces, you can skip this section entirely.
+  This is important, so we'll repeat it for emphasis: You do not need to
+  read section ``Programming with ODR'' to implement Z39.50 with YAZ.
+
+  If you need a part of the protocol that isn't already in YAZ, you
+  should contact the authors before going to work on it yourself: We
+  might already be working on it. Conversely, if you implement a useful
+  part of the protocol before us, we'd be happy to include it in a
+  future release.
+
+
+  5.2.  Using ODR
+
+
+  5.2.1.  ODR Streams
+
+  Conceptually, the ODR stream is the source of encoded data in the
+  decoding mode; when encoding, it is the receptacle for the encoded
+  data. Before you can use an ODR stream it must be allocated. This is
+  done with the function
+
+
+
+       ODR odr_createmem(int direction);
+
+
+
+
+  The odr_createmem() function takes as argument one of three manifest
+  constants: ODR_ENCODE, ODR_DECODE, or ODR_PRINT. An ODR stream can be
+  in only one mode - it is not possible to change its mode once it's
+  selected. Typically, your program will allocate at least two ODR
+  streams - one for decoding, and one for encoding.
+
+  When you're done with the stream, you can use
+
+
+
+       void odr_destroy(ODR o);
+
+
+
+
+  to release the resources allocated for the stream.
+
+
+  5.2.2.  Memory Management
+
+  Two forms of memory management take place in the ODR system. The first
+  one, which has to do with allocating little bits of memory (sometimes
+  quite large bits of memory, actually) when a protocol package is
+  decoded, and turned into a complex of interlinked structures. This
+  section deals with this system, and how you can use it for your own
+  purposes. The next section deals with the memory management which is
+  required when encoding data - to make sure that a large enough buffer
+  is available to hold the fully encoded PDU.
+
+  The ODR module has its own memory management system, which is used
+  whenever memory is required. Specifically, it is used to allocate
+  space for data when decoding incoming PDUs. You can use the memory
+  system for your own purposes, by using the function
+
+
+
+       void *odr_malloc(ODR o, int size);
+
+
+  You can't use the normal free(2) routine to free memory allocated by
+  this function, and ODR doesn't provide a parallel function. Instead,
+  you can call
+
+
+
+       void odr_reset(ODR o, int size);
+
+
+
+
+  when you are done with the memory: Everything allocated since the last
+  call to odr_reset() is released. The odr_reset() call is also required
+  to clear up an error condition on a stream.
+
+  The function
+
+
+
+       int odr_total(ODR o);
+
+
+
+
+  returns the number of bytes allocated on the stream since the last
+  call to odr_reset().
+
+  The memory subsystem of ODR is fairly efficient at allocating and
+  releasing little bits of memory. Rather than managing the individual,
+  small bits of space, the system maintains a freelist of larger chunks
+  of memory, which are handed out in small bits. This scheme is
+  generally known as a nibble memory system. It is very useful for
+  maintaing short-lived constructions such as protocol PDUs.
+
+  If you want to retain a bit of memory beyond the next call to
+  odr_reset(), you can use the function
+
+
+
+       ODR_MEM odr_extract_mem(ODR o);
+
+
+
+
+  This function will give you control of the memory recently allocated
+  on the ODR stream. The memory will live (past calls to odr_reset()),
+  until you call the function
+
+
+
+       void odr_release_mem(ODR_MEM p);
+
+
+
+
+  The opaque ODR_MEM handle has no other purpose than referencing the
+  memory block for you until you want to release it.
+
+  You can use odr_extract_mem() repeatedly between allocating data, to
+  retain individual control of separate chunks of data.
+
+
+  5.2.3.  Encoding and Decoding Data
+
+  When encoding data, the ODR stream will write the encoded octet string
+  in an internal buffer. To retrieve the data, use the function
+       char *odr_getbuf(ODR o, int *len, int *size);
+
+
+
+
+  The integer pointed to by len is set to the length of the encoded
+  data, and a pointer to that data is returned. *size is set to the size
+  of the buffer (unless size is null, signalling that you are not
+  interested in the size). The next call to a primitive function using
+  the same ODR stream will overwrite the data, unless a different buffer
+  has been supplied using the call
+
+
+
+       void odr_setbuf(ODR o, char *buf, int len, int can_grow);
+
+
+
+
+  which sets the encoding (or decoding) buffer used by o to buf, using
+  the length len. Before a call to an encoding function, you can use
+  odr_setbuf() to provide the stream with an encoding buffer of
+  sufficient size (length). The can_grow parameter tells the encoding
+  ODR stream whether it is allowed to use realloc(2) to increase the
+  size of the buffer when necessary. The default condition of a new
+  encoding stream is equivalent to the results of calling
+
+
+
+       odr_setbuf(stream, 0, 0, 1);
+
+
+
+
+  In this case, the stream will allocate and reallocate memory as
+  necessary. The stream reallocates memory by repeatedly doubling the
+  size of the buffer - the result is that the buffer will typically
+  reach its maximum, working size with only a small number of
+  reallocation operations. The memory is freed by the stream when the
+  latter is destroyed, unless it was assigned by the user with the
+  can_grow parameter set to zero (in this case, you are expected to
+  retain control of the memory yourself).
+
+  To assume full control of an encoded buffer, you must first call
+  odr_getbuf() to fetch the buffer and its length. Next, you should call
+  odr_setbuf() to provide a different buffer (or a null pointer) to the
+  stream. In the simplest case, you will reuse the same buffer over and
+  over again, and you will just need to call odr_getbuf() after each
+  encoding operation to get the length and address of the buffer. Note
+  that the stream may reallocate the buffer during an encoding
+  operation, so it is necessary to retrieve the correct address after
+  each encoding operation.
+
+  It is important to realise that the ODR stream will not release this
+  memory when you call odr_reset(): It will merely update its internal
+  pointers to prepare for the encoding of a new data value.  When the
+  stream is released by the odr_destroy() function, the memory given to
+  it by odr_setbuf will be released only if the can_grow parameter to
+  odr_setbuf() was nonzero. The can_grow parameter, in other words, is a
+  way of signalling who is to own the buffer, you or the ODR stream. If
+  you never call odr_setbuf() on your encoding stream, which is
+  typically the case, the buffer allocated by the stream will belong to
+  the stream by default.
+
+  When you wish to decode data, you should first call odr_setbuf(), to
+  tell the decoding stream where to find the encoded data, and how long
+  the buffer is (the can_grow parameter is ignored by a decoding
+  stream). After this, you can call the function corresponding to the
+  data you wish to decode (eg, odr_integer() odr z_APDU()).
+
+  Examples of encoding/decoding functions:
+
+
+
+       int odr_integer(ODR o, int **p, int optional, const char *name);
+
+       int z_APDU(ODR o, Z_APDU **p, int optional, const char *name);
+
+
+
+
+  If the data is absent (or doesn't match the tag corresponding to the
+  type), the return value will be either 0 or 1 depending on the
+  optional flag. If optional is 0 and the data is absent, an error flag
+  will be raised in the stream, and you'll need to call odr_reset()
+  before you can use the stream again. If optional is nonzero, the
+  pointer pointed to by p will be set to the null value, and the
+  function will return 1.  The name argument is used to pretty-print the
+  tag in question.  It may be set to NULL if pretty-printing is not
+  desired.
+
+  If the data value is found where it's expected, the pointer pointed to
+  by the p argument will be set to point to the decoded type. The space
+  for the type will be allocated and owned by the ODR stream, and it
+  will live until you call odr_reset() on the stream. You cannot use
+  free(2) to release the memory. You can decode several data elements
+  (by repeated calls to odr_setbuf() and your decoding function), and
+  new memory will be allocated each time. When you do call odr_reset(),
+  everything decoded since the last call to odr_reset() will be
+  released.
+
+  The use of the double indirection can be a little confusing at first
+  (its purpose will become clear later on, hopefully), so an example is
+  in order. We'll encode an integer value, and immediately decode it
+  again using a different stream. A useless, but informative operation.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  void do_nothing_useful(int value)
+  {
+      ODR encode, decode;
+      int *valp, *resvalp;
+      char *bufferp;
+      int len;
+
+      /* allocate streams */
+      if (!(encode = odr_createmem(ODR_ENCODE)))
+          return;
+      if (!(decode = odr_createmem(ODR_DECODE)))
+          return;
+
+      valp = &value;
+      if (odr_integer(encode, &valp, 0, 0) == 0)
+      {
+          printf("encoding went bad\n");
+          return;
+      }
+      bufferp = odr_getbuf(encode, &len);
+      printf("length of encoded data is %d\n", len);
+
+      /* now let's decode the thing again */
+      odr_setbuf(decode, bufferp, len);
+      if (odr_integer(decode, &resvalp, 0, 0) == 0)
+      {
+          printf("decoding went bad\n");
+          return;
+      }
+      printf("the value is %d\n", *resvalp);
+
+      /* clean up */
+      odr_destroy(encode);
+      odr_destroy(decode);
+  }
+
+
+
+
+  This looks like a lot of work, offhand. In practice, the ODR streams
+  will typically be allocated once, in the beginning of your program (or
+  at the beginning of a new network session), and the encoding and
+  decoding will only take place in a few, isolated places in your
+  program, so the overhead is quite manageable.
+
+
+  5.2.4.  Diagnostics
+
+  The encoding/decoding functions all return 0 when an error occurs.
+  Until you call odr_reset(), you cannot use the stream again, and any
+  function called will immediately return 0.
+
+  To provide information to the programmer or administrator, the
+  function
+
+
+
+       void odr_perror(ODR o, char *message);
+
+
+
+
+  is provided, which prints the message argument to stderr along with an
+  error message from the stream.
+
+
+  You can also use the function
+
+
+
+       int odr_geterror(ODR o);
+
+
+
+
+  to get the current error number from the screen. The number will be
+  one of these constants:
+
+
+     OMEMORY
+        Memory allocation failed.
+
+     OSYSERR
+        A system- or library call has failed. The standard diagnostic
+        variable errno should be examined to determine the actual error.
+
+     OSPACE
+        No more space for encoding. This will only occur when the user
+        has explicitly provided a buffer for an encoding stream without
+        allowing the system to allocate more space.
+
+     OREQUIRED
+        This is a common protocol error; A required data element was
+        missing during encoding or decoding.
+
+     OUNEXPECTED
+        An unexpected data element was found during decoding.
+
+     OOTHER
+        Other error. This is typically an indication of misuse of the
+        ODR system by the programmer, and also that the diagnostic
+        system isn't as good as it should be, yet.
+
+  The character string array
+
+
+
+       char *odr_errlist[]
+
+
+
+
+  can be indexed by the error code to obtain a human-readable
+  representation of the problem.
+
+
+  5.2.5.  Summary and Synopsis
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  #include <odr.h>
+
+  ODR odr_createmem(int direction);
+
+  void odr_destroy(ODR o);
+
+  void odr_reset(ODR o);
+
+  char *odr_getbuf(ODR o, int *len);
+
+  void odr_setbuf(ODR o, char *buf, int len);
+
+  void *odr_malloc(ODR o, int size);
+
+  ODR_MEM odr_extract_mem(ODR o);
+
+  void odr_release_mem(ODR_MEM r);
+
+  int odr_geterror(ODR o);
+
+  void odr_perror(char *message);
+
+  extern char *odr_errlist[];
+
+
+
+
+
+  5.3.  Programming with ODR
+
+  The API of ODR is designed to reflect the structure of ASN.1, rather
+  than BER itself. Future releases may be able to represent data in
+  other external forms.
+
+  The interface is based loosely on that of the Sun Microsystems XDR
+  routines.  Specifically, each function which corresponds to an ASN.1
+  primitive type has a dual function. Depending on the settings of the
+  ODR stream which is supplied as a parameter, the function may be used
+  either to encode or decode data. The functions that can be built using
+  these primitive functions, to represent more complex datatypes, share
+  this quality. The result is that you only have to enter the definition
+  for a type once - and you have the functionality of encoding, decoding
+  (and pretty-printing) all in one unit. The resulting C source code is
+  quite compact, and is a pretty straightforward representation of the
+  source ASN.1 specification. Although no ASN.1 compiler is supplied
+  with ODR at this time, it shouldn't be too difficult to write one, or
+  perhaps even to adapt an existing compiler to output ODR routines (not
+  surprisingly, writing encoders/decoders using ODR turns out to be
+  boring work).
+
+  In many cases, the model of the XDR functions works quite well in this
+  role. In others, it is less elegant. Most of the hassle comes from the
+  optional SEQUENCE memebers which don't exist in XDR.
+
+
+  5.3.1.  The Primitive ASN.1 Types
+
+  ASN.1 defines a number of primitive types (many of which correspond
+  roughly to primitive types in structured programming languages, such
+  as C).
+
+
+  5.3.1.1.  INTEGER
+
+  The ODR function for encoding or decoding (or printing) the ASN.1
+  INTEGER type looks like this:
+       int odr_integer(ODR o, int **p, int optional, const char *name);
+
+
+
+
+  (we don't allow values that can't be contained in a C integer.)
+
+  This form is typical of the primitive ODR functions. They are named
+  after the type of data that they encode or decode. They take an ODR
+  stream, an indirect reference to the type in question, and an optional
+  flag (corresponding to the OPTIONAL keyword of ASN.1) as parameters.
+  They all return an integer value of either one or zero.  When you use
+  the primitive functions to construct encoders for complex types of
+  your own, you should follow this model as well. This ensures that your
+  new types can be reused as elements in yet more complex types.
+
+  The o parameter should obviously refer to a properly initialized ODR
+  stream of the right type (encoding/decoding/printing) for the
+  operation that you wish to perform.
+
+  When encoding or printing, the function first looks at *p. If *p (the
+  pointer pointed to by p) is a null pointer, this is taken to mean that
+  the data element is absent. If the optional parameter is nonzero, the
+  function will return one (signifying success) without any further
+  processing. If the optional is zero, an internal error flag is set in
+  the ODR stream, and the function will return 0. No further operations
+  can be carried out on the stream without a call to the function
+  odr_reset().
+
+  If *p is not a null pointer, it is expected to point to an instance of
+  the data type. The data will be subjected to the encoding rules, and
+  the result will be placed in the buffer held by the ODR stream.
+
+  The other ASN.1 primitives have similar functions that operate in
+  similar manners:
+
+
+  5.3.1.2.  BOOLEAN
+
+
+
+       int odr_bool(ODR o, bool_t **p, int optional, const char *name);
+
+
+
+
+
+  5.3.1.3.  REAL
+
+  Not defined.
+
+
+  5.3.1.4.  NULL
+
+
+
+       int odr_null(ODR o, bool_t **p, int optional, const char *name);
+
+
+
+
+  In this case, the value of **p is not important. If *p is different
+  from the null pointer, the null value is present, otherwise it's
+  absent.
+
+
+  5.3.1.5.  OCTET STRING
+
+
+
+       typedef struct odr_oct
+       {
+           unsigned char *buf;
+           int len;
+           int size;
+       } Odr_oct;
+
+       int odr_octetstring(ODR o, Odr_oct **p, int optional, const char *name);
+
+
+
+
+  The buf field should point to the character array that holds the
+  octetstring. The len field holds the actual length, while the size
+  field gives the size of the allocated array (not of interest to you,
+  in most cases). The character array need not be null terminated.
+
+  To make things a little easier, an alternative is given for string
+  types that are not expected to contain embedded NULL characters (eg.
+  VisibleString):
+
+
+
+       int odr_cstring(ODR o, char **p, int optional, const char *name);
+
+
+
+
+  Which encoded or decodes between OCTETSTRING representations and null-
+  terminates C strings.
+
+  Functions are provided for the derived string types, eg:
+
+
+
+       int odr_visiblestring(ODR o, char **p, int optional, const char *name);
+
+
+
+
+
+  5.3.1.6.  BIT STRING
+
+
+
+       int odr_bitstring(ODR o, Odr_bitmask **p, int optional, const char *name);
+
+
+
+
+  The opaque type Odr_bitmask is only suitable for holding relatively
+  brief bit strings, eg. for options fields, etc. The constant
+  ODR_BITMASK_SIZE multiplied by 8 gives the maximum possible number of
+  bits.
+
+  A set of macros are provided for manipulating the Odr_bitmask type:
+
+
+
+
+
+
+  void ODR_MASK_ZERO(Odr_bitmask *b);
+
+  void ODR_MASK_SET(Odr_bitmask *b, int bitno);
+
+  void ODR_MASK_CLEAR(Odr_bitmask *b, int bitno);
+
+  int ODR_MASK_GET(Odr_bitmask *b, int bitno);
+
+
+
+
+  The functions are modelled after the manipulation functions that
+  accompany the fd_set type used by the select(2) call.  ODR_MASK_ZERO
+  should always be called first on a new bitmask, to initialize the bits
+  to zero.
+
+
+  5.3.1.7.  OBJECT IDENTIFIER
+
+
+
+       int odr_oid(ODR o, Odr_oid **p, int optional, const char *name);
+
+
+
+
+  The C OID represenation is simply an array of integers, terminated by
+  the value -1 (the Odr_oid type is synonymous with the int type). We
+  suggest that you use the OID database module (see section ``Object
+  Identifiers'') to handle object identifiers in your application.
+
+
+  5.3.2.  Tagging Primitive Types
+
+  The simplest way of tagging a type is to use the odr_implicit_tag() or
+  odr_explicit_tag() macros:
+
+
+
+       int odr_implicit_tag(ODR o, Odr_fun fun, int class, int tag, int
+                            optional, const char *name);
+
+       int odr_explicit_tag(ODR o, Odr_fun fun, int class, int tag,
+                            int optional, const char *name);
+
+
+
+
+  To create a type derived from the integer type by implicit tagging,
+  you might write:
+
+
+
+       MyInt ::= [210] IMPLICIT INTEGER
+
+
+
+
+  In the ODR system, this would be written like:
+
+
+
+
+
+
+
+  int myInt(ODR o, int **p, int optional, const char *name)
+  {
+      return odr_implicit_tag(o, odr_integer, p,
+                     ODR_CONTEXT, 210, optional, name);
+  }
+
+
+
+
+  The function myInt() can then be used like any of the primitive
+  functions provided by ODR. Note that the behavior of odr_explicit()
+  and odr_implicit() macros act exactly the same as the functions they
+  are applied to - they respond to error conditions, etc, in the same
+  manner - they simply have three extra parameters. The class parameter
+  may take one of the values: ODR_CONTEXT, ODR_PRIVATE, ODR_UNIVERSAL,
+  or ODR_APPLICATION.
+
+
+  5.3.3.  Constructed Types
+
+  Constructed types are created by combining primitive types. The ODR
+  system only implements the SEQUENCE and SEQUENCE OF constructions
+  (although adding the rest of the container types should be simple
+  enough, if the need arises).
+
+  For implementing SEQUENCEs, the functions
+
+
+
+       int odr_sequence_begin(ODR o, void *p, int size, const char *name);
+       int odr_sequence_end(ODR o);
+
+
+
+
+  are provided.
+
+  The odr_sequence_begin() function should be called in the beginning of
+  a function that implements a SEQUENCE type. Its parameters are the ODR
+  stream, a pointer (to a pointer to the type you're implementing), and
+  the size of the type (typically a C structure). On encoding, it
+  returns 1 if *p is a null pointer. The size parameter is ignored. On
+  decoding, it returns 1 if the type is found in the data stream.  size
+  bytes of memory are allocated, and *p is set to point to this space.
+  odr_sequence_end() is called at the end of the complex function.
+  Assume that a type is defined like this:
+
+
+
+       MySequence ::= SEQUENCE {
+           intval INTEGER,
+           boolval BOOLEAN OPTIONAL }
+
+
+
+
+  The corresponding ODR encoder/decoder function and the associated data
+  structures could be written like this:
+
+
+
+
+
+
+
+
+  typedef struct MySequence
+  {
+      int *intval;
+      bool_t *boolval;
+  } MySequence;
+
+  int mySequence(ODR o, MySequence **p, int optional, const char *name)
+  {
+      if (odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+          return optional && odr_ok(o);
+      return
+          odr_integer(o, &(*p)->intval, 0, "intval") &&
+          odr_bool(o, &(*p)->boolval, 1, "boolval") &&
+          odr_sequence_end(o);
+  }
+
+
+
+
+  Note the 1 in the call to odr_bool(), to mark that the sequence member
+  is optional. If either of the member types had been tagged, the macros
+  odr_implicit() or odr_explicit() could have been used.  The new
+  function can be used exactly like the standard functions provided with
+  ODR. It will encode, decode or pretty-print a data value of the
+  MySequence type. We like to name types with an initial capital, as
+  done in ASN.1 definitions, and to name the corresponding function with
+  the first character of the name in lower case. You could, of course,
+  name your structures, types, and functions any way you please - as
+  long as you're consistent, and your code is easily readable.  odr_ok
+  is just that - a predicate that returns the state of the stream. It is
+  used to ensure that the behaviour of the new type is compatible with
+  the interface of the primitive types.
+
+
+  5.3.4.  Tagging Constructed Types
+
+  NOTE: See section ``Tagging Primitive types'' for information on how
+  to tag the primitive types, as well as types that are already defined.
+
+
+  5.3.4.1.  Implicit Tagging
+
+  Assume the type above had been defined as
+
+
+
+       MySequence ::= [10] IMPLICIT SEQUENCE {
+           intval INTEGER,
+           boolval BOOLEAN OPTIONAL }
+
+
+
+
+  You would implement this in ODR by calling the function
+
+
+
+       int odr_implicit_settag(ODR o, int class, int tag);
+
+
+
+
+  which overrides the tag of the type immediately following it. The
+  macro odr_implicit() works by calling odr_implicit_settag()
+  immediately before calling the function pointer argument. Your type
+  function could look like this:
+       int mySequence(ODR o, MySequence **p, int optional, const char *name)
+       {
+           if (odr_implicit_settag(o, ODR_CONTEXT, 10) == 0 ||
+               odr_sequence_begin(o, p, sizeof(**p), name) == 0)
+               return optional && odr_ok(o);
+           return
+               odr_integer(o, &(*p)->intval, 0, "intval") &&
+               odr_bool(o, &(*p)->boolval, 1, "boolval") &&
+               odr_sequence_end(o);
+       }
+
+
+
+
+  The definition of the structure MySequence would be the same.
+
+
+  5.3.4.2.  Explicit Tagging
+
+  Explicit tagging of constructed types is a little more complicated,
+  since you are in effect adding a level of construction to the data.
+
+  Assume the definition:
+
+
+
+       MySequence ::= [10] IMPLICIT SEQUENCE {
+           intval INTEGER,
+           boolval BOOLEAN OPTIONAL }
+
+
+
+
+  Since the new type has an extra level of construction, two new
+  functions are needed to encapsulate the base type:
+
+
+
+       int odr_constructed_begin(ODR o, void *p, int class, int tag,
+              const char *name);
+
+       int odr_constructed_end(ODR o);
+
+
+
+
+  Assume that the IMPLICIT in the type definition above were replaced
+  with EXPLICIT (or that the IMPLICIT keyword were simply deleted, which
+  would be equivalent). The structure definition would look the same,
+  but the function would look like this:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  int mySequence(ODR o, MySequence **p, int optional, const char *name)
+  {
+      if (odr_constructed_begin(o, p, ODR_CONTEXT, 10, name) == 0)
+          return optional && odr_ok(o);
+      if (o->direction == ODR_DECODE)
+          *p = odr_malloc(o, sizeof(**p));
+      if (odr_sequence_begin(o, p, sizeof(**p), 0) == 0)
+      {
+          *p = 0; /* this is almost certainly a protocol error */
+          return 0;
+      }
+      return
+          odr_integer(o, &(*p)->intval, 0, "intval") &&
+          odr_bool(o, &(*p)->boolval, 1, "boolval") &&
+          odr_sequence_end(o) &&
+          odr_constructed_end(o);
+  }
+
+
+
+
+  Notice that the interface here gets kind of nasty. The reason is
+  simple: Explicitly tagged, constructed types are fairly rare in the
+  protocols that we care about, so the aesthetic annoyance (not to
+  mention the dangers of a cluttered interface) is less than the time
+  that would be required to develop a better interface. Nevertheless, it
+  is far from satisfying, and it's a point that will be worked on in the
+  future. One option for you would be to simply apply the odr_explicit()
+  macro to the first function, and not have to worry about
+  odr_constructed_* yourself. Incidentally, as you might have guessed,
+  the odr_sequence_ functions are themselves implemented using the
+  odr_constructed_ functions.
+
+
+  5.3.5.  SEQUENCE OF
+
+  To handle sequences (arrays) of a apecific type, the function
+
+
+
+       int odr_sequence_of(ODR o, int (*fun)(ODR o, void *p, int optional),
+                               void *p, int *num, const char *name);
+
+
+
+
+  The fun parameter is a pointer to the decoder/encoder function of the
+  type. p is a pointer to an array of pointers to your type. num is the
+  number of elements in the array.
+
+  Assume a type
+
+
+
+       MyArray ::= SEQUENCE OF INTEGER
+
+
+
+
+  The C representation might be
+
+
+
+
+
+
+  typedef struct MyArray
+  {
+      int num_elements;
+      int **elements;
+  } MyArray;
+
+
+
+
+  And the function might look like
+
+
+
+       int myArray(ODR o, MyArray **p, int optional, const char *name)
+       {
+           if (o->direction == ODR_DECODE)
+               *p = odr_malloc(o, sizeof(**p));
+           if (odr_sequence_of(o, odr_integer, &(*p)->elements,
+               &(*p)->num_elements, name))
+               return 1;
+           *p = 0;
+           return optional && odr_ok(o);
+       }
+
+
+
+
+
+  5.3.6.  CHOICE Types
+
+  The choice type is used fairly often in some ASN.1 definitions, so
+  some work has gone into streamlining its interface.
+
+  CHOICE types are handled by the function:
+
+
+
+       int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
+                      const char *name);
+
+
+
+
+  The arm array is used to describe each of the possible types that the
+  CHOICE type may assume. Internally in your application, the CHOICE
+  type is represented as a discriminated union. That is, a C union
+  accompanied by an integer (or enum) identifying the active 'arm' of
+  the union. whichp is a pointer to the union discriminator. When
+  encoding, it is examined to determine the current type. When decoding,
+  it is set to reference the type that was found in the input stream.
+
+  The Odr_arm type is defined thus:
+
+
+
+       typedef struct odr_arm
+       {
+           int tagmode;
+           int class;
+           int tag;
+           int which;
+           Odr_fun fun;
+           char *name;
+       } Odr_arm;
+
+
+  The interpretation of the fields are:
+
+
+     tagmode
+        Either ODR_IMPLICIT, ODR_EXPLICIT, or ODR_NONE (-1) to mark no
+        tagging.
+
+     class, tag
+        The class and tag of the type (-1 if no tagging is used).
+
+     which
+        The value of the discriminator that corresponds to this CHOICE
+        element. Typically, it will be a #defined constant, or an enum
+        member.
+
+     fun
+        A pointer to a function that implements the type of the CHOICE
+        member. It may be either a standard ODR type or a type defined
+        by yourself.
+
+     name
+        Name of tag.
+
+  A handy way to prepare the array for use by the odr_choice() function
+  is to define it as a static, initialized array in the beginning of
+  your decoding/encoding function. Assume the type definition:
+
+
+
+       MyChoice ::= CHOICE {
+           untagged INTEGER,
+           tagged   [99] IMPLICIT INTEGER,
+           other    BOOLEAN
+       }
+
+
+
+
+  Your C type might look like
+
+
+
+       typedef struct MyChoice
+       {
+           enum
+           {
+               MyChoice_untagged,
+               MyChoice_tagged,
+               MyChoice_other
+           } which;
+           union
+           {
+               int *untagged;
+               int *tagged;
+               bool_t *other;
+           } u;
+       };
+
+
+
+
+  And your function could look like this:
+
+
+
+
+  int myChoice(ODR o, MyChoice **p, int optional, const char *name)
+  {
+      static Odr_arm arm[] =
+      {
+          {-1, -1, -1, MyChoice_untagged, odr_integer, "untagged"},
+          {ODR_IMPLICIT, ODR_CONTEXT, 99, MyChoice_tagged, odr_integer,
+                                                              "tagged"},
+          {-1, -1, -1, MyChoice_other, odr_boolean, "other"},
+          {-1, -1, -1, -1, 0}
+      };
+
+      if (o->direction == ODR_DECODE)
+          *p = odr_malloc(o, sizeof(**p);
+      else if (!*p)
+          return optional && odr_ok(o);
+
+      if (odr_choice(o, arm, &(*p)->u, &(*p)->which), name)
+          return 1;
+      *p = 0;
+      return optional && odr_ok(o);
+  }
+
+
+
+
+  In some cases (say, a non-optional choice which is a member of a
+  sequence), you can "embed" the union and its discriminator in the
+  structure belonging to the enclosing type, and you won't need to
+  fiddle with memory allocation to create a separate structure to wrap
+  the discriminator and union.
+
+  The corresponding function is somewhat nicer in the Sun XDR interface.
+  Most of the complexity of this interface comes from the possibility of
+  declaring sequence elements (including CHOICEs) optional.
+
+  The ASN.1 specifictions naturally requires that each member of a
+  CHOICE have a distinct tag, so they can be told apart on decoding.
+  Sometimes it can be useful to define a CHOICE that has multiple types
+  that share the same tag. You'll need some other mechanism, perhaps
+  keyed to the context of the CHOICE type. In effect, we would like to
+  introduce a level of context-sensitiveness to our ASN.1 specification.
+  When encoding an internal representation, we have no problem, as long
+  as each CHOICE member has a distinct discriminator value. For
+  decoding, we need a way to tell the choice function to look for a
+  specific arm of the table. The function
+
+
+
+       void odr_choice_bias(ODR o, int what);
+
+
+
+
+  provides this functionality. When called, it leaves a notice for the
+  next call to odr_choice() to be called on the decoding stream o that
+  only the arm entry with a which field equal to what should be tried.
+
+  The most important application (perhaps the only one, really) is in
+  the definition of application-specific EXTERNAL encoders/decoders
+  which will automatically decode an ANY member given the direct or
+  indirect reference.
+
+
+
+
+
+  5.4.  Debugging
+
+  The protocol modules are suffering somewhat from a lack of diagnostic
+  tools at the moment. Specifically ways to pretty-print PDUs that
+  aren't recognized by the system. We'll include something to this end
+  in a not-too-distant release. In the meantime, what we do when we get
+  packages we don't understand is to compile the ODR module with
+  ODR_DEBUG defined. This causes the module to dump tracing information
+  as it processes data units. With this output and the protocol
+  specification (Z39.50), it is generally fairly easy to see what goes
+  wrong.
+
+
+  6.  The COMSTACK Module
+
+  6.1.  Introduction
+
+  The COMSTACK subsystem provides a transparent interface to different
+  types of transport stacks for the exchange of BER-encoded data. At
+  present, the RFC1729 method (BER over TCP/IP), and Peter Furniss'
+  XTImOSI stack are supported, but others may be added in time. The
+  philosophy of the module is to provide a simple interface by hiding
+  unused options and facilities of the underlying libraries. This is
+  always done at the risk of losing generality, and it may prove that
+  the interface will need extension later on.
+
+  The interface is implemented in such a fashion that only the sub-
+  layers constructed to the transport methods that you wish to use in
+  your application are linked in.
+
+  You will note that even though simplicity was a goal in the design,
+  the interface is still orders of magnitudes more complex than the
+  transport systems found in many other packages. One reason is that the
+  interface needs to support the somewhat different requirements of the
+  different lower-layer communications stacks; another important reason
+  is that the interface seeks to provide a more or less industrial-
+  strength approach to asynchronous event-handling. When no function is
+  allowed to block, things get more complex - particularly on the server
+  side. We urge you to have a look at the demonstration client and
+  server provided with the package. They are meant to be easily readable
+  and instructive, while still being at least moderately useful.
+
+
+  6.2.  Common Functions
+
+  6.2.1.  Managing Endpoints
+
+
+
+       COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+
+
+
+
+  Creates an instance of the protocol stack - a communications endpoint.
+  The type parameter determines the mode of communication. At present,
+  the values tcpip_type and mosi_type are recognized. The function
+  returns a null-pointer if a system error occurs. The blocking
+  parameter should be one if you wish the association to operate in
+  blocking mode, zero otherwise. The protocol field should be one of
+  PROTO_SR or PROTO_Z3950.
+
+
+
+       int cs_close(COMSTACK handle);
+
+  Closes the connection (as elegantly as the lower layers will permit),
+  and releases the resouces pointed to by the handle parameter. The
+  handle should not be referenced again after this call.
+
+  NOTE: We really need a soft disconnect, don't we?
+
+
+  6.2.2.  Data Exchange
+
+
+
+       int cs_put(COMSTACK handle, char *buf, int len);
+
+
+
+
+  Sends buf down the wire. In blocking mode, this function will return
+  only when a full buffer has been written, or an error has occurred. In
+  nonblocking mode, it's possible that the function will be unable to
+  send the full buffer at once, which will be indicated by a return
+  value of 1. The function will keep track of the number of octets
+  already written; you should call it repeatedly with the same values of
+  buf and len, until the buffer has been transmitted. When a full buffer
+  has been sent, the function will return 0 for success. -1 indicates an
+  error condition (see below).
+
+
+
+       int cs_get(COMSTACK handle, char **buf, int *size);
+
+
+
+
+  Receives a PDU from the peer. Returns the number of bytes read. In
+  nonblocking mode, it is possible that not all of the packet can be
+  read at once. In this case, the function returns 1. To simplify the
+  interface, the function is responsible for managing the size of the
+  buffer. It will be reallocated if necessary to contain large packages,
+  and will sometimes be moved around internally by the subsystem when
+  partial packages are read. Before calling cs_get for the fist time,
+  the buffer can be initialized to the null pointer, and the length
+  should also be set to 0 - cs_get will perform a malloc(2) on the
+  buffer for you. When a full buffer has been read, the size of the
+  package is returned (which will always be greater than 1). -1
+  indicates an error condition.
+
+  See also the cs_more() function below.
+
+
+
+       int cs_more(COMSTACK handle);
+
+
+
+
+  The cs_more() function should be used in conjunction with cs_get and
+  select(2).  The cs_get() function will sometimes (notably in the
+  TCP/IP mode) read more than a single protocol package off the network.
+  When this happens, the extra package is stored by the subsystem. After
+  calling cs_get(), and before waiting for more input, You should always
+  call cs_more() to check if there's a full protocol package already
+  read. If cs_more() returns 1, cs_get() can be used to immediately
+  fetch the new package. For the mOSI subsystem, the function should
+  always return 0, but if you want your stuff to be protocol
+  independent, you should use it.
+
+  NOTE: The cs_more() function is required because the RFC1729-method
+  does not provide a way of separating individual PDUs, short of
+  partially decoding the BER. Some other implementations will carefully
+  nibble at the packet by calling read(2) several times. This was felt
+  to be too inefficient (or at least clumsy) - hence the call for this
+  extra function.
+
+
+
+       int cs_look(COMSTACK handle);
+
+
+
+
+  This function is useful when you're operating in nonblocking mode.
+  Call it when select(2) tells you there's something happening on the
+  line. It returns one of the following values:
+
+
+     CS_NONE
+        No event is pending. The data found on the line was not a
+        complete package.
+
+     CS_CONNECT
+        A response to your connect request has been received. Call
+        cs_rcvconnect to process the event and to finalize the
+        connection establishment.
+
+     CS_DISCON
+        The other side has closed the connection (or maybe sent a
+        disconnect request - but do we care? Maybe later). Call cs_close
+        To close your end of the association as well.
+
+     CS_LISTEN
+        A connect request has been received. Call cs_listen to process
+        the event.
+
+     CS_DATA
+        There's data to be found on the line. Call cs_get to get it.
+
+  NOTE: You should be aware that even if cs_look() tells you that
+  there's an event event pending, the corresponding function may still
+  return and tell you there was nothing to be found.  This means that
+  only part of a package was available for reading. The same event will
+  show up again, when more data has arrived.
+
+
+
+       int cs_fileno(COMSTACK h);
+
+
+
+
+  Returns the file descriptor of the association. Use this when file-
+  level operations on the endpoint are required (select(2) operations,
+  specifically).
+
+
+  6.3.  Client Side
+
+
+
+       int cs_connect(COMSTACK handle, void *address);
+
+
+
+  Initiate a connection with the target at address (more on addresses
+  below). The function will return 0 on success, and 1 if the operation
+  does not complete immediately (this will only happen on a nonblocking
+  endpoint). In this case, use cs_rcvconnect to complete the operation,
+  when select(2) reports input pending on the association.
+
+
+
+       int cs_rcvconnect(COMSTACK handle);
+
+
+
+
+  Complete a connect operation initiated by cs_connect(). It will return
+  0 on success; 1 if the operation has not yet completed (in this case,
+  call the function again later); -1 if an error has occured.
+
+
+  6.4.  Server Side
+
+  To establish a server under the inetd server, you can use
+
+
+
+       COMSTACK cs_createbysocket(int socket, CS_TYPE type, int blocking,
+                                     int protocol);
+
+
+
+
+  The socket parameter is an established socket (when your application
+  is invoked from inetd, the socket will typically be 0. The following
+  parameters are identical to the ones for cs_create.
+
+
+
+       int cs_bind(COMSTACK handle, void *address, int mode)
+
+
+
+
+  Binds a local address to the endpoint. Read about addresses below. The
+  mode parameter should be either CS_CLIENT or CS_SERVER.
+
+
+
+       int cs_listen(COMSTACK handle, char *addr, int *addrlen);
+
+
+
+
+  Call this to process incoming events on an endpoint that has been
+  bound in listening mode. It will return 0 to indicate that the connect
+  request has been received, 1 to signal a partial reception, and -1 to
+  indicate an error condition.
+
+
+
+       COMSTACK cs_accept(COMSTACK handle);
+
+
+
+
+  This finalises the server-side association establishment, after
+  cs_listen has completed successfully. It returns a new connection
+  endpoint, which represents the new association. The application will
+  typically wish to fork off a process to handle the association at this
+  point, and continue listen for new connections on the old handle.
+
+  You can use the call
+
+
+
+       char *cs_addrstr(COMSTACK);
+
+
+
+
+  on an established connection to retrieve the hostname of the remote
+  host.
+
+  NOTE: You may need to use this function with some care if your name
+  server service is slow or unreliable
+
+
+  6.5.  Addresses
+
+  The low-level format of the addresses are different depending on the
+  mode of communication you have chosen. A function is provided by each
+  of the lower layers to map a user-friendly string-form address to the
+  binary form required by the lower layers.
+
+
+
+       struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+       struct netbuf *mosi_strtoaddr(char *str);
+
+
+
+
+  The format for TCP/IP addresses is straightforward:
+
+
+
+       <host> [ ':' <portnum> ]
+
+
+
+
+  The hostname can be either a domain name or an IP address. The port
+  number, if omitted, defaults to 210.
+
+  For OSI, the format is
+
+
+
+       [ <t-selector> '/' ] <host> [ ':' <port> ]
+
+
+
+
+  The transport selector is given as an even number of hex digits.
+
+  You'll note that the address format for the OSI mode are just a subset
+  of full presentation addresses. We use presentation addresses because
+  xtimosi doesn't, in itself, allow access to the X.500 Directory
+  service. We use a limited form, because we haven't yet come across an
+  implementation that used more of the elements of a full p-address. It
+  is a fairly simple matter to add the rest of the elements to the
+  address format as needed, however: Xtimosi does support the full P-
+  address structure.
+  In both transport modes, the special hostname "@" is mapped to any
+  local address (the manifest constant INADDR_ANY). It is used to
+  establish local listening endpoints in the server role.
+
+  When a connection has been established, you can use
+
+
+
+       char cs_addrstr(COMSTACK h);
+
+
+
+
+  to retrieve the host name of the peer system. The function returns a
+  pointer to a static area, which is overwritten on the next call to the
+  function.
+
+  NOTE: We have left the issue of X.500 name-to-address mapping open,
+  for the moment. It would be a simple matter to provide a table-based
+  mapping, if desired. Alternately, we could use the X.500 client-
+  function that is provided with the ISODE (although this would defeat
+  some of the purpose of using ThinOSI in the first place. We have been
+  told that it should be within the realm of the possible to implement a
+  lightweight implementation of the necessary X.500 client capabilities
+  on top of ThinOSI. This would be the ideal solution, we feel. On the
+  other hand, it still remains to be seen just what role the Directory
+  will play in a world populated by ThinOSI and other pragmatic
+  solutions.
+
+
+  6.6.  Diagnostics
+
+  All functions return -1 if an error occurs. Typically, the functions
+  will return 0 on success, but the data exchange functions (cs_get,
+  cs_put, cs_more) follow special rules. Consult their descriptions.
+
+  When a function (including the data exchange functions) reports an
+  error condition, use the function cs_errno() to determine the cause of
+  the problem. The function
+
+
+
+       void cs_perror(COMSTACK handle char *message);
+
+
+
+
+  works like perror(2) and prints the message argument, along with a
+  system message, to stderr.  Use the character array
+
+
+
+       extern const char *cs_errlist[];
+
+
+
+
+  to get hold of the message, if you want to process it differently.
+  The function
+
+
+
+       const char *cs_stackerr(COMSTACK handle);
+
+
+
+  Returns an error message from the lower layer, if one has been
+  provided.
+
+
+  6.7.  Enabling OSI Communication
+
+  6.7.1.  Installing Xtimosi
+
+  Although you will have to download Peter Furniss' XTI/mOSI
+  implementation for yourself, we've tried to make the integration as
+  simple as possible.
+
+  The latest version of xtimosi will generally be under
+
+
+
+       ftp://pluto.ulcc.ac.uk/ulcc/thinosi/xtimosi/
+
+
+
+
+  When you have downloaded and unpacked the archive, it will (we assume)
+  have created a directory called xtimosi. We suggest that you place
+  this directory in the same directory where you unpacked the YAZ
+  distribution. This way, you shouldn't have to fiddle with the
+  makefiles of YAZ beyond uncommenting a few lines.
+
+  Go to xtimosi/src, and type "make libmosi.a".  This should generally
+  create the library, ready to use.
+
+  CAVEAT
+
+  The currently available release of xtimosi has some inherent problems
+  that make it disfunction on certain platforms - eg. the Digital OSF/1
+  workstations. It is supposedly primarily a compiler problem, and we
+  hope to see a release that is generally portable. While we can't
+  guarantee that it can be brought to work on your platform, we'll be
+  happy to talk to you about problems that you might see, and relay
+  information to the author of the software. There are some signs that
+  the gcc compiler is more likely to produce a fully functional library,
+  but this hasn't been verified (we think that the problem is limited to
+  the use of hexadecimal escape-codes used in strings, which are
+  silently ignored by some compilers).
+
+  A problem has been encountered in the communication with ISODE-based
+  applications. If the ISODE presentation-user calls PReadRequest() with
+  a timeout value different from OK or NOTOK, he will get an immediate
+  TIMEOUT abort when receiving large (>2041 bytes, which is the SPDU-
+  size that the ISODE likes to work with) packages from an xtimosi-based
+  implementation (probably most other implementations as well, in fact).
+  It seems to be a flaw in the ISODE API, and the workaround (for ISODE
+  users) is to either not use an explicit timeout (switching to either
+  blocking or nonblocking mode), or to check that the timer really has
+  expired before closing the connection.
+
+  The next step in the installation is to modify the makefile in the
+  toplevel YAZ directory. The place to change is in the top of the file,
+  and is clearly marked with a comment.
+
+  Now run make in the YAZ toplevel directory (do a "make clean" first,
+  if the system has been previously made without OSI support). Use the
+  YAZ ztest and client demo programs to verify that OSI communication
+  works OK. Then, you can go ahead and try to talk to other
+  implementations.
+
+
+  NOTE: Our interoperability experience is limited to version 7 of the
+  Nordic SR-Nett package, which has had several protocol errors fixed
+  from the earlier releases. If you have problems or successes in
+  interoperating with other implementations, we'd be glad to hear about
+  it, or to help you make things work, as our resources allow.
+
+  If you write your own applications based on YAZ, and you wish to
+  include OSI support, the procedure is equally simple. You should
+  include the xmosi.h header file in addition to comstack.h.  xmosi.h
+  will define the manifest constant mosi_type, which you should pass to
+  the cs_create() function. In addition, you should use the function
+  mosi_strtoaddr() rather than tcpip_strtoaddr() when you need to
+  prepare an address.
+
+  When you link your application, you should include (after the libyaz.a
+  library) the libmosi.a library, and the librfc.a library provided with
+  YAZ (for OSI transport).
+
+  As always, it can be very useful, if not essential, to have a look at
+  the example applications to see how things are done.
+
+
+  6.7.2.  OSI Transport
+
+  Xtimosi requires an implementation of the OSI transport service under
+  the X/OPEN XTI API. We provide an implementation of the RFC1006
+  encapsulation of OSI/TP0 in TCP/IP (through the Berkeley Sockets API),
+  as an independent part of YAZ (it's found under the rfc1006
+  directory). If you have access to an OSI transport provider under XTI,
+  you should be able to make that work too, although it may require
+  tinkering with the mosi_strtoaddr() function.
+
+
+  6.7.3.  Presentation Context Management
+
+  To simplify the implementation, we use Peter Furniss' alternative
+  (PRF) option format for the Control of the presentation negotiation
+  phase. This format is enabled by default when you compile xtimosi.
+
+  The current version of YAZ does not support presentation-layer
+  negotiation of response record formats. The primary reason is that we
+  have had access to no other SR or Z39.50 implementations over OSI that
+  used this method. Secondarily, we believe that the EXPLAIN facility is
+  a superior mechanism for relaying target capabilities in this respect.
+  This is not to say that we have no intentions of supporting
+  presentation context negotiation - we have just hitherto given it a
+  lower priority than other aspects of the protocol.
+
+  One thing is certain: The addition of this capability to YAZ should
+  have only a minimal impact on existing applications, and on the
+  interface to the software in general. Most likely, we will add an
+  extra layer of interface to the processing of EXPLAIN records, which
+  will convert back and forth between oident records (see section
+  ``Object Identifiers'') and direct or indirect references, given the
+  current association setup. Implementations based on any of the higher-
+  level interfaces will most likely not have to be changed at all.
+
+
+  6.8.  Summary and Synopsis
+
+
+
+
+
+
+
+  #include <comstack.h>
+
+  #include <tcpip.h>      /* this is for TCP/IP support   */
+  #include <xmosi.h>      /* and this is for mOSI support */
+
+  COMSTACK cs_create(CS_TYPE type, int blocking, int protocol);
+
+  COMSTACK cs_createbysocket(int s, CS_TYPE type, int blocking,
+                                int protocol);
+
+  int cs_bind(COMSTACK handle, int mode);
+
+  int cs_connect(COMSTACK handle, void *address);
+
+  int cs_rcvconnect(COMSTACK handle);
+
+  int cs_listen(COMSTACK handle);
+
+  COMSTACK cs_accept(COMSTACK handle);
+
+  int cs_put(COMSTACK handle, char *buf, int len);
+
+  int cs_get(COMSTACK handle, char **buf, int *size);
+
+  int cs_more(COMSTACK handle);
+
+  int cs_close(COMSTACK handle);
+
+  int cs_look(COMSTACK handle);
+
+  struct sockaddr_in *tcpip_strtoaddr(char *str);
+
+  struct netbuf *mosi_strtoaddr(char *str);
+
+  extern int cs_errno;
+
+  void cs_perror(COMSTACK handle char *message);
+
+  const char *cs_stackerr(COMSTACK handle);
+
+  extern const char *cs_errlist[];
+
+
+
+
+
+  7.  Making an IR Interface for Your Database with YAZ
+
+  7.1.  Introduction
+
+  NOTE: If you aren't into documentation, a good way to learn how the
+  backend interface works is to look at the backend.h file. Then, look
+  at the small dummy-server in server/ztest.c. Finally, you can have a
+  look at the seshigh.c file, which is where most of the logic of the
+  frontend server is located. The backend.h file also makes a good
+  reference, once you've chewed your way through the prose of this file.
+
+  If you have a database system that you would like to make available by
+  means of Z39.50/SR, YAZ basically offers your two options. You can use
+  the APIs provided by the ASN, ODR, and COMSTACK modules to create and
+  decode PDUs, and exchange them with a client. Using this low-level
+  interface gives you access to all fields and options of the protocol,
+  and you can construct your server as close to your existing database
+  as you like. It is also a fairly involved process, requiring you to
+  set up an event-handling mechanism, protocol state machine, etc. To
+  simplify server implementation, we have implemented a compact and
+  simple, but reasonably full-functioned server-frontend that will
+  handle most of the protocol mechanics, while leaving you to
+  concentrate on your database interface.
+
+  NOTE: The backend interface was designed in anticipation of a specific
+  integration task, while still attempting to achieve some degree of
+  generality. We realise fully that there are points where the interface
+  can be improved significantly. If you have specific functions or
+  parameters that you think could be useful, send us a mail (or better,
+  sign on to the mailing list referred to in the toplevel README file).
+  We will try to fit good suggestions into future releases, to the
+  extent that it can be done without requiring too many structural
+  changes in existing applications.
+
+
+  7.2.  The Database Frontend
+
+  We refer to this software as a generic database frontend. Your
+  database system is the backend database, and the interface between the
+  two is called the backend API. The backend API consists of a small
+  number of function prototypes and structure definitions. You are
+  required to provide the main() routine for the server (which can be
+  quite simple), as well as functions to match each of the prototypes.
+  The interface functions that you write can use any mechanism you like
+  to communicate with your database system: You might link the whole
+  thing together with your database application and access it by
+  function calls; you might use IPC to talk to a database server
+  somewhere; or you might link with third-party software that handles
+  the communication for you (like a commercial database client library).
+  At any rate, the functions will perform the tasks of:
+
+
+  o  Initialization.
+
+  o  Searching.
+
+  o  Fetching records.
+
+  o  Scanning the database index (if you wish to implement SCAN).
+
+  (more functions will be added in time to support as much of
+  Z39.50-1995 as possible).
+
+  Because the model where pipes or sockets are used to access the
+  backend database is a fairly common one, we have added a mechanism
+  that allows this communication to take place asynchronously. In this
+  mode, the frontend server doesn't have to block while the backend
+  database is processing a request, but can wait for additional PDUs
+  from the client.
+
+
+  7.3.  The Backend API
+
+  The headers files that you need to use the interface are in the
+  include/ directory. They are called statserv.h and backend.h. They
+  will include other files from the include directory, so you'll
+  probably want to use the -I option of your compiler to tell it where
+  to find the files. When you run make in the toplevel YAZ directory,
+  everything you need to create your server is put the lib/libyaz.a
+  library. If you want OSI as well, you'll also need to link in the
+  libmosi.a library from the xtimosi distribution (see the mosi.txt
+  file), a well as the lib/librfc.a library (to provide OSI transport
+  over RFC1006/TCP).
+
+
+
+  7.4.  Your main() Routine
+
+  As mentioned, your main() routine can be quite brief. If you want to
+  initialize global parameters, or read global configuration tables,
+  this is the place to do it. At the end of the routine, you should call
+  the function
+
+
+
+       int statserv_main(int argc, char **argv);
+
+
+
+
+  Statserv_main will establish listening sockets according to the
+  parameters given. When connection requests are received, the event
+  handler will typically fork() to handle the new request. If you do use
+  global variables, you should be aware, then, that these cannot be
+  shared between associations, unless you explicitly disallow forking by
+  command line parameters (we advise against this for any purposes
+  except debugging, as a crash or hang in the server process will affect
+  all users currently signed on to the server).
+
+  The server provides a mechanism for controlling some of its behavior
+  without using command-line options. The function
+
+
+
+       statserv_options_block *statserv_getcontrol(void);
+
+
+
+
+  Will return a pointer to a struct statserv_options_block describing
+  the current default settings of the server. The structure contains
+  these elements:
+
+
+     int dynamic
+        A boolean value, which determines whether the server will fork
+        on each incoming request (TRUE), or not (FALSE). Default is
+        TRUE.
+
+     int loglevel
+        Set this by ORing the constants defined in include/log.h.
+
+     char logfile[ODR_MAXNAME+1]
+        File for diagnostic output ("": stderr).
+
+     char apdufile[ODR_MAXNAME+1]
+        Name of file for logging incoming and outgoing APDUs ("": don't
+        log APDUs, "-": stderr).
+
+     char default_listen[1024]
+        Same form as the command-line specification of listener address.
+        "": no default listener address.  Default is to listen at
+        "tcp:@:9999". You can only specify one default listener address
+        in this fashion.
+
+     enum oid_proto default_proto;
+        Either PROTO_SR or PROTO_Z3950.  Default is PROTO_Z39_50.
+
+     int idle_timeout;
+        Maximum session idletime, in minutes. Zero indicates no
+        (infinite) timeout. Default is 120 minutes.
+
+     int maxrecordsize;
+        Maximum permissible record (message) size. Default is 1Mb. This
+        amount of memory will only be allocated if a client requests a
+        very large amount of records in one operation (or a big record).
+        Set it to a lower number if you are worried about resource
+        consumption on your host system.
+
+     char configname[ODR_MAXNAME+1]
+        Passed to the backend when a new connection is received.
+
+     char setuid[ODR_MAXNAME+1]
+        Set user id to the user specified, after binding the listener
+        addresses.
+
+  The pointer returned by statserv_getcontrol points to a static area.
+  You are allowed to change the contents of the structure, but the
+  changes will not take effect before you call
+
+
+
+       void statserv_setcontrol(statserv_options_block *block);
+
+
+
+
+  Note that you should generally update this structure before calling
+  statserv_main().
+
+
+  7.5.  The Backend Functions
+
+  For each service of the protocol, the backend interface declares one
+  or two functions. You are required to provide implementations of the
+  functions representing the services that you wish to implement.
+
+
+
+       bend_initresult *bend_init(bend_initrequest *r);
+
+
+
+
+  This function is called once for each new connection request, after a
+  new process has been forked, and an initRequest has been received from
+  the client. The parameter and result structures are defined as
+
+
+
+       typedef struct bend_initrequest
+       {
+           char *configname;
+       } bend_initrequest;
+
+       typedef struct bend_initresult
+       {
+           int errcode;       /* 0==OK */
+           char *errstring;   /* system error string or NULL */
+           void *handle;      /* private handle to the backend module */
+       } bend_initresult;
+
+
+
+
+  The configname of bend_initrequest is currently always set to
+  "default-config". We haven't had use for putting anything special in
+  the initrequest yet, but something might go there if the need arises
+  (account/password info would be obvious).
+
+  In general, the server frontend expects that the bend_*result pointer
+  that you return is valid at least until the next call to a bend_*
+  function. This applies to all of the functions described herein. The
+  parameter structure passed to you in the call belongs to the server
+  frontend, and you should not make assumptions about its contents after
+  the current function call has completed. In other words, if you want
+  to retain any of the contents of a request structure, you should copy
+  them.
+
+  The errcode should be zero if the initialization of the backend went
+  well. Any other value will be interpreted as an error. The errstring
+  isn't used in the current version, but one option would be to stick it
+  in the initResponse as a VisibleString. The handle is the most
+  important parameter. It should be set to some value that uniquely
+  identifies the current session to the backend implementation. It is
+  used by the frontend server in any future calls to a backend function.
+  The typical use is to set it to point to a dynamically allocated state
+  structure that is private to your backend module.
+
+
+
+       bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                                      int *fd);
+       bend_searchresult *bend_searchresponse(void *handle);
+
+       typedef struct bend_searchrequest
+       {
+           char *setname;       /* name to give to this set */
+           int replace_set;     /* replace set, if it already exists */
+           int num_bases;       /* number of databases in list */
+           char **basenames;    /* databases to search */
+           Z_Query *query;      /* query structure */
+       } bend_searchrequest;
+
+       typedef struct bend_searchresult
+       {
+           int hits;            /* number of hits */
+           int errcode;         /* 0==OK */
+           char *errstring;     /* system error string or NULL */
+       } bend_searchresult;
+
+
+
+
+  The first thing to notice about the search request interface (as well
+  as all of the following requests), is that it consists of two separate
+  functions. The idea is to provide a simple facility for asynchronous
+  communication with the backend server. When a searchrequest comes in,
+  the server frontend will fill out the bend_searchrequest tructure, and
+  call the bend_search function. The fd argument will point to an
+  integer variable. If you are able to do asynchronous I/O with your
+  database server, you should set *fd to the file descriptor you use for
+  the communication, and return a null pointer. The server frontend will
+  then select() on the *fd, and will call bend_searchresult when it sees
+  that data is available. If you don't support asynchronous I/O, you
+  should return a pointer to the bend_searchresult immediately, and
+  leave *fd untouched. This construction is common to all of the bend_
+  functions (except bend_init). Note that you can choose to support this
+  facility in none, any, or all of the bend_ functions, and you can
+  respond differently on each request at run-time. The server frontend
+  will adapt accordingly.
+
+  The bend_searchrequest is a fairly close approximation of a protocol
+  searchRequest PDU. The setname is the resultSetName from the protocol.
+  You are required to establish a mapping between the set name and
+  whatever your backend database likes to use. Similarly, the
+  replace_set is a boolean value corresponding to the resultSetIndicator
+  field in the protocol. Num_bases/basenames is a length of/array of
+  character pointers to the database names provided by the client. The
+  query is the full query structure as defined in the protocol ASN.1
+  specification.  It can be either of the possible query types, and it's
+  up to you to determine if you can handle the provided query type.
+  Rather than reproduce the C interface here, we'll refer you to the
+  structure definitions in the file include/proto.h. If you want to look
+  at the attributeSetId OID of the RPN query, you can either match it
+  against your own internal tables, or you can use the oid_getentbyoid
+  function provided by YAZ.
+
+  The result structure contains a number of hits, and an
+  errcode/errstring pair. If an error occurs during the search, or if
+  you're unhappy with the request, you should set the errcode to a value
+  from the BIB-1 diagnostic set. The value will then be returned to the
+  user in a nonsurrogate diagnostic record in the response. The
+  errstring, if provided, will go in the addinfo field. Look at the
+  protocol definition for the defined error codes, and the suggested
+  uses of the addinfo field.
+
+
+
+       bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                                    int *fd);
+       bend_fetchresult *bend_fetchresponse(void *handle);
+
+       typedef struct bend_fetchrequest
+       {
+           char *setname;       /* set name */
+           int number;          /* record number */
+           oid_value format;
+       } bend_fetchrequest;
+
+       typedef struct bend_fetchresult
+       {
+           char *basename;      /* name of database that provided record */
+           int len;             /* length of record */
+           char *record;        /* record */
+           int last_in_set;     /* is it?  */
+           oid_value format;
+           int errcode;         /* 0==success */
+           char *errstring;     /* system error string or NULL */
+       } bend_fetchresult;
+
+
+
+
+  NOTE: The bend_fetchresponse() function is not yet supported in this
+  version of the software. Your implementation of bend_fetch() should
+  always return a pointer to a bend_fetchresult.
+
+  The frontend server calls bend_fetch when it needs database records to
+  fulfill a searchRequest or a presentRequest. The setname is simply the
+  name of the result set that holds the reference to the desired record.
+  The number is the offset into the set (with 1 being the first record
+  in the set). The format field is the record format requested by the
+  client (See section ``Object Identifiers''). The value VAL_NONE
+  indicates that the client did not request a specific format.  The
+  stream argument is an ODR stream which should be used for allocating
+  space for structured data records. The stream will be reset when all
+  records have been assembled, and the response package has been
+  transmitted.  For unstructured data, the backend is responsible for
+  maintaining a static or dynamic buffer for the record between calls.
+  In the result structure, the basename is the name of the database that
+  holds the record. Len is the length of the record returned, in bytes,
+  and record is a pointer to the record. Last_in_set should be nonzero
+  only if the record returned is the last one in the given result set.
+  Errcode and errstring, if given, will currently be interpreted as a
+  global error pertaining to the set, and will be returned in a
+  nonSurrogateDiagnostic.
+
+  NOTE: This is silly. Add a flag to say which is which.
+
+  If the len field has the value -1, then record is assumed to point to
+  a constructed data type. The format field will be used to determine
+  which encoder should be used to serialize the data.
+
+  NOTE: If your backend generates structured records, it should use
+  odr_malloc() on the provided stream for allocating data: This allows
+  the frontend server to keep track of the record sizes.
+
+  The format field is mapped to an object identifier in the direct
+  reference of the resulting EXTERNAL representation of the record.
+
+  NOTE: The current version of YAZ only supports the direct reference
+  mode.
+
+
+
+       bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                                      int *fd);
+       bend_deleteresult *bend_deleteresponse(void *handle);
+
+       typedef struct bend_deleterequest
+       {
+           char *setname;
+       } bend_deleterequest;
+
+       typedef struct bend_deleteresult
+       {
+           int errcode;         /* 0==success */
+           char *errstring;     /* system error string or NULL */
+       } bend_deleteresult;
+
+
+
+
+  NOTE: The "delete" function is not yet supported in this version of
+  the software.
+
+  NOTE: The delete set function definition is rather primitive, mostly
+  because we have had no practical need for it as of yet. If someone
+  wants to provide a full delete service, we'd be happy to add the extra
+  parameters that are required. Are there clients out there that will
+  actually delete sets they no longer need?
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  bend_scanresult *bend_scan(void *handle, bend_scanrequest *r,
+      int *fd);
+  bend_scanresult *bend_scanresponse(void *handle);
+
+  typedef struct bend_scanrequest
+  {
+      int num_bases;      /* number of elements in databaselist */
+      char **basenames;   /* databases to search */
+      Z_AttributesPlusTerm *term;
+      int term_position;  /* desired index of term in result list */
+      int num_entries;    /* number of entries requested */
+  } bend_scanrequest;
+
+  typedef struct bend_scanresult
+  {
+      int num_entries;
+      struct scan_entry
+      {
+          char *term;
+          int occurrences;
+      } *entries;
+      int term_position;
+      enum
+      {
+          BEND_SCAN_SUCCESS,
+          BEND_SCAN_PARTIAL
+      } status;
+      int errcode;
+      char *errstring;
+  } bend_scanresult;
+
+
+
+
+  NOTE: The bend_scanresponse() function is not yet supported in this
+  version of the software. Your implementation of bend_scan() should
+  always return a pointer to a bend_scanresult.
+
+
+  7.6.  Application Invocation
+
+  The finished application has the following invocation syntax (by way
+  of statserv_main()):
+
+
+
+
+       appname [-szSu -a apdufile -l logfile -v loglevel]
+       [listener ...]
+
+
+
+
+  The options are
+
+
+     -a APDU file. Specify a file for dumping PDUs (for diagnostic
+        purposes).  The special name "-" sends output to stderr.
+
+
+     -S Don't fork on connection requests. This is good for debugging,
+        but not recommended for real operation: Although the server is
+        asynchronous and non-blocking, it can be nice to keep a software
+        malfunction (okay then, a crash) from affecting all current
+        users.
+
+     -s Use the SR protocol.
+
+
+     -z Use the Z39.50 protocol (default). These two options complement
+        eachother. You can use both multiple times on the same command
+        line, between listener-specifications (see below). This way, you
+        can set up the server to listen for connections in both
+        protocols concurrently, on different local ports.
+
+
+     -l The logfile.
+
+
+     -v The log level. Use a comma-separated list of members of the set
+        {fatal,debug,warn,log,all,none}.
+
+     -u Set user ID. Sets the real UID of the server process to that of
+        the given user. It's useful if you aren't comfortable with
+        having the server run as root, but you need to start it as such
+        to bind a privileged port.
+
+
+     -w Working directory.
+
+     -i Use this when running from the inetd server.
+
+
+     -t Idle session timeout, in minutes.
+
+
+     -k Maximum record size/message size, in kilobytes.
+
+
+  A listener specification consists of a transport mode followed by a
+  colon (:) followed by a listener address. The transport mode is either
+  osi or tcp.
+
+  For TCP, an address has the form
+
+
+
+       hostname | IP-number [: portnumber]
+
+
+
+
+  The port number defaults to 210 (standard Z39.50 port).
+
+  For osi, the address form is
+
+
+
+       [t-selector /] hostname | IP-number [: portnumber]
+
+
+
+
+  The transport selector is given as a string of hex digits (with an
+  even number of digits). The default port number is 102 (RFC1006 port).
+
+  Examples
+
+
+
+
+
+  tcp:dranet.dra.com
+
+  osi:0402/dbserver.osiworld.com:3000
+
+
+
+
+  In both cases, the special hostname "@" is mapped to the address
+  INADDR_ANY, which causes the server to listen on any local interface.
+  To start the server listening on the registered ports for Z39.50 and
+  SR over OSI/RFC1006, and to drop root privileges once the ports are
+  bound, execute the server like this (from a root shell):
+
+
+
+       my-server -u daemon tcp:@ -s osi:@
+
+
+
+
+  You can replace daemon with another user, eg. your own account, or a
+  dedicated IR server account. my-server should be the name of your
+  server application. You can test the procedure with the ztest
+  application.
+
+
+  7.7.  Summary and Synopsis
+
+
+
+       #include <backend.h>
+
+       bend_initresult *bend_init(bend_initrequest *r);
+
+       bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                                        int *fd);
+
+       bend_searchresult *bend_searchresponse(void *handle);
+
+       bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                                      int *fd);
+
+       bend_fetchresult *bend_fetchresponse(void *handle);
+
+       bend_scanresult *bend_scan(void *handle, bend_scanrequest *r, int *fd);
+
+       bend_scanresult *bend_scanresponse(void *handle);
+
+       bend_deleteresult *bend_delete(void *handle, bend_deleterequest *r,
+                                         int *fd);
+
+       bend_deleteresult *bend_deleteresponse(void *handle);
+
+       void bend_close(void *handle);
+
+
+
+
+
+  8.  Future Directions
+
+  The software has been successfully ported to the Mac as well as
+  Windows NT/95 - we'd like to test those ports better and make sure
+  they work as they should.
+
+
+  We have a new and better version of the frontend server on the drawing
+  board. Resources and external commitments will govern when we'll be
+  able to do something real with it. Fetures should include greater
+  flexibility, greter support for access/resource control, and easy
+  support for Explain (possibly with Zebra as an extra database engine).
+
+  We now support all PDUs of Z39.50-1995. If there is one of the
+  supporting structures that you need but can't find in the prt*.h
+  files, send us a note; it may be on its way.
+
+  The 'retrieval' module needs to be finalized and documented. We think
+  it can form a useful resource for people dealing with complex record
+  structures, but for now, you'll mostly have to chew through the code
+  yourself to make use of it. Not acceptable.
+
+  Other than that, YAZ generally moves in the directions which appear to
+  make the most people happy (including ourselves, as prime users of the
+  software). If there's something you'd like to see in here, then drop
+  us a note and let's see what we can come up with.
+
+
+  9.  License
+
+  9.1.  Index Data Copyright
+
+  Copyright (C) 1995-2000 Index Data.
+
+  Permission to use, copy, modify, distribute, and sell this software
+  and its documentation, in whole or in part, for any purpose, is hereby
+  granted, provided that:
+
+  1. This copyright and permission notice appear in all copies of the
+  software and its documentation. Notices of copyright or attribution
+  which appear at the beginning of any file must remain unchanged.
+
+  2. The names of Index Data or the individual authors may not be used
+  to endorse or promote products derived from this software without
+  specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+  WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN
+  NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+  INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT
+  ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
+  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+  SOFTWARE.
+
+
+  9.2.  Additional Copyright Statements
+
+  The optional CCL query language interpreter is covered by the
+  following license:
+
+  Copyright (C) 1995, the EUROPAGATE consortium (see below).
+
+  The EUROPAGATE consortium members are:
+
+  University College Dublin Danmarks Teknologiske Videnscenter An
+  Chomhairle Leabharlanna Consejo Superior de Investigaciones
+  Cientificas
+
+  Permission to use, copy, modify, distribute, and sell this software
+  and its documentation, in whole or in part, for any purpose, is hereby
+  granted, provided that:
+  1. This copyright and permission notice appear in all copies of the
+  software and its documentation. Notices of copyright or attribution
+  which appear at the beginning of any file must remain unchanged.
+
+  2. The names of EUROPAGATE or the project partners may not be used to
+  endorse or promote products derived from this software without
+  specific prior written permission.
+
+  3. Users of this software (implementors and gateway operators) agree
+  to inform the EUROPAGATE consortium of their use of the software. This
+  information will be used to evaluate the EUROPAGATE project and the
+  software, and to plan further developments. The consortium may use the
+  information in later publications.
+
+  4. Users of this software agree to make their best efforts, when
+  documenting their use of the software, to acknowledge the EUROPAGATE
+  consortium, and the role played by the software in their work.
+
+  THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+  EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+  WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  IN
+  NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE FOR
+  ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+  KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+  PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON
+  ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
+  OR PERFORMANCE OF THIS SOFTWARE.
+
+
+  10.  About Index Data
+
+  Index Data is a consulting and software-development enterprise that
+  specialises in library and information management systems. Our
+  interests and expertise span a broad range of related fields, and one
+  of our primary, long-term objectives is the development of a powerful
+  information management system with open network interfaces and
+  hypermedia capabilities.
+
+  We make this software available free of charge, on a fairly
+  unrestrictive license; as a service to the networking community, and
+  to further the development of quality software for open network
+  communication.
+
+  We'll be happy to answer questions about the software, and about
+  ourselves in general.
+
+
+
+       Index Data
+       Ryesgade 3
+       DK-2200 Copenhagen N
+
+
+
+
+
+
+
+       Phone: +45 3536 3672
+       Fax  : +45 3536 0449
+       Email: info@indexdata.dk
+
+
+
+
+
+  The Hacker's Jargon File has the following to say about the use of the
+  prefix "YA" in the name of a software product.
+
+  Yet Another. adj. 1. Of your own work: A humorous allusion often used
+  in titles to acknowledge that the topic is not original, though the
+  content is.  As in "Yet Another AI Group" or "Yet Another Simulated
+  Annealing Algorithm".  2. Of others' work: Describes something of
+  which there are already far too many.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/include/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/Makefile.am	(revision 21083)
@@ -0,0 +1,6 @@
+## $Id$
+
+AUTOMAKE_OPTIONS = foreign 
+
+SUBDIRS = yaz
+
Index: /main/tags/2.38/gsdl/packages/yaz/include/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/Makefile.in	(revision 21083)
@@ -0,0 +1,281 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+AUTOMAKE_OPTIONS = foreign 
+
+SUBDIRS = yaz
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+all: all-redirect
+.SUFFIXES:
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --foreign --include-deps include/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.
+
+# @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 = include
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.am	(revision 21083)
@@ -0,0 +1,17 @@
+## $Id$
+
+pkginclude_HEADERS= backend.h ccl.h comstack.h \
+ d1_attset.h d1_map.h data1.h diagbib1.h \
+ log.h logrpn.h marcdisp.h nmem.h odr.h oid.h options.h otherinfo.h \
+ pquery.h prt-ext.h readconf.h statserv.h tcpip.h tpath.h wrbuf.h xmalloc.h \
+ yaz-ccl.h yaz-util.h yaz-version.h yconfig.h proto.h \
+ \
+ ill.h ill-core.h item-req.h z-accdes1.h z-accform1.h \
+ z-acckrb1.h z-core.h z-date.h z-diag1.h z-espec1.h z-estask.h z-exp.h \
+ z-grs.h z-opac.h z-proto.h z-rrf1.h z-rrf2.h z-sum.h z-sutrs.h z-uifr1.h \
+ z-univ.h zes-expi.h zes-exps.h zes-order.h zes-pquery.h zes-psched.h \
+ \
+ zes-pset.h zes-update.h zes-update0.h \
+ prt-acc.h prt-add.h prt-arc.h prt-dat.h prt-dia.h prt-esp.h \
+ prt-exd.h prt-exp.h prt-grs.h prt-proto.h prt-rsc.h prt-univ.h
+
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/Makefile.in	(revision 21083)
@@ -0,0 +1,222 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+pkginclude_HEADERS = backend.h ccl.h comstack.h  d1_attset.h d1_map.h data1.h diagbib1.h  log.h logrpn.h marcdisp.h nmem.h odr.h oid.h options.h otherinfo.h  pquery.h prt-ext.h readconf.h statserv.h tcpip.h tpath.h wrbuf.h xmalloc.h  yaz-ccl.h yaz-util.h yaz-version.h yconfig.h proto.h   ill.h ill-core.h item-req.h z-accdes1.h z-accform1.h  z-acckrb1.h z-core.h z-date.h z-diag1.h z-espec1.h z-estask.h z-exp.h  z-grs.h z-opac.h z-proto.h z-rrf1.h z-rrf2.h z-sum.h z-sutrs.h z-uifr1.h  z-univ.h zes-expi.h zes-exps.h zes-order.h zes-pquery.h zes-psched.h   zes-pset.h zes-update.h zes-update0.h  prt-acc.h prt-add.h prt-arc.h prt-dat.h prt-dia.h prt-esp.h  prt-exd.h prt-exp.h prt-grs.h prt-proto.h prt-rsc.h prt-univ.h
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+HEADERS =  $(pkginclude_HEADERS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+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 include/yaz/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(pkgincludedir)
+	@list='$(pkginclude_HEADERS)'; for p in $$list; do \
+	  if test -f "$$p"; then d= ; else d="$(srcdir)/"; fi; \
+	  echo " $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgincludedir)/$$p"; \
+	  $(INSTALL_DATA) $$d$$p $(DESTDIR)$(pkgincludedir)/$$p; \
+	done
+
+uninstall-pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	list='$(pkginclude_HEADERS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(pkgincludedir)/$$p; \
+	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:  $(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 = include/yaz
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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-pkgincludeHEADERS
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-pkgincludeHEADERS
+uninstall: uninstall-am
+all-am: Makefile $(HEADERS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(pkgincludedir)
+
+
+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-am
+
+clean-am:  clean-tags clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-tags distclean-generic clean-am
+
+distclean: distclean-am
+
+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-am
+
+.PHONY: uninstall-pkgincludeHEADERS install-pkgincludeHEADERS 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:
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/backend.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/backend.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/backend.h	(revision 21083)
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:32  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.3  2000/01/12 14:36:07  adam
+ * Added printing stream (ODR) for backend functions.
+ *
+ * Revision 1.2  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.28  1999/11/04 14:58:44  adam
+ * Added status elements for backend delete result set handler.
+ * Updated delete result result set command for client.
+ *
+ * Revision 1.27  1999/10/11 10:01:24  adam
+ * Implemented bend_sort_rr handler for frontend server.
+ *
+ * Revision 1.26  1999/06/17 10:54:44  adam
+ * Added facility to specify implementation version - and name
+ * for server.
+ *
+ * Revision 1.25  1999/06/01 14:29:12  adam
+ * Work on Extended Services.
+ *
+ * Revision 1.24  1999/03/31 11:18:24  adam
+ * Implemented odr_strdup. Added Reference ID to backend server API.
+ *
+ * Revision 1.23  1998/10/13 16:12:23  adam
+ * Added support for Surrogate Diagnostics for Scan Term entries.
+ *
+ * Revision 1.22  1998/09/02 12:41:51  adam
+ * Added decode stream in bend search structures.
+ *
+ * Revision 1.21  1998/07/20 12:38:41  adam
+ * Implemented delete result set service to server API.
+ *
+ * Revision 1.20  1998/05/27 16:57:06  adam
+ * Support for surrogate diagnostic records added for bend_fetch.
+ *
+ * Revision 1.19  1998/03/31 11:07:45  adam
+ * Furhter work on UNIverse resource report.
+ * Added Extended Services handling in frontend server.
+ *
+ * Revision 1.18  1998/02/10 11:03:56  adam
+ * Added support for extended handlers in backend server interface.
+ *
+ * Revision 1.17  1998/01/29 13:15:35  adam
+ * Implemented sort for the backend interface.
+ *
+ * Revision 1.16  1997/09/17 12:10:31  adam
+ * YAZ version 1.4.
+ *
+ */
+
+#ifndef BACKEND_H
+#define BACKEND_H
+
+#include <yaz/yconfig.h>
+#include <yaz/proto.h>
+#include <yaz/statserv.h>
+
+YAZ_BEGIN_CDECL
+    
+typedef struct request *bend_request;
+typedef struct association *bend_association;
+
+/* old search request input */ 
+typedef struct 
+{
+    char *setname;             /* name to give to this set */
+    int replace_set;           /* replace set, if it already exists */
+    int num_bases;             /* number of databases in list */
+    char **basenames;          /* databases to search */
+    Z_ReferenceId *referenceId;/* reference ID */
+    Z_Query *query;            /* query structure */
+    ODR stream;                /* encoding stream */
+    ODR decode;                /* decoding stream */
+    ODR print;                 /* printing stream */
+} bend_searchrequest;
+
+/* old search request output */
+typedef struct
+{
+    int hits;                  /* number of hits */
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+} bend_searchresult;
+
+/* extended search handler (rr = request response) */
+typedef struct {
+    char *setname;             /* name to give to this set */
+    int replace_set;           /* replace set, if it already exists */
+    int num_bases;             /* number of databases in list */
+    char **basenames;          /* databases to search */
+    Z_ReferenceId *referenceId;/* reference ID */
+    Z_Query *query;            /* query structure */
+    ODR stream;                /* encode stream */
+    ODR decode;                /* decode stream */
+    ODR print;                 /* print stream */
+
+    bend_request request;
+    bend_association association;
+    int *fd;
+    int hits;                  /* number of hits */
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+} bend_search_rr;
+
+/* extended present handler. Does not replace bend_fetch. */
+typedef struct {
+    char *setname;             /* set name */
+    int start;
+    int number;                /* record number */
+    oid_value format;          /* One of the CLASS_RECSYN members */
+    Z_ReferenceId *referenceId;/* reference ID */
+    Z_RecordComposition *comp; /* Formatting instructions */
+    ODR stream;                /* encoding stream - memory source if required */
+    ODR print;                 /* printing stream */
+    bend_request request;
+    bend_association association;
+
+    int hits;                  /* number of hits */
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+} bend_present_rr;
+
+YAZ_EXPORT bend_searchresult *bend_search(void *handle, bend_searchrequest *r,
+                                          int *fd);
+YAZ_EXPORT int bend_searchresponse(void *handle, bend_search_rr *bsrr);
+
+typedef struct
+{
+    char *setname;             /* set name */
+    int number;                /* record number */
+    Z_ReferenceId *referenceId;/* reference ID */
+    oid_value format;          /* One of the CLASS_RECSYN members */
+    Z_RecordComposition *comp; /* Formatting instructions */
+    ODR stream;                /* encoding stream - memory source if req */
+    ODR print;                 /* printing stream */
+    int surrogate_flag;        /* surrogate diagnostic flag (rw) */
+} bend_fetchrequest;
+
+typedef struct
+{
+    char *basename;            /* name of database that provided record */
+    int len;                   /* length of record or -1 if structured */
+    char *record;              /* record */
+    int last_in_set;           /* is it?  */
+    oid_value format;          /* format */
+    int errcode;               /* 0==success */
+    char *errstring;           /* system error string or NULL */
+} bend_fetchresult;
+
+YAZ_EXPORT bend_fetchresult *bend_fetch(void *handle, bend_fetchrequest *r,
+                                        int *fd);
+YAZ_EXPORT bend_fetchresult *bend_fetchresponse(void *handle);
+
+typedef struct
+{
+    int num_bases;      /* number of elements in databaselist */
+    char **basenames;   /* databases to search */
+    oid_value attributeset;
+    Z_ReferenceId *referenceId; /* reference ID */
+    Z_AttributesPlusTerm *term;
+    int term_position;  /* desired index of term in result list */
+    int num_entries;    /* number of entries requested */
+    ODR stream;         /* encoding stream - memory source if required */
+    ODR print;          /* printing stream */
+} bend_scanrequest;
+
+struct scan_entry {
+    char *term;         /* the returned scan term */
+    int occurrences;    /* no of occurrences or -1 if error (see below) */
+    int errcode;        /* Bib-1 diagnostic code; only used when occur.= -1 */
+    char *errstring;    /* Additional string */
+};
+
+typedef enum {
+    BEND_SCAN_SUCCESS,  /* ok */
+    BEND_SCAN_PARTIAL   /* not all entries could be found */
+} bend_scan_status;
+
+typedef struct bend_scanresult
+{
+    int num_entries;
+    struct scan_entry *entries;
+    int term_position;
+    bend_scan_status status;
+    int errcode;
+    char *errstring;
+} bend_scanresult;
+
+typedef struct bend_scan_rr {
+    int num_bases;      /* number of elements in databaselist */
+    char **basenames;   /* databases to search */
+    oid_value attributeset;
+    Z_ReferenceId *referenceId; /* reference ID */
+    Z_AttributesPlusTerm *term;
+    ODR stream;         /* encoding stream - memory source if required */
+    ODR print;          /* printing stream */
+
+    int term_position;  /* desired index of term in result list/returned */
+    int num_entries;    /* number of entries requested/returned */
+
+    struct scan_entry *entries;
+    bend_scan_status status;
+    int errcode;
+    char *errstring;
+} bend_scan_rr;
+
+YAZ_EXPORT bend_scanresult *bend_scan(void *handle, bend_scanrequest *r,
+                                      int *fd);
+YAZ_EXPORT bend_scanresult *bend_scanresponse(void *handle);
+
+/* delete handler */
+typedef struct bend_delete_rr {
+    int function;
+    int num_setnames;
+    char **setnames;
+    Z_ReferenceId *referenceId;
+    int delete_status;      /* status for the whole operation */
+    int *statuses;          /* status each set - indexed as setnames */
+    ODR stream;
+    ODR print; 
+} bend_delete_rr;
+
+/* close handler */
+YAZ_EXPORT void bend_close(void *handle);
+
+/* sort handler */
+typedef struct bend_sort_rr
+{
+    int num_input_setnames;
+    char **input_setnames;
+    char *output_setname;
+    Z_SortKeySpecList *sort_sequence;
+    ODR stream;
+    ODR print;
+    Z_ReferenceId *referenceId;/* reference ID */
+
+    int sort_status;
+    int errcode;
+    char *errstring;
+} bend_sort_rr;
+
+typedef struct bend_esrequest_rr
+{
+    int ItemNo;
+    Z_ExtendedServicesRequest *esr;
+    
+    ODR stream;                /* encoding stream */
+    ODR decode;                /* decoding stream */
+    ODR print;                 /* printing stream */
+    Z_ReferenceId *referenceId;/* reference ID */
+    bend_request request;
+    bend_association association;
+    int errcode;               /* 0==success, -1==accepted, >0 = failure */
+    char *errstring;           /* system error string or NULL */
+} bend_esrequest_rr;
+
+typedef struct bend_initrequest
+{
+    char *configname;
+    Z_IdAuthentication *auth;
+    ODR stream;                /* encoding stream */
+    ODR print;                 /* printing stream */
+    Z_ReferenceId *referenceId;/* reference ID */
+    
+    char *implementation_name;
+    char *implementation_version;
+    int (*bend_sort) (void *handle, bend_sort_rr *rr);
+    int (*bend_search) (void *handle, bend_search_rr *rr);
+    int (*bend_present) (void *handle, bend_present_rr *rr);
+    int (*bend_esrequest) (void *handle, bend_esrequest_rr *rr);
+    int (*bend_delete)(void *handle, bend_delete_rr *rr);
+    int (*bend_scan)(void *handle, bend_scan_rr *rr);
+} bend_initrequest;
+
+typedef struct bend_initresult
+{
+    int errcode;               /* 0==OK */
+    char *errstring;           /* system error string or NULL */
+    void *handle;              /* private handle to the backend module */
+} bend_initresult;
+
+YAZ_EXPORT bend_initresult *bend_init(bend_initrequest *r);
+
+YAZ_EXPORT void bend_request_send (bend_association a, bend_request req,
+				   Z_APDU *res);
+
+YAZ_EXPORT bend_request bend_request_mk (bend_association a);
+
+YAZ_EXPORT void bend_request_destroy (bend_request *req);
+
+YAZ_EXPORT Z_ReferenceId *bend_request_getid (ODR odr, bend_request req);
+YAZ_EXPORT int bend_backend_respond (bend_association a, bend_request req);
+YAZ_EXPORT void bend_request_setdata(bend_request r, void *p);
+YAZ_EXPORT void *bend_request_getdata(bend_request r);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/ccl.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/ccl.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/ccl.h	(revision 21083)
@@ -0,0 +1,343 @@
+/*
+ * Copyright (c) 1995, the EUROPAGATE consortium (see below).
+ *
+ * The EUROPAGATE consortium members are:
+ *
+ *    University College Dublin
+ *    Danmarks Teknologiske Videnscenter
+ *    An Chomhairle Leabharlanna
+ *    Consejo Superior de Investigaciones Cientificas
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of EUROPAGATE or the project partners may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * 3. Users of this software (implementors and gateway operators) agree to
+ * inform the EUROPAGATE consortium of their use of the software. This
+ * information will be used to evaluate the EUROPAGATE project and the
+ * software, and to plan further developments. The consortium may use
+ * the information in later publications.
+ * 
+ * 4. Users of this software agree to make their best efforts, when
+ * documenting their use of the software, to acknowledge the EUROPAGATE
+ * consortium, and the role played by the software in their work.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF
+ * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA
+ * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND
+ * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/*
+ * CCL - header file
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:32  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.3  2000/02/08 10:39:53  adam
+ * Added a few functions to set name of operands, etc.
+ *
+ * Revision 1.2  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1998/02/11 11:53:33  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1997/09/29 09:01:19  adam
+ * Changed CCL parser to be thread safe. New type, CCL-parser, declared
+ * and a create/destructor ccl_parser_create/ccl_parser_destroy has been
+ * added.
+ *
+ * Revision 1.7  1997/09/01 08:49:47  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.6  1997/05/14 06:53:37  adam
+ * C++ support.
+ *
+ * Revision 1.5  1997/04/30 08:52:08  quinn
+ * Null
+ *
+ * Revision 1.4  1996/10/11  15:02:26  adam
+ * CCL parser from Europagate Email gateway 1.0.
+ *
+ * Revision 1.10  1996/01/08  08:41:22  adam
+ * Minor changes.
+ *
+ * Revision 1.9  1995/07/20  08:15:16  adam
+ * Bug fix: Token value for comma and OR were the same!
+ *
+ * Revision 1.8  1995/07/11  12:28:34  adam
+ * New function: ccl_token_simple (split into simple tokens) and
+ *  ccl_token_del (delete tokens).
+ *
+ * Revision 1.7  1995/05/16  09:39:38  adam
+ * LICENSE.
+ *
+ * Revision 1.6  1995/05/11  14:04:03  adam
+ * Changes in the reading of qualifier(s). New function: ccl_qual_fitem.
+ * New variable ccl_case_sensitive, which controls whether reserved
+ * words and field names are case sensitive or not.
+ *
+ * Revision 1.5  1995/02/23  08:32:11  adam
+ * Changed header.
+ *
+ * Revision 1.3  1995/02/16  13:20:10  adam
+ * Spell fix.
+ *
+ * Revision 1.2  1995/02/15  17:43:08  adam
+ * Minor changes to the ccl interface. Bug fix in iso2709 module.
+ *
+ * Revision 1.1  1995/02/14  19:55:21  adam
+ * Header files ccl.h/cclp.h are gone! They have been merged an
+ * moved to ../include/ccl.h.
+ *
+ */
+
+#ifndef CCL_H
+#define CCL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+/* CCL error numbers */
+#define CCL_ERR_OK                0
+#define CCL_ERR_TERM_EXPECTED     1
+#define CCL_ERR_RP_EXPECTED       2
+#define CCL_ERR_SETNAME_EXPECTED  3
+#define CCL_ERR_OP_EXPECTED       4
+#define CCL_ERR_BAD_RP            5
+#define CCL_ERR_UNKNOWN_QUAL      6
+#define CCL_ERR_DOUBLE_QUAL       7
+#define CCL_ERR_EQ_EXPECTED       8
+#define CCL_ERR_BAD_RELATION      9
+#define CCL_ERR_TRUNC_NOT_LEFT   10
+#define CCL_ERR_TRUNC_NOT_BOTH   11
+#define CCL_ERR_TRUNC_NOT_RIGHT  12
+    
+/* attribute pair (type, value) */
+struct ccl_rpn_attr {
+    struct ccl_rpn_attr *next;
+    int type;
+    int value;
+};
+
+#define CCL_RPN_AND 1
+#define CCL_RPN_OR 2
+#define CCL_RPN_NOT 3
+#define CCL_RPN_TERM 4
+#define CCL_RPN_SET 5
+#define CCL_RPN_PROX 6
+
+/* RPN tree structure */
+struct ccl_rpn_node {
+    int kind;
+    union {
+	struct ccl_rpn_node *p[2];
+	struct {
+	    char *term;
+	    struct ccl_rpn_attr *attr_list;
+	} t;
+	char *setname;
+    } u;
+};
+
+typedef struct ccl_qualifiers *CCL_bibset;
+
+/* use (1)
+
+   relation (2)
+                            -1  none
+                             0  ordered
+                           1-6  relation (<, <=, =, >=, >, <>)
+
+   position (3)
+                            -1  none
+                             1  first in field
+                             2  first in sub field
+                             3  any position in field
+   structure (4)
+                            -1  none
+                             0  word/phrase auto select
+                             1  phrase
+                             2  word
+                             3  key
+                             4  year
+                             5  date (normalized)
+                             6  word list 
+                           100  date (un-normalized)
+                           101  name (normalized)
+                           102  name (un-normalized)
+   truncation (5)                            
+   completeness (6)
+*/
+
+#define CCL_BIB1_USE 1
+#define CCL_BIB1_REL 2
+#define CCL_BIB1_POS 3
+#define CCL_BIB1_STR 4
+#define CCL_BIB1_TRU 5
+#define CCL_BIB1_COM 6
+
+#define CCL_BIB1_STR_WP (-1)
+#define CCL_BIB1_REL_ORDER (-1)
+
+#define CCL_BIB1_TRU_CAN_LEFT (-1)
+#define CCL_BIB1_TRU_CAN_RIGHT (-2)
+#define CCL_BIB1_TRU_CAN_BOTH  (-3)
+#define CCL_BIB1_TRU_CAN_NONE  (-4)
+
+#define CCL_TOK_EOL   0
+#define CCL_TOK_TERM  1
+#define CCL_TOK_REL   2
+#define CCL_TOK_EQ    3
+#define CCL_TOK_PROX  4
+#define CCL_TOK_LP    5
+#define CCL_TOK_RP    6
+#define CCL_TOK_COMMA 7
+#define CCL_TOK_AND   8
+#define CCL_TOK_OR    9
+#define CCL_TOK_NOT   10
+#define CCL_TOK_MINUS 11
+#define CCL_TOK_SET   12
+
+/* CCL token */
+struct ccl_token {
+    char kind;
+    size_t len;
+    const char *name;
+    struct ccl_token *next;
+    struct ccl_token *prev;
+};
+
+/* CCL Qualifier */
+struct ccl_qualifier {
+    char *name;
+    struct ccl_rpn_attr *attr_list;
+    struct ccl_qualifier *next;
+};
+
+struct ccl_parser {
+/* current lookahead token */
+    struct ccl_token *look_token;
+    
+/* holds error code if error occur (and approx position of error) */
+    int error_code;
+    const char *error_pos;
+    
+/* current bibset */
+    CCL_bibset bibset;
+
+    char *ccl_token_and;
+    char *ccl_token_or;
+    char *ccl_token_not;
+    char *ccl_token_set;
+    int ccl_case_sensitive;
+};
+    
+typedef struct ccl_parser *CCL_parser;
+    
+/* Generate tokens from command string - obeys all CCL opererators */
+struct ccl_token *ccl_parser_tokenize (CCL_parser cclp,
+				       const char *command);
+struct ccl_token *ccl_tokenize (const char *command);
+    
+/* Generate tokens from command string - oebeys only simple tokens and 
+   quoted strings */
+struct ccl_token *ccl_token_simple (const char *command);
+
+/* Delete token list */
+void ccl_token_del (struct ccl_token *list);
+
+/* Parse CCL Find command - NULL-terminated string */
+struct ccl_rpn_node *ccl_find_str (CCL_bibset bibset,
+                                   const char *str, int *error, int *pos);
+
+/* Parse CCL Find command - Tokens read by ccl_tokenize */
+struct ccl_rpn_node *ccl_find (CCL_bibset abibset, struct ccl_token *list,
+                               int *error, const char **pos);
+
+/* Parse CCL Find command */
+struct ccl_rpn_node *ccl_parser_find (CCL_parser cclp, struct ccl_token *list);
+
+/* Set various OPs */
+void ccl_parser_set_op_and (CCL_parser p, const char *op);
+void ccl_parser_set_op_or (CCL_parser p, const char *op);
+void ccl_parser_set_op_not (CCL_parser p, const char *op);
+void ccl_parser_set_op_set (CCL_parser p, const char *op);
+
+void ccl_parser_set_case (CCL_parser p, int case_sensitivity_flag);
+
+/* Return english-readable error message */
+const char *ccl_err_msg (int ccl_errno);
+
+/* Delete RPN tree returned by ccl_find */
+void ccl_rpn_delete (struct ccl_rpn_node *rpn);
+
+/* Dump RPN tree in readable format to fd_out */
+void ccl_pr_tree (struct ccl_rpn_node *rpn, FILE *fd_out);
+
+/* Add CCL qualifier */
+void ccl_qual_add (CCL_bibset b, const char *name, int no, int *attr);
+
+/* Read CCL qualifier list spec from file inf */
+void ccl_qual_file (CCL_bibset bibset, FILE *inf);
+
+/* Add CCL qualifier by using single-line spec */
+void ccl_qual_fitem (CCL_bibset bibset, const char *cp, const char *qual_name);
+
+/* Make CCL qualifier set */
+CCL_bibset ccl_qual_mk (void);
+
+/* Delete CCL qualifier set */
+void ccl_qual_rm (CCL_bibset *b);
+
+/* Char-to-upper function */
+extern int (*ccl_toupper)(int c);
+
+/* String utilities */
+int ccl_stricmp (const char *s1, const char *s2);
+int ccl_memicmp (const char *s1, const char *s2, size_t n);
+
+/* Search for qualifier 'name' in set 'b'. */
+struct ccl_rpn_attr *ccl_qual_search (CCL_parser cclp, const char *name,
+                                      size_t len);
+
+/* Create CCL parser */
+CCL_parser ccl_parser_create (void);
+
+/* Destroy CCL parser */
+void ccl_parser_destroy (CCL_parser p);
+
+
+#ifndef ccl_assert
+#define ccl_assert(x) ;
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/comstack.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/comstack.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/comstack.h	(revision 21083)
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#ifndef COMSTACK_H
+#define COMSTACK_H
+
+#include <yaz/yconfig.h>
+
+#ifndef _VMS_
+
+# ifdef WIN32
+
+#  include <winsock.h>
+
+# else /* #ifdef WIN32 */
+#  include <sys/types.h>
+#  include <sys/time.h>
+#  include <sys/wait.h>
+
+#  include <netinet/in.h>
+#  include <sys/socket.h>
+#  include <netdb.h>
+#  include <arpa/inet.h>
+
+#  ifdef _AIX
+#   include <sys/select.h>
+#  endif
+
+#  ifndef O_BINARY
+#   define O_BINARY 0
+#  endif
+
+# endif
+#endif /* ifndef _VMS_ */
+
+#include <yaz/oid.h>
+#include <yaz/xmalloc.h>
+
+YAZ_BEGIN_CDECL
+
+#define COMSTACK_DEFAULT_TIMEOUT -1  /* not used yet */
+
+struct comstack;
+typedef struct comstack *COMSTACK;
+typedef COMSTACK (*CS_TYPE)(int s, int blocking, int protocol);
+
+struct comstack
+{
+    CS_TYPE type;
+    int cerrno;     /* current error code of this stack */
+    char *stackerr;/* current lower-layer error string, or null if none */
+    int iofile;    /* UNIX file descriptor for iochannel */
+    int timeout;   /* how long to wait for trailing blocks (ignored for now) */
+    void *cprivate;/* state info for lower stack */
+    int more;      /* connection has extra data in buffer */
+    int state;     /* current state */
+#define CS_UNBND      0
+#define CS_IDLE       1
+#define CS_INCON      2
+#define CS_OUTCON     3
+#define CS_DATAXFER   4
+    int newfd;     /* storing new descriptor between listen and accept */
+    int blocking;  /* is this link (supposed to be) blocking? */
+    int event;     /* current event */
+#define CS_NONE       0
+#define CS_CONNECT    1
+#define CS_DISCON     2
+#define CS_LISTEN     3
+#define CS_DATA       4
+    enum oid_proto protocol;  /* what application protocol are we talking? */
+    int (*f_put)(COMSTACK handle, char *buf, int size);
+    int (*f_get)(COMSTACK handle, char **buf, int *bufsize);
+    int (*f_more)(COMSTACK handle);
+    int (*f_connect)(COMSTACK handle, void *address);
+    int (*f_rcvconnect)(COMSTACK handle);
+    int (*f_bind)(COMSTACK handle, void *address, int mode);
+#define CS_CLIENT 0
+#define CS_SERVER 1
+    int (*f_listen)(COMSTACK h, char *raddr, int *addrlen,
+		   int (*check_ip)(void *cd, const char *a, int len, int type),
+		   void *cd);
+    COMSTACK (*f_accept)(COMSTACK handle);
+    int (*f_close)(COMSTACK handle);
+    char *(*f_addrstr)(COMSTACK handle);
+    void *(*f_straddr)(COMSTACK handle, const char *str);
+};
+
+#define cs_put(handle, buf, size) ((*(handle)->f_put)(handle, buf, size))
+#define cs_get(handle, buf, size) ((*(handle)->f_get)(handle, buf, size))
+#define cs_more(handle) ((*(handle)->f_more)(handle))
+#define cs_connect(handle, address) ((*(handle)->f_connect)(handle, address))
+#define cs_rcvconnect(handle) ((*(handle)->f_rcvconnect)(handle))
+#define cs_bind(handle, ad, mo) ((*(handle)->f_bind)(handle, ad, mo))
+#define cs_listen(handle, ap, al) ((*(handle)->f_listen)(handle, ap, al, 0, 0))
+#define cs_listen_check(handle, ap, al, cf, cd) ((*(handle)->f_listen)(handle, ap, al, cf, cd))
+#define cs_accept(handle) ((*(handle)->f_accept)(handle))
+#define cs_close(handle) ((*(handle)->f_close)(handle))
+#define cs_create(type, blocking, proto) ((*type)(-1, blocking, proto))
+#define cs_createbysocket(sock, type, blocking, proto) \
+	((*type)(sock, blocking, proto))
+#define cs_type(handle) ((handle)->type)
+#define cs_fileno(handle) ((handle)->iofile)
+#define cs_stackerr(handle) ((handle)->stackerr)
+#define cs_getstate(handle) ((handle)->getstate)
+#define cs_errno(handle) ((handle)->cerrno)
+#define cs_getproto(handle) ((handle)->protocol)
+#define cs_addrstr(handle) ((*(handle)->f_addrstr)(handle))
+#define cs_straddr(handle, str) ((*(handle)->f_straddr)(handle, str))
+
+YAZ_EXPORT const char *cs_strerror(COMSTACK h);
+YAZ_EXPORT const char *cs_errmsg(int n);
+
+/*
+ * error management.
+ */
+
+#define CSNONE     0
+#define CSYSERR    1
+#define CSOUTSTATE 2
+#define CSNODATA   3
+#define CSWRONGBUF 4
+#define CSDENY     5
+
+/* backwards compatibility */
+#define CS_SR     PROTO_SR
+#define CS_Z3950  PROTO_Z3950
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_attset.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_attset.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_attset.h	(revision 21083)
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef D1_ATTSET_H
+#define D1_ATTSET_H
+
+#include <yaz/oid.h>
+
+YAZ_BEGIN_CDECL
+
+/*
+ * This structure describes a attset, perhaps made up by inclusion
+ * (supersetting) of other attribute sets. When indexing and searching,
+ * we perform a normalisation, where we associate a given tag with
+ * the set that originally defined it, rather than the superset. This
+ * allows the most flexible access. Eg, the tags common to GILS and BIB-1
+ * should be searchable by both names.
+ */
+
+struct data1_attset;
+
+typedef struct data1_local_attribute
+{
+    int local;
+    struct data1_local_attribute *next;
+} data1_local_attribute;
+
+typedef struct data1_attset data1_attset;    
+typedef struct data1_att data1_att;
+typedef struct data1_attset_child data1_attset_child;
+
+struct data1_att
+{
+    data1_attset *parent;          /* attribute set */
+    char *name;                    /* symbolic name of this attribute */
+    int value;                     /* attribute value */
+    data1_local_attribute *locals; /* local index values */
+    data1_att *next;
+};
+
+struct data1_attset_child {
+    data1_attset *child;
+    data1_attset_child *next;
+};
+
+struct data1_attset
+{
+    char *name;          /* symbolic name */
+    oid_value reference;   /* external ID of attset */
+    data1_att *atts;          /* attributes */
+    data1_attset_child *children;  /* included attset */
+    data1_attset *next;       /* next in cache */
+};
+
+typedef struct data1_handle_info *data1_handle;
+
+YAZ_EXPORT data1_att *data1_getattbyname(data1_handle dh, data1_attset *s,
+					 char *name);
+YAZ_EXPORT data1_attset *data1_read_attset(data1_handle dh, const char *file);
+
+YAZ_EXPORT data1_attset *data1_empty_attset(data1_handle dh);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_map.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_map.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/d1_map.h	(revision 21083)
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef D1_MAP_H
+#define D1_MAP_H
+
+YAZ_BEGIN_CDECL
+
+typedef struct data1_maptag
+{
+    int new_field;
+    int type;
+#define D1_MAPTAG_numeric 1
+#define D1_MAPTAG_string 2
+    int which;
+    union
+    {
+	int numeric;
+	char *string;
+    } value;
+    struct data1_maptag *next;
+} data1_maptag;
+
+typedef struct data1_mapunit
+{
+    int no_data;
+    char *source_element_name;
+    data1_maptag *target_path;
+    struct data1_mapunit *next;
+} data1_mapunit;
+
+typedef struct data1_maptab
+{
+    char *name;
+    oid_value target_absyn_ref;
+    char *target_absyn_name;
+    data1_mapunit *map;
+    struct data1_maptab *next;
+} data1_maptab;
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/data1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/data1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/data1.h	(revision 21083)
@@ -0,0 +1,584 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:35  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.3  2000/01/04 17:46:17  ian
+ * Added function to count occurences of a tag spec in a data1 tree.
+ *
+ * Revision 1.2  1999/12/21 14:16:19  ian
+ * Changed retrieval module to allow data1 trees with no associated absyn.
+ * Also added a simple interface for extracting values from data1 trees using
+ * a string based tagpath.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.42  1999/10/21 12:06:28  adam
+ * Retrieval module no longer uses ctype.h - functions.
+ *
+ * Revision 1.41  1999/07/13 13:23:47  adam
+ * Non-recursive version of data1_read_node. data1_read_nodex reads
+ * stream of bytes (instead of buffer in memory).
+ *
+ * Revision 1.40  1998/11/03 10:14:12  adam
+ * Changed definition of data1 node so that it uses less space.
+ *
+ * Revision 1.39  1998/10/28 15:10:06  adam
+ * Added --with-yc option to configure. For the data1_node in data1.h:
+ * decreased size of localdata and removed member "line" which wasn't useful.
+ *
+ * Revision 1.38  1998/10/15 08:29:15  adam
+ * Tag set type may be specified in reference to it using "tagset"
+ * directive in .abs-files and "include" directive in .tag-files.
+ *
+ * Revision 1.37  1998/10/13 16:09:46  adam
+ * Added support for arbitrary OID's for tagsets, schemas and attribute sets.
+ * Added support for multiple attribute set references and tagset references
+ * from an abstract syntax file.
+ * Fixed many bad logs-calls in routines that read the various
+ * specifications regarding data1 (*.abs,*.att,...) and made the messages
+ * consistent whenever possible.
+ * Added extra 'lineno' argument to function readconf_line.
+ *
+ * Revision 1.36  1998/05/18 13:06:57  adam
+ * Changed the way attribute sets are handled by the retriaval module.
+ * Extended Explain conversion / schema.
+ * Modified server and client to work with ASN.1 compiled protocol handlers.
+ *
+ * Revision 1.35  1998/03/05 08:15:32  adam
+ * Implemented data1_add_insert_taggeddata utility which is more flexible
+ * than data1_insert_taggeddata.
+ *
+ * Revision 1.34  1998/02/27 14:08:04  adam
+ * Added const to some char pointer arguments.
+ * Reworked data1_read_node so that it doesn't create a tree with
+ * pointers to original "SGML"-buffer.
+ *
+ * Revision 1.33  1997/12/18 10:51:30  adam
+ * Implemented sub-trees feature for schemas - including forward
+ * references.
+ *
+ * Revision 1.32  1997/12/09 16:18:16  adam
+ * Work on EXPLAIN schema. First implementation of sub-schema facility
+ * in the *.abs files.
+ *
+ * Revision 1.31  1997/11/18 09:51:08  adam
+ * Removed element num_children from data1_node. Minor changes in
+ * data1 to Explain.
+ *
+ * Revision 1.30  1997/10/31 12:20:07  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.29  1997/10/27 13:54:18  adam
+ * Changed structure field in data1 node to be simple string which
+ * is "unknown" to the retrieval system itself.
+ *
+ * Revision 1.28  1997/10/06 09:37:53  adam
+ * Added prototype for data1_get_map_buf.
+ *
+ * Revision 1.27  1997/09/24 13:35:44  adam
+ * Added two members to data1_marctab to ease reading of weird MARC records.
+ *
+ * Revision 1.26  1997/09/17 12:10:32  adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.25  1997/09/05 09:50:55  adam
+ * Removed global data1_tabpath - uses data1_get_tabpath() instead.
+ *
+ * Revision 1.24  1997/09/01 09:30:39  adam
+ * Added include of yaz-util.h.
+ *
+ * Revision 1.23  1997/09/01 08:58:04  adam
+ * Removed declaration of data1_matchstr since it's a macro.
+ *
+ * Revision 1.22  1997/09/01 08:49:48  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.21  1997/05/14 06:53:38  adam
+ * C++ support.
+ *
+ * Revision 1.20  1996/10/29 13:34:39  adam
+ * New functions to get/set data1_tabpath.
+ *
+ * Revision 1.19  1996/10/11 11:57:16  quinn
+ * Smallish
+ *
+ * Revision 1.18  1996/10/07  15:29:16  quinn
+ * Added SOIF support
+ *
+ * Revision 1.17  1996/07/06  19:58:32  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.16  1996/06/10  08:55:34  quinn
+ * Added Summary. Unfinished work
+ *
+ * Revision 1.15  1996/06/03  09:46:03  quinn
+ * Added OID type.
+ *
+ * Revision 1.14  1996/05/09  07:27:11  quinn
+ * Multiple local values supported.
+ *
+ * Revision 1.13  1996/02/20  16:32:48  quinn
+ * Created util file.
+ *
+ * Revision 1.12  1996/01/18  09:46:34  adam
+ * Changed prototype for reader function parsed to data1_read_record.
+ *
+ * Revision 1.11  1995/12/15  16:19:45  quinn
+ * Added formatted_text.
+ *
+ * Revision 1.10  1995/12/14  11:09:43  quinn
+ * Work on Explain
+ *
+ * Revision 1.9  1995/12/13  15:32:47  quinn
+ * Added sgml-output.
+ *
+ * Revision 1.8  1995/12/13  13:44:23  quinn
+ * Modified Data1-system to use nmem
+ *
+ * Revision 1.7  1995/12/12  16:37:05  quinn
+ * Added destroy element to data1_node.
+ *
+ * Revision 1.6  1995/12/11  15:22:12  quinn
+ * Added last_child field to the node.
+ *
+ * Revision 1.5  1995/12/05  14:26:40  quinn
+ * Added global lbuf to data1_node.
+ *
+ * Revision 1.4  1995/11/13  09:27:29  quinn
+ * Fiddling with the variant stuff.
+ *
+ * Revision 1.3  1995/11/01  16:34:52  quinn
+ * Making data1 look for tables in data1_tabpath
+ *
+ * Revision 1.2  1995/11/01  13:54:35  quinn
+ * Minor adjustments
+ *
+ * Revision 1.1  1995/11/01  13:07:18  quinn
+ * Data1 module now lives in YAZ.
+ *
+ * Revision 1.13  1995/10/25  16:00:49  quinn
+ * USMARC support is now almost operational
+ *
+ * Revision 1.12  1995/10/16  14:02:59  quinn
+ * Changes to support element set names and espec1
+ *
+ * Revision 1.11  1995/10/13  16:05:10  quinn
+ * Adding Espec1-processing
+ *
+ * Revision 1.10  1995/10/11  14:53:46  quinn
+ * Work on variants.
+ *
+ * Revision 1.9  1995/10/10  16:27:59  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.8  1995/10/06  16:44:14  quinn
+ * Work on attribute set mapping, etc.
+ *
+ * Revision 1.7  1995/10/06  12:58:36  quinn
+ * SUTRS support
+ *
+ * Revision 1.6  1995/10/04  09:29:51  quinn
+ * Adjustments to support USGS test data
+ *
+ * Revision 1.5  1995/10/03  17:56:44  quinn
+ * Fixing GRS code.
+ *
+ * Revision 1.4  1995/10/02  14:55:43  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.3  1995/09/15  14:41:43  quinn
+ * GRS1 work
+ *
+ * Revision 1.2  1995/09/14  15:18:14  quinn
+ * Work
+ *
+ * Revision 1.1  1995/09/12  11:24:33  quinn
+ * Beginning to add code for structured records.
+ *
+ *
+ */
+
+#ifndef DATA1_H
+#define DATA1_H
+
+#include <stdio.h>
+
+#include <yaz/nmem.h>
+#include <yaz/oid.h>
+#include <yaz/proto.h>
+
+#include <yaz/d1_attset.h>
+#include <yaz/d1_map.h>
+#include <yaz/yaz-util.h>
+#include <yaz/wrbuf.h>
+
+#define d1_isspace(c) strchr(" \r\n\t\f", c)
+#define d1_isdigit(c) ((c) <= '9' && (c) >= '0')
+
+YAZ_BEGIN_CDECL
+
+#define data1_matchstr(s1, s2) yaz_matchstr(s1, s2)
+
+#define DATA1_MAX_SYMBOL 31
+
+typedef struct data1_name
+{
+    char *name;
+    struct data1_name *next;
+} data1_name;
+
+typedef struct data1_absyn_cache_info *data1_absyn_cache;
+typedef struct data1_attset_cache_info *data1_attset_cache;
+
+typedef enum data1_datatype
+{
+    DATA1K_unknown,
+    DATA1K_structured,
+    DATA1K_string,
+    DATA1K_numeric,
+    DATA1K_bool,
+    DATA1K_oid,
+    DATA1K_generalizedtime,
+    DATA1K_intunit,
+    DATA1K_int,
+    DATA1K_octetstring,
+    DATA1K_null
+} data1_datatype;
+
+typedef struct data1_marctab
+{
+    char *name;
+    oid_value reference;
+
+    char record_status[2];
+    char implementation_codes[5];
+    int  indicator_length;
+    int  identifier_length;
+    char user_systems[4];
+
+    int  length_data_entry;
+    int  length_starting;
+    int  length_implementation;
+    char future_use[2];
+
+    int  force_indicator_length;
+    int  force_identifier_length;
+    struct data1_marctab *next;
+} data1_marctab;
+
+typedef struct data1_esetname
+{
+    char *name;
+    Z_Espec1 *spec;
+    struct data1_esetname *next;
+} data1_esetname;
+
+/*
+ * Variant set definitions.
+ */
+
+typedef struct data1_vartype
+{
+    char *name;
+    struct data1_varclass *zclass;
+    int type;
+    data1_datatype datatype;
+    struct data1_vartype *next;
+} data1_vartype;
+
+typedef struct data1_varclass
+{
+    char *name;
+    struct data1_varset *set;
+    int zclass;
+    data1_vartype *types;
+    struct data1_varclass *next;
+} data1_varclass;
+
+typedef struct data1_varset
+{
+    char *name;
+    oid_value reference;
+    data1_varclass *classes;
+} data1_varset;
+
+/*
+ * Tagset definitions
+ */
+
+struct data1_tagset;
+
+typedef struct data1_tag
+{
+    data1_name *names;
+#define DATA1T_numeric 1
+#define DATA1T_string 2
+    int which;
+    union
+    {
+	int numeric;
+	char *string;
+    } value;
+    data1_datatype kind;
+
+    struct data1_tagset *tagset;
+    struct data1_tag *next;
+} data1_tag;
+
+typedef struct data1_tagset data1_tagset;
+
+struct data1_tagset
+{
+    int type;                        /* type of tagset in current context */
+    char *name;                      /* symbolic name */
+    oid_value reference;
+    data1_tag *tags;                 /* tags defined by this set */
+    data1_tagset *children;          /* children */
+    data1_tagset *next;              /* sibling */
+};
+
+typedef struct data1_termlist
+{
+    data1_att *att;
+    char *structure;
+    struct data1_termlist *next;
+} data1_termlist;
+
+/*
+ * abstract syntax specification
+ */
+
+typedef struct data1_element
+{
+    char *name;
+    data1_tag *tag;
+    data1_termlist *termlists;
+    char *sub_name;
+    struct data1_element *children;
+    struct data1_element *next;
+} data1_element;
+
+typedef struct data1_sub_elements {
+    char *name;
+    struct data1_sub_elements *next;
+    data1_element *elements;
+} data1_sub_elements;
+
+typedef struct data1_absyn
+{
+    char *name;
+    oid_value reference;
+    data1_tagset *tagset;
+    data1_attset *attset;
+    data1_varset *varset;
+    data1_esetname *esetnames;
+    data1_maptab *maptabs;
+    data1_marctab *marc;
+    data1_sub_elements *sub_elements;
+    data1_element *main_elements;
+} data1_absyn;
+
+/*
+ * record data node (tag/data/variant)
+ */
+
+typedef struct data1_node
+{
+    /* the root of a record (containing global data) */
+#define DATA1N_root 1 
+    /* a tag */
+#define DATA1N_tag  2       
+    /* some data under a leaf tag or variant */
+#define DATA1N_data 3
+    /* variant specification (a triple, actually) */
+#define DATA1N_variant 4
+    int which;
+
+    union
+    {
+	struct
+	{
+	    char *type;
+	    data1_absyn *absyn;  /* abstract syntax for this type */
+	} root;
+
+	struct 
+	{
+	    char *tag;
+	    data1_element *element;
+	    int no_data_requested;
+	    int get_bytes;
+	    unsigned node_selected : 1;
+	    unsigned make_variantlist : 1;
+	} tag;
+
+	struct
+	{
+	    char *data;      /* filename or data */
+	    int len;
+        /* text inclusion */
+#define DATA1I_inctxt 1
+        /* binary data inclusion */
+#define DATA1I_incbin 2
+        /* text data */
+#define DATA1I_text 3 
+        /* numerical data */
+#define DATA1I_num 4
+        /* object identifier */
+#define DATA1I_oid 5         
+            unsigned what:7;
+	    unsigned formatted_text : 1;   /* newlines are significant */
+	} data;
+
+	struct
+	{
+	    data1_vartype *type;
+	    char *value;
+	} variant;
+    } u;
+
+    void (*destroy)(struct data1_node *n);
+#define DATA1_LOCALDATA 12
+    char lbuf[DATA1_LOCALDATA]; /* small buffer for local data */
+    struct data1_node *next;
+    struct data1_node *child;
+    struct data1_node *last_child;
+    struct data1_node *parent;
+    struct data1_node *root;
+} data1_node;
+
+YAZ_EXPORT data1_handle data1_create (void);
+YAZ_EXPORT void data1_destroy(data1_handle dh);
+YAZ_EXPORT data1_node *get_parent_tag(data1_handle dh, data1_node *n);
+YAZ_EXPORT data1_node *data1_read_node(data1_handle dh, const char **buf,
+				       NMEM m);
+YAZ_EXPORT data1_node *data1_read_nodex (data1_handle dh, NMEM m,
+					 int (*get_byte)(void *fh), void *fh,
+					 WRBUF wrbuf);
+YAZ_EXPORT data1_node *data1_read_record(data1_handle dh, 
+					 int (*rf)(void *, char *, size_t),
+					 void *fh, NMEM m);
+YAZ_EXPORT data1_absyn *data1_read_absyn(data1_handle dh, const char *file);
+YAZ_EXPORT data1_tag *data1_gettagbynum(data1_handle dh,
+					data1_tagset *s,
+					int type, int value);
+YAZ_EXPORT data1_tagset *data1_empty_tagset (data1_handle dh);
+YAZ_EXPORT data1_tagset *data1_read_tagset(data1_handle dh, 
+					   const char *file,
+					   int type);
+YAZ_EXPORT data1_element *data1_getelementbytagname(data1_handle dh, 
+						    data1_absyn *abs,
+						    data1_element *parent,
+						    const char *tagname);
+YAZ_EXPORT Z_GenericRecord *data1_nodetogr(data1_handle dh, data1_node *n,
+					   int select, ODR o,
+					   int *len);
+YAZ_EXPORT data1_tag *data1_gettagbyname(data1_handle dh, data1_tagset *s,
+					 const char *name);
+YAZ_EXPORT void data1_free_tree(data1_handle dh, data1_node *t);
+YAZ_EXPORT char *data1_nodetobuf(data1_handle dh, data1_node *n,
+				 int select, int *len);
+YAZ_EXPORT data1_node *data1_insert_taggeddata(data1_handle dh,
+					       data1_node *root,
+					       data1_node *at,
+					       const char *tagname, NMEM m);
+YAZ_EXPORT data1_node *data1_add_taggeddata(data1_handle dh, data1_node *root,
+					    data1_node *at,
+					    const char *tagname, NMEM m);
+YAZ_EXPORT data1_datatype data1_maptype(data1_handle dh, char *t);
+YAZ_EXPORT data1_varset *data1_read_varset(data1_handle dh, const char *file);
+YAZ_EXPORT data1_vartype *data1_getvartypebyct(data1_handle dh,
+					       data1_varset *set,
+					       char *zclass, char *type);
+YAZ_EXPORT Z_Espec1 *data1_read_espec1(data1_handle dh, const char *file);
+YAZ_EXPORT int data1_doespec1(data1_handle dh, data1_node *n, Z_Espec1 *e);
+YAZ_EXPORT data1_esetname *data1_getesetbyname(data1_handle dh, 
+					       data1_absyn *a,
+					       const char *name);
+YAZ_EXPORT data1_element *data1_getelementbyname(data1_handle dh,
+						 data1_absyn *absyn,
+						 const char *name);
+YAZ_EXPORT data1_node *data1_mk_node(data1_handle dh, NMEM m);
+YAZ_EXPORT data1_absyn *data1_get_absyn(data1_handle dh, const char *name);
+YAZ_EXPORT data1_attset *data1_get_attset (data1_handle dh, const char *name);
+YAZ_EXPORT data1_maptab *data1_read_maptab(data1_handle dh, const char *file);
+YAZ_EXPORT data1_node *data1_map_record(data1_handle dh, data1_node *n,
+					data1_maptab *map, NMEM m);
+YAZ_EXPORT data1_marctab *data1_read_marctab (data1_handle dh,
+					      const char *file);
+YAZ_EXPORT char *data1_nodetomarc(data1_handle dh, data1_marctab *p,
+				  data1_node *n, int selected, int *len);
+YAZ_EXPORT char *data1_nodetoidsgml(data1_handle dh, data1_node *n,
+				    int select, int *len);
+YAZ_EXPORT Z_ExplainRecord *data1_nodetoexplain(data1_handle dh,
+						data1_node *n, int select,
+						ODR o);
+YAZ_EXPORT Z_BriefBib *data1_nodetosummary(data1_handle dh, 
+					   data1_node *n, int select,
+					   ODR o);
+YAZ_EXPORT char *data1_nodetosoif(data1_handle dh, data1_node *n, int select,
+				  int *len);
+YAZ_EXPORT void data1_set_tabpath(data1_handle dh, const char *path);
+YAZ_EXPORT const char *data1_get_tabpath(data1_handle dh);
+
+YAZ_EXPORT WRBUF data1_get_wrbuf (data1_handle dp);
+YAZ_EXPORT char **data1_get_read_buf (data1_handle dp, int **lenp);
+YAZ_EXPORT char **data1_get_map_buf (data1_handle dp, int **lenp);
+YAZ_EXPORT data1_absyn_cache *data1_absyn_cache_get (data1_handle dh);
+YAZ_EXPORT data1_attset_cache *data1_attset_cache_get (data1_handle dh);
+YAZ_EXPORT NMEM data1_nmem_get (data1_handle dh);
+YAZ_EXPORT void data1_pr_tree (data1_handle dh, data1_node *n, FILE *out);
+YAZ_EXPORT char *data1_insert_string (data1_handle dh, data1_node *res,
+				      NMEM m, const char *str);
+YAZ_EXPORT data1_node *data1_read_sgml (data1_handle dh, NMEM m,
+					const char *buf);
+YAZ_EXPORT void data1_absyn_trav (data1_handle dh, void *handle,
+				  void (*fh)(data1_handle dh,
+					     void *h, data1_absyn *a));
+
+YAZ_EXPORT data1_attset *data1_attset_search_id (data1_handle dh, int id);
+
+YAZ_EXPORT data1_node 
+*data1_add_insert_taggeddata(data1_handle dh, data1_node *root,
+                             data1_node *at, const char *tagname, NMEM m,
+                             int first_flag, int local_allowed);
+
+YAZ_EXPORT char *data1_getNodeValue(data1_node* node, char* pTagPath);
+YAZ_EXPORT data1_node *data1_LookupNode(data1_node* node, char* pTagPath);
+YAZ_EXPORT int data1_CountOccurences(data1_node* node, char* pTagPath);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/diagbib1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/diagbib1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/diagbib1.h	(revision 21083)
@@ -0,0 +1,71 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:35  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1997/09/01 08:49:48  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.5  1997/05/14 06:53:39  adam
+ * C++ support.
+ *
+ * Revision 1.4  1995/09/29 17:12:02  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:47  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:50:30  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/30  09:39:40  quinn
+ * Moved .h files to include directory
+ *
+ * Revision 1.1  1995/03/15  13:46:09  adam
+ * New function diagbib1_str.
+ *
+ */
+
+#ifndef DIAGBIB1_H
+#define DIAGBIB1_H
+
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT const char *diagbib1_str (int code);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill-core.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill-core.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill-core.h	(revision 21083)
@@ -0,0 +1,1329 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ISO-10161-ILL-1 */
+
+#ifndef ill_core_H
+#define ill_core_H
+
+#include <yaz/odr.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+typedef struct ILL_APDU ILL_APDU;
+YAZ_EXPORT int ill_APDU (ODR o, ILL_APDU **p, int opt, const char *name);
+
+typedef struct ILL_Request ILL_Request;
+YAZ_EXPORT int ill_Request (ODR o, ILL_Request **p, int opt, const char *name);
+
+typedef struct ILL_Forward_Notification ILL_Forward_Notification;
+YAZ_EXPORT int ill_Forward_Notification (ODR o, ILL_Forward_Notification **p, int opt, const char *name);
+
+typedef struct ILL_Shipped ILL_Shipped;
+YAZ_EXPORT int ill_Shipped (ODR o, ILL_Shipped **p, int opt, const char *name);
+
+typedef struct ILL_Answer ILL_Answer;
+YAZ_EXPORT int ill_Answer (ODR o, ILL_Answer **p, int opt, const char *name);
+
+typedef struct ILL_Conditional_Reply ILL_Conditional_Reply;
+YAZ_EXPORT int ill_Conditional_Reply (ODR o, ILL_Conditional_Reply **p, int opt, const char *name);
+
+typedef struct ILL_Cancel ILL_Cancel;
+YAZ_EXPORT int ill_Cancel (ODR o, ILL_Cancel **p, int opt, const char *name);
+
+typedef struct ILL_Cancel_Reply ILL_Cancel_Reply;
+YAZ_EXPORT int ill_Cancel_Reply (ODR o, ILL_Cancel_Reply **p, int opt, const char *name);
+
+typedef struct ILL_Received ILL_Received;
+YAZ_EXPORT int ill_Received (ODR o, ILL_Received **p, int opt, const char *name);
+
+typedef struct ILL_Recall ILL_Recall;
+YAZ_EXPORT int ill_Recall (ODR o, ILL_Recall **p, int opt, const char *name);
+
+typedef struct ILL_Returned ILL_Returned;
+YAZ_EXPORT int ill_Returned (ODR o, ILL_Returned **p, int opt, const char *name);
+
+typedef struct ILL_Checked_In ILL_Checked_In;
+YAZ_EXPORT int ill_Checked_In (ODR o, ILL_Checked_In **p, int opt, const char *name);
+
+typedef struct ILL_Overdue_Extension ILL_Overdue_Extension;
+YAZ_EXPORT int ill_Overdue_Extension (ODR o, ILL_Overdue_Extension **p, int opt, const char *name);
+
+typedef struct ILL_Overdue ILL_Overdue;
+YAZ_EXPORT int ill_Overdue (ODR o, ILL_Overdue **p, int opt, const char *name);
+
+typedef struct ILL_Renew ILL_Renew;
+YAZ_EXPORT int ill_Renew (ODR o, ILL_Renew **p, int opt, const char *name);
+
+typedef struct ILL_Renew_Answer ILL_Renew_Answer;
+YAZ_EXPORT int ill_Renew_Answer (ODR o, ILL_Renew_Answer **p, int opt, const char *name);
+
+typedef struct ILL_Lost ILL_Lost;
+YAZ_EXPORT int ill_Lost (ODR o, ILL_Lost **p, int opt, const char *name);
+
+typedef struct ILL_Damaged ILL_Damaged;
+YAZ_EXPORT int ill_Damaged (ODR o, ILL_Damaged **p, int opt, const char *name);
+
+typedef struct ILL_Message ILL_Message;
+YAZ_EXPORT int ill_Message (ODR o, ILL_Message **p, int opt, const char *name);
+
+typedef struct ILL_Status_Query ILL_Status_Query;
+YAZ_EXPORT int ill_Status_Query (ODR o, ILL_Status_Query **p, int opt, const char *name);
+
+typedef struct ILL_Status_Or_Error_Report ILL_Status_Or_Error_Report;
+YAZ_EXPORT int ill_Status_Or_Error_Report (ODR o, ILL_Status_Or_Error_Report **p, int opt, const char *name);
+
+typedef struct ILL_Expired ILL_Expired;
+YAZ_EXPORT int ill_Expired (ODR o, ILL_Expired **p, int opt, const char *name);
+
+typedef struct ILL_Already_Forwarded ILL_Already_Forwarded;
+YAZ_EXPORT int ill_Already_Forwarded (ODR o, ILL_Already_Forwarded **p, int opt, const char *name);
+
+typedef struct ILL_Already_Tried_List_Type ILL_Already_Tried_List_Type;
+YAZ_EXPORT int ill_Already_Tried_List_Type (ODR o, ILL_Already_Tried_List_Type **p, int opt, const char *name);
+
+typedef struct ILL_Amount ILL_Amount;
+YAZ_EXPORT int ill_Amount (ODR o, ILL_Amount **p, int opt, const char *name);
+
+typedef char  ILL_AmountString;
+YAZ_EXPORT int ill_AmountString (ODR o, ILL_AmountString **p, int opt, const char *name);
+
+typedef struct ILL_Client_Id ILL_Client_Id;
+YAZ_EXPORT int ill_Client_Id (ODR o, ILL_Client_Id **p, int opt, const char *name);
+
+typedef struct ILL_Conditional_Results ILL_Conditional_Results;
+YAZ_EXPORT int ill_Conditional_Results (ODR o, ILL_Conditional_Results **p, int opt, const char *name);
+
+typedef struct ILL_Cost_Info_Type ILL_Cost_Info_Type;
+YAZ_EXPORT int ill_Cost_Info_Type (ODR o, ILL_Cost_Info_Type **p, int opt, const char *name);
+
+typedef int  ILL_Current_State;
+YAZ_EXPORT int ill_Current_State (ODR o, ILL_Current_State **p, int opt, const char *name);
+
+typedef struct ILL_Damaged_DetailsSpecific_units ILL_Damaged_DetailsSpecific_units;
+YAZ_EXPORT int ill_Damaged_DetailsSpecific_units (ODR o, ILL_Damaged_DetailsSpecific_units **p, int opt, const char *name);
+
+typedef struct ILL_Damaged_Details ILL_Damaged_Details;
+YAZ_EXPORT int ill_Damaged_Details (ODR o, ILL_Damaged_Details **p, int opt, const char *name);
+
+typedef struct ILL_Date_Due ILL_Date_Due;
+YAZ_EXPORT int ill_Date_Due (ODR o, ILL_Date_Due **p, int opt, const char *name);
+
+typedef struct ILL_Delivery_Address ILL_Delivery_Address;
+YAZ_EXPORT int ill_Delivery_Address (ODR o, ILL_Delivery_Address **p, int opt, const char *name);
+
+typedef struct ILL_Delivery_ServiceElectronic_delivery ILL_Delivery_ServiceElectronic_delivery;
+YAZ_EXPORT int ill_Delivery_ServiceElectronic_delivery (ODR o, ILL_Delivery_ServiceElectronic_delivery **p, int opt, const char *name);
+
+typedef struct ILL_Delivery_Service ILL_Delivery_Service;
+YAZ_EXPORT int ill_Delivery_Service (ODR o, ILL_Delivery_Service **p, int opt, const char *name);
+
+typedef struct ILL_Electronic_Delivery_Service_0 ILL_Electronic_Delivery_Service_0;
+YAZ_EXPORT int ill_Electronic_Delivery_Service_0 (ODR o, ILL_Electronic_Delivery_Service_0 **p, int opt, const char *name);
+
+typedef struct ILL_Electronic_Delivery_Service_1 ILL_Electronic_Delivery_Service_1;
+YAZ_EXPORT int ill_Electronic_Delivery_Service_1 (ODR o, ILL_Electronic_Delivery_Service_1 **p, int opt, const char *name);
+
+typedef struct ILL_Electronic_Delivery_Service ILL_Electronic_Delivery_Service;
+YAZ_EXPORT int ill_Electronic_Delivery_Service (ODR o, ILL_Electronic_Delivery_Service **p, int opt, const char *name);
+
+typedef struct ILL_Error_Report ILL_Error_Report;
+YAZ_EXPORT int ill_Error_Report (ODR o, ILL_Error_Report **p, int opt, const char *name);
+
+typedef struct ILL_Estimate_Results ILL_Estimate_Results;
+YAZ_EXPORT int ill_Estimate_Results (ODR o, ILL_Estimate_Results **p, int opt, const char *name);
+
+typedef struct ILL_Extension ILL_Extension;
+YAZ_EXPORT int ill_Extension (ODR o, ILL_Extension **p, int opt, const char *name);
+
+typedef int  ILL_General_Problem;
+YAZ_EXPORT int ill_General_Problem (ODR o, ILL_General_Problem **p, int opt, const char *name);
+
+typedef struct ILL_History_Report ILL_History_Report;
+YAZ_EXPORT int ill_History_Report (ODR o, ILL_History_Report **p, int opt, const char *name);
+
+typedef struct ILL_Hold_Placed_Results ILL_Hold_Placed_Results;
+YAZ_EXPORT int ill_Hold_Placed_Results (ODR o, ILL_Hold_Placed_Results **p, int opt, const char *name);
+
+typedef int  ILL_APDU_Type;
+YAZ_EXPORT int ill_APDU_Type (ODR o, ILL_APDU_Type **p, int opt, const char *name);
+
+typedef int  ILL_Service_Type;
+YAZ_EXPORT int ill_Service_Type (ODR o, ILL_Service_Type **p, int opt, const char *name);
+
+typedef struct ILL_String ILL_String;
+YAZ_EXPORT int ill_String (ODR o, ILL_String **p, int opt, const char *name);
+
+typedef ILL_String  ILL_Account_Number;
+YAZ_EXPORT int ill_Account_Number (ODR o, ILL_Account_Number **p, int opt, const char *name);
+
+typedef int  ILL_Intermediary_Problem;
+YAZ_EXPORT int ill_Intermediary_Problem (ODR o, ILL_Intermediary_Problem **p, int opt, const char *name);
+
+typedef char  ILL_ISO_Date;
+YAZ_EXPORT int ill_ISO_Date (ODR o, ILL_ISO_Date **p, int opt, const char *name);
+
+typedef char  ILL_ISO_Time;
+YAZ_EXPORT int ill_ISO_Time (ODR o, ILL_ISO_Time **p, int opt, const char *name);
+
+typedef struct ILL_Item_Id ILL_Item_Id;
+YAZ_EXPORT int ill_Item_Id (ODR o, ILL_Item_Id **p, int opt, const char *name);
+
+typedef struct ILL_Location_Info ILL_Location_Info;
+YAZ_EXPORT int ill_Location_Info (ODR o, ILL_Location_Info **p, int opt, const char *name);
+
+typedef struct ILL_Locations_Results ILL_Locations_Results;
+YAZ_EXPORT int ill_Locations_Results (ODR o, ILL_Locations_Results **p, int opt, const char *name);
+
+typedef int  ILL_Medium_Type;
+YAZ_EXPORT int ill_Medium_Type (ODR o, ILL_Medium_Type **p, int opt, const char *name);
+
+typedef struct ILL_Name_Of_Person_Or_Institution ILL_Name_Of_Person_Or_Institution;
+YAZ_EXPORT int ill_Name_Of_Person_Or_Institution (ODR o, ILL_Name_Of_Person_Or_Institution **p, int opt, const char *name);
+
+typedef struct ILL_Person_Or_Institution_Symbol ILL_Person_Or_Institution_Symbol;
+YAZ_EXPORT int ill_Person_Or_Institution_Symbol (ODR o, ILL_Person_Or_Institution_Symbol **p, int opt, const char *name);
+
+typedef int  ILL_Place_On_Hold_Type;
+YAZ_EXPORT int ill_Place_On_Hold_Type (ODR o, ILL_Place_On_Hold_Type **p, int opt, const char *name);
+
+typedef struct ILL_Postal_Address ILL_Postal_Address;
+YAZ_EXPORT int ill_Postal_Address (ODR o, ILL_Postal_Address **p, int opt, const char *name);
+
+typedef struct ILL_Provider_Error_Report ILL_Provider_Error_Report;
+YAZ_EXPORT int ill_Provider_Error_Report (ODR o, ILL_Provider_Error_Report **p, int opt, const char *name);
+
+typedef int  ILL_Reason_Locs_Provided;
+YAZ_EXPORT int ill_Reason_Locs_Provided (ODR o, ILL_Reason_Locs_Provided **p, int opt, const char *name);
+
+typedef int  ILL_Reason_No_Report;
+YAZ_EXPORT int ill_Reason_No_Report (ODR o, ILL_Reason_No_Report **p, int opt, const char *name);
+
+typedef int  ILL_Reason_Unfilled;
+YAZ_EXPORT int ill_Reason_Unfilled (ODR o, ILL_Reason_Unfilled **p, int opt, const char *name);
+
+typedef int  ILL_Report_Source;
+YAZ_EXPORT int ill_Report_Source (ODR o, ILL_Report_Source **p, int opt, const char *name);
+
+typedef struct ILL_Requester_Optional_Messages_Type ILL_Requester_Optional_Messages_Type;
+YAZ_EXPORT int ill_Requester_Optional_Messages_Type (ODR o, ILL_Requester_Optional_Messages_Type **p, int opt, const char *name);
+
+typedef struct ILL_Responder_Optional_Messages_Type ILL_Responder_Optional_Messages_Type;
+YAZ_EXPORT int ill_Responder_Optional_Messages_Type (ODR o, ILL_Responder_Optional_Messages_Type **p, int opt, const char *name);
+
+typedef struct ILL_Retry_Results ILL_Retry_Results;
+YAZ_EXPORT int ill_Retry_Results (ODR o, ILL_Retry_Results **p, int opt, const char *name);
+
+typedef struct ILL_Search_Type ILL_Search_Type;
+YAZ_EXPORT int ill_Search_Type (ODR o, ILL_Search_Type **p, int opt, const char *name);
+
+typedef ILL_String  ILL_Security_Problem;
+YAZ_EXPORT int ill_Security_Problem (ODR o, ILL_Security_Problem **p, int opt, const char *name);
+
+typedef struct ILL_Send_To_List_Type_s ILL_Send_To_List_Type_s;
+YAZ_EXPORT int ill_Send_To_List_Type_s (ODR o, ILL_Send_To_List_Type_s **p, int opt, const char *name);
+
+typedef struct ILL_Send_To_List_Type ILL_Send_To_List_Type;
+YAZ_EXPORT int ill_Send_To_List_Type (ODR o, ILL_Send_To_List_Type **p, int opt, const char *name);
+
+typedef struct ILL_Service_Date_this ILL_Service_Date_this;
+YAZ_EXPORT int ill_Service_Date_this (ODR o, ILL_Service_Date_this **p, int opt, const char *name);
+
+typedef struct ILL_Service_Date_original ILL_Service_Date_original;
+YAZ_EXPORT int ill_Service_Date_original (ODR o, ILL_Service_Date_original **p, int opt, const char *name);
+
+typedef struct ILL_Service_Date_Time ILL_Service_Date_Time;
+YAZ_EXPORT int ill_Service_Date_Time (ODR o, ILL_Service_Date_Time **p, int opt, const char *name);
+
+typedef ILL_Service_Type  ILL_Shipped_Service_Type;
+YAZ_EXPORT int ill_Shipped_Service_Type (ODR o, ILL_Shipped_Service_Type **p, int opt, const char *name);
+
+typedef struct ILL_State_Transition_Prohibited ILL_State_Transition_Prohibited;
+YAZ_EXPORT int ill_State_Transition_Prohibited (ODR o, ILL_State_Transition_Prohibited **p, int opt, const char *name);
+
+typedef struct ILL_Status_Report ILL_Status_Report;
+YAZ_EXPORT int ill_Status_Report (ODR o, ILL_Status_Report **p, int opt, const char *name);
+
+typedef struct ILL_Supplemental_Item_Description ILL_Supplemental_Item_Description;
+YAZ_EXPORT int ill_Supplemental_Item_Description (ODR o, ILL_Supplemental_Item_Description **p, int opt, const char *name);
+
+typedef struct ILL_Supply_Details ILL_Supply_Details;
+YAZ_EXPORT int ill_Supply_Details (ODR o, ILL_Supply_Details **p, int opt, const char *name);
+
+typedef struct ILL_Supply_Medium_Info_Type ILL_Supply_Medium_Info_Type;
+YAZ_EXPORT int ill_Supply_Medium_Info_Type (ODR o, ILL_Supply_Medium_Info_Type **p, int opt, const char *name);
+
+typedef int  ILL_Supply_Medium_Type;
+YAZ_EXPORT int ill_Supply_Medium_Type (ODR o, ILL_Supply_Medium_Type **p, int opt, const char *name);
+
+typedef struct ILL_System_Address ILL_System_Address;
+YAZ_EXPORT int ill_System_Address (ODR o, ILL_System_Address **p, int opt, const char *name);
+
+typedef struct ILL_System_Id ILL_System_Id;
+YAZ_EXPORT int ill_System_Id (ODR o, ILL_System_Id **p, int opt, const char *name);
+
+typedef struct ILL_Third_Party_Info_Type ILL_Third_Party_Info_Type;
+YAZ_EXPORT int ill_Third_Party_Info_Type (ODR o, ILL_Third_Party_Info_Type **p, int opt, const char *name);
+
+typedef struct ILL_Transaction_Id ILL_Transaction_Id;
+YAZ_EXPORT int ill_Transaction_Id (ODR o, ILL_Transaction_Id **p, int opt, const char *name);
+
+typedef int  ILL_Transaction_Id_Problem;
+YAZ_EXPORT int ill_Transaction_Id_Problem (ODR o, ILL_Transaction_Id_Problem **p, int opt, const char *name);
+
+typedef int  ILL_Transaction_Results;
+YAZ_EXPORT int ill_Transaction_Results (ODR o, ILL_Transaction_Results **p, int opt, const char *name);
+
+typedef int  ILL_Transaction_Type;
+YAZ_EXPORT int ill_Transaction_Type (ODR o, ILL_Transaction_Type **p, int opt, const char *name);
+
+typedef ILL_String  ILL_Transportation_Mode;
+YAZ_EXPORT int ill_Transportation_Mode (ODR o, ILL_Transportation_Mode **p, int opt, const char *name);
+
+typedef int  ILL_Unable_To_Perform;
+YAZ_EXPORT int ill_Unable_To_Perform (ODR o, ILL_Unable_To_Perform **p, int opt, const char *name);
+
+typedef struct ILL_Unfilled_Results ILL_Unfilled_Results;
+YAZ_EXPORT int ill_Unfilled_Results (ODR o, ILL_Unfilled_Results **p, int opt, const char *name);
+
+typedef struct ILL_Units_Per_Medium_Type ILL_Units_Per_Medium_Type;
+YAZ_EXPORT int ill_Units_Per_Medium_Type (ODR o, ILL_Units_Per_Medium_Type **p, int opt, const char *name);
+
+typedef struct ILL_User_Error_Report ILL_User_Error_Report;
+YAZ_EXPORT int ill_User_Error_Report (ODR o, ILL_User_Error_Report **p, int opt, const char *name);
+
+typedef struct ILL_Will_Supply_Results ILL_Will_Supply_Results;
+YAZ_EXPORT int ill_Will_Supply_Results (ODR o, ILL_Will_Supply_Results **p, int opt, const char *name);
+
+typedef char  ILL_EDIFACTString;
+YAZ_EXPORT int ill_EDIFACTString (ODR o, ILL_EDIFACTString **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct ILL_APDU {
+	int which;
+	union {
+		ILL_Request *ILL_Request;
+		ILL_Forward_Notification *Forward_Notification;
+		ILL_Shipped *Shipped;
+		ILL_Answer *ILL_Answer;
+		ILL_Conditional_Reply *Conditional_Reply;
+		ILL_Cancel *Cancel;
+		ILL_Cancel_Reply *Cancel_Reply;
+		ILL_Received *Received;
+		ILL_Recall *Recall;
+		ILL_Returned *Returned;
+		ILL_Checked_In *Checked_In;
+		ILL_Overdue *Overdue;
+		ILL_Renew *Renew;
+		ILL_Renew_Answer *Renew_Answer;
+		ILL_Lost *Lost;
+		ILL_Damaged *Damaged;
+		ILL_Message *Message;
+		ILL_Status_Query *Status_Query;
+		ILL_Status_Or_Error_Report *Status_Or_Error_Report;
+		ILL_Expired *Expired;
+#define ILL_APDU_ILL_Request 1
+#define ILL_APDU_Forward_Notification 2
+#define ILL_APDU_Shipped 3
+#define ILL_APDU_ILL_Answer 4
+#define ILL_APDU_Conditional_Reply 5
+#define ILL_APDU_Cancel 6
+#define ILL_APDU_Cancel_Reply 7
+#define ILL_APDU_Received 8
+#define ILL_APDU_Recall 9
+#define ILL_APDU_Returned 10
+#define ILL_APDU_Checked_In 11
+#define ILL_APDU_Overdue 12
+#define ILL_APDU_Renew 13
+#define ILL_APDU_Renew_Answer 14
+#define ILL_APDU_Lost 15
+#define ILL_APDU_Damaged 16
+#define ILL_APDU_Message 17
+#define ILL_APDU_Status_Query 18
+#define ILL_APDU_Status_Or_Error_Report 19
+#define ILL_APDU_Expired 20
+	} u;
+};
+
+struct ILL_Request {
+#define ILL_Request_version_1 1
+#define ILL_Request_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Transaction_Type *transaction_type;
+	ILL_Delivery_Address *delivery_address; /* OPT */
+	ILL_Delivery_Service *delivery_service; /* OPT */
+	ILL_Delivery_Address *billing_address; /* OPT */
+	int num_iLL_service_type;
+	ILL_Service_Type **iLL_service_type;
+	Odr_external *responder_specific_service; /* OPT */
+	ILL_Requester_Optional_Messages_Type *requester_optional_messages;
+	ILL_Search_Type *search_type; /* OPT */
+	int num_supply_medium_info_type;
+	ILL_Supply_Medium_Info_Type **supply_medium_info_type; /* OPT */
+	ILL_Place_On_Hold_Type *place_on_hold;
+	ILL_Client_Id *client_id; /* OPT */
+	ILL_Item_Id *item_id;
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_Cost_Info_Type *cost_info_type; /* OPT */
+	ILL_String *copyright_compliance; /* OPT */
+	ILL_Third_Party_Info_Type *third_party_info_type; /* OPT */
+	bool_t *retry_flag;
+	bool_t *forward_flag;
+	ILL_String *requester_note; /* OPT */
+	ILL_String *forward_note; /* OPT */
+	int num_iLL_request_extensions;
+	ILL_Extension **iLL_request_extensions; /* OPT */
+};
+
+struct ILL_Forward_Notification {
+#define ILL_Forward_Notification_version_1 1
+#define ILL_Forward_Notification_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id;
+	ILL_System_Address *responder_address; /* OPT */
+	ILL_System_Id *intermediary_id;
+	ILL_String *notification_note; /* OPT */
+	int num_forward_notification_extensions;
+	ILL_Extension **forward_notification_extensions; /* OPT */
+};
+
+struct ILL_Shipped {
+#define ILL_Shipped_version_1 1
+#define ILL_Shipped_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_System_Address *responder_address; /* OPT */
+	ILL_System_Id *intermediary_id; /* OPT */
+	ILL_System_Id *supplier_id; /* OPT */
+	ILL_Client_Id *client_id; /* OPT */
+	ILL_Transaction_Type *transaction_type;
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_Shipped_Service_Type *shipped_service_type;
+	ILL_Responder_Optional_Messages_Type *responder_optional_messages; /* OPT */
+	ILL_Supply_Details *supply_details;
+	ILL_Postal_Address *return_to_address; /* OPT */
+	ILL_String *responder_note; /* OPT */
+	int num_shipped_extensions;
+	ILL_Extension **shipped_extensions; /* OPT */
+};
+
+struct ILL_Answer {
+#define ILL_Answer_version_1 1
+#define ILL_Answer_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Transaction_Results *transaction_results;
+	int which;
+	union {
+		ILL_Conditional_Results *conditional_results;
+		ILL_Retry_Results *retry_results;
+		ILL_Unfilled_Results *unfilled_results;
+		ILL_Locations_Results *locations_results;
+		ILL_Will_Supply_Results *will_supply_results;
+		ILL_Hold_Placed_Results *hold_placed_results;
+		ILL_Estimate_Results *estimate_results;
+#define ILL_Answer_conditional_results 1
+#define ILL_Answer_retry_results 2
+#define ILL_Answer_unfilled_results 3
+#define ILL_Answer_locations_results 4
+#define ILL_Answer_will_supply_results 5
+#define ILL_Answer_hold_placed_results 6
+#define ILL_Answer_estimate_results 7
+	} u; /* OPT */
+	Odr_external *responder_specific_results; /* OPT */
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_Send_To_List_Type *send_to_list; /* OPT */
+	ILL_Already_Tried_List_Type *already_tried_list; /* OPT */
+	ILL_Responder_Optional_Messages_Type *responder_optional_messages; /* OPT */
+	ILL_String *responder_note; /* OPT */
+	int num_ill_answer_extensions;
+	ILL_Extension **ill_answer_extensions; /* OPT */
+};
+
+struct ILL_Conditional_Reply {
+#define ILL_Conditional_Reply_version_1 1
+#define ILL_Conditional_Reply_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	bool_t *answer;
+	ILL_String *requester_note; /* OPT */
+	int num_conditional_reply_extensions;
+	ILL_Extension **conditional_reply_extensions; /* OPT */
+};
+
+struct ILL_Cancel {
+#define ILL_Cancel_version_1 1
+#define ILL_Cancel_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_String *requester_note; /* OPT */
+	int num_cancel_extensions;
+	ILL_Extension **cancel_extensions; /* OPT */
+};
+
+struct ILL_Cancel_Reply {
+#define ILL_Cancel_Reply_version_1 1
+#define ILL_Cancel_Reply_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	bool_t *answer;
+	ILL_String *responder_note; /* OPT */
+	int num_cancel_reply_extensions;
+	ILL_Extension **cancel_reply_extensions; /* OPT */
+};
+
+struct ILL_Received {
+#define ILL_Received_version_1 1
+#define ILL_Received_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_System_Id *supplier_id; /* OPT */
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_ISO_Date *date_received;
+	ILL_Shipped_Service_Type *shipped_service_type;
+	ILL_String *requester_note; /* OPT */
+	int num_received_extensions;
+	ILL_Extension **received_extensions; /* OPT */
+};
+
+struct ILL_Recall {
+#define ILL_Recall_version_1 1
+#define ILL_Recall_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_String *responder_note; /* OPT */
+	int num_recall_extensions;
+	ILL_Extension **recall_extensions; /* OPT */
+};
+
+struct ILL_Returned {
+#define ILL_Returned_version_1 1
+#define ILL_Returned_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_ISO_Date *date_returned;
+	ILL_Transportation_Mode *returned_via; /* OPT */
+	ILL_Amount *insured_for; /* OPT */
+	ILL_String *requester_note; /* OPT */
+	int num_returned_extensions;
+	ILL_Extension **returned_extensions; /* OPT */
+};
+
+struct ILL_Checked_In {
+#define ILL_Checked_In_version_1 1
+#define ILL_Checked_In_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_ISO_Date *date_checked_in;
+	ILL_String *responder_note; /* OPT */
+	int num_checked_in_extensions;
+	ILL_Extension **checked_in_extensions; /* OPT */
+};
+
+struct ILL_Overdue_Extension {
+	int num;
+	ILL_Extension **elements;
+};
+
+struct ILL_Overdue {
+#define ILL_Overdue_version_1 1
+#define ILL_Overdue_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Date_Due *date_due;
+	ILL_String *responder_note; /* OPT */
+	ILL_Overdue_Extension *overdue_extensions; /* OPT */
+};
+
+struct ILL_Renew {
+#define ILL_Renew_version_1 1
+#define ILL_Renew_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_ISO_Date *desired_due_date; /* OPT */
+	ILL_String *requester_note; /* OPT */
+	int num_renew_extensions;
+	ILL_Extension **renew_extensions; /* OPT */
+};
+
+struct ILL_Renew_Answer {
+#define ILL_Renew_Answer_version_1 1
+#define ILL_Renew_Answer_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	bool_t *answer;
+	ILL_Date_Due *date_due; /* OPT */
+	ILL_String *responder_note; /* OPT */
+	int num_renew_answer_extensions;
+	ILL_Extension **renew_answer_extensions; /* OPT */
+};
+
+struct ILL_Lost {
+#define ILL_Lost_version_1 1
+#define ILL_Lost_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_String *note; /* OPT */
+	int num_lost_extensions;
+	ILL_Extension **lost_extensions; /* OPT */
+};
+
+struct ILL_Damaged {
+#define ILL_Damaged_version_1 1
+#define ILL_Damaged_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Damaged_Details *damaged_details; /* OPT */
+	ILL_String *note; /* OPT */
+	int num_damaged_extensions;
+	ILL_Extension **damaged_extensions; /* OPT */
+};
+
+struct ILL_Message {
+#define ILL_Message_version_1 1
+#define ILL_Message_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_String *note;
+	int num_message_extensions;
+	ILL_Extension **message_extensions; /* OPT */
+};
+
+struct ILL_Status_Query {
+#define ILL_Status_Query_version_1 1
+#define ILL_Status_Query_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_String *note; /* OPT */
+	int num_status_query_extensions;
+	ILL_Extension **status_query_extensions; /* OPT */
+};
+
+struct ILL_Status_Or_Error_Report {
+#define ILL_Status_Or_Error_Report_version_1 1
+#define ILL_Status_Or_Error_Report_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Reason_No_Report *reason_no_report; /* OPT */
+	ILL_Status_Report *status_report; /* OPT */
+	ILL_Error_Report *error_report; /* OPT */
+	ILL_String *note; /* OPT */
+	int num_status_or_error_report_extensions;
+	ILL_Extension **status_or_error_report_extensions; /* OPT */
+};
+
+struct ILL_Expired {
+#define ILL_Expired_version_1 1
+#define ILL_Expired_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id;
+	ILL_Service_Date_Time *service_date_time;
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	int num_expired_extensions;
+	ILL_Extension **expired_extensions; /* OPT */
+};
+
+
+
+struct ILL_Already_Forwarded {
+	ILL_System_Id *responder_id;
+	ILL_System_Address *responder_address; /* OPT */
+};
+
+struct ILL_Already_Tried_List_Type {
+	int num;
+	ILL_System_Id **elements;
+};
+
+struct ILL_Amount {
+	char *currency_code; /* OPT */
+	ILL_AmountString *monetary_value;
+};
+
+
+
+struct ILL_Client_Id {
+	ILL_String *client_name; /* OPT */
+	ILL_String *client_status; /* OPT */
+	ILL_String *client_identifier; /* OPT */
+};
+
+struct ILL_Conditional_Results {
+#define ILL_Conditional_Results_cost_exceeds_limit 13
+#define ILL_Conditional_Results_charges 14
+#define ILL_Conditional_Results_prepayment_required 15
+#define ILL_Conditional_Results_lacks_copyright_compliance 16
+#define ILL_Conditional_Results_library_use_only 22
+#define ILL_Conditional_Results_no_reproduction 23
+#define ILL_Conditional_Results_client_signature_required 24
+#define ILL_Conditional_Results_special_collections_supervision_required 25
+#define ILL_Conditional_Results_other 27
+#define ILL_Conditional_Results_responder_specific 28
+#define ILL_Conditional_Results_proposed_delivery_service 30
+	int *conditions;
+	ILL_ISO_Date *date_for_reply; /* OPT */
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+	ILL_Delivery_Service *proposed_delivery_service; /* OPT */
+};
+
+struct ILL_Cost_Info_Type {
+	ILL_Account_Number *account_number; /* OPT */
+	ILL_Amount *maximum_cost; /* OPT */
+	bool_t *reciprocal_agreement;
+	bool_t *will_pay_fee;
+	bool_t *payment_provided;
+};
+
+#define ILL_Current_State_nOT_SUPPLIED 1
+#define ILL_Current_State_pENDING 2
+#define ILL_Current_State_iN_PROCESS 3
+#define ILL_Current_State_fORWARD 4
+#define ILL_Current_State_cONDITIONAL 5
+#define ILL_Current_State_cANCEL_PENDING 6
+#define ILL_Current_State_cANCELLED 7
+#define ILL_Current_State_sHIPPED 8
+#define ILL_Current_State_rECEIVED 9
+#define ILL_Current_State_rENEW_PENDING 10
+#define ILL_Current_State_nOT_RECEIVED_OVERDUE 11
+#define ILL_Current_State_rENEW_OVERDUE 12
+#define ILL_Current_State_oVERDUE 13
+#define ILL_Current_State_rETURNED 14
+#define ILL_Current_State_cHECKED_IN 15
+#define ILL_Current_State_rECALL 16
+#define ILL_Current_State_lOST 17
+#define ILL_Current_State_uNKNOWN 18
+
+struct ILL_Damaged_DetailsSpecific_units {
+	int num;
+	int **elements;
+};
+
+struct ILL_Damaged_Details {
+	Odr_oid *document_type_id; /* OPT */
+	int which;
+	union {
+		Odr_null *complete_document;
+		ILL_Damaged_DetailsSpecific_units *specific_units;
+#define ILL_Damaged_Details_complete_document 1
+#define ILL_Damaged_Details_specific_units 2
+	} u;
+};
+
+struct ILL_Date_Due {
+	ILL_ISO_Date *date_due_field;
+	bool_t *renewable;
+};
+
+struct ILL_Delivery_Address {
+	ILL_Postal_Address *postal_address; /* OPT */
+	ILL_System_Address *electronic_address; /* OPT */
+};
+
+struct ILL_Delivery_ServiceElectronic_delivery {
+	int num;
+	ILL_Electronic_Delivery_Service **elements;
+};
+
+struct ILL_Delivery_Service {
+	int which;
+	union {
+		ILL_Transportation_Mode *physical_delivery;
+		ILL_Delivery_ServiceElectronic_delivery *electronic_delivery;
+#define ILL_Delivery_Service_physical_delivery 1
+#define ILL_Delivery_Service_electronic_delivery 2
+	} u;
+};
+
+struct ILL_Electronic_Delivery_Service_0 {
+	Odr_oid *e_delivery_mode;
+	Odr_any *e_delivery_parameters;
+};
+
+struct ILL_Electronic_Delivery_Service_1 {
+	Odr_oid *document_type_id;
+	Odr_any *document_type_parameters;
+};
+
+struct ILL_Electronic_Delivery_Service {
+	ILL_Electronic_Delivery_Service_0 *e_delivery_service; /* OPT */
+	ILL_Electronic_Delivery_Service_1 *document_type; /* OPT */
+	ILL_String *e_delivery_description; /* OPT */
+	int which;
+	union {
+		ILL_System_Address *e_delivery_address;
+		ILL_System_Id *e_delivery_id;
+#define ILL_Electronic_Delivery_Service_e_delivery_address 1
+#define ILL_Electronic_Delivery_Service_e_delivery_id 2
+	} u;
+	ILL_String *name_or_code; /* OPT */
+	ILL_ISO_Time *delivery_time; /* OPT */
+};
+
+struct ILL_Error_Report {
+	ILL_String *correlation_information;
+	ILL_Report_Source *report_source;
+	ILL_User_Error_Report *user_error_report; /* OPT */
+	ILL_Provider_Error_Report *provider_error_report; /* OPT */
+};
+
+struct ILL_Estimate_Results {
+	ILL_String *cost_estimate;
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+};
+
+struct ILL_Extension {
+	int *identifier;
+	bool_t *critical;
+	Odr_any *item;
+};
+
+#define ILL_General_Problem_unrecognized_APDU 1
+#define ILL_General_Problem_mistyped_APDU 2
+#define ILL_General_Problem_badly_structured_APDU 3
+#define ILL_General_Problem_protocol_version_not_supported 4
+#define ILL_General_Problem_other 5
+
+struct ILL_History_Report {
+	ILL_ISO_Date *date_requested; /* OPT */
+	ILL_String *author; /* OPT */
+	ILL_String *title; /* OPT */
+	ILL_String *author_of_article; /* OPT */
+	ILL_String *title_of_article; /* OPT */
+	ILL_ISO_Date *date_of_last_transition;
+#define ILL_History_Report_iLL_REQUEST 1
+#define ILL_History_Report_fORWARD 21
+#define ILL_History_Report_fORWARD_NOTIFICATION 2
+#define ILL_History_Report_sHIPPED 3
+#define ILL_History_Report_iLL_ANSWER 4
+#define ILL_History_Report_cONDITIONAL_REPLY 5
+#define ILL_History_Report_cANCEL 6
+#define ILL_History_Report_cANCEL_REPLY 7
+#define ILL_History_Report_rECEIVED 8
+#define ILL_History_Report_rECALL 9
+#define ILL_History_Report_rETURNED 10
+#define ILL_History_Report_cHECKED_IN 11
+#define ILL_History_Report_rENEW_ANSWER 14
+#define ILL_History_Report_lOST 15
+#define ILL_History_Report_dAMAGED 16
+#define ILL_History_Report_mESSAGE 17
+#define ILL_History_Report_sTATUS_QUERY 18
+#define ILL_History_Report_sTATUS_OR_ERROR_REPORT 19
+#define ILL_History_Report_eXPIRED 20
+	int *most_recent_service;
+	ILL_ISO_Date *date_of_most_recent_service;
+	ILL_System_Id *initiator_of_most_recent_service;
+	ILL_Shipped_Service_Type *shipped_service_type; /* OPT */
+	ILL_Transaction_Results *transaction_results; /* OPT */
+	ILL_String *most_recent_service_note; /* OPT */
+};
+
+struct ILL_Hold_Placed_Results {
+	ILL_ISO_Date *estimated_date_available;
+	ILL_Medium_Type *hold_placed_medium_type; /* OPT */
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+};
+
+#define ILL_APDU_Type_iLL_REQUEST 1
+#define ILL_APDU_Type_fORWARD_NOTIFICATION 2
+#define ILL_APDU_Type_sHIPPED 3
+#define ILL_APDU_Type_iLL_ANSWER 4
+#define ILL_APDU_Type_cONDITIONAL_REPLY 5
+#define ILL_APDU_Type_cANCEL 6
+#define ILL_APDU_Type_cANCEL_REPLY 7
+#define ILL_APDU_Type_rECEIVED 8
+#define ILL_APDU_Type_rECALL 9
+#define ILL_APDU_Type_rETURNED 10
+#define ILL_APDU_Type_cHECKED_IN 11
+#define ILL_APDU_Type_oVERDUE 12
+#define ILL_APDU_Type_rENEW 13
+#define ILL_APDU_Type_rENEW_ANSWER 14
+#define ILL_APDU_Type_lOST 15
+#define ILL_APDU_Type_dAMAGED 16
+#define ILL_APDU_Type_mESSAGE 17
+#define ILL_APDU_Type_sTATUS_QUERY 18
+#define ILL_APDU_Type_sTATUS_OR_ERROR_REPORT 19
+#define ILL_APDU_Type_eXPIRED 20
+
+#define ILL_Service_Type_loan 1
+#define ILL_Service_Type_copy_non_returnable 2
+#define ILL_Service_Type_locations 3
+#define ILL_Service_Type_estimate 4
+#define ILL_Service_Type_responder_specific 5
+
+struct ILL_String {
+	int which;
+	union {
+		char *GeneralString;
+		ILL_EDIFACTString *EDIFACTString;
+#define ILL_String_GeneralString 1
+#define ILL_String_EDIFACTString 2
+	} u;
+};
+
+#define ILL_Intermediary_Problem_cannot_send_onward 1
+
+
+
+
+
+struct ILL_Item_Id {
+#define ILL_Item_Id_monograph 1
+#define ILL_Item_Id_serial 2
+#define ILL_Item_Id_other 3
+	int *item_type; /* OPT */
+	ILL_Medium_Type *held_medium_type; /* OPT */
+	ILL_String *call_number; /* OPT */
+	ILL_String *author; /* OPT */
+	ILL_String *title; /* OPT */
+	ILL_String *sub_title; /* OPT */
+	ILL_String *sponsoring_body; /* OPT */
+	ILL_String *place_of_publication; /* OPT */
+	ILL_String *publisher; /* OPT */
+	ILL_String *series_title_number; /* OPT */
+	ILL_String *volume_issue; /* OPT */
+	ILL_String *edition; /* OPT */
+	ILL_String *publication_date; /* OPT */
+	ILL_String *publication_date_of_component; /* OPT */
+	ILL_String *author_of_article; /* OPT */
+	ILL_String *title_of_article; /* OPT */
+	ILL_String *pagination; /* OPT */
+	Odr_external *national_bibliography_no; /* OPT */
+	ILL_String *iSBN; /* OPT */
+	ILL_String *iSSN; /* OPT */
+	Odr_external *system_no; /* OPT */
+	ILL_String *additional_no_letters; /* OPT */
+	ILL_String *verification_reference_source; /* OPT */
+};
+
+struct ILL_Location_Info {
+	ILL_System_Id *location_id;
+	ILL_System_Address *location_address; /* OPT */
+	ILL_String *location_note; /* OPT */
+};
+
+struct ILL_Locations_Results {
+	ILL_Reason_Locs_Provided *reason_locs_provided; /* OPT */
+	int num_locations;
+	ILL_Location_Info **locations;
+};
+
+#define ILL_Medium_Type_printed 1
+#define ILL_Medium_Type_microform 3
+#define ILL_Medium_Type_film_or_video_recording 4
+#define ILL_Medium_Type_audio_recording 5
+#define ILL_Medium_Type_machine_readable 6
+#define ILL_Medium_Type_other 7
+
+struct ILL_Name_Of_Person_Or_Institution {
+	int which;
+	union {
+		ILL_String *name_of_person;
+		ILL_String *name_of_institution;
+#define ILL_Name_Of_Person_Or_Institution_name_of_person 1
+#define ILL_Name_Of_Person_Or_Institution_name_of_institution 2
+	} u;
+};
+
+struct ILL_Person_Or_Institution_Symbol {
+	int which;
+	union {
+		ILL_String *person_symbol;
+		ILL_String *institution_symbol;
+#define ILL_Person_Or_Institution_Symbol_person_symbol 1
+#define ILL_Person_Or_Institution_Symbol_institution_symbol 2
+	} u;
+};
+
+#define ILL_Place_On_Hold_Type_yes 1
+#define ILL_Place_On_Hold_Type_no 2
+#define ILL_Place_On_Hold_Type_according_to_responder_policy 3
+
+struct ILL_Postal_Address {
+	ILL_Name_Of_Person_Or_Institution *name_of_person_or_institution; /* OPT */
+	ILL_String *extended_postal_delivery_address; /* OPT */
+	ILL_String *street_and_number; /* OPT */
+	ILL_String *post_office_box; /* OPT */
+	ILL_String *city; /* OPT */
+	ILL_String *region; /* OPT */
+	ILL_String *country; /* OPT */
+	ILL_String *postal_code; /* OPT */
+};
+
+struct ILL_Provider_Error_Report {
+	int which;
+	union {
+		ILL_General_Problem *general_problem;
+		ILL_Transaction_Id_Problem *transaction_id_problem;
+		ILL_State_Transition_Prohibited *state_transition_prohibited;
+#define ILL_Provider_Error_Report_general_problem 1
+#define ILL_Provider_Error_Report_transaction_id_problem 2
+#define ILL_Provider_Error_Report_state_transition_prohibited 3
+	} u;
+};
+
+#define ILL_Reason_Locs_Provided_in_use_on_loan 1
+#define ILL_Reason_Locs_Provided_in_process 2
+#define ILL_Reason_Locs_Provided_lost 3
+#define ILL_Reason_Locs_Provided_non_circulating 4
+#define ILL_Reason_Locs_Provided_not_owned 5
+#define ILL_Reason_Locs_Provided_on_order 6
+#define ILL_Reason_Locs_Provided_volume_issue_not_yet_available 7
+#define ILL_Reason_Locs_Provided_at_bindery 8
+#define ILL_Reason_Locs_Provided_lacking 9
+#define ILL_Reason_Locs_Provided_not_on_shelf 10
+#define ILL_Reason_Locs_Provided_on_reserve 11
+#define ILL_Reason_Locs_Provided_poor_condition 12
+#define ILL_Reason_Locs_Provided_cost_exceeds_limit 13
+#define ILL_Reason_Locs_Provided_on_hold 19
+#define ILL_Reason_Locs_Provided_other 27
+#define ILL_Reason_Locs_Provided_responder_specific 28
+
+#define ILL_Reason_No_Report_temporary 1
+#define ILL_Reason_No_Report_permanent 2
+
+#define ILL_Reason_Unfilled_in_use_on_loan 1
+#define ILL_Reason_Unfilled_in_process 2
+#define ILL_Reason_Unfilled_lost 3
+#define ILL_Reason_Unfilled_non_circulating 4
+#define ILL_Reason_Unfilled_not_owned 5
+#define ILL_Reason_Unfilled_on_order 6
+#define ILL_Reason_Unfilled_volume_issue_not_yet_available 7
+#define ILL_Reason_Unfilled_at_bindery 8
+#define ILL_Reason_Unfilled_lacking 9
+#define ILL_Reason_Unfilled_not_on_shelf 10
+#define ILL_Reason_Unfilled_on_reserve 11
+#define ILL_Reason_Unfilled_poor_condition 12
+#define ILL_Reason_Unfilled_cost_exceeds_limit 13
+#define ILL_Reason_Unfilled_charges 14
+#define ILL_Reason_Unfilled_prepayment_required 15
+#define ILL_Reason_Unfilled_lacks_copyright_compliance 16
+#define ILL_Reason_Unfilled_not_found_as_cited 17
+#define ILL_Reason_Unfilled_locations_not_found 18
+#define ILL_Reason_Unfilled_on_hold 19
+#define ILL_Reason_Unfilled_policy_problem 20
+#define ILL_Reason_Unfilled_mandatory_messaging_not_supported 21
+#define ILL_Reason_Unfilled_expiry_not_supported 22
+#define ILL_Reason_Unfilled_requested_delivery_services_not_supported 23
+#define ILL_Reason_Unfilled_preferred_delivery_time_not_possible 24
+#define ILL_Reason_Unfilled_other 27
+#define ILL_Reason_Unfilled_responder_specific 28
+
+#define ILL_Report_Source_user 1
+#define ILL_Report_Source_provider 2
+
+struct ILL_Requester_Optional_Messages_Type {
+	bool_t *can_send_RECEIVED;
+	bool_t *can_send_RETURNED;
+#define ILL_Requester_Optional_Messages_Type_requires 1
+#define ILL_Requester_Optional_Messages_Type_desires 2
+#define ILL_Requester_Optional_Messages_Type_neither 3
+	int *requester_SHIPPED;
+#define ILL_Requester_Optional_Messages_Type_requires 1
+#define ILL_Requester_Optional_Messages_Type_desires 2
+#define ILL_Requester_Optional_Messages_Type_neither 3
+	int *requester_CHECKED_IN;
+};
+
+struct ILL_Responder_Optional_Messages_Type {
+	bool_t *can_send_SHIPPED;
+	bool_t *can_send_CHECKED_IN;
+#define ILL_Responder_Optional_Messages_Type_requires 1
+#define ILL_Responder_Optional_Messages_Type_desires 2
+#define ILL_Responder_Optional_Messages_Type_neither 3
+	int *responder_RECEIVED;
+#define ILL_Responder_Optional_Messages_Type_requires 1
+#define ILL_Responder_Optional_Messages_Type_desires 2
+#define ILL_Responder_Optional_Messages_Type_neither 3
+	int *responder_RETURNED;
+};
+
+struct ILL_Retry_Results {
+#define ILL_Retry_Results_in_use_on_loan 1
+#define ILL_Retry_Results_in_process 2
+#define ILL_Retry_Results_on_order 6
+#define ILL_Retry_Results_volume_issue_not_yet_available 7
+#define ILL_Retry_Results_at_bindery 8
+#define ILL_Retry_Results_cost_exceeds_limit 13
+#define ILL_Retry_Results_charges 14
+#define ILL_Retry_Results_prepayment_required 15
+#define ILL_Retry_Results_lacks_copyright_compliance 16
+#define ILL_Retry_Results_not_found_as_cited 17
+#define ILL_Retry_Results_on_hold 19
+#define ILL_Retry_Results_other 27
+#define ILL_Retry_Results_responder_specific 28
+	int *reason_not_available; /* OPT */
+	ILL_ISO_Date *retry_date; /* OPT */
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+};
+
+struct ILL_Search_Type {
+	ILL_String *level_of_service; /* OPT */
+	ILL_ISO_Date *need_before_date; /* OPT */
+#define ILL_Search_Type_need_Before_Date 1
+#define ILL_Search_Type_other_Date 2
+#define ILL_Search_Type_no_Expiry 3
+	int *expiry_flag;
+	ILL_ISO_Date *expiry_date; /* OPT */
+};
+
+
+
+struct ILL_Send_To_List_Type_s {
+	ILL_System_Id *system_id;
+	ILL_Account_Number *account_number; /* OPT */
+	ILL_System_Address *system_address; /* OPT */
+};
+
+struct ILL_Send_To_List_Type {
+	int num;
+	ILL_Send_To_List_Type_s **elements;
+};
+
+struct ILL_Service_Date_this {
+	ILL_ISO_Date *date;
+	ILL_ISO_Time *time; /* OPT */
+};
+
+struct ILL_Service_Date_original {
+	ILL_ISO_Date *date;
+	ILL_ISO_Time *time; /* OPT */
+};
+
+struct ILL_Service_Date_Time {
+	ILL_Service_Date_this *date_time_of_this_service;
+	ILL_Service_Date_original *date_time_of_original_service; /* OPT */
+};
+
+
+
+struct ILL_State_Transition_Prohibited {
+	ILL_APDU_Type *aPDU_type;
+	ILL_Current_State *current_state;
+};
+
+struct ILL_Status_Report {
+	ILL_History_Report *user_status_report;
+	ILL_Current_State *provider_status_report;
+};
+
+struct ILL_Supplemental_Item_Description {
+	int num;
+	Odr_external **elements;
+};
+
+struct ILL_Supply_Details {
+	ILL_ISO_Date *date_shipped; /* OPT */
+	ILL_Date_Due *date_due; /* OPT */
+	int *chargeable_units; /* OPT */
+	ILL_Amount *cost; /* OPT */
+#define ILL_Supply_Details_library_use_only 22
+#define ILL_Supply_Details_no_reproduction 23
+#define ILL_Supply_Details_client_signature_required 24
+#define ILL_Supply_Details_special_collections_supervision_required 25
+#define ILL_Supply_Details_other 27
+	int *shipped_conditions; /* OPT */
+	int which;
+	union {
+		ILL_Transportation_Mode *physical_delivery;
+		ILL_Electronic_Delivery_Service *electronic_delivery;
+#define ILL_Supply_Details_physical_delivery 1
+#define ILL_Supply_Details_electronic_delivery 2
+	} u; /* OPT */
+	ILL_Amount *insured_for; /* OPT */
+	ILL_Amount *return_insurance_require; /* OPT */
+	int num_no_of_units_per_medium;
+	ILL_Units_Per_Medium_Type **no_of_units_per_medium; /* OPT */
+};
+
+struct ILL_Supply_Medium_Info_Type {
+	ILL_Supply_Medium_Type *supply_medium_type;
+	ILL_String *medium_characteristics; /* OPT */
+};
+
+#define ILL_Supply_Medium_Type_printed 1
+#define ILL_Supply_Medium_Type_photocopy 2
+#define ILL_Supply_Medium_Type_microform 3
+#define ILL_Supply_Medium_Type_film_or_video_recording 4
+#define ILL_Supply_Medium_Type_audio_recording 5
+#define ILL_Supply_Medium_Type_machine_readable 6
+#define ILL_Supply_Medium_Type_other 7
+
+struct ILL_System_Address {
+	ILL_String *telecom_service_identifier; /* OPT */
+	ILL_String *telecom_service_address; /* OPT */
+};
+
+struct ILL_System_Id {
+	ILL_Person_Or_Institution_Symbol *person_or_institution_symbol; /* OPT */
+	ILL_Name_Of_Person_Or_Institution *name_of_person_or_institution; /* OPT */
+};
+
+struct ILL_Third_Party_Info_Type {
+	bool_t *permission_to_forward;
+	bool_t *permission_to_chain;
+	bool_t *permission_to_partition;
+	bool_t *permission_to_change_send_to_list;
+	ILL_System_Address *initial_requester_address; /* OPT */
+#define ILL_Third_Party_Info_Type_ordered 1
+#define ILL_Third_Party_Info_Type_unordered 2
+	int *preference;
+	ILL_Send_To_List_Type *send_to_list; /* OPT */
+	ILL_Already_Tried_List_Type *already_tried_list; /* OPT */
+};
+
+struct ILL_Transaction_Id {
+	ILL_System_Id *initial_requester_id; /* OPT */
+	ILL_String *transaction_group_qualifier;
+	ILL_String *transaction_qualifier;
+	ILL_String *sub_transaction_qualifier; /* OPT */
+};
+
+#define ILL_Transaction_Id_Problem_duplicate_transaction_id 1
+#define ILL_Transaction_Id_Problem_invalid_transaction_id 2
+#define ILL_Transaction_Id_Problem_unknown_transaction_id 3
+
+#define ILL_Transaction_Results_conditional 1
+#define ILL_Transaction_Results_retry 2
+#define ILL_Transaction_Results_unfilled 3
+#define ILL_Transaction_Results_locations_provided 4
+#define ILL_Transaction_Results_will_supply 5
+#define ILL_Transaction_Results_hold_placed 6
+#define ILL_Transaction_Results_estimate 7
+
+#define ILL_Transaction_Type_simple 1
+#define ILL_Transaction_Type_chained 2
+#define ILL_Transaction_Type_partitioned 3
+
+
+
+#define ILL_Unable_To_Perform_not_available 1
+#define ILL_Unable_To_Perform_resource_limitation 2
+#define ILL_Unable_To_Perform_other 3
+
+struct ILL_Unfilled_Results {
+	ILL_Reason_Unfilled *reason_unfilled;
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+};
+
+struct ILL_Units_Per_Medium_Type {
+	ILL_Supply_Medium_Type *medium;
+	int *no_of_units;
+};
+
+struct ILL_User_Error_Report {
+	int which;
+	union {
+		ILL_Already_Forwarded *already_forwarded;
+		ILL_Intermediary_Problem *intermediary_problem;
+		ILL_Security_Problem *security_problem;
+		ILL_Unable_To_Perform *unable_to_perform;
+#define ILL_User_Error_Report_already_forwarded 1
+#define ILL_User_Error_Report_intermediary_problem 2
+#define ILL_User_Error_Report_security_problem 3
+#define ILL_User_Error_Report_unable_to_perform 4
+	} u;
+};
+
+struct ILL_Will_Supply_Results {
+#define ILL_Will_Supply_Results_in_use_on_loan 1
+#define ILL_Will_Supply_Results_in_process 2
+#define ILL_Will_Supply_Results_on_order 6
+#define ILL_Will_Supply_Results_at_bindery 8
+#define ILL_Will_Supply_Results_on_hold 19
+#define ILL_Will_Supply_Results_being_processed_for_supply 26
+#define ILL_Will_Supply_Results_other 27
+#define ILL_Will_Supply_Results_responder_specific 28
+#define ILL_Will_Supply_Results_electronic_delivery 30
+	int *reason_will_supply;
+	ILL_ISO_Date *supply_date; /* OPT */
+	ILL_Postal_Address *return_to_address; /* OPT */
+	int num_locations;
+	ILL_Location_Info **locations; /* OPT */
+	ILL_Electronic_Delivery_Service *electronic_delivery_service; /* OPT */
+};
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/ill.h	(revision 21083)
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:37  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.3  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.2  2000/01/15 09:39:50  adam
+ * Implemented ill_get_ILLRequest. More ILL testing for client.
+ *
+ * Revision 1.1  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ */
+#ifndef ILL_H
+#define ILL_H
+
+#include <yaz/ill-core.h>
+#include <yaz/item-req.h>
+
+YAZ_BEGIN_CDECL
+
+struct ill_get_ctl {
+    ODR odr;
+    void *clientData;
+    const char *(*f)(void *clientData, const char *element);
+};
+    
+YAZ_EXPORT ILL_ItemRequest *ill_get_ItemRequest (
+    struct ill_get_ctl *gs, const char *name, const char *sub);
+
+YAZ_EXPORT ILL_Request *ill_get_ILLRequest (
+    struct ill_get_ctl *gs, const char *name, const char *sub);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/item-req.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/item-req.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/item-req.h	(revision 21083)
@@ -0,0 +1,58 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H Z39.50-extendedService-ItemOrder-ItemRequest-1 */
+
+#ifndef item_req_H
+#define item_req_H
+
+#include <yaz/odr.h>
+#include <yaz/ill-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct ILL_ItemRequest ILL_ItemRequest;
+YAZ_EXPORT int ill_ItemRequest (ODR o, ILL_ItemRequest **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct ILL_ItemRequest {
+#define ILL_ItemRequest_version_1 1
+#define ILL_ItemRequest_version_2 2
+	int *protocol_version_num;
+	ILL_Transaction_Id *transaction_id; /* OPT */
+	ILL_Service_Date_Time *service_date_time; /* OPT */
+	ILL_System_Id *requester_id; /* OPT */
+	ILL_System_Id *responder_id; /* OPT */
+	ILL_Transaction_Type *transaction_type;
+	ILL_Delivery_Address *delivery_address; /* OPT */
+	ILL_Delivery_Service *delivery_service; /* OPT */
+	ILL_Delivery_Address *billing_address; /* OPT */
+	int num_iLL_service_type;
+	ILL_Service_Type **iLL_service_type; /* OPT */
+	Odr_external *responder_specific_service; /* OPT */
+	ILL_Requester_Optional_Messages_Type *requester_optional_messages; /* OPT */
+	ILL_Search_Type *search_type; /* OPT */
+	int num_supply_medium_info_type;
+	ILL_Supply_Medium_Info_Type **supply_medium_info_type; /* OPT */
+	ILL_Place_On_Hold_Type *place_on_hold;
+	ILL_Client_Id *client_id; /* OPT */
+	ILL_Item_Id *item_id; /* OPT */
+	ILL_Supplemental_Item_Description *supplemental_item_description; /* OPT */
+	ILL_Cost_Info_Type *cost_info_type; /* OPT */
+	ILL_String *copyright_compliance; /* OPT */
+	ILL_Third_Party_Info_Type *third_party_info_type; /* OPT */
+	bool_t *retry_flag;
+	bool_t *forward_flag;
+	ILL_String *requester_note; /* OPT */
+	ILL_String *forward_note; /* OPT */
+	int num_iLL_request_extensions;
+	ILL_Extension **iLL_request_extensions; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/log.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/log.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/log.h	(revision 21083)
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:38  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.15  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.14  1998/10/28 10:26:59  adam
+ * New functions log_init_file, log_init_level, log_init_prefix.
+ *
+ * Revision 1.13  1998/10/13 16:11:11  adam
+ * Added printf-format check for logf when using GNUC.
+ *
+ * Revision 1.12  1997/09/04 07:59:02  adam
+ * Added include of xmalloc.h.
+ *
+ * Revision 1.11  1997/09/01 08:49:48  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.10  1997/05/14 06:53:40  adam
+ * C++ support.
+ *
+ * Revision 1.9  1997/05/01 15:06:42  adam
+ * Added log_mask_str_x routine.
+ *
+ * Revision 1.8  1996/05/01 12:45:00  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.7  1996/02/05  12:24:26  adam
+ * Implemented log_event_{start,end}-functions.
+ *
+ * Revision 1.6  1995/10/10  16:27:06  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.5  1995/09/29  17:12:03  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:47  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/06/19  12:38:25  quinn
+ * Reorganized include-files. Added small features.
+ *
+ * Revision 1.2  1995/05/16  08:50:31  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/30  09:39:41  quinn
+ * Moved .h files to include directory
+ *
+ * Revision 1.4  1994/09/28  13:07:22  adam
+ * Added log_mask_str.
+ *
+ * Revision 1.3  1994/08/18  08:18:45  quinn
+ * Added prefix to log_init.
+ *
+ * Revision 1.2  1994/08/17  14:27:46  quinn
+ * added LOG_ERRNO
+ *
+ * Revision 1.1  1994/08/17  13:22:52  quinn
+ * First version
+ *
+ */
+
+#ifndef LOG_H
+#define LOG_H
+
+#include <stdio.h>
+#include <yaz/yconfig.h>
+#include <yaz/xmalloc.h>
+
+YAZ_BEGIN_CDECL
+
+#define LOG_FATAL 0x0001
+#define LOG_DEBUG 0x0002
+#define LOG_WARN  0x0004
+#define LOG_LOG   0x0008
+#define LOG_ERRNO 0x0010     /* append strerror to message */
+#define LOG_FILE  0x0020
+
+#define LOG_ALL   0xffff
+
+#define LOG_DEFAULT_LEVEL (LOG_FATAL | LOG_ERRNO | LOG_LOG | LOG_WARN)
+
+#define logf yaz_log
+
+YAZ_EXPORT void log_init(int level, const char *prefix, const char *name);
+YAZ_EXPORT void log_init_file (const char *fname);
+YAZ_EXPORT void log_init_level (int level);
+YAZ_EXPORT void log_init_prefix (const char *prefix);
+
+YAZ_EXPORT void yaz_log(int level, const char *fmt, ...)
+#ifdef __GNUC__
+	__attribute__ ((format (printf, 2, 3)))
+#endif
+	;
+YAZ_EXPORT int log_mask_str (const char *str);
+YAZ_EXPORT int log_mask_str_x (const char *str, int level);
+YAZ_EXPORT FILE *log_file(void);
+
+YAZ_EXPORT void log_event_start (void (*func)(int level, const char *msg, void *info),
+	void *info);
+YAZ_EXPORT void log_event_end (void (*func)(int level, const char *msg, void *info),
+	void *info);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/logrpn.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/logrpn.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/logrpn.h	(revision 21083)
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1997-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:38  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1998/11/16 16:02:32  adam
+ * Added loggin utilies, log_rpn_query and log_scan_term. These used
+ * to be part of Zebra.
+ *
+ */
+
+#ifndef LOG_RPN_H
+#define LOG_RPN_H
+
+#include <yaz/yconfig.h>
+#include <yaz/proto.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT void log_rpn_query (Z_RPNQuery *rpn);
+YAZ_EXPORT void log_scan_term (Z_AttributesPlusTerm *zapt, oid_value ast);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/marcdisp.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/marcdisp.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/marcdisp.h	(revision 21083)
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:39  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1997/09/24 13:35:45  adam
+ * Added two members to data1_marctab to ease reading of weird MARC records.
+ *
+ * Revision 1.7  1997/09/04 07:57:51  adam
+ * Definition of ISO2709 control characters to this file.
+ *
+ * Revision 1.6  1997/09/01 08:49:49  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.5  1997/05/14 06:53:40  adam
+ * C++ support.
+ *
+ * Revision 1.4  1995/09/29 17:12:03  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:47  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:50:32  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/04/10  10:28:28  quinn
+ * Added copy of CCL.
+ *
+ */
+
+#ifndef MARCDISP_H
+#define MARCDISP_H
+
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT int marc_display (const char *buf, FILE *outf);
+YAZ_EXPORT int marc_display_ex (const char *buf, FILE *outf, int debug);
+
+#define ISO2709_RS 035
+#define ISO2709_FS 036
+#define ISO2709_IDFS 037
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/nmem.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/nmem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/nmem.h	(revision 21083)
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:39  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.10  1998/10/19 15:24:20  adam
+ * New nmem utility, nmem_transfer, that transfer blocks from one
+ * NMEM to another.
+ *
+ * Revision 1.9  1998/10/13 16:00:17  adam
+ * Implemented nmem_critical_{enter,leave}.
+ *
+ * Revision 1.8  1998/07/20 12:35:59  adam
+ * Added more memory diagnostics (when NMEM_DEBUG is 1).
+ *
+ * Revision 1.7  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ */
+
+#ifndef NMEM_H
+#define NMEM_H
+#include <yaz/yconfig.h>
+
+#define NMEM_DEBUG 0
+
+#ifndef NMEM_DEBUG
+#define NMEM_DEBUG 0
+#endif
+
+YAZ_BEGIN_CDECL
+
+typedef struct nmem_block
+{
+    char *buf;              /* memory allocated in this block */
+    int size;               /* size of buf */
+    int top;                /* top of buffer */
+    struct nmem_block *next;
+} nmem_block;
+
+typedef struct nmem_control
+{
+    int total;
+    nmem_block *blocks;
+    struct nmem_control *next;
+} nmem_control;
+
+typedef struct nmem_control *NMEM;
+
+YAZ_EXPORT void nmem_reset(NMEM n);
+YAZ_EXPORT int nmem_total(NMEM n);
+YAZ_EXPORT char *nmem_strdup (NMEM mem, const char *src);
+YAZ_EXPORT void nmem_transfer (NMEM dst, NMEM src);
+
+YAZ_EXPORT void nmem_critical_enter (void);
+YAZ_EXPORT void nmem_critical_leave (void);
+
+#if NMEM_DEBUG
+
+YAZ_EXPORT NMEM nmem_create_f(const char *file, int line);
+YAZ_EXPORT void nmem_destroy_f(const char *file, int line, NMEM n);
+YAZ_EXPORT void *nmem_malloc_f(const char *file, int line, NMEM n, int size);
+#define nmem_create() nmem_create_f(__FILE__, __LINE__)
+#define nmem_destroy(x) nmem_destroy_f(__FILE__, __LINE__, (x))
+#define nmem_malloc(x, y) nmem_malloc_f(__FILE__, __LINE__, (x), (y))
+
+#else
+
+YAZ_EXPORT NMEM nmem_create(void);
+YAZ_EXPORT void nmem_destroy(NMEM n);
+YAZ_EXPORT void *nmem_malloc(NMEM n, int size);
+
+#endif
+
+YAZ_EXPORT void nmem_init (void);
+YAZ_EXPORT void nmem_exit (void);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/odr.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/odr.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/odr.h	(revision 21083)
@@ -0,0 +1,376 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#ifndef ODR_H
+#define ODR_H
+
+#include <stdio.h>
+#include <string.h>
+
+#include <yaz/yconfig.h>
+#include <yaz/nmem.h>
+
+YAZ_BEGIN_CDECL
+
+#ifndef bool_t
+#define bool_t int
+#endif
+
+/*
+ * Tag modes
+ */
+#define ODR_NONE -1
+#define ODR_IMPLICIT 0
+#define ODR_EXPLICIT 1
+
+/*
+ * Classes
+ */
+#define ODR_UNIVERSAL   0
+#define ODR_APPLICATION 1
+#define ODR_CONTEXT     2
+#define ODR_PRIVATE     3
+
+/*
+ * UNIVERSAL tags
+ */
+#define ODR_BOOLEAN     1
+#define ODR_INTEGER     2
+#define ODR_BITSTRING   3
+#define ODR_OCTETSTRING 4
+#define ODR_NULL        5
+#define ODR_OID         6
+#define ODR_ODESC       7
+#define ODR_EXTERNAL    8
+#define ODR_REAL        9
+#define ODR_ENUM        10
+#define ODR_SEQUENCE    16
+#define ODR_SET         17
+#define ODR_NUMERICSTRING   18
+#define ODR_PRINTABLESTRING 19
+#define ODR_GENERALIZEDTIME 24
+#define ODR_GRAPHICSTRING   25
+#define ODR_VISIBLESTRING   26
+#define ODR_GENERALSTRING   27
+
+/*
+ * odr stream directions
+ */
+#define ODR_DECODE      0
+#define ODR_ENCODE      1
+#define ODR_PRINT       2
+
+typedef struct odr_oct
+{
+    unsigned char *buf;
+    int len;
+    int size;
+} Odr_oct;
+
+typedef void Odr_null;
+extern Odr_null *ODR_NULLVAL;
+
+typedef Odr_oct Odr_any;
+
+typedef struct odr_bitmask
+{
+#define ODR_BITMASK_SIZE 256
+    unsigned char bits[ODR_BITMASK_SIZE];
+    int top;
+} Odr_bitmask;
+
+typedef int Odr_oid;   /* terminate by -1 */
+
+typedef struct odr_constack
+{
+    const unsigned char *base;   /* starting point of data */
+    int base_offset;
+    int len;                     /* length of data, if known, else -1
+                                        (decoding only) */
+    const unsigned char *lenb;   /* where to encode length */
+    int len_offset;
+    int lenlen;                  /* length of length-field */
+} odr_constack;
+
+#define ODR_S_SET     0
+#define ODR_S_CUR     1
+#define ODR_S_END     2
+
+typedef struct {      /* used to be statics in ber_tag... */
+    int lclass;
+    int ltag;
+    int br;
+    int lcons;
+} Odr_ber_tag;
+
+typedef struct odr
+{
+    int direction;       /* the direction of this stream */
+
+    int error;           /* current error state (0==OK) */
+
+    int can_grow;         /* are we allowed to reallocate */
+    unsigned char *buf;            /* memory handle */
+    int size;             /* current buffer size */
+
+    int pos;              /* current position */
+    int top;              /* top of buffer (max pos when decoding) */
+
+    const unsigned char *bp; /* position in buffer (decoding) */
+
+    int t_class;         /* implicit tagging (-1==default tag) */
+    int t_tag;
+
+    int enable_bias;     /* force choice enable flag */
+    int choice_bias;     /* force choice */
+    int lenlen;          /* force length-of-lenght (odr_setlen()) */
+
+    FILE *print;         /* output file for direction print */
+    int indent;          /* current indent level for printing */
+
+    NMEM mem;            /* memory handle for decoding (primarily) */
+
+    /* stack for constructed types */
+#define ODR_MAX_STACK 50
+    int stackp;          /* top of stack (-1 == initial state) */
+    odr_constack stack[ODR_MAX_STACK];
+
+    Odr_ber_tag odr_ber_tag;
+} *ODR;
+
+typedef int (*Odr_fun)(ODR, char **, int, const char *);
+
+typedef struct odr_arm
+{
+    int tagmode;
+    int zclass;
+    int tag;
+    int which;
+    Odr_fun fun;
+    char *name;
+} Odr_arm;
+
+/*
+ * Error control.
+ */
+#define ONONE           0
+#define OMEMORY         1
+#define OSYSERR         2
+#define OSPACE          3
+#define OREQUIRED       4
+#define OUNEXPECTED     5
+#define OOTHER          6
+#define OPROTO          7
+#define ODATA           8
+#define OSTACK          9
+#define OCONLEN        10
+#define OLENOV         11
+
+extern char *odr_errlist[];
+
+YAZ_EXPORT int odr_geterror(ODR o);
+YAZ_EXPORT void odr_perror(ODR o, char *message);
+YAZ_EXPORT void odr_setprint(ODR o, FILE *file);
+YAZ_EXPORT ODR odr_createmem(int direction);
+YAZ_EXPORT void odr_reset(ODR o);
+YAZ_EXPORT void odr_destroy(ODR o);
+YAZ_EXPORT void odr_setbuf(ODR o, char *buf, int len, int can_grow);
+YAZ_EXPORT char *odr_getbuf(ODR o, int *len, int *size);
+YAZ_EXPORT void *odr_malloc(ODR o, int size);
+YAZ_EXPORT char *odr_strdup(ODR o, const char *str);
+YAZ_EXPORT NMEM odr_extract_mem(ODR o);
+YAZ_EXPORT Odr_null *odr_nullval(void);
+#define odr_release_mem(m) nmem_destroy(m)
+#define ODR_MEM NMEM
+
+#define odr_implicit(o, t, p, cl, tg, opt)\
+        (odr_implicit_settag((o), cl, tg), t ((o), (p), (opt), 0) )
+
+#define odr_implicit_tag(o, t, p, cl, tg, opt, name)\
+        (odr_implicit_settag((o), cl, tg), t ((o), (p), (opt), name) )
+
+#define odr_explicit(o, t, p, cl, tg, opt)\
+        ((int) (odr_constructed_begin((o), (p), (cl), (tg), 0) ? \
+        t ((o), (p), (opt), 0) &&\
+        odr_constructed_end(o) : opt))
+
+#define odr_explicit_tag(o, t, p, cl, tg, opt, name)\
+        ((int) (odr_constructed_begin((o), (p), (cl), (tg), 0) ? \
+        t ((o), (p), (opt), name) &&\
+        odr_constructed_end(o) : opt))
+
+#define ODR_MASK_ZERO(mask)\
+    ((void) (memset((mask)->bits, 0, ODR_BITMASK_SIZE),\
+    (mask)->top = -1))
+
+#define ODR_MASK_SET(mask, num)\
+    (((mask)->bits[(num) >> 3] |= 0X80 >> ((num) & 0X07)),\
+    (mask)->top < (num) >> 3 ? ((mask)->top = (num) >> 3) : 0)
+
+#define ODR_MASK_CLEAR(mask, num)\
+    ((mask)->bits[(num) >> 3] &= ~(0X80 >> ((num) & 0X07)))
+
+#define ODR_MASK_GET(mask, num)  ( ((num) >> 3 <= (mask)->top) ? \
+    ((mask)->bits[(num) >> 3] & (0X80 >> ((num) & 0X07)) ? 1 : 0) : 0)
+
+/* Private macro.
+ * write a single character at the current position - grow buffer if
+ * necessary.
+ * (no, we're not usually this anal about our macros, but this baby is
+ *  next to unreadable without some indentation  :)
+ */
+#define odr_putc(o, c) \
+( \
+    ( \
+        (o)->pos < (o)->size ? \
+        ( \
+            (o)->buf[(o)->pos++] = (c), \
+            0 \
+        ) : \
+        ( \
+            odr_grow_block((o), 1) == 0 ? \
+            ( \
+                (o)->buf[(o)->pos++] = (c), \
+                0 \
+            ) : \
+            ( \
+                (o)->error = OSPACE, \
+                -1 \
+            ) \
+        ) \
+    ) == 0 ? \
+    ( \
+        (o)->pos > (o)->top ? \
+        ( \
+            (o)->top = (o)->pos, \
+            0 \
+        ) : \
+        0 \
+    ) : \
+        -1 \
+) \
+
+#define odr_tell(o) ((o)->pos)
+#define odr_offset(o) ((o)->bp - (o)->buf)
+#define odr_ok(o) (!(o)->error)
+#define odr_getmem(o) ((o)->mem)
+#define odr_setmem(o, v) ((o)->mem = (v))
+
+#define ODR_MAXNAME 256
+
+YAZ_EXPORT int ber_boolean(ODR o, int *val);
+YAZ_EXPORT int ber_tag(ODR o, void *p, int zclass, int tag,
+		       int *constructed, int opt);
+YAZ_EXPORT int ber_enctag(ODR o, int zclass, int tag, int constructed);
+YAZ_EXPORT int ber_dectag(const unsigned char *buf, int *zclass,
+			  int *tag, int *constructed);
+YAZ_EXPORT int odr_bool(ODR o, int **p, int opt, const char *name);
+YAZ_EXPORT int odr_integer(ODR o, int **p, int opt, const char *name);
+YAZ_EXPORT int odr_enum(ODR o, int **p, int opt, const char *name);
+YAZ_EXPORT int odr_implicit_settag(ODR o, int zclass, int tag);
+YAZ_EXPORT int ber_enclen(ODR o, int len, int lenlen, int exact);
+YAZ_EXPORT int ber_declen(const unsigned char *buf, int *len);
+YAZ_EXPORT void odr_prname(ODR o, const char *name);
+YAZ_EXPORT int ber_null(ODR o);
+YAZ_EXPORT int odr_null(ODR o, Odr_null **p, int opt, const char *name);
+YAZ_EXPORT int ber_integer(ODR o, int *val);
+YAZ_EXPORT int odr_constructed_begin(ODR o, void *p, int zclass, int tag,
+				     const char *name);
+YAZ_EXPORT int odr_constructed_end(ODR o);
+YAZ_EXPORT int odr_sequence_begin(ODR o, void *p, int size, const char *name);
+YAZ_EXPORT int odr_set_begin(ODR o, void *p, int size, const char *name);
+YAZ_EXPORT int odr_sequence_end(ODR o);
+YAZ_EXPORT int odr_set_end(ODR o);
+YAZ_EXPORT int ber_octetstring(ODR o, Odr_oct *p, int cons);
+YAZ_EXPORT int odr_octetstring(ODR o, Odr_oct **p, int opt, const char *name);
+YAZ_EXPORT int odp_more_chunks(ODR o, const unsigned char *base, int len);
+YAZ_EXPORT int odr_constructed_more(ODR o);
+YAZ_EXPORT int odr_bitstring(ODR o, Odr_bitmask **p, int opt,
+			     const char *name);
+YAZ_EXPORT int ber_bitstring(ODR o, Odr_bitmask *p, int cons);
+YAZ_EXPORT int odr_generalstring(ODR o, char **p, int opt, const char *name);
+YAZ_EXPORT int ber_oidc(ODR o, Odr_oid *p);
+YAZ_EXPORT int odr_oid(ODR o, Odr_oid **p, int opt, const char *name);
+YAZ_EXPORT int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
+			  const char *name);
+YAZ_EXPORT int odr_cstring(ODR o, char **p, int opt, const char *name);
+YAZ_EXPORT int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num,
+			       const char *name);
+YAZ_EXPORT int odr_set_of(ODR o, Odr_fun type, void *p, int *num,
+			  const char *name);
+YAZ_EXPORT int odr_any(ODR o, Odr_any **p, int opt, const char *name);
+YAZ_EXPORT int ber_any(ODR o, Odr_any **p);
+YAZ_EXPORT int completeBER(const unsigned char *buf, int len);
+YAZ_EXPORT void odr_begin(ODR o);
+YAZ_EXPORT void odr_end(ODR o);
+YAZ_EXPORT Odr_oid *odr_oiddup(ODR odr, Odr_oid *o);
+YAZ_EXPORT Odr_oid *odr_oiddup_nmem(NMEM nmem, Odr_oid *o);
+YAZ_EXPORT int odr_grow_block(ODR b, int min_bytes);
+YAZ_EXPORT int odr_write(ODR o, unsigned char *buf, int bytes);
+YAZ_EXPORT int odr_seek(ODR o, int whence, int offset);
+YAZ_EXPORT int odr_dumpBER(FILE *f, const char *buf, int len);
+YAZ_EXPORT void odr_choice_bias(ODR o, int what);
+YAZ_EXPORT void odr_choice_enable_bias(ODR o, int mode);
+YAZ_EXPORT int odr_total(ODR o);
+YAZ_EXPORT char *odr_errmsg(int n);
+YAZ_EXPORT Odr_oid *odr_getoidbystr(ODR o, char *str);
+YAZ_EXPORT Odr_oid *odr_getoidbystr_nmem(NMEM o, char *str);
+YAZ_EXPORT int odr_initmember(ODR o, void *p, int size);
+YAZ_EXPORT int odr_peektag(ODR o, int *zclass, int *tag, int *cons);
+YAZ_EXPORT void odr_setlenlen(ODR o, int len);
+
+typedef struct Odr_external
+{
+    Odr_oid *direct_reference;       /* OPTIONAL */
+    int     *indirect_reference;     /* OPTIONAL */
+    char    *descriptor;             /* OPTIONAL */
+    int which;
+#define ODR_EXTERNAL_single 0
+#define ODR_EXTERNAL_octet 1
+#define ODR_EXTERNAL_arbitrary 2
+    union
+    {
+	Odr_any  *single_ASN1_type;
+	Odr_oct  *octet_aligned; 
+	Odr_bitmask *arbitrary;      /* we aren't really equipped for this*/
+    } u;
+} Odr_external;
+
+YAZ_EXPORT int odr_external(ODR o, Odr_external **p, int opt,
+			    const char *name);
+YAZ_EXPORT int odr_visiblestring(ODR o, char **p, int opt,
+				 const char *name);
+YAZ_EXPORT int odr_graphicstring(ODR o, char **p, int opt,
+				 const char *name);
+YAZ_EXPORT int odr_generalizedtime(ODR o, char **p, int opt,
+				   const char *name);
+YAZ_END_CDECL
+
+#include <yaz/xmalloc.h>
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/oid.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/oid.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/oid.h	(revision 21083)
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#ifndef OID_H
+#define OID_H
+
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+#define OID_SIZE 20
+    
+typedef enum oid_proto
+{
+    PROTO_NOP=0,
+    PROTO_Z3950,
+    PROTO_SR,
+    PROTO_GENERAL,
+    PROTO_WAIS
+} oid_proto;
+
+typedef enum oid_class
+{
+    CLASS_NOP=0,
+    CLASS_APPCTX,
+    CLASS_ABSYN,
+    CLASS_ATTSET,
+    CLASS_TRANSYN,
+    CLASS_DIAGSET,
+    CLASS_RECSYN,
+    CLASS_RESFORM,
+    CLASS_ACCFORM,
+    CLASS_EXTSERV,
+    CLASS_USERINFO,
+    CLASS_ELEMSPEC,
+    CLASS_VARSET,
+    CLASS_SCHEMA,
+    CLASS_TAGSET,
+    CLASS_GENERAL
+} oid_class;
+
+typedef enum oid_value
+{
+    VAL_NOP=0,
+    VAL_APDU,
+    VAL_BER,
+    VAL_BASIC_CTX,
+    VAL_BIB1,
+    VAL_EXP1,
+    VAL_EXT1,
+    VAL_CCL1,
+    VAL_GILS,
+    VAL_WAIS,
+    VAL_STAS,
+    VAL_COLLECT1,
+    VAL_CIMI1,
+    VAL_GEO,
+    VAL_DIAG1,
+    VAL_ISO2709,
+    VAL_UNIMARC,
+    VAL_INTERMARC,
+    VAL_CCF,
+    VAL_USMARC,
+    VAL_UKMARC,
+    VAL_NORMARC,
+    VAL_LIBRISMARC,
+    VAL_DANMARC,
+    VAL_FINMARC,
+    VAL_MAB,
+    VAL_CANMARC,
+    VAL_SBN,
+    VAL_PICAMARC,
+    VAL_AUSMARC,
+    VAL_IBERMARC,
+    VAL_CATMARC,
+    VAL_MALMARC,
+    VAL_EXPLAIN,
+    VAL_SUTRS,
+    VAL_OPAC,
+    VAL_SUMMARY,
+    VAL_GRS0,
+    VAL_GRS1,
+    VAL_EXTENDED,
+    VAL_FRAGMENT,
+    VAL_RESOURCE1,
+    VAL_RESOURCE2,
+    VAL_PROMPT1,
+    VAL_DES1,
+    VAL_KRB1,
+    VAL_PRESSET,
+    VAL_PQUERY,
+    VAL_PCQUERY,
+    VAL_ITEMORDER,
+    VAL_DBUPDATE0,
+    VAL_DBUPDATE,
+    VAL_EXPORTSPEC,
+    VAL_EXPORTINV,
+    VAL_NONE,
+    VAL_SETM,
+    VAL_SETG,
+    VAL_VAR1,
+    VAL_ESPEC1,
+    VAL_SOIF,
+    VAL_SEARCHRES1,
+    VAL_THESAURUS,
+    VAL_CHARLANG,
+    VAL_USERINFO1,
+    VAL_MULTISRCH1,
+    VAL_MULTISRCH2,
+    VAL_DATETIME,
+    VAL_SQLRS,
+    VAL_PDF,
+    VAL_POSTSCRIPT,
+    VAL_HTML,
+    VAL_TIFF,
+    VAL_GIF,
+    VAL_JPEG,
+    VAL_PNG,
+    VAL_MPEG,
+    VAL_SGML,
+    VAL_TIFFB,
+    VAL_WAV,
+    VAL_UPDATEES,
+    VAL_TEXT_XML,
+    VAL_APPLICATION_XML,
+    VAL_UNIVERSE_REPORT,
+    VAL_PROXY,
+    VAL_COOKIE,
+    VAL_CLIENT_IP,
+    VAL_ISO_ILL_1,
+    VAL_ZBIG,
+    VAL_UTIL,
+    VAL_XD1,
+    VAL_ZTHES,
+    VAL_FIN1,
+    VAL_DAN1,
+    VAL_DIAG_ES,
+    VAL_DIAG_GENERAL,
+    VAL_JPMARC,
+    VAL_SWEMARC,
+    VAL_SIGLEMARC,
+    VAL_ISDSMARC,
+    VAL_RUSMARC,
+/* add new types here... */
+
+/* VAL_DYNAMIC must have highest value */
+    VAL_DYNAMIC,
+    VAL_MAX = VAL_DYNAMIC+30
+} oid_value;
+
+typedef struct oident
+{
+    oid_proto proto;
+    oid_class oclass;
+    oid_value value;
+    int oidsuffix[OID_SIZE];
+    char *desc;
+} oident;
+
+YAZ_EXPORT int *oid_getoidbyent(struct oident *ent);
+YAZ_EXPORT int *oid_ent_to_oid(struct oident *ent, int *dst);
+YAZ_EXPORT struct oident *oid_getentbyoid(int *o);
+YAZ_EXPORT void oid_oidcpy(int *t, int *s);
+YAZ_EXPORT void oid_oidcat(int *t, int *s);
+YAZ_EXPORT int oid_oidcmp(int *o1, int *o2);
+YAZ_EXPORT int oid_oidlen(int *o);
+YAZ_EXPORT oid_value oid_getvalbyname(const char *name);
+YAZ_EXPORT void oid_setprivateoids(oident *list);
+YAZ_EXPORT struct oident *oid_addent (int *oid, enum oid_proto proto,
+				      enum oid_class oclass,
+				      const char *desc, int value);
+YAZ_EXPORT void oid_init(void);
+YAZ_EXPORT void oid_exit(void);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/options.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/options.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/options.h	(revision 21083)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:41  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1997/09/01 08:49:50  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.5  1997/05/14 06:53:43  adam
+ * C++ support.
+ *
+ * Revision 1.4  1995/09/29 17:12:05  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:48  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:50:36  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/30  09:39:42  quinn
+ * Moved .h files to include directory
+ *
+ * Revision 1.1  1995/03/27  08:35:19  quinn
+ * Created util library
+ * Added memory debugging module. Imported options-manager
+ *
+ * Revision 1.2  1994/08/16  16:16:03  adam
+ * bfile header created.
+ *
+ * Revision 1.1  1994/08/16  16:04:35  adam
+ * Added header file options.h
+ *
+ */
+
+#ifndef OPTIONS_H
+#define OPTIONS_H
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT int options (const char *desc, char **argv, int argc, char **arg);
+
+YAZ_END_CDECL
+
+#endif
+	
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/otherinfo.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/otherinfo.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/otherinfo.h	(revision 21083)
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Id$
+ */
+#ifndef OTHERINFO_H
+#define OTHERINFO_H
+
+#include <yaz/proto.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT void yaz_oi_APDU(Z_APDU *apdu, Z_OtherInformation ***oip);
+YAZ_EXPORT    Z_OtherInformationUnit *yaz_oi_update (
+    Z_OtherInformation **otherInformationP, ODR odr,
+    int *oid, int categoryValue, int delete_flag);
+YAZ_EXPORT void yaz_oi_set_string_oid (
+    Z_OtherInformation **otherInformation, ODR odr,
+    int *oid, int categoryValue,
+    const char *str);
+YAZ_EXPORT void yaz_oi_set_string_oidval (
+    Z_OtherInformation **otherInformation, ODR odr,
+    int oidval, int categoryValue,
+    const char *str);
+YAZ_EXPORT char *yaz_oi_get_string_oid (
+    Z_OtherInformation **otherInformation,
+    int *oid, int categoryValue, int delete_flag);
+YAZ_EXPORT char *yaz_oi_get_string_oidval(
+    Z_OtherInformation **otherInformation,
+    int oidval, int categoryValue, int delete_flag);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/pquery.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/pquery.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/pquery.h	(revision 21083)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:42  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1997/09/01 08:49:50  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.7  1997/05/14 06:53:43  adam
+ * C++ support.
+ *
+ * Revision 1.6  1996/08/12 14:09:24  adam
+ * Default prefix query attribute set defined by using p_query_attset.
+ *
+ * Revision 1.5  1996/03/15  11:01:46  adam
+ * Extra argument to p_query_rpn: protocol.
+ * Extra arguments to p_query_scan: protocol and attributeSet.
+ *
+ * Revision 1.4  1995/09/29  17:12:05  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:49  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/26  08:56:05  adam
+ * New function: p_query_scan.
+ *
+ * Revision 1.1  1995/05/22  15:31:05  adam
+ * New function, p_query_rpn, to convert from prefix (ascii) to rpn (asn).
+ *
+ */
+
+#ifndef PQUERY_H
+#define PQUERY_H
+
+#include <yaz/yconfig.h>
+#include <yaz/proto.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto, const char *qbuf);
+
+YAZ_EXPORT Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+           Odr_oid **attributeSetP, const char *qbuf);
+YAZ_EXPORT int p_query_attset (const char *arg);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/proto.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/proto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/proto.h	(revision 21083)
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 1998-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ */
+#ifndef Z_PROTO_H
+#define Z_PROTO_H
+
+#define Z_95 1
+#define ASN_COMPILED 1
+
+#include <yaz/yaz-version.h>
+#include <yaz/z-accdes1.h>
+#include <yaz/z-accform1.h>
+#include <yaz/z-acckrb1.h>
+#include <yaz/z-core.h>
+#include <yaz/z-diag1.h>
+#include <yaz/z-espec1.h>
+#include <yaz/z-estask.h>
+#include <yaz/z-exp.h>
+#include <yaz/z-grs.h>
+#include <yaz/z-opac.h>
+#include <yaz/z-rrf1.h>
+#include <yaz/z-rrf2.h>
+#include <yaz/z-sum.h>
+#include <yaz/z-sutrs.h>
+#include <yaz/z-uifr1.h>
+#include <yaz/zes-expi.h>
+#include <yaz/zes-exps.h>
+#include <yaz/zes-order.h>
+#include <yaz/zes-pquery.h>
+#include <yaz/zes-psched.h>
+#include <yaz/zes-pset.h>
+#include <yaz/zes-update.h>
+#include <yaz/z-date.h>
+#include <yaz/z-univ.h>
+
+YAZ_BEGIN_CDECL
+
+#define Z_PRES_SUCCESS   Z_PresentStatus_success
+#define Z_PRES_PARTIAL_1 Z_PresentStatus_partial_1
+#define Z_PRES_PARTIAL_2 Z_PresentStatus_partial_2
+#define Z_PRES_PARTIAL_3 Z_PresentStatus_partial_3
+#define Z_PRES_PARTIAL_4 Z_PresentStatus_partial_4
+#define Z_PRES_FAILURE   Z_PresentStatus_failure
+
+#define Z_RES_SUBSET  Z_SearchResponse_subset
+#define Z_RES_INTERIM Z_SearchResponse_interim
+#define Z_RES_NONE    Z_SearchResponse_none
+
+#define Z_SortStatus_success Z_SortResponse_success 
+#define Z_SortStatus_partial_1 Z_SortResponse_partial_1
+#define Z_SortStatus_failure Z_SortResponse_failure
+
+#define Z_SortRelation_ascending            Z_SortKeySpec_ascending 
+#define Z_SortRelation_descending           Z_SortKeySpec_descending
+#define Z_SortRelation_ascendingByFreq      Z_SortKeySpec_ascendingByFrequency
+#define Z_SortRelation_descendingByFreq     Z_SortKeySpec_descendingByfrequency 
+
+#define Z_SortCase_caseSensitive            Z_SortKeySpec_caseSensitive
+#define Z_SortCase_caseInsensitive          Z_SortKeySpec_descendingByfrequency
+
+#define Z_TriggerResourceCtrl_resourceReport Z_TriggerResourceControlRequest_resourceReport
+#define Z_TriggerResourceCtrl_resourceControl  Z_TriggerResourceControlRequest_resourceControl
+#define Z_TriggerResourceCtrl_cancel Z_TriggerResourceControlRequest_cancel
+
+#define Z_DeleteRequest_list    Z_DeleteResultSetRequest_list
+#define Z_DeleteRequest_all     Z_DeleteResultSetRequest_all
+
+#define Z_AccessRequest_simpleForm Z_AccessControlRequest_simpleForm
+#define Z_AccessRequest_externallyDefined Z_AccessControlRequest_externallyDefined
+
+#define Z_AccessResponse_simpleForm Z_AccessControlResponse_simpleForm
+#define Z_AccessResponse_externallyDefined Z_AccessControlResponse_externallyDefined
+
+#define Z_ResourceReportStatus_success   Z_ResourceReportResponse_success
+#define Z_ResourceReportStatus_partial   Z_ResourceReportResponse_partial
+#define Z_ResourceReportStatus_failure_1 Z_ResourceReportResponse_failure_1
+#define Z_ResourceReportStatus_failure_2 Z_ResourceReportResponse_failure_2
+#define Z_ResourceReportStatus_failure_3 Z_ResourceReportResponse_failure_3
+#define Z_ResourceReportStatus_failure_4 Z_ResourceReportResponse_failure_4
+#define Z_ResourceReportStatus_failure_5 Z_ResourceReportResponse_failure_5
+#define Z_ResourceReportStatus_failure_6 Z_ResourceReportResponse_failure_6
+
+#define Z_SortResultSetStatus_empty       Z_SortResponse_empty
+#define Z_SortResultSetStatus_interim     Z_SortResponse_interim
+#define Z_SortResultSetStatus_unchanged   Z_SortResponse_unchanged
+#define Z_SortResultSetStatus_none        Z_SortResponse_none
+
+typedef Z_External Z_DatabaseRecord;
+typedef struct Z_IOItemOrder Z_ItemOrder;
+
+YAZ_EXPORT Z_APDU *zget_APDU(ODR o, int which);
+YAZ_EXPORT Z_Close *zget_Close (ODR o);
+
+YAZ_END_CDECL
+
+#include <yaz/prt-ext.h>
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-acc.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-acc.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-acc.h	(revision 21083)
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 1995, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:43  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.8  1997/09/01 08:49:51  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.7  1997/05/14 06:53:46  adam
+ * C++ support.
+ *
+ * Revision 1.6  1996/01/02 08:57:35  quinn
+ * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
+ *
+ * Revision 1.5  1995/09/29  17:12:09  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:49  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/08/17  12:45:16  quinn
+ * Fixed minor problems with GRS-1. Added support in c&s.
+ *
+ * Revision 1.2  1995/08/15  12:00:13  quinn
+ * Updated External
+ *
+ * Revision 1.1  1995/06/02  09:49:49  quinn
+ * Add access control
+ *
+ *
+ */
+
+#ifndef PRT_ACC_H
+#define PRT_ACC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_Encryption1
+{
+    Odr_oct *cryptType;       /* OPTIONAL */
+    Odr_oct *credential;      /* OPTIONAL */
+    Odr_oct *data;
+} Z_Encryption1;
+
+typedef struct Z_EnumeratedPrompt1
+{
+    int *type;
+#define Z_Prompt1_groupId        0
+#define Z_Prompt1_userId         1
+#define Z_Prompt1_password       2
+#define Z_Prompt1_newPassword    3
+#define Z_Prompt1_copyright      4
+    char *suggestedString;       /* OPTIONAL */
+} Z_EnumeratedPrompt1;
+
+typedef struct Z_PromptId1
+{
+    int which;
+#define Z_PromptId1_enumeratedPrompt 0
+#define Z_PromptId1_nonEnumeratedPrompt 1
+    union
+    {
+    	Z_EnumeratedPrompt1 *enumeratedPrompt;
+	char *nonEnumeratedPrompt;
+    } u;
+} Z_PromptId1;
+
+typedef struct Z_PromptInfo1
+{
+    int which;
+#define Z_Challenge1_character 0
+#define Z_Challenge1_encrypted 1
+    union
+    {
+    	char *character;
+	Z_Encryption1 *encrypted;
+    } u;
+} Z_PromptInfo1;
+
+typedef struct Z_ChallengeUnit1
+{
+    Z_PromptId1 *promptId;
+    char *defaultResponse;           /* OPTIONAL */
+    Z_PromptInfo1 *promptInfo;       /* OPTIONAL */
+    char *regExpr;                   /* OPTIONAL */
+    Odr_null *responseRequired;      /* OPTIONAL */
+    int num_values;
+    char **allowedValues;            /* OPTIONAL */
+    Odr_null *shouldSave;            /* OPTIONAL */
+    int *dataType;                   /* OPTIONAL */
+#define Z_ChalDataType_integer       1
+#define Z_ChalDataType_date          2
+#define Z_ChalDataType_float         3
+#define Z_ChalDataType_alphaNumeric  4
+#define Z_ChalDataType_urlUrn        5
+#define Z_ChalDataType_boolean       6
+    Z_External *diagnostic;        /* OPTIONAL */
+} Z_ChallengeUnit1;
+
+typedef struct Z_Challenge1
+{
+    int num_challenges;
+    Z_ChallengeUnit1 **list;
+} Z_Challenge1;
+
+typedef struct Z_ResponseUnit1
+{
+    Z_PromptId1 *promptId;
+    int which;
+#define Z_Response1_string 0
+#define Z_Response1_accept 1
+#define Z_Response1_acknowledge 2
+#define Z_Response1_diagnostic 3
+#define Z_Response1_encrypted 4
+    union
+    {
+    	char *string;
+	bool_t *accept;
+	Odr_null *acknowledge;
+	Z_DiagRec *diagnostic;
+	Z_Encryption1 *encrypted;
+    } u;
+} Z_ResponseUnit1;
+
+typedef struct Z_Response1
+{
+    int num_responses;
+    Z_ResponseUnit1 **list;
+} Z_Response1;
+
+typedef struct Z_PromptObject1
+{
+    int which;
+#define Z_PromptObject1_challenge 0
+#define Z_PromptObject1_response 1
+    union
+    {
+    	Z_Challenge1 *challenge;
+	Z_Response1 *response;
+    } u;
+} Z_PromptObject1;
+
+YAZ_EXPORT int z_PromptObject1(ODR o, Z_PromptObject1 **p, int opt,
+			       const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-add.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-add.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-add.h	(revision 21083)
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 1995, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:43  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.4  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.3  1997/05/14 06:53:46  adam
+ * C++ support.
+ *
+ * Revision 1.2  1997/04/30 08:52:09  quinn
+ * Null
+ *
+ * Revision 1.1  1996/10/10  11:51:58  quinn
+ * Added SerchResult additional info
+ *
+ *
+ */
+
+#ifndef PRT_ADD_H
+#define PRT_ADD_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_QueryExpressionTerm
+{
+    Z_Term *queryTerm;
+    char *termComment;              /* OPTIONAL */
+} Z_QueryExpressionTerm;
+
+typedef struct Z_QueryExpression
+{
+    int which;
+#define Z_QueryExpression_term 1
+#define Z_QueryExpression_query 2
+    union {
+	Z_QueryExpressionTerm *term;
+	Z_Query *query;
+    } u;
+} Z_QueryExpression;
+
+typedef struct Z_ResultsByDBList
+{
+    int num;
+    Z_DatabaseName **elements;
+} Z_ResultsByDBList;
+
+typedef struct Z_ResultsByDB_elem
+{
+    int which;
+#define Z_ResultsByDB_all 1
+#define Z_ResultsByDB_list 2
+    union {
+        Odr_null *all;
+        Z_ResultsByDBList *list;
+    } u;
+    int *count;                           /* OPTIONAL */
+    char *resultSetName; /* OPTIONAL */
+} Z_ResultsByDB_elem;
+
+typedef struct Z_ResultsByDB
+{
+    int num;
+    Z_ResultsByDB_elem **elements;
+} Z_ResultsByDB;
+
+typedef struct Z_SearchInfoReport_elem
+{
+    char *subqueryId;                          /* OPTIONAL */
+    bool_t *fullQuery;
+    Z_QueryExpression *subqueryExpression;     /* OPTIONAL */
+    Z_QueryExpression *subqueryInterpretation; /* OPTIONAL */
+    Z_QueryExpression *subqueryRecommendation; /* OPTIONAL */
+    int *subqueryCount;                        /* OPTIONAL */
+    Z_IntUnit *subqueryWeight;                 /* OPTIONAL */
+    Z_ResultsByDB *resultsByDB;                /* OPTIONAL */
+} Z_SearchInfoReport_elem;
+
+typedef struct Z_SearchInfoReport
+{
+    int num;
+    Z_SearchInfoReport_elem **elements;
+} Z_SearchInfoReport;
+
+int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt,
+			const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-arc.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-arc.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-arc.h	(revision 21083)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 1995,1996 Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_ARC_H
+#define PRT_ARC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* ------------------- Summary Record --------------------- */
+
+typedef struct Z_FormatSpec
+{
+    char *type;
+    int *size;                    /* OPTIONAL */
+    int *bestPosn;                /* OPTIONAL */
+} Z_FormatSpec;
+
+typedef struct Z_BriefBib
+{
+    char *title;
+    char *author;                  /* OPTIONAL */
+    char *callNumber;              /* OPTIONAL */
+    char *recordType;              /* OPTIONAL */
+    char *bibliographicLevel;      /* OPTIONAL */
+    int num_format;
+    Z_FormatSpec **format;         /* OPTIONAL */
+    char *publicationPlace;        /* OPTIONAL */
+    char *publicationDate;         /* OPTIONAL */
+    char *targetSystemKey;         /* OPTIONAL */
+    char *satisfyingElement;       /* OPTIONAL */
+    int *rank;                     /* OPTIONAL */
+    char *documentId;              /* OPTIONAL */
+    char *abstract;                /* OPTIONAL */
+    Z_OtherInformation *otherInfo; /* OPTIONAL */
+} Z_BriefBib;
+
+/* ------------------- OPAC Record --------------------- */
+
+typedef struct Z_CircRecord
+{
+    bool_t *availableNow;
+    char *availabilityDate;        /* OPTIONAL */
+    char *availableThru;           /* OPTIONAL */
+    char *restrictions;            /* OPTIONAL */
+    char *itemId;                  /* OPTIONAL */
+    bool_t *renewable;
+    bool_t *onHold;
+    char *enumAndChron;            /* OPTIONAL */
+    char *midspine;                /* OPTIONAL */
+    char *temporaryLocation;       /* OPTIONAL */
+} Z_CircRecord;
+
+typedef struct Z_Volume
+{
+    char *enumeration;             /* OPTIONAL */
+    char *chronology;              /* OPTIONAL */
+    char *enumAndChron;            /* OPTIONAL */
+} Z_Volume;
+
+typedef struct Z_HoldingsAndCircData
+{
+    char *typeOfRecord;            /* OPTIONAL */
+    char *encodingLevel;           /* OPTIONAL */
+    char *format;                  /* OPTIONAL */
+    char *receiptAcqStatus;        /* OPTIONAL */
+    char *generalRetention;        /* OPTIONAL */
+    char *completeness;            /* OPTIONAL */
+    char *dateOfReport;            /* OPTIONAL */
+    char *nucCode;                 /* OPTIONAL */
+    char *localLocation;           /* OPTIONAL */
+    char *shelvingLocation;        /* OPTIONAL */
+    char *callNumber;              /* OPTIONAL */
+    char *shelvingData;            /* OPTIONAL */
+    char *copyNumber;              /* OPTIONAL */
+    char *publicNote;              /* OPTIONAL */
+    char *reproductionNote;        /* OPTIONAL */
+    char *termsUseRepro;           /* OPTIONAL */
+    char *enumAndChron;            /* OPTIONAL */
+    int num_volumes;
+    Z_Volume **volumes;            /* OPTIONAL */
+    int num_circulationData;
+    Z_CircRecord **circulationData;/* OPTIONAL */
+} Z_HoldingsAndCircData;
+
+typedef struct Z_HoldingsRecord
+{
+    int which;
+#define Z_HoldingsRecord_marcHoldingsRecord    0
+#define Z_HoldingsRecord_holdingsAndCirc       1
+    union
+    {
+	Z_External *marcHoldingsRecord;
+	Z_HoldingsAndCircData *holdingsAndCirc;
+    } u;
+} Z_HoldingsRecord;
+
+typedef struct Z_OPACRecord
+{
+    Z_External *bibliographicRecord;   /* OPTIONAL */
+    int num_holdingsData;
+    Z_HoldingsRecord **holdingsData;   /* OPTIONAL */
+} Z_OPACRecord;
+
+YAZ_EXPORT int z_BriefBib(ODR o, Z_BriefBib **p, int opt, const char *name);
+YAZ_EXPORT int z_OPACRecord(ODR o, Z_OPACRecord **p, int opt,
+			    const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dat.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dat.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dat.h	(revision 21083)
@@ -0,0 +1,154 @@
+/*
+ * This file is part of the YAZ toolkit:
+ * Copyright (c) 1998, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * Contribution by Ronald van Der Meer (RVDM):
+ *  Databasix Information Systems B.V., Utrecht, The Netherlands.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:44  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.1  1998/02/10 15:31:52  adam
+ * Implemented date and time structure. Changed the Update Extended
+ * Service.
+ *
+ */
+
+#ifndef __PRT_DAT_H
+#define __PRT_DAT_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_MonthAndDay
+{
+    int *month;
+    int *day;                               /* OPTIONAL */
+} Z_MonthAndDay;
+
+typedef struct Z_Quarter
+{
+    int which;
+#define Z_Quarter_first		0
+#define Z_Quarter_second	1
+#define Z_Quarter_third		2
+#define Z_Quarter_fourth	3
+    union
+    {
+	Odr_null *first;
+	Odr_null *second;
+	Odr_null *third;
+	Odr_null *fourth;
+    } u;
+} Z_Quarter;
+
+typedef struct Z_Season
+{
+    int which;
+#define Z_Season_winter		0
+#define Z_Season_spring		1
+#define Z_Season_summer		2
+#define Z_Season_autumn		3
+    union
+    {
+	Odr_null *winter;
+	Odr_null *spring;
+	Odr_null *summer;
+	Odr_null *autumn;
+    } u;
+} Z_Season;
+
+typedef struct Z_PartOfYear
+{
+    int which;
+#define Z_PartOfYear_monthAndDay	0
+#define Z_PartOfYear_julianDay		1
+#define Z_PartOfYear_weekNumber		2
+#define Z_PartOfYear_quarter		3
+#define Z_PartOfYear_season		4
+    union
+    {
+	Z_MonthAndDay *monthAndDay;
+	int *julianDay; 
+	int *weekNumber; 
+	Z_Quarter *quarter;
+	Z_Season *season;
+    } u;
+} Z_PartOfYear;
+
+typedef struct Z_Era
+{
+    int which;
+#define Z_Era_decade		0
+#define Z_Era_century		1
+#define Z_Era_millennium	2
+    union
+    {
+	Odr_null *decade;
+	Odr_null *century;
+	Odr_null *millennium;
+    } u;
+} Z_Era;
+
+typedef struct Z_DateFlags
+{
+    Odr_null *circa;                        /* OPTIONAL */
+    Z_Era *era;                             /* OPTIONAL */
+} Z_DateFlags;
+
+typedef struct Z_Date
+{
+    int *year;
+    Z_PartOfYear *partOfYear;               /* OPTIONAL */
+    Z_DateFlags *flags;                     /* OPTIONAL */
+} Z_Date;
+
+typedef struct Z_Zone
+{
+    int which;
+#define Z_Zone_local		0
+#define Z_Zone_utc		1
+#define Z_Zone_utcOffset	2
+    union
+    {
+	Odr_null *local;
+	Odr_null *utc;
+	int *utcOffset;
+    } u;
+} Z_Zone;
+
+typedef struct Z_Time
+{
+    int *hour;
+    int *minute;                            /* OPTIONAL */
+    int *second;                            /* OPTIONAL */
+    Z_IntUnit *partOfSecond;                /* OPTIONAL */
+    Z_Zone *zone;                           /* OPTIONAL */
+} Z_Time;
+
+typedef struct Z_DateTime
+{
+    Z_Date *z3950Date;                      /* OPTIONAL */
+    Z_Time *z3950Time;                      /* OPTIONAL */
+} Z_DateTime;
+
+YAZ_EXPORT int z_DateTime(ODR o, Z_DateTime **p, int opt, const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dia.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dia.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-dia.h	(revision 21083)
@@ -0,0 +1,333 @@
+/*
+ * Copyright (c) 1995-1998, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_DIA_H
+#define PRT_DIA_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_TooMany
+{
+    int *tooManyWhat;
+#define Z_TooMany_argumentWords        1
+#define Z_TooMany_truncatedWords       2
+#define Z_TooMany_booleanOperators     3
+#define Z_TooMany_incompleteSubfields  4
+#define Z_TooMany_characters           5
+#define Z_TooMany_recordsRetrieved     6
+#define Z_TooMany_databasesSpecified   7
+#define Z_TooMany_resultSetsCreated    8
+#define Z_TooMany_indexTermsProcessed  9
+    int *max;                    /* OPTIONAL */
+} Z_TooMany;
+
+typedef struct Z_BadSpec
+{
+    Z_Specification *spec;
+    char *db;                    /* OPTIONAL */
+    int num_goodOnes;
+    Z_Specification **goodOnes;  /* OPTIONAL */
+} Z_BadSpec;
+
+typedef struct Z_DbUnavailWhy
+{
+    int *reasonCode;             /* OPTIONAL */
+#define Z_DbUnavail_doesNotExist         0
+#define Z_DbUnavail_existsButUnavail     1
+#define Z_DbUnavail_locked               2
+#define Z_DbUnavail_accessDenied         3
+    char *message;               /* OPTIONAL */
+} Z_DbUnavailWhy;
+
+typedef struct Z_DbUnavail
+{
+    char *db;
+    Z_DbUnavailWhy *why;         /* OPTIONAL */
+} Z_DbUnavail;
+
+typedef struct Z_Attribute
+{
+    Odr_oid *id;
+    int *type;                   /* OPTIONAL */
+    int *value;                  /* OPTIONAL */
+    Z_Term *term;                /* OPTIONAL */
+} Z_Attribute;
+
+typedef struct Z_AttCombo
+{
+    Z_AttributeList *unsupportedCombination;
+    int num_alternatives;
+    Z_AttributeList **alternatives;    /* OPTIONAL */
+} Z_AttCombo;
+
+typedef struct Z_DiagTerm 
+{
+    int *problem;                /* OPTIONAL */
+#define Z_DiagtermProb_codedValue     1
+#define Z_DiagtermProb_unparsable     2
+#define Z_DiagtermProb_tooShort       3
+#define Z_DiagtermProb_type           4
+    Z_Term *term;
+} Z_DiagTerm;
+
+typedef struct Z_Proximity
+{
+    int which;
+#define Z_Proximity_resultSets 0
+#define Z_Proximity_badSet 1
+#define Z_Proximity_relation 2
+#define Z_Proximity_unit 3
+#define Z_Proximity_distance 4
+#define Z_Proximity_attributes 5
+#define Z_Proximity_ordered 6
+#define Z_Proximity_exclusion 7
+    union
+    {
+	Odr_null *resultSets;
+	char *badSet;
+	int *relation;
+	int *unit;
+	int *distance;
+	Z_AttributeList *attributes;
+	Odr_null *ordered;
+	Odr_null *exclusion;
+    } u;
+} Z_Proximity;
+
+typedef struct Z_AttrListList
+{
+    int num_lists;
+    Z_AttributeList *lists;
+} Z_AttrListList;
+
+typedef struct Z_Scan
+{
+    int which;
+#define Z_ScanD_nonZeroStepSize 0
+#define Z_ScanD_specifiedStepSize 1
+#define Z_ScanD_termList1 2
+#define Z_ScanD_termList2 3
+#define Z_ScanD_posInResponse 4
+#define Z_ScanD_resources 5
+#define Z_ScanD_endOfList 6
+    union
+    {
+	Odr_null *nonZeroStepSize;
+	Odr_null *specifiedStepSize;
+	Odr_null *termList1;
+	Z_AttrListList *termList2;
+	int *posInResponse;
+#define Z_ScanPosInRsp_mustBeOne         1
+#define Z_ScanPosInRsp_mustBePositive    2
+#define Z_ScanPosInRsp_mustBeNonNegative 3
+#define Z_ScanPosInRsp_other             4
+	Odr_null *resources;
+	Odr_null *endOfList;
+    } u;
+} Z_Scan;
+
+typedef struct Z_Sort
+{
+    int which;
+#define Z_SortD_sequence 0
+#define Z_SortD_noRsName 1
+#define Z_SortD_tooMany 2
+#define Z_SortD_incompatible 3
+#define Z_SortD_generic 4
+#define Z_SortD_dbSpecific 5
+#define Z_SortD_sortElement 6
+#define Z_SortD_key 7
+#define Z_SortD_action 8
+#define Z_SortD_illegal 9
+#define Z_SortD_inputTooLarge 10
+#define Z_SortD_aggregateTooLarge 11
+    union
+    {
+	Odr_null *sequence;
+	Odr_null *noRsName;
+	int *tooMany;
+	Odr_null *incompatible;
+	Odr_null *generic;
+	Odr_null *dbSpecific;
+	int *key;
+#define Z_SortKey_tooMany       1
+#define Z_SortKey_duplicate     2
+	Odr_null *action;
+	int *illegal;
+#define Z_SortIllegal_relation  1
+#define Z_SortIllegal_case      2
+#define Z_SortIllegal_action    3
+#define Z_SortIllegal_sort      4
+	Z_StringList *inputTooLarge;
+	Odr_null *aggregateTooLarge;
+    } u;
+} Z_Sort;
+
+typedef struct Z_Segmentation
+{
+    int which;
+#define Z_SegmentationD_segments 0
+    union
+    {
+	Odr_null *segments;
+    } u;
+} Z_Segmentation;
+
+typedef struct Z_ExtServices
+{
+    int which;
+#define Z_ExtServicesD_req 0
+#define Z_ExtServicesD_permission 1
+#define Z_ExtServicesD_immediate 2
+    union
+    {
+	int *req;
+#define Z_ExtSrvReq_nameInUse           1
+#define Z_ExtSrvReq_noSuchname          2
+#define Z_ExtSrvReq_quota               3
+#define Z_ExtSrvReq_type                4
+	int *permission;
+#define Z_ExtSrvPerm_id                 1
+#define Z_ExtSrvPerm_modifyDelete       2
+	int *immediate;
+#define Z_ExtSrvImm_failed              1
+#define Z_ExtSrvImm_service             2
+#define Z_ExtSrvImm_parameters          3
+    } u;
+} Z_ExtServices;
+
+typedef struct Z_OidList
+{
+    int num_oids;
+    Odr_oid **oids;
+} Z_OidList;
+
+typedef struct Z_AccessCtrl
+{
+    int which;
+#define Z_AccessCtrlD_noUser 0
+#define Z_AccessCtrlD_refused 1
+#define Z_AccessCtrlD_simple 2
+#define Z_AccessCtrlD_oid 3
+#define Z_AccessCtrlD_alternative 4
+#define Z_AccessCtrlD_pwdInv 5
+#define Z_AccessCtrlD_pwdExp 6
+    union
+    {
+	Odr_null *noUser;
+	Odr_null *refused;
+	Odr_null *simple;
+	Z_OidList *oid;
+	Z_OidList *alternative;
+	Odr_null *pwdInv;
+	Odr_null *pwdExp;
+    } u;
+} Z_AccessCtrl;
+
+typedef struct Z_RecordSyntax
+{
+    Odr_oid *unsupportedSyntax;
+    int num_suggestedAlternatives;           /* OPTIONAL */
+    Odr_oid **suggestedAlternatives;           /* OPTIONAL */
+} Z_RecordSyntax;
+
+typedef struct Z_DiagFormat
+{
+    int which;
+#define Z_DiagFormat_tooMany 0
+#define Z_DiagFormat_badSpec 1
+#define Z_DiagFormat_dbUnavail 2
+#define Z_DiagFormat_unSupOp 3
+#define Z_DiagFormat_attribute 4
+#define Z_DiagFormat_attCombo 5
+#define Z_DiagFormat_term 6
+#define Z_DiagFormat_proximity 7
+#define Z_DiagFormat_scan 8
+#define Z_DiagFormat_sort 9
+#define Z_DiagFormat_segmentation 10
+#define Z_DiagFormat_extServices 11
+#define Z_DiagFormat_accessCtrl 12
+#define Z_DiagFormat_recordSyntax 13
+    union
+    {
+	Z_TooMany *tooMany;
+	Z_BadSpec *badSpec;
+	Z_DbUnavail *dbUnavail;
+	int *unSupOp;
+#define Z_UnSupOp_and             0
+#define Z_UnSupOp_or              1
+#define Z_UnSupOp_and_not         2
+#define Z_UnSupOp_prox            3
+	Z_Attribute *attribute;
+	Z_AttributeList *attCombo;
+	Z_DiagTerm *term;
+	Z_Proximity *proximity;
+	Z_Scan *scan;
+	Z_Sort *sort;
+	Z_Segmentation *segmentation;
+	Z_ExtServices *extServices;
+	Z_AccessCtrl *accessCtrl;
+	Z_RecordSyntax *recordSyntax;
+    } u;
+} Z_DiagFormat;
+
+typedef struct Z_Diagnostic
+{
+    int which;
+#define Z_Diagnostic_defaultDiagRec 0
+#define Z_Diagnostic_explicitDiagnostic 1
+    union 
+    {
+	Z_DefaultDiagFormat *defaultDiagRec;
+	Z_DiagFormat *explicitDiagnostic;
+    } u;
+} Z_Diagnostic;
+
+typedef struct Z_DiagnosticUnit
+{
+    Z_Diagnostic *diagnostic;                    /* OPTIONAL */
+    char *message;                               /* OPTIONAL */
+} Z_DiagnosticUnit;
+
+typedef struct Z_DiagnosticFormat
+{
+    int num_diagnostics;
+    Z_DiagnosticUnit **diagnostics;
+} Z_DiagnosticFormat;
+
+YAZ_EXPORT int z_DiagnosticFormat(ODR o, Z_DiagnosticFormat **p, int opt,
+				  const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-esp.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-esp.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-esp.h	(revision 21083)
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 1995, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_ESP_H
+#define PRT_ESP_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_OccurValues
+{
+    int *start;
+    int *howMany;                     /* OPTIONAL */
+} Z_OccurValues;
+
+typedef struct Z_Occurrences
+{
+    int which;
+#define Z_Occurrences_all 0
+#define Z_Occurrences_last 1
+#define Z_Occurrences_values 2
+    union
+    {
+	Odr_null *all;
+	Odr_null *last;
+	Z_OccurValues *values;
+    } u;
+} Z_Occurrences;
+
+typedef struct Z_SpecificTag
+{
+    Odr_oid *schemaId;                      /* OPTIONAL */
+    int *tagType;                           /* OPTIONAL */
+    Z_StringOrNumeric *tagValue;
+    Z_Occurrences *occurrences;             /* OPTIONAL */
+} Z_SpecificTag;
+
+typedef struct Z_ETagUnit
+{
+    int which;
+#define Z_ETagUnit_specificTag 0
+#define Z_ETagUnit_wildThing 1
+#define Z_ETagUnit_wildPath 2
+    union
+    {
+	Z_SpecificTag *specificTag;
+	Z_Occurrences *wildThing;
+	Odr_null *wildPath;
+    } u;
+} Z_ETagUnit;
+
+typedef struct Z_ETagPath
+{
+    int num_tags;
+    Z_ETagUnit **tags;
+} Z_ETagPath;
+
+typedef struct Z_SimpleElement
+{
+    Z_ETagPath *path;
+    Z_Variant *variantRequest;           /* OPTIONAL */
+} Z_SimpleElement;
+
+typedef struct Z_CompoPrimitives
+{
+    int num_primitives;
+    char **primitives;
+} Z_CompoPrimitives;
+
+typedef struct Z_CompoSpecs
+{
+    int num_specs;
+    Z_SimpleElement **specs;
+} Z_CompoSpecs;
+
+typedef struct Z_CompositeElement
+{
+    int which;
+#define Z_CompoElement_primitives 0
+#define Z_CompoElement_specs 1
+    union
+    {
+	Z_CompoPrimitives *primitives;
+	Z_CompoSpecs *specs;
+    } elementList;
+    Z_ETagPath *deliveryTag;
+    Z_Variant *variantRequest;
+} Z_CompositeElement;
+
+typedef struct Z_ElementRequest
+{
+    int which;
+#define Z_ERequest_simpleElement 0
+#define Z_ERequest_compositeElement 1
+    union
+    {
+	Z_SimpleElement *simpleElement;
+	Z_CompositeElement *compositeElement;
+    } u;
+} Z_ElementRequest;
+
+typedef struct Z_Espec1
+{
+    int num_elementSetNames;
+    char **elementSetNames;               /* OPTIONAL */
+    Odr_oid *defaultVariantSetId;         /* OPTIONAL */
+    Z_Variant *defaultVariantRequest;     /* OPTIONAL */
+    int *defaultTagType;                  /* OPTIONAL */
+    int num_elements;
+    Z_ElementRequest **elements;           /* OPTIONAL */
+} Z_Espec1;
+
+YAZ_EXPORT int z_Espec1(ODR o, Z_Espec1 **p, int opt, const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exd.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exd.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exd.h	(revision 21083)
@@ -0,0 +1,268 @@
+/*
+ * Copyright (c) 1995-1998, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_EXD_H
+#define PRT_EXD_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_TaskPackage
+{
+    Odr_oid *packageType;                 
+    char *packageName;                      /* OPTIONAL */
+    char *userId;                           /* OPTIONAL */
+    Z_IntUnit *retentionTime;               /* OPTIONAL */
+    Z_Permissions *permissions;             /* OPTIONAL */
+    char *description;                      /* OPTIONAL */
+    Odr_oct *targetReference;             
+    char *creationDateTime;    /* OPTIONAL */
+    int *taskStatus;                      
+#define Z_TaskPackage_pending             0
+#define Z_TaskPackage_active              1
+#define Z_TaskPackage_complete            2
+#define Z_TaskPackage_aborted             3
+    int num_packageDiagnostics;
+    Z_DiagRec **packageDiagnostics;         /* OPTIONAL */
+    Z_External *taskSpecificParameters;   
+} Z_TaskPackage;
+
+int z_TaskPackage(ODR o, Z_TaskPackage **p, int opt, const char *name);
+
+/* ----------------------- ITEM ORDER ------------------------- */
+
+typedef struct Z_IOTargetPart
+{
+    Z_External *itemRequest;                   /* OPTIONAL */
+    Z_External *statusOrErrorReport;
+    int *auxiliaryStatus;                      /* OPTIONAL */
+#define Z_IOTargetPart_notReceived        1
+#define Z_IOTargetPart_loanQueue          2
+#define Z_IOTargetPart_forwarded          3
+#define Z_IOTargetPart_unfilledCopyright  4
+#define Z_IOTargetPart_filledCopyright    1
+} Z_IOTargetPart;
+
+typedef struct Z_IOResultSetItem
+{
+    char *resultSetId;
+    int *item;
+} Z_IOResultSetItem;
+
+typedef struct Z_IOOriginPartNotToKeep
+{
+    Z_IOResultSetItem *resultSetItem;          /* OPTIONAL */
+    Z_External *itemRequest;                   /* OPTIONAL */
+} Z_IOOriginPartNotToKeep;
+
+typedef struct Z_IOContact
+{
+    char *name;                                /* OPTIONAL */
+    char *phone;                               /* OPTIONAL */
+    char *email;                               /* OPTIONAL */
+} Z_IOContact;
+
+typedef struct Z_IOCreditCardInfo
+{
+    char *nameOnCard;
+    char *expirationDate;
+    char *cardNumber;
+} Z_IOCreditCardInfo;
+
+typedef struct Z_IOBilling
+{
+    int which;
+#define Z_IOBilling_billInvoice 0
+#define Z_IOBilling_prepay 1
+#define Z_IOBilling_depositAccount 2
+#define Z_IOBilling_creditCard 3
+#define Z_IOBilling_cardInfoPreviouslySupplied 4
+#define Z_IOBilling_privateKnown 5
+#define Z_IOBilling_privateNotKnown 6
+    union
+    {
+	Odr_null *noinfo;
+	Z_IOCreditCardInfo *creditCard;
+	Z_External *privateNotKnown;
+    } paymentMethod;
+    char *customerReference;                        /* OPTIONAL */
+    char *customerPONumber;                         /* OPTIONAL */
+} Z_IOBilling;
+
+typedef struct Z_IOOriginPartToKeep
+{
+    Z_External *supplDescription;              /* OPTIONAL */
+    Z_IOContact *contact;                      /* OPTIONAL */
+    Z_IOBilling *addlBilling;                  /* OPTIONAL */
+} Z_IOOriginPartToKeep;
+
+typedef struct Z_IORequest
+{
+    Z_IOOriginPartToKeep *toKeep;              /* OPTIONAL */
+    Z_IOOriginPartNotToKeep *notToKeep;
+} Z_IORequest;
+
+typedef struct Z_IOTaskPackage
+{
+    Z_IOOriginPartToKeep *originPart;          /* OPTIONAL */
+    Z_IOTargetPart *targetPart;
+} Z_IOTaskPackage;
+
+typedef struct Z_ItemOrder
+{
+    int which;
+#define Z_ItemOrder_esRequest 0
+#define Z_ItemOrder_taskPackage 1
+    union
+    {
+	Z_IORequest *esRequest;
+	Z_IOTaskPackage *taskPackage;
+    } u;
+} Z_ItemOrder;
+
+int z_ItemOrder(ODR o, Z_ItemOrder **p, int opt, const char *name);
+
+/* ----------------------- ITEM UPDATE ------------------------ */
+
+typedef struct Z_IUSuppliedRecordsId
+{
+    int which;
+#define Z_IUSuppliedRecordsId_timeStamp 1
+#define Z_IUSuppliedRecordsId_versionNumber 2
+#define Z_IUSuppliedRecordsId_previousVersion 3
+    union {
+        char *timeStamp;
+        char *versionNumber;
+        Odr_external *previousVersion;
+    } u;
+} Z_IUSuppliedRecordsId;
+
+typedef struct Z_IUCorrelationInfo
+{
+    char *note; /* OPTIONAL */
+    int *id; /* OPTIONAL */
+} Z_IUCorrelationInfo;
+
+typedef struct Z_IUSuppliedRecords_elem
+{
+    int which;
+#define Z_IUSuppliedRecords_number 1
+#define Z_IUSuppliedRecords_string 2
+#define Z_IUSuppliedRecords_opaque 3
+    union {
+        int *number;
+        char *string;
+        Odr_oct *opaque;
+    } u; /* OPTIONAL */
+    Z_IUSuppliedRecordsId *supplementalId; /* OPTIONAL */
+    Z_IUCorrelationInfo *correlationInfo;    /* OPTIONAL */
+    Z_External *record;
+} Z_IUSuppliedRecords_elem;
+
+typedef struct Z_IUSuppliedRecords
+{
+    int num;
+    Z_IUSuppliedRecords_elem **elements;
+} Z_IUSuppliedRecords;
+
+typedef struct Z_IUOriginPartToKeep
+{
+    int *action;
+#define Z_IUOriginPartToKeep_recordInsert 1
+#define Z_IUOriginPartToKeep_recordReplace 2
+#define Z_IUOriginPartToKeep_recordDelete 3
+#define Z_IUOriginPartToKeep_elementUpdate 4
+#define Z_IUOriginPartToKeep_specialUpdate 5
+    char *databaseName;
+    Odr_oid *schema;               /* OPTIONAL */
+    char *elementSetName;          /* OPTIONAL */
+    Odr_external *actionQualifier; /* OPTIONAL */
+} Z_IUOriginPartToKeep;
+
+typedef struct Z_IUTaskPackageRecordStructure
+{
+    int which;
+#define Z_IUTaskPackageRecordStructure_record 1
+#define Z_IUTaskPackageRecordStructure_surrogateDiagnostics 2
+    union {
+        Odr_external *record;
+        Z_DiagRecs *surrogateDiagnostics;
+    } u; /* OPTIONAL */
+    Z_IUCorrelationInfo *correlationInfo; /* OPTIONAL */
+    int *recordStatus;
+#define Z_IUTaskPackageRecordStructureS_success 1
+#define Z_IUTaskPackageRecordStructureS_queued 2
+#define Z_IUTaskPackageRecordStructureS_inProcess 3
+#define Z_IUTaskPackageRecordStructureS_failure 4
+    Z_DiagRecs *supplementalDiagnostics;  /* OPTIONAL */
+} Z_IUTaskPackageRecordStructure;
+
+typedef struct Z_IUTargetPart
+{
+    int *updateStatus;
+#define Z_IUTargetPart_success 1
+#define Z_IUTargetPart_partial 2
+#define Z_IUTargetPart_failure 3
+    int num_globalDiagnostics;
+    Z_DiagRec **globalDiagnostics; /* OPTIONAL */
+    int num_taskPackageRecords;
+    Z_IUTaskPackageRecordStructure **taskPackageRecords;
+} Z_IUTargetPart;
+
+typedef struct Z_IUUpdateEsRequest
+{
+    Z_IUOriginPartToKeep *toKeep;
+    Z_IUSuppliedRecords *notToKeep;
+} Z_IUUpdateEsRequest;
+
+typedef struct Z_IUUpdateTaskPackage
+{
+    Z_IUOriginPartToKeep *originPart;
+    Z_IUTargetPart *targetPart;
+} Z_IUUpdateTaskPackage;
+
+typedef struct Z_IUUpdate
+{
+    int which;
+#define Z_IUUpdate_esRequest 1
+#define Z_IUUpdate_taskPackage 2
+    union {
+        Z_IUUpdateEsRequest *esRequest;
+        Z_IUUpdateTaskPackage *taskPackage;
+    } u;
+} Z_IUUpdate;
+
+YAZ_EXPORT int z_IUUpdate(ODR o, Z_IUUpdate **p, int opt, const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exp.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exp.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-exp.h	(revision 21083)
@@ -0,0 +1,1017 @@
+/*
+ * Copyright (c) 1995-1998, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_EXP_H
+#define PRT_EXP_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_CommonInfo
+{
+    char *dateAdded;           /* OPTIONAL */
+    char *dateChanged;         /* OPTIONAL */
+    char *expiry;              /* OPTIONAL */
+    char *humanStringLanguage;    /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_CommonInfo;
+
+typedef struct Z_HumanStringUnit
+{
+    char *language;               /* OPTIONAL */
+    char *text;
+} Z_HumanStringUnit;
+
+typedef struct Z_HumanString
+{
+    int num_strings;
+    Z_HumanStringUnit **strings;
+} Z_HumanString;
+
+typedef struct Z_IconObjectUnit
+{
+    int which;
+#define Z_IconObjectUnit_ianaType 0
+#define Z_IconObjectUnit_z3950type 1
+#define Z_IconObjectUnit_otherType 2
+    char *bodyType;
+    Odr_oct *content;
+} Z_IconObjectUnit;
+
+typedef struct Z_IconObject
+{
+    int num;
+    Z_IconObjectUnit **elements;
+} Z_IconObject;
+
+typedef struct Z_ContactInfo
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_HumanString *address;                 /* OPTIONAL */
+    char *email;                            /* OPTIONAL */
+    char *phone;                            /* OPTIONAL */
+} Z_ContactInfo;
+
+typedef struct Z_NetworkAddressIA
+{
+    char *hostAddress;
+    int *port;
+} Z_NetworkAddressIA;
+
+typedef struct Z_NetworkAddressOPA
+{
+    char *pSel;
+    char *sSel;                  /* OPTIONAL */
+    char *tSel;                  /* OPTIONAL */
+    char *nSap;
+} Z_NetworkAddressOPA;
+
+typedef struct Z_NetworkAddressOther
+{
+    char *type;
+    char *address;
+} Z_NetworkAddressOther;
+
+typedef struct Z_NetworkAddress
+{
+    int which;
+#define Z_NetworkAddress_iA 0
+#define Z_NetworkAddress_oPA 1
+#define Z_NetworkAddress_other 2
+    union
+    {
+    	Z_NetworkAddressIA *internetAddress;
+	Z_NetworkAddressOPA *osiPresentationAddress;
+	Z_NetworkAddressOther *other;
+    } u;
+} Z_NetworkAddress;
+
+typedef struct Z_PrivateCapOperator
+{
+    char *roperator;
+    Z_HumanString *description;             /* OPTIONAL */
+} Z_PrivateCapOperator;
+    
+typedef struct Z_SearchKey
+{
+    char *searchKey;
+    Z_HumanString *description;             /* OPTIONAL */
+} Z_SearchKey;
+
+typedef struct Z_PrivateCapabilities
+{
+    int num_operators;
+    Z_PrivateCapOperator **operators;      /* OPTIONAL */
+    int num_searchKeys;
+    Z_SearchKey **searchKeys;               /* OPTIONAL */
+    int num_description;
+    Z_HumanString **description;            /* OPTIONAL */
+} Z_PrivateCapabilities;
+
+typedef struct Z_ProxSupportPrivate
+{
+    int *unit;
+    Z_HumanString *description;             /* OPTIONAL */
+} Z_ProxSupportPrivate;
+
+typedef struct Z_ProxSupportUnit
+{
+    int which;
+#define Z_ProxSupportUnit_known 0
+#define Z_ProxSupportUnit_private 1
+    union
+    {
+    	int *known;
+	Z_ProxSupportPrivate *zprivate;
+    } u;
+} Z_ProxSupportUnit;
+
+typedef struct Z_ProximitySupport
+{
+    bool_t *anySupport;
+    int num_unitsSupported;
+    Z_ProxSupportUnit **unitsSupported;     /* OPTIONAL */
+} Z_ProximitySupport;
+
+typedef struct Z_RpnCapabilities
+{
+    int num_operators;
+    int **operators;                        /* OPTIONAL */
+    bool_t *resultSetAsOperandSupported;
+    bool_t *restrictionOperandSupported;
+    Z_ProximitySupport *proximity;          /* OPTIONAL */
+} Z_RpnCapabilities;
+
+typedef struct Z_Iso8777Capabilities
+{
+    int num_searchKeys;
+    Z_SearchKey **searchKeys;
+    Z_HumanString *restrictions;            /* OPTIONAL */
+} Z_Iso8777Capabilities;
+
+typedef struct Z_QueryTypeDetails
+{
+    int which;
+#define Z_QueryTypeDetails_private 0
+#define Z_QueryTypeDetails_rpn 1
+#define Z_QueryTypeDetails_iso8777 2
+#define Z_QueryTypeDetails_z39_58 3
+#define Z_QueryTypeDetails_erpn 4
+#define Z_QueryTypeDetails_rankedList 5
+    union
+    {
+	Z_PrivateCapabilities *zprivate;
+	Z_RpnCapabilities *rpn;
+	Z_Iso8777Capabilities *iso8777;
+	Z_HumanString *z3958;
+	Z_RpnCapabilities *erpn;
+	Z_HumanString *rankedList;
+    } u;
+} Z_QueryTypeDetails;
+
+typedef struct Z_AccessRestrictionsUnit
+{
+    int *accessType;
+#define Z_AccessRestrictionsUnit_any                 0
+#define Z_AccessRestrictionsUnit_search              1
+#define Z_AccessRestrictionsUnit_present             2
+#define Z_AccessRestrictionsUnit_specific_elements   3
+#define Z_AccessRestrictionsUnit_extended_services   4
+#define Z_AccessRestrictionsUnit_by_database         5
+    Z_HumanString *accessText;              /* OPTIONAL */
+    int num_accessChallenges;
+    Odr_oid **accessChallenges;             /* OPTIONAL */
+} Z_AccessRestrictionsUnit;
+
+typedef struct Z_AccessRestrictions
+{
+    int num;
+    Z_AccessRestrictionsUnit **elements;
+} Z_AccessRestrictions;
+
+typedef struct Z_Charge
+{
+    Z_IntUnit *cost;
+    Z_Unit *perWhat;                        /* OPTIONAL */
+    Z_HumanString *text;                    /* OPTIONAL */
+} Z_Charge;
+
+typedef struct Z_CostsOtherCharge
+{
+    Z_HumanString *forWhat;
+    Z_Charge *charge;
+} Z_CostsOtherCharge;
+
+typedef struct Z_Costs
+{
+    Z_Charge *connectCharge;                /* OPTIONAL */
+    Z_Charge *connectTime;                  /* OPTIONAL */
+    Z_Charge *displayCharge;                /* OPTIONAL */
+    Z_Charge *searchCharge;                 /* OPTIONAL */
+    Z_Charge *subscriptCharge;              /* OPTIONAL */
+    int num_otherCharges;
+    Z_CostsOtherCharge **otherCharges;      /* OPTIONAL */
+} Z_Costs;
+
+typedef struct Z_AccessInfo
+{
+    int num_queryTypesSupported;
+    Z_QueryTypeDetails **queryTypesSupported;  /* OPTIONAL */
+    int num_diagnosticsSets;
+    Odr_oid **diagnosticsSets;              /* OPTIONAL */
+    int num_attributeSetIds;
+    Odr_oid **attributeSetIds;     /* OPTIONAL */
+    int num_schemas;
+    Odr_oid **schemas;                      /* OPTIONAL */
+    int num_recordSyntaxes;
+    Odr_oid **recordSyntaxes;               /* OPTIONAL */
+    int num_resourceChallenges;
+    Odr_oid **resourceChallenges;           /* OPTIONAL */
+    Z_AccessRestrictions *restrictedAccess;  /* OPTIONAL */
+    Z_Costs *costInfo;                      /* OPTIONAL */
+    int num_variantSets;
+    Odr_oid **variantSets;                  /* OPTIONAL */
+    int num_elementSetNames;
+    char **elementSetNames;     /* OPTIONAL */
+    int num_unitSystems;
+    char **unitSystems;                     /* OPTIONAL */
+} Z_AccessInfo;
+
+typedef struct Z_DatabaseList
+{
+    int num_databases;
+    Z_DatabaseName **databases;
+} Z_DatabaseList;
+
+typedef struct Z_AttributeValueList
+{
+    int num_attributes;
+    Z_StringOrNumeric **attributes;
+} Z_AttributeValueList;
+
+typedef struct Z_AttributeOccurrence
+{
+    Odr_oid *attributeSet;         /* OPTIONAL */
+    int *attributeType;
+    Odr_null *mustBeSupplied;               /* OPTIONAL */
+    int which;
+#define Z_AttributeOcc_any_or_none 0
+#define Z_AttributeOcc_specific 1
+    union
+    {
+	Odr_null *any_or_none;
+	Z_AttributeValueList *specific;
+    } attributeValues;
+} Z_AttributeOccurrence;
+
+typedef struct Z_AttributeCombination
+{
+    int num_occurrences;
+    Z_AttributeOccurrence **occurrences;
+} Z_AttributeCombination;
+
+typedef struct Z_AttributeCombinations
+{
+    Odr_oid *defaultAttributeSet;
+    int num_legalCombinations;
+    Z_AttributeCombination **legalCombinations;
+} Z_AttributeCombinations;
+
+typedef struct Z_AttributeValue
+{
+    Z_StringOrNumeric *value;
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_subAttributes;
+    Z_StringOrNumeric **subAttributes;      /* OPTIONAL */
+    int num_superAttributes;
+    Z_StringOrNumeric **superAttributes;    /* OPTIONAL */
+    Odr_null *partialSupport;               /* OPTIONAL */
+} Z_AttributeValue;
+
+typedef struct Z_TargetInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * key elements
+     */
+    char *name;
+    /*
+     * non-key brief elements
+     */
+    Z_HumanString *recentNews;             /* OPTIONAL */
+    Z_IconObject *icon;                     /* OPTIONAL */
+    bool_t *namedResultSets;
+    bool_t *multipleDBsearch;
+    int *maxResultSets;                     /* OPTIONAL */
+    int *maxResultSize;                     /* OPTIONAL */
+    int *maxTerms;                          /* OPTIONAL */
+    Z_IntUnit *timeoutInterval;             /* OPTIONAL */
+    Z_HumanString *welcomeMessage;          /* OPTIONAL */
+    /*
+     * non-brief elements
+     */
+    Z_ContactInfo *contactInfo;             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_nicknames;
+    char **nicknames;
+    Z_HumanString *usageRest;              /* OPTIONAL */
+    Z_HumanString *paymentAddr;             /* OPTIONAL */
+    Z_HumanString *hours;                   /* OPTIONAL */
+    int num_dbCombinations;
+    Z_DatabaseList **dbCombinations;        /* OPTIONAL */
+    int num_addresses;
+    Z_NetworkAddress **addresses;           /* OPTIONAL */
+    int num_languages;
+    char **languages;                       /* OPTIONAL */
+
+    Z_AccessInfo *commonAccessInfo;         /* OPTIONAL */
+} Z_TargetInfo;
+
+typedef struct Z_DatabaseInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *name;
+    /* 
+     * Non-key elements.
+     */
+    Odr_null *explainDatabase;              /* OPTIONAL */
+    int num_nicknames;
+    Z_DatabaseName **nicknames;             /* OPTIONAL */
+    Z_IconObject *icon;                     /* OPTIONAL */
+    bool_t *userFee;
+    bool_t *available;
+    Z_HumanString *titleString;             /* OPTIONAL */
+    /*
+     * Non-brief elements.
+     */
+    int num_keywords;
+    Z_HumanString **keywords;               /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_DatabaseList *associatedDbs;          /* OPTIONAL */
+    Z_DatabaseList *subDbs;                 /* OPTIONAL */
+    Z_HumanString *disclaimers;             /* OPTIONAL */
+    Z_HumanString *news;                    /* OPTIONAL */
+
+#if 1
+    int which;
+    union {
+	int *actualNumber;
+	int *approxNumber;
+#define Z_DatabaseInfo_actualNumber 1
+#define Z_DatabaseInfo_approxNumber 2
+    } u; /* OPT */
+
+#else
+    int recordCount_which;
+#define Z_DatabaseInfo_actualNumber 0
+#define Z_DatabaseInfo_approxNumber 1
+    int *recordCount;                       /* OPTIONAL */
+#endif
+    Z_HumanString *defaultOrder;            /* OPTIONAL */
+    int *avRecordSize;                      /* OPTIONAL */
+    int *maxRecordSize;                     /* OPTIONAL */
+    Z_HumanString *hours;                   /* OPTIONAL */
+    Z_HumanString *bestTime;                /* OPTIONAL */
+    char *lastUpdate;          /* OPTIONAL */
+    Z_IntUnit *updateInterval;              /* OPTIONAL */
+    Z_HumanString *coverage;                /* OPTIONAL */
+    bool_t *proprietary;                    /* OPTIONAL */
+    Z_HumanString *copyrightText;           /* OPTIONAL */
+    Z_HumanString *copyrightNotice;         /* OPTIONAL */
+    Z_ContactInfo *producerContactInfo;     /* OPTIONAL */
+    Z_ContactInfo *supplierContactInfo;     /* OPTIONAL */
+    Z_ContactInfo *submissionContactInfo;   /* OPTIONAL */
+    Z_AccessInfo *accessInfo;               /* OPTIONAL */
+} Z_DatabaseInfo;
+
+typedef struct Z_TagTypeMapping
+{
+    int *tagType;
+    Odr_oid *tagSet;                        /* OPTIONAL */
+    Odr_null *defaultTagType;               /* OPTIONAL */
+} Z_TagTypeMapping;
+
+typedef struct Z_PathUnit
+{
+    int *tagType;
+    Z_StringOrNumeric *tagValue;
+} Z_PathUnit;
+
+typedef struct Z_Path
+{
+    int num;
+    Z_PathUnit **list;
+} Z_Path;
+
+struct Z_ElementDataType;
+typedef struct Z_ElementDataType Z_ElementDataType;
+
+typedef struct Z_ElementInfo
+{
+    char *elementName;
+    Z_Path *elementTagPath;
+    Z_ElementDataType *dataType;            /* OPTIONAL */
+    bool_t *required;
+    bool_t *repeatable;
+    Z_HumanString *description;             /* OPTIONAL */
+} Z_ElementInfo;
+
+typedef struct Z_ElementInfoList
+{
+    int num;
+    Z_ElementInfo **list;
+} Z_ElementInfoList;
+
+struct Z_ElementDataType
+{
+    int which;
+#define Z_ElementDataType_primitive 0
+#define Z_ElementDataType_structured 1
+    union
+    {
+    	int *primitive;
+#define Z_PrimitiveDataType_octetString         0
+#define Z_PrimitiveDataType_numeric             1
+#define Z_PrimitiveDataType_date                2
+#define Z_PrimitiveDataType_external            3
+#define Z_PrimitiveDataType_string              4
+#define Z_PrimitiveDataType_trueOrFalse         5
+#define Z_PrimitiveDataType_oid                 6
+#define Z_PrimitiveDataType_intUnit             7
+#define Z_PrimitiveDataType_empty               8
+#define Z_PrimitiveDataType_noneOfTheAbove      100
+	Z_ElementInfoList *structured;
+    } u;
+};
+
+typedef struct Z_TagSetInfoElements
+{
+    char *elementname;
+    int num_nicknames;
+    char **nicknames;                       /* OPTIONAL */
+    Z_StringOrNumeric *elementTag;
+    Z_HumanString *description;             /* OPTIONAL */
+    int *dataType;                          /* OPTIONAL */
+    /* (value as in Z_PrimitiveElement) */
+    Z_OtherInformation *otherTagInfo;       /* OPTIONAL */
+} Z_TagSetInfoElements;
+
+typedef struct Z_SchemaInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *schema;
+    /*
+     * Non-key elements
+     */
+    char *name;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_tagTypeMapping;
+    Z_TagTypeMapping **tagTypeMapping;      /* OPTIONAL */
+    int num_recordStructure;
+    Z_ElementInfo **recordStructure;        /* OPTIONAL */
+} Z_SchemaInfo;
+
+
+typedef struct Z_TagSetInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *tagSet;
+    /*
+     * Non-key elements
+     */
+    char *name;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_elements;
+    Z_TagSetInfoElements **elements;        /* OPTIONAL */
+} Z_TagSetInfo;
+
+typedef struct Z_RecordSyntaxInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *recordSyntax;
+    /*
+     * Non-key elements
+     */
+    char *name;
+    /*
+     * Non-brief elements
+     */
+    int num_transferSyntaxes;
+    Odr_oid **transferSyntaxes;             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    char *asn1Module;                       /* OPTIONAL */
+    int num_abstractStructure;
+    Z_ElementInfo **abstractStructure;      /* OPTIONAL */
+} Z_RecordSyntaxInfo;
+
+typedef struct Z_AttributeDescription
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_StringOrNumeric *attributeValue;
+    int num_equivalentAttributes;
+    Z_StringOrNumeric **equivalentAttributes; /* OPTIONAL */
+} Z_AttributeDescription;
+
+typedef struct Z_AttributeType
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    int *attributeType;
+    int num_attributeValues;
+    Z_AttributeDescription **attributeValues;
+} Z_AttributeType;
+
+typedef struct Z_AttributeSetInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *attributeSet;
+    /*
+     * Non-key elements
+     */
+    char *name;
+    /*
+     * Non-brief elements
+     */
+    int num_attributes;
+    Z_AttributeType **attributes;           /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+} Z_AttributeSetInfo;
+
+typedef struct Z_TermListElement
+{
+    char *name;
+    Z_HumanString *title;                   /* OPTIONAL */
+    int *searchCost;                        /* OPTIONAL */
+#define Z_TermListElement_optimized           0
+#define Z_TermListElement_normal              1
+#define Z_TermListElement_expensive           2
+#define Z_TermListElement_filter              3
+    bool_t *scanable;
+    int num_broader;
+    char **broader;                         /* OPTIONAL */
+    int num_narrower;
+    char **narrower;                        /* OPTIONAL */
+} Z_TermListElement;
+
+typedef struct Z_TermListInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *databaseName;
+    /*
+     * Non-key elements
+     */
+    int num_termLists;
+    Z_TermListElement **termLists;
+} Z_TermListInfo;
+
+typedef struct Z_ExtendedServicesInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *type;
+    /*
+     * Non-key elements
+     */
+    char *name;                             /* OPTIONAL */
+    bool_t *privateType;
+    bool_t *restrictionsApply;
+    bool_t *feeApply;
+    bool_t *available;
+    bool_t *retentionSupported;
+    int *waitAction;
+#define Z_ExtendedServicesInfo_waitSupported       1
+#define Z_ExtendedServicesInfo_waitAlways          2
+#define Z_ExtendedServicesInfo_waitNotSupported    3
+#define Z_ExtendedServicesInfo_depends             4
+#define Z_ExtendedServicesInfo_notSaying           5
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_External *specificExplain;          /* OPTIONAL */
+    char *esASN;                            /* OPTIONAL */
+} Z_ExtendedServicesInfo;
+
+typedef struct Z_OmittedAttributeInterpretation
+{
+    Z_StringOrNumeric *defaultValue;        /* OPTIONAL */
+    Z_HumanString *defaultDescription;      /* OPTIONAL */
+} Z_OmittedAttributeInterpretation;
+
+typedef struct Z_AttributeTypeDetails
+{
+    int *attributeType;
+    Z_OmittedAttributeInterpretation *defaultIfOmitted;  /* OPTIONAL */
+    int num_attributeValues;
+    Z_AttributeValue **attributeValues;     /* OPTIONAL */
+} Z_AttributeTypeDetails;
+
+typedef struct Z_AttributeSetDetails
+{
+    Odr_oid *attributeSet;
+    int num_attributesByType;
+    Z_AttributeTypeDetails **attributesByType;
+} Z_AttributeSetDetails;
+
+typedef struct Z_AttributeDetails
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key details
+     */
+    Z_DatabaseName *databaseName;
+    /*
+     * Non-brief elements
+     */
+    int num_attributesBySet;
+    Z_AttributeSetDetails **attributesBySet;  /* OPTIONAL */
+    Z_AttributeCombinations *attributeCombinations;  /* OPTIONAL */
+} Z_AttributeDetails;
+
+typedef struct Z_EScanInfo
+{
+    int *maxStepSize;                       /* OPTIONAL */
+    Z_HumanString *collatingSequence;       /* OPTIONAL */
+    bool_t *increasing;                     /* OPTIONAL */
+} Z_EScanInfo;
+
+typedef struct Z_TermListDetails
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    char *termListName;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_AttributeCombinations *attributes;    /* OPTIONAL */
+    Z_EScanInfo *scanInfo;                  /* OPTIONAL */
+    int *estNumberTerms;                    /* OPTIONAL */
+    int num_sampleTerms;
+    Z_Term **sampleTerms;                   /* OPTIONAL */
+} Z_TermListDetails;
+
+typedef struct Z_RecordTag
+{
+    Z_StringOrNumeric *qualifier;           /* OPTIONAL */
+    Z_StringOrNumeric *tagValue;
+} Z_RecordTag;
+
+typedef struct Z_PerElementDetails
+{
+    char *name;                             /* OPTIONAL */
+    Z_RecordTag *recordTag;                 /* OPTIONAL */
+    int num_schemaTags;
+    Z_Path **schemaTags;                    /* OPTIONAL */
+    int *maxSize;                           /* OPTIONAL */
+    int *minSize;                           /* OPTIONAL */
+    int *avgSize;                           /* OPTIONAL */
+    int *fixedSize;                         /* OPTIONAL */
+    bool_t *repeatable;
+    bool_t *required;
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_HumanString *contents;                /* OPTIONAL */
+    Z_HumanString *billingInfo;             /* OPTIONAL */
+    Z_HumanString *restrictions;            /* OPTIONAL */
+    int num_alternateNames;
+    char **alternateNames;                  /* OPTIONAL */
+    int num_genericNames;
+    char **genericNames;                    /* OPTIONAL */
+    Z_AttributeCombinations *searchAccess;  /* OPTIONAL */
+} Z_PerElementDetails;
+
+typedef struct Z_ElementSetDetails
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *databaseName;
+    char *elementSetName;
+    Odr_oid *recordSyntax;
+    /*
+     * Brief elements
+     */
+    Odr_oid *schema;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_detailsPerElement;
+    Z_PerElementDetails **detailsPerElement;  /* OPTIONAL */
+} Z_ElementSetDetails;
+
+typedef struct Z_RetrievalRecordDetails
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *databaseName;
+    Odr_oid *schema;
+    Odr_oid *recordSyntax;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_detailsPerElement;
+    Z_PerElementDetails **detailsPerElement;  /* OPTIONAL */
+} Z_RetrievalRecordDetails;
+
+typedef struct Z_SortKeyDetails
+{
+    Z_HumanString *description;                        /* OPTIONAL */
+    int num_elementSpecifications;
+    Z_Specification **elementSpecifications;           /* OPTIONAL */
+    Z_AttributeCombinations *attributeSpecifications;  /* OPTIONAL */
+    int which;
+#define Z_SortKeyDetails_character 0
+#define Z_SortKeyDetails_numeric 1
+#define Z_SortKeyDetails_structured 2
+    union
+    {
+	Odr_null *character;
+	Odr_null *numeric;
+	Z_HumanString *structured;
+    } u;
+    int *caseSensitivity;                              /* OPTIONAL */
+#define Z_SortKeyDetails_always              0
+#define Z_SortKeyDetails_never               1
+#define Z_SortKeyDetails_default_yes         2
+#define Z_SortKeyDetails_default_no          3
+} Z_SortKeyDetails;
+
+typedef struct Z_SortDetails
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *databaseName;
+    /* 
+     * Non-brief elements
+     */
+    int num_sortKeys;
+    Z_SortKeyDetails **sortKeys;            /* OPTIONAL */
+} Z_SortDetails;
+
+typedef struct Z_ProcessingInformation
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Z_DatabaseName *databaseName;
+    int *processingContext;
+#define Z_ProcessingInformation_access               0
+#define Z_ProcessingInformation_search               1
+#define Z_ProcessingInformation_retrieval            2
+#define Z_ProcessingInformation_record_presentation  3
+#define Z_ProcessingInformation_record_handling      4
+    char *name;
+    Odr_oid *oid;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_External *instructions;             /* OPTIONAL */
+} Z_ProcessingInformation;
+
+typedef struct Z_ValueDescription
+{
+    int which;
+#define Z_ValueDescription_integer 0
+#define Z_ValueDescription_string 1
+#define Z_ValueDescription_octets 2
+#define Z_ValueDescription_oid 3
+#define Z_ValueDescription_unit 4
+#define Z_ValueDescription_valueAndUnit 5
+    union
+    {
+	int *integer;
+	char *string;
+	Odr_oct *octets;
+	Odr_oid *oid;
+	Z_Unit *unit;
+	Z_IntUnit *valueAndUnit;
+    } u;
+} Z_ValueDescription;
+
+typedef struct Z_ValueRange
+{
+    Z_ValueDescription *lower;              /* OPTIONAL */
+    Z_ValueDescription *upper;              /* OPTIONAL */
+} Z_ValueRange;
+
+typedef struct Z_ValueSetEnumerated
+{
+    int num;
+    Z_ValueDescription **elements;
+} Z_ValueSetEnumerated;
+
+typedef struct Z_ValueSet
+{
+    int which;
+#define Z_ValueSet_range 0
+#define Z_ValueSet_enumerated 1
+    union
+    {
+	Z_ValueRange *range;
+	Z_ValueSetEnumerated *enumerated;
+    } u;
+} Z_ValueSet;
+
+typedef struct Z_VariantValue
+{
+    int *dataType;
+    Z_ValueSet *values;                     /* OPTIONAL */
+} Z_VariantValue;
+
+typedef struct Z_VariantType
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    int *variantType;
+    Z_VariantValue *variantValue;           /* OPTIONAL */
+} Z_VariantType;
+
+typedef struct Z_VariantClass
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    int *variantClass;
+    int num_variantTypes;
+    Z_VariantType **variantTypes;
+} Z_VariantClass;
+
+typedef struct Z_VariantSetInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    Odr_oid *variantSet;
+    /*
+     * Brief elements
+     */
+    char *name;
+    /*
+     * Non-brief elements
+     */
+    int num_variants;
+    Z_VariantClass **variants;              /* OPTIONAL */
+} Z_VariantSetInfo;
+
+typedef struct Z_Units
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_StringOrNumeric *unit;
+} Z_Units;
+
+typedef struct Z_UnitType
+{
+    char *name;                             /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    Z_StringOrNumeric *unitType;
+    int num_units;
+    Z_Units **units;
+} Z_UnitType;
+
+typedef struct Z_UnitInfo
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    /*
+     * Key elements
+     */
+    char *unitSystem;
+    /*
+     * Non-brief elements
+     */
+    Z_HumanString *description;             /* OPTIONAL */
+    int num_units;
+    Z_UnitType **units;                     /* OPTIONAL */
+} Z_UnitInfo;
+
+typedef struct Z_CategoryInfo
+{
+    char *category;
+    char *originalCategory;                 /* OPTIONAL */
+    Z_HumanString *description;             /* OPTIONAL */
+    char *asn1Module;                       /* OPTIONAL */
+} Z_CategoryInfo;
+
+typedef struct Z_CategoryList
+{
+    Z_CommonInfo *commonInfo;               /* OPTIONAL */
+    int num_categories;
+    Z_CategoryInfo **categories;
+} Z_CategoryList;
+
+typedef struct Z_ExplainRecord
+{
+    int which;
+#define Z_Explain_targetInfo 0
+#define Z_Explain_databaseInfo 1
+#define Z_Explain_schemaInfo 2
+#define Z_Explain_tagSetInfo 3
+#define Z_Explain_recordSyntaxInfo 4
+#define Z_Explain_attributeSetInfo 5
+#define Z_Explain_termListInfo 6
+#define Z_Explain_extendedServicesInfo 7
+#define Z_Explain_attributeDetails 8
+#define Z_Explain_termListDetails 9
+#define Z_Explain_elementSetDetails 10
+#define Z_Explain_retrievalRecordDetails 11
+#define Z_Explain_sortDetails 12
+#define Z_Explain_processing 13
+#define Z_Explain_variants 14
+#define Z_Explain_units 15
+#define Z_Explain_categoryList 16
+    union
+    {
+    	Z_TargetInfo *targetInfo;
+	Z_DatabaseInfo *databaseInfo;
+	Z_SchemaInfo *schemaInfo;
+	Z_TagSetInfo *tagSetInfo;
+	Z_RecordSyntaxInfo *recordSyntaxInfo;
+	Z_AttributeSetInfo *attributeSetInfo;
+	Z_TermListInfo *termListInfo;
+	Z_ExtendedServicesInfo *extendedServicesInfo;
+	Z_AttributeDetails *attributeDetails;
+	Z_TermListDetails *termListDetails;
+	Z_ElementSetDetails *elementSetDetails;
+	Z_RetrievalRecordDetails *retrievalRecordDetails;
+	Z_SortDetails *sortDetails;
+	Z_ProcessingInformation *processing;
+	Z_VariantSetInfo *variants;
+	Z_UnitInfo *units;
+	Z_CategoryList *categoryList;
+    } u;
+} Z_ExplainRecord;
+
+YAZ_EXPORT int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt,
+			       const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-ext.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-ext.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-ext.h	(revision 21083)
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+/*
+ * Biased-choice External for Z39.50.
+ */
+
+#ifndef PRT_EXT_H
+#define PRT_EXT_H
+
+#include <yaz/yconfig.h>
+#include <yaz/oid.h>
+
+
+YAZ_BEGIN_CDECL
+
+/*
+ * Used to keep track of known External definitions (a loose approach
+ * to DEFINED_BY).
+ */
+
+typedef struct Z_ext_typeent
+{
+    oid_value dref;    /* the direct-reference OID value. */
+    int what;          /* discriminator value for the external CHOICE */
+    Odr_fun fun;       /* decoder function */
+} Z_ext_typeent;
+
+struct Z_External
+{
+    Odr_oid *direct_reference;
+    int *indirect_reference;
+    char *descriptor;
+    int which;
+/* Generic types */
+#define Z_External_single 0
+#define Z_External_octet 1
+#define Z_External_arbitrary 2
+/* Specific types */
+#define Z_External_sutrs 3
+#define Z_External_explainRecord 4
+#define Z_External_resourceReport1 5
+#define Z_External_resourceReport2 6
+#define Z_External_promptObject1 7
+#define Z_External_grs1 8
+#define Z_External_extendedService 9
+#define Z_External_itemOrder 10
+#define Z_External_diag1 11
+#define Z_External_espec1 12
+#define Z_External_summary 13
+#define Z_External_OPAC 14
+#define Z_External_searchResult1 15
+#define Z_External_update 16
+#define Z_External_dateTime 17
+#define Z_External_universeReport 18
+    union
+    {
+	/* Generic types */
+	Odr_any *single_ASN1_type;
+	Odr_oct *octet_aligned;
+	Odr_bitmask *arbitrary;
+
+	/* Specific types */
+	Z_SUTRS *sutrs;
+	Z_ExplainRecord *explainRecord;
+	Z_ResourceReport1 *resourceReport1;
+	Z_ResourceReport2 *resourceReport2;
+	Z_PromptObject1 *promptObject1;
+	Z_GenericRecord *grs1;
+	Z_TaskPackage *extendedService;
+	Z_ItemOrder *itemOrder;
+	Z_DiagnosticFormat *diag1;
+	Z_Espec1 *espec1;
+	Z_BriefBib *summary;
+	Z_SearchInfoReport *searchResult1;
+	Z_IUUpdate *update;
+	Z_DateTime *dateTime;
+    Z_UniverseReport *universeReport;
+    } u;
+};
+
+
+YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
+YAZ_EXPORT Z_ext_typeent *z_ext_getentbyref(oid_value val);
+YAZ_EXPORT Z_External *z_ext_record(ODR o, int format, const char *buf,
+				    int len);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-grs.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-grs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-grs.h	(revision 21083)
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 1995-1998, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_GRS_H
+#define PRT_GRS_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct Z_GenericRecord;
+typedef struct Z_GenericRecord Z_GenericRecord;
+
+typedef struct Z_ElementData
+{
+    int which;
+#define Z_ElementData_octets 0
+#define Z_ElementData_numeric 1
+#define Z_ElementData_date 2
+#define Z_ElementData_ext 3
+#define Z_ElementData_string 4
+#define Z_ElementData_trueOrFalse 5
+#define Z_ElementData_oid 6
+#define Z_ElementData_intUnit 7
+#define Z_ElementData_elementNotThere 8
+#define Z_ElementData_elementEmpty 9
+#define Z_ElementData_noDataRequested 10
+#define Z_ElementData_diagnostic 11
+#define Z_ElementData_subtree 12
+    union
+    {
+	Odr_oct *octets;                      
+	int *numeric;                         
+	char *date;             
+	Z_External *ext;                     
+	char *string;                         
+	bool_t *trueOrFalse;                  
+	Odr_oid *oid;                         
+	Z_IntUnit *intUnit;                  
+	Odr_null *elementNotThere;            
+	Odr_null *elementEmpty;               
+	Odr_null *noDataRequested;            
+	Z_External *diagnostic;              
+	Z_GenericRecord *subtree;            
+    } u;
+} Z_ElementData;
+
+typedef struct Z_Order
+{
+    bool_t *ascending;                    
+    int *order;                           
+} Z_Order;
+
+typedef struct Z_Usage
+{
+    int *type;                            
+#define Z_Usage_redistributable     1
+#define Z_Usage_restricted          2
+#define Z_Usage_licensePointer      3
+    char *restriction;                      /* OPTIONAL */
+} Z_Usage;
+
+typedef struct Z_HitVector
+{
+    Z_Term *satisfier;                      /* OPTIONAL */
+    Z_IntUnit *offsetIntoElement;           /* OPTIONAL */
+    Z_IntUnit *length;                      /* OPTIONAL */
+    int *hitRank;                           /* OPTIONAL */
+    Odr_oct *targetToken;                   /* OPTIONAL */
+} Z_HitVector;
+
+typedef struct Z_Triple
+{
+    Odr_oid *variantSetId;                  /* OPTIONAL */
+    int *zclass;
+    int *type;
+    int which;
+#define Z_Triple_integer 0
+#define Z_Triple_internationalString 1
+#define Z_Triple_octetString 2
+#define Z_Triple_oid 3
+#define Z_Triple_boolean 4
+#define Z_Triple_null 5
+#define Z_Triple_unit 6
+#define Z_Triple_valueAndUnit 7
+    union
+    {
+	int *integer;
+	char *internationalString;
+	Odr_oct *octetString;
+	Odr_oid *oid;
+	bool_t *zboolean;
+	Odr_null *null;
+	Z_Unit *unit;
+	Z_IntUnit *valueAndUnit;
+    } value;
+} Z_Triple;
+
+typedef struct Z_Variant
+{
+    Odr_oid *globalVariantSetId;            /* OPTIONAL */
+    int num_triples;
+    Z_Triple **triples;
+} Z_Variant;
+
+typedef struct Z_TagUnit
+{
+    int *tagType;                           /* OPTIONAL */
+    Z_StringOrNumeric *tagValue;         
+    int *tagOccurrence;                     /* OPTIONAL */
+} Z_TagUnit;
+
+typedef struct Z_TagPath
+{
+    int num_tags;
+    Z_TagUnit **tags;
+} Z_TagPath;
+
+typedef struct Z_ElementMetaData
+{
+    Z_Order *seriesOrder;                   /* OPTIONAL */
+    Z_Usage *usageRight;                    /* OPTIONAL */
+    int num_hits;
+    Z_HitVector **hits;                     /* OPTIONAL */
+    char *displayName;                      /* OPTIONAL */
+    int num_supportedVariants;
+    Z_Variant **supportedVariants;          /* OPTIONAL */
+    char *message;                          /* OPTIONAL */
+    Odr_oct *elementDescriptor;             /* OPTIONAL */
+    Z_TagPath *surrogateFor;                /* OPTIONAL */
+    Z_TagPath *surrogateElement;            /* OPTIONAL */
+    Z_External *other;                      /* OPTIONAL */
+} Z_ElementMetaData;
+
+typedef struct Z_TaggedElement
+{
+    int *tagType;                           /* OPTIONAL */
+    Z_StringOrNumeric *tagValue;         
+    int *tagOccurrence;                     /* OPTIONAL */
+    Z_ElementData *content;              
+    Z_ElementMetaData *metaData;            /* OPTIONAL */
+    Z_Variant *appliedVariant;              /* OPTIONAL */
+} Z_TaggedElement;
+
+struct Z_GenericRecord
+{
+    int num_elements;
+    Z_TaggedElement **elements;
+};
+
+YAZ_EXPORT int z_GenericRecord(ODR o, Z_GenericRecord **p, int opt,
+			       const char *name);
+YAZ_EXPORT int z_Variant(ODR o, Z_Variant **p, int opt,
+			 const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-proto.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-proto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-proto.h	(revision 21083)
@@ -0,0 +1,1164 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#ifndef PRT_PROTO_H
+#define PRT_PROTO_H
+
+#include <yaz/yconfig.h>
+#include <yaz/odr.h>
+#include <yaz/oid.h>
+#include <yaz/yaz-version.h>
+
+YAZ_BEGIN_CDECL
+
+/* ----------------- GLOBAL AUXILIARY DEFS ----------------*/
+
+struct Z_External;
+typedef struct Z_External Z_External;
+
+typedef Odr_oct Z_ReferenceId;
+typedef char Z_DatabaseName;
+typedef char Z_ResultSetId;
+typedef Odr_oct Z_ResultsetId;
+
+typedef struct Z_InfoCategory
+{
+    Odr_oid *categoryTypeId;         /* OPTIONAL */
+    int *categoryValue;
+} Z_InfoCategory;
+
+typedef struct Z_OtherInformationUnit
+{
+    Z_InfoCategory *category;        /* OPTIONAL */
+    int which;
+#define Z_OtherInfo_characterInfo 0
+#define Z_OtherInfo_binaryInfo 1
+#define Z_OtherInfo_externallyDefinedInfo 2
+#define Z_OtherInfo_oid 3
+    union
+    {
+    	char *characterInfo; 
+	Odr_oct *binaryInfo;
+	Z_External *externallyDefinedInfo;
+	Odr_oid *oid;
+    } information;
+} Z_OtherInformationUnit;
+
+typedef struct Z_OtherInformation
+{
+    int num_elements;
+    Z_OtherInformationUnit **list;
+} Z_OtherInformation;
+
+typedef struct Z_StringOrNumeric
+{
+    int which;
+#define Z_StringOrNumeric_string 0
+#define Z_StringOrNumeric_numeric 1
+    union
+    {
+    	char *string;
+	int *numeric;
+    } u;
+} Z_StringOrNumeric;
+
+typedef struct Z_Unit
+{
+    char *unitSystem;               /* OPTIONAL */
+    Z_StringOrNumeric *unitType;    /* OPTIONAL */
+    Z_StringOrNumeric *unit;        /* OPTIONAL */
+    int *scaleFactor;               /* OPTIONAL */
+} Z_Unit;
+
+typedef struct Z_IntUnit
+{
+    int *value;
+    Z_Unit *unitUsed;
+} Z_IntUnit;
+
+typedef Odr_oct Z_SUTRS;
+
+typedef struct Z_StringList
+{
+    int num_strings;
+    char **strings;
+} Z_StringList;
+
+/* ----------------- INIT SERVICE  ----------------*/
+
+typedef struct
+{
+    char *groupId;       /* OPTIONAL */
+    char *userId;         /* OPTIONAL */
+    char *password;      /* OPTIONAL */
+} Z_IdPass;
+
+typedef struct Z_IdAuthentication
+{
+    int which;
+#define Z_IdAuthentication_open 0
+#define Z_IdAuthentication_idPass 1
+#define Z_IdAuthentication_anonymous 2
+#define Z_IdAuthentication_other 3
+    union
+    {
+    	char *open;
+    	Z_IdPass *idPass;
+    	Odr_null *anonymous;
+    	Z_External *other;
+    } u;
+} Z_IdAuthentication;
+
+#define Z_ProtocolVersion_1               0
+#define Z_ProtocolVersion_2               1
+#define Z_ProtocolVersion_3               2
+
+#define Z_Options_search                  0
+#define Z_Options_present                 1
+#define Z_Options_delSet                  2
+#define Z_Options_resourceReport          3
+#define Z_Options_triggerResourceCtrl     4
+#define Z_Options_resourceCtrl            5
+#define Z_Options_accessCtrl              6
+#define Z_Options_scan                    7
+#define Z_Options_sort                    8
+#define Z_Options_reserved                9
+#define Z_Options_extendedServices       10
+#define Z_Options_level_1Segmentation    11
+#define Z_Options_level_2Segmentation    12
+#define Z_Options_concurrentOperations   13
+#define Z_Options_namedResultSets        14
+
+typedef struct Z_InitRequest
+{
+    Z_ReferenceId *referenceId;                   /* OPTIONAL */
+    Odr_bitmask *protocolVersion;
+    Odr_bitmask *options;
+    int *preferredMessageSize;
+    int *maximumRecordSize;
+    Z_IdAuthentication* idAuthentication;        /* OPTIONAL */
+    char *implementationId;                      /* OPTIONAL */
+    char *implementationName;                    /* OPTIONAL */
+    char *implementationVersion;                 /* OPTIONAL */
+    Z_External *userInformationField;            /* OPTIONAL */
+    Z_OtherInformation *otherInfo;               /* OPTIONAL */
+} Z_InitRequest;
+
+typedef struct Z_InitResponse
+{
+    Z_ReferenceId *referenceId;    /* OPTIONAL */
+    Odr_bitmask *protocolVersion;
+    Odr_bitmask *options;
+    int *preferredMessageSize;
+    int *maximumRecordSize;
+    bool_t *result;
+    char *implementationId;      /* OPTIONAL */
+    char *implementationName;    /* OPTIONAL */
+    char *implementationVersion; /* OPTIONAL */
+    Z_External *userInformationField; /* OPTIONAL */
+    Z_OtherInformation *otherInfo;    /* OPTIONAL */
+} Z_InitResponse;
+
+typedef struct Z_NSRAuthentication
+{
+    char *user;
+    char *password;
+    char *account;
+} Z_NSRAuthentication;
+
+int z_NSRAuthentication(ODR o, Z_NSRAuthentication **p, int opt,
+			const char *name);
+
+int z_StrAuthentication(ODR o, char **p, int opt, const char *name);
+
+/* ------------------ SEARCH SERVICE ----------------*/
+
+typedef struct Z_DatabaseSpecificUnit
+{
+    char *databaseName;
+    char *elementSetName;
+} Z_DatabaseSpecificUnit;
+
+typedef struct Z_DatabaseSpecific
+{
+    int num_elements;
+    Z_DatabaseSpecificUnit **elements;
+} Z_DatabaseSpecific;
+
+typedef struct Z_ElementSetNames
+{
+    int which;
+#define Z_ElementSetNames_generic 0
+#define Z_ElementSetNames_databaseSpecific 1
+    union
+    {
+        char *generic;
+        Z_DatabaseSpecific *databaseSpecific;
+    } u;
+} Z_ElementSetNames;
+
+/* ---------------------- RPN QUERY --------------------------- */
+
+typedef struct Z_ComplexAttribute
+{
+    int num_list;
+    Z_StringOrNumeric **list;
+    int num_semanticAction;
+    int **semanticAction;           /* OPTIONAL */
+} Z_ComplexAttribute;
+
+typedef struct Z_AttributeElement
+{
+    Odr_oid *attributeSet;           /* OPTIONAL - v3 only */
+    int *attributeType;
+    int which;
+#define Z_AttributeValue_numeric 0
+#define Z_AttributeValue_complex 1
+    union
+    {
+    	int *numeric;
+	Z_ComplexAttribute *complex;
+    } value;
+} Z_AttributeElement;
+
+typedef struct Z_Term 
+{
+    int which;
+#define Z_Term_general 0
+#define Z_Term_numeric 1
+#define Z_Term_characterString 2
+#define Z_Term_oid 3
+#define Z_Term_dateTime 4
+#define Z_Term_external 5
+#define Z_Term_integerAndUnit 6
+#define Z_Term_null 7
+    union
+    {
+    	Odr_oct *general; /* this is required for v2 */
+    	int *numeric;
+    	char *characterString;
+    	Odr_oid *oid;
+    	char *dateTime;
+    	Z_External *external;
+    	/* Z_IntUnit *integerAndUnit; */
+    	Odr_null *null;
+    } u;
+} Z_Term;
+
+typedef struct Z_AttributesPlusTerm
+{
+    int num_attributes;
+    Z_AttributeElement **attributeList;
+    Z_Term *term;
+} Z_AttributesPlusTerm;
+
+typedef struct Z_ResultSetPlusAttributes
+{
+    char *resultSet;
+    int num_attributes;
+    Z_AttributeElement **attributeList;
+} Z_ResultSetPlusAttributes;
+
+typedef struct Z_ProximityOperator
+{
+    bool_t *exclusion;          /* OPTIONAL */
+    int *distance;
+    bool_t *ordered;
+    int *relationType;
+#define Z_Prox_lessThan           1
+#define Z_Prox_lessThanOrEqual    2
+#define Z_Prox_equal              3
+#define Z_Prox_greaterThanOrEqual 4
+#define Z_Prox_greaterThan        5
+#define Z_Prox_notEqual           6
+    int which;
+#define Z_ProxCode_known 0
+#define Z_ProxCode_private 1
+    int *proximityUnitCode;
+#define Z_ProxUnit_character       1
+#define Z_ProxUnit_word            2
+#define Z_ProxUnit_sentence        3
+#define Z_ProxUnit_paragraph       4
+#define Z_ProxUnit_section         5
+#define Z_ProxUnit_chapter         6
+#define Z_ProxUnit_document        7
+#define Z_ProxUnit_element         8
+#define Z_ProxUnit_subelement      9
+#define Z_ProxUnit_elementType    10
+#define Z_ProxUnit_byte           11   /* v3 only */
+} Z_ProximityOperator;
+
+typedef struct Z_Operator
+{
+    int which;
+#define Z_Operator_and 0
+#define Z_Operator_or 1
+#define Z_Operator_and_not 2
+#define Z_Operator_prox 3
+    union
+    {
+    	Odr_null *and;          /* these guys are nulls. */
+    	Odr_null *or;
+    	Odr_null *and_not;
+	Z_ProximityOperator *prox;
+    } u;
+} Z_Operator;
+
+typedef struct Z_Operand
+{
+    int which;
+#define Z_Operand_APT 0
+#define Z_Operand_resultSetId 1
+#define Z_Operand_resultAttr             /* v3 only */ 2
+    union
+    {
+    	Z_AttributesPlusTerm *attributesPlusTerm;
+    	Z_ResultSetId *resultSetId;
+	Z_ResultSetPlusAttributes *resultAttr;
+    } u;
+} Z_Operand;
+
+typedef struct Z_Complex
+{
+    struct Z_RPNStructure *s1;
+    struct Z_RPNStructure *s2;
+    Z_Operator *roperator;
+} Z_Complex;
+
+typedef struct Z_RPNStructure
+{
+    int which;
+#define Z_RPNStructure_simple 0
+#define Z_RPNStructure_complex 1
+    union
+    {
+    	Z_Operand *simple;
+    	Z_Complex *complex;
+    } u;
+} Z_RPNStructure;
+
+typedef struct Z_RPNQuery
+{
+    Odr_oid *attributeSetId;
+    Z_RPNStructure *RPNStructure;
+} Z_RPNQuery;
+
+/* -------------------------- SEARCHREQUEST -------------------------- */
+
+typedef struct Z_Query
+{
+    int which;
+#define Z_Query_type_1 1
+#define Z_Query_type_2 2
+#define Z_Query_type_101 3
+    union
+    {
+    	Z_RPNQuery *type_1;
+    	Odr_oct *type_2;
+	Z_RPNQuery *type_101;
+    } u;
+} Z_Query;
+
+typedef struct Z_SearchRequest
+{
+    Z_ReferenceId *referenceId;   /* OPTIONAL */
+    int *smallSetUpperBound;
+    int *largeSetLowerBound;
+    int *mediumSetPresentNumber;
+    bool_t *replaceIndicator;
+    char *resultSetName;
+    int num_databaseNames;
+    char **databaseNames;
+    Z_ElementSetNames *smallSetElementSetNames;    /* OPTIONAL */
+    Z_ElementSetNames *mediumSetElementSetNames;    /* OPTIONAL */
+    Odr_oid *preferredRecordSyntax;  /* OPTIONAL */
+    Z_Query *query;
+    Z_OtherInformation *additionalSearchInfo;       /* OPTIONAL */
+    Z_OtherInformation *otherInfo;                  /* OPTIONAL */
+} Z_SearchRequest;
+
+/* ------------------------ RECORD -------------------------- */
+
+typedef Z_External Z_DatabaseRecord;
+
+typedef struct Z_DefaultDiagFormat
+{
+    Odr_oid *diagnosticSetId; /* This is opt'l to interwork with bad targets */
+    int *condition;
+    /* until the whole character set issue becomes more definite,
+     * you can probably ignore this on input. */
+    int which;
+#define Z_DiagForm_v2AddInfo 0
+#define Z_DiagForm_v3AddInfo 1
+    char *addinfo;
+} Z_DefaultDiagFormat;
+
+typedef struct Z_DiagRec
+{
+    int which;
+#define Z_DiagRec_defaultFormat 0
+#define Z_DiagRec_externallyDefined 1
+    union
+    {
+    	Z_DefaultDiagFormat *defaultFormat;
+	Z_External *externallyDefined;
+    } u;
+} Z_DiagRec;
+
+typedef struct Z_DiagRecs
+{
+    int num_diagRecs;
+    Z_DiagRec **diagRecs;
+} Z_DiagRecs;
+
+typedef struct Z_NamePlusRecord
+{
+    char *databaseName;      /* OPTIONAL */
+    int which;
+#define Z_NamePlusRecord_databaseRecord 0
+#define Z_NamePlusRecord_surrogateDiagnostic 1
+    union
+    {
+    	Z_DatabaseRecord *databaseRecord;
+    	Z_DiagRec *surrogateDiagnostic;
+    } u;
+} Z_NamePlusRecord;
+
+typedef struct Z_NamePlusRecordList
+{
+    int num_records;
+    Z_NamePlusRecord **records;
+} Z_NamePlusRecordList;
+
+typedef struct Z_Records
+{
+    int which;
+#define Z_Records_DBOSD 0
+#define Z_Records_NSD 1
+#define Z_Records_multipleNSD 2
+    union
+    {
+    	Z_NamePlusRecordList *databaseOrSurDiagnostics;
+    	Z_DiagRec *nonSurrogateDiagnostic;
+	Z_DiagRecs *multipleNonSurDiagnostics;
+    } u;
+} Z_Records;
+
+/* ------------------------ SEARCHRESPONSE ------------------ */
+
+typedef struct Z_SearchResponse
+{
+    Z_ReferenceId *referenceId;       /* OPTIONAL */
+    int *resultCount;
+    int *numberOfRecordsReturned;
+    int *nextResultSetPosition;
+    bool_t *searchStatus;
+    int *resultSetStatus;              /* OPTIONAL */
+#define Z_RES_SUBSET        1
+#define Z_RES_INTERIM       2
+#define Z_RES_NONE          3
+    int *presentStatus;                /* OPTIONAL */
+#define Z_PRES_SUCCESS      0
+#define Z_PRES_PARTIAL_1    1
+#define Z_PRES_PARTIAL_2    2
+#define Z_PRES_PARTIAL_3    3
+#define Z_PRES_PARTIAL_4    4
+#define Z_PRES_FAILURE      5
+    Z_Records *records;                  /* OPTIONAL */
+    Z_OtherInformation *additionalSearchInfo;
+    Z_OtherInformation *otherInfo;
+} Z_SearchResponse;
+
+/* ------------------------- PRESENT SERVICE -----------------*/
+
+typedef struct Z_ElementSpec
+{
+    int which;
+#define Z_ElementSpec_elementSetName 0
+#define Z_ElementSpec_externalSpec 1
+    union
+    {
+    	char *elementSetName;
+	Z_External *externalSpec;
+    } u;
+} Z_ElementSpec;
+
+typedef struct Z_Specification
+{
+    Odr_oid *schema;                  /* OPTIONAL */
+    Z_ElementSpec *elementSpec;       /* OPTIONAL */
+} Z_Specification;
+
+typedef struct Z_DbSpecific
+{
+    char *databaseName;
+    Z_Specification *spec;
+} Z_DbSpecific;
+
+typedef struct Z_CompSpec
+{
+    bool_t *selectAlternativeSyntax;
+    Z_Specification *generic;            /* OPTIONAL */
+    int num_dbSpecific;
+    Z_DbSpecific **dbSpecific;           /* OPTIONAL */
+    int num_recordSyntax;
+    Odr_oid **recordSyntax;              /* OPTIONAL */
+} Z_CompSpec;
+
+typedef struct Z_RecordComposition
+{
+    int which;
+#define Z_RecordComp_simple 0
+#define Z_RecordComp_complex 1
+    union
+    {
+    	Z_ElementSetNames *simple;
+	Z_CompSpec *complex;
+    } u;
+} Z_RecordComposition;
+
+typedef struct Z_Range
+{
+    int *startingPosition;
+    int *numberOfRecords;
+} Z_Range;
+
+typedef struct Z_PresentRequest
+{
+    Z_ReferenceId *referenceId;              /* OPTIONAL */
+    Z_ResultSetId *resultSetId;
+    int *resultSetStartPoint;
+    int *numberOfRecordsRequested;
+    int num_ranges;
+    Z_Range **additionalRanges;              /* OPTIONAL */
+    Z_RecordComposition *recordComposition;  /* OPTIONAL */
+    Odr_oid *preferredRecordSyntax;  /* OPTIONAL */
+    int *maxSegmentCount;                 /* OPTIONAL */
+    int *maxRecordSize;                   /* OPTIONAL */
+    int *maxSegmentSize;                  /* OPTIONAL */
+    Z_OtherInformation *otherInfo;        /* OPTIONAL */
+} Z_PresentRequest;
+
+typedef struct Z_PresentResponse
+{
+    Z_ReferenceId *referenceId;        /* OPTIONAL */
+    int *numberOfRecordsReturned;
+    int *nextResultSetPosition;
+    int *presentStatus;
+    Z_Records *records;
+    Z_OtherInformation *otherInfo;     /* OPTIONAL */
+} Z_PresentResponse;
+
+/* ------------------ RESOURCE CONTROL ----------------*/
+
+typedef struct Z_TriggerResourceControlRequest
+{
+    Z_ReferenceId *referenceId;    /* OPTIONAL */
+    int *requestedAction;
+#define Z_TriggerResourceCtrl_resourceReport  1
+#define Z_TriggerResourceCtrl_resourceControl 2
+#define Z_TriggerResourceCtrl_cancel          3
+    Odr_oid *prefResourceReportFormat;  /* OPTIONAL */
+    bool_t *resultSetWanted;            /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_TriggerResourceControlRequest;
+
+typedef struct Z_ResourceControlRequest
+{
+    Z_ReferenceId *referenceId;    /* OPTIONAL */
+    bool_t *suspendedFlag;         /* OPTIONAL */
+    Z_External *resourceReport; /* OPTIONAL */
+    int *partialResultsAvailable;  /* OPTIONAL */
+#define Z_ResourceControlRequest_subset    1
+#define Z_ResourceControlRequest_interim   2
+#define Z_ResourceControlRequest_none      3
+    bool_t *responseRequired;
+    bool_t *triggeredRequestFlag;  /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_ResourceControlRequest;
+
+typedef struct Z_ResourceControlResponse
+{
+    Z_ReferenceId *referenceId;    /* OPTIONAL */
+    bool_t *continueFlag;
+    bool_t *resultSetWanted;       /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_ResourceControlResponse;
+
+
+/* ------------------ ACCESS CTRL SERVICE ----------------*/
+
+typedef struct Z_AccessControlRequest
+{
+    Z_ReferenceId *referenceId;           /* OPTIONAL */
+    int which;
+#define Z_AccessRequest_simpleForm 0
+#define Z_AccessRequest_externallyDefined 1
+    union
+    {
+    	Odr_oct *simpleForm;
+	Z_External *externallyDefined;
+    } u;
+    Z_OtherInformation *otherInfo;           /* OPTIONAL */
+} Z_AccessControlRequest;
+
+typedef struct Z_AccessControlResponse
+{
+    Z_ReferenceId *referenceId;              /* OPTIONAL */
+    int which;
+#define Z_AccessResponse_simpleForm 0
+#define Z_AccessResponse_externallyDefined 1
+    union
+    {
+    	Odr_oct *simpleForm;
+	Z_External *externallyDefined;
+    } u;
+    Z_DiagRec *diagnostic;                   /* OPTIONAL */
+    Z_OtherInformation *otherInfo;           /* OPTIONAL */
+} Z_AccessControlResponse;
+
+/* ------------------------ SCAN SERVICE -------------------- */
+
+typedef struct Z_AttributeList
+{
+    int num_attributes;
+    Z_AttributeElement **attributes;
+} Z_AttributeList;
+
+typedef struct Z_AlternativeTerm
+{
+    int num_terms;
+    Z_AttributesPlusTerm **terms;
+} Z_AlternativeTerm;
+
+typedef struct Z_ByDatabase
+{
+    char *db;
+    int *num;                           /* OPTIONAL */
+    Z_OtherInformation *otherDbInfo;    /* OPTIONAL */
+} Z_ByDatabase;
+
+typedef struct Z_ByDatabaseList
+{
+    int num_elements;
+    Z_ByDatabase **elements;
+} Z_ByDatabaseList;
+
+typedef struct Z_ScanOccurrences
+{
+    int which;
+#define Z_ScanOccurrences_global         0
+#define Z_ScanOccurrences_byDatabase     1
+    union
+    {
+	int *global;
+	Z_ByDatabaseList *byDatabase;
+    } u;
+
+} Z_ScanOccurrences;
+
+typedef struct Z_OccurrenceByAttributesElem
+{
+    Z_AttributeList *attributes;
+    Z_ScanOccurrences *occurrences;         /* OPTIONAL */
+    Z_OtherInformation *otherOccurInfo;      /* OPTIONAL */
+} Z_OccurrenceByAttributesElem;
+
+typedef struct Z_OccurrenceByAttributes
+{
+    int num_elements;
+    Z_OccurrenceByAttributesElem **elements;
+} Z_OccurrenceByAttributes;
+
+typedef struct Z_TermInfo
+{
+    Z_Term *term;
+    char *displayTerm;                     /* OPTIONAL */
+    Z_AttributeList *suggestedAttributes;  /* OPTIONAL */
+    Z_AlternativeTerm *alternativeTerm;    /* OPTIONAL */
+    int *globalOccurrences;                /* OPTIONAL */
+    Z_OccurrenceByAttributes *byAttributes; /* OPTIONAL */
+    Z_OtherInformation *otherTermInfo;      /* OPTIONAL */
+} Z_TermInfo;
+
+typedef struct Z_Entry
+{
+    int which;
+#define Z_Entry_termInfo 0
+#define Z_Entry_surrogateDiagnostic 1
+    union
+    {
+    	Z_TermInfo *termInfo;
+	Z_DiagRec *surrogateDiagnostic;
+    } u;
+} Z_Entry;
+
+#ifdef BUGGY_LISTENTRIES
+
+typedef struct Z_Entries
+{
+    int num_entries;
+    Z_Entry **entries;
+} Z_Entries;
+
+typedef struct Z_ListEntries
+{
+    int which;
+#define Z_ListEntries_entries 0
+#define Z_ListEntries_nonSurrogateDiagnostics 1
+    union
+    {
+    	Z_Entries *entries;
+	Z_DiagRecs *nonSurrogateDiagnostics;
+    } u;
+} Z_ListEntries;
+
+#endif
+
+typedef struct Z_ListEntries {
+	int num_entries;
+	Z_Entry **entries; /* OPT */
+	int num_nonsurrogateDiagnostics;
+	Z_DiagRec **nonsurrogateDiagnostics; /* OPT */
+} Z_ListEntries;
+
+typedef struct Z_ScanRequest
+{
+    Z_ReferenceId *referenceId;       /* OPTIONAL */
+    int num_databaseNames;
+    char **databaseNames;
+    Odr_oid *attributeSet;          /* OPTIONAL */
+    Z_AttributesPlusTerm *termListAndStartPoint;
+    int *stepSize;                    /* OPTIONAL */
+    int *numberOfTermsRequested;
+    int *preferredPositionInResponse;   /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_ScanRequest;
+
+typedef struct Z_ScanResponse
+{
+    Z_ReferenceId *referenceId;       /* OPTIONAL */
+    int *stepSize;                    /* OPTIONAL */
+    int *scanStatus;
+#define Z_Scan_success      0
+#define Z_Scan_partial_1    1
+#define Z_Scan_partial_2    2
+#define Z_Scan_partial_3    3
+#define Z_Scan_partial_4    4
+#define Z_Scan_partial_5    5
+#define Z_Scan_failure      6
+    int *numberOfEntriesReturned;
+    int *positionOfTerm;              /* OPTIONAL */
+    Z_ListEntries *entries;           /* OPTIONAL */
+    Odr_oid *attributeSet;            /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_ScanResponse; 
+
+
+/* ------------------------ DELETE -------------------------- */
+
+#define Z_DeleteStatus_success                          0
+#define Z_DeleteStatus_resultSetDidNotExist             1
+#define Z_DeleteStatus_previouslyDeletedByTarget        2
+#define Z_DeleteStatus_systemProblemAtTarget            3
+#define Z_DeleteStatus_accessNotAllowed                 4
+#define Z_DeleteStatus_resourceControlAtOrigin          5
+#define Z_DeleteStatus_resourceControlAtTarget          6
+#define Z_DeleteStatus_bulkDeleteNotSupported           7
+#define Z_DeleteStatus_notAllRsltSetsDeletedOnBulkDlte  8
+#define Z_DeleteStatus_notAllRequestedResultSetsDeleted 9
+#define Z_DeleteStatus_resultSetInUse                  10
+
+typedef struct Z_ListStatus
+{
+    Z_ResultSetId *id;
+    int *status;
+} Z_ListStatus;
+
+typedef struct Z_DeleteResultSetRequest
+{
+    Z_ReferenceId *referenceId;        /* OPTIONAL */
+    int *deleteFunction;
+#define Z_DeleteRequest_list    0
+#define Z_DeleteRequest_all     1
+    int num_resultSetList;
+    Z_ResultSetId **resultSetList;      /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_DeleteResultSetRequest;
+
+typedef struct Z_ListStatuses {
+    int num;
+    Z_ListStatus **elements;
+} Z_ListStatuses;
+
+typedef struct Z_DeleteResultSetResponse
+{
+    Z_ReferenceId *referenceId;        /* OPTIONAL */
+    int *deleteOperationStatus;
+    Z_ListStatuses *deleteListStatuses;/* OPTIONAL */
+    int *numberNotDeleted;             /* OPTIONAL */
+    Z_ListStatuses *bulkStatuses;      /* OPTIONAL */
+    char *deleteMessage;               /* OPTIONAL */
+    Z_OtherInformation *otherInfo;
+} Z_DeleteResultSetResponse;
+
+/* ------------------------ CLOSE SERVICE ------------------- */
+
+typedef struct Z_Close
+{
+    Z_ReferenceId *referenceId;         /* OPTIONAL */
+    int *closeReason;
+#define Z_Close_finished           0
+#define Z_Close_shutdown           1
+#define Z_Close_systemProblem      2
+#define Z_Close_costLimit          3
+#define Z_Close_resources          4
+#define Z_Close_securityViolation  5
+#define Z_Close_protocolError      6
+#define Z_Close_lackOfActivity     7
+#define Z_Close_peerAbort          8
+#define Z_Close_unspecified        9
+    char *diagnosticInformation;          /* OPTIONAL */
+    Odr_oid *resourceReportFormat;        /* OPTIONAL */
+    Z_External *resourceReport;         /* OPTIONAL */
+    Z_OtherInformation *otherInfo;        /* OPTIONAL */
+} Z_Close;
+
+/* ------------------------ SEGMENTATION -------------------- */
+
+typedef struct Z_Segment
+{
+    Z_ReferenceId *referenceId;   /* OPTIONAL */
+    int *numberOfRecordsReturned;
+    int num_segmentRecords;
+    Z_NamePlusRecord **segmentRecords;
+    Z_OtherInformation *otherInfo;  /* OPTIONAL */
+} Z_Segment;
+
+/* ----------------------- Extended Services ---------------- */
+
+typedef struct Z_Permissions
+{
+    char *userId;                         
+    int num_allowableFunctions;
+    int **allowableFunctions;             
+#define Z_Permissions_delete              1
+#define Z_Permissions_modifyContents      2
+#define Z_Permissions_modifyPermissions   3
+#define Z_Permissions_present             4
+#define Z_Permissions_invoke              5
+} Z_Permissions;
+
+typedef struct Z_ExtendedServicesRequest
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    int *function;                        
+#define Z_ExtendedServicesRequest_create              1
+#define Z_ExtendedServicesRequest_delete              2
+#define Z_ExtendedServicesRequest_modify              3
+    Odr_oid *packageType;                 
+    char *packageName;                      /* OPTIONAL */
+    char *userId;                           /* OPTIONAL */
+    Z_IntUnit *retentionTime;               /* OPTIONAL */
+    Z_Permissions *permissions;             /* OPTIONAL */
+    char *description;                      /* OPTIONAL */
+    Z_External *taskSpecificParameters;     /* OPTIONAL */
+    int *waitAction;                      
+#define Z_ExtendedServicesRequest_wait                1
+#define Z_ExtendedServicesRequest_waitIfPossible      2
+#define Z_ExtendedServicesRequest_dontWait            3
+#define Z_ExtendedServicesRequest_dontReturnPackage   4
+    char *elements;             /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_ExtendedServicesRequest;
+
+typedef struct Z_ExtendedServicesResponse
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    int *operationStatus;                 
+#define Z_ExtendedServicesResponse_done                1
+#define Z_ExtendedServicesResponse_accepted            2
+#define Z_ExtendedServicesResponse_failure             3
+    int num_diagnostics;
+    Z_DiagRec **diagnostics;                /* OPTIONAL */
+    Z_External *taskPackage;                /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_ExtendedServicesResponse;
+
+/* ------------------------ Sort --------------------------- */
+
+typedef struct Z_SortAttributes
+{
+    Odr_oid *id;
+    Z_AttributeList *list;
+} Z_SortAttributes;
+
+typedef struct Z_SortKey
+{
+    int which;
+#define Z_SortKey_sortField             0
+#define Z_SortKey_elementSpec           1
+#define Z_SortKey_sortAttributes        2
+    union
+    {
+	char *sortField;
+	Z_Specification *elementSpec;
+	Z_SortAttributes *sortAttributes;
+    } u;
+} Z_SortKey;
+
+typedef struct Z_SortDbSpecific
+{
+    char *databaseName;
+    Z_SortKey *dbSort;
+} Z_SortDbSpecific;
+
+typedef struct Z_SortDbSpecificList
+{
+    int num_dbSpecific;
+    Z_SortDbSpecific **dbSpecific;
+} Z_SortDbSpecificList;
+
+typedef struct Z_SortElement
+{
+    int which;
+#define Z_SortElement_generic               0
+#define Z_SortElement_databaseSpecific      1
+    union
+    {
+	Z_SortKey *generic;
+	Z_SortDbSpecificList *databaseSpecific;
+    } u;
+} Z_SortElement;
+
+typedef struct Z_SortMissingValueAction
+{
+    int which;
+#define Z_SortMissingValAct_abort           0
+#define Z_SortMissingValAct_null            1
+#define Z_SortMissingValAct_valData         2
+    union
+    {
+	Odr_null *abort;
+	Odr_null *null;
+	Odr_oct *valData;
+    } u;
+} Z_SortMissingValueAction;
+
+typedef struct Z_SortKeySpec
+{
+    Z_SortElement *sortElement;
+    int *sortRelation;
+#define Z_SortRelation_ascending            0
+#define Z_SortRelation_descending           1
+#define Z_SortRelation_ascendingByFreq      3
+#define Z_SortRelation_descendingByFreq     4
+    int *caseSensitivity;
+#define Z_SortCase_caseSensitive            0
+#define Z_SortCase_caseInsensitive          1
+    Z_SortMissingValueAction *missingValueAction;  /* OPTIONAL */
+} Z_SortKeySpec;
+
+typedef struct Z_SortResponse
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    int *sortStatus;
+#define Z_SortStatus_success              0
+#define Z_SortStatus_partial_1            1
+#define Z_SortStatus_failure              2
+    int *resultSetStatus;                   /* OPTIONAL */
+#define Z_SortResultSetStatus_empty       1
+#define Z_SortResultSetStatus_interim     2
+#define Z_SortResultSetStatus_unchanged   3
+#define Z_SortResultSetStatus_none        4
+    Z_DiagRecs *diagnostics;                /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_SortResponse;
+
+typedef struct Z_SortKeySpecList
+{
+    int num_specs;
+    Z_SortKeySpec **specs;
+} Z_SortKeySpecList;
+
+typedef struct Z_SortRequest
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    Z_StringList *inputResultSetNames;
+    char *sortedResultSetName;
+    Z_SortKeySpecList *sortSequence;
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_SortRequest;
+
+/* ----------------------- Resource Report ------------------ */
+
+typedef struct Z_ResourceReportRequest
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    Z_ReferenceId *opId;                    /* OPTIONAL */
+    Odr_oid *prefResourceReportFormat;      /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_ResourceReportRequest;
+
+typedef struct Z_ResourceReportResponse
+{
+    Z_ReferenceId *referenceId;             /* OPTIONAL */
+    int *resourceReportStatus;
+#define Z_ResourceReportStatus_success   0
+#define Z_ResourceReportStatus_partial   1
+#define Z_ResourceReportStatus_failure_1 2
+#define Z_ResourceReportStatus_failure_2 3
+#define Z_ResourceReportStatus_failure_3 4
+#define Z_ResourceReportStatus_failure_4 5
+#define Z_ResourceReportStatus_failure_5 6
+#define Z_ResourceReportStatus_failure_6 7
+    Z_External *resourceReport;             /* OPTIONAL */
+    Z_OtherInformation *otherInfo;          /* OPTIONAL */
+} Z_ResourceReportResponse;
+
+/* ------------------------ APDU ---------------------------- */
+
+typedef struct Z_APDU
+{    
+    int which;
+#define Z_APDU_initRequest 0
+#define Z_APDU_initResponse 1
+#define Z_APDU_searchRequest 2
+#define Z_APDU_searchResponse 3
+#define Z_APDU_presentRequest 4
+#define Z_APDU_presentResponse 5
+#define Z_APDU_deleteResultSetRequest 6
+#define Z_APDU_deleteResultSetResponse 7
+#define Z_APDU_resourceControlRequest 8
+#define Z_APDU_resourceControlResponse 9
+#define Z_APDU_triggerResourceControlRequest 10
+#define Z_APDU_scanRequest 11
+#define Z_APDU_scanResponse 12
+#define Z_APDU_segmentRequest 13
+#define Z_APDU_extendedServicesRequest 14
+#define Z_APDU_extendedServicesResponse 15
+#define Z_APDU_close 16
+#define Z_APDU_accessControlRequest 17
+#define Z_APDU_accessControlResponse 18
+#define Z_APDU_sortRequest 20
+#define Z_APDU_sortResponse 21
+#define Z_APDU_resourceReportRequest 22
+#define Z_APDU_resourceReportResponse 23
+    union
+    {
+	Z_InitRequest  *initRequest;
+    	Z_InitResponse *initResponse;
+    	Z_SearchRequest *searchRequest;
+    	Z_SearchResponse *searchResponse;
+    	Z_PresentRequest *presentRequest;
+    	Z_PresentResponse *presentResponse;
+	Z_DeleteResultSetRequest *deleteResultSetRequest;
+	Z_DeleteResultSetResponse *deleteResultSetResponse;
+	Z_AccessControlRequest *accessControlRequest;
+	Z_AccessControlResponse *accessControlResponse;
+	Z_ResourceControlRequest *resourceControlRequest;
+	Z_ResourceControlResponse *resourceControlResponse;
+	Z_TriggerResourceControlRequest *triggerResourceControlRequest;
+	Z_ResourceReportRequest *resourceReportRequest;
+	Z_ResourceReportResponse *resourceReportResponse;
+	Z_ScanRequest *scanRequest;
+	Z_ScanResponse *scanResponse;
+	Z_SortRequest *sortRequest;
+	Z_SortResponse *sortResponse;
+	Z_Segment *segmentRequest;
+	Z_ExtendedServicesRequest *extendedServicesRequest;
+	Z_ExtendedServicesResponse *extendedServicesResponse;
+	Z_Close *close;
+    } u;
+} Z_APDU;
+
+#define z_APDU z_APDU_old
+
+YAZ_EXPORT int z_APDU(ODR o, Z_APDU **p, int opt, const char *name);
+YAZ_EXPORT int z_SUTRS(ODR o, Odr_oct **p, int opt, const char *name);
+
+YAZ_EXPORT Z_InitRequest *zget_InitRequest(ODR o);
+YAZ_EXPORT Z_InitResponse *zget_InitResponse(ODR o);
+YAZ_EXPORT Z_SearchRequest *zget_SearchRequest(ODR o);
+YAZ_EXPORT Z_SearchResponse *zget_SearchResponse(ODR o);
+YAZ_EXPORT Z_PresentRequest *zget_PresentRequest(ODR o);
+YAZ_EXPORT Z_PresentResponse *zget_PresentResponse(ODR o);
+YAZ_EXPORT Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o);
+YAZ_EXPORT Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o);
+YAZ_EXPORT Z_ScanRequest *zget_ScanRequest(ODR o);
+YAZ_EXPORT Z_ScanResponse *zget_ScanResponse(ODR o);
+YAZ_EXPORT Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o);
+YAZ_EXPORT Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o);
+YAZ_EXPORT Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o);
+YAZ_EXPORT Z_Close *zget_Close(ODR o);
+YAZ_EXPORT int z_StringList(ODR o, Z_StringList **p, int opt,
+			    const char *name);
+YAZ_EXPORT int z_InternationalString(ODR o, char **p, int opt,
+				     const char *name);
+YAZ_EXPORT int z_OtherInformation(ODR o, Z_OtherInformation **p, int opt,
+				  const char *naem);
+YAZ_EXPORT int z_ElementSetName(ODR o, char **p, int opt, const char *name);
+YAZ_EXPORT int z_IntUnit(ODR o, Z_IntUnit **p, int opt, const char *name);
+YAZ_EXPORT int z_Unit(ODR o, Z_Unit **p, int opt, const char *name);
+YAZ_EXPORT int z_DatabaseName(ODR o, Z_DatabaseName **p, int opt,
+			      const char *name);
+YAZ_EXPORT int z_StringOrNumeric(ODR o, Z_StringOrNumeric **p, int opt,
+				 const char *name);
+YAZ_EXPORT int z_OtherInformationUnit(ODR o, Z_OtherInformationUnit **p,
+				      int opt, const char *name);
+YAZ_EXPORT int z_Term(ODR o, Z_Term **p, int opt, const char *name);
+YAZ_EXPORT int z_Specification(ODR o, Z_Specification **p, int opt,
+			       const char *name);
+YAZ_EXPORT int z_Permissions(ODR o, Z_Permissions **p, int opt,
+			     const char *name);
+YAZ_EXPORT int z_DiagRec(ODR o, Z_DiagRec **p, int opt, const char *name);
+YAZ_EXPORT int z_DiagRecs(ODR o, Z_DiagRecs **p, int opt, const char *name);
+YAZ_EXPORT int z_AttributeList(ODR o, Z_AttributeList **p, int opt,
+			       const char *name);
+YAZ_EXPORT int z_DefaultDiagFormat(ODR o, Z_DefaultDiagFormat **p, int opt,
+				   const char *name);
+YAZ_EXPORT Z_APDU *zget_APDU(ODR o, int which);
+YAZ_EXPORT int z_Query(ODR o, Z_Query **p, int opt, const char *name);
+
+YAZ_END_CDECL
+
+#include <yaz/prt-rsc.h>
+#include <yaz/prt-acc.h>
+#include <yaz/prt-exp.h>
+#include <yaz/prt-grs.h>
+#include <yaz/prt-arc.h>
+#include <yaz/prt-exd.h>
+#include <yaz/prt-dia.h>
+#include <yaz/prt-esp.h>
+#include <yaz/prt-add.h>
+
+#include <yaz/prt-dat.h>
+#include <yaz/prt-univ.h>
+#include <yaz/prt-ext.h>
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-rsc.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-rsc.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-rsc.h	(revision 21083)
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 1995, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:49  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.6  1997/05/14 06:53:50  adam
+ * C++ support.
+ *
+ * Revision 1.5  1995/09/29 17:12:11  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:52  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/08/17  12:45:17  quinn
+ * Fixed minor problems with GRS-1. Added support in c&s.
+ *
+ * Revision 1.2  1995/06/02  09:49:50  quinn
+ * Add access control
+ *
+ * Revision 1.1  1995/06/01  11:24:52  quinn
+ * Resource Control
+ *
+ *
+ */
+
+#ifndef PRT_RSC_H
+#define PRT_RSC_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -------------------- Resource-1 -------------------- */
+
+#define Z_EstimateType_currentSearchRecords           1
+#define Z_EstimateType_finalSearchRecords             2
+#define Z_EstimateType_currentPresentRecords          3
+#define Z_EstimateType_finalPresentRecords            4
+#define Z_EstimateType_currentOpTimeProcessing        5
+#define Z_EstimateType_finalOpTimeProcessing          6
+#define Z_EstimateType_currentAssocTime               7
+#define Z_EstimateType_currentOperationCost           8
+#define Z_EstimateType_finalOperationCost             9
+#define Z_EstimateType_currentAssocCost              10
+#define Z_EstimateType_finalOpTimeElapsed            11
+#define Z_EstimateType_percentComplete               12
+#define Z_EstimateType_currentSearchAssCost          13
+#define Z_EstimateType_currentPresentAssCost         14
+#define Z_EstimateType_currentConnectAssCost         15
+#define Z_EstimateType_currentOtherAssCost           16
+
+typedef struct Z_Estimate1
+{
+    int *type;
+    int *value;
+    int *currencyCode;             /* OPTIONAL */
+} Z_Estimate1;
+
+typedef struct Z_ResourceReport1
+{
+    int num_estimates;
+    Z_Estimate1 **estimates;
+    char *message;
+} Z_ResourceReport1;
+
+int z_ResourceReport1(ODR o, Z_ResourceReport1 **p, int opt, const char *name);
+
+/* -------------------- Resource-2 -------------------- */
+
+typedef struct Z_Estimate2
+{
+    Z_StringOrNumeric *type;      /* same as in estimate1, if numeric */
+    Z_IntUnit *value;
+} Z_Estimate2;
+
+typedef struct Z_ResourceReport2
+{
+    int num_estimates;
+    Z_Estimate2 **estimates;             /* OPTIONAL */
+    char *message;                       /* OPTIONAL */
+} Z_ResourceReport2;
+
+int z_ResourceReport2(ODR o, Z_ResourceReport2 **p, int opt, const char *name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-univ.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-univ.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/prt-univ.h	(revision 21083)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 1998
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ */
+
+#ifndef PRT_UNIV_H
+#define PRT_UNIV_H
+
+#include <yaz/yconfig.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* YC 0.1: Fri Mar 20 14:28:54 CET 1998 */
+/* Module-H ResourceReport-Format-Universe-1 */
+
+typedef struct Z_UniverseReportHits Z_UniverseReportHits;
+int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt,
+			  const char *name);
+
+typedef struct Z_UniverseReportDuplicate Z_UniverseReportDuplicate;
+int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt,
+			       const char *name);
+
+typedef struct Z_UniverseReport Z_UniverseReport;
+int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt,
+		      const char *name);
+
+struct Z_UniverseReportHits {
+	Z_StringOrNumeric *database;
+	Z_StringOrNumeric *hits;
+};
+
+struct Z_UniverseReportDuplicate {
+	Z_StringOrNumeric *hitno;
+};
+
+struct Z_UniverseReport {
+	int *totalHits;
+	int which;
+	union {
+		Z_UniverseReportHits *databaseHits;
+		Z_UniverseReportDuplicate *duplicate;
+#define Z_UniverseReport_databaseHits 1
+#define Z_UniverseReport_duplicate 2
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/readconf.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/readconf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/readconf.h	(revision 21083)
@@ -0,0 +1,19 @@
+
+#ifndef READCONF_H
+#define READCONF_H
+
+#include <stdio.h>
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+    
+YAZ_EXPORT int readconf(char *name, void *rprivate,
+                        int (*fun)(char *name, void *rprivate,
+				   int argc, char *argv[]));
+
+YAZ_EXPORT int readconf_line(FILE *f, int *lineno,
+			     char *line, int len, char *argv[], int num);
+    
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/statserv.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/statserv.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/statserv.h	(revision 21083)
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:50  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.17  1999/07/06 12:17:15  adam
+ * Added option -1 that runs server once (for profiling purposes).
+ *
+ * Revision 1.16  1999/06/10 11:45:30  adam
+ * Added bend_start, bend_stop handlers and removed pre_init.
+ * Handlers bend_start/bend_stop are called when service/daemon is
+ * started/stopped.
+ *
+ * Revision 1.15  1999/04/16 14:45:55  adam
+ * Added interface for tcpd wrapper for access control.
+ *
+ * Revision 1.14  1999/02/02 13:57:32  adam
+ * Uses preprocessor define WIN32 instead of WINDOWS to build code
+ * for Microsoft WIN32.
+ *
+ * Revision 1.13  1998/02/10 10:28:56  adam
+ * Added app_name, service_dependencies, service_display_name and
+ * options_func. options_func allows us to specify a different function
+ * to interogate the command line arguments. The other members allow us
+ * to pass the full service details accross to the service manager (CW).
+ *
+ * Revision 1.??? 1997/12/18   Chas
+ * Added app_name, service_dependencies, service_display_name and 
+ * options_func. options_func allows us to specify a different function 
+ * to interogate the command line arguments. The other members allow us
+ * to pass the full service details accross to the service manager.
+ *
+ * Revision 1.12  1997/11/07 13:31:47  adam
+ * Added NT Service name part of statserv_options_block. Moved NT
+ * service utility to server library.
+ *
+ * Revision 1.11  1997/10/27 14:03:01  adam
+ * Added new member to statserver_options_block, pre_init, which
+ * specifies a callback to be invoked after command line parsing and
+ * before the server listens for the first time.
+ *
+ * Revision 1.10  1997/09/01 09:31:26  adam
+ * Removed definition statserv_remove to eventl.h. (A hack really).
+ *
+ * Revision 1.9  1997/09/01 08:49:53  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.8  1997/05/14 06:53:51  adam
+ * C++ support.
+ *
+ * Revision 1.7  1995/09/29 17:12:12  quinn
+ * Smallish
+ *
+ * Revision 1.6  1995/09/27  15:02:53  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.5  1995/06/19  12:38:31  quinn
+ * Reorganized include-files. Added small features.
+ *
+ * Revision 1.4  1995/06/15  07:45:08  quinn
+ * Moving to v3.
+ *
+ * Revision 1.3  1995/05/16  08:50:38  quinn
+ * License, documentation, and memory fixes
+ *
+ *
+ */
+
+#ifndef STATSERVER_H
+#define STATSERVER_H
+
+#include <yaz/yconfig.h>
+#include <yaz/odr.h>
+#include <yaz/oid.h>
+
+YAZ_BEGIN_CDECL
+    
+typedef struct statserv_options_block
+{
+    int dynamic;                  /* fork on incoming requests */
+    int one_shot;                 /* one session then exit(1) */
+    int loglevel;                 /* desired logging-level */
+    char apdufile[ODR_MAXNAME+1]; /* file for pretty-printed PDUs */
+    char logfile[ODR_MAXNAME+1];  /* file for diagnostic output */
+    char default_listen[1024];    /* 0 == no default listen */
+    enum oid_proto default_proto; /* PROTO_SR or PROTO_Z3950 */
+    int idle_timeout;             /* how many minutes to wait before closing */
+    int maxrecordsize;            /* maximum value for negotiation */
+    char configname[ODR_MAXNAME+1];  /* given to the backend in bend_init */
+    char setuid[ODR_MAXNAME+1];     /* setuid to this user after binding */
+    void (*bend_start)(struct statserv_options_block *p);
+    void (*bend_stop)(struct statserv_options_block *p);
+    int (*options_func)(int argc, char **argv);
+    int (*check_ip)(void *cd, const char *addr, int len, int type);
+    char daemon_name[128];
+    int inetd;                    /* Do we use the inet deamon or not */
+    
+#ifdef WIN32
+    /* We only have these members for the windows version */
+    /* They seemed a bit large to have them there in general */
+    char service_name[128];         /* NT Service Name */
+    char app_name[128];             /* Application Name */
+    char service_dependencies[128]; /* The services we are dependent on */
+    char service_display_name[128]; /* The service display name */
+#endif /* WIN32 */
+} statserv_options_block;
+    
+int statserv_main(int argc, char **argv);
+int statserv_start(int argc, char **argv);
+void statserv_closedown(void);
+statserv_options_block *statserv_getcontrol(void);
+void statserv_setcontrol(statserv_options_block *block);
+
+int check_ip_tcpd(void *cd, const char *addr, int len, int type);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/tcpip.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/tcpip.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/tcpip.h	(revision 21083)
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:51  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.13  1999/06/16 11:55:24  adam
+ * Added APDU log to client.
+ *
+ * Revision 1.12  1999/01/08 11:23:19  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.11  1998/06/22 11:32:38  adam
+ * Added 'conditional cs_listen' feature.
+ *
+ * Revision 1.10  1998/05/18 13:07:01  adam
+ * Changed the way attribute sets are handled by the retriaval module.
+ * Extended Explain conversion / schema.
+ * Modified server and client to work with ASN.1 compiled protocol handlers.
+ *
+ * Revision 1.9  1997/09/01 08:49:54  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.8  1997/05/14 06:53:52  adam
+ * C++ support.
+ *
+ * Revision 1.7  1996/07/06 19:58:32  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.6  1996/02/10  12:23:42  quinn
+ * Enable inetd operations fro TCP/IP stack
+ *
+ * Revision 1.5  1995/09/29  17:12:13  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/28  10:12:36  quinn
+ * Windows-support changes
+ *
+ * Revision 1.3  1995/09/27  15:02:53  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:50:39  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/30  09:39:43  quinn
+ * Moved .h files to include directory
+ *
+ * Revision 1.3  1995/03/27  08:36:11  quinn
+ * Some work on nonblocking operation in xmosi.c and rfct.c.
+ * Added protocol parameter to cs_create()
+ *
+ * Revision 1.2  1995/03/14  10:28:43  quinn
+ * Adding server-side support to tcpip.c and fixing bugs in nonblocking I/O
+ *
+ * Revision 1.1  1995/02/09  15:51:52  quinn
+ * Works better now.
+ *
+ */
+
+#ifndef TCPIP_H
+#define TCPIP_H
+
+#include <yaz/comstack.h>
+#include <yaz/oid.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT int completeWAIS(const unsigned char *buf, int len);
+YAZ_EXPORT struct sockaddr_in *tcpip_strtoaddr(const char *str);
+YAZ_EXPORT COMSTACK tcpip_type(int s, int blocking, int protocol);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/tpath.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/tpath.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/tpath.h	(revision 21083)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:51  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.4  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ */
+
+#ifndef TPATH_H
+#define TPATH_H
+
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT FILE *yaz_path_fopen(const char *path,
+				const char *name, const char *mode);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/wrbuf.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/wrbuf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/wrbuf.h	(revision 21083)
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:52  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1999/11/03 09:05:56  adam
+ * Implemented wrbuf_puts.
+ *
+ * Revision 1.7  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.6  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.5  1997/09/17 12:10:32  adam
+ * YAZ version 1.4.
+ *
+ */
+
+#ifndef WRBUF_H
+#define WRBUF_H
+
+#include <yaz/xmalloc.h>
+
+YAZ_BEGIN_CDECL
+
+typedef struct wrbuf
+{
+    char *buf;
+    int pos;
+    int size;
+} wrbuf, *WRBUF;
+
+YAZ_EXPORT WRBUF wrbuf_alloc(void);
+YAZ_EXPORT void wrbuf_free(WRBUF b, int free_buf);
+YAZ_EXPORT void wrbuf_rewind(WRBUF b);
+YAZ_EXPORT int wrbuf_grow(WRBUF b, int minsize);
+YAZ_EXPORT int wrbuf_write(WRBUF b, const char *buf, int size);
+YAZ_EXPORT int wrbuf_puts(WRBUF b, const char *buf);
+
+#define wrbuf_len(b) ((b)->pos)
+#define wrbuf_buf(b) ((b)->buf)
+
+#define wrbuf_putc(b, c) \
+    (((b)->pos >= (b)->size ? wrbuf_grow(b, 1) : 0),  \
+    (b)->buf[(b)->pos++] = (c), 0)
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/xmalloc.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/xmalloc.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/xmalloc.h	(revision 21083)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The names of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:52  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1999/07/13 13:24:53  adam
+ * Updated memory debugging memory allocatation routines.
+ *
+ * Revision 1.5  1998/07/20 12:36:22  adam
+ * Minor changes.
+ *
+ * Revision 1.4  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.3  1997/09/01 08:49:54  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.2  1997/05/14 06:53:53  adam
+ * C++ support.
+ *
+ * Revision 1.1  1995/11/01 11:55:41  quinn
+ * Added xmalloc.c
+ *
+ * Revision 1.8  1995/10/16  14:03:07  quinn
+ * Changes to support element set names and espec1
+ *
+ * Revision 1.7  1994/10/05  10:15:18  quinn
+ * Added xrealloc.
+ *
+ * Revision 1.6  1994/09/26  16:31:24  adam
+ * Minor changes. xmalloc declares xcalloc now.
+ *
+ * Revision 1.5  1994/09/19  15:46:34  quinn
+ * Added stdlib.h
+ *
+ * Revision 1.4  1994/08/18  08:22:27  adam
+ * Res.h modified. xmalloc now declares xstrdup.
+ *
+ * Revision 1.3  1994/08/17  15:34:15  adam
+ * Initial version of resource manager.
+ *
+ * Revision 1.2  1994/08/17  14:09:48  quinn
+ * Small changes
+ *
+ * Revision 1.1  1994/08/17  13:39:07  adam
+ * Added xmalloc header.
+ *
+ * Revision 1.1  1994/08/16  16:16:02  adam
+ * bfile header created.
+ *
+ */
+
+#ifndef XMALLOC_H
+#define XMALLOC_H
+
+#include <sys/types.h>
+#include <stdlib.h>
+
+#include <yaz/yconfig.h>
+
+YAZ_BEGIN_CDECL
+
+#define xrealloc(o, x) xrealloc_f(o, x, __FILE__, __LINE__)
+#define xmalloc(x) xmalloc_f(x, __FILE__, __LINE__)
+#define xcalloc(x,y) xcalloc_f(x,y, __FILE__, __LINE__)
+#define xfree(x) xfree_f(x, __FILE__, __LINE__)
+#define xstrdup(s) xstrdup_f(s, __FILE__, __LINE__)
+#define xmalloc_trav(s) xmalloc_trav_f(s, __FILE__, __LINE__)
+    
+YAZ_EXPORT void *xrealloc_f (void *o, size_t size, const char *file, int line);
+YAZ_EXPORT void *xmalloc_f (size_t size, const char *file, int line);
+YAZ_EXPORT void *xcalloc_f (size_t nmemb, size_t size,
+			    const char *file, int line);
+YAZ_EXPORT char *xstrdup_f (const char *p, const char *file, int line);
+YAZ_EXPORT void xfree_f (void *p, const char *file, int line);
+YAZ_EXPORT void xmalloc_trav_f(const char *s, const char *file, int line);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-ccl.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-ccl.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-ccl.h	(revision 21083)
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation, in whole or in part, for any purpose, is hereby granted,
+ * provided that:
+ *
+ * 1. This copyright and permission notice appear in all copies of the
+ * software and its documentation. Notices of copyright or attribution
+ * which appear at the beginning of any file must remain unchanged.
+ *
+ * 2. The name of Index Data or the individual authors may not be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL INDEX DATA BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+ * NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:53  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.3  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.2  1999/12/20 15:20:13  adam
+ * Implemented ccl_pquery to convert from CCL tree to prefix query.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1997/09/01 08:49:54  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.7  1997/06/23 10:30:45  adam
+ * Added ODR stream as parameter to ccl_rpn_query and ccl_scan_query.
+ *
+ * Revision 1.6  1997/05/14 06:53:54  adam
+ * C++ support.
+ *
+ * Revision 1.5  1995/09/29 17:12:14  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:02:54  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/05/16  08:50:40  quinn
+ * License, documentation, and memory fixes
+ *
+ *
+ */
+
+#ifndef YAZ_CCL_H
+#define YAZ_CCL_H
+
+#include <yaz/yconfig.h>
+#include <yaz/proto.h>
+#include <yaz/ccl.h>
+#include <yaz/odr.h>
+#include <yaz/yaz-util.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p);
+YAZ_EXPORT Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p);
+YAZ_EXPORT void ccl_pquery (WRBUF w, struct ccl_rpn_node *p);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-util.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-util.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-util.h	(revision 21083)
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:53  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1997/10/27 13:52:46  adam
+ * Header yaz-util includes all YAZ utility header files.
+ *
+ * Revision 1.5  1997/09/04 07:58:36  adam
+ * Added prototype for atoi_n.
+ *
+ * Revision 1.4  1997/09/01 08:49:54  adam
+ * New windows NT/95 port using MSV5.0. To export DLL functions the
+ * YAZ_EXPORT modifier was added. Defined in yconfig.h.
+ *
+ * Revision 1.3  1997/05/14 06:53:54  adam
+ * C++ support.
+ *
+ * Revision 1.2  1996/02/20 17:58:09  adam
+ * Added const to yaz_matchstr.
+ *
+ * Revision 1.1  1996/02/20  16:32:49  quinn
+ * Created util file.
+ */
+
+#ifndef YAZ_UTIL_H
+#define YAZ_UTIL_H
+
+#include <yaz/yconfig.h>
+#include <yaz/xmalloc.h>
+#include <yaz/log.h>
+#include <yaz/tpath.h>
+#include <yaz/options.h>
+#include <yaz/wrbuf.h>
+#include <yaz/nmem.h>
+#include <yaz/readconf.h>
+
+YAZ_BEGIN_CDECL
+
+YAZ_EXPORT int yaz_matchstr(const char *s1, const char *s2);
+YAZ_EXPORT int atoi_n (const char *buf, int len);
+
+YAZ_END_CDECL
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-version.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-version.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz-version.h	(revision 21083)
@@ -0,0 +1,93 @@
+/*
+ * Current software version.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:10:54  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.1  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.18  1998/06/26 11:17:23  quinn
+ * v2+
+ *
+ * Revision 1.17  1998/01/30 15:32:57  adam
+ * 1.4pl2.
+ *
+ * Revision 1.16  1998/01/29 13:28:23  adam
+ * YAZ version 1.4pl1.
+ *
+ * Revision 1.15  1997/09/17 12:10:33  adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.14  1997/04/30 08:52:09  quinn
+ * Null
+ *
+ * Revision 1.13  1996/10/11  15:06:55  quinn
+ * Version 1.3
+ *
+ * Revision 1.12  1996/06/10  08:57:50  quinn
+ * 1.2
+ *
+ * Revision 1.11  1996/04/10  11:40:33  quinn
+ * 1.1pl2
+ *
+ * Revision 1.10  1996/02/20  12:57:45  quinn
+ * V1.1
+ *
+ * Revision 1.9  1996/01/24  16:01:24  quinn
+ * pl4
+ *
+ * Revision 1.8  1996/01/02  11:46:50  quinn
+ * Changed 'operator' to 'roperator' to avoid C++ conflict.
+ * Moved to pl3
+ *
+ * Revision 1.7  1995/12/06  15:50:42  quinn
+ * 1.0pl2
+ *
+ * Revision 1.6  1995/12/05  11:15:57  quinn
+ * 1.0pl1
+ *
+ * Revision 1.5  1995/11/28  09:31:22  quinn
+ * Version 1.0
+ *
+ * Revision 1.4  1995/08/24  15:13:18  quinn
+ * Beta 3
+ *
+ * Revision 1.3  1995/06/27  13:12:07  quinn
+ * v1.0b2
+ * See CHANGELOG for update info now.
+ *
+ * Revision 1.2  1995/06/19  13:39:16  quinn
+ * 1.0 beta
+ * All of basic 1995 should be in place at this point. Some little features
+ * added to make the server more useful. BER dumper for bad protocol debugging.
+ * Etc. First major release. All following releases should come with
+ * a changelog.
+ *
+ * Revision 1.1  1995/06/14  12:34:55  quinn
+ * Moved version.h to include/
+ *
+ * Revision 1.4  1995/06/07  14:43:57  quinn
+ * Various work towards first public release. Specifically, the CLOSE
+ * service has been added.
+ *
+ * Revision 1.3  1995/05/29  09:52:38  quinn
+ * Second pre-release.
+ *
+ * Revision 1.2  1995/05/16  10:22:47  quinn
+ * 0.1 beta
+ * Fairly stable version with structure in place for asynchronous server
+ * activity (the backend doesn't have complete support for this yet).
+ *
+ * Revision 1.1  1995/05/16  08:49:38  quinn
+ * Introduced version control
+ *
+ */
+#ifndef YAZ_VERSION
+#define YAZ_VERSION "1.6"
+#endif
+
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz_zclient.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz_zclient.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/yaz_zclient.h	(revision 21083)
@@ -0,0 +1,28 @@
+#ifndef YAZ_ZCLIENT_H
+#define YAZ_ZCLIENT_H
+/*#include "../include/yaz/z-core.h"*/
+
+extern void z_initialize(void);
+
+/* creates a connection, given a host and port, and database name */
+extern int z_cmd_open(char *host_and_port, char *base);
+
+/* returns number of records found */
+extern int z_cmd_dosearch(char *search);
+
+/* returns an array of strings containing record titles. The first element
+   is an int, saying how many titles follow (can be zero). NULL on error. */
+extern char **z_getrecordTitles(int start,int count);
+
+/* returns a string containing the whole marc record */
+extern char *z_getfullRecord(int record);
+
+/* close the connection */
+extern int z_cmd_close(char *arg);
+
+/* returns a string containing name, ID, etc, or NULL if not connected */
+extern char *z_get_initResponse(); 
+
+/* gets a generic response from the server */
+extern int z_getnextAPDU ();
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/yconfig.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/yconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/yconfig.h	(revision 21083)
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ *
+ * $Id$
+ */
+
+#ifndef YCONFIG_H
+#define YCONFIG_H
+
+#ifndef YAZ_EXPORT
+# ifdef WIN32
+#  define YAZ_EXPORT __declspec(dllexport)
+# else
+#  define YAZ_EXPORT
+# endif
+#endif
+
+#ifndef WIN32
+# ifndef O_BINARY
+#  define O_BINARY 0
+# endif
+#endif
+
+#ifdef __cplusplus
+#define YAZ_BEGIN_CDECL extern "C" {
+#define YAZ_END_CDECL }
+#else
+#define YAZ_BEGIN_CDECL 
+#define YAZ_END_CDECL 
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accdes1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accdes1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accdes1.h	(revision 21083)
@@ -0,0 +1,42 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H AccessControlFormat-des-1 */
+
+#ifndef z_accdes1_H
+#define z_accdes1_H
+
+#include <yaz/odr.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_DES_RN_Object Z_DES_RN_Object;
+YAZ_EXPORT int z_DES_RN_Object (ODR o, Z_DES_RN_Object **p, int opt, const char *name);
+
+typedef struct Z_DRNType Z_DRNType;
+YAZ_EXPORT int z_DRNType (ODR o, Z_DRNType **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_DES_RN_Object {
+	int which;
+	union {
+		Z_DRNType *challenge;
+		Z_DRNType *response;
+#define Z_DES_RN_Object_challenge 1
+#define Z_DES_RN_Object_response 2
+	} u;
+};
+
+struct Z_DRNType {
+	Odr_oct *userId; /* OPT */
+	Odr_oct *salt; /* OPT */
+	Odr_oct *randomNumber;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accform1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accform1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-accform1.h	(revision 21083)
@@ -0,0 +1,134 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H AccessControlFormat-prompt-1 */
+
+#ifndef z_accform1_H
+#define z_accform1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_PromptObject1 Z_PromptObject1;
+YAZ_EXPORT int z_PromptObject1 (ODR o, Z_PromptObject1 **p, int opt, const char *name);
+
+typedef struct Z_ChallengeUnit1 Z_ChallengeUnit1;
+YAZ_EXPORT int z_ChallengeUnit1 (ODR o, Z_ChallengeUnit1 **p, int opt, const char *name);
+
+typedef struct Z_Challenge1 Z_Challenge1;
+YAZ_EXPORT int z_Challenge1 (ODR o, Z_Challenge1 **p, int opt, const char *name);
+
+typedef struct Z_ResponseUnit1 Z_ResponseUnit1;
+YAZ_EXPORT int z_ResponseUnit1 (ODR o, Z_ResponseUnit1 **p, int opt, const char *name);
+
+typedef struct Z_Response1 Z_Response1;
+YAZ_EXPORT int z_Response1 (ODR o, Z_Response1 **p, int opt, const char *name);
+
+typedef struct Z_PromptIdEnumeratedPrompt Z_PromptIdEnumeratedPrompt;
+YAZ_EXPORT int z_PromptIdEnumeratedPrompt (ODR o, Z_PromptIdEnumeratedPrompt **p, int opt, const char *name);
+
+typedef struct Z_PromptId Z_PromptId;
+YAZ_EXPORT int z_PromptId (ODR o, Z_PromptId **p, int opt, const char *name);
+
+typedef struct Z_Encryption Z_Encryption;
+YAZ_EXPORT int z_Encryption (ODR o, Z_Encryption **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_PromptObject1 {
+	int which;
+	union {
+		Z_Challenge1 *challenge;
+		Z_Response1 *response;
+#define Z_PromptObject1_challenge 1
+#define Z_PromptObject1_response 2
+	} u;
+};
+
+struct Z_ChallengeUnit1 {
+	Z_PromptId *promptId;
+	Z_InternationalString *defaultResponse; /* OPT */
+	int which;
+	union {
+		Z_InternationalString *character;
+		Z_Encryption *encrypted;
+#define Z_ChallengeUnit1_character 1
+#define Z_ChallengeUnit1_encrypted 2
+	} u; /* OPT */
+	Z_InternationalString *regExpr; /* OPT */
+	Odr_null *responseRequired; /* OPT */
+	int num_allowedValues;
+	Z_InternationalString **allowedValues; /* OPT */
+	Odr_null *shouldSave; /* OPT */
+#define Z_ChallengeUnit1_integer 1
+#define Z_ChallengeUnit1_date 2
+#define Z_ChallengeUnit1_float 3
+#define Z_ChallengeUnit1_alphaNumeric 4
+#define Z_ChallengeUnit1_url_urn 5
+#define Z_ChallengeUnit1_boolean 6
+	int *dataType; /* OPT */
+	Z_External *diagnostic; /* OPT */
+};
+
+struct Z_Challenge1 {
+	int num;
+	Z_ChallengeUnit1 **elements;
+};
+
+struct Z_ResponseUnit1 {
+	Z_PromptId *promptId;
+	int which;
+	union {
+		Z_InternationalString *string;
+		bool_t *accept;
+		Odr_null *acknowledge;
+		Z_DiagRec *diagnostic;
+		Z_Encryption *encrypted;
+#define Z_ResponseUnit1_string 1
+#define Z_ResponseUnit1_accept 2
+#define Z_ResponseUnit1_acknowledge 3
+#define Z_ResponseUnit1_diagnostic 4
+#define Z_ResponseUnit1_encrypted 5
+	} u;
+};
+
+struct Z_Response1 {
+	int num;
+	Z_ResponseUnit1 **elements;
+};
+
+struct Z_PromptIdEnumeratedPrompt {
+#define Z_PromptIdEnumeratedPrompt_groupId 0
+#define Z_PromptIdEnumeratedPrompt_userId 1
+#define Z_PromptIdEnumeratedPrompt_password 2
+#define Z_PromptIdEnumeratedPrompt_newPassword 3
+#define Z_PromptIdEnumeratedPrompt_copyright 4
+#define Z_PromptIdEnumeratedPrompt_sessionId 5
+	int *type;
+	Z_InternationalString *suggestedString; /* OPT */
+};
+
+struct Z_PromptId {
+	int which;
+	union {
+		Z_PromptIdEnumeratedPrompt *enumeratedPrompt;
+		Z_InternationalString *nonEnumeratedPrompt;
+#define Z_PromptId_enumeratedPrompt 1
+#define Z_PromptId_nonEnumeratedPrompt 2
+	} u;
+};
+
+struct Z_Encryption {
+	Odr_oct *cryptType; /* OPT */
+	Odr_oct *credential; /* OPT */
+	Odr_oct *data;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-acckrb1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-acckrb1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-acckrb1.h	(revision 21083)
@@ -0,0 +1,51 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H AccessControlFormat-krb-1 */
+
+#ifndef z_acckrb1_H
+#define z_acckrb1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_KRBObject Z_KRBObject;
+YAZ_EXPORT int z_KRBObject (ODR o, Z_KRBObject **p, int opt, const char *name);
+
+typedef struct Z_KRBRequest Z_KRBRequest;
+YAZ_EXPORT int z_KRBRequest (ODR o, Z_KRBRequest **p, int opt, const char *name);
+
+typedef struct Z_KRBResponse Z_KRBResponse;
+YAZ_EXPORT int z_KRBResponse (ODR o, Z_KRBResponse **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_KRBObject {
+	int which;
+	union {
+		Z_KRBRequest *challenge;
+		Z_KRBResponse *response;
+#define Z_KRBObject_challenge 1
+#define Z_KRBObject_response 2
+	} u;
+};
+
+struct Z_KRBRequest {
+	Z_InternationalString *service;
+	Z_InternationalString *instance; /* OPT */
+	Z_InternationalString *realm; /* OPT */
+};
+
+struct Z_KRBResponse {
+	Z_InternationalString *userid; /* OPT */
+	Odr_oct *ticket;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-core.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-core.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-core.h	(revision 21083)
@@ -0,0 +1,1220 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H Z39-50-APDU-1995 */
+
+#ifndef z_core_H
+#define z_core_H
+
+#include <yaz/odr.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_External Z_External;
+YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
+
+
+typedef struct Z_APDU Z_APDU;
+YAZ_EXPORT int z_APDU (ODR o, Z_APDU **p, int opt, const char *name);
+
+typedef struct Z_InitRequest Z_InitRequest;
+YAZ_EXPORT int z_InitRequest (ODR o, Z_InitRequest **p, int opt, const char *name);
+
+typedef struct Z_IdPass Z_IdPass;
+YAZ_EXPORT int z_IdPass (ODR o, Z_IdPass **p, int opt, const char *name);
+
+typedef struct Z_IdAuthentication Z_IdAuthentication;
+YAZ_EXPORT int z_IdAuthentication (ODR o, Z_IdAuthentication **p, int opt, const char *name);
+
+typedef struct Z_InitResponse Z_InitResponse;
+YAZ_EXPORT int z_InitResponse (ODR o, Z_InitResponse **p, int opt, const char *name);
+
+typedef Odr_bitmask  Z_ProtocolVersion;
+YAZ_EXPORT int z_ProtocolVersion (ODR o, Z_ProtocolVersion **p, int opt, const char *name);
+
+typedef Odr_bitmask  Z_Options;
+YAZ_EXPORT int z_Options (ODR o, Z_Options **p, int opt, const char *name);
+
+typedef struct Z_SearchRequest Z_SearchRequest;
+YAZ_EXPORT int z_SearchRequest (ODR o, Z_SearchRequest **p, int opt, const char *name);
+
+typedef struct Z_Query Z_Query;
+YAZ_EXPORT int z_Query (ODR o, Z_Query **p, int opt, const char *name);
+
+typedef struct Z_RPNQuery Z_RPNQuery;
+YAZ_EXPORT int z_RPNQuery (ODR o, Z_RPNQuery **p, int opt, const char *name);
+
+typedef struct Z_Complex Z_Complex;
+YAZ_EXPORT int z_Complex (ODR o, Z_Complex **p, int opt, const char *name);
+
+typedef struct Z_RPNStructure Z_RPNStructure;
+YAZ_EXPORT int z_RPNStructure (ODR o, Z_RPNStructure **p, int opt, const char *name);
+
+typedef struct Z_Operand Z_Operand;
+YAZ_EXPORT int z_Operand (ODR o, Z_Operand **p, int opt, const char *name);
+
+typedef struct Z_AttributesPlusTerm Z_AttributesPlusTerm;
+YAZ_EXPORT int z_AttributesPlusTerm (ODR o, Z_AttributesPlusTerm **p, int opt, const char *name);
+
+typedef struct Z_ResultSetPlusAttributes Z_ResultSetPlusAttributes;
+YAZ_EXPORT int z_ResultSetPlusAttributes (ODR o, Z_ResultSetPlusAttributes **p, int opt, const char *name);
+
+typedef struct Z_AttributeList Z_AttributeList;
+YAZ_EXPORT int z_AttributeList (ODR o, Z_AttributeList **p, int opt, const char *name);
+
+typedef struct Z_Term Z_Term;
+YAZ_EXPORT int z_Term (ODR o, Z_Term **p, int opt, const char *name);
+
+typedef struct Z_Operator Z_Operator;
+YAZ_EXPORT int z_Operator (ODR o, Z_Operator **p, int opt, const char *name);
+
+typedef struct Z_ComplexAttribute Z_ComplexAttribute;
+YAZ_EXPORT int z_ComplexAttribute (ODR o, Z_ComplexAttribute **p, int opt, const char *name);
+
+typedef struct Z_AttributeElement Z_AttributeElement;
+YAZ_EXPORT int z_AttributeElement (ODR o, Z_AttributeElement **p, int opt, const char *name);
+
+typedef struct Z_ProximityOperator Z_ProximityOperator;
+YAZ_EXPORT int z_ProximityOperator (ODR o, Z_ProximityOperator **p, int opt, const char *name);
+
+typedef int  Z_ProxUnit;
+YAZ_EXPORT int z_ProxUnit (ODR o, Z_ProxUnit **p, int opt, const char *name);
+
+typedef struct Z_SearchResponse Z_SearchResponse;
+YAZ_EXPORT int z_SearchResponse (ODR o, Z_SearchResponse **p, int opt, const char *name);
+
+typedef struct Z_RecordComposition Z_RecordComposition;
+YAZ_EXPORT int z_RecordComposition (ODR o, Z_RecordComposition **p, int opt, const char *name);
+
+typedef struct Z_PresentRequest Z_PresentRequest;
+YAZ_EXPORT int z_PresentRequest (ODR o, Z_PresentRequest **p, int opt, const char *name);
+
+typedef struct Z_Segment Z_Segment;
+YAZ_EXPORT int z_Segment (ODR o, Z_Segment **p, int opt, const char *name);
+
+typedef struct Z_PresentResponse Z_PresentResponse;
+YAZ_EXPORT int z_PresentResponse (ODR o, Z_PresentResponse **p, int opt, const char *name);
+
+typedef struct Z_NamePlusRecordList Z_NamePlusRecordList;
+YAZ_EXPORT int z_NamePlusRecordList (ODR o, Z_NamePlusRecordList **p, int opt, const char *name);
+
+typedef struct Z_DiagRecs Z_DiagRecs;
+YAZ_EXPORT int z_DiagRecs (ODR o, Z_DiagRecs **p, int opt, const char *name);
+
+typedef struct Z_Records Z_Records;
+YAZ_EXPORT int z_Records (ODR o, Z_Records **p, int opt, const char *name);
+
+typedef struct Z_NamePlusRecord Z_NamePlusRecord;
+YAZ_EXPORT int z_NamePlusRecord (ODR o, Z_NamePlusRecord **p, int opt, const char *name);
+
+typedef struct Z_FragmentSyntax Z_FragmentSyntax;
+YAZ_EXPORT int z_FragmentSyntax (ODR o, Z_FragmentSyntax **p, int opt, const char *name);
+
+typedef struct Z_DiagRec Z_DiagRec;
+YAZ_EXPORT int z_DiagRec (ODR o, Z_DiagRec **p, int opt, const char *name);
+
+typedef struct Z_DefaultDiagFormat Z_DefaultDiagFormat;
+YAZ_EXPORT int z_DefaultDiagFormat (ODR o, Z_DefaultDiagFormat **p, int opt, const char *name);
+
+typedef struct Z_Range Z_Range;
+YAZ_EXPORT int z_Range (ODR o, Z_Range **p, int opt, const char *name);
+
+typedef struct Z_DatabaseSpecificUnit Z_DatabaseSpecificUnit;
+YAZ_EXPORT int z_DatabaseSpecificUnit (ODR o, Z_DatabaseSpecificUnit **p, int opt, const char *name);
+
+typedef struct Z_DatabaseSpecific Z_DatabaseSpecific;
+YAZ_EXPORT int z_DatabaseSpecific (ODR o, Z_DatabaseSpecific **p, int opt, const char *name);
+
+typedef struct Z_ElementSetNames Z_ElementSetNames;
+YAZ_EXPORT int z_ElementSetNames (ODR o, Z_ElementSetNames **p, int opt, const char *name);
+
+typedef int  Z_PresentStatus;
+YAZ_EXPORT int z_PresentStatus (ODR o, Z_PresentStatus **p, int opt, const char *name);
+
+typedef struct Z_DbSpecific Z_DbSpecific;
+YAZ_EXPORT int z_DbSpecific (ODR o, Z_DbSpecific **p, int opt, const char *name);
+
+typedef struct Z_CompSpec Z_CompSpec;
+YAZ_EXPORT int z_CompSpec (ODR o, Z_CompSpec **p, int opt, const char *name);
+
+typedef struct Z_ElementSpec Z_ElementSpec;
+YAZ_EXPORT int z_ElementSpec (ODR o, Z_ElementSpec **p, int opt, const char *name);
+
+typedef struct Z_Specification Z_Specification;
+YAZ_EXPORT int z_Specification (ODR o, Z_Specification **p, int opt, const char *name);
+
+typedef struct Z_DeleteResultSetRequest Z_DeleteResultSetRequest;
+YAZ_EXPORT int z_DeleteResultSetRequest (ODR o, Z_DeleteResultSetRequest **p, int opt, const char *name);
+
+typedef struct Z_DeleteResultSetResponse Z_DeleteResultSetResponse;
+YAZ_EXPORT int z_DeleteResultSetResponse (ODR o, Z_DeleteResultSetResponse **p, int opt, const char *name);
+
+typedef struct Z_ListStatus Z_ListStatus;
+YAZ_EXPORT int z_ListStatus (ODR o, Z_ListStatus **p, int opt, const char *name);
+
+typedef struct Z_ListStatuses Z_ListStatuses;
+YAZ_EXPORT int z_ListStatuses (ODR o, Z_ListStatuses **p, int opt, const char *name);
+
+typedef int  Z_DeleteStatus;
+YAZ_EXPORT int z_DeleteStatus (ODR o, Z_DeleteStatus **p, int opt, const char *name);
+
+typedef struct Z_AccessControlRequest Z_AccessControlRequest;
+YAZ_EXPORT int z_AccessControlRequest (ODR o, Z_AccessControlRequest **p, int opt, const char *name);
+
+typedef struct Z_AccessControlResponse Z_AccessControlResponse;
+YAZ_EXPORT int z_AccessControlResponse (ODR o, Z_AccessControlResponse **p, int opt, const char *name);
+
+typedef struct Z_ResourceControlRequest Z_ResourceControlRequest;
+YAZ_EXPORT int z_ResourceControlRequest (ODR o, Z_ResourceControlRequest **p, int opt, const char *name);
+
+typedef struct Z_ResourceControlResponse Z_ResourceControlResponse;
+YAZ_EXPORT int z_ResourceControlResponse (ODR o, Z_ResourceControlResponse **p, int opt, const char *name);
+
+typedef struct Z_TriggerResourceControlRequest Z_TriggerResourceControlRequest;
+YAZ_EXPORT int z_TriggerResourceControlRequest (ODR o, Z_TriggerResourceControlRequest **p, int opt, const char *name);
+
+typedef struct Z_ResourceReportRequest Z_ResourceReportRequest;
+YAZ_EXPORT int z_ResourceReportRequest (ODR o, Z_ResourceReportRequest **p, int opt, const char *name);
+
+typedef struct Z_ResourceReportResponse Z_ResourceReportResponse;
+YAZ_EXPORT int z_ResourceReportResponse (ODR o, Z_ResourceReportResponse **p, int opt, const char *name);
+
+typedef Z_External  Z_ResourceReport;
+YAZ_EXPORT int z_ResourceReport (ODR o, Z_ResourceReport **p, int opt, const char *name);
+
+typedef Odr_oid  Z_ResourceReportId;
+YAZ_EXPORT int z_ResourceReportId (ODR o, Z_ResourceReportId **p, int opt, const char *name);
+
+typedef struct Z_ScanRequest Z_ScanRequest;
+YAZ_EXPORT int z_ScanRequest (ODR o, Z_ScanRequest **p, int opt, const char *name);
+
+typedef struct Z_ScanResponse Z_ScanResponse;
+YAZ_EXPORT int z_ScanResponse (ODR o, Z_ScanResponse **p, int opt, const char *name);
+
+typedef struct Z_ListEntries Z_ListEntries;
+YAZ_EXPORT int z_ListEntries (ODR o, Z_ListEntries **p, int opt, const char *name);
+
+typedef struct Z_Entry Z_Entry;
+YAZ_EXPORT int z_Entry (ODR o, Z_Entry **p, int opt, const char *name);
+
+typedef struct Z_TermInfo Z_TermInfo;
+YAZ_EXPORT int z_TermInfo (ODR o, Z_TermInfo **p, int opt, const char *name);
+
+typedef struct Z_byDatabaseList_s Z_byDatabaseList_s;
+YAZ_EXPORT int z_byDatabaseList_s (ODR o, Z_byDatabaseList_s **p, int opt, const char *name);
+
+typedef struct Z_byDatabaseList Z_byDatabaseList;
+YAZ_EXPORT int z_byDatabaseList (ODR o, Z_byDatabaseList **p, int opt, const char *name);
+
+typedef struct Z_OccurrenceByAttributesElem Z_OccurrenceByAttributesElem;
+YAZ_EXPORT int z_OccurrenceByAttributesElem (ODR o, Z_OccurrenceByAttributesElem **p, int opt, const char *name);
+
+typedef struct Z_OccurrenceByAttributes Z_OccurrenceByAttributes;
+YAZ_EXPORT int z_OccurrenceByAttributes (ODR o, Z_OccurrenceByAttributes **p, int opt, const char *name);
+
+typedef struct Z_SortKeySpecList Z_SortKeySpecList;
+YAZ_EXPORT int z_SortKeySpecList (ODR o, Z_SortKeySpecList **p, int opt, const char *name);
+
+typedef struct Z_SortRequest Z_SortRequest;
+YAZ_EXPORT int z_SortRequest (ODR o, Z_SortRequest **p, int opt, const char *name);
+
+typedef struct Z_SortResponse Z_SortResponse;
+YAZ_EXPORT int z_SortResponse (ODR o, Z_SortResponse **p, int opt, const char *name);
+
+typedef struct Z_SortKeySpec Z_SortKeySpec;
+YAZ_EXPORT int z_SortKeySpec (ODR o, Z_SortKeySpec **p, int opt, const char *name);
+
+typedef struct Z_SortDbSpecificList_s Z_SortDbSpecificList_s;
+YAZ_EXPORT int z_SortDbSpecificList_s (ODR o, Z_SortDbSpecificList_s **p, int opt, const char *name);
+
+typedef struct Z_SortDbSpecificList Z_SortDbSpecificList;
+YAZ_EXPORT int z_SortDbSpecificList (ODR o, Z_SortDbSpecificList **p, int opt, const char *name);
+
+typedef struct Z_SortElement Z_SortElement;
+YAZ_EXPORT int z_SortElement (ODR o, Z_SortElement **p, int opt, const char *name);
+
+typedef struct Z_SortAttributes Z_SortAttributes;
+YAZ_EXPORT int z_SortAttributes (ODR o, Z_SortAttributes **p, int opt, const char *name);
+
+typedef struct Z_SortKey Z_SortKey;
+YAZ_EXPORT int z_SortKey (ODR o, Z_SortKey **p, int opt, const char *name);
+
+typedef struct Z_ExtendedServicesRequest Z_ExtendedServicesRequest;
+YAZ_EXPORT int z_ExtendedServicesRequest (ODR o, Z_ExtendedServicesRequest **p, int opt, const char *name);
+
+typedef struct Z_ExtendedServicesResponse Z_ExtendedServicesResponse;
+YAZ_EXPORT int z_ExtendedServicesResponse (ODR o, Z_ExtendedServicesResponse **p, int opt, const char *name);
+
+typedef struct Z_Permissions_s Z_Permissions_s;
+YAZ_EXPORT int z_Permissions_s (ODR o, Z_Permissions_s **p, int opt, const char *name);
+
+typedef struct Z_Permissions Z_Permissions;
+YAZ_EXPORT int z_Permissions (ODR o, Z_Permissions **p, int opt, const char *name);
+
+typedef struct Z_Close Z_Close;
+YAZ_EXPORT int z_Close (ODR o, Z_Close **p, int opt, const char *name);
+
+typedef int  Z_CloseReason;
+YAZ_EXPORT int z_CloseReason (ODR o, Z_CloseReason **p, int opt, const char *name);
+
+typedef Odr_oct  Z_ReferenceId;
+YAZ_EXPORT int z_ReferenceId (ODR o, Z_ReferenceId **p, int opt, const char *name);
+
+typedef Odr_oid  Z_AttributeSetId;
+YAZ_EXPORT int z_AttributeSetId (ODR o, Z_AttributeSetId **p, int opt, const char *name);
+
+typedef struct Z_OtherInformationUnit Z_OtherInformationUnit;
+YAZ_EXPORT int z_OtherInformationUnit (ODR o, Z_OtherInformationUnit **p, int opt, const char *name);
+
+typedef struct Z_OtherInformation Z_OtherInformation;
+YAZ_EXPORT int z_OtherInformation (ODR o, Z_OtherInformation **p, int opt, const char *name);
+
+typedef struct Z_InfoCategory Z_InfoCategory;
+YAZ_EXPORT int z_InfoCategory (ODR o, Z_InfoCategory **p, int opt, const char *name);
+
+typedef struct Z_IntUnit Z_IntUnit;
+YAZ_EXPORT int z_IntUnit (ODR o, Z_IntUnit **p, int opt, const char *name);
+
+typedef struct Z_Unit Z_Unit;
+YAZ_EXPORT int z_Unit (ODR o, Z_Unit **p, int opt, const char *name);
+
+typedef char  Z_InternationalString;
+YAZ_EXPORT int z_InternationalString (ODR o, Z_InternationalString **p, int opt, const char *name);
+
+typedef Z_InternationalString  Z_ResultSetId;
+YAZ_EXPORT int z_ResultSetId (ODR o, Z_ResultSetId **p, int opt, const char *name);
+
+typedef Z_InternationalString  Z_ElementSetName;
+YAZ_EXPORT int z_ElementSetName (ODR o, Z_ElementSetName **p, int opt, const char *name);
+
+typedef Z_InternationalString  Z_DatabaseName;
+YAZ_EXPORT int z_DatabaseName (ODR o, Z_DatabaseName **p, int opt, const char *name);
+
+typedef struct Z_StringOrNumeric Z_StringOrNumeric;
+YAZ_EXPORT int z_StringOrNumeric (ODR o, Z_StringOrNumeric **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_APDU {
+	int which;
+	union {
+		Z_InitRequest *initRequest;
+		Z_InitResponse *initResponse;
+		Z_SearchRequest *searchRequest;
+		Z_SearchResponse *searchResponse;
+		Z_PresentRequest *presentRequest;
+		Z_PresentResponse *presentResponse;
+		Z_DeleteResultSetRequest *deleteResultSetRequest;
+		Z_DeleteResultSetResponse *deleteResultSetResponse;
+		Z_AccessControlRequest *accessControlRequest;
+		Z_AccessControlResponse *accessControlResponse;
+		Z_ResourceControlRequest *resourceControlRequest;
+		Z_ResourceControlResponse *resourceControlResponse;
+		Z_TriggerResourceControlRequest *triggerResourceControlRequest;
+		Z_ResourceReportRequest *resourceReportRequest;
+		Z_ResourceReportResponse *resourceReportResponse;
+		Z_ScanRequest *scanRequest;
+		Z_ScanResponse *scanResponse;
+		Z_SortRequest *sortRequest;
+		Z_SortResponse *sortResponse;
+		Z_Segment *segmentRequest;
+		Z_ExtendedServicesRequest *extendedServicesRequest;
+		Z_ExtendedServicesResponse *extendedServicesResponse;
+		Z_Close *close;
+#define Z_APDU_initRequest 1
+#define Z_APDU_initResponse 2
+#define Z_APDU_searchRequest 3
+#define Z_APDU_searchResponse 4
+#define Z_APDU_presentRequest 5
+#define Z_APDU_presentResponse 6
+#define Z_APDU_deleteResultSetRequest 7
+#define Z_APDU_deleteResultSetResponse 8
+#define Z_APDU_accessControlRequest 9
+#define Z_APDU_accessControlResponse 10
+#define Z_APDU_resourceControlRequest 11
+#define Z_APDU_resourceControlResponse 12
+#define Z_APDU_triggerResourceControlRequest 13
+#define Z_APDU_resourceReportRequest 14
+#define Z_APDU_resourceReportResponse 15
+#define Z_APDU_scanRequest 16
+#define Z_APDU_scanResponse 17
+#define Z_APDU_sortRequest 18
+#define Z_APDU_sortResponse 19
+#define Z_APDU_segmentRequest 20
+#define Z_APDU_extendedServicesRequest 21
+#define Z_APDU_extendedServicesResponse 22
+#define Z_APDU_close 23
+	} u;
+};
+
+struct Z_InitRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_ProtocolVersion *protocolVersion;
+	Z_Options *options;
+	int *preferredMessageSize;
+	int *maximumRecordSize;
+	Z_IdAuthentication *idAuthentication; /* OPT */
+	Z_InternationalString *implementationId; /* OPT */
+	Z_InternationalString *implementationName; /* OPT */
+	Z_InternationalString *implementationVersion; /* OPT */
+	Z_External *userInformationField; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_IdPass {
+	Z_InternationalString *groupId; /* OPT */
+	Z_InternationalString *userId; /* OPT */
+	Z_InternationalString *password; /* OPT */
+};
+
+struct Z_IdAuthentication {
+	int which;
+	union {
+		char *open;
+		Z_IdPass *idPass;
+		Odr_null *anonymous;
+		Z_External *other;
+#define Z_IdAuthentication_open 1
+#define Z_IdAuthentication_idPass 2
+#define Z_IdAuthentication_anonymous 3
+#define Z_IdAuthentication_other 4
+	} u;
+};
+
+struct Z_InitResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_ProtocolVersion *protocolVersion;
+	Z_Options *options;
+	int *preferredMessageSize;
+	int *maximumRecordSize;
+	bool_t *result;
+	Z_InternationalString *implementationId; /* OPT */
+	Z_InternationalString *implementationName; /* OPT */
+	Z_InternationalString *implementationVersion; /* OPT */
+	Z_External *userInformationField; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+#define Z_ProtocolVersion_1 0
+#define Z_ProtocolVersion_2 1
+#define Z_ProtocolVersion_3 2
+
+#define Z_Options_search 0
+#define Z_Options_present 1
+#define Z_Options_delSet 2
+#define Z_Options_resourceReport 3
+#define Z_Options_triggerResourceCtrl 4
+#define Z_Options_resourceCtrl 5
+#define Z_Options_accessCtrl 6
+#define Z_Options_scan 7
+#define Z_Options_sort 8
+#define Z_Options_extendedServices 10
+#define Z_Options_level_1Segmentation 11
+#define Z_Options_level_2Segmentation 12
+#define Z_Options_concurrentOperations 13
+#define Z_Options_namedResultSets 14
+
+struct Z_SearchRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	int *smallSetUpperBound;
+	int *largeSetLowerBound;
+	int *mediumSetPresentNumber;
+	bool_t *replaceIndicator;
+	Z_InternationalString *resultSetName;
+	int num_databaseNames;
+	Z_DatabaseName **databaseNames;
+	Z_ElementSetNames *smallSetElementSetNames; /* OPT */
+	Z_ElementSetNames *mediumSetElementSetNames; /* OPT */
+	Odr_oid *preferredRecordSyntax; /* OPT */
+	Z_Query *query;
+	Z_OtherInformation *additionalSearchInfo; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_Query {
+	int which;
+	union {
+		void *type_0;
+		Z_RPNQuery *type_1;
+		Odr_oct *type_2;
+		Odr_oct *type_100;
+		Z_RPNQuery *type_101;
+		Odr_oct *type_102;
+#define Z_Query_type_0 1
+#define Z_Query_type_1 2
+#define Z_Query_type_2 3
+#define Z_Query_type_100 4
+#define Z_Query_type_101 5
+#define Z_Query_type_102 6
+	} u;
+};
+
+struct Z_RPNQuery {
+	Z_AttributeSetId *attributeSetId;
+	Z_RPNStructure *RPNStructure;
+};
+
+struct Z_Complex {
+	Z_RPNStructure *s1;
+	Z_RPNStructure *s2;
+	Z_Operator *roperator;
+};
+
+struct Z_RPNStructure {
+	int which;
+	union {
+		Z_Operand *simple;
+		Z_Complex *complex;
+#define Z_RPNStructure_simple 1
+#define Z_RPNStructure_complex 2
+	} u;
+};
+
+struct Z_Operand {
+	int which;
+	union {
+		Z_AttributesPlusTerm *attributesPlusTerm;
+		Z_ResultSetId *resultSetId;
+		Z_ResultSetPlusAttributes *resultAttr;
+#define Z_Operand_APT 1
+#define Z_Operand_resultSetId 2
+#define Z_Operand_resultAttr 3
+	} u;
+};
+
+struct Z_AttributesPlusTerm {
+	Z_AttributeList *attributes;
+	Z_Term *term;
+};
+
+struct Z_ResultSetPlusAttributes {
+	Z_ResultSetId *resultSet;
+	Z_AttributeList *attributes;
+};
+
+struct Z_AttributeList {
+	int num_attributes;
+	Z_AttributeElement **attributes;
+};
+
+struct Z_Term {
+	int which;
+	union {
+		Odr_oct *general;
+		int *numeric;
+		Z_InternationalString *characterString;
+		Odr_oid *oid;
+		char *dateTime;
+		Z_External *external;
+		Z_IntUnit *integerAndUnit;
+		Odr_null *null;
+#define Z_Term_general 1
+#define Z_Term_numeric 2
+#define Z_Term_characterString 3
+#define Z_Term_oid 4
+#define Z_Term_dateTime 5
+#define Z_Term_external 6
+#define Z_Term_integerAndUnit 7
+#define Z_Term_null 8
+	} u;
+};
+
+struct Z_Operator {
+	int which;
+	union {
+		Odr_null *and;
+		Odr_null *or;
+		Odr_null *and_not;
+		Z_ProximityOperator *prox;
+#define Z_Operator_and 1
+#define Z_Operator_or 2
+#define Z_Operator_and_not 3
+#define Z_Operator_prox 4
+	} u;
+};
+
+struct Z_ComplexAttribute {
+	int num_list;
+	Z_StringOrNumeric **list;
+	int num_semanticAction;
+	int **semanticAction; /* OPT */
+};
+
+struct Z_AttributeElement {
+	Z_AttributeSetId *attributeSet; /* OPT */
+	int *attributeType;
+	int which;
+	union {
+		int *numeric;
+		Z_ComplexAttribute *complex;
+#define Z_AttributeValue_numeric 1
+#define Z_AttributeValue_complex 2
+	} value;
+};
+
+struct Z_ProximityOperator {
+	bool_t *exclusion; /* OPT */
+	int *distance;
+	bool_t *ordered;
+#define Z_ProximityOperator_Prox_lessThan 1
+#define Z_ProximityOperator_Prox_lessThanOrEqual 2
+#define Z_ProximityOperator_Prox_equal 3
+#define Z_ProximityOperator_Prox_greaterThanOrEqual 4
+#define Z_ProximityOperator_Prox_greaterThan 5
+#define Z_ProximityOperator_Prox_notEqual 6
+	int *relationType;
+	int which;
+	union {
+		Z_ProxUnit *known;
+		int *zprivate;
+#define Z_ProximityOperator_known 1
+#define Z_ProximityOperator_private 2
+	} u;
+};
+
+#define Z_ProxUnit_character 1
+#define Z_ProxUnit_word 2
+#define Z_ProxUnit_sentence 3
+#define Z_ProxUnit_paragraph 4
+#define Z_ProxUnit_section 5
+#define Z_ProxUnit_chapter 6
+#define Z_ProxUnit_document 7
+#define Z_ProxUnit_element 8
+#define Z_ProxUnit_subelement 9
+#define Z_ProxUnit_elementType 10
+#define Z_ProxUnit_byte 11
+
+struct Z_SearchResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	int *resultCount;
+	int *numberOfRecordsReturned;
+	int *nextResultSetPosition;
+	bool_t *searchStatus;
+#define Z_SearchResponse_subset 1
+#define Z_SearchResponse_interim 2
+#define Z_SearchResponse_none 3
+	int *resultSetStatus; /* OPT */
+	Z_PresentStatus *presentStatus; /* OPT */
+	Z_Records *records; /* OPT */
+	Z_OtherInformation *additionalSearchInfo; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_RecordComposition {
+	int which;
+	union {
+		Z_ElementSetNames *simple;
+		Z_CompSpec *complex;
+#define Z_RecordComp_simple 1
+#define Z_RecordComp_complex 2
+	} u;
+};
+
+struct Z_PresentRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_ResultSetId *resultSetId;
+	int *resultSetStartPoint;
+	int *numberOfRecordsRequested;
+	int num_ranges;
+	Z_Range **additionalRanges; /* OPT */
+	Z_RecordComposition *recordComposition; /* OPT */
+	Odr_oid *preferredRecordSyntax; /* OPT */
+	int *maxSegmentCount; /* OPT */
+	int *maxRecordSize; /* OPT */
+	int *maxSegmentSize; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_Segment {
+	Z_ReferenceId *referenceId; /* OPT */
+	int *numberOfRecordsReturned;
+	int num_segmentRecords;
+	Z_NamePlusRecord **segmentRecords;
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_PresentResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	int *numberOfRecordsReturned;
+	int *nextResultSetPosition;
+	Z_PresentStatus *presentStatus;
+	Z_Records *records; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_NamePlusRecordList {
+	int num_records;
+	Z_NamePlusRecord **records;
+};
+
+struct Z_DiagRecs {
+	int num_diagRecs;
+	Z_DiagRec **diagRecs;
+};
+
+struct Z_Records {
+	int which;
+	union {
+		Z_NamePlusRecordList *databaseOrSurDiagnostics;
+		Z_DefaultDiagFormat *nonSurrogateDiagnostic;
+		Z_DiagRecs *multipleNonSurDiagnostics;
+#define Z_Records_DBOSD 1
+#define Z_Records_NSD 2
+#define Z_Records_multipleNSD 3
+	} u;
+};
+
+struct Z_NamePlusRecord {
+	Z_DatabaseName *databaseName; /* OPT */
+	int which;
+	union {
+		Z_External *databaseRecord;
+		Z_DiagRec *surrogateDiagnostic;
+		Z_FragmentSyntax *startingFragment;
+		Z_FragmentSyntax *intermediateFragment;
+		Z_FragmentSyntax *finalFragment;
+#define Z_NamePlusRecord_databaseRecord 1
+#define Z_NamePlusRecord_surrogateDiagnostic 2
+#define Z_NamePlusRecord_startingFragment 3
+#define Z_NamePlusRecord_intermediateFragment 4
+#define Z_NamePlusRecord_finalFragment 5
+	} u;
+};
+
+struct Z_FragmentSyntax {
+	int which;
+	union {
+		Z_External *externallyTagged;
+		Odr_oct *notExternallyTagged;
+#define Z_FragmentSyntax_externallyTagged 1
+#define Z_FragmentSyntax_notExternallyTagged 2
+	} u;
+};
+
+struct Z_DiagRec {
+	int which;
+	union {
+		Z_DefaultDiagFormat *defaultFormat;
+		Z_External *externallyDefined;
+#define Z_DiagRec_defaultFormat 1
+#define Z_DiagRec_externallyDefined 2
+	} u;
+};
+
+struct Z_DefaultDiagFormat {
+	Odr_oid *diagnosticSetId;
+	int *condition;
+	int which;
+	union {
+		char *v2Addinfo;
+		Z_InternationalString *v3Addinfo;
+#define Z_DefaultDiagFormat_v2Addinfo 1
+#define Z_DefaultDiagFormat_v3Addinfo 2
+	} u;
+};
+
+struct Z_Range {
+	int *startingPosition;
+	int *numberOfRecords;
+};
+
+struct Z_DatabaseSpecificUnit {
+	Z_DatabaseName *dbName;
+	Z_ElementSetName *esn;
+};
+
+struct Z_DatabaseSpecific {
+	int num;
+	Z_DatabaseSpecificUnit **elements;
+};
+
+struct Z_ElementSetNames {
+	int which;
+	union {
+		Z_InternationalString *generic;
+		Z_DatabaseSpecific *databaseSpecific;
+#define Z_ElementSetNames_generic 1
+#define Z_ElementSetNames_databaseSpecific 2
+	} u;
+};
+
+#define Z_PresentStatus_success 0
+#define Z_PresentStatus_partial_1 1
+#define Z_PresentStatus_partial_2 2
+#define Z_PresentStatus_partial_3 3
+#define Z_PresentStatus_partial_4 4
+#define Z_PresentStatus_failure 5
+
+struct Z_DbSpecific {
+	Z_DatabaseName *db;
+	Z_Specification *spec;
+};
+
+struct Z_CompSpec {
+	bool_t *selectAlternativeSyntax;
+	Z_Specification *generic; /* OPT */
+	int num_dbSpecific;
+	Z_DbSpecific **dbSpecific; /* OPT */
+	int num_recordSyntax;
+	Odr_oid **recordSyntax; /* OPT */
+};
+
+struct Z_ElementSpec {
+	int which;
+	union {
+		Z_InternationalString *elementSetName;
+		Z_External *externalSpec;
+#define Z_ElementSpec_elementSetName 1
+#define Z_ElementSpec_externalSpec 2
+	} u;
+};
+
+struct Z_Specification {
+	Odr_oid *schema; /* OPT */
+	Z_ElementSpec *elementSpec; /* OPT */
+};
+
+struct Z_DeleteResultSetRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_DeleteResultSetRequest_list 0
+#define Z_DeleteResultSetRequest_all 1
+	int *deleteFunction;
+	int num_resultSetList;
+	Z_ResultSetId **resultSetList; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_DeleteResultSetResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_DeleteStatus *deleteOperationStatus;
+	Z_ListStatuses *deleteListStatuses; /* OPT */
+	int *numberNotDeleted; /* OPT */
+	Z_ListStatuses *bulkStatuses; /* OPT */
+	Z_InternationalString *deleteMessage; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ListStatus {
+	Z_ResultSetId *id;
+	Z_DeleteStatus *status;
+};
+
+struct Z_ListStatuses {
+	int num;
+	Z_ListStatus **elements;
+};
+
+#define Z_DeleteStatus_success 0
+#define Z_DeleteStatus_resultSetDidNotExist 1
+#define Z_DeleteStatus_previouslyDeletedByTarget 2
+#define Z_DeleteStatus_systemProblemAtTarget 3
+#define Z_DeleteStatus_accessNotAllowed 4
+#define Z_DeleteStatus_resourceControlAtOrigin 5
+#define Z_DeleteStatus_resourceControlAtTarget 6
+#define Z_DeleteStatus_bulkDeleteNotSupported 7
+#define Z_DeleteStatus_notAllRsltSetsDeletedOnBulkDlte 8
+#define Z_DeleteStatus_notAllRequestedResultSetsDeleted 9
+#define Z_DeleteStatus_resultSetInUse 10
+
+struct Z_AccessControlRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	int which;
+	union {
+		Odr_oct *simpleForm;
+		Z_External *externallyDefined;
+#define Z_AccessControlRequest_simpleForm 1
+#define Z_AccessControlRequest_externallyDefined 2
+	} u;
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_AccessControlResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	int which;
+	union {
+		Odr_oct *simpleForm;
+		Z_External *externallyDefined;
+#define Z_AccessControlResponse_simpleForm 1
+#define Z_AccessControlResponse_externallyDefined 2
+	} u; /* OPT */
+	Z_DiagRec *diagnostic; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ResourceControlRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	bool_t *suspendedFlag; /* OPT */
+	Z_ResourceReport *resourceReport; /* OPT */
+#define Z_ResourceControlRequest_subset 1
+#define Z_ResourceControlRequest_interim 2
+#define Z_ResourceControlRequest_none 3
+	int *partialResultsAvailable; /* OPT */
+	bool_t *responseRequired;
+	bool_t *triggeredRequestFlag; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ResourceControlResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	bool_t *continueFlag;
+	bool_t *resultSetWanted; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_TriggerResourceControlRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_TriggerResourceControlRequest_resourceReport 1
+#define Z_TriggerResourceControlRequest_resourceControl 2
+#define Z_TriggerResourceControlRequest_cancel 3
+	int *requestedAction;
+	Z_ResourceReportId *prefResourceReportFormat; /* OPT */
+	bool_t *resultSetWanted; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ResourceReportRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_ReferenceId *opId; /* OPT */
+	Z_ResourceReportId *prefResourceReportFormat; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ResourceReportResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_ResourceReportResponse_success 0
+#define Z_ResourceReportResponse_partial 1
+#define Z_ResourceReportResponse_failure_1 2
+#define Z_ResourceReportResponse_failure_2 3
+#define Z_ResourceReportResponse_failure_3 4
+#define Z_ResourceReportResponse_failure_4 5
+#define Z_ResourceReportResponse_failure_5 6
+#define Z_ResourceReportResponse_failure_6 7
+	int *resourceReportStatus;
+	Z_ResourceReport *resourceReport; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+
+
+
+
+struct Z_ScanRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	int num_databaseNames;
+	Z_DatabaseName **databaseNames;
+	Z_AttributeSetId *attributeSet; /* OPT */
+	Z_AttributesPlusTerm *termListAndStartPoint;
+	int *stepSize; /* OPT */
+	int *numberOfTermsRequested;
+	int *preferredPositionInResponse; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ScanResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+	int *stepSize; /* OPT */
+#define Z_Scan_success 0
+#define Z_Scan_partial_1 1
+#define Z_Scan_partial_2 2
+#define Z_Scan_partial_3 3
+#define Z_Scan_partial_4 4
+#define Z_Scan_partial_5 5
+#define Z_Scan_failure 6
+	int *scanStatus;
+	int *numberOfEntriesReturned;
+	int *positionOfTerm; /* OPT */
+	Z_ListEntries *entries; /* OPT */
+	Z_AttributeSetId *attributeSet; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ListEntries {
+	int num_entries;
+	Z_Entry **entries; /* OPT */
+	int num_nonsurrogateDiagnostics;
+	Z_DiagRec **nonsurrogateDiagnostics; /* OPT */
+};
+
+struct Z_Entry {
+	int which;
+	union {
+		Z_TermInfo *termInfo;
+		Z_DiagRec *surrogateDiagnostic;
+#define Z_Entry_termInfo 1
+#define Z_Entry_surrogateDiagnostic 2
+	} u;
+};
+
+struct Z_TermInfo {
+	Z_Term *term;
+	Z_InternationalString *displayTerm; /* OPT */
+	Z_AttributeList *suggestedAttributes; /* OPT */
+	int num_alternativeTerm;
+	Z_AttributesPlusTerm **alternativeTerm; /* OPT */
+	int *globalOccurrences; /* OPT */
+	Z_OccurrenceByAttributes *byAttributes; /* OPT */
+	Z_OtherInformation *otherTermInfo; /* OPT */
+};
+
+struct Z_byDatabaseList_s {
+	Z_DatabaseName *db;
+	int *num; /* OPT */
+	Z_OtherInformation *otherDbInfo; /* OPT */
+};
+
+struct Z_byDatabaseList {
+	int num;
+	Z_byDatabaseList_s **elements;
+};
+
+struct Z_OccurrenceByAttributesElem {
+	Z_AttributeList *attributes;
+	int which;
+	union {
+		int *global;
+		Z_byDatabaseList *byDatabase;
+#define Z_OccurrenceByAttributesElem_global 1
+#define Z_OccurrenceByAttributesElem_byDatabase 2
+	} u; /* OPT */
+	Z_OtherInformation *otherOccurInfo; /* OPT */
+};
+
+struct Z_OccurrenceByAttributes {
+	int num;
+	Z_OccurrenceByAttributesElem **elements;
+};
+
+struct Z_SortKeySpecList {
+	int num_specs;
+	Z_SortKeySpec **specs;
+};
+
+struct Z_SortRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+	int num_inputResultSetNames;
+	Z_InternationalString **inputResultSetNames;
+	Z_InternationalString *sortedResultSetName;
+	Z_SortKeySpecList *sortSequence;
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_SortResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_SortResponse_success 0
+#define Z_SortResponse_partial_1 1
+#define Z_SortResponse_failure 2
+	int *sortStatus;
+#define Z_SortResponse_empty 1
+#define Z_SortResponse_interim 2
+#define Z_SortResponse_unchanged 3
+#define Z_SortResponse_none 4
+	int *resultSetStatus; /* OPT */
+	int num_diagnostics;
+	Z_DiagRec **diagnostics; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_SortKeySpec {
+	Z_SortElement *sortElement;
+#define Z_SortKeySpec_ascending 0
+#define Z_SortKeySpec_descending 1
+#define Z_SortKeySpec_ascendingByFrequency 3
+#define Z_SortKeySpec_descendingByfrequency 4
+	int *sortRelation;
+#define Z_SortKeySpec_caseSensitive 0
+#define Z_SortKeySpec_caseInsensitive 1
+	int *caseSensitivity;
+	int which;
+	union {
+		Odr_null *abort;
+		Odr_null *null;
+		Odr_oct *missingValueData;
+#define Z_SortKeySpec_abort 1
+#define Z_SortKeySpec_null 2
+#define Z_SortKeySpec_missingValueData 3
+	} u; /* OPT */
+};
+
+struct Z_SortDbSpecificList_s {
+	Z_DatabaseName *databaseName;
+	Z_SortKey *dbSort;
+};
+
+struct Z_SortDbSpecificList {
+	int num;
+	Z_SortDbSpecificList_s **elements;
+};
+
+struct Z_SortElement {
+	int which;
+	union {
+		Z_SortKey *generic;
+		Z_SortDbSpecificList *databaseSpecific;
+#define Z_SortElement_generic 1
+#define Z_SortElement_databaseSpecific 2
+	} u;
+};
+
+struct Z_SortAttributes {
+	Z_AttributeSetId *id;
+	Z_AttributeList *list;
+};
+
+struct Z_SortKey {
+	int which;
+	union {
+		Z_InternationalString *sortField;
+		Z_Specification *elementSpec;
+		Z_SortAttributes *sortAttributes;
+#define Z_SortKey_sortField 1
+#define Z_SortKey_elementSpec 2
+#define Z_SortKey_sortAttributes 3
+	} u;
+};
+
+struct Z_ExtendedServicesRequest {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_ExtendedServicesRequest_create 1
+#define Z_ExtendedServicesRequest_delete 2
+#define Z_ExtendedServicesRequest_modify 3
+	int *function;
+	Odr_oid *packageType;
+	Z_InternationalString *packageName; /* OPT */
+	Z_InternationalString *userId; /* OPT */
+	Z_IntUnit *retentionTime; /* OPT */
+	Z_Permissions *permissions; /* OPT */
+	Z_InternationalString *description; /* OPT */
+	Z_External *taskSpecificParameters; /* OPT */
+#define Z_ExtendedServicesRequest_wait 1
+#define Z_ExtendedServicesRequest_waitIfPossible 2
+#define Z_ExtendedServicesRequest_dontWait 3
+#define Z_ExtendedServicesRequest_dontReturnPackage 4
+	int *waitAction;
+	Z_ElementSetName *elements; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_ExtendedServicesResponse {
+	Z_ReferenceId *referenceId; /* OPT */
+#define Z_ExtendedServicesResponse_done 1
+#define Z_ExtendedServicesResponse_accepted 2
+#define Z_ExtendedServicesResponse_failure 3
+	int *operationStatus;
+	int num_diagnostics;
+	Z_DiagRec **diagnostics; /* OPT */
+	Z_External *taskPackage; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_Permissions_s {
+	Z_InternationalString *userId;
+#define Z_Permissions_s_delete 1
+#define Z_Permissions_s_modifyContents 2
+#define Z_Permissions_s_modifyPermissions 3
+#define Z_Permissions_s_present 4
+#define Z_Permissions_s_invoke 5
+	int num_allowableFunctions;
+	int **allowableFunctions;
+};
+
+struct Z_Permissions {
+	int num;
+	Z_Permissions_s **elements;
+};
+
+struct Z_Close {
+	Z_ReferenceId *referenceId; /* OPT */
+	Z_CloseReason *closeReason;
+	Z_InternationalString *diagnosticInformation; /* OPT */
+	Z_ResourceReportId *resourceReportFormat; /* OPT */
+	Z_ResourceReport *resourceReport; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+#define Z_Close_finished 0
+#define Z_Close_shutdown 1
+#define Z_Close_systemProblem 2
+#define Z_Close_costLimit 3
+#define Z_Close_resources 4
+#define Z_Close_securityViolation 5
+#define Z_Close_protocolError 6
+#define Z_Close_lackOfActivity 7
+#define Z_Close_peerAbort 8
+#define Z_Close_unspecified 9
+
+
+
+
+
+
+
+
+
+
+
+struct Z_OtherInformationUnit {
+	Z_InfoCategory *category; /* OPT */
+	int which;
+	union {
+		Z_InternationalString *characterInfo;
+		Odr_oct *binaryInfo;
+		Z_External *externallyDefinedInfo;
+		Odr_oid *oid;
+#define Z_OtherInfo_characterInfo 1
+#define Z_OtherInfo_binaryInfo 2
+#define Z_OtherInfo_externallyDefinedInfo 3
+#define Z_OtherInfo_oid 4
+	} information;
+};
+
+struct Z_OtherInformation {
+	int num_elements;
+	Z_OtherInformationUnit **list;
+};
+
+struct Z_InfoCategory {
+	Odr_oid *categoryTypeId; /* OPT */
+	int *categoryValue;
+};
+
+struct Z_IntUnit {
+	int *value;
+	Z_Unit *unitUsed;
+};
+
+struct Z_Unit {
+	Z_InternationalString *unitSystem; /* OPT */
+	Z_StringOrNumeric *unitType; /* OPT */
+	Z_StringOrNumeric *unit; /* OPT */
+	int *scaleFactor; /* OPT */
+};
+
+
+
+struct Z_StringOrNumeric {
+	int which;
+	union {
+		Z_InternationalString *string;
+		int *numeric;
+#define Z_StringOrNumeric_string 1
+#define Z_StringOrNumeric_numeric 2
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int z_ANY_type_0 (ODR o, void **p, int opt);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-date.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-date.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-date.h	(revision 21083)
@@ -0,0 +1,134 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H UserInfoFormat-dateTime */
+
+#ifndef z_date_H
+#define z_date_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_DateTime Z_DateTime;
+YAZ_EXPORT int z_DateTime (ODR o, Z_DateTime **p, int opt, const char *name);
+
+typedef struct Z_DateMonthAndDay Z_DateMonthAndDay;
+YAZ_EXPORT int z_DateMonthAndDay (ODR o, Z_DateMonthAndDay **p, int opt, const char *name);
+
+typedef struct Z_DateQuarter Z_DateQuarter;
+YAZ_EXPORT int z_DateQuarter (ODR o, Z_DateQuarter **p, int opt, const char *name);
+
+typedef struct Z_DateSeason Z_DateSeason;
+YAZ_EXPORT int z_DateSeason (ODR o, Z_DateSeason **p, int opt, const char *name);
+
+typedef struct Z_Era Z_Era;
+YAZ_EXPORT int z_Era (ODR o, Z_Era **p, int opt, const char *name);
+
+typedef struct Z_DateFlags Z_DateFlags;
+YAZ_EXPORT int z_DateFlags (ODR o, Z_DateFlags **p, int opt, const char *name);
+
+typedef struct Z_Date Z_Date;
+YAZ_EXPORT int z_Date (ODR o, Z_Date **p, int opt, const char *name);
+
+typedef struct Z_Time Z_Time;
+YAZ_EXPORT int z_Time (ODR o, Z_Time **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_DateTime {
+	Z_Date *date; /* OPT */
+	Z_Time *time; /* OPT */
+};
+
+struct Z_DateMonthAndDay {
+	int *month;
+	int *day; /* OPT */
+};
+
+struct Z_DateQuarter {
+	int which;
+	union {
+		Odr_null *first;
+		Odr_null *second;
+		Odr_null *third;
+		Odr_null *fourth;
+#define Z_DateQuarter_first 1
+#define Z_DateQuarter_second 2
+#define Z_DateQuarter_third 3
+#define Z_DateQuarter_fourth 4
+	} u;
+};
+
+struct Z_DateSeason {
+	int which;
+	union {
+		Odr_null *winter;
+		Odr_null *spring;
+		Odr_null *summer;
+		Odr_null *autumn;
+#define Z_DateSeason_winter 1
+#define Z_DateSeason_spring 2
+#define Z_DateSeason_summer 3
+#define Z_DateSeason_autumn 4
+	} u;
+};
+
+struct Z_Era {
+	int which;
+	union {
+		Odr_null *decade;
+		Odr_null *century;
+		Odr_null *millennium;
+#define Z_Era_decade 1
+#define Z_Era_century 2
+#define Z_Era_millennium 3
+	} u;
+};
+
+struct Z_DateFlags {
+	Odr_null *circa; /* OPT */
+	Z_Era *era; /* OPT */
+};
+
+struct Z_Date {
+	int *year;
+	int which;
+	union {
+		Z_DateMonthAndDay *monthAndDay;
+		int *julianDay;
+		int *weekNumber;
+		Z_DateQuarter *quarter;
+		Z_DateSeason *season;
+#define Z_Date_monthAndDay 1
+#define Z_Date_julianDay 2
+#define Z_Date_weekNumber 3
+#define Z_Date_quarter 4
+#define Z_Date_season 5
+	} u; /* OPT */
+	Z_DateFlags *flags; /* OPT */
+};
+
+struct Z_Time {
+	int *hour;
+	int *minute; /* OPT */
+	int *second; /* OPT */
+	Z_IntUnit *partOfSecond; /* OPT */
+	int which;
+	union {
+		Odr_null *local;
+		Odr_null *utc;
+		int *utcOffset;
+#define Z_Time_local 1
+#define Z_Time_utc 2
+#define Z_Time_utcOffset 3
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-diag1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-diag1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-diag1.h	(revision 21083)
@@ -0,0 +1,354 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H DiagnosticFormatDiag1 */
+
+#ifndef z_diag1_H
+#define z_diag1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_DiagnosticFormat_s Z_DiagnosticFormat_s;
+YAZ_EXPORT int z_DiagnosticFormat_s (ODR o, Z_DiagnosticFormat_s **p, int opt, const char *name);
+
+typedef struct Z_DiagnosticFormat Z_DiagnosticFormat;
+YAZ_EXPORT int z_DiagnosticFormat (ODR o, Z_DiagnosticFormat **p, int opt, const char *name);
+
+typedef struct Z_TooMany Z_TooMany;
+YAZ_EXPORT int z_TooMany (ODR o, Z_TooMany **p, int opt, const char *name);
+
+typedef struct Z_BadSpec Z_BadSpec;
+YAZ_EXPORT int z_BadSpec (ODR o, Z_BadSpec **p, int opt, const char *name);
+
+typedef struct Z_DbUnavail_0 Z_DbUnavail_0;
+YAZ_EXPORT int z_DbUnavail_0 (ODR o, Z_DbUnavail_0 **p, int opt, const char *name);
+
+typedef struct Z_DbUnavail Z_DbUnavail;
+YAZ_EXPORT int z_DbUnavail (ODR o, Z_DbUnavail **p, int opt, const char *name);
+
+typedef struct Z_Attribute Z_Attribute;
+YAZ_EXPORT int z_Attribute (ODR o, Z_Attribute **p, int opt, const char *name);
+
+typedef struct Z_AttCombo Z_AttCombo;
+YAZ_EXPORT int z_AttCombo (ODR o, Z_AttCombo **p, int opt, const char *name);
+
+typedef struct Z_DiagTerm Z_DiagTerm;
+YAZ_EXPORT int z_DiagTerm (ODR o, Z_DiagTerm **p, int opt, const char *name);
+
+typedef struct Z_Proximity Z_Proximity;
+YAZ_EXPORT int z_Proximity (ODR o, Z_Proximity **p, int opt, const char *name);
+
+typedef struct Z_AttrListList Z_AttrListList;
+YAZ_EXPORT int z_AttrListList (ODR o, Z_AttrListList **p, int opt, const char *name);
+
+typedef struct Z_Scan Z_Scan;
+YAZ_EXPORT int z_Scan (ODR o, Z_Scan **p, int opt, const char *name);
+
+typedef struct Z_StringList Z_StringList;
+YAZ_EXPORT int z_StringList (ODR o, Z_StringList **p, int opt, const char *name);
+
+typedef struct Z_Sort Z_Sort;
+YAZ_EXPORT int z_Sort (ODR o, Z_Sort **p, int opt, const char *name);
+
+typedef struct Z_Segmentation Z_Segmentation;
+YAZ_EXPORT int z_Segmentation (ODR o, Z_Segmentation **p, int opt, const char *name);
+
+typedef struct Z_ExtServices Z_ExtServices;
+YAZ_EXPORT int z_ExtServices (ODR o, Z_ExtServices **p, int opt, const char *name);
+
+typedef struct Z_OidList Z_OidList;
+YAZ_EXPORT int z_OidList (ODR o, Z_OidList **p, int opt, const char *name);
+
+typedef struct Z_AltOidList Z_AltOidList;
+YAZ_EXPORT int z_AltOidList (ODR o, Z_AltOidList **p, int opt, const char *name);
+
+typedef struct Z_AccessCtrl Z_AccessCtrl;
+YAZ_EXPORT int z_AccessCtrl (ODR o, Z_AccessCtrl **p, int opt, const char *name);
+
+typedef struct Z_RecordSyntax Z_RecordSyntax;
+YAZ_EXPORT int z_RecordSyntax (ODR o, Z_RecordSyntax **p, int opt, const char *name);
+
+typedef struct Z_DiagFormat Z_DiagFormat;
+YAZ_EXPORT int z_DiagFormat (ODR o, Z_DiagFormat **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_DiagnosticFormat_s {
+	int which;
+	union {
+		Z_DefaultDiagFormat *defaultDiagRec;
+		Z_DiagFormat *explicitDiagnostic;
+#define Z_DiagnosticFormat_s_defaultDiagRec 1
+#define Z_DiagnosticFormat_s_explicitDiagnostic 2
+	} u; /* OPT */
+	Z_InternationalString *message; /* OPT */
+};
+
+struct Z_DiagnosticFormat {
+	int num;
+	Z_DiagnosticFormat_s **elements;
+};
+
+struct Z_TooMany {
+#define Z_TooMany_argumentWords 1
+#define Z_TooMany_truncatedWords 2
+#define Z_TooMany_booleanOperators 3
+#define Z_TooMany_incompleteSubfields 4
+#define Z_TooMany_characters 5
+#define Z_TooMany_recordsRetrieved 6
+#define Z_TooMany_dataBasesSpecified 7
+#define Z_TooMany_resultSetsCreated 8
+#define Z_TooMany_indexTermsProcessed 9
+	int *tooManyWhat;
+	int *max; /* OPT */
+};
+
+struct Z_BadSpec {
+	Z_Specification *spec;
+	Z_DatabaseName *db; /* OPT */
+	int num_goodOnes;
+	Z_Specification **goodOnes; /* OPT */
+};
+
+struct Z_DbUnavail_0 {
+#define Z_DbUnavail_0_doesNotExist 0
+#define Z_DbUnavail_0_existsButUnavail 1
+#define Z_DbUnavail_0_locked 2
+#define Z_DbUnavail_0_accessDenied 3
+	int *reasonCode; /* OPT */
+	Z_InternationalString *message; /* OPT */
+};
+
+struct Z_DbUnavail {
+	Z_DatabaseName *db;
+	Z_DbUnavail_0 *why;
+};
+
+struct Z_Attribute {
+	Odr_oid *id;
+	int *type; /* OPT */
+	int *value; /* OPT */
+	Z_Term *term; /* OPT */
+};
+
+struct Z_AttCombo {
+	Z_AttributeList *unsupportedCombination;
+	int num_recommendedAlternatives;
+	Z_AttributeList **recommendedAlternatives; /* OPT */
+};
+
+struct Z_DiagTerm {
+#define Z_DiagTerm_codedValue 1
+#define Z_DiagTerm_unparsable 2
+#define Z_DiagTerm_tooShort 3
+#define Z_DiagTerm_type 4
+	int *problem; /* OPT */
+	Z_Term *term;
+};
+
+struct Z_Proximity {
+	int which;
+	union {
+		Odr_null *resultSets;
+		Z_InternationalString *badSet;
+		int *relation;
+		int *unit;
+		int *distance;
+		Z_AttributeList *attributes;
+		Odr_null *ordered;
+		Odr_null *exclusion;
+#define Z_Proximity_resultSets 1
+#define Z_Proximity_badSet 2
+#define Z_Proximity_relation 3
+#define Z_Proximity_unit 4
+#define Z_Proximity_distance 5
+#define Z_Proximity_attributes 6
+#define Z_Proximity_ordered 7
+#define Z_Proximity_exclusion 8
+	} u;
+};
+
+struct Z_AttrListList {
+	int num;
+	Z_AttributeList **elements;
+};
+
+struct Z_Scan {
+	int which;
+	union {
+		Odr_null *nonZeroStepSize;
+		Odr_null *specifiedStepSize;
+		Odr_null *termList1;
+		Z_AttrListList *termList2;
+#define Z_Scan_mustBeOne 1
+#define Z_Scan_mustBePositive 2
+#define Z_Scan_mustBeNonNegative 3
+#define Z_Scan_other 4
+		int *posInResponse;
+		Odr_null *resources;
+		Odr_null *endOfList;
+#define Z_Scan_nonZeroStepSize 1
+#define Z_Scan_specifiedStepSize 2
+#define Z_Scan_termList1 3
+#define Z_Scan_termList2 4
+#define Z_Scan_posInResponse 5
+#define Z_Scan_resources 6
+#define Z_Scan_endOfList 7
+	} u;
+};
+
+struct Z_StringList {
+	int num;
+	Z_InternationalString **elements;
+};
+
+struct Z_Sort {
+	int which;
+	union {
+		Odr_null *sequence;
+		Odr_null *noRsName;
+		int *tooMany;
+		Odr_null *incompatible;
+		Odr_null *generic;
+		Odr_null *dbSpecific;
+		Z_SortElement *sortElement;
+#define Z_Sort_tooMany 1
+#define Z_Sort_duplicate 2
+		int *key;
+		Odr_null *action;
+#define Z_Sort_relation 1
+#define Z_Sort_case 2
+#define Z_Sort_action 3
+#define Z_Sort_sort 4
+		int *illegal;
+		Z_StringList *inputTooLarge;
+		Odr_null *aggregateTooLarge;
+#define Z_SortD_sequence 1
+#define Z_SortD_noRsName 2
+#define Z_SortD_tooMany 3
+#define Z_SortD_incompatible 4
+#define Z_SortD_generic 5
+#define Z_SortD_dbSpecific 6
+#define Z_SortD_sortElement 7
+#define Z_SortD_key 8
+#define Z_SortD_action 9
+#define Z_SortD_illegal 10
+#define Z_SortD_inputTooLarge 11
+#define Z_SortD_aggregateTooLarge 12
+	} u;
+};
+
+struct Z_Segmentation {
+	int which;
+	union {
+		Odr_null *segmentCount;
+		int *segmentSize;
+#define Z_Segmentation_segmentCount 1
+#define Z_Segmentation_segmentSize 2
+	} u;
+};
+
+struct Z_ExtServices {
+	int which;
+	union {
+#define Z_ExtServices_nameInUse 1
+#define Z_ExtServices_noSuchName 2
+#define Z_ExtServices_quota 3
+#define Z_ExtServices_type 4
+		int *req;
+#define Z_ExtServices_id 1
+#define Z_ExtServices_modifyDelete 2
+		int *permission;
+#define Z_ExtServices_failed 1
+#define Z_ExtServices_service 2
+#define Z_ExtServices_parameters 3
+		int *immediate;
+#define Z_ExtServices_req 1
+#define Z_ExtServices_permission 2
+#define Z_ExtServices_immediate 3
+	} u;
+};
+
+struct Z_OidList {
+	int num;
+	Odr_oid **elements;
+};
+
+struct Z_AltOidList {
+	int num;
+	Odr_oid **elements;
+};
+
+struct Z_AccessCtrl {
+	int which;
+	union {
+		Odr_null *noUser;
+		Odr_null *refused;
+		Odr_null *simple;
+		Z_OidList *oid;
+		Z_AltOidList *alternative;
+		Odr_null *pwdInv;
+		Odr_null *pwdExp;
+#define Z_AccessCtrl_noUser 1
+#define Z_AccessCtrl_refused 2
+#define Z_AccessCtrl_simple 3
+#define Z_AccessCtrl_oid 4
+#define Z_AccessCtrl_alternative 5
+#define Z_AccessCtrl_pwdInv 6
+#define Z_AccessCtrl_pwdExp 7
+	} u;
+};
+
+struct Z_RecordSyntax {
+	Odr_oid *unsupportedSyntax;
+	int num_suggestedAlternatives;
+	Odr_oid **suggestedAlternatives; /* OPT */
+};
+
+struct Z_DiagFormat {
+	int which;
+	union {
+		Z_TooMany *tooMany;
+		Z_BadSpec *badSpec;
+		Z_DbUnavail *dbUnavail;
+#define Z_DiagFormat_and 0
+#define Z_DiagFormat_or 1
+#define Z_DiagFormat_and_not 2
+#define Z_DiagFormat_prox 3
+		int *unSupOp;
+		Z_Attribute *attribute;
+		Z_AttCombo *attCombo;
+		Z_DiagTerm *term;
+		Z_Proximity *proximity;
+		Z_Scan *scan;
+		Z_Sort *sort;
+		Z_Segmentation *segmentation;
+		Z_ExtServices *extServices;
+		Z_AccessCtrl *accessCtrl;
+		Z_RecordSyntax *recordSyntax;
+#define Z_DiagFormat_tooMany 1
+#define Z_DiagFormat_badSpec 2
+#define Z_DiagFormat_dbUnavail 3
+#define Z_DiagFormat_unSupOp 4
+#define Z_DiagFormat_attribute 5
+#define Z_DiagFormat_attCombo 6
+#define Z_DiagFormat_term 7
+#define Z_DiagFormat_proximity 8
+#define Z_DiagFormat_scan 9
+#define Z_DiagFormat_sort 10
+#define Z_DiagFormat_segmentation 11
+#define Z_DiagFormat_extServices 12
+#define Z_DiagFormat_accessCtrl 13
+#define Z_DiagFormat_recordSyntax 14
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-espec1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-espec1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-espec1.h	(revision 21083)
@@ -0,0 +1,142 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ElementSpecificationFormat-eSpec-1 */
+
+#ifndef z_espec1_H
+#define z_espec1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-grs.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_Espec1 Z_Espec1;
+YAZ_EXPORT int z_Espec1 (ODR o, Z_Espec1 **p, int opt, const char *name);
+
+typedef struct Z_ElementRequestCompositeElementPrimitives Z_ElementRequestCompositeElementPrimitives;
+YAZ_EXPORT int z_ElementRequestCompositeElementPrimitives (ODR o, Z_ElementRequestCompositeElementPrimitives **p, int opt, const char *name);
+
+typedef struct Z_ElementRequestCompositeElementSpecs Z_ElementRequestCompositeElementSpecs;
+YAZ_EXPORT int z_ElementRequestCompositeElementSpecs (ODR o, Z_ElementRequestCompositeElementSpecs **p, int opt, const char *name);
+
+typedef struct Z_ElementRequestCompositeElement Z_ElementRequestCompositeElement;
+YAZ_EXPORT int z_ElementRequestCompositeElement (ODR o, Z_ElementRequestCompositeElement **p, int opt, const char *name);
+
+typedef struct Z_ElementRequest Z_ElementRequest;
+YAZ_EXPORT int z_ElementRequest (ODR o, Z_ElementRequest **p, int opt, const char *name);
+
+typedef struct Z_SimpleElement Z_SimpleElement;
+YAZ_EXPORT int z_SimpleElement (ODR o, Z_SimpleElement **p, int opt, const char *name);
+
+typedef struct Z_SpecificTag Z_SpecificTag;
+YAZ_EXPORT int z_SpecificTag (ODR o, Z_SpecificTag **p, int opt, const char *name);
+
+typedef struct Z_ETagUnit Z_ETagUnit;
+YAZ_EXPORT int z_ETagUnit (ODR o, Z_ETagUnit **p, int opt, const char *name);
+
+typedef struct Z_ETagPath Z_ETagPath;
+YAZ_EXPORT int z_ETagPath (ODR o, Z_ETagPath **p, int opt, const char *name);
+
+typedef struct Z_OccurValues Z_OccurValues;
+YAZ_EXPORT int z_OccurValues (ODR o, Z_OccurValues **p, int opt, const char *name);
+
+typedef struct Z_Occurrences Z_Occurrences;
+YAZ_EXPORT int z_Occurrences (ODR o, Z_Occurrences **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_Espec1 {
+	int num_elementSetNames;
+	Z_InternationalString **elementSetNames; /* OPT */
+	Odr_oid *defaultVariantSetId; /* OPT */
+	Z_Variant *defaultVariantRequest; /* OPT */
+	int *defaultTagType; /* OPT */
+	int num_elements;
+	Z_ElementRequest **elements; /* OPT */
+};
+
+struct Z_ElementRequestCompositeElementPrimitives {
+	int num;
+	Z_InternationalString **elements;
+};
+
+struct Z_ElementRequestCompositeElementSpecs {
+	int num;
+	Z_SimpleElement **elements;
+};
+
+struct Z_ElementRequestCompositeElement {
+	int which;
+	union {
+		Z_ElementRequestCompositeElementPrimitives *primitives;
+		Z_ElementRequestCompositeElementSpecs *specs;
+#define Z_ElementRequestCompositeElement_primitives 1
+#define Z_ElementRequestCompositeElement_specs 2
+	} u;
+	Z_ETagPath *deliveryTag;
+	Z_Variant *variantRequest; /* OPT */
+};
+
+struct Z_ElementRequest {
+	int which;
+	union {
+		Z_SimpleElement *simpleElement;
+		Z_ElementRequestCompositeElement *compositeElement;
+#define Z_ERequest_simpleElement 1
+#define Z_ERequest_compositeElement 2
+	} u;
+};
+
+struct Z_SimpleElement {
+	Z_ETagPath *path;
+	Z_Variant *variantRequest; /* OPT */
+};
+
+struct Z_SpecificTag {
+	int *tagType; /* OPT */
+	Z_StringOrNumeric *tagValue;
+	Z_Occurrences *occurrences; /* OPT */
+};
+
+struct Z_ETagUnit {
+	int which;
+	union {
+		Z_SpecificTag *specificTag;
+		Z_Occurrences *wildThing;
+		Odr_null *wildPath;
+#define Z_ETagUnit_specificTag 1
+#define Z_ETagUnit_wildThing 2
+#define Z_ETagUnit_wildPath 3
+	} u;
+};
+
+struct Z_ETagPath {
+	int num_tags;
+	Z_ETagUnit **tags;
+};
+
+struct Z_OccurValues {
+	int *start;
+	int *howMany; /* OPT */
+};
+
+struct Z_Occurrences {
+	int which;
+	union {
+		Odr_null *all;
+		Odr_null *last;
+		Z_OccurValues *values;
+#define Z_Occurrences_all 1
+#define Z_Occurrences_last 2
+#define Z_Occurrences_values 3
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-estask.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-estask.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-estask.h	(revision 21083)
@@ -0,0 +1,43 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-ESTaskPackage */
+
+#ifndef z_estask_H
+#define z_estask_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_TaskPackage Z_TaskPackage;
+YAZ_EXPORT int z_TaskPackage (ODR o, Z_TaskPackage **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_TaskPackage {
+	Odr_oid *packageType;
+	Z_InternationalString *packageName; /* OPT */
+	Z_InternationalString *userId; /* OPT */
+	Z_IntUnit *retentionTime; /* OPT */
+	Z_Permissions *permissions; /* OPT */
+	Z_InternationalString *description; /* OPT */
+	Odr_oct *targetReference; /* OPT */
+	char *creationDateTime; /* OPT */
+#define Z_TaskPackage_pending 0
+#define Z_TaskPackage_active 1
+#define Z_TaskPackage_complete 2
+#define Z_TaskPackage_aborted 3
+	int *taskStatus;
+	int num_packageDiagnostics;
+	Z_DiagRec **packageDiagnostics; /* OPT */
+	Z_External *taskSpecificParameters;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-exp.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-exp.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-exp.h	(revision 21083)
@@ -0,0 +1,1012 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-explain */
+
+#ifndef z_exp_H
+#define z_exp_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_ExplainRecord Z_ExplainRecord;
+YAZ_EXPORT int z_ExplainRecord (ODR o, Z_ExplainRecord **p, int opt, const char *name);
+
+typedef struct Z_TargetInfo Z_TargetInfo;
+YAZ_EXPORT int z_TargetInfo (ODR o, Z_TargetInfo **p, int opt, const char *name);
+
+typedef struct Z_DatabaseInfo Z_DatabaseInfo;
+YAZ_EXPORT int z_DatabaseInfo (ODR o, Z_DatabaseInfo **p, int opt, const char *name);
+
+typedef struct Z_TagTypeMapping Z_TagTypeMapping;
+YAZ_EXPORT int z_TagTypeMapping (ODR o, Z_TagTypeMapping **p, int opt, const char *name);
+
+typedef struct Z_SchemaInfo Z_SchemaInfo;
+YAZ_EXPORT int z_SchemaInfo (ODR o, Z_SchemaInfo **p, int opt, const char *name);
+
+typedef struct Z_ElementInfo Z_ElementInfo;
+YAZ_EXPORT int z_ElementInfo (ODR o, Z_ElementInfo **p, int opt, const char *name);
+
+typedef struct Z_PathUnit Z_PathUnit;
+YAZ_EXPORT int z_PathUnit (ODR o, Z_PathUnit **p, int opt, const char *name);
+
+typedef struct Z_Path Z_Path;
+YAZ_EXPORT int z_Path (ODR o, Z_Path **p, int opt, const char *name);
+
+typedef struct Z_ElementInfoList Z_ElementInfoList;
+YAZ_EXPORT int z_ElementInfoList (ODR o, Z_ElementInfoList **p, int opt, const char *name);
+
+typedef struct Z_ElementDataType Z_ElementDataType;
+YAZ_EXPORT int z_ElementDataType (ODR o, Z_ElementDataType **p, int opt, const char *name);
+
+typedef int  Z_PrimitiveDataType;
+YAZ_EXPORT int z_PrimitiveDataType (ODR o, Z_PrimitiveDataType **p, int opt, const char *name);
+
+typedef struct Z_TagSetElements Z_TagSetElements;
+YAZ_EXPORT int z_TagSetElements (ODR o, Z_TagSetElements **p, int opt, const char *name);
+
+typedef struct Z_TagSetInfo Z_TagSetInfo;
+YAZ_EXPORT int z_TagSetInfo (ODR o, Z_TagSetInfo **p, int opt, const char *name);
+
+typedef struct Z_RecordSyntaxInfo Z_RecordSyntaxInfo;
+YAZ_EXPORT int z_RecordSyntaxInfo (ODR o, Z_RecordSyntaxInfo **p, int opt, const char *name);
+
+typedef struct Z_AttributeSetInfo Z_AttributeSetInfo;
+YAZ_EXPORT int z_AttributeSetInfo (ODR o, Z_AttributeSetInfo **p, int opt, const char *name);
+
+typedef struct Z_AttributeType Z_AttributeType;
+YAZ_EXPORT int z_AttributeType (ODR o, Z_AttributeType **p, int opt, const char *name);
+
+typedef struct Z_AttributeDescription Z_AttributeDescription;
+YAZ_EXPORT int z_AttributeDescription (ODR o, Z_AttributeDescription **p, int opt, const char *name);
+
+typedef struct Z_TermListElement Z_TermListElement;
+YAZ_EXPORT int z_TermListElement (ODR o, Z_TermListElement **p, int opt, const char *name);
+
+typedef struct Z_TermListInfo Z_TermListInfo;
+YAZ_EXPORT int z_TermListInfo (ODR o, Z_TermListInfo **p, int opt, const char *name);
+
+typedef struct Z_ExtendedServicesInfo Z_ExtendedServicesInfo;
+YAZ_EXPORT int z_ExtendedServicesInfo (ODR o, Z_ExtendedServicesInfo **p, int opt, const char *name);
+
+typedef struct Z_AttributeDetails Z_AttributeDetails;
+YAZ_EXPORT int z_AttributeDetails (ODR o, Z_AttributeDetails **p, int opt, const char *name);
+
+typedef struct Z_AttributeSetDetails Z_AttributeSetDetails;
+YAZ_EXPORT int z_AttributeSetDetails (ODR o, Z_AttributeSetDetails **p, int opt, const char *name);
+
+typedef struct Z_AttributeTypeDetails Z_AttributeTypeDetails;
+YAZ_EXPORT int z_AttributeTypeDetails (ODR o, Z_AttributeTypeDetails **p, int opt, const char *name);
+
+typedef struct Z_OmittedAttributeInterpretation Z_OmittedAttributeInterpretation;
+YAZ_EXPORT int z_OmittedAttributeInterpretation (ODR o, Z_OmittedAttributeInterpretation **p, int opt, const char *name);
+
+typedef struct Z_AttributeValue Z_AttributeValue;
+YAZ_EXPORT int z_AttributeValue (ODR o, Z_AttributeValue **p, int opt, const char *name);
+
+typedef struct Z_EScanInfo Z_EScanInfo;
+YAZ_EXPORT int z_EScanInfo (ODR o, Z_EScanInfo **p, int opt, const char *name);
+
+typedef struct Z_TermListDetails Z_TermListDetails;
+YAZ_EXPORT int z_TermListDetails (ODR o, Z_TermListDetails **p, int opt, const char *name);
+
+typedef struct Z_ElementSetDetails Z_ElementSetDetails;
+YAZ_EXPORT int z_ElementSetDetails (ODR o, Z_ElementSetDetails **p, int opt, const char *name);
+
+typedef struct Z_RetrievalRecordDetails Z_RetrievalRecordDetails;
+YAZ_EXPORT int z_RetrievalRecordDetails (ODR o, Z_RetrievalRecordDetails **p, int opt, const char *name);
+
+typedef struct Z_PerElementDetails Z_PerElementDetails;
+YAZ_EXPORT int z_PerElementDetails (ODR o, Z_PerElementDetails **p, int opt, const char *name);
+
+typedef struct Z_RecordTag Z_RecordTag;
+YAZ_EXPORT int z_RecordTag (ODR o, Z_RecordTag **p, int opt, const char *name);
+
+typedef struct Z_SortDetails Z_SortDetails;
+YAZ_EXPORT int z_SortDetails (ODR o, Z_SortDetails **p, int opt, const char *name);
+
+typedef struct Z_SortKeyDetails Z_SortKeyDetails;
+YAZ_EXPORT int z_SortKeyDetails (ODR o, Z_SortKeyDetails **p, int opt, const char *name);
+
+typedef struct Z_ProcessingInformation Z_ProcessingInformation;
+YAZ_EXPORT int z_ProcessingInformation (ODR o, Z_ProcessingInformation **p, int opt, const char *name);
+
+typedef struct Z_VariantSetInfo Z_VariantSetInfo;
+YAZ_EXPORT int z_VariantSetInfo (ODR o, Z_VariantSetInfo **p, int opt, const char *name);
+
+typedef struct Z_VariantClass Z_VariantClass;
+YAZ_EXPORT int z_VariantClass (ODR o, Z_VariantClass **p, int opt, const char *name);
+
+typedef struct Z_VariantType Z_VariantType;
+YAZ_EXPORT int z_VariantType (ODR o, Z_VariantType **p, int opt, const char *name);
+
+typedef struct Z_VariantValue Z_VariantValue;
+YAZ_EXPORT int z_VariantValue (ODR o, Z_VariantValue **p, int opt, const char *name);
+
+typedef struct Z_ValueSetEnumerated Z_ValueSetEnumerated;
+YAZ_EXPORT int z_ValueSetEnumerated (ODR o, Z_ValueSetEnumerated **p, int opt, const char *name);
+
+typedef struct Z_ValueSet Z_ValueSet;
+YAZ_EXPORT int z_ValueSet (ODR o, Z_ValueSet **p, int opt, const char *name);
+
+typedef struct Z_ValueRange Z_ValueRange;
+YAZ_EXPORT int z_ValueRange (ODR o, Z_ValueRange **p, int opt, const char *name);
+
+typedef struct Z_ValueDescription Z_ValueDescription;
+YAZ_EXPORT int z_ValueDescription (ODR o, Z_ValueDescription **p, int opt, const char *name);
+
+typedef struct Z_UnitInfo Z_UnitInfo;
+YAZ_EXPORT int z_UnitInfo (ODR o, Z_UnitInfo **p, int opt, const char *name);
+
+typedef struct Z_UnitType Z_UnitType;
+YAZ_EXPORT int z_UnitType (ODR o, Z_UnitType **p, int opt, const char *name);
+
+typedef struct Z_Units Z_Units;
+YAZ_EXPORT int z_Units (ODR o, Z_Units **p, int opt, const char *name);
+
+typedef struct Z_CategoryList Z_CategoryList;
+YAZ_EXPORT int z_CategoryList (ODR o, Z_CategoryList **p, int opt, const char *name);
+
+typedef struct Z_CategoryInfo Z_CategoryInfo;
+YAZ_EXPORT int z_CategoryInfo (ODR o, Z_CategoryInfo **p, int opt, const char *name);
+
+typedef struct Z_CommonInfo Z_CommonInfo;
+YAZ_EXPORT int z_CommonInfo (ODR o, Z_CommonInfo **p, int opt, const char *name);
+
+typedef struct Z_HumanStringUnit Z_HumanStringUnit;
+YAZ_EXPORT int z_HumanStringUnit (ODR o, Z_HumanStringUnit **p, int opt, const char *name);
+
+typedef struct Z_HumanString Z_HumanString;
+YAZ_EXPORT int z_HumanString (ODR o, Z_HumanString **p, int opt, const char *name);
+
+typedef struct Z_IconObjectUnit Z_IconObjectUnit;
+YAZ_EXPORT int z_IconObjectUnit (ODR o, Z_IconObjectUnit **p, int opt, const char *name);
+
+typedef struct Z_IconObject Z_IconObject;
+YAZ_EXPORT int z_IconObject (ODR o, Z_IconObject **p, int opt, const char *name);
+
+typedef Z_InternationalString  Z_LanguageCode;
+YAZ_EXPORT int z_LanguageCode (ODR o, Z_LanguageCode **p, int opt, const char *name);
+
+typedef struct Z_ContactInfo Z_ContactInfo;
+YAZ_EXPORT int z_ContactInfo (ODR o, Z_ContactInfo **p, int opt, const char *name);
+
+typedef struct Z_NetworkAddressIA Z_NetworkAddressIA;
+YAZ_EXPORT int z_NetworkAddressIA (ODR o, Z_NetworkAddressIA **p, int opt, const char *name);
+
+typedef struct Z_NetworkAddressOPA Z_NetworkAddressOPA;
+YAZ_EXPORT int z_NetworkAddressOPA (ODR o, Z_NetworkAddressOPA **p, int opt, const char *name);
+
+typedef struct Z_NetworkAddressOther Z_NetworkAddressOther;
+YAZ_EXPORT int z_NetworkAddressOther (ODR o, Z_NetworkAddressOther **p, int opt, const char *name);
+
+typedef struct Z_NetworkAddress Z_NetworkAddress;
+YAZ_EXPORT int z_NetworkAddress (ODR o, Z_NetworkAddress **p, int opt, const char *name);
+
+typedef struct Z_AccessInfo Z_AccessInfo;
+YAZ_EXPORT int z_AccessInfo (ODR o, Z_AccessInfo **p, int opt, const char *name);
+
+typedef struct Z_QueryTypeDetails Z_QueryTypeDetails;
+YAZ_EXPORT int z_QueryTypeDetails (ODR o, Z_QueryTypeDetails **p, int opt, const char *name);
+
+typedef struct Z_PrivateCapOperator Z_PrivateCapOperator;
+YAZ_EXPORT int z_PrivateCapOperator (ODR o, Z_PrivateCapOperator **p, int opt, const char *name);
+
+typedef struct Z_PrivateCapabilities Z_PrivateCapabilities;
+YAZ_EXPORT int z_PrivateCapabilities (ODR o, Z_PrivateCapabilities **p, int opt, const char *name);
+
+typedef struct Z_RpnCapabilities Z_RpnCapabilities;
+YAZ_EXPORT int z_RpnCapabilities (ODR o, Z_RpnCapabilities **p, int opt, const char *name);
+
+typedef struct Z_Iso8777Capabilities Z_Iso8777Capabilities;
+YAZ_EXPORT int z_Iso8777Capabilities (ODR o, Z_Iso8777Capabilities **p, int opt, const char *name);
+
+typedef struct Z_ProxSupportPrivate Z_ProxSupportPrivate;
+YAZ_EXPORT int z_ProxSupportPrivate (ODR o, Z_ProxSupportPrivate **p, int opt, const char *name);
+
+typedef struct Z_ProxSupportUnit Z_ProxSupportUnit;
+YAZ_EXPORT int z_ProxSupportUnit (ODR o, Z_ProxSupportUnit **p, int opt, const char *name);
+
+typedef struct Z_ProximitySupport Z_ProximitySupport;
+YAZ_EXPORT int z_ProximitySupport (ODR o, Z_ProximitySupport **p, int opt, const char *name);
+
+typedef struct Z_SearchKey Z_SearchKey;
+YAZ_EXPORT int z_SearchKey (ODR o, Z_SearchKey **p, int opt, const char *name);
+
+typedef struct Z_AccessRestrictionsUnit Z_AccessRestrictionsUnit;
+YAZ_EXPORT int z_AccessRestrictionsUnit (ODR o, Z_AccessRestrictionsUnit **p, int opt, const char *name);
+
+typedef struct Z_AccessRestrictions Z_AccessRestrictions;
+YAZ_EXPORT int z_AccessRestrictions (ODR o, Z_AccessRestrictions **p, int opt, const char *name);
+
+typedef struct Z_CostsOtherCharge Z_CostsOtherCharge;
+YAZ_EXPORT int z_CostsOtherCharge (ODR o, Z_CostsOtherCharge **p, int opt, const char *name);
+
+typedef struct Z_Costs Z_Costs;
+YAZ_EXPORT int z_Costs (ODR o, Z_Costs **p, int opt, const char *name);
+
+typedef struct Z_Charge Z_Charge;
+YAZ_EXPORT int z_Charge (ODR o, Z_Charge **p, int opt, const char *name);
+
+typedef struct Z_DatabaseList Z_DatabaseList;
+YAZ_EXPORT int z_DatabaseList (ODR o, Z_DatabaseList **p, int opt, const char *name);
+
+typedef struct Z_AttributeCombinations Z_AttributeCombinations;
+YAZ_EXPORT int z_AttributeCombinations (ODR o, Z_AttributeCombinations **p, int opt, const char *name);
+
+typedef struct Z_AttributeCombination Z_AttributeCombination;
+YAZ_EXPORT int z_AttributeCombination (ODR o, Z_AttributeCombination **p, int opt, const char *name);
+
+typedef struct Z_AttributeValueList Z_AttributeValueList;
+YAZ_EXPORT int z_AttributeValueList (ODR o, Z_AttributeValueList **p, int opt, const char *name);
+
+typedef struct Z_AttributeOccurrence Z_AttributeOccurrence;
+YAZ_EXPORT int z_AttributeOccurrence (ODR o, Z_AttributeOccurrence **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_ExplainRecord {
+	int which;
+	union {
+		Z_TargetInfo *targetInfo;
+		Z_DatabaseInfo *databaseInfo;
+		Z_SchemaInfo *schemaInfo;
+		Z_TagSetInfo *tagSetInfo;
+		Z_RecordSyntaxInfo *recordSyntaxInfo;
+		Z_AttributeSetInfo *attributeSetInfo;
+		Z_TermListInfo *termListInfo;
+		Z_ExtendedServicesInfo *extendedServicesInfo;
+		Z_AttributeDetails *attributeDetails;
+		Z_TermListDetails *termListDetails;
+		Z_ElementSetDetails *elementSetDetails;
+		Z_RetrievalRecordDetails *retrievalRecordDetails;
+		Z_SortDetails *sortDetails;
+		Z_ProcessingInformation *processing;
+		Z_VariantSetInfo *variants;
+		Z_UnitInfo *units;
+		Z_CategoryList *categoryList;
+#define Z_Explain_targetInfo 1
+#define Z_Explain_databaseInfo 2
+#define Z_Explain_schemaInfo 3
+#define Z_Explain_tagSetInfo 4
+#define Z_Explain_recordSyntaxInfo 5
+#define Z_Explain_attributeSetInfo 6
+#define Z_Explain_termListInfo 7
+#define Z_Explain_extendedServicesInfo 8
+#define Z_Explain_attributeDetails 9
+#define Z_Explain_termListDetails 10
+#define Z_Explain_elementSetDetails 11
+#define Z_Explain_retrievalRecordDetails 12
+#define Z_Explain_sortDetails 13
+#define Z_Explain_processing 14
+#define Z_Explain_variants 15
+#define Z_Explain_units 16
+#define Z_Explain_categoryList 17
+	} u;
+};
+
+struct Z_TargetInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_InternationalString *name;
+	Z_HumanString *recentNews; /* OPT */
+	Z_IconObject *icon; /* OPT */
+	bool_t *namedResultSets;
+	bool_t *multipleDBsearch;
+	int *maxResultSets; /* OPT */
+	int *maxResultSize; /* OPT */
+	int *maxTerms; /* OPT */
+	Z_IntUnit *timeoutInterval; /* OPT */
+	Z_HumanString *welcomeMessage; /* OPT */
+	Z_ContactInfo *contactInfo; /* OPT */
+	Z_HumanString *description; /* OPT */
+	int num_nicknames;
+	Z_InternationalString **nicknames; /* OPT */
+	Z_HumanString *usageRest; /* OPT */
+	Z_HumanString *paymentAddr; /* OPT */
+	Z_HumanString *hours; /* OPT */
+	int num_dbCombinations;
+	Z_DatabaseList **dbCombinations; /* OPT */
+	int num_addresses;
+	Z_NetworkAddress **addresses; /* OPT */
+	int num_languages;
+	Z_InternationalString **languages; /* OPT */
+	Z_AccessInfo *commonAccessInfo; /* OPT */
+};
+
+struct Z_DatabaseInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *name;
+	Odr_null *explainDatabase; /* OPT */
+	int num_nicknames;
+	Z_DatabaseName **nicknames; /* OPT */
+	Z_IconObject *icon; /* OPT */
+	bool_t *userFee;
+	bool_t *available;
+	Z_HumanString *titleString; /* OPT */
+	int num_keywords;
+	Z_HumanString **keywords; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_DatabaseList *associatedDbs; /* OPT */
+	Z_DatabaseList *subDbs; /* OPT */
+	Z_HumanString *disclaimers; /* OPT */
+	Z_HumanString *news; /* OPT */
+	int which;
+	union {
+		int *actualNumber;
+		int *approxNumber;
+#define Z_DatabaseInfo_actualNumber 1
+#define Z_DatabaseInfo_approxNumber 2
+	} u; /* OPT */
+	Z_HumanString *defaultOrder; /* OPT */
+	int *avRecordSize; /* OPT */
+	int *maxRecordSize; /* OPT */
+	Z_HumanString *hours; /* OPT */
+	Z_HumanString *bestTime; /* OPT */
+	char *lastUpdate; /* OPT */
+	Z_IntUnit *updateInterval; /* OPT */
+	Z_HumanString *coverage; /* OPT */
+	bool_t *proprietary; /* OPT */
+	Z_HumanString *copyrightText; /* OPT */
+	Z_HumanString *copyrightNotice; /* OPT */
+	Z_ContactInfo *producerContactInfo; /* OPT */
+	Z_ContactInfo *supplierContactInfo; /* OPT */
+	Z_ContactInfo *submissionContactInfo; /* OPT */
+	Z_AccessInfo *accessInfo; /* OPT */
+};
+
+struct Z_TagTypeMapping {
+	int *tagType;
+	Odr_oid *tagSet; /* OPT */
+	Odr_null *defaultTagType; /* OPT */
+};
+
+struct Z_SchemaInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Odr_oid *schema;
+	Z_InternationalString *name;
+	Z_HumanString *description; /* OPT */
+	int num_tagTypeMapping;
+	Z_TagTypeMapping **tagTypeMapping; /* OPT */
+	int num_recordStructure;
+	Z_ElementInfo **recordStructure; /* OPT */
+};
+
+struct Z_ElementInfo {
+	Z_InternationalString *elementName;
+	Z_Path *elementTagPath;
+	Z_ElementDataType *dataType; /* OPT */
+	bool_t *required;
+	bool_t *repeatable;
+	Z_HumanString *description; /* OPT */
+};
+
+struct Z_PathUnit {
+	int *tagType;
+	Z_StringOrNumeric *tagValue;
+};
+
+struct Z_Path {
+	int num;
+	Z_PathUnit **elements;
+};
+
+struct Z_ElementInfoList {
+	int num;
+	Z_ElementInfo **elements;
+};
+
+struct Z_ElementDataType {
+	int which;
+	union {
+		Z_PrimitiveDataType *primitive;
+		Z_ElementInfoList *structured;
+#define Z_ElementDataType_primitive 1
+#define Z_ElementDataType_structured 2
+	} u;
+};
+
+#define Z_PrimitiveDataType_octetString 0
+#define Z_PrimitiveDataType_numeric 1
+#define Z_PrimitiveDataType_date 2
+#define Z_PrimitiveDataType_external 3
+#define Z_PrimitiveDataType_string 4
+#define Z_PrimitiveDataType_trueOrFalse 5
+#define Z_PrimitiveDataType_oid 6
+#define Z_PrimitiveDataType_intUnit 7
+#define Z_PrimitiveDataType_empty 8
+#define Z_PrimitiveDataType_noneOfTheAbove 100
+
+struct Z_TagSetElements {
+	Z_InternationalString *elementname;
+	int num_nicknames;
+	Z_InternationalString **nicknames; /* OPT */
+	Z_StringOrNumeric *elementTag;
+	Z_HumanString *description; /* OPT */
+	Z_PrimitiveDataType *dataType; /* OPT */
+	Z_OtherInformation *otherTagInfo; /* OPT */
+};
+
+struct Z_TagSetInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Odr_oid *tagSet;
+	Z_InternationalString *name;
+	Z_HumanString *description; /* OPT */
+	int num_elements;
+	Z_TagSetElements **elements; /* OPT */
+};
+
+struct Z_RecordSyntaxInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Odr_oid *recordSyntax;
+	Z_InternationalString *name;
+	int num_transferSyntaxes;
+	Odr_oid **transferSyntaxes; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_InternationalString *asn1Module; /* OPT */
+	int num_abstractStructure;
+	Z_ElementInfo **abstractStructure; /* OPT */
+};
+
+struct Z_AttributeSetInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_AttributeSetId *attributeSet;
+	Z_InternationalString *name;
+	int num_attributes;
+	Z_AttributeType **attributes; /* OPT */
+	Z_HumanString *description; /* OPT */
+};
+
+struct Z_AttributeType {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	int *attributeType;
+	int num_attributeValues;
+	Z_AttributeDescription **attributeValues;
+};
+
+struct Z_AttributeDescription {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_StringOrNumeric *attributeValue;
+	int num_equivalentAttributes;
+	Z_StringOrNumeric **equivalentAttributes; /* OPT */
+};
+
+struct Z_TermListElement {
+	Z_InternationalString *name;
+	Z_HumanString *title; /* OPT */
+#define Z_TermListElement_optimized 0
+#define Z_TermListElement_normal 1
+#define Z_TermListElement_expensive 2
+#define Z_TermListElement_filter 3
+	int *searchCost; /* OPT */
+	bool_t *scanable;
+	int num_broader;
+	Z_InternationalString **broader; /* OPT */
+	int num_narrower;
+	Z_InternationalString **narrower; /* OPT */
+};
+
+struct Z_TermListInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+	int num_termLists;
+	Z_TermListElement **termLists;
+};
+
+struct Z_ExtendedServicesInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Odr_oid *type;
+	Z_InternationalString *name; /* OPT */
+	bool_t *privateType;
+	bool_t *restrictionsApply;
+	bool_t *feeApply;
+	bool_t *available;
+	bool_t *retentionSupported;
+#define Z_ExtendedServicesInfo_waitSupported 1
+#define Z_ExtendedServicesInfo_waitAlways 2
+#define Z_ExtendedServicesInfo_waitNotSupported 3
+#define Z_ExtendedServicesInfo_depends 4
+#define Z_ExtendedServicesInfo_notSaying 5
+	int *waitAction;
+	Z_HumanString *description; /* OPT */
+	Z_External *specificExplain; /* OPT */
+	Z_InternationalString *esASN; /* OPT */
+};
+
+struct Z_AttributeDetails {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+	int num_attributesBySet;
+	Z_AttributeSetDetails **attributesBySet; /* OPT */
+	Z_AttributeCombinations *attributeCombinations; /* OPT */
+};
+
+struct Z_AttributeSetDetails {
+	Z_AttributeSetId *attributeSet;
+	int num_attributesByType;
+	Z_AttributeTypeDetails **attributesByType;
+};
+
+struct Z_AttributeTypeDetails {
+	int *attributeType;
+	Z_OmittedAttributeInterpretation *defaultIfOmitted; /* OPT */
+	int num_attributeValues;
+	Z_AttributeValue **attributeValues; /* OPT */
+};
+
+struct Z_OmittedAttributeInterpretation {
+	Z_StringOrNumeric *defaultValue; /* OPT */
+	Z_HumanString *defaultDescription; /* OPT */
+};
+
+struct Z_AttributeValue {
+	Z_StringOrNumeric *value;
+	Z_HumanString *description; /* OPT */
+	int num_subAttributes;
+	Z_StringOrNumeric **subAttributes; /* OPT */
+	int num_superAttributes;
+	Z_StringOrNumeric **superAttributes; /* OPT */
+	Odr_null *partialSupport; /* OPT */
+};
+
+struct Z_EScanInfo {
+	int *maxStepSize; /* OPT */
+	Z_HumanString *collatingSequence; /* OPT */
+	bool_t *increasing; /* OPT */
+};
+
+struct Z_TermListDetails {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_InternationalString *termListName;
+	Z_HumanString *description; /* OPT */
+	Z_AttributeCombinations *attributes; /* OPT */
+	Z_EScanInfo *scanInfo; /* OPT */
+	int *estNumberTerms; /* OPT */
+	int num_sampleTerms;
+	Z_Term **sampleTerms; /* OPT */
+};
+
+struct Z_ElementSetDetails {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+	Z_ElementSetName *elementSetName;
+	Odr_oid *recordSyntax;
+	Odr_oid *schema;
+	Z_HumanString *description; /* OPT */
+	int num_detailsPerElement;
+	Z_PerElementDetails **detailsPerElement; /* OPT */
+};
+
+struct Z_RetrievalRecordDetails {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+	Odr_oid *schema;
+	Odr_oid *recordSyntax;
+	Z_HumanString *description; /* OPT */
+	int num_detailsPerElement;
+	Z_PerElementDetails **detailsPerElement; /* OPT */
+};
+
+struct Z_PerElementDetails {
+	Z_InternationalString *name; /* OPT */
+	Z_RecordTag *recordTag; /* OPT */
+	int num_schemaTags;
+	Z_Path **schemaTags; /* OPT */
+	int *maxSize; /* OPT */
+	int *minSize; /* OPT */
+	int *avgSize; /* OPT */
+	int *fixedSize; /* OPT */
+	bool_t *repeatable;
+	bool_t *required;
+	Z_HumanString *description; /* OPT */
+	Z_HumanString *contents; /* OPT */
+	Z_HumanString *billingInfo; /* OPT */
+	Z_HumanString *restrictions; /* OPT */
+	int num_alternateNames;
+	Z_InternationalString **alternateNames; /* OPT */
+	int num_genericNames;
+	Z_InternationalString **genericNames; /* OPT */
+	Z_AttributeCombinations *searchAccess; /* OPT */
+};
+
+struct Z_RecordTag {
+	Z_StringOrNumeric *qualifier; /* OPT */
+	Z_StringOrNumeric *tagValue;
+};
+
+struct Z_SortDetails {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+	int num_sortKeys;
+	Z_SortKeyDetails **sortKeys; /* OPT */
+};
+
+struct Z_SortKeyDetails {
+	Z_HumanString *description; /* OPT */
+	int num_elementSpecifications;
+	Z_Specification **elementSpecifications; /* OPT */
+	Z_AttributeCombinations *attributeSpecifications; /* OPT */
+	int which;
+	union {
+		Odr_null *character;
+		Odr_null *numeric;
+		Z_HumanString *structured;
+#define Z_SortKeyDetails_character 1
+#define Z_SortKeyDetails_numeric 2
+#define Z_SortKeyDetails_structured 3
+	} u; /* OPT */
+#define Z_SortKeyDetails_always 0
+#define Z_SortKeyDetails_never 1
+#define Z_SortKeyDetails_default_yes 2
+#define Z_SortKeyDetails_default_no 3
+	int *caseSensitivity; /* OPT */
+};
+
+struct Z_ProcessingInformation {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_DatabaseName *databaseName;
+#define Z_ProcessingInformation_access 0
+#define Z_ProcessingInformation_search 1
+#define Z_ProcessingInformation_retrieval 2
+#define Z_ProcessingInformation_record_presentation 3
+#define Z_ProcessingInformation_record_handling 4
+	int *processingContext;
+	Z_InternationalString *name;
+	Odr_oid *oid;
+	Z_HumanString *description; /* OPT */
+	Z_External *instructions; /* OPT */
+};
+
+struct Z_VariantSetInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Odr_oid *variantSet;
+	Z_InternationalString *name;
+	int num_variants;
+	Z_VariantClass **variants; /* OPT */
+};
+
+struct Z_VariantClass {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	int *variantClass;
+	int num_variantTypes;
+	Z_VariantType **variantTypes;
+};
+
+struct Z_VariantType {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	int *variantType;
+	Z_VariantValue *variantValue; /* OPT */
+};
+
+struct Z_VariantValue {
+	Z_PrimitiveDataType *dataType;
+	Z_ValueSet *values; /* OPT */
+};
+
+struct Z_ValueSetEnumerated {
+	int num;
+	Z_ValueDescription **elements;
+};
+
+struct Z_ValueSet {
+	int which;
+	union {
+		Z_ValueRange *range;
+		Z_ValueSetEnumerated *enumerated;
+#define Z_ValueSet_range 1
+#define Z_ValueSet_enumerated 2
+	} u;
+};
+
+struct Z_ValueRange {
+	Z_ValueDescription *lower; /* OPT */
+	Z_ValueDescription *upper; /* OPT */
+};
+
+struct Z_ValueDescription {
+	int which;
+	union {
+		int *integer;
+		Z_InternationalString *string;
+		Odr_oct *octets;
+		Odr_oid *oid;
+		Z_Unit *unit;
+		Z_IntUnit *valueAndUnit;
+#define Z_ValueDescription_integer 1
+#define Z_ValueDescription_string 2
+#define Z_ValueDescription_octets 3
+#define Z_ValueDescription_oid 4
+#define Z_ValueDescription_unit 5
+#define Z_ValueDescription_valueAndUnit 6
+	} u;
+};
+
+struct Z_UnitInfo {
+	Z_CommonInfo *commonInfo; /* OPT */
+	Z_InternationalString *unitSystem;
+	Z_HumanString *description; /* OPT */
+	int num_units;
+	Z_UnitType **units; /* OPT */
+};
+
+struct Z_UnitType {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_StringOrNumeric *unitType;
+	int num_units;
+	Z_Units **units;
+};
+
+struct Z_Units {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_StringOrNumeric *unit;
+};
+
+struct Z_CategoryList {
+	Z_CommonInfo *commonInfo; /* OPT */
+	int num_categories;
+	Z_CategoryInfo **categories;
+};
+
+struct Z_CategoryInfo {
+	Z_InternationalString *category;
+	Z_InternationalString *originalCategory; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_InternationalString *asn1Module; /* OPT */
+};
+
+struct Z_CommonInfo {
+	char *dateAdded; /* OPT */
+	char *dateChanged; /* OPT */
+	char *expiry; /* OPT */
+	Z_LanguageCode *humanStringLanguage; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_HumanStringUnit {
+	Z_LanguageCode *language; /* OPT */
+	Z_InternationalString *text;
+};
+
+struct Z_HumanString {
+	int num_strings;
+	Z_HumanStringUnit **strings;
+};
+
+struct Z_IconObjectUnit {
+	int which;
+	union {
+		Z_InternationalString *ianaType;
+		Z_InternationalString *z3950type;
+		Z_InternationalString *otherType;
+#define Z_IconObjectUnit_ianaType 1
+#define Z_IconObjectUnit_z3950type 2
+#define Z_IconObjectUnit_otherType 3
+	} u;
+	Odr_oct *content;
+};
+
+struct Z_IconObject {
+	int num;
+	Z_IconObjectUnit **elements;
+};
+
+
+
+struct Z_ContactInfo {
+	Z_InternationalString *name; /* OPT */
+	Z_HumanString *description; /* OPT */
+	Z_HumanString *address; /* OPT */
+	Z_InternationalString *email; /* OPT */
+	Z_InternationalString *phone; /* OPT */
+};
+
+struct Z_NetworkAddressIA {
+	Z_InternationalString *hostAddress;
+	int *port;
+};
+
+struct Z_NetworkAddressOPA {
+	Z_InternationalString *pSel;
+	Z_InternationalString *sSel; /* OPT */
+	Z_InternationalString *tSel; /* OPT */
+	Z_InternationalString *nSap;
+};
+
+struct Z_NetworkAddressOther {
+	Z_InternationalString *type;
+	Z_InternationalString *address;
+};
+
+struct Z_NetworkAddress {
+	int which;
+	union {
+		Z_NetworkAddressIA *internetAddress;
+		Z_NetworkAddressOPA *osiPresentationAddress;
+		Z_NetworkAddressOther *other;
+#define Z_NetworkAddress_iA 1
+#define Z_NetworkAddress_oPA 2
+#define Z_NetworkAddress_other 3
+	} u;
+};
+
+struct Z_AccessInfo {
+	int num_queryTypesSupported;
+	Z_QueryTypeDetails **queryTypesSupported; /* OPT */
+	int num_diagnosticsSets;
+	Odr_oid **diagnosticsSets; /* OPT */
+	int num_attributeSetIds;
+	Z_AttributeSetId **attributeSetIds; /* OPT */
+	int num_schemas;
+	Odr_oid **schemas; /* OPT */
+	int num_recordSyntaxes;
+	Odr_oid **recordSyntaxes; /* OPT */
+	int num_resourceChallenges;
+	Odr_oid **resourceChallenges; /* OPT */
+	Z_AccessRestrictions *restrictedAccess; /* OPT */
+	Z_Costs *costInfo; /* OPT */
+	int num_variantSets;
+	Odr_oid **variantSets; /* OPT */
+	int num_elementSetNames;
+	Z_ElementSetName **elementSetNames; /* OPT */
+	int num_unitSystems;
+	Z_InternationalString **unitSystems;
+};
+
+struct Z_QueryTypeDetails {
+	int which;
+	union {
+		Z_PrivateCapabilities *zprivate;
+		Z_RpnCapabilities *rpn;
+		Z_Iso8777Capabilities *iso8777;
+		Z_HumanString *z39_58;
+		Z_RpnCapabilities *erpn;
+		Z_HumanString *rankedList;
+#define Z_QueryTypeDetails_private 1
+#define Z_QueryTypeDetails_rpn 2
+#define Z_QueryTypeDetails_iso8777 3
+#define Z_QueryTypeDetails_z39_58 4
+#define Z_QueryTypeDetails_erpn 5
+#define Z_QueryTypeDetails_rankedList 6
+	} u;
+};
+
+struct Z_PrivateCapOperator {
+	Z_InternationalString *roperator;
+	Z_HumanString *description; /* OPT */
+};
+
+struct Z_PrivateCapabilities {
+	int num_operators;
+	Z_PrivateCapOperator **operators; /* OPT */
+	int num_searchKeys;
+	Z_SearchKey **searchKeys; /* OPT */
+	int num_description;
+	Z_HumanString **description; /* OPT */
+};
+
+struct Z_RpnCapabilities {
+	int num_operators;
+	int **operators; /* OPT */
+	bool_t *resultSetAsOperandSupported;
+	bool_t *restrictionOperandSupported;
+	Z_ProximitySupport *proximity; /* OPT */
+};
+
+struct Z_Iso8777Capabilities {
+	int num_searchKeys;
+	Z_SearchKey **searchKeys;
+	Z_HumanString *restrictions; /* OPT */
+};
+
+struct Z_ProxSupportPrivate {
+	int *unit;
+	Z_HumanString *description; /* OPT */
+};
+
+struct Z_ProxSupportUnit {
+	int which;
+	union {
+		int *known;
+		Z_ProxSupportPrivate *zprivate;
+#define Z_ProxSupportUnit_known 1
+#define Z_ProxSupportUnit_private 2
+	} u;
+};
+
+struct Z_ProximitySupport {
+	bool_t *anySupport;
+	int num_unitsSupported;
+	Z_ProxSupportUnit **unitsSupported; /* OPT */
+};
+
+struct Z_SearchKey {
+	Z_InternationalString *searchKey;
+	Z_HumanString *description; /* OPT */
+};
+
+struct Z_AccessRestrictionsUnit {
+#define Z_AccessRestrictionsUnit_any 0
+#define Z_AccessRestrictionsUnit_search 1
+#define Z_AccessRestrictionsUnit_present 2
+#define Z_AccessRestrictionsUnit_specific_elements 3
+#define Z_AccessRestrictionsUnit_extended_services 4
+#define Z_AccessRestrictionsUnit_by_database 5
+	int *accessType;
+	Z_HumanString *accessText; /* OPT */
+	int num_accessChallenges;
+	Odr_oid **accessChallenges; /* OPT */
+};
+
+struct Z_AccessRestrictions {
+	int num;
+	Z_AccessRestrictionsUnit **elements;
+};
+
+struct Z_CostsOtherCharge {
+	Z_HumanString *forWhat;
+	Z_Charge *charge;
+};
+
+struct Z_Costs {
+	Z_Charge *connectCharge; /* OPT */
+	Z_Charge *connectTime; /* OPT */
+	Z_Charge *displayCharge; /* OPT */
+	Z_Charge *searchCharge; /* OPT */
+	Z_Charge *subscriptCharge; /* OPT */
+	int num_otherCharges;
+	Z_CostsOtherCharge **otherCharges; /* OPT */
+};
+
+struct Z_Charge {
+	Z_IntUnit *cost;
+	Z_Unit *perWhat; /* OPT */
+	Z_HumanString *text; /* OPT */
+};
+
+struct Z_DatabaseList {
+	int num_databases;
+	Z_DatabaseName **databases;
+};
+
+struct Z_AttributeCombinations {
+	Z_AttributeSetId *defaultAttributeSet;
+	int num_legalCombinations;
+	Z_AttributeCombination **legalCombinations;
+};
+
+struct Z_AttributeCombination {
+	int num_occurrences;
+	Z_AttributeOccurrence **occurrences;
+};
+
+struct Z_AttributeValueList {
+	int num_attributes;
+	Z_StringOrNumeric **attributes;
+};
+
+struct Z_AttributeOccurrence {
+	Z_AttributeSetId *attributeSet; /* OPT */
+	int *attributeType;
+	Odr_null *mustBeSupplied; /* OPT */
+	int which;
+	union {
+		Odr_null *any_or_none;
+		Z_AttributeValueList *specific;
+#define Z_AttributeOcc_any_or_none 1
+#define Z_AttributeOcc_specific 2
+	} attributeValues;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-grs.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-grs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-grs.h	(revision 21083)
@@ -0,0 +1,178 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-generic */
+
+#ifndef z_grs_H
+#define z_grs_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_GenericRecord Z_GenericRecord;
+YAZ_EXPORT int z_GenericRecord (ODR o, Z_GenericRecord **p, int opt, const char *name);
+
+typedef struct Z_TaggedElement Z_TaggedElement;
+YAZ_EXPORT int z_TaggedElement (ODR o, Z_TaggedElement **p, int opt, const char *name);
+
+typedef struct Z_ElementData Z_ElementData;
+YAZ_EXPORT int z_ElementData (ODR o, Z_ElementData **p, int opt, const char *name);
+
+typedef struct Z_ElementMetaData Z_ElementMetaData;
+YAZ_EXPORT int z_ElementMetaData (ODR o, Z_ElementMetaData **p, int opt, const char *name);
+
+typedef struct Z_TagPath_s Z_TagPath_s;
+YAZ_EXPORT int z_TagPath_s (ODR o, Z_TagPath_s **p, int opt, const char *name);
+
+typedef struct Z_TagPath Z_TagPath;
+YAZ_EXPORT int z_TagPath (ODR o, Z_TagPath **p, int opt, const char *name);
+
+typedef struct Z_Order Z_Order;
+YAZ_EXPORT int z_Order (ODR o, Z_Order **p, int opt, const char *name);
+
+typedef struct Z_Usage Z_Usage;
+YAZ_EXPORT int z_Usage (ODR o, Z_Usage **p, int opt, const char *name);
+
+typedef struct Z_HitVector Z_HitVector;
+YAZ_EXPORT int z_HitVector (ODR o, Z_HitVector **p, int opt, const char *name);
+
+typedef struct Z_Triple Z_Triple;
+YAZ_EXPORT int z_Triple (ODR o, Z_Triple **p, int opt, const char *name);
+
+typedef struct Z_Variant Z_Variant;
+YAZ_EXPORT int z_Variant (ODR o, Z_Variant **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_GenericRecord {
+	int num_elements;
+	Z_TaggedElement **elements;
+};
+
+struct Z_TaggedElement {
+	int *tagType; /* OPT */
+	Z_StringOrNumeric *tagValue;
+	int *tagOccurrence; /* OPT */
+	Z_ElementData *content;
+	Z_ElementMetaData *metaData; /* OPT */
+	Z_Variant *appliedVariant; /* OPT */
+};
+
+struct Z_ElementData {
+	int which;
+	union {
+		Odr_oct *octets;
+		int *numeric;
+		char *date;
+		Z_External *ext;
+		Z_InternationalString *string;
+		bool_t *trueOrFalse;
+		Odr_oid *oid;
+		Z_IntUnit *intUnit;
+		Odr_null *elementNotThere;
+		Odr_null *elementEmpty;
+		Odr_null *noDataRequested;
+		Z_External *diagnostic;
+		Z_GenericRecord *subtree;
+#define Z_ElementData_octets 1
+#define Z_ElementData_numeric 2
+#define Z_ElementData_date 3
+#define Z_ElementData_ext 4
+#define Z_ElementData_string 5
+#define Z_ElementData_trueOrFalse 6
+#define Z_ElementData_oid 7
+#define Z_ElementData_intUnit 8
+#define Z_ElementData_elementNotThere 9
+#define Z_ElementData_elementEmpty 10
+#define Z_ElementData_noDataRequested 11
+#define Z_ElementData_diagnostic 12
+#define Z_ElementData_subtree 13
+	} u;
+};
+
+struct Z_ElementMetaData {
+	Z_Order *seriesOrder; /* OPT */
+	Z_Usage *usageRight; /* OPT */
+	int num_hits;
+	Z_HitVector **hits; /* OPT */
+	Z_InternationalString *displayName; /* OPT */
+	int num_supportedVariants;
+	Z_Variant **supportedVariants; /* OPT */
+	Z_InternationalString *message; /* OPT */
+	Odr_oct *elementDescriptor; /* OPT */
+	Z_TagPath *surrogateFor; /* OPT */
+	Z_TagPath *surrogateElement; /* OPT */
+	Z_External *other; /* OPT */
+};
+
+struct Z_TagPath_s {
+	int *tagType; /* OPT */
+	Z_StringOrNumeric *tagValue;
+	int *tagOccurrence; /* OPT */
+};
+
+struct Z_TagPath {
+	int num;
+	Z_TagPath_s **elements;
+};
+
+struct Z_Order {
+	bool_t *ascending;
+	int *order;
+};
+
+struct Z_Usage {
+#define Z_Usage_redistributable 1
+#define Z_Usage_restricted 2
+#define Z_Usage_licensePointer 3
+	int *type;
+	Z_InternationalString *restriction; /* OPT */
+};
+
+struct Z_HitVector {
+	Z_Term *satisfier; /* OPT */
+	Z_IntUnit *offsetIntoElement; /* OPT */
+	Z_IntUnit *length; /* OPT */
+	int *hitRank; /* OPT */
+	Odr_oct *targetToken; /* OPT */
+};
+
+struct Z_Triple {
+	Odr_oid *variantSetId; /* OPT */
+	int *zclass;
+	int *type;
+	int which;
+	union {
+		int *integer;
+		Z_InternationalString *internationalString;
+		Odr_oct *octetString;
+		Odr_oid *objectIdentifier;
+		bool_t *boolean;
+		Odr_null *null;
+		Z_Unit *unit;
+		Z_IntUnit *valueAndUnit;
+#define Z_Triple_integer 1
+#define Z_Triple_internationalString 2
+#define Z_Triple_octetString 3
+#define Z_Triple_objectIdentifier 4
+#define Z_Triple_boolean 5
+#define Z_Triple_null 6
+#define Z_Triple_unit 7
+#define Z_Triple_valueAndUnit 8
+	} value;
+};
+
+struct Z_Variant {
+	Odr_oid *globalVariantSetId; /* OPT */
+	int num_triples;
+	Z_Triple **triples;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-opac.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-opac.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-opac.h	(revision 21083)
@@ -0,0 +1,95 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-opac */
+
+#ifndef z_opac_H
+#define z_opac_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_OPACRecord Z_OPACRecord;
+YAZ_EXPORT int z_OPACRecord (ODR o, Z_OPACRecord **p, int opt, const char *name);
+
+typedef struct Z_HoldingsRecord Z_HoldingsRecord;
+YAZ_EXPORT int z_HoldingsRecord (ODR o, Z_HoldingsRecord **p, int opt, const char *name);
+
+typedef struct Z_HoldingsAndCircData Z_HoldingsAndCircData;
+YAZ_EXPORT int z_HoldingsAndCircData (ODR o, Z_HoldingsAndCircData **p, int opt, const char *name);
+
+typedef struct Z_Volume Z_Volume;
+YAZ_EXPORT int z_Volume (ODR o, Z_Volume **p, int opt, const char *name);
+
+typedef struct Z_CircRecord Z_CircRecord;
+YAZ_EXPORT int z_CircRecord (ODR o, Z_CircRecord **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_OPACRecord {
+	Z_External *bibliographicRecord; /* OPT */
+	int num_holdingsData;
+	Z_HoldingsRecord **holdingsData; /* OPT */
+};
+
+struct Z_HoldingsRecord {
+	int which;
+	union {
+		Z_External *marcHoldingsRecord;
+		Z_HoldingsAndCircData *holdingsAndCirc;
+#define Z_HoldingsRecord_marcHoldingsRecord 1
+#define Z_HoldingsRecord_holdingsAndCirc 2
+	} u;
+};
+
+struct Z_HoldingsAndCircData {
+	Z_InternationalString *typeOfRecord; /* OPT */
+	Z_InternationalString *encodingLevel; /* OPT */
+	Z_InternationalString *format; /* OPT */
+	Z_InternationalString *receiptAcqStatus; /* OPT */
+	Z_InternationalString *generalRetention; /* OPT */
+	Z_InternationalString *completeness; /* OPT */
+	Z_InternationalString *dateOfReport; /* OPT */
+	Z_InternationalString *nucCode; /* OPT */
+	Z_InternationalString *localLocation; /* OPT */
+	Z_InternationalString *shelvingLocation; /* OPT */
+	Z_InternationalString *callNumber; /* OPT */
+	Z_InternationalString *shelvingData; /* OPT */
+	Z_InternationalString *copyNumber; /* OPT */
+	Z_InternationalString *publicNote; /* OPT */
+	Z_InternationalString *reproductionNote; /* OPT */
+	Z_InternationalString *termsUseRepro; /* OPT */
+	Z_InternationalString *enumAndChron; /* OPT */
+	int num_volumes;
+	Z_Volume **volumes; /* OPT */
+	int num_circulationData;
+	Z_CircRecord **circulationData; /* OPT */
+};
+
+struct Z_Volume {
+	Z_InternationalString *enumeration; /* OPT */
+	Z_InternationalString *chronology; /* OPT */
+	Z_InternationalString *enumAndChron; /* OPT */
+};
+
+struct Z_CircRecord {
+	bool_t *availableNow;
+	Z_InternationalString *availablityDate; /* OPT */
+	Z_InternationalString *availableThru; /* OPT */
+	Z_InternationalString *restrictions; /* OPT */
+	Z_InternationalString *itemId; /* OPT */
+	bool_t *renewable;
+	bool_t *onHold;
+	Z_InternationalString *enumAndChron; /* OPT */
+	Z_InternationalString *midspine; /* OPT */
+	Z_InternationalString *temporaryLocation; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-proto.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-proto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-proto.h	(revision 21083)
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 1998-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ */
+#ifndef Z_PROTO_H
+#define Z_PROTO_H
+
+#define Z_95 1
+#define ASN_COMPILED 1
+
+#include <yaz/yaz-version.h>
+#include <yaz/z-accdes1.h>
+#include <yaz/z-accform1.h>
+#include <yaz/z-acckrb1.h>
+#include <yaz/z-core.h>
+#include <yaz/z-diag1.h>
+#include <yaz/z-espec1.h>
+#include <yaz/z-estask.h>
+#include <yaz/z-exp.h>
+#include <yaz/z-grs.h>
+#include <yaz/z-opac.h>
+#include <yaz/z-rrf1.h>
+#include <yaz/z-rrf2.h>
+#include <yaz/z-sum.h>
+#include <yaz/z-sutrs.h>
+#include <yaz/z-uifr1.h>
+#include <yaz/zes-expi.h>
+#include <yaz/zes-exps.h>
+#include <yaz/zes-order.h>
+#include <yaz/zes-pquery.h>
+#include <yaz/zes-psched.h>
+#include <yaz/zes-pset.h>
+#include <yaz/zes-update.h>
+#include <yaz/z-date.h>
+#include <yaz/z-univ.h>
+
+YAZ_BEGIN_CDECL
+
+#define Z_PRES_SUCCESS   Z_PresentStatus_success
+#define Z_PRES_PARTIAL_1 Z_PresentStatus_partial_1
+#define Z_PRES_PARTIAL_2 Z_PresentStatus_partial_2
+#define Z_PRES_PARTIAL_3 Z_PresentStatus_partial_3
+#define Z_PRES_PARTIAL_4 Z_PresentStatus_partial_4
+#define Z_PRES_FAILURE   Z_PresentStatus_failure
+
+#define Z_RES_SUBSET  Z_SearchResponse_subset
+#define Z_RES_INTERIM Z_SearchResponse_interim
+#define Z_RES_NONE    Z_SearchResponse_none
+
+#define Z_SortStatus_success Z_SortResponse_success 
+#define Z_SortStatus_partial_1 Z_SortResponse_partial_1
+#define Z_SortStatus_failure Z_SortResponse_failure
+
+#define Z_SortRelation_ascending            Z_SortKeySpec_ascending 
+#define Z_SortRelation_descending           Z_SortKeySpec_descending
+#define Z_SortRelation_ascendingByFreq      Z_SortKeySpec_ascendingByFrequency
+#define Z_SortRelation_descendingByFreq     Z_SortKeySpec_descendingByfrequency 
+
+#define Z_SortCase_caseSensitive            Z_SortKeySpec_caseSensitive
+#define Z_SortCase_caseInsensitive          Z_SortKeySpec_descendingByfrequency
+
+#define Z_TriggerResourceCtrl_resourceReport Z_TriggerResourceControlRequest_resourceReport
+#define Z_TriggerResourceCtrl_resourceControl  Z_TriggerResourceControlRequest_resourceControl
+#define Z_TriggerResourceCtrl_cancel Z_TriggerResourceControlRequest_cancel
+
+#define Z_DeleteRequest_list    Z_DeleteResultSetRequest_list
+#define Z_DeleteRequest_all     Z_DeleteResultSetRequest_all
+
+#define Z_AccessRequest_simpleForm Z_AccessControlRequest_simpleForm
+#define Z_AccessRequest_externallyDefined Z_AccessControlRequest_externallyDefined
+
+#define Z_AccessResponse_simpleForm Z_AccessControlResponse_simpleForm
+#define Z_AccessResponse_externallyDefined Z_AccessControlResponse_externallyDefined
+
+#define Z_ResourceReportStatus_success   Z_ResourceReportResponse_success
+#define Z_ResourceReportStatus_partial   Z_ResourceReportResponse_partial
+#define Z_ResourceReportStatus_failure_1 Z_ResourceReportResponse_failure_1
+#define Z_ResourceReportStatus_failure_2 Z_ResourceReportResponse_failure_2
+#define Z_ResourceReportStatus_failure_3 Z_ResourceReportResponse_failure_3
+#define Z_ResourceReportStatus_failure_4 Z_ResourceReportResponse_failure_4
+#define Z_ResourceReportStatus_failure_5 Z_ResourceReportResponse_failure_5
+#define Z_ResourceReportStatus_failure_6 Z_ResourceReportResponse_failure_6
+
+#define Z_SortResultSetStatus_empty       Z_SortResponse_empty
+#define Z_SortResultSetStatus_interim     Z_SortResponse_interim
+#define Z_SortResultSetStatus_unchanged   Z_SortResponse_unchanged
+#define Z_SortResultSetStatus_none        Z_SortResponse_none
+
+typedef Z_External Z_DatabaseRecord;
+typedef struct Z_IOItemOrder Z_ItemOrder;
+
+YAZ_EXPORT Z_APDU *zget_APDU(ODR o, int which);
+YAZ_EXPORT Z_Close *zget_Close (ODR o);
+
+YAZ_END_CDECL
+
+#include <yaz/prt-ext.h>
+
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf1.h	(revision 21083)
@@ -0,0 +1,59 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ResourceReport-Format-Resource-1 */
+
+#ifndef z_rrf1_H
+#define z_rrf1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_ResourceReport1 Z_ResourceReport1;
+YAZ_EXPORT int z_ResourceReport1 (ODR o, Z_ResourceReport1 **p, int opt, const char *name);
+
+typedef struct Z_Estimate1 Z_Estimate1;
+YAZ_EXPORT int z_Estimate1 (ODR o, Z_Estimate1 **p, int opt, const char *name);
+
+typedef int  Z_EstimateType;
+YAZ_EXPORT int z_EstimateType (ODR o, Z_EstimateType **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_ResourceReport1 {
+	int num_estimates;
+	Z_Estimate1 **estimates;
+	Z_InternationalString *message;
+};
+
+struct Z_Estimate1 {
+	Z_EstimateType *type;
+	int *value;
+	int *currency_code; /* OPT */
+};
+
+#define Z_EstimateType_currentSearchRecords 1
+#define Z_EstimateType_finalSearchRecords 2
+#define Z_EstimateType_currentPresentRecords 3
+#define Z_EstimateType_finalPresentRecords 4
+#define Z_EstimateType_currentOpTimeProcessing 5
+#define Z_EstimateType_finalOpTimeProcessing 6
+#define Z_EstimateType_currentAssocTime 7
+#define Z_EstimateType_currentOperationCost 8
+#define Z_EstimateType_finalOperationCost 9
+#define Z_EstimateType_currentAssocCost 10
+#define Z_EstimateType_finalOpTimeElapsed 11
+#define Z_EstimateType_percentComplete 12
+#define Z_EstimateType_currentSearchAssocCost 13
+#define Z_EstimateType_currentPresentAssocCost 14
+#define Z_EstimateType_currentConnectAssocCost 15
+#define Z_EstimateType_currentOtherAssocCost 16
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf2.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf2.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-rrf2.h	(revision 21083)
@@ -0,0 +1,38 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ResourceReport-Format-Resource-2 */
+
+#ifndef z_rrf2_H
+#define z_rrf2_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_ResourceReport2 Z_ResourceReport2;
+YAZ_EXPORT int z_ResourceReport2 (ODR o, Z_ResourceReport2 **p, int opt, const char *name);
+
+typedef struct Z_Estimate2 Z_Estimate2;
+YAZ_EXPORT int z_Estimate2 (ODR o, Z_Estimate2 **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_ResourceReport2 {
+	int num_estimates;
+	Z_Estimate2 **estimates; /* OPT */
+	Z_InternationalString *message; /* OPT */
+};
+
+struct Z_Estimate2 {
+	Z_StringOrNumeric *type;
+	Z_IntUnit *value;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sum.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sum.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sum.h	(revision 21083)
@@ -0,0 +1,51 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-summary */
+
+#ifndef z_sum_H
+#define z_sum_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_BriefBib Z_BriefBib;
+YAZ_EXPORT int z_BriefBib (ODR o, Z_BriefBib **p, int opt, const char *name);
+
+typedef struct Z_FormatSpec Z_FormatSpec;
+YAZ_EXPORT int z_FormatSpec (ODR o, Z_FormatSpec **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_BriefBib {
+	Z_InternationalString *title;
+	Z_InternationalString *author; /* OPT */
+	Z_InternationalString *callNumber; /* OPT */
+	Z_InternationalString *recordType; /* OPT */
+	Z_InternationalString *bibliographicLevel; /* OPT */
+	int num_format;
+	Z_FormatSpec **format; /* OPT */
+	Z_InternationalString *publicationPlace; /* OPT */
+	Z_InternationalString *publicationDate; /* OPT */
+	Z_InternationalString *targetSystemKey; /* OPT */
+	Z_InternationalString *satisfyingElement; /* OPT */
+	int *rank; /* OPT */
+	Z_InternationalString *documentId; /* OPT */
+	Z_InternationalString *abstract; /* OPT */
+	Z_OtherInformation *otherInfo; /* OPT */
+};
+
+struct Z_FormatSpec {
+	Z_InternationalString *type;
+	int *size; /* OPT */
+	int *bestPosn; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sutrs.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sutrs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-sutrs.h	(revision 21083)
@@ -0,0 +1,36 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H RecordSyntax-SUTRS */
+
+#ifndef z_sutrs_H
+#define z_sutrs_H
+
+#include <yaz/odr.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef Odr_oct Z_SUTRS;
+YAZ_EXPORT int z_SUTRS (ODR o, Odr_oct **p, int opt);
+
+#ifdef __cplusplus
+}
+#endif
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef Z_InternationalString  Z_SutrsRecord;
+YAZ_EXPORT int z_SutrsRecord (ODR o, Z_SutrsRecord **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-uifr1.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-uifr1.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-uifr1.h	(revision 21083)
@@ -0,0 +1,95 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H UserInfoFormat-searchResult-1 */
+
+#ifndef z_uifr1_H
+#define z_uifr1_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_SearchInfoReport_s Z_SearchInfoReport_s;
+YAZ_EXPORT int z_SearchInfoReport_s (ODR o, Z_SearchInfoReport_s **p, int opt, const char *name);
+
+typedef struct Z_SearchInfoReport Z_SearchInfoReport;
+YAZ_EXPORT int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt, const char *name);
+
+typedef struct Z_ResultsByDB_sList Z_ResultsByDB_sList;
+YAZ_EXPORT int z_ResultsByDB_sList (ODR o, Z_ResultsByDB_sList **p, int opt, const char *name);
+
+typedef struct Z_ResultsByDB_s Z_ResultsByDB_s;
+YAZ_EXPORT int z_ResultsByDB_s (ODR o, Z_ResultsByDB_s **p, int opt, const char *name);
+
+typedef struct Z_ResultsByDB Z_ResultsByDB;
+YAZ_EXPORT int z_ResultsByDB (ODR o, Z_ResultsByDB **p, int opt, const char *name);
+
+typedef struct Z_QueryExpressionTerm Z_QueryExpressionTerm;
+YAZ_EXPORT int z_QueryExpressionTerm (ODR o, Z_QueryExpressionTerm **p, int opt, const char *name);
+
+typedef struct Z_QueryExpression Z_QueryExpression;
+YAZ_EXPORT int z_QueryExpression (ODR o, Z_QueryExpression **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_SearchInfoReport_s {
+	Z_InternationalString *subqueryId; /* OPT */
+	bool_t *fullQuery;
+	Z_QueryExpression *subqueryExpression; /* OPT */
+	Z_QueryExpression *subqueryInterpretation; /* OPT */
+	Z_QueryExpression *subqueryRecommendation; /* OPT */
+	int *subqueryCount; /* OPT */
+	Z_IntUnit *subqueryWeight; /* OPT */
+	Z_ResultsByDB *resultsByDB; /* OPT */
+};
+
+struct Z_SearchInfoReport {
+	int num;
+	Z_SearchInfoReport_s **elements;
+};
+
+struct Z_ResultsByDB_sList {
+	int num;
+	Z_DatabaseName **elements;
+};
+
+struct Z_ResultsByDB_s {
+	int which;
+	union {
+		Odr_null *all;
+		Z_ResultsByDB_sList *list;
+#define Z_ResultsByDB_s_all 1
+#define Z_ResultsByDB_s_list 2
+	} u;
+	int *count; /* OPT */
+	Z_InternationalString *resultSetName; /* OPT */
+};
+
+struct Z_ResultsByDB {
+	int num;
+	Z_ResultsByDB_s **elements;
+};
+
+struct Z_QueryExpressionTerm {
+	Z_Term *queryTerm;
+	Z_InternationalString *termComment; /* OPT */
+};
+
+struct Z_QueryExpression {
+	int which;
+	union {
+		Z_QueryExpressionTerm *term;
+		Z_Query *query;
+#define Z_QueryExpression_term 1
+#define Z_QueryExpression_query 2
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-univ.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-univ.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/z-univ.h	(revision 21083)
@@ -0,0 +1,50 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ResourceReport-Format-Universe-1 */
+
+#ifndef z_univ_H
+#define z_univ_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_UniverseReportHits Z_UniverseReportHits;
+YAZ_EXPORT int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt, const char *name);
+
+typedef struct Z_UniverseReportDuplicate Z_UniverseReportDuplicate;
+YAZ_EXPORT int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt, const char *name);
+
+typedef struct Z_UniverseReport Z_UniverseReport;
+YAZ_EXPORT int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_UniverseReportHits {
+	Z_StringOrNumeric *database;
+	Z_StringOrNumeric *hits;
+};
+
+struct Z_UniverseReportDuplicate {
+	Z_StringOrNumeric *hitno;
+};
+
+struct Z_UniverseReport {
+	int *totalHits;
+	int which;
+	union {
+		Z_UniverseReportHits *databaseHits;
+		Z_UniverseReportDuplicate *duplicate;
+#define Z_UniverseReport_databaseHits 1
+#define Z_UniverseReport_duplicate 2
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-expi.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-expi.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-expi.h	(revision 21083)
@@ -0,0 +1,105 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-ExportInvocation */
+
+#ifndef zes_expi_H
+#define zes_expi_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#include <yaz/zes-exps.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_EIExportInvocationEsRequest Z_EIExportInvocationEsRequest;
+YAZ_EXPORT int z_EIExportInvocationEsRequest (ODR o, Z_EIExportInvocationEsRequest **p, int opt, const char *name);
+
+typedef struct Z_EIExportInvocationTaskPackage Z_EIExportInvocationTaskPackage;
+YAZ_EXPORT int z_EIExportInvocationTaskPackage (ODR o, Z_EIExportInvocationTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_EIExportInvocation Z_EIExportInvocation;
+YAZ_EXPORT int z_EIExportInvocation (ODR o, Z_EIExportInvocation **p, int opt, const char *name);
+
+typedef struct Z_EIOriginPartToKeep Z_EIOriginPartToKeep;
+YAZ_EXPORT int z_EIOriginPartToKeep (ODR o, Z_EIOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_EIOriginPartNotToKeepRanges_s Z_EIOriginPartNotToKeepRanges_s;
+YAZ_EXPORT int z_EIOriginPartNotToKeepRanges_s (ODR o, Z_EIOriginPartNotToKeepRanges_s **p, int opt, const char *name);
+
+typedef struct Z_EIOriginPartNotToKeepRanges Z_EIOriginPartNotToKeepRanges;
+YAZ_EXPORT int z_EIOriginPartNotToKeepRanges (ODR o, Z_EIOriginPartNotToKeepRanges **p, int opt, const char *name);
+
+typedef struct Z_EIOriginPartNotToKeep Z_EIOriginPartNotToKeep;
+YAZ_EXPORT int z_EIOriginPartNotToKeep (ODR o, Z_EIOriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_EITargetPart Z_EITargetPart;
+YAZ_EXPORT int z_EITargetPart (ODR o, Z_EITargetPart **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_EIExportInvocationEsRequest {
+	Z_EIOriginPartToKeep *toKeep;
+	Z_EIOriginPartNotToKeep *notToKeep;
+};
+
+struct Z_EIExportInvocationTaskPackage {
+	Z_EIOriginPartToKeep *originPart;
+	Z_EITargetPart *targetPart; /* OPT */
+};
+
+struct Z_EIExportInvocation {
+	int which;
+	union {
+		Z_EIExportInvocationEsRequest *esRequest;
+		Z_EIExportInvocationTaskPackage *taskPackage;
+#define Z_EIExportInvocation_esRequest 1
+#define Z_EIExportInvocation_taskPackage 2
+	} u;
+};
+
+struct Z_EIOriginPartToKeep {
+	int which;
+	union {
+		Z_InternationalString *packageName;
+		Z_ESExportSpecification *packageSpec;
+#define Z_EIOriginPartToKeep_packageName 1
+#define Z_EIOriginPartToKeep_packageSpec 2
+	} u;
+	int *numberOfCopies;
+};
+
+struct Z_EIOriginPartNotToKeepRanges_s {
+	int *start;
+	int *count; /* OPT */
+};
+
+struct Z_EIOriginPartNotToKeepRanges {
+	int num;
+	Z_EIOriginPartNotToKeepRanges_s **elements;
+};
+
+struct Z_EIOriginPartNotToKeep {
+	Z_InternationalString *resultSetId;
+	int which;
+	union {
+		Odr_null *all;
+		Z_EIOriginPartNotToKeepRanges *ranges;
+#define Z_EIOriginPartNotToKeep_all 1
+#define Z_EIOriginPartNotToKeep_ranges 2
+	} u;
+};
+
+struct Z_EITargetPart {
+	Z_IntUnit *estimatedQuantity; /* OPT */
+	Z_IntUnit *quantitySoFar; /* OPT */
+	Z_IntUnit *estimatedCost; /* OPT */
+	Z_IntUnit *costSoFar; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-exps.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-exps.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-exps.h	(revision 21083)
@@ -0,0 +1,93 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-ExportSpecification */
+
+#ifndef zes_exps_H
+#define zes_exps_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_ESExportSpecificationEsRequest Z_ESExportSpecificationEsRequest;
+YAZ_EXPORT int z_ESExportSpecificationEsRequest (ODR o, Z_ESExportSpecificationEsRequest **p, int opt, const char *name);
+
+typedef struct Z_ESExportSpecificationTaskPackage Z_ESExportSpecificationTaskPackage;
+YAZ_EXPORT int z_ESExportSpecificationTaskPackage (ODR o, Z_ESExportSpecificationTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_ESExportSpecification Z_ESExportSpecification;
+YAZ_EXPORT int z_ESExportSpecification (ODR o, Z_ESExportSpecification **p, int opt, const char *name);
+
+typedef struct Z_ESOriginPartToKeep Z_ESOriginPartToKeep;
+YAZ_EXPORT int z_ESOriginPartToKeep (ODR o, Z_ESOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_ESDestinationOther Z_ESDestinationOther;
+YAZ_EXPORT int z_ESDestinationOther (ODR o, Z_ESDestinationOther **p, int opt, const char *name);
+
+typedef struct Z_ESDestination Z_ESDestination;
+YAZ_EXPORT int z_ESDestination (ODR o, Z_ESDestination **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_ESExportSpecificationEsRequest {
+	Z_ESOriginPartToKeep *toKeep;
+	Odr_null *notToKeep;
+};
+
+struct Z_ESExportSpecificationTaskPackage {
+	Z_ESOriginPartToKeep *originPart;
+	Odr_null *targetPart;
+};
+
+struct Z_ESExportSpecification {
+	int which;
+	union {
+		Z_ESExportSpecificationEsRequest *esRequest;
+		Z_ESExportSpecificationTaskPackage *taskPackage;
+#define Z_ESExportSpecification_esRequest 1
+#define Z_ESExportSpecification_taskPackage 2
+	} u;
+};
+
+struct Z_ESOriginPartToKeep {
+	Z_CompSpec *composition;
+	Z_ESDestination *exportDestination;
+};
+
+struct Z_ESDestinationOther {
+	Z_InternationalString *vehicle; /* OPT */
+	Z_InternationalString *destination;
+};
+
+struct Z_ESDestination {
+	int which;
+	union {
+		Z_InternationalString *phoneNumber;
+		Z_InternationalString *faxNumber;
+		Z_InternationalString *x400address;
+		Z_InternationalString *emailAddress;
+		Z_InternationalString *pagerNumber;
+		Z_InternationalString *ftpAddress;
+		Z_InternationalString *ftamAddress;
+		Z_InternationalString *printerAddress;
+		Z_ESDestinationOther *other;
+#define Z_ESDestination_phoneNumber 1
+#define Z_ESDestination_faxNumber 2
+#define Z_ESDestination_x400address 3
+#define Z_ESDestination_emailAddress 4
+#define Z_ESDestination_pagerNumber 5
+#define Z_ESDestination_ftpAddress 6
+#define Z_ESDestination_ftamAddress 7
+#define Z_ESDestination_printerAddress 8
+#define Z_ESDestination_other 9
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-order.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-order.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-order.h	(revision 21083)
@@ -0,0 +1,132 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-ItemOrder */
+
+#ifndef zes_order_H
+#define zes_order_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_IORequest Z_IORequest;
+YAZ_EXPORT int z_IORequest (ODR o, Z_IORequest **p, int opt, const char *name);
+
+typedef struct Z_IOTaskPackage Z_IOTaskPackage;
+YAZ_EXPORT int z_IOTaskPackage (ODR o, Z_IOTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_IOItemOrder Z_IOItemOrder;
+YAZ_EXPORT int z_IOItemOrder (ODR o, Z_IOItemOrder **p, int opt, const char *name);
+
+typedef struct Z_IOContact Z_IOContact;
+YAZ_EXPORT int z_IOContact (ODR o, Z_IOContact **p, int opt, const char *name);
+
+typedef struct Z_IOBilling Z_IOBilling;
+YAZ_EXPORT int z_IOBilling (ODR o, Z_IOBilling **p, int opt, const char *name);
+
+typedef struct Z_IOOriginPartToKeep Z_IOOriginPartToKeep;
+YAZ_EXPORT int z_IOOriginPartToKeep (ODR o, Z_IOOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_IOCreditCardInfo Z_IOCreditCardInfo;
+YAZ_EXPORT int z_IOCreditCardInfo (ODR o, Z_IOCreditCardInfo **p, int opt, const char *name);
+
+typedef struct Z_IOResultSetItem Z_IOResultSetItem;
+YAZ_EXPORT int z_IOResultSetItem (ODR o, Z_IOResultSetItem **p, int opt, const char *name);
+
+typedef struct Z_IOOriginPartNotToKeep Z_IOOriginPartNotToKeep;
+YAZ_EXPORT int z_IOOriginPartNotToKeep (ODR o, Z_IOOriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_IOTargetPart Z_IOTargetPart;
+YAZ_EXPORT int z_IOTargetPart (ODR o, Z_IOTargetPart **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_IORequest {
+	Z_IOOriginPartToKeep *toKeep; /* OPT */
+	Z_IOOriginPartNotToKeep *notToKeep;
+};
+
+struct Z_IOTaskPackage {
+	Z_IOOriginPartToKeep *originPart; /* OPT */
+	Z_IOTargetPart *targetPart;
+};
+
+struct Z_IOItemOrder {
+	int which;
+	union {
+		Z_IORequest *esRequest;
+		Z_IOTaskPackage *taskPackage;
+#define Z_IOItemOrder_esRequest 1
+#define Z_IOItemOrder_taskPackage 2
+	} u;
+};
+
+struct Z_IOContact {
+	Z_InternationalString *name; /* OPT */
+	Z_InternationalString *phone; /* OPT */
+	Z_InternationalString *email; /* OPT */
+};
+
+struct Z_IOBilling {
+	int which;
+	union {
+		Odr_null *billInvoice;
+		Odr_null *prepay;
+		Odr_null *depositAccount;
+		Z_IOCreditCardInfo *creditCard;
+		Odr_null *cardInfoPreviouslySupplied;
+		Odr_null *privateKnown;
+		Z_External *privateNotKnown;
+#define Z_IOBilling_billInvoice 1
+#define Z_IOBilling_prepay 2
+#define Z_IOBilling_depositAccount 3
+#define Z_IOBilling_creditCard 4
+#define Z_IOBilling_cardInfoPreviouslySupplied 5
+#define Z_IOBilling_privateKnown 6
+#define Z_IOBilling_privateNotKnown 7
+	} u;
+	Z_InternationalString *customerReference; /* OPT */
+	Z_InternationalString *customerPONumber; /* OPT */
+};
+
+struct Z_IOOriginPartToKeep {
+	Z_External *supplDescription; /* OPT */
+	Z_IOContact *contact; /* OPT */
+	Z_IOBilling *addlBilling; /* OPT */
+};
+
+struct Z_IOCreditCardInfo {
+	Z_InternationalString *nameOnCard;
+	Z_InternationalString *expirationDate;
+	Z_InternationalString *cardNumber;
+};
+
+struct Z_IOResultSetItem {
+	Z_InternationalString *resultSetId;
+	int *item;
+};
+
+struct Z_IOOriginPartNotToKeep {
+	Z_IOResultSetItem *resultSetItem; /* OPT */
+	Z_External *itemRequest; /* OPT */
+};
+
+struct Z_IOTargetPart {
+	Z_External *itemRequest; /* OPT */
+	Z_External *statusOrErrorReport; /* OPT */
+#define Z_IOTargetPart_notReceived 1
+#define Z_IOTargetPart_loanQueue 2
+#define Z_IOTargetPart_forwarded 3
+#define Z_IOTargetPart_unfilledCopyright 4
+#define Z_IOTargetPart_filledCopyright 5
+	int *auxiliaryStatus; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pquery.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pquery.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pquery.h	(revision 21083)
@@ -0,0 +1,77 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-PersistentQuery */
+
+#ifndef zes_pquery_H
+#define zes_pquery_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_PQueryPersistentQueryEsRequest Z_PQueryPersistentQueryEsRequest;
+YAZ_EXPORT int z_PQueryPersistentQueryEsRequest (ODR o, Z_PQueryPersistentQueryEsRequest **p, int opt, const char *name);
+
+typedef struct Z_PQueryPersistentQueryTaskPackage Z_PQueryPersistentQueryTaskPackage;
+YAZ_EXPORT int z_PQueryPersistentQueryTaskPackage (ODR o, Z_PQueryPersistentQueryTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_PQueryPersistentQuery Z_PQueryPersistentQuery;
+YAZ_EXPORT int z_PQueryPersistentQuery (ODR o, Z_PQueryPersistentQuery **p, int opt, const char *name);
+
+typedef struct Z_PQueryOriginPartToKeep Z_PQueryOriginPartToKeep;
+YAZ_EXPORT int z_PQueryOriginPartToKeep (ODR o, Z_PQueryOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_PQueryOriginPartNotToKeep Z_PQueryOriginPartNotToKeep;
+YAZ_EXPORT int z_PQueryOriginPartNotToKeep (ODR o, Z_PQueryOriginPartNotToKeep **p, int opt, const char *name);
+
+typedef Z_Query  Z_PQueryTargetPart;
+YAZ_EXPORT int z_PQueryTargetPart (ODR o, Z_PQueryTargetPart **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_PQueryPersistentQueryEsRequest {
+	Z_PQueryOriginPartToKeep *toKeep; /* OPT */
+	Z_PQueryOriginPartNotToKeep *notToKeep;
+};
+
+struct Z_PQueryPersistentQueryTaskPackage {
+	Z_PQueryOriginPartToKeep *originPart; /* OPT */
+	Z_PQueryTargetPart *targetPart;
+};
+
+struct Z_PQueryPersistentQuery {
+	int which;
+	union {
+		Z_PQueryPersistentQueryEsRequest *esRequest;
+		Z_PQueryPersistentQueryTaskPackage *taskPackage;
+#define Z_PQueryPersistentQuery_esRequest 1
+#define Z_PQueryPersistentQuery_taskPackage 2
+	} u;
+};
+
+struct Z_PQueryOriginPartToKeep {
+	int num_dbNames;
+	Z_InternationalString **dbNames; /* OPT */
+	Z_OtherInformation *additionalSearchInfo; /* OPT */
+};
+
+struct Z_PQueryOriginPartNotToKeep {
+	int which;
+	union {
+		Z_InternationalString *package;
+		Z_Query *query;
+#define Z_PQueryOriginPartNotToKeep_package 1
+#define Z_PQueryOriginPartNotToKeep_query 2
+	} u;
+};
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-psched.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-psched.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-psched.h	(revision 21083)
@@ -0,0 +1,118 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-PeriodicQuerySchedule */
+
+#ifndef zes_psched_H
+#define zes_psched_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#include <yaz/zes-exps.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_PQSPeriodicQueryScheduleEsRequest Z_PQSPeriodicQueryScheduleEsRequest;
+YAZ_EXPORT int z_PQSPeriodicQueryScheduleEsRequest (ODR o, Z_PQSPeriodicQueryScheduleEsRequest **p, int opt, const char *name);
+
+typedef struct Z_PQSPeriodicQueryScheduleTaskPackage Z_PQSPeriodicQueryScheduleTaskPackage;
+YAZ_EXPORT int z_PQSPeriodicQueryScheduleTaskPackage (ODR o, Z_PQSPeriodicQueryScheduleTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_PQSPeriodicQuerySchedule Z_PQSPeriodicQuerySchedule;
+YAZ_EXPORT int z_PQSPeriodicQuerySchedule (ODR o, Z_PQSPeriodicQuerySchedule **p, int opt, const char *name);
+
+typedef struct Z_PQSOriginPartToKeep Z_PQSOriginPartToKeep;
+YAZ_EXPORT int z_PQSOriginPartToKeep (ODR o, Z_PQSOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_PQSOriginPartNotToKeep Z_PQSOriginPartNotToKeep;
+YAZ_EXPORT int z_PQSOriginPartNotToKeep (ODR o, Z_PQSOriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_PQSTargetPart Z_PQSTargetPart;
+YAZ_EXPORT int z_PQSTargetPart (ODR o, Z_PQSTargetPart **p, int opt, const char *name);
+
+typedef struct Z_PQSPeriod Z_PQSPeriod;
+YAZ_EXPORT int z_PQSPeriod (ODR o, Z_PQSPeriod **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_PQSPeriodicQueryScheduleEsRequest {
+	Z_PQSOriginPartToKeep *toKeep;
+	Z_PQSOriginPartNotToKeep *notToKeep;
+};
+
+struct Z_PQSPeriodicQueryScheduleTaskPackage {
+	Z_PQSOriginPartToKeep *originPart;
+	Z_PQSTargetPart *targetPart;
+};
+
+struct Z_PQSPeriodicQuerySchedule {
+	int which;
+	union {
+		Z_PQSPeriodicQueryScheduleEsRequest *esRequest;
+		Z_PQSPeriodicQueryScheduleTaskPackage *taskPackage;
+#define Z_PQSPeriodicQuerySchedule_esRequest 1
+#define Z_PQSPeriodicQuerySchedule_taskPackage 2
+	} u;
+};
+
+struct Z_PQSOriginPartToKeep {
+	bool_t *activeFlag;
+	int num_databaseNames;
+	Z_InternationalString **databaseNames; /* OPT */
+#define Z_PQSOriginPartToKeep_replace 1
+#define Z_PQSOriginPartToKeep_append 2
+#define Z_PQSOriginPartToKeep_createNew 3
+	int *resultSetDisposition; /* OPT */
+	Z_ESDestination *alertDestination; /* OPT */
+	int which;
+	union {
+		Z_InternationalString *packageName;
+		Z_ESExportSpecification *exportPackage;
+#define Z_PQSOriginPartToKeep_packageName 1
+#define Z_PQSOriginPartToKeep_exportPackage 2
+	} u; /* OPT */
+};
+
+struct Z_PQSOriginPartNotToKeep {
+	int which;
+	union {
+		Z_Query *actualQuery;
+		Z_InternationalString *packageName;
+#define Z_PQSOriginPartNotToKeep_actualQuery 1
+#define Z_PQSOriginPartNotToKeep_packageName 2
+	} u; /* OPT */
+	Z_PQSPeriod *originSuggestedPeriod; /* OPT */
+	char *expiration; /* OPT */
+	Z_InternationalString *resultSetPackage; /* OPT */
+};
+
+struct Z_PQSTargetPart {
+	Z_Query *actualQuery;
+	Z_PQSPeriod *targetStatedPeriod;
+	char *expiration; /* OPT */
+	Z_InternationalString *resultSetPackage; /* OPT */
+	char *lastQueryTime;
+	int *lastResultNumber;
+	int *numberSinceModify; /* OPT */
+};
+
+struct Z_PQSPeriod {
+	int which;
+	union {
+		Z_IntUnit *unit;
+		Odr_null *businessDaily;
+		Odr_null *continuous;
+		Z_InternationalString *other;
+#define Z_PQSPeriod_unit 1
+#define Z_PQSPeriod_businessDaily 2
+#define Z_PQSPeriod_continuous 3
+#define Z_PQSPeriod_other 4
+	} u;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pset.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pset.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-pset.h	(revision 21083)
@@ -0,0 +1,68 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-PersistentResultSet */
+
+#ifndef zes_pset_H
+#define zes_pset_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_PRPersistentResultSetEsRequest Z_PRPersistentResultSetEsRequest;
+YAZ_EXPORT int z_PRPersistentResultSetEsRequest (ODR o, Z_PRPersistentResultSetEsRequest **p, int opt, const char *name);
+
+typedef struct Z_PRPersistentResultSetTaskPackage Z_PRPersistentResultSetTaskPackage;
+YAZ_EXPORT int z_PRPersistentResultSetTaskPackage (ODR o, Z_PRPersistentResultSetTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_PRPersistentResultSet Z_PRPersistentResultSet;
+YAZ_EXPORT int z_PRPersistentResultSet (ODR o, Z_PRPersistentResultSet **p, int opt, const char *name);
+
+typedef struct Z_PROriginPartNotToKeep Z_PROriginPartNotToKeep;
+YAZ_EXPORT int z_PROriginPartNotToKeep (ODR o, Z_PROriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_PRTargetPart Z_PRTargetPart;
+YAZ_EXPORT int z_PRTargetPart (ODR o, Z_PRTargetPart **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_PRPersistentResultSetEsRequest {
+	Odr_null *toKeep;
+	Z_PROriginPartNotToKeep *notToKeep; /* OPT */
+};
+
+struct Z_PRPersistentResultSetTaskPackage {
+	Odr_null *originPart;
+	Z_PRTargetPart *targetPart; /* OPT */
+};
+
+struct Z_PRPersistentResultSet {
+	int which;
+	union {
+		Z_PRPersistentResultSetEsRequest *esRequest;
+		Z_PRPersistentResultSetTaskPackage *taskPackage;
+#define Z_PRPersistentResultSet_esRequest 1
+#define Z_PRPersistentResultSet_taskPackage 2
+	} u;
+};
+
+struct Z_PROriginPartNotToKeep {
+	Z_InternationalString *originSuppliedResultSet; /* OPT */
+#define Z_PROriginPartNotToKeep_replace 1
+#define Z_PROriginPartNotToKeep_append 2
+	int *replaceOrAppend; /* OPT */
+};
+
+struct Z_PRTargetPart {
+	Z_InternationalString *targetSuppliedResultSet; /* OPT */
+	int *numberOfRecords; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update.h	(revision 21083)
@@ -0,0 +1,163 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-Update */
+
+#ifndef zes_update_H
+#define zes_update_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_IUUpdateEsRequest Z_IUUpdateEsRequest;
+YAZ_EXPORT int z_IUUpdateEsRequest (ODR o, Z_IUUpdateEsRequest **p, int opt, const char *name);
+
+typedef struct Z_IUUpdateTaskPackage Z_IUUpdateTaskPackage;
+YAZ_EXPORT int z_IUUpdateTaskPackage (ODR o, Z_IUUpdateTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_IUUpdate Z_IUUpdate;
+YAZ_EXPORT int z_IUUpdate (ODR o, Z_IUUpdate **p, int opt, const char *name);
+
+typedef struct Z_IUOriginPartToKeep Z_IUOriginPartToKeep;
+YAZ_EXPORT int z_IUOriginPartToKeep (ODR o, Z_IUOriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_IUTargetPart Z_IUTargetPart;
+YAZ_EXPORT int z_IUTargetPart (ODR o, Z_IUTargetPart **p, int opt, const char *name);
+
+typedef struct Z_IUSuppliedRecordsId Z_IUSuppliedRecordsId;
+YAZ_EXPORT int z_IUSuppliedRecordsId (ODR o, Z_IUSuppliedRecordsId **p, int opt, const char *name);
+
+typedef struct Z_IUSuppliedRecords_elem Z_IUSuppliedRecords_elem;
+YAZ_EXPORT int z_IUSuppliedRecords_elem (ODR o, Z_IUSuppliedRecords_elem **p, int opt, const char *name);
+
+typedef struct Z_IUSuppliedRecords Z_IUSuppliedRecords;
+YAZ_EXPORT int z_IUSuppliedRecords (ODR o, Z_IUSuppliedRecords **p, int opt, const char *name);
+
+typedef Z_IUSuppliedRecords  Z_IUOriginPartNotToKeep;
+YAZ_EXPORT int z_IUOriginPartNotToKeep (ODR o, Z_IUOriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_IUCorrelationInfo Z_IUCorrelationInfo;
+YAZ_EXPORT int z_IUCorrelationInfo (ODR o, Z_IUCorrelationInfo **p, int opt, const char *name);
+
+typedef struct Z_IUTaskPackageRecordStructureSurrogateDiagnostics Z_IUTaskPackageRecordStructureSurrogateDiagnostics;
+YAZ_EXPORT int z_IUTaskPackageRecordStructureSurrogateDiagnostics (ODR o, Z_IUTaskPackageRecordStructureSurrogateDiagnostics **p, int opt, const char *name);
+
+typedef struct Z_IUTaskPackageRecordStructure Z_IUTaskPackageRecordStructure;
+YAZ_EXPORT int z_IUTaskPackageRecordStructure (ODR o, Z_IUTaskPackageRecordStructure **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_IUUpdateEsRequest {
+	Z_IUOriginPartToKeep *toKeep;
+	Z_IUOriginPartNotToKeep *notToKeep;
+};
+
+struct Z_IUUpdateTaskPackage {
+	Z_IUOriginPartToKeep *originPart;
+	Z_IUTargetPart *targetPart;
+};
+
+struct Z_IUUpdate {
+	int which;
+	union {
+		Z_IUUpdateEsRequest *esRequest;
+		Z_IUUpdateTaskPackage *taskPackage;
+#define Z_IUUpdate_esRequest 1
+#define Z_IUUpdate_taskPackage 2
+	} u;
+};
+
+struct Z_IUOriginPartToKeep {
+#define Z_IUOriginPartToKeep_recordInsert 1
+#define Z_IUOriginPartToKeep_recordReplace 2
+#define Z_IUOriginPartToKeep_recordDelete 3
+#define Z_IUOriginPartToKeep_elementUpdate 4
+#define Z_IUOriginPartToKeep_specialUpdate 5
+	int *action;
+	Z_InternationalString *databaseName;
+	Odr_oid *schema; /* OPT */
+	Z_InternationalString *elementSetName; /* OPT */
+	Z_External *actionQualifier; /* OPT */
+};
+
+
+
+struct Z_IUTargetPart {
+#define Z_IUTargetPart_success 1
+#define Z_IUTargetPart_partial 2
+#define Z_IUTargetPart_failure 3
+	int *updateStatus;
+	int num_globalDiagnostics;
+	Z_DiagRec **globalDiagnostics; /* OPT */
+	int num_taskPackageRecords;
+	Z_IUTaskPackageRecordStructure **taskPackageRecords;
+};
+
+struct Z_IUSuppliedRecordsId {
+	int which;
+	union {
+		char *timeStamp;
+		Z_InternationalString *versionNumber;
+		Z_External *previousVersion;
+#define Z_IUSuppliedRecordsId_timeStamp 1
+#define Z_IUSuppliedRecordsId_versionNumber 2
+#define Z_IUSuppliedRecordsId_previousVersion 3
+	} u;
+};
+
+struct Z_IUSuppliedRecords_elem {
+	int which;
+	union {
+		int *number;
+		Z_InternationalString *string;
+		Odr_oct *opaque;
+#define Z_IUSuppliedRecords_elem_number 1
+#define Z_IUSuppliedRecords_elem_string 2
+#define Z_IUSuppliedRecords_elem_opaque 3
+	} u; /* OPT */
+	Z_IUSuppliedRecordsId *supplementalId; /* OPT */
+	Z_IUCorrelationInfo *correlationInfo; /* OPT */
+	Z_External *record;
+};
+
+struct Z_IUSuppliedRecords {
+	int num;
+	Z_IUSuppliedRecords_elem **elements;
+};
+
+struct Z_IUCorrelationInfo {
+	Z_InternationalString *note; /* OPT */
+	int *id; /* OPT */
+};
+
+struct Z_IUTaskPackageRecordStructureSurrogateDiagnostics {
+	int num;
+	Z_DiagRec **elements;
+};
+
+struct Z_IUTaskPackageRecordStructure {
+	int which;
+	union {
+		Z_External *record;
+		Z_IUTaskPackageRecordStructureSurrogateDiagnostics *surrogateDiagnostics;
+#define Z_IUTaskPackageRecordStructure_record 1
+#define Z_IUTaskPackageRecordStructure_surrogateDiagnostics 2
+	} u; /* OPT */
+	Z_IUCorrelationInfo *correlationInfo; /* OPT */
+#define Z_IUTaskPackageRecordStructure_success 1
+#define Z_IUTaskPackageRecordStructure_queued 2
+#define Z_IUTaskPackageRecordStructure_inProcess 3
+#define Z_IUTaskPackageRecordStructure_failure 4
+	int *recordStatus;
+	int num_supplementalDiagnostics;
+	Z_DiagRec **supplementalDiagnostics; /* OPT */
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update0.h
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update0.h	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/include/yaz/zes-update0.h	(revision 21083)
@@ -0,0 +1,151 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-H ESFormat-Update0 */
+
+#ifndef zes_update0_H
+#define zes_update0_H
+
+#include <yaz/odr.h>
+#include <yaz/z-core.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct Z_IU0UpdateEsRequest Z_IU0UpdateEsRequest;
+YAZ_EXPORT int z_IU0UpdateEsRequest (ODR o, Z_IU0UpdateEsRequest **p, int opt, const char *name);
+
+typedef struct Z_IU0UpdateTaskPackage Z_IU0UpdateTaskPackage;
+YAZ_EXPORT int z_IU0UpdateTaskPackage (ODR o, Z_IU0UpdateTaskPackage **p, int opt, const char *name);
+
+typedef struct Z_IU0Update Z_IU0Update;
+YAZ_EXPORT int z_IU0Update (ODR o, Z_IU0Update **p, int opt, const char *name);
+
+typedef struct Z_IU0OriginPartToKeep Z_IU0OriginPartToKeep;
+YAZ_EXPORT int z_IU0OriginPartToKeep (ODR o, Z_IU0OriginPartToKeep **p, int opt, const char *name);
+
+typedef struct Z_IU0TargetPart Z_IU0TargetPart;
+YAZ_EXPORT int z_IU0TargetPart (ODR o, Z_IU0TargetPart **p, int opt, const char *name);
+
+typedef struct Z_IU0SuppliedRecordsId Z_IU0SuppliedRecordsId;
+YAZ_EXPORT int z_IU0SuppliedRecordsId (ODR o, Z_IU0SuppliedRecordsId **p, int opt, const char *name);
+
+typedef struct Z_IU0SuppliedRecords_elem Z_IU0SuppliedRecords_elem;
+YAZ_EXPORT int z_IU0SuppliedRecords_elem (ODR o, Z_IU0SuppliedRecords_elem **p, int opt, const char *name);
+
+typedef struct Z_IU0SuppliedRecords Z_IU0SuppliedRecords;
+YAZ_EXPORT int z_IU0SuppliedRecords (ODR o, Z_IU0SuppliedRecords **p, int opt, const char *name);
+
+typedef Z_IU0SuppliedRecords  Z_IU0OriginPartNotToKeep;
+YAZ_EXPORT int z_IU0OriginPartNotToKeep (ODR o, Z_IU0OriginPartNotToKeep **p, int opt, const char *name);
+
+typedef struct Z_IU0CorrelationInfo Z_IU0CorrelationInfo;
+YAZ_EXPORT int z_IU0CorrelationInfo (ODR o, Z_IU0CorrelationInfo **p, int opt, const char *name);
+
+typedef struct Z_IU0TaskPackageRecordStructure Z_IU0TaskPackageRecordStructure;
+YAZ_EXPORT int z_IU0TaskPackageRecordStructure (ODR o, Z_IU0TaskPackageRecordStructure **p, int opt, const char *name);
+#ifdef __cplusplus
+}
+#endif
+#ifdef __cplusplus
+extern "C" {
+#endif
+struct Z_IU0UpdateEsRequest {
+	Z_IU0OriginPartToKeep *toKeep;
+	Z_IU0OriginPartNotToKeep *notToKeep;
+};
+
+struct Z_IU0UpdateTaskPackage {
+	Z_IU0OriginPartToKeep *originPart;
+	Z_IU0TargetPart *targetPart;
+};
+
+struct Z_IU0Update {
+	int which;
+	union {
+		Z_IU0UpdateEsRequest *esRequest;
+		Z_IU0UpdateTaskPackage *taskPackage;
+#define Z_IU0Update_esRequest 1
+#define Z_IU0Update_taskPackage 2
+	} u;
+};
+
+struct Z_IU0OriginPartToKeep {
+#define Z_IU0OriginPartToKeep_recordInsert 1
+#define Z_IU0OriginPartToKeep_recordReplace 2
+#define Z_IU0OriginPartToKeep_recordDelete 3
+#define Z_IU0OriginPartToKeep_elementUpdate 4
+	int *action;
+	Z_InternationalString *databaseName;
+	Odr_oid *schema; /* OPT */
+	Z_InternationalString *elementSetName; /* OPT */
+};
+
+
+
+struct Z_IU0TargetPart {
+#define Z_IU0TargetPart_success 1
+#define Z_IU0TargetPart_partial 2
+#define Z_IU0TargetPart_failure 3
+	int *updateStatus;
+	int num_globalDiagnostics;
+	Z_DiagRec **globalDiagnostics; /* OPT */
+	int num_taskPackageRecords;
+	Z_IU0TaskPackageRecordStructure **taskPackageRecords;
+};
+
+struct Z_IU0SuppliedRecordsId {
+	int which;
+	union {
+		char *timeStamp;
+		Z_InternationalString *versionNumber;
+		Z_External *previousVersion;
+#define Z_IU0SuppliedRecordsId_timeStamp 1
+#define Z_IU0SuppliedRecordsId_versionNumber 2
+#define Z_IU0SuppliedRecordsId_previousVersion 3
+	} u;
+};
+
+struct Z_IU0SuppliedRecords_elem {
+	int which;
+	union {
+		int *number;
+		Z_InternationalString *string;
+		Odr_oct *opaque;
+#define Z_IU0SuppliedRecords_elem_number 1
+#define Z_IU0SuppliedRecords_elem_string 2
+#define Z_IU0SuppliedRecords_elem_opaque 3
+	} u; /* OPT */
+	Z_IU0SuppliedRecordsId *supplementalId; /* OPT */
+	Z_IU0CorrelationInfo *correlationInfo; /* OPT */
+	Z_External *record;
+};
+
+struct Z_IU0SuppliedRecords {
+	int num;
+	Z_IU0SuppliedRecords_elem **elements;
+};
+
+struct Z_IU0CorrelationInfo {
+	Z_InternationalString *note; /* OPT */
+	int *id; /* OPT */
+};
+
+struct Z_IU0TaskPackageRecordStructure {
+	int which;
+	union {
+		Z_External *record;
+		Z_DiagRec *diagnostic;
+#define Z_IU0TaskPackageRecordStructure_record 1
+#define Z_IU0TaskPackageRecordStructure_diagnostic 2
+	} u; /* OPT */
+	Z_IU0CorrelationInfo *correlationInfo; /* OPT */
+#define Z_IU0TaskPackageRecordStructure_success 1
+#define Z_IU0TaskPackageRecordStructure_queued 2
+#define Z_IU0TaskPackageRecordStructure_inProcess 3
+#define Z_IU0TaskPackageRecordStructure_failure 4
+	int *recordStatus;
+};
+
+#ifdef __cplusplus
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/install-sh
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/install-sh	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/install-sh	(revision 21083)
@@ -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
Index: /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.am	(revision 21083)
@@ -0,0 +1,34 @@
+## $Id$
+
+lib_LIBRARIES = libyaz.a
+
+bin_SCRIPTS = yaz-config
+
+libyaz_a_SOURCES=
+
+LIB=libyaz.a
+
+YAZLIBS=../odr/libodr.a ../@ASNMODULE@/libasn.a ../comstack/libcomstack.a \
+ ../server/libserver.a ../zutil/libzutil.a ../util/libutil.a \
+ ../ccl/libccl.a ../retrieval/libret.a @ILLLIB@
+
+libyaz.a: $(YAZLIBS)
+	rm -f $(LIB)
+	for i in $(YAZLIBS); do echo $$i; ar x $$i; rm -f __*; done
+	ar qc $(LIB) *.o
+	rm -f *.o
+	$(RANLIB) $(LIB)
+
+#  Public libraries and header files
+LIBDIR=$(exec_prefix)/lib
+INCDIR=$(prefix)/include
+
+yaz-config: Makefile
+	@echo "#!/bin/sh" >yaz-config
+	@echo "# YAZ settings for developers" >>yaz-config
+	@echo "YAZBIN='$(bindir)'" >>yaz-config
+	@echo "YAZTAB='$(pkgdatadir)/tab'" >>yaz-config
+	@echo "YAZLIB='-L$(libdir) -lyaz $(LIBS)'" >>yaz-config
+	@echo "YAZINC='-I$(includedir)'" >>yaz-config
+	chmod +x yaz-config
+
Index: /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/lib/Makefile.in	(revision 21083)
@@ -0,0 +1,300 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+lib_LIBRARIES = libyaz.a
+
+bin_SCRIPTS = yaz-config
+
+libyaz_a_SOURCES = 
+
+LIB = libyaz.a
+
+# removed: ../server/libserver.a ../retrieval/libret.a @ILLLIB@
+YAZLIBS = ../odr/libodr.a ../@ASNMODULE@/libasn.a ../comstack/libcomstack.a   ../zutil/libzutil.a ../util/libutil.a  ../ccl/libccl.a
+
+
+#  Public libraries and header files
+LIBDIR = $(exec_prefix)/lib
+INCDIR = $(prefix)/include
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(lib_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libyaz_a_LIBADD = 
+libyaz_a_OBJECTS = 
+AR = ar
+SCRIPTS =  $(bin_SCRIPTS)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+GZIP_ENV = --best
+SOURCES = $(libyaz_a_SOURCES)
+OBJECTS = $(libyaz_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps lib/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+mostlyclean-libLIBRARIES:
+
+clean-libLIBRARIES:
+	-test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES)
+
+distclean-libLIBRARIES:
+
+maintainer-clean-libLIBRARIES:
+
+install-libLIBRARIES: $(lib_LIBRARIES)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(libdir)
+	@list='$(lib_LIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p"; \
+	    $(INSTALL_DATA) $$p $(DESTDIR)$(libdir)/$$p; \
+	  else :; fi; \
+	done
+	@$(POST_INSTALL)
+	@list='$(lib_LIBRARIES)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(RANLIB) $(DESTDIR)$(libdir)/$$p"; \
+	    $(RANLIB) $(DESTDIR)$(libdir)/$$p; \
+	  else :; fi; \
+	done
+
+uninstall-libLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	list='$(lib_LIBRARIES)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(libdir)/$$p; \
+	done
+
+.c.o:
+	$(COMPILE) -c $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(bindir)
+	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	  else if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	  else :; fi; fi; \
+	done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	list='$(bin_SCRIPTS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = lib
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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-libLIBRARIES install-binSCRIPTS
+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-libLIBRARIES uninstall-binSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(libdir) $(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:
+mostlyclean-am:  mostlyclean-libLIBRARIES mostlyclean-compile \
+		mostlyclean-generic
+
+mostlyclean: mostlyclean-am
+
+clean-am:  clean-libLIBRARIES clean-compile clean-generic mostlyclean-am
+
+clean: clean-am
+
+distclean-am:  distclean-libLIBRARIES distclean-compile \
+		distclean-generic clean-am
+
+distclean: distclean-am
+
+maintainer-clean-am:  maintainer-clean-libLIBRARIES \
+		maintainer-clean-compile 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-libLIBRARIES distclean-libLIBRARIES \
+clean-libLIBRARIES maintainer-clean-libLIBRARIES uninstall-libLIBRARIES \
+install-libLIBRARIES mostlyclean-compile distclean-compile \
+clean-compile maintainer-clean-compile uninstall-binSCRIPTS \
+install-binSCRIPTS 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
+
+
+libyaz.a: $(YAZLIBS)
+	rm -f $(LIB)
+	for i in $(YAZLIBS); do echo $$i; ar x $$i; rm -f __*; done
+	ar qc $(LIB) *.o
+	rm -f *.o
+	$(RANLIB) $(LIB)
+
+yaz-config: Makefile
+	@echo "#!/bin/sh" >yaz-config
+	@echo "# YAZ settings for developers" >>yaz-config
+	@echo "YAZBIN='$(bindir)'" >>yaz-config
+	@echo "YAZTAB='$(pkgdatadir)/tab'" >>yaz-config
+	@echo "YAZLIB='-L$(libdir) -lyaz $(LIBS)'" >>yaz-config
+	@echo "YAZINC='-I$(includedir)'" >>yaz-config
+	chmod +x yaz-config
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/lib/yaz-config
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/lib/yaz-config	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/lib/yaz-config	(revision 21083)
@@ -0,0 +1,6 @@
+#!/bin/sh
+# YAZ settings for developers
+YAZBIN='/usr/local/bin'
+YAZTAB='/usr/local/share/yaz/tab'
+YAZLIB='-L/usr/local/lib -lyaz -lreadline -lhistory'
+YAZINC='-I/usr/local/include'
Index: /main/tags/2.38/gsdl/packages/yaz/missing
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/missing	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/missing	(revision 21083)
@@ -0,0 +1,190 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+# Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+# Franc,ois Pinard <pinard@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`
+    test -z "$files" && files="config.h"
+    touch_files=
+    for f in $files; do
+      case "$f" in
+      *:*) touch_files="$touch_files "`echo "$f" |
+				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+      *) touch_files="$touch_files $f.in";;
+      esac
+    done
+    touch $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$/.in/' |
+	   while read f; do touch "$f"; done
+    ;;
+
+  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
Index: /main/tags/2.38/gsdl/packages/yaz/mkinstalldirs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/mkinstalldirs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/mkinstalldirs	(revision 21083)
@@ -0,0 +1,39 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+
+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"
+
+        mkdir "$pathcomp" || lasterr=$?
+
+        if test ! -d "$pathcomp"; then
+  	  errstatus=$lasterr
+        fi
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
Index: /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.am	(revision 21083)
@@ -0,0 +1,12 @@
+## $Id$
+
+noinst_LIBRARIES = libodr.a
+
+INCLUDES=-I../include
+
+libodr_a_SOURCES = odr_bool.c ber_bool.c ber_len.c ber_tag.c odr_util.c \
+        odr_null.c ber_null.c odr_int.c ber_int.c odr_tag.c odr_cons.c \
+        odr_seq.c odr_oct.c ber_oct.c odr_bit.c ber_bit.c odr_oid.c \
+        ber_oid.c odr_use.c odr_choice.c odr_any.c ber_any.c odr.c odr_mem.c \
+        dumpber.c odr_enum.c
+
Index: /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/Makefile.in	(revision 21083)
@@ -0,0 +1,270 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libodr.a
+
+INCLUDES = -I../include
+
+libodr_a_SOURCES = odr_bool.c ber_bool.c ber_len.c ber_tag.c odr_util.c         odr_null.c ber_null.c odr_int.c ber_int.c odr_tag.c odr_cons.c         odr_seq.c odr_oct.c ber_oct.c odr_bit.c ber_bit.c odr_oid.c         ber_oid.c odr_use.c odr_choice.c odr_any.c ber_any.c odr.c odr_mem.c         dumpber.c odr_enum.c
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libodr_a_LIBADD = 
+libodr_a_OBJECTS =  odr_bool.o ber_bool.o ber_len.o ber_tag.o odr_util.o \
+odr_null.o ber_null.o odr_int.o ber_int.o odr_tag.o odr_cons.o \
+odr_seq.o odr_oct.o ber_oct.o odr_bit.o ber_bit.o odr_oid.o ber_oid.o \
+odr_use.o odr_choice.o odr_any.o ber_any.o odr.o odr_mem.o dumpber.o \
+odr_enum.o
+AR = ar
+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 = tar
+GZIP_ENV = --best
+SOURCES = $(libodr_a_SOURCES)
+OBJECTS = $(libodr_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps odr/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libodr.a: $(libodr_a_OBJECTS) $(libodr_a_DEPENDENCIES)
+	-rm -f libodr.a
+	$(AR) cru libodr.a $(libodr_a_OBJECTS) $(libodr_a_LIBADD)
+	$(RANLIB) libodr.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 = odr
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
+
+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
+
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_any.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_any.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_any.c	(revision 21083)
@@ -0,0 +1,139 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:12  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.18  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.17  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.16  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.15  1999/01/08 11:23:20  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.14  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.13  1997/05/14 06:53:56  adam
+ * C++ support.
+ *
+ * Revision 1.12  1995/09/29 17:12:15  quinn
+ * Smallish
+ *
+ * Revision 1.11  1995/09/27  15:02:54  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.10  1995/05/16  08:50:42  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.9  1995/04/18  08:15:12  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.8  1995/04/17  09:37:42  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.7  1995/03/17  10:17:39  quinn
+ * Added memory management.
+ *
+ * Revision 1.6  1995/03/08  12:12:02  quinn
+ * Added better error checking.
+ *
+ * Revision 1.5  1995/02/14  20:39:54  quinn
+ * Fixed bugs in completeBER and (serious one in) ber_oid.
+ *
+ * Revision 1.4  1995/02/14  11:54:33  quinn
+ * Adjustments.
+ *
+ * Revision 1.3  1995/02/10  18:57:24  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.2  1995/02/10  15:55:28  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.1  1995/02/09  15:51:45  quinn
+ * Works better now.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <yaz/odr.h>
+
+int ber_any(ODR o, Odr_any **p)
+{
+    int res;
+    int left = o->size - (o->bp - o->buf);
+
+    switch (o->direction)
+    {
+    	case ODR_DECODE:
+	    if ((res = completeBER(o->bp, left)) <= 0)        /* FIX THIS */
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+	    (*p)->buf = (unsigned char *)odr_malloc(o, res);
+	    memcpy((*p)->buf, o->bp, res);
+	    (*p)->len = (*p)->size = res;
+	    o->bp += res;
+	    return 1;
+    	case ODR_ENCODE:
+	    if (odr_write(o, (*p)->buf, (*p)->len) < 0)
+	    	return 0;
+	    return 1;
+    	default: o->error = OOTHER; return 0;
+    }
+}
+
+/*
+ * Return length of BER-package or 0.
+ */
+int completeBER(const unsigned char *buf, int len)
+{
+    int res, ll, zclass, tag, cons;
+    const unsigned char *b = buf;
+    
+    if (!len)
+    	return 0;
+    if (!buf[0] && !buf[1])
+    	return 0;
+    if ((res = ber_dectag(b, &zclass, &tag, &cons)) <= 0)
+    	return 0;
+    if (res > len)
+    	return 0;
+    b += res;
+    len -= res;
+    if ((res = ber_declen(b, &ll)) <= 0)
+    	return 0;
+    if (res > len)
+    	return 0;
+    b += res;
+    len -= res;
+    if (ll >= 0)
+    	return (len >= ll ? ll + (b-buf) : 0);
+    if (!cons)
+    	return 0;    
+    /* constructed - cycle through children */
+    while (len >= 2)
+    {
+	if (*b == 0 && *(b + 1) == 0)
+	    break;
+	if (!(res = completeBER(b, len)))
+	    return 0;
+	b += res;
+	len -= res;
+    }
+    if (len < 2)
+    	return 0;
+    return (b - buf) + 2;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_bit.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_bit.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_bit.c	(revision 21083)
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:12  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.12  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.11  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.10  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.8  1999/01/08 11:23:21  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.7  1995/09/29 17:12:16  quinn
+ * Smallish
+ *
+ * Revision 1.6  1995/09/27  15:02:54  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.5  1995/05/16  08:50:43  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.4  1995/04/18  08:15:13  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.3  1995/03/08  12:12:04  quinn
+ * Added better error checking.
+ *
+ * Revision 1.2  1995/02/03  17:04:31  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.1  1995/02/02  20:38:49  quinn
+ * Updates.
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int ber_bitstring(ODR o, Odr_bitmask *p, int cons)
+{
+    int res, len;
+    const unsigned char *base;
+
+    switch (o->direction)
+    {
+    	case ODR_DECODE:
+	    if ((res = ber_declen(o->bp, &len)) < 0)
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+	    o->bp += res;
+	    if (cons)       /* fetch component strings */
+	    {
+	    	base = o->bp;
+	    	while (odp_more_chunks(o, base, len))
+		    if (!odr_bitstring(o, &p, 0, 0))
+		    	return 0;
+		return 1;
+	    }
+	    /* primitive bitstring */
+	    if (len < 0)
+	    {
+	    	o->error = OOTHER;
+	    	return 0;
+	    }
+	    if (len == 0)
+	    	return 1;
+	    if (len - 1 > ODR_BITMASK_SIZE)
+	    {
+	    	o->error = OOTHER;
+	    	return 0;
+	    }
+	    o->bp++;      /* silently ignore the unused-bits field */
+	    len--;
+	    memcpy(p->bits + p->top + 1, o->bp, len);
+	    p->top += len;
+	    o->bp += len;
+	    return 1;
+    	case ODR_ENCODE:
+	    if ((res = ber_enclen(o, p->top + 2, 5, 0)) < 0)
+	    	return 0;
+	    if (odr_putc(o, 0) < 0)    /* no unused bits here */
+	    	return 0;
+	    if (p->top < 0)
+	    	return 1;
+	    if (odr_write(o, p->bits, p->top + 1) < 0)
+	    	return 0;
+	    return 1;
+    	case ODR_PRINT: return 1;
+    	default: o->error = OOTHER; return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_bool.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_bool.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_bool.c	(revision 21083)
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:13  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.9  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1995/09/29 17:12:16  quinn
+ * Smallish
+ *
+ * Revision 1.7  1995/09/27  15:02:55  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.6  1995/05/16  08:50:43  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.5  1995/04/18  08:15:14  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.4  1995/03/21  10:17:27  quinn
+ * Fixed little bug in decoder.
+ *
+ * Revision 1.3  1995/03/08  12:12:06  quinn
+ * Added better error checking.
+ *
+ * Revision 1.2  1995/02/09  15:51:45  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/02  16:21:51  quinn
+ * First kick.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <yaz/odr.h>
+
+int ber_boolean(ODR o, int *val)
+{
+    int res, len;
+
+    switch (o->direction)
+    {
+    	case ODR_ENCODE:
+	    if (ber_enclen(o, 1, 1, 1) != 1)
+	    	return 0;
+	    if (odr_putc(o, *val) < 0)
+	    	return 0;
+#ifdef ODR_DEBUG
+	    fprintf(stderr, "[val=%d]\n", *val);
+#endif
+	    return 1;
+	case ODR_DECODE:
+	    if ((res = ber_declen(o->bp, &len)) < 0)
+	    {
+	    	o->error = OPROTO;
+		return 0;
+	    }
+	    if (len != 1)
+	    {
+	    	o->error = OPROTO;
+		return 0;
+	    }
+	    o->bp+= res;
+	    *val = *o->bp;
+	    o->bp++;
+#ifdef ODR_DEBUG
+	    fprintf(stderr, "[val=%d]\n", *val);
+#endif
+	    return 1;
+	case ODR_PRINT:
+	    return 1;
+	default: o->error = OOTHER; return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_int.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_int.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_int.c	(revision 21083)
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:13  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.18  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.17  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.16  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.15  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.14  1999/05/26 07:49:35  adam
+ * C++ compilation.
+ *
+ * Revision 1.13  1999/01/08 11:23:22  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.12  1996/07/06 19:58:33  quinn
+ * System headerfiles gathered in yconfig
+ *
+ * Revision 1.11  1995/09/29  17:12:16  quinn
+ * Smallish
+ *
+ * Revision 1.10  1995/09/29  17:01:50  quinn
+ * More Windows work
+ *
+ * Revision 1.9  1995/09/28  10:12:39  quinn
+ * Windows-support changes
+ *
+ * Revision 1.8  1995/09/27  15:02:55  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.7  1995/05/16  08:50:44  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.6  1995/04/18  08:15:14  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.5  1995/03/27  15:01:44  quinn
+ * Added include of sys/types to further portability
+ *
+ * Revision 1.4  1995/03/08  12:12:07  quinn
+ * Added better error checking.
+ *
+ * Revision 1.3  1995/02/09  15:51:46  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/07  17:52:58  quinn
+ * A damn mess, but now things work, I think.
+ *
+ * Revision 1.1  1995/02/02  16:21:52  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <arpa/inet.h>
+#endif
+
+#include <yaz/odr.h>
+
+static int ber_encinteger(ODR o, int val);
+static int ber_decinteger(const unsigned char *buf, int *val);
+
+int ber_integer(ODR o, int *val)
+{
+    int res;
+
+    switch (o->direction)
+    {
+        case ODR_DECODE:
+            if ((res = ber_decinteger(o->bp, val)) <= 0)
+            {
+                o->error = OPROTO;
+                return 0;
+            }
+            o->bp += res;
+            return 1;
+        case ODR_ENCODE:
+            if ((res = ber_encinteger(o, *val)) < 0)
+                return 0;
+            return 1;
+        case ODR_PRINT: return 1;
+        default: o->error = OOTHER;  return 0;
+    }
+}
+
+/*
+ * Returns: number of bytes written or -1 for error (out of bounds).
+ */
+int ber_encinteger(ODR o, int val)
+{
+    int lenpos;
+    int a, len;
+    union { int i; unsigned char c[sizeof(int)]; } tmp;
+
+    lenpos = odr_tell(o);
+    if (odr_putc(o, 0) < 0)  /* dummy */
+        return -1;
+    tmp.i = htonl(val);   /* ensure that that we're big-endian */
+    for (a = 0; a < (int) sizeof(int) - 1; a++)  /* skip superfluous octets */
+        if (!((tmp.c[a] == 0 && !(tmp.c[a+1] & 0X80)) ||
+            (tmp.c[a] == 0XFF && (tmp.c[a+1] & 0X80))))
+            break;
+    len = sizeof(int) - a;
+    if (odr_write(o, (unsigned char*) tmp.c + a, len) < 0)
+        return -1;
+    odr_seek(o, ODR_S_SET, lenpos);
+    if (ber_enclen(o, len, 1, 1) != 1)
+        return -1;
+    odr_seek(o, ODR_S_END, 0);
+#ifdef ODR_DEBUG
+    fprintf(stderr, "[val=%d]", val);
+#endif
+    return 0;
+}
+
+/*
+ * Returns: Number of bytes read or 0 if no match, -1 if error.
+ */
+int ber_decinteger(const unsigned char *buf, int *val)
+{
+    const unsigned char *b = buf;
+    unsigned char fill;
+    int res, len, remains;
+    union { int i; unsigned char c[sizeof(int)]; } tmp;
+
+    if ((res = ber_declen(b, &len)) < 0)
+        return -1;
+    if (len > (int) sizeof(int))    /* let's be reasonable, here */
+        return -1;
+    b+= res;
+
+    remains = sizeof(int) - len;
+    memcpy(tmp.c + remains, b, len);
+    if (*b & 0X80)
+        fill = 0XFF;
+    else
+        fill = 0X00;
+    memset(tmp.c, fill, remains);
+    *val = ntohl(tmp.i);
+
+    b += len;
+#ifdef ODR_DEBUG
+    fprintf(stderr, "[val=%d]", *val);
+#endif
+    return b - buf;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_len.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_len.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_len.c	(revision 21083)
@@ -0,0 +1,145 @@
+/*
+ * Copyright (C) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:14  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.9  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.8  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1999/01/08 11:23:23  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.6  1995/09/29 17:12:17  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/27  15:02:55  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.4  1995/05/16  08:50:45  quinn
+ * License, documentation, and memory fixes
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <yaz/odr.h>
+
+/*
+ * Encode BER length octets. If exact, lenlen is the exact desired
+ * encoding size, else, lenlen is the max available space. Len < 0 =
+ * Indefinite encoding.
+ * Returns: >0   success, number of bytes encoded.
+ * Returns: =0   success, indefinite start-marker set. 1 byte encoded.
+ * Returns: -1   failure, out of bounds.
+ */
+int ber_enclen(ODR o, int len, int lenlen, int exact)
+{
+    unsigned char octs[sizeof(int)];
+    int n = 0;
+    int lenpos, end;
+
+#ifdef ODR_DEBUG
+    fprintf(stderr, "[len=%d]", len);
+#endif
+    if (len < 0)      /* Indefinite */
+    {
+    	if (odr_putc(o, 0x80) < 0)
+	    return 0;
+#ifdef ODR_DEBUG
+	fprintf(stderr, "[indefinite]");
+#endif
+	return 0;
+    }
+    if (len <= 127 && (lenlen == 1 || !exact)) /* definite short form */
+    {
+    	if (odr_putc(o, (unsigned char) len) < 0)
+	    return 0;
+    	return 1;
+    }
+    if (lenlen == 1)
+    {
+    	if (odr_putc(o, 0x80) < 0)
+	    return 0;
+    	return 0;
+    }
+    /* definite long form */
+    do
+    {
+    	octs[n++] = len;
+    	len >>= 8;
+    }
+    while (len);
+    if (n >= lenlen)
+    	return -1;
+    lenpos = odr_tell(o); /* remember length-of-length position */
+    if (odr_putc(o, 0) < 0)  /* dummy */
+    	return 0;
+    if (exact)
+    	while (n < --lenlen)        /* pad length octets */
+	    if (odr_putc(o, 0) < 0)
+	    	return 0;
+    while (n--)
+    	if (odr_putc(o, octs[n]) < 0)
+	    return 0;
+    /* set length of length */
+    end = odr_tell(o);
+    odr_seek(o, ODR_S_SET, lenpos);
+    if (odr_putc(o, (end - lenpos - 1) | 0X80) < 0)
+    	return 0;
+    odr_seek(o, ODR_S_END, 0);
+    return odr_tell(o) - lenpos;
+}
+
+/*
+ * Decode BER length octets. Returns number of bytes read or -1 for error.
+ * After return:
+ * len = -1   indefinite.
+ * len >= 0    Length.
+ */
+int ber_declen(const unsigned char *buf, int *len)
+{
+    const unsigned char *b = buf;
+    int n;
+
+    if (*b == 0X80)     /* Indefinite */
+    {
+    	*len = -1;
+#ifdef ODR_DEBUG
+	fprintf(stderr, "[len=%d]", *len);
+#endif
+    	return 1;
+    }
+    if (!(*b & 0X80))   /* Definite short form */
+    {
+    	*len = (int) *b;
+#ifdef ODR_DEBUG
+	fprintf(stderr, "[len=%d]", *len);
+#endif
+    	return 1;
+    }
+    if (*b == 0XFF)     /* reserved value */
+	return -1;
+    /* indefinite long form */ 
+    n = *b & 0X7F;
+    *len = 0;
+    b++;
+    while (n--)
+    {
+    	*len <<= 8;
+    	*len |= *(b++);
+    }
+#ifdef ODR_DEBUG
+    fprintf(stderr, "[len=%d]", *len);
+#endif
+    return (b - buf);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_null.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_null.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_null.c	(revision 21083)
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:15  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.9  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1995/09/29 17:12:18  quinn
+ * Smallish
+ *
+ * Revision 1.7  1995/09/27  15:02:55  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.6  1995/05/22  11:32:01  quinn
+ * Fixing Interface to odr_null.
+ *
+ * Revision 1.5  1995/05/16  08:50:46  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.4  1995/04/18  08:15:16  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.3  1995/03/08  12:12:09  quinn
+ * Added better error checking.
+ *
+ * Revision 1.2  1995/02/09  15:51:46  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/02  16:21:52  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * BER-en/decoder for NULL type.
+ */
+int ber_null(ODR o)
+{
+    switch (o->direction)
+    {
+    	case ODR_ENCODE:
+	    if (odr_putc(o, 0X00) < 0)
+	    	return 0;
+#ifdef ODR_DEBUG
+	    fprintf(stderr, "[NULL]\n");
+#endif
+	    return 1;
+	case ODR_DECODE:
+	    if (*(o->bp++) != 0X00)
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+#ifdef ODR_DEBUG
+	    fprintf(stderr, "[NULL]\n");
+#endif
+	    return 1;
+	case ODR_PRINT: return 1;
+	default: o->error = OOTHER; return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_oct.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_oct.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_oct.c	(revision 21083)
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:15  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.16  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.15  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.14  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.13  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.12  1999/01/08 11:23:24  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.11  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.10  1995/09/29 17:12:18  quinn
+ * Smallish
+ *
+ * Revision 1.9  1995/09/27  15:02:55  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.8  1995/05/16  08:50:47  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.7  1995/04/18  08:15:17  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.6  1995/03/17  10:17:41  quinn
+ * Added memory management.
+ *
+ * Revision 1.5  1995/03/08  12:12:10  quinn
+ * Added better error checking.
+ *
+ * Revision 1.4  1995/02/10  15:55:28  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.3  1995/02/03  17:04:34  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.2  1995/02/02  20:38:50  quinn
+ * Updates.
+ *
+ * Revision 1.1  1995/02/02  16:21:52  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int ber_octetstring(ODR o, Odr_oct *p, int cons)
+{
+    int res, len;
+    const unsigned char *base;
+    unsigned char *c;
+
+    switch (o->direction)
+    {
+    	case ODR_DECODE:
+	    if ((res = ber_declen(o->bp, &len)) < 0)
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+	    o->bp += res;
+	    if (cons)       /* fetch component strings */
+	    {
+	    	base = o->bp;
+	    	while (odp_more_chunks(o, base, len))
+		    if (!odr_octetstring(o, &p, 0, 0))
+		    	return 0;
+		return 1;
+	    }
+	    /* primitive octetstring */
+	    if (len < 0)
+	    {
+	    	o->error = OOTHER;
+	    	return 0;
+	    }
+	    if (len + 1 > p->size - p->len)
+	    {
+	    	c = (unsigned char *)odr_malloc(o, p->size += len + 1);
+	    	if (p->len)
+		    memcpy(c, p->buf, p->len);
+		p->buf = c;
+	    }
+	    if (len)
+		memcpy(p->buf + p->len, o->bp, len);
+	    p->len += len;
+	    o->bp += len;
+	    return 1;
+    	case ODR_ENCODE:
+	    if ((res = ber_enclen(o, p->len, 5, 0)) < 0)
+	    	return 0;
+	    if (p->len == 0)
+	    	return 1;
+	    if (odr_write(o, p->buf, p->len) < 0)
+	    	return 0;
+	    return 1;
+    	case ODR_PRINT: return 1;
+    	default: o->error = OOTHER; return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_oid.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_oid.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_oid.c	(revision 21083)
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:16  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.12  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.11  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.10  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1995/09/29 17:12:19  quinn
+ * Smallish
+ *
+ * Revision 1.8  1995/09/27  15:02:56  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.7  1995/05/16  08:50:47  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.6  1995/04/18  08:15:18  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.5  1995/03/20  12:18:22  quinn
+ * Fixed bug in ber_oid
+ *
+ * Revision 1.4  1995/03/08  12:12:11  quinn
+ * Added better error checking.
+ *
+ * Revision 1.3  1995/03/01  08:40:56  quinn
+ * Smallish changes.
+ *
+ * Revision 1.2  1995/02/14  20:39:55  quinn
+ * Fixed bugs in completeBER and (serious one in) ber_oid.
+ *
+ * Revision 1.1  1995/02/03  17:04:36  quinn
+ * Initial revision
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int ber_oidc(ODR o, Odr_oid *p)
+{
+    int len, lenp, end;
+    int pos, n, res, id;
+    unsigned char octs[8];
+
+    switch (o->direction)
+    {
+	case ODR_DECODE:
+	    if ((res = ber_declen(o->bp, &len)) < 1)
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+	    if (len < 0)
+	    {
+	    	o->error = OPROTO;
+	    	return 0;
+	    }
+	    o->bp += res;
+	    if (len == 0)
+	    {
+	    	*p = -1;
+	    	return 1;
+	    }
+	    p[0] = *o->bp / 40;
+	    if (p[0] > 2)
+	    	p[0] = 2;
+	    p[1] = *o->bp - p[0] * 40;
+	    o->bp++;
+	    pos = 2;
+	    len--;
+	    while (len)
+	    {
+	    	p[pos] = 0;
+	    	do
+	    	{
+		    if (!len)
+		    {
+		    	o->error = OPROTO;
+		    	return 0;
+		    }
+		    p[pos] <<= 7;
+		    p[pos] |= *o->bp & 0X7F;
+		    len--;
+		}
+		while (*(o->bp++) & 0X80);
+		pos++;
+	    }
+	    p[pos] = -1;
+	    return 1;
+    	case ODR_ENCODE:
+	    /* we'll allow ourselves the quiet luxury of only doing encodings
+    	       shorter than 127 */
+            lenp = odr_tell(o);
+	    if (odr_putc(o, 0) < 0)   /* dummy */
+	    	return 0;
+            if (p[0] < 0 && p[1] <= 0)
+	    {
+	    	o->error = ODATA;
+            	return 0;
+	    }
+	    for (pos = 1; p[pos] >= 0; pos++)
+	    {
+	    	id = pos > 1 ? p[pos] : p[0] * 40 + p[1];
+	    	n = 0;
+	    	do
+	    	{
+		    octs[n++] = id & 0X7F;
+		    id >>= 7;
+		}
+		while (id);
+		while (n--)
+		{
+		    unsigned char p;
+
+		    p = octs[n] | ((n > 0) << 7);
+		    if (odr_putc(o, p) < 0)
+		    	return 0;
+		}
+	    }
+	    end = odr_tell(o);
+	    odr_seek(o, ODR_S_SET, lenp);
+	    if (ber_enclen(o, (end - lenp) - 1, 1, 1) != 1)
+	    {
+	    	o->error = OOTHER;
+	    	return 0;
+	    }
+	    odr_seek(o, ODR_S_END, 0);
+	    return 1;
+    	default: o->error = OOTHER; return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/ber_tag.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/ber_tag.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/ber_tag.c	(revision 21083)
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:16  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.22  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.21  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.20  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.19  1999/01/08 11:23:25  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.18  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.17  1997/09/30 09:33:10  adam
+ * Minor changes - removed indentation of ifdef.
+ *
+ * Revision 1.16  1997/09/17 12:10:33  adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.15  1997/09/01 08:51:06  adam
+ * New windows NT/95 port using MSV5.0. Had to avoid a few static
+ * variables used in function ber_tag. These are now part of the
+ * ODR structure.
+ *
+ * Revision 1.14  1997/05/14 06:53:56  adam
+ * C++ support.
+ *
+ * Revision 1.13  1995/09/29 17:12:21  quinn
+ * Smallish
+ *
+ * Revision 1.12  1995/09/27  15:02:57  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.11  1995/05/16  08:50:48  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.10  1995/04/18  08:15:18  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.9  1995/03/15  08:37:18  quinn
+ * Fixed protocol bugs.
+ *
+ * Revision 1.8  1995/03/10  11:44:40  quinn
+ * Fixed serious stack-bug in odr_cons_begin
+ *
+ * Revision 1.7  1995/03/08  12:12:13  quinn
+ * Added better error checking.
+ *
+ * Revision 1.6  1995/02/14  11:54:33  quinn
+ * Adjustments.
+ *
+ * Revision 1.5  1995/02/10  18:57:24  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.4  1995/02/10  15:55:28  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.3  1995/02/09  15:51:46  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/07  17:52:59  quinn
+ * A damn mess, but now things work, I think.
+ *
+ * Revision 1.1  1995/02/02  16:21:53  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <yaz/odr.h>
+
+/* ber_tag
+ * On encoding:
+ *	if  p: write tag. return 1 (success) or -1 (error).
+ *	if !p: return 0.
+ * On decoding:
+ *      if tag && zclass match up, advance pointer and return 1. set cons.
+ *      else leave pointer unchanged. Return 0.
+ *
+ * Should perhaps be odr_tag?
+ */
+int ber_tag(ODR o, void *p, int zclass, int tag, int *constructed, int opt)
+{
+    Odr_ber_tag *odr_ber_tag = &o->odr_ber_tag;
+    int rd;
+    char **pp = (char **)p;
+
+    if (o->direction == ODR_DECODE)
+    	*pp = 0;
+    o->t_class = -1;
+    if (o->stackp < 0)
+    {
+    	odr_seek(o, ODR_S_SET, 0);
+        o->top = 0;
+    	o->bp = o->buf;
+        odr_ber_tag->lclass = -1;
+    }
+    switch (o->direction)
+    {
+    	case ODR_ENCODE:
+	        if (!*pp)
+	        {
+	    	    if (!opt)
+		        o->error = OREQUIRED;
+	    	    return 0;
+	        }
+	        if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0)
+    		    return -1;
+#ifdef ODR_DEBUG
+    	    fprintf(stderr, "\n[class=%d,tag=%d,cons=%d,stackp=%d]", zclass, tag,
+	            	*constructed, o->stackp);
+#endif
+	        return 1;
+
+    	case ODR_DECODE:
+	        if (o->stackp > -1 && !odr_constructed_more(o))
+            {
+	    	    if (!opt)
+		            o->error = OREQUIRED;
+	    	    return 0;
+	        }
+	        if (odr_ber_tag->lclass < 0)
+	        {
+	    	    if ((odr_ber_tag->br = ber_dectag(o->bp, &odr_ber_tag->lclass,
+                                     &odr_ber_tag->ltag, &odr_ber_tag->lcons)) <= 0)
+                {
+                    o->error = OPROTO;
+		            return 0;
+                }
+#ifdef ODR_DEBUG
+		    fprintf(stderr,
+			    "\n[class=%d,tag=%d,cons=%d,stackp=%d]",
+			    odr_ber_tag->lclass, odr_ber_tag->ltag,
+			    odr_ber_tag->lcons, o->stackp);
+#endif
+	        }
+	        if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag)
+	        {
+	    	    o->bp += odr_ber_tag->br;
+	    	    *constructed = odr_ber_tag->lcons;
+	    	    odr_ber_tag->lclass = -1;
+	    	    return 1;
+	        }
+	        else
+	        {
+	    	    if (!opt)
+		            o->error = OREQUIRED;
+	    	    return 0;
+	        }
+    	case ODR_PRINT:
+		    if (!*pp && !opt)
+		        o->error = OREQUIRED;
+		    return *pp != 0;
+    	default:
+            o->error = OOTHER;
+            return 0;
+    }
+}
+
+/* ber_enctag
+ * BER-encode a zclass/tag/constructed package (identifier octets). Return
+ * number of bytes encoded, or -1 if out of bounds.
+ */
+int ber_enctag(ODR o, int zclass, int tag, int constructed)
+{
+    int cons = (constructed ? 1 : 0), n = 0;
+    unsigned char octs[sizeof(int)], b;
+
+    b = (zclass << 6) & 0XC0;
+    b |= (cons << 5) & 0X20;
+    if (tag <= 30)
+    {
+    	b |= tag & 0X1F;
+	if (odr_putc(o, b) < 0)
+	    return -1;
+    	return 1;
+    }
+    else
+    {
+	b |= 0X1F;
+	if (odr_putc(o, b) < 0)
+	    return -1;
+	do
+    	{
+	    octs[n++] = tag & 0X7F;
+	    tag >>= 7;
+	}
+	while (tag);
+	while (n--)
+	{
+	    unsigned char oo;
+
+	    oo = octs[n] | ((n > 0) << 7);
+	    if (odr_putc(o, oo) < 0)
+	    	return -1;
+	}
+	return 0;
+    }
+}
+
+/* ber_dectag
+ * Decode BER identifier octets. Return number of bytes read or -1 for error.
+ */
+int ber_dectag(const unsigned char *buf, int *zclass, int *tag, int *constructed)
+{
+    const unsigned char *b = buf;
+
+    *zclass = *b >> 6;
+    *constructed = (*b >> 5) & 0X01;
+    if ((*tag = *b & 0x1F) <= 30)
+    	return 1;
+    b++;
+    *tag = 0;
+    do
+    {
+    	*tag <<= 7;
+    	*tag |= *b & 0X7F;
+    	if (b - buf >= 5) /* Precaution */
+	    return -1;
+    }
+    while (*(b++) & 0X80);
+    return b - buf;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/dumpber.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/dumpber.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/dumpber.c	(revision 21083)
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:17  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.12  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.11  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.10  1999/01/08 11:23:26  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.9  1998/01/14 09:53:26  quinn
+ * Added a bit more info to dump.
+ *
+ * Revision 1.8  1997/05/14 06:53:57  adam
+ * C++ support.
+ *
+ * Revision 1.7  1996/03/08 14:38:41  quinn
+ * Fixed output.
+ *
+ * Revision 1.6  1996/01/19  15:41:34  quinn
+ * dumpber was ignoring the file argument.
+ *
+ * Revision 1.5  1995/10/18  16:12:55  quinn
+ * Better diagnostics. Added special case in NULL to handle WAIS server.
+ *
+ * Revision 1.4  1995/09/29  17:12:21  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:57  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/06/27  13:20:51  quinn
+ * Fixed sign-clash. Non-fatal warning
+ *
+ * Revision 1.1  1995/06/19  12:38:45  quinn
+ * Added BER dumper.
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <yaz/odr.h>
+
+static int do_dumpBER(FILE *f, const char *buf, int len, int level, int offset)
+{
+    int res, ll, zclass, tag, cons, lenlen, taglen;
+    const char *b = buf, *bp = buf;
+    
+    if (!len)
+    	return 0;
+    if (!buf[0] && !buf[1])
+    	return 0;
+    if ((res = ber_dectag((unsigned char*)b, &zclass, &tag, &cons)) <= 0)
+    	return 0;
+    if (res > len)
+    {
+    	fprintf(stderr, "Unexpected end of buffer\n");
+    	return 0;
+    }
+    fprintf(f, "%5d: %*s", offset, level * 4, "");
+    if (zclass == ODR_UNIVERSAL)
+    {
+    	static char *nl[] =
+	{
+	    "[Univ 0]", "BOOLEAN", "INTEGER", "BIT STRING", "OCTET STRING",
+	    "NULL", "OID", "OBJECT DESCIPTOR", "EXTERNAL", "REAL",
+	    "ENUM", "[UNIV 11]", "[UNIV 12]", "[UNIV 13]", "[UNIV 14]",
+	    "[UNIV 15]", "SEQUENCE", "SET", "NUMERICSTRING", "PRINTABLESTRING",
+	    "[UNIV 20]", "[UNIV 21]", "[UNIV 22]", "[UNIV 23]", "[UNIV 24]",
+	    "GRAPHICSTRING", "VISIBLESTRING", "GENERALSTRING", "[UNIV 28]"
+	};
+
+	if (tag < 28)
+	    fprintf(f, "%s", nl[tag]);
+	else
+	    fprintf(f, "[UNIV %d]", tag);
+    }
+    else if (zclass == ODR_CONTEXT)
+	fprintf(f, "[%d]", tag);
+    else
+	fprintf(f, "[%d:%d]", zclass, tag);
+    b += res;
+    taglen = res;
+    len -= res;
+    bp = b;
+    if ((res = ber_declen((unsigned char*)b, &ll)) <= 0)
+    {
+    	fprintf(f, "bad length\n");
+    	return 0;
+    }
+    if (res > len)
+    {
+    	fprintf(f, "Unexpected end of buffer\n");
+    	return 0;
+    }
+    lenlen = res;
+    b += res;
+    len -= res;
+    if (ll >= 0)
+    	fprintf(f, " len=%d", ll);
+    else
+    	fprintf(f, " len=?");
+    fprintf(f, "       tl=%d, ll=%d\n", taglen, lenlen);
+    if (!cons)
+    {
+    	if (ll < 0)
+	{
+	    fprintf(f, "Bad length on primitive type.\n");
+	    return 0;
+	}
+    	return ll + (b - buf);
+    }
+    if (ll >= 0)
+    	len = ll;
+    /* constructed - cycle through children */
+    while ((ll == -1 && len >= 2) || (ll >= 0 && len))
+    {
+	if (ll == -1 && *b == 0 && *(b + 1) == 0)
+	    break;
+	if (!(res = do_dumpBER(f, b, len, level + 1, offset + (b - buf))))
+	{
+	    fprintf(f, "Dump of content element failed.\n");
+	    return 0;
+	}
+	b += res;
+	len -= res;
+    }
+    if (ll == -1)
+    {
+    	if (len < 2)
+	{
+	    fprintf(f, "Buffer too short in indefinite lenght.\n");
+	    return 0;
+	}
+	return (b - buf) + 2;
+    }
+    return b - buf;
+}
+
+int odr_dumpBER(FILE *f, const char *buf, int len)
+{
+    return do_dumpBER(f, buf, len, 0, 0);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr.c	(revision 21083)
@@ -0,0 +1,236 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:17  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.33  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.32  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.31  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.30  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.29  1999/04/27 08:34:10  adam
+ * Modified odr_destroy so that file is not closed when file is 0.
+ *
+ * Revision 1.28  1998/07/20 12:38:13  adam
+ * More LOG_DEBUG-diagnostics.
+ *
+ * Revision 1.27  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.26  1997/11/24 11:33:56  adam
+ * Using function odr_nullval() instead of global ODR_NULLVAL when
+ * appropriate.
+ *
+ * Revision 1.25  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.24  1997/09/01 08:51:07  adam
+ * New windows NT/95 port using MSV5.0. Had to avoid a few static
+ * variables used in function ber_tag. These are now part of the
+ * ODR structure.
+ *
+ * Revision 1.23  1997/04/30 08:52:10  quinn
+ * Null
+ *
+ * Revision 1.22  1996/10/08  12:58:17  adam
+ * New ODR function, odr_choice_enable_bias, to control behaviour of
+ * odr_choice_bias.
+ *
+ * Revision 1.21  1996/07/26  13:38:19  quinn
+ * Various smaller things. Gathered header-files.
+ *
+ * Revision 1.20  1995/11/08  17:41:32  quinn
+ * Smallish.
+ *
+ * Revision 1.19  1995/11/01  13:54:41  quinn
+ * Minor adjustments
+ *
+ * Revision 1.18  1995/09/29  17:12:22  quinn
+ * Smallish
+ *
+ * Revision 1.17  1995/09/29  17:01:50  quinn
+ * More Windows work
+ *
+ * Revision 1.16  1995/09/27  15:02:57  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.15  1995/08/15  12:00:22  quinn
+ * Updated External
+ *
+ * Revision 1.14  1995/06/19  12:38:46  quinn
+ * Added BER dumper.
+ *
+ * Revision 1.13  1995/05/22  11:32:02  quinn
+ * Fixing Interface to odr_null.
+ *
+ * Revision 1.12  1995/05/16  08:50:49  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.11  1995/05/15  11:56:08  quinn
+ * More work on memory management.
+ *
+ * Revision 1.10  1995/04/18  08:15:20  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.9  1995/04/10  10:23:11  quinn
+ * Smallish changes.
+ *
+ * Revision 1.8  1995/03/17  10:17:43  quinn
+ * Added memory management.
+ *
+ * Revision 1.7  1995/03/10  11:44:41  quinn
+ * Fixed serious stack-bug in odr_cons_begin
+ *
+ * Revision 1.6  1995/03/08  12:12:15  quinn
+ * Added better error checking.
+ *
+ * Revision 1.5  1995/03/07  13:28:57  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.4  1995/03/07  13:16:13  quinn
+ * Fixed bug in odr_reset
+ *
+ * Revision 1.3  1995/03/07  10:21:31  quinn
+ * odr_errno-->odr_error
+ *
+ * Revision 1.2  1995/03/07  10:19:05  quinn
+ * Addded some method functions to the ODR type.
+ *
+ * Revision 1.1  1995/03/07  09:23:15  quinn
+ * Installing top-level API and documentation.
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <yaz/xmalloc.h>
+#include <yaz/odr.h>
+
+Odr_null *ODR_NULLVAL = "NULL";  /* the presence of a null value */
+
+Odr_null *odr_nullval (void)
+{
+    return ODR_NULLVAL;
+}
+
+char *odr_errlist[] =
+{
+    "No (unknown) error",
+    "Memory allocation failed",
+    "System error",
+    "No space in buffer",
+    "Required data element missing",
+    "Unexpected tag",
+    "Other error",
+    "Protocol error",
+    "Malformed data",
+    "Stack overflow",
+    "Length of constructed type different from sum of members",
+    "Overflow writing definite length of constructed type"
+};
+
+char *odr_errmsg(int n)
+{
+    return odr_errlist[n];
+}
+
+void odr_perror(ODR o, char *message)
+{
+    fprintf(stderr, "%s: %s\n", message, odr_errlist[o->error]);
+}
+
+int odr_geterror(ODR o)
+{
+    return o->error;
+}
+
+void odr_setprint(ODR o, FILE *file)
+{
+    o->print = file;
+}
+
+#include <yaz/log.h>
+
+ODR odr_createmem(int direction)
+{
+    ODR r;
+
+    if (!(r = (ODR)xmalloc(sizeof(*r))))
+        return 0;
+    r->direction = direction;
+    r->print = stderr;
+    r->buf = 0;
+    r->size = r->pos = r->top = 0;
+    r->can_grow = 1;
+    r->mem = nmem_create();
+    r->enable_bias = 1;
+    r->odr_ber_tag.lclass = -1;
+    odr_reset(r);
+    yaz_log (LOG_DEBUG, "odr_createmem dir=%d o=%p", direction, r);
+    return r;
+}
+
+void odr_reset(ODR o)
+{
+    o->error = ONONE;
+    o->bp = o->buf;
+    odr_seek(o, ODR_S_SET, 0);
+    o->top = 0;
+    o->t_class = -1;
+    o->t_tag = -1;
+    o->indent = 0;
+    o->stackp = -1;
+    nmem_reset(o->mem);
+    o->choice_bias = -1;
+    o->lenlen = 1;
+    yaz_log (LOG_DEBUG, "odr_reset o=%p", o);
+}
+    
+void odr_destroy(ODR o)
+{
+    nmem_destroy(o->mem);
+    if (o->buf && o->can_grow)
+       xfree(o->buf);
+    if (o->print && o->print != stderr)
+        fclose(o->print);
+    xfree(o);
+    yaz_log (LOG_DEBUG, "odr_destroy o=%p", o);
+}
+
+void odr_setbuf(ODR o, char *buf, int len, int can_grow)
+{
+    o->bp = (unsigned char *) buf;
+
+    o->buf = (unsigned char *) buf;
+    o->can_grow = can_grow;
+    o->top = o->pos = 0;
+    o->size = len;
+}
+
+char *odr_getbuf(ODR o, int *len, int *size)
+{
+    *len = o->top;
+    if (size)
+        *size = o->size;
+    return (char*) o->buf;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_any.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_any.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_any.c	(revision 21083)
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:18  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.10  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.9  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.7  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.6  1995/09/29 17:12:22  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/27  15:02:58  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.4  1995/05/16  08:50:50  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.3  1995/03/17  10:17:46  quinn
+ * Added memory management.
+ *
+ * Revision 1.2  1995/03/08  12:12:18  quinn
+ * Added better error checking.
+ *
+ * Revision 1.1  1995/02/09  15:51:47  quinn
+ * Works better now.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * This is a catch-all type. It stuffs a random ostring (assumed to be properly
+ * encoded) into the stream, or reads a full data element. Implicit tagging
+ * does not work, and neither does the optional flag, unless the element
+ * is the last in a sequence.
+ */
+int odr_any(ODR o, Odr_any **p, int opt, const char *name)
+{
+    if (o->error)
+    	return 0;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+    	fprintf(o->print, "ANY (len=%d)\n", (*p)->len);
+    	return 1;
+    }
+    if (o->direction == ODR_DECODE)
+    	*p = (Odr_oct *)odr_malloc(o, sizeof(**p));
+    if (ber_any(o, p))
+    	return 1;
+    *p = 0;
+    if (!opt)
+    	o->error = OREQUIRED;
+    return opt;
+}    
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_bit.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_bit.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_bit.c	(revision 21083)
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:18  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.14  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.13  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.12  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.11  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.10  1995/09/29 17:12:22  quinn
+ * Smallish
+ *
+ * Revision 1.9  1995/09/27  15:02:58  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.8  1995/05/16  08:50:51  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.7  1995/03/17  10:17:48  quinn
+ * Added memory management.
+ *
+ * Revision 1.6  1995/03/08  12:12:19  quinn
+ * Added better error checking.
+ *
+ * Revision 1.5  1995/02/10  18:57:25  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.4  1995/02/09  15:51:47  quinn
+ * Works better now.
+ *
+ * Revision 1.3  1995/02/07  14:13:45  quinn
+ * Bug fixes.
+ *
+ * Revision 1.2  1995/02/03  17:04:37  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.1  1995/02/02  20:38:50  quinn
+ * Updates.
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <yaz/odr.h>
+
+/*
+ * Top level bitstring string en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_bitstring(ODR o, Odr_bitmask **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_BITSTRING;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+    	fprintf(o->print, "BITSTRING(len=%d)\n",(*p)->top + 1);
+    	return 1;
+    }
+    if (o->direction == ODR_DECODE)
+    {
+    	*p = (Odr_bitmask *)odr_malloc(o, sizeof(Odr_bitmask));
+    	memset((*p)->bits, 0, ODR_BITMASK_SIZE);
+    	(*p)->top = -1;
+    }
+    return ber_bitstring(o, *p, cons);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_bool.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_bool.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_bool.c	(revision 21083)
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:19  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.12  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.11  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.10  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.9  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1995/09/29 17:12:23  quinn
+ * Smallish
+ *
+ * Revision 1.7  1995/09/27  15:02:58  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.6  1995/05/16  08:50:52  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.5  1995/03/17  10:17:49  quinn
+ * Added memory management.
+ *
+ * Revision 1.4  1995/03/08  12:12:20  quinn
+ * Added better error checking.
+ *
+ * Revision 1.3  1995/02/10  18:57:25  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.2  1995/02/09  15:51:47  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/02  16:21:53  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <yaz/odr.h>
+
+/*
+ * Top level boolean en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_bool(ODR o, int **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_BOOLEAN;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+    	fprintf(o->print, "%s\n", (**p ? "TRUE" : "FALSE"));
+    	return 1;
+    }
+    if (cons)
+    	return 0;
+    if (o->direction == ODR_DECODE)
+    	*p = (int *)odr_malloc(o, sizeof(int));
+    return ber_boolean(o, *p);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_choice.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_choice.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_choice.c	(revision 21083)
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:19  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.18  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.17  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.16  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.15  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.14  1997/05/14 06:53:57  adam
+ * C++ support.
+ *
+ * Revision 1.13  1997/04/30 08:52:10  quinn
+ * Null
+ *
+ * Revision 1.12  1996/10/08  12:58:17  adam
+ * New ODR function, odr_choice_enable_bias, to control behaviour of
+ * odr_choice_bias.
+ *
+ * Revision 1.11  1995/09/29  17:12:23  quinn
+ * Smallish
+ *
+ * Revision 1.10  1995/09/27  15:02:58  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.9  1995/08/15  12:00:23  quinn
+ * Updated External
+ *
+ * Revision 1.8  1995/06/19  17:01:51  quinn
+ * This should bring us in sync with the version distributed as 1.0b
+ *
+ * Revision 1.7  1995/06/19  13:06:50  quinn
+ * Fixed simple bug in the code to handle untagged choice elements.
+ *
+ * Revision 1.6  1995/05/16  08:50:53  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.5  1995/03/18  12:16:31  quinn
+ * Minor changes.
+ *
+ * Revision 1.4  1995/03/14  16:59:38  quinn
+ * Added odr_constructed_more check
+ *
+ * Revision 1.3  1995/03/08  12:12:22  quinn
+ * Added better error checking.
+ *
+ * Revision 1.2  1995/02/09  15:51:48  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/07  17:52:59  quinn
+ * A damn mess, but now things work, I think.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int odr_choice(ODR o, Odr_arm arm[], void *p, void *whichp,
+	       const char *name)
+{
+    int i, cl = -1, tg, cn, *which = (int *)whichp, bias = o->choice_bias;
+
+    if (o->error)
+    	return 0;
+    if (o->direction != ODR_DECODE && !*(char**)p)
+    	return 0;
+    o->choice_bias = -1;
+
+    if (o->direction == ODR_PRINT)
+    {
+	if (name)
+	{
+	    odr_prname(o, name);
+	    fprintf (o->print, "choice\n");
+	}
+    }
+    for (i = 0; arm[i].fun; i++)
+    {
+    	if (o->direction == ODR_DECODE)
+	{
+	    if (bias >= 0 && bias != arm[i].which)
+		continue;
+    	    *which = arm[i].which;
+	}
+	else if (*which != arm[i].which)
+	    continue;
+
+    	if (arm[i].tagmode != ODR_NONE)
+    	{
+	    if (o->direction == ODR_DECODE && cl < 0)
+	    {
+	    	if (o->stackp > -1 && !odr_constructed_more(o))
+		    return 0;
+	    	if (ber_dectag(o->bp, &cl, &tg, &cn) <= 0)
+		    return 0;
+	    }
+	    else if (o->direction != ODR_DECODE)
+	    {
+	    	cl = arm[i].zclass;
+	    	tg = arm[i].tag;
+	    }
+	    if (tg == arm[i].tag && cl == arm[i].zclass)
+	    {
+	    	if (arm[i].tagmode == ODR_IMPLICIT)
+	    	{
+		    odr_implicit_settag(o, cl, tg);
+	    	    return (*arm[i].fun)(o, (char **)p, 0, arm[i].name);
+		}
+		/* explicit */
+		if (!odr_constructed_begin(o, p, cl, tg, 0))
+		    return 0;
+		return (*arm[i].fun)(o, (char **)p, 0, arm[i].name) &&
+		    odr_constructed_end(o);
+	    }
+	}
+	else  /* no tagging. Have to poll type */
+	{
+	    if ((*arm[i].fun)(o, (char **)p, 1, arm[i].name) && *(char**)p)
+	    	return 1;
+	}
+    }
+    *which = -1;
+    *(char*)p = 0;
+    return 0;
+}
+
+void odr_choice_bias(ODR o, int what)
+{
+    if (o->enable_bias)
+        o->choice_bias = what;
+}
+
+void odr_choice_enable_bias (ODR o, int mode)
+{
+    o->enable_bias = mode;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_cons.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_cons.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_cons.c	(revision 21083)
@@ -0,0 +1,237 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:20  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.22  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.21  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.20  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.19  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.18  1997/05/14 06:53:58  adam
+ * C++ support.
+ *
+ * Revision 1.17  1996/10/23 12:31:24  adam
+ * Added 'static' modifier to dummy variable in odr_constructed_begin.
+ *
+ * Revision 1.16  1996/07/26  13:38:20  quinn
+ * Various smaller things. Gathered header-files.
+ *
+ * Revision 1.15  1995/09/29  17:12:23  quinn
+ * Smallish
+ *
+ * Revision 1.14  1995/09/27  15:02:58  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.13  1995/08/15  11:16:39  quinn
+ * Fixed pretty-printers.
+ *
+ * Revision 1.12  1995/06/19  12:38:47  quinn
+ * Added BER dumper.
+ *
+ * Revision 1.11  1995/05/16  08:50:53  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.10  1995/04/18  08:15:21  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.9  1995/03/28  09:15:49  quinn
+ * Fixed bug in the printing mode
+ *
+ * Revision 1.8  1995/03/15  11:18:04  quinn
+ * Fixed serious bug in odr_cons
+ *
+ * Revision 1.7  1995/03/10  11:44:41  quinn
+ * Fixed serious stack-bug in odr_cons_begin
+ *
+ * Revision 1.6  1995/03/08  12:12:23  quinn
+ * Added better error checking.
+ *
+ * Revision 1.5  1995/02/10  18:57:25  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.4  1995/02/10  15:55:29  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.3  1995/02/09  15:51:48  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/07  17:52:59  quinn
+ * A damn mess, but now things work, I think.
+ *
+ * Revision 1.1  1995/02/02  16:21:53  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+void odr_setlenlen(ODR o, int len)
+{
+    o->lenlen = len;
+}
+
+int odr_constructed_begin(ODR o, void *p, int zclass, int tag,
+			  const char *name)
+{
+    int res;
+    int cons = 1;
+    int lenlen = o->lenlen;
+
+    if (o->error)
+    	return 0;
+    o->lenlen = 1; /* reset lenlen */
+    if (o->t_class < 0)
+    {
+	o->t_class = zclass;
+	o->t_tag = tag;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, 1)) < 0)
+    	return 0;
+    if (!res || !cons)
+    	return 0;
+
+    if (o->stackp == ODR_MAX_STACK - 1)
+    {
+    	o->error = OSTACK;
+    	return 0;
+    }
+    o->stack[++(o->stackp)].lenb = o->bp;
+    o->stack[o->stackp].len_offset = odr_tell(o);
+#ifdef ODR_DEBUG
+    fprintf(stderr, "[cons_begin(%d)]", o->stackp);
+#endif
+    if (o->direction == ODR_ENCODE)
+    {
+	static unsigned char dummy[sizeof(int)+1];
+
+	o->stack[o->stackp].lenlen = lenlen;
+
+	if (odr_write(o, dummy, lenlen) < 0) /* dummy */
+	    return 0;
+    }
+    else if (o->direction == ODR_DECODE)
+    {
+    	if ((res = ber_declen(o->bp, &o->stack[o->stackp].len)) < 0)
+	    return 0;
+	o->stack[o->stackp].lenlen = res;
+	o->bp += res;
+    }
+    else if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+    	fprintf(o->print, "{\n");
+	o->indent++;
+    }
+    else
+    {
+    	o->error = OOTHER;
+	return 0;
+    }
+    o->stack[o->stackp].base = o->bp;
+    o->stack[o->stackp].base_offset = odr_tell(o);
+    return 1;
+}
+
+int odr_constructed_more(ODR o)
+{
+    if (o->error)
+    	return 0;
+    if (o->stackp < 0)
+    	return 0;
+    if (o->stack[o->stackp].len >= 0)
+    	return o->bp - o->stack[o->stackp].base < o->stack[o->stackp].len;
+    else
+    	return (!(*o->bp == 0 && *(o->bp + 1) == 0));
+}
+
+int odr_constructed_end(ODR o)
+{
+    int res;
+    int pos;
+
+    if (o->error)
+    	return 0;
+    if (o->stackp < 0)
+    {
+    	o->error = OOTHER;
+    	return 0;
+    }
+    switch (o->direction)
+    {
+    	case ODR_DECODE:
+	    if (o->stack[o->stackp].len < 0)
+	    {
+	    	if (*o->bp++ == 0 && *(o->bp++) == 0)
+	    	{
+		    o->stackp--;
+		    return 1;
+		}
+		else
+		{
+		    o->error = OOTHER;
+		    return 0;
+		}
+	    }
+	    else if (o->bp - o->stack[o->stackp].base !=
+		o->stack[o->stackp].len)
+	    {
+	    	o->error = OCONLEN;
+	    	return 0;
+	    }
+	    o->stackp--;
+	    return 1;
+    	case ODR_ENCODE:
+	    pos = odr_tell(o);
+	    odr_seek(o, ODR_S_SET, o->stack[o->stackp].len_offset);
+	    if ((res = ber_enclen(o, pos - o->stack[o->stackp].base_offset,
+		o->stack[o->stackp].lenlen, 1)) < 0)
+	    {
+		o->error = OLENOV;
+		return 0;
+	    }
+	    odr_seek(o, ODR_S_END, 0);
+	    if (res == 0)   /* indefinite encoding */
+	    {
+#ifdef ODR_DEBUG
+		fprintf(stderr, "[cons_end(%d): indefinite]", o->stackp);
+#endif
+		if (odr_putc(o, 0) < 0 || odr_putc(o, 0) < 0)
+		    return 0;
+	    }
+#ifdef ODR_DEBUG
+	    else
+	    {
+	    	fprintf(stderr, "[cons_end(%d): definite]", o->stackp);
+	    }
+#endif
+	    o->stackp--;
+	    return 1;
+    	case ODR_PRINT:
+	    o->stackp--;
+	    o->indent--;
+	    odr_prname(o, 0);
+	    fprintf(o->print, "}\n");
+	    return 1;
+    	default:
+	    o->error = OOTHER;
+	    return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_enum.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_enum.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_enum.c	(revision 21083)
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:21  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.5  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.4  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.2  1999/01/08 11:23:27  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.1  1998/03/20 14:45:01  adam
+ * Implemented odr_enum and odr_set_of.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * Top level enum en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_enum(ODR o, int **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+        return 0;
+    if (o->t_class < 0)
+    {
+        o->t_class = ODR_UNIVERSAL;
+        o->t_tag = ODR_ENUM;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+        return 0;
+    if (!res)
+        return opt;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+        fprintf(o->print, "%d\n", **p);
+        return 1;
+    }
+    if (cons)
+    {
+        o->error = OPROTO;
+        return 0;
+    }
+    if (o->direction == ODR_DECODE)
+        *p = (int *)odr_malloc(o, sizeof(int));
+    return ber_integer(o, *p);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_int.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_int.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_int.c	(revision 21083)
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:21  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.15  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.14  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.13  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.12  1999/01/08 11:23:28  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.11  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.10  1995/09/29 17:12:24  quinn
+ * Smallish
+ *
+ * Revision 1.9  1995/09/29  17:01:50  quinn
+ * More Windows work
+ *
+ * Revision 1.8  1995/09/27  15:02:59  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.7  1995/05/16  08:50:54  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.6  1995/03/17  10:17:51  quinn
+ * Added memory management.
+ *
+ * Revision 1.5  1995/03/08  12:12:25  quinn
+ * Added better error checking.
+ *
+ * Revision 1.4  1995/02/10  18:57:25  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.3  1995/02/09  15:51:48  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/07  14:13:45  quinn
+ * Bug fixes.
+ *
+ * Revision 1.1  1995/02/02  16:21:53  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * Top level integer en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_integer(ODR o, int **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+        return 0;
+    if (o->t_class < 0)
+    {
+        o->t_class = ODR_UNIVERSAL;
+        o->t_tag = ODR_INTEGER;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+        return 0;
+    if (!res)
+        return opt;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+        fprintf(o->print, "%d\n", **p);
+        return 1;
+    }
+    if (cons)
+    {
+        o->error = OPROTO;
+        return 0;
+    }
+    if (o->direction == ODR_DECODE)
+        *p = (int *)odr_malloc(o, sizeof(int));
+    return ber_integer(o, *p);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_mem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_mem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_mem.c	(revision 21083)
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:22  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.18  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.17  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.16  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.15  1999/03/31 11:18:25  adam
+ * Implemented odr_strdup. Added Reference ID to backend server API.
+ *
+ * Revision 1.14  1998/07/20 12:38:15  adam
+ * More LOG_DEBUG-diagnostics.
+ *
+ * Revision 1.13  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.12  1995/11/08 17:41:33  quinn
+ * Smallish.
+ *
+ * Revision 1.11  1995/11/01  13:54:43  quinn
+ * Minor adjustments
+ *
+ * Revision 1.10  1995/10/25  16:58:19  quinn
+ * Stupid bug in odr_malloc
+ *
+ * Revision 1.9  1995/10/13  16:08:08  quinn
+ * Added OID utility
+ *
+ * Revision 1.8  1995/09/29  17:12:24  quinn
+ * Smallish
+ *
+ * Revision 1.7  1995/09/27  15:02:59  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.6  1995/08/21  09:10:41  quinn
+ * Smallish fixes to suppport new formats.
+ *
+ * Revision 1.5  1995/05/16  08:50:55  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.4  1995/05/15  11:56:09  quinn
+ * More work on memory management.
+ *
+ * Revision 1.3  1995/04/18  08:15:21  quinn
+ * Added dynamic memory allocation on encoding (whew). Code is now somewhat
+ * neater. We'll make the same change for decoding one day.
+ *
+ * Revision 1.2  1995/03/17  10:17:52  quinn
+ * Added memory management.
+ *
+ * Revision 1.1  1995/03/14  10:27:40  quinn
+ * Modified makefile to use common lib
+ * Beginning to add memory management to odr
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <yaz/odr.h>
+#include <yaz/xmalloc.h>
+
+/* ------------------------ NIBBLE MEMORY ---------------------- */
+
+/*
+ * Extract the memory control block from o.
+ */
+NMEM odr_extract_mem(ODR o)
+{
+    NMEM r = o->mem;
+
+    o->mem = 0;
+    return r;
+}
+
+void *odr_malloc(ODR o, int size)
+{
+    if (o && !o->mem)
+	o->mem = nmem_create();
+    return nmem_malloc(o ? o->mem : 0, size);
+}
+
+char *odr_strdup(ODR o, const char *str)
+{
+    return nmem_strdup(o->mem, str);
+}
+
+int odr_total(ODR o)
+{
+    return o->mem ? nmem_total(o->mem) : 0;
+}
+
+/* ---------- memory management for data encoding ----------*/
+
+
+int odr_grow_block(ODR b, int min_bytes)
+{
+    int togrow;
+
+    if (!b->can_grow)
+    	return -1;
+    if (!b->size)
+    	togrow = 1024;
+    else
+    	togrow = b->size;
+    if (togrow < min_bytes)
+    	togrow = min_bytes;
+    if (b->size && !(b->buf =
+		     (unsigned char *) xrealloc(b->buf, b->size += togrow)))
+    	abort();
+    else if (!b->size && !(b->buf = (unsigned char *)
+			   xmalloc(b->size = togrow)))
+    	abort();
+#ifdef ODR_DEBUG
+    fprintf(stderr, "New size for encode_buffer: %d\n", b->size);
+#endif
+    return 0;
+}
+
+int odr_write(ODR o, unsigned char *buf, int bytes)
+{
+    if (o->pos + bytes >= o->size && odr_grow_block(o, bytes))
+    {
+    	o->error = OSPACE;
+	return -1;
+    }
+    memcpy(o->buf + o->pos, buf, bytes);
+    o->pos += bytes;
+    if (o->pos > o->top)
+    	o->top = o->pos;
+    return 0;
+}
+
+int odr_seek(ODR o, int whence, int offset)
+{
+    if (whence == ODR_S_CUR)
+    	offset += o->pos;
+    else if (whence == ODR_S_END)
+    	offset += o->top;
+    if (offset > o->size && odr_grow_block(o, offset - o->size))
+    {
+    	o->error = OSPACE;
+	return -1;
+    }
+    o->pos = offset;
+    return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_null.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_null.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_null.c	(revision 21083)
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:22  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.13  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.12  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.11  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.10  1997/11/24 11:33:56  adam
+ * Using function odr_nullval() instead of global ODR_NULLVAL when
+ * appropriate.
+ *
+ * Revision 1.9  1995/10/18 16:12:56  quinn
+ * Better diagnostics. Added special case in NULL to handle WAIS server.
+ *
+ * Revision 1.8  1995/09/29  17:12:24  quinn
+ * Smallish
+ *
+ * Revision 1.7  1995/09/27  15:02:59  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.6  1995/05/22  11:32:03  quinn
+ * Fixing Interface to odr_null.
+ *
+ * Revision 1.5  1995/05/16  08:50:56  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.4  1995/03/08  12:12:26  quinn
+ * Added better error checking.
+ *
+ * Revision 1.3  1995/02/10  18:57:25  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.2  1995/02/09  15:51:49  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/02  16:21:54  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * Top level null en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_null(ODR o, Odr_null **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_NULL;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (o->direction == ODR_PRINT)
+    {
+	odr_prname(o, name);
+    	fprintf(o->print, "NULL\n");
+    	return 1;
+    }
+    if (cons)
+    {
+#ifdef ODR_STRICT_NULL
+    	o->error = OPROTO;
+    	return 0;
+#else
+	fprintf(stderr, "odr: Warning: Bad NULL\n");
+#endif
+    }
+    if (o->direction == ODR_DECODE)
+    	*p = odr_nullval();
+    return ber_null(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_oct.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_oct.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_oct.c	(revision 21083)
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:23  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.16  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.15  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.14  1999/10/19 12:35:55  adam
+ * Better dump of OCTET STRING.
+ *
+ * Revision 1.13  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.12  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.11  1995/09/29 17:12:25  quinn
+ * Smallish
+ *
+ * Revision 1.10  1995/09/27  15:02:59  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.9  1995/05/16  08:50:56  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.8  1995/03/17  10:17:54  quinn
+ * Added memory management.
+ *
+ * Revision 1.7  1995/03/08  12:12:27  quinn
+ * Added better error checking.
+ *
+ * Revision 1.6  1995/02/10  18:57:26  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.5  1995/02/09  15:51:49  quinn
+ * Works better now.
+ *
+ * Revision 1.4  1995/02/07  14:13:46  quinn
+ * Bug fixes.
+ *
+ * Revision 1.3  1995/02/03  17:04:38  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.2  1995/02/02  20:38:51  quinn
+ * Updates.
+ *
+ * Revision 1.1  1995/02/02  16:21:54  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+/*
+ * Top level octet string en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_octetstring(ODR o, Odr_oct **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_OCTETSTRING;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (o->direction == ODR_PRINT)
+    {
+        int i;
+	odr_prname(o, name);
+    	fprintf(o->print, "OCTETSTRING(len=%d)", (*p)->len);
+        for (i = 0; i<(*p)->len; i++)
+        {
+	    if (i < 5 || i > ((*p)->len - 4))
+            {
+                fprintf (o->print, " %02X", (*p)->buf[i]);
+            }
+            else if (i == 5)
+                fprintf (o->print, " .. ");
+        }
+        fprintf(o->print, "\n");
+    	return 1;
+    }
+    if (o->direction == ODR_DECODE)
+    {
+    	*p = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));
+    	(*p)->size= 0;
+    	(*p)->len = 0;
+    	(*p)->buf = 0;
+    }
+    if (ber_octetstring(o, *p, cons))
+    	return 1;
+    o->error = OOTHER;
+    return 0;
+}
+
+/*
+ * Friendlier interface to octetstring.
+ */
+int odr_cstring(ODR o, char **p, int opt, const char *name)
+{
+    int cons = 0, res;
+    Odr_oct *t;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_OCTETSTRING;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (o->direction == ODR_PRINT)
+    {
+    	odr_prname(o, name);
+    	fprintf(o->print, "'%s'\n", *p);
+    	return 1;
+    }
+    t = (Odr_oct *)odr_malloc(o, sizeof(Odr_oct));   /* wrapper for octstring */
+    if (o->direction == ODR_ENCODE)
+    {
+    	t->buf = (unsigned char *) *p;
+    	t->size = t->len = strlen(*p);
+    }
+    else
+    {
+	t->size= 0;
+	t->len = 0;
+	t->buf = 0;
+    }
+    if (!ber_octetstring(o, t, cons))
+    	return 0;
+    if (o->direction == ODR_DECODE)
+    {
+	*p = (char *) t->buf;
+	*(*p + t->len) = '\0';  /* ber_octs reserves space for this */
+    }
+    return 1;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_oid.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_oid.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_oid.c	(revision 21083)
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:23  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.16  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.15  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.14  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.13  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.12  1995/09/29 17:12:25  quinn
+ * Smallish
+ *
+ * Revision 1.11  1995/09/27  15:03:00  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.10  1995/05/29  08:11:44  quinn
+ * Moved oid from odr/asn to util.
+ *
+ * Revision 1.9  1995/05/16  08:50:57  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.8  1995/03/17  10:17:55  quinn
+ * Added memory management.
+ *
+ * Revision 1.7  1995/03/08  12:12:29  quinn
+ * Added better error checking.
+ *
+ * Revision 1.6  1995/03/01  08:40:56  quinn
+ * Smallish changes.
+ *
+ * Revision 1.5  1995/02/10  18:57:26  quinn
+ * More in the way of error-checking.
+ *
+ * Revision 1.4  1995/02/10  15:55:29  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.3  1995/02/09  15:51:49  quinn
+ * Works better now.
+ *
+ * Revision 1.2  1995/02/07  14:13:46  quinn
+ * Bug fixes.
+ *
+ * Revision 1.1  1995/02/03  17:04:38  quinn
+ * Initial revision
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+#include <yaz/oid.h>
+
+/*
+ * Top level oid en/decoder.
+ * Returns 1 on success, 0 on error.
+ */
+int odr_oid(ODR o, Odr_oid **p, int opt, const char *name)
+{
+    int res, cons = 0;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_OID;
+    }
+    if ((res = ber_tag(o, p, o->t_class, o->t_tag, &cons, opt)) < 0)
+    	return 0;
+    if (!res)
+    	return opt;
+    if (cons)
+    {
+    	o->error = OPROTO;
+	return 0;
+    }
+    if (o->direction == ODR_PRINT)
+    {
+    	int i;
+
+	odr_prname(o, name);
+    	fprintf(o->print, "OID:");
+    	for (i = 0; (*p)[i] > -1; i++)
+	    fprintf(o->print, " %d", (*p)[i]);
+	fprintf(o->print, "\n");
+    	return 1;
+    }
+    if (o->direction == ODR_DECODE)
+    	*p = (int *)odr_malloc(o, OID_SIZE * sizeof(**p));
+    return ber_oidc(o, *p);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_seq.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_seq.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_seq.c	(revision 21083)
@@ -0,0 +1,239 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:24  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.27  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.26  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.25  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.24  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.23  1998/03/20 14:45:01  adam
+ * Implemented odr_enum and odr_set_of.
+ *
+ * Revision 1.22  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.21  1997/11/24 11:33:56  adam
+ * Using function odr_nullval() instead of global ODR_NULLVAL when
+ * appropriate.
+ *
+ * Revision 1.20  1997/09/29 07:17:31  adam
+ * Added typecast to avoid warnings on MSVC.
+ *
+ * Revision 1.19  1997/06/23 10:31:11  adam
+ * Added RVDM's SEQUENCE OF patch again!
+ *
+ * Revision 1.18  1997/05/14 06:53:58  adam
+ * C++ support.
+ *
+ * Revision 1.17  1997/05/05 11:21:09  adam
+ * In handling of SEQUENCE OF: Counter set to zero when SEQUENCE
+ * OF isn't there at all.
+ *
+ * Revision 1.16  1995/09/29 17:12:26  quinn
+ * Smallish
+ *
+ * Revision 1.15  1995/09/27  15:03:00  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.14  1995/08/15  11:16:39  quinn
+ * Fixed pretty-printers.
+ *
+ * Revision 1.13  1995/05/22  14:56:57  quinn
+ * Fixed problem in decoding empty sequence.
+ *
+ * Revision 1.12  1995/05/18  13:06:32  quinn
+ * Smallish.
+ *
+ * Revision 1.11  1995/05/17  08:41:54  quinn
+ * Small, hopefully insignificant change.
+ *
+ * Revision 1.10  1995/05/16  08:50:59  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.9  1995/03/17  10:17:57  quinn
+ * Added memory management.
+ *
+ * Revision 1.8  1995/03/15  11:18:05  quinn
+ * Fixed serious bug in odr_cons
+ *
+ * Revision 1.7  1995/03/08  12:12:30  quinn
+ * Added better error checking.
+ *
+ * Revision 1.6  1995/02/10  15:55:29  quinn
+ * Bug fixes, mostly.
+ *
+ * Revision 1.5  1995/02/09  15:51:49  quinn
+ * Works better now.
+ *
+ * Revision 1.4  1995/02/07  17:53:00  quinn
+ * A damn mess, but now things work, I think.
+ *
+ * Revision 1.3  1995/02/07  14:13:46  quinn
+ * Bug fixes.
+ *
+ * Revision 1.2  1995/02/06  16:45:03  quinn
+ * Small mods.
+ *
+ * Revision 1.1  1995/02/02  16:21:54  quinn
+ * First kick.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int odr_sequence_begin(ODR o, void *p, int size, const char *name)
+{
+    char **pp = (char**) p;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_SEQUENCE;
+    }
+    if (o->direction == ODR_DECODE)
+    	*pp = 0;
+    if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
+    {
+    	if (o->direction == ODR_DECODE && size)
+	    *pp = (char *)odr_malloc(o, size);
+    	return 1;
+    }
+    else
+    	return 0;
+}
+
+int odr_set_begin(ODR o, void *p, int size, const char *name)
+{
+    char **pp = (char**) p;
+
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+    	o->t_class = ODR_UNIVERSAL;
+    	o->t_tag = ODR_SET;
+    }
+    if (o->direction == ODR_DECODE)
+    	*pp = 0;
+    if (odr_constructed_begin(o, p, o->t_class, o->t_tag, name))
+    {
+    	if (o->direction == ODR_DECODE && size)
+	    *pp = (char *)odr_malloc(o, size);
+    	return 1;
+    }
+    else
+    	return 0;
+}
+
+int odr_sequence_end(ODR o)
+{
+    return odr_constructed_end(o);    
+}
+
+int odr_set_end(ODR o)
+{
+    return odr_constructed_end(o);    
+}
+
+static int odr_sequence_more(ODR o)
+{
+    return odr_constructed_more(o);
+}
+
+static int odr_sequence_x (ODR o, Odr_fun type, void *p, int *num)
+{
+    char ***pp = (char***) p;  /* for dereferencing */
+    char **tmp = 0;
+    int size = 0, i;
+
+    switch (o->direction)
+    {
+    	case ODR_DECODE:
+	    *num = 0;
+	    *pp = (char **)odr_nullval();
+	    while (odr_sequence_more(o))
+	    {
+		/* outgrown array? */
+		if (*num * (int) sizeof(void*) >= size)
+		{
+		    /* double the buffer size */
+		    tmp = (char **)odr_malloc(o, sizeof(void*) *
+					      (size += size ? size : 128));
+		    if (*num)
+		    {
+			memcpy(tmp, *pp, *num * sizeof(void*));
+			/*
+			 * For now, we just throw the old *p away, since we use
+			 * nibble memory anyway (disgusting, isn't it?).
+			 */
+		    }
+		    *pp = tmp;
+		}
+		if (!(*type)(o, (*pp) + *num, 0, 0))
+		    return 0;
+		(*num)++;
+	    }
+	    break;
+    	case ODR_ENCODE: case ODR_PRINT:
+#ifdef ODR_DEBUG
+	    fprintf(stderr, "[seqof: num=%d]", *num);
+#endif
+	    for (i = 0; i < *num; i++)
+	    {
+#ifdef ODR_DEBUG
+		fprintf(stderr, "[seqof: elem #%d]", i);
+#endif
+	    	if (!(*type)(o, *pp + i, 0, 0))
+		    return 0;
+	    }
+	    break;
+    	default:
+	    o->error = OOTHER;
+	    return 0;
+    }
+    return odr_sequence_end(o);
+}
+
+int odr_set_of(ODR o, Odr_fun type, void *p, int *num, const char *name)
+{
+    if (!odr_set_begin(o, p, 0, name)) {
+	if (o->direction == ODR_DECODE)
+	    *num = 0;
+    	return 0;
+    }
+    return odr_sequence_x (o, type, p, num);
+}
+
+int odr_sequence_of(ODR o, Odr_fun type, void *p, int *num,
+		    const char *name)
+{
+    if (!odr_sequence_begin(o, p, 0, name)) {
+	if (o->direction == ODR_DECODE)
+	    *num = 0;
+    	return 0;
+    }
+    return odr_sequence_x (o, type, p, num);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_tag.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_tag.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_tag.c	(revision 21083)
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:24  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  1999/11/30 13:47:11  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.8  1997/05/14 06:53:59  adam
+ * C++ support.
+ *
+ * Revision 1.7  1996/02/20 12:52:54  quinn
+ * Added odr_peektag
+ *
+ * Revision 1.6  1995/12/14  16:28:26  quinn
+ * More explain stuff.
+ *
+ * Revision 1.5  1995/09/29  17:12:27  quinn
+ * Smallish
+ *
+ * Revision 1.4  1995/09/27  15:03:00  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/05/16  08:51:00  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.2  1995/03/08  12:12:31  quinn
+ * Added better error checking.
+ *
+ * Revision 1.1  1995/02/02  16:21:54  quinn
+ * First kick.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int odr_peektag(ODR o, int *zclass, int *tag, int *cons)
+{
+    if (o->direction != ODR_DECODE)
+    {
+	o->error = OOTHER;
+	return 0;
+    }
+    if (o->stackp > -1 && !odr_constructed_more(o))
+	return 0;
+    if (ber_dectag(o->bp, zclass, tag, cons) <= 0)
+    {
+	o->error = OREQUIRED;
+	return 0;
+    }
+    return 1;
+}
+
+int odr_implicit_settag(ODR o, int zclass, int tag)
+{
+    if (o->error)
+    	return 0;
+    if (o->t_class < 0)
+    {
+	o->t_class = zclass;
+	o->t_tag = tag;
+    }
+    return 1;
+}
+
+int odr_initmember(ODR o, void *p, int size)
+{
+    char **pp = (char **) p;
+
+    if (o->error)
+	return 0;
+    if (o->direction == ODR_DECODE)
+	*pp = (char *)odr_malloc(o, size);
+    else if (!*pp)
+    {
+	o->t_class = -1;
+	return 0;
+    }
+    return 1;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_use.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_use.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_use.c	(revision 21083)
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:25  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.8  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.7  1995/09/29 17:12:27  quinn
+ * Smallish
+ *
+ * Revision 1.6  1995/09/27  15:03:00  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.5  1995/08/10  08:54:47  quinn
+ * Added Explain.
+ *
+ * Revision 1.4  1995/06/16  13:16:12  quinn
+ * Fixed Defaultdiagformat.
+ *
+ * Revision 1.3  1995/05/16  08:51:00  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.2  1995/02/09  15:51:50  quinn
+ * Works better now.
+ *
+ * Revision 1.1  1995/02/03  17:04:39  quinn
+ * Initial revision
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <yaz/odr.h>
+
+int odr_external(ODR o, Odr_external **p, int opt, const char *name)
+{
+    Odr_external *pp;
+    static Odr_arm arm[] =
+    {
+    	{ODR_EXPLICIT, ODR_CONTEXT, 0, ODR_EXTERNAL_single, 
+	 (Odr_fun)odr_any, "single"},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 1, ODR_EXTERNAL_octet,
+	 (Odr_fun)odr_octetstring, "octet"},
+    	{ODR_IMPLICIT, ODR_CONTEXT, 2, ODR_EXTERNAL_arbitrary,
+	 (Odr_fun)odr_bitstring, "arbitrary"},
+    	{-1, -1, -1, -1, 0, 0}
+    };
+
+    odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
+    if (!odr_sequence_begin(o, p, sizeof(Odr_external), name))
+    	return opt;
+    pp = *p;
+    return
+    	odr_oid(o, &pp->direct_reference, 1, "direct") &&
+    	odr_integer(o, &pp->indirect_reference, 1, "indirect") &&
+    	odr_graphicstring(o, &pp->descriptor, 1, "descriptor") &&
+    	odr_choice(o, arm, &pp->u, &pp->which, 0) &&
+	odr_sequence_end(o);
+}
+
+int odr_visiblestring(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+			    ODR_VISIBLESTRING, opt, name);
+}    
+
+/*
+ * a char may not be sufficient to hold a general string, but we'll deal
+ * with that once we start looking more closely at UniCode & co.
+ */
+int odr_generalstring(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+			    ODR_GENERALSTRING,opt, name);
+}    
+
+int odr_graphicstring(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+			ODR_GRAPHICSTRING, opt, name);
+}    
+
+int odr_generalizedtime(ODR o, char **p, int opt, const char *name)
+{
+    return odr_implicit_tag(o, odr_cstring, p, ODR_UNIVERSAL,
+			    ODR_GENERALIZEDTIME, opt, name);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/odr/odr_util.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/odr/odr_util.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/odr/odr_util.c	(revision 21083)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:11:26  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.19  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.18  2000/01/31 13:15:21  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.17  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.16  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.15  1999/01/08 11:23:29  adam
+ * Added const modifier to some of the BER/ODR encoding routines.
+ *
+ * Revision 1.14  1998/10/13 15:58:36  adam
+ * Minor fix in odr_getoidbystr_nmem.
+ *
+ * Revision 1.13  1998/02/11 11:53:34  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.12  1997/10/31 12:20:08  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <yaz/odr.h>
+#include <yaz/oid.h>
+
+void odr_prname(ODR o, const char *name)
+{
+    if (name)
+	fprintf (o->print, "%*s%s ", o->indent*4, "", name);
+    else
+	fprintf (o->print, "%*s", o->indent*4, "");
+}
+
+int odp_more_chunks(ODR o, const unsigned char *base, int len)
+{
+    if (!len)
+    	return 0;
+    if (len < 0) /* indefinite length */
+    {
+	if (*o->bp == 0 && *(o->bp + 1) == 0)
+	{
+	    o->bp += 2;
+	    return 0;
+	}
+	else
+	    return 1;
+    }
+    else
+        return o->bp - base < len;
+}
+
+Odr_oid *odr_oiddup_nmem(NMEM nmem, Odr_oid *o)
+{
+    Odr_oid *r;
+
+    if (!o)
+    	return 0;
+    if (!(r = (int *)nmem_malloc(nmem, (oid_oidlen(o) + 1) * sizeof(int))))
+    	return 0;
+    oid_oidcpy(r, o);
+    return r;
+}
+
+Odr_oid *odr_oiddup(ODR odr, Odr_oid *o)
+{
+    return odr_oiddup_nmem (odr->mem, o);
+}
+
+Odr_oid *odr_getoidbystr_nmem(NMEM nmem, char *str)
+{
+    int num = 1, i = 0;
+    char *p = str;
+    Odr_oid *ret;
+
+    if (!isdigit(*str))
+	return 0;
+    while ((p = strchr(p, '.')))
+	num++, p++;
+    ret = (int *)nmem_malloc(nmem, sizeof(*ret)*(num + 1));
+    p = str;
+    do
+	ret[i++] = atoi(p);
+    while ((p = strchr(p, '.')) && *++p);
+    ret[i] = -1;
+    return ret;
+}
+
+Odr_oid *odr_getoidbystr(ODR o, char *str)
+{
+    return odr_getoidbystr_nmem (o->mem, str);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.am	(revision 21083)
@@ -0,0 +1,16 @@
+## $Id$
+
+tabdatadir = $(pkgdatadir)/tab
+tabdata_DATA = bib1.att dan1.att danmarc.abs explain.abs explain.att \
+ explain.tag generic.tag gils-a.est gils-b.est gils-f.est gils-g.est \
+ gils-summary.map gils-usmarc.map gils-variant.est gils.abs gils.att \
+ gils.tag meta-b.est meta-usmarc.map meta.abs meta.tag summary.abs \
+ summary.tag tagsetg.tag tagsetm.tag usmarc-b.est usmarc.abs usmarc.mar \
+ usmarc.tag var1.var wais-b.est wais-variant.est wais.abs 
+
+EXTRA_DIST = bib1.att dan1.att danmarc.abs explain.abs explain.att \
+ explain.tag generic.tag gils-a.est gils-b.est gils-f.est gils-g.est \
+ gils-summary.map gils-usmarc.map gils-variant.est gils.abs gils.att \
+ gils.tag meta-b.est meta-usmarc.map meta.abs meta.tag summary.abs \
+ summary.tag tagsetg.tag tagsetm.tag usmarc-b.est usmarc.abs usmarc.mar \
+ usmarc.tag var1.var wais-b.est wais-variant.est wais.abs 
Index: /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/Makefile.in	(revision 21083)
@@ -0,0 +1,202 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+tabdatadir = $(pkgdatadir)/tab
+tabdata_DATA = bib1.att dan1.att danmarc.abs explain.abs explain.att  explain.tag generic.tag gils-a.est gils-b.est gils-f.est gils-g.est  gils-summary.map gils-usmarc.map gils-variant.est gils.abs gils.att  gils.tag meta-b.est meta-usmarc.map meta.abs meta.tag summary.abs  summary.tag tagsetg.tag tagsetm.tag usmarc-b.est usmarc.abs usmarc.mar  usmarc.tag var1.var wais-b.est wais-variant.est wais.abs 
+
+
+EXTRA_DIST = bib1.att dan1.att danmarc.abs explain.abs explain.att  explain.tag generic.tag gils-a.est gils-b.est gils-f.est gils-g.est  gils-summary.map gils-usmarc.map gils-variant.est gils.abs gils.att  gils.tag meta-b.est meta-usmarc.map meta.abs meta.tag summary.abs  summary.tag tagsetg.tag tagsetm.tag usmarc-b.est usmarc.abs usmarc.mar  usmarc.tag var1.var wais-b.est wais-variant.est wais.abs 
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+DATA =  $(tabdata_DATA)
+
+DIST_COMMON =  Makefile.am Makefile.in
+
+
+DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
+
+TAR = tar
+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 tab/Makefile
+
+Makefile: $(srcdir)/Makefile.in  $(top_builddir)/config.status
+	cd $(top_builddir) \
+	  && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status
+
+
+install-tabdataDATA: $(tabdata_DATA)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(tabdatadir)
+	@list='$(tabdata_DATA)'; for p in $$list; do \
+	  if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(tabdatadir)/$$p"; \
+	    $(INSTALL_DATA) $(srcdir)/$$p $(DESTDIR)$(tabdatadir)/$$p; \
+	  else if test -f $$p; then \
+	    echo " $(INSTALL_DATA) $$p $(DESTDIR)$(tabdatadir)/$$p"; \
+	    $(INSTALL_DATA) $$p $(DESTDIR)$(tabdatadir)/$$p; \
+	  fi; fi; \
+	done
+
+uninstall-tabdataDATA:
+	@$(NORMAL_UNINSTALL)
+	list='$(tabdata_DATA)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(tabdatadir)/$$p; \
+	done
+tags: TAGS
+TAGS:
+
+
+distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir)
+
+subdir = tab
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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-tabdataDATA
+install-data: install-data-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+install: install-am
+uninstall-am: uninstall-tabdataDATA
+uninstall: uninstall-am
+all-am: Makefile $(DATA)
+all-redirect: all-am
+install-strip:
+	$(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install
+installdirs:
+	$(mkinstalldirs)  $(DESTDIR)$(tabdatadir)
+
+
+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: uninstall-tabdataDATA install-tabdataDATA 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:
Index: /main/tags/2.38/gsdl/packages/yaz/tab/bib1.att
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/bib1.att	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/bib1.att	(revision 21083)
@@ -0,0 +1,104 @@
+# $Id$
+# Bib-1 Attribute Set
+name bib1
+reference Bib-1
+
+att 1               Personal-name
+att 2               Corporate-name
+att 3               Conference-name
+att 4               Title
+att 5               Title-series
+att 6               Title-uniform
+att 7               ISBN
+att 8               ISSN
+att 9               LC-card-number
+att 10              BNB-card-number
+att 11              BGF-number
+att 12              Local-number
+att 13              Dewey-classification
+att 14              UDC-classification
+att 15              Bliss-classification
+att 16              LC-call-number
+att 17              NLM-call-number
+att 18              NAL-call-number
+att 19              MOS-call-number
+att 20              Local-classification
+att 21              Subject-heading
+att 22              Subject-Rameau
+att 23              BDI-index-subject
+att 24              INSPEC-subject
+att 25              MESH-subject
+att 26              PA-subject
+att 27              LC-subject-heading
+att 28              RVM-subject-heading
+att 29              Local-subject-index
+att 30              Date
+att 31              Date-of-publication
+att 32              Date-of-acquisition
+att 33              Title-key
+att 34              Title-collective
+att 35              Title-parallel
+att 36              Title-cover
+att 37              Title-added-title-page
+att 38              Title-caption
+att 39              Title-running
+att 40              Title-spine
+att 41              Title-other-variant
+att 42              Title-former
+att 43              Title-abbreviated
+att 44              Title-expanded
+att 45              Subject-precis
+att 46              Subject-rswk
+att 47              Subject-subdivision
+att 48              Number-natl-biblio
+att 49              Number-legal-deposit
+att 50              Number-govt-pub
+att 51              Number-music-publisher
+att 52              Number-db
+att 53              Number-local-call
+att 54              Code-language
+att 55              Code-geographic
+att 56              Code-institution
+att 57              Name-and-title
+att 58              Name-geographic
+att 59              Place-publication
+att 60              CODEN
+att 61              Microform-generation
+att 62              Abstract
+att 63              Note
+att 1000            Author-title
+att 1001            Record-type
+att 1002            Name
+att 1003            Author
+att 1004            Author-name-personal
+att 1005            Author-name-corporate
+att 1006            Author-name-conference
+att 1007            Identifier-standard
+att 1008            Subject-LC-childrens
+att 1009            Subject-name-personal
+att 1010            Body-of-text
+att 1011            Date/time-added-to-db
+att 1012            Date/time-last-modified
+att 1013            Authority/format-id
+att 1014            Concept-text
+att 1015            Concept-reference
+att 1016            Any 		1016,4,1005,62
+att 1017            Server-choice
+att 1018            Publisher
+att 1019            Record-source
+att 1020            Editor
+att 1021            Bib-level
+att 1022            Geographic-class
+att 1023            Indexed-by
+att 1024            Map-scale
+att 1025            Music-key
+att 1026            Related-periodical
+att 1027            Report-number
+att 1028            Stock-number
+att 1030            Thematic-number
+att 1031            Material-type
+att 1032            Doc-id
+att 1033            Host-item
+att 1034            Content-type
+att 1035            Anywhere
+att 1036            Author-Title-Subject
Index: /main/tags/2.38/gsdl/packages/yaz/tab/dan1.att
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/dan1.att	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/dan1.att	(revision 21083)
@@ -0,0 +1,22 @@
+name dan1
+reference 1.2.840.10003.3.15
+att 1         Classification-DK5-alfa-subdivision   # au Alfabetisk underdeling DK-5
+att 2         Subject-controlled                    # ke Kontrollerede emneord
+att 3         Subject-DBC                           # db DBC emneord
+att 4         Subject-DBC-non-fiction               # df DBC-faglitterære emneord
+att 5         Subject-DBC-fiction                   # ds DBC-skønlitterære emneord
+att 6         Subject-DBC-music                     # me DBC-Musikemneord
+att 7         Form-as-subject                       # fm Form betegnelse som emneord 
+att 8         Level-as-subject                      # nb Niveau-emneord
+att 9         Shelf-mark                            # po Opstillingselement
+att 10        Classification-DK5-number             # dk DK5
+att 11        Classification-as-shelf-mark          # ok Klassifikation som opstilling
+att 12        Obsolete-shelf-mark                   # gd Forældet dk-klassemærke
+att 13        Subject-FUI                           # fg FUI-Koder
+att 14        Catalogue-code                        # kk Katalogkode
+att 15        LIX-number                            # ix LIX
+att 16        Music-notation                        # nm Musikalsk notation
+att 17        Item-number                           # nr Numre
+att 18        Local-item-number                     # en Numre på ens materiale
+att 19        Previous-FAUST-code                   # tf Tidligere og lokale faustnumre 
+att 20        Title-host-publication                # lvx Værtspublikationstitel (uden nummer)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/danmarc.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/danmarc.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/danmarc.abs	(revision 21083)
@@ -0,0 +1,740 @@
+name danmarc
+reference DANmarc
+attset bib1.att dan1.att
+
+elm 10          DanBib-ID-nummer                    -
+elm 10/?        DanBib-ID-nummer                    Item-number
+elm 10/?/a      DanBib-ID-nummer                    Item-number
+elm 10/?/b      Dataproducentens-biblioteksnummer   -
+
+elm 11          ID-nummer-på-hovedmaterialets-post  -
+elm 11/?        ID-nummer-på-hovedmaterialets-post  -
+elm 11/?/a      ID-nummer-på-hovedmaterialets-post  -
+
+elm 14          ID-nummer-på-post-på-højere-niveau  -
+elm 14/?        ID-nummer-på-post-på-højere-niveau  -
+elm 14/?/a      ID-nummer-på-post-på-højere-niveau  -
+elm 14/?/x      ID-nummer-på-post-på-højere-niveau  Item-number
+
+elm 15          ID-nummer-på-post-på-lavere-niveau  -
+elm 15/?        ID-nummer-på-post-på-lavere-niveau  Item-number
+elm 15/?/a      ID-nummer-på-post-på-lavere-niveau  Item-number
+
+elm 16          ID-nummer-på-værtspublikation       -
+elm 16/?        ID-nummer-på-værtspublikation       -
+elm 16/?/a      ID-nummer-på-værtspublikation       -
+
+elm 17          ID-nummer-på-første-udgave          -
+elm 17/?        ID-nummer-på-første-udgave          Item-number,Local-item-number
+elm 17/?/a      ID-nummer-på-første-udgave          Item-number,Local-item-number
+
+elm 18          ID-nummer-på-anden-post-for-samme-materiale          -
+elm 18/?        ID-nummer-på-anden-post-for-samme-materiale          Item-number,Local-item-number
+elm 18/?/a      ID-nummer-på-anden-post-for-samme-materiale          Item-number,Local-item-number
+
+elm 20          Nationalbibliografisk-nummer        -
+elm 20/?        Nationalbibliografisk-nummer        Item-number
+elm 20/?/a      Landekode-for-nationalbibliografi   -
+elm 20/?/b      Nationalbibliografisk-nummer        Item-number
+
+elm 21          ISBN                                -
+elm 21/?        ISBN                                ISBN,Identifier--standard,Item-number
+elm 21/?/a      ISBN                                ISBN,Identifier--standard,Item-number
+elm 21/?/b      Tilføjelse                          -
+elm 21/?/c      Bindtype                            -
+elm 21/?/d      Anskaffelsesvilkår/pris             -
+elm 21/?/n      Bestillingsnummer                   Item-number
+elm 21/?/x      Fejltryk-eller-fejlagtigt-anvendt-ISBN  ISBN,Identifier--standard,Item-number
+
+elm 22          ISSN                                -
+elm 22/?        ISSN                                ISBN,Identifier--standard,Item-number
+elm 22/?/a      ISSN                                ISBN,Identifier--standard,Item-number
+elm 22/?/b      Tilføjelse                          -
+elm 22/?/c      Bindtype                            -
+elm 22/?/d      Anskaffelsesvilkår/pris             -
+elm 22/?/z      Fejlagtigt-tildelt-ISSN             ISBN,Identifier--standard,Item-number
+
+elm 28          ISMN                                -
+elm 28/?        ISMN                                ISBN,Identifier--standard,Item-number
+elm 28/?/a      ISMN                                ISBN,Identifier--standard,Item-number
+elm 28/?/b      Tilføjelse                          -
+elm 28/?/c      Bindtype                            -
+elm 28/?/d      Anskaffelsesvilkår/pris             -
+elm 28/?/n      Bestillingsnummer                   Item-number
+
+elm 30          CODEN                               -
+elm 30/?        CODEN                               CODEN,Item-number
+elm 30/?/a      CODEN                               CODEN,Item-number
+
+elm 32          Kode-for-natio-eller-fagbibliografi -
+elm 32/?        Kode-for-natio-eller-fagbibliografi Catalogue-code
+elm 32/?/a      Kode-for-nationalbibliografi        Catalogue-code
+elm 32/?/x      Kode-for-fagbibliografi             Catalogue-code
+
+elm 34          Kodede-matematiske-oplysninger      -
+elm 34/?        Kodede-matematiske-oplysninger      Code-map-scale
+elm 34/?/a      Målestokstype                       Code-map-scale
+elm 34/?/b      Konstant-lineær-vandret-målestok    Code-map-scale
+elm 34/?/d      Koordinater                         Code-map-scale
+elm 34/?/e      Koordinater                         Code-map-scale
+elm 34/?/f      Koordinater                         Code-map-scale
+elm 34/?/g      Koordinater                         Code-map-scale
+
+elm 38          Opstillingskode-for-børnelitteratur -
+elm 38/?        Opstillingskode-for-børnelitteratur -
+elm 38/?/a      Opstillingskode-for-børnelitteratur -
+
+elm 39          Opstillingskode-for-musikoptagelser -
+elm 39/?        Opstillingskode-for-musikoptagelser -
+elm 39/?/a      Opstillingskode-for-musikoptagelser -
+
+elm 41          Sprogkode                           -
+elm 41/?        Sprogkode                           -
+elm 41/?/a      Materialets-sprog                   Code-language
+elm 41/?/b      Mellemoriginalens-sprog             Code-language-original
+elm 41/?/c      Originaludgavens-sprog              Code-language-original
+elm 41/?/d      Sprog-i-resuméer                    Code-language
+elm 41/?/e      Sprog-i-mindre-dele-af-materialet   Code-language
+elm 41/?/p      Sprog-i-parallel-tekst              Code-language
+elm 41/?/u      Sprog-i-undertekster-til-film/video Code-language
+
+elm 42          Lix-tal                             -
+elm 42/?        Lix-tal                             -
+elm 42/?/a      Samlet-lix-tal                      LIX-number
+elm 42/?/b      Specifikation-af-lix-tal            -
+
+elm 43          Kode-for-geografisk-område          -
+elm 43/?        Kode-for-geografisk-område          -
+elm 43/?/a      Kode-for-geografisk-område          -
+
+elm 44          Pædagogisk-fagkode                  -
+elm 44/?        Pædagogisk-fagkode                  Subject-FUI
+elm 44/?/a      Kode-for-skoleretning               Subject-FUI
+elm 44/?/b      Kode-for-fag-og-undervisningsmateriale  Subject-FUI
+
+elm 50          LC-klassifikation                   -
+elm 50/?        LC-klassifikation                   Classification-LC
+elm 50/?/a      LC-klassifikation                   -
+elm 50/?/b      Materialenummer                     -
+
+elm 60          NLM-klassifikation                  -
+elm 60/?        NLM-klassifikation                  Classification-NLM
+elm 60/?/a      NLM-klassifikation                  -
+elm 60/?/b      Materialenummer                     -
+
+elm 70          NAL-klassifikation                  -
+elm 70/?        NAL-klassifikation                  Classification-NAL
+elm 70/?/a      Materialenummer                     -
+
+elm 79          DB-klassifikation                   -
+elm 79/?        DB-klassifikation                   Classification-DB 
+elm 79/?/a      Systemkode                          -
+
+elm 80          UDK                                 -
+elm 80/?        UDK                                 Classification-UDC
+elm 80/?/a      UDK-notation                        -
+
+elm 82          DDC                                 -
+elm 82/?        DDC                                 Classification-Dewey
+elm 82/?/a      Basisnummer                         -
+elm 82/?/b      Udgivelse                           -
+elm 82/?/c      DDC-udgave                          -
+
+elm 83          Felt-083                            -
+elm 83/?        Felt-083                            -
+elm 83/?/a      Felt-083                            -
+elm 83/?/b      Felt-083                            -
+
+elm 85          BCM-klassifikation                  -
+elm 85/?        BCM-klassifikation                  Classification-BCM
+elm 85/?/a      BCM-klassifikation                  -
+elm 85/?/b      BCM-klassifikation                  -
+elm 85/?/c      BCM-klassifikation                  -
+
+elm 87          Lokal-klassifikationsnotation-1     -
+elm 87/?        Lokal-klassifikationsnotation-1     -
+elm 87/?/a      Lokal-klassifikationsnotation-1     Classification-local
+elm 87/?/b      Lokal-klassifikationsnotation-1     -
+
+elm 88          Lokal-klassifikationsnotation-2     -
+elm 88/?        Lokal-klassifikationsnotation-2     -
+elm 88/?/a      Lokal-klassifikationsnotation-2     Classification-local
+elm 88/?/b      Lokal-klassifikationsnotation-2     -
+elm 88/?/c      Lokal-klassifikationsnotation-2     -
+elm 88/?/d      Lokal-klassifikationsnotation-2     -
+elm 88/?/e      Lokal-klassifikationsnotation-2     -
+elm 88/?/f      Lokal-klassifikationsnotation-2     -
+elm 88/?/n      Lokal-klassifikationsnotation-2     -
+elm 88/?/p      Lokal-klassifikationsnotation-2     -
+elm 88/?/q      Lokal-klassifikationsnotation-2     -
+elm 88/?/t      Lokal-klassifikationsnotation-2     -
+elm 88/?/u      Lokal-klassifikationsnotation-2     -
+
+elm 89          Lokal-klassifikationsnotation-3     -
+elm 89/?        Lokal-klassifikationsnotation-3     -
+elm 89/?/a      Lokal-klassifikationsnotation-3     Classification-local
+elm 89/?/b      Lokal-klassifikationsnotation-3     -
+elm 89/?/c      Lokal-klassifikationsnotation-3     -
+
+elm 96          Lokal-opstillingssignatur           -
+elm 96/?        Lokal-opstillingssignatur           -
+elm 96/?/a      Opstilling           -
+elm 96/?/n      Lokal-opstillingssignatur           -
+elm 96/?/z      Lokaliseringskode                   -
+
+elm 100         Personnavn                  -
+elm 100/?       Personnavn                  Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+elm 100/?/a     Efternavn/fornavn-alene     Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+elm 100/?/c     Fødselsår                   Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+elm 100/?/f     Tilføjelse                  Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+elm 100/?/h     Fornavn                     Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+elm 100/?/k     Fuldt-udskrevet-fornavn     Author-name:w,Author-name:p,Author-name-personal:w,Author-name-personal:p,Shelf-mark
+
+elm 110         Korporationsnavn-opstillingselement     -
+elm 110/?       Korporationsnavn-opstillingselement     Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/a     Korporationsnavn                        Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/c     Underkorporation                        Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/e     Tilføjelse                              Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/i     Nummer-på-konference                    Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/j     Sted-for-konference                     Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+elm 110/?/k     År-for-konference                       Author-name:w,Author-name:p,Author-name-corporate:w,Author-name-corporate:p,Shelf-mark
+
+elm 210         Forkortet-nøgletitel                    -
+elm 210/?       Forkortet-nøgletitel                    Title-key,Title,Title:p
+elm 210/?/a     Forkortet-nøgletitel                    Title-key,Title,Title:p
+elm 210/?/b     Forkortet-identificerende-tilføjelse    Title-key,Title,Title:p
+
+elm 222         Nøgletitel                  -
+elm 222/?       Nøgletitel                  Title-key,Title,Title:p
+elm 222/?/a     Nøgletitel                  Title-key,Title,Title:p
+elm 222/?/b     Identificerende-tilføjelse  Title-key,Title,Title:p
+
+elm 239         Uniform-titel/standardtitel-opstillingselement  -
+elm 239/?       Uniform-titel/standardtitel-opstillingselement  Title-uniform,Title,Title:p
+elm 239/?/t     Uniform-titel                                   Title-uniform,Title,Title:p
+elm 239/?/u     Almindeligt-kendt-tilnavn                       Title-uniform,Title,Title:p
+elm 239/?/v     Uddragstitel                                    Title-uniform,Title,Title:p
+elm 239/?/Ø     Uniform-titel/standardtitel-opstillingselement  -
+elm 239/?/ø     Identificerende-tilføjelser                     Title-uniform,Title
+
+elm 240         Uniform-titel-opstillingselement    -
+elm 240/?       Uniform-titel-opstillingselement    Title-uniform,Title,Title:p
+elm 240/?/a     Uniform-titel                       Title-uniform,Title,Title:p
+elm 240/?/j     Andet-identificerende-element       Title-uniform,Title,Title:p
+elm 240/?/r     Sprog-i-oversættelse/version        -
+elm 240/?/u     Udgivelsesår                        -
+elm 240/?/ø     Identificerende-tilføjelser         Title-uniform,Title
+
+elm 241         Originaltitel           -
+elm 241/?       Originaltitel           Title,Title:p
+elm 241/?/a     Originaltitel           Title,Title:p
+elm 241/?/r     Sprog                   -
+
+elm 245         Originaltitel-og-ophavsangivelse            -
+elm 245/?       Originaltitel-og-ophavsangivelse            Title,Title:p
+elm 245/?/A     Originaltitel-og-ophavsangivelse            -
+elm 245/?/G     Originaltitel-og-ophavsangivelse            -
+elm 245/?/a     Titel                                       Title,Title:p
+elm 245/?/b     Rest-af-titel-eller-alternativ-titel        Title,Title:p
+elm 245/?/c     Undertitel-og-anden-titelinformation        Title,Title:p
+elm 245/?/e     Ophavsangivelser-opslag                     -
+elm 245/?/f     Ophavsangivelser                            -
+elm 245/?/g     Numerisk-eller-alfabetisk-betegnelse-for-bind                       Title,Title:p
+elm 245/?/i     Anden-primær/sekundær-ophavsangivelse-kun-i-nationalbibliogafien    -
+elm 245/?/j     Anden-primær/sekundær-ophavsangivelse-ikke-i-nationalbibliogafien   -
+elm 245/?/o     Titel-på-supplement/sektion                  -
+elm 245/?/p     Paralleltitel                               Title-parallel,Title,Title:p
+elm 245/?/s     Parallel-undertitel                         Title-parallel,Title,Title:p
+elm 245/?/u     Markant-undertitel                          Title,Title:p
+elm 245/?/x     Hovedtitel-på-tilføjet-værk-af-andet-ophav  Title,Title:p
+elm 245/?/y     Titel-på-supplement                         Title,Title:p
+elm 245/?/Ø     Originaltitel-og-ophavsangivelse            -
+elm 245/?/æ     Identificerende-ophavsangivelse-til-titel   -
+elm 245/?/ø     Identificerende-tilføjelser-til-titel       -
+
+elm 248         Bindspecifikation                       -
+elm 248/?       Bindspecifikation                       Title
+elm 248/?/a     Bindtitel/supplementstitel              Title,Title:p
+elm 248/?/c     Undertitel-og-anden-titelinformation    Title,Title:p
+elm 248/?/e     Ophavsangivelse                         -
+elm 248/?/g     Bindnummer/supplementsbetegnelse        Title
+elm 248/?/j     Udgivelsesår                            -
+elm 248/?/l     Generel-note                            Note
+elm 248/?/w     Udgavebetegnelse                        -
+
+elm 250         Udgavebetegnelse                        -
+elm 250/?       Udgavebetegnelse                        -
+elm 250/?/a     Udgavebetegnelse                        -
+elm 250/?/b     Kort-udgavebetegnelse/sonderingselement -
+elm 250/?/c     Ophavsangivelse-opslag                  -
+elm 250/?/d     Ophavsangivelse                         -
+elm 250/?/x     Oplagsbetegnelse                        -
+
+elm 255         Nummereringer-og-dateringer   -
+elm 255/?       Nummereringer-og-dateringer   -
+elm 255/?/a     Nummereringer-og-dateringer   -
+
+elm 256         Matematiske-oplysninger-for-kartografiske-materialer    -
+elm 256/?       Matematiske-oplysninger-for-kartografiske-materialer    Code-map-scale
+elm 256/?/a     Målestok                                                Code-map-scale
+elm 256/?/c     Projektion                                              Code-map-scale
+
+elm 260         Publicering/distribution        -
+elm 260/?       Publicering/distribution        -
+elm 260/?/a     Hjemsted-for-forlag             Name-geographic-place-publication
+elm 260/?/b     Navn-på-forlag                  Name-publisher
+elm 260/?/c     Udgivelsesår                    Date-publication
+elm 260/?/d     Adresse-på-forlag               -
+elm 260/?/e     Funktionsangivelse-på-forlag    -
+elm 260/?/f     Hjemsted-for-distributør        Name-geographic-place-publication
+elm 260/?/g     Navn-på-distributør             -
+elm 260/?/k     Trykkerioplysninger             -
+elm 260/?/p     Navn-på-forlag/distributør-på-andet-sprog/alfabet   Name-publisher
+
+elm 300         Fysisk-beskrivelse                          -
+elm 300/?       Fysisk-beskrivelse                          -
+elm 300/?/D     Fysisk-beskrivelse                          -
+elm 300/?/a     Omfang-uden-specifik-materialebetegnelse    -
+elm 300/?/b     Yderligere-fysisk-beskrivelse               -
+elm 300/?/c     Størrelse                                   -
+elm 300/?/d     Bilag                                       -
+elm 300/?/e     Tekniske-oplysninger                        -
+elm 300/?/l     Spilletid                                   -
+elm 300/?/n     Specifik-materialebetegnelse                -
+
+elm 440         Seriebetegnelse-i-materialets-form                  -
+elm 440/?       Seriebetegnelse-i-materialets-form                  -
+elm 440/?/A     Seriebetegnelse-i-materialets-form                  -
+elm 440/?/V     Seriebetegnelse-i-materialets-form                  -
+elm 440/?/a     Seriens-hovedtitel                                  Title,Title-series,Title:p
+elm 440/?/c     Undertitel-eller-anden-titelinformation             Title,Title-series,Title:p
+elm 440/?/e     Ophavsangivelse                                     -
+elm 440/?/n     Numerisk/alfabetisk-betegnelse-for-sektion          Title,Title-series
+elm 440/?/o     Titel-på-sektion                                    Title,Title-series,Title:p
+elm 440/?/p     Seriens-paralleltitel                               Title,Title-series,Title:p
+elm 440/?/v     Nummerering-og-datering-i-serien                    Title,Title-series
+elm 440/?/y     Seriebetegnelse-i-materialets-form                  -
+elm 440/?/z     Seriens-ISSN                                        Identifier-ISSN
+elm 440/?/å     Seriebetegnelse-i-materialets-form                  -
+elm 440/?/æ     Identificerende-ophavsangivelse-til-seriens-titel   -
+elm 440/?/ø     Identificerende-tilføjelse-til-seriens-titel        Title,Title-series,Title:p
+
+elm 500         Periodicums-frekvens    -
+elm 500/?       Periodicums-frekvens    -
+elm 500/?/a     Periodicums-frekvens    -
+
+elm 501         Systemkrav/adgangsmåde  -
+elm 501/?       Systemkrav              Note
+elm 501/?/a     Adgangsmåde             Note
+
+elm 502         Originaltitel/oversættelse  -
+elm 502/?       Originaltitel/oversættelse  Note
+elm 502/?/a     Originaltitel/oversættelse  Note
+
+elm 504         Indholdsbeskrivelse     -
+elm 504/?       Indholdsbeskrivelse     Note
+elm 504/?/a     Indholdsbeskrivelse     Note
+
+elm 505         Art/form                -
+elm 505/?       Art/form                Note
+elm 505/?/a     Art/form                Note
+
+elm 506         Disputats/afhandling    -
+elm 506/?       Disputats/afhandling    Note
+elm 506/?/a     Disputats/afhandling    Note
+
+
+elm 507         Anledning-til-udgivelse -
+elm 507/?       Anledning-til-udgivelse Note
+elm 507/?/a     Anledning-til-udgivelse Note
+
+elm 508         Sprog-og-alfabet        -
+elm 508/?       Sprog-og-alfabet        Note
+elm 508/?/a     Sprog-og-alfabet        Note
+
+elm 509         Besætning               -
+elm 509/?       Besætning               Note
+elm 509/?/a     Besætning               Note
+
+elm 512         Beskrivelse                     -
+elm 512/?       Beskrivelse                     -
+elm 512/?/a     Generel-note-til-beskrivelse    Note
+elm 512/?/b     Supplerende-tekst               -
+elm 512/?/e     Ophavsangivelse                 -
+elm 512/?/i     Indledende-tekst                -
+elm 512/?/t     Titel                           Title,Title:p
+
+elm 513         Fælles-ophavsangivelse  -
+elm 513/?       Fælles-ophavsangivelse  -
+elm 513/?/e     Primær-ophavsangivelse  -
+
+elm 517         Målgruppe-og-anvendelighed  -
+elm 517/?       Målgruppe-og-anvendelighed  Note
+elm 517/?/a     Målgruppe-og-anvendelighed  Note
+
+elm 520         Værkets-bibliografiske-historie -
+elm 520/?       Værkets-bibliografiske-historie -
+elm 520/?/a     Værkets-bibliografiske-historie -
+elm 520/?/b     Supplerende-tekst               -
+elm 520/?/i     Indledende-tekst                -
+elm 520/?/t     Titel                           Title,Title:p
+
+elm 521         Udgavens-oplag          -
+elm 521/?       Udgavens-oplag          -
+elm 521/?/a     Oplagsbetegnelse        -
+elm 521/?/b     Seneste-oplag           -
+elm 521/?/c     Oplagets-udgivelsesår   Date-publication
+
+elm 526         Sammenhæng-med-andre-værker -
+elm 526/?       Sammenhæng-med-andre-værker -
+elm 526/?/a     Sammenhæng-med-andre-værker Note
+elm 526/?/b     Supplerende-tekst           -
+elm 526/?/d     Ophavsangivelse-foran-titel -
+elm 526/?/e     Ophavsangivelse             -
+elm 526/?/i     Indledende-tekst            -
+elm 526/?/t     Titel                       Title,Title:p
+
+elm 530         Indholdsnote            -
+elm 530/?       Indholdsnote            -
+elm 530/?/a     Indholdsnote            Note
+elm 530/?/e     Ophavsangivelse         -
+elm 530/?/t     Titel                   Title,Title:p
+
+elm 531         Indledende-tekst-til-maskingenereret-indholdsnote   -
+elm 531/?       Indledende-tekst-til-maskingenereret-indholdsnote   -
+elm 531/?/a     Indledende-tekst-til-maskingenereret-indholdsnote   -
+
+elm 532         Litteraturhenvisninger-og-registre    -
+elm 532/?       Litteraturhenvisninger-og-registre    -
+elm 532/?/a     Litteraturhenvisninger-og-registre    -
+
+elm 534         Partielt-indhold        -
+elm 534/?       Partielt-indhold        Note
+elm 534/?/a     Partielt-indhold        Note
+
+elm 538         Numre-der-indgår-i-materialet   -
+elm 538/?       Numre-der-indgår-i-materialet   Item-number
+elm 538/?/a     Nummer                          Item-number
+elm 538/?/b     Editionsnummer                  Item-number
+elm 538/?/c     Pladenummer                     Item-number
+elm 538/?/d     Editions-og-pladenummer         Item-number
+elm 538/?/f     Forlag                          Name-publisher
+elm 538/?/g     Forlagsnummer                   Item-number
+
+elm 539         Grundlaget-for-katalogiseringen -
+elm 539/?       Grundlaget-for-katalogiseringen -
+elm 539/?/a     Grundlaget-for-katalogiseringen -
+
+elm 557         Periodicum-som-værtspublikation-for-I-analyse   -
+elm 557/?       Periodicum-som-værtspublikation-for-I-analyse   -
+elm 557/?/V     Periodicum-som-værtspublikation-for-I-analyse   -
+elm 557/?/a     Titel                                           Title,Title-host-item,Title:p
+elm 557/?/j     Udgivelsesår                                    -
+elm 557/?/v     Nummerering/datering                            Title,Title-host-item,Title:p
+
+elm 559         Generel-note            -
+elm 559/?       Generel-note            -
+elm 559/?/a     Generel-note            Note
+
+elm 600         Personnavn-emneord      -
+elm 600/?       Personnavn-emneord      Subject,Subject-name-personal,Subject:p
+elm 600/?/a     Efternavn/fornavn-alene Subject,Subject-name-personal,Subject:p
+elm 600/?/c     Fødselsår               Subject,Subject-name-personal,Subject:p
+elm 600/?/e     Romertal                Subject,Subject-name-personal,Subject:p
+elm 600/?/f     Tilføjelse              Subject,Subject-name-personal,Subject:p
+elm 600/?/h     Fornavn                 Subject,Subject-name-personal,Subject:p
+elm 600/?/k     Fuldt-udskrevet-fornavn Subject,Subject-name-personal,Subject:p
+elm 600/?/x     Underdeling-emne/art    Subject,Subject-name-personal,Subject:p
+elm 600/?/å     Personnavn-emneord      Subject,Subject-name-personal,Subject:p
+
+elm 610         Korporationsnavn-emneord    -
+elm 610/?       Korporationsnavn-emneord    Subject,Subject-name-corporate,Subject:p
+elm 610/?/a     Korporationsnavn            Subject,Subject-name-corporate,Subject:p
+elm 610/?/c     Underkorporation            Subject,Subject-name-corporate,Subject:p
+elm 610/?/e     Tilføjelse                  Subject,Subject-name-corporate,Subject:p
+elm 610/?/t     Titel                       Subject,Subject-name-corporate,Subject:p
+elm 610/?/x     Underdeling-emne/art        Subject,Subject-name-corporate,Subject:p
+elm 610/?/y     Underdeling-periode         Subject,Subject-name-corporate,Subject:p
+
+elm 621         Emnedata-for-kartografisk-materiale -
+elm 621/?       Emnedata-for-kartografisk-materiale Subject
+elm 621/?/a     Stednavn Subject
+elm 621/?/b     Land/stat Subject
+
+elm 630         Kontrolleret-emneord    -
+elm 630/?       Kontrolleret-emneord    Subject,Subject-controlled,Subject:p,Subject-controlled:p
+elm 630/?/a     Kontrolleret-emneord    Subject,Subject-controlled,Subject:p,Subject-controlled:p
+elm 630/?/b     Andre-bibliotekers-kontrollerede-emneord    Subject,Subject-controlled,Subject:p,Subject-controlled:p
+
+elm 631         Ukontrolleret-emneord   -
+elm 631/?       Ukontrolleret-emneord   Subject,Subject-uncontrolled,Subject:p,Subject-uncontrolled:p
+elm 631/?/a     Ukontrolleret-emneord   Subject,Subject-uncontrolled,Subject:p,Subject-uncontrolled:p
+elm 631/?/b     Andre-bibliotekers-ukontrollerede-emneord   Subject,Subject-uncontrolled,Subject:p,Subject-uncontrolled:p
+elm 631/?/f     Ukontrolleret-faglitterært-emneord          Subject,Subject-uncontrolled,Subject:p,Subject-uncontrolled:p
+
+elm 633         Stednavn                -
+elm 633/?       Stednavn                Subject,Subject-controlled,Subject:p,Subject-controlled:p
+elm 633/?/a     Stednavn                Subject,Subject-controlled,Subject:p,Subject-controlled:p
+
+elm 645         Titel                   -
+elm 645/?       Titel                   Subject,Subject-controlled,Subject:p,Subject-controlled:p
+elm 645/?/c     Titel                   Subject,Subject-controlled,Subject:p,Subject-controlled:p
+
+elm 650         LC-emneord              -
+elm 650/?       LC-emneord              Subject
+elm 650/?/a     LC-emneord              Subject
+elm 650/?/v     LC-emneord              -
+elm 650/?/x     Underdeling-emne/art    Subject
+elm 650/?/y     Underdeling-periode     Subject
+elm 650/?/z     Underdeling-lokalitet   Subject
+
+elm 651         LC-geografisk-emneord   -
+elm 651/?       LC-geografisk-emneord   Subject
+elm 651/?/a     LC-geografisk-emneord   Subject
+elm 651/?/x     Underdeling-emne/art    Subject
+elm 651/?/z     Underdeling-lokalitet   Subject
+
+elm 652         DK5-klassemærke         -
+elm 652/?       DK5-klassemærke         -
+elm 652/?/a     Efternavn/navn/korporationsnavn-som-alfabetisk-underdeling  Classification-DK5-alfa-subdivision
+elm 652/?/b     Andet-som-alfabetisk-underdeling                    Classification-DK5-alfa-subdivision,Subject
+elm 652/?/c     Fødselsår                                           Classification-DK5-alfa-subdivision
+elm 652/?/h     Fornavn                                             Classification-DK5-alfa-subdivision,Subject
+elm 652/?/i     Analytisk-klassemærke                               Classification,Classification-DK5-number
+elm 652/?/m     Opstillings-og-hovedplacering                       Classification,Classification-DK5-number,Classification-as-shelf-mark
+elm 652/?/n     Nationalbibliografisk-hovedplacering                Classification,Classification-DK5-number
+elm 652/?/o     Opstillingsklassemærkeog-bibliotekshovedplacering   Classification,Classification-DK5-number
+elm 652/?/p     Biplacering                                         Classification,Classification-DK5-number
+elm 652/?/q     Nationalbibliografisk-biplacering                   Classification,Classification-DK5-number
+elm 652/?/r     Biblioteksbiplacering                               Classification,Classification-DK5-number
+elm 652/?/v     Tilføjede-cifre-efter-kolon                         -
+elm 652/?/z     Tilføjede-cifre-efter-bindestreg                    -
+elm 652/?/å     Feltnumerator                                       -
+
+elm 654         Forældet-DK5-klassemærke    -
+elm 654/?       Forældet-DK5-klassemærke    Classification
+elm 654/?/p     Biplacering                 Classification
+
+elm 660         MeSH-emneord            -
+elm 660/?       MeSH-emneord            Subject,Subject-controlled,Subject-MESH
+elm 660/?/a     MeSH-emneord            Subject,Subject-controlled,Subject-MESH
+elm 660/?/x     Generel-underdeling     Subject,Subject-controlled,Subject-MESH
+
+elm 661         Europæisk-pædagogisk-tesaurus   -
+elm 661/?       Europæisk-pædagogisk-tesaurus   Subject,Subject-controlled
+elm 661/?/a     Kontrolleret-dansk-emneord      Subject,Subject-controlled
+elm 661/?/b     Kontrolleret-engelsk-emneord    Subject,Subject-controlled
+elm 661/?/c     Ukontrolleret-dansk-emneord     Subject,Subject-controlled
+
+elm 666         Kontrolleret-DBC-emneord            -
+elm 666/?       Kontrolleret-DBC-emneord            -
+elm 666/?/e     Stednavn-som-emneord-faglitteratur  Subject-DBC,Subject,Subject-DBC-non-fiction,Subject-controlled
+elm 666/?/f     Kontrolleret-faglitterært-emneord   Subject-DBC,Subject,Subject-DBC-non-fiction,Subject-controlled
+elm 666/?/i     Tidsangivelse                       Subject-DBC,Subject,Subject-DBC-non-fiction,Subject-controlled
+elm 666/?/l     Stednavn                            Subject-DBC,Subject
+elm 666/?/m     Musikalsk-genre-som-emneord         Subject-DBC,Subject,Subject-DBC-music
+elm 666/?/n     Musikalsk-besætning-som-emneord     Subject-DBC,Subject,Subject-DBC-music
+elm 666/?/o     Formbetegnelse                      Subject-DBC,Subject,Form-as-subject
+elm 666/?/p     Periodebetegnelse                   Subject-DBC,Subject,Subject-DBC-music
+elm 666/?/q     Stednavn-som-emneord-skønlitteratur Subject-DBC,Subject,Subject-DBC-fiction,Subject-controlled
+elm 666/?/s     Kontrolleret-skønlitterært-emneord  Subject-DBC,Subject,Subject-DBC-fiction,Subject-controlled
+elm 666/?/u     Niveau/brugerkategori               Subject-DBC,Subject,Level-as-subject
+elm 666/?/å     Kontrolleret-DBC-emneord            Subject-DBC,Subject
+
+elm 668         Genrebetegnelse         -
+elm 668/?       Genrebetegnelse         Subject,Subject-controlled
+elm 668/?/a     Genrebetegnelse         Subject,Subject-controlled
+elm 668/?/b     Underdeling             Subject,Subject-controlled
+
+elm 670         NAL-emneord             -
+elm 670/?       NAL-emneord             Subject-NAL
+elm 670/?/a     NAL-emneord             Subject
+
+elm 690         COMPASS-emneord         -
+elm 690/?       COMPASS-emneord         Subject,Subject-COMPASS
+elm 690/?/a     Enkeltord         Subject,Subject-COMPASS
+elm 690/?/b     Flere-ord         Subject,Subject-COMPASS
+elm 690/?/c     Forbindende-tekst         -
+elm 690/?/d     Underdeling-periode         Subject,Subject-COMPASS
+elm 690/?/h     COMPASS-emneord         Subject,Subject-COMPASS
+elm 690/?/i     COMPASS-emneord         -
+elm 690/?/m     COMPASS-emneord         -
+elm 690/?/v     COMPASS-emneord         -
+elm 690/?/w     COMPASS-emneord         -
+elm 690/?/x     COMPASS-emneord         -
+elm 690/?/y     COMPASS-emneord         -
+elm 690/?/z     COMPASS-emneord         -
+
+elm 700         Personnavn              -
+elm 700/?       Personnavn              Author-name,Author-name-personal
+elm 700/?/A     Personnavn              Author-name,Author-name-personal
+elm 700/?/a     Efternavn/fornavn-alene Author-name,Author-name-personal
+elm 700/?/b     Funktionsbetegnelse -
+elm 700/?/c     Fødselsår               Author-name,Author-name-personal
+elm 700/?/f     Tilføjelse              Author-name,Author-name-personal
+elm 700/?/h     Fornavn                 Author-name,Author-name-personal
+elm 700/?/k     Fuldt-udskrevet-fornavn Author-name,Author-name-personal
+elm 700/?/å     Personnavn              -
+
+elm 710         Korporationsnavn        -
+elm 710/?       Korporationsnavn        Author-name,Author-name-corporate
+elm 710/?/A     Korporationsnavn        Author-name,Author-name-corporate
+elm 710/?/a     Korporationsnavn        Author-name,Author-name-corporate
+elm 710/?/c     Underkorporation        Author-name,Author-name-corporate
+elm 710/?/e     Tilføjelse              Author-name,Author-name-corporate
+elm 710/?/i     Nummer-på-konference    Author-name,Author-name-corporate
+elm 710/?/j     Sted-for-konference     Author-name,Author-name-corporate
+elm 710/?/k     År-for-konference       Author-name,Author-name-corporate
+elm 710/?/å     Korporationsnavn        -
+
+
+elm 739         Uniform-titel/standardtitel -
+elm 739/?       Uniform-titel/standardtitel Title-uniform
+elm 739/?/t     Uniform-titel/standardtitel Title-uniform
+
+elm 740         Uniform-titel                -
+elm 740/?       Uniform-titel                Title,Title-uniform
+elm 740/?/a     Uniform-titel                Title,Title-uniform
+elm 740/?/s     Titel-på-del-af-værket       Title,Title-uniform
+
+elm 745         Varianttitel            -
+elm 745/?       Varianttitel            -
+elm 745/?/A     Varianttitel            -
+elm 745/?/a     Titel                   Title
+elm 745/?/o     Titel-på-afhængig-publikation/supplement    -
+
+elm 770         Personnavn-analyse      -
+elm 770/?       Personnavn-analyse      Author-name,Author-name-personal
+elm 770/?/A     Personnavn-analyse      -
+elm 770/?/a     Efternavn/fornavn-alene Author-name,Author-name-personal
+elm 770/?/c     Fødselsår               Author-name,Author-name-personal
+elm 770/?/f     Tilføjelse              Author-name,Author-name-personal
+elm 770/?/h     Fornavn                 Author-name,Author-name-personal
+elm 770/?/å     Feltnumerator           -
+
+elm 780         Korporationsnavn-analyse    -
+elm 780/?       Korporationsnavn-analyse    Author-name,Author-name-corporate
+elm 780/?/a     Korporationsnavn            Author-name,Author-name-corporate
+elm 780/?/å     Feltnumerator               Author-name,Author-name-corporate
+
+elm 795         Analytisk-titel                             -
+elm 795/?       Analytisk-titel                             Title
+elm 795/?/A     Analytisk-titel                             -
+elm 795/?/a     Analytisk-titel                             Title
+elm 795/?/b     Rest-af-analytisk-titel/alternativ-titel    Title
+elm 795/?/c     Undertitel/anden-titelinformation           Title
+elm 795/?/e     Ophavsangivelse-opslag                      -
+elm 795/?/i     Anden-primær/sekundær-ophavsangivelse       -
+elm 795/?/p     Paralleltitel                               Title
+elm 795/?/u     Almindeligt-kendt-tilnavn                   Title
+elm 795/?/v     Uddragstitel                                Title
+elm 795/?/y     Kode                                        -
+elm 795/?/å     Feltnumerator                               -
+
+elm 840         Serietitel              -
+elm 840/?       Serietitel              -
+elm 840/?/V     Serietitel              -
+elm 840/?/a     Seriens-hovedtitel              Title,Title-series
+elm 840/?/v     Seriens-nummerering/datering    Title,Title-series
+elm 840/?/z     Seriens-ISSN                    Identifier--standard,ISSN,Item-number
+elm 840/?/ø     Identificerende-tilføjelser-til-seriens-titel   Title
+
+elm 860         Tidligere-titel         -
+elm 860/?       Tidligere-titel         -
+elm 860/?/c     Tilføjelse-til-titel    Related-periodical,Title-former
+elm 860/?/t     Hovedtitel              Title-former
+elm 860/?/z     ISSN                    Identifier--standard,ISSN,Item-number
+
+elm 861         Senere-titel            -
+elm 861/?       Senere-titel            -
+elm 861/?/c     Tilføjelse-til-titel    Related-periodical,Title-later
+elm 861/?/i     Indledende-tekst       -
+elm 861/?/t     Hovedtitel              Related-periodical,Title-later
+elm 861/?/z     ISSN                    Identifier--standard,ISSN,Item-number
+
+elm 863         Udgivet-sammen-med      -
+elm 863/?       Udgivet-sammen-med      -
+elm 863/?/t     Hovedtitel              Title-related-periodical
+elm 863/?/z     ISSN                    Identifier--standard,ISSN,Item-number
+
+elm 867         Hovedudgave-på-andet-sprog/andet-indhold    -
+elm 867/?       Hovedudgave-på-andet-sprog/andet-indhold    -
+elm 867/?/t     Hovedtitel                                  Title-related-periodical
+elm 867/?/z     ISSN                                        Identifier--standard,ISSN,Item-number
+
+elm 868         Udgave-på-andet-sprog/andet-indhold     -
+elm 868/?       Udgave-på-andet-sprog/andet-indhold     -
+elm 868/?/t     Hovedtitel                              Title-related-periodical
+elm 868/?/z     ISSN                                    Identifier--standard,ISSN,Item-number
+
+elm 870         Hovedpublikation-til-supplement     -
+elm 870/?       Hovedpublikation-til-supplement     -
+elm 870/?/t     Hovedtitel                          Title-related-periodical
+elm 870/?/z     ISSN                                Identifier--standard,ISSN,Item-number
+
+elm 871         Supplement-til-hovedpublikation     -
+elm 871/?       Supplement-til-hovedpublikation     -
+elm 871/?/c     Tilføjelse-til-titel                -
+elm 871/?/t     Hovedtitel                          Title-related-periodical
+
+elm 874         Underserie              -
+elm 874/?       Underserie              -
+elm 874/?/t     Hovedtitel              Title-related-periodical
+elm 874/?/z     ISSN                    Identifier--standard,ISSN,Item-number
+
+elm 900         Henvisning-fra-personnavn   -
+elm 900/?       Henvisning-fra-personnavn   Author-name,Author-name-personal
+elm 900/?/A     Henvisning-fra-personnavn   -
+elm 900/?/a     Efternavnet/fornavnet-alene Author-name,Author-name-personal
+elm 900/?/c     Fødselsår                   Author-name,Author-name-personal
+elm 900/?/f     Tilføjelse                  Author-name,Author-name-personal
+elm 900/?/h     Fornavn                     Author-name,Author-name-personal
+elm 900/?/k     Fuldt-udskrevet-fornavn     Author-name,Author-name-personal
+elm 900/?/w     Ord-hvortil-der-henvises    -
+elm 900/?/x     Forbindende-tekst           -
+elm 900/?/z     Felt/delfeltkode-hvortil-der-henvises   -
+elm 900/?/å     Feltnumerator               -
+
+elm 910         Henvisning-fra-korporationsnavn     -
+elm 910/?       Henvisning-fra-korporationsnavn     Author-name,Author-name-corporate
+elm 910/?/A     Henvisning-fra-korporationsnavn     -
+elm 910/?/a     Korporationsnavn                    Author-name,Author-name-corporate
+elm 910/?/c     Underkorporation                    Author-name,Author-name-corporate
+elm 910/?/e     Tilføjelse                          Author-name,Author-name-corporate
+elm 910/?/g     Resten-af-korporationsnavn          Author-name,Author-name-corporate
+elm 910/?/h     Forbogstaver/fornavnsforkortelser   Author-name,Author-name-corporate
+elm 910/?/w     Ord-hvortil-der-henvises            -
+elm 910/?/x     Forbindende-tekst                   -
+elm 910/?/z     Felt/delfeltkode-hvortil-der-henvises     -
+elm 910/?/å     Feltnumerator                       -
+
+elm 945         Henvisning-fra-titel        -
+elm 945/?       Henvisning-fra-titel        -
+elm 945/?/a     Title                       Title
+elm 945/?/w     Ord-hvortil-der-henvises    -
+elm 945/?/x     Forbindende-tekst           -
+elm 945/?/z     Felt/delfeltkode-hvortil-der-henvises        -
+
+elm 980         Bibliotekets-beholdning-af-et-periodicum    -
+elm 980/?       Bibliotekets-beholdning-af-et-periodicum    -
+elm 980/?/d     Første-år                                   -
+elm 980/?/g     Kode-for-fuldstændighed                     -
+
+elm s01         felt-s01                    -
+elm s01/?       felt-s01                    -
+elm s01/?/a     felt-s01                    -
+elm s01/?/b     felt-s01                    -
+
+
+elm s06         felt-s06                    -
+elm s06/?       felt-s06                    -
+elm s06/?/a     felt-s06                    -
+elm s06/?/b     felt-s06                    -
+
+elm s10         felt-s10                    -
+elm s10/?       felt-s10                    -
+elm s10/?/a     felt-s10                    -
+
+elm s45         felt-s45                    -
+elm s45/?       felt-s45                    -
+elm s45/?/a     felt-s45                    -
Index: /main/tags/2.38/gsdl/packages/yaz/tab/explain.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/explain.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/explain.abs	(revision 21083)
@@ -0,0 +1,229 @@
+# This Explain schema is used for our internal management and processing of
+# explain data. On request, records are mapped to the proper Explain ASN.1
+# before transmission.
+#
+# $Id$
+
+name explain
+reference Explain-schema
+attset explain
+tagset explain.tag
+
+esetname B @
+esetname F @
+
+
+section rpnCapabilities
+elm (4,550)				rpnOperators			-
+elm (4,550)/(4,551)			rpnOperator			-
+elm (4,552)				resultSetAsOperandSupported	-
+elm (4,553)				restrictionOperandSupported	-
+elm (4,554)				proximitySupport		-
+elm (4,554)/(4,555)			anySupport			-
+elm (4,554)/(4,556)			unitsSupported			-
+elm (4,554)/(4,556)/(4,557)		unitSupported			-
+elm (4,554)/(4,556)/(4,557)/(4,558)	known				-
+elm (4,554)/(4,556)/(4,557)/(4,559)	private				-
+elm (4,554)/(4,556)/(4,557)/(4,559)/(4,558) privateUnit			-
+elm (4,554)/(4,556)/(4,557)/(4,559)/(4,560) description			-
+
+section accessInfo
+elm (4,501)				queryTypesSupported		-
+elm (4,501)/(4,518)			queryTypeDetails		-
+elm (4,501)/(4,518)/(4,519):rpnCapabilities	rpnCapabilities		-
+elm (4,501)/(4,518)/(4,520)		iso8777Capabilities		-
+elm (4,501)/(4,518)/(4,521)		privateCapabilities		-
+elm (4,503)				diagnosticSets			-
+elm (4,503)/(4,1000)			diagnosticSet			-
+elm (4,505)				attributeSetIds			-
+elm (4,505)/(4,1000)			attributeSetId			-
+elm (4,507)				schemas				-
+elm (4,507)/(4,1000)			schema				-
+elm (4,509)				recordSyntaxes			-
+elm (4,509)/(4,1000)			recordSyntax			-
+elm (4,511)				resourceChallenges		-
+elm (4,511)/(4,1000)			resourceChallenge		-
+elm (4,513)				restrictedAccess		-
+elm (4,514)				costInfo			-
+elm (4,515)				variantSets			-
+elm (4,515)/(4,1000)			variantSets			-
+elm (4,516)				elementSetNames			-
+elm (4,516)/(4,1001)			elementSetName			-
+elm (4,517)				unitSystems			-
+elm (4,517)/(4,1001)			unitSystem			-
+
+section commonInfo
+elm (4,601)				dateAdded			!
+elm (4,602)				dateChanged			!
+elm (4,603)				expiry		DateExpired
+elm (4,604)				languageCode	HumanStringLanguage
+
+section contactInfo
+elm (4,102)				name				-
+elm (4,113)				description			-
+elm (4,127)				address				-
+elm (4,128)				email				-
+elm (4,129)				phone				-
+
+section stringOrNumeric
+elm (4,1001)				string				-
+elm (4,1002)				numeric				-
+
+section attributeSetDetailsValue
+elm (4,709)				attributeValue			-
+elm (4,709)/(4,710):stringOrNumeric	value	-
+elm (4,709)/(4,113)			description			-
+elm (4,709)/(4,712)			subAttributes			-
+elm (4,709)/(4,712)/(4,713):stringOrNumeric subAttribute		-
+elm (4,709)/(4,714)			superAttributes			-
+elm (4,709)/(4,714)/(4,715):stringOrNumeric superAttributes		-
+elm (4,709)/(4,711)			partialSupport			-
+
+section attributeSetDetails
+elm (4,1000)				attributeSet			-
+elm (4,702)				attributesByType		-
+elm (4,702)/(4,703)			attributeTypeDetails		-
+elm (4,702)/(4,703)/(4,704)		attributeType			-
+elm (4,702)/(4,703)/(4,705)		defaultIfOmitted		-
+elm (4,702)/(4,703)/(4,705)/(4,706):stringOrNumeric	defaultValue	-
+elm (4,702)/(4,703)/(4,705)/(4,113)	defaultDescription		-
+elm (4,702)/(4,703)/(4,708):attributeSetDetailsValue attributeValues	-
+
+section attributeCombinations
+elm (4,1000)				attributeSet			-
+elm (4,717)				legalCombinations		-
+elm (4,717)/(4,718)			legalCombination		-
+elm (4,717)/(4,718)/(4,719)		attributeOccurrence		-
+elm (4,717)/(4,718)/(4,719)/(4,1000)	attributeSetId			-
+elm (4,717)/(4,718)/(4,719)/(4,704)	attributeType			-
+elm (4,717)/(4,718)/(4,719)/(4,720)	mustBeSupplied			-
+elm (4,717)/(4,718)/(4,719)/(4,721)	anyOrNone			-
+elm (4,717)/(4,718)/(4,719)/(4,722)	specific			-
+elm (4,717)/(4,718)/(4,719)/(4,722)/(4,710):stringOrNumeric value	-
+
+section attributeType
+elm (4,751)				attributeType			-
+elm (4,751)/(4,102)			attributeName			-
+elm (4,751)/(4,113)			attributeDescription		-
+elm (4,751)/(4,704)			type				-
+elm (4,751)/(4,708)			attributeValues			-
+elm (4,751)/(4,708)/(4,709)		attributeValue			-
+elm (4,751)/(4,708)/(4,709)/(4,102)	name				-
+elm (4,751)/(4,708)/(4,709)/(4,113)	description			-
+elm (4,751)/(4,708)/(4,709)/(4,710):stringOrNumeric attributeValue	-
+elm (4,751)/(4,708)/(4,709)/(4,752):stringOrNumeric equivalentAttribute	-
+
+section main
+#
+# CategoryList
+#
+elm (4,1)				categoryList	ExplainCategory
+elm (4,1)/(4,600):commonInfo		categoryListCommonInfo		-
+elm (4,1)/(4,300)			categories			-
+elm (4,1)/(4,300)/(4,301)		category			-
+elm (4,1)/(4,300)/(4,301)/(4,102)	categoryName			-
+elm (4,1)/(4,300)/(4,301)/(4,302)	originalName			-
+elm (4,1)/(4,300)/(4,301)/(4,113)	description			-
+elm (4,1)/(4,300)/(4,301)/(4,303)	asn1Module			-
+elm (4,1)/?				other				-
+
+#
+# TargetInfo
+# 
+elm (4,2)				targetInfo		ExplainCategory
+elm (4,2)/(4,600):commonInfo		targetCommonInfo		-
+elm (4,2)/(4,102)			targetName		TargetName
+elm (4,2)/(4,103)			recentNews			-
+elm (4,2)/(4,104)			icon				-
+elm (4,2)/(4,105)			namedResultSets			-
+elm (4,2)/(4,106)			multipleDbSearch		-
+elm (4,2)/(4,107)			maxResultSets			-
+elm (4,2)/(4,108)			maxResultSize			-
+elm (4,2)/(4,109)			maxTerms			-
+elm (4,2)/(4,110)			timeoutInterval			-
+elm (4,2)/(4,111)			welcomeMessage			-
+elm (4,2)/(4,112):contactInfo		contactInfo			-
+elm (4,2)/(4,113)			description			-
+elm (4,2)/(4,114)			nicknames			-
+elm (4,2)/(4,114)/(4,102)		nickname			-
+elm (4,2)/(4,115)			usageRestrictions		-
+elm (4,2)/(4,116)			paymentAddr			-
+elm (4,2)/(4,117)			hours				-
+elm (4,2)/(4,118)			dbCombinations			-
+elm (4,2)/(4,118)/(4,605)		databaseList			-
+elm (4,2)/(4,118)/(4,605)/(4,102)	databaseName			-
+elm (4,2)/(4,119)			addresses			-
+elm (4,2)/(4,119)/(4,120)		internetAddress			-
+elm (4,2)/(4,119)/(4,120)/(4,121) 	host				-
+elm (4,2)/(4,119)/(4,120)/(4,122)	port				-
+elm (4,2)/(4,119)/(4,123)		otherAddress			-
+elm (4,2)/(4,119)/(4,123)/(4,124)	addressType			-
+elm (4,2)/(4,119)/(4,123)/(4,121)	address				-
+elm (4,2)/(4,125)			languages			-
+elm (4,2)/(4,125)/(4,126)		language			-
+elm (4,2)/(4,500):accessInfo		commonAccessInfo		-
+elm (4,2)/?				other				-
+#
+# DatabaseInfo
+#
+elm (4,3)				databaseInfo	ExplainCategory
+elm (4,3)/(4,600):commonInfo		databaseCommonInfo		-
+elm (4,3)/(4,102)			databaseName	DatabaseName
+elm (4,3)/(4,226)			explainDatabase			-
+elm (4,3)/(4,114)			nicknames			-
+elm (4,3)/(4,114)/(4,102)		nickname			-
+elm (4,3)/(4,104)			icon				-
+elm (4,3)/(4,201)			userFee				-
+elm (4,3)/(4,202)			available	Availability
+elm (4,3)/(4,203)			titleString			-
+elm (4,3)/(4,227)			keywords			-
+elm (4,3)/(4,227)/(4,1000)		keyword				-
+elm (4,3)/(4,113)			description			-
+elm (4,3)/(4,205)			associatedDbs			-
+elm (4,3)/(4,205)/(4,605)		databaseList			-
+elm (4,3)/(4,205)/(4,605)/(4,102)	databaseName			-
+elm (4,3)/(4,206)			subDbs				-
+elm (4,3)/(4,206)/(4,605)		databaseList			-
+elm (4,3)/(4,206)/(4,605)/(4,102)	databaseName			-
+elm (4,3)/(4,207)			disclaimers			-
+elm (4,3)/(4,103)			recentNews			-
+elm (4,3)/(4,209)			recordCount			-
+elm (4,3)/(4,209)/(4,210)		recordCountActual		-
+elm (4,3)/(4,209)/(4,211)		recordCountApprox		-
+elm (4,3)/(4,212)			defaultOrder			-
+elm (4,3)/(4,213)			avRecordSize			-
+elm (4,3)/(4,214)			maxRecordSize			-
+elm (4,3)/(4,215)			hours				-
+elm (4,3)/(4,216)			bestTime			-
+elm (4,3)/(4,217)			lastUpdate			-
+elm (4,3)/(4,218)			updateInterval			-
+elm (4,3)/(4,219)			coverage			-
+elm (4,3)/(4,220)			proprietary			-
+elm (4,3)/(4,221)			copyrightText			-
+elm (4,3)/(4,222)			copyrightNotice			-
+elm (4,3)/(4,223):contactInfo		producerContactInfo		-
+elm (4,3)/(4,224):contactInfo		supplierContactInfo		-
+elm (4,3)/(4,225):contactInfo		submissionContactInfo		-
+elm (4,3)/(4,500):accessInfo		databaseAccessInfo		-
+elm (4,3)/?				other				-
+#
+# AttributeSetInfo
+#
+elm (4,7)				attributeSetInfo	ExplainCategory
+elm (4,7)/(4,600):commonInfo		attributeSetInfoCommonInfo	-
+elm (4,7)/(4,1000)			attributeSet		AttributeSetOID
+elm (4,7)/(4,113)			description			-
+elm (4,7)/(4,102)			name				-
+elm (4,7)/(4,750):attributeType		attributes			-
+elm (4,7)/?				other				-
+#
+# AttributeDetails
+#
+elm (4,10)				attributeDetails	ExplainCategory
+elm (4,10)/(4,600):commonInfo		attributeDetailsCommonInfo	-
+elm (4,10)/(4,102)			databaseName		DatabaseName
+elm (4,10)/(4,700)			attributesBySet			-
+elm (4,10)/(4,700)/(4,701):attributeSetDetails attributeSetDetails	-
+elm (4,10)/(4,716):attributeCombinations attributeCombinations		-
+elm (4,10)/?				other				-
+
Index: /main/tags/2.38/gsdl/packages/yaz/tab/explain.att
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/explain.att	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/explain.att	(revision 21083)
@@ -0,0 +1,27 @@
+# The Explain Attribute Set
+#
+# $Id$
+name explain
+reference Exp-1
+
+att 1			ExplainCategory
+att 2			HumanStringLanguage
+att 3			DatabaseName
+att 4			Targetname
+att 5			AttributeSetOID
+att 6			RecordSyntaxOID
+att 7			TagSetOID
+att 8			ExtendedServicesOID
+att 9			DateAdded
+att 10			DateChanged
+att 11			DateExpired
+att 12			ElementSetName
+att 13			ProcessingContext
+att 14			ProcessingName
+att 15			TermListName
+att 16			SchemaOID
+att 17			Producer
+att 18			Supplier
+att 19			Availability
+att 20			Proprietary
+att 21			UserFee
Index: /main/tags/2.38/gsdl/packages/yaz/tab/explain.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/explain.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/explain.tag	(revision 21083)
@@ -0,0 +1,175 @@
+# Tag set for internal Explain-data management
+#
+# $Id$
+
+name explain
+reference Explain-tagset
+type 4
+include tagsetm.tag
+
+#
+# Explain categories
+#
+tag 1		categoryList					structured
+tag 2		targetInfo					structured
+tag 3		databaseInfo					structured
+tag 4		schemaInfo					structured
+tag 5		tagSetInfo					structured
+tag 6		recordSyntaxInfo				structured
+tag 7           attributeSetInfo				structured
+tag 8		termListInfo					structured
+tag 9		extendedServicesInfo				structured
+tag 10		attributeDetails				structured
+tag 11		termListDetails					structured
+tag 12		elementSetDetails				structured
+tag 13		retrievalRecordDetails				structured
+tag 14		sortDetails					structured
+tag 15		processing					structured
+tag 16		variants					structured
+tag 17		units						structured
+
+#
+# TargetInfo
+#
+tag 102		name						string
+tag 103		recentNews					string
+tag 104		icon						structured
+tag 105		namedResultSets					bool
+tag 106		multipleDbSearch				bool
+tag 107		maxResultSets					numeric
+tag 108		maxResultSize					numeric
+tag 109		maxTerms					numeric
+tag 110		timeoutInterval					intunit
+tag 111		welcomeMessage					string
+tag 112		contactInfo					structured
+tag 113		description					string
+tag 114		nicknames					structured
+tag 115		usageRest					string
+tag 116		paymentAddr					string
+tag 117		hours						string
+tag 118		dbCombinations					structured
+tag 119		addresses					structured
+tag 120		internetAddress					structured
+tag 121		host						string
+tag 122		port						numeric
+tag 123		otherAddress					structured
+tag 124		addressType					string
+tag 125		languages					structured
+tag 126		language					string
+tag 127		address						string
+tag 128		email						string
+tag 129		phone						string
+
+#
+# DatabaseInfo
+#
+tag 201		userFee						bool
+tag 202		available					bool
+tag 203		titleString					string
+tag 205		associatedDbs					structured
+tag 206		subDbs						structured
+tag 207		disclaimers					string
+tag 209		recordCount					structured
+tag 210		recordCountActual				numeric
+tag 211		recordCountApprox				numeric
+tag 212		defaultOrder					string
+tag 213		avRecordSize					numeric
+tag 214		maxRecordSize					numeric
+tag 215		hours						string
+tag 216		bestTime					string
+tag 217		lastUpdate					generalizedtime
+tag 218		updateInterval					intunit
+tag 219		coverage					string
+tag 220		proprietary					bool
+tag 221		copyrightText					string
+tag 222		copyrightNotice					string
+tag 223		producerContactInfo				structured
+tag 224		supplierContactInfo				structured
+tag 225		submissionContactInfo				structured
+tag 226		explainDatabase					null
+tag 227		keywords					string
+
+# CategoryList
+tag 300		categories					structured
+tag 301		category					structured
+tag 302		originalName					string
+tag 303		asn1Module					string
+#
+# AccessInfo
+#
+tag 500		accessinfo					structured
+tag 501		queryTypesSupported				structured
+tag 503		diagnosticSets					structured
+tag 505		attributeSetIds					structured
+tag 507		schemas						structured
+tag 509		recordSyntaxes					structured
+tag 511		resourceChallenges				structured
+tag 513		restrictedAccess				structured
+tag 514		costInfo					structured
+tag 515		variantSets					structured
+tag 516		elementSetNames					structured
+tag 517		unitSystems					structured
+tag 518         queryTypeDetails				structured
+tag 519		rpnCapabilities					structured
+tag 520		Iso8777Capabilities				structured
+tag 521         privateCapabilities				structured
+
+tag 550		rpnOperators					structured
+tag 551		rpnOperator					numeric
+tag 552		resultSetAsOperandSupported			bool
+tag 553		restrictionOperandSupported			bool
+tag 554		proximitySupport				structured
+tag 555		anySupport					bool
+tag 556 	proximityUnitsSupported				structured
+tag 557		proximityUnitSupported				structured
+tag 558		proximityUnitVal				numeric
+tag 559		proximityUnitPrivate				structured
+tag 560		proximityUnitDescription			string
+
+# CommonInfo
+
+tag 600		commonInfo					structured
+tag 601		dateAdded					generalizedtime
+tag 602		dateChanged					generalizedtime
+tag 603		expiry						generalizedtime
+tag 604		languageCode					string
+tag 605 	databaseList					structured
+
+# AttributeDetails, AttributeSetDetails
+
+tag 700		attributesBySet					structured
+tag 701		attributeSetDetails				structured
+tag 702		attributesByType				structured
+tag 703		attributeTypeDetails				structured
+tag 704		type						numeric
+tag 705		defaultIfOmitted				structured
+tag 706		defaultValue					structured
+tag 708		attributeValues					structured
+tag 709		attributeValue					structured
+tag 710		value						structured
+tag 711		partialSupport					string
+tag 712		subAttributes					structured
+tag 713		subAttribute					structured
+tag 714		superAttributes					structured
+tag 715		superAttribute					structured
+tag 716		attributeCombinations				structured
+tag 717		legalAttributeCombinations			structured
+tag 718		attributeCombination				structured
+tag 719		attributeOccurrence				structured
+tag 720		mustBeSupplied					bool
+tag 721		anyOrNone					string
+tag 722		specific					structured
+
+#
+# AttributeSetInfo
+#
+tag 750		attributes					structured
+tag 751		attributeType					structured
+tag 752		equivalentAttribute				structured
+#
+# General tags for list members, etc.
+#
+tag 1000	oid						oid
+tag 1001	string						string
+tag 1002	numeric						numeric
+
Index: /main/tags/2.38/gsdl/packages/yaz/tab/generic.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/generic.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/generic.tag	(revision 21083)
@@ -0,0 +1,7 @@
+# Generic tags - including tagsetM and tagsetG.
+#
+# $Id$
+name generic
+
+include tagsetm.tag
+include tagsetg.tag
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-a.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-a.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-a.est	(revision 21083)
@@ -0,0 +1,7 @@
+simpleelement (1,10)
+simpleelement (1,12)
+simpleelement (2,1)
+simpleelement (1,14)
+simpleelement (4,1)
+simpleelement (4,52)
+simpleelement (2,6)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-b.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-b.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-b.est	(revision 21083)
@@ -0,0 +1,10 @@
+# $Id$
+simpleelement (1,1)
+simpleelement (1,10)
+simpleelement (1,12)
+simpleelement (2,1)
+simpleelement (1,14)
+simpleelement (1,16)
+simpleelement (4,1)
+simpleelement (4,52)
+simpleelement (4,70)/(4,17)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-f.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-f.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-f.est	(revision 21083)
@@ -0,0 +1,2 @@
+# $Id$
+simpleelement ?
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-g.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-g.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-g.est	(revision 21083)
@@ -0,0 +1,17 @@
+# $Id$
+simpleelement (1,1)
+simpleelement (1,10)
+simpleelement (1,12)
+simpleelement (2,1)
+simpleelement (1,14)
+simpleelement (1,16)
+simpleelement (4,1)
+simpleelement (4,52)
+simpleelement (4,98)
+
+#
+# These are not formally required by GILS
+#
+simpleelement (4,59)
+simpleelement (4,70)
+simpleelement (4,97)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-summary.map
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-summary.map	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-summary.map	(revision 21083)
@@ -0,0 +1,12 @@
+#
+# This table maps GILS-records to the Summary (abstract) syntax
+#
+
+targetname summary
+targetref Summary
+
+map title 		/(4,0)
+map originator		/(4,1)
+map localControlNumber  /(4,12)
+map rank		/(4,14)
+map abstract		/(4,16)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-usmarc.map
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-usmarc.map	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-usmarc.map	(revision 21083)
@@ -0,0 +1,78 @@
+#
+# This table maps records in the GILS abstract syntax to the USMARC one
+#
+
+targetname usmarc
+targetref USmarc
+
+map rank			/(3,999)/(3,r)
+map localControlNumber		/(3,001)/(3,@)
+map dateLastModified		/(3,005)/(3,@)
+map ControlIdentifier		/(3,035)/(3,a)
+
+map title			/(3,245)/(3,a)
+map abstract			/(3,520)/(3,a)
+map purpose			/(3,500)/(3,a)
+map originator			/(3,710)/(3,a)
+map accessConstraints		/(3,506)/(3,a)
+map useConstraints		/(3,540)/(3,a)
+
+map distributor			/(3,270):new nodata
+map distributorName		/(3,270)/(3,p)
+map distributorOrganization	/(3,270)/(3,p)
+map distributorStreetAddress	/(3,270)/(3,a)
+map distributorCity		/(3,270)/(3,b)
+map distributorState		/(3,270)/(3,c)
+map distributorZipCode		/(3,270)/(3,e)
+map distributorCountry		/(3,270)/(3,d)
+map distributorNetworkAddress	/(3,270)/(3,m)
+map distributorHoursOfService	/(3,301)/(3,a)
+map distributorTelephone	/(3,270)/(3,k)
+map distributorFax		/(3,270)/(3,l)
+
+map resourceDescription		/(3,037)/(3,f)
+map orderProcess		/(3,037)/(3,c)
+map technicalPrerequisite	/(3,538)/(3,a)
+map availableTimePeriodStructured	/(3,045)/(3,c)
+map availableTimePeriodTextual		/(3,037)/(3,n) # Unhandled conditional
+
+map linkage			/(3,856)/(3,u)
+map linkageType			/(3,856)/(3,2)
+#map pointOfContact		/(3,856)/(3,m) # Look into this
+
+map pointOfContact		/(3,270):new nodata
+map contactName			/(3,270)/(3,p)
+map contactOrganization		/(3,270)/(3,p)
+map contactStreetAddress	/(3,270)/(3,a)
+map contactCity			/(3,270)/(3,b)
+map contactState		/(3,270)/(3,c)
+map contactZipCode		/(3,270)/(3,e)
+map contactCountry		/(3,270)/(3,d)
+map contactNetworkAddress	/(3,270)/(3,m)
+map contactHoursOfService	/(3,301)/(3,a)
+map contactTelephone		/(3,270)/(3,k)
+map contactFax			/(3,270)/(3,l)
+
+map recordSource		/(3,040)/(3,a)
+map agencyProgram		/(3,500)/(3,a)
+map sourcesOfData		/(3,537)/(3,a)
+map controlledTerm      	/(3,650)/(3,a)
+map thesaurus			/(3,650)/(3,2)
+map localSubjectTerm		/(3,653)/(3,a)
+map methodology			/(3,567)/(3,a)
+
+map boundingrectangle		/(3,034):new nodata
+map westernMost			/(3,034)/(3,d)
+map easternMost			/(3,034)/(3,e)
+map northernMost		/(3,034)/(3,f)
+map southernMost		/(3,034)/(3,g)
+
+map geographicKeywordName	/(3,651)/(3,a)
+map geographicKeywordType	/(3,655)/(3,z)  # Probably incorrect
+map timeperiodStructured	/(3,045)/(3,c)
+map timeperiodTextual		/(3,513)/(3,b)
+map crossReference              /(3,787):new     nodata
+map crossReferenceTitle		/(3,787)/(3,t)
+map crossReferenceLinkage	/(3,787)/(3,w)
+
+map supplementalInformation	/(3,500)/(3,a)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils-variant.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils-variant.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils-variant.est	(revision 21083)
@@ -0,0 +1,15 @@
+#
+# This is the WAIS VARIANT element set description.
+# The empty variant parameters to the simpleelement statements simply
+# override the default.
+#
+
+defaultvariantrequest (9,1,@) (6,5,@)  # No data; variant list.
+
+simpleelement (1,10) variant
+simpleelement (1,12) variant
+simpleelement (2,1) variant
+simpleelement (2,6)
+simpleelement (1,14) variant
+simpleelement (4,1)
+simpleelement (4,52)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils.abs	(revision 21083)
@@ -0,0 +1,146 @@
+# This is the abstract syntax (and most of the top-level profile info)
+# for GILS version 2.
+#
+# $Id$
+
+name gils
+reference GILS-schema
+attset gils.att
+tagset gils.tag
+varset var1.var
+
+maptab gils-usmarc.map
+maptab gils-summary.map
+
+# Element set names
+
+esetname VARIANT gils-variant.est  # for WAIS-compliance
+esetname B gils-b.est
+esetname G gils-g.est
+esetname W gils-b.est   # We don't really do bodyOfDisplay yet.
+esetname F @
+
+#all Any
+
+elm (1,1)                   schemaIdentifier		-
+elm (1,10)                  rank 			-
+elm (1,12)                  url				-
+elm (1,14)                  localControlNumber		-
+elm (2,1)                   title			!:w,!:p,!:s
+elm (4,52)                  originator			author-name-corporate
+#
+# Additional structuring of originator non-standard.
+#
+elm (4,52)/(2,7)            originatorName		author-name-corporate
+elm (4,52)/(2,10)           originatorOrganization	author-name-corporate
+elm (4,52)/(4,2)            originatorStreetAddress	author-name-corporate
+elm (4,52)/(4,3)            originatorCity		author-name-corporate
+elm (4,52)/(4,4)            originatorStateOrProvince	author-name-corporate
+elm (4,52)/(4,5)            originatorZipOrPostalCode	author-name-corporate
+elm (4,52)/(2,16)           originatorCountry		author-name-corporate
+elm (4,52)/(2,12)           originatorNetworkAddress	author-name-corporate
+elm (4,52)/(4,6)            originatorHoursofService	author-name-corporate
+elm (4,52)/(2,14)           originatorTelephone	        author-name-corporate
+elm (4,52)/(2,15)           originatorFax		author-name-corporate
+elm (2,2)                   author			!
+#
+# Additional structuring of author non-standard.
+#
+elm (2,2)/(2,7)             authorName		        author
+elm (2,2)/(2,10)            authorOrganization	        author
+elm (2,2)/(4,2)             authorStreetAddress	        author
+elm (2,2)/(4,3)             authorCity		 	author
+elm (2,2)/(4,4)             authorStateOrProvince	author
+elm (2,2)/(4,5)             authorZipOrPostalCode	author
+elm (2,2)/(2,16)            authorCountry		author
+elm (2,2)/(2,12)            authorNetworkAddress	author
+elm (2,2)/(4,6)             authorHoursofService	author
+elm (2,2)/(2,14)            authorTelephone	        author
+elm (2,2)/(2,15)            authorFax			author
+elm (2,4)                   dateOfPublication		!
+elm (2,3)                   placeOfPublication          place-publication
+elm (4,32)                  languageOfResource		code-language
+elm (2,6)                   abstract			!
+elm (4,95)                  controlledSubjectIndex	-
+elm (4,95)/(4,21)           subjectThesaurus		-
+elm (4,95)/(4,96)           subjectTermsControlled	controlled-subject-index
+elm (4,95)/(4,96)/(4,20)    controlledTerm		index-terms
+elm (4,97)                  subjectTermsUncontrolled    uncontrolled-term
+elm (4,97)/(4,22)           uncontrolledTerm		uncontrolled-term
+elm (4,71)                  spatialDomain		!
+elm (4,71)/(4,91)           boundingCoordinates		!
+elm (4,71)/(4,91)/(4,9)     westBoundingCoordinate      !:n
+elm (4,71)/(4,91)/(4,10)    eastBoundingCoordinate	!:n
+elm (4,71)/(4,91)/(4,11)    northBoundingCoordinate	!:n
+elm (4,71)/(4,91)/(4,12)    southBoundingCoordinate	!:n
+elm (4,71)/(4,92)           place			!
+elm (4,71)/(4,92)/(4,14)    placeKeywordThesaurus	-
+elm (4,71)/(4,92)/(4,13)    placeKeyword		place
+elm (4,93)                  timePeriod			!
+elm (4,93)/(4,16)           timePeriodTextual		!
+elm (4,93)/(4,101)          timePeriodStructured	!
+elm (4,93)/(4,101)/(4,15)   beginningDate		!
+elm (4,93)/(4,101)/(4,36)   endingDate			!
+elm (4,70)                  availability		!
+elm (4,70)/(4,33)           medium			material-type
+elm (4,70)/(4,90)           distributor			!
+elm (4,70)/(4,90)/(2,7)     distributorName		!
+elm (4,70)/(4,90)/(2,10)    distributorOrganization	!
+elm (4,70)/(4,90)/(4,2)     distributorStreetAddress	!
+elm (4,70)/(4,90)/(4,3)     distributorCity		!
+elm (4,70)/(4,90)/(4,4)     distributorStateOrProvince	!
+elm (4,70)/(4,90)/(4,5)     distributorZipOrPostalCode	!
+elm (4,70)/(4,90)/(2,16)    distributorCountry		!
+elm (4,70)/(4,90)/(2,12)    distributorNetworkAddress	!
+elm (4,70)/(4,90)/(4,6)     distributorHoursofService	!
+elm (4,70)/(4,90)/(2,14)    distributorTelephone	!
+elm (4,70)/(4,90)/(2,15)    distributorFax		!
+elm (4,70)/(4,7)            resourceDescription		!
+elm (4,70)/(4,55)           orderProcess		!
+elm (4,70)/(4,55)/(4,28)    orderInformation		!
+elm (4,70)/(4,55)/(4,29)    cost			!
+elm (4,70)/(4,55)/(4,30)    costInformation		!
+elm (4,70)/(4,8)            technicalPrerequisites	!
+elm (4,70)/(4,93)           availableTimePeriod		!
+elm (4,70)/(4,93)/(4,16)    availableTimeTextual	!
+elm (4,70)/(4,93)/(4,102)   availableTimeStructured	!
+elm (4,70)/(4,93)/(4,102)/(4,15)  beginningDate        available-time-structured
+elm (4,70)/(4,93)/(4,102)/(4,36)  endingDate           available-time-structured
+elm (4,70)/(4,99)           availableLinkage		!
+elm (4,70)/(4,99)/(4,18)    linkageType			!
+elm (4,70)/(4,99)/(4,17)    linkage		       available-linkage:u,linkage:u
+elm (4,57)                  sourcesOfData		!
+elm (4,58)                  methodology			!
+elm (4,53)                  accessConstraints		!
+elm (4,53)/(4,25)           generalAccessConstraints	!
+elm (4,53)/(4,26)           originatorDisseminationControl	!
+elm (4,53)/(4,27)           securityClassificationControl	!
+elm (4,54)                  useConstraints			!
+elm (4,94)                  pointOfContact		!
+elm (4,94)/(2,7)            contactName			!
+elm (4,94)/(2,10)           contactOrganization		!
+elm (4,94)/(4,2)            contactStreetAddress	!
+elm (4,94)/(4,3)            contactCity			!
+elm (4,94)/(4,4)            contactStateOrProvince	!
+elm (4,94)/(4,5)            contactZipOrPostalCode	!
+elm (4,94)/(2,16)           contactCountry		!
+elm (4,94)/(2,12)           contactNetworkAddress	!
+elm (4,94)/(4,6)            contactHoursOfService	!
+elm (4,94)/(2,14)           contactTelephone		!
+elm (4,94)/(2,15)           contactFax			!
+elm (4,59)                  supplementalInformation	-
+elm (4,51)                  purpose			!
+elm (4,56)                  agencyProgram		!
+elm (4,98)                  crossReference		!
+elm (4,98)/(2,1)            crossReferenceTitle		!
+elm (4,98)/(4,35)           crossReferenceRelationship	!
+elm (4,98)/(4,100)          crossReferenceLinkage	!
+elm (4,98)/(4,100)/(4,18)    linkageType		-
+elm (4,98)/(4,100)/(4,17)    linkage			cross-reference-linkage:u
+elm (4,31)                  scheduleNumber		!
+elm (4,1)                   controlIdentifier		identifier-standard
+elm (4,23)                  originalControlIdentifier	!
+elm (4,19)                  recordSource		!
+elm (4,34)                  languageOfRecord		!
+elm (1,16)                  dateOfLastModification	date/time-last-modified:w,date/time-last-modified:s
+elm (4,24)                  recordReviewDate		!
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils.att
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils.att	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils.att	(revision 21083)
@@ -0,0 +1,79 @@
+# $Id$
+name gils
+reference GILS-attset
+include bib1.att
+
+att 2000         Distributor
+att 2001	 Distributor-Name
+att 2002	 Index-Terms				# Subject-Terms-Contr.
+att 2003         Purpose
+att 2004         General-Access-Constraints
+att 2005         Use-Constraints
+att 2006         Distributor-Organization
+att 2007         Distributor-Street-Address
+att 2008         Distributor-City
+att 2009         Distributor-State-or-Province
+att 2010         Distributor-Zip-or-Postal-Code
+att 2011         Distributor-Country
+att 2012         Distributor-Network-Address
+att 2013         Distributor-Hours-of-Service
+att 2014         Distributor-Telephone
+att 2015         Distributor-Fax
+att 2016         Resource-Description
+att 2017         Order-Information
+att 2018         Technical-Prerequisites
+att 2019         Available-Time-Structured
+att 2020         Available-Time-Textual
+att 2021         Linkage
+att 2022         Linkage-Type
+att 2023         Contact-Name
+att 2024         Contact-Organization
+att 2025         Contact-Street-Address
+att 2026         Contact-City
+att 2027         Contact-State-or-Province
+att 2028         Contact-Zip-or-Postal-Code
+att 2029         Contact-Country
+att 2030         Contact-Network-Address
+att 2031         Contact-Hours-of-Service
+att 2032         Contact-Telephone
+att 2033         Contact-Fax
+att 2034         Agency-Program
+att 2035         Sources-of-Data
+att 2036         Subject-Thesaurus
+att 2037         Methodology
+att 2038         West-Bounding-Coordinate
+att 2039         East-Bounding-Coordinate
+att 2040         North-Bounding-Coordinate
+att 2041         South-Bounding-Coordinate
+att 2042         Place-Keyword
+att 2043         Place-Keyword-Thesaurus
+att 2044         Time-Period-Structured
+att 2045         Time-Period-Textual
+att 2046         Cross-Reference-Title
+att 2047         Cross-Reference-Linkage
+att 2049         Original-Control-Identifier
+att 2050         Supplemental-Information
+att 2051         Record-Review-Date
+att 2052         Originator-Dissemination-Control
+att 2053         Security-Classification-Control
+att 2054         Cost
+att 2055         Cost-Information
+att 2056         Schedule-Number
+att 2057         Controlled-Subject-Index
+att 2058         Uncontrolled-Term
+att 2059         Spatial-Domain
+att 2060         Bounding-Coordinates
+att 2061         Place
+att 2062         Time-Period
+att 2063         Availability
+att 2064         Order-Process
+att 2065         Available-Time-Period
+att 2066         Access-Constraints
+att 2067         Point-of-Contact
+att 2068         Cross-Reference
+att 2069         Available-Linkage
+att 2070         Cross-Reference-Relationship
+att 2071         Language-of-Record
+att 2072         Beginning-Date
+att 2073         Ending-Date
+att 2074         Controlled-Term
Index: /main/tags/2.38/gsdl/packages/yaz/tab/gils.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/gils.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/gils.tag	(revision 21083)
@@ -0,0 +1,68 @@
+# Tag set for GILS version 2.
+#
+# $Id$
+name gils
+type 4
+include tagsetm.tag
+include tagsetg.tag
+
+tag 1      controlIdentifier        string
+tag 2      streetAddress            string
+tag 3      city                     string
+tag 4      stateOrProvince          string
+tag 5      zipOrPostalCode          string
+tag 6      hoursOfService           string
+tag 7      resourceDescription      string
+tag 8      technicalPrerequisites   string
+tag 9      westBoundingCoordinate   intUnit
+tag 10     eastBoundingCoordinate   intUnit
+tag 11     northBoundingCoordinate  intUnit
+tag 12     southBoundingCoordinate  intUnit
+tag 13     placeKeyword             string
+tag 14     placeKeywordThesaurus    string
+tag 15     beginningDate            GeneralizedTime
+tag 16     timePeriodTextual        string
+tag 17     linkage                  string
+tag 18     linkageType              string
+tag 19     recordSource             string
+tag 20     controlledTerm           string
+tag 21     subjectThesaurus         string
+tag 22     uncontrolledTerm         string
+tag 23     originalControlIdentifier string
+tag 24     recordReviewDate         GeneralizedTime
+tag 25     generalAccessConstraints string
+tag 26     originatorDisseminationControl string
+tag 27     securityClassificationControl string
+tag 28     orderInformation         string
+tag 29     cost                     bool
+tag 30     costInformation          string
+tag 31     scheduleNumber           string
+tag 32     languageOfResource       string
+tag 33     medium                   string
+tag 34     languageOfRecord         string
+tag 35     relationship             string
+tag 36     endingDate               GeneralizedTime
+tag 51     purpose                  structured
+tag 52     originator               structured
+tag 53     accessConstraints        structured
+tag 54     useConstraints           structured
+tag 55     orderProcess             structured
+tag 56     agencyProgram            structured
+tag 57     sourcesOfData            structured
+tag 58     methodology              structured
+tag 59     supplementalInformation  structured
+tag 70     availability             structured
+tag 71     spatialDomain            structured
+tag 90     distributor              structured
+tag 91     boundingCoordinates      structured
+tag 92     place                    structured
+tag 93     timePeriod               structured
+tag 94     pointOfContact           structured
+tag 95     controlledSubjectIndex   structured
+tag 96     subjectTermsControlled   structured
+tag 97     subjectTermsUncontrolled structured
+tag 98     crossReference           structured
+tag 99     availableLinkage         structured
+tag 100    crossReferenceLinkage    structured
+tag 101    timePeriodStructured     structured
+tag 102    availableTimeStructured  structured
Index: /main/tags/2.38/gsdl/packages/yaz/tab/meta-b.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/meta-b.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/meta-b.est	(revision 21083)
@@ -0,0 +1,7 @@
+simpleelement (1,10)
+simpleelement (1,12)
+simpleelement (2,1)
+simpleelement (1,14)
+simpleelement (4,5)
+simpleelement (2,3)
+simpleelement (2,2):all
Index: /main/tags/2.38/gsdl/packages/yaz/tab/meta-usmarc.map
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/meta-usmarc.map	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/meta-usmarc.map	(revision 21083)
@@ -0,0 +1,21 @@
+targetname usmarc
+targetref USmarc
+
+map localControlNumber  /(3,001)/(3,@)
+map dateLastModified    /(3,005)/(3,@)
+
+map subject		/(3,653)/(3,a)
+map title		/(3,245)/(3,a)
+map author		/(3,700)/(3,a)
+map publisher		/(3,260)/(3,b)
+map otheragent 		/(3,710)/(3,a)
+map date		/(3,260)/(3,c)
+map identifier		/(3,024)/(3,a)
+# objectType skipped for now
+map form		/(3,538)/(3,a)
+map relation		/(3,787)/(3,a)    # complexity here
+map language		/(3,041)/(3,a)
+map source		/(3,786)/(3,a)
+# coverage skipped for now
+
+map abstract            /(3,520)/(3,a)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/meta.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/meta.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/meta.abs	(revision 21083)
@@ -0,0 +1,33 @@
+# This is a simple profile based on the Dublin Core of metadata elements.
+#
+# $Id$
+
+name meta
+attset bib1.att
+tagset meta.tag
+varset var1.var
+
+esetname F @
+esetname B meta-b.est
+
+maptab meta-usmarc.map
+
+elm (2,1)		title			Title:w,Title:p
+elm (2,2)		creator			Author:w,Author:p
+elm (2,21)		subject			Subject-heading
+elm (2,17)		description		-
+elm (2,31)		publisher		Publisher
+elm (2,32)		contributor		-
+elm (2,4)		date			Date
+elm (2,22)		type			Content-type
+elm (2,27)		format			Material-type
+elm (2,28)		identifier		-
+elm (2,33)		source			-
+elm (2,20)		language		Code-language
+elm (2,30)		relation		-
+elm (2,34)		coverage		-
+elm (2,29)		rights			-
+
+# These tags are required by Zebra for GRS-1 generation
+elm (1,10)		rank			-
+elm (1,14)		localControlNumber	Local-number
Index: /main/tags/2.38/gsdl/packages/yaz/tab/meta.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/meta.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/meta.tag	(revision 21083)
@@ -0,0 +1,4 @@
+name meta
+type 4
+include tagsetg.tag
+include tagsetm.tag
Index: /main/tags/2.38/gsdl/packages/yaz/tab/summary.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/summary.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/summary.abs	(revision 21083)
@@ -0,0 +1,26 @@
+# Summary record abstract syntax
+#
+# $Id$
+
+name summary
+tagset summary.tag
+attset bib1.att
+reference Summary
+
+elm (4,0)		title			!
+elm (4,1)		author			!
+elm (4,2)		callNumber		-
+elm (4,3)		recordType		-
+elm (4,4)		bibliographicLevel	-
+elm (4,5)		formats			-
+elm (4,5)/(4,6)		format			-
+elm (4,5)/(4,6)/(4,7)   format-type		-
+elm (4,5)/(4,6)/(4,8)   format-size		-
+elm (4,5)/(4,6)/(4,9)   format-bestPosn		-
+elm (4,10)		publicationPlace	-
+elm (4,11)		publicationDate		-
+elm (4,12)		targetSystemKey		-
+elm (4,13)		satisfyingElement	-
+elm (4,14)		rank			-
+elm (4,15)		documentId		-
+elm (4,16)		otherInformation	-
Index: /main/tags/2.38/gsdl/packages/yaz/tab/summary.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/summary.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/summary.tag	(revision 21083)
@@ -0,0 +1,27 @@
+# Tagset for Summary profile
+#
+# $Id$
+
+name summary
+type 4
+
+tag	0	title			string
+tag	1	author			string
+tag	2	callNumber		string
+tag	3	recordType		string
+tag	4	bibliographicLevel	string
+
+tag	5	formats			structured
+tag	6	format			structured
+tag	7	type			string
+tag	8	size			numeric
+tag	9	bestPosn		numeric
+
+tag	10	publicationPlace	string
+tag	11	publicationDate		string
+tag	12	targetSystemKey		string
+tag	13	satisfyingElement	string
+tag	14	rank			numeric
+tag	15	documentId		string
+tag	16	abstract		string
+tag	17	otherInformation	structured
Index: /main/tags/2.38/gsdl/packages/yaz/tab/tagsetg.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/tagsetg.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/tagsetg.tag	(revision 21083)
@@ -0,0 +1,41 @@
+# TagSet-G Tags
+# $Id$
+name tagsetg
+reference TagsetG
+type 2
+
+tag	1	title					string
+tag	2	author					string
+tag	3	publicationPlace			string
+tag	4	publicationDate/date-of-publication	string
+tag	5	documentId				string
+tag	6	abstract				string
+tag	7	name					string
+tag	8	dateTime				generalizedtime
+tag	9	displayObject				octetstring
+tag	10	organization/organisation		string
+tag	11	postalAddress				string
+tag	12	networkAddress				string
+tag	13	eMailAddress				string
+tag	14	phoneNumber/telephone			string
+tag	15	faxNumber/fax				string
+tag	16	country					string
+tag	17	description				string
+tag	18	time					intunit
+tag	19	documentcontent				octetstring
+tag	20	language				string
+tag	21	subject					string
+tag	22	resourceType				string
+tag	23	city					string
+tag	24	stateOrProvince				string
+tag	25	zipOrPostalCode				string
+tag	26	cost					string
+tag 	27	format					string
+tag	28	identifier				string
+tag	29	rights					string
+tag	30	relation				string
+tag	31	publisher				string
+tag	32	contributor				string
+tag	33	source					string
+tag	34	coverage				string
+tag	35	private					string
Index: /main/tags/2.38/gsdl/packages/yaz/tab/tagsetm.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/tagsetm.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/tagsetm.tag	(revision 21083)
@@ -0,0 +1,33 @@
+# TagSet-M Tags
+#
+# $Id$
+name tagsetm
+reference TagsetM
+type 1
+
+tag	1	schemaIdentifier		oid
+tag	2	elementsOrdered			bool
+tag	3	elementOrdering			int
+tag	4	defaultTagType			int
+tag	5	defaultVariantSetId		oid
+tag	6	defaultVariantSpec		structured
+tag	7	processingInstructions		string
+tag	8	recordUsage			int
+tag	9	restriction			string
+tag	10	rank				int
+tag	11	userMessage			string
+tag	12	url				string
+tag	13	record				structured
+tag	14	local-control-number		string
+tag	15	creation-date			generalizedtime
+tag	16	dateOfLastModification/lastModified generalizedtime
+tag	17	dateOfLastReview		generalizedtime
+tag	18	score				int
+tag	19	wellKnown			string
+tag	20	recordWrapper			structured
+tag	21	defaultTagSetId			oid
+tag	22	languageOfRecord		string
+tag	23	type				string
+tag	24	scheme				string
+tag	25	costInfo			string
+tag	26	costFlag			bool
Index: /main/tags/2.38/gsdl/packages/yaz/tab/usmarc-b.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/usmarc-b.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/usmarc-b.est	(revision 21083)
@@ -0,0 +1,6 @@
+simpleelement (3,'001)
+simpleelement (3,'035)
+simpleelement (3,'245)
+simpleelement (3,'100)
+simpleelement (3,'710)
+simpleelement (3,'700)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.abs	(revision 21083)
@@ -0,0 +1,36 @@
+# $Id$
+name usmarc
+reference USmarc
+attset bib1.att
+tagset usmarc.tag
+
+marc usmarc.mar
+
+esetname B usmarc-b.est
+esetname F @
+
+# All 245 subfields mapped to title (word) and 
+# 245 subfield a mapped to tile (phrase).
+elm 245			title		-
+elm 245/?		title		!:w
+elm 245/?/a		title		!:w,!:p
+
+# 100 mapped to Author-name-personal and Author.
+elm 100			Author-name-personal	-
+elm 100/?		Author-name-personal	!:w,!:p,Author:w,Author:p
+
+# 110 mapped to Author-name-corporate and Author
+elm 110			Author-name-corporate	-
+elm 110/?		Author-name-corporate	!:w,!:p,Author:w,Author:p
+
+# 111 mapped to Author-name-conference and Author
+elm 111			Author-name-conference	-
+elm 111/?		Author-name-conference	!:w,!:p,Author:w,Author:p
+
+# Tag 260 subfield a mapped to Place-publication
+elm 260			Place-publication	-
+elm 260/?		Place-publication	-
+elm 260/?/a		Place-publication	!:w
+elm 260/?/b		Publisher		!:w
+elm 260/?/c		Date			!:w
+
Index: /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.mar
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.mar	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.mar	(revision 21083)
@@ -0,0 +1,3 @@
+# $Id$
+name usmarc
+reference USmarc
Index: /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.tag
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.tag	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/usmarc.tag	(revision 21083)
@@ -0,0 +1,12 @@
+# Pseudo-tagset for USMARC
+#
+# $Id$
+
+name usmarc
+type 4
+include tagsetm.tag
+
+#tag 1		a		string
+#tag 2		b		string
+tag 245		245		string
+tag 100		100		string
Index: /main/tags/2.38/gsdl/packages/yaz/tab/var1.var
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/var1.var	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/var1.var	(revision 21083)
@@ -0,0 +1,64 @@
+# Definition of the variant set Variant-1.
+# Variant triple syntax is '<VAR class type value>'. Eg.
+# <var body iana "application/postscript"> or <var lang lang "eng">.
+#
+# $Id$
+
+name variant-1
+reference Variant-1
+
+class 1 variantId
+
+  type	1	variantId		octetstring
+
+class 2 body
+
+  type	1	iana			string
+  type	2	z39.50			string
+  type	3	other			string
+
+class 3 format
+
+  type	1	characters-per-line	int
+  type	2	line-length		int
+
+  # More types here......
+
+class 4 lang
+
+  type	1	lang			string
+  type	2	charset			int
+  type	3	charset-id		oid
+  type	4	encoding-id		oid
+  type	5	private-string		string
+
+class 5 piece
+
+  type	1	fragment-wanted		int
+  type	2	fragment-returned	int
+  type	3	start			intunit
+  type	4	end			intunit
+  type	5	howmuch			intunit
+  type	6	step			intunit
+  type	7	targettoken		octetstring
+
+class 6 metadata-requested
+
+  type	1	cost			intunit
+  type	2	size			intunit
+  type	3	hitsvar			null
+  type	4	hitsnonvar		null
+  type	5	variantlist		null
+  type	6	isvariantsupported	null
+  type	7	documentdescriptor	null
+  type	8	surrogateinformation	null
+  type	998	allmetadata		null
+  type	999	othermetadata		oid
+
+class 7	metadata-returned
+
+  type	1	cost			intunit
+
+  # More...
+
+# More classes, too...
Index: /main/tags/2.38/gsdl/packages/yaz/tab/wais-b.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/wais-b.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/wais-b.est	(revision 21083)
@@ -0,0 +1,9 @@
+#
+# WAIS eset.
+#
+
+simpleelement (2,1)
+simpleelement (2,7)
+simpleelement (1,16)
+simpleelement (1,18)
+simpleelement (1,14)
Index: /main/tags/2.38/gsdl/packages/yaz/tab/wais-variant.est
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/wais-variant.est	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/wais-variant.est	(revision 21083)
@@ -0,0 +1,19 @@
+#
+# WAIS variant eset.
+#
+
+#
+# Default is no data, variant-list, please.
+#
+
+simpleelement ?:all variant (9,1,@) (6,5,@)
+
+#
+# Empty variant-requests for the well-known elements to override default.
+#
+
+simpleelement (2,1) variant
+simpleelement (2,7) variant
+simpleelement (1,16) variant
+simpleelement (1,18) variant
+simpleelement (1,14) variant
Index: /main/tags/2.38/gsdl/packages/yaz/tab/wais.abs
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/tab/wais.abs	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/tab/wais.abs	(revision 21083)
@@ -0,0 +1,24 @@
+# WAIS profile
+#
+# $Id$
+
+name wais
+reference WAIS-schema
+attset bib1.att
+tagset generic.tag
+
+varset var1.var
+
+esetname B wais-b.est
+esetname F @
+esetname VARIANT wais-variant.est
+
+elm (2,1)		Title			!:p,!:w
+elm (2,7)		Name			!:p,!:w
+elm (2,8)		Date			!
+elm (1,18)		Score			-
+elm (1,14)		RecordId		Local-number
+
+# Tags below this point are unofficial.
+
+elm Body		BodyOfText		!
Index: /main/tags/2.38/gsdl/packages/yaz/util/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/Makefile.am	(revision 21083)
@@ -0,0 +1,14 @@
+## Copyright (C) 1994-2000, Index Data
+## All rights reserved.
+## $Id$
+
+noinst_LIBRARIES = libutil.a
+
+bin_SCRIPTS = yaz-comp
+
+EXTRA_DIST = yaz-comp
+
+INCLUDES =-I../include
+
+libutil_a_SOURCES=options.c log.c marcdisp.c oid.c wrbuf.c nmemsdup.c \
+   xmalloc.c readconf.c tpath.c nmem.c matchstr.c atoin.c 
Index: /main/tags/2.38/gsdl/packages/yaz/util/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/Makefile.in	(revision 21083)
@@ -0,0 +1,294 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libutil.a
+
+bin_SCRIPTS = yaz-comp
+
+EXTRA_DIST = yaz-comp
+
+INCLUDES = -I../include
+
+libutil_a_SOURCES = options.c log.c marcdisp.c oid.c wrbuf.c nmemsdup.c    xmalloc.c readconf.c tpath.c nmem.c matchstr.c atoin.c 
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libutil_a_LIBADD = 
+libutil_a_OBJECTS =  options.o log.o marcdisp.o oid.o wrbuf.o nmemsdup.o \
+xmalloc.o readconf.o tpath.o nmem.o matchstr.o atoin.o
+AR = ar
+SCRIPTS =  $(bin_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 = tar
+GZIP_ENV = --best
+SOURCES = $(libutil_a_SOURCES)
+OBJECTS = $(libutil_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps util/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libutil.a: $(libutil_a_OBJECTS) $(libutil_a_DEPENDENCIES)
+	-rm -f libutil.a
+	$(AR) cru libutil.a $(libutil_a_OBJECTS) $(libutil_a_LIBADD)
+	$(RANLIB) libutil.a
+
+install-binSCRIPTS: $(bin_SCRIPTS)
+	@$(NORMAL_INSTALL)
+	$(mkinstalldirs) $(DESTDIR)$(bindir)
+	@list='$(bin_SCRIPTS)'; for p in $$list; do \
+	  if test -f $$p; then \
+	    echo " $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	  else if test -f $(srcdir)/$$p; then \
+	    echo " $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`"; \
+	    $(INSTALL_SCRIPT) $(srcdir)/$$p $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	  else :; fi; fi; \
+	done
+
+uninstall-binSCRIPTS:
+	@$(NORMAL_UNINSTALL)
+	list='$(bin_SCRIPTS)'; for p in $$list; do \
+	  rm -f $(DESTDIR)$(bindir)/`echo $$p|sed '$(transform)'`; \
+	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:  $(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 = util
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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-binSCRIPTS
+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-binSCRIPTS
+uninstall: uninstall-am
+all-am: Makefile $(LIBRARIES) $(SCRIPTS)
+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:
+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 uninstall-binSCRIPTS install-binSCRIPTS 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:
Index: /main/tags/2.38/gsdl/packages/yaz/util/atoin.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/atoin.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/atoin.c	(revision 21083)
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1997, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:06  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.3  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.2  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1997/09/04 07:52:27  adam
+ * Moved atoi_n function to separate source file.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <ctype.h>
+#include <yaz/yaz-util.h>
+
+int atoi_n (const char *buf, int len)
+{
+    int val = 0;
+
+    while (--len >= 0)
+    {
+        if (isdigit (*buf))
+            val = val*10 + (*buf - '0');
+	buf++;
+    }
+    return val;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/log.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/log.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/log.c	(revision 21083)
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:06  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.22  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.21  2000/02/28 11:20:06  adam
+ * Using autoconf. New definitions: YAZ_BEGIN_CDECL/YAZ_END_CDECL.
+ *
+ * Revision 1.20  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.19  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.18  1998/10/28 10:27:00  adam
+ * New functions log_init_file, log_init_level, log_init_prefix.
+ *
+ * Revision 1.17  1997/12/09 16:11:02  adam
+ * Assume strerror is defined on Unixes as well. It's standard ANSI.
+ *
+ * Revision 1.16  1997/10/06 08:55:07  adam
+ * Changed log_init so that previous (if any) is closed.
+ *
+ * Revision 1.15  1997/09/29 07:13:13  adam
+ * Minor changes.
+ *
+ * Revision 1.14  1997/09/18 08:48:09  adam
+ * Fixed minor bug that caused log_init to ignore filename.
+ *
+ * Revision 1.13  1997/09/01 08:54:13  adam
+ * New windows NT/95 port using MSV5.0. Made prefix query handling
+ * thread safe. The function options ignores empty arguments when met.
+ *
+ * Revision 1.12  1997/05/01 15:08:14  adam
+ * Added log_mask_str_x routine.
+ *
+ * Revision 1.11  1996/02/05 12:24:32  adam
+ * Implemented log_event_{start,end}-functions.
+ *
+ * Revision 1.10  1995/12/06  09:51:27  quinn
+ * Fixed the log-prefix buffer - it was too small and the setup code lacked
+ * a bounds-check.
+ *
+ * Revision 1.9  1995/09/29  17:12:34  quinn
+ * Smallish
+ *
+ * Revision 1.8  1995/09/27  15:03:02  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.7  1995/06/19  12:40:18  quinn
+ * Added log_file()
+ *
+ * Revision 1.6  1995/06/15  15:45:03  quinn
+ * Added date info.
+ *
+ * Revision 1.5  1995/05/16  08:51:11  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.4  1995/05/15  11:56:55  quinn
+ * Debuggng & adjustments.
+ *
+ * Revision 1.3  1995/04/10  10:23:51  quinn
+ * Fixes.
+ *
+ * Revision 1.2  1995/03/31  10:16:55  quinn
+ * Fixed logging.
+ *
+ * Revision 1.1  1995/03/30  10:26:53  quinn
+ * Logging system
+ *
+ * Revision 1.9  1994/12/12  12:09:02  quinn
+ * Changes
+ *
+ * Revision 1.8  1994/11/22  13:15:38  quinn
+ * Simple
+ *
+ * Revision 1.7  1994/10/05  10:16:11  quinn
+ * Added xrealloc. Fixed bug in log.
+ *
+ * Revision 1.6  1994/10/04  14:02:19  quinn
+ * Fixed log_init
+ *
+ * Revision 1.5  1994/09/28  13:07:41  adam
+ * Implemented log_mask_str.
+ *
+ * Revision 1.4  1994/09/27  20:04:13  quinn
+ * Added fflush.
+ *
+ * Revision 1.3  1994/08/18  08:18:48  quinn
+ * Added prefix to log_init.
+ *
+ * Revision 1.2  1994/08/17  14:27:53  quinn
+ * added LOG_ERRNO
+ *
+ * Revision 1.1  1994/08/17  13:23:15  quinn
+ * First version
+ * Added log.c
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+#include <stdarg.h>
+#include <errno.h>
+#include <time.h>
+#include <yaz/log.h>
+
+#define HAS_STRERROR 1
+
+#if HAS_STRERROR
+
+#else
+char *strerror(int n)
+{
+        extern char *sys_errlist[];
+        return sys_errlist[n];
+}
+
+#endif
+
+static int l_level = LOG_DEFAULT_LEVEL;
+static FILE *l_file = NULL;
+static char l_prefix[512] = "log";
+
+static struct {
+    int mask;
+    char *name;
+} mask_names[] =
+{
+    { LOG_FATAL, "fatal"},
+    { LOG_DEBUG, "debug"},
+    { LOG_WARN,  "warn" },
+    { LOG_LOG,   "log"  },
+    { LOG_ERRNO, ""},
+    { LOG_ALL,   "all"  },
+    { 0,         "none" },
+    { 0, NULL }
+};  
+
+FILE *log_file(void)
+{
+    if (!l_file)
+        l_file = stderr;
+    return l_file;
+}
+
+void log_init_file (const char *fname)
+{
+    FILE *new_file;
+    if (!l_file)
+        l_file = stderr;
+    if (!fname || !*fname)
+        return;
+    if (!(new_file = fopen(fname, "a")))
+        return;
+    if (l_file != stderr)
+    {
+        fclose (l_file);
+    }
+    setvbuf(new_file, 0, _IONBF, 0);
+    l_file = new_file;
+}
+
+void log_init_level (int level)
+{
+    l_level = level;
+}
+
+void log_init_prefix (const char *prefix)
+{
+    if (prefix && *prefix)
+    	sprintf(l_prefix, "%.512s", prefix);
+}
+
+void log_init(int level, const char *prefix, const char *fname)
+{
+    log_init_level (level);
+    log_init_prefix (prefix);
+    log_init_file (fname);
+}
+
+static void (*start_hook_func)(int, const char *, void *) = NULL;
+static void *start_hook_info;
+static void (*end_hook_func)(int, const char *, void *) = NULL;
+static void *end_hook_info;
+
+void log_event_start (void (*func)(int, const char *, void *), void *info)
+{
+    start_hook_func = func;
+    start_hook_info = info;
+}
+
+void log_event_end (void (*func)(int, const char *, void *), void *info)
+{
+    end_hook_func = func;
+    end_hook_info = info;
+}
+
+void yaz_log(int level, const char *fmt, ...)
+{
+    va_list ap;
+    char buf[4096], flags[1024];
+    int i;
+    time_t ti;
+    struct tm *tim;
+    char tbuf[50];
+    int o_level = level;
+
+    if (!(level & l_level))
+    	return;
+    if (!l_file)
+        l_file = stderr;
+    *flags = '\0';
+    for (i = 0; level && mask_names[i].name; i++)
+    	if (mask_names[i].mask & level)
+    	{
+	    if (*mask_names[i].name)
+		sprintf(flags + strlen(flags), "[%s]", mask_names[i].name);
+	    level -= mask_names[i].mask;
+	}
+    va_start(ap, fmt);
+    vsprintf(buf, fmt, ap);
+    if (o_level & LOG_ERRNO)
+    	sprintf(buf + strlen(buf), " [%s]", strerror(errno));
+    if (start_hook_func)
+        (*start_hook_func)(o_level, buf, start_hook_info);
+    ti = time(0);
+    tim = localtime(&ti);
+    strftime(tbuf, 50, "%H:%M:%S-%d/%m", tim);
+    fprintf(l_file, "%s: %s: %s %s\n", tbuf, l_prefix, flags, buf);
+    fflush(l_file);
+    if (end_hook_func)
+	(*end_hook_func)(o_level, buf, end_hook_info);
+}
+
+int log_mask_str (const char *str)
+{
+    return log_mask_str_x (str, LOG_DEFAULT_LEVEL);
+}
+
+int log_mask_str_x (const char *str, int level)
+{
+    const char *p;
+    int i;
+
+    while (*str)
+    {
+        for (p = str; *p && *p != ','; p++)
+            ;
+        if (*str == '-' || isdigit(*str))
+            level = atoi (str);
+        else
+            for (i = 0; mask_names[i].name; i++)
+                if (strlen (mask_names[i].name) == (size_t) (p-str) &&
+                    memcmp (mask_names[i].name, str, p-str) == 0)
+                {
+                    if (mask_names[i].mask)
+                        level |= mask_names[i].mask;
+                    else
+                        level = 0;
+                }
+        if (*p == ',')
+            p++;
+        str = p;
+    }
+    return level;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/marcdisp.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/marcdisp.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/marcdisp.c	(revision 21083)
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:07  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  2000/02/05 10:47:19  adam
+ * Identifier-length and indicator-lenght no longer set to 2 (forced).
+ *
+ * Revision 1.9  1999/12/21 16:24:48  adam
+ * More robust ISO2709 handling (in case of real bad formats).
+ *
+ * Revision 1.8  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1997/09/24 13:29:40  adam
+ * Added verbose option -v to marcdump utility.
+ *
+ * Revision 1.6  1997/09/04 07:52:27  adam
+ * Moved atoi_n function to separate source file.
+ *
+ * Revision 1.5  1997/05/01 15:08:15  adam
+ * Added log_mask_str_x routine.
+ *
+ * Revision 1.4  1995/09/29 17:12:34  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:03:03  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:51:12  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/04/10  10:28:46  quinn
+ * Added copy of CCL and MARC display
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <yaz/marcdisp.h>
+#include <yaz/yaz-util.h>
+
+int marc_display_ex (const char *buf, FILE *outf, int debug)
+{
+    int entry_p;
+    int record_length;
+    int indicator_length;
+    int identifier_length;
+    int base_address;
+    int length_data_entry;
+    int length_starting;
+    int length_implementation;
+
+    if (!outf)
+        outf = stdout;
+    record_length = atoi_n (buf, 5);
+    if (record_length < 25)
+        return -1;
+    if (isdigit(buf[10]))
+        indicator_length = atoi_n (buf+10, 1);
+    else
+        indicator_length = 2;
+    if (isdigit(buf[11]))
+	identifier_length = atoi_n (buf+11, 1);
+    else
+        identifier_length = 2;
+    base_address = atoi_n (buf+12, 4);
+
+    length_data_entry = atoi_n (buf+20, 1);
+    length_starting = atoi_n (buf+21, 1);
+    length_implementation = atoi_n (buf+22, 1);
+
+    if (debug)
+    {
+	fprintf (outf, "Record length         %5d\n", record_length);
+	fprintf (outf, "Indicator length      %5d\n", indicator_length);
+	fprintf (outf, "Identifier length     %5d\n", identifier_length);
+	fprintf (outf, "Base address          %5d\n", base_address);
+	fprintf (outf, "Length data entry     %5d\n", length_data_entry);
+	fprintf (outf, "Length starting       %5d\n", length_starting);
+	fprintf (outf, "Length implementation %5d\n", length_implementation);
+    }
+    for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+    {
+        entry_p += 3+length_data_entry+length_starting;
+        if (entry_p >= record_length)
+            return -1;
+    }
+    base_address = entry_p+1;
+    for (entry_p = 24; buf[entry_p] != ISO2709_FS; )
+    {
+        int data_length;
+	int data_offset;
+	int end_offset;
+	int i, j;
+	char tag[4];
+
+        memcpy (tag, buf+entry_p, 3);
+	entry_p += 3;
+        tag[3] = '\0';
+	if (debug)
+	    fprintf (outf, "Tag: ");
+	fprintf (outf, "%s ", tag);
+	data_length = atoi_n (buf+entry_p, length_data_entry);
+	entry_p += length_data_entry;
+	data_offset = atoi_n (buf+entry_p, length_starting);
+	entry_p += length_starting;
+	i = data_offset + base_address;
+	end_offset = i+data_length-1;
+	if (debug)
+	    fprintf (outf, " Ind: ");
+        if (memcmp (tag, "00", 2) && indicator_length)
+	{
+            for (j = 0; j<indicator_length; j++)
+		fprintf (outf, "%c", buf[i++]);
+	}
+	if (debug)
+	    fprintf (outf, " Fields: ");
+	while (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS && i < end_offset)
+	{
+            if (memcmp (tag, "00", 2) && identifier_length)
+	    {
+	        i++;
+	        fprintf (outf, " $"); 
+                for (j = 1; j<identifier_length; j++)
+                    fprintf (outf, "%c", buf[i++]);
+		fprintf (outf, " ");
+	        while (buf[i] != ISO2709_RS && buf[i] != ISO2709_IDFS &&
+	               buf[i] != ISO2709_FS && i < end_offset)
+	            fprintf (outf, "%c", buf[i++]);
+	    }
+	    else
+	        fprintf (outf, "%c", buf[i++]);
+	}
+	fprintf (outf, "\n");
+	if (i < end_offset)
+	    fprintf (outf, "-- separator but not at end of field\n");
+	if (buf[i] != ISO2709_RS && buf[i] != ISO2709_FS)
+	    fprintf (outf, "-- no separator at end of field\n");
+    }
+    return record_length;
+}
+
+int marc_display (const char *buf, FILE *outf)
+{
+    return marc_display_ex (buf, outf, 0);
+}
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/util/matchstr.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/matchstr.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/matchstr.c	(revision 21083)
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:07  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.5  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.4  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3  1999/10/19 12:35:42  adam
+ * Minor bug fix (bug introduced by previous commit).
+ *
+ * Revision 1.2  1999/10/15 11:35:41  adam
+ * Character '.' matches any single character.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.7  1997/09/30 11:47:47  adam
+ * Added function 'cause checkergcc doesn't include assert handler.
+ *
+ * Revision 1.6  1997/09/04 07:54:34  adam
+ * Right hande side operand of yaz_matchstr may include a ? in
+ * which case it returns "match ok".
+ *
+ * Revision 1.5  1997/07/21 12:48:11  adam
+ * Removed windows DLL stubs.
+ *
+ * Revision 1.4  1997/05/01 15:07:55  adam
+ * Added DLL entry point routines.
+ *
+ * Revision 1.3  1996/10/29 13:36:28  adam
+ * Added header.
+ *
+ * Revision 1.2  1996/02/20 17:58:42  adam
+ * Added const to yaz_matchstr.
+ *
+ * Revision 1.1  1996/02/20  16:33:06  quinn
+ * Moved matchstr to global util
+ *
+ * Revision 1.1  1995/11/01  11:56:08  quinn
+ * Added Retrieval (data management) functions en masse.
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <assert.h>
+#include <ctype.h>
+#include <yaz/yaz-util.h>
+
+/*
+ * Match strings, independently of case and occurences of '-'.
+ * fairly inefficient - will be replaced with an indexing scheme for
+ * the various subsystems if we get a bottleneck here.
+ */
+
+int yaz_matchstr(const char *s1, const char *s2)
+{
+    while (*s1 && *s2)
+    {
+	char c1 = *s1;
+	char c2 = *s2;
+
+        if (c2 == '?')
+            return 0;
+	if (c1 == '-')
+	    c1 = *++s1;
+	if (c2 == '-')
+	    c2 = *++s2;
+	if (!c1 || !c2)
+	    break;
+        if (c2 != '.')
+        {
+	    if (isupper(c1))
+	        c1 = tolower(c1);
+	    if (isupper(c2))
+	        c2 = tolower(c2);
+	    if (c1 != c2)
+	        break;
+        }
+	s1++;
+	s2++;
+    }
+    return *s1 || *s2;
+}
+
+#ifdef __GNUC__
+#ifdef __CHECKER__
+void __assert_fail (const char *assertion, const char *file, 
+                    unsigned int line, const char *function)
+{
+    fprintf (stderr, "%s in file %s line %d func %s\n",
+             assertion, file, line, function);
+    abort ();
+}
+#endif
+#endif
Index: /main/tags/2.38/gsdl/packages/yaz/util/nmem.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/nmem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/nmem.c	(revision 21083)
@@ -0,0 +1,405 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:08  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.21  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.20  2000/01/06 14:59:13  adam
+ * Added oid_init/oid_exit. Changed oid_exit.
+ *
+ * Revision 1.19  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.18  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.17  1999/07/13 13:28:25  adam
+ * Better debugging for NMEM routines.
+ *
+ * Revision 1.16  1999/03/31 11:18:25  adam
+ * Implemented odr_strdup. Added Reference ID to backend server API.
+ *
+ * Revision 1.15  1999/02/11 09:10:26  adam
+ * Function nmem_init only mandatory on Windows.
+ *
+ * Revision 1.14  1999/02/02 13:57:40  adam
+ * Uses preprocessor define WIN32 instead of WINDOWS to build code
+ * for Microsoft WIN32.
+ *
+ * Revision 1.13  1998/10/19 15:24:21  adam
+ * New nmem utility, nmem_transfer, that transfer blocks from one
+ * NMEM to another.
+ *
+ * Revision 1.12  1998/10/13 16:00:18  adam
+ * Implemented nmem_critical_{enter,leave}.
+ *
+ * Revision 1.11  1998/08/21 14:13:36  adam
+ * Added GNU Configure script to build Makefiles.
+ *
+ * Revision 1.10  1998/07/20 12:35:57  adam
+ * Added more memory diagnostics (when NMEM_DEBUG is 1).
+ *
+ * Revision 1.9  1998/07/07 15:49:01  adam
+ * Reduced chunk size.
+ *
+ * Revision 1.8  1998/07/03 14:21:27  adam
+ * Added critical sections for pthreads-library. Thanks to Ian Ibbotson,
+ * Fretwell Downing Informatics.
+ *
+ * Revision 1.7  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.6  1997/10/31 12:20:09  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.5  1997/10/06 09:09:52  adam
+ * Function mmem_exit releases memory used by the freelists.
+ *
+ * Revision 1.4  1997/09/29 07:12:50  adam
+ * NMEM thread safe. NMEM must be initialized before use (sigh) -
+ * routine nmem_init/nmem_exit implemented.
+ *
+ * Revision 1.3  1997/07/21 12:47:38  adam
+ * Moved definition of nmem_control and nmem_block.
+ *
+ * Revision 1.2  1995/12/13 13:44:37  quinn
+ * Modified Data1-system to use nmem
+ *
+ * Revision 1.1  1995/11/13  09:27:52  quinn
+ * Fiddling with the variant stuff.
+ *
+ *
+ */
+
+/*
+ * This is a simple and fairly wasteful little module for nibble memory
+ * allocation. Evemtually we'll put in something better.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <assert.h>
+#include <string.h>
+#include <yaz/xmalloc.h>
+#include <yaz/nmem.h>
+#include <yaz/log.h>
+#ifdef WIN32
+#include <windows.h>
+#elif _REENTRANT
+
+#if HAVE_PTHREAD_H
+#include <pthread.h>
+#elif HAVE_THREAD_H
+#include <thread.h>
+#endif
+
+#endif
+
+#define NMEM_CHUNK (4*1024)
+
+#ifdef WIN32
+static CRITICAL_SECTION critical_section;
+#define NMEM_ENTER EnterCriticalSection(&critical_section)
+#define NMEM_LEAVE LeaveCriticalSection(&critical_section)
+#elif _REENTRANT
+static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER;
+#define NMEM_ENTER pthread_mutex_lock(&nmem_mutex);
+#define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex);
+#else
+#define NMEM_ENTER
+#define NMEM_LEAVE
+#endif
+
+static nmem_block *freelist = NULL;        /* "global" freelists */
+static nmem_control *cfreelist = NULL;
+static int nmem_active_no = 0;
+static int nmem_init_flag = 0;
+
+#if NMEM_DEBUG
+struct nmem_debug {
+    void *p;
+    char file[40];
+    int line;
+    struct nmem_debug *next;
+};
+  
+struct nmem_debug *nmem_debug_list = 0;  
+#endif
+
+static void free_block(nmem_block *p)
+{  
+    p->next = freelist;
+    freelist = p;
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "nmem free_block p=%p", p);
+#endif
+}
+
+#if NMEM_DEBUG
+void nmem_print_list (void)
+{
+    struct nmem_debug *p;
+
+    yaz_log (LOG_DEBUG, "nmem print list");
+    NMEM_ENTER;
+    for (p = nmem_debug_list; p; p = p->next)
+	yaz_log (LOG_DEBUG, " %s:%d p=%p", p->file, p->line, p->p);
+    NMEM_LEAVE;
+}
+#endif
+/*
+ * acquire a block with a minimum of size free bytes.
+ */
+static nmem_block *get_block(int size)
+{
+    nmem_block *r, *l;
+
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "nmem get_block size=%d", size);
+#endif
+    for (r = freelist, l = 0; r; l = r, r = r->next)
+    	if (r->size >= size)
+	    break;
+    if (r)
+    {
+#if NMEM_DEBUG
+	yaz_log (LOG_DEBUG, "nmem get_block found free block p=%p", r);
+#endif
+    	if (l)
+	    l->next = r->next;
+	else
+	    freelist = r->next;
+    }
+    else
+    {
+    	int get = NMEM_CHUNK;
+
+	if (get < size)
+	    get = size;
+#if NMEM_DEBUG
+	yaz_log (LOG_DEBUG, "nmem get_block alloc new block size=%d", get);
+#endif
+	r = (nmem_block *)xmalloc(sizeof(*r));
+	r->buf = (char *)xmalloc(r->size = get);
+    }
+    r->top = 0;
+    return r;
+}
+
+void nmem_reset(NMEM n)
+{
+    nmem_block *t;
+
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "nmem_reset p=%p", n);
+#endif
+    if (!n)
+	return;
+    NMEM_ENTER;
+    while (n->blocks)
+    {
+    	t = n->blocks;
+	n->blocks = n->blocks->next;
+	free_block(t);
+    }
+    n->total = 0;
+    NMEM_LEAVE;
+}
+
+#if NMEM_DEBUG
+void *nmem_malloc_f (const char *file, int line, NMEM n, int size)
+#else
+void *nmem_malloc(NMEM n, int size)
+#endif
+{
+    struct nmem_block *p;
+    char *r;
+
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "%s:%d: nmem_malloc p=%p size=%d", file, line,
+                     n, size);
+#endif
+    if (!n)
+    {
+        abort ();
+	return xmalloc(size);
+    }
+#ifdef WIN32
+    assert (nmem_init_flag);
+#endif
+    NMEM_ENTER;
+    p = n->blocks;
+    if (!p || p->size - p->top < size)
+    {
+    	p = get_block(size);
+	p->next = n->blocks;
+	n->blocks = p;
+    }
+    r = p->buf + p->top;
+    /* align size */
+    p->top += (size + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
+    n->total += size;
+    NMEM_LEAVE;
+    return r;
+}
+
+int nmem_total(NMEM n)
+{
+    return n->total;
+}
+
+#if NMEM_DEBUG
+NMEM nmem_create_f(const char *file, int line)
+#else
+NMEM nmem_create(void)
+#endif
+{
+    NMEM r;
+#if NMEM_DEBUG
+    struct nmem_debug *debug_p;
+#endif
+    
+    NMEM_ENTER;
+    nmem_active_no++;
+    r = cfreelist;
+    if (r)
+	cfreelist = cfreelist->next;
+    else
+	r = (nmem_control *)xmalloc(sizeof(*r));
+    NMEM_LEAVE;
+
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "%s:%d: nmem_create %d p=%p", file, line,
+                     nmem_active_no, r);
+#endif
+    r->blocks = 0;
+    r->total = 0;
+    r->next = 0;
+
+#if NMEM_DEBUG
+    for (debug_p = nmem_debug_list; debug_p; debug_p = debug_p->next)
+	if (debug_p->p == r)
+	{
+	    yaz_log (LOG_FATAL, "multi used block in nmem");
+	    abort ();
+	}
+    debug_p = xmalloc (sizeof(*debug_p));
+    strncpy (debug_p->file, file, sizeof(debug_p->file)-1);
+    debug_p->file[sizeof(debug_p->file)-1] = '\0';
+    debug_p->line = line;
+    debug_p->p = r;
+    debug_p->next = nmem_debug_list;
+    nmem_debug_list = debug_p;
+
+    nmem_print_list();
+#endif
+    return r;
+}
+
+#if NMEM_DEBUG
+void nmem_destroy_f(const char *file, int line, NMEM n)
+#else
+void nmem_destroy(NMEM n)
+#endif
+{
+#if NMEM_DEBUG
+    struct nmem_debug **debug_p;
+    int ok = 0;
+#endif
+    if (!n)
+	return;
+    
+#if NMEM_DEBUG
+    yaz_log (LOG_DEBUG, "%s:%d: nmem_destroy %d p=%p", file, line,
+                     nmem_active_no-1, n);
+    NMEM_ENTER;
+    for (debug_p = &nmem_debug_list; *debug_p; debug_p = &(*debug_p)->next)
+	if ((*debug_p)->p == n)
+	{
+	    struct nmem_debug *debug_save = *debug_p;
+	    *debug_p = (*debug_p)->next;
+	    xfree (debug_save);
+	    ok = 1;
+	    break;
+	}
+    NMEM_LEAVE;
+    nmem_print_list();
+    if (!ok)
+    {
+	yaz_log (LOG_WARN, "%s:%d destroying unallocated nmem block p=%p",
+		 file, line, n);
+	return;
+    }
+#endif
+    nmem_reset(n);
+    NMEM_ENTER;
+    nmem_active_no--;
+    n->next = cfreelist;
+    cfreelist = n;
+    NMEM_LEAVE;
+}
+
+void nmem_transfer (NMEM dst, NMEM src)
+{
+    nmem_block *t;
+    while ((t=src->blocks))
+    {
+	src->blocks = t->next;
+	t->next = dst->blocks;
+	dst->blocks = t;
+    }
+    dst->total += src->total;
+    src->total = 0;
+}
+
+void nmem_critical_enter (void)
+{
+    NMEM_ENTER;
+}
+
+void nmem_critical_leave (void)
+{
+    NMEM_LEAVE;
+}
+
+void nmem_init (void)
+{
+    nmem_init_flag = 1;
+#ifdef WIN32
+    InitializeCriticalSection(&critical_section);
+#endif
+    nmem_active_no = 0;
+    freelist = NULL;
+    cfreelist = NULL;
+}
+
+void nmem_exit (void)
+{
+    while (freelist)
+    {
+	struct nmem_block *fl = freelist;
+	freelist = freelist->next;
+	xfree (fl->buf);
+	xfree (fl);
+    }
+    while (cfreelist)
+    {
+	struct nmem_control *cfl = cfreelist;
+	cfreelist = cfreelist->next;
+	xfree (cfl);
+    }
+    nmem_init_flag = 0;
+#ifdef WIN32
+    DeleteCriticalSection(&critical_section);
+#endif
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/util/nmemsdup.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/nmemsdup.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/nmemsdup.c	(revision 21083)
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1997-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:08  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.3  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.1  1997/09/17 12:10:42  adam
+ * YAZ version 1.4.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <yaz/nmem.h>
+
+char *nmem_strdup (NMEM mem, const char *src)
+{
+    char *dst = (char *)nmem_malloc (mem, strlen(src)+1);
+    strcpy (dst, src);
+    return dst;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/oid.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/oid.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/oid.c	(revision 21083)
@@ -0,0 +1,755 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:09  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.42  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.41  2000/01/10 15:16:53  adam
+ * Added several OID's.
+ *
+ * Revision 1.40  2000/01/06 14:59:13  adam
+ * Added oid_init/oid_exit. Changed oid_exit.
+ *
+ * Revision 1.39  1999/12/16 23:36:19  adam
+ * Implemented ILL protocol. Minor updates ASN.1 compiler.
+ *
+ * Revision 1.38  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.37  1999/09/13 12:51:15  adam
+ * Added CLIENT IP OID.
+ *
+ * Revision 1.36  1999/05/27 13:02:20  adam
+ * Assigned OID for old DB Update (VAL_DBUPDATE0).
+ *
+ * Revision 1.35  1999/04/20 09:56:49  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.34  1999/04/15 09:19:43  adam
+ * Added COOKIE UserInfo OID.
+ *
+ * Revision 1.33  1999/04/09 12:16:11  adam
+ * Added OtherInfo private OID proxy.
+ *
+ * Revision 1.32  1999/02/18 10:30:46  quinn
+ * Changed ES: Update OID
+ *
+ * Revision 1.31  1998/12/03 11:33:05  adam
+ * Added OID's for XML.
+ *
+ * Revision 1.30  1998/10/18 07:48:56  adam
+ * Fixed oid_getentbyoid so that it returns NULL when parsed oid is NULL.
+ *
+ * Revision 1.29  1998/10/14 13:32:35  adam
+ * Added include of string.h.
+ *
+ * Revision 1.28  1998/10/13 16:01:53  adam
+ * Implemented support for dynamic object identifiers.
+ * Function oid_getvalbyname now accepts raw OID's as well as traditional
+ * names.
+ *
+ * Revision 1.27  1998/05/18 10:10:02  adam
+ * Added Explain-schema and Explain-tagset to OID database.
+ *
+ * Revision 1.26  1998/03/20 14:46:06  adam
+ * Added UNIverse Resource Reports.
+ *
+ * Revision 1.25  1998/02/10 15:32:03  adam
+ * Added new Object Identifiers.
+ *
+ * Revision 1.24  1997/09/29 13:19:00  adam
+ * Added function, oid_ent_to_oid, to replace the function
+ * oid_getoidbyent, which is not thread safe.
+ *
+ * Revision 1.23  1997/09/09 10:10:19  adam
+ * Another MSV5.0 port. Changed projects to include proper
+ * library/include paths.
+ * Server starts server in test-mode when no options are given.
+ *
+ * Revision 1.22  1997/08/29 13:34:58  quinn
+ * Added thesaurus oids
+ *
+ * Revision 1.21  1997/08/19 08:46:05  quinn
+ * Added Thesaurus OID
+ *
+ * Revision 1.20  1997/07/28 12:34:43  adam
+ * Added new OID entries (RVDM).
+ *
+ * Revision 1.19  1997/05/02 08:39:41  quinn
+ * Support for private OID table added. Thanks to Ronald van der Meer
+ *
+ * Revision 1.18  1997/04/30 08:52:12  quinn
+ * Null
+ *
+ * Revision 1.17  1996/10/10  12:35:23  quinn
+ * Added Update extended service.
+ *
+ * Revision 1.16  1996/10/09  15:55:02  quinn
+ * Added SearchInfoReport
+ *
+ * Revision 1.15  1996/10/07  15:29:43  quinn
+ * Added SOIF support
+ *
+ * Revision 1.14  1996/02/20  17:58:28  adam
+ * Added const to oid_getvalbyname.
+ *
+ * Revision 1.13  1996/02/20  16:37:33  quinn
+ * Using yaz_matchstr in oid_getvalbyname
+ *
+ * Revision 1.12  1996/01/02  08:57:53  quinn
+ * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
+ *
+ * Revision 1.11  1995/12/13  16:03:35  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.10  1995/11/28  09:30:44  quinn
+ * Work.
+ *
+ * Revision 1.9  1995/11/13  09:27:53  quinn
+ * Fiddling with the variant stuff.
+ *
+ * Revision 1.8  1995/10/12  10:34:56  quinn
+ * Added Espec-1.
+ *
+ * Revision 1.7  1995/10/10  16:27:12  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.6  1995/09/29  17:12:35  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/29  17:01:51  quinn
+ * More Windows work
+ *
+ * Revision 1.4  1995/09/27  15:03:03  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.3  1995/09/12  11:32:06  quinn
+ * Added a looker-upper by name.
+ *
+ * Revision 1.2  1995/08/21  09:11:16  quinn
+ * Smallish fixes to suppport new formats.
+ *
+ * Revision 1.1  1995/05/29  08:17:13  quinn
+ * iMoved oid to util to support comstack.
+ *
+ * Revision 1.5  1995/05/22  11:30:16  quinn
+ * Adding Z39.50-1992 stuff to proto.c. Adding zget.c
+ *
+ * Revision 1.4  1995/05/16  08:50:22  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.3  1995/04/11  11:52:02  quinn
+ * Fixed possible buf in proto.c
+ *
+ * Revision 1.2  1995/03/29  15:39:38  quinn
+ * Adding some resource control elements, and a null-check to getentbyoid
+ *
+ * Revision 1.1  1995/03/27  08:32:12  quinn
+ * Added OID database
+ *
+ *
+ */
+
+/*
+ * More or less protocol-transparent OID database.
+ * We could (and should?) extend this so that the user app can add new
+ * entries to the list at initialization.
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include <yaz/oid.h>
+#include <yaz/yaz-util.h>
+
+static int z3950_prefix[] = { 1, 2, 840, 10003, -1 };
+static int sr_prefix[]    = { 1, 0, 10163, -1 };
+
+struct oident_list {
+    struct oident oident;
+    struct oident_list *next;
+};
+
+static struct oident_list *oident_table = NULL;
+static int oid_value_dynamic = VAL_DYNAMIC;
+static int oid_init_flag = 0;
+
+/*
+ * OID database
+ */
+static oident oids[] =
+{
+    /* General definitions */
+    {PROTO_GENERAL, CLASS_TRANSYN, VAL_BER,          {2,1,1,-1},
+     "BER" },
+    {PROTO_GENERAL, CLASS_TRANSYN, VAL_ISO2709,      {1,0,2709,1,1,-1},
+     "ISO2709"},
+    {PROTO_GENERAL, CLASS_GENERAL, VAL_ISO_ILL_1,    {1,2,10161,2,1,-1},
+     "ISOILL-1"},
+    /* Z39.50v3 definitions */
+    {PROTO_Z3950,   CLASS_ABSYN,   VAL_APDU,         {2,1,-1},
+     "Z-APDU"},    
+    {PROTO_Z3950,   CLASS_APPCTX,  VAL_BASIC_CTX,    {1,1,-1},
+     "Z-BASIC"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_BIB1,         {3,1,-1},
+     "Bib-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_EXP1,         {3,2,-1},
+     "Exp-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_EXT1,         {3,3,-1},
+     "Ext-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_CCL1,         {3,4,-1},
+     "CCL-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_GILS,         {3,5,-1},
+     "GILS-attset"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_STAS,         {3,6,-1},
+     "STAS-attset"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_COLLECT1,     {3,7,-1},
+     "Collections-attset"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_CIMI1,        {3,8,-1},
+     "CIMI-attset"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_GEO,          {3,9,-1},
+     "Geo-attset"},
+
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_ZBIG,         {3,10,-1},
+     "ZBIG"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_UTIL,         {3,11,-1},
+     "Util"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_XD1,          {3,12,-1},
+     "XD-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_ZTHES,        {3,13,-1},
+     "Zthes"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_FIN1,         {3,14,-1},
+     "Fin-1"},
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_DAN1,         {3,15,-1},
+     "Dan-1"},
+
+    {PROTO_Z3950,   CLASS_ATTSET,  VAL_THESAURUS,    {3,1000,81,1,-1},
+     "Thesaurus-attset"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_BIB1,         {4,1,-1},
+     "Bib-1"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG1,        {4,2,-1},
+     "Diag-1"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG_ES,      {4,3,-1},
+     "Diag-ES"},
+    {PROTO_Z3950,   CLASS_DIAGSET, VAL_DIAG_GENERAL, {4,3,-1},
+     "Diag-General"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_UNIMARC,      {5,1,-1},
+     "Unimarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_INTERMARC,    {5,2,-1},
+     "Intermarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_CCF,          {5,3,-1},
+     "CCF"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_USMARC,       {5,10,-1},
+     "USmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_UKMARC,       {5,11,-1},
+     "UKmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_NORMARC,      {5,12,-1},
+     "Normarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_LIBRISMARC,   {5,13,-1},
+     "Librismarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_DANMARC,      {5,14,-1},
+     "Danmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_FINMARC,      {5,15,-1},
+     "Finmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_MAB,          {5,16,-1},
+     "MAB"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_CANMARC,      {5,17,-1},
+     "Canmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SBN,          {5,18,-1},
+     "SBN"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_PICAMARC,     {5,19,-1},
+     "Picamarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_AUSMARC,      {5,20,-1},
+     "Ausmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_IBERMARC,     {5,21,-1},
+     "Ibermarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_CATMARC,      {5,22,-1},
+     "Carmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_MALMARC,      {5,23,-1},
+     "Malmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_JPMARC,       {5,24,-1},
+     "JPmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SWEMARC,      {5,25,-1},
+     "SWEmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SIGLEMARC,    {5,26,-1},
+     "SIGLEmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_ISDSMARC,     {5,27,-1},
+     "ISDSmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_RUSMARC,      {5,28,-1},
+     "RUSmarc"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_EXPLAIN,      {5,100,-1},
+     "Explain"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SUTRS,        {5,101,-1},
+     "SUTRS"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_OPAC,         {5,102,-1},
+     "OPAC"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SUMMARY,      {5,103,-1},
+     "Summary"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_GRS0,         {5,104,-1},
+     "GRS-0"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_GRS1,         {5,105,-1},
+     "GRS-1"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_EXTENDED,     {5,106,-1},
+     "Extended"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_FRAGMENT,     {5,107,-1},
+     "Fragment"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_PDF,          {5,109,1,-1},
+     "pdf"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_POSTSCRIPT,   {5,109,2,-1},
+     "postscript"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_HTML,         {5,109,3,-1},
+     "html"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_TIFF,         {5,109,4,-1},
+     "tiff"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_GIF,          {5,109,5,-1},
+     "gif"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_JPEG,         {5,109,6,-1},
+     "jpeg"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_PNG,          {5,109,7,-1},
+     "png"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_MPEG,         {5,109,8,-1},
+     "mpeg"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SGML,         {5,109,9,-1},
+     "sgml"},
+
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_TIFFB,        {5,110,1,-1},
+     "tiff-b"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_WAV,          {5,110,2,-1},
+     "wav"},
+
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SQLRS,        {5,111,-1},
+     "SQL-RS"},
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_SOIF,         {5,1000,81,2,-1},
+     "SOIF" },
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_TEXT_XML,     {5,109,10,-1},
+     "text-XML" },
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_TEXT_XML,     {5,109,10,-1},
+     "XML" },
+    {PROTO_Z3950,   CLASS_RECSYN,  VAL_APPLICATION_XML, {5,109,11,-1},
+     "application-XML" },
+    {PROTO_Z3950,   CLASS_RESFORM, VAL_RESOURCE1,    {7,1,-1},
+     "Resource-1"},
+    {PROTO_Z3950,   CLASS_RESFORM, VAL_RESOURCE2,    {7,2,-1},
+     "Resource-2"},
+    {PROTO_Z3950,   CLASS_RESFORM, VAL_UNIVERSE_REPORT, {7,1000,81,1,-1},
+     "UNIverse-Resource-Report"},
+
+    {PROTO_Z3950,   CLASS_ACCFORM, VAL_PROMPT1,      {8,1,-1},
+     "Prompt-1"},
+    {PROTO_Z3950,   CLASS_ACCFORM, VAL_DES1,         {8,2,-1},
+     "Des-1"},
+    {PROTO_Z3950,   CLASS_ACCFORM, VAL_KRB1,         {8,3,-1},
+     "Krb-1"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_PRESSET,      {9,1,-1},
+     "Pers. set"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_PQUERY,       {9,2,-1},
+     "Pers. query"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_PCQUERY,      {9,3,-1},
+     "Per'd query"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_ITEMORDER,    {9,4,-1},
+     "Item order"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_DBUPDATE0,    {9,5,1,-1},
+     "DB. Update (old version)"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_DBUPDATE,     {9,5,1,1,-1},
+     "DB. Update"},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_EXPORTSPEC,   {9,6,-1},
+     "exp. spec."},
+    {PROTO_Z3950,   CLASS_EXTSERV, VAL_EXPORTINV,    {9,7,-1},
+     "exp. inv."},
+
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_SEARCHRES1,   {10,1,-1},
+     "searchResult-1"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_CHARLANG,     {10,2,-1},
+     "CharSetandLanguageNegotiation"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_USERINFO1,    {10,3,-1},
+     "UserInfo-1"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_MULTISRCH1,   {10,4,-1},
+     "MultipleSearchTerms-1"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_MULTISRCH2,   {10,5,-1},
+     "MultipleSearchTerms-2"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_DATETIME,     {10,6,-1},
+     "DateTime"},
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_PROXY,        {10,1000,81,1,-1},
+     "Proxy" },
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_COOKIE,       {10,1000,81,2,-1},
+     "Cookie" },
+    {PROTO_Z3950,   CLASS_USERINFO,VAL_CLIENT_IP,    {10,1000,81,3,-1},
+     "Client-IP" },
+    {PROTO_Z3950,   CLASS_ELEMSPEC,VAL_ESPEC1,       {11,1,-1},
+     "Espec-1"},
+    {PROTO_Z3950,   CLASS_VARSET,  VAL_VAR1,         {12,1,-1},
+     "Variant-1"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_WAIS,         {13,1,-1},
+     "WAIS-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_GILS,         {13,2,-1},
+     "GILS-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_COLLECT1,     {13,3,-1},
+     "Collections-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_GEO,          {13,4,-1},
+     "Geo-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_CIMI1,        {13,5,-1},
+     "CIMI-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_UPDATEES,     {13,6,-1},
+     "Update ES"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_THESAURUS,    {13,1000,81,1,-1},
+     "thesaurus-schema"},
+    {PROTO_Z3950,   CLASS_SCHEMA,  VAL_EXPLAIN,      {13,1000,81,2,-1},
+     "Explain-schema"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_SETM,         {14,1,-1},
+     "TagsetM"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_SETG,         {14,2,-1},
+     "TagsetG"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_STAS,         {14,3,-1},
+     "STAS-tagset"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_GILS,         {14,4,-1},
+     "GILS-tagset"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_COLLECT1,     {14,5,-1},
+     "Collections-tagset"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_CIMI1,        {14,6,-1},
+     "CIMI-tagset"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_THESAURUS,    {14,1000,81,1,-1},
+     "thesaurus-tagset"},
+    {PROTO_Z3950,   CLASS_TAGSET,  VAL_EXPLAIN,      {14,1000,81,2,-1},
+     "Explain-tagset"},
+    
+
+    /* SR definitions. Note that some of them aren't defined by the
+        standard (yet), but are borrowed from Z3950v3 */
+    {PROTO_SR,      CLASS_ABSYN,   VAL_APDU,      {2,1,-1},    "SR-APDU"     },
+
+    {PROTO_SR,      CLASS_APPCTX,  VAL_BASIC_CTX, {1,1,-1},    "SR-BASIC"    },
+
+    {PROTO_SR,      CLASS_ATTSET,  VAL_BIB1,      {3,1,-1},    "Bib-1"       },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_EXP1,      {3,2,-1},    "Exp-1"       },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_EXT1,      {3,3,-1},    "Ext-1"       },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_CCL1,      {3,4,-1},    "CCL-1"       },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_GILS,      {3,5,-1},    "GILS"        },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_STAS,      {3,6,-1},    "STAS",       },
+    {PROTO_SR,      CLASS_ATTSET,  VAL_COLLECT1,  {3,7,-1},    "Collections-attset"},
+    {PROTO_SR,      CLASS_ATTSET,  VAL_CIMI1,     {3,8,-1},    "CIMI-attset"},
+    {PROTO_SR,      CLASS_ATTSET,  VAL_GEO,       {3,9,-1},    "Geo-attset"},
+
+    {PROTO_SR,      CLASS_DIAGSET, VAL_BIB1,      {4,1,-1},    "Bib-1"       },
+    {PROTO_SR,      CLASS_DIAGSET, VAL_DIAG1,     {4,2,-1},    "Diag-1"      },
+
+    {PROTO_SR,      CLASS_RECSYN,  VAL_UNIMARC,   {5,1,-1},    "Unimarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_INTERMARC, {5,2,-1},    "Intermarc"   },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_CCF,       {5,3,-1},    "CCF"        },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_USMARC,    {5,10,-1},   "USmarc"      },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_UKMARC,    {5,11,-1},   "UKmarc"      },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_NORMARC,   {5,12,-1},   "Normarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_LIBRISMARC,{5,13,-1},   "Librismarc"  },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_DANMARC,   {5,14,-1},   "Danmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_FINMARC,   {5,15,-1},   "Finmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_MAB,       {5,16,-1},   "MAB"         },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_CANMARC,   {5,17,-1},   "Canmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_MAB,       {5,16,-1},   "MAB"         },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_CANMARC,   {5,17,-1},   "Canmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_SBN,       {5,18,-1},   "SBN"         },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_PICAMARC,  {5,19,-1},   "Picamarc"    },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_AUSMARC,   {5,20,-1},   "Ausmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_IBERMARC,  {5,21,-1},   "Ibermarc"    },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_CATMARC,   {5,22,-1},   "Catmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_MALMARC,   {5,23,-1},   "Malmarc"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_EXPLAIN,   {5,100,-1},  "Explain"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_SUTRS,     {5,101,-1},  "SUTRS"       },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_OPAC,      {5,102,-1},  "OPAC"        },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_SUMMARY,   {5,103,-1},  "Summary"     },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_GRS0,      {5,104,-1},  "GRS-0"       },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_GRS1,      {5,105,-1},  "GRS-1"       },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_EXTENDED,  {5,106,-1},  "Extended"    },
+    {PROTO_SR,      CLASS_RECSYN,  VAL_FRAGMENT,  {5,107,-1},  "Fragment"    },
+
+    {PROTO_SR,      CLASS_RESFORM, VAL_RESOURCE1, {7,1,-1},    "Resource-1"  },
+    {PROTO_SR,      CLASS_RESFORM, VAL_RESOURCE2, {7,2,-1},    "Resource-2"  },
+
+    {PROTO_SR,      CLASS_ACCFORM, VAL_PROMPT1,   {8,1,-1},    "Prompt-1"    },
+    {PROTO_SR,      CLASS_ACCFORM, VAL_DES1,      {8,2,-1},    "Des-1"       },
+    {PROTO_SR,      CLASS_ACCFORM, VAL_KRB1,      {8,3,-1},    "Krb-1"       },
+
+    {PROTO_SR,      CLASS_EXTSERV, VAL_PRESSET,   {9,1,-1},    "Pers. set"   },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_PQUERY,    {9,2,-1},    "Pers. query" },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_PCQUERY,   {9,3,-1},    "Per'd query" },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_ITEMORDER, {9,4,-1},    "Item order"  },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_DBUPDATE,  {9,5,-1},    "DB. Update"  },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_EXPORTSPEC,{9,6,-1},    "exp. spec."  },
+    {PROTO_SR,      CLASS_EXTSERV, VAL_EXPORTINV, {9,7,-1},    "exp. inv."   },
+
+    {PROTO_SR,      CLASS_ELEMSPEC,VAL_ESPEC1,    {11,1,-1},   "Espec-1"     },
+
+    {PROTO_SR,      CLASS_VARSET,  VAL_VAR1,      {12,1,-1},   "Variant-1"   },
+
+    {PROTO_SR,      CLASS_SCHEMA,  VAL_WAIS,      {13,1,-1},   "WAIS-schema" },
+    {PROTO_SR,      CLASS_SCHEMA,  VAL_GILS,      {13,2,-1},   "GILS-schema" },
+    {PROTO_SR,      CLASS_SCHEMA,  VAL_COLLECT1,  {13,3,-1},   "Collections-schema" },
+    {PROTO_SR,      CLASS_SCHEMA,  VAL_GEO,       {13,4,-1},   "Geo-schema" },
+    {PROTO_SR,      CLASS_SCHEMA,  VAL_CIMI1,     {13,5,-1},   "CIMI-schema" },
+
+    {PROTO_SR,      CLASS_TAGSET,  VAL_SETM,      {14,1,-1},   "TagsetM"     },
+    {PROTO_SR,      CLASS_TAGSET,  VAL_SETG,      {14,2,-1},   "TagsetG"     },
+
+    {PROTO_SR,      CLASS_TAGSET,  VAL_STAS,      {14,3,-1},   "STAS-tagset" },
+    {PROTO_SR,      CLASS_TAGSET,  VAL_GILS,      {14,4,-1},   "GILS-tagset" },
+    {PROTO_SR,      CLASS_TAGSET,  VAL_COLLECT1,  {14,5,-1},   "Collections-tagset"},
+    {PROTO_SR,      CLASS_TAGSET,  VAL_CIMI1,     {14,6,-1},   "CIMI-tagset" },
+
+    {PROTO_NOP,     CLASS_NOP,     VAL_NOP,       {-1},        0          }
+};
+
+/* OID utilities */
+
+void oid_oidcpy(int *t, int *s)
+{
+    while ((*(t++) = *(s++)) > -1);
+}
+
+void oid_oidcat(int *t, int *s)
+{
+    while (*t > -1)
+        t++;
+    while ((*(t++) = *(s++)) > -1);
+}
+
+int oid_oidcmp(int *o1, int *o2)
+{
+    while (*o1 == *o2 && *o1 > -1)
+    {
+        o1++;
+        o2++;
+    }
+    if (*o1 == *o2)
+        return 0;
+    else if (*o1 > *o2)
+        return 1;
+    else
+        return -1;
+}
+
+int oid_oidlen(int *o)
+{
+    int len = 0;
+
+    while (*(o++) >= 0)
+        len++;
+    return len;
+}
+
+
+static int match_prefix(int *look, int *prefix)
+{
+    int len;
+
+    for (len = 0; *look == *prefix; look++, prefix++, len++);
+    if (*prefix < 0) /* did we reach the end of the prefix? */
+        return len;
+    return 0;
+}
+
+void oid_transfer (struct oident *oident)
+{
+    while (*oident->oidsuffix >= 0)
+    {
+	oid_addent (oident->oidsuffix, oident->proto,
+		    oident->oclass,
+		    oident->desc, oident->value);
+	oident++;
+    }
+}
+
+void oid_init (void)
+{
+    if (oid_init_flag)
+	return;
+    /* oid_transfer is thread safe, so there's nothing wrong in having
+       two threads calling it simultaniously. On the other hand
+       no thread may exit oid_init before all OID's bave been
+       transferred - which is why checked is set after oid_transfer... 
+    */
+    oid_transfer (oids);
+    oid_init_flag = 1;
+}
+
+void oid_exit (void)
+{
+    while (oident_table)
+    {
+	struct oident_list *this_p = oident_table;
+	oident_table = oident_table->next;
+
+	xfree (this_p->oident.desc);
+	xfree (this_p);
+    }
+    oid_init_flag = 0;
+}
+
+static struct oident *oid_getentbyoid_x(int *o)
+{
+    enum oid_proto proto;
+    int prelen;
+    struct oident_list *ol;
+    
+    /* determine protocol type */
+    if ((prelen = match_prefix(o, z3950_prefix)) != 0)
+        proto = PROTO_Z3950;
+    else if ((prelen = match_prefix(o, sr_prefix)) != 0)
+        proto = PROTO_SR;
+    else
+        proto = PROTO_GENERAL;
+    for (ol = oident_table; ol; ol = ol->next)
+    {
+	struct oident *p = &ol->oident;
+        if (p->proto == proto && !oid_oidcmp(o + prelen, p->oidsuffix))
+            return p;
+	if (p->proto == PROTO_GENERAL && !oid_oidcmp (o, p->oidsuffix))
+	    return p;
+    }
+    return 0;
+}
+
+/*
+ * To query, fill out proto, class, and value of the ent parameter.
+ */
+int *oid_ent_to_oid(struct oident *ent, int *ret)
+{
+    struct oident_list *ol;
+    
+    oid_init ();
+    for (ol = oident_table; ol; ol = ol->next)
+    {
+	struct oident *p = &ol->oident;
+	if ((ent->proto == p->proto || p->proto == PROTO_GENERAL) &&
+	    (ent->oclass == p->oclass || p->oclass == CLASS_GENERAL) &&
+	    ent->value == p->value)
+	{
+	    if (p->proto == PROTO_Z3950)
+		oid_oidcpy(ret, z3950_prefix);
+	    else if (p->proto == PROTO_SR)
+		oid_oidcpy(ret, sr_prefix);
+	    else
+		ret[0] = -1;
+	    oid_oidcat(ret, p->oidsuffix);
+	    ent->desc = p->desc;
+	    return ret;
+	}
+    }
+    ret[0] = -1;
+    return 0;
+}
+
+/*
+ * To query, fill out proto, class, and value of the ent parameter.
+ */
+int *oid_getoidbyent(struct oident *ent)
+{
+    static int ret[OID_SIZE];
+
+    return oid_ent_to_oid (ent, ret);
+}
+
+struct oident *oid_addent (int *oid, enum oid_proto proto,
+			   enum oid_class oclass,
+			   const char *desc, int value)
+{
+    struct oident *oident;
+
+    nmem_critical_enter ();
+    oident = oid_getentbyoid_x (oid);
+    if (!oident)
+    {
+	char desc_str[200];
+	struct oident_list *oident_list;
+	oident_list = (struct oident_list *) xmalloc (sizeof(*oident_list));
+	oident = &oident_list->oident;
+	oident->proto = proto;
+	oident->oclass = oclass;
+
+	if (!desc)
+	{
+	    int i;
+
+	    sprintf (desc_str, "%d", *oid);
+	    for (i = 1; oid[i] >= 0; i++)
+		sprintf (desc_str+strlen(desc_str), ".%d", oid[i]);
+	    desc = desc_str;
+	}
+	oident->desc = (char *) xmalloc (strlen(desc)+1);
+	strcpy (oident->desc, desc);
+	if (value == VAL_DYNAMIC)
+	    oident->value = (enum oid_value) (++oid_value_dynamic);
+	else
+	    oident->value = (enum oid_value) value;
+	oid_oidcpy (oident->oidsuffix, oid);
+	oident_list->next = oident_table;
+	oident_table = oident_list;
+    }
+    nmem_critical_leave ();
+    return oident;
+}
+
+struct oident *oid_getentbyoid(int *oid)
+{
+    struct oident *oident;
+
+    if (!oid)
+	return 0;
+    oid_init ();
+    oident = oid_getentbyoid_x (oid);
+    if (!oident)
+	oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL,
+			     NULL, VAL_DYNAMIC);
+    return oident;
+}
+
+static oid_value oid_getval_raw(const char *name)
+{
+    int val = 0, i = 0, oid[OID_SIZE];
+    struct oident *oident;
+    
+    while (isdigit (*name))
+    {
+        val = val*10 + (*name - '0');
+        name++;
+        if (*name == '.')
+        {
+            if (i < OID_SIZE-1)
+                oid[i++] = val;
+	    val = 0;
+            name++;
+        }
+    }
+    oid[i] = val;
+    oid[i+1] = -1;
+    oident = oid_addent (oid, PROTO_GENERAL, CLASS_GENERAL, NULL,
+			 VAL_DYNAMIC);
+    return oident->value;
+}
+
+oid_value oid_getvalbyname(const char *name)
+{
+    struct oident_list *ol;
+
+    oid_init ();
+    if (isdigit (*name))
+        return oid_getval_raw (name);
+    for (ol = oident_table; ol; ol = ol->next)
+	if (!yaz_matchstr(ol->oident.desc, name))
+	{
+	    return ol->oident.value;
+	}
+    return VAL_NONE;
+}
+
+void oid_setprivateoids(oident *list)
+{
+    oid_transfer (list);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/options.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/options.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/options.c	(revision 21083)
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1995-2000, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:09  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.8  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.7  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.6  1997/09/01 08:54:13  adam
+ * New windows NT/95 port using MSV5.0. Made prefix query handling
+ * thread safe. The function options ignores empty arguments when met.
+ *
+ * Revision 1.5  1995/12/06 13:00:19  adam
+ * Minus alone not treated as an option.
+ *
+ * Revision 1.4  1995/09/29  17:12:35  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:03:03  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:51:13  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/27  08:35:18  quinn
+ * Created util library
+ * Added memory debugging module. Imported options-manager
+ *
+ * Revision 1.2  1994/10/04  17:47:10  adam
+ * Function options now returns arg with error option.
+ *
+ * Revision 1.1  1994/08/16  15:57:22  adam
+ * The first utility modules.
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+
+#include <yaz/options.h>
+
+static int arg_no = 1;
+static int arg_off = 0;
+
+int options (const char *desc, char **argv, int argc, char **arg)
+{
+    int ch, i = 0;
+    
+    if (arg_no >= argc)
+        return -2;
+    if (arg_off == 0)
+    {
+        while (argv[arg_no][0] == '\0')
+        {
+            arg_no++;
+            if (arg_no >= argc)
+                return -2;
+        }
+        if (argv[arg_no][0] != '-' || argv[arg_no][1] == '\0')
+        {
+            *arg = argv[arg_no++];
+            return 0;
+        }
+        arg_off++;
+    }
+    ch = argv[arg_no][arg_off++];
+    while (desc[i])
+    {
+        int desc_char = desc[i++];
+        int type = 0;
+        if (desc[i] == ':')
+	{	/* string argument */
+            type = desc[i++];
+	}
+        if (desc_char == ch)
+	{ /* option with argument */
+            if (type)
+	    {
+                if (argv[arg_no][arg_off])
+		{
+                    *arg = argv[arg_no]+arg_off;
+                    arg_no++;
+                    arg_off =  0;
+		}
+                else
+		{
+                    arg_no++;
+                    arg_off = 0;
+                    if (arg_no < argc)
+                        *arg = argv[arg_no++];
+                    else
+                        *arg = "";
+		}
+	    }
+            else /* option with no argument */
+	    {
+                if (argv[arg_no][arg_off])
+                    arg_off++;
+                else
+		{
+                    arg_off = 0;
+                    arg_no++;
+		}
+	    }
+            return ch;
+	}		
+    }
+    *arg = argv[arg_no]+arg_off-1;
+    arg_no = arg_no + 1;
+    arg_off = 0;
+    return -1;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/readconf.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/readconf.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/readconf.c	(revision 21083)
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 1994-2000, Index Data
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:10  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.10  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.9  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.8  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.7  1999/06/30 09:10:32  adam
+ * Fixed reading of MS-DOS files.
+ *
+ * Revision 1.6  1998/10/13 16:09:55  adam
+ * Added support for arbitrary OID's for tagsets, schemas and attribute sets.
+ * Added support for multiple attribute set references and tagset references
+ * from an abstract syntax file.
+ * Fixed many bad logs-calls in routines that read the various
+ * specifications regarding data1 (*.abs,*.att,...) and made the messages
+ * consistent whenever possible.
+ * Added extra 'lineno' argument to function readconf_line.
+ *
+ * Revision 1.5  1997/09/04 07:53:02  adam
+ * Added include readconf.h.
+ *
+ * Revision 1.4  1997/05/14 06:54:07  adam
+ * C++ support.
+ *
+ * Revision 1.3  1996/05/29 15:48:48  quinn
+ * Added \n to the isspace rule.
+ *
+ * Revision 1.2  1996/05/29  10:05:01  quinn
+ * Changed space criteria to support 8-bit characters
+ *
+ * Revision 1.1  1995/11/01  13:55:06  quinn
+ * Minor adjustments
+ *
+ * Revision 1.2  1995/10/30  13:54:27  quinn
+ * iRemoved fclose().
+ *
+ * Revision 1.1  1995/10/10  16:28:18  quinn
+ * Initial revision
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+
+#include <yaz/log.h>
+#include <yaz/readconf.h>
+
+#define l_isspace(c) ((c) == '\t' || (c) == ' ' || (c) == '\n' || (c) == '\r')
+
+int readconf_line(FILE *f, int *lineno, char *line, int len,
+		  char *argv[], int num)
+{
+    char *p;
+    int argc;
+    
+    while ((p = fgets(line, len, f)))
+    {
+	(*lineno)++;
+	while (*p && l_isspace(*p))
+	    p++;
+	if (*p && *p != '#')
+	    break;
+    }
+    if (!p)
+	return 0;
+    
+    for (argc = 0; *p ; argc++)
+    {
+	if (*p == '#')  /* trailing comment */
+	    break;
+	argv[argc] = p;
+	while (*p && !l_isspace(*p))
+	    p++;
+	if (*p)
+	{
+	    *(p++) = '\0';
+	    while (*p && l_isspace(*p))
+		p++;
+	}
+    }
+    return argc;
+}
+
+/*
+ * Read lines of a configuration file.
+ */
+int readconf(char *name, void *rprivate,
+	     int (*fun)(char *name, void *rprivate, int argc, char *argv[]))
+{
+    FILE *f;
+    char line[512], *m_argv[50];
+    int m_argc;
+    int lineno = 0;
+    
+    if (!(f = fopen(name, "r")))
+    {
+	yaz_log(LOG_WARN|LOG_ERRNO, "readconf: %s", name);
+	return -1;
+    }
+    for (;;)
+    {
+	int res;
+	
+	if (!(m_argc = readconf_line(f, &lineno, line, 512, m_argv, 50)))
+	{
+	    fclose(f);
+	    return 0;
+	}
+
+	if ((res = (*fun)(name, rprivate, m_argc, m_argv)))
+	{
+	    fclose(f);
+	    return res;
+	}
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/tpath.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/tpath.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/tpath.c	(revision 21083)
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:10  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.3  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1996/10/29 13:36:26  adam
+ * Added header.
+ *
+ * Revision 1.1  1995/11/01 16:35:00  quinn
+ * Making data1 look for tables in data1_tabpath
+ *
+ *
+ */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <yaz/tpath.h>
+
+FILE *yaz_path_fopen(const char *path, const char *name, const char *mode)
+{
+    char spath[512] = "";
+
+    if (!path)
+	return fopen(name, mode);
+
+    do
+    {
+	FILE *f;
+
+	if (sscanf(path, "%511[^:]", spath) < 1)
+	    return 0;
+	sprintf(spath + strlen(spath), "/%s", name);
+	if ((f = fopen(spath, mode)))
+	    return f;
+	if ((path = strchr(path, ':')))
+	    path++;
+    }
+    while (path);
+    return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/wrbuf.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/wrbuf.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/wrbuf.c	(revision 21083)
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 1995-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:11  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.9  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.8  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.7  1999/11/03 09:05:56  adam
+ * Implemented wrbuf_puts.
+ *
+ * Revision 1.6  1999/10/28 11:36:40  adam
+ * wrbuf_write allows zero buffer length.
+ *
+ * Revision 1.5  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.4  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.3  1997/05/01 15:08:15  adam
+ * Added log_mask_str_x routine.
+ *
+ * Revision 1.2  1995/11/01 13:55:06  quinn
+ * Minor adjustments
+ *
+ * Revision 1.1  1995/10/06  08:51:25  quinn
+ * Added Write-buffer.
+ *
+ *
+ */
+
+/*
+ * Growing buffer for writing various stuff.
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/wrbuf.h>
+
+WRBUF wrbuf_alloc(void)
+{
+    WRBUF n;
+
+    if (!(n = (WRBUF)xmalloc(sizeof(*n))))
+	abort();
+    n->buf = 0;
+    n->size = 0;
+    n->pos = 0;
+    return n;
+}
+
+void wrbuf_free(WRBUF b, int free_buf)
+{
+    if (free_buf && b->buf)
+	xfree(b->buf);
+    xfree(b);
+}
+
+void wrbuf_rewind(WRBUF b)
+{
+    b->pos = 0;
+}
+
+int wrbuf_grow(WRBUF b, int minsize)
+{
+    int togrow;
+
+    if (!b->size)
+    	togrow = 1024;
+    else
+    	togrow = b->size;
+    if (togrow < minsize)
+    	togrow = minsize;
+    if (b->size && !(b->buf =(char *)xrealloc(b->buf, b->size += togrow)))
+    	abort();
+    else if (!b->size && !(b->buf = (char *)xmalloc(b->size = togrow)))
+    	abort();
+    return 0;
+}
+
+int wrbuf_write(WRBUF b, const char *buf, int size)
+{
+    if (size <= 0)
+        return 0;
+    if (b->pos + size >= b->size)
+	wrbuf_grow(b, size);
+    memcpy(b->buf + b->pos, buf, size);
+    b->pos += size;
+    return 0;
+}
+
+int wrbuf_puts(WRBUF b, const char *buf)
+{
+    wrbuf_write(b, buf, strlen(buf)+1);  /* '\0'-terminate as well */
+    (b->pos)--;                          /* don't include '\0' in count */
+    return 0;
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/xmalloc.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/xmalloc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/xmalloc.c	(revision 21083)
@@ -0,0 +1,331 @@
+/*
+ * Copyright (C) 1994-2000, Index Data
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:11  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.11  2000/02/29 13:44:55  adam
+ * Check for config.h (currently not generated).
+ *
+ * Revision 1.10  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.9  1999/09/10 08:58:32  adam
+ * Set TRACE_XMALLOC to 1.
+ *
+ * Revision 1.8  1999/08/27 09:40:32  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.7  1999/07/13 13:24:53  adam
+ * Updated memory debugging memory allocatation routines.
+ *
+ * Revision 1.6  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.5  1997/10/31 12:20:09  adam
+ * Improved memory debugging for xmalloc/nmem.c. References to NMEM
+ * instead of ODR in n ESPEC-1 handling in source d1_espec.c.
+ * Bug fix: missing fclose in data1_read_espec1.
+ *
+ * Revision 1.4  1996/07/03 13:21:36  adam
+ * Function xfree_f checks for NULL pointer.
+ *
+ * Revision 1.3  1995/12/05  15:08:44  adam
+ * Fixed verbose of xrealloc.
+ *
+ * Revision 1.2  1995/12/05  11:08:37  adam
+ * More verbose malloc routines.
+ *
+ * Revision 1.1  1995/11/01  11:56:53  quinn
+ * Added Xmalloc.
+ *
+ * Revision 1.6  1995/10/16  14:03:11  quinn
+ * Changes to support element set names and espec1
+ *
+ * Revision 1.5  1995/09/04  12:34:06  adam
+ * Various cleanup. YAZ util used instead.
+ *
+ * Revision 1.4  1994/10/05  10:16:16  quinn
+ * Added xrealloc. Fixed bug in log.
+ *
+ * Revision 1.3  1994/09/26  16:31:37  adam
+ * Added xcalloc_f.
+ *
+ * Revision 1.2  1994/08/18  08:23:26  adam
+ * Res.c now use handles. xmalloc defines xstrdup.
+ *
+ * Revision 1.1  1994/08/17  13:37:54  adam
+ * xmalloc.c added to util.
+ *
+ */
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/log.h>
+#include <yaz/xmalloc.h>
+
+#define TRACE_XMALLOC 1
+
+#if TRACE_XMALLOC > 1
+
+static const unsigned char head[] = {44, 33, 22, 11};
+static const unsigned char tail[] = {11, 22, 33, 44};
+static const unsigned char freed[] = {11, 22, 33, 44};
+
+struct dmalloc_info {
+    int len;
+    char file[16];
+    int line;
+    struct dmalloc_info *next;
+    struct dmalloc_info *prev;
+};
+
+struct dmalloc_info *dmalloc_list = 0;
+
+void *xmalloc_d(size_t nbytes, const char *file, int line)
+{
+    char *res;
+    struct dmalloc_info *dinfo;
+    
+    if (!(res = (char*) malloc(nbytes + sizeof(*dinfo)+8*sizeof(char))))
+	return 0;
+    dinfo = (struct dmalloc_info *) res;
+    strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+    dinfo->file[sizeof(dinfo->file)-1] = '\0';
+    dinfo->line = line;
+    dinfo->len = nbytes;
+    
+    dinfo->prev = 0;
+    dinfo->next = dmalloc_list;
+    if (dinfo->next)
+	dinfo->next->prev = dinfo;
+    dmalloc_list = dinfo;
+    
+    memcpy(res + sizeof(*dinfo), head, 4*sizeof(char));
+    res += sizeof(*dinfo) + 4*sizeof(char);
+    memcpy(res + nbytes, tail, 4*sizeof(char));
+    return res;
+}
+
+void xfree_d(void *ptr, const char *file, int line)
+{
+    struct dmalloc_info *dinfo;
+
+    if (!ptr)
+	return;
+    dinfo = (struct dmalloc_info *)
+	((char*)ptr - 4*sizeof(char) - sizeof(*dinfo));
+    if (memcmp(head, (char*) ptr - 4*sizeof(char), 4*sizeof(char)))
+    {
+	yaz_log(LOG_FATAL, "xfree_d bad head, %s:%d, %p", file, line, ptr);
+        abort();
+    }
+    if (memcmp((char*) ptr + dinfo->len, tail, 4*sizeof(char)))
+    {
+	yaz_log(LOG_FATAL, "xfree_d bad tail, %s:%d, %p", file, line, ptr);
+        abort();
+    }
+    if (dinfo->prev)
+	dinfo->prev->next = dinfo->next;
+    else
+	dmalloc_list = dinfo->next;
+    if (dinfo->next)
+	dinfo->next->prev = dinfo->prev;
+    memcpy ((char*) ptr - 4*sizeof(char), freed, 4*sizeof(char));
+    free(dinfo);
+    return;
+}
+
+void *xrealloc_d(void *p, size_t nbytes, const char *file, int line)
+{
+    struct dmalloc_info *dinfo;
+    char *ptr = (char*) p;
+    char *res;
+    
+    if (!ptr)
+    {
+	if (!nbytes)
+	    return 0;
+	res = (char *) malloc(nbytes + sizeof(*dinfo) + 8*sizeof(char));
+    }
+    else
+    {
+	if (memcmp(head, ptr - 4*sizeof(char), 4*sizeof(char)))
+	{
+	    yaz_log(LOG_FATAL, "xrealloc_d bad head, %s:%d, %p",
+		    file, line, ptr);
+	    abort();
+	}
+	dinfo = (struct dmalloc_info *) (ptr-4*sizeof(char) - sizeof(*dinfo));
+	if (memcmp(ptr + dinfo->len, tail, 4*sizeof(char)))
+	{
+	    yaz_log(LOG_FATAL, "xrealloc_d bad tail, %s:%d, %p",
+		    file, line, ptr);
+	    abort();
+	}
+	if (dinfo->prev)
+	    dinfo->prev->next = dinfo->next;
+	else
+	    dmalloc_list = dinfo->next;
+	if (dinfo->next)
+	    dinfo->next->prev = dinfo->prev;
+	
+	if (!nbytes)
+	{
+	    free (dinfo);
+	    return 0;
+	}
+	res = (char *)
+	    realloc(dinfo, nbytes + sizeof(*dinfo) + 8*sizeof(char));
+    }
+    if (!res)
+	return 0;
+    dinfo = (struct dmalloc_info *) res;
+    strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+    dinfo->file[sizeof(dinfo->file)-1] = '\0';
+    dinfo->line = line;
+    dinfo->len = nbytes;
+
+    dinfo->prev = 0;
+    dinfo->next = dmalloc_list;
+    if (dmalloc_list)
+	dmalloc_list->prev = dinfo;
+    dmalloc_list = dinfo;
+    
+    memcpy(res + sizeof(*dinfo), head, 4*sizeof(char));
+    res += sizeof(*dinfo) + 4*sizeof(char);
+    memcpy(res + nbytes, tail, 4*sizeof(char));
+    return res;
+}
+
+void *xcalloc_d(size_t nmemb, size_t size, const char *file, int line)
+{
+    char *res;
+    struct dmalloc_info *dinfo;
+    size_t nbytes = nmemb * size;
+    
+    if (!(res = (char*) calloc(1, nbytes+sizeof(*dinfo)+8*sizeof(char))))
+	return 0;
+    dinfo = (struct dmalloc_info *) res;
+    strncpy (dinfo->file, file, sizeof(dinfo->file)-1);
+    dinfo->file[sizeof(dinfo->file)-1] = '\0';
+    dinfo->line = line;
+    dinfo->len = nbytes;
+    
+    dinfo->prev = 0;
+    dinfo->next = dmalloc_list;
+    if (dinfo->next)
+	dinfo->next->prev = dinfo;
+    dmalloc_list = dinfo;
+    
+    memcpy(res + sizeof(*dinfo), head, 4*sizeof(char));
+    res += sizeof(*dinfo) + 4*sizeof(char);
+    memcpy(res + nbytes, tail, 4*sizeof(char));
+    return res;
+}
+
+void xmalloc_trav_d(const char *file, int line)
+{
+    size_t size = 0;
+    struct dmalloc_info *dinfo = dmalloc_list;
+    
+    yaz_log (LOG_LOG, "malloc_trav %s:%d", file, line);
+    while (dinfo)
+    {
+	yaz_log (LOG_LOG, " %20s:%d p=%p size=%d", dinfo->file, dinfo->line,
+	      dinfo+sizeof(*dinfo)+4*sizeof(char), dinfo->len);
+	size += dinfo->len;
+	dinfo = dinfo->next;
+    }
+    yaz_log (LOG_LOG, "total bytes %ld", (long) size);
+}
+
+#else
+/* TRACE_XMALLOC <= 1 */
+#define xrealloc_d(o, x, f, l) realloc(o, x)
+#define xmalloc_d(x, f, l) malloc(x)
+#define xcalloc_d(x,y, f, l) calloc(x,y)
+#define xfree_d(x, f, l) free(x)
+#define xmalloc_trav_d(f, l) 
+#endif
+
+void xmalloc_trav_f(const char *s, const char *file, int line)
+{
+    xmalloc_trav_d(file, line);
+}
+
+void *xrealloc_f (void *o, size_t size, const char *file, int line)
+{
+    void *p = xrealloc_d (o, size, file, line);
+
+#if TRACE_XMALLOC
+    yaz_log (LOG_DEBUG,
+            "%s:%d: xrealloc(s=%d) %p -> %p", file, line, size, o, p);
+#endif
+    if (!p)
+    {
+    	yaz_log (LOG_FATAL|LOG_ERRNO, "Out of memory, realloc (%d bytes)",
+		 size);
+    	exit(1);
+    }
+    return p;
+}
+
+void *xmalloc_f (size_t size, const char *file, int line)
+{
+    void *p = xmalloc_d (size, file, line);
+    
+#if TRACE_XMALLOC
+    yaz_log (LOG_DEBUG, "%s:%d: xmalloc(s=%d) %p", file, line, size, p);
+#endif
+    if (!p)
+    {
+        yaz_log (LOG_FATAL, "Out of memory - malloc (%d bytes)", size);
+        exit (1);
+    }
+    return p;
+}
+
+void *xcalloc_f (size_t nmemb, size_t size, const char *file, int line)
+{
+    void *p = xcalloc_d (nmemb, size, file, line);
+#if TRACE_XMALLOC
+    yaz_log (LOG_DEBUG, "%s:%d: xcalloc(s=%d) %p", file, line, size, p);
+#endif
+    if (!p)
+    {
+        yaz_log (LOG_FATAL, "Out of memory - calloc (%d, %d)", nmemb, size);
+        exit (1);
+    }
+    return p;
+}
+
+char *xstrdup_f (const char *s, const char *file, int line)
+{
+    char *p = (char *)xmalloc_d (strlen(s)+1, file, line);
+#if TRACE_XMALLOC
+    yaz_log (LOG_DEBUG, "%s:%d: xstrdup(s=%d) %p", file, line, strlen(s)+1, p);
+#endif
+    strcpy (p, s);
+    return p;
+}
+
+void xfree_f(void *p, const char *file, int line)
+{
+    if (!p)
+        return ;
+#if TRACE_XMALLOC
+    if (p)
+        yaz_log (LOG_DEBUG, "%s:%d: xfree %p", file, line, p);
+#endif
+    xfree_d(p, file, line);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/util/yaz-comp
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/util/yaz-comp	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/util/yaz-comp	(revision 21083)
@@ -0,0 +1,1441 @@
+#!/bin/sh
+
+# we don't need this (jrm21)
+exit 0
+# the next line restarts using tclsh \
+exec tclsh "$0" "$@"
+
+#
+# yaz-comp: ASN.1 Compiler for YAZ
+# (c) Index Data 1996-2000
+# See the file LICENSE for details.
+#
+# Revision 1.1  2000/03/02 08:48:20  adam
+# Renamed ASN.1 compiler to yaz-comp (used to be yc.tcl).
+#
+# Revision 1.6  2000/02/10 13:44:02  adam
+# Tcl command clock not used if unavailable (Tcl7.4 and earlier).
+#
+# Revision 1.5  2000/01/15 09:18:42  adam
+# Bug fix: some elements where treated as OPTIONAL when they shouldn't.
+#
+# Revision 1.4  1999/12/16 23:36:19  adam
+# Implemented ILL protocol. Minor updates ASN.1 compiler.
+#
+# Revision 1.3  1999/11/30 13:47:12  adam
+# Improved installation. Moved header files to include/yaz.
+#
+# Revision 1.2  1999/06/09 09:43:11  adam
+# Added option -I and variable h-path to specify path for header files.
+#
+# Revision 1.1  1999/06/08 10:10:16  adam
+# New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+#
+# Revision 1.8  1999/04/20 10:37:04  adam
+# Updated for ODR - added name parameter.
+#
+# Revision 1.7  1998/04/03 14:44:20  adam
+# Small fix.
+#
+# Revision 1.6  1998/04/03 13:21:17  adam
+# Yet another fix.
+#
+# Revision 1.5  1998/04/03 12:48:17  adam
+# Fixed bug: missed handling of constructed tags for CHOICE.
+#
+# Revision 1.4  1998/03/31 15:47:45  adam
+# First compiled ASN.1 code for YAZ.
+#
+# Revision 1.3  1998/03/23 17:13:20  adam
+# Implemented SET OF and ENUM. The Compiler now eats ILL (ISO10161) and
+# LDAP (RFC1777).
+#
+# Revision 1.2  1997/10/07 10:31:01  adam
+# Added facility to specify tag type (CONTEXT, APPLICATION, ...).
+#
+# Revision 1.1.1.1  1996/10/31 14:04:40  adam
+# First version of the compiler for YAZ.
+#
+#
+
+set yc_version 0.3
+
+# Syntax for the ASN.1 supported:
+# file   -> file module
+#         | module
+# module -> name skip DEFINITIONS ::= mbody END
+# mbody  -> EXPORTS { nlist }
+#         | IMPORTS { imlist }
+#         | name ::= tmt
+#         | skip
+# tmt    -> tag mod type
+# type   -> SEQUENCE { sqlist }
+#         | SEQUENCE OF type
+#         | CHOICE { chlist }
+#         | basic enlist
+#
+# basic  -> INTEGER
+#         | BOOLEAN
+#         | OCTET STRING
+#         | BIT STRING
+#         | EXTERNAL
+#         | name
+# sqlist -> sqlist , name tmt opt
+#         | name tmt opt
+# chlist -> chlist , name tmt 
+#         | name tmt 
+# enlist -> enlist , name (n)
+#         | name (n)
+# imlist -> nlist FROM name
+#           imlist nlist FROM name
+# nlist  -> name
+#         | nlist , name
+# mod   -> IMPLICIT | EXPLICIT | e
+# tag   -> [tagtype n] | [n] | e
+# opt   -> OPTIONAL | e
+#
+# name    identifier/token 
+# e       epsilon/empty 
+# skip    one token skipped
+# n       number
+# tagtype APPLICATION, CONTEXT, etc.
+
+# lex: moves input file pointer and returns type of token.
+# The globals $type and $val are set. $val holds name if token
+# is normal identifier name.
+# sets global var type to one of:
+#     {}     eof-of-file
+#     \{     left curly brace 
+#     \}     right curly brace
+#     ,      comma
+#     ;      semicolon
+#     (      (n)
+#     [      [n]
+#     :      ::=
+#     n      other token n
+proc lex {} {
+    global inf val type
+    while {![string length $inf(str)]} {
+        incr inf(lineno)
+        set inf(cnt) [gets $inf(inf) inf(str)]
+        if {$inf(cnt) < 0} {
+            set type {}
+            return {}
+        }
+	lappend inf(asn,$inf(asndef)) $inf(str)
+        set l [string first -- $inf(str)]
+        if {$l >= 0} {
+            incr l -1
+            set inf(str) [string range $inf(str) 0 $l]
+        }
+        set inf(str) [string trim $inf(str)]
+    }
+    set s [string index $inf(str) 0]
+    set type $s
+    set val {}
+    switch -- $s {
+        \{ { }
+        \} { }
+        ,  { }
+        ;  { }
+	\(  { }
+	\)  { }
+        \[ { regexp {^\[[ ]*(.+)[ ]*\]} $inf(str) s val }
+        :  { regexp {^::=} $inf(str) s }
+        default {
+             regexp "^\[^,\t :\{\}();\]+" $inf(str) s
+             set type n
+             set val $s
+           }
+    }
+    set off [string length $s]
+    set inf(str) [string trim [string range $inf(str) $off end]]
+    return $type
+}
+
+# lex-expect: move pointer and expect token $t
+proc lex-expect {t} {
+    global type val
+    lex
+    if {[string compare $t $type]} {
+        asnError "Got $type '$val', expected $t"
+    }
+}
+
+# lex-name-move: see if token is $name; moves pointer and returns
+# 1 if it is; returns 0 otherwise.
+proc lex-name-move {name} {
+    global type val
+    if {![string compare $type n] && ![string compare $val $name]} {
+        lex
+        return 1
+    }
+    return 0
+}
+
+# asnError: Report error and die
+proc asnError {msg} {
+    global inf
+   
+    puts "Error in line $inf(lineno) in module $inf(module)"
+    puts " $msg"
+    error
+    exit 1
+}
+
+# asnWarning: Report warning and return
+proc asnWarning {msg} {
+    global inf
+   
+    puts "Warning in line $inf(lineno) in module $inf(module)"
+    puts " $msg"
+}
+
+# asnEnum: parses enumerated list - { name1 (n), name2 (n), ... }
+# Uses $name as prefix. If there really is a list, $lx holds the C
+# preprocessor definitions on return; otherwise lx isn't set.
+proc asnEnum {name lx} {
+    global type val inf
+
+    if {[string compare $type \{]} return
+    upvar $lx l
+    while {1} {
+	set pq [asnName $name]
+        set id [lindex $pq 0]
+	set id ${name}_$id
+	lex-expect n
+        lappend l "#define $inf(dprefix)$id $val"
+	lex-expect ")"
+        lex
+        if {[string compare $type ,]} break
+    }
+    if {[string compare $type \}]} {
+        asnError "Missing \} in enum list got $type '$val'"
+    }
+    lex
+}
+
+# asnMod: parses tag and modifier.
+# $xtag and $ximplicit holds tag and implicit-indication on return.
+# $xtag is empty if no tag was specified. $ximplicit is 1 on implicit
+# tagging; 0 otherwise.
+proc asnMod {xtag ximplicit xtagtype} {
+    global type val inf
+
+    upvar $xtag tag
+    upvar $ximplicit implicit
+    upvar $xtagtype tagtype
+
+    set tag {} 
+    set tagtype {}
+    if {![string compare $type \[]} {
+        if {[regexp {^([a-zA-Z]+)[ ]+([0-9]+)$} $val x tagtype tag]} {
+            set tagtype ODR_$tagtype 
+        } elseif {[regexp {^([0-9]+)$} $val x tag]} {
+            set tagtype ODR_CONTEXT
+        } else {
+            asnError "bad tag specification: $val"
+        }
+	lex
+    }
+    set implicit $inf(implicit-tags)
+    if {![string compare $type n]} {
+        if {![string compare $val EXPLICIT]} {
+            lex
+            set implicit 0
+        } elseif {![string compare $val IMPLICIT]} {
+            lex
+            set implicit 1
+        }
+    }
+}
+
+# asnName: moves pointer and expects name. Returns C-validated name.
+proc asnName {name} {
+    global val inf
+    lex-expect n
+    if {[info exists inf(membermap,$inf(module),$name,$val)]} {
+	    set nval $inf(membermap,$inf(module),$name,$val)
+	if {$inf(verbose)} {
+	    puts " mapping member $name,$val to $nval"
+	}
+	lex
+    } else {
+	set nval $val
+	if {![string match {[A-Z]*} $val]} {
+	    lex
+	}
+    }
+    return [join [split $nval -] _]
+}
+
+# asnOptional: parses optional modifier. Returns 1 if OPTIONAL was 
+# specified; 0 otherwise.
+proc asnOptional {} {
+    global type val
+    if {[lex-name-move OPTIONAL]} {
+        return 1
+    } elseif {[lex-name-move DEFAULT]} {
+	lex
+	return 0
+    }
+    return 0
+}
+
+# asnSizeConstraint: parses the optional SizeConstraint.
+# Currently not used for anything.
+proc asnSizeConstraint {} {
+    global type val
+    if {[lex-name-move SIZE]} {
+	asnSubtypeSpec
+    }
+}
+
+# asnSubtypeSpec: parses the SubtypeSpec ...
+# Currently not used for anything. We now it's balanced however, i.e.
+# (... ( ... ) .. )
+proc asnSubtypeSpec {} {
+    global type val
+
+    if {[string compare $type "("]} {
+	return 
+    }
+    lex
+    set level 1
+    while {$level > 0} {
+	if {![string compare $type "("]} {
+	    incr level
+	} elseif {![string compare $type ")"]} {
+	    incr level -1
+	}
+	lex
+    }
+}
+
+# asnType: parses ASN.1 type.
+# On entry $name should hold the name we are currently defining.
+# Returns type indicator:
+#   SequenceOf     SEQUENCE OF
+#   Sequence       SEQUENCE 
+#   SetOf          SET OF
+#   Set            SET
+#   Choice         CHOICE
+#   Simple         Basic types.
+#   In this casecalling procedure's $tname variable is a list holding:
+#        {C-Function C-Type} if the type is IMPORTed or ODR defined.
+#      or
+#        {C-Function C-Type 1} if the type should be defined in this module
+proc asnType {name} {
+    global type val inf
+    upvar tname tname
+
+    set tname {}
+    if {[string compare $type n]} {
+        asnError "Expects type specifier, but got $type"
+    }
+    set v $val
+    lex
+    switch -- $v {
+        SEQUENCE {
+	    asnSizeConstraint
+	    if {[lex-name-move OF]} {
+		asnSubtypeSpec
+		return SequenceOf
+	    } else {
+		asnSubtypeSpec
+		return Sequence
+	    }
+	}
+	SET {
+	    asnSizeConstraint
+	    if {[lex-name-move OF]} {
+		asnSubtypeSpec
+		return SetOf
+	    } else {
+		asnSubtypeSpec
+		return Set
+	    }
+        }
+        CHOICE {
+	    asnSubtypeSpec
+            return Choice
+        }
+    }
+    if {[string length [info commands asnBasic$v]]} {
+        set tname [asnBasic$v]
+    } else {
+        if {[info exists inf(map,$inf(module),$v)]} {
+            set v $inf(map,$inf(module),$v)
+        }
+        if {[info exists inf(imports,$v)]} {
+            set tname $inf(imports,$v)
+        } else {
+            set w [join [split $v -] _]
+            set tname [list $inf(fprefix)$w $inf(vprefix)$w 1]
+        }
+    }
+    if {[lex-name-move DEFINED]} {
+	if {[lex-name-move BY]} {
+	    lex
+	}
+    }
+    asnSubtypeSpec
+    return Simple
+}
+
+proc mapName {name} {
+    global inf
+    if {[info exists inf(map,$inf(module),$name)]} {
+        set name $inf(map,$inf(module),$name)
+	if {$inf(verbose)} {
+	    puts -nonewline " $name ($inf(lineno))"
+	    puts " mapping to $name"
+	}
+    } else {
+	if {$inf(verbose)} {
+	    puts " $name ($inf(lineno))"
+	}
+    }
+    return $name
+}
+
+# asnDef: parses type definition (top-level) and generates C code
+# On entry $name holds the type we are defining.
+proc asnDef {name} {
+    global inf file
+
+    set name [mapName $name]
+    if {[info exist inf(defined,$inf(fprefix)$name)]} {
+        incr inf(definedl,$name)
+        if {$inf(verbose) > 1} {
+            puts "set map($inf(module),$name) $name$inf(definedl,$name)"
+        }
+    } else {
+        set inf(definedl,$name) 0
+    }
+    set mname [join [split $name -] _]
+    asnMod tag implicit tagtype
+    set t [asnType $mname]
+    asnSub $mname $t $tname $tag $implicit $tagtype
+}
+
+
+# asnSub: parses type and generates C-code
+# On entry,
+#   $name holds the type we are defining.
+#   $t is the type returned by the asnType procedure.
+#   $tname is the $tname set by the asnType procedure.
+#   $tag is the tag as returned by asnMod
+#   $implicit is the implicit indicator as returned by asnMod
+proc asnSub {name t tname tag implicit tagtype} {
+    global file inf
+   
+    set ignore 0
+    set defname defined,$inf(fprefix)$name
+    if {[info exist inf($defname)]} {
+        asnWarning "$name already defined in line $inf($defname)"
+        set ignore 1
+    }
+    set inf($defname) $inf(lineno)
+    switch -- $t {
+        Sequence   { set l [asnSequence $name $tag $implicit $tagtype] }
+        SequenceOf { set l [asnOf $name $tag $implicit $tagtype 0] }
+	SetOf      { set l [asnOf $name $tag $implicit $tagtype 1] }
+        Choice     { set l [asnChoice $name $tag $implicit $tagtype] }
+        Simple     { set l [asnSimple $name $tname $tag $implicit $tagtype] }
+        default    { asnError "switch asnType case not handled" }
+    }
+    if {$ignore} return
+
+    puts $file(outc) {}
+    puts $file(outc) "int $inf(fprefix)$name (ODR o, $inf(vprefix)$name **p, int opt, const char *name)"
+    puts $file(outc) \{
+    puts $file(outc) [lindex $l 0]
+    puts $file(outc) \}
+    set ok 1
+    set fdef "$inf(cprefix)int $inf(fprefix)$name (ODR o, $inf(vprefix)$name **p, int opt, const char *name);"
+    switch -- $t {
+        Simple {
+            set decl "typedef [lindex $l 1] $inf(vprefix)$name;"
+            if {![string compare [lindex $tname 2] 1]} {
+                if {![info exist inf(defined,[lindex $tname 0])]} {
+                    set ok 0
+                }
+            }
+	    set inf(var,$inf(nodef)) [join [lindex $l 2] \n]
+	    incr inf(nodef)
+        }
+        default {
+            set decl "typedef struct $inf(vprefix)$name $inf(vprefix)$name;"
+	    set inf(var,$inf(nodef)) "[lindex $l 1];"
+	    incr inf(nodef)
+        }
+    }
+    if {$ok} {
+        puts $file(outh) {}
+        puts $file(outh) $decl
+        puts $file(outh) $fdef
+	asnForwardTypes $name
+    } else {
+        lappend inf(forward,code,[lindex $tname 0]) {} $decl $fdef
+        lappend inf(forward,ref,[lindex $tname 0]) $name
+    }
+}
+
+proc asnForwardTypes {name} {
+    global inf file
+
+    if {![info exists inf(forward,code,$inf(fprefix)$name)]} {
+	return 0
+    }
+    foreach r $inf(forward,code,$inf(fprefix)$name) {
+	puts $file(outh) $r
+    }
+    unset inf(forward,code,$inf(fprefix)$name)
+
+    while {[info exists inf(forward,ref,$inf(fprefix)$name)]} {
+	set n $inf(forward,ref,$inf(fprefix)$name)
+	set m [lrange $n 1 end]
+	if {[llength $m]} {
+	    set inf(forward,ref,$inf(fprefix)$name) $m
+	} else {
+	    unset inf(forward,ref,$inf(fprefix)$name)
+	}
+	asnForwardTypes [lindex $n 0]
+    }
+}
+
+# asnSimple: parses simple type definition and generates C code
+# On entry,
+#   $name is the name we are defining
+#   $tname is the tname as returned by asnType
+#   $tag is the tag as returned by asnMod
+#   $implicit is the implicit indicator as returned by asnMod
+# Returns,
+#   {c-code, h-code}
+# Note: Doesn't take care of enum lists yet.
+proc asnSimple {name tname tag implicit tagtype} {
+    global inf
+
+    set j "[lindex $tname 1] "
+
+    if {[info exists inf(unionmap,$inf(module),$name)]} {
+	set uName $inf(unionmap,$inf(module),$name)
+    } else {
+	set uName $name
+    }
+
+    asnEnum $uName jj
+    if {![string length $tag]} {
+        set l "\treturn [lindex $tname 0] (o, p, opt, name);" 
+    } elseif {$implicit} {
+        set l \
+  "\treturn odr_implicit_tag (o, [lindex $tname 0], p, $tagtype, $tag, opt, name);" 
+    } else {
+        set l \
+  "\treturn odr_explicit_tag (o, [lindex $tname 0], p, $tagtype, $tag, opt, name);" \
+    }
+    if {[info exists jj]} {
+	return [list $l $j $jj]
+    } else {
+	return [list $l $j]
+    }
+}
+
+# asnSequence: parses "SEQUENCE { s-list }" and generates C code.
+# On entry,
+#   $name is the type we are defining
+#   $tag tag 
+#   $implicit
+# Returns,
+#   {c-code, h-code}
+proc asnSequence {name tag implicit tagtype} {
+    global val type inf
+
+    lappend j "struct $inf(vprefix)$name \{"
+    set level 0
+    set nchoice 0
+    if {![string length $tag]} {
+        lappend l "\tif (!odr_sequence_begin (o, p, sizeof(**p), name))"
+        lappend l "\t\treturn opt && odr_ok (o);"
+    } elseif {$implicit} {
+        lappend l "\tif (!odr_implicit_settag (o, $tagtype, $tag) ||"
+        lappend l "\t\t!odr_sequence_begin (o, p, sizeof(**p), name))"
+        lappend l "\t\treturn opt && odr_ok(o);"
+    } else {
+        lappend l "\tif (!odr_constructed_begin (o, p, $tagtype, $tag, name))"
+        lappend l "\t\treturn opt && odr_ok(o);"
+        lappend l "\tif (o->direction == ODR_DECODE)"
+        lappend l "\t\t*p = odr_malloc (o, sizeof(**p));"
+
+        lappend l "\tif (!odr_sequence_begin (o, p, sizeof(**p), 0))"
+        lappend l "\t\{"
+        lappend l "\t\t*p = 0;"
+        lappend l "\t\treturn 0;"
+        lappend l "\t\}"
+    }
+    lappend l "\treturn"
+    while {1} {
+        set p [lindex [asnName $name] 0]
+        asnMod ltag limplicit ltagtype
+        set t [asnType $p]
+
+	set uName { }
+	if {[info exists inf(unionmap,$inf(module),$name,$p)]} {
+	    set uName $inf(unionmap,$inf(module),$name,$p)
+	}
+
+        if {![string compare $t Simple]} {
+	    if {[string compare $uName { }]} {
+		set enumName $uName
+	    } else {
+		set enumName $name
+	    }
+            asnEnum $enumName j
+            set opt [asnOptional]
+            if {![string length $ltag]} {
+                lappend l "\t\t[lindex $tname 0](o, &(*p)->$p, $opt, \"$p\") &&"
+            } elseif {$limplicit} {
+                lappend l "\t\todr_implicit_tag (o, [lindex $tname 0],"
+                lappend l "\t\t\t&(*p)->$p, $ltagtype, $ltag, $opt, \"$p\") &&"
+            } else {
+                lappend l "\t\todr_explicit_tag (o, [lindex $tname 0],"
+                lappend l "\t\t\t&(*p)->$p, $ltagtype, $ltag, $opt, \"$p\") &&"
+            }
+            set dec "\t[lindex $tname 1] *$p;"
+        } elseif {![string compare $t SequenceOf] && [string length $uName] &&\
+		      (![string length $ltag] || $limplicit)} {
+            set u [asnType $p]
+           
+	    if {[llength $uName] < 2} {
+		set uName [list num_$p $p]
+	    }
+            if {[string length $ltag]} {
+                if {!$limplicit} {
+                    asnError explicittag
+                }
+                lappend l "\t\todr_implicit_settag (o, $ltagtype, $ltag) &&"
+            }
+            switch -- $u {
+                Simple {
+                    asnEnum $name j
+                    set tmpa "odr_sequence_of(o, (Odr_fun) [lindex $tname 0], &(*p)->$p,"
+                    set tmpb "&(*p)->[lindex $uName 0], \"$p\")"
+                    lappend j "\tint [lindex $uName 0];"
+                    set dec "\t[lindex $tname 1] **[lindex $uName 1];"
+                }
+                default {
+                    set subName [mapName ${name}_$level]
+                    asnSub $subName $u {} {} 0 {}
+                    
+                    set tmpa "odr_sequence_of(o, (Odr_fun) $inf(fprefix)$subName, &(*p)->$p,"
+                    set tmpb "&(*p)->[lindex $uName 0], \"$p\")"
+                    lappend j "\tint [lindex $uName 0];"
+                    set dec "\t$inf(vprefix)$subName **[lindex $uName 1];"
+                    incr level
+                }
+            }
+            set opt [asnOptional]
+            if {$opt} {
+                lappend l "\t\t($tmpa"
+                lappend l "\t\t  $tmpb || odr_ok(o)) &&"
+            } else {
+                lappend l "\t\t$tmpa"
+                lappend l "\t\t  $tmpb &&"
+            }
+        } elseif {!$nchoice && ![string compare $t Choice] && \
+		      [string length $uName]} {
+	    if {[llength $uName] < 3} {
+		set uName [list which u $name]
+		incr nchoice
+	    }
+            lappend j "\tint [lindex $uName 0];"
+            lappend j "\tunion \{"
+            lappend v "\tstatic Odr_arm arm\[\] = \{"
+            asnArm $name [lindex $uName 2] v j
+            lappend v "\t\};"
+            set dec "\t\} [lindex $uName 1];"
+            set opt [asnOptional]
+            set oa {}
+            set ob {}
+            if {[string length $ltag]} {
+                if {$limplicit} {
+                    lappend l "\t\todr_implicit_settag (o, $ltagtype, $ltag) &&"
+                    if {$opt} {
+                        asnWarning "optional handling missing in CHOICE in SEQUENCE"
+			asnWarning " set unionmap($inf(module),$name,$p) to {}"
+                    }
+                } else {
+                    if {$opt} {
+                        set la "(("
+                    } else {
+                        set la ""
+                    }
+                    lappend l "\t\t${la}odr_constructed_begin (o, &(*p)->[lindex $uName 1], $ltagtype, $ltag, \"$p\") &&"
+                }
+            } else {
+                if {$opt} {
+                    set oa "("
+                    set ob " || odr_ok(o))" 
+                }
+            }
+            lappend l "\t\t${oa}odr_choice (o, arm, &(*p)->[lindex $uName 1], &(*p)->[lindex $uName 0], 0)${ob} &&"
+            if {[string length $ltag]} {
+                if {!$limplicit} {
+                    if {$opt} {
+                        set lb ") || odr_ok(o))"
+                    } else {
+                        set lb ""
+                    }
+                    lappend l "\t\todr_constructed_end (o)${lb} &&"
+                } 
+            }
+        } else {
+	    set subName [mapName ${name}_$level]
+            asnSub $subName $t {} {} 0 {}
+            set opt [asnOptional]
+            if {![string length $ltag]} {
+                lappend l "\t\t$inf(fprefix)${subName} (o, &(*p)->$p, $opt, \"$p\") &&"
+            } elseif {$limplicit} {
+                lappend l "\t\todr_implicit_tag (o, $inf(fprefix)${subName},"
+                lappend l "\t\t\t&(*p)->$p, $ltagtype, $ltag, $opt, \"$p\") &&"
+            } else {
+                lappend l "\t\todr_explicit_tag (o, $inf(fprefix)${subName},"
+                lappend l "\t\t\t&(*p)->$p, $ltagtype, $ltag, $opt, \"$p\") &&"
+            }
+            set dec "\t$inf(vprefix)${subName} *$p;"
+            incr level
+        }
+        if {$opt} {
+            lappend j "$dec /* OPT */"
+        } else {
+            lappend j $dec
+        }
+        if {[string compare $type ,]} break
+    }
+    lappend j "\}"
+    if {[string length $tag] && !$implicit} {
+        lappend l "\t\todr_sequence_end (o) &&"
+        lappend l "\t\todr_constructed_end (o);"
+    } else {
+        lappend l "\t\todr_sequence_end (o);"
+    }
+    if {[string compare $type \}]} {
+        asnError "Missing \} got $type '$val'"
+    }
+    lex
+    if {[info exists v]} {
+        set l [concat $v $l]
+    }
+    return [list [join $l \n] [join $j \n]]
+}
+
+# asnOf: parses "SEQUENCE/SET OF type" and generates C code.
+# On entry,
+#   $name is the type we are defining
+#   $tag tag 
+#   $implicit
+# Returns,
+#   {c-code, h-code}
+proc asnOf {name tag implicit tagtype isset} { 
+    global inf
+
+    if {$isset} {
+	set func odr_set_of
+    } else {
+	set func odr_sequence_of
+    }
+
+    if {[info exists inf(unionmap,$inf(module),$name)]} {
+	set numName $inf(unionmap,$inf(module),$name)
+    } else {
+	set numName {num elements}
+    }
+
+    lappend j "struct $inf(vprefix)$name \{"
+    lappend j "\tint [lindex $numName 0];"
+
+    lappend l "\tif (!odr_initmember (o, p, sizeof(**p)))"
+    lappend l "\t\treturn opt && odr_ok(o);"
+    if {[string length $tag]} {
+        if {$implicit} {
+            lappend l "\todr_implicit_settag (o, $tagtype, $tag);"
+        } else {
+            asnWarning "Constructed SEQUENCE/SET OF not handled"
+        }
+    }
+    set t [asnType $name]
+    switch -- $t {
+        Simple {
+            asnEnum $name j
+            lappend l "\tif ($func (o, (Odr_fun) [lindex $tname 0], &(*p)->[lindex $numName 1],"
+            lappend l "\t\t&(*p)->[lindex $numName 0], name))"
+            lappend j "\t[lindex $tname 1] **[lindex $numName 1];"
+        }
+        default {
+            set subName [mapName ${name}_s]
+            lappend l "\tif ($func (o, (Odr_fun) $inf(fprefix)$subName, &(*p)->[lindex $numName 1],"
+            lappend l "\t\t&(*p)->[lindex $numName 0], name))"
+            lappend j "\t$inf(vprefix)$subName **[lindex $numName 1];"
+            asnSub $subName $t {} {} 0 {}
+        }
+    }
+    lappend j "\}"
+    lappend l "\t\treturn 1;"
+    lappend l "\t*p = 0;"
+    lappend l "\treturn opt && odr_ok(o);"
+    return [list [join $l \n] [join $j \n]]
+}
+
+# asnArm: parses c-list in choice
+proc asnArm {name defname lx jx} {
+    global type val inf
+
+    upvar $lx l
+    upvar $jx j
+    while {1} {
+        set pq [asnName $name]
+        set p [lindex $pq 0]
+        set q [lindex $pq 1]
+        if {![string length $q]} {
+            set q $p
+	    set p ${defname}_$p
+        }
+        asnMod ltag limplicit ltagtype
+        set t [asnType $q]
+
+        lappend enums "$inf(dprefix)$p"
+        if {![string compare $t Simple]} {
+            asnEnum $name j
+            if {![string length $ltag]} {
+                lappend l "\t\t\{-1, -1, -1, $inf(dprefix)$p,"
+		lappend l "\t\t (Odr_fun) [lindex $tname 0], \"$q\"\},"
+            } elseif {$limplicit} {
+                lappend l "\t\t\{ODR_IMPLICIT, $ltagtype, $ltag, $inf(dprefix)$p,"
+                lappend l "\t\t(Odr_fun) [lindex $tname 0], \"$q\"\},"
+            } else {
+                lappend l "\t\t\{ODR_EXPLICIT, $ltagtype, $ltag, $inf(dprefix)$p,"
+                lappend l "\t\t(Odr_fun) [lindex $tname 0], \"$q\"\},"
+            }
+            lappend j "\t\t[lindex $tname 1] *$q;"
+        } else {
+            set subName [mapName ${name}_$q]
+            if {![string compare $inf(dprefix)${name}_$q \
+                                 $inf(vprefix)$subName]} {
+                set po [string toupper [string index $q 0]][string \
+                                                            range $q 1 end]
+                set subName [mapName ${name}${po}]
+            }
+            asnSub $subName $t $tname {} 0 {}
+            if {![string length $ltag]} {
+                lappend l "\t\t\{-1, -1, -1, $inf(dprefix)$p,"
+		lappend l "\t\t (Odr_fun) $inf(fprefix)$subName, \"$q\"\},"
+            } elseif {$limplicit} {
+                lappend l "\t\t\{ODR_IMPLICIT, $ltagtype, $ltag, $inf(dprefix)$p,"
+                lappend l "\t\t(Odr_fun) $inf(fprefix)$subName, \"$q\"\},"
+            } else {
+                lappend l "\t\t\{ODR_EXPLICIT, $ltagtype, $ltag, $inf(dprefix)$p,"
+                lappend l "\t\t(Odr_fun) $inf(fprefix)$subName, \"$q\"\},"
+            }
+            lappend j "\t\t$inf(vprefix)$subName *$q;"
+        }
+        if {[string compare $type ,]} break
+    }
+    if {[string compare $type \}]} {
+        asnError "Missing \} got $type '$val'"
+    }
+    lex
+    set level 1
+    foreach e $enums {
+        lappend j "#define $e $level"
+        incr level
+    }
+    lappend l "\t\t\{-1, -1, -1, -1, (Odr_fun) 0, 0\}"
+}
+
+# asnChoice: parses "CHOICE {c-list}" and generates C code.
+# On entry,
+#   $name is the type we are defining
+#   $tag tag 
+#   $implicit
+# Returns,
+#   {c-code, h-code}
+proc asnChoice {name tag implicit tagtype} {
+    global type val inf
+
+    if {[info exists inf(unionmap,$inf(module),$name)]} {
+	set uName $inf(unionmap,$inf(module),$name)
+    } else {
+	set uName [list which u $name]
+    }
+
+    lappend j "struct $inf(vprefix)$name \{"
+    lappend j "\tint [lindex $uName 0];"
+    lappend j "\tunion \{"
+    lappend l "\tstatic Odr_arm arm\[\] = \{"
+    asnArm $name [lindex $uName 2] l j
+    lappend j "\t\} [lindex $uName 1];"
+    lappend j "\}"
+    lappend l "\t\};"
+    if {![string length $tag]} {
+	lappend l "\tif (!odr_initmember(o, p, sizeof(**p)))"
+	lappend l "\t\treturn opt && odr_ok(o);"
+	lappend l "\tif (odr_choice(o, arm, &(*p)->[lindex $uName 1], &(*p)->[lindex $uName 0], name))"
+    } elseif {$implicit} {
+	lappend l "\tif (!odr_initmember(o, p, sizeof(**p)))"
+	lappend l "\t\treturn opt && odr_ok(o);"
+	lappend l "\todr_implicit_settag(o, $tagtype, $tag);"
+	lappend l "\tif (odr_choice(o, arm, &(*p)->[lindex $uName 1], &(*p)->[lindex $uName 0], name))"
+    } else {
+	lappend l "\tif (!*p && o->direction != ODR_DECODE)"
+	lappend l "\t\treturn opt;"
+	lappend l "\tif (!odr_constructed_begin(o, p, $tagtype, $tag, 0))"
+	lappend l "\t\treturn opt && odr_ok(o);"
+	lappend l "\tif (!odr_initmember(o, p, sizeof(**p)))"
+	lappend l "\t\treturn opt && odr_ok(o);"
+	lappend l "\tif (odr_choice(o, arm, &(*p)->[lindex $uName 1], &(*p)->[lindex $uName 0], name) &&"
+	lappend l "\t\todr_constructed_end(o))"
+    }
+    lappend l "\t\treturn 1;"
+    lappend l "\t*p = 0;"
+    lappend l "\treturn opt && odr_ok(o);"
+    return [list [join $l \n] [join $j \n]]
+}
+
+# asnImports: parses i-list in "IMPORTS {i-list}" 
+# On return inf(import,..)-array is updated.
+# inf(import,"module") is a list of {C-handler, C-type} elements.
+# The {C-handler, C-type} is compatible with the $tname as is used by the
+# asnType procedure to solve external references.
+proc asnImports {} {
+    global type val inf file
+
+    while {1} {
+        if {[string compare $type n]} {
+            asnError "Missing name in IMPORTS list"
+        }
+        lappend nam $val
+        lex
+        if {![string compare $type n] && ![string compare $val FROM]} {
+            lex
+	    
+	    if {[info exists inf(filename,$val)]} {
+		set fname $inf(filename,$val)
+	    } else {
+		set fname $val
+	    }
+	    puts $file(outh) "\#include <$inf(h-dir)${fname}.h>"
+
+            if {[info exists inf(prefix,$val)]} {
+                set prefix $inf(prefix,$val)
+            } else {
+                set prefix $inf(prefix)
+            }
+            foreach n $nam {
+		if {[info exists inf(map,$val,$n)]} {
+		    set v $inf(map,$val,$n)
+		} else {
+		    set v $n
+		}
+                set w [join [split $v -] _]
+                set inf(imports,$n) [list [lindex $prefix 0]$w \
+                                          [lindex $prefix 1]$w]
+            }
+            unset nam
+            lex
+            if {[string compare $type n]} break
+        } elseif {![string compare $type ,]} {
+            lex
+        } else break
+    }
+    if {[string compare $type \;]} {
+        asnError "Missing ; after IMPORTS list - got $type '$val'"
+    }
+    lex
+}
+
+# asnExports: parses e-list in "EXPORTS {e-list}" 
+# This function does nothing with elements in the list.
+proc asnExports {} {
+    global type val inf
+
+    while {1} {
+        if {[string compare $type n]} {
+            asnError "Missing name in EXPORTS list"
+        }
+        set inf(exports,$val) 1
+        lex
+        if {[string compare $type ,]} break
+        lex
+    }
+    if {[string compare $type \;]} {
+        asnError "Missing ; after EXPORTS list - got $type ($val)"
+    }
+    lex
+}
+
+# asnModuleBody: parses a module specification and generates C code.
+# Exports lists, imports lists, and type definitions are handled;
+# other things are silently ignored.
+proc asnModuleBody {} {
+    global type val file inf
+
+    if {[info exists inf(prefix,$inf(module))]} {
+        set prefix $inf(prefix,$inf(module))
+    } else {
+        set prefix $inf(prefix)
+    }
+    set inf(fprefix) [lindex $prefix 0]
+    set inf(vprefix) [lindex $prefix 1]
+    set inf(dprefix) [lindex $prefix 2]
+    if {[llength $prefix] > 3} {
+	set inf(cprefix) [lindex $prefix 3]
+    } else {
+	set inf(cprefix) {YAZ_EXPORT }
+    }
+
+    if {$inf(verbose)} {
+        puts "Module $inf(module), $inf(lineno)"
+    }
+
+    set defblock 0
+    if {[info exists inf(init,$inf(module),c)]} {
+	puts $file(outc) $inf(init,$inf(module),c)
+    }
+    if {[info exists inf(init,$inf(module),h)]} {
+	puts $file(outh) "\#ifdef __cplusplus"
+	puts $file(outh) "extern \"C\" \{"
+	puts $file(outh) "\#endif"
+	set defblock 1
+	puts $file(outh) $inf(init,$inf(module),h)
+    }
+    if {[info exists inf(init,$inf(module),p)]} {
+	puts $file(outp) $inf(init,$inf(module),p)
+    }
+
+    while {[string length $type]} {
+	if {[string compare $type n]} {
+	    lex
+	    continue
+	}
+	if {![string compare $val END]} {
+	    break
+	} elseif {![string compare $val EXPORTS]} {
+	    lex
+	    asnExports
+	} elseif {![string compare $val IMPORTS]} {
+	    if {$defblock} {
+		puts $file(outh) "\#ifdef __cplusplus"
+		puts $file(outh) "\}"
+		puts $file(outh) "\#endif"
+		set defblock 0
+	    }
+	    lex
+	    asnImports
+	} else {
+	    if {!$defblock} {
+		puts $file(outh) "\#ifdef __cplusplus"
+		puts $file(outh) "extern \"C\" \{"
+		puts $file(outh) "\#endif"
+		set defblock 1
+	    }
+	    set inf(asndef) $inf(nodef)
+	    set oval $val
+	    lex
+	    if {![string compare $type :]} {
+		lex
+		asnDef $oval
+		set inf(asndef) 0
+	    } elseif {![string compare $type n]} {
+		lex
+		if {[string length $type]} {
+		    lex
+		}
+	    }
+	}
+    }
+    if {$defblock} {
+	puts $file(outh) "\#ifdef __cplusplus"
+	puts $file(outh) "\}"
+	puts $file(outh) "\#endif"
+	set defblock 0
+    }
+    foreach x [array names inf imports,*] {
+        unset inf($x)
+    }
+}
+
+# asnTagDefault: parses TagDefault section
+proc asnTagDefault {} {
+    global type val inf file
+    
+    set inf(implicit-tags) 0
+    while {[string length $type]} {
+	if {[lex-name-move EXPLICIT]} {
+	    lex
+	    set inf(implicit-tags) 0
+	} elseif {[lex-name-move  IMPLICIT]} {
+	    lex
+	    set inf(implicit-tags) 1
+	} else {
+	    break
+	}
+    }
+}
+
+# asnModules: parses a collection of module specifications.
+# Depending on the module pattern, $inf(moduleP), a module is either
+# skipped or processed.
+proc asnModules {} {
+    global type val inf file yc_version
+
+    set inf(nodef) 0
+    set inf(asndef) 0
+    lex
+    while {![string compare $type n]} {
+	set inf(module) $val
+        if {[info exists inf(moduleP)] && ![string match $inf(moduleP) $val]} {
+            if {$inf(verbose)} {
+                puts "Skipping $id"
+            }
+            while {![lex-name-move END]} {
+		lex
+	    }
+        } else {
+	    set inf(nodef) 1
+	    set inf(asndef) 1
+
+	    while {![lex-name-move DEFINITIONS]} {
+		lex
+		if {![string length $type]} return
+	    }
+	    if {[info exists inf(filename,$inf(module))]} {
+		set fname $inf(filename,$inf(module))
+	    } else {
+		set fname $inf(module)
+	    }
+            set ppname [join [split $fname -] _]
+
+	    if {![info exists inf(c-file)]} {
+		set inf(c-file) ${fname}.c
+	    }
+	    set file(outc) [open $inf(c-file) w]
+
+	    if {![info exists inf(h-file)]} {
+		set inf(h-file) ${fname}.h
+	    }
+	    set file(outh) [open $inf(h-path)/$inf(h-dir)$inf(h-file) w]
+
+	    if {0} {
+	        if {![info exists inf(p-file)]} {
+		    set inf(p-file) ${fname}-p.h
+	        }
+	        set file(outp) [open $inf(h-path)/$inf(h-dir)$inf(p-file) w]
+            }
+
+	    set greeting {Generated automatically by the YAZ ASN.1 Compiler}
+
+	    puts $file(outc) "/* ${greeting} ${yc_version} */"
+	    puts $file(outc) "/* Module-C: $inf(module) */"
+	    puts $file(outc) {}
+
+	    puts $file(outh) "/* ${greeting} ${yc_version} */"
+	    puts $file(outh) "/* Module-H $inf(module) */"
+	    puts $file(outh) {}
+
+	    if {[info exists file(outp)]} {
+	        puts $file(outp) "/* ${greeting} ${yc_version} */"
+	        puts $file(outp) "/* Module-P: $inf(module) */"
+	        puts $file(outp) {}
+            }
+
+            if {[info exists inf(p-file)]} {
+	        puts $file(outc) "\#include <$inf(h-dir)$inf(p-file)>"
+            } else {
+	        puts $file(outc) "\#include <$inf(h-dir)$inf(h-file)>"
+            }
+	    puts $file(outh) "\#ifndef ${ppname}_H"
+	    puts $file(outh) "\#define ${ppname}_H"
+	    puts $file(outh) {}
+	    puts $file(outh) "\#include <$inf(h-dir)odr.h>"
+	   
+            if {[info exists file(outp)]} { 
+	        puts $file(outp) "\#ifndef ${ppname}_P_H"
+	        puts $file(outp) "\#define ${ppname}_P_H"
+	        puts $file(outp) {}
+	        puts $file(outp) "\#include <$inf(h-dir)$inf(h-file)>"
+
+            }
+	    
+	    asnTagDefault
+	    if {[string compare $type :]} {
+		asnError "::= expected got $type '$val'"
+	    } 
+	    lex
+	    if {![lex-name-move BEGIN]} {
+		asnError "BEGIN expected"
+	    }
+	    asnModuleBody
+	    lex
+
+	    if {[info exists file(outp)]} {
+		set f $file(outp)
+	    } else {
+		set f $file(outh)
+	    }
+	    puts $f "\#ifdef __cplusplus"
+	    puts $f "extern \"C\" \{"
+	    puts $f "\#endif"
+	    for {set i 1} {$i < $inf(nodef)} {incr i} {
+		puts $f $inf(var,$i)
+		if {[info exists inf(asn,$i)]} {
+		    if {0} {
+			puts $f "/*"
+			foreach comment $inf(asn,$i) {
+			    puts $f $comment
+			}
+			puts $f " */"
+		    }
+		    unset inf(asn,$i)
+		}
+		unset inf(var,$i)
+		puts $f {}
+	    }
+	    puts $f "\#ifdef __cplusplus"
+	    puts $f "\}"
+	    puts $f "\#endif"
+
+	    if {[info exists inf(body,$inf(module),h)]} {
+		puts $file(outh) $inf(body,$inf(module),h)
+	    }
+	    if {[info exists inf(body,$inf(module),c)]} {
+		puts $file(outc) $inf(body,$inf(module),c)
+	    }
+	    if {[info exists inf(body,$inf(module),p)]} {
+                if {[info exists file(outp)]} {
+		    puts $file(outp) $inf(body,$inf(module),p)
+                }
+	    }
+	    puts $file(outh) "\#endif"
+            if {[info exists file(outp)]} {
+	        puts $file(outp) "\#endif"
+            }
+	    foreach f [array names file] {
+		close $file($f)
+	    }
+	    unset inf(c-file)
+	    unset inf(h-file)
+	    catch {unset inf(p-file)}
+	}
+    }
+}
+
+# asnFile: parses an ASN.1 specification file as specified in $inf(iname).
+proc asnFile {} {
+    global inf file
+
+    if {$inf(verbose) > 1} {
+        puts "Reading ASN.1 file $inf(iname)"
+    }
+    set inf(str) {}
+    set inf(lineno) 0
+    set inf(inf) [open $inf(iname) r]
+    
+    asnModules
+    
+}
+
+# The following procedures are invoked by the asnType function. 
+# Each procedure takes the form: asnBasic<TYPE> and they must return
+# two elements: the C function handler and the C type.
+# On entry upvar $name is the type we are defining and global, $inf(module), is
+# the current module name.
+
+proc asnBasicEXTERNAL {} {
+    return {odr_external {Odr_external}}
+}
+
+proc asnBasicINTEGER {} {
+    return {odr_integer {int}}
+}
+
+proc asnBasicENUMERATED {} {
+    return {odr_enum {int}}
+}
+
+proc asnBasicNULL {} {
+    return {odr_null {Odr_null}}
+}
+
+proc asnBasicBOOLEAN {} {
+    return {odr_bool {bool_t}}
+}
+
+proc asnBasicOCTET {} {
+    global type val
+    lex-name-move STRING
+    return {odr_octetstring {Odr_oct}}
+}
+
+proc asnBasicBIT {} {
+    global type val
+    lex-name-move STRING
+    return {odr_bitstring {Odr_bitmask}}
+}
+
+proc asnBasicOBJECT {} {
+    global type val
+    lex-name-move IDENTIFIER
+    return {odr_oid {Odr_oid}}
+}
+
+proc asnBasicGeneralString {} {
+    return {odr_generalstring char}
+}
+
+proc asnBasicVisibleString {} {
+    return {odr_visiblestring char}
+}
+
+proc asnBasicGeneralizedTime {} {
+    return {odr_generalizedtime char}
+}
+
+proc asnBasicANY {} {
+    upvar name name
+    global inf
+    return [list $inf(fprefix)ANY_$name void]
+}
+
+# userDef: reads user definitions file $name
+proc userDef {name} {
+    global inf
+
+    if {$inf(verbose) > 1} {
+        puts "Reading definitions file $name"
+    }
+    source $name
+
+    if {[info exists default-prefix]} {
+        set inf(prefix) ${default-prefix}
+    }
+    if {[info exists h-path]} {
+        set inf(h-path) ${h-path}
+    }
+    foreach m [array names prefix] {
+        set inf(prefix,$m) $prefix($m)
+    }
+    foreach m [array names body] {
+	set inf(body,$m) $body($m)
+    }
+    foreach m [array names init] {
+	set inf(init,$m) $init($m)
+    }
+    foreach m [array names filename] {
+	set inf(filename,$m) $filename($m)
+    }
+    foreach m [array names map] {
+        set inf(map,$m) $map($m)
+    }
+    foreach m [array names membermap] {
+        set inf(membermap,$m) $membermap($m)
+    }
+    foreach m [array names unionmap] {
+        set inf(unionmap,$m) $unionmap($m)
+    }
+}
+
+set inf(verbose) 0
+set inf(prefix) {yc_ Yc_ YC_}
+set inf(h-path) .
+set inf(h-dir) ""
+
+# Parse command line
+set l [llength $argv]
+set i 0
+while {$i < $l} {
+    set arg [lindex $argv $i]
+    switch -glob -- $arg {
+        -v {
+	    incr inf(verbose) 
+        }
+        -c {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+                 set p [lindex $argv [incr i]]
+             }
+	    set inf(c-file) $p
+        }
+        -I* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+                 set p [lindex $argv [incr i]]
+             }
+	    set inf(h-path) $p
+        }
+	-i* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+                 set p [lindex $argv [incr i]]
+            }
+	    set inf(h-dir) [string trim $p \\/]/
+	}
+        -h* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+                 set p [lindex $argv [incr i]]
+             }
+	    set inf(h-file) $p
+        }
+        -p* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+		set p [lindex $argv [incr i]]
+	    }
+	    set inf(p-file) $p
+        }
+        -d* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+		set p [lindex $argv [incr i]]
+	    }
+	    userDef $p
+        }
+        -m* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+		set p [lindex $argv [incr i]]
+	    }
+	    set inf(moduleP) $p
+        }
+	-x* {
+	    set p [string range $arg 2 end]
+	    if {![string length $p]} {
+		set p [lindex $argv [incr i]]
+	    }
+	    if {[llength $p] == 1} {
+		set inf(prefix) [list [string tolower $p] \
+				     [string toupper $p] [string toupper $p]]
+	    } elseif {[llength $p] == 3} {
+		set inf(prefix) $p
+	    } else {
+		puts [llength $p]
+		exit 1
+	    }
+	}	    
+        default {
+	    set inf(iname) $arg
+        }
+    }
+    incr i
+}
+
+if {![info exists inf(iname)]} {
+    puts "YAZ ASN.1 Compiler ${yc_version}"
+    puts -nonewline "Usage: ${argv0}"
+    puts { [-v] [-c cfile] [-h hfile] [-p hfile] [-d dfile] [-I path]}
+    puts {    [-x prefix] [-m module] file}
+    exit 1
+}
+
+asnFile
Index: /main/tags/2.38/gsdl/packages/yaz/win/makefile
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/win/makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/win/makefile	(revision 21083)
@@ -0,0 +1,720 @@
+# Makefile.mak - makefile for MS NMAKE 
+# $Id$
+#
+# Programmed by
+#  HL: Heikki Levanto, Index Data
+#
+# Log at the end of the file
+#
+# Missing
+# - Move MS-C's whatnots into win direcotry
+# - The TCL script produces C and H files in the same dir as the 
+#   ASN files. H's are copied to INCL, C's are left there.
+#   They should be produced into OBJ...
+#  
+# Envoronment problems
+# - You need to have the proper path and environment for VC set
+#   up. There is a bat file VCVARS32.BAT that sets most of it up
+#   for you. You can find this somewhere near DevStudio\VC\BIN
+# - RegSvr32 must also be along the path, often in WINDOWS\SYSTEM
+# - TCL has to be available too, if compiling for NEW_Z3950
+
+###########################################################
+############### Parameters 
+###########################################################
+
+DEBUG=0   # 0 for release, 1 for debug
+
+NEW_Z3950=1  # 0= use old asn files
+             # 1= generate files from *.asn (needs tcl)
+
+
+default: all
+
+all: dirs proto_h dll client server ztest 
+
+generate: generated_files
+
+###########################################################
+############### Directories
+###########################################################
+# The current directory is supposed to be something like
+# ..../Yaz/Win, everything is relative to that
+ROOTDIR=..   # The home of Yaz
+
+INCLDIR=$(ROOTDIR)\include  # our includes
+LIBDIR=$(ROOTDIR)\lib       # We produce .lib, .exp etc there
+BINDIR=$(ROOTDIR)\bin       # We produce exes and dlls there
+WINDIR=$(ROOTDIR)\win       # all these Win make things
+OBJDIR=$(WINDIR)\obj        # where we store intermediate files
+UNIXDIR=$(ROOTDIR)\unix     # corresponding unix things
+SRCDIR=$(ROOTDIR)           # for the case we move them under src
+
+ASNDIR=$(SRCDIR)\ASN
+COMSTACKDIR=$(SRCDIR)\COMSTACK
+ODRDIR=$(SRCDIR)\ODR
+UTILDIR=$(SRCDIR)\UTIL
+ZUTILDIR=$(SRCDIR)\ZUTIL
+RETDIR=$(SRCDIR)\RETRIEVAL
+Z3950DIR=$(SRCDIR)\Z39.50
+ILLDIR=$(SRCDIR)\ill
+
+CLIENTDIR=$(SRCDIR)\CLIENT
+SERVERDIR=$(SRCDIR)\SERVER
+ZTESTDIR=$(SRCDIR)\ZTEST
+
+TMPDIR=$(ROOTDIR)\win\tmp
+TMP=$(TMPDIR)
+
+###########################################################
+############### Targets - what to make
+###########################################################
+
+
+DLL=$(BINDIR)\Yaz.dll
+IMPLIB=$(LIBDIR)\Yaz.lib
+
+CLIENT=$(BINDIR)\yaz-client.exe
+SERVER=$(LIBDIR)\server.lib
+ZTEST=$(BINDIR)\yaz-ztest.exe
+PROTOH=$(INCLDIR)\yaz\proto.h
+
+# shortcut names defined here
+dll : $(DLL) 
+client: $(CLIENT)
+server: $(SERVER)
+ztest: $(ZTEST)
+proto_h: $(PROTOH)
+
+###########################################################
+############### Compiler and linker options 
+###########################################################
+
+
+### C and CPP compiler  (the same thing)
+# Note: $(CPP) has already been defined in the environment
+# (if you set things up right!)
+
+COMMON_C_OPTIONS=          \
+  /nologo /W3 /GX /FD /c   \
+  /D "WIN32" /D "_WINDOWS" \
+  /FR"$(OBJDIR)\\"         \
+  /Fo"$(OBJDIR)\\"         \
+  /Fd"$(OBJDIR)\\" 
+
+COMMON_C_INCLUDES= \
+  /I"$(SRCDIR)\include"
+
+DEBUG_C_OPTIONS=  \
+  /D "_DEBUG"      \
+  /MDd  /Od /YX /Zi /Gm
+
+RELEASE_C_OPTIONS=  \
+  /D "NDEBUG"        \
+  /MD /O2
+
+# /W3  = warning level
+# /GX  = Enable exception handling
+# /FD  = Generate file dependencies (what ever they are)
+# /c   = compile without linking
+# /FR  = Generate browse info (.sbr file that gets combined into .bsc)
+# /Fo  = object file name (or at least path)
+# /Fd  = debug database name (or path)
+# /MD  = Runtime library: Multithread DLL
+# /MDd = Runtime library: Multithread DLL (debug)
+# /Od  = Disable optimising (debug)
+# /O2  = Optimize for speed
+# /YX  = Automatic use of precomipled headers
+# /Gm  = Minimal rebuild (some cpp class stuff)
+# /Zi  = Program database for debuggers
+# /ZI  = Pgm database with special "edit&continue" stuff - not available in C5
+
+
+### Linker options
+LINK=link.exe
+
+LINK_LIBS= kernel32.lib user32.lib   gdi32.lib   winspool.lib \
+           comdlg32.lib advapi32.lib shell32.lib ole32.lib    \
+           oleaut32.lib uuid.lib     odbc32.lib  odbccp32.lib \
+           wsock32.lib  advapi32.lib
+
+COMMON_LNK_OPTIONS= /nologo \
+                    /subsystem:windows \
+                    /machine:i386 \
+			  /incremental:no
+
+DEBUG_LNK_OPTIONS= /debug 
+
+RELEASE_LNK_OPTIONS=  /pdb:none
+
+DLL_LINK_OPTIONS= /dll  
+CLIENT_LINK_OPTIONS = /subsystem:console  
+SERVER_LINK_OPTIONS = -lib 
+ZTEST_LINK_OPTIONS = /subsystem:console  
+
+# TCL
+TCL="C:\Program Files\Tcl\bin\tclsh82.exe"
+
+COMMON_TCL_OPTIONS= ..\util\yaz-comp -I$(INCLDIR) -i yaz
+
+# Final opt variables
+!if $(DEBUG)
+COPT=   $(COMMON_C_OPTIONS)   $(DEBUG_C_OPTIONS)     $(COMMON_C_INCLUDES)
+MTLOPT= $(COMMON_MTL_OPTIONS) $(DEBUG_MTL_OPTIONS)
+RCOPT=  $(COMMON_RC_OPTIONS)  $(DEBUG_RC_OPTIONS)
+LNKOPT= $(COMMON_LNK_OPTIONS) $(DEBUG_LNK_OPTIONS)   $(LNK_LIBS)
+TCLOPT= $(COMMON_TCL_OPTIONS)
+
+!else
+COPT=   $(COMMON_C_OPTIONS)   $(RELEASE_C_OPTIONS)   $(COMMON_C_INCLUDES) 
+MTLOPT= $(COMMON_MTL_OPTIONS) $(RELEASE_MTL_OPTIONS)
+RCOPT=  $(COMMON_RC_OPTIONS)  $(RELEASE_RC_OPTIONS)
+LNKOPT= $(COMMON_LNK_OPTIONS) $(RELEASE_LNK_OPTIONS) $(LNK_LIBS)
+TCLOPT= $(COMMON_TCL_OPTIONS)
+!endif
+
+
+
+###########################################################
+###############  Source and object modules
+###########################################################
+
+# Note: Ordinary source files are not specified here at 
+# all, make finds them in suitable dirs. The object modules
+# need to be specified, though
+
+YAZ_CLIENT_OBJS= \
+   $(OBJDIR)\client.obj
+
+YAZ_SERVER_OBJS= \
+	"$(OBJDIR)\eventl.obj" \
+	"$(OBJDIR)\requestq.obj" \
+	"$(OBJDIR)\service.obj" \
+	"$(OBJDIR)\seshigh.obj" \
+	"$(OBJDIR)\statserv.obj" \
+	"$(OBJDIR)\tcpdchk.obj" 
+
+ZTEST_OBJS= \
+	"$(OBJDIR)\read-grs.obj" \
+	"$(OBJDIR)\ztest.obj" 
+	
+
+YAZ_ASN_OBJS= \
+   $(OBJDIR)\proto.obj \
+   $(OBJDIR)\prt-acc.obj \
+   $(OBJDIR)\prt-add.obj \
+   $(OBJDIR)\prt-arc.obj \
+   $(OBJDIR)\prt-dat.obj \
+   $(OBJDIR)\prt-dia.obj \
+   $(OBJDIR)\prt-esp.obj \
+   $(OBJDIR)\prt-exd.obj \
+   $(OBJDIR)\prt-exp.obj \
+   $(OBJDIR)\prt-grs.obj \
+   $(OBJDIR)\prt-rsc.obj \
+   $(OBJDIR)\prt-univ.obj 
+
+YAZ_COMSTACK_OBJS= \
+   $(OBJDIR)\comstack.obj \
+   $(OBJDIR)\tcpip.obj \
+   $(OBJDIR)\waislen.obj 
+
+YAZ_ODR_OBJS= \
+   $(OBJDIR)\ber_any.obj \
+   $(OBJDIR)\ber_bit.obj \
+   $(OBJDIR)\ber_bool.obj \
+   $(OBJDIR)\ber_int.obj \
+   $(OBJDIR)\ber_len.obj \
+   $(OBJDIR)\ber_null.obj \
+   $(OBJDIR)\ber_oct.obj \
+   $(OBJDIR)\ber_oid.obj \
+   $(OBJDIR)\ber_tag.obj \
+   $(OBJDIR)\dumpber.obj \
+   $(OBJDIR)\odr.obj \
+   $(OBJDIR)\odr_any.obj \
+   $(OBJDIR)\odr_bit.obj \
+   $(OBJDIR)\odr_bool.obj \
+   $(OBJDIR)\odr_choice.obj \
+   $(OBJDIR)\odr_cons.obj \
+   $(OBJDIR)\odr_enum.obj \
+   $(OBJDIR)\odr_int.obj \
+   $(OBJDIR)\odr_mem.obj \
+   $(OBJDIR)\odr_null.obj \
+   $(OBJDIR)\odr_oct.obj \
+   $(OBJDIR)\odr_oid.obj \
+   $(OBJDIR)\odr_seq.obj \
+   $(OBJDIR)\odr_tag.obj \
+   $(OBJDIR)\odr_use.obj \
+   $(OBJDIR)\odr_util.obj 
+
+YAZ_UTIL_OBJS= \
+   $(OBJDIR)\atoin.obj \
+   $(OBJDIR)\log.obj \
+   $(OBJDIR)\marcdisp.obj \
+   $(OBJDIR)\nmem.obj \
+   $(OBJDIR)\nmemsdup.obj \
+   $(OBJDIR)\oid.obj \
+   $(OBJDIR)\options.obj \
+   $(OBJDIR)\readconf.obj \
+   $(OBJDIR)\tpath.obj \
+   $(OBJDIR)\wrbuf.obj \
+   $(OBJDIR)\xmalloc.obj \
+   $(OBJDIR)\matchstr.obj 
+
+YAZ_ZUTIL_OBJS= \
+   $(OBJDIR)\diagbib1.obj \
+   $(OBJDIR)\zget.obj \
+   $(OBJDIR)\prt-ext.obj \
+   $(OBJDIR)\logrpn.obj \
+   $(OBJDIR)\pquery.obj \
+   $(OBJDIR)\yaz-ccl.obj \
+   $(OBJDIR)\otherinfo.obj
+
+YAZ_RET_OBJS= \
+   $(OBJDIR)\d1_absyn.obj\
+   $(OBJDIR)\d1_attset.obj\
+   $(OBJDIR)\d1_doespec.obj\
+   $(OBJDIR)\d1_espec.obj\
+   $(OBJDIR)\d1_expout.obj\
+   $(OBJDIR)\d1_grs.obj\
+   $(OBJDIR)\d1_handle.obj\
+   $(OBJDIR)\d1_map.obj\
+   $(OBJDIR)\d1_marc.obj\
+   $(OBJDIR)\d1_prtree.obj\
+   $(OBJDIR)\d1_read.obj\
+   $(OBJDIR)\d1_soif.obj\
+   $(OBJDIR)\d1_sumout.obj\
+   $(OBJDIR)\d1_sutrs.obj\
+   $(OBJDIR)\d1_tagset.obj\
+   $(OBJDIR)\d1_varset.obj\
+   $(OBJDIR)\d1_write.obj\
+   $(OBJDIR)\d1_if.obj
+
+Z3950_OBJS= \
+   $(OBJDIR)\z-date.obj\
+   $(OBJDIR)\z-univ.obj\
+   $(OBJDIR)\zes-update.obj\
+   $(OBJDIR)\z-accdes1.obj \
+   $(OBJDIR)\z-accform1.obj \
+   $(OBJDIR)\z-acckrb1.obj \
+   $(OBJDIR)\z-core.obj \
+   $(OBJDIR)\z-diag1.obj \
+   $(OBJDIR)\z-espec1.obj \
+   $(OBJDIR)\z-estask.obj \
+   $(OBJDIR)\z-exp.obj \
+   $(OBJDIR)\z-grs.obj \
+   $(OBJDIR)\z-opac.obj \
+   $(OBJDIR)\z-uifr1.obj \
+   $(OBJDIR)\z-rrf1.obj \
+   $(OBJDIR)\z-rrf2.obj \
+   $(OBJDIR)\z-sum.obj \
+   $(OBJDIR)\z-sutrs.obj \
+   $(OBJDIR)\zes-expi.obj \
+   $(OBJDIR)\zes-exps.obj \
+   $(OBJDIR)\zes-order.obj \
+   $(OBJDIR)\zes-pquery.obj \
+   $(OBJDIR)\zes-psched.obj \
+   $(OBJDIR)\zes-pset.obj \
+   $(OBJDIR)\zes-update0.obj 
+
+ILL_OBJS= \
+   $(OBJDIR)\ill-get.obj\
+   $(OBJDIR)\ill-core.obj\
+   $(OBJDIR)\item-req.obj
+
+COMMON_YAZ_OBJS= \
+   $(YAZ_COMSTACK_OBJS) \
+   $(YAZ_ODR_OBJS) \
+   $(YAZ_UTIL_OBJS) \
+   $(YAZ_ZUTIL_OBJS) \
+   $(YAZ_RET_OBJS)
+
+!if $(NEW_Z3950)
+YAZ_OBJS= \
+	$(COMMON_YAZ_OBJS) \
+	$(ILL_OBJS) \
+	$(Z3950_OBJS)
+!else
+YAZ_OBJS= \
+	$(COMMON_YAZ_OBJS) \
+	$(YAZ_ASN_OBJS)
+!endif
+
+DLL_OBJS= $(YAZ_OBJS)
+
+ALL_OBJS= \
+	$(YAZ_OBJS) \
+	$(YAZ_CLIENT_OBJS) \
+	$(YAZ_SERVER_OBJS) \
+	$(ZTEST_OBJS)
+
+
+##########################################################
+############## proto.h
+##########################################################
+
+!if $(NEW_Z3950)
+$(PROTOH): makefile $(INCLDIR)\yaz\z-proto.h
+	type $(INCLDIR)\yaz\z-proto.h > $(PROTOH)
+!else
+$(PROTOH): makefile $(INCLDIR)\yaz\prt-proto.h 
+	type $(INCLDIR)\yaz\prt-proto.h > $(PROTOH)
+!endif
+
+
+###########################################################
+############### Generated C and H files
+###########################################################
+
+Z3950_C_DIR=$(Z3950DIR)   
+ILL_C_DIR=$(ILLDIR)
+#!!! Should be moved to OBJ, but that requires too much trickery
+
+# Files generated from datetime.asn
+DATETIME_H_FILES = $(INCLDIR)\yaz\z-date.h
+DATETIME_C_FILES = $(Z3950_C_DIR)\z-date.c
+
+# Files generated from univres.asn
+UNIVRES_H_FILES = $(INCLDIR)\yaz\z-univ.h
+UNIVRES_C_FILES = $(Z3950_C_DIR)\z-univ.c
+
+# Files generated from esupdate.asn
+ESUPDATE_H_FILES = $(INCLDIR)\yaz\zes-update.h
+ESUPDATE_C_FILES = $(Z3950_C_DIR)\zes-update.c
+
+# Files created from z3950v3.asn
+Z3950V3_H_FILES= \
+   $(INCLDIR)\yaz\z-accdes1.h \
+   $(INCLDIR)\yaz\z-core.h
+
+Z3950V3_C_FILES= \
+   $(Z3950_C_DIR)\z-accdes1.c \
+   $(Z3950_C_DIR)\z-accform1.c \
+   $(Z3950_C_DIR)\z-acckrb1.c \
+   $(Z3950_C_DIR)\z-core.c \
+   $(Z3950_C_DIR)\z-diag1.c \
+   $(Z3950_C_DIR)\z-espec1.c \
+   $(Z3950_C_DIR)\z-estask.c \
+   $(Z3950_C_DIR)\z-exp.c \
+   $(Z3950_C_DIR)\z-grs.c \
+   $(Z3950_C_DIR)\z-opac.c \
+   $(Z3950_C_DIR)\z-uifr1.c \
+   $(Z3950_C_DIR)\z-rrf1.c \
+   $(Z3950_C_DIR)\z-rrf2.c \
+   $(Z3950_C_DIR)\z-sum.c \
+   $(Z3950_C_DIR)\z-sutrs.c \
+   $(Z3950_C_DIR)\zes-expi.c \
+   $(Z3950_C_DIR)\zes-exps.c \
+   $(Z3950_C_DIR)\zes-order.c \
+   $(Z3950_C_DIR)\zes-pquery.c \
+   $(Z3950_C_DIR)\zes-psched.c \
+   $(Z3950_C_DIR)\zes-pset.c \
+   $(Z3950_C_DIR)\zes-update0.c 
+
+ILL_CORE_H_FILES= \
+   $(INCLDIR)\yaz\ill-core.h
+
+ILL_CORE_C_FILES= \
+   $(ILL_C_DIR)\ill-core.c
+
+ITEM_REQ_H_FILES= \
+   $(INCLDIR)\yaz\item-req.h
+
+ITEM_REQ_C_FILES= \
+   $(ILL_C_DIR)\item-req.c
+
+DATETIME_FILES = $(DATETIME_H_FILES) $(DATETIME_C_FILES)
+UNIVRES_FILES = $(UNIVRES_H_FILES) $(UNIVRES_C_FILES)
+ESUPDATE_FILES = $(ESUPDATE_H_FILES) $(ESUPDATE_C_FILES)
+Z3950V3_FILES= $(Z3950V3_C_FILES) $(Z3950V3_H_FILES)
+ILL_CORE_FILES= $(ILL_CORE_C_FILES) $(ILL_CORE_H_FILES)
+ITEM_REQ_FILES= $(ITEM_REQ_C_FILES) $(ITEM_REQ_H_FILES)
+
+GENERATED_C_FILES= \
+   $(Z3950V3_C_FILES)  \
+   $(ESUPDATE_C_FILES) \
+   $(UNIVRES_C_FILES)  \
+   $(DATETIME_C_FILES)
+
+GENERATED_H_FILES= \
+   $(Z3950V3_H_FILES)  \
+   $(ESUPDATE_H_FILES) \
+   $(UNIVRES_H_FILES)  \
+   $(DATETIME_H_FILES)
+
+generated_files: \
+	$(GENERATED_H_FILES) \
+	$(GENERATED_C_FILES) \
+	$(PROTOH)
+
+###########################################################
+############### Compiling 
+###########################################################
+
+# Note: This defines where to look for the necessary
+# source files. Funny way of doing it, but it works.
+
+# DLL sources
+{$(SRCDIR)}.cpp{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $<
+
+# Yaz client
+{$(CLIENTDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< /D"_CONSOLE"
+
+# Ztest
+{$(ZTESTDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< /D"_CONSOLE"
+
+# Server
+{$(SERVERDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+# Various YAZ source directories
+{$(ASNDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+{$(COMSTACKDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+{$(ODRDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+{$(UTILDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+{$(ZUTILDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP)	$(COPT) $< 
+
+{$(RETDIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $<
+
+{$(Z3950_C_DIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+{$(ILL_C_DIR)}.c{$(OBJDIR)}.obj:
+	@$(CPP) $(COPT) $< 
+
+############### ASN-generated files
+
+$(Z3950V3_FILES): $(Z3950DIR)\z3950v3.asn
+	@cd $(Z3950DIR)
+	$(TCL) $(TCLOPT) -d z.tcl z3950v3.asn
+	@cd $(WINDIR)
+
+$(DATETIME_FILES): $(Z3950DIR)\datetime.asn
+	@cd $(Z3950DIR)
+	$(TCL) $(TCLOPT) -d z.tcl datetime.asn
+	@cd $(WINDIR)
+
+$(UNIVRES_FILES): $(Z3950DIR)\univres.asn
+	@cd $(Z3950DIR)
+	$(TCL) $(TCLOPT) -d z.tcl univres.asn
+	@cd $(WINDIR)
+
+$(ESUPDATE_FILES): $(Z3950DIR)\esupdate.asn
+	@cd $(Z3950DIR)
+	$(TCL) $(TCLOPT) -d z.tcl esupdate.asn
+	@cd $(WINDIR)
+
+$(ILL_CORE_FILES): $(ILLDIR)\ill9702.asn
+	@cd $(ILLDIR)
+	$(TCL) $(TCLOPT) -d ill.tcl ill9702.asn
+	@cd $(WINDIR)
+
+$(ITEM_REQ_FILES): $(ILLDIR)\item-req.asn
+	@cd $(ILLDIR)
+	$(TCL) $(TCLOPT) -d ill.tcl item-req.asn
+	@cd $(WINDIR)
+
+###########################################################
+############### Linking
+###########################################################
+
+$(DLL) $(IMPLIB): "$(BINDIR)" $(DLL_OBJS) 
+	@echo Linking the dll  $(DLL)
+	$(LINK) @<<
+		$(LNKOPT) 
+		$(LINK_LIBS) 
+		$(DLL_LINK_OPTIONS)
+		$(DLL_OBJS) 
+		/out:$(DLL) 
+		/implib:"$(LIBDIR)/yaz.lib"
+		/pdb:"$(LIBDIR)/yaz.pdb" 
+		/map:"$(LIBDIR)/yaz.map"  
+<<
+
+$(CLIENT) : "$(BINDIR)" $(YAZ_CLIENT_OBJS) 
+	@echo Linking the client  $(CLIENT)
+	$(LINK) @<<
+        $(LNKOPT) 
+		$(CLIENT_LINK_OPTIONS)
+		$(LINK_LIBS) 
+		$(IMPLIB)
+		$(YAZ_CLIENT_OBJS)
+
+		/pdb:"$(LIBDIR)/yaz-client.pdb"
+
+		/map:"$(LIBDIR)/yaz-client.map"
+		/out:$(CLIENT)
+<<
+
+$(ZTEST) : "$(BINDIR)" $(ZTEST_OBJS) $(SERVER) $(DLL)
+	@echo Linking the ztest  $(ZTEST)
+	$(LINK) @<<
+        $(LNKOPT) 
+		$(ZTEST_LINK_OPTIONS)
+		$(LINK_LIBS) 
+		shell32.lib
+		$(IMPLIB)
+		$(SERVER)
+		$(ZTEST_OBJS) 
+
+		/implib:"$(LIBDIR)/yaz-ztest.lib"
+
+		/pdb:"$(LIBDIR)/yaz-ztest.pdb"
+
+		/map:"$(LIBDIR)/yaz-ztest.map"
+		/out:$(ZTEST) 
+<<
+
+
+$(SERVER) : "$(BINDIR)" $(YAZ_SERVER_OBJS) 
+	@echo Linking the server  $(SERVER)
+	$(LINK) $(SERVER_LINK_OPTIONS) @<<
+		/nologo
+		$(IMPLIB)
+		$(YAZ_SERVER_OBJS) 
+		/out:$(SERVER) 
+<<
+
+# note that this links a lib, so it uses completely different options.
+
+
+
+###########################################################
+############### Special operations
+###########################################################
+
+
+############## clean
+clean:
+	del $(DLL) 
+	del $(CLIENT)
+	del $(SERVER)
+	del $(ZTEST)
+	del $(TMPDIR)\*.
+
+	del $(LIBDIR)\*.MAP
+
+	del $(LIBDIR)\*.LIB
+	del $(OBJDIR)\*.OBJ
+
+	del $(PROTOH)
+
+realclean: clean
+	del $(Z3950_C_DIR)\*.c
+	del $(Z3950_C_DIR)\*.h
+	del $(INCLDIR)\yaz\z-accdes1.h
+	del $(INCLDIR)\yaz\z-core.h
+	del $(DATETIME_H_FILES)
+	del $(UNIVRES_H_FILES)
+	del $(ESUPDATE_H_FILES)
+
+# Because DOS del will only accept one file name to delete,
+# the _H_ files work only on sets that have just one file.
+# Z3950_H_FILES had to be spelled out. One more point for MS!
+
+########### check directories and create if needed
+dirs: $(OBJDIR) $(WINDIR) $(LIBDIR) $(BINDIR) $(TMPDIR)
+
+$(OBJDIR) $(WINDIR) $(LIBDIR) $(BINDIR) $(TMPDIR):
+ 	if not exist "$@/$(NUL)" mkdir "$@"
+
+
+###########################################################
+############### Explicit dependencies
+###########################################################
+
+$(ALL_OBJS): makefile $(PROTOH)
+
+# force recompilation of everything, if makefile changed
+
+$(Z3950_OBJS): $(GENERATED_C_FILES) $(GENERATED_H_FILES)
+
+$(ILL_OBJS): $(ILL_CORE_FILES) $(ITEM_REQ_FILES)
+
+!if $(NEW_Z3950)
+$(PROTOH): $(GENERATED_C_FILES) $(GENERATED_H_FILES)
+!endif
+# makes sure we generate before compiling anything, as the
+# new proto.h refers to the generated files, and is included
+# in various places
+
+###########################################################
+############### Log
+###########################################################
+#
+# $Log$
+# Revision 1.1  2000/08/03 03:12:13  johnmcp
+# Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+#
+# Revision 1.14  2000/03/02 08:48:21  adam
+# Renamed ASN.1 compiler to yaz-comp (used to be yc.tcl).
+#
+# Revision 1.13  2000/02/28 11:13:03  adam
+# Removed odr_priv.obj.
+#
+# Revision 1.12  2000/01/06 11:27:16  adam
+# Updated for ILL.
+#
+# Revision 1.11  1999/12/21 14:16:20  ian
+# Changed retrieval module to allow data1 trees with no associated absyn.
+# Also added a simple interface for extracting values from data1 trees using
+# a string based tagpath.
+#
+# Revision 1.10  1999/12/08 13:10:48  adam
+# New version.
+#
+# Revision 1.9  1999/11/30 13:47:12  adam
+# Improved installation. Moved header files to include/yaz.
+#
+# Revision 1.8  1999/07/21 08:48:02  adam
+# Removed dmalloc.obj.
+#
+# Revision 1.7  1999/06/09 15:10:08  heikki
+# Cleaning up. Seems to work all right
+#
+# Revision 1.6  1999/06/09 13:33:32  heikki
+# Compiles and links both old and new type stuff all right
+#
+# Revision 1.5  1999/06/09 11:05:30  heikki
+# At least it can compile
+#
+# Revision 1.4  1999/06/09 09:41:09  heikki
+# More work on the ASN-generated files.
+#
+# Revision 1.3  1999/06/08 14:32:30  heikki
+# Proto.h works all right, removed linker warnings from server.lib
+#
+# Revision 1.2  1999/06/08 14:07:24  heikki
+# Renamed a pile of files
+# Tmpdir (to get around Ms leaving temp files around, and crashing
+# when too many with same number...)
+#
+# Revision 1.1  1999/06/08 12:15:41  heikki
+# Renamed to makefile (.nothing) (from .mak)
+# Working on the proto.h problems and alternative confiigurations
+#
+# Revision 1.5  1999/06/04 10:04:28  heikki
+# Cleaning up
+#
+# Revision 1.4  1999/06/02 13:23:29  heikki
+# Debug options for C compiler
+#
+# Revision 1.3  1999/05/19 08:26:22  heikki
+# Added comments
+#
+#
+
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/windows.txt
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/windows.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/windows.txt	(revision 21083)
@@ -0,0 +1,56 @@
+YAZ Compilation guidelines for winNT/95.
+
+This distribution of YAZ includes makefiles that works with Visual
+C++ version 5 and 6. The makefile is located in sub directory 'win'.
+
+If you wish to make modifications to the make process you should
+edit makefile before proceeding. For example, a DEBUG version of YAZ
+can be build by modifying the line 'DEBUG=0' to 'DEBUG=1' in the
+makefile.
+
+Run nmake in that directory (in a Command prompt for example). Eg:
+    >CD \YAZ\WIN
+    >NMAKE
+
+Make sure that the environment variables PATH, LIB and INCLUDE are
+set properly. They *should* be set by the Visual C++ installation.
+Programs cl.exe, link.exe and others must be found in the PATH. The
+standard includes files, standard libraries must be found in INCLUDE
+and LIB respectively.
+
+The following components are build by the nmake process:
+
+yaz.dll - This DLL is made of the source in all sub directories except
+         for 'server', 'client' and 'ztest'. To export public functions
+         the header files contain the modifier YAZ_EXPORT which is
+         defined in yconfig.h. The value of this modifier,
+         __declspec(dllexport), is probably specific to Visual C++. 
+
+server.lib - The server library, which includes the source from
+         'server'.  Unlike the UNIX version, the server library is
+         multi-threaded.
+
+yaz-client.exe - A Z39.50 client console application. It is linked with
+         the import library yaz.lib. This application searches for yaz.dll
+         during runtime.
+
+yaz-ztest.exe - The Z39.50 test server as a console application. It is
+         linked with the import library yaz.lib and the regular library
+         server.lib. When running yaz-ztest make sure it is able to find
+         the record test files dummy-records, dummy-grs, and dummy-words
+         in the current directory. 
+
+         As an option ztest may be installed as an NT service
+         (not Windows 95). Use 'ztest -install <otherargs>' to install
+         it and 'ztest -remove <otherargs>' to remove it again. Since
+         NT runs the service program in some weird directory, such as
+         \winnt\system32, it's probably a good idea to use the option
+         '-w' to change to some other directory. For example
+
+            yaz-ztest -install -w d:\proj\yaz\ztest -l ztest.out tcp:@:210
+
+         which specifies both working directory (d:\proj\yaz\ztest) 
+         and a log file (ztest.out). The server is started on port 210.
+
+After successful compilation all executables and DLL's are located
+in sub YAZ\BIN. Libraries are located in YAZ\LIB.
Index: /main/tags/2.38/gsdl/packages/yaz/yaz.spec
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/yaz.spec	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/yaz.spec	(revision 21083)
@@ -0,0 +1,41 @@
+Summary: YAZ - A Z39.50 Library
+Name: yaz
+Version: 1.6
+Release: 1
+Copyright: BSD
+Group: Development/Libraries
+Vendor: Index Data ApS <info@indexdata.dk>
+Url: http://www.indexdata.dk/yaz/
+Source: yaz-1.6.tar.gz
+BuildRoot: /var/tmp/%{name}-%{version}-root
+Packager: Adam Dickmeiss <adam@indexdata.dk>
+
+%description
+The YAZ package is a developers' library for developing client - and
+server application using the ANSI/NISO Z39.50 protocol for Information
+Retrieval.
+
+%prep
+%setup
+
+%build
+
+CFLAGS="$RPM_OPT_FLAGS" \
+ ./configure --prefix=/usr --enable-yc --enable-tcpd
+make CFLAGS="$RPM_OPT_FLAGS"
+
+%install
+rm -fr $RPM_BUILD_ROOT
+make prefix=$RPM_BUILD_ROOT/usr install
+
+%files
+%defattr(-,root,root)
+%doc README LICENSE CHANGELOG TODO
+%config /usr/share/yaz/tab
+/usr/bin/yaz-client
+/usr/bin/yaz-ztest
+/usr/bin/yaz-config
+/usr/bin/yaz-comp
+/usr/lib/libyaz.a
+/usr/include/yaz
+/usr/share/yaz/doc
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.am	(revision 21083)
@@ -0,0 +1,30 @@
+## $Id$
+
+INCLUDES=-I../include
+
+noinst_LIBRARIES = libasn.a
+
+EXTRA_DIST=datetime.asn esupdate.asn univres.asn z3950v3.asn z.tcl
+
+libasn_a_SOURCES = z-accdes1.c z-accform1.c z-acckrb1.c z-core.c \
+ z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-opac.c z-uifr1.c \
+ z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c \
+ zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c \
+ zes-pset.c zes-update0.c z-date.c z-univ.c zes-update.c
+
+z-accdes1.c z-accform1.c z-acckrb1.c z-core.c \
+ z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-opac.c z-uifr1.c \
+ z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c \
+ zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c \
+ zes-pset.c zes-update0.c \
+ ../include/yaz/z-accdes1.h: z.tcl z3950v3.asn ../util/yaz-comp
+	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) z3950v3.asn
+
+z-date.c ../include/yaz/z-date.h: z.tcl datetime.asn ../util/yaz-comp
+	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) datetime.asn
+
+z-univ.c ../include/yaz/z-univ.h: z.tcl univres.asn ../util/yaz-comp
+	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) univres.asn
+
+zes-update.c ../include/yaz/zes-update.h: z.tcl esupdate.asn ../util/yaz-comp
+	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) esupdate.asn
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/Makefile.in	(revision 21083)
@@ -0,0 +1,289 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+INCLUDES = -I../include
+
+noinst_LIBRARIES = libasn.a
+
+EXTRA_DIST = datetime.asn esupdate.asn univres.asn z3950v3.asn z.tcl
+
+libasn_a_SOURCES = z-accdes1.c z-accform1.c z-acckrb1.c z-core.c  z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-opac.c z-uifr1.c  z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c  zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c  zes-pset.c zes-update0.c z-date.c z-univ.c zes-update.c
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libasn_a_LIBADD = 
+libasn_a_OBJECTS =  z-accdes1.o z-accform1.o z-acckrb1.o z-core.o \
+z-diag1.o z-espec1.o z-estask.o z-exp.o z-grs.o z-opac.o z-uifr1.o \
+z-rrf1.o z-rrf2.o z-sum.o z-sutrs.o zes-expi.o zes-exps.o zes-order.o \
+zes-pquery.o zes-psched.o zes-pset.o zes-update0.o z-date.o z-univ.o \
+zes-update.o
+AR = ar
+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 = tar
+GZIP_ENV = --best
+SOURCES = $(libasn_a_SOURCES)
+OBJECTS = $(libasn_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps z39.50/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libasn.a: $(libasn_a_OBJECTS) $(libasn_a_DEPENDENCIES)
+	-rm -f libasn.a
+	$(AR) cru libasn.a $(libasn_a_OBJECTS) $(libasn_a_LIBADD)
+	$(RANLIB) libasn.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 = z39.50
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
+
+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
+
+
+#z-accdes1.c z-accform1.c z-acckrb1.c z-core.c \
+# z-diag1.c z-espec1.c z-estask.c z-exp.c z-grs.c z-opac.c z-uifr1.c \
+# z-rrf1.c z-rrf2.c z-sum.c z-sutrs.c \
+# zes-expi.c zes-exps.c zes-order.c zes-pquery.c zes-psched.c \
+# zes-pset.c zes-update0.c \
+# ../include/yaz/z-accdes1.h: z.tcl z3950v3.asn ../util/yaz-comp
+#	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) z3950v3.asn
+#
+#z-date.c ../include/yaz/z-date.h: z.tcl datetime.asn ../util/yaz-comp
+#	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) datetime.asn
+#
+#z-univ.c ../include/yaz/z-univ.h: z.tcl univres.asn ../util/yaz-comp
+#	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) univres.asn
+#
+#zes-update.c ../include/yaz/zes-update.h: z.tcl esupdate.asn ../util/yaz-comp
+#	../util/yaz-comp -d z.tcl -i yaz -I ../include $(YCFLAGS) esupdate.asn
+#
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/datetime.asn
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/datetime.asn	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/datetime.asn	(revision 21083)
@@ -0,0 +1,82 @@
+UserInfoFormat-dateTime
+{Z39-50-userInfoFormat dateTime (6)} DEFINITIONS ::=
+BEGIN
+IMPORTS IntUnit FROM Z39-50-APDU-1995;
+
+DateTime ::= SEQUENCE{
+     date [1]  Z3950Date OPTIONAL,
+     time [2]  Z3950Time OPTIONAL
+                    -- one or the other, or both
+          }
+
+Z3950Date ::= SEQUENCE{
+ year         [1] IMPLICIT INTEGER,
+                    -- For "positive" years, i.e. 1 AD or later, supply
+                    -- the absolute year, e.g. If the year is 1995, supply
+                    -- the integer 1995; the value 95 would indicate the
+                    -- year 0095.
+                    -- For "negative" years, e.g. 1 BC or earlier, -1
+                    -- represents 1 BC, -2 represents 2 BC, etc. Zero is
+                    -- invalid, because there was no year zero.
+ partOfYear   [2] CHOICE{ -- may be omitted if only year is significant
+        monthAndDay [1]   IMPLICIT SEQUENCE{
+                       month [2]  IMPLICIT INTEGER, 
+                                   -- value 1-12
+                       day   [3]  IMPLICIT INTEGER OPTIONAL
+                                   -- may be omitted if only year and month
+                                   -- are significant. Value 1-31.
+                                           },
+        julianDay   [2]   IMPLICIT INTEGER, -- Value 1 - 366.
+        weekNumber  [3]   IMPLICIT INTEGER, -- Value 1 - 53. 
+        quarter     [4] CHOICE{
+                       first    [1] IMPLICIT NULL,
+                       second   [2] IMPLICIT NULL,
+                       third    [3] IMPLICIT NULL,
+                       fourth   [4] IMPLICIT NULL},
+        season      [5] CHOICE{
+                       winter   [1] IMPLICIT NULL,
+                       spring   [2] IMPLICIT NULL,
+                       summer   [3] IMPLICIT NULL,
+                       autumn   [4] IMPLICIT NULL}
+                                              } OPTIONAL, 
+ flags        [3] IMPLICIT SEQUENCE{
+     circa          [1]   IMPLICIT NULL OPTIONAL,
+                          -- if this flag is set then the date is "approximate".
+     era            [2]   IMPLICIT CHOICE{
+                          -- If era occurs, partOfYear should not occur.
+                          decade         [1] IMPLICIT NULL,
+                                              -- year must be multiple of 10.
+                                              -- For example, 1900 refers to
+                                              -- the decade covering the years
+                                              -- 1900 through 1909.
+                          century        [2] IMPLICIT NULL,
+                                              -- year must be multiple of 100.
+                          millennium     [3] IMPLICIT NULL
+                                              -- year must be multiple of 1000.
+                                                    } OPTIONAL
+                                              } OPTIONAL
+                                }
+
+
+Z3950Time ::= SEQUENCE{
+     hour           [1] IMPLICIT INTEGER,
+                             -- Value 0-23. 
+     minute         [2]  IMPLICIT INTEGER OPTIONAL,
+                             -- value 0-59. May be omitted when hour only is
+                             -- significant (in which case second and
+                             -- partOfSecond must also be omitted). 
+     second         [3]  IMPLICIT INTEGER OPTIONAL,
+                             -- value 0-59. May be omitted when only hour, or
+                             -- hour and minute, is significant (in which case
+                             -- partOfSecond must also be omitted).
+     partOfSecond   [4]  IMPLICIT IntUnit OPTIONAL,
+                             -- Use Unit System = 'si', Unit type = 'time'; 
+                             -- Unit = 'second', with appropriate value and
+                             -- scale factor.
+     zone           [5]  CHOICE{
+                              local      [1]  IMPLICIT NULL,
+                              utc        [2]  IMPLICIT NULL,
+
+                              utcOffset  [3]  IMPLICIT INTEGER  -- in minutes
+                                                    }}             
+END                              
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/esupdate.asn
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/esupdate.asn	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/esupdate.asn	(revision 21083)
@@ -0,0 +1,103 @@
+ESFormat-Update
+{Z39-50-extendedService Update (5) revisions (1)  revision-1 (1)} DEFINITIONS ::=
+  -- oid is 1.2.840.10003.9.5.1.1
+BEGIN
+IMPORTS DiagRec, InternationalString
+FROM Z39-50-APDU-1995;
+Update ::= CHOICE{
+    esRequest      [1] IMPLICIT SEQUENCE{
+       toKeep         [1] OriginPartToKeep,
+       notToKeep      [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+                       originPart     [1]
+                                   OriginPartToKeep,
+                       targetPart     [2] TargetPart}}
+
+OriginPartToKeep ::= SEQUENCE{
+action                  [1] IMPLICIT INTEGER{
+                                recordInsert    (1),
+                                recordReplace   (2),
+                                recordDelete    (3),
+                                elementUpdate   (4),
+                                specialUpdate   (5)},
+ databaseName           [2] IMPLICIT InternationalString,
+ schema                 [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+ elementSetName         [4] IMPLICIT InternationalString OPTIONAL,
+ actionQualifier        [5] IMPLICIT EXTERNAL OPTIONAL}
+
+OriginPartNotToKeep ::= SuppliedRecords
+
+TargetPart ::= SEQUENCE{
+  updateStatus        [1] IMPLICIT INTEGER{
+                          success (1),
+                          partial (2),
+                          failure (3)},
+  globalDiagnostics   [2] IMPLICIT SEQUENCE OF
+                              DiagRec OPTIONAL,
+                    -- These are non-surrogate
+                    -- diagnosticsrelating to the task,
+                    -- not to individual records.
+  taskPackageRecords  [3] IMPLICIT SEQUENCE OF
+TaskPackageRecordStructure
+                    -- There should be a
+                    -- TaskPackageRecordStructure
+                    -- for every record supplied.
+                    -- The target should create
+                    -- such a structure for every
+                    -- record immediately upon
+                    -- creating the task package
+                    -- to include correlation
+                    -- information and status.
+                    -- The record itself would not
+                    -- be included until processing
+                    -- for that record is complete.
+               }
+
+-- Auxiliary definitions for Update
+SuppliedRecords ::= SEQUENCE OF SEQUENCE{
+  recordId     [1] CHOICE{
+                number  [1] IMPLICIT INTEGER,
+                string  [2] IMPLICIT  InternationalString,
+                opaque  [3] IMPLICIT OCTET STRING} OPTIONAL,
+  supplementalId [2] CHOICE{
+                 timeStamp       [1] IMPLICIT  GeneralizedTime,
+                 versionNumber   [2] IMPLICIT InternationalString,
+                 previousVersion [3] IMPLICIT EXTERNAL} OPTIONAL,
+  correlationInfo   [3] IMPLICIT CorrelationInfo OPTIONAL,
+  record            [4] IMPLICIT EXTERNAL}
+
+CorrelationInfo ::= SEQUENCE{
+            -- origin may supply one or both for any record:
+  note [1] IMPLICIT InternationalString OPTIONAL,
+  id   [2] IMPLICIT INTEGER OPTIONAL}
+
+TaskPackageRecordStructure ::= SEQUENCE{
+     recordOrSurDiag  [1] CHOICE {
+                    record     [1] IMPLICIT EXTERNAL,
+                      -- Choose 'record' if
+                      -- recordStatus is 'success', and
+                      -- elementSetName was supplied.
+
+                  surrogateDiagnostics   [2] IMPLICIT
+                              SEQUENCE OF DiagRec
+                         -- Choose 'SurrogateDiagnostics', if
+                         -- RecordStatus is failure.
+                                } OPTIONAL,
+                -- The parameter recordOrSurDiag
+                    -- will thus be omitted only if
+                    -- 'elementSetName' was omitted and
+                    -- recordStatus is 'success'; or
+                    --if record status is 'queued'
+                    -- or in 'process'.
+     correlationInfo [2] IMPLICIT
+                         CorrelationInfo OPTIONAL,
+                    -- This should be included
+                    -- if it was supplied by the origin.
+     recordStatus    [3] IMPLICIT INTEGER{
+                                        success   (1),
+                                        queued    (2),
+                                        inProcess (3),
+                                        failure   (4)},
+      supplementalDiagnostics   [4] IMPLICIT
+                SEQUENCE OF DiagRec OPTIONAL}
+END
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/univres.asn
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/univres.asn	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/univres.asn	(revision 21083)
@@ -0,0 +1,23 @@
+ResourceReport-Format-Universe-1
+{Z39-50-resourceReport universe-1 (1000)} DEFINITIONS ::=
+BEGIN
+IMPORTS StringOrNumeric FROM Z39-50-APDU-1995;
+--
+
+UniverseReportHits ::= SEQUENCE {
+	database	StringOrNumeric,
+	hits	StringOrNumeric
+}
+
+UniverseReportDuplicate ::= SEQUENCE {
+	hitno StringOrNumeric
+}
+
+UniverseReport ::= SEQUENCE {
+	totalHits INTEGER,
+	report CHOICE {
+		databaseHits 	[0] IMPLICIT UniverseReportHits,
+		duplicate 		[1] IMPLICIT UniverseReportDuplicate
+	}
+}
+END
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accdes1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accdes1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accdes1.c	(revision 21083)
@@ -0,0 +1,35 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: AccessControlFormat-des-1 */
+
+#include <yaz/z-accdes1.h>
+
+int z_DES_RN_Object (ODR o, Z_DES_RN_Object **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DES_RN_Object_challenge,
+		(Odr_fun) z_DRNType, "challenge"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_DES_RN_Object_response,
+		(Odr_fun) z_DRNType, "response"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DRNType (ODR o, Z_DRNType **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->userId, ODR_CONTEXT, 1, 1, "userId") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->salt, ODR_CONTEXT, 2, 1, "salt") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->randomNumber, ODR_CONTEXT, 3, 0, "randomNumber") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accform1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accform1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-accform1.c	(revision 21083)
@@ -0,0 +1,147 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: AccessControlFormat-prompt-1 */
+
+#include <yaz/z-accform1.h>
+
+int z_PromptObject1 (ODR o, Z_PromptObject1 **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptObject1_challenge,
+		(Odr_fun) z_Challenge1, "challenge"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptObject1_response,
+		(Odr_fun) z_Response1, "response"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ChallengeUnit1 (ODR o, Z_ChallengeUnit1 **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ChallengeUnit1_character,
+		(Odr_fun) z_InternationalString, "character"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ChallengeUnit1_encrypted,
+		(Odr_fun) z_Encryption, "encrypted"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PromptId,
+			&(*p)->promptId, ODR_CONTEXT, 1, 0, "promptId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->defaultResponse, ODR_CONTEXT, 2, 1, "defaultResponse") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 3, "promptInfo") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->regExpr, ODR_CONTEXT, 4, 1, "regExpr") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->responseRequired, ODR_CONTEXT, 5, 1, "responseRequired") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->allowedValues,
+		  &(*p)->num_allowedValues, "allowedValues") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->shouldSave, ODR_CONTEXT, 7, 1, "shouldSave") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->dataType, ODR_CONTEXT, 8, 1, "dataType") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->diagnostic, ODR_CONTEXT, 9, 1, "diagnostic") &&
+		odr_sequence_end (o);
+}
+
+int z_Challenge1 (ODR o, Z_Challenge1 **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ChallengeUnit1, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ResponseUnit1 (ODR o, Z_ResponseUnit1 **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ResponseUnit1_string,
+		(Odr_fun) z_InternationalString, "string"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ResponseUnit1_accept,
+		(Odr_fun) odr_bool, "accept"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ResponseUnit1_acknowledge,
+		(Odr_fun) odr_null, "acknowledge"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 4, Z_ResponseUnit1_diagnostic,
+		(Odr_fun) z_DiagRec, "diagnostic"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ResponseUnit1_encrypted,
+		(Odr_fun) z_Encryption, "encrypted"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PromptId,
+			&(*p)->promptId, ODR_CONTEXT, 1, 0, "promptId") &&
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 2, "promptResponse") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
+
+int z_Response1 (ODR o, Z_Response1 **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ResponseUnit1, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PromptIdEnumeratedPrompt (ODR o, Z_PromptIdEnumeratedPrompt **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->suggestedString, ODR_CONTEXT, 2, 1, "suggestedString") &&
+		odr_sequence_end (o);
+}
+
+int z_PromptId (ODR o, Z_PromptId **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PromptId_enumeratedPrompt,
+		(Odr_fun) z_PromptIdEnumeratedPrompt, "enumeratedPrompt"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PromptId_nonEnumeratedPrompt,
+		(Odr_fun) z_InternationalString, "nonEnumeratedPrompt"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Encryption (ODR o, Z_Encryption **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->cryptType, ODR_CONTEXT, 1, 1, "cryptType") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->credential, ODR_CONTEXT, 2, 1, "credential") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->data, ODR_CONTEXT, 3, 0, "data") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-acckrb1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-acckrb1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-acckrb1.c	(revision 21083)
@@ -0,0 +1,47 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: AccessControlFormat-krb-1 */
+
+#include <yaz/z-acckrb1.h>
+
+int z_KRBObject (ODR o, Z_KRBObject **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_KRBObject_challenge,
+		(Odr_fun) z_KRBRequest, "challenge"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_KRBObject_response,
+		(Odr_fun) z_KRBResponse, "response"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_KRBRequest (ODR o, Z_KRBRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->service, ODR_CONTEXT, 1, 0, "service") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->instance, ODR_CONTEXT, 2, 1, "instance") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->realm, ODR_CONTEXT, 3, 1, "realm") &&
+		odr_sequence_end (o);
+}
+
+int z_KRBResponse (ODR o, Z_KRBResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->userid, ODR_CONTEXT, 1, 1, "userid") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->ticket, ODR_CONTEXT, 2, 0, "ticket") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-core.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-core.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-core.c	(revision 21083)
@@ -0,0 +1,1453 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: Z39-50-APDU-1995 */
+
+#include <yaz/z-core.h>
+
+int z_APDU (ODR o, Z_APDU **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 20, Z_APDU_initRequest,
+		(Odr_fun) z_InitRequest, "initRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 21, Z_APDU_initResponse,
+		(Odr_fun) z_InitResponse, "initResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 22, Z_APDU_searchRequest,
+		(Odr_fun) z_SearchRequest, "searchRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 23, Z_APDU_searchResponse,
+		(Odr_fun) z_SearchResponse, "searchResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 24, Z_APDU_presentRequest,
+		(Odr_fun) z_PresentRequest, "presentRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 25, Z_APDU_presentResponse,
+		(Odr_fun) z_PresentResponse, "presentResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 26, Z_APDU_deleteResultSetRequest,
+		(Odr_fun) z_DeleteResultSetRequest, "deleteResultSetRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 27, Z_APDU_deleteResultSetResponse,
+		(Odr_fun) z_DeleteResultSetResponse, "deleteResultSetResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 28, Z_APDU_accessControlRequest,
+		(Odr_fun) z_AccessControlRequest, "accessControlRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 29, Z_APDU_accessControlResponse,
+		(Odr_fun) z_AccessControlResponse, "accessControlResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 30, Z_APDU_resourceControlRequest,
+		(Odr_fun) z_ResourceControlRequest, "resourceControlRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 31, Z_APDU_resourceControlResponse,
+		(Odr_fun) z_ResourceControlResponse, "resourceControlResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 32, Z_APDU_triggerResourceControlRequest,
+		(Odr_fun) z_TriggerResourceControlRequest, "triggerResourceControlRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 33, Z_APDU_resourceReportRequest,
+		(Odr_fun) z_ResourceReportRequest, "resourceReportRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 34, Z_APDU_resourceReportResponse,
+		(Odr_fun) z_ResourceReportResponse, "resourceReportResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 35, Z_APDU_scanRequest,
+		(Odr_fun) z_ScanRequest, "scanRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 36, Z_APDU_scanResponse,
+		(Odr_fun) z_ScanResponse, "scanResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 43, Z_APDU_sortRequest,
+		(Odr_fun) z_SortRequest, "sortRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 44, Z_APDU_sortResponse,
+		(Odr_fun) z_SortResponse, "sortResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 45, Z_APDU_segmentRequest,
+		(Odr_fun) z_Segment, "segmentRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 46, Z_APDU_extendedServicesRequest,
+		(Odr_fun) z_ExtendedServicesRequest, "extendedServicesRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 47, Z_APDU_extendedServicesResponse,
+		(Odr_fun) z_ExtendedServicesResponse, "extendedServicesResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 48, Z_APDU_close,
+		(Odr_fun) z_Close, "close"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_InitRequest (ODR o, Z_InitRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		z_ProtocolVersion(o, &(*p)->protocolVersion, 0, "protocolVersion") &&
+		z_Options(o, &(*p)->options, 0, "options") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->preferredMessageSize, ODR_CONTEXT, 5, 0, "preferredMessageSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maximumRecordSize, ODR_CONTEXT, 6, 0, "maximumRecordSize") &&
+		odr_explicit_tag (o, z_IdAuthentication,
+			&(*p)->idAuthentication, ODR_CONTEXT, 7, 1, "idAuthentication") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationId, ODR_CONTEXT, 110, 1, "implementationId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationName, ODR_CONTEXT, 111, 1, "implementationName") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationVersion, ODR_CONTEXT, 112, 1, "implementationVersion") &&
+		odr_explicit_tag (o, z_External,
+			&(*p)->userInformationField, ODR_CONTEXT, 11, 1, "userInformationField") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_IdPass (ODR o, Z_IdPass **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->groupId, ODR_CONTEXT, 0, 1, "groupId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->userId, ODR_CONTEXT, 1, 1, "userId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->password, ODR_CONTEXT, 2, 1, "password") &&
+		odr_sequence_end (o);
+}
+
+int z_IdAuthentication (ODR o, Z_IdAuthentication **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_IdAuthentication_open,
+		 (Odr_fun) odr_visiblestring, "open"},
+		{-1, -1, -1, Z_IdAuthentication_idPass,
+		 (Odr_fun) z_IdPass, "idPass"},
+		{-1, -1, -1, Z_IdAuthentication_anonymous,
+		 (Odr_fun) odr_null, "anonymous"},
+		{-1, -1, -1, Z_IdAuthentication_other,
+		 (Odr_fun) z_External, "other"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_InitResponse (ODR o, Z_InitResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		z_ProtocolVersion(o, &(*p)->protocolVersion, 0, "protocolVersion") &&
+		z_Options(o, &(*p)->options, 0, "options") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->preferredMessageSize, ODR_CONTEXT, 5, 0, "preferredMessageSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maximumRecordSize, ODR_CONTEXT, 6, 0, "maximumRecordSize") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->result, ODR_CONTEXT, 12, 0, "result") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationId, ODR_CONTEXT, 110, 1, "implementationId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationName, ODR_CONTEXT, 111, 1, "implementationName") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->implementationVersion, ODR_CONTEXT, 112, 1, "implementationVersion") &&
+		odr_explicit_tag (o, z_External,
+			&(*p)->userInformationField, ODR_CONTEXT, 11, 1, "userInformationField") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ProtocolVersion (ODR o, Z_ProtocolVersion **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_bitstring, p, ODR_CONTEXT, 3, opt, name);
+}
+
+int z_Options (ODR o, Z_Options **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_bitstring, p, ODR_CONTEXT, 4, opt, name);
+}
+
+int z_SearchRequest (ODR o, Z_SearchRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->smallSetUpperBound, ODR_CONTEXT, 13, 0, "smallSetUpperBound") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->largeSetLowerBound, ODR_CONTEXT, 14, 0, "largeSetLowerBound") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->mediumSetPresentNumber, ODR_CONTEXT, 15, 0, "mediumSetPresentNumber") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->replaceIndicator, ODR_CONTEXT, 16, 0, "replaceIndicator") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetName, ODR_CONTEXT, 17, 0, "resultSetName") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 18) &&
+		odr_sequence_of(o, (Odr_fun) z_DatabaseName, &(*p)->databaseNames,
+		  &(*p)->num_databaseNames, "databaseNames") &&
+		odr_explicit_tag (o, z_ElementSetNames,
+			&(*p)->smallSetElementSetNames, ODR_CONTEXT, 100, 1, "smallSetElementSetNames") &&
+		odr_explicit_tag (o, z_ElementSetNames,
+			&(*p)->mediumSetElementSetNames, ODR_CONTEXT, 101, 1, "mediumSetElementSetNames") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->preferredRecordSyntax, ODR_CONTEXT, 104, 1, "preferredRecordSyntax") &&
+		odr_explicit_tag (o, z_Query,
+			&(*p)->query, ODR_CONTEXT, 21, 0, "query") &&
+		odr_implicit_tag (o, z_OtherInformation,
+			&(*p)->additionalSearchInfo, ODR_CONTEXT, 203, 1, "additionalSearchInfo") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_Query (ODR o, Z_Query **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_Query_type_0,
+		(Odr_fun) z_ANY_type_0, "type_0"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Query_type_1,
+		(Odr_fun) z_RPNQuery, "type_1"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Query_type_2,
+		(Odr_fun) odr_octetstring, "type_2"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 100, Z_Query_type_100,
+		(Odr_fun) odr_octetstring, "type_100"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 101, Z_Query_type_101,
+		(Odr_fun) z_RPNQuery, "type_101"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 102, Z_Query_type_102,
+		(Odr_fun) odr_octetstring, "type_102"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_RPNQuery (ODR o, Z_RPNQuery **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_AttributeSetId(o, &(*p)->attributeSetId, 0, "attributeSetId") &&
+		z_RPNStructure(o, &(*p)->RPNStructure, 0, "RPNStructure") &&
+		odr_sequence_end (o);
+}
+
+int z_Complex (ODR o, Z_Complex **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_RPNStructure(o, &(*p)->s1, 0, "s1") &&
+		z_RPNStructure(o, &(*p)->s2, 0, "s2") &&
+		z_Operator(o, &(*p)->roperator, 0, "roperator") &&
+		odr_sequence_end (o);
+}
+
+int z_RPNStructure (ODR o, Z_RPNStructure **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_RPNStructure_simple,
+		(Odr_fun) z_Operand, "simple"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_RPNStructure_complex,
+		(Odr_fun) z_Complex, "complex"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Operand (ODR o, Z_Operand **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_Operand_APT,
+		 (Odr_fun) z_AttributesPlusTerm, "attributesPlusTerm"},
+		{-1, -1, -1, Z_Operand_resultSetId,
+		 (Odr_fun) z_ResultSetId, "resultSetId"},
+		{-1, -1, -1, Z_Operand_resultAttr,
+		 (Odr_fun) z_ResultSetPlusAttributes, "resultAttr"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AttributesPlusTerm (ODR o, Z_AttributesPlusTerm **p, int opt, const char *name)
+{
+	if (!odr_implicit_settag (o, ODR_CONTEXT, 102) ||
+		!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok(o);
+	return
+		z_AttributeList(o, &(*p)->attributes, 0, "attributes") &&
+		z_Term(o, &(*p)->term, 0, "term") &&
+		odr_sequence_end (o);
+}
+
+int z_ResultSetPlusAttributes (ODR o, Z_ResultSetPlusAttributes **p, int opt, const char *name)
+{
+	if (!odr_implicit_settag (o, ODR_CONTEXT, 214) ||
+		!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok(o);
+	return
+		z_ResultSetId(o, &(*p)->resultSet, 0, "resultSet") &&
+		z_AttributeList(o, &(*p)->attributes, 0, "attributes") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeList (ODR o, Z_AttributeList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	odr_implicit_settag (o, ODR_CONTEXT, 44);
+	if (odr_sequence_of (o, (Odr_fun) z_AttributeElement, &(*p)->attributes,
+		&(*p)->num_attributes, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Term (ODR o, Z_Term **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 45, Z_Term_general,
+		(Odr_fun) odr_octetstring, "general"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 215, Z_Term_numeric,
+		(Odr_fun) odr_integer, "numeric"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 216, Z_Term_characterString,
+		(Odr_fun) z_InternationalString, "characterString"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 217, Z_Term_oid,
+		(Odr_fun) odr_oid, "oid"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 218, Z_Term_dateTime,
+		(Odr_fun) odr_generalizedtime, "dateTime"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 219, Z_Term_external,
+		(Odr_fun) z_External, "external"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 220, Z_Term_integerAndUnit,
+		(Odr_fun) z_IntUnit, "integerAndUnit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 221, Z_Term_null,
+		(Odr_fun) odr_null, "null"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Operator (ODR o, Z_Operator **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Operator_and,
+		(Odr_fun) odr_null, "and"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Operator_or,
+		(Odr_fun) odr_null, "or"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Operator_and_not,
+		(Odr_fun) odr_null, "and_not"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Operator_prox,
+		(Odr_fun) z_ProximityOperator, "prox"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!*p && o->direction != ODR_DECODE)
+		return opt;
+	if (!odr_constructed_begin(o, p, ODR_CONTEXT, 46, 0))
+		return opt && odr_ok(o);
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name) &&
+		odr_constructed_end(o))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ComplexAttribute (ODR o, Z_ComplexAttribute **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		odr_sequence_of(o, (Odr_fun) z_StringOrNumeric, &(*p)->list,
+		  &(*p)->num_list, "list") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) odr_integer, &(*p)->semanticAction,
+		  &(*p)->num_semanticAction, "semanticAction") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeElement (ODR o, Z_AttributeElement **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 121, Z_AttributeValue_numeric,
+		(Odr_fun) odr_integer, "numeric"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 224, Z_AttributeValue_complex,
+		(Odr_fun) z_ComplexAttribute, "complex"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->attributeSet, ODR_CONTEXT, 1, 1, "attributeSet") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->attributeType, ODR_CONTEXT, 120, 0, "attributeType") &&
+		odr_choice (o, arm, &(*p)->value, &(*p)->which, 0) &&
+		odr_sequence_end (o);
+}
+
+int z_ProximityOperator (ODR o, Z_ProximityOperator **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProximityOperator_known,
+		(Odr_fun) z_ProxUnit, "known"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProximityOperator_private,
+		(Odr_fun) odr_integer, "zprivate"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->exclusion, ODR_CONTEXT, 1, 1, "exclusion") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->distance, ODR_CONTEXT, 2, 0, "distance") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->ordered, ODR_CONTEXT, 3, 0, "ordered") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->relationType, ODR_CONTEXT, 4, 0, "relationType") &&
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 5, "proximityUnitCode") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
+
+int z_ProxUnit (ODR o, Z_ProxUnit **p, int opt, const char *name)
+{
+	return odr_integer (o, p, opt, name);
+}
+
+int z_SearchResponse (ODR o, Z_SearchResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resultCount, ODR_CONTEXT, 23, 0, "resultCount") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecordsReturned, ODR_CONTEXT, 24, 0, "numberOfRecordsReturned") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->nextResultSetPosition, ODR_CONTEXT, 25, 0, "nextResultSetPosition") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->searchStatus, ODR_CONTEXT, 22, 0, "searchStatus") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resultSetStatus, ODR_CONTEXT, 26, 1, "resultSetStatus") &&
+		z_PresentStatus(o, &(*p)->presentStatus, 1, "presentStatus") &&
+		z_Records(o, &(*p)->records, 1, "records") &&
+		odr_implicit_tag (o, z_OtherInformation,
+			&(*p)->additionalSearchInfo, ODR_CONTEXT, 203, 1, "additionalSearchInfo") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_RecordComposition (ODR o, Z_RecordComposition **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 19, Z_RecordComp_simple,
+		(Odr_fun) z_ElementSetNames, "simple"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 209, Z_RecordComp_complex,
+		(Odr_fun) z_CompSpec, "complex"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PresentRequest (ODR o, Z_PresentRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		z_ResultSetId(o, &(*p)->resultSetId, 0, "resultSetId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resultSetStartPoint, ODR_CONTEXT, 30, 0, "resultSetStartPoint") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecordsRequested, ODR_CONTEXT, 29, 0, "numberOfRecordsRequested") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 212) &&
+		(odr_sequence_of(o, (Odr_fun) z_Range, &(*p)->additionalRanges,
+		  &(*p)->num_ranges, "additionalRanges") || odr_ok(o)) &&
+		z_RecordComposition (o, &(*p)->recordComposition, 1, "recordComposition") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->preferredRecordSyntax, ODR_CONTEXT, 104, 1, "preferredRecordSyntax") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxSegmentCount, ODR_CONTEXT, 204, 1, "maxSegmentCount") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxRecordSize, ODR_CONTEXT, 206, 1, "maxRecordSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxSegmentSize, ODR_CONTEXT, 207, 1, "maxSegmentSize") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_Segment (ODR o, Z_Segment **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecordsReturned, ODR_CONTEXT, 24, 0, "numberOfRecordsReturned") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 0) &&
+		odr_sequence_of(o, (Odr_fun) z_NamePlusRecord, &(*p)->segmentRecords,
+		  &(*p)->num_segmentRecords, "segmentRecords") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_PresentResponse (ODR o, Z_PresentResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecordsReturned, ODR_CONTEXT, 24, 0, "numberOfRecordsReturned") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->nextResultSetPosition, ODR_CONTEXT, 25, 0, "nextResultSetPosition") &&
+		z_PresentStatus(o, &(*p)->presentStatus, 0, "presentStatus") &&
+		z_Records(o, &(*p)->records, 1, "records") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_NamePlusRecordList (ODR o, Z_NamePlusRecordList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_NamePlusRecord, &(*p)->records,
+		&(*p)->num_records, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DiagRecs (ODR o, Z_DiagRecs **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DiagRec, &(*p)->diagRecs,
+		&(*p)->num_diagRecs, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Records (ODR o, Z_Records **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 28, Z_Records_DBOSD,
+		(Odr_fun) z_NamePlusRecordList, "databaseOrSurDiagnostics"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 130, Z_Records_NSD,
+		(Odr_fun) z_DefaultDiagFormat, "nonSurrogateDiagnostic"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 205, Z_Records_multipleNSD,
+		(Odr_fun) z_DiagRecs, "multipleNonSurDiagnostics"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_NamePlusRecord (ODR o, Z_NamePlusRecord **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 1, Z_NamePlusRecord_databaseRecord,
+		(Odr_fun) z_External, "databaseRecord"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_NamePlusRecord_surrogateDiagnostic,
+		(Odr_fun) z_DiagRec, "surrogateDiagnostic"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 3, Z_NamePlusRecord_startingFragment,
+		(Odr_fun) z_FragmentSyntax, "startingFragment"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 4, Z_NamePlusRecord_intermediateFragment,
+		(Odr_fun) z_FragmentSyntax, "intermediateFragment"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 5, Z_NamePlusRecord_finalFragment,
+		(Odr_fun) z_FragmentSyntax, "finalFragment"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 0, 1, "databaseName") &&
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "record") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
+
+int z_FragmentSyntax (ODR o, Z_FragmentSyntax **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_FragmentSyntax_externallyTagged,
+		 (Odr_fun) z_External, "externallyTagged"},
+		{-1, -1, -1, Z_FragmentSyntax_notExternallyTagged,
+		 (Odr_fun) odr_octetstring, "notExternallyTagged"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DiagRec (ODR o, Z_DiagRec **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_DiagRec_defaultFormat,
+		 (Odr_fun) z_DefaultDiagFormat, "defaultFormat"},
+		{-1, -1, -1, Z_DiagRec_externallyDefined,
+		 (Odr_fun) z_External, "externallyDefined"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DefaultDiagFormat (ODR o, Z_DefaultDiagFormat **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_DefaultDiagFormat_v2Addinfo,
+		 (Odr_fun) odr_visiblestring, "v2Addinfo"},
+		{-1, -1, -1, Z_DefaultDiagFormat_v3Addinfo,
+		 (Odr_fun) z_InternationalString, "v3Addinfo"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_oid(o, &(*p)->diagnosticSetId, 0, "diagnosticSetId") &&
+		odr_integer(o, &(*p)->condition, 0, "condition") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_sequence_end (o);
+}
+
+int z_Range (ODR o, Z_Range **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->startingPosition, ODR_CONTEXT, 1, 0, "startingPosition") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecords, ODR_CONTEXT, 2, 0, "numberOfRecords") &&
+		odr_sequence_end (o);
+}
+
+int z_DatabaseSpecificUnit (ODR o, Z_DatabaseSpecificUnit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_DatabaseName(o, &(*p)->dbName, 0, "dbName") &&
+		z_ElementSetName(o, &(*p)->esn, 0, "esn") &&
+		odr_sequence_end (o);
+}
+
+int z_DatabaseSpecific (ODR o, Z_DatabaseSpecific **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DatabaseSpecificUnit, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementSetNames (ODR o, Z_ElementSetNames **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementSetNames_generic,
+		(Odr_fun) z_InternationalString, "generic"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSetNames_databaseSpecific,
+		(Odr_fun) z_DatabaseSpecific, "databaseSpecific"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PresentStatus (ODR o, Z_PresentStatus **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_integer, p, ODR_CONTEXT, 27, opt, name);
+}
+
+int z_DbSpecific (ODR o, Z_DbSpecific **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_DatabaseName,
+			&(*p)->db, ODR_CONTEXT, 1, 0, "db") &&
+		odr_implicit_tag (o, z_Specification,
+			&(*p)->spec, ODR_CONTEXT, 2, 0, "spec") &&
+		odr_sequence_end (o);
+}
+
+int z_CompSpec (ODR o, Z_CompSpec **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->selectAlternativeSyntax, ODR_CONTEXT, 1, 0, "selectAlternativeSyntax") &&
+		odr_implicit_tag (o, z_Specification,
+			&(*p)->generic, ODR_CONTEXT, 2, 1, "generic") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_DbSpecific, &(*p)->dbSpecific,
+		  &(*p)->num_dbSpecific, "dbSpecific") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->recordSyntax,
+		  &(*p)->num_recordSyntax, "recordSyntax") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_ElementSpec (ODR o, Z_ElementSpec **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementSpec_elementSetName,
+		(Odr_fun) z_InternationalString, "elementSetName"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementSpec_externalSpec,
+		(Odr_fun) z_External, "externalSpec"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Specification (ODR o, Z_Specification **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 1, 1, "schema") &&
+		odr_explicit_tag (o, z_ElementSpec,
+			&(*p)->elementSpec, ODR_CONTEXT, 2, 1, "elementSpec") &&
+		odr_sequence_end (o);
+}
+
+int z_DeleteResultSetRequest (ODR o, Z_DeleteResultSetRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->deleteFunction, ODR_CONTEXT, 32, 0, "deleteFunction") &&
+		(odr_sequence_of(o, (Odr_fun) z_ResultSetId, &(*p)->resultSetList,
+		  &(*p)->num_resultSetList, "resultSetList") || odr_ok(o)) &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_DeleteResultSetResponse (ODR o, Z_DeleteResultSetResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, z_DeleteStatus,
+			&(*p)->deleteOperationStatus, ODR_CONTEXT, 0, 0, "deleteOperationStatus") &&
+		odr_implicit_tag (o, z_ListStatuses,
+			&(*p)->deleteListStatuses, ODR_CONTEXT, 1, 1, "deleteListStatuses") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberNotDeleted, ODR_CONTEXT, 34, 1, "numberNotDeleted") &&
+		odr_implicit_tag (o, z_ListStatuses,
+			&(*p)->bulkStatuses, ODR_CONTEXT, 35, 1, "bulkStatuses") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->deleteMessage, ODR_CONTEXT, 36, 1, "deleteMessage") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ListStatus (ODR o, Z_ListStatus **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ResultSetId(o, &(*p)->id, 0, "id") &&
+		z_DeleteStatus(o, &(*p)->status, 0, "status") &&
+		odr_sequence_end (o);
+}
+
+int z_ListStatuses (ODR o, Z_ListStatuses **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ListStatus, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DeleteStatus (ODR o, Z_DeleteStatus **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_integer, p, ODR_CONTEXT, 33, opt, name);
+}
+
+int z_AccessControlRequest (ODR o, Z_AccessControlRequest **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 37, Z_AccessControlRequest_simpleForm,
+		(Odr_fun) odr_octetstring, "simpleForm"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessControlRequest_externallyDefined,
+		(Odr_fun) z_External, "externallyDefined"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_AccessControlResponse (ODR o, Z_AccessControlResponse **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 38, Z_AccessControlResponse_simpleForm,
+		(Odr_fun) odr_octetstring, "simpleForm"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_AccessControlResponse_externallyDefined,
+		(Odr_fun) z_External, "externallyDefined"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		(odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) || odr_ok(o)) &&
+		odr_explicit_tag (o, z_DiagRec,
+			&(*p)->diagnostic, ODR_CONTEXT, 223, 1, "diagnostic") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ResourceControlRequest (ODR o, Z_ResourceControlRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->suspendedFlag, ODR_CONTEXT, 39, 1, "suspendedFlag") &&
+		odr_explicit_tag (o, z_ResourceReport,
+			&(*p)->resourceReport, ODR_CONTEXT, 40, 1, "resourceReport") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->partialResultsAvailable, ODR_CONTEXT, 41, 1, "partialResultsAvailable") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->responseRequired, ODR_CONTEXT, 42, 0, "responseRequired") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->triggeredRequestFlag, ODR_CONTEXT, 43, 1, "triggeredRequestFlag") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ResourceControlResponse (ODR o, Z_ResourceControlResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->continueFlag, ODR_CONTEXT, 44, 0, "continueFlag") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->resultSetWanted, ODR_CONTEXT, 45, 1, "resultSetWanted") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_TriggerResourceControlRequest (ODR o, Z_TriggerResourceControlRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->requestedAction, ODR_CONTEXT, 46, 0, "requestedAction") &&
+		odr_implicit_tag (o, z_ResourceReportId,
+			&(*p)->prefResourceReportFormat, ODR_CONTEXT, 47, 1, "prefResourceReportFormat") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->resultSetWanted, ODR_CONTEXT, 48, 1, "resultSetWanted") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ResourceReportRequest (ODR o, Z_ResourceReportRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, z_ReferenceId,
+			&(*p)->opId, ODR_CONTEXT, 210, 1, "opId") &&
+		odr_implicit_tag (o, z_ResourceReportId,
+			&(*p)->prefResourceReportFormat, ODR_CONTEXT, 49, 1, "prefResourceReportFormat") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ResourceReportResponse (ODR o, Z_ResourceReportResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resourceReportStatus, ODR_CONTEXT, 50, 0, "resourceReportStatus") &&
+		odr_explicit_tag (o, z_ResourceReport,
+			&(*p)->resourceReport, ODR_CONTEXT, 51, 1, "resourceReport") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ResourceReport (ODR o, Z_ResourceReport **p, int opt, const char *name)
+{
+	return z_External (o, p, opt, name);
+}
+
+int z_ResourceReportId (ODR o, Z_ResourceReportId **p, int opt, const char *name)
+{
+	return odr_oid (o, p, opt, name);
+}
+
+int z_ScanRequest (ODR o, Z_ScanRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_DatabaseName, &(*p)->databaseNames,
+		  &(*p)->num_databaseNames, "databaseNames") &&
+		z_AttributeSetId(o, &(*p)->attributeSet, 1, "attributeSet") &&
+		z_AttributesPlusTerm(o, &(*p)->termListAndStartPoint, 0, "termListAndStartPoint") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->stepSize, ODR_CONTEXT, 5, 1, "stepSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfTermsRequested, ODR_CONTEXT, 6, 0, "numberOfTermsRequested") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->preferredPositionInResponse, ODR_CONTEXT, 7, 1, "preferredPositionInResponse") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ScanResponse (ODR o, Z_ScanResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->stepSize, ODR_CONTEXT, 3, 1, "stepSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->scanStatus, ODR_CONTEXT, 4, 0, "scanStatus") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfEntriesReturned, ODR_CONTEXT, 5, 0, "numberOfEntriesReturned") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->positionOfTerm, ODR_CONTEXT, 6, 1, "positionOfTerm") &&
+		odr_implicit_tag (o, z_ListEntries,
+			&(*p)->entries, ODR_CONTEXT, 7, 1, "entries") &&
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->attributeSet, ODR_CONTEXT, 8, 1, "attributeSet") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ListEntries (ODR o, Z_ListEntries **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_Entry, &(*p)->entries,
+		  &(*p)->num_entries, "entries") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->nonsurrogateDiagnostics,
+		  &(*p)->num_nonsurrogateDiagnostics, "nonsurrogateDiagnostics") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_Entry (ODR o, Z_Entry **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Entry_termInfo,
+		(Odr_fun) z_TermInfo, "termInfo"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_Entry_surrogateDiagnostic,
+		(Odr_fun) z_DiagRec, "surrogateDiagnostic"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_TermInfo (ODR o, Z_TermInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_Term(o, &(*p)->term, 0, "term") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->displayTerm, ODR_CONTEXT, 0, 1, "displayTerm") &&
+		z_AttributeList(o, &(*p)->suggestedAttributes, 1, "suggestedAttributes") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributesPlusTerm, &(*p)->alternativeTerm,
+		  &(*p)->num_alternativeTerm, "alternativeTerm") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->globalOccurrences, ODR_CONTEXT, 2, 1, "globalOccurrences") &&
+		odr_implicit_tag (o, z_OccurrenceByAttributes,
+			&(*p)->byAttributes, ODR_CONTEXT, 3, 1, "byAttributes") &&
+		z_OtherInformation(o, &(*p)->otherTermInfo, 1, "otherTermInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_byDatabaseList_s (ODR o, Z_byDatabaseList_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_DatabaseName(o, &(*p)->db, 0, "db") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->num, ODR_CONTEXT, 1, 1, "num") &&
+		z_OtherInformation(o, &(*p)->otherDbInfo, 1, "otherDbInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_byDatabaseList (ODR o, Z_byDatabaseList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_byDatabaseList_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_OccurrenceByAttributesElem (ODR o, Z_OccurrenceByAttributesElem **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_OccurrenceByAttributesElem_global,
+		(Odr_fun) odr_integer, "global"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_OccurrenceByAttributesElem_byDatabase,
+		(Odr_fun) z_byDatabaseList, "byDatabase"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_AttributeList,
+			&(*p)->attributes, ODR_CONTEXT, 1, 0, "attributes") &&
+		(odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) || odr_ok(o)) &&
+		z_OtherInformation(o, &(*p)->otherOccurInfo, 1, "otherOccurInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_OccurrenceByAttributes (ODR o, Z_OccurrenceByAttributes **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_OccurrenceByAttributesElem, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_SortKeySpecList (ODR o, Z_SortKeySpecList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_SortKeySpec, &(*p)->specs,
+		&(*p)->num_specs, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_SortRequest (ODR o, Z_SortRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->inputResultSetNames,
+		  &(*p)->num_inputResultSetNames, "inputResultSetNames") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->sortedResultSetName, ODR_CONTEXT, 4, 0, "sortedResultSetName") &&
+		odr_implicit_tag (o, z_SortKeySpecList,
+			&(*p)->sortSequence, ODR_CONTEXT, 5, 0, "sortSequence") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_SortResponse (ODR o, Z_SortResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->sortStatus, ODR_CONTEXT, 3, 0, "sortStatus") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resultSetStatus, ODR_CONTEXT, 4, 1, "resultSetStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->diagnostics,
+		  &(*p)->num_diagnostics, "diagnostics") || odr_ok(o)) &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_SortKeySpec (ODR o, Z_SortKeySpec **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKeySpec_abort,
+		(Odr_fun) odr_null, "abort"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKeySpec_null,
+		(Odr_fun) odr_null, "null"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortKeySpec_missingValueData,
+		(Odr_fun) odr_octetstring, "missingValueData"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_SortElement(o, &(*p)->sortElement, 0, "sortElement") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->sortRelation, ODR_CONTEXT, 1, 0, "sortRelation") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->caseSensitivity, ODR_CONTEXT, 2, 0, "caseSensitivity") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 3, "missingValueAction") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_SortDbSpecificList_s (ODR o, Z_SortDbSpecificList_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_DatabaseName(o, &(*p)->databaseName, 0, "databaseName") &&
+		z_SortKey(o, &(*p)->dbSort, 0, "dbSort") &&
+		odr_sequence_end (o);
+}
+
+int z_SortDbSpecificList (ODR o, Z_SortDbSpecificList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_SortDbSpecificList_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_SortElement (ODR o, Z_SortElement **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 1, Z_SortElement_generic,
+		(Odr_fun) z_SortKey, "generic"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortElement_databaseSpecific,
+		(Odr_fun) z_SortDbSpecificList, "databaseSpecific"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_SortAttributes (ODR o, Z_SortAttributes **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_AttributeSetId(o, &(*p)->id, 0, "id") &&
+		z_AttributeList(o, &(*p)->list, 0, "list") &&
+		odr_sequence_end (o);
+}
+
+int z_SortKey (ODR o, Z_SortKey **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKey_sortField,
+		(Odr_fun) z_InternationalString, "sortField"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKey_elementSpec,
+		(Odr_fun) z_Specification, "elementSpec"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKey_sortAttributes,
+		(Odr_fun) z_SortAttributes, "sortAttributes"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ExtendedServicesRequest (ODR o, Z_ExtendedServicesRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->function, ODR_CONTEXT, 3, 0, "function") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->packageType, ODR_CONTEXT, 4, 0, "packageType") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->packageName, ODR_CONTEXT, 5, 1, "packageName") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->userId, ODR_CONTEXT, 6, 1, "userId") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->retentionTime, ODR_CONTEXT, 7, 1, "retentionTime") &&
+		odr_implicit_tag (o, z_Permissions,
+			&(*p)->permissions, ODR_CONTEXT, 8, 1, "permissions") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->description, ODR_CONTEXT, 9, 1, "description") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->taskSpecificParameters, ODR_CONTEXT, 10, 1, "taskSpecificParameters") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->waitAction, ODR_CONTEXT, 11, 0, "waitAction") &&
+		z_ElementSetName(o, &(*p)->elements, 1, "elements") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_ExtendedServicesResponse (ODR o, Z_ExtendedServicesResponse **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->operationStatus, ODR_CONTEXT, 3, 0, "operationStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->diagnostics,
+		  &(*p)->num_diagnostics, "diagnostics") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->taskPackage, ODR_CONTEXT, 5, 1, "taskPackage") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_Permissions_s (ODR o, Z_Permissions_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->userId, ODR_CONTEXT, 1, 0, "userId") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		odr_sequence_of(o, (Odr_fun) odr_integer, &(*p)->allowableFunctions,
+		  &(*p)->num_allowableFunctions, "allowableFunctions") &&
+		odr_sequence_end (o);
+}
+
+int z_Permissions (ODR o, Z_Permissions **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_Permissions_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Close (ODR o, Z_Close **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_ReferenceId(o, &(*p)->referenceId, 1, "referenceId") &&
+		z_CloseReason(o, &(*p)->closeReason, 0, "closeReason") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->diagnosticInformation, ODR_CONTEXT, 3, 1, "diagnosticInformation") &&
+		odr_implicit_tag (o, z_ResourceReportId,
+			&(*p)->resourceReportFormat, ODR_CONTEXT, 4, 1, "resourceReportFormat") &&
+		odr_explicit_tag (o, z_ResourceReport,
+			&(*p)->resourceReport, ODR_CONTEXT, 5, 1, "resourceReport") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_CloseReason (ODR o, Z_CloseReason **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_integer, p, ODR_CONTEXT, 211, opt, name);
+}
+
+int z_ReferenceId (ODR o, Z_ReferenceId **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, odr_octetstring, p, ODR_CONTEXT, 2, opt, name);
+}
+
+int z_ResultSetId (ODR o, Z_ResultSetId **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, z_InternationalString, p, ODR_CONTEXT, 31, opt, name);
+}
+
+int z_ElementSetName (ODR o, Z_ElementSetName **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, z_InternationalString, p, ODR_CONTEXT, 103, opt, name);
+}
+
+int z_DatabaseName (ODR o, Z_DatabaseName **p, int opt, const char *name)
+{
+	return odr_implicit_tag (o, z_InternationalString, p, ODR_CONTEXT, 105, opt, name);
+}
+
+int z_AttributeSetId (ODR o, Z_AttributeSetId **p, int opt, const char *name)
+{
+	return odr_oid (o, p, opt, name);
+}
+
+int z_OtherInformationUnit (ODR o, Z_OtherInformationUnit **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_OtherInfo_characterInfo,
+		(Odr_fun) z_InternationalString, "characterInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_OtherInfo_binaryInfo,
+		(Odr_fun) odr_octetstring, "binaryInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_OtherInfo_externallyDefinedInfo,
+		(Odr_fun) z_External, "externallyDefinedInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_OtherInfo_oid,
+		(Odr_fun) odr_oid, "oid"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InfoCategory,
+			&(*p)->category, ODR_CONTEXT, 1, 1, "category") &&
+		odr_choice (o, arm, &(*p)->information, &(*p)->which, 0) &&
+		odr_sequence_end (o);
+}
+
+int z_OtherInformation (ODR o, Z_OtherInformation **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	odr_implicit_settag (o, ODR_CONTEXT, 201);
+	if (odr_sequence_of (o, (Odr_fun) z_OtherInformationUnit, &(*p)->list,
+		&(*p)->num_elements, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_InfoCategory (ODR o, Z_InfoCategory **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->categoryTypeId, ODR_CONTEXT, 1, 1, "categoryTypeId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->categoryValue, ODR_CONTEXT, 2, 0, "categoryValue") &&
+		odr_sequence_end (o);
+}
+
+int z_IntUnit (ODR o, Z_IntUnit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->value, ODR_CONTEXT, 1, 0, "value") &&
+		odr_implicit_tag (o, z_Unit,
+			&(*p)->unitUsed, ODR_CONTEXT, 2, 0, "unitUsed") &&
+		odr_sequence_end (o);
+}
+
+int z_Unit (ODR o, Z_Unit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_InternationalString,
+			&(*p)->unitSystem, ODR_CONTEXT, 1, 1, "unitSystem") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->unitType, ODR_CONTEXT, 2, 1, "unitType") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->unit, ODR_CONTEXT, 3, 1, "unit") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->scaleFactor, ODR_CONTEXT, 4, 1, "scaleFactor") &&
+		odr_sequence_end (o);
+}
+
+int z_InternationalString (ODR o, Z_InternationalString **p, int opt, const char *name)
+{
+	return odr_generalstring (o, p, opt, name);
+}
+
+int z_StringOrNumeric (ODR o, Z_StringOrNumeric **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_StringOrNumeric_string,
+		(Odr_fun) z_InternationalString, "string"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_StringOrNumeric_numeric,
+		(Odr_fun) odr_integer, "numeric"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+
+/* the type-0 query ... */
+int z_ANY_type_0 (ODR o, void **p, int opt)
+{
+    return 0;
+}
+
+
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-date.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-date.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-date.c	(revision 21083)
@@ -0,0 +1,157 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: UserInfoFormat-dateTime */
+
+#include <yaz/z-date.h>
+
+int z_DateTime (ODR o, Z_DateTime **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_Date,
+			&(*p)->date, ODR_CONTEXT, 1, 1, "date") &&
+		odr_explicit_tag (o, z_Time,
+			&(*p)->time, ODR_CONTEXT, 2, 1, "time") &&
+		odr_sequence_end (o);
+}
+
+int z_DateMonthAndDay (ODR o, Z_DateMonthAndDay **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->month, ODR_CONTEXT, 2, 0, "month") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->day, ODR_CONTEXT, 3, 1, "day") &&
+		odr_sequence_end (o);
+}
+
+int z_DateQuarter (ODR o, Z_DateQuarter **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DateQuarter_first,
+		(Odr_fun) odr_null, "first"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_DateQuarter_second,
+		(Odr_fun) odr_null, "second"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_DateQuarter_third,
+		(Odr_fun) odr_null, "third"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_DateQuarter_fourth,
+		(Odr_fun) odr_null, "fourth"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DateSeason (ODR o, Z_DateSeason **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DateSeason_winter,
+		(Odr_fun) odr_null, "winter"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_DateSeason_spring,
+		(Odr_fun) odr_null, "spring"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_DateSeason_summer,
+		(Odr_fun) odr_null, "summer"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_DateSeason_autumn,
+		(Odr_fun) odr_null, "autumn"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Era (ODR o, Z_Era **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Era_decade,
+		(Odr_fun) odr_null, "decade"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Era_century,
+		(Odr_fun) odr_null, "century"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Era_millennium,
+		(Odr_fun) odr_null, "millennium"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_DateFlags (ODR o, Z_DateFlags **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_null,
+			&(*p)->circa, ODR_CONTEXT, 1, 1, "circa") &&
+		odr_implicit_tag (o, z_Era,
+			&(*p)->era, ODR_CONTEXT, 2, 1, "era") &&
+		odr_sequence_end (o);
+}
+
+int z_Date (ODR o, Z_Date **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Date_monthAndDay,
+		(Odr_fun) z_DateMonthAndDay, "monthAndDay"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Date_julianDay,
+		(Odr_fun) odr_integer, "julianDay"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Date_weekNumber,
+		(Odr_fun) odr_integer, "weekNumber"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 4, Z_Date_quarter,
+		(Odr_fun) z_DateQuarter, "quarter"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 5, Z_Date_season,
+		(Odr_fun) z_DateSeason, "season"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->year, ODR_CONTEXT, 1, 0, "year") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 2, "partOfYear") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_DateFlags,
+			&(*p)->flags, ODR_CONTEXT, 3, 1, "flags") &&
+		odr_sequence_end (o);
+}
+
+int z_Time (ODR o, Z_Time **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Time_local,
+		(Odr_fun) odr_null, "local"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Time_utc,
+		(Odr_fun) odr_null, "utc"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Time_utcOffset,
+		(Odr_fun) odr_integer, "utcOffset"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->hour, ODR_CONTEXT, 1, 0, "hour") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->minute, ODR_CONTEXT, 2, 1, "minute") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->second, ODR_CONTEXT, 3, 1, "second") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->partOfSecond, ODR_CONTEXT, 4, 1, "partOfSecond") &&
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 5, "zone") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-diag1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-diag1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-diag1.c	(revision 21083)
@@ -0,0 +1,381 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: DiagnosticFormatDiag1 */
+
+#include <yaz/z-diag1.h>
+
+int z_DiagnosticFormat_s (ODR o, Z_DiagnosticFormat_s **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DiagnosticFormat_s_defaultDiagRec,
+		(Odr_fun) z_DefaultDiagFormat, "defaultDiagRec"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_DiagnosticFormat_s_explicitDiagnostic,
+		(Odr_fun) z_DiagFormat, "explicitDiagnostic"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "diagnostic") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->message, ODR_CONTEXT, 2, 1, "message") &&
+		odr_sequence_end (o);
+}
+
+int z_DiagnosticFormat (ODR o, Z_DiagnosticFormat **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DiagnosticFormat_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_TooMany (ODR o, Z_TooMany **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tooManyWhat, ODR_CONTEXT, 1, 0, "tooManyWhat") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->max, ODR_CONTEXT, 2, 1, "max") &&
+		odr_sequence_end (o);
+}
+
+int z_BadSpec (ODR o, Z_BadSpec **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_Specification,
+			&(*p)->spec, ODR_CONTEXT, 1, 0, "spec") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->db, ODR_CONTEXT, 2, 1, "db") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_Specification, &(*p)->goodOnes,
+		  &(*p)->num_goodOnes, "goodOnes") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_DbUnavail_0 (ODR o, Z_DbUnavail_0 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->reasonCode, ODR_CONTEXT, 1, 1, "reasonCode") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->message, ODR_CONTEXT, 2, 1, "message") &&
+		odr_sequence_end (o);
+}
+
+int z_DbUnavail (ODR o, Z_DbUnavail **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->db, ODR_CONTEXT, 1, 0, "db") &&
+		odr_implicit_tag (o, z_DbUnavail_0,
+			&(*p)->why, ODR_CONTEXT, 2, 0, "why") &&
+		odr_sequence_end (o);
+}
+
+int z_Attribute (ODR o, Z_Attribute **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->id, ODR_CONTEXT, 1, 0, "id") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->type, ODR_CONTEXT, 2, 1, "type") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->value, ODR_CONTEXT, 3, 1, "value") &&
+		odr_explicit_tag (o, z_Term,
+			&(*p)->term, ODR_CONTEXT, 4, 1, "term") &&
+		odr_sequence_end (o);
+}
+
+int z_AttCombo (ODR o, Z_AttCombo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_AttributeList,
+			&(*p)->unsupportedCombination, ODR_CONTEXT, 1, 0, "unsupportedCombination") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributeList, &(*p)->recommendedAlternatives,
+		  &(*p)->num_recommendedAlternatives, "recommendedAlternatives") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_DiagTerm (ODR o, Z_DiagTerm **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->problem, ODR_CONTEXT, 1, 1, "problem") &&
+		odr_explicit_tag (o, z_Term,
+			&(*p)->term, ODR_CONTEXT, 2, 0, "term") &&
+		odr_sequence_end (o);
+}
+
+int z_Proximity (ODR o, Z_Proximity **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Proximity_resultSets,
+		(Odr_fun) odr_null, "resultSets"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Proximity_badSet,
+		(Odr_fun) z_InternationalString, "badSet"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Proximity_relation,
+		(Odr_fun) odr_integer, "relation"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Proximity_unit,
+		(Odr_fun) odr_integer, "unit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Proximity_distance,
+		(Odr_fun) odr_integer, "distance"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_Proximity_attributes,
+		(Odr_fun) z_AttributeList, "attributes"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Proximity_ordered,
+		(Odr_fun) odr_null, "ordered"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Proximity_exclusion,
+		(Odr_fun) odr_null, "exclusion"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AttrListList (ODR o, Z_AttrListList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_AttributeList, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Scan (ODR o, Z_Scan **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Scan_nonZeroStepSize,
+		(Odr_fun) odr_null, "nonZeroStepSize"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Scan_specifiedStepSize,
+		(Odr_fun) odr_null, "specifiedStepSize"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Scan_termList1,
+		(Odr_fun) odr_null, "termList1"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Scan_termList2,
+		(Odr_fun) z_AttrListList, "termList2"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Scan_posInResponse,
+		(Odr_fun) odr_integer, "posInResponse"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_Scan_resources,
+		(Odr_fun) odr_null, "resources"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Scan_endOfList,
+		(Odr_fun) odr_null, "endOfList"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_StringList (ODR o, Z_StringList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_InternationalString, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Sort (ODR o, Z_Sort **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortD_sequence,
+		(Odr_fun) odr_null, "sequence"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortD_noRsName,
+		(Odr_fun) odr_null, "noRsName"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortD_tooMany,
+		(Odr_fun) odr_integer, "tooMany"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_SortD_incompatible,
+		(Odr_fun) odr_null, "incompatible"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_SortD_generic,
+		(Odr_fun) odr_null, "generic"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_SortD_dbSpecific,
+		(Odr_fun) odr_null, "dbSpecific"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_SortD_sortElement,
+		(Odr_fun) z_SortElement, "sortElement"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_SortD_key,
+		(Odr_fun) odr_integer, "key"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_SortD_action,
+		(Odr_fun) odr_null, "action"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 9, Z_SortD_illegal,
+		(Odr_fun) odr_integer, "illegal"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 10, Z_SortD_inputTooLarge,
+		(Odr_fun) z_StringList, "inputTooLarge"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 11, Z_SortD_aggregateTooLarge,
+		(Odr_fun) odr_null, "aggregateTooLarge"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Segmentation (ODR o, Z_Segmentation **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Segmentation_segmentCount,
+		(Odr_fun) odr_null, "segmentCount"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Segmentation_segmentSize,
+		(Odr_fun) odr_integer, "segmentSize"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ExtServices (ODR o, Z_ExtServices **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ExtServices_req,
+		(Odr_fun) odr_integer, "req"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ExtServices_permission,
+		(Odr_fun) odr_integer, "permission"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ExtServices_immediate,
+		(Odr_fun) odr_integer, "immediate"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_OidList (ODR o, Z_OidList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) odr_oid, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AltOidList (ODR o, Z_AltOidList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) odr_oid, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AccessCtrl (ODR o, Z_AccessCtrl **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_AccessCtrl_noUser,
+		(Odr_fun) odr_null, "noUser"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_AccessCtrl_refused,
+		(Odr_fun) odr_null, "refused"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AccessCtrl_simple,
+		(Odr_fun) odr_null, "simple"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AccessCtrl_oid,
+		(Odr_fun) z_OidList, "oid"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_AccessCtrl_alternative,
+		(Odr_fun) z_AltOidList, "alternative"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_AccessCtrl_pwdInv,
+		(Odr_fun) odr_null, "pwdInv"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_AccessCtrl_pwdExp,
+		(Odr_fun) odr_null, "pwdExp"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_RecordSyntax (ODR o, Z_RecordSyntax **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->unsupportedSyntax, ODR_CONTEXT, 1, 0, "unsupportedSyntax") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->suggestedAlternatives,
+		  &(*p)->num_suggestedAlternatives, "suggestedAlternatives") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_DiagFormat (ODR o, Z_DiagFormat **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1000, Z_DiagFormat_tooMany,
+		(Odr_fun) z_TooMany, "tooMany"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1001, Z_DiagFormat_badSpec,
+		(Odr_fun) z_BadSpec, "badSpec"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1002, Z_DiagFormat_dbUnavail,
+		(Odr_fun) z_DbUnavail, "dbUnavail"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1003, Z_DiagFormat_unSupOp,
+		(Odr_fun) odr_integer, "unSupOp"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1004, Z_DiagFormat_attribute,
+		(Odr_fun) z_Attribute, "attribute"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1005, Z_DiagFormat_attCombo,
+		(Odr_fun) z_AttCombo, "attCombo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1006, Z_DiagFormat_term,
+		(Odr_fun) z_DiagTerm, "term"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1007, Z_DiagFormat_proximity,
+		(Odr_fun) z_Proximity, "proximity"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1008, Z_DiagFormat_scan,
+		(Odr_fun) z_Scan, "scan"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1009, Z_DiagFormat_sort,
+		(Odr_fun) z_Sort, "sort"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1010, Z_DiagFormat_segmentation,
+		(Odr_fun) z_Segmentation, "segmentation"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1011, Z_DiagFormat_extServices,
+		(Odr_fun) z_ExtServices, "extServices"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 1012, Z_DiagFormat_accessCtrl,
+		(Odr_fun) z_AccessCtrl, "accessCtrl"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1013, Z_DiagFormat_recordSyntax,
+		(Odr_fun) z_RecordSyntax, "recordSyntax"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-espec1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-espec1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-espec1.c	(revision 21083)
@@ -0,0 +1,172 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ElementSpecificationFormat-eSpec-1 */
+
+#include <yaz/z-espec1.h>
+
+int z_Espec1 (ODR o, Z_Espec1 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->elementSetNames,
+		  &(*p)->num_elementSetNames, "elementSetNames") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->defaultVariantSetId, ODR_CONTEXT, 2, 1, "defaultVariantSetId") &&
+		odr_implicit_tag (o, z_Variant,
+			&(*p)->defaultVariantRequest, ODR_CONTEXT, 3, 1, "defaultVariantRequest") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->defaultTagType, ODR_CONTEXT, 4, 1, "defaultTagType") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_ElementRequest, &(*p)->elements,
+		  &(*p)->num_elements, "elements") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_ElementRequestCompositeElementPrimitives (ODR o, Z_ElementRequestCompositeElementPrimitives **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_InternationalString, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementRequestCompositeElementSpecs (ODR o, Z_ElementRequestCompositeElementSpecs **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_SimpleElement, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementRequestCompositeElement (ODR o, Z_ElementRequestCompositeElement **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementRequestCompositeElement_primitives,
+		(Odr_fun) z_ElementRequestCompositeElementPrimitives, "primitives"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementRequestCompositeElement_specs,
+		(Odr_fun) z_ElementRequestCompositeElementSpecs, "specs"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "elementList") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_implicit_tag (o, z_ETagPath,
+			&(*p)->deliveryTag, ODR_CONTEXT, 2, 0, "deliveryTag") &&
+		odr_implicit_tag (o, z_Variant,
+			&(*p)->variantRequest, ODR_CONTEXT, 3, 1, "variantRequest") &&
+		odr_sequence_end (o);
+}
+
+int z_ElementRequest (ODR o, Z_ElementRequest **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ERequest_simpleElement,
+		(Odr_fun) z_SimpleElement, "simpleElement"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ERequest_compositeElement,
+		(Odr_fun) z_ElementRequestCompositeElement, "compositeElement"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_SimpleElement (ODR o, Z_SimpleElement **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_ETagPath,
+			&(*p)->path, ODR_CONTEXT, 1, 0, "path") &&
+		odr_implicit_tag (o, z_Variant,
+			&(*p)->variantRequest, ODR_CONTEXT, 2, 1, "variantRequest") &&
+		odr_sequence_end (o);
+}
+
+int z_SpecificTag (ODR o, Z_SpecificTag **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagType, ODR_CONTEXT, 1, 1, "tagType") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->tagValue, ODR_CONTEXT, 2, 0, "tagValue") &&
+		odr_explicit_tag (o, z_Occurrences,
+			&(*p)->occurrences, ODR_CONTEXT, 3, 1, "occurrences") &&
+		odr_sequence_end (o);
+}
+
+int z_ETagUnit (ODR o, Z_ETagUnit **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ETagUnit_specificTag,
+		(Odr_fun) z_SpecificTag, "specificTag"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_ETagUnit_wildThing,
+		(Odr_fun) z_Occurrences, "wildThing"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ETagUnit_wildPath,
+		(Odr_fun) odr_null, "wildPath"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ETagPath (ODR o, Z_ETagPath **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ETagUnit, &(*p)->tags,
+		&(*p)->num_tags, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_OccurValues (ODR o, Z_OccurValues **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->start, ODR_CONTEXT, 1, 0, "start") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->howMany, ODR_CONTEXT, 2, 1, "howMany") &&
+		odr_sequence_end (o);
+}
+
+int z_Occurrences (ODR o, Z_Occurrences **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Occurrences_all,
+		(Odr_fun) odr_null, "all"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Occurrences_last,
+		(Odr_fun) odr_null, "last"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Occurrences_values,
+		(Odr_fun) z_OccurValues, "values"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-estask.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-estask.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-estask.c	(revision 21083)
@@ -0,0 +1,35 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-ESTaskPackage */
+
+#include <yaz/z-estask.h>
+
+int z_TaskPackage (ODR o, Z_TaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->packageType, ODR_CONTEXT, 1, 0, "packageType") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->packageName, ODR_CONTEXT, 2, 1, "packageName") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->userId, ODR_CONTEXT, 3, 1, "userId") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->retentionTime, ODR_CONTEXT, 4, 1, "retentionTime") &&
+		odr_implicit_tag (o, z_Permissions,
+			&(*p)->permissions, ODR_CONTEXT, 5, 1, "permissions") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->description, ODR_CONTEXT, 6, 1, "description") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->targetReference, ODR_CONTEXT, 7, 1, "targetReference") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->creationDateTime, ODR_CONTEXT, 8, 1, "creationDateTime") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->taskStatus, ODR_CONTEXT, 9, 0, "taskStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 10) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->packageDiagnostics,
+		  &(*p)->num_packageDiagnostics, "packageDiagnostics") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->taskSpecificParameters, ODR_CONTEXT, 11, 0, "taskSpecificParameters") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-exp.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-exp.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-exp.c	(revision 21083)
@@ -0,0 +1,1436 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-explain */
+
+#include <yaz/z-exp.h>
+
+int z_ExplainRecord (ODR o, Z_ExplainRecord **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_Explain_targetInfo,
+		(Odr_fun) z_TargetInfo, "targetInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Explain_databaseInfo,
+		(Odr_fun) z_DatabaseInfo, "databaseInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Explain_schemaInfo,
+		(Odr_fun) z_SchemaInfo, "schemaInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_Explain_tagSetInfo,
+		(Odr_fun) z_TagSetInfo, "tagSetInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_Explain_recordSyntaxInfo,
+		(Odr_fun) z_RecordSyntaxInfo, "recordSyntaxInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_Explain_attributeSetInfo,
+		(Odr_fun) z_AttributeSetInfo, "attributeSetInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_Explain_termListInfo,
+		(Odr_fun) z_TermListInfo, "termListInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_Explain_extendedServicesInfo,
+		(Odr_fun) z_ExtendedServicesInfo, "extendedServicesInfo"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_Explain_attributeDetails,
+		(Odr_fun) z_AttributeDetails, "attributeDetails"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 9, Z_Explain_termListDetails,
+		(Odr_fun) z_TermListDetails, "termListDetails"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 10, Z_Explain_elementSetDetails,
+		(Odr_fun) z_ElementSetDetails, "elementSetDetails"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 11, Z_Explain_retrievalRecordDetails,
+		(Odr_fun) z_RetrievalRecordDetails, "retrievalRecordDetails"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 12, Z_Explain_sortDetails,
+		(Odr_fun) z_SortDetails, "sortDetails"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 13, Z_Explain_processing,
+		(Odr_fun) z_ProcessingInformation, "processing"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 14, Z_Explain_variants,
+		(Odr_fun) z_VariantSetInfo, "variants"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 15, Z_Explain_units,
+		(Odr_fun) z_UnitInfo, "units"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 100, Z_Explain_categoryList,
+		(Odr_fun) z_CategoryList, "categoryList"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_TargetInfo (ODR o, Z_TargetInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 1, 0, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->recentNews, ODR_CONTEXT, 2, 1, "recentNews") &&
+		odr_implicit_tag (o, z_IconObject,
+			&(*p)->icon, ODR_CONTEXT, 3, 1, "icon") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->namedResultSets, ODR_CONTEXT, 4, 0, "namedResultSets") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->multipleDBsearch, ODR_CONTEXT, 5, 0, "multipleDBsearch") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxResultSets, ODR_CONTEXT, 6, 1, "maxResultSets") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxResultSize, ODR_CONTEXT, 7, 1, "maxResultSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxTerms, ODR_CONTEXT, 8, 1, "maxTerms") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->timeoutInterval, ODR_CONTEXT, 9, 1, "timeoutInterval") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->welcomeMessage, ODR_CONTEXT, 10, 1, "welcomeMessage") &&
+		odr_implicit_tag (o, z_ContactInfo,
+			&(*p)->contactInfo, ODR_CONTEXT, 11, 1, "contactInfo") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 12, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 13) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->nicknames,
+		  &(*p)->num_nicknames, "nicknames") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->usageRest, ODR_CONTEXT, 14, 1, "usageRest") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->paymentAddr, ODR_CONTEXT, 15, 1, "paymentAddr") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->hours, ODR_CONTEXT, 16, 1, "hours") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 17) &&
+		(odr_sequence_of(o, (Odr_fun) z_DatabaseList, &(*p)->dbCombinations,
+		  &(*p)->num_dbCombinations, "dbCombinations") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 18) &&
+		(odr_sequence_of(o, (Odr_fun) z_NetworkAddress, &(*p)->addresses,
+		  &(*p)->num_addresses, "addresses") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 101) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->languages,
+		  &(*p)->num_languages, "languages") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_AccessInfo,
+			&(*p)->commonAccessInfo, ODR_CONTEXT, 19, 1, "commonAccessInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_DatabaseInfo (ODR o, Z_DatabaseInfo **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_DatabaseInfo_actualNumber,
+		(Odr_fun) odr_integer, "actualNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_DatabaseInfo_approxNumber,
+		(Odr_fun) odr_integer, "approxNumber"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->name, ODR_CONTEXT, 1, 0, "name") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->explainDatabase, ODR_CONTEXT, 2, 1, "explainDatabase") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_DatabaseName, &(*p)->nicknames,
+		  &(*p)->num_nicknames, "nicknames") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_IconObject,
+			&(*p)->icon, ODR_CONTEXT, 4, 1, "icon") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->userFee, ODR_CONTEXT, 5, 0, "userFee") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->available, ODR_CONTEXT, 6, 0, "available") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->titleString, ODR_CONTEXT, 7, 1, "titleString") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 8) &&
+		(odr_sequence_of(o, (Odr_fun) z_HumanString, &(*p)->keywords,
+		  &(*p)->num_keywords, "keywords") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 9, 1, "description") &&
+		odr_implicit_tag (o, z_DatabaseList,
+			&(*p)->associatedDbs, ODR_CONTEXT, 10, 1, "associatedDbs") &&
+		odr_implicit_tag (o, z_DatabaseList,
+			&(*p)->subDbs, ODR_CONTEXT, 11, 1, "subDbs") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->disclaimers, ODR_CONTEXT, 12, 1, "disclaimers") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->news, ODR_CONTEXT, 13, 1, "news") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 14, "recordCount") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->defaultOrder, ODR_CONTEXT, 15, 1, "defaultOrder") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->avRecordSize, ODR_CONTEXT, 16, 1, "avRecordSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxRecordSize, ODR_CONTEXT, 17, 1, "maxRecordSize") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->hours, ODR_CONTEXT, 18, 1, "hours") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->bestTime, ODR_CONTEXT, 19, 1, "bestTime") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->lastUpdate, ODR_CONTEXT, 20, 1, "lastUpdate") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->updateInterval, ODR_CONTEXT, 21, 1, "updateInterval") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->coverage, ODR_CONTEXT, 22, 1, "coverage") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->proprietary, ODR_CONTEXT, 23, 1, "proprietary") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->copyrightText, ODR_CONTEXT, 24, 1, "copyrightText") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->copyrightNotice, ODR_CONTEXT, 25, 1, "copyrightNotice") &&
+		odr_implicit_tag (o, z_ContactInfo,
+			&(*p)->producerContactInfo, ODR_CONTEXT, 26, 1, "producerContactInfo") &&
+		odr_implicit_tag (o, z_ContactInfo,
+			&(*p)->supplierContactInfo, ODR_CONTEXT, 27, 1, "supplierContactInfo") &&
+		odr_implicit_tag (o, z_ContactInfo,
+			&(*p)->submissionContactInfo, ODR_CONTEXT, 28, 1, "submissionContactInfo") &&
+		odr_implicit_tag (o, z_AccessInfo,
+			&(*p)->accessInfo, ODR_CONTEXT, 29, 1, "accessInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_TagTypeMapping (ODR o, Z_TagTypeMapping **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagType, ODR_CONTEXT, 0, 0, "tagType") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->tagSet, ODR_CONTEXT, 1, 1, "tagSet") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->defaultTagType, ODR_CONTEXT, 2, 1, "defaultTagType") &&
+		odr_sequence_end (o);
+}
+
+int z_SchemaInfo (ODR o, Z_SchemaInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 1, 0, "schema") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 0, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 3, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) z_TagTypeMapping, &(*p)->tagTypeMapping,
+		  &(*p)->num_tagTypeMapping, "tagTypeMapping") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_ElementInfo, &(*p)->recordStructure,
+		  &(*p)->num_recordStructure, "recordStructure") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_ElementInfo (ODR o, Z_ElementInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->elementName, ODR_CONTEXT, 1, 0, "elementName") &&
+		odr_implicit_tag (o, z_Path,
+			&(*p)->elementTagPath, ODR_CONTEXT, 2, 0, "elementTagPath") &&
+		odr_explicit_tag (o, z_ElementDataType,
+			&(*p)->dataType, ODR_CONTEXT, 3, 1, "dataType") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->required, ODR_CONTEXT, 4, 0, "required") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->repeatable, ODR_CONTEXT, 5, 0, "repeatable") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 6, 1, "description") &&
+		odr_sequence_end (o);
+}
+
+int z_PathUnit (ODR o, Z_PathUnit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagType, ODR_CONTEXT, 1, 0, "tagType") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->tagValue, ODR_CONTEXT, 2, 0, "tagValue") &&
+		odr_sequence_end (o);
+}
+
+int z_Path (ODR o, Z_Path **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_PathUnit, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementInfoList (ODR o, Z_ElementInfoList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ElementInfo, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementDataType (ODR o, Z_ElementDataType **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ElementDataType_primitive,
+		(Odr_fun) z_PrimitiveDataType, "primitive"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementDataType_structured,
+		(Odr_fun) z_ElementInfoList, "structured"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PrimitiveDataType (ODR o, Z_PrimitiveDataType **p, int opt, const char *name)
+{
+	return odr_integer (o, p, opt, name);
+}
+
+int z_TagSetElements (ODR o, Z_TagSetElements **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->elementname, ODR_CONTEXT, 1, 0, "elementname") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->nicknames,
+		  &(*p)->num_nicknames, "nicknames") || odr_ok(o)) &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->elementTag, ODR_CONTEXT, 3, 0, "elementTag") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 4, 1, "description") &&
+		odr_explicit_tag (o, z_PrimitiveDataType,
+			&(*p)->dataType, ODR_CONTEXT, 5, 1, "dataType") &&
+		z_OtherInformation(o, &(*p)->otherTagInfo, 1, "otherTagInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_TagSetInfo (ODR o, Z_TagSetInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->tagSet, ODR_CONTEXT, 1, 0, "tagSet") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 0, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 3, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) z_TagSetElements, &(*p)->elements,
+		  &(*p)->num_elements, "elements") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_RecordSyntaxInfo (ODR o, Z_RecordSyntaxInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->recordSyntax, ODR_CONTEXT, 1, 0, "recordSyntax") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 0, "name") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->transferSyntaxes,
+		  &(*p)->num_transferSyntaxes, "transferSyntaxes") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 4, 1, "description") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->asn1Module, ODR_CONTEXT, 5, 1, "asn1Module") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_ElementInfo, &(*p)->abstractStructure,
+		  &(*p)->num_abstractStructure, "abstractStructure") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeSetInfo (ODR o, Z_AttributeSetInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->attributeSet, ODR_CONTEXT, 1, 0, "attributeSet") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 0, "name") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributeType, &(*p)->attributes,
+		  &(*p)->num_attributes, "attributes") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 4, 1, "description") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeType (ODR o, Z_AttributeType **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->attributeType, ODR_CONTEXT, 2, 0, "attributeType") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_AttributeDescription, &(*p)->attributeValues,
+		  &(*p)->num_attributeValues, "attributeValues") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeDescription (ODR o, Z_AttributeDescription **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->attributeValue, ODR_CONTEXT, 2, 0, "attributeValue") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_StringOrNumeric, &(*p)->equivalentAttributes,
+		  &(*p)->num_equivalentAttributes, "equivalentAttributes") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_TermListElement (ODR o, Z_TermListElement **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 1, 0, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->title, ODR_CONTEXT, 2, 1, "title") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->searchCost, ODR_CONTEXT, 3, 1, "searchCost") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->scanable, ODR_CONTEXT, 4, 0, "scanable") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->broader,
+		  &(*p)->num_broader, "broader") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->narrower,
+		  &(*p)->num_narrower, "narrower") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_TermListInfo (ODR o, Z_TermListInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		odr_sequence_of(o, (Odr_fun) z_TermListElement, &(*p)->termLists,
+		  &(*p)->num_termLists, "termLists") &&
+		odr_sequence_end (o);
+}
+
+int z_ExtendedServicesInfo (ODR o, Z_ExtendedServicesInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 1, "name") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->privateType, ODR_CONTEXT, 3, 0, "privateType") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->restrictionsApply, ODR_CONTEXT, 5, 0, "restrictionsApply") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->feeApply, ODR_CONTEXT, 6, 0, "feeApply") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->available, ODR_CONTEXT, 7, 0, "available") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->retentionSupported, ODR_CONTEXT, 8, 0, "retentionSupported") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->waitAction, ODR_CONTEXT, 9, 0, "waitAction") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 10, 1, "description") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->specificExplain, ODR_CONTEXT, 11, 1, "specificExplain") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->esASN, ODR_CONTEXT, 12, 1, "esASN") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeDetails (ODR o, Z_AttributeDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributeSetDetails, &(*p)->attributesBySet,
+		  &(*p)->num_attributesBySet, "attributesBySet") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_AttributeCombinations,
+			&(*p)->attributeCombinations, ODR_CONTEXT, 3, 1, "attributeCombinations") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeSetDetails (ODR o, Z_AttributeSetDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->attributeSet, ODR_CONTEXT, 0, 0, "attributeSet") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		odr_sequence_of(o, (Odr_fun) z_AttributeTypeDetails, &(*p)->attributesByType,
+		  &(*p)->num_attributesByType, "attributesByType") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeTypeDetails (ODR o, Z_AttributeTypeDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->attributeType, ODR_CONTEXT, 0, 0, "attributeType") &&
+		odr_implicit_tag (o, z_OmittedAttributeInterpretation,
+			&(*p)->defaultIfOmitted, ODR_CONTEXT, 1, 1, "defaultIfOmitted") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributeValue, &(*p)->attributeValues,
+		  &(*p)->num_attributeValues, "attributeValues") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_OmittedAttributeInterpretation (ODR o, Z_OmittedAttributeInterpretation **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->defaultValue, ODR_CONTEXT, 0, 1, "defaultValue") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->defaultDescription, ODR_CONTEXT, 1, 1, "defaultDescription") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeValue (ODR o, Z_AttributeValue **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->value, ODR_CONTEXT, 0, 0, "value") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_StringOrNumeric, &(*p)->subAttributes,
+		  &(*p)->num_subAttributes, "subAttributes") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_StringOrNumeric, &(*p)->superAttributes,
+		  &(*p)->num_superAttributes, "superAttributes") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->partialSupport, ODR_CONTEXT, 4, 1, "partialSupport") &&
+		odr_sequence_end (o);
+}
+
+int z_EScanInfo (ODR o, Z_EScanInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxStepSize, ODR_CONTEXT, 0, 1, "maxStepSize") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->collatingSequence, ODR_CONTEXT, 1, 1, "collatingSequence") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->increasing, ODR_CONTEXT, 2, 1, "increasing") &&
+		odr_sequence_end (o);
+}
+
+int z_TermListDetails (ODR o, Z_TermListDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->termListName, ODR_CONTEXT, 1, 0, "termListName") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 2, 1, "description") &&
+		odr_implicit_tag (o, z_AttributeCombinations,
+			&(*p)->attributes, ODR_CONTEXT, 3, 1, "attributes") &&
+		odr_implicit_tag (o, z_EScanInfo,
+			&(*p)->scanInfo, ODR_CONTEXT, 4, 1, "scanInfo") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->estNumberTerms, ODR_CONTEXT, 5, 1, "estNumberTerms") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_Term, &(*p)->sampleTerms,
+		  &(*p)->num_sampleTerms, "sampleTerms") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_ElementSetDetails (ODR o, Z_ElementSetDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_tag (o, z_ElementSetName,
+			&(*p)->elementSetName, ODR_CONTEXT, 2, 0, "elementSetName") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->recordSyntax, ODR_CONTEXT, 3, 0, "recordSyntax") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 4, 0, "schema") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 5, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_PerElementDetails, &(*p)->detailsPerElement,
+		  &(*p)->num_detailsPerElement, "detailsPerElement") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_RetrievalRecordDetails (ODR o, Z_RetrievalRecordDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 2, 0, "schema") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->recordSyntax, ODR_CONTEXT, 3, 0, "recordSyntax") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 4, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_PerElementDetails, &(*p)->detailsPerElement,
+		  &(*p)->num_detailsPerElement, "detailsPerElement") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_PerElementDetails (ODR o, Z_PerElementDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_RecordTag,
+			&(*p)->recordTag, ODR_CONTEXT, 1, 1, "recordTag") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_Path, &(*p)->schemaTags,
+		  &(*p)->num_schemaTags, "schemaTags") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->maxSize, ODR_CONTEXT, 3, 1, "maxSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->minSize, ODR_CONTEXT, 4, 1, "minSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->avgSize, ODR_CONTEXT, 5, 1, "avgSize") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->fixedSize, ODR_CONTEXT, 6, 1, "fixedSize") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->repeatable, ODR_CONTEXT, 8, 0, "repeatable") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->required, ODR_CONTEXT, 9, 0, "required") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 12, 1, "description") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->contents, ODR_CONTEXT, 13, 1, "contents") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->billingInfo, ODR_CONTEXT, 14, 1, "billingInfo") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->restrictions, ODR_CONTEXT, 15, 1, "restrictions") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 16) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->alternateNames,
+		  &(*p)->num_alternateNames, "alternateNames") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 17) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->genericNames,
+		  &(*p)->num_genericNames, "genericNames") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_AttributeCombinations,
+			&(*p)->searchAccess, ODR_CONTEXT, 18, 1, "searchAccess") &&
+		odr_sequence_end (o);
+}
+
+int z_RecordTag (ODR o, Z_RecordTag **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->qualifier, ODR_CONTEXT, 0, 1, "qualifier") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->tagValue, ODR_CONTEXT, 1, 0, "tagValue") &&
+		odr_sequence_end (o);
+}
+
+int z_SortDetails (ODR o, Z_SortDetails **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_SortKeyDetails, &(*p)->sortKeys,
+		  &(*p)->num_sortKeys, "sortKeys") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_SortKeyDetails (ODR o, Z_SortKeyDetails **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_SortKeyDetails_character,
+		(Odr_fun) odr_null, "character"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_SortKeyDetails_numeric,
+		(Odr_fun) odr_null, "numeric"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_SortKeyDetails_structured,
+		(Odr_fun) z_HumanString, "structured"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 0, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_Specification, &(*p)->elementSpecifications,
+		  &(*p)->num_elementSpecifications, "elementSpecifications") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_AttributeCombinations,
+			&(*p)->attributeSpecifications, ODR_CONTEXT, 2, 1, "attributeSpecifications") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 3, "sortType") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->caseSensitivity, ODR_CONTEXT, 4, 1, "caseSensitivity") &&
+		odr_sequence_end (o);
+}
+
+int z_ProcessingInformation (ODR o, Z_ProcessingInformation **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_DatabaseName,
+			&(*p)->databaseName, ODR_CONTEXT, 1, 0, "databaseName") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->processingContext, ODR_CONTEXT, 2, 0, "processingContext") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 3, 0, "name") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->oid, ODR_CONTEXT, 4, 0, "oid") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 5, 1, "description") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->instructions, ODR_CONTEXT, 6, 1, "instructions") &&
+		odr_sequence_end (o);
+}
+
+int z_VariantSetInfo (ODR o, Z_VariantSetInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->variantSet, ODR_CONTEXT, 1, 0, "variantSet") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 2, 0, "name") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_VariantClass, &(*p)->variants,
+		  &(*p)->num_variants, "variants") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_VariantClass (ODR o, Z_VariantClass **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->variantClass, ODR_CONTEXT, 2, 0, "variantClass") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_VariantType, &(*p)->variantTypes,
+		  &(*p)->num_variantTypes, "variantTypes") &&
+		odr_sequence_end (o);
+}
+
+int z_VariantType (ODR o, Z_VariantType **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->variantType, ODR_CONTEXT, 2, 0, "variantType") &&
+		odr_implicit_tag (o, z_VariantValue,
+			&(*p)->variantValue, ODR_CONTEXT, 3, 1, "variantValue") &&
+		odr_sequence_end (o);
+}
+
+int z_VariantValue (ODR o, Z_VariantValue **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PrimitiveDataType,
+			&(*p)->dataType, ODR_CONTEXT, 0, 0, "dataType") &&
+		odr_explicit_tag (o, z_ValueSet,
+			&(*p)->values, ODR_CONTEXT, 1, 1, "values") &&
+		odr_sequence_end (o);
+}
+
+int z_ValueSetEnumerated (ODR o, Z_ValueSetEnumerated **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ValueDescription, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ValueSet (ODR o, Z_ValueSet **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_ValueSet_range,
+		(Odr_fun) z_ValueRange, "range"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueSet_enumerated,
+		(Odr_fun) z_ValueSetEnumerated, "enumerated"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ValueRange (ODR o, Z_ValueRange **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_ValueDescription,
+			&(*p)->lower, ODR_CONTEXT, 0, 1, "lower") &&
+		odr_explicit_tag (o, z_ValueDescription,
+			&(*p)->upper, ODR_CONTEXT, 1, 1, "upper") &&
+		odr_sequence_end (o);
+}
+
+int z_ValueDescription (ODR o, Z_ValueDescription **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_ValueDescription_integer,
+		 (Odr_fun) odr_integer, "integer"},
+		{-1, -1, -1, Z_ValueDescription_string,
+		 (Odr_fun) z_InternationalString, "string"},
+		{-1, -1, -1, Z_ValueDescription_octets,
+		 (Odr_fun) odr_octetstring, "octets"},
+		{-1, -1, -1, Z_ValueDescription_oid,
+		 (Odr_fun) odr_oid, "oid"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ValueDescription_unit,
+		(Odr_fun) z_Unit, "unit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ValueDescription_valueAndUnit,
+		(Odr_fun) z_IntUnit, "valueAndUnit"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_UnitInfo (ODR o, Z_UnitInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->unitSystem, ODR_CONTEXT, 1, 0, "unitSystem") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 2, 1, "description") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_UnitType, &(*p)->units,
+		  &(*p)->num_units, "units") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_UnitType (ODR o, Z_UnitType **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->unitType, ODR_CONTEXT, 2, 0, "unitType") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_Units, &(*p)->units,
+		  &(*p)->num_units, "units") &&
+		odr_sequence_end (o);
+}
+
+int z_Units (ODR o, Z_Units **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->unit, ODR_CONTEXT, 2, 0, "unit") &&
+		odr_sequence_end (o);
+}
+
+int z_CategoryList (ODR o, Z_CategoryList **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CommonInfo,
+			&(*p)->commonInfo, ODR_CONTEXT, 0, 1, "commonInfo") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		odr_sequence_of(o, (Odr_fun) z_CategoryInfo, &(*p)->categories,
+		  &(*p)->num_categories, "categories") &&
+		odr_sequence_end (o);
+}
+
+int z_CategoryInfo (ODR o, Z_CategoryInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->category, ODR_CONTEXT, 1, 0, "category") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->originalCategory, ODR_CONTEXT, 2, 1, "originalCategory") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 3, 1, "description") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->asn1Module, ODR_CONTEXT, 4, 1, "asn1Module") &&
+		odr_sequence_end (o);
+}
+
+int z_CommonInfo (ODR o, Z_CommonInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->dateAdded, ODR_CONTEXT, 0, 1, "dateAdded") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->dateChanged, ODR_CONTEXT, 1, 1, "dateChanged") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->expiry, ODR_CONTEXT, 2, 1, "expiry") &&
+		odr_implicit_tag (o, z_LanguageCode,
+			&(*p)->humanStringLanguage, ODR_CONTEXT, 3, 1, "humanStringLanguage") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_HumanStringUnit (ODR o, Z_HumanStringUnit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_LanguageCode,
+			&(*p)->language, ODR_CONTEXT, 0, 1, "language") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->text, ODR_CONTEXT, 1, 0, "text") &&
+		odr_sequence_end (o);
+}
+
+int z_HumanString (ODR o, Z_HumanString **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_HumanStringUnit, &(*p)->strings,
+		&(*p)->num_strings, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IconObjectUnit (ODR o, Z_IconObjectUnit **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IconObjectUnit_ianaType,
+		(Odr_fun) z_InternationalString, "ianaType"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IconObjectUnit_z3950type,
+		(Odr_fun) z_InternationalString, "z3950type"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IconObjectUnit_otherType,
+		(Odr_fun) z_InternationalString, "otherType"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "bodyType") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->content, ODR_CONTEXT, 2, 0, "content") &&
+		odr_sequence_end (o);
+}
+
+int z_IconObject (ODR o, Z_IconObject **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_IconObjectUnit, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_LanguageCode (ODR o, Z_LanguageCode **p, int opt, const char *name)
+{
+	return z_InternationalString (o, p, opt, name);
+}
+
+int z_ContactInfo (ODR o, Z_ContactInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 0, 1, "name") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->address, ODR_CONTEXT, 2, 1, "address") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->email, ODR_CONTEXT, 3, 1, "email") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->phone, ODR_CONTEXT, 4, 1, "phone") &&
+		odr_sequence_end (o);
+}
+
+int z_NetworkAddressIA (ODR o, Z_NetworkAddressIA **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->hostAddress, ODR_CONTEXT, 0, 0, "hostAddress") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->port, ODR_CONTEXT, 1, 0, "port") &&
+		odr_sequence_end (o);
+}
+
+int z_NetworkAddressOPA (ODR o, Z_NetworkAddressOPA **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->pSel, ODR_CONTEXT, 0, 0, "pSel") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->sSel, ODR_CONTEXT, 1, 1, "sSel") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->tSel, ODR_CONTEXT, 2, 1, "tSel") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->nSap, ODR_CONTEXT, 3, 0, "nSap") &&
+		odr_sequence_end (o);
+}
+
+int z_NetworkAddressOther (ODR o, Z_NetworkAddressOther **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->type, ODR_CONTEXT, 0, 0, "type") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->address, ODR_CONTEXT, 1, 0, "address") &&
+		odr_sequence_end (o);
+}
+
+int z_NetworkAddress (ODR o, Z_NetworkAddress **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_NetworkAddress_iA,
+		(Odr_fun) z_NetworkAddressIA, "internetAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_NetworkAddress_oPA,
+		(Odr_fun) z_NetworkAddressOPA, "osiPresentationAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_NetworkAddress_other,
+		(Odr_fun) z_NetworkAddressOther, "other"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AccessInfo (ODR o, Z_AccessInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 0) &&
+		(odr_sequence_of(o, (Odr_fun) z_QueryTypeDetails, &(*p)->queryTypesSupported,
+		  &(*p)->num_queryTypesSupported, "queryTypesSupported") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->diagnosticsSets,
+		  &(*p)->num_diagnosticsSets, "diagnosticsSets") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_AttributeSetId, &(*p)->attributeSetIds,
+		  &(*p)->num_attributeSetIds, "attributeSetIds") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->schemas,
+		  &(*p)->num_schemas, "schemas") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->recordSyntaxes,
+		  &(*p)->num_recordSyntaxes, "recordSyntaxes") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->resourceChallenges,
+		  &(*p)->num_resourceChallenges, "resourceChallenges") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_AccessRestrictions,
+			&(*p)->restrictedAccess, ODR_CONTEXT, 6, 1, "restrictedAccess") &&
+		odr_implicit_tag (o, z_Costs,
+			&(*p)->costInfo, ODR_CONTEXT, 8, 1, "costInfo") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 9) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->variantSets,
+		  &(*p)->num_variantSets, "variantSets") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 10) &&
+		(odr_sequence_of(o, (Odr_fun) z_ElementSetName, &(*p)->elementSetNames,
+		  &(*p)->num_elementSetNames, "elementSetNames") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 11) &&
+		odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->unitSystems,
+		  &(*p)->num_unitSystems, "unitSystems") &&
+		odr_sequence_end (o);
+}
+
+int z_QueryTypeDetails (ODR o, Z_QueryTypeDetails **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
+		(Odr_fun) z_PrivateCapabilities, "zprivate"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
+		(Odr_fun) z_RpnCapabilities, "rpn"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
+		(Odr_fun) z_Iso8777Capabilities, "iso8777"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 100, Z_QueryTypeDetails_z39_58,
+		(Odr_fun) z_HumanString, "z39_58"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 101, Z_QueryTypeDetails_erpn,
+		(Odr_fun) z_RpnCapabilities, "erpn"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 102, Z_QueryTypeDetails_rankedList,
+		(Odr_fun) z_HumanString, "rankedList"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PrivateCapOperator (ODR o, Z_PrivateCapOperator **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->roperator, ODR_CONTEXT, 0, 0, "roperator") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_sequence_end (o);
+}
+
+int z_PrivateCapabilities (ODR o, Z_PrivateCapabilities **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 0) &&
+		(odr_sequence_of(o, (Odr_fun) z_PrivateCapOperator, &(*p)->operators,
+		  &(*p)->num_operators, "operators") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_SearchKey, &(*p)->searchKeys,
+		  &(*p)->num_searchKeys, "searchKeys") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_HumanString, &(*p)->description,
+		  &(*p)->num_description, "description") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_RpnCapabilities (ODR o, Z_RpnCapabilities **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 0) &&
+		(odr_sequence_of(o, (Odr_fun) odr_integer, &(*p)->operators,
+		  &(*p)->num_operators, "operators") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->resultSetAsOperandSupported, ODR_CONTEXT, 1, 0, "resultSetAsOperandSupported") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->restrictionOperandSupported, ODR_CONTEXT, 2, 0, "restrictionOperandSupported") &&
+		odr_implicit_tag (o, z_ProximitySupport,
+			&(*p)->proximity, ODR_CONTEXT, 3, 1, "proximity") &&
+		odr_sequence_end (o);
+}
+
+int z_Iso8777Capabilities (ODR o, Z_Iso8777Capabilities **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 0) &&
+		odr_sequence_of(o, (Odr_fun) z_SearchKey, &(*p)->searchKeys,
+		  &(*p)->num_searchKeys, "searchKeys") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->restrictions, ODR_CONTEXT, 1, 1, "restrictions") &&
+		odr_sequence_end (o);
+}
+
+int z_ProxSupportPrivate (ODR o, Z_ProxSupportPrivate **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->unit, ODR_CONTEXT, 0, 0, "unit") &&
+		odr_explicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_sequence_end (o);
+}
+
+int z_ProxSupportUnit (ODR o, Z_ProxSupportUnit **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ProxSupportUnit_known,
+		(Odr_fun) odr_integer, "known"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ProxSupportUnit_private,
+		(Odr_fun) z_ProxSupportPrivate, "zprivate"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ProximitySupport (ODR o, Z_ProximitySupport **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->anySupport, ODR_CONTEXT, 0, 0, "anySupport") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_ProxSupportUnit, &(*p)->unitsSupported,
+		  &(*p)->num_unitsSupported, "unitsSupported") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_SearchKey (ODR o, Z_SearchKey **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->searchKey, ODR_CONTEXT, 0, 0, "searchKey") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->description, ODR_CONTEXT, 1, 1, "description") &&
+		odr_sequence_end (o);
+}
+
+int z_AccessRestrictionsUnit (ODR o, Z_AccessRestrictionsUnit **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, odr_integer,
+			&(*p)->accessType, ODR_CONTEXT, 0, 0, "accessType") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->accessText, ODR_CONTEXT, 1, 1, "accessText") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) odr_oid, &(*p)->accessChallenges,
+		  &(*p)->num_accessChallenges, "accessChallenges") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_AccessRestrictions (ODR o, Z_AccessRestrictions **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_AccessRestrictionsUnit, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_CostsOtherCharge (ODR o, Z_CostsOtherCharge **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->forWhat, ODR_CONTEXT, 1, 0, "forWhat") &&
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->charge, ODR_CONTEXT, 2, 0, "charge") &&
+		odr_sequence_end (o);
+}
+
+int z_Costs (ODR o, Z_Costs **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->connectCharge, ODR_CONTEXT, 0, 1, "connectCharge") &&
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->connectTime, ODR_CONTEXT, 1, 1, "connectTime") &&
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->displayCharge, ODR_CONTEXT, 2, 1, "displayCharge") &&
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->searchCharge, ODR_CONTEXT, 3, 1, "searchCharge") &&
+		odr_implicit_tag (o, z_Charge,
+			&(*p)->subscriptCharge, ODR_CONTEXT, 4, 1, "subscriptCharge") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_CostsOtherCharge, &(*p)->otherCharges,
+		  &(*p)->num_otherCharges, "otherCharges") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_Charge (ODR o, Z_Charge **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->cost, ODR_CONTEXT, 1, 0, "cost") &&
+		odr_implicit_tag (o, z_Unit,
+			&(*p)->perWhat, ODR_CONTEXT, 2, 1, "perWhat") &&
+		odr_implicit_tag (o, z_HumanString,
+			&(*p)->text, ODR_CONTEXT, 3, 1, "text") &&
+		odr_sequence_end (o);
+}
+
+int z_DatabaseList (ODR o, Z_DatabaseList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DatabaseName, &(*p)->databases,
+		&(*p)->num_databases, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AttributeCombinations (ODR o, Z_AttributeCombinations **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->defaultAttributeSet, ODR_CONTEXT, 0, 0, "defaultAttributeSet") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		odr_sequence_of(o, (Odr_fun) z_AttributeCombination, &(*p)->legalCombinations,
+		  &(*p)->num_legalCombinations, "legalCombinations") &&
+		odr_sequence_end (o);
+}
+
+int z_AttributeCombination (ODR o, Z_AttributeCombination **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_AttributeOccurrence, &(*p)->occurrences,
+		&(*p)->num_occurrences, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AttributeValueList (ODR o, Z_AttributeValueList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_StringOrNumeric, &(*p)->attributes,
+		&(*p)->num_attributes, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_AttributeOccurrence (ODR o, Z_AttributeOccurrence **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_AttributeOcc_any_or_none,
+		(Odr_fun) odr_null, "any_or_none"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_AttributeOcc_specific,
+		(Odr_fun) z_AttributeValueList, "specific"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_AttributeSetId,
+			&(*p)->attributeSet, ODR_CONTEXT, 0, 1, "attributeSet") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->attributeType, ODR_CONTEXT, 1, 0, "attributeType") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->mustBeSupplied, ODR_CONTEXT, 2, 1, "mustBeSupplied") &&
+		odr_choice (o, arm, &(*p)->attributeValues, &(*p)->which, 0) &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-grs.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-grs.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-grs.c	(revision 21083)
@@ -0,0 +1,219 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-generic */
+
+#include <yaz/z-grs.h>
+
+int z_GenericRecord (ODR o, Z_GenericRecord **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_TaggedElement, &(*p)->elements,
+		&(*p)->num_elements, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_TaggedElement (ODR o, Z_TaggedElement **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagType, ODR_CONTEXT, 1, 1, "tagType") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->tagValue, ODR_CONTEXT, 2, 0, "tagValue") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagOccurrence, ODR_CONTEXT, 3, 1, "tagOccurrence") &&
+		odr_explicit_tag (o, z_ElementData,
+			&(*p)->content, ODR_CONTEXT, 4, 0, "content") &&
+		odr_implicit_tag (o, z_ElementMetaData,
+			&(*p)->metaData, ODR_CONTEXT, 5, 1, "metaData") &&
+		odr_implicit_tag (o, z_Variant,
+			&(*p)->appliedVariant, ODR_CONTEXT, 6, 1, "appliedVariant") &&
+		odr_sequence_end (o);
+}
+
+int z_ElementData (ODR o, Z_ElementData **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_ElementData_octets,
+		 (Odr_fun) odr_octetstring, "octets"},
+		{-1, -1, -1, Z_ElementData_numeric,
+		 (Odr_fun) odr_integer, "numeric"},
+		{-1, -1, -1, Z_ElementData_date,
+		 (Odr_fun) odr_generalizedtime, "date"},
+		{-1, -1, -1, Z_ElementData_ext,
+		 (Odr_fun) z_External, "ext"},
+		{-1, -1, -1, Z_ElementData_string,
+		 (Odr_fun) z_InternationalString, "string"},
+		{-1, -1, -1, Z_ElementData_trueOrFalse,
+		 (Odr_fun) odr_bool, "trueOrFalse"},
+		{-1, -1, -1, Z_ElementData_oid,
+		 (Odr_fun) odr_oid, "oid"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ElementData_intUnit,
+		(Odr_fun) z_IntUnit, "intUnit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ElementData_elementNotThere,
+		(Odr_fun) odr_null, "elementNotThere"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ElementData_elementEmpty,
+		(Odr_fun) odr_null, "elementEmpty"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ElementData_noDataRequested,
+		(Odr_fun) odr_null, "noDataRequested"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ElementData_diagnostic,
+		(Odr_fun) z_External, "diagnostic"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 6, Z_ElementData_subtree,
+		(Odr_fun) z_GenericRecord, "subtree"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ElementMetaData (ODR o, Z_ElementMetaData **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_Order,
+			&(*p)->seriesOrder, ODR_CONTEXT, 1, 1, "seriesOrder") &&
+		odr_implicit_tag (o, z_Usage,
+			&(*p)->usageRight, ODR_CONTEXT, 2, 1, "usageRight") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		(odr_sequence_of(o, (Odr_fun) z_HitVector, &(*p)->hits,
+		  &(*p)->num_hits, "hits") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->displayName, ODR_CONTEXT, 4, 1, "displayName") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 5) &&
+		(odr_sequence_of(o, (Odr_fun) z_Variant, &(*p)->supportedVariants,
+		  &(*p)->num_supportedVariants, "supportedVariants") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->message, ODR_CONTEXT, 6, 1, "message") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->elementDescriptor, ODR_CONTEXT, 7, 1, "elementDescriptor") &&
+		odr_implicit_tag (o, z_TagPath,
+			&(*p)->surrogateFor, ODR_CONTEXT, 8, 1, "surrogateFor") &&
+		odr_implicit_tag (o, z_TagPath,
+			&(*p)->surrogateElement, ODR_CONTEXT, 9, 1, "surrogateElement") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->other, ODR_CONTEXT, 99, 1, "other") &&
+		odr_sequence_end (o);
+}
+
+int z_TagPath_s (ODR o, Z_TagPath_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagType, ODR_CONTEXT, 1, 1, "tagType") &&
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->tagValue, ODR_CONTEXT, 2, 0, "tagValue") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->tagOccurrence, ODR_CONTEXT, 3, 1, "tagOccurrence") &&
+		odr_sequence_end (o);
+}
+
+int z_TagPath (ODR o, Z_TagPath **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_TagPath_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_Order (ODR o, Z_Order **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->ascending, ODR_CONTEXT, 1, 0, "ascending") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->order, ODR_CONTEXT, 2, 0, "order") &&
+		odr_sequence_end (o);
+}
+
+int z_Usage (ODR o, Z_Usage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->restriction, ODR_CONTEXT, 2, 1, "restriction") &&
+		odr_sequence_end (o);
+}
+
+int z_HitVector (ODR o, Z_HitVector **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_Term(o, &(*p)->satisfier, 1, "satisfier") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->offsetIntoElement, ODR_CONTEXT, 1, 1, "offsetIntoElement") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->length, ODR_CONTEXT, 2, 1, "length") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->hitRank, ODR_CONTEXT, 3, 1, "hitRank") &&
+		odr_implicit_tag (o, odr_octetstring,
+			&(*p)->targetToken, ODR_CONTEXT, 4, 1, "targetToken") &&
+		odr_sequence_end (o);
+}
+
+int z_Triple (ODR o, Z_Triple **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{-1, -1, -1, Z_Triple_integer,
+		 (Odr_fun) odr_integer, "integer"},
+		{-1, -1, -1, Z_Triple_internationalString,
+		 (Odr_fun) z_InternationalString, "internationalString"},
+		{-1, -1, -1, Z_Triple_octetString,
+		 (Odr_fun) odr_octetstring, "octetString"},
+		{-1, -1, -1, Z_Triple_objectIdentifier,
+		 (Odr_fun) odr_oid, "objectIdentifier"},
+		{-1, -1, -1, Z_Triple_boolean,
+		 (Odr_fun) odr_bool, "boolean"},
+		{-1, -1, -1, Z_Triple_null,
+		 (Odr_fun) odr_null, "null"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_Triple_unit,
+		(Odr_fun) z_Unit, "unit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_Triple_valueAndUnit,
+		(Odr_fun) z_IntUnit, "valueAndUnit"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->variantSetId, ODR_CONTEXT, 0, 1, "variantSetId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->zclass, ODR_CONTEXT, 1, 0, "zclass") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->type, ODR_CONTEXT, 2, 0, "type") &&
+		odr_constructed_begin (o, &(*p)->value, ODR_CONTEXT, 3, "value") &&
+		odr_choice (o, arm, &(*p)->value, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
+
+int z_Variant (ODR o, Z_Variant **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->globalVariantSetId, ODR_CONTEXT, 1, 1, "globalVariantSetId") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		odr_sequence_of(o, (Odr_fun) z_Triple, &(*p)->triples,
+		  &(*p)->num_triples, "triples") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-opac.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-opac.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-opac.c	(revision 21083)
@@ -0,0 +1,124 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-opac */
+
+#include <yaz/z-opac.h>
+
+int z_OPACRecord (ODR o, Z_OPACRecord **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_External,
+			&(*p)->bibliographicRecord, ODR_CONTEXT, 1, 1, "bibliographicRecord") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_HoldingsRecord, &(*p)->holdingsData,
+		  &(*p)->num_holdingsData, "holdingsData") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_HoldingsRecord (ODR o, Z_HoldingsRecord **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_HoldingsRecord_marcHoldingsRecord,
+		(Odr_fun) z_External, "marcHoldingsRecord"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_HoldingsRecord_holdingsAndCirc,
+		(Odr_fun) z_HoldingsAndCircData, "holdingsAndCirc"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_HoldingsAndCircData (ODR o, Z_HoldingsAndCircData **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->typeOfRecord, ODR_CONTEXT, 1, 1, "typeOfRecord") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->encodingLevel, ODR_CONTEXT, 2, 1, "encodingLevel") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->format, ODR_CONTEXT, 3, 1, "format") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->receiptAcqStatus, ODR_CONTEXT, 4, 1, "receiptAcqStatus") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->generalRetention, ODR_CONTEXT, 5, 1, "generalRetention") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->completeness, ODR_CONTEXT, 6, 1, "completeness") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->dateOfReport, ODR_CONTEXT, 7, 1, "dateOfReport") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->nucCode, ODR_CONTEXT, 8, 1, "nucCode") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->localLocation, ODR_CONTEXT, 9, 1, "localLocation") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->shelvingLocation, ODR_CONTEXT, 10, 1, "shelvingLocation") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->callNumber, ODR_CONTEXT, 11, 1, "callNumber") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->shelvingData, ODR_CONTEXT, 12, 1, "shelvingData") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->copyNumber, ODR_CONTEXT, 13, 1, "copyNumber") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->publicNote, ODR_CONTEXT, 14, 1, "publicNote") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->reproductionNote, ODR_CONTEXT, 15, 1, "reproductionNote") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->termsUseRepro, ODR_CONTEXT, 16, 1, "termsUseRepro") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->enumAndChron, ODR_CONTEXT, 17, 1, "enumAndChron") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 18) &&
+		(odr_sequence_of(o, (Odr_fun) z_Volume, &(*p)->volumes,
+		  &(*p)->num_volumes, "volumes") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 19) &&
+		(odr_sequence_of(o, (Odr_fun) z_CircRecord, &(*p)->circulationData,
+		  &(*p)->num_circulationData, "circulationData") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_Volume (ODR o, Z_Volume **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->enumeration, ODR_CONTEXT, 1, 1, "enumeration") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->chronology, ODR_CONTEXT, 2, 1, "chronology") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->enumAndChron, ODR_CONTEXT, 3, 1, "enumAndChron") &&
+		odr_sequence_end (o);
+}
+
+int z_CircRecord (ODR o, Z_CircRecord **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->availableNow, ODR_CONTEXT, 1, 0, "availableNow") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->availablityDate, ODR_CONTEXT, 2, 1, "availablityDate") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->availableThru, ODR_CONTEXT, 3, 1, "availableThru") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->restrictions, ODR_CONTEXT, 4, 1, "restrictions") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->itemId, ODR_CONTEXT, 5, 1, "itemId") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->renewable, ODR_CONTEXT, 6, 0, "renewable") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->onHold, ODR_CONTEXT, 7, 0, "onHold") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->enumAndChron, ODR_CONTEXT, 8, 1, "enumAndChron") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->midspine, ODR_CONTEXT, 9, 1, "midspine") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->temporaryLocation, ODR_CONTEXT, 10, 1, "temporaryLocation") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf1.c	(revision 21083)
@@ -0,0 +1,36 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ResourceReport-Format-Resource-1 */
+
+#include <yaz/z-rrf1.h>
+
+int z_ResourceReport1 (ODR o, Z_ResourceReport1 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		odr_sequence_of(o, (Odr_fun) z_Estimate1, &(*p)->estimates,
+		  &(*p)->num_estimates, "estimates") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->message, ODR_CONTEXT, 2, 0, "message") &&
+		odr_sequence_end (o);
+}
+
+int z_Estimate1 (ODR o, Z_Estimate1 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_EstimateType,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->value, ODR_CONTEXT, 2, 0, "value") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->currency_code, ODR_CONTEXT, 3, 1, "currency_code") &&
+		odr_sequence_end (o);
+}
+
+int z_EstimateType (ODR o, Z_EstimateType **p, int opt, const char *name)
+{
+	return odr_integer (o, p, opt, name);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf2.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf2.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-rrf2.c	(revision 21083)
@@ -0,0 +1,29 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ResourceReport-Format-Resource-2 */
+
+#include <yaz/z-rrf2.h>
+
+int z_ResourceReport2 (ODR o, Z_ResourceReport2 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 1) &&
+		(odr_sequence_of(o, (Odr_fun) z_Estimate2, &(*p)->estimates,
+		  &(*p)->num_estimates, "estimates") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->message, ODR_CONTEXT, 2, 1, "message") &&
+		odr_sequence_end (o);
+}
+
+int z_Estimate2 (ODR o, Z_Estimate2 **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_StringOrNumeric,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->value, ODR_CONTEXT, 2, 0, "value") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sum.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sum.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sum.c	(revision 21083)
@@ -0,0 +1,54 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-summary */
+
+#include <yaz/z-sum.h>
+
+int z_BriefBib (ODR o, Z_BriefBib **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->title, ODR_CONTEXT, 1, 0, "title") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->author, ODR_CONTEXT, 2, 1, "author") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->callNumber, ODR_CONTEXT, 3, 1, "callNumber") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->recordType, ODR_CONTEXT, 4, 1, "recordType") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->bibliographicLevel, ODR_CONTEXT, 5, 1, "bibliographicLevel") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 6) &&
+		(odr_sequence_of(o, (Odr_fun) z_FormatSpec, &(*p)->format,
+		  &(*p)->num_format, "format") || odr_ok(o)) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->publicationPlace, ODR_CONTEXT, 7, 1, "publicationPlace") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->publicationDate, ODR_CONTEXT, 8, 1, "publicationDate") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->targetSystemKey, ODR_CONTEXT, 9, 1, "targetSystemKey") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->satisfyingElement, ODR_CONTEXT, 10, 1, "satisfyingElement") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->rank, ODR_CONTEXT, 11, 1, "rank") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->documentId, ODR_CONTEXT, 12, 1, "documentId") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->abstract, ODR_CONTEXT, 13, 1, "abstract") &&
+		z_OtherInformation(o, &(*p)->otherInfo, 1, "otherInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_FormatSpec (ODR o, Z_FormatSpec **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->type, ODR_CONTEXT, 1, 0, "type") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->size, ODR_CONTEXT, 2, 1, "size") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->bestPosn, ODR_CONTEXT, 3, 1, "bestPosn") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sutrs.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sutrs.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-sutrs.c	(revision 21083)
@@ -0,0 +1,16 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: RecordSyntax-SUTRS */
+
+#include <yaz/z-sutrs.h>
+
+int z_SutrsRecord (ODR o, Z_SutrsRecord **p, int opt, const char *name)
+{
+	return z_InternationalString (o, p, opt, name);
+}
+
+int z_SUTRS (ODR o, Odr_oct **p, int opt)
+{
+    return odr_implicit(o, odr_octetstring, p, ODR_UNIVERSAL,
+        ODR_GENERALSTRING, opt);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-uifr1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-uifr1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-uifr1.c	(revision 21083)
@@ -0,0 +1,112 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: UserInfoFormat-searchResult-1 */
+
+#include <yaz/z-uifr1.h>
+
+int z_SearchInfoReport_s (ODR o, Z_SearchInfoReport_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->subqueryId, ODR_CONTEXT, 1, 1, "subqueryId") &&
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->fullQuery, ODR_CONTEXT, 2, 0, "fullQuery") &&
+		odr_explicit_tag (o, z_QueryExpression,
+			&(*p)->subqueryExpression, ODR_CONTEXT, 3, 1, "subqueryExpression") &&
+		odr_explicit_tag (o, z_QueryExpression,
+			&(*p)->subqueryInterpretation, ODR_CONTEXT, 4, 1, "subqueryInterpretation") &&
+		odr_explicit_tag (o, z_QueryExpression,
+			&(*p)->subqueryRecommendation, ODR_CONTEXT, 5, 1, "subqueryRecommendation") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->subqueryCount, ODR_CONTEXT, 6, 1, "subqueryCount") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->subqueryWeight, ODR_CONTEXT, 7, 1, "subqueryWeight") &&
+		odr_implicit_tag (o, z_ResultsByDB,
+			&(*p)->resultsByDB, ODR_CONTEXT, 8, 1, "resultsByDB") &&
+		odr_sequence_end (o);
+}
+
+int z_SearchInfoReport (ODR o, Z_SearchInfoReport **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_SearchInfoReport_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ResultsByDB_sList (ODR o, Z_ResultsByDB_sList **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DatabaseName, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ResultsByDB_s (ODR o, Z_ResultsByDB_s **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ResultsByDB_s_all,
+		(Odr_fun) odr_null, "all"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ResultsByDB_s_list,
+		(Odr_fun) z_ResultsByDB_sList, "list"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "databases") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->count, ODR_CONTEXT, 2, 1, "count") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetName, ODR_CONTEXT, 3, 1, "resultSetName") &&
+		odr_sequence_end (o);
+}
+
+int z_ResultsByDB (ODR o, Z_ResultsByDB **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_ResultsByDB_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_QueryExpressionTerm (ODR o, Z_QueryExpressionTerm **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_Term,
+			&(*p)->queryTerm, ODR_CONTEXT, 1, 0, "queryTerm") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->termComment, ODR_CONTEXT, 2, 1, "termComment") &&
+		odr_sequence_end (o);
+}
+
+int z_QueryExpression (ODR o, Z_QueryExpression **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryExpression_term,
+		(Odr_fun) z_QueryExpressionTerm, "term"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_QueryExpression_query,
+		(Odr_fun) z_Query, "query"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z-univ.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z-univ.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z-univ.c	(revision 21083)
@@ -0,0 +1,40 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ResourceReport-Format-Universe-1 */
+
+#include <yaz/z-univ.h>
+
+int z_UniverseReportHits (ODR o, Z_UniverseReportHits **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_StringOrNumeric(o, &(*p)->database, 0, "database") &&
+		z_StringOrNumeric(o, &(*p)->hits, 0, "hits") &&
+		odr_sequence_end (o);
+}
+
+int z_UniverseReportDuplicate (ODR o, Z_UniverseReportDuplicate **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		z_StringOrNumeric(o, &(*p)->hitno, 0, "hitno") &&
+		odr_sequence_end (o);
+}
+
+int z_UniverseReport (ODR o, Z_UniverseReport **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_UniverseReport_databaseHits,
+		(Odr_fun) z_UniverseReportHits, "databaseHits"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_UniverseReport_duplicate,
+		(Odr_fun) z_UniverseReportDuplicate, "duplicate"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_integer(o, &(*p)->totalHits, 0, "totalHits") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z.tcl
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z.tcl	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z.tcl	(revision 21083)
@@ -0,0 +1,329 @@
+# YC Sample Config File for Z39.50
+# $Id$
+# ----------------------------------------------------------
+# Prefix Specifications
+#  
+#    1: C function prefix
+#    2: C type prefix
+#    3: C preprocessor prefix
+
+# Default prefix
+set default-prefix {z_ Z_ Z_}
+
+# Name clash in extended services (TargetPart, OriginPartToKeep, etc)
+# You can possibly think of better names :)
+set prefix(ESFormat-PersistentResultSet) {z_PR Z_PR Z_PR}
+set prefix(ESFormat-PersistentQuery) {z_PQuery Z_PQuery Z_PQuery}
+set prefix(ESFormat-PeriodicQuerySchedule) {z_PQS Z_PQS Z_PQS}
+set prefix(ESFormat-ItemOrder) {z_IO Z_IO Z_IO}
+set prefix(ESFormat-Update0) {z_IU0 Z_IU0 Z_IU0}
+set prefix(ESFormat-Update) {z_IU Z_IU Z_IU}
+set prefix(ESFormat-ExportSpecification) {z_ES Z_ES Z_ES}
+set prefix(ESFormat-ExportInvocation) {z_EI Z_EI Z_EI}
+
+# ----------------------------------------------------------
+# Settings for core of the protocol
+set m Z39-50-APDU-1995
+
+# Filename
+set filename($m) z-core
+
+# Public header initialization code
+set init($m,h) {
+typedef struct Z_External Z_External;
+YAZ_EXPORT int z_External(ODR o, Z_External **p, int opt, const char *name);
+}
+
+set body($m,h) "
+#ifdef __cplusplus
+extern \"C\" \{
+#endif
+
+int z_ANY_type_0 (ODR o, void **p, int opt);
+
+#ifdef __cplusplus
+\}
+#endif
+"
+set body($m,c) {
+
+/* the type-0 query ... */
+int z_ANY_type_0 (ODR o, void **p, int opt)
+{
+    return 0;
+}
+
+}
+
+# Type Name overrides
+set map($m,PDU) APDU
+set map($m,AttributeElement_complex) ComplexAttribute
+set map($m,DeleteSetStatus) DeleteStatus
+set membermap($m,ProximityOperator,private) {ProximityOperator_private zprivate}
+set unionmap($m,AttributeElement,attributeValue) {which value AttributeValue}
+set membermap($m,ElementSpec,externalEspec) externalSpec
+set membermap($m,RPNStructure,op) simple
+set membermap($m,RPNStructure,rpnRpnOp) complex
+set map($m,RPNStructure_complex) Complex
+set membermap($m,Operand,attrTerm) {Operand_APT attributesPlusTerm}
+set membermap($m,Operand,resultSet) {Operand_resultSetId resultSetId}
+set membermap($m,Operand,resultAttr) {Operand_resultAttr resultAttr}
+set membermap($m,Complex,rpn1) s1
+set membermap($m,Complex,rpn2) s2
+set membermap($m,Complex,op) roperator
+set membermap($m,RPNQuery,attributeSet) attributeSetId
+set membermap($m,RPNQuery,rpn) RPNStructure
+set map($m,KnownProximityUnit) ProxUnit
+set membermap($m,ProximityOperator,lessThan) {Prox_lessThan 1}
+set membermap($m,ProximityOperator,lessThanOrEqual) {Prox_lessThanOrEqual 1}
+set membermap($m,ProximityOperator,equal) {Prox_equal 1}
+set membermap($m,ProximityOperator,greaterThanOrEqual) {Prox_greaterThanOrEqual 1}
+set membermap($m,ProximityOperator,greaterThan) {Prox_greaterThan 1}
+set membermap($m,ProximityOperator,notEqual) {Prox_notEqual 1}
+#
+set membermap($m,Records,responseRecords) {Records_DBOSD databaseOrSurDiagnostics}
+set membermap($m,Records,nonSurrogateDiagnostic) {Records_NSD nonSurrogateDiagnostic}
+set membermap($m,Records,multipleNonSurDiagnostics) {Records_multipleNSD multipleNonSurDiagnostics}
+set map($m,Records_DBOSD) NamePlusRecordList
+set map($m,Records_NSD) DiagRec
+set map($m,Records_multipleNSD) DiagRecs
+set membermap($m,NamePlusRecord,name) databaseName
+set unionmap($m,DiagRecs) {num_diagRecs diagRecs}
+set unionmap($m,NamePlusRecordList) {num_records records}
+#
+set membermap($m,ElementSetNames,genericElementSetName) generic
+set map($m,ElementSetNames_databaseSpecific) DatabaseSpecific
+#
+set map($m,OccurrenceByAttributes_s) OccurrenceByAttributesElem
+set map($m,OccurrenceByAttributesElem_byDatabase) byDatabaseList
+#
+set membermap($m,SortElement,datbaseSpecific) databaseSpecific
+set map($m,SortElement_databaseSpecific) SortDbSpecificList
+#
+set map($m,SortKey_sortAttributes) SortAttributes
+set unionmap($m,PresentRequest,recordComposition) {}
+set map($m,PresentRequest_0) RecordComposition
+set unionmap($m,PresentRequest,additionalRanges) {num_ranges additionalRanges}
+set unionmap($m,SortRequest,sortSequence) {}
+set map($m,SortRequest_0) SortKeySpecList
+set unionmap($m,SortKeySpecList) {num_specs specs}
+set map($m,InitializeRequest) InitRequest
+set map($m,InitializeResponse) InitResponse
+set unionmap($m,CloseReason) Close
+set membermap($m,ProtocolVersion,version-1) 1
+set membermap($m,ProtocolVersion,version-2) 2
+set membermap($m,ProtocolVersion,version-3) 3
+set membermap($m,InitRequest,exceptionalRecordSize) maximumRecordSize
+set membermap($m,InitResponse,exceptionalRecordSize) maximumRecordSize
+set map($m,RecordsMultipleNonSurDiagnostics) DiagRecs
+set map($m,RecordsDatabaseOrSurDiagnostics) NamePlusRecordList
+set membermap($m,NamePlusRecord,retrievalRecord) databaseRecord
+set unionmap($m,RecordComposition) {which u RecordComp}
+set unionmap($m,ScanResponse,scanStatus) Scan
+set unionmap($m,AttributeList) {num_attributes attributes}
+set membermap($m,SortKey,sortfield) sortField
+set map($m,CompSpec_0) DbSpecific
+set map($m,DatabaseSpecific_s) DatabaseSpecificUnit
+set map($m,ListStatuses_s) ListStatus
+set map($m,IdAuthenticationIdPass) IdPass
+set map($m,OtherInformation_s) OtherInformationUnit
+set unionmap($m,OtherInformationUnit,information) {which information OtherInfo}
+set unionmap($m,OtherInformation) {num_elements list}
+set unionmap($m,Specification,elementSpec) {}
+set map($m,Specification_0) ElementSpec
+
+# ----
+set m DiagnosticFormatDiag1
+set filename($m) z-diag1
+set map($m,DiagFormat_tooMany) TooMany
+set map($m,DiagFormat_badSpec) BadSpec
+set map($m,DiagFormat_dbUnavail) DbUnavail
+set map($m,DiagFormat_attribute) Attribute
+set map($m,DiagFormat_attCombo) AttCombo
+set map($m,DiagFormat_term) DiagTerm
+set map($m,DiagFormat_proximity) Proximity
+set map($m,DiagFormat_scan) Scan
+set map($m,DiagFormat_sort) Sort
+set unionmap($m,Sort) {which u SortD}
+set map($m,DiagFormat_segmentation) Segmentation
+set map($m,DiagFormat_extServices) ExtServices
+set map($m,DiagFormat_accessCtrl) AccessCtrl
+set map($m,DiagFormat_recordSyntax) RecordSyntax
+#
+set map($m,Scan_termList2) AttrListList
+set map($m,Sort_inputTooLarge) StringList
+#
+set map($m,AccessCtrl_oid) OidList
+set map($m,AccessCtrl_alternative) AltOidList
+# ----
+set m RecordSyntax-explain
+set filename($m) z-exp
+set map($m,Explain-Record) ExplainRecord
+set map($m,ElementDataType_structured) ElementInfoList
+set map($m,HumanString_s) HumanStringUnit
+set unionmap($m,HumanString) {num_strings strings}
+set membermap($m,CommonInfo,humanString-Language) humanStringLanguage
+set unionmap($m,AttributeOccurrence,attributeValues) {which attributeValues AttributeOcc}
+set unionmap($m,AttributeCombination) {num_occurrences occurrences}
+#
+set membermap($m,NetworkAddress,internetAddress) {NetworkAddress_iA internetAddress}
+set map($m,NetworkAddress_iA) NetworkAddressIA
+set membermap($m,NetworkAddress,osiPresentationAddress) {NetworkAddress_oPA osiPresentationAddress}
+set map($m,NetworkAddress_oPA) NetworkAddressOPA
+set map($m,NetworkAddress_other) NetworkAddressOther
+set unionmap($m,DatabaseList) {num_databases databases}
+set membermap($m,TargetInfo,recent-news) recentNews
+set membermap($m,TargetInfo,usage-restrictions) usageRest
+set membermap($m,DatabaseInfo,user-fee) userFee
+#
+set map($m,ProximitySupport_0) ProxSupportUnit
+set map($m,ProxSupportUnitZprivate) ProxSupportPrivate
+set membermap($m,ProxSupportUnit,private) {ProxSupportUnit_private zprivate}
+#
+set map($m,AttributeOccurrence_specific) AttributeValueList
+set unionmap($m,AttributeValueList) {num_attributes attributes}
+
+set unionmap($m,ExplainRecord) {which u Explain}
+set map($m,SchemaInfo_0) TagTypeMapping
+set map($m,TagSetInfo_0) TagSetElements
+set map($m,TermListInfo_0) TermListElement
+set map($m,TermListDetails_0) EScanInfo
+set map($m,PrivateCapabilities_0) PrivateCapOperator
+set map($m,Costs_0) CostsOtherCharge
+set map($m,Path_s) PathUnit
+set map($m,IconObject_s) IconObjectUnit
+set map($m,NetworkAddressInternetAddress) NetworkAddressIA
+set map($m,NetworkAddressOsiPresentationAddress) NetworkAddressOPA
+set membermap($m,QueryTypeDetails,private) {QueryTypeDetails_private zprivate}
+set membermap($m,PrivateCapOperator,operator) roperator
+set map($m,AccessRestrictions_s) AccessRestrictionsUnit
+# ----
+set m RecordSyntax-SUTRS
+set filename($m) z-sutrs
+#set map($m,SutrsRecord) SUTRS
+set body($m,c) {
+int z_SUTRS (ODR o, Odr_oct **p, int opt)
+{
+    return odr_implicit(o, odr_octetstring, p, ODR_UNIVERSAL,
+        ODR_GENERALSTRING, opt);
+}
+}
+
+set init($m,h) {
+typedef Odr_oct Z_SUTRS;
+YAZ_EXPORT int z_SUTRS (ODR o, Odr_oct **p, int opt);
+}
+# ----
+set m RecordSyntax-opac
+set filename($m) z-opac
+# ----
+set m RecordSyntax-summary
+set filename($m) z-sum
+# ----
+set m RecordSyntax-generic
+set filename($m) z-grs
+set map($m,ElementData_subtree) GenericRecord
+set map($m,Variant_0) Triple
+set membermap($m,Triple,class) zclass
+set unionmap($m,Triple,value) {which value Triple}
+set unionmap($m,GenericRecord) {num_elements elements}
+# ----
+set m RecordSyntax-ESTaskPackage
+set filename($m) z-estask
+# ----
+set m ResourceReport-Format-Resource-1
+set filename($m) z-rrf1
+set map($m,ResourceReport) ResourceReport1
+set map($m,Estimate) Estimate1
+# ----
+set m ResourceReport-Format-Resource-2
+set filename($m) z-rrf2
+set map($m,ResourceReport) ResourceReport2
+set map($m,Estimate) Estimate2
+# ----
+set m AccessControlFormat-prompt-1
+set filename($m) z-accform1
+set membermap($m,PromptId,enummeratedPrompt) enumeratedPrompt 
+set map($m,PromptObject) PromptObject1
+set map($m,Challenge) Challenge1
+set map($m,Challenge1_s) ChallengeUnit1
+set map($m,Response) Response1
+set map($m,Response1_s) ResponseUnit1
+set map($m,PromptObject) PromptObject1
+# ----
+set m AccessControlFormat-des-1
+set filename($m) z-accdes1
+# ----
+set m AccessControlFormat-krb-1
+set filename($m) z-acckrb1
+# ----
+set m ESFormat-PersistentResultSet
+set filename($m) zes-pset
+# ----
+set m ESFormat-PersistentQuery
+set filename($m) zes-pquery
+# ----
+set m ESFormat-PeriodicQuerySchedule 
+set filename($m) zes-psched
+# ----
+set m ESFormat-ItemOrder
+set filename($m) zes-order
+set map($m,ItemOrderEsRequest) Request
+set map($m,ItemOrderTaskPackage) TaskPackage
+set map($m,OriginPartToKeep_0) Contact
+set map($m,OriginPartToKeep_1) Billing
+set map($m,OriginPartNotToKeep_0) ResultSetItem
+#
+# ---- (old version)
+set m ESFormat-Update0
+set filename($m) zes-update0
+set map($m,SuppliedRecords_s) SuppliedRecords_elem
+set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
+#
+# ---- (new, current version)
+set m ESFormat-Update
+set filename($m) zes-update
+set map($m,SuppliedRecords_s) SuppliedRecords_elem
+set map($m,SuppliedRecords_elem_0) SuppliedRecordsId
+# ----
+set m ESFormat-ExportSpecification
+set filename($m) zes-exps
+# ----
+set m ESFormat-ExportInvocation
+set filename($m) zes-expi
+# ----
+set m UserInfoFormat-searchResult-1
+set filename($m) z-uifr1
+# ----
+set m ElementSpecificationFormat-eSpec-1
+set filename($m) z-espec1
+set map($m,Espec-1) Espec1
+set map($m,TagPath) ETagPath
+set map($m,ETagPath_s) ETagUnit
+set map($m,ETagUnitSpecificTag) SpecificTag
+set membermap($m,SpecificTag,occurrence) occurrences
+set unionmap($m,ElementRequest) {which u ERequest}
+set unionmap($m,ETagPath) {num_tags tags}
+set map($m,OccurrencesValues) OccurValues
+# ----
+set m UserInfoFormat-dateTime
+set filename($m) z-date
+set map($m,Z3950Date) Date
+set map($m,Z3950Time) Time
+set unionmap($m,Z3950Date,era) {}
+set map($m,DateFlags_0) Era
+set map($m,Z3950DateMonthAndDay) MonthAndDay
+set map($m,Z3950DateQuarter) DateQuater
+set map($m,Z3950DateSeason) DateSeason
+set map($m,Date_0) DateFlags
+set unionmap($m,DateFlags,era) {}
+# ----
+set m ResourceReport-Format-Universe-1 
+set filename($m) z-univ
+
+# ----------------------------------------------------------
+# "Constructed" types defined by means of C-types are declared here.
+# Each function returns the C-handler and the C-type.
+proc asnBasicEXTERNAL {} {
+    return {z_External Z_External}
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/z3950v3.asn
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/z3950v3.asn	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/z3950v3.asn	(revision 21083)
@@ -0,0 +1,2590 @@
+Z39-50-APDU-1995 -- OID for this definition, assigned in OID.3.1, is {Z39-50 2 1} 
+DEFINITIONS ::=  
+BEGIN   -- Z39.50 Maintenance Agency Official Text for ANSI/NISO Z39.50-1995 - July 1995
+--
+EXPORTS OtherInformation, Term, AttributeSetId, AttributeList, AttributeElement, ElementSetName, SortElement, DatabaseName,
+CompSpec, Specification, Permissions, InternationalString, IntUnit, Unit, StringOrNumeric, Query, Records, ResultSetId,
+DefaultDiagFormat, DiagRec;
+--
+
+PDU ::= CHOICE{
+ initRequest        [20] IMPLICIT InitializeRequest,
+ initResponse      [21] IMPLICIT InitializeResponse,
+ searchRequest      [22] IMPLICIT SearchRequest,
+ searchResponse      [23] IMPLICIT SearchResponse,
+ presentRequest      [24] IMPLICIT PresentRequest,
+ presentResponse      [25] IMPLICIT PresentResponse,
+ deleteResultSetRequest    [26] IMPLICIT DeleteResultSetRequest,
+ deleteResultSetResponse    [27] IMPLICIT DeleteResultSetResponse,
+ accessControlRequest    [28] IMPLICIT AccessControlRequest,
+ accessControlResponse    [29] IMPLICIT AccessControlResponse,
+ resourceControlRequest         [30] IMPLICIT ResourceControlRequest,
+ resourceControlResponse    [31] IMPLICIT ResourceControlResponse,
+ triggerResourceControlRequest  [32] IMPLICIT TriggerResourceControlRequest,
+ resourceReportRequest          [33] IMPLICIT ResourceReportRequest,
+ resourceReportResponse    [34] IMPLICIT ResourceReportResponse,
+ scanRequest         [35] IMPLICIT ScanRequest,
+ scanResponse      [36] IMPLICIT ScanResponse,
+              -- [37] through [42] reserved
+ sortRequest        [43] IMPLICIT SortRequest,
+ sortResponse      [44] IMPLICIT SortResponse,
+ segmentRequest      [45] IMPLICIT Segment,
+ extendedServicesRequest    [46] IMPLICIT ExtendedServicesRequest,
+ extendedServicesResponse    [47] IMPLICIT ExtendedServicesResponse,
+ close          [48] IMPLICIT Close}
+
+
+-- Initialize APDUs
+--
+  InitializeRequest ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  protocolVersion      ProtocolVersion,
+  options        Options,
+  preferredMessageSize  [5]  IMPLICIT INTEGER,
+   exceptionalRecordSize  [6]  IMPLICIT INTEGER,
+   idAuthentication    [7]    IdAuthentication OPTIONAL, -- see note below
+  implementationId    [110]  IMPLICIT InternationalString OPTIONAL,
+  implementationName  [111]  IMPLICIT InternationalString OPTIONAL,
+   implementationVersion  [112]  IMPLICIT InternationalString OPTIONAL,   
+  userInformationField  [11]  EXTERNAL OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+--Note:
+-- For idAuthentication, the type ANY is retained for compatibility with earlier versions. 
+-- For interoperability, the following is recommended:
+IdAuthentication ::=
+   CHOICE{
+      open   VisibleString,
+      idPass  SEQUENCE {
+      groupId  [0]  IMPLICIT InternationalString OPTIONAL,
+      userId   [1]  IMPLICIT InternationalString OPTIONAL,
+      password  [2]  IMPLICIT InternationalString OPTIONAL },
+      anonymous  NULL,
+      other    EXTERNAL
+   }
+-- May use access control formats for 'other'.  See Appendix 7 ACC.
+--
+  InitializeResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+   protocolVersion                ProtocolVersion,
+  options              Options,
+  preferredMessageSize  [5]  IMPLICIT INTEGER,
+   exceptionalRecordSize  [6]  IMPLICIT INTEGER,
+  result        [12]  IMPLICIT BOOLEAN,    -- reject = FALSE; Accept = TRUE
+  implementationId    [110]  IMPLICIT InternationalString OPTIONAL,
+  implementationName  [111]  IMPLICIT InternationalString OPTIONAL,
+   implementationVersion  [112]  IMPLICIT InternationalString OPTIONAL,   
+  userInformationField  [11]  EXTERNAL OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+-- Begin auxiliary definitions for Init PDUs
+  ProtocolVersion  ::=  [3]   IMPLICIT BIT STRING{
+    version-1      (0),       -- This bit should always be set, but does not
+              -- correspond to any Z39.50 version.
+    version-2      (1),              -- "Version 2 supported."
+              -- This bit should always be set.
+    version-3      (2)        -- "Version 3 supported."
+-- Values higher than 'version-3' should be ignored. Both the Initialize request and Initialize Response APDUs
+-- include a value string corresponding to the supported versions. The highest common version is selected
+-- for use. If there are no versions in common, "Result" in the Init Response should indicate "reject."
+-- Note: Versions 1 and 2 are identical. Systems supporting version 2 should indicate support for version
+-- 1 as well, for interoperability with systems that indicate support for version 1 only (e.g. ISO 10163-1991
+-- implementations).  
+  }
+  Options  ::= [4] IMPLICIT BIT STRING{ 
+      search        (0), 
+      present       (1), 
+      delSet        (2),
+       resourceReport    (3),
+      triggerResourceCtrl    (4),
+      resourceCtrl       (5), 
+      accessCtrl       (6),
+      scan         (7),
+      sort        (8), 
+      --        (9) (reserved)
+      extendedServices    (10),
+      level-1Segmentation    (11),
+      level-2Segmentation    (12),
+      concurrentOperations  (13),
+      namedResultSets    (14)}
+-- end auxiliary definitions for Init PDUs
+
+
+--Search APDUs
+  SearchRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      smallSetUpperBound    [13]  IMPLICIT INTEGER,
+  largeSetLowerBound    [14]  IMPLICIT INTEGER,
+  mediumSetPresentNumber    [15]  IMPLICIT INTEGER,
+  replaceIndicator      [16]  IMPLICIT BOOLEAN,
+  resultSetName      [17]  IMPLICIT InternationalString,
+   databaseNames      [18]   IMPLICIT SEQUENCE OF DatabaseName,
+   smallSetElementSetNames    [100]  ElementSetNames OPTIONAL,
+    mediumSetElementSetNames  [101]  ElementSetNames OPTIONAL,
+  preferredRecordSyntax    [104]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  query          [21]  Query,
+    -- Following two parameters may be used only if version 3 is in force.
+   additionalSearchInfo    [203]  IMPLICIT OtherInformation OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+-- Query Definitions
+  Query  ::=  CHOICE{
+      type-0  [0]  ANY,  
+        type-1    [1]  IMPLICIT RPNQuery,
+        type-2      [2]  OCTET STRING,
+        type-100  [100]  OCTET STRING,
+        type-101  [101]  IMPLICIT RPNQuery,
+       type-102  [102]  OCTET STRING}
+--
+-- Definitions for RPN query
+     RPNQuery ::= SEQUENCE{
+      attributeSet    AttributeSetId,
+      rpn      RPNStructure}
+--
+  RPNStructure ::= CHOICE{
+    op    [0] Operand, 
+     rpnRpnOp  [1] IMPLICIT SEQUENCE{
+          rpn1    RPNStructure,
+                rpn2    RPNStructure,
+                op    Operator }} 
+  Operand ::= CHOICE{
+    attrTerm  AttributesPlusTerm, 
+    resultSet  ResultSetId, 
+          -- If version 2 is in force: 
+          --   - If query type is 1, one of the above two must be chosen; 
+          --   - resultAttr (below) may be used only if query type is 101. 
+    resultAttr  ResultSetPlusAttributes}
+
+  AttributesPlusTerm ::= [102] IMPLICIT SEQUENCE{
+         attributes  AttributeList, 
+        term    Term}
+  ResultSetPlusAttributes ::= [214] IMPLICIT SEQUENCE{
+        resultSet  ResultSetId,
+        attributes  AttributeList}
+  AttributeList ::=    [44]  IMPLICIT SEQUENCE OF AttributeElement
+--
+  Term ::= CHOICE{
+    general      [45]  IMPLICIT OCTET STRING,
+              -- values below may be used only if version 3 is in force
+    numeric      [215]  IMPLICIT INTEGER,
+    characterString    [216]  IMPLICIT InternationalString,
+    oid        [217]  IMPLICIT OBJECT IDENTIFIER,
+    dateTime      [218]  IMPLICIT GeneralizedTime,
+    external      [219]  IMPLICIT EXTERNAL,
+    integerAndUnit    [220] IMPLICIT IntUnit,
+    null        [221] IMPLICIT NULL}   
+
+  Operator ::= [46] CHOICE{
+         and    [0] IMPLICIT NULL,
+            or    [1] IMPLICIT NULL,
+                and-not  [2] IMPLICIT NULL,
+              -- If version 2 is in force: 
+              --  - For query type 1, one of the above three must be chosen;
+              --  - prox (below) may be used only if query type is 101. 
+        prox    [3] IMPLICIT ProximityOperator}
+  AttributeElement  ::=  SEQUENCE{
+    attributeSet    [1]    IMPLICIT AttributeSetId OPTIONAL,
+                -- Must be omitted if version 2 is in force.
+                -- If included, overrides value of attributeSet
+                -- in RPNQuery above, but only for this attribute.
+    attributeType  [120]  IMPLICIT INTEGER,
+    attributeValue    CHOICE{
+              numeric  [121]   IMPLICIT INTEGER,
+                  -- If version 2 is in force, 
+                  -- Must select 'numeric' for attributeValue.
+
+      complex  [224] IMPLICIT SEQUENCE{ 
+               list      [1] IMPLICIT SEQUENCE OF StringOrNumeric,
+                    semanticAction  [2] IMPLICIT SEQUENCE OF INTEGER OPTIONAL}}}
+                       
+
+  ProximityOperator ::= SEQUENCE{
+    exclusion      [1] IMPLICIT BOOLEAN OPTIONAL,
+    distance      [2] IMPLICIT INTEGER,
+    ordered      [3] IMPLICIT BOOLEAN,
+    relationType      [4] IMPLICIT INTEGER{
+              lessThan      (1),
+              lessThanOrEqual    (2),
+              equal        (3),
+              greaterThanOrEqual    (4),
+              greaterThan      (5),
+              notEqual      (6)},
+    proximityUnitCode    [5] CHOICE{
+              known  [1] IMPLICIT KnownProximityUnit,
+              private  [2] IMPLICIT INTEGER}}
+--
+    KnownProximityUnit ::= INTEGER{
+          character  (1),
+          word     (2),
+          sentence   (3),
+          paragraph   (4),
+          section   (5),
+          chapter   (6),
+          document   (7),
+          element  (8),
+          subelement  (9),
+          elementType  (10),
+           byte    (11) -- Version 3 only
+          }
+-- End definitions for RPN Query
+
+
+SearchResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  resultCount       [23]  IMPLICIT INTEGER,
+  numberOfRecordsReturned  [24]  IMPLICIT INTEGER,
+  nextResultSetPosition  [25]  IMPLICIT INTEGER,
+  searchStatus      [22]  IMPLICIT BOOLEAN,
+  resultSetStatus    [26]  IMPLICIT INTEGER{
+              subset    (1),
+                 interim  (2), 
+               none    (3)} OPTIONAL,
+  presentStatus        PresentStatus  OPTIONAL,
+    records        Records OPTIONAL,
+    -- Following two parameters may be used only if version 3 is in force.
+  additionalSearchInfo  [203]  IMPLICIT OtherInformation OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+--Retrieval APDUs 
+  PresentRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      resultSetId          ResultSetId,
+  resultSetStartPoint      [30]  IMPLICIT INTEGER,
+  numberOfRecordsRequested  [29]  IMPLICIT INTEGER,
+  additionalRanges      [212]  IMPLICIT SEQUENCE OF Range OPTIONAL,
+      -- additionalRanges may be included only if version 3 is in force.
+  recordComposition      CHOICE{
+                simple  [19]         ElementSetNames,
+                -- must choose 'simple' if version 2 is in force
+                complex  [209]               IMPLICIT CompSpec} OPTIONAL,
+  preferredRecordSyntax    [104]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  maxSegmentCount      [204]  IMPLICIT INTEGER OPTIONAL, -- level 1 or 2
+  maxRecordSize      [206]  IMPLICIT INTEGER OPTIONAL, -- level 2 only
+  maxSegmentSize      [207]  IMPLICIT INTEGER OPTIONAL, -- level 2 only
+  otherInfo          OtherInformation OPTIONAL}
+--
+  Segment ::= SEQUENCE{
+      -- Segment PDU may only be used when version 3 is in force, 
+      -- and only when segmentation is in effect.
+   referenceId          ReferenceId OPTIONAL,
+     numberOfRecordsReturned    [24]  IMPLICIT INTEGER,
+  segmentRecords      [0]  IMPLICIT SEQUENCE OF NamePlusRecord,
+  otherInfo          OtherInformation OPTIONAL}
+--
+  PresentResponse ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  numberOfRecordsReturned    [24]  IMPLICIT INTEGER,
+   nextResultSetPosition    [25]  IMPLICIT INTEGER,
+    presentStatus          PresentStatus,
+  records          Records OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL} 
+-- begin auxiliary definitions for Search and Present APDUs
+
+-- begin definition of records
+  Records ::= CHOICE{
+  responseRecords      [28]  IMPLICIT SEQUENCE OF NamePlusRecord,
+  nonSurrogateDiagnostic     [130]  IMPLICIT DefaultDiagFormat,
+  multipleNonSurDiagnostics   [205]  IMPLICIT SEQUENCE OF DiagRec} 
+--
+  NamePlusRecord  ::=  SEQUENCE{
+  name    [0] IMPLICIT DatabaseName OPTIONAL,
+  record  [1] CHOICE{
+        retrievalRecord        [1] EXTERNAL,
+        surrogateDiagnostic    [2] DiagRec, 
+          -- Must select one of the above two, retrievalRecord or
+          -- surrogateDiagnostic, unless 'level 2 segmentation' is in effect.
+        startingFragment    [3] FragmentSyntax,
+        intermediateFragment  [4] FragmentSyntax,
+        finalFragment    [5] FragmentSyntax}}
+  FragmentSyntax ::= CHOICE{
+    externallyTagged    EXTERNAL,
+    notExternallyTagged  OCTET STRING}
+
+  DiagRec ::= CHOICE{
+      defaultFormat    DefaultDiagFormat,
+                -- Must choose defaultFormat if version 2 is in effect.
+      externallyDefined    EXTERNAL}
+
+  DefaultDiagFormat::= SEQUENCE{ 
+  diagnosticSetId  OBJECT IDENTIFIER,
+  condition    INTEGER,
+  addinfo      CHOICE{
+           v2Addinfo  VisibleString,  -- version 2
+           v3Addinfo  InternationalString  -- version 3
+            }}
+  -- end definition of records
+  Range  ::= SEQUENCE{
+    startingPosition    [1] IMPLICIT INTEGER,
+    numberOfRecords    [2] IMPLICIT INTEGER} 
+--
+  ElementSetNames ::= CHOICE {
+    genericElementSetName  [0] IMPLICIT InternationalString,
+    databaseSpecific    [1] IMPLICIT SEQUENCE OF SEQUENCE{
+              dbName  DatabaseName,
+              esn    ElementSetName}}
+
+  PresentStatus   ::=    [27]  IMPLICIT INTEGER{
+                            success  (0),
+                             partial-1   (1),
+                              partial-2   (2),
+              partial-3   (3),
+                                      partial-4   (4),
+                               failure    (5)}
+
+-- begin definition of composition specification
+  CompSpec ::= SEQUENCE{
+  selectAlternativeSyntax  [1] IMPLICIT BOOLEAN,
+            -- See comment for recordSyntax, below.
+  generic             [2] IMPLICIT Specification OPTIONAL,
+  dbSpecific      [3] IMPLICIT SEQUENCE OF SEQUENCE{
+                db  [1] DatabaseName,
+                spec  [2] IMPLICIT Specification} OPTIONAL,
+    -- At least one of generic and dbSpecific must occur, and both may occur. If both, then for
+     -- any record not in the list of databases within dbSpecific, generic applies.
+   recordSyntax               [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL
+               -- For each record, the target selects the first record syntax
+               -- in this list that it can support.  If the list is exhausted, the
+               -- target may select an alternative syntax if
+               -- selectAlternativeSyntax is 'true'.
+        }
+  Specification ::= SEQUENCE{
+  schema    [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  elementSpec    [2] CHOICE{
+              elementSetName   [1] IMPLICIT InternationalString,
+          externalEspec  [2] IMPLICIT EXTERNAL} OPTIONAL}
+-- end definition of composition specification
+-- end auxiliary definitions for search and response APDUs
+
+-- Delete APDUs
+  DeleteResultSetRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+      deleteFunction      [32]  IMPLICIT INTEGER{
+                    list   (0),
+                    all   (1)},
+   resultSetList          SEQUENCE OF ResultSetId OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL} 
+--
+  DeleteResultSetResponse ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+    deleteOperationStatus    [0]  IMPLICIT DeleteSetStatus,
+  deleteListStatuses      [1]  IMPLICIT ListStatuses OPTIONAL,
+  numberNotDeleted       [34]  IMPLICIT INTEGER OPTIONAL,
+     bulkStatuses        [35]   IMPLICIT ListStatuses OPTIONAL,
+   deleteMessage      [36]  IMPLICIT InternationalString OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+  ListStatuses ::= SEQUENCE OF SEQUENCE{ 
+        id  ResultSetId, 
+        status  DeleteSetStatus}
+
+  DeleteSetStatus ::= [33] IMPLICIT INTEGER{
+                  success          (0),
+                   resultSetDidNotExist      (1),
+                    previouslyDeletedByTarget      (2),
+                     systemProblemAtTarget      (3),
+                   accessNotAllowed        (4),
+      resourceControlAtOrigin      (5),
+                   resourceControlAtTarget      (6),
+                    bulkDeleteNotSupported      (7),
+                   notAllRsltSetsDeletedOnBulkDlte    (8),
+      notAllRequestedResultSetsDeleted    (9),
+      resultSetInUse        (10)}
+--
+
+--Access- and Resource-control APDUs
+--
+  AccessControlRequest ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  securityChallenge      CHOICE{
+              simpleForm      [37] IMPLICIT OCTET STRING,
+               externallyDefined    [0]  EXTERNAL},
+  otherInfo        OtherInformation OPTIONAL}
+
+  AccessControlResponse ::= SEQUENCE{
+  referenceId        ReferenceId OPTIONAL,
+  securityChallengeResponse  CHOICE{
+              simpleForm      [38]   IMPLICIT OCTET STRING,
+               externallyDefined    [0]  EXTERNAL} OPTIONAL,
+              -- Optional only in version 3; mandatory in version 2. If
+              -- omitted (in version 3) then diagnostic must occur.
+  diagnostic    [223]    DiagRec OPTIONAL, -- Version 3 only.
+  otherInfo        OtherInformation OPTIONAL}
+
+
+
+  ResourceControlRequest ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  suspendedFlag      [39]  IMPLICIT BOOLEAN OPTIONAL,
+  resourceReport      [40]  ResourceReport OPTIONAL,
+  partialResultsAvailable    [41]  IMPLICIT INTEGER{
+                subset    (1),
+                interim  (2),
+                none    (3)} OPTIONAL,
+  responseRequired      [42]   IMPLICIT BOOLEAN, 
+  triggeredRequestFlag    [43]   IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+  ResourceControlResponse ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+    continueFlag       [44]   IMPLICIT BOOLEAN, 
+  resultSetWanted      [45]  IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+
+  TriggerResourceControlRequest ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  requestedAction      [46]  IMPLICIT INTEGER{
+                resourceReport  (1),
+                resourceControl  (2),
+                cancel      (3)}, 
+  prefResourceReportFormat    [47]   IMPLICIT ResourceReportId OPTIONAL,
+  resultSetWanted      [48]   IMPLICIT BOOLEAN OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+
+
+
+  ResourceReportRequest ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  opId          [210]  IMPLICIT ReferenceId OPTIONAL,
+  prefResourceReportFormat    [49]   IMPLICIT ResourceReportId OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+  ResourceReportResponse ::= SEQUENCE{
+     referenceId          ReferenceId OPTIONAL,
+  resourceReportStatus    [50]   IMPLICIT INTEGER{
+                success    (0),
+                partial    (1),
+                failure-1    (2),
+                failure-2    (3),
+                failure-3    (4),
+                failure-4    (5),
+                failure-5    (6),
+                failure-6    (7)},
+  resourceReport               [51]   ResourceReport OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+   ResourceReport     ::=   EXTERNAL
+  ResourceReportId    ::=    OBJECT IDENTIFIER
+
+--Scan APDUs
+  ScanRequest ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+    databaseNames        [3]  IMPLICIT SEQUENCE OF DatabaseName,
+    attributeSet            AttributeSetId OPTIONAL,
+    termListAndStartPoint        AttributesPlusTerm,
+    stepSize           [5]   IMPLICIT INTEGER OPTIONAL,
+    numberOfTermsRequested         [6]   IMPLICIT INTEGER,
+    preferredPositionInResponse      [7]   IMPLICIT INTEGER OPTIONAL,
+    otherInfo            OtherInformation OPTIONAL}
+
+  ScanResponse ::= SEQUENCE{
+   referenceId              ReferenceId OPTIONAL,
+   stepSize           [3]  IMPLICIT INTEGER OPTIONAL,
+   scanStatus           [4]  IMPLICIT INTEGER {
+                                success   (0),
+                                partial-1   (1),
+                                partial-2   (2),
+                                partial-3   (3),
+                                partial-4   (4),
+                                partial-5   (5),
+                                failure  (6) },
+   numberOfEntriesReturned       [5]  IMPLICIT INTEGER,
+   positionOfTerm         [6]  IMPLICIT INTEGER OPTIONAL,
+   entries           [7]  IMPLICIT ListEntries  OPTIONAL,  
+   attributeSet          [8]  IMPLICIT AttributeSetId OPTIONAL,
+   otherInfo            OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Scan
+  ListEntries ::= SEQUENCE{
+  entries        [1]   IMPLICIT SEQUENCE OF Entry OPTIONAL,
+    nonsurrogateDiagnostics    [2]  IMPLICIT SEQUENCE OF DiagRec OPTIONAL
+    -- At least one of entries and nonsurrogateDiagnostics must occur
+          }
+
+  Entry  ::= CHOICE {
+     termInfo               [1]   IMPLICIT TermInfo,
+     surrogateDiagnostic    [2]   DiagRec}
+--
+  TermInfo ::= SEQUENCE {
+   term                    Term,
+     displayTerm      [0]   IMPLICIT InternationalString OPTIONAL,
+                                     -- Presence of displayTerm means that term is not considered by
+              -- the target to be suitable for display, and displayTerm should
+              -- instead be displayed. 'term' is the actual term in the term list;
+               -- 'displayTerm' is for display purposes only, and is not an actual
+              -- term in the term list.
+  suggestedAttributes            AttributeList OPTIONAL,
+     alternativeTerm    [4]  IMPLICIT SEQUENCE OF AttributesPlusTerm OPTIONAL, 
+     globalOccurrences    [2]  IMPLICIT INTEGER OPTIONAL,
+     byAttributes      [3]  IMPLICIT OccurrenceByAttributes OPTIONAL,
+     otherTermInfo      OtherInformation OPTIONAL} 
+
+  OccurrenceByAttributes ::= SEQUENCE OF SEQUENCE{
+     attributes    [1]  AttributeList, 
+     occurrences       CHOICE{
+               global    [2] INTEGER,
+            byDatabase  [3] IMPLICIT SEQUENCE OF SEQUENCE{ 
+              db      DatabaseName,
+              num     [1]  IMPLICIT INTEGER OPTIONAL,
+              otherDbInfo    OtherInformation OPTIONAL}} OPTIONAL,
+     otherOccurInfo    OtherInformation OPTIONAL} 
+-- end auxiliary definitions for Scan
+
+-- Sort APDUs
+SortRequest  ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+  inputResultSetNames  [3]  IMPLICIT SEQUENCE OF InternationalString,
+  sortedResultSetName  [4]    IMPLICIT InternationalString,
+  sortSequence     [5]  IMPLICIT SEQUENCE OF SortKeySpec,
+              -- order of occurrence is from major to minor
+  otherInfo        OtherInformation OPTIONAL}
+
+SortResponse  ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,
+  sortStatus         [3]  IMPLICIT INTEGER{
+                            success  (0), 
+              partial-1  (1),
+              failure  (2)},
+  resultSetStatus    [4]  IMPLICIT INTEGER{
+              empty    (1), 
+                  interim  (2), 
+                  unchanged  (3),
+              none    (4)} OPTIONAL,
+  diagnostics        [5]             IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+
+-- begin auxiliary definitions for Sort
+  SortKeySpec ::= SEQUENCE{
+    sortElement      SortElement, 
+       sortRelation    [1]  IMPLICIT INTEGER{
+                                ascending      (0),
+              descending      (1),
+              ascendingByFrequency    (3),
+              descendingByfrequency  (4)},
+      caseSensitivity    [2]   IMPLICIT INTEGER{
+                                 caseSensitive      (0), 
+              caseInsensitive    (1)},
+      missingValueAction    [3]   CHOICE{
+                                     abort    [1] IMPLICIT NULL,
+                                     null      [2] IMPLICIT NULL,
+                    --supply a null value for missing value
+          missingValueData  [3] IMPLICIT OCTET STRING} OPTIONAL}
+
+  SortElement ::=   CHOICE{
+    generic        [1] SortKey,
+       datbaseSpecific    [2] IMPLICIT SEQUENCE OF SEQUENCE{
+                       databaseName  DatabaseName,
+                       dbSort    SortKey}} 
+
+  SortKey ::= CHOICE{
+    sortfield       [0]  IMPLICIT InternationalString,
+                  -- An element, element-group-tag, or alias supported by the target
+               -- and denoting a set of elements associated with each record.
+     elementSpec    [1]  IMPLICIT Specification,
+        sortAttributes    [2]  IMPLICIT SEQUENCE{
+              id  AttributeSetId,
+              list  AttributeList}}
+-- end auxiliary definitions for sort
+
+
+
+-- Extended Service APDUs
+  ExtendedServicesRequest  ::= SEQUENCE{
+  referenceId              ReferenceId OPTIONAL,
+  function      [3]  IMPLICIT INTEGER {
+              create    (1),
+              delete    (2),
+              modify  (3)},
+  packageType      [4]  IMPLICIT OBJECT IDENTIFIER,
+  packageName    [5]  IMPLICIT InternationalString OPTIONAL,
+              -- PackageName mandatory for 'modify' or 'delete'; optional for
+              -- 'create'. Following four parameters mandatory for 'create'; should
+              -- be included on 'modify' if being modified; not needed on 'delete'.
+  userId        [6]   IMPLICIT InternationalString OPTIONAL,
+  retentionTime    [7]   IMPLICIT IntUnit OPTIONAL,
+  permissions      [8]   IMPLICIT Permissions OPTIONAL,
+  description      [9]   IMPLICIT InternationalString OPTIONAL,
+
+-- (ExtendedServiceRequest APDU continued)
+  taskSpecificParameters  [10]  IMPLICIT EXTERNAL OPTIONAL, 
+              -- Mandatory for 'create'; included on 'modify' if specific
+              -- parameters being modified; not necessary on 'delete'. For the
+              -- 'EXTERNAL,' use OID of specific ES definition and select
+              --  CHOICE [1]: 'esRequest'.
+  waitAction      [11]  IMPLICIT INTEGER{
+              wait      (1),
+              waitIfPossible  (2),
+              dontWait    (3),
+              dontReturnPackage  (4)},
+  elements          ElementSetName OPTIONAL,
+  otherInfo          OtherInformation OPTIONAL}
+--
+
+ExtendedServicesResponse ::= SEQUENCE{
+  referenceId                ReferenceId OPTIONAL,
+  operationStatus    [3]    IMPLICIT INTEGER{
+                done      (1),
+                accepted    (2),  
+                failure    (3)},
+  diagnostics      [4]    IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  taskPackage      [5]    IMPLICIT EXTERNAL OPTIONAL,
+                -- Use OID: {Z39-50-recordSyntax (106)} and corresponding
+                -- syntax. For the EXTERNAL, 'taskSpecific,' within that
+                -- definition, use OID of the specific es, and choose [2],
+                -- 'taskPackage'.
+  otherInfo          OtherInformation OPTIONAL}
+
+ Permissions ::= SEQUENCE OF SEQUENCE{
+  userId      [1] IMPLICIT InternationalString,
+  allowableFunctions  [2] IMPLICIT SEQUENCE OF INTEGER{
+              delete      (1),
+              modifyContents  (2),
+              modifyPermissions  (3),
+              present    (4),
+                 invoke    (5)}} 
+
+Close ::= SEQUENCE{
+  referenceId          ReferenceId OPTIONAL,  -- See 3.2.11.1.5.
+  closeReason          CloseReason,
+  diagnosticInformation    [3]  IMPLICIT InternationalString OPTIONAL,
+  resourceReportFormat    [4]  IMPLICIT ResourceReportId OPTIONAL, 
+                -- For use by origin only, and only on Close request;
+                -- origin requests target to include report in response.
+   resourceReport      [5]  ResourceReport OPTIONAL,
+                -- For use by target only, unilaterally on Close request;
+                -- on Close response may be unilateral or in response
+                -- to origin request.
+  otherInfo          OtherInformation OPTIONAL}
+
+  CloseReason ::=  [211]  IMPLICIT INTEGER{
+            finished      (0),
+            shutdown      (1),
+            systemProblem    (2),
+            costLimit      (3),
+            resources      (4),
+            securityViolation    (5),
+            protocolError    (6),
+            lackOfActivity    (7),
+            peerAbort      (8),
+            unspecified      (9)}
+
+
+-- Global auxiliary definitions
+  ReferenceId       ::=      [2]  IMPLICIT OCTET STRING
+  ResultSetId        ::=      [31]    IMPLICIT InternationalString
+  ElementSetName     ::=     [103]   IMPLICIT InternationalString
+  DatabaseName     ::=    [105]   IMPLICIT InternationalString
+  AttributeSetId     ::=       OBJECT IDENTIFIER
+
+
+-- OtherInformation
+  OtherInformation   ::= [201] IMPLICIT SEQUENCE OF SEQUENCE{
+    category            [1]   IMPLICIT InfoCategory OPTIONAL, 
+    information        CHOICE{
+      characterInfo        [2]  IMPLICIT InternationalString,
+      binaryInfo        [3]  IMPLICIT OCTET STRING,
+      externallyDefinedInfo    [4]  IMPLICIT EXTERNAL,
+      oid          [5]  IMPLICIT OBJECT IDENTIFIER}}
+--
+  InfoCategory ::= SEQUENCE{
+      categoryTypeId  [1]   IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+      categoryValue  [2]   IMPLICIT INTEGER}
+
+
+-- Units
+  -- IntUnit is used when value and unit are supplied together. Unit, alone, is used when just
+  -- specifying a unit (without a value).  For example, IntUnit is used in Term, in an RPNQuery, or
+  -- it can be the datatype of an element within a retrieval record. Unit (alone) would be used in an
+  -- element request, when requesting data be returned according to a particular unit.
+
+  IntUnit ::= SEQUENCE{
+    value    [1] IMPLICIT INTEGER,
+    unitUsed  [2] IMPLICIT Unit}
+--
+  Unit ::= SEQUENCE{
+    unitSystem    [1] InternationalString OPTIONAL,    -- e.g. 'SI'
+    unitType    [2] StringOrNumeric OPTIONAL,    -- e.g. 'mass'
+    unit      [3] StringOrNumeric OPTIONAL,    -- e.g. 'kilograms'
+    scaleFactor    [4] IMPLICIT INTEGER OPTIONAL    -- e.g. 9 means 10**9
+        }
+
+--CharacterString
+  InternationalString ::= GeneralString
+    -- When version 2 is in force, this collapses to VisibleString. That is, only characters in the
+    -- visibleString repertoire may be used. (Datatype compatibility with version 2 is not affected,
+     -- because references are IMPLICIT.)  When version 3 is in force, the semantics of the
+    -- GeneralString content may be altered by negotiation during initialization. If no such
+    -- negotiation is in effect, then GeneralString semantics are in force.
+
+StringOrNumeric ::= CHOICE{
+  string    [1] IMPLICIT InternationalString,
+  numeric  [2] IMPLICIT INTEGER}
+
+END -- IR DEFINITIONS
+
+
+
+DiagnosticFormatDiag1 
+{Z39-50-diagnosticFormat diag-1 (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Term, Specification, AttributeList, SortElement, DatabaseName, 
+DefaultDiagFormat, InternationalString FROM Z39-50-APDU-1995;
+
+
+DiagnosticFormat ::=  SEQUENCE OF SEQUENCE{ 
+  diagnostic  [1] CHOICE{
+              defaultDiagRec    [1]  IMPLICIT DefaultDiagFormat,
+              explicitDiagnostic    [2]  DiagFormat} OPTIONAL, 
+  message  [2] IMPLICIT InternationalString OPTIONAL} 
+
+
+DiagFormat ::= CHOICE{
+
+tooMany  [1000]   IMPLICIT SEQUENCE{
+                tooManyWhat   [1]  IMPLICIT INTEGER{
+                                  argumentWords        (1), 
+                                  truncatedWords        (2), 
+                                  booleanOperators      (3),
+                                  incompleteSubfields    (4), 
+                                  characters          (5),
+                                  recordsRetrieved      (6), 
+                                  dataBasesSpecified      (7),
+                                  resultSetsCreated      (8), 
+                                  indexTermsProcessed    (9)},
+                max        [2]  IMPLICIT INTEGER OPTIONAL},
+
+
+
+
+
+
+
+badSpec    [1001]  IMPLICIT SEQUENCE{  -- element set name or specification
+                spec        [1] IMPLICIT Specification, -- esn or element spec not supported
+                db        [2] IMPLICIT DatabaseName OPTIONAL,
+                            -- if db specified, above spec not supported for db; otherwise,
+                            -- spec not supported period.
+                goodOnes    [3] IMPLICIT SEQUENCE OF Specification OPTIONAL  
+                            -- target supplies ones that are supported
+                            },
+
+
+dbUnavail  [1002]  IMPLICIT SEQUENCE{ -- database unavailable
+                db  [1] IMPLICIT DatabaseName,
+                why  [2] IMPLICIT SEQUENCE{
+                        reasonCode  [1] IMPLICIT INTEGER{
+                                      doesNotExist    (0),
+                                      existsButUnavail  (1),
+                                      locked      (2),
+                                      accessDenied    (3)} OPTIONAL,
+                        message    [2] IMPLICIT InternationalString OPTIONAL}},
+
+
+unSupOp  [1003]  IMPLICIT INTEGER{  -- unsupported operator
+                and     (0),
+                or      (1),
+                and-not  (2),
+                prox    (3)},
+
+
+attribute    [1004]  IMPLICIT SEQUENCE{
+                    -- Applies for unsupported attribute set, attribute type, 
+                    -- attribute value, or term (for a given attribute type or value).
+
+                id      [1]  IMPLICIT OBJECT IDENTIFIER,
+                   -- if only "id" occurs, then attribute set is not supported
+                type    [2]  IMPLICIT INTEGER OPTIONAL,
+                   -- must occur if value occurs.
+                value    [3]   IMPLICIT INTEGER OPTIONAL,
+                    -- if omitted, and Type occurs, then Type is what is unsupported
+                term    [4]  Term OPTIONAL
+                    -- If occurs, term is illegal or not supported, for attribute value,
+                    -- if value occurs; otherwise, for type.
+                                },
+
+
+attCombo  [1005]  IMPLICIT SEQUENCE{ -- attribute combination not supported
+              unsupportedCombination  [1] IMPLICIT AttributeList, 
+              recommendedAlternatives  [2] IMPLICIT SEQUENCE OF AttributeList OPTIONAL}, 
+
+
+
+
+term      [1006]  IMPLICIT SEQUENCE{
+                problem    [1] IMPLICIT INTEGER{
+                            codedValue  (1),
+                            unparsable  (2),
+                            tooShort    (3),
+                            type      (4)} OPTIONAL,
+                term      [2] Term},
+
+
+proximity  [1007] CHOICE{        -- proximity diagnostics:
+               resultSets  [1]    IMPLICIT NULL,         -- proximity between sets not supported
+              badSet    [2]    IMPLICIT InternationalString,  -- bad result set specified
+                 relation    [3]   IMPLICIT INTEGER,      -- 1 to 6 ; relation not supported
+              unit      [4]  IMPLICIT INTEGER,      -- unsupported unit code
+              distance    [5]  IMPLICIT INTEGER,      -- unsupported distance
+              attributes  [6]  AttributeList,             --  proximity not supported with specified
+                                                   -- attribute combination
+              ordered    [7]  IMPLICIT NULL,        -- ordered flag not supported
+              exclusion  [8]  IMPLICIT NULL          -- exclusion flag not supported
+                    },
+
+
+
+
+
+scan     [1008] CHOICE{      -- scan diagnostics:
+              nonZeroStepSize  [0] IMPLICIT NULL,  -- only zero step size supported
+              specifiedStepSize  [1] IMPLICIT NULL,  -- specified step size not supported
+              termList1      [3] IMPLICIT NULL,  -- term list not supported (no alternative supplied)
+              termList2      [4] IMPLICIT SEQUENCE OF AttributeList,
+                                          -- term list not supported (alternatives supplied)
+              posInResponse    [5] IMPLICIT INTEGER{  --value of positionInResponse not supported
+                              mustBeOne        (1),
+                              mustBePositive    (2),
+                              mustBeNonNegative  (3),
+                              other            (4)},
+              resources      [6] IMPLICIT NULL,   -- resources exhausted looking for satisfying terms
+              endOfList      [7] IMPLICIT NULL  -- beginning or end of term list
+                },
+
+
+sort       [1009] CHOICE{
+              sequence    [0]  IMPLICIT NULL,        -- cannot sort according to sequence
+              noRsName    [1]  IMPLICIT NULL,        -- no result set name supplied
+              tooMany    [2]  IMPLICIT INTEGER,      --  Too many input result sets,
+                                                --  maximum supplied.
+              incompatible  [3]  IMPLICIT NULL,        -- records with different formats
+                                                 -- not compatible for sorting
+              generic      [4]  IMPLICIT NULL,        -- generic sort not supported 
+                                                -- (db specific only)
+              dbSpecific    [5]  IMPLICIT NULL,        -- db specific sort not supported
+              sortElement    [6]  SortElement,
+              key        [7]  IMPLICIT INTEGER{
+                              tooMany  (1),    -- too many sort keys
+                              duplicate  (2)},    -- duplicate sort keys
+              action      [8]  IMPLICIT NULL,  -- unsupported missing data action
+              illegal      [9]  IMPLICIT INTEGER{
+                              relation  (1),  -- illegal sort relation
+                              case    (2),  -- illegal case value
+                              action  (3),   -- illegal missing data action
+                              sort    (4)},  -- illegal sort
+            inputTooLarge    [10]  IMPLICIT SEQUENCE OF InternationalString,
+                                      --   one or more of the input result sets too large to sort
+          aggregateTooLarge  [11]  IMPLICIT NULL  --  aggregate result set too large
+                          },
+
+segmentation  [1010]  CHOICE{
+                segmentCount  [0]    IMPLICIT NULL,
+                                  -- Cannot guarantee record will fit within max segments. Target
+                                  -- suggests that origin try again to retrieve record, without
+                                  -- including max-segment-count.
+                segmentSize  [1]    IMPLICIT INTEGER
+                                -- record cannot be segmented into fragments such that the largest
+                                -- will fit within max segment size specified. Target supplies (in
+                                -- bytes) the smallest acceptable value of Max-segment-size to
+                                -- retrieve the record.
+                          },
+
+
+extServices  [1011] CHOICE{
+                req        [1] IMPLICIT INTEGER{   -- bad request
+                            nameInUse    (1),  -- package name already in use
+                            noSuchName  (2),  -- no such package, on modify/delete
+                            quota        (3),  -- quota exceeded
+                            type        (4)},  -- extended service type not supported
+                permission  [2] IMPLICIT INTEGER{ -- permission denied on ES, because: 
+                            id         (1),    --   id not authorized, or
+                            modifyDelete  (2)},    -- cannot modify or delete
+                immediate  [3] IMPLICIT INTEGER{ -- immediate execution:
+                            failed      (1),    -- failed, 
+                            service      (2),    -- not supported for this service, or
+                            parameters    (3)    -- for these parameters.
+                                }},
+
+
+accessCtrl    [1012] CHOICE{
+                noUser    [1] IMPLICIT NULL,    -- no user to display challenge to
+                refused    [2] IMPLICIT NULL,    -- access control information refused by user
+                simple    [3] IMPLICIT NULL,    -- only simple form supported (target used
+                                          -- externally defined)
+                oid      [4] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+                                          -- oid not supported (origin supplies alternative
+                                          -- suggested oids)
+                alternative  [5] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER,
+                                          -- origin insists that target use an alternative
+                                          -- challenge for this data (e.g. stronger                                     
+   
+                                          -- authentication or stronger Access control). The                            
+              -- origin supplies suggested alternative oids.
+                pwdInv    [6] IMPLICIT NULL,    -- password invalid
+                pwdExp    [7] IMPLICIT NULL      -- password expired
+                    },
+
+
+recordSyntax  [1013] IMPLICIT SEQUENCE{ -- record cannot be transferred in requested syntax
+              unsupportedSyntax    [1] IMPLICIT OBJECT IDENTIFIER, 
+              suggestedAlternatives  [2] IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+}
+
+END
+
+
+
+
+
+RecordSyntax-explain 
+{Z39-50-recordSyntax explain (100)} DEFINITIONS ::=
+
+BEGIN 
+IMPORTS AttributeSetId, Term, OtherInformation, DatabaseName, ElementSetName, IntUnit, Unit,
+ StringOrNumeric, Specification, InternationalString, AttributeList, AttributeElement FROM Z39-50-APDU-1995;
+
+Explain-Record ::= CHOICE{
+  -- Each of these may be used as search term  when Use attribute is 'explain-category'.
+  targetInfo         [0]    IMPLICIT TargetInfo,
+  databaseInfo      [1]    IMPLICIT DatabaseInfo,
+  schemaInfo        [2]    IMPLICIT SchemaInfo,
+  tagSetInfo         [3]    IMPLICIT TagSetInfo,
+  recordSyntaxInfo    [4]    IMPLICIT RecordSyntaxInfo,
+  attributeSetInfo    [5]    IMPLICIT AttributeSetInfo,
+  termListInfo      [6]    IMPLICIT TermListInfo,
+  extendedServicesInfo  [7]    IMPLICIT ExtendedServicesInfo,
+  attributeDetails      [8]    IMPLICIT AttributeDetails,
+  termListDetails    [9]    IMPLICIT TermListDetails,
+  elementSetDetails    [10]  IMPLICIT ElementSetDetails,
+  retrievalRecordDetails  [11]   IMPLICIT RetrievalRecordDetails,
+  sortDetails             [12]   IMPLICIT SortDetails,
+  processing           [13]  IMPLICIT ProcessingInformation,
+  variants          [14]  IMPLICIT VariantSetInfo,
+  units          [15]    IMPLICIT UnitInfo,
+  categoryList            [100]  IMPLICIT CategoryList}
+
+-- Element set name 'B' (brief)  retrieves:
+--  -  'commonInfo' (except for otherInfo within commonInfo)
+--  -  key elements
+--  -  other elements designated as 'non-key brief elements'
+-- Esn 'description' retrieves brief elements as well as 'description', and specific additional descriptive
+-- elements if designated.  
+-- Element set name 'F' (full) retrieves all of the above, as well as those designated as "non-brief elements". Some
+-- elements designated as OPTIONAL may be mandatory in full records, and are so identified. (Note that all elements
+-- that are not part of the brief element set must be designated as OPTIONAL in the ASN.1, otherwise it would be
+-- illegal to omit them.)
+-- Other esns are defined (below) as needed.
+
+-- - - - - - - - - - - - -   Info Records
+  -- Info records are mainly for software consumption
+  -- They describe individual entities within the target system:
+  --   The target itself
+  --   Individual databases
+  --   Schemas
+  --   Tag sets
+  --   Record syntaxes
+  --   Attribute sets
+  --   Term lists
+  --   Extended services
+ --     The information about each Schema, Tag Set, Record Syntax and Attribute Set should
+  -- match the universal definitions of these items. The only exception is that a target may omit any
+  -- items it doesn't support, for example the description of the bib-1 attribute set may omit attributes
+  -- that the target does not support under any circumstances.
+  --      Databases that may be searched together can be listed in the dbCominations element of the TargetInfo record.  
+TargetInfo ::= SEQUENCE {
+  commonInfo      [0]    IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  name          [1]    IMPLICIT InternationalString,
+    -- Non-key brief elements follow:
+  recent-news      [2]    IMPLICIT HumanString OPTIONAL,
+  icon          [3]    IMPLICIT IconObject OPTIONAL,
+  namedResultSets    [4]    IMPLICIT BOOLEAN,
+  multipleDBsearch    [5]    IMPLICIT BOOLEAN,
+  maxResultSets      [6]    IMPLICIT INTEGER OPTIONAL,
+  maxResultSize      [7]    IMPLICIT INTEGER OPTIONAL,
+  maxTerms        [8]    IMPLICIT INTEGER OPTIONAL,
+  timeoutInterval      [9]    IMPLICIT IntUnit OPTIONAL,
+  welcomeMessage    [10]  IMPLICIT HumanString OPTIONAL,
+    -- non-brief elements follow:
+  -- 'description' esn retrieves the following two (as well as brief):
+  contactInfo      [11]  IMPLICIT ContactInfo OPTIONAL,
+  description      [12]  IMPLICIT HumanString OPTIONAL,
+  nicknames        [13]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  usage-restrictions    [14]  IMPLICIT HumanString OPTIONAL,
+  paymentAddr      [15]  IMPLICIT HumanString OPTIONAL,
+  hours          [16]  IMPLICIT HumanString OPTIONAL,
+  dbCombinations    [17]  IMPLICIT SEQUENCE OF DatabaseList OPTIONAL,
+  addresses        [18]  IMPLICIT SEQUENCE OF NetworkAddress OPTIONAL,
+  languages        [101]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                  -- Languages supported for message strings.  Each is a three-character
+                  -- language code from Z39.53-1994.
+-- characterSets      [102]  this tag reserved for "character sets supported for name and message strings".
+  -- commonAccessInfo elements list objects the target supports. All objects listed in
+  -- AccessInfo for any individual database should also be listed here.
+  commonAccessInfo  [19]  IMPLICIT AccessInfo OPTIONAL}
+
+
+DatabaseInfo ::= SEQUENCE {
+      -- A target may provide "virtual databases" that are combinations of individual database. These
+      -- databases are indicated by the presence of subDbs in the combination database's DatabaseDescription.
+  commonInfo        [0]    IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  name            [1]    IMPLICIT DatabaseName,
+    -- Non-key brief elements follow:
+  explainDatabase      [2]             IMPLICIT NULL OPTIONAL,
+                       -- If present, this database is the Explain database, or an Explain database
+                    -- for a different server, possibly on a different host. The means by which
+                    -- that server may be accessed is not addressed by this standard. One
+                    -- suggested possibility is an implementor agreement whereby the
+                    -- database name is a url which may be used to connect to the server.
+  nicknames          [3]    IMPLICIT SEQUENCE OF DatabaseName OPTIONAL,
+  icon            [4]    IMPLICIT IconObject OPTIONAL,
+  user-fee          [5]    IMPLICIT BOOLEAN,
+  available          [6]    IMPLICIT BOOLEAN,
+  titleString          [7]    IMPLICIT HumanString OPTIONAL,
+    -- Non-brief elements follow:
+  keywords          [8]    IMPLICIT SEQUENCE OF HumanString OPTIONAL,
+  description        [9]    IMPLICIT HumanString OPTIONAL,
+  associatedDbs        [10]  IMPLICIT DatabaseList OPTIONAL,
+                    -- databases that may be searched in combination with this one 
+
+  subDbs          [11]  IMPLICIT DatabaseList OPTIONAL,
+                        -- When present, this database is a composite representing the combined
+                     -- databases 'subDbs'. The individual subDbs are also available.
+  disclaimers        [12]  IMPLICIT HumanString OPTIONAL,
+  news            [13]  IMPLICIT HumanString OPTIONAL,
+  recordCount           [14]    CHOICE {
+                                   actualNumber  [0] IMPLICIT INTEGER,
+                                    approxNumber  [1] IMPLICIT INTEGER} OPTIONAL,
+  defaultOrder        [15]  IMPLICIT HumanString OPTIONAL,
+  avRecordSize        [16]  IMPLICIT INTEGER OPTIONAL,
+  maxRecordSize      [17]  IMPLICIT INTEGER OPTIONAL,
+  hours            [18]  IMPLICIT HumanString OPTIONAL,
+  bestTime          [19]  IMPLICIT HumanString OPTIONAL,
+  lastUpdate          [20]  IMPLICIT GeneralizedTime OPTIONAL,
+  updateInterval        [21]  IMPLICIT IntUnit OPTIONAL,
+  coverage          [22]  IMPLICIT HumanString OPTIONAL,
+  proprietary        [23]  IMPLICIT BOOLEAN OPTIONAL, -- mandatory in full record
+  copyrightText        [24]  IMPLICIT HumanString OPTIONAL,
+  copyrightNotice      [25]  IMPLICIT HumanString OPTIONAL,
+  producerContactInfo    [26]  IMPLICIT ContactInfo OPTIONAL,
+  supplierContactInfo      [27]  IMPLICIT ContactInfo OPTIONAL,
+  submissionContactInfo    [28]  IMPLICIT ContactInfo OPTIONAL,
+    -- accessInfo lists items connected with the database. All listed items should be in the target's AccessInfo.
+  accessInfo                [29]  IMPLICIT AccessInfo OPTIONAL}
+
+
+SchemaInfo ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  schema      [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name        [2]  IMPLICIT InternationalString,
+    -- Non-brief elements follow:
+  description    [3]  IMPLICIT HumanString OPTIONAL,
+  tagTypeMapping  [4]  IMPLICIT SEQUENCE OF SEQUENCE {
+              tagType    [0] IMPLICIT INTEGER,
+              tagSet       [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                -- If tagSet is omitted, then this tagType is for a tagSet locally defined
+                -- within the schema that cannot be referenced by another schema.
+              defaultTagType  [2] IMPLICIT NULL OPTIONAL
+                        } OPTIONAL,
+  recordStructure  [5]  IMPLICIT SEQUENCE OF ElementInfo OPTIONAL}
+
+
+  --  ElementInfo referenced in SchemaInfo and RecordSyntaxInfo
+    ElementInfo ::= SEQUENCE {
+      elementName  [1] IMPLICIT InternationalString,
+      elementTagPath  [2] IMPLICIT Path,
+      dataType      [3] ElementDataType OPTIONAL, -- If omitted, not specified. 
+       required         [4] IMPLICIT BOOLEAN,
+      repeatable     [5] IMPLICIT BOOLEAN,
+       description    [6] IMPLICIT HumanString OPTIONAL}
+
+
+  -- Path is referenced by ElementInfo as well as PerElementDetails
+             Path ::= SEQUENCE OF SEQUENCE{
+              tagType  [1] IMPLICIT INTEGER,
+              tagValue     [2] StringOrNumeric}
+      ElementDataType ::= CHOICE{
+            primitive  [0] IMPLICIT PrimitiveDataType,
+           structured  [1] IMPLICIT SEQUENCE OF ElementInfo}
+      PrimitiveDataType ::= INTEGER{
+            octetString        (0),
+            numeric           (1),
+            date            (2),
+            external        (3),
+            string          (4),
+            trueOrFalse       (5),
+            oid         (6),
+            intUnit        (7),
+        empty        (8),
+            noneOfTheAbove  (100) -- see 'description'
+            }
+
+
+TagSetInfo ::= SEQUENCE {
+  commonInfo  [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  tagSet      [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- non-key brief elements follow:
+  name      [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  description  [3]  IMPLICIT HumanString OPTIONAL,
+  elements    [4]  IMPLICIT SEQUENCE OF SEQUENCE {
+              elementname  [1]  IMPLICIT InternationalString,
+               nicknames    [2]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+              elementTag     [3]  StringOrNumeric, 
+              description    [4]  IMPLICIT HumanString OPTIONAL, 
+            dataType       [5]  PrimitiveDataType OPTIONAL,
+              -- If the data type is expected to be structured, that is described in the schema info,
+              -- and datatype is omitted here.
+             otherTagInfo       OtherInformation OPTIONAL} OPTIONAL}
+
+RecordSyntaxInfo ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  recordSyntax    [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name        [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  transferSyntaxes  [3]  IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  description    [4]  IMPLICIT HumanString OPTIONAL,
+  asn1Module    [5]  IMPLICIT InternationalString OPTIONAL,
+  abstractStructure  [6]  IMPLICIT SEQUENCE OF ElementInfo OPTIONAL
+               -- Omitting abstractStructure only means target isn't using
+                 -- Explain to describe the structure, not that there is no structure.
+              }
+
+AttributeSetInfo ::= SEQUENCE {
+  commonInfo  [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  attributeSet  [1]  IMPLICIT AttributeSetId,
+    -- non-key brief elements follow:
+  name      [2]  IMPLICIT InternationalString,
+    -- non-brief elements follow:
+  attributes    [3]  IMPLICIT SEQUENCE OF AttributeType OPTIONAL,
+            -- mandatory in full record
+  description   [4] IMPLICIT HumanString OPTIONAL}
+-- AttributeType referenced in AttributeSetInfo
+  AttributeType ::= SEQUENCE {
+      name             [0] IMPLICIT InternationalString OPTIONAL,
+      description      [1] IMPLICIT HumanString OPTIONAL,
+       attributeType    [2] IMPLICIT INTEGER,
+      attributeValues  [3] IMPLICIT SEQUENCE OF AttributeDescription}
+    AttributeDescription ::= SEQUENCE {
+        name                 [0] IMPLICIT InternationalString OPTIONAL,
+        description          [1] IMPLICIT HumanString OPTIONAL,
+        attributeValue       [2] StringOrNumeric,
+        equivalentAttributes  [3]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL
+                  -- each is an occurrence of 'attributeValue' from AttributeDescription for a
+                  -- different attribute. Equivalences listed here should be derived from the 
+                  -- attribute set definition, not from a particular server's behavior.  
+                    }
+
+
+TermListInfo ::= SEQUENCE{
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName  [1]  IMPLICIT DatabaseName,
+    -- Non-key brief elements follow:
+  termLists      [2] IMPLICIT SEQUENCE OF SEQUENCE{
+            name    [1] IMPLICIT InternationalString,
+            title    [2] IMPLICIT HumanString OPTIONAL,
+                                            -- Title is for users to see and can differ by language. Name, on the
+                      -- other hand is typically a short string not necessarily meant to be
+                       -- human-readable, and not variable by language.
+            searchCost   [3]   IMPLICIT INTEGER {
+                  optimized  (0),    -- The attribute (or combination) associated
+                            -- with this   list will do fast searches. 
+                      normal      (1),    -- The attribute (combination) will work as
+                            -- expected. So there's probably an index for the
+                            -- attribute (combination) or some similar
+                             -- mechanism.
+                      expensive   (2),    -- Can use the attribute (combination), but it
+                            -- might not provide satisfactory results.
+                            -- Probably there is no index, or post-
+                            -- processing of records is required.
+                      filter      (3)    -- can't search with this attribute (combination) alone.
+                         } OPTIONAL,
+              scanable  [4]  IMPLICIT BOOLEAN, -- 'true' means this list can be scanned.
+               broader    [5] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+               narrower  [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL
+                       -- broader and narrower list alternative term lists related to this one.
+                       -- The term lists so listed should also be in this termLists structure.
+                          }
+  -- no non-brief elements
+            }
+
+
+ExtendedServicesInfo ::= SEQUENCE {
+  commonInfo          [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  type          [1]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key brief elements follow:
+  name                [2]  IMPLICIT InternationalString OPTIONAL,
+                -- should be supplied if privateType is 'true'
+  privateType      [3]  IMPLICIT BOOLEAN,
+  restrictionsApply    [5]  IMPLICIT BOOLEAN,  -- if 'true' see 'description'
+  feeApply              [6]  IMPLICIT BOOLEAN,  -- if 'true' see 'description'
+  available             [7]  IMPLICIT BOOLEAN,
+  retentionSupported    [8]  IMPLICIT BOOLEAN,
+  waitAction      [9]  IMPLICIT INTEGER{
+                waitSupported    (1),
+                waitAlways      (2),
+                waitNotSupported  (3),
+                depends      (4),
+                notSaying      (5)},
+  -- non-brief elements follow:
+    -- To get brief plus 'description' use esn 'description'
+  description           [10]  IMPLICIT HumanString OPTIONAL,
+      -- to get above elements and 'specificExplain' use esn 'specificExplain'
+  specificExplain    [11]  IMPLICIT EXTERNAL OPTIONAL,
+                  -- Use oid of specific ES, and select choice [3] 'explain'. Format
+                  -- to be developed in conjunction with the specific ES definition.
+    -- to get all elements except 'specificExplain', use esn 'asn'
+  esASN          [12]  IMPLICIT InternationalString OPTIONAL -- the ASN.1 for this ES
+                }
+
+-- - - - - - - - - - - - - Detail records
+ -- The detail records describe relationships among entities supported by the target. RetrievalRecordDetails describes
+ -- the way that schema elements are mapped into record elements. This mapping may be different for each
+ -- combination of database, schema, record syntax. The per-element details describe the default mapping.
+ -- Origin-request re-tagging can change that mapping. When multiple databases are listed in a databaseNames
+ -- element, the record applies equally to all of the listed databases.  This is unrelated to searching the databases
+ -- together. AttributeDetails describes how databases can be searched. Each supported attribute is listed, and the
+ -- allowable combinations can be described.
+
+
+AttributeDetails ::= SEQUENCE {
+  commonInfo        [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName        [1]  IMPLICIT DatabaseName,
+    -- Non-brief elements follow:
+  attributesBySet        [2]  IMPLICIT SEQUENCE OF AttributeSetDetails OPTIONAL, 
+                  -- mandatory in full record
+  attributeCombinations    [3]  IMPLICIT AttributeCombinations OPTIONAL}
+
+
+
+
+-- AttributeSetDetails referenced by AttributeDetails
+  AttributeSetDetails ::= SEQUENCE {
+        attributeSet      [0] IMPLICIT AttributeSetId,
+          attributesByType  [1] IMPLICIT SEQUENCE OF AttributeTypeDetails }
+    AttributeTypeDetails ::= SEQUENCE {
+         attributeType     [0] IMPLICIT INTEGER,
+          defaultIfOmitted    [1] IMPLICIT OmittedAttributeInterpretation OPTIONAL,
+          attributeValues    [2] IMPLICIT SEQUENCE OF AttributeValue OPTIONAL }
+                          -- If no attributeValues are supplied, all values of this type are fully
+                    -- supported, and the descriptions in AttributeSetInfo are adequate.
+
+    OmittedAttributeInterpretation ::= SEQUENCE {
+        defaultValue           [0] StringOrNumeric OPTIONAL,
+                                -- A default value is listed if that's how the server works
+        defaultDescription  [1] IMPLICIT HumanString OPTIONAL }
+                          -- The human-readable description should generally be provided.
+                    -- It is legal for both default elements to be missing, which
+                    -- means that the target will allow the attribute type to be
+                    -- omitted, but isn't saying what it will do.
+
+    AttributeValue ::= SEQUENCE {
+        value              [0]  StringOrNumeric,
+        description        [1]  IMPLICIT HumanString OPTIONAL,
+        subAttributes     [2]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+        superAttributes    [3]  IMPLICIT SEQUENCE OF StringOrNumeric OPTIONAL,
+        partialSupport    [4]  IMPLICIT NULL OPTIONAL }
+        -- partialSupport indicates that an attributeValue is accepted, but may not be processed in the
+        -- "expected" way. One important reason for this is composite databases: in this case partialSupport
+        -- may indicate that only some of the subDbs support the attribute, and others ignore it.
+
+
+
+TermListDetails ::= SEQUENCE{  -- one for each termList in TermListInfo
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  termListName    [1]  IMPLICIT InternationalString,
+    -- Non-key elements (all non-brief) follow:
+  description    [2]  IMPLICIT HumanString OPTIONAL,
+  attributes      [3]  IMPLICIT AttributeCombinations OPTIONAL,
+                          -- Pattern for attributes that hit this list. Mandatory in full record
+  scanInfo      [4]  IMPLICIT SEQUENCE {
+                maxStepSize         [0] IMPLICIT INTEGER OPTIONAL,
+                collatingSequence  [1] IMPLICIT HumanString OPTIONAL,
+                increasing            [2] IMPLICIT BOOLEAN OPTIONAL} OPTIONAL,
+            -- Occurs only if list is scanable. If list is scanable and if scanInfo is omitted, 
+            -- target doesn't consider these important.
+  estNumberTerms  [5]  IMPLICIT INTEGER OPTIONAL,
+  sampleTerms    [6]  IMPLICIT SEQUENCE OF Term OPTIONAL}
+
+
+
+ElementSetDetails ::= SEQUENCE {
+  -- ElementSetDetails describes the way that database records are mapped to record elements. This
+  -- mapping may be different for each combination of database name and element set. The database record
+   -- description is a schema, which may be private to the target. The schema's abstract record structure
+  -- and tag sets provide the vocabulary for discussing record content; their presence in the Explain
+  -- database does not imply support for complex retrieval specification.
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  elementSetName    [2]  IMPLICIT ElementSetName,
+  recordSyntax      [3]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-key Brief elements follow:
+  schema        [4]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-brief elements follow:
+  description      [5]  IMPLICIT HumanString OPTIONAL,
+  detailsPerElement    [6]  IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL -- mandatory in full record
+              }
+
+
+RetrievalRecordDetails ::= SEQUENCE {
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  schema        [2]  IMPLICIT OBJECT IDENTIFIER,
+  recordSyntax      [3]  IMPLICIT OBJECT IDENTIFIER,
+    -- Non-brief elements follow:
+  description      [4]  IMPLICIT HumanString OPTIONAL,
+  detailsPerElement    [5]  IMPLICIT SEQUENCE OF PerElementDetails OPTIONAL
+                -- mandatory in full record
+            }
+
+-- PerElementDetails is referenced in RetrievalRecordDetails and ElementSetDetails.
+  PerElementDetails ::= SEQUENCE {
+      name      [0]    IMPLICIT InternationalString OPTIONAL,
+                   -- If the name is omitted, the record syntax's name for this element
+                  -- is appropriate.
+      recordTag    [1]    IMPLICIT RecordTag OPTIONAL,
+                   -- The record tag may be omitted if tags are inappropriate for the record
+                  -- syntax, or if the origin can be expected to know it for some other reason.
+      schemaTags    [2]    IMPLICIT SEQUENCE OF Path OPTIONAL,
+                      -- The information from the listed schema elements is combined
+                  -- in some way to produce the data sent in the listed record tag. The
+                  -- 'contents' element below may describe the logic used.
+      maxSize    [3]    IMPLICIT INTEGER OPTIONAL,
+      minSize    [4]    IMPLICIT INTEGER OPTIONAL,
+      avgSize      [5]    IMPLICIT INTEGER OPTIONAL,
+      fixedSize    [6]    IMPLICIT INTEGER OPTIONAL,
+      repeatable    [8]    IMPLICIT BOOLEAN,
+      required    [9]    IMPLICIT BOOLEAN, 
+                  -- 'required' really means that target will always supply the element.
+      description    [12]  IMPLICIT HumanString OPTIONAL,
+      contents    [13]  IMPLICIT HumanString OPTIONAL,
+      billingInfo    [14]  IMPLICIT HumanString OPTIONAL,
+      restrictions    [15]  IMPLICIT HumanString OPTIONAL,
+      alternateNames  [16]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+      genericNames  [17]  IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+      searchAccess  [18]  IMPLICIT AttributeCombinations OPTIONAL }
+      -- RecordTag referenced in PerElementDetails above
+        RecordTag ::= SEQUENCE {
+              qualifier  [0] StringOrNumeric OPTIONAL,
+                    -- E.g. tag set for GRS-1
+              tagValue  [1] StringOrNumeric}
+
+SortDetails ::= SEQUENCE {
+  commonInfo    [0]  IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  databaseName    [1]  IMPLICIT DatabaseName,
+    -- No non-key brief elements
+    -- Non-brief elements follow:
+  sortKeys      [2]  IMPLICIT SEQUENCE OF SortKeyDetails OPTIONAL
+              -- mandatory in full record
+          }
+  SortKeyDetails ::= SEQUENCE {
+      description        [0]  IMPLICIT HumanString OPTIONAL,
+      elementSpecifications  [1]  IMPLICIT SEQUENCE OF Specification OPTIONAL,
+                      -- each specification is a way of specifying this same sort key
+      attributeSpecifications  [2]  IMPLICIT AttributeCombinations OPTIONAL,
+                      -- each combination is a way of specifying this same sort key
+      sortType                   [3]  CHOICE {
+                    character    [0]  IMPLICIT NULL,
+                    numeric    [1]  IMPLICIT NULL,
+                    structured    [2]  IMPLICIT HumanString} OPTIONAL,
+      caseSensitivity      [4]  IMPLICIT INTEGER {
+                      always    (0),  -- always case-sensitive
+                    never    (1),            -- never case-sensitive
+                    default-yes  (2),               -- case-sensitivity is as specified on request, and if not
+                            -- specified, case-sensitive.
+                    default-no  (3)} -- case-sensitivity is as specified on request, and if not
+                            -- specified, not case-sensitive.
+                          OPTIONAL}
+
+ProcessingInformation ::= SEQUENCE{
+  commonInfo      [0]  IMPLICIT CommonInfo OPTIONAL,
+    -- Key elements follow:
+  databaseName      [1]  IMPLICIT DatabaseName,
+  processingContext    [2]  IMPLICIT INTEGER {
+                  access        (0),   -- e.g. choosing databases
+                  search        (1),   -- e.g. "search strategies" or search forms 
+                  retrieval      (2),   -- e.g. recommended element combinations 
+                  record-presentation  (3),    -- display of retrieved records
+                  record-handling    (4)    -- handling (e.g. saving) of retrieved records
+        },
+  name          [3]  IMPLICIT InternationalString,
+  oid          [4]  IMPLICIT OBJECT IDENTIFIER,
+    -- No non-key brief elements
+    -- Non-brief elements follow:
+  description      [5]  IMPLICIT HumanString OPTIONAL,
+                -- use element set name 'description' to retrieve all except instructions.
+  instructions      [6]  IMPLICIT EXTERNAL OPTIONAL -- mandatory in full record
+              }
+
+
+VariantSetInfo ::= SEQUENCE {
+    -- A record in this category describes a variant set definition, i.e., classes, types, and values, for a specific
+    -- variant set definition supported by the target. Support by the target of a particular variant set definition
+    -- does not imply that the definition is supported for any specific database or element. 
+  commonInfo    [0] IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  variantSet    [1] IMPLICIT OBJECT IDENTIFIER,
+  -- Non-key brief elements follow:
+  name      [2] IMPLICIT InternationalString,
+  -- Non-brief elements follow:
+  variants    [3] IMPLICIT SEQUENCE OF VariantClass OPTIONAL
+                   -- mandatory in full record
+           }
+
+  -- Subsidiary structures for VariantSetInfo
+    VariantClass ::= SEQUENCE {
+          name        [0] IMPLICIT InternationalString OPTIONAL,
+          description    [1] IMPLICIT HumanString OPTIONAL,
+          variantClass    [2] IMPLICIT INTEGER,
+          variantTypes  [3] IMPLICIT SEQUENCE OF VariantType}
+    VariantType ::= SEQUENCE {
+          name            [0] IMPLICIT InternationalString OPTIONAL,
+          description     [1] IMPLICIT HumanString OPTIONAL,
+          variantType    [2] IMPLICIT INTEGER,
+          variantValue  [3] IMPLICIT VariantValue OPTIONAL}
+    VariantValue ::= SEQUENCE {
+          dataType     [0] PrimitiveDataType,
+          values        [1] ValueSet OPTIONAL }
+    ValueSet ::= CHOICE {
+          range       [0] IMPLICIT ValueRange,
+          enumerated  [1] IMPLICIT SEQUENCE OF ValueDescription }
+    ValueRange ::= SEQUENCE {
+            -- At last one the following must be supplied, both may be supplied.
+          lower      [0] ValueDescription OPTIONAL,
+          upper     [1] ValueDescription OPTIONAL }
+    ValueDescription ::= CHOICE{
+      integer             INTEGER,
+          string              InternationalString,
+          octets              OCTET STRING,
+          oid                 OBJECT IDENTIFIER,
+          unit               [1]  IMPLICIT Unit,
+          valueAndUnit   [2]  IMPLICIT IntUnit 
+            -- oid and unit can't be used in a ValueRange
+            }
+
+
+
+UnitInfo ::= SEQUENCE {
+  commonInfo  [0] IMPLICIT CommonInfo OPTIONAL,
+  -- Key elements follow:
+  unitSystem   [1] IMPLICIT InternationalString,
+   -- No non-key brief elements
+   -- Non-brief elements follow:
+  description   [2] IMPLICIT HumanString OPTIONAL,
+  units      [3] IMPLICIT SEQUENCE OF UnitType OPTIONAL
+                         -- mandatory in full record
+           }
+
+  -- Subsidiary structures for UnitInfo
+    UnitType ::= SEQUENCE {
+      name    [0] IMPLICIT InternationalString OPTIONAL,
+      description  [1] IMPLICIT HumanString OPTIONAL,
+      unitType  [2] StringOrNumeric,
+      units     [3] IMPLICIT SEQUENCE OF Units}
+
+    Units ::= SEQUENCE {
+      name     [0] IMPLICIT InternationalString OPTIONAL,
+      description  [1] IMPLICIT HumanString OPTIONAL,
+      unit      [2] StringOrNumeric}
+
+CategoryList ::= SEQUENCE {
+  commonInfo      [0] IMPLICIT CommonInfo OPTIONAL,
+    -- Only one record expected per Explain database. All elements appear in brief presentation.
+  categories      [1] IMPLICIT SEQUENCE OF CategoryInfo }
+    CategoryInfo ::= SEQUENCE {
+           category          [1] IMPLICIT InternationalString,
+            originalCategory    [2] IMPLICIT InternationalString OPTIONAL,
+          description         [3] IMPLICIT HumanString OPTIONAL,
+         asn1Module      [4] IMPLICIT InternationalString OPTIONAL}
+
+
+-- - - - - - - - - - - - - - Subsidiary definitions
+
+CommonInfo ::= SEQUENCE {
+  dateAdded         [0] IMPLICIT GeneralizedTime OPTIONAL,
+  dateChanged       [1] IMPLICIT GeneralizedTime OPTIONAL,
+  expiry                [2] IMPLICIT GeneralizedTime OPTIONAL,
+  humanString-Language  [3] IMPLICIT LanguageCode OPTIONAL,
+  -- following not to occur for brief:
+  otherInfo          OtherInformation OPTIONAL}
+
+
+HumanString ::= SEQUENCE OF SEQUENCE {
+          language  [0] IMPLICIT LanguageCode OPTIONAL,
+        text        [1] IMPLICIT InternationalString}
+
+IconObject ::= SEQUENCE OF SEQUENCE{
+      -- Note that the "SEQUENCE OF" is to allow alternative representations of the same Icon; it is not
+      -- intended to allow multiple icons.
+  bodyType [1] CHOICE{
+           ianaType  [1] IMPLICIT InternationalString,
+          z3950type  [2] IMPLICIT InternationalString,
+           otherType  [3] IMPLICIT InternationalString},
+  content  [2] IMPLICIT OCTET STRING}
+
+
+LanguageCode ::= InternationalString  -- from ANSI/NISO Z39.53-1994 
+
+ContactInfo ::= SEQUENCE {
+  name           [0] IMPLICIT InternationalString OPTIONAL,
+  description  [1] IMPLICIT HumanString OPTIONAL,
+  address        [2] IMPLICIT HumanString OPTIONAL,
+  email         [3] IMPLICIT InternationalString OPTIONAL,
+  phone         [4] IMPLICIT InternationalString OPTIONAL}
+
+NetworkAddress ::= CHOICE {
+  internetAddress      [0] IMPLICIT SEQUENCE {
+                  hostAddress    [0]  IMPLICIT InternationalString,
+                  port       [1]  IMPLICIT INTEGER},
+  osiPresentationAddress    [1] IMPLICIT SEQUENCE { 
+                    pSel         [0] IMPLICIT InternationalString,  
+                    sSel         [1] IMPLICIT InternationalString OPTIONAL,  
+                    tSel        [2] IMPLICIT InternationalString OPTIONAL,  
+                    nSap      [3] IMPLICIT InternationalString},
+  other            [2] IMPLICIT SEQUENCE {  
+                      type        [0] IMPLICIT InternationalString,
+                address    [1] IMPLICIT InternationalString}}
+
+AccessInfo ::= SEQUENCE {
+    -- AccessInfo contains the fundamental information about what facilities are required to use this target
+    -- or server. For example, if an origin can handle none of the record syntaxes a database can provide, 
+    -- it might choose not to access the database.
+  queryTypesSupported  [0]    IMPLICIT SEQUENCE OF QueryTypeDetails OPTIONAL,
+  diagnosticsSets        [1]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  attributeSetIds          [2]    IMPLICIT SEQUENCE OF AttributeSetId OPTIONAL,
+  schemas                [3]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  recordSyntaxes         [4]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  resourceChallenges    [5]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  restrictedAccess       [6]    IMPLICIT AccessRestrictions OPTIONAL,
+  costInfo                 [8]    IMPLICIT Costs OPTIONAL,
+  variantSets       [9]    IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL,
+  elementSetNames    [10]  IMPLICIT SEQUENCE OF ElementSetName OPTIONAL,
+  unitSystems      [11]  IMPLICIT SEQUENCE OF InternationalString}
+
+-- begin auxiliary definitions for AccessInfo
+-- Begin Query Details
+QueryTypeDetails ::= CHOICE {
+  private       [0]    IMPLICIT PrivateCapabilities,
+  rpn            [1]    IMPLICIT RpnCapabilities,
+  iso8777          [2]    IMPLICIT Iso8777Capabilities,
+  z39-58      [100]  IMPLICIT HumanString,
+  erpn        [101]  IMPLICIT RpnCapabilities,
+  rankedList      [102]  IMPLICIT HumanString}
+
+PrivateCapabilities ::= SEQUENCE {
+  operators       [0]  IMPLICIT SEQUENCE OF SEQUENCE {
+              operator  [0] IMPLICIT InternationalString,
+              description  [1] IMPLICIT HumanString OPTIONAL } OPTIONAL,
+  searchKeys    [1]  IMPLICIT SEQUENCE OF SearchKey OPTIONAL,  -- field names that can be searched
+  description    [2]  IMPLICIT SEQUENCE OF HumanString OPTIONAL }
+
+RpnCapabilities ::= SEQUENCE {
+  operators                    [0] IMPLICIT SEQUENCE OF INTEGER OPTIONAL,
+                                        -- Omitted means all operators are supported.
+  resultSetAsOperandSupported  [1] IMPLICIT BOOLEAN,
+  restrictionOperandSupported    [2] IMPLICIT BOOLEAN,
+  proximity                    [3] IMPLICIT ProximitySupport OPTIONAL}
+
+Iso8777Capabilities ::= SEQUENCE {
+  searchKeys  [0]  IMPLICIT SEQUENCE OF SearchKey,  -- field names that may be searched
+  restrictions   [1]  IMPLICIT HumanString OPTIONAL 
+            -- Omitted means supported, not specifying units.
+              }
+
+ProximitySupport ::= SEQUENCE {
+  anySupport      [0]   IMPLICIT BOOLEAN,
+          -- 'false' means no proximity support, in which case unitsSupported not supplied.
+  unitsSupported  [1]   IMPLICIT SEQUENCE OF CHOICE{  
+             known  [1] IMPLICIT INTEGER, -- values from KnownProximityUnit
+          private  [2] IMPLICIT SEQUENCE{  
+                      unit    [0] IMPLICIT INTEGER,  
+                description  [1] HumanString OPTIONAL}} OPTIONAL}
+
+SearchKey ::= SEQUENCE {
+  searchKey     [0]  IMPLICIT InternationalString,
+  description     [1]  IMPLICIT HumanString OPTIONAL }
+-- End Query details
+AccessRestrictions ::= SEQUENCE OF SEQUENCE {
+  accessType      [0] INTEGER {
+                  any         (0),
+                  search         (1),
+                  present         (2),
+                  specific-elements  (3),
+                  extended-services  (4),
+            by-database      (5)},
+  accessText         [1]  IMPLICIT HumanString OPTIONAL,
+  accessChallenges  [2]  IMPLICIT SEQUENCE OF OBJECT IDENTIFIER OPTIONAL}
+
+Costs ::= SEQUENCE {
+  connectCharge    [0] IMPLICIT Charge OPTIONAL,    -- Per-connection charge
+  connectTime    [1] IMPLICIT Charge OPTIONAL,    -- Time-based charge
+  displayCharge     [2] IMPLICIT Charge OPTIONAL,    -- Per-record charge
+  searchCharge     [3] IMPLICIT Charge OPTIONAL,    -- Per-search charge
+  subscriptCharge  [4]  IMPLICIT Charge OPTIONAL,  -- Subscription charges
+  otherCharges    [5] IMPLICIT SEQUENCE OF SEQUENCE{   -- Other charges
+            forWhat  [1]  IMPLICIT HumanString,
+            charge    [2]  IMPLICIT Charge} OPTIONAL} 
+    Charge ::= SEQUENCE{
+        cost          [1] IMPLICIT IntUnit,
+        perWhat  [2] IMPLICIT Unit OPTIONAL,
+                      -- e.g. "second," "minute," "line," "record"...
+        text          [3] IMPLICIT HumanString OPTIONAL} 
+-- End Auxiliary definitions for AccessInfo
+
+DatabaseList ::= SEQUENCE OF DatabaseName
+
+AttributeCombinations ::= SEQUENCE {
+  defaultAttributeSet  [0] IMPLICIT AttributeSetId,
+                 -- Default for the combinations. Also probably a good choice for the default
+              -- in searches, but that isn't required.
+  legalCombinations  [1] IMPLICIT SEQUENCE OF AttributeCombination }
+
+
+AttributeCombination ::= SEQUENCE OF AttributeOccurrence
+            -- An AttributeCombination is a pattern for legal combination of attributes
+
+
+AttributeOccurrence ::= SEQUENCE {   
+      -- An AttributeOccurrence lists the legal values for a specific attribute type in a combination.
+       attributeSet       [0]  IMPLICIT AttributeSetId OPTIONAL,
+       attributeType      [1]  IMPLICIT INTEGER,
+       mustBeSupplied  [2]  IMPLICIT NULL OPTIONAL,
+       attributeValues    CHOICE {
+                      any-or-none  [3] IMPLICIT NULL, -- All supported values are OK 
+                      specific    [4] IMPLICIT SEQUENCE OF StringOrNumeric}}
+                                                  -- Only these values allowed
+END
+
+
+
+
+
+
+
+
+
+RecordSyntax-SUTRS
+{Z39-50-recordSyntax SUTRS (101)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString  FROM Z39-50-APDU-1995;
+        SutrsRecord ::=  InternationalString
+-- Line terminator is ASCII LF (X'0A').
+-- Recommended maximum line length is 72 characters.
+END
+
+
+
+
+
+RecordSyntax-opac
+{Z39-50-recordSyntax opac (102)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString  FROM Z39-50-APDU-1995;
+OPACRecord ::= SEQUENCE {
+  bibliographicRecord   [1]   IMPLICIT EXTERNAL OPTIONAL,
+  holdingsData     [2]   IMPLICIT SEQUENCE OF HoldingsRecord OPTIONAL}
+HoldingsRecord ::=  CHOICE {
+  marcHoldingsRecord  [1]   IMPLICIT EXTERNAL,
+  holdingsAndCirc  [2]  IMPLICIT HoldingsAndCircData}
+HoldingsAndCircData ::=  SEQUENCE {
+-- the following elements are required to display holdings in conformance with NISO standards.
+  typeOfRecord    [1]   IMPLICIT InternationalString OPTIONAL, -- LDR 06
+  encodingLevel    [2]   IMPLICIT InternationalString OPTIONAL, -- LDR 017
+  format      [3]   IMPLICIT InternationalString OPTIONAL, -- 007 00-01
+  receiptAcqStatus    [4]   IMPLICIT InternationalString OPTIONAL, -- 008 06
+  generalRetention    [5]   IMPLICIT InternationalString OPTIONAL, -- 008 12
+  completeness    [6]   IMPLICIT InternationalString OPTIONAL, -- 008 16
+       dateOfReport     [7]   IMPLICIT InternationalString OPTIONAL, -- 008 26-31
+  nucCode    [8]   IMPLICIT InternationalString OPTIONAL, -- 852 $a
+  localLocation    [9]   IMPLICIT InternationalString OPTIONAL, -- 852 $b
+  shelvingLocation  [10]   IMPLICIT InternationalString OPTIONAL, -- 852 $c
+  callNumber    [11]   IMPLICIT InternationalString OPTIONAL, -- 852 $h and $i
+  shelvingData     [12]   IMPLICIT InternationalString OPTIONAL, -- 852 $j thru $m
+  copyNumber    [13]   IMPLICIT InternationalString OPTIONAL, -- 852 $t
+  publicNote    [14]   IMPLICIT InternationalString OPTIONAL, -- 852 $z
+  reproductionNote  [15]   IMPLICIT InternationalString OPTIONAL, -- 843
+  termsUseRepro     [16]   IMPLICIT InternationalString OPTIONAL, -- 845
+  enumAndChron    [17]   IMPLICIT InternationalString OPTIONAL, -- all 85x, 86x
+  volumes     [18]   IMPLICIT SEQUENCE OF Volume OPTIONAL, 
+            -- repeats for each volume held
+  circulationData    [19]   IMPLICIT SEQUENCE OF CircRecord OPTIONAL 
+            -- repeats for each circulating item.
+            }
+Volume ::=  SEQUENCE {
+  enumeration    [1]   IMPLICIT InternationalString OPTIONAL,
+  chronology     [2]   IMPLICIT InternationalString OPTIONAL,
+  enumAndChron    [3]   IMPLICIT InternationalString OPTIONAL }
+CircRecord ::=  SEQUENCE {
+  availableNow    [1]   IMPLICIT BOOLEAN,
+  availablityDate    [2]   IMPLICIT InternationalString OPTIONAL,
+  availableThru      [3]   IMPLICIT InternationalString OPTIONAL,
+  restrictions     [4]   IMPLICIT InternationalString OPTIONAL,
+  itemId        [5]   IMPLICIT InternationalString OPTIONAL,
+  renewable        [6]   IMPLICIT BOOLEAN,
+  onHold        [7]   IMPLICIT BOOLEAN,
+  enumAndChron     [8]   IMPLICIT InternationalString OPTIONAL,
+  midspine    [9]   IMPLICIT InternationalString OPTIONAL,
+  temporaryLocation  [10]   IMPLICIT InternationalString OPTIONAL}
+END
+
+
+
+RecordSyntax-summary
+
+{Z39-50-recordSyntax summary (103)} DEFINITIONS ::=
+BEGIN 
+IMPORTS OtherInformation, InternationalString  FROM Z39-50-APDU-1995;
+BriefBib ::= SEQUENCE {
+  title           [1]   IMPLICIT InternationalString,
+  author            [2]   IMPLICIT InternationalString OPTIONAL,
+  callNumber         [3]   IMPLICIT InternationalString OPTIONAL,
+  recordType      [4]   IMPLICIT InternationalString OPTIONAL,
+  bibliographicLevel  [5]   IMPLICIT InternationalString OPTIONAL,
+  format        [6]   IMPLICIT SEQUENCE OF FormatSpec OPTIONAL,
+  publicationPlace    [7]   IMPLICIT InternationalString OPTIONAL,
+  publicationDate     [8]   IMPLICIT InternationalString OPTIONAL,
+  targetSystemKey   [9]   IMPLICIT InternationalString OPTIONAL,
+  satisfyingElement  [10]   IMPLICIT InternationalString OPTIONAL,
+  rank         [11]   IMPLICIT INTEGER OPTIONAL,
+  documentId     [12]   IMPLICIT InternationalString OPTIONAL,
+  abstract       [13]   IMPLICIT InternationalString OPTIONAL,
+  otherInfo        OtherInformation OPTIONAL}
+
+FormatSpec     ::=  SEQUENCE {
+  type         [1]   IMPLICIT InternationalString,
+  size      [2]   IMPLICIT INTEGER OPTIONAL,
+  bestPosn     [3]   IMPLICIT INTEGER OPTIONAL}
+END
+
+
+
+
+
+
+
+
+
+
+RecordSyntax-generic  -- For detailed semantics, see Appendix RET.
+{Z39-50-recordSyntax GRS-1 (105)} DEFINITIONS ::=
+BEGIN 
+EXPORTS Variant;
+IMPORTS IntUnit, Unit, InternationalString, StringOrNumeric, Term FROM Z39-50-APDU-1995;
+
+GenericRecord ::= SEQUENCE OF TaggedElement  
+TaggedElement ::= SEQUENCE {
+  tagType    [1] IMPLICIT INTEGER OPTIONAL,
+              -- If omitted, default should be supplied dynamically by tagSet-M; 
+              -- otherwise it should be statically specified by the schema.
+  tagValue    [2] StringOrNumeric,
+  tagOccurrence  [3] IMPLICIT INTEGER OPTIONAL,
+                             -- Occurrence within the database record, and relative to the parent. No
+              -- default; if omitted, target not telling or it is irrelevant.
+  content      [4] ElementData,
+  metaData    [5] IMPLICIT ElementMetaData OPTIONAL,
+  appliedVariant  [6] IMPLICIT Variant OPTIONAL}
+
+ElementData ::= CHOICE{
+  octets      OCTET STRING,
+  numeric    INTEGER,
+  date      GeneralizedTime,
+  ext        EXTERNAL,
+  string      InternationalString,
+  trueOrFalse    BOOLEAN,
+  oid        OBJECT IDENTIFIER,
+  intUnit          [1]  IMPLICIT IntUnit,
+   elementNotThere    [2] IMPLICIT NULL,  -- element requested but not there
+  elementEmpty      [3] IMPLICIT NULL,  -- element there, but empty
+  noDataRequested    [4] IMPLICIT NULL,  -- variant request said 'no data'
+  diagnostic        [5] IMPLICIT EXTERNAL,
+  subtree          [6] SEQUENCE OF TaggedElement -- recursive, for nested tags
+              }
+
+
+ElementMetaData ::= SEQUENCE{
+  seriesOrder        [1]   IMPLICIT Order OPTIONAL, -- only for a non-leaf node
+  usageRight        [2]   IMPLICIT Usage OPTIONAL,
+  hits            [3]    IMPLICIT SEQUENCE OF HitVector OPTIONAL,
+  displayName      [4]    IMPLICIT InternationalString OPTIONAL, 
+                    -- name for element that origin can use for display
+  supportedVariants    [5]   IMPLICIT SEQUENCE OF Variant OPTIONAL,
+  message        [6]    IMPLICIT InternationalString OPTIONAL,
+  elementDescriptor    [7]   IMPLICIT OCTET STRING OPTIONAL,
+  surrogateFor      [8]   IMPLICIT TagPath OPTIONAL,  
+                    -- the retrieved element is a surrogate for the element given by this path  
+  surrogateElement    [9]   IMPLICIT TagPath OPTIONAL,
+                    -- the element given by this path is a surrogate for the retrieved element
+    other          [99]  IMPLICIT EXTERNAL OPTIONAL}
+
+        TagPath ::= SEQUENCE  OF SEQUENCE{
+          tagType      [1]  IMPLICIT INTEGER OPTIONAL,
+            tagValue      [2]  StringOrNumeric,
+            tagOccurrence    [3]  IMPLICIT INTEGER OPTIONAL}
+
+
+
+Order ::= SEQUENCE{
+  ascending    [1] IMPLICIT BOOLEAN,
+              -- "true" means monotonically increasing (i.e. non-decreasing); 
+              -- "false" means monotonically decreasing (i.e. non-increasing).
+  order      [2] IMPLICIT INTEGER
+              -- Same as defined by 'elementOrdering' in tagSet-M, though this may be
+              -- overridden by schema.
+          }
+
+
+
+Usage ::= SEQUENCE  {
+  type        [1] IMPLICIT INTEGER{
+              redistributable    (1),   -- Element is freely redistributable.
+              restricted      (2),   -- Restriction contains statement.
+              licensePointer    (3)   -- Restriction contains license pointer.
+              },
+  restriction    [2] IMPLICIT InternationalString OPTIONAL}
+
+
+
+HitVector ::= SEQUENCE{ 
+    -- Each hit vector points to a fragment within the element, via location and/or token.
+  satisfier            Term OPTIONAL, -- sourceword, etc.
+  offsetIntoElement    [1] IMPLICIT IntUnit OPTIONAL,
+  length          [2] IMPLICIT IntUnit OPTIONAL,
+  hitRank          [3] IMPLICIT INTEGER OPTIONAL,
+  targetToken        [4] IMPLICIT OCTET STRING OPTIONAL
+                  -- Origin may use token subsequently within a variantRequest (in
+                  --  an elementRequest) to retrieve (or to refer to) the fragment.  
+              }
+
+
+
+
+Variant ::= SEQUENCE{
+    globalVariantSetId    [1] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                  -- Applies to the triples below, when variantSetId omitted. If
+                  -- globalVariantSetId omitted, default applies. Default may be provided by
+                  -- the tagSet-M element defaultVariantSetId.
+
+
+
+
+  triples          [2]  IMPLICIT SEQUENCE OF SEQUENCE{
+                  variantSetId  [0]  IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                              -- If omitted, globalVariantSetId (above)
+                              -- applies, unless that too is omitted, in
+                               -- which case, default used.
+                  class      [1]  IMPLICIT INTEGER,
+                  type      [2]  IMPLICIT INTEGER,
+                  value      [3]  CHOICE{
+                               integer INTEGER,
+                               internationalString InternationalString,
+                               octetString OCTET STRING,
+                               objectIdentifier OBJECT IDENTIFIER,
+                               boolean BOOLEAN,
+                              null NULL,
+                          -- Following need context tags:
+                            unit      [1] IMPLICIT Unit, 
+                            valueAndUnit  [2] IMPLICIT IntUnit}}}
+END
+
+
+
+RecordSyntax-ESTaskPackage
+{Z39-50-recordSyntax ESTaskPackage (106)} DEFINITIONS ::=
+BEGIN 
+IMPORTS Permissions, InternationalString, IntUnit, DiagRec FROM Z39-50-APDU-1995;
+
+TaskPackage ::= SEQUENCE{
+  packageType      [1]   IMPLICIT OBJECT IDENTIFIER,
+                    -- oid of specific ES definition
+  packageName      [2]   IMPLICIT InternationalString OPTIONAL,
+  userId          [3]   IMPLICIT InternationalString OPTIONAL,
+  retentionTime      [4]   IMPLICIT IntUnit OPTIONAL,
+  permissions        [5]   IMPLICIT Permissions OPTIONAL,
+  description        [6]   IMPLICIT InternationalString OPTIONAL,
+  targetReference      [7]   IMPLICIT OCTET STRING OPTIONAL,
+  creationDateTime    [8]   IMPLICIT GeneralizedTime OPTIONAL,
+  taskStatus        [9]   IMPLICIT INTEGER{
+                      pending    (0),
+                      active    (1),
+                      complete  (2),
+                      aborted    (3)},
+  packageDiagnostics    [10]  IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+  taskSpecificParameters  [11]  IMPLICIT EXTERNAL
+                    -- Use oid for specific ES definition
+                    -- (same oid as packageType above)
+                    -- and select [2] "taskPackage."
+    } 
+END
+
+
+
+
+ResourceReport-Format-Resource-1
+{Z39-50-resourceReport resource-1 (1)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString FROM Z39-50-APDU-1995;  
+--
+ResourceReport ::= SEQUENCE{
+estimates    [1]   IMPLICIT SEQUENCE OF Estimate,
+message      [2]   IMPLICIT InternationalString}
+--
+Estimate ::= SEQUENCE{
+type        [1]   IMPLICIT EstimateType,
+value        [2]   IMPLICIT INTEGER,  -- the actual estimate
+currency-code  [3]   IMPLICIT INTEGER OPTIONAL
+                -- code for representation of currencies defined in ISO 4217-1990.  
+                -- Applicable only to monetary estimates.
+                              }
+EstimateType ::= INTEGER{
+currentSearchRecords    (1),         -- estimated no. records in current (incomplete) result set for search
+finalSearchRecords       (2),        -- estimated no. records that will be in result set if search completes
+currentPresentRecords    (3),        -- estimated number of records in current (incomplete) set of
+                      -- records to be returned on Present
+finalPresentRecords      (4),  -- estimated number of records that will be in the set of records
+                      -- to be returned by Present if Present completes
+currentOpTimeProcessing  (5),  -- processing time (in .001 CPU seconds) used by operation so far
+finalOpTimeProcessing    (6),                -- estimated total processing time (in .001 CPU seconds) that will
+                              -- be used by this operation if it completes
+currentAssocTime      (7),  -- estimated processing time used by association (in .001 CPU sec.)
+currentOperationCost      (8),  -- estimated cost for this operation so far
+finalOperationCost      (9),  -- estimated cost for this operation if it completes
+currentAssocCost        (10),  -- estimated cost for this association so far
+finalOpTimeElapsed            (11),  -- estimated elapsed time for operation if it completes (in .001 sec.) 
+percentComplete         (12), -- estimated percent complete
+currentSearchAssocCost    (13),  -- estimated search cost for association so far
+currentPresentAssocCost  (14),  -- estimated present cost for this association so far
+currentConnectAssocCost    (15),  -- estimated connect time cost for association so far
+currentOtherAssocCost    (16)  -- estimated other cost (not included in 13-15) for association so far
+                  }
+END
+
+
+
+
+
+
+
+
+
+
+
+
+
+ResourceReport-Format-Resource-2
+{Z39-50-resourceReport resource-2 (2)} DEFINITIONS ::=
+BEGIN 
+IMPORTS InternationalString, StringOrNumeric, IntUnit FROM Z39-50-APDU-1995;  
+--
+ResourceReport ::= SEQUENCE{
+estimates    [1]   IMPLICIT SEQUENCE OF Estimate OPTIONAL,
+message      [2]   IMPLICIT InternationalString OPTIONAL}
+--
+Estimate ::= SEQUENCE{
+type      [1]   StringOrNumeric,
+              -- Numeric values of 1-16 are the same as used in Resource-1.
+value      [2]   IMPLICIT IntUnit
+              -- When expressing currency:
+              --    unitSystem (of Unit) is 'z3950'  (case insensitive)
+              --    unitType is 'iso4217-1990'       (case insensitive)
+              --    unit is currency code from ISO 4217-1990.
+}
+END
+
+
+
+
+
+AccessControlFormat-prompt-1
+{Z39-50-accessControl prompt-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, DiagRec FROM Z39-50-APDU-1995;
+--
+PromptObject ::= CHOICE{
+  challenge      [1] IMPLICIT Challenge,
+   response        [2] IMPLICIT Response}
+
+  Challenge ::= SEQUENCE OF SEQUENCE {
+    promptId      [1] PromptId,
+                    -- Target supplies a number (for an enumerated prompt) or string (for a non
+                    -- -enumerated prompt), for each prompt, and the origin returns it in response, for
+                    -- this prompt, so target may correlate the prompt response with the prompt.
+    defaultResponse  [2] IMPLICIT InternationalString OPTIONAL,
+     promptInfo      [3] CHOICE{ 
+                    character  [1] IMPLICIT InternationalString,
+                    encrypted  [2] IMPLICIT Encryption} OPTIONAL,
+                    -- Information corresponding to an enumerated prompt. For example if 'type', within
+                    -- PromptId, is 'copyright', then promptInfo may contain a copyright statement.  
+    regExpr        [4] IMPLICIT InternationalString OPTIONAL,
+                              -- A regular expression that promptResponse should match. See IEEE 1003.2
+                    -- Volume 1, Section 2.8 "Regular Expression Notation." For example if promptId
+                    -- is "Year of publication," regExpr might be "19[89][0-9]|20[0-9][0-9]".
+    responseRequired  [5] IMPLICIT NULL OPTIONAL,
+     allowedValues    [6] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                        -- e.g. promptId="Desired color"; allowed = 'red', 'blue','Green'.
+    shouldSave      [7] IMPLICIT NULL OPTIONAL,
+                        -- Target recommends that origin save the data that it prompts from the
+                     -- user corresponding to this prompt, because it is likely to be requested again (so
+                    -- origin might not have to prompt the user next time).
+        dataType        [8] IMPLICIT INTEGER{
+                             integer        (1),
+                          date            (2),
+                        float           (3),
+                        alphaNumeric  (4),
+                        url-urn       (5),
+                        boolean       (6)} OPTIONAL,
+                        -- Target telling origin type of data it wants. E.g., if "date" is specified,
+                        -- presumably the origin will try to prompt something "date-like" from the user.
+        diagnostic       [9] IMPLICIT EXTERNAL OPTIONAL
+                          -- Intended for repeat requests when there is an error the origin 
+                        -- should report to the user from previous attempt.
+                }
+
+
+  Response ::= SEQUENCE OF SEQUENCE {
+      promptId    [1] PromptId,
+                  -- Corresponds to a prompt in the challenge, or may be unprompted, for
+                  -- example "newPassword." If unprompted, should be "enumerated." 
+                  -- If this responds to a non-enumerated prompt, then nonEnumeratedPrompt
+                   -- should contain the prompt string from the challenge.
+    promptResponse  [2] CHOICE{
+                    string      [1] IMPLICIT InternationalString,
+                    accept      [2] IMPLICIT BOOLEAN,
+                    acknowledge  [3] IMPLICIT NULL,
+                    diagnostic    [4] DiagRec,
+                     encrypted    [5] IMPLICIT Encryption}}
+
+
+ PromptId ::= CHOICE{
+  enummeratedPrompt    [1] IMPLICIT SEQUENCE{
+                      type            [1] IMPLICIT INTEGER{
+                                      groupId    (0),
+                                      userId     (1),
+                                      password   (2),
+                                      newPassword  (3),
+                                      copyright    (4),
+                            -- When type on Challenge is 'copyright', promptInfo has text of
+                            -- copyright message to be displayed verbatim to the user. If
+                            -- promptResponse indicates 'acceptance', this indicates the user has been
+                            -- shown, and accepted, the terms of the copyright. This is not intended
+                            -- to be legally binding, but provides a good-faith attempt on
+                            -- the part of the target to inform the user of the copyright.
+                                      sessionId      (5)},
+                      suggestedString    [2] IMPLICIT InternationalString OPTIONAL},
+   nonEnumeratedPrompt  [2] IMPLICIT InternationalString}
+
+
+ Encryption ::= SEQUENCE{
+  cryptType    [1] IMPLICIT OCTET STRING OPTIONAL, 
+  credential    [2] IMPLICIT OCTET STRING OPTIONAL,
+                    --random number, SALT, or other factor
+  data        [3] IMPLICIT OCTET STRING}
+
+END
+
+
+
+
+AccessControlFormat-des-1
+{Z39-50-accessControlFormat  des-1 (2)} DEFINITIONS ::=
+BEGIN
+    DES-RN-Object ::= CHOICE {
+      challenge    [1]    IMPLICIT DRNType,
+      response      [2]    IMPLICIT DRNType}
+    DRNType ::= SEQUENCE{
+          userId        [1]    IMPLICIT OCTET STRING OPTIONAL,
+          salt          [2]    IMPLICIT OCTET STRING OPTIONAL,
+          randomNumber  [3]    IMPLICIT OCTET STRING}
+END
+
+
+AccessControlFormat-krb-1
+{Z39-50-accessControlFormat  krb-1 (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+
+     KRBObject ::= CHOICE {
+       challenge   [1]    IMPLICIT KRBRequest,
+       response    [2]    IMPLICIT KRBResponse}
+     KRBRequest ::= SEQUENCE{
+           service         [1]   IMPLICIT InternationalString,
+           instance        [2]   IMPLICIT InternationalString OPTIONAL,
+           realm          [3]   IMPLICIT InternationalString OPTIONAL}
+        -- target requests a ticket for the given service, instance, and realm
+     KRBResponse ::= SEQUENCE{
+           userid            [1]   IMPLICIT InternationalString OPTIONAL,
+           ticket           [2]  IMPLICIT OCTET STRING}
+        -- origin responds with a ticket for the requested service
+END
+
+
+
+
+
+
+
+
+
+ESFormat-PersistentResultSet
+{Z39-50-extendedService PersistentResultSet (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+PersistentResultSet ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] IMPLICIT NULL,
+        notToKeep  [2] OriginPartNotToKeep OPTIONAL},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+        originPart  [1] IMPLICIT NULL,
+        targetPart  [2] TargetPart OPTIONAL}}
+OriginPartNotToKeep ::= SEQUENCE{
+  originSuppliedResultSet  [1] IMPLICIT InternationalString OPTIONAL,
+          -- name of transient result set, supplied on request, mandatory unless function is 'delete'
+  replaceOrAppend    [2] IMPLICIT INTEGER{  -- only if function is "modify"
+          replace    (1),
+          append    (2)} OPTIONAL}
+TargetPart ::= SEQUENCE{
+  targetSuppliedResultSet  [1] IMPLICIT InternationalString OPTIONAL, 
+          -- Name of transient result set, supplied by target, representing the persistent result set to which
+          -- package pertains. Meaningful only when package  is presented. (i.e. not on ES response).
+  numberOfRecords  [2] IMPLICIT INTEGER OPTIONAL}
+END
+
+
+ESFormat-PersistentQuery
+{Z39-50-extendedService PersistentQuery (2)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, OtherInformation FROM Z39-50-APDU-1995;
+PersistentQuery ::= CHOICE{
+    esRequest      [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep OPTIONAL,
+        notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep OPTIONAL,
+        targetPart  [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+  dbNames        [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  additionalSearchInfo  [3] OtherInformation OPTIONAL}
+OriginPartNotToKeep ::= CHOICE{
+  package    [1] IMPLICIT InternationalString,
+  query    [2] Query}
+TargetPart ::= Query          
+END
+
+ESFormat-PeriodicQuerySchedule
+{Z39-50-extendedService PeriodicQuerySchedule (3)} DEFINITIONS ::=
+BEGIN
+IMPORTS Query, InternationalString, IntUnit FROM Z39-50-APDU-1995 
+ExportSpecification, Destination FROM ESFormat-ExportSpecification;
+
+PeriodicQuerySchedule ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep,
+              targetPart  [2] TargetPart}}
+
+OriginPartToKeep ::=SEQUENCE{
+  activeFlag          [1] IMPLICIT BOOLEAN,
+  databaseNames        [2] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+  resultSetDisposition      [3] IMPLICIT INTEGER{
+                    replace    (1),
+                    append    (2),
+                    createNew  (3)  -- Only if origin and target have agreement about
+                            -- naming convention for the resulting package,
+                             -- and only if no result set is specified.
+                } OPTIONAL,   -- Mandatory on 'create' if result set is specified, in
+                        -- which case it must be 'replace' or 'append.
+  alertDestination        [4] Destination OPTIONAL,
+  exportParameters      [5] CHOICE{
+                    packageName  [1]   IMPLICIT InternationalString,
+                    exportPackage  [2] ExportSpecification} OPTIONAL}
+
+OriginPartNotToKeep ::= SEQUENCE{
+  querySpec           [1] CHOICE{
+                    actualQuery    [1] Query,
+                    packageName  [2] IMPLICIT InternationalString} OPTIONAL,
+                  -- mandatory for 'create'
+  originSuggestedPeriod    [2] Period OPTIONAL,  -- mandatory for 'create'
+  expiration          [3] IMPLICIT GeneralizedTime OPTIONAL,
+  resultSetPackage        [4] IMPLICIT InternationalString OPTIONAL}
+
+TargetPart ::= SEQUENCE{
+  actualQuery        [1] Query,
+  targetStatedPeriod    [2] Period,
+                  -- Target supplies the period, which may be same as origin proposed.
+  expiration        [3] IMPLICIT GeneralizedTime OPTIONAL,
+                  -- Target supplies value for task package. It may be the same as origin
+                  -- proposed or different from (and overrides) origin proposal, but if
+                  -- omitted, there is no expiration.
+  resultSetPackage      [4] IMPLICIT InternationalString OPTIONAL,
+                  -- May be omitted only if exportParameters was supplied. Target
+                  -- supplies same name as origin supplied, if origin did supply a name.
+  lastQueryTime      [5] IMPLICIT GeneralizedTime,
+  lastResultNumber    [6] IMPLICIT INTEGER,
+  numberSinceModify    [7] IMPLICIT INTEGER OPTIONAL}
+
+
+
+
+  Period ::= CHOICE{
+                unit             [1] IMPLICIT IntUnit,
+                 businessDaily     [2] IMPLICIT NULL,
+              continuous       [3] IMPLICIT NULL,
+              other         [4] IMPLICIT InternationalString}
+END
+
+
+ESFormat-ItemOrder
+{Z39-50-extendedService ItemOrder (4)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString FROM Z39-50-APDU-1995;
+ItemOrder ::= CHOICE{
+    esRequest  [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep OPTIONAL,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep OPTIONAL,
+              targetPart  [2] TargetPart}}
+OriginPartToKeep ::= SEQUENCE{
+  supplDescription    [1] IMPLICIT EXTERNAL OPTIONAL,
+  contact        [2] IMPLICIT SEQUENCE{
+                       name  [1]   IMPLICIT InternationalString OPTIONAL,
+                         phone  [2]   IMPLICIT InternationalString OPTIONAL,
+                       email  [3]   IMPLICIT InternationalString OPTIONAL} OPTIONAL,
+  addlBilling      [3] IMPLICIT SEQUENCE{
+                paymentMethod    [1]   CHOICE{
+                                  billInvoice              [0] IMPLICIT NULL,
+                                    prepay                [1] IMPLICIT NULL,
+                                    depositAccount        [2] IMPLICIT NULL,
+                                    creditCard          [3] IMPLICIT CreditCardInfo,
+                    cardInfoPreviouslySupplied  [4] IMPLICIT NULL,
+                    privateKnown        [5] IMPLICIT NULL,
+                    privateNotKnown      [6] IMPLICIT EXTERNAL},
+                customerReference  [2] IMPLICIT InternationalString OPTIONAL,
+                     customerPONumber  [3] IMPLICIT InternationalString OPTIONAL}
+                                 OPTIONAL}
+CreditCardInfo   ::= SEQUENCE{
+       nameOnCard    [1] IMPLICIT InternationalString,
+      expirationDate    [2] IMPLICIT InternationalString,
+    cardNumber      [3] IMPLICIT InternationalString} 
+
+OriginPartNotToKeep ::= SEQUENCE{ -- Corresponds to 'requestedItem' in service definition.
+      --  Must supply at least one, and may supply both.
+  resultSetItem    [1]   IMPLICIT SEQUENCE{  
+                resultSetId    [1]   IMPLICIT InternationalString,
+                    item      [2]   IMPLICIT INTEGER} OPTIONAL,
+  itemRequest      [2] IMPLICIT EXTERNAL OPTIONAL
+                -- When itemRequest is an ILL-Request APDU, 
+                -- use OID {iso standard 10161 abstract-syntax (2) ill-apdus (1)}
+              }
+
+TargetPart ::= SEQUENCE{
+  itemRequest      [1]  IMPLICIT EXTERNAL OPTIONAL,
+    -- When itemRequest is an ILL-Request APDU, use OID 1.0.10161.2.1 (as above)
+  statusOrErrorReport  [2] IMPLICIT EXTERNAL OPTIONAL,
+    -- When statusOrErrorReport is an ILL Status-Or-Error-Report APDU, use OID  1.0.10161.2.1 (as above)
+  auxiliaryStatus    [3]  IMPLICIT INTEGER{
+                notReceived      (1),
+                loanQueue      (2),
+                forwarded      (3),
+                unfilledCopyright  (4),
+                filledCopyright    (5)} OPTIONAL}
+END
+
+
+
+
+ESFormat-Update0
+{Z39-50-extendedService Update (5)} DEFINITIONS ::=
+BEGIN
+IMPORTS DiagRec, InternationalString FROM Z39-50-APDU-1995; 
+Update ::= CHOICE{
+    esRequest  [1] IMPLICIT SEQUENCE{
+              toKeep    [1] OriginPartToKeep,
+              notToKeep  [2] OriginPartNotToKeep},
+    taskPackage  [2] IMPLICIT SEQUENCE{
+              originPart  [1] OriginPartToKeep,
+              targetPart  [2] TargetPart}}
+
+
+OriginPartToKeep ::= SEQUENCE{
+  action          [1] IMPLICIT INTEGER{
+                   recordInsert    (1),
+                   recordReplace  (2),
+                  recordDelete  (3),
+                  elementUpdate  (4)},
+  databaseName      [2] IMPLICIT InternationalString,
+  schema          [3] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+  elementSetName      [4] IMPLICIT InternationalString OPTIONAL}
+
+
+OriginPartNotToKeep ::= SuppliedRecords
+
+
+TargetPart ::= SEQUENCE{
+  updateStatus    [1] IMPLICIT INTEGER{
+                  success  (1),
+                  partial  (2),
+                  failure  (3)},
+  globalDiagnostics  [2] IMPLICIT SEQUENCE OF DiagRec OPTIONAL,
+                -- These are non-surrogate diagnostics relating to the task, 
+                -- not to individual records.
+  taskPackageRecords  [3] IMPLICIT SEQUENCE OF TaskPackageRecordStructure
+                -- There should be a TaskPackageRecordStructure for every record
+                -- supplied. The target should create such a structure for every
+                      -- record immediately upon creating the task package to include
+                -- correlation information and status. The record itself would not
+                -- be included until processing for that record is complete.
+            }
+
+-- Auxiliary definitions for Update
+SuppliedRecords ::= SEQUENCE OF SEQUENCE{
+  recordId    [1] CHOICE{
+              number  [1] IMPLICIT INTEGER,
+              string  [2] IMPLICIT InternationalString,
+              opaque  [3]  IMPLICIT OCTET STRING} OPTIONAL,
+  supplementalId  [2] CHOICE{
+              timeStamp    [1] IMPLICIT GeneralizedTime,
+              versionNumber  [2] IMPLICIT InternationalString,
+              previousVersion  [3] IMPLICIT EXTERNAL} OPTIONAL,
+  correlationInfo  [3] IMPLICIT CorrelationInfo OPTIONAL,
+  record      [4] IMPLICIT EXTERNAL}
+
+CorrelationInfo ::= SEQUENCE{
+          -- origin may supply one or both for any record:
+  note  [1] IMPLICIT InternationalString OPTIONAL,
+  id    [2] IMPLICIT INTEGER OPTIONAL}
+
+TaskPackageRecordStructure ::= SEQUENCE{
+    recordOrSurDiag  [1] CHOICE {
+                record    [1] IMPLICIT EXTERNAL,
+                        -- Choose 'record' if recordStatus is 'success', and
+                        -- elementSetName was supplied.
+                diagnostic  [2] DiagRec
+                        -- Choose 'diagnostic', if RecordStatus is failure.
+                                } OPTIONAL,
+                -- The parameter recordOrSurDiag will thus be omitted only if
+                -- 'elementSetName' was omitted and recordStatus is
+                -- 'success'; or if record status is 'queued' or in 'process'.
+    correlationInfo    [2] IMPLICIT CorrelationInfo OPTIONAL,
+                -- This should be included if it was supplied by the origin.
+    recordStatus      [3] IMPLICIT INTEGER{
+                  success    (1),
+                  queued    (2),
+                  inProcess  (3),
+                  failure    (4)}}
+END
+
+
+ESFormat-ExportSpecification
+{Z39-50-extendedService ExportSpecification (6)} DEFINITIONS ::=
+BEGIN
+EXPORTS ExportSpecification, Destination; IMPORTS CompSpec, InternationalString FROM Z39-50-APDU-1995;
+ExportSpecification ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep,
+        notToKeep  [2] IMPLICIT NULL},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep,
+        targetPart  [2] IMPLICIT NULL}}
+OriginPartToKeep ::= SEQUENCE{
+  composition        [1] IMPLICIT CompSpec,
+  exportDestination    [2] Destination}
+
+  Destination ::= CHOICE{
+  phoneNumber    [1]    IMPLICIT InternationalString,
+  faxNumber      [2]   IMPLICIT InternationalString,
+  x400address      [3]   IMPLICIT InternationalString,
+  emailAddress    [4]   IMPLICIT InternationalString,
+  pagerNumber    [5]   IMPLICIT InternationalString,
+  ftpAddress      [6]   IMPLICIT InternationalString,
+  ftamAddress    [7]   IMPLICIT InternationalString,
+  printerAddress    [8]   IMPLICIT InternationalString,
+  other        [100]  IMPLICIT SEQUENCE{
+                  vehicle      [1]  IMPLICIT InternationalString  OPTIONAL,
+                  destination    [2] IMPLICIT InternationalString}}
+END
+
+
+
+
+ESFormat-ExportInvocation
+{Z39-50-extendedService ExportInvocation (7)} DEFINITIONS ::=
+BEGIN
+IMPORTS InternationalString, IntUnit FROM Z39-50-APDU-1995 
+ExportSpecification FROM ESFormat-ExportSpecification;
+ExportInvocation ::= CHOICE{
+    esRequest    [1] IMPLICIT SEQUENCE{
+        toKeep    [1] OriginPartToKeep,
+        notToKeep  [2] OriginPartNotToKeep},
+    taskPackage    [2] IMPLICIT SEQUENCE{
+        originPart  [1] OriginPartToKeep,
+        targetPart  [2] TargetPart OPTIONAL}}
+
+OriginPartToKeep ::= SEQUENCE{
+  exportSpec    [1] CHOICE{
+              packageName    [1] IMPLICIT InternationalString,
+              packageSpec    [2] ExportSpecification},
+  numberOfCopies  [2] IMPLICIT INTEGER}
+
+
+
+
+
+OriginPartNotToKeep  ::= SEQUENCE{
+  resultSetId      [1] IMPLICIT InternationalString,
+  records        [2] CHOICE{
+                all    [1] IMPLICIT NULL,
+                ranges  [2]   IMPLICIT SEQUENCE OF SEQUENCE{
+                        start  [1] IMPLICIT INTEGER,
+                        count  [2] IMPLICIT INTEGER OPTIONAL
+                          -- Count may be omitted only on last range, to indicate
+                          -- "all remaining records beginning with 'start'."
+                    }}}
+
+TargetPart   ::= SEQUENCE{
+    estimatedQuantity    [1] IMPLICIT IntUnit OPTIONAL,
+    quantitySoFar      [2] IMPLICIT IntUnit OPTIONAL,
+    estimatedCost      [3] IMPLICIT IntUnit OPTIONAL,
+    costSoFar        [4] IMPLICIT IntUnit OPTIONAL}
+END
+
+
+
+UserInfoFormat-searchResult-1
+{Z39-50-userInfoFormat searchResult-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS DatabaseName, Term, Query, IntUnit, InternationalString FROM Z39-50-APDU-1995;
+SearchInfoReport ::= SEQUENCE OF SEQUENCE{
+  subqueryId      [1] IMPLICIT InternationalString OPTIONAL, 
+                           -- shorthand identifier of subquery
+  fullQuery        [2] IMPLICIT BOOLEAN,     -- 'true' means this is the full query; 'false',
+                          -- a sub-query 
+  subqueryExpression    [3] QueryExpression OPTIONAL,  -- A subquery of the query as
+                          -- submitted. May be whole query;
+                          -- if so, "fullQuery" should be 'true'.
+  subqueryInterpretation  [4] QueryExpression OPTIONAL,  -- how target interpreted subquery
+  subqueryRecommendation  [5] QueryExpression OPTIONAL,  -- target-recommended alternative
+  subqueryCount      [6] IMPLICIT INTEGER OPTIONAL,  -- Number of records for this
+                          -- subQuery, across all of the specified
+                          -- databases. (If during search, via resource
+                           -- control, number of records so far).
+  subqueryWeight     [7] IMPLICIT IntUnit OPTIONAL,  -- relative weight of this subquery
+  resultsByDB          [8] IMPLICIT ResultsByDB OPTIONAL}
+
+ResultsByDB ::= SEQUENCE OF SEQUENCE{
+  databases      [1] CHOICE{
+            all     [1] IMPLICIT NULL,
+                  -- applies across all of the databases in Search PDU
+            list    [2]  IMPLICIT SEQUENCE OF DatabaseName
+                  -- applies across all databases in this list
+              },
+  count        [2] IMPLICIT INTEGER OPTIONAL,
+            -- Number of records for query component (and, as above, if during search,
+             -- via resource control, number of records so far).
+  resultSetName    [3] IMPLICIT InternationalString OPTIONAL
+                        -- Target-assigned result set by which subQuery is available. Should not
+             -- be provided unless processing for this query component is concluded (i.e.,
+            -- when this report comes during search, via resource control, as opposed
+            -- to after search, via additionalSearchInfo).
+              }
+
+QueryExpression ::=  CHOICE {
+                term   [1] IMPLICIT SEQUENCE{
+              queryTerm  [1]  Term,
+              termComment            [2] IMPLICIT InternationalString OPTIONAL},
+           query  [2] Query}
+END
+
+
+
+ElementSpecificationFormat-eSpec-1
+{Z39-50-elementSpec eSpec-1 (1)} DEFINITIONS ::=
+BEGIN
+IMPORTS Variant FROM RecordSyntax-generic
+StringOrNumeric, InternationalString FROM Z39-50-APDU-1995;
+--
+Espec-1 ::= SEQUENCE{
+  elementSetNames    [1] IMPLICIT SEQUENCE OF InternationalString OPTIONAL,
+                  -- Origin may include one or more element set names, each
+                  -- specifying a set of elements. Each of the elements is to be
+                  -- treated as an elementRequest in the form of simpleElement,
+                  -- where occurrence is 1. 
+  defaultVariantSetId    [2] IMPLICIT OBJECT IDENTIFIER OPTIONAL,
+                  -- If supplied, applies whenever variantRequest 
+                  -- does not include variantSetId. 
+  defaultVariantRequest  [3] IMPLICIT Variant OPTIONAL,
+                  -- If supplied, then for each simple elementRequest that does not
+                   -- include a variantRequest, the defaultVariantRequest applies.
+                  -- (defaultVariantRequest does not apply to a compositeRequest.)
+  defaultTagType      [4] IMPLICIT INTEGER OPTIONAL,
+                  -- If supplied, applies whenever 'tagType' (within 'tag' within TagPath) 
+                  -- is omitted.
+  elements        [5] IMPLICIT SEQUENCE OF ElementRequest OPTIONAL}
+--
+
+ElementRequest::= CHOICE{
+  simpleElement    [1]   IMPLICIT SimpleElement,
+  compositeElement  [2] IMPLICIT SEQUENCE{
+            elementList    [1] CHOICE{
+                  primitives    [1]   IMPLICIT SEQUENCE OF InternationalString,
+                              -- Origin may specify one or more element
+                              -- set names, each identifying a set of elements,
+                              -- and the composite element is the union.
+                  specs      [2] IMPLICIT SEQUENCE OF SimpleElement},
+
+            deliveryTag    [2] IMPLICIT TagPath,
+                          -- DeliveryTag tagPath for compositeElement may not
+                          -- include wildThing or wildPath.
+            variantRequest  [3] IMPLICIT Variant OPTIONAL}}
+
+SimpleElement ::= SEQUENCE{
+      path        [1] IMPLICIT TagPath,
+      variantRequest  [2] IMPLICIT Variant OPTIONAL}
+  
+
+TagPath ::= SEQUENCE OF CHOICE{  
+  specificTag  [1] IMPLICIT SEQUENCE{
+            tagType  [1] IMPLICIT INTEGER OPTIONAL,
+                      -- If omitted, then 'defaultTagType' (above) applies, if supplied, and
+                      -- if not supplied, then default listed in schema applies.
+            tagValue  [2] StringOrNumeric,
+             occurrence  [3] Occurrences OPTIONAL 
+                      -- default is "first occurrence"
+                  },
+  wildThing  [2] Occurrences,
+              -- Get Nth "thing" at this level, regardless of tag, for each N specified by
+            -- "Occurrences" (which may be 'all' meaning match every element at this level).
+            -- E.g., if "Occurrences" is 3, get third element regardless of its tag or the tag of
+            -- the first two elements.
+  wildPath  [3] IMPLICIT NULL
+              -- Match any tag, at this level or below, that is on a path for which next tag in this 
+              -- TagPath sequence occurs. WildPath may not be last member of the TagPath
+            -- sequence.
+                      }
+--
+
+Occurrences ::= CHOICE{
+  all    [1] IMPLICIT NULL,
+  last    [2] IMPLICIT NULL,
+  values  [3] IMPLICIT SEQUENCE{
+          start    [1] IMPLICIT INTEGER,
+                  -- if 'start' alone is included, then single occurrence is requested
+          howMany  [2] IMPLICIT INTEGER OPTIONAL
+                  -- For example, if 'start' is 5 and 'howMany' is 6, then request is for
+                  -- "occurrences 5 through 10."
+                  }}
+END
+
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-expi.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-expi.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-expi.c	(revision 21083)
@@ -0,0 +1,124 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-ExportInvocation */
+
+#include <yaz/zes-expi.h>
+
+int z_EIExportInvocationEsRequest (ODR o, Z_EIExportInvocationEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_EIOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_explicit_tag (o, z_EIOriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_EIExportInvocationTaskPackage (ODR o, Z_EIExportInvocationTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_EIOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_explicit_tag (o, z_EITargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 1, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_EIExportInvocation (ODR o, Z_EIExportInvocation **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_EIExportInvocation_esRequest,
+		(Odr_fun) z_EIExportInvocationEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_EIExportInvocation_taskPackage,
+		(Odr_fun) z_EIExportInvocationTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_EIOriginPartToKeep (ODR o, Z_EIOriginPartToKeep **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_EIOriginPartToKeep_packageName,
+		(Odr_fun) z_InternationalString, "packageName"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_EIOriginPartToKeep_packageSpec,
+		(Odr_fun) z_ESExportSpecification, "packageSpec"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "exportSpec") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfCopies, ODR_CONTEXT, 2, 0, "numberOfCopies") &&
+		odr_sequence_end (o);
+}
+
+int z_EIOriginPartNotToKeepRanges_s (ODR o, Z_EIOriginPartNotToKeepRanges_s **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->start, ODR_CONTEXT, 1, 0, "start") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->count, ODR_CONTEXT, 2, 1, "count") &&
+		odr_sequence_end (o);
+}
+
+int z_EIOriginPartNotToKeepRanges (ODR o, Z_EIOriginPartNotToKeepRanges **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_EIOriginPartNotToKeepRanges_s, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_EIOriginPartNotToKeep (ODR o, Z_EIOriginPartNotToKeep **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_EIOriginPartNotToKeep_all,
+		(Odr_fun) odr_null, "all"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_EIOriginPartNotToKeep_ranges,
+		(Odr_fun) z_EIOriginPartNotToKeepRanges, "ranges"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetId, ODR_CONTEXT, 1, 0, "resultSetId") &&
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 2, "records") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_sequence_end (o);
+}
+
+int z_EITargetPart (ODR o, Z_EITargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->estimatedQuantity, ODR_CONTEXT, 1, 1, "estimatedQuantity") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->quantitySoFar, ODR_CONTEXT, 2, 1, "quantitySoFar") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->estimatedCost, ODR_CONTEXT, 3, 1, "estimatedCost") &&
+		odr_implicit_tag (o, z_IntUnit,
+			&(*p)->costSoFar, ODR_CONTEXT, 4, 1, "costSoFar") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-exps.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-exps.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-exps.c	(revision 21083)
@@ -0,0 +1,100 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-ExportSpecification */
+
+#include <yaz/zes-exps.h>
+
+int z_ESExportSpecificationEsRequest (ODR o, Z_ESExportSpecificationEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_ESOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_ESExportSpecificationTaskPackage (ODR o, Z_ESExportSpecificationTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_ESOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_implicit_tag (o, odr_null,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_ESExportSpecification (ODR o, Z_ESExportSpecification **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ESExportSpecification_esRequest,
+		(Odr_fun) z_ESExportSpecificationEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ESExportSpecification_taskPackage,
+		(Odr_fun) z_ESExportSpecificationTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_ESOriginPartToKeep (ODR o, Z_ESOriginPartToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_CompSpec,
+			&(*p)->composition, ODR_CONTEXT, 1, 0, "composition") &&
+		odr_explicit_tag (o, z_ESDestination,
+			&(*p)->exportDestination, ODR_CONTEXT, 2, 0, "exportDestination") &&
+		odr_sequence_end (o);
+}
+
+int z_ESDestinationOther (ODR o, Z_ESDestinationOther **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->vehicle, ODR_CONTEXT, 1, 1, "vehicle") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->destination, ODR_CONTEXT, 2, 0, "destination") &&
+		odr_sequence_end (o);
+}
+
+int z_ESDestination (ODR o, Z_ESDestination **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_ESDestination_phoneNumber,
+		(Odr_fun) z_InternationalString, "phoneNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_ESDestination_faxNumber,
+		(Odr_fun) z_InternationalString, "faxNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_ESDestination_x400address,
+		(Odr_fun) z_InternationalString, "x400address"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_ESDestination_emailAddress,
+		(Odr_fun) z_InternationalString, "emailAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_ESDestination_pagerNumber,
+		(Odr_fun) z_InternationalString, "pagerNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_ESDestination_ftpAddress,
+		(Odr_fun) z_InternationalString, "ftpAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 7, Z_ESDestination_ftamAddress,
+		(Odr_fun) z_InternationalString, "ftamAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 8, Z_ESDestination_printerAddress,
+		(Odr_fun) z_InternationalString, "printerAddress"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 100, Z_ESDestination_other,
+		(Odr_fun) z_ESDestinationOther, "other"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-order.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-order.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-order.c	(revision 21083)
@@ -0,0 +1,157 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-ItemOrder */
+
+#include <yaz/zes-order.h>
+
+int z_IORequest (ODR o, Z_IORequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IOOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 1, "toKeep") &&
+		odr_explicit_tag (o, z_IOOriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_IOTaskPackage (ODR o, Z_IOTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IOOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 1, "originPart") &&
+		odr_explicit_tag (o, z_IOTargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_IOItemOrder (ODR o, Z_IOItemOrder **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IOItemOrder_esRequest,
+		(Odr_fun) z_IORequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IOItemOrder_taskPackage,
+		(Odr_fun) z_IOTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IOContact (ODR o, Z_IOContact **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->name, ODR_CONTEXT, 1, 1, "name") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->phone, ODR_CONTEXT, 2, 1, "phone") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->email, ODR_CONTEXT, 3, 1, "email") &&
+		odr_sequence_end (o);
+}
+
+int z_IOBilling (ODR o, Z_IOBilling **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 0, Z_IOBilling_billInvoice,
+		(Odr_fun) odr_null, "billInvoice"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IOBilling_prepay,
+		(Odr_fun) odr_null, "prepay"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IOBilling_depositAccount,
+		(Odr_fun) odr_null, "depositAccount"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IOBilling_creditCard,
+		(Odr_fun) z_IOCreditCardInfo, "creditCard"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_IOBilling_cardInfoPreviouslySupplied,
+		(Odr_fun) odr_null, "cardInfoPreviouslySupplied"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 5, Z_IOBilling_privateKnown,
+		(Odr_fun) odr_null, "privateKnown"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 6, Z_IOBilling_privateNotKnown,
+		(Odr_fun) z_External, "privateNotKnown"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "paymentMethod") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o) &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->customerReference, ODR_CONTEXT, 2, 1, "customerReference") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->customerPONumber, ODR_CONTEXT, 3, 1, "customerPONumber") &&
+		odr_sequence_end (o);
+}
+
+int z_IOOriginPartToKeep (ODR o, Z_IOOriginPartToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_External,
+			&(*p)->supplDescription, ODR_CONTEXT, 1, 1, "supplDescription") &&
+		odr_implicit_tag (o, z_IOContact,
+			&(*p)->contact, ODR_CONTEXT, 2, 1, "contact") &&
+		odr_implicit_tag (o, z_IOBilling,
+			&(*p)->addlBilling, ODR_CONTEXT, 3, 1, "addlBilling") &&
+		odr_sequence_end (o);
+}
+
+int z_IOCreditCardInfo (ODR o, Z_IOCreditCardInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->nameOnCard, ODR_CONTEXT, 1, 0, "nameOnCard") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->expirationDate, ODR_CONTEXT, 2, 0, "expirationDate") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->cardNumber, ODR_CONTEXT, 3, 0, "cardNumber") &&
+		odr_sequence_end (o);
+}
+
+int z_IOResultSetItem (ODR o, Z_IOResultSetItem **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetId, ODR_CONTEXT, 1, 0, "resultSetId") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->item, ODR_CONTEXT, 2, 0, "item") &&
+		odr_sequence_end (o);
+}
+
+int z_IOOriginPartNotToKeep (ODR o, Z_IOOriginPartNotToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_IOResultSetItem,
+			&(*p)->resultSetItem, ODR_CONTEXT, 1, 1, "resultSetItem") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->itemRequest, ODR_CONTEXT, 2, 1, "itemRequest") &&
+		odr_sequence_end (o);
+}
+
+int z_IOTargetPart (ODR o, Z_IOTargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_External,
+			&(*p)->itemRequest, ODR_CONTEXT, 1, 1, "itemRequest") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->statusOrErrorReport, ODR_CONTEXT, 2, 1, "statusOrErrorReport") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->auxiliaryStatus, ODR_CONTEXT, 3, 1, "auxiliaryStatus") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pquery.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pquery.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pquery.c	(revision 21083)
@@ -0,0 +1,80 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-PersistentQuery */
+
+#include <yaz/zes-pquery.h>
+
+int z_PQueryPersistentQueryEsRequest (ODR o, Z_PQueryPersistentQueryEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PQueryOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 1, "toKeep") &&
+		odr_explicit_tag (o, z_PQueryOriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_PQueryPersistentQueryTaskPackage (ODR o, Z_PQueryPersistentQueryTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PQueryOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 1, "originPart") &&
+		odr_explicit_tag (o, z_PQueryTargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_PQueryPersistentQuery (ODR o, Z_PQueryPersistentQuery **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PQueryPersistentQuery_esRequest,
+		(Odr_fun) z_PQueryPersistentQueryEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PQueryPersistentQuery_taskPackage,
+		(Odr_fun) z_PQueryPersistentQueryTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PQueryOriginPartToKeep (ODR o, Z_PQueryOriginPartToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->dbNames,
+		  &(*p)->num_dbNames, "dbNames") || odr_ok(o)) &&
+		odr_explicit_tag (o, z_OtherInformation,
+			&(*p)->additionalSearchInfo, ODR_CONTEXT, 3, 1, "additionalSearchInfo") &&
+		odr_sequence_end (o);
+}
+
+int z_PQueryOriginPartNotToKeep (ODR o, Z_PQueryOriginPartNotToKeep **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PQueryOriginPartNotToKeep_package,
+		(Odr_fun) z_InternationalString, "package"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_PQueryOriginPartNotToKeep_query,
+		(Odr_fun) z_Query, "query"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PQueryTargetPart (ODR o, Z_PQueryTargetPart **p, int opt, const char *name)
+{
+	return z_Query (o, p, opt, name);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-psched.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-psched.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-psched.c	(revision 21083)
@@ -0,0 +1,139 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-PeriodicQuerySchedule */
+
+#include <yaz/zes-psched.h>
+
+int z_PQSPeriodicQueryScheduleEsRequest (ODR o, Z_PQSPeriodicQueryScheduleEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PQSOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_explicit_tag (o, z_PQSOriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_PQSPeriodicQueryScheduleTaskPackage (ODR o, Z_PQSPeriodicQueryScheduleTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_PQSOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_explicit_tag (o, z_PQSTargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_PQSPeriodicQuerySchedule (ODR o, Z_PQSPeriodicQuerySchedule **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PQSPeriodicQuerySchedule_esRequest,
+		(Odr_fun) z_PQSPeriodicQueryScheduleEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PQSPeriodicQuerySchedule_taskPackage,
+		(Odr_fun) z_PQSPeriodicQueryScheduleTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PQSOriginPartToKeep (ODR o, Z_PQSOriginPartToKeep **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PQSOriginPartToKeep_packageName,
+		(Odr_fun) z_InternationalString, "packageName"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_PQSOriginPartToKeep_exportPackage,
+		(Odr_fun) z_ESExportSpecification, "exportPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_bool,
+			&(*p)->activeFlag, ODR_CONTEXT, 1, 0, "activeFlag") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_InternationalString, &(*p)->databaseNames,
+		  &(*p)->num_databaseNames, "databaseNames") || odr_ok(o)) &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->resultSetDisposition, ODR_CONTEXT, 3, 1, "resultSetDisposition") &&
+		odr_explicit_tag (o, z_ESDestination,
+			&(*p)->alertDestination, ODR_CONTEXT, 4, 1, "alertDestination") &&
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 5, "exportParameters") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
+
+int z_PQSOriginPartNotToKeep (ODR o, Z_PQSOriginPartNotToKeep **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_EXPLICIT, ODR_CONTEXT, 1, Z_PQSOriginPartNotToKeep_actualQuery,
+		(Odr_fun) z_Query, "actualQuery"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PQSOriginPartNotToKeep_packageName,
+		(Odr_fun) z_InternationalString, "packageName"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "querySpec") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_explicit_tag (o, z_PQSPeriod,
+			&(*p)->originSuggestedPeriod, ODR_CONTEXT, 2, 1, "originSuggestedPeriod") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->expiration, ODR_CONTEXT, 3, 1, "expiration") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetPackage, ODR_CONTEXT, 4, 1, "resultSetPackage") &&
+		odr_sequence_end (o);
+}
+
+int z_PQSTargetPart (ODR o, Z_PQSTargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_Query,
+			&(*p)->actualQuery, ODR_CONTEXT, 1, 0, "actualQuery") &&
+		odr_explicit_tag (o, z_PQSPeriod,
+			&(*p)->targetStatedPeriod, ODR_CONTEXT, 2, 0, "targetStatedPeriod") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->expiration, ODR_CONTEXT, 3, 1, "expiration") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->resultSetPackage, ODR_CONTEXT, 4, 1, "resultSetPackage") &&
+		odr_implicit_tag (o, odr_generalizedtime,
+			&(*p)->lastQueryTime, ODR_CONTEXT, 5, 0, "lastQueryTime") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->lastResultNumber, ODR_CONTEXT, 6, 0, "lastResultNumber") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberSinceModify, ODR_CONTEXT, 7, 1, "numberSinceModify") &&
+		odr_sequence_end (o);
+}
+
+int z_PQSPeriod (ODR o, Z_PQSPeriod **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PQSPeriod_unit,
+		(Odr_fun) z_IntUnit, "unit"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PQSPeriod_businessDaily,
+		(Odr_fun) odr_null, "businessDaily"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_PQSPeriod_continuous,
+		(Odr_fun) odr_null, "continuous"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 4, Z_PQSPeriod_other,
+		(Odr_fun) z_InternationalString, "other"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pset.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pset.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-pset.c	(revision 21083)
@@ -0,0 +1,69 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-PersistentResultSet */
+
+#include <yaz/zes-pset.h>
+
+int z_PRPersistentResultSetEsRequest (ODR o, Z_PRPersistentResultSetEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_null,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_explicit_tag (o, z_PROriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 1, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_PRPersistentResultSetTaskPackage (ODR o, Z_PRPersistentResultSetTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_null,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_explicit_tag (o, z_PRTargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 1, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_PRPersistentResultSet (ODR o, Z_PRPersistentResultSet **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_PRPersistentResultSet_esRequest,
+		(Odr_fun) z_PRPersistentResultSetEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_PRPersistentResultSet_taskPackage,
+		(Odr_fun) z_PRPersistentResultSetTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_PROriginPartNotToKeep (ODR o, Z_PROriginPartNotToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->originSuppliedResultSet, ODR_CONTEXT, 1, 1, "originSuppliedResultSet") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->replaceOrAppend, ODR_CONTEXT, 2, 1, "replaceOrAppend") &&
+		odr_sequence_end (o);
+}
+
+int z_PRTargetPart (ODR o, Z_PRTargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->targetSuppliedResultSet, ODR_CONTEXT, 1, 1, "targetSuppliedResultSet") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->numberOfRecords, ODR_CONTEXT, 2, 1, "numberOfRecords") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update.c	(revision 21083)
@@ -0,0 +1,188 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-Update */
+
+#include <yaz/zes-update.h>
+
+int z_IUUpdateEsRequest (ODR o, Z_IUUpdateEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IUOriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_explicit_tag (o, z_IUOriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_IUUpdateTaskPackage (ODR o, Z_IUUpdateTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IUOriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_explicit_tag (o, z_IUTargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_IUUpdate (ODR o, Z_IUUpdate **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUUpdate_esRequest,
+		(Odr_fun) z_IUUpdateEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUUpdate_taskPackage,
+		(Odr_fun) z_IUUpdateTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IUOriginPartToKeep (ODR o, Z_IUOriginPartToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->action, ODR_CONTEXT, 1, 0, "action") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->databaseName, ODR_CONTEXT, 2, 0, "databaseName") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 3, 1, "schema") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->elementSetName, ODR_CONTEXT, 4, 1, "elementSetName") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->actionQualifier, ODR_CONTEXT, 5, 1, "actionQualifier") &&
+		odr_sequence_end (o);
+}
+
+int z_IUOriginPartNotToKeep (ODR o, Z_IUOriginPartNotToKeep **p, int opt, const char *name)
+{
+	return z_IUSuppliedRecords (o, p, opt, name);
+}
+
+int z_IUTargetPart (ODR o, Z_IUTargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->updateStatus, ODR_CONTEXT, 1, 0, "updateStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->globalDiagnostics,
+		  &(*p)->num_globalDiagnostics, "globalDiagnostics") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_IUTaskPackageRecordStructure, &(*p)->taskPackageRecords,
+		  &(*p)->num_taskPackageRecords, "taskPackageRecords") &&
+		odr_sequence_end (o);
+}
+
+int z_IUSuppliedRecordsId (ODR o, Z_IUSuppliedRecordsId **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecordsId_timeStamp,
+		(Odr_fun) odr_generalizedtime, "timeStamp"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecordsId_versionNumber,
+		(Odr_fun) z_InternationalString, "versionNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecordsId_previousVersion,
+		(Odr_fun) z_External, "previousVersion"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IUSuppliedRecords_elem (ODR o, Z_IUSuppliedRecords_elem **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUSuppliedRecords_elem_number,
+		(Odr_fun) odr_integer, "number"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUSuppliedRecords_elem_string,
+		(Odr_fun) z_InternationalString, "string"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IUSuppliedRecords_elem_opaque,
+		(Odr_fun) odr_octetstring, "opaque"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "recordId") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_explicit_tag (o, z_IUSuppliedRecordsId,
+			&(*p)->supplementalId, ODR_CONTEXT, 2, 1, "supplementalId") &&
+		odr_implicit_tag (o, z_IUCorrelationInfo,
+			&(*p)->correlationInfo, ODR_CONTEXT, 3, 1, "correlationInfo") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->record, ODR_CONTEXT, 4, 0, "record") &&
+		odr_sequence_end (o);
+}
+
+int z_IUSuppliedRecords (ODR o, Z_IUSuppliedRecords **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_IUSuppliedRecords_elem, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IUCorrelationInfo (ODR o, Z_IUCorrelationInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->note, ODR_CONTEXT, 1, 1, "note") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->id, ODR_CONTEXT, 2, 1, "id") &&
+		odr_sequence_end (o);
+}
+
+int z_IUTaskPackageRecordStructureSurrogateDiagnostics (ODR o, Z_IUTaskPackageRecordStructureSurrogateDiagnostics **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_DiagRec, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IUTaskPackageRecordStructure (ODR o, Z_IUTaskPackageRecordStructure **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IUTaskPackageRecordStructure_record,
+		(Odr_fun) z_External, "record"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IUTaskPackageRecordStructure_surrogateDiagnostics,
+		(Odr_fun) z_IUTaskPackageRecordStructureSurrogateDiagnostics, "surrogateDiagnostics"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "recordOrSurDiag") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_IUCorrelationInfo,
+			&(*p)->correlationInfo, ODR_CONTEXT, 2, 1, "correlationInfo") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->recordStatus, ODR_CONTEXT, 3, 0, "recordStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 4) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->supplementalDiagnostics,
+		  &(*p)->num_supplementalDiagnostics, "supplementalDiagnostics") || odr_ok(o)) &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update0.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update0.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/z39.50/zes-update0.c	(revision 21083)
@@ -0,0 +1,172 @@
+/* Generated automatically by the YAZ ASN.1 Compiler 0.3 */
+/* Module-C: ESFormat-Update0 */
+
+#include <yaz/zes-update0.h>
+
+int z_IU0UpdateEsRequest (ODR o, Z_IU0UpdateEsRequest **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IU0OriginPartToKeep,
+			&(*p)->toKeep, ODR_CONTEXT, 1, 0, "toKeep") &&
+		odr_explicit_tag (o, z_IU0OriginPartNotToKeep,
+			&(*p)->notToKeep, ODR_CONTEXT, 2, 0, "notToKeep") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0UpdateTaskPackage (ODR o, Z_IU0UpdateTaskPackage **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_explicit_tag (o, z_IU0OriginPartToKeep,
+			&(*p)->originPart, ODR_CONTEXT, 1, 0, "originPart") &&
+		odr_explicit_tag (o, z_IU0TargetPart,
+			&(*p)->targetPart, ODR_CONTEXT, 2, 0, "targetPart") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0Update (ODR o, Z_IU0Update **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IU0Update_esRequest,
+		(Odr_fun) z_IU0UpdateEsRequest, "esRequest"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IU0Update_taskPackage,
+		(Odr_fun) z_IU0UpdateTaskPackage, "taskPackage"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IU0OriginPartToKeep (ODR o, Z_IU0OriginPartToKeep **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->action, ODR_CONTEXT, 1, 0, "action") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->databaseName, ODR_CONTEXT, 2, 0, "databaseName") &&
+		odr_implicit_tag (o, odr_oid,
+			&(*p)->schema, ODR_CONTEXT, 3, 1, "schema") &&
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->elementSetName, ODR_CONTEXT, 4, 1, "elementSetName") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0OriginPartNotToKeep (ODR o, Z_IU0OriginPartNotToKeep **p, int opt, const char *name)
+{
+	return z_IU0SuppliedRecords (o, p, opt, name);
+}
+
+int z_IU0TargetPart (ODR o, Z_IU0TargetPart **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->updateStatus, ODR_CONTEXT, 1, 0, "updateStatus") &&
+		odr_implicit_settag (o, ODR_CONTEXT, 2) &&
+		(odr_sequence_of(o, (Odr_fun) z_DiagRec, &(*p)->globalDiagnostics,
+		  &(*p)->num_globalDiagnostics, "globalDiagnostics") || odr_ok(o)) &&
+		odr_implicit_settag (o, ODR_CONTEXT, 3) &&
+		odr_sequence_of(o, (Odr_fun) z_IU0TaskPackageRecordStructure, &(*p)->taskPackageRecords,
+		  &(*p)->num_taskPackageRecords, "taskPackageRecords") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0SuppliedRecordsId (ODR o, Z_IU0SuppliedRecordsId **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IU0SuppliedRecordsId_timeStamp,
+		(Odr_fun) odr_generalizedtime, "timeStamp"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IU0SuppliedRecordsId_versionNumber,
+		(Odr_fun) z_InternationalString, "versionNumber"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IU0SuppliedRecordsId_previousVersion,
+		(Odr_fun) z_External, "previousVersion"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_initmember(o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_choice(o, arm, &(*p)->u, &(*p)->which, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IU0SuppliedRecords_elem (ODR o, Z_IU0SuppliedRecords_elem **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IU0SuppliedRecords_elem_number,
+		(Odr_fun) odr_integer, "number"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_IU0SuppliedRecords_elem_string,
+		(Odr_fun) z_InternationalString, "string"},
+		{ODR_IMPLICIT, ODR_CONTEXT, 3, Z_IU0SuppliedRecords_elem_opaque,
+		(Odr_fun) odr_octetstring, "opaque"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "recordId") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_explicit_tag (o, z_IU0SuppliedRecordsId,
+			&(*p)->supplementalId, ODR_CONTEXT, 2, 1, "supplementalId") &&
+		odr_implicit_tag (o, z_IU0CorrelationInfo,
+			&(*p)->correlationInfo, ODR_CONTEXT, 3, 1, "correlationInfo") &&
+		odr_implicit_tag (o, z_External,
+			&(*p)->record, ODR_CONTEXT, 4, 0, "record") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0SuppliedRecords (ODR o, Z_IU0SuppliedRecords **p, int opt, const char *name)
+{
+	if (!odr_initmember (o, p, sizeof(**p)))
+		return opt && odr_ok(o);
+	if (odr_sequence_of (o, (Odr_fun) z_IU0SuppliedRecords_elem, &(*p)->elements,
+		&(*p)->num, name))
+		return 1;
+	*p = 0;
+	return opt && odr_ok(o);
+}
+
+int z_IU0CorrelationInfo (ODR o, Z_IU0CorrelationInfo **p, int opt, const char *name)
+{
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		odr_implicit_tag (o, z_InternationalString,
+			&(*p)->note, ODR_CONTEXT, 1, 1, "note") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->id, ODR_CONTEXT, 2, 1, "id") &&
+		odr_sequence_end (o);
+}
+
+int z_IU0TaskPackageRecordStructure (ODR o, Z_IU0TaskPackageRecordStructure **p, int opt, const char *name)
+{
+	static Odr_arm arm[] = {
+		{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_IU0TaskPackageRecordStructure_record,
+		(Odr_fun) z_External, "record"},
+		{ODR_EXPLICIT, ODR_CONTEXT, 2, Z_IU0TaskPackageRecordStructure_diagnostic,
+		(Odr_fun) z_DiagRec, "diagnostic"},
+		{-1, -1, -1, -1, (Odr_fun) 0, 0}
+	};
+	if (!odr_sequence_begin (o, p, sizeof(**p), name))
+		return opt && odr_ok (o);
+	return
+		((odr_constructed_begin (o, &(*p)->u, ODR_CONTEXT, 1, "recordOrSurDiag") &&
+		odr_choice (o, arm, &(*p)->u, &(*p)->which, 0) &&
+		odr_constructed_end (o)) || odr_ok(o)) &&
+		odr_implicit_tag (o, z_IU0CorrelationInfo,
+			&(*p)->correlationInfo, ODR_CONTEXT, 2, 1, "correlationInfo") &&
+		odr_implicit_tag (o, odr_integer,
+			&(*p)->recordStatus, ODR_CONTEXT, 3, 0, "recordStatus") &&
+		odr_sequence_end (o);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.am
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.am	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.am	(revision 21083)
@@ -0,0 +1,7 @@
+## $Id$
+noinst_LIBRARIES = libzutil.a
+
+INCLUDES=-I../include 
+
+libzutil_a_SOURCES = zget.c prt-ext.c yaz-ccl.c diagbib1.c logrpn.c \
+  otherinfo.c pquery.c
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/Makefile.in	(revision 21083)
@@ -0,0 +1,267 @@
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
+
+# Copyright (C) 1994, 1995-8, 1999 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 = :
+ASNMODULE = @ASNMODULE@
+CC = @CC@
+CPP = @CPP@
+ILLLIB = @ILLLIB@
+ILLMODULE = @ILLMODULE@
+MAKEINFO = @MAKEINFO@
+PACKAGE = @PACKAGE@
+RANLIB = @RANLIB@
+SUBDIRS_VAR = @SUBDIRS_VAR@
+VERSION = @VERSION@
+have_sgml2html = @have_sgml2html@
+have_sgml2latex = @have_sgml2latex@
+have_sgml2txt = @have_sgml2txt@
+
+noinst_LIBRARIES = libzutil.a
+
+INCLUDES = -I../include 
+
+libzutil_a_SOURCES = zget.c prt-ext.c yaz-ccl.c diagbib1.c logrpn.c   otherinfo.c pquery.c
+
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_CLEAN_FILES = 
+LIBRARIES =  $(noinst_LIBRARIES)
+
+
+DEFS = @DEFS@ -I. -I$(srcdir) 
+CPPFLAGS = @CPPFLAGS@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+libzutil_a_LIBADD = 
+libzutil_a_OBJECTS =  zget.o prt-ext.o yaz-ccl.o diagbib1.o logrpn.o \
+otherinfo.o pquery.o
+AR = ar
+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 = tar
+GZIP_ENV = --best
+SOURCES = $(libzutil_a_SOURCES)
+OBJECTS = $(libzutil_a_OBJECTS)
+
+all: all-redirect
+.SUFFIXES:
+.SUFFIXES: .S .c .o .s
+##$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) 
+##	cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps zutil/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 $<
+
+.s.o:
+	$(COMPILE) -c $<
+
+.S.o:
+	$(COMPILE) -c $<
+
+mostlyclean-compile:
+	-rm -f *.o core *.core
+
+clean-compile:
+
+distclean-compile:
+	-rm -f *.tab.c
+
+maintainer-clean-compile:
+
+libzutil.a: $(libzutil_a_OBJECTS) $(libzutil_a_DEPENDENCIES)
+	-rm -f libzutil.a
+	$(AR) cru libzutil.a $(libzutil_a_OBJECTS) $(libzutil_a_LIBADD)
+	$(RANLIB) libzutil.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 = zutil
+
+distdir: $(DISTFILES)
+	@for file in $(DISTFILES); do \
+	  d=$(srcdir); \
+	  if test -d $$d/$$file; then \
+	    cp -pr $$/$$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:
+
+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
+
+
+# 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:
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/diagbib1.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/diagbib1.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/diagbib1.c	(revision 21083)
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 1995-1997, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:35  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.7  1997/09/29 07:22:26  adam
+ * Added static modifier to msg_tab.
+ *
+ * Revision 1.6  1997/07/01 14:15:10  adam
+ * Added new BIB-1 diagnostic messages.
+ *
+ * Revision 1.5  1996/01/02 13:57:30  adam
+ * Added error messages.
+ *
+ * Revision 1.4  1995/09/29  17:11:52  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:39  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/05/16  08:50:21  quinn
+ * License, documentation, and memory fixes
+ *
+ * Revision 1.1  1995/03/15  13:46:09  adam
+ * New function diagbib1_str.
+ *
+ */
+
+#include <stdio.h>
+
+#include <yaz/diagbib1.h>
+
+static struct {
+    int code;
+    char *msg;
+} msg_tab[] = {
+{ 1, "Permanent system error" },
+{ 2, "Temporary system error" },
+{ 3, "Unsupported search" },
+{ 4, "Terms only exclusion (stop) words" },
+{ 5, "Too many argument words" },
+{ 6, "Too many boolean operators" },
+{ 7, "Too many truncated words" },
+{ 8, "Too many incomplete subfields" },
+{ 9, "Truncated words too short" },
+{ 10, "Invalid format for record number (search term)" },
+{ 11, "Too many characters in search statement" },
+{ 12, "Too many records retrieved" },
+{ 13, "Present request out of range" },
+{ 14, "System error in presenting records" },
+{ 15, "Record no authorized to be sent intersystem" },
+{ 16, "Record exceeds Preferred-message-size" },
+{ 17, "Record exceeds Maximum-record-size" },
+{ 18, "Result set not supported as a search term" },
+{ 19, "Only single result set as search term supported" },
+{ 20, "Only ANDing of a single result set as search term supported" },
+{ 21, "Result set exists and replace indicator off" },
+{ 22, "Result set naming not supported" },
+{ 23, "Combination of specified databases not supported" },
+{ 24, "Element set names not supported" },
+{ 25, "Specified element set name not valid for specified database" },
+{ 26, "Only a single element set name supported" },
+{ 27, "Result set no longer exists - unilaterally deleted by target" },
+{ 28, "Result set is in use" },
+{ 29, "One of the specified databases is locked" },
+{ 30, "Specified result set does not exist" },
+{ 31, "Resources exhausted - no results available" },
+{ 32, "Resources exhausted - unpredictable partial results available" },
+{ 33, "Resources exhausted - valid subset of results available" },
+{ 100, "Unspecified error" },
+{ 101, "Access-control failure" },
+{ 102, "Security challenge required but could not be issued -"
+" request terminated" },
+{ 103, "Security challenge required but could not be issued -"
+" record not included" },
+{ 104, "Security challenge failed - record not included" },
+{ 105, "Terminated by negative continue response" },
+{ 106, "No abstract syntaxes agreed to for this record" },
+{ 107, "Query type not supported" },
+{ 108, "Malformed query" },
+{ 109, "Database unavailable" },
+{ 110, "Operator unsupported" },
+{ 111, "Too many databases specified" },
+{ 112, "Too many result sets created" },
+{ 113, "Unsupported attribute type" },
+{ 114, "Unsupported Use attribute" },
+{ 115, "Unsupported value for Use attribute" },
+{ 116, "Use attribute required but not supplied" },
+{ 117, "Unsupported Relation attribute" },
+{ 118, "Unsupported Structure attribute" },
+{ 119, "Unsupported Position attribute" },
+{ 120, "Unsupported Truncation attribute" },
+{ 121, "Unsupported Attribute Set" },
+{ 122, "Unsupported Completeness attribute" },
+{ 123, "Unsupported attribute combination" },
+{ 124, "Unsupported coded value for term" },
+{ 125, "Malformed search term" },
+{ 126, "Illegal term value for attribute" },
+{ 127, "Unparsable format for un-normalized value" },
+{ 128, "Illegal result set name" },
+{ 129, "Proximity search of sets not supported" },
+{ 130, "Illegal result set in proximity search" },
+{ 131, "Unsupported proximity relation" },
+{ 132, "Unsupported proximity unit code" },
+{ 201, "Proximity not supported with this attribute combination" },
+{ 202, "Unsupported distance for proximity" },
+{ 203, "Ordered flag not supported for proximity" },
+{ 205, "Only zero step size supported for Scan" },
+{ 206, "Specified step size not supported for Scan" },
+{ 207, "Cannot sort according to sequence" },
+{ 208, "No result set name supplied on Sort" },
+{ 209, "Generic sort not supported (database-specific sort only supported)" },
+{ 210, "Database specific sort not supported" },
+{ 211, "Too many sort keys" },
+{ 212, "Duplicate sort keys" },
+{ 213, "Unsupported missing data action" },
+{ 214, "Illegal sort relation" },
+{ 215, "Illegal case value" },
+{ 216, "Illegal missing data action" },
+{ 217, "Segmentation: Cannot guarantee records will fit in specified segments"
+},
+{ 218, "ES: Package name already in use" },
+{ 219, "ES: no such package, on modify/delete" },
+{ 220, "ES: quota exceeded" },
+{ 221, "ES: extended service type not supported" },
+{ 222, "ES: permission denied on ES - id not authorized" },
+{ 223, "ES: permission denied on ES - cannot modify or delete" },
+{ 224, "ES: immediate execution failed" },
+{ 225, "ES: immediate execution not supported for this service" },
+{ 226, "ES: immediate execution not supported for these parameters" },
+{ 227, "No data available in requested record syntax" },
+{ 228, "Scan: malformed scan" },
+{ 229, "Term type not supported" },
+{ 230, "Sort: too many input results" },
+{ 231, "Sort: incompatible record formats" },
+{ 232, "Scan: term list not supported" },
+{ 233, "Scan: unsupported value of position-in-response" },
+{ 234, "Too many index terms processed" },
+{ 235, "Database does not exist" },
+{ 236, "Access to specified database denied" },
+{ 237, "Sort: illegal sort" },
+{ 238, "Record not available in requested syntax" },
+{ 239, "Record syntax not supported" },
+{ 240, "Scan: Resources exhausted looking for satisfying terms" },
+{ 241, "Scan: Beginning or end of term list" },
+{ 242, "Segmentation: max-segment-size too small to segment record" },
+{ 243, "Present:  additional-ranges parameter not supported" },
+{ 244, "Present:  comp-spec parameter not supported" },
+{ 245, "Type-1 query: restriction ('resultAttr') operand not supported" },
+{ 246, "Type-1 query: 'complex' attributeValue not supported" },
+{ 247, "Type-1 query: 'attributeSet' as part of AttributeElement not supported" },
+{ 1001, "Malformed APDU"}, 
+{ 1002, "ES: EXTERNAL form of Item Order request not supported" },
+{ 1003, "ES: Result set item form of Item Order request not supported" },
+{ 1004, "ES: Extended services not supported unless access control is in effect" },
+{ 1005, "Response records in Search response not supported" },
+{ 1006, "Response records in Search response not possible for specified database (or database combination)" },
+{ 1007, "No Explain server. Addinfo: pointers to servers that have a surrogate Explain database for this server" },
+{ 1008, "ES: missing mandatory parameter for specified function. Addinfo: parameter" },
+{ 1009, "ES: Item Order, unsupported OID in itemRequest. Addinfo: OID" },
+{ 1010, "Init/AC: Bad Userid" },
+{ 1011, "Init/AC: Bad Userid and/or Password" },
+{ 1012, "Init/AC: No searches remaining (pre-purchased searches exhausted)" },
+{ 1013, "Init/AC: Incorrect interface type (specified id valid only when used with a particular access method or client)" },
+{ 1014, "Init/AC: Authentication System error" },
+{ 1015, "Init/AC: Maximum number of simultaneous sessions for Userid" },
+{ 1016, "Init/AC: Blocked network address"},
+{ 1017, "Init/AC: No databases available for specified userId"},
+{ 1018, "Init/AC: System temporarily out of resources"},
+{ 1019, "Init/AC: System not available due to maintenance (Addinfo: when it's expected back up)" },
+{ 1020, "Init/AC: System temporarily unavailable (Addinfo: when it's expected back up)"},
+{ 1021, "Init/AC: Account has expired"},
+{ 1022, "Init/AC: Password has expired so a new one must be supplied"},
+{ 1023, "Init/AC: Password has been changed by an administrator so a new one must be supplied"},
+{ 0, NULL} 
+};
+
+const char *diagbib1_str (int code)
+{
+    int i;
+    for (i=0; msg_tab[i].msg; i++)
+        if (msg_tab[i].code == code)
+            return msg_tab[i].msg;
+    return "Unknown error";
+}
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/logrpn.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/logrpn.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/logrpn.c	(revision 21083)
@@ -0,0 +1,383 @@
+/*
+ * Copyright (C) 1995-2000, Index Data
+ * All rights reserved.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:36  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  2000/01/31 13:15:22  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.3  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1999/08/27 09:40:33  adam
+ * Renamed logf function to yaz_log. Removed VC++ project files.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.1  1998/11/16 16:02:35  adam
+ * Added loggin utilies, log_rpn_query and log_scan_term. These used
+ * to be part of Zebra.
+ *
+ *
+ *
+ * Old logs from zlogs.c:
+ *
+ * Revision 1.9  1998/10/13 20:36:02  adam
+ * Changed "indent" format string in log messages.
+ *
+ * Revision 1.8  1998/04/02 14:35:29  adam
+ * First version of Zebra that works with compiled ASN.1.
+ *
+ * Revision 1.7  1998/01/29 13:40:11  adam
+ * Better logging for scan service.
+ *
+ * Revision 1.6  1997/09/29 09:06:41  adam
+ * Removed static var to make this module thread safe.
+ *
+ * Revision 1.5  1997/04/30 08:56:07  quinn
+ * null
+ *
+ * Revision 1.4  1996/10/08  09:41:25  quinn
+ * Fixed diagnostic.
+ *
+ * Revision 1.3  1996/03/20  09:36:40  adam
+ * Function dict_lookup_grep got extra parameter, init_pos, which marks
+ * from which position in pattern approximate pattern matching should occur.
+ * Approximate pattern matching is used in relevance=re-2.
+ *
+ * Revision 1.2  1996/01/03  16:22:11  quinn
+ * operator->roperator
+ *
+ * Revision 1.1  1995/11/16  17:00:55  adam
+ * Better logging of rpn query.
+ *
+ */
+#include <stdio.h>
+
+#include <yaz/log.h>
+#include <yaz/logrpn.h>
+
+static void attrStr (int type, int value, enum oid_value ast, char *str)
+{
+    *str = '\0';
+    switch (ast)
+    {
+    case VAL_BIB1:
+    case VAL_EXP1:
+    case VAL_GILS:
+        switch (type)
+        {
+        case 1:
+            sprintf (str, "use");
+            break;
+        case 2:
+            switch (value)
+            {
+            case 1:
+                sprintf (str, "relation=Less than");
+                break;
+            case 2:
+                sprintf (str, "relation=Less than or equal");
+                break;
+            case 3:
+                sprintf (str, "relation=Equal");
+                break;
+            case 4:
+                sprintf (str, "relation=Greater or equal");
+                break;
+            case 5:
+                sprintf (str, "relation=Greater than");
+                break;
+            case 6:
+                sprintf (str, "relation=Not equal");
+                break;
+            case 100:
+                sprintf (str, "relation=Phonetic");
+                break;
+            case 101:
+                sprintf (str, "relation=Stem");
+                break;
+            case 102:
+                sprintf (str, "relation=Relevance");
+                break;
+            case 103:
+                sprintf (str, "relation=AlwaysMatches");
+                break;
+            default:
+                sprintf (str, "relation");
+            }
+            break;
+        case 3:
+            switch (value)
+            {
+            case 1:
+                sprintf (str, "position=First in field");
+                break;
+            case 2:
+                sprintf (str, "position=First in any subfield");
+                break;
+            case 3:
+                sprintf (str, "position=Any position in field");
+                break;
+            default:
+                sprintf (str, "position");
+            }
+            break;
+        case 4:
+            switch (value)
+            {
+            case 1:
+                sprintf (str, "structure=Phrase");
+                break;
+            case 2:
+                sprintf (str, "structure=Word");
+                break;
+            case 3:
+                sprintf (str, "structure=Key");
+                break;
+            case 4:
+                sprintf (str, "structure=Year");
+                break;
+            case 5:
+                sprintf (str, "structure=Date");
+                break;
+            case 6:
+                sprintf (str, "structure=Word list");
+                break;
+            case 100:
+                sprintf (str, "structure=Date (un)");
+                break;
+            case 101:
+                sprintf (str, "structure=Name (norm)");
+                break;
+            case 102:
+                sprintf (str, "structure=Name (un)");
+                break;
+            case 103:
+                sprintf (str, "structure=Structure");
+                break;
+            case 104:
+                sprintf (str, "structure=urx");
+                break;
+            case 105:
+                sprintf (str, "structure=free-form-text");
+                break;
+            case 106:
+                sprintf (str, "structure=document-text");
+                break;
+            case 107:
+                sprintf (str, "structure=local-number");
+                break;
+            case 108:
+                sprintf (str, "structure=string");
+                break;
+            case 109:
+                sprintf (str, "structure=numeric string");
+                break;
+            default:
+                sprintf (str, "structure");
+            }
+            break;
+        case 5:
+            switch (value)
+            {
+            case 1:
+                sprintf (str, "truncation=Right");
+                break;
+            case 2:
+                sprintf (str, "truncation=Left");
+                break;
+            case 3:
+                sprintf (str, "truncation=Left&right");
+                break;
+            case 100:
+                sprintf (str, "truncation=Do not truncate");
+                break;
+            case 101:
+                sprintf (str, "truncation=Process #");
+                break;
+            case 102:
+                sprintf (str, "truncation=re-1");
+                break;
+            case 103:
+                sprintf (str, "truncation=re-2");
+                break;
+            default:
+                sprintf (str, "truncation");
+            }
+            break;
+        case 6:
+            switch (value)
+            {
+            case 1:
+                sprintf (str, "completeness=Incomplete subfield");
+                break;
+            case 2:
+                sprintf (str, "completeness=Complete subfield");
+                break;
+            case 3:
+                sprintf (str, "completeness=Complete field");
+                break;
+            default:
+                sprintf (str, "completeness");
+            }
+            break;
+        }
+        break;
+    default:
+        break;
+    }
+    if (*str)
+        sprintf (str + strlen(str), " (%d=%d)", type, value);
+    else
+        sprintf (str, "%d=%d", type, value);
+}
+
+/*
+ * zlog_attributes: print attributes of term
+ */
+static void zlog_attributes (Z_AttributesPlusTerm *t, int level,
+                             enum oid_value ast)
+{
+    int of, i;
+    char str[80];
+#ifdef ASN_COMPILED
+    int num_attributes = t->attributes->num_attributes;
+#else
+    int num_attributes = t->num_attributes;
+#endif
+    
+    for (of = 0; of < num_attributes; of++)
+    {
+	const char *attset_name = "";
+        Z_AttributeElement *element;
+#ifdef ASN_COMPILED
+	element = t->attributes->attributes[of];
+#else
+        element = t->attributeList[of];
+#endif
+	if (element->attributeSet)
+	{
+	    oident *attrset;
+	    attrset = oid_getentbyoid (element->attributeSet);
+	    attset_name = attrset->desc;
+	}
+        switch (element->which) 
+        {
+        case Z_AttributeValue_numeric:
+	    attrStr (*element->attributeType,
+		     *element->value.numeric, ast, str);
+            yaz_log (LOG_LOG, "%*.0s%s %s", level, "", attset_name, str);
+            break;
+        case Z_AttributeValue_complex:
+            yaz_log (LOG_LOG, "%*.0s%s attributeType=%d complex",
+		  level, "", attset_name, *element->attributeType);
+            for (i = 0; i<element->value.complex->num_list; i++)
+            {
+                if (element->value.complex->list[i]->which ==
+                    Z_StringOrNumeric_string)
+                    yaz_log (LOG_LOG, "%*.0s  string: '%s'", level, "",
+			     element->value.complex->list[i]->u.string);
+                else if (element->value.complex->list[i]->which ==
+                         Z_StringOrNumeric_numeric)
+                    yaz_log (LOG_LOG, "%*.0s  numeric: '%d'", level, "",
+			     *element->value.complex->list[i]->u.numeric);
+            }
+            break;
+        default:
+            yaz_log (LOG_LOG, "%.*s%s attribute unknown",
+		     level, "", attset_name);
+        }
+    }
+}
+
+static void zlog_structure (Z_RPNStructure *zs, int level, enum oid_value ast)
+{
+    if (zs->which == Z_RPNStructure_complex)
+    {
+        switch (zs->u.complex->roperator->which)
+        {
+        case Z_Operator_and:
+            yaz_log (LOG_LOG, "%*.0s and", level, "");
+            break;
+        case Z_Operator_or:
+            yaz_log (LOG_LOG, "%*.0s or", level, "");
+            break;
+        case Z_Operator_and_not:
+            yaz_log (LOG_LOG, "%*.0s and-not", level, "");
+            break;
+        default:
+            yaz_log (LOG_LOG, "%*.0s unknown complex", level, "");
+            return;
+        }
+        zlog_structure (zs->u.complex->s1, level+2, ast);
+        zlog_structure (zs->u.complex->s2, level+2, ast);
+    }
+    else if (zs->which == Z_RPNStructure_simple)
+    {
+        if (zs->u.simple->which == Z_Operand_APT)
+        {
+            Z_AttributesPlusTerm *zapt = zs->u.simple->u.attributesPlusTerm;
+
+            if (zapt->term->which == Z_Term_general) 
+            {
+                yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
+			 zapt->term->u.general->len,
+			 zapt->term->u.general->buf);
+            }
+            else
+            {
+                yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
+            }
+            zlog_attributes (zapt, level+2, ast);
+        }
+        else if (zs->u.simple->which == Z_Operand_resultSetId)
+        {
+            yaz_log (LOG_LOG, "%*.0s set '%s'", level, "",
+		     zs->u.simple->u.resultSetId);
+        }
+        else
+            yaz_log (LOG_LOG, "%*.0s unknown simple structure", level, "");
+    }
+    else
+        yaz_log (LOG_LOG, "%*.0s unknown structure", level, "");
+}
+
+void log_rpn_query (Z_RPNQuery *rpn)
+{
+    oident *attrset;
+    enum oid_value ast;
+    
+    attrset = oid_getentbyoid (rpn->attributeSetId);
+    if (attrset)
+    {
+        ast = attrset->value;
+	yaz_log (LOG_LOG, "RPN query. Type: %s", attrset->desc);
+    } 
+    else
+    {
+	ast = VAL_NONE;
+	yaz_log (LOG_LOG, "RPN query. Unknown type");
+    }
+    zlog_structure (rpn->RPNStructure, 0, ast);
+}
+
+void log_scan_term (Z_AttributesPlusTerm *zapt, oid_value ast)
+{
+    int level = 0;
+    if (zapt->term->which == Z_Term_general) 
+    {
+	yaz_log (LOG_LOG, "%*.0s term '%.*s' (general)", level, "",
+		 zapt->term->u.general->len, zapt->term->u.general->buf);
+    }
+    else
+	yaz_log (LOG_LOG, "%*.0s term (not general)", level, "");
+    zlog_attributes (zapt, level+2, ast);
+}
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/otherinfo.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/otherinfo.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/otherinfo.c	(revision 21083)
@@ -0,0 +1,223 @@
+/*
+ * Copyright (c) 1999, Index Data
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:36  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.3  1999/11/10 09:06:40  adam
+ * Fixed yaz_oi_update so that it ignores NULL pointer.
+ *
+ * Revision 1.2  1999/09/13 12:51:35  adam
+ * Fixed bug in yaz_oi_update and added delete option.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.1  1999/04/26 07:25:25  adam
+ * Implemented OtherInfo utility.
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <yaz/otherinfo.h>
+
+void yaz_oi_APDU(Z_APDU *apdu, Z_OtherInformation ***oip)
+{
+    switch (apdu->which)
+    {
+    case Z_APDU_initRequest:
+	*oip = &apdu->u.initRequest->otherInfo;
+	break;
+    case Z_APDU_searchRequest:
+	*oip = &apdu->u.searchRequest->otherInfo;
+	break;
+    case Z_APDU_presentRequest:
+	*oip = &apdu->u.presentRequest->otherInfo;
+	break;
+    case Z_APDU_sortRequest:
+	*oip = &apdu->u.sortRequest->otherInfo;
+	break;
+    case Z_APDU_scanRequest:
+	*oip = &apdu->u.scanRequest->otherInfo;
+	break;
+    case Z_APDU_extendedServicesRequest:
+	*oip = &apdu->u.extendedServicesRequest->otherInfo;
+	break;
+    case Z_APDU_deleteResultSetRequest:
+	*oip = &apdu->u.deleteResultSetRequest->otherInfo;
+	break;
+    case Z_APDU_initResponse:
+	*oip = &apdu->u.initResponse->otherInfo;
+	break;
+    case Z_APDU_searchResponse:
+	*oip = &apdu->u.searchResponse->otherInfo;
+	break;
+    case Z_APDU_presentResponse:
+	*oip = &apdu->u.presentResponse->otherInfo;
+	break;
+    case Z_APDU_sortResponse:
+	*oip = &apdu->u.sortResponse->otherInfo;
+	break;
+    case Z_APDU_scanResponse:
+	*oip = &apdu->u.scanResponse->otherInfo;
+	break;
+    case Z_APDU_extendedServicesResponse:
+	*oip = &apdu->u.extendedServicesResponse->otherInfo;
+	break;
+    case Z_APDU_deleteResultSetResponse:
+	*oip = &apdu->u.deleteResultSetResponse->otherInfo;
+	break;
+    default:
+	*oip = 0;
+	break;
+    }
+}
+
+Z_OtherInformationUnit *yaz_oi_update (
+    Z_OtherInformation **otherInformationP, ODR odr,
+    int *oid, int categoryValue, int delete_flag)
+{
+    int i;
+    Z_OtherInformation *otherInformation;
+
+    if (!otherInformationP)
+        return 0;
+    otherInformation = *otherInformationP;
+    if (!otherInformation)
+    {
+	if (!odr)
+	    return 0;
+	otherInformation = *otherInformationP = (Z_OtherInformation *)
+	    odr_malloc (odr, sizeof(*otherInformation));
+	otherInformation->num_elements = 0;
+	otherInformation->list = 0;
+    }
+    for (i = 0; i<otherInformation->num_elements; i++)
+    {
+	if (!oid)
+	{
+	    if (!otherInformation->list[i]->category)
+		return otherInformation->list[i];
+	}
+	else
+	{
+	    if (otherInformation->list[i]->category &&
+		categoryValue ==
+		*otherInformation->list[i]->category->categoryValue &&
+		!oid_oidcmp (oid, otherInformation->list[i]->category->
+			     categoryTypeId))
+	    {
+		Z_OtherInformationUnit *this_list = otherInformation->list[i];
+
+		if (delete_flag)
+		{
+		    (otherInformation->num_elements)--;
+		    while (i < otherInformation->num_elements)
+		    {
+			otherInformation->list[i] =
+			    otherInformation->list[i+1];
+			i++;
+		    }
+		}
+		return this_list;
+	    }
+	}
+    }
+    if (!odr)
+	return 0;
+    else
+    {
+	Z_OtherInformationUnit **newlist = (Z_OtherInformationUnit**)
+	    odr_malloc(odr, (otherInformation->num_elements+1) *
+		       sizeof(*newlist));
+	for (i = 0; i<otherInformation->num_elements; i++)
+	    newlist[i] = otherInformation->list[i];
+	otherInformation->list = newlist;
+	
+	otherInformation->list[i] = (Z_OtherInformationUnit*)
+	    odr_malloc (odr, sizeof(Z_OtherInformationUnit));
+	if (oid)
+	{
+	    otherInformation->list[i]->category = (Z_InfoCategory*)
+		odr_malloc (odr, sizeof(Z_InfoCategory));
+	    otherInformation->list[i]->category->categoryTypeId = (int*)
+		odr_oiddup (odr, oid);
+	    otherInformation->list[i]->category->categoryValue = (int*)
+		odr_malloc (odr, sizeof(int));
+	    *otherInformation->list[i]->category->categoryValue =
+		categoryValue;
+	}
+	else
+	    otherInformation->list[i]->category = 0;
+	otherInformation->list[i]->which = Z_OtherInfo_characterInfo;
+	otherInformation->list[i]->information.characterInfo = 0;
+	
+	otherInformation->num_elements = i+1;
+	return otherInformation->list[i];
+    }
+}
+
+void yaz_oi_set_string_oid (
+    Z_OtherInformation **otherInformation, ODR odr,
+    int *oid, int categoryValue,
+    const char *str)
+{
+    Z_OtherInformationUnit *oi =
+	yaz_oi_update(otherInformation, odr, oid, categoryValue, 0);
+    if (!oi)
+	return;
+    oi->which = Z_OtherInfo_characterInfo;
+    oi->information.characterInfo = odr_strdup (odr, str);
+}
+
+void yaz_oi_set_string_oidval (
+    Z_OtherInformation **otherInformation, ODR odr,
+    int oidval, int categoryValue,
+    const char *str)
+{
+    int oid[OID_SIZE];
+    struct oident ent;
+    ent.proto = PROTO_Z3950;
+    ent.oclass = CLASS_USERINFO;
+    ent.value = (oid_value) oidval;
+    if (!oid_ent_to_oid (&ent, oid))
+	return ;
+    yaz_oi_set_string_oid(otherInformation,
+			  odr, oid, categoryValue, str);
+}
+
+char *yaz_oi_get_string_oid (
+    Z_OtherInformation **otherInformation,
+    int *oid, int categoryValue, int delete_flag)
+{
+    Z_OtherInformationUnit *oi;
+    
+    if ((oi = yaz_oi_update(otherInformation, 0, oid, 1, delete_flag)) &&
+	oi->which == Z_OtherInfo_characterInfo)
+	return oi->information.characterInfo;
+    return 0;
+}
+
+char *yaz_oi_get_string_oidval(Z_OtherInformation **otherInformation,
+			       int oidval, int categoryValue, int delete_flag)
+{
+    int oid[OID_SIZE];
+    struct oident ent;
+    ent.proto = PROTO_Z3950;
+    ent.oclass = CLASS_USERINFO;
+    ent.value = (oid_value) oidval;
+
+    if (!oid_ent_to_oid (&ent, oid))
+	return 0;
+    return yaz_oi_get_string_oid (otherInformation, oid, categoryValue,
+				  delete_flag);
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/pquery.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/pquery.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/pquery.c	(revision 21083)
@@ -0,0 +1,636 @@
+/*
+ * Copyright (c) 1995-1998, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:37  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.4  1999/12/21 16:25:20  adam
+ * Fixed handling of default/inherited attributes.
+ *
+ * Revision 1.3  1999/12/20 15:20:13  adam
+ * Implemented ccl_pquery to convert from CCL tree to prefix query.
+ *
+ * Revision 1.2  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.22  1999/04/20 09:56:49  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.21  1998/10/13 16:03:37  adam
+ * Better checking for invalid OID's in p_query_rpn.
+ *
+ * Revision 1.20  1998/03/31 15:13:20  adam
+ * Development towards compiled ASN.1.
+ *
+ * Revision 1.19  1998/03/05 08:09:03  adam
+ * Minor change to make C++ happy.
+ *
+ * Revision 1.18  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.17  1997/11/24 11:33:57  adam
+ * Using function odr_nullval() instead of global ODR_NULLVAL when
+ * appropriate.
+ *
+ * Revision 1.16  1997/09/29 13:19:00  adam
+ * Added function, oid_ent_to_oid, to replace the function
+ * oid_getoidbyent, which is not thread safe.
+ *
+ * Revision 1.15  1997/09/29 07:13:43  adam
+ * Changed type of a few variables to avoid warnings.
+ *
+ * Revision 1.14  1997/09/22 12:33:41  adam
+ * Fixed bug introduced by previous commit.
+ *
+ * Revision 1.13  1997/09/17 12:10:42  adam
+ * YAZ version 1.4.
+ *
+ * Revision 1.12  1997/09/01 08:54:13  adam
+ * New windows NT/95 port using MSV5.0. Made prefix query handling
+ * thread safe. The function options ignores empty arguments when met.
+ *
+ * Revision 1.11  1996/11/11 13:15:29  adam
+ * Added proximity operator.
+ *
+ * Revision 1.10  1996/08/12 14:10:35  adam
+ * New function p_query_attset to define default attribute set.
+ *
+ * Revision 1.9  1996/03/15  11:03:46  adam
+ * Attribute set can be set globally for a query with the @attrset
+ * operator. The @attr operator has an optional attribute-set specifier
+ * that sets the attribute set locally.
+ *
+ * Revision 1.8  1996/01/02  11:46:56  quinn
+ * Changed 'operator' to 'roperator' to avoid C++ conflict.
+ *
+ * Revision 1.7  1995/09/29  17:12:36  quinn
+ * Smallish
+ *
+ * Revision 1.6  1995/09/27  15:03:03  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.5  1995/06/15  12:31:02  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.4  1995/06/15  07:45:19  quinn
+ * Moving to v3.
+ *
+ * Revision 1.3  1995/06/14  11:06:35  adam
+ * Bug fix: Attributes wasn't interpreted correctly!
+ *
+ * Revision 1.2  1995/05/26  08:56:11  adam
+ * New function: p_query_scan.
+ *
+ * Revision 1.1  1995/05/22  15:31:49  adam
+ * New function, p_query_rpn, to convert from prefix (ascii) to rpn (asn).
+ *
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include <yaz/proto.h>
+#include <yaz/oid.h>
+#include <yaz/pquery.h>
+
+static oid_value p_query_dfset = VAL_NONE;
+
+struct lex_info {
+    const char *query_buf;
+    const char *lex_buf;
+    size_t lex_len;
+    int query_look;
+    char *left_sep;
+    char *right_sep;
+    int escape_char;
+    int term_type;
+};
+
+static Z_RPNStructure *rpn_structure (struct lex_info *li, ODR o, oid_proto, 
+                                      int num_attr, int max_attr, 
+                                      int *attr_list, oid_value *attr_set);
+
+static enum oid_value query_oid_getvalbyname (struct lex_info *li)
+{
+    enum oid_value value;
+    char buf[32];
+
+    if (li->lex_len > 31)
+        return VAL_NONE;
+    memcpy (buf, li->lex_buf, li->lex_len);
+    buf[li->lex_len] = '\0';
+    value = oid_getvalbyname (buf);
+    return value;
+}
+
+static int compare_term (struct lex_info *li, const char *src, size_t off)
+{
+    size_t len=strlen(src);
+
+    if (li->lex_len == len+off && !memcmp (li->lex_buf+off, src, len-off))
+	return 1;
+    return 0;
+}
+
+static int query_token (struct lex_info *li)
+{
+    const char *sep_match;
+    const char **qptr = &li->query_buf;
+
+    while (**qptr == ' ')
+        (*qptr)++;
+    if (**qptr == '\0')
+        return 0;
+    li->lex_len = 0;
+    if ((sep_match = strchr (li->left_sep, **qptr)))
+    {
+        int sep_index = sep_match - li->left_sep;
+        
+        ++(*qptr);
+        li->lex_buf = *qptr;
+        while (**qptr && **qptr != li->right_sep[sep_index])
+        {
+            ++(li->lex_len);
+            ++(*qptr);
+        }
+        if (**qptr)
+            ++(*qptr);
+    }
+    else
+    {
+        li->lex_buf = *qptr;
+        while (**qptr && **qptr != ' ')
+        {
+            ++(li->lex_len);
+            ++(*qptr);
+        }
+    }
+    if (li->lex_len >= 1 && li->lex_buf[0] == li->escape_char)
+    {
+	if (compare_term (li, "and", 1))
+	    return 'a';
+        if (compare_term (li, "or", 1))
+            return 'o';
+        if (compare_term (li, "not", 1))
+            return 'n';
+        if (compare_term (li, "attr", 1))
+            return 'l';
+        if (compare_term (li, "set", 1))
+            return 's';
+        if (compare_term (li, "attrset", 1))
+            return 'r';
+        if (compare_term (li, "prox", 1))
+            return 'p';
+        if (compare_term (li, "term", 1))
+            return 'y';
+    }
+    return 't';
+}
+
+static int lex (struct lex_info *li)
+{
+    return li->query_look = query_token (li);
+}
+
+static Z_AttributesPlusTerm *rpn_term (struct lex_info *li, ODR o,
+                                       oid_proto proto, 
+                                       int num_attr, int *attr_list,
+                                       oid_value *attr_set)
+{
+    Z_AttributesPlusTerm *zapt;
+    Odr_oct *term_octet;
+    Z_Term *term;
+    Z_AttributeElement **elements;
+
+    zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
+    term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
+    term = (Z_Term *)odr_malloc (o, sizeof(*term));
+
+    if (!num_attr)
+        elements = (Z_AttributeElement**)odr_nullval();
+    else
+    {
+        int i, k = 0;
+        int *attr_tmp;
+
+        elements = (Z_AttributeElement**)
+	    odr_malloc (o, num_attr * sizeof(*elements));
+
+        attr_tmp = (int *)odr_malloc (o, num_attr * 2 * sizeof(int));
+        memcpy (attr_tmp, attr_list, num_attr * 2 * sizeof(int));
+        for (i = num_attr; --i >= 0; )
+        {
+            int j;
+            for (j = i+1; j<num_attr; j++)
+                if (attr_tmp[2*j] == attr_tmp[2*i])
+                    break;
+            if (j < num_attr)
+                continue;
+            elements[k] =
+                (Z_AttributeElement*)odr_malloc (o,sizeof(**elements));
+            elements[k]->attributeType = &attr_tmp[2*i];
+            if (attr_set[i] == VAL_NONE)
+                elements[k]->attributeSet = 0;
+            else
+            {
+                oident attrid;
+                int oid[OID_SIZE];
+		
+                attrid.proto = PROTO_Z3950;
+                attrid.oclass = CLASS_ATTSET;
+                attrid.value = attr_set[i];
+                   
+                elements[k]->attributeSet =
+		    odr_oiddup (o, oid_ent_to_oid (&attrid, oid));
+            }
+	    elements[k]->which = Z_AttributeValue_numeric;
+	    elements[k]->value.numeric = &attr_tmp[2*i+1];
+            k++;
+        }
+        num_attr = k;
+    }
+#ifdef ASN_COMPILED
+    zapt->attributes = (Z_AttributeList *)
+	odr_malloc (o, sizeof(*zapt->attributes));
+    zapt->attributes->num_attributes = num_attr;
+    zapt->attributes->attributes = elements;
+#else
+    zapt->num_attributes = num_attr;
+    zapt->attributeList = elements;
+#endif    
+
+    zapt->term = term;
+    term->which = Z_Term_general;
+    term->u.general = term_octet;
+    term_octet->buf = (unsigned char *)odr_malloc (o, li->lex_len);
+    term_octet->size = term_octet->len = li->lex_len;
+    memcpy (term_octet->buf, li->lex_buf, li->lex_len);
+    return zapt;
+}
+
+static Z_Operand *rpn_simple (struct lex_info *li, ODR o, oid_proto proto,
+                              int num_attr, int *attr_list,
+                              oid_value *attr_set)
+{
+    Z_Operand *zo;
+
+    zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
+    switch (li->query_look)
+    {
+    case 't':
+        zo->which = Z_Operand_APT;
+        if (!(zo->u.attributesPlusTerm =
+              rpn_term (li, o, proto, num_attr, attr_list, attr_set)))
+            return NULL;
+        lex (li);
+        break;
+    case 's':
+        lex (li);
+        if (!li->query_look)
+            return NULL;
+        zo->which = Z_Operand_resultSetId;
+        zo->u.resultSetId = (char *)odr_malloc (o, li->lex_len+1);
+        memcpy (zo->u.resultSetId, li->lex_buf, li->lex_len);
+        zo->u.resultSetId[li->lex_len] = '\0';
+        lex (li);
+        break;
+    default:
+        return NULL;
+    }
+    return zo;
+}
+
+static Z_ProximityOperator *rpn_proximity (struct lex_info *li, ODR o)
+{
+    Z_ProximityOperator *p = (Z_ProximityOperator *)odr_malloc (o, sizeof(*p));
+
+    if (!lex (li))
+        return NULL;
+    if (*li->lex_buf == '1')
+    {
+        p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
+        *p->exclusion = 1;
+    } 
+    else if (*li->lex_buf == '0')
+    {
+        p->exclusion = (int *)odr_malloc (o, sizeof(*p->exclusion));
+        *p->exclusion = 0;
+    }
+    else
+        p->exclusion = NULL;
+
+    if (!lex (li))
+        return NULL;
+    p->distance = (int *)odr_malloc (o, sizeof(*p->distance));
+    *p->distance = atoi (li->lex_buf);
+
+    if (!lex (li))
+        return NULL;
+    p->ordered = (int *)odr_malloc (o, sizeof(*p->ordered));
+    *p->ordered = atoi (li->lex_buf);
+    
+    if (!lex (li))
+        return NULL;
+    p->relationType = (int *)odr_malloc (o, sizeof(*p->relationType));
+    *p->relationType = atoi (li->lex_buf);
+
+    if (!lex (li))
+        return NULL;
+    if (*li->lex_buf == 'k')
+        p->which = 0;
+    else if (*li->lex_buf == 'p')
+        p->which = 1;
+    else
+        p->which = atoi (li->lex_buf);
+
+    if (!lex (li))
+        return NULL;
+#ifdef ASN_COMPILED
+    p->which = Z_ProximityOperator_known;
+    p->u.known = (int *)odr_malloc (o, sizeof(*p->u.known));
+    *p->u.known = atoi (li->lex_buf);
+#else
+    p->proximityUnitCode = (int *)odr_malloc (o, sizeof(*p->proximityUnitCode));
+    *p->proximityUnitCode = atoi (li->lex_buf);
+#endif
+    return p;
+}
+
+static Z_Complex *rpn_complex (struct lex_info *li, ODR o, oid_proto proto,
+                               int num_attr, int max_attr, 
+                               int *attr_list, oid_value *attr_set)
+{
+    Z_Complex *zc;
+    Z_Operator *zo;
+
+    zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
+    zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
+    zc->roperator = zo;
+    switch (li->query_look)
+    {
+    case 'a':
+        zo->which = Z_Operator_and;
+        zo->u.and = odr_nullval();
+        break;
+    case 'o':
+        zo->which = Z_Operator_or;
+        zo->u.and = odr_nullval();
+        break;
+    case 'n':
+        zo->which = Z_Operator_and_not;
+        zo->u.and = odr_nullval();
+        break;
+    case 'p':
+        zo->which = Z_Operator_prox;
+        zo->u.prox = rpn_proximity (li, o);
+        if (!zo->u.prox)
+            return NULL;
+        break;
+    default:
+        return NULL;
+    }
+    lex (li);
+    if (!(zc->s1 =
+          rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+                         attr_set)))
+        return NULL;
+    if (!(zc->s2 =
+          rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+                         attr_set)))
+        return NULL;
+    return zc;
+}
+
+static Z_RPNStructure *rpn_structure (struct lex_info *li, ODR o,
+                                      oid_proto proto, 
+                                      int num_attr, int max_attr, 
+                                      int *attr_list, oid_value *attr_set)
+{
+    Z_RPNStructure *sz;
+    const char *cp;
+
+    sz = (Z_RPNStructure *)odr_malloc (o, sizeof(*sz));
+    switch (li->query_look)
+    {
+    case 'a':
+    case 'o':
+    case 'n':
+    case 'p':
+        sz->which = Z_RPNStructure_complex;
+        if (!(sz->u.complex =
+              rpn_complex (li, o, proto, num_attr, max_attr, attr_list,
+                           attr_set)))
+            return NULL;
+        break;
+    case 't':
+    case 's':
+        sz->which = Z_RPNStructure_simple;
+        if (!(sz->u.simple =
+              rpn_simple (li, o, proto, num_attr, attr_list,
+                          attr_set)))
+            return NULL;
+        break;
+    case 'l':
+        lex (li);
+        if (!li->query_look)
+            return NULL;
+        if (num_attr >= max_attr)
+            return NULL;
+        if (!(cp = strchr (li->lex_buf, '=')) ||
+            (size_t) (cp-li->lex_buf) > li->lex_len)
+        {
+            attr_set[num_attr] = query_oid_getvalbyname (li);
+	    if (attr_set[num_attr] == VAL_NONE)
+		return NULL;
+            lex (li);
+
+            if (!(cp = strchr (li->lex_buf, '=')))
+                return NULL;
+        }
+        else 
+        {
+            if (num_attr > 0)
+                attr_set[num_attr] = attr_set[num_attr-1];
+            else
+                attr_set[num_attr] = VAL_NONE;
+        }
+	attr_list[2*num_attr] = atoi(li->lex_buf); 
+	attr_list[2*num_attr+1] = atoi (cp+1);
+	num_attr++;
+        lex (li);
+        return
+            rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+                           attr_set);
+    case 'y':
+	lex (li);
+	if (!li->query_look)
+	    return NULL;
+	if (compare_term (li, "general", 0))
+	    li->term_type = Z_Term_general;
+	else if (compare_term (li, "numeric", 0))
+	    li->term_type = Z_Term_numeric;
+	else if (compare_term (li, "string", 0))
+	    li->term_type = Z_Term_characterString;
+	else if (compare_term (li, "oid", 0))
+	    li->term_type = Z_Term_oid;
+	else if (compare_term (li, "datetime", 0))
+	    li->term_type = Z_Term_dateTime;
+	else if (compare_term (li, "null", 0))
+	    li->term_type = Z_Term_null;
+	lex (li);
+        return
+            rpn_structure (li, o, proto, num_attr, max_attr, attr_list,
+                           attr_set);
+    case 0:                /* operator/operand expected! */
+        return NULL;
+    }
+    return sz;
+}
+
+Z_RPNQuery *p_query_rpn_mk (ODR o, struct lex_info *li, oid_proto proto,
+                            const char *qbuf)
+{
+    Z_RPNQuery *zq;
+    int attr_array[1024];
+    oid_value attr_set[512];
+    oid_value topSet = VAL_NONE;
+    oident oset;
+    int oid[OID_SIZE];
+
+    zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
+    lex (li);
+    if (li->query_look == 'r')
+    {
+        lex (li);
+        topSet = query_oid_getvalbyname (li);
+        if (topSet == VAL_NONE)
+            return NULL;
+
+        lex (li);
+    }
+    if (topSet == VAL_NONE)
+        topSet = p_query_dfset;
+    if (topSet == VAL_NONE)
+        topSet = VAL_BIB1;
+    oset.proto = proto;
+    oset.oclass = CLASS_ATTSET;
+    oset.value = topSet;
+
+    if (!oid_ent_to_oid (&oset, oid))
+	return NULL;
+    zq->attributeSetId = odr_oiddup (o, oid);
+
+    if (!(zq->RPNStructure = rpn_structure (li, o, proto, 0, 512,
+                                            attr_array, attr_set)))
+        return NULL;
+    return zq;
+}
+
+Z_RPNQuery *p_query_rpn (ODR o, oid_proto proto,
+                         const char *qbuf)
+{
+    struct lex_info li;
+    
+    li.left_sep = "{\"";
+    li.right_sep = "}\"";
+    li.escape_char = '@';
+    li.term_type = Z_Term_general;
+    li.query_buf = qbuf;
+    return p_query_rpn_mk (o, &li, proto, qbuf);
+}
+
+Z_AttributesPlusTerm *p_query_scan_mk (struct lex_info *li,
+                                       ODR o, oid_proto proto,
+                                       Odr_oid **attributeSetP,
+                                       const char *qbuf)
+{
+    int attr_list[1024];
+    oid_value attr_set[512];
+    int num_attr = 0;
+    int max_attr = 512;
+    const char *cp;
+    oid_value topSet = VAL_NONE;
+    oident oset;
+    int oid[OID_SIZE];
+
+    lex (li);
+    if (li->query_look == 'r')
+    {
+        lex (li);
+        topSet = query_oid_getvalbyname (li);
+
+        lex (li);
+    }
+    if (topSet == VAL_NONE)
+        topSet = p_query_dfset;
+    if (topSet == VAL_NONE)
+        topSet = VAL_BIB1;
+    oset.proto = proto;
+    oset.oclass = CLASS_ATTSET;
+    oset.value = topSet;
+
+    *attributeSetP = odr_oiddup (o, oid_ent_to_oid (&oset, oid));
+
+    while (li->query_look == 'l')
+    {
+        lex (li);
+        if (!li->query_look)
+            return NULL;
+        if (num_attr >= max_attr)
+            return NULL;
+
+        if (!(cp = strchr (li->lex_buf, '=')) ||
+            (size_t) (cp-li->lex_buf) > li->lex_len)
+        {
+            attr_set[num_attr] = query_oid_getvalbyname (li);
+            lex (li);
+
+            if (!(cp = strchr (li->lex_buf, '=')))
+                return NULL;
+        }
+        else
+        {
+            if (num_attr > 0)
+                attr_set[num_attr] = attr_set[num_attr-1];
+            else
+                attr_set[num_attr] = VAL_NONE;
+        }
+        attr_list[2*num_attr] = atoi (li->lex_buf);
+        attr_list[2*num_attr+1] = atoi (cp+1);
+        num_attr++;
+        lex (li);
+    }
+    if (!li->query_look)
+        return NULL;
+    return rpn_term (li, o, proto, num_attr, attr_list, attr_set);
+}
+
+Z_AttributesPlusTerm *p_query_scan (ODR o, oid_proto proto,
+                                    Odr_oid **attributeSetP,
+                                    const char *qbuf)
+{
+    struct lex_info li;
+
+    li.left_sep = "{\"";
+    li.right_sep = "}\"";
+    li.escape_char = '@';
+    li.term_type = Z_Term_general;
+    li.query_buf = qbuf;
+
+    return p_query_scan_mk (&li, o, proto, attributeSetP, qbuf);
+}
+
+int p_query_attset (const char *arg)
+{
+    p_query_dfset = oid_getvalbyname (arg);
+    return (p_query_dfset == VAL_NONE) ? -1 : 0;
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/prt-ext.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/prt-ext.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/prt-ext.c	(revision 21083)
@@ -0,0 +1,284 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:38  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.22  1999/05/26 15:24:26  adam
+ * Fixed minor bugs regarding DB Update (introduced by previous commit).
+ *
+ * Revision 1.21  1999/05/26 14:47:12  adam
+ * Implemented z_ext_record.
+ *
+ * Revision 1.20  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.19  1998/03/31 15:13:19  adam
+ * Development towards compiled ASN.1.
+ *
+ * Revision 1.18  1998/03/31 11:07:44  adam
+ * Furhter work on UNIverse resource report.
+ * Added Extended Services handling in frontend server.
+ *
+ * Revision 1.17  1998/03/20 14:46:06  adam
+ * Added UNIverse Resource Reports.
+ *
+ * Revision 1.16  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.15  1998/02/10 15:31:46  adam
+ * Implemented date and time structure. Changed the Update Extended
+ * Service.
+ *
+ * Revision 1.14  1998/01/05 09:04:57  adam
+ * Fixed bugs in encoders/decoders - Not operator (!) missing.
+ *
+ * Revision 1.13  1997/05/14 06:53:22  adam
+ * C++ support.
+ *
+ * Revision 1.12  1997/04/30 08:52:02  quinn
+ * Null
+ *
+ * Revision 1.11  1996/10/10  12:35:13  quinn
+ * Added Update extended service.
+ *
+ * Revision 1.10  1996/10/09  15:54:55  quinn
+ * Added SearchInfoReport
+ *
+ * Revision 1.9  1996/06/10  08:53:36  quinn
+ * Added Summary,OPAC,ResourceReport
+ *
+ * Revision 1.8  1996/02/20  12:51:44  quinn
+ * Completed SCAN. Fixed problems with EXTERNAL.
+ *
+ * Revision 1.7  1995/10/12  10:34:38  quinn
+ * Added Espec-1.
+ *
+ * Revision 1.6  1995/09/29  17:11:55  quinn
+ * Smallish
+ *
+ * Revision 1.5  1995/09/27  15:02:42  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.4  1995/08/29  11:17:16  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.3  1995/08/21  09:10:18  quinn
+ * Smallish fixes to suppport new formats.
+ *
+ * Revision 1.2  1995/08/17  12:45:00  quinn
+ * Fixed minor problems with GRS-1. Added support in c&s.
+ *
+ * Revision 1.1  1995/08/15  13:37:41  quinn
+ * Improved EXTERNAL
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+/*
+ * The table below should be moved to the ODR structure itself and
+ * be an image of the association context: To help
+ * map indirect references when they show up. 
+ */
+static Z_ext_typeent type_table[] =
+{
+    {VAL_SUTRS, Z_External_sutrs, (Odr_fun) z_SUTRS},
+    {VAL_EXPLAIN, Z_External_explainRecord, (Odr_fun)z_ExplainRecord},
+    {VAL_RESOURCE1, Z_External_resourceReport1, (Odr_fun)z_ResourceReport1},
+    {VAL_RESOURCE2, Z_External_resourceReport2, (Odr_fun)z_ResourceReport2},
+    {VAL_PROMPT1, Z_External_promptObject1, (Odr_fun)z_PromptObject1 },
+    {VAL_GRS1, Z_External_grs1, (Odr_fun)z_GenericRecord},
+    {VAL_EXTENDED, Z_External_extendedService, (Odr_fun)z_TaskPackage},
+#ifdef ASN_COMPILED
+    {VAL_ITEMORDER, Z_External_itemOrder, (Odr_fun)z_IOItemOrder},
+#else
+    {VAL_ITEMORDER, Z_External_itemOrder, (Odr_fun)z_ItemOrder},
+#endif
+    {VAL_DIAG1, Z_External_diag1, (Odr_fun)z_DiagnosticFormat},
+    {VAL_ESPEC1, Z_External_espec1, (Odr_fun)z_Espec1},
+    {VAL_SUMMARY, Z_External_summary, (Odr_fun)z_BriefBib},
+    {VAL_OPAC, Z_External_OPAC, (Odr_fun)z_OPACRecord},
+    {VAL_SEARCHRES1, Z_External_searchResult1, (Odr_fun)z_SearchInfoReport},
+    {VAL_DBUPDATE, Z_External_update, (Odr_fun)z_IUUpdate},
+    {VAL_DATETIME, Z_External_dateTime, (Odr_fun)z_DateTime},
+    {VAL_UNIVERSE_REPORT, Z_External_universeReport, (Odr_fun)z_UniverseReport},
+    {VAL_NONE, 0, 0}
+};
+
+Z_ext_typeent *z_ext_getentbyref(oid_value val)
+{
+    Z_ext_typeent *i;
+
+    for (i = type_table; i->dref != VAL_NONE; i++)
+	if (i->dref == val)
+	    return i;
+    return 0;
+}
+
+int z_External(ODR o, Z_External **p, int opt, const char *name)
+{
+    oident *oid;
+    Z_ext_typeent *type;
+
+    static Odr_arm arm[] =
+    {
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_single,
+	 (Odr_fun)odr_any, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 1, Z_External_octet,
+	 (Odr_fun)odr_octetstring, 0},
+	{ODR_IMPLICIT, ODR_CONTEXT, 2, Z_External_arbitrary,
+	 (Odr_fun)odr_bitstring, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_sutrs,
+	 (Odr_fun)z_SUTRS, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_explainRecord,
+	 (Odr_fun)z_ExplainRecord, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport1,
+	 (Odr_fun)z_ResourceReport1, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_resourceReport2,
+	 (Odr_fun)z_ResourceReport2, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_promptObject1,
+	 (Odr_fun)z_PromptObject1, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_grs1,
+	 (Odr_fun)z_GenericRecord, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_extendedService,
+	 (Odr_fun)z_TaskPackage, 0},
+#ifdef ASN_COMPILED
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_itemOrder,
+	 (Odr_fun)z_IOItemOrder, 0},
+#else
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_itemOrder,
+	 (Odr_fun)z_ItemOrder, 0},
+#endif
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_diag1,
+	 (Odr_fun)z_DiagnosticFormat, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_espec1,
+	 (Odr_fun)z_Espec1, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_summary,
+	 (Odr_fun)z_BriefBib, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_OPAC,
+	 (Odr_fun)z_OPACRecord, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_searchResult1,
+	 (Odr_fun)z_SearchInfoReport, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_update,
+	 (Odr_fun)z_IUUpdate, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_dateTime,
+	 (Odr_fun)z_DateTime, 0},
+	{ODR_EXPLICIT, ODR_CONTEXT, 0, Z_External_universeReport,
+	 (Odr_fun)z_UniverseReport, 0},
+	{-1, -1, -1, -1, 0, 0}
+    };
+    
+    odr_implicit_settag(o, ODR_UNIVERSAL, ODR_EXTERNAL);
+    if (!odr_sequence_begin(o, p, sizeof(**p), name))
+	return opt && odr_ok(o);
+    if (!(odr_oid(o, &(*p)->direct_reference, 1, 0) &&
+	  odr_integer(o, &(*p)->indirect_reference, 1, 0) &&
+	  odr_graphicstring(o, &(*p)->descriptor, 1, 0)))
+	return 0;
+    /*
+     * Do we know this beast?
+     */
+    if (o->direction == ODR_DECODE && (*p)->direct_reference &&
+	(oid = oid_getentbyoid((*p)->direct_reference)) &&
+	(type = z_ext_getentbyref(oid->value)))
+    {
+	int zclass, tag, cons;
+	
+	/*
+	 * We know it. If it's represented as an ASN.1 type, bias the CHOICE.
+	 */
+	if (!odr_peektag(o, &zclass, &tag, &cons))
+	    return opt && odr_ok(o);
+	if (zclass == ODR_CONTEXT && tag == 0 && cons == 1)
+	    odr_choice_bias(o, type->what);
+    }
+    return
+	odr_choice(o, arm, &(*p)->u, &(*p)->which, name) &&
+	odr_sequence_end(o);
+}
+
+Z_External *z_ext_record(ODR o, int format, const char *buf, int len)
+{
+    Z_External *thisext;
+    oident recform;
+    int oid[OID_SIZE];
+
+    thisext = (Z_External *) odr_malloc(o, sizeof(*thisext));
+    thisext->descriptor = 0;
+    thisext->indirect_reference = 0;
+
+    recform.proto = PROTO_Z3950;
+    recform.oclass = CLASS_RECSYN;
+    recform.value = (enum oid_value) format;
+    if (!oid_ent_to_oid(&recform, oid))
+	return 0;
+    thisext->direct_reference = odr_oiddup(o, oid);
+    
+    if (len < 0) /* Structured data */
+    {
+	switch (format)
+	{
+	case VAL_SUTRS:
+	    thisext->which = Z_External_sutrs;
+	    break;
+	case VAL_GRS1:
+	    thisext->which = Z_External_grs1;
+	    break;
+	case VAL_EXPLAIN:
+	    thisext->which = Z_External_explainRecord;
+	    break;
+	case VAL_SUMMARY:
+	    thisext->which = Z_External_summary;
+	    break;
+	case VAL_OPAC:
+	    thisext->which = Z_External_OPAC;
+	    break;
+	default:
+	    return 0;
+	}
+	
+	/*
+	 * We cheat on the pointers here. Obviously, the record field
+	 * of the backend-fetch structure should have been a union for
+	 * correctness, but we're stuck with this for backwards
+	 * compatibility.
+	 */
+	thisext->u.grs1 = (Z_GenericRecord*) buf;
+    }
+    else if (format == VAL_SUTRS) /* SUTRS is a single-ASN.1-type */
+    {
+	Odr_oct *sutrs = (Odr_oct *)odr_malloc(o, sizeof(*sutrs));
+	
+	thisext->which = Z_External_sutrs;
+	thisext->u.sutrs = sutrs;
+	sutrs->buf = (unsigned char *)odr_malloc(o, len);
+	sutrs->len = sutrs->size = len;
+	memcpy(sutrs->buf, buf, len);
+    }
+    else
+    {
+	thisext->which = Z_External_octet;
+	if (!(thisext->u.octet_aligned = (Odr_oct *)
+	      odr_malloc(o, sizeof(Odr_oct))))
+	    return 0;
+	if (!(thisext->u.octet_aligned->buf = (unsigned char *)
+	      odr_malloc(o, len)))
+	    return 0;
+	memcpy(thisext->u.octet_aligned->buf, buf, len);
+	thisext->u.octet_aligned->len = thisext->u.octet_aligned->size = len;
+    }
+    return thisext;
+}
+
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/yaz-ccl.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/yaz-ccl.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/yaz-ccl.c	(revision 21083)
@@ -0,0 +1,292 @@
+/*
+ * Copyright (c) 1996-2000, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:39  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.6  2000/02/02 15:13:23  adam
+ * Minor change.
+ *
+ * Revision 1.5  2000/01/31 13:15:22  adam
+ * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
+ * that some characters are not surrounded by spaces in resulting term.
+ * ILL-code updates.
+ *
+ * Revision 1.4  1999/12/20 15:20:13  adam
+ * Implemented ccl_pquery to convert from CCL tree to prefix query.
+ *
+ * Revision 1.3  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.2  1999/06/16 12:00:08  adam
+ * Added proximity.
+ *
+ * Revision 1.1  1999/06/08 10:12:43  adam
+ * Moved file to be part of zutil (instead of util).
+ *
+ * Revision 1.13  1998/03/31 15:13:20  adam
+ * Development towards compiled ASN.1.
+ *
+ * Revision 1.12  1998/02/11 11:53:36  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.11  1997/11/24 11:33:57  adam
+ * Using function odr_nullval() instead of global ODR_NULLVAL when
+ * appropriate.
+ *
+ * Revision 1.10  1997/09/29 08:58:25  adam
+ * Fixed conversion of trees so that true copy is made.
+ *
+ * Revision 1.9  1997/06/23 10:31:25  adam
+ * Added ODR argument to ccl_rpn_query and ccl_scan_query.
+ *
+ * Revision 1.8  1996/10/29 13:36:27  adam
+ * Added header.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <yaz/yaz-ccl.h>
+
+static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p);
+
+static Z_AttributesPlusTerm *ccl_rpn_term (ODR o, struct ccl_rpn_node *p)
+{
+    struct ccl_rpn_attr *attr;
+    int num = 0;
+    Z_AttributesPlusTerm *zapt;
+    Odr_oct *term_octet;
+    Z_Term *term;
+    Z_AttributeElement **elements;
+
+    zapt = (Z_AttributesPlusTerm *)odr_malloc (o, sizeof(*zapt));
+
+    term_octet = (Odr_oct *)odr_malloc (o, sizeof(*term_octet));
+
+    term = (Z_Term *)odr_malloc (o, sizeof(*term));
+
+    for (attr = p->u.t.attr_list; attr; attr = attr->next)
+        num++;
+    if (!num)
+        elements = (Z_AttributeElement**)odr_nullval();
+    else
+    {
+        int i = 0;
+	elements = (Z_AttributeElement **)
+	    odr_malloc (o, num*sizeof(*elements));
+        for (attr = p->u.t.attr_list; attr; attr = attr->next, i++)
+        {
+            elements[i] = (Z_AttributeElement *)
+		odr_malloc (o, sizeof(**elements));
+            elements[i]->attributeType =
+		(int *)odr_malloc(o, sizeof(int));
+            *elements[i]->attributeType = attr->type;
+	    elements[i]->attributeSet = 0;
+	    elements[i]->which = Z_AttributeValue_numeric;
+	    elements[i]->value.numeric =
+		(int *)odr_malloc (o, sizeof(int));
+	    *elements[i]->value.numeric = attr->value;
+        }
+    }
+#ifdef ASN_COMPILED
+    zapt->attributes = (Z_AttributeList *)
+	odr_malloc (o, sizeof(*zapt->attributes));
+    zapt->attributes->num_attributes = num;
+    zapt->attributes->attributes = elements;
+#else
+    zapt->num_attributes = num;
+    zapt->attributeList = elements;
+#endif    
+    zapt->term = term;
+    term->which = Z_Term_general;
+    term->u.general = term_octet;
+    term_octet->len = term_octet->size = strlen (p->u.t.term);
+    term_octet->buf = (unsigned char *)odr_malloc (o, term_octet->len+1);
+    strcpy ((char*) term_octet->buf, p->u.t.term);
+    return zapt;
+}
+
+static Z_Operand *ccl_rpn_simple (ODR o, struct ccl_rpn_node *p)
+{
+    Z_Operand *zo;
+
+    zo = (Z_Operand *)odr_malloc (o, sizeof(*zo));
+
+    switch (p->kind)
+    {
+    case CCL_RPN_TERM:
+        zo->which = Z_Operand_APT;
+        zo->u.attributesPlusTerm = ccl_rpn_term (o, p);
+        break;
+    case CCL_RPN_SET:
+        zo->which = Z_Operand_resultSetId;
+        zo->u.resultSetId = p->u.setname;
+        break;
+    default:
+	return 0;
+    }
+    return zo;
+}
+
+static Z_Complex *ccl_rpn_complex (ODR o, struct ccl_rpn_node *p)
+{
+    Z_Complex *zc;
+    Z_Operator *zo;
+
+    zc = (Z_Complex *)odr_malloc (o, sizeof(*zc));
+    zo = (Z_Operator *)odr_malloc (o, sizeof(*zo));
+
+    zc->roperator = zo;
+    switch (p->kind)
+    {
+    case CCL_RPN_AND:
+        zo->which = Z_Operator_and;
+        zo->u.and = odr_nullval();
+        break;
+    case CCL_RPN_OR:
+        zo->which = Z_Operator_or;
+        zo->u.and = odr_nullval();
+        break;
+    case CCL_RPN_NOT:
+        zo->which = Z_Operator_and_not;
+        zo->u.and = odr_nullval();
+        break;
+    case CCL_RPN_PROX:
+	zo->which = Z_Operator_prox;
+	zo->u.prox = (Z_ProximityOperator *)
+	    odr_malloc (o, sizeof(*zo->u.prox));
+	zo->u.prox->exclusion = 0;
+
+	zo->u.prox->distance = (int *)
+	    odr_malloc (o, sizeof(*zo->u.prox->distance));
+	*zo->u.prox->distance = 2;
+
+	zo->u.prox->ordered = (bool_t *)
+	    odr_malloc (o, sizeof(*zo->u.prox->ordered));
+	*zo->u.prox->ordered = 0;
+
+	zo->u.prox->relationType = (int *)
+	    odr_malloc (o, sizeof(*zo->u.prox->relationType));
+#ifdef ASN_COMPILED
+	*zo->u.prox->relationType = Z_ProximityOperator_Prox_lessThan;
+	zo->u.prox->which = Z_ProximityOperator_known;
+	zo->u.prox->u.known = 
+	    odr_malloc (o, sizeof(*zo->u.prox->u.known));
+	*zo->u.prox->u.known = Z_ProxUnit_word;
+#else
+	*zo->u.prox->relationType = Z_Prox_lessThan;
+	zo->u.prox->which = Z_ProxCode_known;
+	zo->u.prox->proximityUnitCode = (int*)
+	    odr_malloc (o, sizeof(*zo->u.prox->proximityUnitCode));
+	*zo->u.prox->proximityUnitCode = Z_ProxUnit_word;
+#endif
+	break;
+    default:
+	return 0;
+    }
+    zc->s1 = ccl_rpn_structure (o, p->u.p[0]);
+    zc->s2 = ccl_rpn_structure (o, p->u.p[1]);
+    return zc;
+}
+
+static Z_RPNStructure *ccl_rpn_structure (ODR o, struct ccl_rpn_node *p)
+{
+    Z_RPNStructure *zs;
+
+    zs = (Z_RPNStructure *)odr_malloc (o, sizeof(*zs));
+    switch (p->kind)
+    {
+    case CCL_RPN_AND:
+    case CCL_RPN_OR:
+    case CCL_RPN_NOT:
+    case CCL_RPN_PROX:
+        zs->which = Z_RPNStructure_complex;
+        zs->u.complex = ccl_rpn_complex (o, p);
+        break;
+    case CCL_RPN_TERM:
+    case CCL_RPN_SET:
+        zs->which = Z_RPNStructure_simple;
+        zs->u.simple = ccl_rpn_simple (o, p);
+        break;
+    default:
+	return 0;
+    }
+    return zs;
+}
+
+Z_RPNQuery *ccl_rpn_query (ODR o, struct ccl_rpn_node *p)
+{
+    Z_RPNQuery *zq;
+
+    zq = (Z_RPNQuery *)odr_malloc (o, sizeof(*zq));
+    zq->attributeSetId = NULL;
+    zq->RPNStructure = ccl_rpn_structure (o, p);
+    return zq;
+}
+
+Z_AttributesPlusTerm *ccl_scan_query (ODR o, struct ccl_rpn_node *p)
+{
+    if (p->kind != CCL_RPN_TERM)
+        return NULL;
+    return ccl_rpn_term (o, p);
+}
+
+static void ccl_pquery_complex (WRBUF w, struct ccl_rpn_node *p)
+{
+    switch (p->kind)
+    {
+    case CCL_RPN_AND:
+    	wrbuf_puts (w, "@and ");
+	break;
+    case CCL_RPN_OR:
+    	wrbuf_puts(w, "@or ");
+	break;
+    case CCL_RPN_NOT:
+    	wrbuf_puts(w, "@not ");
+	break;
+    case CCL_RPN_PROX:
+    	wrbuf_puts(w, "@prox 0 2 0 1 known 2 ");
+	break;
+    default:
+	wrbuf_puts(w, "@ bad op (unknown) ");
+    };
+    ccl_pquery(w, p->u.p[0]);
+    ccl_pquery(w, p->u.p[1]);
+}
+    	
+void ccl_pquery (WRBUF w, struct ccl_rpn_node *p)
+{
+    struct ccl_rpn_attr *att;
+
+    switch (p->kind)
+    {
+    case CCL_RPN_AND:
+    case CCL_RPN_OR:
+    case CCL_RPN_NOT:
+    case CCL_RPN_PROX:
+    	ccl_pquery_complex (w, p);
+	break;
+    case CCL_RPN_SET:
+	wrbuf_puts (w, "@set ");
+	wrbuf_puts (w, p->u.setname);
+	wrbuf_puts (w, " ");
+	break;
+    case CCL_RPN_TERM:
+    	for (att = p->u.t.attr_list; att; att = att->next)
+	{
+	    char tmpattr[128];
+	    sprintf(tmpattr, "@attr %d=%d ", att->type, att->value);
+	    wrbuf_puts (w, tmpattr);
+	}
+	wrbuf_puts (w, "{");
+	wrbuf_puts (w, p->u.t.term);
+	wrbuf_puts (w, "} ");
+	break;
+    }
+}
Index: /main/tags/2.38/gsdl/packages/yaz/zutil/zget.c
===================================================================
--- /main/tags/2.38/gsdl/packages/yaz/zutil/zget.c	(revision 21083)
+++ /main/tags/2.38/gsdl/packages/yaz/zutil/zget.c	(revision 21083)
@@ -0,0 +1,531 @@
+/*
+ * Copyright (c) 1995-1999, Index Data.
+ * See the file LICENSE for details.
+ * Sebastian Hammer, Adam Dickmeiss
+ *
+ * $Log$
+ * Revision 1.1  2000/08/03 03:12:39  johnmcp
+ * Added the YAZ toolkit source to the packages directory (for z39.50 stuff)
+ *
+ * Revision 1.2  1999/11/30 13:47:12  adam
+ * Improved installation. Moved header files to include/yaz.
+ *
+ * Revision 1.1  1999/06/08 10:10:16  adam
+ * New sub directory zutil. Moved YAZ Compiler to be part of YAZ tree.
+ *
+ * Revision 1.17  1999/04/20 09:56:48  adam
+ * Added 'name' paramter to encoder/decoder routines (typedef Odr_fun).
+ * Modified all encoders/decoders to reflect this change.
+ *
+ * Revision 1.16  1998/08/19 16:10:05  adam
+ * Changed som member names of DeleteResultSetRequest/Response.
+ *
+ * Revision 1.15  1998/03/31 15:13:19  adam
+ * Development towards compiled ASN.1.
+ *
+ * Revision 1.14  1998/02/11 11:53:32  adam
+ * Changed code so that it compiles as C++.
+ *
+ * Revision 1.13  1998/01/29 13:13:39  adam
+ * Function zget_presentRequest fills resultSetId with "default" instead
+ * of "Default".
+ *
+ * Revision 1.12  1997/10/29 12:00:37  adam
+ * Routine zget_SearchRequest fills resultSetName member with "default"
+ * instead of "Default".
+ *
+ * Revision 1.11  1997/05/02 08:39:10  quinn
+ * New PDUs added, thanks to Ronald van der Meer
+ *
+ * Revision 1.10  1996/01/02 08:57:23  quinn
+ * Changed enums in the ASN.1 .h files to #defines. Changed oident.class to oclass
+ *
+ * Revision 1.9  1995/09/29  17:11:55  quinn
+ * Smallish
+ *
+ * Revision 1.8  1995/09/27  15:02:43  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.7  1995/06/15  07:44:52  quinn
+ * Moving to v3.
+ *
+ * Revision 1.6  1995/06/14  15:26:37  quinn
+ * *** empty log message ***
+ *
+ * Revision 1.5  1995/06/07  14:42:30  quinn
+ * Fixed CLOSE
+ *
+ * Revision 1.4  1995/06/07  14:36:25  quinn
+ * Added CLOSE
+ *
+ * Revision 1.3  1995/06/05  10:52:06  quinn
+ * Fixed some negligences.
+ *
+ * Revision 1.2  1995/05/30  10:15:49  quinn
+ * Added our implementor's ID
+ *
+ * Revision 1.1  1995/05/22  11:30:20  quinn
+ * Adding Z39.50-1992 stuff to proto.c. Adding zget.c
+ *
+ *
+ */
+
+#include <yaz/proto.h>
+
+Z_InitRequest *zget_InitRequest(ODR o)
+{
+    Z_InitRequest *r = (Z_InitRequest *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
+    ODR_MASK_ZERO(r->options);
+    r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
+    ODR_MASK_ZERO(r->protocolVersion);
+    r->preferredMessageSize = (int *)odr_malloc(o, sizeof(int));
+    *r->preferredMessageSize = 30*1024;
+    r->maximumRecordSize = (int *)odr_malloc(o, sizeof(int));
+    *r->maximumRecordSize = 30*1024;
+    r->idAuthentication = 0;
+    r->implementationId = "YAZ (id=81)";
+    r->implementationName = "Index Data/YAZ";
+    r->implementationVersion = YAZ_VERSION;
+    r->userInformationField = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_InitResponse *zget_InitResponse(ODR o)
+{
+    Z_InitResponse *r = (Z_InitResponse *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->options = (Odr_bitmask *)odr_malloc(o, sizeof(*r->options));
+    ODR_MASK_ZERO(r->options);
+    r->protocolVersion = (Odr_bitmask *)odr_malloc(o, sizeof(*r->protocolVersion));
+    ODR_MASK_ZERO(r->protocolVersion);
+    r->preferredMessageSize = (int *)odr_malloc(o, sizeof(int));
+    *r->preferredMessageSize = 30*1024;
+    r->maximumRecordSize = (int *)odr_malloc(o, sizeof(int));
+    *r->maximumRecordSize = 30*1024;
+    r->result = (int *)odr_malloc(o, sizeof(bool_t));
+    *r->result = 1;
+    r->implementationId = "YAZ (id=81)";
+    r->implementationName = "Index Data/YAZ";
+    r->implementationVersion = YAZ_VERSION;
+    r->userInformationField = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_SearchRequest *zget_SearchRequest(ODR o)
+{
+    Z_SearchRequest *r = (Z_SearchRequest *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->smallSetUpperBound = (int *)odr_malloc(o, sizeof(int));
+    *r->smallSetUpperBound = 0;
+    r->largeSetLowerBound = (int *)odr_malloc(o, sizeof(int));
+    *r->largeSetLowerBound = 1;
+    r->mediumSetPresentNumber = (int *)odr_malloc(o, sizeof(int));
+    *r->mediumSetPresentNumber = 0;
+    r->replaceIndicator = (int *)odr_malloc(o, sizeof(bool_t));
+    *r->replaceIndicator = 1;
+    r->resultSetName = "default";
+    r->num_databaseNames = 0;
+    r->databaseNames = 0;
+    r->smallSetElementSetNames = 0;
+    r->mediumSetElementSetNames = 0;
+    r->preferredRecordSyntax = 0;
+    r->query = 0;
+    r->additionalSearchInfo = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_SearchResponse *zget_SearchResponse(ODR o)
+{
+    Z_SearchResponse *r = (Z_SearchResponse *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->resultCount = (int *)odr_malloc(o, sizeof(int));
+    *r->resultCount = 0;
+    r->numberOfRecordsReturned = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfRecordsReturned = 0;
+    r->nextResultSetPosition = (int *)odr_malloc(o, sizeof(int));
+    *r->nextResultSetPosition = 0;
+    r->searchStatus = (int *)odr_malloc(o, sizeof(bool_t));
+    *r->searchStatus = 1;
+    r->resultSetStatus = 0;
+    r->presentStatus = 0;
+    r->records = 0;
+    r->additionalSearchInfo = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_PresentRequest *zget_PresentRequest(ODR o)
+{
+    Z_PresentRequest *r = (Z_PresentRequest *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->resultSetId = "default";
+    r->resultSetStartPoint = (int *)odr_malloc(o, sizeof(int));
+    *r->resultSetStartPoint = 1;
+    r->numberOfRecordsRequested = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfRecordsRequested = 10;
+    r->num_ranges = 0;
+    r->additionalRanges = 0;
+    r->recordComposition = 0;
+    r->preferredRecordSyntax = 0;
+    r->maxSegmentCount = 0;
+    r->maxRecordSize = 0;
+    r->maxSegmentSize = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_PresentResponse *zget_PresentResponse(ODR o)
+{
+    Z_PresentResponse *r = (Z_PresentResponse *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->numberOfRecordsReturned = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfRecordsReturned = 0;
+    r->nextResultSetPosition = (int *)odr_malloc(o, sizeof(int));
+    *r->nextResultSetPosition = 0;
+    r->presentStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->presentStatus = Z_PRES_SUCCESS;
+    r->records = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_DeleteResultSetRequest *zget_DeleteResultSetRequest(ODR o)
+{
+    Z_DeleteResultSetRequest *r = (Z_DeleteResultSetRequest *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->deleteFunction = (int *)odr_malloc(o, sizeof(int));
+    *r->deleteFunction = Z_DeleteRequest_list;
+    r->num_resultSetList = 0;
+    r->resultSetList = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_DeleteResultSetResponse *zget_DeleteResultSetResponse(ODR o)
+{
+    Z_DeleteResultSetResponse *r = (Z_DeleteResultSetResponse *)
+	odr_malloc(o, sizeof(*r));
+    
+    r->referenceId = 0;
+    r->deleteOperationStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->deleteOperationStatus = Z_DeleteStatus_success;
+    r->deleteListStatuses = 0;
+    r->numberNotDeleted = 0;
+    r->bulkStatuses = 0;
+    r->deleteMessage = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ScanRequest *zget_ScanRequest(ODR o)
+{
+    Z_ScanRequest *r = (Z_ScanRequest *)odr_malloc(o, sizeof(*r));
+    
+    r->referenceId = 0;
+    r->num_databaseNames = 0;
+    r->databaseNames = 0;
+    r->attributeSet = 0;
+    r->termListAndStartPoint = 0;
+    r->stepSize = 0;
+    r->numberOfTermsRequested = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfTermsRequested = 20;
+    r->preferredPositionInResponse = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ScanResponse *zget_ScanResponse(ODR o)
+{
+    Z_ScanResponse *r = (Z_ScanResponse *)odr_malloc(o, sizeof(*r));
+    
+    r->referenceId = 0;
+    r->stepSize = 0;
+    r->scanStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->scanStatus = Z_Scan_success;
+    r->numberOfEntriesReturned = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfEntriesReturned = 0;
+    r->positionOfTerm =0;
+    r->entries = 0;
+    r->attributeSet = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_TriggerResourceControlRequest *zget_TriggerResourceControlRequest(ODR o)
+{
+    Z_TriggerResourceControlRequest *r = (Z_TriggerResourceControlRequest *)
+	odr_malloc(o, sizeof(*r));
+    
+    r->referenceId = 0;
+    r->requestedAction = (int *)odr_malloc(o, sizeof(int));
+    *r->requestedAction = Z_TriggerResourceCtrl_resourceReport;
+    r->prefResourceReportFormat = 0;
+    r->resultSetWanted = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ResourceControlRequest *zget_ResourceControlRequest(ODR o)
+{
+    Z_ResourceControlRequest *r = (Z_ResourceControlRequest *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->suspendedFlag = 0;
+    r->resourceReport = 0;
+    r->partialResultsAvailable = 0;
+    r->responseRequired = (int *)odr_malloc(o, sizeof(bool_t));
+    *r->responseRequired = 0;
+    r->triggeredRequestFlag = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ResourceControlResponse *zget_ResourceControlResponse(ODR o)
+{
+    Z_ResourceControlResponse *r = (Z_ResourceControlResponse *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->continueFlag = (int *)odr_malloc(o, sizeof(bool_t));
+    *r->continueFlag = 1;
+    r->resultSetWanted = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_AccessControlRequest *zget_AccessControlRequest(ODR o)
+{
+    Z_AccessControlRequest *r = (Z_AccessControlRequest *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->which = Z_AccessRequest_simpleForm;
+    r->u.simpleForm = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_AccessControlResponse *zget_AccessControlResponse(ODR o)
+{
+    Z_AccessControlResponse *r = (Z_AccessControlResponse *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->which = Z_AccessResponse_simpleForm;
+    r->u.simpleForm = 0;
+    r->diagnostic = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_Segment *zget_Segment(ODR o)
+{
+    Z_Segment *r = (Z_Segment *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->numberOfRecordsReturned = (int *)odr_malloc(o, sizeof(int));
+    *r->numberOfRecordsReturned = 0;
+    r->num_segmentRecords = 0;
+    r->segmentRecords = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_Close *zget_Close(ODR o)
+{
+    Z_Close *r = (Z_Close *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->closeReason = (int *)odr_malloc(o, sizeof(int));
+    *r->closeReason = Z_Close_finished;
+    r->diagnosticInformation = 0;
+    r->resourceReportFormat = 0;
+    r->resourceReport = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ResourceReportRequest *zget_ResourceReportRequest(ODR o)
+{
+    Z_ResourceReportRequest *r = (Z_ResourceReportRequest *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->opId = 0;
+    r->prefResourceReportFormat = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ResourceReportResponse *zget_ResourceReportResponse(ODR o)
+{
+    Z_ResourceReportResponse *r = (Z_ResourceReportResponse *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->resourceReportStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->resourceReportStatus = Z_ResourceReportStatus_success;
+    r->resourceReport = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_SortRequest *zget_SortRequest(ODR o)
+{
+    Z_SortRequest *r = (Z_SortRequest *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->inputResultSetNames = 0;
+    r->sortedResultSetName = 0;
+    r->sortSequence = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_SortResponse *zget_SortResponse(ODR o)
+{
+    Z_SortResponse *r = (Z_SortResponse *)odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->sortStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->sortStatus = Z_SortStatus_success;
+    r->resultSetStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->resultSetStatus = Z_SortResultSetStatus_empty;
+    r->diagnostics = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ExtendedServicesRequest *zget_ExtendedServicesRequest(ODR o)
+{
+    Z_ExtendedServicesRequest *r = (Z_ExtendedServicesRequest *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->function = (int *)odr_malloc(o, sizeof(int));
+    *r->function = Z_ExtendedServicesRequest_create;
+    r->packageType = 0;
+    r->packageName = 0;
+    r->userId = 0;
+    r->retentionTime = 0;
+    r->permissions = 0;
+    r->description = 0;
+    r->taskSpecificParameters = 0;
+    r->waitAction = (int *)odr_malloc(o, sizeof(int));
+    *r->waitAction = Z_ExtendedServicesRequest_wait;
+    r->elements = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_ExtendedServicesResponse *zget_ExtendedServicesResponse(ODR o)
+{
+    Z_ExtendedServicesResponse *r = (Z_ExtendedServicesResponse *)
+	odr_malloc(o, sizeof(*r));
+
+    r->referenceId = 0;
+    r->operationStatus = (int *)odr_malloc(o, sizeof(int));
+    *r->operationStatus = Z_ExtendedServicesResponse_done;
+    r->num_diagnostics = 0;
+    r->diagnostics = 0;
+    r->taskPackage = 0;
+    r->otherInfo = 0;
+    return r;
+}
+
+Z_APDU *zget_APDU(ODR o, int which)
+{
+    Z_APDU *r = (Z_APDU *)odr_malloc(o, sizeof(*r));
+
+    switch (r->which = which)
+    {
+    	case Z_APDU_initRequest:
+	    r->u.initRequest = zget_InitRequest(o);
+            break;
+	case Z_APDU_initResponse:
+	    r->u.initResponse = zget_InitResponse(o);
+            break;
+	case Z_APDU_searchRequest:
+	    r->u.searchRequest = zget_SearchRequest(o);
+            break;
+	case Z_APDU_searchResponse:
+	    r->u.searchResponse = zget_SearchResponse(o);
+            break;
+	case Z_APDU_presentRequest:
+	    r->u.presentRequest = zget_PresentRequest(o);
+            break;
+	case Z_APDU_presentResponse:
+	    r->u.presentResponse = zget_PresentResponse(o);
+            break;
+	case Z_APDU_deleteResultSetRequest:
+	    r->u.deleteResultSetRequest = zget_DeleteResultSetRequest(o);
+            break;
+	case Z_APDU_deleteResultSetResponse:
+	    r->u.deleteResultSetResponse = zget_DeleteResultSetResponse(o);
+	    break;
+	case Z_APDU_scanRequest:
+	    r->u.scanRequest = zget_ScanRequest(o);
+            break;
+	case Z_APDU_scanResponse:
+	    r->u.scanResponse = zget_ScanResponse(o);
+            break;
+	case Z_APDU_triggerResourceControlRequest:
+	    r->u.triggerResourceControlRequest =
+                zget_TriggerResourceControlRequest(o);
+            break;
+	case Z_APDU_resourceControlRequest:
+	    r->u.resourceControlRequest = zget_ResourceControlRequest(o);
+	    break;
+	case Z_APDU_resourceControlResponse:
+	    r->u.resourceControlResponse = zget_ResourceControlResponse(o);
+	    break;
+	case Z_APDU_segmentRequest:
+	    r->u.segmentRequest = zget_Segment(o);
+	    break;
+	case Z_APDU_close:
+	    r->u.close = zget_Close(o);
+	    break;
+	case Z_APDU_accessControlRequest:
+	    r->u.accessControlRequest = zget_AccessControlRequest(o);
+	    break;
+	case Z_APDU_accessControlResponse:
+	    r->u.accessControlResponse = zget_AccessControlResponse(o);
+	    break;
+	case Z_APDU_resourceReportRequest:
+	    r->u.resourceReportRequest = zget_ResourceReportRequest(o);
+	    break;
+	case Z_APDU_resourceReportResponse:
+	    r->u.resourceReportResponse = zget_ResourceReportResponse(o);
+	    break;
+	case Z_APDU_sortRequest:
+	    r->u.sortRequest = zget_SortRequest(o);
+	    break;
+	case Z_APDU_sortResponse:
+	    r->u.sortResponse = zget_SortResponse(o);
+	    break;
+	case Z_APDU_extendedServicesRequest:
+	    r->u.extendedServicesRequest = zget_ExtendedServicesRequest(o);
+	    break;
+	case Z_APDU_extendedServicesResponse:
+	    r->u.extendedServicesResponse = zget_ExtendedServicesResponse(o);
+	    break;
+	default:
+	    fprintf(stderr, "Bad APDU-type to zget_APDU");
+	    exit(1);
+    }
+    return r;
+}
Index: /main/tags/2.38/gsdl/perllib/DateExtract.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/DateExtract.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/DateExtract.pm	(revision 21083)
@@ -0,0 +1,275 @@
+package DateExtract;
+
+##use BasPlug; ## no, DON'T use BasPlug, BasPlug uses us....
+use sorttools;
+use util;
+
+#75% of the instances of the word century use full name ordinals
+my %ordinals = ("first" => 1, "second" => 2, "third" => 3, "fourth" => 4,
+             "fifth" => 5, "sixth" => 6, "seventh" => 7, "eighth" => 8,
+             "ninth" => 9, "tenth" => 10, "eleventh" => 11, "twelfth" => 12,
+             "thirteenth" => 13, "fourteenth" => 14, "fifteenth" => 15,
+             "sixteenth" => 16, "seventeenth" => 17, "eighteenth" => 18,
+             "nineteenth" => 19, "twentieth" => 20);
+
+
+             
+
+#definitions for a date grammar.
+my $fulOrd = join('|',(keys %ordinals));
+
+my @months = ("january","february","march","april","may","june","july",
+              "august","september","october","november","december");
+
+my $shortmth = "";
+foreach $m (@months) { $shortmth .= (substr($m,0,3)."\\.?|"); }
+chop($shortmth);
+
+my $longmth = join('|',@months);
+
+
+my $Qualifier = "(B(\\.)?C(\\.)?(E(\\.)?)?)|(A(\\.)?D(\\.)?)|(C(\\.)E(\\.)?)";
+my $Century = "Cent(\\.|ur(y|ies))";
+my $Ord = "st|nd|rd|th";
+my $seasonref = "(spring|fall|autumn|winter|summer)";
+my $sep = " ?- ?";
+my $tri_digit = "(in|since|(the year)|($seasonref of)) \\d{3}\\D( ($Qualifier))?";
+my $centurydate = "(((\\d{1,2})($Ord))|($fulOrd)) ($Century)( ($Qualifier))?";
+my $qualified = "(($Qualifier) ?(\\d{1,4}))|((\\d{1,4}) ?($Qualifier))";
+my $millenium = "[1-9]\\d{3}";
+my $range = "(($millenium)($sep)($millenium))|(($millenium)($sep)(\\d{1,2}))|(($qualified)($sep)($qualified))|(($Qualifier) ?(\\d{1,3})($sep)(\\d{1,3}))|((\\d{1,3})($sep)(\\d{1,3}) ?($Qualifier))";
+
+my $pgnum = "(p(p|g)?\\.? ?\\d+((-|,)(\\d+))?)|(page \\d+)|(pages \\d+((-|,)(\\d+))?)";
+my $lgnum = "\\d{1,3},(\\d{3})+";
+my $colon = ":\\d+";
+my $money = "\$(\\d{1,3}(((,\\d{3})+)|\\d+))";  $money = "\\" . $money; 
+my $microfilm = " reel([^\\.\\)])*(\\.|\\))";
+my $lastaltered = "last (edited|updated)";
+my $references = "reference(s?)(:?)\\n";
+my $cited = "work(s?) cited";
+my $biblio = "bibliography(:?)( ?)\\n";
+
+my $direction = "(N(\\.|o\\.|th\\.|orth))|(S(\\.|th\\.|outh))|(E(\\.|ast))|(W(\\.|est))";
+my $street_id = "(st\\.)|(street[^A-Za-z])|(ave\\.)|(avenue[^A-Za-z])|(boulevard[^A-Za-z])|(blvd\\.)|(rd\\.)|(road[^A-Za-z])";
+my $streetname = "(\\d{1,2}(<SUP>)?($Ord)(</SUP>)?)|([A-Za-z]+( [A-Za-z]+)?)|([A-Za-z]+-[A-Za-z]+($Ord))";
+my $address = "\\d{1,4} (($direction) )?($streetname) ($street_id)";
+
+my $bracket = "\\($millenium\\)";
+my $ref_end = ", ?$millenium\\)";
+my $colonsp = ": $millenium";
+my $reprint = "[Rr]eprint of \\d{4} edition";
+my $comma = ", $millenium\\.";
+my $fullstop = "\\. $millenium\\.";
+my $semi = "; $millenium\\.";
+
+my $lookalikes = "($pgnum)|($lgnum)|($colon)|($money)|($microfilm)|($address)";
+my $spurious = "($lastaltered)";
+my $bibheader = "($references)|($cited)|($biblio)";
+
+
+sub get_date_metadata {
+    #get the text of the document, the "document object" concerned,
+    #and the current section within the document
+    local ($text, $doc, $cursection, $keep_bib, $max_year, $max_century) = @_;
+    
+    #format a prechristian maximum century value to be negative so that it can
+    #be used in numeric comparison
+    if($max_century =~ /B/)
+    {
+        $max_century = $`;
+        $max_century =~ /\d+/;
+        $max_century = $&;
+        $max_century *=-1
+    }
+   
+    local $extr = &remove_excess($text);    
+    #print "EXTRACTION TEXT:\n $extr";
+    $extr = &remove_tags($extr);
+    if(!$keep_bib){
+        $extr = &remove_biblio($extr);
+    }
+  
+
+    local @datelist = ();
+    while($extr =~ m!($range)|($millenium)|($qualified)|($centurydate)|($tri_digit)!i)
+    { 
+        $extr = $';
+        my $fulldate = $&;
+        if ($fulldate =~ /$centurydate/i)
+        {
+            if($max_century!=-1)
+            {
+
+                local $date = $fulldate; if($date =~ /\d+/) {$date = $&;} 
+                else 
+                {
+                    $date=$fulldate; $date =~ m! ($Century)!i; $date = $`;
+                    $date =~ tr/A-Z/a-z/;
+                    $date = $ordinals{$date};
+                }
+                if($max_century >= $date){
+                    $date = ($date-1)*100 +1;
+                    #if it BC, make it negative
+                    $date = &convert_bc($fulldate,$date);
+                    $end = $date + 99; 
+                    @century = ($date..$end);
+                    @datelist = (@datelist,@century);
+                }
+            }
+        }
+        
+        elsif($fulldate =~ /$range/)
+        {
+            $fulldate =~ /$sep/;
+            my @addlist = ();
+            #print "Range: $fulldate\n";
+            $fullfirst = $`; 
+            $fullsecond = $'; 
+            $fullfirst =~ /\d+/; $first = $&; 
+            $fullsecond =~ /\d+/; $second = $&;
+            $len1 = length($first);
+            $len2 = length($second);
+            $second = (substr($first,0,($len1-$len2))).$second;
+            $first = &convert_bc($fullfirst,$first);
+            $second = &convert_bc($fullsecond,$second);
+            @addlist = ($first..$second);
+            @datelist = (@datelist,@addlist);
+            
+        }
+        else {
+            
+            my $date = $fulldate; $date =~ /\d+/; $date = $&;  
+            $date = &convert_bc($fulldate,$date);
+            #add the date metadata
+            push(@datelist,$date);
+            #print "datelist @datelist\n"
+        }
+        
+    }
+    
+    if(@datelist){
+        @datelist = sort { $a <=> $b } @datelist;
+        @datelist = &post_process($max_year, @datelist);
+        foreach $date (@datelist)
+        {
+            if($date>0){
+                $doc->add_metadata($cursection,"Coverage",$date);}
+            else{
+                $doc->add_metadata($cursection,"Coverage","bc".(-1*$date));}
+                
+        }
+    }
+}
+sub convert_bc {
+    local ($full,$num) = @_;
+    if ($full =~ /B/) { $num *= -1; }
+    $num;
+}
+
+sub post_process {
+    local ($max_year, @list) = @_;
+    @cleanlist = ();
+    $prev = 0;
+    foreach $e (@list) {
+        if ($e!=$prev && $e <= $max_year) {
+            push(@cleanlist, $e);
+        }
+        $prev = $e;
+    }
+    @cleanlist;
+}
+
+
+#removes all html tags from that data, as they will not contain dates which
+#are part of the content of the document, and therefore interesting, but do
+#contain date lookalikes
+sub remove_tags {
+    local ($tmp) = @_;
+   
+    local $parsed = "";
+    #while there is still text to be parsed and tags are still found
+    while($tmp=~ m!<([^>])*(>|$)! && $tmp ne "")
+    {
+        $parsed .= $`;#keep all that is not in a tag
+        $tmp = $';    #restart the search after then end of the tag
+    }
+    $parsed .= $tmp; #add anything after the last match
+    $parsed;
+}
+
+
+sub remove_excess {
+    local ($tmp) = @_;
+    local $parsed = "";
+   
+
+    if(($tmp =~ m!($spurious)|($lookalikes)!i) == 0 )
+    { 
+        $parsed = $tmp;
+    }
+    else { 
+        while ($tmp =~ m!($spurious)|($lookalikes)!i 
+               && $tmp ne "")
+        {
+            $parsed .= $`;
+            $storage = $&;
+            $tmp = $';
+            #match the pattern which indicates most recent alteration 
+            if ($storage =~ m!$lastaltered!i)
+            {
+                #match a four digit year or up until the first / 
+                #(as in last edited 3/97). 
+                $tmp =~ m!($millenium)|(\/)!;
+                $tmp = $';
+            }
+                
+        }
+        
+        $parsed .= $tmp;
+           
+    }
+    #print "Parsed:\n $parsed\n\n";
+    $parsed;
+    
+}
+
+sub remove_biblio{
+    local ($tmp) = @_;
+    local $parsed = "";
+    
+    if($tmp =~ m!$bibheader!i)
+    {
+        $tmp=$`;
+    }
+    
+    $tmp =~ s/( |\t)+/ /g;
+    if(($tmp =~ m!($ref_end)|($bracket)|($colonsp)|($reprint)|($comma)|($fullstop)|($semi)|($seasonref) ($millenium)!i) == 0)
+    {
+        $parsed = $tmp;
+    }
+    else{
+
+        #print "removing bib\n";
+        while ($tmp =~ m!($ref_end)|($bracket)|($colonsp)|($reprint)|($comma)|($fullstop)|($semi)|(($seasonref) ($millenium))|($bibheader)!i && $tmp ne "")
+        {
+            
+            $parsed .= $`;
+            $tmp = $';
+            if($&=~m!($comma)|($fullstop)!)
+            {
+                
+                local  $date = $&;
+                if($parsed =~ m!((\d)($Ord)$)|(($shortmth)$)|(($longmth)$)!i)
+                {
+                    $parsed .= $date;
+                }
+            }  
+            
+        }
+                   $parsed .= $tmp;
+    }
+    $parsed;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/COPYING
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/COPYING	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/COPYING	(revision 21083)
@@ -0,0 +1,345 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 		59 Temple Place, Suite 330, Boston, MA 02111-1307, 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.
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/Makefile
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/Makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/Makefile	(revision 21083)
@@ -0,0 +1,8 @@
+all:
+	gcc -o stemmer stem-Lovins-iterated.c stem.c
+
+install:
+	mv stemmer ../
+
+clean:
+	rm ../stemmer
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/README
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/README	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/README	(revision 21083)
@@ -0,0 +1,27 @@
+Lovins stemmer
+
+This directory contains code for a Lovins stemmer.
+All code is distributed under the GNU Pulic License.
+
+To create the iterated Lovins stemmer, use a command like
+gcc -o stemmer stem-Lovins-iterated.c stem.c
+
+(Looking at it now, I see, the code contains C++ comments, 
+rather than C comments, but it compiles, so I can't be bothered 
+fixing it.)
+
+The files are:
+    README      This file
+    sysfuncs.h  System dependent definitions for GNU tar.
+                Copyright (C) 1994 Free Software Foundation, Inc.
+    stem.c      Stemming code
+                Copyright (C) 1994  Linh Huynh (linh@kbs.citri.edu.au)
+    stem.h      Lovins' stemmer header
+                Copyright (C) 1994  Linh Huynh (linh@kbs.citri.edu.au)
+    stem-Lovins.c
+    stem-Lovins-iterated.c
+                Programs for stemming text read from STDIN, either
+                with the standard ovins stemmer, or with Iterated Lovins.
+                Copyright 1997 by Gordon Paynter.
+
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins-iterated.c
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins-iterated.c	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins-iterated.c	(revision 21083)
@@ -0,0 +1,90 @@
+/**************************************************************************
+ *
+ * stem-Lovins-iterated.c 
+ * Stem STDIN text with the iterated Lovins stemmer.
+ * Copyright 1997 by Gordon Paynter (gwp@cs.waikato.ac.nz)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include "stem.h"
+
+void iterated_stem( char *lword ) {
+  char length = lword[0];
+  char last = lword[length];
+  stem(lword);
+  while ((length > lword[0]) || (last != lword[length])) {
+    length = lword[0];
+    last = lword[length];
+    stem(lword);
+  }
+}
+
+void main() 
+{
+  /* the stem algorithm takes a string with 
+     the length in the first byte as input.
+     this is the lword variable.  word is a 
+     pointer to the start of the string in that 
+     variable--the second character--for use in 
+     satring operations. */
+
+  char lword[1000];
+  char *word = &lword[1];
+
+  int length = 0;
+  int c;
+  int going = 1;
+  int case_offset = (int) 'A' - 'a';
+
+  while (going) {
+
+    c = getchar();
+    if (((char) c >= 'A') && ((char) c <= 'Z'))
+      c -= case_offset;
+
+    if (c == EOF) {
+      // we've finished
+      going = 0;
+
+    } else if (((char) c >= 'a') && ((char) c <= 'z')) {
+      // add the new character to the word
+      word[length++] = (char) c;
+      assert(length < 1000);
+
+    } else if (length > 255) {
+      // the word is too long for the stemmer to handle, output it
+      word[length] = (char) 0;
+      printf("%s%c", word, c);
+      length = 0;
+
+    } else if (length > 0) {
+      // the word is the correct length to be stemmed
+      lword[0] = (char) length;
+      iterated_stem( lword );
+      word[lword[0]] = (char) 0;
+      printf("%s%c", word, c);
+      length = 0;
+
+    } else {
+      // there is no word to be stemmed
+      printf("%c", c);
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins.c
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins.c	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins.c	(revision 21083)
@@ -0,0 +1,91 @@
+/**************************************************************************
+ *
+ * stem-Lovins.c
+ * Stem STDIN text with the Lovins stemmer.
+ * Copyright 1997 by Gordon Paynter (gwp@cs.waikato.ac.nz)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include "stem.h"
+
+/* not used in this version, only in Lovins-iterated
+void iterated_stem( char *lword ) {
+  char length = lword[0];
+  char last = lword[length];
+  stem(lword);
+  while ((length > lword[0]) || (last != lword[length])) {
+    length = lword[0];
+    last = lword[length];
+    stem(lword);
+  }
+} */
+
+void main() 
+{
+  /* the stem algorithm takes a string with 
+     the length in the first byte as input.
+     this is the lword variable.  word is a 
+     pointer to the start of the string in that 
+     variable--the second character--for use in 
+     satring operations. */
+
+  char lword[1000];
+  char *word = &lword[1];
+
+  int length = 0;
+  int c;
+  int going = 1;
+  int case_offset = (int) 'A' - 'a';
+
+  while (going) {
+
+    c = getchar();
+    if (((char) c >= 'A') && ((char) c <= 'Z'))
+      c -= case_offset;
+
+    if (c == EOF) {
+      // we've finished
+      going = 0;
+
+    } else if (((char) c >= 'a') && ((char) c <= 'z')) {
+      // add the new character to the word
+      word[length++] = (char) c;
+      assert(length < 1000);
+
+    } else if (length > 255) {
+      // the word is too long for the stemmer to handle, output it
+      word[length] = (char) 0;
+      printf("%s%c", word, c);
+      length = 0;
+
+    } else if (length > 0) {
+      // the word is the correct length to be stemmed
+      lword[0] = (char) length;
+      stem( lword );
+      word[lword[0]] = (char) 0;
+      printf("%s%c", word, c);
+      length = 0;
+
+    } else {
+      // there is no word to be stemmed
+      printf("%c", c);
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.c
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.c	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.c	(revision 21083)
@@ -0,0 +1,1187 @@
+/**************************************************************************
+ *
+ * stem.c -- Stemming code
+ * Copyright (C) 1994  Linh Huynh (linh@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+static char *RCSID = "$Id$";
+
+#include "sysfuncs.h"
+
+
+/*****************************************************************************
+ *
+ *   Transformational Rules used in Recoding Stem Terminations
+ *
+ *   Parameter in functions:
+ *       ch : the second last character of the old ending
+ *            (after removing one of double consonants) 
+ *
+ ****************************************************************************/
+
+
+/************ Conditional rules associated with transformations **************/
+
+static int aio ();
+static int s ();
+static int pt ();
+static int m ();
+static int n ();
+
+static int 
+aio (ch)			/* Rule number 9     */
+     char ch;
+{
+  return ((ch != 'a') && (ch != 'i') && (ch != 'o'));
+}
+
+static int 
+s (ch)				/* Rule Number 24    */
+     char ch;
+{
+  return (ch != 's');
+}
+
+static int 
+pt (ch)				/* Rule number 28    */
+     char ch;
+{
+  return ((ch != 'p') && (ch != 't'));
+}
+
+static int 
+m (ch)				/* Rule number 30    */
+     char ch;
+{
+  return (ch != 'm');
+}
+
+static int 
+n (ch)				/* Rule number 32    */
+     char ch;
+{
+  return (ch != 'n');
+}
+
+
+/**************************************************************************
+ *
+ *  Context-sensitive rules associated with certain endings.
+ *
+ *  The notations of the rules are the same as in Lovins' paper
+ *  except that rule A is replaced by a NULL in the data structure.
+ *
+ *  Function parameters:
+ *      - stem_length: possible stem length
+ *      - end        : pointer points to the end of the possible stem.
+ *
+ *************************************************************************/
+
+
+/********* Context-sensitive rule function declarations ******************/
+
+static int B ();
+static int C ();
+static int D ();
+static int E ();
+static int F ();
+static int G ();
+static int H ();
+static int I ();
+static int J ();
+static int K ();
+static int L ();
+static int M ();
+static int N ();
+static int O ();
+static int P ();
+static int Q ();
+static int R ();
+static int S ();
+static int T ();
+static int U ();
+static int V ();
+static int W ();
+static int X ();
+static int Y ();
+static int Z ();
+static int AA ();
+static int BB ();
+static int CC ();
+
+static int 
+B (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 3);
+}
+
+static int 
+C (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 4);
+}
+
+static int 
+D (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (stem_length >= 5);
+}
+
+static int 
+E (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'e');
+}
+
+static int 
+F (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((stem_length >= 3) && (*end != 'e'));
+}
+
+static int 
+G (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((stem_length >= 3) && (*end == 'f'));
+}
+
+static int 
+H (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  return ((p1 == 't') || ((p1 == 'l') && (p2 == 'l')));
+}
+
+static int 
+I (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'o') && (p1 != 'e'));
+}
+
+static int 
+J (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'e'));
+}
+
+static int 
+K (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((stem_length >= 3) &&
+	  ((p1 == 'l') || (p1 == 'i') ||
+	   ((p1 == 'e') && (*(end - 2) == 'u'))));
+}
+
+static int 
+L (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  if (p1 == 's')
+    return (p2 == 'o');
+  else
+    return ((p1 != 'u') && (p1 != 'x'));
+}
+
+static int 
+M (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'c') &&
+	  (p1 != 'e') && (p1 != 'm'));
+}
+
+static int 
+N (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  if (stem_length >= 3)
+    {
+      if (*(end - 2) == 's')
+	return (stem_length >= 4);
+      else
+	return 1;
+    }
+  else
+    return 0;
+}
+
+static int 
+O (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+P (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'c');
+}
+
+static int 
+Q (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((stem_length >= 3) && (p1 != 'l') && (p1 != 'n'));
+}
+
+static int 
+R (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+S (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 't');
+  else
+    return ((p1 == 'r') && (p2 == 'd'));
+}
+
+static int 
+T (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 'o');
+  else
+    return (p1 == 's');
+}
+
+static int 
+U (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 == 'l') || (p1 == 'm') ||
+	  (p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+V (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end == 'c');
+}
+
+static int 
+W (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 != 's') && (p1 != 'u'));
+}
+
+static int 
+X (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1;
+  p1 = *end;
+
+  if (p1 == 'e')
+    return ((stem_length >= 3) && (*(end - 2) == 'u'));
+  else
+    return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+Y (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return ((*end == 'n') && (*(end - 1) == 'i'));
+}
+
+static int 
+Z (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end != 'f');
+}
+
+static int 
+AA (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 'h')
+    return ((p2 == 'p') || (p2 == 't'));
+  else if (p1 == 'r')
+    return ((p2 == 'e') || (p2 == 'o'));
+  else if (p1 == 's')
+    return (p2 == 'e');
+  else
+    return ((p1 == 'd') || (p1 == 'f') ||
+	    (p1 == 'l') || (p1 == 't'));
+}
+
+static int 
+BB (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  if (stem_length >= 3)
+    {
+      if (stem_length >= 4)
+	return (strncmp (end - 3, "ryst", 4) != 0);
+      else
+	return (strncmp (end - 2, "met", 3) != 0);
+    }
+  else
+    return 0;
+}
+
+static int 
+CC (stem_length, end)
+     int stem_length;
+     char *end;
+{
+  return (*end == 'l');
+}
+
+/**************************************************************************/
+
+#define MIN_STEM_LENGTH 2
+#define MAX_ENDING_SIZE 11
+#define PREDEFINED_SIZE (MAX_ENDING_SIZE + MIN_STEM_LENGTH)
+#define EOS     '\0'
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAX_STEM_LENGTH 255
+
+static char *remove_ending (char *word, int w_len);
+static void recode_stem (char *stem_end);
+
+/* =========================================================================
+ * Function: stem
+ * Description: 
+ *      Implemetation of the Lovins' stemming algorithm described in
+ *      J.B. Lovins, "Development of a Stemming Algorithm",
+ *      Mechanical Translation and Computational Linguistics, Vol 11,1968.
+ * Input: a word string with the length in the first byte
+ * Output: the stemmed word
+ * ========================================================================= */
+
+void
+stem (u_char * word)
+{
+  char *word_start;		/* points to first letter of word */
+  char *stem_end;		/* points to last character of stem portion */
+  int old_length;		/* length of word */
+  int new_length;		/* length after stemming */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  u_char copy[MAX_STEM_LENGTH + 2];
+  bcopy ((char *) word, (char *) copy, *word + 1);
+
+  old_length = *copy; /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* The word must be at least MIN_STEM_LENGTH characters long. */
+  if (old_length <= MIN_STEM_LENGTH)
+    return;
+
+  word_start = (char *) copy + 1;	/* jump over length byte */ /* [RPAP - Jan 97: Stem Index Change] */
+  copy[old_length + 1] = '\0';	/* null terminate string */ /* [RPAP - Jan 97: Stem Index Change] */
+
+  stem_end = remove_ending (word_start, old_length);
+  recode_stem (stem_end);
+
+  /* fix up new length */
+  /* have to use strlen because have no other way of telling length */
+  new_length = strlen (word_start);
+  *copy = new_length;  /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  bcopy ((char *) copy, (char *) word, *copy + 1);
+
+}				/*stem_complex */
+
+/* =========================================================================
+
+ *   Data structure for recoding and the method for recoding the stem. 
+ *
+ * ========================================================================= */
+
+typedef struct
+{
+  char *old_end;		/* old ending */
+  char *new_end;		/* new ending */
+  char old_offset;		/* length of the old ending - 1 */
+  int (*cond) ();		/* condition rule */
+  char end_group;		/* signal the end of the group */
+}
+Recode_Rules;
+
+/*  
+   Stem terminations are divided into groups having the same last
+   character
+ */
+
+static Recode_Rules Rules[] =
+{
+  "uad", "uas", 2, NULL, 0,
+  "vad", "vas", 2, NULL, 0,
+  "cid", "cis", 2, NULL, 0,
+  "lid", "lis", 2, NULL, 0,
+  "erid", "eris", 3, NULL, 0,
+  "pand", "pans", 3, NULL, 0,
+  "end", "ens", 2, s, 0,
+  "end", "ens", 2, m, 0,
+  "ond", "ons", 2, NULL, 0,
+  "lud", "lus", 2, NULL, 0,
+  "rud", "rus", 2, NULL, 1,
+
+  "ul", "l", 1, aio, 1,
+
+  "istr", "ister", 3, NULL, 0,
+  "metr", "meter", 3, NULL, 0,
+  "her", "hes", 2, pt, 1,
+
+  "urs", "ur", 2, NULL, 1,
+
+  "uct", "uc", 2, NULL, 0,
+  "umpt", "um", 3, NULL, 0,
+  "rpt", "rb", 2, NULL, 0,
+  "mit", "mis", 2, NULL, 0,
+  "ert", "ers", 2, NULL, 0,
+  "et", "es", 1, n, 0,
+  "yt", "ys", 1, NULL, 1,
+
+  "iev", "ief", 2, NULL, 0,
+  "olv", "olut", 2, NULL, 1,
+
+  "bex", "bic", 2, NULL, 0,
+  "dex", "dic", 2, NULL, 0,
+  "pex", "pic", 2, NULL, 0,
+  "tex", "tic", 2, NULL, 0,
+  "ax", "ac", 1, NULL, 0,
+  "ex", "ec", 1, NULL, 0,
+  "ix", "ic", 1, NULL, 0,
+  "lux", "luc", 2, NULL, 1,
+
+  "yz", "ys", 1, NULL, 1
+};
+
+typedef struct last
+  {
+    char c;			/* The last character */
+    struct last *left;		/* used in balanced   */
+    struct last *right;		/* binary tree        */
+    Recode_Rules *pt;		/* location of approriate group */
+  }
+Last_Char_Node;
+
+/*------------
+       s
+     /   \
+    l     x
+   / \   / \
+  d   r t   z
+         \
+          v
+---------------*/
+static Last_Char_Node pr[] =
+{
+  'd', NULL, NULL, Rules,
+  'l', pr, pr + 2, Rules + 11,
+  'r', NULL, NULL, Rules + 12,
+  's', pr + 1, pr + 6, Rules + 15,
+  't', NULL, pr + 5, Rules + 16,
+  'v', NULL, NULL, Rules + 23,
+  'x', pr + 4, pr + 7, Rules + 25,
+  'z', NULL, NULL, Rules + 33,
+};
+
+
+/*****************************************************************************
+ *
+ *  Recode the stem according to the transformation rules.
+ *
+ *****************************************************************************/
+
+static void
+recode_stem (char *stem_end)
+{
+  static Last_Char_Node *root = pr + 3;
+  Last_Char_Node *p_last = root;
+  Recode_Rules *rule;		/* points to the transformation list */
+  char *h,			/* points to start of possible ending */
+    ch,				/* last character of the old ending  */
+    ch2;
+
+  h = stem_end - 1;
+  ch = *stem_end;
+  if (*h == ch)			/* Check for double consonant        */
+    {
+      if (strchr ("bdglmnprst", ch) != NULL)
+	{
+	  *stem_end = EOS;
+	  stem_end = h;
+	}
+    }
+
+  do				/* Check for the last character       */
+    {
+      ch2 = p_last->c;
+      if (ch == ch2)
+	break;
+      else if (ch > ch2)
+	p_last = p_last->right;
+      else
+	p_last = p_last->left;
+    }
+  while (p_last != NULL);
+
+  if (p_last != NULL)		/* Check for the rest of suffix list */
+    {
+      rule = p_last->pt;
+      for (;;)
+	{
+	  h = stem_end - rule->old_offset;
+	  if (strcmp (h, rule->old_end) == 0)
+	    {
+	      if (!rule->cond || (*rule->cond) (*(h - 1)))
+		{
+		  (void) strcpy (h, rule->new_end);
+		  break;
+		}
+	    }
+	  if (rule->end_group)
+	    break;
+	  rule++;
+	}
+    }
+}
+
+/* ======================================================================
+
+ *    List of endings and the method to remove the ending 
+ *
+ * ======================================================================*/
+
+/************ Data structures for list of endings  ********************/
+
+typedef struct
+{
+  char *ending;			/* old ending                */
+  int (*cond) ();		/* conditional rule          */
+  signed char left_offset;	/* used to find the siblings */
+  signed char right_offset;	/* in balanced binary tree   */
+}
+Ending_List;
+
+/*
+   The original list of endings is re-organised into groups having
+   the same length and the same first character.
+ */
+
+static Ending_List List[] =
+{
+  "a", NULL, 0, 0,
+
+  "ae", NULL, 0, 0,
+  "al", BB, -1, 2,
+  "ar", X, 0, 0,
+  "as", B, -1, 0,
+
+  "acy", NULL, 0, 1,
+  "age", B, 0, 0,
+  "aic", NULL, -2, 1,
+  "als", BB, 0, 0,
+  "ant", B, -2, 2,
+  "ars", O, 0, 0,
+  "ary", F, -1, 2,
+  "ata", NULL, 0, 0,
+  "ate", NULL, -1, 0,
+
+  "able", NULL, 0, 1,
+  "ably", NULL, 0, 0,
+  "ages", B, -2, 2,
+  "ally", B, 0, 0,
+  "ance", B, -1, 1,
+  "ancy", B, 0, 0,
+  "ants", B, -4, 4,
+  "aric", NULL, 0, 0,
+  "arly", K, -1, 1,
+  "ated", I, 0, 0,
+  "ates", NULL, -2, 2,
+  "atic", B, 0, 0,
+  "ator", NULL, -1, 0,
+
+  "acies", NULL, 0, 0,
+  "acity", NULL, -1, 1,
+  "aging", B, 0, 0,
+  "aical", NULL, -2, 2,
+  "alist", NULL, 0, 0,
+  "alism", B, -1, 0,
+  "ality", NULL, -3, 3,
+  "alize", NULL, 0, 1,
+  "allic", BB, 0, 0,
+  "anced", B, -2, 2,
+  "ances", B, 0, 0,
+  "antic", C, -1, 0,
+  "arial", NULL, -6, 6,
+  "aries", NULL, 0, 1,
+  "arily", NULL, 0, 0,
+  "arity", B, -2, 2,
+  "arize", NULL, 0, 0,
+  "aroid", NULL, -1, 0,
+  "ately", NULL, -3, 3,
+  "ating", I, 0, 1,
+  "ation", B, 0, 0,
+  "ative", NULL, -2, 2,
+  "ators", NULL, 0, 0,
+  "atory", NULL, -1, 1,
+  "ature", E, 0, 0,
+
+  "aceous", NULL, 0, 1,
+  "acious", B, 0, 0,
+  "action", G, -2, 2,
+  "alness", NULL, 0, 0,
+  "ancial", NULL, -1, 1,
+  "ancies", NULL, 0, 0,
+  "ancing", B, -4, 4,
+  "ariser", NULL, 0, 0,
+  "arized", NULL, -1, 1,
+  "arizer", NULL, 0, 0,
+  "atable", NULL, -2, 2,
+  "ations", B, 0, 0,
+  "atives", NULL, -1, 0,
+
+  "ability", NULL, 0, 1,
+  "aically", NULL, 0, 0,
+  "alistic", B, -2, 2,
+  "alities", NULL, 0, 0,
+  "ariness", E, -1, 0,
+  "aristic", NULL, -3, 3,
+  "arizing", NULL, 0, 1,
+  "ateness", NULL, 0, 0,
+  "atingly", NULL, -2, 2,
+  "ational", B, 0, 0,
+  "atively", NULL, -1, 1,
+  "ativism", NULL, 0, 0,
+
+  "ableness", NULL, 0, 1,
+  "arizable", NULL, 0, 0,
+
+  "allically", C, 0, 0,
+  "antaneous", NULL, -1, 1,
+  "antiality", NULL, 0, 0,
+  "arisation", NULL, -2, 2,
+  "arization", NULL, 0, 0,
+  "ationally", B, -1, 1,
+  "ativeness", NULL, 0, 0,
+
+  "antialness", NULL, 0, 0,
+  "arisations", NULL, -1, 1,
+  "arizations", NULL, 0, 0,
+
+  "alistically", B, 0, 1,
+  "arizability", NULL, 0, 0,
+
+  "e", NULL, 0, 0,
+
+  "ed", E, 0, 0,
+  "en", F, -1, 1,
+  "es", E, 0, 0,
+
+  "eal", Y, 0, 0,
+  "ear", Y, -1, 1,
+  "ely", E, 0, 0,
+  "ene", E, -2, 2,
+  "ent", C, 0, 0,
+  "ery", E, -1, 1,
+  "ese", NULL, 0, 0,
+
+  "ealy", Y, 0, 1,
+  "edly", E, 0, 0,
+  "eful", NULL, -2, 1,
+  "eity", NULL, 0, 0,
+  "ence", NULL, -2, 2,
+  "ency", NULL, 0, 0,
+  "ened", E, -1, 2,
+  "enly", E, 0, 0,
+  "eous", NULL, -1, 0,
+
+  "early", Y, 0, 1,
+  "ehood", NULL, 0, 0,
+  "eless", NULL, -2, 2,
+  "elity", NULL, 0, 0,
+  "ement", NULL, -1, 0,
+  "enced", NULL, -3, 3,
+  "ences", NULL, 0, 1,
+  "eness", E, 0, 0,
+  "ening", E, -2, 2,
+  "ental", NULL, 0, 0,
+  "ented", C, -1, 1,
+  "ently", NULL, 0, 0,
+
+  "eature", Z, 0, 0,
+  "efully", NULL, -1, 1,
+  "encies", NULL, 0, 0,
+  "encing", NULL, -2, 2,
+  "ential", NULL, 0, 0,
+  "enting", C, -1, 1,
+  "entist", NULL, 0, 1,
+  "eously", NULL, 0, 0,
+
+  "elihood", E, 0, 1,
+  "encible", NULL, 0, 0,
+  "entally", NULL, -2, 2,
+  "entials", NULL, 0, 0,
+  "entiate", NULL, -1, 1,
+  "entness", NULL, 0, 0,
+
+  "entation", NULL, 0, 0,
+  "entially", NULL, -1, 1,
+  "eousness", NULL, 0, 0,
+
+  "eableness", E, 0, 1,
+  "entations", NULL, 0, 0,
+  "entiality", NULL, -2, 2,
+  "entialize", NULL, 0, 0,
+  "entiation", NULL, -1, 0,
+
+  "entialness", NULL, 0, 0,
+
+  "ful", NULL, 0, 0,
+
+  "fully", NULL, 0, 0,
+
+  "fulness", NULL, 0, 0,
+
+  "hood", NULL, 0, 0,
+
+  "i", NULL, 0, 0,
+
+  "ia", NULL, 0, 0,
+  "ic", NULL, -1, 1,
+  "is", NULL, 0, 0,
+
+  "ial", NULL, 0, 0,
+  "ian", NULL, -1, 1,
+  "ics", NULL, 0, 1,
+  "ide", L, 0, 0,
+  "ied", NULL, -3, 3,
+  "ier", NULL, 0, 0,
+  "ies", P, -1, 0,
+  "ily", NULL, -1, 1,
+  "ine", M, 0, 0,
+  "ing", N, -5, 5,
+  "ion", Q, 0, 0,
+  "ish", C, -1, 1,
+  "ism", B, 0, 1,
+  "ist", NULL, 0, 0,
+  "ite", AA, -3, 3,
+  "ity", NULL, 0, 0,
+  "ium", NULL, -1, 0,
+  "ive", NULL, -1, 1,
+  "ize", F, 0, 0,
+
+  "ials", NULL, 0, 0,
+  "ians", NULL, -1, 0,
+  "ible", NULL, -1, 1,
+  "ibly", NULL, 0, 0,
+  "ical", NULL, -2, 2,
+  "ides", L, 0, 0,
+  "iers", NULL, -1, 1,
+  "iful", NULL, 0, 0,
+  "ines", M, -4, 4,
+  "ings", N, 0, 0,
+  "ions", B, -1, 1,
+  "ious", NULL, 0, 0,
+  "isms", B, -2, 2,
+  "ists", NULL, 0, 0,
+  "itic", H, -1, 1,
+  "ized", F, 0, 1,
+  "izer", F, 0, 0,
+
+  "ially", NULL, 0, 0,
+  "icant", NULL, -1, 1,
+  "ician", NULL, 0, 0,
+  "icide", NULL, -2, 2,
+  "icism", NULL, 0, 0,
+  "icist", NULL, -1, 0,
+  "icity", NULL, -3, 3,
+  "idine", I, 0, 1,
+  "iedly", NULL, 0, 0,
+  "ihood", NULL, -2, 2,
+  "inate", NULL, 0, 0,
+  "iness", NULL, -1, 0,
+  "ingly", B, -6, 6,
+  "inism", J, 0, 1,
+  "inity", CC, 0, 0,
+  "ional", NULL, -2, 2,
+  "ioned", NULL, 0, 0,
+  "ished", NULL, -1, 0,
+  "istic", NULL, -3, 3,
+  "ities", NULL, 0, 1,
+  "itous", NULL, 0, 0,
+  "ively", NULL, -2, 2,
+  "ivity", NULL, 0, 0,
+  "izers", F, -1, 1,
+  "izing", F, 0, 0,
+
+  "ialist", NULL, 0, 0,
+  "iality", NULL, -1, 1,
+  "ialize", NULL, 0, 0,
+  "ically", NULL, -2, 2,
+  "icance", NULL, 0, 0,
+  "icians", NULL, -1, 1,
+  "icists", NULL, 0, 0,
+  "ifully", NULL, -4, 4,
+  "ionals", NULL, 0, 0,
+  "ionate", D, -1, 1,
+  "ioning", NULL, 0, 0,
+  "ionist", NULL, -2, 2,
+  "iously", NULL, 0, 0,
+  "istics", NULL, -1, 1,
+  "izable", E, 0, 0,
+
+  "ibility", NULL, 0, 0,
+  "icalism", NULL, -1, 1,
+  "icalist", NULL, 0, 1,
+  "icality", NULL, 0, 0,
+  "icalize", NULL, -3, 3,
+  "ication", G, 0, 0,
+  "icianry", NULL, -1, 0,
+  "ination", NULL, -1, 1,
+  "ingness", NULL, 0, 0,
+  "ionally", NULL, -5, 5,
+  "isation", NULL, 0, 0,
+  "ishness", NULL, -1, 1,
+  "istical", NULL, 0, 1,
+  "iteness", NULL, 0, 0,
+  "iveness", NULL, -3, 3,
+  "ivistic", NULL, 0, 0,
+  "ivities", NULL, -1, 0,
+  "ization", F, -1, 1,
+  "izement", NULL, 0, 0,
+
+  "ibleness", NULL, 0, 0,
+  "icalness", NULL, -1, 1,
+  "ionalism", NULL, 0, 0,
+  "ionality", NULL, -2, 2,
+  "ionalize", NULL, 0, 0,
+  "iousness", NULL, -1, 1,
+  "izations", NULL, 0, 0,
+
+  "ionalness", NULL, 0, 1,
+  "istically", NULL, 0, 0,
+  "itousness", NULL, -2, 2,
+  "izability", NULL, 0, 0,
+  "izational", NULL, -1, 0,
+
+  "izationally", B, 0, 0,
+
+  "ly", B, 0, 0,
+
+  "less", NULL, 0, 1,
+  "lily", NULL, 0, 0,
+
+  "lessly", NULL, 0, 0,
+
+  "lessness", NULL, 0, 0,
+
+  "ness", NULL, 0, 0,
+
+  "nesses", NULL, 0, 0,
+
+  "o", NULL, 0, 0,
+
+  "on", S, 0, 1,
+  "or", T, 0, 0,
+
+  "oid", NULL, 0, 0,
+  "one", R, -1, 1,
+  "ous", NULL, 0, 0,
+
+  "ogen", NULL, 0, 0,
+
+  "oidal", NULL, 0, 0,
+  "oides", NULL, -1, 2,
+  "otide", NULL, 0, 0,
+  "ously", NULL, -1, 0,
+
+  "oidism", NULL, 0, 0,
+
+  "oidally", NULL, 0, 1,
+  "ousness", NULL, 0, 0,
+
+  "s", W, 0, 0,
+
+  "s'", NULL, 0, 0,
+
+  "um", U, 0, 1,
+  "us", V, 0, 0,
+
+  "ward", NULL, 0, 1,
+  "wise", NULL, 0, 0,
+
+  "y", B, 0, 0,
+
+  "yl", R, 0, 0,
+
+  "ying", B, 0, 1,
+  "yish", NULL, 0, 0,
+
+  "'s", NULL, 0, 0,
+};
+
+typedef struct node
+  {
+    char c;			/* First character  */
+    struct node *left;		/* used in balanced */
+    struct node *right;		/* binary tree      */
+    Ending_List *ptr[11];	/* the approriate location */
+  }
+First_Char_Node;
+
+static First_Char_Node First[] =
+{
+  '\'', NULL, NULL,
+  {NULL,
+   List + 293, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'a', First, NULL,
+  {List,
+   List + 2, List + 9, List + 20, List + 39, List + 58,
+   List + 70, List + 77, List + 82, List + 87, List + 89},
+
+  'e', First + 1, First + 4,
+  {List + 91,
+   List + 93, List + 98, List + 106, List + 116, List + 126,
+   List + 133, List + 138, List + 142, List + 145, NULL},
+
+  'f', NULL, NULL,
+  {NULL,
+   NULL, List + 146, NULL, List + 147, NULL,
+   List + 148, NULL, NULL, NULL, NULL},
+
+  'h', First + 3, First + 5,
+  {NULL,
+   NULL, NULL, List + 149, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'i', NULL, NULL,
+  {List + 150,
+   List + 152, List + 163, List + 181, List + 202, List + 222,
+   List + 239, List + 252, List + 258, NULL, List + 261},
+
+  'l', First + 2, First + 10,
+  {NULL,
+   List + 262, NULL, List + 263, NULL, List + 265,
+   NULL, List + 266, NULL, NULL, NULL},
+
+  'n', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 267, NULL, List + 268,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'o', First + 7, First + 9,
+  {List + 269,
+   List + 270, List + 273, List + 275, List + 277, List + 280,
+   List + 281, NULL, NULL, NULL, NULL},
+
+  's', NULL, NULL,
+  {List + 283,
+   List + 284, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'u', First + 8, First + 12,
+  {NULL,
+   List + 285, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'w', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 287, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'y', First + 11, NULL,
+  {List + 289,
+   List + 290, NULL, List + 291, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+};
+
+
+/******************************************************************************
+ *
+ *  Look for a match in the suffix list.
+ *  Return the pointer to the end of the new stem if there is a match.
+ *  Otherwise, return the pointer to the end of the original word.
+ *
+ *  Method:
+ *      * Search for the first character in the suffix list.
+ *      * If there is match, search for the rest of the suffix list.
+ *         
+ *****************************************************************************/
+
+static char *
+remove_ending (char *word, int w_len)
+{
+  static First_Char_Node *root = First + 6;	/* the root of binary tree is 'l' */
+  First_Char_Node *p_first;	/* Points to the first character      */
+  /* of the possible suffix             */
+  Ending_List *p_list;		/* Points to the List of Endings      */
+  char *suffix_start,		/* Points to start of possible suffix */
+   *stem_end,			/* Points to the end of possible stem */
+    ch1, ch2;
+  int s_len,			/* Possible stem length               */
+    e_offset,			/* Offset from the end to the start of */
+  /* possible suffix                    */
+    not_done = 1, cmp;
+
+  stem_end = word + w_len - 1;
+  if (w_len > PREDEFINED_SIZE)	/* find the start of suffix   */
+    suffix_start = word + w_len - MAX_ENDING_SIZE;
+  else
+    suffix_start = word + MIN_STEM_LENGTH;
+
+  ch1 = *suffix_start;
+  do				/* Search for the first character     */
+    {
+      p_first = root;
+      do
+	{
+	  ch2 = p_first->c;
+	  if (ch1 == ch2)
+	    break;
+	  else if (ch1 > ch2)
+	    p_first = p_first->right;
+	  else
+	    p_first = p_first->left;
+	}
+      while (p_first != NULL);
+
+      if (p_first != NULL)	/* Search for the rest */
+	{
+	  e_offset = stem_end - suffix_start;
+	  if ((p_list = p_first->ptr[e_offset]) != NULL)
+	    {
+	      for (;;)		/* no need to compare the first char  */
+		{
+		  cmp = strcmp (suffix_start + 1, p_list->ending + 1);
+		  if (cmp > 0)
+		    if (p_list->right_offset)
+		      p_list += p_list->right_offset;
+		    else
+		      break;
+		  else if (cmp < 0)
+		    if (p_list->left_offset)
+		      p_list += p_list->left_offset;
+		    else
+		      break;
+		  else
+		    {
+		      s_len = suffix_start - word;
+		      if (!p_list->cond ||
+			  (*p_list->cond) (s_len, suffix_start - 1))
+			{
+			  *suffix_start = EOS;
+			  stem_end = suffix_start - 1;
+			  not_done = 0;
+			}
+		      break;
+		    }
+		}
+	    }
+	}
+      suffix_start++;
+    }
+  while (not_done && ((ch1 = *suffix_start) != EOS));
+  return (stem_end);
+}
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.h
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.h	(revision 21083)
@@ -0,0 +1,40 @@
+/**************************************************************************
+ *
+ * stem.h -- Lovins' stemmer header
+ * Copyright (C) 1994  Linh Huynh, 
+ *                     (glued into library by tes@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+/*
+   $Log$
+   Revision 1.1  2001/02/14 01:19:59  jmt14
+   *** empty log message ***
+
+   * Revision 1.2  1994/09/20  04:20:10  tes
+   * Changes made for 1.1
+   *
+   *
+ */
+#ifndef STEM_H
+#define STEM_H
+
+void stem (unsigned char *word);
+
+#endif
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/sysfuncs.h
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/sysfuncs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/sysfuncs.h	(revision 21083)
@@ -0,0 +1,352 @@
+/* System dependent definitions for GNU tar.
+   Copyright (C) 1994 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * [TS:Aug/95]
+ * Based on code from system.h file in GNU's tar package 
+ *
+ */
+
+#ifndef SYSFUNCS_H
+#define SYSFUNCS_H
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include <WIN32cfg.h>
+# else
+#  include <config.h>
+# endif
+#endif
+
+/* Declare alloca.  AIX requires this to be the first thing in the file.  */
+
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#ifdef _AIX
+#pragma alloca
+#else
+#ifndef alloca
+char *alloca ();
+#endif
+#endif
+#endif
+#endif
+
+#include <sys/types.h>
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95]
+ * Some extra include files that mg needs
+ */
+#include <stdlib.h>
+#include <math.h>
+
+#ifndef log2
+# ifndef M_LN2
+#  define M_LN2 0.69314718055994530942
+# endif
+# define log2(x) (log(x)/M_LN2)
+#endif
+
+
+#ifndef HAVE_SETBUFFER
+# define setbuffer(f, b, s)  setvbuf(f, b, _IOFBF, s)
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if defined(__MSDOS__)  && !defined(__WIN32__)
+# define SHORT_SUFFIX 1
+#endif
+
+
+
+#include <assert.h>
+
+/* ------------------------------------------------- */
+
+/* Declare a generic pointer type.  */
+#if __STDC__ || defined(__TURBOC__)
+#define voidstar void *
+#else
+#define voidstar char *
+#endif
+
+/* Declare ISASCII.  */
+
+#include <ctype.h>
+
+#if STDC_HEADERS
+#define ISASCII(Char) 1
+#else
+#ifdef isascii
+#define ISASCII(Char) isascii (Char)
+#else
+#if HAVE_ISASCII
+#define ISASCII(Char) isascii (Char)
+#else
+#define ISASCII(Char) 1
+#endif
+#endif
+#endif
+
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95] 
+ * The following is copied from GNU Autoconf.Info (1.1)   
+ * It sets up the approriate string and memory functions.
+ */
+
+#if STDC_HEADERS || HAVE_STRING_H
+#include <string.h>
+   /* An ANSI string.h and pre-ANSI memory.h might conflict */
+#if !STDC_HEADERS && HAVE_MEMORY_H
+#include <memory.h>
+#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
+#ifndef index
+#define index strchr
+#endif
+#ifndef rindex
+#define rindex strrchr
+#endif
+#ifndef bcopy
+#define bcopy(s, d, n) memcpy((d), (s), (n))
+#endif
+#ifndef bcmp
+#define bcmp(s1, s2, n) memcmp((s1), (s2), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n) memset((s), 0, (n))
+#endif
+#else /* not STDC_HEADERS and not HAVE_STRING_H */
+#include <strings.h>
+   /* memory.h and strings.h conflict on some systems */
+#endif
+/* ------------------------------------------------- */
+
+
+/* Declare errno.  */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+/* Declare open parameters.  */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#include <sys/file.h>
+#endif
+
+#ifndef	O_BINARY
+#define O_BINARY 0
+#endif
+#ifndef O_CREAT
+#define O_CREAT 0
+#endif
+#ifndef	O_NDELAY
+#define O_NDELAY 0
+#endif
+#ifndef	O_RDONLY
+#define O_RDONLY 0
+#endif
+#ifndef O_RDWR
+#define O_RDWR 2
+#endif
+
+/* Declare file status routines and bits.  */
+
+#include <sys/stat.h>
+
+#ifdef STAT_MACROS_BROKEN
+#undef S_ISBLK
+#undef S_ISCHR
+#undef S_ISDIR
+#undef S_ISFIFO
+#undef S_ISLNK
+#undef S_ISMPB
+#undef S_ISMPC
+#undef S_ISNWK
+#undef S_ISREG
+#undef S_ISSOCK
+#endif
+
+/* On MSDOS, there are missing things from <sys/stat.h>.  */
+#ifdef __MSDOS__
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
+#endif
+
+#ifndef S_ISREG			/* POSIX.1 stat stuff missing */
+#define mode_t unsigned short
+#endif
+#if !defined(S_ISBLK) && defined(S_IFBLK)
+#define S_ISBLK(Mode) (((Mode) & S_IFMT) == S_IFBLK)
+#endif
+#if !defined(S_ISCHR) && defined(S_IFCHR)
+#define S_ISCHR(Mode) (((Mode) & S_IFMT) == S_IFCHR)
+#endif
+#if !defined(S_ISDIR) && defined(S_IFDIR)
+#define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
+#endif
+#if !defined(S_ISREG) && defined(S_IFREG)
+#define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
+#endif
+#if !defined(S_ISFIFO) && defined(S_IFIFO)
+#define S_ISFIFO(Mode) (((Mode) & S_IFMT) == S_IFIFO)
+#endif
+#if !defined(S_ISLNK) && defined(S_IFLNK)
+#define S_ISLNK(Mode) (((Mode) & S_IFMT) == S_IFLNK)
+#endif
+#if !defined(S_ISSOCK) && defined(S_IFSOCK)
+#define S_ISSOCK(Mode) (((Mode) & S_IFMT) == S_IFSOCK)
+#endif
+#if !defined(S_ISMPB) && defined(S_IFMPB)	/* V7 */
+#define S_ISMPB(Mode) (((Mode) & S_IFMT) == S_IFMPB)
+#define S_ISMPC(Mode) (((Mode) & S_IFMT) == S_IFMPC)
+#endif
+#if !defined(S_ISNWK) && defined(S_IFNWK)	/* HP/UX */
+#define S_ISNWK(Mode) (((Mode) & S_IFMT) == S_IFNWK)
+#endif
+
+#if !defined(S_ISCTG) && defined(S_IFCTG)	/* contiguous file */
+#define S_ISCTG(Mode) (((Mode) & S_IFMT) == S_IFCTG)
+#endif
+#if !defined(S_ISVTX)
+#define S_ISVTX 0001000
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if !defined(_POSIX_SOURCE) && !defined(__WIN32__)
+#include <sys/param.h>
+#endif
+
+/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION.  */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+
+/* Declare standard functions.  */
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+voidstar malloc ();
+voidstar realloc ();
+char *getenv ();
+#endif
+
+#include <stdio.h>
+
+#ifndef _POSIX_VERSION
+#ifdef __MSDOS__
+#include <io.h>
+#else
+off_t lseek ();
+#endif
+#endif
+
+/*#include <pathmax.h>*/
+
+/* Until getoptold function is declared in getopt.h, we need this here for
+   struct option.  */
+/*#include <getopt.h>*/
+
+#ifdef WITH_DMALLOC
+#undef HAVE_VALLOC
+#define DMALLOC_FUNC_CHECK
+#include <dmalloc.h>
+#endif
+
+/* Prototypes for external functions.  */
+
+#ifndef __P
+#if PROTOTYPES
+#define __P(Args) Args
+#else
+#define __P(Args) ()
+#endif
+#endif
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+#if !HAVE_SETLOCALE
+#define setlocale(Category, Locale)
+#endif
+
+#if ENABLE_NLS
+#include <libintl.h>
+#define _(Text) gettext (Text)
+#else
+#define textdomain(Domain)
+#define _(Text) Text
+#endif
+
+/* Library modules.  */
+
+#ifdef HAVE_VPRINTF
+void error __P ((int, int, const char *,...));
+#else
+void error ();
+#endif
+
+#ifndef HAVE_STRSTR
+char *strstr __P ((const char *, const char *));
+#endif
+
+/* [RB/TS:Oct/95] commented out. Used by lib/gmalloc.c - but it defines it anyway ???
+ *#ifndef HAVE_VALLOC
+ *#define valloc(Size) malloc (Size)
+ *#endif
+ */
+
+voidstar xmalloc __P ((size_t));
+voidstar xrealloc __P ((voidstar, size_t));
+char *xstrdup __P ((const char *));
+
+/* [TS:Aug/95] 
+ * These were required by files which referred 
+ * to these as function pointers. 
+ * e.g. huffman.c - fread,  mgfelics.c - fgetc
+ */
+#ifndef HAVE_FREAD_DECL
+extern size_t   fread __P ((void *, size_t, size_t, FILE *));
+#endif
+#ifndef HAVE_FGETC_DECL
+extern int      fgetc __P ((FILE *));
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifndef u_long
+# define u_long unsigned long
+#endif
+#ifndef u_char
+# define u_char unsigned char
+#endif
+
+
+#endif /* SYSFUNCS_H */
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/KEP.java
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/KEP.java	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/KEP.java	(revision 21083)
@@ -0,0 +1,1338 @@
+/*
+ *    KEP.java
+ *    Version 1.1
+ *
+ *    Kea -- Automatic Keyphrase Extraction
+ *    Copyright 1998-1999 by Eibe Frank and Gordon Paynter
+ *    Contact eibe@cs.waikato.ac.nz or gwp@cs.waikato.ac.nz
+ *
+ *    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.
+ */
+
+/*
+ * KEP is the machine learning and post-processing part of KEA,
+ * the Keyphrase Extraction Algorithm.
+ *
+ * KEP assumes that the class is the last attribute and
+ * that keyphrases not found in the text have a
+ * missing class value.
+ *
+ * @author Eibe Frank (eibe@cs.waikato.ac.nz)
+ */
+
+/* 
+ * Version History
+ *
+ * 1.0   Witten et.al version
+ * 1.1   First distribution
+ * 1.1.1 Bug: when more output requested than there are (filtered) 
+ *       instances in the arff file, Kea would output garbage
+ *       STDOUT output cleaned up in training stage
+ */
+
+import java.io.*;
+import java.util.*;
+import java.util.zip.*;
+import jaws.corePackage.*;
+import jaws.evaluationPackage.*;
+import jaws.classifierPackage.*;
+import jaws.filterPackage.*;
+
+public class KEP implements Serializable {
+  
+  // ================
+  // Public variables
+  // ================
+
+  /**
+   * The maximum number of documents in
+   * training and test corpus.
+   */
+
+  public final static int MAX_NUM_DOCS = 1000;
+
+  /**
+   * Index of the column with the document name.
+   */
+
+  public final static int DOC_NUM_INDEX = 1;
+
+  /**
+   * Number of steps for optimization of
+   * probability cutoff.
+   */
+
+  public final static int PROB_STEPS = 100;
+
+  /**
+   * Minimum probability that a phrase
+   * has to achieve.
+   */
+   
+  public final static double MIN_PROB = 0.00;
+
+  /**
+   * Maximum number of bins for equal 
+   * width discretization.
+   */
+
+  public final static int MAX_BINS = 30;
+
+  /**
+   * Minimum number of bins for equal
+   * width discretization.
+   */
+
+  public final static int MIN_BINS = 2;
+
+  /**
+   * Number of folds for standard 
+   * cross-validation.
+   */
+
+  public final static int NUM_FOLDS = 5;
+
+  /**
+   *  Columns to be discretized.
+   */
+
+  public final static String DISC_RANGE = "first-last";
+
+  // =================
+  // Private variables
+  // =================
+
+  /**
+   * The classifier for determining
+   * keyphrases.
+   */
+
+  private DistributionClassifier theClassifier = new NaiveBayes();
+
+  /**
+   * The number of phrases to be output.
+   */
+
+  private int theNumPhrases = -1;
+
+  /**
+   * The minimum probability a phrase has
+   * to achieve.
+   */
+
+  private double theMinProb = -1;
+
+  /**
+   * Rank cutoff.
+   */
+
+  private int theRankCutoff;
+
+  /**
+   * The maximum rank cutoff.
+   */
+
+  private int theMaxRankCutoff = 20;
+
+  /**
+   * The minimum rank cutoff.
+   */
+
+  private int theMinRankCutoff = 1;
+
+  /**
+   * Probability cutoff.
+   */
+
+  private double theProbCutoff;
+
+  /**
+   * The number of bins for equal width discretization.
+   */
+
+  private int theNumBins = 23;
+
+  /**
+   * The discretizer built up on the training data.
+   */
+
+  private DiscretiseFilter theDisc;
+
+  /**
+   * Equal width discretization?
+   */
+
+  private boolean theEqual = false;
+
+  /**
+   * Columns in arff file to be used for building
+   * the classifier.
+   */
+
+  private String[] theCols = {"tfidf","first_occurrence","class"};
+
+  /**
+   * Column to be used for subphrase selection.
+   */
+
+  private String theSubphraseColumnName = "tfidf";
+
+  /**
+   * Column for subphrase sellection: higher is better
+   */
+
+  private boolean theSubphraseHi = true;
+
+  /**
+   * The secondary key for sorting the phrases in
+   * the table (primary key: probability)
+   */
+
+  private String theSecKeyColumnName = "tfidf";
+
+  /**
+   * Column for secondary key: higher is better
+   */
+
+  private boolean theSecKeyHi = true;
+
+  /**
+   * Column to be used for selecting batches for the
+   * cross-validation.
+   */
+
+  private String theCVColumnName = "";
+
+  /**
+   * Use training data instead of cross-validation?
+   */
+
+  private boolean theUseTrain = true;
+
+  /**
+   * Use discretization?
+   */
+
+  private boolean theUseDiscretization = true;
+
+  // ==============
+  // Public methods
+  // ==============
+  
+  /**
+   * Returns the indices for the given attribute names.
+   * @param name the attributes' names
+   * @return ind the indices
+   * @exception Exception if something goes wrong
+   */
+  
+  private String indices(Instances dataset) {
+
+    String rangeList = "";
+    for(int i = 0; i < theCols.length; i++)
+      if (i == 0)
+	rangeList = ""+(dataset.attribute(theCols[i]).index() + 1);
+      else
+	rangeList += ","+(dataset.attribute(theCols[i]).index() + 1);
+    return rangeList;
+  }
+  
+  /**
+   * Performs a cross-validation on the given dataset.
+   * @returns the best F-Measure for all probability
+   * and rank cutoffs
+   */
+
+   private double[][][] crossValidation(Instances instances, int numPos) 
+       throws Exception {
+
+    SelectFilter selFilter;
+    DiscretiseFilter discFilter;
+    DeleteFilter delFilter;
+    Instances train, test, trainDisc, testDisc;
+    int numFolds, indexI, indexP;
+    boolean batchedMode = false;
+    double[][][] results = new double[theMaxRankCutoff][PROB_STEPS][2];
+    double[][][] bestInsts;
+    double[] currentTPandFP;
+    int[] range = new int[1];
+    int theCVColumn = -1;
+
+    if (theCVColumnName.length() > 0)
+      theCVColumn = instances.attribute(theCVColumnName).index();
+    
+    // Is there more than one document in the dataset?
+
+    if ((theCVColumn != -1) && (instances.attribute(theCVColumn).numValues() > 1)) {
+      batchedMode = true;
+      numFolds = instances.attribute(theCVColumn).numValues();
+    } else 
+      numFolds = NUM_FOLDS;
+
+    // Perform the cross-validation
+      
+    for (int k = 0; k < numFolds; k++) {
+
+      System.err.println("Processing fold: "+k);
+
+      if (batchedMode) {
+
+	// Batched cross-validation
+
+	selFilter = new SelectFilter();
+	selFilter.setInvertSelection(true);
+	selFilter.setAttributeIndex(theCVColumn + 1);
+	selFilter.inputFormat(instances);
+
+	// Generate training set
+    
+	range[0] = k;
+	selFilter.setNominalIndicesArr(range);
+	train = Filter.useFilter(instances, selFilter);
+
+	// Generate test set
+
+	selFilter.setInvertSelection(false);
+	test = Filter.useFilter(instances, selFilter);
+      }  else {
+
+	// Standard NUM_FOLDS cross-validation
+
+	train = instances.trainCV(NUM_FOLDS, k);
+	test = instances.testCV(NUM_FOLDS, k);
+      }
+
+      System.err.println("Choosing attributes...");
+
+      // Choose attributes in training and test data
+
+      delFilter = new DeleteFilter();
+      delFilter.setInvertSelection(true);
+      delFilter.setAttributeIndices(indices(instances));
+      delFilter.inputFormat(instances);
+      trainDisc = Filter.useFilter(train, delFilter);
+      testDisc = Filter.useFilter(test, delFilter);
+
+      System.err.println("Discretizing...");
+
+      // Discretise training and test data
+
+      discFilter = new DiscretiseFilter();
+      discFilter.setAttributeIndices(DISC_RANGE);
+      if (theEqual) {
+	discFilter.setBins(theNumBins);
+	discFilter.setClassIndex(-1);
+	discFilter.setUseMDL(false);
+      } else 
+	discFilter.setClassIndex(trainDisc.numAttributes());
+      discFilter.inputFormat(trainDisc);
+      trainDisc = Filter.useFilter(trainDisc, discFilter);
+      testDisc = Filter.useFilter(testDisc, discFilter);
+
+      System.err.println("Building classifier...");
+
+      // Build classifier on training data
+
+      theClassifier.buildClassifier(trainDisc);
+
+      // Find the most probable keyphrases in the test data
+
+      System.err.println("Looking for the most probable keyphrases...");
+
+      bestInsts = new double[MAX_NUM_DOCS][theMaxRankCutoff][2];
+      mostProbablePhrases(test, testDisc, bestInsts);
+
+      // Compute F-measure for all probability and rank
+      // cutoffs and add to sum.
+
+      indexI = 0;
+      for (int i = theMinRankCutoff; i <= theMaxRankCutoff; i++) {
+	indexP = 0;
+	for (double p = 1 - (1.0/PROB_STEPS); p >= MIN_PROB; 
+	     p = p - (1.0/PROB_STEPS)) {
+	  currentTPandFP = TPandFP(test, bestInsts, i, p, false);
+	  results[indexI][indexP][0] += currentTPandFP[0];
+	  results[indexI][indexP][1] += currentTPandFP[1];
+	  indexP++;
+	}
+	indexI++;
+      }
+    }
+
+    return results;
+  }
+
+  /**
+   * Optimizes the F-measure by choosing the discretization and the
+   * rank and probability cutoffs.
+   */
+
+  private double optimizeFMeasure(Instances instances, int numPos)
+    throws Exception {
+
+    double[][][][] results;
+    double currentFMeasure, maxFMeasure = 0;
+    int temp_MAX_BINS = MIN_BINS;
+
+    if (theEqual)
+      temp_MAX_BINS = MAX_BINS;
+
+    // Do cross-validation for different number of bins.
+
+    results = 
+      new double[temp_MAX_BINS - MIN_BINS + 1][theMaxRankCutoff][PROB_STEPS][2];
+    for (int b = MIN_BINS; b <= temp_MAX_BINS; b++) {
+      if (theEqual) {
+	System.err.println("Computing Estimate for "+b+" bins");
+	theNumBins = b;
+      }
+      results[b - MIN_BINS] = crossValidation(instances, numPos);
+    }
+
+    // Choose best parameter settings
+
+    for (int b = MIN_BINS; b <= temp_MAX_BINS; b++) {
+      
+      // Find best probability and rank cutoffs
+      
+      int indexI = 0;
+      for (int i = theMinRankCutoff; i <= theMaxRankCutoff; i++) {
+	int indexP = 0;
+	for (double p = 1-(1.0/PROB_STEPS); p >= MIN_PROB; p=p-(1.0/PROB_STEPS)) {
+	  currentFMeasure = 
+	    fMeasure(results[b - MIN_BINS][indexI][indexP][0], 
+		     results[b - MIN_BINS][indexI][indexP][1],
+		     numPos - results[b - MIN_BINS][indexI][indexP][0]);
+	  if (Utils.grOrEq(currentFMeasure, maxFMeasure)) {
+	    theRankCutoff = i;
+	    theProbCutoff = p;
+	    theNumBins = b;
+	    maxFMeasure = currentFMeasure;
+	  }
+	  indexP++;
+	}
+	indexI++;
+      }
+    }
+
+    return maxFMeasure;
+  }
+  
+  /**
+   * Computes true positives and false positives for the dataset.
+   */
+
+  private double[] TPandFP(Instances dataset, double[][][]  bestInsts, 
+			   int rankCutoff, double probCutoff, boolean output) 
+       throws Exception {
+    
+    double[] TPandFP = new double[2];
+    
+    // For all documents
+
+    for (int i = 0; i < dataset.attribute(DOC_NUM_INDEX).numValues(); i++) {
+
+      if (output)
+	System.out.println("Current document: "+
+			   dataset.attribute(DOC_NUM_INDEX).value(i));
+
+      // Up to the current rankcutoff
+
+      for (int j = 0; j < rankCutoff; j++) {
+
+	// Don't output trash (instances with probability 0)
+	if (bestInsts[i][j][0] == 0) {
+	  break;
+	}
+
+	// Find the true positives and false positives
+
+	if (Utils.sm(bestInsts[i][j][0], probCutoff))
+	  break;
+	if(dataset.instance((int)bestInsts[i][j][1]).classValue() == 0) {
+	  TPandFP[0]++;
+	  if (output)
+	    System.out.println("Hit: "+dataset.instance((int)bestInsts[i][j][1])+
+			       " "+bestInsts[i][j][0]);
+	} else {
+	  TPandFP[1]++;
+	  if (output)
+	    System.out.println("Miss: "+dataset.instance((int)bestInsts[i][j][1])+
+			       " "+bestInsts[i][j][0]);
+	}
+      }
+    }
+
+    return TPandFP;
+  }
+
+  /**
+   * Computes and outputs precision per document for rank cutoffs 1 to 20.
+   * Also outputs average precision and standard deviation.
+   */
+
+  private void precisions(Instances dataset, double[][][]  bestInsts) 
+       throws Exception {
+     
+    double[] precisions;
+    int i, tp, fp; 
+    double standardError, deltaConfidence;
+
+    // For all rank cutoffs
+
+    for (int r = 1; r <= theMaxRankCutoff; r++) {
+      
+      // For all documents
+      
+      precisions = new double[dataset.attribute(DOC_NUM_INDEX).numValues()];
+      for (i = 0; i < dataset.attribute(DOC_NUM_INDEX).numValues(); i++) {
+	
+	// Up to the current rankcutoff
+	
+	tp = fp = 0;
+	for (int j = 0; j < r; j++) {
+	  
+	  // Find the true positives and false positives
+	  
+	  if(dataset.instance((int)bestInsts[i][j][1]).classValue() == 0) 
+	    tp++;
+	  else 
+	    fp++;
+	}
+	precisions[i] = ((double) tp) / ((double) tp + fp);
+      }
+      System.err.print(r);
+      System.err.print("\t"+Utils.
+		       doubleToString(Utils.sum(precisions) / i, 6,4));
+      standardError = Math.sqrt(Utils.variance(precisions) / i);
+      deltaConfidence = Statistics.studentTConfidenceInterval(i - 1,
+							      0.05, standardError);
+      System.err.println("\t"+Utils.doubleToString(deltaConfidence, 6,4)+" &&&");
+    }
+  }
+   
+
+  /**
+   * Computes F-Measure.
+   */
+
+ private double fMeasure(double tp, double fp, double fn) {
+ 
+   return (2 * tp) / ((2 * tp) + fp + fn);
+ }
+
+  /**
+   * Computes the F-Measure for the given dataset.
+   */
+
+  private double fMeasure(Instances dataset, double[][][]  bestInsts, 
+			  int rankCutoff, double probCutoff, int numPos, 
+			  boolean output) 
+       throws Exception {
+    
+    double[] TPandFP = TPandFP(dataset, bestInsts, rankCutoff, probCutoff, output); 
+    double fn = (double)numPos - TPandFP[0];
+    double precision, recall;
+
+    if (output) {
+      System.out.println("tp: "+TPandFP[0]+"\tfp: "+TPandFP[1]+"\tfn: "+fn);
+      precision = TPandFP[0]/(TPandFP[0]+TPandFP[1]);
+      recall = TPandFP[0]/(TPandFP[0]+fn);
+      System.out.println("Precision: "+precision);
+      System.out.println("Recall: "+recall);
+      System.out.println("F-measure: "+((2*precision*recall)/(precision+recall)));
+    }
+
+    return fMeasure(TPandFP[0], TPandFP[1], fn);
+  }
+
+  /**
+   * Computes the best cutoff.
+   */
+
+  private void bestCutoffs(Instances dataset, double[][][]  bestInsts, 
+			   int numPos) throws Exception {
+
+    double maxFMeasure = 0, currentFMeasure;
+    
+    theRankCutoff = 0;
+    theProbCutoff = 1;
+    for (int i = theMinRankCutoff; i <= theMaxRankCutoff; i++) {
+      for (double p = 1-(1.0/PROB_STEPS); p >= MIN_PROB; p = p-(1.0/PROB_STEPS)) {
+	currentFMeasure = fMeasure(dataset, bestInsts, i, p, numPos, false);
+	if (Utils.grOrEq(currentFMeasure, maxFMeasure)) {
+	  theRankCutoff = i;
+	  theProbCutoff = p;
+	  maxFMeasure = currentFMeasure;
+	}
+	// System.out.println("Current rank cutoff: "+i+
+	//		   "\tCurrent prob cutoff: "+p+
+	//		   "\tF-Measure: "+currentFMeasure);
+      }
+    }
+    System.err.println("Best rank cutoff: "+theRankCutoff+
+		       "\tBest prob cutoff: "+theProbCutoff+
+		       "\tF-Measure: "+maxFMeasure);
+  }
+
+  /**
+   * Finds and deletes all missed author-defined keyphrases in the
+   * dataset and returns the number of positive examples.
+   */
+
+  private int findMissedPositives(Instances data) throws Exception {
+
+    int numPos = 0, missing = 0;
+
+    System.err.println("Looking for missed keyphrases in the dataset...");
+    
+    for (int i = 0; i < data.numInstances(); i++) {
+      if (data.instance(i).classIsMissing()) {
+	missing++;
+	numPos++;
+      } else {
+	if (data.instance(i).classValue() == 0)
+	  numPos++;
+      }
+    }
+
+    System.err.println("Found " + (int)data.attribute(DOC_NUM_INDEX).numValues() + 
+		       " documents in the dataset.");
+    System.err.println("Total number of examples missing: "+missing);
+    System.err.println("Total number of positive examples: "+numPos);
+
+    return numPos;
+  }
+
+  /**
+   * Gets all the subphrases of an instance.
+   */
+
+  public String[] getSubphrases(String phrase) {
+
+    StringTokenizer tokenizer = new StringTokenizer(phrase);
+    String[] words = new String[tokenizer.countTokens()], subphrases;
+    int i = 0, numSubphrases = 0, s = 0;
+
+    // Get all words in the phrase
+
+    while (tokenizer.hasMoreElements()) {
+      words[i] = tokenizer.nextToken();
+      i++;
+    }
+    
+    // How many subphrases?
+
+    for (i = 0; i < words.length - 1; i++)
+      numSubphrases += words.length - i;
+
+    // Array for storing the subphrases.
+
+    subphrases = new String[numSubphrases];
+    
+    // Compute subphrases.
+
+    for (i = 0; i < words.length; i++) {
+
+      // All subphrases at position i.
+
+      for (int j = 0; j < words.length - i; j++) {
+
+	// The subphrase of length j + 1, apart
+        // of the phrase itself.
+
+	if ((i != 0) || (j != (words.length - 1))) {
+	  if (j == 0)
+	    subphrases[s] = words[i];
+	  else
+	    subphrases[s] = subphrases[s - 1]+' '+words[i + j];
+	  s++;
+	}
+      }
+    }
+
+    return subphrases;
+  }
+
+  /**
+   * Gets the stemmed phrase of an instance.
+   */
+
+  public String getPhrase(Instance instance) throws Exception {
+
+    String string = instance.attribute(0).value((int)instance.value(0));
+
+    return string.substring(1, string.indexOf('(') - 1);
+  }
+
+  /** 
+   * Find the theMaxRankCutoff most probable phrases for each document.
+   * @param data the set of instances
+   * @param bestInsts an array double[MAX_NUM_DOCS][theMaxRankCutoff][2]:
+   * double[i][j][0] contains the probability, and
+   * double[i][j][1] the instances index.
+   * @exception Exception if an instance can't be classified
+   */
+
+  public void mostProbablePhrases(Instances originalData,
+				  Instances data, double bestInsts[][][]) 
+       throws Exception {
+
+    double[] probAndIndex, probAndIndexSubphrase;
+    int numDoc;
+    Hashtable[] hashtables = new Hashtable[originalData.attribute(DOC_NUM_INDEX).
+					  numValues()];
+    String[] subphrases;
+    String phrase;
+    int theSubphraseColumn = -1, theSecKeyColumn = -1;
+
+    if (theSubphraseColumnName.length() > 0)
+      theSubphraseColumn = originalData.attribute(theSubphraseColumnName).index();
+    if (theSecKeyColumnName.length() > 0)
+      theSecKeyColumn = originalData.attribute(theSecKeyColumnName).index();
+
+    // Make a new hashtable for each document that stores the phrases.
+
+    for (numDoc = 0; numDoc < originalData.attribute(DOC_NUM_INDEX).numValues();
+	 numDoc++) 
+      hashtables[numDoc] = 
+        new Hashtable(originalData.numInstances()/
+		      originalData.attribute(DOC_NUM_INDEX).numValues());
+
+    // Go through all the instances and keep the best phrases in hash tables.
+    // (ie., their indices and probabilities.)  Delete all subphrases that suck.
+
+    for (int i = 0; i < data.numInstances(); i++) {
+
+      // Do nothing if the class is missing.
+
+      if (!data.instance(i).classIsMissing()) {
+
+	// Store index and probability in an array.
+	
+	probAndIndex = new double[2];
+	probAndIndex[0] = theClassifier.
+	  distributionForInstance(data.instance(i))[0];
+	probAndIndex[1] = (double)i;
+	
+	// Shortcut -- getting rid of phrases with very small probability.
+
+	if (Utils.sm(probAndIndex[0], MIN_PROB))
+	    continue;
+
+	// Which document does the current phrase belong to?
+	
+	numDoc = (int)originalData.instance(i).value(DOC_NUM_INDEX);
+	
+	// Get the actual phrase.
+	
+	phrase = getPhrase(originalData.instance(i));
+	
+	// Put the phrase into the hashtable.
+	
+	hashtables[numDoc].put(phrase, probAndIndex);
+	
+	// Do we want to get rid of subphrases?
+
+	if (theSubphraseColumn != -2 ) {
+
+	  // Get all subphrases.
+	  
+	  subphrases = getSubphrases(phrase);
+	  
+	  // Delete all subphrases with lower or equal probability from the 
+	  // hash table.
+	  
+	  for (int j = 0; j < subphrases.length; j++) {
+	    probAndIndexSubphrase = 
+	      (double[]) hashtables[numDoc].get(subphrases[j]);
+	    if ((probAndIndexSubphrase != null) && 
+		Utils.smOrEq(probAndIndexSubphrase[0], probAndIndex[0]))
+	      if ((theSubphraseColumn == -1) || 
+		  ((theSubphraseHi &&
+		    Utils.smOrEq(originalData.
+				 instance((int)probAndIndexSubphrase[1]).
+				 value(theSubphraseColumn), 
+				 originalData.instance((int)probAndIndex[1]).
+				 value(theSubphraseColumn))) ||
+		   ((!theSubphraseHi) &&
+		    Utils.grOrEq(originalData.
+				 instance((int)probAndIndexSubphrase[1]).
+				 value(theSubphraseColumn), 
+				 originalData.instance((int)probAndIndex[1]).
+				 value(theSubphraseColumn)))))
+		hashtables[numDoc].remove(subphrases[j]);
+	  }
+	}
+      }
+    }
+
+    // Find the theMaxRankCutoff most probable phrases for each document.
+    
+    for (numDoc = 0; numDoc < originalData.attribute(DOC_NUM_INDEX).numValues();
+	 numDoc++){
+      Enumeration enum = hashtables[numDoc].elements();
+      while (enum.hasMoreElements()) {
+	probAndIndex = (double[]) enum.nextElement();
+	for (int j = 0; j < theMaxRankCutoff; j++)
+	  if (Utils.gr(probAndIndex[0],  bestInsts[numDoc][j][0]) || 
+	      ((theSecKeyColumn != -1) &&
+	       Utils.eq(probAndIndex[0],  bestInsts[numDoc][j][0]) &&
+	       ((theSecKeyHi && 
+		 Utils.gr(originalData.instance((int)probAndIndex[1]).
+			  value(theSecKeyColumn), 
+			  originalData.instance((int)bestInsts[numDoc][j][1]).
+			  value(theSecKeyColumn))) ||
+		((!theSecKeyHi) && 
+		 Utils.sm(originalData.instance((int)probAndIndex[1]).
+			  value(theSecKeyColumn), 
+			  originalData.instance((int)bestInsts[numDoc][j][1]).
+			  value(theSecKeyColumn)))))) {
+	    for (int k = theMaxRankCutoff - 2; k >= j; k--) {
+	      bestInsts[numDoc][k + 1][0] = bestInsts[numDoc][k][0];
+	      bestInsts[numDoc][k + 1][1] = bestInsts[numDoc][k][1];
+	    }
+	    bestInsts[numDoc][j][0] = probAndIndex[0];
+	    bestInsts[numDoc][j][1] = probAndIndex[1];
+	    break;
+	  }
+      }
+    }
+  }
+    
+  /**
+   * Method that builds classifier.
+   * @exception Exception if classifier can't be built successfully
+   */
+
+  public void buildClassifier(InputStream inputStream) throws Exception {
+   
+    Instances instances, instancesDel, instancesDisc;
+    DeleteFilter del;
+    int numPos;
+    double[][][]  bestInsts = 
+      new double[MAX_NUM_DOCS][theMaxRankCutoff][2];
+
+    System.err.println("Loading data...");
+
+    instances = new Instances(inputStream);
+    instances.setClassIndex(instances.numAttributes() - 1);
+
+    // Number of positive examples?
+
+    System.err.println("Counting positive examples...");
+
+    numPos = findMissedPositives(instances);
+
+    if ((theNumPhrases <= 0) && (theMinProb < 0) && (!theUseTrain)) {
+
+      // Cross-validation for parameter settings
+      
+      System.err.println("Performing cross-validation...");
+      
+      System.err.println("F-measure: (cross-validation) "+
+			 optimizeFMeasure(instances, numPos));
+      
+      System.err.println("Deleting columns...");
+    }
+
+    System.err.println("Deleting columns...");
+
+    // Deleting columns
+    
+    del = new DeleteFilter();
+    del.setInvertSelection(true);
+    del.setAttributeIndices(indices(instances));
+    del.inputFormat(instances);
+    instancesDel = Filter.useFilter(instances, del);
+
+    if (theUseDiscretization) {
+
+      System.err.println("Discretizing columns...");
+      
+      // Discretizing columns
+      
+      theDisc = new DiscretiseFilter();
+      theDisc.setAttributeIndices(DISC_RANGE);
+      if (theEqual) {
+	theDisc.setBins(theNumBins);
+	theDisc.setClassIndex(-1);
+	theDisc.setUseMDL(false);
+      } else 
+	theDisc.setClassIndex(instancesDel.numAttributes());
+      theDisc.inputFormat(instancesDel);
+      instancesDisc = Filter.useFilter(instancesDel, theDisc);
+    } else
+      instancesDisc = instancesDel;
+
+    System.err.println("Building classifier...");
+
+    // Build the classifier.
+
+    theClassifier.buildClassifier(instancesDisc);
+
+    System.err.println("\n"+theClassifier);
+
+    if ((theNumPhrases <= 0) && (theUseTrain) && (theMinProb < 0)) {
+
+      System.err.println("Finding most probable keyphrases...");
+      
+      // Find the most probable keyphrases.
+      
+      mostProbablePhrases(instances, instancesDisc, bestInsts);
+      
+      System.err.println("Finding best cutoffs...");
+      
+      // Find the best cutoffs.
+      
+      bestCutoffs(instances, bestInsts, numPos);
+    } else if ((theNumPhrases > 0) || (theMinProb >= 0)) {
+      theRankCutoff = theNumPhrases;
+      theProbCutoff = theMinProb;
+    }
+  }
+
+  /**
+   * Method that classifies phrases.
+   * @exception Exception if phrases can't be classified successfully.
+   */
+
+  public void classifyPhrases(InputStream inputStream) throws Exception {
+
+    Instances instances, instancesDel, instancesDisc;
+    DeleteFilter del;
+    int numPos;
+    double[][][]  bestInsts = 
+      new double[MAX_NUM_DOCS][theMaxRankCutoff][2];
+
+    if ((theNumPhrases > 0) || (theMinProb >= 0)) {
+      theRankCutoff = theNumPhrases;
+      theProbCutoff = theMinProb;
+    }
+
+    System.err.println("Preparing data...");
+
+    // Prepare data and find total number of positive
+    // examples.
+
+    instances = new Instances(inputStream);
+    instances.setClassIndex(instances.numAttributes() - 1);
+
+    System.err.println("Counting positive examples...");
+
+    // Number of positive examples?
+
+    numPos = findMissedPositives(instances);
+
+    System.err.println("Deleting columns...");
+
+    // Deleting columns
+
+    del = new DeleteFilter();
+    del.setInvertSelection(true);
+    del.setAttributeIndices(indices(instances));
+    del.inputFormat(instances);
+    instancesDel = Filter.useFilter(instances, del);
+
+    if (theUseDiscretization) 
+
+      // Discretizing columns
+      
+      instancesDisc = Filter.useFilter(instancesDel, theDisc);
+    else
+      instancesDisc = instancesDel;
+
+    System.err.println("Finding most probable keyphrases...");
+
+    // Find the most probable keyphrases.
+
+    mostProbablePhrases(instances, instancesDisc, bestInsts);
+
+    System.err.println("Computing statistics...");
+
+    // Compute F-Measure.
+
+    System.err.println("Rank cutoff: "+theRankCutoff);
+    System.err.println("Probability cutoff: "+theProbCutoff);
+
+    System.err.println("F-Measure: "+
+		       fMeasure(instances, bestInsts, theRankCutoff, 
+				theProbCutoff, numPos, true));
+
+    // Output average precisions for ranks and confidence intervals
+
+    System.err.println("Rank\tPrec.\tConf.");
+    precisions(instances, bestInsts);
+  }
+
+  /**
+   * Generate results for different size training sets.
+   */
+
+  public void iterateTrainingSets(InputStream train, InputStream test) 
+       throws Exception {
+
+	 int[] sizes = new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130};
+    Instances trainInst, testInst, tempTrainInst, tempTrainInstDisc, testInstDisc;
+    SelectFilter selFilter;
+    DeleteFilter del;
+    int[] indices;
+    int numPos;
+    double[][][] bestInsts;
+
+    trainInst = new Instances(train);
+    trainInst.setClassIndex(trainInst.numAttributes() - 1);
+    testInst =  new Instances(test);
+    testInst.setClassIndex(testInst.numAttributes() - 1);
+    for (int i = 0; i < sizes.length; i++) {
+
+      System.err.println("Processing "+sizes[i]+" documents");
+      
+      // Delete documents
+
+      System.err.println("Selecting documents...");
+
+      selFilter = new SelectFilter();
+      indices = new int[sizes[i]];
+      for (int j = 0; j < sizes[i]; j++)
+	indices[j] = j;
+      selFilter.setInvertSelection(false);
+      selFilter.setAttributeIndex(2);
+      selFilter.setNominalIndicesArr(indices);
+      selFilter.inputFormat(trainInst);
+      tempTrainInst = Filter.useFilter(trainInst, selFilter);
+
+      numPos = findMissedPositives(tempTrainInst);
+
+      System.err.println("Deleting columns...");
+
+      // Deleting columns
+      
+      del = new DeleteFilter();
+      del.setInvertSelection(true);
+      del.setAttributeIndices(indices(tempTrainInst));
+      del.inputFormat(tempTrainInst);
+      tempTrainInstDisc = Filter.useFilter(tempTrainInst, del);
+
+      if (theUseDiscretization) {
+
+	System.err.println("Discretizing columns...");
+	
+	// Discretizing columns
+	
+	theDisc = new DiscretiseFilter();
+	theDisc.setAttributeIndices(DISC_RANGE);
+	if (theEqual) {
+	  theDisc.setBins(theNumBins);
+	  theDisc.setClassIndex(-1);
+	  theDisc.setUseMDL(false);
+	} else 
+	  theDisc.setClassIndex(tempTrainInstDisc.numAttributes());
+	theDisc.inputFormat(tempTrainInstDisc);
+	tempTrainInstDisc = Filter.useFilter(tempTrainInstDisc, theDisc);
+      }
+
+      System.err.println("Building classifier...");
+      
+      // Build the classifier.
+      
+      theClassifier.buildClassifier(tempTrainInstDisc);
+
+      System.err.println("\n"+theClassifier);
+
+      if ((theNumPhrases <= 0) && (theUseTrain) && (theMinProb < 0)) {
+
+	System.err.println("Finding most probable keyphrases...");
+	
+	// Find the most probable keyphrases.
+
+	bestInsts = 
+	  new double[MAX_NUM_DOCS][theMaxRankCutoff][2];	
+	mostProbablePhrases(tempTrainInst, tempTrainInstDisc, bestInsts);
+	
+	System.err.println("Finding best cutoffs...");
+	
+	// Find the best cutoffs.
+	
+	bestCutoffs(tempTrainInst, bestInsts, numPos);
+      } else if ((theNumPhrases > 0) || (theMinProb >= 0)) {
+	theRankCutoff = theNumPhrases;
+	theProbCutoff = theMinProb;
+      }
+
+      // Number of positive examples?
+      
+      numPos = findMissedPositives(testInst);
+      
+      System.err.println("Deleting columns...");
+      
+      // Deleting columns
+      
+      del = new DeleteFilter();
+      del.setInvertSelection(true);
+      del.setAttributeIndices(indices(testInst));
+      del.inputFormat(testInst);
+      testInstDisc = Filter.useFilter(testInst, del);
+
+      // Discretizing columns
+      
+      testInstDisc = Filter.useFilter(testInstDisc, theDisc);
+
+      System.err.println("Finding most probable keyphrases...");
+      
+      // Find the most probable keyphrases.
+
+      bestInsts = 
+	new double[MAX_NUM_DOCS][theMaxRankCutoff][2];
+      mostProbablePhrases(testInst, testInstDisc, bestInsts);
+
+      System.err.println("Computing statistics...");
+
+      // Compute F-Measure.
+      
+      System.err.println("Rank cutoff: "+theRankCutoff);
+      System.err.println("Probability cutoff: "+theProbCutoff);
+      
+      System.err.println("F-Measure: "+
+			 fMeasure(testInst, bestInsts, theRankCutoff, 
+				  theProbCutoff, numPos, false));
+
+      // Output average precisions for ranks and confidence intervals
+      
+      System.err.println("Rank\tPrec.\tConf.");
+      precisions(testInst, bestInsts);
+    }
+  }
+
+  /**
+   * Returns an enumeration describing the available options
+   * @return an enumeration of all the available options
+   */
+
+  public Enumeration listOptions() {
+
+    Vector newVector = new Vector(14);
+
+    newVector.addElement(new Option(
+              "\tName of the training file.",
+              "t", 1, "-t <training file>"));
+    newVector.addElement(new Option(
+	      "\tName of the test file.",
+              "T", 1, "-T <test file>"));
+    newVector.addElement(new Option(
+              "\tSpecify list of columns to to be used. Class column has to\n"+
+	      "\tbe listed.",
+              "R", 1, "-R <name1,name2-name4,...>"));
+    newVector.addElement(new Option(
+	      "\tUse equal width discretization.",
+              "E", 0, "-E"));
+    newVector.addElement(new Option(
+	      "\tDelete unlikely subphrases. Takes column to be used\n"+
+	      "\tin conjunction with probability to delete unlikely\n"+
+	      "\tsubphrases. Higher value is better. (\"\" means no column)",
+              "S", 1, "-S <column name>"));
+    newVector.addElement(new Option(
+	      "\tDelete unlikely subphrases. Takes column to be used in\n"+
+	      "\tconjunction with probability to delete unlikely subphrases.\n"+
+	      "\tLower value is better. (\"\" means no column)",
+              "s", 1, "-s <column name>"));
+    newVector.addElement(new Option(
+	      "\tSecondary key for sorting phrases in table. Primary key:\n"+
+	      "\tprobability. Higher value is better. (\"\" means no secondary key)",
+              "K", 1, "-K <column name>"));		    
+    newVector.addElement(new Option(
+	      "\tSecondary key for sorting phrases in table. Primary key:\n"+
+	      "\tprobability. Lower value is better. (\"\" means no secondary key)",
+              "k", 1, "-k <column name>"));		    
+    newVector.addElement(new Option(
+	      "\tColumn to be used for batched cross-validation.\n"+
+	      "\t(\"\" means standard 5-fold cross-validation)",
+              "B", 1, "-B <column name>"));		    
+    newVector.addElement(new Option(
+	      "\tThe maximum rank cutoff. (Default 10)",
+              "X", 1, "-X <rank cutoff>"));
+    newVector.addElement(new Option(
+	      "\tThe minimum rank cutoff. (Default 1)",
+              "M", 1, "-M <rank cutoff>"));
+    newVector.addElement(new Option(
+	      "\tDon't optimize F-measure. Just output the given number of\n"+
+	      "\tphrases.",
+              "N", 1, "-N <number>"));
+    newVector.addElement(new Option(
+	      "\tDon't optimize F-measure. Just output phrases with probablity\n"+
+	      "\tgreater or equal to the given one.",
+              "P", 1, "-P <prob>"));
+
+    return newVector.elements();
+  }
+
+
+  /**
+   * Parses a given list of options.
+   * @param options the list of options as an array of strings
+   * @exception Exception if an option is not supported
+   */
+
+  public void parseOptions(String[] options) throws Exception {
+
+    String numPhrases = Utils.getOption('N', options);
+    if (numPhrases.length() != 0)
+      theNumPhrases = Integer.parseInt(numPhrases);
+
+    String minProb = Utils.getOption('P', options);
+    if (minProb.length() != 0)
+      theMinProb = (new Double(minProb)).doubleValue();
+
+    String useList = Utils.getOption('R', options);
+    if (useList.length() != 0) {
+      StringTokenizer st = new StringTokenizer(useList, ",", false);
+      theCols = new String[st.countTokens()];
+      for (int i = 0; i < theCols.length; i++)
+	theCols[i] = st.nextToken();
+    }
+
+    if (Utils.getFlag('E', options)) {
+      theEqual = true;
+    }
+
+    if (Utils.getFlag('D', options)) {
+      theUseDiscretization = false;
+    }
+
+    String subphrases = Utils.getOption('S', options);
+    if (subphrases.length() != 0) {
+      theSubphraseColumnName = subphrases;
+      theSubphraseHi = true;
+    }
+    
+    String subphrasesII = Utils.getOption('s', options);
+    if (subphrasesII.length() != 0) {
+      if (subphrases.length() != 0)
+	throw new Exception("Can't use -S and -s at the same time!");
+      theSubphraseColumnName = subphrasesII;
+      theSubphraseHi = false;
+    }
+
+    String key = Utils.getOption('K', options);
+    if (key.length() != 0) {
+      theSecKeyColumnName = key;
+      theSecKeyHi = true;
+    }
+
+    String keyII = Utils.getOption('k', options);
+    if (keyII.length() != 0) {
+      if (key.length() != 0)
+	throw new Exception("Can't use -K and -k at the same time!");
+      theSecKeyColumnName = keyII;
+      theSecKeyHi = false;
+    }
+
+    String cv = Utils.getOption('B', options);
+    if (cv.length() != 0) {
+      theUseTrain = false;
+      theCVColumnName = cv;
+    }
+
+    String maxRankCutoff = Utils.getOption('X', options);
+    if (maxRankCutoff.length() != 0) 
+      theMaxRankCutoff = Integer.parseInt(maxRankCutoff);
+
+    String minRankCutoff = Utils.getOption('M', options);
+    if (minRankCutoff.length() != 0) 
+      theMinRankCutoff = Integer.parseInt(minRankCutoff);
+
+    if (theNumPhrases > theMaxRankCutoff)
+      theMaxRankCutoff = theNumPhrases;
+    if (theNumPhrases < theMinRankCutoff)
+      theMinRankCutoff = theNumPhrases;
+  }
+
+  // ======================================
+  // Main method for command line interface
+  // ======================================
+
+  public static void main(String[] opts) {
+
+    KEP kep;
+    BufferedInputStream trainFile, testFile;
+    ObjectInputStream modelIn;
+    ObjectOutputStream modelOut;
+
+    try{
+   
+      if (Utils.getFlag('I', opts)) {
+	System.err.println("Iterating over training sets...");
+	String train = Utils.getOption('t', opts);
+	String test = Utils.getOption('T', opts);
+	kep = new KEP();
+	kep.parseOptions(opts);
+	trainFile = new BufferedInputStream(new FileInputStream(train));
+	testFile = new BufferedInputStream(new FileInputStream(test));
+	kep.iterateTrainingSets(trainFile, testFile);
+      } else {
+	String model = Utils.getOption('m', opts);
+	String train = Utils.getOption('t', opts);
+	if (model.length() != 0) 
+	  if (train.length() != 0) {
+	    System.err.println("Building classifier and saving it...");
+	    kep = new KEP();
+	    kep.parseOptions(opts);
+	    trainFile = new BufferedInputStream(new FileInputStream(train));
+	    kep.buildClassifier(trainFile);
+	    modelOut = 
+	      new ObjectOutputStream(new 
+				     GZIPOutputStream(new FileOutputStream(model)));
+	    modelOut.writeObject(kep);
+	    modelOut.flush();
+	    modelOut.close();
+	  } else {
+	    System.err.println("Loading classifier...");
+	    modelIn = 
+	      new ObjectInputStream(new
+				    GZIPInputStream(new FileInputStream(model)));
+	    kep = (KEP) modelIn.readObject();
+	    modelIn.close();
+	    kep.parseOptions(opts);
+	  }
+	else if (train.length() != 0) {
+	  System.err.println("Building classifier...");
+	  kep = new KEP();
+	  kep.parseOptions(opts);
+	  trainFile = new BufferedInputStream(new FileInputStream(train));
+	  kep.buildClassifier(trainFile);
+	} else
+	  throw new Exception("Neither classifier nor training file given!");
+	
+	String test = Utils.getOption('T', opts);
+	if (test.length() != 0) {
+	  System.err.println("Classifying phrases...");
+	  testFile = new BufferedInputStream(new FileInputStream(test));
+	  kep.classifyPhrases(testFile);
+	}
+      }
+    } catch (Exception e) {
+      System.err.println("\nOptions:\n");
+      kep = new KEP();
+      Enumeration enum = kep.listOptions();
+      while (enum.hasMoreElements()) {
+	Option option = (Option) enum.nextElement();
+	System.err.println(option.synopsis()+'\n'+option.description());
+      }
+      System.err.println();
+      e.printStackTrace();
+    }
+  }
+}
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Kea
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Kea	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/Kea	(revision 21083)
@@ -0,0 +1,299 @@
+#!/usr/bin/perl -w
+
+#    Kea
+#    Version 1.1.4
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0   Witten et.al.
+# 1.0.1 Bug: stopword file loaded as model file
+# 1.0.2 Java paths explicit for nikau; JIT compiler
+# 1.0.3 Include tf.idf in output if -t is set
+# 1.0.4 Allow optional keyphrase frequency file
+# 1.0.5 Use $perl_command and $java_command for system-indepence
+# 1.0.6 -C argument selects model, stopword file, df file 
+# 1.0.7 Changes to Kea.pl.
+#       This is Phillip's version
+# 1.0.8 Accepts .htm as well as .html
+# 1.0.9 Accepts .text as well as .txt
+# 1.1   First Distribution.  GPL added.  Documentation added.
+# 1.1.1 -E argument sets output extension (default is .kea)
+# 1.1.2 Documented java variables
+#       Maximum phrase length can be set at command-line.
+#       Note: default=3; NOT the length for the model. Sorry.
+# 1.1.3 Moved Lynx command into separate script that checks
+#       for circumstances that are likely to crash it.
+# 1.1.4 Updated documentation and added a few extra files.
+
+print STDERR "\nKea (version 1.1.4): automatic keyphrase extraction\n";
+
+$gsdlhome = $ENV{'GSDLHOME'};
+
+`gcc -o $gsdlhome/perllib/Kea-1.1.4/stemmer $gsdlhome/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem-Lovins-iterated.c $gsdlhome/perllib/Kea-1.1.4/Iterated-Lovins-stemmer/stem.c`;
+
+
+# Kea runs other perl scripts in shells.
+$perl_command = "perl -w";
+
+# Java is a bit more difficult.
+# set this variable to your java home directory
+#$java_home = "/usr/local/jdk";
+$java_home = "/usr/local/share/java";
+
+# this variable will hold the CLASSPATH for java which we set at 
+# the command line to incorporate jaws.jar; you shouldn't need to change it
+$java_classpath = ".:$gsdlhome/perllib/Kea-1.1.4/jaws.jar:$gsdlhome/perllib/Kea-1.1.4:$java_home/lib/classes.zip";
+
+# The name of your java just-in-time compiler.  I use TYA.
+# An empty string means you don;t have a JIT compiler.
+$java_JIT_compiler = "";
+#$java_JIT_compiler = "tya";
+
+# If you want to give java lots of memory or use other arguments, 
+# use this variable, otherwise make it an empty string.
+$java_extra_args = "";
+$java_extra_args = "-ss100000000 -oss100000000 -mx200000000";
+
+# The actual java command is based on these other variables:
+$java_command = "$java_home/bin/java -classpath \"$java_classpath\"";
+$java_command .= " -Djava.compiler=$java_JIT_compiler" if ($java_JIT_compiler);
+$java_command .= " $java_extra_args" if ($java_extra_args);
+
+
+# Parse command line options
+require("getopts.pl"); 
+&Getopts("dtN:E:C:F:K:L:M:S:");
+
+# What files shall we use?
+if (!$ARGV[0]) { 
+    die "Usage: Kea [options] text-or-html-or-cstr-files
+Options:
+ -d           Debug mode
+ -t           Ouput TF.IDF
+ -N n         Output n keyphrases
+ -L n         Maximum phrases length is n (default = 3)
+ -E <suffix>  Output extension is <suffix>
+ -C <corpus>  Use model/df/kf/stopwords based on <corpus>  
+ -F <document-frequency file>
+ -K <keyphrase-frequency file>
+ -M <Naive-Bayes model file>
+ -S <stopword file>
+See README for more detail.
+";
+}
+
+
+# Number of phrases to extract
+if (($opt_N) && ($opt_N =~ /^\d+$/) && ($opt_N > 0)) {
+    $number_of_phrases = "-N $opt_N";
+    print STDERR "Number of phrases to extract: $opt_N\n";
+} elsif ($opt_N) {
+    die "Kea cannot understand -N argument (must be a number): $opt_N\n";
+} else {
+    print STDERR "Number of phrases dictated by model (default)\n";
+    $number_of_phrases = "";
+}
+
+# -L maximum phrase length
+$maximum_phrase_length = 0;
+if (($opt_L) && ($opt_L =~ /^\d+$/) && ($opt_L > 0)) {
+    $maximum_phrase_length = "$opt_L";
+    print STDERR "Maximum phrase length: $opt_L\n";
+} elsif ($opt_L) {
+    die "Kea cannot understand -L argument (must be a number): $opt_L\n";
+}
+
+# -E What extension shall we use?
+$extension = "kea";
+if ($opt_E) {
+    $extension = $opt_E;
+    $extension =~ s/^\.//g;
+    print STDERR "Using output extension: $extension\n";
+}
+
+# -t Should we output tfidf?  (This option is used by Kniles.)
+if ($opt_t && $opt_t) {
+    $output_tfidf = 1;
+    print STDERR "Do print tf.idf\n";
+} else {
+    $output_tfidf = 0;
+}
+
+
+# -C Corpus file stem 
+$default_stem = "$gsdlhome/perllib/Kea-1.1.4/aliweb";
+if ($opt_C) {
+    print STDERR "Corpus: $opt_C (setting default model/stopwords/df)\n";
+    $default_stem = "$gsdlhome/perllib/Kea-1.1.4/$opt_C";
+}
+
+# set the default model etc
+$model_file = "$default_stem.model";
+$stopword_file = "$default_stem.stopwords";
+$frequency_file = "$default_stem.df";
+$keyword_frequency_file = "";
+$keyword_frequency_file = "$default_stem.kf" if (-e "$default_stem.kf");
+
+
+# -F Document Frequency file
+$frequency_file = "$gsdlhome/perllib/Kea-1.1.4/$opt_F" if ($opt_F);
+print STDERR "Document frequency file: $frequency_file\n";
+die "Document frequency file does not exist!\n" if (!(-e $frequency_file));
+
+# -M Model file
+$model_file =  "$gsdlhome/perllib/Kea-1.1.4/$opt_M" if ($opt_M);
+print STDERR "Model file: $model_file\n";
+die "Model file does not exist!\n" if (!(-e $model_file));
+
+# -S Stopword file
+$stopword_file =  "$gsdlhome/perllib/Kea-1.1.4/$opt_S" if ($opt_S);
+print STDERR "Stopword file: $stopword_file\n";
+die "Stopword file does not exist!\n" if (!(-e $stopword_file));
+
+# -K Keyword frequency file
+$keyword_frequency_file =  "$gsdlhome/perllib/Kea-1.1.4/$opt_K" if ($opt_K);
+if ($keyword_frequency_file) {
+    print STDERR "Keyword frequency file: $keyword_frequency_file\n";
+    die "Keyword frequency file does not exist!\n" if (!(-e $keyword_frequency_file));
+} else {
+    print STDERR "No keyword frequency file (default)\n";
+}
+
+# Count the number of files
+$number_of_files = $#ARGV + 1;
+print STDERR "Number of files: $number_of_files\n\n";
+
+
+
+# Set up working files
+
+$stem = "$gsdlhome/tmp/kea.$$";
+
+$data = "$stem.data";
+$arff = "$stem.arff";
+$out = "$stem.out";
+$err = "$stem.err";
+
+`mkdir -m 777 $data`;
+
+
+# Process each input file into a working file
+print STDERR "Preparing input files in: $data\n";
+
+for ($f = 0; $f <= $#ARGV; $f++) {
+    print STDERR "  document ", ($f+1), ": $ARGV[$f]\r";
+
+    $file = $ARGV[$f];
+    $temp = "$data/$f";
+    $original_filename{$temp} = $file;
+
+    # copy the file to the data directory & coerce into a clause file
+    if ($file =~ /.*\.clauses/) {
+ 	`cp $file $temp.clauses`;
+    } else {
+  	if ($file =~ /.*\.te?xt/) {
+	    `cp $file $temp.txt`;
+	} elsif ($file =~ /.*\.html?/i) {
+	    `cp $file $temp.html`;
+	    `$perl_command $gsdlhome/perllib/Kea-1.1.4/convert-html-to-text.pl $temp.html > $temp.txt`;
+	} elsif ($file =~ /.*\.cstr/) {
+	    `cp $file $temp.cstr`;
+	    `$perl_command $gsdlhome/perllib/Kea-1.1.4/cstr-to-text.pl $temp.cstr $temp.txt`;
+	} else {
+	    die "Unknown file type: $file\n";
+	}
+	# prepare the file
+	`$perl_command $gsdlhome/perllib/Kea-1.1.4/prepare-clauses.pl $temp.txt $temp.clauses`;
+    }
+}
+#print STDERR "\n\n";
+
+# Build the arff file
+$command = "$perl_command $gsdlhome/perllib/Kea-1.1.4/k4.pl -S $stopword_file -f $frequency_file";
+$command .= " -K $keyword_frequency_file" if ($keyword_frequency_file);
+$command .= " -L $maximum_phrase_length" if ($maximum_phrase_length);
+$command .= " $data $arff";
+
+#print STDERR "** $command **\n";
+`$command`;
+
+
+# use KEP.java to extract phrases
+$command = "$java_command KEP -m $model_file -T $arff";
+$command .= " $number_of_phrases" if ($number_of_phrases);
+# -R is correctly set by default in the java file when the model is loaded
+# $command .= " -R tfidf,first_occurrence,keyword_freq,class" if ($keyword_frequency_file);
+$command .= " > $out 2> $err";
+
+print STDERR "** $command  **\n";
+`$command`;
+
+
+
+# Read output file and create .kea files
+
+open(KEP, "<$out");
+
+$document = "";
+
+while (<KEP>) {
+
+    chomp;
+    $line = $_;
+    
+    # new document
+    if ($line =~ "^Current document") {
+	# close the old document
+	if ($document) {
+	    close(DOC);
+	}
+	# open start the new document
+	($doc) = $line =~ /Current document: (.*)\.clauses$/;
+	$document = $original_filename{$doc};
+	$document =~ s/\.[^\.]+$//;
+	$document .= ".$extension";
+	#print STDERR "Opening DOC: $original_filename{$doc} => $document\n";
+	open(DOC, ">$document");
+
+    } elsif ($line =~ "^Miss:") {
+	die "Trying to write with no current document!" if (!$document);
+	($phrase, $tfidf, $evidence) = $line =~ /Miss: ([^,]+).*,([^,]+),no (.+)$/;
+	($stemmed, $unstemmed) = $phrase =~ /\'(.+) \((.+)\)\'/;
+	if ($output_tfidf) {
+	    print DOC "$unstemmed\t$stemmed\t$evidence\t$tfidf\n";       
+	} else {
+	    print DOC "$unstemmed\t$stemmed\t$evidence\n";       
+	}
+    }
+}
+
+
+#get rid of temporary files
+#if (!$opt_d && !$opt_d) {
+#  `rm -r $data $arff $out $err`;
+#}
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README	(revision 21083)
@@ -0,0 +1,324 @@
+Kea -- Automatic Keyphrase Extraction
+
+Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+
+ *    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.
+
+
+***************
+0. Introduction
+***************
+
+Kea is a program for extracting keyphrases from text and html files.
+The Kea algorithm is described in these papers:
+  * Ian H. Witten, Gordon W. Paynter, Eibe Frank, Carl Gutwin, 
+    and Craig G. Nevill-Manning (1999) "KEA: Practical Automatic 
+    Keyphrase Extraction."
+  * Eibe Frank, Gordon W. Paynter, Ian H. Witten, Carl Gutwin, and 
+    Craig G. Nevill-Manning (1999) "Domain-Specific Keyphrase Extraction."
+These papers, and others, and our Kea implementation, are available from
+the technology section of the New Zealand Digital Library web site at
+    http://www.nzdl.org/
+
+Kea was mostly implemented by Gordon Paynter (gwp@cs.waikato.ac.nz)
+and Eibe Frank (eibe@cs.waikato.ac.nz).  Craig Nevill-Manning
+and Carl Gutwin have worked on earlier versions; there's even 
+a chance that some of their semi-colons are still be in service.
+Please contact Gordon about the general implementation or Eibe about
+the java side of things.
+
+This document describes the current Kea implementation.  It is divided 
+into these sections:
+    0. This introduction
+    1. Version History
+    2. System requirements
+    3. Extracting keyphrases
+    4. Using models
+    5. Making models
+    6. The Kea files
+    7. Advanced Kea options
+
+
+******************
+1. Version History
+******************
+
+There were many pre-1.0 versions of Kea; they are mostly forgotten.
+
+Version 1.0 of kea was the version used in the paper by Witten et.al.
+described above.  It was distributed to very few people.
+
+Version 1.1 of Kea is the first "public" version, and is available at
+http://www.nzdl.org/Kea from March 1999.
+
+
+**********************
+2. System requirements
+**********************
+
+Kea runs under Unix.  We have been running it in both Linux and Solaris.
+Kea is implemented in Perl and Java (with exception of the stemmer).
+
+You must have Perl (Version 5 or greater) and Java (Version 1.1.6 or
+greater) installed to run Kea.  The main Kea program, called Kea,
+has a variable called "$java_command" that contains the command
+Kea will use to run java.  You'll have to make sure this is set 
+correctly for your system  (I can't be bothered doing it for you).
+
+To be honest, you'll probably need some ability with Perl and Java to 
+make Kea work.
+
+Kea uses a GPL version of the Lovins stemmer that was written in C.
+This distribution includes a compiled version for LINUX.  If you're
+using Solaris or some other Unix, you will have to recompile it for
+that platform.  The source code is in the Iterated-Lovins-stemmer 
+directory.  The README file in that directory will tell you how to 
+compile the stemmer.  The program "stemmer" must be in the main directory.
+
+(If you know of a GPL Java or Perl version of the Iterated Lovins 
+stemmer, do let me know.)
+
+
+************************
+3. Extracting keyphrases
+************************
+
+The Kea program is used to extract keyphrases from files.  
+It is a perl script, and is used like this:
+    Kea [options] <text-or-html-or-cstr-files>
+
+For example, if you have a text file called myfile.text, you could 
+extract keyphrases from it with this command:
+    Kea myfile.text
+
+Kea's output will be stored in a new file called myfile.kea 
+that looks something like this:
+    protein      protein    0.8135395543417774
+    amino acid   amin ac    0.543230038502526
+    Nutrition    nutrit     0.15095707184225382
+    assay        as         0.15095707184225382
+
+The first column contains keyphrases Kea has extracted from the file.
+The second column contains stemmed versions of the keyphrases.
+The third column is an estimate of the probability that the phrase 
+would be chosen by the author as a keyword for this paper.  (See
+Witten et.al. for an explanation).
+
+Kea has several options.  The most important is -N, which is 
+used to output a specific number of keyphrases.  For example, suppose 
+you have a directory called public_html that contains a bunch of html 
+files, and you want to extract 15 phrases from each.  Use the command:
+    Kea -N 15 public_html/*.html 
+
+Kea works with three types of input file based on extensions.
+    Text files have the extension .txt or .text
+    HTML files have the extension .html or .htm
+    CSTR files have the extension .cstr
+CSTR files are those from the CSTR collection of the NZDL, and you 
+will probably never see them.  If you want Kea to work with HTML or 
+CSTR files, you will need to have the lynx web browser installed 
+(we use version 2.5).
+
+ 
+***************
+4. Using models
+***************
+
+Kea extracts phrases from text files based on a "model" of
+the way authors choose keyphrases. The model is based on a set of
+"training documents" that have author-assigned keyphrases.
+
+The default model for Kea is the "aliweb" model, which is based on
+90 web pages from the aliweb web site.  If you use a different model
+to extract phrases from a document, it might choose different pages.
+See Witten et al. for details.
+
+You can download other models from the Kea download page, or you can 
+make our own.  For example, you can download the CSTR model.  This 
+model performs very well on Computer Science Technical Reports, but 
+less well on other collections.  It consists of four files:
+    cstr.stopwords  A list of stopwords used in text processing.
+    cstr.df         The document-frequencies of some phrases in the CSTR.
+    cstr.model      The Naive-Bayes model used in classification.
+    cstr.kf         The keyphrase-frequencies of some phrases in the CSTR.
+(Note: the CSTR model consists of all these files, not just cstr.model)
+
+If you want to use the CSTR model to extract 10 keyphrases from a file
+called myCSdocument.text, use the command:
+    Kea -N 10 -C cstr myCSdocument.text
+
+ 
+****************
+5. Making models
+****************
+
+This section explains how to create a model that you can later use 
+to extract keyphrases.  You might want to do this for a specialised 
+collection, like we did with the CSTR.
+
+To build a model, you will need some training data. Read Witten et al.
+(1999) to get an idea of the amout of training data you will need.
+(We recommend about 50 documents, but fewer will work if you don't 
+have that many.)
+
+Your training data should be placed in a single directory.
+The training data consists of a set of text files (called *.txt) 
+and author keyword files (called *.key).  For every .txt there 
+should be a .key file.  For example if one of your text files is 
+Witten99.txt, there should be a corresponding keyword file called 
+Witten99.key.  The .txt file should contain the document in plain 
+text form.  The .key file should be a text file containing each 
+of the author-assigned keywords for that file, one per line.
+
+We have put a couple of training datasets that we have used
+on the Kea downloads web page, if you want an example.
+
+Let's assume your training data is in a directory called Green.
+We're going to use your traing data to build a model called green;
+this model will consist of four files: 
+  green.stopwords, green.df, green.model, green.kf.
+
+First, create a "stopwords" file for your collection.  The 
+stopwords are a list of words that never occur at the start 
+or end of a keyphrase.  Read Witten et al. for more detail.
+They are placed in a text file, one per line, in lowercase.
+Kea comes with a stopwords file called aliweb.stopwords.
+We will it in our model:
+    cp aliweb.stopwords green.stopwords
+You can add new stopwords for specialised collections if you
+need to (see cstr.stopwords for an example).
+
+We will now create a model file (green.model) and a document
+frequency file (green.df).  
+
+You will need to convert all the text files to "clauses" files 
+with the command:
+    prepare-clauses-all-txt-files.pl Green
+This will create a clauses gile for every text file: for example, 
+if you have a Witten99.txt file, Witten99.clauses will be created.
+
+Next, you need to create an "arff" file (green.arff) and, as a
+side effect, the document frequency file (green.df).  
+The arff file isn't part of the model; it is the input file 
+needed by the machine learning scheme to create the Naive-Bayes 
+model.  Use the command:
+    k4.pl -f green.df -S green.stopwords Green green.arff
+This command (called k4.pl for historical reasons) uses the 
+training files in the directory Green (specifically, *.clauses 
+and *.key) to create green.arff. 
+It uses green.stopwords for its stopword file, and green.df as its
+document-frequency file.  Since green.df doesn't exist when you
+start, it will create green.df for you as it works. (If you ever 
+repeat this command, you should delete green.df first.)
+
+Now you need to create a Naive-Bayes model (green.model) from 
+the arff file you just built (green.arff).
+You'll need a bit of java knowledge here.  Make sure "./jaws.jar"
+is on your java classpath, and type:
+    java KEP -t green.arff -m green.model
+This will use green.arff as training data to create the 
+Naive-Bayes model, which is saved in green.model.
+
+The final part of the model is *optional* - the keyphrase
+frequency file, called green.kf.  It lists all the author 
+keyphrases in the training data, with the number of 
+times each occurs as a keyphrase.  It is optional, 
+but it does improve performance on *specialised* collections, 
+so if you're extracting keyphrases for a specialised 
+collection for a "real" purpose, then you should use one if
+you can. See Frank et.al. for more details.
+Each line of the file should have a stemmed phrase, followed
+by a tab, folowed by the number of times the phrase is a 
+keyphrase - see cstr.kf or aliweb.kf for an example.
+You can make a file like this with a command like
+    cat Green/*.key | stemmer | count-lines.pl > green.kf
+To do this you will need the stemmer and count-lines.pl
+script provided with Kea.
+
+The model is now complete. 
+
+To use it, put the green.df, green.model, green.stopwords,and
+(if you have one) green.kf in the Kea directory.  You can extract
+keyphrases like this:
+    Kea -N 10 -C green myfile.txt
+
+
+****************
+6. The Kea files
+****************
+
+Here's a description of what the various Kea program files do.
+
+README:      This file. 
+
+Kea:         Extracts keyphrase from text based on a model
+
+*.model:     Naive-Bayes model object stored as a file
+*.kf:        Keyphrase-frequency file
+*.df:        Document-frequency file (aka a global-frequency file)
+*.stopwords: Stopwords file
+
+stemmer:     Program for stemming words with the Iterated Lovins stemmer
+Iterated-Lovins-stemmer:
+             Directory conating code for stemmer.  Some of the files are
+             copyright 1994 Linh Huynh, Gnu Public License.  The others
+             are simply wrappers I have written myself.
+
+KEP.java:    Java code for creating & using a Naive-Bayes model
+KEP.class:   Compiled version of KEP.java
+jaws.jar:    Java archive of the WEKA java machine learnig code.
+             Copyright Eibe Frank & Len Trigg, Gnu Public License.
+
+kea-tidy-key-file.pl:
+             Convert a .key or .kea file into a "clean" format.             
+kea-choose-best-phrase.pl:
+             Find the "best" unstemmed version of a keyphrase
+             that appears in a file in many forms.
+prepare-clauses.pl:
+             Perl script that converts a text file to a clauses file.
+prepare-clauses-all-txt-files.pl:
+             Applies prepare-clauses.pl to an entire directory.
+cstr-to-text.pl:
+             Converts cstr files to text; requires lynx.
+count-lines.pl:
+             Counts the lines in a file.
+
+
+***********************
+7. Advanced Kea options
+***********************
+
+Here is a complete list of the options to Kea.  The last
+four (-F, -K, -M, and -S) have been superceded by the -C option,
+but still work; its possible they are good for something.
+
+ -d     Debug mode.  Working files are left in /tmp
+ -t     Ouput TF.IDF for each phrase.  Used by Kniles.
+ -N n   Output n keyphrases (if possible).
+ -E ext Output files have extension ".ext" (default is ".kea")
+ -C x   Use model based on corpus x.  
+        Defaults to "aliweb" web page corpus.
+
+ -F df  Use document-frequency file "df".
+        Defaults to aliweb.df where x is set by the -C argument.
+ -K kf  Use keyphrase-frequency file "mf".
+        Defaults to x.kf where x is set by the -C argument.
+ -M mf  Use model file "mf".
+        Defaults to x.model where x is set by the -C argument.
+ -S sf  Use stopword file "mf".
+        Defaults to x.stopwords where x is set by the -C argument.
+
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README.txt
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README.txt	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/README.txt	(revision 21083)
@@ -0,0 +1,324 @@
+Kea -- Automatic Keyphrase Extraction
+
+Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+
+ *    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.
+
+
+***************
+0. Introduction
+***************
+
+Kea is a program for extracting keyphrases from text and html files.
+The Kea algorithm is described in these papers:
+  * Ian H. Witten, Gordon W. Paynter, Eibe Frank, Carl Gutwin, 
+    and Craig G. Nevill-Manning (1999) "KEA: Practical Automatic 
+    Keyphrase Extraction."
+  * Eibe Frank, Gordon W. Paynter, Ian H. Witten, Carl Gutwin, and 
+    Craig G. Nevill-Manning (1999) "Domain-Specific Keyphrase Extraction."
+These papers, and others, and our Kea implementation, are available from
+the technology section of the New Zealand Digital Library web site at
+    http://www.nzdl.org/
+
+Kea was mostly implemented by Gordon Paynter (gwp@cs.waikato.ac.nz)
+and Eibe Frank (eibe@cs.waikato.ac.nz).  Craig Nevill-Manning
+and Carl Gutwin have worked on earlier versions; there's even 
+a chance that some of their semi-colons are still be in service.
+Please contact Gordon about the general implementation or Eibe about
+the java side of things.
+
+This document describes the current Kea implementation.  It is divided 
+into these sections:
+    0. This introduction
+    1. Version History
+    2. System requirements
+    3. Extracting keyphrases
+    4. Using models
+    5. Making models
+    6. The Kea files
+    7. Advanced Kea options
+
+
+******************
+1. Version History
+******************
+
+There were many pre-1.0 versions of Kea; they are mostly forgotten.
+
+Version 1.0 of kea was the version used in the paper by Witten et.al.
+described above.  It was distributed to very few people.
+
+Version 1.1 of Kea is the first "public" version, and is available at
+http://www.nzdl.org/Kea from March 1999.
+
+
+**********************
+2. System requirements
+**********************
+
+Kea runs under Unix.  We have been running it in both Linux and Solaris.
+Kea is implemented in Perl and Java (with exception of the stemmer).
+
+You must have Perl (Version 5 or greater) and Java (Version 1.1.6 or
+greater) installed to run Kea.  The main Kea program, called Kea,
+has a variable called "$java_command" that contains the command
+Kea will use to run java.  You'll have to make sure this is set 
+correctly for your system  (I can't be bothered doing it for you).
+
+To be honest, you'll probably need some ability with Perl and Java to 
+make Kea work.
+
+Kea uses a GPL version of the Lovins stemmer that was written in C.
+This distribution includes a compiled version for LINUX.  If you're
+using Solaris or some other Unix, you will have to recompile it for
+that platform.  The source code is in the Iterated-Lovins-stemmer 
+directory.  The README file in that directory will tell you how to 
+compile the stemmer.  The program "stemmer" must be in the main directory.
+
+(If you know of a GPL Java or Perl version of the Iterated Lovins 
+stemmer, do let me know.)
+
+
+************************
+3. Extracting keyphrases
+************************
+
+The Kea program is used to extract keyphrases from files.  
+It is a perl script, and is used like this:
+    Kea [options] <text-or-html-or-cstr-files>
+
+For example, if you have a text file called myfile.text, you could 
+extract keyphrases from it with this command:
+    Kea myfile.text
+
+Kea's output will be stored in a new file called myfile.kea 
+that looks something like this:
+    protein      protein    0.8135395543417774
+    amino acid   amin ac    0.543230038502526
+    Nutrition    nutrit     0.15095707184225382
+    assay        as         0.15095707184225382
+
+The first column contains keyphrases Kea has extracted from the file.
+The second column contains stemmed versions of the keyphrases.
+The third column is an estimate of the probability that the phrase 
+would be chosen by the author as a keyword for this paper.  (See
+Witten et.al. for an explanation).
+
+Kea has several options.  The most important is -N, which is 
+used to output a specific number of keyphrases.  For example, suppose 
+you have a directory called public_html that contains a bunch of html 
+files, and you want to extract 15 phrases from each.  Use the command:
+    Kea -N 15 public_html/*.html 
+
+Kea works with three types of input file based on extensions.
+    Text files have the extension .txt or .text
+    HTML files have the extension .html or .htm
+    CSTR files have the extension .cstr
+CSTR files are those from the CSTR collection of the NZDL, and you 
+will probably never see them.  If you want Kea to work with HTML or 
+CSTR files, you will need to have the lynx web browser installed 
+(we use version 2.5).
+
+ 
+***************
+4. Using models
+***************
+
+Kea extracts phrases from text files based on a "model" of
+the way authors choose keyphrases. The model is based on a set of
+"training documents" that have author-assigned keyphrases.
+
+The default model for Kea is the "aliweb" model, which is based on
+90 web pages from the aliweb web site.  If you use a different model
+to extract phrases from a document, it might choose different pages.
+See Witten et al. for details.
+
+You can download other models from the Kea download page, or you can 
+make our own.  For example, you can download the CSTR model.  This 
+model performs very well on Computer Science Technical Reports, but 
+less well on other collections.  It consists of four files:
+    cstr.stopwords  A list of stopwords used in text processing.
+    cstr.df         The document-frequencies of some phrases in the CSTR.
+    cstr.model      The Naive-Bayes model used in classification.
+    cstr.kf         The keyphrase-frequencies of some phrases in the CSTR.
+(Note: the CSTR model consists of all these files, not just cstr.model)
+
+If you want to use the CSTR model to extract 10 keyphrases from a file
+called myCSdocument.text, use the command:
+    Kea -N 10 -C cstr myCSdocument.text
+
+ 
+****************
+5. Making models
+****************
+
+This section explains how to create a model that you can later use 
+to extract keyphrases.  You might want to do this for a specialised 
+collection, like we did with the CSTR.
+
+To build a model, you will need some training data. Read Witten et al.
+(1999) to get an idea of the amout of training data you will need.
+(We recommend about 50 documents, but fewer will work if you don't 
+have that many.)
+
+Your training data should be placed in a single directory.
+The training data consists of a set of text files (called *.txt) 
+and author keyword files (called *.key).  For every .txt there 
+should be a .key file.  For example if one of your text files is 
+Witten99.txt, there should be a corresponding keyword file called 
+Witten99.key.  The .txt file should contain the document in plain 
+text form.  The .key file should be a text file containing each 
+of the author-assigned keywords for that file, one per line.
+
+We have put a couple of training datasets that we have used
+on the Kea downloads web page, if you want an example.
+
+Let's assume your training data is in a directory called Green.
+We're going to use your traing data to build a model called green;
+this model will consist of four files: 
+  green.stopwords, green.df, green.model, green.kf.
+
+First, create a "stopwords" file for your collection.  The 
+stopwords are a list of words that never occur at the start 
+or end of a keyphrase.  Read Witten et al. for more detail.
+They are placed in a text file, one per line, in lowercase.
+Kea comes with a stopwords file called aliweb.stopwords.
+We will it in our model:
+    cp aliweb.stopwords green.stopwords
+You can add new stopwords for specialised collections if you
+need to (see cstr.stopwords for an example).
+
+We will now create a model file (green.model) and a document
+frequency file (green.df).  
+
+You will need to convert all the text files to "clauses" files 
+with the command:
+    prepare-clauses-all-txt-files.pl Green
+This will create a clauses gile for every text file: for example, 
+if you have a Witten99.txt file, Witten99.clauses will be created.
+
+Next, you need to create an "arff" file (green.arff) and, as a
+side effect, the document frequency file (green.df).  
+The arff file isn't part of the model; it is the input file 
+needed by the machine learning scheme to create the Naive-Bayes 
+model.  Use the command:
+    k4.pl -f green.df -S green.stopwords Green green.arff
+This command (called k4.pl for historical reasons) uses the 
+training files in the directory Green (specifically, *.clauses 
+and *.key) to create green.arff. 
+It uses green.stopwords for its stopword file, and green.df as its
+document-frequency file.  Since green.df doesn't exist when you
+start, it will create green.df for you as it works. (If you ever 
+repeat this command, you should delete green.df first.)
+
+Now you need to create a Naive-Bayes model (green.model) from 
+the arff file you just built (green.arff).
+You'll need a bit of java knowledge here.  Make sure "./jaws.jar"
+is on your java classpath, and type:
+    java KEP -t green.arff -m green.model
+This will use green.arff as training data to create the 
+Naive-Bayes model, which is saved in green.model.
+
+The final part of the model is *optional* - the keyphrase
+frequency file, called green.kf.  It lists all the author 
+keyphrases in the training data, with the number of 
+times each occurs as a keyphrase.  It is optional, 
+but it does improve performance on *specialised* collections, 
+so if you're extracting keyphrases for a specialised 
+collection for a "real" purpose, then you should use one if
+you can. See Frank et.al. for more details.
+Each line of the file should have a stemmed phrase, followed
+by a tab, folowed by the number of times the phrase is a 
+keyphrase - see cstr.kf or aliweb.kf for an example.
+You can make a file like this with a command like
+    cat Green/*.key | stemmer | count-lines.pl > green.kf
+To do this you will need the stemmer and count-lines.pl
+script provided with Kea.
+
+The model is now complete. 
+
+To use it, put the green.df, green.model, green.stopwords,and
+(if you have one) green.kf in the Kea directory.  You can extract
+keyphrases like this:
+    Kea -N 10 -C green myfile.txt
+
+
+****************
+6. The Kea files
+****************
+
+Here's a description of what the various Kea program files do.
+
+README:      This file. 
+
+Kea:         Extracts keyphrase from text based on a model
+
+*.model:     Naive-Bayes model object stored as a file
+*.kf:        Keyphrase-frequency file
+*.df:        Document-frequency file (aka a global-frequency file)
+*.stopwords: Stopwords file
+
+stemmer:     Program for stemming words with the Iterated Lovins stemmer
+Iterated-Lovins-stemmer:
+             Directory conating code for stemmer.  Some of the files are
+             copyright 1994 Linh Huynh, Gnu Public License.  The others
+             are simply wrappers I have written myself.
+
+KEP.java:    Java code for creating & using a Naive-Bayes model
+KEP.class:   Compiled version of KEP.java
+jaws.jar:    Java archive of the WEKA java machine learnig code.
+             Copyright Eibe Frank & Len Trigg, Gnu Public License.
+
+kea-tidy-key-file.pl:
+             Convert a .key or .kea file into a "clean" format.             
+kea-choose-best-phrase.pl:
+             Find the "best" unstemmed version of a keyphrase
+             that appears in a file in many forms.
+prepare-clauses.pl:
+             Perl script that converts a text file to a clauses file.
+prepare-clauses-all-txt-files.pl:
+             Applies prepare-clauses.pl to an entire directory.
+cstr-to-text.pl:
+             Converts cstr files to text; requires lynx.
+count-lines.pl:
+             Counts the lines in a file.
+
+
+***********************
+7. Advanced Kea options
+***********************
+
+Here is a complete list of the options to Kea.  The last
+four (-F, -K, -M, and -S) have been superceded by the -C option,
+but still work; its possible they are good for something.
+
+ -d     Debug mode.  Working files are left in /tmp
+ -t     Ouput TF.IDF for each phrase.  Used by Kniles.
+ -N n   Output n keyphrases (if possible).
+ -E ext Output files have extension ".ext" (default is ".kea")
+ -C x   Use model based on corpus x.  
+        Defaults to "aliweb" web page corpus.
+
+ -F df  Use document-frequency file "df".
+        Defaults to aliweb.df where x is set by the -C argument.
+ -K kf  Use keyphrase-frequency file "mf".
+        Defaults to x.kf where x is set by the -C argument.
+ -M mf  Use model file "mf".
+        Defaults to x.model where x is set by the -C argument.
+ -S sf  Use stopword file "mf".
+        Defaults to x.stopwords where x is set by the -C argument.
+
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.df
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.df	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.df	(revision 21083)
@@ -0,0 +1,30564 @@
+90
+say th bear 1
+pen th rat 1
+willeth me 1
+nec li 1
+cook to cheesecak 1
+straight th point 1
+inst acc count 1
+tool cal 1
+ulp 1
+brew homep rec.food.cook 1
+interpreter 2
+biolog pharmac biotech 1
+cor schedl 1
+pag o labor 1
+fil suit 1
+melbourn 2
+quentin tarantin 1
+rel wid 1
+keep or break 1
+background color match 1
+antig edad cl 1
+relig typ 1
+unb inform 1
+tower 1
+shar of problem 1
+papyrus 1
+structur id 1
+won th ital 1
+mak you pin 1
+hm showheader 1
+chang sk 1
+hm incr boolean 1
+break of thrust 1
+ca stud 1
+unb 1
+unc 2
+fl blow 1
+und 2
+institut for protein 1
+guid to educ 1
+californ stud 1
+univer of jerusalem 1
+typ of surfac 1
+web digit tradit 1
+group departm 1
+modern se 1
+tam your tongu 1
+telescop 1
+mat sandstr 1
+cun man 1
+complec o labor 1
+frog prick 1
+centur liturg 1
+facsimil 2
+organ and biochemister 1
+gam or siml 1
+man abl 1
+rec init 1
+doc.ic.ac.uk 1
+east west 1
+flec search 1
+snazz 1
+sourc cod navig 1
+model using 1
+hyp lit 1
+dat.html 1
+using your cur 1
+turner 2
+mi commun 1
+adv in archaeolog 1
+nec pa 1
+etc al 1
+upd 19
+tim plac 1
+famil sp 1
+gob traver 1
+ajac 1
+limerick 2
+bc by moham 1
+nec pl 1
+train collect computer 1
+jordan pag 1
+cap pr 1
+priest 1
+hypermail produc 1
+trademark 1
+parl th emerg 1
+german sw 1
+do your work 1
+inclus th nam 1
+publ act 1
+ulan 1
+shorter in fight 1
+denver o http 1
+archeolog 1
+dhahr slam 1
+en by art 1
+endanger th bil 1
+saith 1
+man wh claim 1
+ext surv 1
+reader can grasp 1
+instead of month 1
+ind widespread 1
+inform is found 1
+restaur that brew 1
+cirqu romain 1
+fight is ti 1
+microbiolog pyr 1
+non quot articl 1
+url 9
+macrolog 1
+half a foot 1
+using snapshot 1
+teach young peopl 1
+ashmolean 1
+30sep94 1
+redef docum typ 1
+behold th blow 1
+program north 1
+sipb mi 1
+beaut song 1
+exp at unc 1
+find bus 1
+cind renfrow book 1
+us hi skil 1
+wh el 1
+ush 1
+hunter 1
+zin hav climb 1
+usr 2
+usu 2
+gcg sequ an 1
+3b tip 1
+run on sun 1
+domest 2
+strap freestyl design 1
+hm overwrit 1
+bryd is fl 1
+rid it straight 1
+writer and reader 1
+mad publ 1
+cal mbox 1
+using th keyword 1
+don straus subtract 1
+fair regl 1
+du proof thereof 1
+got to tak 1
+german ms160 1
+loc textil 1
+notif of issu 1
+educ program 1
+describ 9
+gron departm 1
+mac doc 1
+univer of leed 2
+unit st aa 1
+subaqu str 1
+ceram and metal 1
+an cultur 1
+ver scal 1
+conserv of ecosystem 1
+put a highlight 1
+rober lew campbel 1
+transducer95 eur ix 1
+architect 1
+wear sword 1
+cooper from mip 1
+fil in mi 1
+unit st ba 1
+der universit basel 1
+offer a step 1
+search without register 1
+cup arseweb 1
+know of relev 1
+western mesar plain 1
+embl dat 1
+pueschel 1
+gdb gdb 1
+snowboard park 1
+snowboard part 1
+inclus prelimin 1
+as in writ 1
+ller institut 1
+sc psycholog hc 1
+badam and mcnult 1
+ver 3.3a 1
+cirqu 1
+cr of tru 1
+walk sh sithd 1
+stuff eg 1
+freer 1
+op th elbow 1
+runnel and john 1
+start by draw 1
+exhaust search 1
+val other abstract 1
+beyng doen 1
+coach 3
+peopl 19
+aid molecl design 1
+ind other internet 1
+issu affect 1
+archiv ar lik 1
+common prov 1
+wherein con 1
+order or custom 1
+disappear 1
+chang of lying 1
+upstream scruznet.com 1
+fight in battl 1
+level block 1
+hist inform 1
+anc relig 1
+htlm abstract 1
+chiefest 1
+giv a prefer 1
+resort oper agr 1
+emerg funct 1
+print drug refer 1
+datab sw 3dim 1
+fat yourself 1
+univer of evansvil 1
+forsak to lou 1
+pennsylvan bat colleg 1
+fight natur 1
+simpl step 1
+risk as er 1
+council of turk 1
+institut of phy 1
+sw jok 1
+grav and surmount 1
+tread of ground 1
+automat appear 1
+forbid 1
+cor by jan 1
+institut for transport 1
+til grav 1
+lab tom maniat 1
+mailer 2
+bi orient 1
+nac autonom de 1
+cast gal 1
+dat collect 2
+hand and bod 1
+facilit individu creat 1
+ward or stoc 1
+read th annu 1
+therefor of nec 1
+art of def 1
+ioy to se 1
+wyl ban 1
+molecl biolog scop 1
+collect by xav 1
+commerc and person 1
+mcnult hear 1
+calendar misc leagu 1
+christopherson 1
+wh th principl 1
+server th bi 1
+big ben 1
+kenneth 1
+strength 1
+wh pa 1
+major occup 1
+seen swift 1
+calcl hum molg 1
+variabl random tun 1
+us not 1
+enthr and captiv 1
+exchang of inform 1
+seen them fly 1
+heard 2
+prev html 1
+greg mor 1
+heart 4
+hypermail overwrit ec 1
+domain shift 1
+sit with inform 1
+boolean number def 1
+began to crow 1
+world med 1
+pilot av 1
+gondol 1
+requir th strength 1
+coff to disc 1
+encourag craft 1
+wh qu 1
+redef 1
+sign an softwar 1
+expect impact 1
+magaz homep 1
+stud o molecl 1
+pleasanter 1
+old lust gal 1
+crop research roy 1
+key sequ 1
+univ.of west 1
+produc developm 1
+heath 3
+eight 4
+conver a quark 1
+pr grappl fast 1
+motor plan 1
+webster qu 1
+passyng fin 1
+resourc for latin 1
+report from bel 1
+ctil confer 1
+timpson 1
+acronym key aal 1
+secon structur group 1
+model rel 1
+stop sol 1
+pilgrim 1
+vac 2
+ad th border 1
+departm of chem 1
+biolog biom 1
+val 8
+van 2
+system mail 1
+var 18
+vat 1
+engl ridg 1
+think th reader 1
+lincoln 1
+nord tr9 1
+item of interest 1
+vnder th rouf 1
+civil not emerg 1
+find cdr 1
+pictur using 1
+habitat 1
+listserv.ei.cs.vt.edu 1
+snowboard at bright 1
+electron whiteboard 1
+aberystwyth 1
+koflach i tr 1
+vertu deut 1
+www rel 1
+me you rec 1
+hand is mad 1
+quot articl lin 1
+optim variabl random 1
+expan th pot 1
+load html helper 1
+death is bewail 1
+visit inform 1
+inform cal 1
+vcc 1
+se th ftp 1
+orang tart misc 1
+lightspac 1
+why apol 1
+speed th entr 1
+ultr 2
+bit of hack 1
+novel numer method 1
+inclus loc 1
+ericc ind.edu 1
+vcu 1
+collect of refer 1
+vcv 1
+del rey book 1
+inclus log 1
+manu mean 1
+htlm 1
+lin career serv 1
+stanc angl 1
+show with imag 1
+inclus lot 1
+user funct 1
+fourth centur liturg 1
+lost in natur 1
+frequ 11
+se by top 1
+plan of leptiminus 1
+nrsub 1
+driv mater 1
+pattern in pract 1
+ctil resourc 1
+html 20
+ground of fight 1
+mr mobil platform 1
+mak men fear 1
+anc teach 1
+universit libr de 1
+record stud 1
+patrol magaz 1
+veg 2
+oregon.uoregon.edu 1
+robison krobison 2
+cancel 1
+skil man stand 1
+fat creep 1
+reg archaeolog project 2
+me th check 1
+cancer 2
+oxford univer pr 1
+ver 24
+vew 1
+musculoskel 1
+fresh 2
+weather inform 1
+ind gif87a fil 1
+maniat lab markus 1
+electromagnet fdtd siml 1
+docum count 1
+prog di valorizzaz 1
+molecl structur view 1
+behold hi teach 1
+suspect 2
+carrefour 1
+dem biter 1
+multim inform sourc 1
+thyng stood 1
+journ toc 1
+defender 1
+etern 1
+www chem fin 1
+biolog bioinform 1
+unit st sk 1
+fe of qu 1
+month bibliograph 1
+interdepartm biolog 1
+fund aus dem 1
+human induc 1
+interconnect 1
+latter 2
+involut geolog 1
+biolog biocomput 1
+answer 11
+kar stromberg 1
+promot lesson 1
+ii period 1
+forc equ 1
+search result 1
+technolog in taiwan 1
+pract between popl 1
+clean cut asunder 1
+other 10
+pl contact chr 1
+le vs talk 1
+hostnam www.wjrh.ec.uv.ca 1
+research centr 2
+calibr 1
+univer of delawar 1
+inform categor 2
+model 21
+therap at leed 1
+offer simpl 1
+moder 2
+fossil dun 1
+vect spac 1
+coast 3
+archaeolog art 1
+mak sen 1
+vic 2
+vid 6
+nmr spectroscop wak 1
+vik 1
+vil 1
+hauyng 1
+vin 5
+phy host 1
+archaeolog institut 2
+compreh review 1
+toung can tel 1
+herbar biodiver museum 1
+schoolmaster ar imperfect 1
+appl tart 1
+help peopl 1
+contain system univer 1
+ver screen imag 1
+keep th tongu 1
+educ comput academ 1
+cultur nec 1
+simp chang 1
+elev model 1
+cambridg biolab 1
+year ahead 1
+thy lou 1
+gat he took 1
+ac not me 1
+leptiminus th econom 1
+720s 1
+geoarchaeolog fieldwork palynolog 1
+green david tyf 1
+iquot 1
+path optim biolog 1
+centr for genet 1
+libr walter 1
+nsabp clin 1
+miscellan frequ 1
+http 9
+taught hi wif 1
+steen rasmus karl 1
+act susp show 1
+arch team 1
+excit discov 1
+molecl recognit sect 1
+dancer prostitut 1
+bask should hau 1
+journ 12
+docum you want 1
+deutschland 1
+modif 14
+serv to def 1
+grav marker 1
+cech 1
+educ and institut 1
+ballad and broadsid 1
+disc in gondol 1
+kabat datab 1
+datab protein identif 1
+select www biolog 1
+dhistoir 1
+ext cultur deposit 1
+recognit research 1
+brownjohn ar 1
+hand on curricl 1
+sit of leptiminus 1
+apparatus 1
+spec in particl 1
+grain of ry 1
+tim of fal 1
+univer of melbourn 2
+leptiminus wer loc 1
+popl and genet 1
+liam 2
+number of weak 1
+forbid th blow 1
+london stud 1
+engineer computer aid 1
+biotech patent 1
+rapid growth 1
+perform problem 1
+rapid 4
+reduc 2
+genom map 1
+snsplac 1
+me wil appear 1
+vnt 1
+setenv hm mbox 1
+think or find 1
+good import 1
+brief com 1
+voc 1
+eb yah 1
+libr 22
+queen hith 1
+vol 4
+www.tel.ucl.ac.be 1
+vom 1
+von 2
+tim talk 1
+csiswebedit 1
+batch search 1
+biolog protocol natur 1
+netbiochem 1
+level to outl 1
+ui log 1
+work on minoan 1
+bachman 1
+transpar background 1
+mad grad 1
+field request if.ui.no 1
+handl form 1
+univer of limerick 1
+compan 9
+entitl model 1
+system sampl 1
+compar 9
+compat 3
+resolut adopt 1
+help resort 1
+kngwar 1
+post without perm 1
+england yield 1
+refer mail list 1
+fr sampl 1
+word wrap 1
+found th valug 1
+distribut sem repr 1
+wobbl london 1
+interact qu 1
+soc for cr 1
+thousand ol 1
+abl to rapid 1
+support car top 1
+consult serv 1
+favor spec agricultur 1
+nec mak 1
+project schol 1
+conv and acc 1
+genom dat ba 1
+spon organ 1
+indogermanisch text und 1
+loc fil 2
+exposit and confer 1
+bibliograph on biolog 1
+us th hostnam 1
+default bind built 1
+shirt of mail 1
+aal execut board 1
+palest 1
+origin pr 1
+hit th fac 1
+vsd 1
+non redund 1
+lift 2
+queensland 1
+produc evid 1
+var of entertainm 1
+attempt to synth 1
+refin surfac collect 1
+prohibit 1
+metal produc identif 1
+protopalat 1
+shtml 1
+joan 1
+telephon contact 1
+fant resourc 1
+event appl 1
+theor and molecl 1
+facult and stud 1
+sc and pol 1
+interdisciplin symbol 1
+break hi neck 1
+replac 4
+for in human 1
+tim to strik 1
+medicin high educ 1
+standard calibr 1
+wherein most common 1
+cr doth scool 1
+var clever horizont 1
+roman republ 1
+articl header 1
+do program 1
+rey book sit 1
+cal listserv 1
+subsurfac 1
+collabor 9
+caulyng hym kanu 1
+dr wa gon 1
+thrdlevel number 1
+becom big 1
+western reserv univer 1
+gather 3
+master vinc 1
+centr work 1
+interest sc web 1
+exampl read 1
+imag www 1
+request that affect 1
+striker 1
+understand object track 1
+celp 1
+grandpar look 1
+celt 1
+whit amazd 1
+human project 1
+et recherch en 1
+yard 1
+spot any error 1
+report rel cour 1
+cal bent 1
+descript museum 1
+peter kollman group 1
+sandstr 1
+art hist 1
+se count 1
+mak a good 1
+printer 4
+bin acc count 1
+ar supporter www 1
+k.schneider 1
+cap of handl 1
+me to listserv 1
+reach or exceed 1
+californ ba tabl 1
+univer florid 1
+onl publ 1
+imag av enthusiast 1
+prick poniard 1
+doeth repl 1
+optim 3
+joel 1
+rap longer 1
+cent 1
+review inc 1
+journ by gopher 1
+design educ li 1
+emac fil 1
+adopt 2
+point and molecl 1
+men half drunk 1
+inf.html 2
+problem sit 1
+dark sid 1
+biomolecl research 2
+compil 7
+beaut lo gat 1
+good and fast 1
+common he li 1
+server run 2
+3rd internet 1
+workshop sum 1
+sc www server 1
+infoseek 2
+european biochem 1
+settl and land 1
+ceph 1
+limb 1
+rb url 1
+compan picn 1
+reader respect 1
+archiv o unit 1
+desir to follow 1
+molecl recognit sequ 1
+problem with snowboard 1
+mail tempor mlm 1
+wroxeter hinterland 1
+sc using computer 1
+print or plot 1
+univer ha hc 1
+writ by ka 2
+link 32
+john 12
+publ ar avail 1
+fi world 1
+pl read 1
+dark sky 1
+relev confer 1
+purch at nin 1
+fayth 1
+birmingham 1
+absolut not read 1
+wel in somersetshir 1
+cern 1
+bacter spec nomencl 1
+datab of term 1
+abund 1
+rang forth 1
+bur tuml 1
+bod wa plac 1
+californ st univer 1
+accord with art 1
+join 6
+mak hi thrust 1
+circl wind 1
+fight between val 1
+low ward 1
+outl a step 1
+molecl neurobiolog 1
+ingmar wam.umd.edu 1
+fam learn 1
+danger hi enem 1
+me serch 1
+handl 8
+var gam equ 1
+commun hom pag 1
+12pt singl spac 1
+world writ 1
+snowboard educ 1
+intellig tut 1
+hurt in rap 1
+st plac 1
+digitrad 1
+event appl tart 1
+feast cost 1
+excav at sepphor 1
+network analyzer 1
+therein lay 1
+walk robot 1
+bin ar avail 1
+forc of hand 1
+eight hundr squar 1
+faq other gopher 1
+uk alt 1
+photosynth center 1
+inclus detail 1
+assoc of canad 1
+refrain 1
+compon 7
+purp to giv 1
+think skil 1
+1d 1
+slick 1
+avail th comp.infosystem.announc 1
+biochemister metabol medicin 1
+1m 1
+appl and quantit 1
+disgrac th dead 1
+biolog inform 1
+swym in surg 1
+hugh 2
+offer a sund 1
+equipm and outdoor 1
+rel succ 1
+sakar 1
+prodom protein 1
+com enzym 1
+biolog comput 1
+2d 2
+lisp 1
+signif foc 1
+confer etc 1
+molecl biotechnolog 1
+ftp archiv biocatalog 1
+list 41
+internet rel standard 1
+going internet educ 1
+shop and mus 1
+squint 1
+somwhat ner 1
+pr you good 1
+adv research 1
+lith 1
+departm gopher 1
+mak peopl star 1
+3b 1
+3c 1
+commun for 1
+3d 4
+archieplec in vien 1
+dealer and herit 1
+berkel labor 1
+writ con 1
+stat alloc 1
+law lib john 1
+enterpr integr technolog 1
+told by men 1
+group i intron 1
+sherrat secon 1
+liszt with educ 1
+gener ten 1
+danger us 1
+wab 1
+wac 2
+wad 2
+sequeir 1
+wag 1
+robot period inspect 1
+trac in plac 1
+univer new tool 1
+smith a biolog 1
+wak 2
+wal 5
+wan 1
+nat institut 2
+viewer se 1
+war 7
+group poster 1
+grasp reg magaz 1
+entr by nam 1
+hand li 1
+non commerc 1
+way 7
+herit bourbon 1
+mailbox format 1
+prom part 1
+cus cus.html 1
+hpc articl 1
+giv excav 1
+sixth intern confer 1
+molecl weight aacompid 1
+ba polit 1
+bohem 2
+radiolog relev confer 1
+day no grip 1
+5x 1
+slaughter 1
+web chart 1
+explor anc world 1
+molecl biolog transterm 1
+sharewar 3
+deliv of cour 1
+burger 1
+lov our serv 1
+al fil 1
+southwest me 1
+selkov biochem 1
+inform 62
+constitut 4
+enzym datab 2
+archieplec at nexor 1
+multim datab 1
+7a 1
+hypertext and multim 1
+comput 11
+7b 1
+prick 1
+7c 1
+therfor lyk lou 1
+7d 1
+7e 1
+light year ahead 1
+7f 1
+transg targ 1
+length of weapon 1
+fixtur 2
+contr opinion 1
+aplac tran an 1
+prap ar com 1
+amphor 2
+barbar 3
+research roy institut 1
+singl sword 1
+humb 1
+adm that incr 1
+lead centr 1
+chem sc 1
+josh 1
+further isol 1
+gatew 9
+curl opac 1
+server san 1
+parallel computer 1
+great forc 1
+rulership 1
+web 32
+diverg me settl 1
+wed 1
+biolog and bioph 1
+sidn georg 1
+wel 2
+psycholog departm gopher 1
+continu mot 1
+continu mov 1
+hung 2
+an optim method 1
+timesav compar 1
+disclaimer 4
+hunt 2
+linkstar flec 1
+teach of weapon 1
+frequ dep character 1
+rel o univer 1
+limerick cit 1
+empt fil 1
+mytholog in western 1
+schol be mad 1
+doubt to do 1
+www sit 3
+request is maintain 1
+ten year 1
+men that handl 1
+download 9
+rewrit th entir 1
+alt.drug.caffein 1
+universidad 4
+bryd wyl thank 1
+project on emot 1
+head on steel 1
+contact webmaster nexor.co.uk 2
+near an hour 1
+abil to distribut 1
+search rel datab 1
+neolith period 1
+award win beer 1
+test chr 1
+kil their enem 1
+resourc biotech 1
+attent by prof 1
+bus and classif 1
+doeth hy hym 1
+server inclus 1
+foreign flight test 1
+emac html 1
+signoff 1
+rap point 1
+level of mean 1
+dhistoir de 1
+engineer aler 1
+bioinformat o biocceler 1
+system consol 1
+strateg in pbem 1
+publ bibliograph 1
+why 7
+seminar ser 1
+subsect 2
+crimin act 1
+autom download 1
+subscrib by sen 1
+brew succ 1
+designer and writer 1
+arch.html 1
+wid 16
+wif 2
+lead ext 1
+list of paper 1
+wil 3
+rap from cr 1
+win 4
+wip 1
+vermont o colleg 1
+keith robison 2
+program for circuit 1
+wir 3
+wit 2
+wiu 1
+cs.vt.edu 2
+hurl 1
+bod straight 1
+bibliograph biotechnolog 1
+chang sid 1
+hurt 3
+year old man 1
+susp show 1
+mechan 7
+de ren 1
+year old mar 1
+creat educ 1
+upd on jun 1
+floor of roman 1
+barbecu 1
+joyc 2
+pharm and pharmaceut 1
+univer of sheffield 1
+priv part 1
+degr program 1
+univer of pennsylvan 1
+older frequ request 1
+adminstr 1
+top ar 1
+cr mad 1
+lind.marsh newcastl.ac.uk 1
+green design team 1
+dict mov datab 1
+paper describ 1
+rel standard 1
+wkt 1
+surviv in anc 1
+deeper cor 1
+archieplexform at na 1
+simp chang appropr 1
+put som cod 1
+top bi 1
+symp genom 1
+mod load 1
+leg of arthur 1
+industr ha mov 1
+default label 1
+work pr 1
+mail me ap 1
+def saf 1
+anchor ring 1
+learn and instruc 1
+sit but look 1
+rel to migr 1
+server sid 1
+geometer 5
+coc col cup 1
+reindeer sant claus 1
+anthon nichol mar 1
+cemeter al dat 1
+john bower 1
+confer fal 1
+sequ an softwar 1
+matter what opt 1
+internet draft ind 1
+molecl biolog calvin 1
+refrayn 1
+labor al eng 1
+seem strang 1
+amongst 1
+intellig tut system 1
+explicit writ perm 1
+mail arch 2
+def did pr 1
+tim by chanc 1
+genom and bioinformat 1
+meter perman grid 1
+roman archaeolog suppl 1
+hypermail read 1
+greec and rom 1
+featur 17
+pommel 1
+proper topograph 1
+bipart nuclear 1
+minoan rulership power 1
+cod you want 1
+driv to run 1
+bereft of bl 1
+princ 4
+palac at caser 1
+thousand ol tr 1
+cr med 1
+fo.com mon 1
+lost tim 1
+link and inform 1
+comp of internet 1
+print 9
+grain to need 1
+wh construc 1
+wom 5
+pierc 1
+won 2
+altru motiv 1
+earliest chief 1
+wor 4
+www arch search 1
+hm filemod oct 1
+catalog 5
+obtain by writ 1
+huxl 1
+biotech register 1
+run sun 4.x 1
+sourc of unb 1
+soon be amen 1
+know th caus 1
+ct subject 1
+year ag snowboard 1
+therein perform 1
+half sword 1
+forc th knight 1
+prior 1
+wherein tru con 1
+gradu 9
+leed metropolitan 1
+alam 1
+alan 2
+millipor o millipor 1
+pathw datab 1
+graec 1
+retain 2
+tim mak 1
+artifact distribut 1
+mirror sit 1
+wid var 1
+european bioph 1
+sant seek correspon 1
+platform navig 1
+flight train 1
+text ind wh 1
+connect to search 1
+maintain by thom 1
+suff to confirm 1
+struck or thrust 1
+presid 3
+frind to me 1
+biomolecl biochem datab 1
+staff man tak 1
+simp put 1
+return to cl 2
+slider head 1
+model of deaf 1
+german text 1
+shuld 1
+train on pat 1
+fr and comfort 1
+length against imperfect 1
+leptiminus 2
+robot with forc 1
+oper agr 1
+leav th consol 1
+modern cor war 1
+further inland 1
+exp ftp 1
+uncr 1
+mark commun 1
+fin ital skil 1
+libr millesjg sluvc.slu.edu 1
+whit 9
+text pag 1
+award win 1
+using digit tradit 1
+wound mad 1
+monospac 1
+mitchel steen rasmus 1
+mail me id 1
+brewh and eat 1
+comput an 1
+lat2html 1
+bast he doeth 1
+institut of genet 1
+def fear 1
+odonnel 1
+tech onl edit 1
+undl 1
+alec 1
+banner 1
+major web 1
+prev step 1
+specif rel 1
+alek 1
+sport desk 1
+univer in austr 1
+pac of nec 1
+mail util 1
+aler 1
+edit of paradox 1
+blam th author 1
+fight with 1
+grail 1
+grain 2
+prem beer 1
+articl fil 1
+freebsd netbsd 1
+fil is simpl 1
+aut redirect 1
+snowboarder koflach 1
+man for serv 1
+alfr 1
+fight four off 1
+www refernc 1
+known web 1
+top lo 1
+matematisk 1
+held on thursd 1
+edit is organ 1
+freebsd 1
+breaker 1
+pat is perform 1
+thirt eight hundr 1
+fl siz 1
+subsequ 1
+stab 1
+stad 1
+stag 2
+stal 1
+rap ver straight 1
+nlp produc 1
+rig float 1
+ceph genethon 1
+norm held 1
+star 7
+compan biolog 1
+imag from rec.skiing.snowboard 1
+stat 14
+stav 1
+jacob 1
+herein thus 1
+melbourn northeastern 1
+us soft 1
+www 21
+model in aplac 1
+continu strik 1
+sen email 1
+washingt affair 1
+par inclus 1
+nat labor 2
+spain za arch 1
+determin by examin 1
+natur basin 1
+hug and nebl 1
+archieplexform 1
+5th c ad 1
+alif 1
+soc st model 1
+prem j.r.r 1
+institut system 1
+aliu 1
+addr to link 1
+untyl a fi 1
+command ge listdb 1
+bolt on serv 1
+computer and snowboard 1
+unif 1
+developm in sardin 1
+metar list 1
+shurt 1
+whom 1
+micr organ risk 1
+wyl 1
+sequ simil 1
+unit 9
+univ 3
+older ver 1
+ant pap 1
+sift project aim 1
+tim thereb 1
+scient 2
+contain mpeg mov 1
+coh group 1
+mother watkin al 1
+sant barbar departm 1
+senior 1
+fair compreh sem 1
+prec engineer 1
+standard featur 1
+big commerc 1
+hilt instead 1
+grant 2
+sev wonder 1
+email to elizabeth 1
+doeth den 1
+genet inc 1
+protein profil 1
+reg restrict 1
+hypertext webster qu 1
+econom and presum 1
+hannegan and chr 1
+defin th opt 1
+assoc bind 1
+refin surfac 1
+stem 1
+step 6
+wiser bargain 1
+blow thrust 1
+ster 3
+number se 1
+stev 4
+third intern confer 1
+fickl 1
+baylor 2
+death or hurt 1
+veracruz univer 1
+cs and rel 1
+god mad 1
+nih grant form 1
+find an orthodont 1
+graph 10
+univer centr 1
+aldridg 1
+group th mathemat 1
+knowledg 3
+evalu 1
+continu th work 1
+html primer 1
+fl sor 1
+assemb fin mot 1
+mail request 1
+mach vi assoc 1
+good ftp arch 1
+genr of specl 1
+punctu by exchang 1
+copyright 17
+tu nov 1
+faithfl 1
+pl by email 1
+kernel 1
+begot of bellon 1
+subm per month 1
+fight answer var 1
+faster for 1
+fat did ly 1
+biotech suppl 1
+ahead 2
+alignm o selkov 1
+presum 1
+cad cam ca 1
+hilt or gauntl 1
+month wh act 1
+virgin tech inform 1
+cont without wor 1
+autom knowledg 1
+medicin pharmacolog molecl 1
+prev unus 1
+eberhard zangger 1
+spac text 1
+dat and signif 1
+netfind gopher 1
+detail etc 1
+woodkniv 1
+crystallograph softwar 1
+script 4
+oct stream mpg 1
+yah form 1
+support perform 1
+electr electron 1
+stil 1
+grasp 2
+ba arch serv 1
+alph 1
+salad 1
+look to start 1
+edinburgh ra shamr 1
+browser to http 1
+dec between revolut 1
+mat meselson 1
+calibr and de 1
+mater to as 1
+refer 20
+human influ 1
+town of lo 1
+molecl biolog serv 2
+featur of minoan 1
+surplus 1
+tip for parent 1
+src htmlguru 1
+gasp ar goal 1
+day wer past 1
+emot in speech 1
+univer loughborough leicestershir 1
+reproduc 6
+spool mail fo 1
+overwrit any prev 1
+saving 1
+for to hear 2
+cd nettrain 1
+book list pcr 1
+pictur arch 1
+ground structur 1
+pag acc 1
+new sum 1
+con of plen 1
+governm rel issu 1
+or soc 1
+ljub 1
+span of near 1
+en th length 1
+univer of west 2
+wad arab 1
+light lou caus 1
+electrotherm circuit siml 1
+web view 1
+univer stanford 1
+luc claver 1
+front in lat 1
+mad abl 1
+hol mat 1
+vpon your fal 1
+mother daughter apartm 1
+dark sky digit 1
+xav 1
+creat on september 1
+benefit of natur 1
+rec.food.drink.coff alt.drug.caffein 1
+structur th pdb 1
+spar tim 1
+old.gif 1
+good wif doeth 1
+whyl 1
+www.transarc.com af 1
+singl good 2
+mark it color 1
+sword to cr 1
+unst 1
+defin soc 1
+diocl 1
+sundr 2
+condit and loop 1
+de mec intern 1
+xerox pal alt 1
+refin 1
+roman institut 1
+rob peter 1
+cus is http 1
+school to train 1
+seqanalref sequ an 1
+alt vist turn 1
+multim datab mmd 1
+univer of toront 1
+stoc 1
+surplus and self 1
+odysseus 1
+stok 1
+stol 1
+lin serv 1
+harvard chem 1
+stop 2
+reag and suppl 1
+eic of techniqu 1
+tom oven 1
+pag harvard biolab 1
+unus 1
+ar using microsoft 1
+september 3rd 1
+upland o balt 1
+inform transpar background 1
+man of judg 1
+ctil lbor.ac.uk 1
+min.cs.adf.oz.au 1
+using tun 1
+december 28th 1
+bigun avbp 1
+gl8f virgin.edu 1
+egypt art 1
+tradit translat 1
+titl cd rom 1
+developm and implem 1
+mush flec 1
+virgin biotechnolog research 1
+immort soul 1
+evolut 6
+word paynt 1
+fundam research 1
+mad he sit 1
+hereford 1
+opt for subm 1
+fear to fight 1
+addict unt novelt 1
+st rutger univer 1
+stanford univer 3
+william jam moyc 1
+macelhon 1
+blow follow 1
+resort he over 1
+enem rap 1
+fingerprint 1
+prokaryot o bacillus 1
+elizabeth recip 1
+biom www 1
+cun gentlem 1
+cl text 1
+gender 1
+avail www browser 1
+going to tak 1
+mach at kink 1
+siluer st 1
+coupon good 1
+specl fict 1
+neal 2
+near 2
+nerd world med 1
+bronz ag archaeolog 1
+neat 3
+an th method 1
+onl o cel 1
+proport spac font 1
+direct nam 1
+marrow 2
+center o macromolecl 1
+popl of snowboard 1
+nebl 1
+magaz boehringer mannheim 1
+mississip 1
+corn beef 1
+2dpag 2d protein 1
+www browser 1
+ba acc 1
+readiest 1
+modern sew 1
+technolog dissem init 1
+stud 21
+demonstr should sen 1
+neck 2
+elettronich per lo 1
+resort hav claim 1
+genet medicin univer 1
+tr to gain 1
+support transpar 1
+oscar michael moor 1
+abstract from um 1
+tak such adv 1
+slowest 2
+form support 1
+codon context 1
+sc.archaeolog 1
+mynd to sl 1
+classif of protein 1
+method of count 1
+cant concer 1
+departm of educ 2
+cel biolog suppl 1
+therefor longer 1
+sponsorship 1
+telemarker 1
+using gif89a imag 1
+exact cour 1
+boing 1
+biosc bionet 3
+ad a link 1
+frog prick poniard 1
+head by team 1
+a4 1
+modest network 1
+sword longer 1
+discomfort 1
+run your server 1
+mer dim on 1
+julius 1
+need 1
+support client 1
+crystallograph computer 1
+hop to accuml 1
+head for greek 1
+pag for mpeg 1
+spher tip 1
+fl stout 1
+perch 1
+prev neglect ar 1
+insuff food 1
+brief interest descript 1
+mofil 3
+mic farm becam 1
+mercer shop 1
+cl journ 1
+stood a great 1
+fifth caus 1
+rockefeller on febru 1
+spac design 1
+rocc hi boy 1
+aa 2
+ab 1
+ac 6
+ad 20
+onl imag 1
+af 1
+ag 11
+ai 3
+aj 1
+ak 1
+la cultur 1
+al 6
+am 4
+melmac 1
+an 22
+386bsd is deriv 1
+interdisciplin crystallograph 1
+dn sequ 2
+ap 7
+ar 22
+as 13
+hm var string 1
+brochur 1
+at 5
+pr iest 1
+av 7
+aw 1
+men of honor 1
+confer do hast 1
+ba 41
+bc 2
+bil addr detail 1
+program th learn 1
+be 3
+bh 1
+gener purp circuit 1
+bi 7
+bj 1
+styl 10
+bl 3
+african red 1
+human genom 3
+institut structur 1
+bo 1
+br 5
+subject to chang 1
+d1 1
+molecl univer 1
+mad for loc 1
+styx 1
+pdb browser 2
+genealog dat 1
+by 3
+biotechnolog assoc baylor 1
+implem lagrang 1
+david and alfr 1
+continu 9
+mult color 1
+geometer inform 1
+widespread feel 1
+ca 22
+cb 1
+refus 3
+cd 4
+might an 1
+ce 2
+cf 1
+cg 2
+ch 14
+ci 1
+softwar is avail 1
+cl 16
+cm 3
+confer german homep 1
+co 7
+suff mic farm 1
+contain mpeg 1
+cr 22
+e1 1
+cs 4
+ct 8
+wh act 1
+underwater excav 1
+seigneur arch ologisch 1
+genet and bioph 1
+cu 3
+molecl neurobiolog lo 1
+amsterdam 2
+mi inform 1
+da 9
+db 1
+mac gif 1
+dc 2
+confer and prof 1
+neil 1
+dd 1
+de 7
+df 1
+new on min 1
+ocean and atmospher 1
+an tool 3
+di 9
+rid back 1
+dn 2
+do 10
+dep on exchang 1
+cour specif rel 1
+dr 8
+du 9
+xpr 1
+dv 1
+rec ran 1
+oppr run faster 1
+journ of mater 1
+dy 1
+virolog o labor 1
+competit 2
+commerc 9
+ea 10
+requir th reader 1
+eb 3
+ec 7
+ed 5
+ee 2
+input and integr 1
+eg 3
+eh 1
+demonstr th us 1
+celp sourc 1
+el 15
+em 3
+biolog search 2
+en 19
+intern default 1
+ep 2
+er 6
+es 4
+g1 1
+et 2
+eu 2
+ev 1
+liam brad 1
+interest inclus 1
+ew 1
+ey 4
+quark tag 1
+companion 3
+fa 1
+fb 1
+fencer in com 1
+ncc.com upd 1
+fe 7
+ff 1
+archieplexform at universidad 1
+virtu re brookhav 1
+submer 1
+swifter tim 1
+molecl bioph 1
+fi 3
+ba drug design 1
+fl 17
+se of macintosh 1
+fo 2
+fr 32
+gad ii 1
+univer o comput 1
+mechan engineer departm 1
+rang of format 1
+oblig mak 1
+ga 3
+server bc research 1
+ge 28
+gg 1
+displac.gl spher tip 1
+gi 3
+gl 5
+gn 1
+go 13
+moder width 1
+wiin 1
+dagger say 1
+gr 5
+i1 1
+i4 1
+sant barbar 2
+calibr of test 1
+broadcast med 1
+ha 1
+hc 3
+mak th server 1
+hd 1
+he 3
+detail and prec 1
+hi 2
+transl tool 1
+hm 1
+enh direct 1
+ho 2
+hp 1
+environm health sc 1
+hu 1
+imag wil look 1
+hy 1
+amen 2
+wid web 10
+fletestreat 1
+shuld hit 1
+amer 9
+fil download cap 1
+ib 1
+ic 2
+id 11
+thread ind fil 1
+ie 5
+ii 7
+forc both strong 1
+ser wer held 1
+il 3
+im 3
+in 1
+keyword me 1
+uncr and strik 1
+adver to hurt 1
+ip 1
+ir 2
+mlm o cancel 1
+it 5
+unqualif hostnam 1
+iv 2
+ix 1
+earl 6
+pointer to resourc 1
+program typ genet 1
+un and do 1
+jc 1
+great destruc 1
+crocodil 1
+lad neuer 1
+jf 1
+wild 2
+tyn o clin 1
+establ aal pol 1
+school leader 1
+jl 9
+search 20
+wilk 1
+jo 1
+specif 15
+tewdwr 1
+wilt 1
+specim 1
+fe in manner 1
+off in du 1
+ka 3
+east 4
+individu growth 1
+kn 4
+kr 1
+skiing we try 1
+whereb th tim 1
+irc xx conv 1
+la 3
+thing ge hypermail 1
+le 16
+docum typ bind 1
+wind 2
+hart doth boyl 1
+lh 1
+brun mel 1
+li 4
+wing 1
+subl 1
+subm 11
+dutch nat 1
+spam newsgroup 1
+lo 12
+amig 1
+ls 1
+do ver 1
+roman publ build 1
+support by industr 1
+lu 2
+sampl sign proc 1
+mail digest 1
+frequ request term 1
+ly 1
+amin 1
+al homep 1
+xxx 1
+amir 1
+nerd 1
+mad thereb 1
+archaeolog dat 1
+ma 8
+succ 5
+virgin 5
+md 3
+archaeolog remain 1
+me 21
+such 1
+mh 2
+dat bank 2
+suck 1
+mi 14
+natur effect 1
+good posit 1
+child car 1
+mm 1
+mo 7
+mp 1
+ppmtogif requir 1
+mr 5
+althistorisch institut der 1
+ms 3
+de relig grecqu 1
+ba on lin 1
+thrust is therefor 1
+grov of young 1
+nesf 1
+engineer research genet 1
+featur a nud 1
+na 2
+nc 5
+ne 2
+weight calcl guessprot 1
+fest inclus danc 1
+bart group 1
+nj 1
+adv of thrust 1
+nest 4
+div cour 1
+no 4
+part grid 1
+nt 1
+provinc control 1
+thrust put 1
+biosc inform integr 1
+mixer 1
+ny 2
+avail for cultiv 1
+internet rel 1
+pair of gauntl 1
+loc sign loc 1
+suppl catalog 1
+ob 1
+od 1
+oh 4
+know if industr 1
+technolog and educ 1
+oj 1
+ok 1
+ol 4
+rec a morsemcfad 1
+om 2
+ba aud 1
+on 8
+chanc of ge 1
+emerg elit 1
+purp sem lexicon 1
+suer 1
+origin of minoan 1
+fin tun chronolog 1
+op 5
+or 2
+menswear 1
+os 1
+ot 2
+opin deceiv 1
+limpr soc 1
+saf pa 1
+se an exampl 1
+cel biolog universt 1
+genet o journ 1
+arch is part 1
+pa 9
+third part 2
+fil of mail 1
+pc 6
+length fight 1
+suff 4
+pe 1
+isrec 1
+arbittr 1
+ph 4
+theor be cal 1
+grain to anim 1
+pi 2
+self grav 1
+neur 2
+pl 39
+po 5
+pp 1
+cgsc 1
+pr 25
+12pt singl 1
+number of acc 1
+sc event appl 1
+guid internet archaeolog 1
+complec arithm 1
+mail mailb 1
+subm detail 1
+reason th us 1
+contribut th mater 1
+persu 1
+continu gi 1
+inform serv using 1
+qd 1
+snowboard season 1
+appear ask 1
+wish 5
+biolog roger 1
+closest 1
+hear th pr 1
+sugr 1
+program in genet 1
+felicitac sant quiz 1
+fickl uncertain fight 1
+qu 10
+giftopnm gif87a 1
+beginner 2
+newb 1
+membership 1
+internet resourc 6
+server french 1
+st which car 1
+ra 4
+rb 1
+accord to art 1
+re 7
+biotechnolog th biotech 1
+rf 2
+organ and behavior 1
+rh 1
+suit for inclus 1
+principl of soc 1
+ri 5
+pack o departm 1
+south afr archieplec 1
+therefor any cr 1
+with 2
+rk 1
+sk resort 1
+rl 10
+rn 3
+ro 2
+good to go 1
+artifact wer collect 1
+sid chain 1
+fil lock 1
+ru 1
+began to rau 1
+un smith 1
+ry 1
+perus 1
+resourc intern 1
+sa 1
+biochemister server 1
+sc 30
+pen st dept 1
+se 44
+sf 2
+sh 11
+listserv tc.umn.edu 1
+user try 1
+sk 2
+next 1
+sl 7
+companion videotap 1
+mark project 1
+sp 5
+sr 2
+suit 8
+cg compl 1
+demonstr that var 1
+ba and lamin 1
+st 32
+su 3
+sw 8
+noack 1
+anarch 1
+swift 2
+bioph physiolog 1
+zebraf server 1
+ver patchlevel 1
+tb 1
+le us know 2
+david martland 1
+singl color 1
+th 6
+ti 2
+twelfth 1
+compound datab 1
+tm 2
+death list 1
+to 1
+email addr 2
+minoan palac 1
+modif at 2.12pm 1
+find a compat 1
+tr 13
+tu 1
+tv 3
+forc and swift 1
+group imag 1
+appropr us 1
+acc count 1
+def pr 1
+protein sit 1
+pl sen not 1
+minoan palat 1
+uc 1
+reg restrict raw 1
+uh 1
+ui 1
+uk 9
+ul 1
+um 2
+centr dhistoir 1
+tub he cast 1
+un 13
+up 3
+ur 1
+us 49
+ut 1
+w3 5
+manner of doubl 1
+thereb at sic 1
+confer do 1
+spectr 2
+me constrayn 1
+obtain and compil 1
+va 1
+mult med 1
+alabam o departm 1
+ve 1
+support tool 1
+vg 2
+engineer aler contain 1
+model austr biotechnolog 1
+academ pr 1
+vh 1
+vi 6
+speech visu 1
+yah 5
+vl 1
+vm 1
+vo 5
+vp 1
+insomuch 1
+yal 3
+corpor www.biochemister 1
+arch good 1
+vr 2
+ethnograph dat 1
+vs 2
+vt 1
+accord 6
+simp rec 1
+bounsyng 1
+web at proceed 1
+se by default 1
+wa 4
+xview toolkit 1
+najibullah 1
+lord doth know 1
+wh 17
+top cover inclus 1
+wi 2
+com from wild 1
+sect cadaver 1
+wo 1
+using 20
+wr 1
+background inform 2
+schutz boardn patroller 1
+calibr method 1
+great disadv 1
+me210 team ba 1
+wy 2
+biocomput rn 1
+snowboard unfriendl 1
+defin top 1
+educom hom pag 1
+nelder 2
+sund 2
+weapon or instr 1
+scal lingu 1
+digit commun system 1
+xm 1
+protein chemister 1
+tru bi 1
+hypertext webster 1
+xv 1
+program langu 1
+xx 1
+go ahead su 1
+warn wel way 1
+view or opin 1
+man greeu 1
+paul west 1
+medief ren food 1
+act ba 1
+ye 5
+yf 1
+biotechnolog law 1
+postcompl educ 1
+lot of plac 1
+yl 1
+shoulder 2
+lighth prov nationw 1
+sc bioph 1
+continu onl 1
+hist guid internet 1
+yr 1
+winter gam 1
+court of john 1
+codon 2
+za 1
+put th st 1
+gal cook 1
+cind renfrow 1
+good launch 1
+rel complec 1
+protein soc 1
+prev unus land 1
+nonlin no 1
+organ subject tr 1
+opn th dor 1
+computer serv saint 1
+zu 1
+olwm window manager 1
+nam organ 1
+forest 2
+up univer 1
+unclassif 1
+tr seigneur 1
+manager softwar rang 1
+rothamst experim 1
+supramolecl compound 1
+sick th st 1
+minoan relig pract 1
+islander 1
+pomp from tulan 1
+html mod 1
+user specif 1
+doeth begin 1
+sc feder 1
+surf 3
+featur nick badam 1
+surg 2
+ca roman 1
+technolog goteburg 1
+signif concern 1
+cauerstr 1
+econom which eventu 1
+review after march 1
+surv 5
+repr cl adh 1
+lo alam nat 1
+flec search inclus 1
+interest work going 1
+us and interest 1
+writ th stuff 1
+susp 3
+therefor driv 1
+datab o sw 1
+shusaku en 1
+karl new york 1
+justin 1
+hadst not spok 1
+justin knight 1
+grunteth so big 1
+se of specif 1
+alfr smart 1
+sendmail 1
+ren brew homep 1
+jav appl 1
+fear to answer 1
+bioinformat server 1
+south of monastir 1
+maintain by derek 1
+computer program cal 1
+lagrang 1
+fr softwar 2
+pal olithiqu en 1
+cancer inc detect 1
+hilit affil opportun 1
+composit for coordin 1
+faq to listproc 1
+guid for biolog 1
+nonuniform sampl multidim 1
+innsbruck 1
+refresh chang 1
+third centur bc 1
+chaf 1
+quoth th lust 1
+man in catch 1
+univer of north 2
+hold thy 1
+char 3
+woman grac 1
+rec.food.cook faq 1
+lab markus 1
+problem with presenter 1
+imperfect of fight 1
+pint oth 1
+init codon 1
+koryf 1
+es estec 1
+talk d archiv 1
+man fight 1
+writer repl 1
+tim buyer 1
+someon.el fo.com 1
+oven tov ix.netcom.com 1
+mechan univer sit 1
+review of abdomin 1
+paulig 1
+usenet interest 1
+gaiter w built 1
+me settl 1
+crimin 1
+le temp 1
+defect datab 1
+norweg homep 1
+michael littman 1
+off in saf 1
+bi lingu text 1
+watch to mak 1
+fetch from server 1
+subst middl roman 1
+experim 5
+sampl 7
+hast th dam 1
+soever th agent 1
+fil cal .hmrc 1
+categor ba direct 1
+sampt 1
+developm cam 1
+prob molecl simu 1
+project aim 1
+supporter www pag 1
+ver of doom 1
+chef 1
+rfc ind 1
+prof rod 1
+tin farm vil 1
+common fal 1
+chem 1
+chen 1
+tim requir 1
+softwar peopl 1
+dat avail 1
+accept for review 1
+sampl strateg pioneer 1
+electromagnet 1
+off snowboard 1
+list listproc 1
+makyng strif 1
+lit sourc distribut 1
+engineer network centr 1
+drug structur databank 1
+observ on st 1
+farmer produc spec 1
+collabor of bel 1
+christm tr light 1
+typ ar common 1
+tom and bud 1
+interest in ireland 1
+dat acquisit hardwar 1
+valug dec 1
+black and whit 1
+sant cruz av 1
+childr writer 1
+civil 5
+boolean combin 1
+equip with dat 1
+juggl 1
+allow fr us 1
+se chapter 1
+labour 1
+taught th noblem 1
+cald by nam 1
+biograph 2
+wid to break 1
+tsouk 1
+format o find 1
+gent undl 1
+train program north 1
+wysiwyg 1
+fe continu 1
+bi pob 1
+artif lif workshop 1
+southhampt and sir 1
+ller 2
+devil imperfect 1
+universidad nac autonom 1
+lic th 1
+uk metar list 1
+window color 1
+earl zon 1
+bind dont contain 1
+domain softwar 1
+chil 1
+chim 1
+freedom 4
+low to def 1
+chip 2
+stat optim method 1
+pur intent 1
+thy own 1
+landowner 1
+hypermail wa origin 1
+text ba browser 1
+bus man const 1
+snowboarder belief 1
+hous of repr 1
+listserv gener 1
+world factbook 1
+unremember 1
+mil b.c 1
+shouer 1
+europ on computer 1
+ba at bulmersh 1
+int espec 1
+comput hid markov 1
+theor bioph group 1
+nat educ 1
+andr 1
+sen another me 1
+contact your as 1
+tru se 1
+dual track se 1
+thrust most common 1
+lau langevin 1
+anec 1
+direct usenet new.answer 1
+anc world 1
+greg lindahl lindahl 1
+joyc christopher 1
+cesarean 1
+snowboarder know 1
+nonuniform sampl 1
+inclus a mo 1
+offer simpl search 1
+datab enzym 1
+man const travel 1
+whisk styl 1
+think th resort 1
+rescu excav 1
+sidn georg gr 1
+ind at delft 1
+snazz artwork 1
+us rgb 1
+read to break 1
+enzym com enzym 1
+heel cup 1
+genom phy 1
+maker to cr 1
+pol typ 1
+system integr compan 1
+silicon accelerometer 1
+kpt welcom pag 1
+proper of amin 1
+extrem 3
+hyperlink 3
+tast bud 1
+incr produc 1
+loc of softwar 1
+internet draft 1
+dont ge 1
+angl 4
+wiin seau 1
+myc th return 1
+system within computer 1
+slain with blow 1
+haemophilus influenz metabol 1
+compan of biolog 1
+inclus par 1
+cl charl thom 1
+server with relev 1
+libr of qumran 1
+vain conceit 1
+r.s.s 1
+port computer 1
+oppr run 1
+norm sent 1
+me tag contain 1
+versatil of electron 1
+cel act 1
+blow wil strik 1
+contact chr rossner 1
+poor docum 1
+commitm to serv 1
+aegean island 1
+mer dim 1
+do you cal 1
+countdown 1
+annu award 1
+equipm first tim 1
+ri de 1
+anim 5
+ind and valu 1
+grammat and styl 1
+chop 2
+bost ar 1
+html hot tip 4
+browser cant handl 1
+cel zebraf embr 1
+ian dutton 1
+vs hym 1
+mark for nlp 1
+server arachnet 1
+institut for ar 1
+jo elsb 1
+correspon text 1
+opin id 1
+protein identif 1
+wool hair 1
+christus rec et 1
+hostnam melmac 1
+boardn patroller 1
+troubl deal 1
+technolog and medicin 2
+technolog research 1
+compl tut gatew 1
+absolut pur 1
+join law 1
+rub so common 1
+de tud 1
+readiest acc 1
+using perl 1
+great abus 1
+produc schedl 1
+coml cloth 1
+inform and st 1
+ankl 1
+inclus a se 1
+me you want 1
+prev ver 1
+lot of stuff 1
+admonit 1
+fl equip stud 1
+zagreb 1
+bruer gat 1
+jonathan pearc 1
+div m.e 1
+point th simil 1
+gain acc 1
+roy crain 1
+valt an implem 1
+mainland clear 1
+ba bus 1
+boskov 1
+continu strik thrust 1
+lo gat 3
+lin ge mailser 1
+bitmap 1
+cultur fact 1
+mater as obsid 1
+field 11
+an pcr jump 1
+incur 1
+aquar fish 1
+sen out inform 1
+ser injur 1
+annu 6
+format emac html 1
+mediterranean archaeolog 3
+mpg addtyp appl 1
+frounyng 1
+rn secon 1
+thy pat 1
+thank for ask 1
+devil imperfect fight 1
+anom 1
+anon 1
+interfac system 1
+convect 1
+m.valt 1
+gener by robot 1
+san francisc st 1
+interest in effect 1
+chus 1
+computer sc techn 1
+usernam 1
+conv strength 1
+direct inclus 1
+custom replac window 1
+degener son 1
+hap dolt 1
+ar select specif 1
+phy map 1
+pdq clin tr 1
+enzym 3
+docum proc compon 1
+design produc mad 1
+owner john 1
+hon cod 1
+tech publ tuesd 1
+mak th spac 1
+fairest flower 1
+western civil 1
+lym di 1
+film bookl 1
+rec a welcom 1
+eastern at 1
+se th blow 1
+industr 8
+se th mofil 1
+centr pier 1
+soc polit 1
+account 5
+film bulletin board 1
+research technolog 1
+tim to break 1
+inclus your pictur 1
+common tabasc dip 1
+read along st 1
+vinc vo 1
+peacock 1
+bibliograph refer 1
+noncommerc purp 1
+fil arch 1
+weapon hav eight 1
+pair of ordin 1
+unsubscrib 1
+further 9
+pag contain pointer 1
+discount travel agent 1
+jerem hylt jerem 1
+rl by govern 1
+select clin tr 1
+joan maud 1
+gener web 1
+cancer institut 1
+problem forml 1
+frind 1
+oh st excav 1
+fring 2
+earth would gap 1
+asc text 1
+sheep in neolith 1
+schiz 1
+pot interest 1
+proc inform ba 1
+flavoprotein research 1
+hanson 1
+lazar labyrinth 1
+microwav 2
+header 2
+season 6
+duplec print 1
+st ha thereb 1
+computer vi confer 1
+mach support project 1
+rean of nsabp 1
+dat lou st 1
+overwrit prev me 1
+ms do 2
+leptiminus liv 1
+minut for pr 1
+alignm 1
+august 9
+gambl and halstead 1
+detect diagn 1
+nichol mar 1
+karl sim charl 1
+webmaster morsepr.com 1
+st appear 1
+non techn introduc 1
+utah mi 1
+javelin 1
+martin 4
+labor for molecl 1
+background color light 1
+ecolog ba 1
+bioinformat institut 1
+sequ annot 1
+urban champaign 1
+archaeolog magaz 1
+altern 5
+risk of appear 1
+karplus hbplus hydr 1
+biolog o datab 1
+bel cant album 1
+orient direct 1
+known serv 1
+intellectu 1
+pack 6
+diffract theor 1
+northwestern univer 2
+burn in plac 1
+form support client 1
+humil to admon 1
+moham 2
+nobil 1
+model server melan 1
+cincinnat 2
+biolog embnet 1
+anc egypt 1
+report 18
+lingu graec 1
+high esteem 1
+worth th speak 1
+tak off point 1
+protein and dn 1
+cr being indirect 1
+zer 2
+year 12
+print th count 1
+bon br 1
+mer iest 1
+learn technolog dissem 1
+ecv confer 1
+whereon stood 1
+carv abil 1
+dissem of cur 1
+unwield thereof 1
+project shar 1
+system protein 1
+etiqu 1
+resort hav got 1
+proceed of ecctd95 1
+thrust ran 1
+sebast heath 3
+project o u.c 1
+libr of refer 1
+lundberg 1
+mach read 2
+ecocyc 1
+leed o departm 1
+stream tar addtyp 1
+creat by s.tarkom 1
+schol 2
+injur could result 1
+bioph group 1
+horizont scal 1
+microbiolog northwestern univer 1
+sit.idx 1
+insl environm 1
+design to help 1
+3d field problem 1
+coerc 1
+lawyer and polit 1
+ecdc 1
+colon organ 1
+scrip research institut 1
+ar select 1
+link to sp 1
+heav metal 1
+anyw 1
+electron mail 1
+av enthusiast 1
+docum except com 1
+sr lank arthur 1
+molecl weight calcl 1
+concept in sem 1
+targ rflp subtract 1
+thriu 1
+thriv 2
+master degr 1
+informatiqu 1
+thrust whatsoever 1
+ingratitud willeth 1
+computer o solut 1
+georg tech 1
+build their computer 1
+member geir jen 1
+server ver 1
+tim and swift 1
+ctil serv 1
+einet galac 1
+tyl cupid 1
+zil 1
+check ev docum 1
+tech.mi.edu last upd 1
+zin 2
+zip 1
+explor develop inform 1
+summer o di 1
+yeer 1
+imp to fight 1
+embnet 1
+weizman 1
+pag to return 1
+me it match 1
+paid 3
+nationw 1
+stud work 1
+pain 3
+passat 1
+pair 2
+sift project 1
+model of ga 1
+publ datab 1
+cem pag death 1
+fr compiler 1
+lurk oftentym 1
+stationer register entr 1
+bibl stud 1
+educ fund council 1
+overkil 1
+hist of mathemat 1
+repr from mach 1
+scarc half 1
+bagger 1
+popl item 1
+biotechnolog o center 1
+cult pract 1
+pathw datab arizon 1
+fifth hi conquest 1
+disadv in striker 1
+agr with nick 1
+perform test 1
+old singl 1
+afraid of chang 1
+cr refer html 1
+contribut to val 1
+insuff of rap 1
+rap for lack 1
+host by john 1
+converter onl handl 1
+www.3iwc.rik.go.jp 1
+tabasc dip 1
+fold softwar 1
+incr in tick 1
+noack cop 1
+biochem reag sup 1
+lectur 4
+resort learn 1
+converg 1
+orient gopher 1
+christm day 1
+ahead su 1
+number of stud 1
+web nod 1
+biogopher 1
+museum of mum 1
+leg inform 1
+sword and dagger 1
+compan offer 1
+indep 3
+hypermail wil displ 1
+north carolin 2
+se he walk 1
+park th week 1
+ge mailser 1
+unskil val men 1
+internet server 1
+futur exhibit 1
+decipher 1
+car to sign 1
+third intern 1
+throw 1
+suppl 6
+yellow pag 1
+inland 1
+lyc webcrawler 1
+teach by jam 1
+duncan 1
+list glob 1
+peter 6
+may brought 1
+tak you straight 1
+gal snow season 1
+collabor biomolecl 1
+pang 1
+soph kor 1
+review your cur 1
+musc chuck.musc 2
+2d or 3d 1
+forc tru tim 1
+proof thereof read 1
+ainter and writer 1
+mak them avail 1
+inclus both cour 1
+zon 2
+summer 4
+computer vi group 1
+conc ye addr 1
+simil to alp 1
+univer departm 1
+scratch 1
+nichol mar wahl 1
+ba altru 1
+computer graph lab 1
+awar clin 1
+motor plan propriocept 1
+appl of learn 1
+speech 4
+fil nam htacc 1
+weapon of adv 1
+oh my darl 1
+pedr biomolecl 2
+high unlik 1
+drunk 2
+oldest photograph arch 1
+eastern sc 1
+men of skil 1
+strong accord 1
+indig 1
+ward strong 1
+molecl cytogenet 1
+join th register 1
+zangger superv 1
+html helper mod 1
+pattern recognit 1
+ar web sit 1
+quiz molecl biolog 1
+girod nt.e 1
+subm publ 1
+urban ar 1
+biochem corpor 1
+biochemister and biotechnolog 1
+winker 1
+specif th color 1
+elaw j boyl.txt 1
+green david 1
+ra th fund 1
+tweak 1
+rough wood 1
+donaldson 1
+ecol 1
+scorn to pl 1
+parc 3
+liueth 1
+environm stud 1
+park 4
+renfrew al assum 1
+parl 1
+part se 1
+univer colleg 3
+shovel 1
+vinc gaffn 1
+lak cit chanc 1
+gener www 2
+part 29
+field archaeolog 1
+inestim 1
+peopl want 1
+gutter and leader 1
+sen nor reason 1
+intellig system 1
+day a chang 1
+pasc 1
+ie.org.uk 1
+past 5
+strong held 1
+xrefdb 1
+maryland us 1
+hand being tak 1
+mutter 1
+sw shop 1
+qu glob ind 1
+boot top 1
+link pl 1
+path 3
+patl 1
+say th ital 1
+perfect fight stand 1
+ba cod 1
+intr trick 1
+cambridg philolog soc 1
+model of re 1
+freedom to lo 1
+schoolm is altogether 1
+biochemister group european 1
+ind of articl 1
+gambol 1
+paul 5
+robot group 1
+form ba 3
+turk archaeolog 1
+styl an 1
+agn beatr 1
+autom loc 1
+accelerometer manu pag 1
+gr mouth 1
+list and faq 1
+good rol model 1
+imp by natur 1
+opprest 1
+publ fil 1
+thrust being pr 1
+swam 1
+swan 1
+sit and eat 1
+contribut to aegean 1
+cind 1
+ser of articl 1
+journ of imag 1
+forthcom 1
+biomolecl genet 1
+plan for growth 1
+siml program 1
+cr imag 1
+nat cancer institut 1
+nat sk ar 1
+ital quot lin 1
+densest 1
+experim biolog 1
+for project pomp 1
+renfrew and redistribut 1
+measur th dist 1
+etern surf 1
+computer lab 1
+def that sid 1
+journ of roman 2
+styl cr 1
+tim you want 2
+fact sant portrait 1
+unus land 1
+en board 1
+ge mailser.cmd 1
+spain 3
+effect of popl 1
+collect he inform 1
+retrief primer 1
+view softwar 1
+list team 1
+dead peopl server 1
+gabriel paper 1
+earliest zon 1
+mind rub 1
+season saving 1
+mathcad 1
+com to utah 1
+cast ed 1
+cancerlit cit 1
+acc.conf fil 1
+paym 1
+payn 1
+lin archaeolog 1
+worldw and prov 1
+model of capacit 1
+institut peopl pag 1
+southwestern chick 1
+siml of cel 1
+scal biolog 1
+pag so us 1
+imag o genom 1
+westpoint colleg 1
+oth night 1
+rk effect etc 1
+cadogan 1
+featur of html 1
+trac of anc 1
+descript might want 1
+contact arseweb disclaimer 1
+number of subm 1
+striv to enh 1
+childr 5
+tom gruber 1
+or galler 1
+sc fict writer 1
+wherb doth apper 1
+val men doubt 1
+datab prosit dict 1
+rec.food.drink.coff 1
+saint lou univer 2
+edger center onl 1
+acc th docum 1
+anthropolog univer museum 1
+learn to strik 1
+writ by educ 1
+mlmfaq toc.html 1
+funct rang 1
+israel th sloing 1
+ech ster 1
+count count 1
+induc 1
+hydr 2
+visit number 1
+eng lik yah 1
+quest of why 1
+citb 1
+bronz ag lith 1
+serv softwar 1
+heav metal band 1
+bc research inc 1
+major hel roman 1
+sound reason 1
+microsoft word 1
+ver of archieplec 1
+twelv 3
+pub misc 1
+docum mor fl 1
+older frequ 1
+appl spring kernel 1
+bind system 1
+redistribut model 1
+gcrdb 1
+peopl acc 1
+electrophor 2
+mean st 1
+numer method 1
+inclus th sol 1
+koflach snowboarder 1
+highest scor 1
+prov support 1
+isthm 1
+direct hypermail 1
+maruel 1
+text center 1
+mirror of infomac 1
+design for speed 1
+twent 2
+perfect judg 1
+cur an experim 1
+ct support serv 1
+nomencl o sequ 1
+defaultind typ 1
+return th schiz 1
+ed blount 1
+prent hal 1
+mediterranean ocean datab 1
+bitnet 1
+old lust 1
+rel field 1
+tack kuntz group 1
+henc sk boot 1
+e.col dat collect 1
+int to prov 1
+se ignor 1
+group zenec lifesc 1
+univer o labor 1
+mailbox se hm 1
+joint project 1
+electron mail util 1
+exampl appear 1
+tool for alif 1
+montr universit de 1
+adjust thing 1
+attempt to ital 1
+specif url 1
+marvel he took 1
+using th gi 1
+reign 1
+secon 6
+geomorpholog st 1
+ctil newsletter 1
+publ ftp 1
+prov minim 1
+brunel univer 1
+pr season wareh 1
+may com 1
+troylus tr 1
+hannegan food 1
+spart 1
+resourc alt vist 1
+beazl arch 1
+sw 2dserv ge 1
+opt other thing 1
+day me 1
+forgot 1
+mcnult 1
+distribut mater 1
+url to arch 1
+ap to shov 1
+hypertextbook 1
+enh adver inclus 1
+motiv learn 1
+dead and gon 1
+lin ge 1
+slu hom pag 1
+old or anc 1
+park direct john 1
+vi human 1
+distil but specializ 1
+overlap 1
+aect confer 1
+moment to visit 1
+ask ar quest 1
+encour paper 1
+deceiver 1
+constitut trademark 1
+andalus 1
+mater and fin 1
+adventur 1
+learn to deal 1
+fe further 1
+an biochemister 1
+fifth 6
+snowboard is obv 1
+understand color ind 1
+ship th agricultur 1
+rutger univer 2
+29aug94 1
+maxim th impact 1
+contain inform 2
+internet top 1
+faq heinlein faq 1
+system univer 2
+correct treatm 1
+inclus th sun 1
+hylt 2
+model acquisit mot 1
+us webcounter 1
+osmanag 1
+structur molecl 1
+adjust 1
+intern museum 1
+edad 1
+lat janu 1
+illin univer 1
+oar and stretch 1
+contain amphor 1
+separ pag 3
+pr mad 1
+period inspect 1
+vinc god mad 1
+inst th acc 1
+mail to listserv 1
+superfam 1
+internet ind softwar 1
+sir beu 1
+loc produc resourc 1
+path to wh 1
+subject 16
+strang vic 1
+publ guest 1
+aplac.hut.fi 1
+system docum 1
+2.12pm 1
+agricultur biotechnolog center 1
+photosynth 1
+ind robot 1
+pbem 1
+thrust saf 1
+form as bitmap 1
+front developm 1
+act def 1
+bj rk 1
+seattl 2
+cybur gooner 1
+wab window eml 1
+deposit to deposit 1
+detail stud 1
+plainl clad 1
+command th specif 1
+nam du 1
+lingu pag 2
+ted turner 1
+day ro 1
+secur 1
+caus that wisem 1
+gruber 1
+styl sh 1
+becam th foc 1
+adapt controller 1
+refresh 1
+cooper to cuckold 1
+browser imag cach 1
+customer serv 1
+mar mcnult 1
+woud deck 1
+day se 1
+punish 1
+labor martin 1
+hypermail l www 1
+hutchinson cancer research 1
+cognit sc soc 1
+kil or hurt 1
+aegean wh modern 1
+cant work 1
+flash electron bulletin 1
+bod barbecu 1
+grup and robin 1
+nlp field 1
+rad term 1
+conduc rescu excav 1
+www.tel.ucl.ac.be imag avbp 1
+espec backcountr snowboarder 1
+tak as input 1
+shipbuild technolog 1
+modern veg 1
+pc v.3.0 1
+biomechan div 1
+center onl 1
+project cdr 1
+pag northwest fish 1
+ind robot gener 1
+promot our nam 1
+commitm to conduc 1
+inform transpar 1
+softwar manu ba 1
+biochem compound 1
+attitud 1
+anc engl weapon 1
+alphab order 1
+platform 4
+harvest resourc discov 1
+chemister interdepartm program 1
+crystal structur 1
+institut o molecl 1
+tidbit of inf 1
+resourc and exchang 1
+schol wer taught 1
+imp to gener 1
+download.html 1
+preh by jerem 1
+anatol 1
+hist and archaeolog 1
+yesterd 1
+anatom 1
+research labor sr 1
+gatew at univer 1
+anec so daint 1
+surfac and thin 1
+ashamd 1
+ee aler 1
+il break thy 1
+great apprec addit 1
+archaeolog 5
+hartl 1
+transform our boy 1
+speech project shar 1
+3c tip 1
+institut o labor 1
+bsd inform 1
+quot articl 1
+an of text 1
+chang that entr 1
+sev groat 1
+thriv loc 1
+militar web 1
+research and publ 1
+me from standard 1
+just wif discoueryng 1
+edit by jam 1
+sen com 1
+nam f mail 1
+search eng search 1
+edit 17
+text is softwar 1
+deal cam 1
+valmin 1
+multim computer ba 1
+retrief an listproc 1
+modern vin 1
+great 13
+mother bad 1
+docum by valmin 1
+inform and improv 1
+html format 2
+read to tak 1
+low on graph 1
+spec in minoan 1
+pushpin 1
+introduc to protein 1
+arg lim ar 1
+swym 1
+lamour 1
+pattern sw 2dpag 1
+pictur 14
+musc htmlguru aol.com 4
+siedlern zu den 1
+world archaeolog 2
+poor man ca 1
+institut nat du 1
+using th un 1
+ind of cariadoc 1
+system for molecl 1
+bought 2
+nuclear 1
+singl malt 1
+guitar 2
+nucleat 2
+revolut 1
+wherof most per 1
+longboat 1
+stranger or fal 1
+icgeb 1
+integr toxicolog univer 1
+network cybernet corpor 1
+listserv and research 1
+fr coh group 1
+molecl biolog journ 1
+von den erst 1
+foreign flight 1
+chemister softwar 1
+number and differ 1
+view of imper 1
+recombin dn vect 1
+inclus red arrow 1
+showbr 1
+lac leather 1
+apac 1
+un do 1
+lew campbel lorimer 1
+gravig project 1
+telecommun 2
+florid o nmr 1
+particl architectur form 1
+wh modern 1
+titl cd 1
+qu and produc 1
+greec 5
+greed 2
+greef 1
+scal st 1
+chronolog 3
+articl ar sent 1
+greek 2
+return to wh.com 2
+green 5
+warner troyer 1
+fight is becom 1
+mbox to read 1
+project clp 1
+greeu 1
+corner of san 1
+duncan jam yal.edu 1
+thing by letter 1
+scenester distribut 1
+brother adam 1
+aplac optim 1
+number of research 1
+said vinc god 1
+guard or stoc 1
+good al 1
+us weather map 1
+fil in hop 1
+bulletin 6
+structur biolog univer 1
+templ palac 1
+structur molecl biolog 1
+shower 1
+weblog pag 1
+law lib ucdav.edu 1
+lo th opportun 1
+brick attest 1
+molecl marker resourc 1
+trembl fear 1
+snowboard med 1
+belguim 1
+institut protein 1
+utah snowboard deb 1
+us tel 1
+corpor and bi 1
+human popl 1
+intern o ecocyc 1
+effect by computer 1
+remov th great 1
+it radiolog departm 1
+inform on bsd 1
+aud monit 1
+hm archiv url 1
+thy bryd 1
+outskirt of salt 1
+se som sort 1
+preec lat 1
+html resourc 4
+system ar 1
+captur both word 1
+seeing 1
+research visit 1
+featur of mankind 1
+skil most common 1
+mailbox setenv 1
+dec regard 1
+softwar and inform 1
+email 12
+progr boolean 1
+hym found 1
+rfc ind search 1
+tabasc 1
+mycenaean cultur 1
+evalu form 1
+keyword or character 1
+project hom pag 1
+us link 2
+chief act 1
+honour of david 1
+showhr 1
+eastern snowboard adv 1
+regl review 1
+becom a member 1
+plainl 1
+mus and absolut 1
+search gopherspac 1
+pag at mi 1
+shockwav 1
+good ey 1
+brigham wom 1
+czech 2
+quest answer conver 1
+acc point 1
+bacter 2
+martinsr institut 1
+search th dict 1
+particip wil shar 1
+master of sc 1
+universit basel bionet.softwar.www 1
+dep on frequ 1
+find specif 1
+ge migr 1
+bulldoz 1
+default ind 1
+med school affil 1
+personnel personnel list 1
+administer addr 1
+orn e pal 1
+good ge 1
+good fellowshyp 1
+program wa origin 1
+expedit to myc 1
+farmer becam incr 1
+educ 9
+thr thr month 1
+tulan 1
+archaeolog austr 1
+med commun 1
+gradu proc 1
+worst weapon 1
+fal or doubl 1
+gold and siluer 1
+main cur 1
+thy hand 1
+fight 1
+support car 1
+adv is strong 1
+diagram 1
+film effect 1
+dutton impr 1
+number def 1
+encylop 1
+le fly 1
+catch a satel 1
+mm period 1
+method siml an 1
+group act 1
+atl of palaeoveg 1
+html pag 2
+saarland internet 1
+ster head 1
+good id 1
+fil that hypermail 1
+hospit 2
+st approach ny 1
+carl museum 1
+med highbur 1
+tradenam of morsemcfad 1
+inclus red 1
+vertu deut da 1
+want is why 1
+id pl email 1
+microbiolog wag 1
+med imag www 1
+structur biolog fmc 1
+tradit server 1
+thought about pr 1
+wonder why thing 1
+popcorn 1
+ankl support 1
+pr went forth 1
+minoan mycenaean palat 1
+order to writ 1
+schoolmaster ha taught 1
+gradu level 1
+perceptu robot 1
+pr produc 1
+paul church 1
+sedim 1
+pag alread refer 1
+venison 1
+computer med 1
+expl tip 1
+interest pag 1
+url search 1
+ar assoc 1
+nederland 1
+inclus robot 1
+scholarship server 1
+yah sc 1
+trainer ar deaf 1
+tar addtyp appl 1
+departm with gradu 1
+staff man strik 1
+genet inform 1
+conf direct wh 1
+admin fo.bar 1
+hypertextu 1
+exclus letter 1
+direct john bower 1
+number 24
+mediterranean basin 1
+univer med imag 1
+cop and past 2
+www.tel.ucl.ac.be imag 1
+vp my mer 1
+ver of netscap 2
+labor pr 1
+hom walk 1
+tabl ar 1
+siedlern 1
+imag and sound 1
+john fo.com mon 1
+joint tun 1
+ukc disclaimer 1
+birkbeck colleg departm 1
+developm which span 1
+event 7
+nesf read list 1
+japan german 1
+tabl ba 2
+tim and forc 1
+minoan ceram 1
+top to bottom 1
+air sit 1
+apol 2
+cour to se 1
+brydegrom would giu 1
+fil using 1
+do not doubt 1
+tun chronolog 1
+dist learn confer 1
+mlm command 1
+standford 1
+marvel 1
+thrust being strong 1
+appl 19
+year alp 1
+bedlam beast began 1
+magaz boehringer 1
+web pag 7
+softwar publ 1
+screw thing 1
+lif technolog 1
+pol and palac 1
+fl hart 1
+eu corner wh 1
+suggest that emerg 1
+server deathnet 1
+institut of environm 1
+rom from brennius 1
+alif research 1
+other us 1
+strik sound blow 1
+datab scrip research 1
+coombsweb anu soc 1
+abst breed 1
+point for adv 1
+int to continu 1
+www.unm.edu 1
+protocol natur publ 1
+biotechnet o biotechniqu 1
+wh modern vin 1
+subscriber to subscrib 1
+vist a power 1
+labor sr 1
+imag with whit 1
+optim biolog model 1
+displ brought 1
+atl ian 1
+strength and read 1
+john my mailbox 1
+rigid and articl 1
+browser imag 1
+turn dep 1
+passyng 1
+structur datab 1
+sc.cl 1
+univer bioinformat nat 1
+email me 1
+compiler 3
+pastym 1
+wylliam gryffith 1
+homep rec.food.cook 1
+fight sor hurt 1
+cl stud job 1
+genet computer group 1
+la ca 1
+publ in greater 1
+saf in rap 1
+giv nic htlm 1
+computer as learn 1
+administer ag 1
+defin on fr 1
+suit se 1
+part their chiefest 1
+nucleus 1
+program to introduc 1
+libr guid brit 1
+kabat 1
+tuml oft con 1
+discl 1
+newspaper wrap 1
+exper troubl download 1
+mckeown 1
+discr 2
+ad th entr 1
+us of robust 1
+rap ar longer 1
+oper exp 1
+do hast 1
+mischief 1
+arch inform 1
+georg silver 1
+commun stud 1
+docum at institut 1
+hand dand 1
+cat on.letter 1
+workshop program 1
+coff drink 1
+council for wal 1
+proc al requir 1
+photograph arch 1
+sc at virgin 1
+doeth hop 1
+hym knau 1
+falkland 1
+institut of amer 2
+introduc spon organ 1
+complec of djoser 1
+design altern 1
+origin of complec 1
+archieplexform at hebrew 1
+fl text search 1
+good tr 1
+claus other christm 1
+surfac grav 1
+number se hm 1
+birmingham univer 1
+minoan palat system 1
+figur 5
+aveir portug email 1
+shallow natur 1
+cibachrom stev man 1
+hypoth bronz 1
+tag contain 1
+ordin lac 1
+hith he drew 1
+com man way 1
+facil john 1
+hand is alter 1
+list manager command 1
+hymself 1
+went to signior 1
+prouerb hath bin 1
+mediterranean polycultur 1
+hierarch order 1
+irv biocomput 1
+www ba 1
+select biomolecl biochem 1
+confer o chemister 1
+be for macintosh 1
+telecomunicac 1
+se sand 1
+custom build alter 1
+cuckold 1
+go ahead 1
+pag collect link 1
+datab browser lot 1
+impract 1
+eng search 1
+eighteen fe 1
+st with vom 1
+proc softwar 1
+20dec93 1
+evid for domest 1
+univer of waterl 1
+neat pictur 1
+impud bold 1
+hist period defin 1
+ind o metacrawler 1
+scaffold 1
+ix.netcom.com 1
+altern ar subject 1
+reason pr 1
+evil custom 1
+www de 1
+serv informatiqu 1
+ltd o molecl 1
+cogsc 1
+cour specif 1
+genomenet o kyot 1
+entrez 2
+pdb browser swissprot 1
+sound blow 1
+futur plan 1
+band which pl 1
+server sipb 1
+design html 1
+cour project 1
+di geschicht einer 1
+nin black letter 1
+cioppin 1
+continu gi work 1
+other organ governm 1
+cloak with gl 1
+medicin new england 1
+tran aegean trad 1
+flash and rel 1
+ye insomuch 1
+nick 1
+tut gener program 1
+gradu converg 1
+unskil fight 1
+tak th wild 1
+colormap mad 1
+nicu 1
+commerc produc 1
+interact perform 1
+cultiv 3
+georg silver paradox 1
+en franc 2
+aegin import 1
+erlang symp 1
+allow snowboarder 1
+biolog biomolecl genet 1
+shadow 1
+tut veracruz univer 1
+prospect specif 1
+polymer chain 1
+bright o unicorn 1
+sim charl taylor 1
+listserv list 1
+nom en hieroglyph 1
+mailer allow 1
+hieroglyph 1
+mon to disp 1
+fict author sr 1
+heath sfsh 1
+hist is pol 1
+coombsweb 1
+nothyng wyl 1
+drift to esp 1
+hal publ 1
+arch interfac 2
+er wright 1
+descript me nam 1
+thewith snapshot 1
+calibr procedur 1
+touch no such 1
+confer futur 1
+brit academ libr 1
+ind to com 1
+journ of biolog 1
+connecticut 2
+biotech inform nat 1
+nift 1
+infer 1
+franck con 1
+romulus 1
+ma seem 1
+low and er 1
+load 5
+ind softwar peopl 1
+embar 1
+medicinemedicin antiqu 1
+genom server 1
+mail al 1
+mot control 1
+medicin fr 1
+ye chr 1
+surpr 2
+tuesd and frid 1
+ppm and test 1
+began to test 1
+ag thing 1
+chemhom.html biochemister 1
+lying to accompl 1
+letter transm 1
+cooper 3
+pr good 1
+strong def 1
+unqualif hostnam melmac 1
+inform technolog 4
+la pr 1
+bing xm.com 1
+dr and sing 1
+addit support docum 1
+henc sk 1
+displ 13
+map entr using 1
+var terrain 1
+supercomputer center 1
+valu contain 1
+great quest 1
+lock 2
+avalanch awar 1
+leed and read 1
+avail from baylor 1
+rudg univer 1
+webmaster to tak 1
+4th mil 1
+excel resourc 1
+on specif 1
+mult enzym complec 1
+school of lif 1
+ridg wa compl 1
+biolog control 1
+domest pot 1
+limb or lif 1
+disqu 1
+lodg 2
+subm dn sequ 1
+off journ 1
+gopherspac 1
+col cup arseweb 1
+fight to stand 1
+usag 5
+le cran crashm 1
+strik or thrust 1
+hand tool 1
+thrust altogether 1
+wag agricultur univer 1
+educ comput educ 1
+gustav paulig ltd 1
+loeb 1
+upcom addit 1
+dim biomolecl 1
+subscrib envirolaw 1
+found univer 1
+loew 1
+loc lif 1
+conceptu design 1
+label to put 1
+targ mut datab 1
+woman 2
+form and tool 1
+subsurfac cultur deposit 1
+molecl biolog print 1
+oper sing 1
+guar lic 1
+sift wil prov 1
+seek to com 1
+priv council 1
+latest web technolog 1
+plan and learn 1
+fanz devot 1
+minmac method 1
+commitm 2
+mail fo 1
+fourth must bounc 1
+comput and phy 1
+syr cultur 1
+valu contain red 1
+addit support 1
+method mim 1
+appl of autom 1
+contact chr 1
+rap to work 1
+plain se 1
+internet link exchang 4
+text html folder 1
+design institut fr 1
+www pc 1
+adult 2
+w3 search eng 2
+unpract 1
+influ 2
+frequ request publ 1
+dinner 3
+stud resourc 1
+ftp client 1
+poison wiin 1
+kirkland 1
+neurobiolog lab 1
+user 19
+ind gif87a 1
+pictur wer drawn 1
+act therein perform 1
+pag exp 1
+snowboarder 1
+report progr 1
+ingr of minoan 1
+zagreb in croat 1
+stat div appl 1
+zangger 1
+loin 1
+informat and theor 1
+islam dinner 1
+pil of rib 1
+tr on du 1
+an group 1
+sort by dat 2
+sort of chang 1
+cultur 8
+fulfil th cor 1
+judg 1
+hap bryng ioy 1
+treatm plant 1
+ren food 1
+infoc 1
+personnel list 1
+quer ge start 1
+annot server 1
+illin 2
+gentlem of england 1
+entr for museum 1
+ant snowboard talk 1
+mus and danc 1
+straight your dagger 1
+hurt their enem 1
+excav on sit 1
+mak th way 1
+wurld o pedr 1
+kingst 1
+further speed 1
+cl compar 1
+sequ dat fssp 1
+agent edit 1
+perform molecl 1
+lokr 1
+somewhat later dat 1
+mot control learn 1
+fight is alter 1
+henceforth 2
+pag an 1
+southwark 1
+mad spec avail 1
+softwar using 1
+transport stud 1
+patrol at snowbird 1
+fring of gold 1
+dat ba genomenet 1
+reposit ind 1
+resourc biogopher 1
+visu serv 1
+melbourn northeastern turk 1
+cibachrom 1
+gener 33
+mbox filenam 1
+genet 7
+mail me 3
+genev 5
+conserv sc 1
+ward lower 1
+sydn 1
+nist 1
+4.4bsd lit sourc 1
+evolut of nucl 1
+conserv st 1
+www vl 1
+look for fund 1
+reposit of cl 1
+evolut and popl 1
+archaeolog dat serv 1
+carv phenom 1
+theor model 1
+faq wa compil 1
+linkstar flec search 1
+densest surfac find 1
+tak fail 1
+mithr mater 1
+cab on thursd 1
+nitr 2
+sistem interattiv 1
+larger system sampl 1
+ant sk 1
+taxonom datab 1
+garter 1
+rel docum klat 1
+produc in technolog 1
+hatch 2
+tradit folk song 1
+tailor 1
+tran color 1
+look 21
+pag ar ded 1
+loop 1
+centr plac 1
+ecosystem 2
+detail of canad 1
+pag ee 1
+div mechan univer 1
+flash.stanford.edu 1
+resolut men half 1
+inspect rev multipl 1
+sem autom 2
+tran an us 1
+ben fr 1
+libr of medicin 2
+biolog vrij 1
+entertainm and magaz 1
+mycenaean palat econom 1
+man and vict 1
+daresbur lab 1
+liaison 1
+undertak th combat 1
+escherich col metabol 1
+inform for user 1
+internet guid 1
+einer 1
+ra aspect 1
+einet 1
+prepar to bast 1
+medicin vi 1
+sit from human 1
+roman port 1
+list pcr method 1
+academ libr 1
+sub assemb 1
+mov contractil 1
+se forth book 1
+list of biomolecl 1
+biochemister and microbiolog 1
+load each pag 1
+rank or stratif 1
+lord 2
+galac and blind 1
+cur www talk 1
+arseweb foot calendar 1
+lorn 1
+conspicu knol ca 1
+bod or fac 1
+spac and tim 2
+mak sourc 1
+purchac 1
+box coach 1
+dand wysiwyg hypertext 1
+drawn and se 1
+softwar pedr biomolecl 1
+fetch 2
+genet evolut 1
+bi to keyword 1
+chang hi weapon 1
+jump 2
+pot wa mad 1
+graph inclus 1
+lost 1
+hm about url 1
+browser in widespread 1
+nem val 1
+using cg script 1
+assur certaint 1
+19th centur b.c 1
+robust lec part 1
+susan 1
+link exchang 4
+text und 1
+year ev 1
+rap fight stand 1
+magaz ar avail 1
+examin th me 1
+herewiith so vext 1
+creat by digit 1
+scot lunt 1
+20x20 1
+human genom research 1
+helpl us 1
+mailbox se 1
+conver to mailt 1
+micr reg scal 1
+def of london 1
+ground 3
+av risk 1
+develop method 1
+cit of ath 1
+project is spon 1
+separ stat 1
+prosit protein pattern 1
+univer genet cod 2
+lout 1
+www biolog resourc 1
+therefor th thrust 1
+el in gain 1
+invent ar pr 1
+cambridg theban 1
+biolog seminar 1
+chameleon 1
+sylv 1
+background to shar 1
+gr pixel 1
+anc weapon 1
+featur mi stud 1
+stud project team 1
+tomasz implem 1
+search string exact 1
+analog circuit 1
+rel work 1
+pol or pract 1
+illus 1
+symp 3
+inorgan chemister server 1
+genob 1
+primer 3
+contain appropr 1
+boot ar common 1
+mad a figur 1
+lib feb94 1
+freewar program creat 1
+compl with figur 1
+find thy hous 1
+genom 4
+molecl model austr 1
+nomail unsubscrib 1
+teach with 1
+fourth mark 1
+refer and articl 1
+bsd kept 1
+measur 5
+young ol 1
+maintain 14
+sen remember 1
+wom ar wrought 1
+intellig reposit ind 1
+multipl fluid 1
+blu valu 1
+indirect in mov 1
+biotechniqu 1
+cs tr 1
+mot and cour 1
+showhtml boolean number 1
+further import compon 1
+most snow 1
+colleg uk server 1
+mail noack cop 1
+commun ltd 1
+said englishm 1
+pyramid complec 1
+endanger hi enem 1
+red slip war 1
+color background 1
+econom of leptiminus 1
+elit author 1
+enabl th playback 1
+saw on compan 1
+just 1
+ser at john 1
+exit proc 1
+wish al mayd 1
+inclus artif visc 1
+danger to break 1
+month cancernet 1
+setter forth 1
+quarrel 1
+countr man whatsoever 1
+food chocol 1
+interprovinc 1
+law biotechnet 1
+setenv hm 1
+suffer 3
+quebec univer 1
+mont carl an 1
+prov or disprov 1
+reach st spac 1
+syntac 1
+sovereignt in car 1
+jen german 1
+dim drug structur 1
+ser of developm 1
+educ job 1
+beadon 1
+wheresoever th thruster 1
+technolog journ th 1
+creat a record 1
+int to keep 1
+onl as gzip 1
+job list 1
+gentl 1
+drawn and measur 1
+develop an 1
+georg kor 1
+sequ log 1
+institut of egypt 1
+search group 1
+com at ech 1
+hugh at kevinh 1
+us of forc 1
+progr 8
+pub misc virtu 1
+def in london 1
+sysv 1
+var compon 1
+using computer 1
+leonard gybson 1
+foul speech abus 1
+quick ey 1
+s.e.brenner bioc.cam.ac.uk 1
+client want hit 1
+boon or ban 1
+biograph dict mov 1
+3dim 3d imag 1
+jam mil mackenz 1
+workst support layout 1
+said th cooper 1
+inclus str 1
+appl and industr 1
+anc hist bulletin 1
+mirror sit worldw 1
+mil mackenz 1
+rear ankl support 1
+month befor day 1
+world lectur 1
+htmlguru 4
+apt bod 1
+produc prototyp 1
+pag st 1
+ma melan mitchel 1
+sc departm 1
+develop cr 1
+internet catalog 3
+east lokr 1
+food color 1
+implem of electrotherm 1
+loc webmaster 1
+error 4
+edit monit serv 1
+sword of perfect 1
+fac th town 1
+navig flight test 1
+clad 1
+career resourc 1
+biocomput and model 1
+forever 1
+surv int 1
+loc map 1
+edg p.o 1
+clam 1
+tar fil 1
+bloud stream 1
+uk resourc 1
+parc map 3
+han gunter jan 1
+non redund protein 1
+project geosim siml 1
+produc identif 1
+rf design 1
+list list support 1
+manager command 1
+annot protein sequ 1
+command differ great 1
+nettrain 1
+man li aloft 1
+mad a den 1
+lincoln an austr 1
+antikensammlung 1
+bel sav 1
+seeker 1
+crav your honor 1
+langt michael littman 1
+perturb 1
+computer moder 1
+pyr ma spectrometer 1
+cancer research fund 1
+digit pow 1
+cr publ rel 1
+writ lov song 1
+organ mater 1
+adver 5
+lat bronz ag 1
+molecl biolog pharmac 1
+exact 4
+user desir 1
+coerc or cajol 1
+spectrometer 1
+aim in develop 1
+fit for childr 1
+know such strang 1
+sit and pattern 1
+datab roswel park 1
+rn soc ca 1
+digest me 1
+macromolecl structur univer 1
+silicon val 4
+further excav 1
+korakou cultur 1
+egypt expedit 1
+clem 1
+www0.cern.ch 1
+degr in mechan 1
+possibil for www 1
+tut gatew 1
+affect your subscript 1
+hold th staff 1
+protein engineer network 1
+facult uncover 1
+alif research guidel 1
+neutron dynam 1
+da spec run 1
+proof 4
+ftp archiv 2
+recr and tour 1
+protein structur 1
+undigest ver 1
+search th web 1
+cl mail 1
+cupid hau 1
+robban 1
+proou 1
+claus fact 1
+arab 3
+bookmark 1
+gutter 1
+arkan o biopharmaceut 1
+technolog biotech 1
+serv to kil 1
+tim saf 1
+ban apac 1
+vanish 1
+mak peopl laugh 1
+utah 3
+arseweb new 1
+propr 1
+thereb stand 1
+ring is detach 1
+subject to rigor 1
+ar assoc me 1
+quick find funct 1
+elizabeth batson 1
+du proof 1
+effect of squeez 1
+vant in fight 1
+mail list team 1
+modif th bind 1
+flow model 1
+ba on structur 1
+educ research 1
+winner 1
+tim veijol 2
+sc and geograph 1
+anc world web 1
+hel institut 1
+arch 17
+rugb intern 1
+journ in biochemister 1
+benson op 1
+heleyn 1
+clim 1
+proper inclus 1
+clin 3
+funct hardwar 1
+trondheim 1
+israel archieplec 1
+rumor mil rutger 1
+latin cour 1
+step pyramid 1
+principl of biochemister 1
+pa to finish 1
+biolog philosoph issu 1
+san dieg supercomputer 1
+imag of var 1
+art archaeolog 1
+archaeolog field school 1
+biochemister duk 1
+human molecl genet 1
+spen tim talk 1
+said master 1
+mytholog imper 1
+doubl en board 1
+ba biometer person 1
+hauyng doen 1
+number of import 1
+mean result 1
+conc your listproc 1
+graph output 1
+polycultur 1
+paid fourteen groat 1
+brent lab jack 1
+url you refer 1
+rn soc 1
+cloud th do 1
+an aim 1
+brenner s.e.brenner 1
+ment th fact 1
+accept a user 1
+aler from elsev 1
+run th xwav 1
+etiqu read appar 1
+megaron at mid 1
+model libr 1
+rl dd search 1
+mil saint 1
+articl lin 1
+publ multim docum 1
+solut for autom 1
+departm argon 1
+miscellan opt configur 1
+learn hydr 1
+grow and level 1
+proud 2
+hu and ey 1
+tavern 1
+undergradu 2
+arch search 1
+bad me pl 1
+good downright 1
+blind galac 1
+preserv 2
+siml in aplac 1
+advoc 2
+et de la 1
+argv 1
+fed agricultur 1
+sen when view 1
+particl excit discov 1
+oreil assoc 1
+softwar manu 1
+exp world wid 1
+handl it anymor 1
+giftool handl 1
+rich fring 1
+com a nearer 1
+molecl biolog bioinform 1
+pr master vinc 1
+wyl be grieu 1
+natur without art 1
+sit interv 1
+asc publ 1
+molecl biolog biocomput 1
+minoan mycenaean 1
+hypertext edit 1
+highbur inform 1
+journ rang 1
+resort manager 1
+interest to anthropolog 1
+explor th natur 1
+clod 1
+sub pag educ 1
+asimov faq 1
+gener requir 1
+us of learn 1
+var featur 1
+clov 1
+character ar skip 1
+sit contain imag 1
+receipt listproc 1
+util 4
+veijol and ant 1
+digest 3
+coursenot 1
+ext abstract 1
+inst instruc 1
+wom fair word 1
+recherch en arch 1
+corp to sl 1
+new group 5
+genethon 1
+common refer 1
+command to addr 1
+colour scanner 1
+sixth intern 1
+buthan 1
+mad in england 1
+nec most common 1
+run east 1
+gilber lab 2
+wscg97 kiv.zcu.cz subject 1
+nserc mpr 1
+annot bulfinch 1
+prestig craft 1
+christm valu interview 1
+inclus ar perceiv 1
+sk equipm 1
+striker or thrust 1
+div of comput 1
+de lanaux 1
+pr own 1
+ry pol 1
+bad langu 1
+terrac for ol 1
+swifter 1
+pag is maintain 1
+hinterland 2
+ey tip 1
+ath greek 1
+futur plan cal 1
+wright 2
+car design produc 1
+guidel and safeguard 1
+stankov 1
+sourc ar welcom 1
+prefer to return 1
+htacc fil contain 1
+vl electron journ 1
+bewail 1
+backmost 1
+sum of av 1
+cr without put 1
+led to incr 1
+resourc for roman 1
+snowboard norm 1
+alexandr jl collect 1
+lim and majordom 1
+problem or com 1
+thereb th benefit 1
+amir nooralihiyan 1
+convolut 1
+articl it receiv 1
+biolog weblog 1
+mot to def 1
+gopher campus phon 1
+club 1
+larger conver 1
+gen o center 1
+ver think 1
+bibliograph inform 1
+sword buckler man 1
+actu shar 1
+georg lev 1
+elettronich 1
+tak th pain 1
+person html docum 1
+se th not 1
+libr and inform 2
+say heckler 1
+mad to go 1
+comp.dsp cur 1
+emph of geoarchaeolog 1
+corpus project 1
+seem in fight 1
+recip collect 1
+intellig labor publ 1
+mailserver sit maintain 1
+ward li disadv 1
+relev 10
+god sen 1
+distribut snow 1
+sl your lead 1
+concer at rox 1
+group of snowboarder 1
+continu til 1
+daunc be 1
+macintosh tip 1
+ag account 1
+sequ to cr 1
+anymor 1
+mak imag 1
+junior 2
+skelter 1
+tournd 1
+inclus vxwork vm 1
+frequ ask 4
+system model inclus 1
+sustain 1
+playback 2
+follow th din 1
+shovel that resembl 1
+univer of bristol 1
+di swear 1
+dumbart 1
+prap stud 1
+pip rob mind 1
+ridg nat labor 1
+select html format 1
+fal most common 1
+talkt 1
+docum request 1
+facult of mathemat 1
+bulletin board 2
+estud interprovinc 1
+novel numer 1
+molecl biotechnolog program 1
+hm filemod 1
+good hap doeth 1
+number of fil 1
+peac 2
+educ by roger 1
+amphitheater 1
+vaclav 1
+congr vatican 1
+weblog 1
+peak 1
+hold argum 1
+nest int 1
+pear 1
+list and ind 1
+quick strong mad 1
+institut th cl 1
+phy biochemister 1
+relig 4
+nottingham web 1
+docum 27
+keyword cont 1
+val man 1
+system v system 1
+proc sect 1
+photoshop 1
+nwu.edu 1
+object track biom 1
+geoph 1
+lordship high author 1
+pixel wh valu 1
+order to read 1
+rough pictur 1
+maim incur forever 1
+tim sup 1
+biolog vrij universiteit 1
+pecl 2
+categor 6
+mechan div stat 1
+random link 1
+offer a rang 1
+us th term 1
+register entr 1
+palmer 1
+sen list 1
+embrac 2
+pedr 3
+hypermail.html 1
+sun at buff 1
+georg 6
+why minoan 1
+opt sect 1
+neat thing 1
+austin th xenopus 1
+journ cont 2
+biotech month 1
+excel med imag 1
+macintosh ba 1
+sc mus 1
+peer 4
+forthcom event guid 1
+tal is told 1
+wif now go 1
+pag start point 1
+adapt solut model 1
+rasmol homep rasmol 1
+surf by tak 1
+sit at marathopol 1
+gail 1
+support for cour 1
+robot and softwar 1
+gain 4
+support standard me 1
+val men 1
+mater avail 1
+hear them mak 1
+mechan biolog 1
+structur imag 1
+dr mik pe 1
+user input qu 1
+intern collabor 1
+geolog companion 1
+reservoir 1
+quest answer 1
+cour provider 1
+onl centocor 1
+rout had gradu 1
+onvil larg yellow 1
+dth01 ic.ac.uk 1
+biolog karolinsk institut 1
+nsp eastern snowboard 1
+an bibliograph 1
+com doc web 1
+edg wil slip 1
+articl for inclus 1
+commun using 1
+using open loc 1
+promin peak 1
+koflach valug 1
+bookl 1
+suff tr 1
+massachus is foc 1
+webcounter 1
+fair larg dial 1
+eger 1
+succ and work 1
+univer collabor 1
+quebec univer univer 1
+mackenz 1
+plan geometer reason 1
+archiv ar typ 1
+ge th macintosh 1
+us resourc rel 1
+gcg softwar docum 1
+av pag 1
+saturd 2
+wheat 2
+load automat 1
+cit grow 1
+pluridisciplinair de relig 1
+electrotherm siml 1
+telnet se 1
+slain by blow 1
+prov a stud 1
+educ an pag 1
+skil or unskil 1
+bankit mater saf 1
+peip 1
+bohem in czech 1
+dan hom pag 1
+me organ war 1
+cur optim 1
+tel your client 1
+giftran sourc 1
+wish to rec 1
+ba mach 1
+court wil be 1
+orthop biomechan 1
+acc to textu 1
+hypertext author system 1
+draw th button 1
+surfac marker 1
+dead celebr celebr 1
+jah wobbl 1
+form in trom 1
+discov system 1
+se bil 1
+gi appl arc 1
+url for bioinformat 1
+want to download 2
+green carp 1
+frendship did lodg 1
+ten in minoan 1
+deposit of pot 1
+inform he cur 1
+widespread 3
+defin th var 1
+plac of saf 1
+me o crystallograph 1
+trust wom word 1
+austr nat 2
+robot player 1
+contempor design softwar 1
+sauing your tal 1
+lept magn 1
+cs research centr 1
+draft ind search 1
+pr technolog 1
+drawn by john 1
+pilot 3
+specif me 1
+behold 2
+usag command 1
+grunteth 1
+karl and josh 1
+leed metropolitan univer 1
+vendor commerc 1
+creat th guid 1
+wheel 2
+renfrew model account 1
+mus st 1
+center for human 1
+spac trail 1
+teach 9
+cr anachron art 1
+using such skil 1
+school of cl 1
+harbor labor 1
+tran cfcfcf 1
+posit ink 1
+multit harmon stead 1
+st archieplec 1
+cooper with cap 1
+ind serv 1
+remember that articl 1
+nrl 3d 1
+asiut 1
+penc 1
+loc new 1
+quer ge 1
+techn nic 1
+whereb it grew 1
+titl follow 1
+cour mater 2
+ar cover 1
+penr 1
+lab al interact 1
+opinion shal me 1
+pent 1
+subst hc 1
+contool 1
+ther liueth 1
+gard 3
+tamper med 1
+retain a strong 1
+garg 1
+educ journ refer 1
+garl 1
+bearyng 1
+therm circuit siml 1
+tak responsibil 1
+transm lin matr 2
+relig grecqu anc 1
+fin skil 1
+reciproc in tim 1
+oct stream tar 1
+point for cus 1
+cam hi hous 1
+nyc with scad 1
+cultuurgeb 1
+sant claus miscellan 1
+term in contempor 1
+boost 1
+tim tak 1
+gasp 1
+electrotherm compon model 1
+attraver limpr 1
+fortif wal 1
+obeletz articl 1
+speak 3
+atdb c.elegan 1
+egypt mathemat 1
+configur opt sect 1
+biom research mi 1
+frivol to recit 1
+spring harbor 1
+archaeolog serv 1
+project 34
+conver your imag 1
+skal computer 1
+emerg soc hierarch 1
+mlmfaq 1
+prompt for paym 1
+wrestl 1
+cr of view 1
+tim to perform 1
+adam kehrl 1
+perc 3
+br a braul 1
+stead st tran 1
+cambridg scientif 1
+bottl al 1
+ba an 2
+perl 2
+perm 7
+deut da 1
+specl 2
+superior 1
+enj a wid 1
+gibcobrl 1
+st spac decomposit 1
+biotechnet 1
+perturb supernov 1
+server o center 1
+snowboarder would re 1
+liquid 1
+pattern sw 1
+avail by mean 1
+multim author web 1
+talk turk 1
+cur optim method 1
+richard cl charl 1
+men to butch 1
+secon exploit 1
+classroom produc 1
+ballad intytl 1
+pol appear 1
+great a task 1
+inclus th web 1
+obtain vi anonym 1
+speed 5
+ac an 1
+batson eit.com 1
+non transpar cop 1
+perfect strength 1
+petr 1
+system at cmu 1
+conf direct 1
+model labor 1
+photograph of gradu 1
+bioph alber research 1
+romain 1
+mak th quest 1
+cal to jeronim 1
+arrow hom pag 1
+contour 1
+goal is mak 1
+rel fund council 1
+rap and buckler 1
+dan rom 1
+wherein their li 1
+unfortun ilm 1
+common kil 1
+industr univer collabor 1
+serv o protein 1
+departm of mathemat 1
+precompil ver 1
+archaeolog dialogu 1
+di bacter 1
+earnest hart 1
+pang of death 1
+spirit of co 1
+lou missour 1
+var speech rel 1
+ng7 2uu 2
+phy and teach 1
+universidad di zaragoz 1
+singl and contribut 1
+bruxel in belguim 1
+univer th univer 1
+eastern edg p.o 1
+fe for 1
+rain film 1
+largest 7
+effort involut 1
+past curv 1
+molecl physiolog 1
+ar of dist 1
+took plac 2
+comp.infosystem.announc search eng 1
+weathertop hom pag 1
+en in gif 1
+asid 2
+receiv from standard 1
+gam int pbem 1
+brooklyn colleg 2
+bath at lept 1
+creat a fil 1
+aegean palac var 1
+surround environm 1
+great endanger 1
+wood 3
+cognit sc 1
+pr put 1
+vnder hi trayn 1
+wool 1
+implaus altru 1
+rat terminolog 1
+chemister and microbiolog 1
+cariadoc miscellan 1
+par el 1
+featur asymmeter design 1
+wherb 1
+anc world cultur 1
+text html 1
+shallow 1
+motiv surviv 1
+school of or 1
+biochemister on lin 1
+an bod 1
+saf at bod 1
+kevinh 1
+argv wer lyuyng 1
+world wh 1
+biotechniqu magaz 1
+url contain lot 1
+hbplus 1
+av term 1
+web offer 1
+flec manufactur 1
+archaeolog museum 1
+halv feast cost 1
+rialt 1
+dat arriv 1
+compar th chang 1
+variabl random 1
+bad him com 1
+tail to minim 1
+vsing 1
+algorithm 2
+medief stud 1
+bacillus subtil nrsub 1
+articl mot 1
+sev palaeolith 1
+remap 1
+search serv 1
+word 16
+mailcommand command 1
+dv fil ver 1
+effect publ rel 1
+work 31
+worm 1
+pharmacolog molecl 1
+nixon 1
+eng other subject 1
+parenth 1
+zealand 1
+whereb for lack 1
+mycenaean sit 1
+inhum 1
+valu accord 1
+woolf 1
+genet engineer micr 1
+accuml 1
+fl equip 1
+audit 1
+inclus a versatil 1
+client want 1
+st tool recover 1
+cit in modern 1
+disc list law 1
+sunnyv cal 1
+mon th 14th 1
+developm of lead 1
+tim a man 1
+relev concept 1
+spent 2
+giftran t ff7f40 1
+filemod oct number 1
+direct of peopl 1
+retr th program 1
+spec administer organ 1
+mak no prom 1
+number and addr 1
+compon valu genet 1
+want to brow 1
+method in aplac 1
+apol creat 1
+photograph tak 1
+ch th unskil 1
+woud 1
+brookhav nat 1
+tarantin 1
+dr josef bigun 1
+kind i shew 1
+toun he go 1
+period defin 1
+se a fl 1
+off th staff 1
+mi stud newspaper 1
+center tongu 1
+catalogu 3
+henr kirkham 1
+sor hurt 1
+janeir 1
+typ genet optim 1
+uk ind 1
+sherrat secon produc 1
+imagearch 1
+computer graph 3
+pinnyng 1
+truth but chang 1
+paulig ltd 1
+sword is longer 1
+navig flight 1
+ec.uv.ca for further 1
+tabl hist 1
+perfect fight 1
+fram pag 1
+earl marsh 1
+heart did ri 1
+gif87a fil 1
+substr 1
+ve starck 1
+workst support 1
+mountain user 1
+palac var 1
+hold forth 1
+amd hang 1
+ein buch von 1
+fr serv 1
+sup your gif 1
+et recherch 1
+badam explain 1
+protein identif resourc 1
+compon list 1
+hour of oper 1
+whiteboard 1
+ctil workshop 1
+new mult 1
+format hd 1
+lexicograph 1
+cur print 1
+bioph soc 1
+pr yield 1
+genom resourc 1
+hierarch organ 1
+biom prec engineer 1
+ein buch 1
+tool to support 1
+minoan cultur 1
+mak incr 2
+winograd departm 1
+ba qu 1
+cal train stat 1
+mathemat and natur 1
+cr tool 1
+geosim interfac libr 1
+gustav imsd.meb.un 1
+me in fight 1
+inform on fam 1
+www.eit.com 1
+bsd rel stuff 1
+subm for tr 1
+bioph u.s 1
+brit mach vi 1
+men shal break 1
+becom us 1
+therefor is sooner 1
+impact on medicin 1
+period is requir 1
+entr wil run 1
+loop control 1
+rec et redempt 1
+ext th program 1
+keyword 5
+univer o motif 1
+somewhat lik catch 1
+ar mail list 1
+ecolog dynam 1
+wh i liv 1
+comput biochemister 1
+diver 2
+rel cour 1
+del food 1
+al bewar 1
+mechan and electr 1
+siml therm network 1
+web virtu libr 1
+biochemister metabol 1
+taxonom 1
+us peer pressur 1
+beekeeper 1
+appear problem 1
+gen of mediterranean 1
+foldoc mirror 1
+iest tal 1
+withstand 1
+cur c ver 1
+server o univer 1
+exhaust 1
+caus to li 1
+quarter 4
+strongest man 1
+continu upd 1
+remain their foc 1
+text retrief 1
+growth 6
+rel docum 1
+direct 27
+neurobiolog lab brand 1
+said sh 1
+individu stud 1
+system program 1
+predict from sequ 1
+sol hypertext edit 1
+direct together prov 1
+loc stuff 2
+endeauour 1
+list of biolog 1
+research publ inclus 1
+web sit 9
+rest of ecosystem 1
+def both blow 1
+da spec 1
+imag with gr 1
+sit collect 1
+strong singl 1
+mad avail report 1
+unstructur environm 1
+perform whatsoever 1
+biolog internet 1
+said shal soon 1
+isotop chronolog 1
+fring cont 1
+mad as slow 1
+day a week 1
+virtu sold 1
+learn technolog program 1
+diplom vs 1
+divid 2
+port by ncc 1
+divin 1
+valu resourc 1
+ar of docum 1
+univer collabor mak 1
+nc httpd ver 1
+part of speech 1
+remot 1
+elizabethan 1
+imag or sound 1
+remov 4
+evolut group 1
+lbl lawr 1
+developm ressourc 1
+trad network 1
+agent or pat 1
+center american psycholog 1
+popl disc 1
+scor sit 1
+wheat and barl 1
+palat centr plac 1
+sword 1
+eu deal 1
+archnet europ 1
+report he got 1
+malt advoc 1
+black05.nad.kth.se 1
+lad neuer win 1
+new ballad intitl 1
+developm and computer 1
+month wh 1
+nlp confer 1
+lou tewdwr 1
+or research 1
+st about utah 1
+beowulf 1
+gener hospit departm 1
+cookbook 1
+excav 4
+lif workshop 1
+dismember 1
+unacquaint 1
+jumbl 1
+noblem and gentlem 1
+harvard med 1
+signif aspect 1
+pir genbank 1
+toront o departm 1
+seekyng their lad 1
+detail mac 1
+internet resourc pag 1
+research organ 1
+inclus a sampl 1
+fl scal 1
+digest o sen 1
+caus to ru 1
+se result 1
+peopl publ guest 1
+improv shipbuild 1
+inc universit 1
+4th mil b.c 1
+sen four format 1
+prelimin plan 1
+saccharomyc 1
+cun ital 1
+opinion in biotechnolog 1
+biotechnolog resourc intern 1
+day befor month 1
+quest and answer 6
+citadel 1
+sword targ man 1
+chemister univer 1
+cr transpar imag 1
+architectur center 1
+park virtu cour 1
+rel of sw 1
+orwel 1
+articl from miscellan 1
+man stand watch 1
+mail ctil 1
+honor and inestim 1
+loc in compar 1
+miscellan 8
+acknowledg th continu 1
+do primer 1
+elsewh 3
+archiv html fil 1
+protein emor univer 1
+ba to spec 1
+excel 5
+sort by subject 1
+strik sound 1
+concern th top 1
+congratl 2
+molecl biolog 2nd 1
+descript 9
+agn beatr read 1
+north of romanou 1
+list of undergradu 1
+eirean cl 1
+pointer of interest 1
+gopher 8
+futur prospect 1
+refer html 1
+jam yal.edu 1
+analyzer calibr 1
+phy chemister pen 1
+rang of enh 1
+stand upright 1
+tim th pag 1
+obitu 1
+loc in beaut 1
+letter is read 1
+atar 1
+ge a feel 1
+ph.d 2
+se th pag 1
+grief 1
+help system 1
+univer o cyberbotan 1
+dynam program 1
+alloc th ar 1
+grieu 1
+ib ar fair 1
+nat and intern 1
+univer in canad 1
+find seek 1
+graph so run 1
+gambl env 1
+marc andr origin 1
+system for robot 1
+almain 1
+peak in ol 1
+bioph institut 1
+prov nationw weather 1
+archaeolog remain prov 1
+spectroscop wak 1
+05pm pst 1
+autom proc 1
+atcc 1
+cur refer 1
+verif your server 1
+electron or print 1
+usag command lin 1
+www link 1
+condit by spat 1
+franck 1
+inspir 1
+popl shift 1
+atdb 1
+compan al offer 1
+vi imag 1
+excit 3
+hombl kneel 1
+third wa vinc 1
+world cultur 1
+build alter 1
+mathemat biolog imag 1
+markus meister 1
+contribut by april 1
+genom sequ datab 1
+visit to ireland 1
+forest bil except 1
+psycholog 2
+pueschel imsd.meb.un 1
+light proofread 1
+variabl that hypermail 1
+proc to natur 1
+bulmersh 1
+eastern meditterranean 1
+utah snowboard unfriendl 1
+hard th year 1
+annel mar 1
+act discourag 1
+transpar i us 1
+marker and underground 1
+genet coevolut 1
+look at tomasz 1
+portrait gal 1
+republ 3
+acknowledgm 1
+val archaeolog project 1
+lim fr dem 1
+subtil 1
+fuer molekl biotechnolog 1
+electr p50 1
+epistyl block 1
+ul phon 1
+good lord 1
+whereb 1
+load libr html 1
+keep peac 1
+utrecht 2
+grant to cop 1
+langu interfac 1
+chain 2
+review on hyperm 1
+harmon 3
+fl of beer 1
+inform on imag 1
+misc virtu 1
+chair 3
+de test 1
+loc inform 1
+men shal seek 1
+prent hal publ 1
+weather format 1
+ot loew center 1
+continu in school 1
+liquid mater 1
+effect etc 1
+kind of problem 1
+dancer 3
+escap hi censur 1
+work prototyp 1
+but caf 1
+bruer leapt 1
+slow but const 1
+mckusick 1
+fanc log 1
+tupac 1
+imperfect 1
+qualif 1
+tool cal giftool 1
+olog en 1
+metabol pathw 1
+cram disqu 1
+creat and upd 1
+labyrinth 1
+lou caus yong 1
+assoc with natur 1
+biom comput 1
+fit th statur 1
+palac center 1
+ind what light 1
+strik and thrust 1
+matter 3
+biochem bost 1
+html tag 1
+morow to night 1
+grind 1
+j.r.r tolk sit 1
+libr sf chronicl 1
+thruster li 1
+futur port 1
+siml using aplac 1
+ba tabl foc 1
+biochemister coursenot 1
+cr is mad 1
+issu ar avail 1
+siedlern zu 1
+dat transport 1
+visit my gal 1
+champ 1
+blastomer 1
+exerc in molecl 1
+auf deutsch 1
+alph pc run 1
+fel ver sick 1
+internet account 1
+benson op c.b 1
+computer appl 1
+preh fortif wal 1
+chanc 6
+exerc o cour 1
+men hav lost 1
+chang 18
+greater support 1
+sixteenth annu 1
+datab for escherich 1
+beleeu 1
+post gradu cour 1
+renam 1
+nucl of settl 1
+bronz ag 3
+hydrophil 1
+lordship wisdom 1
+stationer register 1
+warn wel 1
+tim green david 1
+german o imag 1
+diversif sub ba 1
+cyprus nem val 1
+forest bil 1
+allow snowboard 1
+den how dbh 1
+macintosh ver 2
+gif89a conver 1
+imag copyright 1
+do vanish 1
+wh i mak 1
+accompan 1
+se sect 2
+protein in cel 1
+honor th paradox 1
+roy palac 1
+proper lik autom 1
+virtu spac 1
+th th tim 1
+avail under window 1
+imag scan 1
+catalog ha pointer 1
+creat repr 1
+tim estim 1
+cloth customer 1
+brockman 1
+distribut th docum 1
+biolog inorgan chemister 1
+emerg 2
+atom 1
+appear th serv 1
+collabor visu 1
+cotsold 1
+pr belong 1
+rack 1
+try to return 1
+seek correspon 1
+charg 3
+world web 1
+fight soever 1
+charl 3
+charp 1
+datab o mous 1
+arranger 1
+chart 2
+look quit simil 1
+prov my point 1
+qu man acquaint 1
+mediterranean mater 1
+datab seqanalref 1
+fr indeed 1
+season foc 1
+ideolog 1
+extent of cultiv 1
+stud of anc 1
+tlm workshop 2
+wherof 1
+ca western 1
+nok mobil phon 1
+funct prototyp 1
+shorter tim 1
+customer 4
+chast 1
+pennsylvan st 1
+comput officer 1
+pixel valu 1
+mercer 1
+impact 5
+put in great 1
+term th emerg 1
+biolog universt salzburg 1
+ad acc 1
+singl hybrid produc 1
+hydrophob 1
+pinch 1
+signif to migr 1
+tim in fight 1
+destefan wh.com 1
+writ lov 1
+fewer 1
+england 6
+disorder 1
+doest 1
+wh leukaem 1
+soil structur 1
+ind for producer 1
+ba browser 1
+aplac circuit siml 1
+front 4
+pag maintain 1
+imag commun 1
+nic htlm 1
+natur man tim 1
+doeth 1
+text or html 1
+built in stiffener 1
+rerout 1
+artif ingellig 1
+radiograph 2
+finger utah mi 1
+sud phenomenon 1
+receiv thousand 1
+tim of writ 1
+fieldwork 3
+go fight 1
+latest inf 1
+humb com 1
+rel resourc sen 1
+world wid 10
+remember how misus 1
+softwar guid 1
+pl se http 1
+de la cultur 1
+refer to com 1
+pract or think 1
+satel 2
+southwestern 2
+al cald 1
+follow their fight 1
+cant and jewish 1
+bakait 1
+tvontar 1
+algonquin 1
+rec a blow 1
+john hannegan 1
+for to dissem 1
+interest ca 1
+ec power 1
+colleg psycholog departm 1
+anthropolog univer 1
+rail 1
+avail to member 1
+luxembourg 1
+rain 2
+weather map biolog 1
+greek manuscript 1
+transpar tool cal 1
+whereb it com 1
+adv biotechnolog center 1
+neck and til 1
+paleolith remain 1
+york univer 1
+harvest resourc 1
+mak wiser 1
+form of mail 1
+prospect in cooper 1
+basel bionet.softwar.www 1
+botan remain 1
+interrelationship 1
+u.michigan genom 1
+mischief and imperfect 1
+ong project 1
+deriv from 4.3bsd 1
+seigneur 1
+method ba 1
+work in group 1
+de electr 1
+traff project 1
+chem labor 1
+mim.typ 1
+nucleus.harvard.edu stev brenner 1
+snowboarder and sk 1
+barbar departm 1
+lot to help 1
+ludwig maximil 1
+romanor 1
+quest i post 1
+romanou 1
+web server sipb 1
+upland 1
+rudjev boskov 1
+amherst colleg 1
+south florid excav 1
+secr of chop 1
+ma black05.nad.kth.se 1
+finger salisbur dexter 1
+telnet 1
+pr mayd 1
+st cannot reach 1
+cor structur 1
+francisc st 1
+harmon player 1
+form expr 1
+bsd sourc cod 1
+specif archaeolog sit 1
+aud playback 1
+softwar direct 1
+pharmaceut chemister molecl 1
+3rd mil 1
+mel nicholson 1
+salt lak cit 1
+season reindeer sant 1
+baight 1
+mean of textu 1
+univer program 1
+view sh 1
+graph and scientif 1
+breaker bird 1
+foot for 1
+pr rel 1
+rang 14
+rank 2
+research ar inclus 2
+capacit accelerometer 1
+nucl ac datab 1
+look for organ 1
+pag depart 1
+browser window 2
+investig th proper 1
+determ strong suggest 1
+molecl biolog onl 1
+col metabol 1
+nic and smooth 1
+singl weapon 1
+protect stranger 1
+oregon teach mater 1
+langt michael 1
+el skirb 1
+mon architectur ensembl 1
+wish no fr 1
+offer unsubscrib 1
+mak thing 1
+seldom fight 1
+loc pag 1
+program that maintain 1
+publ inclus titl 1
+nam is david 1
+dieg aerospac museum 1
+coar 2
+refernc 1
+maintainer 2
+research conduc 1
+abroad 2
+electr computer 2
+discover th pot 1
+skyl not yf 1
+aplac optim interfac 1
+therefor thing 1
+planck 1
+linkmonster a categor 1
+educ support 1
+non profit nat 1
+email list 1
+tecah 1
+help chang 1
+string exact 1
+aqu anim 1
+stev brenner s.e.brenner 1
+dellantichit 1
+palynolog 2
+sk show 1
+cop to addr 1
+giv credit 1
+sullecthum 1
+monit 2
+igbmc strasbourg univer 1
+perfect 3
+largest program 1
+web hypertext 1
+maint of imperfect 1
+lib ucdav.edu 1
+wel way 1
+calendar 1
+watch to tak 1
+av rel 1
+protein superfam server 1
+justin knight yueh 1
+thornt 1
+yah spit 1
+al and greenough 1
+planet 3
+wonder why 1
+program hard wir 1
+blank lin 1
+snow when learn 1
+joigner 1
+it mov 1
+pl al consult 1
+institut for biom 1
+arlingt magnet reson 1
+cl teach 1
+proc and an 1
+thrust is mad 1
+imperfect and insuff 1
+utah snowboard 1
+cd40l defect 1
+run magaz 1
+heard man hold 1
+isaac asimov faq 1
+geomorpholog recon 1
+cibachrom stev 1
+gl paper 1
+lot of good 1
+rossner at crossner 1
+worthingt biochem corpor 1
+institut fuer 2
+exceed demand 1
+biomolecl model labor 1
+troubl 4
+nam and number 1
+interdepartm gradu program 1
+coff 2
+libr html helper 1
+act wer highlight 1
+hilt to def 1
+archaeolg 1
+non triv geometer 1
+ai lab publ 1
+balt ic 1
+pag to se 1
+rec with favor 1
+transducer95 eur 1
+download imag 1
+input a text 1
+model inclus ph 1
+follow link pag 1
+tag lingu 1
+appoint 1
+rap buckler fight 1
+com check 1
+cant from ntb 1
+particl docum mak 1
+pr o an 1
+front pag 1
+text corpus 1
+new.answer mail list 1
+ne assyr text 1
+addr th task 1
+council and df 1
+tyl cupid hau 1
+qu satisf com 1
+remember 7
+fifth color 1
+html format emac 1
+shelmerd 1
+staff and mor 1
+libr o jav 1
+mer iest tal 1
+record compan 1
+leader and educ 1
+lost th us 1
+aerospac museum vliegclub 1
+hold th pommel 1
+straus lab 1
+aid for biochemister 1
+schneider 1
+aim to stud 1
+shortest 1
+web chart link 1
+medief mater 1
+cost rout 1
+world wyl 1
+kenneth m stewart 1
+character string 1
+inv ar month 1
+multipl 7
+proceed edit 1
+coin 1
+sub econom 1
+cr an inclus 1
+techn 12
+men wil ge 1
+mandarin hyp 1
+frequ dep 1
+foot is got 1
+init concept 1
+saf th point 1
+discourag 1
+rough pl 1
+paleoethnobotan 1
+interest sc 1
+perfect knowledg 1
+aal recom 1
+incorpor 6
+subject ba 1
+boot prov minim 1
+lo your bal 1
+instituut 1
+rayn 1
+combin caesar expedit 1
+asiut project 1
+th touch 1
+journ o abbot 1
+island advoc 1
+format 14
+neolith and thus 1
+academ year 1
+natur langu interfac 1
+isrec bioinformat 1
+honest 1
+tun manu optim 1
+herit campaigner 1
+an de 1
+lewthwait 1
+anu soc sc 1
+colb 1
+univer of utah 2
+regard group 1
+win your lordship 1
+cold 2
+construc shap adapt 1
+tun manu 1
+soever a blow 1
+border altogether 1
+word proc 2
+doubt quest 1
+search law lib 1
+lin journ 1
+singl string 1
+lo defin top 1
+colb colleg 1
+pathw boehringer mannheim 1
+alinar 1
+man lif 1
+hap bryng 1
+arch to read 1
+contool ar avail 1
+exchang 8
+resourc centr 1
+orchestr work tier 1
+comb 4
+silicon capacit accelerometer 1
+tread cob 1
+rn secon structur 1
+alber 2
+unapt 1
+augm 1
+new serv 2
+coml 1
+comp 5
+harmon stead 1
+inclus common 3
+facult adv 1
+difficult 3
+nin liv quest 1
+departm phon 1
+conc 2
+maid fac 1
+dat master 1
+earth for fish 1
+conf 3
+month 9
+aeronet hom pag 1
+conl 1
+adult to commun 1
+montr 1
+clarif 1
+protein model 2
+cont 16
+sampl a tot 1
+conv 7
+ecv confer list 1
+cooper cam 1
+cel mov contractil 1
+gaiter 1
+list mail 1
+mer th said 1
+unarm 1
+island of cr 1
+diplom 2
+differ consider 1
+highlight in yellow 1
+former 3
+reg of initialyour 1
+samnit 1
+zu den tr 1
+cook 3
+cool 2
+verd and fish 1
+escherich 2
+claudius 1
+log bionet.molb.methd 1
+server to par 1
+def and off 1
+franc mic 1
+report introduc 1
+05nov93 1
+assoc with fossil 1
+cancel digest 1
+big mag 1
+rn world 1
+seen any go 1
+forc th browser 2
+st in cr 1
+den veg coast 1
+filip 1
+us apol 1
+copt 1
+southwest 1
+altern model 1
+cam ca workst 1
+mak perfect 1
+nmsu 1
+great pac 1
+staff wil prov 1
+lust lik men 1
+great pag 1
+import of funct 1
+net www gopher 1
+biodiver 1
+cs.vu.nl 1
+arboretum herbar biodiver 1
+know what featur 1
+acc to contempor 1
+var speech 1
+industr light 1
+pressur to ge 1
+4.x bsd oper 1
+keep a register 1
+colel 1
+corn 1
+corp 3
+princip method 1
+root docum direct 1
+fifth edit 1
+promot superior 1
+softwar vendor commerc 1
+sunnyv origin 1
+sum as follow 1
+put aw ach 1
+cit sport desk 1
+formid 1
+man const 1
+hast doeth 1
+transit 3
+de cultur lat 1
+tim a client 1
+corp with cruel 1
+power dol 1
+an kr 1
+seem an upstart 1
+poniard men 1
+snowboard tabl 1
+cosm 1
+helpl 1
+anthon mother 1
+season reindeer 1
+freestyler complain 1
+cost 7
+cur profil dism 1
+select of nift 1
+acc plac 1
+injur 1
+layout draw 1
+reach being longer 1
+speech project 1
+maximil 1
+viewer 2
+break thy 1
+rel text proc 1
+prouerb 1
+orthodont 1
+fresh microbrew 1
+bioproduc 1
+pyl reg archaeolog 2
+cop th link 1
+ignor th refer 1
+travel between lak 1
+introduc to ultr 1
+vertebr developm biolog 1
+suburb 1
+read pag 1
+rehabilit 1
+st on bel 1
+ea fight 1
+cour 20
+imag and readm 1
+subscrib 2
+surfac group newsletter 1
+limerick limerick ireland 1
+valu rang 1
+number repr 1
+browser 15
+untru weapon 1
+anu soc 1
+univer and facult 1
+taught in school 2
+longer ec 1
+pl or fight 1
+straight ftp 1
+link to hyperflow 1
+hear childr 1
+off and forc 1
+contractil system 1
+resort manag 1
+giv surplus 1
+interpreter typ langu 1
+bitter 1
+biolog inorgan 1
+nam in hieroglyph 1
+lotus 1
+soc impl 1
+model th mechan 1
+exemplif 1
+hypermail m www 1
+week idiom 1
+lin catalog 1
+wyl mer 1
+brit academ 1
+strong and agil 1
+whereof com 1
+consider that poyson 1
+pr o rn 1
+compiler langu 1
+writ guar 1
+ey trick 1
+part to promot 1
+accelerometer 1
+comparison 1
+suff instruc 1
+fifth intern 1
+siml an 2
+fil empt 1
+million dol sk 1
+snowboard feder 1
+conv length 1
+ausp 2
+montr o biochim 1
+tim th unskil 1
+protect against unauthor 1
+microbiolog pyr ma 1
+siz ver 1
+respon is accept 1
+transpl 1
+saying hel 1
+intern et 1
+nam def 1
+tech inform 1
+gerald 1
+auth 1
+wast bandwidth 1
+carv a turn 1
+autm 1
+softwar o san 1
+trad wa respon 1
+reag catalog 1
+medicinemedicin antiqu anc 1
+nam dew 1
+disc som tim 1
+archieplexform at rudjev 1
+ush pl 1
+annel mar drecker 1
+inform nat 1
+scold 1
+carbon 2
+exampl is follow 1
+soc and cultur 1
+park cancer 1
+herit conserv 1
+manufacturer act discour 1
+genet and molecl 1
+univer of zuerich 1
+serv aal 1
+se their hand 1
+dr mik 1
+month wer gon 1
+appropr docum typ 1
+forth bloud 1
+colon 3
+lo affil 1
+prelimin result 1
+color 8
+jerem th tech.mi.edu 1
+find specif inform 1
+uncertaint or mischief 1
+vid ba 1
+portug email 1
+album 2
+thought it great 1
+subject tr 1
+an us 1
+tran and stead 1
+cont rel resourc 1
+snowboard talk 1
+hc launch pad 1
+confer resourc centr 1
+foot calendar misc 1
+ker syr cultur 1
+sit fr sampl 1
+team ba 1
+chang th valu 1
+newsstand th reach 1
+publ and techn 1
+word wa defin 1
+giv foul 1
+ital fencer 1
+welcom to stoddard 1
+scool 1
+tv rad 1
+good a man 1
+95th 1
+after 1
+educ not 1
+molecl biolog design 1
+dam can def 1
+inform new 1
+cdnow 1
+bioscan sequ simil 1
+remain 7
+fair maid 1
+bouman 1
+leukaem 1
+niccol castiglion 1
+claus sant claus 1
+secr sent 1
+geometer model 1
+internet o bacter 1
+induc alter 1
+mov univer 1
+christus 1
+quebec 1
+mmd pag 1
+mobil platform 1
+weak to def 1
+assemb 2
+thereb perceiv 1
+neurosc internet 1
+unedit 1
+fr form 1
+switch 3
+tim incr 1
+map and mark 1
+popl yah 1
+mailb list 1
+correct any obv 1
+u.michigan 1
+morgan 1
+scorn 1
+cancer inc 1
+univer of alabam 1
+alp equipm 1
+millesjg sluvc.slu.edu 1
+technolog confer 1
+intern nc 1
+icec96 1
+ask system 1
+computer softwar manu 1
+id or mater 1
+shop is great 1
+st aa 1
+jambw 1
+confer nramw97 1
+archiv biocatalog 1
+festiv genealog 1
+direct and classif 1
+shop hi tub 1
+st an 1
+postproc 1
+wrap 2
+se ver peac 1
+repr th me 1
+pr grappl 1
+st ba 1
+docum suff 1
+neil gendzwil 1
+boaster 1
+plac to visit 1
+snowboarder hav start 1
+sim charl 1
+cloth and acc 1
+hug award nebl 1
+run nt 1
+plac and tim 1
+mus guid 1
+al and beer 1
+tru bi direct 1
+eu corner 1
+me bod 1
+unidirect 1
+thyng 1
+un grot orn 1
+gav out speech 1
+chang and therefor 1
+mjquibu uc.edu 1
+sunnyv cal train 1
+proofread 1
+biotechnolog research program 1
+cod search langu 1
+inform found loc 1
+button ar design 1
+defect 1
+wh th big 1
+ecolog dynam growth 1
+burgdorfer 1
+tlm fortran tlm 1
+articl when using 1
+cooper walk 1
+man may 1
+datab sw 1
+wiener 1
+group o oxford 1
+term crop failur 1
+arch co 1
+palynolog an geograph 1
+season river 1
+anc cit 2
+exampl of search 1
+brief not 1
+15jun94 1
+control 8
+anc build 1
+learn confer abstract 1
+wir intern default 1
+imag to becom 1
+reveng 1
+intern confer 4
+cl review cl 1
+ath greek manuscript 1
+ge a4s 1
+phon 9
+cd40l 1
+univer of mcgil 1
+tim in gentl 1
+phot 3
+brok head 1
+remark 2
+se he sorrowfl 1
+keep out straight 1
+diffract 1
+arch ec 1
+gentlem stand 1
+louer 1
+langu anc 1
+scarc tak 1
+find mi artif 1
+arm ar inf 1
+number ar nec 1
+read th fil 1
+brit aerob assoc 1
+caught th black 1
+pronounc milit ten 1
+no parameter 1
+contain form expr 1
+select of inform 1
+group on project 1
+digest format 1
+avbp 1
+nothyng but light 1
+vpon th mold 1
+major ar 1
+manufacturer 3
+find th album 1
+season prev season 1
+achil a runaw 1
+universidad nac 1
+human act 1
+classroom 2
+hm dir 1
+opt show 1
+urban found 1
+baltimor 1
+peopl star 1
+datab wh 1
+detail explan 1
+disbur a great 1
+labor o nat 1
+email wargam 1
+typ of hist 1
+mailbox to read 1
+lith and ceram 1
+riddl 1
+structur classif 1
+sword ha adv 1
+pronounc 2
+rygorus rag 1
+grandeur 1
+harold 1
+avbp chair sw 1
+fil nam count 1
+univer of missour 1
+collect of cheat 1
+contain form 1
+ftp server 4
+alp board 1
+say cult 1
+writ 21
+dog and hamburger 1
+clearingh of internet 1
+cus serv 1
+quick th ri 1
+sensit 1
+rider 3
+willeth 1
+slept fl 1
+broad contempor developm 1
+interact autonom 1
+wam.umd.edu 1
+valug lit 1
+high to teach 1
+kuism 1
+helpl us intern 1
+aver 1
+lisqu dan rom 1
+mim th phy 1
+man acquaint 1
+gaspard mong 1
+prec isotop chronolog 1
+sw quiz 1
+infospac 1
+feast an islam 1
+european bioinformat 1
+ericrc ind.edu 1
+natur sc 1
+skirb institut protein 1
+stud of settl 1
+spher 2
+natur se 1
+hypertext ba learn 1
+wh wealth 1
+board featur asymmeter 1
+rassegn del 1
+resourc discov 1
+henr david thoreau 1
+perfect teach 1
+browser should displ 1
+aol mirror 1
+pol an 1
+sc millipor 1
+keep saf 1
+ge to publ 1
+want to giv 1
+rf engineer 1
+jam moyc 1
+reminisc of huxl 1
+neyghbour 1
+fil as appropr 1
+collect computer 1
+thesaurus lingu graec 1
+register 12
+remayn 1
+fair mayd 1
+ded to coff 1
+hap man 1
+dr poor 1
+vinc school 1
+loew center 1
+bureaucr 1
+nt.e technik.un erlang.de 1
+count ge upd 1
+giv them ch 1
+agricultur surplus 1
+part what sc 1
+libr de bruxel 1
+cultur and relig 1
+modl ar cur 1
+cur bit 1
+outskirt of silicon 1
+simpl key sequ 1
+avil 1
+draw hi sword 1
+nobl most val 1
+spring kernel 1
+chemister and biochemister 1
+adv technolog 1
+softwar docum 1
+check institut 1
+poor soul 1
+interview with patrick 1
+softwar protein 1
+typ for chemister 1
+turbl 1
+wrot 2
+view and worldw 1
+mac softwar catalog 1
+method that promot 1
+conver gif87a 1
+robot which ind 1
+part annot 1
+therm network electrotherm 1
+insuff and disadv 1
+becom appar 1
+ver inclus 1
+book sit 1
+draw to daunc 1
+ind lik alt 1
+uncertaint great swift 1
+phyl 2
+tel th mail 1
+cod tlm softwar 1
+ethnograph dat suggest 1
+moham najibullah 1
+ludwig 2
+educ educ journ 1
+hospit cancer research 1
+farmer becam 1
+mountain fly 1
+structur structur 1
+narrow 2
+camer read a4 1
+ital fight 1
+mak sur new 1
+program of ext 1
+nntp 1
+staff and postgradu 1
+mil southeast 1
+resourc do primer 1
+jefferson gerald joyc 1
+nalek mlmfaq mlmfaq 1
+regener 1
+as web stroller 1
+item mad spec 1
+down th str 1
+growth ar 1
+young man 1
+rough talk 1
+phillip 1
+cd40lb th european 1
+var spool 1
+fight is perfect 1
+men desir 1
+exerc 6
+perl that run 1
+chang quit dramat 1
+direct ba 1
+search th listproc 1
+st rl 1
+teach both blow 1
+molecl model 1
+field o continuum 1
+serv as econom 1
+4th c ad 1
+ferrer of chartl 1
+bird ey view 1
+design educ 1
+sit of major 1
+peopl from leptiminus 1
+molecl biolog quiz 1
+pilot and rat 1
+crystal 1
+st sk 1
+grad optim 1
+world 27
+molecl biolog gener 1
+molecl biolog genet 1
+renfrow book 1
+cancerlit 1
+arab archaeolog research 1
+interdisciplin symbol system 1
+mailbox or standard 1
+web liter educ 1
+html ver 1
+captain cyril 1
+on.letter d www 1
+cycl cost 1
+field archaeolog journ 1
+pig to stuff 1
+arosnet arch gatew 1
+pat agent 1
+fram maker 1
+preserv drom 1
+ribonucl 1
+loc acc fil 1
+label 3
+composit univer 1
+carv phenom track 1
+salzburg 1
+jf and mesf 1
+pedr biomolecl research 2
+cover with crimson 1
+computer ag 1
+cl charl 1
+quot pa 1
+comir 1
+computer an 1
+sem repr 1
+sweeter 1
+gear 2
+hist highbur 1
+fuller docum 1
+computer as 1
+shelter environm 1
+hist and stat 1
+rel of anc 1
+lsboard conf 1
+funct simil build 1
+lot of inform 1
+award 3
+us for find 1
+nettrain ge 1
+imbrocat 1
+turin 1
+computer ba 1
+rest on bedrock 1
+addtyp appl oct 1
+mil rutger 1
+unencumber with fal 1
+surplus st 1
+st wh 1
+grow number 1
+4.x or sol 1
+northern spain 1
+li aloft 1
+seminar 7
+fac recognit research 1
+tabl of color 1
+louvr 1
+model for therm 1
+utter naught 1
+nitr snowboard 1
+unit st cur 1
+archiv html 1
+good natur 1
+compiler langu resourc 1
+song in foreign 1
+chr liter 1
+zebraf embr 1
+invinc adv con 1
+aerob assoc 1
+us th command 1
+def to learn 1
+hand is deceiv 1
+ancest ha tak 1
+champaign 1
+sf chronicl 1
+finger utah 1
+won in rap 1
+check th list 1
+florid excav 1
+meatb sandwich 1
+ti to fortun 1
+chain pack 1
+ge direct 1
+ten plac 1
+structur view 1
+subl th belong 1
+christopher 2
+structur in town 1
+carrefour www 1
+earliest remain dat 1
+chr topograph 1
+confer on aud 1
+sen any featur 1
+div fl 1
+mak us look 1
+worst 2
+hypertext author 1
+biolog and cel 1
+mart censur 1
+kiv.zcu.cz subject 1
+charl sturt univer 1
+pick 2
+picn 2
+serv saint lou 1
+ceram chronolog 1
+emperor with map 1
+worth 3
+shap adapt 1
+comput center 1
+turnt 1
+mother watkin 1
+pr tal 1
+kind to allow 1
+oblig 1
+leav hi lif 1
+brav weapon 1
+compl 17
+compn 1
+spread 1
+compr 3
+piec 3
+geosim user 1
+cemeter at leptiminus 1
+model organ datab 1
+mediterranean ocean 1
+mail to dew 1
+educ onl 1
+renfrew redistribut 1
+pier 2
+act discour 1
+langu technolog 1
+nodigest separ mail 1
+archaeolog cd 1
+academ educ 1
+gentleman hurt 1
+manuscript found 1
+www chem 1
+search wil find 1
+menus to se 1
+augst 1
+tabl ba color 1
+do beleeu 1
+geir 1
+not of unidirect 1
+rockefeller 2
+shop drop 1
+map of reg 1
+var number 1
+melan mitchel 1
+hydr bon 1
+thrust without lo 1
+silk point 1
+vehem detest 1
+growth and attent 1
+cam vinc 1
+cl and mediterranean 3
+cod tlm 1
+indirect mad 1
+noah 1
+ericac 1
+georg gr 1
+educ fund 1
+labor 10
+gossip sut 1
+offer facil 1
+progr from init 1
+main an 1
+inform scient resourc 1
+darmstadt in german 1
+key aal 1
+command addr 1
+clever horizont rl 1
+birkbeck 1
+wkt cs.adf.oz.au 1
+took th mayd 1
+program wil compr 1
+great im 1
+recognit sect 1
+nobl 1
+collabor mak me210 1
+select model 1
+ct log 1
+faq j.r.r tolk 1
+stev putz creat 1
+user may find 1
+distribut list maintain 1
+hom2.htm german 1
+feel th blood 1
+micr arch 1
+buttr by sovereignt 1
+succ st 1
+poster se 1
+multitud 1
+ucdav.edu or cl.murdoch.edu.au 1
+inst brush 1
+bound integr method 1
+me and workshop 1
+theatr on march 1
+dispatch 1
+which 1
+se fit 1
+incent 1
+igbmc 1
+project group 1
+prot annot 1
+journ refer mail 1
+digit shockwav sit 1
+therunt 1
+pal alt research 1
+genr 1
+great lo 1
+gent 2
+inconv length 1
+off abov park 1
+fict resourc guid 1
+hm overwrit boolean 1
+ch th nearest 1
+found of hc 1
+contain som pointer 1
+refus to go 1
+dat ftp archiv 2
+group imag mod 1
+www ba resourc 1
+coast ar loc 1
+print a web 1
+prev html fil 1
+tat institut 1
+distribut snow pictur 1
+roman bath 2
+thrust both straight 1
+model group 1
+vm ba distribut 1
+spec run 1
+direct tr 1
+egypt 3
+hast th mar 1
+brenner 1
+spac trail tip 1
+award nebl 1
+order personnel 1
+ctil is fund 1
+biotech act 1
+cant album 1
+nodigest separ 1
+mov th fe 1
+tran exampl 1
+hinterland in order 1
+molekl biolog 1
+hypat 1
+pind 2
+run a search 1
+reput 2
+person shop 1
+pink 1
+lingu corpor 1
+rutger imag arch 1
+review of snowboard 1
+sheft museum 1
+pint 1
+resourc biogopher list 1
+molecl biolog promeg 1
+def acquaint 1
+rel resourc 2
+med institut structur 1
+search word promin 1
+loprest 1
+fal to great 1
+bibliothec latin 1
+sutcliff dept 1
+reg magaz 1
+luck 2
+common html quest 3
+ctil forthcom event 1
+per cast 1
+health 6
+aal pol 1
+direct wh 1
+off snowboard boot 1
+jgilber chemhom.html biochemister 1
+center for design 1
+rober lew 1
+nejib ben lazreg 1
+trick for adobephotoshop 1
+anatol tel 1
+computer sc 8
+educ in cl 1
+awar 5
+particl architectur 1
+redeem their lost 1
+smaller mean 1
+gest 1
+cd wh.com 1
+search for mead 1
+irrepar 1
+train docum 1
+noborder 1
+lc.mi.edu 1
+orient approach 1
+click to enlarg 1
+brow th fl 1
+ymmv 1
+sit ar giv 1
+tim system 1
+soul with weep 1
+textbook 1
+www.aplac.hut.fi 4
+utah resort 1
+le men 1
+le mer 1
+whitehead institut 1
+sweeter far 1
+crop st 1
+subst and truth 1
+chang in earl 1
+benedict 1
+zaragoz 1
+teach wil say 1
+tom oven tov 1
+techniqu 10
+confer abstract intern 1
+genom project zebraf 1
+man most common 1
+hyper 1
+bold he gav 1
+pr tom 1
+cognit sc psycholog 1
+asc publ number 1
+burgund 1
+pr toy 1
+therefor 4
+background 6
+slip war 1
+punishm 1
+governm commerc 1
+molecl microbiolog northwestern 1
+maintain a wa 1
+evil order 1
+computer vi 2
+rev that pot 1
+black jack 1
+exec cmd 1
+ti cal watkin 1
+vehicl 1
+men think 1
+pl mail 2
+ncc.com 1
+addit bind 1
+good comfort 1
+highlight by geoarchaeolog 1
+wisest that know 1
+universit basel 1
+formid riv 1
+molecl neurosc program 1
+trad off an 1
+pith 1
+archaeolog method 1
+mo fil 1
+developm biolog 2
+biolog th protein 1
+p450 contain system 1
+fe to win 1
+vagn holmb 1
+facult uncover liter 1
+project staff 3
+montan 1
+hap to fight 1
+pag from cmu 1
+mark commun program 1
+flatter 1
+lut inform gatew 1
+contact detail 1
+virtu libr 6
+lawlib.slu.edu ge mailser.cmd 1
+pol pr highlight 1
+pitsc technolog educ 1
+educ september 1
+bon br av 1
+subm their docum 1
+archaeolog sc 1
+mailbox 1
+sc rec 1
+compar approach 1
+arnold arboretum 1
+sev fold 1
+simpl search eng 1
+uk med 1
+tallest 1
+recognit sequ 1
+anc theater 1
+head or bod 1
+institut for aegean 1
+bsd oper system 1
+inclus megar 1
+inform for conver 1
+command lin 1
+window and reg 1
+nord 1
+html helper 1
+ericrc 1
+norm 9
+imag and wonder 1
+nort 1
+educ research server 1
+norw 3
+netiz than spam 1
+cold from morow 1
+light gr 1
+man shal li 1
+chast you seem 1
+celebr celebr 1
+train stat 1
+tak hand 1
+doc it seem 1
+lump 1
+laserj 1
+rober lou 1
+host our server 1
+scenester 1
+15aug92 1
+michigan mac 1
+new group list 1
+distribut list 1
+vinc and jeronim 1
+xerox parc map 3
+describ your sit 1
+medicin chemister 1
+lunt 1
+notr 1
+step in model 1
+mean be found 1
+whisk 1
+hand sword 1
+pizz 1
+sfsh umich.edu 2
+lindel 1
+chain hydr 1
+find shop 1
+labor o biolog 1
+misc leagu tabl 1
+arm their rap 1
+irv biocomput rn 1
+certain of internet 1
+html quest 3
+undergradu program 1
+salt se 1
+third doeth 1
+archaeolog of exploit 1
+paul draper 1
+origin micr 1
+list mail server 1
+me enem 1
+archiv list 1
+exampl of educ 1
+which causeth 1
+doroth lamour 1
+rl rl dd 1
+publ not 1
+group metabol channel 1
+plac and stanc 1
+clem canon list 1
+purp sem 1
+man as know 1
+modl outl 1
+congr 5
+ecolog 4
+danger thrust 1
+nowh 1
+antiqu anc roman 1
+slow and measur 1
+scientif journ devot 1
+cur con 1
+beast began 1
+domain server 1
+maryland 2
+teeth 1
+ad entr 1
+lurk 1
+peopl.html fil 1
+blow or thrust 1
+col stock 1
+think it neat 1
+law john do 1
+explan hypoth champ 1
+middl west 1
+troop def thrust 1
+support standard 1
+great facilit 1
+discr tim model 1
+lantiquit search rel 1
+botan 2
+boy int men 1
+radiolog soc 1
+nam and count 1
+twent tub 1
+cur genom map 1
+classif road traff 1
+season wareh 1
+biolog softwar 2
+cu w3 2
+universit berlin 1
+test fixtur using 1
+problem solut 1
+experim real tim 1
+lust 3
+rothamst experim stat 1
+dew field if.ui.no 1
+recuper archeolog 1
+me dat 1
+biomolecl biochem 1
+inclus techniqu 1
+ct mr dat 1
+model parameter 1
+user should us 1
+great hurt 1
+saru as good 1
+priv tast 1
+sc fict resourc 1
+tr be mad 1
+check th www 1
+try to promot 1
+electron for 1
+av rel item 1
+congratl to mother 1
+dim drug 1
+film actr 1
+tripl ff7f40 1
+alumin custom replac 1
+defect datab enzym 1
+fil ar link 1
+computer engineer 2
+tot ce 1
+web technolog 1
+vinc ver scorn 1
+biolog onl centocor 1
+htacc 2
+hom rid 1
+project start 3
+abil to mark 1
+mip technolog 1
+seem a bit 1
+nolan bon marrow 2
+chang in project 1
+li disadv 1
+old mar mcnult 1
+us peer 1
+articl 3il4h4 1
+went int construc 1
+departm of molecl 2
+perfect and good 1
+i.h.cooper not 1
+med pictur 1
+sc program 1
+soph html 1
+deaf peopl 1
+program univer 1
+ftp to geosim.cs.vt.edu 1
+overtak 1
+order to improv 1
+bigun avbp chair 1
+subtract 1
+incorpor th chang 1
+boot extern 1
+rober lyn 1
+tut gener 1
+system group 1
+koflach snowboarder koflach 1
+obtain a fr 1
+spac th blad 1
+school of medicin 2
+featur that other 1
+pr design 1
+bearyng your louer 1
+psycholog hc 1
+colleg departm 1
+featur an aver 1
+tradit 5
+unlik that cultiv 1
+lin typ inclus 1
+docum for publ 1
+enh direct list 1
+post a snowboard 1
+structur predict 1
+postscript figur 1
+styl tip 1
+default configur fil 1
+tabasc dip wing 1
+docum path 1
+mlm allow 1
+why equ complec 1
+liam relihan 1
+yazvenk 1
+elaw 1
+institut de fisiolog 1
+precompil 1
+histoir de 1
+exhibit 3
+master of def 1
+ordin lac leather 1
+straightfor visu 1
+ant pap sermon 1
+histoir du 1
+non techn 1
+learn to thrust 1
+us for noncommerc 1
+furn a rat 1
+transect 1
+abstract intern 1
+model of protein 1
+confer in centr 1
+eberhardt 1
+half their mischef 1
+automat load 1
+le cirqu romain 1
+for project 1
+mail command 1
+brennius 1
+thorough beat 1
+del any sign 1
+vect codon usag 1
+men and wom 1
+ma extent 1
+east roman stud 1
+research serv 1
+testimon 1
+genuin interest 1
+weight dead 1
+popl direct 1
+entyer 1
+somewhat analog 1
+amdahl corpor 1
+wealth and soc 1
+slinkster 1
+listdb 1
+const 4
+teach of def 1
+electromagnet fdtd 1
+third centur 1
+elev 1
+weed in wheat 1
+henceforth tak heed 1
+want to help 1
+contr 1
+clin tr datab 1
+collect of resolut 1
+frid may 13th 1
+boycot 1
+microsecon 1
+rgb valu 1
+biolog calvin 1
+thereb rack 1
+biospher 1
+cram 1
+docum to us 1
+cran 2
+network in chemister 1
+crap 1
+der bundesrepublik deutschland 1
+crau 1
+crav 2
+pr wil continu 1
+sundr hurt 1
+light lou bearyng 1
+erlang.de 1
+not th pushpin 1
+lab brand 1
+adv stud 2
+ba leg 1
+producer 2
+intr is ded 1
+pitifl 1
+administer of sem 1
+dict of comput 1
+ge art 1
+exam of den 1
+spec nomencl 1
+keep your weight 1
+peopl peopl.html fil 1
+subscrib geosim 1
+law umin1.bitnet 1
+biolog softwar protein 1
+elim 2
+mon aug 1
+investig th us 1
+elit 1
+redistribut center 1
+major web direct 1
+joint develop 1
+fascin 1
+amarn collect 1
+substitut 1
+said th gentleman 1
+folk song server 1
+cr th sword 1
+perfect smooth 1
+di schol 1
+lab jack 1
+friedland 1
+transpar color 1
+foul langu 1
+biolog scop 1
+us common sen 1
+cl beadon 1
+roy institut 1
+dougl hyd 1
+cheat 1
+crem 1
+univer of triest 1
+15jan93 1
+do and macintosh 1
+gopher campus 1
+psycholog sc 1
+gerald joyc christopher 1
+crew 1
+mak no pl 1
+instep 1
+featur item 1
+random tun 1
+thus under window 1
+commun of sc 1
+calvin 1
+ba lif 1
+crit interest 1
+faint hart 1
+relev bibliograph 1
+lead character 1
+control panel search 1
+paper magaz 1
+project is part 1
+koryf beylerb 1
+acc th link 1
+docum direct 1
+biochem datab 1
+univer of massachus 2
+eastern meditterranean archaeolog 1
+further enh 1
+know th length 1
+check 15
+softwar hypermail hypermail.html 1
+got th nam 1
+adleman dn ba 1
+mon architectur 1
+teltech 1
+transpar background imag 1
+inf consecol.org 1
+lower 4
+natur of settl 1
+stoddard brewh 1
+shakur 1
+sgml tag 1
+design developm 1
+inform pol 1
+confer german 1
+examplecompon 1
+telecom austr 1
+ib94 1
+pol adviser 1
+cmd nettrain 1
+cour compreh review 1
+lab sect 2
+broad rich fring 1
+bottl 2
+babylon 1
+molecl o biolog 1
+doeth th sport 1
+art hist inform 1
+carolin fin fish 1
+birkbeck colleg 1
+templ o div 1
+archiv of mailb 1
+winter 3
+tak hi tim 1
+old record compan 1
+irrepar harm 1
+repr and publ 1
+cheek 1
+foc on int 1
+understand what hap 1
+cheer 2
+www.inesc.pt confer sampt97.html 1
+user forg 1
+ag biotech inform 1
+tuesd and thursd 1
+crit 5
+karolinsk institut 1
+produc and reinforc 1
+tak by chanc 1
+fo.com archiv inf.html 1
+email molecl biolog 1
+supernov 1
+test fixtur 1
+cs research 1
+equip stud 1
+methodolog review 1
+text ba 1
+sant claus chr 1
+computer displ 1
+marker wa ext 1
+lamin wood cor 1
+loeb cl 1
+humour to feed 1
+pattern and hierarch 1
+chocol 1
+yourself 1
+bent with payn 1
+metabol channel 1
+mcnult dec 1
+opt o arch 1
+list mailb 1
+patrol as further 1
+find th inform 1
+tier obeletz articl 1
+bv432x 1
+read to ch 1
+contact jim 1
+mer new 1
+particl styl cr 1
+michael littman pat 1
+datab project 1
+us and pract 1
+exp world 1
+respect 5
+electr computer engineer 2
+configur 5
+design is actu 1
+undon 1
+biotechnolog law biotechnet 1
+group imper 1
+intern support 1
+cup 3rd 1
+consider for publ 1
+manner of adv 1
+nic look sit 1
+lat to hear 1
+improv shipbuild technolog 1
+elsb 1
+sooner resort learn 1
+mov pag 1
+ong perspect 1
+typ inclus 1
+mon budg 1
+lexicograph and thesaurus 1
+command differ 1
+centr for med 1
+uc.edu uc 1
+datab scrip 1
+jason ford 1
+electron engineer 1
+an weizman 1
+construc th command 1
+polyacrylam gel electrophor 1
+knuckl up 1
+danger 4
+snowboard port 1
+saul blumenth 1
+computer softwar 1
+interview with shaun 1
+dim map 1
+bronz ag greec 1
+third member geir 1
+lust gal 2
+technolog biotech reag 1
+mailser cmd nettrain 1
+hel roman sit 1
+blitz protein 1
+lot of mail 1
+favor spec 1
+archaeolog frantiq 1
+worth th read 1
+doug ingram 1
+mil jun 1
+luck find 1
+decomposit flec 1
+cron 1
+datab th nest 1
+cal a mail 1
+crop 2
+de recherch de 1
+aa at michigan 1
+flec architectur 1
+crot 1
+crow 1
+doc mlm 1
+dagger fight 1
+anc structur 1
+technolog to mak 1
+phenom norm 1
+oyster 1
+window captur 1
+dd search naft 1
+school an evil 1
+thruster being val 1
+intern biotechnolog 1
+danc homep 1
+tel hypermail 1
+bookseller 1
+cancernet 1
+ca cam 1
+rap blad 1
+drunk driv 1
+fight st 1
+request from alp 1
+reminisc 1
+reconstruc th rur 1
+middl bronz ag 1
+institut zagreb 1
+sampl theor 1
+therm feedback 1
+plow digit pow 1
+soph an 1
+abzu near eastern 1
+great saf 1
+union of crystallograph 1
+scient by research 1
+administer 6
+construc a demonstrationintellig 1
+career 2
+calvin colleg 1
+approach ny 1
+soc o protein 1
+www.un marburg.de mzr 1
+ul.ie 1
+imag scan displ 1
+flavoprotein research univer 1
+tag text 1
+mer cook guild 1
+decomposit flec manufactur 1
+belief 5
+romarch 1
+mov datab 1
+fin mot control 1
+wh lou 1
+hyperg 1
+internet neurosc internet 1
+keep their dist 1
+hyperm 1
+underground bur 1
+opac project 1
+hoop of twent 1
+ncc freewar sharewar 1
+began to kick 1
+lot of imag 1
+blow is mad 1
+tom annu 1
+search for scient 1
+rel sud phenomenon 1
+reg surv 1
+artif intellig 3
+good collect 1
+wak forest univer 1
+forc sen 1
+doing 1
+jewish and arab 1
+microwav compon 1
+.html ext 1
+using th opt 1
+request for feedback 1
+lim siz 1
+confer on imag 1
+beard is com 1
+ct nat 1
+read 24
+brookhav 1
+hi folk 1
+reag 1
+register button 1
+origin german 1
+se sick 1
+conv strik 1
+rean 1
+rear 1
+hubbl telescop 1
+protein domain genet 1
+appertain unt fight 1
+salk institut 1
+thrust straight 1
+overdr 1
+encl th html 1
+remain in plac 1
+nolan 2
+quark to html 1
+refer to giv 1
+acquir cour 1
+cald it watkin 1
+collect at phl 1
+euler implem 1
+further provinc 1
+screw 1
+snowboard futur 1
+zenec lifesc molecl 1
+maintain th list 1
+modif on frid 1
+reach and grasp 1
+big commerc datab 1
+subm enh adver 1
+algonquin colleg 1
+cruz 3
+genev univer hospit 1
+univer of maryland 1
+aa at nc 1
+pag mad 1
+interleav 1
+work elsewh 1
+recr 2
+id chain pack 1
+impact zon 1
+alt.reveng 1
+map dat 1
+major of ethnograph 1
+high var terrain 1
+flavour 1
+fortif coast 1
+cosm indicopleust 1
+bus man 1
+introduc to pl 1
+biotech bus 1
+sen law 1
+onomasticon 1
+top bi orient 1
+suzan 1
+chest 1
+troubl find 1
+bv432x un1.circ.gwu.edu 1
+sc soc 1
+reagn faq u.s 1
+dat bibliograph 1
+vpper en 1
+sepphor 1
+sharewar libr 1
+unbuckl hi armor 1
+mountaineer 1
+known a gentleman 1
+clearingh 4
+arc biotech univer 1
+year workshop 1
+vi confer announc 1
+bouch 1
+ital reason 1
+chemister journ 1
+elabor 1
+tread cob traver 1
+aquar 1
+mad avail 1
+scrip 1
+ext calf support 1
+leg research 1
+tool protein isoelectr 1
+fa.mus.bel 1
+chang settl 1
+list of confer 1
+test ca init 1
+cur and third 1
+webcrawler is smaller 1
+knuckl up def 1
+helluv lot 1
+introduc to sf 1
+educ resourc 1
+www.ie.org.uk 1
+calendar misc 1
+regl 7
+institut fuer biochem 1
+lot of math 1
+encourag craft spec 1
+molecl biolog server 1
+regr 2
+work to encour 1
+biocatalog 1
+us al manner 1
+direct to put 1
+prov another signif 1
+pictur of sir 1
+plant biolog 1
+chart link 1
+bear their dagger 1
+magnet reson 1
+child may put 1
+squeez film 1
+vergil maron 1
+word or phr 1
+group inc 1
+joseph 1
+singl spac text 1
+aa at sc 1
+amber softwar 1
+an method 1
+softwar with netscap 1
+pag univer 1
+young peopl 1
+ind fil 1
+european server 1
+ultrasound ut.fi 1
+cedar str 1
+sant cruz 3
+oh st 1
+promot th us 1
+park cit sport 1
+doeth go 1
+confront aegean 1
+inform serv 6
+fam act 1
+aleth 1
+design div fl 1
+def variabl 1
+emac 1
+man stand 1
+hel roman 1
+multipl web 1
+pol and us 1
+leicestershir le11 2
+beat gard fight 1
+converter th summer 1
+peopl would click 1
+proc confer 1
+doeth hy 1
+mak a strong 1
+archiv inf.html 1
+richard sutcliff 1
+embl 1
+reag annu review 1
+embr 1
+doun right squir 1
+chim of big 1
+encylop of gen 1
+handout on mm 1
+simultan 2
+nat cancer 1
+interdisciplin research effort 1
+synth 4
+arch direct 1
+softwar peopl docum 1
+glob gopher menu 1
+cor extract 1
+pub n nalek 1
+brief hist 1
+recombin capit 1
+scrol 1
+hau him rost 1
+thousand of folk 1
+problem in aegean 1
+augm by addit 1
+bioinformat enzym 1
+coord 1
+count execut 1
+point approxim 1
+nj us 1
+datab taxonom 1
+transfer 1
+further help 1
+work without del 1
+iapr 1
+offer eng 1
+specif color valu 1
+tic health 1
+x.500 direct 1
+capacit micromechan accelerometer 1
+simpl task 1
+run a volunteer 1
+engineer research 1
+kingst o molecl 1
+pag on research 1
+web or www 1
+perman institut 1
+direct cal arch 1
+thus tim 1
+louer should lo 1
+publ ftp server 1
+valu th pixel 1
+bil you period 1
+lot of curricl 1
+sequ and structur 1
+bibliograph ein 1
+form ver 1
+sc rank 1
+chr pasc 1
+beaut gam 1
+dril turnt 1
+japan 3
+register a death 1
+project led 1
+exampl key 1
+fair compreh 1
+vnder th fat 1
+inc detect diagn 1
+new and archiv 1
+david scot 1
+decompr th fil 1
+forth to pl 1
+bor pig 1
+softwar protein datab 1
+electr electron engineer 1
+sword drawn 1
+sayd th bruer 1
+repl 2
+bounc 1
+bound 4
+ba med 1
+repr 13
+archiv by default 1
+hast lab 1
+arseweb hist 1
+research server 1
+obnox 1
+broadsid 1
+strong ward 1
+rassegn 1
+non turbl 1
+crystallograph computer program 1
+read for prim 1
+engineer computer 1
+cognit psycholog 1
+offer may catch 1
+dutch nat center 1
+result achief 1
+emil 1
+desir of norm 1
+master th 1
+emin 1
+exper teach 1
+vendor specializ 1
+tecah aid 1
+circuit theor 1
+ftp to ubvm.cc.buff.edu 1
+word exc 1
+csdf 1
+expir paper 1
+arseweb foot 1
+hand being swifter 1
+neurobiolog 1
+great sum 1
+sequ sub 1
+ii tut 1
+pol diagram illustr 1
+exploit of sift 1
+snowboarder wer valug 1
+man pag 2
+countr man 1
+year reg snowboard 1
+pag death 1
+rest 9
+st fresh 1
+manager or mlm 1
+list of refer 1
+styl and snow 1
+van andel 1
+nonlin 1
+stev brenner 1
+helluv 1
+malt whisk 1
+system administer 1
+an de cultur 1
+retr 1
+tim told 1
+mckinl 1
+atp assoc 1
+hist highbur peopl 1
+init stag 1
+hamburg 1
+export numer 1
+insuff 3
+reub 1
+sil roy crain 1
+ital teach 1
+serv other visit 1
+log9406 1
+spartan dom 1
+inclus sever optim 1
+further stain 1
+teach strateg 1
+produc spec produc 1
+alt.sec.mov 1
+group metabol 1
+episod list follow 1
+st model 1
+boskov institut 1
+endanger th hand 1
+submitter 1
+revu 1
+appear on apol 1
+hear rel 1
+strength narrow 1
+archweb nederland 1
+radiolog a pag 1
+law school 1
+uttermost 1
+mathemat libr 1
+bolster 1
+chancellor 1
+yong 1
+land len 1
+imprint 1
+troyer 1
+beaut lo 1
+zon a promin 1
+hurt our fo 1
+cl hit direct 1
+rat and requir 1
+emor 2
+morow 1
+nsabp 1
+black fr 1
+emot 1
+intr tak adv 1
+southeast 1
+suzuk 1
+log9406 int law 1
+commerc us requir 1
+as to grunt 1
+emph 3
+compreh harvest 1
+speak and writ 1
+empl 3
+lou again 1
+scient and project 1
+empt 2
+snowboard ver 1
+claver 1
+bird ey 1
+hunter after truth 1
+great slaughter 1
+strong hold 1
+nest int fieldwork 1
+bondvil 1
+unskil man tak 1
+peopl re 1
+daughter apartm 1
+popl board 1
+univer at carbon 1
+univer of kentuck 1
+commun corp 1
+infospac fl 1
+doubl en 1
+ict new orlean 1
+lingu engineer 1
+vegetar 1
+larger conver system 1
+rel div mechan 1
+answer conver 1
+cur genom 1
+writ new me 1
+york 4
+ioyl just wif 1
+ext support 1
+transworldsnowboard magaz 1
+chemister interdepartm 1
+hd disk 1
+mak peopl 1
+purp you se 1
+right 9
+zebr zer robot 1
+innov 1
+archieplec at telecom 1
+unequ 1
+rigid 1
+allow for perfect 1
+inform about cur 1
+list do undigest 1
+master in stead 1
+departm of genet 1
+daniel hartl lab 1
+biolog datab 2
+project at departm 1
+nam al en 1
+delawar o departm 1
+swissprot protein 1
+lat command 1
+pl al check 1
+peopl us 1
+workst com 1
+suppl o cytok 1
+articl model 1
+tot of ca 1
+wil fl sor 1
+method for react 1
+moon o intrav 1
+upperc or lowerc 1
+sir knau 1
+interdisciplin gradu symp 1
+biopharmaceut 1
+inform resourc biotech 1
+momentum 2
+becom part 1
+wobbl london stud 1
+narrow spac 1
+find funct 1
+brought to pa 1
+manyfold drift 1
+anderson timesav compar 1
+princ univer 1
+direct of email 1
+lou embrac 1
+grappl and wrestl 1
+touchst md 1
+lundberg labor 1
+fourteen groat 1
+year badam 1
+sent hi man 1
+intern centr 1
+datab and robust 1
+cit in tun 1
+twinck 1
+pat ma 1
+car th val 1
+button in fram 1
+plen lectur 1
+born or di 1
+item himself felt 1
+southampt 1
+p150 1
+civil on cr 1
+moryc 1
+biolog softwar guid 1
+lim tim 1
+cg.html 1
+irc and wwww 1
+an onomasticon project 1
+se wil produc 1
+al tap 1
+freer exchang 1
+inform integr 1
+salad to cook 1
+method siml 1
+revolut and gradu 1
+work going 1
+effect th sword 1
+wid or narrow 1
+numer agricultur 1
+reach st 1
+would 1
+sloing 1
+stud collabor 1
+mil saint lou 1
+accur reproduc 1
+reson research 1
+fascin resourc 1
+half doz model 1
+molecl sequ 1
+surf dead celebr 1
+thank to steph 1
+an mod inclus 1
+an austr 1
+econom 2
+prof developm seminar 1
+rescu 1
+rigor 1
+field inform 1
+wom fair 1
+murtaz bhut 1
+dagger men ge 1
+scop is giv 1
+le me go 1
+synth phenom 1
+form tour 1
+bon calcl 1
+baylor genom 1
+cr transpar 1
+lic or bus 1
+cel biosc 1
+aqueduc 2
+mov to freer 1
+ca us 1
+think their co 1
+wound 2
+sw libr 1
+angl momentum 1
+gif imag 2
+inclus th epidaur 1
+asymmeter 1
+european ftp sit 1
+weapon therein 1
+museum atl 1
+louer inflam 1
+lo rel 1
+suppl ser 1
+cur html 1
+read from standard 1
+stud center 1
+cel and molecl 1
+rever boolean 1
+molecl weight 1
+lisp ver 1
+el soever 1
+rev multipl level 1
+tek and es 1
+stout doeth 1
+forc tim 1
+appear 16
+relig grecqu 1
+sk train facil 1
+conceptu found 1
+want to return 1
+corpor o 2de 1
+colleg of sc 2
+05pm 1
+codon usag 1
+lead sol 1
+apartm 1
+vol on disc 1
+med med cybur 1
+lift vp 1
+nramw97 1
+simpl in design 1
+softwar in design 1
+out allur 1
+oldenburg arch gatew 1
+instruc th server 1
+procur 1
+border vi 1
+search for protein 1
+opinion of snowboard 1
+et pluridisciplinair 1
+ultim solut 1
+think wer signif 1
+coast ar 1
+william 3
+nud dancer prostitut 1
+mofil.fi 1
+reason thereof 1
+avail for macintosh 1
+point of view 1
+cl adh 1
+plac 19
+princ st 1
+colorad 3
+libr catalog 1
+build and wal 1
+pl search liszt 1
+card por favor 1
+high var 1
+plan 8
+green chil 1
+bartholomew brambl 1
+plaz 3
+resid 4
+liv in southwest 1
+bus snowboard 1
+halfpip 1
+supercomput 1
+rap or var 1
+palat cultur expr 1
+pl dont flam 1
+problem prop 1
+faq and sit 1
+teach cour 1
+ro isabel william 1
+ind giv 1
+overwrit ec archiv 1
+fight upon fal 1
+stud owner 1
+tim high educ 1
+hyperlink to publ 1
+peopl new mult 1
+salisbur dexter hand 1
+fly hol 1
+expir addit 1
+lab brand univer 1
+libr of congr 1
+mak th work 1
+se forth 1
+show th greatest 1
+pl to acknowledg 1
+for lean stanc 1
+implem issu 1
+genbank with bankit 1
+protein structur imag 1
+ge migr model 1
+select multipl categor 1
+foreign amphor 1
+adr mandarin hyp 1
+quarrel to jeronim 1
+emin learn 1
+nearer 2
+on e telecomunicac 1
+en arch olog 1
+filenam start 1
+ecosystem and habitat 1
+publ ai.mi.edu 1
+plen 1
+pc and mac 1
+plew 1
+inform o center 1
+stand th perfect 1
+tc.umn.edu 1
+encl 1
+nolan research 1
+run x window 1
+id of ad 1
+spider 1
+greatest evid 1
+stream gif addtyp 1
+me fil 1
+inform rel 1
+again quoth 1
+review 14
+hylt jerem 1
+rflp 1
+setenv 1
+good luck 2
+goteburg univer 1
+load th imag 1
+tag for imag 1
+lagoon ar shown 1
+lov and humil 1
+incr th chanc 1
+cemeter ar avail 1
+websub 1
+imag transpar 1
+adh to establ 1
+basel bionet.softwar.www archiv 1
+search langu 1
+arch fil resid 1
+cr th color 1
+interpreter list 1
+sk ar 1
+good weapon 1
+accuml a surplus 1
+report from field 1
+us command differ 1
+sc using 1
+swissprot 2
+sing lot 1
+fight most brav 1
+enem 2
+reson 1
+avail for docum 1
+accelerometer inclus effect 1
+datab workshop 1
+le me se 1
+scruznet.com in lo 1
+computer aid surg 1
+me from earliest 1
+alp skiing 2
+archieplexform at lanet 1
+molecl and cel 2
+microbiolog and molecl 1
+ar search 1
+preh center 1
+favor escrib aqu 1
+tag filter 1
+jerusalem mo 1
+molecl sequ sub 1
+bionet.softwar.www archiv 1
+engl 1
+extrem thin 1
+ext th empir 1
+conver imag 1
+inform on lin 1
+strong mad 1
+inform dur assemb 1
+correct 7
+seem to be 1
+stramason 1
+pr hav put 1
+walk of lif 1
+ver of contool 1
+succ in obtain 1
+not that halstead 1
+method var 1
+soc hierarch 1
+dr josef 1
+produc center 1
+wherein a man 1
+dec to us 1
+incr agricultur produc 1
+intr tak 1
+sort by deadl 1
+black 4
+humb to admon 1
+warder do perfect 1
+docum per lin 1
+show pr 1
+snowboard commun point 1
+pictur of contool 1
+ind that user 1
+twelv degr 1
+av web 1
+atl ian dutton 1
+groat 1
+epidaur med imag 1
+collect se 1
+determ strong 1
+ph lock 1
+word scorn 1
+se what hap 1
+ten to view 1
+southwestern me appear 1
+stoc ward 1
+dhahr 1
+rel ag loc 1
+man th gener 1
+ded to facilit 1
+spac to wid 1
+inclus ph lock 1
+rel research 1
+3rd c ad 1
+bruer meant 1
+centr univer 1
+giv foul word 1
+arthur yung 1
+yield theor 1
+yah form ba 1
+bedrock 1
+edit th fil 1
+docum a giv 1
+pun accord 1
+liter educ 1
+mankind 1
+collabor in support 1
+character and keyword 1
+edger 1
+ba bus direct 1
+research institut pharm 1
+envirolaw smith.txt 1
+resum 1
+project and goal 1
+format and gener 1
+electrotherm 1
+qu int mediterranean 1
+buckler blind 1
+mcnult continu 1
+com regard 2
+subscript off 1
+us is mailt 1
+pran nath chhuttan 1
+wal swan 1
+strong men 1
+sun workst com 1
+research program 1
+spec farmer 1
+fight ther appertain 1
+galac direct organ 1
+kent at canterbur 1
+near as vast 1
+biolog sequ 1
+biochemister o departm 1
+lpr research 1
+interest group 1
+cruz av 1
+plor 1
+liv without know 1
+plot 2
+warder absolut 1
+plow 2
+cooper went 1
+for lean 1
+fi channel 1
+hist sit 1
+electron journ 3
+molecl epidemiolog institut 1
+specim of vern 1
+molecl genet institut 1
+eurod when defin 1
+transworld or snowboarder 1
+biolog serv 2
+cheesecak 1
+person us 1
+surround 1
+rid th rail 1
+tru judg 1
+mi in cambridg 1
+draft a gam 1
+rasmol homep 1
+foot you want 1
+turk archaeolog project 1
+hotbot robot support 1
+groff 1
+patrick loprest 1
+carrefour www de 1
+alp meadow 1
+ph lock loop 1
+genet optim method 1
+featur direct 1
+dunnel 1
+fixtur using 1
+technolog squar cambridg 1
+univer museum publ 1
+a2z direct 1
+mpg addtyp 1
+ctil 1
+claus sant 1
+biom research 1
+molecl virolog 1
+entertainer 1
+invinc adv 1
+funct definit 1
+matth edit 1
+schank and chip 1
+organ datab 1
+mailbox setenv hm 1
+dav tucker lab 1
+examin hist 1
+hom report 1
+relev wa sourc 1
+hypertext converter 1
+center for biotechnolog 3
+copt orthodox church 1
+displac.3 d spac 1
+cyspid 1
+biolog chemister journ 1
+univer of antwerp 1
+mathemat 5
+darwin tip 1
+mad publ avail 1
+13mar95 1
+inclus death 1
+straightfor visu pr 1
+pasteur at igbmc 1
+truth in whomsoever 1
+fratel 1
+ii in term 1
+amin ac 1
+petroleum engineer 1
+northwest 3
+old anc 1
+hyper book 1
+direct that hypermail 1
+metropolitan univer 1
+reg snowboard zin 1
+facil built 1
+obv a sport 1
+blamd 1
+noconc 1
+project genquest sequ 1
+cur docum 1
+mus is melod 1
+lazreg 1
+context trop molecl 1
+alger 1
+administer command 1
+connect for stud 1
+longer do rayn 1
+nt.e 1
+bourbon 1
+sit and pag 1
+ensu 1
+moleculair biolog en 1
+sent by email 1
+phy cool 1
+apper your light 1
+war toom wkt 1
+aegean 3
+migmodel dem 1
+blank 3
+project educ subject 1
+s.lintz et 1
+daniel 2
+maxim four pag 1
+began respon 1
+black bil 1
+metacrawler 2
+entr 14
+mak th weapon 1
+le laboratoir 1
+url or link 1
+wish to reproduc 1
+tabl 15
+order to prov 1
+defind 1
+prof mart 1
+stand long tim 1
+equiv inform 1
+resolut dat subject 1
+commun de 1
+pag contain pubbl 1
+planck institut 1
+obtain 5
+distribut sem 1
+biolog biotech brief 1
+tack 1
+corpor liaison 1
+search th cancernet 1
+perseus atl 1
+sem ca 1
+sant portrait 1
+tact 1
+split 3
+bind suppl 1
+comp.speech 1
+escrib 1
+overwhelm western civil 1
+inord 1
+project bleep 1
+ct subject centr 1
+cern www virtu 1
+lou tewdwr mo 1
+header lin 1
+ap in ed 1
+soever 1
+slap together crap 1
+dieg supercomputer center 1
+shap of sugr 1
+inclus 1d 1
+wider rang 1
+buff dinner 1
+west west 1
+edmont 1
+institut for biolog 1
+meister lab 1
+john lanigan 1
+val cigar 1
+catalh 1
+bruer wa glad 1
+prodom 1
+un by ncc 1
+lin opt 1
+transit from alp 1
+.htacc fil contain 1
+planet earth 1
+electr p50 robot 1
+spec administer 1
+aplac read 1
+resourc o departm 1
+guidel and archaeolog 1
+cor facult 1
+sent a messenger 1
+distinct categor 1
+select of pictur 1
+tucker lab sect 1
+defin st 1
+nserc mpr teltech 1
+webcutter 1
+tel boot 1
+tr light 1
+hospit massachus 1
+lesser or smaller 1
+gif transpar 1
+inclus 3d 1
+leonard 2
+prov nationw 1
+counterfeit 1
+mot th plac 1
+isoelectr point 1
+mailbox d www 1
+www talk www0.cern.ch 1
+cour on aegean 1
+addr is somewhat 1
+csu bioweb 1
+antiqu anc 1
+black boy 1
+alt vist 4
+handl lat 1
+norsk telegrambyr 1
+educ ser 1
+number of bl 1
+girod telecommun 1
+not of indig 1
+head of computer 1
+ad a sup 1
+genom phy map 1
+group univer 1
+tail 1
+leg twelv 1
+electron commun 1
+ac composit univer 1
+piec must fit 1
+inorgan 1
+mult med pictur 1
+univer of notr 1
+workshop perhap own 1
+perform comput 2
+japan genomenet austr 1
+big ben fr 1
+spring kernel group 1
+st tool 1
+dirmod oct number 1
+good natur gav 1
+palynolog palaeoclimatolog 1
+manner of com 1
+webmaster pigl.cs.um.edu 1
+fil that contain 1
+other requir 1
+belew rodn 1
+fair short dist 1
+contain both ver 1
+preserv th soul 1
+fellow must go 1
+guy th se 1
+vessel to ship 1
+scot not 1
+journ pl mail 1
+group 26
+produc 16
+water effect 1
+work prototyp prov 1
+faythfl hart 1
+datab browser 1
+school th electron 1
+cour or us 1
+mailb.ac.uk 1
+talk 11
+robot robot 1
+cun gentlem stand 1
+register you incr 1
+deser of egypt 1
+scientif on lin 1
+kind of mirror 1
+print ver 1
+understand th team 1
+contribut to robust 1
+saf without danger 1
+satisf you herein 1
+encour peopl 1
+grown 1
+geograph 6
+imper capit 1
+accur 2
+hap of lat 1
+maydenhead 1
+rtfwp 1
+rutter of dartmouth 1
+chair in rf 1
+fact sh 2
+mad th master 1
+length of rap 1
+genom research univer 1
+bower 1
+imag proc sect 1
+transcrib th ballad 1
+shipbuild 1
+retir 1
+cel mov 1
+error you discover 1
+number of hc 1
+ch protect 1
+server list 1
+databank 1
+univer of oregon 2
+electr on 1
+fin palac 1
+comfind 1
+th and macedon 1
+protein by isoelectr 1
+gift 1
+cran crashm aol.com 1
+wal of anc 1
+commun pl 1
+austr biotechnolog 1
+creat teach mater 1
+straus subtract resourc 1
+amber autom 1
+grimberg 1
+oct stream 1
+acc to w3 1
+direct of susan 1
+cretan lat 1
+keep your point 1
+enem discomfort 1
+boot snowboard bind 1
+rasmol is fr 1
+endanger th striker 1
+dn sequ dat 1
+man in mak 1
+metamorph 2
+ge listdb 1
+program respon 1
+val gentlem 1
+nec import 1
+track 4
+server o biochem 1
+tract 3
+subdu their enem 1
+act exceed 1
+centr europ 1
+known listserv 1
+lamin wood 1
+univer of ath 1
+reput among netiz 1
+creep vnder 1
+foul speech 1
+featur request 1
+str greenwich 1
+map fil 2
+other organ 1
+field dat 1
+conver to hec 1
+requir explicit writ 1
+pract their weapon 1
+univer o mapview 1
+drag for larger 1
+leptiminus and fieldwork 1
+cl on christm 1
+main chain 1
+icon 3
+wyl pa 1
+targ 3
+over relig 1
+grief hurt 1
+ver exagger 1
+pract mater 1
+thus fraud 1
+flam your louer 1
+me giv 1
+weapon of vant 1
+massachus gener 1
+tart 1
+aid surg lab 1
+psycholog hc academ 1
+common speech 1
+worth ward 1
+mi is newspaper 1
+cigar soc 1
+biochemister o protein 1
+transpar featur 1
+bit quicker 1
+traff 1
+task 6
+list th mail 1
+tast 1
+gi appl 1
+synth and siml 1
+houswif quick 1
+ge doc 1
+sid ar deceiv 1
+pag contain 2
+stud of specif 1
+tabl and figur 1
+train exerc 1
+acquaint 2
+dim on 1
+knol ca 1
+inclus dexter manipl 1
+phenom norm assoc 1
+head or fac 1
+me o electron 1
+sampl of bronz 1
+popl genet coevolut 1
+gild 1
+organiser reserv 1
+sourc ver good 1
+genet computer 1
+di recuper 1
+bourch 1
+targ lead 1
+developer 1
+doeth run 1
+lost their liv 1
+agricultur produc 2
+gilt 1
+point straight 1
+form for subm 1
+staff 6
+hum molg 1
+lot of pictur 1
+keyword search 1
+develop and explor 1
+www arch 1
+vo libr sf 1
+inform on min 1
+march 15th 1
+law f mail 1
+intern and journ 1
+datab mmd pag 1
+reg th extent 1
+assyr text corpus 1
+com empt 1
+glob and loc 1
+digest conclus 1
+default docum typ 1
+sakar haikarain 1
+reag catalog florid 1
+coursewar 2
+gel electrophor datab 1
+trail 2
+train 10
+m.pe lbor.ac.uk 1
+part to wound 1
+intern nc helpcenter 1
+educ journ 1
+html quick 1
+genev loc 1
+lew campbel 1
+eh ii 1
+motif 1
+hypermail wil assum 1
+new mult med 1
+know th perfect 1
+vict fight 1
+bickeryng bl 1
+ge som me 1
+motiv 4
+support th mailt 1
+grpah 1
+badam 1
+sen not 1
+mad to work 1
+gr background 1
+stain 1
+recept datab 1
+wyl vs 1
+window that com 1
+biochemister and molecl 1
+clem canon 1
+actu a parallelogram 1
+but hatch 1
+amphor produc 1
+proper of david 1
+hahneman univer 1
+affil hospit 1
+vict nat 1
+vertebr 1
+point ar lik 1
+modif in term 1
+hugh at eit 1
+ar search eng 1
+colorad o cech 1
+hous somwhat ner 1
+snowbird 1
+cytok web 1
+sit that us 1
+billion 1
+inclus roman 1
+list of listserv 1
+curricl 2
+3il4h4 1
+stiff support 1
+sick pink color 1
+cal new palac 1
+evid of loc 1
+cel mov univer 1
+graph hardwar softwar 1
+audit labor 1
+causeth poor 1
+girl 2
+environm 9
+loc level 1
+thinner 1
+obv quest 1
+michigan univer 1
+leptiminus wer inhum 1
+cur gam 1
+cochlear 1
+eh mh 1
+pitsc 1
+transl to conver 1
+point of departur 1
+gener flight 1
+rec.org.sc 1
+tak heed 2
+gist 1
+elim foot drag 1
+using prim 1
+coord quer ge 1
+marburg.de mzr 1
+underground part 1
+imag with transpar 1
+stamp 2
+ment overdr 1
+jtc taxonom 1
+salt lak 1
+multim med 1
+yellow pag direct 1
+aol.com acc 3
+work to ge 1
+list of pointer 1
+detest th fi 1
+therefor hav mi 1
+bomb attack 1
+cod nmsu lingu 1
+stanc 2
+contractil system protein 1
+stand 5
+sit prob repr 1
+episod list 1
+def th bod 1
+en austin 1
+most snow condit 1
+internet disc 1
+tight produc 1
+hypermail to tak 1
+gruber for enterpr 1
+ag greec 1
+mak html mod 1
+common sen 2
+motor 3
+spring 3
+bj rk effect 1
+becom th architect 1
+atl univer 1
+triv geometer 1
+bi lingu 1
+cont keyword1 1
+ugarit stud 1
+count ar maintain 1
+espec forml 1
+montaineer 1
+typ entr 1
+mult search 1
+soft bind 1
+unconv 1
+greec wa compl 1
+funct o commun 1
+appl oct stream 1
+captain at southhampt 1
+ac mod 1
+stapl 1
+snowboard prof 1
+forsak 3
+straight lin 1
+hardwar platform 1
+want to transl 1
+pinch of insuff 1
+chanc of find 1
+window on 1
+year law 1
+support docum 1
+cor breadth requir 1
+self suff mic 1
+ind giv nic 1
+transhipm port 1
+archiv mail list 1
+freestyl model 1
+developm and differ 1
+radiolog and electr 1
+pr histoir 1
+parent direct 1
+alt.sec.mov museum 1
+transducer95 1
+journ european molecl 1
+power trick 1
+fireh 1
+biochemister operon 1
+cult 2
+eth zuerich 1
+infoc ctil 1
+gustav paulig 1
+kuntz 1
+herit 3
+sort by nam 1
+brok shin 1
+helper mod 1
+therein al endanger 1
+brochur contact danm 1
+us a difficult 1
+integr compan 1
+read avail www 1
+start 14
+john hopkin univer 3
+surpr that modern 1
+featur inclus loc 1
+koop molecl 1
+noodl.med.yal.edu ipm97 1
+rodn brook david 1
+docum is format 1
+hc launch 1
+fil for keyword 1
+misc virtu world 1
+lordship good 1
+us an rgb 1
+creat a number 1
+lank arthur 1
+ff7f40 old.gif new.gif 1
+format inform contain 1
+hurt th warder 1
+94rock.com 1
+good reason why 1
+sit mater 1
+favor link 1
+plac is unknown 1
+exec cmd usr 1
+soc and colon 1
+theodor 1
+pl th titl 1
+middl east 1
+fortran 1
+gilber lab bioinformat 1
+learn to daunc 1
+wh act exceed 1
+gif87a 1
+corner wh 1
+miscellan opt 1
+alt.coff 1
+an tool protein 1
+minnesot archaeolog research 1
+ver is post 1
+bulmersh court 1
+nic look 1
+tim or mot 1
+opinion 4
+molecl marker 1
+list glob law 1
+list discount 1
+fr tut gener 1
+warburt 1
+light nord sbh 1
+rid someth nic 1
+aegean first palac 1
+j.r.r 2
+cr th arch 1
+guy and enharmonik 1
+nab a degr 1
+symbol 5
+ma sort 1
+lynd 1
+read list 2
+aegean first palat 1
+vant and suff 1
+crop research 1
+frounyng fac 1
+neur network 2
+teach men 1
+gif89a 1
+resourc for map 1
+lynx 1
+com of outland 1
+trayn 1
+igbmc strasbourg 1
+herod 1
+herof 1
+curl 1
+bulfinch mytholog imper 1
+lab o roger 1
+curt 3
+me match 1
+curv 2
+beer on tap 1
+var molecl biolog 1
+lyon 1
+biocceler hom pag 1
+styl and featur 1
+honor priv 1
+fight wil dec 1
+book a status 1
+direct of aegean 1
+curt runnel 1
+pag o blood 1
+finland 2
+band of bel 1
+common sor 1
+check out europ 1
+bandleader 1
+foc point 1
+nc publ 1
+com and quest 1
+pind bibliograph 1
+input 5
+robin popplest 1
+biozentr der universit 1
+cr html format 1
+ea.oac.uc.edu mjquibu 1
+jarash 1
+fl perfect 1
+div of endocrinolog 1
+fraunc 1
+hau work 1
+low flight poem 1
+seventh centur a.d 1
+macperl from ftp 1
+furn evid 1
+pardon 1
+gatew if click 1
+st fourteen 1
+kneel 1
+off mi web 1
+particl 10
+ind dist educ 1
+inform on chronolog 1
+review cl eirean 1
+vid confer futur 1
+using digit 1
+bathroom 1
+fil ar mad 1
+mec o molecl 1
+ca western reserv 1
+mechan proper 1
+group lif 1
+iconograph 1
+collect at sit 1
+develop 16
+soc or civil 1
+imag imagearch 1
+maintain it author 1
+us requir explicit 1
+biochemister departm argon 1
+step plan 1
+ackl richard belew 1
+post pen 1
+pr handl 1
+vinc god 1
+disc list constitut 1
+mi hand 1
+austr www arch 1
+delightfl 1
+artif intellig reposit 1
+narrow of spac 1
+pa straight 1
+king herod 1
+excav context 1
+mail archiv 1
+fin report conver 1
+univer of read 1
+mod command structur 1
+aegean preh 3
+reviv hi spirit 1
+extract 3
+wwww 1
+biochemister center 1
+pennmush ver patchlevel 1
+acronym alumn lab 1
+univer of bon 2
+speaker o conclus 1
+pronounc milit 1
+ma spectr datab 1
+quest consecol.org 1
+quick find 1
+singl hybrid 1
+don straus 1
+colouriser 1
+publ run 1
+cit hinterland 1
+downright blow 1
+upgrad in equipm 1
+spac of def 1
+tomasz plew cod 1
+straightw he husband 1
+us th latest 1
+univer o cyspid 1
+chang th docum 1
+mush list 1
+rock furor 1
+codon context trop 1
+agricultur 3
+massachus o rasmol 1
+sort of court 1
+stewart 1
+request per hour 1
+tongu center 1
+sampl sign 1
+xerox mach 1
+ge mor gig 1
+medief coin 1
+stud stud organ 1
+list a list 1
+chang is negot 1
+3d field 1
+discover if subsurfac 1
+snowboarder koflach valug 1
+sword targ 1
+cloth st 1
+it tel 1
+show me lou 1
+ward or going 1
+chanc ar av 1
+factbook 1
+protein sequ accord 1
+taunt 1
+el establ 1
+read appar 1
+adm control 1
+view a pag 1
+steen rasmus 1
+server bc 1
+bellon 1
+bl recombin 1
+foz co 1
+episod 1
+univer of warwick 1
+finest 1
+imperfect insuff 1
+tlm cod tlm 1
+id chain 1
+ant sk behavior 1
+doc web peopl 1
+resum receipt 1
+mater cultur 1
+link wil return 1
+peopl direct 1
+rel thin sol 1
+gradu level cour 1
+sequ structur 1
+internet to facult 1
+user to investig 1
+catalog o chemister 1
+find thy 1
+ozgur 1
+web direct 3
+look for educ 1
+thing compil 1
+rad button ver 1
+imp for lack 1
+dominican priest 1
+find tim 1
+protein isoelectr 1
+pag insid cover 1
+coast at romanou 1
+branch and model 1
+listserv search 1
+bickeryng 1
+spen tim 1
+pronounc sid cut 1
+natur thereb 1
+syntact 1
+turn wheel swift 1
+anthon nolan research 1
+ident dep 1
+post is avail 1
+color wa gr 1
+he oudheidkundig 1
+bought th boot 1
+rain fed agricultur 1
+chhuttan 1
+proc effect 1
+corsl 1
+assoc pol 1
+center stat optim 1
+feel himself sound 1
+isaac asimov 1
+stud at ath 1
+find cdr hilit 1
+whit out condit 1
+ur ie 1
+museum 8
+thy al 1
+structur alignm 1
+montclair 1
+extrem interest departur 1
+show lou therfor 1
+keg to go 1
+condit o upland 1
+hug dist 1
+autom protein model 1
+non rigid 1
+me caus contool 1
+perseus project 1
+datab entr point 1
+lyk lou again 1
+veron search 1
+loc av inform 1
+datenbank 1
+descib 1
+common death ensu 1
+domain genet 1
+zangger began 1
+gi a job 1
+thinner soil cover 1
+rel to food 1
+techn web 1
+rap avail 1
+level cour 1
+tech cl arch 1
+recon ind 1
+whorl prov 1
+issu cam 1
+scarc to us 1
+snowboard discount compar 1
+guid brit 1
+server exp server 1
+gain th plac 1
+statur and strength 1
+med magaz 1
+mem f mail 1
+molecl biolog labor 1
+personnel personnel 1
+bizwiz prov us 1
+farmer wer thus 1
+giv a good 1
+reichelt math.ui.no 1
+gal grac 1
+engineer manag 1
+coh pictur 1
+greek mainland 1
+inclus da 1
+indirect rel 1
+inclus dc 1
+hop to win 1
+sidew 1
+mac ver 2
+div at mealtim 1
+virolog 1
+instruc technolog pag 1
+opigskin 1
+thing from er 1
+englishm to fight 1
+print protein motif 1
+writ out me 1
+suppl biod 1
+find top 1
+common tabasc 1
+prov th design 1
+giftopnm and ppmtogif 1
+appl spring 1
+taiwan 1
+attack arch co 1
+palat civil 1
+endowm 3
+vect sequ datab 1
+nichol br 1
+deal with peopl 1
+sermon 1
+want to mak 1
+center for macromolecl 1
+institut of biotechnolog 1
+compl rewrit 1
+inclus fl 1
+sequ structur datab 1
+toxicolog univer colleg 1
+common tak 1
+abund mater rang 1
+bank at brookhav 1
+empir la ca 1
+bind th major 1
+com or mov 1
+dist learn jun 1
+non quot 1
+gilber 2
+tak a fr 1
+reg of greec 1
+experim bulletin 1
+weak and imperfect 1
+webmaster nexor.co.uk copyright 2
+annot bulfinch mytholog 1
+top for pat 1
+publ say 1
+paleolith mesolith dat 1
+mould 1
+us convolut 1
+board brand 1
+supercomput init univer 1
+midnight 1
+command lin opt 1
+term and concept 1
+inclus hc 1
+anc hadrumentum 1
+old record 1
+group lif sc 1
+think i se 1
+min.cs.adf.oz.au keep 1
+chick 1
+staff hav adv 1
+new bulletin board 1
+fal on snow 1
+biotech univer 1
+molecl an sect 1
+high educ job 1
+laboratoir dan statistiqu 1
+head start 1
+menu wil allow 1
+sutcliff 1
+chick and hot 1
+minnesot archaeolog 1
+com hither 1
+keep a templ 1
+confront 2
+us th macintosh 1
+if.ui.no to reach 1
+mov beast deliver 1
+opt to se 1
+acedb 1
+geograph at virgin 1
+mount 2
+navig for freebsd 1
+.hmrc 1
+cover acronym 1
+va technolog 1
+travel agent 1
+dirmod 1
+chief 3
+nic htlm abstract 1
+compl usag descript 1
+boot ar near 1
+compl head 1
+sp model 1
+fl siz ver 1
+register biomolecl 1
+program tr 1
+hammer int anvil 1
+bioscan 1
+ka power tip 2
+speech rel sourc 1
+inst tim 1
+epidaur 1
+protein di datab 1
+friendship 1
+lou univer law 2
+pattern captur 1
+vsd th tim 1
+fal plac 1
+prof in instruc 1
+lewthwait and ch 1
+biochemister univer 1
+lou no toung 1
+separ 9
+www0.cern.ch fr 1
+departm cel 1
+se th attribut 1
+wesleyand univer 1
+coombsweb anu 1
+meditterranean archaeolog 1
+point in tim 1
+canon list 1
+bioinformat enzym com 1
+prof organ 1
+ozgur onder 1
+virus synth 1
+op up ext 1
+houseband 1
+absolut 6
+disc list typ 1
+secon school 1
+essec and ew 1
+robust and gener 1
+becam incr 1
+walter gilber 1
+pixel valu contain 1
+center gopher 1
+rn salk 1
+profil 4
+inclus my act 1
+saint lou 2
+profit 2
+ring to find 1
+window eml 1
+biolog o departm 1
+degr of freedom 1
+nc cancernet datab 1
+wh agricultur 1
+incr dep 1
+top for phy 1
+shikhin 1
+proceed of bec96 2
+educ inform system 1
+lou to resort 1
+offer 12
+theor biolog philosoph 1
+sc web 2
+melanch 1
+center for genom 1
+produc mad 1
+driv of nec 1
+death ensu 1
+coupl recept datab 1
+rap and poniard 1
+thesaurus 1
+slower mover 1
+as review 1
+inclus ol 1
+win th plac 1
+mouth 3
+sk or snowboard 1
+cloak or break 1
+gl8f 1
+gilt rap 1
+domin 1
+colleg of appl 1
+jason 1
+sequ datab protein 1
+nam dew field 1
+break is tak 1
+inclus html 1
+airspac terminolog 1
+pog col 1
+inclus ph 1
+definit begin 1
+quoth sh again 1
+mer rim 1
+ctil confer resourc 1
+test hi hypoth 1
+sword and targ 1
+singl combat 1
+human particip 1
+conver guid 1
+2dserv 1
+rain fed 1
+wif doeth 1
+sc fi channel 1
+sit maintain 1
+englishm wer strong 1
+tak a pr 1
+child 3
+prev season 1
+affil opportun 1
+evil snowboard establishm 1
+account them fool 1
+recherch de 1
+www0.cern.ch fr jl 1
+voor moleculair 1
+command string 1
+dict mov 1
+fal resolut 1
+mailcommand 1
+concept for snowboard 1
+radiolog a sit 1
+fin pebbl 1
+le fl 1
+food at reason 1
+univer of york 1
+recherch en 1
+profit nat educ 1
+web peopl phot 1
+loughborough leicestershir le11 1
+sit of hel 1
+saf thrust 1
+museum of archaeolog 1
+snowboard that number 1
+governm inform 1
+hist period geoarchaeolog 1
+enh stud learn 1
+rasmol 1
+dead center 1
+ipm97 1
+weather o bost 1
+arrang by liam 1
+cem contain amphor 1
+p450 1
+fortif 2
+nucleat pattern 1
+conc your addr 1
+north amer 4
+prev report 1
+husband is com 1
+sect of molecl 1
+systemat collect 1
+nolan research centr 1
+stream gif 1
+conjunct 2
+becometh 1
+perform accord 1
+fourth artif lif 1
+parent 3
+further promot trad 1
+hel dat 1
+team ar support 1
+coff shop 1
+soc of amer 1
+aegean world wh 1
+mathemat biolog 1
+redistribut 3
+addit inform 1
+us of html 1
+describ th web 1
+comput serv 1
+mcnult hop 1
+hous th sic 1
+fl thrust 1
+electrotherm siml therm 1
+softwar 24
+nft flight 1
+rich 3
+rick 1
+peacock pl paint 1
+approach emphasiz 1
+ancestr 1
+resolut ha cost 1
+lat to hypertext 1
+fil resid 1
+broadcast med highbur 1
+comput academ 1
+uniqu geograph search 1
+orthodox 1
+curricl resourc 1
+confer icgeb 1
+establ 5
+look for 2
+dol sk 1
+bucknel univer 1
+old proverb 1
+helper 1
+rever 3
+hugh med institut 1
+ridg 1
+wherefor th weapon 1
+won and lost 1
+replac window 1
+transworld 1
+sit con 1
+ital skil jeronim 1
+cur semester 1
+fal fenc book 1
+whensoever you mak 1
+hist antigu 1
+archaeolog sit 2
+peopl new 1
+4.3bsd 1
+amersham 1
+latinoamerican de 1
+loppidum de 1
+countrym bring 1
+rapid sel 1
+molecl biolog web 1
+hypermail to upd 1
+me text 1
+brook alif iv 1
+rasmus 1
+arthur evan 1
+liaison and facult 1
+produc requir 1
+design produc 1
+bel bown 1
+nat junior cl 1
+biotechnolog exposit 1
+answer any quest 1
+collect inform 1
+flight train exerc 1
+austr www 1
+secon produc gener 1
+neolith anatol tel 1
+hearer 1
+resourc intern institut 1
+int reg surv 1
+job seeker 1
+cheer c.b 1
+bil ha adv 1
+fal and doubl 1
+nearer th root 1
+cel onl 1
+select other biolog 1
+fac bod 1
+us th tool 1
+cyclad islander 1
+text und sprachmater 1
+congr on cel 1
+disc implem issu 1
+univer of wisconsin 3
+graph fil 2
+aeroplan imag 1
+assemb and system 1
+arch ologisch 1
+docum is fetch 1
+assir 1
+project cdr overview 1
+reviv 1
+west bohem 2
+go fr 1
+stud project 1
+sc event 1
+riggsb hom pag 1
+coordin multipl robot 1
+former cal bitnet 1
+controver 2
+giv keyword 1
+preh th palac 1
+biomolecl server 1
+widest po select 1
+vi imag proc 1
+men int boy 1
+cal rumour 1
+unabom pag 1
+ton arch interfac 1
+libr orthodox read 1
+be song 1
+know by sen 1
+blank sh 1
+st and cur 1
+softwar wil run 1
+point commun corp 1
+metabol o hincyc 1
+known to compil 1
+subtl error 1
+strap is posit 1
+archaeolog trust 1
+computer reconstruc 1
+bioc biodegrad datab 1
+develop by me 1
+insuff in perform 1
+bounc it lyk 1
+annot guid 1
+newsgroup 4
+se of command 1
+poem 1
+mak of scotch 1
+bleg northeast 1
+mh cultur 1
+catalog of www 1
+nucleat settl 1
+modl avail 1
+manufacturer boot 1
+bsd stuff 1
+nucleus.harvard.edu 2
+me210 stud 1
+biolog network 1
+rail sl 1
+gel run 1
+koop molecl evolut 1
+bon.de 1
+guid departm 1
+le tr 1
+ackl richard 1
+ms window 2
+norm alek 1
+defin wa gard 1
+digit elev 1
+fortun 2
+conver refer 1
+feed surplus grain 1
+shap segm non 1
+sword to fight 1
+men do me 1
+lack munit 1
+hydr bon edinburgh 1
+mother 6
+war and battl 1
+approxim sixt 1
+assoc 10
+sc www 1
+institut bi wurld 1
+plan on spen 1
+greasl 1
+prof to teach 1
+act whatsoever 1
+pe departm 1
+dexter hand 1
+chronicl of high 1
+explicit writ 1
+mover 1
+us th addtyp 1
+develop adv 1
+laurel crown 1
+ring 3
+crystallograph softwar pack 1
+digit shockwav 1
+un mailbox format 1
+le vs 1
+conf majconf.htm 1
+el power 1
+list manag 1
+behavior we want 1
+mail list admin 2
+spir tip 1
+spight 1
+meant to mak 1
+mzr kongr.htm 1
+nucl 3
+boardn 1
+rion 1
+val archaeolog 1
+deposit 2
+univer of vermont 1
+nok mobil 1
+degr of altru 1
+rsynth and celp 1
+rigid mot estim 1
+proceed 8
+ferrer 1
+program californ st 1
+us to keep 1
+hat pbm gam 1
+incr sk count 1
+iest 1
+mov when blow 1
+klassiek cultuurgeb 1
+exhibit tip 1
+metabol o interconnect 1
+scal by mik 1
+gentil 1
+ad inl 1
+austr nat genom 1
+magnetometer 1
+sk ar assoc 1
+me ind 1
+sc or exerc 1
+thank to aol 1
+archaeolog resourc 1
+respect carv abil 1
+structur ar support 1
+demonstrationintellig 1
+biolab 3
+strap plac 1
+el with alp 1
+problem solut technolog 1
+nelson 2
+molecl genet 1
+using world wid 1
+ext resourc 1
+perseus atl project 1
+lou alexandr 1
+cyberbotan 1
+unreason 1
+biolog o protein 1
+group imper cancer 1
+risk 6
+pomp 1
+man tak 1
+tool aplac 1
+rist 1
+www.ec.ucsb.edu 1
+datab regl expr 1
+loc textil produc 1
+www ind robot 1
+statur or reach 1
+assum 4
+million web pag 1
+extr tim 1
+assur 1
+broad rang 3
+career serv 1
+pleasur and ea 1
+half or quarter 1
+delawar 1
+sloing project 1
+upcom 2
+cal watkin al 1
+reiter 1
+dint and forc 1
+forth th paradox 1
+szostak 1
+upd mon aug 1
+moscow univer 1
+view th imag 1
+relig ideolog 1
+reproduc th docum 1
+pool 1
+publ inform 1
+mous button 1
+season conclus 1
+poor 5
+andel 1
+typ simpl key 1
+run a bsd 1
+noteworth discov 1
+unskil man 1
+ward wa taught 1
+priv fight 1
+relev confer german 1
+var cl gard 1
+soil and artifact 1
+nam inst 1
+popl 12
+famil sp model 1
+run and stand 1
+upd th arch 1
+der universit 1
+protein sequ massachus 1
+anthon 3
+gi and remot 1
+search with educ 1
+stud ar 1
+new approv drug 1
+cr perl modl 1
+behard a lad 1
+rol of sherrat 1
+mail bomb attack 1
+st tran 1
+subm and proc 1
+mov feast 1
+delan hair 1
+serv ctil workshop 1
+inclus list 1
+nc imag 1
+tlm bibliograph 1
+assyr 1
+plant had amphor 1
+englishm 1
+fin report 1
+ppmtogif tran 1
+addr to support 1
+pork 1
+biochem metabol pathw 1
+ii expedit 1
+port 9
+helsink univer 1
+season at jackson 1
+liter and hist 1
+brooklyn 2
+model of inform 1
+cook corner 1
+transhipm 1
+prov aud 1
+forml through conceptu 1
+nin black 1
+post 10
+web format 1
+rel text 1
+freewar sharewar 1
+badam conclus 1
+aerospac 1
+underground med caus 1
+du rh 1
+franklin 1
+fr form tour 1
+objectiv 2
+unskil men 1
+sf chronicl obit 1
+circuit siml model 1
+pr he remember 1
+middl part 1
+union 2
+jo elsb martin 1
+strong to def 1
+martinsr 1
+snowboard and boot 1
+styl cloak 1
+block server french 1
+cultiv earl 1
+powel str greenwich 1
+sanger centr 1
+enj liv entertainm 1
+fact that govern 1
+foreign pol adviser 1
+serv of interest 1
+announc about bsd 1
+perseus 1
+register biomolecl engineer 1
+hannegan to prov 1
+dexter 1
+celebr death list 1
+server that contain 1
+eirean 1
+nok research 1
+articl receiv dat 1
+elsewh link 1
+us th converter 1
+saskatchewan 1
+cd40l defect datab 1
+server harvard 1
+jefferson 1
+telecomunicac universidad de 1
+ar on cr 1
+roman town 1
+cemeter 1
+invok command 1
+congr in ri 1
+modern town 1
+uniqu 3
+centur ad on 1
+newsstand 1
+de la pr 1
+catalog sequ annot 1
+hot link 1
+finger 3
+other strong 1
+snowboard zin 1
+man in effect 1
+year in england 1
+wynd 1
+textu ii 1
+client to ge 1
+engineer design team 1
+overview cdr 1
+mer sir 1
+select html 1
+15sep92 1
+desper men se 1
+shar and exchang 1
+simpl design 1
+cochlear nucleus 1
+cl quarter cl 1
+inclus it earliest 1
+contain both book 1
+robot is equip 1
+qu proc compon 1
+p50s 1
+ftp arch 2
+sit for mytholog 1
+molecl epidemiolog 1
+publ run stuff 1
+abl to discern 1
+molecl simu 1
+snowbird and bright 1
+therefor cultur 1
+fac or bod 1
+docum rank 1
+plot in rectangl 1
+publ avail onl 1
+help educ resort 1
+stud o support 1
+whorl 1
+nettrain f mail 1
+theor labor 1
+model autom knowledg 1
+list and tel 1
+par html 1
+arriv danc 1
+sc of def 1
+biolog 7
+know wh 1
+billion word 1
+great whil ag 1
+narrow pac keep 1
+deposit in situ 1
+var spool mail 1
+el estud interprovinc 1
+run hypermail automat 1
+doubl axl 1
+transform 2
+author sr lank 1
+want to register 1
+thank el 1
+perl script 1
+show britain 1
+reproduc without perm 2
+kil our fr 1
+guid for test 1
+eat shit 1
+interact and soc 1
+inclus a lin 1
+painter 1
+going educ 1
+remain dat 1
+turnt bind 1
+post som tim 1
+boot snowboard 1
+conjug grad 2
+geograph isol 1
+not regard 1
+european research 1
+peter roach 1
+biotechnolog computer system 1
+broadcast 1
+mail daemon 1
+contr en 1
+publ of eastern 1
+emperor 1
+search everywh 1
+donor 3
+new bulletin 2
+sold photograph 1
+seek it dilig 1
+comenius group 1
+grind sl 1
+articl suppl 1
+sw saint paul 1
+lindahl 6
+firstnam 1
+good credit 1
+makyng 1
+spool 1
+trim down dep 1
+theconver 1
+sk th cost 1
+tool to cr 1
+popl sharewar 1
+glad 2
+hit an englishman 1
+imper romanor 1
+aster 1
+conver quarkxpr docum 1
+docum avail 1
+run on do 1
+definit for molecl 1
+abroad in war 1
+number of thread 1
+us whichever format 1
+fin chem 1
+recognit sequ log 1
+assum you want 1
+imag manag 1
+bod in du 1
+empl on compan 1
+microbrew 1
+accompl their task 1
+traff which investig 1
+transarc.com publ groff 1
+redeem 2
+ind or valu 1
+dist educ 1
+human molecl 1
+wisconsin o guid 1
+want trim 1
+datab atl 1
+color color 1
+year of human 1
+top of pag 2
+ba distribut controller 1
+recherch de lantiquit 1
+web weather 1
+giftran to chang 1
+therefor th blow 1
+stat to determin 1
+sport 3
+ba biometer 1
+nserc 1
+guid aristarc 1
+plac of wound 1
+occ th mov 1
+stamp brick attest 1
+fin ceram 1
+lif cycl 1
+sant claus fact 1
+colon ulp 1
+eur ix 1
+curl opac project 1
+ac th ban 1
+chain react 1
+thereb ensu 1
+datab inser 1
+sit in tun 1
+jerusalem in israel 1
+lan de 1
+nam bent 1
+east coast 1
+nesf read 1
+repl to repl 1
+non rigid mot 1
+transit paleolith mesolith 1
+bus rel 1
+glev 1
+kpt displac.star expl 1
+mornixuur miscellan 1
+countr danc 1
+research institut 1
+lowerc and separ 1
+featur asymmeter 1
+conduc rescu 1
+vnder 1
+nak to keep 1
+lock col anyw 1
+circuit siml 3
+et pluridisciplinair de 1
+us som form 1
+afternoon 1
+spec agricultur 1
+colour wac 1
+robot a path 1
+wafer 1
+assemb fin 1
+a.l.r 1
+desc order 1
+sgml tag computer 1
+archaeolog spec 1
+check institut peopl 1
+way of think 1
+da clod 1
+biotechnolog research 1
+rob mind 1
+council 5
+obsid 1
+gi work 1
+form of structur 1
+usr loc 2
+www gopher refer 1
+manipl tool 1
+educ technolog confer 1
+sebast 3
+program of archaeolog 1
+appl sc 1
+heidelberg univer 1
+amdahl 1
+eur mp 1
+relig exchang 1
+de langu anc 1
+macromolecl structur datab 1
+bioinformat group biosc 1
+facilit individu 1
+html ba 1
+cultur et 1
+john hopkin 3
+wh credit 1
+sequ datab 3
+stanford univer stanford 1
+plain between romanou 1
+interv and interrelationship 1
+autom mush list 1
+hour it becom 1
+pl against formid 1
+world archaeolog newsletter 1
+fi accept snowboard 1
+lin saying 1
+arithm is inclus 1
+veg coast ar 1
+artif lif iv 1
+knowledg search 1
+christm part 1
+chang in xpr 1
+www.ie.org.uk lsboard conf 1
+iust desir 1
+html cg 1
+pasteur 1
+introduc 18
+watkin al cald 1
+largest web 1
+prap support stud 1
+propr of demonstr 1
+islam architectur 1
+ge further help 1
+showhtml 1
+recorder 1
+spoyl 1
+countrym 1
+claus sant sant 1
+bi direct 1
+hc ind 1
+biotechnolog computer 1
+pharmacolog 1
+obtain and inst 1
+lyc robot 1
+ba mach run 1
+introduc geograph 1
+labor ha evolut 1
+hypermail al work 1
+paleoethnobotan in greec 1
+manner of weapon 1
+endanger 1
+antigu 1
+town center 1
+celebr 3
+hypertext which inclus 1
+good habit 1
+pol and form 1
+using th linux 1
+norepr 1
+cytok bl 1
+edad cl sic 1
+educ technolog pag 1
+an sect 1
+trad pl 1
+good venison cometh 1
+ge art hist 1
+tag computer 1
+caus men 1
+world wyl vs 1
+determin th specif 1
+leed univer centr 1
+sequ simil search 1
+cl tradit 1
+unit st archieplec 1
+review and announc 1
+hc group 1
+congr resourc 1
+univer of queensland 1
+seem truth 1
+chemister o crystallograph 1
+morocc 1
+genuin 1
+find sound 1
+approv drug 1
+leptiminus th cemeter 1
+period mesh view 1
+fenc manu 1
+period sourc 1
+colleg o bi 1
+heel cup shap 1
+categor orient 1
+styl of oper 1
+d92 ma 1
+duplec 1
+worthingt biochem 1
+telegrambyr 1
+thank vs 1
+alt.food.coff 1
+glob 6
+entr contain 1
+book by roger 1
+st of sant 1
+earnest 1
+medicin univer 2
+valu interview 1
+glov 1
+cambridg 6
+textu unit 1
+destruc 2
+faucon 1
+staff to keep 1
+fieldwork palynolog 1
+nearest cus 1
+relev articl 1
+web internet server 1
+web by greg 1
+inser 3
+agent fe for 1
+read th new 1
+uniqu brew 1
+diversif sub 1
+follow th conclus 1
+staff of saint 1
+molecl biolog protocol 1
+boolean search 1
+compl ind 1
+wor punishm 1
+jfcc jtc taxonom 1
+cour object model 1
+upd your research 1
+pract dec 1
+bleep 1
+car top 1
+resourc list non 1
+weapon mak perfect 1
+gener by anim 1
+boehringer mannheim 2
+atmospher adminstr 1
+archiv email me 1
+northeast 1
+tr datab 1
+elizabethan fenc 1
+manipl of relig 1
+telem 1
+pac keep 1
+marrow donor 1
+cun ital ward 1
+telev 2
+act rol 1
+leather 1
+papyrus digit 1
+thing accord 1
+elendor enj 1
+shift front 1
+nomencl datab 2
+biocceler 1
+bottl of malt 1
+discour th unskil 1
+gad ii lift 1
+gener held 1
+subject ba centr 1
+peopl as sk 1
+carbon chain 1
+serv ind 1
+laboratoir dan 1
+html me 2
+biotechnolog program univer 1
+la pr histoir 1
+model us 1
+pattern and ceram 1
+univer of oklahom 1
+matter how miser 1
+avail vi anonym 1
+mak them saf 1
+prosit protein 1
+man should pract 1
+chr fredriksson 1
+nalek mlmfaq 1
+skil in wrestl 1
+mcgeorg bund 1
+inclus 39
+collabor interdisciplin 1
+cultur ra 1
+behavior glob 1
+richard samw 1
+sharp light 1
+dand wysiwyg 1
+electron map 1
+distribut 17
+medl sub 1
+cam symp genom 1
+world cup event 1
+dav schutz boardn 1
+antiqu 3
+major import 1
+ms160 1
+peter winter 1
+roman imper 1
+kongr.htm engl list 1
+veg hist 1
+creat and dissemin 1
+reason saith 1
+afraid 3
+virtu libr soc 1
+init look 1
+deserv 1
+christm sit 1
+vi and imag 1
+produc resourc 1
+st dept 1
+issu affect acc 1
+pek univer 1
+command list 1
+whit hous 1
+chang wa slow 1
+eight ward 1
+weizman institut 1
+tut system 1
+lipoprotein group 1
+explan hypoth 1
+sir digb 1
+respon gener 1
+pent pc 1
+serch 1
+minoan cr 1
+overwhelm 1
+model is avail 1
+capacit micromechan 1
+uncertain fight 1
+sau such 1
+fr cop collect 1
+research mi center 1
+valor 1
+dirmod oct 1
+vergil ms 1
+learner 1
+resembl 2
+conver tool 1
+glyc 1
+sequ an bibliograph 1
+imag and background 1
+ersk 1
+harvard chem labor 1
+raichl snowboard boot 1
+work tier 1
+theor insight 1
+tallest men 1
+amig etc 1
+resort accompl 1
+erst 1
+taught non common 1
+darl a chang 1
+uk tel 1
+comp.speech cur post 1
+elendor hom pag 1
+team 8
+www.eit.com softwar 1
+subject repr 1
+den mckeown 1
+html sc 1
+tear 2
+robot introduc 1
+fin year 1
+return to kpt 1
+articl by dat 1
+minoan el 1
+robot gener web 1
+5x ver exagger 1
+heed dilig 1
+pl click 1
+felicitac 1
+shakespear 1
+senior rocc cam 1
+sr lank 1
+build 10
+apish dev 1
+chem proper 1
+2nd centur 1
+skorp.usask.ca 1
+group o adv 1
+backgroundsupport 1
+biolog and an 1
+built 5
+univer school 1
+tecf 1
+geosim mail list 1
+agent shal strik 1
+tech 6
+institut 16
+fertil op 1
+acc to governm 1
+rsynth 1
+quest o var 1
+pag ar serv 1
+demonstr 5
+transpar cop 1
+gunter jan 1
+motif bioinformat server 1
+peopl and therefor 1
+re brookhav 1
+produc addit 1
+or and liter 1
+aliweb 2
+colour wac wan 1
+corner for collect 1
+perch i hau 1
+majordom 1
+colormap as transpar 1
+web serv 3
+accept snowboard 1
+ba centr 1
+opin id pl 1
+cloud in cel 1
+adv of direct 1
+an mod 2
+metal handrail 1
+man half maim 1
+high educ 3
+form electrotherm 1
+own wom 1
+read avail 2
+us a lat 1
+environm that le 1
+univer o biolab 2
+unencumber 1
+mak hi ward 1
+blow and grip 1
+wid web virtu 1
+funct may act 1
+valug 1
+internet commun for 1
+stoddard brew 1
+larger than prev 1
+fr in peac 1
+post to dew 1
+ea be chang 1
+instr 2
+protein domain server 1
+engineer rel 1
+power robot 1
+pap sermon 1
+stand read 1
+publ tuesd 1
+peopl pag 1
+school to behold 1
+cultur developm 1
+univer of arkan 1
+web educ support 1
+datab prosit 1
+ask your as 1
+bench and stool 1
+esp their louer 1
+annu christm 1
+support by loughborough 1
+insur 2
+car out ba 1
+implem and ba 1
+featur th photograph 1
+educ web 1
+liv entertainm 1
+favor and maintain 1
+vycar 1
+lou entyer 1
+dock softwar 1
+den erst siedlern 1
+technolog in el 1
+cg mail 1
+gal wa val 1
+netfind gopher us 1
+vatican exhibit mithr 1
+biotech register biomolecl 1
+secr fight 1
+florid 2
+sl show 2
+learn mor inform 1
+caesar 1
+year old 1
+wab window 1
+plast outer 1
+endocrinolog and metabol 1
+felt and fear 1
+3il4h4 3ht 1
+photograph of member 1
+istanbl 1
+suit format 2
+collect of sevent 1
+tag lingu corpor 1
+lot of freewar 1
+weapon longer 1
+thy hous 1
+colleg dublin 1
+sistem 1
+sword dagger men 1
+sister 1
+mean and numer 1
+kanu 1
+cun doct 1
+marl ridg 1
+departm of radiolog 1
+voor he 1
+shar their succ 1
+king herod harbor 1
+colormap mad transpar 1
+me settl pattern 1
+beu of southhampt 1
+search naft 1
+featur peopl 1
+help spon 1
+compan which mak 1
+ho bampt 1
+someon lif 2
+comput hid 1
+lifesc molecl 1
+preh period 1
+good shirt 1
+eg sort 1
+microwav measur 1
+could 1
+univer biotech 1
+tournd untyl 1
+vid and pr 1
+californ sc rec 1
+requisit reason 1
+web resourc 1
+hannegan pig rig 1
+uk med research 1
+anc pol preserv 1
+hm thrdlevel number 1
+dead plac 1
+flatter land 1
+siml for solut 1
+le laboratoir dan 1
+et s.tognot 1
+temp 1
+robust solut 1
+dat receiv 1
+kind mus 1
+countercheck 1
+origin norweg text 1
+craft item 1
+pixel 2
+catalog o altav 1
+conspicu 2
+server o nat 1
+forceth through flam 1
+run a dem 1
+ri in popl 1
+tread 1
+iv mi 1
+user can click 1
+abstract thought 1
+belong 5
+yoy.zcu.cz skal 1
+se tw unskil 1
+neal korn 1
+fayr word paynt 1
+sit wer loc 1
+educ softwar pag 1
+treat 1
+report conver 1
+translat 1
+protect ag 1
+count 10
+form ver number 1
+karl 3
+structur view softwar 1
+asymmeter design 1
+assyr on lin 1
+fin part 1
+biograph filmograph 1
+avail at mirror 1
+swift mot 1
+softwar and hardwar 1
+field by field 1
+park direct 1
+minoan st 1
+paul erd 1
+hug bus 1
+stead 4
+handout 1
+lo alam 1
+sevent nin black 1
+wi man 1
+mind desir 1
+sw model autom 1
+charl thom 1
+coupl 3
+hardwar softwar fan 1
+espec being se 1
+magnet reson research 1
+minoan pot 1
+blow by reason 1
+research centr offer 1
+level to tak 1
+text archiv brow 1
+child toy 1
+web pag contain 1
+roman institut lau 1
+grecqu 1
+third mil sit 1
+output 5
+refer submitter 1
+spat refin inform 1
+term 16
+project educ 1
+bus sit 1
+button 5
+ucdav.edu 1
+prop by van 1
+parameter 2
+fayr lad 1
+cambridg tom maniat 1
+thrdlevel 1
+sw educ 1
+court 6
+petroleum engineer rel 1
+exchang ext 1
+reciproc exchang 1
+ludwig universit 1
+fin paper 1
+dist lost 1
+prov th server 1
+dat ba 3
+quest to webmaster 1
+test 9
+fe ar swifter 1
+larger system 1
+marrow inform 1
+alan ch 1
+cl assoc 1
+www pc v.3.0 1
+var robot 1
+loc a sit 1
+rl ar plac 1
+nic and wid 1
+switzerland and japan 1
+i.h.cooper 1
+resort oper 1
+men of tal 1
+envirolaw 1
+run httpd 1
+leather boot 1
+win by pa 1
+yueh 1
+robot gener www 1
+steel 1
+steen 1
+hannegan pig 1
+world congr 3
+rk effect 1
+pr turn 1
+colleg medicin 1
+project reb 1
+safeguard 1
+joan maud warburt 1
+skain 1
+sequ to genbank 1
+scal barbecu 1
+init count 1
+cover loc 1
+support serv 1
+squint ey trick 1
+gentleman that sent 1
+middl roman 1
+swissprot pir 1
+pittsburgh supercomputer 1
+man is driv 1
+95th annu me 1
+natur or art 1
+de relig 1
+ag cr 1
+centr for molecl 1
+thereof read 1
+winter olymp 1
+linkvp 1
+saf a shield 1
+wound or death 1
+intern clear hous 1
+prov minim calf 1
+model labor ind 1
+rol model 1
+chop and chang 1
+pleasanter than muskad 1
+raymon omal 1
+nimbl thereof 1
+resort ar cal 1
+bradford 1
+sensit an 1
+ca th board 1
+mawr review 1
+mediterranean europ 1
+chang is measur 1
+cycl 1
+instruc technolog san 1
+attraver limpr soc 1
+definit of lif 1
+museum of compar 1
+common under twent 1
+technolog in uk 1
+text 24
+perspect 2
+distribut engineer 1
+univer of cambridg 3
+bryd aw 1
+chr conl 1
+writ guar lic 1
+mach as 2
+fr coh 1
+imper colleg 3
+car hi ward 1
+educ suppl 1
+univer o nmr 1
+learn their weapon 1
+fresh through continu 1
+fr cop 1
+support by tek 1
+fish scientif 1
+attempt to discover 1
+putz creat 1
+direct ar se 1
+fertil 1
+leagu tabl hist 1
+norsk 1
+cam ca 1
+magelan 1
+brush alumin textur 1
+ernest lesl bout 1
+sight 1
+imag proc group 1
+recombin dn 1
+our lord 1
+effect direct 1
+north 9
+produc of good 1
+fl customer satisf 1
+ff7f40 old.gif 1
+build alter dormer 1
+docum mak 1
+try to cr 1
+imag from vergil 1
+exampl 3.gif border 1
+renfrew implaus altru 1
+death pool 1
+bigger mag 1
+hau pind 1
+tic at austin 2
+correct nam 1
+del ri 1
+sed skorp.usask.ca 1
+resembl th chameleon 1
+museum gel 1
+exampl may be 1
+genom center 2
+concat 1
+lain hid 1
+fo from standard 1
+rouf of sw 1
+season prap 1
+perl modl 1
+bionet 3
+peopl server deathnet 1
+geschicht einer 1
+jerich fal 1
+med highbur inform 1
+behavior of soc 1
+predomin nucleat 1
+genom project 3
+control for robot 1
+known as sol 1
+rang of pot 1
+shorter weapon 1
+continu onl new 1
+claus chr 1
+sel secon hand 1
+proof cubicl 1
+du by frid 1
+argum is somewhat 1
+serv it forth 1
+le them screw 1
+yung 1
+chain ba 1
+ver of ka 1
+furthermor 1
+brad attack 1
+gal and beazl 1
+ai.mi.edu 3
+campaign 2
+cech lab 1
+tlm cod 1
+keynot speaker 1
+fl paper 1
+softwar.faq 1
+transit scen 1
+bacillus 1
+motiv learn environm 1
+gcg sequ 1
+keyword1 1
+keyword2 1
+tilinggnilittilinggnilit 1
+dim biomolecl structur 1
+nam mean 1
+haemophilus 2
+boast mon 1
+steph 1
+stud ar pot 1
+gener a se 2
+pen st 2
+arab archaeolog 1
+ge to know 1
+cal train 1
+sc psycholog 1
+datab and atl 1
+constitut law 1
+creat a rel 1
+concer 2
+da se 1
+model austr 1
+soc for microbiolog 1
+viol thrust 1
+season prev 1
+rock dat 1
+web interfac 1
+pr confront 1
+perfect good 1
+maister 1
+crop failur 1
+fear of yl 1
+www yellow pag 1
+biochemister epicentr technolog 1
+empir 3
+suppl by na 1
+snowboard equipm thought 1
+law facult 1
+3dim 3d 1
+alleg 1
+milit ten 1
+wwww ar 1
+technolog squar 1
+paper consider 1
+grow rapid 1
+german homep 1
+sk bus snowboard 1
+larger sampl 1
+describ th work 1
+honour 1
+philolog clem 1
+sit of kan 1
+chemister molecl 1
+achil 1
+unflinch adh 1
+quentin 1
+electron new 2
+lock col 1
+strong singl hilt 1
+entr follow 1
+guessprot 1
+touchst md syntac 1
+geoarchaeolog 1
+system draw 1
+siml tool aplac 1
+mister wa herewiith 1
+doubl axl culin 1
+cav of contempt 1
+dict of protein 1
+mag box 1
+na dryd 1
+biolog group univer 1
+labor o departm 1
+nebl award 1
+intern et pluridisciplinair 1
+reproduc al articl 1
+bioph soc assoc 1
+try to le 1
+scal biolog corpor 1
+soph and power 1
+val vict nat 1
+server using 1
+writer 4
+micromechan accelerometer 1
+adept vid aud 1
+serv wil grow 1
+mountain 2
+knowledg in du 1
+repr depth 1
+dat se 1
+inst won 1
+dat sh 2
+vertebr developm 1
+datab arizon st 1
+www.un 1
+telecomunicac universidad 1
+prov th ind 1
+subscript 2
+popl board brand 1
+construc automat 1
+xm card por 1
+us of plain 1
+center o biom 1
+comput and commun 1
+councillor 1
+templ 3
+usag sum 1
+point a popl 1
+electrost forc equ 1
+sourc for major 1
+perm is grant 1
+lat bef 1
+weather condit 1
+circuit 5
+drosophil 1
+writ cour project 1
+cit level 1
+kingdom archieplec 1
+perform 14
+theor medicin 1
+cover 10
+empor 1
+peopl and tren 1
+compl learn exper 1
+nimbl and swift 1
+knot is slyper 1
+chlor 1
+1d self 1
+london unt westminster 1
+polyacrylam 1
+emil no aut 1
+compon in prap 1
+technik.un 1
+contain th search 1
+program is inclus 1
+nen equiv 1
+resourc yah hierarch 1
+snowboard imag 1
+prob dat ba 1
+troph shop drop 1
+genet optim 1
+fain hau 1
+institut der 1
+mak a thrust 1
+fingerprint datab 1
+gunner lead 1
+charl taylor 1
+term listserv gener 1
+number of microwav 1
+stiffener 1
+molecl an 1
+forth book 1
+listproc ucdav.edu 1
+slip and break 1
+check th educom 1
+truth may appear 1
+lo stud 1
+magaz print 1
+singl rap 1
+fulfil 2
+pantel 1
+u.s.a 1
+prim motiv 1
+alloc 2
+gnaw 1
+introduc to modern 1
+bong and drink 1
+museum mark new 1
+circuit parameter 1
+dat th articl 1
+us and knowledg 1
+eberhardt and and 1
+mobil and wir 1
+univer center 1
+allow 13
+bitnet listserv 1
+computer interact 2
+hc ar commun 1
+displac.star expl tip 1
+detail mac ver 1
+unomah.edu 1
+work retrief system 1
+say jar eberhardt 1
+p50s ar fit 1
+wh wer going 1
+hypermail m mailbox 1
+tagger and mach 1
+dieg aerospac 1
+counterfeit show 1
+posit vac 1
+biolog crystallograph 1
+reduc th background 1
+dn restrict sit 1
+minoan palat cultur 1
+sevent 1
+want to put 1
+du to fil 1
+mach vi 1
+retailer ar abl 1
+studentship 1
+hopkin univer bioinformat 1
+link in articl 1
+implem 10
+soc st furn 1
+institut div 1
+intern order 1
+nsabp and rean 1
+mus channel 1
+pran 1
+prap 1
+object orient approach 1
+brought to light 1
+sc center 3
+try to solut 1
+lo of fund 1
+trop molecl 1
+fit var rad 1
+letter from shirl 1
+prouerb now go 1
+figur demonstr 1
+outland fight 1
+mov contractil system 1
+stream jpg 1
+run twent fe 1
+cornel archaeolog 1
+mail server 1
+point for internet 1
+imperfect weapon fal 1
+speech therap 1
+serv by amer 1
+lin typ 1
+stanc angl near 1
+method 19
+tim slain 1
+funnest 1
+fr dec 1
+prog di 1
+molecl biolog group 1
+portrait of roman 1
+accelerometer model developm 1
+datab o center 1
+www.ie.org.uk lsboard 1
+length and unwield 1
+fr dem 1
+want to skip 1
+hand dand wysiwyg 1
+using particl 1
+mead method 1
+sun un 1
+sunspac 1
+hamilt 2
+refin inform 1
+finish 2
+mar pantel 1
+follow refer 1
+skil jeronim 1
+marburg.de mzr hom1.htm 1
+rel thin 1
+crit and construc 1
+officer and polit 1
+underground snowboard 1
+cancer sit 1
+model inclus 1
+client 8
+allur 1
+med underground 1
+bod do lack 1
+categor select 1
+pluridisciplinair 1
+meter contour 1
+roger brent lab 2
+pr in danger 1
+prec 5
+pref 1
+ge th snowboarder 1
+program for crystallograph 1
+preh 3
+4.x bsd 1
+prem 3
+tip onl 1
+pag serv 1
+preu 1
+prev 10
+cumber 1
+calcl guessprot 1
+search th datab 1
+twelv kilometer south 1
+unlac 1
+pag datab 1
+sc and inform 2
+french 3
+operon technolog 1
+mak hi cr 1
+pur fun 1
+fish and chip 1
+evolut hypertextu dict 1
+arnold arboretum herbar 1
+vnfit 1
+exampl styl checker 1
+romain darl 1
+syllabusweb 1
+nc nih 1
+excav at isthm 1
+ge int 1
+prom to furn 1
+apach 1
+result from tim 1
+clear why 1
+bouch du rh 1
+unskil to strik 1
+famil to singl 1
+writ www 1
+account for why 1
+dism your as 1
+old gal 1
+trainer 1
+tabl is requir 1
+indig developm cam 1
+wholesom talk 1
+group biosc 1
+diverg 1
+system level block 1
+wh.com hom pag 2
+harvard 4
+uttermost part 1
+thread level 1
+imagearch or draw 1
+herbar 1
+interfac libr 1
+brother 2
+non law internet 1
+thrust or strik 1
+prim 8
+institut ha mad 1
+known listserv server 1
+florid st univer 2
+pag for suggest 1
+priv 4
+plac to promot 1
+liv is loc 1
+claim 2
+tak shap 1
+field lik instruc 1
+natuerlich 1
+ctil serv ctil 1
+peopl phot 1
+fast their hilt 1
+com to explor 1
+default direct 1
+biochem bost colleg 1
+enzym enzym 1
+li watch 1
+tuscan 1
+flatter land len 1
+slain by men 1
+chem fin chem 1
+giv search word 1
+rel web pag 1
+research fund 1
+internet refer 1
+datab o bioph 1
+tolk sit specl 1
+larger mak incr 1
+wheel is mad 1
+versatil 2
+gender and status 1
+genet medicin 1
+departm phon book 1
+select th drop 1
+univer of bradford 1
+mil rutger univer 1
+palac of ram 1
+condit o blank 1
+batch cod 1
+inform retrief 2
+greatest 2
+print th fil 1
+leagu hom pag 1
+list of list 1
+player 4
+karolinsk 1
+myn on deer 1
+european imag proc 1
+hand must li 1
+ea.oac.uc.edu mjquibu uc.edu 1
+coursenot univer 1
+uncertaint 2
+built in featur 1
+knowledg ba 1
+cl review 1
+point paint 1
+stronger and swifter 1
+inform about using 1
+ba direct inclus 1
+album photograph 1
+mater for inclus 1
+circuit siml using 1
+tomb found 1
+molecl biolog train 1
+think sh shuld 1
+xview libr 1
+bioinformat nat 1
+biochem corpor www.biochemister 1
+assault th enem 1
+irish 3
+corpor execut 1
+unlik 2
+wom and men 1
+lib john 1
+cur user 1
+protein an tool 2
+reserv read list 1
+new system 1
+ba tip 1
+direct from cram 1
+molecl sc 1
+prob 2
+docum nam 1
+proc 16
+hypermail produc archiv 1
+prof 15
+model autom 1
+prog 1
+vanil 1
+honor mart 1
+prom 3
+labor o protein 1
+prop 5
+inevit outgrowth 1
+invit keynot 1
+prot 1
+william jam 1
+prov 23
+angel 3
+prow 1
+problem with bol 1
+occur on cr 1
+color light gr 1
+larger problem bibliograph 1
+swissprot protein datab 1
+arg lim 1
+exampl in aplac 1
+def in du 1
+len listn ear 1
+governm rel 1
+us of anim 1
+grappl 1
+lin thr dim 1
+moleculair 1
+inf on person 1
+3ht netnew.upen.edu 1
+gener by hypermail 1
+twent tub eu 1
+nat de la 1
+ctil journ 1
+departm of psycholog 1
+support layout 1
+indep sourc 1
+kloth 1
+part grid collect 1
+assemb plan 1
+univer dept 1
+electron newsgroup 2
+knuckl 1
+tier obeletz 1
+sic and sinck 1
+suburb and cemeter 1
+univer univer 1
+sent distribut 1
+tak ship 1
+order to insl 1
+al andalus 1
+austr alp inform 1
+iph hi wo 1
+techn stuff 1
+bin mail 1
+glob to search 1
+work to dat 1
+fict and fant 1
+further provinc control 1
+nin liv invent 1
+record keep 1
+norw and janu 1
+bionet electron new 2
+red latinoamerican de 1
+custom synth catalog 1
+inform system datab 1
+imag cach 1
+clark 2
+seek in vain 1
+england to fight 1
+tim giv forth 1
+aegean trad rout 1
+tom annu pilgrim 1
+articl and prov 1
+ba altru motiv 1
+countr unarm 1
+hannover 1
+stad cem 1
+character in aplac 1
+inform on color 1
+command is appl 1
+straight hold 1
+highest to protect 1
+gentil lad 1
+origin research 1
+strong stoc 1
+fair soph mail 1
+scatter of mater 1
+beat th master 1
+disc implem 1
+program creat 1
+for archaeolog austr 1
+man to strik 1
+sc univer 1
+resolut and vain 1
+adv absolut 1
+ext thy lou 1
+computer aid molecl 1
+instr manufacturer molecl 1
+cop of macperl 1
+chronicl obit 1
+proc imag an 1
+gil hamilt st 1
+hand sword drawn 1
+tlm fortran 1
+anim exploit 1
+field request 1
+particl favor 1
+californ 10
+aud and vid 1
+back in tim 1
+cdr hilit 1
+claus 1
+mater and departm 1
+disc list list 1
+disc method 1
+pl e mail 1
+hypermail automat 1
+vagn 1
+opin of rap 1
+vxwork 1
+nil johan 1
+cs b.sc 1
+pag th greek 1
+el sheffield u.bc 1
+inform electron 1
+univer of gen 1
+dat o hug 1
+particl incent 1
+transfer inform 1
+specif object 1
+ind ev word 1
+http bin 1
+meticl 1
+seek to run 1
+condit 5
+program and command 1
+groat a doz 1
+wh avail 1
+compl learn 1
+vain 1
+overlook 2
+biolab libr 1
+anonym ftp server 1
+pressur 1
+ey th adv 1
+forecast center 1
+produc mad specif 1
+honor feast 1
+rider allow snowboarder 1
+old palac 1
+ib cr 1
+return 22
+mon jan 1
+centur a.d 1
+tenor 1
+quest stil remain 1
+avail flavour 1
+weathertop wh.com 1
+displ th docum 1
+grunt 1
+neolith anatol 1
+watch folder 1
+tr of lif 1
+technolog infrastructur 1
+universit de montr 1
+roman cemeter 1
+buckler man 1
+restaur 2
+liv report 1
+cal .hmrc 1
+lyc popl robot 1
+serv th exp 1
+driver 1
+bsd fam 1
+robot grasp plan 1
+walter 1
+teach and setter 1
+biolog x plor 1
+thy bel aliu 1
+lipoprotein 1
+singl good lord 1
+travel dyssh mer 1
+contool wil run 1
+joigner ioy 1
+western pelopon 1
+hook or forest 1
+internet to distribut 1
+school sc instruc 1
+expect to pl 1
+bioph o harvard 2
+artwork 1
+art teach 1
+datab standard 1
+fastest to slowest 1
+archaeolog web 1
+coord quer 1
+avail for sal 1
+david clark 1
+trad rout 1
+step pyramid complec 1
+northwestern hospit cancer 1
+valt 3
+valu 11
+sw educ research 1
+retrief th sourc 1
+bon marrow donor 1
+biogopher list 1
+deform 1
+reproduc without writ 1
+archaeolog project archaeolog 1
+netscap hav troubl 1
+displ song interact 1
+environm variabl 1
+penelop 1
+old guy 1
+stumbl 1
+shop doesnt offer 1
+search for listserv 1
+lunch 2
+displ and print 1
+simp th number 1
+maintain by saul 1
+somwhat 1
+mer new song 1
+eng and mach 1
+becom frequ ask 1
+newsletter centr 1
+vand 1
+sen our wilkin 1
+anc hist 1
+greater 4
+softwar for test 1
+introduc earliest preh 1
+galac direct 1
+conver email 1
+issu for ppm 1
+vant 1
+fair stand 1
+fam doth report 1
+good for subject 1
+fourth and third 1
+shin pearl 1
+imag interleav 1
+datab of scient 1
+overlap center 1
+ba typ 1
+morsemcfad 1
+goal 6
+coff drink recip 1
+high most honor 1
+me mak 1
+resourc sen mail 1
+nam descript cont 1
+grandpar 1
+desir to find 1
+ri elettronich 1
+partner 3
+crept vnder 1
+dan homolk 3
+random th method 1
+stud select fact 1
+holdout 1
+further promot 1
+david ackl 1
+fil spac lim 1
+westlaw and lec 1
+biotechnolog group metabol 1
+confirm 2
+dn ba hamilt 1
+roman emperor 1
+train cour 1
+unspeak 1
+pedr research 1
+nat junior 1
+archiv 10
+drug structur 1
+computer aid chemister 1
+cour in genev 1
+yah hierarch 1
+peopl hav point 1
+peopl wil configur 1
+biolog biosc 1
+whit rain film 1
+resort that allow 1
+detail record 1
+rerout me 1
+keep hi rap 1
+crimson 1
+tak adv 7
+fl satisf 1
+mynstrel 1
+li to weak 1
+sit i18 1
+dlg wh.com 2
+esteem 1
+sit i19 1
+sequ datab nrl 1
+number of tim 2
+us th ad 1
+effect is retain 1
+fight with stav 1
+st and proc 1
+gau me 1
+top of dhahr 1
+threat with submer 1
+contemporan settl 1
+ind of resourc 1
+rap en 1
+european cd40l 1
+help snowboard 1
+way to encod 1
+vast 2
+bath wh 1
+young wit 1
+using th www 1
+maister chaf 1
+basin datab 1
+treatm 2
+book sit fr 1
+problem of snowboard 1
+dist appertain 1
+road traff 1
+conduc 2
+alber research council 1
+swear by stock 1
+redund protein sequ 1
+mater rang 1
+redistribut th pag 1
+calcl hum 1
+educ technolog journ 1
+caulyng 1
+lat cod 1
+sk without snowboarder 1
+david hsu 1
+ea to remember 1
+biochem metabol 1
+guid for mklesson 1
+bruer paid 1
+member geir 1
+report rel 1
+fil is lock 1
+notif 3
+dupl th cont 1
+anatom and cel 1
+hopkin 4
+rec.food.cook 1
+period of gest 1
+look for comp 1
+freewar 1
+centr for libr 1
+relig pract 1
+institut of health 2
+great favor 1
+educ subject 1
+ant snowboard 1
+hold fast 1
+server resourc map 1
+felt th pinch 1
+tamper 1
+orchestr 1
+collect exclus letter 1
+settl 3
+keep you inform 1
+ubvm.cc.buff.edu cd 1
+protein emor 1
+showhtml is defin 1
+dead checkm 1
+sproat 1
+liv and train 1
+webmaster nexor.co.uk 2
+freestyl design 1
+eucl 1
+ge thing compil 1
+anc nam 1
+redistribut chief 1
+cl hit 1
+earliest remain 1
+wir vid 1
+unflinch 1
+prouerb saith 1
+mausoleum 1
+interact atl 1
+rhythm 1
+fisherbiotech reag 1
+rang of rel 1
+adv e mail 1
+extrem interest 1
+madison 2
+ca to syntact 1
+server san dieg 1
+entr for bel 1
+sk track 1
+blow com 1
+hous project 1
+enzym complec 1
+verif hour 1
+comfort 1
+univer cognit 1
+datab columb 1
+plan for effect 1
+humour 1
+pdq support 1
+skil in assemb 1
+health o nat 1
+euen 1
+departm of inform 1
+academ libr guid 1
+euer 1
+spaniard 1
+ultr crick 1
+verit vincit 1
+light short sword 1
+men of val 1
+austr journ 1
+elsewh in mediterranean 1
+lev castl 1
+cs dept 1
+gold 4
+inform found 2
+reload button 1
+good sourc 2
+speech and fac 1
+tim to seek 1
+human fact 1
+oscar 1
+suff tim saf 1
+departm personnel personnel 1
+hilit 1
+hand telephon 1
+assoc bind system 1
+power search eng 1
+choler 1
+langu of anc 1
+regl interv 1
+us bad langu 1
+incomp 1
+troph shop 1
+fish their freedom 1
+emor univer 2
+wom cloth 1
+winograd 1
+expan 2
+number of test 1
+amphor project 1
+overwrit prev 1
+world john hopkin 1
+conv to accord 1
+distribut our dem 1
+deaf childr 1
+motlib 1
+rel research pag 1
+balasubraman 1
+incont 1
+near perpendicl 1
+inconv 1
+collect of transl 1
+snowboard 3
+proper of sound 1
+vxwork vm ba 1
+shamr project www 1
+countr 8
+st berkel 1
+pa most common 1
+bent to burn 1
+common stand 1
+bioph curag 1
+oregon zebraf 1
+good 20
+goof 1
+biotech suppl catalog 1
+nicu ceausescu 1
+someon 2
+girdl 1
+mil sit 1
+giftool 1
+devot much tim 1
+tabl subm 1
+ge a lot 3
+prestig 1
+serv for assemb 1
+work facil 1
+blow altogether 1
+inver 1
+defin funct 1
+phylakop 1
+sword and buckler 1
+geosim.cs.vt.edu 1
+quart of win 1
+univer multim 1
+period geoarchaeolog 1
+lo th benefit 1
+as stud 1
+us th blad 1
+sk train 1
+blow cut 1
+ge and using 1
+modif december 2
+town christm tr 1
+ye th fl 1
+school throughout north 1
+fact sant 1
+an pcr 1
+evansvil departm 1
+sk and snowboarder 1
+tob silver 1
+caer gal cook 1
+expel 1
+appear nepot 1
+def th blow 1
+pract natur 1
+exper 6
+nat du patrim 1
+person html 1
+tv producer 1
+internet using 1
+amount of email 1
+adept vid 1
+bronz ag port 1
+test grec 1
+exampl found 1
+featur support 1
+repr th subject 1
+compil clean 1
+lin ver 1
+med soc worker 1
+react to sen 1
+world antiqu 1
+reservoir dog 1
+label nam 1
+cran crashm 1
+singer 1
+sendmail may run 1
+brush alumin 1
+menander 1
+invit 5
+wor of censorship 1
+architectur newsletter 1
+strong guard 1
+reg magaz ea 1
+ra th obv 1
+parc map viewer 1
+oscil 1
+want to think 1
+boarder 2
+form book 1
+chain ba lif 1
+big deal 1
+pop up menu 1
+rutger univer arch 1
+support form 1
+ad acc count 1
+kpt displac.schizophr 1
+assoc baylor colleg 1
+main top 1
+se th u.s.a 1
+orig.gif ppmtogif 1
+hug bus sit 1
+liter in greek 1
+track to produc 1
+speech labor 1
+expir 1
+lif self reproduc 1
+bioph o school 1
+acl list 1
+nearb major settl 1
+fac nor bod 1
+magaz 7
+med imag arch 1
+chain react pek 1
+unauthor 1
+millesjg 1
+se al handout 1
+number smaller 1
+imag to se 1
+virtu memor 1
+equiv circuit 1
+therefor ver compl 1
+mealtim 1
+patrick 1
+knight therunt 1
+mil may var 1
+ic climb 1
+somewh 1
+individu entr 1
+cather 1
+fac gam 1
+experim bulletin board 1
+educ educ 1
+boolean number 1
+tim kernel 1
+common do answer 1
+var terrain particl 1
+leagu 2
+hybrid produc 1
+soft boot 1
+rel and absolut 1
+refin stil further 1
+aid chemister 1
+finland uk server 1
+nan junior 1
+biom appl 1
+sampl strateg 1
+biochem pathw 1
+cap o whit 1
+color gif89a fil 1
+ho hugh 1
+muskad 1
+york transit 1
+den dowl 1
+init hav rec 1
+greec and cr 1
+popl siml 1
+leftover stratif marl 1
+forbid th thrust 1
+univer of californ 4
+old hog 1
+sc fenc onl.html 1
+av of great 1
+leav th hand 1
+rap in reason 1
+procedur 2
+invok 5
+man in breath 1
+thau 1
+showheader boolean number 1
+point of nec 1
+girod 1
+understand 10
+prov ext 1
+de lantiquit search 1
+ie irc xx 1
+differ most common 1
+sixth caus 1
+fil gif89a fil 1
+kn bent 1
+lab pat ma 1
+human liv 1
+morrow 1
+lac leather boot 1
+assemb task 1
+year reg 1
+cambridg univer 1
+2d protein datab 1
+ward or break 1
+sit prov 1
+ar st 1
+german 9
+mov sequel 1
+server wil find 1
+ba system 1
+sc techn 1
+email to coff 1
+fight with signior 1
+artefact 1
+bandwidth fr 1
+fr list 1
+infrequ 1
+saccharomyc genom project 1
+divin preserv 1
+rion ter 1
+centur b.c 1
+subiect to cupid 1
+ca law 1
+avail nam 1
+list non law 1
+consecol.org 1
+tim without en 1
+rec appear 1
+medicinemedicin 1
+latest ver 2
+fish equipm 1
+point 13
+them 1
+morsemcfad commun 1
+indicopleust 1
+ther 2
+thousand of ind 1
+mak som fool 1
+mark sullivan 1
+stand as brav 1
+unexcav 1
+kollman group 1
+harmon stead st 1
+mad a thrust 1
+exam by comput 1
+major commerc 1
+research genet 1
+speech shar 1
+technik.un erlang.de 1
+server melan softwar 1
+event guid 1
+self heat 1
+spac and dist 1
+tlm softwar 1
+mister 1
+humphr 1
+effort involut geolog 1
+v.3.0 1
+urban 2
+ind to biolog 2
+us rgb valu 1
+rel with liter 1
+var of method 1
+ba molecl 1
+phylogenet 1
+pr ar cur 1
+adver inclus 1
+nroff format 1
+exp part 1
+adult mov star 1
+model with distribut 1
+do and un 1
+architectur in isfahan 1
+interdisciplin gradu 1
+creat or port 1
+us search eng 1
+serg yazvenk 1
+nam htacc 2
+genom research 1
+bind interfac 1
+chang settl pattern 1
+distribut autm 1
+program cal giftran 1
+leapt 1
+angl american project 1
+contain link 1
+cathol 1
+pot mark 1
+ba funct 1
+solut th problem 1
+scal lingu resourc 1
+sovereignt 1
+upcom event 1
+giv hurt 1
+provider 2
+da bus 1
+hear partnership 1
+electron newsgroup ded 1
+thin 4
+learn theor 1
+molecl comput 1
+introduc th sit 1
+quoth th cooper 1
+merseysid 1
+southeast of san 1
+fisherbiotech reag catalog 1
+user hom direct 1
+lower bod 1
+network program 1
+guid last upd 1
+compar fertil 1
+poniard and gauntl 1
+pag museum gel 1
+me nam 1
+metabol mac planck 1
+learn 16
+men fight 1
+keep it going 1
+de montr 1
+good adv 1
+nord jumper said 1
+self suff sub 1
+regl expr 1
+order from cdnow 1
+determin th ind 1
+martland from brunel 1
+aegean preh devot 1
+african 2
+rick har maintain 1
+vast major 1
+greec topograph 1
+de bruxel 1
+maruyam 1
+thing ver nec 1
+flu through fabl 1
+hypocaust 1
+smith monr 1
+resourc o houst 1
+snowboard wa allow 1
+peopl tak responsibil 1
+greek lingu 1
+ferreir 1
+univer of oldenburg 1
+want to run 1
+church hist 1
+top ten 1
+south carolin 1
+controller which acquir 1
+mak four tim 1
+parabol method 1
+fl text retrief 1
+graph and visu 2
+lamin 1
+involut 2
+nyu med center 1
+research park virtu 1
+year hard pip 1
+humpop 1
+enforc 1
+disorder of energ 1
+flounc 1
+keep your dist 1
+track biom appl 1
+batch cod search 1
+se biolog molecl 1
+crystallograph biolog internet 1
+propound 1
+keep prof 1
+riggsb 1
+mzr hom2.htm german 1
+cald hym 1
+archaeolog newsletter 1
+environm health 1
+captiv 1
+confer and direct 1
+lying or spac 1
+god le 1
+poor known 1
+miamim project 1
+board ar specif 1
+perfect taught 1
+biolog design 1
+research genob 1
+simu inc 1
+thom 3
+computer group 1
+recent interview 1
+desktop chemister 1
+using a tool 1
+nuclear loc 1
+evan 1
+forsak or suspect 1
+s.lintz 1
+virtu cour 1
+tir of sit 1
+notr dam 1
+man of shorter 1
+coff hous 1
+id to def 1
+jav ba molecl 1
+appl arc inf 1
+resourc for librar 1
+minoan soc 1
+network 18
+med centr univer 1
+protein ma spectrometer 1
+blu book 1
+vin pol appear 1
+biolog th ribonucl 1
+integr genom datab 1
+collabor interdisciplin research 1
+greec and tr 1
+listdb mem 1
+jav ba 1
+educ nick 1
+find th point 1
+uc irv 1
+messenger 1
+prestig artifact 1
+univer of nebrask 1
+sw flash electron 1
+blind th fight 1
+bring their liv 1
+wh you inst 1
+er wright explain 1
+nest by ftp 1
+galliard 1
+veg and pol 1
+natur yield 1
+workshop is int 1
+circuit model 1
+adleman dn 1
+cover loc scen 1
+dumbart oak 1
+pier luc 1
+cariadoc 1
+squar fe 1
+wid web server 2
+jam mil 2
+forc whereof 1
+prop deadl 1
+lincoln an 1
+blumenth 1
+fit for marsh 1
+institut gaspard 1
+resourc for molecl 1
+ge law lib 1
+hundr pound 1
+german cook text 1
+hypertext 5
+even 1
+nam to blot 1
+letter 7
+go nak 1
+great imperfect 1
+tus felicitac sant 1
+lust start 1
+cour com 1
+dist educ exper 1
+cour con 1
+design 19
+zangger demonstr 1
+greeu to hear 1
+sit o biolog 1
+publ number 1
+buthan o le 1
+human computer interact 2
+number and weight 1
+libr soc sc 1
+siml an method 1
+warder 1
+hik any hug 1
+biog and pictur 1
+vi group 1
+maint th pag 1
+tool for upd 1
+cancel digest format 1
+electron newsgroup network 1
+oven tov 1
+pip p.o 1
+principl of protein 1
+genet institut de 1
+vid confer 1
+heard th tal 1
+thus 7
+put link 1
+miser a tim 1
+arch olog 1
+command th lif 1
+da cap 1
+why man snowboarder 1
+arch interfac opt 1
+mak an faq 1
+nest wa succ 1
+offender 1
+new ballad 1
+webmaster 13
+rang of sit 1
+intern www confer 1
+desir to compl 1
+downright 1
+hypermail wa run 1
+wscg97 kiv.zcu.cz 1
+vi confer 1
+lab publ datab 1
+interest in support 1
+compat color 1
+hel greek lingu 1
+evid 4
+malcolm and carolyn 1
+evil 3
+link pl contact 1
+inclus format 1
+crimson velv 1
+snowboard in raichl 1
+number of priv 1
+meter contour level 1
+hand and head 1
+me ap 1
+good pract 1
+me ar 1
+cap and curt 1
+wh var 1
+hypermail to read 1
+germplasm resourc 1
+compon by defin 1
+transg 1
+transl 6
+inform on tlm 1
+transm 4
+pa about snowboard 1
+suffer th staff 1
+da cap pr 1
+suppl of enzym 1
+check out flu 1
+thrust tw fe 1
+connecticut o health 1
+improv middl 1
+adv he know 1
+bumbd 1
+dagger 1
+thing el 1
+contact danm 1
+adult mov 1
+read th fr 1
+common to heav 1
+liturg of jerusalem 1
+honor most nobl 1
+biolog sanger centr 1
+shock protein 1
+pl exc 1
+output produc 1
+lesl crowther 1
+ol oil 1
+an and liter 1
+colleg and univer 1
+pr badam adm 1
+brief or 1
+format mlm 1
+captur 5
+avbp chair 1
+se http 1
+ma melan 1
+contain amphor bur 1
+bibliograph on sequ 1
+loc econom 1
+sipb mi web 1
+thing ge 1
+collect 21
+ea to tel 1
+biochem journ prent 1
+biotech reag suppl 1
+cold spring harbor 1
+virtu museum 1
+molecl design eth 1
+an austr finland 1
+huxl and orwel 1
+vid grab 1
+not author 1
+baker 1
+univer of memph 1
+murderer 1
+reach th world 1
+fil softwar.faq 1
+theban mi 1
+guard or cr 1
+know which foot 1
+cal leap program 1
+publ gear 1
+highbur peopl new 1
+doc web 1
+stud organ 1
+nick badam com 1
+acronym 3
+genom resourc eth 1
+inclus appl 1
+dc and ac 1
+asymmeter board 1
+pl to tak 1
+want to sel 1
+server o list 1
+cook wil satisf 1
+le stud learn 1
+exp server 1
+field if.ui.no 1
+bod barbecu comb 1
+inform center 1
+toolkit to compil 1
+greek manuscript catalog 1
+back 4
+off or saf 1
+fuer molekl 1
+vismod.www.med.mi.edu 1
+utah winter sport 1
+anc structur break 1
+styl for designer 1
+satel inform 1
+wh your server 1
+common held 1
+direct of prof 1
+becam impract 1
+lawr livermor nat 1
+particl list 1
+perform inclus par 1
+becom somewhat 1
+jar eberhardt 1
+yal.edu 1
+vin shak 1
+technolog ar cover 1
+abandon invok 1
+biochemister tut 1
+st excav 1
+giv credit wh 1
+support layout draw 1
+adopt th strateg 1
+dian so chast 1
+coupl with hp 1
+confer 14
+saint to sk 1
+led he wh 1
+stuff on min 1
+im ar 1
+search cap 1
+ultim 2
+prolif 1
+me th articl 1
+susp substr 1
+emerg minoan 1
+contribut ar welcom 1
+simon gib 1
+datab sequ 1
+renfrew model postl 1
+contract 1
+christopher langt 1
+hutchinson 1
+oudheidkundig 1
+cur work 1
+univer of connecticut 2
+thing mi 1
+brief instruc 1
+window on it 1
+tut on speech 1
+stev putz 1
+espec snowboarder 1
+impact multim 1
+plow zon 1
+circuit optim 1
+med a categor 1
+breakdown 1
+prestig craft item 1
+return a list 1
+prototyp and perform 1
+user may want 1
+think of join 1
+sequ dat lou 1
+blind 3
+patent 1
+wight say 1
+evolut on earth 1
+technolog journ 1
+aloft 1
+men shal join 1
+biochemister epicentr 1
+border 2
+keep 11
+ubvm.cc.buff.edu 1
+hap doeth 1
+somer tim 1
+commun stud center 1
+ext cultur 1
+xm.com 1
+paper contribut 1
+pbm wa configur 1
+edit indep 1
+neopalat period 1
+bail 1
+http www.du.edu 1
+intern biotechnolog exposit 1
+tim it fal 1
+perform any act 1
+outland teach 1
+lib mead mdc 1
+html me tag 1
+inform and libr 1
+glob gopher 1
+ga damp 1
+tick 3
+reag suppl oreil 1
+foster individu 1
+tackl new project 1
+discipl network 1
+download automat 1
+biolog weblog pag 1
+miamim 1
+domain genet computer 1
+gopher menu 1
+winter sport park 1
+pbm toolkit 1
+de electr on 1
+lighth prov 1
+latest web 1
+latinoamerican de quim 1
+resum mail 1
+shorter or longer 1
+fil ar writ 1
+const travel 1
+colleg 12
+load server 1
+eastern snowboard sc 1
+inform avail 1
+le new snowboarder 1
+graph lab 1
+fourteen resort 1
+geosim softwar 1
+unlac hi helm 1
+saying un 1
+cassiodorus 1
+infer to lo 1
+toy wherewith 1
+tier 1
+educ research effort 1
+lullab 1
+95th annu 1
+evil snowboard 1
+structur biolog program 1
+ernest lesl 1
+balt 1
+old snowboarder 1
+cancer risk 1
+lou to den 1
+www and usenet 1
+doeth now begin 1
+ge law 1
+dist and tim 1
+ind pag 2
+exchang center 1
+peopl tak 1
+addr and url 1
+cit of rom 1
+road 2
+penelop vertu 1
+teach team 1
+fellow work 1
+spon an avalanch 1
+genet cod text 1
+rec th list 1
+bod and fac 1
+band 4
+fac of sc 1
+cover pag 1
+bang 1
+bioinform o borrel 1
+novag 1
+bank 4
+hypoth 2
+espec vinc 1
+labor of molecl 1
+advent 1
+blitz 1
+rn fold 1
+dist being brok 1
+park virtu 1
+remot sen 1
+snow season 1
+view of michigan 1
+daemon 1
+maintain a sit.idx 1
+molg internet 1
+dor of saint 1
+d92 ma black05.nad.kth.se 1
+anx to se 1
+resourc of interest 1
+28th 1
+rocc 1
+mannheim 2
+rock 5
+becom perfect 1
+equ spac 1
+lanet 1
+sooner resort 1
+engineer network 1
+wom by wil 1
+rel project 1
+organ governm commerc 1
+assum a stanc 1
+gryffith 1
+2dpag 2d 1
+greek lingu pag 1
+spectr search 1
+nam th output 1
+lawlib.slu.edu 1
+rodn 1
+tel sit 1
+link to numer 1
+entir invent using 1
+multim system 1
+group biosc bionet 1
+eng in collabor 1
+sant fe 1
+ibmpc window arch 1
+port util 1
+sign proc 4
+docum a snowboard 1
+2dpag ind 1
+ther belong 1
+deaf peopl tak 1
+kent 2
+wrestler overcom 1
+comput molecl 1
+langt 1
+langu 11
+pl fil 1
+us intern 1
+actu contain 1
+molecl evolut 1
+genquest sequ search 1
+barl 1
+novel 3
+bart 2
+vismod.www.med.mi.edu confer nramw97 1
+south afr 1
+altern instruc 1
+acc guid 1
+ga mesf 1
+molecl simu inc 1
+multim tut 1
+fil ppmtogif tran 1
+genbank 2
+origin creat 1
+whereof man brav 1
+southern 2
+list of troubleshoot 1
+bask 1
+england clam chowder 1
+etc al fil 1
+cornel hal east 1
+ind transpar 1
+bast 1
+multipl robot grasp 1
+kinem fil 1
+oper and st 1
+longer weapon 1
+kept 3
+proc ar gradu 1
+compan cal vin 1
+put a heav 1
+interest descript me 1
+comp.speech cur 1
+bath 3
+hopkin univer 3
+going educ research 1
+prov step 1
+von den 1
+variabl ar se 1
+part opin 1
+stream mpg 1
+search catalog 1
+fantast 1
+publ 32
+triad 1
+prof coach 1
+search th categor 1
+workshop on sampl 1
+infrastructur 1
+queen majest 1
+fil th mailbox 1
+nobl order 1
+partner and assoc 1
+transpar 3
+protein sequ structur 1
+me off 1
+confus 2
+confut 1
+kern 1
+organ entr ad 1
+libr and museum 1
+grpah art 1
+symbol system 1
+dyssh mer cook 1
+folk rock 1
+protocol natur 1
+fil ar creat 1
+grec e latin 1
+autom assemb 1
+gregor 4
+contrast 3
+se level 1
+suzan georg charp 1
+contribut may mad 1
+school bi pob 1
+hindr 1
+ca init 1
+claus chr root 1
+modif march 1
+vinc hi ri 1
+off th enem 1
+rang of user 1
+run stuff 1
+trick 6
+bawd 1
+palaeolith figur 1
+poultn 1
+paleolith 2
+poultr 1
+design research 1
+forth in print 1
+pat and agent 1
+kuntz group 1
+new.answer mail 1
+cantabr in spain 1
+uncalibr 1
+stud of architectur 1
+arizon st univer 1
+career resourc biogopher 1
+avail onl 1
+act web 1
+liter search serv 1
+neurobiolog lo alam 1
+retrief an arch 1
+internet archaeolog 1
+sum of respon 1
+proc th me 1
+third mark 1
+wh of nec 1
+excav by bleg 1
+ge mailser cmd 1
+men resolut 1
+sound proof 1
+coupon 1
+kehrl 1
+el estud 1
+using th emac 1
+franklin search group 1
+cr th count 1
+ba desktop 1
+dbh doc.ic.ac.uk 1
+libr html 1
+majest hor 1
+lyk now liu 1
+imperfect therein 1
+austr 5
+avail from nc 1
+character of u.s 1
+fe continu mov 1
+learn proc 1
+mediterranean e mail 1
+institut of standard 1
+rec cop listproc 1
+common assum 1
+titl 8
+fight wer good 1
+protein model server 2
+imag ar hand 1
+smu excav 1
+predictprotein 1
+strateg pioneer 1
+mayd and wiu 1
+am www 1
+teach of off 1
+roof 1
+blow being strong 1
+plac an emph 1
+stiff 1
+poor man 1
+room 4
+peter greasl 1
+gon to drink 1
+gener posit 1
+danger or dead 1
+major industr 1
+worth men resolut 1
+root 3
+ar crop 1
+reciproc proc 1
+showbr when defin 1
+autom for pbem 1
+govern 3
+displ song 1
+color nam du 1
+sk assoc 1
+men do keep 1
+part and cater 1
+email c.bird 1
+colorad at denver 1
+underground med 1
+compl and coh 1
+ad upd direct 1
+dark corner 1
+cur profil ask 1
+sew treatm plant 1
+offer snowboard 1
+random 3
+giftran docum 1
+interact inform 1
+biolog promeg 1
+batson 1
+particl appear 1
+server bost univer 1
+overwrit boolean number 1
+promot th snowboard 1
+versatil collect 1
+artif ingellig lab 1
+centr for east 1
+balad 1
+norm assoc 1
+nok research center 1
+near half 1
+pulp 1
+minestr 1
+.html 1
+standard and definit 1
+mad specif 1
+mi artif 2
+cem pag 1
+multitud of peopl 1
+badam view 1
+patroller 1
+labor of mathemat 1
+fight faster 1
+sed command 1
+ignor 6
+lanus 1
+sc labor 1
+retrief th specif 1
+rost 1
+high than sk 1
+lanaux 1
+intellectu ap 1
+atcc catalogu 1
+pal olithiqu 1
+univer genet 2
+taught rap 1
+try our fortun 1
+ge th id 1
+se so suer 1
+workflow 1
+import 5
+wind up leav 1
+novelt of fight 1
+introduc off rl 1
+punt 1
+dim model 1
+bunch 1
+environm that foster 1
+sc o departm 1
+datab to look 1
+bind dont prov 1
+analog to sen 1
+rouf 1
+run hypermail 1
+design softwar 1
+yah to hunt 1
+ingratitud willeth me 1
+htmlguru aol.com acc 3
+log bionet.molb.methd reagn 1
+foster individu growth 1
+straus subtract 1
+rout 2
+ballad project 1
+intact mo 1
+symmeter sid cut 1
+script avail 1
+lik reach 1
+manufactur produc 1
+gdb becam 1
+older build 1
+mendel inherit 1
+promeg 1
+interattiv per lan 1
+nomencl 4
+fight displ 1
+specif for snowboard 1
+cdr overview 1
+montclair st 1
+uncertain mark 1
+member 12
+engineer and medicin 1
+rat of cultur 1
+herein 1
+fundam 2
+human o genom 1
+mail me contain 1
+dagger stanc 1
+archaeolog surv 1
+ra shamr project 1
+if.ui.no 1
+rown 1
+stink 1
+snowboarder us soft 1
+support group 1
+tripl 2
+month instead 1
+as to shop 1
+map from ceph 1
+tag to html 1
+sum and fl 1
+saw th rag 1
+origin distribut 1
+begin writer 1
+genom o encyclop 1
+imag and techn 1
+purp 10
+museum vliegclub grimberg 1
+giv on tuesd 1
+kind rel 1
+david donaldson 1
+loc produc 1
+sw 2dpag 2d 1
+vessel 1
+campbel 1
+av of error 1
+initialyour 1
+label peopl 1
+art and collect 1
+pjf inesc.pt 1
+year writ guar 1
+dec th ey 1
+inform last upd 1
+touchst 1
+freenet.carl.ca 1
+number of group 1
+group serv 1
+tun american project 1
+geometer design 1
+ser of script 1
+ther appertain 1
+think wev help 1
+instrumentum 1
+anc pol 1
+ol pol 1
+tim at wel 1
+draw tool 1
+turn requir incr 1
+shop as 1
+putz 1
+univer o departm 1
+promin 3
+european molecl biolog 1
+pharm 1
+2nd centur ad 1
+bennet 1
+cl leagu 1
+bioinformat o switzerland 1
+derek brownjohn 1
+men to command 1
+mail to obtain 1
+aspect of environm 1
+theatr 1
+sign of veg 1
+bright or snowbird 1
+nat intern centr 1
+keyword cont keyword1 1
+schol fault 1
+surfac grav marker 1
+us of distribut 1
+shouer vpon 1
+brit aerob 1
+tran color gif89a 1
+withstand th nobl 1
+danger by me 1
+epidaur med 1
+ey ar deceiv 1
+vicin of prap 1
+pind hymself 1
+surfac find 1
+vant and disadv 1
+univer multim med 1
+cover ar multim 1
+haemophilus influenz 1
+ray coleman 1
+pittsburgh supercomputer center 1
+uh gen server 1
+feder ag 1
+mh cultur developm 1
+biotechnolog institut martinsr 1
+tr to ruyn 1
+eb european bioph 1
+automat 8
+for archaeolog 1
+web and gopherspac 1
+bigbook 1
+laserj printer 1
+alp inform 1
+germplasm 1
+rijksdienst voor 1
+research inc universit 1
+theolog 1
+mean a me 1
+northeastern turk archaeolog 1
+fo hypermail 1
+natur and soc 1
+inclus artif 1
+kirkham 1
+hast vnt 1
+explor model 1
+wabash colleg 1
+biochemister tut veracruz 1
+hop to ad 1
+mark new 1
+head to acquir 1
+lab markus meister 1
+mad accord 1
+netbsd 1
+school trick 1
+spon a week 1
+giv a perfect 1
+www talk 1
+protein gel datab 1
+weight dead center 1
+infomac archiv 1
+bent low 1
+virtu libr entr 1
+vicin of preh 1
+el amarn 1
+attachm 1
+internet explor 1
+tast bud crav 1
+visu pr 1
+number of way 1
+flower 2
+proc of develop 1
+car out lab 1
+un arch 1
+promot 7
+program with fl 1
+hexadecim 2
+def th black 1
+bureaucr way 1
+cariadoc elizabeth 1
+view of stud 1
+solut 3d field 1
+incr effort 1
+arachnion 1
+univer sit engineer 1
+environm protect ag 1
+consider 9
+rumor mil 1
+prof georg kor 1
+job post 1
+prompt 2
+hypermail is read 1
+alexandr jl 1
+lifetim 1
+del coff drink 1
+escap 1
+equiv circuit model 1
+illin o school 1
+man of mean 1
+augst seminar 1
+guid to germplasm 1
+presenter 1
+techn introduc 1
+dav bouman 1
+pattern 8
+destruc of sit 1
+sem autom gam 1
+hop you enj 1
+cl eirean 1
+mailb 1
+hypertext docum 1
+protein and nucl 1
+renfrew model 1
+rever sort 1
+simil build 1
+window manager 1
+schol hi secr 1
+mailt 2
+hammer 1
+med institut 1
+centocor 1
+ac univer 1
+soc sc www 1
+bud crav 1
+man stand fr 1
+militar 1
+hist imag 1
+me som snazz 1
+schank 1
+staff of twelv 1
+want to try 1
+grab 2
+grac 1
+grad 3
+phon book 2
+arch and cl 1
+culin road 1
+man may com 1
+road show 1
+grap 1
+giftran 2
+hy hym 1
+accept command 1
+cognit and psycholog 1
+hotbot 1
+grav 5
+anc hist guid 1
+graz 1
+propriocept 1
+maint 2
+resourc map fil 1
+ban snowboard 1
+salakt 1
+coast of tun 1
+newstead research 1
+fil and ind 1
+www talk direct 1
+integr technolog 1
+cyclad 1
+lexicon 2
+aberdeen 1
+arch gatew 4
+videotap 1
+undertak 1
+josh hartman 1
+popl disc method 1
+pl giv 1
+center for adv 2
+man to break 1
+direct and search 1
+prokaryot 1
+methodolog 1
+disser on hc 1
+particl styl 1
+assemb control 1
+bioph and molecl 1
+latest html 3
+natur basin north 1
+com thus 1
+15nov92 1
+mak al shift 1
+pig did as 1
+lyeth 1
+flyb human 1
+kraus 3
+kraut 1
+settl loc 1
+depth and thus 1
+fold classif ba 1
+biotech hom pag 1
+biomolecl structur mater 1
+increm 2
+waterman 1
+fe to pa 1
+knuckl down 1
+rox theatr 1
+grec 1
+actu look 1
+clean 4
+wound without maim 1
+greg 7
+autom 12
+clear 6
+weapon to perform 1
+prodom protein domain 1
+orlean march 1
+fluid flow 1
+badam appear 1
+me in washingt 1
+elizabeth eyr de 1
+inform on var 1
+theban 1
+excav at pog 1
+beach 1
+grew 2
+enter th arch 1
+modif tu 1
+stupid 2
+hm progr boolean 1
+writ th pr 1
+sem random 1
+internet resourc list 1
+solut for creat 1
+nc publ inform 1
+didask 1
+resourc for cl 1
+desktop 2
+biochemister server harvard 1
+sword be longer 1
+molecl dev ltd 1
+invit contribut 1
+discern 2
+crystallograph of supramolecl 1
+exam 2
+dist educ program 1
+quarreler 1
+width stanc 1
+technolog research onl 1
+plester 1
+den tr seigneur 1
+downtown 1
+separ mail mailb 1
+warfar 1
+kpt displac.schizophr tip 1
+displ th usag 1
+spindl 1
+pigl.cs.um.edu 1
+al had br 1
+text encod 1
+stud of mater 1
+soph understand 1
+wid web digit 1
+maintain with honor 1
+pl god 1
+med cybur 1
+roman bath wh 1
+good any tim 1
+amersham intern 1
+grid 1
+peter tod 1
+watch hi com 1
+univer of erlang 1
+mistrust 1
+massachus institut 2
+undergradu concentr 1
+direct of biotechnolog 1
+skil and enthusiast 1
+sbh nord tr9 1
+grip 1
+snowboarder to ge 1
+great to endanger 1
+comput educ technolog 1
+on deer 1
+hammon 1
+biolog and phy 1
+server pharmacokinet resourc 1
+affil hospit massachus 1
+titl is avail 1
+institut hol 1
+status div 1
+aegean th ge 1
+job ech 1
+til in styl 1
+moment 4
+individu paragraph 1
+highest qu pr 1
+origin develop 1
+old prouerb saith 1
+fr hutchinson 1
+person month 1
+man good hap 1
+shaun palmer 1
+imp to uncr 1
+spac to se 1
+speech abus 1
+exec 1
+xwav sign an 1
+contain ver ext 1
+compreh harvest resourc 1
+sir said 1
+restrict 6
+p450 contain 1
+keith 2
+list ind 1
+elit eventu becam 1
+houseband iust 1
+susp mail listproc 1
+kind of ca 1
+defaultind 1
+thereb a shorter 1
+model using particl 1
+xav hist 1
+heidelberg 2
+genev univer 1
+guest book 2
+fal rap 1
+escom 1
+snow pictur 1
+ma spectr 1
+czech republ email 1
+mind hammer 1
+extern look 1
+chip clear 1
+new ballad intytl 1
+film edit 1
+kollman 1
+law europ 1
+organ vehem detest 1
+resourc biotech suppl 1
+england cl journ 1
+valu for red 1
+arizon st 1
+harvest 1
+again 1
+nettrain ge mailser.cmd 1
+antig edad 1
+san ant 2
+digit project 1
+cs.adf.oz.au 1
+ye ver 1
+board no longer 1
+sequ kloth biochem 1
+buffer 1
+sport is matur 1
+aa832 1
+novel developm 1
+interprovinc en la 1
+bizwiz prov 1
+hardwar client 1
+macallan boycot 1
+dead etern surf 1
+manner of danc 1
+demonstrationintellig help system 1
+satisf any tast 1
+attent to think 1
+gron 1
+entertainm 2
+exit 1
+molecl biolog cold 1
+particl produc 1
+grot 1
+grov 1
+grow 10
+sit nearest 1
+gener by xerox 1
+syntac model 1
+progr report 2
+cur research sum 1
+project cour 1
+rap an imperfect 1
+research effort 2
+detail of subst 1
+exp server act 1
+friendship is spoyl 1
+rn protein 2
+go to inform 1
+biolog quiz 1
+foc on me 1
+bionet electron newsgroup 1
+troubl th staff 1
+s.haikarain 1
+discipl network program 1
+cal at mind 1
+vendor 2
+skil man 1
+cel biolog 2
+system compon 1
+confer abstract 1
+pr in mak 1
+toom wkt 1
+spread imp model 1
+adv biotechnolog 1
+dsilv 1
+exchang for prestig 1
+text is ba 1
+com season 1
+sysv i wrot 1
+graph fr 1
+openwindow 1
+quick in du 1
+board featur 1
+multim docum 1
+mak it larger 1
+mind tru lou 1
+grab window 1
+fl text archiv 1
+mach 11
+elbow joint 1
+mar day 1
+resourc list 1
+cr new compon 1
+part th fr 1
+mlm softwar 1
+lat to conver 1
+doubl 4
+cather mar 1
+elizabeth 3
+medief and romanesqu 1
+requir explicit 1
+et redempt mund 1
+doubt 2
+childr and adult 1
+aegin 1
+human genom project 1
+agil of bod 1
+rockefeller univer 1
+displac.star 1
+facil for agricultur 2
+plew cod 1
+vern flor 1
+search www catalog 1
+chair sw feder 1
+vi assoc 1
+educ project 1
+patrick mcgoohan 1
+beard 1
+du lazar labyrinth 1
+manuscript catalog 1
+bad adv 1
+palaeobotan 2
+nucleus.harvard.edu harvard biolab 1
+south of sous 1
+lat antiqu 1
+skil men 1
+sign mixer 1
+govern produc requir 1
+soonest fad 1
+gcg softwar 1
+peopl entr 1
+adv con 1
+dec edg control 1
+grup 1
+archiv magn graec 1
+mik pe departm 1
+hand ar imperfect 1
+simpl key 1
+beast 2
+simpl html docum 1
+vect 3
+merseysid west 1
+expl 1
+specif a color 2
+departm of diagnost 1
+compon model 2
+expr 7
+nmr spectroscop 1
+magn 2
+good further enh 1
+guid to galac 1
+institut peopl 1
+fil ar se 1
+hm mbox filenam 1
+format command vi 1
+univer of kan 1
+biolog karolinsk 1
+beatr 1
+somewhat mor soph 1
+spon organ particip 1
+contact inform 2
+consignm cloth st 1
+beaud 1
+datab inser edit 1
+journ preview human 1
+child car pioneer 1
+escherich col stock 1
+beaut 6
+suggest you ment 1
+caus or reason 1
+trick to download 1
+photosynth center univer 1
+maid 1
+dougl 1
+loc of leptiminus 1
+shap model 1
+inform system develop 1
+fren look 1
+abstract o chem 1
+good thing 1
+mail 24
+maim 1
+protein 3d structur 1
+tip 7a 1
+main 6
+tip 7b 1
+tip 7c 1
+imag libr 1
+tip 7d 1
+polit 3
+tip 7e 1
+fortran tlm 1
+select of prem 1
+fe your adver 1
+virgin biotechnolog 1
+nuremberg cauerstr 1
+tran exampl 3.gif 1
+workst com captur 1
+nom en 1
+univer molecl departm 1
+darmstadt 1
+thereb got 1
+mak their fight 1
+labor member 1
+and wright 1
+england cl 1
+nih guid 1
+step tip 1
+built in me 1
+guard or battl 1
+church lab 1
+group o gcg 1
+nam mean beaut 1
+farm becam impract 1
+me listserv 1
+an o bioph 1
+megab of ram 1
+cal bitnet 1
+list manager softwar 1
+softwar between group 1
+trop molecl biolog 1
+consequ 1
+foot hav tim 1
+extr 2
+tic o austin 1
+mlm softwar faq 1
+men do fight 1
+ithac 1
+biolog inform resourc 1
+went and fil 1
+competit aur 1
+research chair 2
+hear proc 1
+men speak 1
+cog psy 1
+classif adver 1
+hectar 1
+counter each tim 1
+univer of md 1
+sous le mer 1
+conserv 4
+tim it hap 1
+stead st an 1
+categor ba 1
+malt 1
+server docum 1
+look nic 2
+wench stand 1
+vein 1
+bec96 2
+disser abstract 1
+imag 51
+ec arch fil 1
+courag 1
+ol tr 1
+weight and number 1
+ba genomenet 1
+protein colouriser 1
+fil on anonym 1
+suppl catalog sequ 1
+beazl 1
+acceler 2
+clontech 1
+fewer fr 1
+bryng ioy 1
+chief encourag 1
+zer robot 1
+geoarchaeolog fieldwork 1
+ward a sound 1
+chang th typ 1
+telephon 5
+integr genom 1
+accept as poster 1
+cl antiqu 1
+schutz nsp eastern 1
+sup wil lik 1
+part or ge 1
+light lou 1
+us intern nc 1
+discount compar 1
+mdc in law 1
+manu 10
+mytholog 1
+perfect weapon 1
+wilt li 1
+pol con incr 1
+snowboard industr 1
+lin cour 1
+polit foc 1
+design team 2
+univer of pi 1
+cour in speech 1
+transpar imag 2
+perfect reflect 1
+lower and flatter 1
+bampt 1
+list of cor 1
+fi dart 1
+project www 1
+cor sf 1
+miam univer 1
+velv 1
+pr produc prototyp 1
+sourc cod nmsu 1
+10jan95 1
+latest list 1
+chemister labor 1
+good for keyword 1
+recover 3
+biochem psychiatr pomon 1
+eldest member 1
+poster 3
+br great civil 1
+technolog 21
+archaeolog parl 1
+filter 3
+ring stil ind 1
+as transl 2
+regard our web 2
+linux oper system 1
+treatm of compon 1
+peer pol interact 1
+jurisdict 2
+sent each month 1
+featur inclus 1
+symmeter 1
+project manag 1
+parameter extract 1
+v.3.0 be 1
+an geograph 1
+server inclus docum 1
+urquel 1
+marc 1
+mard 1
+macintosh user 1
+mark 11
+marl 1
+genom map dat 1
+mag in lat 1
+world.std.com 1
+implem of siml 1
+point from cr 1
+mart 2
+resort manag me 1
+favor escrib 1
+soc of papyrolog 1
+stud in honor 1
+cr a transpar 2
+delight 2
+equ import 1
+mash 1
+robot equip 1
+genmanu 1
+beef and cab 1
+mask 1
+confer on dist 1
+upperc 1
+xenopus molecl marker 1
+rapid chang 1
+subject.html 1
+hand foot 1
+biolog server 1
+datab o internet 1
+lab jack szostak 1
+bioscan sequ 1
+arseweb contact arseweb 1
+southern greec 1
+greed mynd 1
+folder featur 1
+math 1
+lin blank 1
+roach 1
+matr 2
+requisit 1
+origin cal 1
+good def 1
+major 10
+st th dat 1
+signif surplus 1
+df init 1
+pl hir 1
+good dem 1
+dark bind 1
+subscrib envirolaw john 1
+fright 1
+univer of aberdeen 1
+maud 1
+mi stud photographer 1
+caus bigger magaz 1
+search eng 8
+verd 1
+alt.coff alt.food.coff rec.food.drink.coff 1
+700th 1
+dat versus specl 1
+browser cap 1
+estud interprovinc en 1
+direct tr stand 1
+vern 1
+list of cus 1
+romanesqu categor 1
+gsdb 1
+gam administer 1
+marburg.de 1
+plac abroad 1
+arseweb crest 1
+fam man 1
+menu tw year 1
+ind serv pag 1
+wear of sword 1
+pag wil clarif 1
+docum return 1
+blow giv 1
+period and styl 1
+andr origin 1
+archiv ind pag 1
+bristol biolog sc 1
+hm dirmod 1
+operon technolog biotech 1
+mawr 1
+accompl entir electron 1
+group zenec 1
+internet serv 3
+overwrit ec 1
+sid inclus support 1
+broad rich 1
+find out truth 1
+oldest christm sit 1
+uncr in shorter 1
+server 28
+educ job list 1
+serv pag 1
+rich scatter 1
+oper singer 1
+user cannot plac 1
+autonom 2
+mr d.t 1
+veneer 1
+celebr th 1000th 1
+subscript request 1
+mayb 1
+mayd 1
+us exampl 1
+put up digit 1
+suff for html 1
+cs.stanford.edu 1
+anc mediterranean 1
+yal univer med 1
+group upd 1
+virtu memor gard 1
+gener inform 5
+wound slaughter 1
+me and mak 1
+wargam 1
+length and point 1
+terrain particl favor 1
+select clin 1
+reg inclus ol 1
+exhibit mithr mater 1
+download cap 1
+prob dat 1
+physiolog and molecl 1
+unreason desper 1
+ferreir program chair 1
+faq by norm 1
+distribut repr 1
+an cultur collect 1
+watch th count 1
+center biolog control 1
+tech ind 1
+sun openwindow 1
+labor publ 1
+sk count 1
+microstrip stripl 1
+mail e mail 1
+journ and travel 1
+educ web sit 1
+cam in school 1
+cubicl 1
+com in plac 1
+pl feel 3
+coursewar worthingt biochem 1
+geosim cs.vt.edu 2
+bristol 2
+tight 2
+seigneur arch 1
+brand univer 1
+lil wa transcrib 1
+soc stratif 1
+bin hypermail 1
+hid a hook 1
+vext 1
+jerusalem 2
+weapon of perfect 1
+bristow 1
+fourth artif 1
+worth th pr 1
+impl 3
+gopher foz 1
+impr 3
+exploit in mel 1
+south west dor 1
+direct with categor 1
+clever 1
+proc in med 1
+bioinformat group 1
+inch wil kil 1
+europ mailb.ac.uk 1
+fil menu 1
+produc as output 1
+ac composit 1
+def indeed 1
+dat serv 1
+p50 robot 1
+bi acc guid 1
+cal from advertiser 1
+onl gal 1
+cour for 1
+standard calibr procedur 1
+bsd demon pictur 1
+majest 1
+mannheim biochem pathw 1
+giv forth 1
+center of cr 1
+an acr spac 1
+cylindr geometer 1
+think snowboard 1
+brought me 1
+mov of var 1
+phy chemister 1
+visit to nin 1
+diachron surv 1
+escap or ge 1
+vascl 1
+marsh men 1
+map entr contain 1
+proc of stud 1
+hym pl 1
+project from hol 1
+softwar and return 1
+inform tick new 1
+program wil attempt 1
+specif for paleolith 1
+hand point 1
+speech group 1
+town wh 1
+listowner 1
+cer and pl 1
+camber 1
+meister lab mat 1
+vascl ultrasound 1
+virgin hydrodynam 1
+quietn 1
+courtl 1
+cover molecl 1
+sc wil remain 1
+radiolog departm 1
+compl th tradit 1
+rang of work 1
+fibergl o wood 1
+addr to sen 1
+pack in hydrophob 1
+weight aacompid 1
+fr park 1
+toront 1
+fict resourc 1
+libr stud 1
+teach and learn 2
+lead foot 1
+listproc 1
+abstract 10
+rap much endanger 1
+minoan relig 1
+innsbruck in austr 1
+ack format 1
+seek to win 1
+se for har 1
+tast ar avail 1
+den tr 1
+human genom phy 1
+biochem reag henr 1
+troubl commun 1
+smart 2
+categor select box 1
+look simil 1
+program for fr 1
+webwork copyright 3
+poman 1
+effect th transl 1
+imag is mous 1
+boolean 2
+preserv in cor 1
+coach and drew 1
+chemister softwar univer 1
+boehringer 2
+underwater archaeolog surv 1
+korn say 1
+sky digit 1
+rock n rol 1
+stockholm 2
+protein structur group 1
+telephon and fac 1
+compil th pack 1
+bishop 1
+inform system univer 1
+offer snowboard discount 1
+commerc us 1
+tim been seen 1
+biochemister o mim 1
+sourc and en 1
+young 4
+jo torib merin 1
+softwar vendor 1
+tak warn 1
+cl from alt.reveng 1
+art and liter 1
+simil 5
+lik to appoint 1
+departm of anatom 1
+fam mov 1
+part so wound 1
+finland fac 1
+roast 1
+list l mail 1
+dn sequ kloth 1
+akkad langu 1
+lo of limb 1
+overwrit 1
+lasseter 1
+staff or mor 1
+treasur 1
+fil cal 1
+francophon 1
+graph fr ver 1
+bi internet resourc 1
+enlarg 1
+greek mainland clear 1
+robust assemb 1
+ey therefor 1
+eckhardt dat 1
+stud select 1
+archieplexform at switch 1
+cultur for imag 1
+terman 1
+lepc magn 1
+digit tradit server 1
+chang in cult 1
+interpreter typ 1
+papyrus arch 1
+detail inform imag 1
+forefather 1
+monit serv 1
+institut protein chemister 1
+therefor insuff 1
+cald hym knau 1
+fly fish 1
+surfac ar 1
+becom mor complec 1
+stationer 1
+troylus 1
+point of rap 1
+us by peopl 1
+rn protein medl 2
+contain th word 1
+cancer prev 1
+html html 1
+artif visc 1
+part on paper 1
+dan mcfad 1
+hol and vac 1
+steph pandk 1
+mer sir said 1
+st invent 1
+pennmush ver 1
+espec backcountr 1
+sc instruc 1
+hydrophob cor structur 1
+imag iv writ 1
+battl is join 1
+oldest christm 1
+nomencl guidel 1
+tak hi cr 1
+por favor escrib 1
+com empt hand 1
+pier par 1
+server root direct 1
+youth 2
+intern franc 1
+bigger magaz 1
+di top 1
+keep a fenc 1
+power tip onl 1
+biochemister www 1
+simon 1
+flash mach 1
+grammar 1
+grammat 1
+main system 1
+hpcc blu book 1
+web peopl direct 1
+power tip 2
+prelimin report 2
+twent fe 1
+opportun to go 1
+counter techniqu 1
+unidirect developm 1
+simpl 11
+lyght 1
+maricop 1
+maker 1
+af transarc.com 1
+educat 1
+sf f list 1
+aatdb 1
+deliver a mov 1
+david ackl richard 1
+arbitr map 1
+fight can com 1
+such lad 1
+unicorn o summer 1
+spec in field 1
+introduc spon 1
+di border 1
+dinner spec 1
+effect 15
+describ their contribut 1
+engineer yal 1
+sur watkin al 1
+input for compan 1
+talk about snowboard 1
+perfect resolut 1
+foot or ey 1
+workshop report 1
+etruscan galler 1
+detail inform 3
+prof cooper 1
+mor theolog 1
+foot or fe 1
+optim biolog 1
+stud in cl 1
+coast settl 1
+biolog week 1
+erlang nuremberg cauerstr 1
+univer of datab 1
+extol 1
+internet train collect 1
+foul word 1
+squar wer systemat 1
+weber 1
+greek periph 1
+ai.mi.edu laurel 1
+whereupon he pr 1
+st form follow 1
+pr master 1
+sit lim 1
+biolog amersham intern 1
+vnder a bank 1
+model fluid flow 1
+crystallograph sect 1
+electr 8
+dist in conv 1
+learn to ward 1
+vs for our 1
+trust so vniust 1
+network for biolog 1
+gopher menu search 1
+de re militar 1
+fl featur arch 1
+suffolk 1
+smooth 2
+hen israel 1
+unconv therap 1
+re markup langu 1
+jgilber 1
+protein motif 1
+molekl biotechnolog 1
+inch 2
+pomon 1
+interest sc fict 1
+fuller 1
+norman 1
+incr 7
+enh th developm 1
+libr archiplec uk 1
+mbox 1
+knock 1
+ge an electron 1
+senior rocc 1
+trick to av 1
+ag lith 1
+forsak th sup 1
+biotechnolog 3
+alter dormer 1
+nest group 1
+port to os 1
+lin wil word 1
+irc xx 1
+pl to accept 1
+hug nomencl 1
+search fil 1
+stud to build 1
+commun to wid 1
+pag so user 1
+ge int law 1
+exper troubl 1
+manager softwar 1
+common nearer 1
+collabor mak 1
+pyr ma 1
+learn thing 1
+whereb th staff 1
+marburg.de mzr hom2.htm 1
+me th lin 1
+incorpor an artif 1
+ecctd95 1
+foot or kn 1
+bc research 1
+christm ev 1
+htmlguru imag 1
+imag appear 1
+gregor blount 3
+nicyng and tic 1
+creat educ modl 1
+form and dat 1
+seru hi customer 1
+signior rocc 1
+dev ltd 1
+mater saf dat 2
+tim ar redeem 1
+infr 1
+radiolog 2
+workshop digest conclus 1
+field problem 1
+lightspac project 1
+5x ver 1
+pc mag top 1
+anthon nichol 1
+univer quebec univer 1
+featur a sl 1
+fil hi hat 1
+list constitut 1
+hartman 1
+archieplec at amdahl 1
+gentlem 1
+popl genet 1
+approach 8
+flash log 1
+ingr 2
+pacif northwest 1
+promot superior design 1
+direct and shockwav 1
+mycoplasm 1
+tucker lab 1
+center biolog 1
+volunteer 1
+sent to hypermail 1
+hutchinson cancer 1
+mean you run 1
+vehem 1
+badam nor mcnult 1
+acc.conf 1
+vid aud 1
+lighth 1
+boast mon architectur 1
+soc bioph journ 1
+appl to med 1
+gener program 1
+snowboard bind 1
+ext bulldoz 1
+adapt network 1
+origin cal listserv 1
+init 12
+www ar ignor 1
+becam 2
+distinct by think 1
+spen th tim 1
+center for cel 1
+uniqu geograph 1
+robust 3
+mailserv 1
+spiderdust 1
+rrn server 1
+light year 1
+fight is imperfect 1
+ton arch 1
+environm protect 1
+nobl sc def 1
+ahead of common 1
+ward and grip 1
+ant chaperonin tat 1
+blow hit 1
+christm 2
+tolk ba mush 1
+rober 3
+sort fam 1
+mjquibu 1
+program port 1
+inclus a sect 1
+structur hyperm 1
+biochem and custom 1
+molecl prob dat 1
+largest web ind 1
+tak a moment 1
+creat by eberhardt 1
+nc helpcenter 1
+markus meister lab 1
+ge any lock 1
+funnest thing 1
+multim www 1
+plowman 1
+th throughout london 1
+filemod 1
+technolog o hypertextbook 1
+escom publ 1
+cultiv led 1
+an typ 1
+me think faithfl 1
+therm circuit 1
+maintain hi fight 1
+hop of lif 1
+vs behold 1
+detail collect 1
+inf on plac 1
+educom 1
+univer of kent 1
+chief encourag craft 1
+sant claus sant 1
+vnthrift knau 1
+endyng 1
+inclus atcc 1
+chief vsd 1
+anonym ftp sit 1
+hard or resolut 1
+sen envirolaw smith.txt 1
+link and cr 1
+fl featur 2
+silicon val cigar 1
+launch 2
+liv learn 1
+topograph plan 1
+lack of hilt 1
+found hym 1
+sullivan 1
+creat and inclus 1
+southern illin 1
+displac.schizophr tip 1
+dv fil 1
+rutger imag 1
+robin 2
+compan offer produc 1
+count and classif 1
+pr said 1
+anvil th girl 1
+dim structur 1
+postscript ver 1
+plainer 1
+netscap user 1
+sant claus 1
+scal manufacturer 1
+unbuckl 1
+univer egypt expedit 1
+minoan rulership 1
+find peopl 1
+categor ar avail 1
+text port 1
+bl recombin capit 1
+mac gif transpar 1
+fash designer 1
+flat sol 1
+biochem resourc 1
+confer workshop 1
+archaeolog trust world 1
+mlmfaq mlmfaq toc.html 1
+articl model dynam 1
+kongr2.htm 1
+system in austr 1
+pip rob 1
+old man 1
+ma sort alphab 1
+old mar 1
+good sleep 1
+pen dust 1
+tltp 1
+deliv onl food 1
+specif which entr 1
+direct of server 1
+go learn 1
+medicin o nat 1
+test and train 1
+colour 2
+sinck 1
+snowboard boot extern 1
+neuer agr 1
+qualif docum 1
+ch ha defin 1
+exploit of anim 1
+hormon research 1
+gravig 1
+gener electr p50 1
+hypertextu dict 1
+heideg 1
+pag ee aler 1
+devil and imperfect 1
+vi us 1
+nec repr 1
+good purp 1
+server wa pr 1
+phylakop i.2 1
+genomenet austr 1
+cur awar 2
+graph fil format 1
+insl 1
+bereft 1
+distribut plot 1
+known sendmail 1
+inst 10
+creat by prof 1
+work in school 1
+settl pattern took 1
+le burn 1
+thy maister 1
+cr an onl 1
+protein of immunolog 1
+intern institut 1
+an softwar 2
+biotechnolog program 1
+intr 3
+improv 3
+unicorn 1
+cr anachron 1
+mathemat div mechan 1
+christm tr 1
+hist guid 1
+www.biochemister o jav 1
+manag to pl 1
+strang opin 1
+list support group 1
+sinew 1
+robot 6
+technolog to control 1
+compr using 1
+good most man 1
+linkstar 1
+www.nexor.co.uk publ cus 1
+draw th neat 1
+le your opin 1
+regl consol 1
+mcfad 1
+dead or al 1
+hamburger 1
+swissprot pir genbank 1
+intact 2
+understand th differ 1
+cytogenet lawr 1
+mesh view 1
+nat ocean 1
+bold he began 1
+cur profil 1
+protein dat bank 2
+wh th rid 1
+lustr 1
+singl 11
+great swift 1
+mach as transl 2
+etiqu read 1
+color is number 1
+popl fam act 1
+sund morn c.b 1
+html list 1
+uncover liter search 1
+remain prov insight 1
+brit libr 1
+institut lau langevin 1
+recognit 3
+le tw men 1
+lab inclus 1
+avalanch 1
+biochem pathw boehringer 1
+recogniz 1
+anc sit 1
+lloyd 2
+lot of peopl 1
+biolog th rockefeller 1
+becom 8
+lin softwar 1
+known 11
+malt scotch 1
+thrust pa straight 1
+thus hard 1
+showrepl when defin 1
+html tabl subm 1
+specif configur fil 1
+univer of denver 1
+beam 1
+subject ten 1
+speed cam run 1
+val heart 1
+unskil val 1
+bear 2
+beat 2
+light and mag 1
+gal is maintain 1
+pol interact 1
+gif89a imag 1
+fe mor swift 1
+elendor mod 1
+earthwatch 1
+assignm of sem 1
+wwww ar peopl 1
+upstream 1
+email destefan 1
+paper deadl 1
+appear to agr 1
+proper 9
+black whit 1
+espec in insl 1
+fal tim 1
+hold my hilt 1
+aegean palac 1
+act shap 1
+nec is driv 1
+metal band 1
+chanc for injur 1
+sc with concentr 1
+pilgrim to scotland 1
+list program 1
+beck 1
+finest flower 1
+overview cdr new 1
+ozgur onder wrot 1
+biolog o whitehead 1
+sev year 1
+ea be mad 1
+contool.html 1
+hum molg internet 1
+fish tac 1
+usu settl tren 1
+doubt indeed 1
+bask pin 1
+sit worldw 1
+hannover colleg psycholog 1
+educ comp 1
+lik to ext 1
+return to slu 1
+text search 1
+prev neglect 1
+sov union 1
+surf th latter 1
+interest developm 1
+labor ind 1
+arch sect 1
+design proc 1
+serv at univer 1
+beef 1
+webcrawler robot wh 1
+diverg me 1
+sword buckler 1
+been 1
+beep 1
+templ fil 1
+assault 1
+beer 4
+entr using 1
+main chain hydr 1
+design prov 1
+caus a suff 1
+england biolab 1
+lectur hal 1
+portfol 1
+inclus th squeez 1
+help educ 1
+appear and funct 1
+il su fium 1
+act credit 1
+internet educ ser 1
+html in me 1
+mathcad and electron 1
+kick 1
+gig at colleg 1
+cem sit 1
+publ by titl 1
+rulership power 1
+nitr oxid 1
+woolf lab 1
+bioph washingt 1
+mr dat 1
+leg is maim 1
+enforc to stand 1
+head and bod 1
+filenam 2
+handl mailt 1
+rap and dagger 1
+extrem thin rut 1
+kidn 1
+whereat hi wif 1
+resourc to sebast 1
+percept of snowboarder 1
+geomorpholog suit se 1
+ipg.umd.ac.uk 1
+firstnam lastnam 1
+conv for part 1
+id ga 1
+read and writ 1
+manag me 1
+rel succ st 1
+lookup 1
+labor martin karplus 1
+cat on.letter hypermail 1
+sourc and user 1
+lindel blvd 1
+cod avail 1
+land surfac 1
+gener search 1
+cop collect 1
+model server 2
+world lectur hal 1
+cyr 6x86 p150 1
+int fieldwork 1
+old anc teach 1
+xant 1
+moryc guy 1
+hand and hilt 1
+pag for educ 1
+hop you find 1
+inf or invinc 1
+lat mesolith 1
+mark a singl 1
+hat fal 1
+snowboard tabl ba 1
+sturt univer 1
+hurt or slain 1
+principl 4
+boot with zip 1
+art archaeolog art 1
+team ba design 1
+lingu text 1
+ologisch fund 1
+man may fit 1
+rom e il 1
+tak no wrong 1
+explor th fascin 1
+labor and industr 1
+as er interdisciplin 1
+fool fain 1
+talk www0.cern.ch 1
+widespread us 1
+encod oft result 1
+aplac manu 2
+common sor hurt 1
+dead se 1
+increm upd 1
+oliv and cer 1
+wscg97.html 1
+trick and juggl 1
+try wherof 1
+houseband did begin 1
+rn salk institut 1
+wa univer 1
+optim interfac 1
+lit sourc 1
+prototyp prov 1
+archieplec at lanet 1
+develop at il 1
+anc medicinemedicin antiqu 1
+reg pattern 1
+favor is lview 1
+court i ioy 1
+scal st rl 1
+snowboard actu shar 1
+draw their bird 1
+munit 1
+fil download automat 1
+beaud al 1
+sh suppl 1
+danger of wound 1
+dn ba 1
+qu join 1
+pol coordin 1
+spec search 1
+mon night 1
+agr and download 1
+vect codon 1
+inf is avail 1
+bibliograph implem 1
+aegean st 1
+larch 1
+adleman 1
+deafac 1
+find shop virtu 1
+pharm server pharmacokinet 1
+forc econom spec 1
+labor for aegean 1
+ad for travel 1
+vp th fat 1
+larger cit 1
+ufn search 1
+list law 1
+known web direct 1
+gl from sepphor 1
+bent 3
+bask pind 1
+go thither 1
+flow model using 1
+conduit 1
+scratch should know 1
+synth phenom norm 1
+protein sequ datab 2
+european imag 1
+distribut engineer design 1
+thruster 1
+port of thapsus 1
+quest about lic 1
+card por 1
+backcountr 1
+tart orang tart 1
+roman archaeolog 2
+thither 1
+rac board 1
+ba compon model 1
+imprint at london 1
+sc in medicin 1
+unit st 4
+bratwurst and kraut 1
+great civil 1
+br av 1
+tim find 1
+guar 1
+southern greec topograph 1
+therewith 1
+entitl model fluid 1
+digitrad world.std.com 1
+resourc gradu 1
+produc developm environm 1
+preserv as conspicu 1
+lyk lou 1
+aegean wh 1
+publ guest book 1
+vinc lust start 1
+kind 10
+id pl 1
+king 2
+valu as 1
+journ prent hal 1
+kink 1
+journ european 1
+hc rel 1
+list of arch 2
+datab of sequ 1
+conform 1
+3d imag 1
+on and hop 1
+commun point 1
+link to internet 1
+thursd 3
+background whit 1
+intern graph fil 1
+produc revolut 1
+isabel william 1
+berg 1
+restrict enzym 2
+correct url 1
+hand and foot 1
+overlap center tongu 1
+bern 1
+multim computer 1
+spac lim 1
+opt specif 1
+run by train 1
+netscap browser 1
+project that inclus 1
+confront aegean preh 1
+conserv ecolog 1
+databank o univer 1
+owl non redund 1
+printer read 1
+wroxeter 1
+cal cob 1
+genet o u.c 1
+por med using 1
+character of freestyl 1
+ge macperl 1
+silverman 1
+jerem 4
+organ governm 1
+warder to def 1
+hierarch order personnel 1
+fil to read 1
+obitu pag 1
+tomasz 1
+arch serv 1
+suff sub econom 1
+unit st rutger 1
+stand upon school 1
+board is suit 1
+rap stand fast 1
+mar archaeolog 1
+impr horizont 1
+spac of off 1
+hypermail hypermail.html 1
+origin norweg 1
+project and sit 1
+ben lazreg 1
+apprec 3
+cur run 2
+cut depth 1
+imperfect weapon mak 1
+gif89a fil 1
+northeastern turk 1
+conjug 2
+sc publ 1
+sheffield 2
+buckler ha adv 1
+therefor produc 1
+earl of essec 1
+kirk 1
+frankfurt 1
+an biotechnolog group 1
+sid being consider 1
+premiership tabl ar 1
+consignm 1
+hierarch 3
+catch of wild 1
+ba help 1
+metamorph of ovid 1
+coff compan 1
+redund protein 1
+lab project 1
+welcom 17
+tamper med school 1
+fight th adv 1
+newsletter centr dhistoir 1
+pharm server 1
+edg control 1
+protocol 2
+lat begun 1
+postprint 1
+physiolog woolf lab 1
+contain us 1
+consequ ri 1
+shirl nolan 1
+workshop 10
+def or fight 1
+demand for graz 1
+aeroplan imag av 1
+guid 20
+solut 3d 1
+act ev man 1
+guil 1
+europ us 1
+reag suppl 1
+docum typ 2
+ba protein model 1
+answer th tim 1
+postgradu 1
+ge to liv 1
+descript museum atl 1
+eight tim 1
+linux freewar 1
+unsaf 1
+clin in conjunct 1
+tool for grab 1
+orlean 1
+facsimil resourc 1
+il knock 1
+frivol thing 1
+la antig edad 1
+speedeth 1
+trafalgar 1
+contact webmaster 2
+borrel burgdorfer 1
+lo of tim 1
+tim model 1
+dat cop 1
+pygm 1
+www vl electron 1
+ge a backgroundsingl 1
+jumper said 1
+switzerland 5
+world th shroud 1
+sourc for acc 1
+tariyng 1
+cal langu 1
+interattiv 1
+ext remain 1
+chemister biochemister departm 1
+den and rich 1
+pol to help 1
+research labor 1
+try a loc 1
+person shop as 1
+kind of ser 1
+magn graec 1
+valu genet evolut 1
+contempt 1
+chanc strik 1
+imag avail 1
+say ye 1
+balad in pr 1
+research stud 1
+mailser.cmd 1
+mycdb 1
+good for 1
+recr snowboarder 1
+gilman 1
+inclus th illustr 1
+ser mathemat 1
+cit o departm 1
+sen envirolaw 1
+european bioinformat institut 1
+bod straight upright 1
+acc to archaeolog 1
+using specif 1
+writ www coursewar 1
+scotch whisk 1
+retr fiv tim 1
+disdayn your beaut 1
+snsplac foc 1
+dn rn 2
+gradu event 1
+molecl recognit 1
+sw 2dpag 2
+certaint 1
+hpcc blu 1
+cambridg theban mi 1
+administer task 1
+margin environm 1
+reserv univer 1
+shimmer 1
+world problem 1
+background ar using 1
+seau year 1
+review cl 1
+us a wider 1
+ignor unimport me 1
+bel cant concer 1
+approv 1
+polymer chain react 1
+culin 2
+vin vendor specializ 1
+natur or artif 1
+antwerp o rrn 1
+book html hot 4
+meantim 1
+capabil 2
+host computer 1
+research center 3
+confer on intellig 1
+ver of perl 1
+di link 1
+ar pot den 1
+st rutger 1
+metabol pathw datab 1
+good ftp 1
+departm of cel 1
+judg being seen 1
+term with exampl 1
+guru 5
+tradtit of mag 1
+archiv th usenet 1
+annel 1
+kraus power trick 1
+prov motiv 1
+presenter in key 1
+channel 4
+engineer research center 1
+ioyl 1
+2nd erlang 1
+think another snowboard 1
+ioyn 1
+mcnult say 1
+seau yeer 1
+pr you tel 1
+mi to europ 1
+univer of gron 1
+recept mult 1
+com th book 1
+good imag 1
+health sc centr 1
+departm of biom 1
+hypermail 1
+aegean trad 1
+leptiminus export 1
+biom supercomput 1
+kraus power 1
+univ.of west bohem 1
+ba inform us 1
+com vi irc 1
+apol refer 1
+circumspect 1
+lookup another word 1
+articl arch contain 1
+prof developm ressourc 1
+hardcop from mi 1
+onl medief 1
+lif compl 1
+altav 1
+crew al star 1
+fund council 1
+skirb 1
+vinc say 1
+endanger lif 1
+entir arch 1
+tabl hist highbur 1
+cur print ver 1
+suff to def 1
+cur allow 1
+cajol 1
+gulliver 1
+maximil univer 1
+krobison nucleus.harvard.edu stev 1
+serv nassau 1
+surplus produc 1
+exper or alphab 1
+term of complec 1
+mintz levin 1
+gen server 1
+rap hilt 1
+direct over 1
+jo torib 1
+menu and recip 1
+univer inform gatew 1
+funct simil 1
+halv feast 1
+fortran tlm cod 1
+task and mak 1
+man ca 1
+arch ologisch fund 1
+screen using 1
+mind to off 1
+i569 1
+annik 1
+meant 2
+sun sparcst 1
+molecl biolog reag 1
+mapview 1
+slower 1
+larger perm ar 1
+absolut chronolog 1
+copyright nexor 2
+www resourc alt 1
+pictur gal 1
+mcgil 2
+sleep in deep 1
+vaunt 1
+revu intern 1
+schedl 6
+irish web server 1
+film on going 1
+pat mak 1
+boot extern look 1
+www yellow 1
+stoddard rol 1
+articl sort 1
+aid design 1
+fight is beat 1
+serv as project 1
+adminstr o molecl 1
+sk magaz 1
+ind of imag 1
+email kevin ge 1
+model prop 1
+return to top 1
+alter 4
+number of pixel 1
+hunt for lo 1
+prim plough 1
+roman empir la 1
+strong bi 1
+groff html 1
+hydrophob cor 1
+fil with inf 1
+david ulan 1
+hannegan is loc 1
+3rd internet world 1
+arrang 4
+color cover 1
+appropr mail server 1
+extract procedur 1
+scanner 2
+weapon for lack 1
+backbon 1
+pl feel fr 3
+molecl biolog univer 1
+strong cr 1
+corinth 1
+eu day 1
+fict author 1
+annot server bc 1
+forth their arm 1
+colleg london 2
+intern support project 1
+docum rank high 1
+robin hood 1
+perman grid 1
+resort saying 1
+jackson hol 1
+ba upon gift 1
+da hou 1
+en la antig 1
+microstrip stripl susp 1
+coast and closer 1
+commander 1
+prof peter 1
+climat 1
+greater detail 2
+conver to html 2
+web internet 1
+robot manipl 1
+put snowboard 1
+protein motif fingerprint 1
+meatb 1
+problem renfrew 1
+bruer he crept 1
+boy and young 1
+us introduc 1
+univer of main 1
+poor repr 1
+sound em 1
+giftopnm orig.gif ppmtogif 1
+annot 5
+ba mush 1
+addr by march 1
+addr giv 1
+th did proou 1
+power robot creat 1
+institut lau 1
+alp board featur 1
+quibu eabu420 ea.oac.uc.edu 1
+stud photographer 1
+south florid 2
+electrotherm tran model 1
+team design proc 1
+nanotechnolog hubbl telescop 1
+unsur 1
+smil sort 1
+guid sc 1
+mail and gauntl 1
+abstract thought model 1
+ment guy 1
+liv wh 1
+valu genet 1
+perman institut system 1
+insuff heel hold 1
+atl of sid 1
+remain nam 1
+fa cup 3rd 1
+fight dep altogether 1
+cyberspac 1
+valu guid 1
+lying 2
+seek it wh 1
+def th hand 1
+hm var number 1
+method of maintain 1
+electr equiv 1
+vnt your thought 1
+interdep of farmer 1
+man le 1
+man li 1
+proc arch 1
+larger rider 1
+good mayd 1
+term to describ 1
+ded to nlp 1
+word lik web 1
+educ resort 1
+fin rap men 1
+north afr 1
+starck 1
+www virtu libr 3
+polyethyl ba 1
+format as not 1
+runnel 2
+lib john do 1
+runner 1
+wound hart 1
+us and teach 1
+mak a magaz 1
+nam organ entr 1
+voor moleculair biolog 1
+continu rapid 1
+produc developm cycl 1
+buch von 1
+fear th worst 1
+doz model 1
+counsail 1
+ar of densest 1
+eight year 1
+min re de 1
+hypoth champ 1
+hear th proud 1
+reason be den 1
+refer in figur 1
+museum appl 1
+act maintain 1
+rijksdienst 1
+philotheou monast project 1
+acquisit hardwar 1
+workst technolog 1
+physiolog mintz levin 1
+me tag 1
+list manager 1
+renfrew 1
+olymp gam virtu 1
+forml ba 1
+cur squ 1
+singl hilt 1
+molecl biolog novag 1
+univer ind 1
+fin paper gild 1
+thereupon 1
+abbot northwestern 1
+lo their labour 1
+postscript printer 1
+la antig 1
+singl dual 1
+sit of arch 1
+research univer 1
+encour half 1
+period sen 1
+bouch du 1
+cor commun 1
+cylindr 1
+intron datab 1
+excav at leptiminus 1
+facil john hopkin 1
+gradu diplom 1
+se to mediterranean 1
+sit an 1
+greenhaus 1
+tic at arlingt 1
+intellig labor 1
+cur irish 1
+optim method 2
+pbm.com 5
+medief stud infoserver 1
+project to cr 2
+unimport me 1
+examin a geomorpholog 1
+en their liv 1
+kjetil 1
+liv in priv 1
+sit d1 1
+on.letter hypermail 1
+altru 1
+discipl 3
+siml gam 1
+pioneer molecl biolog 1
+regr further 1
+chain and main 1
+headach 2
+specif th number 1
+thrust or blow 1
+listn ear 1
+sit e1 1
+worst baseplat 1
+imag for art 1
+violin 2
+pl in pbm 1
+hydr bon calcl 1
+computer lab docum 1
+contribut photograph 1
+wiin seau yeer 1
+strong pr 1
+click 14
+webmaster ncc.com upd 1
+excel introduc 1
+web client 1
+unapt to mov 1
+with be imperfect 1
+seem fairer 1
+blow espec 1
+sauing 1
+sit g1 1
+naft in int 1
+har maintain 1
+larger problem 1
+institut martinsr institut 1
+horizont rl 2
+search clin 1
+infoc ctil forthcom 1
+oldenburg arch 1
+hard ever look 1
+sk show featur 1
+arachnet 1
+wom form 1
+cit and abstract 1
+sit fr 1
+inform stud 1
+thought a good 1
+narrow pac 1
+fortun hap man 1
+eight or nin 1
+pomon colleg medicin 1
+clear a sit 1
+ver nc 1
+archd 1
+cruz avenu 1
+london in fletestreat 1
+spectrogram 1
+uncr speed 1
+sit i1 1
+retrospect 1
+sit i4 1
+technolog ar 1
+compl lo 1
+jim car 1
+interdepartm biolog sc 1
+robison krobison nucleus.harvard.edu 2
+modern 8
+dearer frind 1
+agreed 1
+3il4h4 3ht netnew.upen.edu 1
+centr pier par 1
+retrief 8
+convolut for correct 1
+symmeter sid 1
+centur ad 1
+macromolecl structur 1
+as robot 1
+field of instruc 1
+level cour offer 1
+renfrow 1
+departm personnel 1
+partnership which giv 1
+modest 3
+de pr histoir 1
+list of word 1
+technolog ch 1
+fam pig 1
+centur bc 1
+rec list mail 1
+carl univer 1
+hm var 1
+fund ra aspect 1
+apiec 1
+mod from nelson 1
+interest html 1
+object model 1
+html suff 1
+northwestern hospit 1
+seemeth 1
+pag abstract 1
+cooper cuckold 1
+tim scal 1
+milit riddl 1
+run an anonym 1
+chemicool period 1
+niccol 1
+brav def 1
+zuerich 1
+spirit 3
+cast th bil 1
+print drug 1
+standard me tag 1
+circumfer 1
+geograph inform new 1
+instruc strateg 1
+pin th bask 1
+magelan nic look 1
+archnet 1
+reagn faq 1
+ward to stand 1
+int method 1
+genet diver 1
+wurld 2
+pa o look 1
+follow th instruc 1
+hannover colleg 1
+ital peacemaker 1
+geu arbittr 1
+southern aegean 1
+metabol medicin 1
+src htmlguru imag 1
+ltd cornel univer 1
+fish sc 1
+archaeolog research 2
+phy loughborough 1
+popl to liv 1
+seek find 1
+block 3
+mailser 1
+cal leap 1
+team of prof 1
+find great imperfect 1
+center o netherland 1
+plow soil 1
+imag is render 1
+go clear 1
+therefor com 1
+se our ext 1
+micr organ 1
+model postl 1
+en biotechnolog univer 1
+prisoner faq 1
+bsd oper 1
+2d protein gel 1
+spectrometer and protein 1
+int for cit 1
+night footb 1
+mead 4
+alph pc 1
+funct dep 1
+la francophon 1
+rat o port 1
+entir new sit 1
+prostitut 1
+cupid had caught 1
+labor for perceptu 1
+mean 12
+oper recr 1
+ad as tim 1
+hap to invit 1
+list of gam 1
+climb 1
+meat 1
+usu settl 1
+desktop and port 1
+compl se 1
+law europ mailb.ac.uk 1
+capacit 2
+top ten list 1
+soc bioph 1
+st for famil 1
+conver to link 1
+why did civil 1
+hm incr 1
+li ge 1
+compl st 1
+cr wer dev 1
+siphn 1
+mycenaean cultur ra 1
+pl sen email 1
+therm network 1
+hm mbox 1
+emac html mod 1
+stout def 1
+lab inclus vxwork 1
+food and drink 1
+tlm bibliograph implem 1
+danm morsepr.com 1
+mar hal 1
+curt air 1
+start search 1
+psycholog departm 1
+pag titl follow 1
+cr refer 3
+chuck 6
+agent 6
+salt work facil 1
+fl satisf herein 1
+bioweb 1
+prov good food 1
+review and publ 1
+bristol biolog 1
+archnet univer 1
+center that travel 1
+medl 2
+coulson 1
+rap in gener 1
+jerem rutter 2
+gam autom 1
+vouchsaf 1
+fam master 1
+bruer chancd 1
+hard a novel 1
+fal fight 1
+bod ar discover 1
+anc greek world 2
+cern www 1
+moou my endeauour 1
+arc biotech 1
+middl bronz 1
+fight ar fal 1
+ryh nen equiv 1
+imsd.meb.un 1
+brunch 1
+map of particl 1
+ge enough quest 1
+manag 7
+dread issu 1
+addr book 1
+human computer 2
+honor mart censur 1
+individu creat 1
+hylt th cl 1
+sit sl 1
+why minoan cr 1
+ka kraus 3
+stand fr 1
+job in postcompl 1
+suzuk adver 1
+fly at austin 1
+vict 4
+pdq support car 1
+abram gam 1
+program by david 1
+encomp th loc 1
+mauretan 1
+prof consult serv 1
+accept and reject 1
+www coursewar 1
+med caus 1
+river 1
+anc spindl whorl 1
+stuff.html 1
+definit guid 3
+crav with burger 1
+law lib mead 1
+sequ search 1
+4.4bsd lit 1
+going to writ 1
+mim typ 1
+brunel 1
+answer var fight 1
+fight as good 1
+livermor 1
+tin farm 1
+vien 1
+ec.uv.ca 2
+brow th web 1
+wrestler 1
+view 21
+forth of book 1
+plain tic macrolog 1
+intrav o oyster 1
+reag henr 1
+ver of cus 1
+user input 1
+anc roman 1
+asunder 1
+molecl biolog invitr 1
+anom natur 1
+sprachmater 1
+facilit 2
+develop inform technolog 1
+computer manu 1
+damp 1
+docum preh 1
+shewyng he light 1
+macromolecl crystal 1
+man alw fight 1
+danc 5
+infoseek is commerc 1
+dand 1
+dang 1
+bramefan 1
+danm 1
+deck vs 1
+off acc 1
+quantit stud 1
+ingellig 1
+edit monit 1
+cancernet datab 1
+blood 3
+thing wor 1
+off act 1
+apish 1
+clim differ 1
+palat system 1
+an is avail 1
+profil dism 1
+refer text 1
+captur and displ 1
+untru 1
+yal univer 3
+archeolog attraver limpr 1
+acc fil 1
+went through perfect 1
+weapon therefor 1
+sc center pharm 1
+input nod 1
+bobm morsepr.com 1
+ba drug 1
+got non www 1
+gil hamilt 1
+giftran to effect 1
+archaeolog fieldwork 1
+sen th fil 1
+amount of botan 1
+metaphor 1
+lik find 1
+lin biochemister 1
+amount of bsd 1
+drink no win 1
+canad cl 1
+ic.ac.uk 3
+missour 3
+fdtd siml 1
+group on craft 1
+learn perfect 1
+bulk transport 1
+count your acc 1
+canad de 1
+protein superfam 1
+ar quest 1
+theor to robot 1
+fr to cr 1
+ten ital 1
+californ institut 1
+tim at stoddard 1
+ment 7
+menu 5
+docum and sourc 1
+computer to prov 1
+direct wh htacc 1
+magnetometer and cor 1
+helper mod command 1
+bound integr 1
+dark 4
+darl 2
+genitourin 1
+refer which disc 1
+dart 1
+archaeolog project 2
+ba by creat 1
+sheffield u.bc 1
+comput and research 1
+integr th program 1
+elim foot 1
+st univer 3
+doyng 1
+dec could mean 1
+brought me vnt 1
+cfcfcf tripl 1
+wid dissem 1
+kernel concept 1
+manag mlm softwar 1
+mov peopl 1
+strik thrust 1
+cur project 1
+gl of rh 1
+lou fl 1
+good hap 1
+patchlevel 1
+bibliographisch 1
+prap support 1
+vinc 3
+breadth requir 1
+subscriber 2
+virtu refer desk 1
+bloud 1
+vinc lust 1
+alumn 1
+tempor mlm 1
+defin their stat 1
+dead mot 1
+interdisciplin workshop 1
+workst run 1
+anthon mother celebr 1
+compon valu 1
+sit of garg 1
+merc 1
+filmograph 1
+an th result 1
+stat sect 1
+merg 1
+compan cal 1
+setter 1
+cach befor view 1
+foot and strik 1
+staff ha adv 1
+viol 1
+vin shak alumin 1
+mannheim biochem bost 1
+untyl 1
+pointer on client 1
+park cancer institut 1
+serv for biolog 1
+bsd new 1
+labor ind univer 1
+hurt shal hap 1
+quick pin 1
+benson 1
+ring to bring 1
+biolog and medicin 1
+snowboard by lat 1
+lin mendel inherit 1
+mesf 1
+differ apprec 1
+phot album 1
+mesh 1
+uncalibr determ 1
+chiefest sen 1
+apol giv 1
+rudg 1
+fickl uncertain 1
+ashmolean museum 1
+answer th var 1
+environm for interdisciplin 1
+molecl design institut 1
+incur forever 1
+cfcfcf 1
+pract natur langu 1
+output an order 1
+nam count 1
+arboretum herbar 1
+control and mobil 1
+merg color map 1
+sequ accord 1
+docum proc 1
+cl philolog clem 1
+mother of tim 1
+deutsch datenquel 1
+keith robison krobison 2
+rad heat 1
+lower shovel 1
+edg may catch 1
+spec agricultur produc 1
+unauthor commerc 1
+sword with hilt 1
+pay paul 1
+fren th franck 1
+european bioph journ 1
+aberdeen o biochemister 1
+rod grup 1
+univer coord quer 1
+repr of lingu 1
+click on fa.mus.bel 1
+plain asc text 1
+search ind 2
+told 3
+popup 1
+german sw intern 1
+tolk 2
+meadow and park 1
+sant portrait gal 1
+mark bock 1
+underground 2
+widest 1
+rugb 1
+tomb 2
+measur using 1
+visc 1
+interest departur 1
+latin 2
+tom karl 1
+whorl prov evid 1
+lu sequeir 1
+univer egypt 1
+shop virtu sold 1
+vist 4
+visu 7
+summer is en 1
+tool o molecl 1
+scient resourc 1
+com to pa 1
+mean to develop 1
+mad he gr 1
+di border altogether 1
+opt ar specif 1
+multipl web ind 1
+register web 1
+prop a theor 1
+vitr 1
+level of interact 1
+subm form 1
+articl about bel 1
+th herof 1
+structur of dn 1
+computer med commun 1
+effect of bump 1
+peer pol 1
+text proc 2
+bomd me jon 1
+took 4
+tool 15
+ruin 3
+compar zoolog hol 1
+toom 1
+zoolog hol hol 1
+bath complec 1
+biom sc feder 1
+biochem journ 1
+format tag 1
+weight calcl 1
+uncertain and unstructur 1
+tooz 1
+giu you watkin 1
+hormon 2
+bewar th toast 1
+dissem init 1
+color ind 2
+univer of osl 1
+thrust fr 1
+workbench 1
+zebr zer 1
+thereb th head 1
+de test grec 1
+webcrawler 3
+en th imperfect 1
+blugr mus 1
+vatican exhibit 1
+us th edg 1
+ingellig lab 1
+hypermail through standard 1
+affair repr 1
+desir of truth 1
+mechan univer 1
+mesolith 2
+breach 1
+transpar tool 1
+nooralihiyan 1
+million dol 1
+evid of human 1
+held inf 1
+emerg of civil 1
+biotech reag 1
+isol exampl 1
+libr html mod 1
+calcl 1
+httpd ver nc 1
+bioinformat daniel hartl 1
+desper 1
+stock 2
+gentlem arm 1
+del coff 1
+el within comp 1
+read on articl 1
+utrecht univer 1
+organ anim 1
+hel you be 1
+teach th val 1
+incr human 1
+william jam mil 1
+label nam def 1
+sc stanford univer 1
+net ind dist 1
+quick refer guid 1
+gzip tar 1
+learn adm 1
+waight 1
+faster 2
+tak charg 1
+reag o reb 1
+centr nat de 1
+bohem univerzitn 1
+maintain territ right 1
+popl a particl 1
+cornel law school 1
+man pag list 1
+hand being aloft 1
+lou st 1
+lak cit 1
+offer upd 1
+giv search 1
+count sheep 1
+hc top 1
+men cannot preu 1
+assembl a proper 1
+border around imag 1
+toun 1
+list non 1
+think i cold 1
+tour 3
+lou th 1
+martin karplus 1
+el of eucl 1
+good hor 1
+list o join 1
+direct euler implem 1
+technolog inc 1
+direct to ad 1
+turn hi wr 1
+shieft 1
+ar and command 1
+robot manipl control 1
+ag dec 1
+appear to dat 1
+colleg uk 1
+daresbur o seqnet 1
+world learn 1
+visu model acquisit 1
+dec edg 1
+workshop digest 1
+papyrolog 1
+tim nor spac 1
+industr univer 1
+jtc taxonom datab 1
+tal statur 1
+lahdenper circuit 1
+sequ massachus 1
+town 9
+new.gif 2
+plac is won 1
+gopher refer pag 1
+institut fr coh 1
+worldw job 1
+bioinformat 3
+inclus any kind 1
+bronz ag settl 1
+book an ad 1
+cyclad preh 1
+comput approach 1
+lab hom pag 3
+robot lab dem 1
+ad upd 1
+ol cultiv 2
+contact number 1
+man to go 1
+lost hi freedom 1
+spindl whorl 1
+staff upright 1
+height 2
+excel secr 1
+eff of combin 1
+vg planet 1
+rush 1
+began to pr 1
+cybur 1
+designer of httpd 1
+digit mach 1
+liber of natur 1
+colon and exploit 1
+sampl docum 1
+skil rap 1
+restrict raw 1
+thrust pa 1
+keyword symbol 1
+team in silverthorn 1
+peopl.html 1
+largest fr 1
+thrust pr 1
+search word 1
+murder poultr 1
+butch 1
+ad url 1
+cal hi pract 1
+whit background 1
+search group inc 1
+impl intern 1
+ba learn environm 1
+favor to giv 1
+composer 1
+using prim sourc 1
+waterl 1
+research div 1
+particl method 1
+dr richard 1
+ind drink 1
+new group archiv 1
+docum from scratch 1
+natur langu proc 2
+civil serv 1
+visu observ 1
+shield 1
+visit inform peopl 1
+acc count execut 1
+opt configur opt 1
+carolin 3
+got th resourc 1
+richard jhon 1
+alignm of protein 1
+seventh centur 1
+brambl 1
+troop 1
+pr drew 1
+gener and continu 1
+flash pag 1
+rel issu 1
+southern illin univer 1
+troph 1
+redoubl 1
+dist or cour 1
+hm archiv 1
+number ha inver 1
+manner of rap 1
+typ of bur 1
+creat by ncc 1
+field of text 1
+bounsyng bl 1
+structur datab scrip 1
+stood 2
+mult med med 1
+try th boot 1
+stool 1
+bil addr 1
+profit nat 1
+depth period 1
+research park 1
+biolog stud 1
+pag below contain 1
+mail fo hypermail 1
+rom project 1
+por med 1
+manner of blow 1
+klat 1
+bioph research commun 1
+composit 2
+ruyn 1
+mil head 1
+colel and wood 1
+biotech bus rensselaer 1
+nomail 1
+form in cr 1
+excit a robot 1
+protein coupl 1
+eb farmer 1
+diversif their produc 1
+sen forth 1
+pr dril 1
+request if.ui.no 1
+ren food bibliograph 1
+barit 1
+stream tar 1
+sun workst run 1
+mcnult it becom 1
+compl tut 1
+prov us inform 1
+ar with 5x 1
+schiz man 1
+exerc sovereignt 1
+cheat sh 1
+prosit 3
+categor by subject 1
+lost in part 1
+lastnam 1
+good reason 2
+univer hypertext book 1
+pl dont 1
+ind univer 3
+se us cu 1
+tb th transg 1
+dunst chyrchyeard 1
+soc with rel 1
+european snowboard prof 1
+robot wh 1
+charl taylor peter 1
+pr and quest 1
+repr th addr 1
+harvard biolab 2
+download th imag 1
+civil hom pag 1
+siluer 1
+breath 1
+pr is simp 1
+tool and softwar 1
+hoouer and shouer 1
+color by merg 1
+celp sourc cod 1
+struck master 1
+gener strateg 1
+oskor 1
+digit imag 1
+assoc can help 1
+aa at tung 1
+metalwork 1
+romanou distribut 1
+research and developm 1
+suggest for futur 1
+conc ye 1
+server at hen 1
+se to ward 1
+biolog print protein 1
+sword against austin 1
+xalap 1
+smith bookseller 1
+hear a song 1
+stout 2
+unusu 2
+nonlin circuit 1
+cat tim 1
+color wil disappear 1
+look sit 1
+dsboum 1
+se of bind 1
+guid for herit 1
+tract in tandem 1
+opinion may suff 1
+unit kingdom archieplec 1
+datab mmd 1
+institut nat 1
+field ba 1
+reg snowboard 1
+texinf and rtf 1
+sen ba system 1
+snowboard on lin 1
+run th uk 1
+archiv find top 1
+us a number 1
+baron 1
+respect of perfect 1
+constitut an agr 1
+cur anthropolog 1
+novelt 1
+pilsner 1
+hym sh plain 1
+inst spher 1
+journ of field 1
+gener hospit 1
+www94 confer 1
+book of def 1
+clim differ apprec 1
+corpor partner 1
+toxicolog univer 1
+top cover 1
+nat sc found 1
+found loc 1
+unst boot 1
+predomin 1
+ob lisqu 1
+becometh a maid 1
+speech in multim 1
+str wer identif 1
+multim author 1
+bsd demon 1
+quick refer 1
+much ad 1
+spac ody 1
+know what sort 1
+sect inclus prelimin 1
+3rd to 6th 1
+centr san ant 1
+dew field 1
+lou is se 1
+fal rap fight 1
+interest o interdepartm 1
+cather mar hal 1
+great surpr 1
+obeletz 1
+entr in srm.conf 1
+further to go 1
+olog sous 1
+mpeg mov 2
+great number 3
+isotop 1
+truth is anc 1
+squar cambridg 1
+temp d gag 1
+yah featur 1
+foot and angl 1
+inclus megar bowl 1
+tech new 1
+european biocomput 1
+hand singl 1
+ea to modif 1
+turn up shovel 1
+great imperfect therein 1
+corpor research center 1
+mak that pl 1
+assembl 1
+imag to gif89a 1
+sander group 1
+cooper wif 1
+illustr 3
+ask a quest 4
+troubl specif 1
+macintosh execut 1
+cur research 2
+ind web 1
+found in march 1
+separ mail 1
+group oxford 1
+artwork from lloyd 1
+lack of skil 1
+man strik 1
+belong ther 1
+chief caus 1
+shak alumin 1
+black letter ballad 1
+travel 4
+buttr 1
+laugh 2
+labor for biolog 1
+traver 1
+carolyn 1
+encyclop 3
+pdq stat list 1
+intern journ 1
+us of technolog 1
+arnold 1
+surv approxim 1
+hardcop 1
+deafac sit 1
+bartholomew 1
+sc bioph physiolog 1
+pl ch 1
+se baight 1
+an an sgml 1
+intern law 1
+tok departm 1
+lad vnkind 1
+train facil built 1
+began 4
+ind of research 1
+hit direct 1
+server sid inclus 1
+reindeer 1
+pl dr 1
+peter phillip 1
+csiswebedit ul.ie 1
+il keep 1
+hp laserj printer 1
+spac font 1
+piec parabol 1
+pr seek 1
+stout doeth den 1
+univer o institut 1
+guid th internet 1
+il tam 1
+wardl 1
+bind built 1
+pal alt 1
+therefor th seek 1
+multit harmon 1
+settl tren 1
+prim attract 1
+oldest 2
+condit and forecast 1
+musc htmlguru 4
+da suffer 1
+.htacc 1
+zebraf new group 1
+rel item 1
+try th battl 1
+bhut 1
+arch server 1
+contest organ 1
+wareh 1
+domin architectur complec 1
+search a fram 1
+13feb95 1
+metal produc 1
+compat donor 1
+motif fingerprint 1
+high in zon 1
+fear and unsaf 1
+univer of berg 1
+using any comb 1
+supporter 1
+going 4
+keep th blad 1
+co fellow 1
+0000.html 1
+therefor no marvel 1
+color edit 1
+bon calcl hum 1
+punt rever 1
+frankfurt univer 1
+palac must proceed 1
+server check 1
+10sep93 1
+liter search 1
+gabriel 1
+louer ar vnbound 1
+ed krol 1
+search inclus 1
+talk direct 1
+stanford rel div 1
+men and troop 1
+geosim mail 1
+project biochem 1
+excel fin 1
+surplus grain 1
+progr boolean number 1
+robot creat 1
+iron 2
+straggl boy 1
+bral com 1
+catch an edg 1
+laurel 2
+african red slip 1
+rol pl 1
+rh ne 1
+upd mon 1
+ci world 1
+inspect 2
+philosoph issu 1
+settl of romanou 1
+biolog sc program 1
+think of se 1
+biolog model 1
+minmac 2
+serv of nin 1
+fin tabl 1
+olithiqu en 1
+begin 9
+du rh ne 1
+interdepartm program 1
+camer 2
+demonstrationintellig help 1
+pl le 2
+alter in plant 1
+nat american leader 1
+color ii 1
+internet world 1
+good int 1
+docum is control 1
+zon a show 1
+swifter cour 1
+yoy.zcu.cz skal wscg97.html 1
+town plaz 3
+nat museum 1
+falkland island advoc 1
+stud of convect 1
+softwar for view 1
+link to psycholog 1
+pag is host 3
+car is tak 1
+featur a profil 1
+musc chuck.musc har.com 2
+newsgroup ded 1
+institut pasteur en 1
+kloth biochem compound 1
+wal found 1
+serv up 1
+crop do poor 1
+st in middl 1
+map viewer 1
+cun in run 1
+good fellow 1
+encourag 2
+manu ba 1
+christopher langt michael 1
+weapon to answer 1
+wal and abund 1
+ajac a co 1
+issu and appl 1
+man a greed 1
+volunteer snowboard patrol 1
+biotech and cel 1
+bolster salt lak 1
+valug light nord 1
+biolog journ 2
+me vnt 1
+deutsch 2
+pl mus 1
+god wer bent 1
+kidn di 1
+biom comput hid 1
+mad mor plain 1
+biolog by loc 1
+manyfold 1
+redef docum 1
+ind univer dept 1
+dat ftp 2
+manufacturer act 1
+millipor 1
+deathnet 1
+sift wil demonstr 1
+mobil robot navig 1
+find interest 1
+ring to rl 1
+paid therewith 1
+fam pig rig 1
+perc throw 1
+network centr 1
+cour and coursewar 1
+fit var 1
+datab cont list 1
+med colleg 1
+nat endowm 3
+2dpag 2
+wright and pip 1
+nationw weather condit 1
+pr good for 1
+pot bon 1
+biolog biocomput jok 1
+centr american academ 1
+inclus dexter 1
+html shtml 1
+center stat 1
+absolut no sen 1
+effect adver 1
+wom departm 1
+statur 1
+status 5
+statut 1
+fenc book 1
+mater ea tailor 1
+pag automat appear 1
+exceed 3
+olithiqu 1
+begot 1
+spak hi mister 1
+hist of leptiminus 1
+engineer rel network 1
+univer pr 1
+curricl demand 1
+breed to blam 1
+docum which mak 1
+rasmus karl 1
+pag for robot 1
+arseweb 1
+southhampt 1
+pl se 2
+year by mark 1
+mgdb 1
+pl in school 1
+lou a new 1
+tim and plac 1
+nomber 1
+heckler lay 1
+med cant help 1
+basel 1
+sum on mi 1
+integr 8
+nlightn a univer 1
+mov and thrust 1
+chaperonin tat 1
+qu and valu 1
+slight for 1
+drink of bottl 1
+control learn 1
+web project 1
+euer in court 1
+resourc do 1
+wand tip 1
+utah snowboarder 1
+search and an 2
+bibl 1
+cinvestav ipn 1
+expir addit not 1
+terrac 1
+nearb major 1
+imagetool 1
+quantit biolog 1
+inclus th mail 1
+branch 2
+geograph quiz program 1
+weapon whatsoever 1
+genom center biolog 1
+stapl of cer 1
+hew asunder 1
+jackson labor 1
+thousand of user 1
+footb 2
+bizwiz 1
+univer st 1
+univer of oxford 1
+settl wa typ 1
+com forth 1
+pl us 2
+brook david jefferson 1
+rel work elsewh 1
+thorough 2
+biomolecl genet fish 1
+softwar guid departm 1
+ingmar 1
+qu th user 1
+fair tight 1
+strang 3
+tempestu term 1
+hot top announc 1
+physiolog mintz 1
+fight between part 1
+browser which support 1
+cur ver 1
+en imag interleav 1
+weather and satel 1
+univer law 2
+earliest preh 1
+cel molecl biolog 1
+rugger 1
+basin 2
+univer of chicag 1
+cat var spool 1
+rap of conv 1
+gn me libr 1
+begun 2
+eng o archieplec 1
+assum that minoan 1
+suggest by gambl 1
+priv donor 1
+hypermail wil conver 1
+self addr 1
+natur gav 1
+multifac problem pr 1
+spiderdust o mornixuur 1
+pl thereb 1
+danger of blow 1
+philolog 2
+psychiatr pomon 1
+restrict sit 1
+jok molecl 1
+undigest 1
+program o day 1
+pennsylvan bat 1
+swallow 1
+grav center stat 1
+publ describ 1
+adv th runner 1
+preh devot 1
+geograph soc 2
+problem ba 1
+thrust both strong 1
+silver 2
+hebrew univer 1
+technolog publ rel 1
+lin and email 1
+http bin acc 1
+bird spit 1
+alejandr 1
+mail bomb 1
+list of subscriber 1
+mail disc 1
+noblem gentlem 1
+mach tract lexicon 1
+classif road 1
+bost colleg 1
+intent 3
+surv encomp 1
+earliest writer 1
+assoc with contemporan 1
+scholarship 1
+search th digit 1
+lin and nonlin 1
+le weblouvr 1
+brenner s.e.brenner bioc.cam.ac.uk 1
+particl countr 1
+mod in emac 1
+resourc discov system 1
+newspaper subscript 1
+york cal 1
+cont of journ 1
+program th disc 1
+ye chr beard 1
+aliweb robot period 1
+great error 1
+problem in minoan 1
+spectr datab 1
+team sort 1
+prop standard 1
+meditterranean 1
+technolog train init 1
+us conver 1
+visit your pag 1
+workshop direct 1
+poniard gauntl 1
+territ 2
+hist inform program 1
+neighbor of ph 1
+lim o bi 1
+syllabus magaz 1
+prepar th mater 1
+sen and actu 1
+hen micr 1
+lack of light 1
+except 1
+list of ind 1
+emerg funct definit 1
+reag sup 1
+project on lin 1
+smallholder 1
+sylv fish 1
+biolog on lin 1
+turn wheel 1
+bilk 1
+straus 1
+millipor on lin 1
+engineer 13
+dcrt 1
+jim mil jun 1
+intern 21
+republ email 1
+imperfect insuff weapon 1
+interv 3
+subscrib law lib 1
+problem pr confront 1
+coast west 1
+quest o comp.dsp 1
+continu in great 1
+equipm thing 1
+orthodox read pag 1
+hist recip 1
+lbor.ac.uk 2
+allow th subscriber 1
+univer coord 1
+answer again 1
+var pol typ 1
+human occup 1
+cyberm project 1
+bind 3
+bing 1
+me ar typ 1
+culin road show 1
+hir an as 1
+robot period 1
+text proc task 1
+ba compon 1
+natur giv 1
+nat th ct 1
+tom maniat lab 2
+ec ii 1
+bioc 1
+mag ar look 1
+biod 1
+centr nat 1
+ea as for 1
+biog 1
+fren and kind 1
+thursd afternoon 1
+biom 3
+creat which sort 1
+biop 1
+sourc to loc 1
+perceiv 2
+sheridan 1
+earl nelson 1
+var cel act 1
+register is fr 1
+textu 3
+educ academ 1
+list pcr 1
+field problem indep 1
+datab nrl 1
+commerc exploit 1
+post to pin 1
+enzym enzym nomencl 1
+matematisk institut 1
+constantn 1
+support group commun 1
+medief and ren 1
+qu man 1
+neutron dynam diffract 1
+specif to inclus 1
+maintain ind 1
+congr vatican exhibit 1
+bankit mater 1
+rad button 1
+develop explan 1
+silvon 1
+bird 3
+french genom server 1
+mater other world 1
+chemister 1
+prohibit from redistribut 1
+resourc compil 1
+sect ar avail 1
+sum stanford univer 1
+awk and sed 1
+gener techniqu 1
+peopl docum 1
+de fisiolog cel 1
+sit at dialiskar 1
+view th minoan 1
+work proper 1
+advoc award 1
+url point 1
+lacedemon punish 1
+which causeth poor 1
+with th point 1
+sun un workst 1
+la cultur et 1
+textu sourc 1
+behav 1
+equ of st 1
+spat an 1
+structur biolog 1
+id to mak 1
+form ba refer 1
+murph 1
+isabel 1
+mycenaean palac 1
+mak th imag 1
+imag look 1
+de la 1
+spin trick 1
+research group 3
+turn speed 1
+show their impud 1
+edad cl 1
+fr pc do 1
+roger 3
+nlp in ireland 1
+print form 1
+exagger 1
+mycenaean palat 1
+fr avail flavour 1
+particl docum 2
+e.col dat 1
+spac of sev 1
+help gdb.org 1
+speed photograph 1
+ba inform 1
+lim ar 1
+agent hav got 1
+torib merin castr 1
+ind articl 1
+lausan 1
+forc th client 1
+flash electron 1
+me nam descript 1
+wonder 3
+draw it using 1
+freedom walk 1
+langevin 1
+faq and ai 1
+group newsletter 1
+me to email 1
+onomasticon project 1
+ad an inclus 1
+specif archaeolog 1
+percept 1
+problem pr 1
+web stroller 1
+author.html 1
+canad 8
+grecqu anc 1
+cultur nec becom 1
+comfort companion 1
+virtu sharewar libr 1
+opportun of tim 1
+work joint 1
+report another day 1
+imag or di 1
+repaint th background 1
+mail server program 1
+dat suggest 1
+alam nat 1
+interest to cl 1
+aplac 4
+ar inclus 1
+hand in fight 1
+roman discipl 1
+biozentr der 1
+de pr 1
+tech onl 1
+pl not 1
+welcom to nin 1
+med research council 1
+isol 3
+fal teach 1
+import of good 1
+st th imag 1
+pointer 5
+text by gopher 1
+administer organ 1
+west dor 1
+profil ask 1
+unwar 1
+western art 1
+psycholog research group 1
+constitu 1
+lim fr 1
+robot navig 1
+natur hi freedom 1
+bast that stood 1
+vnguentum 1
+search webcutter 1
+sic or seau 1
+rad and tv 1
+onl computer 1
+za arch 1
+aal membership 1
+libr of biolog 1
+bioc.cam.ac.uk 1
+centr show britain 1
+cour on offer 1
+di datab inform 1
+wyl moou 1
+art and technolog 1
+intern snowboard 1
+ls log 1
+acronym key 1
+blow comp 1
+good job 1
+suppl of molecl 1
+list pol 1
+eighteen 1
+hypermail wil look 1
+epidemiolog 1
+straight ftp client 1
+ariadn 1
+egyptolog 1
+aspect 3
+le me hau 1
+rognl 1
+issu 11
+fr liber 1
+altern explan 1
+subiect 1
+show that tak 1
+analyzer calibr method 1
+furthest 1
+program north dakot 1
+confer list 2
+gener purp sem 1
+atl record 1
+new search 1
+kyot encylop 1
+test and an 1
+red latinoamerican 1
+annu childr christm 1
+edit by stev 1
+specif inform 2
+docum ha becom 1
+malt advoc award 1
+resourc inform 1
+sw prot annot 1
+imag of titl 1
+aegean wa diversif 1
+paper in cyclad 1
+hypermail and upd 1
+jewish 1
+cod navig 1
+paper that us 1
+specif th direct 1
+guid internet 2
+lotus developm 1
+fain hau bound 1
+cupid 1
+di recuper archeolog 1
+ant milit popl 1
+disc list 1
+remember bring 1
+httpd 1
+lab member 1
+find th seem 1
+manag mlm 1
+law internet 1
+abstract deadl 1
+direct with major 1
+imag and select 1
+tool and method 1
+saarland internet resourc 1
+emerg of elit 1
+homosexu 1
+taught gentlem 1
+biom imag proc 1
+diver plac 1
+pleasur 1
+1000th 1
+wrot th cod 1
+luxur 1
+batch 1
+peac war 1
+bibliograph biotechnolog law 1
+digit tradit folk 1
+gib us inform 1
+biolog print 1
+ian wright 1
+avail www 1
+effect teach 1
+apol demand 1
+film festiv 1
+def th head 1
+jad start 1
+variabl 3
+intern graph 1
+form of put 1
+internet addr 1
+secon structur 1
+numer 5
+departm of instruc 1
+hist me 1
+prof georg 2
+obit 1
+onl publ ment 1
+up def 1
+cour mor swift 1
+pr badam 1
+excel stuff 1
+mayd then asid 1
+plac of tr 1
+biolog gener search 1
+sport park 1
+calf which giv 1
+great disgrac 1
+archieplec at mcgil 1
+download thing 1
+calf support 1
+ar goal 1
+diagnost 1
+cat var 1
+comp sc 1
+improv middl school 1
+resourc pag univer 1
+dat fssp 1
+aa at universidad 1
+mad grad conjug 1
+softwar using cg 1
+direct of nlp 1
+item ar displ 1
+internet train docum 1
+var clever 1
+veg hooker 1
+day appl 1
+canon 1
+ch ha eloqu 1
+gentleman 1
+snow season reindeer 1
+cupol 1
+partem 1
+put th html 1
+purp no evid 1
+bit of adv 1
+knau 1
+program of work 1
+knav 1
+mic and rat 1
+death or wound 1
+wa univer egypt 1
+driv your out 1
+manuscript project 1
+s.e.brenner 1
+david chen 1
+developm environm 1
+mik timpson 1
+biolog and biotechnolog 1
+seemeth to hau 1
+engl settl 1
+biolog genet softwar 1
+search law 1
+ri to hear 1
+lower leg 1
+direct with inform 1
+wheel swift 1
+muscl 1
+mitchel steen 1
+top ar pr 1
+centr dhistoir de 1
+attachm point 1
+posit 7
+biochemister o u.c 1
+cinvestav 1
+select biomolecl 1
+minnesot o bioc 1
+quicker acc 1
+link to lot 1
+stud and develop 1
+giv excav context 1
+inform from text 1
+system spon 1
+resum receipt listproc 1
+trail tip 1
+trac 3
+trad 3
+cour by jam 1
+pr confront aegean 1
+rigor exam 1
+exc wil pen 1
+cluster an 1
+op c.b 1
+run ver low 1
+quicker 2
+tool recover 1
+poniard with gauntl 1
+tran 5
+lingu latin 1
+activ 1
+select on color 1
+opinion in structur 1
+visit th html 1
+scientif journ 1
+univer of vict 3
+rel of ver 1
+postprint by jam 1
+avail for download 2
+medief and cl 1
+univer med 1
+chair sw 1
+strateg to av 1
+port in byzac 1
+knew 1
+renfrew redistribut model 1
+exper in educ 1
+lif technolog goteburg 1
+wh being brought 1
+faint hart fair 1
+interact inform serv 1
+compound 1
+influenz metabol 1
+uniqu color 1
+disc of train 1
+path optim 1
+olwm window 1
+geisel 1
+typ bind 1
+imag arch 2
+var cel 1
+dat wil appear 1
+newcastl.ac.uk 1
+eckhardt 1
+ital 4
+edinburgh ra 1
+leg twelv degr 1
+serv to demonstr 1
+weapon accord 1
+bibliograph 11
+remain prov 1
+desktop chemister softwar 1
+skil fight 1
+sound hurt 1
+mac user 1
+read to fight 1
+pr wench stand 1
+dialiskar 1
+tren 2
+sharewar imag manipl 1
+www distribut 1
+character of roman 1
+gam equ 1
+biocomput institut bi 1
+sen mail 3
+color transpar 1
+former sov union 1
+control structur 1
+boolean number defin 1
+hour of web 1
+lot of interest 1
+gap gr jaw 1
+schoolmaster 1
+find great 1
+procedur for network 1
+univer molecl 1
+kentuck 1
+personnel 4
+order list 1
+pl paint 1
+loc peopl 1
+count a tal 1
+singl malt scotch 1
+listserv server list 1
+trick and gay 1
+attent on trad 1
+server pharmacokinet 1
+hm configfil filenam 1
+project schol review 1
+geir jen 1
+launch o molecl 1
+week list 1
+biom imag technolog 1
+pc run nt 1
+using a straight 1
+alt research 1
+recombin 2
+item 9
+sc rec ran 1
+plac to def 1
+project pomp 1
+pubbl 1
+want my server 1
+photograph larch olog 1
+loc councillor 1
+cloak fight 1
+gibcobrl lif 1
+snowboard you se 1
+peopl transit 1
+dn and rn 1
+commun program 2
+qu th internet 1
+biolog control panel 1
+map gener 1
+sign our guest 1
+sc molecl 1
+environm var 1
+list law lib 1
+softwar sign 1
+imag ind.html 1
+trim 2
+tip and trick 1
+trin 2
+invinc conclus 1
+triv 2
+as in assemb 1
+pigl.cs.um.edu last upd 1
+deceit 1
+understand of minoan 1
+deceiv 1
+concer in atl 1
+brownjohn ar liv 1
+battl 2
+reserv 11
+model and siml 1
+biochemister 2
+egypt galler 1
+datab o molecl 1
+improv our understand 1
+rear ankl 1
+hau som work 1
+postl 1
+techn detail mac 1
+richard rognl 1
+stand troubl 1
+knol 1
+mjquibu uc.edu uc 1
+uk metar 1
+unst boot bind 1
+anc libr 1
+sund brunch 1
+knot 2
+hm progr 1
+know 26
+proc of urban 1
+columb 2
+prec engineer computer 1
+known old palac 1
+becom scarc 1
+recent me 1
+comp.dsp cur post 1
+ecolog hom pag 1
+dispatch their bus 1
+watch 3
+freedom walk robot 1
+point commun 1
+scal repr 1
+enzym datab biosc 1
+fight th fal 1
+bacillus subtil 1
+snowboard boot 1
+think it good 1
+macintosh dropl 1
+ray and neutron 1
+headach of chang 1
+mon structur 1
+cancer research 1
+clarif th differ 1
+boot not specif 1
+manag bulletin 1
+leftover stratif 1
+great speed 1
+molecl biolog karolinsk 1
+sect electr electron 1
+princip objectiv 1
+queen majest hor 1
+hast lab tom 1
+got complaint 1
+pr of poster 1
+archaeolog theor 1
+engineer micr 1
+trod 1
+bod unapt 1
+ge hi degr 1
+trom 1
+water 1
+ksl.stanford.edu 1
+trop 1
+dinner menus 1
+pot den 1
+2nd world 1
+older 4
+html format command 1
+produc of surplus 1
+brand 2
+strap 1
+why palat 1
+cur www 1
+softwar agent 1
+inst spir 1
+search multipl 1
+bioc biodegrad 1
+an for analog 1
+imperfect schol great 1
+isol resid 1
+cl sic 1
+design by immer 1
+person cost 1
+signif scal posit 1
+seru most earnest 1
+soph mail list 1
+would cry 1
+gzip 2
+b.sc 1
+computer and workst 1
+support html 1
+beginner guid 1
+ag settl 1
+spac bring 1
+lipid and lipoprotein 1
+island 3
+hether 1
+man good 1
+enj my work 1
+window and beep 1
+greenhaus and fr 1
+stranger whatsoever 1
+unit nat intern 1
+upd opt 1
+minoan 1
+lat 2nd 1
+valu to giftran 1
+enabl me210 1
+qu pr 1
+rap do fight 1
+univer o straus 1
+warner 1
+correl between chang 1
+look if an 1
+ge upd 1
+berkel 3
+sequ annot server 1
+stroller find 1
+half a man 1
+kan cit 1
+fight betwixt val 1
+multim inform 1
+portland 1
+stand upon uncertain 1
+brook david 1
+standard and technolog 1
+dead 6
+deaf 1
+daint 1
+inclus tabl 1
+deal 6
+cod is triv 1
+pig rig float 1
+pbm homep 1
+mod load automat 1
+design to rid 1
+michigan 6
+us th hil 1
+wif did ch 1
+reag protein soc 1
+etruscan 1
+act therein 1
+equ excit 1
+ai lab sect 1
+moleculair biolog 1
+rel ag 1
+lying spent 1
+oregon teach 1
+tim learn hydr 1
+nlightn 1
+for and sl 1
+recent usenet new 1
+iest with edg 1
+av inform 1
+origin german text 1
+project around campus 1
+imag an 1
+avail nam mklesson 1
+imag av 1
+wherein is prov 1
+sen law europ 1
+braul 1
+deck 2
+decl 3
+tag wil as 1
+decr 1
+microsoft network 1
+default bind 1
+inesc.pt 1
+digit mach support 1
+strif 2
+person auth 1
+pl th pc 1
+strik 1
+pluridisciplinair de 1
+strip 1
+categor ba bus 1
+onl new 1
+caltech 1
+search return 1
+mail list program 1
+striv 2
+moir r mov 1
+miam 1
+tim appoint 1
+potat 1
+scal th perc 1
+tryp 1
+cur post 1
+mash potat 1
+rothamst 1
+showrepl 1
+guid internet resourc 1
+death of adult 1
+jumbl and unedit 1
+argon 1
+health center 1
+dlst umich.edu 1
+sithd 1
+group commun 1
+valt an object 1
+deep 2
+snowboarder ar obnox 1
+deer 1
+find by good 1
+mayd began 1
+departm gopher se 1
+nalek 1
+match th browser 1
+ericac ind.edu 1
+shorter can mak 1
+select your categor 1
+benefit of snowboard 1
+classif ba 1
+micr 5
+austin bagger sword 1
+schol great 1
+ugarit 1
+sharp th wit 1
+dan statistiqu 1
+launch pad 1
+pronounc sid 1
+journ of anc 1
+haemophilus hidb 1
+grunt and cr 1
+film crit 1
+tim green 1
+quark docum 1
+dim polyacrylam gel 1
+sourc of imag 1
+undiscover 1
+degr 4
+midl 1
+help us understand 1
+exposit 1
+spain za 1
+risk fact 1
+onl phot gal 1
+intellig 5
+mad spec 1
+bother 1
+mailser.htm 1
+trembl 1
+par as html 1
+microchemister facil john 1
+philosoph 1
+proper new balad 1
+child toy wherewith 1
+budapest 2
+weight slight for 1
+ward ther 1
+airspac 1
+jpg addtyp 1
+hug nomencl guidel 1
+tim high 1
+particl excit 1
+organ individu entr 1
+loc new system 1
+model using bound 1
+computer sc dept 1
+bil gat 1
+ca cam center 1
+rec list 1
+bagger sword 1
+def thrust 1
+center for learn 1
+officer 2
+inclus th search 1
+sparcst 3
+fieldwork direct 1
+incr in land 1
+californ o u.c 1
+ter in pozzuol 1
+wright and rob 1
+commerc leg research 1
+great vant 1
+marbl 2
+migr 2
+hist th coff 1
+straggl 1
+lak cit ba 1
+argum 2
+pair of gaiter 1
+sander 1
+spec artisan 1
+departm of electron 1
+publ o principl 1
+da by da 1
+march 7
+want a circuit 1
+mechan div 1
+server popl 1
+speech rel docum 1
+internet anc hist 1
+automat result 1
+ireland 6
+sit alread defin 1
+turn requir 1
+unqualif 1
+migrain 1
+pat rap 1
+bil of challeng 1
+pittsburgh 1
+docum to html 1
+www inform 1
+cesarean sect 1
+us transpar 1
+chemister server bost 1
+cal th world 1
+imag arriv 1
+featur of mycenaean 1
+sev palaeolith figur 1
+self reproduc 1
+pa to describ 1
+cl quarter 1
+start at zer 1
+origin sourc 1
+c.bird umd.ac.uk 1
+chain hydr bon 1
+chandler shop 1
+technolog academ 1
+ak ment 1
+bart group oxford 1
+weapon shal car 1
+ruyn hath brought 1
+mac arch 1
+reput them co 1
+rocc cam 1
+break dist 1
+von guter 1
+tim fight 1
+absent 1
+vicht 1
+se perfect 1
+search th fl 1
+departm argon nat 1
+milk 1
+stat ar equip 1
+window color nam 1
+mail listproc 1
+imag www sit 1
+contribut to foldoc 1
+compl list 1
+vnguentum bak 1
+childr christm parad 1
+vicin 1
+pattern took 1
+color map 2
+histoir de lart 1
+internet domain 1
+examin 6
+appl arc 1
+rock band 1
+bask passyng 1
+annu childr 1
+paleolith art 1
+land to rain 1
+dept 4
+art treasur 1
+far then suger 1
+appl art 1
+soil cover 1
+aal governm inform 1
+katholiek 1
+cedar 1
+minc 1
+mind 6
+franklin search 1
+minh 1
+common lisp ver 1
+modl for molecl 1
+del ri elettronich 1
+bibliograph refer datab 1
+weigh 1
+rel to cl 1
+arm and rap 1
+dartmouth 1
+provoc 1
+by stud 1
+browser determin 1
+bibliograph on molecl 1
+antwerp 1
+design world 1
+junior cl 1
+leg clean cut 1
+quantit method 1
+showheader boolean 1
+un workst 1
+report any error 1
+soph html helper 1
+av or saf 1
+acceler sen 1
+fortun hap 1
+northwest fish 1
+koiv 1
+digest list 1
+field of surfac 1
+desc 1
+brussel 1
+hbplus hydr bon 1
+research effort involut 1
+micromechan 1
+desk 2
+court is rem 1
+faythfl 1
+silicon 6
+journ prent 1
+hist bulletin 1
+serv for publ 1
+good lad 1
+deouwer 1
+var of tool 1
+promin featur 1
+major port 1
+window seam 1
+imag technolog 1
+scotch 1
+krobison 2
+xerox pal 1
+cr mad therewith 1
+antibod resourc pag 1
+centr par 1
+en la 1
+lingu pag ee 1
+bibliograph ein buch 1
+web browser 2
+cr a link 2
+srm.conf 1
+sunnyv origin micr 1
+shak alumin custom 1
+discoueryng 1
+rap dagger 1
+deut 1
+peopl publ 1
+south west 1
+scotch menu 1
+wid web project 1
+imag archiv 1
+bsd rel 1
+artif intellig labor 1
+men of good 1
+fal demonstr 1
+unskil strik 1
+str plan 1
+de cantabr 1
+sk belief 1
+univer o biochemister 1
+film bulletin 1
+by styl 1
+heckler p.o 1
+austr finland uk 1
+misc 3
+dat arch project 1
+thank to arthur 1
+transect between romanou 1
+rel to hc 1
+complain 1
+mot ar deceiv 1
+interact qu proc 1
+biolog dat 1
+cancer research center 1
+exampl 17
+fredriksson 1
+alp sk equipm 1
+computer tool 1
+hearyng 1
+lloyd schoenbach 1
+toy ar fit 1
+exc of think 1
+cl and grip 1
+hard mak 1
+check your contact 1
+text or publ 1
+maron 1
+curv spac design 1
+chr root 1
+se poor fish 1
+compl each se 1
+month bibliograph biotechnolog 1
+simultan search multipl 1
+dealer 1
+mandrit 1
+shadow effect 1
+larger ind 1
+koop 1
+elbow 1
+forg hi fenc 1
+member of prap 1
+circuit an 1
+autom mush 1
+star abroad 1
+human sect 1
+latest html hot 3
+kept on min.cs.adf.oz.au 1
+sum eng 1
+carolyn wiener labor 1
+countrym soever 1
+mesopotam 1
+great good 1
+fo.com archiv 1
+emerg minoan el 1
+prosit dict 1
+marqu 1
+writ som html 1
+libr map collect 1
+cont ind 1
+scan tip 1
+dit delightfl 1
+peopl server 1
+electron xm card 1
+mylon expedit 1
+lik to chang 1
+conver from quark 1
+bsd sourc 1
+ey th mot 1
+rap buckler 1
+remember th distinct 1
+brad attack arch 1
+aid surg 1
+plac emerg 1
+configfil 1
+web server 7
+korn 1
+marsh 2
+backgroundsingl background color 1
+pag is int 1
+manufactur engineer 1
+intern civil 1
+good lik 1
+mon for war 1
+grad optim method 1
+turn your pc 1
+desir to learn 1
+curag 1
+aplac circuit 1
+datab spat 1
+articl subm 1
+per cast ed 1
+rap mak 1
+project team 1
+rap man 1
+find their enem 1
+susp mail tempor 1
+ey by swift 1
+breech 1
+fair tight caus 1
+dat ind 1
+institut of fundam 1
+sit from beach 1
+megab 1
+talk with badam 1
+email destefan wh.com 1
+abandonm 1
+using technolog 1
+explain why 2
+chem engineer 1
+megar 1
+journ devot 1
+ersk childer 1
+ment map 1
+trin colleg 2
+dissembl 1
+ext to peopl 1
+faq archiv 1
+linkmonster 1
+marathopol 1
+anc manuscript 1
+greek iconograph 1
+captur thewith snapshot 1
+clever horizont 1
+man trust 1
+labor o center 1
+neurobiolog lo 1
+problem indep 1
+examin by magnetometer 1
+archieplexform at aveir 1
+marwp 1
+strateg for int 1
+imperfect ward 1
+turin hom pag 1
+philolog assoc 1
+polit administer 1
+experim and comput 1
+biochemister and cel 1
+modern scholarship 1
+cour not 1
+geomorpholog suit 1
+david tyf 1
+sty fil 1
+chuck.musc har.com 2
+edit window 1
+rap men 1
+gendzwil 1
+mi web server 1
+se a secon 1
+collect link 1
+cdr hilit affil 1
+execut board 1
+wabash 1
+determin 6
+tru signif surplus 1
+tak th articl 1
+nichol 2
+com or articl 1
+uncover 1
+part of tun 1
+stud infoserver 1
+lyk a top 1
+iust 1
+warn by me 1
+miscellan o jacob 1
+fe ar greater 1
+pharmacokinet resourc 1
+server at imper 1
+apportionm 1
+and curt air 1
+mobil platform navig 1
+univer of michigan 4
+direct usenet 1
+sk percept 1
+organ particip 1
+respect of tim 1
+formd 1
+biolog workbench 1
+forml 3
+longer of shorter 1
+larger number 1
+whit rain 1
+subsurfac cultur 1
+cl or mediterranean 1
+abl to sk 1
+inclus str plan 1
+god on fil 1
+new group poster 1
+biocomput institut 1
+mous genom 1
+categor th entr 1
+european biochem soc 1
+woud deck vs 1
+pr show 1
+group archiv ind 1
+prov motiv learn 1
+guid to grant 1
+elizabeth eyr 1
+perform inclus 1
+tim control 1
+alam nat labor 1
+capit 2
+indirect 2
+expect to investig 1
+chang th gr 1
+giv th li 1
+hm rever boolean 1
+key ar 1
+berlin 1
+filetyp 1
+giftran conver gif87a 1
+hincyc 1
+html conver 1
+keep a man 1
+thought 6
+an of protein 1
+relev link pl 1
+datab inform theor 1
+tarantin film 1
+shar memor 1
+sw quiz molecl 1
+li nowh 1
+imag of protein 1
+keep their bod 1
+abl to us 1
+hau caught 1
+fibergl 1
+suffer th dist 1
+dissemin 1
+vl electron 1
+3rd round draw 1
+learn through collabor 1
+fundam algorithm 1
+manipl control 1
+smith 4
+univer hypertext 1
+reach th point 1
+rid fak 1
+scientif and techn 1
+nanotechnolog hubbl 1
+inclus vxwork 1
+light on bronz 1
+good schol 1
+influ from techn 1
+word help 1
+nearb 1
+foc attent 1
+stud at loughborough 1
+anc and medief 1
+ge start search 1
+blad 1
+ric univer 1
+ioy and car 1
+blam 2
+nec becom 1
+subtil nrsub 1
+le centr pier 1
+old tim 1
+board for report 1
+joel baxter 1
+eight hundr 1
+stud in honour 1
+apol demand result 1
+key el 1
+lack pointer 1
+olymp winter gam 1
+cr and uncr 1
+min archiv 1
+pitsc technolog 1
+biolog amersham 1
+using world 1
+univer o stanislaus 1
+la red latinoamerican 1
+thinner soil 1
+writ their letter 1
+lay hi hand 1
+gaffn of birmingham 1
+assoc partner 1
+gustav 2
+inform nat cancer 1
+wherein he show 1
+forth 4
+span fight 1
+co publ 1
+continu rapid growth 1
+gener inform cs 1
+kpt displac.star 1
+us conver guid 1
+brand and tooz 1
+conver quarkxpr 1
+fight stand 1
+se he modest 1
+baight you lay 1
+antig 1
+bandwidth 3
+titl pag 1
+bleg 1
+blen 1
+dim polyacrylam 1
+un system 3
+lev libr 1
+duncan jam 1
+horseback 1
+stream mpg addtyp 1
+key id 1
+ne pen 1
+web sit quot 1
+contribut should inclus 1
+pattern took plac 1
+pattern of settl 2
+par html shtml 1
+rel and mark 1
+letter of support 1
+peopl peopl.html 1
+r.skiing 1
+loc in kirkland 1
+curricl demand creat 1
+poor known old 1
+ii at medinet 1
+ftp server exp 1
+osl kjetil 1
+partem de 1
+archaeolog suppl ser 1
+inform on hypertext 1
+aplac tran 1
+baron baker 1
+south carolin fin 1
+day we imag 1
+numer radiolog 1
+dlopez wh.com 1
+poniard fight 1
+net ind 1
+me organ 1
+littman pat ma 1
+po nonlin 1
+straight hold forth 1
+sort of html 1
+vien in austr 1
+guy afraid 1
+continu developm 1
+mediterranean basin datab 1
+weapon imperfect 1
+loughborough leicestershir 1
+teletext 1
+curst 1
+15mar93 1
+alber ludwig 1
+molecl ecolog 1
+univer of ten 1
+marburg.de mzr kongr.htm 1
+an o swissprot 1
+mod allow 1
+w3 search 3
+nord jumper 1
+maintain by hen 1
+lunch and dinner 1
+newsletter 3
+standard 11
+cytogenet 1
+mycdb o mycoplasm 1
+fun stuff.html 1
+color nam 1
+planet it 1
+pag link 1
+s.tarkom 1
+longer avail 1
+valu in fly 1
+register a pag 1
+nec to hold 1
+sk and espec 1
+hierarch ind 1
+sp chick 1
+pound 2
+colwel 1
+form follow 1
+louain 1
+learn in high 1
+virtu you prof 1
+incompl 1
+epidemiolog institut 1
+an of hag 1
+confirm th anom 1
+system datab spat 1
+map pl 1
+hinder 1
+mail list manager 1
+inferior 1
+virtu re markup 1
+integr th biolog 1
+develop th pag 1
+pictur ar copyright 1
+resourc alt 1
+client softwar 1
+houswif 1
+cook larg amount 1
+green design 1
+veron search gopherspac 1
+univer of tic 4
+peacock pl 1
+html th text 1
+sc stanford 1
+specif fact 1
+cour mater ea 1
+regard group act 1
+paul bristow 1
+strasbourg univer 1
+salisbur 1
+bin taught 1
+review of plant 1
+old tub 1
+soonest 1
+kilometer 2
+other say 1
+csourc 1
+research work 1
+lordship wil vouchsaf 1
+advertiser wh want 1
+anc stud 1
+thirt year 1
+val men think 1
+sit prov inform 1
+se to acc 1
+construc wa immin 1
+boyl.txt 1
+bus direct 1
+good man 2
+learn adm control 1
+analyzer and wafer 1
+posit aspect 1
+joyc plester 1
+year law stud 1
+paragraph 2
+quick simpl search 1
+nonuniform sampl sign 1
+email at lindahl 1
+unit nat 1
+educ softwar 1
+nam mklesson 1
+archieplexform at imper 1
+show of truth 1
+desper shal pr 1
+pioneer molecl 1
+blot 1
+enjoym 1
+articl on rec.skiing.alp 1
+blow 1
+pag list 1
+domin architectur 1
+sander group predictprotein 1
+perfect thereof 1
+hit th reload 1
+supporter www 1
+credit wh 1
+layer 1
+gregor of ny 1
+field dat collect 1
+pc do 1
+wafer prob 1
+win or gain 1
+tak al manner 1
+svcigar aol.com 1
+inform on sign 1
+densest surfac 1
+sk patrol magaz 1
+academ in rom 1
+uncover liter 1
+inform program 1
+netherland institut 1
+enharmonik 1
+refer mail 1
+annot bibliograph 1
+quest 2d protein 1
+good men 1
+inevit 1
+electr engineer yal 1
+input qu 1
+effort by excav 1
+sk boot prov 1
+perfect to strik 1
+se as environm 1
+ba cover acronym 1
+investig ar 1
+univer of tok 1
+us requir 1
+mi ai 2
+technolog educ web 1
+ac sequ 1
+subtract resourc pag 1
+dat inform 2
+held in sant 1
+turn up no 1
+maricop center 1
+strong and quick 1
+format and repaint 1
+m.pe 1
+find wer examin 1
+coff mofil.fi 1
+electrost 1
+thereb a further 1
+equip stud shop 1
+eastern edg 1
+talk th maid 1
+fil ar organ 1
+del rey 1
+lif can contribut 1
+cloak 2
+chowder 1
+barbecu comb pl 1
+recept o nat 1
+particl us 1
+siml technolog 1
+phot inf.html 1
+sw libr archiplec 1
+digit commun 1
+forefather virtu 1
+targ rflp 1
+img src 1
+calendar misc tabl 1
+nelder mead 2
+loc newspaper 1
+nc httpd 1
+bug warn 1
+hard uncr 1
+biocenter 1
+therein contain 1
+univer of south 3
+silver hi milit 1
+blvd 1
+clock 1
+peter to pay 1
+hidb o mycobacter 1
+centr for research 1
+moder width stanc 1
+e.col 1
+m.sc 1
+imag int xv 1
+pr sport 1
+perc of ol 1
+lawr berkel labor 1
+list admin fo.bar 1
+docum your docum 1
+fletstr 1
+mastr 1
+quoth th bruer 1
+caer gal 1
+dagger ar doubl 1
+vs talk 1
+fabl 2
+lec par 1
+cs tr ind 1
+gor detail 1
+reduc th wear 1
+caus in old 1
+mail disc list 1
+mak a cooper 1
+subm dn 1
+import inclus 1
+song server 1
+prov us 1
+xwav sign 1
+world at ftp.luth.se 1
+produc spec 1
+bak did mak 1
+dir direct 1
+emphasiz design 1
+fact 11
+upd august 1
+suzan georg 1
+uthsc 1
+stratif marl 1
+reform 1
+informatiqu et recherch 1
+stream 2
+liber 2
+correct support 1
+quarter cl 1
+fr rid 1
+sen a letter 2
+eventu 3
+discour 2
+model organ genet 1
+serv as us 1
+prev estim 1
+at most dilig 1
+old chairman 1
+fl th archaeolog 1
+stud dellantichit cl 1
+profil univer 1
+world on telev 1
+morsemcfad hol mat 1
+fly fish equipm 1
+sit specif report 1
+collect of research 1
+adr and telephon 1
+campus phon book 1
+clin tr 1
+conver email addr 1
+adv med 1
+becom rather obv 1
+got non 1
+multidim sign 1
+vict in war 1
+project th discipl 1
+duk univer 2
+jan baxter 1
+pint oth night 1
+redund 1
+marathopol therefor produc 1
+molecl departm 1
+sit typ 1
+liber men 1
+manufactur 4
+raymon 1
+demand creat 1
+robison 2
+virgin commonwealth 1
+sword fight 1
+lo angel 3
+agent by narrow 1
+tel el amarn 1
+surv approxim sixt 1
+inform system 4
+scal repr depth 1
+displ any item 1
+med radiograph 1
+biolog fmc bioproduc 1
+lat put 1
+rur spac util 1
+hm thrdlevel 1
+tim among val 1
+zealand norw 1
+count actu look 1
+fold buckler 1
+scourg 1
+dakot 1
+biomednet 1
+warwick 2
+foul wer formd 1
+ward to ward 1
+wh near half 1
+such guil 1
+pilot european 1
+addict 1
+guter sp 1
+report and stat 1
+report and com 1
+cor war 1
+electrophor la red 1
+interact atl univer 1
+ribosom datab 1
+sw standard 1
+fail 3
+egyptolog fieldwork direct 1
+palat civil ar 1
+support stud 1
+rom inform system 1
+mount ath greek 1
+fain 1
+search at sant 1
+sword blad 1
+fair 7
+andr origin html 1
+nc cancernet 1
+wealth 3
+protein coupl recept 1
+microsoft 3
+specif report 1
+world archaeolog congr 1
+ahm bahauddin 1
+pr jest 1
+tech run 1
+color edit window 1
+find relev 1
+pig rig 1
+du tim 1
+fr rom 1
+congr exhibit 1
+chandler wif 1
+medief 3
+mesar plain 1
+biolog suppl 1
+school and countr 1
+arm officer 1
+pr strong 1
+grad conjug 1
+kolon on aegin 1
+oper intern 1
+libr is becom 1
+spat and funct 1
+heinlein 1
+giftran sourc cod 1
+plac item 1
+tut in biochemister 1
+browser lot 1
+fl qualif 1
+guidel report 1
+la veg hooker 1
+institut gaspard mong 1
+compl head match 1
+lorimer 1
+fac recognit 1
+plowm hav might 1
+pl atleast 1
+draft ind 1
+subscrib int law 1
+apt to keep 1
+graz land 1
+term and format 1
+fl cur squ 1
+espec st 1
+nam listserv 1
+jl onion 1
+st form 2
+blugr 1
+server french genom 1
+particl server 1
+fleetlan 1
+differ 12
+showhtml boolean 1
+imp in du 1
+fanc 3
+conquer 1
+unview 1
+fram a frounyng 1
+cariadoc elizabeth recip 1
+buyer 1
+resolut dat 1
+libr map 1
+fant 1
+san dieg aerospac 1
+parallel 1
+item exchang 1
+www flash.stanford.edu 1
+ra shamr 1
+fanz 2
+follow by other 1
+fic width 1
+why apol creat 1
+hard and val 1
+bast he bon 1
+giftran conver 1
+edinburgh 2
+bewar of fal 1
+sword dagger 1
+ser creat 1
+imag confer 1
+alabam 1
+snowboard patrol 1
+prepar a se 1
+fair regl interv 1
+hc academ 1
+examin th sourc 1
+cal th arch 1
+mail postpon tempor 1
+structur structur alignm 1
+flat tail 1
+da or week 1
+sh hath ben 1
+img tag 1
+auth of person 1
+giftran.ec 1
+softwar catalog 1
+larger context 1
+hous somwhat 1
+polit developm 1
+imp in ga 1
+compan secr 1
+me210 team 1
+pag in sequ 1
+magelan nic 1
+espec wh 1
+www.wjrh.ec.uv.ca 1
+contempor design 1
+synth catalog 1
+riv concern 1
+trail foot for 1
+molekl biolog sanger 1
+aegean first civil 1
+chr benson op 1
+biolog macromolecl cd40lb 1
+research inc 1
+establ aal 1
+light nord 1
+shar with other 1
+match 6
+typ of trick 1
+skil or chanc 1
+keep your arm 1
+joigner wif 1
+stud resourc gradu 1
+cloth 5
+biopharmaceut sc 1
+writer resourc 1
+farm 1
+openwindow server using 1
+program that tak 1
+thus forc 1
+univer of mississip 1
+cloud 2
+superp 1
+fash 4
+alphab ind 1
+superv 1
+champagn at midnight 1
+fast 5
+electron and electr 1
+center for autom 1
+aplac sever optim 1
+hypermail to explicit 1
+pa of tim 1
+lean back 1
+gener www ind 1
+gradu com 1
+gener www inf 1
+wagstaff 1
+frequ ask ar 1
+assyr text 1
+shop th entir 1
+nic imag 2
+mater 13
+individu articl 1
+ge snowboard 1
+leed univ 1
+mak al valu 1
+biometer person auth 1
+3.3a sourc 1
+label other mail 1
+word and se 1
+elder 1
+le centr 1
+design for snowboard 1
+3d self grav 1
+lin and lin 1
+server.html 1
+ii and mm 1
+int law log9406 1
+quiz molecl 1
+aqu tus felicitac 1
+datab of biomolecl 1
+internet train 1
+part of whit 1
+consort 2
+chr rossner 1
+select box 1
+hadrumentum 1
+mainland clear show 1
+ran an interview 1
+german ms160 arch 1
+staff man 1
+point within dist 1
+result in wast 1
+preview human molecl 1
+creat by vinc 1
+head from blow 1
+web surf 1
+vieir 1
+terminolog rel 1
+ward to learn 1
+gener purp nonlin 1
+snowboarder ar start 1
+contact assemb 1
+ftp archiv find 1
+confer in genev 1
+tak effect 1
+intern workshop 2
+execut 8
+fil using lpr 1
+typ genet 1
+interest stuff 1
+exchang and soc 1
+western edg 1
+int for beginner 1
+www.un marburg.de 1
+program in cl 1
+zebraf book 1
+sound paid 1
+step in oper 1
+plac for cop 1
+actu articl 1
+react pek 1
+carl an 1
+main compon 1
+hal wh 1
+thread 2
+protein 3d 1
+sw flash 1
+lazar 1
+informat 2
+longer tag 1
+threat 3
+semester 1
+ital fencer say 1
+rec th se 1
+rap or poniard 1
+biolog train program 1
+sent distribut pattern 1
+einer mutter 1
+loc http bin 1
+contempor archaeolog parl 1
+stud shop enabl 1
+blush 1
+mail digest list 1
+volt 1
+whatsoever appertain 1
+univer of amsterdam 1
+fayr 1
+du lazar 1
+wid in du 1
+pain for walk 1
+produc that prov 1
+walk down 1
+mobil phon 1
+journ on biotechnolog 1
+becom frequ 1
+oper with va 1
+alif iv mi 1
+speech tagger 1
+ind project 1
+intitl 1
+apol apol 1
+thus it stand 1
+door of paul 1
+graph lab academ 1
+mischef 1
+roman period 2
+tim to speak 1
+control robot 1
+quest other html 4
+center gopher campus 1
+find therein 1
+st cur 1
+knowledg ba protein 1
+particip o conclus 1
+tuit 1
+voor 2
+color gif89a 1
+westpoint 1
+men as england 1
+ologisch fund aus 1
+icip97 1
+expr ar writ 1
+telev ser creat 1
+swift thereof 1
+simil other countr 1
+great strength agil 1
+richard belew rodn 1
+singl or accompan 1
+suff def 1
+utah mi hand 1
+third strap 1
+spac for read 1
+network o hung 1
+techn univer 1
+addr to m.pe 1
+brew to slivowitz 1
+sw prot 1
+hypermail up 1
+cont list 1
+aeroplan 1
+prisoner 1
+isol th 1
+com to fight 1
+derhammer 1
+brook alif 1
+backgroundsingl background 1
+shorter cour 1
+barbecu pork loin 1
+snowboard for sev 1
+help fil 1
+ward or cr 1
+fr avail 2
+teach compar 1
+spher and cylindr 1
+helpcenter 1
+destefan 1
+food bibliograph 1
+brommel 1
+art and archaeolog 1
+bioph and structur 1
+good new 1
+plain 9
+warm bright 1
+sgriffith ie.org.uk 1
+mod ar dc 1
+centr reg 1
+natur fight 1
+bus rel quest 1
+counter 1
+fenc school 1
+med through fast 1
+inclus design 1
+stud inform 1
+snowboard hav continu 1
+apish toy 1
+biolog serv ind 1
+acc retrief 1
+cr an html 1
+label label nam 1
+drecker 1
+impl electrotherm 1
+tuml 1
+sit url 1
+fast solut 1
+multifac problem 1
+departm descript museum 1
+suggest that zon 1
+therfor lyk 1
+snowboard would ra 1
+multipl robot 1
+unstructur 1
+genom o tb 1
+technolog off 1
+biotechnolog center 1
+tung 1
+institut for med 1
+gather mor spat 1
+day frequ 1
+pacif 1
+thruster warder 1
+feast to part 1
+lab don straus 1
+ma spectr abstract 1
+cur post frequ 1
+red slip 1
+leg clean 1
+project archaeolog surv 1
+me together corner 1
+issu of player 1
+teach us off 1
+speed attain 1
+non transpar 1
+celebr gooner 1
+proud boaster 1
+direct enabl 1
+group european bioph 1
+matth 1
+philolog soc 1
+hbplus hydr 1
+drew hi rap 1
+governm and leg 1
+lyf to tak 1
+belew 1
+opt o input 1
+amherst 1
+origin html mod 1
+plant 4
+dun deposit 1
+lo of blood 1
+chandler 1
+specializ in innov 1
+matur 1
+break hi dist 1
+360s and 720s 1
+andel and runnel 1
+gnomon 1
+appar 4
+kan o departm 1
+bod or neck 1
+tak part 1
+suff to work 1
+respon with instruc 1
+datab of recombin 1
+biolog chemister 1
+tuscan archaeolog serv 1
+suffolk count 1
+turk 4
+keep th st 1
+turn 9
+inclus ol oil 1
+unif cs tr 1
+watkin 1
+dec in ban 1
+daughter 3
+fish inform 1
+ar mail 1
+snowboarder and resort 1
+southern aegean wh 1
+univer o emor 1
+veg coast 1
+var robot lab 1
+remain unc 1
+why equ 1
+island pol 1
+alumn lab 1
+center o molecl 1
+book and publ 1
+metalwork took plac 1
+mik pe 1
+network electrotherm parameter 1
+format html 1
+gmt organ 1
+ward to def 1
+de langu 1
+munich 1
+cr th init 1
+tear off siding 1
+prov th technolog 1
+an geograph inform 1
+tabl of cont 6
+began hi tal 1
+tool to tackl 1
+commonwealth univ 1
+thereupon th stand 1
+request be plac 1
+barbecu comb 1
+bur which norm 1
+mi med lab 1
+lot mor inform 1
+repl to me 1
+stuff 13
+ma maruyam 1
+anticip work 1
+comput molecl biolog 1
+biolog fmc 1
+cambridg univer pr 1
+biolog unabom pag 1
+biochem 4
+apper 1
+hm dirmod oct 1
+biolog web serv 1
+devil to snowboarder 1
+print for ed 1
+devot to fr 1
+bedstaff 1
+plast 1
+season of fieldwork 1
+wid web browser 1
+landscap 2
+addr of biolog 2
+work on lec 1
+envirolaw john do 1
+accord to eberhardt 1
+teach their nat 1
+map collect 1
+climat le risk 1
+rec an autom 1
+train guid internet 1
+minoan ancestr 1
+pyl reg 2
+pol diagram 1
+museum of alexandr 1
+snowboard invent 1
+grown er 1
+marl bedrock 1
+thing snowboard 1
+nok corpor research 1
+tim teach 1
+inform about ge 1
+louer extol 1
+causeth poor fish 1
+recr snowboarder us 1
+getstat 1
+reject 3
+european 6
+describ th purp 1
+pixel border 1
+snowboard badam 1
+last not 1
+chang should ind 1
+result confirm 1
+aveir univer 1
+categor and addr 1
+comput educ 1
+project goal 1
+biochim 1
+x.500 1
+cultiv and great 1
+campus phon 1
+nomencl guidel report 1
+av.com 1
+consol window 1
+tupac shakur 1
+lym di bacter 1
+frenchman 1
+guid brit academ 1
+proport 1
+me and fight 1
+belov 1
+initialyour screen 1
+biolog sanger 1
+universidad do minh 1
+mail ctil lbor.ac.uk 1
+inclus a computer 1
+head match 1
+malt whisk styl 1
+court a dearer 1
+mcdonald 1
+mark down 1
+heckler baccigalup 1
+copyright nexor ltd 2
+lou therfor 1
+dunst 1
+commonwealth 6
+christm valu 1
+deceiv with ital 1
+playb 1
+playd 1
+perfect and imperfect 1
+old vic 1
+lyc popl 1
+playn 1
+avail to microsoft 1
+archaeolog and architectur 1
+system by david 1
+med imag proc 2
+spher tip 7d 1
+vermont 3
+inform theor 1
+companion to greec 1
+biotech patent law 1
+hardwar softwar 1
+melan mitchel steen 1
+congratl to arthur 1
+deadl dat 1
+niner pl 1
+occup 2
+occur 4
+lab schedl 1
+def pr cam 1
+adv in digit 1
+sen a maxim 1
+powel 1
+extract of distribut 1
+anachron 1
+power 10
+patrim 1
+taught 2
+serv using world 1
+ecacc 1
+portfol onl 1
+fight th find 1
+internet for educ 1
+jonathan 1
+langu list 1
+lou forc 1
+multim resourc 1
+gr jaw 1
+tim soever 1
+email soccer 1
+ge paid 1
+gopher de 1
+internet commun 1
+com nearer 1
+ingram 1
+sw 2dserv 1
+medicin chemister portland 1
+cur develop explan 1
+control and path 1
+glassmaker o picn 1
+refer agent 1
+rout between sit 1
+stranger 1
+genbank search 1
+ath and mr 1
+escom publ b.v 1
+florid o interdisciplin 1
+human hist 1
+nic support 1
+inform about nc 1
+nearest within dist 1
+list typ 1
+anvil 1
+origin mus 1
+sanger 1
+key growth 1
+upd th mail 1
+longer for adv 1
+select inform 1
+bulfinch 1
+school district 1
+univer loughborough 1
+wh rainf 1
+avail mor conv 1
+find wel known 1
+deadl 2
+var gam 1
+trust 6
+w3 catalog 1
+giv th robot 1
+norm be writ 1
+roswel park 1
+direct of roy 1
+innov method 1
+rossner 1
+biotechnolog univer 1
+truth 3
+knight yueh 1
+sturt 1
+stanc on snowboard 1
+goldstein 1
+aerob 1
+welch 1
+stat wil rev 1
+mec cit 1
+cour drummer 1
+lou brown 1
+univer of innsbruck 1
+describ th progr 1
+great labor 1
+genet softwar pedr 1
+intlpop 1
+baxter 2
+polit funct 1
+bioph o bart 1
+macromolecl imag 1
+tic health sc 1
+eng refer 1
+pag contain inform 1
+patrol 1
+manner of pl 1
+carth 1
+england clam 1
+nntp server 1
+giv th valu 1
+vouchsaf to rec 1
+bask pinnyng 1
+imag avbp 1
+agent to mak 1
+freestyl 1
+ident 2
+bel cant 1
+hyperm issu 1
+carricad 1
+approach to structur 1
+label label 1
+break 5
+color sav whit 1
+sl your trail 1
+colorad featur 1
+seat is lim 1
+cour wherein 1
+archaeolog and art 1
+me think 1
+httpd execut 1
+began to scold 1
+configur fil 1
+ind wh 1
+construc bus 1
+food homep 1
+effect for learn 1
+sc at oak 1
+ba in bondvil 1
+monast project 1
+gener flight test 1
+men to dispatch 1
+init th teach 1
+styl guid 1
+sum stanford 1
+quick strong 1
+rel mater 1
+spent refer 1
+apol look 1
+timesav compar guid 1
+harvard microchemister facil 1
+com and refer 1
+rec th listproc 1
+ind of med 1
+error or om 1
+pl shar 1
+richard belew 1
+susp mail 1
+produc and item 1
+project is support 1
+wyl vs behold 1
+unauthor commerc distribut 1
+us in rf 1
+berg in norw 1
+north en 1
+addr book fil 1
+ontolog 1
+inform about vh 1
+danger us thereof 1
+chang of fight 1
+deriv from 386bsd 1
+approach to combin 1
+dist th hand 1
+tech prov 1
+fact sh suppl 1
+pilot av weather 1
+moreover 3
+imag proc arch 1
+letter ballad 1
+explain 2
+shroud 2
+closest fr 1
+dur than other 1
+web refer kit 1
+autonom de mec 1
+breed 2
+pl sen 6
+den how 1
+run th risk 1
+man may thrust 1
+invit keynot speaker 1
+continu their fal 1
+tim spent 1
+sooner 2
+mak him bold 1
+centr san 1
+bind attachm 1
+frequ us term 1
+ba protein 1
+larger prap datab 1
+vpper 1
+consol 1
+bourbon tast 1
+ind entr 1
+campus inform 1
+ctil workshop ctil 1
+world art treasur 1
+cut and past 1
+technolog pag 1
+larch olog 1
+excav cemeter 1
+man with pik 1
+suppl internet 1
+construc shap 1
+exampl 3.gif 1
+articl from mailbox 1
+def my self 1
+publ inclus 1
+ital fencer tel 1
+tim a docum 1
+rol of educ 1
+vpon 1
+western 5
+argon nat labor 1
+master 4
+conjug grad optim 1
+norweg 2
+assignm 2
+system for onl 1
+docum in texinf 1
+entr ad 1
+instruc to author 1
+depart 3
+consort for lec 1
+abl view 1
+articl wa sent 1
+computer aid biomolecl 1
+yah robban 1
+fr tak 1
+bioph group imper 1
+genet fish 1
+using bound 1
+ut.fi 1
+developm cycl 1
+univer of akron 1
+research in instruc 1
+arkan 1
+skal computer sc 1
+dist to off 1
+archiv ind 2
+krol 1
+valt implem 1
+gopher se 1
+produc gener 1
+algorithm textu 1
+sect from aplac 2
+cemeter of leptiminus 1
+strik nor thrust 1
+lynx user 1
+titl rol 1
+squeez ga film 1
+sh be dead 1
+chaf and ch 1
+en arch 1
+find th truth 1
+colormap repr 1
+major commerc leg 1
+show th articl 1
+roman port cit 1
+appl metamorph tip 1
+pipel.com 1
+jack szostak 1
+prodom datab 1
+departm 19
+biochemister labor 1
+plac of uncertaint 1
+known sendmail bug 1
+cal aqueduc 1
+natur lov 1
+tag computer manu 1
+network analyzer calibr 1
+fenc chang 1
+perfect length fight 1
+pr histoir du 1
+glob ind 1
+nat agricultur 1
+sorow opprest 1
+francisc st univer 1
+command structur 1
+gopher us 1
+player biog 1
+init sl 1
+pl se result 1
+consum 2
+inform sourc 1
+brother tob 1
+verif 2
+particip 5
+finland uk 1
+stock and st 1
+protein medl 2
+datab spat an 1
+death 4
+guid sc millipor 1
+say jar 1
+verit 1
+spectroscop wak forest 1
+go danc 1
+indogermanisch text 1
+us soft boot 1
+ded to inform 1
+yong iph 1
+prem sourc 1
+loughborough univer loughborough 1
+count fil 1
+bound dut 1
+montaineer boot 1
+kevin ge 1
+answer th challeng 1
+cirqu romain darl 1
+webcrawler robot 1
+nac autonom 1
+presid lectur 1
+molecl biolog roger 1
+dat we sen 1
+brent 2
+prof from silicon 1
+brav engl master 1
+review journ cover 1
+nov link 1
+effort 4
+format command 1
+revu intern et 1
+snowboarder us 1
+sid of thing 1
+3dpag 1
+strong by put 1
+zebr 1
+medicin fr hutchinson 1
+inexor 1
+datab roswel 1
+origin of lif 1
+tak th benefit 1
+cu w3 catalog 1
+server is ded 1
+vp th old 1
+thesaurus lingu 1
+archiv email 1
+direct john 1
+progr wev mad 1
+protein an 2
+developm biolog comput 1
+pitifl speaker 1
+marrow trust 2
+john ch 1
+melan ii tut 1
+proc group imag 1
+introduc to cariadoc 1
+protocol in biochemister 1
+dat lou 1
+custom mr mobil 1
+sid inclus 1
+overwrit any ec 1
+plac for folk 1
+men int weak 1
+shockwav sit 1
+geoffr 1
+john do 1
+judg is lost 1
+integr method 1
+noteworth 1
+inform cs inform 1
+marinat 1
+blunder 1
+oxford centr 1
+tim lain 1
+caser 1
+sham then refrayn 1
+nelson of trafalgar 1
+wellst 1
+fest inclus 1
+ext sit 1
+bask passyng fin 1
+equip 2
+montclair st univer 1
+olymp winter 1
+equiv 4
+veron 2
+init codon context 1
+act and degr 1
+protein di 1
+diab 1
+ask quest 3
+screen using snapshot 1
+comput lingu 1
+art review 1
+argon nat 1
+dial 1
+dian 1
+www virtu 3
+brest 1
+ceausescu 1
+amin ac univer 1
+eh ii period 1
+know th ital 1
+bow shot 1
+biolog 2nd world 1
+rober thau 1
+arlingt magnet 1
+damon 1
+thing didnt work 1
+implem lagrang remap 1
+recuper 1
+ver good 1
+author system 1
+fund sourc 1
+roman mo 1
+depth period tabl 1
+hemispher 1
+marker resourc 1
+envirolaw john 1
+network resourc 2
+pyrgak 1
+color agent 1
+develop a method 1
+rec et 1
+consol window captur 1
+equ tim 1
+imper cancer research 1
+direct list 2
+structur biolog biosc 1
+dick 1
+found 21
+catalog florid st 1
+obv middlem 1
+dict 8
+comp.dsp 1
+ca workst support 1
+colleg of technolog 1
+kpt welcom 1
+rel act 1
+peopl wh thought 1
+ge thing 1
+gibbon decl 1
+breakdown from fastest 1
+rel stuff 1
+mmap 1
+electron antiqu 1
+gap gr 1
+contain th research 1
+warder can com 1
+brewh 1
+beach front developm 1
+dieg 2
+wreck 1
+roman pr 1
+technolog educ 1
+wh th ital 1
+support transpar imag 1
+visit prof 1
+sgriffith 1
+model postl ba 1
+av weather 1
+en my riddl 1
+soc polit chang 1
+museum of denmark 1
+vertu 1
+sit featur 1
+network electrotherm 1
+reconstruc of colon 1
+dem rel heav 1
+email molecl 1
+codon usag tabl 1
+requir incr agricultur 1
+microbrew beer 1
+po box 2
+stud progr 1
+weight and conv 1
+stud lith find 1
+robust lec 1
+digb 1
+recip as item 1
+ee dept 1
+vant of weapon 1
+op fil 1
+roman rl 1
+archiv magn 1
+embrac snowboard seen 1
+studentship posit vac 1
+checkm th chim 1
+rap hilt li 1
+inclus prelimin report 1
+harold c fox 1
+southwestern me 1
+output arch 1
+prev me 1
+preserv in sedim 1
+fil nam 3
+direct euler 1
+support project manag 1
+result interdep 1
+virgin.edu 1
+6x86 1
+petroleum 1
+refer guid 1
+bobm 1
+consider help 1
+geolog cor 1
+univer of cincinnat 2
+equ complec 1
+antiqu intern council 1
+ga film 1
+invent 2
+loc av 1
+ba refer 1
+ai program langu 1
+number smaller mean 1
+tru signif 1
+bock 1
+inc universit berlin 1
+archiv mail 1
+hannegan 1
+singl spac 1
+proc task 1
+european ftp 1
+peer review journ 1
+protein ma 1
+straight doeth go 1
+sen your com 1
+us th form 1
+prompt th user 1
+upd direct entr 1
+ar o us 1
+unexcav ar 1
+understand object 1
+univer of wal 2
+addtyp appl 1
+fr tut 1
+search at nexor 1
+resourc guid sc 1
+aid biomolecl 1
+diagram illustr 1
+speed bandwidth 1
+enterpr integr 1
+turn th contr 1
+wesleyand 1
+electrotherm parameter 1
+cupid hau caught 1
+gybson 1
+morsepr.com 1
+larger mak 1
+sister of ten 1
+internet classroom 1
+bernd girod 1
+protect 3
+liv and di 1
+nlp system 1
+mylon 1
+a.d 1
+austin 4
+postl ba 1
+effort inclus techniqu 1
+a.j 1
+proc for peopl 1
+impossibil 1
+a.m 2
+program a disc 1
+fireh tavern arch 1
+developm of redistribut 1
+continu of fight 1
+compon wil an 1
+reason for robust 1
+nationw weather 1
+tun direct 1
+triest 1
+bacter spec 1
+train deaf childr 1
+borrel 1
+yeast 1
+reposit 2
+ver scal repr 1
+colleg psycholog 1
+dint 1
+bur in cl 1
+compound datab standard 1
+com guard 1
+showhr when defin 1
+dr richard sutcliff 1
+usenet new search 1
+hm label 1
+tiryn 1
+castl 1
+lack of tim 1
+bring new peopl 1
+sit in cr 1
+castr 1
+produc a divid 1
+diod 1
+cr wer loc 1
+introduc of anim 1
+chuck musc 6
+grow pain 1
+oklahom 1
+tear and gnaw 1
+biolog philosoph 1
+orthodox read 1
+protein sc 1
+parc map server 2
+fal in lov 1
+uk high 1
+zeus 1
+map descib 1
+said th master 1
+council of mon 1
+biolog gener 1
+ribosom datab project 1
+biolog genet 1
+soft mar soil 1
+oyster o bird 1
+requir to view 1
+strik a sound 1
+viscount 1
+hat pbm 1
+biochemister www chem 1
+med using novel 1
+particl outstand 1
+sc dept 1
+se th perl 1
+truth shal flour 1
+topograph and clim 1
+a48 1
+a2z 1
+www talk archiv 1
+sixth 2
+molecl microbiolog 1
+se th background 1
+protein medl molecl 1
+break thy pat 1
+protein 3
+fifth and seventh 1
+bold 2
+user defin funct 1
+hamilt st 1
+lec part 1
+effect teach strateg 1
+medicin botan 1
+bolt 1
+princ st approach 1
+beaut had brought 1
+engineer departm 1
+mother against drunk 1
+bomb 1
+bomd 1
+deaf and hear 1
+disc 7
+cooper he cal 1
+other strong hold 1
+a4s 1
+joigner sent 1
+dish 1
+csb sju 1
+disk 1
+construc worker 1
+dism 1
+disp 2
+michael moor 1
+biom prec 1
+biolog program 1
+dist 4
+ad my help 1
+badam said 1
+softwar befor acc 1
+def hi lif 1
+restaur and pat 1
+pl tel 2
+respect carv 1
+lock loop 1
+danger to def 1
+washingt 6
+bong 1
+educ system 1
+ind wh pa 1
+qumran and modern 1
+futur gig 1
+edg tool 1
+held on august 1
+ryh nen 1
+bump a counter 1
+fin displ 1
+intern attent 1
+wom ioy 1
+ocean 2
+fin good 1
+molecl biolog orient 1
+book 17
+ra dim 1
+boom 1
+boon 1
+cont with 1
+boot 1
+ro joyc plester 1
+construc feedback 1
+neurosc program 1
+lin mendel 1
+stand cover 1
+tim to def 1
+kevin 1
+roman 5
+cornel archaeolog fieldwork 1
+chemhom.html biochemister duk 1
+design group 1
+model developm 1
+excel man 1
+list of configur 1
+bolster salt 1
+return to nexor 2
+interfac for browser 1
+garland 1
+pool contest 1
+such wil 1
+belief so strong 1
+research guidel 1
+feedback.html 1
+div of labor 1
+great black jack 1
+most stuff 1
+inspect th fil 1
+tryp so trick 1
+espec 7
+sw feder institut 1
+foot to mak 1
+understand th rel 1
+unbundl 1
+nav commander 1
+institut der bundesrepublik 1
+biochemister o protocol 1
+schuman build 1
+doc mlm softwar 1
+particl to ost 1
+dep altogether 1
+preh put 1
+prov a bird 1
+biotech inform 1
+war toom 1
+archaeolog cd rom 1
+toast 1
+aal governm 1
+rl for us 1
+low flight 1
+interest work 1
+born 2
+inform integr compan 1
+autonom agent 1
+departm of archaeolog 1
+suggest by compan 1
+someon.el fo.com mon 1
+el and secon 1
+project back 1
+strongest 1
+caus contool 1
+webmaster ncc.com 1
+cybernet corpor 1
+bost 4
+ver of gabriel 1
+biotechnolog support 1
+ser of mail 1
+period other poor 1
+wear lead 1
+proof of concept 1
+excel med 1
+pr and broadcast 1
+held at mi 1
+nan junior colleg 1
+northern ireland 1
+non law 1
+houseband iust desir 1
+cr an ar 1
+biotechnolog research park 1
+david schutz nsp 1
+archaeolg dat 1
+bench 2
+fetch a docum 1
+wright explain 1
+polyethyl 1
+read in se 1
+niutan 1
+bouk 1
+train init 1
+thesaurus indogermanisch text 1
+mi stud 1
+bout 2
+execut dec 1
+court a great 1
+congr apportionm 1
+zebraf inform 1
+cur opinion 1
+liebl 1
+soc status 1
+forc econom 1
+con incr 1
+techn credit 1
+il break 1
+quark 2
+loc us 1
+brit archaeolog 1
+us of computer 1
+quart 1
+disabl 2
+cytoskel protein 1
+bowl 1
+bown 1
+faithfl thisb 1
+swiftest 1
+render and visu 1
+developm 15
+bright loc 1
+search and aud 1
+perpendicl 1
+record stud owner 1
+mesolith transit 1
+wheeler 1
+reg surv encomp 1
+biotechnolog in roman 1
+great man disc 1
+whit hous confer 1
+select specif 1
+said master vinc 1
+snowboard everyd 1
+research program univer 1
+number th specif 1
+anthon nolan bon 2
+kilometer south 1
+catch 4
+rap ar inconv 1
+bioph o institut 1
+categor lin 1
+rap without hilt 1
+hypertextbook on cel 1
+pathw boehringer 1
+pr dril turnt 1
+archiv www talk 1
+biochem psychiatr 1
+agnew 1
+boyl 1
+disadv 2
+credit for mak 1
+wherein th blad 1
+giftopnm 1
+inst spir tip 1
+med school bi 1
+en hieroglyph 1
+la ca roman 1
+institut bi 1
+usenet interest group 1
+digit tradit tun 1
+ti ther 1
+why did obv 1
+institut martinsr 1
+list support 1
+men shal fight 1
+gal featur 1
+human induc alter 1
+fourth caus 1
+du patrim 1
+faint heart 1
+ext thy 1
+snowboard assoc 1
+browser swissprot pir 1
+method in archaeolog 1
+cater 1
+tech cl 1
+nolan bon 2
+us weather 1
+structur group 1
+cur develop 1
+ma produc 1
+web educ 1
+speech commun 1
+medicin and molecl 1
+institut de 1
+pharmaceut chemister 1
+wh agricultur produc 1
+conver th gif87a 1
+us on pair 1
+interest technolog 1
+pol preserv 1
+ch to us 1
+design div cour 1
+pal with tak 1
+pad opigskin 1
+viewer le docum 1
+archweb 1
+countr f mail 1
+immunolog interest 1
+examin hist settl 1
+began to fram 1
+fil with html 1
+winograd cs.stanford.edu 1
+wheel o tim 1
+archiv gener 1
+sect an ext 1
+ba and pilsner 1
+involut hierarch order 1
+mister fair 1
+ward perfect 1
+ho hugh med 1
+stout man 1
+arseweb calendar 1
+biotech brief 1
+vm ba 1
+group list 1
+institut structur biolog 1
+castiglion 1
+nozain 1
+interlac and transpar 1
+brother tob silver 1
+link to rel 1
+silver hi resolut 1
+univer hom pag 1
+nih program 1
+try order 1
+institut fr 1
+di geschicht 1
+journ refer 1
+dissem a broad 1
+thought about spin 1
+further light 1
+siz of bouk 1
+supercomputer 1
+structur mater saf 1
+backbon of knowledg 1
+alexander th great 1
+sol 2.x 1
+pag is attract 1
+bandwidth consider 1
+ea to us 2
+email and paym 1
+kilometer wid transect 1
+lack a fr 1
+terrain 2
+vinc prov 1
+april 4
+web for top 1
+orient internet 2
+enabl 3
+educ exper 1
+tim and chronolog 1
+me in un 1
+recent publ 1
+departm of med 1
+fin cop 1
+fil ppmtogif 1
+strap design 1
+minh in portug 1
+pdq di top 1
+attract a stead 1
+relev inform 1
+snowboard discount 1
+harvard univer ind 1
+confer on technolog 1
+plain good 1
+put in measur 1
+constrayn 1
+wysiwyg hypertext author 1
+inst and mak 1
+suggest or request 1
+categor orient search 1
+particl th technolog 1
+val cigar soc 1
+borough 1
+therefor ha eight 1
+mus vatican 1
+level of usag 1
+poison wiin seau 1
+great incr 1
+sun dec 1
+3d structur 1
+direct encod 1
+backgroundsupport th transpar 1
+start act 1
+homosexu in hist 1
+transpar border 1
+mcnult se 1
+track se 1
+decad 2
+ward ther belong 1
+mcnult st 1
+contain lot 1
+not but poor 1
+disaster 1
+math.ui.no 1
+biolab libr walter 1
+sourc cod 5
+proceed of isc95 1
+night dinner spec 1
+pol in prepar 1
+rel network 1
+radiolog relev 1
+int for loc 1
+www94 1
+dead in fight 1
+comb to cr 1
+cd40lb 1
+soph mail 1
+bon marrow inform 1
+hart fair lad 1
+art to com 1
+priv school 1
+ech no datab 1
+spec administer task 1
+avalanch awar clin 1
+rrn server arachnet 1
+new and announc 2
+dagger or buckler 1
+fold softwar guid 1
+us thereof 1
+bentl 1
+katzman 1
+queen univer 1
+issu in alif 1
+common html 3
+kar manner 1
+bioph research 1
+noodl.med.yal.edu 1
+abl to ward 1
+stramison 1
+brauer 1
+computer program 2
+combin caesar 1
+tour norw 1
+ground or rap 1
+joyc christopher langt 1
+industr mathemat 1
+watkin al 1
+archaeolg dat arch 1
+assoc of cl 1
+center onl phot 1
+ag loc 1
+world of j.r.r 1
+organ genet 1
+walk direct 1
+fight dep 1
+ar ar autom 1
+prefer interfac 1
+sort alphab 1
+b.c 2
+aliweb is sem 1
+facil 9
+b.p 1
+anc shikhin 1
+b.v 1
+great quarreler 1
+mak theconver 1
+xview libr avail 1
+di valorizzaz 1
+world wid web 10
+break on thrust 1
+good teach 1
+craft 3
+raichl 1
+northwestern 2
+wench 1
+httpd mad 1
+gener introduc 1
+henr th fifth 1
+cybernet 1
+fdtd 1
+complec cit 1
+nucleus.harvard.edu stev 1
+identif resourc 1
+window of appear 1
+mag top 1
+genet evolut program 1
+arch contain 1
+sit specif 1
+david jefferson 1
+not that hypermail 1
+peopl wh visit 1
+backmost hand 1
+rectangl 1
+thrust and blow 1
+arseweb contact 1
+period geoarchaeolog fieldwork 1
+cant ar tour 1
+wif began 1
+great danger 1
+rambl wreck 1
+biolog and biochemister 1
+usag descript 1
+server is inst 1
+search funct 1
+dinner th caer 1
+search rel 1
+vrij 1
+sant sant claus 1
+project th ct 1
+crain 1
+clean cut 1
+search launch 1
+med caus bigger 1
+demograph 1
+world hist 1
+insenst 1
+multim www pc 1
+whereat 1
+project biochem resourc 1
+world 2dpag 1
+remainder 1
+window seam gutter 1
+cyspid cytoskel protein 1
+pecl of minoan 1
+manu and assoc 1
+chang appropr 1
+coupl recept 1
+univer ind univer 1
+biolog o u.c 1
+singl dual track 1
+universiteit o brussel 1
+gzip tar fil 1
+giu twent pound 1
+epidemiolog institut fuer 1
+freestyler 1
+outdoor cloth 1
+human hav brew 1
+univer sit 1
+bioinformat and molecl 1
+satisf com 1
+se he trembl 1
+multipl categor 1
+sent to sfsh 1
+go forth 1
+badam begin 1
+vrml 1
+postcompl 1
+archieplec at universidad 1
+greenough 1
+new direct 1
+mak hypermail overwrit 1
+subst deposit 1
+iquot when defin 1
+discern to tak 1
+avail 41
+even fest inclus 1
+flash 2
+lind.marsh 1
+univer of washingt 2
+publ by da 1
+command search law 1
+fil with us 1
+macintosh ba desktop 1
+markup langu 1
+le you vnderstand 1
+html docum 4
+archieplexform at funet 1
+c.bird 1
+european biocomput institut 1
+biocomput rn fold 1
+virtu sharewar 1
+hypertext other fun 1
+sen detail 1
+utah snowboard assoc 1
+biolog cold 1
+dublin 3
+lsboard conf majconf.htm 1
+englishman 1
+telev ser 1
+apol refer agent 1
+biotechnolog suppl 1
+wyl thank 1
+exclus 2
+northern hemispher 1
+onder 1
+acc opt 1
+us recip 1
+educ support tool 1
+drummer 1
+physiolog 1
+serv saint 1
+chemhom.html 1
+listserv ubvm.cc.buff.edu 1
+school 10
+ibmpc 1
+krzyszkowsk 1
+christm in cyberspac 1
+datab of biolog 1
+desper boy 1
+copt orthodox 1
+un ver 1
+mean beaut 1
+ask ar 1
+avail for stud 1
+sequ o sw 1
+voor he oudheidkundig 1
+koflach 1
+vin and ol 1
+broad fam 1
+select is lik 1
+articl arch 1
+intellig reposit 1
+red carp 1
+gatew th departm 1
+cit lim 1
+lordship 1
+inclus a watch 1
+excel sc 1
+run th server 1
+talk www0.cern.ch fr 1
+armam 1
+aft stiff 1
+espec wh var 1
+signif contribut 1
+matter is buttr 1
+greek cl 1
+molecl bioph u.s 1
+appropr awk 1
+creat multim 1
+var number se 1
+writ hypertext docum 1
+reproduc computer virus 1
+staff man find 1
+wherein 2
+keep that order 1
+ver of mac 1
+inform on transpar 1
+siml tool 1
+find relev wa 1
+begin to explain 1
+brigham 1
+adapt solut 1
+wright say 1
+design and manufactur 2
+resourc eth 1
+drink al 1
+greenough new latin 1
+daniel hartl 1
+warn it appear 1
+sunnyv 1
+emerg soc 1
+secon hi pac 1
+althistorisch 1
+grad conjug grad 1
+train collect 1
+conceit 1
+conceiv 1
+pc mag 1
+departm cel onl 1
+worth man 1
+decst 2
+term listserv 1
+turnt bind configur 1
+milit popl 1
+circumfer and weight 1
+november 7
+stud job post 1
+way to approach 1
+docum klat 1
+psycholog research 1
+fr ver 2
+thus man year 1
+med centr 1
+2dpag tw dim 1
+ra th demand 1
+su fium 1
+fear 2
+bin acc 1
+feat 1
+tight produc schedl 1
+accompl entir 1
+saf to keep 1
+biochem and toxicolog 1
+piec parabol method 1
+top and imag 1
+armam sc 1
+bird of pa 1
+expect 4
+creat ar shown 1
+se ignor host 1
+halstead model 1
+mi artif ingellig 1
+biolog pharmac 1
+el with ver 1
+review journ 1
+suffer a crop 1
+pedolog stud 1
+molecl prob molecl 1
+anim and multim 1
+receipt of me 1
+african american 1
+biopharmaceut sc molecl 1
+uk server 1
+docum may put 1
+fight indeed 1
+anthon nolan 2
+delight to pl 1
+electron libr 1
+elsewh in greec 1
+explor develop 1
+us th net 1
+shennan 1
+ge further 1
+ten o memph 1
+melan 2
+aal 1
+anc remain 1
+brav nat 1
+whereof 2
+anc cit grow 1
+worth men 1
+biosc o exerc 1
+imp model 1
+whereon 1
+fr estim 1
+vp he slept 1
+conquer men 1
+alumin textur tip 1
+escrib aqu 1
+count replac 1
+st from niv 1
+therefor good 1
+paleolith st 1
+weapon 1
+fsu aect 1
+playtester 1
+abl 6
+mc7852 mclink.it 1
+html folder 1
+feed 4
+abr 1
+hau bound 1
+univer arch serv 1
+vin pol 1
+simp select 1
+feder of european 1
+map biolog 1
+feel 9
+tack kuntz 1
+try by death 1
+valu ar dat 1
+hormon research institut 1
+polyacrylam gel 1
+fenc had beat 1
+acc 20
+train guid 1
+academ environm 1
+englishman hold argum 1
+cr html 1
+ach 1
+support th deliv 1
+ack 1
+acl 1
+appar what sort 1
+at th nat 1
+addit to int 1
+lawlib.slu.edu ge 1
+acr 1
+act 19
+louer in hand 1
+scot high educ 1
+wild ge 1
+tradit mus 1
+distinct adv 1
+roman cit 1
+heinrich gilber 1
+underwater 1
+eng for educ 1
+off to keep 1
+major histocompat 1
+north dakot st 1
+wild gr 1
+se al www 1
+chemister portland pr 1
+compl usag 1
+romanou and marathopol 1
+maintain territ 1
+us resourc 1
+concept 6
+adh 2
+eit.com 1
+roast turk 1
+great engl fist 1
+great beer 1
+adm 2
+inherit 2
+adr 2
+group oxford univer 1
+adu 1
+sharewar imag 1
+adv 19
+dutton 1
+interdisciplin ph.d 1
+schol review 1
+exc th me 1
+cheer so good 1
+hypermail wil read 1
+15apr93 1
+me in plain 1
+intern tlm 2
+displac 1
+signif 6
+health and hap 1
+roadtrip 1
+cyprus 2
+educom new 1
+concern 3
+grasp research 1
+interact autonom agent 1
+everyd 1
+pa again 1
+browser wil prompt 1
+subm enh 1
+reader 4
+bedlam beast 1
+cadaver 1
+flec pattern 1
+star from alt.sec.mov 1
+rutger 3
+afr 4
+loc construc bus 1
+aft 1
+stud job 1
+mad transpar 2
+bad thing 1
+catalog yal 1
+art museum 1
+frendship 1
+husband 1
+elsb martin 1
+controller composit 1
+expel melanch 1
+agn 1
+var of mater 1
+agr 5
+cont a brief 1
+agu 1
+pl th pat 1
+url contain 1
+harald jam 1
+greek civil 1
+biocatalog of molecl 1
+hap to thrust 1
+naught 1
+qu in natur 1
+manu ind 1
+kind of fight 1
+common both slain 1
+front of subject 1
+inclus docum avail 1
+acquir cour object 1
+ahm 1
+malt scotch whisk 1
+fight be chang 1
+server root 1
+intern council 1
+memor gard 1
+common lisp 1
+ii lift 1
+armor 1
+2de protein electrophor 1
+copper 1
+pag refer 1
+knau th bask 1
+aid 4
+schutz nsp 1
+alan mead 1
+mak a list 1
+plant molecl biolog 1
+aim 5
+tech publ 1
+leap program 1
+sev fold buckler 1
+air 5
+jim mil 1
+orthop biomechan div 1
+conspicu ab 1
+mock 1
+felt 2
+wrestl by strength 1
+tech is avail 1
+josef m aut 1
+ad inl acc 1
+mot is swifter 1
+kn bent low 1
+dream girl 1
+www.ec.ucsb.edu icip97 1
+link from older 1
+confer on protein 1
+inclus effect 1
+cultur et de 1
+dat libr 1
+lab dem 1
+select multipl 1
+roman imper capit 1
+modl 3
+lerch 1
+practitioner of instruc 1
+popl sharewar imag 1
+shelter 1
+help snowboard educ 1
+aristarc 1
+new is run 1
+fenc 1
+biotechnolog o pum 1
+latin grammar 1
+hist of gam 1
+hot dog 1
+skip th techn 1
+stripl susp 1
+bind attachm point 1
+superior design 1
+law in latin 1
+alf 1
+alp 2
+electrost forc 1
+com bold 1
+rober croft brown 1
+alt 6
+edit wer run 1
+thank del 1
+quentin tarantin film 1
+adv med informat 1
+wilkin better grac 1
+amd 1
+bil man 1
+se biolog 1
+spec in roof 1
+implem of aplac 1
+modest mood 1
+noblem 1
+purchac your fam 1
+soil their hand 1
+anc 5
+and 2
+quarter sword 1
+feel lik bang 1
+singl and rar 1
+ang 1
+bon marrow 2
+string 4
+bon marrow trust 2
+titus 1
+computer virus synth 1
+instituut voor 1
+baylor genom center 1
+uncr without going 1
+direct shockwav 1
+ant 6
+sc web sit 1
+anu 2
+anx 1
+latinoamerican 1
+jackson 4
+good to extraordin 1
+conver 9
+melod 1
+bruxel 1
+thereabout 1
+guar lic insur 1
+increm each tim 1
+ba design developm 1
+protein domain 1
+imag field project 1
+wom and gender 1
+aol 2
+browser put 1
+le th problem 1
+journ of molecl 1
+gel electrophor 1
+tim you view 1
+specializ 3
+dist learn 1
+onl and creat 1
+dyssh mer 1
+hit awr 1
+archiv when chang 1
+nearest 3
+c.b 1
+fac number 1
+imag by justin 1
+moir 1
+organ of ch 1
+bit of text 1
+lept or lepc 1
+stripl 1
+technolog train 1
+apr 2
+faq heinlein 1
+apt 1
+rur domest 1
+spar to say 1
+c.w 1
+mail list pol 1
+wound and slaughter 1
+censur 1
+fest 2
+fact may speed 1
+metal raw mater 1
+internet link 4
+pag educ 1
+fr to ask 1
+nih grant 1
+singl background color 1
+tal man 1
+15dec92 1
+origin html 1
+group ar discover 1
+fixtur result 1
+bob mor 1
+singl da 1
+natur thereb rack 1
+server which list 1
+aqu 2
+glob law 1
+discount 2
+program augst seminar 1
+reichelt 1
+arc 2
+ard 2
+arg 1
+arm 3
+tr ind 1
+arp 1
+computer ba learn 1
+art 7
+disbur 1
+run sun 1
+stand to def 1
+mold 1
+univer colleg dublin 1
+opposit 1
+bi technolog 1
+tim appertain 1
+molg 1
+prov inform 1
+law journ 1
+natur hav taught 1
+asc 2
+textur tip 1
+tabl foc 1
+ask 14
+lisqu dan 1
+brown univer 1
+rel com 1
+want to writ 1
+command featur 1
+popl wh geograph 1
+ic breaker bird 1
+surviv from leptiminus 1
+ath 2
+learn jun 1
+atl 5
+ai program 1
+eirean cl ireland 1
+libr entr 1
+serv can sold 1
+atp 1
+circuit siml tool 1
+arrang an interview 1
+phy sc 1
+informatiqu et 1
+grant and contract 1
+lab don 1
+mong 1
+fic som problem 1
+monk 1
+lin biolog job 1
+interact 8
+aud 6
+project corpor liaison 1
+newstead 1
+former cal 1
+auf 1
+customer satisf 1
+maxim 3
+soft mar 1
+monr 1
+euler 1
+aug 2
+mont 1
+jordan 1
+season wareh sal 1
+tal men 1
+glob imag 1
+span fencer 1
+av that doubt 1
+rober lou tewdwr 1
+aur 1
+half doz 1
+aus 1
+aut 3
+mood 1
+great black 1
+began th fr 1
+operon 1
+nomber th peacock 1
+cal cob traver 1
+moon 2
+moor 1
+mischef men 1
+moou 1
+sport park direct 1
+eastern snowboard 1
+brandon 1
+internet list 1
+pledg 1
+edg sl 1
+hel civil 1
+holmb 1
+internet to prov 1
+simpl search docum 1
+caught from court 1
+dynam diffract theor 1
+cel biolog amersham 1
+pip ha grown 1
+awk 1
+me210 1
+automat decompr 1
+search sit 1
+diod and tran 1
+weather dat 1
+vergil 1
+awr 1
+subscript and notif 1
+palaeoveg 1
+molybdoenzym research 1
+ct mr 1
+vnworth 1
+year th snowboard 1
+rang of background 1
+axl 1
+schutz pipel.com 1
+warn to bewar 1
+mo fil menu 1
+brought in with 1
+word promin 1
+major air 1
+immunolog 1
+rey book 1
+statistiqu 1
+morn 2
+clear why minoan 1
+sen it expr 1
+took hi rac 1
+sk team 1
+technolog san 1
+proou in louyng 1
+imag research 1
+research worldw 1
+tot extent 1
+click link 1
+pot donor 1
+whit entr 1
+minim drag 1
+bump th count 1
+kan wa clear 1
+departm of biolog 1
+mailbox may actu 1
+hydrophob hydrophil 1
+most 3
+com th us 1
+jam group 1
+bright o sleep 1
+guid surg 1
+mark to know 1
+pager 1
+michigan papyrus 1
+reason for autom 1
+work al week 1
+point mcnult 1
+trad and po 1
+ge th docum 1
+sebast heath sfsh 1
+hurt with fir 1
+agricultur land 1
+artif strik 1
+memor gard register 1
+start to complain 1
+ar to inclus 1
+turbl hydrodynam 1
+perfect length 1
+nec to li 1
+help th sick 1
+after ha slain 1
+sen al command 1
+dearer 1
+stud newspaper 1
+softwar fan 1
+freestyl and alp 1
+softwar faq 1
+sift select inform 1
+seqanalref 3
+mous 4
+neurosc program californ 1
+anywh 2
+marc andr 1
+el for lou 1
+britain 2
+accompl stil photographer 1
+psycholog pag 1
+observ of stocat 1
+roman dat 1
+universit de ren 1
+specif th mail 1
+further cour 1
+european molecl 1
+xpr tag filter 1
+server your server 1
+requir incr 1
+datab of biochem 1
+micr reg 1
+evolut program typ 1
+frequ th search 1
+superfam server 1
+research genet inc 1
+form with tim 1
+museum of anthropolog 1
+oak ridg 1
+stand upon break 1
+perish th bon 1
+cfcfcf new.gif 1
+gauntl 1
+cr list 1
+holtz 1
+young ol tr 1
+fr web 1
+support footb 1
+commonwealth network 4
+nat to fight 1
+develop a lot 1
+edg ha plan 1
+squeez ga 1
+converter avail 1
+labor personnel 1
+increm with sendmail 1
+mart valt 1
+univer o bibliograph 1
+koflach valug light 1
+sbh nord 1
+div mechan div 1
+alber research 1
+de larch 1
+equ complec soc 1
+train mater 1
+moyc 1
+pl support 1
+hand or arm 1
+hand wil li 1
+smaller lept 1
+largest is 87k 1
+enharmonik record 1
+cour in biolog 1
+geograph select 1
+asunder their pik 1
+blow com continu 1
+common stab 1
+pl vnt 1
+troubleshoot tip 1
+fold th organ 1
+cit over coff 1
+singl sk 1
+scientif visu 1
+con of leftover 1
+ba direct 1
+inser edit dat 1
+georg charp 1
+perform whatsoever appertain 1
+man most internet 1
+fil attribut 1
+server for ugarit 1
+jam penr 1
+doing i do 1
+rob creat 1
+custom mr 1
+sit contain 1
+arosnet 1
+center 19
+yah hierarch ind 1
+bab 1
+arch of anc 1
+bad 5
+break or catch 1
+inclus biotechnolog 1
+hil o bioscan 1
+grac wa chaung 1
+neighbor 1
+bak 1
+bal 3
+therefor earliest zon 1
+structur hyperm develop 1
+ban 3
+length soever 1
+bat 1
+co oper intern 1
+web virtu 1
+cu w3 search 1
+gener techniqu algorithm 1
+arch fil 2
+opt o miscellan 1
+spac decomposit 1
+promin rol 1
+great review 1
+prap over program 1
+ct xx 1
+quarter charg 1
+plain asc 1
+look at atl 1
+new th season 1
+server program 1
+project datab 1
+joan dru 1
+contain new 1
+hypertext book 1
+conspicu knol 1
+gener frolick 1
+hand is swifter 1
+thesaurus lingu latin 1
+pr trick 1
+answer mcnult 1
+resourc by gopher 1
+woman cannot hau 1
+sl faster 1
+massachus 3
+learn design 1
+good altern 1
+ct centr 1
+wheeler is avail 1
+hodder 1
+order to understand 1
+speed bandwidth consider 1
+virtu libr biolog 1
+lanet in latv 1
+schoenbach 1
+good rol 1
+ind of pub 1
+light 7
+tun to show 1
+contain pubbl 1
+flower wil soonest 1
+paid fourteen 1
+ensembl 1
+chapter 1
+paleolith st tool 1
+us of inform 1
+molecl biolog vect 1
+internet world congr 1
+bed 2
+bef 1
+organiser nor loughborough 1
+www.biochemister 1
+select with consider 1
+bel 3
+protein electrophor la 1
+ben 3
+grab th imag 1
+common to stab 1
+root docum 1
+sunnyv town center 1
+beu 1
+layout 1
+bundesrepublik 1
+sen th command 1
+upd direct 1
+entr might look 1
+oregon 2
+anonym 5
+arrow icon 1
+biolog job 1
+system mail daemon 1
+background color 1
+contain a word 1
+jl 7th 1
+mail about gdb 1
+cal vin vendor 1
+neal say 1
+estim and understand 1
+texinf 1
+restrict sit an 1
+cr hinder 1
+heed of makyng 1
+technolog and train 1
+pdq helpl 1
+el friedland 1
+wider 1
+ge overlook 1
+negot 1
+went to it 1
+car to giv 1
+louyng hi lad 1
+bionet.molb.methd reagn 1
+photograph larch 1
+stag th lowest 1
+weapon con 1
+3dim 2
+multitud of men 1
+compil by patrick 1
+yazvenk an 1
+roy genealog 1
+discover 4
+andrew riggsb 1
+mednew 1
+corpor research 1
+off weather dat 1
+or institut 1
+ie irc 1
+bic 1
+bid 1
+big 4
+specif direct 2
+slow mot 1
+robot with refer 1
+bil 3
+teach learn 1
+bim 1
+bin 3
+gauntl is suff 1
+anc roman cook 1
+third mil 1
+bit 6
+tim ar lost 1
+blow is utter 1
+text th robot 1
+rutger univer quebec 1
+collect your detail 1
+lacedemon 1
+taiwan new zealand 1
+appl for biochemister 1
+signior rocc mad 1
+michael quibu 1
+brad 1
+peopl stand 1
+mail tempor 1
+brag 1
+loc with acc 1
+bral 1
+subm to lyc 1
+hospit cancer 1
+el amarn collect 1
+lou th fayth 1
+exploit for tract 1
+brav 1
+cal arch 1
+biograph dict 1
+individu organ 1
+program o departm 1
+ext menus 1
+gr pang 1
+fight fal 1
+loc scen 1
+mpeg 2
+plac on edg 1
+nottingham web server 1
+join th disc 1
+hombl 1
+read th twelfth 1
+duk papyrus arch 1
+us th opt 1
+electron 15
+hamilt calcl 1
+blu 2
+discov 2
+genev loc pag 1
+know my mind 1
+celebr death 1
+format inform 1
+imag cod 1
+jeronim pr 1
+food color agent 1
+immer 1
+institut of technolog 3
+biodegrad datab 1
+mcgil univer 1
+bmv 1
+rel div 1
+austr finland 1
+coast plain 1
+utah went 1
+man of imperfect 1
+list subscriber 1
+contact th maintainer 1
+entr wh compl 1
+project on peopl 1
+meselson lab 1
+mayd coy 1
+download th softwar 2
+architectur remain 1
+img src htmlguru 1
+us th direct 1
+iop thin film 1
+departur 2
+us command 1
+dat is opt 1
+stretch over centur 1
+developm with corpor 1
+nicholson 1
+learn confer 1
+brew 3
+amphor bur 1
+nelder mead method 1
+print four tim 1
+mach shop 1
+bob 1
+register web sit 1
+biolog univer 1
+bod 7
+palac and romanou 1
+salt work 1
+daresbur 1
+molecl biolog 4
+word occur 1
+ea.oac.uc.edu 1
+homep 9
+want to check 2
+bol 1
+carbohydr 1
+bon 8
+memor 3
+bor 1
+featur item mad 1
+find your pag 1
+bow 1
+unit kingdom 2
+box 9
+produc a compl 1
+complain that snowboarder 1
+boy 2
+publ design 1
+cooper walk down 1
+curt low 1
+listserv server 1
+d.c 1
+memph 2
+quest about snowboard 1
+d.j 1
+system level 1
+continu support 1
+halstead and soc 1
+flesh and bon 1
+d.t 1
+easiest 2
+descript of listserv 1
+centur 4
+unbrok lin 1
+foc yellow 1
+allow you specif 1
+allright 1
+syr univer 1
+cook from prim 1
+yong man 1
+institut fuer molekl 1
+immin 1
+mater suggest 1
+carbon chain ba 1
+latter manu 1
+belew rodn brook 1
+wac wan 1
+welitsch 1
+0001.html 1
+fac of skiing 1
+found us 2
+transl to hypertext 1
+thousand 5
+han gunter 1
+list search ind 1
+ob lisqu dan 1
+guard 1
+med biochemister 1
+learn technolog 1
+moscow 1
+vant except 1
+umbrel 1
+walk hik 1
+datab o cold 1
+honor wel know 1
+constru 1
+sw 3dim 3d 1
+it radiolog 1
+person risk 1
+brit 7
+pier luc claver 1
+assoc of law 1
+brief reason wherefor 1
+bilman 1
+biolog o molybdoenzym 1
+biochemister at wak 1
+digest me compil 1
+ken sproat 1
+imperfect schol 1
+bsd 2
+faythfl lou 1
+evid for ext 1
+antiqu intern 1
+infoserver 1
+cultiv of oliv 2
+differ organ 1
+bst 2
+wisdom do conc 1
+hist of it 1
+usenet new group 1
+incr boolean 1
+ring interfer 1
+therfor for lou 1
+idiom 1
+confer sampt97.html 1
+weblouvr 1
+ser wrong 1
+univer 34
+sant cruz avenu 1
+catalog florid 1
+arab settl 1
+aqu tus 1
+run fast 1
+dn vect 1
+tr seigneur arch 1
+institut of diab 1
+ceremon 1
+saying 4
+tryxt 1
+subject centr 1
+ff for red 1
+bus opportun 1
+geschicht 2
+wif discoueryng 1
+dem rel 1
+fl produc developm 1
+bud 1
+bug 2
+cg driv 1
+period check 1
+edger center 1
+campus 2
+bur 3
+encod 2
+connect 7
+bus 9
+biochemister group 1
+brick 1
+but 2
+hormon thing 1
+buy 1
+blow and thrust 1
+incr th tim 1
+volunteer snowboard 1
+art and writer 1
+liter and writ 1
+width 2
+noborder featur 1
+comput new technolog 1
+deliver 1
+build wh 1
+inl acc count 1
+dlst 1
+list yah 1
+umin1.bitnet 1
+arm in front 1
+favor stoddard brew 1
+de bramefan 1
+brief 6
+pl contact 5
+confirm th wi 1
+war we us 1
+pr with lov 1
+http www.du.edu jgilber 1
+lin matr 2
+ech dish 1
+solut technolog 1
+cantabr 1
+governm 3
+assoc with var 1
+self suff 1
+labor o resourc 1
+bipart 1
+quarter cl review 1
+follow by word 1
+fieldwork palynolog an 1
+brok 2
+order of relev 1
+transit from zon 1
+john fo.com 1
+conclus stat 1
+chemicool 1
+xpr tag 1
+fo in war 1
+brow 5
+compan nam 1
+point put 1
+stat optim 1
+macromolecl cd40lb 1
+palac as inspir 1
+sport is pur 1
+byp 1
+d92 1
+shuld hit awr 1
+unknown 1
+link of interest 1
+school and pl 1
+univer of trondheim 1
+seek to ward 1
+dam doeth run 1
+overmatch would sud 1
+raichl snowboard 1
+dd rl rl 1
+earl event 1
+badam adm 1
+troubleshoot 1
+tom maniat 2
+young youth 1
+boot du 1
+essec 1
+med informat 2
+men of mean 1
+search glob 1
+aliweb robot 1
+supercomput init 1
+webster 1
+tim is doubl 1
+support batch 1
+rur spac 1
+habu 1
+system datab 1
+var of weapon 1
+pennsylvan museum 1
+ch th categor 1
+glov of mail 1
+conver gif87a imag 1
+manu text ind 1
+elabor and dur 1
+command search 1
+hack 1
+instruc technolog departm 1
+flavoprotein 1
+examin th entir 1
+classroom and antholog 1
+arch other mail 1
+pierc hi corsl 1
+imag is restrict 1
+baseplat 1
+snowboard articl 1
+bon.de far imsd.meb.un 1
+gif89a format 1
+aplac interpreter 1
+ncc log 1
+snowboarder to start 1
+postscript 3
+bold and insuff 1
+hadr 1
+ru such louer 1
+sk wh belief 1
+know or suspect 1
+search term occur 1
+imag to pcx 1
+contempor archaeolog 1
+singer and arranger 1
+learn with technolog 1
+cam int england 1
+archaeolog and anthropolog 1
+telescop pictur 1
+cur allow snowboard 1
+separ by lin 1
+got tir 1
+ka power 2
+mak th houswif 1
+agricultur univer 1
+act susp 1
+therap 2
+biolog o institut 1
+mail noack 1
+brun 1
+background inf 1
+inclus a link 1
+cdr overview cdr 1
+honor priv council 1
+vic and dev 1
+return of odysseus 1
+good sir 2
+duk univer florid 1
+appertain unt rap 1
+ctil publ 1
+coleman 1
+seminar on dist 1
+universt 1
+fair hous 1
+list ar search 1
+meadow at lak 1
+fl qualif docum 1
+chil and southwestern 1
+speed th rap 1
+bring 7
+check th acc.conf 1
+adv tool 1
+travel dyssh 1
+palat pol 1
+guy snowboard 1
+longer weapon li 1
+caus yong 1
+fair even flec 1
+gopher at unomah.edu 1
+paper go 1
+nin liv 1
+hart fair 1
+collect wa car 1
+sr intern 1
+spec produc 1
+thereb 2
+challeng 1
+redistribut power 1
+hair 2
+cab 1
+cad 1
+caf 1
+patent law 1
+cal 18
+cam 7
+bryd 1
+frivol 1
+cap 8
+car 15
+cat 3
+subm your dn 1
+cav 1
+bryn 1
+bit on educ 1
+ncc freewar 1
+reg for mediterranean 1
+command vi us 1
+univer computer vi 1
+se a skil 1
+etern surf dead 1
+snapshot 1
+construc 14
+us netscap 1
+czech republ 2
+strap freestyl 1
+attempt to mak 1
+main o departm 1
+attempt to mar 1
+warfar and tact 1
+attempt to work 1
+post frequ ask 1
+ccc 1
+doc web direct 1
+fin neolith 1
+northern californ sc 1
+amount 6
+cleopatr 1
+half 5
+ccv 1
+nok corpor 1
+cd rom inform 1
+achief 2
+dn and protein 1
+design html pag 1
+architectur newsletter centr 1
+investig hav unfortun 1
+which sur wyl 1
+center point 1
+halv 1
+kernel group 1
+york protein structur 1
+began to smil 1
+count that sh 1
+vew how cupid 1
+using that color 1
+cdr 1
+dist and nimbl 1
+contribut 12
+brisk 1
+town grew 1
+joint developm 1
+henceforth as stranger 1
+markov model 1
+perm rapid chang 1
+lecturer 2
+trondheim in norw 1
+actu x compat 1
+therin 1
+cel 4
+cem 3
+par el estud 1
+cer 3
+hand 17
+hang 2
+light ceremon 1
+research project 5
+techn nic imag 1
+center for biom 1
+list follow 1
+archaeolog photograph 1
+resourc o institut 1
+imag and robot 1
+di th cach 1
+maniat 2
+molecl biolog softwar 1
+ba centr work 1
+break th surfac 1
+publ ment 1
+middl roman pr 1
+tolk sit 1
+pdq investig 1
+learn partner 1
+cmu artif intellig 1
+quark tag cr 1
+onl ver 1
+er interdisciplin 1
+common el 1
+daniel k.schneider 1
+vid pag 1
+prov much greater 1
+reservoir model group 1
+consider to hold 1
+rest vpon 1
+cg compl tut 1
+nebrask 1
+throw gr 1
+reach th highlight 1
+mak wiser bargain 1
+chr 10
+ge new stuff 1
+unusu to find 1
+2nd erlang symp 1
+ver of onl 1
+broad categor 1
+bioperl 1
+irish web sit 1
+le11 3tu 2
+se a compl 1
+kinem 1
+brachydan rer 1
+button and leav 1
+saf com 1
+surfac slick 1
+palaeoclimatolog 1
+champ by renfrew 1
+try rid 1
+hard 4
+cit 11
+sub pag 1
+find it ea 1
+cognit 2
+darwin 1
+autom protein 1
+hap with bel 1
+harm 2
+program cal 2
+us th register 1
+biosc bionet electron 3
+hart 1
+mater for anc 1
+electron subm 1
+html fil suit 1
+psychiatr 1
+color entr 1
+regener to inclus 1
+st doth tel 1
+nucleat sit 1
+st furn 1
+memph departm 1
+using bound integr 1
+com and go 1
+cur docum count 1
+nebrask in lincoln 1
+artif lif compl 1
+molecl neurobiolog lab 1
+hast 3
+washingt o physiolog 1
+inst against crop 1
+ioyl just 1
+surest 1
+engineer design 1
+invinc 1
+rid styl 1
+view to develop 1
+settl surround 1
+st should fail 1
+trail foot 1
+nat geograph soc 2
+ftp from ftp.uu.net 1
+mat meselson lab 1
+galler 1
+sixt per cent 1
+sen of plac 1
+clp 1
+light doth appear 1
+archieplec at sydn 1
+match th order 1
+design by tom 1
+indig developm 1
+lin begin 1
+consult 4
+norm inclus 1
+gruber ksl.stanford.edu 1
+vo libr 1
+vi human project 1
+datab of protein 1
+morgan park 1
+support html mod 1
+enabl inclus par 1
+departm of phy 2
+michael 4
+list of resourc 1
+cmd 2
+program support 1
+perform spec administer 1
+mi center 1
+biolog invitr 1
+fr to com 1
+pag from algonquin 1
+larger 10
+electron libr program 1
+featur arch gatew 1
+fr to cop 1
+genom inform 1
+promot os 1
+cmu 1
+col cup 1
+vertu ar clean 1
+docum o leav 1
+handl transpar 1
+biotechnolog genom 1
+insuff weapon therefor 1
+vect db 1
+se poor 1
+ext help 1
+coevolut and ecolog 1
+inclus in fil 1
+almight god 1
+produc wh ident 1
+ventur 1
+assoc id 1
+linux oper 1
+snow condit 1
+men mind 1
+hawk 1
+heretofor 1
+syllabus 3
+rist niutan 1
+er and pip 1
+cob 1
+coc 1
+hc and project 1
+research onl 1
+cod 15
+pictur tak 1
+multim 6
+cog 1
+coh 2
+quean 1
+7th c ad 1
+col 6
+compl work 1
+multit 1
+com 34
+con 10
+cop 14
+cor 7
+cov 1
+univer o center 1
+coy 1
+biometer person 1
+cycl from problem 1
+biolog cold spring 1
+datab columb univer 1
+mak th fair 1
+e.g 8
+ar liv 1
+mitchel 1
+cel biolog program 1
+stand fast 1
+institut fuer altertumskund 1
+cr4 1
+microstrip 1
+ti cal 1
+attract of leptiminus 1
+tradit sant claus 1
+moulon o prodom 1
+computer as leg 1
+us th addr 1
+endocrinolog 1
+figur capt 1
+inclus hand telephon 1
+dat subject 1
+organiser 1
+tim fulfil 1
+day fight 1
+simil en 1
+collabor biomolecl toool 1
+fo.com subject 1
+vismod.www.med.mi.edu confer 1
+cad cam 1
+15may93 1
+addr to listserv 1
+invitr 1
+av gopher 1
+aacompid 1
+fl produc 1
+sub of lil 1
+tod richard 1
+cur on lin 1
+balt ic breaker 1
+assoc me 1
+angl near perpendicl 1
+cry 2
+imag using xv 1
+arthur 3
+geograph search cap 1
+delightfl of mother 1
+ec html fil 1
+csb 1
+recogniz is describ 1
+sift technolog 1
+pilsner urquel 1
+queen 3
+biotechnolog resourc 1
+nam inst acc 1
+dist deceiv 1
+archiv new 1
+forg to se 1
+csu 1
+da upd 2
+hist of sardin 1
+go a fishyng 1
+dat subm 1
+st cur allow 1
+obv error 1
+drew their rap 1
+lou to show 1
+chang in bind 1
+shamr 1
+bel aliu 1
+cdr new 1
+musculoskel and vascl 1
+euangelift 1
+defin 8
+fr and countr 1
+why hi resort 1
+museum gel run 1
+env a manipl 1
+orang tart 1
+plow digit 1
+boskov institut zagreb 1
+aal resolut dat 1
+man can natur 1
+thread.html 1
+molecl and di 1
+sew treatm 1
+seminar and hand 1
+ind.html 2
+softwar univer 1
+ec docum 1
+hand of emerg 1
+manipl 3
+sut in hast 1
+cun 1
+cup 2
+apol look for 1
+menus 1
+soap oper 1
+cur 25
+cus 2
+cut 4
+fellowshyp 1
+search term 2
+lou day 1
+circuit of world 1
+ar loc 1
+mycenaean 2
+view to refin 1
+labour in seekyng 1
+biomolecl sequ 1
+read adopt 1
+trust wom 1
+ad new welcom 1
+valug light 1
+molecl biolog workbench 1
+chang appropr entr 1
+hast to bed 1
+andrew 2
+surplus be exchang 1
+instr ther appertain 1
+chang over tim 2
+inclus titl 1
+subtract resourc 1
+how dbh doc.ic.ac.uk 1
+october 10
+tak a quart 1
+serp fel 1
+ai.mi.edu laurel simmon 1
+jumper 1
+throw gr pang 1
+ge hypermail 1
+zoolog 1
+self reproduc computer 1
+pomon colleg 1
+mar drecker 1
+sen any me 1
+sharp light sword 1
+vromoner nozain 1
+pbm habit 1
+hel greek 1
+thapsus 1
+rapper 1
+uc.edu uc irv 1
+bioph washingt univer 1
+cyril reub 1
+term occur 1
+program com 1
+st must bewar 1
+ma he straight 1
+ext ar 1
+obitu a heav 1
+imperfect weapon 1
+shorter reach 1
+thought good 1
+becom scarc half 1
+cultur develop 1
+campbel lorimer 1
+larger perm 1
+hm defaultind 1
+eyr de 1
+biochemister duk univer 1
+engineer and biotechnolog 1
+sharp 2
+project geosim mail 1
+honor 4
+run in with 1
+labor univer 1
+natur 13
+richard cl 1
+libr soc 1
+cyr 1
+ethnograph 1
+url work 1
+converter inst 1
+man tak adv 1
+upd cr 1
+heckler 1
+brun cnd.hp.com 1
+reviv and continu 1
+labor to ge 1
+surfac 5
+cur electrotherm compon 1
+find it us 1
+californ ba 1
+estec 1
+bibliothec 1
+preh of me 1
+dutch 1
+developm of nlp 1
+skil in traver 1
+commerc leg 1
+univer o flavoprotein 1
+cretan lat bronz 1
+thus i hau 1
+en biotechnolog 1
+departm of computer 4
+richard gabriel 1
+sift wil yield 1
+disgrac against englishm 1
+migpol siml 1
+shaun 1
+pa answer 1
+redirect to correct 1
+www gopher 1
+unusu point 1
+archiplec uk 1
+aeronet 1
+universit de 2
+saf dat 2
+attract 2
+everywh sav wh 1
+list for bel 1
+adob photoshop 1
+lif iv 1
+inclus syllabus 1
+ad on 1
+archaeolog journ 1
+univer inform 1
+develop adv tool 1
+abbot 1
+ultim internet refer 1
+fourth centur 1
+pl giv tim 1
+fal fenc 1
+monk and beekeeper 1
+stud exerc 1
+exclus letter transm 1
+enh stud 1
+publ th year 1
+ul phon book 1
+went forth 1
+ri of palat 1
+spectr abstract 1
+worthingt 1
+perform spec 1
+settl pattern 2
+amber autom mush 1
+domest econom 1
+south sid 1
+center for structur 1
+vnbound 1
+centr show 1
+sit is maintain 1
+us that instead 1
+determ to uncertaint 1
+estim 4
+handrail 1
+tim spent refer 1
+zuerich biocomput 1
+project zebraf 1
+good tim 2
+feel fr 4
+bargain 1
+hand on train 1
+snowboard seen 1
+behold th fight 1
+unfortun 9
+contain appropr docum 1
+journ cover molecl 1
+saf def 1
+catch your fanc 1
+hypermail is giv 1
+visu art 1
+enabl inclus 1
+try th hist 1
+result accuml 1
+tim to judg 1
+david jefferson gerald 1
+biolog reag 1
+speed cam 1
+pot interest technolog 1
+protein profil univer 1
+certain 3
+hyperg etc 1
+departm descript 1
+onl edit 1
+gradu hypoth 1
+rel network resourc 1
+departm of cl 2
+quest 24
+light lou lodgd 1
+contool requir 1
+manufacturer of african 1
+html tabl 1
+biolog lim 1
+articl 13
+therm circuit an 1
+inclus docum typ 1
+mac planck 1
+cloth plainl clad 1
+organ entr 1
+dal 1
+dam 2
+dan 6
+prevail 1
+browser to di 1
+dat 31
+ye addr 1
+design center 1
+dav 6
+day 9
+north sant cruz 1
+research pag 1
+otag museum 1
+allow onl 1
+com brav 1
+leader 4
+dbh 1
+emac by typ 1
+veracruz 1
+educ nick badam 1
+object of creat 1
+paint 4
+window system 1
+baylor colleg 1
+silver paradox 1
+keep th httpd 1
+oldest photograph 1
+ward high strong 1
+zebraf 2
+shop enabl 1
+us th noborder 1
+jumpst 1
+ea loc 1
+addit to loc 1
+light sword 1
+anchor ring interfer 1
+imperfect fight 1
+coevolut 1
+datab o world 1
+german list 1
+definit en 1
+tim span 1
+seek he good 1
+cook guild 1
+nimbl and length 1
+abl view imag 1
+ind of rur 1
+compon with frequ 1
+deb 2
+dec 14
+circumfer hi hand 1
+olog sous le 1
+ded 5
+def 4
+lif sc 1
+downtown sunnyv 1
+leav th subject 1
+del 9
+dem 8
+den 7
+dep 7
+mi resourc 1
+der 2
+separ funct 1
+pat part 1
+modern scholarship server 1
+annel ha giv 1
+dev 4
+dew 1
+produc in order 1
+item mad 1
+wherefor 1
+driv to thrust 1
+upgrad 2
+scientif commun 1
+ian dutton impr 1
+food and great 1
+consider shit 1
+ext pr 1
+paint tool 1
+straight doeth 1
+distribut th post 1
+microsoft draw 1
+shar mor common 1
+init quest 1
+mak known 1
+light lou day 1
+provinc lik greec 1
+bioweb biotechnolog univer 1
+fayr word 1
+berkel molecl 1
+fertil and climat 1
+benedict monk 1
+pag is load 1
+foreign pol 1
+list on educ 1
+klassisch philolog 1
+default 3
+umd.ac.uk 1
+pol result 1
+bernd 1
+author hav contribut 1
+surfac that level 1
+ai faq ind 1
+def th battl 1
+vitr evolut 1
+spread imp 1
+publ in d.j 1
+attraver 1
+hypermail what mailbox 1
+brit museum 1
+un mailbox 1
+nanotechnolog 1
+molecl medicin 1
+fam of cook 1
+ar mbt 1
+fo.bar 1
+cl libr 1
+dim 8
+din 1
+mot plan 1
+dip 1
+von guter sp 1
+dir 1
+sign an 1
+contact danm morsepr.com 1
+dit 1
+div 7
+biom imag 3
+estud 1
+fin got 1
+recent addit 1
+pomp and grandeur 1
+gentlem of good 1
+var th optim 1
+using gif89a 1
+qu satisf 1
+parent in lou 1
+wisdom 1
+inform in norweg 1
+high recom 1
+church father 1
+proc system 1
+oliv 2
+sit engineer 1
+upgrad to fr 1
+sel hpc articl 1
+leav th list 1
+californ sc 1
+fil for brand 1
+addr detail 1
+loc bus using 1
+xenopus molecl 1
+peacemaker 1
+biomolecl engineer research 1
+show lou 1
+pag of 12pt 1
+californ st 1
+funet in finland 1
+morimot lab 1
+using particl method 1
+old guy afraid 1
+mzr hom1.htm 1
+osl th facult 1
+an group departm 1
+japan genomenet 1
+ge listdb mem 1
+mak html 1
+dartmouth colleg 1
+channel oper 1
+creat 20
+hypertext ba 1
+art and sc 1
+find that color 1
+sourc for old 1
+philotheou monast 1
+commun system 1
+interest and multifac 1
+dlg 2
+weigh with reason 1
+cornel hal 1
+de lart 1
+mak th number 1
+support for fil 1
+filter skelter 1
+brochur contact 1
+system for vertebr 1
+hectar townscap 1
+rl dd 1
+drink recip 1
+window is highlight 1
+jim lerch 1
+interfac in austr 1
+eastern 3
+thing stand 1
+norm held inf 1
+giu twent 1
+topograph of cosm 1
+browser support 1
+dn restrict 1
+transarc.com 1
+drug design 1
+undiscover he 1
+incr th var 1
+lou doth me 1
+keyword me tag 1
+whit pictur 1
+heart hav tak 1
+macintosh computer 1
+pr follow 1
+speed thrust 1
+snowboard magaz 1
+migr between count 1
+meselson 1
+credl 1
+thus leav 1
+browser to qu 1
+me nam keyword 1
+therin seemeth 1
+doc 3
+publ of syllabus 1
+dog 3
+popl mail list 1
+heat shock protein 1
+help in establ 1
+dol 1
+dom 2
+tim stumbl 1
+don 1
+bryn mawr review 1
+dor 1
+poyson 1
+gooner 1
+strasbourg 1
+doz 2
+creep 1
+olog 1
+displac is nic 1
+me compil 1
+hau off 1
+ppmtogif tran color 1
+opin ar gener 1
+joint assoc 1
+un grot 1
+newstead research project 1
+doubl weapon 1
+displac.3 1
+nec match 1
+serv using 1
+agent hand 1
+physiolog and plant 1
+pag direct 1
+intern www 1
+sp chick wing 1
+yield to tak 1
+molecl neurosc 1
+lausan switzerland 1
+dem tap 1
+cast ed libr 1
+distribut pattern captur 1
+fold classif 1
+docum in electron 1
+sign fil 1
+deep o buthan 1
+tim me mak 1
+struck master vinc 1
+biolog rest 1
+men doubt 1
+molecl and genet 1
+sixteen or eighteen 1
+dru 1
+tech new bulletin 1
+pennsylvan 2
+dry 1
+browser to us 1
+program o block 1
+ur ie irc 1
+ar crop research 1
+context of lif 1
+intreat 1
+hilit affil 1
+med bioph cel 1
+egyptolog resourc 1
+museum appl sc 1
+job opportun 1
+major histocompat complec 1
+loc fil attribut 1
+krobison nucleus.harvard.edu 2
+year project 1
+distribut pattern 1
+support featur 1
+sup th fifth 1
+mak a pair 1
+period wa incr 1
+instead 5
+saf to def 1
+refer mater 1
+cont rel 1
+lad marqu 1
+form it cur 1
+shock flat 1
+duk 2
+dun 1
+attempt to us 2
+server act report 1
+dur 2
+dut 1
+wif to pin 1
+mov datab browser 1
+louer to su 1
+mail equipm 1
+dynam growth 1
+program 29
+stud of modern 1
+model and design 1
+week cour 1
+ar for spec 1
+weapon of weight 1
+off hi enem 1
+lay th danger 1
+prov is mad 1
+requir 13
+giftran t ind 1
+articl in www 1
+interdep 1
+colleg of medicin 1
+leaf wh.com 2
+copyright restrict 1
+biom and bioph 1
+mechan degr 1
+bight 1
+cultur regr 1
+beginner snowboarder 1
+norw japan 1
+flesh 1
+mathemat div 1
+receiv dat 1
+aveir 2
+beach front 1
+quiver 1
+fair soph 1
+articl receiv 1
+datab protein 1
+olwm 1
+gopher at nwu.edu 1
+ba hamilt calcl 1
+langevin o crystal 1
+transcrib 1
+glassmaker 1
+fund prop 1
+suff of shtml 1
+energ 1
+init typ 1
+fast th handl 1
+skil with rap 1
+incr emph 1
+promot rider 1
+search o cel 1
+macallan 1
+credit 7
+tradtit 1
+antiqu dealer 1
+guil by wom 1
+amanc 1
+sack 1
+vieir break 1
+detail inform acc 1
+year by dick 1
+utrecht univer computer 1
+fenc onl.html 1
+showheader 1
+middl 6
+tim when palat 1
+common death 1
+someon.el 1
+le th warder 1
+compan biolog dat 1
+afraid to di 1
+anc leptiminus 1
+st sk assoc 1
+resort 3
+mi artif intellig 2
+shusaku 1
+select an act 1
+project at pomp 1
+cl list 1
+structur group zenec 1
+murder 1
+creat teach 1
+maintain with reason 1
+length wil common 1
+geomorpholog investig 1
+attempt to contribut 1
+rl rl 1
+weapon fal 1
+crept 1
+pr went 1
+howsoever 1
+ard ch 1
+ba on amber 1
+structur 9
+doct belief 1
+flow in complec 1
+marl ridg further 1
+purp circuit 1
+beat with oar 1
+ci world factbook 1
+interest in seeing 1
+season mult med 1
+spir theodor agnew 1
+tlm first intern 1
+technolog san francisc 1
+fa cup 1
+inform system spon 1
+seminar th main 1
+using novel numer 1
+fac so sw 1
+librar and inform 1
+support and inform 1
+sourc of textil 1
+not th differ 1
+avenu 1
+man o human 1
+mcgeorg 1
+br great 1
+part or indirect 1
+testimon on governm 1
+adviser 1
+amarn 1
+regl consol window 1
+ind valu 1
+allow without con 1
+schoolm 1
+tak th adv 1
+gopher refer 1
+mak and execut 1
+natur liv system 1
+deer th hau 1
+us th rad 1
+abl to conver 1
+crest 1
+co knav 1
+soc of north 1
+tucker 1
+act web pag 1
+forsak me oh 1
+finish th blow 1
+snowboard educ nick 1
+mous genom datab 1
+insight 2
+mcnult and badam 1
+biosc inform 1
+train facil 1
+jl prow 1
+said 4
+rgb tripl 2
+honor protect 1
+sail 1
+pharmaceut 1
+rap poniard 1
+highlight color 1
+catalog sequ 1
+implem html 1
+center pharm 1
+rel mush flec 1
+miscellan th st 1
+me o obtain 1
+non profit 1
+giv to birth 1
+gif87a fil ppmtogif 1
+macromolecl univer 1
+beatr read 1
+engineer and engineer 1
+link label 1
+un1.circ.gwu.edu 1
+appear with day 1
+siml and hypertext 1
+cancel digest listproc 1
+tandem 1
+organ in group 1
+www.du.edu jgilber chemhom.html 1
+field project 1
+form ba qu 1
+skil at singl 1
+rel heav 1
+sword both strik 1
+modl typ 1
+establ by prof 1
+minoan el establ 1
+teach of fenc 1
+gib us 1
+fich 1
+refer desk 1
+univer chemister 1
+fr to help 1
+wright laugh 1
+fict 2
+nejib 1
+known about minoan 1
+salk 1
+captur th mean 1
+lokr project 1
+salt 3
+defin correct 1
+modern genet 1
+ear 4
+eat 4
+us th rfc 1
+per been 1
+biom supercomput init 1
+perfect heal 1
+cyprus nem 1
+fsu aect confer 1
+omal 1
+biolog labor 1
+an of pol 1
+sandwich 1
+typ of technolog 1
+rap mak peac 1
+dem facil 1
+feel reminisc 1
+perfect good teach 1
+imag he court 1
+samw 1
+layer of habit 1
+alif iv 1
+cl stud departm 1
+maintain by paul 1
+pag harvard 1
+spring harbor labor 1
+cornel 3
+sand 1
+sk bus 1
+av enthusiast corner 1
+corner 8
+rang of malt 1
+ech 2
+lantiquit search 1
+bigun 1
+lou alexandr jl 1
+sant 7
+understand it agricultur 1
+cultur deposit 1
+check or credit 1
+using th gzip 1
+ecv 1
+chowder and minestr 1
+technolog writ 1
+fift 1
+utah winter 1
+pr by draw 1
+amazd 1
+edg 4
+genom datab 2
+badam com 1
+rel quest 1
+seekyng 1
+solut 8
+scot high 1
+aberystwyth o quantit 1
+edt 1
+extrem sick 1
+fund ra 1
+amazz 1
+len listn 1
+datab at moulon 1
+deeper cor schedl 1
+3.gif border 1
+med dev 1
+cold spring 1
+read th articl 1
+dist ind.edu 1
+microchemister 1
+standard and prop 1
+unfriendl 1
+look and work 1
+group doing computer 1
+sky digit shockwav 1
+link to web 1
+handl your discour 1
+car design 1
+eff 1
+scen and rider 1
+exagger posit 1
+chemister and biolog 1
+rag teeth 1
+proper topograph plan 1
+arch ind 1
+web server root 1
+dock 1
+think you maruel 1
+know which model 1
+doct 1
+stag of st 1
+furthest thing 1
+server act 1
+exchang of prestig 1
+postpon 1
+thought model 1
+phd program 1
+rid stanc 1
+misc leagu 1
+saru 1
+rigid mot 1
+siml and design 1
+denmark 1
+train issu 1
+dagger hand 1
+palac on st 1
+maintain by listserv 1
+vnkind 1
+tak th c.b 1
+skil as natur 1
+newsgroup network 1
+design in quark 1
+stud dellantichit 1
+work correct 1
+tak a look 1
+medicin th cyberm 1
+avail from u.s 1
+acknowledg 2
+craftsman 1
+dam o interdisciplin 1
+doen 1
+stanislaus 1
+westlaw 1
+manner of fight 1
+inclus spain 1
+ba of el 1
+sant sant 1
+author nam 1
+cancer therap 1
+bod is discover 1
+eic 1
+nam keyword cont 1
+html mod load 1
+dram publ 1
+resid unit 1
+ein 1
+psycholog soc 1
+pelopon 2
+bulfinch mytholog 1
+eit 1
+xv and chang 1
+film 6
+sauc 1
+mec intern union 1
+black whit pictur 1
+giu it hym 1
+proc of liquid 1
+system develop 1
+saul 1
+saur 1
+act appertain 1
+project at northwestern 1
+choler and evil 1
+off institut hol 1
+wight 1
+sw intern franc 1
+context of cart 1
+redistribut proc 1
+cour techn 1
+color match 1
+break a thrust 1
+center for sub 1
+secon iar 1
+ekg 1
+visu model 1
+appl metamorph 1
+geolog 3
+rijksdienst voor he 1
+v8w 3p6 1
+cajol th popl 1
+find 22
+fight therein 1
+techn detail 2
+chemister portland 1
+zenec lifesc 1
+reinforc th interdep 1
+search of multipl 1
+sc fenc 1
+ram ii 1
+sign to atl 1
+elg 1
+strength and narrow 1
+el to spyl 1
+fisherbiotech 1
+displac.star expl 1
+buch 1
+emerg on cr 1
+molecl evolut group 1
+cob traver 1
+took shap 1
+surfac collect 1
+pr known 1
+emb 1
+investig or new 1
+navig 4
+research fellow 1
+inorgan chemister soc 1
+level 10
+scotland 1
+imper 5
+eml 1
+budg 2
+cun ital fencer 1
+anc near east 1
+robot in uncertain 1
+chang ar detect 1
+centr par el 1
+reject if keyword 1
+sayd 1
+addr assoc 1
+snowboard sk deb 1
+west of romanou 1
+eng 10
+enh 3
+enj 7
+wisest 1
+log9406 int 1
+design departm 1
+ent 1
+perc of var 1
+env 1
+fl glad 1
+author langu 1
+imag of fanc 1
+biolog en biotechnolog 1
+mar wahl 1
+found at http 1
+fr of charg 1
+transpar an examplecompon 1
+fin fish inform 1
+bruer shal pay 1
+sem distribut autm 1
+car in foreign 1
+developm occur 1
+research interest 1
+hist period 1
+mous loc catalog 1
+sen me email 1
+buff 2
+output opt 1
+whensoever 1
+signif cooper 1
+le me scorn 1
+using th world 1
+postpon tempor 1
+deform articl model 1
+fought 1
+park cit 1
+mot estim 1
+dolt 1
+appl from do 1
+sect g protein 1
+wood cor 1
+decl and fal 1
+old woman 1
+chancd 1
+thom karl 1
+def a blow 1
+amber 2
+west and south 1
+hypermail attempt 1
+fish 8
+snow pictur gal 1
+chamber 1
+fist 1
+2d protein 1
+quiz sw jok 1
+proport spac 1
+perceiv th great 1
+levin 1
+govern elit 1
+hast th se 1
+elit eventu 1
+resourc ar gener 1
+soc secur 1
+exper th world 1
+popup menu 1
+gener web ind 1
+equ 6
+lat bronz 1
+st spac 1
+liter review 1
+us of speech 1
+beat by gard 1
+dont 1
+rocc mad 1
+inform acc count 1
+erd 1
+using microsoft 1
+prov prof 1
+right and intern 1
+var of surfac 1
+rac driver 1
+brazil 1
+read bent 1
+highbur peopl 1
+doom 1
+fium 1
+bryn mawr 1
+door 2
+wareh sal 1
+webmaster www flash.stanford.edu 1
+hm rever 1
+join law europ 1
+new and upcom 1
+ai faq 1
+suger fin 1
+multipl listserv 1
+district 1
+esp 3
+est 2
+serv and cour 1
+explor anc 1
+medief ren 1
+fl descript 1
+pract of weapon 1
+etc 14
+organ war 1
+script that perform 1
+eth 2
+popl yah featur 1
+mov inclus death 1
+se th chaunc 1
+rec.skiing.snowboard 2
+sen a mail 1
+taught th rap 1
+st of utah 1
+olog en franc 1
+affil of speech 1
+ms160 arch serv 1
+strateg of giv 1
+highlight of rec.skiing.snowboard 1
+hold thy hand 1
+good for snowboard 1
+conver th valu 1
+inclus th ecolog 1
+thierfor 1
+somer 1
+fighter 1
+eur 2
+bulk 1
+reg archaeolog 2
+ey view 1
+loc catalog 1
+inclus atcc catalogu 1
+alp sk 1
+lab j.w 1
+agricultur ba 2
+fr hutchinson cancer 1
+thereof a countr 1
+html resourc learn 4
+biochemister o biotechnolog 1
+surg lab 1
+system incorpor 1
+lin saying un 1
+why thing 1
+bump 1
+fa.mus.bel cant work 1
+respon 7
+univer o bioph 1
+tov ix.netcom.com 1
+tolk ba 1
+protein pattern 1
+univer of brit 1
+fo.com 1
+redistribut by univer 1
+stud hav acc 1
+bund 1
+uncertaint great 1
+cam again 1
+larg by manu 1
+sk map server 1
+mail fight 1
+metamorph tip 1
+datab 16
+roman hous 1
+part of eight 1
+exc 4
+proverb 1
+pretendyng th endyng 1
+boot hard snowboard 1
+interdisciplin crystallograph me 1
+comp.infosystem.announc search 1
+dat ar deriv 1
+period tabl 3
+sit at romanou 1
+molecl structur 1
+tim is lost 1
+gift exchang 1
+sequ massachus institut 1
+program in molecl 1
+back and for 1
+register of pot 2
+exp 7
+server or u.s 1
+workshop on transm 1
+doug 1
+ext 15
+ind for cl 1
+cook text 1
+ar to rid 1
+swifter back 1
+doun 1
+eberhardt say 1
+electron resourc 1
+output of getstat 1
+biomolecl engineer 1
+refer to styl 1
+win th half 1
+departm of chemister 1
+technolog dissem 1
+oper with soft 1
+pictur hist 1
+eyr 1
+greef he word 1
+aid biomolecl model 1
+european bioph soc 1
+teach young 1
+ch avail 1
+server harvard univer 1
+compreh sem autom 1
+individu farmer 1
+human pr 1
+cut asunder 1
+team then prepar 1
+emphasiz 1
+opt tel hypermail 1
+subscriber o conc 1
+post frequ 1
+model dynam 1
+list as listserv 1
+libr archiplec 1
+princip 1
+develop in partnership 1
+kynd 1
+geograph quiz 1
+dowl 1
+down 3
+hartl lab j.w 1
+lou lodgd 1
+morsemcfad hom pag 1
+aal posit 1
+magellan 1
+pointer to mediterranean 1
+grad a migrain 1
+terrain as sk 1
+talk archiv 1
+micromechan accelerometer inclus 1
+jefferson gerald 1
+problem bibliograph 1
+prov ext support 1
+burn 3
+datab of thousand 1
+moham motlib 1
+de puyloub 1
+risk and surviv 1
+teach englishm 1
+lou caus 1
+burt 1
+featur mi 1
+strong suggest 1
+ind to feder 1
+kyot 1
+nen model 1
+com int ec 1
+lawyer 2
+webtech html 1
+journ of archaeolog 1
+understand of settl 1
+univer of heidelberg 1
+protein cambridg 1
+ignor unimport 1
+impud 1
+abdom 1
+neolith sit 1
+me from dev 1
+rur domest econom 1
+speech and hear 1
+saint paul church 1
+sort of me 1
+pack in virtu 1
+good downright blow 1
+text is ship 1
+chairman of alp 1
+converter had troubl 1
+heart fellow 1
+american 1
+school affil hospit 1
+styl checker 2
+wir intern 1
+brydegrom 1
+search liszt 1
+josef bigun 1
+hurt in fight 1
+contain pointer 1
+virtu refer 1
+shap or manner 1
+fortif coast settl 1
+mcnult se snowboard 1
+heat shock 1
+vin vendor 1
+cach a non 1
+browser might try 1
+season river bed 1
+rb url search 1
+wil fl 1
+molecl biolog internet 1
+swam th salt 1
+tradenam 1
+triangl 1
+var in form 1
+lov th ital 1
+stat list 1
+wherein non undertak 1
+pharmac 1
+program of geoarchaeolog 1
+sl show pr 1
+transm aal 1
+ainter 1
+web writ 1
+ul and limerick 1
+mainland 2
+usag stat 1
+artifact rest 1
+limerick ireland 1
+marathopol therefor 1
+palat soc 1
+lindahl lindahl 1
+lyght lou 1
+pastym pl 1
+publ your light 1
+rel mush 1
+redeem for food 1
+annu review 1
+stand and watch 1
+leav a list 1
+rap point put 1
+barbecu pork 1
+juh k rn 1
+civil quit distinct 1
+nin foot 1
+usenet new 3
+metropolitan 2
+fresh microbrew beer 1
+biomolecl research tool 2
+want to talk 1
+fac 21
+fad 1
+interest plac 1
+gunner 1
+biolog en 1
+educ commun 1
+fak 1
+fal 8
+fam 7
+topograph 3
+fan 2
+faq 9
+far 2
+boot prov 1
+fat 2
+nlp system compon 1
+glad to hear 1
+isrec bioinformat group 1
+nmsu lingu 1
+hospit departm 1
+contain red 1
+florid st 2
+vaclav skal 1
+lil a collect 1
+histocompat 1
+protein medl sub 1
+corner at brooklyn 1
+construc quer 1
+fisiolog cel 1
+son had won 1
+want to particip 1
+medicin 8
+manager 4
+look good 2
+onion 1
+arriv 2
+canterbur 1
+soc ca 1
+hypertext encyclop 1
+selkov biochem metabol 1
+suit for compil 1
+maxim amount 1
+betim 1
+somewhat transpar 1
+leed univer 2
+anim behavior 1
+danc cheat sh 1
+result of slow 1
+sourc of dat 1
+allow th user 1
+edit dat 1
+encomp 1
+fl customer 1
+world usenet new 1
+work of william 1
+le no man 1
+project ment 1
+strang agu 1
+heav to keep 1
+marsh kirk 1
+receipt 1
+interest 24
+cl stud 2
+quest com 1
+martland 1
+meager resourc 1
+countr want 1
+search www 1
+northeastern 1
+specializ in sel 1
+rap and cloak 1
+bahauddin 1
+jam gulliver 1
+awar serv 2
+feb 4
+europ john do 1
+fed 1
+tim to work 1
+eu sun 1
+top lo rel 1
+pik def 1
+intrav 1
+us th sit 2
+fel 2
+martin karplus hbplus 1
+web liter 1
+help resort tak 1
+med biochemister server 1
+famil with numer 1
+regl ba 1
+list maintain 1
+mycoplasm mgdb 1
+chil verd 1
+san tom 1
+microbiolog o journ 1
+glaiv 1
+rap fight 1
+avail under fly 1
+mover in uncr 1
+catalog yal univer 1
+patroller hav st 1
+cup arseweb new 1
+centr 10
+research and improv 1
+mac ver screen 1
+absolut pur intent 1
+cour of design 1
+cour in term 1
+agricultur st 1
+hottest 1
+train deaf 1
+form electrotherm compon 1
+thank el friedland 1
+squeez film effect 1
+great in number 1
+ge together pick 1
+say th gent 1
+lo rel mater 1
+opt tel 1
+compar zoolog 1
+center for archaeolog 1
+try to displ 1
+upd december 1
+polymer 1
+migpol 1
+sid effect 1
+rap win 1
+perfect in fight 1
+york transit scen 1
+produc of metal 1
+word in length 1
+displ th imag 1
+31oct94 1
+plan to surv 1
+turn th border 1
+robot support 1
+appertain 1
+stat and dynam 1
+mbox hom john 1
+mainland greec 1
+grieu hym 1
+arrow 2
+ag port 1
+straightfor 1
+draft 3
+fic 3
+dan statistiqu de 1
+fil 27
+folder 1
+fin 19
+fir 2
+lif sc bioph 1
+fit 5
+plan geometer 1
+tlm softwar sign 1
+particl valu 1
+serv for protein 1
+mak it difficult 1
+chang that attitud 1
+off of educ 1
+program th compan 1
+sw cem pag 1
+grasp reg 1
+cem of chamber 1
+com enzym nomencl 1
+form ba acc 1
+neurosc 2
+ppmtogif 1
+network cybernet 1
+common be slain 1
+avail report 1
+gener com 1
+elizabethan fenc manu 1
+se in particl 1
+biolog 2nd 1
+list of publ 1
+cal giftool 1
+statistiqu de 1
+accept paper 1
+excav and stud 1
+sixteenth annu confer 1
+encour 4
+peter kollman 1
+tut veracruz 1
+tru displ brought 1
+erst siedlern 1
+avail vi ftp 1
+longer any visu 1
+trick for adob 1
+prev workshop 1
+ba leg cit 1
+chr beard 1
+norm men 1
+maintain th def 1
+epicentr technolog 1
+ga comput 1
+2dserv ge 1
+recent upgrad 1
+flu 1
+inclus territ 1
+gif87a fil gif89a 1
+fly 5
+checkm 1
+companion vol 1
+bioweb biotechnolog 1
+fmc 1
+pyramid 1
+overview 2
+world 3dpag 1
+remember to sen 1
+on ingratitud 1
+speech rel 1
+color for ted 1
+autom knowledg ba 1
+smooth and mak 1
+union o virgin 1
+herewiith 1
+pr of discr 1
+match being found 1
+thread ind 1
+bon edinburgh 1
+incr popl fam 1
+boost your hit 1
+rflp subtract 1
+st univer biotech 1
+goal and methodolog 1
+wherein most wom 1
+continu in danger 1
+emor univer molecl 1
+internet educ 1
+ca correl 1
+outdoor 1
+mcgoohan 1
+squ with separ 1
+prov good 1
+palat cultur 1
+tyf is work 1
+biolog sc 2
+equipm thought 1
+mach nam 1
+hm label label 1
+jud review 1
+foc 7
+chemister molecl design 1
+turn and return 1
+support my developm 1
+tool protein 1
+sil pag 1
+man whatsoever 1
+annu me 1
+for 10
+fox 1
+resolut men 1
+foz 1
+www.eit.com softwar hypermail 1
+admir featur 1
+buy an asymmeter 1
+earliest 3
+flut and guitar 1
+arch and contain 1
+origin of celt 1
+research roy 1
+border attribut 1
+separ ar 1
+dead peopl 1
+crystallograph 1
+bang my head 1
+cl mail arch 1
+loc rider 1
+uncertain ground 1
+apprec th freedom 1
+thin film bulletin 1
+386bsd 1
+archaeolog photograph larch 1
+hold strong 1
+pc run 1
+acr on wood 1
+autom assemb plan 1
+impr horizont extent 1
+biolog protocol 1
+writ new articl 1
+runnel reject 1
+absolut du 1
+watch folder featur 1
+palac appear 1
+c.elegan 1
+theor and archaeolog 1
+cr th fil 1
+interfac 8
+foldoc 1
+nightflight 1
+intron 1
+center for inherit 1
+soc sc 3
+point great 1
+mansoor 1
+inclus in ind 1
+guest 2
+sk deb 1
+gradu program 3
+forest univer 1
+soc st 1
+fsu 1
+minoan cultur develop 1
+hm defaultind typ 1
+artisan 1
+instruc technolog connect 1
+cod ba 1
+world largest 1
+encod th color 1
+law libr millesjg 1
+siphn and eastern 1
+going to le 1
+ftp 14
+lack of pract 1
+paper should sen 1
+mut datab 1
+pl support footb 1
+mater saf 2
+refer yeast 1
+man new project 1
+var of astroph 1
+fe being mov 1
+bronz ag sit 1
+respect th danger 1
+alumin 2
+fun 5
+speaker 3
+fur 1
+celt art 1
+faint 2
+grid wa establ 1
+view expr 1
+sous le 1
+wisconsin 4
+palac 3
+mailbox and writ 1
+mclink.it 1
+inform peopl 1
+tak th bryd 1
+palat 1
+eastern dendrochronolog 1
+organ and emerg 1
+scad 1
+vinc vo libr 1
+interfer 1
+evolut theor 1
+scal 8
+scan 3
+affair 1
+transport of good 1
+lowerc 1
+com captur 1
+pag cour 1
+mr mobil 1
+scientif 6
+bioph o comput 1
+sourc for medief 1
+qu consignm cloth 1
+opt inclus 2
+ant milit 1
+thesaurus indogermanisch 1
+organ risk 1
+ec html 1
+lowest 1
+fil is sav 1
+se th antikensammlung 1
+period 13
+year or thereabout 1
+hau forgot 1
+enthusiast corner 1
+head 9
+anc liter 1
+xpaint 1
+3.3a 1
+court and se 1
+heal 1
+drawn 3
+book gl 1
+hear 7
+libr orthodox 1
+heat 3
+comenius 1
+identif 5
+heav 4
+nosibork 1
+periph 2
+cus.html 1
+biochemister cambridg 1
+rst ai.mi.edu laurel 1
+pomp for project 1
+fraud for frendship 1
+pac to thrust 1
+gruber at gruber 1
+test ca 2
+12pt 1
+nc nih program 1
+command or request 1
+scen 2
+might prevail 1
+cover on gl 1
+going to se 1
+tag cr 1
+oil and gar 1
+refer desk colleg 1
+view imag 1
+fisiolog 1
+rel datab 1
+monit of road 1
+rap straight 1
+separ me 1
+geosim modl 1
+categor orient direct 1
+ack of me 1
+overtook 1
+neolith tim 1
+div stat div 1
+indeed 3
+perish 1
+resourc ha allow 1
+owner 2
+dec regard group 1
+poman ec.uv.ca 1
+therefor deceiv 1
+lou fl hart 1
+blount 4
+design eth zuerich 1
+heed 2
+se tw skil 1
+fl text 3
+heel 2
+nam keyword 1
+structur databank 1
+englishm or ital 1
+reindeer sant 1
+heer 1
+wherein th hand 1
+suff mic 1
+biodiver museum 1
+rodn brook 1
+nerd world 1
+jeronim pr went 1
+molecl design 1
+architectur 4
+facult 7
+cultur fact pecl 1
+serc daresbur 1
+ground truth 1
+pr act rol 1
+gener organ 1
+cup event 1
+forceth 1
+mi med 1
+dead etern 1
+good wif 1
+behavior 3
+kpt displac.gl spher 1
+shamr project 1
+protein pattern search 1
+displ a spirit 1
+good wiu 1
+old prouerb 1
+perfect good ward 1
+schutz 1
+complec and spec 1
+hal east 1
+for than back 1
+prestig good 1
+tick new 1
+vant and perfect 1
+telecommun institut univer 1
+find himself deceiv 1
+fr did le 1
+craft spec 1
+thewith 1
+model for macromolecl 1
+flash hom pag 1
+outcr 1
+co direct 1
+map dat subm 1
+contain th handl 1
+el skirb institut 1
+winter sport 1
+hand is ti 1
+sow pig 1
+wyl thank vs 1
+developm of trad 1
+mak wil requir 1
+sem distribut 1
+bod and slew 1
+gab 1
+season mult 1
+gad 1
+hither to teach 1
+paleolith mesolith transit 1
+object track 1
+temper 2
+stuff turk 1
+word of disgrac 1
+gag 1
+collect point 1
+separ se 1
+gal 11
+gam 7
+say heckler baccigalup 1
+tallah 1
+gap 2
+fear or discour 1
+gar 3
+gat 5
+larger lightspac 1
+gau 1
+gav 1
+gay 1
+structur ba drug 1
+serv for background 1
+outer 1
+ro isabel 1
+kevinh eit.com 1
+val men fight 1
+siml therm 1
+sol hypertext 1
+weapon of imperfect 1
+limerick limerick 1
+parabol 1
+joyc plester brommel 1
+offender or defender 1
+3.3a for sol 1
+dagger arm 1
+baccigalup 1
+lack of circumfer 1
+sort of cont 1
+gcg 2
+invok giftran 2
+pcx format 1
+sequ log bionet.molb.methd 1
+proceed of icec96 1
+held 6
+citadel itself suggest 1
+ind softwar 1
+foam inser 1
+recherch 1
+helm 1
+ontolog to eth 1
+help 18
+hartl lab 1
+remembr 1
+daunc 1
+me is receiv 1
+archieplec arosnet 1
+tar addtyp 1
+gdb 1
+seqnet 1
+inform scient 1
+scop 4
+sound lik match 1
+scor 2
+scot 5
+tim to respon 1
+fil format 1
+wish to us 1
+spur hi cut 1
+manufacturer molecl 1
+www ba inform 1
+gel 2
+text corpus project 1
+post gradu 1
+st on cr 1
+gen 2
+cod tr 1
+henc 2
+geu 1
+indent 1
+gerald joyc 1
+biolog onl 1
+hau bought 1
+cloth surviv 1
+remark var 1
+henr 4
+www.transarc.com af transarc.com 1
+va technolog inc 1
+museum vliegclub 1
+park structur 1
+micr brew 2
+vnder my fat 1
+sardin 3
+virgin island 1
+half ring 1
+nassau 1
+browser o molecl 1
+laboratoir 1
+show that cultur 1
+outstand 1
+whitehead 1
+chem fin 1
+point worth know 1
+quarkxpr 1
+week then sen 1
+list in cl 1
+cry so big 1
+fil creat 1
+project corpor 1
+rest assur 1
+claus miscellan 1
+know that peopl 1
+biolog corpor 1
+underground snowboard med 1
+ge elaw 1
+der bundesrepublik 1
+church of egypt 1
+erlang nuremberg 1
+new group upd 1
+collect a list 1
+genhelp 1
+mak dec 1
+ar supporter 1
+addr of canad 1
+execut for do 1
+grasp plan 1
+snowboard shop 1
+pr own wom 1
+research genob server 1
+particl list mailb 1
+ak ment overdr 1
+3.3a for sun 1
+gib 1
+gif 3
+sampl of surfac 1
+umich 1
+gig 1
+leg cit 1
+program lik manner 1
+merin 1
+aal resolut 1
+perfect good weapon 1
+gil 2
+pag collect 1
+adr mandarin 1
+tallin 2
+giu 1
+giv 17
+gn me 1
+brennius sack 1
+primer on molecl 1
+much 1
+prototyp 3
+faq ind 1
+hannegan menu 1
+ro joyc 1
+combin electr 1
+ag sit 1
+mycobacter mycdb 1
+am www link 1
+kitch crew 1
+molg internet commun 1
+context trop 1
+imag shown 1
+abstract describ 1
+tempor 1
+wherein ther li 1
+jok molecl biolog 1
+bin gon 1
+rid it perpendicl 1
+text encod init 1
+fil var 1
+impl of biotechnolog 1
+axl culin road 1
+s.lintz et s.tognot 1
+internet user 1
+md sk map 1
+misc tabl 1
+sheep 1
+hair look 1
+archaeolog field 1
+lot of intellectu 1
+weapon soever 1
+pc ver screen 1
+sun workst 2
+amanc dsilv 1
+abund mater 1
+hypermail bin 1
+specif a cg 1
+dancer and teach 1
+onl publ cur 1
+docum le 1
+wh.com 4
+monastir 1
+web digit 1
+emb of microwav 1
+highest scor sit 1
+reason or caus 1
+corpor 7
+sacram 1
+centr addr 1
+particl favor spec 1
+sequ structur an 1
+sheft 1
+quiz program 1
+cur thread 1
+un do ver 1
+minneapol 1
+gmt 3
+cupid hi strook 1
+list from individu 1
+bath wh construc 1
+tung nan junior 1
+cup shap 1
+st approach 1
+accord to sw 1
+cr be prev 1
+reject sampl 1
+sc de lantiquit 1
+pran nath 1
+horizont 3
+strong 8
+onl gal featur 1
+i.2 1
+cal langu technolog 1
+upstream flyf invit 1
+alt research center 1
+prov evid 1
+shaffst 1
+grav center 2
+download by plac 1
+sampl multidim sign 1
+contractil 1
+sund morn 1
+search yah 1
+gob 1
+archaeolog research project 1
+god 3
+mak our commun 1
+sit under construc 1
+palac of diocl 1
+hardwar and softwar 1
+strook 1
+identif further 1
+organ risk as 1
+gon 1
+rigel.oac.uc.edu 1
+gor 1
+fil ver 1
+interview on tvontar 1
+got 6
+htmlguru imag tran 1
+lin primer 1
+feed surplus 1
+i.e 3
+mzr kongr2.htm 1
+quibu 1
+ridg further 1
+imagetool softwar 1
+vi stag 1
+nat educ inform 1
+sequ of protein 1
+ind to multim 1
+map entr 2
+html cg etc 1
+romanesqu 1
+quick 8
+church 3
+cyberm 1
+research u.s 1
+saf and go 1
+stud collabor program 1
+de tud anc 1
+i18 1
+cop listproc 1
+i19 1
+attach 1
+attack 3
+jam mil saint 1
+grc 1
+irish manuscript project 1
+szostak lab 1
+approach and method 1
+major settl 1
+diotim 1
+subsect and individu 1
+lay waight 1
+i20 1
+chapel 1
+ctil forthcom 1
+oklahom o health 1
+aegean wh rainf 1
+term of wealth 1
+server com 1
+stud shop 1
+corpus 1
+digit imag commun 1
+virgin commonwealth univ 1
+refer th sit 1
+self organ 1
+mult 4
+caesar excav 1
+4.x execut 1
+el fail 1
+libr de 1
+biochem reag 1
+biom www sit 1
+tecf hom pag 1
+sk resort manag 1
+veg chang 1
+le th server 1
+disprov 1
+sub ba 1
+artifact 2
+le stud 1
+portug archieplec 1
+mund 1
+cach is byp 1
+cheaper 1
+immort 1
+improv th serv 1
+sect inclus 1
+taylor peter tod 1
+neuer be 1
+evolut group lif 1
+masthead 1
+vi explan 1
+soil sc 1
+latest 10
+newspaper subscript off 1
+guy 2
+bottom 5
+half th resort 1
+metabol channel neur 1
+week speaker 1
+loc shop 1
+iar th bask 1
+pr uncr 1
+research sum 1
+nobl compl 1
+ar pot 1
+object orient 1
+discern th proof 1
+sc and technolog 1
+nat intern 1
+sword to strik 1
+morsemcfad client 1
+spec in agricultur 1
+lif self 1
+biotech month bibliograph 1
+med bioph 1
+ext foot 1
+cytoskel protein datab 1
+julius silverman 1
+arboretum 1
+fair lad neuer 1
+un listproc 1
+docum dict 1
+attain 1
+isaac 2
+word defin 1
+tim hurl 1
+utah avalanch forecast 1
+largest weber 1
+direct and eng 1
+contest organ vehem 1
+molecl biolog unabom 1
+var string 1
+ind that metalwork 1
+board ten 1
+mark 94rock.com 1
+http server 1
+musc 6
+air stat 1
+me header 1
+mush 2
+congr on biom 1
+suppl of biochem 1
+redistribut chief emerg 1
+ben seen 1
+elendormush hom pag 1
+pag cour techn 1
+vatican 1
+w3 hom pag 1
+afr archieplec 1
+hundr squar 1
+recover th maxim 1
+magaz ea 1
+fac or head 1
+hybrid 1
+pozzuol 1
+xx conv 1
+nic tip 1
+handl lat command 1
+hyperflow wil remain 1
+cr and minoan 1
+pearc 1
+configur opt 1
+pearl 1
+fish inform serv 1
+mar soil 1
+academ 6
+find irish web 1
+rassegn del ri 1
+manu pag 1
+lot th resort 1
+crowther 1
+research cs research 1
+expect that sift 1
+cor commun ltd 1
+point great endanger 1
+catalogu of electron 1
+cyril 2
+northern 3
+reproduc computer 1
+an of sit 1
+var pol 1
+accur and detail 1
+avalanch forecast 1
+mak th background 1
+act crystallograph sect 1
+mean to do 1
+might 1
+appar nucleat 1
+lik to find 1
+maryland o biochemister 1
+therefor within dist 1
+lpr pag 1
+explan 3
+html fil arch 1
+tract surv 1
+vict ancest 1
+off in arp 1
+preview human 1
+manner of teach 1
+jl collect 1
+trick and tip 1
+eurod 1
+13th 1
+anc olymp 1
+refus to displ 1
+rough 4
+archaeolog suppl 1
+isoelectr 1
+europ 9
+symbol ar defin 1
+brookhav nat labor 1
+langu proc system 1
+hair look nic 1
+speed to depart 1
+cl th gad 1
+cit ba med 1
+european research group 1
+flag 1
+distribut of settl 1
+structur id chain 1
+chronolog and lump 1
+transworldsnowboard 1
+flam 2
+refer html docum 1
+def th truth 1
+sen their men 1
+relihan 1
+j.r.r tolk 1
+sc techn report 1
+combin th vect 1
+flat 3
+plain told 1
+david 12
+compon wil accept 1
+major magaz 1
+ba and discr 1
+review which giv 1
+produc wool 1
+predomin in coast 1
+mod inclus dc 1
+wid to answer 1
+wouldest 1
+coast loc 1
+lower level 1
+softwar pack 2
+rec crit 1
+typ of rid 1
+arrang in desc 1
+rad list 1
+year writ 1
+archiv a http 1
+def back 1
+peopl by sen 1
+guest book gl 1
+giftool handl transpar 1
+pig had bin 1
+misc tabl hist 1
+interview of sant 1
+support slart.ucd.ie 1
+attribut 3
+list of imag 3
+vist turn 1
+woman perceiv 1
+hag 1
+hal 5
+han 2
+magnetometer prospect 1
+list list 1
+mesar 1
+hap 9
+har 2
+fl cur 1
+hat 3
+plant cover 1
+hau 1
+hav 1
+eb yah sc 1
+search in south 1
+libr sf 1
+help them ge 1
+opac 1
+inform gatew 2
+health sc 2
+wheel stand 1
+surfac artifact 1
+dominican 1
+john euangelift 1
+artif 5
+giv by battl 1
+method of field 1
+flec 4
+internet anc 1
+virgin o biotech 1
+crashm 1
+displac.gl 1
+david wellst 1
+glob on lin 1
+init we want 1
+iv mi artif 1
+teach th nobl 1
+amer 95th 1
+surpr to mcnult 1
+paint program 1
+lou no longer 1
+susan alcock 1
+textphon 1
+attempt to read 1
+perfect cr 1
+tradit tun 1
+supper 1
+1000th transpl 1
+surv th newstead 1
+richard sutcliff dept 1
+individu recip 1
+litter 1
+rensselaer 1
+univer biocenter 1
+cl arch good 1
+drag 1
+receiv 3
+head er il 1
+dram 2
+fin year project 1
+writ no mer 1
+read it input 1
+marburg.de mzr kongr2.htm 1
+draw 6
+hec 1
+biochemister operon technolog 1
+heath is build 1
+ba refer submitter 1
+lord ferrer 1
+hel 4
+pbm list 1
+hen 2
+taylor peter 1
+mak it good 1
+intensif 1
+mor pik def 1
+nord sbh nord 1
+hew 1
+hey 1
+perfect ey 1
+katholiek universiteit 1
+deb st part 1
+empir la 1
+sid cut 1
+jam mil head 1
+listproc host 1
+imbrac 1
+undon in du 1
+computer system 1
+oper 14
+passeth 1
+aegean civil 1
+start inclus 1
+liv quest 1
+govern produc 1
+help put 1
+enthusiast 2
+shockwav for direct 1
+qu glob 1
+ey therefor deceiv 1
+saf dat sh 2
+be ver 1
+protein isoelectr point 1
+mechan engineer 2
+var of fin 1
+statistiqu de langu 1
+biolog r.i 1
+larch olog sous 1
+just hous 1
+miscellan link 1
+palac wa construc 1
+miscellan bi internet 1
+mi docum 1
+bewail ev poor 1
+shown as link 1
+prev pract 1
+refer your pag 1
+gener approach 1
+broad fam ba 1
+gentlem to sit 1
+sixteen 1
+hahneman 1
+form of stand 1
+autm spec glob 1
+item displ 1
+econom spec 1
+melbourn o tut 1
+sk complain 1
+lab o gradu 2
+drew 2
+stand saf 1
+prim rib 1
+hid 4
+conclus 4
+bsd articl 1
+sequ datab prosit 1
+hik 1
+hil 4
+recent 9
+rap or singl 1
+prov a fil 1
+hir 1
+hit 6
+amount of sid 1
+gustav imsd.meb.un bon.de 1
+view th agr 1
+continu th truth 1
+cd rom 2
+opin 4
+beaut older build 1
+cur avail 1
+departm of microbiolog 1
+man le fly 1
+on.letter 1
+reason th mak 1
+sun 4.x execut 1
+resourc map 1
+manner 4
+net found 1
+soc for experim 1
+opportun 5
+order of articl 1
+foot to uncr 1
+web stroller find 1
+plac nor tim 1
+explor 6
+laugh a good 1
+research commun 1
+proceed and camer 1
+offer produc 1
+modest siz 1
+recept 1
+pebbl 1
+acquir geometer inform 1
+feed a fam 1
+ey is deceiv 1
+pol con 1
+strang com 1
+pol cor 1
+radiolog resourc 1
+var from deposit 1
+mac softwar 1
+biochemister coursenot univer 1
+review of ar 1
+strateg 4
+articl on technolog 1
+mat sk 1
+val noblem 1
+perform art 1
+limpr 1
+cornel law 1
+lou for lou 1
+pag abstract describ 1
+dril 1
+therefor in respect 1
+descript me 1
+said vinc 1
+confer about neur 1
+drit 1
+flor 2
+map server 3
+driv 3
+recip of al 1
+flow 1
+manuscript project datab 1
+crick 1
+port town 1
+loc sign 1
+soc of mm 1
+cour techn inform 1
+arrang th result 1
+inform contain 1
+dat arch 1
+typ separ 1
+laurel simmon 1
+giv th program 1
+kim silvon 1
+screen imag 1
+med school 2
+molecl biolog network 1
+plainer understand 1
+email kevin 1
+fl dan 1
+stud departm 1
+exampl for tak 1
+job of promot 1
+read a4 1
+earliest ph 1
+tom jam group 1
+checker 2
+consider my payn 1
+command to cr 1
+song interact using 1
+commun using technolog 1
+thr scarc 1
+anderson 1
+artif intellig lab 1
+hog 2
+usenet group 1
+hol 7
+instr ther 1
+hom 2
+hon 2
+excel fin paper 1
+hop 13
+hor 3
+hot 7
+hou 1
+isc95 1
+how 1
+descript pa 1
+sk fam 1
+governor 1
+internet connect 1
+paradox of def 1
+cytogenet lawr livermor 1
+hpc 2
+j.d 1
+stratif 2
+j.l 1
+eu research 1
+roadtrip with tod 1
+kingdom 2
+overmatch 1
+using novel 1
+oscar michael 1
+j.w 1
+imag proc 3
+dat and softwar 1
+pag automat 1
+neolith 2
+univer cognit psycholog 1
+combat 1
+middlem 1
+attempt 8
+snowboard equipm 1
+western mesar 1
+extrem scarc 1
+oppr 1
+recent issu 1
+shewyng 1
+compl opposit 1
+cover th eastern 1
+arch good collect 1
+tut and stud 1
+lahdenper 1
+polit leader 1
+datab of www 1
+prof arm 1
+protein structur id 1
+flyf invit 1
+akkad 1
+presid of morsemcfad 1
+bus mor fun 1
+ba color 1
+arabidop 1
+copper and gold 1
+smart museum 1
+cg mail program 1
+guard fight 1
+biolog labor univer 1
+de quim 1
+landhold 1
+good for aft 1
+docum typ entr 1
+build contool 1
+lament wound 1
+mm cr 1
+univer hospit 1
+excav to recover 1
+inclus th acc 1
+drom 1
+gradu stud 1
+warwick lan 1
+drop 3
+wh you eat 1
+flut 1
+death thereb ensu 1
+bod be dev 1
+danc cheat 1
+biolog softwar direct 1
+hsc 1
+perfect se 1
+genealog 2
+malcolm 1
+inclus docum 1
+broad 6
+direct and fil 1
+modern cor 1
+danger to mak 1
+hsu 1
+ultrasound 1
+designer 3
+salisbur dexter 1
+ftp to lawlib.slu.edu 1
+fil and augm 1
+mornixuur 1
+brisk exchang 1
+imbroc 1
+archieplec at aveir 1
+hap to pr 1
+tak a period 1
+user qu 1
+fencer their credit 1
+intern popl 1
+el youl learn 1
+great expan 1
+pattern in southwestern 1
+unbrok 1
+major hel 1
+utter 1
+cour of int 1
+nick badam 1
+electrotherm circuit 1
+hug 4
+sourc distribut 1
+help chang sk 1
+mak their bel 1
+list o obtain 1
+cognit psycholog research 1
+hum 1
+hur 1
+grant form 1
+dynam shap segm 1
+weapon to break 1
+reag sup compn 1
+start and en 3
+fight by reason 1
+user se 1
+jack 2
+alt tag 1
+bus rensselaer 1
+annu review inc 1
+jact 1
+incr popl 1
+leon shenandoah 1
+inclus alt tag 1
+genquest 1
+flyb 1
+datab arizon 1
+flyf 1
+myn on 1
+custom replac 1
+jpg addtyp appl 1
+crystallograph o act 1
+search multipl web 1
+def most perfect 1
+cal vin 1
+cod for un 1
+astroph 1
+seal 1
+subscrib elaw 1
+seam 1
+separ and mak 1
+purp nonlin circuit 1
+andrew macelhon 1
+unexcav build 1
+feder institut 1
+shown he sit 1
+seat 2
+seau 1
+fic my fanc 1
+field surv 1
+histoir du lazar 1
+giv surplus grain 1
+listnam 1
+nuclear loc sign 1
+found at leptiminus 1
+for aft stiff 1
+dist or perfect 1
+com to loc 1
+adver inclus log 1
+silicon graph 1
+mm ib 1
+london o departm 1
+altogether unacquaint 1
+unif cs 1
+adapt 2
+surmount 1
+prof soil 1
+drug 3
+combin 4
+cod nmsu 1
+oliv and vin 1
+assoc for pattern 1
+concer in osl 1
+sol model 1
+year in pag 1
+text archiv 1
+introduc off 1
+hom2.htm german list 1
+tuscan archaeolog 1
+hyd 1
+chemister net 1
+ie pam 1
+secr 3
+fr dem facil 1
+biochem ric univer 1
+pandk 1
+hym 1
+problem increm 1
+div mechan 2
+sect 18
+hyp 1
+reservoir model 1
+tart orang 1
+conc subscriber 1
+modif a number 1
+prof rod grup 1
+appropr docum 1
+go to law 1
+organ th inform 1
+men fear 1
+electrophor datab 1
+heinlein faq 1
+kept in view 1
+con in fight 1
+veijol 2
+off acc point 1
+canad de tud 1
+oct number 1
+umd.ac.uk or us 1
+resourc inform center 1
+panel 2
+part i ii 1
+conver system 1
+biomolecl 4
+delan hair look 1
+look sit stand 1
+us th trick 1
+feedback 4
+microstructur 1
+seek 3
+biolog group 1
+seem 4
+rec listproc 1
+seen 5
+closer inspect rev 1
+reg inclus 1
+hubbl 1
+eabu420 1
+major developm 1
+bi inorgan 1
+ren danc 1
+owner john baccigalup 1
+addtyp 2
+displac.schizophr 1
+openbsd 1
+featur nick 1
+through friendship 1
+read me 1
+purp circuit siml 1
+johan 1
+bewar 2
+dryd 1
+tech.mi.edu 2
+lak tah 1
+mail molecl 1
+telegrambyr a collect 1
+segm 1
+developm of soc 1
+html.html 1
+hostnam 2
+contain grav 1
+sil roy 1
+architectur ensembl 1
+eloqu 1
+h1773950000 1
+hierarch organ subject 1
+cal th pr 1
+acronym and frequ 1
+museum publ 1
+proc imag 2
+menczer 1
+me at squaw 1
+del in ge 1
+identif resourc do 1
+cal giftran 1
+strong hold opinion 1
+render 2
+14th 1
+hold opinion 1
+inclus th bryn 1
+aegean preh put 1
+curricl resourc program 1
+start to giv 1
+decomposit 1
+technolog and rel 1
+exact what badam 1
+structur and funct 1
+pretendyng 1
+macintosh system 1
+transm dat 1
+wa datab 1
+articl entr 1
+openbsd hav mov 1
+interview 5
+sant seek 1
+gender th anc 1
+hypertext converter inst 1
+review of vg 1
+lan de test 1
+collect computer lab 1
+dram chang 1
+institut pasteur 1
+compan tim 1
+biolog sequ an 1
+command to us 1
+bronz 3
+us is cur 1
+janu 3
+datab cont 1
+think it nec 1
+particip object 1
+exchang opin 1
+hap doeth hop 1
+structur and dynam 1
+electrotherm mesf 1
+develop inform 1
+brook 1
+groff html sc 1
+broom 1
+wid transect 1
+leptiminus ar character 1
+self 6
+educ inform 1
+init univer 1
+sub agricultur ba 1
+observ 3
+effect if showhtml 1
+metal 4
+read se 1
+understand color 1
+pasteur en 1
+usr loc http 1
+ian 2
+creat by patrick 1
+mind of man 1
+metar 1
+educ comput 1
+tewdwr mo 1
+liner 1
+technolog in educ 1
+torib merin 1
+sc fict 1
+iar 1
+peer review 2
+program in bioph 2
+gilber group 1
+physiolog woolf 1
+evid for human 1
+request 11
+law libr 3
+defin he lif 1
+determin it ind 2
+pag is reject 1
+ppmtogif tran cfcfcf 1
+reinforc 1
+cit chanc 1
+northern californ 1
+dynam shap 1
+want to count 1
+correl 1
+paradox 1
+serv of biotechniqu 1
+electr and therm 1
+linux freewar program 1
+genet institut 1
+preserv or def 1
+lik dat 1
+sent 10
+lingu 3
+ict 1
+upright 1
+pomp for 1
+inclus danc 1
+object workshop program 1
+as leg 1
+vincit 1
+lynd car 1
+blu to hexadecim 1
+salvador kitch 1
+gopher server run 1
+repaint 1
+pertain 1
+organ individu 1
+eloqu observ 1
+patrim of tun 1
+foot is incomp 1
+film and surfac 1
+axl culin 1
+childr to us 1
+common word 1
+minoan period 1
+mater to shar 1
+hypermail ar avail 1
+richard gabriel wor 1
+hypermail overwrit 1
+minim calf support 1
+anc it 1
+appl oct 1
+start point 2
+biolog train 1
+plant molecl 1
+sept 1
+meter 1
+genom subtract 1
+com continu 1
+gaffn 1
+cant is nil 1
+maintain an internet 1
+weak unserv 1
+settl lik phylakop 1
+engineer and wright 1
+approach is unwar 1
+correspon 3
+sequ 6
+mayb th liner 1
+upd th archiv 1
+biolog dat transport 1
+entr point 1
+level of zon 1
+gener refer text 1
+oxford univer 2
+instituut voor moleculair 1
+an in dc 1
+serc 1
+serg 1
+kitch 2
+ind of www 2
+www.du.edu jgilber 1
+serp 1
+inv ar norm 1
+volubil 1
+xm card 1
+seru 1
+anc environm 1
+serv 38
+list admin 2
+hast doeth hy 1
+field to try 1
+count on heav 1
+wellst is work 1
+chang thing 1
+fil o retrief 1
+war and plac 1
+appl tart orang 1
+export went 1
+reag protein 1
+maintain th gal 1
+men ar join 1
+suit shuld 1
+build in downtown 1
+high educ september 1
+brown 2
+lou univer 2
+pubweb.parc.xerox.com 1
+arm cut 1
+bus using map 1
+adver wil go 1
+jerich 1
+contact jim lerch 1
+serv aal resolut 1
+gain sk 1
+soc univer 1
+fact pecl 1
+centr of excel 1
+archieplec at imper 1
+inclus th vicin 1
+latest docum 1
+reflect 2
+pa in articl 1
+15jl92 1
+reason which mov 1
+sit near crot 1
+build wh agricultur 1
+truth to light 1
+amount of tim 1
+rapid dissem 1
+wherewith 1
+strehlow 1
+bauderyck 1
+com to mak 1
+falch 1
+wylliam 1
+docum for developer 1
+eastern deser 1
+par al docum 1
+predomin nucleat pattern 1
+broyl 1
+lesl bout 1
+crystallograph biolog 1
+fin prototyp 1
+excav of sebast 1
+se about cover 1
+year old chairman 1
+me th number 1
+intron datab columb 1
+nottingham 3
+tak a cour 1
+sunnyv town 1
+institut bioinformat 1
+funct 10
+inherit in man 1
+lsboard 1
+misplac 1
+road traff project 1
+blackfr 1
+mesolith and fin 1
+brief interest 1
+larg open agricultur 1
+desk colleg 1
+attain of good 1
+popl robot 1
+ilm 1
+delan 1
+de la francophon 1
+irish manuscript 1
+ar peopl 1
+favor stoddard 1
+thank 10
+hid markov model 1
+econom archaeolog 1
+lou bearyng 1
+dynam 5
+img 1
+zeus 3d 1
+funer 1
+edit indep sourc 1
+funet 1
+cg bin 1
+dialogu 1
+imp 3
+confer futur html 1
+homolk 3
+sorrowfl tear 1
+seminar on peopl 1
+le tw li 1
+law john 1
+an plan 1
+inc 4
+dol sk train 1
+electron bulletin 1
+ind 24
+sl wil bring 1
+inf 14
+ing 1
+ink 2
+lingu resourc 1
+inl 1
+demonstr hav brought 1
+espec in serv 1
+inr 1
+int 11
+good resourc 1
+inv 1
+fac and bod 1
+color valu 2
+invent using 1
+pract in perfect 1
+court of scot 1
+compil pag 1
+mail addr 2
+var rad 1
+ec fil 1
+departm of stanford 1
+educ technolog 1
+univ.of 1
+addr o obtain 1
+iop 1
+agricultur libr 1
+url to hyperlink 1
+iot 1
+us bad 1
+world largest weber 1
+accuml of wealth 1
+ioy 1
+biolog biotech 1
+san dieg 2
+caus bigger 1
+fishyng with fren 1
+ipg 2
+iph 1
+gener search ind 1
+rap poniard fight 1
+internet direct 1
+apol apol.co.uk 1
+requir to ge 1
+ipn 1
+jam odonnel 1
+industr commod 1
+rudjev boskov institut 1
+anim gilber lab 1
+gopher mailb.ac.uk 1
+univer of saskatchewan 1
+slart.ucd.ie 1
+snowboard can carv 1
+sit specl fict 1
+limb liv 1
+fr to dupl 1
+list yah robban 1
+liturg 1
+print a book 1
+failur wil produc 1
+break hi duck 1
+research begun 1
+1920s 1
+web peopl peopl.html 1
+cr perl 1
+london 7
+drdoc 1
+biocenter th franklin 1
+relev link 1
+delft 2
+linux 2
+man th vant 1
+method and theor 1
+tim nor plac 1
+renault 1
+irc 2
+electron xm 1
+bi orient gopher 1
+act or tim 1
+taught to danc 1
+seqnet univer 1
+natur mould 1
+rad sc 1
+irv 2
+ag northern spain 1
+rst ai.mi.edu 1
+thing to rid 1
+mailser cmd 1
+isf 1
+6x86 p150 1
+try to chang 1
+resolut th stand 1
+genquest sequ 1
+travel writer 1
+wrong 4
+put them anywh 1
+ist 1
+grid squar 1
+sword dagger stanc 1
+stromberg 1
+tempestu 1
+redeem ev tim 1
+def wa publ 1
+molecl plant 1
+lin direct 1
+utah o netbiochem 1
+knav in england 1
+provinc 2
+se ar read 1
+ceram 3
+comput lingu etc 1
+www.inesc.pt confer 1
+deliv 2
+wouldest hau 1
+annu lab sum 1
+greek world 2
+cloth compan 1
+feb94 1
+agent edit monit 1
+chang to specif 1
+nen equiv circuit 1
+roman north afr 1
+rap continu 1
+chang in settl 1
+httpd ver 1
+med center 2
+support descript 1
+plac appoint 1
+rel to airpsac 1
+commerc or ba 1
+comput and stud 1
+mean th lesser 1
+vo or fac 1
+equipm 5
+compr standard 1
+inestim benefit 1
+net person homep 1
+orang 1
+char reg 1
+colormap 1
+introduc earliest 1
+project geosim softwar 1
+contain imag 1
+weapon by reason 1
+hahneman univer multim 1
+thousand of docum 1
+hpc articl arch 1
+me o rec 1
+appropr entr 1
+gag o spiderdust 1
+campaign we plan 1
+deceiv th ey 1
+arch project archaeolog 1
+brachydan 1
+byoc 1
+centr offer 1
+sc centr san 1
+protein dat 2
+point is kept 1
+complec 7
+big quest 1
+act accord 1
+clear show 1
+exper grow pain 1
+transport 4
+maud warburt 1
+slop with thinner 1
+fair lad 1
+academ educ comput 1
+count ar increm 1
+lagoon 1
+departm of electr 2
+tran an 1
+say neal korn 1
+research visit inform 1
+imag guid surg 1
+chemister and bioinformat 1
+institut and academ 1
+fencer that cam 1
+accord to common 1
+til from workshop 1
+roswel 1
+unspeak honor 1
+combin caesar excav 1
+bright 2
+vanil x server 1
+straight upright 1
+multim med biochemister 1
+say th art 1
+model theor 1
+cl collect 1
+avalanch forecast center 1
+webwork 3
+whensoever any blow 1
+soc could hop 1
+server exp 1
+adv in fight 1
+dril turnt bind 1
+hol mat serv 1
+eb european 1
+program californ 1
+railsl 1
+accuml quit rapid 1
+hard escap 1
+northwest fish sc 1
+ver of digit 1
+river bed 1
+ec between lat 1
+nicom 1
+center for computer 2
+byzac 1
+manu maintain ind 1
+universidad de aveir 1
+us of os 1
+stev hick 1
+roman law 1
+du to insuff 1
+brow our pag 1
+abhor 1
+hypermail to attempt 1
+introduc geograph cour 1
+project www server 1
+reserv read 1
+part par 1
+relev to educ 1
+roman world 1
+customer hav re 1
+fast ti 1
+car he fun 1
+if.ui.no to becom 1
+gif87a format 1
+herod harbor 1
+archaeolog record 1
+manufacturer molecl prob 1
+rec cop 1
+boot bind interfac 1
+humbl begin 1
+branigan 1
+15th 1
+better 1
+curv spac 1
+philolog clem canon 1
+macromolecl crystal pack 1
+sw feder 1
+ultim internet 1
+dist you break 1
+produc in antiqu 1
+old world antiqu 1
+fin support 1
+thrust to strik 1
+plac hom pag 2
+funct of cytok 1
+turk hom pag 1
+detach 1
+hopkin univer school 1
+credit card 1
+com doc 1
+loc resid 1
+anc olymp gam 1
+vnt he houseband 1
+surv and grid 1
+produc th tech 1
+color light 1
+segm non 1
+doeth retir 1
+chartl 1
+meant a cooper 1
+through 1
+palynolog an 1
+us when conver 1
+nanoprob incorpor 1
+promot th posit 1
+mov star 1
+orchestr work 1
+key aal recom 1
+jad 1
+jah 1
+jam 6
+jan 4
+vom to keep 1
+avail by anonym 1
+fil contain form 1
+law lib 1
+jar 1
+keep hi point 1
+pc ver 2
+parameter extract procedur 1
+jav 1
+und sprachmater 1
+jaw 1
+ibmpc window 1
+signif scal 1
+jay 1
+cytok 1
+wid web internet 1
+us th gif89a 1
+sword in school 1
+tuneinir 1
+oran 1
+amount of food 1
+earth 4
+doubl check 1
+therefor earliest 1
+therefor not int 1
+ridg further inland 1
+goteburg 1
+imperfect work 1
+gentlem slain 1
+mak hypermail 1
+dellantichit cl 1
+giftopnm gif87a fil 1
+hypermail recogniz 1
+interview with badam 1
+hous in warwick 1
+soc t canad 1
+robot which displ 1
+whereupon stand 1
+gzip util 1
+mesolith dat 1
+dread 1
+onl phot 1
+featur arch 1
+mzr hom2.htm 1
+dream 1
+stat docum 1
+learn to rid 1
+neopalat 1
+effort inclus 1
+sheep ar particl 1
+phenomenon 1
+ey onc eu 1
+ncc us 1
+forthcom event 1
+fin ital 1
+structur biochemister 1
+san ant chaperonin 1
+amount of forc 1
+detail 14
+tomasz plew 1
+mirror 5
+unlik that eb 1
+jen 2
+us a transl 1
+overlook ba tip 1
+mlm o resum 1
+bionet.softwar.www 1
+var fight answer 1
+nat agricultur libr 1
+resolut 3
+whomsoever 1
+confer announc 1
+bi acc 1
+guid for law 1
+molecl plant biolog 1
+bring your kid 1
+lat night 1
+lahdenper circuit siml 1
+unimport 1
+inform proc 1
+dhistoir de relig 1
+diagn 1
+walk in black 1
+intent and purp 1
+half mad 1
+reag annu 1
+lab mat 1
+electron storefront 1
+snowboard actu 1
+countr to teach 1
+ren food homep 1
+joseph lil 1
+number of draw 1
+strength agil 1
+displac.push 1
+squar tabl 1
+concer in trom 1
+school bi 1
+tim being mer 1
+hit any englishman 1
+sfsh 2
+biotech rumor mil 1
+coordin multipl 1
+ten william 1
+learn sir 1
+annu lab 1
+joint 6
+appl sc center 1
+wilfr 1
+cigar 1
+lab docum 1
+lou wa try 1
+elendor 1
+articl wer receiv 1
+norweg text 1
+aal execut 1
+jim 3
+anc stud collabor 1
+prim tim 1
+interpr 2
+labor sr intern 1
+cultur collect 1
+junior colleg 1
+fin mot 1
+pr cl 1
+exper th fl 1
+dem datab 1
+.de 1
+educ and technolog 1
+leth and styx 1
+qu proc 1
+autom cr 1
+support trigonometer 1
+latin american chemister 1
+althistorisch institut 1
+mim.typ fil 1
+load computer 1
+program wer creat 1
+univer colleg london 1
+imag tran exampl 1
+common th li 1
+whereupon 1
+inform new group 1
+prap sit 1
+perman 3
+cancer research labor 1
+alp snowboard 1
+ca workst 1
+world art 1
+kpt displac.3 1
+network of tran 1
+guild 1
+beer to go 1
+strif did lat 1
+ge hi supper 1
+se of cr 1
+searchl 1
+featur articl 1
+wom word 1
+kilometer wid 1
+tripol 1
+ital cal 1
+web o computer 1
+archieplec at univer 1
+pixel border vi 1
+man of skil 1
+www resourc 1
+web talk 1
+en dat 3
+sh on paper 1
+wid web offer 1
+mak perfect fight 1
+pr gl 1
+bioph cel mov 1
+expl tip 7b 1
+prefer 4
+consort for latin 1
+context as follow 1
+depart in peac 1
+leagu tabl 1
+lith find 1
+feast 2
+protein datab search 1
+job 11
+stat by invit 1
+rel funct 1
+jok 2
+jon 2
+heideg old lust 1
+scal posit 1
+melan softwar 1
+josef bigun avbp 1
+airman 1
+tim me 1
+david thoreau 1
+pat ma melan 1
+jpg 1
+search o prosit 1
+abil to inclus 1
+famil 4
+nomencl datab seqanalref 1
+accelerometer model 1
+creat larg 1
+quibu eabu420 1
+affect 4
+niddk 1
+accept command addr 1
+warder spac 1
+dew field request 1
+bost univer 3
+compreh sem 1
+structur and virtu 1
+gal snow 1
+de emb 1
+pag wa creat 1
+western reserv 1
+orbit 1
+controver relev 1
+confer on libr 1
+pyrgak tsouk 1
+mak him forg 1
+mailbox read 1
+cambridg tom 1
+sen ba 1
+sharp sword 1
+us few rap 1
+posit on issu 1
+harvard internet 1
+st pol 1
+peopl to visit 1
+archieplexform at nexor 1
+tim pa 1
+world of lat 1
+interfac and method 1
+bioph journ 1
+foot and bod 1
+vergil hom pag 1
+pr o human 1
+imag from gr 1
+morn c.b 1
+wound pr 1
+good import inclus 1
+empir found 1
+continu steel 1
+result 11
+jtc 1
+palaeolith 1
+futur rev 1
+subject of minoan 1
+keep straight 1
+aim to construc 1
+support tabl 1
+introduc term 1
+jud 2
+discograph 1
+ot lu 1
+segm non rigid 1
+juh 1
+start archiv 1
+research 30
+jun 11
+gibbon 1
+defin soc hierarch 1
+phy cool proc 1
+xerox 5
+ct radiograph 1
+biolog instr manufacturer 1
+tim se 1
+school pl 1
+tim sh 1
+frankfurt univer biocenter 1
+appertain unt guard 1
+karplus hbplus 1
+hypertext in html 1
+orient internet resourc 2
+oh you ital 1
+macrom 1
+gdb.org 1
+heav load 1
+pr pr 1
+zu den 1
+washingt affair repr 1
+intern assoc 1
+bh campaign 1
+confirm for truth 1
+weather map 1
+atleast 1
+sign loc 1
+aa at csb 1
+million web 1
+virgin tech 1
+text x server 1
+prec by dan 1
+specializ in singl 1
+pl unit 1
+becam incr dep 1
+configur variabl 1
+bur and cupol 1
+meter perman 1
+pot produc 1
+find irish 1
+death pool contest 1
+train mailser.htm 1
+oak ridg nat 1
+expir fin 1
+judg fail 1
+palac in particl 1
+buckler 1
+cel zebraf 1
+michigan mac arch 1
+match your search 1
+englishman cannot thrust 1
+find mi 1
+multipl search eng 1
+specif report rel 1
+capabil ar support 1
+school sc 1
+lo no opportun 1
+purch 2
+hc prof 1
+museum mark 1
+chemister pen 1
+du observ 1
+scot ii 1
+song tun 1
+computer 25
+problem th natur 1
+center univer 1
+av th stab 1
+lin biochemister tut 1
+quark fil 1
+program chair 1
+ge doc mlm 1
+tim allow 1
+developm seminar 1
+net www 1
+comp.infosystem.announc 1
+ar of ceram 1
+gel perform 1
+demon 1
+wh our plac 1
+model dynam shap 1
+chemister o period 1
+paper 12
+fencer say 1
+sham them indeed 1
+biom imag confer 1
+chairman 1
+4.x a precompil 1
+technolog of interest 1
+cam run 1
+old world 2
+cap alf 1
+sc is part 1
+molecl biolog datab 1
+therefor sooner 1
+king henr 1
+biometer 1
+turn up tail 1
+work elsewh link 1
+track biom 1
+hick 1
+blitz protein datab 1
+wom wil refus 1
+toolkit 2
+thrust both comp 1
+civil ar 1
+compil and run 1
+silicon graph hardwar 1
+li bear 1
+contempor developm 1
+act report 1
+hidb 1
+biolog biom sc 1
+strength and agil 1
+optim by var 1
+at hel 1
+sun 4.x 1
+xenopus 1
+lot of link 1
+houst 1
+ba of farmer 1
+fam ba 1
+sen me 1
+recept mult enzym 1
+ftp.luth.se 1
+adobephotoshop 1
+gener posit ink 1
+umich.edu 2
+commerc datab 1
+law stud 2
+elendormush 1
+institut for molecl 1
+hom1.htm 1
+mak th program 1
+sun wer bent 1
+cran montan 1
+problem of crit 1
+repr a decr 1
+def in learn 1
+surv for paleolith 1
+virtu 11
+men half 1
+speed th learn 1
+departm at stanford 1
+fuer altertumskund 1
+perl faq 1
+cal palac 1
+pag from point 1
+commerc sit 1
+virus 1
+ind color 1
+sorow 1
+fi accept 1
+high 11
+foam 1
+weapon wh virtu 1
+dat review 1
+fash a ser 1
+garl mash 1
+archiv url 1
+snowboard boot fal 1
+ludwig maximil univer 1
+ge ff 1
+tim and benefit 1
+leav th background 1
+molecl prob 1
+h.jokin 1
+wir serv 1
+model acquisit 1
+interprovinc en 1
+aveir portug 1
+jump stat 1
+loeb cl libr 1
+ca of rap 1
+think faithfl 1
+multipl search 1
+beylerb 1
+exp molecl biolog 1
+hm configfil 1
+hooker 1
+habit 3
+tak on tom 1
+inclus alt 1
+kal 1
+kan 3
+sent mean 1
+kar 2
+sequ datab taxonom 1
+molecl biolog inform 1
+uk register 1
+mandarin 1
+pag wa brought 2
+export numer agricultur 1
+mach run 1
+old woman perceiv 1
+help integr 1
+sgml 1
+biolog roger brent 1
+manag of resourc 1
+disgrac 1
+run faster for 1
+list of author 1
+kby 1
+se up hypermail 1
+visit our vid 1
+uncertain 2
+affect acc 1
+straus lab don 1
+upstart 1
+intern union 1
+doubl in win 1
+saf rel funct 1
+deathnet th gal 1
+affect term 1
+fal doubl 1
+cyr 6x86 1
+iest so stal 1
+fr coupon 1
+educ softwar using 1
+song interact 1
+hilt 1
+robot research 1
+datab sequ datab 1
+lab bioinformat daniel 1
+ext resourc compil 1
+perpendicl wil var 1
+biochemister penc 1
+carolin fin 1
+dual 1
+new.answer 1
+cal th priv 1
+mon and sit 1
+blow ar naught 1
+lipid 1
+deal with disc 1
+keg 2
+battl ac 1
+phenom track 1
+kel 2
+ken 1
+sourc for ver 1
+philotheou 1
+ker 1
+project contain 1
+murph av 1
+simultan search 2
+mail list manag 1
+fight or low 1
+sen command 1
+xwav 1
+key 8
+nin or ten 1
+neuer win 1
+publ on lin 1
+conver fac 1
+view tool 1
+search and retrief 1
+list pack 1
+prof consult 1
+leptiminus archaeolog 1
+integr toxicolog 1
+most rel 1
+duck 1
+gener could theor 1
+depart of psycholog 1
+inform resourc 3
+sit of koryf 1
+design program 1
+answer th qu 1
+jay shaffst 1
+exampl styl 1
+html cg driv 1
+sem lexicon 1
+hundr squar fe 1
+proc of an 1
+acquisit 2
+nepot 1
+as transl tool 1
+search sit lim 1
+thing with great 1
+chemister pen st 1
+part of greec 1
+beyng 1
+apol.co.uk 1
+microchemister facil 1
+pursu 1
+hyperflow 1
+3d self 1
+redempt mund 1
+organ by asc 1
+ba introduc 1
+den acr stud 1
+lesser 1
+album per se 1
+resourc learn 4
+key growth ar 1
+kid 2
+erlang 1
+kil 1
+giv nic 1
+kim 1
+london dat 1
+ge pi 1
+spac util 1
+fold 3
+kit 1
+kevin hugh 1
+dagger serv 1
+mak thing wor 1
+folk 4
+ff7f40 1
+highest touch 1
+thus th part 1
+resourc pag 4
+implaus 1
+mum th vinc 1
+exp molecl 1
+mi paragraph 1
+shallow natur basin 1
+euen ver light 1
+geoarchaeolog work 1
+great bold 1
+hist 10
+nmsu lingu pag 1
+lad bur 1
+abil to qu 1
+bring th truth 1
+umich cl stud 1
+acquir 1
+educ comp sc 1
+person computer 1
+whatsoever 1
+km2 1
+hith 1
+log me 1
+elsev sc 2
+font 1
+sick pink 1
+www gatew 1
+naught and unserv 1
+reg wh 1
+build a geograph 1
+mater ea 1
+ag and certain 1
+great strength 1
+fight ar imperfect 1
+food 4
+cl arch 2
+stud per team 1
+id becaus snowboard 1
+fool 3
+pag th yellow 1
+paleolith art threat 1
+sc found 1
+spectroscop 1
+pir genbank search 1
+foot 4
+work of kim 1
+complec nec 1
+cam symp 1
+hous confer 1
+shift 6
+step or leap 1
+magaz lik transworld 1
+transterm 1
+apolog 1
+town which flour 1
+consult th pbm 1
+de larch olog 1
+romanou rik 1
+wad arab archaeolog 1
+ribonucl p datab 1
+st of snowboard 1
+obeletz part 1
+bulldoz within day 1
+mad read 1
+nat of englishm 1
+svcigar 1
+project guidel 1
+expedit 2
+developm of minoan 1
+febru 4
+fund aus 1
+uh gen 1
+an onomasticon 1
+dramat 1
+libr millesjg 1
+dsboum cs.vu.nl 1
+export 1
+match your qu 1
+mec intern 1
+fangl 1
+co fear 1
+livermor nat 1
+mpr teltech 1
+fam tr 1
+funct variabl 1
+caus i court 1
+ind al word 1
+fingerprint datab atl 1
+york protein 1
+forc 8
+length a spac 1
+ford 1
+kor 1
+centr plac emerg 1
+forg 3
+experim ph 1
+form 25
+deeper 1
+system in bsd 1
+retrief system 1
+rec man pointer 1
+net a lot 1
+geograph inform 2
+fort 1
+int stud ar 1
+email c.bird umd.ac.uk 1
+m.e 1
+desper men 1
+want to prov 1
+strength of men 1
+artif skil 1
+ge wh 1
+nt.e technik.un 1
+bat colleg 1
+anthropolog 2
+kpt 1
+conquest 1
+devil can say 1
+kranner art museum 1
+port standard 1
+william shakespear 1
+suffer th skil 1
+shar and enj 1
+want for 1
+mother daughter 1
+us th counter 1
+israel taiwan 1
+addit 16
+prap is pl 1
+reject sampl circuit 1
+englishman hold 1
+mcnult hav com 1
+narrow wa 1
+neolith and bronz 1
+contact assemb plan 1
+biolog comput center 1
+john baccigalup 1
+arosnet arch 1
+phot edit 1
+univer of illin 2
+romarch hom pag 1
+investig rel 1
+extern interv 1
+wheresoever 1
+non www 1
+coc col 1
+lesson 1
+foul 3
+seek and saru 1
+ai lab 2
+guidel 3
+four 1
+refer kit 1
+mak no stop 1
+world of mar 1
+heer off 1
+damp in microstructur 1
+mod command 1
+departm of agricultur 1
+serv at virgin 1
+conquer men mind 1
+peip ind 1
+vniust 1
+influenz 1
+thin rut 1
+rasmus karl sim 1
+visit 13
+load th html 1
+init ar inclus 1
+dupl 1
+aegaeum 1
+top of interest 2
+www talk exampl 1
+form of insur 1
+technolog goteburg univer 1
+coff plant 1
+team design 1
+strateg and fam 1
+katholiek universiteit leuv 1
+tormentyd 1
+sit specl 1
+thrust com 1
+ran with outcr 1
+insuff or imperfect 1
+steel edg 1
+var compon valu 1
+say heckler lay 1
+chronicl 2
+right reserv 8
+mynd 1
+review of bioph 1
+histogram and four 1
+tran cfcfcf new.gif 1
+southampt univer 1
+gl of acronym 1
+oldenburg 1
+norman aldridg 1
+biomolecl toool 1
+univer of genev 4
+ne assyr 1
+archaeolog project guidel 1
+re markup 1
+avail and etiqu 1
+dim in term 1
+ge th nat 1
+finland archieplec 1
+biolog orient 1
+wound or sl 1
+support project 2
+brownjohn 1
+avail upon request 1
+susp substr microstrip 1
+hear rel project 1
+governm rel com 1
+westminster 1
+imag model 1
+fossil 1
+ct support 1
+bind th bind 1
+shad 1
+dust 1
+mult color background 1
+perm rapid 1
+contemporan 1
+shak 1
+model organ 1
+sham 2
+shap 6
+shar 7
+perfect of fight 1
+reg of roman 1
+squaw val 1
+roswel park cancer 1
+gener ad 1
+angl support 1
+cancernet datab cont 1
+sign proc web 1
+gener av 1
+militar web pag 1
+design problem prop 1
+sen any command 1
+herit bourbon tast 1
+user manu 1
+personnel wh perform 1
+read with rygorus 1
+secon produc revolut 1
+novel synth 1
+shirl 1
+electrotherm tran 1
+dep character 1
+gopher foz co 1
+shirt 1
+geoffr bryan bentl 1
+sequ an cultur 1
+olithiqu en franc 1
+number defin 1
+vect sequ 1
+kyl 1
+ch protect stranger 1
+origin of sc 1
+usenet 7
+oper their port 1
+inform for bus 1
+www.transarc.com 1
+trigonometer 1
+foreign langu 1
+lview 1
+degr in computer 1
+biochemister o biochemister 1
+biolog rothamst 1
+export and import 1
+using cg 1
+day ro betim 1
+orient 5
+kzr 1
+run is inclus 1
+weapon mak 1
+thing to turn 1
+targ man 1
+caus man val 1
+ver screen 1
+temper armor 1
+gabriel wor 1
+md univ 1
+help tip 1
+macedon 1
+shew 1
+syllabus and reserv 1
+man fear 1
+softwar pag 1
+docum is avail 2
+visu ind 1
+sampl multidim 1
+cr in term 1
+harvard microchemister 1
+nuremberg 1
+method for aplac 1
+tick sal 1
+danger of death 1
+know wh el 1
+fossil dun deposit 1
+demonstr a technolog 1
+spartan 1
+greenwich 1
+reflect th view 1
+backgroundsingl 1
+chemister hahneman univer 1
+someon onl hop 1
+plac and approxim 1
+morimot 1
+kind of motiv 1
+air in england 1
+lib mead 1
+interfac for datab 1
+credit is du 1
+attent 4
+becom transpar 1
+bioph technolog 1
+se hm var 1
+docum chang 1
+welcom me 1
+individu 12
+ller brockman 1
+censorship 1
+book is avail 1
+electr proper 1
+fencer tel 1
+digit tradit 1
+peopl docum dict 1
+weapon li 1
+research publ 1
+silverthorn 1
+preview 1
+blood cel 1
+bring to nimbl 1
+etruscan resourc 1
+fight therein perfect 1
+mklesson ar avail 1
+inclus bit 1
+garland wa caught 1
+biotechnolog genom sequ 1
+shin 2
+proof thereof 1
+ship 4
+partem de pr 1
+hop th utah 1
+leicestershir 2
+shit 1
+former speech 1
+intern snowboard feder 1
+supplem 1
+caus yong iph 1
+simpl reason 1
+missour o departm 1
+approxim 4
+stand watch 1
+anderson timesav 1
+sun openwindow server 1
+garl mash potat 1
+surg se 1
+gasp ar 1
+antibod 1
+interdepartm gradu 1
+nsp eastern 1
+honor to try 1
+caus th tal 1
+caus a grow 1
+cont copyright 1
+mat bakait 1
+biolog quiz sw 1
+gradu educ 1
+twent pound 1
+interdisciplin program 1
+top writ 1
+larg or fal 1
+bilk univer 1
+project geosim 1
+thriv loc construc 1
+look somewhat 1
+list of domest 1
+invit stoddard 1
+p50 robot equip 1
+mov inclus 1
+val gentlem slain 1
+thy bel 1
+pol record 1
+modif tu nov 1
+phot gal 1
+lab 13
+lac 1
+softwar pedr 1
+lad 1
+renfrew implaus 1
+gunter 1
+attest 1
+lak 1
+educ and exper 1
+lan 2
+vliegclub 1
+lar 1
+command list glob 1
+ka kraus power 1
+lat 10
+lau 1
+law 10
+lay 3
+sur watkin 1
+llc o biochemister 1
+de cultur 1
+tool ar assoc 1
+otag 1
+measur evolut 1
+just wif 1
+imag proc confer 1
+custom synth 1
+not regard snowboard 1
+hel through roman 1
+lbl 1
+format emac 1
+con of christopher 1
+cometh 1
+biotechnolog institut 1
+subdu 1
+word and mus 1
+0002.html 1
+implem of ppm 1
+demand result 1
+epistyl 1
+commerc purp 1
+us common 1
+recuper archeolog attraver 1
+bodkin 1
+world john 1
+toxicolog 2
+appl in biochemister 1
+nest with parenth 1
+ernest geisel 1
+acc th transpar 1
+sign proc inform 1
+practitioner 1
+shop 7
+sit in southwest 1
+shot 1
+farm becam 1
+shov 1
+val and everywh 1
+show 11
+cooper he opn 1
+saarland 1
+internet neurosc 1
+uncertaint and impossibil 1
+lik dat somewh 1
+cal ind.html 1
+japan german sw 1
+inherit disorder 1
+jeronim 1
+lec 3
+led 3
+imsd.meb.un bon.de 1
+leg 8
+law log9406 1
+interpr anc manuscript 1
+winck 1
+fair drawn 1
+len 3
+mathemat and molecl 1
+geosim 2
+mad therewith 1
+search al field 1
+lev 2
+lew 1
+commun over pack 1
+journ molecl 1
+compar to exampl 1
+tim to continu 1
+character 9
+por favor 1
+dat when hypermail 1
+bent up fun 1
+univerzitn 1
+megar bowl 1
+search on say 1
+crystallograph me 1
+origin micr brew 1
+tim in rough 1
+boot fal 1
+djoser 1
+term crop 1
+caus by snowboarder 1
+bost ar mbt 1
+girod telecommun institut 1
+put th surplus 1
+char which keep 1
+bernd girod telecommun 1
+zon c show 1
+collabor and interact 1
+detail investig 1
+tal gentleman 1
+hand ar deceiv 1
+surround th palac 1
+bil except 1
+mer report 1
+sound proof cubicl 1
+welch hook 1
+soever th staff 1
+html markup 1
+longer 6
+fuer biochem 1
+par html html 1
+den wer subsequ 1
+list of roman 1
+typ from imag 1
+asimov 1
+gener rl 1
+bigger 1
+former speech labor 1
+qumran 1
+irish web 1
+postl ba altru 1
+israel 2
+st reg 1
+em by vehicl 1
+weapon wh 1
+dismayd 1
+quot lin 1
+plowm 1
+mak peac 1
+lib 3
+lic 4
+mobil robot 2
+shenandoah 1
+columb univer 1
+lif 11
+farmer 1
+pl dont ge 1
+lik 7
+celebr celebr death 1
+snowboard deb st 1
+lil 1
+lim 11
+lin 19
+lip 1
+intr to using 1
+lit 3
+liu 1
+liv 10
+gener ind 1
+com to court 1
+minim calf 1
+lordship lov 1
+val vict 1
+anim behavior glob 1
+institut pharm 1
+mak tr 1
+not that yah 1
+datab inform 1
+judg and tim 1
+trust world 1
+lot of neat 1
+doubl of thrust 1
+psychiatr pomon colleg 1
+gener us 1
+distribut allow 1
+ftp sit 3
+ingratitud 1
+sport begin 1
+fieldwork server 1
+mak us 2
+arbitr 1
+lat pleistoc 1
+datab regl 1
+biotechnolog group 1
+chief emerg 1
+rensselaer chem 1
+lic to distribut 1
+statur of men 1
+kloth biochem 1
+llc 1
+antholog 1
+produc review 1
+mak vp 1
+bur excav 1
+demograph profil 1
+olymp gam 1
+boot cheaper 1
+incr and vin 1
+biolog o center 1
+interdisciplin research 1
+select decad 1
+driv by art 1
+den veg 1
+alber ludwig universit 1
+imag mod 1
+thin sol 1
+ba arch 1
+gaind 1
+hear a pr 1
+wisdom to perus 1
+hap th year 1
+pac doeth 1
+hardwar 4
+pebbl st 1
+workshop wa held 1
+research a for 1
+highlight 3
+spec avail 1
+snowboard establishm 1
+order 13
+east lokr project 1
+st part 1
+motif fingerprint datab 1
+datenquel 1
+targ mut 1
+therm spread imp 1
+aplac and form 1
+requir that subscript 1
+cour offer 2
+list manager program 1
+world cup 1
+krobison nucleus.harvard.edu harvard 1
+using xv 1
+europ or us 1
+portrait 2
+brought to bear 1
+loc 29
+fil o search 1
+color a protein 1
+simpl breakdown 1
+log 12
+lol 1
+nrsub o escherich 1
+juggl gambol 1
+lor 1
+tongu 2
+guid ha list 1
+wid web hypertext 1
+lot 16
+lou 7
+lov 4
+bod by encl 1
+inktom 1
+low 7
+loy 1
+inform tick 1
+interpr anc 1
+object 8
+paper gild 1
+work on design 1
+bus rensselaer chem 1
+search dd rl 1
+think it most 1
+interfac opt 1
+pound th mar 1
+us vh 1
+map biolog week 1
+mean beaut song 1
+ant chaperonin 1
+lpr 2
+spat an plan 1
+stoddard 1
+project suggest 1
+sw intern 1
+medl molecl 1
+stereohead 1
+premiership 1
+show me therfor 1
+coar reach st 1
+mart aplac.hut.fi 1
+subst 4
+listserv search funct 1
+center for mechan 1
+run faster 1
+xav hist recip 1
+ordin 3
+problem caus 1
+dat of seminar 1
+tradit sant 1
+elsev 2
+slyper 1
+knight 3
+erd aut 1
+an bibliograph refer 1
+nucleus.harvard.edu harvard 1
+subtl 1
+biolog macromolecl 2
+vect spac model 1
+valor with strength 1
+exhibit mithr 1
+georg richard 1
+interlac 1
+thought it frivol 1
+foster 1
+internet to europ 1
+read it articl 1
+flat to ground 1
+worker 2
+institut univer 1
+ba an mod 2
+algorithm textu ii 1
+freestyl skiing 1
+pag museum 1
+lsu 1
+allow th developm 1
+disappoint 1
+thirt eight 1
+st occur 1
+robot grasp 1
+ltd 5
+snowboard sc 1
+ground for def 1
+off and civil 1
+reader began respon 1
+snowboard sk 1
+molecl biolog search 2
+specl fict author 1
+harbor labor pr 1
+cam center 1
+ch seem 1
+program support featur 1
+roman stud 1
+heath sfsh umich.edu 1
+design of analog 1
+register particip 1
+fict writer 1
+luc 1
+cor and an 1
+mask techniqu 1
+lut 1
+il ba 1
+el either coerc 1
+ker syr 1
+lab publ 1
+explicit 2
+phot album photograph 1
+parad 1
+subject orient internet 2
+tailor to individu 1
+mycoplasm mgdb xrefdb 1
+biolog instr 1
+length fight saf 1
+milan 1
+anachron art 1
+cl work 1
+non turbl hydrodynam 1
+departm of energ 1
+ar mbt map 1
+majconf.htm 1
+vom wa cast 1
+aus dem biter 1
+deafac trust 1
+2.x 1
+ar using 1
+tun of damon 1
+metal raw 1
+sketch 1
+exploit 2
+show progr 1
+datab biosc 1
+think themselv cun 1
+mlm mlm 1
+biolog imag proc 1
+ventur hi lif 1
+stanford univer program 1
+rev multipl 1
+beast deliver 1
+collect of system 1
+departm of physiolog 1
+block server 1
+abstain 1
+sort th articl 1
+bucknel 1
+cg etc 1
+businessman 1
+investig 7
+displ me 1
+adept 1
+ship design 1
+casu about chronolog 1
+over th on 1
+evil conceit 1
+departm and program 1
+roger brent 2
+model shop equipm 1
+overwhelm western 1
+support th bh 1
+administer ag dec 1
+mpr teltech research 1
+lyc 3
+sick 4
+henceforth th brief 1
+softwar sign proc 1
+lyf 1
+lyk 1
+lym 1
+wil and such 1
+lyn 1
+def on thrust 1
+alif ai.mi.edu 1
+lyr 1
+agent fe 1
+electrotherm compon 1
+hist of rom 1
+theor from southampt 1
+tim learn 1
+assoc whol internet 1
+welcom pag 1
+wh near 1
+suit shuld hit 1
+sidn 1
+symp in cl 1
+puyloub 1
+preh aegean 1
+wid to def 1
+loc ecosystem 1
+root direct 1
+aus dem 1
+listserv for geosim 1
+anticip 2
+fair obv 1
+sendmail bug 1
+4.4bsd 1
+refer datab 1
+chaunc 1
+libr avail 1
+chaung 1
+unsubscrib automat 1
+pot var 1
+acquisit mot plan 1
+scan displ 1
+keep in mind 2
+try using 1
+design ar str 1
+altern instruc strateg 1
+sit appear 1
+universiteit 2
+dist educ project 1
+proc web 1
+honor th fest 1
+sift 1
+microbiolog wag agricultur 1
+rn world john 1
+lab mat meselson 1
+protein gel 1
+rec.skiing.snowboard subject 1
+good al tap 1
+hebrew 1
+chop spr 1
+klassisch 1
+lest an 1
+sent to tom 1
+engineer micr organ 1
+born out straight 1
+sign 12
+mor pik 1
+theyr wo 1
+thin film 1
+imper colleg london 1
+web peopl 1
+check your url 1
+reson research group 1
+erst siedlern zu 1
+subaqu 1
+metabol o biochemister 1
+pr look 1
+hp laserj 1
+chang th whit 1
+list other ind 1
+therein th fal 1
+milit 2
+austr archieplec 1
+go fish 1
+spac narrow 1
+vant against men 1
+september 3
+construc a virtu 1
+mak appar 1
+md sk 1
+mi ai lab 2
+sl with bloud 1
+bioph 2
+extent 2
+roman amen 1
+web my virtu 1
+webmaster ipg.umd.ac.uk 1
+impr from bel 1
+origin program 1
+et de 1
+lif origin 1
+seldom 1
+ceram developm 1
+hand and person 1
+nc hom pag 1
+origin writ 1
+cl period 1
+newspaper 3
+entir invent 1
+lifesc 1
+acc an nntp 1
+soccer 2
+ext walk 1
+universidad de cantabr 1
+workst 7
+pag may constitut 1
+zealand norw japan 1
+biolog biomolecl 1
+direct organ 1
+def hi head 1
+kiv.zcu.cz 1
+fair stand cover 1
+mak th tripl 1
+htmlguru aol.com 4
+chemister biochemister 1
+histoir 1
+med lab 2
+feder 5
+blow fl 1
+soc control 1
+caught them vnder 1
+liv ar def 1
+hypoth bronz ag 1
+biosc 3
+mac 6
+mad 17
+architectur for shar 1
+train at 1
+silk 1
+mag 6
+labor of phy 1
+therein perfect 1
+mak 23
+man 10
+rel workflow 1
+bionet.molb.methd reagn faq 1
+map 15
+nexor.co.uk copyright nexor 2
+mar 8
+upstream flyf 1
+mat 6
+geograph search 1
+may 1
+datab project reb 1
+search string 1
+oxford st berkel 1
+pardon crau 1
+ucsd 1
+ucsf 1
+rider allow 1
+siml 11
+extern 2
+post adver 1
+simp 6
+textil 2
+heart of silicon 1
+sevent nin 1
+univer chemister biochemister 1
+simu 1
+margin 1
+system automat 1
+list of radiolog 1
+mbt 1
+entir collect 1
+teach th internet 1
+mov concer 1
+fr jl 1
+computer serv 1
+mr dat se 1
+sing 2
+eventu read 1
+le cirqu 1
+sink 1
+manu text 1
+underwater archaeolog 1
+weizman institut bioinformat 1
+father 2
+struck 1
+buch von guter 1
+system v ba 1
+mcn 1
+wif by fortun 1
+prap ha ad 1
+hyperlink ver 1
+morsemcfad commun brochur 1
+arseweb disclaimer 1
+marsh kirk mckusick 1
+nicyng 1
+leau light lou 1
+md syntac model 1
+mdc 1
+lantiquit 1
+loc bin hypermail 1
+archiv www 1
+comput biochemister group 1
+hand to hold 1
+html quick refer 1
+contain datab 1
+bronz ag cr 1
+slain or sor 1
+sipb 1
+appear in transworldsnowboard 1
+univer of saarland 1
+mec 2
+jest 1
+med 14
+infrequ bug 1
+meg 1
+ind widespread cultiv 1
+mel 3
+mem 1
+men 5
+mer 5
+fr me 1
+mez 1
+interest in help 1
+affair repr cl 1
+microbiolog 1
+ouer 1
+il su 1
+www biolog 1
+win beer 1
+ind o yah 1
+developm sinc 1970s 1
+fal tim me 1
+biolog calvin colleg 1
+consider absolut 1
+brazil jun 1
+input and output 1
+lab pat 1
+men ar cluster 1
+server is most 1
+commun is int 1
+lim search 1
+fam i think 1
+netbsd and openbsd 1
+work doest mean 1
+ba med magaz 1
+setenv hm filemod 1
+engineer yal univer 1
+serv ctil 1
+pennmush 1
+aplac interpreter typ 1
+conflict ar resolut 1
+bur wer discover 1
+mhc 1
+fenc trick 1
+regard snowboard 1
+nat genom inform 1
+arithm 1
+st evolut 1
+fam author 1
+direct cal 1
+fr pc 1
+ms vat 1
+list search 1
+prem swissprot 1
+leav a transpar 1
+mic 2
+papyrolog hom pag 1
+mid 1
+disqu or nettwerk 1
+suff sub 1
+multiproc 1
+bachman av 1
+mik 2
+developm which mad 1
+mil 9
+mim 2
+min 2
+situ 2
+mip 1
+univer o physiolog 1
+loop control structur 1
+archieplec at funet 1
+nec to great 1
+kind ar great 1
+fin pot 1
+somewhat later mycenaean 1
+poster may inclus 1
+univer of asiut 1
+ge th correct 1
+servicemark 1
+program augst 1
+point worth 1
+typ mil 1
+strong perturb supernov 1
+blow pa 1
+rever boolean number 1
+fr web pag 1
+yah th largest 1
+cluster and hurl 1
+html from scratch 1
+paleolith sit 1
+hadst 1
+daint exampl 1
+peopl phot inf.html 1
+gradu symp 1
+mot thereof 1
+want hit 1
+enterpr 1
+www ind 1
+www inf 1
+fil gif89a 1
+morsemcfad hol 1
+figur and refer 1
+zip graph 1
+futur html 1
+st wh near 1
+loppidum de bramefan 1
+cant next album 1
+research by serg 1
+color imag 1
+hadr bath 1
+mad thereof 1
+standard input 1
+fight is fal 1
+taught rap fight 1
+courtl count 1
+mlm 1
+fl featur direct 1
+produc or commerc 1
+klassiek 1
+an optim 1
+mmd 1
+even fest 1
+seam gutter 1
+artif ward 1
+compil and maintain 1
+sixt 1
+tim lost 1
+archieplec at delft 1
+damon and pith 1
+polit sc 1
+fr us 1
+thrust being mad 1
+jl stryjkowsk 1
+health and medicin 1
+skiing snowboard link 1
+theor 11
+resourc rel 1
+textur 2
+lectur sl 1
+genom dat 1
+continu danger 1
+deb st 1
+letter transm aal 1
+cel biolog r.i 1
+giv them hit 1
+resourc program 1
+infomac 1
+cr an entr 1
+flight 1
+half pik 1
+sud to cal 1
+powel str 1
+mod 5
+proc compon 1
+search o sander 1
+cod o nih 1
+sampl of bel 1
+mon 11
+hypermail to kevin 1
+frid and saturd 1
+austr nat univer 1
+mor 3
+nimbl with 1
+mot 3
+mov 14
+littman 1
+configur their browser 1
+hm showheader boolean 1
+power of coff 1
+gibcobrl lif technolog 1
+mpg 1
+red arrow 1
+cour compreh 1
+pag inclus alt 1
+earl stapl 1
+soft boot du 1
+determin th exact 1
+di zaragoz 1
+accord to chem 1
+reproduc in fl 1
+featur a hierarch 1
+mpr 1
+electr violin 1
+olvwm 1
+therm 2
+1960s 1
+tosolin 1
+server is run 1
+ie pam workshop 1
+sw jok molecl 1
+serch and mult 1
+high educ fund 1
+high educ commun 1
+project th wroxeter 1
+zurich 1
+oreil 1
+worldw 2
+syntact constitu 1
+power author 1
+mrc 1
+dev ltd cornel 1
+resourc for find 1
+mklesson 1
+enem abroad 1
+individu sent distribut 1
+search tool 1
+model of motor 1
+mannheim biochem 2
+denver 2
+msd 2
+articl header lin 1
+men ge 1
+10apr94 1
+bibliographisch datenbank 1
+ruin th appear 1
+sum of mon 1
+orig.gif 1
+oftentym in shap 1
+color datab 1
+whereb he me 1
+int law john 1
+select 21
+drug refer 1
+paleolith mesolith 1
+sourc cod tr 1
+se th unskil 1
+break th thrust 1
+altogether 2
+journ of interest 2
+gr entr 1
+web server map 1
+manager program 1
+biolog datab workshop 1
+com to symbol 1
+writ perm 1
+cov project 1
+proc inform 1
+ge th pag 1
+faq j.r.r 1
+chemister o interdepartm 1
+hexadecim rgb 2
+outl 3
+mud 1
+origin 17
+ridg nat 1
+dormer 1
+mlm mlm command 1
+mum 1
+us and consum 1
+mus 11
+mut 1
+jfcc 1
+chop tip 1
+3.gif 1
+mp for merseysid 1
+night 4
+actu migr 1
+aspect of snowboard 1
+skiing 3
+brew homep 1
+black letter 1
+hm dir direct 1
+int law 1
+reader began 1
+gener electr 1
+mail ack 1
+zlatin 1
+fencer 1
+man wil fly 1
+nexor.co.uk copyright 2
+se no chang 1
+hon th health 1
+coast reg 1
+concentr 3
+bind plac 1
+houswif quick pin 1
+toool 1
+theater 1
+furor 1
+virtu wa ti 1
+pixel to transpar 1
+sen inform 1
+complec por 1
+recit any part 1
+dat acquisit 1
+comb pl 1
+genomenet 2
+project is entitl 1
+intytl 1
+marathopol dialiskar 1
+exampl key growth 1
+theyr 1
+magaz can print 1
+medicin vi human 1
+contool 3.3a 1
+certain strik 1
+credit wh credit 1
+hanger 1
+arch th nam 1
+drink al bewar 1
+author sr 1
+phon and cal 1
+biolog molecl 1
+abil 3
+microwav measur using 1
+htacc fil 1
+norweg band 1
+myc 1
+bold and saf 1
+ea to spot 1
+romanou bouk 1
+myn 1
+biochem ric 1
+insuff weapon 1
+relev wa 1
+followsymlink 1
+grow popl 1
+research council 2
+d.homolk 3
+acquir geometer 1
+sorrowfl 1
+agricultur biotechnolog 1
+trigonometer marker 1
+system 29
+perm ar 1
+lawlib.slu.edu train 1
+pointer to www 1
+anim fertil op 1
+cour is doubl 1
+tag cr list 1
+keyword and hyperlink 1
+joint research 1
+gain th truth 1
+found in com 1
+invit talk 1
+mzr 1
+bind configur 1
+hand of ital 1
+librar 1
+york archaeolog trust 1
+encod init 1
+finger salisbur 1
+hypertext form 1
+ic breaker 1
+listproc list 1
+1d self grav 1
+33k 1
+latest produc 1
+text fil 2
+simon gib us 1
+court wa fil 1
+cluster 2
+ba implem 1
+coar reach 1
+hag soph 1
+tight caus 1
+za arch search 1
+announc 7
+appertain four fight 1
+switch in switzerland 1
+offer by cs 1
+count se count 1
+addtyp text 1
+grot orn 1
+sev day 1
+speed photograph tak 1
+prap datab 1
+datab search 2
+mo and stamp 1
+pbm gam 1
+contempor 2
+atl project 1
+spac decomposit flec 1
+molecl 4
+prov th separ 1
+hypermail is se 1
+hinterland project 1
+maintain manu 2
+feear 1
+stevenson 1
+german cook 1
+sound 5
+order to print 1
+pref in front 1
+highest qu 1
+softwar and dat 2
+leav him dead 1
+datab search dd 1
+edit isnt fr 1
+meadow 1
+suff tim 1
+ba hamilt 1
+triad of wheat 1
+mater for law 1
+19th 2
+html sc fenc 1
+protopalat center 1
+se up fe 1
+sharp contrast 1
+autonom de 1
+join a list 1
+mac planck institut 1
+mod inclus 1
+sunderland 1
+technolog departm 1
+austr aa 1
+direct entr 1
+depth 3
+men se 1
+uk char 1
+christm parad 1
+metabol 1
+sud se 1
+fram 4
+arch contain datab 1
+fich de recherch 1
+journ pl 1
+polit foc point 1
+sequ an 3
+find himself overmatch 1
+recent usenet 1
+accompl that kind 1
+reload 1
+blow pa indirect 1
+man half 1
+detect 2
+approach to network 1
+numer radiolog resourc 1
+lyeth my lad 1
+lif cycl cost 1
+show a progr 1
+year alp sk 1
+alexandr 1
+inc detect 1
+av hom pag 1
+teach with anc 1
+taxonom o phylogenet 1
+electrophor la 1
+datab entr 1
+molecl dat 1
+scatter 1
+lead upon shot 1
+hap return 1
+background imag 1
+great brav 1
+hear th mer 1
+pag northwest 1
+lab exerc 1
+switch capacit 1
+transit paleolith 1
+er interdisciplin crystallograph 1
+boehringer mannheim biochem 2
+hold th handl 1
+sourc 19
+univer quebec 1
+softwar and dem 1
+inord amount 1
+nab 1
+annabel 1
+quoth 1
+nac 2
+nad 1
+thy beer 1
+pleaseth 1
+def thr bout 1
+man hand 1
+nak 1
+abdomin 1
+incr strength 1
+homep rec.food.cook faq 1
+biolog reag protein 1
+nam 20
+nan 1
+wom to help 1
+sc de 1
+nat 12
+ec archiv 1
+ar of prev 1
+nav 1
+straight 5
+nay 1
+protein electrophor 1
+chemister soc 1
+abst 1
+default mailbox 1
+thus en 1
+actr and direct 1
+datab of computer 1
+biodegrad 1
+found hym pl 1
+us serv 1
+journ th 1
+fren 1
+se of variabl 1
+disposit 1
+libr guid 1
+ncb 3
+south 8
+search inclus input 1
+ncc 1
+honor disposit 1
+biolog resourc 1
+multipl level 1
+tr stand 1
+datab enzym enzym 1
+inspect rev 1
+zebraf new 1
+sc fi 1
+problem ba learn 1
+lin dict 1
+food bibliograph ein 1
+user guid 1
+subscrib int 1
+www resourc yah 1
+abus 1
+sequel 1
+fi world congr 1
+good food 2
+workshop sum stanford 1
+st accord 1
+ramamritham 1
+montr universit 1
+molecl dev 1
+listserv 3
+seleuc 1
+molekl 1
+hilt li 1
+med med 1
+valorizzaz e di 1
+softwar rang 1
+drew eckhardt dat 1
+skal wscg97.html 1
+internet resourc guid 4
+nec 4
+forecast 2
+creat a world 1
+metropolitan museum 1
+greed hunter 1
+exampl of paleolith 1
+nem 1
+nen 1
+slider 1
+ner 1
+ec arch 1
+hand telephon contact 1
+net 8
+closer 2
+new 18
+ng7 2
+st fourteen resort 1
+float 2
+oven 1
+list of biom 1
+cd nettrain ge 1
+spreadsh 1
+over 4
+biolog informat 1
+medl molecl sequ 1
+dagger or blad 1
+new about bsd 1
+bioinformat nat institut 1
+frid 5
+rutter 2
+sight i hau 1
+nft 1
+thrust 1
+hist and cultur 1
+numer po interpr 1
+educ resourc inform 1
+unavail 3
+project archaeolog dialogu 1
+lin career 1
+york archaeolog 1
+mus to thousand 1
+contain th docum 1
+strength or skil 1
+digit interact 1
+macromolecl 2
+wrought 2
+noncommerc 1
+tiryn cultur 1
+dan bab 1
+miscellan frequ ask 1
+univer of pittsburgh 1
+u.michigan genom center 1
+insuff to fight 1
+model again posit 1
+hilt pa 1
+eyr de lanaux 1
+miscellan sourc 1
+calabr 1
+intellig lab 1
+techniqu algorithm 1
+stryjkowsk 1
+stav or sword 1
+displac.schizophr tip 7e 1
+abzu 1
+act mor court 1
+robot support standard 1
+draw their sword 1
+drift 1
+nic 10
+fin neolith tim 1
+tim a year 1
+nih 3
+nik 1
+nil 1
+nim 1
+nin 4
+catalog o fisherbiotech 1
+brit mach 1
+niv 1
+digit elev model 1
+scor bil 1
+popl fam 1
+rel departm 1
+ljub welitsch 1
+ovid 1
+program nam 1
+mgdb xrefdb 1
+museum of art 1
+inform serv aal 1
+2de 1
+cor breadth 1
+squint ey 1
+venison cometh 1
+freewar program 1
+leg research serv 1
+organ subject 1
+compl tear 1
+further evid 1
+select model organ 1
+blow requir 1
+travel to loc 1
+shockwav quot 1
+problem 13
+incorpor int word 1
+spac model 1
+law europ john 1
+ecolog soc 1
+appropr off 1
+subject orient 2
+de janeir 1
+ocean datab 1
+hm showhtml 1
+bronz technolog 1
+ar web 1
+crit period 1
+croat 1
+langu resourc 1
+brew or distil 1
+sit of consider 1
+plac at leptiminus 1
+nestl 1
+supramolecl 1
+nlp 1
+major of boarder 1
+frog 1
+inform mail 1
+again hi hous 1
+author web 1
+larger lightspac project 1
+governm inform pol 1
+se under reg 1
+modern se level 1
+tel el 1
+go to pointer 1
+technolog for gener 1
+snowboarder wh se 1
+wroxeter hinterland project 1
+panel search launch 1
+bauderyck wy 1
+autom high qu 1
+biolog reag annu 1
+nmr 1
+lisqu 1
+annu confer 1
+mutter o wak 1
+horizont extent 1
+put in rim 1
+degener 1
+allow user 1
+departm of biochemister 1
+determ 2
+resourc sen 1
+fin pebbl st 1
+ai lab project 1
+utah avalanch 1
+frantiq 1
+enzym nomencl datab 2
+archeolog attraver 1
+biotech 1
+plac wh 2
+comp atom 1
+captain 1
+conduc joint 1
+nod 2
+genev in switzerland 1
+link pag 1
+nok 1
+detest 1
+complec por med 1
+nom 1
+welcom to morsemcfad 1
+non 11
+program for parallel 1
+diocl at split 1
+kid suck 1
+stranger shal tak 1
+not 24
+stream jpg addtyp 1
+nov 3
+fal lying 1
+lach 1
+keynot 1
+var way 1
+lack 3
+eberhard 1
+tud anc 1
+tus felicitac 1
+ceram mater 1
+distinct 4
+commun brochur 1
+imag using 1
+inform imag 1
+listn 1
+p.m 2
+intellig lab pat 1
+p.o 2
+examin th problem 1
+object workshop 1
+list ar sort 1
+retailer 1
+drink 6
+genom project genquest 1
+iop thin 1
+support trigonometer marker 1
+croft 1
+parallelogram 1
+stud exper 1
+1970s 2
+ryh nen model 1
+clam chowder 1
+resourc guid 7
+us of blow 1
+member to subm 1
+leav th def 1
+cal hi colleg 1
+channel neur network 1
+draper 1
+subm by research 1
+sw cem 1
+morsepr.com or dan 1
+nrl 1
+multim tut program 1
+prob molecl 1
+ind search 1
+cl eirean cl 1
+sit of mycenaean 1
+envirolaw oregon.uoregon.edu 1
+further isol exampl 1
+mediterranean 4
+vnt th ma 1
+found and salt 1
+internet th hadr 1
+suppl oreil assoc 1
+van nort 1
+actr and dancer 1
+netbsd ar deriv 1
+causeth 1
+search th titl 1
+nsp 1
+universit libr 1
+weight slight 1
+follow 10
+biotechnolog assoc 1
+obtain a list 1
+sc in computer 1
+seventh 1
+half maim 1
+floor 1
+ntb 1
+2nd 3
+ech foul 1
+distingu 1
+fraud go 1
+accelerometer inclus 1
+direct shockwav quot 1
+field school 1
+hand littl guid 1
+ballad intitl 1
+curst wif began 1
+count actu 1
+telecommun and network 1
+www.du.edu 1
+list arch 1
+comb beyng doen 1
+text to html 1
+ar between romanou 1
+se hm mbox 1
+nud 1
+francisc 3
+bmerc 1
+server docum direct 1
+button to ensur 1
+german phon 1
+sc homep 1
+consider import 1
+le any man 1
+p50 1
+nur 1
+fac to fac 1
+archiv brow 1
+rom inform 1
+nam descript 1
+eu research project 1
+siml th effect 1
+reason why 1
+swarm intellig 1
+lain 2
+se what culin 1
+ma spectrometer 1
+arch th tech.mi.edu 1
+yield theor insight 1
+assemb oper 1
+palat econom 1
+liszt 1
+system of centr 1
+minar 1
+hurt hi enem 1
+men cloth 1
+jud and appropr 1
+4.x 2
+world usenet 1
+shroud of turin 1
+singl background 1
+partisan 1
+differ great 1
+acceler er 1
+internet 28
+skal 1
+360s 1
+pip through appropr 1
+halberd 1
+merin castr 1
+kanu and sot 1
+st at assir 1
+cretan palac 1
+bruer 1
+perm constitut 1
+entr and exit 1
+major of soft 1
+lim ar search 1
+stok th cr 1
+conimbrag 1
+jah wobbl london 1
+simil search 1
+interest in flyf 1
+inclus th melan 1
+governm and polit 1
+attack th problem 1
+bioph cel 1
+st facil 1
+gif addtyp appl 1
+nyc 1
+cron job 1
+husband must know 1
+lov th promot 1
+danger and dead 1
+shop virtu 1
+var from reg 1
+nyu 1
+pleistoc 1
+dagger drawn 1
+flour 2
+joint research project 1
+flout 1
+lamt 1
+william smith monr 1
+arch project 1
+anc text 1
+beat gard 1
+cloth plainl 1
+ackl 1
+tr for phy 1
+chang of mind 1
+land 4
+www catalog 1
+wh pa answer 1
+using th olwm 1
+lank 1
+run twent 1
+compat with ec 1
+maniat lab 2
+mailb gopher 1
+indogermanisch 1
+distinct point 1
+inflam with sorow 1
+skel 1
+gi rel 1
+typ langu 1
+vist ha acc 1
+technolog and cognit 1
+photograph 4
+2uu 2
+stev man 1
+lou imbrac 1
+organ genet cr 1
+macperl 1
+danger to sit 1
+manuscript 2
+annu pilgrim 1
+spectr datab roswel 1
+link other web 1
+tech ind project 1
+computer aid design 1
+cancer sit typ 1
+mak any contribut 1
+fin rap 1
+hor would scarc 1
+plan propriocept 1
+red but 1
+pag inclus 2
+centr point 1
+bioinformat daniel 1
+serv without form 1
+reconstruc in greater 1
+din standard 1
+approach th slider 1
+electron engineer aler 1
+sect electr 1
+origin of palat 1
+apach server 1
+bronz ag palac 1
+stroller find irish 1
+thus to pa 1
+transl text 1
+click for hypertext 1
+biolog web 1
+larger number repr 1
+pathw 2
+medicin departm 1
+mc7852 1
+serv informatiqu et 1
+snowboard badam begin 1
+merg color 1
+fight at rap 1
+captur thewith 1
+sourc of inform 1
+server is tag 1
+oregon zebraf book 1
+non triv 1
+took it thank 1
+an us convolut 1
+continu in fenc 1
+resolut to appropr 1
+blood is hot 1
+minim 3
+beer and liv 1
+harvard univer 3
+new gatew 1
+continuum 2
+search eng refer 1
+list pol result 1
+larg 3
+camer read cop 1
+mat tel 1
+pack network 1
+di datab 1
+dyssh 1
+common on modern 1
+great apprec 1
+histocompat complec 1
+lab o georg 1
+skil 6
+lart 1
+grappl fast 1
+skin 1
+yield 2
+skip 2
+preh fortif 1
+lanigan 1
+biochem soc 1
+apprec addit 1
+overwrit boolean 1
+manu maintain 1
+ext calf 1
+lash 1
+exampl of eh 1
+digest other reason 1
+span fight perfect 1
+listnam addr 1
+last 1
+ital hav taught 1
+think faithfl thisb 1
+mail molecl biolog 1
+anc spindl 1
+anonym ftp 5
+michigan museum 1
+usenet new.answer mail 1
+upd archiv 1
+constantinopl 1
+server bost 1
+accept 9
+million 2
+loc in downtown 1
+latv 1
+galac 3
+weapon li nowh 1
+ignor host 1
+richard 7
+tim perm 2
+teach mater 2
+sen a fr 1
+michael jink 1
+why palat civil 1
+chronolog sinc var 1
+laud 1
+clear hous 1
+crown 1
+manag bulletin board 1
+neutron 1
+inform technolog train 1
+know hi imperfect 1
+stud learn 1
+pdq di 1
+enzym com 1
+traver hi ground 1
+oak 2
+cdr new direct 1
+liter 6
+read dict 2
+oar 1
+hour episod 1
+noah brandon 1
+netiz 1
+direct of molecl 1
+great to off 1
+abbot northwestern hospit 1
+protein cambridg univer 1
+owan 1
+internet interfac system 1
+develop and design 1
+adventur so great 1
+protein by amin 1
+autom acknowledg 1
+obv 5
+reason and caus 1
+fe ar connect 1
+talk turk leg 1
+actr 1
+actu 9
+bundesrepublik deutschland 1
+giv that summer 1
+web refer 1
+background ar 1
+var of med 1
+occ 3
+lawr 1
+allow fr 1
+bear as good 1
+program that inclus 1
+nmr inform 1
+forc and agil 1
+salvador kitch crew 1
+period of tim 1
+unserv 1
+oct 4
+map viewer se 1
+guid on lin 1
+talk x exampl 1
+ok to fal 1
+init developm 1
+tak th form 1
+abandon 2
+biotech rumor 1
+harvard internet resourc 1
+ressourc 1
+oftentym 1
+perfect ward 1
+slain 1
+inclus internet 1
+shap segm 1
+pract 11
+going internet 1
+skirb institut 1
+brush 1
+weight 3
+en th vant 1
+client from budapest 1
+ody 1
+rel sourc 1
+rygorus rag teeth 1
+red but caf 1
+pl search 1
+start archiv email 1
+reason to us 1
+reciproc 1
+sc publ not 1
+sc found univer 1
+val industr 1
+print protein 1
+postproc proper 1
+ofb 1
+off 14
+minnesot 3
+term program 1
+perform molecl dynam 1
+sen a me 1
+pr act 1
+program that gener 1
+scorn look 1
+wiener labor 1
+brought 5
+taylor 1
+half rap 1
+pag and ar 1
+pip stil apprec 1
+se how popl 1
+imag guid 1
+ec lat 1
+biomednet o chemister 1
+electr engineer 2
+put in archiv 1
+culin offer 1
+brav to giv 1
+blueprint 1
+built to bolster 1
+length 2
+uk alt vist 1
+megaron 1
+approach emphasiz design 1
+archaeolog of mainland 1
+wh qu satisf 1
+alt.coff alt.food.coff 1
+festiv 1
+mintz 1
+us inform 3
+dav hort 1
+med research u.s 1
+support an ext 1
+silicon val industr 1
+request term 1
+imag field 1
+oil 1
+wednesd 1
+minut 2
+chyrchyeard 1
+sift select 1
+organ 16
+stead st 2
+publ th ctil 1
+format hd disk 1
+interview in jah 1
+button ver 1
+whyl louer 1
+lordship good lik 1
+textur work 1
+journ preview 1
+approach th rail 1
+heleyn doth rl 1
+vist th largest 1
+wh developm occur 1
+therefor that fight 1
+univer o molecl 1
+textil produc 1
+repr cl 1
+loc spec 1
+fight saf 1
+exerc of arm 1
+off mi 1
+synth catalog yal 1
+pag for bibl 1
+bodemonderzoek 1
+imag proc softwar 1
+medicin high 1
+infoseek a robot 1
+mar renault 1
+support 25
+old 9
+portug 4
+pedolog 1
+ad for cind 1
+inclus support 1
+middl minoan 1
+server par html 1
+ba contain 1
+gam virtu 1
+workshop ar 1
+raign 1
+smith.txt 1
+jerem hylt 2
+resort pictur 1
+model system 1
+thoreau 1
+identif further isol 1
+se no longer 1
+concer at rockefeller 1
+discr tim 1
+confer resourc 1
+produc of prestig 1
+slart 1
+new and inform 1
+onl imag imagearch 1
+aol.com 6
+thereof may appear 1
+lo stud dellantichit 1
+ad in futur 1
+incr human induc 1
+perfect mus 1
+pasteur en franc 1
+skyl 1
+weapon put 1
+ong 3
+bedlam 1
+hc rel act 1
+onl 14
+port dict 1
+bioph soc bioph 1
+lic insur 1
+symbol in architectur 1
+hil prest 1
+3ht 1
+fil var spool 1
+colleg medicin chemister 1
+lot of cal 1
+tool to mak 1
+slivowitz 1
+ind th text 1
+geograph inform system 1
+ba distribut 1
+improv possibil 1
+prof soil sc 1
+easiest part 1
+cer pol 1
+ec work 1
+period in quest 1
+fairest 1
+categor to ch 1
+fel at strif 1
+imag and text 2
+leptiminus archaeolog project 1
+isfahan 1
+shop th nin 1
+sift system 1
+sk map 1
+man to prev 1
+me contain 2
+pdq stat 1
+satisf herein 1
+lawr livermor 1
+perform through judg 1
+help doth cry 1
+dist is slain 1
+derek 1
+imperfect or insuff 1
+opn 1
+go whol hog 1
+brief reason 1
+opt 7
+adam 1
+ti sweeter far 1
+off rl 1
+fssp 1
+zoolog hol 1
+hym kanu 1
+lab o rn 1
+entr should mak 1
+educ technolog november 1
+quark tag text 1
+ind.edu 1
+theodor agnew 1
+join and leav 1
+optim method ba 1
+daughter of tim 1
+univer of alber 2
+gel datab 1
+railr 1
+european cd40l defect 1
+www client 1
+lov song 1
+technolog pag maintain 1
+biolog orient serv 1
+genom research genob 1
+orn 1
+rel fund 1
+liam brad attack 1
+mak loc 1
+plac being won 1
+proper dit 1
+mot or tim 1
+univer of montr 1
+div stat 1
+imag manipl 1
+sf f resourc 1
+raichl boot 1
+osf 1
+discr top 1
+gopher thesaurus 1
+sub commod 1
+snowboard adv 1
+osh 1
+do sport 1
+prototyp wil accept 1
+osl 2
+suppl oreil 1
+rainf 1
+thereb as slow 1
+vnthrift 1
+ost 1
+yf we tak 1
+addr 19
+biolog transterm 1
+resort tak 1
+gel perform accord 1
+fil cal mbox 1
+indep sign 1
+facult is supplem 1
+crossner ec.uv.ca 1
+lay th bruer 1
+techniqu pr 1
+gener refer 1
+filemod oct 1
+good to separ 1
+fact and design 1
+oth 1
+exp ftp server 1
+an of artifact 1
+sem random link 1
+3p6 1
+deriv 2
+wh th high 1
+modl for introduc 1
+sixteenth 1
+select fact 1
+adew 1
+visu and spectrogram 1
+repeat 2
+mo of geometer 1
+mycenaean dat 1
+ey to behold 1
+our 1
+pag train 1
+window user 2
+tim to thrust 1
+out 3
+ba on cer 1
+ballad 1
+failur 1
+sun sol 1
+clin biochemister 1
+tun of light 1
+molybdoenzym 1
+pointer to text 1
+biomechan div m.e 1
+optim variabl 1
+good a show 1
+length for perfect 1
+worth man trust 1
+colon ulp tr 1
+air gap 1
+outland 1
+biochem compound datab 1
+biochem and bioph 1
+topograph inform 1
+seal wac 1
+christopher derhammer 1
+coursewar worthingt 1
+conceptu 2
+us it background 1
+slag 1
+worst baseplat bind 1
+cnd.hp.com 1
+slam 1
+biolog vect 1
+pennsylvan st univer 1
+slap 1
+rut you se 1
+isenfir 3
+owl 1
+bsd fam tr 1
+own 3
+incartat 1
+addit not 1
+as leg research 1
+silver and lead 1
+se th compon 1
+en shimmer 1
+3rd 5
+georg richard samw 1
+valu that comb 1
+lab academ 1
+west bohem univerzitn 1
+contool for us 1
+conflict 1
+form identif 1
+felicitac sant 1
+europ john 1
+report as hypermail 1
+smart agent edit 1
+minoan st form 1
+dev of ital 1
+work doest 1
+weathertop 1
+raw mater 1
+compreh 3
+romulus project 1
+fil ar compr 1
+adjust thing accord 1
+specif configur 1
+correspon text pag 1
+search serv up 1
+might nat 1
+lost thereb 1
+multim other fun 1
+fight sor 1
+crashm aol.com 1
+reconstruc 3
+popl siml program 1
+tavern arch 1
+tic macrolog 1
+learn exper 1
+schutz boardn 1
+paper and talk 1
+transpar when view 1
+rober croft 1
+qu pr own 1
+3tu 2
+empl and stud 1
+caesar expedit 1
+displ your pag 1
+med research 1
+user can cr 1
+siml model 1
+minoan ceram developm 1
+clin biochemister metabol 1
+int law umin1.bitnet 1
+reader to se 1
+learn sc using 1
+measur th ingr 1
+confer on educ 1
+slew 1
+biom sc 2
+littman pat 1
+detail an 1
+virtu world 1
+structur univer 1
+collabor program 1
+word he hear 1
+rn fold softwar 1
+cover inclus 1
+biocomput jok 1
+jfcc jtc 1
+ten to abandon 1
+tim model us 1
+2.12pm on mon 1
+multidim sign proc 1
+pr season 1
+known old 1
+inform ba 1
+redempt 1
+arlingt 1
+futur 12
+15oct92 1
+group wa form 1
+server arent count 1
+biolog imag 1
+internet domain datab 1
+nyc ar 1
+stratif in bronz 1
+bronz ag northern 1
+controller 1
+therefor th weapon 1
+program in human 1
+universit 3
+con sh son 1
+scarc chang 1
+adob 1
+largest fr park 1
+menu featur 1
+length to put 1
+neuer 1
+inform cs 1
+caulyng hym 1
+sk assoc id 1
+henceforth tak 1
+user can go 1
+david schutz 1
+arab mus 1
+bryd wyl 1
+typ of bind 1
+own dy 1
+slim 1
+slip 3
+master in cs 1
+thom colwel 1
+implem of tlm 1
+inclus an account 1
+altern explan hypoth 1
+pag train at 1
+biolog vect sequ 1
+weapon he car 1
+ftp.parc.xerox.com 1
+shar tw sun 1
+alumin textur 1
+settl hierarch 1
+10may94 1
+serv ha lot 1
+no and tail 1
+akron 1
+conclus o conclus 1
+computer aid 3
+instr manufacturer 1
+anywh you want 1
+writ cour 1
+chemister soc univer 1
+striker or thruster 1
+pag start 1
+truth th daughter 1
+ltd cornel 1
+confer on problem 1
+helsink 1
+mayd then fel 1
+asimov faq heinlein 1
+onl new serv 1
+stiff support perform 1
+using lpr 1
+vxwork vm 1
+individu sent 1
+tradit biolog sc 1
+stud design team 1
+wag agricultur 1
+pcr jump 1
+forefinger 1
+se hm filemod 1
+flight poem 1
+jhon 1
+opt configur 1
+interact project 1
+review of cur 1
+quest or com 4
+transg targ mut 1
+pac 3
+addr mailer 1
+pad 2
+regard 4
+kongr.htm 1
+pag 63
+pal 3
+pam 1
+optim method siml 1
+subm tim 1
+pap 1
+par 4
+gambl 1
+nat center 3
+pat 7
+publ ar accompl 1
+tryxt ye hard 1
+pay 2
+configfil filenam 1
+ser work 1
+www.nexor.co.uk arch.html 1
+great hom pag 1
+cour object 1
+symbol system program 1
+work a helluv 1
+intensif and exploit 1
+birth 1
+techn web talk 1
+ba design 1
+pbm 2
+nsabp clin tr 1
+technolog november 1
+want to ad 1
+hyperm develop 1
+internet ind 1
+whatsoever th teach 1
+biochemister departm 1
+wealth landowner 1
+cl libr orthodox 1
+archieplec 4
+doroth 1
+loughborough 2
+chem labor martin 1
+kept a school 1
+entir electron 1
+repr th transpar 1
+natur langu 2
+whereb it common 1
+pcr 1
+umich cl 1
+dendrochronolog 1
+lindahl pbm.com 5
+eabu420 ea.oac.uc.edu mjquibu 1
+pcx 1
+contact 20
+chaperonin tat institut 1
+pdb 2
+lith artefact 1
+cornel univer 1
+slop 1
+interest and descript 1
+restrict enzym datab 2
+openwindow server 1
+fil spac 1
+pdq 1
+examin th featur 1
+slow 2
+pdt 1
+our gl 1
+engineer and structur 1
+techn research council 1
+rap and glov 1
+civinin 1
+want to cr 1
+us with sol 1
+team must examin 1
+tran aegean 1
+ecol init 1
+do system 1
+dick greenhaus 1
+val man fear 1
+bronz ag europ 1
+gif transpar tool 1
+pek 1
+embl dat libr 1
+sen for archaeolog 1
+sl th board 1
+pen 6
+ital quot pa 1
+gopherspac pag 1
+per 2
+pag inclus tabl 1
+shop equipm 1
+disdayn 1
+rel on janu 1
+extol hi lad 1
+mcnult feel 1
+school to teach 1
+leptiminus prov 1
+aud server.html 1
+fr coupon good 1
+educ li 1
+investig wer pursu 1
+ulp tr 1
+docum is reproduc 1
+protein datab 1
+medief ren brew 1
+alter or complaint 1
+pilot european imag 1
+viscount hereford 1
+opt o upd 1
+center pharm server 1
+staff or half 1
+olymp 3
+monast 1
+wak forest 1
+palmer that featur 1
+univer of minnesot 2
+man find 1
+champagn 1
+using you select 1
+shorter 1
+har.com 2
+using microsoft draw 1
+cop with scarc 1
+larger prap 1
+lagrang remap 1
+cal bitnet listserv 1
+worth know 1
+altertumskund 1
+color map entr 2
+sydn univer 1
+hau amongst 1
+escrib aqu tus 1
+laboratoir d partem 1
+phd 1
+cultur expr 1
+go seek 1
+mad po bulk 1
+phl 1
+medinet habu 1
+want to ge 2
+phr 1
+ea to identif 1
+infospac fl featur 1
+mak short work 1
+alcock 1
+seem to compar 1
+digit 11
+phy 9
+strong blow 1
+search and internet 1
+want to go 1
+tak a fal 1
+domain datab 1
+law lib feb94 1
+pedr research tool 1
+cg driv mater 1
+mak men 1
+pig 3
+nobl sc 1
+compiler and interpreter 1
+pik 1
+pil 1
+prov prof consult 1
+pin 1
+perform conver 1
+pip 2
+pir 1
+contain 22
+pit 1
+oxid 1
+evid for soc 1
+map th adv 1
+le tw stand 1
+educom new sum 1
+quean of hym 1
+techn research 1
+cont of cariadoc 1
+pjf 1
+refer pag 1
+stud inclus 1
+nmr softwar 1
+somewhat circl 1
+bask br 1
+leukaem me 1
+order for dist 1
+humb crav 1
+us with sun 1
+alt.food.coff rec.food.drink.coff alt.drug.caffein 1
+uk high educ 1
+whereof th wheel 1
+gen and genom 1
+redeem hi lost 1
+contain a saf 1
+specif letter 1
+tool lik xv 1
+cmd usr 1
+weapon fal fight 1
+capabil to aplac 1
+serv o seqanalref 1
+optim in circuit 1
+turn a turn 1
+specif design 1
+good account 1
+answer var 1
+inclus da upd 1
+cool proc 1
+faseb 1
+fight answer 1
+avail fr 1
+sc of biolog 1
+good further 1
+foreign 4
+mon ar start 1
+act shap model 1
+ply 1
+plz 1
+forc to spec 1
+saying un listproc 1
+theor biolog 1
+fil and gener 1
+stanford 6
+behalf 3
+user defin 1
+stocat 1
+archaeolog congr 1
+want to le 1
+fight for lif 1
+thereb our limb 1
+scourg of snowboard 1
+no to nic 1
+bourch and louain 1
+fair word 1
+rel in norw 1
+distribut of lith 1
+want to becom 1
+netherland 3
+surv off sic 1
+cur irish manuscript 1
+boot bind 1
+descr 1
+pad for human 1
+biotechnolog o p450 1
+ind or followsymlink 1
+ad consider 1
+fail to chang 1
+urquel on tap 1
+pob 1
+spit out link 1
+pog 1
+eng is construc 1
+board 6
+reason for du 1
+pol 11
+accelerometer manu 1
+pop 2
+effect fash 1
+oxid hom pag 1
+usr loc bin 1
+por 2
+pioneer 3
+nyu med 1
+pot 7
+inform us 2
+model and fract 1
+metabol mac 1
+pow 1
+bask go 1
+server resourc 1
+player p.o 1
+radiograph hom pag 1
+com hether 1
+reconstruc past veg 1
+singl dagger 1
+reason 10
+la red 1
+r.i 1
+educ vr 1
+wh appl 1
+ppl 1
+ppm 1
+amer onl 2
+group of research 1
+wysiwyg hypertext 1
+deser 1
+main an mod 1
+mail from peopl 1
+boast 1
+tak a fil 1
+usenet new.answer 1
+prov insight 1
+tim fal 1
+torib 1
+botan o biochemister 1
+architectur complec 1
+center wh wealth 1
+men man tim 1
+watch to def 1
+spool mail 1
+mak a tart 1
+ch from cs 1
+wan and pal 1
+caught 2
+me caus 1
+stat div 1
+using map 1
+port cit 1
+stat o molecl 1
+stud and practitioner 1
+lodgd 1
+research facil 1
+wahl 1
+program in biochemister 1
+migmodel 2
+larch olog en 1
+singl malt whisk 1
+light lou forc 1
+error and mi 1
+quarkxpr docum 1
+window arch 1
+init count fil 1
+mach read dict 2
+pin with quietn 1
+aect 1
+said th bruer 1
+contain us inform 1
+tak sometim clean 1
+exper grow 1
+behard 1
+inform is tak 1
+detail inform transpar 1
+aegean world 1
+count chang 1
+eabu420 ea.oac.uc.edu 1
+displ th transm 1
+st about computer 1
+repr a separ 1
+wait 1
+pst 1
+engineer th computer 1
+psy 1
+prior for research 1
+ba on anim 1
+emerg of aegean 1
+incent for surplus 1
+ruin at rion 1
+zer and incr 1
+meager 1
+food and lib 1
+ed libr 1
+fact ha caus 1
+archaeolog fieldwork server 1
+classif sect 1
+want to se 1
+desir 5
+pr wench 1
+pl report 1
+nat univer 1
+mak me210 1
+god vycar 1
+agreed to mak 1
+part therein 1
+pub 2
+nothyng 1
+wisconsin madison 1
+stripl susp substr 1
+yourself to hid 1
+pum 1
+pun 2
+austr in austr 1
+neglect ar 1
+simpl model 1
+pur 1
+surest guard 1
+put 12
+window wil appear 1
+hau pind hymself 1
+mak imag transpar 1
+nothyng wyl moou 1
+wscg97 1
+thereb ha lost 1
+lin ge doc 1
+secon produc 1
+prot annot protein 1
+using aplac 1
+emin learn sir 1
+honor of william 1
+model of soc 1
+hom2.htm 1
+walk 5
+ground or principl 1
+industr engineer 1
+imag view 1
+eabu420 rigel.oac.uc.edu 1
+sherrat 1
+anim gilber 1
+net person 1
+val gentleman 1
+want to us 2
+univer law libr 2
+web th greek 1
+complec soc 1
+highbur 1
+tabl of el 1
+educ avail 1
+iron man 1
+hotbot robot 1
+biolog novag 1
+se th mail 1
+educ for northern 1
+conclus remark 1
+datab seqanalref sequ 1
+list maintain manu 1
+job and career 1
+author of paper 1
+subscrib law 1
+cg program 1
+avail for linux 1
+sequ within emac 1
+wand 1
+bishop of oran 1
+houseband to discl 1
+project archaeolog 1
+regl and administer 1
+bryan bentl 1
+canad o departm 1
+imper colleg uk 1
+opt degr 1
+form templ 1
+sw 3dim 2
+support for run 1
+want 25
+chemister server 1
+client wil lov 1
+orthop 1
+administer group 1
+articl and inform 1
+terminolog 1
+research ar 1
+med imag research 1
+beaut older 1
+hm showhtml boolean 1
+peopl laugh 1
+archaeolog ireland 1
+orthodox church 1
+bask must prepar 1
+pyl 2
+foot drag 1
+person 13
+amin ac composit 1
+html guru 5
+cl with sword 1
+pyr 1
+lingu etc 1
+hoac 1
+run to upd 1
+hist settl 1
+heideg old 1
+simp em cultur 1
+mak a feast 1
+slyper fast 1
+electrotherm diod 1
+word do neuer 1
+sourc cod avail 1
+commun brochur contact 1
+4th 2
+gard fight 1
+nic.switch.ch 1
+henr david 1
+protein sequ 2
+inform and resourc 1
+displac.gl spher 1
+research cs 1
+lab sum 1
+model fluid 1
+forth bloud stream 1
+osmanag lagoon 1
+short or conv 1
+herbar biodiver 1
+inl acc 1
+hexadecim rgb tripl 2
+smel 2
+fourth 4
+2de protein 1
+us search 1
+mail list 8
+tim lain hid 1
+me to sant 1
+ward 1
+mer new ballad 1
+stuff vi ftp 1
+datab from anu 1
+teltech research 1
+warm 1
+warn 4
+plough and past 1
+design to pr 1
+sev or eight 1
+li no def 1
+contain th red 1
+developm of civil 1
+compar guid 1
+council for england 1
+surf dead 1
+al wil mak 1
+construc.thank 1
+dynam diffract 1
+softwar for cl 1
+canad rat 1
+wast 1
+peer pressur 1
+wif doeth retir 1
+method and appl 1
+labor o theor 1
+prap stud ar 1
+diachron 1
+neurosc internet resourc 1
+execut dec regard 1
+imag proc imag 1
+dn rn protein 2
+le11 2
+wh leukaem me 1
+imbroc or stoc 1
+unwield 1
+el sheffield 1
+closer inspect 1
+watr 1
+gopher list 1
+biomolecl structur 1
+annu christm part 1
+resourc for maint 1
+computer siml 1
+alphab 4
+minut quick 1
+hospit massachus gener 1
+prof developm 1
+list discount travel 1
+bi internet 1
+mi web 1
+adv than sword 1
+smil 1
+www de larch 1
+ital skil 1
+us th border 1
+pag prec 1
+marker 3
+farewel 1
+medinet 1
+co cr 1
+expir fin cop 1
+inform or know 1
+cod search 1
+imag is perm 1
+imag by simp 1
+grant form templ 1
+quiz sw 1
+sup compn 1
+desper run 1
+deer th bruer 1
+rap stand 1
+award nebl award 1
+de aveir 1
+text ind 1
+big lik transworld 1
+saccharomyc genom 1
+dam doeth 1
+sourc for fresh 1
+jink 1
+ch a val 1
+person homep 1
+plac to strik 1
+farm vil 1
+motor rac driver 1
+cur electrotherm 1
+ag archaeolog 1
+ver exagger posit 1
+transport vessel 1
+inser th acc 1
+list of 2d 1
+orig.gif ppmtogif tran 1
+ed libr map 1
+soc rank 1
+therefor produc addit 1
+rel field inform 1
+badam is work 1
+ch hav point 1
+maint of error 1
+help deaf 1
+sound paid therewith 1
+liv invent 1
+sp and touchst 1
+learn environm 1
+part and part 1
+default configur 1
+farmer produc 1
+organ anim behavior 1
+nud dancer 1
+purp nonlin 1
+start a bus 1
+genet softwar 1
+imag manipl tool 1
+thrust do hit 1
+extr tim requir 1
+pulp fict 1
+archiplec 1
+stud learn thing 1
+biochemister cambridg scientif 1
+pueschel imsd.meb.un bon.de 1
+en imag 1
+fuer 2
+analog and digit 1
+pam workshop 1
+perceptu robot research 1
+papyrus digit project 1
+inst th disc 1
+design institut 1
+hau a bit 1
+work fin 1
+eh mh cultur 1
+research mi 1
+pract most pain 1
+teach and research 1
+analyzer 1
+suger 1
+hold 5
+sub agricultur 1
+maydenhead began 1
+roman sit 1
+shap adapt solut 1
+car th wisest 1
+geomorpholog 1
+individu docum 1
+comb beyng 1
+list should inclus 1
+chuck musc chuck.musc 2
+breadth 2
+electr equiv circuit 1
+tv rad list 1
+cel biolog rothamst 1
+mould of flesh 1
+war and domest 1
+as er 1
+fight than heretofor 1
+scrip research 1
+hau your delight 1
+search th archiv 1
+pr cam 1
+server map 1
+labor o comput 1
+cyspid cytoskel 1
+ti sweeter 1
+readm fil 2
+fellow 3
+need neighbor 1
+menu search 1
+half fl 1
+loc construc 1
+redirect 1
+straight and narrow 1
+fil download 1
+thigh 1
+term of strap 1
+hot tip 4
+heard them cry 1
+join our listserv 1
+appropr 6
+third caus 1
+pr o biochem 1
+hood 1
+scruznet.com 1
+gradu cour 1
+project and resourc 1
+alp sk boot 1
+support stud pertain 1
+hook 3
+junior cl leagu 1
+workst run sun 1
+hoop 1
+falkland island 1
+transm lin 2
+badam is somewhat 1
+mother celebr 1
+old world archaeolog 1
+hoop vp 1
+computer system integr 1
+tier obeletz part 1
+lament 1
+egyptolog fieldwork 1
+mat serv 1
+wisem 1
+2nd world congr 1
+toc.html 1
+wiser 1
+prov th inform 1
+orient serv 1
+form of intern 1
+refus th thing 1
+plan cal 1
+suppl internet serv 1
+archiv find 1
+univer florid st 1
+neat to watch 1
+environm for engineer 1
+natur biotechnolog 1
+nic and compl 1
+he oudheidkundig bodemonderzoek 1
+slight 1
+markov 1
+adjac 1
+mult enzym 1
+quick grow dat 1
+fish sauc 1
+pr pictur 1
+transpar hook 1
+cultiv ever tot 1
+chr benson 1
+wa sourc 1
+circuit theor labor 1
+tub eu 1
+addr inform 1
+expr on mon 1
+diagnost radiolog 1
+com captur thewith 1
+tract lexicon 1
+giv tim 1
+softwar hypermail 1
+adv of tabl 1
+hug award 1
+publ by softwar 1
+pl email c.bird 1
+shock 2
+domain 4
+hort 1
+complec or adv 1
+spring kernel concept 1
+gaspard 1
+panel search 1
+haikarain 1
+swarm 1
+problem stat 1
+digest listproc 1
+blow mor danger 1
+power author oper 1
+univer arch 1
+popplest 1
+manufacturer of biochem 1
+host 7
+reg scal 1
+requir and perform 1
+acc count replac 1
+drop in ol 1
+conv on rad 1
+promot trad 1
+fund 6
+pattern to captur 1
+control panel 1
+articl publ 2
+instruc on inclus 1
+contribut to mak 1
+hotl 1
+develop elsewh 1
+cambridg philolog 1
+chemicool period tabl 1
+moulon 2
+gopher list ind 1
+hot top 1
+mbt map 1
+loc acc 1
+consider of flec 1
+word and sent 1
+anc medicinemedicin 1
+faq u.s 1
+system wil con 1
+loc resid unit 1
+mak memor 1
+thing 14
+oper system 3
+und th lach 1
+modern lib 1
+put th forefinger 1
+mail list arch 1
+mak himself read 1
+hour 6
+inclus input 1
+think 13
+onl computer softwar 1
+mov to leptiminus 1
+hous 8
+dth01 1
+consult an styl 1
+phylogenet tr 1
+po of crop 1
+fam ba aud 1
+roy genealog dat 1
+qmw 1
+singl entr 1
+therefor ev man 1
+woman had mock 1
+colleg of virgin 1
+lo defin 1
+christm tradit 1
+quick simpl 1
+run east west 1
+edit by greg 1
+problem stem 1
+man shal behav 1
+reject th not 1
+foc yellow pag 1
+find item 1
+markup 2
+tak to accur 1
+markus 1
+sit at ftp.parc.xerox.com 1
+robot gener 1
+mailer to dick 1
+great incr human 1
+ot loew 1
+ribosom 1
+assoc of virgin 1
+car pioneer 1
+hau defind 1
+establishm 2
+prof of arm 1
+nat de 1
+board perpendicl 1
+fr park structur 1
+fin tun 1
+ms160 arch 1
+furn 2
+nat du 1
+const search 1
+bruer bold 1
+ignor ca 1
+standard me 1
+review of biochemister 1
+s.e 1
+asc digit 1
+chang mon 1
+prestig item 1
+hol cr 1
+third 10
+sluvc.slu.edu 1
+mov beast 1
+typ simpl 1
+inser edit 1
+assum th handrail 1
+nexor hom pag 2
+thirt 2
+us of boot 1
+foot calendar 1
+intern clear 1
+thisb 1
+signior 1
+anim husbandr 2
+sit which appear 1
+mic farm 1
+nitr snowboard part 1
+power search 1
+almight 1
+oxford univer center 1
+continu steel edg 1
+sor insenst 1
+archiv b http 1
+model for ga 1
+cancer risk fact 1
+silicon capacit 1
+hard belief 1
+quest 2d 1
+fletestr 1
+keep that dist 1
+confirm by cluster 1
+wobbl 1
+snowboard norm inclus 1
+webdirect 1
+nexor.co.uk 2
+strong perturb 1
+project geosim modl 1
+genet cr 1
+speed put 1
+custom build 1
+pr in detail 1
+heat or cool 1
+arc inf 1
+biter 1
+evolut program 1
+spindl whorl prov 1
+lab tom 1
+laurel ai.mi.edu 1
+blow to thrust 1
+suggest 9
+molecl cytogenet lawr 1
+homep rasmol 1
+tom jam 1
+solut model 1
+older pag 1
+weep ey 1
+oxford 4
+rumor 1
+project ha excav 1
+vid ba biometer 1
+den he houseband 1
+us textphon 1
+qu consignm 1
+responsibil 1
+mailserver sit 1
+univer of florid 1
+geoffr bryan 1
+four transform 1
+nroff 1
+tim th docum 1
+siding 1
+mak a perfect 1
+schoolmaster or ush 1
+control learn adm 1
+run under do 1
+tim ar good 1
+austr alp 1
+mead or mdc 1
+snak 1
+technolog connect 1
+vant of men 1
+fract 1
+snap 1
+manufactur of produc 1
+collect exclus 1
+tagger 1
+rygorus 1
+melan ii 1
+chicag 2
+feel would put 1
+le me know 5
+centr polit 1
+fight to fight 1
+oct stream gif 1
+amphor neck 1
+ag palac 1
+nonuniform 1
+langu to construc 1
+bother by relig 1
+karl sim 1
+morow next 1
+smart agent 1
+docum serv 1
+register char 1
+im neighbor 1
+modern telev 1
+tuit and research 1
+articl 3il4h4 3ht 1
+tr light ceremon 1
+blow their hand 1
+telescop pictur hist 1
+rel sud 1
+short 1
+tim giv 1
+tim or effort 1
+photographer 1
+easiest way going 1
+got to us 1
+filter and ignor 1
+kranner art 1
+lean stanc 1
+term and init 1
+doest mean 1
+eldest 1
+hen micr arch 1
+sundr procur 1
+int stud 1
+ad or redef 1
+hand mad 1
+5th 1
+contain system 1
+talk exampl 1
+chick wing 1
+sw hart 1
+plac by chang 1
+system prov ext 1
+hand your staff 1
+migr model 2
+propound accord 1
+think it help 1
+explicit overwrit 1
+geschicht einer mutter 1
+yoy.zcu.cz 1
+www.nexor.co.uk 2
+rudjev 1
+subscrib and unsubscrib 1
+simmon 1
+night dinner 1
+sort by thread 1
+hpcc 1
+nanoprob 1
+geometer reason 1
+failur is rel 1
+miscellan bi 1
+lindahl lindahl pbm.com 1
+sh for ren 1
+genet cod 2
+vnworth most ma 1
+tool for teach 1
+lawr berkel 1
+system integr 1
+massachus gener hospit 1
+sud turn 1
+zenec 1
+non www refernc 1
+fl mot 1
+becom as good 1
+gard register 1
+upd arch 1
+archieplexform at univer 1
+child hurt 1
+premiership tabl 1
+system prov 1
+webmaster www 1
+offer you educ 1
+presum al polit 1
+result in surplus 1
+gam theor 1
+preh settl 1
+loc http 1
+twelv kilometer 1
+addit program 1
+phy loughborough univer 1
+enabl me210 stud 1
+fair coar 1
+count color 1
+frolick 1
+great adv 1
+shown 2
+acquir skil 1
+nat sc 1
+nat sk 1
+imperfect length 1
+follow link 1
+by and arab 1
+harvard med school 1
+fil contain 4
+biolog internet resourc 1
+pl guitar 1
+microstructur with non 1
+mi docum serv 1
+project overview 1
+head tag 1
+wholesom 1
+chemister o molecl 1
+mad he mad 1
+load html 1
+kel museum 2
+oudheidkundig bodemonderzoek 1
+snowboard link 1
+plumb 1
+fish sc center 1
+atl and geograph 1
+troop def 1
+introduc to leg 1
+multidim 1
+tran model 1
+sit belong 1
+hpgl 1
+research tool 3
+fl height 1
+entr by organ 1
+snow mask techniqu 1
+lou i dy 1
+educ project educ 1
+bandwidth fr ver 1
+saf rel 1
+switzerland biocomput 1
+demon pictur 1
+kirk mckusick 1
+tr with forc 1
+instruc for subscrib 1
+crossner 1
+sword arm 1
+pr redoubl 1
+bioph chemister 1
+molecl biolog weblog 1
+bol and ital 1
+greg lindahl 6
+www confer 1
+bioinform 1
+de fisiolog 1
+phy siml 1
+franc 6
+ver of hypermail 1
+html fil 3
+electron beowulf 1
+biocomput 2
+rac 4
+rad 7
+blount of isenfir 3
+raf 1
+rag 1
+mother and father 1
+using th flag 1
+magnet 1
+bsd system 1
+fifth intern confer 1
+accompl 5
+ram 2
+ran 2
+rap 1
+stanford rel 1
+avail in hardcop 1
+rar 3
+ph of human 1
+inform about select 1
+upd increm 1
+rat 5
+rau 1
+raw 1
+ray 2
+output result 1
+smaller 4
+weather 3
+habit or perfect 1
+vergil ms vat 1
+search in var 1
+stroller 1
+systemat 1
+addtyp direct 1
+srm.conf fil 1
+stratif marl bedrock 1
+former sov 1
+terrain particl 1
+dissem 3
+croft brown 1
+computer virus 1
+disser 2
+orient gopher list 1
+nettwerk 1
+poison 1
+yellow 2
+flight test 1
+interdisciplin 6
+neglect 2
+hither 1
+classif 3
+clearingh on read 1
+gopher thesaurus lingu 1
+loppidum 1
+cr refer yeast 1
+fear of further 1
+metalwork took 1
+drink beer 1
+discount travel 1
+old first year 1
+gif addtyp 1
+newcastl upon tyn 2
+hubbl telescop pictur 1
+maim incur 1
+coml cloth plainl 1
+snow 4
+eng search catalog 1
+michigan al stud 1
+sh o dream 1
+drop log 1
+research fellow work 1
+reb 2
+oxford st 1
+rec 10
+ext walk direct 1
+red 6
+s.tognot 1
+ingratitud doth me 1
+reg 8
+ec lat cod 1
+rel 32
+clearingh for subject 2
+rem 1
+ren 3
+ba resourc 1
+rep 1
+fabl c.b 1
+rer 1
+cultur of cr 1
+french genom 1
+tabl war 1
+rev 8
+rey 1
+fr to explor 1
+feat of arm 1
+typ rec 1
+ge mor mean 1
+rfc 2
+xerox parc 3
+diversif 1
+pc do program 1
+dd search 1
+evolut hypertextu 1
+for aft 1
+lyuyng 1
+therein 2
+biotechniqu magaz boehringer 1
+over program 1
+protein chemister labor 1
+leg encyclop 1
+typ rfc 1
+dem of migr 1
+rgb 2
+graph hardwar 1
+cultur of ec 1
+korakou 1
+count and compil 1
+scarc worth 1
+cultur of eh 1
+gal inclus 1
+integr compan biolog 1
+camer read 2
+mediterranean writ 1
+pcr method 1
+biomechan 1
+biolog rothamst experim 1
+instruc 7
+good venison 1
+spat refin 1
+runaw 1
+educ modl 1
+thing to learn 1
+imperfect instr 1
+folk rock band 1
+fraud 1
+dakot st univer 1
+wa direct 1
+highlight border 1
+thus th sport 1
+expir paper deadl 1
+how dbh 1
+writ th fil 1
+abl to dec 1
+libr program 1
+abl to def 1
+ba cover 1
+chemister th ot 1
+pl email 1
+anu o form 1
+li stil watch 1
+load libr 1
+fil contain appropr 1
+enh adver 1
+journ of computer 1
+univer of hamburg 1
+drew eckhardt 1
+ologisch 1
+territ right 1
+jan and zangger 1
+kil a man 1
+rib 1
+ancest 1
+mo floor 1
+ric 1
+collect intellig 1
+rid 2
+crystal pack 1
+rig 1
+thrust or stoc 1
+rik 2
+rim 1
+sw saint 1
+everywh 2
+typ thr stud 1
+de recherch 1
+mad challeng 1
+riv 2
+genom sequ 1
+internet interfac 1
+poyson doth lurk 1
+comput imag 1
+xxx secon part 1
+cit sport 1
+thin veneer 1
+spac to def 1
+flour fal 1
+canad soc 1
+benefit 2
+techn inform 1
+field of dram 1
+de mec 1
+hast he hom 1
+livermor nat labor 1
+biolog guid 1
+satisf 4
+term you car 1
+grimberg hom pag 1
+netbsd openbsd 1
+protein engineer 1
+sound to hurt 1
+baccigalup say 1
+zin in gener 1
+ri de janeir 1
+cover technolog 1
+leftover 1
+head he got 1
+ch to diversif 1
+man soever 1
+surfac group 1
+singl rap fight 1
+step by step 1
+wear lead sol 1
+manu optim 2
+cod text 1
+north dakot 1
+such fe 1
+flesh to tear 1
+reason wherefor 1
+dat somewh 1
+thereof 2
+cach 1
+cal for paper 1
+mailbox is sort 1
+sc centr 1
+william smith 1
+husbandr 2
+rocc hi hous 1
+differ between uk 1
+biotechnolog compan 1
+health sc labor 1
+hous project bleep 1
+record 6
+deceiver and murderer 1
+protein ma spectr 1
+jl am 1
+univer computer 1
+album wa rel 1
+hypermail work 1
+val disposit 1
+circumfer to def 1
+lead 6
+leaf 2
+tak aw 1
+actu a48 1
+webmaster www.aplac.hut.fi 4
+col anyw 1
+proc and speech 1
+lean 1
+robot ind 1
+leap 3
+leau 1
+leav 5
+.htacc fil 1
+christus rec 1
+stud lith 1
+ge to work 1
+altogether upon var 1
+caer 1
+art or sc 1
+ny homep 1
+rob 2
+lloyd turner 1
+rod 2
+ag biotech 1
+men being val 1
+rol 8
+pag on cog 1
+rom 6
+interdepartm 1
+caff 1
+judg shal find 1
+com eventu 1
+magnetometer and geolog 1
+row 2
+hor and man 1
+rox 1
+roy 3
+collabor research 1
+search dd 1
+major top ar 1
+toom wkt cs.adf.oz.au 1
+sender 1
+chemister hahneman 1
+ramish 1
+accelerometer is develop 1
+roman north 1
+700th contribut 1
+exploit and futur 1
+portrait gal snow 1
+nexor ltd 2
+patl lc.mi.edu 1
+help but grow 1
+cour list 1
+cagl 1
+specif map 1
+di a mayd 1
+overcom 1
+bout apiec 1
+chuck musc htmlguru 4
+bioph journ european 1
+jackson found 1
+prec isotop 1
+wisem in learn 1
+cover th sc 1
+imag cod ba 1
+leed 3
+esp form 1
+pcr jump stat 1
+writ th report 1
+death thereb 1
+cs inform 1
+heinrich 1
+gam virtu museum 1
+inclus format html 1
+soc ca western 1
+rrn 1
+loc bin 1
+ftp.uu.net 1
+fl ner 1
+nat genom 1
+docum is acc 1
+nodigest 1
+soc assoc 1
+nih gopher 1
+workshop on non 1
+dagger man 1
+dav tucker 1
+swiftest mot 1
+east roman 1
+aa832 freenet.carl.ca 1
+problem of acc 1
+aler contain 1
+mer cook 1
+walter gilber lab 1
+rsn 1
+rsr 1
+forc you ap 1
+ind biochemister 1
+rst 1
+geosim siml 1
+snowboard deb 1
+fault 1
+bryan 1
+metal o fibergl 1
+plac hi ward 1
+mont carl 1
+cit ba 1
+prim sourc 2
+writ and link 1
+person html fil 1
+rtf 1
+mechan proper inclus 1
+nucl ac 2
+enforc thereb 1
+californ at berkel 1
+institut of mar 1
+siml using 1
+me off weather 1
+prelimin stud 1
+csu bioweb biotechnolog 1
+electron school 1
+rub 1
+mesf and jf 1
+genomenet austr nat 1
+cald 1
+le cran 1
+run 22
+calf 1
+aegean archaeolog 1
+protein structur predict 1
+rur 2
+vnderstand 1
+brigham wom departm 1
+rut 1
+shov th board 1
+computer sc stanford 1
+tr ind giv 1
+co oper 2
+ba polit funct 1
+sk patrol 1
+prop and support 1
+addit to famil 1
+stud pertain 1
+minnesot team 1
+cur awar serv 2
+roman empir 2
+model account 1
+half drunk 1
+camp 1
+aquar inform 1
+astroph context 1
+intellig pop 1
+dagger men 1
+john christopherson 1
+establ or maintain 1
+alt geschicht 1
+soap 1
+implem under sun 1
+fastest 1
+int surv 2
+squeez 1
+turk leg 1
+law of natur 1
+server melan 1
+austr biotechnolog assoc 1
+cant 1
+d.homolk ic.ac.uk 3
+incr sk 1
+swift mot thereof 1
+me appear 1
+newsgroup with ad 1
+further our pictur 1
+plester brommel 1
+tradit folk 1
+soc and chr 1
+exerc of weapon 1
+islam 2
+december 9
+nlp interest 1
+runnel prefer 1
+loc mirror 1
+bold mak 1
+agil 1
+rec.travel libr 1
+lut inform 1
+remov spat 1
+assoc baylor 1
+unserv in war 1
+barl field 1
+inclus an email 1
+gr gi 1
+se bil gat 1
+ryh 1
+mat sk boot 1
+heart pr 1
+giftopnm orig.gif 1
+med underground part 1
+custom 5
+bioph larg scal 1
+ant kal 1
+bi inorgan chemister 1
+cal watkin 1
+educ suppl internet 1
+arm men 1
+death hoac 1
+ix.netcom.com last rev 1
+continu disc 1
+geomorpholog recon ind 1
+capt 1
+imper cancer 1
+bipart nuclear loc 1
+6th 1
+pattern search 1
+hand nak 1
+archaeolog web resourc 1
+list of me 1
+truth thereof 1
+tomb wa brought 1
+select www 1
+ter winograd 1
+palac of nest 1
+snowboarder or parent 1
+hol grail 1
+lent 1
+card 2
+thr scarc chang 1
+genet cr refer 1
+sequ kloth 1
+mous loc 1
+carl 3
+carp 2
+cart 1
+carv 1
+mh to lh 1
+ensur 2
+twelfth paradox 1
+leon 1
+univer of colorad 2
+ward of def 1
+lingu form 1
+alexander 1
+re brookhav nat 1
+ital ward 1
+teach their schol 1
+jacob lullab 1
+soft 3
+teltech research chair 1
+utter sham 1
+hen israel taiwan 1
+centr st 1
+lepc 1
+computer dem 1
+commun de puyloub 1
+cast 3
+langu proc 2
+casu 1
+dexter manipl 1
+prospect 2
+stronger 1
+count ge 1
+derek brownjohn ar 1
+lept 2
+fr on lin 1
+mm ib cr 1
+intern tlm workshop 2
+bioph and biomolecl 1
+tag ar avail 1
+reach 7
+proc which stretch 1
+onvil 1
+pac stand 1
+react 2
+rap fight displ 1
+tim may becom 1
+dagger ward 1
+dead celebr 1
+spirit with perfect 1
+abstract intern confer 1
+fich de 1
+qualif docum path 1
+loc bus 1
+readm 3
+cl or hel 1
+caus 6
+caut 1
+sampl circuit 1
+third part annot 1
+pag confer 1
+inclus loc bus 1
+design to overwhelm 1
+soil 3
+87k 1
+peopl to se 1
+austin bagger 1
+user know 1
+snowboard commun 1
+world learn exper 1
+inform about intellig 1
+biochemister departm cel 1
+grasp plan geometer 1
+berkel ded 1
+expr of aal 1
+break both blow 1
+cr4 center 1
+rank high 1
+archiv me 1
+fangl ag 1
+subscriber listserv 1
+lesl 1
+macperl ver 1
+lest 1
+server sipb mi 1
+specif filter 1
+group of peopl 1
+bryng 1
+mak your fil 1
+produc an unst 1
+biotechnolog inform 3
+leth 1
+def a strong 1
+techniqu for acquir 1
+speed ran 1
+ag europ 1
+cupol tomb 1
+nam and giv 1
+abl to reach 1
+hit th bod 1
+rec.skiing.alp 1
+sleep 3
+program of research 1
+quer 4
+hugh med 1
+character to mak 1
+reagn 1
+sold 4
+leptiminus export numer 1
+sab 1
+saf 4
+slight differ 1
+strik without lo 1
+leuv 1
+sal 3
+san 6
+kolon 1
+sat 1
+sau 1
+sav 3
+saw 4
+intern direct 1
+stad cem contain 1
+say 5
+magnetometer wa succ 1
+pl th part 1
+troubl download 1
+partnership 2
+unsaf in singl 1
+rol death 1
+smith chart 1
+fight weak 1
+michigan o clearingh 1
+sbh 1
+design div 1
+resourc 30
+babylon and egypt 1
+sbp 1
+computer search 1
+numer hydrodynam 1
+look somewhat transpar 1
+yah spec ind 1
+serv your favor 1
+journ cover 1
+european snowboard 1
+inclus resourc 1
+pain never hur 1
+song 5
+complaint from sk 1
+advertiser 1
+using a transl 1
+popl mail 1
+book html 4
+fr to sen 1
+aqu anim gilber 1
+flour under roman 1
+inst brush alumin 1
+pork loin 1
+control how peopl 1
+third member 1
+restrict raw mater 1
+nucl ac sequ 1
+favor c compiler 1
+quim 1
+soon 1
+form resolut 1
+mak incr sk 1
+succ in loc 1
+palac itself took 1
+popl wa appar 1
+show featur 1
+quiz 3
+stoc guard 1
+siml an optim 1
+ea tailor 1
+pun period 1
+problem increm upd 1
+soph 5
+request publ 1
+sed 2
+rewrit 1
+start to ge 1
+distribut controller 1
+driv to suffer 1
+sel 5
+sem 4
+biolab hom pag 1
+sen 26
+cytok bl recombin 1
+sep 2
+web writ www 1
+produc archiv 1
+ser 11
+group archiv 1
+grid collect 1
+say neal 1
+sev 5
+lec part par 1
+sew 1
+preec 1
+introduc to mlm 1
+backcountr snowboarder 1
+work retrief 1
+storefront 1
+imag view tool 1
+institut for cancer 1
+colon organ anim 1
+redoubl or reviv 1
+vnt he beck 1
+sw model 2
+fight accord 1
+contool 3.3a sourc 1
+tactil 1
+law log9406 int 1
+chaperonin 1
+luxur good 1
+distil 1
+plac to st 1
+law internet train 1
+rodn brook alif 1
+ar inclus dexter 1
+chang sk percept 1
+browser that support 1
+plainer dec 1
+mountaineer boot 1
+ch when op 1
+lin biolog 1
+newcastl 2
+introduc and exampl 1
+med commun stud 1
+sort 11
+lab bioinformat 1
+onl.html 1
+nexor 2
+rambl 1
+coordin 3
+mount ath 1
+hid or doubt 1
+energ metabol 1
+vaclav skal computer 1
+leed univer cognit 1
+anc greec 1
+cmu artif 1
+book any perfect 1
+insur ch 1
+soc worker 1
+anc greek 2
+count se 1
+outskirt 2
+vsing my fat 1
+inform technolog off 1
+map pl le 1
+electrophor datab sw 1
+ro betim 1
+instr appertain 1
+number of electron 1
+instr can mak 1
+mail ack format 1
+art of arm 1
+erlind 1
+sic 3
+sid 8
+beat open fight 1
+leader in web 1
+carolyn wiener 1
+folk song 1
+mov of peopl 1
+sil 3
+sim 1
+aid molecl 1
+spoyl th se 1
+scarc 4
+sir 3
+sit 31
+siz 4
+roger schank 1
+tru displ 1
+quod 1
+kpt displac.push 1
+sant quiz 1
+contour level 1
+soul 3
+soup 1
+quot 3
+sous 2
+ec of power 1
+model shop 1
+ver november 1
+digit interact atl 1
+cytoskel 1
+sheft museum univer 1
+sju 1
+analog 3
+modern snowboard 1
+consignm cloth 1
+mak loc bus 1
+neugriechisch 1
+fanc to writ 1
+affil 3
+touch 3
+libr biolog 1
+disc th st 1
+vrij universiteit 1
+slept 1
+escherich col 2
+squar 4
+nat geograph 2
+squaw 1
+phylogenet navig 1
+prototyp implem 1
+system model 1
+dn vect codon 1
+sky 1
+ubvm.cc.buff.edu cd nettrain 1
+ctil resourc guid 1
+deform articl 1
+enter 2
+yl nam 1
+quantit tool 1
+snowboarder wh bought 1
+particip object workshop 1
+atmospher 1
+disprov hi hypoth 1
+slu 1
+chang as peopl 1
+good launch pad 1
+therfor 1
+sc center gopher 1
+web browser support 1
+want th front 1
+str new hav 1
+motor rac 2
+random tun manu 1
+rumour 1
+touch of wit 1
+common th strongest 1
+week mail 1
+eventu becam 1
+ter winograd departm 1
+smu 1
+sayd th cooper 1
+campaigner 1
+loc o departm 1
+simpl script 1
+magaz produc 1
+cl.murdoch.edu.au 1
+pag count 1
+tool acc 1
+act crystallograph 1
+sk behavior 1
+record docum 1
+embrac snowboard 1
+implem is fin 1
+wi and prec 1
+enthr 1
+theor and appl 3
+physiolog and bioph 1
+abram 1
+soc 13
+softwar for window 1
+molybdoenzym research labor 1
+hol hol 1
+tart misc 1
+nam wrong 1
+prent 1
+cmd usr loc 1
+cam as somewhat 1
+sol 10
+webacropol 1
+feast to mak 1
+son 3
+artif lif 1
+nimbl 1
+dip wing 1
+snow mask 1
+arizon 1
+sor 3
+sot 1
+sov 1
+sow 1
+chang a docum 1
+mail program 1
+highbur inform tick 1
+proc group 1
+entir 7
+pdq helpl us 1
+alt.food.coff rec.food.drink.coff 1
+u.c 1
+u.k 1
+explor model rel 1
+bruer that vnder 1
+elaw j cl.murdoch.edu.au 1
+theor bioph 1
+spr 1
+u.s 5
+song in ital 1
+buckler fight 1
+continu to docum 1
+biolog universt 1
+default docum 1
+differ between snowboarder 1
+stand within dist 1
+proc web sit 1
+whereb we redeem 1
+medief period 1
+rh term 1
+squ 1
+stud owner john 1
+fight perfect 1
+tung nan 1
+interconnect of molecl 1
+good quarrel 1
+describ as intellig 1
+src 1
+enj liv 1
+chapel hil 1
+loughborough univer 2
+kranner 1
+bod from wound 1
+pay for vsing 1
+exclus acc 1
+prof mart valt 1
+cbit 1
+genob server 1
+onder wrot 1
+inf and childr 1
+orient search 1
+inch for men 1
+sit stand 1
+vliegclub grimberg 1
+harald 1
+tag as imag 1
+cl last gasp 1
+giv to turn 1
+part therein contain 1
+imag of or 1
+squir 1
+tim which se 1
+good ward 1
+inflam 1
+latin and greek 1
+agricultur and industr 1
+status report 1
+screen 2
+karplus 1
+ward li 1
+know that worth 1
+england on october 1
+geograph cour 1
+universidad de 2
+form of surplus 1
+acc method 1
+universidad di 1
+molecl dynam program 1
+prest 1
+devil 2
+frequ ask quest 2
+str 9
+weapon wherein 1
+mlmfaq mlmfaq 1
+washingt univer 2
+sty 1
+graph designer 1
+vain opin 1
+robot research ar 1
+somewhat 7
+pot bon marrow 1
+sub 8
+dec th controver 1
+filter that proc 1
+sud 2
+highest 3
+sum 9
+sun 9
+sup 5
+grow dat 1
+ag northern 1
+sit in geomorpholog 1
+field to fight 1
+sur 2
+subst middl 1
+sut 1
+natur publ 1
+se no reason 1
+serv up univer 1
+biolog unabom 1
+soc in minoan 1
+datab nrl 3d 1
+dist not prev 1
+quantit 4
+fan review 1
+ferreir program 1
+appropr mail 1
+intern civil serv 1
+netfind 1
+sab zlatin 1
+predict 1
+anim fertil 1
+pol and power 1
+toung 1
+palaeosteolog 1
+riseman 1
+gif89a conver tool 1
+jack szostak lab 1
+timesav 1
+favor 8
+wh i go 1
+dissemin such standard 1
+search clin tr 1
+bloud wound 1
+textu inform 1
+cbmt 1
+spac 12
+universiteit leuv 1
+remember a thread 1
+spak 1
+entitl 1
+spam 1
+span 5
+acquisit mot 1
+multifac 1
+spar 3
+spat 2
+reason whereof 1
+sid off 1
+technolog program 1
+nejib ben 1
+addendum 1
+labor publ bibliograph 1
+u.bc 1
+lin after top 1
+author oper 1
+enharmonik record stud 1
+view th lut 1
+faint heart fellow 1
+mount pattern 1
+diversif wa loc 1
+imag tran 1
+museum univer 1
+fmc bioproduc 1
+stud stud 1
+pag ha pointer 1
+airpsac 1
+fal hook 1
+riddler 1
+uk perspect 1
+grow deb 1
+poniard 1
+histogram 1
+art threat 1
+asc digit tradit 1
+collect of postproc 1
+ren brew 1
+robust lec par 1
+anywh el 1
+duk papyrus 1
+pharmac biotech 1
+want for comparison 1
+syr 3
+fireh tavern 1
+therm spread 1
+int reg 1
+command ge 1
+nord jump 1
+empt hand 1
+7th 2
+se descript 1
+structur exp 1
+human 14
+slept fl stout 1
+known sit 1
+mon night footb 1
+miser 1
+slart hom pag 1
+unabom 1
+devot 3
+structur mater 1
+incr view 1
+repr mor recent 1
+alp inform serv 1
+stead level 1
+decompr 1
+ii dat 1
+spec 8
+mus th miamim 1
+div appl 1
+lec datab 1
+follow th simpl 1
+spen 3
+mach tract 1
+humbl 1
+cr being tak 1
+med using 1
+ac datab 1
+def opt 1
+train sect 1
+townscap 1
+isol th touch 1
+gi rel resourc 1
+19th centur 2
+window 13
+fishyng 1
+produc and technolog 1
+paragraph prob remain 1
+construc of terrac 1
+fin war 1
+wherever 1
+imperfect in fight 1
+brow our lunch 1
+instruc technolog 1
+distribut a me 1
+tr hopkin 1
+measur with ie 1
+journ and search 1
+trick ar avail 1
+vinc had said 1
+mak no perfect 1
+cal a problem 1
+insuff heel 1
+workshop ctil 1
+prap over 1
+interest to educ 1
+bitter broyl 1
+stal did laugh 1
+vromoner 1
+cyclad sub 1
+commod 2
+lec research 1
+new approv 1
+ericc 1
+fin good further 1
+boot as valug 1
+book list 1
+common 12
+construc cost 1
+archieplec arosnet arch 1
+learn or pract 1
+prov th ultim 1
+sithd and said 1
+internet train guid 1
+proc and natur 1
+forefather wer wi 1
+se what hypermail 1
+gard fight st 1
+resort stanc 1
+spin 1
+ba molecl biolog 1
+ad a lead 1
+www pag 4
+stretch 2
+spir 2
+spit 3
+center wh 1
+eng for un 1
+complaint 2
+school affil 1
+poor fish 1
+ad mor program 1
+fram altern 1
+pharmacolog molecl neurobiolog 1
+uppermost 1
+period mesh 1
+selkov 1
+josef 2
+chem engineer research 1
+receiv a list 1
+sit.idx fil 1
+reg of me 1
+macintosh 6
+dat for pilot 1
+color scanner 1
+mycobacter 1
+se hm 1
+biozentr 1
+cl ireland 1
+sk boot 1
+descript cont 1
+usag tabl 1
+quest ar answer 1
+surfac den 1
+ten list 1
+program in cel 1
+michigan papyrus digit 1
+want to consult 1
+perceptu 1
+marsh of england 1
+demand 5
+star sit 2
+eventu ar 1
+nath chhuttan 1
+libr walter gilber 1
+rush to embrac 1
+schuman 1
+om ar 1
+plough 1
+ad link 1
+brit columb 2
+chuck.musc 2
+rec.travel 1
+mail postpon 1
+tac 1
+stud design 1
+tag 8
+tah 1
+fight to weak 1
+humil 1
+tak 22
+tal 2
+caus of chang 1
+tam 1
+infostr 1
+tap 4
+tar 3
+tat 1
+analog circuit optim 1
+surviv 3
+contact arseweb 1
+pag titl 1
+univer museum 1
+involut hierarch 1
+chandler dr 1
+good luck find 1
+me libr 1
+bionet electron 3
+man to chang 1
+chamber tomb 1
+profit member 1
+paynt 1
+xrefdb a model 1
+aplac inclus 1
+com in nic 1
+geosim interfac 1
+incr boolean number 1
+tin group 1
+comfind a direct 1
+geosim modl avail 1
+tidbit 1
+seqanalref sequ 1
+list manag mlm 1
+mailbox fil 1
+caus and effect 1
+palat centr 1
+commun 15
+as web 1
+ver number 1
+year old snowboarder 1
+mach support 1
+thank for pl 1
+epicentr 1
+mak sourc cod 1
+film festiv genealog 1
+spok 2
+spon 6
+town in portug 1
+modern sew treatm 1
+mandarin hyp lit 1
+spot 2
+brent lab 2
+lab academ pr 1
+cancernet fil 1
+inform acc 1
+pr wil grappl 1
+listproc av.com 1
+remembr and warn 1
+server par 1
+simpl html 1
+simpl search 2
+cyclad sub econom 1
+ted 1
+tek 1
+fo.com mon jan 1
+tel 13
+help resort accompl 1
+ten 6
+ter 2
+maintain by tecf 1
+tudor 1
+rang from mh 1
+oldenburg in german 1
+widespread cultiv 1
+ren danc cheat 1
+cultur chang 1
+soil and bedrock 1
+cityscap glob 1
+cg bin mail 1
+nomencl datab sequ 1
+spqr 1
+biomolecl model 1
+somersetshir 1
+fin tabl war 1
+suffer plac 1
+docum for inclus 1
+fil or standard 1
+look under cultur 1
+learn sir digb 1
+geomorpholog st reg 1
+rag and bitter 1
+rensselaer chem engineer 1
+html hot 4
+cultur lat 1
+project genquest 1
+method of group 1
+aut download.html 1
+var molecl 1
+se snowboard 1
+delft univer 2
+se th pictur 1
+group european 1
+univer of newcastl 2
+satel in orbit 1
+latin v tel 1
+attack arch 1
+curst wif 1
+bit of implem 1
+www form 1
+men and hor 1
+goal for ar 1
+command vi 1
+mak a sound 1
+baseplat bind 1
+et redempt 1
+further inform 2
+claus fact sant 1
+thr 1
+bug fic 1
+edinburgh univer 1
+med imag 2
+thy 1
+train program 1
+aplac al inclus 1
+tic 6
+ground and rl 1
+guard or ward 1
+settl of kolon 1
+copyright ctil 1
+top announc 1
+land us 1
+romulus project schol 1
+dat ba contain 1
+fourteen 2
+til 4
+design in galac 1
+tim 42
+fast and thrust 1
+slow and great 1
+tin 2
+tip 8
+tir 1
+pink color 1
+domain server san 1
+misus 1
+architectur form 1
+soever he fight 1
+program tak 1
+hal east lokr 1
+interact using 1
+acedb drosophil 1
+antibod resourc 1
+resourc yah 1
+tim read 1
+alfr smart museum 1
+telecom 1
+prepar 4
+spur 1
+nat libr 2
+risk ar 1
+risk as 1
+teach hi schol 1
+outgrowth 1
+centr polit administer 1
+dakot st 1
+pag of link 1
+mak hi staff 1
+columb o macromolecl 1
+north sant 1
+tub eu day 1
+eat with hym 1
+manner of wild 1
+paint a sick 1
+entr ad upd 1
+weak 2
+mcgil o departm 1
+internet disc list 1
+us o bioph 1
+er menczer 1
+land avail 1
+artif med 1
+cl philolog 1
+wear 1
+weav 2
+arch ind fil 1
+stanford top 1
+fratel alinar 1
+acronym alumn 1
+craft and manufactur 1
+read cop 1
+technolog as evid 1
+support for vid 1
+organ particip object 1
+loc what appear 1
+school of def 1
+health sc center 1
+tlm 2
+heinlein faq j.r.r 1
+bus using 1
+lic agr 1
+mobil 4
+ba learn 2
+den erst 1
+wh developm 1
+design eth 1
+command 7
+departm me 1
+contribut to theor 1
+institut o departm 1
+dat and thread 1
+inst acc 1
+naft 1
+entr wh head 1
+cambridg o bipart 1
+latin lexicograph 1
+list in digest 1
+fluid 2
+pursu at romanou 1
+cl from oxford 1
+dieg supercomputer 1
+read to mak 1
+great cun 1
+valorizzaz 1
+plant physiolog 1
+spyd 1
+definit 8
+featur an excel 1
+angl near 1
+spyl 1
+lifesc molecl univer 1
+annik ai.mi.edu 1
+plain appear 1
+list is run 1
+mail at millesjg 1
+lou st univer 1
+7f for green 1
+david tudor 1
+group at mi 1
+heav load server 1
+med soc 1
+rever th command 1
+reg to reg 1
+en inclus 1
+shop enabl me210 1
+carbohydr chemister 1
+weed 1
+tob 1
+phyl pear 1
+toc 2
+tod 2
+pathnam 1
+minoan palat civil 1
+exprest 1
+week 12
+author web ind 1
+tok 1
+further modif 1
+tom 6
+av weather format 1
+world 2dpag ind 1
+ton 1
+weep 1
+top 21
+eastern resourc 1
+tot 1
+tov 1
+aleth group 1
+cruel 1
+toy 2
+snowboard fal 1
+sc molecl model 1
+command for subscrib 1
+rec nab 1
+molecl biolog biomolecl 1
+la veg 1
+an of dn 1
+nam and email 1
+seem he ventur 1
+www server 4
+cretan 1
+deep stud 1
+tr9 1
+amer 95th annu 1
+common term 1
+tradit biolog 1
+pharmacokinet 1
+thruster or warder 1
+admin 3
+microbiolog northwestern 1
+mead mdc 1
+admir 2
+produc addit support 1
+web adver 1
+adv in carbohydr 1
+cel molecl 1
+chancd to me 1
+on we know 1
+ge start 1
+edg or point 1
+corner of lat 1
+handl proper 2
+pl writ 1
+standford depart 1
+react pek univer 1
+virtu re 2
+tel tuneinir 1
+robust assemb fin 1
+instruc technolog research 1
+work at stanford 1
+sit quot 1
+tru 3
+dual track 1
+niner 1
+disp for reconstruc 1
+try 12
+dropl 1
+posit by renfrew 1
+wit or strength 1
+lbl lawr berkel 1
+ba tabl 1
+thereb to judg 1
+ster wer tournd 1
+bioreact 1
+men sick 1
+imag of man 1
+giv tim estim 1
+childer 1
+tak up resid 1
+migr that occur 1
+wyffler 1
+contest 2
+genom inform serv 1
+earliest tim 1
+modif docum 1
+en of articl 1
+nord sbh 1
+departm of crystallograph 1
+html issu 1
+return th favor 1
+ognin 1
+dav schutz 1
+leadership 1
+conver th gr 1
+portland pr 1
+halstead 1
+middl school sc 1
+lview pr 1
+tub 2
+st snowboarder 1
+tud 1
+incr agricultur 1
+bon edinburgh univer 1
+siml wer develop 1
+val fencer 1
+snowbird cl 1
+tun 7
+basin north 1
+bi wurld 2
+var fight 1
+tus 1
+litter remov 1
+tut 7
+concentr in hc 1
+cg script 1
+annot protein 1
+workshop ctil confer 1
+head clov 1
+day thr workshop 1
+datab workshop sum 1
+nift imag 1
+author 16
+imag ar tabl 1
+meister 1
+rap glov 1
+telecommun institut 1
+harbor 3
+proc group serv 1
+murtaz 1
+alejandr lanus 1
+sc def 1
+facult board 1
+status report introduc 1
+organ vehem 1
+wid rang 2
+bratwurst 1
+admon 1
+seem strang com 1
+gather plac 1
+power and quick 1
+aplac tut 1
+badam say 1
+medicin pharmacolog 1
+cigar event 1
+adv is great 1
+search then us 1
+dlopez 1
+mytholog imper romanor 1
+substr microstrip 1
+pc v.3.0 be 1
+stamp brick 1
+quicker to stat 1
+xview 1
+writ hypertext 1
+crystallograph o hist 1
+lack of us 1
+cathol encyclop 1
+bankit 1
+group predictprotein 1
+gopher server 2
+went 5
+an he suit 1
+webtech 1
+netnew.upen.edu 1
+hid markov 1
+context 5
+scarc of evid 1
+inclus hand 1
+insuff to perform 1
+inst spher tip 1
+tyf 1
+plain tic 1
+high educ suppl 1
+tyl 1
+tym 1
+talk of robin 1
+tyn 2
+typ 22
+louyng 1
+sid cut depth 1
+disc what wrong 1
+book fil 1
+disposit or desir 1
+pot to mak 1
+br tag 1
+and curt 1
+review articl 1
+mater from david 1
+me to listserv.ei.cs.vt.edu 1
+user specif map 1
+gener purp 3
+lou day appl 1
+thrust follow 1
+north door 1
+swear 2
+de lantiquit 1
+v8w 1
+evansvil 1
+inclus fl cur 1
+univer o kabat 1
+17jl94 1
+pract of alif 1
+nath 1
+utah onl eight 1
+unskil 1
+sequ dat 1
+industr at kn 1
+sampt97.html 1
+bionet.molb.methd 1
+aler contain inform 1
+sau or el 1
+journ magaz 1
+enzym nomencl 2
+cityscap 1
+view thr dim 1
+detail th hist 1
+publ multim 1
+circuit design 1
+interest html cg 1
+homep for empl 1
+wilkin 1
+offer a list 1
+univer bioinformat 1
+sen forth bloud 1
+extraordin 1
+town christm 1
+tantar 1
+design problem 2
+andersson 1
+john cheek 1
+structur break 1
+appear to float 1
+melan softwar pack 1
+bioph alber 1
+hear th tal 1
+sel hpc 2
+promot your sit 1
+hundr 2
+browser swissprot 1
+west 8
+count and st 1
+mithr 1
+frequ request 2
+inclus common html 3
+interest descript 1
+giftran.ec execut 1
+ind dist 1
+transm aal resolut 1
+saint paul 1
+univer of darmstadt 1
+spir theodor 1
+school a clock 1
+mofil plac 3
+tweak th shad 1
+nem val archaeolog 1
+publ b.v 1
+snowboard manufacturer 1
+quick grow 1
+straightw 1
+dat for haemophilus 1
+cem contain 1
+sweep 1
+aiol 1
+en of continuum 1
+cambridg biolab libr 1
+major top 1
+fa.mus.bel cant 1
+oct stream jpg 1
+gentl pl 1
+molecl funct 1
+ship board 1
+common slain 1
+put th execut 1
+gif87a imag 1
+studentship posit 1
+com to stab 1
+kpt displac.gl 1
+maruel strang 1
+sourc and mak 1
+sit an weizman 1
+leonard katzman 1
+ftp.ee.umanitob.ca 1
+electron text 1
+simpl list 1
+hypertext in web 1
+biochemister and bioph 1
+rev listserv 1
+an biotechnolog 1
+dist th ey 1
+sid fight 1
+olwm or olvwm 1
+molecl dynam 1
+support batch search 1
+dan stevenson 1
+salvador 1
+ncc empl 1
+ol pol con 1
+learn sc 1
+polit chang 1
+aerospac museum 1
+log and banner 1
+cur theor 1
+id ga comput 1
+error and evil 1
+netscap 5
+tackl 2
+old.gif new.gif 1
+tim to keep 1
+archaeolog austr journ 1
+hoouer 1
+channel neur 1
+program typ 1
+robot lab 1
+www.inesc.pt 1
+check to se 1
+gradu cour compreh 1
+portug archieplexform 1
+longest 1
+hap man tim 1
+prov a saf 1
+forsak our forefather 1
+se of html 2
+fin fish 1
+john lasseter 1
+rugger mastr 1
+swift and stronger 1
+rich environm 1
+patrol work 1
+availabl 1
+perfect health 1
+md syntac 1
+protein datab regl 1
+roman cook 1
+off weather 1
+encour th us 1
+middl school 1
+recip 4
+overlook ba 1
+replac window seam 1
+recit 1
+designer and mus 1
+inclus internet resourc 1
+cruel pang 1
+upd each tim 1
+ucl 1
+cl homosexu 1
+support descript me 1
+exhibit by gopher 1
+univer of technolog 2
+motif bioinformat 1
+li straight 1
+off institut 1
+commerc distribut 1
+rick har 1
+possibil 1
+pop with influ 1
+gal cook corner 1
+sit design 1
+direct doesnt ec 1
+inorgan chemister 1
+tut program 1
+autom auth 1
+converter 2
+anchor 1
+leau light 1
+pa indirect 1
+guter 1
+an weizman institut 1
+brunel univer hypertext 1
+childr christm 1
+paul erd aut 1
+fairer 1
+evid on cr 1
+structur an 2
+genet engineer 1
+hap between men 1
+subm your train 1
+heel hold 1
+network is prohibit 1
+ufn 1
+structur ba 1
+program that prov 1
+microsecon and year 1
+web docum 2
+u.bc th univer 1
+us and avail 1
+subsequ examin 1
+universt salzburg 1
+delight in great 1
+charl sturt 1
+skiing snowboard 1
+gossip 1
+div fl equip 1
+garg kan 1
+result of yazvenk 1
+girod nt.e technik.un 1
+sl for developm 1
+dd rl 1
+dilig 1
+author al saw 1
+term futur 1
+earl ver 1
+ernest 1
+search at internet 1
+experim stat 1
+recom 2
+recon 1
+forth a form 1
+enj your visit 1
+autom gam 1
+veneer of plow 1
+hydrodynam 1
+punctu 1
+ftp.uwp.edu 1
+rel web 1
+tuesd 3
+loc high school 1
+wherewith a man 1
+str to stand 1
+harald jam penr 1
+owl non 1
+scot ii expedit 1
+univer o biomolecl 1
+publ avail 3
+prelimin 3
+alumin custom 1
+phenom 2
+origin ar avail 1
+lust bruer 1
+liter educ onl 1
+collabor program augst 1
+lawlib.slu.edu train mailser.htm 1
+work tier obeletz 1
+circl 2
+peopl forg 1
+search docum 1
+ital quot 1
+specif color 1
+pag o scop 1
+ukc 1
+jgilber chemhom.html 1
+uc.edu 1
+leicestershir le11 3tu 2
+nelson minar 1
+elsev sc publ 1
+san francisc 3
+pdq clin 1
+techn report 2
+mendel 1
+form ba arch 1
+gunner lead ext 1
+web ind 4
+mailserver 1
+sort soever 1
+self addr mailer 1
+saint 4
+broad contempor 1
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.stopwords
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.stopwords	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/aliweb.stopwords	(revision 21083)
@@ -0,0 +1,451 @@
+a
+abaft
+aboard
+about
+above
+across
+afore
+aforesaid
+after
+again
+against
+agin
+ago
+aint
+albeit
+all
+almost
+alone
+along
+alongside
+already
+also
+although
+always
+am
+american
+amid
+amidst
+among
+amongst
+an
+and
+anent
+another
+any
+anybody
+anyone
+anything
+are
+arent
+around
+as
+aslant
+astride
+at
+athwart
+away
+b
+back
+bar
+barring
+be
+because
+been
+before
+behind
+being
+below
+beneath
+beside
+besides
+best
+better
+between
+betwixt
+beyond
+both
+but
+by
+c
+can
+cannot
+cant
+certain
+circa
+close
+concerning
+considering
+cos
+could
+couldnt
+couldst
+d
+dare
+dared
+darent
+dares
+daring
+despite
+did
+didnt
+different
+directly
+do
+does
+doesnt
+doing
+done
+dont
+dost
+doth
+down
+during
+durst
+e
+each
+early
+either
+em
+english
+enough
+ere
+even
+ever
+every
+everybody
+everyone
+everything
+except
+excepting
+f
+failing
+far
+few
+first
+five
+following
+for
+four
+from
+g
+gonna
+gotta
+h
+had
+hadnt
+hard
+has
+hasnt
+hast
+hath
+have
+havent
+having
+he
+hed
+hell
+her
+here
+heres
+hers
+herself
+hes
+high
+him
+himself
+his
+home
+how
+howbeit
+however
+hows
+i
+id
+if
+ill
+im
+immediately
+important
+in
+inside
+instantly
+into
+is
+isnt
+it
+itll
+its
+itself
+ive
+j
+just
+k
+l
+large
+last
+later
+least
+left
+less
+lest
+lets
+like
+likewise
+little
+living
+long
+m
+many
+may
+maynt
+me
+mid
+midst
+might
+mightnt
+mine
+minus
+more
+most
+much
+must
+mustnt
+my
+myself
+n
+near
+neath
+need
+needed
+needing
+neednt
+needs
+neither
+never
+nevertheless
+new
+next
+nigh
+nigher
+nighest
+nisi
+no
+no-one
+nobody
+none
+nor
+not
+nothing
+notwithstanding
+now
+o
+oer
+of
+off
+often
+on
+once
+one
+oneself
+only
+onto
+open
+or
+other
+otherwise
+ought
+oughtnt
+our
+ours
+ourselves
+out
+outside
+over
+own
+p
+past
+pending
+per
+perhaps
+plus
+possible
+present
+probably
+provided
+providing
+public
+q
+qua
+quite
+r
+rather
+re
+real
+really
+respecting
+right
+round
+s
+same
+sans
+save
+saving
+second
+several
+shall
+shalt
+shant
+she
+shed
+shell
+shes
+short
+should
+shouldnt
+since
+six
+small
+so
+some
+somebody
+someone
+something
+sometimes
+soon
+special
+still
+such
+summat
+supposing
+sure
+t
+than
+that
+thatd
+thatll
+thats
+the
+thee
+their
+theirs
+them
+themselves
+then
+there
+theres
+these
+they
+theyd
+theyll
+theyre
+theyve
+thine
+this
+tho
+those
+thou
+though
+three
+thro
+through
+throughout
+thru
+thyself
+till
+to
+today
+together
+too
+touching
+toward
+towards
+true
+twas
+tween
+twere
+twill
+twixt
+two
+twould
+u
+un
+under
+underneath
+unless
+unlike
+until
+unto
+up
+upon
+us
+used
+usually
+v
+versus
+very
+via
+vice
+vis-`a-vis
+w
+wanna
+wanting
+was
+wasnt
+way
+we
+wed
+well
+were
+werent
+wert
+weve
+what
+whatever
+whatll
+whats
+when
+whencesoever
+whenever
+whens
+whereas
+wheres
+whether
+which
+whichever
+whichsoever
+while
+whilst
+who
+whod
+whoever
+whole
+wholl
+whom
+whore
+whos
+whose
+whoso
+whosoever
+will
+with
+within
+without
+wont
+would
+wouldnt
+wouldst
+x
+y
+ye
+yet
+you
+youd
+youll
+your
+youre
+yours
+yourself
+yourselves
+youve
+z
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/convert-html-to-text.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/convert-html-to-text.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/convert-html-to-text.pl	(revision 21083)
@@ -0,0 +1,38 @@
+#!/usr/bin/perl -w
+
+# convert an html file to a text file
+
+# Version 
+# 1   1999 Aug 24 First version. Compensates for files Lynx cannot parse.
+# 1.1 1999 Aug 24 Instead of special cases, put a time limit on lynx.
+
+die unless (-e "$ARGV[0]");
+$filename = $ARGV[0];
+
+# Lynx can't handle framesets.  Sorry.
+#$frameset = `grep "<FRAMESET" $filename`;
+#exit if ($frameset =~ /./);
+
+# Lynx can't handle files with no body.  Sorry.
+#$size = `wc $filename`;
+#($lines, $words, $chars) = $size =~ /^\s+(\d+)\s+(\d+)\s+(\d+)/;
+#exit unless ($lines && $words && $chars);
+#exit if ($lines < 10);
+#exit if ($words < 10);
+#exit if ($chars < 10);
+
+# convert the html file to text with lynx
+`ulimit -t 300; lynx -force_html -nolist -dump $filename > $filename.$$`;
+
+open(IN, "$filename.$$");
+while (<IN>) {
+
+    # remove the [IMAGE], [LINK], and [INLINE] markers
+    s/\[INLINE\]/. /g; 
+    s/\[IMAGE\]/. /g; 
+    s/\[LINK\]/. /g;
+    
+    print;
+}
+
+`rm $filename.$$`;
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/count-lines.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/count-lines.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/count-lines.pl	(revision 21083)
@@ -0,0 +1,21 @@
+#!/usr/bin/perl -w
+
+# count-lines.pl - a quick script for counting
+# the number of times each line appears in a file.
+# Useful for building keyphrase-frequency files
+# (see README for instructions).
+
+while (<>) {
+    chomp;
+    if ($_ =~ /./) { 
+	s/\s/ /g;
+	$counter{$_}++; 
+    } else { 
+	$counter{"_blank_"}++; 
+    }
+}
+
+foreach $k (sort keys(%counter)) {
+    print "$k\t$counter{$k}\n";
+}
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr-to-text.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr-to-text.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr-to-text.pl	(revision 21083)
@@ -0,0 +1,89 @@
+#! /usr/bin/perl -w
+
+# cstr-to-text.pl: change a cstr html file to a text file.
+# Gordon Paynter (gwp@cs.waikato.ac.nz) 
+
+# On the lucy/rose/borg change first line to: #! /usr/local/bin/perl -w
+
+# Version 1    1998 Oct 23 First distibuted, give or take a version.
+# Version 1.01 1998 Nov 17 New page number form: "<p><!--Page No-->..."
+# Version 1.02 1998 Nov 17 Bug: <p> at end of line.
+
+if (!$ARGV[0] || !$ARGV[1]) {
+    die "Usage: cstr-to-text.pl <input-cstr-file> <output-text-file>\n";
+}
+$infile = $ARGV[0];
+$tmpfile = "/tmp/c2t.$$";
+$outfile = $ARGV[1];
+
+
+# print STDERR "Preparing text file $infile in $outfile\n";
+
+open(IN, "<$infile");
+open(OUT, ">$tmpfile");
+
+$ignore_next_paragraph_marker = 0;
+
+while (<IN>) {
+    
+    $line = $_;
+
+    if ($line =~ /^<\!\-\-Page No\-\->/) {
+	# print "Page number generated by prescript before 2.1\n";
+	$ignore_next_paragraph_marker = 1;
+	next;
+    } 
+
+    if ($line =~ /^<p><\!\-\-Page No\-\->/) {
+	# print "Page number generated by prescript 2.1\n";
+	if ($line =~ /<p>\s*$/) {
+	    $ignore_next_paragraph_marker = 0;
+	} else {
+	    $ignore_next_paragraph_marker = 1;
+	}
+	next;
+    } 
+    
+    if ($line =~ /^<\!\-\-End Of Page\-\->/) {
+	# print "End of Page generated by prescript (up to and including 2.1)\n";
+	if ($line =~ /<p>\s*$/) {
+	    $ignore_next_paragraph_marker = 0;
+	} else {
+	    $ignore_next_paragraph_marker = 1;
+	}
+	next;
+    }
+
+    if ($line =~ /^<p>\d+$/) {
+	# print "Page number as paragraph mark and single number\n";
+	$ignore_next_paragraph_marker = 1;
+	next;
+    }
+
+    if ($line =~ /^<p>\- \d+ \-$/) {
+	# print "Page number in yet another form\n";
+	$ignore_next_paragraph_marker = 1;
+	next;
+    }
+
+    if ($ignore_next_paragraph_marker && ($line =~ /^<p>/)) {
+	$line =~ s/^<p>//;
+	$ignore_next_paragraph_marker = 0;
+    }
+
+    if ($line =~ /[A-Za-z0-9]\-$/) {
+	#print "Hyphenation\n";
+	$ignore_next_paragraph_marker = 1;
+    }
+
+
+    print OUT $line;
+
+}
+
+close(OUT);
+
+`lynx -force_html -dump $tmpfile > $outfile`;
+
+`rm $tmpfile`;
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.desc
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.desc	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.desc	(revision 21083)
@@ -0,0 +1,82 @@
+ TYA 0.7 (for J116) loaded. Copyright (c) 1997,98 The TYA Team
+Building classifier and saving it...
+Loading data...
+Counting positive examples...
+Looking for missed keyphrases in the dataset...
+Found 130 documents in the dataset.
+Total number of examples missing: 211
+Total number of positive examples: 668
+Deleting columns...
+Discretizing columns...
+Building classifier...
+
+Naive Bayes
+
+Class yes: P(C) = 0.00481649
+
+Attribute keyword_freq
+'(-inf-0]'	'(0-17]'	'(17-18]'	'(18-inf)'	
+0.39479393	0.52711497	0.01952278	0.05856833	
+
+Attribute tfidf
+'(-inf-0.000347]'	'(0.000347-0.00237]'	'(0.00237-0.00512]'	'(0.00512-0.0126]'	'(0.0126-0.0474]'	'(0.0474-inf)'	
+0.00647948	 0.1663067	0.22678186	0.28293737	0.24406048	0.07343413	
+
+Attribute first_occurrence
+'(-inf-0.00207]'	'(0.00207-0.0103]'	'(0.0103-0.0343]'	'(0.0343-0.142]'	'(0.142-inf)'	
+0.21861472	0.20995671	0.24242424	0.19264069	0.13636364	
+
+
+
+Class no: P(C) = 0.99518351
+
+Attribute keyword_freq
+'(-inf-0]'	'(0-17]'	'(17-18]'	'(18-inf)'	
+0.86182702	0.13687325	0.00001057	0.00128916	
+
+Attribute tfidf
+'(-inf-0.000347]'	'(0.000347-0.00237]'	'(0.00237-0.00512]'	'(0.00512-0.0126]'	'(0.0126-0.0474]'	'(0.0474-inf)'	
+0.22192166	0.52464681	0.16605556	0.06533385	0.02027748	0.00176464	
+
+Attribute first_occurrence
+'(-inf-0.00207]'	'(0.00207-0.0103]'	'(0.0103-0.0343]'	'(0.0343-0.142]'	'(0.142-inf)'	
+0.01623061	0.04124223	0.10043747	 0.2244706	0.61761909	
+
+
+Finding most probable keyphrases...
+Finding best cutoffs...
+Best rank cutoff: 8	Best prob cutoff: 0.25999999999999934	F-Measure: 0.22979397781299524
+Classifying phrases...
+Preparing data...
+Counting positive examples...
+Looking for missed keyphrases in the dataset...
+Found 500 documents in the dataset.
+Total number of examples missing: 809
+Total number of positive examples: 2709
+Deleting columns...
+Finding most probable keyphrases...
+Computing statistics...
+Rank cutoff: 8
+Probability cutoff: 0.25999999999999934
+F-Measure: 0.22598870056497175
+Rank	Prec.	Conf.
+1	 0.308	0.0406 &&&
+2	 0.287	0.0291 &&&
+3	  0.26	0.0237 &&&
+4	0.2395	0.0196 &&&
+5	0.2288	0.0174 &&&
+6	0.2177	0.0159 &&&
+7	0.2071	0.0143 &&&
+8	0.1913	 0.013 &&&
+9	0.1791	0.0117 &&&
+10	0.1696	 0.011 &&&
+11	0.1622	0.0102 &&&
+12	0.1567	0.0097 &&&
+13	0.1486	0.0091 &&&
+14	0.1436	0.0086 &&&
+15	0.1377	0.0081 &&&
+16	0.1325	0.0077 &&&
+17	 0.128	0.0073 &&&
+18	0.1236	0.0071 &&&
+19	0.1195	0.0068 &&&
+20	0.1146	0.0065 &&&
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.df
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.df	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.df	(revision 21083)
@@ -0,0 +1,265612 @@
+130
+.conf 1
+.conf loc 1
+.conf loc pol.threshold 1
+.deg 1
+.degr 1
+.degr router 1
+.dist 1
+.e 1
+.nontr 1
+.nontr neighbor 1
+.pr 1
+.tr 1
+.tr degr 1
+.unexplor 1
+.vt 1
+0.05p1 2
+0.05p2 2
+0.06p1 2
+0.06p2 2
+0.08p1 2
+0.08p2 2
+0.09p2 2
+0.11p1 2
+0.12p1 2
+0.12p2 2
+0.13p2 2
+0.16p1 2
+0.17p2 2
+0.18p2 2
+0.1f 1
+0.1s 1
+0.1s and 0.8s 1
+0.20p2 2
+0.23p2 2
+0.25h 1
+0.25h il 1
+0.25h il faudr 1
+0.25h le 1
+0.25h le facteur 1
+0.25p1 2
+0.25p2 2
+0.2f 1
+0.33p1 2
+0.33p2 2
+0.35p2 2
+0.3f 1
+0.47p2 2
+0.50p1 2
+0.50p2 2
+0.56p1 2
+0.56p2 2
+0.66p1 2
+0.66p2 2
+0.70p2 2
+0.8s 1
+00000000451l2 1
+00000304l 1
+00010203101112132021222330313233bidirect 1
+00010203101112132021222330313233bidirect link 1
+00010203101112132021222330313233bidirect link 4x4 1
+0039l 1
+0042l 1
+0058l 1
+01cc3 1
+01cc3pc1 1
+046l 1
+050f 1
+050f fac 1
+050n 1
+05c45 1
+06a05 1
+06a06 1
+0bit 2
+0bit cycl 2
+0fw 1
+0fw 1fw 1
+0fw 1fw 2maxim 1
+0g 1
+0h2 1
+0i 3
+0i 1i 1
+0i 1i 2i 1
+0level 1
+0m 1
+0m sg 1
+0n 1
+0p 1
+0p e0 1
+0pag 1
+0pag 3pag 1
+0r 1
+0r e0 1
+0r6 2
+0rd 1
+0ri 1
+0s 5
+0s and 1s 2
+0s or 1s 1
+0u 1
+0u du 1
+0u1 1
+0u1 du1 1
+1.00p1 2
+1.00p2 2
+1.0p2 2
+1.0p2 1024.0p2 2
+1.0p2 1024.0p2 1.0p2 2
+1.0p2 16.0p2 2
+1.0p2 16.0p2 33.8p2 2
+1.2gb 1
+1.2gb memor 1
+1.2gby 1
+1.2gby of memor 1
+1.33p1 2
+1.40p2 2
+1.43n 1
+1.4p2 2
+1.4p2 16.0p2 2
+1.4p2 16.0p2 30.0p2 2
+1.4p2 716.8p2 2
+1.4p2 716.8p2 1.4p2 2
+1.5a 1
+1.5b 1
+1.5c 1
+1.5d 1
+1.5d in tabl 1
+1.5ind 1
+1.5ind your expect 1
+1.5mbit 1
+1.5mbit sec 1
+1.5um 1
+1.5um cm 1
+1.5um cm as 1
+1.71n 1
+1.ae 1
+1.ae on obt 1
+10.c 1
+10.t 1
+10.th 1
+10.th answer 1
+1000g 1
+1000mb 2
+1001i 1
+100l200l300l400l500l 2
+100mb 2
+100s 1
+100s of user 1
+101456789101112123root123456789101112 1
+102.4p1 2
+1024.0p2 2
+1024.0p2 0.25p2 2
+1024.0p2 1.0p2 2
+1024.0p2 1.0p2 16.0p2 2
+1024p1 2
+1024p1 0.25p1 2
+1024p1 0.50p1 2
+1024p1 1.00p1 2
+1024p1 16p1 2
+1024p1 16p1 64.0p1 2
+1024p1 2.00p1 2
+1024p1 2p1 2
+1024p1 2p1 22.6p1 2
+1024p1 32p1 2
+1024p1 32p1 90.4p1 2
+1024p1 4.00p1 2
+1024p1 4p1 2
+1024p1 4p1 32.0p1 2
+1024p1 64p1 2
+1024p1 64p1 128.0p1 2
+1024p1 8.00p1 2
+1024p1 8p1 2
+1024p1 8p1 45.2p1 2
+1024p1 p1 2
+1024p1 p1 16.0p1 2
+104j 1
+107.5p1 2
+107.5p1 107.6p1 2
+107.5p1 107.6p1 102.4p1 2
+107.6p1 2
+107.6p1 102.4p1 2
+10cm 1
+10e 1
+10e de 1
+10e de voxel 1
+10g 3
+10g ae 1
+10g ai 1
+10g ai ei 1
+10g bcd 1
+10g bi 1
+10g bi ci 1
+10g di 1
+10g f1 1
+10g i f11 1
+10in 1
+10in earl 1
+10in earl work 1
+10jv1 1
+10k 1
+10k i 6j 1
+10le 1
+10le descript 1
+10le descript de 1
+10m 1
+10m by 1
+10mb 2
+10mbit 1
+10mbit sec 1
+10ms 1
+10ms cc 1
+10ms cc tim 1
+10msec 1
+10msec del 1
+10n 1
+10ns 2
+10ns impl 2
+10ns lead 2
+10p 1
+10q1 1
+10th 8
+10th acm 2
+10th acm pod 1
+10th annu 2
+10th annu acm 1
+10th eurograph 1
+10th eurograph uk92 1
+10th ie 1
+10th intern 3
+10th intern joint 1
+10to 1
+10to consider 1
+10ver 1
+10ver clp 1
+10w 1
+10y 1
+10y 4x 1
+110kby 1
+110kby object 1
+110kby object modl 1
+11b 2
+11b and algorithm 1
+11by 1
+11c 1
+11c and algorithm 1
+11i 1
+11i 2j 1
+11lhr71m14bmap1map2rotor38584.1shel93shy161torsotrollv 1
+11lhr71m14bmap1map2rotor38584.1shel93shy161torsotrollv nkat25wav 1
+11n 1
+11not 1
+11not lutilit 1
+11th 10
+11th acm 1
+11th acm pod 1
+11th import 1
+11th intern 7
+11th intern joint 1
+11th intern vldb 1
+11th itg 1
+11th itg gi 1
+11th world 1
+11th world computer 1
+11when 1
+11x 1
+11x 13y 1
+12.microsoft 1
+12.microsoft word 1
+12.s 1
+120k 1
+1230123456789101112131415hhh123 1
+1234domain 1
+128.0l 2
+128.0p1 2
+128.0p1 128.0p1 2
+128.0p1 130.0p1 2
+128.0p1 130.0p1 128.0p1 2
+128.0p2 2
+128.0p2 2.00p2 2
+128.0p2 8.0p2 2
+128.0p2 8.0p2 16.0p2 2
+128ec 1
+128ec 256ec 1
+128ec 256ec 64ec 1
+128k 3
+128mb 1
+128mb of virtu 1
+12a 1
+12chunk 1
+12ff 1
+12g 1
+12g assign 1
+12g assign rol 1
+12g f1 1
+12n 2
+12n 4x 1
+12n log 1
+12not 1
+12npn 1
+12on 1
+12on peut 1
+12th 8
+12th annu 1
+12th annu intern 1
+12th colloqu 1
+12th ie 1
+12th ie ma 1
+12th imac 1
+12th imac world 1
+12th intern 3
+12th intern vldb 1
+12th world 1
+12th world computer 1
+12ver 1
+12ver oz 1
+12we 1
+12we describ 1
+13.a 1
+130.0p1 2
+130.0p1 128.0p1 2
+130.0p1 128.0p1 128.0p1 2
+134init 1
+134init backlog 1
+134init backlog connect 1
+135ff 1
+13backlogpoint 1
+13backlogpoint r number 1
+13in 1
+13j0 1
+13sparcst 1
+13th 8
+13th annu 1
+13th annu intern 1
+13th intern 3
+13th intl 1
+13th world 2
+13th world computer 2
+13y 1
+14.c.k 1
+14.m 1
+144598aautobcsstk31bcsstk32bbmatbrack2cantcopter2cyllinder93finan512fl 1
+144598aautobcsstk31bcsstk32bbmatbrack2cantcopter2cyllinder93finan512fl apinpr1ken 1
+144598aautobcsstk31bcsstk32bbmatbrack2cantcopter2cyllinder93finan512fl apinpr1ken 11lhr71m14bmap1map2rotor38584.1shel93shy161torsotrollv 1
+144598aautobrack2copter2flapm14brotortorsowavebcsstk31bcsstk32cantcyl 1
+144598aautobrack2copter2flapm14brotortorsowavebcsstk31bcsstk32cantcyl inder93inpr1shel93shy161trollvenkat25bbmatlhr71map1map2finan512ken11s38584.1 1
+14n2 1
+14th 6
+14th acm 1
+14th acm popl 1
+14th acm stoc 1
+14th annu 1
+14th annu intern 1
+14th intern 4
+14ther 2
+15.g 1
+15.i 1
+150ff 1
+15ns 1
+15other 1
+15other exampl 1
+15st 1
+15st an 1
+15th 5
+15th acm 1
+15th annu 2
+15th annu intern 2
+15th intern 3
+16.0p1 2
+16.0p1 33.8p1 2
+16.0p1 33.8p1 45.2p1 2
+16.0p2 2
+16.0p2 16.0p2 2
+16.0p2 16.0p2 16.0p2 2
+16.0p2 18.9p2 2
+16.0p2 18.9p2 18.9p2 2
+16.0p2 21.3p2 2
+16.0p2 21.3p2 22.6p2 2
+16.0p2 23.8p2 2
+16.0p2 23.8p2 26.7p2 2
+16.0p2 26.9p2 2
+16.0p2 26.9p2 32.0p2 2
+16.0p2 30.0p2 2
+16.0p2 30.0p2 37.8p2 2
+16.0p2 33.8p2 2
+16.0p2 33.8p2 45.2p2 2
+16.p 1
+16.s.g.mallat 1
+162j0 1
+167mhz 1
+167mhz and 1.2gb 1
+16db 1
+16e 1
+16k 1
+16m 2
+16m by 1
+16mb 1
+16mb of main 1
+16mo 1
+16mo ext 1
+16p1 2
+16p1 1024p1 2
+16p1 1024p1 16p1 2
+16p1 4p2 2
+16p1 64.0p1 2
+16p1 64.0p1 85.3p1 2
+16p2 2
+16th 5
+16th annu 2
+16th annu intern 2
+16th icalp 1
+16th intern 1
+16th leed 1
+16th leed annu 1
+16we 1
+16we determin 1
+16x 1
+16x map 1
+16x map 8x 1
+16x16 1
+16x16 network 1
+16x24 1
+17.p 1
+17.s 1
+171010132ab01320134012152024012315202526931121161211251211311311351381 1
+176.0l 2
+17refer 1
+17th 9
+17th acm 1
+17th annu 3
+17th annu intern 3
+17th intern 5
+18.0p2 2
+18.9p2 2
+18.9p2 18.0p2 2
+18.9p2 18.9p2 2
+18.9p2 18.9p2 18.0p2 2
+18.p 1
+18.s.w 1
+180ff 1
+180k 2
+181.0p2 2
+181.0p2 1.40p2 2
+181.0p2 5.6p2 2
+181.0p2 5.6p2 16.0p2 2
+1815a 2
+18k 1
+18k lin 1
+18th 5
+18th annu 3
+18th annu acm 1
+18th annu ie 1
+18th annu intern 1
+18th icalp 1
+18th intern 1
+19.h 1
+19.t 1
+190x 1
+190x 13j0 1
+195mhz 1
+1970s 2
+1980s 3
+1980s sever peopl 1
+1987a 1
+1987b 1
+1990a 3
+1990b 3
+1990s 2
+1990s th figur 1
+1991a 1
+1991b 1
+1992a 1
+1992b 1
+1993a 3
+1993b 3
+1994a 1
+1994b 1
+1995.tr130.lyd.d1.ps.gz 1
+1996a 1
+1996b 1
+19th 8
+19th annu 3
+19th annu acm 1
+19th annu intern 2
+19th ie 1
+19th ie design 1
+19th intern 4
+19th intern vldb 1
+1a 9
+1a is construc 1
+1a mor eff 1
+1a prelimin 1
+1a prelimin ver 1
+1a short ver 1
+1a show 1
+1a st 1
+1a st loc 1
+1a weak 1
+1a weak weak 1
+1a1 1
+1ae 2
+1aid 1
+1aid a lam 1
+1al 1
+1although 1
+1although most subject 1
+1an 2
+1an eff 1
+1an eff implem 1
+1an implem 1
+1ar 1
+1as 2
+1as point 1
+1as shown 1
+1at 1
+1b 6
+1bloc 1
+1brown 1
+1brown univer box 1
+1bt 1
+1bt and thus 1
+1bus 1
+1bus pbus 1
+1bus pbus dbus 1
+1c 1
+1c2 1
+1cel 1
+1cel na 1
+1cel na de 1
+1chunk 1
+1chunk 12chunk 1
+1coroutin 1
+1coroutin et trait 1
+1d 3
+1d 1d 2
+1d et 2d 1
+1d good 2
+1d good configur 2
+1d internet 2
+1d internetb 2
+1d internetw 2
+1dan 1
+1dan la 1
+1dan la terminolog 1
+1dat 1
+1dat anpncc 1
+1dat anpncc 1datanpncc 1
+1datanpncc 1
+1datanpncc 1dat 1
+1datanpncc 1dat anpncc 1
+1datanpncc 1datanpncc 1
+1datanpncc 1datanpncc 1dat 1
+1datanpncc 1datanpncc 2datanpncc 1
+1datanpncc 2datanpncc 1
+1datanpncc 2datanpncc 2datanpncc 1
+1dk 1
+1dpt.lenguaj 1
+1dpt.lenguaj y cienc 1
+1dx 1
+1dxg 1
+1e 5
+1e jffl 1
+1e jffl nodesj 1
+1e lin 1
+1e xdx 1
+1e xdx mf 1
+1e xdxg 1
+1email 1
+1er 1
+1er ca 1
+1exampl 1
+1exampl of user 1
+1f 1
+1f1 1
+1flop 2
+1flop by 2
+1for 2
+1for motiv 1
+1for simpl 1
+1fram 1
+1fram indextimestamp 1
+1ft 1
+1further 1
+1further cop 1
+1fw 1
+1fw 2maxim 1
+1fw 2maxim speedup 1
+1g 26
+1g and i1 1
+1g and logkn 1
+1g ar remov 1
+1g ch 1
+1g ch al 1
+1g gt 1
+1g na 1
+1g na pa 1
+1g prfx 1
+1g signif 1
+1g wh 1
+1g1 1
+1g1 ha measur 1
+1gb 1
+1gb datab 1
+1gby 1
+1gby of main 1
+1gg 1
+1gi 1
+1gigab 1
+1gj 1
+1gm 1
+1gn 4
+1gn denot 1
+1gn f0 1
+1gn is equ 1
+1gn n ent 1
+1gng 1
+1gprfx 1
+1gq 1
+1gq impl 1
+1gq of siz 1
+1gq sf 1
+1gt 1
+1gt 1gi 1
+1gz1 1
+1h 2
+1h2n 1
+1he 2
+1he tupl 1
+1hk 1
+1i 7
+1i 1i 2
+1i 1i 1i 1
+1i 2i 1
+1i 2i 3i 1
+1i b aek 1
+1i b s 1
+1i ek 1
+1i el 1
+1i1 2
+1if 1
+1if th cliqu 1
+1ik 1
+1ikj 1
+1ikj ek 1
+1ikj ek ce 1
+1il 1
+1il sagit 1
+1il sagit dun 1
+1in 3
+1in comb 1
+1ir 1
+1it 1
+1it is worth 1
+1j 4
+1j 4n 1
+1j 4nt 1
+1j jxj 1
+1jg 1
+1jykj 1
+1jykj j ffltj 1
+1k 2
+1k by 1
+1k by pag 1
+1k2 1
+1k2 fflr 1
+1kby 1
+1level 1
+1m 3
+1m connect 1
+1m stat 1
+1m stat nod 1
+1mb 1
+1mbit 1
+1mbit sec 1
+1mbit sec ethernet 1
+1me 1
+1me xp 1
+1mk 1
+1mk limk 1
+1mk q0m1 1
+1mod2 1
+1model 1
+1model for var 1
+1n 3
+1n1 1
+1n4 1
+1na 1
+1neither 1
+1neither tot 1
+1nf 1
+1nf rel 1
+1nf tupl 1
+1not 1
+1o2o3o4o22plac 1
+1o2o3o4o22plac order 1
+1oe 2
+1of 1
+1of cour 1
+1p 1
+1p1 2
+1p1 1p2 2
+1p2 3
+1p2 phk 1
+1p2 phk ik 1
+1p2 x gkeik 1
+1pag 1
+1pag 4pag 1
+1pag x 2pag 1
+1pag y 2pag 1
+1pe 1
+1pfxt 1
+1pi 1
+1po 1
+1probl 1
+1probl em 1
+1probl em majeur 1
+1ptx 1
+1ptx 1xtpxtp 1
+1q 2
+1qf 1
+1qg 1
+1r 1
+1ra 1
+1ra stand 1
+1racregister 1
+1racregister filealu 1
+1rc 1
+1real 1
+1real world 1
+1real world comput 1
+1research 1
+1research support 1
+1ri 1
+1rm 1
+1s 6
+1s acquir 1
+1s and log 1
+1s and targ 1
+1s msg 1
+1s requir 1
+1s to ensur 1
+1sb 1
+1server 1
+1server 2server 1
+1server 2server 3chunk 1
+1server 2server 3server 1
+1si 1
+1si yi 1
+1specif 1
+1ss 1
+1st 14
+1st cop 1
+1st ed 1
+1st edit 3
+1st europ 1
+1st ie 1
+1st ie intern 1
+1st int 1
+1st intern 2
+1st left shift 1
+1st level 1
+1st level switch 1
+1st nearest 1
+1st nearest neighbor 1
+1st order 1
+1st order log 1
+1st order pr 1
+1st order theor 1
+1st order3 1
+1storder 1
+1storder axiom 1
+1subm 1
+1subm to ppig 1
+1t 6
+1t1t2ut22 1
+1t2 1
+1tfw 1
+1th 9
+1th condit 1
+1th definit 1
+1th direct 1
+1th oxford 1
+1th oxford system 1
+1th pack 1
+1th paper 1
+1th research 2
+1th work 1
+1ther 1
+1throughout 1
+1throughout th paper 1
+1tn 1
+1to 1
+1to appear 1
+1u 2
+1u fonct 1
+1u fonct indicatr 1
+1u1 1
+1u1 c1du1 1
+1un 1
+1un ver 1
+1un ver pr 1
+1we 4
+1we consider 1
+1we in 1
+1we us 2
+1wi 1
+1wi for fic 1
+1x 4
+1x 2x2 1
+1x map 1
+1x0 2
+1x0 a01x01 1
+1xh 1
+1xi 2
+1xi 2x2i 1
+1xi 2x2i ffl 1
+1xn 1
+1xn commun 1
+1xn commun model 1
+1xn connect 1
+1xn connect bottleneck 1
+1xn connect throughput 1
+1xn multicast 1
+1xn multicast connect 1
+1xtpxtp 1
+1xty 1
+1y 2
+1y and x0 1
+1yi 1
+1z1 1
+2.00p1 2
+2.00p2 2
+2.0p2 2
+2.0p2 16.0p2 2
+2.0p2 16.0p2 26.9p2 2
+2.0p2 512.0p2 2
+2.0p2 512.0p2 2.0p2 2
+2.11n 1
+2.2m 1
+2.2m by 1
+2.35s 1
+2.35s 2.74ms 1
+2.62ms 1
+2.66p1 2
+2.74ms 1
+2.8p2 2
+2.8p2 16.0p2 2
+2.8p2 16.0p2 23.8p2 2
+2.8p2 358.4p2 2
+2.8p2 358.4p2 2.8p2 2
+2.94ms 1
+20.a 1
+200mhz 2
+200mhz mip 1
+200mhz mip r4400 1
+20165ar1323283136319131723123456 1
+203ex 1
+203ex len 1
+20by 1
+20by which perm 1
+20k 1
+20th 3
+20th acm 1
+20th intern 2
+20th intern vldb 1
+21.3p2 2
+21.3p2 22.6p2 2
+21.3p2 22.6p2 21.3p2 2
+21.a.k 1
+2154a3a8 1
+2154a3a8 w1 1
+21a 1
+21a and 21b 1
+21b 1
+21b show 1
+21k 1
+21p 1
+21st 6
+21st acm 1
+21st acm annu 1
+21st annu 2
+21st annu acm 1
+21st annu me 1
+21st design 1
+21st design autom 1
+21st ie 1
+21st ie foc 1
+21st intern 1
+21th 1
+21th annu 1
+21th annu acm 1
+22.6p1 2
+22.6p1 42.6p1 2
+22.6p1 42.6p1 53.8p1 2
+22.6p2 2
+22.6p2 21.3p2 2
+22.william 1
+224w 1
+22i 1
+22m 1
+22m distinct 1
+22m distinct equiv 1
+22n 1
+22n disjunct 1
+22n disjunct norm 1
+22nd 2
+22nd annu 2
+22nd annu acm 1
+22nd annu intern 1
+22p 1
+22p distinct 1
+22p distinct el 1
+22r8r 1
+22v 1
+23.45p 1
+23.8p2 2
+23.8p2 26.7p2 2
+23.8p2 26.7p2 25.7p2 2
+23rd 2
+23rd annu 1
+23rd annu acm 1
+23rd s.e 1
+24.wayn 1
+24.wayn niblack 1
+24g 1
+24n 1
+24th 2
+24th annu 2
+24th annu acm 2
+24x80 1
+24x80 character 1
+24x80 character termin 1
+25.7p2 2
+25.s 1
+250mb 2
+256.0l 2
+256.0p2 2
+256.0p2 1.00p2 2
+256.0p2 4.0p2 2
+256.0p2 4.0p2 16.0p2 2
+256ec 1
+256ec 64ec 1
+256ec 64ec 128ec 1
+256k 1
+256x256 1
+256x256 crossbar 1
+256x256 crossbar interconnect 1
+25fv47 1
+25k 1
+25k and 30k 1
+25mb 2
+25mflop 2
+25mflop proc 2
+25mflop proc demand 2
+25th 3
+25th haw 1
+25th haw intl 1
+25th intl 1
+25th stoc 1
+25x25 2
+26.7p2 2
+26.7p2 25.7p2 2
+26.9p2 2
+26.9p2 32.0p2 2
+26.9p2 32.0p2 32.0p2 2
+26.s 1
+26th 1
+26th ie 1
+26th ie foc 1
+27.j 1
+27n 1
+27th 1
+27th ie 1
+27th ie symp 1
+28.j.r 1
+2891317231231391317232812342313c93112116121125131135138142147 1
+28st 1
+28st annu 1
+29.mpeg 1
+29th 1
+29th aller 1
+2a 9
+2a pentomin 1
+2a rat 1
+2a rat term 1
+2a show 1
+2a ss 1
+2a thorough 1
+2a thorough disc 1
+2a10b26c 1
+2a2xayx 1
+2a2xayx 2ac2yy 1
+2a2xayx 2ac2yy bx 1
+2a7 1
+2ac2yy 1
+2ac2yy bx 1
+2ac2yy bx byac 1
+2actu 1
+2ak 1
+2assum 1
+2assum that int 1
+2axx 1
+2axx bx 1
+2axx bx 2ayy 1
+2ayy 1
+2ayy by ay 1
+2b 6
+2b 1g 1
+2b and e2b 1
+2b bi 1
+2b dat 1
+2b dat object 1
+2b for level 1
+2b is giv 1
+2b m 2b 1
+2b p 2b 1
+2b pn 1
+2b posit 1
+2b posit remain 1
+2b proc 1
+2b scm 1
+2b should contain 1
+2b that us 1
+2b then jn 1
+2b then pb 1
+2bdeg 1
+2blg 1
+2blg nc 1
+2bloc 1
+2bloc 1bloc 1
+2blog 1
+2blog tc 1
+2blog tc 1wi 1
+2blog tcw 1
+2blogn 1
+2bnlogn 1
+2bnlogn 2m 1
+2bnlogn e2k 1
+2bo 1
+2bpmn 1
+2bpmn logn 1
+2by 2
+2by determ 1
+2by heap 1
+2c 7
+2c 4c 1
+2c connect 1
+2c inter 1
+2c inter switch 1
+2c0 1
+2c1 1
+2c3 1
+2caveat 1
+2cl 1
+2cl algorithm 1
+2cl algorithm describ 1
+2cl and dpl 1
+2cl brief 1
+2cl brief descript 1
+2cl could mak 1
+2cl dsj 1
+2cl dsj variabl 1
+2cl emerg 1
+2cl is compar 1
+2cl is model 1
+2cl maxscor 1
+2cl maxscor 2cl 1
+2cl on circuit 1
+2cl on random 1
+2cl pay 1
+2cl pay divid 1
+2cl repeat 1
+2cl repeat perform 1
+2cl result 1
+2cl wa execut 1
+2cl wil eventu 1
+2cl with dsj 1
+2cl with maxscor 1
+2cmac 1
+2cmac when cl 1
+2cn 2
+2compagnon 1
+2cur 1
+2cur osl 1
+2cur osl user 1
+2d 22
+2d 2d 1
+2d 2d tim 1
+2d 3d 1
+2d 3d tim 1
+2d a born 1
+2d and 3d 1
+2d bubblesort 1
+2d cel 1
+2d cel definit 1
+2d coeff 1
+2d coeff matr 1
+2d configur 2
+2d coord 1
+2d coord point 1
+2d definit 1
+2d definit over 1
+2d delaun 1
+2d delaun triangl 1
+2d displ 1
+2d goal 1
+2d grid 2
+2d inter 1
+2d inter cluster 1
+2d interfac 1
+2d interfac seem 1
+2d internet 2
+2d internet wh 2
+2d internetb 2
+2d internetw 2
+2d landmark 1
+2d mesh 2
+2d mesh inter 1
+2d mesh multicomputer 1
+2d or 3d 1
+2d plan 1
+2d plus flexibl 1
+2d point 1
+2d polygon 1
+2d polygon repr 1
+2d proc 1
+2d project 1
+2d project register 1
+2d resolut 1
+2d result 1
+2d scal 1
+2d scal funct 1
+2d spreadsh 1
+2d spreadsh interfac 1
+2d stiff 1
+2d stiff matr 1
+2d subgrid 1
+2d subtr 1
+2d tim 1
+2d tim unit 1
+2d to 3d 1
+2d tr 1
+2d tr form 1
+2d tr nod 1
+2d triangl 1
+2d3d4dhcub 2
+2dan 1
+2dan le 1
+2dan le tutoriel 1
+2datanpncc 1
+2datanpncc 2datanpncc 1
+2datanpncc 2datanpncc 2output 1
+2datanpncc 2output 1
+2datanpncc 2output port 1
+2ds 1
+2ds tring 1
+2dtr 1
+2e 4
+2e a2k 1
+2e apj 1
+2e proc 1
+2e1 1
+2e2b 1
+2e2b e2 1
+2e2b e2 logn 1
+2en 1
+2en fait 1
+2enf 1
+2enfxg 1
+2f 5
+2f 2f 1
+2f i simp 1
+2f leav 1
+2f1 1
+2ff 1
+2ff iff 1
+2ff secon 1
+2fic 1
+2fic overhead 1
+2fic overhead rc 1
+2fl 1
+2for 3
+2for exampl 1
+2for simpl 2
+2fw 1
+2g 12
+2g distinct 1
+2g distinct word 1
+2g f1 1
+2g f2g 1
+2g1 1
+2gk 1
+2goal 1
+2h 1
+2h and bi 1
+2h1 2
+2h1 email 1
+2he 1
+2he tupl 1
+2height 1
+2host 1
+2i 11
+2i 1m 1
+2i 1m connect 1
+2i 1m stat 1
+2i 2i 1
+2i 2m 1
+2i 2m connect 1
+2i 3i 1
+2i 3i 4i 1
+2i edg 1
+2i entr 1
+2i et 2i 1
+2i f1fskg 1
+2i k el 1
+2i kjk 1
+2i l group 1
+2i lin 1
+2i outg 1
+2i outg edg 1
+2i switch 1
+2i tn 1
+2ibm 1
+2ibm t.j 1
+2if 1
+2if th designer 1
+2im 2
+2im avec 1
+2im avec pgcd 1
+2in 2
+2in earl 1
+2in earl paper 1
+2in th ca 1
+2j 5
+2j 1x 1
+2j v3 1
+2j1 2
+2j1 2j1 1
+2j1 4j2 1
+2j1 i21 1
+2j1 i21 i1 1
+2j2 1
+2j2 i21 1
+2j2 i22 1
+2jf 1
+2jf j tim 1
+2jm 1
+2jpl 1
+2jr1n 1
+2jrn 1
+2jth 1
+2jth block 1
+2k 9
+2k 2wn 1
+2k c11 1
+2k hard loc 1
+2k instruc 1
+2k lim 1
+2k oper 1
+2k oper window 1
+2k r epon 1
+2k upper 1
+2k upper bound 1
+2k window 1
+2k0 1
+2k1 1
+2k2 2
+2kd 2
+2kd el 1
+2kd el ement 1
+2kjk 1
+2kt 1
+2l 5
+2l log 1
+2l log ai 1
+2l log log 1
+2l ni 1
+2l nod 1
+2l1 1
+2l2 1
+2le 1
+2le fon 1
+2le fon dun 1
+2lesl 1
+2lesl kaelbl 1
+2linstruc 1
+2linstruc se 1
+2linstruc se var 1
+2lj 1
+2lj then fm 1
+2ln 1
+2logm 2
+2logn 1
+2m 6
+2m 2i 1
+2m 2i 2m 1
+2m bit 1
+2m connect 1
+2m disconnect 1
+2m disconnect subgraph 1
+2m in lem 1
+2m part 1
+2m subgraph 1
+2m subproblem 1
+2m1 1
+2maxim 1
+2maxim speedup 1
+2mi 1
+2min 1
+2msec 1
+2msec or 3msec 1
+2n 26
+2n 2p 1
+2n argum 1
+2n argum encod 1
+2n block 1
+2n block bound 1
+2n character 1
+2n column 1
+2n edg 1
+2n expr 1
+2n fi 1
+2n i pn 1
+2n i tn 1
+2n jxj 1
+2n jxj 2n 1
+2n lg 1
+2n m partit 1
+2n pattern 1
+2n pb 1
+2n qg 1
+2n sch 1
+2n sch em 1
+2n step 1
+2n test 1
+2n wil overlap 1
+2n1 1
+2na 1
+2nb 2
+2nb m2 1
+2nconf 1
+2nconf p 2o 1
+2nd 16
+2nd cop 1
+2nd ed 2
+2nd edit 3
+2nd european 1
+2nd european softwar 1
+2nd ie 1
+2nd int 1
+2nd intern 2
+2nd left shift 1
+2nd level 1
+2nd level switch 1
+2nd multim 1
+2nd naclp 1
+2nd naclp workshop 1
+2nd usen 1
+2nd usen symp 1
+2nd workshop 2
+2ni 1
+2nkn 1
+2np 1
+2ns 1
+2ns del 1
+2nwg 1
+2nwg as fil 1
+2o 2
+2o non 1
+2o non privil 1
+2o processeur 1
+2o processeur privil 1
+2o1op2p3p4p5p6p7pp89p10lp1refer 1
+2oe 1
+2oe and po 1
+2oe1 1
+2oe1 t2 1
+2oe1 t2t0 1
+2oe1oe3 1
+2oe1oe3 t2t4 1
+2oe1oe3 t2t4 x5 1
+2on 1
+2on env 1
+2output 1
+2output port 1
+2output port xoutput 1
+2p 5
+2p pgcd 1
+2p po output 1
+2p1 2
+2p1 1024p1 2
+2p1 1024p1 2p1 2
+2p1 22.6p1 2
+2p1 22.6p1 42.6p1 2
+2p1 2p2 2
+2p2 3
+2p2 p2 1
+2p2 p2 c1 1
+2p2 p2 c2 1
+2p2 p2 c5 1
+2p2 p2 u0 1
+2p4 1
+2pag 1
+2pag x 3pag 1
+2pag y 3pag 1
+2part 1
+2pathlength 1
+2pathlength degr 1
+2pb 1
+2pc 1
+2q 1
+2q 1dk 1
+2q 2q 1
+2q 2q 1dk 1
+2r 3
+2r 3jv1n 1
+2r ijr 1
+2r min 1
+2r t ce 1
+2ri 1
+2s 4
+2s dosgetm 1
+2s dosgetm ap 1
+2s th power 1
+2s1 1
+2separ 1
+2separ of dut 1
+2server 1
+2server 3chunk 1
+2server 3chunk 1chunk 1
+2server 3server 1
+2server 3server 4tim 1
+2sr 1
+2ss2 1
+2sw 1
+2sw institut 1
+2sx 1
+2t 7
+2t ar disc 1
+2t spanner 1
+2t spanner g0 1
+2t1 1
+2t1 i21 1
+2t1 i21 i1 1
+2t2 1
+2t2 i22 1
+2t2 i22 i2 1
+2tdt 1
+2th 7
+2th definit 1
+2th differ mod 1
+2th exclam 1
+2th exclam mark 1
+2th is dict 1
+2th oper 1
+2th oper inclus 1
+2th sen 1
+2th underl 1
+2th underl assum 1
+2tn 1
+2tn m tn 1
+2tn n deg 1
+2tn n edg 1
+2tn n input 1
+2tn n unit 1
+2tn n2 1
+2tout 1
+2tout ce 1
+2u1 1
+2u1 c2du1 1
+2v 1
+2var 1
+2w 3
+2w and car 1
+2w cl 1
+2w cn 1
+2w mac 1
+2w with zer 1
+2we 1
+2we ar assum 1
+2wn 1
+2x 5
+2x map 1
+2x map 1x 1
+2x1 1
+2x2 2
+2x2 flat 1
+2x2 flat configur 1
+2x2 mesh 1
+2x2 mesh network 1
+2x2i 1
+2x2i ffl 1
+2xp 1
+2xt 1
+2y 1
+2y2 1
+2z 2
+3.15ms 1
+3.2p1 2
+3.3how 1
+3.3how ea 1
+3.60s 1
+3.60s 2.94ms 1
+3.eqn 1
+3.th 1
+3.th program 1
+3.th program execut 1
+30.0p2 2
+30.0p2 37.8p2 2
+30.0p2 37.8p2 40.0p2 2
+30.y 1
+30ff 1
+30g 1
+30k 1
+30ms 1
+30msec 1
+30msec 10msec 1
+31.d.h 1
+31st 3
+31st annu 1
+31st ie 1
+31st ie annu 1
+32.0p1 2
+32.0p1 53.7p1 2
+32.0p1 53.7p1 64.0p1 2
+32.0p2 2
+32.0p2 32.0p2 2
+32.y.s 1
+320.0l 2
+32k 2
+32kby 1
+32kby in siz 1
+32m 1
+32m by 1
+32p1 2
+32p1 1024p1 2
+32p1 1024p1 32p1 2
+32p1 90.4p1 2
+32p1 90.4p1 107.5p1 2
+33.8p1 2
+33.8p1 45.2p1 2
+33.8p1 45.2p1 51.0p1 2
+33.8p2 2
+33.8p2 45.2p2 2
+33.8p2 45.2p2 51.0p2 2
+33.t.s 1
+330gx 1
+33c45 1
+33rd 2
+33rd annu 1
+33rd annu southeast 1
+33rd ie 1
+33rd ie comp 1
+34b 1
+34th 4
+34th annu 1
+34th annu me 1
+34th foc 1
+34th foc symp 1
+34th ie 2
+34th ie annu 1
+35.j 1
+358.4p2 2
+358.4p2 0.70p2 2
+358.4p2 2.8p2 2
+358.4p2 2.8p2 16.0p2 2
+35g 1
+37.8p2 2
+37.8p2 40.0p2 2
+39pm 1
+3a 4
+3a4 1
+3actu 1
+3as 1
+3as per common 1
+3b 5
+3b j n2 1
+3bk 1
+3bk n0 1
+3bklogn 1
+3bloc 1
+3bloc 2bloc 1
+3bloc 2bloc 1bloc 1
+3bn2 1
+3bn23 1
+3brown 1
+3brown univer box 1
+3c 4
+3capabil 1
+3chunk 1
+3chunk 1chunk 1
+3chunk 1chunk 12chunk 1
+3cnf 1
+3cnf forml 1
+3cur 1
+3d 15
+3d 2d 1
+3d 2d project 1
+3d 4d 2
+3d 4d interconnect 2
+3d 4d internet 2
+3d ca 1
+3d coeff 1
+3d coeff matr 1
+3d coordin 1
+3d curv 1
+3d de 1
+3d de leur 1
+3d definit 1
+3d delaun 1
+3d delaun triangl 1
+3d dobj 1
+3d dobj complec 1
+3d dynam 1
+3d dynam sc 1
+3d finit 1
+3d finit el 1
+3d fram 1
+3d goal 1
+3d graph 1
+3d imag 2
+3d imag proc 1
+3d imag register 1
+3d interact 1
+3d interact anim 1
+3d internet 2
+3d internet becom 2
+3d internetw 2
+3d map 1
+3d march 1
+3d march lin 1
+3d med 1
+3d med imag 1
+3d mesh 2
+3d model 2
+3d model algorithm 1
+3d morphometer 1
+3d morphometer anatom 1
+3d mr 1
+3d mr imag 1
+3d object 2
+3d object classif 1
+3d polygon 1
+3d polygon repr 1
+3d polyhedr 1
+3d reconstruc 1
+3d register 1
+3d register method 1
+3d render 1
+3d render hardwar 1
+3d rigid 1
+3d rigid match 1
+3d sc 1
+3d sc sketch 1
+3d spac 2
+3d spac curv 1
+3d spreadsh 1
+3d spreadsh ba 1
+3d stiff 1
+3d stiff matr 1
+3d structur 1
+3d substructur 1
+3d substructur match 1
+3d surfac 1
+3d surfac construc 1
+3d tim 1
+3d tim unit 1
+3d topolog 2
+3d torus 1
+3d torus topolog 1
+3d visu 1
+3d widg 1
+3dan 1
+3dan ce 1
+3dan ce ca 1
+3dan le 1
+3dan le tutoriel 1
+3dfemwater 1
+3di 1
+3dl 1
+3dn2 1
+3f 2
+3f oe 1
+3ff 1
+3for 1
+3for th reason 1
+3fr 1
+3g 4
+3g1 1
+3h 1
+3i 1
+3i 2j 1
+3i 4i 1
+3i 4i 5i 1
+3i1 2
+3i1 i21 1
+3i1 i21 i1 1
+3i1 i3 1
+3i2 1
+3i2 i22 1
+3i3 1
+3if 1
+3if a 1st 1
+3j 1
+3jf 1
+3jf j tim 1
+3jr 1
+3jv1 1
+3jv1n 1
+3jv1s 1
+3jz 1
+3k 1
+3k n2 1
+3k n3 1
+3kn0 1
+3kn0 logn 1
+3msec 1
+3msec dep 1
+3n 6
+3n and 3n 1
+3n and weight 1
+3n02k2n 1
+3n1 1
+3nous 1
+3nous supposon 1
+3nous supposon qu 1
+3oe 1
+3otp 1
+3our 1
+3our us 1
+3p 3
+3p 4p 1
+3p3 1
+3p3 p3 1
+3p3 p3 c2 1
+3pag 1
+3pag 2pag 1
+3pag x 4pag 1
+3pag y 4pag 1
+3perhap 1
+3qd 2
+3rd 13
+3rd 5th 1
+3rd annu 1
+3rd annu acm 1
+3rd ed 2
+3rd edit 1
+3rd ie 1
+3rd ie symp 1
+3rd int 1
+3rd intern 4
+3rd intern workshop 1
+3rd internatin 1
+3rd intl 1
+3rd workshop 1
+3room 1
+3s 1
+3se 1
+3se leak 1
+3server 1
+3server 4tim 1
+3sinc 1
+3sinc our part 1
+3t3 1
+3th 5
+3th assum 1
+3th funct 1
+3th funct return 1
+3th intern 1
+3th largest 1
+3th largest problem 1
+3th pilot 1
+3th pilot system 1
+3th protocol 1
+3tn 1
+3unfortun 1
+3we 4
+3we consider 1
+3we list 1
+3we say 1
+3x 1
+3x2 1
+3x2 and 2x1 1
+3y 1
+3y icon 1
+3y icon edit 1
+4.00p1 2
+4.0p2 2
+4.0p2 16.0p2 2
+4.0p2 16.0p2 21.3p2 2
+4.0p2 256.0p2 2
+4.0p2 256.0p2 4.0p2 2
+4.12.i 1
+4.12.iv 1
+4.4.iv 1
+4.5msec 1
+40.0p2 2
+40b 1
+40b ss 1
+40bk 1
+40k 2
+40k lin 1
+40mhz 1
+40n 1
+42.6p1 2
+42.6p1 53.8p1 2
+42.6p1 53.8p1 56.8p1 2
+432.bf 1
+432.bf fam 1
+43210level 1
+43n 1
+448.0l 2
+45.2p1 2
+45.2p1 51.0p1 2
+45.2p1 67.7p1 2
+45.2p1 67.7p1 76.1p1 2
+45.2p2 2
+45.2p2 51.0p2 2
+45k 1
+480.0l 2
+480.0l 92.0l 2
+487x 1
+48w 1
+48w w 4x4 1
+48w whil using 1
+496.0l 2
+496.0l 128.0l 2
+4a 6
+4a depict 1
+4a further 1
+4a further step 1
+4a illustr 1
+4a rectangl 1
+4a show 1
+4a2xa2yc 1
+4again 1
+4although 1
+4although th algorithm 1
+4axayc 1
+4b 6
+4b ss 1
+4bk 1
+4c 5
+4c show 1
+4cel 1
+4cel peut 1
+4cel peut aus 1
+4cel sup 1
+4cel sup qu 1
+4d 4
+4d cl 2
+4d configur 2
+4d interconnect 2
+4d internet 2
+4d internetw 2
+4d k ary 2
+4d or hypercub 2
+4d topolog 2
+4dinternetw 2
+4e 2
+4ep2 1
+4ep2 oe4 1
+4ff 1
+4for 2
+4for exampl 1
+4for th conv 1
+4g 3
+4h57 1
+4i 3
+4i 5i 1
+4i 5i 6i 1
+4in 1
+4in fact 1
+4j0 1
+4j0 162j0 1
+4j2 1
+4jpl 1
+4jr 1
+4jrn 1
+4kby 1
+4kby can accommod 1
+4kby for thec 1
+4l5 1
+4lik 1
+4lik tradit 1
+4lik tradit lisp 1
+4m 3
+4ms 1
+4ms per ver 1
+4n 7
+4n 0s 1
+4n 2a 1
+4n 4x 1
+4n character 1
+4n2 1
+4n2 bound 1
+4n2 character 1
+4n2 character correspon 1
+4n2d 1
+4n3 1
+4n3 m3 1
+4n3 m3 term 1
+4n3 m3 tim 1
+4nt 1
+4on 1
+4on should not 1
+4p 4
+4p1 2
+4p1 1024p1 2
+4p1 1024p1 4p1 2
+4p1 2p2 2
+4p1 32.0p1 2
+4p1 32.0p1 53.7p1 2
+4p2 2
+4p4 1
+4p4 p4 1
+4p4 p4 c3 1
+4pa 2
+4pag 1
+4pag 3pag 1
+4pag 3pag 2pag 1
+4pag x 5pag 1
+4pag y 5pag 1
+4s 1
+4t 2
+4t and weight 1
+4t2 1
+4tg 1
+4th 9
+4th dist 1
+4th funct 1
+4th ie 1
+4th ie intern 1
+4th intern 2
+4th model 1
+4th reason 1
+4th sect 1
+4th sect length 1
+4th workshop 1
+4tim 1
+4tim to ge 1
+4to 1
+4to simplif 1
+4to simplif exposit 1
+4u 1
+4un 1
+4un combinaison 1
+4un combinaison manqu 1
+4un coupur 1
+4un coupur superficiel 1
+4un sp 1
+4un sp ecificit 1
+4w 2
+4x 4
+4x map 1
+4x map 2x 1
+4x x 2x 1
+4x2 1
+4x3 1
+4x3 nod 1
+4x3x3x3 2
+4x4 2
+4x4 4x4 1
+4x4 4x4 ba 1
+4x4 8x8 1
+4x4 8x8 16x16 1
+4x4 ba 1
+4x4 ba system 1
+4x4 bidirect 1
+4x4 bidirect switch 1
+4x4 flat 1
+4x4 flat configur 1
+4x4 inter 1
+4x4 inter cluster 1
+4x4 mesh 1
+4x4 mesh interconnect 1
+4x4 mesh network 1
+4x4x 1
+4x4x3x3 2
+4x5x3 1
+4x5x3 network 1
+4x5x3 origin 1
+4x5x3 origin network 1
+5.33p1 2
+5.33s 1
+5.33s 2.62ms 1
+5.6p2 2
+5.6p2 16.0p2 2
+5.6p2 16.0p2 18.9p2 2
+5.6p2 181.0p2 2
+5.6p2 181.0p2 5.6p2 2
+5000k 1
+5000k 6000k 1
+500496t1t2 1
+500msec 1
+501l 1
+501l 635m 1
+504.0l 2
+504.0l 176.0l 2
+5045n 1
+5045n step 1
+508.0l 2
+508.0l 256.0l 2
+50k 1
+50k 120k 1
+50k and 70k 1
+50ns 2
+50ns it impl 2
+51.0p1 2
+51.0p2 2
+510.0l 2
+510.0l 320.0l 2
+510x310cm 1
+511.0l 2
+511.0l 448.0l 2
+511.5l 2
+511.5l 511.5l 2
+512.0p2 2
+512.0p2 0.50p2 2
+512.0p2 2.0p2 2
+512.0p2 2.0p2 16.0p2 2
+512k 1
+53.7p1 2
+53.7p1 64.0p1 2
+53.7p1 64.0p1 64.0p1 2
+53.8p1 2
+53.8p1 56.8p1 2
+56.8p1 2
+56c 1
+579n 1
+579n step 1
+58level 1
+598a 1
+5a 6
+5a and 5b 1
+5a constraint 1
+5a figur 1
+5a figur 5b 1
+5a show 2
+5a show isosurfac 1
+5b 6
+5b figur 1
+5b figur 5c 1
+5b show 2
+5b6 1
+5b6 zinr 1
+5b6 zinr b.p.93 1
+5b7 2
+5b7 canad 1
+5b7 canad fac 1
+5c 2
+5c alloc 1
+5c show 1
+5cel 1
+5cel sup 1
+5cel sup quil 1
+5d 2
+5d 2d 1
+5dan 1
+5dan le 1
+5dan le instruc 1
+5e 1
+5e g.we 1
+5e g.we observ 1
+5e recon. 1
+5f 1
+5f is strict 1
+5g 4
+5g ae 1
+5g ae f1 1
+5g and us 1
+5g f f6g 1
+5g f1 1
+5g f2 1
+5gb 2
+5i 1
+5i 6i 1
+5i 6i 7i 1
+5in 1
+5jv1 1
+5lutil 1
+5lutil de 1
+5lutil de ce 1
+5m 1
+5m log 1
+5n 1
+5ns 1
+5o4o3o2o1oo61o2o3o4o5oplac 1
+5o4o3o2o1oo61o2o3o4o5oplac order 1
+5our 1
+5our protocol 1
+5pag 1
+5pag 4pag 1
+5pag 4pag 3pag 1
+5pag xpag 1
+5pag ypag 1
+5pc 2
+5r 1
+5r and weight 1
+5th 10
+5th berkel 1
+5th berkel symp 1
+5th int 1
+5th intern 4
+5th intern workshop 1
+5th internat 1
+5th sam mean 1
+5th workshop 1
+5ther 1
+5ther ar var 1
+5though 1
+5to 1
+5to th styl 1
+5tod 1
+5un 1
+5un sp 1
+5un sp ec 1
+5w 1
+5we 1
+5x 1
+5x5x5 2
+6.50s 1
+6.50s 3.15ms 1
+6000k 1
+60k 1
+635m 1
+64.0p1 2
+64.0p1 64.0p1 2
+64.0p1 85.3p1 2
+64.0p1 85.3p1 90.5p1 2
+64ec 1
+64ec 128ec 1
+64ec 128ec 256ec 1
+64k 2
+64k direct 1
+64k direct map 1
+64m 1
+64m integer 1
+64p1 2
+64p1 1024p1 2
+64p1 1024p1 64p1 2
+64p1 128.0p1 2
+64p1 128.0p1 130.0p1 2
+64p1 8p2 2
+65k10 1
+67.7p1 2
+67.7p1 76.1p1 2
+67.7p1 76.1p1 73.1p1 2
+68q25 1
+68r10 1
+6a 1
+6a show 1
+6aa 1
+6ae 1
+6ae s0 1
+6another 1
+6another approach 1
+6b 1
+6b show 1
+6c 1
+6c correspon 1
+6d 1
+6dapr 1
+6dapr es 1
+6dapr es me 1
+6g 4
+6g fa 1
+6g g f7 1
+6i 1
+6i 7i 1
+6i 7i 8i 1
+6if 1
+6in 1
+6j 2
+6msec 1
+6not 2
+6not that part 1
+6pag 1
+6pag 5pag 1
+6pag 5pag 4pag 1
+6solomon 1
+6solomon appear 1
+6sur 1
+6sur kcm 1
+6th 14
+6th annu 1
+6th annu workshop 1
+6th brit 1
+6th brit mach 1
+6th int 1
+6th intern 5
+6th intern parl 1
+6th intern workshop 1
+6th intl 1
+6th israel 1
+6th siam 2
+6th valu 1
+6th workshop 1
+6un 1
+6un eff 1
+6un eff sourn 1
+6we 2
+6we can disregard 1
+6we hereb 1
+6we hereb understand 1
+6x2 1
+6x6 1
+6x6 color 1
+6x6 color pan 1
+6x6x7 2
+7.1i 1
+7.a 1
+70k 1
+716.8p2 2
+716.8p2 0.35p2 2
+716.8p2 1.4p2 2
+716.8p2 1.4p2 16.0p2 2
+71n 1
+72k 1
+73.1p1 2
+732b 1
+732b taurus 1
+732b taurus boifn 1
+76.1p1 2
+76.1p1 73.1p1 2
+7a 3
+7a show 1
+7al 1
+7an 1
+7an earl 1
+7an earl ver 1
+7ay 1
+7b 2
+7b show 1
+7e 3
+7e aircraft 1
+7e aircraft oper 1
+7e dk 2
+7g 2
+7he 1
+7i 1
+7i 8i 1
+7i.e 1
+7in 2
+7in th lambd 1
+7l 1
+7l point 1
+7l point alor 1
+7le 1
+7le term 1
+7le term pil 1
+7n 1
+7nf 2
+7nf unit 1
+7nf unit kingdom 1
+7p 1
+7pag 1
+7pag 6pag 1
+7pag 6pag 5pag 1
+7th 10
+7th acm 2
+7th acm pod 1
+7th annu 1
+7th annu workshop 1
+7th european 1
+7th ijc 1
+7th int 2
+7th intern 2
+7th intern joint 1
+7th intern vldb 1
+7th lower 1
+7th lower bound 1
+7voir 1
+7voir toutef 1
+7voir toutef le 1
+7x 1
+8.00p1 2
+8.0p1 2
+8.0p2 2
+8.0p2 128.0p2 2
+8.0p2 128.0p2 8.0p2 2
+8.0p2 16.0p2 2
+8.0p2 16.0p2 16.0p2 2
+8.html 1
+8.html sec7 1
+80bau3b 1
+80cm 1
+81ff 1
+82db 1
+83ln 1
+85.3p1 2
+85.3p1 90.5p1 2
+85.3p1 90.5p1 85.3p1 2
+88db 1
+8a 3
+8b 3
+8b0 1
+8bit 2
+8bit cycl 2
+8c 3
+8c r4r 1
+8c w w2 1
+8c0 1
+8c0 l0 1
+8ce 1
+8ce princip 1
+8ce princip est 1
+8d 3
+8d0 1
+8en 1
+8en r ealit 1
+8g 5
+8g f1 1
+8g f4g 1
+8g f4g f4 1
+8g h f9 1
+8hg 1
+8i 9
+8i partit 1
+8ik 1
+8il 1
+8il y en 1
+8j 3
+8k 5
+8k by 1
+8k by pag 1
+8k ca2 1
+8k j comput 1
+8k show 1
+8kg100norm 1
+8kg100norm execut 1
+8kg100norm execut tim100.0 1
+8kloc100norm 1
+8kloc100norm execut 1
+8kloc100norm execut tim100.0 1
+8kml100norm 1
+8kml100norm execut 1
+8kml100norm execut tim100.0 1
+8kmp3d100norm 1
+8kmp3d100norm execut 1
+8kmp3d100norm execut tim100.0 1
+8kwater100norm 1
+8kwater100norm execut 1
+8kwater100norm execut tim100.0 1
+8l 2
+8l0 1
+8l00 1
+8m 4
+8m doubl 1
+8m integer 1
+8m integer number 1
+8m nj 1
+8mm 1
+8n 3
+8n n0 1
+8p 2
+8p1 2
+8p1 1024p1 2
+8p1 1024p1 8p1 2
+8p1 45.2p1 2
+8p1 45.2p1 67.7p1 2
+8p2 2
+8pi 1
+8r 1
+8s 3
+8s0 1
+8t 2
+8t oe 1
+8t oe 9t0 1
+8t00 1
+8t01 1
+8t01 t1 1
+8t02 1
+8t02 t1 1
+8t2 1
+8t2 t1 1
+8th 11
+8th aisb 1
+8th annu 1
+8th annu acm 1
+8th colloq 1
+8th ie 1
+8th ie workshop 1
+8th intern 3
+8th intern joint 1
+8th israel 1
+8th nat 1
+8th phr 1
+8th reader 1
+8u 2
+8ver 1
+8ver eclip 1
+8w 3
+8ww 1
+8x 7
+8x map 1
+8x map 4x 1
+8x1 1
+8x4 1
+8x5 1
+8x5 rectangl 1
+8x8 2
+8x8 16x16 1
+8x8 interconnect 1
+8x8 mesh 1
+8x8 mesh inter 1
+8x8 mesh interconnect 1
+8x8 unidirect 1
+8x8 unidirect switch 1
+8x8y 1
+8x8y8z 1
+8x9y 2
+8xc 1
+8xi 1
+8xy 1
+8y 2
+8y2f0 1
+8y9x 1
+8z 1
+90.4p1 2
+90.4p1 107.5p1 2
+90.4p1 107.5p1 107.6p1 2
+90.5p1 2
+90.5p1 85.3p1 2
+90a 1
+90b 1
+915293522464912345678910111201261211ar 1
+92.0l 2
+94a 1
+94e 1
+95k 2
+96a 1
+96b 1
+971397771598541458711162075hotspot 1
+971397771598541458711162075hotspot nod 1
+99g 1
+9a 3
+9a 8d 1
+9a01 1
+9a1 1
+9acc 1
+9acc acc 1
+9acc racc 1
+9avail 1
+9avail as libr 1
+9b 3
+9b 8a 1
+9c 3
+9c l1 1
+9conf 1
+9conf r02 1
+9dsp 1
+9dsp r01 1
+9e 1
+9e 8a 1
+9e 8d 1
+9en 1
+9en fait 1
+9f 1
+9g 4
+9g 9y 1
+9g 9y sg 1
+9h 1
+9hg 1
+9ib 1
+9ij 1
+9ij congru 1
+9io 1
+9j 3
+9jt 1
+9k 3
+9k s.t 1
+9l 2
+9l0 1
+9le 1
+9le syst 1
+9le syst em 1
+9lutil 1
+9lutil de 1
+9lutil de minuscl 1
+9m0 1
+9mj 1
+9p0 1
+9pt 1
+9pt font 1
+9rk 1
+9s 3
+9so 1
+9t 1
+9t0 1
+9t0 8t00 1
+9t1 1
+9t2 1
+9t3 1
+9t3 t11 1
+9th 7
+9th acm 3
+9th acm pod 1
+9th annu 1
+9th annu workshop 1
+9th refin 1
+9th structur 1
+9u 3
+9u oeu 1
+9u oeu 9u0 1
+9u0 1
+9u0 9u00 1
+9u00 1
+9v 4
+9v oev 1
+9v oev 9v0 1
+9v0 1
+9v0 9v00 1
+9v00 1
+9x 5
+9x01 1
+9x01 a vect 1
+9x1 1
+9x19x2 1
+9x2f0 1
+9x2fbmgn 1
+9x9 1
+9x9 rectangl 1
+9y 4
+9y sg 1
+9z 2
+a.1 6
+a.1 ba 1
+a.1 ba design 1
+a.1 babel 1
+a.1 babel tr 1
+a.1 collect 1
+a.1 collect a.2 1
+a.1 composit 1
+a.1 giv 1
+a.1 perform 1
+a.1 perform intrin 1
+a.1 softwar 1
+a.1 softwar siz 1
+a.1 temp 1
+a.1 temp de 1
+a.1 th kcm 1
+a.1.1 2
+a.1.1 co 1
+a.1.1 co ut 1
+a.1.2 2
+a.1.2 d efaut 1
+a.1.2 modif 1
+a.1.3 2
+a.1.3 implem 1
+a.1.3 implem built 1
+a.1.3 producteur 1
+a.1.3 producteur consommateur 1
+a.1.4 2
+a.1.4 d efaut 1
+a.1.4 word 1
+a.1.4 word format 1
+a.1.5 1
+a.1.5 pract 1
+a.1.5 pract hardwar 1
+a.10 2
+a.10 number 1
+a.10 number a.11 1
+a.11 2
+a.11 object 1
+a.12 2
+a.12 stream 1
+a.12 stream a.13 1
+a.13 2
+a.13 string 1
+a.13 string a.14 1
+a.14 2
+a.14 symbol 1
+a.14 symbol a.15 1
+a.15 2
+a.15 syntac 1
+a.16 2
+a.16 thread 1
+a.17 2
+a.18 1
+a.19 1
+a.2 6
+a.2 compar 1
+a.2 compar a.3 1
+a.2 conclus 1
+a.2 dur 1
+a.2 dur ee 1
+a.2 fonct 1
+a.2 fonct de 1
+a.2 hardwar 1
+a.2 hardwar architectur 1
+a.2 hardwar evalu 1
+a.2 illustr 1
+a.2 illustr le 1
+a.2 kcm 1
+a.2 kcm word 1
+a.2 structur 1
+a.2 structur shar 1
+a.2 summariz 1
+a.2.1 1
+a.2.1 control 1
+a.2.2 1
+a.2.2 th execut 1
+a.2.3 1
+a.2.3 th prefetch 1
+a.2.4 1
+a.2.4 th memor 1
+a.2.5 1
+a.2.5 th interfac 1
+a.20 1
+a.21 1
+a.22 1
+a.23 1
+a.24 1
+a.25 1
+a.26 1
+a.27 1
+a.28 1
+a.29 1
+a.3 6
+a.3 compar 1
+a.3 comparaison 1
+a.3 comparaison entr 1
+a.3 condit 1
+a.3 don 1
+a.3 don le 1
+a.3 jacob 1
+a.3 jacob de 1
+a.3 quon 1
+a.3 refin 1
+a.3 refin test 1
+a.3 softwar 1
+a.3 softwar architectur 1
+a.3 th kcm 1
+a.3 top 1
+a.3 top level 1
+a.3.1 1
+a.3.1 oper 1
+a.3.1 oper system 1
+a.3.2 1
+a.3.2 th prolog 1
+a.3.3 1
+a.3.3 system 1
+a.3.3 system debug 1
+a.3.4 1
+a.3.4 implem 1
+a.3.4 implem langu 1
+a.30 1
+a.31 1
+a.32 1
+a.33 1
+a.34 1
+a.35 1
+a.36 1
+a.37 1
+a.38 1
+a.39 1
+a.4 6
+a.4 babel 1
+a.4 babel stack 1
+a.4 compar 1
+a.4 cop 1
+a.4 cop a.5 1
+a.4 evalu 1
+a.4 forml 1
+a.4 kcm 1
+a.4 kcm pipelin 1
+a.4 show 1
+a.4 temp 1
+a.4 temp de 1
+a.4 th kcm 1
+a.4.1 1
+a.4.1 benefit 1
+a.4.1 benefit an 1
+a.4.2 1
+a.4.2 th kcm 1
+a.4.3 1
+a.4.3 th kcm 1
+a.40 1
+a.41 1
+a.42 1
+a.43 1
+a.44 1
+a.45 1
+a.46 1
+a.47 1
+a.48 1
+a.49 1
+a.5 4
+a.5 babel 1
+a.5 babel graph 1
+a.5 conclus 1
+a.5 doubl 1
+a.5 doubl float 1
+a.5 th execut 1
+a.50 1
+a.51 1
+a.52 1
+a.53 1
+a.54 1
+a.55 1
+a.56 1
+a.57 1
+a.58 1
+a.59 1
+a.6 4
+a.6 el 1
+a.6 el funct 1
+a.6 subcomput 1
+a.6 th prefetch 1
+a.60 1
+a.61 1
+a.62 1
+a.63 1
+a.64 1
+a.65 1
+a.66 1
+a.67 1
+a.68 1
+a.69 1
+a.7 4
+a.7 event 1
+a.7 giv 1
+a.7 kcm 1
+a.7 kcm softwar 1
+a.7 optim 1
+a.8 3
+a.8 funct 1
+a.8 speed 1
+a.9 2
+a.9 format 1
+a.9 format io 1
+a.b 1
+a.baserman 1
+a.baserman kf 1
+a.baserman kf juelich.de 1
+a.c 3
+a.c.bovik 1
+a.d 1
+a.g 3
+a.h 2
+a.h.g 1
+a.j 3
+a.k 4
+a.kuhr 1
+a.l 2
+a.m 2
+a.p 3
+a.s 2
+a.t 1
+a.u 3
+a.v 3
+a.w 1
+a0 17
+a0 a1 1
+a0 a1 a2 1
+a0 and a0 1
+a0 ar connect 1
+a0 b0 2
+a0 b1 1
+a0 by ad 1
+a0 by invok 1
+a0 execut 1
+a0 form 1
+a0 ha rank 1
+a0 iff 1
+a0 in st 1
+a0 is connect 1
+a0 is coplanar 1
+a0 j loop 1
+a0 j var 1
+a0 me 1
+a0 me specif 1
+a0 monit 1
+a0 monit shunt 1
+a0 nest 1
+a0 perform 1
+a0 pour 1
+a0 pour le 1
+a0 ref 1
+a0 repr 1
+a0 u1 1
+a00 2
+a00 by replac 1
+a00 contain 1
+a00 contain exact 1
+a00 ha fl 1
+a001 1
+a00j 1
+a00j result 1
+a00x00 1
+a01 2
+a01a02 1
+a01f 1
+a01u 1
+a01x01 1
+a023588 1
+a0i 1
+a0i a0j 1
+a0i a0j iff 1
+a0ic 1
+a0ij 1
+a0ijxj 1
+a0is 1
+a0j 1
+a0j iff 1
+a0j iff fi 1
+a0k 2
+a0ka 1
+a0ka est 1
+a0ka est redon 1
+a0ka pi2v 1
+a0ka pi2v fkg 1
+a0kxk 1
+a0n 1
+a0um 1
+a0x 1
+a0x b0 1
+a0x0 1
+a1 33
+a1 a2 5
+a1 a2 a1 1
+a1 a2 a3 1
+a1 a500 1
+a1 and a2 4
+a1 and shorter 1
+a1 avant 1
+a1 avant lappel 1
+a1 b0 1
+a1 b1 3
+a1 ca 1
+a1 ca a2 1
+a1 concat 1
+a1 dg 1
+a1 et a3 1
+a1 f0 1
+a1 j a2 1
+a1 j oe 1
+a1 l1 1
+a1 label 1
+a1 label a0 1
+a1 ne 1
+a1 ne peut 1
+a1 occur 1
+a1 partit 1
+a1 partitit 1
+a1 repr 1
+a1 requir 1
+a1 requir resourc 1
+a1 shown 1
+a1 termin 1
+a1 trouv 1
+a1 trouv dan 1
+a1 un term 1
+a1 x a2 1
+a1 x c1 1
+a1 x unif 1
+a11 2
+a11 a12 1
+a11 a21 1
+a12 1
+a12 a22 1
+a1a0 1
+a1a2 2
+a1am 1
+a1am tring 1
+a1am tring a37 1
+a1b1 2
+a1b1 a2b3 1
+a1b2 2
+a1b2 a2b4 1
+a1bn 1
+a1ik 1
+a1ik b1 1
+a1ik b1 m1 1
+a1p1b1 1
+a1p1b1 a qb 1
+a1q1b1 1
+a1r 1
+a1r a2r 1
+a1r run 1
+a2 25
+a2 a1 1
+a2 a3 1
+a2 a3 a4 1
+a2 and a2 1
+a2 ar consecut 1
+a2 ar giv 1
+a2 b2 1
+a2 b2 c2 1
+a2 color 1
+a2 cont 1
+a2 cont alor 1
+a2 cr 1
+a2 cr ee 1
+a2 ge 1
+a2 ge structur 1
+a2 giv 1
+a2 in program 1
+a2 j oe 1
+a2 le 1
+a2 le contenu 1
+a2 output 1
+a2 rang 1
+a2 rang dan 1
+a2 repr 1
+a2 requir 1
+a2 requir resourc 1
+a2 respect 1
+a2 se 1
+a2 se born 1
+a2 termin 1
+a2 to a1 1
+a2 tupl 1
+a2 tupl length 1
+a2 va 1
+a2 va conduir 1
+a2 with scheduler 1
+a2 x c2 1
+a2 x proceed 1
+a21 1
+a21 a22 1
+a22 2
+a293 1
+a2b 1
+a2b wh 1
+a2b wh ai 1
+a2b1 1
+a2b2 1
+a2b3 1
+a2b4 1
+a2bn 1
+a2c 1
+a2k 1
+a2k21 1
+a2k21 k23 1
+a2r 1
+a2x 1
+a2xb2y 1
+a2xx2 1
+a2xx2 bxx 1
+a2y 1
+a2yb2x 1
+a2yy2 1
+a3 10
+a3 a4 1
+a3 ait 1
+a3 b problem 1
+a3 dan 1
+a3 dan linstruc 1
+a3 dealloc 1
+a3 dealloc execut 1
+a3 dealloc proceed 1
+a3 environm 1
+a3 et ge 1
+a3 et unif 1
+a3 ge 1
+a3 ge valu 1
+a3 instruc 1
+a3 is follow 1
+a3 l1 1
+a3 l3 1
+a3 loop 1
+a3 ne 1
+a3 ne peut 1
+a3 proceed 1
+a3 then a1 1
+a3379 1
+a37 1
+a37 2154a3a8 1
+a37 2154a3a8 w1 1
+a3b1 2
+a3b1 a4b3 1
+a3b2 2
+a3b2 a4b4 1
+a3bn 1
+a4 4
+a4 and b1 1
+a4 by re 1
+a4 l1 1
+a4 l2 1
+a4 l2 execut 1
+a4 of a4 1
+a4 we def 1
+a4b1 1
+a4b2 1
+a4b3 1
+a4b4 1
+a4bn 1
+a4t 1
+a5 3
+a5 x unif 1
+a500 1
+a550 1
+a6 2
+a6 in figur 1
+a6 y lt 1
+a7 2
+a7 l3 1
+a8 2
+a898 1
+a8t 1
+a9 1
+a9d 1
+aa 12
+aa aa 1
+aa aa aa 1
+aa aa acc 1
+aa aa vi 1
+aa acc 1
+aa algorithm 1
+aa algorithm overhead 1
+aa bstract 1
+aa bstract ba 1
+aa distribut 1
+aa pr 1
+aa read 1
+aa read aa 1
+aa ref 1
+aa shar 1
+aa shar aa 1
+aa spring 1
+aa sync 1
+aa tot 1
+aa tot aa 1
+aa vi 1
+aaabbccc 1
+aac 1
+aac algorithm 1
+aac algorithm anim 1
+aach 1
+aagaard 1
+aahv91 1
+aalborg 4
+aalborg o denmark 2
+aalborg ost 1
+aalborg univer fredrik 1
+aalborg univer steff 1
+aamat 1
+aap 1
+aap qbp 1
+aapqb 1
+aarhus 1
+ab 28
+ab de 1
+ab de crit 1
+ab de mi 1
+ab denot 1
+ab from deadlock 1
+ab of bus 1
+ab of cont 1
+ab of context 1
+ab of control 1
+ab of coroutin 1
+ab of cut 1
+ab of deadlock 1
+ab of detect 1
+ab of direct 1
+ab of establ 1
+ab of expect 1
+ab of fault 1
+ab of indirect 1
+ab of parenth 1
+ab of technolog 1
+ab of term 1
+ab of word 1
+ab or ba 1
+ab or pr 1
+ab qp 1
+ab qq 1
+ab r ap 1
+ab93 2
+abaaccdcdbdb 1
+abad 4
+abad and luc 1
+abal 1
+abandon 4
+abandon by return 1
+abandon nod 1
+abandon strict 1
+abandon strict implicit 1
+abandon try 1
+abandonner 1
+abandonner le 1
+abandonner le champ 1
+abaq 1
+abbot 1
+abbr 1
+abbrev 11
+abbrev as ddp 1
+abbrev as ddpm 1
+abbrev by using 1
+abbrev construc 1
+abbrev construc decl 1
+abbrev cp 1
+abbrev cp repr 1
+abbrev distinct 1
+abbrev for backtrack 1
+abbrev for label 1
+abbrev loc 1
+abbrev loc form 1
+abbrev narrow 1
+abbrev narrow bfather 1
+abbrev nontr 1
+abbrev nontr edg 1
+abbrev refer 1
+abbrev respect 1
+abbrev return 1
+abbrev return cur 1
+abbrev th incorpor 1
+abbrev to lin 1
+abbrev using 1
+abbrev using apostroph 1
+abbrev. 1
+abc 2
+abc a string 1
+abc est 1
+abc est un 1
+abcababdaaahaefaeaaegaiusv 1
+abcababdaahaefaeaegaiabcababdaahaefaeaeg 1
+abcd 1
+abcdeabcdeabcdeinit 1
+abcdeabcdeabcdeinit incon 1
+abcdeabcdeabcdeinit incon stateoptim 1
+abcdef 1
+abcdefabcdef 1
+abcl 2
+abcl al allow 1
+abcl an object 1
+abcl r me 1
+abcl r2 1
+abcl r3 1
+abcl r3schemeschem 1
+abcm 1
+abctim 1
+abdelguerf 1
+abdelguerf and lavingt 1
+abduc 1
+abduc explan 1
+abdullah 1
+abdullah uz 1
+abdullah uz tansel 1
+abel 1
+abel system 1
+abelson 1
+abff 1
+abff and baff 1
+abhiram 2
+abhiram ranad 2
+abil 31
+abil del 1
+abil del multithread 1
+abil in cql 1
+abil of frameb 1
+abil of multipl 1
+abil of neur 1
+abil of proc 1
+abil perm 1
+abil to annot 1
+abil to ap 2
+abil to challeng 1
+abil to control 1
+abil to deal 1
+abil to defer 1
+abil to ea 1
+abil to el 1
+abil to encapsl 1
+abil to evolut 1
+abil to extract 1
+abil to find 1
+abil to handl 2
+abil to improv 1
+abil to inclus 1
+abil to integr 1
+abil to interpr 1
+abil to introspect 1
+abil to invok 1
+abil to mak 1
+abil to manipl 1
+abil to model 1
+abil to overcom 1
+abil to parallel 1
+abil to perform 2
+abil to pop 1
+abil to prov 1
+abil to pursu 1
+abil to qu 1
+abil to reason 2
+abil to respon 1
+abil to say 1
+abil to select 1
+abil to sen 1
+abil to serv 1
+abil to st 1
+abil to support 2
+abil to tim 1
+abil var 1
+abil var lin 1
+abiteboul 2
+abiteboul and vianu 1
+abk1k2 1
+abk1k2 k3k4 1
+abl 72
+abl correct 1
+abl et synth 1
+abl lookup 1
+abl to account 1
+abl to achief 1
+abl to addr 1
+abl to administer 1
+abl to apprec 1
+abl to autom 1
+abl to build 1
+abl to calcl 1
+abl to captur 1
+abl to car 1
+abl to catch 1
+abl to ch 4
+abl to commun 1
+abl to comp 1
+abl to compar 2
+abl to compl 1
+abl to comput 1
+abl to conc 1
+abl to construc 5
+abl to control 1
+abl to cop 1
+abl to countermand 1
+abl to deal 1
+abl to decomp 1
+abl to deform 1
+abl to describ 1
+abl to design 1
+abl to detect 2
+abl to determin 3
+abl to di 1
+abl to direct 1
+abl to discover 1
+abl to dispatch 1
+abl to dr 1
+abl to draw 1
+abl to ea 1
+abl to ef 1
+abl to eff 1
+abl to elect 1
+abl to encod 1
+abl to enter 1
+abl to establ 1
+abl to explain 2
+abl to expr 2
+abl to facilit 1
+abl to fail 1
+abl to feed 1
+abl to fic 1
+abl to fil 1
+abl to find 4
+abl to fl 1
+abl to forml 1
+abl to gener 6
+abl to guar 1
+abl to handl 3
+abl to hold 1
+abl to identif 2
+abl to ignor 1
+abl to impl 1
+abl to improv 1
+abl to incr 1
+abl to infer 2
+abl to learn 2
+abl to loc 2
+abl to maintain 1
+abl to mak 2
+abl to map 1
+abl to maxim 1
+abl to me 1
+abl to measur 1
+abl to model 2
+abl to modif 2
+abl to monit 1
+abl to obtain 3
+abl to pa 1
+abl to parallel 1
+abl to predict 1
+abl to print 1
+abl to proc 2
+abl to produc 3
+abl to prov 4
+abl to prun 1
+abl to reason 3
+abl to recogn 2
+abl to reconstitut 1
+abl to reconstruc 1
+abl to recover 2
+abl to reduc 2
+abl to refer 1
+abl to reflect 1
+abl to remov 2
+abl to replac 1
+abl to repr 2
+abl to reus 1
+abl to rout 1
+abl to say 1
+abl to se 3
+abl to sen 1
+abl to shift 1
+abl to show 2
+abl to siml 2
+abl to simplif 1
+abl to speak 1
+abl to specif 3
+abl to speed 1
+abl to st 1
+abl to stud 1
+abl to suff 1
+abl to support 1
+abl to sustain 1
+abl to tak 1
+abl to talk 1
+abl to toler 1
+abl to turn 1
+abl to undertak 1
+abl to us 2
+abl to work 1
+abl to writ 1
+abl us 1
+abl us sv 1
+abl with cur 1
+ablec 2
+ablec publ 2
+ablec publ corpor 1
+ablog 1
+ablog tc 1
+abnorm 1
+abnorm behavior 1
+abnorm behavior account 1
+abnorm st 1
+abol 1
+abord 4
+abord ee 1
+abord ee en 1
+abord ee par 1
+abord es 1
+abord es dan 1
+abord la 1
+abord la mi 1
+abord le 2
+abord le suj 1
+abord le techniqu 1
+aborder 1
+aborder ce 1
+aborder ce probl 1
+abort 10
+abort a ct 1
+abort and fin 1
+abort must keep 1
+abort record 1
+abort record docum 1
+abort th oper 1
+abort th program 1
+abort th test 1
+abort th thread 1
+abort thread 1
+abort transact 2
+about 1
+about a un 1
+about3 1
+aboutir 1
+aboutit 3
+aboutit ain 2
+abov 1
+abov consider 1
+abp 1
+abq 1
+abramowitz 1
+abramsk 3
+abridg 1
+abridg ver 1
+abrw91 1
+absc 2
+absc and ord 1
+absc ma 1
+absc ma quaucun 1
+absent 7
+absent de 2
+absent de autr 1
+absent de ver 1
+absent du 1
+absent mind 1
+absol 2
+absol car 1
+absol car il 1
+absol n ecessair 1
+absolu 2
+absolu de 1
+absolu de coeff 1
+absolu du 1
+absolut 22
+absolut addr 1
+absolut bar 1
+absolut bar lat 1
+absolut certaint 1
+absolut channel 2
+absolut channel width 2
+absolut continu 1
+absolut differ 1
+absolut dist 1
+absolut ind 1
+absolut loc 1
+absolut me 1
+absolut me siz 1
+absolut measur 1
+absolut nec 2
+absolut ontolog 1
+absolut ontolog character 1
+absolut or 1
+absolut or using 1
+absolut perform 1
+absolut prior 1
+absolut refer 1
+absolut retrief 1
+absolut retrief failur 1
+absolut scal 1
+absolut scal siz 1
+absolut siz 1
+absolut speed 1
+absolut speed rat 1
+absolut valu 2
+absolut valu smaller 1
+absorb 3
+absorb est 1
+absorb est de 1
+absorb fragm 1
+absorb sexprim 1
+absorb sexprim com 1
+absorb th heav 1
+abstract 128
+abstract accord 1
+abstract adapt 1
+abstract adapt act 1
+abstract aid 1
+abstract aid maint 1
+abstract algebr 1
+abstract algorithm 1
+abstract allow 1
+abstract an atom 1
+abstract and appl 1
+abstract and concr 1
+abstract and cop 1
+abstract and diver 1
+abstract and exploit 1
+abstract and hierarch 1
+abstract and pag 1
+abstract and phy 1
+abstract and refin 1
+abstract and reus 1
+abstract and secur 1
+abstract ar aid 1
+abstract ar clear 1
+abstract ar design 1
+abstract ar effect 1
+abstract ar fundam 1
+abstract ar known 1
+abstract ar mad 1
+abstract aw featur 1
+abstract b prov 1
+abstract b ye 1
+abstract behavior 1
+abstract boolean 1
+abstract boolean valu 1
+abstract by introduc 1
+abstract by mean 1
+abstract by using 2
+abstract cl 3
+abstract cl number 1
+abstract cl requir 1
+abstract common 1
+abstract compon 1
+abstract compon interfac 1
+abstract comput 2
+abstract constraint 1
+abstract counterpart 1
+abstract dat 4
+abstract dat com 1
+abstract dat object 1
+abstract dat typ 3
+abstract de 2
+abstract de la 1
+abstract de propr 1
+abstract definit 1
+abstract definit mach 1
+abstract denot 1
+abstract denot sem 1
+abstract deriv 1
+abstract descript 1
+abstract descript level 1
+abstract design 2
+abstract distribut 1
+abstract distribut search 1
+abstract domain 2
+abstract domain concept 1
+abstract domain us 1
+abstract dur diagn 1
+abstract eclip 1
+abstract eclip cod 1
+abstract evolut 1
+abstract evolut algebr 1
+abstract f reduc 1
+abstract facil 1
+abstract for describ 1
+abstract for ext 1
+abstract for feder 1
+abstract for level 1
+abstract framework 1
+abstract from re 1
+abstract funct 1
+abstract g help 1
+abstract g slower 1
+abstract gener 1
+abstract grammar 1
+abstract graph 1
+abstract graph match 1
+abstract hc 1
+abstract hc intern 1
+abstract impl 1
+abstract implem 1
+abstract in model 1
+abstract infer 2
+abstract infer method 1
+abstract interch 1
+abstract interfac 3
+abstract interpr 2
+abstract interpr framework 1
+abstract interpr techniqu 1
+abstract interpr theor 1
+abstract involut 1
+abstract involut structur 1
+abstract is enforc 1
+abstract knowledg 1
+abstract knowledg structur 1
+abstract lead 1
+abstract level 3
+abstract lik cl 1
+abstract mach 5
+abstract mach cam 1
+abstract mach ibam 1
+abstract match 1
+abstract methodolog 1
+abstract model 5
+abstract object 2
+abstract object shap 1
+abstract observabl 1
+abstract of factu 1
+abstract of non 1
+abstract of shar 1
+abstract of sld 1
+abstract on 1
+abstract on model 1
+abstract on satisf 1
+abstract op 1
+abstract oper 3
+abstract oper sem 1
+abstract or composit 1
+abstract parallel 1
+abstract parallel mach 1
+abstract parsetr 1
+abstract pattern 1
+abstract plan 1
+abstract pr 1
+abstract prev 1
+abstract prev defin 1
+abstract prim 1
+abstract prim sem 1
+abstract problem 1
+abstract problem solut 1
+abstract proc 1
+abstract proc continu 1
+abstract proc instead 1
+abstract program 1
+abstract program paradigm 1
+abstract prolog 3
+abstract prolog instruc 3
+abstract promin 1
+abstract promin reg 1
+abstract proper 3
+abstract reason 1
+abstract recur 1
+abstract recur neur 1
+abstract reduc 2
+abstract reduc complec 1
+abstract reduc strateg 1
+abstract reduc system 1
+abstract regr 1
+abstract regr test 1
+abstract rel 1
+abstract se 2
+abstract sem 1
+abstract sem funct 1
+abstract sem us 1
+abstract separ 1
+abstract sequ 1
+abstract sequ algorithm 1
+abstract sever emerg 1
+abstract solut 1
+abstract som stat 1
+abstract specif 1
+abstract st 1
+abstract step 1
+abstract structur 1
+abstract substitut 1
+abstract support 1
+abstract synchron 1
+abstract syntac 1
+abstract system 2
+abstract system model 1
+abstract task 2
+abstract task descript 1
+abstract task structur 1
+abstract tdfg 1
+abstract tdfg nod 1
+abstract techniqu 1
+abstract th report 1
+abstract th transm 1
+abstract that bind 1
+abstract then ts 1
+abstract theor 1
+abstract to custom 1
+abstract to model 1
+abstract tool 1
+abstract top 1
+abstract tr 2
+abstract tr form 1
+abstract tr input 1
+abstract tr repr 1
+abstract transit 1
+abstract transit rel 1
+abstract transit system 1
+abstract typ 2
+abstract typ def 1
+abstract typ interfac 1
+abstract understand 1
+abstract unif 1
+abstract unif funct 1
+abstract univer 1
+abstract univer program 1
+abstract var 1
+abstract var rel 1
+abstract ver 3
+abstract view 2
+abstract w.r.t 1
+abstract we design 1
+abstract we introduc 1
+abstract we show 1
+abstract when implem 1
+abstract which allow 1
+abstract which facilit 1
+abstract wil eventu 1
+abstract with cl 1
+abstract with mlr 1
+abstract1 1
+abstrait 2
+abstrait annot 1
+abstrait annot ee 1
+abstrait ba 1
+abstrait ba ee 1
+abstrait daquarius 1
+abstrait de 1
+abstrait de instruc 1
+abstrait de kcm 1
+abstrait de typ 1
+abstrait de war 1
+abstrait decrc 1
+abstrait decrc prolog 1
+abstrait du 1
+abstrait du sous 1
+abstrait du syst 1
+abstrait dun 1
+abstrait dun fonct 1
+abstrait dun var 1
+abstrait en 1
+abstrait en ce 1
+abstrait et son 1
+abstrait prolog 1
+abstrait sp 1
+abstrait sp ecifiqu 1
+abstrait toam 1
+abstrait var 1
+absurd 1
+absurd and mean 1
+absurdum 1
+abund 1
+abund exampl 1
+abus 5
+abus bbus 1
+abus bbus ibus 1
+abus dbus 1
+abus dbus pbus 1
+abus de 1
+abus de lang 1
+abus dt 1
+abus for conv 1
+abus not 1
+abusiv 1
+abut 1
+abut and overlap 1
+ac 24
+ac 5a 1
+ac 5a constraint 1
+ac a de 2
+ac a la 1
+ac a laddit 1
+ac a lajout 1
+ac a linstruc 1
+ac a lintroduc 1
+ac a lop 1
+ac a lutil 1
+ac a un 1
+ac align 1
+ac align cub 1
+ac amin 1
+ac and ac 1
+ac and fin 1
+ac and repr 1
+ac ar mc 1
+ac ar parallel 1
+ac au 3
+ac au mod 1
+ac au recouvr 1
+ac au th 1
+ac aux 3
+ac aux propr 1
+ac aux techniqu 1
+ac aux trac 1
+ac ba 1
+ac bind 1
+ac coeff 1
+ac converg 1
+ac correspon 1
+ac correspon aux 1
+ac de 3
+ac de coordon 1
+ac de point 1
+ac de recherch 1
+ac deduc.ps.z 1
+ac dit 1
+ac dit erat 1
+ac en 1
+ac fl 1
+ac giv 1
+ac homolog 1
+ac impl 1
+ac in fig 1
+ac in figur 1
+ac ind 1
+ac intersect 1
+ac is form 1
+ac is refer 1
+ac lik theor 1
+ac of camer 1
+ac oper 1
+ac oper bind 1
+ac pl 1
+ac principaux 1
+ac rel 1
+ac repr 1
+ac rewrit 1
+ac rewrit se 1
+ac rl 1
+ac sequ 1
+ac sequ determin 1
+ac typ 1
+ac we denot 1
+ac94a 1
+ac94b 1
+acad 3
+academ 28
+academ and industr 2
+academ ar explor 1
+academ comput3 1
+academ of appl 1
+academ of sc 1
+academ or industr 1
+academ pr 17
+academ pr inc 2
+academ pr n.y 1
+academ prah 1
+academ psycholog 1
+academ psycholog feel 1
+academ publ 6
+academ publ b.v 1
+academ publ group 1
+academ research 1
+academ research collabor 1
+academ sen 1
+academ sen grant 1
+academ sit 1
+academ to prov 1
+acap 1
+acap techn 1
+acap techn mem 1
+acc 71
+acc a lock 1
+acc a lutilisateur 1
+acc a pag 1
+acc a particl 1
+acc a perman 1
+acc a plac 1
+acc a rol 1
+acc a se 1
+acc a shar 1
+acc a singl 1
+acc a var 1
+acc acc 1
+acc addr 1
+acc an inst 1
+acc an unbound 1
+acc and ensur 1
+acc and interproc 1
+acc and manipl 2
+acc and modif 1
+acc and phy 1
+acc and transfer 1
+acc and upd 2
+acc ap 1
+acc ap record 1
+acc appear 1
+acc ar comput 1
+acc ar glob 1
+acc ar proc 1
+acc ar spread 1
+acc as ordin 1
+acc aspect 1
+acc at level 1
+acc attempt 1
+acc au 1
+acc au traver 1
+acc between distinct 1
+acc bind 1
+acc block 1
+acc bound 1
+acc buffer 2
+acc buffer pool 1
+acc by pref 1
+acc by specif 1
+acc by using 1
+acc by writ 1
+acc cal 1
+acc cal dm 1
+acc cap 1
+acc car 1
+acc chang 1
+acc cl 1
+acc cl eff 1
+acc compl 1
+acc compon 1
+acc compon dat 1
+acc comput 1
+acc conflict 2
+acc const 1
+acc control 4
+acc control fram 1
+acc control list 1
+acc corrupt 1
+acc corrupt st 1
+acc cost 2
+acc cycleswrit 1
+acc cycleswrit buffer 1
+acc datab 1
+acc datab program 1
+acc defin 1
+acc defin slot 1
+acc del 1
+acc dep 1
+acc dict 1
+acc dict mach 1
+acc distribut 1
+acc distribut dat 1
+acc du 1
+acc each proc 1
+acc each.in 1
+acc ed 2
+acc ed au 1
+acc ed aux 1
+acc ed deux 1
+acc ed ee 2
+acc ed es 1
+acc edant 1
+acc edant au 1
+acc edant aux 1
+acc edant en 1
+acc edent 2
+acc edent aux 1
+acc edent en 1
+acc edent tous 1
+acc eder 2
+acc eder aux 2
+acc eder la 1
+acc eder le 1
+acc eder pen 1
+acc eder simultan 1
+acc el 3
+acc el erat 2
+acc el erateur 1
+acc el erer 2
+acc es 3
+acc es aff 1
+acc es appart 1
+acc es au 2
+acc es auront 1
+acc es aux 2
+acc es correspon 1
+acc es dan 1
+acc es de 1
+acc es direct 1
+acc es dist 1
+acc es dun 1
+acc es en 2
+acc es est 2
+acc es exclusif 1
+acc es fer 1
+acc es lent 1
+acc es locaux 1
+acc es lu 1
+acc es ne 2
+acc es non 2
+acc es par 1
+acc es peut 1
+acc es quel 1
+acc es restait 1
+acc es retard 1
+acc es risqu 1
+acc es sont 1
+acc es suiv 1
+acc es sur 1
+acc es syst 1
+acc es ult 1
+acc es voulu 1
+acc et ser 1
+acc extern 1
+acc extern dat 1
+acc fault 1
+acc featur 1
+acc fil5 1
+acc for metaprogram 1
+acc from anywh 1
+acc from kcm 1
+acc from parallel 1
+acc funct 1
+acc funct comput 1
+acc glob 1
+acc grow 1
+acc hold 1
+acc identif 1
+acc identif cl 1
+acc impl 1
+acc in fdspl 1
+acc in lrc 1
+acc in oper 1
+acc in part 1
+acc in proc 1
+acc integrad 1
+acc integrad program 1
+acc intern 1
+acc intern register 1
+acc is allow 1
+acc is check 1
+acc is const 1
+acc is flush 1
+acc is immut 1
+acc is inser 1
+acc is start 1
+acc is writ 1
+acc it me 1
+acc k ae 1
+acc keyword 1
+acc mach 1
+acc manager 1
+acc manager agent 1
+acc memor 2
+acc memor amount 1
+acc method 6
+acc method tok 1
+acc mil 1
+acc mod 2
+acc modl 1
+acc modl proc 1
+acc nam 1
+acc norm 1
+acc object 2
+acc object1 1
+acc of prior 1
+acc of record 1
+acc of softwar 1
+acc par 1
+acc par linterm 1
+acc par unif 1
+acc path 3
+acc path select 1
+acc pattern 1
+acc per disk 1
+acc per pe 1
+acc perform 1
+acc prob 1
+acc protocol 1
+acc quick 1
+acc react 1
+acc rel 1
+acc rel decl 1
+acc remot 1
+acc remot memor 1
+acc restrict 1
+acc right 2
+acc right administer 1
+acc right avail 1
+acc right right 1
+acc rout 1
+acc s en 1
+acc secon 1
+acc secon st 1
+acc sequ 1
+acc shar 1
+acc shar memor 1
+acc simultan 2
+acc slot 1
+acc stack 1
+acc stack grow 1
+acc stag 2
+acc stal 1
+acc str 1
+acc str assoc 1
+acc structur 1
+acc such cont 1
+acc system 1
+acc tacc 1
+acc tacc del 1
+acc tak 3
+acc tak plac 1
+acc th act 1
+acc th appropr 1
+acc th cod 1
+acc th correspon 1
+acc th cur 2
+acc th dat 4
+acc th dat2 1
+acc th enabl 1
+acc th ent 1
+acc th fin 1
+acc th ith 1
+acc th loc 2
+acc th memor 1
+acc th molecl 1
+acc th pag 1
+acc th parameter 1
+acc th pool 1
+acc th record 1
+acc th register 1
+acc th result 1
+acc th serv 1
+acc th slot 1
+acc th st 1
+acc th valu 1
+acc th variabl 2
+acc thread 1
+acc ti 1
+acc tim 7
+acc tim 10msec 1
+acc to candid 1
+acc to compl 2
+acc to compon 1
+acc to comput 1
+acc to csg 1
+acc to d6i 1
+acc to design 1
+acc to direct 1
+acc to fewer 1
+acc to inform 1
+acc to inst 1
+acc to loc 2
+acc to mak 1
+acc to menu 1
+acc to nil 1
+acc to object 1
+acc to pag 1
+acc to prior 1
+acc to priv 1
+acc to proc 1
+acc to server 1
+acc to shar 4
+acc to st 1
+acc to system 1
+acc to upd 1
+acc to variabl 1
+acc to visu 1
+acc tool 1
+acc track 1
+acc transm 1
+acc turn 1
+acc using 1
+acc using reader 1
+acc using thread 1
+acc var 1
+acc vi oper 1
+acc vi qualif 1
+acc viol 1
+acc viol occur 1
+acc wer bound 1
+acc what peopl 1
+acc whenever en 1
+acc wil prev 1
+acc with minim 1
+acc work 1
+acc work correct 1
+accel 1
+acceler 9
+acceler and brak 1
+acceler by parallel 1
+acceler character 1
+acceler character differ 1
+acceler classif 1
+acceler du 1
+acceler payoff 1
+acceler payoff intak 1
+acceler record 1
+acceler record look 1
+acceler th converg 2
+acceler th inform 1
+acceler windf 1
+accelp 1
+accelp typ 1
+accelp user 1
+accelp user input 1
+accent 3
+accent character 1
+accent denot 1
+accent when conver 1
+accentu 1
+accentu as proc 1
+accept 48
+accept a me 2
+accept a nod 1
+accept a regl 1
+accept a rep 1
+accept abbrev 1
+accept abbrev loc 1
+accept altern 1
+accept an eigenvalu 1
+accept and act 1
+accept and real 1
+accept as input 1
+accept button 1
+accept cal 1
+accept cap 1
+accept certain commun 1
+accept comput 2
+accept comput complec 1
+accept contextfr 1
+accept contextfr grammar 1
+accept de 1
+accept de conf 1
+accept descript 1
+accept detrim 1
+accept detrim mov 1
+accept dexaminer 1
+accept dexaminer ce 1
+accept e de 1
+accept e la 1
+accept el 1
+accept el transform 1
+accept filter 1
+accept filter mechan 1
+accept for publ 6
+accept for transm 1
+accept form 2
+accept in parallel 1
+accept invoc 1
+accept invoc request 1
+accept it me 1
+accept man el 1
+accept me 1
+accept mer 1
+accept mer look 1
+accept method 3
+accept methodinit 1
+accept methodinit opt 1
+accept misclassif 1
+accept misclassif inst 1
+accept mod 1
+accept mod manager 1
+accept mov 1
+accept natur 1
+accept natur langu 1
+accept nod 1
+accept non 1
+accept non optim 1
+accept occur 1
+accept of inform 1
+accept or reject 2
+accept or resum 1
+accept outcom 1
+accept overhead 1
+accept parser 1
+accept parser technolog 1
+accept pattern 1
+accept pattern remain 1
+accept perform 1
+accept perform dep 1
+accept rang 1
+accept rec 1
+accept self 1
+accept self me 1
+accept solut 1
+accept syntac 1
+accept tenet 1
+accept test 1
+accept th comprom 1
+accept th condit 1
+accept th decomposit 1
+accept th hypoth 1
+accept th me 1
+accept th number 1
+accept th yah 1
+accept that context 1
+accept to allow 1
+accept to an 1
+accept w self 1
+accept w wrap 1
+acceptabl 1
+accessibl 2
+accessibl a partir 2
+accessibl constitu 1
+accessibl de 1
+accessibl de tr 1
+accessibl du 1
+accessibl dun 1
+accessibl par 1
+accessibl par linterm 1
+accessibl par simpl 1
+accessibl quau 1
+accessibl quau traver 1
+accessibl tr 1
+accessibl tr es 1
+accessmethod 1
+accessmethod accessmethodl 1
+accessmethod accessmethodl accessmethod 1
+accessmethodl 1
+accessmethodl accessmethod 1
+accessmethodl selectivityl 1
+accessoir 1
+accessprob 1
+accessprob of inst 1
+accg 1
+accommod 22
+accommod a greater 1
+accommod a var 1
+accommod abstract 1
+accommod abstract sem 1
+accommod any item 1
+accommod cl 1
+accommod cl evolut 1
+accommod concur 1
+accommod concur control 1
+accommod langu 1
+accommod multidest 1
+accommod multidest me 1
+accommod multipl 1
+accommod multipl fault 1
+accommod novelt 1
+accommod novelt pr 1
+accommod real world 1
+accommod st 1
+accommod st chang 1
+accommod th ca 1
+accommod th challeng 1
+accommod th cur 1
+accommod th evolut 1
+accommod th interconnect 1
+accommod th nod 1
+accommod th occur 1
+accommod th parent 1
+accommod th pr 1
+accommod th upd 1
+accommod tr 1
+accommod tr oper 1
+accommod upt 2
+accommod var 1
+accommod var multim 1
+accomod 2
+accomod infinit 1
+accomod sem 1
+accomod sem preserv 1
+accompagn 1
+accompagn e de 1
+accompagn ee 1
+accompagn ee de 1
+accompan 10
+accompan disc 1
+accompan each answer 1
+accompan expect 1
+accompan expect failur 1
+accompan lem 1
+accompan paper 1
+accompan softwar 1
+accompan softwar develop 1
+accompan text 1
+accompan with asynchron 1
+accompl 25
+accompl a map 1
+accompl a substitut 1
+accompl a task 1
+accompl as follow 1
+accompl behavior 1
+accompl by ad 1
+accompl by appl 1
+accompl by construc 1
+accompl by decrem 1
+accompl by modif 1
+accompl by transl 1
+accompl compon 1
+accompl compon composit 1
+accompl each step 1
+accompl in recent 1
+accompl multicast 1
+accompl th funct 1
+accompl th sal 1
+accompl th step 1
+accompl th task 3
+accompl through bus 1
+accompl using 1
+accomplir 1
+accomplir pour 1
+accord 65
+accord adapt 1
+accord avec 1
+accord avec la 1
+accord inform 1
+accord prompt 1
+accord prompt strateg 1
+accord sever junct 1
+accord sur 1
+accord sur le 1
+accord to abstract 1
+accord to bainbridg 1
+accord to beizer 1
+accord to ca 1
+accord to context 1
+accord to cool 1
+accord to criter 1
+accord to dav 1
+accord to definit 1
+accord to demand 1
+accord to direct 1
+accord to dist 1
+accord to equ 1
+accord to fortran 1
+accord to giv 1
+accord to good 1
+accord to ham 1
+accord to incr 1
+accord to lem 2
+accord to multipl 1
+accord to part 1
+accord to pressman 1
+accord to reflect 1
+accord to s0 1
+accord to se 1
+accord to select 1
+accord to subject 1
+accord to suit 1
+accord to theorem 3
+accord to user 1
+accord to var 1
+accordint 1
+accordint to var 1
+account 53
+account advanc 2
+account al comput 1
+account and bank 1
+account any context 1
+account ar st 1
+account bal 1
+account chang 2
+account clerk 1
+account cold 1
+account compil 1
+account constraint 1
+account dat 1
+account dat mov 1
+account for commun 1
+account for dist 1
+account for environm 1
+account for near 1
+account for phenom 1
+account for reason 1
+account for rough 1
+account for search 1
+account for typ 1
+account for var 1
+account for vol 1
+account glob 1
+account glob object 1
+account hot 1
+account in rever 1
+account is bal 1
+account object 1
+account of commun 1
+account of dynam 1
+account of execut 1
+account of fuzz 1
+account of natur 1
+account of stat 1
+account of synchron 1
+account other requir 1
+account pract 1
+account proc 1
+account proc failur 1
+account superv 1
+account superv account 1
+account th commun 1
+account th comput 2
+account th constraint 1
+account th definit 1
+account th fact 2
+account th level 1
+account th recov 1
+account th redund 1
+account th var 1
+account when gf 1
+account when measur 1
+account when us 1
+account.oid 1
+accountb 1
+accountid 1
+accr 2
+accr au 1
+accr au moin 1
+accr de 1
+accr de la 1
+accr est 1
+accr est un 1
+accr la 1
+accr la tail 1
+accr sever consecut 1
+accr t la 1
+accr tr 1
+accr tr la 1
+accru 3
+accru afin 1
+accru de 1
+accru de variabl 1
+accru et le 1
+accru from multiplec 1
+accru mor timeout 1
+accueil 1
+accueil a lir 1
+accuml 7
+accuml burst 1
+accuml in secon 1
+accuml of soft 1
+accuml th cur 1
+accuml vot 1
+accumulerait 1
+accumulerait un 1
+accumulerait un list 1
+accur 32
+accur accord 1
+accur achief 1
+accur an 2
+accur an ba 1
+accur an estim 1
+accur and aver 1
+accur and compl 1
+accur and complec 1
+accur and find 1
+accur and lower 1
+accur and reject 1
+accur and st 1
+accur answer 1
+accur approxim 1
+accur bound 2
+accur bound inform 1
+accur by min 1
+accur captur 1
+accur dr 1
+accur drop 1
+accur estim 2
+accur estim requir 1
+accur for rt3 1
+accur forml 1
+accur giv 1
+accur in mak 1
+accur input 1
+accur input mod 1
+accur is determin 1
+accur learn 1
+accur learn algorithm 1
+accur loc 1
+accur loc dec 1
+accur model 2
+accur model featur 1
+accur model flit 1
+accur object 1
+accur object segm 1
+accur of aver 1
+accur of measur 1
+accur of specl 1
+accur prior 1
+accur slight 1
+accur specl 1
+accur specl valu 1
+accur start 1
+accur test 1
+accur than cn 1
+accur than ib2 1
+accur than rt1 1
+accur that random 1
+accur transl 1
+accur we belief 2
+accur work 1
+accur work estim 1
+accustom 2
+accustom to distingu 1
+acev 1
+ach 3
+ach afin 1
+ach afin de 1
+ach assez 1
+ach assez complec 1
+ach aux 1
+ach aux processeur 1
+ach de 1
+ach de program 1
+ach du 1
+ach du programmeur 1
+ach ee 1
+ach ee dan 1
+ach el 1
+ach el ementair 1
+ach entr 1
+ach entr le 1
+ach qu 1
+ach qu peuv 1
+achev 1
+achev ee 1
+achief 81
+achief a dat 1
+achief a good 2
+achief a lower 1
+achief a maxim 1
+achief a regl 1
+achief a se 1
+achief a separ 1
+achief a tim 1
+achief accept 1
+achief accept perform 1
+achief an oolp 1
+achief an order 1
+achief any reduc 1
+achief arc 1
+achief arc con 1
+achief arccon 1
+achief assessm 1
+achief assessm protocol 1
+achief asymptot 1
+achief asymptot me 1
+achief bandwidth 1
+achief better cluster 1
+achief better perform 3
+achief better qu 1
+achief better util 1
+achief by build 1
+achief by decluster 1
+achief by divid 2
+achief by eager 1
+achief by eng 1
+achief by execut 1
+achief by inclus 1
+achief by lim 1
+achief by mlkp 1
+achief by modif 1
+achief by monit 1
+achief by mov 1
+achief by observ 1
+achief by relac 1
+achief by renam 1
+achief by se 1
+achief by substitut 1
+achief by test 1
+achief by using 5
+achief by writ 1
+achief deleg 1
+achief dynam 1
+achief econom 1
+achief eff 3
+achief eff parallel 1
+achief es 1
+achief even high 1
+achief fast 1
+achief fast broadcast 1
+achief flow 1
+achief flow control 1
+achief for 3d 1
+achief for batch 1
+achief for lrh71 1
+achief freetext 1
+achief freetext answer 1
+achief further 2
+achief further improv 2
+achief gener 1
+achief gener techniqu 1
+achief good 2
+achief good decluster 1
+achief good perform 1
+achief greater 1
+achief greater reduc 1
+achief hardwar 1
+achief hardwar multicast 1
+achief hi teach 1
+achief high 1
+achief high accur 1
+achief high compr 1
+achief high concur 1
+achief high perform 2
+achief high qu 1
+achief high throughput 1
+achief in conv 1
+achief in polynom 1
+achief in quadr 1
+achief increm 1
+achief is lim 1
+achief is signif 1
+achief it goal 1
+achief langu 1
+achief langu integr 1
+achief load 1
+achief load bal 1
+achief low 1
+achief low lat 1
+achief maxim 1
+achief maxim parallel 1
+achief mer 1
+achief modl 1
+achief mult 1
+achief mult ph 1
+achief multicast 1
+achief multicast commun 1
+achief near optim 1
+achief network 1
+achief network throughput 1
+achief optim 1
+achief optim comput 1
+achief or expect 1
+achief perform 1
+achief predict 1
+achief reason 1
+achief reason speedup 1
+achief reduc 1
+achief robust 1
+achief rs 1
+achief rs oper 1
+achief simil 2
+achief simil result 1
+achief simil scal 1
+achief soft 1
+achief soft reg 1
+achief som conclus 1
+achief som result 1
+achief somewh 1
+achief subst 1
+achief subst st 1
+achief such us 1
+achief term 1
+achief th bound 3
+achief th comp 1
+achief th concur 1
+achief th cur 1
+achief th desir 1
+achief th dut 1
+achief th fl 1
+achief th highest 1
+achief th identif 1
+achief th improv 1
+achief th invar 1
+achief th maxim 1
+achief th object 2
+achief th optim 2
+achief th oracl 1
+achief th over 1
+achief th parallel 1
+achief th port 1
+achief th presum 1
+achief th purport 1
+achief th refin 1
+achief th result 1
+achief th task 1
+achief th theor 1
+achief their run 1
+achief through configur 1
+achief through extern 1
+achief through parameter 1
+achief throughput 1
+achief tw connect 1
+achief using 2
+achief using point 1
+achief valu 1
+achief ver dram 1
+achief vi explicit 1
+achief vi inform 1
+achief whil maintain 1
+achief with eq 1
+achief with grand 1
+achief with suit 1
+achief without incr 1
+achief zer 1
+achief zer lat 1
+achim 1
+achim baserman 1
+achop 1
+achop sur 1
+achop sur le 1
+ack 4
+ack is receiv 1
+ack list 1
+ack protocol 1
+ack protocol accru 1
+ack protocol proc 1
+ack protocol receiv 1
+ack protocol var 1
+ack receiv 1
+ack rmsp 1
+ack rmsp ack 1
+ack stead 1
+ack stead incr 1
+acknowledg 47
+acknowledg a transport 1
+acknowledg and expect 1
+acknowledg and proc 1
+acknowledg and receiv 1
+acknowledg and remov 1
+acknowledg and retransm 1
+acknowledg and transfer 1
+acknowledg appear 1
+acknowledg arriv 1
+acknowledg befor sen 1
+acknowledg contain 1
+acknowledg daniel 1
+acknowledg daniel diaz 1
+acknowledg from p2 1
+acknowledg is receiv 1
+acknowledg me 1
+acknowledg me m2 1
+acknowledg per me 1
+acknowledg spec thank 1
+acknowledg th author 1
+acknowledg th ext 1
+acknowledg th kcm 1
+acknowledg th part 1
+acknowledg th program 1
+acknowledg th support 2
+acknowledg th us 1
+acknowledg th work 2
+acknowledg traff 1
+acknowledg traff flow 1
+acknowledg us 2
+acknowledg us disc 2
+acknowledg with proc 1
+acknowledgm 21
+acknowledgm and retransm 1
+acknowledgm direct cr 1
+acknowledgm f.f.a 1
+acknowledgm pack 1
+acknowledgm to ensur 1
+acknowledgm with retransm 1
+acm 77
+acm 11th 1
+acm 2nd 1
+acm 2nd multim 1
+acm annu 1
+acm annu symp 1
+acm ch91 1
+acm ch95 1
+acm comput 8
+acm comput surv 8
+acm intern 3
+acm intern workshop 1
+acm multim 1
+acm oper 1
+acm oper system 1
+acm pod 2
+acm popl 1
+acm pp 1
+acm pr 15
+acm principl 1
+acm secon multim 1
+acm siam 1
+acm sig 2
+acm sig mod 1
+acm sig plan 1
+acm sigact 3
+acm sigact sigmod 3
+acm sigarch 1
+acm sigch 2
+acm sigcom 3
+acm siggraph 3
+acm sigmeter 3
+acm sigmeter perform 1
+acm sigmicr 1
+acm sigmicr newsletter 1
+acm sigmod 10
+acm sigmod annu 1
+acm sigmod intern 1
+acm sigmod record 2
+acm sigop 1
+acm sigop sigact 1
+acm sigplan 6
+acm sigplan workshop 1
+acm sigsac 1
+acm sigsac review 1
+acm sigsoft 3
+acm sigsoft softwar 1
+acm softwar 1
+acm softwar engineer 1
+acm spec interest 1
+acm stoc 1
+acm sym 1
+acm symp 4
+acm tod 4
+acm topl 1
+acm tran 6
+acm transact 19
+acm workshop 1
+acm97 1
+acmsigmod 1
+acmsigmod intern 1
+acor 1
+acor ask 1
+acor ask prim 1
+acor compiler 1
+acoust 4
+acoust dat 1
+acoust exampl 1
+acoust speech 1
+acoust tran 1
+acoust tran an 1
+acoustiqu 1
+acoustiqu musiqu 1
+acpt 1
+acpt acpt 1
+acpt and kybd 1
+acpt ti 1
+acq1 1
+acq1 acq2 1
+acq1 acq2 v1 1
+acq2 1
+acq2 v1 1
+acq2 v1 v2 1
+acq2 x v2 1
+acqu 2
+acqu erir 1
+acqu erir ce 1
+acquaint 2
+acquaint and constraint 1
+acquaint chang 1
+acquaint held 1
+acquaint list 1
+acquaint nam 1
+acquaint nam expr 1
+acquaint var 1
+acquaint variabl 1
+acquaint variabl using 1
+acquir 17
+acquir a level 1
+acquir a lock 2
+acquir a proc 1
+acquir a start 1
+acquir acc 1
+acquir al serv 1
+acquir and rel 1
+acquir bronchit 1
+acquir bronchit giv 1
+acquir dur for 1
+acquir dur op 1
+acquir dur rollback 1
+acquir high 1
+acquir high level 1
+acquir knowledg 1
+acquir lock 1
+acquir sequ 1
+acquir th appropr 1
+acquir th correct 1
+acquir th deadlock 1
+acquir th inform 1
+acquir th lock 2
+acquir th lower 1
+acquir th me 1
+acquisit 10
+acquisit and us 1
+acquisit en 1
+acquisit en tant 1
+acquisit for exper 1
+acquisit of lockj 1
+acquisit proc 2
+acquisit r el 1
+acquisit support 1
+acquisit through vid 1
+acquisit tool 1
+acquisit vi increm 1
+acquisit workshop 1
+acronym 3
+acronym ac 1
+acronym for min 1
+act 72
+act a lentr 1
+act a transform 1
+act acquaint 1
+act acquaint list 1
+act activedormanttru 1
+act addr 1
+act after par 1
+act after tim 1
+act al influ 1
+act anact 1
+act and cal 1
+act and car 1
+act and chang 1
+act and def 1
+act and direct 1
+act and environm 1
+act and equilibr 1
+act and le 1
+act and receiv 1
+act and reif 1
+act and soc 1
+act and transm 1
+act appear 1
+act ar 1
+act ar deliver 1
+act ar detect 1
+act ar determin 1
+act ar fin 1
+act ar known 1
+act ar modif 1
+act ar prompt 1
+act ar self 1
+act ar sen 1
+act ar simil 1
+act as bound 1
+act as dat 1
+act as extr 1
+act as filter 1
+act as gatew 1
+act as integr 1
+act as nest 1
+act as op 2
+act as plac 1
+act at run 1
+act ba 1
+act ba concur 1
+act ba langu 1
+act ba parallel 1
+act badg 1
+act badg loc 1
+act badg system 1
+act becom 1
+act between nod 1
+act buffer 1
+act buffer incom 1
+act by fault 1
+act by sen 1
+act can becom 1
+act can inst 1
+act can instantan 1
+act can mak 1
+act can reif 1
+act caus 1
+act cb3 1
+act chain 1
+act cl 1
+act cod 1
+act compiler 1
+act compiler chang 1
+act comput 1
+act con 2
+act connect 2
+act connect compl 1
+act context 1
+act context definit 1
+act context describ 1
+act context inform 1
+act correspon 1
+act corrupt 1
+act corrupt good 1
+act de 2
+act de journ 1
+act de la 1
+act decp 1
+act definit 1
+act descript 1
+act descript determin 1
+act develop 2
+act disc 1
+act domain 1
+act du 2
+act either upd 1
+act el 1
+act enabl 1
+act ensur 1
+act env 1
+act env assign 1
+act env mod 1
+act et est 1
+act execut 3
+act execut model 1
+act exp 1
+act exp4 1
+act exp5 1
+act explor 1
+act fal 1
+act fal broad 1
+act field 1
+act for comparison 1
+act for li 1
+act for mail 1
+act for modif 1
+act for perceiv 1
+act fragm 1
+act further 1
+act ge 1
+act gen 1
+act gen log 1
+act go 1
+act hav domain 1
+act imp 1
+act imp restrict 1
+act in asynchron 1
+act in figur 1
+act in order 1
+act in prolog 1
+act in quest 1
+act in respon 1
+act incp 1
+act inform 5
+act inherit 1
+act inser 1
+act intent 1
+act intern 1
+act intern st 1
+act involut 2
+act is ad 1
+act is assum 1
+act is creat 1
+act is cruc 1
+act is cur 1
+act is defin 1
+act is enabl 1
+act is execut 2
+act is explicit 1
+act is ident 1
+act is proc 1
+act is respon 1
+act is specif 1
+act is view 1
+act job 1
+act la 1
+act langu 1
+act le proc 1
+act lead 1
+act li 1
+act mach 1
+act mach st 1
+act mak 1
+act match 1
+act may account 1
+act may lead 1
+act may perform 1
+act me 3
+act medl 1
+act might requir 1
+act model 1
+act model dict 1
+act model differ 1
+act model support 1
+act mor prec 1
+act mov 1
+act must particip 1
+act nod 2
+act nod rel 1
+act nod return 1
+act nod transm 1
+act nod4 1
+act notif 1
+act nr 1
+act object 2
+act object perform 1
+act object prescrib 1
+act object system 1
+act of branch 1
+act of enabl 1
+act of funct 1
+act of neighbor 1
+act of part 1
+act of selecttest 1
+act of unwind 1
+act on 1
+act on dioeer 1
+act on singl 1
+act on tempor 1
+act opj 1
+act or dispatch 1
+act or inact 2
+act or se 1
+act orient 1
+act orient system 1
+act origin 1
+act pa 1
+act pa ee 1
+act paradigm 1
+act part 1
+act part comp 1
+act path 1
+act penabl 1
+act penabledk 1
+act perform 5
+act period 1
+act period start 1
+act plac 1
+act po 1
+act po exp 1
+act po4 1
+act po5 1
+act proc 3
+act proc correspon 1
+act proc pa 1
+act proc se 2
+act program 1
+act prompt 1
+act prompt attempt 1
+act prompt prov 1
+act prompt support 1
+act prompter 1
+act prompter allow 1
+act prompter keep 1
+act prompter prov 1
+act provoqu 1
+act provoqu le 1
+act pursu 1
+act refer 1
+act rel 1
+act rel exper 1
+act remain 1
+act repl 1
+act research 2
+act research ar 1
+act rout 1
+act rout grph 1
+act rout specif 1
+act run 1
+act s defin 1
+act sa4 1
+act se 1
+act se accord 1
+act se contain 1
+act se describ 1
+act se variabl 1
+act select 1
+act select result 1
+act sem 1
+act sequ 2
+act sh anticip 1
+act shar 1
+act should particl 1
+act simultan 1
+act sit 1
+act slot 1
+act specif 2
+act st 2
+act st chang 1
+act stud 1
+act stud particip 1
+act subsequ 1
+act subsequ execut 1
+act subsequ lead 1
+act subsequ repr 1
+act sur 1
+act system 1
+act t1 1
+act t2 1
+act t3 1
+act t4 1
+act t5 1
+act tak 1
+act textbook 1
+act th expr 1
+act th user 1
+act that contribut 1
+act that en 1
+act that instead 1
+act that modif 1
+act that transl 1
+act that upd 1
+act theor 1
+act threshold 1
+act through dep 1
+act through project 1
+act to av 1
+act to chang 1
+act to determin 1
+act to establ 1
+act to keep 1
+act to maintain 1
+act to perform 1
+act to proceed 1
+act to prompt 1
+act to rest 1
+act to se 1
+act top 1
+act top level 1
+act tot 1
+act tot cycl 1
+act transact 1
+act unexplor 1
+act us 1
+act using 1
+act using mar 1
+act vi 1
+act vi distingu 1
+act vi pictur 1
+act wa compl 1
+act wa part 1
+act weight 1
+act weight remain 1
+act wh behavior 1
+act wh mail 1
+act when consider 1
+act which check 1
+act which contradict 1
+act which involut 1
+act which occur 1
+act wil becom 1
+act with trigger 1
+act within isvl 1
+act would id 1
+act would mak 1
+act1 1
+actif 2
+actif depu 1
+actif depu le 1
+actif jusqu 1
+actif ou 1
+actif ou de 1
+activ 16
+activ a task 1
+activ and thus 1
+activ au 1
+activ au marqu 1
+activ bit 1
+activ block 1
+activ by currnod 1
+activ criter 1
+activ ee 2
+activ ee par 1
+activ environm 1
+activ for return 1
+activ funct 1
+activ hard loc 1
+activ larger 1
+activ mechan 1
+activ n1 1
+activ nod 1
+activ or deactiv 1
+activ other proc 1
+activ pattern 1
+activ posit 1
+activ proc 1
+activ rat 1
+activ rat act1 1
+activ server 1
+activ server fetch 1
+activ sever server 1
+activ son 1
+activ son pur 1
+activ tabl 1
+activ task 1
+activ th evalu 1
+activ th old 1
+activ th server 1
+activ to car 1
+activ unit 1
+activ us 1
+activ valu 1
+activ vs 1
+activ when acc 1
+activedormanttru 1
+activer 1
+activer lop 1
+activer lop erat 1
+actoraactorbactorcactordactorejc 1
+actorb 1
+actorb langu 1
+actorc 1
+actord 1
+actparam 1
+actspeed 1
+actspeed accel 1
+actspeed div 1
+actspeed div wheelcirc 1
+actspeed gradf 1
+actspeed gradf gravk 1
+actspeed integ 1
+actspeed integ wrt 1
+actu 79
+actu a conjunct 1
+actu a mislead 1
+actu a modif 1
+actu a reduc 1
+actu a valu 1
+actu acc 1
+actu acc track 1
+actu act 1
+actu act pursu 1
+actu addr 1
+actu algorithm 2
+actu and form 1
+actu answer 2
+actu answer giv 1
+actu appear 1
+actu ar prim 1
+actu ar schemat 1
+actu argum 1
+actu argum instead 1
+actu backlog 1
+actu be comput 1
+actu be exact 1
+actu be requir 1
+actu be seen 1
+actu be talk 1
+actu behav 1
+actu behaviour 1
+actu bisect 2
+actu bisect bandwidth 2
+actu block 1
+actu block nod 1
+actu bod 1
+actu bottom 1
+actu c cod 1
+actu ch 1
+actu chang 1
+actu chang specif 1
+actu classif 1
+actu cod 2
+actu combin 1
+actu combin dec 1
+actu compar 1
+actu comput 1
+actu con 1
+actu consider 1
+actu construc 1
+actu construc figur 1
+actu context 1
+actu correspon 1
+actu dat 1
+actu deal 1
+actu defin 1
+actu demarc 1
+actu demonstr 1
+actu design 1
+actu design reflect 1
+actu destr 1
+actu deterior 1
+actu determin 1
+actu developm 1
+actu developm perform 1
+actu developm step 1
+actu dialog 1
+actu did imprint 1
+actu dimin 1
+actu distribut 1
+actu docum 1
+actu docum anywh 1
+actu educ 1
+actu educ mater 1
+actu es 1
+actu exampl 1
+actu execut 2
+actu expan 1
+actu exper 3
+actu fit 1
+actu fit cl 1
+actu funct 1
+actu funct affect 1
+actu garb 1
+actu garb collect 1
+actu gener 2
+actu giv 1
+actu handl 1
+actu help 1
+actu ibam 1
+actu ibam implem 1
+actu implem 10
+actu implem system 1
+actu incr 1
+actu industr 1
+actu industr appl 1
+actu inst 1
+actu interpr 1
+actu interview 1
+actu interview method 1
+actu is model 1
+actu kind 1
+actu learn 1
+actu led 1
+actu lem 1
+actu libr 1
+actu libr upd 1
+actu mach 1
+actu map 1
+actu matter 1
+actu memor 1
+actu memor contain 1
+actu method 2
+actu nec 1
+actu nondetermin 1
+actu number 3
+actu numer 1
+actu numer fact 1
+actu occur 1
+actu offer 2
+actu offer bisect 2
+actu oper 1
+actu or virtu 1
+actu order 2
+actu order gener 1
+actu outcom 2
+actu outcom expect 1
+actu outcom rev 1
+actu output 1
+actu output oper 1
+actu oz 1
+actu oz perform 1
+actu pack 2
+actu par 1
+actu parallel 1
+actu parallel compiler 1
+actu param 1
+actu param list 1
+actu parameter 4
+actu parameter list 1
+actu parameter valu 1
+actu perform 5
+actu perform nod 1
+actu perform wor 1
+actu posit 2
+actu pract 1
+actu problem 3
+actu problem siz 1
+actu problem solut 1
+actu proc 1
+actu produc 1
+actu program 1
+actu program solut 1
+actu project 1
+actu prompt 1
+actu prov 1
+actu quit extrem 1
+actu ran 1
+actu ran faster 1
+actu rang 1
+actu rang qu 1
+actu reach 2
+actu reg 1
+actu repr 1
+actu repr switch 1
+actu requir 2
+actu respon 1
+actu respon tim 1
+actu run 1
+actu run tim 1
+actu satur 1
+actu script 1
+actu se 1
+actu se dur 1
+actu seed 1
+actu select 1
+actu select act 1
+actu sequ 1
+actu siz 1
+actu soft 1
+actu soft dec 1
+actu sourc 1
+actu sourc cod 1
+actu speed 1
+actu speed accel 1
+actu split 1
+actu structur 1
+actu sum 1
+actu system 3
+actu system us 1
+actu system wh 1
+actu tak 2
+actu tak plac 2
+actu task 1
+actu terrain 1
+actu th cor 1
+actu tool 1
+actu tool architectur 1
+actu undefin 1
+actu us 3
+actu us strateg 1
+actu user 1
+actu user input 1
+actu using 1
+actu valu 5
+actu word 1
+actu work 1
+actu writ 1
+actualbisect 2
+actualbisect bandwidth 2
+actualbisect bandwidth averag 2
+actuel 6
+actuel beaucoup 1
+actuel beaucoup de 1
+actuel de 4
+actuel de ce 1
+actuel de lart 1
+actuel de recherch 1
+actuel de syst 1
+actuel de val 1
+actuel du 1
+actuel du compilateur 1
+actuel dun 1
+actuel dun soixantain 1
+actuel la 1
+actuel la possibilit 1
+actuel le 1
+actuel sur 1
+actuel tant 1
+actuel tant en 1
+actuel un nombr 1
+actuel util 1
+actuel util es 1
+acu 1
+acut 1
+acut when docum 1
+acycl 9
+acycl compl 1
+acycl compl graph 1
+acycl dep 1
+acycl dep flow 1
+acycl el 1
+acycl el begin 1
+acycl graph 6
+acycl proper 1
+acycl rol 1
+acycl rol graph 1
+ad 97
+ad 9x 2
+ad a boolean 1
+ad a byp 1
+ad a cl 1
+ad a complec 1
+ad a condit 1
+ad a conjunct 1
+ad a constraint 1
+ad a correspon 1
+ad a counter 1
+ad a hazard 1
+ad a me 1
+ad a memor 1
+ad a method 1
+ad a no 1
+ad a nod 1
+ad a number 1
+ad a piec 1
+ad a proc 1
+ad a pseud 1
+ad a rout 1
+ad a sc 1
+ad a shap 1
+ad a singl 1
+ad a slack 1
+ad a synchron 1
+ad a var 1
+ad a023588 1
+ad absurdum 1
+ad addit 1
+ad addit test 1
+ad adv 1
+ad ae 1
+ad ae np 1
+ad al link 1
+ad al me 1
+ad amount 1
+ad an addit 2
+ad an edg 2
+ad an equiv 1
+ad an extr 1
+ad an interest 1
+ad and del 2
+ad and np 1
+ad and over 1
+ad and remark 1
+ad and remov 2
+ad and withdrawn 1
+ad another fr 1
+ad another mach 1
+ad any program 1
+ad ap 1
+ad atof 1
+ad automat 1
+ad automat ver 1
+ad ba 1
+ad bs 1
+ad by simp 1
+ad by using 1
+ad byp 1
+ad c program 1
+ad claus 1
+ad cod 2
+ad column 1
+ad column bus 1
+ad const 1
+ad constraint 1
+ad context 1
+ad context claus 1
+ad control 1
+ad control dep 1
+ad cost 1
+ad cpu 1
+ad cpu tim 1
+ad decl 1
+ad decl list 1
+ad dum 2
+ad dum argum 1
+ad dum instruc 1
+ad each inst 1
+ad ed 1
+ad edg 2
+ad edg x1 1
+ad eff 1
+ad eff subsum 1
+ad ensur 1
+ad equ 3
+ad equ au 1
+ad equ le 1
+ad equat 2
+ad equat dun 1
+ad exact 1
+ad extr 3
+ad extr argum 1
+ad extr ec 1
+ad extr link 1
+ad flec 1
+ad for read 1
+ad four cal 1
+ad four direct 1
+ad from algorithm 1
+ad gener 1
+ad gener pack 1
+ad gener param 1
+ad ha nontransit 1
+ad high 1
+ad high level 1
+ad hoc 8
+ad hoc chang 1
+ad hoc datab 1
+ad hoc manner 1
+ad hoc method 1
+ad hoc optim 1
+ad hoc solut 1
+ad implem 1
+ad import 1
+ad in gd 1
+ad instruc 1
+ad introspect 1
+ad introspect reason 1
+ad is contain 1
+ad is produc 1
+ad is record 1
+ad is sketch 1
+ad it sal 1
+ad item 1
+ad item void 1
+ad joint 1
+ad joint program 1
+ad label 1
+ad level 1
+ad log 2
+ad log record 1
+ad main 1
+ad measur 1
+ad measur rel 1
+ad method 1
+ad method ad 1
+ad method gf 1
+ad might inclus 1
+ad model 1
+ad model sl1 1
+ad modl 1
+ad mor cap 1
+ad mor ch 2
+ad mor complec 1
+ad mor edg 1
+ad mor mach 1
+ad mor modl 1
+ad mor program 1
+ad mor soph 1
+ad most prob 1
+ad multipl 1
+ad multipl ch 1
+ad n ver 1
+ad ndp 1
+ad ndp ad 1
+ad new block 1
+ad new capabil 1
+ad new cl 1
+ad new kind 1
+ad new log 1
+ad new rol 1
+ad new rout 1
+ad new ver 1
+ad nod 1
+ad np 1
+ad np ad 1
+ad on addit 1
+ad on bus 1
+ad on direct 1
+ad on top 1
+ad oper 1
+ad or del 1
+ad or refin 1
+ad or remov 1
+ad other variabl 1
+ad overhead 1
+ad p1 1
+ad pack 1
+ad pack interfac 1
+ad pack structur 1
+ad pair 1
+ad parenth 1
+ad prec 1
+ad prem 1
+ad prim 2
+ad prim introduc 1
+ad problem 1
+ad proc 1
+ad proc mp 1
+ad program 3
+ad program langu 3
+ad propag 1
+ad prov 1
+ad queu 1
+ad quit difficult 1
+ad r configur 1
+ad r0 1
+ad recur 1
+ad redund 2
+ad redund commun 1
+ad redund path 1
+ad redund server 1
+ad rel 1
+ad rel program 1
+ad rj 1
+ad rl 1
+ad seed 1
+ad seed output 1
+ad sequ 1
+ad sever lingu 1
+ad sever visu 1
+ad sk 1
+ad sk sisj 1
+ad som appropr 1
+ad som lim 1
+ad stat 1
+ad stat gather 1
+ad subcl 1
+ad subsequ 1
+ad synonym 1
+ad targ 1
+ad test 1
+ad th appropr 1
+ad th cap 2
+ad th comput 1
+ad th condit 2
+ad th conjunct 1
+ad th constraint 1
+ad th dat 1
+ad th direct 1
+ad th div 1
+ad th edg 1
+ad th equ 1
+ad th head 1
+ad th infer 1
+ad th item 1
+ad th keyword 1
+ad th largest 1
+ad th libr 1
+ad th link 1
+ad th loc 1
+ad th relev 1
+ad th sal 1
+ad th situ 1
+ad th term 2
+ad th test 1
+ad th tetrahedr 1
+ad th upd 1
+ad th valu 1
+ad th weight 1
+ad that liter 1
+ad that sort 1
+ad ther seem 1
+ad tim 2
+ad tim dim 1
+ad to as 1
+ad to def 1
+ad to demonstr 1
+ad to ed 1
+ad to ei 1
+ad to gd 1
+ad to gp 1
+ad to jav 1
+ad to lim 1
+ad to mak 1
+ad to mark 1
+ad to prev 1
+ad to reflect 1
+ad to tr 1
+ad to triangl 1
+ad to zer 1
+ad transl 1
+ad tut 1
+ad tut lovelac 1
+ad tw amount 1
+ad tw direct 1
+ad tw further 1
+ad unnec 1
+ad unnec overhead 1
+ad us 1
+ad us claus 1
+ad valu 1
+ad var 1
+ad var form 1
+ad ver 1
+ad ver dep 1
+ad visu 1
+ad visu clutter 1
+ad we mak 1
+ad wel kind 1
+ad which allow 1
+ad xi 2
+ad xn 1
+ad2at 1
+ad2at consum 1
+ad2at remain 1
+adag 1
+adag ibm 1
+adam 2
+adapt 55
+adapt a la 1
+adapt a program 1
+adapt a standard 1
+adapt act 1
+adapt act prompt 1
+adapt act prompter 1
+adapt algorithm 3
+adapt and describ 1
+adapt and ext 1
+adapt and learn 1
+adapt and mal 1
+adapt and perform 1
+adapt and us 1
+adapt au 1
+adapt au cadr 1
+adapt automat 1
+adapt ba 1
+adapt begin 1
+adapt behavior 1
+adapt block 1
+adapt cod 1
+adapt compon 1
+adapt confid 1
+adapt consider 1
+adapt cur 1
+adapt de 3
+adapt de ag 1
+adapt de la 1
+adapt de lespac 1
+adapt de techniqu 1
+adapt del 1
+adapt del filter 1
+adapt design 1
+adapt dist 1
+adapt dist threshold 1
+adapt dun 1
+adapt dun solut 1
+adapt dynam 1
+adapt dynam menu 1
+adapt e au 1
+adapt ee 3
+adapt ee au 1
+adapt es 3
+adapt es au 1
+adapt es surviv 1
+adapt establishm 1
+adapt estim 1
+adapt filter 1
+adapt for dat 1
+adapt for maxim 1
+adapt four 1
+adapt four window 1
+adapt in natur 1
+adapt in naturel 1
+adapt is look 1
+adapt is perform 1
+adapt it rout 1
+adapt it suggest 1
+adapt learn 2
+adapt learn ba 1
+adapt learn rat 1
+adapt mechan 1
+adapt menu 1
+adapt mixtur 1
+adapt modl 1
+adapt modl system 1
+adapt multim 1
+adapt multim user 1
+adapt next hop 1
+adapt object 1
+adapt object behavior 1
+adapt object orient 1
+adapt of algorithm 1
+adapt of tait 1
+adapt our approach 1
+adapt postfilter 1
+adapt prompt 1
+adapt prompt mechan 1
+adapt prompt prov 1
+adapt prompt sup 1
+adapt propag 1
+adapt propag pattern 1
+adapt reconstruc 1
+adapt resourc 1
+adapt resourc manag 1
+adapt reus 1
+adapt reus mechan 1
+adapt rl 1
+adapt rout 3
+adapt s adapt 1
+adapt s aux 1
+adapt schedl 1
+adapt self 2
+adapt self assessmentfeedback 1
+adapt self organ 1
+adapt softwar 3
+adapt softwar cach 1
+adapt softwar developm 1
+adapt solut 1
+adapt son 1
+adapt sourc 1
+adapt sourc cod 1
+adapt spec 1
+adapt strateg 2
+adapt sub 1
+adapt sub modl 1
+adapt subband 1
+adapt subband decomposit 1
+adapt system 3
+adapt system behaviour 1
+adapt system developm 1
+adapt system group 1
+adapt tait 1
+adapt techniqu 1
+adapt th algorithm 3
+adapt th appl 1
+adapt th behavior 1
+adapt th interchang 1
+adapt th menus 1
+adapt th origin 1
+adapt th pr 1
+adapt th proof 1
+adapt th reduc 1
+adapt th se 1
+adapt th sourc 1
+adapt threshold.12 1
+adapt tim 2
+adapt tim del 1
+adapt timedel 1
+adapt timedel neur 1
+adapt to appl 1
+adapt to chang 2
+adapt to construc 1
+adapt to distribut 1
+adapt to find 1
+adapt to learner 1
+adapt to lo 1
+adapt to nat 1
+adapt to network 1
+adapt to rad 1
+adapt to support 1
+adapt to topolog 1
+adapt to work 1
+adapt tool 1
+adapt tr 1
+adapt tr es 1
+adapt transact 1
+adapt transact rout 1
+adapt travel 1
+adapt upt 1
+adapt user 1
+adapt user interfac 1
+adapt vi wavel 1
+adapt weight 1
+adapt weight determin 1
+adapt your program 1
+adapter 2
+adapter a la 1
+adapter la 1
+adapter le 1
+adapter le individus 1
+addendum 3
+adder 1
+adder circuit 1
+adder circuit exampl 1
+addisonwesl 3
+addit 99
+addit a link 1
+addit a period 1
+addit addr 1
+addit addr transl 1
+addit adv 2
+addit aff 1
+addit aff equ 1
+addit altern 1
+addit altern edg 1
+addit amount 1
+addit and del 3
+addit and equ 1
+addit and multipl 1
+addit and order 1
+addit and subtract 1
+addit architectur 1
+addit architectur support 1
+addit argum 1
+addit arithm 1
+addit arithm oper 1
+addit attribut 2
+addit axiom 1
+addit bar 1
+addit ben 1
+addit ben ts 1
+addit bi 1
+addit bi valu 1
+addit bind 1
+addit bit 1
+addit boolean 1
+addit boolean variabl 1
+addit bound 1
+addit branch 1
+addit bs 1
+addit bs model 1
+addit bus 1
+addit bus traff 1
+addit channel 1
+addit cl 2
+addit cl requir 1
+addit closur 1
+addit closur condit 1
+addit cod 1
+addit cod channel 1
+addit column 3
+addit column speedup 1
+addit com 1
+addit commun 1
+addit commun del 1
+addit comparison 1
+addit comput 3
+addit concept 1
+addit condit 3
+addit condit jump 1
+addit conjunct 1
+addit const 1
+addit const indep 1
+addit constraint 3
+addit constraint solut 1
+addit control 2
+addit control form 1
+addit control posit 1
+addit cost 2
+addit counter 1
+addit counter cp 1
+addit de 1
+addit de la 1
+addit decod 1
+addit decod log 1
+addit definit 1
+addit del 2
+addit dfg 1
+addit dfg nod 1
+addit dim 1
+addit direct 1
+addit direct selfmut 1
+addit discover 1
+addit disjunct 1
+addit disjunct introduc 1
+addit dispatch 1
+addit dispatch loop 1
+addit div 1
+addit dot 1
+addit dot produc 1
+addit each nod 1
+addit ec 1
+addit ec axiom 1
+addit effort 1
+addit equ 1
+addit error 1
+addit error introduc 1
+addit experim 2
+addit exploit 1
+addit expr 1
+addit expr power 1
+addit featur 1
+addit field 1
+addit field correspon 1
+addit fil 1
+addit fil inform 1
+addit foc 1
+addit foc inform 1
+addit form 1
+addit form apparatus 1
+addit funct 2
+addit fund 1
+addit hardwar 1
+addit hardwar support 1
+addit head 1
+addit impl 1
+addit implem 2
+addit implem defin 1
+addit improv 3
+addit inform 6
+addit inform defin 1
+addit init 1
+addit init argum 1
+addit init opt 1
+addit input 1
+addit input cel 1
+addit inst 2
+addit int 1
+addit int parameter 1
+addit introduc 1
+addit introduc ser 1
+addit introspect 1
+addit introspect primitiv 1
+addit is rol 1
+addit issu 1
+addit issu rel 1
+addit job 1
+addit knowledg 2
+addit lastnod 1
+addit level 2
+addit level typ 1
+addit loc 1
+addit loc flag 1
+addit lock 1
+addit loop 1
+addit mach 1
+addit maintain 1
+addit mater 1
+addit matr 1
+addit matr vect 1
+addit me 3
+addit me typ 1
+addit method 1
+addit method init 1
+addit minim 1
+addit mlr 1
+addit mlr requir 1
+addit modif 1
+addit multipl 1
+addit multipl conjunct 1
+addit multiplexer 1
+addit multiplexer input 1
+addit no 2
+addit not 1
+addit oe2b 1
+addit of boolean 1
+addit of compl 1
+addit of direct 1
+addit of extr 1
+addit of further 1
+addit of modl 1
+addit of rol 1
+addit of s5a 1
+addit of var 1
+addit ol 1
+addit ol support 1
+addit oper 1
+addit operand 1
+addit opt 1
+addit opt inclus 1
+addit oracl 1
+addit pack 1
+addit pag 1
+addit pag fault 1
+addit parameter 1
+addit part 1
+addit part nam 1
+addit path 1
+addit perform 1
+addit perform improv 1
+addit pitf 1
+addit pr 2
+addit prior 1
+addit prior knowledg 1
+addit proc 2
+addit proc cost 1
+addit procedur 2
+addit procedur rem 1
+addit protect 1
+addit protect mechan 1
+addit purp 1
+addit quer 1
+addit real mach 1
+addit record 1
+addit refin 1
+addit register 1
+addit relac 1
+addit relac heap 1
+addit relationship 1
+addit repl 1
+addit requir 4
+addit requir event 1
+addit requir program 1
+addit restrict 2
+addit result 1
+addit rl 1
+addit run 1
+addit run tim 1
+addit sa 1
+addit sa experim 1
+addit se 2
+addit se tripl 1
+addit self 1
+addit self modif 1
+addit serv 2
+addit server 1
+addit server ensur 1
+addit signif 1
+addit signif differ 1
+addit simplif 1
+addit slot 1
+addit sub 1
+addit subcl 1
+addit support 1
+addit synchron 1
+addit tag 1
+addit tag field 1
+addit tak 1
+addit test 3
+addit th anchor 1
+addit th backlog 1
+addit th granl 1
+addit th object 1
+addit tim 2
+addit tim step 1
+addit tim unit 1
+addit to confirm 1
+addit to cpu 1
+addit to decr 1
+addit to del 1
+addit to e0 1
+addit to equ 1
+addit to expedit 1
+addit to featur 1
+addit to gener 1
+addit to hid 1
+addit to interfac 1
+addit to ip 1
+addit to minim 1
+addit to perform 1
+addit to predefin 1
+addit to read 1
+addit to record 1
+addit to recur 1
+addit to reduc 1
+addit to rel 1
+addit to show 2
+addit to solut 1
+addit to spec 1
+addit to substitut 1
+addit to subtyp 1
+addit tool 1
+addit typ 2
+addit typ conver 1
+addit typ dep 1
+addit upd 1
+addit us 2
+addit us self 1
+addit valu 1
+addit var 1
+addit var bcd 1
+addit var befor 1
+addit variabl 2
+addit ver 1
+addit visu 1
+addit visu channel 1
+addit we assum 1
+addit we gain 1
+addit we mean 1
+addit work 5
+additif 1
+additionnel 1
+additionnel a la 1
+additionnel dan 1
+additionnel dan le 1
+additionnel de 1
+additionnel de eff 1
+additionnel de pil 1
+additionnel don 1
+additionnel don un 1
+additionnel est 1
+additionnel est util 1
+additionnel indiqu 1
+additionnel indiqu dan 1
+additionnel sont 1
+additiv 1
+addr 61
+addr a uniqu 1
+addr a0 1
+addr al 1
+addr and algorithm 1
+addr and control 1
+addr and dat 2
+addr and examin 1
+addr and hot 1
+addr and integer 1
+addr and modif 1
+addr and serv 1
+addr and us 1
+addr and zer 1
+addr ar activ 1
+addr ar con 1
+addr ar execut 1
+addr ar known 1
+addr ar st 1
+addr architectur 1
+addr architectur mismatch 1
+addr becom 1
+addr bit 2
+addr both goal 1
+addr bottleneck 1
+addr bottleneck problem 1
+addr by allow 1
+addr by autonet 1
+addr cal serv 1
+addr calcl 1
+addr calcl addr 1
+addr calcl unit 1
+addr cel 1
+addr cel cont 1
+addr con 1
+addr concern 1
+addr conv 1
+addr cover 1
+addr differ problem 1
+addr e mail 1
+addr ec 1
+addr elsewh 1
+addr emp 1
+addr emp a1 1
+addr encod 1
+addr error 1
+addr error detect 1
+addr ev part 1
+addr failur 2
+addr failur rat 1
+addr for nod 1
+addr for numer 1
+addr for split 1
+addr guar 1
+addr ib2 1
+addr imperson 1
+addr in futur 1
+addr in gm 1
+addr in sect 1
+addr in st 1
+addr input 1
+addr is dupl 1
+addr is empl 1
+addr is lim 1
+addr is reassign 1
+addr is sup 1
+addr is unavail 1
+addr is writ 1
+addr issu 1
+addr latch 1
+addr lik ent 1
+addr map 1
+addr me 1
+addr me pa 1
+addr mechan 1
+addr memor 1
+addr mod 1
+addr mod requir 1
+addr multicast 1
+addr multicast commun 1
+addr nat 1
+addr new issu 1
+addr non 1
+addr non avail 1
+addr not availab 1
+addr of act 1
+addr of fail 1
+addr of memor 1
+addr of particip 1
+addr of server 1
+addr or dat 1
+addr per 1
+addr per failur 1
+addr problem 1
+addr proc 1
+addr purp 1
+addr remain 1
+addr remain unavail 1
+addr search 1
+addr sever problem 1
+addr spac 10
+addr spac architectur 1
+addr spac distribut 1
+addr spac eff 1
+addr spac level 1
+addr spac map 1
+addr spac multicomputer 1
+addr spac multiproc 1
+addr spac oper 1
+addr spac part 1
+addr spac repl 1
+addr spac shar 1
+addr st 1
+addr st brok 1
+addr stag 1
+addr stub 1
+addr td 1
+addr th approach 1
+addr th assign 1
+addr th ca 1
+addr th challeng 2
+addr th cover 1
+addr th dec 1
+addr th definit 1
+addr th demand 1
+addr th inter 1
+addr th issu 3
+addr th kcm 1
+addr th multitoler 1
+addr th optim 1
+addr th problem 7
+addr th quest 3
+addr th shortcom 1
+addr th task 1
+addr th test 1
+addr to cr 1
+addr to determin 1
+addr to host 1
+addr to mak 1
+addr to mean 1
+addr trac 1
+addr trac character 1
+addr transl 2
+addr transl ph 1
+addr transl stag 1
+addr tw issu 1
+addr tw problem 1
+addr unavail 1
+addr unavail st 1
+addr upd 1
+addr upon detect 1
+addr using 1
+addr wa unavail 1
+addr wh 1
+addr with random 1
+addr with typ 1
+addr xor 1
+addr xor bitmap 1
+addressdatat 1
+addressdatat from dat 1
+adeg 1
+adel 1
+adelberg 1
+adelph 1
+adelphiassb01.arm.mil 1
+adepartm 1
+adepartm of computer 1
+adequ 26
+adequ amount 1
+adequ and dynam 1
+adequ and encapsl 1
+adequ architectur 1
+adequ ba 1
+adequ buffer 1
+adequ buffer spac 1
+adequ captur 1
+adequ cl 1
+adequ criter 2
+adequ enough model 1
+adequ execut 1
+adequ execut model 1
+adequ experim 1
+adequ experim subject 1
+adequ exploit 1
+adequ exploit using 1
+adequ for specif 1
+adequ framework 1
+adequ help 1
+adequ introduc 1
+adequ model 1
+adequ of direct 1
+adequ of refin 1
+adequ perform 1
+adequ perform achief 1
+adequ prov 1
+adequ regr 1
+adequ regr equ 1
+adequ rel 1
+adequ requir 1
+adequ robust 1
+adequ simplif 1
+adequ spac 1
+adequ support 1
+adequ test 2
+adequ test se 1
+adequ to describ 1
+adequ typ 1
+adh 4
+adib 1
+adib and bruc 1
+adir 1
+adir de 1
+adir de pair 1
+adir le 1
+adir le instruc 1
+adir quun 1
+adir quun repr 1
+adir relog 1
+adir relog ee 1
+adj 2
+adj dorad 1
+adj ri 1
+adjac 25
+adjac and coplanar 1
+adjac cel 1
+adjac color 1
+adjac color reg 1
+adjac coplanar 1
+adjac coplanar fac 1
+adjac cr 1
+adjac cr sect 1
+adjac crossect 1
+adjac el 1
+adjac et recop 1
+adjac fac 1
+adjac hyperedg 1
+adjac hyperedg point 1
+adjac in g0 1
+adjac in g2 1
+adjac in gblog 1
+adjac in graph 1
+adjac in ti 1
+adjac inform 1
+adjac intern 1
+adjac intern delaun 1
+adjac intersect 1
+adjac intersect segm 1
+adjac level 1
+adjac link 1
+adjac list 1
+adjac matr 1
+adjac mod. 1
+adjac neighbor 1
+adjac nod 4
+adjac part 1
+adjac path 1
+adjac plan 1
+adjac posit 1
+adjac proc 1
+adjac reg 1
+adjac room 1
+adjac sect 1
+adjac sl 1
+adjac tetrahedr 1
+adjac tetrahedr bound 1
+adjac text 1
+adjac to ca 1
+adjac to cb 1
+adjac to exact 1
+adjac to nod 1
+adjac transposit 1
+adjac unmatch 1
+adjac unmatch ver 1
+adjac ver 3
+adjac voron 1
+adjac voron cel 1
+adjac weight 1
+adjac weight matr 1
+adjectif 1
+adjectiv 1
+adjectivenoun 1
+adjoin 2
+adjoin an edg 1
+adjoin edg 1
+adjoin edg eb 1
+adjoin onl interior 1
+adjoin th edg 1
+adjust 19
+adjust accord 1
+adjust appropr 1
+adjust ar 1
+adjust bi 1
+adjust block 1
+adjust block siz 1
+adjust by ad 1
+adjust dynam 1
+adjust dynam log 1
+adjust form 1
+adjust it bi 1
+adjust learn 1
+adjust learn rat 1
+adjust parameter 1
+adjust prob 1
+adjust prob distribut 1
+adjust textur 1
+adjust textur descript 1
+adjust th adjac 1
+adjust th alloc 1
+adjust th appropr 1
+adjust th bi 1
+adjust th inst 1
+adjust th parameter 1
+adjust th pot 1
+adjust th prior 1
+adjust th problem 1
+adjust th prompt 1
+adjust th upper 1
+adjust th weight 1
+adjust tim 1
+adjust tim del 1
+adjustm 5
+adjustm by replac 1
+adjustm valu 1
+adkm92 1
+adleman 1
+adler 1
+adler winograd92 1
+adm 20
+adm a compl 2
+adm a decomposit 1
+adm a fam 1
+adm a list 1
+adm a reif 1
+adm alor 1
+adm alor un 1
+adm au 1
+adm au moin 1
+adm de 1
+adm de solut 1
+adm distribut 1
+adm distribut implem 1
+adm inf5 1
+adm inf5 propag 1
+adm m lsdagentsobserv 1
+adm pol 1
+adm pol tim 1
+adm pot 1
+adm pot typ 1
+adm th requir 1
+adm that yacc 1
+adm un 1
+adm un ensembl 1
+adm un except 1
+adm un solut 1
+administer 7
+administer ar prop 1
+administer begin 1
+administer carneg 1
+administer carneg mellon 1
+administer in specif 1
+administer interfac 1
+administer is specif 1
+administer larg number 1
+administer of privileg 1
+administer of secur 1
+administer rol 1
+administer secur 1
+administer secur inform 1
+administer us 1
+administer us privileg 1
+administer wa addr 1
+administer want 1
+admir 1
+admissibl 1
+admissibl de 1
+admissibl de obj 1
+admon 1
+admon th us 1
+adolf 1
+adolf socor 1
+adopt 26
+adopt a deadlock 1
+adopt a gener 1
+adopt a heur 1
+adopt a log 1
+adopt a not 1
+adopt a philosoph 1
+adopt a retir 1
+adopt a system 1
+adopt an altern 1
+adopt an integr 1
+adopt and enh 1
+adopt by wa 1
+adopt by wal 1
+adopt ee 2
+adopt ee par 1
+adopt ee pour 1
+adopt for repl 1
+adopt for system 1
+adopt high 1
+adopt high dispar 1
+adopt lapproch 1
+adopt milner 1
+adopt milner slogan 1
+adopt of infer 1
+adopt spreadsh 1
+adopt spreadsh principl 1
+adopt th approach 1
+adopt th ba 1
+adopt th claus 1
+adopt th cluster 1
+adopt th conv 1
+adopt th model 1
+adopt th pol 1
+adopt to overcom 1
+adopt to perform 1
+adopt to specif 1
+adopt un cod 1
+adopt word 1
+adopter 1
+adopter de 1
+adopter de topolog 1
+adr 4
+adr a ladr 1
+adr bp 1
+adr claus 1
+adr compagnon 1
+adr compagnon gav 1
+adr compagnon help 1
+adr contigu 1
+adr contigu es 1
+adr cr 1
+adr d ecr 1
+adr de 2
+adr de ba 1
+adr de cel 1
+adr de cod 1
+adr de la 1
+adr de liaison 1
+adr de pag 1
+adr de prem 1
+adr de retour 1
+adr e par 1
+adr et le 1
+adr glob 1
+adr glob sembl 1
+adr ind 1
+adr indirect 1
+adr lectroniqu 1
+adr pa 1
+adr pa ee 1
+adr par 1
+adr par tous 1
+adr peut 1
+adr peut facil 1
+adr physiqu 1
+adr retour 1
+adr retour profon 1
+adr sauvegard 1
+adr sauvegard ee 1
+adr se 1
+adr se situ 1
+adr sont 1
+adr sont diff 1
+adr spac 1
+adr spac distribut 1
+adr vaut 1
+adr virtuel 1
+adr virtuel en 1
+adr vo 1
+adt 1
+aduij 1
+adv 83
+adv and disadv 5
+adv and mark 1
+adv appl 1
+adv ar disc 1
+adv ar obv 1
+adv architectur 1
+adv architectur id 1
+adv channel 1
+adv channel bandwidth 1
+adv compiler 3
+adv compiler optim 2
+adv comput 1
+adv computer 7
+adv computer inc 1
+adv computer sc 1
+adv computer stud 5
+adv cour 1
+adv cur 1
+adv cur slav 1
+adv datab 1
+adv datab appl 1
+adv disadv 2
+adv disadv allow 1
+adv drawback 1
+adv engineer 1
+adv engineer techniqu 1
+adv featur 1
+adv funct 1
+adv if visu 1
+adv imag 2
+adv imag lab 1
+adv imag vid 1
+adv in compiler 1
+adv in comput 2
+adv in datab 1
+adv in futur 2
+adv in graph 1
+adv in hardwar 1
+adv in human 1
+adv in inform 1
+adv in langu 3
+adv in multiproc 1
+adv in neur 4
+adv in parallel 1
+adv in pract 1
+adv in qu 1
+adv in softwar 2
+adv in technolog 1
+adv in verif 1
+adv inform 1
+adv interconnect 1
+adv interconnect network 1
+adv introduc 1
+adv introduc inclus 1
+adv is gain 1
+adv may outweigh 1
+adv micr 1
+adv micr dev 1
+adv ms 1
+adv ms schem 1
+adv non 1
+adv non determ 1
+adv of abstract 1
+adv of allow 1
+adv of cluster 1
+adv of dataflow 1
+adv of den 1
+adv of discr 1
+adv of fl 1
+adv of greater 1
+adv of human 1
+adv of incr 1
+adv of lp 1
+adv of lrc 1
+adv of monot 1
+adv of object 1
+adv of pag 1
+adv of parallel 1
+adv of prev 1
+adv of proc 1
+adv of progr 1
+adv of rapid 1
+adv of reach 1
+adv of rol 1
+adv of simpl 1
+adv of typ 1
+adv of unus 1
+adv of using 5
+adv of vid 1
+adv of virtu 1
+adv of wgp 1
+adv oft quot 1
+adv over altern 1
+adv over gener 1
+adv over hardwar 1
+adv over larger 1
+adv over md 1
+adv parallel 1
+adv parallel compiler 1
+adv program 1
+adv program techniqu 1
+adv programmer 1
+adv research 7
+adv research project 6
+adv research workshop 1
+adv softwar 1
+adv stud 2
+adv th intern 1
+adv that stack 1
+adv to us 1
+adv to using 1
+adv user 1
+adv user interfac 1
+adv visu 1
+adv visu inform 1
+adv we receiv 1
+adv you feel 1
+advanc 3
+advanc in cluster 1
+advanc in interconnect 1
+advanc in pack 2
+advanc in proc 1
+advanc in vl 1
+advantag 6
+advantag c ye 1
+advantag in simplif 1
+advantag parallel 1
+advantag parallel proper 1
+advantag that load 1
+advantag to inclus 1
+advantag to us 1
+advantag to util 1
+advent 4
+advent of electron 1
+advent of me 1
+adver 9
+adver affect 3
+adver compar 1
+adver impact 1
+adver man 1
+adver man nam 1
+adver to affect 1
+adverb 1
+advoc 5
+advoc an empir 1
+advoc claim 1
+advoc concentr 1
+advoc measur 1
+advoc such singl 1
+advoc th maint 1
+adwjk 1
+adzhief 1
+ae 30
+ae 9j 1
+ae air 1
+ae air pr 1
+ae be repr 1
+ae ci 1
+ae cur 1
+ae d i0 1
+ae def 1
+ae est 1
+ae est le 1
+ae f1 1
+ae fa1 1
+ae fe 1
+ae fn 1
+ae is alloc 1
+ae is strict 1
+ae j oe 1
+ae la 1
+ae la var 1
+ae li 1
+ae li ae 1
+ae lj 1
+ae lj aej 1
+ae ljaej 1
+ae lmac 1
+ae lmac aej 1
+ae mac 2
+ae n el 1
+ae n prior 1
+ae n smallest 1
+ae nm 1
+ae np 1
+ae np ad 1
+ae np pol 1
+ae op 1
+ae op erand 1
+ae p ad 1
+ae p fb0 1
+ae perform 1
+ae pj 1
+ae quantif 1
+ae quantif boolean 1
+ae r denot 1
+ae r oe 1
+ae sk 1
+ae t ae 1
+ae t2 1
+ae th rat 1
+ae timec 1
+ae timef 1
+ae timel 1
+ae to ar 1
+ae u1 1
+ae w gj 1
+ae w1 1
+ae w1 ae 1
+ae wi 1
+ae wk 1
+ae xj0 1
+ae y1 1
+ae yi 1
+ae zn 1
+ae0 2
+ae1 2
+ae1 ae2 1
+ae1 r1 1
+ae2 1
+ae2 ar continu 1
+aej 1
+aej cj 1
+aej f lj 1
+aej fn 1
+aej fr 1
+aej j mac 1
+aej li 1
+aej li ae 1
+aej lj 1
+aej lj aej 1
+aej mac 1
+aej pj 1
+aej smj 1
+aek 1
+aek at 1i 1
+aen 2
+aen j oe 1
+aen rn 1
+aeou 1
+aeou dan 1
+aeou dan ce 1
+aesth 1
+aesth manner 1
+aeu1 1
+aeu1 and degr 1
+aexh 1
+aexpr 1
+afc 1
+aff 10
+aff a de 1
+aff and polynom 1
+aff com 1
+aff com un 1
+aff constraint 2
+aff dan 1
+aff dan le 1
+aff de 2
+aff de la 1
+aff de matr 1
+aff de proxim 1
+aff de zn 1
+aff dun 1
+aff dun matr 1
+aff en 1
+aff en i1 1
+aff equ 1
+aff equiv 1
+aff expr 1
+aff form 1
+aff funct 2
+aff funct defin 1
+aff h1 1
+aff hyperplan 1
+aff it timestamp 1
+aff le 1
+aff nl 1
+aff nonlin 1
+aff nonlin singl 1
+aff nonlin system 1
+aff part 1
+aff point 1
+aff problem 1
+aff schedl 1
+aff se 1
+aff solut 1
+aff solut tr 1
+aff spac 1
+aff spac c1 1
+aff spac hi 1
+aff spac iff 1
+aff th appropr 1
+aff variabl 1
+aff variabl using 1
+affaibl 1
+affaibl de 1
+affaibl de la 1
+affair 3
+affair de 1
+affair de cod 1
+affair hav return 1
+affair is captur 1
+affect 62
+affect a datab 1
+affect a user 1
+affect adapt 1
+affect adapt prompt 1
+affect al subcl 1
+affect any nondetermin 1
+affect any re 1
+affect background 1
+affect background unicast 1
+affect by interfac 1
+affect by modif 1
+affect by var 1
+affect crit 1
+affect crit path 1
+affect de 1
+affect de argum 1
+affect destruc 1
+affect destruc combin 1
+affect destruc consom 1
+affect destruc est 1
+affect destructiv 1
+affect destructiv peuv 1
+affect ee 2
+affect es 1
+affect es sont 1
+affect fe 1
+affect it power 1
+affect la 1
+affect la var 1
+affect larger 1
+affect larger number 1
+affect le 1
+affect le autr 1
+affect loc 1
+affect lunif 1
+affect lunif dun 1
+affect nod 1
+affect nod re 1
+affect or contribut 1
+affect other modl 1
+affect other port 1
+affect our result 1
+affect over 1
+affect over execut 1
+affect parallel 1
+affect perform 2
+affect pot 1
+affect pot parallel 1
+affect program 1
+affect program behavior 1
+affect program compon 1
+affect refer 1
+affect rol 1
+affect rol particip 1
+affect sit 1
+affect speedup 1
+affect subcl 1
+affect system 1
+affect system understand 1
+affect th accur 1
+affect th appl 1
+affect th behavior 1
+affect th bound 1
+affect th burst 1
+affect th ch 1
+affect th commun 1
+affect th concept 1
+affect th conclus 1
+affect th correct 1
+affect th datab 1
+affect th dec 1
+affect th decl 1
+affect th difficult 1
+affect th ec 1
+affect th effect 2
+affect th equiv 1
+affect th extern 1
+affect th feed 1
+affect th fin 1
+affect th gener 1
+affect th kind 1
+affect th lat 1
+affect th logspac 1
+affect th loop 1
+affect th musculoskel 1
+affect th nonperiod 1
+affect th number 1
+affect th optim 1
+affect th over 2
+affect th perform 5
+affect th pipelin 1
+affect th proc 1
+affect th program 1
+affect th propag 1
+affect th psw 1
+affect th qu 1
+affect th refin 1
+affect th result 3
+affect th schedl 1
+affect th sem 1
+affect th siz 1
+affect th visu 1
+affect th wellform 1
+affect that particl 1
+affect var 1
+affect var cont 1
+affect variabl 1
+affecter 2
+affecter au 1
+affecter au processeur 1
+affecter aus 1
+affecter aus lautr 1
+affecter le 1
+affecteront 1
+affecteront aus 1
+affecteront aus la 1
+affer 2
+affich 1
+affich un mauv 1
+affin 5
+affin ar giv 1
+affin arbitr 1
+affin arbitr polynom 1
+affin ba 1
+affin ba rout 1
+affin both inequ 1
+affin constraint 1
+affin ellipt 1
+affin ellipt inequ 1
+affin hyperbol 1
+affin hyperbol inequ 1
+affin in softwar 1
+affin inequ 1
+affin inequ xy 1
+affin inform 1
+affin lower 1
+affin nor fact 1
+affin of equ 1
+affin on proc 1
+affin pib 1
+affin polynom 1
+affin polynom constraint 1
+affin produc 1
+affin reg 1
+affin reg establ 1
+affin schedl 1
+affin succeed 1
+affin th fact 1
+affin th inequ 1
+affin th polynom 1
+affin theorem 1
+affin to simplif 1
+affin we elim 1
+affin we ge 1
+affinit 1
+affinit e entr 1
+affinit e sur 1
+affirm 2
+affirm which inform 1
+affirmer 1
+affirmer qu 1
+affirmer qu le 1
+afford 6
+afford in gener 1
+afford moder 1
+afford moder tim 1
+afford th opportun 1
+aficionad 1
+aficionad al appear 1
+afin 3
+afin d eliminer 2
+afin d etr 1
+afin d eviter 1
+afin dacc 1
+afin dacc el 1
+afin dassurer 1
+afin dassurer qu 1
+afin daugmenter 1
+afin daugmenter le 1
+afin de 3
+afin de bien 1
+afin de calculer 1
+afin de combiner 1
+afin de con 1
+afin de conserver 1
+afin de contr 1
+afin de de 1
+afin de faciliter 1
+afin de fair 1
+afin de garantir 1
+afin de laisser 1
+afin de limiter 1
+afin de mettr 1
+afin de modif 1
+afin de ne 1
+afin de partitionner 1
+afin de passer 1
+afin de permettr 2
+afin de pointer 1
+afin de pouvoir 2
+afin de pr 1
+afin de prendr 1
+afin de raccourcir 1
+afin de refl 1
+afin de rendr 1
+afin de restaurer 1
+afin de retrouver 1
+afin de satisfair 1
+afin de savoir 1
+afin de simplif 2
+afin de tester 1
+afin de tirer 1
+afin de trouver 1
+afin de valider 1
+afin den 1
+afin den obtenir 1
+afin den tirer 1
+afin dessayer 1
+afin dessayer la 1
+afin dimpl 1
+afin dimpl ementer 1
+afin dint 1
+afin dint egrer 1
+afin dinvalider 1
+afin dinvalider superficiel 1
+afin dobtenir 2
+afin dobtenir le 1
+afin dobtenir un 1
+afin doptimiser 1
+afin doptimiser sa 1
+afin dutiliser 1
+afin dutiliser le 1
+afin qu 2
+afin qu la 1
+afin qu le 1
+afin qu son 1
+afip 2
+afip spring 1
+afip spring joint 1
+aflever 1
+afm86 1
+afor 1
+afor error 1
+afor error condit 1
+aform 1
+aform algorithm 1
+aftd 1
+aftd sobt 1
+after 4
+after du 1
+afterd 1
+afterd is defin 1
+afterdn 1
+afterform 1
+afterform being proc 1
+afterq4 1
+ag 23
+ag a la 1
+ag a pour 1
+ag and fil 1
+ag and fx 1
+ag au 1
+ag au coeur 1
+ag canoniqu 1
+ag canoniqu op 1
+ag classiqu 1
+ag constitu 1
+ag constitu un 1
+ag cour 1
+ag cour com 1
+ag dan 1
+ag dan de 1
+ag de 1
+ag de la 1
+ag de sa 1
+ag dg 1
+ag dg xi 1
+ag don 1
+ag don dan 1
+ag du 1
+ag du nouveau 1
+ag du point 1
+ag du pr 1
+ag dun 1
+ag dun mi 1
+ag ee 1
+ag ee qu 1
+ag en 1
+ag en optim 1
+ag est 1
+ag est direct 1
+ag et daffect 1
+ag et nous 1
+ag f doit 1
+ag fon 1
+ag fon ee 1
+ag ind 1
+ag ind ependam 1
+ag is re 1
+ag is unsatisf 1
+ag nutil 1
+ag nutil qu 1
+ag offr 1
+ag offr un 1
+ag par 1
+ag par hybrid 1
+ag par rapport 1
+ag pour 1
+ag pour la 1
+ag publ 1
+ag qu 1
+ag qu sont 1
+ag rep 1
+ag rep sur 1
+ag s equentiel 1
+ag schem 1
+ag si 1
+ag sont 1
+ag sont de 1
+ag sur 2
+ag sur ce 1
+ag sur de 1
+ag sur di 1
+ag t de 1
+ag travail 1
+ag travail sur 1
+ag under contract 1
+ag util 1
+ag util de 1
+agard 1
+agarw 3
+agc 1
+agc avec 1
+agc avec un 1
+agc conserv 1
+agc est 1
+agc est de 1
+agc ne 1
+agc ne converg 1
+agenc 1
+agenc a la 1
+agenc compat 1
+agenc compat avec 1
+agenc de 1
+agenc de lenregister 1
+agenc de lenviron 1
+agenc de point 1
+agenc de typ 1
+agenc du 1
+agenc du point 1
+agenc dun 1
+agenc dun point 1
+agenc par 1
+agenc par lequel 1
+agenc pour 1
+agenc pour lequel 1
+agencer 1
+agencer lenviron 1
+agencer lenviron de 1
+agent 12
+agent a0 1
+agent a0 me 1
+agent a1 1
+agent act 1
+agent alphab 1
+agent and comp 1
+agent and shunt 1
+agent ar es 1
+agent ar inform 1
+agent ar object 1
+agent comun 1
+agent comun program 1
+agent concur 1
+agent cooper 1
+agent cooper task 1
+agent cur 1
+agent cur posit 1
+agent describ 1
+agent descript 1
+agent driver 1
+agent exerc 1
+agent fil 1
+agent fil commun 1
+agent first consider 1
+agent go 1
+agent handl 1
+agent handl remot 1
+agent help 1
+agent help debug 1
+agent inst 1
+agent inst invoc 1
+agent interact 1
+agent is block 1
+agent is describ 1
+agent is plac 1
+agent is transfer 1
+agent know 1
+agent loc 1
+agent loc dat 1
+agent macr 1
+agent macr assemblerlinkerprolog 1
+agent may read 1
+agent may shar 1
+agent may start 1
+agent may writ 1
+agent might leak 1
+agent model 1
+agent monit 1
+agent monit me 1
+agent noun 1
+agent noun phr 1
+agent onl us 1
+agent oper 1
+agent oper conflict 1
+agent orient 1
+agent orient model 1
+agent orient program 1
+agent output 1
+agent output shunt 1
+agent presum 1
+agent protocol 1
+agent reach 1
+agent reach f9 1
+agent reason 1
+agent respon 1
+agent should idl 1
+agent skip 1
+agent speed 1
+agent speed transducer 1
+agent start 1
+agent start execut 1
+agent support 1
+agent support symbol 1
+agent t termin 1
+agent tak 1
+agent term 1
+agent termin 1
+agent termin correct 1
+agent that commun 1
+agent then mak 1
+agent to gener 1
+agent to siml 1
+agent tr 1
+agent variabl 1
+agent vehicl 1
+agent wh help 1
+agent which commun 1
+agent wish 1
+agent work 1
+agenthardwareemulatorsystem 1
+agenthardwareemulatorsystem developmentand 1
+agenthardwareemulatorsystem developmentand debug 1
+agentprolog 1
+agentprolog systemkernelkcmhost 1
+agep 1
+agep ag 1
+agep agep 1
+agep agep ag 1
+ager 1
+aggarw 2
+aggarw and vitter 1
+aggoun 4
+aggoun et beldiceanu 1
+aggr 2
+aggr model 1
+aggr reorder 1
+aggr reorder complec 1
+aggrav 1
+aggreg 11
+aggreg bandwidth 1
+aggreg cach 1
+aggreg cach inv 1
+aggreg featur 1
+aggreg funct 2
+aggreg link 1
+aggreg multipl 1
+aggreg multipl inst 1
+aggreg network 1
+aggreg network throughput 1
+aggreg network traff 1
+aggreg object 1
+aggreg quer 1
+aggreg throughput 1
+aggreg to form 1
+aggreg to hist 1
+aggreg valu 1
+aggrf 1
+agh 2
+agh act 1
+aghag 1
+aghag cs.uiuc.edu 1
+aghag cs.uiuc.edu jun 1
+aghil 1
+aging 1
+agit 2
+agit loc 1
+agit loc sur 1
+agit un group 1
+agm 2
+agm88 1
+agm90 1
+agmk94 1
+agr 27
+agr abl 1
+agr and wh 1
+agr in rank 1
+agr number 1
+agr number daah04 1
+agr of maxim 1
+agr problem 1
+agr protocol 1
+agr sl 1
+agr that atom 1
+agr that me 1
+agr that tool 1
+agr to start 1
+agr with not 1
+agr with weyuker 1
+agraw 9
+agraw and ramakrishnan 1
+agraw for var 1
+agraw pr 1
+agreed 3
+agreed and deliver 1
+agreed inherit 1
+agreed me 1
+agreed me deliv 1
+agreed ment 1
+agreed report 1
+agreed that chang 1
+agreed to support 1
+agu72 1
+agv 1
+ah 6
+ah and j.d 1
+ah et al 1
+ah90 1
+ahamad 1
+ahead 12
+ahead by li 1
+ahead compiler 1
+ahead compiler compiler 1
+ahead connect 1
+ahead in serv 1
+ahead log 2
+ahead log protocol 1
+ahead of tim 2
+ahead predict 1
+ahead predict perform 1
+ahead predict using 1
+ahead window 1
+ahm 2
+ahm tempor 1
+ahm tempor ext 1
+ahmad 1
+ahn 2
+ahn and richard 1
+ahn and snodgr 1
+ahpcrc 1
+ai 34
+ai 2l 1
+ai 2l ni 1
+ai a aj 1
+ai ai 2
+ai ai log 1
+ai aj 2
+ai aj iff 1
+ai and a0is 1
+ai and aj 1
+ai and bj 1
+ai and substitut 1
+ai and valu 1
+ai appl 1
+ai ar denot 1
+ai ar determin 1
+ai ar equ 1
+ai ar integer 1
+ai as view 1
+ai bg 1
+ai c iff 1
+ai centr 1
+ai correspon 1
+ai denot 1
+ai e de 1
+ai ee 2
+ai ee ce 1
+ai ee dan 1
+ai ei 1
+ai ement 2
+ai ement applicabl 1
+ai ement le 1
+ai et unif 1
+ai evalu 1
+ai in engineer 1
+ai is maxim 1
+ai is undefin 1
+ai l2i 1
+ai l2i ai 1
+ai lab 1
+ai log 1
+ai magaz 1
+ai mem 2
+ai na 1
+ai repr 1
+ai research 1
+ai s ps 1
+ai sect 1
+ai seront 1
+ai seront aus 1
+ai system 1
+ai tr 1
+ai u1i 1
+ai u1i l2i 1
+ai.iit.nrc.ca 1
+ai.univ.ac.at 1
+ai1 1
+aib 2
+aibij 1
+aic 2
+aic 1g 1
+aic 1g na 1
+aic akxk 1
+aic est 1
+aic est redon 1
+aic method 1
+aic to select 1
+aic0 1
+aic0 bi 1
+aic00 1
+aic00 mi 1
+aid 25
+aid a reasoner 1
+aid adapt 1
+aid by multicast 1
+aid certain fact 1
+aid design 4
+aid design system 1
+aid draft 1
+aid draft system 1
+aid e dan 1
+aid et se 1
+aid for me 1
+aid ga 1
+aid ga pipel 1
+aid in blam 1
+aid in effect 1
+aid in understand 1
+aid in writ 1
+aid maint 1
+aid med 1
+aid med dec 1
+aid modl 1
+aid modl test 1
+aid of mechan 1
+aid on 1
+aid on memor 1
+aid pr 1
+aid pr ecieus 1
+aid reader 1
+aid schedl 1
+aid such implem 1
+aid th implem 1
+aid th parallel 1
+aid th partit 1
+aid to compar 1
+aid to help 1
+aid to human 1
+aid to support 1
+aid to understand 1
+aid understand 1
+aider 2
+aider a guider 1
+aider le 1
+aider le person 1
+aiel 1
+aient 3
+aient d esign 1
+aient du 1
+aient du sen 1
+aient un coeff 1
+aig 2
+aiguil 1
+aiguil lec 1
+aiguil lec ecut 1
+aij 5
+aij 8i 1
+aij aj 1
+aij ci 1
+aij lim 1
+aij mean 1
+aij si 1
+aijd 1
+aijdj 1
+aijdj di 1
+aijxj 1
+aijyj 1
+aijyj bi 1
+aik 5
+aik jd 1
+aik jd est 1
+aik jd jd 1
+aik mac 1
+aik mod 1
+aik uj 1
+aikb 1
+aikg 1
+aikg ae 1
+aikg ae fa1 1
+ailleur 3
+ailleur ain 1
+ailleur ain quel 1
+ailleur chaqu 1
+ailleur chaqu processeur 1
+aim 30
+aim a structur 1
+aim at incorpor 1
+aim at lan 1
+aim at maintain 1
+aim at master 1
+aim at multiproc 1
+aim at produc 1
+aim behind sv 1
+aim for compl 1
+aim g ye 1
+aim of establ 1
+aim of log 1
+aim of sl1 1
+aim system 1
+aim to determin 1
+aim to ensur 1
+aim to relief 1
+aim to show 1
+aim to solut 1
+aim to stud 1
+aimerait 1
+aimerait aus 1
+aimerait aus changer 1
+ain 5
+ain a la 1
+ain a un 2
+ain au 3
+ain au moin 1
+ain au niveau 1
+ain au probl 1
+ain calculer 1
+ain calculer le 1
+ain caract 1
+ain caract er 1
+ain caract eriser 1
+ain coexister 1
+ain conduir 1
+ain construit 1
+ain cr 1
+ain cr eer 1
+ain d efin 1
+ain d enombrer 1
+ain d etermin 1
+ain d eviter 1
+ain de 3
+ain de architectur 1
+ain de la 1
+ain de nombreus 1
+ain diminuer 1
+ain diminuer encor 1
+ain direct 1
+ain direct issus 1
+ain ecrir 2
+ain ecrir le 1
+ain effectuer 1
+ain effectuer la 1
+ain en 1
+ain en mesur 1
+ain en un 1
+ain enregister 1
+ain enregister ee 1
+ain entr 1
+ain etr 1
+ain etr estampil 1
+ain exploit 1
+ain exploit ee 1
+ain g en 1
+ain inutil 1
+ain inutil de 1
+ain jusqu 1
+ain l equilibr 1
+ain la 1
+ain la fin 1
+ain le 1
+ain le nombr 1
+ain lexplor 1
+ain lexplor du 1
+ain lincertitud 1
+ain lincertitud de 1
+ain lindividu 1
+ain lindividu de 1
+ain linit 1
+ain linit de 1
+ain loccur 1
+ain loccur dit 1
+ain migrer 1
+ain obtenu 1
+ain obtenu constitu 1
+ain po de 2
+ain potentiel 1
+ain pr 1
+ain pr eserver 1
+ain propr 1
+ain qu 5
+ain qu cp 1
+ain qu dan 1
+ain qu de 2
+ain qu deux 1
+ain qu la 2
+ain qu le 4
+ain qu lec 1
+ain qu leur 1
+ain qu linit 1
+ain qu linstruc 1
+ain qu lunif 1
+ain qu luniqu 1
+ain qu michel 1
+ain qu par 1
+ain qu pour 1
+ain qu quelqu 1
+ain qu son 1
+ain quel 1
+ain quel est 1
+ain quil 1
+ain quil est 1
+ain quun 2
+ain quun concept 1
+ain quun drapeau 1
+ain quun moy 1
+ain quun zon 1
+ain r eduir 1
+ain remplacer 1
+ain remplacer le 1
+ain s elect 1
+ain s est 1
+ain se 1
+ain se passer 1
+ain tout 1
+ain tout le 1
+ain tr 1
+ain tr li 1
+ain un 2
+ain un arbr 1
+ain un cadr 1
+ain un pag 1
+ain un point 1
+ain un possibilit 1
+ain un processeur 1
+ain v rioer 1
+air 6
+air et le 1
+air fight 1
+air forc 1
+air forc off 1
+air pr 1
+air pr ef 1
+air re 1
+air xy 1
+aircraft 1
+aircraft in rtl 1
+aircraft oper 1
+aircraft oper flight 1
+airl 2
+airl reserv 2
+airl reserv system 1
+airport 1
+airport termin 1
+aisb 2
+aisb95 1
+aisb95 workshop 1
+aisb95 workshop autom 1
+aisl 1
+ait 3
+ait bien 1
+ait de 1
+ait de project 1
+ait du 1
+ait du sen 1
+ait jam 1
+ait jam eu 1
+ait just 1
+ait mi 1
+ait mi le 1
+ait pa 2
+ait pa de 2
+ait pa dim 1
+ait termin 1
+ait un sen 1
+ait vraim 1
+aixr 1
+aj 12
+aj ai 1
+aj and ln 1
+aj ar maxim 1
+aj bj 1
+aj bj cj 1
+aj et la 1
+aj iff 1
+aj iff a0i 1
+aj iff fi 1
+aj ln 1
+aj wh head 1
+aj5 1
+ajap 1
+ajj 1
+ajout 3
+ajout a ce 1
+ajout au 1
+ajout aux 2
+ajout aux instruc 1
+ajout ce 1
+ajout de 2
+ajout de el 1
+ajout de som 1
+ajout du 1
+ajout du cod 1
+ajout dun 1
+ajout dun tr 1
+ajout e au 1
+ajout ee 2
+ajout ee au 1
+ajout le 2
+ajout le champ 1
+ajout le fonct 1
+ajout lin 1
+ajout lin egalit 1
+ajout qu 1
+ajout qu linv 1
+ajout un 1
+ajout un maillon 1
+ajout un nouvel 1
+ajout un transform 1
+ajouter 2
+ajouter a ce 1
+ajouter au 1
+ajouter au syst 1
+ajouter aux 1
+ajouter aux contraint 1
+ajouter de 1
+ajouter de fonct 1
+ajouter dynamiqu 1
+ajouter dynamiqu de 1
+ajt 1
+ajt fa 1
+ajust 2
+ajust dynamiqu 1
+ajust dynamiqu de 1
+ajust es 1
+ajust es de 1
+ajx0 1
+ajx00 1
+ajx00 bj 1
+ajz 1
+ak 14
+ak and bk 1
+ak ar rel 1
+ak assoc 1
+ak bk 1
+ak et bk 1
+ak krestkk 1
+ak kx 1
+ak larson 1
+ak larson upd 1
+ak pi2v 1
+ak pi2v fkg 1
+ak ss 1
+ak t arnlund 1
+ak0ic 1
+ak0ic ak0k 1
+ak0ic ak0k ak 1
+ak0ic ak0kxk 1
+ak0k 1
+ak0k ak 1
+ak0k entr 1
+ak0k entr le 1
+ak0kxk 1
+ak86 1
+ak87 1
+ak91 1
+akademieverlag 1
+akademisch 3
+akademisch austauschdienst 2
+akademisch verlagsgesellschaft 1
+akademisch verlagsgesellschaft geest 1
+akaik 1
+akaik inform 1
+akaik inform criter 1
+akd 1
+akd of proc 1
+akin 2
+akin to acor 1
+akinor 2
+akinor yonezaw 1
+akinor yonezaw1 1
+akl 3
+akl appar 1
+akl dan 1
+akl dan un 1
+akl et la 1
+akxk 1
+akzent 1
+al 65
+al addr 1
+al al 1
+al al al 1
+al al alivealivedeaddead 1
+al al dead 1
+al al deaddead 1
+al alivealivedeaddead 1
+al alivealivedeaddead dead 1
+al alivedeaddead 1
+al alivedeaddead dead 1
+al an 1
+al atoir 1
+al atoir correspon 1
+al atoir dan 1
+al atoir de 1
+al atoir mod 1
+al badr 1
+al cancel 1
+al cel 1
+al daoud 1
+al daoud stuart 1
+al dat 1
+al dead 1
+al dead deaddead 1
+al deaddead 1
+al deaddead al 1
+al deaddeaddead 1
+al denot 1
+al eatoir 3
+al eatoir ain 1
+al eatoir correspon 1
+al eatoir dan 1
+al eatoir de 3
+al eatoir est 1
+al eatoir nimpliqu 1
+al eatoir parm 1
+al eatoir pour 1
+al eatoir quil 1
+al eatoir repr 1
+al eatoir sur 1
+al eatoir zj 1
+al for phy 1
+al fortran 1
+al fortran program 1
+al in term 1
+al jusqu 1
+al log 1
+al me 1
+al neighbor 1
+al or dead 1
+al or interpol 1
+al organ 1
+al organ continu 1
+al perman 1
+al perman variabl 1
+al phy 1
+al phy pag 1
+al program 1
+al protocol 1
+al refer 1
+al tempor 1
+al tempor log 1
+al van 2
+al van gelder 2
+al wer implem 1
+al8 1
+al8 appl 1
+al8 appl soft 1
+al83 1
+alabor 1
+alabor for datab 1
+alaettin 1
+alaettin glu 1
+alag 1
+alain 2
+alain lichnewsk 1
+alain lichnewsk pour 1
+alain lichnewsk rapporteur 1
+alam 4
+alam nat 1
+alam nat labor 1
+alan 4
+alan georg 1
+alan robinson 1
+alan sext 1
+alan sext qu 1
+alan wenban 1
+alap 1
+alap and asap 1
+alap start 1
+alap start tim 1
+alap tim 1
+alap valu 1
+alarm 2
+alarm de 1
+albequerqu 1
+alber 3
+alber phd 1
+alber phd scholarship 1
+alber t6g 1
+alber t6g 2h1 1
+alberg 1
+albrecht 2
+albrecht univer kiel 1
+albrecht universitat 1
+albrecht universitat zu 1
+album 1
+album for art 1
+albuquerqu 2
+alburquerqu 1
+alchourron 1
+alchourron gardenfor 1
+alchourron gardenfor makinson 1
+alcom 1
+alcom ii 1
+aleatoir 1
+aleatoir popl 1
+aleatoir popl apr 1
+alec 2
+alec poth 2
+aler 3
+aler j backspac 1
+aler th appl 1
+alewif 1
+alewif muninivykoan 1
+alewif muninivykoan myoan 1
+alexander 4
+alexander lind 1
+alexander von 1
+alexander von humboldt 1
+alexandru 1
+alexandru nicolau 1
+alexief 1
+alfr 2
+alg 4
+alg br 1
+alg br de 1
+alg br dop 1
+alg br nest 1
+alg ebr 1
+alg ebr lin 1
+alg ebriqu 1
+alg ebriqu de 1
+alg ebriqu mapl 1
+alg ebriqu pu 1
+alg ebriqu qu 1
+alg. 1
+algebr 26
+algebr and boolean 1
+algebr and calculus 1
+algebr and evalu 1
+algebr and geometer 1
+algebr and log 4
+algebr and oe 1
+algebr and program 1
+algebr and rel 1
+algebr answer 1
+algebr answer requir 1
+algebr approach 3
+algebr axiom 1
+algebr ba 1
+algebr bm 1
+algebr book 1
+algebr by structur 1
+algebr cel 1
+algebr cel decomposit 1
+algebr character 1
+algebr comput 1
+algebr discr 1
+algebr discr method 1
+algebr eigenvalu 1
+algebr eigenvalu problem 1
+algebr equ 1
+algebr expr 4
+algebr expr answer 1
+algebr expr involut 1
+algebr for specif 1
+algebr for sum 1
+algebr form 1
+algebr form pair 1
+algebr framework 1
+algebr gener 1
+algebr inclus 1
+algebr incorpor 1
+algebr is bm 1
+algebr is bool 1
+algebr is graph 1
+algebr is isomorph 1
+algebr is part 1
+algebr is review 1
+algebr is suff 1
+algebr langu 1
+algebr lat 1
+algebr lat problem 1
+algebr manipl 1
+algebr method 1
+algebr model 1
+algebr not 1
+algebr of cardin 1
+algebr oper 2
+algebr or st 1
+algebr program 1
+algebr proper 1
+algebr proper rel 1
+algebr prov 1
+algebr prov procedur 1
+algebr rewrit 1
+algebr rewrit follow 1
+algebr riccat 1
+algebr riccat equ 1
+algebr se 1
+algebr sem 1
+algebr system 1
+algebr theor 1
+algebr to giv 1
+algebr to manipl 2
+algebr transform 1
+algebr w.r.t 1
+algebr which specif 1
+algebr with ext 1
+algebr with part 1
+algebr with slight 1
+algebriqu 1
+algebriqu de 1
+algebriqu de polyn 1
+algoirthm 1
+algoirthm of sect 1
+algorithm 103
+algorithm a surv 1
+algorithm abl 1
+algorithm accord 1
+algorithm achief 2
+algorithm achief predict 1
+algorithm achief subst 1
+algorithm ad 2
+algorithm adapt 1
+algorithm after introduc 1
+algorithm again us 1
+algorithm al giv 1
+algorithm al keep 1
+algorithm al overcom 1
+algorithm al perform 1
+algorithm allev 1
+algorithm alw termin 1
+algorithm an 1
+algorithm and an 1
+algorithm and architectu 1
+algorithm and architectur 7
+algorithm and batch 1
+algorithm and cod 1
+algorithm and collect 1
+algorithm and common 1
+algorithm and compar 1
+algorithm and complec 3
+algorithm and comput 2
+algorithm and computer 1
+algorithm and correspon 1
+algorithm and dat 4
+algorithm and decept 1
+algorithm and enhanc 1
+algorithm and evolut 1
+algorithm and gener 1
+algorithm and heur 1
+algorithm and insight 1
+algorithm and mad 1
+algorithm and neur 1
+algorithm and produc 1
+algorithm and proof 1
+algorithm and prov 1
+algorithm and rl 1
+algorithm and robot 1
+algorithm and show 1
+algorithm and siml 2
+algorithm and system 1
+algorithm and techniqu 1
+algorithm and technolog 1
+algorithm and term 1
+algorithm and weight 1
+algorithm and workload 1
+algorithm anim 2
+algorithm anim system 1
+algorithm ap 1
+algorithm appear 1
+algorithm appel 1
+algorithm appel ee 1
+algorithm appl 1
+algorithm appl fact 1
+algorithm approach 1
+algorithm ar ba 1
+algorithm ar centr 1
+algorithm ar classif 1
+algorithm ar describ 3
+algorithm ar disc 1
+algorithm ar ea 1
+algorithm ar eff 1
+algorithm ar fl 1
+algorithm ar impract 1
+algorithm ar iter 1
+algorithm ar known 1
+algorithm ar number 1
+algorithm ar orient 1
+algorithm ar relev 1
+algorithm ar saf 1
+algorithm ar shown 1
+algorithm ar simil 2
+algorithm ar simplif 1
+algorithm ar slower 1
+algorithm ar suit 1
+algorithm ar systol 1
+algorithm ar typ 1
+algorithm as describ 1
+algorithm as follow 1
+algorithm as primitiv 1
+algorithm as tool 1
+algorithm assoc 1
+algorithm assum 4
+algorithm assum unlim 1
+algorithm asynchr 1
+algorithm attempt 2
+algorithm av 1
+algorithm av an 1
+algorithm av traver 1
+algorithm avec 1
+algorithm avec le 1
+algorithm ba 13
+algorithm backtrack 1
+algorithm be impl 1
+algorithm be minim 1
+algorithm becom 2
+algorithm begin 1
+algorithm behav 3
+algorithm behav exact 1
+algorithm behavior 1
+algorithm belong 1
+algorithm benchmark 1
+algorithm benchmark author 1
+algorithm boil 1
+algorithm boolean 1
+algorithm boolean eval 1
+algorithm break 1
+algorithm build 1
+algorithm built 1
+algorithm by an 1
+algorithm by construc 1
+algorithm by dav 1
+algorithm by exampl 1
+algorithm by exploit 1
+algorithm by find 1
+algorithm by georg 1
+algorithm by hendrickson 1
+algorithm by inform 1
+algorithm by karp 1
+algorithm by regl 1
+algorithm by shift 1
+algorithm by sort 1
+algorithm cal deltablu 1
+algorithm cal fast 1
+algorithm cal fram 1
+algorithm calqu 1
+algorithm calqu ee 1
+algorithm can demonstr 1
+algorithm can improv 1
+algorithm can reduc 1
+algorithm can result 1
+algorithm can select 1
+algorithm can signif 1
+algorithm can str 1
+algorithm can yield 1
+algorithm cannot achief 1
+algorithm cannot gener 1
+algorithm cap 1
+algorithm cd 1
+algorithm cd cd 1
+algorithm chang 1
+algorithm check 1
+algorithm check impl 1
+algorithm classiqu 2
+algorithm classiqu doptim 1
+algorithm classiqu sur 1
+algorithm coinc 1
+algorithm color 1
+algorithm common 1
+algorithm compar 2
+algorithm complec 2
+algorithm comput 3
+algorithm con 6
+algorithm consider 1
+algorithm construc 3
+algorithm construc control 1
+algorithm context 1
+algorithm continu 2
+algorithm continu mov 1
+algorithm converg 1
+algorithm cpu 1
+algorithm cpu sec 1
+algorithm cur 2
+algorithm cur avail 1
+algorithm cycl 1
+algorithm cycl calcl 1
+algorithm cycl construc 1
+algorithm d elim 1
+algorithm dan 1
+algorithm dan le 1
+algorithm de 3
+algorithm de classioc 1
+algorithm de de. 1
+algorithm de desc 2
+algorithm de gaus 1
+algorithm de gram 1
+algorithm de rec 1
+algorithm de recherch 2
+algorithm de recon 1
+algorithm de recuit 1
+algorithm de rout 1
+algorithm de vid 1
+algorithm def 1
+algorithm demeur 1
+algorithm demeur import 1
+algorithm demonstr 1
+algorithm dep 3
+algorithm depict 1
+algorithm deriv 1
+algorithm describ 10
+algorithm descript 1
+algorithm descript ea 1
+algorithm design 3
+algorithm destin 1
+algorithm destin es 1
+algorithm detail 1
+algorithm detect 1
+algorithm detect syntact 1
+algorithm develop 2
+algorithm differ 2
+algorithm differ consider 1
+algorithm direct 1
+algorithm direct issus 1
+algorithm disc 2
+algorithm distribut 1
+algorithm dm 1
+algorithm do unnec 1
+algorithm doiv 1
+algorithm doiv pouvoir 1
+algorithm dont le 1
+algorithm du 2
+algorithm du lancer 1
+algorithm each nod 1
+algorithm eff 1
+algorithm eff accommod 1
+algorithm eff handl 1
+algorithm emb 1
+algorithm emb hypergraph 1
+algorithm empl 1
+algorithm ensur 1
+algorithm est 2
+algorithm est gal 1
+algorithm est la 1
+algorithm est noy 1
+algorithm etc 1
+algorithm eux 1
+algorithm eval 1
+algorithm eval iter 1
+algorithm exact 1
+algorithm exact simplif 1
+algorithm exampl 1
+algorithm exampl wh 1
+algorithm exchang 1
+algorithm execut 1
+algorithm execut therefor 1
+algorithm exhibit 1
+algorithm expan 1
+algorithm exploit 1
+algorithm ext 1
+algorithm extr 1
+algorithm extr parameter 1
+algorithm facilit 1
+algorithm facilit proc 1
+algorithm faster 1
+algorithm find 2
+algorithm find intersect 1
+algorithm first discover 1
+algorithm fo 1
+algorithm follow 4
+algorithm for 3d 1
+algorithm for adapt 1
+algorithm for adjust 1
+algorithm for algebr 1
+algorithm for approxim 1
+algorithm for arriv 1
+algorithm for ba 1
+algorithm for backpropag 1
+algorithm for backtrack 1
+algorithm for bar 1
+algorithm for block 1
+algorithm for boolean 1
+algorithm for categor 1
+algorithm for ch 1
+algorithm for check 1
+algorithm for cluster 1
+algorithm for cnf 1
+algorithm for collect 1
+algorithm for combin 2
+algorithm for complec 1
+algorithm for comput 2
+algorithm for concur 2
+algorithm for connect 2
+algorithm for construc 3
+algorithm for continu 1
+algorithm for cycl 1
+algorithm for dat 2
+algorithm for decluster 1
+algorithm for dep 3
+algorithm for determin 2
+algorithm for distribut 1
+algorithm for dynam 2
+algorithm for eff 1
+algorithm for emb 1
+algorithm for estim 1
+algorithm for exampl 1
+algorithm for fac 1
+algorithm for find 5
+algorithm for for 1
+algorithm for gener 3
+algorithm for graph 2
+algorithm for hardwar 1
+algorithm for heapsort 1
+algorithm for horizont 1
+algorithm for hybrid 1
+algorithm for implem 1
+algorithm for increm 1
+algorithm for individu 1
+algorithm for infl 1
+algorithm for inser 1
+algorithm for inst 1
+algorithm for interprocedur 1
+algorithm for intract 1
+algorithm for intraprocedur 1
+algorithm for irregl 2
+algorithm for layout 1
+algorithm for lin 1
+algorithm for load 1
+algorithm for lock 1
+algorithm for log 1
+algorithm for lp 1
+algorithm for ma 1
+algorithm for map 1
+algorithm for match 1
+algorithm for matr 2
+algorithm for maxim 2
+algorithm for md 1
+algorithm for min 1
+algorithm for minim 1
+algorithm for mov 1
+algorithm for mult 1
+algorithm for multibean 1
+algorithm for multicast 1
+algorithm for multidim 1
+algorithm for multilevel 1
+algorithm for multim 1
+algorithm for narx 1
+algorithm for nding 1
+algorithm for object 1
+algorithm for optim 1
+algorithm for pack 1
+algorithm for parallel 3
+algorithm for partit 3
+algorithm for ph 1
+algorithm for planar 1
+algorithm for point 1
+algorithm for pointer 1
+algorithm for polygon 1
+algorithm for prob 1
+algorithm for probabil 1
+algorithm for proc 1
+algorithm for produc 1
+algorithm for program 1
+algorithm for protein 1
+algorithm for random 2
+algorithm for real 1
+algorithm for recognit 1
+algorithm for recov 1
+algorithm for refin 1
+algorithm for regl 1
+algorithm for regr 1
+algorithm for report2b 1
+algorithm for rol 1
+algorithm for rout 1
+algorithm for rt1 1
+algorithm for satisf 1
+algorithm for scal 1
+algorithm for scan 1
+algorithm for schedl 1
+algorithm for separ 1
+algorithm for sequ 1
+algorithm for simplif 1
+algorithm for solut 10
+algorithm for sort 3
+algorithm for spar 1
+algorithm for steiner 1
+algorithm for subtyp 1
+algorithm for synchron 1
+algorithm for synth 1
+algorithm for test 2
+algorithm for tot 1
+algorithm for tr 1
+algorithm for traff 1
+algorithm for triangl 1
+algorithm for typ 1
+algorithm for typecheck 1
+algorithm for underconstrain 1
+algorithm for unweight 1
+algorithm for us 1
+algorithm for vect 1
+algorithm for ver 1
+algorithm for weight 1
+algorithm for wid 1
+algorithm found 1
+algorithm from combin 1
+algorithm from figur 1
+algorithm funct 1
+algorithm g en 1
+algorithm ge 1
+algorithm gener 4
+algorithm genl 1
+algorithm giv 4
+algorithm graph 1
+algorithm graph theor 1
+algorithm great 1
+algorithm ha adv 1
+algorithm ha becom 1
+algorithm ha congest 1
+algorithm ha explicit 1
+algorithm ha prev 1
+algorithm ha siz 1
+algorithm ha solut 1
+algorithm ha walk 1
+algorithm handl 1
+algorithm hav low 1
+algorithm hav perform 1
+algorithm ignor 1
+algorithm impl 1
+algorithm implem 2
+algorithm improv 1
+algorithm in aff 1
+algorithm in classif 1
+algorithm in conjunct 1
+algorithm in figur 2
+algorithm in greater 1
+algorithm in hardwar 1
+algorithm in molecl 1
+algorithm in order 1
+algorithm in pract 1
+algorithm in pseudocod 1
+algorithm in quick 1
+algorithm in searh 1
+algorithm in sect 4
+algorithm in step 1
+algorithm in term 2
+algorithm inclus 2
+algorithm inclus rn 1
+algorithm ind 1
+algorithm inform 1
+algorithm inspir 1
+algorithm inspir es 1
+algorithm instead 1
+algorithm instead seek 1
+algorithm int scal 1
+algorithm involut 3
+algorithm ir 1
+algorithm ir egl 1
+algorithm is abl 2
+algorithm is actu 1
+algorithm is allow 1
+algorithm is appl 1
+algorithm is approxim 1
+algorithm is asymptot 1
+algorithm is avail 1
+algorithm is ba 3
+algorithm is bound 1
+algorithm is brief 1
+algorithm is comp 1
+algorithm is compar 1
+algorithm is consider 1
+algorithm is construc 1
+algorithm is cruc 1
+algorithm is defin 1
+algorithm is describ 2
+algorithm is design 1
+algorithm is determin 1
+algorithm is difficult 2
+algorithm is domin 1
+algorithm is du 1
+algorithm is es 1
+algorithm is espec 2
+algorithm is execut 1
+algorithm is expon 1
+algorithm is fair 1
+algorithm is faster 1
+algorithm is find 1
+algorithm is forml 1
+algorithm is found 1
+algorithm is gener 1
+algorithm is giv 1
+algorithm is indeed 1
+algorithm is introduc 1
+algorithm is known 1
+algorithm is lin 2
+algorithm is o.je 1
+algorithm is obv 1
+algorithm is plot 1
+algorithm is po 1
+algorithm is pr 3
+algorithm is prop 1
+algorithm is random 1
+algorithm is recur 1
+algorithm is rel 1
+algorithm is run 1
+algorithm is shown 3
+algorithm is signif 1
+algorithm is simultan 1
+algorithm is sound 1
+algorithm is straightfor 1
+algorithm is subst 1
+algorithm is sum 1
+algorithm is testif 1
+algorithm is theor 1
+algorithm is therefor 2
+algorithm is writ 1
+algorithm it eratif 1
+algorithm iter 1
+algorithm iter determin 1
+algorithm jt 1
+algorithm just describ 1
+algorithm kind 1
+algorithm kind rel 1
+algorithm kind rl 1
+algorithm known 1
+algorithm langu 1
+algorithm langu indep 1
+algorithm lansp 1
+algorithm lansp prov 1
+algorithm learn 1
+algorithm level 2
+algorithm loc 1
+algorithm look 1
+algorithm maintain 1
+algorithm mak 5
+algorithm mak ne 1
+algorithm mak us 2
+algorithm map 1
+algorithm mark 1
+algorithm may form 1
+algorithm may offer 1
+algorithm may requir 1
+algorithm may select 1
+algorithm may yield 1
+algorithm ment 1
+algorithm method 1
+algorithm methodolog 1
+algorithm might profit 1
+algorithm might requir 1
+algorithm model 1
+algorithm model empl 1
+algorithm modif 1
+algorithm mor appropr 1
+algorithm mor compl 1
+algorithm mor effect 1
+algorithm mov 1
+algorithm must attempt 1
+algorithm must build 1
+algorithm must expan 1
+algorithm must inclus 1
+algorithm must isol 1
+algorithm must perform 1
+algorithm must plan 1
+algorithm must po 1
+algorithm must prov 1
+algorithm must seek 1
+algorithm must therefor 2
+algorithm must trad 1
+algorithm must util 1
+algorithm new algorithm 1
+algorithm nous 1
+algorithm nous permettr 1
+algorithm object 1
+algorithm object csg 1
+algorithm obtain 3
+algorithm obtain solut 1
+algorithm obv 1
+algorithm obv dep 1
+algorithm of arc 1
+algorithm of awerbuch 1
+algorithm of construc 1
+algorithm of dav 1
+algorithm of dolev 1
+algorithm of figur 1
+algorithm of fredrickson 1
+algorithm of goldberg 1
+algorithm of ii.d 1
+algorithm of laidlaw 1
+algorithm of lem 1
+algorithm of low 1
+algorithm of sect 2
+algorithm of theorem 2
+algorithm oft assum 1
+algorithm oft result 1
+algorithm on cfg 1
+algorithm on crcw 1
+algorithm on crew 1
+algorithm on cur 1
+algorithm on enh 1
+algorithm on hypercub 2
+algorithm on maspar 1
+algorithm on me 1
+algorithm on mesh 1
+algorithm on random 1
+algorithm on spf 1
+algorithm onl construc 1
+algorithm onl solut 1
+algorithm ont proc 1
+algorithm oper 1
+algorithm or identif 1
+algorithm or interfac 1
+algorithm or lancz 1
+algorithm orient 1
+algorithm other research 1
+algorithm outlin 1
+algorithm outperform 1
+algorithm outperform numer 1
+algorithm output 2
+algorithm output span 1
+algorithm overhead 1
+algorithm overview 1
+algorithm pa 1
+algorithm par 2
+algorithm par de 1
+algorithm par el 2
+algorithm parallel 1
+algorithm perform 8
+algorithm perform loc 1
+algorithm perform nic 1
+algorithm perform slight 1
+algorithm perform subst 1
+algorithm ph 1
+algorithm po 2
+algorithm po ed 1
+algorithm po edent 1
+algorithm porter 1
+algorithm porter sur 1
+algorithm posit 1
+algorithm posit cor 1
+algorithm postpon 1
+algorithm postpon test 1
+algorithm pour 2
+algorithm pour le 1
+algorithm pour lequel 1
+algorithm pour mieux 1
+algorithm pr 5
+algorithm pratiqu 1
+algorithm prev 1
+algorithm prev describ 1
+algorithm prob 1
+algorithm prob univer 1
+algorithm proc 1
+algorithm proceed 1
+algorithm produc 4
+algorithm produc good 1
+algorithm produc partit 1
+algorithm prop 4
+algorithm prop earl 1
+algorithm prov 5
+algorithm prov en 1
+algorithm prov good 1
+algorithm prov tot 1
+algorithm ps 1
+algorithm ps dep 1
+algorithm ps gener 1
+algorithm ps tak 1
+algorithm purp 1
+algorithm qu 2
+algorithm qu est 1
+algorithm qu nous 1
+algorithm qu se 1
+algorithm re comput 1
+algorithm reach 2
+algorithm reach cal 1
+algorithm recur 1
+algorithm reduc 3
+algorithm regard 1
+algorithm rel 2
+algorithm rel heav 2
+algorithm remov 1
+algorithm remov no 1
+algorithm repeat 1
+algorithm repr 1
+algorithm requir 6
+algorithm requir consider 1
+algorithm requir frequ 1
+algorithm requir new 1
+algorithm requir tim 1
+algorithm respon 1
+algorithm result 2
+algorithm retain 1
+algorithm retain center 1
+algorithm return 2
+algorithm return se 1
+algorithm rev 1
+algorithm rt1 1
+algorithm run 11
+algorithm run tim 1
+algorithm s equentiel 1
+algorithm satisf 1
+algorithm schedl 1
+algorithm schem 2
+algorithm sd 1
+algorithm seek 1
+algorithm select 3
+algorithm select inclus 1
+algorithm select test 1
+algorithm selectintertest 1
+algorithm selecttest 1
+algorithm selecttest2 1
+algorithm sensit 1
+algorithm should improv 1
+algorithm should work 1
+algorithm show 3
+algorithm show good 1
+algorithm simil 1
+algorithm simplif 1
+algorithm solut 1
+algorithm solut random 1
+algorithm sont 1
+algorithm sont orient 1
+algorithm sont simpl 1
+algorithm specif 1
+algorithm specif design 1
+algorithm specif tailor 1
+algorithm spen 2
+algorithm spen extr 1
+algorithm stabiliz 1
+algorithm start 5
+algorithm stil produc 1
+algorithm stop 1
+algorithm strong 1
+algorithm strong resembl 1
+algorithm subject 1
+algorithm suffer 1
+algorithm suggest 1
+algorithm summariz 1
+algorithm support 1
+algorithm support cont 1
+algorithm sur 1
+algorithm sur la 1
+algorithm synchron 1
+algorithm synchron walk 1
+algorithm tak 6
+algorithm tak dep 1
+algorithm tak lin 2
+algorithm techniqu 1
+algorithm ten 1
+algorithm termin 1
+algorithm test 1
+algorithm th ba 1
+algorithm th procedur 1
+algorithm th requir 1
+algorithm th union 1
+algorithm that accomod 1
+algorithm that achief 2
+algorithm that ad 1
+algorithm that allow 2
+algorithm that altern 1
+algorithm that ap 1
+algorithm that attempt 1
+algorithm that av 1
+algorithm that comb 1
+algorithm that comput 2
+algorithm that construc 1
+algorithm that decomp 1
+algorithm that dep 1
+algorithm that detect 1
+algorithm that determin 1
+algorithm that enh 1
+algorithm that ensur 1
+algorithm that exact 1
+algorithm that exploit 1
+algorithm that ext 1
+algorithm that form 1
+algorithm that gener 1
+algorithm that identif 1
+algorithm that impl 1
+algorithm that inser 1
+algorithm that involut 1
+algorithm that me 1
+algorithm that perform 1
+algorithm that proc 2
+algorithm that reduc 2
+algorithm that retain 1
+algorithm that run 2
+algorithm that select 1
+algorithm that simplif 1
+algorithm that systemat 1
+algorithm that ten 1
+algorithm that us 3
+algorithm that work 1
+algorithm then ext 1
+algorithm then proceed 1
+algorithm therefor 1
+algorithm to acc 1
+algorithm to achief 1
+algorithm to adapt 1
+algorithm to ap 1
+algorithm to as 1
+algorithm to assur 1
+algorithm to calcl 2
+algorithm to color 1
+algorithm to comput 4
+algorithm to consider 1
+algorithm to construc 4
+algorithm to converg 1
+algorithm to cr 1
+algorithm to dec 1
+algorithm to der 1
+algorithm to determin 2
+algorithm to distribut 1
+algorithm to escap 1
+algorithm to examin 1
+algorithm to exploit 1
+algorithm to find 4
+algorithm to gener 3
+algorithm to handl 2
+algorithm to impl 1
+algorithm to increm 1
+algorithm to join 1
+algorithm to maxim 2
+algorithm to perform 1
+algorithm to produc 1
+algorithm to prun 1
+algorithm to reconstruc 1
+algorithm to recover 1
+algorithm to sa 1
+algorithm to shar 1
+algorithm to simplif 1
+algorithm to solut 3
+algorithm to sort 1
+algorithm to tak 1
+algorithm to us 1
+algorithm to visit 1
+algorithm to work 1
+algorithm tr 1
+algorithm tr construc 1
+algorithm track 1
+algorithm transform 2
+algorithm traver 1
+algorithm upd 1
+algorithm us 10
+algorithm us bin 1
+algorithm us dat 1
+algorithm us hem 1
+algorithm us k.k 1
+algorithm us proc 1
+algorithm us procedur 1
+algorithm using 7
+algorithm using loc 1
+algorithm using procedur 1
+algorithm wa appl 1
+algorithm wa compar 1
+algorithm wa develop 1
+algorithm wa du 1
+algorithm wa examin 1
+algorithm wa exclus 1
+algorithm wa found 1
+algorithm wa implem 2
+algorithm wa improv 2
+algorithm wa measur 1
+algorithm wa prim 1
+algorithm wa prop 1
+algorithm wa rec 1
+algorithm wa test 1
+algorithm wa writ 1
+algorithm we describ 1
+algorithm we develop 2
+algorithm we giv 1
+algorithm we pr 1
+algorithm we us 3
+algorithm wer appl 2
+algorithm wer consider 1
+algorithm wer on 1
+algorithm wer run 1
+algorithm wer test 1
+algorithm wh 1
+algorithm wh worst 1
+algorithm when using 1
+algorithm which allow 1
+algorithm which exact 1
+algorithm which nod 1
+algorithm which perform 1
+algorithm which produc 1
+algorithm which remov 1
+algorithm which tak 1
+algorithm which ten 1
+algorithm which treat 1
+algorithm which us 1
+algorithm which want 1
+algorithm whil tak 1
+algorithm wil mak 1
+algorithm with appl 1
+algorithm with guar 1
+algorithm with optim 1
+algorithm with parallel 1
+algorithm with perform 1
+algorithm with pr 1
+algorithm with random 1
+algorithm with respect 1
+algorithm with shar 1
+algorithm with st 1
+algorithm with sub 1
+algorithm with symbol 1
+algorithm with typ 1
+algorithm with zer 1
+algorithm without requir 1
+algorithm work 7
+algorithm would requir 1
+algorithm writ 1
+algorithm yield 2
+algorithm yield optim 1
+algorithm.2 1
+algorithmand 1
+algorithmand compar 1
+algorithmiqu 3
+algorithmiqu ce 1
+algorithmiqu ce obj 1
+algorithmiqu dan 1
+algorithmiqu dan le 1
+algorithmiqu de 2
+algorithmiqu de diff 1
+algorithmiqu de la 1
+algorithmiqu du 1
+algorithmiqu du processus 1
+algorithmiqu eoecac 1
+algorithmiqu et de 1
+algorithmiqu implantabl 1
+algorithmiqu pr 1
+algorithmiqu pr ec 1
+algorithmiqu r sult 1
+algorithmus 1
+algoritm 3
+algoritm in computer 1
+algotithm 1
+algotithm langu 1
+algotithm langu schem 1
+aliasdefinit 1
+aliasdefinit instancedefinit 1
+aliasdefinit instancedefinit fragmentdefinit 1
+align 10
+align cub 1
+align de 1
+align de don 1
+align de lign 1
+align de tableaux 1
+align du 1
+align du tableau 1
+align e sur 1
+align ee 1
+align ee sur 1
+align es 1
+align es sur 1
+align et diffus 1
+align iter 1
+align iter distribut 1
+align nest 1
+align nest pa 1
+align schedl 1
+align segm 1
+align segm bound 1
+align sur 1
+align sur le 1
+align with respect 1
+aligner 1
+aligner le 1
+alignm 6
+alignm between featur 1
+alignm between object 1
+alignm in tim 1
+alignm method 1
+alignm of variabl 1
+alignm search 1
+alignm search tool 1
+alik 1
+alim 1
+aliser 1
+alivealivedeaddead 1
+alivealivedeaddead dead 1
+alivealivedeaddead dead deaddead 1
+alivedeaddead 1
+alivedeaddead dead 1
+alivedeaddead dead deaddead 1
+alk 1
+alkk90 1
+allan 2
+allan gottlieb 1
+allan newel 1
+allan newel got 1
+allcach 2
+allcach distribut 1
+allcach distribut memor 1
+allemagn 1
+allender 1
+allender and straus 1
+aller 5
+aller au 2
+aller au del 2
+allev 14
+allev appl 1
+allev th bottleneck 1
+allev th commun 1
+allev th complec 1
+allev th impact 1
+allev th inexact 1
+allev th network 1
+allev th problem 4
+allgrad 1
+allkn 1
+alloc 31
+alloc 4kby 1
+alloc a fr 2
+alloc a lim 1
+alloc a minim 1
+alloc a proc 1
+alloc a register 1
+alloc a slot 1
+alloc al iter 1
+alloc alloc 1
+alloc alloc dun 1
+alloc an inst 1
+alloc an item 1
+alloc and discrim 1
+alloc and init 2
+alloc and initializ 1
+alloc and learn 1
+alloc and loc 1
+alloc and schedl 1
+alloc and transm 1
+alloc ar 1
+alloc avant 1
+alloc avant le 1
+alloc bandwidth 1
+alloc bandwidth earl 1
+alloc cl 1
+alloc cod 1
+alloc cod na 1
+alloc construc 1
+alloc cr 1
+alloc cr ee 1
+alloc d eplac 1
+alloc dat 1
+alloc dat structur 1
+alloc de 1
+alloc de la 1
+alloc dun 1
+alloc dun point 1
+alloc dupl 1
+alloc dupl de 1
+alloc est 1
+alloc est partag 1
+alloc et lib 1
+alloc for cart 1
+alloc for control 1
+alloc fr 1
+alloc fr nod 1
+alloc funct 1
+alloc ge 1
+alloc ge var 1
+alloc in disk 1
+alloc in distribut 1
+alloc in dlb 1
+alloc indep 1
+alloc indep subtask 1
+alloc inst 1
+alloc instruc 1
+alloc is ext 1
+alloc list 1
+alloc loop 1
+alloc method 2
+alloc method port 1
+alloc monolithiqu 1
+alloc monolithiqu de 1
+alloc mor memor 1
+alloc ne 1
+alloc ne peut 1
+alloc new leaf 1
+alloc new nod 1
+alloc new root 1
+alloc object 1
+alloc object ind 1
+alloc of pattern 1
+alloc of shar 1
+alloc of task 1
+alloc of wam 1
+alloc peut 1
+alloc peut alor 1
+alloc ph 1
+alloc primitiv 1
+alloc proc 1
+alloc procedur 1
+alloc random 1
+alloc rat 1
+alloc rat ae 1
+alloc rat earl 1
+alloc receiv 1
+alloc return 1
+alloc schem 1
+alloc stat 1
+alloc strateg 1
+alloc synchron 1
+alloc synchron variabl 1
+alloc system 1
+alloc tail 1
+alloc tail env 1
+alloc tak 1
+alloc tak plac 1
+alloc task 1
+alloc techniqu 1
+alloc th desir 1
+alloc th exempl 1
+alloc th high 1
+alloc th root 1
+alloc th targ 1
+alloc to connect 1
+alloc to differ 1
+alloc to proc 2
+alloc to request 1
+alloc to se 1
+alloc to sub 1
+alloc us 1
+alloc variabl 1
+alloc which tak 1
+alloc workload 1
+allon 2
+allon d emontrer 1
+allon dabord 1
+allon dabord partitionner 1
+allon dan 1
+allon dan ce 1
+allon distinguer 1
+allon distinguer ce 1
+allon donc 1
+allon donc voir 1
+allon illustrer 1
+allon illustrer ce 1
+allon le 1
+allon le montrer 1
+allon maint 2
+allon maint cherch 1
+allon maint construir 1
+allon maint illustrer 1
+allon montrer 1
+allon montrer le 1
+allon montrer qu 1
+allon montrer quel 1
+allon nous 1
+allon nous int 1
+allon nous restreindr 1
+allon pr 1
+allon pr eciser 1
+allon utiliser 1
+allon utiliser quelqu 1
+allon voir 1
+allon voir sur 1
+allong 1
+allong la 1
+allong la tail 1
+allong maxim 1
+allong maxim dan 1
+allong sont 1
+allong sont don 1
+allou 2
+allou e au 1
+allou ee 2
+allou ee au 2
+allou ee aux 1
+allou ee dan 1
+allou ee de 1
+allou ee isol 1
+allou ee ne 1
+allou ee ou 1
+allou ee par 1
+allou un environ 1
+allouer 1
+allouer et lib 1
+allow 98
+allow a computer 1
+allow a conflu 1
+allow a const 1
+allow a del 1
+allow a direct 1
+allow a librar 1
+allow a me 2
+allow a modl 1
+allow a multicast 1
+allow a multidest 1
+allow a natur 1
+allow a nod 1
+allow a number 1
+allow a proc 2
+allow a prov 1
+allow a reasoner 1
+allow a se 1
+allow a st 1
+allow a uniform 1
+allow a user 1
+allow a var 1
+allow a wider 1
+allow abstract 2
+allow abstract constraint 1
+allow acc 1
+allow ad 1
+allow adapt 1
+allow addit 1
+allow addit init 1
+allow adopt 1
+allow al cach 1
+allow al iter 1
+allow al st 1
+allow an answer 1
+allow an appropr 1
+allow an idl 1
+allow another thread 1
+allow any loop 1
+allow appl 1
+allow appl programmer 1
+allow arbitr 5
+allow arbitr dat 1
+allow arbitr interconnect 1
+allow arbitr number 1
+allow arbitr reduc 1
+allow arbitr term 1
+allow argum 1
+allow as rad 1
+allow asynchron 1
+allow asynchron parallel 1
+allow bad 1
+allow bad programmer 1
+allow bil 1
+allow by cluster 1
+allow catalog 1
+allow channel 2
+allow chunk 1
+allow chunk siz 1
+allow clarif 1
+allow client 1
+allow cluster 3
+allow cluster siz 3
+allow compiler 1
+allow comput 1
+allow con 1
+allow conclus 1
+allow concur 3
+allow concur acc 1
+allow concur prim 1
+allow conflict 1
+allow conflict constraint 1
+allow const 1
+allow constraint 1
+allow dat 3
+allow dat repl 1
+allow dep 2
+allow dep further 1
+allow design 1
+allow direct 1
+allow direct inspect 1
+allow dynam 2
+allow dynam bind 1
+allow dynam custom 1
+allow ea 2
+allow ea exploit 2
+allow each ch 1
+allow each parent 1
+allow each proc 1
+allow each test 1
+allow educ 1
+allow eff 3
+allow eff commun 1
+allow eff execut 1
+allow eff support 1
+allow ent 1
+allow exact 1
+allow exact calcl 1
+allow exerc 1
+allow fair 1
+allow fair conc 1
+allow fast 1
+allow fast retrief 1
+allow first cl 1
+allow flit 1
+allow for anim 1
+allow for bal 1
+allow for check 1
+allow for co 1
+allow for continu 1
+allow for deal 1
+allow for doubl 1
+allow for execut 1
+allow for explan 1
+allow for forg 1
+allow for futur 1
+allow for hid 1
+allow for implem 1
+allow for interact 1
+allow for memor 1
+allow for multidirect 1
+allow for multipl 1
+allow for parallel 1
+allow for proc 1
+allow for rapid 1
+allow for robust 1
+allow for simpl 1
+allow for slop 1
+allow for specif 1
+allow for synchron 1
+allow for tempor 1
+allow for thousand 1
+allow for transl 1
+allow for understand 1
+allow fram 1
+allow fram upd 1
+allow gather 1
+allow gener 1
+allow gener cod 1
+allow great 1
+allow great reduc 1
+allow greater 1
+allow greater flec 1
+allow hem 1
+allow in claus 1
+allow in se 1
+allow incorrect 1
+allow incorrect execut 1
+allow individu 1
+allow inform 1
+allow instruc 1
+allow instruc separ 1
+allow interconnect 1
+allow larg execut 1
+allow larger 2
+allow larger cluster 2
+allow lim 1
+allow lim us 1
+allow long liv 1
+allow man head 1
+allow man level 1
+allow match 1
+allow me 2
+allow me going 2
+allow memor 1
+allow memor acc 1
+allow method 1
+allow model 1
+allow monot 1
+allow monot subtyp 1
+allow mor complec 1
+allow mor eff 1
+allow mor flec 1
+allow mor gener 1
+allow mor number 1
+allow mor prec 1
+allow mov 1
+allow mov dat 1
+allow multicast 1
+allow multipl 4
+allow multipl acc 1
+allow multipl loc 1
+allow multipl reader 1
+allow multipl supercl 1
+allow multiproc 1
+allow new constraint 1
+allow new mach 1
+allow new realm 1
+allow non 1
+allow non hom 1
+allow object 1
+allow on eff 1
+allow on lin 1
+allow on univer 1
+allow onl addit 1
+allow onl gradu 1
+allow onl loc 1
+allow onl modl 1
+allow onl pair 1
+allow onl stack 1
+allow oper 1
+allow oper arbitr 1
+allow or parallel 1
+allow our pr 1
+allow output 1
+allow output port 1
+allow overlap 1
+allow overlap interv 1
+allow p simultan 1
+allow part 1
+allow patron 1
+allow pipelin 1
+allow point 1
+allow point intern 1
+allow proc 2
+allow procedur 1
+allow programmer 1
+allow proof 1
+allow realm 1
+allow realm parameter 1
+allow reduc 1
+allow reintegr 1
+allow rel 1
+allow relac 1
+allow renam 2
+allow result 1
+allow reus 1
+allow sculpt 1
+allow sect 1
+allow select 2
+allow select upd 1
+allow shar 1
+allow shar memor 1
+allow short liv 1
+allow sl1 1
+allow sl1 modl 1
+allow slav 1
+allow solut 1
+allow som ba 1
+allow som ver 1
+allow specif 1
+allow st 1
+allow stack 1
+allow stack el 1
+allow stal 1
+allow stal dat 1
+allow stud 1
+allow system 2
+allow system design 2
+allow system designer 2
+allow th addit 1
+allow th agent 1
+allow th algorithm 1
+allow th assm 1
+allow th bam 1
+allow th bod 1
+allow th bound 1
+allow th check 1
+allow th cod 1
+allow th computer 1
+allow th control 1
+allow th correspon 1
+allow th dat 2
+allow th deliv 1
+allow th deriv 1
+allow th descript 1
+allow th design 1
+allow th designer 1
+allow th developer 1
+allow th earliest 1
+allow th educ 1
+allow th encapsl 1
+allow th estim 1
+allow th fram 1
+allow th garb 1
+allow th inherit 1
+allow th init 2
+allow th input 1
+allow th instruc 1
+allow th integr 1
+allow th learner 2
+allow th libr 1
+allow th lisp 1
+allow th log 1
+allow th loop 1
+allow th maxim 1
+allow th me 2
+allow th min 1
+allow th misbehav 1
+allow th modl 1
+allow th monit 1
+allow th nod 1
+allow th pandemon 1
+allow th partit 1
+allow th po 1
+allow th programmer 1
+allow th reader 1
+allow th reg 1
+allow th relationship 1
+allow th se 1
+allow th sender 1
+allow th server 1
+allow th setup 1
+allow th simpl 1
+allow th specif 1
+allow th subject 2
+allow th substr 1
+allow th sv 1
+allow th system 4
+allow th unshuffl 1
+allow th us 3
+allow th user 6
+allow that reg 1
+allow thicker 2
+allow thicker channel 2
+allow through inherit 1
+allow tim 1
+allow to answer 1
+allow to assoc 1
+allow to av 1
+allow to comput 2
+allow to cr.2 1
+allow to del 1
+allow to enter 1
+allow to exceed 1
+allow to execut 1
+allow to expr 1
+allow to integr 2
+allow to introduc 1
+allow to issu 1
+allow to mak 2
+allow to manu 1
+allow to offer 1
+allow to oper 1
+allow to overlap 1
+allow to pebbl 1
+allow to perform 1
+allow to repr 1
+allow to rot 1
+allow to routin 1
+allow to specif 1
+allow to st 1
+allow to sup 1
+allow to tak 1
+allow to transm 1
+allow to visu 1
+allow tool 1
+allow transl 1
+allow transm 1
+allow tut 1
+allow tw del 1
+allow tw ident 1
+allow tw solut 1
+allow typ 1
+allow typ saf 1
+allow uninit 1
+allow uninit cel 1
+allow us 1
+allow us ec 1
+allow user 2
+allow user navig 1
+allow val 1
+allow variabl 2
+allow ver eleg 1
+allow w ss 2
+allow wider 1
+allozym 1
+allozym mut 1
+allright 1
+allright to perform 1
+allur 1
+allus 1
+allyn 1
+allyn and bacon 1
+alm 2
+almad 2
+almad research 1
+almad research center 1
+almon 1
+almon and kong 1
+almon tr 1
+alonz 1
+alonz church 1
+alor 6
+alor 2o 1
+alor 3j 1
+alor a cherch 1
+alor a de 1
+alor a en 1
+alor a est 1
+alor a laltern 1
+alor a lemplac 1
+alor a propager 1
+alor a un 1
+alor ai 1
+alor ai ement 1
+alor aik 1
+alor allou 1
+alor allou ee 1
+alor au 1
+alor au som 1
+alor aut 1
+alor aut de 1
+alor automatiqu 1
+alor avec 1
+alor avec la 1
+alor bien 1
+alor bien atteint 1
+alor calcl 1
+alor calcl ee 1
+alor ce 1
+alor cel 1
+alor cel qu 1
+alor charg 1
+alor ci 1
+alor ci mod 1
+alor com 2
+alor com nous 1
+alor com suit 1
+alor com un 1
+alor compil 1
+alor compil ee 1
+alor compl 1
+alor compl es 1
+alor conduir 1
+alor connu 1
+alor connu statiqu 1
+alor constitu 1
+alor d ecider 1
+alor d efin 1
+alor d27 1
+alor dan 1
+alor dan ce 1
+alor dan le 1
+alor dappliquer 1
+alor dappliquer loc 1
+alor dassoc 1
+alor daut 1
+alor daut meilleur 1
+alor dautr 1
+alor dautr op 1
+alor de 4
+alor de 2r 1
+alor de conclur 1
+alor de deux 1
+alor de difficult 1
+alor de distinguer 1
+alor de faus 1
+alor de la 1
+alor de mach 1
+alor de ne 1
+alor de ocr 1
+alor de par 1
+alor de produit 1
+alor de profondeur 1
+alor de regrouper 1
+alor de remplacer 1
+alor de savoir 1
+alor de scinder 1
+alor de se 1
+alor de tirer 1
+alor de typ 1
+alor diff 1
+alor diff erent 1
+alor din 1
+alor din egalit 1
+alor dispar 1
+alor dispar itr 1
+alor distribuer 1
+alor distribuer le 1
+alor diviser 1
+alor diviser lin 1
+alor dj0 1
+alor don 2
+alor don ee 2
+alor du 1
+alor du mod 1
+alor effectuer 1
+alor effectuer quun 1
+alor egal 1
+alor egal au 1
+alor el 1
+alor el ementair 1
+alor el seront 1
+alor empil 1
+alor empil ee 1
+alor en 2
+alor en fonct 1
+alor en la 1
+alor en pr 1
+alor entr 1
+alor entr ce 1
+alor equiv 1
+alor etiqu 1
+alor etr 2
+alor etr at 1
+alor etr compl 1
+alor etr efficac 1
+alor etr en 1
+alor etr ex 1
+alor etr propag 1
+alor etr remplac 1
+alor etr sauv 1
+alor etr scind 1
+alor etr util 1
+alor ex 1
+alor ex ecut 1
+alor extrair 1
+alor extrair i2 1
+alor fair 1
+alor fair en 1
+alor fixer 1
+alor fixer la 1
+alor fondam 1
+alor fondam diff 1
+alor g en 1
+alor ij 1
+alor ij lcj 1
+alor ik 1
+alor ik lck 1
+alor il 2
+alor il en 1
+alor il est 1
+alor il exister 1
+alor il nec 2
+alor im 1
+alor im ediat 1
+alor init 1
+alor inutil 2
+alor inutil accru 1
+alor inutil enregister 1
+alor inv 1
+alor koan 1
+alor l etat 1
+alor l1 1
+alor la 1
+alor la biject 1
+alor la valeur 1
+alor lav 1
+alor lav de 1
+alor le 1
+alor le conflit 1
+alor le deux 1
+alor le faux 1
+alor le nombr 1
+alor le nouveau 1
+alor le program 1
+alor le propr 1
+alor le suiv 1
+alor le syst 1
+alor le temp 1
+alor leur 1
+alor leur ecritur 1
+alor li 1
+alor li es 1
+alor lib 1
+alor lib er 1
+alor lind 1
+alor lind va 1
+alor lj 1
+alor lj ij 1
+alor mieux 1
+alor mieux adapt 1
+alor migrer 1
+alor migrer au 1
+alor min 1
+alor minor 1
+alor minor ee 1
+alor moin 1
+alor moin de 1
+alor montr 1
+alor n ecessair 1
+alor p est 1
+alor pa 1
+alor pa enregister 1
+alor parcourir 1
+alor parcourir tout 1
+alor partager 1
+alor partager un 1
+alor partiel 1
+alor partiel fus 1
+alor plus efficac 1
+alor plus quest 1
+alor po de 1
+alor po dutiliser 1
+alor pour 2
+alor pour le 1
+alor pour plusieur 1
+alor qu 5
+alor qu beaucoup 1
+alor qu ce 2
+alor qu dan 1
+alor qu de 1
+alor qu deux 1
+alor qu la 2
+alor qu le 3
+alor qu lenregister 1
+alor qu nous 1
+alor qu retr 1
+alor qu sep 1
+alor qu tout 1
+alor qu var 1
+alor quel 1
+alor quel nest 1
+alor quen 1
+alor quen ca 1
+alor quil 2
+alor quil na 1
+alor quil ny 1
+alor quil peut 1
+alor quil se 1
+alor quil serait 1
+alor qun 1
+alor qun op 1
+alor quun 1
+alor quun solut 1
+alor rang 1
+alor repr 2
+alor repr esent 2
+alor sauv 1
+alor sauv ee 1
+alor se 2
+alor se fair 1
+alor se pr 1
+alor setarg 1
+alor similair 1
+alor simpl 2
+alor simpl du 1
+alor simpl un 1
+alor soit 1
+alor sur 2
+alor sur la 1
+alor sur le 1
+alor synth 1
+alor synth es 1
+alor toujour 1
+alor tout 1
+alor tout le 1
+alor tr 1
+alor tr es 1
+alor uaik 1
+alor uaik ub 1
+alor uj 1
+alor un 2
+alor un aspect 1
+alor un autr 1
+alor un ba 1
+alor un comport 1
+alor un disjonct 1
+alor un domain 1
+alor un ex 1
+alor un fonct 1
+alor un migr 1
+alor un pav 1
+alor un regroup 1
+alor un repr 1
+alor un solut 1
+alor un synth 1
+alor util 2
+alor util ee 1
+alor util es 1
+alor utiliser 1
+alor utiliser ce 1
+alor victim 1
+alor victim deff 1
+alor w jn 1
+alor x d117 1
+alor xc 1
+alor xc xn 1
+alor xz 1
+alor xz xe 1
+alor z er 1
+aloud 1
+aloud observ 1
+aloud protocol 1
+aloud protocol an 1
+aloud techniqu 1
+alourd 1
+alourd la 1
+alourd la gest 1
+alourdir 1
+alourdir la 1
+alourdir la pr 1
+alp 2
+alp newsletter 1
+alp90 1
+alpern 1
+alph 4
+alph a mrn 1
+alph amrn 1
+alph proc 1
+alphab 11
+alphab dat 1
+alphab in hilog 1
+alphab is greater 1
+alphab le 1
+alphab month 1
+alphab of a1 1
+alphab of accept 1
+alphab order 1
+alphab r fr0 1
+alphab using 1
+alphab using approxim 1
+alphab without cost 1
+alphanumer 1
+alphanumer keyboard 1
+alphc 1
+alsberg 1
+alsberg and j.d 1
+alsc 1
+alspect 1
+alsup 1
+alt 14
+alt erer 1
+alt erer le 1
+alt labor 1
+alt repr 1
+alt repr esent 1
+alt research 1
+alt research center 1
+alter 14
+alter a specif 1
+alter any langu 1
+alter any whit 1
+alter ar requir 1
+alter as environm 1
+alter by intern 1
+alter in soph 1
+alter it veloc 1
+alter or return 1
+alter th ba 1
+alter th conceptu 1
+alter th hardwar 1
+alter th sem 1
+alter th syntac 1
+alter th valu 1
+alter to execut 1
+alter to show 1
+alterman 1
+altern 62
+altern a ce 1
+altern achief 1
+altern algorithm 1
+altern and sequ 1
+altern answer 1
+altern answer offer 1
+altern answer produc 1
+altern approach 5
+altern ar consider 1
+altern axiom 1
+altern axiom character 1
+altern ba 1
+altern bigger 1
+altern black 1
+altern bottom 1
+altern can obv 1
+altern character 1
+altern cl 1
+altern classiqu 1
+altern classiqu en 1
+altern claus 1
+altern comput 1
+altern comput thread 1
+altern con 2
+altern configur 2
+altern consider 2
+altern consider con 1
+altern decl 1
+altern decl sem 1
+altern dep 1
+altern design 3
+altern dispatch 1
+altern dispatch strateg 1
+altern docum 1
+altern docum cluster 1
+altern edg 2
+altern favor 1
+altern favor imag 1
+altern favor mechan 1
+altern for acc 1
+altern for calcl 1
+altern for n4 1
+altern for shar 1
+altern implem 3
+altern implem method 1
+altern implem using 1
+altern interpr 1
+altern is ch 1
+altern is empt 1
+altern is evalu 1
+altern is using 1
+altern keyword 1
+altern lead 2
+altern list 1
+altern lp 1
+altern lp forml 1
+altern may want 1
+altern measur 1
+altern mechan 1
+altern method 4
+altern mor compact 1
+altern mult 1
+altern mult attribut 1
+altern multiproc 1
+altern multiproc ver 1
+altern norm 1
+altern of act 1
+altern of exploit 1
+altern offer 1
+altern par 1
+altern path 2
+altern pinout 2
+altern pinout technolog 2
+altern possibl 1
+altern possibl dan 1
+altern pour 1
+altern pour le 1
+altern pr 1
+altern prec 1
+altern prec funct 1
+altern prec langu 1
+altern prec map 1
+altern prec repr 1
+altern produc 2
+altern produc con 1
+altern produc straight 1
+altern program 1
+altern program rl 1
+altern proof 1
+altern qu 1
+altern qu seront 1
+altern reduc 1
+altern refut 1
+altern relationship 1
+altern repr 2
+altern request 1
+altern rl 1
+altern rl g2 1
+altern solut 3
+altern st 1
+altern stochast 1
+altern stochast optim 1
+altern strateg 2
+altern switch 1
+altern switch architectur 1
+altern system 1
+altern system ba 1
+altern tak 1
+altern task 1
+altern task shar 1
+altern techniqu 1
+altern th approach 2
+altern th comput 1
+altern that follow 1
+altern that po 1
+altern their colour 1
+altern to abstract 1
+altern to bonacc 1
+altern to ch 1
+altern to form 2
+altern to se 1
+altern to structur 1
+altern undershoot 1
+altern ver 1
+altern ver vr 1
+altern view 1
+altern viewpoint 1
+altern vou 1
+altern vou ee 1
+altern way 2
+altern which achief 1
+altern with iter 1
+altern would narrow 1
+alternativ 1
+alternativerefut 1
+alth 1
+altitud 1
+altitud separ 1
+altman 1
+altogether 2
+altogether and replac 1
+altschl 1
+altseptest 1
+alu 1
+alu and fpu 1
+alu zer 1
+alu zer bit 1
+alv 1
+alvar 1
+alverson 1
+alverson et al 1
+am 7
+am classif 1
+am grant 1
+am grant number 1
+am research 1
+am research center 1
+am subject 2
+am subject classif 2
+am89 1
+am95 1
+amarel 1
+amb 2
+amb light 1
+amb light condit 1
+amb1 1
+amb1 or amb1 1
+amb2 1
+ambartzum 1
+ambigu 8
+ambigu and fuzz 1
+ambigu and incr 1
+ambigu and non 1
+ambigu and random 1
+ambigu estim 1
+ambigu filter 1
+ambigu in confid 1
+ambigu inh 1
+ambigu match 1
+ambigu measur 1
+ambigu might ar 1
+ambigu of cl 1
+ambigu of finit 1
+ambigu situ 1
+ambigu threshold 1
+ambit 4
+ambit and effect 1
+ambit appl 1
+ambit prim 1
+ambn 1
+ambn or ambn 1
+ambriol 1
+ambuj 1
+amd 1
+amd algorithm 1
+amd algorithm rel 1
+amd by dav 1
+amd dep 1
+amd oper 1
+amd oper count 1
+amd or mmd 1
+amd var 1
+amdahl 1
+amdahl law 1
+amen 9
+amen ee 1
+amen to an 1
+amen to compr 1
+amen to further 1
+amen to good 1
+amen to parallel 2
+amen to val 1
+amender 1
+amender instruc 1
+amener 1
+amer 4
+amer g om 1
+amest 1
+amg 1
+amherst 1
+amherst ma 1
+amin 2
+amin ac 2
+amin ac bind 1
+amin ac homolog 1
+amin ac impl 1
+amin ac sequ 1
+amin ac typ 1
+amir 2
+amn 1
+amoc2 1
+amont 1
+amont du 1
+amont du partit 1
+amont et en 1
+amorc 1
+amort 5
+amort cost 1
+amort number 1
+amort over logn 1
+amort perform 1
+amort somewhat 1
+amort tim 2
+amort tim algorithm 1
+amort tim gener 1
+amount 64
+amount and construc 1
+amount and kind 1
+amount each tim 1
+amount equ 1
+amount invest 1
+amount is reinvest 1
+amount of addit 1
+amount of addr 1
+amount of atom 1
+amount of avail 1
+amount of background 1
+amount of backtrack 1
+amount of bandwidth 1
+amount of buffer 1
+amount of cent 1
+amount of channel 1
+amount of coh 1
+amount of commun 3
+amount of comput 1
+amount of constraint 1
+amount of dat 9
+amount of ded 1
+amount of design 1
+amount of destruc 1
+amount of dev 1
+amount of disk 1
+amount of docum 1
+amount of effort 3
+amount of error 1
+amount of evid 1
+amount of failover 1
+amount of fil 1
+amount of fin 1
+amount of glob 1
+amount of hand 1
+amount of hardwar 1
+amount of imag 1
+amount of inform 1
+amount of inter 1
+amount of interact 1
+amount of intern 1
+amount of learn 1
+amount of loc 1
+amount of memor 3
+amount of mon 2
+amount of network 1
+amount of no 1
+amount of norm 1
+amount of overhead 1
+amount of overlap 1
+amount of pag 1
+amount of parallel 2
+amount of payoff 1
+amount of proc 1
+amount of qualif 1
+amount of random 1
+amount of reflect 1
+amount of research 1
+amount of run 1
+amount of schedl 1
+amount of se 1
+amount of sem 1
+amount of serv 1
+amount of shar 1
+amount of softwar 1
+amount of speedup 1
+amount of st 1
+amount of structur 1
+amount of tim 12
+amount of tok 1
+amount of traff 3
+amount of train 1
+amount of work 6
+amount spent 1
+amount that becom 1
+amount to adm 1
+amount to build 1
+amount to construc 1
+amount to defin 1
+amount to del 1
+amount to giv 1
+amount to maintain 1
+amount to recur 1
+amperif 1
+amperif corpor 1
+ampl 1
+ampl d etail 1
+amplif 2
+amrn 1
+amsterdam 19
+amsterdam and stl 1
+amsterdam itl 1
+amsterdam itl prepubl 1
+amt 1
+amt dap 1
+amvp 1
+amvp is determin 1
+amvp ss 1
+amy97 1
+an 105
+an a lav 1
+an a proper 1
+an accord 1
+an act 1
+an al cur 1
+an al ver. 1
+an algorithm 2
+an algorithm ps 1
+an an 1
+an an algorithm 1
+an an altern 1
+an an ms 1
+an and algorithm 1
+an and appl 1
+an and classif 2
+an and design 1
+an and disc 2
+an and dynam 1
+an and evalu 2
+an and illustr 1
+an and instr 1
+an and mach 4
+an and mathemat 1
+an and optim 1
+an and parallel 1
+an and predict 1
+an and proc 1
+an and program 1
+an and qu 1
+an and recognit 1
+an and refin 1
+an and reorder 1
+an and report 1
+an and siml 1
+an and softwar 1
+an and solut 2
+an and spec 1
+an and specif 1
+an and synth 1
+an and transl 1
+an and typ 1
+an and understand 2
+an appl 2
+an approach 2
+an ar giv 1
+an ar st 1
+an arbor 2
+an artifact 1
+an as follow 1
+an austr 1
+an austr breast 1
+an ba 2
+an ba tool 1
+an begin 1
+an benchmark 1
+an by window 1
+an c grammar 1
+an ca 1
+an cach 1
+an cach model 1
+an can foc 1
+an can handl 1
+an can sharp 1
+an cap 1
+an capabil 1
+an centr 1
+an chemister 1
+an cl 1
+an cl algorithm 1
+an cobol 1
+an cod 1
+an compil 1
+an compl 2
+an compl program 1
+an compon 1
+an cost 2
+an cost estim 1
+an criter 1
+an d ev 1
+an dat 1
+an de 6
+an de acc 1
+an de algorithm 1
+an de don 2
+an de la 1
+an de lagc 1
+an de linstitut 1
+an de proxim 1
+an de trac 1
+an de travaux 1
+an de turbl 1
+an decept 1
+an decr 1
+an del 1
+an del bound 1
+an deriv 1
+an digram 1
+an disc 1
+an e linflu 1
+an edit 1
+an ee 2
+an ee de 1
+an es 2
+an es consacr 1
+an establ 1
+an etc 1
+an evalu 1
+an fin 1
+an fin de 1
+an for boolean 1
+an for comput 2
+an for concur 1
+an for regr 1
+an for sort 1
+an for supercomput 1
+an fram 1
+an fram ba 1
+an framework 5
+an framework work 2
+an fsalesg 1
+an giv 1
+an giv over 1
+an glob 1
+an hardwar 1
+an hardwar implem 1
+an imag 1
+an imag contain 1
+an in detail 1
+an in docum 1
+an in exper 1
+an in liter 1
+an in rol 1
+an in sec 1
+an in sect 2
+an in term 2
+an increm 1
+an increm compil 1
+an ind 3
+an inform 1
+an int account 1
+an involut 2
+an involut divid 1
+an is espec 1
+an is explor 1
+an is perform 1
+an is pr 1
+an is requir 1
+an is show 1
+an is shown 1
+an is simil 1
+an it complec 1
+an it datab 1
+an it fair 1
+an it sensit 1
+an le 2
+an le caus 1
+an le endroit 1
+an le trac 1
+an le wellunderstood 1
+an learn 1
+an lik converg 1
+an mak 1
+an method 2
+an method describ 1
+an mil 2
+an mil std 2
+an model 5
+an modl 1
+an mor prec 1
+an ms 1
+an ms by 1
+an near 1
+an not tak 1
+an obtain 1
+an of algorithm 5
+an of altern 1
+an of architectur 1
+an of background 1
+an of bucketsort 1
+an of cach 1
+an of calcl 1
+an of canon 1
+an of caus 1
+an of commun 1
+an of computer 1
+an of concur 1
+an of dat 1
+an of datalog 1
+an of den 1
+an of discr 1
+an of elast 1
+an of fault 1
+an of floyd 1
+an of fram 1
+an of funct 1
+an of genet 1
+an of geometer 1
+an of heapsort 1
+an of knowledg 1
+an of loc 1
+an of log 2
+an of mathemat 1
+an of multilevel 1
+an of multiproc 1
+an of multiresolut 1
+an of multivar 1
+an of nearest 1
+an of non 1
+an of numer 1
+an of oper 1
+an of ordin 1
+an of parallel 1
+an of ph 1
+an of physiolog 1
+an of pr 1
+an of privileg 1
+an of pur 1
+an of queu 1
+an of random 1
+an of rat 1
+an of rel 1
+an of rmsp 1
+an of sect 1
+an of shap 1
+an of sl1 1
+an of spat 2
+an of stat 1
+an of status 1
+an of system 1
+an of tempor 2
+an of tim 1
+an of traff 1
+an of usag 1
+an of valu 1
+an of var 3
+an on bal 1
+an on comp 1
+an on dat 1
+an on fault 1
+an on plain 1
+an on se 1
+an on trac 1
+an on user 1
+an ont 1
+an ont paru 1
+an pack 1
+an parallel 1
+an parallel algorithm 1
+an pattern 1
+an perform 2
+an primer 1
+an privileg 1
+an privileg distribut 1
+an proc 2
+an procedur 1
+an proceed 1
+an program 2
+an purp 1
+an quick 1
+an quil 1
+an quil sont 1
+an quun 1
+an regard 1
+an regr 1
+an regr test 1
+an rel 2
+an remain 1
+an remain low 1
+an requir 1
+an result 2
+an retest 1
+an rev 1
+an rev parallel 1
+an roger 1
+an sal 1
+an sal jan 1
+an scal 1
+an scal system 1
+an schedl 1
+an separ 1
+an show 1
+an simil 1
+an simpl 1
+an st 1
+an st imag 1
+an statiqu 1
+an statiqu de 1
+an statiqu perm 1
+an stil appl 1
+an structur 1
+an structur interview 1
+an stud 1
+an succ 2
+an succ decomposit 1
+an suggest 2
+an support 1
+an sur 1
+an system 1
+an techn 1
+an techn com 1
+an techniqu 7
+an technolog 1
+an technolog develop 1
+an th algorithm 1
+an th answer 1
+an th ar 1
+an th behavior 1
+an th benefit 1
+an th cod 1
+an th column 1
+an th commun 1
+an th complec 1
+an th comput 1
+an th cost 1
+an th cycl 1
+an th dat 2
+an th design 1
+an th execut 1
+an th expan 1
+an th fact 1
+an th fair 1
+an th featur 1
+an th imag 1
+an th impact 1
+an th impl 1
+an th inform 1
+an th input 1
+an th instruc 1
+an th memor 1
+an th non 1
+an th optim 1
+an th parser 1
+an th perform 3
+an th requir 1
+an th result 1
+an th select 1
+an th shap 1
+an th sourc 1
+an th vol 1
+an that cpu 1
+an that incr 1
+an that involut 1
+an that overcom 1
+an that us 1
+an their fair 1
+an tim 1
+an tim project 1
+an tim requir 1
+an to assum 1
+an to detect 1
+an to determin 1
+an to human 1
+an to simultan 1
+an tool 3
+an us 2
+an us simpl 1
+an us stat 1
+an user 1
+an user input 1
+an using 4
+an using dep 1
+an using specl 1
+an using wavel 1
+an ver 1
+an ver strip 1
+an verb 1
+an verb dat 1
+an wa perform 1
+an wa undertak 1
+an wer appl 1
+an when start 1
+an wil requir 1
+an with asymptot 1
+an with stat 1
+an within web 1
+an without restrain 1
+an work 1
+an would assum 1
+an x3.159 1
+an x3h5 1
+an x3h5 techn 1
+an.co.uk 1
+an.ps 1
+an85 1
+an89 1
+anact 1
+anal 3
+analiz 1
+analog 38
+analog acceler 1
+analog acceler windf 1
+analog actu 1
+analog actu speed 1
+analog avec 2
+analog avec la 1
+analog avec le 2
+analog brak 1
+analog brak re 1
+analog ca 1
+analog circuit 1
+analog counter 1
+analog counter timer 1
+analog eng 1
+analog eng tract 1
+analog exerc 1
+analog fash 1
+analog for disjunct 1
+analog framework 1
+analog grad 1
+analog grad forc 1
+analog manner 1
+analog neur 1
+analog neur net 1
+analog norm 1
+analog norm system 1
+analog problem 1
+analog pulser 1
+analog result 1
+analog rol 1
+analog rol re 1
+analog simpl 1
+analog simpl acc 1
+analog sug 1
+analog susp 1
+analog system 1
+analog techniqu 1
+analog techniqu handl 1
+analog theorem 1
+analog to appl 1
+analog to ca 1
+analog to cut 1
+analog to funct 1
+analog to hash 1
+analog to kg 1
+analog trac 1
+analog vl 1
+analog wheel 1
+analog wheel rev 1
+analog wind 1
+analog wind re 1
+analog with natur 1
+analog with proof 1
+analogon 1
+analogu 6
+analogu a cel 1
+analogu a la 1
+analogu algorithm 1
+analogu algorithm ba 1
+analogu aux 1
+analogu aux direct 1
+analogu in rel 1
+analogu of semirecur 1
+analogu quant 1
+analogu to tradit 1
+analyser 6
+analyser dautr 1
+analyser gener 1
+analyser le 1
+analyser which com 1
+analyseur 1
+analyseur de 1
+analyson 1
+analyson et comparon 1
+analyst 1
+analyst a person 1
+analyst and implementer 1
+analyst belief 1
+analyst implementer 1
+analyst implementer interact 1
+analyst interact 1
+analyst must ensur 1
+analyst oper 1
+analyst oper environm 1
+analyst requir 1
+analyst view 1
+analyst viewpoint 1
+analytiqu 1
+analytiqu de 1
+analytiqu de ce 1
+analytiqu est 1
+analytiqu est difficil 1
+analyzer 3
+analyzer al ignor 1
+analyzer by ignor 1
+analyzer can determin 1
+analyzer can keep 1
+analyzer can measur 1
+analyzer con 1
+analyzer conceptu 1
+analyzer conceptu keep 1
+analyzer enough opportun 1
+analyzer fr 1
+analyzer ha prov 1
+analyzer keep 1
+analyzer must issu 1
+analyzer read 1
+analyzer schedl2 1
+analyzer scheduler 1
+analyzer scheduler proc 1
+analyzer support 1
+analyzer to print 1
+analyzer totinf 1
+analyzer would pack 1
+analyzer would schedl 1
+anan 2
+anant 1
+anant agarw 1
+anant argarw 1
+ananth 1
+ananth gram 1
+anastassiou 1
+anatom 4
+anatom atl 1
+anatom detail 1
+anatom featur 1
+anatom knowledg 1
+anatom st 1
+anatom structur 1
+anatomiqu 1
+anatomiqu dan 1
+anatomiqu dan le 1
+anatomiqu qu 1
+anatomiqu qu nous 1
+anc 6
+anc com 1
+anc com la 1
+anc contenu 1
+anc contenu sont 1
+anc de 1
+anc de se 1
+anc direct 1
+anc direct d1 1
+anc estampil 1
+anc et nouvel 1
+anc inclu 1
+anc inclu loptim 1
+anc philosoph 1
+anc philosoph principl 1
+anc qu 1
+anc qu le 1
+anc th individu 1
+anc th valu 1
+anc valeur 1
+anc valeur de 1
+anc valu 1
+anc ver 1
+anc ver la 1
+ancest 9
+ancest in level 1
+ancest network 1
+ancest nod 1
+ancest of eulisp 1
+ancest theor 1
+ancestr 1
+ancestr ar 1
+ancestr check 1
+ancestr list 1
+ancestr st 1
+anchor 3
+anchor alloc 1
+anchor begin 1
+anchor begin build 1
+anchor commun 1
+anchor inform 1
+anchor is respon 1
+anchor mak 1
+anchor overlook 1
+anchor proc 1
+anchor receiv 1
+anchor receiv upd 1
+anchor request 1
+anchor respon 1
+anchor rootp4 1
+anchor rootp4 p3 1
+anchor to shrink 1
+anchor us 1
+ancourt 1
+ancourt avec 1
+ancourt avec qu 1
+ancourt et al 1
+ancourt et irigoin 1
+ancourt examinatr 1
+ancourt examinatr mm 1
+ancr 1
+ancr s sur 1
+and 2
+and harter 1
+and hisg 1
+and hopper 1
+and94 1
+andam 1
+andam sobr 1
+andam sobr os 1
+andbound 1
+ander 3
+anderson 5
+anderson and goud 1
+anderson and mat 1
+anderson et al 1
+andersson 1
+andez1 1
+andez1 pat 1
+andez1 pat hil 1
+andg 1
+andgrammar 1
+andgrammar deriv 1
+andor 2
+andor at sic 1
+andor kernel 1
+andor kernel langu 1
+andr 9
+andr e bol 1
+andr e seznec 1
+andr fabr 1
+andr fabr mostaf 1
+andr herzig 1
+andr model 1
+andr scedrov 1
+andr van 2
+andr van dam 2
+andreol 2
+andreol and paresch 1
+andrew 8
+andrew et al 2
+andrew kahng 1
+andrew rau 1
+andrew rau chaplin 1
+andrew szilard 1
+andrew tomkin 1
+andrew.cmu.edu 1
+andrew.cmu.edu gradu 1
+andrewt 1
+andrewt cs.cmu.edu 1
+anest 1
+anest antoniad 1
+ang 1
+ang angl 1
+ang angl tab 1
+ang80 1
+angel 3
+angel tim 1
+anger 1
+anger and c.y 1
+angewandt 2
+angewandt mathematik 2
+angl 10
+angl ar high 1
+angl ar ind 1
+angl between connect 1
+angl giv 1
+angl in degr 1
+angl is appl 1
+angl oe 1
+angl of view 1
+angl op 1
+angl rel 1
+angl spac 1
+angl tab 1
+angl th cost 1
+angl th result 1
+angl that minim 1
+angl traver 1
+angl triangl 1
+angl wer encod 1
+angluin 2
+angstrom 1
+angstrom resolut 1
+anik 1
+anik bn 1
+anik bn mr 1
+anim 8
+anim 3d 1
+anim 3d visu 1
+anim and interact 1
+anim and model 1
+anim and mult 1
+anim and perspect 1
+anim and sound 1
+anim ar describ 1
+anim film 1
+anim for computer 1
+anim gener 1
+anim gener system 1
+anim int simpl 1
+anim is execut 1
+anim may claim 1
+anim object 1
+anim or sound 1
+anim pl 1
+anim purp 1
+anim system 1
+anim system illustr 1
+anim to explain 1
+anim to visu 1
+anim trim 1
+anish 1
+anish aror 1
+anishg 1
+anishg ci.oh 1
+anishg ci.oh st.edu 1
+anit 1
+anit p ohlman 1
+anl 2
+anlauf 1
+anmbnm 1
+anneau 1
+anneau de 1
+annec 5
+annec a ain 1
+annec a describ 1
+annec b describ 1
+annec is organ 1
+annec un survol 1
+anner 1
+annihil 1
+annihil var 1
+annl 3
+annl ee 1
+annl ee du 1
+annl la 1
+annl la var 1
+annl tous 1
+annl tous le 1
+annonc 1
+annonc es 1
+annot 13
+annot about item 1
+annot about resourc 1
+annot any chang 1
+annot c refer 1
+annot chang 1
+annot chang funct 1
+annot datab 1
+annot ee 1
+annot ee avec 1
+annot for shar 1
+annot individu 1
+annot individu wh 1
+annot ingrid 1
+annot ingrid us 1
+annot instead 1
+annot loop 1
+annot retrief 1
+annot run 1
+annot run tim 1
+annot sound 1
+annot structur 1
+annot th funct 1
+annot th nod 1
+annot to field 1
+annot to sem 1
+announc 3
+announc an event 1
+announc to sign 1
+annu 32
+annu acm 11
+annu acm siam 1
+annu acm symp 1
+annu aller 1
+annu haw 1
+annu haw intern 1
+annu ie 3
+annu intern 6
+annu intern computer 1
+annu me 2
+annu pacif 1
+annu pacif northwest 1
+annu report 1
+annu review 1
+annu review inc 1
+annu southeast 1
+annu stat 1
+annu stat workshop 1
+annu symp 1
+annu workshop 3
+annu workshop jan 1
+annu z user 1
+anod 1
+anod anod 1
+anod p init 1
+anod p nod 1
+anom 5
+anom asser 1
+anom caus 1
+anom check 1
+anom concept 1
+anom detect 1
+anom detect strateg 1
+anom ec3 1
+anom in particl 1
+anom is detect 1
+anom situ 1
+anom with respect 1
+anon 1
+anonym 19
+anonym confer refer 1
+anonym ftp 9
+anonym ftp sit 1
+anonym ftpsit 1
+anonym gener 1
+anonym gener funct 1
+anonym of subject 1
+anonym refer 3
+anonym refer ra 1
+anonym reviewer 2
+anonym ver 1
+anoop 4
+anoop gupt 4
+another 1
+another privileg 1
+anov 2
+anov calcl 1
+anov calcl rev 1
+anov of interact 1
+anov rev 1
+anp 1
+anpncc 1
+anpncc 1datanpncc 1
+anpncc 1datanpncc 1datanpncc 1
+ansawar 1
+ansawar idl 1
+anshl 2
+anshl gupt 2
+anshl watson.ibm.com 1
+answer 30
+answer a prior 1
+answer a quest 1
+answer a scor 1
+answer accept 1
+answer accept filter 1
+answer affirm 1
+answer an 1
+answer an ea 1
+answer an involut 1
+answer an us 1
+answer and remark 1
+answer ar accept 1
+answer ar allow 1
+answer ar conson 1
+answer ar giv 1
+answer ar numer 1
+answer ar vowel 1
+answer ba 2
+answer but wh 1
+answer categor 1
+answer comput 1
+answer con 1
+answer confid 1
+answer conserv 1
+answer correct 1
+answer dont know 1
+answer exact 1
+answer form 1
+answer found 1
+answer giv 1
+answer handl 1
+answer handl techniqu 1
+answer input 1
+answer input form 1
+answer is allow 1
+answer is ambigu 1
+answer is cl 1
+answer is giv 1
+answer is sent 1
+answer is ye 4
+answer it giv 1
+answer it quest 1
+answer mor crit 1
+answer no error 1
+answer no scor 1
+answer non 1
+answer non error 1
+answer obtain 1
+answer offer 1
+answer opt 1
+answer ou 1
+answer part 1
+answer prev 1
+answer prev quest 1
+answer produc 1
+answer quest 3
+answer quest fr 1
+answer read 1
+answer real 1
+answer reason 1
+answer requir 1
+answer requir form 1
+answer scor 1
+answer someth equiv 1
+answer string 1
+answer substitut 3
+answer substitut fx 1
+answer th quest 5
+answer th system 1
+answer to quer 1
+answer to quest 3
+answer wa consider 1
+answer wer allow 1
+answer wer consider 1
+answer wil result 1
+answer ye 3
+answer yesn 1
+answer.html 1
+answeran 1
+answeran modl 1
+ant 12
+ant al 1
+ant and output 2
+ant be 1
+ant commutatif 1
+ant dahbur 1
+ant dep 2
+ant dual 1
+ant erieur 2
+ant erieur conclu 1
+ant erieur de 1
+ant fern 1
+ant fern andez1 1
+ant mor 1
+ant or output 1
+ant quaternion 1
+ant quaternion assoc 1
+ant redistribut 1
+ant sym 1
+ant sym triqu 1
+antagon 2
+antagon est 1
+antagon est encor 1
+antagon qu 1
+antec 3
+antec condit 1
+antec consequ 1
+antec consequ altern 1
+antec form 1
+antec is evalu 1
+antec1 1
+antec1 form 1
+antec2 1
+antec2 form 1
+anthon 1
+anthon bloesch 1
+anthropolog 1
+anthropolog theor 1
+antichain 1
+anticip 13
+anticip answer 1
+anticip answer categor 1
+anticip by user 1
+anticip e agenc 1
+anticip e du 1
+anticip e instruc 1
+anticip e le 1
+anticip e requ 1
+anticip e sappliqu 1
+anticip e sur 1
+anticip ee 1
+anticip ee de 1
+anticip ee dinstruc 1
+anticip ee echec 1
+anticip ee la 1
+anticip ee par 1
+anticip intercompon 1
+anticip intercompon spac 1
+anticip mak 1
+anticip of fast 1
+anticip of futur 1
+anticip th pipel 1
+anticip th situ 1
+anticip threat 1
+anticip threat situ 1
+anticip which act 1
+antimatr 1
+antimatr adm 1
+antimatr by contract 1
+antimatr for p4 1
+antimatr induc 1
+antimatr langu 1
+antimatr len 1
+antimatr of ser 1
+antimatr on distinct 1
+antimatr on zer 1
+antimatr prov 1
+antimatr se 1
+antimatr se system 1
+antimatr with zer 1
+antimonot 1
+antimonot subtyp 1
+antipod 2
+antipod layer 1
+antipod layer problem 1
+antipod symmeter 1
+antipod symmeter distribut 1
+antipol 4
+antipol b.p 1
+antipol c dic 1
+antipol ced 3
+antipol franc 1
+antisym 1
+antisym triqu 1
+antisym triqu assoc 1
+antisymmeter 1
+antogon 1
+antonacopoul 1
+antonacopoul and r.t 1
+antoniad 1
+antyl 1
+anu 1
+anu cap 1
+anu cap workshop 1
+anujan 1
+anujan varm 1
+anumber 1
+anumber act 1
+anupam 1
+anupam bh 1
+anurag 1
+anurag sah 1
+anwendung 1
+any 1
+anymor 2
+anyw 7
+anywh 8
+ao 2
+ao and loc 1
+ao invar 1
+ao invar geometer 1
+ao match 1
+ao register 1
+ao shap 1
+ao shap ba 1
+ao transform 1
+ao ut 1
+aoeect 1
+aoen 1
+aoen puisqu 1
+aoen puisqu lon 1
+aon 1
+aon de 1
+aon de diminuer 1
+aon de pouvoir 1
+aon de voir 1
+aoyag 2
+ap 74
+ap a contain 2
+ap a gener 1
+ap a giv 1
+ap a known 1
+ap a me 1
+ap a prior 1
+ap a prov 1
+ap a rl 1
+ap a singl 1
+ap a train 1
+ap a vect 1
+ap algebr 1
+ap algebr rewrit 1
+ap algorithm 1
+ap algorithm posit 1
+ap an arbitr 1
+ap an ident 1
+ap and bp 1
+ap and ext 1
+ap and impl 1
+ap and specif 1
+ap appl 1
+ap appl program 1
+ap approxim 1
+ap approxim solut 1
+ap aver 1
+ap b giv 1
+ap b prov 1
+ap bandwidth 1
+ap bandwidth reduc 1
+ap bin 1
+ap both method 1
+ap broad 1
+ap ca 1
+ap chernoff 1
+ap chernoff bound 1
+ap con 2
+ap constraint 1
+ap contain 1
+ap contain compl 1
+ap currexp 1
+ap el 1
+ap el po 1
+ap eriodiqu 1
+ap eriodiqu est 1
+ap eriodiqu si 1
+ap execut 1
+ap ffl 1
+ap for tcp 1
+ap funct 1
+ap funct obj1 1
+ap gmd 1
+ap gmd ii 1
+ap hom 1
+ap hom list 1
+ap il 1
+ap in conform 1
+ap in plac 1
+ap increm 1
+ap increm self 1
+ap init 1
+ap input 1
+ap is construc 1
+ap is split 1
+ap knowledg 1
+ap layout 1
+ap layout algorithm 1
+ap le 1
+ap le rest 1
+ap learn 1
+ap learn algorithm 1
+ap learn task 1
+ap lem 2
+ap method 1
+ap method method 1
+ap mod 1
+ap mod currexp 1
+ap mor intr 1
+ap must belong 1
+ap objn 1
+ap of autom 1
+ap of hyperm 1
+ap onl rel 1
+ap onl sem 1
+ap onl st 1
+ap onl tr 1
+ap oper 2
+ap oper system 1
+ap optim 1
+ap optim arboresc 1
+ap our reconstruc 1
+ap our result 1
+ap our tool 1
+ap part 1
+ap part evalu 1
+ap per extr 1
+ap prov 1
+ap qb 1
+ap qbp 1
+ap qbq 1
+ap r promot 1
+ap record 1
+ap record put 1
+ap repr 1
+ap repr dat 1
+ap return 1
+ap select 2
+ap select cal 1
+ap select eval 1
+ap select return 1
+ap shannon 1
+ap shannon decomposit 1
+ap simil 1
+ap smooth 1
+ap som optim 1
+ap sont 1
+ap sont le 1
+ap specl 1
+ap specl comput 1
+ap stud 2
+ap tabl 1
+ap th algorithm 2
+ap th chernoff 1
+ap th cluster 1
+ap th construc 1
+ap th criter 1
+ap th framework 1
+ap th hierarch 1
+ap th induc 1
+ap th latter 1
+ap th lem 1
+ap th list 1
+ap th loc 1
+ap th multipl 1
+ap th nam 1
+ap th outermost 1
+ap th pack 1
+ap th proposit 1
+ap th qu 1
+ap th refin 1
+ap th rel 1
+ap th rl 1
+ap th soft 1
+ap th spec 1
+ap th subrout 1
+ap th tr 1
+ap th transform 1
+ap then le 1
+ap thenif 1
+ap theorem 1
+ap to br 1
+ap to den 1
+ap to forml 1
+ap to gat 1
+ap to l 1
+ap to main 1
+ap to mlp 1
+ap to procedur 1
+ap to siml 1
+ap to tempor 1
+ap tr 1
+ap transl 1
+ap transl techniqu 1
+ap us 1
+ap we list 1
+ap wer produc 1
+ap whol se 1
+ap. 1
+ap1000 1
+apart 20
+apart and simplif 1
+apart claus 1
+apart claus c1 1
+apart el 1
+apart for st 1
+apart from complec 1
+apart from sequ 1
+apart from sum 1
+apart in m0 1
+apart proper 1
+apart tw oper 1
+apart ver 1
+apartm 1
+apath 1
+apath between pair 1
+apear 1
+aper 1
+aper cu 1
+aper cu de 1
+aperiod 1
+aperiod and recur 1
+apgr 1
+apinpr1ken 1
+apinpr1ken 11lhr71m14bmap1map2rotor38584.1shel93shy161torsotrollv 1
+apinpr1ken 11lhr71m14bmap1map2rotor38584.1shel93shy161torsotrollv nkat25wav 1
+apj 1
+apm 1
+apm an.co.uk 1
+apostroph 2
+apostroph graph 1
+apostroph graph repr 1
+appar 13
+appar ar 1
+appar avec 1
+appar avec un 1
+appar dan 2
+appar dan la 1
+appar dan le 1
+appar dan plusieur 1
+appar dan tn 1
+appar dan tout 1
+appar doesnt decr 1
+appar e sym 1
+appar ee 1
+appar en 1
+appar en dern 1
+appar entr 1
+appar entr deux 1
+appar es 1
+appar mor gener 1
+appar over 1
+appar over effect 1
+appar pour 1
+appar pour la 1
+appar t avec 1
+appar t dan 2
+appar t donc 1
+appar t en 1
+appar t la 1
+appar t le 1
+appar t lorsquon 1
+appar t ne 1
+appar t plut 1
+appar t qu 1
+appar t quand 1
+appar tr 2
+appar tr de 2
+appar tr en 1
+appar tr es 1
+appar tr lor 1
+appar tr un 1
+appar us 1
+appar with succ 1
+apparatus 1
+apparatus than clark 1
+apparc 3
+apparc deliver 1
+apparc deliver pm4b 1
+apparem 1
+apparem r eussir 1
+apparit 1
+appart 4
+appart a de 1
+appart a e2 1
+appart a la 2
+appart a lensembl 1
+appart a lim 1
+appart a linterv 1
+appart a mp 1
+appart a n3 1
+appart a un 1
+appart au 2
+appart au group 1
+appart au pav 1
+appart au recouvr 1
+appart aux 1
+appart aux deux 1
+appart bien 1
+appart donc 1
+appart donc au 1
+appart effectiv 1
+appart et si 1
+appart init 1
+appart init au 1
+appart maint 1
+appart maint au 1
+appart n ecessair 1
+appartenir 1
+appartenir a plusieur 1
+appear 92
+appear and gener 1
+appear and organ 1
+appear anom 1
+appear as delaun 1
+appear as ibm 1
+appear as imper 1
+appear as interest 1
+appear as jump 1
+appear as part 2
+appear at multipl 1
+appear befor c2 1
+appear between colon 1
+appear difficult 1
+appear discour 1
+appear exact 1
+appear exact tw 1
+appear exp 1
+appear extrem 1
+appear extrem saf 1
+appear four tim 1
+appear fr 1
+appear frequ 1
+appear he sign 1
+appear in appl 1
+appear in b1 1
+appear in bold 1
+appear in cliqu 1
+appear in context 1
+appear in csl 1
+appear in datab 1
+appear in ecoop98 1
+appear in figur 2
+appear in head 1
+appear in ie 7
+appear in inform 2
+appear in inner 1
+appear in intl 1
+appear in oe 1
+appear in pair 1
+appear in principl 1
+appear in produc 1
+appear in refer 1
+appear in register 1
+appear in rever 1
+appear in sc 1
+appear in sect 1
+appear in siam 2
+appear in st 1
+appear in succ 1
+appear in supercomput 1
+appear in tabl 1
+appear in tc 1
+appear in virtu 1
+appear ind 1
+appear justif 1
+appear le signif 1
+appear lik 1
+appear loc 1
+appear obv 2
+appear of evstart 1
+appear of qi 1
+appear rat 1
+appear suggest 1
+appear suit 1
+appear that renam 1
+appear to contain 1
+appear to contradict 1
+appear to exceed 1
+appear to prov 1
+appear to span 1
+appear to think 1
+appear with not 1
+appear with part 1
+appear worth 1
+appel 5
+appel a cal 1
+appel a ce 1
+appel a de 1
+appel a disj 1
+appel a la 1
+appel a lieu 1
+appel a pip 1
+appel a un 1
+appel additionnel 1
+appel au 1
+appel au pr 1
+appel au pseud 1
+appel aux 1
+appel aux modif 1
+appel aux pr 1
+appel cal 1
+appel conflit 1
+appel conflit lacc 1
+appel d efaut 1
+appel d etermin 1
+appel de 1
+appel de la 1
+appel de pr 1
+appel de program 1
+appel direct 1
+appel du 1
+appel du corp 1
+appel du pr 1
+appel e coupur 1
+appel e couram 1
+appel e est 1
+appel e fortran 1
+appel e fuseau 1
+appel e gestionnair 1
+appel e le 1
+appel e mod 1
+appel e ne 1
+appel e par 1
+appel e quast 1
+appel e sch 1
+appel e th 1
+appel e tr 1
+appel ee 3
+appel ee algorithm 1
+appel ee fonct 1
+appel ee lor 1
+appel ee pag 1
+appel ee peut 1
+appel ee pil 1
+appel ee pip 1
+appel ee simplec 1
+appel en 1
+appel en ca 1
+appel es 2
+appel es const 1
+appel es pag 1
+appel est 1
+appel est le 1
+appel et construc 1
+appel inclus 1
+appel indirect 1
+appel interm 1
+appel interm ediair 1
+appel le 1
+appel le produit 1
+appel leff 1
+appel leff ping 1
+appel migr 1
+appel migr de 1
+appel nest 1
+appel non 1
+appel non termin 1
+appel ob 1
+appel ob ei 1
+appel par 1
+appel par elism 1
+appel pol 1
+appel pol edr 1
+appel pour 1
+appel pour lequel 1
+appel pr 1
+appel pr ec 1
+appel propr 1
+appel propr etair 1
+appel r ecursif 1
+appel se 1
+appel se traduit 1
+appel si 1
+appel si lappel 1
+appel sont 1
+appel sont instanc 1
+appel suit 1
+appel t es 1
+appel termin 1
+appel terminaux 1
+appel terminaux non 1
+appel tr 1
+appel tr nag 1
+appel treil 1
+appel treil ent 1
+appel z modl 1
+appelb 1
+appeler 1
+appeler pil 1
+appeler pil glob7 1
+appelleron 1
+appelleron ce 1
+appelleron ce substitut 1
+appelleron dor 1
+appelleron dor enav 1
+appelleron point 1
+appelleron point de 1
+appelleron tr 1
+appelleron tr nag 1
+appelleron un 1
+appelleron un gard 1
+appelon 3
+appelon cart 1
+appelon cart exponentiel 1
+appelon desc 1
+appelon par 1
+appelon par la 1
+appelon syst 1
+appelon syst em 1
+apperl 2
+appl 123
+appl a addr 1
+appl a corrobor 1
+appl a decomposit 1
+appl a descript 1
+appl a en 1
+appl a funct 1
+appl a gener 1
+appl a length 1
+appl a narrow 1
+appl a parallel 1
+appl a program 1
+appl a schem 1
+appl a singl 2
+appl a specif 1
+appl a tout 1
+appl a transform 1
+appl a usl 1
+appl abstract 1
+appl accept 1
+appl accord 2
+appl act 1
+appl aff 1
+appl aff de 1
+appl aggreg 1
+appl al cal 1
+appl al inclus 1
+appl algorithm 5
+appl algorithm jt 1
+appl and ap 1
+appl and compar 1
+appl and comput 1
+appl and consider 1
+appl and interact 1
+appl and numer 1
+appl and pol 1
+appl and rel 1
+appl and sect 1
+appl and sen 1
+appl and tempor 1
+appl and transport 1
+appl and typ 1
+appl and user 1
+appl ar 6
+appl ar abl 1
+appl ar ba 1
+appl ar client 1
+appl ar cod 1
+appl ar design 1
+appl ar protect 1
+appl ar reduc 1
+appl ar rel 1
+appl ar sensit 1
+appl ar typ 1
+appl architect 1
+appl architectur 1
+appl architectur team 1
+appl art 1
+appl artif 2
+appl artif intellig 2
+appl as compon 1
+appl as follow 3
+appl at lowel 1
+appl automat 1
+appl aux 2
+appl aux polyn 1
+appl aux pr 1
+appl av 1
+appl av direct 1
+appl avail 1
+appl axiom 1
+appl axiom st 1
+appl ba 1
+appl ba approach 1
+appl be avail 1
+appl behaviour 1
+appl behaviour dep 1
+appl benchmark 1
+appl benchmark ba 1
+appl blind 1
+appl build 1
+appl build techniqu 1
+appl burst 1
+appl but ml 1
+appl by integr 1
+appl can toler 1
+appl can us 1
+appl canon 1
+appl canon decomposit 1
+appl ch 1
+appl character 2
+appl claus 1
+appl cluster 1
+appl cod 3
+appl cod behav 1
+appl codebus 1
+appl codebus overheadsync 1
+appl codebusyoverheadsync 1
+appl codebusyoverheadsync overheadalgorithm 1
+appl color 1
+appl color featur 1
+appl compl 1
+appl compl es 1
+appl compon 1
+appl compon ba 1
+appl computer 1
+appl computer inc 1
+appl con 2
+appl concern 1
+appl concern 2d 1
+appl contain 2
+appl contain ten 1
+appl context 1
+appl cur 1
+appl cur prov 1
+appl d etermin 1
+appl dan 2
+appl dan de 1
+appl dan le 2
+appl de 3
+appl de ce 1
+appl de la 1
+appl de lop 2
+appl de techniqu 1
+appl deal 1
+appl dep 2
+appl dep chang 1
+appl dep test 1
+appl describ 1
+appl design 1
+appl develop 1
+appl dialog 1
+appl dijkstr 1
+appl dijkstr shortest 1
+appl direct 2
+appl direct du 1
+appl disc 1
+appl domain 7
+appl domain prior 1
+appl don 2
+appl don ee 2
+appl dun 1
+appl dun transform 1
+appl en 1
+appl en imager 1
+appl ent 1
+appl ent er 1
+appl environm 2
+appl equ 1
+appl exampl 1
+appl execut 1
+appl execut tim 1
+appl exper 2
+appl exper illustr 1
+appl fact 1
+appl first order 1
+appl fl 1
+appl for bp 1
+appl for find 1
+appl for interconnect 1
+appl for narrow 1
+appl for parod 1
+appl for particl 1
+appl for protein 1
+appl for shar 1
+appl for unsuperv 1
+appl form 1
+appl framework 1
+appl from chang 1
+appl from compon 1
+appl from sen 1
+appl glp 1
+appl ha decl 1
+appl haphazard 1
+appl hav guid 1
+appl hav shown 1
+appl heur 1
+appl imp 1
+appl imp string 1
+appl impl 1
+appl implem 3
+appl implem log 1
+appl in 3d 1
+appl in a3 1
+appl in addit 1
+appl in ar 1
+appl in atm 1
+appl in cad 1
+appl in commun 1
+appl in computer 1
+appl in crystallograph 1
+appl in design 1
+appl in field 1
+appl in imag 2
+appl in med 2
+appl in mind 1
+appl in model 1
+appl in molecl 1
+appl in multimod 1
+appl in order 1
+appl in parallel 1
+appl in quest 1
+appl in respon 1
+appl in sign 1
+appl in softwar 1
+appl in suff 1
+appl in typ 1
+appl in var 1
+appl inclus 5
+appl inclus distribut 1
+appl inclus rel 1
+appl inclus replac 1
+appl incon 1
+appl inform 1
+appl inform technolog 1
+appl inject 1
+appl inject entr 1
+appl int 1
+appl int event 1
+appl involut 3
+appl involut ma 1
+appl is dynam 2
+appl is load 1
+appl is ment 1
+appl is part 1
+appl is run 1
+appl is yf 1
+appl j fun 1
+appl k improv 1
+appl knowledg 1
+appl knowledg structur 1
+appl known 1
+appl known explan 1
+appl langu 1
+appl larchitectur 1
+appl layer 1
+appl layer pa 1
+appl le 1
+appl lem 1
+appl level 5
+appl level fram 1
+appl level method 1
+appl level secur 1
+appl level softwar 1
+appl lin 1
+appl lin algebr 1
+appl lo 1
+appl load 1
+appl loc 1
+appl loc improv 1
+appl log 1
+appl maintainer 1
+appl maintainer dec 1
+appl maintainer hap 1
+appl maintainer import 1
+appl maintainer introduc 1
+appl maintainer want 1
+appl mathemat 10
+appl mathemat research 2
+appl may inclus 1
+appl may requir 1
+appl may run 1
+appl may us 1
+appl me 1
+appl me xp 1
+appl method 1
+appl method avail 1
+appl method list 1
+appl method m1 1
+appl method method 1
+appl method tel 1
+appl might requir 1
+appl min 1
+appl min mac 1
+appl mobil 1
+appl model 2
+appl model infer 1
+appl model support 1
+appl modif 1
+appl morpholog 1
+appl morpholog oper 1
+appl multivar 1
+appl multivar an 1
+appl non 1
+appl non unimodulair 1
+appl object 2
+appl object lead 1
+appl oe 1
+appl oeld 1
+appl oeld rang 1
+appl of abstract 1
+appl of bank 1
+appl of cluster 1
+appl of computer 1
+appl of constraint 2
+appl of cont 1
+appl of contextu 1
+appl of edit 1
+appl of exper 1
+appl of fr 1
+appl of funct 1
+appl of ga 1
+appl of graph 1
+appl of heap 1
+appl of known 1
+appl of lem 1
+appl of lin 1
+appl of loc 1
+appl of mach 1
+appl of me 1
+appl of method 1
+appl of minim 1
+appl of mod 1
+appl of modl 1
+appl of neur 2
+appl of oper 1
+appl of parallel 1
+appl of part 1
+appl of pr. 1
+appl of priork 1
+appl of read 2
+appl of sound 1
+appl of spat 2
+appl of ss 1
+appl of substitut 1
+appl of tempor 1
+appl of textur 1
+appl of theorem 1
+appl of uniform 1
+appl of user 1
+appl of voron 1
+appl oft cal 1
+appl oft result 1
+appl on constraint 1
+appl on exact 1
+appl on larger 1
+appl on object 1
+appl on spac 1
+appl ont 1
+appl ont perm 1
+appl oper 2
+appl opt 1
+appl or using 1
+appl order 1
+appl order evalu 1
+appl our algorithm 1
+appl our method 1
+appl our rl 1
+appl over min 1
+appl pack 1
+appl parallel 2
+appl parallel proc 1
+appl part 1
+appl part evalu 1
+appl pay 1
+appl perform 1
+appl perm 1
+appl perm de 1
+appl peut 1
+appl peut etr 1
+appl port 1
+appl potentiel 1
+appl potentiel sont 1
+appl principl 1
+appl principl way 1
+appl problem 2
+appl proc 1
+appl program 11
+appl program implem 1
+appl program interfac 1
+appl program schem 1
+appl programer 1
+appl programer comp 1
+appl programmer 3
+appl programmer customiz 1
+appl programmer manu 1
+appl prov 2
+appl prov introduc 1
+appl qu 3
+appl qu la 1
+appl qu nous 1
+appl qu nutil 1
+appl quau 1
+appl quau nid 1
+appl r eel 1
+appl rationnel 1
+appl rationnel non 1
+appl reason 1
+appl recur 1
+appl regr 1
+appl regr model 1
+appl rel 1
+appl repl 1
+appl repl dat 1
+appl requir 5
+appl requir loc 1
+appl requir network 1
+appl requir rel 1
+appl research 1
+appl research labor 1
+appl rewrit 1
+appl rewrit rl 1
+appl rl 2
+appl rl ge 1
+appl rm 1
+appl san condit 1
+appl scientif 1
+appl scientif method 1
+appl seem 1
+appl shorter 1
+appl shorter multipl 1
+appl show 1
+appl simpl 1
+appl simpl transform 1
+appl siz 1
+appl soft 1
+appl soft threshold 1
+appl softwar 2
+appl softwar system 1
+appl sont 1
+appl sont tr 1
+appl sourc 1
+appl sourc fil 1
+appl span 1
+appl span distribut 1
+appl spec 1
+appl specif 6
+appl specif assum 1
+appl specif control 1
+appl specif dat 1
+appl specif knowledg 1
+appl specif langu 1
+appl specif proper 1
+appl specif virtu 1
+appl st 1
+appl start 1
+appl stat 3
+appl stat an 1
+appl stat cluster 1
+appl strateg 1
+appl succ 3
+appl suit 1
+appl suit inclus 1
+appl synchron 1
+appl synchron parallel 1
+appl system 2
+appl tag 1
+appl tag instead 1
+appl tant 1
+appl tant dan 1
+appl targ 1
+appl tb 1
+appl ten 2
+appl th achief 1
+appl th act 2
+appl th affin 1
+appl th an 1
+appl th bus 1
+appl th compl 1
+appl th del 1
+appl th dijkstr 1
+appl th fe 1
+appl th framework 2
+appl th funct 1
+appl th heap 1
+appl th induc 1
+appl th integr 1
+appl th latter 1
+appl th lin 1
+appl th mechan 1
+appl th method 1
+appl th minim 1
+appl th modif 1
+appl th ocr 1
+appl th oper 3
+appl th parallel 1
+appl th purp 1
+appl th reduc 1
+appl th result 1
+appl th shorter 1
+appl th sort 1
+appl th structur 1
+appl th techniqu 3
+appl th tempor 1
+appl th tr 1
+appl th transform 1
+appl th triangl 1
+appl th unif 1
+appl th ver 1
+appl th vol 1
+appl th wavel 1
+appl that def 1
+appl that evalu 1
+appl that export 1
+appl that multicomputer 1
+appl that requir 1
+appl that us 4
+appl then unchang 1
+appl theorem 2
+appl to 3d 1
+appl to a1 1
+appl to accommod 1
+appl to appl 1
+appl to arbitr 1
+appl to argum 1
+appl to biolog 1
+appl to cl 1
+appl to coh 1
+appl to combin 1
+appl to complec 1
+appl to connect 1
+appl to cont 1
+appl to dat 1
+appl to datab 1
+appl to dimin 1
+appl to direct 1
+appl to docum 1
+appl to dynam 1
+appl to engineer 1
+appl to exchang 1
+appl to exper 2
+appl to f2 1
+appl to finit 1
+appl to form 1
+appl to forml 1
+appl to gener 2
+appl to hand 1
+appl to handwrit 1
+appl to hyperbol 1
+appl to improv 1
+appl to ind 2
+appl to input 1
+appl to inst 1
+appl to jpeg 1
+appl to larger 1
+appl to loc 1
+appl to log 1
+appl to lower 1
+appl to man 1
+appl to mlp 1
+appl to multicast 1
+appl to netsim 1
+appl to network 2
+appl to oolp 1
+appl to ordin 1
+appl to parallel 3
+appl to prim 2
+appl to primitiv 1
+appl to prior 1
+appl to problem 2
+appl to produc 2
+appl to prov 1
+appl to rev 1
+appl to sar 1
+appl to sign 1
+appl to solut 4
+appl to sort 1
+appl to spat 1
+appl to speed 1
+appl to switch 1
+appl to symmeter 1
+appl to td 1
+appl to term 1
+appl to theorem 1
+appl to thom 1
+appl to tim 1
+appl to tod 1
+appl to toy 1
+appl to tupl 2
+appl to upd 1
+appl to var 1
+appl to xp 1
+appl transport 1
+appl transport sourc 1
+appl triangl 1
+appl triangl heap 1
+appl tud 1
+appl tud es 1
+appl turn 1
+appl un 1
+appl un transform 1
+appl univer 1
+appl univer hash 1
+appl upd 1
+appl us 1
+appl using 3
+appl util 1
+appl var 2
+appl var problem 1
+appl variabl 1
+appl variabl alloc 1
+appl wa direct 1
+appl we develop 1
+appl we refer 1
+appl wer giv 1
+appl wer modif 1
+appl wh 4
+appl when appropr 1
+appl when compar 1
+appl wil becom 1
+appl with car 1
+appl with matr 1
+appl with multipl 1
+appl with specl 1
+appl within typ 1
+appl work 1
+appl writ 3
+appl. 1
+appl.4 1
+appl7 1
+appleb 1
+appletcap 1
+appletcap browser 1
+appletcap browser cach 1
+applicabl 2
+applicabl a la 1
+applicabl au 1
+applicabl au drapeau 1
+applicabl plus larg 1
+applicabl qu 1
+applicabl qu sil 1
+applicatif 1
+applicatif qu 1
+applicatif qu nous 1
+applicationburst 1
+appliqu 6
+appliqu a la 1
+appliqu ce 2
+appliqu ce transform 1
+appliqu dan 1
+appliqu e aux 1
+appliqu e avec 1
+appliqu e de 1
+appliqu e le 1
+appliqu e sect 1
+appliqu ee 4
+appliqu ee aux 2
+appliqu ee dan 1
+appliqu ee glob 1
+appliqu es 1
+appliqu es au 1
+appliqu la 2
+appliqu la substitut 1
+appliqu la techniqu 1
+appliqu le 3
+appliqu le court 1
+appliqu s en 1
+appliqu un 1
+appliqu un protocol 1
+appliqu un transform 1
+appliquer 3
+appliquer a la 1
+appliquer au 1
+appliquer au nid 1
+appliquer glob 1
+appliquer le 2
+appliquer le test 2
+appliquer lun 1
+appliquer lun de 1
+appliquer nimport 1
+appliquer nimport quel 1
+appliquer un 1
+appliquer un dilat 1
+appliquer un partit 1
+appliquer un tel 1
+appliquon 2
+appliquon a ce 1
+appliquon au 1
+appliquon au paragraph 1
+appliquon ce 1
+appliquon ce th 1
+appliquon dan 1
+appliquon dan ce 1
+appliquon maint 1
+appliquon maint ce 1
+appliquon un 1
+appliquon un approch 1
+appointm 1
+apport 3
+apport a mon 1
+apport dautr 1
+apport de 1
+apport de crit 1
+apport e aux 1
+apport ee 1
+apport ee au 1
+apport ee se 1
+apport es 1
+apport et la 1
+apporter 3
+apporter a lunif 1
+apporter a mon 1
+apporter aucun 1
+apporter aucun solut 1
+apporter concern 1
+apporter concern le 1
+apporter de 1
+apporter de primitiv 1
+apporter pour 1
+apporter pour mettr 1
+apppear 1
+appr 6
+appr ec 3
+appr ec ce 1
+appr ec le 1
+appr ec lor 1
+appr eciabl 1
+appr ehen 1
+appr ehen es 1
+appr ehender 3
+appr ehender car 1
+appr ehender la 1
+apprec 11
+apprec and depl 1
+apprec chr 1
+apprec chr houck 1
+apprec larger 1
+apprec larger pattern 1
+apprec progr 1
+apprec reperc 1
+apprec th disc 1
+apprec that aspect 1
+apprel 1
+apprel pioneer 1
+approach 106
+approach a continuum 1
+approach a libr 1
+approach achief 1
+approach achief deleg 1
+approach adopt 1
+approach adopt high 1
+approach al great 1
+approach al prov 1
+approach al simplif 1
+approach allow 2
+approach and an 1
+approach and giv 1
+approach and implem 1
+approach and introduc 1
+approach and measur 1
+approach and prop 1
+approach and repr 1
+approach and requir 1
+approach and tool 1
+approach and user 1
+approach appear 1
+approach ar ba 1
+approach ar conceiv 1
+approach ar cover 1
+approach ar disc 1
+approach ar pr 1
+approach ar rel 1
+approach ar sought 1
+approach ar sum 1
+approach ar var 1
+approach arbitr 1
+approach arbitr cl 1
+approach as depict 1
+approach as illustr 1
+approach assum 1
+approach ba 3
+approach both program 1
+approach build 1
+approach by maintain 1
+approach can perform 1
+approach cannot account 1
+approach closer 1
+approach combin 1
+approach con 2
+approach construc 1
+approach could equ 1
+approach cr 1
+approach cr compl 1
+approach def 1
+approach describ 4
+approach develop 1
+approach differ 2
+approach disregard 1
+approach du 1
+approach eff 1
+approach elsewh 1
+approach explor 1
+approach facilit 1
+approach facilit implem 1
+approach follow 1
+approach follow work 1
+approach for addr 1
+approach for control 1
+approach for dent 1
+approach for implem 2
+approach for laz 1
+approach for model 1
+approach for program 1
+approach for remov 1
+approach for schedl 1
+approach for singl 1
+approach for ssm 1
+approach from act 1
+approach giv 1
+approach giv ast 1
+approach ha drawback 1
+approach ha simil 1
+approach handl 1
+approach handl growth 1
+approach impl 1
+approach improv 1
+approach inclus 1
+approach inclus recur 1
+approach instead 1
+approach instead gener 1
+approach involut 3
+approach involut server 1
+approach involut spat 1
+approach is adopt 1
+approach is appl 1
+approach is ba 2
+approach is compar 2
+approach is compl 1
+approach is concern 1
+approach is depict 1
+approach is du 1
+approach is ea 1
+approach is extrem 1
+approach is held 1
+approach is illustr 1
+approach is indeed 1
+approach is inspir 1
+approach is langu 1
+approach is pract 1
+approach is relev 1
+approach is saf 1
+approach is signif 1
+approach is sum 1
+approach is therefor 1
+approach is underg 1
+approach is us 2
+approach issu 1
+approach lead 1
+approach lo 1
+approach lo slight 1
+approach maintain 1
+approach mak 2
+approach may consum 1
+approach model 1
+approach model rel 1
+approach mor competit 1
+approach most 1
+approach most con 1
+approach of allender 1
+approach of cluster 1
+approach of dat 1
+approach of design 1
+approach of divid 1
+approach of loc 1
+approach of scal 1
+approach of sort 1
+approach of transform 1
+approach of using 3
+approach offer 2
+approach offer scal 1
+approach offer solut 1
+approach onl consider 1
+approach outlin 2
+approach particl 1
+approach pr 3
+approach prop 2
+approach prov 4
+approach prov interpr 1
+approach prov signif 1
+approach realiz 1
+approach realiz multilevel 1
+approach reduc 1
+approach rel 1
+approach rel heav 1
+approach requir 6
+approach result 1
+approach se 1
+approach se growth 1
+approach seem 1
+approach seem natur 1
+approach select 2
+approach select saf 1
+approach shown 1
+approach simil 3
+approach stand 1
+approach tak 2
+approach ten 3
+approach th appear 1
+approach th lower 1
+approach th number 1
+approach th object 1
+approach that commerc 1
+approach that requir 1
+approach that us 1
+approach to acc 1
+approach to achief 1
+approach to adapt 1
+approach to algorithm 1
+approach to anom 1
+approach to arbitr 1
+approach to av 1
+approach to bound 1
+approach to build 2
+approach to cach 1
+approach to calcl 1
+approach to character 1
+approach to cluster 1
+approach to comput 1
+approach to constraint 1
+approach to continu 1
+approach to correct 1
+approach to decluster 1
+approach to defin 1
+approach to deliver 1
+approach to design 3
+approach to detect 1
+approach to determin 1
+approach to distribut 1
+approach to edg 1
+approach to eff 1
+approach to effect 1
+approach to estim 1
+approach to fil 1
+approach to find 1
+approach to flow 1
+approach to gener 2
+approach to geometer 1
+approach to graph 1
+approach to handl 1
+approach to imag 1
+approach to integr 1
+approach to interfer 1
+approach to interprocedur 1
+approach to learn 2
+approach to loc 1
+approach to log 2
+approach to model 1
+approach to multidim 1
+approach to natur 1
+approach to object 1
+approach to oper 1
+approach to optim 1
+approach to overcom 1
+approach to parallel 2
+approach to parameter 1
+approach to perform 1
+approach to program 2
+approach to prov 1
+approach to real 1
+approach to recov 1
+approach to reduc 1
+approach to regr 1
+approach to rel 2
+approach to requir 1
+approach to resolut 1
+approach to saf 1
+approach to scal 1
+approach to schedl 1
+approach to segm 1
+approach to softwar 1
+approach to solut 1
+approach to spar 1
+approach to specif 1
+approach to structur 1
+approach to superv 1
+approach to tempor 2
+approach to tool 1
+approach to typ 1
+approach to unfold 1
+approach to unit 1
+approach to unsuperv 1
+approach to upd 1
+approach to verif 2
+approach took 1
+approach took adv 1
+approach try 1
+approach typ 1
+approach us 5
+approach us mult 1
+approach us non 1
+approach us rn 1
+approach us simpl 1
+approach us train 1
+approach using 3
+approach using horizont 1
+approach using smaller 1
+approach using ver 1
+approach util 2
+approach utiliz 1
+approach utiliz hierarch 1
+approach view 1
+approach wa experim 1
+approach wa tak 2
+approach we ch 1
+approach we tak 1
+approach wer gener 1
+approach wer tak 1
+approach when nod 1
+approach wil becom 1
+approach wil damp 1
+approach with fft 1
+approach with pack 1
+approach with respect 1
+approachus 1
+approachus larger 1
+approachus larger cluster 1
+approch 5
+approch a lautr 1
+approch ba 1
+approch ba ee 1
+approch constitu 1
+approch de 3
+approch de ce 1
+approch de la 1
+approch de par 1
+approch de siml 1
+approch de val 1
+approch dexplor 1
+approch dexplor partiel 1
+approch dhybrid 1
+approch don 1
+approch don en 1
+approch ee 1
+approch ensembl 1
+approch est 1
+approch est le 1
+approch est tr 1
+approch ne 1
+approch ne peut 1
+approch par 1
+approch par el 1
+approch par inform 1
+approch paresseus 1
+approch paresseus de 1
+approch plus extr 1
+approch plus ou 1
+approch qu 2
+approch qu est 1
+approch qu nous 1
+approch qu perm 1
+approch r ecent 1
+approch se 1
+approch se rejoign 1
+approch ten 1
+approfon 1
+approfon a la 1
+approfon de 1
+approfon de la 1
+approfon de travaux 1
+approfon du 1
+approfon du syst 1
+appropr 76
+appropr abstract 2
+appropr act 3
+appropr act rout 1
+appropr addit 2
+appropr addit self 1
+appropr aggreg 1
+appropr aggreg valu 1
+appropr aim 1
+appropr amount 1
+appropr an 1
+appropr an framework 1
+appropr answer 1
+appropr anymor 1
+appropr appl 1
+appropr appl act 1
+appropr approach 1
+appropr approxim 1
+appropr argum 2
+appropr argum pa 1
+appropr assignm 1
+appropr behaviour 1
+appropr bi 1
+appropr c cod 1
+appropr cach 1
+appropr cach strateg 1
+appropr cach system 1
+appropr cal 2
+appropr ch 1
+appropr check 1
+appropr chunk 1
+appropr click 1
+appropr coar 1
+appropr coar algorithm 1
+appropr cod 1
+appropr compon 1
+appropr comput 1
+appropr confid 1
+appropr confid funct 1
+appropr constraint 2
+appropr constraint langu 1
+appropr constraint theor 1
+appropr cost 1
+appropr cost funct 1
+appropr dat 3
+appropr dat item 1
+appropr dat structur 2
+appropr de 1
+appropr de ning 1
+appropr dealt 1
+appropr decl 1
+appropr decomposit 1
+appropr decor 1
+appropr definit 2
+appropr dep 1
+appropr design 1
+appropr destin 1
+appropr dist 1
+appropr dist funct 1
+appropr edg 1
+appropr ee 1
+appropr ee suiv 1
+appropr environm 1
+appropr fid 1
+appropr fid criter 1
+appropr for act 1
+appropr for appl 1
+appropr for funct 1
+appropr for particl 1
+appropr for partit 1
+appropr form 2
+appropr form refin 1
+appropr format 1
+appropr funct 2
+appropr funct typ 1
+appropr glob 1
+appropr glob condit 1
+appropr grammat 1
+appropr grammat categor 1
+appropr graph 1
+appropr half 1
+appropr high frequ 1
+appropr in intern 1
+appropr inclus 1
+appropr incorpor 1
+appropr infl 1
+appropr init 2
+appropr init valu 1
+appropr input 1
+appropr input port 1
+appropr inv 1
+appropr item 1
+appropr kind 2
+appropr knowledg 1
+appropr knowledg structur 1
+appropr langu 1
+appropr leaf 1
+appropr learn 2
+appropr learn algorithm 2
+appropr learn strateg 1
+appropr length 1
+appropr loc 3
+appropr loc traff 2
+appropr lock 1
+appropr lock 1s 1
+appropr log 1
+appropr log structur 1
+appropr manner 1
+appropr margin 1
+appropr me 1
+appropr me pa 1
+appropr mean 1
+appropr memor 1
+appropr memor architectur 1
+appropr method 1
+appropr model 1
+appropr modl 1
+appropr mous 1
+appropr mous button 1
+appropr mult 1
+appropr mult scal 1
+appropr nam 1
+appropr next pack 1
+appropr nod 1
+appropr norm 1
+appropr number 2
+appropr of item 1
+appropr of modl 1
+appropr oper 1
+appropr oper op 1
+appropr order 1
+appropr order partit 1
+appropr outg 1
+appropr outg queu 1
+appropr output 1
+appropr output lin 1
+appropr output port 1
+appropr over 1
+appropr over behaviour 1
+appropr parameter 1
+appropr parameter valu 1
+appropr part 1
+appropr part evalu 1
+appropr partit 1
+appropr plac 1
+appropr pol 1
+appropr pol list 1
+appropr posit 1
+appropr prescript 1
+appropr privileg 1
+appropr problem 1
+appropr problem specif 1
+appropr proc 2
+appropr prompt 1
+appropr proof 1
+appropr proof oblig 1
+appropr rang 1
+appropr renam 1
+appropr rewrit 1
+appropr rewrit rl 1
+appropr scenar 2
+appropr se 2
+appropr sequ 1
+appropr sequ sort 1
+appropr sit 1
+appropr sit succ 1
+appropr siz 1
+appropr slot 1
+appropr softwar 1
+appropr softwar tool 1
+appropr spec primitiv 1
+appropr specl 1
+appropr specl funct 1
+appropr speed 1
+appropr step 2
+appropr strateg 1
+appropr sub 1
+appropr sub modl 1
+appropr substitut 1
+appropr tabl 1
+appropr tag 1
+appropr templ 1
+appropr templ el 1
+appropr then understand 1
+appropr tim 2
+appropr tim slot 1
+appropr to character 1
+appropr to invok 1
+appropr to presum 1
+appropr to prev 1
+appropr to say 1
+appropr to think 1
+appropr transit 1
+appropr transl 1
+appropr transl found 1
+appropr tw dim 1
+appropr typ 1
+appropr typ dep 1
+appropr url 1
+appropr url ba 1
+appropr valu 2
+appropr view 1
+appropr viewer 1
+appropr vocabl 1
+appropr wait 1
+approprit 1
+approprit me 1
+approprit me xp 1
+approx 2
+approx. 1
+approxim 54
+approxim algorithm 6
+approxim algorithm emb 1
+approxim algorithm gener 1
+approxim algorithm prov 1
+approxim algorithm using 1
+approxim and abstract 1
+approxim and graph 1
+approxim and imag 1
+approxim any nonlin 1
+approxim approxim 1
+approxim aver 1
+approxim aver degr 1
+approxim bi 1
+approxim bound 2
+approxim by ad 1
+approxim by polygon 1
+approxim by simpl 1
+approxim by superposit 1
+approxim by symbol 1
+approxim calcl 1
+approxim complec 1
+approxim complec surfac 1
+approxim comput 1
+approxim d tim 1
+approxim de 2
+approxim de cart 1
+approxim de la 1
+approxim de mart 1
+approxim discr 1
+approxim discr collect 1
+approxim enon 1
+approxim equ 4
+approxim equ width 1
+approxim filter 1
+approxim filter step 1
+approxim for maxim 1
+approxim for reason 1
+approxim gaus 1
+approxim implem 1
+approxim in determin 1
+approxim ink 1
+approxim ink match 1
+approxim is determin 1
+approxim is disc 1
+approxim is obtain 1
+approxim le 1
+approxim le probabilit 1
+approxim learn 1
+approxim log 1
+approxim log program 1
+approxim min 1
+approxim min mac 1
+approxim minim 2
+approxim minim degr 1
+approxim minim weight 1
+approxim n lg 1
+approxim of bay 1
+approxim of eigenvalu 1
+approxim of extrem 1
+approxim of gp 1
+approxim on 1
+approxim on obtain 1
+approxim on transact 1
+approxim or repr 1
+approxim or siml 1
+approxim partit 1
+approxim partit el 1
+approxim pm 1
+approxim polygon 1
+approxim polygon level 1
+approxim preserv 1
+approxim preserv reduc 1
+approxim problem 1
+approxim proc 1
+approxim real 1
+approxim rel 1
+approxim schem 1
+approxim se 1
+approxim se contain 1
+approxim sign 1
+approxim sign indep 1
+approxim siz 1
+approxim solut 4
+approxim spac 1
+approxim spanner 1
+approxim string 1
+approxim string match 1
+approxim structur 1
+approxim such nonlin 1
+approxim synchron 1
+approxim t spanner 1
+approxim t. 1
+approxim th behavior 1
+approxim th camelot 1
+approxim th eigenpair 1
+approxim th eigenvalu 1
+approxim th entir 1
+approxim th featur 1
+approxim th longest 1
+approxim th map 1
+approxim th maxim 1
+approxim th mechan 1
+approxim th minim 1
+approxim th mmc 1
+approxim th norm 1
+approxim th number 1
+approxim th numer 1
+approxim th problem 1
+approxim th siz 1
+approxim th solut 1
+approxim th tim 2
+approxim through loc 1
+approxim to eigenvalu 1
+approxim trigger 1
+approxim tru grad 1
+approxim tspanner 1
+approxim twodim 1
+approxim twodim graph 1
+approxim uncorrel 1
+approxim univer 1
+approxim valu 1
+apprxfil 1
+apr 10
+apr converg 1
+apr es 4
+apr es act 1
+apr es avoir 3
+apr es bloc 1
+apr es calcl 1
+apr es ce 1
+apr es coupur 1
+apr es cr 2
+apr es elim 1
+apr es evalu 1
+apr es fus 1
+apr es ind 1
+apr es introduc 1
+apr es inver 1
+apr es la 2
+apr es lappel 1
+apr es lautr 1
+apr es le 2
+apr es lenviron 1
+apr es lib 1
+apr es lop 1
+apr es partit 1
+apr es pav 1
+apr es qu 1
+apr es restaur 1
+apr es tout 1
+apr es transform 1
+apr es un 3
+apr s an 1
+april 48
+apt 3
+apt a pr 1
+apt79 1
+aptitud 1
+aptitud test 1
+aq 4
+aqb 1
+aqb ap 1
+aqp 1
+aqu 1
+aqu consider 1
+aqu consider explan 1
+aqu control 1
+aqu control flow 1
+aqu embod 1
+aqu knowledg 1
+aqu knowledg inclus 1
+aqu model 1
+aqu model claim 1
+aqu perform 1
+aqu perform ebg 1
+aqu produc 1
+aqu system 1
+aqu system embod 1
+aqu then check 1
+aqu to learn 1
+aqu us 1
+aqu us standard 1
+aqu ver 1
+aqu ver ad 1
+aquarius 1
+aquarius bam 1
+aquarius benchmark 1
+aquarius benchmark suit 1
+aquarius compiler 1
+aquarius ex 1
+aquarius ex ecut 1
+aquarius project 1
+aquarius project took 1
+aquarius prolog 1
+aquarius prolog compiler 1
+ar 94
+ar a la 1
+ar a using 2
+ar abil 1
+ar addr 1
+ar alread decl 1
+ar and click 1
+ar and input 1
+ar and measur 2
+ar ar 1
+ar ar distribut 1
+ar ar interpr 1
+ar ar sub 1
+ar as describ 1
+ar as part 1
+ar as r1 1
+ar as1 1
+ar ask 1
+ar assoc 1
+ar at distinct 1
+ar at neg 1
+ar aw 1
+ar az 1
+ar being develop 1
+ar belong 1
+ar by ch 1
+ar cal 1
+ar cal heap 1
+ar cal shunt 1
+ar collect 1
+ar collect repr 1
+ar compon 1
+ar comput 1
+ar computer 2
+ar computer network 2
+ar con 1
+ar contain 2
+ar contain ch 1
+ar contain pointer 1
+ar control 1
+ar control unit 1
+ar correspon 2
+ar correspon compon 1
+ar cover 2
+ar cover typ 1
+ar dat 1
+ar dat dep 1
+ar describ 1
+ar dim 1
+ar du 2
+ar dur norm 1
+ar eff 2
+ar eff layout 2
+ar el 4
+ar el acc 1
+ar environm 1
+ar er ain 1
+ar er bam 1
+ar er bp 1
+ar er chronologiqu 1
+ar er consid 1
+ar er correspon 1
+ar er dan 1
+ar er de 1
+ar er dicm 1
+ar er dirig 1
+ar er du 1
+ar er est 1
+ar er explicit 1
+ar er le 1
+ar er na 1
+ar er ne 1
+ar er nest 1
+ar er ou 1
+ar er peu 1
+ar er profon 1
+ar er qu 1
+ar er requ 1
+ar er sel 1
+ar er superficiel 1
+ar er sur 1
+ar er ver 1
+ar er vient 1
+ar expan 1
+ar for arbitr 1
+ar for connect 1
+ar for rapid 1
+ar for research 1
+ar from effort 1
+ar from incr 1
+ar from induc 1
+ar from load 1
+ar from oper 1
+ar from overspec 1
+ar from thread 1
+ar from view 1
+ar fs 1
+ar giv 1
+ar ha consider 1
+ar handl 1
+ar handl clr 1
+ar implem 1
+ar in circl 1
+ar in cod 1
+ar in commun 4
+ar in compar 1
+ar in dat 1
+ar in dep 1
+ar in finit 2
+ar in graph 1
+ar in ip 1
+ar in lp 1
+ar in numer 1
+ar in popl 1
+ar in pract 3
+ar in rang 1
+ar in rout 1
+ar in rt1 1
+ar in situ 2
+ar in var 1
+ar inc 1
+ar inclus 4
+ar inclus digit 1
+ar inform 1
+ar inform server 1
+ar int 1
+ar int siz 1
+ar is architectur 1
+ar is decl 1
+ar is known 1
+ar is pack 2
+ar is proper 1
+ar is reach 1
+ar is upd 1
+ar itself wh 1
+ar k tupl 1
+ar k0 1
+ar m unrestrict 1
+ar ma 1
+ar ma st 1
+ar manag 1
+ar may read 1
+ar may us 1
+ar method 1
+ar network 6
+ar network architectur 1
+ar network con 1
+ar network environm 1
+ar network standard 1
+ar network using 2
+ar nt 1
+ar of ai 1
+ar of appl 1
+ar of asynchron 1
+ar of boolean 1
+ar of caus 1
+ar of cel 1
+ar of character 1
+ar of color 1
+ar of commun 2
+ar of comput 1
+ar of computer 2
+ar of concern 1
+ar of counter 1
+ar of dat 1
+ar of deduc 1
+ar of den 1
+ar of el 1
+ar of europ 1
+ar of exper 2
+ar of fault 1
+ar of futur 1
+ar of high 1
+ar of ind 1
+ar of inexp 1
+ar of inform 1
+ar of input 1
+ar of intern 1
+ar of internet 1
+ar of langu 1
+ar of libr 1
+ar of med 1
+ar of n2 1
+ar of pattern 1
+ar of pe 1
+ar of pixel 1
+ar of pr 1
+ar of proc 2
+ar of research 5
+ar of sampl 1
+ar of softwar 1
+ar of structur 1
+ar of switch 1
+ar optim 1
+ar point 1
+ar proc 1
+ar project 1
+ar project built 1
+ar q0 1
+ar qu 1
+ar qu le 1
+ar quit natur 1
+ar rar 1
+ar recov 1
+ar recov method 1
+ar refer 1
+ar requir 2
+ar resid 1
+ar respect 1
+ar seem 1
+ar segev 1
+ar siz 1
+ar siz defin 1
+ar spac 1
+ar spac acc 1
+ar st 2
+ar st interm 1
+ar stat 1
+ar stat st 1
+ar stil lack 1
+ar subscript 1
+ar suit 1
+ar t acc 1
+ar telephon 1
+ar telephon network 1
+ar th occup 1
+ar to construc 1
+ar to hold 1
+ar to remember 1
+ar to st 1
+ar transform 1
+ar using 1
+ar ver natur 1
+ar wa overcrowd 1
+ar walk 1
+ar wer fil 1
+ar wh 3
+ar wh car 1
+ar wh instruc 1
+ar when appl 1
+ar when nondetermin 1
+ar which induc 1
+ar whil retain 1
+ar with rat 1
+ar with regl 1
+ar with respect 1
+ar with tim 1
+arab 1
+arab lunar 1
+arab lunar calendar 1
+arab of un 1
+arang 1
+arbab 1
+arbeit 1
+arbeit ist 1
+arbeit ist zur 1
+arbeitspap 1
+arbeitspap der 1
+arbeitspap der gmd 1
+arbitr 66
+arbitr accur 1
+arbitr algorithm 1
+arbitr amount 2
+arbitr appl 2
+arbitr appl specif 1
+arbitr bad 1
+arbitr between multidest 1
+arbitr blob 1
+arbitr but fic 1
+arbitr c expr 1
+arbitr ch 2
+arbitr cl 1
+arbitr collect 1
+arbitr collect obtain 1
+arbitr comp 1
+arbitr complec 2
+arbitr complec configur 1
+arbitr complec interconnect 1
+arbitr comput 1
+arbitr concav 1
+arbitr concav polygon 1
+arbitr corrupt 1
+arbitr corrupt st 1
+arbitr dag 1
+arbitr dat 4
+arbitr dat dep 1
+arbitr dat distribut 1
+arbitr dat se 1
+arbitr degr 1
+arbitr dest 1
+arbitr dest se 1
+arbitr df 1
+arbitr df accept 1
+arbitr dialog 1
+arbitr docum 1
+arbitr edg 1
+arbitr el 2
+arbitr enrichm 1
+arbitr environm 1
+arbitr ext 1
+arbitr far apart 1
+arbitr hid 1
+arbitr hid nod 1
+arbitr impl 1
+arbitr implem 1
+arbitr ind 1
+arbitr influ 1
+arbitr integer 1
+arbitr interconnect 1
+arbitr interconnect mem 1
+arbitr interconnect network 1
+arbitr intern 1
+arbitr intern nod 1
+arbitr larg cluster 2
+arbitr learn 1
+arbitr learn algorithm 1
+arbitr length 2
+arbitr length me 2
+arbitr loc 1
+arbitr loc object 1
+arbitr log 1
+arbitr log program 1
+arbitr low 1
+arbitr low siz 1
+arbitr man appl 1
+arbitr man com 1
+arbitr measur 1
+arbitr mixf 1
+arbitr mixf not 1
+arbitr modif 1
+arbitr morph 1
+arbitr mult 1
+arbitr mult step 1
+arbitr multicast 1
+arbitr multicast dest 1
+arbitr network 3
+arbitr network topolog 1
+arbitr nod 1
+arbitr nonneg 1
+arbitr nonneg integer 1
+arbitr norm 1
+arbitr number 10
+arbitr object 1
+arbitr on succeed 1
+arbitr order 2
+arbitr part 2
+arbitr part order 1
+arbitr period 1
+arbitr phy 1
+arbitr phy network 1
+arbitr pij 1
+arbitr pij valu 1
+arbitr point 1
+arbitr polygon 1
+arbitr polyhedr 1
+arbitr polynom 2
+arbitr polynom constraint 1
+arbitr power 1
+arbitr power adver 1
+arbitr problem 1
+arbitr problem specif 1
+arbitr proc 3
+arbitr proc arriv 1
+arbitr proc network 1
+arbitr proposit 1
+arbitr q1 1
+arbitr r0 1
+arbitr reason 1
+arbitr reduc 1
+arbitr reduc deriv 1
+arbitr reg 1
+arbitr regl 1
+arbitr regl langu 1
+arbitr repr 1
+arbitr row 1
+arbitr satisf 1
+arbitr se 1
+arbitr sequ 1
+arbitr ser 2
+arbitr ser order 2
+arbitr shap 1
+arbitr siz 2
+arbitr slow 1
+arbitr smal const 1
+arbitr smal valu 1
+arbitr span 1
+arbitr span tr 1
+arbitr spar 1
+arbitr spar pattern 1
+arbitr specif 1
+arbitr specif pair 1
+arbitr st 1
+arbitr t00 1
+arbitr task 1
+arbitr task specif 1
+arbitr term 1
+arbitr thr dim 1
+arbitr tim 1
+arbitr topolog 3
+arbitr topolog network 1
+arbitr us 1
+arbitr user 1
+arbitr valu 2
+arbitr ver 1
+arbitr wor 1
+arbitr word 1
+arbitr x0 1
+arbitr1 1
+arbitr1 modif 1
+arbitrair 3
+arbitrair et lop 1
+arbitrair x1 1
+arbor 3
+arboresc 3
+arboresc in gd 1
+arboresc of weight 1
+arboresc root 2
+arboresc search 1
+arboresc search algorithm 1
+arboresc to ch 1
+arboresc we find 1
+arboresc wil us 1
+arboresc.g 1
+arbr 4
+arbr avec 1
+arbr de 2
+arbr de condit 1
+arbr de recherch 1
+arbr dinterpr 1
+arbr dinterpr tat 1
+arbr est 1
+arbr est construit 1
+arbr r esult 1
+arbr sld 1
+arc 10
+arc ar drawn 1
+arc ar requir 1
+arc con 1
+arc con algorithm 1
+arc du 1
+arc entr 1
+arc entr plac 1
+arc for input 1
+arc gener 1
+arc gener du 1
+arc of parabol 1
+arc procedur 1
+arc procedur red 1
+arc92 1
+arccon 1
+arccon in respect 1
+arch 2
+arch and www 1
+arch approach 1
+arch approach se 1
+archetyp 1
+archibald 1
+archictectur 1
+archictectur comp 1
+architect 5
+architect and compiler 1
+architect design 1
+architect diff 1
+architect diff erent 1
+architect seem 1
+architect should consider 1
+architect to an 1
+architectu 1
+architectur 62
+architectur a pil 1
+architectur adv 1
+architectur affect 1
+architectur allow 1
+architectur altern 1
+architectur alw contain 1
+architectur and algorithm 1
+architectur and describ 1
+architectur and experim 1
+architectur and implem 1
+architectur and langu 1
+architectur and learn 1
+architectur and mach 1
+architectur and measur 1
+architectur and mechan 1
+architectur and model 1
+architectur and parallel 2
+architectur and protocol 1
+architectur and softwar 1
+architectur approach 1
+architectur ar cur 2
+architectur ar deriv 1
+architectur ar disc 1
+architectur ar evalu 1
+architectur ar gener 1
+architectur ar outperform 1
+architectur ar poor 1
+architectur ar pr 1
+architectur assessm 1
+architectur av 1
+architectur av resort 1
+architectur ba 1
+architectur ba avion 1
+architectur befor compar 1
+architectur can deliver 1
+architectur ch 1
+architectur character 2
+architectur characterest 2
+architectur comb 2
+architectur comprom 2
+architectur comput 1
+architectur comput system 1
+architectur configur 1
+architectur configur deriv 1
+architectur correspon 1
+architectur de 2
+architectur de syst 1
+architectur de typ 1
+architectur denot 1
+architectur design 5
+architectur design skel 1
+architectur detrim 1
+architectur diagram 1
+architectur difficult 1
+architectur don 1
+architectur don ee 1
+architectur dun 1
+architectur dun mach 1
+architectur en 2
+architectur en pr 1
+architectur environm 1
+architectur evalu 2
+architectur exhibit 1
+architectur facilit 2
+architectur facilit softwar 1
+architectur featur 2
+architectur for crossbar 1
+architectur for dat 2
+architectur for distribut 1
+architectur for eff 1
+architectur for fast 1
+architectur for futur 1
+architectur for geograph 1
+architectur for gh 1
+architectur for implem 3
+architectur for infer 1
+architectur for integr 1
+architectur for intellig 1
+architectur for isol 1
+architectur for multiproc 1
+architectur for parallel 2
+architectur for prolog 1
+architectur for server 1
+architectur for transact 1
+architectur framework 1
+architectur ge 1
+architectur giv 1
+architectur ha caus 1
+architectur ha emerg 1
+architectur harvard 1
+architectur id 1
+architectur ident 1
+architectur impedim 1
+architectur implem 1
+architectur implem eff 1
+architectur inclus 1
+architectur indep 1
+architectur is common 1
+architectur is disc 1
+architectur is repl 1
+architectur is simil 1
+architectur issu 1
+architectur le attract 1
+architectur level 1
+architectur lim 1
+architectur m emoir 1
+architectur mad 2
+architectur manu 1
+architectur may help 1
+architectur mimd 1
+architectur mimd se 1
+architectur mismatch 1
+architectur mismatch difficult 1
+architectur mismatch exper 1
+architectur mismatch identif 1
+architectur model 3
+architectur model mak 1
+architectur moin 1
+architectur moin sensibl 1
+architectur mult 1
+architectur mult processeur 1
+architectur multiprocesseur 1
+architectur new 2
+architectur num 1
+architectur of comput 1
+architectur of dynam 1
+architectur of parallel 1
+architectur offer 1
+architectur on parallel 1
+architectur onl construc 1
+architectur ont 1
+architectur overview 4
+architectur par 2
+architectur par el 2
+architectur par la 1
+architectur parameter 2
+architectur perm 1
+architectur perm de 1
+architectur physiqu 1
+architectur physiqu distribu 1
+architectur problem 1
+architectur project 1
+architectur project manag 1
+architectur prop 1
+architectur prov 3
+architectur prov addit 1
+architectur prov extrem 1
+architectur reduc 2
+architectur reduc memor 1
+architectur rel 1
+architectur requir 4
+architectur resembl 1
+architectur resembl verif 1
+architectur ser 1
+architectur ser retenu 1
+architectur shar 1
+architectur shar memor 1
+architectur simd 1
+architectur simd spmd 1
+architectur siml 2
+architectur siml testb 1
+architectur sont 1
+architectur sont faibl 1
+architectur st 1
+architectur stanc 1
+architectur standard 1
+architectur standard nest 1
+architectur structur 2
+architectur support 8
+architectur support unicast 1
+architectur team 1
+architectur techniqu 2
+architectur th wam 1
+architectur that inclus 1
+architectur that support 2
+architectur through custom 1
+architectur to addr 1
+architectur to ensur 1
+architectur to impl 1
+architectur to support 1
+architectur under technolog 2
+architectur us 1
+architectur using 2
+architectur using platform 1
+architectur using unidirect 1
+architectur ver simil 1
+architectur wa ch 1
+architectur wa origin 1
+architectur we prop 1
+architectur which com 1
+architectur which reduc 1
+architectur which support 1
+architectur with differ 1
+architectur with hid 1
+architectur with output 1
+architectur with var 1
+architectur with wormhol 1
+architectur with writ 1
+architectur would mak 1
+architectureindep 1
+architecur 3
+archiv 5
+archiv and inform 1
+archiv fil 1
+archiv for futur 1
+archiv mater 1
+archiv whil tran 1
+archiwum 1
+archiwum informatyk 1
+archiwum informatyk teoretycznej 1
+ardu 1
+ardu suiv 1
+ardu suiv le 1
+aren 3
+aren of cur 1
+aren of imag 1
+arenskou 1
+arg 9
+arg and argj 1
+arg car 1
+arg car le 1
+arg inf 1
+arg inf m2mk 1
+arg inf m2mkng 1
+arg input 1
+arg le 1
+arg le vecteur 1
+arg me 1
+arg next arg 1
+arg output 1
+arg r argj 1
+arg sum 1
+arg0 1
+arg0 r1 1
+arg0 r1 arg1 1
+arg1 4
+arg1 cl 1
+arg1 contain 1
+arg1 object 1
+arg1 r2 1
+arg2 3
+arg2 cl 1
+arg2 contain 1
+arg3 2
+argarw 1
+argc 1
+argj 1
+argj it argum 1
+argn 1
+argon 1
+argon nat 1
+argon nat labor 1
+argu 19
+argu as follow 1
+argu th import 1
+argu that crash 1
+argu that decl 1
+argu that divid 1
+argu that eval 1
+argu that scal 1
+argu that2 1
+argu that2 de 1
+argu why 1
+argu with death 1
+argum 51
+argum a cl 1
+argum a condit 1
+argum a key 1
+argum a log 1
+argum a1 2
+argum accumulerait 1
+argum accumulerait un 1
+argum agr 1
+argum ai 1
+argum ain 1
+argum ain qu 1
+argum al appl 1
+argum al show 1
+argum alt 1
+argum alt repr 1
+argum and denot 1
+argum and inst 1
+argum and replac 1
+argum and result 2
+argum and return 1
+argum and writ 1
+argum ar bound 1
+argum ar ch 1
+argum ar giv 2
+argum ar pr 1
+argum ar restrict 1
+argum ar standard 1
+argum arg 1
+argum argum 1
+argum as giv 1
+argum au 1
+argum au dern 1
+argum au pr 1
+argum au som 1
+argum befor ch 1
+argum befor look 1
+argum belong 1
+argum bind 1
+argum can rang 1
+argum car 1
+argum cl 1
+argum cl involut 1
+argum classiqu 1
+argum classiqu en 1
+argum combinatoir 1
+argum combinatoir tr 1
+argum con 1
+argum con ecutif 1
+argum constraint 1
+argum constraint ap 1
+argum constraint assoc 1
+argum constraint behav 1
+argum constraint satisf 1
+argum constraintsg 1
+argum correspon 1
+argum correspon du 1
+argum dan 1
+argum dan la 1
+argum dan le 1
+argum dappel 1
+argum de 1
+argum de ce 1
+argum de combiner 1
+argum de expr 1
+argum de la 1
+argum de lappel 1
+argum de memberchk 1
+argum de point 1
+argum de pr 1
+argum de qsort 1
+argum deb 1
+argum dentr 1
+argum dentr ee 1
+argum determin 1
+argum discrimin 1
+argum doit 1
+argum doit etr 1
+argum doiv 1
+argum doiv etr 1
+argum du 1
+argum du pr 1
+argum du term 1
+argum dun 1
+argum dun term 1
+argum ei 1
+argum en 1
+argum en ca 1
+argum en un 1
+argum encod 1
+argum est 1
+argum est alor 1
+argum est en 1
+argum est un 1
+argum et de 1
+argum et inform 1
+argum et le 1
+argum etant 1
+argum etant examin 1
+argum fail 2
+argum fic 1
+argum for equ 1
+argum for part 1
+argum for prefer 1
+argum for prov 1
+argum ge 1
+argum giv 1
+argum hold 1
+argum iff 1
+argum in addit 1
+argum in lem 1
+argum in sect 1
+argum in stack 1
+argum in support 1
+argum inhabit 1
+argum inhabit s1 1
+argum instead 1
+argum is char 1
+argum is execut 1
+argum is method 1
+argum is opt 1
+argum is se 1
+argum is smaller 1
+argum is suppl 1
+argum is t2 1
+argum is unif 1
+argum la 1
+argum la var 1
+argum last backtrack 1
+argum le 1
+argum level 1
+argum list 2
+argum method 1
+argum method nam 1
+argum modif 1
+argum modif es 1
+argum mov 1
+argum ne 1
+argum ne doiv 1
+argum ne peut 1
+argum ne sont 1
+argum next method 1
+argum ni 1
+argum ni le 1
+argum obj1 1
+argum of ap 1
+argum of asser 1
+argum of funct 1
+argum of inherit 1
+argum of theorem 1
+argum of typ 1
+argum ont 1
+argum oper 1
+argum ordinair 1
+argum ou 1
+argum ou du 1
+argum ou un 1
+argum overlap 1
+argum pa 4
+argum pa purp 1
+argum pa sequ 1
+argum pa straightfor 1
+argum parallel 1
+argum peut 1
+argum peut alor 1
+argum peut ne 1
+argum point 1
+argum posit 1
+argum pour 1
+argum pour construir 1
+argum prec 1
+argum prec order 1
+argum probabil 1
+argum prov 1
+argum register 2
+argum restaurer 1
+argum return 1
+argum return pointer 1
+argum sauvegard 1
+argum sauvegard es 1
+argum simil 1
+argum soient 1
+argum soient restaur 1
+argum soit 1
+argum soit dan 1
+argum soit pr 1
+argum sont 1
+argum sont aus 1
+argum sont de 1
+argum sont restaur 1
+argum substitut 1
+argum suppl 2
+argum suppl ementair 1
+argum tak 1
+argum temporair 1
+argum temporair couvr 1
+argum temporair ne 1
+argum term 2
+argum th cl 1
+argum th result 1
+argum that follow 1
+argum ti 1
+argum to catg 1
+argum to cr 1
+argum to follow 1
+argum to justif 1
+argum to non 1
+argum to pa 1
+argum to recur 1
+argum to spec 1
+argum typ 2
+argum typ annot 1
+argum using 1
+argum using lem 1
+argum util 1
+argum util es 1
+argum valu 2
+argum var 1
+argum var bind 1
+argum wh result 1
+argum which default 1
+argum whil ignor 1
+argum.we 1
+argum2 1
+argus 1
+argv 1
+argyl 1
+argyl and cook 1
+ariav 1
+aristotl 1
+arit 1
+arit e agenc 1
+arit e dan 1
+arit e de 1
+arit e est 1
+arit e instruc 1
+arit e peut 1
+arith 1
+arith tot 1
+arith tot boyer 1
+arithm 19
+arithm and log 1
+arithm and simpler 1
+arithm ar mi 1
+arithm calcl 1
+arithm compil 1
+arithm condit 1
+arithm condit div 1
+arithm constraint 1
+arithm del 1
+arithm encod 1
+arithm equ 1
+arithm equiv 1
+arithm equiv propag 1
+arithm etiqu 3
+arithm etiqu conduit 1
+arithm etiqu de 1
+arithm etiqu en 1
+arithm etiqu entr 1
+arithm etiqu est 1
+arithm etiqu ne 1
+arithm etiqu peut 1
+arithm etiqu pr 1
+arithm etiqu qu 1
+arithm etiqu repr 1
+arithm etiqu sp 1
+arithm etiqu util 1
+arithm exampl 1
+arithm expr 1
+arithm geometer 1
+arithm geometer mean 1
+arithm in lin 1
+arithm instruc 1
+arithm oper 10
+arithm oper etc 1
+arithm oper lead 1
+arithm oz 1
+arithm oz propag 1
+arithm pr 1
+arithm progr 1
+arithm wh 1
+arithm with recur 1
+arizon 6
+arizon st 2
+arkan 1
+arkin 1
+arm 7
+arm appl 1
+arm appl av 1
+arm cecom 1
+arm high perform 3
+arm io 1
+arm io seek 1
+arm research 3
+arm research labor 2
+arm research off 2
+armstrong 1
+armstrong axiom 1
+armstrong axiomat 1
+arnaudon 1
+arnlund 2
+arnold 1
+arnon 1
+arnon coh 1
+arnould 1
+aror 3
+aror and goud 1
+aror and padusk 1
+arp 10
+arp cach 1
+arp contract 1
+arp contract dabt 1
+arp onr 1
+arp order 5
+arp resolut 1
+arp resolut me 1
+arpac 1
+arpanet 1
+arpanet rout 1
+arpanet rout algorithm 1
+arpanet rout meter 1
+arrang 19
+arrang along straight 1
+arrang and templ 1
+arrang ar decl 1
+arrang ar rectangl 1
+arrang by parameter 1
+arrang for interconnect 1
+arrang group 1
+arrang horizont 1
+arrang in modl 1
+arrang in sort 1
+arrang is real 1
+arrang of interswitch 1
+arrang of lec 1
+arrang of nod 1
+arrang of switch 1
+arrang our sampl 1
+arrang reduc 1
+arrang th displ 1
+arrang th member 1
+arrang th multicast 1
+arrang th nod 1
+arrang wh 1
+arrest 1
+arrest sc 1
+arrest scen 1
+arrest th passenger 1
+arrhythm 1
+arrhythm from symbol 1
+arriv 19
+arriv after tim 1
+arriv and continu 1
+arriv and simultan 1
+arriv at fi 1
+arriv at prim 1
+arriv bar 1
+arriv for connect 1
+arriv from se 1
+arriv funct 1
+arriv inclus 1
+arriv is appl 1
+arriv multidest 1
+arriv multidest worm 1
+arriv near 1
+arriv near synchron 1
+arriv of confid 1
+arriv of se 1
+arriv or ge 1
+arriv order 1
+arriv order4 1
+arriv pack 1
+arriv pattern 1
+arriv pffq 1
+arriv pffq scfq 1
+arriv ph 1
+arriv rat 2
+arriv serv 1
+arriv that contain 1
+arriv tim 1
+arriv worm 1
+arrivalr 1
+arriver 1
+arriver qu 1
+arriver qu certain 1
+arrow 17
+arrow from lastnod 1
+arrow in fig 1
+arrow kind 1
+arrow label 1
+arrow minim 1
+arrow minim typ 1
+arrow on figur 1
+arrow qsort 1
+arrow qsort nod 1
+arrow repr 1
+arrow repr fac 1
+arrow typ 1
+arrow typ embod 1
+arrow typ t1 1
+art 22
+art and ai 1
+art and artif 1
+art and designer 1
+art and sc 1
+art approach 1
+art compiler 1
+art compiler compiler 1
+art for us 1
+art if 1
+art if intellig 1
+art imag 1
+art imag archiv 1
+art imag datab 1
+art in adapt 1
+art in ar 1
+art in md 1
+art in tempor 1
+art md 1
+art md ba 1
+art memor 1
+art memor manag 1
+art method 1
+art museum 1
+art of appl 1
+art of computer 4
+art of grow 1
+art of prolog 1
+art of stat 1
+art or pract 1
+art order 1
+art order softwar 1
+artalej 1
+artefact 1
+artefact qu 1
+artefact qu perm 1
+arthur 2
+articl 13
+articl a character 1
+articl by mor 1
+articl est 1
+articl est de 1
+articl form 1
+articl in multipl 1
+articl is avail 1
+articl num 1
+articl reflect 1
+articl wa proc 1
+artif 37
+artif agent 1
+artif creat 1
+artif creat bump 1
+artif gener 1
+artif hyster 1
+artif hyster bin 1
+artif incr 1
+artif incr datab 1
+artif inject 1
+artif inject fault 1
+artif inser 1
+artif intellig 26
+artif intellig appl 1
+artif intellig approach 1
+artif intellig commun 1
+artif intellig field 1
+artif intellig iv 1
+artif intellig labor 1
+artif intellig method 1
+artif intellig research 4
+artif intellig ser 1
+artif intellig techniqu 1
+artif lif 1
+artif lif ii 1
+artif neur 5
+artif neur network 5
+artif nonlin 1
+artif nonlin system 1
+artif percept 1
+artif system 2
+artifact 7
+artifact and improv 1
+artifact ar great 1
+artifact ar rel 1
+artifact as memor 1
+artifact assoc 1
+artifact from blcok 1
+artifact in transform 1
+artifact of blcok 1
+artifact reduc 1
+artifact result 1
+artifact user 1
+artifact using 1
+artifact wer repr 1
+artificiel 2
+artificiel unimodulair 1
+artioc 1
+artioc intellig 1
+artioc vi 1
+artmentlistdepartmentsemployeefulltimeparttimesalarynam 1
+arun 1
+arun et al 1
+arv 1
+arv is greater 1
+arvind 2
+ary 12
+ary argum 1
+ary argum constraint 1
+ary constraint 1
+ary funct 3
+ary funct belong 1
+ary funct symbol 1
+ary funct uk 1
+ary n cub 4
+ary ncub 3
+ary ncub cluster 3
+ary nod 1
+ary oper 1
+ary oper rang 1
+ary pr 1
+ary pr symbol 1
+ary rel 1
+ary rel nam 1
+ary td 1
+ary tr 1
+as 30
+as a rol 1
+as a tool 1
+as an architectur 1
+as and flaw 1
+as ba 1
+as begin 1
+as begin fnam 1
+as bin 1
+as bin grammar 1
+as bin hom 1
+as cach 1
+as cach coh 1
+as chip 1
+as confid 1
+as confid obtain 1
+as en 1
+as for program 1
+as implem 1
+as in design 2
+as in solut 1
+as in term 1
+as learn1 1
+as me 1
+as me pa 1
+as natur 1
+as net 1
+as net sit 1
+as offer 1
+as pacif 1
+as pacif softwar 1
+as path 1
+as schem 1
+as technolog 1
+as test 1
+as test strateg 1
+as th cap 1
+as th effect 1
+as th perform 2
+as th reader 1
+as their relationship 1
+as tomograph 1
+as whether lesson 1
+as0 1
+as00 1
+as1 1
+as1 is an 1
+as2 1
+as2cal 1
+as2cal cs3cal 1
+as2cal cs3cal bexit 1
+as3 1
+as4cal 1
+as4cal c exit 1
+as92 1
+as94 2
+asakaw 1
+asap 1
+asap and alap 1
+asap tim 1
+asap valu 1
+asbt 1
+asc 4
+asc fil 1
+asc lin 1
+asc lin feed 1
+asc syntac 1
+ascertain 3
+ascertain hemingwayesqu 1
+ascertain hemingwayesqu attribut 1
+ascertain when bar 1
+ashb 1
+ashcraft 1
+ashcraft and joseph 1
+ashcraft and liu 1
+ashcroft 1
+ashh88 1
+ashish 1
+ashish singh 1
+ashish.singh 1
+ashish.singh uiuc.edu 1
+ashish.singh uiuc.edu yaddr 1
+ashok 1
+ashok agraw 1
+ashsid 1
+ashwin 1
+ashwin cc.gatech.edu 1
+ashwin cc.gatech.edu georg 1
+ashwin ram 1
+ashwin ram cox 1
+asiapacif 1
+asiapacif workshop 1
+asid 4
+asid in 1
+asid in techn 1
+ask 29
+ask a librar 1
+ask a quest 1
+ask about program 1
+ask and awk 1
+ask and remain 1
+ask appl 1
+ask ar an 1
+ask for help 2
+ask for opin 1
+ask for unif 1
+ask interact 1
+ask it succ 1
+ask it superobject 1
+ask j ye 1
+ask m good 1
+ask prim 1
+ask quest 1
+ask quest ye 1
+ask stud 2
+ask succ 1
+ask suppl 1
+ask suppl quest 1
+ask th fin 1
+ask th ml 1
+ask th owner 1
+ask th quest 2
+ask th reader 1
+ask th system 1
+ask th user 1
+ask to compl 1
+ask to def 1
+ask to determin 1
+ask to fil 1
+ask to speak 1
+ask tw fundam 1
+ask user 1
+ask why 1
+ask wil start 1
+askfor 1
+askfor monit 1
+asl90 1
+aslan 1
+asleep 1
+aslup 1
+asm 1
+asmus 1
+asmus freytag 1
+asoc 1
+asp 1
+aspect 49
+aspect allow 1
+aspect although multimod 1
+aspect and account 1
+aspect ba 1
+aspect ba niveau 1
+aspect de 2
+aspect de la 2
+aspect deal 1
+aspect describ 1
+aspect dimpl 1
+aspect dimpl em 1
+aspect du 1
+aspect du cacl 1
+aspect ducatif 1
+aspect fondam 1
+aspect fondam de 1
+aspect import 1
+aspect import de 1
+aspect in appl 1
+aspect of adapt 1
+aspect of cach 1
+aspect of comput 2
+aspect of computer 3
+aspect of constraint 2
+aspect of datab 2
+aspect of frequ 1
+aspect of group 1
+aspect of inform 1
+aspect of interact 1
+aspect of intern 1
+aspect of learn 1
+aspect of mark 1
+aspect of network 1
+aspect of object 2
+aspect of ol 1
+aspect of oop 1
+aspect of parallel 2
+aspect of perform 1
+aspect of precc 1
+aspect of prolog 1
+aspect of re 1
+aspect of requir 1
+aspect of rol 1
+aspect of softwar 1
+aspect of st 1
+aspect of system 1
+aspect of thinglab 1
+aspect of tim 1
+aspect of typ 1
+aspect of using 1
+aspect of vct 1
+aspect of wavel 1
+aspect op 1
+aspect op erationnel 1
+aspect positif 1
+aspect positif est 1
+aspect propr 1
+aspect propr aux 1
+aspect quil 1
+aspect quil ser 1
+aspect rat 1
+aspect refer 1
+aspect softwar 1
+aspect softwar allow 1
+aspect th 1
+aspect th oriqu 1
+aspect that challeng 1
+aspect that dec 1
+aspect to implem 1
+aspect to purer 1
+aspect tr 1
+aspect tr es 1
+aspect trait 1
+aspect trait de 1
+aspect which captur 1
+aspin 1
+aspin and adr 1
+aspl 3
+aspl ii 1
+aspl vi 2
+aspl vi architectur 1
+asproc 1
+asproc approach 1
+aspv 1
+assemb 6
+assemb cod 1
+assemb cod account 1
+assemb langu 2
+assemb lin 2
+assemb lin control 1
+assemb lin problem 1
+assemb of dispar 1
+assemb program 1
+assemb program manu 1
+assembl 5
+assembl and compon 1
+assembl by savannah 1
+assembl int chunk 1
+assembl th entir 1
+assembl th pilot 1
+assembler 2
+assembler prov 1
+assembler prov recur 1
+assembler refer 1
+assembler refer manu 1
+assemblerlik 1
+assemblerlinkerprolog 1
+assemblerlinkerprolog compilerun 1
+asser 14
+asser an arrest 1
+asser and retract 1
+asser ar sibl 1
+asser de 1
+asser de bon 1
+asser de mauv 1
+asser del 1
+asser in conjunct 1
+asser is incorrect 1
+asser liv 1
+asser nod 1
+asser nod point 1
+asser nod verif 1
+asser of subst 1
+asser peut 1
+asser retract 1
+asser retract remain 1
+asser retract using 1
+asser sur 1
+asser sur lespac 1
+asser th equiv 1
+asser th fact 1
+asser that ident 1
+asser that oe 1
+asser that part 1
+assessm 8
+assessm abil 1
+assessm block 1
+assessm of ernest 1
+assessm of stud 1
+assessm proper 1
+assessm protocol 1
+assessm techniqu 1
+assessm using 1
+assessm using bin 1
+assessmentfeedback 1
+assessmentfeedback inputtargetoutput 1
+assessmentfeedback inputtargetoutput input 1
+assez 4
+assez ai 1
+assez ai ee 1
+assez bien 1
+assez co 1
+assez co uteux 1
+assez compl 1
+assez compl es 1
+assez complec 2
+assez epineux 1
+assez fa 1
+assez facil 1
+assez facil certain 1
+assez fort 1
+assez fort sur 1
+assez import 1
+assez import pour 1
+assez rar 1
+assez rar dan 1
+assez rich 1
+assez subtil 1
+assigm 1
+assigm of valu 1
+assign 52
+assign a distinct 1
+assign a dum 1
+assign a key 1
+assign a part 1
+assign a pot 1
+assign a privileg 1
+assign a se 1
+assign a truth 1
+assign a weight 1
+assign act 1
+assign act exp 1
+assign an iter 1
+assign an order 1
+assign and schedl 1
+assign any typ 1
+assign block 1
+assign by user 1
+assign chunk 1
+assign color 1
+assign differ tag 1
+assign disk 1
+assign disk loc 1
+assign each rectangl 1
+assign each shap 1
+assign each var 1
+assign each word 1
+assign el 1
+assign expr 1
+assign fact 1
+assign fact valu 1
+assign funct 1
+assign funct us 1
+assign high cost 1
+assign ip 1
+assign ip addr 1
+assign it explicit 1
+assign it prefer 1
+assign it privileg 1
+assign it serv 1
+assign label 1
+assign mean 1
+assign object 1
+assign object integer 1
+assign on color 1
+assign on rat 1
+assign pattern 1
+assign po 1
+assign prior 2
+assign prior ind 1
+assign probabil 1
+assign rel 1
+assign rel show 1
+assign respect 1
+assign respect privileg 1
+assign revok 1
+assign rol 1
+assign row 1
+assign sem 1
+assign ssn 1
+assign ssn count 1
+assign subject 1
+assign substr 1
+assign th appropr 1
+assign th block 1
+assign th cod 1
+assign th correct 1
+assign th el 1
+assign th empt 1
+assign th group 1
+assign th highest 2
+assign th intersect 1
+assign th iter 1
+assign th privileg 1
+assign th proper 1
+assign th record 1
+assign th remain 1
+assign th root 1
+assign th se 1
+assign th uniqu 1
+assign th valu 3
+assign th xi 1
+assign that us 1
+assign then begin 1
+assign ti 1
+assign to act 1
+assign to buck 1
+assign to ck 1
+assign to cluster 1
+assign to pe 1
+assign to proc 3
+assign to rol 1
+assign to variabl 2
+assign uniqu 1
+assign uniqu number 1
+assign vot 1
+assign w1 1
+assign w1 w10 1
+assign wh 1
+assign wh ratingt 1
+assign wh typ 1
+assign zer 1
+assign zer weight 1
+assignedr 1
+assignedt 1
+assignedttl 1
+assignm 35
+assignm algorithm 1
+assignm and collect 1
+assignm and distribut 1
+assignm and part 1
+assignm ar compar 1
+assignm ar equ 1
+assignm ar mad 1
+assignm ar smaller 1
+assignm ar solut 1
+assignm between ar 1
+assignm for order 1
+assignm found 1
+assignm gu 1
+assignm hav equ 1
+assignm iff 1
+assignm iff constraint 1
+assignm introduc 1
+assignm is ad 1
+assignm is defin 1
+assignm is encounter 1
+assignm is perform 1
+assignm is straight 1
+assignm obtain 1
+assignm of act 1
+assignm of color 1
+assignm of fact 1
+assignm of hid 1
+assignm of integer 1
+assignm of job 1
+assignm of privileg 1
+assignm of valu 2
+assignm of ys 1
+assignm oper 2
+assignm oper modif 1
+assignm or revoc 1
+assignm problem 2
+assignm rl 1
+assignm sem 1
+assignm sequ 1
+assignm stat 2
+assignm strateg 1
+assignm t fl 1
+assignm t fx 1
+assignm that assoc 1
+assignm that imp 1
+assignm that mak 1
+assignm to fact 1
+assignm to shar 1
+assignm using 1
+assignm using search 1
+assignm wel typ 1
+assimil 3
+assimil es 1
+assimil rev 1
+assler 1
+assm 1
+assm and correspon 1
+assm ar equiv 1
+assm by merg 1
+assm is extract 1
+assm to ch 1
+assm with learn 1
+assoc 93
+assoc 2d 1
+assoc 2d scal 1
+assoc a chaqu 1
+assoc a configur 1
+assoc a failur 1
+assoc a loc 1
+assoc a posit 1
+assoc a proc 1
+assoc a propag 1
+assoc a se 1
+assoc a vect 1
+assoc a ver 1
+assoc acc 1
+assoc acc control 1
+assoc adv 1
+assoc al decl 1
+assoc al path 1
+assoc algorithm 1
+assoc an auxil 1
+assoc an input 1
+assoc and reflec 1
+assoc ar remov 1
+assoc be compl 1
+assoc between pair 1
+assoc between symptom 1
+assoc between vi 1
+assoc cach 1
+assoc candid 1
+assoc candid rl 1
+assoc centr 1
+assoc centr buffer 1
+assoc chunk 1
+assoc chunk displ 1
+assoc cl 1
+assoc classif 1
+assoc classif problem 1
+assoc cluster 2
+assoc cluster siz 2
+assoc com 1
+assoc commun 2
+assoc commun mask 1
+assoc commun path 1
+assoc commut 2
+assoc commut oper 2
+assoc commut theor 1
+assoc constraint 1
+assoc constraint satisf 1
+assoc correct 1
+assoc cost 1
+assoc count 1
+assoc count valu 1
+assoc counter 1
+assoc cur 1
+assoc cycl 1
+assoc cycl length 1
+assoc deduc 1
+assoc deduc mechan 1
+assoc degr 1
+assoc del 1
+assoc dep 1
+assoc dep inform 1
+assoc dut 1
+assoc dut requir 1
+assoc e au 3
+assoc e est 1
+assoc e sont 1
+assoc each decl 1
+assoc edg 1
+assoc edg collap 1
+assoc ee 3
+assoc ee au 1
+assoc ee aux 2
+assoc entr 1
+assoc entr pag 1
+assoc error 1
+assoc es 3
+assoc es aux 1
+assoc estampil 1
+assoc execut 1
+assoc expr 1
+assoc featur 1
+assoc for comput 6
+assoc funct 1
+assoc gener 1
+assoc gener tupl 1
+assoc ghost 1
+assoc ghost list 1
+assoc ghost oe 1
+assoc grad 1
+assoc grad evalu 1
+assoc graph 2
+assoc homonym 1
+assoc homonym rl 1
+assoc imag 1
+assoc impl 1
+assoc impl graph 1
+assoc ind 1
+assoc ind dep 1
+assoc inform 1
+assoc introspect 1
+assoc introspect oper 1
+assoc is check 1
+assoc is mean 1
+assoc la 2
+assoc la suit 1
+assoc la valeur 1
+assoc learn 1
+assoc learn strateg 1
+assoc lec 1
+assoc lec frequ 1
+assoc link 1
+assoc list 1
+assoc ma 1
+assoc manifest 1
+assoc may becom 1
+assoc may eventu 1
+assoc memor 2
+assoc model 1
+assoc modl 1
+assoc mov 1
+assoc neur 1
+assoc neur memor 1
+assoc object 1
+assoc observ 1
+assoc oe 1
+assoc of ip 1
+assoc of theor 1
+assoc oper 3
+assoc p plan 1
+assoc p.ai 1
+assoc perform 1
+assoc perform benefit 1
+assoc port 1
+assoc prior 1
+assoc prior prob 1
+assoc privileg 1
+assoc prob 1
+assoc prob distribut 1
+assoc proc 1
+assoc prof 1
+assoc reason 1
+assoc refin 1
+assoc refin calculus 1
+assoc rel 1
+assoc repr 1
+assoc respon 1
+assoc result 1
+assoc rl 2
+assoc rol 1
+assoc rol graph 1
+assoc rout 1
+assoc schem 1
+assoc se 1
+assoc search 1
+assoc secur 1
+assoc secur pol 1
+assoc sequ 1
+assoc shap 1
+assoc softwar 1
+assoc softwar tool 1
+assoc som proc 1
+assoc start 2
+assoc stat 1
+assoc tag 1
+assoc th input 1
+assoc th text 1
+assoc theor 1
+assoc tim 1
+assoc tim valu 1
+assoc timestamp 1
+assoc to dec 1
+assoc to st 1
+assoc typ 1
+assoc typ inform 1
+assoc un nid 1
+assoc valu 3
+assoc valu appl 1
+assoc weight 1
+assoc weight w1 1
+assoc with acquir 1
+assoc with agent 1
+assoc with ar 1
+assoc with cl 1
+assoc with constraint 1
+assoc with dat 1
+assoc with ge 1
+assoc with growth 2
+assoc with host 1
+assoc with implem 1
+assoc with indep 1
+assoc with iter 1
+assoc with me 1
+assoc with mult 1
+assoc with n1 1
+assoc with nod 1
+assoc with obj 1
+assoc with output 1
+assoc with particl 1
+assoc with path 1
+assoc with pi 1
+assoc with proc 2
+assoc with qp 1
+assoc with s5 1
+assoc with s5a 1
+assoc with slot 1
+assoc with specif 1
+assoc with splitter 1
+assoc with structur 1
+assoc with tool 1
+assoc with track 1
+assoc with ver 1
+assoc with xiu 1
+assoc. 1
+associat 2
+associat in order 1
+associat may allev 1
+assoupl 1
+assoupl du 1
+assoupl du protocol 1
+assouplir 1
+assouplir ce 1
+assp 4
+assr 1
+assr ssn 1
+assr ssn avg 1
+assr wh 1
+assr wh ratingu 1
+asst 1
+asst ssn 1
+asst ssn count 1
+asst wh 1
+asst wh typeu 1
+assttl 1
+assttl ssn 1
+assttl ssn avg 1
+assttl ssn count 1
+assttl wh 1
+assttl wh ratingu 1
+assuj 1
+assuj qu 1
+assum 113
+assum a 2d 2
+assum a bal 1
+assum a board 2
+assum a connect 1
+assum a const 2
+assum a fluid 1
+assum a form 1
+assum a lan 1
+assum a lin 1
+assum a pack 1
+assum a particl 1
+assum a pean 1
+assum a prior 2
+assum a proc 1
+assum a rich 1
+assum a se 1
+assum a sem 1
+assum a singl 1
+assum a spec 1
+assum a split 1
+assum a top 1
+assum a tr 1
+assum a writ 1
+assum a0 1
+assum about c1 1
+assum about commun 1
+assum about compon 1
+assum about correl 1
+assum about failur 1
+assum about g0 1
+assum about textu 1
+assum addr 1
+assum aj 1
+assum aj ln 1
+assum al connect 1
+assum al failur 1
+assum al stat 1
+assum allow 2
+assum an appl 1
+assum an infinit 2
+assum an inst 1
+assum an opt 1
+assum and forg 1
+assum and parameter 1
+assum and prov 1
+assum any indirect 1
+assum any typ 1
+assum appropr 1
+assum appropr dat 1
+assum ar invok 1
+assum ar mad 1
+assum better ind 1
+assum by exclus 1
+assum by ignor 1
+assum by select 1
+assum compl 1
+assum condit 1
+assum const 2
+assum const me 1
+assum discr 1
+assum discr tim 1
+assum ea 1
+assum ea tel 1
+assum each board 2
+assum each compon 1
+assum each pointer 1
+assum execut 1
+assum execut tim 1
+assum famil 4
+assum fl 1
+assum fl keep 1
+assum for contradict 1
+assum for exampl 1
+assum for react 1
+assum for rel 1
+assum for simpl 2
+assum fu0 1
+assum further 1
+assum giv 1
+assum giv satisfact 1
+assum henceforth 1
+assum hold 1
+assum increm 1
+assum increm compil 1
+assum init 1
+assum input 1
+assum input port 1
+assum is ba 1
+assum is cruc 1
+assum is justif 1
+assum is nec 1
+assum is remov 1
+assum is satisf 1
+assum is val 1
+assum jobj 1
+assum known 1
+assum lin 1
+assum lin speedup 1
+assum link 1
+assum link hc 1
+assum mad 2
+assum multicast 1
+assum multicast support 1
+assum nest 1
+assum no 1
+assum no congest 1
+assum no fr 1
+assum no me 1
+assum no nl 1
+assum nonneg 1
+assum of exact 1
+assum of fair 1
+assum of perfect 1
+assum of topolog 1
+assum on m1 1
+assum on underl 1
+assum p1 1
+assum p1 crash 1
+assum pb5 1
+assum perfect 1
+assum perfect alignm 1
+assum pr 1
+assum run 1
+assum run tim 1
+assum seem 2
+assum simultan 1
+assum simultan upd 1
+assum som famil 2
+assum tacc 1
+assum tag 1
+assum tag dat 1
+assum th ar 2
+assum th centr 1
+assum th cl 1
+assum th claim 1
+assum th cluster 1
+assum th cost 1
+assum th ec 5
+assum th en 1
+assum th environm 1
+assum th former 1
+assum th input 1
+assum th inter 1
+assum th loc 1
+assum th maxim 1
+assum th network 1
+assum th nod 1
+assum th po 1
+assum th rat 1
+assum th reader 2
+assum th segm 1
+assum th standard 1
+assum th strateg 1
+assum th us 1
+assum th usu 1
+assum that act 1
+assum that ai 1
+assum that bus 1
+assum that c1 1
+assum that cfg 1
+assum that cluster 2
+assum that compar 1
+assum that connect 1
+assum that consecut 1
+assum that deal 1
+assum that dist 1
+assum that distinct 1
+assum that dom 1
+assum that el 1
+assum that failur 1
+assum that funct 1
+assum that g0 1
+assum that gi 1
+assum that ind 1
+assum that init 1
+assum that input 2
+assum that invar 1
+assum that jej 1
+assum that jobj 1
+assum that link 1
+assum that lock 1
+assum that log 1
+assum that loop 1
+assum that m0 1
+assum that mgu 1
+assum that mov 1
+assum that multidest 1
+assum that oe 1
+assum that p1 1
+assum that pack 1
+assum that point 1
+assum that posit 1
+assum that precipit 1
+assum that proc 3
+assum that ps 1
+assum that quantif 1
+assum that record 1
+assum that report2b 1
+assum that request 1
+assum that se 1
+assum that server 1
+assum that shap 1
+assum that si 1
+assum that simp 1
+assum that sk 1
+assum that softwar 1
+assum that stat 1
+assum that t1 1
+assum that traff 1
+assum that transact 1
+assum that ublog 1
+assum that ui 1
+assum that understand 1
+assum that upd 1
+assum that user 1
+assum that ver 1
+assum that vi 1
+assum to crash 1
+assum to deal 1
+assum to der 2
+assum to remain 2
+assum to repeat 1
+assum to sen 1
+assum to stand 1
+assum tw pack 1
+assum underl 1
+assum underl fl 1
+assum unlim 1
+assum unlim number 1
+assum using 1
+assum using opt 1
+assum w.l.o.g 2
+assum wa disc 1
+assum we ap 1
+assum we ge 1
+assum we know 1
+assum we want 1
+assum weak 1
+assum weak fair 1
+assum wel form 1
+assum when interpr 1
+assum without lo 7
+assum x fx1 1
+assur 12
+assur about me 1
+assur con 1
+assur e quaucun 1
+assur ee 1
+assur ee par 1
+assur for maint 1
+assur good 2
+assur good styl 2
+assur l elim 1
+assur la 1
+assur la validit 1
+assur le 1
+assur lexactitud 1
+assur lexactitud de 1
+assur qu 1
+assur qu le 1
+assur quil 1
+assur quil ec 1
+assur quil ne 1
+assur quil ny 1
+assur th random 1
+assur un 1
+assur un bon 1
+assur un pr 1
+assur un transform 1
+assurer 3
+assurer a chaqu 1
+assurer l evolut 1
+assurer la 2
+assurer la rapidit 1
+assurer la validit 1
+assurer quil 1
+assurer quil ec 1
+assurer un 1
+assurer un bon 1
+assurer un co 1
+assurer un equilibr 1
+assurer un fr 1
+assurer un parcour 1
+ast 2
+ast extract 1
+ast extract tool 1
+ast good 1
+ast good result 1
+ast new sourc 1
+asterisk 1
+asvm 1
+asvm is integr 1
+asymmeter 1
+asymmeter rol 1
+asymptot 14
+asymptot behavior 1
+asymptot complec 1
+asymptot ef 1
+asymptot ef ci 1
+asymptot grow 1
+asymptot grow number 1
+asymptot improv 1
+asymptot it prov 1
+asymptot me 1
+asymptot me bandwidth 1
+asymptot me inject 1
+asymptot mor ef 1
+asymptot optim 2
+asymptot perform 1
+asymptot proper 1
+asymptot reach 1
+asymptot tp 1
+asymptot tp theor 1
+asymptot traver 1
+asymptot ver ef 1
+asymptotiqu 2
+asymptotiqu de 1
+asymptotiqu de algorithm 1
+asymptotiqu de lagc 1
+asymptotiqu si 1
+asymptotiqu si le 1
+async 1
+async tak 1
+async thereafter 1
+async to obtain 1
+asynchr 1
+asynchr offr 1
+asynchr offr ain 1
+asynchron 22
+asynchron acc 1
+asynchron acc impl 1
+asynchron agr 1
+asynchron agr problem 1
+asynchron algorithm 2
+asynchron and failur 1
+asynchron and point 1
+asynchron and synchron 1
+asynchron behavior 1
+asynchron cal 1
+asynchron commun 3
+asynchron commun localiz 1
+asynchron commun using 1
+asynchron concur 1
+asynchron concur program 1
+asynchron event 1
+asynchron event handler 1
+asynchron interact 1
+asynchron invok 1
+asynchron invok method 1
+asynchron mach 1
+asynchron me 1
+asynchron me pa 1
+asynchron me sen 1
+asynchron membership 1
+asynchron membership protocol 1
+asynchron minim 1
+asynchron minim span 1
+asynchron natur 1
+asynchron network 2
+asynchron oper 2
+asynchron oper mod 1
+asynchron parallel 1
+asynchron parallel inser 1
+asynchron parallel prior 1
+asynchron protocol 1
+asynchron rec 1
+asynchron rec rout 1
+asynchron receiv 1
+asynchron receiv non 1
+asynchron repl 1
+asynchron repl ea 1
+asynchron repl mak 1
+asynchron repl mechan 1
+asynchron se 1
+asynchron sem 1
+asynchron sen 1
+asynchron sen primitiv 1
+asynchron sent 1
+asynchron softwar 1
+asynchron softwar evolut 1
+asynchron softwar maint 1
+asynchron system 1
+asynchron transfer 2
+asynchron transfer mod 2
+asynchron using 1
+asynchron vi timestamp 1
+asynchron wait 1
+asynchron wait fr 1
+at 9
+at and contribut 1
+at and friedman 1
+at edg 1
+at edg collap 1
+at enu 1
+at enu es 1
+at la 1
+at la mi 1
+at th assemb 1
+at y autom 1
+atc 1
+atc and ttc 1
+atc ath 1
+atc ath ttc 1
+atc quer 1
+atc quer execut 1
+atc quer involut 1
+atd 1
+ath 5
+ath qu 1
+ath qu requir 1
+ath qu tak 1
+ath quer 1
+ath quer incr 1
+ath quer involut 1
+ath ttc 1
+ath ttc tth 1
+ation 1
+ation datl 1
+ation datl anatomiqu 1
+ation dun 1
+ation dun ba 1
+atl 9
+atl airport 1
+atl airport termin 1
+atl chip 1
+atl chip pfefferkorn 1
+atl cit 2
+atleast 1
+atlexdbsl 1
+atm 8
+atm and gener 1
+atm cel 1
+atm network 3
+atm network wh 1
+atm prov 1
+atm prov connect 1
+atm siml 1
+atm siml testb 1
+atm switch 3
+atm switch chip 1
+atm switch con 1
+atm switch support 1
+atm switch system 1
+atmar 1
+atmospher 1
+atmospher flow 1
+atmospher flow ba 1
+atmost 1
+atmt 1
+atmt dm 1
+atof 1
+atoir 2
+atoir campus 1
+atoir campus de 1
+atoir correspon 1
+atoir dan 1
+atoir de 1
+atoir de natur 1
+atoir mod 1
+atoir mod li 1
+atoiresp 1
+atom 30
+atom a using 1
+atom abstract 1
+atom act 1
+atom and prov 1
+atom and recover 1
+atom and se 1
+atom and tripl 1
+atom ar deriv 1
+atom ar distinct 1
+atom ar effect 1
+atom ar gener 1
+atom ar treat 1
+atom arg 1
+atom as shorthand 1
+atom atom 1
+atom attribut 1
+atom broadcast 2
+atom broadcast prim 1
+atom c fac 1
+atom cal 1
+atom command 1
+atom commitm 1
+atom comp 1
+atom comp oper 1
+atom construc 1
+atom coordin 1
+atom d1 1
+atom denot 1
+atom ei 1
+atom et de 1
+atom expr 1
+atom forml 5
+atom forml expr 1
+atom forml ind 1
+atom forml xi 1
+atom g1 1
+atom goal 1
+atom group 1
+atom group multicast 1
+atom handshak 1
+atom if fag 1
+atom impl 1
+atom in fp 1
+atom in gi 1
+atom in lp 1
+atom in oe 1
+atom is denot 1
+atom is exact 1
+atom is finit 1
+atom is st 1
+atom is weight 1
+atom macr 1
+atom memor 1
+atom memor com 1
+atom memor inclus 1
+atom memor introduc 1
+atom memor lead 1
+atom multicast 1
+atom multicast built 1
+atom multicast facil 1
+atom multicast primitiv 1
+atom multicast system 1
+atom muticast 1
+atom muticast protocol 1
+atom non 1
+atom non object 1
+atom of pag 1
+atom on 1
+atom on using 1
+atom oper 3
+atom or neg 1
+atom or tripl 1
+atom overlap 1
+atom read 1
+atom replac 1
+atom repr 1
+atom ri 1
+atom select 1
+atom sem 1
+atom unit 1
+atom valu 1
+atom variabl 1
+atom with respect 1
+atom writ 1
+atomiqu 3
+atomiqu ou 1
+atomiqu ou atom 1
+atomiqu tridimensionnel 1
+atomiqu tridimensionnel de 1
+atout 1
+atout de 1
+atout de la 1
+atout import 1
+atout import tant 1
+atr 2
+atr ma 1
+atr ma accueil 1
+atr pr 2
+atr pr esid 2
+atsush 1
+atsush hor 1
+atsush igarash 1
+attach 22
+attach a pot 1
+attach a transact 1
+attach act 1
+attach attribut 1
+attach ee 2
+attach ee au 2
+attach ev test 1
+attach loc 1
+attach loc nod 1
+attach method 1
+attach network 1
+attach network dev 1
+attach per switch 1
+attach prov 1
+attach prov act 1
+attach rout 1
+attach rout compon 1
+attach stat 1
+attach stat nod 1
+attach task 1
+attach task cost 1
+attach termin 1
+attach test 1
+attach test inform 1
+attach th input 1
+attach tim 1
+attach tim stamp 1
+attach to candid 1
+attach to init 1
+attach to sub 1
+attach to switch 1
+attach to vi 1
+attach to vj 1
+attachm 2
+attachm for starburst 1
+attachm to har 1
+attack 2
+attack princip 1
+attack th complec 1
+attack th problem 1
+attain 8
+attain at cluster 1
+attain by ch 1
+attain by solut 1
+attain by test 1
+attain parallel 1
+attain speedup 1
+attain th highest 1
+attain th minim 1
+attaqu 1
+attaqu e dan 1
+attard 1
+atteign 1
+atteign a partir 1
+atteignait 1
+atteignait un 1
+atteignait un pr 1
+atteindr 4
+atteindr ce 1
+atteindr ce etat 1
+atteindr le 2
+atteindr le teraflop 1
+atteindr son 1
+atteindr son energ 1
+atteindr un point 1
+atteint 4
+atteint a partir 1
+atteint avant 2
+atteint avant le 1
+atteint avant qu 1
+atteint ce 1
+atteint ce maxim 1
+atteint dan 1
+atteint dan le 1
+atteint et soit 1
+atteint le 2
+atteint le dern 1
+atteint le minim 1
+atteint lor 1
+atteint lor de 1
+atteint par 2
+atteint par le 2
+atteint quand 1
+atteint quand le 1
+atteint quel 1
+atteint quel qu 1
+atteint respectiv 1
+atteint respectiv aux 1
+attempt 52
+attempt a non 1
+attempt ar perform 1
+attempt at develop 1
+attempt at narrow 1
+attempt at specif 1
+attempt hereb 1
+attempt is mad 3
+attempt to achief 1
+attempt to acquir 2
+attempt to actu 1
+attempt to answer 2
+attempt to av 1
+attempt to car 1
+attempt to chang 1
+attempt to character 1
+attempt to clamp 1
+attempt to com 1
+attempt to comb 1
+attempt to commun 1
+attempt to control 1
+attempt to cr 2
+attempt to direct 1
+attempt to empl 1
+attempt to establ 1
+attempt to evalu 1
+attempt to execut 1
+attempt to expl 1
+attempt to ext 1
+attempt to extract 1
+attempt to fil 1
+attempt to find 1
+attempt to gain 1
+attempt to gener 1
+attempt to giv 2
+attempt to handl 1
+attempt to heap 1
+attempt to identif 1
+attempt to improv 1
+attempt to incr 1
+attempt to integr 1
+attempt to interpr 1
+attempt to loc 1
+attempt to look 1
+attempt to maxim 2
+attempt to me 1
+attempt to minim 1
+attempt to modif 1
+attempt to optim 1
+attempt to overcom 1
+attempt to par 1
+attempt to perform 1
+attempt to preserv 1
+attempt to produc 1
+attempt to prov 4
+attempt to redef 1
+attempt to reduc 3
+attempt to reject 1
+attempt to remov 1
+attempt to repeat 1
+attempt to reproduc 1
+attempt to reschedl 1
+attempt to retain 1
+attempt to retrief 1
+attempt to return 2
+attempt to select 3
+attempt to st 1
+attempt to support 1
+attempt to tak 1
+attempt to transm 1
+attempt to us 1
+attempt to writ 1
+attempt until cjnpj 1
+attempt wa mad 1
+attempt wer mad 1
+attempt with spot 1
+attendr 3
+attendr de 1
+attendr de ce 1
+attendr la 2
+attendr la fin 1
+attendr la lib 1
+attendu 1
+attent 29
+attent a number 1
+attent drawn 1
+attent et le 1
+attent in langu 1
+attent in subsequ 1
+attent is paid 1
+attent on dat 1
+attent on retrief 1
+attent particl 1
+attent reader 1
+attent to cam 1
+attent to cod 1
+attent to ec 1
+attent to forml 1
+attent to improv 1
+attent to var 1
+attent wa paid 1
+attenu 1
+attenu sever typ 1
+attenu th quant 1
+attest 1
+attest de 1
+attest de la 1
+attitud 3
+attitud wer bring 1
+attr 2
+attr a la 1
+attr dan 1
+attr dan le 1
+attr est 1
+attr est lattribut 1
+attr1 1
+attr1 a attr2 1
+attr1 attr2 1
+attr2 1
+attr2 a attr3 1
+attr2 apr 1
+attr2 apr es 1
+attr2 ref 1
+attr3 1
+attr3 apr 1
+attr3 apr es 1
+attr3 ref 1
+attract 21
+attract a great 1
+attract altern 1
+attract comput 1
+attract comput platform 1
+attract consider 1
+attract consider research 1
+attract for parallel 1
+attract from link 1
+attract in context 1
+attract in term 1
+attract in turbl 1
+attract mechan 1
+attract method 1
+attract proper 2
+attract resourc 1
+attract solut 2
+attract structur 1
+attractif 1
+attrdef 1
+attrdef attrdefl 1
+attrdef attrdefl attrdef 1
+attrdefl 1
+attrdefl attrdef 1
+attribu 3
+attribu cycliqu 1
+attribu cycliqu le 1
+attribu ee 2
+attribu ee est 1
+attribu ee rest 1
+attribu ee s 1
+attribu ee si 1
+attribu un 1
+attribu un not 1
+attribuer 1
+attribuer lec 1
+attribuer lec ecut 1
+attribut 30
+attribut a becom 1
+attribut a la 1
+attribut a1 1
+attribut affect 1
+attribut affect lunif 1
+attribut agr 1
+attribut and aggreg 1
+attribut and behavior 1
+attribut and behaviour 1
+attribut and format 1
+attribut and layout 1
+attribut and le 1
+attribut and retrief 1
+attribut and thus 1
+attribut and tripl 1
+attribut and v1 1
+attribut ar ad 1
+attribut ar assign 1
+attribut ar collect 1
+attribut ar combin 1
+attribut ar continu 1
+attribut ar correl 1
+attribut ar distribut 1
+attribut ar examin 1
+attribut ar inclus 1
+attribut ar inherit 1
+attribut ar numer 1
+attribut ar pref 1
+attribut ar refer 1
+attribut ar request 1
+attribut ar retrief 1
+attribut ar select 1
+attribut ar selfexplan 1
+attribut ar unpack 1
+attribut as imag 1
+attribut as interv 1
+attribut assign 1
+attribut at specif 1
+attribut au 1
+attribut au niveau 1
+attribut av 1
+attribut avec 1
+attribut becom 1
+attribut by util 1
+attribut cal dynam 1
+attribut cand 1
+attribut com 1
+attribut com de 1
+attribut commun 1
+attribut commun attr 1
+attribut contain 1
+attribut correspon 1
+attribut cour 1
+attribut cour dan 1
+attribut creat 1
+attribut d efin 1
+attribut dan 1
+attribut dan de 1
+attribut dat 1
+attribut dat map 1
+attribut de 2
+attribut de ce 1
+attribut de deux 1
+attribut de la 1
+attribut de notr 1
+attribut de variabl 1
+attribut decluster 1
+attribut decluster strateg 1
+attribut dholzbaur 1
+attribut diff 1
+attribut diff erent 1
+attribut dist 1
+attribut distribut 1
+attribut doit 1
+attribut doit etr 1
+attribut doit tout 1
+attribut doiv 1
+attribut doiv pouvoir 1
+attribut dont la 1
+attribut drop 1
+attribut en 1
+attribut en liant 1
+attribut en milieu 1
+attribut en modif 1
+attribut en plac 1
+attribut est 1
+attribut est adr 1
+attribut est connu 1
+attribut est cr 1
+attribut est instanc 1
+attribut est li 1
+attribut est lim 1
+attribut est mi 1
+attribut est modif 1
+attribut est perdu 1
+attribut est tr 1
+attribut est un 1
+attribut et dun 1
+attribut et est 1
+attribut et la 1
+attribut et limiter 1
+attribut et par 1
+attribut et son 1
+attribut for repr 1
+attribut gard 1
+attribut giv 1
+attribut grammar 1
+attribut ha compon 1
+attribut hav subst 1
+attribut hist 1
+attribut in direct 1
+attribut in eram 1
+attribut in tdbm 1
+attribut init 1
+attribut init de 1
+attribut introduit 1
+attribut introduit de 1
+attribut inutil 1
+attribut inutil es 1
+attribut is align 1
+attribut is brok 1
+attribut is conver 1
+attribut jouent 1
+attribut li 1
+attribut li ee 1
+attribut list 1
+attribut lor 1
+attribut lor de 1
+attribut manipl 1
+attribut nam 2
+attribut ne 1
+attribut ne peut 1
+attribut ne peuv 1
+attribut ne sont 1
+attribut nec 1
+attribut ni 1
+attribut ni de 1
+attribut of account 1
+attribut of author 1
+attribut of employeeunpack 1
+attribut of eram 1
+attribut of object 1
+attribut of text 1
+attribut of val 1
+attribut ont 1
+attribut par 1
+attribut par devoir 1
+attribut par simpl 1
+attribut par substitut 1
+attribut par un 1
+attribut perm 1
+attribut peut 1
+attribut peut etr 1
+attribut peut partiel 1
+attribut pid 1
+attribut pu 1
+attribut qu 1
+attribut qu rest 1
+attribut rang 1
+attribut rel 1
+attribut rel valu 1
+attribut ren 1
+attribut ren de 1
+attribut requ 1
+attribut requ erent 1
+attribut requ un 1
+attribut requir 1
+attribut satisf 1
+attribut self 1
+attribut self refer 1
+attribut slop 1
+attribut sont 1
+attribut sont exclusiv 1
+attribut sont repr 1
+attribut sous 1
+attribut sous form 1
+attribut symbol 1
+attribut symbol repr 1
+attribut system 1
+attribut tant 1
+attribut tant qu 1
+attribut tel 1
+attribut tel quel 1
+attribut th differ 1
+attribut th user 1
+attribut tid 1
+attribut tid0 1
+attribut timestamp 1
+attribut to occam 1
+attribut to reason 1
+attribut to thacker 1
+attribut typ 1
+attribut upd 1
+attribut va 1
+attribut va tr 1
+attribut valu 2
+attribut var 1
+attribut variabl 1
+attribut we us 2
+attribut wh 1
+attribut which collect 1
+attribut which mak 1
+attribut x using 1
+attribut x1 1
+attribut x2 1
+attribut137 1
+attribut139 1
+attribut141 1
+attribut143 1
+attrx 1
+atyp 2
+atyp real world 1
+atyp when compar 1
+au 10
+au and av 1
+au besoin 1
+au besoin de 1
+au bloc 1
+au bloc b0 1
+au bloc bn 1
+au bon 1
+au bon fonct 1
+au bout 2
+au bout de 2
+au bout dun 1
+au bu 1
+au but cibl 1
+au but cour 1
+au but fic 1
+au c ot 1
+au ca 1
+au ca complec 1
+au ca de 1
+au ca dun 1
+au ca non 1
+au ca ou 1
+au ca pr 1
+au cadr 1
+au cadr de 1
+au calcl 1
+au calcl de 1
+au centr 2
+au centr dun 1
+au ch 1
+au ch de 1
+au ch dun 1
+au champ 1
+au champ attribut 1
+au champ correspon 1
+au champ de 1
+au chapitr 2
+au chapitr suiv 1
+au chapitr sur 1
+au cnr 1
+au co 3
+au co ut 3
+au cod 3
+au cod binair 1
+au cod de 2
+au cod du 1
+au cod fourn 1
+au cod lor 1
+au cod par 1
+au cod util 1
+au coeur 1
+au compilateur 2
+au compilateur dadapter 1
+au compilateur dauror 1
+au compilateur fortran 1
+au compilateur le 1
+au comport 2
+au comport de 1
+au comport dun 1
+au compt 1
+au compt dun 1
+au context 1
+au context de 1
+au contr 1
+au contr ol 1
+au contrair 2
+au contrair de 1
+au contrair dun 1
+au contrair le 1
+au contrair lorsqu 1
+au corp 1
+au corp de 1
+au cou 1
+au cou de 1
+au cour 5
+au cour de 4
+au cour du 1
+au cour dun 1
+au court 1
+au court circuit 1
+au cr 1
+au crit 2
+au d ebut 1
+au d ecoup 1
+au d epart 2
+au d es 1
+au d etr 1
+au d etrim 1
+au d evelop 1
+au d velop 1
+au del 3
+au dern 1
+au dern maillon 1
+au dern sous 1
+au dessus 1
+au dessus de 1
+au domain 1
+au domain assoc 1
+au drapeau 1
+au drapeau point 1
+au fait 2
+au fait qu 2
+au fait quil 1
+au faux 1
+au faux part 1
+au fon 1
+au fon de 1
+au fon du 1
+au foncteur 1
+au foncteur attendu 1
+au foncteur cour 1
+au form 1
+au form alg 1
+au gestionnair 1
+au gestionnair de 1
+au grain 1
+au grain de 1
+au group 1
+au group de 1
+au hasard 2
+au hasard dan 1
+au hasard ou 1
+au hasard parm 1
+au im 1
+au is defin 1
+au jur 1
+au jur malgr 1
+au lecteur 1
+au lieu 4
+au lieu dacc 1
+au lieu de 3
+au lieu dextrair 1
+au lieu dun 1
+au m ecan 1
+au m em 2
+au manqu 1
+au manqu de 1
+au marqu 1
+au marqu init 1
+au marqu mk 1
+au marqu mn 1
+au marqu xn 1
+au maxim 1
+au maxim don 1
+au maxim le 1
+au maxim th 1
+au mieux 1
+au minim 1
+au minim par 1
+au mod 3
+au mod dacc 1
+au mod de 1
+au mod ecritur 1
+au mod el 2
+au moin 4
+au moin dan 1
+au moin de 3
+au moin deux 1
+au moin egal 2
+au moin equiv 1
+au moin migrer 1
+au moin partiel 2
+au moin un 1
+au moment 1
+au moment de 1
+au moment dempiler 1
+au moy 2
+au moy dun 2
+au n eoph 1
+au net 1
+au net de 1
+au nid 1
+au nid de 1
+au niveau 4
+au niveau algorithmiqu 1
+au niveau architectur 1
+au niveau de 3
+au niveau du 1
+au niveau le 1
+au niveau mat 1
+au niveau mol 1
+au niveau sourc 1
+au noeud 1
+au noeud destinatair 1
+au nombr 3
+au nombr de 3
+au nombr repr 1
+au nombr tot 2
+au nouveau 1
+au noyau 1
+au noyau ker 1
+au p.p.m.c 1
+au p.p.m.c de 1
+au pa 3
+au pa de 1
+au pa le 1
+au pa qu 1
+au par 1
+au par elism 1
+au paragraph 2
+au paragraph au 1
+au paragraph certain 1
+au paragraph nous 2
+au paragraph pr 1
+au paragraph qu 1
+au paragraph suiv 1
+au parcour 1
+au parcour de 1
+au part 2
+au part de 2
+au part dun 1
+au partit 1
+au partit de 1
+au pav 1
+au pir 1
+au plac 2
+au plac de 2
+au plan 1
+au plan qualitatif 1
+au plan quantitatif 1
+au pluriel 1
+au plus deux 1
+au plus egal 1
+au plus linterv 1
+au plus montr 1
+au plus petit 1
+au plus pour 1
+au plus quun 1
+au plus un 1
+au point 2
+au point correspon 1
+au point de 2
+au point dentr 1
+au point dinfluencer 1
+au point du 1
+au point dun 1
+au point fin 1
+au point manuel 1
+au point soit 1
+au point x0 1
+au pr 3
+au pr dun 1
+au pr ec 2
+au pr edicat 1
+au pr etrait 1
+au prem 2
+au prem appel 1
+au prem ca 1
+au probl 5
+au probl em 4
+au proc ed 1
+au processeur 2
+au processeur en 1
+au processeur p0 1
+au processeur qu 1
+au prochain 1
+au prochain pa 1
+au produit 1
+au produit vectoriel 1
+au program 2
+au programmeur 1
+au programmeur ou 1
+au programmeur un 1
+au propr 1
+au propr etair 1
+au protocol 1
+au protocol dinv 1
+au pseud 1
+au pseud pr 1
+au quadrupl 1
+au quadrupl selon 1
+au r ecup 1
+au r eseau 1
+au r esultat 3
+au rang 1
+au rang ou 1
+au rec 1
+au rec de 1
+au recouvr 2
+au recouvr du 1
+au recouvr s 1
+au register 1
+au register cp 1
+au rest 1
+au rest de 1
+au retour 1
+au retour ar 1
+au retour dun 1
+au risqu 1
+au risqu de 1
+au risqu dengendrer 1
+au s eminair 1
+au segm 1
+au segm pr 1
+au sein 2
+au sein de 2
+au sein du 1
+au sein dun 1
+au sein ou 1
+au sel 1
+au sel ca 1
+au sen 3
+au sen classiqu 1
+au sen de 2
+au sen du 1
+au sen typographiqu 1
+au sit 1
+au sit destinatair 1
+au som 1
+au som de 1
+au sort 1
+au sort est 1
+au sous 1
+au sous arbr 1
+au stock 1
+au stock lin 1
+au suj 1
+au suj du 1
+au surc 1
+au surc ut 1
+au syst 1
+au syst em 1
+au tableau 1
+au tableau ne 1
+au taux 1
+au taux moy 1
+au temp 2
+au temp de 1
+au temp pa 1
+au term 1
+au term comp 1
+au test 1
+au th 1
+au th eor 1
+au top 1
+au tout 1
+au tr 3
+au tr em 1
+au tr nag 1
+au traceur 1
+au trait 2
+au trait de 1
+au transfer 2
+au transfer de 1
+au transfer du 1
+au transfer par 1
+au traver 1
+au traver de 1
+au traver du 1
+au treil 1
+au treil engendr 1
+au typ 2
+au typ dacc 1
+au typ du 1
+au vid 1
+au vid de 1
+au voisin 1
+au voisin de 1
+au z modl 1
+au0 1
+au0 bu1 1
+aub 2
+aub dk 2
+aubign 1
+auburn 1
+aucun 4
+aucun acc 1
+aucun acc es 1
+aucun avant 1
+aucun ca 2
+aucun ca dautr 1
+aucun ca eliminer 1
+aucun ca la 1
+aucun chanc 1
+aucun conflit 1
+aucun conflit pour 1
+aucun contraint 1
+aucun contraint sur 1
+aucun d epen 1
+aucun de 3
+aucun de ce 2
+aucun de cel 1
+aucun de claus 1
+aucun diff 1
+aucun diff er 1
+aucun difficult 1
+aucun droit 1
+aucun droit dacc 1
+aucun en 1
+aucun en lectur 1
+aucun etat 1
+aucun fonct 1
+aucun gar 1
+aucun gar quel 1
+aucun ic 1
+aucun id ee 1
+aucun instruc 1
+aucun instruc rel 1
+aucun m ecan 1
+aucun modif 1
+aucun modif de 1
+aucun nouveau 1
+aucun nouveau point 1
+aucun ordr 1
+aucun ordr dic 1
+aucun part 1
+aucun ph 1
+aucun ph enom 1
+aucun pr 1
+aucun pr edicat 1
+aucun raison 1
+aucun raison de 1
+aucun solut 1
+aucun solut pour 1
+aucun synchron 1
+aucun synchron nest 1
+aucun tail 1
+aucun tail de 1
+aucun term 1
+aucun term comp 1
+aucun test 1
+aucun test de 1
+aucun un 1
+aucun un op 1
+aucun var 1
+aucun var ne 1
+aucun variabl 1
+aud 7
+aud and fac 1
+aud and vid 1
+aud ba 1
+aud ba commun 1
+aud ba environm 1
+aud channel 1
+aud commun 1
+aud connect 1
+aud conver 1
+aud hardwar 1
+aud head 1
+aud is us 1
+aud link 1
+aud mixer 1
+aud onl commun 1
+aud sign 1
+aud to support 1
+aud vid 1
+aud vid multicast 1
+aud visu 1
+aud visu recognit 1
+audit 2
+audit trail 2
+auernheimer 1
+auf 2
+auf der 1
+auf der he 1
+auf vektorrechern 1
+aufl 1
+aug 14
+aug ar superimp 1
+aug biconnect 1
+aug bridg 1
+aug bridg connect 1
+aug f path 1
+aug fail 1
+aug would contradict 1
+augm 23
+augm a hid 1
+augm a system 1
+augm a tr 1
+augm and filter 1
+augm and show 1
+augm avec 1
+augm avec la 1
+augm et avec 1
+augm from f0 1
+augm from t0 1
+augm g0 2
+augm graph 2
+augm incontr 1
+augm incontr ol 1
+augm inform 1
+augm la 2
+augm la complexit 1
+augm la fr 1
+augm la tail 1
+augm le 1
+augm le nombr 1
+augm le possibilit 1
+augm might destr 1
+augm of edg 1
+augm of g0 1
+augm of minim 1
+augm of weight 1
+augm par 1
+augm po using 1
+augm privileg 1
+augm problem 1
+augm problem respect 1
+augm rest 1
+augm rest dan 1
+augm shown 1
+augm si 1
+augm si le 1
+augm solut 1
+augm ssm 1
+augm switch 1
+augm synchron 1
+augm synchron sequ 1
+augm th algorithm 1
+augm th dat 1
+augm th keyword 1
+augm th quer 1
+augm th steiner 1
+augm that biconnect 1
+augm that twoconnect 1
+augm to prov 1
+augm tr 1
+augm train 1
+augm train se 1
+augm ver 1
+augm with inform 1
+augm with minrol 1
+augm with typ 1
+augmenter 3
+augmenter ce 1
+augmenter ce probabilit 1
+augmenter d jusqu 1
+augmenter dan 1
+augmenter dan la 1
+augmenter la 1
+augmenter la convexit 1
+augmenter la ma 1
+august 54
+august september 1
+augustin 2
+auj 1
+aujourdhu 2
+aujourdhu de 1
+aujourdhu de nombreus 1
+aum 1
+aum a stream 1
+aum stream 1
+aum stream object 1
+aumker 1
+auquel 3
+auquel ca 2
+auquel ca la 1
+auquel il 1
+auquel il est 1
+auquel je 1
+auquel nous 1
+auquel nous nous 1
+aur 2
+aur alor 1
+aur donc 1
+aur donc int 1
+aur le 1
+aur le temp 1
+aur lieu 1
+aur lieu dan 1
+aur pa 2
+aur pa de 2
+aur toujour 1
+aur toujour de 1
+aur un point 1
+aurait 2
+aurait ecr 1
+aurait env 1
+aurait env de 1
+aurait obtenu 1
+aurait obtenu en 1
+aurait plut 1
+aurait plut ot 1
+aurait pour 1
+aurait pour ag 1
+aurait pour prem 1
+aurait pour valeur 1
+aurait r esult 1
+aurait un 1
+aurait un autr 1
+aurenhammer 1
+auron 1
+auron locc 1
+auron locc de 1
+auront 2
+auront lieu 1
+auront lieu dan 1
+auront lieu loc 1
+auront pour 1
+auront ten 1
+auror 1
+auror abstract 1
+auror abstract mach 1
+auror foxtrot 1
+auror util 1
+auror util un 1
+aus 4
+aus a de 1
+aus a un 1
+aus abord 1
+aus abord ee 1
+aus appliqu 1
+aus appliqu ee 1
+aus aux 1
+aus aux appel 1
+aus aux variabl 1
+aus bien 3
+aus bien connu 1
+aus bien disjonct 1
+aus bien en 1
+aus bien la 2
+aus bien par 1
+aus bien pour 1
+aus bien qu 1
+aus bon 1
+aus bon qu 1
+aus cart 1
+aus cart exponentiel 1
+aus cart var 1
+aus ce 1
+aus changer 1
+aus changer assez 1
+aus collect 1
+aus collect ee 1
+aus complec 1
+aus complec qu 1
+aus connu 1
+aus connu sous 1
+aus cr 1
+aus cr tr 1
+aus d ecrir 1
+aus d efin 1
+aus dan 2
+aus dan ce 1
+aus dan la 1
+aus dan le 1
+aus de 2
+aus de concevoir 1
+aus de permettr 1
+aus de variabl 1
+aus du 1
+aus du program 1
+aus efficac 1
+aus elev 1
+aus elev ee 1
+aus engendrer 1
+aus engendrer un 1
+aus envisag 1
+aus envisager 1
+aus esp 1
+aus esp ranc 1
+aus etr 1
+aus etr appliqu 1
+aus etr elimin 1
+aus etr facil 1
+aus etr introduit 1
+aus etr inutil 1
+aus etr mi 1
+aus etr obtenu 1
+aus etr respon 1
+aus etr sauvegard 1
+aus etr simplif 1
+aus etr util 1
+aus etud 1
+aus etud ee 1
+aus fair 1
+aus fair appel 1
+aus form 1
+aus form modl 1
+aus g en 1
+aus grand 2
+aus grand qu 1
+aus jou 1
+aus l eg 1
+aus la 1
+aus la possibilit 1
+aus la prem 1
+aus la synth 1
+aus la th 1
+aus la var 1
+aus lautr 1
+aus lautr var 1
+aus lav 1
+aus lav de 1
+aus le 2
+aus le acc 1
+aus le autr 1
+aus le calcl 1
+aus le ch 1
+aus le poid 1
+aus le probl 1
+aus le som 1
+aus leur 1
+aus leur part 1
+aus lieu 1
+aus lieu de 1
+aus limpl 1
+aus limpl em 1
+aus lo 1
+aus lo dist 1
+aus mesur 1
+aus mesur invar 1
+aus moy 1
+aus moy espac 1
+aus nombreux 1
+aus nombreux qu 1
+aus nous 1
+aus pa 1
+aus pa ee 1
+aus par 1
+aus par de 1
+aus particl 1
+aus particl er 1
+aus permettr 1
+aus permettr de 1
+aus peut 1
+aus peut etr 1
+aus po avec 1
+aus po dadapter 1
+aus po de 1
+aus po dutiliser 1
+aus pr 1
+aus pr esent 1
+aus prop 1
+aus qu 1
+aus qu la 1
+aus qu laddit 1
+aus qu le 1
+aus qu ti 1
+aus quatern 1
+aus quel 1
+aus quel conduit 1
+aus quil 1
+aus quil soit 1
+aus quun 1
+aus quun contraint 1
+aus rang 1
+aus rang ee 1
+aus rapid 1
+aus rapid qu 1
+aus remerc 1
+aus rep 1
+aus rep re 1
+aus repr 1
+aus repr esent 1
+aus restaur 1
+aus restaur es 1
+aus sauvegard 1
+aus sauvegard ee 1
+aus simpl 1
+aus simpl qu 1
+aus sur 1
+aus sur laffect 1
+aus tr 1
+aus tr es 1
+aus transform 1
+aus transform rig 1
+aus tud 1
+aus un 3
+aus un configur 1
+aus un estampil 1
+aus un part 1
+aus un pointeur 1
+aus un probabilit 1
+aus un pseud 1
+aus un term 1
+aus util 1
+aus util en 1
+aus util es 1
+aus var 2
+aus var es 1
+aus volumineus 1
+aus volumineus perm 1
+auser 1
+ausp 2
+aussit 1
+aussit ot 1
+austauschdienst 2
+austin 11
+austr 16
+austr breast 1
+austr breast cancer 1
+austr governm 1
+austr hong 1
+austr hong cit.gu.edu.au 1
+austr joint 1
+austr nat 2
+austr research 4
+austr research council 3
+austr research institut 1
+austr rpb 1
+austr rpb disc.anu.edu.au 1
+austr saint 1
+austr saint john 1
+austr wliang 1
+austr wliang cs.anu.edu.au 1
+aut 7
+aut d epen 1
+aut de 3
+aut de fo 2
+aut de mi 1
+aut de nid 1
+aut dir 1
+aut dir quaucun 1
+aut ef 1
+aut ef er 1
+aut en 1
+aut en ce 1
+aut es 1
+aut et pour 1
+aut fair 1
+aut fair migrer 1
+aut l elag 1
+aut la 1
+aut la pr 1
+aut lempl 1
+aut lempl de 1
+aut pour 1
+aut pour un 1
+aut qu 3
+aut qu se 1
+aut r ef 1
+aut un 1
+aut un cop 1
+auteur 4
+auteur appliqu 1
+auteur appliqu ce 1
+auteur conclu 1
+auteur conclu de 1
+auteur d algorithm 1
+auteur de 2
+auteur de mat 1
+auteur de prolog 1
+auteur prop 1
+auteur se 1
+auteur se sont 1
+auth 2
+auth author 1
+author 43
+author acc 1
+author adapt 1
+author addr 2
+author al wish 1
+author another 1
+author another privileg 1
+author apprec 1
+author ar giv 1
+author arrest 1
+author cal 1
+author can specif 1
+author claim 2
+author com 1
+author coordin 1
+author develop 1
+author effect 1
+author effect grammar 1
+author embod 1
+author even go 1
+author feel 1
+author flow 1
+author flow path 1
+author for object 1
+author for rol 1
+author grat 2
+author grat acknowledg 2
+author hav discover 1
+author hav stud 1
+author hav succ 1
+author involut 1
+author involut rol 1
+author is rol 1
+author knowledg 1
+author mad 1
+author obtain 1
+author obtain sev 1
+author of educ 1
+author of particl 1
+author of precc 1
+author of unknown 1
+author ow 1
+author ow thank 1
+author path 1
+author point 1
+author prop 1
+author rel 1
+author rol 1
+author rol privileg 1
+author rol rol 1
+author secur 1
+author secur administer 1
+author st 1
+author structur 1
+author styl 1
+author system 1
+author thank 1
+author thank joel 1
+author to acc 1
+author to broadcast 1
+author to execut 1
+author to maxrol 1
+author to specif 1
+author user 1
+author user acc 1
+author visit 1
+author visit kyot 1
+author wa support 1
+author wer support 1
+author wh want 1
+author which def 1
+author work 1
+author3 1
+author3 attach 1
+authorship 1
+authorship claim 1
+authorship styl 1
+autocorrel 2
+autocorrel funct 2
+autocorrel funct known 1
+autom 59
+autom an 1
+autom and interact 1
+autom and simpl 1
+autom as 1
+autom as support 1
+autom at 1
+autom cap 1
+autom capabil 1
+autom capabil refer 1
+autom chang 1
+autom chang propag 1
+autom client 1
+autom compiler 1
+autom compiler optim 1
+autom comput 1
+autom computer 1
+autom computer vi 1
+autom construc 1
+autom cont 1
+autom cont extract 1
+autom control 1
+autom datab 1
+autom datab perform 1
+autom decomposit 2
+autom deduc 2
+autom docum 1
+autom docum proc 1
+autom enabl 1
+autom enabl appl 1
+autom extract 2
+autom extract algorithm 1
+autom fin 1
+autom fin tun 1
+autom foc 1
+autom gener 6
+autom grammat 1
+autom grammat tag 1
+autom handl 1
+autom in ac 1
+autom ind 2
+autom ind gener. 1
+autom induc 1
+autom infrastructur 1
+autom inst 1
+autom interfac 1
+autom is ba 1
+autom iter 1
+autom iter pattern 1
+autom knowledg 1
+autom knowledg acquisit 1
+autom langu 1
+autom loop 1
+autom loop interchang 1
+autom mechan 1
+autom mesh 1
+autom mesh partit 1
+autom method 1
+autom mod 1
+autom mod log 1
+autom non 1
+autom non unimodl 1
+autom object 1
+autom parallel 1
+autom part 1
+autom part evalu 1
+autom perform 1
+autom perform tun 1
+autom pod 1
+autom pod vod 1
+autom proc 1
+autom program 2
+autom program gener 2
+autom project 1
+autom proof 1
+autom proof system 1
+autom reason 5
+autom reconfigur 2
+autom reconfigur tak 1
+autom redistribut 1
+autom reflect 1
+autom regr 1
+autom regr test 1
+autom research 1
+autom respon 1
+autom rl 1
+autom rl encod 1
+autom sc 1
+autom sc chang 1
+autom serv 1
+autom serv level 1
+autom server 1
+autom softwar 1
+autom softwar cach 1
+autom spac 1
+autom spac plan 1
+autom spec 1
+autom stud 1
+autom stud support 1
+autom such chang 1
+autom sum 1
+autom techniqu 1
+autom teller 1
+autom teller mach 1
+autom test 1
+autom test execut 1
+autom th proc 1
+autom th val 1
+autom theor 3
+autom theorem 1
+autom theorem prover 1
+autom to inspect 1
+autom to renam 1
+autom tool 1
+autom transl 3
+autom tun 1
+autom tun project 1
+autom upd 1
+autom vid 1
+autom vid ind 1
+autom with feed 1
+automat 41
+automat ad 1
+automat ad stat 1
+automat adjust 1
+automat and eff 1
+automat appl 1
+automat avail 1
+automat bound 1
+automat build 1
+automat build 3d 1
+automat by click 1
+automat by pvm 1
+automat ch 1
+automat construc 1
+automat construc specif 1
+automat cr 3
+automat creat 1
+automat deduc 1
+automat deduc typ 1
+automat determin 3
+automat displ 1
+automat evalu 1
+automat export 1
+automat ext 1
+automat form 1
+automat grant 1
+automat grow 1
+automat hav behavior 1
+automat identif 1
+automat improv 1
+automat improv program 1
+automat incr 1
+automat modif 1
+automat obtain 1
+automat par 1
+automat prov 1
+automat record 1
+automat reduc 1
+automat replac 1
+automat residualiz 1
+automat spec 1
+automat spec sol 1
+automat start 1
+automat tabl 1
+automat th error 1
+automat th multipl 1
+automat that swap 1
+automat through inherit 1
+automat to suggest 1
+automat upd 3
+automat upd exact 1
+automat upd inst 1
+automat upon deleg 1
+automat using 1
+automat ver 1
+automatiqu 9
+automatiqu a lec 1
+automatiqu a partir 1
+automatiqu a tous 1
+automatiqu bp 1
+automatiqu charger 1
+automatiqu charger le 1
+automatiqu dan 1
+automatiqu dan la 1
+automatiqu de 2
+automatiqu de cod 1
+automatiqu de don 1
+automatiqu dobj 1
+automatiqu dun 1
+automatiqu dun pol 1
+automatiqu et donc 1
+automatiqu et le 1
+automatiqu et nengendr 1
+automatiqu la 1
+automatiqu la port 1
+automatiqu la repr 1
+automatiqu laboratoir 1
+automatiqu laboratoir de 1
+automatiqu lor 1
+automatiqu lor de 1
+automatiqu par 1
+automatiqu par le 1
+automatiqu pour 1
+automatiqu pour la 1
+automatiqu pr 1
+automatiqu pr en 1
+automatiqu s elect 1
+automatiqu un 1
+automatiqu un born 1
+automobil 2
+automon 1
+automon system 1
+automon system construc 1
+automot 1
+automot engineer 1
+autonet 2
+autonom 8
+autonom and distribut 1
+autonom and simd 1
+autonom comput 1
+autonom comput upd 1
+autonom mobil 1
+autonom mobil investig 1
+autonom object 1
+autonom part 1
+autonom part tak 1
+autonom system 1
+autonom theor 1
+autonom theor build 1
+autopilot 1
+autoregr 1
+autoregr model 1
+autoregr mov 1
+autoregr mov aver 1
+autoregr tim 1
+autoregr tim ser 1
+autoregr with ec 1
+autoriser 1
+autoriser la 1
+autoriser la pr 1
+autour 3
+autour de 1
+autour de ce 1
+autour dun 3
+autour dun mut 1
+autour dun point 1
+autour dun structur 1
+autr 5
+autr acc 1
+autr acc es 1
+autr am elior 1
+autr approch 2
+autr approch de 1
+autr argum 1
+autr born 1
+autr c ot 1
+autr ca 3
+autr ca le 1
+autr candidat 1
+autr candidat possibl 1
+autr cel 1
+autr cel peuv 1
+autr ch 1
+autr ch de 1
+autr champ 1
+autr chel 1
+autr cl 1
+autr cl tr 1
+autr claus 1
+autr claus candid 1
+autr colon 1
+autr colon provoqu 1
+autr comp 1
+autr comp import 1
+autr con 1
+autr con auxiliair 1
+autr consid 1
+autr consid rent 1
+autr cop 1
+autr cop eventuel 1
+autr diff 1
+autr diff er 1
+autr dit 1
+autr dit de 1
+autr dit le 1
+autr domain 1
+autr domain util 1
+autr en 1
+autr en effectu 1
+autr etanch 1
+autr etant 1
+autr etant obtenus 1
+autr etat 1
+autr etud 2
+autr etud dam 1
+autr exempl 1
+autr exempl de 1
+autr exempl dext 1
+autr exempl est 1
+autr fonct 1
+autr fonct qu 1
+autr group 1
+autr group en 1
+autr impl 1
+autr impl em 1
+autr m ethod 1
+autr man 2
+autr mi 1
+autr mi en 1
+autr opt 1
+autr opt est 1
+autr person 1
+autr person ont 1
+autr point 2
+autr point de 1
+autr point qu 1
+autr possibilit 1
+autr prim 1
+autr prim c0 1
+autr probl 1
+autr probl em 1
+autr processeur 2
+autr processeur du 1
+autr processeur en 1
+autr processus 1
+autr prot 1
+autr prot in 1
+autr qu 1
+autr qu cel 1
+autr qu prolog 1
+autr quand 1
+autr quand le 1
+autr r ef 1
+autr r epon 1
+autr register 1
+autr repr 1
+autr repr es 1
+autr solut 1
+autr solut xn 1
+autr syst 1
+autr syst em 1
+autr techniqu 1
+autr techniqu dexplor 1
+autr term 1
+autr term substitu 1
+autr transform 1
+autr transform ont 1
+autr trop 1
+autr trop complec 1
+autr valeur 1
+autr valeur possibl 1
+autr var 1
+autr var qu 1
+autr variabl 1
+autr ver 1
+autr ver malgr 1
+autumn 1
+aux 9
+aux ac 1
+aux ac de 1
+aux acc 1
+aux acc es 1
+aux ag 1
+aux algorithm 1
+aux altern 1
+aux altern classiqu 1
+aux appel 1
+aux appel terminaux 1
+aux appl 2
+aux appl ent 1
+aux appl qu 1
+aux architectur 1
+aux architectur num 1
+aux argum 1
+aux argum fail 1
+aux argum soit 1
+aux attribut 1
+aux attribut est 1
+aux autr 2
+aux autr processeur 1
+aux autr var 1
+aux besoin 1
+aux besoin variabl 1
+aux born 1
+aux born inf 1
+aux born sup 1
+aux but 1
+aux ca 1
+aux ca de 1
+aux ca particl 1
+aux calcl 2
+aux calcl de 2
+aux calcl sont 1
+aux caract 2
+aux caract eristiqu 1
+aux caract ristiqu 1
+aux ch 1
+aux ch qu 1
+aux chang 1
+aux chang dan 1
+aux claus 1
+aux cod 1
+aux cod fortran 1
+aux condit 1
+aux condit de 1
+aux conflit 1
+aux conflit entr 1
+aux congru 1
+aux conjonct 1
+aux contraint 1
+aux contraint classiqu 1
+aux contraint sur 1
+aux coordon 1
+aux coordon ee 1
+aux coupl 1
+aux d efaut 1
+aux d epen 1
+aux deux 2
+aux deux born 1
+aux deux ensembl 1
+aux deux extr 1
+aux deux pa 1
+aux deux treil 1
+aux deux variabl 1
+aux diff 2
+aux diff erent 2
+aux direct 1
+aux direct de 1
+aux disjonct 1
+aux disjonct plut 1
+aux don 3
+aux don ee 3
+aux ducateur 1
+aux ducateur de 1
+aux echec 1
+aux ecritur 1
+aux eff 1
+aux eff du 1
+aux eff pr 1
+aux el 1
+aux el ement 1
+aux enregister 1
+aux enregister dactiv 1
+aux environ 1
+aux etap 1
+aux etat 1
+aux etat de 1
+aux etat ne 1
+aux etat rar 1
+aux ev 1
+aux ev en 1
+aux exp 1
+aux exp er 1
+aux figur 1
+aux fluc 1
+aux fluc dinstruc 1
+aux fonct 2
+aux fonct matriciel 1
+aux fonct vectoriel 1
+aux g od 1
+aux gard 1
+aux gard de 1
+aux habituel 1
+aux habituel idiosyncr 1
+aux homograph 1
+aux homograph nont 1
+aux hypoth 1
+aux hypoth es 1
+aux in egalit 1
+aux inconv 1
+aux inconv enient 1
+aux incr 1
+aux incr ement 1
+aux instruc 1
+aux instruc dunif 1
+aux instruc figur 1
+aux inv 1
+aux inv de 1
+aux it erat 1
+aux lectur 1
+aux lim 1
+aux lim de 1
+aux m em 2
+aux m es 1
+aux mach 1
+aux mach distribu 1
+aux matr 2
+aux matr avec 1
+aux matr unimodulair 1
+aux mi 1
+aux minim 1
+aux minim dun 1
+aux modif 1
+aux mvp 1
+aux op 2
+aux op erat 2
+aux op erateur 1
+aux p processeur 1
+aux pag 1
+aux pag dan 1
+aux pag de 1
+aux pag il 1
+aux pag impliqu 1
+aux paragraph 1
+aux pav 1
+aux pav es 1
+aux perform 1
+aux perform de 1
+aux perform du 1
+aux ph 1
+aux ph enom 1
+aux point 2
+aux point de 1
+aux point ent 1
+aux polyn 1
+aux polyn om 1
+aux pr 1
+aux pr edicat 1
+aux primitiv 1
+aux primitiv de 1
+aux probabilit 1
+aux probl 2
+aux probl em 2
+aux processeur 2
+aux processeur de 1
+aux processeur direct 1
+aux processeur le 1
+aux processeur qu 1
+aux processeur tient 1
+aux processus 1
+aux processus markov 1
+aux program 1
+aux program peuv 1
+aux proposit 1
+aux propr 2
+aux protocol 1
+aux protocol impl 1
+aux r ef 1
+aux r esultat 2
+aux r valeur 1
+aux raison 1
+aux raison suiv 1
+aux register 1
+aux register argum 1
+aux register de 1
+aux s equ 1
+aux sauvegard 1
+aux sauvegard de 1
+aux sel 2
+aux sel don 1
+aux sel mach 1
+aux sel mvp 1
+aux similarit 1
+aux similarit es 1
+aux solut 1
+aux succ 1
+aux succ es 1
+aux tableaux 1
+aux tableaux en 1
+aux techniqu 2
+aux techniqu habituel 1
+aux temp 1
+aux temp dic 1
+aux term 1
+aux term comp 1
+aux term initiaux 1
+aux term interpr 1
+aux tr 1
+aux tr treil 1
+aux trac 1
+aux trac de 1
+aux transform 1
+aux transform de 1
+aux transit 1
+aux transit tj 1
+aux travaux 1
+aux travaux de 1
+aux valeur 2
+aux valeur de 2
+aux valeur mesur 1
+aux valeur pr 1
+aux var 1
+aux variabl 1
+aux variabl ob 1
+aux variabl perman 1
+aux vecteur 1
+aux vecteur de 1
+aux voisin 1
+aux voisin dun 1
+aux zon 1
+auxc 1
+auxc and relc 1
+auxil 13
+auxil boolean 1
+auxil connect 1
+auxil funct 2
+auxil graph 1
+auxil graph gi 1
+auxil label 1
+auxil label funct 1
+auxil method 1
+auxil method embod 1
+auxil not 1
+auxil oper 1
+auxil pr 1
+auxil schem 1
+auxil structur 1
+auxil var 2
+auxil var csp 1
+auxil var good 1
+auxil variabl 3
+auxil verb 1
+auxiliair 2
+auxiliair a pour 1
+auxiliair correspon 1
+auxiliair correspon au 1
+auxiliair est 1
+auxiliair est particl 1
+auxiliair qu 1
+auxiliair qu lu 1
+auxiliair r esult 1
+auxiliair8 1
+auxilliair 1
+auxilliair de 1
+auxilliair de tail 1
+auxilliair suff 1
+auxquel 1
+auxquel il 1
+auxquel il effectu 1
+auxquel il peut 1
+av 60
+av 1x0 1
+av 1x0 a01x01 1
+av a combin 1
+av a gm 1
+av a la 1
+av a system 1
+av adv 1
+av an 1
+av an addit 1
+av an infinit 1
+av an procedur 1
+av ant 1
+av ant al 1
+av arithm 1
+av arithm oper 1
+av as bi 1
+av bad 1
+av bad interfer 1
+av bind 1
+av bind conflict 1
+av by comput 1
+av by creat 1
+av cod 2
+av cod dupl 1
+av confus 4
+av dangl 1
+av dangl refer 1
+av dat 1
+av dat lo 1
+av de 1
+av de incr 1
+av degener 1
+av degener cel 1
+av direct 1
+av edg 1
+av edg giv 1
+av er 1
+av erron 1
+av erron interpr 1
+av error 1
+av exc 1
+av exc rad 1
+av expr 1
+av expr modl 1
+av fil 1
+av fil fr 1
+av hid 1
+av hid knowledg 1
+av hierarch 1
+av hierarch structur 1
+av in num 1
+av inc 1
+av infinit 1
+av infinit loop 1
+av infl 1
+av interfer 1
+av introduc 1
+av inv 1
+av jag 1
+av le 1
+av le gestionnair 1
+av le minim 1
+av loop 1
+av loop compl 1
+av loop entir 1
+av loop ms 1
+av mak 2
+av multipl 2
+av multipl inherit 1
+av multipl pa 1
+av nonblock 1
+av nonblock result 1
+av nondetermin 1
+av nondetermin behaviour 1
+av obtus 1
+av obtus angl 1
+av of ray 1
+av oper 2
+av oper overload 1
+av over train 1
+av overfit 1
+av perform 1
+av perform work 1
+av pol 1
+av problem 1
+av qu 1
+av qu gard 1
+av redistribut 1
+av redund 1
+av redund comput 1
+av remov 1
+av remov inst 1
+av repeat 3
+av repeat length 1
+av repeat simil 1
+av resort 1
+av revisit 1
+av schem 1
+av short liv 1
+av short term 1
+av simil 1
+av simil mistak 1
+av slap 1
+av slow 1
+av som problem 1
+av split 1
+av split object 1
+av stddev 1
+av stddev min 1
+av stder 1
+av stder stddev 1
+av test 1
+av th addit 1
+av th combin 2
+av th commun 1
+av th cr 1
+av th deadlock 1
+av th dep 1
+av th explicit 1
+av th glob 1
+av th head 1
+av th hug 1
+av th issu 1
+av th mistak 1
+av th overlap 1
+av th pag 1
+av th problem 2
+av th rollback 1
+av th singl 1
+av th techn 1
+av th traver 1
+av th typ 1
+av ti 1
+av to accompl 1
+av transform 1
+av transl 1
+av transl error 1
+av traver 1
+av traver port 1
+av under popl 2
+av unnec 4
+av unnec comparison 1
+av unnec cont 1
+av unnec cop 1
+av unnec lo 1
+av using 3
+av using old 1
+av using part 1
+av var 1
+av with simpl 1
+av work 1
+av work imb 1
+av writ 1
+av.html 1
+avail 92
+avail a further 1
+avail a techn 1
+avail about pot 1
+avail act 1
+avail altern 2
+avail amount 1
+avail and brief 1
+avail and dupl 1
+avail and qu 1
+avail and reconfigur 1
+avail and therefor 1
+avail ar ftp 1
+avail as cathol 1
+avail as cs 1
+avail as dec 1
+avail as ibm 1
+avail as input 1
+avail as inr 1
+avail as rapport 1
+avail as src 1
+avail as tech 1
+avail as techn 5
+avail as umiac 1
+avail at ftp 1
+avail at http 3
+avail at loop 1
+avail begin 1
+avail buffer 2
+avail buffer spac 2
+avail by anonym 2
+avail by ftp 1
+avail by mak 1
+avail ca 1
+avail ch 1
+avail channel 1
+avail channel width 1
+avail cluster 1
+avail cluster technolog 1
+avail color 1
+avail compiler 1
+avail compiler compiler 1
+avail compon 1
+avail const 1
+avail dat 1
+avail dat serv 1
+avail degr 1
+avail disk 1
+avail displ 1
+avail displ manager 1
+avail distribut 1
+avail distribut system 1
+avail electron 1
+avail event 1
+avail failover 1
+avail failover manag 1
+avail featur 1
+avail for dispatch 1
+avail for estim 1
+avail for exam 1
+avail for feedback 1
+avail for match 1
+avail for pack 1
+avail for player 1
+avail for reus 1
+avail for st 1
+avail for us 3
+avail from cac 1
+avail from ftp.ci.upen.edu 1
+avail from ftp.cs.chalmer.se 1
+avail from se 1
+avail funct 2
+avail funct inclus 1
+avail funct unit 1
+avail g design 1
+avail in compil 1
+avail in cur 1
+avail in fortran 1
+avail in hpf 1
+avail in mar 1
+avail in postscript 2
+avail in pub 1
+avail in shar 1
+avail in simil 1
+avail in sl1 1
+avail in theor 1
+avail in wid 1
+avail inclus 1
+avail inclus iter 1
+avail infer 2
+avail infer step 1
+avail inform 4
+avail input 1
+avail insid cluster 1
+avail inst 1
+avail instruc 1
+avail instruc level 1
+avail intern 1
+avail intern concur 1
+avail internet 1
+avail internet resourc 1
+avail ip 1
+avail ip addr 1
+avail is mach 1
+avail item 1
+avail knowledg 1
+avail knowledg prior 1
+avail langu 1
+avail langu proc 1
+avail link 1
+avail link bandwidth 1
+avail loc 1
+avail loc spac 1
+avail mach 1
+avail mechan 1
+avail min 1
+avail min modl 1
+avail modl 1
+avail modl straightaw 1
+avail network 2
+avail network fil 1
+avail network resourc 1
+avail nod 1
+avail nod pair 1
+avail of design 1
+avail of expect 1
+avail of multipl 1
+avail of particl 1
+avail of sa 1
+avail of system 1
+avail on 1
+avail on www 1
+avail onl 1
+avail open port 1
+avail optim 1
+avail pack 1
+avail pack belong 1
+avail pair 1
+avail paragon 1
+avail paragon proc 1
+avail parallel 1
+avail parallel smooth 1
+avail port 1
+avail port proceed 1
+avail proc 3
+avail publ 1
+avail quick 1
+avail read 1
+avail read chunk 1
+avail rel 1
+avail rel model 1
+avail resourc 2
+avail resourc knowledg 1
+avail resourc rav 1
+avail serv 1
+avail short 1
+avail sourc 1
+avail st 1
+avail strateg 1
+avail sub 1
+avail sub modl 1
+avail system 2
+avail system st 1
+avail system us 1
+avail tb 1
+avail th water 1
+avail through www 1
+avail tim 3
+avail to execut 1
+avail to form 1
+avail to register 1
+avail to rj 1
+avail to rk 1
+avail to support 1
+avail tool 1
+avail track 1
+avail track disk 1
+avail unit 1
+avail versus con 1
+avail vi anonym 4
+avail vi explicit 1
+avail vi rol 1
+avail vi www 2
+avail web 1
+avail web prox 1
+avail wh 1
+avail wh aspect 1
+avail which support 1
+avail which transl 1
+avail worldw 1
+avail.2 1
+availab 1
+availab tim 1
+availbl 1
+avait 3
+avait du 1
+avait du sen 1
+avait eventuel 1
+avait la 1
+avait la volont 1
+avait un droit 1
+aval 1
+aval du 1
+aval du partit 1
+avalon 1
+avanc 1
+avanc e par 1
+avanc ee 1
+avant 5
+avant a diff 1
+avant absorb 1
+avant absorb est 1
+avant absorb sexprim 1
+avant chaqu 1
+avant chaqu appel 1
+avant chaqu mi 1
+avant conceptuel 1
+avant conceptuel de 1
+avant coupur 1
+avant coupur apr 1
+avant coupur de 1
+avant d ecrir 1
+avant d er 1
+avant d etr 1
+avant dappeler 1
+avant de 3
+avant de chaqu 1
+avant de cr 1
+avant de lappliquer 1
+avant de notr 1
+avant de partitionner 1
+avant de perdr 1
+avant de pouvoir 1
+avant de proposer 1
+avant de quitter 1
+avant de recevoir 1
+avant de relancer 1
+avant de remettr 1
+avant de revenir 1
+avant de se 1
+avant deffectuer 1
+avant deffectuer le 1
+avant dexaminer 1
+avant dexaminer le 1
+avant dun 1
+avant dun calcl 1
+avant et ar 1
+avant et contr 1
+avant et le 1
+avant etant 1
+avant etant implicit 1
+avant jusqu 1
+avant l elim 1
+avant l etap 1
+avant la 2
+avant la cr 1
+avant la fin 2
+avant la prem 1
+avant lappel 1
+avant lappel du 1
+avant larchitectur 1
+avant le 2
+avant le born 1
+avant le branch 1
+avant le environ 1
+avant le point 1
+avant le retour 1
+avant lec 2
+avant lec ecut 2
+avant lempil 1
+avant lempil du 1
+avant lenviron7 1
+avant lun 1
+avant lun de 1
+avant par 1
+avant par empil 1
+avant par me 1
+avant perm 1
+avant perm de 1
+avant qu 2
+avant qu ce 1
+avant qu le 1
+avant quun 2
+avant quun instruc 1
+avant quun processeur 1
+avant tout 2
+avant tout ch 1
+avant tout empil 1
+avantageus 1
+avantageus quun 1
+avantageus quun approch 1
+avec 9
+avec acc 1
+avec acc es 1
+avec au 1
+avec b posit 1
+avec ce 3
+avec ce dern 1
+avec ce don 1
+avec ce mod 1
+avec ce not 1
+avec ce opt 1
+avec ce protocol 1
+avec ce typ 1
+avec ce valeur 1
+avec champ 1
+avec champ arit 1
+avec compact 1
+avec contraint 1
+avec contraint chip 1
+avec contraint elip 1
+avec coupur 1
+avec coupur superficiel 1
+avec court 1
+avec court circuit 1
+avec cr 1
+avec cr eat 1
+avec dautr 2
+avec dautr techniqu 1
+avec dautr term 1
+avec de 3
+avec de colon 1
+avec de coupur 1
+avec de droit 1
+avec de hypoth 1
+avec de interv 1
+avec de pa 1
+avec de rout 1
+avec de solut 1
+avec de vecteur 1
+avec diff 1
+avec diff erent 1
+avec discern 1
+avec disj 1
+avec e don 1
+avec echantillon 1
+avec echantillon pr 1
+avec echec 1
+avec echec profon 1
+avec el 1
+avec enregister 1
+avec enregister dactiv 1
+avec estampil 1
+avec estampil est 1
+avec estampil par 1
+avec etiqu 1
+avec eux 1
+avec eux ont 1
+avec i eventuel 1
+avec j dn1 1
+avec k aus 1
+avec l ag 1
+avec l elag 1
+avec l elim 1
+avec l volut 1
+avec la 4
+avec la biolog 1
+avec la connec 1
+avec la conv 1
+avec la coupur 1
+avec la cr 1
+avec la deux 1
+avec la figur 1
+avec la gest 1
+avec la mach 1
+avec la matr 1
+avec la moin 1
+avec la nouvel 1
+avec la pair 1
+avec la particularit 1
+avec la possibilit 1
+avec la pr 1
+avec la prem 1
+avec la produc 1
+avec la repr 1
+avec la reproduc 1
+avec la signioc 1
+avec la solut 1
+avec la substitut 1
+avec la tail 1
+avec la techniqu 1
+avec la th 1
+avec la valeur 1
+avec la var 1
+avec la ver 1
+avec la wam 1
+avec lac 1
+avec laccr 1
+avec laccr du 1
+avec lag 1
+avec lag par 1
+avec lalgorithm 1
+avec lalgorithm stochastiqu 1
+avec lav 1
+avec lav en 1
+avec le 4
+avec le algorithm 1
+avec le autr 1
+avec le avant 1
+avec le calcl 1
+avec le co 1
+avec le cod 1
+avec le colon 1
+avec le configur 1
+avec le contr 1
+avec le court 1
+avec le crit 1
+avec le degr 1
+avec le deux 1
+avec le don 1
+avec le droit 1
+avec le dur 1
+avec le environ 1
+avec le ind 1
+avec le net 1
+avec le not 1
+avec le optim 1
+avec le pa 2
+avec le param 1
+avec le point 1
+avec le program 1
+avec le propr 1
+avec le prot 1
+avec le recuit 1
+avec le techniqu 1
+avec le transfer 1
+avec lesquel 1
+avec lesquel nous 1
+avec li 1
+avec li ee 1
+avec linstruc 1
+avec linstruc cal 1
+avec linstruc suiv 1
+avec linver 1
+avec linver nous 1
+avec lopt 1
+avec lopt darithm 1
+avec loptim 1
+avec loptim dappel 1
+avec lorgan 1
+avec lorgan de 1
+avec lu 1
+avec lu le 1
+avec m a2 1
+avec m1 1
+avec m1 10q1 1
+avec migr 1
+avec migr de 1
+avec no 1
+avec no hypoth 1
+avec non 1
+avec non nl 1
+avec notr 2
+avec notr estim 1
+avec o0 1
+avec ou 1
+avec ou ou 1
+avec p processeur 1
+avec part 1
+avec part de 1
+avec part elimin 1
+avec partit 1
+avec partit en 1
+avec peu 1
+avec peu de 1
+avec pgcd 1
+avec pil 1
+avec pil glob 1
+avec plus de 1
+avec point 1
+avec point de 1
+avec pointeur 1
+avec pointeur de 1
+avec potentiel 1
+avec potentiel le 1
+avec protocol 1
+avec qu 1
+avec qu le 1
+avec quatr 1
+avec quatr fo 1
+avec r ecup 1
+avec r eutil 1
+avec register 1
+avec rem 1
+avec retour 1
+avec retour ar 1
+avec sa 2
+avec sav ch 1
+avec se 1
+avec se voisin 1
+avec sml 1
+avec som 1
+avec som de 1
+avec son 2
+avec son ag 1
+avec son ind 1
+avec succ 1
+avec succ es 1
+avec support 1
+avec support pour 1
+avec tc 1
+avec tous 1
+avec tous le 1
+avec toutef 1
+avec toutef un 1
+avec tr 2
+avec tr cel 1
+avec tr op 1
+avec try 1
+avec un 5
+avec un architectur 1
+avec un attribut 1
+avec un branch 1
+avec un chantillon 1
+avec un co 1
+avec un combinaison 1
+avec un commun 1
+avec un configur 1
+avec un cr 1
+avec un degr 1
+avec un droit 1
+avec un elag 1
+avec un estampil 1
+avec un etiqu 1
+avec un fort 1
+avec un gel 1
+avec un gentil 1
+avec un historiqu 1
+avec un minim 1
+avec un niveau 1
+avec un nombr 1
+avec un ordonnanc 1
+avec un pa 1
+avec un probabilit 1
+avec un regroup 1
+avec un repr 1
+avec un sch 1
+avec un sel 2
+avec un simpl 1
+avec un som 1
+avec un str 1
+avec un techniqu 1
+avec un tent 1
+avec un term 1
+avec un treil 1
+avec unif 1
+avec unif ext 1
+avec util 1
+avec util dun 1
+avenir 1
+avenir proch 1
+aventur 1
+aventur formid 1
+avenu 6
+avenu columbus 1
+avenu of further 1
+avenu of investig 1
+aver 51
+aver accur 1
+aver algorithm 1
+aver algorithm cpu 1
+aver amount 1
+aver and inst 1
+aver and maxim 1
+aver and sampl 1
+aver and standard 1
+aver and therefor 1
+aver aver 1
+aver aver algorithm 1
+aver bin 1
+aver bin imag 1
+aver broadcast 1
+aver broadcast period 1
+aver ca 5
+aver ca an 2
+aver ccidl 1
+aver ccidl 10ms 1
+aver color 1
+aver commun 2
+aver commun cost 2
+aver commun tim 1
+aver comput 1
+aver comput cost 1
+aver cost 1
+aver cuml 1
+aver cuml chang 1
+aver cycl 1
+aver cycl length 1
+aver degr 3
+aver del 2
+aver dist 3
+aver dupl 1
+aver dupl lifetim 1
+aver edg 1
+aver edg length 1
+aver execut 1
+aver execut tim 1
+aver fact 1
+aver for indep 1
+aver gener 1
+aver gener accur 1
+aver half 1
+aver inclus 1
+aver inclus instruc 1
+aver int 1
+aver interv 1
+aver is comput 1
+aver is expon 1
+aver is inferior 1
+aver it retain 1
+aver lat 3
+aver length 2
+aver lif 1
+aver lif tim 1
+aver lifetim 1
+aver link 1
+aver link util 1
+aver load 1
+aver maxim 1
+aver maxim number 1
+aver me 1
+aver me lat 1
+aver me length 1
+aver measur 1
+aver model 1
+aver model ba 1
+aver mov 1
+aver n tail 1
+aver number 12
+aver of qualif 1
+aver on year 1
+aver oper 2
+aver oper del 1
+aver or inst 1
+aver oracl 1
+aver oracl abil 1
+aver over heter 1
+aver over se 1
+aver overlap 1
+aver overlap oeapbp 1
+aver pack 2
+aver pack del 1
+aver pack siz 1
+aver pack transm 1
+aver parallel 1
+aver payoff 1
+aver payoff intak 1
+aver perc 1
+aver problem 1
+aver proc 1
+aver quick 1
+aver quick sort 1
+aver rat 3
+aver rel 1
+aver rel iter 1
+aver residu 1
+aver residu overhead 1
+aver respon 1
+aver respon tim 1
+aver result 1
+aver rout 1
+aver rout describ 1
+aver rout estim 1
+aver sal 2
+aver scan 1
+aver schem 1
+aver se 1
+aver se dur 1
+aver separ 1
+aver serivc 1
+aver serivc addr 1
+aver serv 2
+aver serv addr 1
+aver serv downtim 1
+aver shown 1
+aver siz 2
+aver slow 1
+aver solut 1
+aver som cach 1
+aver specl 1
+aver specl smooth 1
+aver speed 1
+aver speedup 3
+aver squar 1
+aver squar error 1
+aver supernod 1
+aver supernod siz 1
+aver test 1
+aver test se 1
+aver th influ 1
+aver thin 1
+aver thin lin 1
+aver throughput 2
+aver tim 9
+aver tim gener 1
+aver tim nec 1
+aver tim requir 2
+aver tim spent 1
+aver to achief 1
+aver tr 1
+aver tr length 1
+aver train 1
+aver train tim 1
+aver unavail 1
+aver valu 4
+aver ver 1
+aver weight 1
+aver with error 1
+aver year 1
+averag 6
+averag a saving 1
+averag our result 1
+averag travel 2
+averag travel ininternet 2
+aveugl 1
+aveugl est 1
+aveugl est evit 1
+aveugl et au 1
+aveugl lor 1
+aveugl lor dun 1
+aveugl r eappar 1
+aveugl ren 1
+aveugl ren laffect 1
+aveugl sont 1
+avg 8
+avg and ad 1
+avg and avg2 1
+avg appl 1
+avg appl min 1
+avg calcavg 1
+avg cs.ucsc.edu 1
+avg cs.ucsc.edu tsuj 1
+avg of figur 1
+avg rel.std 1
+avg rel.std med 1
+avg2 1
+avg2 p4.s5a 1
+avg2s 1
+avg2s cfg 1
+avil 1
+avion 2
+avion developm 1
+avion industr 1
+aviv 1
+avkamp 1
+avkamp sc.kun.nl 1
+avn89 1
+avnaim 1
+avoc 1
+avoir 4
+avoir a la 1
+avoir accept 1
+avoir avec 1
+avoir avec eux 1
+avoir besoin 1
+avoir besoin dan 1
+avoir cherch 1
+avoir d ecrit 1
+avoir d evelop 1
+avoir de 3
+avoir de coupur 1
+avoir de espac 1
+avoir de meilleur 1
+avoir de valeur 1
+avoir eu 1
+avoir eu le 1
+avoir lieu 1
+avoir lieu dan 1
+avoir lieu entr 1
+avoir lieu ser 1
+avoir offer 1
+avoir offer lopportunit 1
+avoir pour 1
+avoir pour eff 1
+avoir pour port 1
+avoir pu 1
+avoir pu effectuer 1
+avoir rappel 1
+avoir restaur 1
+avoir ten 2
+avoir trait 1
+avoir un 1
+avoir un pr 1
+avoir val 1
+avoir voulu 1
+avon 5
+avon abord 1
+avon adopt 1
+avon adopt ee 1
+avon assoc 1
+avon aus 1
+avon aus tud 1
+avon bien 1
+avon ch 2
+avon ch ce 1
+avon ch pour 1
+avon cherch 2
+avon compl 1
+avon conclu 1
+avon conclu de 1
+avon d ecrit 2
+avon d ej 1
+avon d emontr 2
+avon d velop 1
+avon dan 1
+avon dan ce 1
+avon de 1
+avon dit 1
+avon dit pr 1
+avon donc 1
+avon donc introduit 1
+avon donc orient 1
+avon effectu 1
+avon effectu ee 1
+avon egal 1
+avon egal calcl 1
+avon egal compar 1
+avon egal test 1
+avon entrepr 1
+avon eoeectu 1
+avon etud 2
+avon etud es 1
+avon exp 2
+avon exp erim 2
+avon fait 1
+avon fait de 1
+avon fourn 1
+avon fourn quelqu 1
+avon ignor 1
+avon implanter 1
+avon implanter un 1
+avon introduit 1
+avon ment 1
+avon mesur 1
+avon mi 1
+avon mi en 1
+avon montr 2
+avon pr 4
+avon pr com 1
+avon pr consc 1
+avon pr ec 1
+avon pr esent 2
+avon pr sent 1
+avon prop 3
+avon prop ee 1
+avon pu 1
+avon pu caract 1
+avon pu formaliser 1
+avon soulign 2
+avon sup 2
+avon tent 1
+avon tout 1
+avon tout dabord 1
+avon trait 1
+avon un op 1
+avon util 2
+avon util ee 1
+avon vu 3
+avon vu au 1
+avon vu en 1
+avon vu lor 1
+avon vu pr 1
+avon vu qu 2
+avon vu quil 1
+avort 1
+avou 1
+avou qu 1
+avou qu le 1
+avouer 1
+avouer quun 1
+avouer quun bon 1
+avril 2
+aw 1
+aw0 1
+aw1 1
+aw2 1
+aw3 1
+aw89 1
+await 3
+await it acknowledg 1
+await proc 1
+await th dat 1
+await transm 1
+awak 1
+awak al neighbor 1
+awak al nod 1
+awar 17
+awar and coord 1
+awar and why 1
+awar browser 1
+awar mak 1
+awar of bar 1
+awar of problem 1
+awar of work 1
+award 6
+award ccr 1
+award mip 2
+award with match 1
+awerbuch 2
+awerbuch algorithm 1
+awerbuch and peleg 1
+awerbuch bar noy 1
+awk 6
+awk and contain 1
+awk and unnec 1
+awk ar reorder 1
+awk for concur 1
+awk to forml 1
+ax 9
+ax b le 1
+ax bg 2
+ax es 1
+ax es sur 1
+ax0 1
+axb2y 1
+axiom 11
+axiom and definit 1
+axiom and import 1
+axiom and rl 1
+axiom and theorem 1
+axiom ar self 1
+axiom bear 1
+axiom by examin 1
+axiom c2 1
+axiom character 1
+axiom concern reg 1
+axiom correspon 1
+axiom differ 1
+axiom for argum 1
+axiom for dynam 1
+axiom for funct 1
+axiom for prob 1
+axiom guar 1
+axiom he clarif 1
+axiom hold 2
+axiom imp 1
+axiom in sect 1
+axiom is denot 1
+axiom method 1
+axiom of el 1
+axiom of euclidean 1
+axiom of ext 1
+axiom of funct 1
+axiom of hilog 1
+axiom of ml 1
+axiom of mod 1
+axiom of sect 1
+axiom pr 1
+axiom prov 1
+axiom qbfun1 1
+axiom requir 1
+axiom say 1
+axiom se 1
+axiom st 3
+axiom st indirect 1
+axiom stipl 1
+axiom system 1
+axiom theor 1
+axiom wa constrain 1
+axiom which asser 1
+axiom which ensur 1
+axiom with suit 1
+axiomat 2
+axiomat for funct 1
+axiomat of el 1
+axiomatiz 2
+axiomatiz th sem 1
+axon.cs.byu.edu 1
+axpr 1
+axpr al ground 1
+axx2 1
+axx2 ayy2 1
+axx2 bxx 1
+axx2 bxx ayy2 1
+ay 3
+ay kb 1
+ayach 1
+ayant 5
+ayant conduit 1
+ayant conduit au 1
+ayant la 1
+ayant la possibilit 1
+ayant le 2
+ayant le caract 1
+ayant lieu 1
+ayant lieu par 1
+ayant pour 3
+ayant pour orig 1
+ayant pour racin 1
+ayant pr 1
+ayant pr ec 1
+ayant serv 1
+ayant serv aux 1
+ayant surv 1
+ayant surv ecu 1
+ayant test 1
+ayant tous 1
+ayant tous se 1
+ayant un 1
+ayant un alphab 1
+ayant un fit 1
+ayant un grand 1
+ayb2x 1
+ayb2x axb2y 1
+aykanat 1
+aykanat et al 1
+aylamazyan 1
+aymptot 1
+aymptot reach 1
+ayy2 1
+ayy2 byy 1
+az 3
+az and guillerm 1
+az and jam 1
+az and william 1
+az iz 1
+azar 2
+azar et al 1
+azem 1
+azy 1
+azy dog.j 1
+azy dog.j ump 1
+azy dog.q 1
+azy dog.q uick 1
+azzoun 1
+b 2
+b.1 5
+b.1 algebr 1
+b.1 algebr expr 1
+b.1 d riv 1
+b.1.1 1
+b.1.2 1
+b.1.3 1
+b.10 2
+b.10 and b.11 1
+b.11 1
+b.2 5
+b.2 algebr 1
+b.2 algebr expr 1
+b.2 d riv 1
+b.2.1 1
+b.2.2 1
+b.2.3 1
+b.2.4 1
+b.2.5 1
+b.2.6 1
+b.3 3
+b.3 algebr 1
+b.3 algebr expr 1
+b.3 quelqu 1
+b.3.1 1
+b.3.1 inver 1
+b.3.2 1
+b.3.2 dist 1
+b.3.2 dist de 1
+b.3.3 1
+b.3.3 d termin 1
+b.4 2
+b.5 2
+b.6 2
+b.7 2
+b.8 2
+b.9 2
+b.a 3
+b.c 4
+b.g 2
+b.j 1
+b.k 1
+b.l 1
+b.n 1
+b.p 4
+b.p.93 1
+b.s 2
+b.shiraz 1
+b.taurus 1
+b.taurus boifn 1
+b.taurus boifn alph 1
+b.taurus dn 1
+b.taurus dn sequ 1
+b.v 5
+b.w 1
+b0 19
+b0 and c0 1
+b0 ar integer 1
+b0 b b0 1
+b0 b1 1
+b0 b1 b2 1
+b0 by recogn 1
+b0 by transform 1
+b0 c0 1
+b0 c1 2
+b0 c1 c2 1
+b0 denot 1
+b0 hf0 1
+b0 instead 1
+b0 intersect 1
+b0 l2 1
+b0 p b00g 1
+b0 p bg 1
+b0 pb 1
+b0 return 1
+b0 th adder 1
+b0 that intersect 1
+b0 that produc 1
+b00 3
+b00g 1
+b00i 1
+b03 1
+b0i 1
+b0i pmj 1
+b0p 1
+b0p 1x0 1
+b0z 1
+b1 24
+b1 and b2 1
+b1 b1 1
+b1 b2 2
+b1 b2 b3 1
+b1 b3 1
+b1 b3 b4 1
+b1 c0 1
+b1 c1 1
+b1 cd 2
+b1 et b2 1
+b1 l1 1
+b1 m1 1
+b1 or b2 1
+b1 pcc 1
+b1 should scal 2
+b1 sup 1
+b1 sup ss2 1
+b1 y d1 1
+b10 1
+b10k 1
+b16 1
+b1b2 2
+b2 16
+b2 and mgu 1
+b2 b3 1
+b2 b3 b4 1
+b2 c2 1
+b2 compl 1
+b2 compl determin 1
+b2 const2 1
+b2 constx2 1
+b2 def 1
+b2 div 1
+b2 div x52 1
+b2 k22 1
+b2 k22 k24 1
+b2 l2 1
+b2 loc 1
+b2 loc def 1
+b2 point 1
+b2 sup 1
+b2 sup ss2 1
+b2 y d2 1
+b23 1
+b2345 1
+b2b 1
+b2f0 1
+b2i 1
+b2termin 1
+b3 5
+b3 b4 2
+b3 b4 b2 1
+b3 b6 1
+b3f2 1
+b4 4
+b4 b2 1
+b45 2
+b45 11x 1
+b5 2
+b6 2
+b68 1
+b7 2
+b7g 1
+b7x 1
+b8 2
+b9 2
+b9 is satisf 1
+b9g 1
+ba 128
+ba a claim 1
+ba a dec 1
+ba a network 1
+ba a program 1
+ba a reduc 1
+ba a sequ 1
+ba a theor 1
+ba acc 1
+ba act 1
+ba act cl 1
+ba act execut 1
+ba act model 1
+ba addr 1
+ba addr mod 1
+ba algorithm 12
+ba algorithm anim 1
+ba algorithm con 1
+ba algorithm fo 1
+ba an 2
+ba an expr 1
+ba and color 1
+ba and cont 1
+ba and electr 1
+ba and fac 1
+ba and input 1
+ba and me 1
+ba and modif 1
+ba and non 1
+ba and rev 1
+ba and support 1
+ba and tabl 1
+ba and tren 1
+ba appl 1
+ba appl design 1
+ba approach 16
+ba approach lead 1
+ba ar 1
+ba ar clear 1
+ba ar dat 1
+ba ar introduc 1
+ba ar lik 1
+ba architectur 6
+ba architectur prov 1
+ba archiv 1
+ba archiv fil 1
+ba arithm 2
+ba arithm oper 2
+ba aspect 1
+ba assum 1
+ba atd 1
+ba atm 1
+ba atm siml 1
+ba avec 1
+ba avec lesquel 1
+ba avion 1
+ba avion developm 1
+ba ba 2
+ba ba select 1
+ba bb 1
+ba bb correspon 1
+ba be character 1
+ba belief 1
+ba block 2
+ba block flow 1
+ba block string 1
+ba blocksp 1
+ba blocksp ictur 1
+ba book 1
+ba bp 2
+ba bp algorithm 1
+ba buffer 1
+ba buffer wormhol 1
+ba build 1
+ba build block 1
+ba built 1
+ba c co 1
+ba ca 4
+ba cach 3
+ba cach coh 3
+ba cach inv 1
+ba cal 1
+ba cal structur 1
+ba calculus 1
+ba canoniqu 1
+ba canoniqu de 1
+ba categor 1
+ba centr 1
+ba centr buffer 1
+ba chang 1
+ba cl 3
+ba cl method 1
+ba classif 1
+ba cluster 2
+ba co 1
+ba co proc 1
+ba cod 1
+ba cod gener 1
+ba coh 1
+ba coh mechan 1
+ba coh method 1
+ba coh schem 1
+ba collect 1
+ba collect commun 1
+ba color 1
+ba color histogram 1
+ba commun 1
+ba commun mod 1
+ba compil 2
+ba compil level 1
+ba compil techniqu 1
+ba complec 1
+ba complec cl 1
+ba compon 3
+ba comput 1
+ba comput nod 1
+ba computer 1
+ba con 1
+ba concept 3
+ba concept requir 1
+ba concur 2
+ba concur langu 1
+ba concur object 1
+ba configur 1
+ba constitu 1
+ba constraint 1
+ba constraint qu 1
+ba construc 3
+ba counterpart 1
+ba custom 1
+ba custom control 1
+ba cycl 1
+ba cycl gener 1
+ba d dim 1
+ba dan 1
+ba dan la 1
+ba dat 5
+ba dat path 1
+ba dat proc 1
+ba dat structur 2
+ba dat transport 1
+ba dat typ 1
+ba de 5
+ba de ce 2
+ba de don 2
+ba de la 1
+ba de larchitectur 1
+ba de limpl 1
+ba de loptim 1
+ba de motif 1
+ba de no 1
+ba de pag 1
+ba de point 1
+ba de term 1
+ba de z3 1
+ba de zn 1
+ba decluster 2
+ba decluster method 2
+ba decomposit 1
+ba deep 1
+ba deep level 1
+ba definit 6
+ba dempil 1
+ba dempil de 1
+ba denot 1
+ba denot defin 1
+ba design 7
+ba design dec 1
+ba design involut 1
+ba design system 1
+ba detect 1
+ba diagn 2
+ba diagn cur 1
+ba differ 2
+ba differ ar 1
+ba difficult 1
+ba dimpl 1
+ba dimpl em 1
+ba discrim 1
+ba distinct 1
+ba div 1
+ba domain 1
+ba dpl 1
+ba dpl framework 1
+ba du 1
+ba du noyau 1
+ba dun 2
+ba dun alg 1
+ba dun impl 1
+ba dun th 1
+ba dynam 1
+ba dynam program 1
+ba e sur 4
+ba edg 1
+ba edg detect 1
+ba edit 1
+ba edit prov 1
+ba educ 1
+ba educ mater 1
+ba ee 3
+ba ee sur 3
+ba el 3
+ba en 1
+ba en nutil 1
+ba encapsl 1
+ba encapsl idispatch 1
+ba encod 1
+ba ent 1
+ba ent con 1
+ba environm 2
+ba es 2
+ba es sur 2
+ba et le 1
+ba et un 1
+ba evalu 2
+ba event 1
+ba event handl 1
+ba exampl 1
+ba execut 2
+ba execut model 1
+ba experim 1
+ba experim yield 1
+ba f1 1
+ba facil 1
+ba fact 4
+ba fair 1
+ba fair queu 1
+ba fault 1
+ba fault toler 1
+ba featur 3
+ba featur extract 1
+ba ffl est 1
+ba for addit 1
+ba for aim 1
+ba for appl 1
+ba for assembl 1
+ba for ch 1
+ba for color 1
+ba for comparison 1
+ba for implem 2
+ba for infer 1
+ba for oper 1
+ba for optim 1
+ba for parallel 1
+ba for prec 1
+ba for publ 1
+ba for pur 1
+ba for quest 1
+ba for stud 1
+ba for technologyindep 1
+ba for worm 1
+ba form 3
+ba framework 1
+ba funct 3
+ba funct langu 1
+ba gam 1
+ba gener 2
+ba gener techniqu 1
+ba goal 2
+ba grammar 1
+ba grammar captur 1
+ba graph 1
+ba group 1
+ba guidel 2
+ba hardwar 1
+ba hardwar multicast 1
+ba hardwar repl 1
+ba heur 1
+ba heur prompt 1
+ba heur regard 1
+ba hypercub 1
+ba hypercub oper 1
+ba hypergeometer 1
+ba hypergeometer ser 1
+ba hyperoctr 1
+ba id 12
+ba id gener 1
+ba imag 1
+ba imag decomposit 1
+ba imag ind 1
+ba imag qu 1
+ba implem 4
+ba implem show 1
+ba in turn 1
+ba ind 1
+ba ind prov 1
+ba ind qu 1
+ba infer 2
+ba infer mechan 1
+ba input 1
+ba interconnect 2
+ba interconnect network 1
+ba interprocedur 1
+ba interprocedur test 1
+ba intraprocedur 1
+ba intraprocedur algorithm 1
+ba intuit 3
+ba intuit underl 1
+ba invar 1
+ba jigsaw 1
+ba jigsaw puzzl 1
+ba k nearest 1
+ba kind 1
+ba knowledg 3
+ba knowledg acquisit 1
+ba knowledg program 1
+ba knowledg repr 1
+ba la 2
+ba la fonct 1
+ba la transform 1
+ba langu 6
+ba langu design 1
+ba lat 2
+ba laz 1
+ba laz rel 1
+ba learn 4
+ba learn algorithm 1
+ba learn commun 1
+ba learn mater 1
+ba learn system 1
+ba level 1
+ba level appl 1
+ba level argum 1
+ba level cl 1
+ba level construc 1
+ba level definit 1
+ba level inst 1
+ba level method 1
+ba level object 1
+ba level program 1
+ba lingu 1
+ba loc 2
+ba loc alignm 1
+ba loc ar 1
+ba log 2
+ba log interfac 1
+ba loop 1
+ba low 1
+ba low level 1
+ba lrc 1
+ba lrc implem 1
+ba lrc scal 1
+ba mach 3
+ba mach model 1
+ba major 1
+ba major funct 1
+ba manag 2
+ba manag system 2
+ba managem 1
+ba managem system 1
+ba map 1
+ba match 1
+ba mater 1
+ba me 1
+ba me pa 1
+ba mechan 2
+ba mechan requir 1
+ba med 1
+ba merg 1
+ba merg strateg 1
+ba mesh 1
+ba method 7
+ba method requir 1
+ba method suffer 1
+ba micr 1
+ba mitig 2
+ba mod 1
+ba mod log 1
+ba model 5
+ba model incorpor 1
+ba modl 1
+ba modl system 1
+ba motiv 1
+ba multicast 2
+ba multicast commun 1
+ba multicast implem 1
+ba multicast problem 1
+ba multicast prop 1
+ba multicast rout 1
+ba multicast schem 1
+ba multicast using 1
+ba multicomputer 1
+ba multiproc 1
+ba natur 2
+ba natur langu 1
+ba nearest 1
+ba nearest neighbor 1
+ba net 1
+ba network 4
+ba network environm 1
+ba neur 3
+ba neur net 1
+ba neur network 2
+ba niveau 2
+ba niveau com 1
+ba niveau de 1
+ba nor requir 1
+ba np 1
+ba np compl 1
+ba object 5
+ba object orient 3
+ba of compact 1
+ba of confid 1
+ba of context 1
+ba of cycl 1
+ba of eff 2
+ba of el 1
+ba of exper 1
+ba of induc 1
+ba of ker 1
+ba of l2 1
+ba of level 1
+ba of log 1
+ba of mahalanob 1
+ba of martin 1
+ba of rel 2
+ba of rol 1
+ba of sort 1
+ba of stud 1
+ba of tradit 1
+ba of user 1
+ba of var 3
+ba ol 1
+ba ol technolog 1
+ba on 3d 1
+ba on abstract 1
+ba on adv 1
+ba on algorithm 1
+ba on an 1
+ba on appropr 1
+ba on atm 1
+ba on attach 1
+ba on attribut 1
+ba on categor 1
+ba on ch 1
+ba on chang 1
+ba on chernoff 1
+ba on color 1
+ba on commun 2
+ba on concept 1
+ba on concur 1
+ba on connect 1
+ba on constraint 2
+ba on construc 1
+ba on control 1
+ba on corner 1
+ba on csp 1
+ba on datab 1
+ba on dataflow 1
+ba on dec 1
+ba on deriv 1
+ba on detail 1
+ba on differ 1
+ba on direct 1
+ba on distribut 1
+ba on dynam 1
+ba on edg 1
+ba on eff 1
+ba on energ 1
+ba on eqn 1
+ba on evalu 1
+ba on explan 1
+ba on expr 1
+ba on ext 1
+ba on extern 1
+ba on extrem 1
+ba on featur 1
+ba on gener 2
+ba on geometer 2
+ba on gogu 1
+ba on good 1
+ba on graph 3
+ba on ground 1
+ba on hist 1
+ba on hypercub 2
+ba on imag 2
+ba on increm 2
+ba on input 1
+ba on int 1
+ba on interfac 1
+ba on intern 2
+ba on interv 2
+ba on inver 1
+ba on irregl 1
+ba on johnson 1
+ba on knowledg 2
+ba on lec 1
+ba on leight 1
+ba on lin 3
+ba on loc 1
+ba on log 1
+ba on lol 1
+ba on lowerlevel 1
+ba on maintain 1
+ba on mar 1
+ba on maxim 1
+ba on measur 1
+ba on minim 2
+ba on ml 1
+ba on mlp 1
+ba on mod 2
+ba on model 1
+ba on morpholog 1
+ba on mult 2
+ba on multilevel 1
+ba on multipl 1
+ba on multisc 1
+ba on mutu 1
+ba on non 1
+ba on observ 1
+ba on ol 1
+ba on oper 1
+ba on opin 1
+ba on optim 1
+ba on output 1
+ba on pack 2
+ba on parallel 1
+ba on path 1
+ba on plaus 1
+ba on point 2
+ba on pointer 1
+ba on prim 2
+ba on principl 1
+ba on prior 1
+ba on proc 2
+ba on program 2
+ba on project 1
+ba on proper 1
+ba on prototyp 1
+ba on random 1
+ba on rank 1
+ba on ray 1
+ba on receiv 1
+ba on recur 1
+ba on reg 1
+ba on regl 1
+ba on reinforc 1
+ba on resourc 1
+ba on run 1
+ba on schem 1
+ba on self 1
+ba on sep 1
+ba on separ 1
+ba on sequ 1
+ba on show 1
+ba on simil 2
+ba on simpl 1
+ba on singl 1
+ba on smear 1
+ba on soft 1
+ba on specl 1
+ba on spin 1
+ba on split 1
+ba on st 1
+ba on standard 2
+ba on stat 2
+ba on structur 1
+ba on sub 1
+ba on threshold 1
+ba on timestamp 1
+ba on tot 1
+ba on tr 3
+ba on track 1
+ba on transl 1
+ba on treat 1
+ba on tw. 1
+ba on twin 1
+ba on typ 2
+ba on unfold 1
+ba on univer 1
+ba on var 3
+ba on visu 2
+ba on wam 1
+ba on whitehead 1
+ba on writ 1
+ba oolp 1
+ba oolp langu 1
+ba oper 11
+ba oper defin 1
+ba oper system 1
+ba or exper 1
+ba or fac 1
+ba or fram 1
+ba order 1
+ba order algorithm 1
+ba order approach 1
+ba order heur 1
+ba order method 1
+ba order softwar 1
+ba order subrout 1
+ba order techniqu 1
+ba orer 1
+ba osl 1
+ba osl order 1
+ba our goal 1
+ba our investig 1
+ba pandemon 1
+ba pandemon id 1
+ba parallel 5
+ba parallel cod 1
+ba parallel langu 1
+ba parallel program 1
+ba parallel system 2
+ba partit 2
+ba partit oper 1
+ba pcct 1
+ba pcct system 1
+ba permut 1
+ba permut network 1
+ba ph 1
+ba plan 1
+ba ponctuel 1
+ba post 1
+ba post proc 1
+ba postproc 2
+ba pour 4
+ba pour acc 1
+ba pour la 2
+ba pour trouver 1
+ba pour un 1
+ba principl 4
+ba privileg 1
+ba privileg se 1
+ba prob 1
+ba problem 2
+ba problem adm 1
+ba problem solut 1
+ba proc 1
+ba procedur 1
+ba program 8
+ba program an 1
+ba program cour 1
+ba program langu 1
+ba program manipl 1
+ba prolog 1
+ba prolog compiler 1
+ba prolog eng 1
+ba prolog mechan 1
+ba prolog oper 1
+ba proper 4
+ba protect 2
+ba protect affirm 1
+ba protect ment 1
+ba protect offer 1
+ba protect se 1
+ba protect techniqu 1
+ba protocol 1
+ba prov 1
+ba pseud 1
+ba pseud concur 1
+ba purp 1
+ba qu 3
+ba qu approach 1
+ba qu optim 1
+ba qu tr 1
+ba quadtr 1
+ba real 1
+ba real tim 1
+ba reason 5
+ba reason explan 1
+ba reason why 1
+ba receiver 1
+ba receiver rel 1
+ba recognit 1
+ba recognit schem 1
+ba reflect 1
+ba reg 1
+ba reg extract 1
+ba regr 1
+ba regr test 1
+ba rel 3
+ba rel oper 1
+ba relationship 1
+ba remot 1
+ba remot docum 1
+ba repr 2
+ba repr describ 1
+ba repr tp 1
+ba requir 1
+ba research 4
+ba research act 3
+ba research project 1
+ba resourc 1
+ba resourc structur 1
+ba rest 1
+ba result 1
+ba retrief 1
+ba rl 2
+ba rol 1
+ba rol relationship 1
+ba rough 1
+ba rout 2
+ba rout conform 1
+ba runtim 1
+ba runtim system 1
+ba s autom 1
+ba s sur 1
+ba sa 1
+ba say 1
+ba sc 1
+ba sc approach 1
+ba schedl 2
+ba schedl algorithm 2
+ba schedl ba 1
+ba scheduler 2
+ba schem 3
+ba schem allow 1
+ba schem requir 1
+ba schem us 1
+ba schem using 1
+ba sdm 1
+ba se 3
+ba se contain 1
+ba search 1
+ba secur 1
+ba secur system 1
+ba segm 2
+ba segm method 1
+ba select 4
+ba select ba 1
+ba select method 1
+ba select retest 1
+ba select threshold 1
+ba sem 2
+ba sem oper 1
+ba sem sem 1
+ba sequ 1
+ba serv 2
+ba serv discipl 1
+ba siml 2
+ba siml loop 1
+ba siml testb 1
+ba snoop 1
+ba snoop cach 1
+ba snoopycach 1
+ba snoopycach protocol 1
+ba softwar 2
+ba softwar cach 1
+ba softwar multicast 1
+ba softwar schem 2
+ba soient 1
+ba soient le 1
+ba sol 2
+ba sol pour 1
+ba solut 1
+ba solut us 1
+ba sont 2
+ba sont de 1
+ba sont mi 1
+ba sourc 1
+ba span 1
+ba span tr 1
+ba spar 1
+ba spar matr 1
+ba spat 1
+ba spat adapt 1
+ba specif 2
+ba specif langu 1
+ba st 3
+ba st fact 1
+ba st structur 1
+ba st understand 1
+ba step 1
+ba strateg 2
+ba strok 1
+ba strok typ 1
+ba structur 8
+ba structur interact 1
+ba structur principl 1
+ba sur 1
+ba sur lesquel 1
+ba switch 2
+ba switch allow 1
+ba switch architectur 1
+ba symmeter 1
+ba symmeter multiproc 1
+ba synchron 1
+ba synchron primitiv 1
+ba syntac 1
+ba system 10
+ba system fail 1
+ba system incorpor 1
+ba system oper 1
+ba system wh 1
+ba taxonom 1
+ba taxonom rel 1
+ba techn 2
+ba techn contribut 1
+ba techn proper 1
+ba techniqu 6
+ba tenet 1
+ba term 1
+ba test 1
+ba test adequ 1
+ba test select 1
+ba textur 1
+ba textur reg 1
+ba th 1
+ba th an 1
+ba th confid 1
+ba th gener 1
+ba th oriqu 1
+ba theor 1
+ba theor assum 1
+ba to def 1
+ba to keep 1
+ba tool 3
+ba tr 2
+ba tr structur 1
+ba tr tp 1
+ba tran 1
+ba tran sign 1
+ba transform 1
+ba transform appl 1
+ba tw degr 2
+ba typ 3
+ba typ judg 1
+ba un 1
+ba un th 1
+ba unicast 1
+ba unicast me 1
+ba unit 1
+ba upd 1
+ba upon exper 1
+ba upon separ 1
+ba upon switch 1
+ba upon vect 1
+ba using 1
+ba using ol 1
+ba vect 1
+ba vect oper 1
+ba vehicl 1
+ba ver 1
+ba vid 1
+ba vid ind 1
+ba view 2
+ba visu 1
+ba visu qu 1
+ba vs 1
+ba wa appl 1
+ba wam 1
+ba wam model 1
+ba wavel 1
+ba wavel pack 1
+ba way 1
+ba wgp 1
+ba wgp order 1
+ba window 1
+ba with me 1
+ba word 1
+ba word graph 1
+ba work 1
+ba work environm 1
+ba wormhol 1
+ba wormhol rout 1
+ba zn 1
+ba.2 1
+ba.2 th artifact 1
+ba2 1
+ba2 7ay 1
+ba4 1
+ba4 de 1
+bab 2
+bab glu 1
+bab modl 1
+babak 1
+babak hassib 1
+babel 1
+babel algebr 1
+babel ar report 1
+babel as analog 1
+babel backtrack 1
+babel backtrack behaviour 1
+babel by mean 1
+babel comput 1
+babel comput st 1
+babel defin 1
+babel defin rl 1
+babel expr 1
+babel goal 1
+babel goal expr 1
+babel goal yield 1
+babel graph 1
+babel graph algebr 1
+babel implem 1
+babel langu 1
+babel oper 1
+babel oper sem 1
+babel program 1
+babel program con 1
+babel reflect 1
+babel rl 1
+babel search 1
+babel search spac 1
+babel stack 1
+babel stack algebr 1
+babel syntac 1
+babel th leftmost 1
+babel tr 1
+babel tr algebr 1
+babel tr nod 1
+babp 1
+babp qp 1
+babu 1
+bac88 1
+bac89 1
+bacd 1
+bach 1
+bachar 1
+bachrach 1
+back 11
+back direct 1
+back ge 1
+back journ 1
+back multipl 1
+back multipl tim 1
+back of bil 1
+back or for 1
+back pa 2
+back perform 1
+back perform und 1
+back ph 1
+back ph en 1
+back read 1
+back read start 1
+back read support 1
+back scan 1
+back trac 1
+back und 1
+back und scan 1
+back window 1
+back window siz 1
+backbon 6
+backbon atom 1
+backbon fl 1
+backbon illustr 1
+backbon network 1
+backbon show 1
+background 21
+background and ext 1
+background and graph 1
+background as requir 1
+background compl 1
+background gr 1
+background gr level 1
+background imag 1
+background in pt 1
+background inform 1
+background knowledg 1
+background load 1
+background mater 1
+background oper 1
+background proc 1
+background proc load 1
+background theor 1
+background unicast 1
+background unicast traff 1
+background whit 1
+background whit spac 1
+background workload 1
+backjump 1
+backlog 2
+backlog and cach 1
+backlog and therefor 1
+backlog and us 1
+backlog ar pa 1
+backlog at tim 1
+backlog ba 1
+backlog ba qu 1
+backlog br 1
+backlog br result 1
+backlog by using 1
+backlog connect 1
+backlog connect acquir 1
+backlog connect becom 1
+backlog connect belong 1
+backlog connect reach 1
+backlog connect receiv 1
+backlog contain 1
+backlog contain attribut 1
+backlog dat 1
+backlog dat model 1
+backlog from ptx 1
+backlog i tr 1
+backlog is approxim 1
+backlog is describ 1
+backlog is found 1
+backlog is gener 1
+backlog is giv 1
+backlog is order 1
+backlog is upd 1
+backlog it pot 1
+backlog model 1
+backlog of chang 1
+backlog of se 1
+backlog period 1
+backlog qk 1
+backlog schem 1
+backlog schem contain 1
+backlog se 1
+backlog se exclus 1
+backlog siz 1
+backlog using 1
+backlog wh 1
+backlog wh dat 1
+backlog with timestamp 1
+backplan 1
+backplan for heter 1
+backpropag 4
+backpropag appl 1
+backpropag network 2
+backpropag ph 1
+backpropag ph begin 1
+backpropag ph propag 1
+backpropag procedur 1
+backpropag th error 1
+backpropag th grad 1
+backpropag through tim 1
+backpropag wer form 1
+backquot 1
+backspac 1
+backspac j del 1
+backtrack 13
+backtrack and gu 1
+backtrack and structur 1
+backtrack asser 1
+backtrack asser retract 1
+backtrack ba 1
+backtrack behaviour 1
+backtrack chain 1
+backtrack cor 1
+backtrack direct 1
+backtrack du 1
+backtrack el 1
+backtrack el le 1
+backtrack el stop 1
+backtrack evalu 1
+backtrack evalu strateg 1
+backtrack father 1
+backtrack father bfather 1
+backtrack father currnod 1
+backtrack father funct 1
+backtrack father n2 1
+backtrack if nec 1
+backtrack in ca 1
+backtrack in compil 1
+backtrack in prolog 1
+backtrack inform 1
+backtrack is requir 1
+backtrack mechan 2
+backtrack on n1 1
+backtrack on plain 1
+backtrack or recalcl 1
+backtrack point 1
+backtrack point ba 1
+backtrack pointer 1
+backtrack program 1
+backtrack program pointer 1
+backtrack prolog 1
+backtrack purp 1
+backtrack retract 1
+backtrack search 1
+backtrack stack 1
+backtrack structur 1
+backtrack tak 2
+backtrack tak plac 2
+backtrack technolog 1
+backtrack to altern 1
+backtrack to currnod 1
+backtrack to work 1
+backtrack tr 2
+backtrack tr structur 1
+backtrack trail 1
+backtrack trail pointer 1
+backtrack upd 1
+backtrack upd prov 1
+backtrack var 1
+backtrack var assignm 1
+backtrack.1 1
+backup 2
+backup and wait 1
+backup approach 1
+backup befor sen 1
+backup bind 1
+backup bind environm 1
+backup cop 1
+backup is sent 1
+backup protocol 1
+backup protocol toler 1
+backup server 1
+backup server p2 1
+backup tak 1
+backup ver 1
+bacon 1
+bactrack 1
+bad 16
+bad cl 1
+bad cod 1
+bad consequ 1
+bad design 1
+bad design produc 1
+bad form 1
+bad hemingw 1
+bad i1 1
+bad id 1
+bad in term 1
+bad influ 1
+bad input 1
+bad interfer 1
+bad maint 1
+bad methodolog 1
+bad methodolog impl 1
+bad object 1
+bad object orient 1
+bad program 1
+bad program styl 1
+bad programmer 1
+bad train 1
+bad train net 1
+bad writ 1
+badg 1
+badg loc 1
+badg loc system 1
+badg slav 1
+badg slav loc 1
+badg system 1
+badouel 1
+badr 1
+baecker 1
+baecker and sherman 1
+baekgaard 1
+baekgaard and le 1
+baer 2
+baer et al 1
+baez 2
+baez yat 2
+baff 2
+baff ar ba 1
+bag 4
+bag and not 1
+bag ar repr 1
+bag model 1
+bag model system 1
+bag of upd 1
+bag search 1
+baiard 1
+bainbridg 1
+bajer 3
+bajer vej 3
+bajer vej 7e 2
+baker 4
+bal 40
+bal 2n 1
+bal 2w 1
+bal 2w mac 1
+bal acc 1
+bal achief 1
+bal algorithm 2
+bal algorithm abl 1
+bal algorithm distribut 1
+bal among proc 1
+bal amount 1
+bal and channel 1
+bal and cost 1
+bal and datab 1
+bal and j.s 1
+bal and larger 1
+bal and loc 1
+bal and offer 1
+bal and perform 1
+bal and provan 1
+bal and simil 1
+bal and stick 1
+bal and tak 1
+bal ar mechan 1
+bal between explor 1
+bal between refin 1
+bal between requir 1
+bal can var 1
+bal cf 1
+bal checkbook 1
+bal checkbook exampl 1
+bal checkbook qu 1
+bal cluster 1
+bal cluster siz 1
+bal cn 1
+bal coar 1
+bal condit 1
+bal configur 1
+bal configur offer 1
+bal consider 1
+bal correct 1
+bal dat 1
+bal denot 1
+bal denot bal 1
+bal dict 1
+bal dict ba 1
+bal direct 1
+bal direct direct 1
+bal du 1
+bal entr 1
+bal entr le 1
+bal es 1
+bal fash 1
+bal growth 1
+bal hi concur 1
+bal in eqn 1
+bal in favour 1
+bal in term 1
+bal is deriv 1
+bal is effect 1
+bal is improv 1
+bal is refer 1
+bal key 1
+bal key avg 1
+bal load 1
+bal load bal 1
+bal manner 1
+bal map 1
+bal me 1
+bal me proc 1
+bal method 1
+bal method tr 1
+bal model 1
+bal must us 1
+bal network 1
+bal network topolog 1
+bal no load 1
+bal nonblock 1
+bal nonblock network 1
+bal nr 1
+bal of eff 1
+bal output 1
+bal output rel 1
+bal partit 1
+bal prior 1
+bal prior queu 1
+bal proc 1
+bal reduc 1
+bal regl 1
+bal regl interconnect 1
+bal rout 1
+bal stat 1
+bal superior 1
+bal techn 1
+bal techn capabil 1
+bal techniqu 1
+bal th edg 1
+bal th load 1
+bal th sender 1
+bal th st 1
+bal th work 1
+bal to reach 1
+bal w mac 1
+bal weight 1
+bal wh 1
+bal which us 1
+bal with virtu 1
+bal workload 1
+bal. 1
+bal90 1
+balb 1
+balb et al 1
+balc 1
+balc azar 1
+balcer 1
+baldwin 1
+baldwin approach 1
+baldwin privileg 1
+baldwin privileg graph 1
+balint 1
+ballard 2
+ballard and c.m 1
+baln 1
+balr 1
+balsam 1
+baltimor 4
+baltzer 1
+baltzer ag 1
+baltzer ag publ 1
+bam 1
+bam ar extract 1
+bam cost 1
+bam proc 1
+bam remain 1
+bam to compil 1
+bam us 1
+bam with parm 1
+bam without stat 1
+ban 2
+ban atr 2
+ban atr ma 1
+ban atr pr 2
+banc 2
+banc dan 1
+banc dan lequel 1
+banc de 1
+banc de la 1
+banc memoir 1
+banc memoir ut 1
+banc rel 1
+banc rel es 1
+banchilon 1
+bancilhon 1
+band 4
+band filter 1
+band pa 1
+band structur 1
+band. 2
+bandwdith 1
+bandwdith by edg 1
+bandwidth 23
+bandwidth achief 1
+bandwidth alloc 1
+bandwidth alloc receiv 1
+bandwidth and channel 2
+bandwidth and connect 1
+bandwidth and cuml 1
+bandwidth and me 1
+bandwidth ar repr 1
+bandwidth avail 1
+bandwidth averag 2
+bandwidth averag travel 2
+bandwidth b1 2
+bandwidth be effect 1
+bandwidth beam 1
+bandwidth being offer 1
+bandwidth being util 1
+bandwidth bi 1
+bandwidth bo 1
+bandwidth by edg 1
+bandwidth by plot 1
+bandwidth comsum 1
+bandwidth const 1
+bandwidth const 1th 1
+bandwidth curv 2
+bandwidth curv obtain 2
+bandwidth decr 1
+bandwidth demand 2
+bandwidth du 1
+bandwidth earl 1
+bandwidth eff 1
+bandwidth en 1
+bandwidth en en 1
+bandwidth fal 2
+bandwidth for inter 1
+bandwidth for low 1
+bandwidth heap 1
+bandwidth in periph 2
+bandwidth incr 3
+bandwidth interconnect 1
+bandwidth interconnect network 1
+bandwidth is achief 1
+bandwidth is alloc 1
+bandwidth is equiv 1
+bandwidth is incr 1
+bandwidth is reduc 1
+bandwidth is suff 1
+bandwidth it receiv 1
+bandwidth lead 1
+bandwidth lim 1
+bandwidth lin 1
+bandwidth lo 1
+bandwidth lo du 1
+bandwidth mb 1
+bandwidth measur 1
+bandwidth network 4
+bandwidth network channel 1
+bandwidth network offer 1
+bandwidth of g4t 1
+bandwidth of gdeg 1
+bandwidth of link 1
+bandwidth of opt 1
+bandwidth offer 3
+bandwidth per proc 2
+bandwidth proper 1
+bandwidth rat 1
+bandwidth rat avg 1
+bandwidth receiv 1
+bandwidth reduc 1
+bandwidth reduc result 1
+bandwidth reserv 1
+bandwidth resourc 1
+bandwidth result 1
+bandwidth scal 1
+bandwidth sec 1
+bandwidth sec by 1
+bandwidth stream 1
+bandwidth stream dat 1
+bandwidth technolog 1
+bandwidth th receiv 1
+bandwidth usag 1
+bandwidth w.r.t 2
+bandwidth wa high 1
+bandwidth when degexc 1
+banerj 4
+banerj inequ 1
+bang 3
+bang fil 1
+bang model 1
+bang proc 1
+bang proc perform 1
+bangalor 1
+banikazem 1
+bank 9
+bank check 1
+bank check segm 1
+bank implem 1
+bank of latch 1
+bank structur 1
+bank to determin 1
+banqu 1
+banqu de 1
+banqu de don 1
+banyan 1
+banyan network 1
+banyan network controller 1
+bar 16
+bar again becom 1
+bar and spin 1
+bar ar kept 1
+bar arriv 1
+bar arriv inclus 1
+bar by watch 1
+bar caus 1
+bar command 1
+bar compl 1
+bar compl occur 1
+bar comput 1
+bar creat 1
+bar du 1
+bar elim 1
+bar encounter 1
+bar er 1
+bar er de 1
+bar er est 1
+bar ha mov 1
+bar hardwar 1
+bar implem 1
+bar in ge 1
+bar init 1
+bar init command 1
+bar is alloc 1
+bar is discard 1
+bar is reach 1
+bar is upd 1
+bar label 1
+bar label lrc 1
+bar lat 1
+bar method 1
+bar monit 1
+bar monit algorithm 1
+bar mov 1
+bar mov for 1
+bar no matter 1
+bar oper 2
+bar produc 1
+bar remain 1
+bar sem 1
+bar stil ec 1
+bar synchron 6
+bar synchron design 1
+bar synchron program 1
+bar synchron specif 1
+bar synchron variabl 1
+bar through intr 1
+bar tim 1
+bar tim pag 1
+bar to ensur 1
+bar to synchron 1
+bar to up 1
+bar. 1
+bar84 1
+bar93 1
+barb 1
+barbar 9
+barbar imag 1
+barbar liskov 2
+barbar mour 1
+barbar sant 1
+barbar sant barbar 1
+barbar staudt 1
+barbar staudt lerner 1
+barber 2
+barborak 1
+barcan 1
+barcan forml 1
+barcan forml combin 1
+barcelon 1
+bard 1
+barendregt 2
+barillot 1
+bark 1
+bark at anim 1
+bark at object 1
+bark explan 1
+bark inst 1
+bark is anim 1
+bark specif 1
+bark when threat 1
+barker 1
+barklund 1
+barklund et millroth 1
+barl 1
+barlaud 1
+barn 2
+barn and tim 1
+barn th comput 1
+barnard 1
+barnard and horst 1
+barnet 2
+barrel 1
+barrel inspect 1
+barrer 1
+barrer le 1
+barrer le bateau 1
+bart 2
+bart dem 1
+bart dem ton 1
+barth 2
+baru 1
+barycenter 2
+barycentr 1
+barycentr convec 1
+barycentr coordin 1
+barycentr dun 1
+barycentr dun probabilit 1
+barycentr et mart 1
+barzdin 1
+basak 3
+basak and dhabaleswar 3
+baseact 1
+baseact queu 1
+basel 7
+basel ind 1
+basel stuttgart 1
+basel system 1
+baselevel 1
+baselevel cl 1
+baselevel cl point 1
+baselevel program 1
+baserman 1
+basil 1
+basil blackwel 1
+baskin 2
+baskin center 2
+basser 1
+bassin 1
+bassok 1
+bast 1
+bast of artif 1
+bastan 1
+basu 2
+bat 2
+bat and jam 1
+bat and sean 1
+bat88 1
+bat92a 1
+bat92b 1
+bat92c 1
+bat93 1
+bataouch 1
+batch 11
+batch acc 1
+batch con 1
+batch con model 1
+batch dat 1
+batch dat pr 1
+batch inser 1
+batch integr 1
+batch learn 1
+batch mod 2
+batch of el 1
+batch of problem 1
+batch oper 1
+batch oper involut 1
+batch proc 3
+batch program 1
+batch program strextract 1
+batch transact 1
+batch ver 1
+bateau 1
+bateau par 1
+bateau par gr 1
+bath 1
+bath ba2 1
+bath ba2 7ay 1
+bathsheb 1
+bau92 1
+baudinet 3
+bay 4
+bay algorithm 1
+bay an 1
+bay belief 1
+bay belief univer 1
+bay cluster 1
+bay comput 1
+bay infer 1
+bay infer using 1
+bay method 1
+bay net 1
+bay net comput 1
+bay network 2
+bay object 1
+bay object recognit 1
+bay stat 1
+bay upd 2
+bay.wustl.edu 1
+bay.wustl.edu jayn.book 1
+bayer 2
+baykan 1
+baykan and fox 1
+bayshaw 1
+bb 8
+bb 1fram 1
+bb 1fram indextimestamp 1
+bb b boundaryw 1
+bb correspon 1
+bb correspon la 1
+bb s1 1
+bb w w1 1
+bb82 1
+bb92 1
+bbaruch 1
+bbaruch colleg 1
+bbaruch colleg cun 1
+bbbbmc 1
+bbbbmc reg 1
+bbbbmc reg nc 1
+bbmat 1
+bbmat and lhr71 1
+bbn 1
+bbn adv 1
+bbn adv computer 1
+bbn dot 1
+bbn dot ee 1
+bbncr 1
+bbncr t3d 1
+bbncr t3d dashflash 1
+bbp 1
+bbus 2
+bbus ibus 1
+bbus ibus ofsbus 1
+bbus interconnectnbnon 1
+bbus interconnectnbnon bus 1
+bc 4
+bc.in 1
+bcast 2
+bcast prim 1
+bcd 2
+bcg91 1
+bcl 1
+bcl93a 1
+bcl93b 1
+bcp 2
+bcp dc.ed.ac.uk 1
+bcp or tcp 1
+bcsstk31 1
+bcsstk32 1
+bd 3
+bdeg 1
+bdepartm 1
+bdepartm of appl 1
+bdg 1
+be 6
+be 2q 1
+be distribut 1
+be dk 1
+be in chem 1
+be on string 1
+be salzberg 1
+be strateg 1
+be wh 1
+be wh var 1
+be xe 1
+be. 2
+be87 1
+be91 1
+beacc 1
+beach 3
+beach va 1
+beach va heart.mor 1
+beal 1
+beam 2
+beam ar filter 1
+beam for object 1
+beam that produc 1
+bear 7
+bear an oid 1
+bear in mind 2
+bear link 1
+bear much resembl 1
+bear no inh 1
+bear th ident 1
+bear th object 1
+bear th respon 1
+beat 6
+beat a lower 1
+beat m2 1
+beat mechan 1
+beat on aver 1
+beat th surfac 2
+beat th worst 1
+beaucoup 5
+beaucoup aid 1
+beaucoup appr 1
+beaucoup appr ec 1
+beaucoup d auteur 1
+beaucoup dattrait 1
+beaucoup dattrait dan 1
+beaucoup de 3
+beaucoup de point 1
+beaucoup de quest 1
+beaucoup de succ 1
+beaucoup de syst 1
+beaucoup dencr 1
+beaucoup moin 1
+beaucoup moin de 1
+beaucoup moin dhypoth 1
+beaucoup plus co 1
+beaucoup plus compact 1
+beaucoup plus de 1
+beaucoup plus efficac 1
+beaucoup plus ir 1
+beaucoup plus petit 1
+beaucoup plus prob 1
+beaucoup plus quun 1
+beaucoup plus rap 1
+beaucoup plus rapid 1
+beaucoup plus soupl 1
+beaulieu 1
+beaut 1
+beaut model 1
+beaver 1
+bec92 1
+becam 8
+becam avail 1
+becam awar 1
+becam convinc 1
+becam greed 1
+becam oper 1
+becam softwar 1
+becam softwar system 1
+becam th bottleneck 1
+becam val 1
+bechtolsheim 1
+bechtolsheim and ed 1
+beck 2
+becker 2
+beckman 2
+becom 87
+becom 12a 1
+becom a bottleneck 3
+becom a burd 1
+becom a de 1
+becom a fact 1
+becom a fl 1
+becom a me 1
+becom a particip 1
+becom a perform 1
+becom a problem 1
+becom a se 1
+becom a sever 1
+becom a sourc 1
+becom a sub 1
+becom a tim 1
+becom a us 1
+becom a valu 1
+becom acc 1
+becom accept 1
+becom accustom 1
+becom act 1
+becom addit 1
+becom al 1
+becom an atom 1
+becom an entir 1
+becom an exper 1
+becom an unreason 1
+becom appar 1
+becom avail 5
+becom awar 2
+becom backlog 1
+becom bal 1
+becom bound 1
+becom bus 1
+becom by hand 1
+becom cheaper 1
+becom childr 1
+becom clear 8
+becom clearer 1
+becom cleverer 1
+becom closer 2
+becom commonplac 1
+becom conflict 1
+becom conflict goal 1
+becom constrain 1
+becom cur 1
+becom cur st 1
+becom dead 1
+becom denser 1
+becom determin 1
+becom differ piec 1
+becom disconnect 2
+becom domin 1
+becom e1 1
+becom edg 1
+becom either fin 1
+becom empt 2
+becom enem 1
+becom equ 1
+becom ever read 1
+becom evid 1
+becom fair 1
+becom fair den 1
+becom farther 1
+becom farther apart 1
+becom fe 2
+becom fl 1
+becom form 1
+becom fundam 1
+becom garb 1
+becom garb act 1
+becom greater 2
+becom greed 1
+becom high 1
+becom idl 1
+becom il typ 1
+becom import research 1
+becom inact 1
+becom incoh 1
+becom incr 6
+becom incr popl 2
+becom incr signif 1
+becom incr unaccept 1
+becom incr vi 1
+becom insensit 1
+becom inv 2
+becom involut 1
+becom issu 1
+becom jt 1
+becom larger 1
+becom link 1
+becom longer 1
+becom lower 1
+becom luv 1
+becom modif 1
+becom modif traver 1
+becom modificationtraver 1
+becom mor asynchron 1
+becom mor attract 1
+becom mor commun 1
+becom mor compl 2
+becom mor crit 1
+becom mor eff 1
+becom mor effect 1
+becom mor exp 1
+becom mor port 1
+becom mor power 1
+becom mor pronounc 1
+becom mor signif 1
+becom mor simil 1
+becom mor st 1
+becom mor unlik 1
+becom narrower 1
+becom near 1
+becom near imp 1
+becom neighbour 1
+becom nonaff 1
+becom o.jv 1
+becom obsol 1
+becom oc 1
+becom of incr 1
+becom of typ 1
+becom old 1
+becom oper 1
+becom optim 2
+becom over 1
+becom over complec 1
+becom overwhelm 2
+becom part 2
+becom popl 2
+becom popl model 1
+becom pract 1
+becom prim 1
+becom progr 1
+becom quit unaccept 1
+becom rather slow 1
+becom rel 1
+becom rel den 1
+becom repair 1
+becom rexp 1
+becom shar 1
+becom smaller 3
+becom smaller lead 2
+becom sourc 1
+becom sourc me 1
+becom spec 1
+becom spec ca 2
+becom ss0p 1
+becom standard 1
+becom standard de 1
+becom sub 1
+becom sub lin 1
+becom subst 1
+becom subst high 1
+becom targ 1
+becom th backup 1
+becom th build 1
+becom th cor 1
+becom th cur 1
+becom th de 1
+becom th fourth 1
+becom th output 1
+becom th prim 1
+becom th root 2
+becom th se 1
+becom th st 2
+becom th standard 1
+becom th valu 1
+becom to fl 1
+becom to sever 1
+becom tot 1
+becom tot us 1
+becom unavail 1
+becom uncooper 1
+becom uniqu 1
+becom uniqu satisf 1
+becom unlik 1
+becom unlock 1
+becom unmaintain 1
+becom unst 1
+becom unsynchron 1
+becom unus 1
+becom upd 1
+becom upd expr 1
+becom upd primitiv 1
+becom vacu 1
+becom ver attract 1
+becom vi 2
+becom vi everywh 1
+becom worthwhil 1
+becom zer 2
+becu 1
+bed 3
+bed liu 1
+bed mc 1
+bed mc formulad 1
+bedroc 1
+bedroc high level 1
+bedroc synth 1
+bedroc synth system 1
+bedroc system 1
+beecroft 1
+beed 1
+beed obtain 1
+beeen 1
+beeen found 1
+beer 2
+beer and p.a 1
+befor 1
+befor afterd 1
+befor is defin 1
+beforehand 3
+beforeq4 1
+beforeq4 afterq4 1
+beforeq4 in figur 1
+beg 2
+beg th quest 1
+began 4
+began execut 1
+began to bark 1
+began to becom 1
+began using 1
+beggar 1
+beggar from madrid 1
+begin 61
+begin a condit 1
+begin a program 1
+begin a selfmodif 1
+begin and en 4
+begin and sl 1
+begin at a1b1 1
+begin at a1bn 1
+begin at birth 1
+begin boolean 1
+begin boolean chang 1
+begin broadcast 1
+begin build 1
+begin by appl 1
+begin by ask 1
+begin by build 1
+begin by describ 1
+begin by establ 1
+begin by exerc 1
+begin by inser 1
+begin by norm 1
+begin by prov 1
+begin by random 1
+begin by scan 1
+begin by select 1
+begin by var 1
+begin ch 1
+begin correspon 1
+begin dat 1
+begin dat point 1
+begin distribut 1
+begin distribut particl 1
+begin en 1
+begin en delimiter 1
+begin execut 1
+begin fnam 1
+begin fnam assign 1
+begin fnam fo 1
+begin form 1
+begin glyph 1
+begin if direct 1
+begin in random 1
+begin in sect 1
+begin is obtain 1
+begin it back 1
+begin le 1
+begin le sj 1
+begin look 2
+begin may contain 1
+begin occur 1
+begin occur faster 1
+begin of execut 1
+begin of s1 1
+begin of se 1
+begin of sect 2
+begin our an 1
+begin our observ 1
+begin proc 2
+begin proc subsequ 1
+begin propag 1
+begin r3 1
+begin read 3
+begin read chunk 1
+begin read mi 1
+begin read sj 1
+begin read xi 1
+begin rec 1
+begin schedl 1
+begin self 1
+begin self method 1
+begin sen 1
+begin sen xj 1
+begin sequ 1
+begin show 1
+begin temp 1
+begin temp pg 1
+begin th pr 1
+begin th sect 1
+begin th synth 1
+begin th transfer 1
+begin to decr 1
+begin to deterior 1
+begin to dom 1
+begin to filter 1
+begin to mak 1
+begin to show 1
+begin transfer 1
+begin traver 1
+begin with cl 1
+begin with equ 1
+begin with lower 1
+begin with upper 1
+begin work 1
+begin1 1
+beginner 1
+beginner guid 1
+begun 3
+begun to publ 1
+behalf 2
+behav 19
+behav act 1
+behav appropr 1
+behav as follow 1
+behav correct 2
+behav exact 1
+behav form 1
+behav in ca 1
+behav lik async 1
+behav lik transform 1
+behav mal 1
+behav simil 1
+behavior 47
+behavior a singl 1
+behavior account 1
+behavior and brain 1
+behavior and error 1
+behavior and human 1
+behavior and inform 1
+behavior and responsibil 1
+behavior and synth 1
+behavior ar explain 1
+behavior as gp 1
+behavior ba 1
+behavior being unmodif 1
+behavior by describ 1
+behavior chang 1
+behavior con 1
+behavior const.11 1
+behavior defin 1
+behavior definit 1
+behavior describ 1
+behavior descript 1
+behavior dur for 1
+behavior dur system 1
+behavior enabl 1
+behavior enabl developm 1
+behavior ent 1
+behavior ent relationship 1
+behavior entityrelationship 1
+behavior er 1
+behavior er model 1
+behavior for inst 1
+behavior for low 1
+behavior for matr 1
+behavior for ver 1
+behavior found 1
+behavior from automobil 1
+behavior from cl 1
+behavior hardwar 1
+behavior hardwar descript 1
+behavior impact 1
+behavior inv 1
+behavior involut 1
+behavior is account 1
+behavior is chaot 1
+behavior is comput 1
+behavior is found 1
+behavior is ident 1
+behavior is inv 1
+behavior is nondetermin 1
+behavior is predict 1
+behavior is proper 1
+behavior is simil 1
+behavior is vi 1
+behavior lik doduc 1
+behavior mak 1
+behavior model 1
+behavior objectiv 1
+behavior of compon 1
+behavior of dev 1
+behavior of gp 1
+behavior of inst 1
+behavior of log 1
+behavior of neur 1
+behavior of nsar 1
+behavior of object 1
+behavior of pgp 1
+behavior of pollut 1
+behavior of schedl 1
+behavior of team 1
+behavior of traver 1
+behavior propag 1
+behavior relationship 1
+behavior remain 1
+behavior remain con 1
+behavior sc 1
+behavior through arithm 1
+behavior to inclus 1
+behavior under execut 1
+behavior using 1
+behavior vhdl 1
+behavior vhdl descript 1
+behavior vhdl specif 1
+behavior when run 1
+behaviour 15
+behaviour abstract 1
+behaviour and attribut 1
+behaviour and inform 1
+behaviour and report 1
+behaviour and structur 1
+behaviour as part 1
+behaviour as symtab 1
+behaviour control 1
+behaviour dep 1
+behaviour describ 1
+behaviour du 1
+behaviour in proc 1
+behaviour in program 1
+behaviour is guaranteed 1
+behaviour is partit 1
+behaviour is unspecif 1
+behaviour level 1
+behaviour might ar 1
+behaviour observ 1
+behaviour of alloc 1
+behaviour of correspon 1
+behaviour of eulisp 1
+behaviour of gener 1
+behaviour of oper 1
+behaviour of slot 1
+behaviour of softwar 1
+behaviour on direct 1
+behaviour on inst 1
+behaviour protocol 1
+behaviour that softwar 1
+behaviour view 1
+behaviour wa achief 1
+behold 1
+beholder 1
+beichter 1
+beierl 1
+beigel 1
+beimplem 1
+beimplem mechan 1
+being 1
+beirut 1
+beizer 1
+beizer pr 1
+beizer pr simil 1
+bekker 1
+bekker a bien 1
+bekker and coh 1
+bekker et al 1
+bekker examinateur 1
+bekker examinateur jean 1
+bel 14
+bel and lapadl 1
+bel and whistl 1
+bel lab 1
+bel labor 3
+bel labor mur 1
+bel labor techn 1
+bel system 5
+bel system techn 5
+bel telephon 1
+bel telephon system 1
+belad 1
+beldiceanu 2
+beldiceanu ont 1
+beldiceanu ont aus 1
+belg 1
+belief 34
+belief consider 1
+belief funct 2
+belief funct propag 1
+belief in network 1
+belief network 2
+belief ordin 1
+belief ordin listener 1
+belief our emph 1
+belief pot 1
+belief pot expr 1
+belief th assum 1
+belief th latter 1
+belief th tradit 1
+belief that dog 1
+belief that extrem 1
+belief that fic 1
+belief that phy 1
+belief that proc 2
+belief univer 1
+belief wil ar 1
+belief wil continu 2
+bellcor 2
+bellcor gradu 1
+bellcor gradu fellowship 1
+bellman 1
+bellman ford 1
+bellman ford rout 1
+bellot 1
+bellot92 1
+belong 43
+belong in inact 1
+belong to aj 1
+belong to buck 1
+belong to ca 1
+belong to cl 1
+belong to cover 1
+belong to ei 1
+belong to exact 3
+belong to g0 1
+belong to g1 1
+belong to list 1
+belong to multidim 1
+belong to object 1
+belong to qfp 1
+belong to r1 1
+belong to realm 1
+belong to se 1
+belong to sect 1
+belong to serv 1
+belong to simil 1
+belong to ublog 1
+belong wa determin 1
+belur 1
+ben 8
+ben kik 1
+ben network 1
+ben network ba 1
+ben switch 1
+ben th lin 1
+ben ts 1
+ben. 1
+ben75 1
+benahc 1
+benahc en 1
+benchmark 18
+benchmark and test 1
+benchmark appl 2
+benchmark appl perform 1
+benchmark ar compil 1
+benchmark ar defin 1
+benchmark ar separ 1
+benchmark author 1
+benchmark author com 1
+benchmark ba 1
+benchmark ba evalu 1
+benchmark compr 1
+benchmark con 2
+benchmark figur 1
+benchmark figur tabl 1
+benchmark for evalu 1
+benchmark for tim 1
+benchmark forml 1
+benchmark handbook 1
+benchmark inst 1
+benchmark involut 1
+benchmark involut bil 1
+benchmark is defin 1
+benchmark is run 1
+benchmark kcm 1
+benchmark kcm sep 1
+benchmark of multicast 1
+benchmark omn 1
+benchmark omnisc 1
+benchmark omnisc myop 1
+benchmark omnisc oracl 1
+benchmark omnisc specl 1
+benchmark omnisc tr 1
+benchmark on sisctus 1
+benchmark problem 2
+benchmark program 5
+benchmark program put 1
+benchmark result 1
+benchmark se 1
+benchmark show 1
+benchmark suit 3
+benchmark test 1
+benchmark test suit 1
+benchmark th ipsc 1
+benchmark to examin 1
+benchmark to ge 1
+benchmark tpc 1
+benchmark user 1
+benchmark user tim 1
+benchmark valu 1
+benchmark wer run 1
+benchmark wh 1
+benedus 1
+benef 11
+benef effect 3
+benef in improv 1
+benef in situ 1
+benef to allow 1
+benef to reclaim 1
+benefit 33
+benefit an 1
+benefit and drawback 1
+benefit and lim 1
+benefit ar achief 1
+benefit ar lim 1
+benefit assoc 1
+benefit from multimod 1
+benefit from numer 1
+benefit from pack 1
+benefit from requir 1
+benefit from using 1
+benefit gain 1
+benefit great 1
+benefit h ye 1
+benefit in design 1
+benefit in pract 1
+benefit in using 1
+benefit not ment 1
+benefit of ded 1
+benefit of direct 1
+benefit of gain 1
+benefit of gp 1
+benefit of heaviest 1
+benefit of hem 1
+benefit of improv 1
+benefit of isvl 1
+benefit of multipl 1
+benefit of object 1
+benefit of parallel 1
+benefit of proc 1
+benefit of specl 1
+benefit of stat 1
+benefit of using 2
+benefit parallel 1
+benefit parallel system 1
+benford 1
+benhamou 1
+benign 1
+benign environm 1
+benjamin 11
+benjamin cum 9
+benjamin cum publ 6
+benjamin goldberg 1
+benjamin pierc 1
+benker 1
+bennacer 1
+benner 1
+benner le 1
+bennet 3
+bennet et al 1
+benson 2
+bentl 2
+benutzerhandb 1
+benutzerhandb uch 1
+beppu 1
+ber 4
+ber de 1
+ber de vr 1
+ber90 1
+ber91 1
+ber92 1
+beraldin 1
+bergadan 1
+bergadan giordan 1
+bergadan giordan integr 1
+bergadan giordan learn 1
+bergadan giordan method 1
+berger 2
+bergerhoff 1
+bergstein 2
+bergstein and karl 1
+bericht 4
+bericht immd7 1
+berkel 12
+berkel symp 1
+berkl 1
+berkl research 1
+berkl research report 1
+berland 1
+berlin 11
+berlin heidelberg 2
+berlin jeffr92 1
+berman 1
+berman and hartman 1
+bernard 7
+bernard levrat 1
+bernard lyon 1
+bernard odonnel 1
+bernard tourancheau 1
+bernard.levrat 1
+bernard.levrat cu.unig.ch 1
+berner 2
+berner le 2
+bernhard 4
+bernhard geig 1
+bernhard geiger 1
+bernhard pfahringer 2
+bernhard seeger 1
+bernoul 1
+bernoul experim 1
+bernoul tr 1
+bernstein 7
+bernstein and goodman 1
+berrendorf 1
+bersack 1
+bershad 1
+berth 2
+bertin 1
+bertram 1
+bertrand 6
+bertrand cu.unig.ch 1
+bertrand cu.unig.ch www 1
+bertrand ibrahim 2
+bertrand meyer 1
+bertrand neveu 1
+bertrand.html 2
+bertrand.ibrahim 1
+bertrand.ibrahim cu.unig.ch 1
+bertrand.ibrahim cu.unig.ch url 1
+bertsek 1
+bertsek and john 1
+berwick 1
+besc 1
+besl 1
+besoin 5
+besoin d etr 1
+besoin dacc 1
+besoin dacc eder 1
+besoin dan 1
+besoin de 4
+besoin de born 1
+besoin de desc 1
+besoin de prendr 1
+besoin de recevoir 1
+besoin de survivr 1
+besoin de transp 1
+besoin dinclur 1
+besoin du 2
+besoin du retour 1
+besoin et donc 1
+besoin g en 1
+besoin ic 1
+besoin ic qu 1
+besoin variabl 1
+bessel 1
+bessel polynom 1
+bessel polynom fb 1
+best 1
+best phon 1
+best sun1 1
+best sun1 hwsw.ged.de 1
+bestknownact 1
+beteen 1
+beteen th term 1
+beth 1
+better.6 1
+betw 1
+between 1
+between ar introduc 1
+bevemyr 1
+bevemyr et lindgr 1
+bexit 1
+bexit main 1
+beyer 1
+beyer and rusk 1
+beyl 1
+beynon 1
+beynon and s.b 1
+beynon stev 1
+beynon stev rus 1
+beyong 1
+beyong th scop 1
+bezdek 1
+bezdek and s.k 1
+beziehung 1
+beziehung zwisch 1
+beziehung zwisch kunst 1
+bf 3
+bf subtr 1
+bf subtr ti 1
+bf tr 1
+bf tr level 1
+bf0432 1
+bf0432 mean 1
+bf1355 1
+bf2670 1
+bf90 1
+bf91 1
+bf92 1
+bfather 1
+bfather chain 1
+bfather env 1
+bfather funct 1
+bfather mod 1
+bfather path 1
+bfather rel 1
+bfather root 1
+bfather to bfather 1
+bfather4 1
+bfg 2
+bfg b f21 1
+bfg forml 1
+bfg method 1
+bfg upd 1
+bfp 1
+bfram 1
+bfram ind 1
+bg 10
+bg of discr 1
+bg of mg 1
+bg p fhb0 1
+bg s1 1
+bg s1 s7 1
+bg81 1
+bg93 1
+bgl85 1
+bgt91 1
+bh 1
+bhagavath 1
+bhagwat 1
+bhaskar 1
+bhattach 1
+bhattacharj 1
+bhht94 1
+bhm90 1
+bi 33
+bi 1si 1
+bi 1si yi 1
+bi about reg 1
+bi accord 1
+bi aic0 1
+bi and perform 1
+bi and substitut 1
+bi ar comput 1
+bi ar describ 1
+bi bj 1
+bi can creep 1
+bi ci 1
+bi ci di 1
+bi creat 1
+bi denot 1
+bi direct 1
+bi direct lin 1
+bi direct link 1
+bi du 1
+bi du calcl 1
+bi dun 1
+bi ee 2
+bi ee ain 1
+bi ee du 1
+bi eff 1
+bi eff consider 1
+bi ei 1
+bi ei wi 1
+bi empir 1
+bi empir gener 1
+bi es 1
+bi es avec 1
+bi est 1
+bi for induc 1
+bi gener 1
+bi i p0 1
+bi i p00 1
+bi immun 1
+bi in addr 1
+bi in dat 1
+bi ind 1
+bi indep 1
+bi int account 1
+bi nod 1
+bi nod behav 1
+bi occur 1
+bi oe 1
+bi of nod 1
+bi pmj 1
+bi qj 1
+bi sont 1
+bi sont de 1
+bi start 1
+bi that build 1
+bi that ser 1
+bi tig 1
+bi to attribut 1
+bi to def 1
+bi to low 1
+bi to run 1
+bi to solut 1
+bi to unb 1
+bi valu 1
+bi vot 1
+bi vot result 1
+bi vot schem 1
+bi when st 1
+bi wil satisf 1
+bi wil stick 1
+bi xi 1
+bi xi ou 1
+bi.html 1
+bi0 1
+bi0 nt 1
+bi0 nt kbt 1
+biacin 1
+biacin and gerl 1
+bib 1
+bibliograph 10
+bibliograph on ai 1
+bibliograph on quadtr 1
+bibliograph on tempor 3
+bibliograph pr 1
+bibliograph relativ 1
+bibliograph relativ compl 1
+bibliographiqu 1
+biblioth 2
+biblioth equ 1
+biblioth equ de 1
+biblioth qu 1
+biblioth qu mapl 1
+biconnect 2
+biconnect a giv 1
+biconnect approxim 1
+biconnect augm 1
+biconnect augm problem 1
+biconnect compon 1
+biconnect subgraph 1
+biconnect subgraph problem 1
+biconnect th leav 1
+biconnect th sit 1
+bicycl 1
+bid 1
+bid min 1
+bid min network 1
+bidiagon 1
+bidiagon el 1
+bidimin 1
+bidimin by assum 1
+bidirect 6
+bidirect channel 1
+bidirect commun 1
+bidirect link 4
+bidirect min 1
+bidirect min network 1
+bidirect min topolog 1
+bidirect pin 1
+bidirect switch 1
+bidirect traff 1
+bidirect transm 1
+bidirect transm channel 1
+bidirect unit 1
+bien 4
+bien a ce 1
+bien a la 1
+bien a lunif 1
+bien a un 1
+bien adapt 1
+bien adapt es 1
+bien appr 1
+bien appr ehender 1
+bien atteint 1
+bien attribu 1
+bien attribu ee 1
+bien au 2
+bien au court 1
+bien au del 1
+bien au form 1
+bien au net 1
+bien aux 1
+bien aux point 1
+bien avoir 1
+bien avoir voulu 1
+bien bal 1
+bien bal es 1
+bien complec 1
+bien complec pour 1
+bien comprendr 1
+bien comprendr le 1
+bien connu 2
+bien connu avec 1
+bien connu de 1
+bien connu en 1
+bien conserv 1
+bien cop 1
+bien cop es 1
+bien correspondr 1
+bien d efin 1
+bien dautr 2
+bien dautr manuel 1
+bien dautr tel 1
+bien de 3
+bien de ambigu 1
+bien de aspect 1
+bien de ca 1
+bien de cr 1
+bien disjonct 1
+bien disjonct qu 1
+bien dun 1
+bien dun term 1
+bien en 1
+bien en th 1
+bien entendu 1
+bien evidem 1
+bien inf 1
+bien inf rieur 1
+bien interpr 1
+bien interpr eter 1
+bien la 2
+bien la recherch 1
+bien la rigueur 1
+bien le 1
+bien m em 1
+bien mettr 1
+bien mettr le 1
+bien moin 1
+bien moin import 1
+bien moindr 1
+bien moindr quon 1
+bien par 1
+bien par le 1
+bien plaus 1
+bien plus complec 1
+bien plus proch 1
+bien plus quimprimer 1
+bien pour 1
+bien pour le 1
+bien qu 4
+bien qu ce 3
+bien qu convec 1
+bien qu correct 1
+bien qu de 1
+bien qu eventuel 1
+bien qu la 2
+bien qu le 3
+bien qu lenviron 1
+bien qu li 1
+bien qu lop 1
+bien qu si 1
+bien qu simpl 1
+bien qu tous 1
+bien qu tr 1
+bien quil 1
+bien quil doiv 1
+bien quun 1
+bien quun bon 1
+bien quun eff 1
+bien quutil 1
+bien quutil dan 1
+bien r epart 1
+bien s eparer 1
+bien s ur 1
+bien su 1
+bien su barrer 1
+bien sur 1
+bien sur de 1
+bien sur si 1
+bien tous 1
+bien tous se 1
+bien un point 1
+bien un saut 1
+bien voulu 2
+bien voulu apporter 1
+bien voulu diriger 1
+bierwisch 1
+bifoc 1
+bifoc displ 1
+big 10
+big a pool 1
+big and half 1
+big bang 1
+big bang model 1
+big bang proc 1
+big differ 1
+big help 1
+big issu 1
+big o sen 1
+big oh 1
+big oh term 1
+big perform 1
+big perform differ 1
+big problem 1
+big switch 1
+big switch stat 1
+big then ye 1
+big win 1
+bigger 9
+bigger and smaller 1
+bigger cach 1
+bigger glob 1
+bigger glob effect 1
+bigger number 1
+bigger object 1
+bigger object cod 1
+bigger pur 1
+bigger unit 1
+biggerstaff 1
+biggest 3
+biggest act 1
+biggest c program 1
+biggest object 1
+biggest strength 1
+bij 2
+biject 2
+biject de 1
+biject de z2 1
+biject de zn 1
+biject gal 1
+biject gal connect 1
+biject sous 1
+biject sous la 1
+biject sur 1
+biject sur son 1
+bijuj 1
+bik 2
+bik lj 1
+bil 8
+bil fail 1
+bil hoad 1
+bil is work 1
+bil kalsow 1
+bil ledbetter 1
+bil load 1
+bil of oper 1
+bil oriordan 1
+bil put 1
+bil s bug 1
+bil s environm 1
+bil s interfac 1
+bil s sourc 1
+bil s work 1
+bil step 1
+bil to retrief 1
+bil tr 1
+bil typ 1
+bilan 1
+bilir 1
+bilk 1
+billault 1
+billion 1
+billion instruc 1
+billion oper 1
+billionnet 1
+billionnet and sutter 1
+billman 1
+bim 3
+bim prob 1
+bim prob experim 1
+bim prolog 1
+bim prolog say 1
+bimod 1
+bimod lat 1
+bimod traff 1
+bin 43
+bin alphab 1
+bin analog 1
+bin and bin 1
+bin and equ 1
+bin ar gener 1
+bin as op 1
+bin assoc 1
+bin assoc oper 1
+bin claus 1
+bin claus count 1
+bin compl 1
+bin compl pair 1
+bin dat 1
+bin dat manipl 1
+bin dec 2
+bin dec diagram 1
+bin definit 1
+bin definit program 1
+bin digit 1
+bin div 1
+bin div result 1
+bin each tim 1
+bin encod 2
+bin encod cm 1
+bin encod ga 1
+bin fact 1
+bin figur 1
+bin fil 1
+bin form 1
+bin funct 2
+bin gener 1
+bin gener rel 1
+bin grammar 1
+bin grammar fil 1
+bin heap1 1
+bin heap1 implem 1
+bin hom 1
+bin hom gw 1
+bin imag 4
+bin inf 1
+bin inf oper 1
+bin logarithm 1
+bin ma 1
+bin ma appliqu 1
+bin metaprogram 1
+bin meter 1
+bin neuron 1
+bin not sourc 1
+bin number 1
+bin object 1
+bin object fil 1
+bin of sharp 1
+bin oper 1
+bin or tern 1
+bin output 1
+bin parameter 1
+bin parameter encod 1
+bin pattern 1
+bin pr 2
+bin pr symbol 1
+bin program 1
+bin prolog 1
+bin prolog eng 1
+bin reflect 1
+bin reflect gr 1
+bin rel 3
+bin repr 2
+bin resolut 1
+bin script 2
+bin search 4
+bin search look 1
+bin search tr 1
+bin sequ 1
+bin smear 1
+bin smear proc 1
+bin spac 1
+bin spac partit 1
+bin split 1
+bin split techniqu 1
+bin string 3
+bin system 1
+bin th imag 1
+bin tr 7
+bin tr correspon 1
+bin tr topolog 1
+bin valu 1
+bin valu denot 1
+bin variabl 1
+bin vect 2
+bin ver 1
+bin wh interfac 1
+binagh 1
+binagh et al 1
+binair 3
+binair b b1b2 1
+binair conform 1
+binair conform ement 1
+binair correspon 1
+binair correspon au 1
+binair de 1
+binair de comp 1
+binair de etat 1
+binair de lagc 1
+binair de longueur 1
+binair dun 1
+binair dun ag 1
+binair est 1
+binair est probl 1
+binair f0 1
+binair pr 1
+binair pr ef 1
+binair s est 1
+bind 18
+bind a block 1
+bind a hem 1
+bind a plac 1
+bind acc 1
+bind and dynam 1
+bind and sequ 1
+bind ar 1
+bind ar ad 1
+bind ar bound 1
+bind ar creat 1
+bind ar giv 1
+bind ar immut 1
+bind ar lin 1
+bind ar mad 1
+bind ar proc 1
+bind ar refer 1
+bind avail 1
+bind bind 1
+bind by requir 1
+bind c bind 1
+bind caus 1
+bind conflict 1
+bind contain 1
+bind creat 1
+bind d bind 1
+bind defin 1
+bind differ sign 1
+bind domain 1
+bind environm 2
+bind ext 1
+bind from modl 1
+bind fx 1
+bind fx trueg 1
+bind ha lec 1
+bind hav lec 1
+bind in object 1
+bind init 1
+bind insid method 1
+bind inst 1
+bind instruc 1
+bind intoduc 1
+bind intoduc program 1
+bind introduc 1
+bind is creat 1
+bind is immut 1
+bind is repr 2
+bind is specif 1
+bind method 1
+bind motif 1
+bind nam 1
+bind no object 1
+bind of funct 1
+bind of identif 1
+bind of macr 1
+bind of me 1
+bind of nam 1
+bind of object 1
+bind of oper 1
+bind of procedur 1
+bind of symbol 1
+bind of syntac 1
+bind of variabl 1
+bind problem 1
+bind problem ment 1
+bind produc 1
+bind receiv 1
+bind schem 1
+bind schem describ 1
+bind som log 1
+bind stronger 1
+bind techniqu 1
+bind th edg 1
+bind th ent 1
+bind th hem 1
+bind th slot 1
+bind th visu 1
+bind tim 1
+bind var 1
+bind var featur 1
+bind var sign 1
+bind variabl 1
+bind wh nam 1
+bind when multipl 1
+bind which constitut 1
+bind with bound 1
+bind with respect 1
+binder 1
+bing 1
+bing yu 1
+bingham 1
+binkl 1
+binom 3
+binom distribut 2
+binom tr 1
+binot 1
+binprolog 1
+binprolog continu 1
+binprolog continu toutef 1
+binwam 1
+bioch 1
+bioch a toshih 1
+bioch cs.few.eur.nl 1
+bioch cs.few.eur.nl bdepartm 1
+bioch toshih 1
+bioch toshih ibarak 1
+biochem 1
+biol 1
+biolog 13
+biolog and chem 1
+biolog and computer 1
+biolog build 1
+biolog cybernet 2
+biolog field 1
+biolog interest 1
+biolog macromolecl 1
+biolog macromolecl compr 1
+biolog mol 2
+biolog mol culair 1
+biolog mol eculair 1
+biolog ogur 1
+biolog plaus 1
+biolog proc 1
+biolog proc vs 1
+biolog suggest 1
+biolog system 2
+biolog system etc 1
+biolog tissu 1
+biolog to bird 1
+biologisch 1
+biologisch evolut 1
+biom 1
+biom engineer 1
+biomacromolecl 1
+biomacromolecl vi optim 1
+biometer 1
+biometrik 1
+biomolecl 1
+biomolecl structur 1
+biostereometer 1
+bipart 3
+bipart graph 1
+bipart graph tak 1
+bipart in gener 1
+bipart of gf 1
+bipart planar 1
+bipart planar graph 1
+bipartit 1
+bir 1
+bir93 1
+bird 1
+bird song 1
+bird song classif 1
+birkh 2
+birkh auser 1
+birkh user 1
+birkhauser 1
+birlinghov 1
+birman 4
+birman and thom 1
+birman et al 1
+birnbaum 1
+birnbaum collin 1
+birrel 1
+birth 3
+birth and tim 1
+birth begin 1
+birth of hol 1
+bisect 10
+bisect a graph 1
+bisect a reg 1
+bisect algorithm 1
+bisect algorithm implem 1
+bisect algorithm pr 1
+bisect algorithm produc 1
+bisect and multilevel 1
+bisect and order 1
+bisect ba 1
+bisect band. 2
+bisect bandwidth 4
+bisect bandwidth b1 2
+bisect bandwidth curv 2
+bisect bandwidth demand 2
+bisect bandwidth fal 2
+bisect bandwidth incr 2
+bisect bandwidth offer 2
+bisect bandwidth resourc 1
+bisect by find 1
+bisect constrain 1
+bisect constraint 1
+bisect curv 2
+bisect for partit 1
+bisect giv 1
+bisect heur 1
+bisect in term 1
+bisect lin 1
+bisect method 2
+bisect method ba 1
+bisect multilevel 1
+bisect perform 2
+bisect perform becom 1
+bisect ph 1
+bisect requir 2
+bisect resourc 1
+bisect siz 1
+bisect th reg 1
+bisect vs 1
+bisect vs multilevel 1
+bisect yield 1
+bissel 1
+bit 36
+bit 2i 1
+bit account 1
+bit addit 1
+bit additionnel 1
+bit addr 1
+bit and periph 2
+bit ar avail 1
+bit ar exchang 1
+bit ar ind 1
+bit ar serv 1
+bit ar tak 1
+bit ar therefor 1
+bit as parameter 1
+bit asc 1
+bit bin 3
+bit bin string 2
+bit bin vect 1
+bit car 1
+bit channel 3
+bit channel cycl 2
+bit count 1
+bit counter 1
+bit counter st 1
+bit cycl 2
+bit cycl 100mb 2
+bit d etiqu 1
+bit dat 3
+bit dat part 2
+bit dat word 1
+bit de 1
+bit de contr 1
+bit denot 1
+bit denot proc 1
+bit doubl 1
+bit doubl prec 1
+bit en 1
+bit en hexad 1
+bit exchang 1
+bit exchang fract 1
+bit extern 1
+bit for al 1
+bit for pag 1
+bit gr 1
+bit gr cod 1
+bit i vaudrait 1
+bit in dat 1
+bit in phy 1
+bit ind 2
+bit integer 2
+bit integer var 1
+bit integer ver 1
+bit intern 1
+bit is 1
+bit is se 1
+bit j vaut 1
+bit link 2
+bit mach 1
+bit map 1
+bit may transm 1
+bit merg 1
+bit merg algorithm 1
+bit microproc 1
+bit microproc adv 1
+bit microprogram 1
+bit microprogram produc 1
+bit mor effort 1
+bit of connect 1
+bit of kcm 1
+bit of pack 1
+bit of payoff 1
+bit of pract 1
+bit of re 1
+bit of timestamp 1
+bit oper 1
+bit or parameter 1
+bit overflow 1
+bit pc 1
+bit per parameter 1
+bit per pixel 1
+bit per proc 1
+bit per register 1
+bit permut 1
+bit permut compl 1
+bit phy 1
+bit phy pag 1
+bit po 1
+bit posit 2
+bit posit ind 1
+bit pour 1
+bit pour fair 1
+bit proc 1
+bit rat 2
+bit rat imag 1
+bit rat traff 1
+bit register 2
+bit register fil 1
+bit regl 1
+bit regl bin 1
+bit sequ 1
+bit serv 1
+bit show 1
+bit sign 1
+bit sign off 1
+bit simultan 2
+bit string 1
+bit string encod 1
+bit string header 1
+bit swmr 1
+bit swmr register 1
+bit t sw 1
+bit tag 1
+bit tag architectur 1
+bit tag mach 1
+bit th silver 1
+bit that repr 1
+bit to repr 1
+bit to st 1
+bit un 1
+bit un etiqu 1
+bit valu 1
+bit vect 4
+bit vect oper 1
+bit wa requir 1
+bit wh 1
+bit wi 1
+bit wi optim 1
+bit wid 2
+bit wid lead 1
+bit wid port 1
+bit wil conver 1
+bit word 1
+bit word format 1
+bitmap 1
+bitner 1
+bitpermut 1
+bitpermut compl 1
+bitpermut compl bit 1
+bitstr 3
+bitstr and finit 1
+bitstr encod 1
+bitter 1
+bitter en 1
+bitz 1
+bivalu 1
+bivalu measur 1
+bj 14
+bj ajj 1
+bj cj 1
+bj cj dj 1
+bj ei 1
+bj gener 1
+bj mj 1
+bj nm 1
+bj nx 1
+bj orn 1
+bj orn lisper 1
+bj orner 1
+bj pgcd 1
+bj5 1
+bjap 1
+bjarn 2
+bjarn stroustrup 2
+bjp91 1
+bjt 1
+bjt min 1
+bjt min oe2s 1
+bjz 1
+bk 6
+bk as atom 1
+bk for integer 1
+bk kx 1
+bk on peut 1
+bk ss 1
+bk90 1
+bk93 1
+bk94 1
+bkkt94 1
+bl 15
+bl black 1
+bl delft 2
+bl dpx 1
+bl for implem 1
+bl gip 1
+bl p bl0 1
+bl s.a 1
+bl soit 1
+bl soit ff 1
+bl son 1
+bl son corp 1
+bl0 1
+bl75 1
+bl86 1
+bl90 1
+bl91 1
+black 16
+black and strip 1
+black and v2 1
+black and whit 1
+black arrow 1
+black block 1
+black box 4
+black box constraint 1
+black box test 1
+black dot 1
+black et al 1
+black lin 2
+black nod 1
+black or whit 1
+black pixel 1
+black pixel den 1
+black whit 1
+black whit rat 1
+black whit transit 1
+blackboard 1
+blackboard lik glob 1
+blackboard lik structur 1
+blackboard spac 1
+blackwel 1
+blad 1
+blad mesh 1
+blad reg 1
+blad using 1
+blad using march 1
+blad wa select 1
+blah 1
+blakel 1
+blam 1
+blam assignm 1
+blam assignm problem 1
+blank 7
+blank and incorpor 1
+blank if dec 1
+blank indent 1
+blank lin 2
+blank n indent 1
+blank quietblank 1
+blank reg 1
+blank repeat 1
+blank spac 1
+blank than dat 1
+blasg 2
+blast 1
+blast algorithm 1
+blcok 1
+blcok discr 1
+blcok discr co 1
+blelloch 1
+blen 1
+blen tw separ 1
+bler 1
+blevel 1
+blind 2
+blind appl 1
+blind appl fl 1
+blind search 1
+blind would cluster 1
+blip 1
+blip at unit 1
+blister 1
+blister becom 1
+blister becom vi 1
+blister of arbitr 1
+blm 2
+blob 2
+blob label 1
+blob of mi 1
+bloc 2
+bloc 3bloc 1
+bloc 3bloc 2bloc 1
+bloc a au 1
+bloc a chaqu 1
+bloc b0 1
+bloc bn 1
+bloc ca 1
+bloc com 1
+bloc com point 1
+bloc de 2
+bloc de boucl 1
+bloc de contr 1
+bloc de don 2
+bloc de la 1
+bloc de pag 1
+bloc de tail 1
+bloc de transfer 1
+bloc diff 1
+bloc diff erent 1
+bloc dind 1
+bloc dinstruc 1
+bloc dinstruc par 1
+bloc distinct 1
+bloc distinct acc 1
+bloc distinct de 1
+bloc distribut 1
+bloc distribut cycliqu 1
+bloc dit 1
+bloc dit erat 1
+bloc doiv 1
+bloc doiv etr 1
+bloc du 1
+bloc du recouvr 1
+bloc dun 1
+bloc dun pag 1
+bloc entr 1
+bloc entr le 1
+bloc est 1
+bloc est atteint 1
+bloc est toujour 1
+bloc est trop 1
+bloc et cycliqu 1
+bloc et en 1
+bloc et le 1
+bloc et ne 1
+bloc just 1
+bloc just es 1
+bloc justif 1
+bloc justif es 1
+bloc justif es111 1
+bloc justif es113 1
+bloc justif es115 1
+bloc justif es117 1
+bloc k tel 1
+bloc la 1
+bloc la boucl 1
+bloc le 1
+bloc le colon 1
+bloc ne 1
+bloc nest 1
+bloc oconsc 1
+bloc oconsc de 1
+bloc ojustif 1
+bloc ojustif es 1
+bloc on observ 1
+bloc optim 1
+bloc optim est 1
+bloc par 1
+bloc par rapport 1
+bloc pr 1
+bloc pr ec 1
+bloc provoqu 1
+bloc provoqu beaucoup 1
+bloc ser 1
+bloc ser conserv 1
+bloc simpl 1
+bloc simpl de 1
+bloc simpl136 1
+bloc sont 1
+bloc sont de 1
+bloc sont gr 1
+bloc sont petit 1
+bloc sur 1
+bloc sur le 1
+bloc uniqu 1
+bloc vid 1
+bloc vid ne 1
+block 47
+block a subsystem 1
+block abstract 2
+block abstract typ 1
+block acc 1
+block acc modl 1
+block al pack 1
+block algorithm 1
+block an indirect 1
+block and cut 1
+block and cycl 1
+block and integr 1
+block and non 1
+block and nonblock 1
+block and return 1
+block ar 1
+block ar alloc 1
+block ar contain 1
+block ar cop 1
+block ar exchang 1
+block ar extract 1
+block ar giv 1
+block ar link 1
+block ar merg 1
+block ar recombin 1
+block ar retain 1
+block ar stagger 1
+block ar typ 1
+block ar uniqu 1
+block ar writ 1
+block artifact 1
+block as text 1
+block at termin 1
+block b1 1
+block be retain 1
+block becom 1
+block becom addit 1
+block befor b9 1
+block being exit 1
+block belong 1
+block bi 1
+block bound 3
+block branch 1
+block by obstacl 1
+block by using 1
+block can block 1
+block can pa 1
+block can tak 1
+block cant begin 1
+block cl 1
+block cl conform 1
+block cod 2
+block cod imag 1
+block cod shown 1
+block com 1
+block commun 2
+block commun model 1
+block comp 1
+block comp sdot 1
+block con 3
+block constraint 1
+block constraint lem 1
+block contain 1
+block contain suff 1
+block cop 1
+block cop network 1
+block correspon 2
+block cut 1
+block cut ver 1
+block cycl 1
+block cycl schedl 1
+block descript 1
+block design 1
+block destr 1
+block diagram 1
+block distribut 3
+block do begin 1
+block each contain 1
+block edit 1
+block edit dist 1
+block edit model 1
+block edit problem 1
+block effect 1
+block effect remov 1
+block el 1
+block en 1
+block exampl 1
+block exchang 1
+block execut 1
+block expr 1
+block fact 1
+block flow 1
+block flow an 1
+block for exper 1
+block for knowledg 1
+block form 1
+block from sj 1
+block funct 1
+block h succeed 1
+block handl 1
+block hypoth 1
+block identif 1
+block identif form 1
+block if part 1
+block if remov 1
+block if sj 1
+block in acc 1
+block in ask 1
+block in figur 1
+block in g0 1
+block in intern 1
+block in plac 1
+block in string 1
+block in wt 1
+block inclus 2
+block inclus output 1
+block interfac 1
+block interfac definit 1
+block invoc 1
+block is ap 1
+block is assum 1
+block is btn 1
+block is control 1
+block is ea 1
+block is giv 1
+block is minim 1
+block is op 1
+block is se 1
+block is simpl 2
+block is writ 1
+block jobj 1
+block jump 1
+block label 1
+block lead 1
+block list 1
+block loc 1
+block macr 1
+block match 1
+block may contain 1
+block may occur 1
+block mot 1
+block nam 1
+block natur 1
+block network 1
+block nod 1
+block nod list 1
+block not identif 1
+block object 1
+block object belong 1
+block object composit 1
+block object succ 1
+block of 2k 1
+block of 2n 1
+block of contigu 1
+block of dat 1
+block of figur 1
+block of hierarch 1
+block of ident 1
+block of imag 1
+block of length 1
+block of record 1
+block of ri 1
+block of siz 1
+block of sj 1
+block of templ 1
+block of valu 1
+block of width 1
+block on 1
+block on man 1
+block on pag 1
+block on sit 1
+block oper 2
+block oper2 1
+block or til 1
+block other branch 1
+block pack 1
+block pair 1
+block par 1
+block par cr 1
+block per disk 1
+block permut 1
+block permut rout 1
+block point 1
+block prim 1
+block prim backup 1
+block prob 1
+block prob vs 1
+block probabil 1
+block probabil reflect 1
+block probabil result 1
+block proc 1
+block proper 1
+block rat 1
+block recomb 1
+block repl 1
+block repl degr 1
+block repr 1
+block requir 2
+block requir dat 1
+block sch 1
+block sch em 1
+block schedl 2
+block schedl eff 1
+block segm 1
+block separ 1
+block shar 1
+block shar memor 1
+block situ 1
+block situ occur 1
+block siz 5
+block siz b0 1
+block siz coh 1
+block siz np2 1
+block siz specif 1
+block st 1
+block string 1
+block string match 1
+block structur 1
+block structur langu 1
+block substr 1
+block substr fam 1
+block succ 1
+block switch 1
+block switch network 1
+block th cpn 1
+block th monit 1
+block tim 1
+block to disk 1
+block to execut 1
+block to group 1
+block to temp 1
+block topolog 1
+block trac 1
+block trac rel 1
+block transfer 1
+block transfer involut 1
+block transform 1
+block transform compr 1
+block triangl 1
+block triangl form 1
+block typ 1
+block typ interfac 1
+block until compl 1
+block using 2
+block using textur 1
+block var 1
+block ver 1
+block ver altern 1
+block ver bj 1
+block ver repr 1
+block wa determin 1
+block wait 1
+block wer number 1
+block wer recombin 1
+block wh 2
+block wh mi 1
+block wil occur 1
+block writ 1
+block writ buffer 1
+blocksacc 1
+blocksacc mac 1
+blocksacc min 1
+blocksp 1
+blocksp ictur 1
+blocksp ictur ba 1
+bloesch 1
+blog 3
+blog countc 1
+blog countc lj 1
+blog jf 1
+blog jf jc 1
+blog jxjc 1
+blog mc 1
+blog sl 1
+blog sl lj 1
+blog slc 1
+blog slc lj 1
+blog tc 1
+blog3 1
+blog3 tc 1
+blogn 1
+blood 1
+blood pressur 1
+bloomingt 1
+bloqu 1
+bloqu lop 1
+bloqu lop erateur 1
+bloquait 1
+bloquait pa 1
+bloquait pa le 1
+blostein 1
+blow 1
+blown 1
+blown increm 1
+blown increm prolog 1
+blown system 1
+blown system mic 1
+blowup 1
+blowup in coeff 1
+blowup in integer 1
+blpm 1
+blpm rel 1
+blpm specif 1
+blt 1
+blu 4
+blu ind 1
+blu ind unexpect 1
+blu67 1
+blunder 1
+blunder in surv 1
+blur 1
+bly 1
+bm 7
+bm and correspon 1
+bm ar canon 1
+bm bc 1
+bm bm 1
+bm bm bm 1
+bm e01 1
+bm e1 1
+bm e1 e2 1
+bm is equiv 1
+bm lc 1
+bm n01 1
+bm n1 1
+bm n1 n2 1
+bm o01 1
+bm o1 1
+bm o1 o2 1
+bm th const 1
+bm then dec 1
+bm wh 1
+bm x0 1
+bm92 1
+bmac 1
+bmc 1
+bmc problem 1
+bmc problem inst 1
+bmcl94 1
+bmd 1
+bmd through arm 1
+bmft 1
+bmk 1
+bmk88 1
+bmvc95 1
+bmw85 1
+bn 11
+bn 1g 1
+bn 2c 1
+bn 4c 1
+bn block 1
+bn block con 1
+bn est 1
+bn est dit 1
+bn mr 1
+bn tc 1
+bn2 1
+bn2 bi 1
+bn23 1
+bn2kt 1
+bn3 1
+bnc 1
+bnc bm 1
+bnc bm lc 1
+bnf 1
+bnf descript 1
+bnf descript format 1
+bnf grammar 1
+bnf grammar descript 1
+bnf lik descript 1
+bnf specif 1
+bnf styl 1
+bnf styl sem 1
+bnl2 1
+bnr 1
+bo 6
+bo bi 1
+bo con 1
+bo j.h 1
+bo lin 1
+bo mb 1
+bo repr 1
+bo repr fl 1
+bo versus effect 1
+bo88 2
+bo91 1
+board 6
+board and host 1
+board and imp 2
+board and pinout 2
+board ar 2
+board ar becom 1
+board ar requir 2
+board by plac 2
+board channel 2
+board comp 1
+board etc 1
+board fabr 2
+board fabr constraint 2
+board interconnect 2
+board interconnect technolog 2
+board is util 2
+board link 2
+board network 2
+board network topolog 2
+board of ar 2
+board of doubl 1
+board pinout 2
+board pinout appl 2
+board restrict 2
+board siz 2
+board siz determin 2
+board siz pinout 2
+board siz tech 2
+board spac 2
+board technolog 2
+board to contain 2
+board using 1
+board wir 2
+board with larger 2
+board with siz 1
+boast 2
+boast a detail 1
+bobrow 3
+bocc 1
+bochereau 1
+bochman 1
+bockmayr 1
+bod 29
+bod appear 1
+bod appl 1
+bod appl disc 1
+bod ar 1
+bod ar compil 1
+bod ar evalu 1
+bod ar separ 1
+bod atom 1
+bod b0 1
+bod by spawn 1
+bod camer 1
+bod camer figur 1
+bod e0 1
+bod en 1
+bod en symbol 1
+bod et al 1
+bod expr 2
+bod is cl 1
+bod is evalu 1
+bod is lin 1
+bod is return 1
+bod is simpl 1
+bod liter 1
+bod liter shar 1
+bod may inclus 1
+bod molecl 1
+bod molecl dynam 1
+bod no proc 1
+bod of c0 1
+bod of c1 1
+bod of cod 1
+bod of knowledg 1
+bod of method 1
+bod of program 1
+bod of rl 1
+bod of theor 1
+bod of work 2
+bod problem 2
+bod problem involut 1
+bod produc 1
+bod proper 1
+bod separ 1
+bod sim. 1
+bod siml 1
+bod siml appl 1
+bod siml exampl 1
+bod siml exampl1 1
+bod specif 1
+bod that occup 1
+bod wel typ 1
+bod welltyp 1
+bod would overwhelm 1
+bodenhaus 1
+bodin 3
+bodin et al 1
+bodin examinateur 1
+bodin examinateur william 1
+bodin qu 1
+bodin qu fut 1
+bodlaender 1
+boehm 1
+boer 1
+boerger 1
+boerger di.unip.it 1
+bof 1
+bof serv 1
+bof server 1
+bof server using 1
+bog 1
+bogard 1
+boifn 1
+boifn alph 1
+boifn alph amrn 1
+boil 3
+boissin 1
+boisson 1
+boisson soph.inr.fr 1
+boisson soph.inr.fr geiger 1
+boissonnat 3
+boissonnat bernhard 1
+boissonnat bernhard geiger 1
+boizumault 1
+boizumault mont 1
+boizumault mont fait 1
+boizumault rapporteur 1
+boizumault rapporteur bart 1
+boizumault sur 1
+boizumault sur la 1
+bokhar 1
+bol 2
+bol and m.m 1
+bold 4
+bold dash 1
+bold font 1
+bold styl 1
+boldfac 2
+boldfac pointer 1
+bologn 1
+bolosk 1
+bolot 1
+bom 1
+boman 1
+bomb 2
+bomb on wheel 1
+bomber 1
+bomber di 1
+bomber should ch 1
+bon 10
+bon angl 1
+bon annl 1
+bon annl ee 1
+bon approxim 1
+bon approxim de 1
+bon cambridg 1
+bon cambridg chester 1
+bon claus 1
+bon claus pouvait 1
+bon comport 1
+bon comport de 1
+bon con 1
+bon con de 1
+bon con pr 1
+bon converg 1
+bon converg de 1
+bon de 1
+bon de pouvoir 1
+bon efficacit 1
+bon endroit 1
+bon endroit pour 1
+bon equilibr 1
+bon equilibr de 1
+bon exempl 1
+bon exempl de 1
+bon exploit 1
+bon exploit dun 1
+bon fonct 2
+bon fonct de 1
+bon fonct ne 1
+bon fonct sont 1
+bon gest 1
+bon gest de 1
+bon int 1
+bon int egr 1
+bon length 1
+bon nombr 3
+bon nombr de 2
+bon nombr derreur 1
+bon par 1
+bon par el 1
+bon part 2
+bon part de 1
+bon part du 1
+bon perform 1
+bon point 1
+bon point de 1
+bon popl 1
+bon propr 1
+bon qu 1
+bon qu ceux 1
+bon r esultat 2
+bon sch 1
+bon sch em 1
+bon solut 1
+bon solut fin 1
+bon stop 1
+bon tail 1
+bon tail fic 1
+bon valeur 1
+bon w.e 1
+bonacc 1
+bonacc heap 1
+bondalapat 1
+bongiovan 1
+bonner 1
+bonner and kifer 1
+bonnet 1
+bonnet hood 1
+bonom 1
+bonon 1
+bonuccel 1
+bonus 1
+booch 3
+book 11
+book and ap 1
+book and paper 1
+book ar avail 1
+book arm 1
+book deal 1
+book keep 1
+book simil 1
+book we us 1
+bookstein 1
+bool 10
+bool allow 1
+bool bool 1
+bool bool bool 1
+bool ean 1
+bool ean term 1
+bool een 4
+bool een reconnaissabl 1
+bool een suscept 1
+bool elig 1
+bool gen 1
+bool integer 1
+bool lem 1
+bool lem giv 1
+bool oe 1
+bool stud 1
+boolean 23
+boolean algebr 4
+boolean algebr axiom 1
+boolean algebr bm 1
+boolean algebr gener 1
+boolean algebr lat 1
+boolean and den 1
+boolean and non 1
+boolean and oper 2
+boolean answer 1
+boolean bc.in 1
+boolean blank 1
+boolean chang 1
+boolean claus 1
+boolean comb 1
+boolean compat 1
+boolean compat supercl 1
+boolean comput 1
+boolean comput cl 1
+boolean const 2
+boolean const symbol 1
+boolean constraint 2
+boolean constraint solut 1
+boolean constraint5 1
+boolean domain 2
+boolean domain solut 1
+boolean equ 1
+boolean equ constraint 1
+boolean equ constraint.2 1
+boolean equiv 1
+boolean eval 1
+boolean eval return 1
+boolean eval tak 1
+boolean expr 6
+boolean finit 1
+boolean finit domain 1
+boolean form 1
+boolean forml 3
+boolean forml 8y9x 1
+boolean forml assoc 1
+boolean forml hold 1
+boolean forml problem 1
+boolean funct 3
+boolean funct fc 1
+boolean funct inclus 1
+boolean funct prov 1
+boolean funct recogn 1
+boolean guard 1
+boolean guard gi 1
+boolean in column 1
+boolean ind 1
+boolean is defin 1
+boolean langu 1
+boolean lat 1
+boolean oper 4
+boolean or oper 1
+boolean proc 1
+boolean propag 1
+boolean propag conjunct 1
+boolean repr 1
+boolean ring 1
+boolean satisf 1
+boolean se 1
+boolean se oper 1
+boolean shap 1
+boolean shap oper 1
+boolean solut 1
+boolean solver 1
+boolean solver writ 1
+boolean term 2
+boolean test 1
+boolean theor 1
+boolean unif 1
+boolean unif algorithm 1
+boolean valu 5
+boolean valu fal 1
+boolean valu funct 1
+boolean valu var 1
+boolean var 2
+boolean var sum 1
+boolean var xi 1
+boolean variabl 2
+boolean variabl ge 1
+boolean variabl lij 1
+boolean vect 2
+boolean vect select 1
+boon 1
+boon lim 1
+boortz 1
+boost 1
+boost program 1
+boost program execut 1
+boot 3
+boot tim 2
+bootstrap 2
+bootstrap purp 1
+bor 2
+bor tim 1
+bor tim interv 1
+bord 2
+bord ce 1
+bord ce fo 1
+bord inattendus 1
+bord int 1
+bord int er 1
+bord pouv 1
+bord pouv etr 1
+bordeaux 1
+border 6
+border ca 1
+border inst 1
+border marker 1
+border point 1
+border point inclus 1
+border point vs 1
+border reg 1
+border wa larger 1
+border wer defin 1
+borderl 1
+borderl stat 1
+borderl stat signif 1
+borgn 1
+borland 1
+borland 1993a 1
+borland 1993b 1
+borland objectwindow 1
+borland s objectwindow 1
+borland s readm 1
+born 10
+born 3j 1
+born a cop 1
+born a effectuer 1
+born a la 1
+born assoc 1
+born assoc ee 1
+born consid 1
+born consid er 1
+born const 1
+born correspon 1
+born correspon aux 1
+born d epen 1
+born de 1
+born de bloc 1
+born de boucl 1
+born de i1 1
+born de la 1
+born de lensembl 1
+born de pag 1
+born de pav 1
+born de variabl 1
+born don 1
+born don ee 1
+born du 1
+born du degr 1
+born du ki 1
+born du nouveau 1
+born du pol 1
+born ee 1
+born ee par 1
+born egal 1
+born egal le 1
+born en 1
+born en fonct 1
+born en un 1
+born et al 1
+born et le 1
+born exact 1
+born in mind 2
+born inf 2
+born inf erieur 2
+born li 1
+born obtenu 1
+born obtenu correspon 1
+born obtenu pr 1
+born obtenu valent 1
+born r esult 1
+born refer 1
+born se 1
+born suiv 1
+born sup 2
+born sup erieur 2
+born th 1
+born th eoriqu 1
+borner 2
+borner a restaurer 1
+borrow 3
+borrow for us 1
+borrow from modl 1
+borrow id 1
+borut 1
+borut rob 1
+borut.rob 1
+borut.rob ij.si 1
+boser 1
+bosman 2
+bosman and heinz 1
+bosman clark 1
+bossch 1
+bossch et al 1
+bost 12
+bost basel 1
+bost basel stuttgart 1
+bost ma 2
+botch 1
+bother 2
+bother to explicit 1
+bottleneck 19
+bottleneck affect 1
+bottleneck du 1
+bottleneck fr 1
+bottleneck fr prior 1
+bottleneck impl 1
+bottleneck in extern 1
+bottleneck is accentu 1
+bottleneck lead 1
+bottleneck problem 1
+bottleneck problem assoc 1
+bottleneck that ar 1
+bottom 19
+bottom block 1
+bottom el 1
+bottom entr 1
+bottom half 1
+bottom laser 1
+bottom laser strip 1
+bottom level 1
+bottom lin 1
+bottom port 1
+bottom right leftover 1
+bottom row 1
+bottom sect 1
+bottom show 1
+bottom show outl 1
+bottom to top 2
+bottom up an 1
+bottom up denot 1
+bottom up equiv 1
+bottom up evalu 1
+bottom up fash 2
+bottom up heap 1
+bottom up layout 1
+bottom up proc 1
+bottom up replac 1
+bottom up ser 1
+bottom up techniqu 1
+bottom up tool 1
+bottom up tp 1
+bottomup 1
+bottomup in cl 1
+bou 1
+bou and bom 1
+bouatouch 1
+boucl 3
+boucl 1d 1
+boucl a acc 1
+boucl a chaqu 1
+boucl a la 1
+boucl a moin 1
+boucl a partitionner 1
+boucl a tr 1
+boucl a un 1
+boucl ain 1
+boucl ain construit 1
+boucl ain qu 1
+boucl apr 1
+boucl apr es 1
+boucl au 1
+boucl au ca 1
+boucl ayant 1
+boucl car 1
+boucl car cest 1
+boucl ce 1
+boucl ce qu 1
+boucl concern 1
+boucl cont 1
+boucl cont plusieur 1
+boucl correspon 1
+boucl correspon aux 1
+boucl dan 1
+boucl dan le 1
+boucl de 1
+boucl de calcl 1
+boucl de cop 1
+boucl de hypoth 1
+boucl de la 1
+boucl de lawr 1
+boucl de man 1
+boucl de parcour 1
+boucl de tel 1
+boucl de treil 1
+boucl doal 1
+boucl doal est 1
+boucl doiv 2
+boucl doiv alor 1
+boucl doiv etr 1
+boucl du 1
+boucl du nid 1
+boucl du noyau 1
+boucl du program 1
+boucl dun 1
+boucl dun transform 1
+boucl en 1
+boucl en bloc 1
+boucl en consid 1
+boucl en deux 1
+boucl en lim 1
+boucl est 1
+boucl est analogu 1
+boucl est donc 1
+boucl est par 1
+boucl est parfait 1
+boucl est souv 1
+boucl est toujour 1
+boucl est transform 1
+boucl et au 1
+boucl et de 1
+boucl et donc 1
+boucl et en 1
+boucl et la 1
+boucl et le 1
+boucl et non 1
+boucl et risqu 1
+boucl et tout 1
+boucl et vi 1
+boucl etant 1
+boucl etant alor 1
+boucl etc 1
+boucl etud 1
+boucl etud ee 1
+boucl ex. 1
+boucl excessiv 1
+boucl excessiv complec 1
+boucl extern 1
+boucl extern ce 1
+boucl extern du 1
+boucl extern est 1
+boucl extern iter 1
+boucl extern ne 1
+boucl extern ou 1
+boucl extern par 1
+boucl extern parcour 1
+boucl extern qu 1
+boucl extern soit 1
+boucl fin 1
+boucl fin est 1
+boucl i elimin 1
+boucl i est 1
+boucl i ne 1
+boucl i sont 1
+boucl i1 1
+boucl i1 la 1
+boucl i2 1
+boucl i2 etant 1
+boucl init 1
+boucl init en 1
+boucl init entr 1
+boucl init est 1
+boucl init nest 1
+boucl init sont 1
+boucl intern 1
+boucl intern com 1
+boucl intern de 1
+boucl intern en 1
+boucl intern est 1
+boucl intern ne 1
+boucl intern neffectu 1
+boucl intern qu 1
+boucl issus 1
+boucl issus de 1
+boucl j dan 1
+boucl k sur 1
+boucl la 1
+boucl la transform 1
+boucl lalloc 1
+boucl lalloc de 1
+boucl le 1
+boucl ne 1
+boucl ne comport 1
+boucl ne cont 1
+boucl ne fait 1
+boucl ne po 1
+boucl ne pouv 1
+boucl ne sont 1
+boucl nengendrer 1
+boucl nengendrer de 1
+boucl nest 1
+boucl nest pa 1
+boucl ninterd 1
+boucl ninterd pa 1
+boucl non 1
+boucl non par 1
+boucl non parfait 1
+boucl obtenu 1
+boucl obtenu cont 1
+boucl obtenu par 1
+boucl obtenu pour 1
+boucl obtenu sont 1
+boucl on garantit 1
+boucl ont 1
+boucl ou 1
+boucl ou la 1
+boucl pa 1
+boucl pa donc 1
+boucl par 1
+boucl par el 1
+boucl par le 1
+boucl par notr 1
+boucl par patron 1
+boucl par rapport 1
+boucl par. 1
+boucl parcour 1
+boucl parcour donc 1
+boucl parcour le 1
+boucl parfait 1
+boucl parfait imbriqu 1
+boucl perm 1
+boucl perm de 1
+boucl peut 1
+boucl peuv 1
+boucl peuv alor 1
+boucl peuv etr 1
+boucl pour 1
+boucl pour chaqu 1
+boucl pour etr 1
+boucl pour modif 1
+boucl pour optimiser 1
+boucl pr 1
+boucl pr ec 1
+boucl pr esent 1
+boucl puisquon 1
+boucl puisquon na 1
+boucl qu 1
+boucl qu acc 1
+boucl qu dan 1
+boucl qu le 1
+boucl qu lon 1
+boucl qu nous 1
+boucl r egl 1
+boucl r ep 1
+boucl refl 1
+boucl refl etant 1
+boucl s 1
+boucl s ecrit 1
+boucl s equentiel 1
+boucl s il 1
+boucl san fin 1
+boucl san test 1
+boucl seront 1
+boucl seront ex 1
+boucl similair 1
+boucl similair au 1
+boucl sont 1
+boucl sont ex 1
+boucl sont par 1
+boucl sub 1
+boucl suiv 1
+boucl suiv acc 1
+boucl suiv pr 1
+boucl suppl 1
+boucl suppl ementair 1
+boucl sur 1
+boucl sur la 1
+boucl sur le 1
+boucl sur un 1
+boucl tel 1
+boucl tel qu 1
+boucl transfor. 1
+boucl transform 1
+boucl transform ee 1
+boucl v erif 1
+boucl vi 1
+boucl vid 1
+boucl vid pour 1
+boucl vid sur 1
+boudec 1
+boudol 1
+boug 1
+bought 1
+bought libr 1
+boul 1
+boul de 1
+boul de lespac 1
+boul hypercubiqu 1
+boulder 4
+boulever 1
+boulever pa 1
+boulever pa ce 1
+bounc 1
+bounc effect 1
+bound 80
+bound a prior 1
+bound acc 1
+bound achief 1
+bound al affect 1
+bound algorithm 2
+bound algorithm describ 1
+bound alignm 1
+bound amount 1
+bound and bound 1
+bound and fair 1
+bound and fit 1
+bound and greater 1
+bound and optim 1
+bound and upper 1
+bound ap 1
+bound appl 4
+bound ar achief 1
+bound ar complec 1
+bound ar compr 1
+bound ar del 1
+bound ar giv 1
+bound ar remov 1
+bound ar repr 1
+bound ar tight 1
+bound ar typ 1
+bound argum 1
+bound ary 1
+bound ary nod 1
+bound as pgp 1
+bound assign 1
+bound at run 1
+bound at runtim 1
+bound be 1
+bound be strateg 1
+bound between cluster 1
+bound between learn 1
+bound between tr 1
+bound box 2
+bound buffer 1
+bound burst 1
+bound burst model 1
+bound by 2t 1
+bound by 3n 1
+bound by bound 1
+bound by ci 1
+bound by const 1
+bound by ffl0 1
+bound by funct 1
+bound by k2 1
+bound by kjt 1
+bound by mn 1
+bound by period 1
+bound by rectangl 1
+bound by using 1
+bound ca 1
+bound character 1
+bound commun 1
+bound commun del 1
+bound compar 1
+bound concur 1
+bound concur tim 1
+bound concur timestamp 1
+bound convec 1
+bound convec polyhedr 1
+bound correspon 1
+bound def 1
+bound defin 2
+bound degr 1
+bound degr spanner 1
+bound deliver 1
+bound deliver sw 1
+bound dep 1
+bound dur unif 1
+bound ec 1
+bound effect 1
+bound extract 1
+bound fair 1
+bound follow 1
+bound for bal 1
+bound for dec 1
+bound for deg 1
+bound for del 1
+bound for determin 1
+bound for failover 1
+bound for fram 1
+bound for implem 1
+bound for l2 1
+bound for segm 1
+bound for select 1
+bound for sort 1
+bound for theorem 1
+bound for var 1
+bound from theorem 1
+bound giv 3
+bound hold 4
+bound hold indep 1
+bound hold regard 1
+bound ident 1
+bound in lem 1
+bound in pack 1
+bound in pract 1
+bound in sect 1
+bound in theorem 3
+bound inclus 1
+bound inform 1
+bound is 2l 1
+bound is asymptot 1
+bound is deriv 1
+bound is ea 1
+bound is empt 1
+bound is exact 1
+bound is handl 1
+bound is hug 1
+bound is known 1
+bound is mc 1
+bound is minrol 1
+bound is nc 1
+bound is obv 1
+bound is push 1
+bound is smaller 1
+bound is straight 1
+bound is tight 3
+bound is top 1
+bound it differ 1
+bound kernighan 1
+bound kernighan lin 1
+bound ld 1
+bound length 1
+bound list 1
+bound ln 1
+bound loc 1
+bound loc spac 1
+bound mak 1
+bound mak us 1
+bound mart 1
+bound mc 1
+bound mc nc 1
+bound me 1
+bound me del 1
+bound measur 1
+bound ment 1
+bound method 1
+bound min 1
+bound n pmbp 1
+bound nod 1
+bound not known 1
+bound of 4jpl 1
+bound of control 1
+bound of d2 1
+bound of ib 1
+bound of lem 1
+bound of look 1
+bound of major 1
+bound of pot 1
+bound of qd 1
+bound of theorem 1
+bound of writ 1
+bound on actu 1
+bound on block 1
+bound on complec 1
+bound on en 1
+bound on execut 1
+bound on failover 1
+bound on ib 1
+bound on intern 1
+bound on jn 1
+bound on jv1 1
+bound on parallel 1
+bound on reach 1
+bound on recomput 1
+bound on repl 1
+bound on tl 1
+bound oper 1
+bound oper fun 1
+bound or known 1
+bound or unbound 1
+bound out 2
+bound out finit 1
+bound out is 1
+bound period 1
+bound phy 1
+bound phy spac 1
+bound point 2
+bound prf1 1
+bound prfx 1
+bound prov 1
+bound quantif 1
+bound rectangl 1
+bound recur 1
+bound reg 1
+bound rel 1
+bound repr 1
+bound rl 1
+bound s 2n 1
+bound sect 1
+bound segm 1
+bound sen 1
+bound sen error 1
+bound sensit 1
+bound sensit featur 1
+bound shift 1
+bound shift out 1
+bound shown 1
+bound siz 1
+bound slight 1
+bound stack 1
+bound stack cl 1
+bound surfac 1
+bound t tj0 1
+bound task 1
+bound tcol 1
+bound tetrahedr 1
+bound tetrahedr inter. 1
+bound th addit 1
+bound th amount 1
+bound th differ 1
+bound th minim 1
+bound th number 2
+bound th old 1
+bound th perform 1
+bound th prev 1
+bound th prob 1
+bound th queu 1
+bound th rat 1
+bound th sum 1
+bound th tim 1
+bound th vol 1
+bound tim 1
+bound tim stamp 1
+bound to conform 1
+bound to differ 1
+bound to fail 2
+bound to gf 1
+bound to grow 1
+bound to identif 1
+bound to k1 1
+bound to k2 1
+bound to succeed 1
+bound to yield 1
+bound unfair 1
+bound using 3
+bound using algorithm 1
+bound using center 1
+bound using chernoff 1
+bound valu 2
+bound valu m2 1
+bound var 1
+bound variabl 2
+bound ver 1
+bound we consider 1
+bound we der 1
+bound we ge 1
+bound we us 1
+bound which giv 1
+bound xi 1
+bound xj0 1
+bound. 1
+bound1 1
+bound1 upper 1
+bound1 upper bound1 1
+boundaryw 1
+boundaryw w1 1
+boundaryw w1 bb 1
+boundedbuffer 1
+boundedbuffer that us 1
+boundn 1
+boundn upper 1
+boundn upper boundn 1
+bourg 1
+bourgault 1
+bourguignon 1
+bout 3
+bout de 3
+bout dun 2
+bout dun cycl 1
+bout dun longu 1
+bovick 1
+bow 5
+bow alpern 1
+bow and p.k 1
+bow and p.t 1
+bow et al 1
+bowel 1
+bower 1
+box 30
+box and observ 1
+box approach 1
+box approach allow 1
+box border 1
+box constraint 1
+box constraint langu 1
+box count 1
+box count dim 1
+box ind 2
+box langu 1
+box of opt 1
+box plot 1
+box shown 1
+box signif 1
+box solver 1
+box test 1
+box whisker 1
+box whisker plot 1
+box wil interact 1
+box with bidirect 1
+boyer 2
+boyer and moor 1
+bp 12
+bp a ap 1
+bp a la 1
+bp algorithm 1
+bp algorithm pr 1
+bp bp 1
+bp bp deep 1
+bp by definit 1
+bp con 1
+bp dan 1
+bp dan bp 1
+bp deep 1
+bp deep au 1
+bp deep seq 1
+bp definit 1
+bp equ 1
+bp et cp 1
+bp et le 1
+bp learn 1
+bp model 1
+bp model us 1
+bp ne 1
+bp ne cont 1
+bp network 1
+bp nod 1
+bp nod therefor 1
+bp ou 1
+bp ou bp 1
+bp p tail 1
+bp psnr 1
+bp qu 1
+bp qu dev 1
+bp seq 1
+bp tabl 1
+bp th maxim 1
+bp87 1
+bp89 1
+bp9 1
+bpc 1
+bpc al yield 1
+bpc and fft 1
+bpc incr 1
+bpc involut 1
+bpc requir 1
+bpq 1
+bpt 1
+bq 3
+bq with bs 1
+bqpb 1
+br 15
+br apparc 1
+br bershad 1
+br brasil 1
+br cantwel 1
+br cantwel smith 1
+br de 1
+br de li 1
+br de quatern 1
+br dop 1
+br dop rat 1
+br ev 2
+br ev le 2
+br ev quun 1
+br ii 1
+br inser 1
+br is shown 1
+br j chang 1
+br johnson 1
+br ls 1
+br mont 1
+br mont ouver 1
+br nest 1
+br nest encor 1
+br project 1
+br project confer 1
+br result 1
+br63 1
+br91 1
+br92 1
+br92a 1
+br92b 1
+br93 1
+br94 1
+br95 1
+brac 2
+brac jovanovich 2
+brac jovanovich colleg 1
+brac jovanovich publ 1
+brachman 1
+brack 4
+brack denot 1
+brack for us 1
+brack graph 1
+brack graph repr 1
+brack instead 1
+brack syntac 1
+brack2 1
+brad 2
+bradford 1
+brag 1
+brain 5
+brain dam 1
+brain design 1
+brain designer 1
+brain imag 1
+brain is displ 1
+brain sc 1
+brain surgeon 1
+brak 1
+brak const 1
+brak re 1
+brak re forc 1
+brak window 1
+brakep 1
+brakep deriv 1
+brakep deriv brakep 1
+brakep deriv windf 1
+brakep tracf 1
+brakep tracf enginepower 1
+brakep typ 1
+brakep user 1
+brakep user input 1
+brakf 1
+brakf brakk 1
+brakf gradf 1
+brakf gradf rollf 1
+brakk 1
+bral 1
+branch 25
+branch a ce 1
+branch a2c 1
+branch addr 1
+branch addr calcl 1
+branch and birth 1
+branch and bound 2
+branch and bundl 1
+branch and indirect 1
+branch and jump 2
+branch and lim 1
+branch andbound 1
+branch ar implicit 1
+branch arrow 1
+branch assoc 1
+branch at s6 1
+branch bar 1
+branch becom 1
+branch ch 1
+branch com 1
+branch command 1
+branch command requir 1
+branch conditionnel 2
+branch conditionnel dan 1
+branch conditionnel jmpcc 1
+branch conditionnel ni 1
+branch contour 1
+branch contour defin 1
+branch de 1
+branch de linformatiqu 1
+branch decr 1
+branch dont block 1
+branch eman 1
+branch en 1
+branch encounter 1
+branch ex 1
+branch ex ecut 1
+branch facil 1
+branch fam 1
+branch fam fml 1
+branch fam stat 1
+branch hash 1
+branch hash tabl 1
+branch hav avail 1
+branch im 1
+branch im ediat 1
+branch in root 1
+branch inc 1
+branch incom 1
+branch instruc 1
+branch is inc 1
+branch is tak 1
+branch jump 2
+branch jump loop 1
+branch may eman 1
+branch nod 1
+branch not predict 1
+branch not tak 1
+branch occur 1
+branch of bundl 1
+branch of hyperbol 1
+branch on tag 1
+branch on user 1
+branch or edg 1
+branch or gu 1
+branch or jump 1
+branch outcom 1
+branch perfect 1
+branch pr 1
+branch predict 1
+branch predict count 1
+branch prior 1
+branch problem 1
+branch repr 1
+branch requir 1
+branch result 1
+branch result var 1
+branch retard 1
+branch rl 1
+branch strateg 1
+branch strateg appear 1
+branch strateg displ 1
+branch strateg ind 1
+branch strateg outperform 1
+branch subproof 1
+branch tak 2
+branch tak path 1
+branch th tr 1
+branch tim 3
+branch tim sampl 1
+branch tim tempor 2
+branch to execut 1
+branch trac 1
+branch trac inform 1
+branch try 1
+branch var 1
+branch variabl 1
+branch ver 1
+branch ver du 1
+branch wer bar 1
+branch wer predict 1
+brand 1
+brandon 1
+brandon bennet 1
+brandon sc.leed.ac.uk 1
+brantl 1
+brasil 1
+bratk 1
+bratk et al 1
+braunschweig 1
+brayshaw 1
+brayshaw and eisenstadt 1
+brazil 1
+brazil cl 1
+brazil cl inf.puc 1
+brcp 1
+brdcast 1
+brdcast period 1
+brdcast period sd 1
+breach 2
+bread 1
+breadth 4
+breadth first manner 2
+breadth first search 2
+breadth first techniqu 1
+breadthfirst 1
+breadthfirst search 1
+breadthfirst search tr 1
+break 30
+break a dol 1
+break apart 1
+break both string 1
+break down log 1
+break encapsl 1
+break even point 1
+break interv 1
+break multiloop 1
+break multiloop dep 1
+break on load 1
+break on loop 1
+break point 2
+break quadr 1
+break quadr constraint 1
+break se 1
+break se tripl 1
+break subcl 1
+break symmeter 1
+break th cycl 1
+break th domain 1
+break th fil 1
+break th graph 1
+break th loop 1
+break th mater 1
+break th recur 1
+break th rel 1
+break th rigid 1
+break th segm 1
+break th ti 1
+break th tripl 1
+break that bound 1
+break their transport 1
+break with lisp 1
+breakdown 5
+breakdown in sent 1
+breakdown is ba 1
+breakdown occur 1
+breakdown of sort 1
+breakdown situ 1
+breakdown situ occur 1
+breakdown user 1
+breakpoint 1
+breakthrough 3
+breast 1
+breast cancer 1
+breast cancer wi 1
+breath 2
+breath first search 1
+breazu 1
+breazu tan 1
+bredeweg 1
+brennan 1
+brent 1
+brentz 1
+brep 1
+brep of stat 1
+breslau 1
+bretthauer 1
+bretthauer gmd.de 1
+breuer 1
+breuker 2
+breuker et al 1
+breuker j.a 1
+brev 6
+brev th proof 1
+brev we om 1
+brev we us 1
+brewer 1
+brezinsk 1
+brg 1
+brg le 1
+brg le vecteur 1
+brh94 1
+brick 1
+bricker 1
+bridg 12
+bridg connect 1
+bridg connect augm 1
+bridg connect compon 1
+bridg connect g0 1
+bridg connect subgraph 1
+bridg crx 1
+bridg crx echocardiogram 1
+bridg edg 1
+bridg in g0 1
+bridg th detect 1
+bridg th gap 5
+bridgeconnect 1
+bridgeconnect compon 1
+brief 50
+brief a layer 1
+brief as follow 1
+brief befor proceed 1
+brief ca 1
+brief ca stud 1
+brief character 1
+brief character mult 1
+brief com 1
+brief compar 2
+brief consider 1
+brief describ 10
+brief describ earl 1
+brief describ implem 1
+brief descript 5
+brief disc 7
+brief enumer 1
+brief ind 1
+brief introduc 3
+brief list 1
+brief look 1
+brief ment 2
+brief overview 3
+brief overview prev 1
+brief rec 3
+brief review 1
+brief sketch 1
+brief sketch hilog 1
+brief sum 2
+brief summariz 1
+brief surv 2
+brief surv work 1
+brief visu 1
+brief visu repr 1
+brig 3
+brigham 2
+brigham young 2
+bright 5
+bright gabriel 1
+bright light 1
+bright sid 1
+bright spot 1
+bright spot result 1
+bright spot ten 1
+brighter 1
+brighter futur 1
+brigit 2
+brigit gl 1
+brigit tr 1
+bril 1
+bril and simpl 1
+brinegar 1
+bring 19
+bring a lot 1
+bring about signif 1
+bring any clear 1
+bring by permut 1
+bring down perunit 1
+bring host 1
+bring int intern 1
+bring int pl 1
+bring int scop 1
+bring it output 1
+bring mor principl 1
+bring th dat 1
+bring th forml 1
+bring to edg 1
+bring up bil 1
+bring us 1
+bring us inform 1
+brinkhoff 1
+brisban 3
+bristol 2
+brit 6
+brit columb 1
+brit council 2
+brit mach 1
+brit mach vi 1
+brit sc 1
+brit standard 1
+brit standard institut 1
+brit telecom 1
+brit telecom research 1
+broad 17
+broad ar 1
+broad cl 2
+broad classif 1
+broad compar 1
+broad difficult 1
+broad domain 1
+broad foc 1
+broad foc context 1
+broad group 1
+broad rang 1
+broad se 1
+broad simil 2
+broad simil facil 1
+broad speak 2
+broad term 1
+broad term sl1s 1
+broad th user 1
+broadb 1
+broadband 2
+broadband appl 1
+broadband isdn 1
+broadband network 1
+broadband pack 1
+broadband pack network 1
+broadcast 22
+broadcast adjustm 1
+broadcast along row 1
+broadcast and ev 1
+broadcast and gather 1
+broadcast and multicast 1
+broadcast ar period 1
+broadcast ba 2
+broadcast block 1
+broadcast bus 1
+broadcast by click 1
+broadcast channel 2
+broadcast consensus 1
+broadcast consensus protocol 1
+broadcast correspon 1
+broadcast dat 1
+broadcast div 1
+broadcast div flag 1
+broadcast domain 1
+broadcast domain signif 1
+broadcast dw 1
+broadcast et en 1
+broadcast event 1
+broadcast event ev 1
+broadcast facilit 1
+broadcast facilit monit 1
+broadcast for count 1
+broadcast for redund 2
+broadcast gather 1
+broadcast gather oper 1
+broadcast glob 1
+broadcast in figur 1
+broadcast in mesh 1
+broadcast in simd 1
+broadcast input 1
+broadcast input vect 1
+broadcast is actu 1
+broadcast is ea 1
+broadcast is enh 1
+broadcast is follow 1
+broadcast it request 1
+broadcast me 2
+broadcast model 1
+broadcast network 1
+broadcast of cover 1
+broadcast of siz 1
+broadcast on pe 1
+broadcast on switch 1
+broadcast oper 1
+broadcast or gather 1
+broadcast period 1
+broadcast period length 1
+broadcast period standard 1
+broadcast perm 2
+broadcast perm pen 1
+broadcast prim 1
+broadcast protocol 3
+broadcast requir 1
+broadcast ring 1
+broadcast ring network 1
+broadcast ring proper 1
+broadcast ring unidirect 1
+broadcast se 1
+broadcast se allow 1
+broadcast sequ 1
+broadcast siz 1
+broadcast th adjustm 1
+broadcast th glob 1
+broadcast th ident 1
+broadcast th inform 1
+broadcast th link 1
+broadcast th splitter 1
+broadcast tim 1
+broadcast tim using 1
+broadcast to awak 1
+broader 4
+broader cl 1
+broader interfac 1
+broader ranger 1
+broader se 1
+broader sen 1
+broader sen consider 1
+brockschmidt 1
+brockschmidt def 1
+brockschmidt def ol 1
+brod 1
+brodatz 1
+brodatz cl 1
+brodatz test 1
+brodatz test se 1
+brodatz textur 1
+brodatz textur collect 1
+brodatz textur datab 1
+brodatz textur imag 1
+broessler 1
+brok 14
+brok by remov 1
+brok by select 2
+brok by using 1
+brok edg 1
+brok random 1
+brok record 1
+brok record reflect 1
+brok record start 1
+brok shap 1
+bronchit 1
+bronchit and lung 1
+bronchit giv 1
+bronchit giv smok 1
+brook 9
+brook conner 1
+brook dr 1
+brook dr st 1
+brook et al 1
+brook st 1
+brook st brook 1
+brookshir 1
+brookshir conner 1
+brother 2
+brother expr 1
+brother or fatherexpr 1
+brother posit 1
+brought 3
+brought int intern 1
+brought int scop 1
+brouwer 1
+brow 3
+brow and qsort 1
+brow book 1
+brow hierarch 1
+brow hierarch organ 1
+brow of rel 1
+brow on lin 1
+brow schem 1
+brow schem decl 1
+brow th nearb 1
+brown 22
+brown and chandrasekaran 1
+brown and marc 1
+brown and najork 1
+brown anim 1
+brown anim gener 1
+brown computer 1
+brown computer graph 1
+brown d.c 1
+brown ext 1
+brown fox 1
+brown fox jump 1
+brown liu 1
+brown univer provid 4
+brown univer support 1
+brown univer techn 1
+brown univer ug 1
+browser 7
+browser cach 1
+browser is es 1
+browser menu 1
+browser menu item 1
+browser or reboot 1
+browser support 1
+browser support appl 1
+browser support form 1
+browser to decl 1
+browser which obtain 1
+browser would enh 1
+broyd 1
+bru75 1
+bru93 1
+bruc 9
+bruc and giusep 1
+bruc and john 1
+bruc and mitchel 1
+bruc donald 1
+bruc hendrickson 2
+bruc leasur 1
+bruc lind 2
+bruck 1
+bruin 1
+bruit 1
+bruit de 1
+bruit de mesur 1
+bruit et signaux 1
+bruit homog 1
+bruit homog ne 1
+bruit ind 1
+bruit ind pen 1
+bruit isotrop 1
+bruit sur 1
+bruit sur le 1
+brun 2
+brun poizat 1
+brun poter 1
+brunswick 5
+brunswick new jer 1
+brunswick sydn 1
+brussel 1
+brussel pp 1
+brut 2
+brut a deux 1
+brut de 1
+brut de la 1
+brut forc 1
+brut forc implem 1
+brut forc select 1
+bruynoogh 3
+bruynoogh and wir 1
+brw88 1
+bry 1
+brzosk 1
+brzozowsk 1
+bs 10
+bs a sc 1
+bs acc 1
+bs acc right 1
+bs ad 1
+bs ad bs 1
+bs algorithm 1
+bs ar tr 1
+bs model 1
+bs norm 1
+bs norm point 1
+bs norm vect 1
+bs plan 1
+bs privileg 1
+bs respect 1
+bs sibl 1
+bs siblingb 1
+bs techniqu 1
+bs5exit 1
+bs5exit b enter 1
+bs91 2
+bs92 2
+bsd 1
+bsd sock 1
+bsen 1
+bsen ar giv 1
+bsen expr 1
+bsen expr receiv 1
+bsen in term 1
+bsen m2 1
+bsen mc 1
+bsen mc actorc 1
+bsen md 1
+bsen md actord 1
+bsen me act 1
+bsp 2
+bsp tr 1
+bsp tr ba 1
+bsp tr repr 1
+bstartc 1
+bstartc bt 1
+bstj 1
+bstract 1
+bstract ba 1
+bstract ba blocksp 1
+bt 7
+bt dt 1
+bt heq 1
+bt heq uickb 1
+bt hierarch 1
+bt hierarch memor 1
+bth 1
+bth segm 1
+bth segm st 1
+btn 1
+btn 2c 1
+btn 2c connect 1
+btn 2c inter 1
+bu 6
+bu la 1
+bu la ta 1
+bu system 1
+bu1 1
+bu1 from proposit 1
+bu1 hold 1
+bu1 npn 1
+bu1 npn pn 1
+bu1 reduc 1
+bu1 with degr 1
+bubbl 2
+bubbl ar therefor 1
+bubbl memor 1
+bubbl memor secon 1
+bubblesort 1
+bubblesort in aver 1
+buc85 1
+bucckingham 1
+buchberger 2
+buck 6
+buck ar contigu 1
+buck ar distribut 1
+buck ar form 1
+buck ar writ 1
+buck ba 1
+buck by appl 1
+buck by s1 1
+buck con 1
+buck contain 1
+buck each contain 1
+buck ev 1
+buck form 1
+buck occup 1
+buck occup problem 1
+buck of se 1
+buck random 1
+buck remain 1
+buck run 1
+buck shap 1
+buck shaper 1
+buck sj 1
+buck sj con 1
+buck sj contain 1
+buck sj produc 1
+buck sj read 1
+buck sj using 1
+buck sj0 1
+buck sort 1
+buck wa writ 1
+buck wh group 1
+buck wil con 1
+buck wil contain 1
+buck wil gener 1
+buck writ 1
+bucketsort 1
+bucketsort for bubbl 1
+buckl 1
+buckl load 1
+budapest 2
+budg 2
+budg by manager 1
+budg dept 1
+budg dept 5000k 1
+budg dnam 1
+budg from deptttl 1
+budg from proj 1
+budg hist 1
+budg is lim 1
+budg managerv 1
+budg of project 1
+budg proj 1
+budg proj 5000k 1
+budg spent 1
+budg valu 1
+budgetu 1
+budgetv 1
+budgetv dn 1
+budgetv dn manager 1
+budgetv dnam 1
+budgetv from deptb 1
+budgetv from projb 1
+budgetv from projttl 1
+budgetv pn 1
+budhiraj 1
+buettner 1
+buffer 18
+buffer a log 1
+buffer accommod 1
+buffer accompan 1
+buffer actu 1
+buffer actu satur 1
+buffer addr 1
+buffer and input 1
+buffer approach 1
+buffer ar allow 1
+buffer ar guaranteed 1
+buffer ar pa 1
+buffer as describ 1
+buffer at fl 1
+buffer ba 1
+buffer ba architectur 1
+buffer ba implem 1
+buffer ba switch 1
+buffer belong 1
+buffer block 1
+buffer block descript 1
+buffer block object 1
+buffer block succ 1
+buffer buffer 1
+buffer by invok 1
+buffer can st 1
+buffer cap 1
+buffer chunk 1
+buffer chunk read 1
+buffer cl 1
+buffer cl impl 1
+buffer client 1
+buffer client record 1
+buffer compl 1
+buffer drain 1
+buffer effect 1
+buffer effect form 1
+buffer el 1
+buffer el smaller 1
+buffer eventu 1
+buffer exhaust 1
+buffer fil 1
+buffer fileid 1
+buffer fl 1
+buffer flush 1
+buffer for eml 1
+buffer for fast 1
+buffer for pe 1
+buffer for structur 1
+buffer for vl 1
+buffer fr 1
+buffer fr spac 1
+buffer from wh 1
+buffer hit 1
+buffer hit rat 1
+buffer ib 1
+buffer implem 1
+buffer implem stat 1
+buffer in memor 1
+buffer in multiproc 1
+buffer incom 1
+buffer incom commun 1
+buffer is fl 2
+buffer is freed 1
+buffer is shown 1
+buffer log 1
+buffer log maintain 1
+buffer manag 3
+buffer manag strateg 1
+buffer manager 1
+buffer manager interfac 1
+buffer manager med 1
+buffer mechan 1
+buffer model 1
+buffer modif 1
+buffer multicast 1
+buffer next chunk 1
+buffer object 1
+buffer object cach 1
+buffer object gather 1
+buffer object invok 1
+buffer of record 1
+buffer of siz 1
+buffer onl requir 1
+buffer organ 1
+buffer over ow 1
+buffer pack 1
+buffer pack await 1
+buffer perform 2
+buffer perform signif 1
+buffer pol 1
+buffer pool 2
+buffer pool buffer 1
+buffer pool manag 1
+buffer prov 1
+buffer prov superior 1
+buffer queu 1
+buffer ram 1
+buffer ram read 1
+buffer refer 1
+buffer refer character 1
+buffer repl 1
+buffer repl method 1
+buffer repl schem 1
+buffer request 1
+buffer requir 1
+buffer schem 1
+buffer siz 4
+buffer siz alloc 1
+buffer siz repr 1
+buffer siz tok 1
+buffer spac 3
+buffer spac alloc 1
+buffer spac lim 1
+buffer st 1
+buffer st manager 1
+buffer stallswait 1
+buffer switch 2
+buffer switch continu 1
+buffer techniqu 1
+buffer techniqu simil 1
+buffer that correspon 1
+buffer to st 1
+buffer typ 1
+buffer typ handl 1
+buffer util 1
+buffer wh siz 1
+buffer wil definit 1
+buffer wil remain 1
+buffer with guard 1
+buffer without corrupt 1
+buffer wormhol 1
+buffer wormhol implem 1
+buffer wormhol rout 1
+buffer wormhol strateg 1
+buffer would perform 1
+buffer writ 1
+buffer writ alloc 1
+buffercpu 1
+bug 7
+bug ar du 1
+bug caus 1
+bug execut 1
+bug fic 1
+bug notif 1
+bug quick 1
+bug requir 1
+bug symptom 1
+bug that show 1
+bugbear 1
+build 72
+build 3d 1
+build 3d morphometer 1
+build a cluster 1
+build a coh 1
+build a commerc 1
+build a cover 1
+build a dep 1
+build a detail 1
+build a heap 2
+build a hierarch 1
+build a labor 1
+build a list 1
+build a log 1
+build a model 2
+build a network 1
+build a parameter 1
+build a parser 1
+build a prototyp 2
+build a pur 1
+build a rang 1
+build a react 1
+build a reduc 1
+build a retrief 1
+build a se 1
+build a sequ 1
+build a shortest 1
+build a simpl 1
+build a singl 1
+build a softwar 1
+build a steiner 1
+build a structur 1
+build a system 6
+build a targ 1
+build a taxonom 1
+build a tool 1
+build a tr 1
+build a typ 1
+build a var 1
+build a wid 1
+build abstract 1
+build abstract plan 1
+build act 1
+build act ba 1
+build algorithm 1
+build an atom 1
+build an ind 1
+build an inver 1
+build an object 1
+build and maintain 1
+build and walk 1
+build arbitr 1
+build arbitr network 1
+build bay 1
+build bay belief 1
+build better structur 1
+build block 11
+build block abstract 1
+build block becom 1
+build block cl 1
+build block el 1
+build block exchang 1
+build block funct 1
+build block hypoth 1
+build block lead 1
+build block object 1
+build block par 1
+build block proc 1
+build block recomb 1
+build block requir 1
+build block sch 1
+build caus 1
+build caus explan 1
+build cfg 1
+build confid 1
+build cost 1
+build cost effect 1
+build di 1
+build di descript 1
+build estim 1
+build estim whith 1
+build famil 1
+build fast 1
+build flec 1
+build flec system 1
+build heap 1
+build heap fast 1
+build high perform 1
+build hom 1
+build hom list 1
+build industr 1
+build industr vi 1
+build instruc 1
+build integr 1
+build integr system 1
+build kb 1
+build larg hierarch 2
+build larg parallel 1
+build larg scal 2
+build larger 1
+build larger system 1
+build layout 1
+build mar 1
+build of cluster 1
+build on earl 1
+build on knowledg 1
+build on le 1
+build parallel 3
+build parallel system 2
+build proc 1
+build program 1
+build recover 1
+build recover queu 1
+build reloc 1
+build reloc chain 1
+build repl 1
+build repl serv 1
+build scal 2
+build scal system 2
+build search 1
+build sem 1
+build sem correct 1
+build sever overlap 1
+build simpl 1
+build simpl sharedmemor 1
+build softwar 1
+build softwar system 1
+build sol 1
+build sol object 1
+build such system 1
+build system 3
+build techniqu 1
+build th ancestr 1
+build th ba 1
+build th broadcast 1
+build th bushiest 1
+build th cfg 1
+build th compl 1
+build th edg 1
+build th neomycin 1
+build th span 1
+build th tool 1
+build th tower 1
+build th tr 2
+build thr dim 1
+build tw kind 1
+build union 1
+build union typ 1
+build up plac 1
+build using 1
+build var 1
+builder 2
+builder transformer 1
+builder transformer builder 1
+built 38
+built a hilber 1
+built a knowledg 1
+built a prototyp 1
+built a siml 1
+built and inst 1
+built as describ 1
+built bottom 1
+built by appl 1
+built by comp 1
+built by creat 1
+built by es 1
+built by interconnect 1
+built computer 1
+built for crash 1
+built from const 1
+built from scratch 1
+built from variabl 2
+built hierarch 1
+built hierarch ind 1
+built in bi 1
+built in datab 1
+built in equiv 1
+built in id 1
+built in inherit 2
+built in label 1
+built in mechan 1
+built in pr 3
+built in prov 1
+built in rout 1
+built in uniqu 1
+built in vb 1
+built increm 1
+built maspar 1
+built maspar rout 1
+built network 1
+built network us 1
+built of straight 1
+built on top 2
+built prim 1
+built resourc 1
+built resourc edit 1
+built through trim 1
+built to comput 1
+built to explor 1
+built using 3
+built using adv 1
+built using proc 1
+built ver quick 1
+built with sx 1
+builtin 1
+builtin me 1
+builtin me pr 1
+buj 1
+bulgar 1
+bulk 6
+bulk dat 1
+bulk dat transport 1
+bulk read 1
+bulk synchron 1
+bulk synchron parallel 1
+bulk upd 1
+bulk writ 1
+bulk writ primitiv 1
+bulletin 7
+bulletin of eatc 1
+bulletin on dat 1
+bullfighter 1
+bump 2
+bump wer detect 1
+bunch 1
+bundl 2
+bundl ar color 1
+bundl b eman 1
+bundl belong 1
+bundl each repr 1
+bundl eman 1
+bundl eman form 1
+bundl hav jr 1
+bundl is assign 1
+bundl is color 1
+bundl that ob 1
+bundl ti 1
+bundl to nod 1
+bundl transm 1
+bunk 1
+bunk ku 1
+bur 1
+burandt 1
+burd 4
+burd of deal 1
+burd of select 1
+burd of thousand 1
+burd to multitud 1
+burdensom 1
+burdensom task 1
+burdorf 1
+bureau 5
+bureau of standard 1
+bureau popl 1
+bureau popl estim 1
+burgermeister 1
+burk 3
+burn 2
+burrow 1
+burrus 1
+burst 7
+burst and darlingt 1
+burst behavior 1
+burst bound 1
+burst dat 1
+burst is uniform 1
+burst mod 1
+burst mod me 1
+burst model 1
+burst of ma 1
+burst of se 1
+burt 2
+bus 22
+bus acc 1
+bus act 1
+bus act du 1
+bus and mesh 2
+bus and tak 1
+bus arbitr 1
+bus at tim 1
+bus autom 1
+bus ba 4
+bus ba architectur 1
+bus ba cluster 2
+bus ba execut 1
+bus ba interconnect 1
+bus ba multiproc 1
+bus ba sa 1
+bus ba snoop 1
+bus ba symmeter 1
+bus bandwidth 1
+bus bandwidth lim 1
+bus befor tim 1
+bus c architectur 2
+bus connect 2
+bus cont 1
+bus contentionidl 1
+bus contentionidl cycl 1
+bus discipl 1
+bus et le 1
+bus ha prov 1
+bus ha separ 1
+bus idl 1
+bus in row 1
+bus interconnect 1
+bus interconnect mp3d 1
+bus interconnect network 1
+bus it 1
+bus load 1
+bus load du 1
+bus lock 1
+bus memor 1
+bus min 2
+bus min direct 2
+bus model 1
+bus ou 1
+bus ou simpl 1
+bus output 1
+bus output port 1
+bus perform 1
+bus period 1
+bus period prov 1
+bus period start 1
+bus port 1
+bus proc 2
+bus result 1
+bus se 1
+bus system 1
+bus traff 1
+bus transact 1
+bus transact gener 1
+bus wait 3
+bus with appl 1
+bush 3
+bush conclus 1
+bush tr 1
+bushiest 1
+busloc 1
+busloc buspriv 1
+buspriv 1
+bust 1
+bust ca 1
+bust in gener 1
+bust that inclus 1
+but 3
+but arithm 1
+but arithm etiqu 1
+but constitu 1
+but contradictoir 1
+but cut 1
+but dan 1
+but dan lesquel 1
+but de 1
+but de droit 1
+but es 1
+but est 1
+but est en 1
+but et empil 1
+but et par 1
+but et pr 1
+but eux 1
+but fait 1
+but fait qu 1
+but gel 1
+but gel es 1
+but lam 1
+but lam elior 1
+but na 1
+but par 1
+but par simpl 1
+but pr 1
+but pr ed 1
+but ren 1
+but ren le 1
+but suiv 1
+but sur 1
+but sur la 1
+but1 1
+but2 1
+butler 3
+butler lampson 1
+butter 1
+butter ie 1
+butterf 1
+butterf cub 1
+butterf cub basel 1
+buttner 1
+buttner and simon 1
+button 7
+button and screen 1
+button and slider 1
+button gener 1
+button is inv 1
+button purp 1
+button wa pr 1
+button when oper 1
+button which allow 1
+buyd 1
+buz 1
+bw 2
+bw ar tun 1
+bw gener 1
+bw gener impl 1
+bw reflect 1
+bw valu 1
+bw106 1
+bw90 1
+bx 1
+bx 2ayy 1
+bx byac 1
+bx byac a2yb2x 1
+bx1c 1
+bxc 1
+bxec 1
+bxec y bf 1
+bxx 1
+bxx ayy2 1
+bxx ayy2 byy 1
+by 23
+by agr 1
+by and clamp 1
+by and ts 1
+by ar alloc 1
+by ar assum 1
+by as suggest 2
+by behavior 1
+by boyer 1
+by ca 1
+by character 2
+by character se 1
+by cod 1
+by denot 1
+by denot overhead 1
+by flit 1
+by gener 1
+by is repr 1
+by link 1
+by link bandwidth 1
+by me 1
+by ms 1
+by ms scal 1
+by msec 1
+by msg 1
+by multipl 1
+by multipl channel 1
+by network 1
+by network transm 1
+by of dat 1
+by of memor 1
+by pag 1
+by pag bus 1
+by pag siz 1
+by per sec 1
+by per year 1
+by siml 1
+by string 1
+by to cop 1
+by to form 1
+by to reflect 1
+by transfer 1
+by transm 1
+by transm del 1
+by2 1
+byac 1
+byac 2a2xayx 1
+byac 2a2xayx 2ac2yy 1
+byac a2yb2x 1
+byimplicit 1
+byimplicit invok 1
+bylander 1
+bylander et al 1
+byp 5
+byp claus 1
+byp edg 1
+byp st 1
+byp st queu 1
+byp their log 1
+bypack 1
+bypack server 1
+byproduc 1
+byproduc of evalu 1
+bytecod 1
+bytecod compiler1 1
+bytextur 1
+bytextur using 1
+bytextur using brodatz 1
+byy 1
+byy c wh 1
+bz 1
+c.1 1
+c.12 1
+c.12 we implem 1
+c.a 1
+c.a.r 2
+c.b 1
+c.b jon 1
+c.beierl 1
+c.c 2
+c.c.j 1
+c.d 2
+c.f 3
+c.fr 1
+c.fr val 1
+c.fr val probabil 1
+c.g 1
+c.h 3
+c.h.papadimitriou 1
+c.j 1
+c.j.h 1
+c.j.p 1
+c.k 1
+c.l 3
+c.m 1
+c.n 2
+c.p 1
+c.r 1
+c.s 3
+c.w 3
+c.y 2
+c0 14
+c0 and thus 1
+c0 de 1
+c0 denot 1
+c0 init0 1
+c0 init0 rest0 1
+c0 pa 1
+c0 termin 1
+c0 th nod 1
+c0 visit 1
+c0 vy 1
+c00 1
+c00 by replac 1
+c00 ha fl 1
+c00 of c0 1
+c0057 1
+c00j 1
+c00j result 1
+c00z00 1
+c01 1
+c01 c02 1
+c01 c02 c1 1
+c01 et c02 1
+c02 1
+c02 c1 1
+c02 c1 c2 1
+c02 sont 1
+c02 sont deux 1
+c0tk 1
+c0z0 1
+c1 18
+c1 a1b1 1
+c1 a1b1 a2b3 1
+c1 and c2 1
+c1 and hi 1
+c1 appear 1
+c1 ar satisf 1
+c1 b1 1
+c1 c2 3
+c1 c2 c01 1
+c1 c2 c3 1
+c1 c3 1
+c1 est 1
+c1 est alor 1
+c1 et c2 2
+c1 fc1ij 1
+c1 imp 1
+c1 imp constraint 1
+c1 impl 1
+c1 impl h1 1
+c1 init0 1
+c1 init0 rest0 1
+c1 is contain 1
+c1 ne 1
+c1 ne devrait 1
+c1 nt 1
+c1 retr 1
+c1 retr c2 1
+c1 suiv 1
+c1 suiv lop 1
+c1 trust 1
+c1 trust c3 1
+c11 1
+c11 2l1 1
+c11 d est 1
+c11 est 1
+c11 et c12 1
+c11 impair 1
+c11i1 1
+c12 1
+c12 2l2 1
+c12 c11 1
+c12 en 1
+c12 en pu 1
+c12 est 1
+c12 est pair 1
+c12n 1
+c12n c11 1
+c1a 1
+c1a alor 1
+c1a alor qu 1
+c1c 1
+c1c2 1
+c1di1 1
+c1du1 1
+c1i 1
+c1i c1 1
+c1i c2 1
+c1i c2j 1
+c1i c2j i0 1
+c1i i0 1
+c1i i0 nt 1
+c1i1 1
+c1s 1
+c2 15
+c2 a1b2 1
+c2 a1b2 a2b4 1
+c2 and c3 1
+c2 and mgu 1
+c2 arg 1
+c2 b2 1
+c2 c01 1
+c2 c01 c02 1
+c2 c3 1
+c2 deux 1
+c2 deux individus 1
+c2 e bi0 1
+c2 er 1
+c2 er mac 1
+c2 est 2
+c2 est modif 1
+c2 est positif 1
+c2 fc2ij 1
+c2 init0 1
+c2 init0 init1 1
+c2 kd 1
+c2 le 1
+c2 le born 1
+c2 ne 1
+c2 ne serait 1
+c2 soient 1
+c2 soient non 1
+c2 th se 1
+c2 trust 1
+c2 trust c3 1
+c2 with respect 1
+c2a 1
+c2a alloc 1
+c2a alloc cod 1
+c2a c1 1
+c2a concat 1
+c2a instruc 1
+c2c 3
+c2c ac 1
+c2du1 1
+c2i 1
+c2j 1
+c2j i0 1
+c2j i0 nt 1
+c2n 1
+c2n 2ss2 1
+c2p 1
+c2p dim 1
+c2ss2 1
+c3 7
+c3 a3b1 1
+c3 a3b1 a4b3 1
+c3 c5 1
+c3 captur 1
+c3 iff 1
+c3 iff c1 1
+c3 init0 1
+c3 init0 init1 1
+c3 seq 1
+c3 seq cst 1
+c3 seq stc 1
+c32 1
+c3a 1
+c3a instruc 1
+c3c 1
+c4 3
+c4 a3b2 1
+c4 a3b2 a4b4 1
+c4c 1
+c5 2
+c5 c7 1
+c5c 1
+c6 1
+c64 1
+c7 1
+c7 c9 1
+c8 1
+c9 1
+ca 123
+ca 1d 2
+ca 1d internet 2
+ca 2b 2
+ca 2c 1
+ca 9l0 1
+ca a bal 1
+ca a lieu 1
+ca a map 1
+ca a observer 1
+ca a partir 1
+ca a partitionner 1
+ca a rol 1
+ca a st 1
+ca a triv 1
+ca a un 1
+ca a1 1
+ca a1 ca 1
+ca a2 1
+ca a2 giv 1
+ca a2 tupl 1
+ca ab 1
+ca adapt 1
+ca adapt prompt 1
+ca al cover 1
+ca an 7
+ca an accord 1
+ca an error 1
+ca an except 1
+ca an requir 1
+ca and worst 1
+ca appl 1
+ca approxim 1
+ca approxim bound 1
+ca ar ad 1
+ca ar determin 1
+ca ar list 1
+ca ar shown 1
+ca ar straightfor 1
+ca assum 1
+ca auquel 1
+ca auquel nous 1
+ca ba 1
+ca ba plan 1
+ca ba reason 1
+ca becaus request 1
+ca behavior 1
+ca block 1
+ca block tim 1
+ca both u0 1
+ca bound 1
+ca but spac 1
+ca by chang 1
+ca by contradict 1
+ca by shar 1
+ca can flaw 1
+ca cannot occur 1
+ca caus 1
+ca caus contradict 1
+ca cc 1
+ca cc num 1
+ca ce 1
+ca chang 1
+ca channel 1
+ca channel width 1
+ca character 1
+ca cheaper 1
+ca classiqu 1
+ca classiqu nous 1
+ca cluster 1
+ca cluster technolog 1
+ca com 1
+ca com dan 1
+ca complec 1
+ca complec dun 1
+ca conduit 1
+ca connect 1
+ca connect pattern 1
+ca consider 2
+ca contrair 3
+ca correspon 4
+ca correspon au 1
+ca correspon aux 1
+ca cost 1
+ca cost proport 1
+ca d 2nconf 1
+ca d echec 1
+ca d etermin 1
+ca dacc 1
+ca dacc es 1
+ca dan 2
+ca dan la 1
+ca dan le 1
+ca dan un 1
+ca dautr 1
+ca dautr interpr 1
+ca de 4
+ca de acc 1
+ca de appl 1
+ca de boucl 1
+ca de cach 1
+ca de ce 1
+ca de cod 1
+ca de colon 1
+ca de commun 1
+ca de conflit 1
+ca de construc 1
+ca de coupur 1
+ca de cr 1
+ca de deux 2
+ca de domain 1
+ca de environ 1
+ca de faux 1
+ca de figur 1
+ca de fit 1
+ca de fs 1
+ca de imag 1
+ca de koan 1
+ca de la 2
+ca de lan 1
+ca de lestampil 1
+ca de lexempl 1
+ca de limager 1
+ca de mach 1
+ca de matr 1
+ca de mi 1
+ca de modl 1
+ca de mvp 1
+ca de nid 1
+ca de nimport 1
+ca de notr 1
+ca de partit 1
+ca de plusieur 1
+ca de pp 1
+ca de primitiv 1
+ca de probl 1
+ca de retour 1
+ca de s1 1
+ca de s2 1
+ca de scalair 1
+ca de sel 1
+ca de succ 1
+ca de syst 1
+ca de typ 1
+ca de vecteur 2
+ca deal 1
+ca deg 1
+ca del 1
+ca del behavior 1
+ca del seen 1
+ca dep 1
+ca derreur 1
+ca deux 1
+ca deux partit 1
+ca disc 1
+ca dobj 1
+ca dobj complec 1
+ca doiv 1
+ca doiv etr 1
+ca driv 1
+ca driv approach 1
+ca du 3
+ca du cod 1
+ca du coroutin 1
+ca du lem 1
+ca du nid 1
+ca du produit 1
+ca du program 2
+ca du th 1
+ca du tr 1
+ca duceus 1
+ca duceus system 1
+ca dun 4
+ca dun acc 1
+ca dun agenc 1
+ca dun appel 1
+ca dun architectur 1
+ca dun bloc 1
+ca dun boucl 1
+ca dun claus 1
+ca dun compil 1
+ca dun conflit 1
+ca dun const 1
+ca dun construc 1
+ca dun coupur 1
+ca dun dist 1
+ca dun etat 1
+ca dun fa 1
+ca dun fonct 1
+ca dun gest 1
+ca dun imag 1
+ca dun ind 1
+ca dun instruc 1
+ca dun list 1
+ca dun mach 1
+ca dun mi 1
+ca dun mvp 1
+ca dun nouvel 1
+ca dun op 1
+ca dun partit 1
+ca dun pil 1
+ca dun repr 1
+ca dun retour 1
+ca dun sel 1
+ca dun simpl 1
+ca dun structur 1
+ca dun tableau 1
+ca dun term 1
+ca dun unif 1
+ca dun var 1
+ca e 0r 1
+ca e par 1
+ca each black 1
+ca edg 1
+ca el 1
+ca el ementair 1
+ca eliminer 1
+ca en 2
+ca en distribu 1
+ca en examin 1
+ca en pratiqu 1
+ca en som 1
+ca epineux 1
+ca equ 1
+ca equ system 1
+ca est 2
+ca est dappl 1
+ca est tr 1
+ca est triv 1
+ca et de 2
+ca et la 1
+ca et le 1
+ca etant 1
+ca etant tr 1
+ca etr 1
+ca etr egaux 1
+ca etud 1
+ca etud es 1
+ca ev 1
+ca ev connect 1
+ca ev cr 1
+ca ev del 1
+ca ev disconnect 1
+ca ev re 1
+ca ev rec 1
+ca ev spf 1
+ca ev start 1
+ca ev stop 1
+ca evoqu 1
+ca execut 1
+ca execut tim 1
+ca exploit 1
+ca expon 1
+ca expon tim 1
+ca favor 1
+ca favor de 1
+ca follow 1
+ca for argu 1
+ca for ca 1
+ca for com. 1
+ca for combin 1
+ca for docum 1
+ca for error 1
+ca for metaterm 1
+ca for multipl 1
+ca for multiproc 1
+ca for network 1
+ca for pr 1
+ca for predefin 1
+ca for redund 1
+ca for superv 1
+ca for text 1
+ca for tupl 1
+ca for using 1
+ca for vid 1
+ca from intersect 1
+ca g en 2
+ca gener 1
+ca hap 1
+ca high 1
+ca high level 1
+ca hold 1
+ca however specif 1
+ca i disc 1
+ca ic 1
+ca ic pour 1
+ca id eal 1
+ca if rev 1
+ca ii 1
+ca ik 1
+ca in construc 1
+ca in fe 1
+ca in fram 1
+ca in nl 1
+ca in observabl 1
+ca in sect 1
+ca ind 1
+ca init 1
+ca instruc 1
+ca involut 2
+ca involut overload 1
+ca is ad 1
+ca is bound 1
+ca is depict 1
+ca is distingu 1
+ca is giv 1
+ca is guaranteed 1
+ca is ignor 1
+ca is illustr 1
+ca is im 1
+ca is insignif 1
+ca is np 1
+ca is observ 1
+ca is remov 1
+ca is signif 1
+ca is simil 1
+ca is symmeter 1
+ca is term 1
+ca is tract 1
+ca it behav 1
+ca it execut 1
+ca it fail 1
+ca it reduc 1
+ca it switch 1
+ca j j0 1
+ca jun 1
+ca k tvar 1
+ca k tvar0 1
+ca la 3
+ca la gest 1
+ca la na 1
+ca la pair 1
+ca le 1
+ca le calcl 1
+ca le dur 1
+ca le gestionnair 1
+ca le moin 1
+ca le nombr 1
+ca le pir 1
+ca le propr 1
+ca le techniqu 1
+ca le vecteur 1
+ca letter 2
+ca libr 1
+ca lim 1
+ca list 1
+ca lor 1
+ca lor de 1
+ca lorsquon 1
+ca lorsquon cherch 1
+ca lower 1
+ca lower bound 1
+ca lrc 1
+ca lrc perform 1
+ca lu 1
+ca lu fournir 1
+ca mark 1
+ca mean 1
+ca ment 2
+ca n0 1
+ca narrow 1
+ca narrow tak 1
+ca no problem 1
+ca non 2
+ca non ent.nous 1
+ca non unimodulair 1
+ca number 2
+ca occur 4
+ca oe 1
+ca of 2d 2
+ca of backtrack 1
+ca of bigger 1
+ca of boolean 1
+ca of cerror 1
+ca of cg 1
+ca of chunk 1
+ca of cl 1
+ca of commun 1
+ca of control 1
+ca of corrobor 1
+ca of datalog 1
+ca of deadlock 1
+ca of definit 1
+ca of deriv 1
+ca of discr 1
+ca of docum 1
+ca of drop 1
+ca of drug 1
+ca of dsm 2
+ca of ec2 1
+ca of error 1
+ca of exact 1
+ca of ext 1
+ca of failur 3
+ca of fal 1
+ca of fic 1
+ca of fig 1
+ca of finit 1
+ca of fl 1
+ca of funct 1
+ca of graph 1
+ca of heredit 1
+ca of im 1
+ca of inc 1
+ca of infinit 1
+ca of intersect 1
+ca of level 1
+ca of lin 1
+ca of list 1
+ca of lo 1
+ca of lock 1
+ca of log 1
+ca of minim 2
+ca of multilevel 1
+ca of multipl 1
+ca of network 1
+ca of non 1
+ca of oper 1
+ca of permut 1
+ca of point 1
+ca of pot 1
+ca of prob 1
+ca of progr 1
+ca of prolog 1
+ca of proposit 1
+ca of rectangl 1
+ca of recur 1
+ca of refer 1
+ca of resolut 1
+ca of segm 1
+ca of select 1
+ca of serv 1
+ca of server 1
+ca of sharp 1
+ca of sort 1
+ca of spac 1
+ca of succ 1
+ca of symmeter 1
+ca of templ 1
+ca of tempor 1
+ca of theorem 1
+ca of triangl 1
+ca of undetect 1
+ca of ver 1
+ca of vot 1
+ca of wi 1
+ca oft seen 1
+ca on na 1
+ca on ne 1
+ca on peut 1
+ca on random 1
+ca on sait 1
+ca onl direct 1
+ca or problem 1
+ca osm 1
+ca ou 1
+ca ou un 1
+ca overlap 1
+ca p0 1
+ca p0 p1 1
+ca par 2
+ca par exempl 1
+ca par la 1
+ca par lutil 1
+ca particl 3
+ca particl appar 1
+ca particl com 1
+ca particl de 3
+ca particl du 1
+ca particl dun 1
+ca particl sont 1
+ca perform 4
+ca perform bad 1
+ca perform guar 1
+ca perm 1
+ca perm exampl 1
+ca peut 1
+ca peut facil 1
+ca pj 1
+ca pm 1
+ca pm sa 1
+ca po 1
+ca po edant 1
+ca possibl 1
+ca possibl lorsqu 1
+ca pour 2
+ca pour de 1
+ca pour la 1
+ca pour le 1
+ca pr 1
+ca pr ec 1
+ca probl 1
+ca probl ematiqu 1
+ca proceed 1
+ca qu 1
+ca qu nous 1
+ca qu peuv 1
+ca quand 1
+ca quand lunif 1
+ca r ab 1
+ca r ap 1
+ca r arrow 1
+ca r promot 1
+ca r refl 1
+ca r top 1
+ca r1 1
+ca rationnel 1
+ca reach 1
+ca real mach 1
+ca rec 1
+ca requir 1
+ca respon 1
+ca respon tim 1
+ca rest 1
+ca result 1
+ca rig 1
+ca rr 1
+ca rr ca 1
+ca rr rw 1
+ca run 1
+ca run tim 1
+ca rw 1
+ca rw ca 1
+ca say 1
+ca scenar 3
+ca se 2
+ca se disc 1
+ca se pr 1
+ca sel 1
+ca select 1
+ca select method 1
+ca sever heur 1
+ca sever proc 1
+ca shown 2
+ca si 1
+ca si le 1
+ca signif 1
+ca signif gener 1
+ca sil 1
+ca sil ny 1
+ca simpl 2
+ca sinc cluster 2
+ca situ 1
+ca situ wh 1
+ca slight 1
+ca slight problem 1
+ca solut 1
+ca sont 1
+ca sont bien 1
+ca sont le 1
+ca sort 1
+ca sort donc 1
+ca standard 1
+ca standard ssm 1
+ca stat 1
+ca stud 15
+ca stud ba 1
+ca stud concern 1
+ca stud using 1
+ca stud1 1
+ca suiv 1
+ca suiv le 1
+ca sur 1
+ca sur la 1
+ca th algorithm 1
+ca th backjump 1
+ca th collap 1
+ca th comparison 1
+ca th context 1
+ca th dim 1
+ca th distribut 1
+ca th edg 1
+ca th fact 1
+ca th gu 1
+ca th interfer 1
+ca th junior 1
+ca th mop 1
+ca th object 1
+ca th oper 1
+ca th posit 1
+ca th program 1
+ca th reject 1
+ca th request 1
+ca th result 1
+ca th se 1
+ca th sequ 1
+ca th shift 1
+ca th siftdown 1
+ca th sourc 1
+ca th spat 1
+ca th substitut 1
+ca th succ 1
+ca th suggest 1
+ca th system 2
+ca th trac 1
+ca th valu 1
+ca that blog 1
+ca that fal 1
+ca that l0 1
+ca that mlkp 1
+ca that old 1
+ca that overlap 1
+ca that p1 1
+ca that sa 1
+ca that uj 1
+ca ther ec 1
+ca tim 2
+ca tim quadr 1
+ca to compar 1
+ca to consider 5
+ca to reflect 1
+ca to se 1
+ca tool 1
+ca trait 1
+ca trait ee 1
+ca treat 1
+ca typiqu 1
+ca typiqu de 1
+ca un 2
+ca un an 1
+ca un migr 1
+ca un non 1
+ca un partit 1
+ca us 2
+ca us cal 1
+ca vectoriel 1
+ca wa measur 1
+ca we ad 1
+ca we built 1
+ca we conclus 1
+ca we consider 1
+ca we def 1
+ca we enter 1
+ca we establ 1
+ca we show 1
+ca we us 2
+ca wer describ 1
+ca western 1
+ca western reserv 1
+ca wh 28
+ca wh an 1
+ca wh benchmark 1
+ca wh clock 1
+ca wh connect 1
+ca wh control 1
+ca wh fo 1
+ca wh imag 1
+ca wh l0 1
+ca wh optim 1
+ca wh probabil 1
+ca wh rel 2
+ca wh se 1
+ca when deg 1
+ca when me 1
+ca when nod 1
+ca when oe 1
+ca when u1i 1
+ca wil partit 1
+ca wil var 1
+ca with cluster 1
+ca with combin 1
+ca with conflict 1
+ca with loc 1
+ca with metaterm 1
+ca without constraint 1
+ca wr 1
+ca wr ca 1
+ca ww 1
+ca yield 1
+ca.17 1
+ca.17 consider 1
+ca.txt 1
+ca1 1
+ca1 jmpleq 1
+ca1 programstart 1
+ca2 1
+ca2 endselfmod 1
+ca2 pc1 1
+ca3 1
+ca3 ad 1
+ca3 jmpeq 1
+ca92 1
+cabel 1
+cabil 3
+cabil de 1
+cabinet 3
+cabinet siz 2
+cabinet siz etc 2
+cabl 2
+cabl connect 2
+cac 1
+cac produc 1
+cac produc compan 1
+cach 20
+cach a sub 1
+cach acc 1
+cach acc stag 1
+cach acc tak 1
+cach addr 1
+cach addr stag 1
+cach adjac 1
+cach affin 2
+cach affin inform 1
+cach al support 1
+cach and arbitr 1
+cach and bus 1
+cach and direct 1
+cach and loc 1
+cach and memor 1
+cach and microcod 1
+cach and reus 1
+cach and therefor 1
+cach and uniform 1
+cach approach 1
+cach ar identif 1
+cach ar inv 1
+cach ar loc 1
+cach architectur 1
+cach augm 1
+cach av 1
+cach av bad 1
+cach behavior 1
+cach behaviour 1
+cach behaviour du 1
+cach both cach 1
+cach cach 1
+cach cach p1 1
+cach can work 1
+cach ch 1
+cach ch point 1
+cach cod 1
+cach coh 5
+cach coh algorithm 1
+cach coh hardwar 1
+cach coh log 2
+cach coh mechan 1
+cach coh method 1
+cach coh network 2
+cach coh num 1
+cach coh problem 1
+cach coh protocol 1
+cach coh schem 1
+cach coh softwar 1
+cach coh solut 1
+cach con 1
+cach con model 1
+cach con schem 1
+cach contain 2
+cach controller 1
+cach controller list 1
+cach cop 1
+cach de 2
+cach de cod 1
+cach de diff 1
+cach de don 1
+cach dern 1
+cach design 1
+cach design consider 1
+cach du 1
+cach du fait 1
+cach du processeur 1
+cach e dan 1
+cach ee 1
+cach ee au 1
+cach ee dan 1
+cach entr 1
+cach entr assoc 1
+cach environm 1
+cach environm fram 1
+cach es 1
+cach es sous 1
+cach est 1
+cach est suff 1
+cach et doptim 1
+cach etant 1
+cach etant adr 1
+cach etant en 1
+cach flush 1
+cach for lisp 1
+cach for reus 1
+cach for virtu 1
+cach hardwar 2
+cach hierarch 1
+cach hit 1
+cach hit reduc 1
+cach implem 1
+cach incoh 1
+cach input 1
+cach instead 1
+cach int sect 1
+cach interfer 1
+cach interfer phenom 1
+cach inv 2
+cach inv du 1
+cach inv instruc 1
+cach inv mechan 1
+cach inv overhead 1
+cach inv pattern 1
+cach inv traff 1
+cach is cop 1
+cach is divid 1
+cach is log 1
+cach it loc 1
+cach lin 5
+cach lin acc 1
+cach lin belong 1
+cach lin fil 1
+cach lin inv 1
+cach lin level 1
+cach lin read 1
+cach lin remot 1
+cach lin select 1
+cach lin siz 1
+cach lin vol 1
+cach load 1
+cach locaux 1
+cach locaux afin 1
+cach manag 4
+cach memor 2
+cach mi 4
+cach mi occur 1
+cach mi rat 2
+cach model 2
+cach multiproc 1
+cach of shar 1
+cach on cherch 1
+cach onl memor 3
+cach ou 1
+cach ou de 1
+cach p1 1
+cach p1 p2 1
+cach perform 1
+cach perform an 1
+cach protocol 1
+cach protocol rel 1
+cach record 1
+cach result 1
+cach schem 1
+cach sect 1
+cach sect actu 1
+cach shar 1
+cach shar dat 1
+cach shar variabl 1
+cach si 1
+cach si il 1
+cach siz 2
+cach sont 1
+cach sont la 1
+cach strateg 1
+cach system 1
+cach tag 1
+cach th record 1
+cach th server 1
+cach timesl 1
+cach virtu 1
+cach virtu addr 1
+cach which support 1
+cach wil contain 1
+cach writ 1
+cach writ through 1
+cachemmucpu 1
+cachemmucpu bus 1
+cachemmucpu bus memor 1
+cachemmucpu cachemmucpu 1
+cachemmucpu cachemmucpu bus 1
+cacheoff 1
+cacheoff from ucoderasrd 1
+cacl 1
+cacl par 1
+cacl par el 1
+cacm 3
+cad 6
+cad and parallel 1
+cad appl 1
+cad cam 1
+cad cam appl 1
+cad conver 1
+cad system 1
+cad system ii 1
+caddr 1
+caddr t argum 1
+caddr t ls 1
+caddr t spf 1
+cadiou 1
+cadr 4
+cadr algorithmiqu 1
+cadr d etud 1
+cadr de 4
+cadr de ce 1
+cadr de common 1
+cadr de la 4
+cadr de lang 1
+cadr de mach 1
+cadr de no 1
+cadr de notr 1
+cadr de transform 1
+cadr dhpf 1
+cadr dhpf par 1
+cadr du 2
+cadr du cod 1
+cadr du proj 1
+cadr du syst 1
+cadr dun 2
+cadr dun architectur 1
+cadr dun boucl 1
+cadr dun etiqu 1
+cadr dun mvp 1
+cadr dun organ 1
+cadr dun prim 1
+cadr g en 1
+cadr parfait 1
+cadr parfait dappl 1
+cadr pr 1
+cadr st 1
+cadr trop 1
+cadr trop favor 1
+caduceus 1
+cael 1
+caf 1
+caf and felt 1
+cah 1
+cah de 1
+cah de math 1
+cailliau 1
+cailliez 1
+cain 2
+cain pa 1
+cal 80
+cal a bridg 1
+cal a broadcast 1
+cal a cal 1
+cal a common 1
+cal a correct 1
+cal a flush 1
+cal a group 1
+cal a match 1
+cal a method 1
+cal a nl 1
+cal a nod 1
+cal a non 1
+cal a pair 1
+cal a polymorph 1
+cal a priv 1
+cal a rout 1
+cal a se 1
+cal a transact 1
+cal a0 1
+cal accept 1
+cal accept method 1
+cal adr 1
+cal ai 1
+cal algebr 1
+cal alloc 1
+cal almon 1
+cal almon tr 1
+cal an algorithm 1
+cal an inherit 1
+cal and actu 1
+cal and denot 1
+cal and exit 1
+cal and explicit 1
+cal and po 1
+cal and sel 1
+cal and select 1
+cal ar car 1
+cal ar eff 1
+cal ar indep 1
+cal ar mad 1
+cal ar perform 1
+cal as follow 1
+cal atmost 1
+cal b nod 1
+cal ba 1
+cal back structur 1
+cal block 1
+cal bof 1
+cal bound 1
+cal by valu 2
+cal c nod 1
+cal cal 1
+cal centr 1
+cal compar 1
+cal compar2 1
+cal compat 1
+cal compat supercl 1
+cal comput 1
+cal comput method 1
+cal concur 1
+cal concur prolog 1
+cal context 1
+cal context parallel 1
+cal continu 2
+cal continu feed 1
+cal cost 1
+cal cost tok 1
+cal counter 1
+cal cycl 1
+cal cycl solver 1
+cal dejavu1 1
+cal devr 1
+cal devr plut 1
+cal dm 2
+cal dm io 1
+cal ei 1
+cal el 1
+cal el decrem 1
+cal ensur 1
+cal ensur slot 1
+cal environm 1
+cal equiv 1
+cal et execut 1
+cal ev 1
+cal ev nod 1
+cal event 1
+cal execut 1
+cal exterior 1
+cal exterior edg 1
+cal fast 1
+cal fc 1
+cal first adapt 1
+cal first adr 1
+cal for 1
+cal for adv 1
+cal for analyst 1
+cal for car 1
+cal for parallel 1
+cal for prop 1
+cal for spec 1
+cal for system 1
+cal for user 1
+cal fork 1
+cal funct 1
+cal gcsp 1
+cal gener 2
+cal gener counterpart 1
+cal gener na 1
+cal glob 1
+cal glob stack 1
+cal hierarch 1
+cal in ap 1
+cal in ls 1
+cal in order 1
+cal in symbol 1
+cal inform 1
+cal init 1
+cal instruc 1
+cal interfac 1
+cal interior 1
+cal interior ver 1
+cal intern 1
+cal intern voron 1
+cal is execut 1
+cal is mad 2
+cal it environm 1
+cal it intern 1
+cal it key 1
+cal it ni0 1
+cal it p0 1
+cal it pot 1
+cal k1 1
+cal last adr 1
+cal last co 1
+cal last qu 1
+cal last standard 1
+cal level 1
+cal level list 1
+cal loc 1
+cal lock 1
+cal log 1
+cal log program 1
+cal mad 1
+cal mak 2
+cal mak edg 1
+cal method 1
+cal method method 1
+cal ml 1
+cal modif 1
+cal modif gram 1
+cal msld 1
+cal msld resolut 1
+cal next method 1
+cal nextloc 1
+cal nod 1
+cal number 1
+cal of check 1
+cal of deletemin 1
+cal of inser 1
+cal of mp 1
+cal of non 1
+cal of op 1
+cal of typ 1
+cal on person 1
+cal optim 2
+cal or differ 1
+cal or dispatch 1
+cal or exit 1
+cal or schedl 1
+cal ou 1
+cal ou execut 1
+cal overhead 1
+cal pattern 2
+cal per occam 1
+cal pg 1
+cal ph 1
+cal plac 1
+cal pr 1
+cal pr ec 1
+cal proc adr 1
+cal procedur 1
+cal procedur bar 1
+cal push 1
+cal rat 1
+cal rat proport 1
+cal rel 1
+cal remain 1
+cal return 2
+cal return mechan 1
+cal rk 1
+cal rl 1
+cal rl attribut 1
+cal rout 2
+cal select 1
+cal select ap 1
+cal select eval 1
+cal selecttest2 1
+cal sign 1
+cal sign continu 1
+cal sit 2
+cal stack 1
+cal structur 2
+cal structur induc 1
+cal sub 1
+cal such dev 1
+cal such inter 1
+cal such protocol 1
+cal such test 1
+cal svm 1
+cal svm dispatch 1
+cal syntac 1
+cal th 2for 1
+cal th act 1
+cal th algorithm 1
+cal th commun 1
+cal th const 1
+cal th continu 1
+cal th default 1
+cal th direct 1
+cal th dog 1
+cal th dynam 1
+cal th effect 1
+cal th el 1
+cal th featur 1
+cal th flush 1
+cal th forml 1
+cal th funct 2
+cal th ge 1
+cal th gener 1
+cal th heaviest 1
+cal th knowledg 1
+cal th me 1
+cal th measur 1
+cal th member 1
+cal th memor 1
+cal th method 1
+cal th nlogn 1
+cal th number 1
+cal th omnisc 1
+cal th oper 1
+cal th par 1
+cal th problem 1
+cal th proper 1
+cal th rectangl 1
+cal th result 1
+cal th resum 1
+cal th root 1
+cal th search 1
+cal th serv 1
+cal th st 1
+cal th strateg 1
+cal th supermethod 1
+cal th superobject 1
+cal th switch 1
+cal th typ 1
+cal th valu 1
+cal th ver 1
+cal them procedur 1
+cal them ri 1
+cal them sourc 1
+cal thread 1
+cal thread exclus 1
+cal thread valu 1
+cal to assign 1
+cal to compar 1
+cal to compar2 1
+cal to defstruc 1
+cal to deletemin 1
+cal to dispatch 1
+cal to dm 1
+cal to equiv 1
+cal to f3 1
+cal to fib 1
+cal to fo 1
+cal to funct 1
+cal to init 1
+cal to inser 1
+cal to mak 1
+cal to ph 1
+cal to pm 1
+cal to procedur 1
+cal to prun 1
+cal to pvm 1
+cal to random 1
+cal to retrief 1
+cal to selecttest2 1
+cal to sign 1
+cal to st 1
+cal to svm 1
+cal to thread 1
+cal to writ 1
+cal tw vect 1
+cal tx 1
+cal tx cl 1
+cal valu 1
+cal valu differ 1
+cal vi 1
+cal wa fin 1
+cal wa mad 1
+cal when cal 1
+cal which return 1
+cal wilson 1
+cal with simpl 1
+calcavg 1
+calcl 54
+calcl a effectuer 1
+calcl a lec 1
+calcl a scheduler 1
+calcl a weight 1
+calcl accord 3
+calcl addr 1
+calcl addr calcl 1
+calcl afin 2
+calcl afin dassurer 1
+calcl afin de 1
+calcl alg 1
+calcl alg ebriqu 1
+calcl alread ec 1
+calcl an approxim 1
+calcl and dec 1
+calcl anticip 1
+calcl ar perform 1
+calcl arithm 1
+calcl arithm etiqu 1
+calcl augm 1
+calcl aver 1
+calcl aver number 1
+calcl bien 1
+calcl bien complec 1
+calcl bound 2
+calcl by appl 3
+calcl by appropr 1
+calcl by estim 1
+calcl by perform 1
+calcl by pol 1
+calcl can involut 1
+calcl chang 1
+calcl claus 1
+calcl claus par 1
+calcl column 1
+calcl column sampl 1
+calcl comp 1
+calcl comp ee 1
+calcl compon 1
+calcl compon nod 1
+calcl compr 1
+calcl compr un 1
+calcl cost 1
+calcl de 3
+calcl de born 1
+calcl de congru 1
+calcl de diff 1
+calcl de faux 1
+calcl de form 1
+calcl de la 1
+calcl de laffect 1
+calcl de lanciennet 1
+calcl de nouveaux 1
+calcl de ntot 1
+calcl de ordinateur 1
+calcl de pav 1
+calcl de perm 1
+calcl de point 1
+calcl de pouv 1
+calcl de ppcm 1
+calcl de robust 1
+calcl degr 1
+calcl dev 1
+calcl du 3
+calcl du co 1
+calcl du fon 1
+calcl du nombr 2
+calcl du nouveau 1
+calcl du pa 1
+calcl du point 1
+calcl du som 1
+calcl duj 1
+calcl dun 1
+calcl dun mach 1
+calcl dun millisecon 1
+calcl dwjk 1
+calcl e au 1
+calcl e claus 1
+calcl e de 1
+calcl e en 1
+calcl e la 1
+calcl e le 1
+calcl e pr 1
+calcl ee 2
+calcl ee dynamiqu 1
+calcl ee par 1
+calcl ee statiqu 1
+calcl es 2
+calcl es un 1
+calcl est 4
+calcl est ba 1
+calcl est effectu 2
+calcl est fic 1
+calcl et de 2
+calcl et en 1
+calcl et influencer 1
+calcl et la 1
+calcl expr 1
+calcl gr 1
+calcl gr ac 1
+calcl in finit 1
+calcl inclus 1
+calcl indep 1
+calcl intersect 1
+calcl inutil 1
+calcl it ver 1
+calcl la 2
+calcl la mi 1
+calcl la satisfaisabilit 1
+calcl la substitut 1
+calcl le 3
+calcl le born 1
+calcl le nouveaux 1
+calcl le som 1
+calcl loc 1
+calcl locaux 1
+calcl locaux en 1
+calcl locaux r1 1
+calcl margin 1
+calcl margin den 1
+calcl matriciel 1
+calcl modif 1
+calcl modif le 1
+calcl n ecessair 1
+calcl nest 1
+calcl nest pa 1
+calcl next broadcast 1
+calcl non 1
+calcl non tr 1
+calcl num 1
+calcl num eriqu 1
+calcl of tempor 1
+calcl on pair 1
+calcl onl approxim 1
+calcl outl 1
+calcl outl rel 1
+calcl par 2
+calcl par el 2
+calcl perm 1
+calcl peut 1
+calcl peut sengager 1
+calcl ph 1
+calcl ph comput 1
+calcl pouv 1
+calcl pouv etr 1
+calcl pr 1
+calcl pr ec 1
+calcl precondit 1
+calcl prob 1
+calcl qu 2
+calcl qu serait 1
+calcl qu sup 1
+calcl relatif 1
+calcl repr 1
+calcl rev 1
+calcl risqu 1
+calcl risqu de 1
+calcl risquerait 1
+calcl risquerait de 1
+calcl s elect 1
+calcl seffectueront 1
+calcl sensit 1
+calcl separ 1
+calcl separ margin 1
+calcl sever scatter 1
+calcl sont 2
+calcl sont connu 1
+calcl sont distribu 1
+calcl sp 1
+calcl sp ecif 1
+calcl suiv 1
+calcl sum 1
+calcl sum squar 1
+calcl suppl 1
+calcl suppl mentair 1
+calcl sur 1
+calcl sur le 1
+calcl tb 1
+calcl tc 1
+calcl th aver 2
+calcl th centr 1
+calcl th cost 1
+calcl th electr 1
+calcl th error 1
+calcl th fact 1
+calcl th level 1
+calcl th link 1
+calcl th margin 1
+calcl th mean 1
+calcl th measur 1
+calcl th minim 1
+calcl th number 1
+calcl th order 1
+calcl th prob 1
+calcl th relev 1
+calcl th result 1
+calcl th sal 1
+calcl th sensit 1
+calcl th shortest 1
+calcl th smooth 1
+calcl th stud 1
+calcl th timestamp 1
+calcl th valu 2
+calcl thin 1
+calcl thin lin 1
+calcl tim 1
+calcl tot 1
+calcl tot length 1
+calcl travail 1
+calcl travail sur 1
+calcl un 1
+calcl un matr 1
+calcl unit 1
+calcl using 2
+calcl valu 1
+calcl variationnel 1
+calcl with high 1
+calcl with subtyp 1
+calculatecycl 1
+calculatedj 1
+calculatedj using 1
+calculatedj using dk 1
+calculateur 2
+calculateur multiprocesseur 1
+calculateur par 1
+calculateur par el 1
+calculateur paragon 1
+calculateur paragon de 1
+calculateur simd 1
+calculateur sisd 1
+calculateur vectoriel 1
+calculateur vectoriel du 1
+calculer 5
+calculer de 1
+calculer de born 1
+calculer et ce 1
+calculer f le 1
+calculer gk 1
+calculer la 2
+calculer la nouvel 1
+calculer la probabilit 1
+calculer le 2
+calculer le cardin 1
+calculer le degr 1
+calculer le domain 1
+calculer le nombr 1
+calculer le point 1
+calculer le solut 1
+calculer le som 1
+calculer pr 1
+calculer pr ec 1
+calculer tel 1
+calculer tel qu 1
+calculer tout 1
+calculer tout le 1
+calculon 1
+calculon dan 1
+calculon dan le 1
+calculus 14
+calculus adopt 1
+calculus allow 1
+calculus and algebr 1
+calculus and appl 1
+calculus and datalog 1
+calculus and mccart 1
+calculus and var 1
+calculus ba 1
+calculus constraint 1
+calculus for overload 1
+calculus forml 1
+calculus forml oe 1
+calculus in datab 1
+calculus in pract 1
+calculus is ba 1
+calculus is dec 1
+calculus method 1
+calculus nc 1
+calculus nc logspac 1
+calculus of event 1
+calculus of individu 1
+calculus of object 1
+calculus of refin 1
+calculus of reg 1
+calculus of subtyp 1
+calculus oper 1
+calculus requir 1
+calculus th concept 1
+calculus th project 1
+calculus to yield 1
+calculus underl 1
+calculus wa develop 1
+calculus wa ext 1
+calculus we requir 1
+calculus which ref 1
+calculus with constraint 1
+calculus with den 1
+calculus with equ 1
+calculus with high 1
+calculus with lin 1
+calculus with nonstandard 1
+calculus with se 1
+calculus with sid 1
+calculus4 1
+calendar 2
+calg 1
+calg t2n 1
+calg t2n 1n4 1
+calif 1
+califan 1
+californ 38
+californ at berkel 2
+californ at san 1
+californ at sant 1
+californ berkel 2
+californ count 1
+californ institut 1
+californ irv 1
+californ liv 1
+californ or ca 1
+californ pr 1
+californ san 1
+californ san dieg 1
+calit 1
+calit e de 1
+callahan 1
+caller 6
+caller block 1
+caller of path 1
+caller proc 1
+caller wait 1
+calloverhead 1
+calloverhead communicationm 1
+calloverhead communicationm libr 1
+calm 1
+calm network 1
+calqu 1
+calqu ee 1
+calqu ee sur 1
+calster 1
+cam 5
+cam and cor 1
+cam appl 1
+cam as implem 1
+cam ba 1
+cam but ext 1
+cam by exp 1
+cam cod 1
+cam cod macr 1
+cam ext 1
+cam giv 1
+cam input 1
+cam input valu 1
+cam interpreter 1
+cam is shown 1
+cam is slight 1
+cam is suit 1
+cam manipl 1
+cam manipl graph 1
+cam manipl tr 1
+cam program 1
+cam program program 1
+cam repr 1
+cam sem 1
+cam valu 1
+cam valu domain 1
+cam ver 1
+cam with netsim 1
+cam. 1
+cambridg 29
+cambridg cb3 1
+cambridg cb3 0rd 1
+cambridg chester 1
+cambridg labor 1
+cambridg labor becam 1
+cambridg ma 1
+cambridg research 1
+cambridg research lab 1
+cambridg research labor 1
+cambridg tract 2
+cambridg univ 1
+cambridg univer 1
+cambridg univer pr 13
+camelot 2
+camelot and avalon 1
+camelot exampl 1
+camelot lik log 1
+camelot log 1
+camelot log algorithm 1
+camelot log facil 1
+camelot recov 1
+camelot recov protocol 1
+camer 6
+camer ac 1
+camer ac converg 1
+camer alw point 1
+camer as depict 1
+camer can cover 1
+camer cover 1
+camer figur 1
+camer is loc 1
+camer laser 1
+camer len 1
+camer man 1
+camer man imag 1
+camer model 1
+camer model1 1
+camer mount 1
+camer network 1
+camer or incr 1
+camer plac 1
+camer plan 1
+camer rot 1
+camer using 1
+camer using scan 1
+camer wer plac 1
+cameralaser 1
+cameraman 1
+cameron 1
+cameron jon 1
+caml 1
+caml refer 1
+caml refer manu 1
+camot 1
+camot computer 1
+camot computer aid 1
+campar 1
+campbel 3
+campus 4
+campus box 1
+campus de 1
+campus de beaulieu 1
+campus universitair 1
+campus universitair de 1
+campus wid 1
+campus wid inform 1
+can 4
+can prompt 1
+can prompt combin 1
+canad 20
+canad b0p 1
+canad b0p 1x0 1
+canad comput 1
+canad comput geometer 1
+canad email 1
+canad fac 1
+canad ffl h3a 1
+canad grant 1
+canad grant ogp0041630 1
+canad k1a 2
+canad k1a 0r6 2
+canad k1s 1
+canad k1s 5b6 1
+canad n2l 1
+canad n2l 3g1 1
+canad n6a 1
+canad n6a 5b7 1
+canad nserc 1
+canad nserc research 1
+canad ottaw 1
+canad t6g 1
+canad t6g 2h1 1
+canad tel 1
+canad under grant 1
+canad under research 1
+canber 2
+canber act 2
+canber austr 1
+cancel 12
+cancel and distribut 1
+cancel and perfect 1
+cancel out no 1
+cancel rl 1
+cancel th broadcast 1
+cancer 2
+cancer or tubercl 1
+cancer wi 1
+cancer wi bridg 1
+cand 1
+cand denot 1
+cand in eval 1
+cand is assum 1
+cand is ch 1
+cand le 1
+cand list 1
+cand mod 1
+cand of altern 1
+cand valu 1
+cand would remain 1
+candid 27
+candid ar elig 1
+candid ar non 1
+candid defin 1
+candid defin rl 1
+candid deform 1
+candid en 1
+candid en fonct 1
+candid equ 1
+candid es 1
+candid es ee 1
+candid for estim 1
+candid for execut 1
+candid for implem 1
+candid for intersect 1
+candid for landmark 1
+candid for prompt 1
+candid imag 1
+candid is activ 1
+candid item 1
+candid joint 1
+candid joint transform 1
+candid me 1
+candid me m1 1
+candid me m2 1
+candid me vot 1
+candid nod 1
+candid nont 1
+candid nont pa 1
+candid or fin 1
+candid out 1
+candid polygon 1
+candid rl 1
+candid se 1
+candid se q0 1
+candid sequ 1
+candid solut 1
+candid son 1
+candid st 1
+candid substr 1
+candid thank 1
+candidat 2
+candidat correspon 1
+candidat de 1
+candidat de reductibilit 1
+candidat possibl 1
+candl 1
+candud 1
+candud se 1
+caneghem 1
+canet 1
+canon 11
+canon abstract 1
+canon abstract mach 1
+canon ba 1
+canon contextu 1
+canon contextu unit 1
+canon decomposit 1
+canon form 2
+canon genet 1
+canon genet algorithm 1
+canon ground 1
+canon ground inst 1
+canon in ml 1
+canon inform 1
+canon inform proc 1
+canon inst 2
+canon inst contain 1
+canon inst cz 1
+canon inst henc 1
+canon inst init0 1
+canon inst match 1
+canon mach 1
+canon mach model 1
+canon model 1
+canon model sem 1
+canon restrict 1
+canon slot 1
+canon slot specif 1
+canoniqu 2
+canoniqu de 2
+canoniqu de cl 1
+canoniqu de holland 1
+canoniqu de z2 1
+canoniqu de zn 1
+canoniqu op 1
+canoniqu op erant 1
+canoniqu optim 1
+canoniqu optim un 1
+canoniqu peut 1
+canoniqu peut etr 1
+cant 2
+cant and acor 1
+cant chang 1
+cant system 1
+cant user 1
+cant user report 1
+canterbur 2
+canterbur kent 1
+cantwel 1
+cantwel smith 1
+cap 48
+cap and capabil 1
+cap and conflict 1
+cap and gener 1
+cap and network 1
+cap ar addr 1
+cap at proc 1
+cap avail 1
+cap ba 1
+cap ba protect 1
+cap de 1
+cap de couvrir 1
+cap de garantir 1
+cap de modif 1
+cap de supprimer 1
+cap demonstr 1
+cap determin 1
+cap difficult 1
+cap for propag 1
+cap for shar 1
+cap for support 1
+cap in mip 1
+cap in var 1
+cap must mak 1
+cap nec 1
+cap number 2
+cap of acc 1
+cap of affin 1
+cap of approxim 1
+cap of bdeg 1
+cap of captur 1
+cap of commun 1
+cap of creat 1
+cap of extract 2
+cap of gener 1
+cap of inject 1
+cap of leaf 1
+cap of organ 1
+cap of perform 1
+cap of produc 3
+cap of prop 1
+cap of report 1
+cap of respon 1
+cap of return 1
+cap of rout 1
+cap of run 1
+cap of satisf 1
+cap of simultan 1
+cap of solut 1
+cap of st 1
+cap of support 3
+cap of tak 2
+cap of textur 1
+cap of tn 1
+cap of transfer 1
+cap of unfold 1
+cap of visu 1
+cap or tn 1
+cap qu 1
+cap qu de 1
+cap rl 1
+cap tn 1
+cap to inject 1
+cap to respon 1
+cap unit 1
+cap unit cap 1
+cap upper 1
+cap upper bound 1
+cap workshop 1
+cap3 1
+cap3 to read 1
+capabil 21
+capabil and educ 1
+capabil and funct 1
+capabil ar fl 1
+capabil ar om 1
+capabil ar st 1
+capabil being offer 1
+capabil correspon 1
+capabil for interact 1
+capabil inclus 1
+capabil inclus rel 1
+capabil of climb 1
+capabil of loc 1
+capabil of mach 1
+capabil of mult 1
+capabil of recur 1
+capabil of regr 1
+capabil of sdm 1
+capabil of vi 1
+capabil refer 1
+capabil requir 1
+capabil to compon 1
+capabil to custom 1
+capabl 1
+capabl de 1
+capac 2
+capacit 3
+capacit e dan 1
+capacit e de 1
+capacit es 2
+capacit es de 1
+capacit es dextract 1
+capaz 1
+capaz de 1
+capaz de auxil 1
+capit 8
+capit and minim 1
+capit and minor 1
+capit d ev 1
+capit de 1
+capit de la 1
+capit de pouvoir 1
+capit encor 1
+capit encor dan 1
+capit et commun 1
+capit g en 1
+capit letter 1
+capit pour 2
+capit pour contr 1
+capit upon reus 1
+capload 1
+capolsin 1
+capsl 1
+capt 2
+capt of tabl 1
+captur 33
+captur a rol 1
+captur a sub 1
+captur ain 1
+captur al manner 1
+captur and an 1
+captur at fic 1
+captur board 2
+captur by introduc 1
+captur by rl 1
+captur cl 1
+captur cl relationship 1
+captur differ rol 1
+captur du 1
+captur du point 1
+captur funct 1
+captur imag 1
+captur import oper 1
+captur much rich 1
+captur natur 1
+captur object 2
+captur object dynam 1
+captur object encapsl 1
+captur of datab 1
+captur our system 1
+captur playback 1
+captur playback mechan 1
+captur rol 1
+captur rol relationship 1
+captur rough 1
+captur styl 1
+captur styl attribut 1
+captur th behavior 1
+captur th correct 1
+captur th dynam 1
+captur th effect 1
+captur th exper 1
+captur th fact 1
+captur th featur 1
+captur th form 1
+captur th glob 1
+captur th imag 1
+captur th improv 2
+captur th int 1
+captur th inter 1
+captur th intuit 1
+captur th lec 1
+captur th monot 1
+captur th not 1
+captur th object 1
+captur th reason 1
+captur th relationship 1
+captur th responsibil 1
+captur th rol 1
+captur th rough 1
+captur th simultan 1
+captur th spat 1
+captur th st 1
+captur th transit 1
+captur th visu 1
+captur that fact 1
+captur their common 1
+captur typ 1
+captur typ error 1
+capturer 1
+capturer a lec 1
+capturer ladr 1
+capturer ladr correspon 1
+capturer le 1
+capturer le point 1
+car 77
+car a count 1
+car a design 1
+car a longer 1
+car a smaller 1
+car al inform 1
+car an articl 1
+car an encod 1
+car and cdr 1
+car and cont 1
+car and drivew 1
+car and truck 1
+car attent 1
+car ce 2
+car ce sont 2
+car cest 1
+car ch 3
+car ch quest 1
+car ch sub 1
+car channel 2
+car channel control 2
+car com 2
+car compar 1
+car con 1
+car dan 1
+car dan le 1
+car dat 2
+car decomp 1
+car design 1
+car design mechan 1
+car e de 1
+car ec 1
+car ec import 1
+car ee 1
+car el 1
+car el alourd 1
+car el nous 1
+car el ralent 1
+car engineer 1
+car engineer comb 1
+car es 2
+car es don 1
+car es ou 1
+car evalu 1
+car for 1
+car il 3
+car il condit 1
+car il ny 1
+car il ont 1
+car implem 3
+car in output 1
+car j cdr 1
+car laddit 1
+car le 3
+car le born 1
+car le rest 1
+car le temp 1
+car lo 1
+car lo est 1
+car loc 1
+car loc variabl 1
+car look 1
+car lop 1
+car lop erat 1
+car memor 1
+car memor manag 1
+car microprogram 1
+car nod 1
+car non 1
+car non determ 1
+car of extern 1
+car of featur 1
+car on ignor 1
+car out exhaust 1
+car out experim 1
+car out further 1
+car out init 1
+car out prior 1
+car out proof 1
+car out using 1
+car over attribut 1
+car person 1
+car protocol 1
+car protocol design 1
+car read 1
+car sequ 2
+car sequ problem 1
+car sinc wrong 1
+car stack 1
+car stud 1
+car switch 1
+car tailor 1
+car th not 1
+car th object 1
+car th valu 1
+car then accord 1
+car to estim 1
+car to separ 1
+car variabl 1
+car when using 1
+car84 1
+car88 1
+car89 1
+car90 1
+car92 1
+caract 6
+caract er 5
+caract er aff 1
+caract er al 1
+caract er ci 1
+caract er de 1
+caract er ee 3
+caract er en 1
+caract er es 2
+caract er essentiel 1
+caract er eucl 1
+caract er ph 1
+caract er respectiv 1
+caract er souv 1
+caract er tr 1
+caract eriser 2
+caract eriser la 1
+caract eriser le 2
+caract eristiqu 4
+caract eristiqu couram 1
+caract eristiqu de 4
+caract eristiqu du 1
+caract eristiqu dun 1
+caract eristiqu fondam 1
+caract eristiqu majeur 1
+caract eristiqu pr 1
+caract eristiqu sont 2
+caract riser 1
+caract riser de 1
+caract ristiqu 1
+caract ristiqu dan 1
+caract ristiqu loc 1
+caract ristiqu qu 1
+caratheodor 1
+caratheodor theorem 1
+carbonel 1
+card 3
+card catalog 1
+card con 1
+card con tr 1
+card invent 1
+card label 1
+card label el 1
+cardel 3
+cardel and giusep 1
+cardel and long 1
+cardel and mitchel 1
+cardel and peter 1
+cardel and wegner 1
+cardiac 2
+cardiac arrhythm 1
+cardiac electrophysiolog 1
+cardin 17
+cardin 22m 1
+cardin 2m 1
+cardin de 2
+cardin de chaqu 1
+cardin de diff 1
+cardin de lensembl 1
+cardin du 1
+cardin du voisin 1
+cardin emp 1
+cardin of n.v 1
+cardin of nk 1
+cardin of pb 1
+cardin of select 1
+cardin of ttl 1
+cardin r compl 1
+cardin tupl 1
+cardin tupl length 1
+career 1
+career award 1
+career award mip 1
+carl 7
+carl constitu 1
+carl constitu donc 1
+carl est 1
+carl est un 1
+carl gunter 1
+carl lov 1
+carl lov peter 1
+carl mach 1
+carl method 2
+carl pu 1
+carl pu un 1
+carl sampl 1
+carl sampl procedur 1
+carl siml 1
+carlin 1
+carlson 1
+carlsson 3
+carlsson dan 1
+carlsson pr 1
+carlsson pr esent 1
+carlt 1
+carm 1
+carneg 4
+carneg mellon 4
+carneg mellon mach 1
+carolin 1
+carp 1
+carp approach 1
+carrol 1
+carrol morgan 1
+carst 1
+cart 5
+cart exponentiel 1
+cart exponentiel correspon 1
+cart exponentiel en 1
+cart exponentiel peuv 1
+cart exponentiel sont 1
+cart loc 1
+cart nest 1
+cart nest dissect 1
+cart parallel 1
+cart parallel nest 1
+cart princip 1
+cart produc 3
+cart produc fil 1
+cart produc project 1
+cart sien 1
+cart var 1
+cart var al 1
+carter 4
+carter but 1
+cartograph 2
+cartograph physiqu 1
+cartograph physiqu du 1
+cartwright 1
+carv 2
+carv a reg 1
+carv reg 1
+carv up 1
+carv up axiom 1
+carv up spac 1
+carv up start 1
+cascad 5
+cascad correl 1
+cascad correl learn 1
+cascad menus 1
+cascad of me 1
+casch 1
+casch al prov 1
+casch tool 1
+casch tool gener 1
+casch using 1
+casdagl 1
+caseb 1
+caseb reason 1
+casestudytr.ps.gz 1
+casner 1
+casnet 1
+cast 5
+cast a vot 1
+cast in term 1
+cast must check 1
+cast occur 1
+cast step 1
+cast vot 1
+cast when classif 1
+castagn 1
+castagn and benjamin 1
+casteljau 1
+castl 1
+castl park 1
+casu 1
+casu experim 1
+casu experim show 1
+cat 6
+cat describ 1
+cat egor 2
+cat egor englob 1
+cat egor le 1
+cat egor qu 1
+cat egor se 1
+cat reform 1
+cat reform system 1
+catalog 3
+catalog ar prepar 1
+catalog at run 1
+catalog becom 1
+catalog descript 1
+catalog int memor 1
+catalog is op 1
+catalun 1
+catastroph 4
+catastroph forg 1
+catastroph situ 1
+catastroph unlearn 1
+catastrophiqu 1
+catch 4
+catch al typ 1
+catch any introduc 1
+catch overflow 1
+catch overflow requir 1
+catcl 1
+catd 1
+catd catd 1
+catd catop 1
+categor 29
+categor abstract 1
+categor abstract mach 1
+categor and repr 1
+categor and thus 1
+categor ar character 1
+categor as specif 1
+categor ba 1
+categor by indirect 1
+categor found 1
+categor learn 1
+categor mean 1
+categor of architectur 1
+categor of avail 1
+categor of dat 1
+categor of ent 1
+categor of switch 2
+categor partit 1
+categor partit method 1
+categor symbol 1
+categor theor 2
+categor wil trigger 1
+categoriz 1
+cater 4
+catg 1
+catg funct 1
+cathol 2
+cathol univer nijmeg 1
+catop 1
+cau.gmd.isst.vw 1
+cauch 2
+cauch distribut 1
+cauch schwartz 1
+caught 2
+caus 64
+caus a condit 1
+caus a del 1
+caus a dequeu 1
+caus a direct 1
+caus a jump 1
+caus a leaf 1
+caus a lo 1
+caus a perform 1
+caus a prev 1
+caus a problem 1
+caus a prompt 1
+caus a signif 1
+caus a simil 1
+caus a term 1
+caus a user 1
+caus a var 1
+caus a www 1
+caus addit 2
+caus addit commun 1
+caus altern 1
+caus altern task 1
+caus an anom 1
+caus an infinit 1
+caus an inser 1
+caus and assoc 1
+caus and atom 1
+caus and bug 1
+caus another loop 1
+caus any glob 1
+caus aon 1
+caus aon de 1
+caus broadcast 1
+caus by cop 1
+caus by crossover 1
+caus by determin 1
+caus by fal 1
+caus by inaccur 1
+caus by inherit 1
+caus by non 1
+caus by proc 1
+caus by reus 1
+caus cach 1
+caus cach incoh 1
+caus confus 2
+caus connect 1
+caus connect descript 1
+caus connect mean 1
+caus contradict 1
+caus dag 1
+caus dag gp 1
+caus dag gq 1
+caus dag show 1
+caus de 4
+caus de interfac 1
+caus de la 1
+caus de laccuml 1
+caus de non 1
+caus de probl 1
+caus del 1
+caus deliver 1
+caus difficult 1
+caus disastr 1
+caus disastr solut 1
+caus distribut 1
+caus distribut shar 1
+caus docum 1
+caus dun 2
+caus dun echec 1
+caus each assoc 1
+caus each ei 1
+caus error 1
+caus est 1
+caus explan 1
+caus explan structur 1
+caus ext 1
+caus ext rev 1
+caus extr 1
+caus extr overhead 1
+caus failur 1
+caus few problem 1
+caus follow 1
+caus glob 1
+caus glob intersect 1
+caus graph 1
+caus ineff 1
+caus justif 1
+caus link 1
+caus link cost 1
+caus lo 1
+caus maintainer 1
+caus maintainer difficult 1
+caus man claus 1
+caus man point 1
+caus me 1
+caus me deliv 1
+caus memor 1
+caus mi 1
+caus mi en 1
+caus model 1
+caus model ba 1
+caus modif 1
+caus modif problem 1
+caus mor block 1
+caus mor problem 1
+caus ms 1
+caus multicast 1
+caus multicast facil 1
+caus multicast prim 1
+caus nearb 1
+caus nearb inst 1
+caus net 1
+caus net approach 1
+caus new issu 1
+caus no confus 1
+caus no difficult 1
+caus of error 1
+caus of failur 1
+caus of multicast 1
+caus of perform 1
+caus order 1
+caus other 1
+caus other event 1
+caus p.ai 1
+caus player 1
+caus possibl 1
+caus possibl de 1
+caus prec 1
+caus probabil 2
+caus probabil network 2
+caus problem 2
+caus quick 1
+caus quick fic 1
+caus reason 2
+caus rel 3
+caus relationship 1
+caus repr 1
+caus reschedl 1
+caus rippl 1
+caus se 1
+caus sever 1
+caus sever perform 1
+caus signif 1
+caus signif var 1
+caus som border 1
+caus som inst 1
+caus som oper 1
+caus som upd 1
+caus st 1
+caus st transit 1
+caus structur 1
+caus th assignm 1
+caus th assoc 1
+caus th browser 1
+caus th com 1
+caus th comput 1
+caus th condit 1
+caus th cr 1
+caus th depth 1
+caus th dim 1
+caus th en 1
+caus th event 1
+caus th fail 1
+caus th failur 1
+caus th import 1
+caus th individu 1
+caus th multip 1
+caus th network 1
+caus th nod 1
+caus th order 1
+caus th parameter 1
+caus th parent 1
+caus th pi 1
+caus th proc 1
+caus th program 1
+caus th quest 1
+caus th reduc 1
+caus th rest 1
+caus th result 1
+caus th se 1
+caus th succ 1
+caus th thread 1
+caus th understander 1
+caus th width 1
+caus their inser 1
+caus understand 2
+caus understand difficult 1
+caus unnec 2
+caus unnec inv 1
+caus unnec lo 1
+caus util 1
+caus util valu 1
+caut 1
+cauvin 1
+cav 1
+caw 1
+cb 4
+cb eventu 1
+cb eventu reach 1
+cb is creat 1
+cb is modif 1
+cb that contain 1
+cb that overlap 1
+cb1 1
+cb2 1
+cb3 2
+cb3 0rd 1
+cb3 and chang 1
+cb3 is enabl 1
+cb3 or cb4 1
+cb3 to enter 1
+cb4 1
+cb4 se 1
+cbacaacb 1
+cbaln 1
+cbalr 1
+cbl 1
+cbl program 1
+cbl.group.intr.e.html 1
+cbl.paper 1
+cbl.paper cbl.group.intr.e.html 1
+cbl92 1
+cbm 3
+cbm nsf 2
+cbm nsf ser 1
+cbus 1
+cbus abus 1
+cbus abus bbus 1
+cbus abus dbus 1
+cc 10
+cc 30ms 1
+cc accept 1
+cc cc 1
+cc ccidl 1
+cc cr 1
+cc fail 1
+cc form 1
+cc identif 1
+cc identif bod 1
+cc identif form 1
+cc is giv 1
+cc k1 1
+cc k2 1
+cc num 1
+cc num osm 1
+cc per me 1
+cc ps 1
+cc q tloc 1
+cc spec form 1
+cc succeed 1
+cc tim 1
+cc tloc 1
+cc.gatech.edu 3
+cc.gatech.edu csj 1
+cc.gatech.edu csj iesd.auc.dk 1
+cc.gatech.edu georg 1
+cc.gatech.edu georg institut 1
+cc.neu.edu 1
+cc1 1
+cc1 cc1 1
+cc1 cc2 1
+cc1 cc2 ip 1
+cc1 cc2 sub 1
+cc1 init 1
+cc1 read 1
+cc2 1
+cc2 cc1 1
+cc2 cc1 init 1
+cc2 cc1 read 1
+cc2 div 1
+cc2 ip 1
+cc2 ip ca3 1
+cc2 ml 1
+cc2 sub 1
+cc3 1
+cc3 cc1 1
+cc3 cc1 cc2 1
+cc3 remainder 1
+ccal 1
+ccal cdr 1
+ccc 3
+ccccc 1
+ccccc et tbd2 1
+ccccc tb 1
+cccccc 2
+ccccccc 1
+cccccccccc 1
+cccccccccccc 1
+ccccccccccccccc 1
+ccccccccccccccccccc 1
+ccd 1
+ccd mount 1
+ccd siz 1
+cch 1
+ccidl 1
+ccidl 10ms 1
+ccidl tim 1
+ccl 3
+ccl inr 1
+ccl inr lorrain 1
+ccm87 1
+ccon 1
+ccon cdr 1
+ccp 1
+ccr 18
+ccr8701671 1
+ccr89 1
+ccr8901966 1
+ccr8901966 and ccr9211621 1
+ccr92 1
+ccr9211621 1
+cd 9
+cd and cd 1
+cd block 1
+cd block edit 1
+cd cd 1
+cd cd block 1
+cd cd cd 1
+cd cd model 1
+cd cd problem 1
+cd delft 1
+cd is exact 1
+cd is np 1
+cd model 1
+cd problem 1
+cd tr 1
+cd85 1
+cd9414015 1
+cdr 3
+cdr con 1
+cdr j con 1
+cdr le 1
+cdr le rest 1
+cdr stack 1
+cdy86 1
+ce 12
+ce acc 2
+ce acc es 2
+ce accr 1
+ce accr est 1
+ce adjectif 1
+ce adr 1
+ce adr peut 1
+ce adr se 1
+ce adr vaut 1
+ce alg 1
+ce alg br 1
+ce algorithm 3
+ce algorithm appel 1
+ce algorithm con 1
+ce algorithm dan 1
+ce algorithm destin 1
+ce algorithm est 1
+ce algorithm inspir 1
+ce algorithm nous 1
+ce algorithm po 1
+ce algorithm sont 1
+ce algorithm sur 1
+ce align 1
+ce align nest 1
+ce allong 1
+ce allong sont 1
+ce altern 1
+ce am elior 2
+ce an 3
+ce an ee 1
+ce an ont 1
+ce analog 1
+ce analog sug 1
+ce antagon 1
+ce antagon est 1
+ce appel 1
+ce appel est 1
+ce appel sont 1
+ce appel suit 1
+ce appl 1
+ce approch 3
+ce approch don 1
+ce approch est 1
+ce approch ne 1
+ce approch par 1
+ce approch ten 1
+ce arbr 1
+ce arbr est 1
+ce architectur 2
+ce architectur moin 1
+ce architectur ont 1
+ce architectur ser 1
+ce argum 1
+ce argum accumulerait 1
+ce argum dan 1
+ce argum de 1
+ce argum peut 1
+ce arit 1
+ce articl 2
+ce articl est 1
+ce articl num 1
+ce aspect 1
+ce aspect dimpl 1
+ce assum 1
+ce assum appropr 1
+ce attribut 1
+ce attribut est 1
+ce attribut va 1
+ce augm 1
+ce augm rest 1
+ce aut 1
+ce aux 1
+ce aux calcl 1
+ce b en 1
+ce ba 2
+ce ba de 1
+ce ba la 1
+ce ba un 1
+ce bar 1
+ce bar er 1
+ce bloc 2
+ce bloc de 1
+ce bloc sont 1
+ce born 1
+ce born inf 1
+ce born se 1
+ce boucl 1
+ce boucl de 1
+ce boucl nengendrer 1
+ce boucl pour 1
+ce boucl qu 1
+ce branch 1
+ce branch de 1
+ce build 1
+ce build block 1
+ce but diff 1
+ce but nest 1
+ce ca 3
+ce ca com 1
+ce ca correspon 2
+ce ca de 1
+ce ca en 2
+ce ca est 1
+ce ca etant 1
+ce ca etr 1
+ce ca le 1
+ce ca lim 1
+ce ca lu 1
+ce ca peut 1
+ce ca sort 1
+ce ca un 1
+ce cadr 1
+ce calcl 3
+ce calcl de 1
+ce calcl du 1
+ce calcl est 1
+ce calcl nest 1
+ce calcl risquerait 1
+ce caract 4
+ce caract eristiqu 3
+ce caract ristiqu 1
+ce cat 1
+ce cat egor 1
+ce cel 1
+ce cel dan 1
+ce cel donneront 1
+ce cel est 1
+ce ch 3
+ce ch au 1
+ce ch dan 1
+ce ch est 2
+ce ch evit 1
+ce ch nous 1
+ce ch qu 1
+ce ch se 1
+ce ch sont 1
+ce champ 1
+ce champ est 1
+ce chang 2
+ce chang dan 1
+ce chang de 1
+ce chang sont 1
+ce chapitr 4
+ce chapitr caract 1
+ce chapitr constitu 1
+ce chapitr de 1
+ce chapitr devrait 1
+ce chapitr dutiliser 1
+ce chapitr est 1
+ce chapitr fait 1
+ce chapitr le 1
+ce chapitr ne 1
+ce chapitr nest 2
+ce chapitr ont 1
+ce chapitr plusieur 1
+ce chapitr pour 1
+ce chapitr qu 1
+ce chapitr quaux 1
+ce chapitr sappu 1
+ce chapitr un 1
+ce chapitr vi 1
+ce chapitr1 1
+ce chiffr 2
+ce chiffr correspon 1
+ce chiffr ont 1
+ce chiffr sur 1
+ce cl 2
+ce cl sont 2
+ce classif 1
+ce classif de 1
+ce classif ne 1
+ce classif nous 1
+ce claus 1
+ce claus comport 1
+ce claus en 1
+ce claus est 1
+ce claus impl 1
+ce claus non 1
+ce claus pour 1
+ce co 1
+ce co ut 1
+ce cod 1
+ce cod est 1
+ce cod peut 1
+ce coeff 1
+ce coeff est 1
+ce colon 1
+ce combinaison 1
+ce combinaison ne 1
+ce comparaison 1
+ce comport 2
+ce comport adm 1
+ce comport engendr 1
+ce comport la 1
+ce comport ne 1
+ce con 2
+ce con peut 2
+ce concept 1
+ce concept dan 1
+ce condit 3
+ce condit nest 1
+ce condit peut 1
+ce condit ren 1
+ce condit sont 1
+ce condit sous 1
+ce configur 1
+ce conflit 1
+ce conflit si 1
+ce conflit sont 1
+ce consom 1
+ce consom additionnel 1
+ce const 1
+ce const perm 1
+ce constat 1
+ce constat nous 1
+ce context 3
+ce context nous 1
+ce contraint 2
+ce contraint adm 1
+ce contraint sembl 1
+ce contraint sont 1
+ce contraint suppl 1
+ce cop 1
+ce coupur 1
+ce coupur loc 1
+ce courb 1
+ce courb illustr 1
+ce courb montr 1
+ce courb qu 1
+ce cr 2
+ce cr eat 1
+ce croch 1
+ce croch informatiqu 1
+ce cycl 1
+ce cycl est 1
+ce d ecomposit 1
+ce d ecoup 1
+ce d efaut 1
+ce d efinit 2
+ce d epen 1
+ce d eplac 1
+ce d eriv 1
+ce d etail 1
+ce d riv 1
+ce dat 1
+ce densit 1
+ce dern 5
+ce dern afin 1
+ce dern ca 3
+ce dern comport 1
+ce dern crit 1
+ce dern doit 1
+ce dern er 2
+ce dern inconv 1
+ce dern maillon 1
+ce dern pav 1
+ce dern point 3
+ce dern re 1
+ce dern sont 1
+ce dern typ 1
+ce descript 1
+ce descript conceptuel 1
+ce deux 4
+ce deux avant 1
+ce deux born 1
+ce deux boucl 1
+ce deux ca 2
+ce deux candidat 1
+ce deux cl 1
+ce deux dern 1
+ce deux direct 1
+ce deux docum 1
+ce deux ecritur 1
+ce deux em 1
+ce deux ensembl 1
+ce deux extr 1
+ce deux form 1
+ce deux ind 1
+ce deux instruc 1
+ce deux nid 1
+ce deux point 1
+ce deux pointeur 1
+ce deux prem 1
+ce deux tableaux 1
+ce deux techniqu 2
+ce deux term 1
+ce deux test 1
+ce deux th 1
+ce deux ver 1
+ce diff 3
+ce diff er 2
+ce diff erent 2
+ce difficult 3
+ce difficult es 1
+ce disparit 1
+ce disparit es 1
+ce disposit 1
+ce dist 1
+ce dist chang 1
+ce distribut 1
+ce docum 2
+ce docum de 1
+ce docum est 1
+ce docum ne 1
+ce docum peuv 1
+ce domain 1
+ce domain par 1
+ce don 3
+ce don ee 3
+ce doubl 1
+ce doubl approch 1
+ce drapeau 1
+ce drapeau nest 1
+ce droit 1
+ce dur 1
+ce dur ee 1
+ce echang 1
+ce echang emp 1
+ce ecritur 1
+ce ecritur il 1
+ce ecueil 1
+ce eff 2
+ce eff peuv 1
+ce eff ping 1
+ce egard 1
+ce egard not 1
+ce el 2
+ce el ement 2
+ce elim 1
+ce elim doit 1
+ce endroit 1
+ce endroit pr 1
+ce enregister 1
+ce enregister dactiv 1
+ce enregister impliqu 1
+ce enregister sont 1
+ce ensembl 1
+ce ensembl ont 1
+ce ensembl perm 1
+ce entr 1
+ce entr ee 1
+ce environ 2
+ce environ dev 1
+ce environ fait 1
+ce environ pu 1
+ce environ va 1
+ce equiv 1
+ce equiv est 1
+ce erreur 1
+ce erreur dinstanc 1
+ce espac 2
+ce espac de 1
+ce etat 2
+ce etat car 1
+ce etat de 1
+ce etat ne 1
+ce etiqu 1
+ce etiqu sp 1
+ce etud 1
+ce etud aux 1
+ce etud comport 1
+ce etud il 1
+ce etud nous 1
+ce etud pr 1
+ce etud qu 1
+ce etud se 1
+ce exempl 3
+ce exempl au 1
+ce exempl illustr 1
+ce exempl le 1
+ce exempl montr 1
+ce exempl peut 1
+ce exempl suit 1
+ce exp 3
+ce exp er 2
+ce exp ri 1
+ce expl 1
+ce expl du 1
+ce expr 2
+ce expr nous 1
+ce ext 2
+ce ext permettr 1
+ce extr 1
+ce extr em 1
+ce fair 3
+ce fair nous 1
+ce fait 2
+ce fait dan 1
+ce fait peut 1
+ce fait un 1
+ce figur 1
+ce figur est 1
+ce fin 1
+ce fo 2
+ce fo ci 1
+ce fo la 1
+ce fo le 1
+ce fonct 3
+ce fonct co 1
+ce fonct est 1
+ce fonct perm 1
+ce fonct peut 2
+ce fonct sont 1
+ce foncteur 1
+ce foncteur est 1
+ce fonctionalit 1
+ce form 3
+ce form de 1
+ce form est 1
+ce form pour 1
+ce forml 1
+ce forml complec 1
+ce forml en 1
+ce forml ne 1
+ce g en 1
+ce gain 1
+ce gain sont 1
+ce genr 3
+ce genr de 2
+ce genr din 1
+ce genr doptim 1
+ce gest 1
+ce glob 1
+ce glob potentiel 1
+ce grand 1
+ce grand ch 1
+ce graph 2
+ce graph de 1
+ce graph nest 1
+ce hypoth 2
+ce hypoth es 1
+ce hypoth se 1
+ce id ee 1
+ce imag 1
+ce imag doiv 1
+ce in egalit 1
+ce inconv 1
+ce inconv enient 1
+ce incr 1
+ce incr ement 1
+ce indirect 1
+ce indirect pourrait 1
+ce inform 1
+ce inform dan 1
+ce inform nest 1
+ce inform peut 1
+ce instruc 2
+ce instruc acc 1
+ce instruc cr 1
+ce instruc est 1
+ce instruc font 1
+ce instruc inclut 1
+ce instruc par 1
+ce int 1
+ce int gral 1
+ce interpr 1
+ce interpr etat 1
+ce interv 1
+ce interv peut 1
+ce introduc 1
+ce introduc est 1
+ce invar 1
+ce jur 1
+ce l 1
+ce lang 1
+ce lang soient 1
+ce lectur 1
+ce lem 1
+ce lem par 1
+ce liaison 1
+ce liaison sont 1
+ce lib 1
+ce lib erat 1
+ce lim 1
+ce lim en 1
+ce lo 1
+ce lo est 1
+ce lo pourrait 1
+ce logiqu 1
+ce logiqu qu 1
+ce m ecan 2
+ce m em 1
+ce m emoir 3
+ce m es 1
+ce m ethod 4
+ce m thod 1
+ce m triqu 1
+ce mach 3
+ce mach com 1
+ce mach en 1
+ce mach engendr 1
+ce mach offr 1
+ce mach ont 1
+ce mach sont 2
+ce mach souffr 1
+ce manuscrit 1
+ce manuscrit devrait 1
+ce manuscrit le 1
+ce manuscrit na 1
+ce manuscrit ne 1
+ce manuscrit rep 1
+ce matr 3
+ce matr ma 1
+ce maxim 2
+ce maxim est 1
+ce maxim pour 1
+ce me 1
+ce me devront 1
+ce mesur 1
+ce mesur sont 1
+ce mi 2
+ce mi en 1
+ce migr 1
+ce migr de 1
+ce minim 1
+ce minim est 1
+ce minim ne 1
+ce mod 4
+ce mod de 1
+ce mod dic 1
+ce mod el 3
+ce mod le 1
+ce mod li 1
+ce modif 3
+ce modif de 2
+ce modif doiv 1
+ce modif ne 1
+ce modif ont 1
+ce modl 1
+ce mon 1
+ce mot 2
+ce mot est 1
+ce mot evoqu 1
+ce motif 1
+ce multipl 1
+ce multipl de 1
+ce mut 1
+ce mut au 1
+ce mut sont 1
+ce nest 3
+ce nest clair 1
+ce nest donc 1
+ce nest pa 3
+ce nid 1
+ce nid de 1
+ce nid est 1
+ce nid peut 1
+ce niveau 1
+ce noeud 1
+ce noeud perm 1
+ce nombr 3
+ce nombr dappl 1
+ce nombr est 2
+ce nombr ne 1
+ce nombr peut 1
+ce not 4
+ce not compl 1
+ce not correspon 1
+ce not ne 1
+ce not peut 1
+ce not se 1
+ce nouveau 2
+ce nouveau point 1
+ce noyau 1
+ce noyau comport 1
+ce obj 3
+ce obj dan 1
+ce objectif 1
+ce objectif principaux 1
+ce occ 1
+ce occ com 1
+ce op 4
+ce op erat 3
+ce op erateur 1
+ce op rat 1
+ce opt 1
+ce opt continu 1
+ce opt na 1
+ce optiqu 1
+ce ordr 1
+ce ordr etant 1
+ce organ 2
+ce outil 1
+ce outil th 1
+ce p eriod 1
+ce pa 1
+ce pa sont 1
+ce pag 1
+ce pag avec 1
+ce pag cont 1
+ce pag doit 1
+ce pag en 1
+ce pag par 1
+ce pag pen 1
+ce pag pour 1
+ce pag qu 1
+ce pag sur 1
+ce pap 1
+ce pap pour 1
+ce paragraph 3
+ce paragraph com 2
+ce paragraph compl 1
+ce paragraph est 1
+ce paragraph illustrer 1
+ce paragraph la 1
+ce paragraph le 1
+ce paragraph nous 1
+ce paragraph ont 1
+ce paragraph par 1
+ce paragraph pr 1
+ce paragraph qu 1
+ce param 2
+ce param etr 2
+ce part 4
+ce part com 1
+ce part en 1
+ce part est 1
+ce part le 1
+ce part qu 1
+ce part requ 1
+ce part un 1
+ce partit 1
+ce partit du 1
+ce partit perm 1
+ce per 1
+ce per de 1
+ce perspect 1
+ce perspect nous 1
+ce petit 1
+ce petit lexiqu 1
+ce peut 1
+ce peut etr 1
+ce ph 2
+ce ph de 1
+ce ph enom 2
+ce pil 1
+ce pil com 1
+ce point 3
+ce point appart 1
+ce point apr 1
+ce point aurait 1
+ce point de 1
+ce point ent 1
+ce point est 1
+ce point ma 1
+ce point minim 1
+ce point ne 1
+ce point se 1
+ce point vont 1
+ce pointeur 1
+ce pointeur de 1
+ce pol 1
+ce pol edr 1
+ce port 1
+ce port ee 1
+ce possibilit 1
+ce pour 1
+ce pour chaqu 1
+ce pourc 1
+ce pourc sest 1
+ce pr 1
+ce pr edicat 1
+ce prem 1
+ce primitiv 1
+ce primitiv com 1
+ce primitiv est 1
+ce primitiv form 1
+ce primitiv le 1
+ce princip 2
+ce princip est 1
+ce princip sappar 1
+ce probabilit 2
+ce probl 6
+ce probl em 5
+ce probl ematiqu 1
+ce probl me 1
+ce proc edur 1
+ce processeur 1
+ce processeur afin 1
+ce processeur est 1
+ce processeur oprivil 1
+ce processus 2
+ce processus est 1
+ce produit 1
+ce produit est 1
+ce program 2
+ce program le 1
+ce program ne 1
+ce program nutil 1
+ce program pour 1
+ce program sont 2
+ce program suiv 1
+ce prop 1
+ce proposit 1
+ce proposit est 1
+ce propr 3
+ce protocol 1
+ce protocol de 1
+ce protocol int 1
+ce pseud 1
+ce pseud pr 1
+ce qu 5
+ce qu aik 1
+ce qu ar 1
+ce qu assur 1
+ce qu augm 1
+ce qu ce 1
+ce qu certain 1
+ce qu chaqu 1
+ce qu concern 3
+ce qu conduit 1
+ce qu correspon 2
+ce qu couvr 1
+ce qu dailleur 1
+ce qu dan 1
+ce qu devrait 1
+ce qu don 2
+ce qu emp 1
+ce qu est 2
+ce qu etait 1
+ce qu evit 1
+ce qu eviter 1
+ce qu expliqu 1
+ce qu facil 1
+ce qu fer 1
+ce qu fournit 1
+ce qu imp 1
+ce qu impliqu 2
+ce qu justif 1
+ce qu la 2
+ce qu le 2
+ce qu lon 2
+ce qu montr 1
+ce qu na 1
+ce qu nalt 1
+ce qu ne 2
+ce qu nest 1
+ce qu nous 4
+ce qu perm 2
+ce qu peut 1
+ce qu pk 1
+ce qu produit 1
+ce qu prot 1
+ce qu prouv 1
+ce qu ralentit 1
+ce qu ren 1
+ce qu restreint 1
+ce qu rev 1
+ce qu sav 1
+ce qu se 1
+ce qu signif 1
+ce qu simplif 1
+ce qu sug 1
+ce qu suit 1
+ce qu sup 1
+ce qu termin 1
+ce qu va 1
+ce qu veut 1
+ce quapproximativ 1
+ce quel 1
+ce quel partag 1
+ce quest 2
+ce quil 2
+ce quil appel 1
+ce quil est 1
+ce quil etait 1
+ce quil rest 1
+ce quon 1
+ce quon appel 1
+ce quon vient 1
+ce quun 2
+ce quun processeur 1
+ce quun var 1
+ce r ecup 1
+ce r educ 1
+ce r ef 2
+ce r eseaux 1
+ce r esultat 4
+ce r eutil 1
+ce raison 2
+ce raison qu 1
+ce raison tient 1
+ce rapport 1
+ce recherch 1
+ce recherch de 1
+ce reforml 1
+ce register 1
+ce register additionnel 1
+ce register ai 1
+ce register correspon 1
+ce register dan 1
+ce register doit 1
+ce register lor 1
+ce register peuv 1
+ce register sont 1
+ce rel 1
+ce renforc 1
+ce renforc est 1
+ce repr 1
+ce repr es 1
+ce requ 1
+ce requ es 1
+ce restrict 2
+ce retour 1
+ce retour est 1
+ce rout 1
+ce s equ 2
+ce s er 1
+ce sauvegard 1
+ce sauvegard pour 1
+ce sauvegard remplac 1
+ce sauvegard un 1
+ce sch 3
+ce sch em 3
+ce secon 3
+ce secon an 1
+ce secon opt 1
+ce secon test 1
+ce sect 2
+ce sect de 1
+ce sect est 1
+ce sect le 1
+ce sect pa 1
+ce sect pr 1
+ce sect sont 1
+ce segm 1
+ce segm ne 1
+ce sen 2
+ce sen le 1
+ce sen quun 1
+ce ser 1
+ce ser le 1
+ce ser toujour 1
+ce seuil 1
+ce siml 2
+ce siml est 1
+ce siml perm 1
+ce simpl 1
+ce simpl condit 1
+ce sit 1
+ce solut 3
+ce solut consom 1
+ce solut doit 1
+ce solut hybr 1
+ce solut peut 1
+ce solut rest 1
+ce solut sappu 1
+ce solut se 1
+ce solut sembl 1
+ce solut ser 1
+ce sont 3
+ce sont el 1
+ce sont eux 1
+ce sont le 1
+ce sous 2
+ce sous arbr 1
+ce sous ensembl 1
+ce sous modl 1
+ce sp 1
+ce sp ec 1
+ce squel 1
+ce squel est 1
+ce stad 2
+ce strat 2
+ce strat eg 2
+ce structur 2
+ce structur de 1
+ce structur nous 1
+ce substitut 1
+ce substitut modif 1
+ce suj 2
+ce support 1
+ce support mat 1
+ce supposit 1
+ce suppr 1
+ce suppr nest 1
+ce surc 1
+ce surc ut 1
+ce syst 3
+ce syst em 3
+ce tableau 2
+ce tableau don 1
+ce tail 1
+ce tail peut 1
+ce techniqu 5
+ce techniqu afin 1
+ce techniqu au 1
+ce techniqu con 1
+ce techniqu entr 1
+ce techniqu est 4
+ce techniqu etant 1
+ce techniqu ne 2
+ce techniqu nont 1
+ce techniqu ont 1
+ce techniqu qu 1
+ce techniqu rest 1
+ce techniqu sappu 1
+ce techniqu ser 1
+ce techniqu sur 1
+ce technolog 1
+ce technolog de 1
+ce temp 1
+ce temp sont 1
+ce term 2
+ce term doiv 1
+ce term est 1
+ce test 2
+ce test de 1
+ce test ma 1
+ce test perm 1
+ce test peut 1
+ce text 1
+ce text es 1
+ce th 4
+ce th eor 2
+ce th es 2
+ce th or 1
+ce th se 1
+ce to ch 1
+ce to count 1
+ce to random 1
+ce top 1
+ce top ma 1
+ce top nest 1
+ce tr 2
+ce tr algorithm 1
+ce tr boucl 1
+ce trait 1
+ce trait est 1
+ce trajectoir 1
+ce trajectoir dan 1
+ce transform 2
+ce transform au 1
+ce transform dan 1
+ce transform doit 1
+ce transform est 2
+ce transform font 1
+ce transform ne 1
+ce transform nest 1
+ce transform respect 1
+ce transform soit 1
+ce transform sur 1
+ce transpar 1
+ce transpar de 1
+ce travail 3
+ce travail aider 1
+ce travail de 1
+ce travail est 2
+ce travaux 2
+ce travaux sin 1
+ce tud 1
+ce tud de 1
+ce tud est 1
+ce tud rem 1
+ce typ 4
+ce typ darchitectur 1
+ce typ de 3
+ce typ deff 1
+ce typ dext 1
+ce typ dim 1
+ce typ dorgan 1
+ce typ se 2
+ce unif 1
+ce unif affecteront 1
+ce unif etendu 1
+ce unif introduit 1
+ce unit 1
+ce unit es 1
+ce util 1
+ce util est 1
+ce v erif 1
+ce val 1
+ce val doit 1
+ce val nous 1
+ce val perm 1
+ce valeur 2
+ce valeur de 1
+ce valeur est 1
+ce valeur peut 1
+ce var 2
+ce var com 1
+ce var est 1
+ce var na 1
+ce var nest 1
+ce var peut 1
+ce var pu 1
+ce var sav 1
+ce var sont 1
+ce variabl 1
+ce variabl domain 1
+ce variabl perman 1
+ce vecteur 1
+ce vecteur est 1
+ce vecteur peuv 1
+ce vecteur pour 1
+ce vecteur temporair 1
+ce ver 1
+ce ver est 1
+ce ver ne 1
+ce vit 1
+ce vo 1
+ce zon 1
+ce zon lor 1
+cec 6
+cec a egal 1
+cec a pour 1
+cec correspon 2
+cec correspon au 1
+cec correspon bien 1
+cec corrobor 1
+cec corrobor egal 1
+cec cr 1
+cec cr eerait 1
+cec du 1
+cec du fait 1
+cec est 2
+cec est confirm 1
+cec est encor 1
+cec est locc 1
+cec etant 1
+cec etant partiel 1
+cec etant vr 1
+cec ind 1
+cec ind ependam 1
+cec nous 3
+cec nous conduit 1
+cec nous perm 2
+cec perm 1
+cec perm dutiliser 1
+cec ren 1
+cec ren le 1
+cec rest 1
+cec rest mineur 1
+cec sexpliqu 1
+cec sexpliqu par 1
+cec soul 1
+cec soul ve 1
+cec suffit 1
+cec tient 1
+cec tient au 1
+cecom 1
+ced 8
+ced franc 2
+ced franc issn 1
+cedr 1
+cedr centr 1
+cedr centr detud 1
+ceed 1
+ceg 1
+ceil 2
+ceil funct 1
+ceil funct ensur 1
+cel 26
+cel a laquel 1
+cel a modif 1
+cel affect 1
+cel affect ee 1
+cel ai 1
+cel ain 1
+cel ain qu 1
+cel ait 1
+cel allou 1
+cel allou ee 1
+cel and program 1
+cel and thereb 1
+cel ar closer 1
+cel ar equ 1
+cel ar init 1
+cel ar rewrit 1
+cel ar serv 1
+cel arriv 1
+cel assoc 1
+cel at iter 1
+cel at spac 1
+cel au 1
+cel au sein 1
+cel avail 1
+cel belong 1
+cel by se 1
+cel c1 1
+cel c2 1
+cel ch 2
+cel ch par 1
+cel ci 4
+cel ci aux 1
+cel ci ec 1
+cel ci etait 1
+cel ci loccur 1
+cel ci ne 1
+cel ci peut 1
+cel ci peuv 1
+cel ci pour 1
+cel ci tant 1
+cel compliqu 1
+cel compliqu cep 1
+cel comput 1
+cel con 2
+cel con ecutiv 1
+cel conduit 1
+cel cont 1
+cel cont cc3 1
+cel contain 1
+cel correspon 2
+cel correspon au 1
+cel correspon aux 1
+cel correspon tout 1
+cel correspon transform 1
+cel d ecoul 1
+cel d ecrit 1
+cel d efin 1
+cel dan 1
+cel dan le 1
+cel de 4
+cel de distribuer 1
+cel de foncteur 1
+cel de g.florin 1
+cel de la 3
+cel de lenviron 1
+cel de lop 1
+cel de lordonnanc 1
+cel de mach 1
+cel de moin 1
+cel de pag 1
+cel de pil 1
+cel de pr 1
+cel de term 1
+cel de tn 1
+cel de tout 1
+cel de tr 1
+cel de variabl 1
+cel decomposit 1
+cel decomposit method 1
+cel deffectuer 1
+cel deffectuer un 1
+cel defin 1
+cel definit 1
+cel definit correspon 1
+cel definit displ 1
+cel definit over 1
+cel demand 1
+cel demand un 1
+cel dep 1
+cel depart 1
+cel deux 1
+cel deux algorithm 1
+cel devrait 1
+cel devrait etr 1
+cel diff 1
+cel diff erent 1
+cel dit 1
+cel don 1
+cel don ee 1
+cel don ladr 1
+cel donneront 1
+cel donneront lieu 1
+cel du 3
+cel du bloc 1
+cel du processeur 1
+cel du produit 1
+cel du propr 1
+cel du regroup 1
+cel du th 1
+cel dun 1
+cel dun syst 1
+cel e0 1
+cel encor 1
+cel encor viv 1
+cel endif 1
+cel engendr 1
+cel entr 1
+cel entr deux 1
+cel entr le 1
+cel est 2
+cel est aus 1
+cel est comp 1
+cel est direct 1
+cel est ladr 1
+cel est li 1
+cel est profon 1
+cel est rendu 1
+cel est retourn 1
+cel est simpl 1
+cel est souhait 1
+cel estampil 1
+cel estampil ee 1
+cel et de 1
+cel etait 1
+cel etait pr 1
+cel etiqu 1
+cel etiqu ee 1
+cel fa 1
+cel fac 1
+cel facil 1
+cel facil grand 1
+cel fin 1
+cel fonct 1
+cel fonct de 1
+cel fus 1
+cel fus ee 1
+cel imp 1
+cel imp donc 1
+cel impliqu 1
+cel impliqu lor 1
+cel impliqu qu 1
+cel in row 1
+cel in st 1
+cel inaccessibl 1
+cel ind 2
+cel ind ependam 1
+cel ind ument 1
+cel indirect 1
+cel indirect addr 1
+cel instead 1
+cel is calcl 1
+cel is fil 1
+cel is low 1
+cel is mark 1
+cel is serv 1
+cel is sharp 1
+cel la 1
+cel la condit 1
+cel le 2
+cel le el 1
+cel le not 1
+cel le propr 1
+cel le raffin 1
+cel le techniqu 1
+cel le th 1
+cel libr 1
+cel libr pour 1
+cel ls 1
+cel m emoir 1
+cel mi 1
+cel modif 1
+cel modif ee 1
+cel multiplec 1
+cel must depart 1
+cel n cessiterait 1
+cel n ecessit 2
+cel na 1
+cel na pa 1
+cel ne 1
+cel ne cr 1
+cel ne peut 1
+cel ne pren 1
+cel nengendr 1
+cel nengendr de 1
+cel nest 1
+cel nest evidem 1
+cel nest pa 1
+cel nexclut 1
+cel nexclut pa 1
+cel nous 2
+cel nous allon 1
+cel nous perm 2
+cel obtenu 2
+cel obtenu avec 1
+cel obtenu en 1
+cel obtenu selon 1
+cel occup 1
+cel occup ee 1
+cel of connect 1
+cel of strong 1
+cel on doit 1
+cel output 1
+cel output error 1
+cel partag 1
+cel partag ee 1
+cel perm 1
+cel perm alor 1
+cel peut 2
+cel peut etr 1
+cel peut ne 1
+cel peut retrouver 1
+cel peut sappliquer 1
+cel peuv 1
+cel peuv etr 1
+cel plus anc 1
+cel point 1
+cel point sur 1
+cel pourrait 1
+cel pourrait cr 1
+cel pren 1
+cel pren habituel 1
+cel prob 1
+cel prob distribut 1
+cel probabil 1
+cel problem 1
+cel prouv 1
+cel prouv qu 1
+cel provoqu 1
+cel provoqu de 1
+cel qu 5
+cel qu acc 1
+cel qu appar 1
+cel qu assur 1
+cel qu condu 1
+cel qu cont 1
+cel qu correspon 1
+cel qu devront 1
+cel qu ne 1
+cel qu nous 2
+cel qu ont 1
+cel qu peuv 1
+cel qu son 1
+cel qu sont 1
+cel r ecent 1
+cel r eduisait 1
+cel r eduit 1
+cel r ef 1
+cel ref 1
+cel ref st 1
+cel ren 1
+cel repr 1
+cel repr esent 1
+cel retourn 1
+cel retourn ee 1
+cel router 1
+cel sappliqu 1
+cel sappliqu aus 1
+cel satisf 1
+cel sav 1
+cel se 3
+cel se traduit 2
+cel selon 1
+cel selon laquel 1
+cel shar 1
+cel si 1
+cel si la 1
+cel sont 1
+cel sont maint 1
+cel st 1
+cel st valu 1
+cel suffirait 1
+cel suffit 1
+cel sug 1
+cel suiv 1
+cel sup 1
+cel sup qu 1
+cel suppl 1
+cel suppl ementair 1
+cel sur 1
+cel sur la 1
+cel termin 1
+cel termin est 1
+cel that obtain 1
+cel that repr 1
+cel to cr 1
+cel tr 1
+cel traduit 1
+cel traduit le 1
+cel transm 1
+cel transm tim 1
+cel un 1
+cel un adapt 1
+cel un fonct 1
+cel uniqu 1
+cel using 1
+cel util 1
+cel util ee 1
+cel valu 1
+cel valu pair 1
+cel var 1
+cel variabl 1
+cel ver 1
+cel ver un 1
+cel veut 1
+cel veut dir 1
+cel vr 1
+cel vr init 1
+cel vr isol 1
+cel with addr 1
+cel with plug 1
+celikovsk 1
+celltransm 1
+celltransm tim 1
+cellulair 1
+cellulair et systoliqu 1
+celu 4
+celu ci 3
+celu ci appar 1
+celu ci doit 1
+celu ci est 1
+celu ci port 1
+celu ci serait 1
+celu correspon 1
+celu de 3
+celu de la 3
+celu de lappel 1
+celu de unit 1
+celu qu 2
+celu qu nous 1
+celu quon 1
+celu quon obtiendrait 1
+cemagref 1
+cen 1
+cen et al 1
+ceng 1
+cengiz 1
+cengiz alaettin 1
+cengiz alaettin glu 1
+census 2
+census datab 1
+census inform 1
+cent 5
+cent ar sum 1
+cent cent 1
+cent cent cent 1
+cent com 1
+cent com lirm 1
+cent microsecon 1
+cent mor correct 1
+cent nat 1
+cent oct 1
+cent oct ne 1
+cent oct seffectu 1
+cent pur 1
+centain 1
+centain de 1
+centain de milliard 1
+centain de processeur 1
+center 46
+center and pack 1
+center approach 1
+center around fic 2
+center around liter 1
+center at loc 1
+center at row 1
+center dept 1
+center for artif 1
+center for autom 1
+center for cognit 1
+center for computer 3
+center for developm 1
+center for oper 1
+center for parallel 1
+center for softwar 1
+center for supercomput 1
+center for telecommun 1
+center k tupl 1
+center no 1
+center of cluster 1
+center of cover 1
+center of imag 1
+center of ma 2
+center of xi 1
+center ofx 1
+center panel 1
+center personnel 1
+center point 1
+center point instead 1
+center track 1
+center track subscriber 1
+center view 1
+center washingt 1
+center yorktown 1
+center yorktown height 1
+centr 44
+centr accord 1
+centr algorithm 1
+centr and requir 1
+centr approach 2
+centr approach mak 1
+centr ar 1
+centr ar plac 1
+centr ar thus 1
+centr auxil 1
+centr auxil structur 1
+centr buffer 1
+centr buffer accommod 1
+centr buffer actu 1
+centr buffer approach 1
+centr buffer ba 1
+centr buffer chunk 1
+centr buffer effect 1
+centr buffer fr 1
+centr buffer log 1
+centr buffer model 1
+centr buffer multicast 1
+centr buffer perform 1
+centr buffer prov 1
+centr buffer queu 1
+centr buffer ram 1
+centr buffer repl 1
+centr buffer schem 1
+centr buffer siz 1
+centr buffer spac 1
+centr buffer switch 1
+centr buffer typ 1
+centr buffer writ 1
+centr cod 1
+centr compon 2
+centr control 2
+centr de 1
+centr de ce 1
+centr detud 1
+centr dot 1
+centr dun 1
+centr dun confront 1
+centr e ou 1
+centr ee 2
+centr ent 1
+centr ent comput 1
+centr ent tak 1
+centr florid 2
+centr for computer 3
+centr for dat 1
+centr fund 1
+centr id 1
+centr implem 1
+centr import 1
+centr in karlsruh 1
+centr in vol 1
+centr init 1
+centr institut 1
+centr is assign 1
+centr is proport 1
+centr j ulich 1
+centr list 1
+centr microcod 1
+centr microcod control 1
+centr moment 1
+centr moment comput 1
+centr nat 1
+centr nat de 1
+centr not 1
+centr point 2
+centr prior 1
+centr prior queu 1
+centr problem 1
+centr proc 1
+centr proc unit 1
+centr quest 1
+centr queu 2
+centr queu ba 1
+centr queu buffer 1
+centr queu organ 1
+centr r tr 1
+centr requir 1
+centr rol 2
+centr server 2
+centr server pe 1
+centr server prov 1
+centr straightfor 1
+centr system 1
+centr theorem 1
+centr to rol 1
+centr valu 1
+centr variabl 1
+centr wil bal 1
+centr within vol 1
+centraliser 2
+centraliser dan 1
+centraliser dan un 1
+centraliser la 1
+centraliser la reproduc 1
+centur 4
+centur cit 1
+centur cit har 1
+centur to produc 1
+cep 5
+cep ce 1
+cep ce augm 1
+cep ce born 1
+cep ce minim 1
+cep ce ver 1
+cep com 1
+cep com le 1
+cep com nous 1
+cep dan 1
+cep dan de 1
+cep de 1
+cep de nombreus 1
+cep du 1
+cep du fait 1
+cep el 1
+cep el concern 1
+cep el nest 1
+cep en 1
+cep en mesur 1
+cep en util 1
+cep encor 1
+cep encor loin 1
+cep h1 1
+cep il 1
+cep il est 1
+cep il faut 1
+cep il ne 1
+cep influencer 1
+cep influencer lefficacit 1
+cep int 1
+cep int er 1
+cep la 1
+cep la pr 1
+cep le 2
+cep le calcl 1
+cep le ch 1
+cep le fait 1
+cep le solut 1
+cep lestim 1
+cep lestim de 1
+cep lir 1
+cep lir egularit 1
+cep lordr 1
+cep lordr init 1
+cep lorsquun 1
+cep noter 1
+cep noter le 1
+cep nous 1
+cep nous avon 1
+cep nous navon 1
+cep on peut 1
+cep pour 1
+cep qu 2
+cep qu dun 1
+cep qu la 2
+cep quil 1
+cep quil est 1
+cep si 1
+cep si ce 1
+cep un ca 1
+cep un co 1
+ceq 1
+cer 6
+cer and herzig 1
+cer tr 1
+cer tr es 1
+cerf 1
+cerm 1
+cerm inr 1
+cerner 1
+cerner le 1
+cerner le param 1
+ceron 1
+ceron par 1
+cerror 1
+cerror and error 1
+cerror expr 1
+cerror funct 1
+cerror th resum 1
+certain 15
+certain ac 1
+certain acc 1
+certain acc es 1
+certain algorithm 1
+certain algorithm doiv 1
+certain argum 1
+certain argum en 1
+certain be improv 1
+certain born 1
+certain boucl 1
+certain boucl du 1
+certain ca 2
+certain ca un 1
+certain calcl 1
+certain calcl inutil 1
+certain ch 1
+certain ch de 1
+certain ch ne 1
+certain champ 1
+certain champ du 1
+certain claus 1
+certain condit 1
+certain cop 1
+certain cop de 1
+certain coupl 1
+certain coupl dit 1
+certain coupur 1
+certain crit 1
+certain crit er 1
+certain d efaut 1
+certain d efinit 1
+certain d etail 1
+certain de 2
+certain de boucl 1
+certain de ce 1
+certain de no 1
+certain de variabl 1
+certain disparit 1
+certain disparit es 1
+certain don 1
+certain don ee 1
+certain du 1
+certain el 1
+certain el ement 1
+certain en 1
+certain ev 1
+certain ev en 1
+certain fonct 1
+certain fonct de 1
+certain hypoth 1
+certain hypoth es 1
+certain in egalit 1
+certain inform 2
+certain inform essentiel 1
+certain inform sur 1
+certain instruc 1
+certain instruc sont 1
+certain lang 1
+certain lang perm 1
+certain le effort 1
+certain localit 1
+certain m ethod 1
+certain man 1
+certain mi 1
+certain mi en 1
+certain nombr 1
+certain nombr de 1
+certain op 3
+certain op erat 2
+certain op rat 1
+certain pa 1
+certain pa du 1
+certain pag 1
+certain pag en 1
+certain part 1
+certain part de 1
+certain point 1
+certain point appart 1
+certain proc dur 1
+certain program 1
+certain program au 1
+certain propr 3
+certain som 1
+certain sont 2
+certain sont relativ 1
+certain sont sp 1
+certain sous 1
+certain sous ensembl 1
+certain surc 1
+certain surc ut 1
+certain symbol 1
+certain symbol math 1
+certain syst 1
+certain syst em 1
+certain techniqu 1
+certain techniqu de 1
+certain term 2
+certain th expect 1
+certain th transl 1
+certain transform 1
+certain travaux 1
+certain travaux ax 1
+certain traver 1
+certain traver de 1
+certain typ 1
+certain typ de 1
+certain un moy 1
+certain valeur 1
+certain valeur de 1
+certain variabl 1
+certain variabl perman 1
+certain ver 1
+certain ver seront 1
+certaint 1
+cerveau 1
+cerveau dun 1
+cesp 1
+cessair 2
+cessair de 1
+cessair pour 1
+cessair pour traiter 1
+cessit 2
+cessit de 1
+cessit de algorithm 1
+cessit un algorithm 1
+cessitait 1
+cessitait lempl 1
+cessitait lempl de 1
+cessiterait 1
+cessiterait encor 1
+cessiterait encor de 1
+cessiterait lintroduc 1
+cessiterait lintroduc de 1
+cest 5
+cest a chaqu 1
+cest a dir 3
+cest adir 1
+cest adir de 1
+cest adir le 1
+cest adir quun 1
+cest adir relog 1
+cest au 1
+cest au paragraph 1
+cest aus 1
+cest aus ce 1
+cest ce 3
+cest ce ch 1
+cest ce dern 1
+cest ce qu 2
+cest ce quon 1
+cest courir 1
+cest courir le 1
+cest dan 2
+cest dan ce 1
+cest dan de 1
+cest en 1
+cest en particl 1
+cest la 3
+cest la condit 1
+cest la dim 1
+cest la matr 1
+cest la prim 1
+cest la raison 1
+cest la solut 1
+cest le 2
+cest le ca 2
+cest le gestionnair 1
+cest le probl 1
+cest lenviron 1
+cest lenviron cour 1
+cest linver 1
+cest linver dan 1
+cest notr 1
+cest notr souhait 1
+cest par 2
+cest par ailleur 1
+cest par exempl 2
+cest po lordr 1
+cest po ou 1
+cest pour 2
+cest pour ce 1
+cest pour qu 1
+cest pourqu 1
+cest pourqu ce 1
+cest pourqu la 1
+cest pourqu le 1
+cest pourqu nous 1
+cest un 1
+cest un cop 1
+cest un multipl 1
+cest un sp 1
+ceux 4
+ceux ci 2
+ceux ci au 1
+ceux ci jusqu 1
+ceux ci le 1
+ceux ci peuv 1
+ceux ci pourront 1
+ceux de 1
+ceux de pag 1
+ceux effectu 1
+ceux effectu es 1
+ceux obtenus 1
+ceux obtenus par 1
+ceux pouv 1
+ceux pouv inclur 1
+ceux qu 2
+ceux qu la 1
+ceux qu ne 1
+ceux qu sont 1
+ceux r ef 1
+ceuxc 1
+cext 1
+ceyx 1
+cf 15
+cf dtc 1
+cf figur 1
+cf part 1
+cf prev 1
+cf prev sect 1
+cf sect 1
+cf whil keep 1
+cfar.umd.edu 1
+cfd 2
+cfd dat 1
+cfd dat se 1
+cfd nav 1
+cfd nav stok 1
+cff 2
+cff posit 1
+cfg 1
+cfg and run 1
+cfg ba 1
+cfg ba approach 1
+cfg compl 1
+cfg construc 1
+cfg edg 1
+cfg for avg 1
+cfg for avg2 1
+cfg for main 1
+cfg for patholog 1
+cfg for procedur 1
+cfg for sy 1
+cfg for sy0 1
+cfg for twovisit 1
+cfg nod 1
+cfg nod contain 1
+cfg path 1
+cfg requir 1
+cfg requir worst 1
+cfg traver 1
+cfg wa suggest 1
+cflag 1
+cflag part 1
+cflag part fil 1
+cfront 1
+cfront compiler 1
+cfront us 1
+cfw 1
+cfxj 1
+cg 12
+cg algorithm 1
+cg and e2 1
+cg and lancz 1
+cg bin 2
+cg bin script 2
+cg compl3 1
+cg compl3 program 1
+cg iter 1
+cg method 1
+cg method divid 1
+cg out.html 1
+cg overview.html 1
+cg proc 1
+cg91 1
+cg92 1
+cghugin 1
+cgl92 1
+ch 108
+ch 2d 2
+ch a bus 1
+ch a chaqu 1
+ch a collect 1
+ch a criter 1
+ch a eliminer 1
+ch a good 1
+ch a la 1
+ch a lappel 1
+ch a lib 1
+ch a link 1
+ch a lint 1
+ch a modif 1
+ch a nod 1
+ch a particl 1
+ch a random 1
+ch a se 1
+ch a singl 1
+ch a st 1
+ch a sub 1
+ch a supprimer 1
+ch a supprimer12 1
+ch a top 1
+ch a triangl 1
+ch a var 2
+ch a vr 1
+ch a weak 1
+ch a3 1
+ch abstrait 1
+ch abstrait du 1
+ch adapt 1
+ch afin 1
+ch afin de 1
+ch ain 1
+ch ain qu 1
+ch ait 1
+ch ait just 1
+ch al 1
+ch al eatoir 1
+ch al ec 1
+ch among practitioner 1
+ch an appropr 1
+ch an arbitr 2
+ch an educ 1
+ch an eff 1
+ch an effect 1
+ch an encod 1
+ch an init 1
+ch an oper 1
+ch an optim 1
+ch and hakim 1
+ch and ll 1
+ch and solut 1
+ch any liter 1
+ch any rl 1
+ch any var 1
+ch appropr 2
+ch appropr learn 1
+ch appropr model 1
+ch ar describ 1
+ch ar good 1
+ch ar mad 1
+ch ar reason 1
+ch arbitr 1
+ch as describ 1
+ch as interm 1
+ch as rout 1
+ch assoc 1
+ch attach 1
+ch au 1
+ch au sein 1
+ch aut 1
+ch avant 1
+ch avant lenviron7 1
+ch avec 1
+ch avec champ 1
+ch b figur 1
+ch ba 1
+ch becaus transl 1
+ch benchmark 1
+ch benchmark con 1
+ch between increm 1
+ch between nt 1
+ch board 1
+ch board etc 1
+ch boolean 1
+ch break 1
+ch break point 1
+ch by dpl 1
+ch by graph 1
+ch by rl 1
+ch c group 1
+ch ca 1
+ch cach 1
+ch cach con 1
+ch can caus 1
+ch can go 1
+ch car 2
+ch ce 1
+ch ce typ 1
+ch channel 2
+ch channel width 2
+ch chin 1
+ch cibl 1
+ch cibl du 1
+ch com 3
+ch com bloc 1
+ch com etant 1
+ch com le 1
+ch com orig 1
+ch compl 1
+ch con 1
+ch con ecutif 1
+ch concern 1
+ch concern nrd 1
+ch concr 1
+ch concr correspon 1
+ch consid 1
+ch consid eron 1
+ch construit 1
+ch construit pour 1
+ch convenabl 1
+ch convenabl la 1
+ch corp 1
+ch correpon 1
+ch correspon 1
+ch cour 1
+ch cour backtrack 1
+ch cour dan 1
+ch cour en 1
+ch cour est 1
+ch cour font 1
+ch cour na 1
+ch cour par 1
+ch cour peuv 1
+ch cour3 1
+ch cr 1
+ch cr ee 1
+ch criter 1
+ch d ag 1
+ch d ej 1
+ch d epen 1
+ch dan 2
+ch dan ce 1
+ch dan la 1
+ch dan le 2
+ch dan linstruc 1
+ch dat 1
+ch dat dicm 1
+ch daubech 1
+ch daubech orthonorm 1
+ch de 5
+ch de ce 2
+ch de fa 1
+ch de la 3
+ch de largum 1
+ch de mi 1
+ch de ne 1
+ch de partit 1
+ch de program 1
+ch de repr 2
+ch de suivr 1
+ch de tail 1
+ch de tel 1
+ch de transform 1
+ch de vecteur 1
+ch definit 1
+ch deg 1
+ch demand 1
+ch devrait 1
+ch devrait automatiqu 1
+ch devrait rendr 1
+ch diff 1
+ch diff erent 1
+ch differ control 1
+ch differ emb 1
+ch dind 1
+ch dind de 1
+ch discr 1
+ch discr event 1
+ch dispar 1
+ch doit 1
+ch doit etr 1
+ch don 1
+ch dsj 1
+ch du 3
+ch du mod 1
+ch du param 1
+ch du pr 1
+ch du vecteur 1
+ch dun 4
+ch dun algorithm 1
+ch dun chang 1
+ch dun cod 1
+ch dun fonct 1
+ch dun mod 1
+ch dun partit 1
+ch dun prim 1
+ch dun protocol 1
+ch dun repr 2
+ch dun sch 1
+ch dutiliser 1
+ch dutiliser la 1
+ch ec 1
+ch effectu 1
+ch effectu es 1
+ch either giv 1
+ch en 1
+ch en milieu 1
+ch en part 1
+ch en redon 1
+ch en som 1
+ch enregister 1
+ch enregister lec 1
+ch entr 2
+ch entr le 1
+ch entr neck 1
+ch entr pil 1
+ch entrem 1
+ch entrem el 1
+ch eron 1
+ch essentiel 1
+ch est 4
+ch est bien 1
+ch est const 1
+ch est cr 1
+ch est de 2
+ch est donc 1
+ch est empil 1
+ch est en 1
+ch est evidem 1
+ch est evit 1
+ch est lib 1
+ch est malheureus 1
+ch est qu 1
+ch est retard 1
+ch est simpl 1
+ch est virtuel 1
+ch et al 1
+ch et consid 1
+ch et cop 1
+ch et cr 1
+ch et de 1
+ch et denviron 1
+ch et dun 1
+ch et enon 1
+ch et environ 1
+ch et incr 1
+ch et la 1
+ch et le 1
+ch et peuv 1
+ch et requ 1
+ch et restaur 1
+ch et transf 1
+ch etant 1
+ch etant interpr 1
+ch evit 1
+ch evit es 1
+ch expect 1
+ch fact 1
+ch fact valu 1
+ch fait 1
+ch fait lor 1
+ch faux 1
+ch for branch 1
+ch for cl 1
+ch for confid 1
+ch for execut 2
+ch for narrow 1
+ch for posit 1
+ch for proc 1
+ch for solut 2
+ch for unshuffl 1
+ch for xs 1
+ch from standard 1
+ch giv 1
+ch group 1
+ch guard.ch 1
+ch h fd 1
+ch ii 1
+ch illustr 1
+ch imp 1
+ch imp de 1
+ch in 1
+ch in binair 1
+ch in ca 1
+ch in de 1
+ch in design 1
+ch in dm 1
+ch in prefer 1
+ch in step 1
+ch inc 1
+ch incr 1
+ch incr ement 1
+ch ind 1
+ch ind ependam 1
+ch indep 1
+ch instruc 1
+ch interconnect 1
+ch interconnect schem 1
+ch interd 1
+ch interv 1
+ch inv 1
+ch inv es 1
+ch inv tout 1
+ch is avail 1
+ch is evalu 1
+ch is explain 1
+ch is justif 1
+ch it unnec 1
+ch judicieux 1
+ch judicieux de 1
+ch jug 1
+ch jug es 1
+ch jusqu 1
+ch k0 1
+ch l ag 1
+ch la 1
+ch la prem 1
+ch langu 2
+ch le 2
+ch le cl 1
+ch le register 1
+ch lead 1
+ch li 1
+ch li es 1
+ch lib 1
+ch lib er 1
+ch link 1
+ch lor 1
+ch lor de 1
+ch lor dun 1
+ch m destin 1
+ch m emor 1
+ch m1 1
+ch m2 1
+ch ma 2
+ch ma il 1
+ch ma pa 1
+ch mad 2
+ch matr 1
+ch me 2
+ch me siz 1
+ch method 1
+ch method allow 1
+ch method mathemat 1
+ch might allow 1
+ch ming 1
+ch ming chiang 1
+ch monom 1
+ch mor sampl 1
+ch n etant 1
+ch na 1
+ch na pa 1
+ch nait 1
+ch ne 2
+ch ne de 2
+ch ne doiv 1
+ch ne est 1
+ch ne ne 1
+ch ne nest 1
+ch ne peut 1
+ch ne risqu 1
+ch ne ser 1
+ch ne soit 1
+ch ne sont 1
+ch ner 1
+ch ner le 1
+ch nest 1
+ch nest pa 1
+ch ninterv 1
+ch ninterv pa 1
+ch nod 2
+ch nondetermin 1
+ch not 1
+ch not qu 1
+ch nous 1
+ch nous conduit 1
+ch occup 1
+ch occur 1
+ch of block 1
+ch of chunk 1
+ch of cluster 2
+ch of color 1
+ch of design 1
+ch of dist 1
+ch of fit 1
+ch of key 1
+ch of match 1
+ch of output 1
+ch of path 1
+ch of prolog 1
+ch of prompt 1
+ch of reason 1
+ch of repr 1
+ch of strong 1
+ch of timeout 1
+ch of using 3
+ch of var 1
+ch ont 1
+ch opstatus 1
+ch optim 2
+ch optim dist 1
+ch ou 1
+ch ou de 1
+ch ou dun 1
+ch output 1
+ch pair 1
+ch par 2
+ch par le 2
+ch par linstruc 1
+ch par var 1
+ch par war 1
+ch parallel 1
+ch parallel reduc 1
+ch particl 1
+ch particl reason 1
+ch partiel 1
+ch partiel constitu 1
+ch partiel loop 1
+ch partiel perm 1
+ch partiel rempl 1
+ch partiel rendait 1
+ch partit 1
+ch partit el 1
+ch pathlength 1
+ch perm 1
+ch perm dobtenir 1
+ch peut 1
+ch peut etr 1
+ch peuv 1
+ch peuv etr 1
+ch peuv partager 1
+ch pivot 1
+ch plus jeun 1
+ch plus longtemp 1
+ch point 6
+ch point cr 1
+ch point creat 1
+ch point flag 1
+ch point fram 1
+ch point number 1
+ch point refer 1
+ch point stack 1
+ch point trim 1
+ch port 1
+ch port sur 1
+ch potentiel 1
+ch potentiel peut 1
+ch pour 3
+ch pour de 1
+ch pour la 1
+ch pour lappel 1
+ch pour le 2
+ch pour limiter 1
+ch pr 1
+ch pr ec 1
+ch pr esent 1
+ch problem 1
+ch profon 1
+ch qu 2
+ch qu enregister 1
+ch qu ne 1
+ch qu nous 1
+ch qu ont 2
+ch qu serait 1
+ch qu transform 1
+ch quest 1
+ch r eel 1
+ch r esid 1
+ch random 1
+ch random accord 1
+ch rempl 1
+ch ren 1
+ch ren la 1
+ch requ 1
+ch requ qu 1
+ch requ un 1
+ch rest 1
+ch rout 1
+ch s uniform 1
+ch san drapeau 1
+ch sappliqu 1
+ch sauvegard 1
+ch sav 1
+ch se 2
+ch se justif 1
+ch sen 2
+ch sen trouv 1
+ch seront 1
+ch seront abord 1
+ch sest 1
+ch sest port 1
+ch soient 1
+ch soient empil 1
+ch soit 1
+ch soit lib 1
+ch soit plut 1
+ch som interm 1
+ch som real 1
+ch sont 2
+ch sont aus 1
+ch sont compar 1
+ch sont de 1
+ch sont ensuit 1
+ch sont esqu 1
+ch sont lib 1
+ch sont possibl 1
+ch sp 1
+ch sp ecifiqu 1
+ch specif 1
+ch specif ch 1
+ch st 1
+ch st vect 1
+ch standard 1
+ch sub 2
+ch sub modl 1
+ch substr 1
+ch substr famil 1
+ch succ 1
+ch successif 1
+ch suit 2
+ch suit compon 1
+ch suiv 1
+ch suiv le 1
+ch sup 1
+ch sup lec 1
+ch superficiel 1
+ch superficiel ma 1
+ch sur 1
+ch sur deux 1
+ch sur le 1
+ch syst 1
+ch syst ematiqu 1
+ch t es 1
+ch tel 1
+ch tel quil 1
+ch test 1
+ch th appropr 1
+ch th augm 1
+ch th backlog 1
+ch th center 1
+ch th chunk 1
+ch th cluster 2
+ch th condit 1
+ch th correct 3
+ch th delaun 1
+ch th demon 1
+ch th desir 1
+ch th emb 1
+ch th equ 1
+ch th latter 1
+ch th lu 1
+ch th memor 1
+ch th method 1
+ch th model 1
+ch th mov 1
+ch th nod 1
+ch th number 1
+ch th optim 1
+ch th output 1
+ch th parameter 1
+ch th parent 1
+ch th particl 1
+ch th pattern 1
+ch th ph 1
+ch th pinout 2
+ch th proper 1
+ch th rat 2
+ch th receiver 1
+ch th rel 1
+ch th rid 1
+ch th rout 1
+ch th sit 1
+ch th smaller 1
+ch th splitter 1
+ch th worker 1
+ch th wrong 1
+ch than perform 1
+ch than tt 1
+ch their identif 1
+ch their uniqu 1
+ch their word 1
+ch threshold 2
+ch through prim 1
+ch to av 2
+ch to cr 1
+ch to describ 1
+ch to distribut 1
+ch to drop 1
+ch to go 1
+ch to identif 1
+ch to ignor 1
+ch to illustr 1
+ch to impl 1
+ch to learn 1
+ch to maintain 1
+ch to mak 1
+ch to perform 1
+ch to prov 1
+ch to redistribut 1
+ch to repr 3
+ch to retain 1
+ch to run 1
+ch to satisf 1
+ch to shift 1
+ch to us 1
+ch to view 1
+ch to writ 1
+ch tw disk 1
+ch tw pivot 1
+ch tw spac 1
+ch un 2
+ch un autr 1
+ch uniqu 1
+ch valu 1
+ch var 4
+ch var combin 2
+ch virtuel 1
+ch virtuel conduit 1
+ch virtuel dan 1
+ch virtuel de 1
+ch virtuel vn 1
+ch vn 1
+ch vr 1
+ch wer mad 1
+ch wh se 1
+ch which claus 1
+ch which prov 2
+ch wid 1
+ch wid abstract 1
+ch with arbitr 1
+ch would determin 1
+ch x02 1
+ch xn 1
+ch xn pour 1
+ch.13 1
+ch.i 1
+ch.i x3 1
+ch83 1
+ch91 2
+ch92 1
+ch94 1
+ch95 2
+chabridon 1
+chac 1
+chac al impl 1
+chac mor power 1
+chac multilevel 1
+chac multilevel octasect 1
+chac multilevel recur 1
+chac recur 1
+chac recur octasect 1
+chac user 1
+chac user guid 1
+chac utiliz 1
+chac utiliz spectr 1
+chacun 4
+chacun de 4
+chacun de argum 1
+chacun de cardin 1
+chacun de ce 3
+chacun de conflit 1
+chacun de instruc 1
+chacun de nid 1
+chacun de pil 1
+chacun de point 1
+chacun de se 1
+chacun de techniqu 1
+chacun de tr 1
+chacun de treil 1
+chacun de variabl 1
+chacun la 1
+chacun leur 1
+chacun leur qualit 1
+chacun peut 1
+chacun peut etr 1
+chacun sur 1
+chailloux 1
+chain 27
+chain alloc 1
+chain an 1
+chain and gener 1
+chain and lin 1
+chain and spread 1
+chain and transit 1
+chain ar follow 1
+chain ar regl 1
+chain ba 1
+chain ba cod 1
+chain ba parallel 1
+chain ba partit 1
+chain ba schedl 1
+chain can var 1
+chain cn 1
+chain cn n2 1
+chain cod 1
+chain con 1
+chain del 1
+chain from root4 1
+chain in row 1
+chain int thread 1
+chain leaf 1
+chain leaf nod 1
+chain length 1
+chain mont 1
+chain mont carl 1
+chain of act 1
+chain of decidecomput 1
+chain of del 1
+chain of lin 1
+chain of log 1
+chain of part 1
+chain of pointer 1
+chain of proc 1
+chain of reason 1
+chain of return 1
+chain of til 1
+chain propag 1
+chain r determin 1
+chain rdp 1
+chain rl 3
+chain rl appl 1
+chain rl execut 1
+chain spac 1
+chain tak 1
+chain th cr 1
+chain that follow 1
+chain to achief 1
+chain tok 1
+chain wh 1
+chain which led 1
+chain wil affect 1
+chain with k1 1
+chain with match 1
+chainb 1
+chainb cod 1
+chainb parallel 1
+chainb parallel cod 1
+chair 1
+chaitin 1
+chakrabort 1
+chakradhar 1
+chal 1
+challeng 28
+challeng and consider 1
+challeng and demonstr 1
+challeng designer 1
+challeng fac 1
+challeng for parallel 1
+challeng for requir 1
+challeng in system 1
+challeng obstacl 1
+challeng of computer 1
+challeng of deep 2
+challeng of econom 1
+challeng of react 1
+challeng of requir 1
+challeng problem 3
+challeng satisf 1
+challeng satisf benchmark 1
+challeng task 1
+challeng th expr 1
+challeng th origin 1
+challeng to softwar 1
+challeng tradit 1
+challeng tradit authorship 1
+challeng with 1.2gby 1
+chalmer 1
+chamber 2
+chamber and david 1
+chamberl 1
+champ 4
+champ applicatif 1
+champ applicatif qu 1
+champ argum 1
+champ argum correspon 1
+champ argum dan 1
+champ argum du 1
+champ argum dun 1
+champ argum est 1
+champ argum ou 1
+champ arit 1
+champ attribut 1
+champ attribut de 1
+champ attribut en 1
+champ attribut peut 1
+champ bp 1
+champ continu 1
+champ continu de 1
+champ continu du 1
+champ correspon 1
+champ correspon du 1
+champ cutpt 1
+champ dappl 3
+champ dappl aux 1
+champ dappl de 1
+champ dappl relativ 1
+champ dappl serait 1
+champ dappl soit 1
+champ dappl sont 1
+champ de 2
+champ de contr 1
+champ de la 1
+champ de lenregister 1
+champ de mi 1
+champ de recherch 1
+champ de substitut 1
+champ don 1
+champ don la 1
+champ don le 1
+champ du 1
+champ du champ 1
+champ du point 1
+champ est 1
+champ est ensuit 1
+champ est li 1
+champ est util 1
+champ etant 1
+champ etant mi 1
+champ non 1
+champ non encor 1
+champ point 1
+champ point de 1
+champ pr 1
+champ pr ec 1
+champ sauvegard 1
+champ sauvegard le 1
+champ sp 1
+champ sp ec 1
+champ substitut 1
+champ substitut de 1
+champ substitut est 1
+champ terminologiqu 1
+champ terminologiqu par 1
+champ valeur 1
+champ valeur don 1
+champ valeur dun 1
+champ vaut 1
+champaign 5
+champaign at urbanachampaign 1
+champaign urban 1
+chamsk 1
+chan 5
+chan and michael 1
+chan lin 1
+chanc 19
+chanc d etr 2
+chanc dobtenir 1
+chanc dobtenir un 1
+chanc for incorpor 1
+chanc of attempt 1
+chanc of comp 1
+chanc of detect 1
+chanc of execut 1
+chanc of lead 1
+chanc of retain 1
+chanc of select 1
+chanc to build 1
+chanc to discover 1
+chanc to fl 1
+chanc to prov 1
+chanc to surv 1
+chanc to und 1
+chand 2
+chandr 2
+chandran 1
+chandrasekaran 1
+chandrasekaran et al 1
+chandrasekaran gener 1
+chandrasekaran gener task 1
+chang 100
+chang a apporter 1
+chang a cl 1
+chang a glob 1
+chang a log 1
+chang a nod 1
+chang a struc 1
+chang accord 1
+chang adapt 1
+chang adapt tool 1
+chang agent 1
+chang agent act 1
+chang algorithm 1
+chang alter 1
+chang an 1
+chang and accord 1
+chang and c.c.j 1
+chang and d.g 1
+chang and describ 1
+chang and ea 1
+chang and grow 1
+chang and john 1
+chang and k.s 1
+chang and link 1
+chang and other 1
+chang and suggest 1
+chang appl 1
+chang appl sourc 1
+chang ar attempt 1
+chang ar correct 1
+chang ar costl 1
+chang ar du 1
+chang ar impract 1
+chang ar lik 1
+chang ar loc 1
+chang ar mad 1
+chang ar perform 1
+chang ar proc 1
+chang ar shift 1
+chang ast 1
+chang attempt 1
+chang automatiqu 1
+chang automatiqu la 1
+chang av 1
+chang av unnec 1
+chang becom 1
+chang between arbitr 1
+chang by click 1
+chang by mean 1
+chang by simp 1
+chang can interfer 1
+chang car 1
+chang cl 1
+chang cl funct 1
+chang cl modl 1
+chang cod 1
+chang compon 1
+chang con 1
+chang context 1
+chang cur 1
+chang cur status 1
+chang d etat 1
+chang dan 2
+chang dan le 1
+chang datab 1
+chang de 3
+chang de caract 1
+chang de droit 1
+chang de marqu 1
+chang de mesur 1
+chang de mobilit 1
+chang de propr 1
+chang de variabl 1
+chang default 1
+chang default argum 1
+chang dep 3
+chang detect 1
+chang dev 1
+chang dissolut 1
+chang dissolut detect 1
+chang du 4
+chang du mod 1
+chang du point 1
+chang du propr 1
+chang dun 1
+chang dur evalu 1
+chang dur execut 1
+chang dynam 2
+chang ea 1
+chang each tim 1
+chang ee 1
+chang ee par 1
+chang emph 1
+chang environm 2
+chang f us 1
+chang for find 1
+chang for log 1
+chang from nil 1
+chang from read 1
+chang from relev 1
+chang from tim 1
+chang funct 1
+chang ge 1
+chang ge del 1
+chang go 1
+chang guar 1
+chang hav impl 1
+chang hav perform 1
+chang impact 1
+chang impact identif 1
+chang import 1
+chang in attribut 1
+chang in behaviour 1
+chang in board 2
+chang in cel 1
+chang in compar 2
+chang in connect 1
+chang in level 1
+chang in log 1
+chang in lp 1
+chang in nod 1
+chang in observ 1
+chang in order 2
+chang in parallel 1
+chang in posit 1
+chang in pr 1
+chang in proc 2
+chang in project 1
+chang in respon 1
+chang in router 1
+chang in siz 1
+chang in spel 1
+chang in subcl 1
+chang in surfac 1
+chang in unst 1
+chang in var 1
+chang incr 1
+chang indep 1
+chang indep part 1
+chang int approxim 1
+chang involut 3
+chang involut high 1
+chang involut intern 1
+chang involut overload 1
+chang is achief 1
+chang is ba 1
+chang is mad 2
+chang is strict 1
+chang it becom 1
+chang it behavior 1
+chang it control 1
+chang it level 1
+chang it mont 1
+chang it ph 1
+chang it pt 1
+chang it st 2
+chang j loc 1
+chang kind 1
+chang lik 1
+chang loc 1
+chang mach 1
+chang mad 3
+chang mad automat 1
+chang mak 1
+chang may signif 1
+chang mod 1
+chang model 1
+chang model appear 1
+chang momentum 1
+chang momentum const 1
+chang mor loc 1
+chang mor slow 1
+chang most system 1
+chang my typ 1
+chang object 1
+chang object st 1
+chang occur 1
+chang of addr 1
+chang of nam 1
+chang of prob 1
+chang of repr 1
+chang of system 1
+chang onl fg 1
+chang onl fs1 1
+chang onl fs2 1
+chang onl fst1 1
+chang onl fst2 1
+chang onl not 1
+chang onl pr 1
+chang oper 1
+chang oper involut 1
+chang or affect 1
+chang or remov 1
+chang order 1
+chang order repl 1
+chang over tim 3
+chang owner 1
+chang p1s 1
+chang p1s pt 1
+chang pa 1
+chang pack 2
+chang part 1
+chang percol 1
+chang posit 1
+chang problem 1
+chang program 1
+chang program stat 1
+chang program sy 1
+chang propag 1
+chang propag difficult 1
+chang propag tool 1
+chang quick 1
+chang quit rapid 1
+chang quit unpredict 1
+chang rep 1
+chang repr 1
+chang request 1
+chang request ap 1
+chang request con 1
+chang request correspon 1
+chang request ec 1
+chang request exact 1
+chang request posit 1
+chang request resid 1
+chang requir 1
+chang root 1
+chang root me 1
+chang s prototyp 1
+chang sit 1
+chang slight 1
+chang slow 1
+chang slow rel 1
+chang someon el 1
+chang sont 1
+chang sont connus 1
+chang sous 1
+chang sous leff 1
+chang spec 1
+chang specif 1
+chang specif ba 1
+chang specif exampl 1
+chang specif extract 1
+chang specif langu 1
+chang specif using 1
+chang st 2
+chang task 1
+chang task domain 1
+chang technolog 2
+chang th addr 1
+chang th amount 1
+chang th an 1
+chang th appl 1
+chang th ba 1
+chang th behavior 1
+chang th behaviour 1
+chang th cl 1
+chang th configur 1
+chang th cur 3
+chang th dat 2
+chang th datab 1
+chang th design 1
+chang th dispatch 1
+chang th dist 1
+chang th environm 1
+chang th execut 1
+chang th fit 1
+chang th forml 1
+chang th funct 1
+chang th geometer 1
+chang th group 1
+chang th highest 1
+chang th import 1
+chang th infer 1
+chang th key 1
+chang th label 1
+chang th lin 1
+chang th mak 1
+chang th mean 1
+chang th nam 1
+chang th number 3
+chang th object 1
+chang th order 2
+chang th over 1
+chang th permut 1
+chang th probabil 1
+chang th problem 1
+chang th program 1
+chang th propag 1
+chang th result 2
+chang th return 1
+chang th rl 1
+chang th satisf 1
+chang th se 4
+chang th sem 1
+chang th sign 1
+chang th slot 1
+chang th st 3
+chang th task 1
+chang th topolog 1
+chang th tot 1
+chang th typ 3
+chang th underl 1
+chang th upd 1
+chang th user 1
+chang th usu 1
+chang th valu 3
+chang th view 1
+chang th weight 2
+chang that dep 1
+chang that incr 1
+chang that tak 1
+chang their control 1
+chang their key 1
+chang their loc 1
+chang their nam 1
+chang their ph 1
+chang theor 1
+chang to begin 1
+chang to error 1
+chang to isvl 1
+chang to li 1
+chang to libr 1
+chang to load 1
+chang to mod 1
+chang to nil 1
+chang to object 1
+chang to read 1
+chang to run 1
+chang transact 1
+chang tren 1
+chang typ 2
+chang typ definit 1
+chang wa requir 1
+chang wer countermand 1
+chang which occur 1
+chang wil affect 1
+chang with respect 1
+chang with tim 2
+chang with var 1
+chang world 1
+chang would perform 1
+chang your mind 1
+chang1 1
+chang2 1
+changer 2
+changer assez 1
+changer assez facil 1
+changer de 1
+changer de claus 1
+changer dun 1
+changer dun acc 1
+changer dun echec 1
+changer le 2
+changer le compteur 1
+changer le ind 1
+channel 25
+channel and channel 1
+channel and router 1
+channel ar lead 1
+channel as deriv 1
+channel as ind 1
+channel at run 1
+channel avail 1
+channel bandwidth 1
+channel bandwidth du 1
+channel bandwidth lead 1
+channel bandwidth technolog 1
+channel bus 2
+channel can introduc 1
+channel cap 1
+channel cap unit 1
+channel commun 1
+channel control 2
+channel control sign 2
+channel cr 1
+channel cycl 3
+channel cycl tim 1
+channel decomposit 1
+channel determin 1
+channel enh 1
+channel error 1
+channel establishm 1
+channel for concur 1
+channel for receiv 1
+channel for transm 1
+channel gabor 1
+channel gabor filter 1
+channel maxim 1
+channel network 1
+channel of width 1
+channel proc 2
+channel push 1
+channel requir 3
+channel requir minim 2
+channel requir wider 1
+channel result 1
+channel sect 1
+channel speed 1
+channel th number 1
+channel th valu 1
+channel to allev 1
+channel to car 2
+channel transm 1
+channel transm tim 1
+channel vid 1
+channel vid mixer 1
+channel we ch 1
+channel width 3
+channel width allow 2
+channel width commmun 2
+channel width constraint 3
+channel width etc 2
+channel width lim 1
+channel width technolog 3
+channel width wi 1
+channel width wmac 1
+channel with receiver 1
+channel0 1
+chantillon 1
+chantillon inon 1
+chantillonnon 1
+chantillonnon notr 1
+chantillonnon notr courb 1
+chaot 2
+chaot as seen 1
+chaot behaviour 1
+chap 3
+chapan 1
+chapan and ochsman 1
+chapel 1
+chapel hil 1
+chapitr 4
+chapitr caract 1
+chapitr caract er 1
+chapitr chap 1
+chapitr constitu 1
+chapitr constitu en 1
+chapitr d ecrit 1
+chapitr de 1
+chapitr de mettr 1
+chapitr devrait 1
+chapitr devrait permettr 1
+chapitr dutiliser 1
+chapitr dutiliser le 1
+chapitr est 2
+chapitr est int 1
+chapitr est la 1
+chapitr fait 1
+chapitr fait le 1
+chapitr inclut 1
+chapitr inclut de 1
+chapitr le 1
+chapitr le mod 1
+chapitr le perform 1
+chapitr ne 1
+chapitr ne prouv 1
+chapitr ne sont 1
+chapitr nest 2
+chapitr nest pa 2
+chapitr on supposer 1
+chapitr ont 1
+chapitr plusieur 1
+chapitr pour 1
+chapitr pour eliminer 1
+chapitr pr 1
+chapitr pr eliminair 1
+chapitr qu 1
+chapitr qu ce 1
+chapitr quaux 1
+chapitr quaux techniqu 1
+chapitr sappu 1
+chapitr sappu sur 1
+chapitr suiv 2
+chapitr suiv pr 1
+chapitr sur 1
+chapitr sur lalgorithm 1
+chapitr th 1
+chapitr th oriqu 1
+chapitr ult 1
+chapitr ult erieur 1
+chapitr un 1
+chapitr un adapt 1
+chapitr un classif 1
+chapitr vi 1
+chapitr vi tr 1
+chapitr1 1
+chaplin 1
+chaplin rad 1
+chaplin rad valiv 1
+chaplin y rad 1
+chapman 4
+chapman and hal 1
+chapman eng.auburn.edu 1
+chapt 1
+chapter 1
+chaqu 6
+chaqu ac 1
+chaqu ac dit 1
+chaqu acc 1
+chaqu acc es 1
+chaqu appel 1
+chaqu appel de 1
+chaqu appel termin 1
+chaqu bloc 1
+chaqu boucl 2
+chaqu boucl ne 1
+chaqu boucl par 1
+chaqu but du 1
+chaqu but non 1
+chaqu but qu 1
+chaqu ca 1
+chaqu champ 1
+chaqu champ de 1
+chaqu chang 1
+chaqu chang du 1
+chaqu chemin 1
+chaqu cl 2
+chaqu cl de 1
+chaqu cl es 1
+chaqu cl peut 1
+chaqu claus 1
+chaqu claus auxiliair 1
+chaqu claus constitut 1
+chaqu claus en 1
+chaqu claus non 1
+chaqu comp 1
+chaqu comp du 1
+chaqu conflit 1
+chaqu conflit est 1
+chaqu coupur 1
+chaqu cr 1
+chaqu cr eat 1
+chaqu don 1
+chaqu don ee 1
+chaqu echantillon 1
+chaqu ecritur 1
+chaqu ecritur co 1
+chaqu el 3
+chaqu el ement 3
+chaqu elag 1
+chaqu empil 1
+chaqu empil dun 1
+chaqu enregister 1
+chaqu enregister de 1
+chaqu entr 1
+chaqu entr ee 1
+chaqu environ 1
+chaqu environ correspon 1
+chaqu environ inclut 1
+chaqu environ le 1
+chaqu etap 2
+chaqu etap de 2
+chaqu etap du 1
+chaqu etap non 1
+chaqu etap par 1
+chaqu etat 2
+chaqu etat est 1
+chaqu etat observ 1
+chaqu evalu 1
+chaqu evalu dun 1
+chaqu ex 1
+chaqu ex ecut 1
+chaqu ext 1
+chaqu ext de 1
+chaqu fo 2
+chaqu fo qu 2
+chaqu fo quun 2
+chaqu foncteur 1
+chaqu foncteur en 1
+chaqu foncteur est 1
+chaqu individu 1
+chaqu individu de 1
+chaqu individu xi 1
+chaqu inst 1
+chaqu inst est 1
+chaqu instruc 1
+chaqu instruc dappel 1
+chaqu instruc de 1
+chaqu instruc dunif 1
+chaqu instruc unif 1
+chaqu it erat 1
+chaqu liaison 1
+chaqu liaison conditionnel 1
+chaqu m ecan 1
+chaqu marqu 1
+chaqu mi 1
+chaqu nid 1
+chaqu nid comport 1
+chaqu nid correspon 1
+chaqu nid de 1
+chaqu niveau 2
+chaqu niveau de 1
+chaqu niveau du 1
+chaqu noeud 3
+chaqu noeud de 3
+chaqu noeud evalu 1
+chaqu noeud ex 1
+chaqu pag 1
+chaqu pag conflictuel 1
+chaqu particl 1
+chaqu particl visit 1
+chaqu pil 1
+chaqu pil un 1
+chaqu point 2
+chaqu point de 1
+chaqu pr 1
+chaqu pr edicat 1
+chaqu processeur 2
+chaqu processeur au 1
+chaqu processeur dacc 1
+chaqu processeur effectu 2
+chaqu processeur en 1
+chaqu processeur ex 2
+chaqu processeur le 1
+chaqu processeur montr 1
+chaqu processeur soccup 1
+chaqu processeur trait 2
+chaqu processeur var 1
+chaqu processus 1
+chaqu processus correspon 1
+chaqu program 1
+chaqu program de 1
+chaqu program lun 1
+chaqu program tourn 1
+chaqu retour 1
+chaqu retour ar 1
+chaqu s equ 1
+chaqu s er 1
+chaqu segm 1
+chaqu tail 1
+chaqu tail de 1
+chaqu techniqu 1
+chaqu term 1
+chaqu term substitu 1
+chaqu ti 1
+chaqu ti est 1
+chaqu treil 1
+chaqu treil qu 1
+chaqu treil tj 1
+chaqu treil tk 1
+chaqu typ 1
+chaqu typ de 1
+chaqu unit 1
+chaqu valeur 1
+chaqu valeur de 1
+chaqu var 2
+chaqu var dun 1
+chaqu var est 1
+chaqu var ij 1
+chaqu var perman 1
+chaqu vecteur 1
+chaqu vecteur dit 1
+chaqu ver 1
+chaqu ver maxj 1
+char 6
+char answer 1
+char argv 1
+char cop 1
+char cop string 1
+char menu 1
+char menu string 1
+char nam 1
+char quest 1
+char quest string 1
+char read 1
+char s1 1
+char s1 abcdef 1
+char s2 1
+character 67
+character a prim 1
+character a singl 1
+character a substitut 1
+character a.1 1
+character a.1 collect 1
+character abc 1
+character accur 1
+character act 1
+character ai 1
+character allow 1
+character an inser 1
+character and amount 1
+character and digit 1
+character and habit 1
+character and ind 1
+character and lin 1
+character and stead 1
+character and unrel 1
+character ar 1
+character ar brok 1
+character ar el 1
+character ar giv 1
+character ar parameter 2
+character ar spac 1
+character as follow 4
+character as non 1
+character as work 1
+character at posit 1
+character by larger 1
+character by pipelin 1
+character by refer 1
+character by specif 1
+character cal 1
+character classif 1
+character collect 1
+character collect compar 1
+character commun 1
+character commun perform 1
+character comparison 1
+character condit 1
+character const 1
+character correspon 1
+character diagn 1
+character differ 1
+character distinct 1
+character entir 1
+character entir funct 1
+character extrem 1
+character extrem point 1
+character featur 2
+character featur belong 1
+character figur 1
+character flat 1
+character flat bo 1
+character for internet 1
+character for prim 1
+character form 1
+character from stream 1
+character funct 2
+character giv 1
+character glyph 1
+character graph 1
+character hemingw 1
+character hemingw styl 1
+character ident 1
+character in comparison 1
+character in s01 1
+character in s11 1
+character in substr 1
+character in term 1
+character ind 1
+character ind posit 1
+character instructionlevel 1
+character instructionlevel parallel 1
+character int group 1
+character lik bisect 2
+character lower 1
+character lower bound 1
+character mult 1
+character mult level 1
+character of agent 1
+character of antimatr 1
+character of constraint 1
+character of digit 1
+character of ec 2
+character of electron 1
+character of expect 1
+character of funct 1
+character of gener 1
+character of isoint 1
+character of knowledg 1
+character of mlr 1
+character of object 1
+character of parallel 1
+character of pr 1
+character of prim 1
+character of regl 1
+character of shar 1
+character of si 1
+character of sign 1
+character of ten 1
+character parallel 1
+character parallel system 1
+character ra 1
+character recognit 2
+character recognit experim 1
+character recognit using 1
+character regl 1
+character regl langu 1
+character respon 1
+character retain 1
+character scal 1
+character se 2
+character seem 1
+character seem gener 1
+character sequ 1
+character show 1
+character simil 1
+character siz 1
+character solut 1
+character spac 1
+character stand 1
+character string 1
+character termin 1
+character th cl 1
+character th degr 1
+character th difficult 1
+character th domain 1
+character th el 1
+character th iter 1
+character th perform 1
+character th port 1
+character th regl 1
+character th softwar 1
+character th solut 1
+character th uncertaint 1
+character theorem 1
+character to character 1
+character to cop 1
+character to introduc 1
+character to model 1
+character tw cl 1
+character unchang 1
+character valu 1
+character vect 2
+character which distingu 1
+character with minim 1
+characterest 2
+characteriz 4
+characteriz a particl 1
+characteriz a se 1
+characteriz th langu 1
+characteriz th reason 1
+chararcter 1
+charg 5
+charg correct 1
+charg d evaluer 1
+charg dan 1
+charg dan le 1
+charg de 2
+charg de lext 1
+charg de rapporteur 1
+charg de restaurer 1
+charg de tout 1
+charg du 2
+charg du syst 1
+charg e dan 1
+charg e de 1
+charg ee 1
+charg ee dan 1
+charg ee de 1
+charg ee du 1
+charg entr 1
+charg entr le 1
+charg entr processeur 1
+charg es 1
+charg es sont 1
+charg et dassurer 1
+charg et faux 1
+charg et la 1
+charg etc 1
+charg lor 1
+charg lor dun 1
+charg of reg 1
+charg quand 1
+charg quand le 1
+charg quel 1
+charg quel produit 1
+charg seront 1
+charg seront equilibr 1
+charg un 1
+charg un var 1
+charger 2
+charger de 1
+charger de echang 1
+charger en 1
+charger le 1
+charger le argum 1
+charger le register 1
+charger5 1
+charl 3
+charl parker 1
+charlest 1
+charlk 1
+charlk gr 1
+charlk gr co 1
+charlottesvil 1
+charm 1
+charm kernel 1
+charm kernel cod 1
+charm program 1
+charm program system 1
+charman 1
+charman snoop.inr.fr 1
+chart 4
+chart depict 1
+chart depict compl 1
+chart in figur 1
+chartyp 1
+chassin 1
+chassin de 1
+chassin de kergommeaux 1
+chat 1
+chat parser 1
+chatfield 1
+chaud 1
+chaudhar 1
+chauffer 1
+chauffer un mat 1
+chauv 1
+chc90 1
+chd 1
+chd cdr 1
+cheap 3
+cheap crit 1
+cheap crit sect 1
+cheap se 1
+cheap se associat 1
+cheap to maintain 1
+cheap writeonc 1
+cheap writeonc st 1
+cheaper 6
+cheaper and ea 1
+cheaper produc 1
+cheaper system 2
+cheaper to comput 1
+cheaper to unveil 1
+cheapest 3
+cheapest comput 1
+cheapest comput method 1
+cheapest cost 2
+cheat 1
+cheat th racetrack 1
+check 61
+check a var 1
+check a ver 1
+check al compon 1
+check al pag 1
+check al variabl 1
+check and clp 1
+check and correct 1
+check ar perform 1
+check at compil 1
+check at run 1
+check by count 1
+check by inspect 1
+check by lem 1
+check dur preproc 1
+check ev fac 1
+check fileptr 1
+check for converg 1
+check for en 1
+check for equiv 1
+check for error 1
+check for fil 1
+check for memor 1
+check for nod 1
+check for prolog 1
+check for remov 1
+check for self 1
+check for weight 1
+check funct 1
+check halt 1
+check impl 1
+check in imper 1
+check in log 1
+check in polynom 1
+check in prolog 1
+check in random 1
+check involut 1
+check is mad 1
+check is perform 1
+check is requir 1
+check is sound 1
+check it me 1
+check mechan 1
+check our calcl 1
+check overhead 1
+check ph 1
+check problem 1
+check proc 1
+check proc p1s 1
+check purp 1
+check remain 1
+check s dat 1
+check search 1
+check segm 1
+check serv 1
+check so ye 1
+check subtyp 1
+check test 1
+check test result 1
+check th argum 1
+check th compat 1
+check th concept 1
+check th contribut 1
+check th correspon 1
+check th dat 1
+check th guard 1
+check th number 1
+check th proc 1
+check th queu 1
+check th result 1
+check th st 1
+check th status 1
+check th subtyp 1
+check th test 1
+check th typ 2
+check th valu 1
+check that de 1
+check that gener 1
+check that shelf 1
+check that sign 1
+check that z00j 1
+check their integr 1
+check tim 1
+check tim error 1
+check to fl 1
+check to se 5
+check to verif 1
+check tot 1
+check tot tim 1
+check under part 1
+check whil loop 1
+check your cod 1
+checkbook 1
+checkbook bal 1
+checkbook exampl 1
+checkbook qu 1
+checkbook qu program 1
+checkcomput 1
+checkcomput commun 1
+checker 2
+checker and proof 1
+checker implem 1
+checkpoint 3
+checkpoint and buffer 1
+checkpoint log 1
+checkpoint log en 1
+checksum 1
+checksum comput 1
+cheeseman 1
+chel 2
+chellap 1
+chellap and d.doerman 1
+chellap docum 1
+chellap docum proc 1
+chem 5
+chem ar implem 1
+chem by tak 1
+chem for ext 1
+chem implem 1
+chem man 1
+chem model 1
+chem proc 2
+chem proc involut 1
+chem proc using 1
+chem research 1
+chem structur 1
+chem support 1
+chem us 1
+chemin 1
+chemin de 1
+chemin de larbr 1
+chemin lor 1
+chemin lor de 1
+chemin non 1
+chemin se 1
+chemin se comport 1
+chemin sug 1
+chemin sug er 1
+chemister 3
+chemister natom 1
+chemnitz 1
+chemnitz german 1
+chemnitz zwickau 1
+chemnitz zwickau fakult 1
+chemnitz.de 1
+chemnitz.de mehrman 1
+chemnitz.de mehrman mathematik.tu 1
+chen 15
+chen and doron 1
+cheng 6
+cheng and delor 1
+cheng and yen 1
+cheong 2
+cheong and alexander 2
+cherch 4
+cherch a acc 1
+cherch a adapter 1
+cherch a analyser 1
+cherch a appliquer 1
+cherch a le 1
+cherch a maximiser 1
+cherch a optimiser 1
+cherch a partitionner 1
+cherch a tirer 1
+cherch a transformer 1
+cherch a utiliser 1
+cherch alor 1
+cherch alor dan 1
+cherch alor un 1
+cherch donc 1
+cherch e est 1
+cherch empiriqu 1
+cherch empiriqu un 1
+cherch g en 1
+cherch le 2
+cherch le meilleur 1
+cherch le rel 1
+cherch le solut 1
+cherch pa 1
+cherch pa ic 1
+cherch quand 1
+cherch quand cest 1
+cherch tous 1
+cherch tous le 1
+cherch un ent 1
+chercheron 1
+chercheron a montrer 1
+cherchon 1
+cherchon maint 1
+cherchon pa 1
+cherchon pa pour 1
+cherchon pour 1
+cherchon pour cel 1
+cherchon un major 1
+cherit 2
+chernikov 1
+chernikov algorithm 1
+chernoff 2
+chernoff bound 2
+chernoff typ 1
+chernoff typ bound 1
+chest 1
+chest clin 1
+chest clin model 1
+chest clin problem 1
+chest x ray 1
+chestclin 1
+chestclin model 1
+chester 2
+chev 1
+chev entr 1
+chev entr deux 1
+chev sur 1
+chev sur deux 1
+chevauch 1
+chevauch pa 1
+chevauch pa de 1
+chevd4 1
+chez 1
+chez lutilisateur 1
+chez lutilisateur fin 1
+chiang 1
+chiang and ni 1
+chiarl 1
+chib 1
+chib and takash 1
+chicag 2
+chichester 4
+chichester gb 1
+chief 3
+chief execut 1
+chief execut maxrol 1
+chief execut rol 1
+chief instr 1
+chief mechan 1
+chiffr 2
+chiffr correspon 1
+chiffr correspon au 1
+chiffr ont 1
+chiffr sur 1
+chiffr sur la 1
+chihar 1
+chikayam 1
+chil 2
+child 15
+child 8th 1
+child 8th phr 1
+child an oper 1
+child and proc 1
+child caus 1
+child creat 1
+child findnextnod 1
+child is sent 1
+child is smaller 1
+child may involut 1
+child nod 3
+child nod n1 1
+child of nod 2
+child of posit 1
+child of root 1
+child or proc 1
+child or sibl 1
+child proc 1
+child subtr 1
+child subtransact 1
+child to follow 1
+childr 15
+childr and parent 1
+childr ar car 1
+childr befor sen 1
+childr block 1
+childr block contain 1
+childr hav label 1
+childr might simplif 1
+childr nod 2
+childr of correspon 1
+childr pl 1
+childr pointer 1
+chin 7
+chin chin 1
+chin et le 1
+chin liang 1
+chin notam 1
+chin perm 1
+chin perm alor 1
+chinebr 1
+chinebr esil 1
+chip 10
+chip compiler 1
+chip compiler system 1
+chip dom 2
+chip in order 1
+chip memor 1
+chip memor subsystem 1
+chip modl 1
+chip pack 1
+chip pack buffer 1
+chip pfefferkorn 1
+chip pfefferkorn cp 1
+chip real est 1
+chip with ten 1
+chirst 1
+chirst cal 1
+chirurg 1
+chirurg ou 1
+chirurg ou la 1
+chisig 1
+chisig annu 1
+chlamtac 1
+chograph 1
+choicepoint 2
+choicepoint and argum 1
+choicepoint and environm 1
+choisir 3
+choisir a lec 1
+choisir donc 1
+choisir donc plut 1
+choisir dy 1
+choisir dy enlever 1
+choisir entr 1
+choisir entr le 1
+choisir la 1
+choisir le 1
+choisir le configur 1
+choisir un 1
+choisir un ecritur 1
+choisir un point 1
+choisit 2
+choisit al 1
+choisit al eatoir 1
+choisit le 1
+choisit le vecteur 1
+choisit un vecteur 1
+cholesk 3
+cholesk decomposit 1
+cholesk fact 1
+cholesk pour 1
+cholesk pour matr 1
+cholesterollevel 1
+chom 1
+chomick 1
+chop 1
+chord 4
+chord cycl 1
+chord graph 3
+chord graph adm 1
+chord graph form 1
+chord symbol 1
+choth 1
+chou 3
+chou fasman 1
+chou fasman algorithm 1
+choudh 1
+chow 2
+chow and david 1
+chow notkin 1
+chpt1 1
+chpt2 1
+chr 15
+chr albrecht 2
+chr albrecht universitat 1
+chr approach 1
+chr as follow 1
+chr by implem 1
+chr chr 1
+chr constraint 1
+chr delcourt 1
+chr deserv 1
+chr doppler 1
+chr doppler labor 1
+chr eclip 1
+chr eclip libr 1
+chr eisenb 1
+chr falout 1
+chr falout2 1
+chr finit 1
+chr finit domain 1
+chr holzbaur 1
+chr houck 1
+chr langu 1
+chr langu mean 1
+chr mean 1
+chr nikolaou 1
+chr queinnec 1
+chr solut 1
+chr solver 1
+chr solver expr 1
+chr solver involut 1
+chr solver pr 1
+chr using 1
+chr wer ch 1
+chr9 1
+christaller 1
+christaller phon 1
+christchurch 1
+christerson 1
+christin 1
+christin pinot 1
+christooeel 1
+christoph 1
+christoph tietz 1
+christopher 2
+christopher burdorf 1
+chrom 1
+chrom cl 1
+chromosom 1
+chromosom c1 1
+chromosom de 1
+chromosom de tail 1
+chromosom du 1
+chromosom du sch 1
+chromosom engendr 1
+chromosom engendr entr 1
+chromosom est 1
+chromosom est direct 1
+chromosom humain 1
+chromosom ou 1
+chromosom ou de 1
+chromosom produit 1
+chromosom produit par 1
+chromosom sur 1
+chromosom sur tous 1
+chromosomiqu 1
+chron 1
+chron log 1
+chronolog 4
+chronolog adm 2
+chronolog backtrack 2
+chronolog execut 1
+chronolog execut model 1
+chronolog is ba 1
+chronolog is built 1
+chronolog parallel 1
+chronolog parallel execut 1
+chronolog program 2
+chronolog program look 1
+chronolog rel 1
+chronolog virtu 1
+chronolog virtu mach 1
+chronologiqu 1
+chronologiqu en 1
+chronologiqu en ca 1
+chronopoul 1
+chruscick 1
+chtcon 1
+chtcon cdr 1
+chtnil 1
+chtnil cdr 1
+chu 4
+chu nk1c 1
+chu nk1c hunk 1
+chu40 1
+chub 1
+chub greg 1
+chub greg turner 1
+chub research 1
+chuck 1
+chuck thacker 1
+chung 3
+chung kuan 1
+chung kuan cheng 1
+chung yew 1
+chunk 6
+chunk allow 1
+chunk allow output 1
+chunk and st 1
+chunk ar random 1
+chunk ar read 1
+chunk ar reserv 1
+chunk ar st 1
+chunk between build 1
+chunk chunk 1
+chunk chunk switch 1
+chunk contain 1
+chunk correspon 1
+chunk counter 1
+chunk cur 1
+chunk displ 1
+chunk field 1
+chunk field prov 1
+chunk hav mbr 1
+chunk id 1
+chunk identif 1
+chunk is discard 1
+chunk is prev 1
+chunk is read 1
+chunk is therefor 1
+chunk is thrown 1
+chunk is transm 1
+chunk is writ 1
+chunk list 1
+chunk loc 1
+chunk loc point 1
+chunk minimiz 1
+chunk of 4n 1
+chunk of centr 1
+chunk of dat 2
+chunk of equ 1
+chunk of interest 1
+chunk of singl 1
+chunk or sect 1
+chunk point 1
+chunk pointer 1
+chunk pointer becom 1
+chunk pointer ec 1
+chunk prov 1
+chunk read 1
+chunk request 1
+chunk request server 1
+chunk requeststim 1
+chunk resid 1
+chunk schedl 1
+chunk siz 3
+chunk siz affect 1
+chunk siz agr 1
+chunk siz copt 1
+chunk siz hold 1
+chunk siz minimiz 1
+chunk siz select 1
+chunk siz ten 1
+chunk siz vs 1
+chunk sizebig 1
+chunk sizebig chunk 1
+chunk switch 1
+chunk switch crossbar 1
+chunk that ind 1
+chunk to output 1
+chunk to server 1
+chunk transfer 1
+chunk typ 1
+chunk typ lead 1
+chunk wid 1
+chunk wid crossbar 1
+chunk wid ram 1
+chunk within tim 1
+chunk writ 1
+chunk.2 1
+chunkchunkchunkchunkdatanpnc 1
+chunkj 1
+chunkk 1
+chunkw 1
+chunkw crossbar 1
+church 2
+church rosser 2
+church rosser proper 1
+church rosser theorem 1
+chut 1
+chut e jusquau 1
+ci 29
+ci appar 1
+ci apr 2
+ci apr es 2
+ci ar const 1
+ci au 2
+ci au cour 1
+ci au niveau 1
+ci aux 1
+ci aux diff 1
+ci bien 1
+ci bien inf 1
+ci c jyij 1
+ci cl 1
+ci cl prec 1
+ci de 4
+ci de calcl 1
+ci de ce 1
+ci de lordr 1
+ci dessus 5
+ci dessus en 1
+ci dessus est 2
+ci dessus ob 1
+ci dessus permettrait 1
+ci dessus qu 1
+ci dessus se 1
+ci di 1
+ci diff 1
+ci diff erent 1
+ci doit 1
+ci doit provoquer 1
+ci ec 1
+ci est 1
+ci est mu 1
+ci etait 1
+ci etait equiv 1
+ci fj 1
+ci fj cj 1
+ci i0 1
+ci i0 nt 1
+ci in sect 1
+ci jusqu 1
+ci lair 1
+ci lair techn 1
+ci le 2
+ci le algorithm 1
+ci le hypoth 1
+ci li 1
+ci loccur 1
+ci loccur dun 1
+ci ment 1
+ci ment la 1
+ci ment le 1
+ci ment loc 1
+ci min 1
+ci mod 1
+ci mod mi 1
+ci n etant 1
+ci nc 1
+ci nc da 1
+ci ne 1
+ci ne jou 1
+ci nx 1
+ci on shar 1
+ci peut 1
+ci peut etr 1
+ci peuv 2
+ci peuv donc 1
+ci peuv etr 1
+ci port 1
+ci port sur 1
+ci pour 1
+ci pour le 1
+ci pourront 1
+ci pourront donc 1
+ci quil 1
+ci quil apport 1
+ci r ef 1
+ci rar 1
+ci schedl 1
+ci schedl priorit 1
+ci sen 1
+ci serait 1
+ci serait encor 1
+ci tant 1
+ci tant el 1
+ci tr 1
+ci.oh 7
+ci.oh st.edu 7
+ci.oh st.edu april 1
+ci.oh st.edu phon 1
+ci.ufl.edu 2
+ci.ufl.edu computer 1
+ci.ufl.edu ted 1
+ci.ufl.edu ted ci.ufl.edu 1
+ciarfel 1
+cibl 2
+cibl de 1
+cibl de branch 1
+cibl don 1
+cibl don ee 1
+cibl du 1
+cibl du compilateur 1
+cibl du retour 1
+cibl et peut 1
+cibl etait 1
+cibl etait init 1
+cibl etant 1
+cibl etant le 1
+cic 2
+cic handbook 1
+cicekl 1
+cider 1
+cider si 1
+cider si deux 1
+cidessus 1
+cidij 1
+cidij ni 1
+cienc 1
+cienc de 1
+cienc de la 1
+cient 1
+cient algorithm 1
+cient and port 1
+cient as prev 1
+cient fetch 1
+cient for parallel 1
+cient graph 1
+cient graph color 1
+cient hardwar 1
+cient hardwar support 1
+cient if tx 1
+cient implem 1
+cient parallel 1
+cient prior 1
+cient prior queu 1
+cient probabil 1
+cient probabil algorithm 1
+cient select 1
+cient select algorithm 1
+cient to catch 1
+cient to compl 1
+cient to keep 1
+ciepielewsk 1
+cif 1
+cif cdr 1
+cifcon 1
+cifcon cdr 1
+cifnil 1
+cifnil cdr 1
+cig 1
+cij 4
+cij being simpl 1
+cij denot 1
+cij is equ 1
+cijyj 1
+cijyj di 1
+cikm 1
+cimitil 1
+cinq 1
+cinq principaux 1
+circ 1
+circl 15
+circl a tok 1
+circl condit 1
+circl exact 1
+circl import 1
+circl import circl 1
+circl ind 1
+circl interpreter 1
+circl matr 1
+circl matr m1 1
+circl mean 1
+circl proper 1
+circl proper transl 1
+circl repr 2
+circl repr constraint 1
+circl satisf 1
+circl shift 1
+circl stack 1
+circl th tok 1
+circl using 1
+circl.squar.sqr 1
+circl.squar.sqr or squar.sqr 1
+circuit 13
+circuit a montr 1
+circuit and system 1
+circuit anticip 1
+circuit ar multiplec 1
+circuit ar transm 1
+circuit board 1
+circuit cluster 1
+circuit comprim 1
+circuit comprim tot 1
+circuit cpu 1
+circuit cpu secon 1
+circuit de 1
+circuit de man 1
+circuit de var 1
+circuit de variabl 1
+circuit ee 1
+circuit est 1
+circuit est sp 1
+circuit exampl 1
+circuit fault 1
+circuit fault an 1
+circuit fault detect 1
+circuit forml 1
+circuit inclus 1
+circuit int 1
+circuit int egr 1
+circuit layout 1
+circuit ne 1
+circuit ne chang 1
+circuit nest 1
+circuit number 1
+circuit of sat 1
+circuit ou 1
+circuit ou de 1
+circuit r eduit 1
+circuit shel93 1
+circuit supprim 1
+circuit supprim tout 1
+circuit theor 1
+circuiter 1
+circuiter lanc 1
+circuiter lanc var 1
+circulair 1
+circulair de 1
+circulair de tel 1
+circumcenter 1
+circumcenter ar lying 1
+circumcircl 1
+circumcircl would contain 1
+circumfer 2
+circumfer keep 1
+circumscrib 1
+circumscrib behaviour 1
+circumscript 1
+circumst 9
+circumst an act 1
+circumst po 1
+circumst th deliv 1
+circumst th identif 1
+circumst wh 1
+circumv 4
+circumv es 1
+circumv es funct 1
+circumv of fold 1
+circumv th difficult 1
+circumv th problem 1
+cisc 1
+cisc architectur 1
+cisc architectur exhibit 1
+cisrc 4
+cisrc tr 1
+cisrc tr37 1
+cit 19
+cit aus 1
+cit aus la 1
+cit earl 1
+cit ee 2
+cit ee sont 1
+cit har 1
+cit larticl 1
+cit larticl de 1
+cit march 1
+cit of leed 1
+cit pa 1
+cit pa exempl 1
+cit.gu.edu.au 1
+citer 4
+citer entr 1
+citer entr autr 1
+citer ivy 1
+citer la 2
+citer la librair 1
+citer la recherch 1
+citer le 1
+citer le solut 1
+citer quelqu 1
+citer quelqu un 1
+citicorp 1
+citiz 2
+citiz status 1
+cj 8
+cj 8j 1
+cj dj 1
+cj dj ej 1
+cj p cj 1
+cj pd 1
+cjm 1
+cjnpj 1
+cjnpj accept 1
+cjnpj accept occur 1
+cjv0j 1
+ck 7
+ck 1u1 1
+ck ar denot 1
+ck by buck 1
+ckpk 1
+cl 109
+cl 1st 1
+cl 1st order 1
+cl a construc 1
+cl a repetit 1
+cl a termin 1
+cl ad 1
+cl ad equ 1
+cl algorithm 1
+cl an altern 1
+cl and abstract 1
+cl and behavior 1
+cl and dat 1
+cl and default 1
+cl and en 1
+cl and encapsl 1
+cl and fil 1
+cl and funct 1
+cl and inst 1
+cl and loc 1
+cl and metacl 1
+cl and object 1
+cl and oper 1
+cl and opt 1
+cl and slot 1
+cl and task 1
+cl and thread 1
+cl and user 1
+cl and weak 1
+cl ar cl 1
+cl ar construc 1
+cl ar contain 1
+cl ar defin 2
+cl ar equ 1
+cl ar exclus 1
+cl ar hexagon 1
+cl ar mark 1
+cl ar merg 1
+cl ar repr 1
+cl ar respon 1
+cl ar stack 1
+cl as compl 1
+cl as follow 1
+cl as p.ai 1
+cl assoc 1
+cl at level 1
+cl at random 1
+cl ba 2
+cl ba object 1
+cl be form 1
+cl becom 1
+cl becom smaller 1
+cl being learn 1
+cl bound 1
+cl browser 1
+cl by chang 1
+cl c.f 1
+cl c1 1
+cl c2 1
+cl ca 2
+cl cal 1
+cl cal comput 1
+cl cal ensur 1
+cl candid 1
+cl ch 1
+cl citiz 2
+cl citiz status 1
+cl cl 4
+cl cl inh 1
+cl cl nam 1
+cl cl opt 1
+cl cl sd 1
+cl cl slot 1
+cl cl vocabl 1
+cl cl1 2
+cl classb 1
+cl clientcl 1
+cl cnf 1
+cl cnf forml 1
+cl cod 1
+cl com 1
+cl com etant 1
+cl comput 1
+cl comput inst 1
+cl computer 1
+cl con 2
+cl conform 1
+cl connect 1
+cl connectiv 1
+cl constraint 1
+cl construc 1
+cl construc p.e.resultexpr 1
+cl contain 1
+cl contain exact 1
+cl container 1
+cl correct 1
+cl correspon 1
+cl could enforc 1
+cl could multiplec 1
+cl cur 1
+cl dadm 1
+cl dan 1
+cl dan ce 1
+cl dappl 1
+cl de 5
+cl de congru 1
+cl de lang 1
+cl de mach 2
+cl de pag 1
+cl de program 1
+cl de syst 1
+cl dealt 1
+cl decl 3
+cl def 2
+cl def client 1
+cl def perform 1
+cl defin 1
+cl defin using 1
+cl definit 5
+cl definit form 1
+cl denot 2
+cl dep 1
+cl describ 1
+cl describ fundam 1
+cl descript 1
+cl descript nam 1
+cl determin 1
+cl determin qu 1
+cl dict 2
+cl dict graph 2
+cl dict learn 1
+cl dict transform 1
+cl direct 1
+cl direct initarg 1
+cl direct relev 1
+cl direct supercl 1
+cl distribut 1
+cl distribut funct 1
+cl dobj 1
+cl dp 1
+cl dp ontolog 1
+cl driv 1
+cl eff 1
+cl eff sd 1
+cl el 1
+cl embod 1
+cl empl 1
+cl encapsl 3
+cl encapsl commun 1
+cl encapsl distribut 1
+cl ent 1
+cl es 5
+cl es dan 2
+cl es egal 1
+cl et al 1
+cl evalu 1
+cl evalu point 1
+cl event 1
+cl evolut 1
+cl exampl 1
+cl exceed 1
+cl exceed log 1
+cl explicit 1
+cl expr 1
+cl f di 1
+cl field 1
+cl field requir 1
+cl fold 1
+cl fold unfold 1
+cl follow 2
+cl for condit 1
+cl for funct 1
+cl form 6
+cl form forml 1
+cl form solut 1
+cl forml 2
+cl found 2
+cl from object 1
+cl funct 2
+cl garb 1
+cl gener 1
+cl gener funct 1
+cl gf 1
+cl gf cl 1
+cl graph 1
+cl ha multipl 1
+cl ha return 1
+cl ha start 1
+cl hav measur 1
+cl hav weak 1
+cl hav zer 1
+cl hierarch 6
+cl hierarch found 1
+cl id 1
+cl impl 1
+cl impl log 1
+cl in alphab 1
+cl in an 1
+cl in cl 1
+cl in domain1 1
+cl in domain2 1
+cl in eulisp 1
+cl in object 1
+cl inclus 2
+cl inclus datab 1
+cl inf.puc 1
+cl inf.puc ri.br 1
+cl infer 1
+cl infer rl 1
+cl inh 1
+cl inh sd 1
+cl inherit 1
+cl inherit structur 1
+cl inherit tr 1
+cl init 1
+cl init protocol 1
+cl initarg 1
+cl initarg cl 1
+cl inst 1
+cl inst siz 1
+cl introduc 1
+cl introduc run 1
+cl introspect 1
+cl introspect oper 1
+cl involut 2
+cl is absorb 1
+cl is analog 1
+cl is appl 1
+cl is character 1
+cl is cl1 1
+cl is count 1
+cl is defin 2
+cl is fil 1
+cl is finit 1
+cl is gener 2
+cl is modif 1
+cl is reach 1
+cl is shown 1
+cl is spec 1
+cl is stack 1
+cl is writ 1
+cl it templ 1
+cl item 1
+cl itself follow 1
+cl k st 1
+cl le 1
+cl le a1 1
+cl le prototyp 1
+cl libr 2
+cl libr incr 1
+cl libr ten 1
+cl lisp 1
+cl lisp typ 1
+cl list 1
+cl list schedl 1
+cl loc 1
+cl loc propag 1
+cl log 2
+cl log connectiv 1
+cl log contain 1
+cl log emerg 1
+cl log treat 1
+cl log unsuit 1
+cl loop 3
+cl loop integr 1
+cl loop iter 1
+cl loop system 1
+cl lr 1
+cl m gi 1
+cl mac 1
+cl mac snp 1
+cl man 1
+cl man record 1
+cl map 1
+cl map problem 1
+cl match 3
+cl may mak 1
+cl mcmillan 1
+cl me 1
+cl me object 1
+cl member 1
+cl member funct 1
+cl membership 1
+cl metaobj 1
+cl metaobject 2
+cl metaobject point 1
+cl method 5
+cl method cl 1
+cl method st 1
+cl model 1
+cl modif 1
+cl modl 1
+cl monit 1
+cl n deep 1
+cl nam 4
+cl nam cl 1
+cl nam supercl 1
+cl nearb 1
+cl network 1
+cl nl 1
+cl no longer 1
+cl nodetyp 1
+cl nodetyp fe 1
+cl nodetypeb 1
+cl not 1
+cl not acc 1
+cl not decl 1
+cl number 1
+cl object 2
+cl object contain 1
+cl oe 1
+cl of ai 1
+cl of aj 1
+cl of algorithm 3
+cl of an 1
+cl of antimatr 1
+cl of appl 6
+cl of approxim 1
+cl of argum 1
+cl of ch 1
+cl of chang 2
+cl of circuit 1
+cl of coh 1
+cl of commun 1
+cl of compon 1
+cl of condit 1
+cl of configur 1
+cl of constraint 1
+cl of dat 1
+cl of den 1
+cl of denot 1
+cl of deriv 1
+cl of design 1
+cl of discr 1
+cl of docum 1
+cl of ea 1
+cl of equiv 1
+cl of error 1
+cl of eulisp 1
+cl of expr 1
+cl of failur 1
+cl of finit 1
+cl of forml 1
+cl of funct 3
+cl of glob 1
+cl of graph 3
+cl of ground 1
+cl of gsm 1
+cl of hash 1
+cl of herm 1
+cl of hierarch 2
+cl of inst 1
+cl of lancz 1
+cl of level 1
+cl of libr 1
+cl of lin 1
+cl of log 1
+cl of lr 1
+cl of mach 1
+cl of major 1
+cl of matr 1
+cl of me 1
+cl of metaobject 1
+cl of method 1
+cl of mult 1
+cl of near 1
+cl of nest 1
+cl of network 2
+cl of nonblock 1
+cl of nonconflu 1
+cl of nondetermin 1
+cl of nonmonot 1
+cl of np 1
+cl of object 2
+cl of observabl 1
+cl of pattern 1
+cl of polynom 1
+cl of posit 1
+cl of prim 1
+cl of prior 1
+cl of problem 4
+cl of proc 1
+cl of program 1
+cl of protocol 1
+cl of pselect 1
+cl of puzzl 1
+cl of quer 1
+cl of random 1
+cl of rat 1
+cl of recogn 1
+cl of reg 1
+cl of schedl 1
+cl of scheduler 2
+cl of scientif 1
+cl of se 1
+cl of server 1
+cl of sign 1
+cl of softwar 2
+cl of sourc 1
+cl of structur 2
+cl of succ 1
+cl of support 1
+cl of switch 1
+cl of synchron 1
+cl of term 1
+cl of textur 1
+cl of typ 1
+cl of unit 1
+cl of workflow 1
+cl oper 2
+cl oper elimin 1
+cl opt 1
+cl opt specif 1
+cl optim 1
+cl optim search 1
+cl or brok 1
+cl or cl 1
+cl or comput 1
+cl or el 1
+cl organ 1
+cl p pol 1
+cl parenth 1
+cl parm 1
+cl parm le 1
+cl particl 1
+cl pathlength 1
+cl pathlength db 1
+cl pattern 1
+cl pd 1
+cl per fil 1
+cl peut 1
+cl peut etr 1
+cl po 1
+cl point 1
+cl polygon 1
+cl polyhedr 1
+cl polynom 1
+cl pr 1
+cl pr calculus 1
+cl prec 1
+cl prec list 1
+cl proposit 1
+cl proposit calculus 1
+cl ptim 1
+cl ptim ptim 1
+cl redefinit 1
+cl rel 10
+cl rel ind 1
+cl rel minim 1
+cl relationship 2
+cl renam 1
+cl reorgan 1
+cl reorgan approach 1
+cl repr 1
+cl requir 3
+cl requir recompil 1
+cl resembl 3
+cl resembl standard 1
+cl respon 1
+cl result 1
+cl rol 1
+cl rr 1
+cl rr stat 1
+cl s de 1
+cl sadm 1
+cl sadm regroup 1
+cl sasm 1
+cl scatter 1
+cl sd 1
+cl sd eff 1
+cl se 2
+cl separ 2
+cl separ criter 1
+cl sf2c 1
+cl sf2c dt 1
+cl should impl 1
+cl sieckenius 1
+cl sieckenius de 1
+cl sign 1
+cl sign proc 1
+cl simpl 2
+cl simpl funct 1
+cl simpl polygon 1
+cl slot 1
+cl slot descript 1
+cl slot spec 1
+cl solut 1
+cl sont 2
+cl sont composabl 1
+cl sont lipsc 1
+cl sp 1
+cl sp rl 1
+cl sp vl 1
+cl specif 2
+cl specif behaviour 1
+cl specif funct 1
+cl specif modl 1
+cl stat 1
+cl string 1
+cl structur 2
+cl structur chang 1
+cl structur cl 1
+cl structur defin 1
+cl structur evolut 1
+cl structur integr 1
+cl supercl 1
+cl support 1
+cl support loc 1
+cl support singl 1
+cl system 2
+cl system mc 1
+cl tabl 1
+cl tak 1
+cl tak plac 1
+cl tap 1
+cl tap del 1
+cl techniqu 1
+cl tel 1
+cl tel condit 1
+cl templ 2
+cl term 1
+cl term remain 1
+cl test 1
+cl th character 1
+cl th entr 1
+cl th loc 1
+cl th number 1
+cl th parser 1
+cl th recent 1
+cl than p.ai 1
+cl thread 1
+cl thread condit 1
+cl ti 1
+cl to accompl 1
+cl to build 1
+cl to erg 1
+cl to impl 1
+cl tok 1
+cl tr 1
+cl tr es 1
+cl transform 2
+cl tx 1
+cl tx cl 1
+cl under complem 1
+cl under composit 1
+cl under intersect 1
+cl under project 1
+cl under resolut 1
+cl under squar 1
+cl under substitut 1
+cl under tak 1
+cl under term 1
+cl usu mean 1
+cl v contain 1
+cl var 1
+cl variabl 1
+cl vect 1
+cl vect correspon 1
+cl vocabl 1
+cl vocabl method 1
+cl w inherit 1
+cl walk 1
+cl wc1 1
+cl wc2 1
+cl we consider 1
+cl wer obtain 1
+cl which compr 1
+cl which conform 1
+cl which dict 1
+cl which exemplif 1
+cl which po 1
+cl which repr 1
+cl wil contain 1
+cl wil incr 1
+cl wil reach 1
+cl wil rec 1
+cl with automat 1
+cl with disc 1
+cl with good 2
+cl with part 1
+cl with reduc 1
+cl with simil 1
+cl with weak 1
+cl yield 1
+cl1 4
+cl1 ar inherit 1
+cl1 cl2 1
+cl1 with prob 1
+cl2 4
+cl2 if cl1 1
+cl2 iff 1
+cl2 iff cl2 1
+cl3 3
+cl3 soft 1
+cl3 soft dec 1
+cl82 1
+cl89 1
+cl90 1
+cl91 1
+claim 34
+claim about optim 1
+claim any particl 1
+claim by induc 1
+claim by log 1
+claim cancel 1
+claim hold 2
+claim int disjunct 1
+claim mad 1
+claim nonequiv 1
+claim rewrit 1
+claim sag 1
+claim show 1
+claim th cl 1
+claim th result 1
+claim that hal 1
+claim that maintain 1
+claim that p1 1
+claim that soft 1
+claim that theorem 1
+claim their approach 1
+claim their produc 1
+claim to mak 1
+claim wa mad 1
+claim which appear 1
+clair 5
+clair appar 1
+clair appar tr 1
+clair de 1
+clair de diver 1
+clair etr 1
+clair etr perturb 1
+clair lobjectif 1
+clair lobjectif vi 1
+clair pa 2
+clair pa compat 1
+clair pa le 1
+clair plus jeun 1
+clair qu 4
+clair qu ce 1
+clair qu la 2
+clair quun 1
+clair quun transform 1
+clair requ 1
+clair requ lor 1
+clair se 1
+clair se diff 1
+clamp 3
+clamp a maxim 1
+clamp an input 1
+clamp of valu 1
+clamp on input 1
+clamp th minimumand 1
+clamp th st 1
+clanc 1
+clanc w.j 1
+clarendon 5
+clarendon pr 5
+clarendon pr oxford 1
+clarif 11
+clarif certain 1
+clarif certain inst 1
+clarif certain pa 1
+clarif in sect 1
+clarif la 1
+clarif of elicit 1
+clarif of opin 1
+clarif point 1
+clarif prec 1
+clarif prec rel 1
+clarif th cod 1
+clarif th condit 1
+clarif th result 1
+clarif th rol 1
+clarif why 1
+clarif why handl 1
+clark 7
+clark model 1
+clark pittman 1
+clark pittman ltd 1
+clark theor 1
+clash 4
+clash between schem 1
+clash can ar 1
+clash occur 1
+clash tel 1
+clash tel condit 1
+classb 1
+classb program 1
+classb with prob 1
+classer 1
+classer ce 1
+classer ce mach 1
+classif 43
+classif a fac 1
+classif a sub 1
+classif accord 1
+classif accur 1
+classif accur start 1
+classif and an 1
+classif and conver 1
+classif and discrim 1
+classif and sc 1
+classif and segm 1
+classif and subject 1
+classif and therefor 1
+classif and us 1
+classif ar correct 1
+classif as bottom 1
+classif as cooper 1
+classif as genet 1
+classif as nc 1
+classif as posit 1
+classif automatiqu 1
+classif ba 1
+classif ba compil 1
+classif by modif 1
+classif by propag 1
+classif by ray 1
+classif by using 1
+classif chang 1
+classif character 1
+classif cnf 1
+classif cnf forml 1
+classif correct 1
+classif de 3
+classif de architectur 1
+classif de mach 1
+classif de ordinateur 1
+classif de pag 1
+classif de pr 1
+classif de rain 1
+classif de variabl 1
+classif dep 1
+classif detect 1
+classif diff 1
+classif diff erent 1
+classif fram 1
+classif fram ba 1
+classif inclus 1
+classif incorrect 1
+classif inform 1
+classif input 1
+classif input vect 1
+classif is design 1
+classif is fin 1
+classif is typ 1
+classif le 1
+classif le variabl 1
+classif lensembl 1
+classif lensembl de 1
+classif mor garb 1
+classif ne 1
+classif network 1
+classif neur 1
+classif neur network 1
+classif nous 1
+classif nous perm 1
+classif np 1
+classif np compl 1
+classif obtain 1
+classif of babel 1
+classif of fac 1
+classif of handwrit 1
+classif of imag 1
+classif of inform 1
+classif of newspaper 1
+classif of scheduler 1
+classif of textur 1
+classif on classif 1
+classif on fac 1
+classif opposit 1
+classif optim 1
+classif optim problem 1
+classif ordin 1
+classif ordin typ 1
+classif perform 1
+classif ph 1
+classif ph dec 1
+classif polyhedr 1
+classif possibil 1
+classif pour 1
+classif pour distinguer 1
+classif problem 2
+classif problem domain 1
+classif quick 1
+classif quick using 1
+classif rat 1
+classif rat compar 1
+classif reg 1
+classif regl 1
+classif regl variabl 1
+classif rl 1
+classif schem 1
+classif schem work 1
+classif stag 1
+classif system 2
+classif task 2
+classif techniqu 1
+classif temporair 1
+classif temporair perman 1
+classif textur 1
+classif textur discrim 1
+classif th fault 1
+classif th input 1
+classif that retain 1
+classif to av 1
+classif to ge 1
+classif to gener 1
+classif typ 1
+classif typ oper 1
+classif using 2
+classif using overlap 1
+classif util 1
+classif util ee 1
+classif vs 1
+classif wa ch 1
+classif wh output 1
+classif with tr 2
+classioc 1
+classioc and sc 1
+classiqu 6
+classiqu a partir 1
+classiqu avec 2
+classiqu avec la 1
+classiqu concat 1
+classiqu consid 1
+classiqu consid erent 1
+classiqu d evalu 1
+classiqu dan 1
+classiqu dan de 1
+classiqu de 4
+classiqu de boucl 1
+classiqu de coupur 1
+classiqu de gest 1
+classiqu de la 2
+classiqu de mont 1
+classiqu de perform 1
+classiqu de transform 1
+classiqu de vecteur 1
+classiqu de von 1
+classiqu destampil 1
+classiqu doptim 2
+classiqu doptim de 1
+classiqu ecrivain 1
+classiqu ecrivain ecrivain 1
+classiqu en 2
+classiqu en faveur 1
+classiqu en soulign 1
+classiqu et contiendr 1
+classiqu et de 1
+classiqu ident 1
+classiqu lorsquon 1
+classiqu lorsquon doit 1
+classiqu nous 1
+classiqu nous perm 1
+classiqu ont 1
+classiqu port 1
+classiqu port sur 1
+classiqu pour 2
+classiqu pour lempl 1
+classiqu pour maintenir 1
+classiqu qu 2
+classiqu qu est 1
+classiqu qu le 1
+classiqu r eutil 1
+classiqu se 1
+classiqu se traduit 1
+classiqu sont 1
+classiqu sont impr 1
+classiqu suiv 1
+classiqu suiv de 1
+classiqu sur 2
+classiqu sur de 1
+classiqu sur le 1
+classiqu tel 1
+classiqu tel qu 1
+classroom 2
+claud 3
+claud bernard 1
+claud bernard lyon 1
+claud syr 1
+claud syr deserv 1
+claud syr en 1
+claus 23
+claus a b0 1
+claus a claus 1
+claus a env1 1
+claus a lautr 1
+claus afin 1
+claus afin de 1
+claus afin dimpl 1
+claus after renam 1
+claus al cover 1
+claus alor 1
+claus alor qu 1
+claus alw termin 1
+claus and displ 1
+claus and goal 1
+claus and gu 1
+claus and quer 1
+claus and recur 1
+claus anymor 1
+claus appar 1
+claus appar dan 1
+claus appel 1
+claus ar assum 1
+claus ar creat 1
+claus ar drawn 1
+claus ar elig 1
+claus ar implicit 1
+claus ar interpr 1
+claus ar monot 1
+claus ar trigger 1
+claus argum 1
+claus argum level 1
+claus argum oper 1
+claus as asser 1
+claus as rewrit 1
+claus assign 1
+claus au 1
+claus au cod 1
+claus au program 1
+claus auxiliair 1
+claus auxiliair correspon 1
+claus auxiliair est 1
+claus auxiliair qu 1
+claus auxiliair8 1
+claus avec 1
+claus avec coupur 1
+claus binair 1
+claus binair correspon 1
+claus bod 3
+claus by forg 1
+claus by tempor 1
+claus by unif 1
+claus c1 1
+claus can unif 1
+claus candid 1
+claus candid en 1
+claus candid es 1
+claus candid nont 1
+claus ci 1
+claus ci dessus 1
+claus compil 1
+claus compl 1
+claus complec 1
+claus complec sont 1
+claus comport 1
+claus comport tr 1
+claus comport un 1
+claus constitut 1
+claus constitut du 1
+claus cont 1
+claus cont un 1
+claus contain 2
+claus contain appl 1
+claus correspon 1
+claus correspon alor 1
+claus correspon au 1
+claus count 1
+claus count tw 1
+claus cour 1
+claus cour est 1
+claus d efin 1
+claus d epen 1
+claus d epl 1
+claus dahl 1
+claus dan 1
+claus dan la 1
+claus dan sa 1
+claus dar 1
+claus de 1
+claus de claus 1
+claus de disj 1
+claus de la 1
+claus de notr 1
+claus de qsort 1
+claus de sort 1
+claus def 2
+claus defin 1
+claus doit 1
+claus doit etr 1
+claus doiv 1
+claus doiv etr 1
+claus dont le 1
+claus du 1
+claus du pr 1
+claus du program 1
+claus du pseud 1
+claus dun 1
+claus dun pr 1
+claus echou 1
+claus en 1
+claus en echec 1
+claus en un 1
+claus entr 1
+claus entr diff 1
+claus est 1
+claus est alor 1
+claus est atteint 1
+claus est candid 1
+claus est de 1
+claus est dit 1
+claus est ex 1
+claus est incr 1
+claus est init 1
+claus est organ 1
+claus est partag 1
+claus est peu 1
+claus est pr 1
+claus est toujour 1
+claus est un 1
+claus et b1 1
+claus et de 1
+claus et dun 1
+claus et le 1
+claus et nappar 1
+claus et peut 1
+claus etait 1
+claus etait partag 1
+claus etant 1
+claus etant toujour 1
+claus except promot 1
+claus execut 1
+claus famil 1
+claus famil try 1
+claus fic 1
+claus for appl 1
+claus for empl 1
+claus for pr 1
+claus for promot 1
+claus for typ 1
+claus form 1
+claus forml 1
+claus forml rel 1
+claus forml shown 1
+claus fus 1
+claus fx 1
+claus he def 1
+claus head 2
+claus i dun 1
+claus impl 2
+claus impl ement 1
+claus in 3d 1
+claus in ad 1
+claus in sign 1
+claus in turn 1
+claus ind 1
+claus init 1
+claus init est 1
+claus init nest 1
+claus init transform 1
+claus instruc 1
+claus interm 1
+claus interm ediair 1
+claus involut 1
+claus is abandon 1
+claus is ad 1
+claus is allow 1
+claus is assign 1
+claus is canon 1
+claus is execut 1
+claus is impl 1
+claus is norm 1
+claus is regard 1
+claus is repr 1
+claus is select 1
+claus is writ 2
+claus la 1
+claus le 1
+claus le point 1
+claus length 1
+claus list 1
+claus log 1
+claus ma 1
+claus ma qu 1
+claus mak 1
+claus n ecessit 1
+claus na 1
+claus na pa 1
+claus ne 1
+claus ne diff 1
+claus nest 1
+claus nest pa 1
+claus nest partag 1
+claus ni 1
+claus ni dan 1
+claus non 1
+claus non partag 1
+claus non termin 1
+claus not 1
+claus of figur 1
+claus of length 1
+claus of longer 1
+claus of ml 1
+claus of mlp 1
+claus or unit 1
+claus order 1
+claus ou 1
+claus ou echouer 1
+claus par 1
+claus par claus 1
+claus par simpl 1
+claus partag 1
+claus partag ee 1
+claus partag le 1
+claus peut 1
+claus peut conduir 1
+claus peut demander 1
+claus peut etr 1
+claus pour 1
+claus pour laquel 1
+claus pouvait 1
+claus pouvait impliquer 1
+claus program 2
+claus proposit 1
+claus proposit calculus 1
+claus qu 1
+claus qu comport 1
+claus qu ne 1
+claus r ecur 1
+claus r ecur. 1
+claus r ecursiv 1
+claus r egl 1
+claus re coit 1
+claus regard 1
+claus relativ 1
+claus relativ efficac 1
+claus remov 1
+claus requir 1
+claus rl 1
+claus s contain 1
+claus s elect 1
+claus s electionnabl 1
+claus s electionner 1
+claus sampl 1
+claus sampl maxscor 1
+claus san coupur 1
+claus say 1
+claus se 1
+claus se comport 1
+claus select 1
+claus should po 1
+claus simp 1
+claus simp bundl 1
+claus simplif 1
+claus sont 1
+claus sont candid 1
+claus sont don 1
+claus sont organ 1
+claus sont partag 1
+claus sont relativ 1
+claus sont remplac 1
+claus st 1
+claus suiv 1
+claus suiv au 1
+claus suiv en 1
+claus suiv est 1
+claus suiv ou 1
+claus suiv peuv 1
+claus termin 1
+claus termin est 1
+claus that match 1
+claus to fir 1
+claus to preserv 1
+claus to reach 1
+claus to support 1
+claus to try 1
+claus to var 1
+claus to variabl 1
+claus uniqu 1
+claus uniqu util 1
+claus var 1
+claus var rat 1
+claus variabl 1
+claus variabl sampl 1
+claus we deliber 1
+claus wh 1
+claus wh canon 1
+claus wh context 1
+claus wh g0 1
+claus wil go 1
+claus with neg 1
+claus100 1
+clausest 1
+clausest variabl 1
+clausest variabl rat 1
+claw 1
+claw fr 1
+claw fr graph 1
+clean 4
+clean and developm 1
+clean detect 1
+clean integr 1
+clean peak 1
+clean peak filter 1
+clean peak procedur 1
+clean quer 1
+cleaner 2
+cleaner form 1
+clear 80
+clear a block 1
+clear a green 1
+clear abstract 1
+clear and compact 1
+clear and enlight 1
+clear and signif 1
+clear be interpr 1
+clear be non 1
+clear benefit 1
+clear both endpoint 1
+clear constitut 1
+clear cut 3
+clear cut benefit 1
+clear cut proc 2
+clear defin 2
+clear defin benefit 1
+clear defin interfac 1
+clear definit 1
+clear demonstr 3
+clear descript 1
+clear determin 1
+clear displ 2
+clear distinct 1
+clear distingu 2
+clear distingu mlr 1
+clear e1 1
+clear e1 satisf 1
+clear ek 1
+clear ek satisf 1
+clear ev ver 1
+clear exact 1
+clear execut 1
+clear execut model 1
+clear foc 1
+clear from definit 1
+clear from figur 1
+clear from tabl 1
+clear how exact 1
+clear how tabl 1
+clear id 1
+clear in dnf 1
+clear in np 1
+clear in nplin 1
+clear j nj 1
+clear jb 1
+clear lead 1
+clear lem 1
+clear log 1
+clear log sem 1
+clear manager 1
+clear manager label 1
+clear manager period 1
+clear must term 1
+clear ndp 1
+clear ndp ad 1
+clear np 1
+clear np ae 1
+clear np pol 1
+clear p ae 1
+clear p contain 1
+clear pattern 1
+clear peak 1
+clear perform 1
+clear perform adv 1
+clear po 1
+clear po antimatr 1
+clear point 1
+clear r02 1
+clear relev 1
+clear relev keyword 1
+clear rev 1
+clear satisf 2
+clear separ 1
+clear show 2
+clear spel 1
+clear st 2
+clear such carv 1
+clear t1 1
+clear t1 satisf 1
+clear th deadlock 1
+clear th fastest 1
+clear th longer 1
+clear th method 1
+clear th power 1
+clear th reduc 1
+clear th round 1
+clear th screen 1
+clear that li 1
+clear that random 1
+clear that solut 1
+clear that srin 1
+clear that st 2
+clear then understand 1
+clear to separ 1
+clear uniform 1
+clear uniform sem 1
+clear unsatisfact 1
+clear upper 1
+clear upper bound 1
+clear uw 1
+clear v1 1
+clear vi 1
+clear vi artifact 1
+clear view 1
+clear vk 1
+clear w wi 1
+clear wh 1
+clear what ent 1
+clear what siz 1
+clear what tok 1
+clear whether av 1
+clear which featur 1
+clear winner 1
+clear within tsclr 1
+clearer 2
+clearwater 1
+clearwater beach 1
+cleereman 1
+cleereman et al 1
+clef 4
+clef adapt 1
+clef adapt es 1
+clef de 1
+clef de la 1
+clemson 1
+cler 1
+cler dut 1
+cler rol 1
+clerk 1
+clerk acc 1
+clerk acc right 1
+clerk and superv 1
+clerk rol 1
+clerk superv 1
+clev 1
+clev ashcraft 1
+clever 5
+clever actu 1
+clever exploit 1
+clever exploit libr 1
+clever mechan 1
+cleverer 1
+click 5
+click th appropr 1
+client 15
+client a server 1
+client acc 1
+client addr 1
+client addr spac 1
+client and p2 1
+client and server 1
+client appl 1
+client ar assum 1
+client ask 1
+client broadcast 1
+client c init 1
+client can observ 1
+client can sen 1
+client can subsequ 1
+client cannot distingu 1
+client ci 1
+client ci sen 1
+client cl 1
+client cl clientcl 1
+client cl def 1
+client cl tok 1
+client cod 1
+client cod ba 1
+client continu 1
+client could request 1
+client entr 1
+client entr interfac 1
+client find 1
+client for upgrad 1
+client found 1
+client ha specif 1
+client i maintain 1
+client i sen 1
+client interact 1
+client interpr 1
+client know 1
+client level 1
+client level log 1
+client level sub 1
+client libr 1
+client log 1
+client log view 1
+client mak 1
+client mak request 1
+client may contact 1
+client me 1
+client mean 1
+client nam 1
+client nam sit 1
+client of cl 1
+client otherloc 1
+client otherloc badg 1
+client programmer 1
+client receiv 1
+client record 1
+client refer 1
+client request 2
+client request arriv 1
+client request sent 1
+client request tak 1
+client requir 1
+client sen 1
+client sen request 1
+client sen upd 1
+client server 6
+client server architectur 2
+client server configur 1
+client server environm 1
+client server model 1
+client server parad 1
+client server protocol 1
+client sid 1
+client sid approach 1
+client sid comput 1
+client sid pattern 1
+client sid proc 1
+client sit 1
+client softwar 1
+client split 1
+client subm 1
+client that commun 1
+client thread 1
+client to control 1
+client to ind 1
+client to learn 1
+client to shar 1
+client to us 1
+client transact 1
+client transact manager 1
+client us 1
+client user 1
+client viewer 1
+client without using 1
+clientcl 1
+clientcl fl 1
+clientcl.tp 1
+clientcl.tp nod 1
+clientclassdefinit 1
+clientclassdefinit clientclassl 1
+clientclassdefinit clientclassl clientclassdefinit 1
+clientclassdistribut 1
+clientclassdistribut clientclassdistributionl 1
+clientclassdistribut clientclassdistributionl clientclassdistribut 1
+clientclassdistributionl 1
+clientclassdistributionl clientclassdistribut 1
+clientclassl 1
+clientclassl clientclassdefinit 1
+clientclassl workloadloc 1
+clientserver 1
+clientsother 1
+cliff 11
+clifford 1
+climatiqu 1
+climatiqu et oc 1
+climb 3
+climb capabil 1
+climb method 1
+climb procedur 1
+clin 1
+clin model 1
+clin model illustr 1
+clin problem 1
+clinger 2
+cliniqu 1
+cliniqu qu 1
+cliniqu qu le 1
+clip 5
+clip an imag 1
+clip dat 1
+clip dat rectangl 1
+clip lin 2
+clip problem 1
+clip sub 1
+clip sub polygon 1
+clip th object 1
+clip to produc 1
+cliqu 7
+cliqu and separ 1
+cliqu by iter 1
+cliqu correspon 1
+cliqu is character 1
+cliqu maxim 1
+cliqu maxim dan 1
+cliqu mean 1
+cliqu of correspon 1
+cliqu pack 1
+cliqu pot 1
+cliqu se 1
+cliqu shar 1
+cliqu that joint 1
+cliqu with intersect 1
+cliqu with nonempt 1
+clm 1
+clock 16
+clock accur 1
+clock and bound 1
+clock ar perfect 1
+clock be synchron 1
+clock cycl 3
+clock cycl tim 2
+clock fair 1
+clock fair queu 1
+clock is avail 1
+clock may requir 1
+clock push 1
+clock to tak 1
+clock unison 1
+clock wi 1
+clock wi direct 1
+clogn 1
+clon 1
+cloop 1
+cloop and cifcon 1
+cloop ccal 1
+cloop ccal cdr 1
+cloop push 1
+cloop repr 1
+closer 23
+closer an 1
+closer consider 1
+closer consider show 1
+closer exam 1
+closer look 1
+closer mov 1
+closer neighbor 2
+closer or farther 1
+closer to human 1
+closer to implem 1
+closer to sit 1
+closer to sw 1
+closer to tradit 1
+closest 14
+closest earl 1
+closest encl 1
+closest encl handler 1
+closest fac 1
+closest handler 1
+closest handler funct 1
+closest in tim 1
+closest lec 1
+closest lec bind 1
+closest match 1
+closest non 1
+closest non fl 1
+closest point 1
+closest rel 1
+closest renorm 1
+closest renorm output 1
+closest to optim 1
+closest to tx 1
+closest to ui 1
+closest to vi 1
+closur 20
+closur algorithm 1
+closur amount 1
+closur and backtrack 1
+closur and converg 1
+closur and dat 1
+closur and recur 1
+closur approach 1
+closur ar uniqu 1
+closur build 1
+closur build instruc 1
+closur by arc 1
+closur condit 1
+closur f satisf 1
+closur for se 1
+closur in sect 1
+closur in theorem 1
+closur is achief 1
+closur is pot 1
+closur method 1
+closur method comb 1
+closur might contain 1
+closur of ack 1
+closur of forml 1
+closur of parallel 1
+closur of tp 1
+closur oper 1
+closur proper 3
+closur proper follow 1
+closur prov 1
+closur rel 1
+closur result 2
+closur result ment 1
+closur tak 1
+closur tak polynom 1
+closur under union 1
+cloud 2
+cloud distribut 1
+cloud distribut oper 1
+clp 5
+clp langu 1
+clp solver 1
+clp system 1
+clp th problem 1
+clr 1
+clr al contain 1
+clr alw point 1
+clr and ct 1
+clr ar distingu 1
+clr ar indistingu 1
+clr ar writ 1
+clr comp 1
+clr comp log 1
+clr describ 1
+clr differ 1
+clr differ dep 1
+clr is con 1
+clr log 1
+clr log method 1
+clr log strateg 1
+clr wh pointer 1
+clr writ 1
+clr90 1
+clu 4
+clu within detect 1
+club 1
+club benchmark 1
+clus 1
+clus. 2
+cluster 23
+cluster a difficult 1
+cluster accord 1
+cluster ad 1
+cluster al demonstr 1
+cluster algorithm 3
+cluster allow 2
+cluster allow ea 2
+cluster an 1
+cluster and displ 1
+cluster and intercluster 1
+cluster and interconnect 1
+cluster and label 1
+cluster and proport 1
+cluster and show 1
+cluster and wider 1
+cluster approach 2
+cluster ar allow 1
+cluster ar denot 1
+cluster ar learn 1
+cluster ar nec 1
+cluster ar repr 1
+cluster ar specif 2
+cluster architectur 3
+cluster architectur siml 1
+cluster ba 2
+cluster ba approach 1
+cluster ba design 1
+cluster ba system 1
+cluster becom 1
+cluster becom farther 1
+cluster benefit 1
+cluster benefit parallel 1
+cluster bisect 3
+cluster bisect band. 2
+cluster bisect bandwidth 3
+cluster bound 1
+cluster bus 2
+cluster bus connect 2
+cluster by ch 1
+cluster by keyword 1
+cluster by moham 1
+cluster by split 1
+cluster by triangl 1
+cluster by typ 1
+cluster c architectur 2
+cluster c form 1
+cluster c model 2
+cluster c multiproc 1
+cluster c organ 2
+cluster c parallel 2
+cluster c scal 2
+cluster c system 2
+cluster c1 1
+cluster ca 1
+cluster ca overlap 1
+cluster caus 1
+cluster cb 1
+cluster center 1
+cluster centr 1
+cluster centr accord 1
+cluster centr init 1
+cluster centr straightfor 1
+cluster centr valu 1
+cluster cf 1
+cluster cg 1
+cluster channel 3
+cluster channel width 3
+cluster ck 1
+cluster commun 1
+cluster compl 1
+cluster compl fil 1
+cluster con 2
+cluster configur 2
+cluster connect 1
+cluster count 1
+cluster cv 1
+cluster cv center 1
+cluster dat 1
+cluster design 2
+cluster diameter 1
+cluster disappear 1
+cluster fac 1
+cluster fac individu 1
+cluster fl 1
+cluster fl text 1
+cluster for build 1
+cluster for intr 1
+cluster for sj 1
+cluster from empir 1
+cluster ge 2
+cluster gener 1
+cluster heterogeneouscluster 1
+cluster homogeneouscluster 1
+cluster hypoth 1
+cluster in design 1
+cluster in fl 1
+cluster in scal 1
+cluster in vl 1
+cluster incr 2
+cluster ind 1
+cluster ind tok 1
+cluster individu 1
+cluster init 1
+cluster init valu 1
+cluster interconnect 3
+cluster interconnect cost 1
+cluster interconnect network 3
+cluster interfac 2
+cluster is achief 2
+cluster is begin 1
+cluster is connect 2
+cluster is decr 1
+cluster is illustr 1
+cluster is init 1
+cluster is refer 1
+cluster is termin 1
+cluster is writ 1
+cluster maint 1
+cluster maintain 1
+cluster maintain system 1
+cluster mean 1
+cluster method 3
+cluster modl 1
+cluster modl technolog 1
+cluster multiproc 1
+cluster multiproc system 1
+cluster natur 1
+cluster natur langu 1
+cluster nb 1
+cluster network 3
+cluster network bandwidth 2
+cluster network bisect 1
+cluster network cluster 2
+cluster network configur 2
+cluster network parameter 2
+cluster network rad 1
+cluster network siz 1
+cluster network topolog 1
+cluster of adjac 1
+cluster of docum 1
+cluster of eigenvalu 1
+cluster of featur 1
+cluster of inst 1
+cluster of object 1
+cluster of proc 2
+cluster of siz 3
+cluster offer 3
+cluster offer effect 1
+cluster offer greater 2
+cluster pack 1
+cluster pair 1
+cluster partit 1
+cluster perform 2
+cluster problem 1
+cluster proper 1
+cluster recur 2
+cluster recur network 1
+cluster refer 1
+cluster refer collect 1
+cluster requir 1
+cluster requir lesser 1
+cluster rout 1
+cluster rout capabil 1
+cluster router 1
+cluster router requir 1
+cluster sc 1
+cluster sc kkz 1
+cluster se 1
+cluster seek 1
+cluster shown 1
+cluster shown correspon 1
+cluster siz 4
+cluster siz allow 1
+cluster siz becom 1
+cluster siz cr 1
+cluster siz greater 2
+cluster siz larger 1
+cluster siz lead 1
+cluster siz support 1
+cluster siz unit 1
+cluster siz upt 2
+cluster siz us 1
+cluster sizec 2
+cluster sizec actualbisect 2
+cluster sum 1
+cluster system 1
+cluster techniqu 2
+cluster technolog 1
+cluster technolog lim 1
+cluster technolog offer 1
+cluster th disk 1
+cluster th object 1
+cluster th result 1
+cluster to build 1
+cluster to design 1
+cluster to determin 1
+cluster to fl 1
+cluster to imp 2
+cluster to yield 1
+cluster together docum 1
+cluster topolog 3
+cluster tp 1
+cluster tp transact 1
+cluster transact 1
+cluster unrel 1
+cluster unrel docum 1
+cluster util 1
+cluster util hybrid 1
+cluster valu 3
+cluster we go 2
+cluster wer gener 1
+cluster whil keep 1
+cluster whil maintain 1
+cluster wil group 1
+cluster wir 1
+cluster wir cost 1
+cluster with appl 1
+cluster with cg 1
+cluster with larger 1
+cluster with n0 1
+cluster with wider 1
+cluster writ 1
+clusterc 1
+clusterc organ 1
+clusterinterfac 2
+clustersg 1
+clustersg recur 1
+clustersim 1
+clustersim accur 1
+clustersim accur model 1
+clustersim parameter 1
+clustersim siml 1
+clutter 1
+clyd 1
+cm 13
+cm and ms 1
+cm as 1
+cm as chip 1
+cm off theshelf 1
+cm schem 1
+cm schem gav 1
+cm schem produc 1
+cm0 1
+cm2 1
+cm2 from think 1
+cm91 1
+cm93 1
+cmac 3
+cmac 2nconf 1
+cmac 2o 1
+cmac and wmac 1
+cmac cn 1
+cmac cr 1
+cmac is greater 1
+cmac le 1
+cmac le nombr 1
+cmac offer 1
+cmaxc 1
+cmaxc mac 1
+cmaxc mac r4r 1
+cmaxc mac scal 1
+cmg 1
+cmin 1
+cmin d ntot 1
+cml 1
+cml tr95 1
+cml.ric.edu 1
+cmp 1
+cmp demand 1
+cmu 2
+cmu cs 2
+cn 5
+cn 1ss 1
+cn 1u1 1
+cn begin 1
+cn defin 1
+cn gn 1
+cn in proposit 1
+cn n2 1
+cn oen 1
+cn oen tn 1
+cn1 1
+cnam 1
+cnam par 1
+cnd 1
+cndu1 1
+cnet 1
+cnextmac 1
+cnf 1
+cnf forml 1
+cnf forml using 1
+cnf is emb 1
+cnf part 1
+cnf proposit 1
+cnf proposit forml 1
+cnf satisf 1
+cnil 1
+cnil cdr 1
+cnil quot 1
+cnin 1
+cnin i0 1
+cnin i0 nt 1
+cnod 1
+cnod b nod 1
+cnpn 1
+cnr 2
+cnr lept 1
+cnr lept ensam 1
+cnt 1
+cnu1 1
+co 27
+co between pattern 1
+co bodin 1
+co bodin examinateur 1
+co bodin qu 1
+co de 1
+co de la 1
+co developer 1
+co domain 1
+co domain co 1
+co domain truth 1
+co ec 3
+co evolut 2
+co evolut parasit 1
+co lin 1
+co loc 1
+co occur 1
+co occur matr 1
+co oper 4
+co oper control 1
+co oper problem 1
+co ord 1
+co ordin 1
+co proc 1
+co proc approach 1
+co proc develop 1
+co processeur 1
+co refer 1
+co refer constraint 1
+co t maxim 1
+co transform 2
+co transform compr 1
+co ut 4
+co ut additionnel 1
+co ut adopt 1
+co ut dacc 1
+co ut de 4
+co ut denv 1
+co ut dic 1
+co ut dordonnanc 1
+co ut dun 2
+co ut dus 1
+co ut dutil 1
+co ut ec 1
+co ut en 1
+co ut engendr 1
+co ut est 1
+co ut loc 1
+co ut maxim 1
+co ut maximaux 1
+co ut mesur 1
+co ut moindr 1
+co ut nl 1
+co ut par 1
+co ut posit 1
+co ut qu 2
+co ut raison 1
+co ut relatif 1
+co ut rien 1
+co ut suppl 1
+co ut torgerson 1
+co utant 1
+co utant dan 1
+co utent 1
+co utent maint 1
+co uter 1
+co uter deux 1
+co uteus 3
+co uteus dan 1
+co uteus en 2
+co uteus est 1
+co uteus si 1
+co uteux 2
+co uteux en 1
+co uteux pour 1
+co1 1
+co2 1
+coac 2
+coac int particl 1
+coad 1
+coad and ed 1
+coalesc 3
+coalesc loop 1
+coalesc loop iter 1
+coalesc sever iter 1
+coalesc th block 1
+coalit 1
+coalit specif 1
+coar 12
+coar al result 1
+coar algorithm 1
+coar and gr 1
+coar and uncoar 1
+coar ba 1
+coar ba mesh 1
+coar bisect 1
+coar gi 1
+coar grain 6
+coar grain commun 1
+coar grain moder 1
+coar grain parallel 2
+coar grain proc 1
+coar grain program 1
+coar grain simd 1
+coar grain solut 1
+coar graph 2
+coar graph correspon 1
+coar graph gm 1
+coar graph produc 1
+coar in fewer 1
+coar is car 1
+coar level 1
+coar nod 1
+coar nod separ 1
+coar ph 2
+coar ph en 1
+coar proc 2
+coar proc ensur 1
+coar quant 1
+coar quant vid 1
+coar schem 1
+coar separ 1
+coar separ nod 1
+coar separ result 1
+coar step 1
+coar th graph 2
+coar tim 1
+coar to fin 1
+coar using 1
+coar using hem 1
+coar using random 1
+coar using rm 1
+coar ver 2
+coar ver cover 1
+coarsegrain 1
+coarsegrain algorithm 1
+coarser 4
+coarser goal 1
+coarser grain 1
+coarser grain commun 1
+coarser graph 2
+coarser graph g1 1
+coarser graph gic1 1
+coarser graph gm 1
+coarser q nod 1
+coarsest 3
+coarsest graph 2
+coarsest graph gm 1
+coarsest level 2
+coast 1
+cobol 1
+coburn 1
+cobweb 1
+cobweb and anderson 1
+cock 1
+cock to mouth 1
+cockpit 1
+cocktail 1
+cocycl 1
+cocycl determin 1
+cod 65
+cod a ca 1
+cod a difficult 1
+cod a ex 1
+cod a relationship 1
+cod abstrait 1
+cod abstrait de 1
+cod acc 1
+cod account 1
+cod al compil 1
+cod algorithm 1
+cod and behaviour 1
+cod and calcl 1
+cod and concept 1
+cod and cryptograph 1
+cod and dat 2
+cod and docum 1
+cod and fract 1
+cod and mak 1
+cod and nat 1
+cod and synchron 1
+cod and test 1
+cod and tim 1
+cod and tr 1
+cod appear 1
+cod ar 1
+cod ar character 1
+cod ar consider 1
+cod ar stat 1
+cod ar wh 1
+cod artifact 1
+cod artifact using 1
+cod as finit 1
+cod assoc 1
+cod assum 1
+cod ayant 1
+cod ba 3
+cod ba regr 1
+cod ba test 1
+cod behav 1
+cod being visu 1
+cod being writ 1
+cod binair 1
+cod binair de 1
+cod break 1
+cod by nonlin 1
+cod by optim 1
+cod by prun 1
+cod cach 1
+cod cach lin 1
+cod cach mi 1
+cod caus 1
+cod caus difficult 1
+cod chang 2
+cod channel 1
+cod channel enh 1
+cod cibl 1
+cod cl 1
+cod claus 1
+cod cloop 1
+cod cloop repr 1
+cod compil 1
+cod complec 1
+cod compr 1
+cod compr imag 1
+cod con 1
+cod consid 1
+cod consid er 1
+cod correspon 4
+cod correspon est 1
+cod correspon figur 1
+cod cover 1
+cod cover achief 1
+cod d ecod 1
+cod d emar 1
+cod de 3
+cod de calculer 1
+cod de ce 1
+cod de chaqu 1
+cod de claus 1
+cod de concat 1
+cod de deux 1
+cod de etiqu 1
+cod de identificateur 1
+cod de individus 1
+cod de instruc 1
+cod de la 1
+cod de linstruc 1
+cod de loop 1
+cod de param 1
+cod de partit 1
+cod de solut 1
+cod de transfer 1
+cod def 1
+cod def saf 1
+cod describ 1
+cod detail 1
+cod detail protocol 1
+cod deterior 1
+cod develop 1
+cod develop environm 1
+cod differ 1
+cod differ prev 1
+cod dinstr 1
+cod direct 2
+cod direct li 1
+cod dit 1
+cod dit eml 1
+cod dit natif 1
+cod doit 1
+cod doit tenir 1
+cod dont la 1
+cod du 1
+cod du pr 1
+cod du pseud 1
+cod dun 1
+cod dun pr 1
+cod dupl 1
+cod e en 1
+cod ee 2
+cod ee com 1
+cod ee x1 1
+cod effort 1
+cod eml 1
+cod eml e5 1
+cod eml ee 1
+cod en 2
+cod en ajout 1
+cod en par 1
+cod engendr 1
+cod engendr es 1
+cod entr 1
+cod entr claus 1
+cod entr deux 1
+cod es 1
+cod es dan 1
+cod est 1
+cod est fus 1
+cod est presqu 1
+cod est tr 1
+cod et cach 1
+cod et de 1
+cod et don 1
+cod eventuel 1
+cod ex 1
+cod ex ecuter 1
+cod execut 1
+cod exploser 1
+cod expr 1
+cod expr involut 1
+cod figur 1
+cod fin 1
+cod fin cont 1
+cod for ba 1
+cod for construc 1
+cod for deal 1
+cod for implem 1
+cod for ind 1
+cod for libr 1
+cod for loop 1
+cod for mutu 1
+cod for nest 1
+cod for parallel 1
+cod for pepid 1
+cod for proc 1
+cod for resourc 1
+cod for rt1 1
+cod for sum 1
+cod form 1
+cod fortran 1
+cod fourn 1
+cod fourn par 1
+cod fragm 3
+cod fragm cf 1
+cod fragm cop 1
+cod fragm pair 1
+cod from antimatr 1
+cod g en 2
+cod gener 12
+cod gener rout 1
+cod gener tool 1
+cod giv 2
+cod highlight 1
+cod highlight opt 1
+cod imag 1
+cod imag using 1
+cod implem 1
+cod improv 1
+cod improv schem 1
+cod in chr 1
+cod in order 1
+cod in spit 1
+cod in term 1
+cod inclus 1
+cod incompatibil 1
+cod indep 1
+cod indep mean 1
+cod init 1
+cod instr 1
+cod instr tool 1
+cod instruc 1
+cod interdit 1
+cod interdit tout 1
+cod interfac 1
+cod interfac standard 1
+cod interm 1
+cod interm ediair 1
+cod interpr 1
+cod is acc 1
+cod is avail 2
+cod is bad 1
+cod is chang 2
+cod is closer 1
+cod is execut 1
+cod is further 1
+cod is gener 4
+cod is inser 1
+cod is monolith 1
+cod is parallel 1
+cod is perform 1
+cod is port 1
+cod is produc 1
+cod is requir 1
+cod is robust 1
+cod is slight 1
+cod is slop 1
+cod is typ 1
+cod la 1
+cod la ch 1
+cod len 1
+cod len imag 1
+cod level 4
+cod level specif 1
+cod list 1
+cod loop 1
+cod lor 1
+cod lor de 1
+cod macr 1
+cod may startl 1
+cod mean 2
+cod method 1
+cod method tripletvalu 1
+cod modif 2
+cod modif caus 1
+cod mor compact 1
+cod mot 1
+cod multidimensionnel 1
+cod na 1
+cod natif 1
+cod natif du 1
+cod natif qu 1
+cod natif sur 1
+cod ne 1
+cod ne peut 1
+cod num 1
+cod num eriqu 1
+cod obtenu 1
+cod obtenu apr 1
+cod obtenu est 1
+cod obtenu sur 1
+cod of ad 1
+cod of appl 1
+cod of output 1
+cod of waveform 1
+cod offsetbus 1
+cod offsetbus ibus 1
+cod oft form 1
+cod on nin 1
+cod optim 2
+cod optim pour 1
+cod optim techniqu 1
+cod or object 1
+cod or understand 1
+cod origin 1
+cod origin work 1
+cod par 1
+cod par el 1
+cod peut 1
+cod peut etr 1
+cod peut toutef 1
+cod plus complec 1
+cod plus simpl 1
+cod possibl 1
+cod possibl plut 1
+cod pr 1
+cod pr esent 1
+cod pren 1
+cod pren en 1
+cod preserv 1
+cod produit 1
+cod produit dan 1
+cod prolog 1
+cod qu 2
+cod qu tien 1
+cod r esid 1
+cod r esult 1
+cod r eutil 1
+cod recognit 1
+cod redund 1
+cod remain 1
+cod requir 2
+cod reus 1
+cod review 1
+cod review earl 1
+cod review help 1
+cod review spot 1
+cod ring 1
+cod ring compound 1
+cod sampl 1
+cod san alt 1
+cod san aut 1
+cod schedl 1
+cod schem 3
+cod scientifiqu 1
+cod seffectu 1
+cod seffectu de 1
+cod sequ 1
+cod should minim 1
+cod shown 1
+cod simpl 1
+cod siz 2
+cod sourc 1
+cod sourc en 1
+cod sp 1
+cod sp ec 1
+cod spmd 1
+cod spmd correspon 1
+cod spmd engendr 1
+cod spmd pour 1
+cod spmd produit 1
+cod standard 3
+cod standard effort 1
+cod standard par 1
+cod structur 1
+cod structur inform 1
+cod styl 1
+cod suiv 1
+cod summariz 1
+cod supprim 1
+cod supprim le 1
+cod system 1
+cod tak 1
+cod techniqu 1
+cod th forml 1
+cod that harder 1
+cod that precc 1
+cod that us 1
+cod then chang 1
+cod theor 1
+cod to death 1
+cod to impl 1
+cod to libr 1
+cod to look 1
+cod to me 1
+cod to perform 1
+cod to repr 1
+cod to sen 1
+cod to work 1
+cod tr 1
+cod trait 1
+cod trait la 1
+cod transform 2
+cod transform es 1
+cod upgrad 1
+cod using 4
+cod using log 1
+cod using vect 1
+cod using wavel 1
+cod using wid 1
+cod util 1
+cod vol 1
+cod wa develop 1
+cod wa read 1
+cod wa simp 1
+cod walker 1
+cod wam 1
+cod wam de 1
+cod wam standard 1
+cod which contain 1
+cod which establ 1
+cod which foc 1
+cod which propag 1
+cod with appl 1
+cod with cal 1
+cod with improv 1
+cod with indep 1
+cod with object 1
+cod with procedur 1
+cod with respect 1
+cod word 1
+cod writ 4
+cod writ acc 1
+cod writ rat 1
+cod91 1
+cod91 intern 1
+cod91 intern workshop 1
+codan 1
+codebook 1
+codebook gener 1
+codebook gener approach 1
+codebus 1
+codebus overheadsync 1
+codebus overheadsync overheadalgorithm 1
+codebusyoverheadsync 1
+codebusyoverheadsync overheadalgorithm 1
+codebusyoverheadsync overheadalgorithm overheadmemor 1
+coder 3
+coder graph 1
+coder graph coder 1
+coder system 1
+coder text 1
+coder text coder 1
+codif 2
+codif dat 1
+codif dat fil 1
+codif text 1
+codif th genvoc 1
+codognet 2
+codon 1
+coeff 22
+coeff and ith 1
+coeff ar requir 1
+coeff ba 1
+coeff const 1
+coeff const cof 1
+coeff dan 1
+coeff dan lanneau 1
+coeff de 2
+coeff de la 1
+coeff de lidentit 1
+coeff domin 1
+coeff domin etant 1
+coeff ent 1
+coeff ent ma 1
+coeff est 1
+coeff est petit 1
+coeff fic 1
+coeff import 1
+coeff ji 1
+coeff ji sont 1
+coeff matr 3
+coeff matr ad2at 1
+coeff matr m14b 1
+coeff matr wav 1
+coeff nl 1
+coeff nl en 1
+coeff of oe 1
+coeff of polynom 1
+coeff of var 1
+coeff of x2 2
+coeff of xn 1
+coeff of y2 1
+coeff oft result 1
+coeff ordin 1
+coeff positif 1
+coeff prov 1
+coeff prov simpl 1
+coeff siz 1
+coeff soit 1
+coeff soit le 1
+coeff standard 1
+coeff standard error 1
+coeff strict 1
+coeff strict positif 1
+coeff xi 1
+coerc 1
+coeur 2
+coeur du 1
+coeur du probl 1
+coeur m em 1
+coexister 1
+cof 1
+cof chaqu 1
+cof chaqu fo 1
+cof perm 1
+cof perm de 1
+cofacteur 1
+cofacteur de 1
+cofacteur de aik 1
+cofacteur de la 1
+coff 2
+coff break 1
+coffman 2
+cog93 1
+coggan 1
+cogit 1
+cogit group 1
+cogit int 1
+cogit methodolog 1
+cogit occur 1
+cogit project 1
+cogit reposit 1
+cogit reposit manager 1
+cogit specif 1
+cogit specif langu 1
+cogit system 1
+cogit system specif 1
+cogit tool 1
+cogit tool gener 1
+cogl 1
+cognit 13
+cognit abil 1
+cognit account 1
+cognit act 2
+cognit clu 1
+cognit conflict 1
+cognit model 2
+cognit sc 6
+cognit sc soc 2
+cognit walkthrough 1
+cognitif 1
+cognitif et interact 1
+cognitiv 1
+coh 31
+coh aa 1
+coh aa algorithm 1
+coh act 1
+coh algorithm 2
+coh and allow 1
+coh and commun 1
+coh and dat 1
+coh and system 1
+coh and yin 1
+coh ar signif 1
+coh bod 1
+coh by plac 1
+coh cach 2
+coh cost 1
+coh cost occur 1
+coh decr 1
+coh deonit 1
+coh developm 1
+coh er 3
+coh er atomiqu 1
+coh er au 1
+coh er avec 1
+coh er ch 1
+coh er de 1
+coh er diff 1
+coh er du 1
+coh er dun 1
+coh er entr 1
+coh er est 1
+coh er fa 1
+coh er fort 1
+coh er impl 1
+coh er oguid 1
+coh er par 1
+coh er qu 1
+coh er retenu 1
+coh er seffectu 1
+coh erent 2
+coh erent par 1
+coh erent vi 1
+coh esion 1
+coh esion entr 1
+coh fail 1
+coh for shar 1
+coh hardwar 1
+coh in abduc 1
+coh in multiproc 2
+coh in shar 1
+coh is enforc 1
+coh is implem 1
+coh log 2
+coh mechan 1
+coh method 1
+coh model 1
+coh network 2
+coh network interfac 2
+coh num 1
+coh object 1
+coh of subsum 1
+coh on commun 1
+coh overhead 1
+coh pair 1
+coh pair fu0 1
+coh per dat 1
+coh problem 1
+coh protocol 2
+coh protocol evalu 1
+coh protocol load 1
+coh renc 1
+coh renc fa 1
+coh renc fort 1
+coh rent 1
+coh rent dop 1
+coh repr 1
+coh request 1
+coh request simultan 1
+coh schem 1
+coh schem stem 1
+coh shar 1
+coh shar memor 1
+coh softwar 1
+coh softwar maintain 1
+coh solut 1
+coh st 3
+coh st chang 1
+coh st plot 1
+coh strateg 2
+coh strateg ea 1
+coh sub 1
+coh sub spac 1
+coh through vect 1
+coh unit 1
+cohabiter 1
+cohabiter gr 1
+cohabiter gr ac 1
+cohn 3
+cohn and cu 1
+cohn and dr 1
+cohn ha suggest 1
+cohoon 1
+coifman 2
+coifman and m.v 1
+coin 3
+coin by solomonoff 1
+coin distribut 1
+coin mak 1
+coin techn 1
+coin techn report 1
+coin wh 1
+coinc 8
+coinc edg 1
+coinc fac 1
+coinc reg 1
+coinc triangl 1
+coinc with eb 1
+coinc with ordin 1
+coint 1
+coit 2
+coit a chaqu 1
+coit la 1
+coit la cop 1
+coit la pag 1
+coit le 1
+coit le droit 1
+coit qu 1
+coit qu de 1
+coit un 1
+coit un argum 1
+coit un requ 1
+coiv 1
+coiv la 1
+coiv la queu 1
+coiv le 1
+col 9
+col by ser 1
+col detect 1
+col entr 1
+col entr environ 1
+col imag.segm 1
+col imag.segm ionospher 1
+col is pract 1
+col sequ 1
+col. 2
+colb 1
+colbrook 1
+colbrook et al 1
+colchester 1
+cold 2
+cold start 1
+cold start tim 1
+colin 2
+colin air 1
+collabor 16
+collabor act 1
+collabor act textbook 1
+collabor among cl 1
+collabor and shar 1
+collabor appl 1
+collabor avec 1
+collabor avec de 1
+collabor cl 2
+collabor context 1
+collabor context suppl 1
+collabor continu 1
+collabor continu feed 1
+collabor continuousfeed 1
+collabor continuousfeed appl 1
+collabor entr 1
+collabor entr programmeur 1
+collabor environm 1
+collabor european 1
+collabor european esprit 1
+collabor group 1
+collabor group work 1
+collabor noncomputer 1
+collabor noncomputer ba 1
+collabor of gh 1
+collabor problem 1
+collabor problem solut 1
+collabor problemsolut 1
+collabor problemsolut group 1
+collabor proc 1
+collabor program 1
+collabor red 1
+collabor red project 1
+collabor tut 1
+collabor tut se 1
+collabor with dickman 1
+collabor with ecrc 1
+collabor with satosh 1
+collabor work 2
+collap 12
+collap adjac 1
+collap adjac ver 1
+collap after calcl 1
+collap al me 1
+collap an edg 1
+collap earl 1
+collap edg 2
+collap for tetrahedr 1
+collap id 1
+collap indistingu 1
+collap indistingu const 1
+collap me 1
+collap me level 1
+collap of connect 1
+collap of object 1
+collap of parameter 1
+collap oper 1
+collap th curv 1
+collap th cycl 1
+collap th ver 1
+collap to conv 1
+collap to form 1
+collap ver 1
+collap ver using 1
+collap when inclus 1
+collap with result 1
+collard 1
+collatz 1
+colleagu 3
+colleagu hartmut 1
+colleagu hartmut dieterich 1
+collect 59
+collect a se 1
+collect a.2 1
+collect a.2 compar 1
+collect al separ 1
+collect al td 1
+collect and an 1
+collect and coroutin 1
+collect and evalu 2
+collect and sort 1
+collect as garb 1
+collect as uj 1
+collect bit 1
+collect built 1
+collect built network 1
+collect by parameter 1
+collect cal 1
+collect can tak 1
+collect can var 1
+collect cannot occur 1
+collect center 1
+collect cl 1
+collect cod 1
+collect cod giv 1
+collect com. 1
+collect commun 4
+collect commun libr 2
+collect commun oper 2
+collect commun perform 1
+collect commun primitiv 2
+collect commun rout 1
+collect compar 1
+collect compar condit 1
+collect compon 1
+collect compon behav 1
+collect contain 1
+collect dat 2
+collect de 1
+collect de linform 1
+collect discour 1
+collect discour structur 1
+collect distribut 1
+collect distribut snapshot 1
+collect ee 1
+collect ee le 1
+collect effect 1
+collect el 1
+collect execut 1
+collect f hg 1
+collect for implem 1
+collect for prolog 1
+collect for sort 1
+collect fort 1
+collect fort var 1
+collect in block 1
+collect in prolog 1
+collect inclus 1
+collect individu 1
+collect individu task 1
+collect inform 2
+collect inform pertain 1
+collect instruc 1
+collect instruc produc 1
+collect interview 1
+collect interview dat 1
+collect it result 1
+collect knowledg 1
+collect measur 1
+collect modl 1
+collect modl var 1
+collect natur 1
+collect nor prescrib 1
+collect obtain 1
+collect oe 1
+collect of act 1
+collect of border 1
+collect of claus 1
+collect of contextu 1
+collect of cut 1
+collect of dat 1
+collect of distribut 1
+collect of el 1
+collect of fault 1
+collect of fl 1
+collect of inst 1
+collect of integer 1
+collect of interact 1
+collect of iter 1
+collect of leaf 1
+collect of link 1
+collect of model 1
+collect of moment 1
+collect of object 1
+collect of pat 1
+collect of po 1
+collect of point 1
+collect of pointer 1
+collect of power 1
+collect of privileg 1
+collect of responsibil 1
+collect of rol 1
+collect of sld 1
+collect of sub 1
+collect of substr 1
+collect of surv 1
+collect of test 1
+collect of tim 1
+collect of tool 1
+collect of tr 1
+collect of user 1
+collect of wavel 1
+collect of xp 1
+collect of zer 1
+collect oper 2
+collect or leav 1
+collect order 1
+collect paper 1
+collect protein 1
+collect queu 1
+collect queu acc 1
+collect realm 1
+collect repr 1
+collect repr diagon 1
+collect schem 1
+collect sem 1
+collect specif 1
+collect stat 2
+collect sweep 1
+collect test 1
+collect test hist 1
+collect th behavior 1
+collect th candid 1
+collect th valu 1
+collect th zon 1
+collect tim 1
+collect to recogn 1
+collect using 2
+collect using appl 1
+collect using mp 1
+collect vi loc 1
+collect wa develop 1
+collect wh 1
+collect would achief 1
+collecter 1
+collecter le 1
+collecter le inform 1
+colleg 20
+colleg cun 1
+colleg district 1
+colleg london 1
+colleg london uff 1
+colleg of comput 4
+colleg of computer 2
+colleg park 8
+colleg techn 1
+colleg techn report 1
+coller 1
+coller a un 1
+collin 3
+collofel 1
+collofel buck 1
+colloq 2
+colloqu 5
+colloqu on algorithm 1
+colloqu on autom 1
+colloqu on combin 1
+colloqu sur 1
+colloqu sur la 1
+colman 1
+colman reil 1
+colmerauer 2
+colom 1
+colon 5
+colon a lint 1
+colon adjac 1
+colon anywh 1
+colon co 1
+colon contenu 1
+colon contenu dan 1
+colon dan 1
+colon dan le 1
+colon de 3
+colon de la 1
+colon de tail 1
+colon diff 1
+colon diff erent 1
+colon donc 1
+colon donc de 1
+colon du 2
+colon du tableau 2
+colon engendr 1
+colon espac 1
+colon espac perdu 1
+colon est 1
+colon et de 1
+colon etant 1
+colon etant fic 1
+colon font 1
+colon font moin 1
+colon i com 1
+colon it ou 1
+colon j appart 1
+colon j com 1
+colon j s 1
+colon j ser 1
+colon la 1
+colon la dern 1
+colon ma 1
+colon ma le 1
+colon mk 1
+colon mk tel 1
+colon ne 1
+colon ne finit 1
+colon plus petit 1
+colon processeur 1
+colon processeur p0 1
+colon provoqu 1
+colon qu 1
+colon qu nest 1
+colon r epart 1
+colon s 1
+colon san effectuer 1
+colon se 1
+colon si 1
+colon si el 1
+colon sont 1
+colon sont align 1
+colon sont egal 1
+colon sur 1
+colon sur le 1
+color 14
+color a maxim 1
+color a simpl 1
+color a sub 1
+color actu 1
+color actu prov 1
+color agent 1
+color al edg 1
+color and shap 2
+color and textur 1
+color and tim 1
+color any inst 1
+color approach 1
+color ar suff 1
+color assignm 1
+color ba 2
+color ba featur 1
+color ba ind 1
+color ba segm 1
+color bundl 1
+color by using 1
+color can color 1
+color can thus 1
+color cod 1
+color cod tr 1
+color comp 1
+color compl 1
+color compon 1
+color correspon 1
+color cuing 1
+color dat 1
+color dat structur 1
+color detail 1
+color differ 2
+color differ cap 1
+color direct 1
+color direct multigraph 1
+color displ 1
+color dissimil 1
+color dissimil threshold 1
+color dist 1
+color dist uniform 1
+color distribut 1
+color dynam 1
+color dynam rang 1
+color endfor 1
+color fabr 1
+color fabr sampl 1
+color featur 1
+color featur ind 1
+color from decr 1
+color giv 1
+color giv ri 1
+color histogram 1
+color histogram dist 1
+color histogram featur 1
+color histogram ind 1
+color histogram platform 1
+color histogram quer 1
+color histogram rel 1
+color histogram vect 1
+color ident 1
+color imag 1
+color ind 1
+color inform 1
+color inst 1
+color intersect 1
+color is calcl 1
+color is defin 1
+color is qd 1
+color is sj 1
+color is tj 1
+color key 1
+color l1 1
+color list 1
+color lr 1
+color map 1
+color map funct 1
+color may requir 1
+color optim 1
+color optim color 1
+color or textur 1
+color pair 1
+color pair approach 1
+color pan 1
+color pan displ 1
+color pattern 1
+color pattern spread 1
+color per me 1
+color percept 1
+color point 1
+color problem 1
+color qu 1
+color reconstruc 1
+color reconstruc no.8 1
+color reg 1
+color reg extract 1
+color rel 1
+color rel featur 1
+color repr 1
+color retrief 1
+color retrief mechan 1
+color segm 1
+color simil 1
+color spac 1
+color spac navig 1
+color subgraph 1
+color textur 1
+color textur segm 1
+color th bundl 1
+color th correspon 1
+color th edg 1
+color that bundl 1
+color tok 1
+color tok empl 1
+color using 1
+color wil determin 1
+color with color 1
+color with exact 1
+color with priorit 1
+color without viol 1
+colorad 2
+colorad at boulder 1
+colour 3
+colour as v1 1
+colour color 1
+colour cub 1
+colour is reach 1
+colour of v1 1
+colour tr 1
+colour videotap 1
+columb 3
+columb mak 1
+columb mak virtu 1
+columb s multim 1
+columb univer pr 1
+columbus 8
+column 31
+column and gi 1
+column and inner 1
+column and return 1
+column and row 1
+column and ver 1
+column becom 1
+column becom rel 1
+column bus 1
+column by column 1
+column c2i 1
+column can establ 1
+column con 1
+column contain 2
+column contain exampl 1
+column contain subtyp 1
+column contribut 1
+column contribut fil 1
+column correspon 2
+column def 1
+column divid 1
+column giv 1
+column ha 2i 1
+column ind 2
+column ind ar 1
+column is denot 1
+column is simil 1
+column is typ 1
+column major 1
+column major order 1
+column nam 1
+column nam relstder 1
+column ns0 1
+column ns0 contain 1
+column ns1 1
+column ns1 contain 1
+column o contain 1
+column of 2i 1
+column of a0 1
+column of a00 1
+column of c0 1
+column of c00 1
+column of c00j 1
+column of figur 1
+column of interm 1
+column of number 1
+column of rectangl 1
+column of ri 1
+column of switch 1
+column of tabl 1
+column of tk 1
+column of weigh 1
+column pag 1
+column pag wh 1
+column par 1
+column permut 1
+column qr 1
+column qr contain 1
+column rec 1
+column rec fil 1
+column refer 1
+column repr 1
+column result 1
+column s contain 1
+column sampl 1
+column sampl mean 1
+column show 3
+column show proc 1
+column speedup 1
+column speedup prec 1
+column speedup show 1
+column standard 1
+column standard dev 1
+column using 1
+column vect 1
+column wh 1
+column wh text 1
+column wi 1
+column wid 1
+column1 1
+columnsort 1
+columnsort algorithm 1
+com 78
+com a instanc 1
+com about prec 1
+com acc 1
+com acc el 1
+com acm 1
+com adapter 1
+com adapter la 1
+com akl 1
+com and becom 1
+com and correct 1
+com and crit 1
+com and encourag 1
+com and henc 1
+com and suggest 1
+com and thought 1
+com appl 1
+com apr 1
+com apr es 1
+com arg2 1
+com arg3 1
+com as el 1
+com assouplir 1
+com assouplir ce 1
+com avant 1
+com avant la 1
+com avec 2
+com avec tous 1
+com back slight 1
+com begin 1
+com begin glyph 1
+com between aud 1
+com bloc 1
+com bloc de 1
+com boucl 1
+com boucl de 1
+com by brook 1
+com cadr 1
+com cadr de 1
+com calculer 1
+com calculer pr 1
+com cannot occur 1
+com cant par 1
+com ce 2
+com ce adr 1
+com ce instruc 1
+com ce th 1
+com cel 2
+com cel etait 1
+com cel peut 1
+com cel se 1
+com ceron 1
+com ceron par 1
+com cest 2
+com cest le 2
+com ch 1
+com ch langu 1
+com closer 1
+com comp 1
+com compl 1
+com compl ement 1
+com con 2
+com con au 1
+com con dan 1
+com con par 2
+com condit 1
+com condit dun 1
+com construir 1
+com construir un 1
+com cont 1
+com cost 1
+com cost tok 1
+com d eriv 1
+com d eterminer 1
+com dan 3
+com dan la 1
+com dan le 2
+com dan lexempl 1
+com dan notr 1
+com dat 1
+com dat collect 1
+com de 4
+com de but 1
+com de cach 1
+com de enregister 1
+com de instruc 1
+com de probabilit 1
+com de simpl 1
+com de term 1
+com de vecteur 1
+com dem 1
+com dev 1
+com dev etr 1
+com dexam 2
+com dhabitud 1
+com disc 1
+com distribu 1
+com distribu es 1
+com doit 1
+com don 1
+com don ladr 1
+com du 1
+com du cod 1
+com e de 1
+com eclip 1
+com ee 1
+com ee sect 1
+com el 1
+com el ement 1
+com en 1
+com en jm 1
+com entit 1
+com espac 1
+com espac de 1
+com et osm 1
+com etant 1
+com etant de 1
+com etant le 1
+com etant non 1
+com etant temporair 1
+com etant un 1
+com exclus 1
+com exempl 2
+com exempl de 1
+com expliquer 1
+com expliquer qu 1
+com explorer 1
+com explorer larbr 1
+com fa 1
+com fa part 1
+com fair 1
+com fair de 1
+com fair pour 1
+com field 1
+com field wh 1
+com first serv 1
+com follow 1
+com foncteur 1
+com from constraint 1
+com from continu 1
+com from elimin 1
+com from environm 1
+com from input 1
+com from lim 1
+com from loop 1
+com from structur 1
+com from system 1
+com from unif 1
+com from wid 1
+com funct 1
+com funct parameter 1
+com g en 1
+com g erer 1
+com globalisabl 1
+com grain 1
+com grain de 1
+com hypoth 1
+com hypoth es 1
+com il 2
+com il avait 1
+com il est 1
+com il ny 1
+com il sagit 1
+com il sav 1
+com indiqu 1
+com indiv 1
+com indiv lec 1
+com int 1
+com int egrer 1
+com int pl 2
+com interpr 1
+com interpr eter 1
+com is equiv 1
+com is giv 1
+com is introduc 1
+com is opt 1
+com la 2
+com la mach 1
+com la quantif 1
+com la radiograph 1
+com la sug 1
+com la wam 1
+com lappliquer 1
+com lappliquer dan 1
+com larit 1
+com le 5
+com le aut 1
+com le co 1
+com le concept 1
+com le construc 1
+com le coroutin 1
+com le environ 1
+com le ferait 1
+com le font 1
+com le implanter 1
+com le montr 3
+com le nombr 1
+com le pa 1
+com le point 2
+com le prouv 1
+com le som 1
+com le structur 1
+com le sug 1
+com le techniqu 1
+com le tutoriel 1
+com le typ 1
+com le utiliser 1
+com le variabl 1
+com lec 1
+com lec dun 1
+com lec ecut 1
+com led 1
+com lensembl 1
+com lensembl de 1
+com lestampil 1
+com lestampil na 1
+com lever 1
+com lever ce 1
+com lhom 1
+com lim 1
+com lim de 1
+com lim par 1
+com linstruc 1
+com linstruc standard 1
+com lirm 1
+com lon 1
+com lon pouvait 1
+com lunif 1
+com mad 1
+com mener 1
+com mener tous 1
+com moy 1
+com moy destampil 1
+com n etant 1
+com nous 3
+com nous allon 1
+com nous cherchon 1
+com nous lavon 1
+com nous le 3
+com nous lindiqu 1
+com nous nous 1
+com obtenir 1
+com obtenir le 1
+com of rol 1
+com on cherch 1
+com on dat 1
+com on draft 1
+com on earl 2
+com on inser 1
+com on la 1
+com on lim 1
+com on ne 1
+com on oper 1
+com on parallel 1
+com on peut 1
+com on sc 1
+com op 1
+com op erateur 1
+com oper 1
+com orig 1
+com orig de 1
+com ou 1
+com ou osm 1
+com out differ 1
+com pa 1
+com pa en 1
+com pal 1
+com pal aux 1
+com param 1
+com param etr 1
+com part 1
+com part int 1
+com partitionner 1
+com peut 1
+com pil 1
+com pil loc 1
+com plus ag 1
+com point 3
+com point de 2
+com point sur 1
+com pour 2
+com pour la 1
+com pour le 1
+com pour lind 1
+com pr 3
+com pr ec 2
+com pr esent 1
+com prat 1
+com prat proc 1
+com protocol 2
+com r eel 1
+com r esultat 1
+com racin 1
+com racin de 1
+com rec 1
+com rec failur 1
+com record 1
+com record link 1
+com record pair 1
+com rel 1
+com repr 1
+com repr senter 1
+com sect 1
+com seffectu 1
+com seffectu ce 1
+com separ 2
+com separ list 1
+com separ tupl 1
+com sil 1
+com sil sagissait 1
+com simultan 1
+com somewh 1
+com sous 1
+com sous champ 1
+com st 1
+com subtransact 1
+com sug 1
+com sug er 1
+com suit 4
+com sur 1
+com sur le 1
+com t est 1
+com tail 2
+com tail de 2
+com tb 1
+com tb en 1
+com th cour 1
+com th subtransact 1
+com th system 1
+com to debug 1
+com to fact 1
+com to vid 1
+com tout 1
+com tout le 1
+com traiter 1
+com traiter le 1
+com transact 2
+com transact finish 1
+com transform 1
+com transform de 1
+com triv 1
+com un 5
+com un architectur 1
+com un asser 1
+com un ba 1
+com un bon 1
+com un cach 1
+com un certain 1
+com un ch 1
+com un claus 1
+com un contraint 1
+com un courb 1
+com un dilat 1
+com un ensembl 1
+com un evolut 1
+com un fonct 2
+com un form 1
+com un imperfect 1
+com un interv 1
+com un moy 1
+com un op 1
+com un pointeur 1
+com un port 1
+com un pseud 1
+com un simpl 1
+com un sourc 1
+com un test 1
+com un tout 1
+com un var 1
+com under incr 1
+com upd 1
+com ver natur 1
+com visu 1
+com within reach 1
+com work 1
+com x3h5 1
+com. 4
+com94 1
+comb 61
+comb a detail 1
+comb a number 1
+comb allow 1
+comb an xp 1
+comb and dissect 1
+comb chain 1
+comb compon 1
+comb en 1
+comb en fait 1
+comb featur 5
+comb inform 2
+comb inform de 1
+comb involut 1
+comb is lik 1
+comb lutil 1
+comb lutil denregister 1
+comb me 1
+comb me xp 1
+comb of ai1 1
+comb of atom 1
+comb of auxc 1
+comb of ba 1
+comb of branch 1
+comb of bus 2
+comb of constraint 2
+comb of dec 1
+comb of dynam 1
+comb of eq 1
+comb of error 1
+comb of exper 1
+comb of fit 1
+comb of implicit 1
+comb of level 1
+comb of loc 1
+comb of multipl 1
+comb of network 1
+comb of parameter 1
+comb of proc 1
+comb of reason 1
+comb of result 1
+comb of shortcom 1
+comb of simpl 1
+comb of surfac 3
+comb of task 1
+comb of var 1
+comb of virtu 1
+comb of vot 1
+comb of word 1
+comb oper 1
+comb or sequ 1
+comb our research 1
+comb p1 1
+comb pixel 1
+comb prim 1
+comb prim sol 1
+comb r1 1
+comb simpl 1
+comb th concept 1
+comb th confid 1
+comb th del 1
+comb th featur 1
+comb th id 1
+comb th increm 1
+comb th prob 1
+comb th r1 1
+comb th result 1
+comb th rol 1
+comb th scal 2
+comb th valu 1
+comb th wavel 1
+comb thr experim 1
+comb to 9e 1
+comb to form 1
+comb to render 1
+comb tw techniqu 1
+comb un 1
+comb we ge 1
+comb with backtrack 1
+comb with belief 1
+comb with recur 1
+combin 71
+combin a ceux 1
+combin adv 1
+combin algorithm 3
+combin an 2
+combin any non 1
+combin ar chain 1
+combin ar undefin 1
+combin arithm 1
+combin art 1
+combin as describ 1
+combin aspect 2
+combin ba 2
+combin ba langu 1
+combin by nest 1
+combin cap 1
+combin compon 1
+combin configur 1
+combin crcw 1
+combin dec 1
+combin e avec 1
+combin ee 2
+combin ee au 1
+combin ee aux 1
+combin ee avec 1
+combin effect 1
+combin equ 1
+combin error 1
+combin es 1
+combin es avec 1
+combin expl 3
+combin fragm 1
+combin framework 1
+combin funct 1
+combin gr 1
+combin gr cod 1
+combin intellig 1
+combin lat 1
+combin le 1
+combin le tr 1
+combin level 2
+combin level compar 1
+combin multipl 1
+combin multipl lead 1
+combin n 2d 1
+combin natur 1
+combin object 2
+combin object orient 1
+combin of fact 1
+combin of fit 1
+combin of ment 1
+combin of mult 1
+combin of proc 2
+combin of sharp 1
+combin of subsystem 1
+combin of var 1
+combin of vect 1
+combin optim 3
+combin our method 1
+combin overlap 1
+combin paradigm 1
+combin pattern 1
+combin pattern match 1
+combin problem 3
+combin reduc 1
+combin reduc rel 1
+combin rel 1
+combin rel calculus 1
+combin remark 1
+combin result 1
+combin scor 1
+combin simpl 1
+combin siz 1
+combin soft 1
+combin soft dec 1
+combin som resolut 1
+combin spac 1
+combin st 1
+combin st understand 1
+combin support 1
+combin th featur 1
+combin th inform 1
+combin th proper 1
+combin th result 2
+combin th specif 1
+combin th yield 1
+combin theor 5
+combin to establ 1
+combin to form 1
+combin to giv 1
+combin to obtain 1
+combin tw typ 1
+combin unicast 1
+combin unif 1
+combin upd 1
+combin var 1
+combin var kind 1
+combin vot 1
+combin vot matr 1
+combin with abstract 1
+combin with adv 1
+combin with color 1
+combin with ec 1
+combin with eff 1
+combin with le 1
+combin with po 1
+combin with reif 1
+combin with retrief 1
+combin within scal 1
+combinaison 3
+combinaison de 2
+combinaison de attribut 1
+combinaison de ce 1
+combinaison de cr 1
+combinaison de la 1
+combinaison de linver 1
+combinaison dordonnanc 1
+combinaison du 1
+combinaison du support 1
+combinaison dun 1
+combinaison dun architectur 1
+combinaison imp 1
+combinaison imp de 1
+combinaison lin 1
+combinaison lin eair 1
+combinaison manqu 1
+combinaison manqu con 1
+combinaison ne 1
+combinaison ne sembl 1
+combinatoir 1
+combinatoir et statistiqu 1
+combinatoir tr 1
+combinatoir tr es 1
+combiner 3
+combiner attribut 1
+combiner dan 1
+combiner deux 1
+combiner deux condit 1
+combiner le 1
+combiner le eff 1
+combiner le test 1
+combiner lutil 1
+combiner lutil de 1
+combiner support 1
+combiner support du 1
+comer 1
+comfort 5
+comfort autom 1
+comfort autom tun 1
+comfort of program 1
+comfort prototyp 1
+comfort speed 1
+comin 1
+comlab.ox.ac.uk 2
+command 18
+command and evalu 1
+command and multipl 1
+command and upd 1
+command aus 1
+command aus le 1
+command cs 1
+command cs evalu 1
+command dat 1
+command dat structur 1
+command ee 1
+command ee par 1
+command f op 1
+command fal 1
+command hap 1
+command inclus 1
+command is exact 1
+command is plac 1
+command is requir 1
+command label 1
+command label li1 1
+command lin 3
+command lin interfac 2
+command lin opt 1
+command lin tool 1
+command menu 1
+command menu dat 1
+command must satisf 1
+command nam 2
+command not 1
+command orthogon 1
+command plac 1
+command prompt 1
+command request 1
+command requir 2
+command respect 1
+command return 1
+command situ 1
+command specif 2
+command that exerc 1
+command to notif 1
+command to ping 1
+command traff 1
+command traff pertain 1
+command un 1
+command un explor 1
+command under contract 1
+command which affect 1
+command.15 1
+command.15 third 1
+commault 1
+commenc 1
+commenc a etr 1
+commenc ee 1
+commenc ee au 1
+commenc ou 1
+commenc ou fin 1
+commenc un pav 1
+commencer 1
+commencer la 1
+commencer la secon 1
+commencer par 1
+commencer par analyser 1
+commencer par sp 1
+commenceron 1
+commenceron par 1
+commenceron par exprimer 1
+commentair 1
+commentair qu 1
+commentair qu mont 1
+commerc 22
+commerc and milit 1
+commerc and scientif 1
+commerc appl 1
+commerc avail 1
+commerc avail system 1
+commerc developer 1
+commerc fault 2
+commerc fault toler 1
+commerc fault tr 1
+commerc high speed 1
+commerc libr 2
+commerc mach 1
+commerc mp 1
+commerc oolp 1
+commerc oolp system 1
+commerc oper 1
+commerc oper system 1
+commerc organ 1
+commerc pack 1
+commerc pack simil 1
+commerc parallel 1
+commerc parallel dbm 1
+commerc produc 3
+commerc produc libr 1
+commerc prolog 1
+commerc prolog system 1
+commerc purp 1
+commerc rout 1
+commerc rout testb 1
+commerc softwar 1
+commerc softwar system 1
+commerc softwar vendor 1
+commerc tool 1
+commin 1
+commitm 10
+commitm ar mad 1
+commitm is cont 1
+commitm is mad 1
+commitm protocol 1
+commitm repr 1
+commitm repr del 1
+commitmentand 1
+commitmentand knowledg 1
+committm 1
+commmon 1
+commmun 3
+commmun link 2
+commmun link speed 2
+commod 1
+commod hardwar 1
+common 79
+common abstract 1
+common accept 1
+common accept method 1
+common activ 1
+common adopt 1
+common adopt word 1
+common among mo 1
+common ancest 2
+common ancest network 1
+common and diverg 1
+common ar 1
+common argum 1
+common assoc 1
+common at runtim 1
+common attribut 1
+common avail 4
+common avail featur 1
+common avail internet 1
+common belief 2
+common block 1
+common ca 3
+common ca chang 1
+common cal act 1
+common caus 1
+common character 3
+common circl 1
+common comput 1
+common comput geometer 1
+common configur 1
+common consider 2
+common consider exampl 1
+common consider stat 1
+common design 1
+common design strateg 1
+common div 1
+common empl 1
+common empl condit 1
+common endpoint 1
+common espec 1
+common european 1
+common european langu 1
+common evolut 1
+common evolut proc 1
+common featur 1
+common fl 1
+common fl text 1
+common found 1
+common found approach 1
+common funct 1
+common goal 1
+common hardwar 2
+common hardwar ba 1
+common hardwar interfac 1
+common imag 1
+common imag proc 1
+common in datab 1
+common in distribut 2
+common in german 1
+common inst 1
+common instruc 1
+common interfac 1
+common interfac chang 1
+common junior 1
+common junior oper 1
+common junior relationship 1
+common lisp 2
+common lisp error 1
+common lisp format 1
+common lisp object 1
+common lisp simpl 1
+common list 1
+common list member 1
+common log 1
+common log program 1
+common lower 1
+common lower bound 1
+common mean 1
+common misconcept 1
+common mistak 1
+common modl 1
+common multipl 1
+common nam 1
+common neighbor 1
+common norm 1
+common norm form 1
+common occur 1
+common oper 1
+common origin 1
+common output 1
+common output link 1
+common pair 1
+common part 1
+common pattern 1
+common point 1
+common pract 4
+common pract tim 1
+common pref 1
+common pref st 1
+common pref u0 1
+common privileg 1
+common privileg augm 1
+common problem 2
+common proc 1
+common program 1
+common program guidel 1
+common programmer 1
+common proper 1
+common queu 1
+common r proc 1
+common reduc 1
+common reduc w1 1
+common repr 1
+common requir 1
+common risc 1
+common risc featur 1
+common scal 1
+common scal fact 1
+common schem 2
+common schem variabl 1
+common se 1
+common secon ph 1
+common sen 2
+common sen term 1
+common senior 1
+common senior oper 1
+common senior relationship 1
+common situ 1
+common solut 2
+common sub 1
+common substructur 1
+common subtyp 1
+common super 1
+common task 1
+common techniqu 2
+common term 1
+common to describ 1
+common to sep 1
+common transform 1
+common upper 1
+common upper bound 1
+common us 2
+common us criter 1
+common us in 1
+common us meter 1
+common us repr 1
+common us task 1
+common us traff 2
+common us word 1
+common usag 1
+common var 1
+common ver 1
+common with gener 1
+common word 2
+common zer 1
+commonjunior 1
+commonjunior relationship 1
+commonplac 1
+commonplac and afford 1
+commperf.html 1
+commun 96
+commun a la 1
+commun a lav 1
+commun a me 1
+commun acr cluster 1
+commun acr proc 1
+commun actu 1
+commun actu tak 1
+commun agreed 1
+commun allow 1
+commun and commun 1
+commun and comput 4
+commun and deleg 1
+commun and jean 1
+commun and negot 1
+commun and proc 1
+commun and reduc 1
+commun and sign 1
+commun and specif 1
+commun and synchron 1
+commun and us 1
+commun ar 1
+commun ar overlap 1
+commun ar perform 1
+commun ar pr 1
+commun architectur 1
+commun asynchron 1
+commun attr 1
+commun avec 1
+commun bandwidth 4
+commun bandwidth offer 1
+commun bandwidth scal 1
+commun between badg 1
+commun between build 1
+commun between chain 1
+commun between comput 1
+commun between context 1
+commun between indep 1
+commun between proc 4
+commun between solut 1
+commun between string 1
+commun between stud 1
+commun between thread 1
+commun bottleneck 3
+commun bottleneck du 1
+commun bottleneck impl 1
+commun by allow 1
+commun by asynchron 1
+commun by bsd 1
+commun by exchang 1
+commun by mean 1
+commun can tak 1
+commun channel 6
+commun channel result 1
+commun character 1
+commun codif 1
+commun codif dat 1
+commun com 1
+commun com le 1
+commun compon 1
+commun coproc 1
+commun cost 6
+commun cost assoc 1
+commun cost cc 1
+commun cost divid 1
+commun cost incr 1
+commun countr 1
+commun cr 1
+commun d tect 1
+commun dat 2
+commun datab 1
+commun de 1
+commun de ba 1
+commun del 2
+commun del degrad 1
+commun del effect 1
+commun dep 1
+commun dep result 1
+commun doit 1
+commun doit non 1
+commun du 1
+commun dur 1
+commun dur learn 1
+commun dur lec 1
+commun effectif 1
+commun entr 2
+commun entr le 1
+commun entr processeur 1
+commun entr processus 1
+commun est 2
+commun est alor 1
+commun est beaucoup 1
+commun est qu 1
+commun et du 1
+commun et tout 1
+commun et un 1
+commun failur 2
+commun fault 1
+commun for ar 1
+commun for asynchron 1
+commun for support 1
+commun from neighbour 1
+commun funct 1
+commun graph 1
+commun graph repr 1
+commun guar 1
+commun ha becom 1
+commun hardwar 1
+commun hardwar overhead 1
+commun highlight 1
+commun in bpc 1
+commun in fft 1
+commun in lind 1
+commun in synchron 1
+commun in wormhol 1
+commun ind 1
+commun ind fin 1
+commun indexinf 1
+commun indiffer 1
+commun indirect 1
+commun inform 2
+commun inform ahead 1
+commun int 1
+commun interfac 1
+commun is accompl 1
+commun is assum 1
+commun is asynchron 1
+commun is dat 1
+commun is determin 1
+commun is equ 1
+commun is exp 1
+commun is fast 1
+commun is minim 1
+commun is nec 1
+commun is st 1
+commun is subject 1
+commun is support 2
+commun issu 2
+commun issu de 1
+commun it deliber 1
+commun it intent 1
+commun knowledg 1
+commun la 1
+commun la var 1
+commun langu 1
+commun lat 3
+commun layer 1
+commun le 1
+commun libr 3
+commun libr funct 1
+commun lin 1
+commun link 5
+commun link determin 2
+commun link speed 2
+commun load 1
+commun loc 2
+commun localiz 1
+commun ma 1
+commun ma le 1
+commun magaz 3
+commun manag 2
+commun manag issu 1
+commun manager 1
+commun mask 1
+commun may contain 1
+commun me 1
+commun mechan 1
+commun mechan protocol 1
+commun med 3
+commun memor 1
+commun mod 3
+commun mod avail 1
+commun mod el 1
+commun mod transl 1
+commun mod util 1
+commun model 4
+commun model allow 1
+commun n ecessair 1
+commun ne 1
+commun ne dev 1
+commun network 7
+commun network design 1
+commun non 1
+commun non loc 1
+commun nonloc 1
+commun object 1
+commun occur 1
+commun of acm 1
+commun of bundl 1
+commun of exper 1
+commun of user 1
+commun oper 3
+commun oper requir 1
+commun oper using 1
+commun overhead 2
+commun overlap 2
+commun par 2
+commun par bus 1
+commun par echang 1
+commun par linterm 1
+commun par pag 1
+commun par variabl 1
+commun paradigm 1
+commun paradigm wh 1
+commun path 4
+commun pattern 4
+commun pen 1
+commun pen lec 1
+commun per el 1
+commun per thread 1
+commun perform 2
+commun perform character 1
+commun perform interpl 1
+commun perform predict 1
+commun perm 1
+commun perm de 1
+commun perm desp 1
+commun ph 2
+commun port 1
+commun possibl 1
+commun possibl physiqu 1
+commun pour 1
+commun pr 1
+commun pr serv 1
+commun primitiv 4
+commun primitiv gener 1
+commun primitiv prop 1
+commun primitiv transp 1
+commun problem 2
+commun problem requir 1
+commun proc 2
+commun proc architectur 1
+commun protocol 2
+commun qu 1
+commun qu lon 1
+commun raison 1
+commun rat 2
+commun reduc 1
+commun rel 1
+commun requir 2
+commun research 1
+commun research center 1
+commun review 1
+commun rl 1
+commun rl imp 1
+commun rout 1
+commun s 1
+commun s il 1
+commun san prendr 1
+commun schedl 1
+commun schedl construc 1
+commun schedl sd 1
+commun schem 4
+commun schem ba 1
+commun schem support 1
+commun seem 1
+commun sent 1
+commun sequ 2
+commun sequ proc 2
+commun serv 2
+commun si 1
+commun si il 1
+commun softwar 2
+commun spac 1
+commun spac trad 1
+commun specl 1
+commun specl check 1
+commun start 1
+commun step 2
+commun structur 1
+commun structur vol 1
+commun sub 1
+commun sub system 1
+commun subsystem 2
+commun suiv 1
+commun switch 1
+commun switch techniqu 1
+commun system 1
+commun tak 2
+commun tak plac 2
+commun task 1
+commun technolog 1
+commun th puzzl 1
+commun their intent 1
+commun their understand 1
+commun theor 1
+commun tim 8
+commun tim 2d 1
+commun tim correspon 1
+commun tim d2 1
+commun tim du 1
+commun tim equ 1
+commun tim ge 1
+commun tim qd 1
+commun tim remain 1
+commun tim requir 1
+commun tim spent 1
+commun tim tcom 1
+commun tim tinter 1
+commun tim vs 1
+commun to comput 1
+commun to enforc 1
+commun to overlap 1
+commun to perform 1
+commun to prcd 1
+commun topolog 2
+commun traff 3
+commun transl 1
+commun typ 1
+commun using 2
+commun using liv 1
+commun vi dynam 1
+commun vi me 1
+commun vol 1
+commun wa assum 1
+commun whil using 1
+commun wil hid 1
+commun with acc 1
+commun with aud 1
+commun with fewer 1
+commun with pvm 1
+commun with resourc 1
+commun with respect 1
+commun with shar 1
+commun workshop 1
+commun would com 1
+commun would show 1
+communaut 1
+communaut e scientifiqu 1
+communicationm 1
+communicationm interconnect 1
+communicationm interconnect network 1
+communicationm libr 1
+communicationm libr calloverhead 1
+communicationsmanager 1
+communin 1
+communin non 1
+communin non loc 1
+communiquer 2
+communiquer par 1
+communiquer par echang 1
+communiquer par lectur 1
+communitat 1
+communitat europ 1
+commut 11
+commut if 8a 1
+commut lem 1
+commut lem simil 1
+commut oper 3
+commut simp 1
+commut simp say 1
+commut theor 1
+commut with parallel 1
+commut with r1 1
+commut with r2 1
+commutat 5
+commutat of log 1
+commutatif 1
+comnet 1
+comnet ii.5 1
+comnet ii.5 overview 1
+comp 51
+comp a triangl 1
+comp act 1
+comp against hardwar 1
+comp al act 1
+comp an op 1
+comp by coeff 1
+comp compon 1
+comp compon ea 1
+comp continu 1
+comp d efail 1
+comp dan 1
+comp dan la 1
+comp de 3
+comp de deux 1
+comp de lindividu 1
+comp de parent 1
+comp de tous 1
+comp discr 1
+comp discr es 1
+comp du 3
+comp du nouveau 1
+comp du vecteur 3
+comp dun 1
+comp dun coupl 1
+comp e appar 1
+comp e cmp 1
+comp e de 3
+comp e dun 1
+comp e est 1
+comp e na 1
+comp e ou 1
+comp e par 1
+comp e peuv 1
+comp e point 1
+comp e qu 1
+comp e serait 1
+comp e soient 1
+comp e sur 1
+comp e var 1
+comp e3 1
+comp ee 2
+comp ee de 2
+comp ee uniqu 1
+comp el 1
+comp electroniqu 1
+comp electroniqu condu 1
+comp es 1
+comp es correspon 1
+comp es cr 1
+comp es devenus 1
+comp es en 1
+comp es init 1
+comp es modif 1
+comp es qu 1
+comp es stock 1
+comp es tot 1
+comp est 1
+comp est op 1
+comp etit 1
+comp fonct 1
+comp fonct en 1
+comp for bi 1
+comp for del 1
+comp for system 1
+comp g om 1
+comp h1 1
+comp h1 par 1
+comp i1 1
+comp import 2
+comp import dun 1
+comp int larger 1
+comp is ap 1
+comp is assum 1
+comp is assur 1
+comp is compl 1
+comp la 1
+comp la construc 1
+comp lat 1
+comp le 1
+comp log 3
+comp log program 1
+comp log record 2
+comp mk 1
+comp of ff 1
+comp of level 1
+comp of multipl 1
+comp of rever 1
+comp of tetrahedr 1
+comp of text 1
+comp of un 1
+comp of val 1
+comp oper 1
+comp perform 1
+comp prefabr 1
+comp prefabr compon 1
+comp qu 1
+comp qu fonct 1
+comp sac 1
+comp sdot 1
+comp se 1
+comp se justif 1
+comp sont 2
+comp sont de 1
+comp sont op 1
+comp spat 1
+comp th block 1
+comp th bundl 1
+comp th kcm 1
+comp th mlt 1
+comp th op 1
+comp th path 1
+comp th result 1
+comp th upper 1
+comp that solut 1
+comp to form 1
+comp to model 1
+comp transact 2
+comp transact lock 1
+comp transl 1
+comp tw transact 1
+comp typ 1
+comp with var 1
+comp x2i 1
+comp x2i est 1
+comp.lang.prolog 1
+comp.risk 1
+comp1 1
+comp1 f12 1
+comp1 f12 gsmnd 1
+compact 19
+compact afin 1
+compact afin de 1
+compact and flec 1
+compact and mov 1
+compact at med 1
+compact begin 1
+compact continu 1
+compact counter 1
+compact counter valu 1
+compact de 1
+compact de la 1
+compact de surmonter 1
+compact distribut 1
+compact distribut dat 1
+compact ee 1
+compact en 1
+compact encod 1
+compact et dun 1
+compact fd 1
+compact fd repr 1
+compact form 1
+compact funct 1
+compact group 1
+compact interconnect 1
+compact interconnect network 1
+compact inv 1
+compact inv record 1
+compact invar 1
+compact invar se 1
+compact log 1
+compact manifold 1
+compact ou 1
+compact ou un 1
+compact pa 1
+compact pa la 1
+compact peuv 1
+compact peuv etr 1
+compact pr 1
+compact pr eserv 1
+compact problem 1
+compact problem occur 1
+compact record 1
+compact record sect 1
+compact repr 3
+compact se 1
+compact sect 1
+compact sever tim 1
+compact specif 1
+compact st 1
+compact st inform 1
+compact support 1
+compact support wavel 1
+compact tetrahedr 1
+compact tetrahedr result 1
+compact th buffer 1
+compact th list 1
+compact tim 1
+compact tim occur 1
+compact to list 1
+compact way 1
+compact writ 1
+compact zon 1
+compagnon 1
+compagnon and benjamin 1
+compagnon and pierc 1
+compagnon gav 1
+compagnon help 1
+compagnon help correct 1
+compagnon result 1
+compagnon us 1
+compagnon ver 1
+compan 26
+compan and empl 1
+compan cl 1
+compan cl dict 1
+compan cl structur 1
+compan claim 1
+compan claim sag 1
+compan con 1
+compan defin 1
+compan inc 1
+compan int div 1
+compan object 1
+compan produc 1
+compan produc guidel 1
+compan should sen 1
+compan that contain 1
+compan to empl 1
+compan view 1
+compan wh 1
+compan wish 1
+companion 4
+companion paper 1
+companion primitiv 1
+companion system 1
+compar 95
+compar 2cl 1
+compar a lower 1
+compar a mut 1
+compar a sender 1
+compar a.3 1
+compar a.3 condit 1
+compar accord 1
+compar act 1
+compar allow 1
+compar amount 1
+compar an 3
+compar an capabil 1
+compar and an 1
+compar and contrast 1
+compar and evalu 1
+compar and exchang 1
+compar and found 1
+compar and glob 1
+compar and shown 1
+compar and simil 1
+compar ar ident 1
+compar as follow 1
+compar aux 1
+compar av 1
+compar av revisit 1
+compar by assum 1
+compar by extract 1
+compar by implem 1
+compar by sum 1
+compar cal 1
+compar cal equiv 1
+compar cal return 1
+compar ce 1
+compar ce forml 1
+compar cl 1
+compar comp 1
+compar complec 1
+compar conclus 1
+compar condit 1
+compar condit conver 1
+compar consider 1
+compar consider p4 1
+compar consider s9 1
+compar contribut 1
+compar defin 1
+compar definit 1
+compar detect 1
+compar determin 1
+compar differ altern 2
+compar differ constraint 1
+compar differ nonmonot 1
+compar differ rout 1
+compar dist 1
+compar e au 1
+compar e no 1
+compar ea 2
+compar each fac 1
+compar ee 2
+compar ee aux 2
+compar equ 1
+compar es 2
+compar es aux 1
+compar es du 1
+compar evalu 1
+compar examin 1
+compar exhaust 1
+compar exhaust search 1
+compar find 1
+compar first mark 1
+compar funct 1
+compar ha absolut 1
+compar hem 1
+compar hierarch 1
+compar in term 2
+compar interconnect 1
+compar interconnect cost 1
+compar invok 1
+compar irrespect 1
+compar is bound 1
+compar is defin 1
+compar is glob 1
+compar is loc 1
+compar is restrict 1
+compar it cur 1
+compar it heur 1
+compar it perform 1
+compar lat 1
+compar lat definit 1
+compar le 2
+compar le nombr 1
+compar le point 1
+compar leap 2
+compar learn 2
+compar learn perform 1
+compar loc 2
+compar loc repr 1
+compar long term 1
+compar long tim 1
+compar look 1
+compar mark 2
+compar mark entr 1
+compar may ec 1
+compar mbr 1
+compar might seem 1
+compar model 1
+compar modl 1
+compar much lower 1
+compar multicast 1
+compar must consider 1
+compar nod 2
+compar nod label 1
+compar not 1
+compar of glob. 1
+compar of loc 1
+compar on sender 1
+compar or lower 1
+compar osl 1
+compar osl run 1
+compar our algorithm 1
+compar our polynom 1
+compar our result 2
+compar our work 2
+compar pandemon 1
+compar parm 1
+compar partit 1
+compar perform 1
+compar pot 1
+compar pot benefit 1
+compar pr 1
+compar procedur 1
+compar random 1
+compar real 1
+compar real gener 1
+compar regr 1
+compar regr test 1
+compar result 3
+compar resum 1
+compar rmsp 1
+compar rmsp throughput 1
+compar rout 1
+compar rout cop 1
+compar run 1
+compar s3 1
+compar satisf 1
+compar se 1
+compar seek 1
+compar select 1
+compar sic branch 1
+compar sic var 1
+compar softwar 1
+compar solut 1
+compar spf 1
+compar string 1
+compar stud 2
+compar succ 1
+compar symbol 1
+compar syst 1
+compar syst ematiqu 1
+compar th achief 1
+compar th algorithm 1
+compar th attribut 1
+compar th aver 2
+compar th behaviour 1
+compar th biolog 1
+compar th bisect 2
+compar th bit 1
+compar th ch 1
+compar th compl 1
+compar th constraint 1
+compar th effect 1
+compar th environm 1
+compar th experim 1
+compar th expr 1
+compar th fair 1
+compar th ga 1
+compar th input 1
+compar th lat 1
+compar th learn 1
+compar th model 1
+compar th nm 1
+compar th nxn 1
+compar th paragraph 1
+compar th parallel 1
+compar th perform 6
+compar th proc 2
+compar th proof 1
+compar th receiv 1
+compar th rel 2
+compar th respect 1
+compar th result 3
+compar th search 1
+compar th speed 1
+compar th string 1
+compar th system 1
+compar th throughput 1
+compar th tim 1
+compar th tot 1
+compar th valu 3
+compar th var 2
+compar th vm 1
+compar th wgp 1
+compar that compar 1
+compar that tot 1
+compar that yield 1
+compar their cost 1
+compar their el 1
+compar theor 1
+compar thr cod 1
+compar through casch 1
+compar to act 1
+compar to chac 1
+compar to cl 1
+compar to cmac 1
+compar to comput 1
+compar to conv 1
+compar to determin 1
+compar to educ 1
+compar to hardwar 1
+compar to input 1
+compar to maint 1
+compar to maintain 1
+compar to multilevel 1
+compar to network 1
+compar to nw 1
+compar to pgp 1
+compar to proc 1
+compar to result 1
+compar to sa 1
+compar to snoop 1
+compar to structur 1
+compar to textur 1
+compar to unicast 1
+compar to using 1
+compar to writ 1
+compar to zer 1
+compar top 1
+compar traver 1
+compar traver trac 1
+compar tw algorithm 1
+compar tw sequ 1
+compar tw singl 1
+compar tw structur 1
+compar ultim 1
+compar ultim plac 1
+compar un 1
+compar un impl 1
+compar us 1
+compar us testsonedg 1
+compar using 1
+compar valu 1
+compar valu return 1
+compar var 4
+compar var character 2
+compar var form 1
+compar var perform 2
+compar vi gsm 1
+compar walk 1
+compar walk for 1
+compar with algorithm 1
+compar with clp 1
+compar with commerc 1
+compar with entr 1
+compar with f2 1
+compar with hem 1
+compar with measur 1
+compar with other 1
+compar with respect 1
+compar with s5 1
+compar with schem 1
+compar with tabl 1
+compar work 2
+compar would eventu 1
+compar2 1
+compar2 begin 1
+compar2 begin traver 1
+compar2 by assum 1
+compar2 cal 1
+compar2 find 1
+compar2 from reach 1
+compar2 invok 1
+compar2 invok selecttest2 1
+compar2 is simil 1
+compar2 reach 1
+compar2 requir 1
+compar2 resum 1
+compar2 se 1
+compar2 select 1
+compar2 to selecttest2 1
+comparabl 2
+comparabl a cel 1
+comparabl a celu 1
+comparabl aux 1
+comparabl aux protocol 1
+comparaison 4
+comparaison avec 1
+comparaison avec la 1
+comparaison avec le 1
+comparaison avec loptim 1
+comparaison avec un 1
+comparaison d etail 1
+comparaison dadr 1
+comparaison de 4
+comparaison de algorithm 1
+comparaison de figur 1
+comparaison de la 1
+comparaison de notr 1
+comparaison de perform 1
+comparaison de speed 1
+comparaison du 1
+comparaison du point 1
+comparaison du travail 1
+comparaison entr 1
+comparaison entr le 1
+comparaison est 1
+comparaison est bi 1
+comparaison est identiqu 1
+comparaison n cessit 1
+comparaison na 1
+comparaison pav 1
+comparaison pav bloc 1
+comparaison sont 1
+comparaison sont fait 1
+comparer 3
+comparer a moindr 1
+comparer au 1
+comparer au foncteur 1
+comparer aux 1
+comparer aux figur 1
+comparer avec 1
+comparer avec la 1
+comparer avec le 1
+comparer ce 2
+comparer ce adr 1
+comparer l ag 1
+comparer la 1
+comparer la pdb 1
+comparer le 1
+comparer leur 1
+comparer leur comport 1
+comparer notr 1
+comparer quantitativ 1
+comparer quantitativ le 1
+comparison 60
+comparison acr configur 1
+comparison algorithm 1
+comparison and conver 1
+comparison and equ 1
+comparison and evalu 1
+comparison ba 1
+comparison between atom 1
+comparison between context 1
+comparison between md 1
+comparison between mmd 1
+comparison between pcct 1
+comparison in parallel 1
+comparison is bound 1
+comparison is consider 1
+comparison is nec 1
+comparison is support 1
+comparison model 1
+comparison mor interest 1
+comparison of 2cl 1
+comparison of algorithm 1
+comparison of ar 1
+comparison of architectur 1
+comparison of commerc 1
+comparison of del 1
+comparison of diagnost 1
+comparison of discr 1
+comparison of dsj 1
+comparison of eff 2
+comparison of fac 1
+comparison of fair 1
+comparison of hardwar 1
+comparison of nearest 1
+comparison of non 1
+comparison of rat 1
+comparison of recur 1
+comparison of rout 1
+comparison of sender 1
+comparison of sev 1
+comparison of sort 1
+comparison of stat 1
+comparison of tabl 1
+comparison of transform 1
+comparison on aver 1
+comparison oper 1
+comparison per level 1
+comparison result 1
+comparison techniqu 1
+comparison than sep 1
+comparison to construc 1
+comparison to determin 1
+comparison to equiv 1
+comparison to find 1
+comparison to known 1
+comparison to molecl 1
+comparison to siml 1
+comparison to softwar 1
+comparison we restrict 1
+comparison we treat 1
+comparison when comput 1
+comparison wil wast 1
+comparison with discr 1
+comparison with dpl 1
+comparison with eclip 1
+comparison with hierarch 1
+comparison with ib3 1
+comparison with lin 1
+comparison with mmd 1
+comparison with prev 1
+comparison with rmsp 1
+comparison with variabl 1
+comparison work 1
+comparit 1
+comparit evalu 1
+comparon 3
+comparon laffect 1
+comparon laffect destruc 1
+comparon le 2
+comparon le comport 1
+comparon le nid 1
+comparon le perform 1
+compat 14
+compat and interchang 1
+compat avec 3
+compat avec la 2
+compat avec le 1
+compat avec no 1
+compat avec un 1
+compat between cl 1
+compat exact 1
+compat for ec 1
+compat is 1
+compat is xcal 1
+compat lexer 1
+compat lexer conv 1
+compat matr 1
+compat of compon 1
+compat request 1
+compat supercl 1
+compat with jav2 1
+compat with lock 1
+compatibl 1
+compatibl pour 1
+compatibl pour la 1
+compcon 3
+compel 2
+compel reason 1
+compel to diverg 1
+compenast 1
+compenast for bi 1
+compensat 1
+compensat is requir 1
+compensat is suff 1
+compenser 1
+compenser la 1
+compenser la per 1
+competit 8
+competit between offspr 1
+competit ev year 1
+competit learn 1
+competit manag 1
+competit s libr 1
+compext 1
+compil 32
+compil a behavior 1
+compil a simil 1
+compil afin 1
+compil afin qu 1
+compil an act 1
+compil and execut 1
+compil and link 1
+compil and optim 1
+compil and program 1
+compil and run 1
+compil and therefor 1
+compil arithm 1
+compil arithm etiqu 1
+compil at maxim 1
+compil at sub 1
+compil behavior 1
+compil behavior vhdl 1
+compil by schem 1
+compil c cod 2
+compil chronolog 1
+compil chronolog program 1
+compil cod 2
+compil cod interpr 1
+compil constraint 1
+compil dat 1
+compil dat parallel 1
+compil de 2
+compil de claus 1
+compil de construc 1
+compil de disjonct 1
+compil de la 1
+compil de larithm 1
+compil de lunif 1
+compil de nid 1
+compil de program 1
+compil de prolog 1
+compil du 1
+compil du contr 1
+compil e ait 1
+compil e en 1
+compil e fail 1
+compil ee 1
+compil ee de 1
+compil ee en 1
+compil ee nest 1
+compil en 1
+compil en cod 1
+compil en lign 1
+compil es 1
+compil es avec 1
+compil es de 1
+compil es en 1
+compil est 1
+compil et de 1
+compil et le 1
+compil execut 1
+compil execut graph 1
+compil for tr 1
+compil framework 1
+compil glob 1
+compil glob ou 1
+compil grammar 1
+compil hal 1
+compil imper 1
+compil imper langu 1
+compil in 9s 1
+compil in isol 1
+compil in lin 1
+compil incr 1
+compil incr em 1
+compil ind 1
+compil ind epen 1
+compil int act 1
+compil int by 1
+compil int nat 1
+compil int surfac 1
+compil la 1
+compil la structur 1
+compil le 1
+compil le boucl 1
+compil le faux 1
+compil le probl 1
+compil level 1
+compil level reason 1
+compil may div 1
+compil me 1
+compil me object 1
+compil mod 1
+compil mod profon 1
+compil mod superficiel 1
+compil na 1
+compil of compound 1
+compil of control 1
+compil of hal 1
+compil of prolog 1
+compil part 1
+compil peut 1
+compil plaus 1
+compil plaus explan 1
+compil plus efficac 1
+compil pour 1
+compil pour conditionner 1
+compil pour eliminer 1
+compil pr 1
+compil pr log 1
+compil proc 2
+compil program 3
+compil prolog 1
+compil qu 1
+compil qu nous 1
+compil quau 1
+compil quau niveau 1
+compil sembl 1
+compil separ 1
+compil sequ 1
+compil sequ program 1
+compil si 1
+compil si lappel 1
+compil sint 1
+compil sint egr 1
+compil smal fortran 1
+compil soit 1
+compil spec 1
+compil spec langu 1
+compil specif 1
+compil svm 1
+compil svm fortran 1
+compil techniqu 3
+compil technolog 1
+compil th larger 1
+compil th scripter 1
+compil tim 16
+compil tim algorithm 1
+compil tim an 1
+compil tim bind 1
+compil tim inform 1
+compil tim methodolog 1
+compil tim mop 1
+compil tim result 1
+compil tim schedl 1
+compil tim simplif 1
+compil tim solut 1
+compil tim typ 1
+compil transform 1
+compil transform chaqu 1
+compil util 1
+compil util ee 1
+compil ver 1
+compil with continu 1
+compil with default 1
+compil writ 1
+compilabl 1
+compilabl en 1
+compilabl en lign 1
+compilateur 2
+compilateur classiqu 1
+compilateur classiqu consid 1
+compilateur dadapter 1
+compilateur dadapter le 1
+compilateur daquarius 1
+compilateur dauror 1
+compilateur de 2
+compilateur de kcm 1
+compilateur de la 1
+compilateur de tr 1
+compilateur de van 1
+compilateur doit 1
+compilateur doit alor 1
+compilateur et le 2
+compilateur et syst 1
+compilateur fortran 1
+compilateur gnu 1
+compilateur gnu cc 1
+compilateur kcm 1
+compilateur le 1
+compilateur modif 1
+compilateur ne 1
+compilateur ne dec 1
+compilateur ont 1
+compilateur ont pu 1
+compilateur par 1
+compilateur par an 1
+compilateur perm 1
+compilateur perm de 1
+compilateur peut 1
+compilateur peut aus 1
+compilateur peut ecarter 1
+compilateur peut garantir 1
+compilateur pour 2
+compilateur pour mvp 1
+compilateur pour repr 1
+compilateur produit 1
+compilateur produit sel 1
+compilateur produit tr 1
+compilateur prolog 1
+compilateur prolog de 1
+compilateur prolog pour 1
+compilateur prolog standard 1
+compilateur qu 1
+compilateur qu leur 1
+compilateur raison 1
+compilateur se 1
+compilateur se concentr 1
+compilateur2 1
+compilateur2 qu 1
+compilateur2 qu le 1
+compiler 32
+compiler a uniqu 1
+compiler al 1
+compiler al an 1
+compiler an 1
+compiler and architectur 1
+compiler and environm 1
+compiler and flag 1
+compiler and interpreter 1
+compiler and parm 1
+compiler and programmer 1
+compiler and runtim 1
+compiler as 1
+compiler as cach 1
+compiler as schem 1
+compiler aut 1
+compiler aut qu 1
+compiler avail 1
+compiler ba 2
+compiler ba approach 1
+compiler ba softwar 1
+compiler ba solut 1
+compiler bear 1
+compiler by d.h.d 1
+compiler c compiler 1
+compiler can extract 1
+compiler can gener 1
+compiler can stat 1
+compiler can us 1
+compiler chang 1
+compiler compiler 3
+compiler compiler field 1
+compiler compiler technolog 1
+compiler compiler tool 1
+compiler construc 3
+compiler construc preusserstr 1
+compiler construc tool 1
+compiler control 1
+compiler control thread 1
+compiler correct 1
+compiler de 1
+compiler de la 1
+compiler design 1
+compiler developm 1
+compiler diagnost 1
+compiler diagnost output 1
+compiler direct 1
+compiler direct cach 1
+compiler div 1
+compiler div program 1
+compiler enforc 1
+compiler ensur 1
+compiler field 1
+compiler for conv 1
+compiler for fujitsu 1
+compiler for hal 1
+compiler for hpf 1
+compiler for mimd 1
+compiler for parallel 5
+compiler for postf 1
+compiler for reflect 1
+compiler for schem 1
+compiler for svm 1
+compiler front 1
+compiler front en 1
+compiler gener 2
+compiler gener appropr 1
+compiler gener interm 1
+compiler gener pad 1
+compiler impl 1
+compiler implem 1
+compiler improv 1
+compiler in support 1
+compiler inclus 1
+compiler inclus su 1
+compiler inform 1
+compiler inform fil 1
+compiler inspect 1
+compiler inspect behavior 1
+compiler is avail 1
+compiler is describ 1
+compiler is respon 1
+compiler is therefor 1
+compiler know 2
+compiler la 1
+compiler le 1
+compiler le structur 1
+compiler le test 1
+compiler loop 1
+compiler loop transform 1
+compiler mak 1
+compiler mak funct 1
+compiler manag 1
+compiler must comb 1
+compiler of kcm 1
+compiler optim 5
+compiler or human 2
+compiler or runtim 1
+compiler or transl 1
+compiler perspect 1
+compiler program 1
+compiler program transform 1
+compiler prov 1
+compiler recogn 1
+compiler sourc 2
+compiler sourc cod 1
+compiler sourc program 1
+compiler support 2
+compiler support placeholder 1
+compiler system 1
+compiler tak 1
+compiler tak car 1
+compiler technolog 1
+compiler technolog using 1
+compiler th increm 1
+compiler that impl 1
+compiler to gener 2
+compiler to inv 1
+compiler to produc 1
+compiler to run 1
+compiler took 1
+compiler tool 1
+compiler transl 1
+compiler user 1
+compiler user guid 1
+compiler verif 1
+compiler verif concentr 1
+compiler which attempt 1
+compiler with decent 1
+compiler writ 1
+compiler writter 1
+compiler1 1
+compiler1 from intermeter 1
+compilerun 1
+compl 112
+compl 1st 1
+compl 1st order 1
+compl 2d 1
+compl a net 1
+compl a schedl 1
+compl a simpl 1
+compl abstract 1
+compl abstract facil 1
+compl aff 1
+compl affin 1
+compl aid 1
+compl algorithm 2
+compl an abort 1
+compl an earl 1
+compl analog 1
+compl and categor 1
+compl and expr 1
+compl and rectif 1
+compl and sort 1
+compl and therefor 1
+compl appl 1
+compl appl compon 1
+compl ar 2
+compl ar distinct 1
+compl architectur 1
+compl architectur support 1
+compl assignm 1
+compl at ea 1
+compl at init 1
+compl av 2
+compl av nonblock 1
+compl av slow 1
+compl becaus ab 1
+compl becaus multipl 1
+compl becaus nod 1
+compl befor iter 1
+compl behavior 1
+compl bin 1
+compl bin tr 1
+compl bit 1
+compl bit oper 1
+compl black 1
+compl bound 1
+compl bound quantif 1
+compl branch 1
+compl browser 1
+compl buffer 1
+compl buffer eventu 1
+compl by fredrickson 1
+compl by return 1
+compl by subsequ 1
+compl by transform 1
+compl c cod 1
+compl c program 1
+compl coinc 1
+compl collap 1
+compl column 1
+compl column refer 1
+compl compar 1
+compl con 1
+compl connect 3
+compl connect graph 2
+compl connect point 1
+compl constraint 1
+compl cycl 1
+compl cycl idl 1
+compl de 1
+compl de la 1
+compl denot 1
+compl design 1
+compl determin 1
+compl developm 1
+compl df 1
+compl diagnost 1
+compl diagnost algorithm 1
+compl differ approach 1
+compl differ mechan 1
+compl direct 1
+compl disjoint 1
+compl dispar 1
+compl dispar object 1
+compl domain 1
+compl domain indep 1
+compl du 1
+compl du contr 1
+compl elim 2
+compl elimin 2
+compl ement 2
+compl ement de 2
+compl ement dinform 1
+compl ement du 1
+compl ementair 2
+compl ementair de 1
+compl ementair du 1
+compl ementer 1
+compl ementer lunif 1
+compl empt 1
+compl entr 1
+compl enumer 1
+compl equiv 1
+compl es 5
+compl es de 3
+compl es douvr 1
+compl es du 1
+compl es fus 1
+compl es le 2
+compl es lutil 1
+compl es positif 1
+compl es risquerait 1
+compl est 1
+compl est qu 1
+compl est util 1
+compl establ 1
+compl et coh 1
+compl et ee 1
+compl eter 1
+compl eter en 1
+compl eter le 1
+compl eter un 1
+compl exampl 2
+compl exchang 1
+compl execut 3
+compl fail 1
+compl fil 2
+compl fil system 1
+compl fl 1
+compl flec 1
+compl for pict 1
+compl form 1
+compl fr 1
+compl framework 1
+compl giv 1
+compl goal 1
+compl graph 4
+compl graph kn 1
+compl ha occur 1
+compl he differ 1
+compl hist 1
+compl implem 1
+compl in expr 1
+compl in homework 1
+compl indep 2
+compl inform 2
+compl instead 1
+compl instruc 1
+compl instruc cycl 1
+compl interfac 1
+compl interfac system 1
+compl interv 1
+compl interv graph 1
+compl inver 1
+compl irrelev 1
+compl is gu 1
+compl is superior 1
+compl it ph 1
+compl it walk 1
+compl jigsaw 1
+compl jigsaw puzzl 1
+compl knowledg 2
+compl lack 1
+compl lat 3
+compl learn 1
+compl level 1
+compl list 3
+compl loc 2
+compl log 1
+compl log log 1
+compl mask 1
+compl match 1
+compl mean 1
+compl measur 2
+compl measur ser 1
+compl mi 1
+compl mi correspon 1
+compl mlt 1
+compl mlt subtransact 1
+compl model 2
+compl mult 1
+compl mult level 1
+compl network 1
+compl network satisf 1
+compl new bound 1
+compl new rol 1
+compl nor con 1
+compl nor orthogon 1
+compl not 1
+compl noun 1
+compl noun phr 1
+compl np 1
+compl np compl 1
+compl nt 1
+compl occur 1
+compl of act 1
+compl of collect 1
+compl of edg 1
+compl of inver 1
+compl of ml 1
+compl of mlp 1
+compl of msld 1
+compl of mtl 1
+compl of resolut 1
+compl of rollback 1
+compl of sort 1
+compl of strong 1
+compl of tempor 2
+compl of tpt 1
+compl op 1
+compl oper 2
+compl or part 1
+compl order 1
+compl order algorithm 1
+compl orthogon 1
+compl overlap 2
+compl pair 1
+compl part 1
+compl pattern 1
+compl pattern se 1
+compl ph 2
+compl pictur 1
+compl problem 6
+compl program 2
+compl program execut 1
+compl proof 3
+compl proof procedur 2
+compl proof theor 1
+compl purg 1
+compl q11 1
+compl qbfun4 1
+compl qbfun4 contain 1
+compl random 1
+compl reconstruc 1
+compl reconstruc algorithm 1
+compl reduc 1
+compl refer 1
+compl relief 1
+compl remov 1
+compl repr 1
+compl result 1
+compl scan 1
+compl se 8
+compl search 1
+compl search spac 1
+compl sect 1
+compl self 2
+compl self adapt 1
+compl self modif 1
+compl sem 1
+compl sem definit 1
+compl sen 1
+compl separ 1
+compl separ id 1
+compl sequ 1
+compl serv 1
+compl shel 1
+compl shel sequ 1
+compl situ 1
+compl softwar 1
+compl softwar environm 1
+compl solut 1
+compl sont 1
+compl sont donc 1
+compl sourc 1
+compl sourc cod 1
+compl specif 3
+compl specif string 1
+compl squar 1
+compl st 1
+compl stat 1
+compl stat network 1
+compl structur 1
+compl sub 1
+compl subtransact 1
+compl succ 1
+compl surround 1
+compl symbol 1
+compl symbol map 1
+compl syntac 1
+compl syntac par 1
+compl system 3
+compl system deriv 1
+compl system ver 1
+compl te 1
+compl techn 2
+compl techn model 1
+compl techn report 1
+compl term 1
+compl th bundl 1
+compl th cod 1
+compl th comp 1
+compl th construc 1
+compl th correct 1
+compl th cour 1
+compl th cur 2
+compl th design 1
+compl th interview 1
+compl th join 1
+compl th maint 1
+compl th map 1
+compl th me 1
+compl th metatheor 1
+compl th mst 1
+compl th pictur 1
+compl th pr 1
+compl th prev 1
+compl th program 1
+compl th proof 9
+compl th reduc 1
+compl th requir 1
+compl th search 2
+compl th sort 2
+compl th specif 1
+compl th structur 1
+compl th task 2
+compl th trac 1
+compl than assembler 1
+compl their work 1
+compl theor 1
+compl thing 2
+compl thing further 1
+compl tim 1
+compl tim incr 1
+compl tim jump 1
+compl tim pr 1
+compl titl 1
+compl to approxim 1
+compl to determin 1
+compl tr 1
+compl trac 1
+compl transact 1
+compl transpar 1
+compl typ 2
+compl typ infer 1
+compl typ specif 1
+compl uncheck 1
+compl uncorrel 1
+compl unsatisfact 1
+compl usu requir 1
+compl vi repeat 1
+compl with respect 1
+compl2 1
+compl2 mean 1
+compl3 1
+compl3 program 1
+complec 91
+complec a lec 1
+complec a mettr 2
+complec a task 1
+complec algorithm 2
+complec an 4
+complec an proceed 1
+complec and abstract 1
+complec and adapt 1
+complec and approxim 1
+complec and cap 1
+complec and dat 1
+complec and effect 1
+complec and finit 1
+complec and geometer 1
+complec and irregl 1
+complec and nonlin 1
+complec and obscur 1
+complec and perform 1
+complec and qu 1
+complec and scal 1
+complec and show 1
+complec and speed 1
+complec and stochast 1
+complec appl 2
+complec apr 1
+complec apr es 1
+complec ar clear 1
+complec ar common 1
+complec architectur 1
+complec architectur mismatch 1
+complec as comput 1
+complec becom 1
+complec becom o.jv 1
+complec behavior 1
+complec bound 3
+complec by allow 1
+complec by ch 1
+complec by deriv 1
+complec by divid 1
+complec by execut 1
+complec by succ 1
+complec c program 1
+complec ca 1
+complec ca involut 1
+complec cl 3
+complec cl cl 1
+complec cl determin 1
+complec cl se 1
+complec cl sf2c 1
+complec cod 1
+complec collect 1
+complec comport 1
+complec comport de 1
+complec computer 1
+complec computer system 1
+complec concept 1
+complec concept descript 1
+complec configur 1
+complec consider 2
+complec contour 1
+complec contour lin 1
+complec d ecrit 1
+complec d elim 1
+complec d ev 1
+complec dag 1
+complec dag schedl 1
+complec dan 1
+complec dan le 1
+complec dat 1
+complec dat structur 1
+complec decomposit 1
+complec deliv 1
+complec deliv vehicl 1
+complec dep 1
+complec dep strong 1
+complec deriv 1
+complec design 1
+complec design deep 1
+complec docum 1
+complec docum layout 1
+complec donc 1
+complec donc la 1
+complec du 1
+complec dun 2
+complec dun boucl 1
+complec dun grand 1
+complec dynam 1
+complec environm 1
+complec et la 1
+complec et peut 1
+complec et tr 1
+complec exampl 1
+complec execut 2
+complec execut model 1
+complec expect 1
+complec explod 1
+complec expr 1
+complec failur 1
+complec featur 1
+complec for achief 1
+complec for float 1
+complec for gener 1
+complec for integer 1
+complec for procedur 1
+complec for ye 1
+complec forml 1
+complec from datab 1
+complec hierarch 3
+complec hierarch system 1
+complec i multipl 1
+complec in larger 1
+complec in manipl 1
+complec in mlr 1
+complec in order 1
+complec in ptim 1
+complec incr 1
+complec interconnect 1
+complec interconnect structur 1
+complec interfac 1
+complec is ba 1
+complec is compar 1
+complec is elimin 1
+complec is entir 1
+complec is expon 1
+complec is indep 1
+complec is key 1
+complec is minim 1
+complec issu 2
+complec issu rel 1
+complec j multipl 1
+complec jusqu 1
+complec knowledg 1
+complec knowledg acquisit 1
+complec lat 1
+complec layout 1
+complec lim 1
+complec lorsquil 1
+complec lorsquil sagit 1
+complec low 2
+complec ma 1
+complec ma excessiv 1
+complec mc 1
+complec measur 2
+complec measur defin 1
+complec med 1
+complec med problem 1
+complec memor 2
+complec memor model 1
+complec memor system 1
+complec method 1
+complec model 2
+complec msy 1
+complec ne 1
+complec ne pour 1
+complec neur 1
+complec neur architectur 1
+complec next pack 1
+complec nightmar 1
+complec non 1
+complec non lin 1
+complec object 5
+complec of algorithm 1
+complec of an 1
+complec of analog 1
+complec of async 1
+complec of automat 1
+complec of boolean 2
+complec of calcl 1
+complec of compmst 1
+complec of comput 2
+complec of computer 2
+complec of datalog 1
+complec of dual 1
+complec of el 1
+complec of evalu 1
+complec of execut 1
+complec of fil 1
+complec of handl 1
+complec of implem 1
+complec of initialschedl 1
+complec of loc 1
+complec of log 1
+complec of mc 1
+complec of minim 1
+complec of network 2
+complec of parallel 1
+complec of privileg 1
+complec of problem 1
+complec of protocol 1
+complec of quer 1
+complec of recur 1
+complec of rel 1
+complec of select 1
+complec of siml 1
+complec of sort 1
+complec of specl 1
+complec of step 1
+complec of system 2
+complec of tableau 1
+complec of task 1
+complec of upd 1
+complec optim 1
+complec optim problem 1
+complec optim task 1
+complec or low 1
+complec orient 1
+complec orient view 1
+complec pattern 1
+complec pour 2
+complec pour etr 1
+complec pour ne 1
+complec probabil 1
+complec probabil exper 1
+complec problem 2
+complec problem domain 1
+complec proc 1
+complec program 1
+complec prov 1
+complec qu 3
+complec qu de 1
+complec qu le 1
+complec qu switch 1
+complec react 1
+complec react system 1
+complec reason 1
+complec reason proc 1
+complec reduc 1
+complec requir 1
+complec result 4
+complec result rel 1
+complec rl 1
+complec run 1
+complec scal 1
+complec schedl 1
+complec se 1
+complec se levin 1
+complec sent 1
+complec sent structur 1
+complec serv 1
+complec shap 2
+complec signif 1
+complec simil 1
+complec softwar 1
+complec softwar system 1
+complec sont 2
+complec sont alor 1
+complec sont construit 1
+complec specl 1
+complec specl funct 1
+complec stochast 1
+complec stochast system 1
+complec str 1
+complec str exam 1
+complec structur 2
+complec submodl 1
+complec submodl reflect 1
+complec surfac 1
+complec system 5
+complec system compr 1
+complec task 6
+complec term 3
+complec than singl 1
+complec theor 3
+complec thr dim 1
+complec through model 2
+complec through shar 1
+complec to dimin 1
+complec to put 1
+complec topolog 1
+complec traff 1
+complec traff manag 1
+complec unit 1
+complec upper 1
+complec upper bound 1
+complec using 1
+complec using conv 1
+complec wa giv 1
+complec wa prop 1
+complec wa shown 1
+complec we anticip 1
+complec we origin 1
+complec when compar 1
+complec which allow 1
+complec whil incr 1
+complec whil produc 1
+complec wil result 1
+complec without sacrif 1
+complec workload 1
+complec world 1
+complem 5
+complem by sect 1
+complem lat 1
+complem liter 1
+complem with knowledg 1
+completecycl 1
+completecycl idl 1
+completecycl idl du 1
+complexit 6
+complexit e additionnel 1
+complexit e algorithmiqu 1
+complexit e de 4
+complexit e du 2
+complexit e dun 1
+complexit e par 1
+complexit e proportionnel 1
+compliqu 2
+compliqu cep 1
+compliqu cep le 1
+compliqu ee 1
+compliqu ee en 1
+compliqu l elag 1
+compliqu net 1
+compliqu net le 1
+compliquer 1
+compliquer lop 1
+compliquer lop erat 1
+complut 1
+compmst 1
+compmst as follow 1
+compmst behav 1
+compmst improv 1
+compmst is equ 1
+compmst tak 1
+compmst to log 1
+compon 65
+compon ad 1
+compon adapt 1
+compon ae 1
+compon al maintain 1
+compon an 2
+compon and aver 1
+compon and behavior 1
+compon and connect 1
+compon and gener 1
+compon and nod 1
+compon and offer 1
+compon and realm 1
+compon and transform 1
+compon and us 2
+compon and zer 1
+compon appear 1
+compon appl 1
+compon appl inclus 1
+compon approach 1
+compon ar 1
+compon ar achief 1
+compon ar avail 1
+compon ar connect 1
+compon ar dash 1
+compon ar design 1
+compon ar gener 1
+compon ar int 1
+compon ar writ 1
+compon as typ 1
+compon ba 2
+compon ba design 1
+compon behav 1
+compon behavior 1
+compon behaviour 1
+compon belong 1
+compon bou 1
+compon build 1
+compon by giv 1
+compon by realm 1
+compon c1 1
+compon ca 1
+compon ca ev 1
+compon can acc 1
+compon can rang 1
+compon can satisf 1
+compon cl 1
+compon collect 1
+compon comb 1
+compon comb featur 1
+compon comp 1
+compon composit 1
+compon comput 1
+compon con 1
+compon concern 1
+compon construc 1
+compon contain 1
+compon correspon 2
+compon custom 1
+compon d3i 1
+compon dat 1
+compon dat structur 1
+compon decl 1
+compon definit 1
+compon dev 1
+compon displ 1
+compon displ manager 1
+compon dwarf 1
+compon ea 1
+compon edg 1
+compon either ec 1
+compon encapsl 1
+compon encapsl subsystem 1
+compon enhanc 1
+compon fail 1
+compon failur 1
+compon failur grac 1
+compon for tupl 1
+compon form 2
+compon framework 1
+compon from proc 1
+compon ha input 1
+compon ha writ 1
+compon hav read 1
+compon hierarch 1
+compon impl 1
+compon implem 1
+compon implem con 1
+compon in g0 1
+compon in mar 1
+compon in pr 1
+compon in respon 1
+compon in term 1
+compon inclus 1
+compon inclus propag 1
+compon inclus tot 1
+compon inform 1
+compon inform window 1
+compon inherit 1
+compon inst 1
+compon inst caus 1
+compon inst execut 1
+compon inst interact 1
+compon inst list 1
+compon inst pfp 1
+compon int 2
+compon int comp 1
+compon int link 1
+compon int req 1
+compon interact 1
+compon interfac 2
+compon interfac prov 1
+compon invok 1
+compon invok pm 1
+compon involut 1
+compon involut deep 1
+compon is connect 1
+compon is displ 1
+compon is evid 1
+compon is fir 1
+compon is implem 1
+compon is interest 1
+compon is invok 1
+compon is mad 1
+compon is parameter 1
+compon is stack 1
+compon it requir 1
+compon link 1
+compon link list 1
+compon maintain 1
+compon may fail 1
+compon min 1
+compon min modl 1
+compon model 2
+compon model len 1
+compon mount 1
+compon must import 1
+compon nod 2
+compon object 1
+compon occur 1
+compon of di 1
+compon of dw 1
+compon of exper 1
+compon of figur 1
+compon of graph 1
+compon of interest 1
+compon of oj 1
+compon of print 1
+compon of proc 1
+compon of program 1
+compon of rol 1
+compon of sign 1
+compon of tim 1
+compon of ts 1
+compon of uj 1
+compon of wj 1
+compon of y0 1
+compon of y1 1
+compon oper 1
+compon pa 1
+compon parameter 1
+compon part 1
+compon perform 1
+compon perform measur 1
+compon pf 1
+compon pf proc 1
+compon produc 1
+compon produc workload 1
+compon prov 1
+compon proxim 1
+compon r1 1
+compon r2 1
+compon r3 1
+compon regl 1
+compon regl exchang 1
+compon repr 1
+compon repr altern 1
+compon request 1
+compon requir 1
+compon resourc 1
+compon resourc avail 1
+compon respon 1
+compon reus 1
+compon rj0 1
+compon rol 1
+compon s implem 1
+compon s interfac 1
+compon s1 1
+compon s2 1
+compon short cl 1
+compon should go 1
+compon siz 1
+compon sourc 1
+compon specif 1
+compon st 1
+compon struc 1
+compon struc spf 1
+compon system 1
+compon system eml 1
+compon technolog 1
+compon th invoker 1
+compon that cam 1
+compon that def 1
+compon that enabl 1
+compon that fail 1
+compon that impl 1
+compon that interact 1
+compon that point 1
+compon that schedl 1
+compon that siml 1
+compon that st 1
+compon through experim 1
+compon through interact 1
+compon thus 1
+compon thus maintain 1
+compon to adjust 1
+compon to guid 1
+compon to identif 1
+compon to singl 1
+compon to yield 1
+compon try 1
+compon typ 1
+compon us 2
+compon us link 1
+compon using 1
+compon using autom 1
+compon wer design 1
+compon wer develop 1
+compon wh abnorm 1
+compon which accommod 1
+compon which creat 1
+compon which ensur 1
+compon wi 1
+compon with default 1
+compon with lowest 1
+compon with standard 1
+compon with sub 1
+compon writ 1
+compon yi 1
+componentdefinit 1
+componentdefinit systemconfigur 1
+componentdefinit systemconfigur componentdefinit 1
+comport 4
+comport a la 1
+comport adm 1
+comport adm un 1
+comport alor 1
+comport alor com 1
+comport asymptotiqu 1
+comport asymptotiqu de 1
+comport au 1
+comport aucun 1
+comport com 2
+comport com linstruc 1
+comport com un 1
+comport compar 1
+comport compar es 1
+comport de 4
+comport de ce 1
+comport de chacun 1
+comport de deux 1
+comport de espac 1
+comport de la 2
+comport de lalgorithm 1
+comport de man 1
+comport de natur 1
+comport de setarg 1
+comport deux 1
+comport deux instruc 1
+comport deux ph 1
+comport diff 1
+comport diff erem 1
+comport du 2
+comport du nid 1
+comport du program 1
+comport du syst 2
+comport dun 2
+comport dun boucl 1
+comport dun de 1
+comport dun mach 1
+comport dun mvp 1
+comport dun nid 1
+comport dun program 1
+comport effectif 1
+comport effectif fluctu 1
+comport engendr 1
+comport engendr alor 1
+comport est 1
+comport est don 1
+comport est similair 1
+comport exact 1
+comport exact com 1
+comport g en 1
+comport la 1
+comport la pr 1
+comport lim 1
+comport lim de 1
+comport lorsqu 1
+comport lorsqu le 1
+comport m emoir 1
+comport mieux 1
+comport mieux en 1
+comport ne 1
+comport ne peuv 1
+comport p processeur 1
+comport pa 1
+comport pa diff 1
+comport peut 1
+comport peut etr 1
+comport plus de 1
+comport plus quun 1
+comport plusieur 3
+comport plusieur claus 1
+comport plusieur group 1
+comport plusieur processeur 1
+comport plusieur typ 1
+comport plusieur unit 1
+comport proch 1
+comport proch du 1
+comport qu 2
+comport qu de 1
+comport qu ladr 1
+comport quun 2
+comport quun claus 1
+comport quun sel 1
+comport relatif 1
+comport relatif de 1
+comport sont 1
+comport sont par 1
+comport temporel 1
+comport temporel du 1
+comport tout 1
+comport tout un 1
+comport tr 2
+comport tr nid 1
+comport tr variabl 1
+comport un 2
+comport un coupur 1
+comport un nombr 1
+comport un profondeur 1
+comport un tabl 1
+comport un taux 1
+comportm 1
+comportm is simil 1
+composabl 1
+composabl dan 1
+composabl dan nimport 1
+composit 28
+composit a1 1
+composit and container 1
+composit and custom 1
+composit and ec 1
+composit and non 1
+composit and system 1
+composit attribut 1
+composit behav 1
+composit block 1
+composit de 2
+composit de continu 1
+composit de gard 1
+composit de jacob 1
+composit de transform 1
+composit dobj 1
+composit et multipl 1
+composit exact 1
+composit exact de 1
+composit form 1
+composit form execut 1
+composit forml 1
+composit graph 1
+composit in sld 1
+composit is ba 1
+composit is defin 1
+composit is fe 1
+composit is signif 1
+composit j non 1
+composit me 1
+composit me xp 1
+composit natur 2
+composit ne 1
+composit ne sappliqu 1
+composit nod 1
+composit of a1 1
+composit of compon 1
+composit of fault 1
+composit of mc 1
+composit of mgus 1
+composit of observabl 1
+composit of optim 1
+composit of prim 1
+composit of substitut 2
+composit of transact 1
+composit oper 1
+composit part 1
+composit proper 2
+composit protocol 1
+composit result 1
+composit rl 1
+composit sem 1
+composit separ 1
+composit sourc 1
+composit st 1
+composit termin 1
+composit theor 1
+composit through funct 1
+composit w.r.t 1
+composit wil fail 1
+composit wil requir 1
+compound 8
+compound docum 1
+compound docum design 1
+compound effect 1
+compound in organ 1
+compound or allev 1
+compound phr 1
+compound phr comb 1
+compound term 1
+compound term unif 1
+compound th problem 1
+compr 33
+compr a complec 1
+compr a compon 1
+compr a difficult 1
+compr a ga 1
+compr a invalider 1
+compr a la 1
+compr a lieu 1
+compr a list 1
+compr a non 1
+compr a simil 1
+compr a softwar 1
+compr a soph 1
+compr a tot 1
+compr algorithm 1
+compr algorithm ba 1
+compr algorithm support 1
+compr and featur 1
+compr between autom 1
+compr cl 1
+compr com 1
+compr com un 1
+compr de 2
+compr de chemin 1
+compr de don 1
+compr deux 1
+compr deux claus 1
+compr diagnost 1
+compr diagnost rl 1
+compr dim 1
+compr dim num 1
+compr distribut 1
+compr distribut softwar 1
+compr domain 1
+compr domain approach 1
+compr domain concept 1
+compr domain cont 1
+compr domain imag 1
+compr donc 1
+compr donc la 1
+compr e cont 1
+compr ee 1
+compr ee en 1
+compr ehen 2
+compr ehen de 2
+compr ehen du 1
+compr ehen minim 1
+compr entr 1
+compr entr le 1
+compr eulisp 1
+compr eulisp level 1
+compr form 1
+compr ha foc 1
+compr imag 3
+compr imag graph 1
+compr imag proc 1
+compr int eff 1
+compr interpol 1
+compr la 1
+compr la recon 1
+compr le 2
+compr le attent 1
+compr le chang 1
+compr le mach 1
+compr level 1
+compr m0 1
+compr modif 1
+compr modif aus 1
+compr ne 1
+compr ne concern 1
+compr ne perm 1
+compr ne sint 1
+compr of proc 1
+compr of router 1
+compr of sparc 1
+compr perform 1
+compr perform fact 1
+compr plus de 1
+compr qu 1
+compr quop 1
+compr quop erationnel 1
+compr rat 2
+compr s ecrit 1
+compr san un 1
+compr schem 3
+compr sever compon 1
+compr sol 1
+compr sol pattern 1
+compr standard 1
+compr sub 1
+compr sub modl 1
+compr techniqu 2
+compr techniqu actu 1
+compr th cluster 1
+compr th csg 1
+compr th fl 1
+compr th spec 1
+compr th ver 1
+compr tr 1
+compr tr champ 1
+compr un 1
+compr un processeur 1
+compr using 2
+compr vid 1
+compr vid manipl 1
+compr vid sequ 1
+compreh 16
+compreh ca 1
+compreh ca stud 1
+compreh demonstr 1
+compreh descript 1
+compreh disc 1
+compreh framework 2
+compreh inform 1
+compreh inst 1
+compreh inst ba 1
+compreh langu 1
+compreh object 1
+compreh object orient 1
+compreh overview 1
+compreh report 1
+compreh stat 1
+compreh stat report 1
+compreh strateg 1
+compreh suit 1
+compreh surv 1
+compreh surv se 1
+compreh treatm 1
+compreh using 1
+compreh using integr 1
+compreh wgp 1
+compreh wgp libr 1
+comprendr 2
+comprendr com 1
+comprendr com lec 1
+comprendr la 1
+comprendr la wam 1
+comprendr le 2
+comprendr le poid 1
+comprendr le processus 1
+compresseddomain 1
+compresseddomain imag 1
+compresseddomain imag technolog 1
+comprim 1
+comprim tot 1
+comprim tot le 1
+comprom 12
+comprom a analyser 1
+comprom between strong 1
+comprom entr 1
+comprom entr equilibr 1
+comprom in self 1
+comprom our architectur 1
+comprom th decl 1
+comprom th qu 1
+comprom th random 1
+comprom th system 1
+comprom their vi 1
+comprom tru fcf 1
+compromettr 1
+compromettr la 1
+compsac 1
+compt 5
+compt a chaqu 1
+compt a tous 1
+compt afin 1
+compt afin de 1
+compt au 1
+compt au niveau 1
+compt ce 1
+compt ce diff 1
+compt concern 1
+compt concern la 1
+compt dan 1
+compt dan quintus 1
+compt dav 1
+compt dav de 1
+compt de 3
+compt de ce 1
+compt de contraint 1
+compt de coupur 1
+compt de la 3
+compt de outil 1
+compt de possibilit 1
+compt de restrict 1
+compt de retour 1
+compt dun 1
+compt dun grand 1
+compt en 1
+compt en bloc 1
+compt la 3
+compt la coupur 1
+compt la fa 1
+compt la proport 1
+compt le 2
+compt le acc 1
+compt le born 1
+compt le coroutin 1
+compt le eff 1
+compt le fauxpart 1
+compt le liaison 1
+compt le nombr 1
+compt le possibilit 1
+compt le propr 1
+compt le register 1
+compt le risqu 1
+compt le term 1
+compt lec 1
+compt lec de 1
+compt lext 1
+compt lext de 1
+compt limport 1
+compt limport de 1
+compt lor 1
+compt lor du 1
+compt lordonnanc 1
+compt lordonnanc du 1
+compt ni 1
+compt par 1
+compt par la 1
+compt quaux 1
+compt quaux etap 1
+compt tenu 2
+compt tenu de 2
+compt tenu du 1
+compt tous 1
+compt tous le 1
+compteur 1
+compteur com 1
+compteur com etant 1
+compteur do 1
+compteur do etr 1
+compteur entr 1
+compteur entr ne 1
+compteur est 1
+compteur est de 1
+compteur et la 1
+compteur lor 1
+compteur lor de 1
+compteur ordin 1
+compteur ordin ma 1
+compteur ordin par 1
+compteur ordin pren 1
+compteur sp 1
+compteur sp ecifiqu 1
+comput 120
+comput a 2d 1
+comput a canon 1
+comput a feedback 1
+comput a fil 1
+comput a funct 1
+comput a glob 1
+comput a hem 1
+comput a loc 1
+comput a lot 1
+comput a match 1
+comput a matr 1
+comput a mean 1
+comput a nod 1
+comput a pag 1
+comput a part 1
+comput a particl 1
+comput a prob 1
+comput a random 1
+comput a respon 1
+comput a sequ 1
+comput a sol 1
+comput a span 1
+comput a timesl 1
+comput a var 1
+comput a2 1
+comput abil 1
+comput abil var 1
+comput accord 3
+comput adjustm 1
+comput adv 1
+comput agent 3
+comput al avail 1
+comput al pair 1
+comput al ph 1
+comput al prim 1
+comput al rectangl 1
+comput algebr 1
+comput algebr system 1
+comput algorithm 1
+comput an approxim 1
+comput an error 1
+comput an exact 1
+comput an init 1
+comput an optim 1
+comput an upper 1
+comput and assoc 1
+comput and autom 1
+comput and cach 1
+comput and commun 6
+comput and complec 1
+comput and comput 1
+comput and ensur 1
+comput and fr 1
+comput and graph 2
+comput and inform 5
+comput and mathemat 1
+comput and model 1
+comput and molecl 1
+comput and polygon 1
+comput and return 1
+comput and st 2
+comput and test 1
+comput and therefor 1
+comput and upd 1
+comput answer 2
+comput answer substitut 2
+comput any ind 1
+comput any tim 1
+comput appear 1
+comput appl 2
+comput approach 1
+comput ar av 1
+comput ar calcl 1
+comput ar compl 1
+comput ar constrain 1
+comput ar defin 1
+comput ar illustr 1
+comput ar incr 1
+comput ar loc 1
+comput ar mad 1
+comput ar overlap 1
+comput ar perform 1
+comput ar regard 1
+comput arbitr 1
+comput arbitr sequ 1
+comput art 1
+comput as 1
+comput as describ 1
+comput as follow 1
+comput as implem 1
+comput assoc 1
+comput at proc 1
+comput atl 1
+comput ba 4
+comput bandwidth 3
+comput bandwidth demand 2
+comput bar 1
+comput bar compl 1
+comput befor cal 1
+comput befor return 1
+comput behaviour 1
+comput biolog 1
+comput bj 1
+comput block 1
+comput block edit 1
+comput bound 1
+comput by backtrack 1
+comput by compar 1
+comput by comput 1
+comput by cur 1
+comput by execut 1
+comput by find 1
+comput by gaus 1
+comput by mean 1
+comput by narrow 1
+comput by project 1
+comput by q1 1
+comput by self 1
+comput by specif 1
+comput by tak 2
+comput by traver 1
+comput by us 1
+comput capabil 1
+comput centr 2
+comput cl 1
+comput cl prec 1
+comput combin 1
+comput commun 1
+comput commun overlap 1
+comput commun specl 1
+comput compl 1
+comput complec 12
+comput complec incr 1
+comput computer 1
+comput computer graph 1
+comput constraint 1
+comput control 1
+comput control reg 1
+comput cost 5
+comput de 1
+comput defin 2
+comput defin slot 1
+comput demand 1
+comput dep 2
+comput dep direct 1
+comput dev 1
+comput diameter 1
+comput differ se 1
+comput discrimin 1
+comput discrimin funct 1
+comput dk 1
+comput dur learn 1
+comput dw 1
+comput dwk 1
+comput dwk2 1
+comput earl 1
+comput ed 1
+comput edit 1
+comput edit dist 1
+comput eff 2
+comput eigensolut 1
+comput environm 3
+comput equ 1
+comput equiv 1
+comput equiv funct 1
+comput error 1
+comput euclidean 1
+comput euclidean span 1
+comput exact 2
+comput execut 1
+comput exp 3
+comput exper 2
+comput exper ind 1
+comput expr 1
+comput facil 1
+comput favor 1
+comput favor cost 1
+comput fig 1
+comput finit 1
+comput finit bin 1
+comput follow 2
+comput for 1
+comput for artif 1
+comput for expr 1
+comput for mach 1
+comput for reus 1
+comput for sub 1
+comput for triangl 1
+comput forc 1
+comput forc ba 1
+comput forc du 1
+comput form 1
+comput framework 1
+comput from knowledg 1
+comput from mink2 1
+comput from system 1
+comput from wavel 1
+comput funct 1
+comput ge. 1
+comput geometer 8
+comput geometer algorithm 1
+comput geometer task 1
+comput georg 1
+comput georg institut 1
+comput giv 1
+comput go 1
+comput graph 2
+comput graph partit 1
+comput halt 1
+comput impl 1
+comput in complec 1
+comput in distribut 1
+comput in exact 1
+comput in inh 1
+comput in order 1
+comput in parallel 2
+comput in particl 1
+comput in polynom 3
+comput in ptim 1
+comput in respect 1
+comput in step 1
+comput in tim 3
+comput in transact 1
+comput inclus 2
+comput inclus develop 1
+comput inclus iter 1
+comput increm 2
+comput indep 1
+comput inform 1
+comput inh 1
+comput inherit 1
+comput inherit initarg 1
+comput inherit slot 1
+comput init 1
+comput initarg 1
+comput initarg cl 1
+comput initarg comput 1
+comput inst 1
+comput inst siz 1
+comput int 2
+comput int account 1
+comput int numer 1
+comput int problem 1
+comput int scientif 1
+comput integer 1
+comput integer sequ 1
+comput interleav 1
+comput interpr 1
+comput involut 1
+comput involut dat 1
+comput is accept 2
+comput is con 1
+comput is correct 1
+comput is describ 1
+comput is disc 1
+comput is fin 1
+comput is influ 1
+comput is perfect 1
+comput is perform 2
+comput is pr 1
+comput is tract 1
+comput it funct 1
+comput it geometer 1
+comput it netj 1
+comput it part 1
+comput it project 1
+comput it transit 1
+comput key 1
+comput labor 5
+comput learn 2
+comput learn theor 2
+comput len 1
+comput lik a1 1
+comput lik erew 1
+comput lingu 3
+comput link 1
+comput link cost 1
+comput lo 1
+comput loc 1
+comput log 1
+comput log es 1
+comput loop 1
+comput loop parameter 1
+comput low 1
+comput low cost 1
+comput m using 1
+comput mach 1
+comput machin 5
+comput mak 1
+comput margin 1
+comput margin probabil 1
+comput matter 1
+comput mean 1
+comput mean framework 1
+comput mechan 2
+comput membership 1
+comput membership proper 1
+comput method 3
+comput method lookup 1
+comput method try 1
+comput mil 1
+comput minim 1
+comput minim canon 1
+comput mint 1
+comput model 11
+comput model assum 1
+comput modif 1
+comput mor eff 1
+comput mor exp 1
+comput mor robust 1
+comput near 1
+comput nod 2
+comput nod ba 1
+comput nod comput 1
+comput nod interconnect 1
+comput nodecomput 1
+comput nodecomput nod 1
+comput non 1
+comput non zer 1
+comput norm 1
+comput norm form 1
+comput object 1
+comput of chain 1
+comput of continu 1
+comput of dk 1
+comput of inner 1
+comput of iter 1
+comput of matr 1
+comput of payoff 1
+comput of pgp 1
+comput of prior 1
+comput of recur 1
+comput of spec 1
+comput of timesl 1
+comput offer 1
+comput oft involut 1
+comput oj 1
+comput oj accord 1
+comput on distribut 1
+comput on iter 1
+comput on mesh 1
+comput on proc 1
+comput or inherit 1
+comput our approach 1
+comput over loc 1
+comput overcom 1
+comput overcom commun 1
+comput overlap 1
+comput overlap commun 1
+comput p1 1
+comput pa 1
+comput pag 1
+comput pag posit 1
+comput part 1
+comput part result 1
+comput partnership 1
+comput partnership 2sw 1
+comput peopl 1
+comput peopl agent 1
+comput ph 1
+comput platform 4
+comput platform con 1
+comput polygon 1
+comput power 6
+comput power li 1
+comput prim 1
+comput prim acc 1
+comput prim reader 1
+comput prim writer 1
+comput prior 1
+comput problem 2
+comput problem rel 1
+comput proc 3
+comput procedur 2
+comput proceed 2
+comput ps 1
+comput pseudorandom 1
+comput pseudorandom funct 1
+comput quer 1
+comput rat 1
+comput raw 1
+comput raw vot 1
+comput reader 1
+comput reflect 2
+comput regl 1
+comput regl integer 1
+comput requir 4
+comput resatisf 1
+comput research 5
+comput research center 2
+comput resourc 4
+comput result 3
+comput result observ 1
+comput rl 5
+comput satisf 1
+comput satisf saf 1
+comput saving 1
+comput sc 4
+comput sc not 1
+comput schem 1
+comput self 1
+comput self modif 1
+comput sem 1
+comput simultan 1
+comput sinc a1 1
+comput slot 1
+comput slot descript 1
+comput slot reader 1
+comput slot writer 1
+comput slow 1
+comput smooth 1
+comput soft 1
+comput soft constraint 1
+comput solut 1
+comput sourc 1
+comput spec 1
+comput spec slot 1
+comput specif 1
+comput speed 1
+comput speedup 1
+comput st 2
+comput standpoint 1
+comput stat 2
+comput stat quarter 2
+comput step 3
+comput structur 1
+comput subsequ 1
+comput subsequ iter 1
+comput surv 12
+comput symbol 1
+comput system 16
+comput system using 1
+comput task 1
+comput task respon 1
+comput techniqu 1
+comput tempor 1
+comput tempor atom 1
+comput termin 1
+comput th 2d 1
+comput th abstract 1
+comput th actu 1
+comput th addr 1
+comput th approxim 1
+comput th assign 1
+comput th assoc 1
+comput th aver 1
+comput th block 1
+comput th bound 1
+comput th chang 1
+comput th cl 1
+comput th commun 1
+comput th conjunct 1
+comput th cont 1
+comput th correspon 2
+comput th cost 1
+comput th demand 2
+comput th denot 1
+comput th desir 1
+comput th determin 1
+comput th differ 1
+comput th dioeer 1
+comput th dist 3
+comput th dot 1
+comput th effect 1
+comput th error 1
+comput th ext 1
+comput th fft 1
+comput th forc 1
+comput th funct 1
+comput th fundam 1
+comput th gain 1
+comput th init 1
+comput th input 1
+comput th integer 1
+comput th intersect 1
+comput th key 1
+comput th loc 1
+comput th longest 1
+comput th lower 1
+comput th mart 1
+comput th matr 2
+comput th maxim 2
+comput th mean 1
+comput th minim 2
+comput th modif 1
+comput th nod 1
+comput th non 1
+comput th number 2
+comput th oper 1
+comput th optim 1
+comput th orthonorm 1
+comput th pag 1
+comput th part 1
+comput th partit 2
+comput th posit 2
+comput th prim 1
+comput th privileg 1
+comput th prob 1
+comput th produc 2
+comput th random 1
+comput th register 1
+comput th requir 1
+comput th respon 1
+comput th result 5
+comput th sigm 1
+comput th siz 1
+comput th speedup 1
+comput th str 1
+comput th targ 1
+comput th test 1
+comput th tim 1
+comput th timesl 1
+comput th tot 4
+comput th truth 1
+comput th valu 2
+comput th vect 1
+comput th weight 1
+comput than mmd 1
+comput that correspon 1
+comput that dep 1
+comput that occur 1
+comput that partit 1
+comput that requir 1
+comput thread 1
+comput tim 9
+comput tim requir 1
+comput tim spac 1
+comput tim tcomp 1
+comput tim ten 1
+comput tim using 1
+comput timesl 1
+comput timestamp 1
+comput to commun 2
+comput to dec 1
+comput to gener 1
+comput to mask 1
+comput to overcom 1
+comput to proceed 1
+comput tool 1
+comput triangl 1
+comput triangl polyhedr 1
+comput tw iter 1
+comput tw solut 1
+comput under context 1
+comput unit 1
+comput upd 1
+comput using 9
+comput using cl 1
+comput using theorem 1
+comput val 1
+comput val prob 1
+comput valu 1
+comput variabl 1
+comput vehicl 1
+comput vi na 1
+comput vol 1
+comput w exact 1
+comput wavel 1
+comput wavel pack 1
+comput wh 1
+comput when dist 1
+comput with fw 1
+comput with neur 1
+comput with probabil 2
+comput with rl 1
+comput with techniqu 1
+comput within dat 1
+comput without wait 1
+comput yield 1
+comput yield signif 1
+comput zi 1
+comput. 1
+comput3 1
+computac 1
+computador 1
+computador oferecem 1
+computer 121
+computer addr 1
+computer aid 8
+computer aid adapt 1
+computer aid design 4
+computer aid draft 1
+computer aid ga 1
+computer aid med 1
+computer aid modl 1
+computer aid schedl 1
+computer algebr 3
+computer algebr book 1
+computer algebr program 1
+computer algebr system 1
+computer and appl 1
+computer and car 1
+computer and commun 2
+computer and design 1
+computer and inform 9
+computer and interfac 1
+computer and intract 4
+computer and job 1
+computer and peopl 1
+computer and system 6
+computer anim 1
+computer ar organ 2
+computer ar program 1
+computer architectur 18
+computer architectur new 2
+computer architecur 3
+computer as 1
+computer as learn1 1
+computer assoc 1
+computer avail 1
+computer ba 3
+computer ba archiv 1
+computer ba educ 1
+computer ba environm 1
+computer ba group 1
+computer ba id 1
+computer ba jigsaw 1
+computer ba learn 1
+computer ba work 1
+computer be repr 1
+computer by reduc 1
+computer calcl 1
+computer chang 1
+computer cod 1
+computer commun 4
+computer commun research 1
+computer commun review 1
+computer commun switch 1
+computer comput 1
+computer computer 1
+computer computer program 1
+computer configur 2
+computer congr 4
+computer congr ifip89 1
+computer connect 1
+computer dat 1
+computer design 1
+computer dialog 1
+computer engineer 3
+computer engineer inform 1
+computer ent 1
+computer facil 1
+computer format 1
+computer from achief 1
+computer gener 2
+computer gener parod 1
+computer gener text 1
+computer giv 1
+computer giv ri 1
+computer graph 7
+computer graph for 1
+computer graph group 1
+computer graph research 1
+computer heav 1
+computer in educ 1
+computer inc 2
+computer industr 4
+computer industr research 2
+computer interact 3
+computer interact interact 1
+computer ipsc 1
+computer ipsc system 1
+computer is character 1
+computer is eml 1
+computer keyboard 1
+computer keyboard assign 1
+computer labor 1
+computer labor stud 1
+computer langu 4
+computer lik intel 1
+computer loc 1
+computer math 1
+computer med 1
+computer med commun 1
+computer model 3
+computer monit 1
+computer network 8
+computer network environm 1
+computer network offer 1
+computer network system 1
+computer output 1
+computer pack 1
+computer pack tag 1
+computer paradigm 1
+computer proc 1
+computer program 15
+computer program curricl 1
+computer program enter 1
+computer program langu 2
+computer program specif 1
+computer programmer 1
+computer programmer differ 1
+computer room 1
+computer room facil 1
+computer rout 1
+computer sc 92
+computer sc brown 4
+computer sc carneg 1
+computer sc corpor 1
+computer sc depart 1
+computer sc departm1 1
+computer sc dept 2
+computer sc educ 1
+computer sc engineer 1
+computer sc facult 1
+computer sc fredrik 2
+computer sc georg 1
+computer sc lab 1
+computer sc labor 2
+computer sc log 2
+computer sc macquar 1
+computer sc mathemat 1
+computer sc no.2 1
+computer sc pr 5
+computer sc princ 1
+computer sc research 1
+computer sc soc 1
+computer sc stud 1
+computer sc sun 2
+computer sc techn 4
+computer scient 3
+computer screen 1
+computer secur 2
+computer secur research 1
+computer sit 1
+computer skil 1
+computer soc 13
+computer soc pr 8
+computer soc tcc 1
+computer soc techn 1
+computer softwar 4
+computer softwar engineer 1
+computer solut 1
+computer stud 8
+computer stud research 1
+computer support 3
+computer support collabor 2
+computer support cooper 1
+computer support eff 1
+computer support group 1
+computer support shar 1
+computer support work 1
+computer system 33
+computer system avail 1
+computer system design 1
+computer system labor 1
+computer system login 1
+computer system perform 1
+computer system project 1
+computer system research 2
+computer th rol 1
+computer than md 1
+computer that correct 2
+computer to extract 1
+computer to reason 1
+computer to repr 1
+computer to understand 1
+computer under usu 1
+computer user 1
+computer vi 9
+computer vi appl 1
+computer vi ba 1
+computer vi barrel 1
+computer vi problem 1
+computer vi technolog 1
+computer vol 1
+computer whil longer 1
+computer with broadcast 1
+computer with multipl 1
+computer with pandor 1
+computerb 1
+computerb shar 1
+computerb shar workspac 1
+computerb work 1
+computerb work environm 1
+computergener 1
+computergener geograph 1
+computergener geograph environm 1
+computersupport 1
+computersupport cooper 1
+computersupport cooper work 1
+computerworld 1
+computingresearch 1
+computingresearch center 1
+comsum 1
+comsum and maxim 1
+comt 1
+comun 1
+comun program 1
+comun program agent 1
+comyn 1
+con 111
+con a adapter 1
+con a adopter 1
+con a affecter 1
+con a agencer 1
+con a appliquer 1
+con a autoriser 1
+con a ce 1
+con a ch 1
+con a chauffer 1
+con a collecter 1
+con a combiner 2
+con a commencer 1
+con a construir 1
+con a cr 1
+con a distribuer 2
+con a dupliquer 1
+con a ecrir 1
+con a effectuer 1
+con a eliminer 1
+con a empiler 1
+con a fair 2
+con a fournir 1
+con a fusionner 1
+con a garder 1
+con a incr 1
+con a introduir 1
+con a modif 1
+con a ne 2
+con a parcourir 1
+con a placer 1
+con a pr 1
+con a prendr 1
+con a prior 1
+con a proposer 1
+con a remplacer 1
+con a renforcer 1
+con a scinder 1
+con a supposer 1
+con a tenter 1
+con a tester 1
+con a utiliser 1
+con a visiter 1
+con al 1
+con al eatoir 1
+con algorithm 1
+con allow 1
+con alor 2
+con alor en 1
+con amort 1
+con amort tim 1
+con and acc 1
+con and compl 1
+con and conform 1
+con and event 2
+con and harid 1
+con and laz 1
+con and maxim 1
+con and pr 1
+con and pract 1
+con and rel 1
+con appear 1
+con ar examin 1
+con ar giv 1
+con au 1
+con au paragraph 1
+con automatiqu 1
+con auxiliair 1
+con beaucoup 1
+con belong 1
+con between docum 1
+con brut 1
+con by appl 1
+con by inst 1
+con cal 1
+con caus 1
+con cel 1
+con checker 1
+con classiqu 1
+con clus 1
+con coh 1
+con con 1
+con condit 2
+con criter 1
+con criter st 1
+con cu 2
+con cu avec 1
+con cu de 1
+con cu init 1
+con cu pour 1
+con curv 1
+con d etermin 1
+con dan 1
+con dan la 1
+con datab 1
+con datab st 1
+con de 4
+con de ducateur 1
+con de la 1
+con de outil 1
+con de prolog 1
+con de transit 1
+con dec 1
+con deliver 1
+con demonstr 1
+con descript 1
+con distribu 1
+con distribu ee 1
+con dont ce 1
+con dont el 1
+con dont le 1
+con dordinateur 1
+con dordinateur par 1
+con du 2
+con du foncteur 1
+con ecutif 2
+con ecutif du 1
+con ecutif dun 1
+con ecutiv 2
+con ecutiv de 1
+con ee 1
+con ee ma 1
+con en 3
+con en la 1
+con en un 2
+con equ 5
+con equ aucun 1
+con equ consid 1
+con equ de 2
+con equ deff 1
+con equ du 1
+con equ effectuer 1
+con equ etr 1
+con equ im 1
+con equ import 1
+con equ la 1
+con equ le 1
+con equ lin 1
+con equ pratiqu 1
+con equem 1
+con equem etr 1
+con equent 3
+con equent au 1
+con equit 1
+con equiv 1
+con equiv dan 1
+con exclus 1
+con ext 1
+con foc 1
+con fondam 1
+con fondam pour 1
+con for mult 1
+con for softwar 1
+con form 1
+con g en 1
+con giv 1
+con giv ri 1
+con glob 1
+con glob result 1
+con in evalu 1
+con in ext 1
+con in find 2
+con in horizont 1
+con in look 2
+con in network 1
+con in segm 1
+con in transl 1
+con is achief 1
+con is encod 1
+con it construc 1
+con j push 1
+con la 1
+con lalgorithm 1
+con le 3
+con le prem 1
+con le probabilit 1
+con le transit 1
+con macr 1
+con macr prov 1
+con maint 2
+con maint algorithm 1
+con maint method 1
+con maint task 1
+con mechan 1
+con mesh 1
+con model 2
+con model wh 1
+con mult 1
+con mult scal 1
+con nam 1
+con nearest 1
+con nearest neighbor 1
+con nl 1
+con nl lock 1
+con nn 1
+con nn method 1
+con nn rl 1
+con object 1
+con of 2i 1
+con of 4n 1
+con of act 1
+con of appl 1
+con of bdeg 1
+con of btn 1
+con of centr 1
+con of color 1
+con of command 1
+con of commun 1
+con of compar 1
+con of computer 1
+con of con 1
+con of connect 1
+con of construc 1
+con of dat 1
+con of defin 1
+con of detect 2
+con of disjoint 1
+con of div 1
+con of doz 1
+con of eight 2
+con of find 2
+con of finit 1
+con of ge 1
+con of heur 1
+con of host 1
+con of identif 1
+con of indep 2
+con of inform 1
+con of interm 1
+con of isol 1
+con of jv 1
+con of kn 2
+con of langu 1
+con of laser 1
+con of loc 2
+con of log 3
+con of main 1
+con of matr 1
+con of maxf1 1
+con of method 1
+con of multipl 5
+con of nod 1
+con of non 1
+con of object 1
+con of on 1
+con of p0 1
+con of part 3
+con of perform 1
+con of phy 1
+con of predict 1
+con of project 1
+con of record 1
+con of repeat 1
+con of requir 1
+con of run 1
+con of singl 1
+con of spec 1
+con of specif 2
+con of split 1
+con of stat 1
+con of submesh 1
+con of subst 1
+con of sun 1
+con of switch 2
+con of ten 1
+con of tetrahedr 1
+con of thousand 1
+con of transform 1
+con of twelv 1
+con of using 1
+con of valu 1
+con of var 1
+con of verb 1
+con of workst 1
+con of zer 2
+con on log 1
+con oper 2
+con order 1
+con par 2
+con par cherch 1
+con par examiner 1
+con par montrer 1
+con par nous 1
+con par pr 1
+con par remarquer 1
+con pattern 1
+con peut 2
+con peut ensuit 1
+con peut etr 1
+con plus fin 1
+con plus pr 1
+con pr 3
+con pr eal 1
+con pr ec 1
+con pr ematur 1
+con probabil 1
+con problem 1
+con produc 1
+con produc partit 1
+con progr 1
+con progr tetrahedr 1
+con prop 1
+con proper 1
+con protocol 1
+con quen 1
+con r ecur 1
+con r egl 1
+con requir 2
+con rest 1
+con rest trigger 1
+con rewrit 1
+con rewrit rl 1
+con rl 1
+con schem 1
+con se 2
+con sem 1
+con shadow 1
+con signif 1
+con signif alor 1
+con sol 2
+con som research 1
+con st 1
+con structur 1
+con suiv 2
+con sur 1
+con sur ce 1
+con sur le 1
+con t alor 1
+con t donc 1
+con t environ 1
+con t le 2
+con t lidentit 1
+con t pa 1
+con t pr 1
+con t qu 1
+con t si 1
+con techniqu 1
+con test 1
+con that us 1
+con tir 1
+con tir ee 1
+con to spen 1
+con tr 4
+con tr appear 1
+con tr assum 1
+con tr cod 1
+con tr ik 1
+con tr implem 1
+con tr la 3
+con tr ladr 1
+con tr le 1
+con tr mak 1
+con tr paper 1
+con tr work 1
+con transpar 1
+con transpar pour 1
+con us 1
+con using 2
+con using upd 1
+con valu 1
+con view 1
+con visu 1
+con visu featur 1
+con wh 2
+con with bfather 1
+con with dual 1
+con with lin 1
+con with observ 1
+con with respect 1
+con with softwar 1
+con with vhdl 1
+con x stack 1
+con. 7
+con1 1
+con1 with respect 1
+con87 1
+conc 10
+conc help 1
+conc is remark 1
+conc specif 1
+conc th funct 1
+conc ver 1
+concat 11
+concat and multipl 1
+concat appropr 1
+concat enant 1
+concat enant le 1
+concat enat 2
+concat enat de 1
+concat enat dun 1
+concat of posit 1
+concat or multipl 1
+concat shown 1
+concat th result 1
+concat whil ind 1
+concat6 1
+concav 4
+concav appear 1
+concav appear suggest 1
+concav mesh 1
+concav mesh reg 1
+concav object 1
+concav polygon 1
+concav surfac 1
+conceiv 7
+conceiv comb 1
+conceiv hap 1
+conceiv tak 1
+concentr 30
+concentr al level 1
+concentr alor 1
+concentr alor sur 1
+concentr ee 2
+concentr ee sur 2
+concentr es 1
+concentr es sur 1
+concentr explicit 1
+concentr on algorithm 1
+concentr on compil 1
+concentr on develop 1
+concentr on ext 1
+concentr on find 1
+concentr on fit 1
+concentr on issu 1
+concentr on larger 1
+concentr on loc 2
+concentr on softwar 1
+concentr on system 1
+concentr sur 2
+concentr sur ce 1
+concentr sur le 2
+concentr th key 1
+concentrer 1
+concentrer la 1
+concentreron 1
+concentreron sur 1
+concentreron sur le 1
+concentron 1
+concentron sur 1
+concentron sur le 1
+concept 63
+concept and appl 1
+concept and el 1
+concept and experim 1
+concept and rel 1
+concept and techniqu 2
+concept appl 1
+concept becom 1
+concept becom appar 1
+concept borrow 1
+concept by check 1
+concept cal multiport 1
+concept can answer 1
+concept coh 1
+concept contradict 1
+concept d ag 1
+concept dan 1
+concept dan le 1
+concept de 3
+concept de circuit 1
+concept de jeux 1
+concept de la 1
+concept de mvp 1
+concept de var 1
+concept descript 1
+concept diff 1
+concept diff erent 1
+concept du 1
+concept du jeu 1
+concept dun 2
+concept dun sch 1
+concept dun structur 1
+concept effect 1
+concept en 1
+concept en couvr 1
+concept et de 1
+concept et evalu 1
+concept excessiv 1
+concept excessiv complec 1
+concept for creat 1
+concept for interest 1
+concept for rel 1
+concept form 1
+concept in computer 1
+concept in contempor 1
+concept in cql 1
+concept in hierarch 1
+concept in memor 1
+concept in object 1
+concept introduc 1
+concept is form 1
+concept is giv 1
+concept is inst 1
+concept is pa 1
+concept is rel 1
+concept learn 1
+concept lik plur 1
+concept mean 1
+concept mean rewrit 1
+concept ob 1
+concept of act 1
+concept of block 1
+concept of canon 1
+concept of cl 1
+concept of coh 1
+concept of compr 1
+concept of compresseddomain 1
+concept of contract 1
+concept of dat 1
+concept of datab 1
+concept of deadl 1
+concept of distribut 1
+concept of forc 1
+concept of form 1
+concept of fract 1
+concept of gener 2
+concept of integr 1
+concept of interview 1
+concept of lat 1
+concept of learn 1
+concept of ma 1
+concept of match 1
+concept of maxim 1
+concept of me 1
+concept of minim 1
+concept of modl 1
+concept of multidest 1
+concept of object 1
+concept of path 1
+concept of peer 1
+concept of posit 1
+concept of pot 1
+concept of privileg 1
+concept of qu 1
+concept of resourc 1
+concept of rol 1
+concept of self 2
+concept of sem 1
+concept of specl 1
+concept of string 1
+concept of substitut 1
+concept of svm 1
+concept of symmeter 1
+concept of typ 1
+concept of unif 1
+concept of virtu 1
+concept offer 1
+concept plus anc 1
+concept predom 1
+concept quil 1
+concept quil est 1
+concept requir 1
+concept simil 1
+concept speech 1
+concept speech system 1
+concept tel 1
+concept tel qu 1
+concept to explor 1
+concept to learn 1
+concept to mult 1
+concept to program 1
+concept to speech 1
+concept to yield 1
+concept tospeech 1
+concept tospeech system 1
+concept typ 1
+concept wa demonstr 1
+concept within lin 1
+concept work 1
+concept.1 1
+concept.1 in view 1
+concepteur 2
+concepteur montr 1
+conceptu 19
+conceptu belong 1
+conceptu bigger 1
+conceptu bigger unit 1
+conceptu cluster 1
+conceptu coh 1
+conceptu correspon 2
+conceptu dat 1
+conceptu dat model 1
+conceptu distinct 1
+conceptu distinct view 1
+conceptu ent 2
+conceptu ent respon 1
+conceptu entrop 1
+conceptu found 1
+conceptu hierarch 1
+conceptu inform 1
+conceptu inform retrief 1
+conceptu jump 1
+conceptu jump siz 1
+conceptu keep 1
+conceptu keep futur 1
+conceptu level 2
+conceptu memor 1
+conceptu memor repr 1
+conceptu model 4
+conceptu model explicit 2
+conceptu model specif 2
+conceptu parallel 1
+conceptu prim 1
+conceptu prim link 1
+conceptu prim relationship 1
+conceptu purp 1
+conceptu relationship 1
+conceptu relationship hold 1
+conceptu smaller 1
+conceptu smaller unit 1
+conceptu st 1
+conceptu start 1
+conceptu start point 1
+conceptu structur 1
+conceptuel 2
+conceptuel a lec 1
+conceptuel a un 1
+conceptuel de 1
+conceptuel de la 1
+concern 39
+concern 2d 1
+concern 2d landmark 1
+concern a taxonom 1
+concern about acc 1
+concern and isol 1
+concern and thus 1
+concern aucun 1
+concern aucun ic 1
+concern cest 1
+concern cest la 1
+concern compon 1
+concern contour 1
+concern contour edg 1
+concern dan 1
+concern dan le 1
+concern de 1
+concern de variabl 1
+concern domain 1
+concern e est 1
+concern ee 2
+concern ee par 2
+concern en 1
+concern es 1
+concern for disk 1
+concern in segm 1
+concern l ecritur 1
+concern l elag 1
+concern l elim 1
+concern l evolut 1
+concern la 3
+concern la complexit 1
+concern la condit 1
+concern la consom 1
+concern la gest 1
+concern la lib 1
+concern la mi 1
+concern la minim 1
+concern la possibilit 1
+concern la prem 1
+concern la produc 1
+concern la recherch 1
+concern la recon 1
+concern la robust 1
+concern la vit 1
+concern laffinit 1
+concern lagenc 1
+concern lagenc dun 1
+concern lappl 1
+concern lappl dun 1
+concern le 3
+concern le bloc 1
+concern le constructeur 1
+concern le deux 1
+concern le environ 1
+concern le faux 1
+concern le lang 1
+concern le lien 1
+concern le marqu 1
+concern le mi 1
+concern le modl 1
+concern le point 1
+concern le pol 1
+concern le pr 1
+concern le tableau 1
+concern le temp 1
+concern le tr 1
+concern le variabl 1
+concern limpl 1
+concern limpl em 1
+concern lincertitud 1
+concern lincertitud du 1
+concern lo 1
+concern med 1
+concern med imag 1
+concern notr 1
+concern notr classif 1
+concern pa 1
+concern pa la 1
+concern prim 1
+concern qu 2
+concern qu i1 1
+concern qu la 1
+concern qu le 1
+concern select 1
+concern select retest 1
+concern th developm 1
+concern th differ 1
+concern th ec 1
+concern th softwar 1
+concern th spac 1
+concern th us 1
+concern th valu 1
+concern that larger 1
+concern that multipl 1
+concern that risc 1
+concern ultim 1
+concern un 3
+concern un mi 1
+concern un sous 1
+concern un var 1
+concern with abstract 1
+concern with establ 1
+concern with find 1
+concern with intr 1
+concern with object 1
+concern with optm 1
+concern with pack 1
+concern with reason 1
+concern with rever 1
+concern with shar 1
+concern with siml 1
+concern with st 1
+concern with tim 1
+concern with upd 1
+concernait 1
+concernait qu 1
+concernait qu le 1
+concerner 1
+concerner dan 1
+concerner dan ce 1
+concevabl 1
+concevabl san leur 1
+concevoir 2
+concevoir dautr 1
+concevoir dautr caract 1
+concevoir de 2
+concevoir de ag 1
+concevoir de techniqu 1
+concil 1
+conclu 1
+conclu de 1
+conclu de leur 1
+conclu de notr 1
+conclu quil 1
+conclu quil nec 1
+conclur 2
+conclur de 1
+conclur de ce 1
+conclur qu 1
+conclur qu le 1
+conclur quil 2
+conclur quil nec 1
+conclus 106
+conclus about way 1
+conclus an 1
+conclus and direct 1
+conclus and ext 1
+conclus and further 3
+conclus and futur 10
+conclus and highlight 1
+conclus and ment 1
+conclus and perspectiv 1
+conclus and point 1
+conclus and status 1
+conclus ar form 1
+conclus b oe1oe2 1
+conclus by sketch 1
+conclus c64 1
+conclus cluster 1
+conclus cluster siz 1
+conclus contain 1
+conclus deriv 1
+conclus drawn 1
+conclus et perspectiv 1
+conclus evoqu 1
+conclus evoqu de 1
+conclus g en 1
+conclus in sect 5
+conclus is assum 1
+conclus is giv 1
+conclus is greater 1
+conclus la 1
+conclus la conclus 1
+conclus le 1
+conclus le travaux 1
+conclus lorsqu 1
+conclus lorsqu le 1
+conclus on st 1
+conclus our disc 1
+conclus r esum 1
+conclus remark 14
+conclus sect 1
+conclus suiv 1
+conclus suiv en 1
+conclus suiv rest 1
+conclus th consider 1
+conclus th definit 1
+conclus th disc 1
+conclus th not 1
+conclus th paper 6
+conclus th sect 3
+conclus th subsect 1
+conclus that chang 1
+conclus that crossover 1
+conclus that decr 1
+conclus that dk 1
+conclus that dsj 1
+conclus that fdg 1
+conclus that maxn 1
+conclus that method 1
+conclus that mut 1
+conclus that parallel 1
+conclus that recomb 1
+conclus that softwar 1
+conclus which hold 1
+conclus with sect 1
+conclus with string 1
+conclut 1
+conclut le 1
+conclut le chapitr 1
+concom 2
+concom ramif 1
+concr 16
+concr agent 1
+concr appl 1
+concr cod 1
+concr comput 2
+concr correspon 1
+concr correspon bien 1
+concr dat 1
+concr dat structur 1
+concr definit 1
+concr design 1
+concr domain 2
+concr emb 1
+concr emb funct 1
+concr es 1
+concr es de 1
+concr evolut 1
+concr evolut algebr 1
+concr exampl 1
+concr grammar 1
+concr grammar specif 1
+concr implem 1
+concr implem describ 1
+concr mathemat 1
+concr occam 1
+concr occam syntac 1
+concr oper 1
+concr pl0 1
+concr pl0 syntac 1
+concr prolog 1
+concr prolog implem 1
+concr repr 1
+concr sem 1
+concr specif 1
+concr specif denot 1
+concr st 1
+concr symbol 1
+concr symbol tabl 1
+concr syntac 3
+concr syntac ad 1
+concr syntac inclus 1
+concr syntac instead 1
+concr syntac specif 1
+concr syntac us 1
+concur 35
+concur acc 4
+concur achief 1
+concur agent 1
+concur aggreg 1
+concur al occur 1
+concur and loc 1
+concur and non 1
+concur and recov 1
+concur architectur 1
+concur asynchron 1
+concur asynchron wait 1
+concur b link 1
+concur b tr 1
+concur comput 3
+concur comput resourc 1
+concur computer 2
+concur confid 1
+concur confid shout 1
+concur constraint 2
+concur constraint program 2
+concur control 4
+concur control manager 1
+concur control protocol 1
+concur control requir 1
+concur control techniqu 1
+concur control theor 1
+concur dep 1
+concur design 1
+concur design proc 1
+concur engineer 1
+concur et la 1
+concur execut 8
+concur execut agent 1
+concur execut comput 1
+concur execut sequ 1
+concur execut subtransact 1
+concur execut thread 1
+concur impl 1
+concur in block 1
+concur in order 1
+concur ind 1
+concur ind manag 1
+concur is inh 1
+concur langu 2
+concur langu abcl 1
+concur langu ba 1
+concur log 1
+concur log program 1
+concur lp 1
+concur lp langu 1
+concur mak 1
+concur method 1
+concur method hold 1
+concur model 1
+concur object 3
+concur object langu 1
+concur object orient 3
+concur of oper 1
+concur on conv 1
+concur oper 2
+concur prim 1
+concur primitiv 1
+concur proc 3
+concur proc calculus 1
+concur proc maintain 1
+concur program 7
+concur program langu 2
+concur program specif 1
+concur prolog 1
+concur prolog approach 1
+concur prolog implem 1
+concur quer 1
+concur read 1
+concur read oper 1
+concur refin 1
+concur reflect 1
+concur reflect langu 1
+concur run 2
+concur run appl 1
+concur run thread 1
+concur search 1
+concur search structur 1
+concur search tr 1
+concur structur 1
+concur structur proc 1
+concur system 5
+concur system architectur 1
+concur that giv 1
+concur theor 1
+concur tim 1
+concur tim stamp 1
+concur timestamp 1
+concur timestamp system 1
+concur ver 1
+concur whil preserv 1
+concur whil using 1
+concur writ 1
+concur writ oper 1
+concur90 1
+concurrentiel 1
+condamn 1
+condamn es 1
+condit 84
+condit a condit 1
+condit accept 1
+condit accept invoc 1
+condit act 1
+condit ai 1
+condit allow 1
+condit and continu 1
+condit and emb 1
+condit and perform 1
+condit and principl 1
+condit and reschedl 1
+condit and sign 1
+condit and spontan 1
+condit and weak 1
+condit ap 1
+condit appel 1
+condit ar 2
+condit ar check 1
+condit ar deliver 1
+condit ar deriv 1
+condit ar expect 1
+condit ar fulfil 1
+condit ar handl 1
+condit ar me 1
+condit ar obtain 1
+condit ar satisf 4
+condit ar shown 1
+condit arithm 1
+condit arithm condit 1
+condit as server 1
+condit assemb 1
+condit assoc 2
+condit assur 1
+condit assur qu 1
+condit bien 1
+condit bien sur 1
+condit branch 2
+condit branch bar 1
+condit branch becom 1
+condit branch encounter 1
+condit branch instruc 1
+condit branch occur 1
+condit branch prior 1
+condit by techn 1
+condit c1 1
+condit can ea 1
+condit cand 1
+condit caus 1
+condit cl 1
+condit cl hierarch 1
+condit cl init 1
+condit cl nam 1
+condit cl rel 1
+condit cl tel 1
+condit cl thread 1
+condit com 1
+condit condit 1
+condit construc 1
+condit control 1
+condit control flow 1
+condit conver 1
+condit conver cop 1
+condit could propag 1
+condit cr 1
+condit cr stop 1
+condit daccessibilit 1
+condit de 2
+condit de congru 1
+condit de construc 1
+condit de la 1
+condit de simplif 1
+condit de sinterdir 1
+condit de tr 1
+condit deg 1
+condit dep 1
+condit deriv 1
+condit determin 1
+condit dic 1
+condit distribut 1
+condit div 1
+condit do hold 1
+condit dsp 1
+condit dun 1
+condit dun conditionnel 1
+condit dun lib 1
+condit e op 1
+condit en 1
+condit en un 1
+condit equiv 1
+condit error 1
+condit es 1
+condit es boil 1
+condit est 1
+condit est rempl 1
+condit evalu 1
+condit execut 2
+condit execut condit 1
+condit expr 3
+condit fd 1
+condit follow 1
+condit for broadcast 1
+condit for ca 1
+condit for ch 1
+condit for fact 1
+condit for fir 1
+condit for gener 1
+condit for high 1
+condit for ident 1
+condit for level 1
+condit for minim 1
+condit for order 1
+condit for proc 1
+condit for prolog 1
+condit for selecttest 1
+condit for sem 1
+condit for theorem 1
+condit gaus 1
+condit gaus variabl 1
+condit guar 1
+condit ha ar 1
+condit handl 1
+condit handler 1
+condit held 1
+condit hold 6
+condit imp 2
+condit imp control 1
+condit in dec 1
+condit in definit 2
+condit in equ 1
+condit in frequ 1
+condit in graph 1
+condit in lem 1
+condit in theorem 1
+condit inv 1
+condit inv oper 1
+condit involut 1
+condit is ad 1
+condit is continu 1
+condit is declin 1
+condit is describ 1
+condit is equiv 1
+condit is handl 1
+condit is ra 1
+condit is recogn 1
+condit is remov 1
+condit is satisf 3
+condit is sign 1
+condit is suff 1
+condit j loop 1
+condit jump 2
+condit le 1
+condit le comport 1
+condit may hold 1
+condit me 1
+condit me aqu 1
+condit mechan 1
+condit mod 1
+condit mod continu 1
+condit model 1
+condit model sporad 1
+condit n ec 1
+condit n ecessair 3
+condit n elimin 1
+condit n pmbp 1
+condit nest 1
+condit nest respect 1
+condit no converter 1
+condit nr 1
+condit number 1
+condit number ss 1
+condit object 1
+condit obtain 1
+condit of axiom 1
+condit of burst 1
+condit of condit 1
+condit of corol 1
+condit of definit 1
+condit of dist 1
+condit of fif 1
+condit of label 1
+condit of lem 1
+condit of radioact 1
+condit of standard 1
+condit of theorem 2
+condit of wellconnect 1
+condit on term 1
+condit on tp 1
+condit or guard 1
+condit ou 1
+condit per 1
+condit perm 1
+condit perm constraint 1
+condit peut 1
+condit peut etr 1
+condit po 2
+condit po act 1
+condit po ee 1
+condit pour 1
+condit pour tout 1
+condit privileg 1
+condit prob 2
+condit probabil 2
+condit probabil assoc 1
+condit probabil obtain 1
+condit qu 2
+condit qu dan 1
+condit quel 1
+condit queu 1
+condit r01 1
+condit rel 1
+condit rel term 1
+condit ren 1
+condit ren imp 1
+condit requir 1
+condit resum 1
+condit rewrit 2
+condit rewrit log 1
+condit rewrit rl 1
+condit say 1
+condit sect 1
+condit sensit 1
+condit sensit list 1
+condit similair 1
+condit similair aux 1
+condit simp 1
+condit simp mean 1
+condit simultan 1
+condit simultan hold 1
+condit sont 1
+condit sont le 1
+condit souhait 1
+condit souhait ee 1
+condit sous 1
+condit sous la 1
+condit specif 2
+condit specif init 1
+condit st 1
+condit stat 2
+condit suff 2
+condit suff de 2
+condit suff perm 1
+condit suff suiv 1
+condit suff tr 1
+condit suiv 1
+condit suiv soient 1
+condit supercl 1
+condit syntac 1
+condit syntac error 1
+condit system 1
+condit th reconstruc 1
+condit th system 1
+condit that abort 1
+condit that allow 1
+condit that programmer 1
+condit then upd 1
+condit thread 1
+condit to hold 1
+condit tous 1
+condit tous le 1
+condit tsep 1
+condit un support 1
+condit upd 1
+condit valu 1
+condit variabl 1
+condit wa sign 1
+condit wer nec 1
+condit which guar 1
+condit with dynam 1
+conditionnel 4
+conditionnel a lieu 1
+conditionnel consid 1
+conditionnel consid er 1
+conditionnel cont 1
+conditionnel dan 1
+conditionnel dan la 1
+conditionnel de 2
+conditionnel de domain 1
+conditionnel de revenir 1
+conditionnel dispar 1
+conditionnel doit 1
+conditionnel doit bien 1
+conditionnel don 1
+conditionnel don lieu 1
+conditionnel dus 1
+conditionnel el 1
+conditionnel en 1
+conditionnel en le 1
+conditionnel en liaison 1
+conditionnel et dun 1
+conditionnel fait 1
+conditionnel fait quun 1
+conditionnel inclu 1
+conditionnel inclu de 1
+conditionnel inclus 1
+conditionnel jmpcc 1
+conditionnel jmpcc fal 1
+conditionnel li 1
+conditionnel li ee 1
+conditionnel ni 1
+conditionnel ni calcl 1
+conditionnel ni de 1
+conditionnel ont 1
+conditionnel ont disparu 1
+conditionnel ou 1
+conditionnel ou inconditionnel 1
+conditionnel ou non 1
+conditionnel ou pa 1
+conditionnel par 1
+conditionnel par var 1
+conditionnel peut 1
+conditionnel r esult 1
+conditionnel va 1
+conditionnel va se 1
+conditionnel5 1
+conditionnel5 sont 1
+conditionnel5 sont enregister 1
+conditionnel6 1
+conditionner 1
+conditionner le 1
+conditionner le program 1
+conditionp 1
+conditionp funct 1
+condor 1
+condor a hunter 1
+condu 3
+condu a de 1
+condu a la 1
+condu a lapparit 1
+condu a produir 1
+condu a reconsid 1
+condu a un 1
+condu au 1
+condu aux 1
+condu aux etat 1
+condu et donc 1
+conduc 19
+conduc a prim 1
+conduc an experim 1
+conduc an explor 1
+conduc an init 1
+conduc empir 1
+conduc empir stud 1
+conduc experim 2
+conduc for uniproc 1
+conduc our empir 1
+conduc satisf 1
+conduc satisf experim 1
+conduc siml 1
+conduc structur 1
+conduc structur interview 1
+conduc such interact 1
+conduc th experim 1
+conduc th structur 1
+conduc their stud 1
+conduc thr experim 1
+conduc to investig 1
+conduc using 1
+conduir 3
+conduir a de 2
+conduir a initialiser 1
+conduir a la 1
+conduir a plusieur 1
+conduir a un 2
+conduir fat 1
+conduirait 1
+conduirait a la 1
+conduit 6
+conduit a allouer 1
+conduit a assoc 1
+conduit a de 1
+conduit a fair 1
+conduit a fournir 1
+conduit a impl 1
+conduit a la 2
+conduit a lexpr 1
+conduit a mint 1
+conduit a penser 1
+conduit a privil 1
+conduit a un 1
+conduit alor 1
+conduit au 3
+conduit au marqu 1
+conduit aus 1
+conduit aux 2
+conduit aux deux 1
+conduit aux instruc 1
+conduit direct 1
+conduit en 1
+conduit en not 1
+conduit pa 1
+conduit par 1
+conduit par exempl 1
+conect 1
+conect to stat 1
+conf 6
+conf accept 1
+conf gaus 1
+conf gaus de 1
+conf ma 1
+conf ma beaucoup 1
+conf quil 1
+conf significatif 1
+confer 5
+confer on computer 1
+confer softwar 1
+confer4 1
+confer91 1
+conferec 1
+confid 12
+confid after cmac 1
+confid and adapt 1
+confid and ambigu 1
+confid answer 1
+confid ar low 1
+confid ar simil 1
+confid chang 1
+confid chang dynam 1
+confid estim 1
+confid estim knowledg 1
+confid funct 1
+confid hard loc 1
+confid highest 1
+confid highest output 1
+confid id 1
+confid in softwar 1
+confid interv 1
+confid level 3
+confid level l1 1
+confid level obtain 1
+confid measur 2
+confid measur assoc 1
+confid min 1
+confid obtain 1
+confid shout 1
+confid th min 1
+confid that chang 1
+confid that program 1
+confid threshold 1
+confid to reduc 1
+confid transform 1
+confid transform box 1
+confid valu 2
+confid valu assoc 1
+confid valu describ 1
+confid valu loc 1
+confid valu.1 1
+confid valu.1 therefor 1
+confid wa greater 1
+confid wil gener 1
+config 1
+config tok 1
+config tok systemconfigur 1
+configur 48
+configur a croiser 1
+configur after collap 1
+configur al 1
+configur al eatoir 1
+configur al us 2
+configur and compar 1
+configur and dat 1
+configur and disc 2
+configur and figur 1
+configur and lim 1
+configur and reconfigur 1
+configur and serv 1
+configur ar cl 1
+configur ar depict 1
+configur ar interconnect 1
+configur ar network 1
+configur ar shown 1
+configur ar simil 1
+configur ar superior 1
+configur ar support 1
+configur ar therefor 1
+configur as complec 1
+configur as direct 1
+configur as larger 1
+configur ba 1
+configur be deriv 1
+configur becom 1
+configur becom bal 1
+configur befor plac 1
+configur best configur 2
+configur both resourc 1
+configur by compar 2
+configur by reduc 1
+configur by using 1
+configur can transl 2
+configur chang 1
+configur characteriz 1
+configur cl 1
+configur cod 1
+configur cod ee 1
+configur con 2
+configur configur 1
+configur configur configur 1
+configur control 1
+configur correspon 1
+configur could belong 1
+configur d satisf 1
+configur dan 1
+configur de 1
+configur de la 1
+configur deliver 1
+configur dep 2
+configur dep bug 1
+configur deriv 1
+configur descript 1
+configur design 3
+configur design guidel 2
+configur determ 1
+configur direct 1
+configur direct par 1
+configur dont quelqu 1
+configur du 1
+configur du calculateur 1
+configur dynam 1
+configur encl 1
+configur fal 1
+configur ffy 1
+configur ffy est 1
+configur fil 1
+configur high water 1
+configur in build 1
+configur in eqn 1
+configur in fig 2
+configur in logspac 1
+configur in natur 1
+configur in order 1
+configur in pract 1
+configur in term 2
+configur induc 1
+configur inform 2
+configur init 1
+configur init avec 1
+configur input 1
+configur input con 1
+configur is entail 1
+configur is faster 1
+configur is illustr 1
+configur is inf 2
+configur is superior 1
+configur issu 1
+configur issu de 1
+configur keep 1
+configur keep topolog 1
+configur lead 1
+configur li 1
+configur loc 2
+configur loc ar 2
+configur mad 1
+configur may con 1
+configur must hold 1
+configur nec 1
+configur nec lead 1
+configur object 1
+configur object orient 1
+configur obtain 1
+configur of cel 1
+configur of constraint 1
+configur of distribut 1
+configur of interconnect 1
+configur of o1 1
+configur of o3 1
+configur of o5 1
+configur of object 1
+configur of oi 1
+configur of point 1
+configur of reg 1
+configur of simpl 1
+configur of siz 1
+configur of smaller 1
+configur of suff 1
+configur of text 1
+configur offer 3
+configur offer largest 1
+configur on clustersim 1
+configur optim 1
+configur or proc 1
+configur our network 1
+configur our object 1
+configur outperform 2
+configur par 1
+configur par de 1
+configur partit 1
+configur partit multidim 1
+configur perm 1
+configur perm aus 1
+configur planair 1
+configur prior 1
+configur proc 1
+configur proportionnel 1
+configur quil 1
+configur recherch 1
+configur recherch ee 1
+configur reflect 1
+configur reflect contempor 1
+configur se 1
+configur spac 2
+configur spac model 1
+configur spat 1
+configur spat de 1
+configur specif 1
+configur suiv 2
+configur suiv le 1
+configur support 2
+configur th ch 2
+configur th compl 1
+configur th gener 1
+configur th graph 1
+configur th multicast 1
+configur that con 1
+configur that contain 1
+configur that offer 2
+configur tim 2
+configur to design 2
+configur to maxim 1
+configur to scal 1
+configur under loc 2
+configur us 1
+configur using 1
+configur using cluster 1
+configur using larger 1
+configur util 1
+configur util ee 1
+configur wa attain 1
+configur wer deriv 1
+configur wh 1
+configur wh se 1
+configur which conform 2
+configur which offer 2
+configur which result 1
+configur which support 3
+configur whil using 1
+configur with cluster 1
+configur with high 1
+configur with incr 3
+configur with larger 1
+configur with simil 1
+configur with smaller 1
+configur with wider 1
+configur x li 1
+configur xu 1
+configur z becom 1
+confin 2
+confirm 17
+confirm e par 1
+confirm light 1
+confirm light manager 1
+confirm lorsquil 1
+confirm lorsquil po 1
+confirm our hypoth 1
+confirm our qualit 1
+confirm power 1
+confirm prompt 1
+confirm prov 1
+confirm som result 1
+confirm th find 1
+confirm th gener 1
+confirm th result 4
+confirm th theor 1
+confirm th wisdom 1
+confirm that proper 1
+confisc 1
+confl 1
+conflict 20
+conflict and compl 1
+conflict and dynam 1
+conflict asser 1
+conflict at runtim 1
+conflict ba 1
+conflict ba scheduler 1
+conflict between specif 1
+conflict constraint 1
+conflict ec 1
+conflict goal 1
+conflict is defin 1
+conflict loc 1
+conflict matr 1
+conflict may occur 1
+conflict mi 1
+conflict mi occur 1
+conflict minim 1
+conflict minim random 1
+conflict mor explicit 1
+conflict of interest 3
+conflict of view 1
+conflict report 1
+conflict result 1
+conflict task 1
+conflict task typ 1
+conflict typ 1
+conflict typ task 1
+conflict with lock 1
+conflictuel 2
+conflictuel aux 1
+conflictuel aux don 1
+conflictuel d epen 1
+conflictuel dan 1
+conflictuel dan le 1
+conflictuel de 1
+conflictuel devr 1
+conflictuel devr au 1
+conflictuel du 1
+conflictuel du pav 1
+conflictuel dur 1
+conflictuel dur lec 1
+conflictuel est 1
+conflictuel est de 1
+conflictuel est donc 1
+conflictuel est egal 1
+conflictuel et au 1
+conflictuel et fr 1
+conflictuel et leur 1
+conflictuel le 1
+conflictuel le nombr 1
+conflictuel moin 1
+conflictuel moin le 1
+conflictuel moin npb 1
+conflictuel ne 1
+conflictuel ne font 1
+conflictuel nengendr 1
+conflictuel nengendr quun 1
+conflictuel ont 1
+conflictuel ou 1
+conflictuel ou fr 1
+conflictuel pour 1
+conflictuel pour le 1
+conflictuel provoqu 1
+conflictuel provoqu de 1
+conflictuel puisqu 1
+conflictuel puisqu la 1
+conflictuel qu 1
+conflictuel qu en 1
+conflictuel r esult 1
+conflictuel s 1
+conflictuel s 9j 1
+conflictuel s el 1
+conflictuel si 1
+conflictuel si el 1
+conflictuel si le 1
+conflictuel sont 1
+conflictuel sont cel 1
+conflictuel subit 1
+conflictuel suiv 1
+conflictuel suiv quel 1
+conflictuel var 1
+conflictuel var de 1
+conflit 2
+conflit a lint 1
+conflit chacun 1
+conflit correspon 1
+conflit d ecritur 1
+conflit d ependait 1
+conflit dacc 2
+conflit dacc es 2
+conflit dan 1
+conflit dan le 1
+conflit de 1
+conflit de co 1
+conflit de degr 1
+conflit du 1
+conflit du pav 1
+conflit dun 1
+conflit dun pav 1
+conflit dur 1
+conflit dur un 1
+conflit effectu 1
+conflit effectu es 1
+conflit en 1
+conflit en ecritur 1
+conflit en fonct 1
+conflit entr 1
+conflit entr deux 1
+conflit entr ecrivain 1
+conflit entr le 1
+conflit entr lecteur 1
+conflit entr pair 1
+conflit est 1
+conflit est appel 1
+conflit est de 1
+conflit est donc 1
+conflit est egal 1
+conflit est ind 1
+conflit est le 1
+conflit est sup 1
+conflit est suscept 1
+conflit et de 1
+conflit et donc 1
+conflit et la 1
+conflit et proch 1
+conflit et sav 1
+conflit et tous 1
+conflit etait 1
+conflit etait proportionnel 1
+conflit eventuel 1
+conflit evit 1
+conflit evit encor 1
+conflit impliqu 1
+conflit lacc 1
+conflit lacc es 1
+conflit m em 1
+conflit ma 1
+conflit ma la 1
+conflit ma princip 1
+conflit ne 1
+conflit ne sont 1
+conflit nous 1
+conflit nous allon 1
+conflit ont 1
+conflit ont alor 1
+conflit ont lieu 1
+conflit op 1
+conflit op erant 1
+conflit osatur 1
+conflit osatur ea 1
+conflit pa 1
+conflit pa de 1
+conflit pa par 1
+conflit par 1
+conflit par un 1
+conflit pen 1
+conflit pen lec 1
+conflit perm 1
+conflit perm de 1
+conflit peut 1
+conflit peut donc 1
+conflit peut etr 1
+conflit pour 1
+conflit pour lu 1
+conflit qu 1
+conflit qu pouv 1
+conflit quavec 1
+conflit quavec se 1
+conflit quit 1
+conflit sauf 1
+conflit sauf ceux 1
+conflit se 1
+conflit ser 1
+conflit ser etud 1
+conflit si 1
+conflit si linterv 1
+conflit sil 1
+conflit sil acc 1
+conflit sont 1
+conflit sont alor 1
+conflit sont de 1
+conflit sont equilibr 1
+conflit sont maximaux 1
+conflit sont ou 1
+conflit sous 1
+conflit sous leff 1
+conflit sur 1
+conflit sur ce 1
+conflit sur le 1
+conflit sur un 1
+conflit val 1
+conflit var 1
+conflit var ma 1
+conflu 2
+conflu alw forc 1
+conflu and nonconflu 1
+conflu and term 1
+conflu and termin 1
+conflu of r1 1
+conflu part 1
+conflu proper 1
+conflu reduc 1
+conflu rel 1
+conflu rewrit 1
+conflu rewrit strateg 1
+conflu rl 1
+conflu system 1
+conflu term 1
+conflu term rewrit 1
+confondr 3
+confondr avec 1
+confondr avec la 1
+confondr dan 1
+confondr dan la 1
+confondu 2
+confondu dan 1
+confondu dan ce 1
+confondus 1
+conform 16
+conform a la 1
+conform ement 1
+conform ement aux 1
+conform eulisp 1
+conform eulisp proc 1
+conform eulisp program 1
+conform implem 1
+conform level 1
+conform path 1
+conform proc 1
+conform program 1
+conform to ba 1
+conform to bin 1
+conform to ec 1
+conform with establ 1
+conformeron 1
+conformeron pa 1
+conformeron pa strict 1
+confound 1
+confound an 1
+confront 5
+confront de 1
+confront de ag 1
+confront e au 1
+confront e aux 1
+confront entr 1
+confront entr le 1
+confront with common 1
+confus 16
+confus and mak 1
+confus entr 1
+confus entr bloc 1
+confus larg number 1
+confus occur 1
+confus problem 1
+confus result 1
+confus such quest 1
+confus to detail 1
+confus to softwar 1
+confus tw separ 1
+confus when interact 1
+confus with nr 1
+cong 2
+cong cong 1
+cong ont 1
+congest 5
+congest 2f 1
+congest 2n 1
+congest ar pr 1
+congest equ 1
+congest fi 1
+congest fi 2f 1
+congest hypergraph 1
+congest hypergraph emb 1
+congest manag 1
+congest network 1
+congest valu 1
+conglomer 2
+conglomer cl 1
+conglomer of compan 1
+conglomer to empl 1
+congr 8
+congr cal 1
+congr cal number 1
+congr ifip89 1
+congr on deduc 1
+congr on neur 1
+congr system 1
+congru 4
+congru a tr 1
+congru adm 1
+congru adm un 1
+congru de 1
+congru de ik 1
+congru de variabl 1
+congru doiv 1
+congru doiv etr 1
+congru est 1
+congru est equiv 1
+congru et avec 1
+congru et deux 1
+congru et dexprimer 1
+congru et le 1
+congru iff 1
+congru issu 1
+congru issu de 1
+congru lambd 1
+congru lambd list 1
+congru modl 2
+congru modl mj 1
+congru ni 1
+congru ni div 1
+congru sont 1
+congru sont ecrit 1
+congru sont incompatibl 1
+congru sur 1
+congru sur ik 1
+congrus 1
+conjectur 15
+conjectur appear 1
+conjectur assum 1
+conjectur concern weigh 1
+conjectur contain 1
+conjectur further 1
+conjectur of berman 1
+conjectur of rusk 1
+conjectur that comput 1
+conjectur that minim 1
+conjectur that pr 1
+conjecturon 1
+conjecturon qu 1
+conjecturon qu holzbaur 1
+conjoin 1
+conjoint 2
+conjoint a un 1
+conjoint darchitectur 1
+conjoint darchitectur perform 1
+conjoint et margin 1
+conjoint le 1
+conjoint leff 1
+conjoint leff ping 1
+conjonct 1
+conjonct d eg 1
+conjonct dexpr 1
+conjonct dexpr util 1
+conjonct don 1
+conjonct don alor 1
+conjonct rendrait 1
+conjonct rendrait difficil 1
+conjonct sav ch 1
+conjug 3
+conjug grad 3
+conjug grad algorithm 1
+conjug grad method 3
+conjug grad parallel 1
+conjugu 2
+conjugu ee 1
+conjugu ee d1 1
+conjugu ee deux 1
+conjunct 24
+conjunct and disjunct 2
+conjunct and finit 1
+conjunct and neg 1
+conjunct constrain 1
+conjunct norm 1
+conjunct norm form 1
+conjunct of aff 1
+conjunct of constraint 2
+conjunct of den 1
+conjunct of forml 1
+conjunct of lin 1
+conjunct of liter 1
+conjunct of posit 1
+conjunct of quadr 1
+conjunct of tempor 1
+conjunct produc 1
+conjunct produc disjunct 1
+conjunct quer 1
+conjunct quer contain 1
+conjunct sk 1
+conjunct sk si 1
+conjunct sl 1
+conjunct with centr 1
+conjunct with inform 1
+conjunct with mak 1
+conjunct with var 1
+conjunct xi 1
+conjunct xi v1i 1
+conjunct xi v2i 1
+conjunct xi xj 1
+conlus 1
+conlus th work 1
+connaisson 2
+connaisson pa 2
+connaisson pa dan 1
+connaisson pa de 1
+connec 5
+connec au 1
+connec entr 1
+connec entr la 1
+connec et en 1
+connec invar 1
+connec invar qu 1
+connec tant 1
+connec tant invar 1
+connec tim 1
+connect 79
+connect a block 1
+connect a giv 1
+connect a pair 1
+connect a precondit 1
+connect a proc 1
+connect a ver 1
+connect acquir 1
+connect act 1
+connect act period 1
+connect al hyperedg 1
+connect along dim 1
+connect alread backlog 1
+connect among nod 1
+connect an object 1
+connect and adjust 1
+connect and biconnect 1
+connect and connect 1
+connect and establ 1
+connect and mach 1
+connect and point 1
+connect and router 1
+connect and verb 1
+connect and window 1
+connect approach 2
+connect ar absent 1
+connect ar backlog 1
+connect ar bound 1
+connect ar collap 1
+connect ar continu 1
+connect ar establ 1
+connect ar expect 1
+connect ar ident 1
+connect ar mark 1
+connect ar mi 1
+connect ar rout 1
+connect ar serv 1
+connect arbitr 1
+connect arbitr specif 1
+connect architectur 3
+connect at tim 1
+connect atom 1
+connect attempt 1
+connect augm 1
+connect augm problem 1
+connect autonom 1
+connect backlog 1
+connect becam 1
+connect becam greed 1
+connect becom 1
+connect becom act 1
+connect becom backlog 1
+connect becom bus 1
+connect becom equ 1
+connect becom greater 1
+connect befor tim 1
+connect being maintain 1
+connect being requir 2
+connect being serv 1
+connect belong 1
+connect between adjac 1
+connect between sn 1
+connect between stat 1
+connect between switch 1
+connect bottleneck 1
+connect bus 1
+connect bus period 1
+connect by commerc 1
+connect by dat 1
+connect by deleg 1
+connect by gatew 1
+connect by path 1
+connect by point 1
+connect by singl 1
+connect by standard 1
+connect by using 1
+connect c proc 2
+connect cal 1
+connect can rec 1
+connect com 1
+connect compl 1
+connect compl sen 1
+connect compon 7
+connect compon inst 1
+connect computer 3
+connect computer architectur 1
+connect con 1
+connect connect 1
+connect connect cost 1
+connect contour 1
+connect contour part 1
+connect cost 3
+connect cost reduc 1
+connect could rec 1
+connect cr 1
+connect cur 1
+connect cur backlog 1
+connect cycl 2
+connect dep 1
+connect descript 1
+connect differ board 2
+connect dur learn 1
+connect e0i 1
+connect ec 1
+connect ec reg 1
+connect edg 1
+connect es 1
+connect establishm 1
+connect establishm algorithm 1
+connect establishm rl 1
+connect etc 1
+connect finish 1
+connect finish serv 1
+connect for bandwidth 1
+connect from sub 1
+connect g0 1
+connect glu 1
+connect graph 7
+connect ha dat 1
+connect hav cr 1
+connect host 1
+connect hyperedg 1
+connect i ar 1
+connect i becom 1
+connect i finish 1
+connect i leav 1
+connect i start 1
+connect in adeg 1
+connect in g0 1
+connect in gener 1
+connect in perspect 1
+connect in stochast 1
+connect incorpor 1
+connect inform 1
+connect init 1
+connect init subgraph 1
+connect interfer 1
+connect irrespect 1
+connect is avail 1
+connect is backlog 1
+connect is denot 1
+connect is detect 1
+connect is equiv 1
+connect is estim 1
+connect is idl 1
+connect is incr 1
+connect is maintain 1
+connect is proport 1
+connect is rel 1
+connect is se 1
+connect is setup 1
+connect is shown 1
+connect is susp 1
+connect is upd 1
+connect j becom 1
+connect junior 1
+connect le 2
+connect le diver 1
+connect le inst 1
+connect mach 6
+connect mach cm 3
+connect mach system 1
+connect manag 1
+connect manager 1
+connect manager arrang 1
+connect may inclus 1
+connect may rec 1
+connect me 1
+connect me reach 1
+connect me sent 1
+connect mean 1
+connect model 1
+connect model summer 1
+connect must us 1
+connect network 6
+connect network siml 1
+connect nod 2
+connect object 1
+connect of distribut 1
+connect on 1
+connect or direct 1
+connect or ver 1
+connect or virtu 1
+connect orient 1
+connect orient environm 1
+connect orient network 1
+connect orient serv 1
+connect orient switch 1
+connect other switch 1
+connect pair 1
+connect pair request 1
+connect parallel 1
+connect parallel computer 1
+connect part 1
+connect path 3
+connect path contain 1
+connect pattern 1
+connect per nod 1
+connect point 1
+connect pot 1
+connect proc 2
+connect proport 1
+connect reach 1
+connect receiv 1
+connect receiv serv 1
+connect refer 1
+connect reinforc 1
+connect reinforc learn 1
+connect remain 1
+connect remain backlog 1
+connect request 1
+connect request se 1
+connect reserv 1
+connect reserv half 1
+connect respon 1
+connect respon tim 1
+connect sc 2
+connect schem 1
+connect se 1
+connect sem 1
+connect sem rel 1
+connect setup 1
+connect shar 1
+connect start 2
+connect steiner 1
+connect steiner subgraph 1
+connect structur 1
+connect subgraph 1
+connect synchron 1
+connect synchron event 1
+connect system 1
+connect tap 1
+connect tap del 1
+connect technolog 2
+connect technolog etc 2
+connect th channel 1
+connect th contour 1
+connect th inst 1
+connect th proc 1
+connect th signif 1
+connect th sit 1
+connect th testb 1
+connect that arriv 1
+connect that half 1
+connect that receiv 1
+connect that shar 1
+connect through inter 2
+connect through tn 1
+connect throughput 1
+connect to achief 1
+connect to c1 1
+connect to column 1
+connect to contour 1
+connect to cr 1
+connect to exact 1
+connect to influ 1
+connect to ndest 1
+connect to network 1
+connect to nod 1
+connect to overlap 1
+connect to reach 1
+connect to rec 1
+connect to receiver 1
+connect to reduc 1
+connect to stat 1
+connect to vk 1
+connect topolog 1
+connect topolog remain 1
+connect triangl 1
+connect tw nod 1
+connect tw st 1
+connect un explicit 1
+connect undirect 1
+connect undirect graph 1
+connect unmatch 1
+connect unmatch nod 1
+connect unweight 1
+connect unweight graph 1
+connect using 2
+connect using elastomer 2
+connect uw 1
+connect v0 1
+connect vect 1
+connect vect proc 1
+connect ver 2
+connect vi ethernet 1
+connect we know 1
+connect weight 1
+connect wer bus 1
+connect when pack 1
+connect which div 1
+connect which prov 1
+connect which requir 1
+connect wil incr 1
+connect wil oscil 1
+connect window 1
+connect window siz 1
+connect with backtrack 1
+connect with cl 1
+connect with combin 1
+connect with del 1
+connect with graph 1
+connect with match 1
+connect with positionw 1
+connect with rat 1
+connect with result 1
+connect with x5 1
+connect with xi 1
+connectionor 1
+connectionor network 1
+connectionor switch 1
+connectionor switch con 1
+connectionservermasterserver1servern 1
+connectionswindow 1
+connectionswindow siz 1
+connectionswindow siz produc 1
+connectiv 5
+connectiv and quantif 1
+connectiv ar appl 1
+connectiv in term 1
+conner 2
+connol 1
+connor 1
+connot 1
+connu 3
+connu a la 2
+connu a partir 1
+connu avant 1
+connu avec 1
+connu avec linver 1
+connu d es 1
+connu de 1
+connu de concept 1
+connu de instruc 1
+connu de la 1
+connu de lauteur 1
+connu dynamiqu 1
+connu dynamiqu gr 1
+connu en 1
+connu en program 1
+connu et un 1
+connu lor 1
+connu lor de 1
+connu pr 1
+connu pr ec 1
+connu sous 1
+connu sous le 1
+connu statiqu 1
+connu un nouvel 1
+connus 3
+connus a la 2
+connus avant 1
+connus avant lec 1
+connus et donc 1
+connus qu 1
+connus qu du 1
+connx 1
+connx must go 1
+conogur 1
+conogur de 1
+conogur de sit 1
+conogur spac 1
+conogur tr 1
+conormer 1
+conormer la 1
+conormer la pr 1
+conp 1
+conp compl 1
+conquer 3
+conquer a complec 1
+conquer approach 1
+conquer principl 1
+conquer spec 1
+conquer spec problem 1
+conquer strateg 1
+conquer techniqu 1
+consacr 3
+consacr e au 1
+consacr ee 2
+consacr es 1
+consc 2
+consc de 1
+consc de la 1
+consecr 1
+consecr method 1
+consecut 14
+consecut acc 1
+consecut and compat 1
+consecut but indep 1
+consecut column 1
+consecut curv 1
+consecut disk 1
+consecut el 1
+consecut i os 1
+consecut leav 1
+consecut loop 1
+consecut loop nest 1
+consecut method 1
+consecut method invoc 1
+consecut moment 1
+consecut nod 1
+consecut order 1
+consecut outl 1
+consecut outl point 1
+consecut proc 1
+consecut quest 1
+consecut reader 1
+consecut reader method 1
+consecut smooth 1
+consecut smooth lin 1
+consecut sub 1
+consecut sub task 1
+consecut track 1
+consecut upd 1
+consecut upd field 1
+conseil 3
+conseil de 1
+conseil de se 1
+conseil dutiliser 1
+conseil dutiliser la 1
+conseil e de 2
+conseil ee 2
+conseil ee dan 1
+conseil ee pour 1
+conseil sur 1
+conseil sur le 1
+conseil sur lutil 1
+conseillon 1
+conseillon fort 1
+conseillon fort lutil 1
+consensus 7
+consensus problem 1
+consensus protocol 1
+consensus sur 1
+consensus sur lintroduc 1
+consensus test 1
+consensus test suit 1
+consequ 50
+consequ altern 1
+consequ and altern 1
+consequ and appl 1
+consequ and interconnect 1
+consequ ar shown 1
+consequ bring 1
+consequ for import 1
+consequ is evalu 1
+consequ larger 2
+consequ larger number 2
+consequ mod 1
+consequ of cal 1
+consequ of defin 1
+consequ of execut 1
+consequ of lem 1
+consequ of softwar 1
+consequ of theorem 2
+consequ oper 1
+consequ or altern 1
+consequ our objectiv 1
+consequ our transl 1
+consequ rel 1
+consequ th abstract 1
+consequ when develop 1
+consequ when fst 1
+conserv 19
+conserv algorithm 1
+conserv an 1
+conserv approach 2
+conserv assum 1
+conserv constraint 1
+conserv de 1
+conserv de trac 1
+conserv determin 1
+conserv determin stat 1
+conserv ee 1
+conserv ee qu 1
+conserv estim 1
+conserv ext 2
+conserv inequ 1
+conserv la 1
+conserv la soupl 1
+conserv le 1
+conserv lint 1
+conserv lint er 1
+conserv model 1
+conserv natur 1
+conserv or non 1
+conserv over recompil 1
+conserv pa 1
+conserv pa automatiqu 1
+conserv regard 1
+conserv s epar 1
+conserv scheduler 2
+conserv scheduler inclus 1
+conserv server 1
+conserv server known 1
+conserv th quest 1
+conserv when determin 1
+conserver 2
+conserver en 1
+conserver le 1
+conserver le aut 1
+conserver lordr 1
+conserver lordr dic 1
+consid 6
+consid er 4
+consid er aus 1
+consid er dan 1
+consid er ee 3
+consid er es 3
+consid er la 1
+consid er le 2
+consid er un 1
+consid erabl 2
+consid erabl dan 1
+consid erabl la 2
+consid erabl sur 1
+consid erant 2
+consid erant com 1
+consid erant fail 1
+consid erant le 1
+consid erant quun 1
+consid erat 2
+consid erat anticip 1
+consid erat certain 1
+consid erat de 1
+consid erat dimpl 1
+consid erat qu 1
+consid erent 1
+consid erent la 1
+consid erent le 1
+consid erer 3
+consid erer de 1
+consid erer la 1
+consid erer le 1
+consid erer qu 1
+consid erer tous 1
+consid erer un 1
+consid ereron 1
+consid ereron pour 1
+consid eron 4
+consid eron ci 1
+consid eron deux 1
+consid eron ic 1
+consid eron la 2
+consid eron lappel 1
+consid eron le 2
+consid eron lexempl 2
+consid eron maint 1
+consid eron par 1
+consid eron pour 1
+consid eron un 1
+consid r es 1
+consid rabl 1
+consid rabl larg 1
+consid rabl qu 1
+consid re le 1
+consid re maint 1
+consid re pour 1
+consid rent 1
+consid rent qu 1
+consid rer 1
+consid rer ce 1
+consid ron 1
+consid ron va 1
+consider 113
+consider a 2d 1
+consider a ba 1
+consider a bal 1
+consider a bind 1
+consider a bit 1
+consider a cl 1
+consider a collect 1
+consider a comput 1
+consider a decomposit 1
+consider a definit 1
+consider a del 1
+consider a diagram 1
+consider a docum 1
+consider a fac 1
+consider a failur 1
+consider a flat 1
+consider a fragm 1
+consider a giv 1
+consider a graph 1
+consider a grid 1
+consider a horn 1
+consider a leg 1
+consider a lin 1
+consider a main 1
+consider a model 1
+consider a network 1
+consider a nod 1
+consider a pack 3
+consider a parallel 1
+consider a permut 1
+consider a point 1
+consider a posit 1
+consider a qu 1
+consider a run 1
+consider a se 1
+consider a server 1
+consider a shortcom 1
+consider a simpl 2
+consider a skew 1
+consider a solut 1
+consider a standard 1
+consider a structur 1
+consider a suff 1
+consider a synchron 1
+consider a system 3
+consider a theor 1
+consider a triangl 1
+consider a typ 2
+consider a virtu 1
+consider a web 1
+consider a weight 1
+consider acc 1
+consider accept 1
+consider act 1
+consider ad 1
+consider adv 1
+consider affin 1
+consider algorithm 2
+consider altern 2
+consider altern approach 1
+consider altern implem 1
+consider amount 2
+consider an altern 1
+consider an appl 2
+consider an appropr 2
+consider an ar 1
+consider an arbitr 2
+consider an edg 1
+consider an exampl 3
+consider an ext 2
+consider an implem 1
+consider an interior 1
+consider an mimd 1
+consider an optim 1
+consider and character 1
+consider and consider 1
+consider and id 1
+consider and simil 1
+consider and unnec 1
+consider any protocol 1
+consider any r1 1
+consider any r2 1
+consider any se 1
+consider any tim 1
+consider ap 1
+consider ar compl 1
+consider ar cruc 1
+consider ar found 1
+consider architectur 1
+consider architectur altern 1
+consider as 2d 1
+consider as fair 1
+consider as follow 1
+consider as graph 1
+consider as interpol 1
+consider as no 1
+consider as output 1
+consider as parameter 1
+consider as prompt 1
+consider as rat 1
+consider as repr 1
+consider as run 1
+consider as separ 1
+consider as strict 1
+consider ba 1
+consider ba relationship 1
+consider boolean 1
+consider boolean eval 1
+consider border 1
+consider border point 1
+consider borderl 1
+consider borderl stat 1
+consider by earl 2
+consider by pru 1
+consider candid 1
+consider car 1
+consider ch 1
+consider chang 1
+consider cod 1
+consider cod gener 1
+consider commun 1
+consider commun schem 1
+consider comput 1
+consider comput complec 1
+consider con 2
+consider constraint 1
+consider conver 1
+consider criter 1
+consider datalog 1
+consider decompil 1
+consider decomposit 1
+consider decr 1
+consider dep 1
+consider design 2
+consider detail 1
+consider distribut 1
+consider distribut implem 1
+consider du 1
+consider ea 1
+consider each 2d 1
+consider each control 1
+consider each procedur 1
+consider earl 2
+consider eff 1
+consider el 1
+consider elig 1
+consider entr 1
+consider equiv 1
+consider es 1
+consider exampl 1
+consider explan 1
+consider fal 1
+consider faster 1
+consider fault 1
+consider fic 1
+consider figur 3
+consider find 1
+consider flec 1
+consider for 2cl 1
+consider for exampl 2
+consider for futur 1
+consider for mov 1
+consider for propag 1
+consider for remov 1
+consider for schedl 1
+consider further 1
+consider further opt 1
+consider futur 1
+consider futur developm 1
+consider gener 2
+consider gener purp 1
+consider gener theor 1
+consider geometer 1
+consider geometer domain 1
+consider graph 1
+consider harm 1
+consider harm using 1
+consider he currexp 1
+consider idempot 1
+consider idempot substitut 1
+consider impract 1
+consider impract criter 1
+consider improv 3
+consider improv an 1
+consider in ch 2
+consider in conjunct 1
+consider in depth 1
+consider in further 1
+consider in high 1
+consider in implem 1
+consider in rest 1
+consider in sect 2
+consider in stud 1
+consider indep 1
+consider interest 2
+consider interest promot 1
+consider interprocedur 1
+consider interprocedur test 1
+consider is gener 1
+consider is privileg 1
+consider it goal 1
+consider knowledg 1
+consider knowledg sourc 1
+consider larg scal 1
+consider larg spar 1
+consider le 1
+consider le individus 1
+consider le overhead 1
+consider le spac 1
+consider led 1
+consider loop 1
+consider man issu 1
+consider model 1
+consider model repr 1
+consider mor compl 1
+consider mor level 2
+consider mor techn 1
+consider multim 1
+consider multim multicast 1
+consider network 1
+consider nod 1
+consider non 1
+consider non structur 1
+consider of comput 1
+consider of desir 1
+consider of funct 1
+consider of imag 1
+consider of pr 1
+consider of succ 1
+consider on funct 1
+consider on nod 1
+consider onl cut 1
+consider onl flow 1
+consider order 1
+consider order orient 1
+consider other typ 1
+consider our simpl 1
+consider our techniqu 1
+consider p4 1
+consider pack 2
+consider parallel 1
+consider parallel architectur 1
+consider part 2
+consider problem 3
+consider problem siz 1
+consider proc 1
+consider proc cluster 1
+consider program 1
+consider program replac 1
+consider pur 1
+consider pur term 1
+consider real mach 1
+consider real polynom 1
+consider rel 1
+consider rel author 1
+consider reorthogon 1
+consider research 2
+consider research interest 2
+consider rol 1
+consider rol del 1
+consider s9 1
+consider scal 1
+consider select 1
+consider select dep 1
+consider separ 1
+consider sever exampl 1
+consider sever issu 1
+consider sever sub 1
+consider shorter 1
+consider shortest 1
+consider shortest multipl 1
+consider show 1
+consider simil 2
+consider simil character 2
+consider simplif 1
+consider slower 1
+consider smal hol 1
+consider smaller 1
+consider som exampl 1
+consider som sort 1
+consider som term 1
+consider som var 1
+consider stag 1
+consider stat 1
+consider stat signif 1
+consider such closur 1
+consider suggest 1
+consider synchron 1
+consider synchron system 1
+consider tempor 1
+consider tempor ind 1
+consider term 1
+consider th abstract 1
+consider th act 1
+consider th altern 1
+consider th amount 1
+consider th antimatr 1
+consider th appl 2
+consider th ar 1
+consider th ba 1
+consider th bipart 1
+consider th ca 4
+consider th categor 1
+consider th cl 1
+consider th compon 1
+consider th compound 1
+consider th comput 1
+consider th congest 1
+consider th crosscorrel 1
+consider th dag 1
+consider th datalog 1
+consider th delaun 1
+consider th design 1
+consider th diagram 1
+consider th differ 1
+consider th discr 1
+consider th domin 1
+consider th eff 1
+consider th el 1
+consider th equiv 1
+consider th exampl 3
+consider th execut 2
+consider th expr 1
+consider th ext 1
+consider th fac 1
+consider th featur 1
+consider th forml 1
+consider th fragm 1
+consider th funct 1
+consider th gener 1
+consider th goal 1
+consider th graph 2
+consider th hierarch 1
+consider th host 1
+consider th hyperbol 1
+consider th impact 1
+consider th impl 1
+consider th implem 2
+consider th init 1
+consider th issu 1
+consider th lat 1
+consider th learn 1
+consider th multim 1
+consider th multipl 1
+consider th network 1
+consider th not 1
+consider th nsfnet 1
+consider th opposit 1
+consider th order 1
+consider th overhead 1
+consider th par 1
+consider th parallel 2
+consider th pasc 1
+consider th perform 1
+consider th po 1
+consider th posit 1
+consider th pot 1
+consider th problem 9
+consider th proc 2
+consider th program 2
+consider th prolog 1
+consider th qu 1
+consider th quest 1
+consider th rat 1
+consider th rec 1
+consider th requir 1
+consider th result 1
+consider th rl 1
+consider th se 1
+consider th segm 1
+consider th sem 1
+consider th sequ 1
+consider th simpl 2
+consider th situ 1
+consider th stat 1
+consider th sub 1
+consider th subgraph 1
+consider th succ 1
+consider th sum 1
+consider th superimp 1
+consider th tcp 1
+consider th theor 1
+consider th til 1
+consider th tim 2
+consider th valu 2
+consider th var 2
+consider th worst 1
+consider that fr 1
+consider that nod 1
+consider that quest 1
+consider that xj0 1
+consider their combin 1
+consider their succ 1
+consider thr conceptu 1
+consider thr term 1
+consider thus 1
+consider ti 1
+consider tim 2
+consider tim point 1
+consider tim t1 1
+consider to appl 1
+consider to belong 1
+consider to prov 1
+consider to reduc 2
+consider triv 1
+consider tw addit 1
+consider tw approach 1
+consider tw ca 5
+consider tw coplanar 1
+consider tw point 1
+consider tw step 1
+consider tw substr 1
+consider tw succ 1
+consider tw typ 1
+consider typ 1
+consider typ correct 1
+consider under sect 1
+consider upd 1
+consider upd oper 1
+consider us 1
+consider val 1
+consider var 2
+consider vel 1
+consider vel variedad 1
+consider ver 1
+consider vi 1
+consider weak 1
+consider wel typ 1
+consider whether start 1
+consider which appl 1
+consider whol 1
+consider wil thus 1
+consider work 1
+consider worthwhil 2
+consign 1
+consign th major 1
+consistait 1
+consistait alor 1
+consister 1
+consisterait 2
+consisterait a appliquer 1
+consisterait a sappuyer 1
+consisterait gal 1
+consol 6
+consol acknowledg 1
+consol of altern 1
+consol rel 1
+consol rel cod 1
+consol subsequ 1
+consom 2
+consom a tout 1
+consom additionnel 1
+consom additionnel de 1
+consom alor 1
+consom alor moin 1
+consom aut 1
+consom aut de 1
+consom d eviter 1
+consom de 1
+consom de la 1
+consom e par 1
+consom m emoir 1
+consom moin 1
+consom moin de 1
+consom plus de 1
+consom un peu 1
+consom un tr 1
+consommateur 1
+consommer 1
+consommer moin 1
+consommer moin de 1
+conson 1
+consort 3
+consort transact 1
+consort transact proc 1
+conspicu 1
+conspicu pr 1
+conspir 1
+consstructur 1
+const 76
+const 1th 1
+const 1th direct 1
+const a1 1
+const acceler 1
+const ad 1
+const ae 1
+const amort 1
+const amort tim 1
+const amount 3
+const and act 1
+const and adapt 1
+const and defin 1
+const and observ 1
+const and po 1
+const and typ 1
+const and variabl 1
+const appear 1
+const appropr 1
+const appropr check 1
+const ar intepr 1
+const ar interpr 1
+const ar tak 1
+const assoc 1
+const at 1024p1 2
+const at 16p2 2
+const aver 1
+const aver tim 1
+const bound 1
+const by rat 1
+const chang 1
+const char 1
+const char menu 1
+const char quest 1
+const coeff 1
+const cof 1
+const cof chaqu 1
+const convect 1
+const dan 1
+const dan le 1
+const dat 1
+const dat dep 1
+const defin 1
+const degr 1
+const degr hypercub 1
+const degr network 1
+const den 1
+const differ 1
+const dim 1
+const dim valu 1
+const dist 1
+const du 1
+const encourag 1
+const ent 1
+const ent er 1
+const et egal 1
+const exceed 1
+const extr 1
+const extr memor 1
+const f0 1
+const fact 6
+const ffl0 1
+const for graph 1
+const for modif 1
+const fract 2
+const fram 1
+const fram siz 1
+const from do 1
+const funct 2
+const g1 1
+const ham 1
+const ham dist 1
+const hierarch 1
+const hierarch theorem 1
+const high valu 1
+const hyperbol 1
+const hyperbol inequ 1
+const import 1
+const import peu 1
+const improv 1
+const in do 1
+const in program 1
+const indep 2
+const integer 1
+const involut 1
+const is equ 1
+const is replac 1
+const k1 1
+const ma 1
+const maxcruisespeed 1
+const maxstep 1
+const me 1
+const me length 1
+const memor 1
+const monit 1
+const multipl 2
+const mut 1
+const mut rat 1
+const number 8
+const number rang 1
+const occur 1
+const oen 1
+const of sort 1
+const of typ 1
+const or hierarch 1
+const ou 1
+const ou de 1
+const parameter 1
+const payoff 1
+const per nod 1
+const per proc 1
+const perform 1
+const perform rat 1
+const perm 1
+const perm dattribuer 1
+const posit 1
+const posit ad 1
+const posit tr 1
+const produc 1
+const rat 1
+const rat ae 1
+const siz 1
+const siz calcl 1
+const siz problem 1
+const siz rel 1
+const sont 1
+const sont unif 1
+const sur 2
+const sur la 1
+const sur le 1
+const symbol 1
+const symbol a1 1
+const symbol ai 1
+const symbol bi 1
+const symbol c1 1
+const symbol denot 1
+const symbol distinct 1
+const symbol fic 1
+const symbol gtop 1
+const symbol occur 1
+const symboliqu 1
+const syntac 1
+const term 2
+const that appear 1
+const tick 1
+const tim 7
+const tim algorithm 1
+const tim bound 1
+const tim fact 1
+const tim point 1
+const tim transposit 1
+const tim using 1
+const to register 1
+const upd 1
+const upd list 1
+const valu 2
+const wheeldiam 1
+const which mak 1
+const width 1
+const width model 1
+const ye 1
+const.11 1
+const2 1
+constam 3
+constam de 1
+constam de op 1
+constam egal 1
+constam rejoint 1
+constam rejoint dan 1
+constantopoul 1
+constat 1
+constat nous 1
+constat nous offr 1
+constat nous serviront 1
+constater 1
+constater qu 1
+constater qu lalgorithm 1
+constitu 8
+constitu donc 2
+constitu donc pa 1
+constitu e de 3
+constitu e dun 2
+constitu e rigoureus 1
+constitu ee 3
+constitu ee de 3
+constitu ee du 1
+constitu ee dun 2
+constitu ee par 2
+constitu en 1
+constitu en quelqu 1
+constitu es 2
+constitu es de 1
+constitu es dun 1
+constitu l ebauch 1
+constitu la 1
+constitu la meilleur 1
+constitu le 3
+constitu le program 1
+constitu le repr 1
+constitu le tr 1
+constitu lessentiel 1
+constitu lessentiel du 1
+constitu min 1
+constitu min modl 1
+constitu op 1
+constitu op0s 1
+constitu oper 1
+constitu pa 1
+constitu pa la 1
+constitu pour 1
+constitu pour nous 1
+constitu transact 1
+constitu un 2
+constitu un ba 1
+constitu un de 1
+constitu un ensembl 1
+constitu un explor 1
+constitu un group 1
+constitu un incr 1
+constitu un pol 1
+constitu un travail 1
+constituer 1
+constituer un 1
+constituer un etap 1
+constitut 20
+constitut a docum 1
+constitut a gener 1
+constitut a natur 1
+constitut a path 1
+constitut a perform 1
+constitut a reg.5 1
+constitut a signif 1
+constitut an adequ 1
+constitut an atl 1
+constitut an edg 1
+constitut de 1
+constitut de ba 1
+constitut du 1
+constitut du pseud 1
+constitut it origin 1
+constitut part 1
+constitut th bin 1
+constitut th bulk 1
+constitut th dep 1
+constitut th environm 2
+constitut th globin 1
+constitut th input 1
+constitut th nxn 1
+constitut th perimeter 1
+constitut th techn 1
+constitutiv 1
+constitutiv dun 1
+constitutiv dun point 1
+constrain 22
+constrain appl 1
+constrain ba 1
+constrain ba system 1
+constrain by pack 1
+constrain dec 1
+constrain dynam 1
+constrain dynam algorithm 1
+constrain for pot 1
+constrain heter 1
+constrain heter proc 1
+constrain human 1
+constrain intersect 1
+constrain intersect segm 1
+constrain job 1
+constrain link 1
+constrain object 1
+constrain optim 1
+constrain optim problem 1
+constrain other select 1
+constrain perform 1
+constrain planar 1
+constrain planar triangl 1
+constrain real world 1
+constrain realworld 1
+constrain realworld problem 1
+constrain run 1
+constrain run length 1
+constrain system 1
+constrain th post 1
+constrain th system 1
+constrain th writ 1
+constrain triangl 1
+constrain triangl ment 1
+constrain triangl problem 1
+constrain tw transact 1
+constrain var 1
+constrain we ch 1
+constraint 61
+constraint a constraint 1
+constraint a fd 1
+constraint a propag 1
+constraint algorithm 1
+constraint allow 1
+constraint alw enabl 1
+constraint among variabl 1
+constraint and comput 1
+constraint and cuml 1
+constraint and datab 1
+constraint and distribut 1
+constraint and funct 1
+constraint and me 1
+constraint and perform 1
+constraint and redund 1
+constraint and reif 1
+constraint and requir 1
+constraint and sem 1
+constraint and term 1
+constraint and variabl 1
+constraint and x.9 1
+constraint ap 1
+constraint appl 1
+constraint approach 1
+constraint ar 1
+constraint ar assoc 1
+constraint ar atom 1
+constraint ar con 1
+constraint ar deriv 1
+constraint ar expr 1
+constraint ar ob 1
+constraint ar obv 1
+constraint ar specif 1
+constraint ar stronger 1
+constraint ar task 1
+constraint as el 1
+constraint assoc 3
+constraint ba 4
+constraint ba approach 1
+constraint ba design 1
+constraint ba infer 1
+constraint ba qu 1
+constraint ba structur 1
+constraint bal 1
+constraint bal checkbook 1
+constraint becom 2
+constraint becom uniqu 1
+constraint behav 1
+constraint behav simil 1
+constraint being enforc 1
+constraint between object 1
+constraint between variabl 1
+constraint by hierarch 1
+constraint by typ 1
+constraint c1 1
+constraint c1 imp 1
+constraint can caus 1
+constraint can expr 1
+constraint captur 1
+constraint cel 1
+constraint cel instead 1
+constraint chang 1
+constraint chip 1
+constraint cl 1
+constraint combin 1
+constraint commun 1
+constraint constraint 1
+constraint datab 1
+constraint datab inclus 1
+constraint datab qu 1
+constraint defin 1
+constraint describ 1
+constraint describ point 1
+constraint direct 1
+constraint direct search 1
+constraint domain 2
+constraint du 1
+constraint edg 1
+constraint ensur 1
+constraint expr 3
+constraint expr b0 1
+constraint expr using 1
+constraint expr wh 1
+constraint ext 1
+constraint for integer 1
+constraint for oper 1
+constraint for quest 1
+constraint for reduc 1
+constraint for solut 1
+constraint form 2
+constraint from perform 1
+constraint gener 1
+constraint giv 1
+constraint ha logspac 1
+constraint handl 1
+constraint handl rl 1
+constraint hav caus 1
+constraint hierarc 1
+constraint hierarc com. 1
+constraint hierarc compar 1
+constraint hierarc satisf 1
+constraint hierarch 1
+constraint hierarch allow 1
+constraint hierarch ba 1
+constraint hierarch du 1
+constraint hierarch origin 1
+constraint hierarch part 1
+constraint hierarch theor 1
+constraint hierarch using 1
+constraint hold 1
+constraint imp 5
+constraint imper 1
+constraint imper program 1
+constraint in chr 1
+constraint in clp 1
+constraint in concur 1
+constraint in log 1
+constraint in order 1
+constraint in p0 1
+constraint in p1 1
+constraint in reif 1
+constraint in srat 1
+constraint inclus 2
+constraint interpr 2
+constraint interpr mechan 1
+constraint involut 2
+constraint involut elimin 1
+constraint involut impl 1
+constraint is ad 1
+constraint is allow 1
+constraint is assoc 1
+constraint is entail 1
+constraint is expan 1
+constraint is expr 1
+constraint is extr 1
+constraint is frequ 1
+constraint is going 1
+constraint is imp 2
+constraint is redund 1
+constraint is said 1
+constraint is satisf 1
+constraint langu 2
+constraint langu cc 1
+constraint lead 2
+constraint lem 1
+constraint lem pr 1
+constraint length 1
+constraint lik board 2
+constraint lim 1
+constraint log 7
+constraint log connectiv 1
+constraint log langu 1
+constraint log program 7
+constraint me 1
+constraint ment 1
+constraint might cr 1
+constraint model 1
+constraint network 2
+constraint number 1
+constraint o2 1
+constraint obtain 1
+constraint of pn 1
+constraint on act 1
+constraint on constraint 1
+constraint on design 1
+constraint on hierarch 3
+constraint on hilog 1
+constraint on ib 1
+constraint on object 1
+constraint on old 1
+constraint on specif 1
+constraint on transact 1
+constraint orient 1
+constraint orient siml 1
+constraint over b0 1
+constraint over constraint 1
+constraint over integer 1
+constraint paradigm 1
+constraint part 1
+constraint pr 1
+constraint problem 2
+constraint problem solut 1
+constraint proc 1
+constraint program 4
+constraint program cr 1
+constraint program defin 1
+constraint program langu 1
+constraint program paradigm 1
+constraint program techniqu 2
+constraint prop 1
+constraint propag 3
+constraint propag dep 1
+constraint propag techniqu 1
+constraint qu 1
+constraint qu langu 1
+constraint reduc 1
+constraint reduc search 1
+constraint rel 1
+constraint remain 1
+constraint remov 1
+constraint repr 1
+constraint requir 2
+constraint restrict 2
+constraint restrict allow 2
+constraint satisf 7
+constraint satisf algorithm 1
+constraint satisf problem 5
+constraint satisf techniqu 1
+constraint satisf valu 1
+constraint se 1
+constraint select 1
+constraint si 1
+constraint simplif 1
+constraint simplif algorithm 1
+constraint simplif vs 1
+constraint solut 3
+constraint solut algorithm 1
+constraint solut incr 1
+constraint solut method 1
+constraint solver 3
+constraint specif 2
+constraint specif schem 1
+constraint strong 1
+constraint suff 1
+constraint system 1
+constraint t1 1
+constraint technolog 3
+constraint th constraint 1
+constraint than l0 1
+constraint than l1 1
+constraint that ap 1
+constraint that ar 1
+constraint that bronchit 1
+constraint that caus 1
+constraint that character 1
+constraint that correspon 1
+constraint that deal 1
+constraint that dep 1
+constraint that describ 1
+constraint that dog 1
+constraint theor 1
+constraint tight 1
+constraint to aff 1
+constraint to datalog 1
+constraint to maintain 1
+constraint to ob 1
+constraint to prun 1
+constraint us.2 1
+constraint using 2
+constraint using inherit 1
+constraint using substitut 1
+constraint viol 1
+constraint w wmac 1
+constraint wa avail 1
+constraint we cr 1
+constraint we expr 1
+constraint we om 1
+constraint weak 1
+constraint when perform 1
+constraint which ar 2
+constraint which hold 1
+constraint whil offer 1
+constraint wil allow 1
+constraint with equ 1
+constraint with error 1
+constraint with hierarch 1
+constraint with strength 1
+constraint without chang 1
+constraint without error 1
+constraint without lo 1
+constraint.2 1
+constraint.4 1
+constraint.4 giv 1
+constraint5 1
+constraintb 1
+constraintb approach 1
+constraintb approach combin 1
+constraintpropag 1
+constraintpropag in qualit 1
+constraintsg 1
+constru 3
+constru de 1
+constru de etiqu 1
+constru un 1
+construc 88
+construc a 2t 1
+construc a bind 1
+construc a bipart 1
+construc a breadth 1
+construc a categor 1
+construc a coar 1
+construc a commun 1
+construc a compl 1
+construc a digit 1
+construc a direct 1
+construc a discrimin 1
+construc a domain 1
+construc a fam 1
+construc a figur 1
+construc a fin 1
+construc a finit 1
+construc a fl 1
+construc a gener 1
+construc a grammar 1
+construc a heap 1
+construc a junct 1
+construc a list 1
+construc a mach 1
+construc a map 1
+construc a markov 1
+construc a maxim 1
+construc a me 1
+construc a memor 1
+construc a minim 3
+construc a number 1
+construc a prob 1
+construc a real 1
+construc a record 1
+construc a reflec 1
+construc a regl 1
+construc a satisf 1
+construc a schedl 1
+construc a se 2
+construc a sequ 3
+construc a shout 1
+construc a smooth 1
+construc a solut 1
+construc a span 2
+construc a stat 1
+construc a suit 1
+construc a supergraph 1
+construc a syntac 1
+construc a tdfg 1
+construc a test 1
+construc a triangl 1
+construc a val 1
+construc a weight 2
+construc a zer 1
+construc accord 1
+construc after step 1
+construc al request 1
+construc algorithm 5
+construc algorithm con 1
+construc algorithm run 1
+construc an algorithm 1
+construc an architectur 1
+construc an auxil 1
+construc an aver 1
+construc an elabor 1
+construc an inst 2
+construc an object 1
+construc an optim 2
+construc an undirect 1
+construc and evalu 1
+construc and funct 1
+construc and identif 1
+construc and manipl 1
+construc and optim 1
+construc and predefin 1
+construc and result 1
+construc and search 1
+construc and suc 1
+construc and synth 1
+construc and termin 1
+construc and theorem 1
+construc and therefor 1
+construc and us 1
+construc and variabl 1
+construc another heap 1
+construc ap 1
+construc ar 1
+construc ar ar 1
+construc ar continu 1
+construc ar parameter 1
+construc ar rough 1
+construc as follow 2
+construc as ift 1
+construc as shown 1
+construc av 1
+construc av de 1
+construc between adjac 1
+construc bm 1
+construc build 1
+construc build block 1
+construc by combin 1
+construc by hopcroft 1
+construc by order 1
+construc by prim 1
+construc by succ 1
+construc by using 1
+construc can ea 1
+construc cfg 1
+construc cl 1
+construc cl con 1
+construc cl denot 1
+construc cluster 1
+construc com 2
+construc com le 1
+construc con 2
+construc conditionnel 1
+construc conditionnel consid 1
+construc conditionnel cont 1
+construc conditionnel dispar 1
+construc conditionnel el 1
+construc conditionnel en 1
+construc conditionnel inclu 1
+construc conditionnel inclus 1
+construc conditionnel peut 1
+construc construc 2
+construc construc spec 1
+construc construc strateg 1
+construc control 1
+construc control flow 1
+construc crit 1
+construc cruel 1
+construc cruel environm 1
+construc d dim 1
+construc de 4
+construc de facteur 1
+construc de la 2
+construc de lhyperoctr 1
+construc de matr 1
+construc decl 1
+construc decl el 1
+construc def 2
+construc def method 1
+construc degr 1
+construc diagram 1
+construc diagram illustr 1
+construc discipl 1
+construc du 1
+construc du nid 1
+construc dun 4
+construc dun hyperoctr 1
+construc dun sous 1
+construc dun tel 1
+construc dun term 1
+construc dun transform 1
+construc edg 1
+construc el 1
+construc el head 1
+construc et propr 1
+construc exampl 1
+construc explicit 1
+construc explicit de 1
+construc expr 1
+construc figur 1
+construc figur correspon 1
+construc fl 1
+construc fl span 1
+construc for defin 1
+construc for intersect 1
+construc for problem 1
+construc for specif 1
+construc found 1
+construc from build 1
+construc from combin 1
+construc from el 1
+construc from gi 1
+construc from integer 1
+construc from lambd 1
+construc from simpler 1
+construc from switch 1
+construc from themat 1
+construc funct 5
+construc funct cl 1
+construc funct typ 1
+construc gd 1
+construc geometer 1
+construc geometer figur 1
+construc gi 1
+construc giv 2
+construc grammar 1
+construc grammar built 1
+construc graph 1
+construc graph gf 1
+construc guar 1
+construc heap 1
+construc imbriqu 1
+construc imbriqu ee 1
+construc implem 1
+construc in lin 2
+construc in natur 1
+construc in parallel 1
+construc in svm 1
+construc in thinglab 1
+construc in tim 2
+construc induc 1
+construc instruc 1
+construc int 1
+construc int dat 1
+construc interconnect 1
+construc interconnect network 1
+construc interconnect pattern 1
+construc is arbitr 1
+construc is cl 1
+construc is defin 1
+construc is en 1
+construc is implem 1
+construc is predomin 1
+construc is specif 1
+construc iter 1
+construc joint 1
+construc joint transform 1
+construc le error 1
+construc level 1
+construc m0i 1
+construc m1 1
+construc mak 2
+construc mak cr 1
+construc mark 1
+construc mart 1
+construc maxim 1
+construc maxim dist 1
+construc measur 1
+construc ment 1
+construc method 2
+construc method known 1
+construc mn 1
+construc mor involut 1
+construc mus 1
+construc mus grammar 1
+construc n singl 1
+construc new program 1
+construc new reg 1
+construc nod 1
+construc oe 1
+construc oeab 1
+construc of bi 1
+construc of cfg 1
+construc of computer 1
+construc of famil 1
+construc of figur 1
+construc of gd 1
+construc of genvoc 1
+construc of gi 1
+construc of h2 1
+construc of hyperoctr 1
+construc of interconnect 1
+construc of junct 1
+construc of maxim 1
+construc of octr 1
+construc of oeab 1
+construc of string 1
+construc of surfac 1
+construc of tim 1
+construc oper 1
+construc other exampl 1
+construc p.e.resultexpr 1
+construc p.e.resultexpr specializationpoint 1
+construc ph 2
+construc ph tak 1
+construc piecem 1
+construc pract 1
+construc pract form 1
+construc preusserstr 1
+construc proc 2
+construc prompt 1
+construc protocol 1
+construc prov 1
+construc purp 2
+construc purp hid 2
+construc requir 2
+construc rl 1
+construc se 2
+construc se theor 1
+construc sequ 1
+construc sol 1
+construc sol geometer 1
+construc som intern 1
+construc som sampl 1
+construc sort 1
+construc sort network 1
+construc spanner 1
+construc spar 1
+construc spar euclidean 1
+construc spec 1
+construc specif 2
+construc specif di 1
+construc specif giv 1
+construc start 1
+construc strateg 1
+construc such unimodl 1
+construc suggest 1
+construc symbol 1
+construc system 1
+construc system using 1
+construc t dat 1
+construc t spanner 1
+construc t1 1
+construc t1 t2 1
+construc tdfg 1
+construc th 2d 1
+construc th appropr 1
+construc th bipart 1
+construc th block 2
+construc th cfg 1
+construc th compiler 1
+construc th correspon 1
+construc th cpn 1
+construc th fact 1
+construc th forml 1
+construc th fr 1
+construc th graph 2
+construc th hypoth 1
+construc th inst 1
+construc th interpol 1
+construc th method 1
+construc th modl 1
+construc th norm 1
+construc th origin 1
+construc th pr 1
+construc th request 1
+construc th run 1
+construc th schedl 1
+construc th span 1
+construc th spanner 1
+construc th weigh 1
+construc that lead 1
+construc that us 3
+construc thr dim 1
+construc thr run 1
+construc through prim 1
+construc tim 1
+construc to expr 1
+construc to mark 1
+construc to specif 1
+construc tool 1
+construc tool se 1
+construc tw run 1
+construc typ 1
+construc using 3
+construc var 1
+construc ver 2
+construc ver va 1
+construc void 1
+construc we restrict 1
+construc weigh 1
+construc weigh matr 1
+construc wh 1
+construc wh non 1
+construc which cr 1
+construc which explicit 1
+construc which interpol 1
+construc with 2n 1
+construc with algorithm 1
+construc with ruler 1
+construc with tot 1
+construc yield 1
+construc yield result 1
+constructeur 1
+constructeur de 1
+constructeur de mach 1
+construir 5
+construir ce 1
+construir ce espac 1
+construir de 4
+construir de algorithm 1
+construir de configur 1
+construir de estimateur 1
+construir de mod 1
+construir de nouvel 1
+construir de var 1
+construir et comparer 1
+construir la 1
+construir la transform 1
+construir le 2
+construir le ba 1
+construir le bloc 1
+construir un 3
+construir un nouveau 1
+construir un nouvel 3
+construir un suit 1
+construir un transform 1
+construison 2
+construison de 1
+construison de algorithm 1
+construison sur 1
+construison sur ce 1
+construison un 1
+construit 4
+construit a partir 2
+construit au 1
+construit au dessus 1
+construit automatiqu 1
+construit autour 1
+construit autour dun 1
+construit avant 1
+construit avant la 1
+construit de 3
+construit de fa 2
+construit en 2
+construit en concat 1
+construit en pren 1
+construit incr 1
+construit incr em 1
+construit pa 1
+construit pa de 1
+construit pour 1
+construit zk 1
+constx 1
+constx2 1
+constx2 or ii 1
+constx3 1
+consult 8
+consult and appr 1
+consult any design 1
+consult as part 1
+consult each system 1
+consult system 1
+consult th loc 1
+consulter 1
+consulter la 1
+consulter la librair 1
+consum 25
+consum 2pathlength 1
+consum 2pathlength degr 1
+consum al tim 1
+consum and frequ 1
+consum and produc 1
+consum and system 1
+consum and ted 1
+consum approxim 1
+consum comput 1
+consum comput step 1
+consum inord 1
+consum inord tim 1
+consum on level 1
+consum part 1
+consum ph 1
+consum problem 1
+consum proc 1
+consum program 1
+consum repr 1
+consum repr conver 1
+consum task 1
+consum tim 1
+consum tim proport 1
+consum to writ 1
+consumer 2
+consumer to run 1
+cont 54
+cont alor 2
+cont alor aut 1
+cont alor un 1
+cont and attribut 1
+cont and buffer 1
+cont and low 2
+cont and styl 2
+cont appear 1
+cont ar abstract 1
+cont ar denot 1
+cont au 1
+cont au moin 1
+cont ba 2
+cont ba acc 1
+cont ba imag 1
+cont ba resourc 1
+cont ba retrief 1
+cont ba taxonom 1
+cont ba vid 1
+cont ba visu 1
+cont by text 1
+cont cc3 1
+cont d utiliser 1
+cont dan 1
+cont dan le 1
+cont dautr 1
+cont dautr el 1
+cont de 2
+cont de coupur 1
+cont de el 1
+cont de fonct 1
+cont de le 1
+cont de test 1
+cont descript 1
+cont du 1
+cont es 1
+cont es dan 1
+cont et de 1
+cont extract 1
+cont fact 1
+cont for shar 1
+cont fr 1
+cont fr multicast 1
+cont fr ph 1
+cont ic 1
+cont ic de 1
+cont ik 1
+cont in multipl 1
+cont ind 1
+cont init 1
+cont init le 1
+cont int output 1
+cont is found 1
+cont is singl 1
+cont la 2
+cont la mod 1
+cont la var 1
+cont le 3
+cont le el 1
+cont le fin 1
+cont le mach 1
+cont le point 1
+cont m pag 1
+cont may dep 1
+cont member 1
+cont ment 1
+cont model 1
+cont model pr 1
+cont navig 1
+cont ne 1
+cont ne sont 1
+cont occur 2
+cont of ai 1
+cont of bin 1
+cont of imag 1
+cont of me 1
+cont of record 1
+cont of se 1
+cont of var 1
+cont of waveform 1
+cont on shar 1
+cont or typ 1
+cont over acc 1
+cont pa 1
+cont pa de 1
+cont pa dit 1
+cont pa i1 1
+cont pa qu 1
+cont parcour 1
+cont parcour la 1
+cont plus de 1
+cont plusieur 1
+cont plusieur acc 1
+cont plusieur direct 1
+cont pourt 1
+cont pourt qu 1
+cont prim 1
+cont prim ba 1
+cont qu 2
+cont qu de 2
+cont quun 1
+cont quun sel 1
+cont s dapproxim 1
+cont search 1
+cont sensit 1
+cont sic el 1
+cont soit 1
+cont soit dt 1
+cont syst 1
+cont syst ematiqu 1
+cont tabl 1
+cont to exploit 1
+cont tr 1
+cont tr el 1
+cont un 2
+cont un acc 1
+cont un comparaison 1
+cont un coupur 1
+cont un op 1
+cont un part 1
+cont using 2
+cont using color 1
+cont using parallel 1
+cont vect 1
+contact 7
+contact a person 1
+contact a rich 1
+contact author 4
+contact between stud 1
+contact or archiv 1
+contain 108
+contain a brief 1
+contain a cl 1
+contain a collect 1
+contain a cop 1
+contain a count 1
+contain a cr 1
+contain a dat 1
+contain a decomposit 1
+contain a disjoint 1
+contain a distinct 1
+contain a link 2
+contain a list 2
+contain a loc 1
+contain a loopfr 1
+contain a lot 1
+contain a lower 1
+contain a me 2
+contain a menu 1
+contain a neutr 1
+contain a nod 1
+contain a number 2
+contain a path 1
+contain a pr 1
+contain a prec 1
+contain a refer 2
+contain a room 1
+contain a se 1
+contain a secon 1
+contain a separ 1
+contain a shortest 1
+contain a slot 1
+contain a specif 1
+contain a sum 1
+contain a supersc 1
+contain a train 1
+contain a triangl 1
+contain a valu 1
+contain a var 1
+contain a view 1
+contain a yellow 1
+contain abstract 1
+contain act 1
+contain affect 1
+contain affect refer 1
+contain after inser 1
+contain agent 1
+contain ai 1
+contain al attribut 1
+contain al inver 1
+contain al partit 1
+contain al path 1
+contain al sharp 1
+contain among other 1
+contain an addit 2
+contain an edg 1
+contain an endpoint 1
+contain an entr 1
+contain an infinit 1
+contain an interfac 1
+contain an inver 1
+contain an object 1
+contain an oper 1
+contain another sit 1
+contain any cal 1
+contain any endpoint 1
+contain any giv 1
+contain any leaf 1
+contain any nod 1
+contain any norm 1
+contain any number 1
+contain any typ 1
+contain any upd 1
+contain any val 1
+contain anyth human 1
+contain appl 1
+contain approach 1
+contain approxim 1
+contain atom 1
+contain atom valu 1
+contain attribut 2
+contain becom 1
+contain becom upd 1
+contain bin 1
+contain bin claus 1
+contain bind 1
+contain both fragm 1
+contain both typ 1
+contain built 1
+contain c proc 2
+contain c1 1
+contain cal 1
+contain cd 1
+contain census 1
+contain census inform 1
+contain ch 1
+contain ch point 1
+contain cod 1
+contain compan 1
+contain compl 1
+contain compl se 1
+contain complec 1
+contain comput 1
+contain conclus 1
+contain conclus remark 1
+contain constraint 1
+contain dat 4
+contain definit 1
+contain degr 1
+contain dep 1
+contain descript 1
+contain direct 1
+contain direct connect 1
+contain div 1
+contain ec 1
+contain ec axiom 1
+contain edg 1
+contain eight 1
+contain ek 1
+contain emb 1
+contain emb link 1
+contain enough cl 1
+contain enough inform 3
+contain ent 1
+contain entr 2
+contain er 1
+contain er rl 1
+contain exact 5
+contain exampl 1
+contain expon 1
+contain expon funct 1
+contain extr 1
+contain extr oper 1
+contain fault 1
+contain fewer 2
+contain fewer tupl 1
+contain field 3
+contain field nam 1
+contain fl 1
+contain fl loc 1
+contain four procedur 1
+contain hid 1
+contain hid variabl 1
+contain hol 1
+contain id 1
+contain implicit 1
+contain implicit inform 1
+contain import 1
+contain import stat 1
+contain imq 1
+contain in oe2 1
+contain in qu 1
+contain in rel 1
+contain inequ 1
+contain infinit 1
+contain inform 2
+contain inherit 1
+contain inherit inform 1
+contain init 1
+contain init cod 1
+contain interv 1
+contain link 1
+contain list 1
+contain longer 1
+contain longer claus 1
+contain loop 1
+contain mail 1
+contain mail addr 1
+contain man near 1
+contain man redund 1
+contain man st 1
+contain marker 1
+contain med 1
+contain med st 1
+contain memor 1
+contain memor loc 1
+contain modl 1
+contain mor blank 1
+contain mor fac 1
+contain multipl 2
+contain multipl el 1
+contain multipl tor 1
+contain n dat 1
+contain n nod 1
+contain n record 1
+contain n0 1
+contain n0 stat 1
+contain neg 1
+contain neg liter 1
+contain next und 1
+contain nf 1
+contain nf refer 1
+contain ng 1
+contain ng refer 1
+contain no bridg 1
+contain no cut 1
+contain no ec 1
+contain no funct 1
+contain no graph 1
+contain no implicit 1
+contain no multip 1
+contain no obsol 1
+contain no repeat 1
+contain no sharp 1
+contain no understand 1
+contain non 1
+contain non dur 1
+contain non init 1
+contain object 1
+contain on reader 1
+contain onl clr 1
+contain onl com 1
+contain onl complem 1
+contain onl cur 1
+contain onl funct 1
+contain onl intern 1
+contain onl log 1
+contain onl maxrol 1
+contain onl metavariabl 1
+contain onl nod 1
+contain onl non 1
+contain onl stronger 1
+contain onl ten 1
+contain op 1
+contain ordin 1
+contain ordin dat 1
+contain other typ 1
+contain p procedur 1
+contain p0 1
+contain particl 1
+contain particl inform 1
+contain ph 1
+contain piggyback 1
+contain piggyback inform 1
+contain pointer 1
+contain procedur 1
+contain procedur cal 1
+contain procedur twovisit 1
+contain program 1
+contain program modif 1
+contain prolog 1
+contain quantif 1
+contain r 2kd 1
+contain r request 1
+contain rectangl 1
+contain red 1
+contain refer 2
+contain reg 1
+contain relev 1
+contain relev inform 1
+contain rl 1
+contain rough 1
+contain rough jv0j 1
+contain scen 1
+contain se 1
+contain sever discontinu 1
+contain sid 1
+contain sid effect 1
+contain singl 1
+contain singl procedur 1
+contain som cal 1
+contain som kind 1
+contain som number 1
+contain som us 1
+contain spat 1
+contain spat dat 1
+contain spec leav 1
+contain spot 1
+contain start 1
+contain start act 1
+contain subrout 1
+contain subst 1
+contain subst fewer 1
+contain subtyp 1
+contain subtyp specif 1
+contain such attribut 1
+contain suff 2
+contain suff inform 1
+contain suff simil 1
+contain synchron 1
+contain synchron variabl 1
+contain t substr 1
+contain ten 1
+contain test 1
+contain test design 1
+contain test t1 1
+contain text 1
+contain th act 1
+contain th actu 1
+contain th aff 1
+contain th chang 1
+contain th cl 1
+contain th combin 1
+contain th conjunct 1
+contain th const 1
+contain th criter 1
+contain th dat 2
+contain th definit 1
+contain th edg 2
+contain th empt 2
+contain th endpoint 1
+contain th entir 1
+contain th environm 1
+contain th expect 1
+contain th fac 1
+contain th fam 1
+contain th field 2
+contain th fragm 1
+contain th highest 1
+contain th imag 1
+contain th ind 1
+contain th inform 1
+contain th interfac 1
+contain th link 1
+contain th loc 1
+contain th loop 1
+contain th mbr 1
+contain th method 1
+contain th minim 1
+contain th nod 1
+contain th norm 1
+contain th number 3
+contain th output 1
+contain th pair 1
+contain th perform 1
+contain th prob 1
+contain th proof 1
+contain th proper 1
+contain th quant 1
+contain th record 1
+contain th rest 1
+contain th result 1
+contain th root 1
+contain th roundtrip 1
+contain th se 1
+contain th slot 1
+contain th st 3
+contain th strip 1
+contain th sub 1
+contain th sum 1
+contain th text 1
+contain th transact 1
+contain th truth 1
+contain th upd 1
+contain th user 1
+contain th valu 2
+contain th var 4
+contain th ver 1
+contain th zer 1
+contain that result 1
+contain that var 1
+contain therein 1
+contain thousand 1
+contain thr dent 1
+contain thr field 1
+contain thr se 1
+contain thr variabl 1
+contain transact 2
+contain transact timestamp 1
+contain tripl 1
+contain tupl 1
+contain tw abstract 1
+contain tw candid 1
+contain tw consecut 1
+contain tw leav 1
+contain tw list 1
+contain tw major 1
+contain tw meter 1
+contain tw queu 1
+contain tw specif 1
+contain tw typ 1
+contain tw valu 1
+contain u0 1
+contain ui 1
+contain unmark 1
+contain unmark green 1
+contain unqualif 1
+contain unqualif nam 1
+contain unspecif 1
+contain unspecif dat 1
+contain v1 1
+contain valu 1
+contain var 1
+contain variabl 2
+contain wel kind 1
+contain word 1
+contain worker 1
+contain worker network 1
+contain y variabl 1
+contain zer 1
+container 3
+container and cur 1
+container cl 2
+container cl dep 1
+container cont 1
+container decl 1
+container iter 1
+container object 1
+container object st 1
+container random 1
+container traver 1
+container traver int 1
+container traver void 1
+containm 2
+containm between tableaux 1
+containm condit 1
+containm hold 1
+containm in np 1
+containm is np 1
+containm is p2 1
+containm of qu 1
+containm of tableaux 1
+containm problem 1
+containm with den 1
+contempl 2
+contempl th design 1
+contempl th problem 1
+contempor 9
+contempor design 1
+contempor design theor 1
+contempor direct 1
+contempor direct manipl 1
+contempor lingu 1
+contempor lingu an 1
+contempor mach 1
+contempor program 1
+contempor program langu 1
+contempor prototyp 2
+contempor softwar 1
+contempor softwar gener 1
+contempor switch 1
+contempor system 1
+contempor tim 1
+contempor tim parameter 1
+contempor tren 1
+contempor user 1
+contempor user interfac 1
+contenait 1
+contenait qu 1
+contenait qu le 1
+contenir 2
+contenir de 1
+contenir de boucl 1
+contenir plusieur 1
+contenir un 1
+contenir un disjonct 1
+contenter 1
+contenter de 1
+contenter de lapproxim 1
+contenter dun 1
+contenter dun partit 1
+contenteron 1
+contenteron dan 1
+contenteron dan ce 1
+contenteron de 1
+contenteron de pr 1
+contenteron donc 1
+contenteron donc de 1
+contentionidl 1
+contentionidl cycl 1
+contenu 2
+contenu dan 2
+contenu dan ce 1
+contenu dan le 2
+contenu dan un 1
+contenu de 2
+contenu de chaqu 1
+contenu de la 1
+contenu de lenviron 1
+contenu de register 1
+contenu du 1
+contenu du prem 1
+contenu du register 1
+contenu sont 1
+contenu sont sauv 1
+contenus 1
+contenus dan 1
+contenus dan ce 1
+contenus dan un 1
+contest 1
+contest as part 1
+context 58
+context and comput 1
+context and kind 1
+context and lem 1
+context and simultan 1
+context approach 1
+context ar avail 1
+context ar consider 1
+context ar construc 1
+context ar predefin 1
+context ar se 1
+context argum 1
+context by ad 1
+context c return 1
+context ch 1
+context chang 2
+context claus 1
+context claus list 1
+context consider 1
+context de 2
+context de cr 1
+context de enregister 1
+context de kcm 1
+context de la 2
+context de linterpr 1
+context de lordonnanc 1
+context de mal 1
+context de mvp 1
+context de par 1
+context de xi 1
+context definit 1
+context definit giv 1
+context demand 1
+context dep 4
+context dep bnf 1
+context dep probabil 1
+context dep schem 1
+context describ 1
+context determin 1
+context don 1
+context du 1
+context du lang 1
+context du syst 1
+context dun 1
+context dun architectur 1
+context dun cod 1
+context dun compil 1
+context dun emulateur 1
+context dun mach 1
+context dun mi 1
+context dun syst 1
+context edit 1
+context est 1
+context et donc 1
+context etait 1
+context etait perdu 1
+context exact 1
+context foc2 1
+context for oper 1
+context for synchron 1
+context fr 2
+context fr dynam 1
+context fr grammar 2
+context hx0 1
+context in ml 1
+context in mult 1
+context in zn 1
+context inclus 1
+context inform 3
+context inform becom 1
+context init 1
+context init de 1
+context is clear 1
+context is consider 1
+context is control 1
+context is exclus 1
+context is mer 1
+context is unchang 1
+context match 1
+context menu 1
+context model 1
+context must inclus 1
+context n ecessair 1
+context non 1
+context non wam 1
+context nous 1
+context of bidirect 1
+context of bisect 1
+context of cluster 1
+context of constraint 1
+context of danc 1
+context of design 1
+context of dsm 1
+context of execut 1
+context of ext 1
+context of interact 1
+context of multimod 1
+context of multiproc 1
+context of nod 1
+context of object 1
+context of oper 1
+context of order 1
+context of pur 1
+context of reason 1
+context of rol 1
+context of soc 1
+context of softwar 1
+context of switch 1
+context of synchron 1
+context of unidirect 1
+context of vi 1
+context parallel 2
+context parallel offer 1
+context parallel support 1
+context prev 1
+context prev establ 1
+context pur 1
+context pur logiciel 1
+context requir 2
+context requir knowledg 1
+context s cur 1
+context s equentiel 1
+context seem 1
+context sensit 5
+context sensit help 1
+context sensit show 1
+context sensit singl 1
+context smooth 1
+context smooth integr 1
+context strength 1
+context suppl 1
+context suppl email 1
+context switch 7
+context switch becom 1
+context switch mad 1
+context switch overhead 2
+context tant 1
+context tant mat 1
+context task 1
+context task context 1
+context th act 1
+context th foc 1
+context th singl 1
+context that expect 1
+context to establ 1
+context upd 1
+context var 1
+context var valu 1
+context wel form 1
+context wh 2
+context wh comput 1
+context would requir 1
+contextfr 1
+contextfr grammar 1
+contextfr grammar ba 1
+contextsensit 1
+contextsensit help 1
+contextu 6
+contextu aspect 1
+contextu correl 1
+contextu evid 1
+contextu ext 1
+contextu help 1
+contextu help adv 1
+contextu help facil 1
+contextu help system 1
+contextu inform 3
+contextu oper 1
+contextu oper commut 1
+contextu oper elim 1
+contextu oper introduc 1
+contextu oper tak 1
+contextu program 1
+contextu program claus 1
+contextu unit 1
+contextu unit defin 1
+contiendr 1
+contiendr le 1
+contiendr le don 1
+contiendront 1
+contiendront de 1
+contiendront de otr 1
+contigu 10
+contigu 0s 1
+contigu act 1
+contigu act proc 1
+contigu block 1
+contigu equ 1
+contigu equ squar 1
+contigu es 1
+contigu es de 1
+contigu in intern 1
+contigu on disk 1
+contigu part 1
+contigu record 1
+contigu reg 1
+contigu reg correspon 1
+contigu register 1
+contigu row 1
+contigu sect 1
+contigu sect inclus 1
+contigu segm 1
+contigu ser 1
+contigu submesh 1
+contigu submesh ri 1
+contigu word 1
+continu 73
+continu a duumvir 1
+continu a lentr 1
+continu a number 1
+continu a part 1
+continu a partir 1
+continu act 1
+continu act ge 1
+continu act mak 1
+continu activ 1
+continu activ funct 1
+continu ad 1
+continu ad absurdum 1
+continu adv 1
+continu alor 1
+continu alor avec 1
+continu and backtrack 1
+continu and henc 1
+continu and non 1
+continu attempt 1
+continu attribut 1
+continu au 1
+continu avec 1
+continu avec la 1
+continu backlog 1
+continu being develop 1
+continu bien 1
+continu bien connu 1
+continu bound 1
+continu by ca 1
+continu by pa 1
+continu by sen 1
+continu ca 1
+continu ca la 1
+continu cal 1
+continu cal sub 1
+continu caus 1
+continu chang 2
+continu condit 3
+continu condit gaus 1
+continu continu 1
+continu contraint 1
+continu cp 1
+continu cp environ 1
+continu cr 1
+continu cr eat 1
+continu d echec 1
+continu dan 1
+continu dan le 1
+continu de 2
+continu de lenviron 1
+continu de sort 1
+continu de succ 1
+continu del 1
+continu distribut 1
+continu domain 1
+continu down 1
+continu du 1
+continu du fait 1
+continu du point 1
+continu el 1
+continu el stop 1
+continu en 2
+continu en mod 1
+continu enabl 1
+continu error 1
+continu est 1
+continu est plac 1
+continu et de 1
+continu et inform 1
+continu et le 1
+continu evolut 1
+continu execut 1
+continu feed 1
+continu feed appl 1
+continu feed collabor 1
+continu flag 1
+continu from o2 1
+continu from wh 1
+continu from x2 1
+continu funct 2
+continu gener 1
+continu growth 1
+continu handl 1
+continu if lastnod 1
+continu il 1
+continu il ne 1
+continu improv 1
+continu in prolog 1
+continu internet 1
+continu internet ba 1
+continu interv 1
+continu it graph 1
+continu learn 1
+continu lin 1
+continu lin segm 1
+continu maint 1
+continu maintain 1
+continu map 1
+continu me 1
+continu ment 1
+continu ment design 1
+continu method 1
+continu mov 1
+continu mov ver 1
+continu na 1
+continu na donc 1
+continu ne 1
+continu ne soient 1
+continu nest 1
+continu nest alor 1
+continu ni 1
+continu ni le 1
+continu of tp 1
+continu our prior 1
+continu our research 1
+continu pa 2
+continu pa bin 1
+continu pa prolog 1
+continu pa styl 2
+continu perturb 1
+continu peut 1
+continu peut maint 1
+continu po 1
+continu pour 1
+continu pour saffranchir 1
+continu proc 1
+continu program 2
+continu program execut 1
+continu program pointer 1
+continu queu 1
+continu research 1
+continu respon 1
+continu rl 1
+continu rl obtain 1
+continu run 1
+continu run fl 1
+continu scal 1
+continu self 1
+continu serv 2
+continu sign 1
+continu simpl 1
+continu simpl funct 1
+continu skel 1
+continu sont 1
+continu sont dan 1
+continu specif 1
+continu st 1
+continu st spac 1
+continu stop 1
+continu stop rl 1
+continu subsequ 1
+continu subsequ comput 1
+continu support 1
+continu sur 1
+continu sur la 1
+continu th comput 1
+continu th evalu 1
+continu th execut 1
+continu th graph 1
+continu th log 1
+continu th plac 1
+continu their execut 1
+continu their invoc 1
+continu their work 1
+continu thenif 1
+continu thenif po 1
+continu thread 1
+continu thread condit 1
+continu tim 2
+continu tim tempor 1
+continu to broadcast 1
+continu to coar 1
+continu to denot 1
+continu to diverg 1
+continu to establ 1
+continu to follow 1
+continu to gener 1
+continu to hold 1
+continu to incr 2
+continu to liv 1
+continu to maintain 1
+continu to propag 1
+continu to read 1
+continu to ref 1
+continu to repr 1
+continu to satisf 1
+continu to sen 1
+continu toutef 1
+continu traver 1
+continu univar 1
+continu univar distribut 1
+continu univer 1
+continu univer search 1
+continu upd 2
+continu upd act 1
+continu upd dat 1
+continu var 1
+continu wa creat 1
+continu with invoc 1
+continu with respect 1
+continu wrong 1
+continu wrong condit 1
+continuer 1
+continuer la 1
+continuer la recherch 1
+continuer lec 1
+continuer lec ecut 1
+continueron 1
+continueron dappeler 1
+continueron dappeler pil 1
+continuit 1
+continuousfeed 1
+continuousfeed appl 1
+continuum 1
+continuum in system 1
+contour 3
+contour a leur 1
+contour and extern 1
+contour ar orient 1
+contour ba 1
+contour ba postproc 1
+contour complec 1
+contour contain 1
+contour containm 1
+contour containm condit 1
+contour de 1
+contour de obj 1
+contour defin 1
+contour defin object 1
+contour edg 1
+contour effect 1
+contour extract 1
+contour in adjac 1
+contour in p1 1
+contour is split 1
+contour lin 1
+contour lin definit 1
+contour part 1
+contour point 1
+contour point point 1
+contour polygon 1
+contour segm 1
+contour segm involut 1
+contour shap 1
+contour split 1
+contour to ge 1
+contour var 1
+contour ver 1
+contour wil split 1
+contour with near 1
+contourner 2
+contourner ce 2
+contourner ce probl 2
+contr 9
+contr cop 1
+contr cop de 1
+contr dautr 1
+contr dautr quest 1
+contr dual 1
+contr dual funct 1
+contr el 1
+contr el est 1
+contr etiqu 1
+contr etiqu de 1
+contr lalgorithm 1
+contr lalgorithm du 1
+contr le 3
+contr le courb 1
+contr le de 1
+contr le deux 1
+contr le syst 1
+contr ol 3
+contr ol ar 1
+contr ol au 1
+contr ol avant 1
+contr ol cr 1
+contr ol dan 1
+contr ol de 1
+contr ol devr 1
+contr ol dirig 1
+contr ol doit 1
+contr ol du 1
+contr ol es 1
+contr ol est 2
+contr ol impliqu 1
+contr ol init 1
+contr ol lorsqu 1
+contr ol ou 1
+contr ol par 1
+contr ol perm 1
+contr ol qu 1
+contr ol standard 1
+contr ol sur 1
+contr ol tr 1
+contr ol uc 1
+contr ol uniqu 1
+contr olent 2
+contr olent la 1
+contr olent pa 1
+contr oler 2
+contr oler ce 1
+contr oler la 1
+contr oler leff 1
+contr oler lexpan 1
+contr tr 1
+contr tr cel 1
+contr un tr 1
+contract 22
+contract a red 1
+contract and del 1
+contract and phy 1
+contract da 1
+contract da daah04 1
+contract dabt 1
+contract ea 1
+contract each edg 1
+contract edg 1
+contract f30602 1
+contract junct 1
+contract junct tr 1
+contract law 1
+contract md 1
+contract md972 1
+contract n00014 4
+contract number 4
+contract number daah04 2
+contract number hkust 1
+contract number n00014 1
+contract stc 1
+contract such edg 1
+contract th block 1
+contract th residu 1
+contract th signif 1
+contract tr 1
+contracter 1
+contracter la 1
+contracter la dur 1
+contracter le 1
+contracter le dur 1
+contradict 21
+contradict a constraint 1
+contradict by p1 1
+contradict by p3 1
+contradict lem 1
+contradict part 1
+contradict requir 1
+contradict th assum 7
+contradict th construc 1
+contradict th fact 2
+contradict th induc 1
+contradict th minim 1
+contradict th stat 1
+contradict th strong 1
+contradict th top 1
+contradict that e0i 1
+contradict that pi 1
+contradict that pj 1
+contradict that u0 1
+contradict that uw 1
+contradict theorem 1
+contradictoir 2
+contraign 1
+contraign sur 1
+contraign sur le 1
+contraint 4
+contraint adm 1
+contraint chip 1
+contraint classiqu 1
+contraint classiqu de 1
+contraint concern 1
+contraint concern laffinit 1
+contraint concern un 1
+contraint de 2
+contraint de sym 1
+contraint de typ 1
+contraint du 2
+contraint du typ 2
+contraint dunimodularit 1
+contraint elip 1
+contraint en 1
+contraint en dim 1
+contraint est 2
+contraint est qu 1
+contraint et le 1
+contraint et term 1
+contraint imp 2
+contraint imp ee 2
+contraint inh 1
+contraint inh erent 1
+contraint init 1
+contraint init adm 1
+contraint li 1
+contraint li ee 1
+contraint ne 1
+contraint ne concern 1
+contraint peut 1
+contraint peut se 1
+contraint pr 1
+contraint pr ec 1
+contraint qu 2
+contraint qu cel 1
+contraint qu sajout 1
+contraint redon 1
+contraint redon dan 1
+contraint rest 1
+contraint rest sont 1
+contraint s emantiqu 1
+contraint sembl 1
+contraint sembl etr 1
+contraint similair 1
+contraint similair sur 1
+contraint sont 1
+contraint sont pr 1
+contraint sous 1
+contraint sous la 1
+contraint suppl 1
+contraint suppl ementair 1
+contraint sur 2
+contraint sur domain 1
+contraint sur la 1
+contraint sur le 2
+contraint temporel 1
+contraint temporel pour 1
+contraint v erif 1
+contrair 4
+contrair a la 1
+contrair a lop 1
+contrair de 1
+contrair de drapeaux 1
+contrair de la 1
+contrair dun 1
+contrair dun retour 1
+contrair le 1
+contrair le diff 1
+contrair le risqu 1
+contrair lorsqu 1
+contrair lorsqu le 1
+contrair on choisit 1
+contrair on doit 1
+contrair on pour 1
+contrap 1
+contrast 33
+contrast and reduc 1
+contrast th biolog 1
+contrast th boolean 1
+contrast th expr 1
+contrast th pixel 1
+contrast to async 1
+contrast to cl 1
+contrast to hpf 1
+contrast to int 1
+contrast to sen 1
+contrast to softwar 1
+contrast to tarsk 1
+contrast with autonet 1
+contravar 1
+contravar covar 1
+contravar covar inclus 1
+contrebalanc 1
+contrebalanc pa 1
+contrebalanc pa la 1
+contredit 1
+contredit le 1
+contredit le moy 1
+contrepart 2
+contribu 3
+contribu a rallonger 1
+contribu peu 1
+contribu peu aux 1
+contribut 44
+contribut a la 1
+contribut a sum 1
+contribut ar mad 1
+contribut bj 1
+contribut by edg 1
+contribut de 1
+contribut de la 1
+contribut es 1
+contribut fil 1
+contribut from dr 1
+contribut in var 1
+contribut in writ 1
+contribut inclus 1
+contribut nl 1
+contribut nl dan 1
+contribut of recomb 1
+contribut ont 1
+contribut personnel 1
+contribut signif 3
+contribut to configur 1
+contribut to enabl 1
+contribut to eulisp 1
+contribut to rel 1
+contribut to rmsp 1
+contribut to teach 1
+contribut to theor 1
+contribut to vol 1
+contribut wa motiv 1
+contrit 1
+contriv 1
+control 73
+control a complec 1
+control abort 1
+control addr 1
+control agent 1
+control agentprolog 1
+control agentprolog systemkernelkcmhost 1
+control algorithm 1
+control and comput 2
+control and constraint 1
+control and dep 1
+control and monit 1
+control and oper 1
+control and pipelin 1
+control and prop 1
+control and recov 1
+control and regl 1
+control and robot 1
+control appl 1
+control ba 1
+control bar 1
+control bar elim 1
+control between stat 1
+control button 1
+control by capabil 1
+control by client 1
+control by tim 1
+control by using 1
+control by var 1
+control chang 1
+control character 1
+control coh 1
+control com 1
+control complec 1
+control condit 1
+control condit valu 1
+control cruisest 1
+control cruisest cson 1
+control dat 1
+control dat econom 1
+control del 1
+control del jitter 1
+control dep 4
+control dep an 1
+control dep entir 1
+control dep equiv 1
+control dep graph 1
+control dep inform 1
+control dep reg 1
+control design 1
+control e misrepr 1
+control equ 1
+control ever return 1
+control execut 1
+control experim 2
+control f cl 1
+control flow 7
+control flow approach 1
+control flow ba 1
+control flow graph 1
+control flow instruc 1
+control flow level 1
+control flow lim 1
+control flow mechan 1
+control flow structur 1
+control flow succ 1
+control form 2
+control fram 1
+control fram reus 1
+control giv 1
+control go 1
+control implicit 1
+control implicit rel 1
+control in distribut 2
+control in im 1
+control in mult 1
+control in od 1
+control in prolog 1
+control inform 1
+control interfac 1
+control interfer 1
+control interv 1
+control investig 1
+control is pa 1
+control is perfom 1
+control is return 1
+control is therefor 1
+control is transfer 1
+control it reserv 1
+control it siml 1
+control k loop 1
+control labor 1
+control labor condit 1
+control labor experim 1
+control list 1
+control list contain 1
+control loop 1
+control manager 1
+control mechan 4
+control mechan ch 1
+control model 1
+control model built 1
+control modl 1
+control modl period 1
+control modl run 1
+control norm 1
+control of act 1
+control of aff 1
+control of chang 1
+control of dynam 1
+control of lock 1
+control of mult 1
+control of n1 1
+control oper 2
+control over acc 1
+control over grain 1
+control over inform 1
+control pa 1
+control panel 2
+control parallel 1
+control parameter 2
+control parameter ct 1
+control part 2
+control particl 1
+control path 1
+control path tak 1
+control point 1
+control point shar 1
+control pol 1
+control posit 1
+control posit accord 1
+control posit error 1
+control posit execut 1
+control posit read 1
+control posit repeat 1
+control posit succ 1
+control posit thus 1
+control posit valu 1
+control prefetch 1
+control prefetch strateg 1
+control problem 2
+control procedur 1
+control program 1
+control prompt 1
+control prompt strateg 1
+control protocol 1
+control purp 2
+control reg 1
+control regr 1
+control regr test 1
+control requir 1
+control return 2
+control room 1
+control room computer 1
+control se 1
+control sect 1
+control server 2
+control sign 2
+control siml 1
+control siml built 1
+control simultan 1
+control sit 1
+control st 1
+control stack 1
+control strateg 4
+control strateg design 1
+control structur 4
+control stud 1
+control stud consider 1
+control subcomput 1
+control sur 1
+control sur lespac 1
+control system 6
+control system defin 1
+control system method 1
+control tabl 1
+control task 1
+control techniqu 1
+control th adapt 1
+control th altern 1
+control th commun 1
+control th complec 2
+control th constraint 1
+control th del 1
+control th execut 3
+control th flush 1
+control th gener 1
+control th kcm 1
+control th loc 1
+control th non 1
+control th result 1
+control th search 1
+control th sem 1
+control th sequ 1
+control th simplif 1
+control th singl 1
+control th siz 1
+control th structur 1
+control th system 1
+control th visu 1
+control theor 3
+control theor academ 1
+control thread 2
+control thread abstract 1
+control to ensur 1
+control transfer 1
+control unit 3
+control unit broadcast 1
+control unit driv 1
+control unit receiv 1
+control unit refer 1
+control unit sen 1
+control using 1
+control using modl 1
+control ver 1
+control vi lock 1
+control visu 1
+control visu complec 1
+control window 1
+controlflow 1
+controlflow ba 1
+controlflow ba test 1
+controller 6
+controller ba 1
+controller cruisest 1
+controller cruisest csmaintain 1
+controller cruisest csoff 1
+controller design 1
+controller design proc 1
+controller for saf 1
+controller list 1
+controller oper 1
+controller to rout 1
+controlthread 1
+controver 1
+controver non 1
+controver non monot 1
+contruit 1
+contruit sur 1
+contud 1
+conundr 1
+conundr lead 1
+conv 65
+conv allow 1
+conv alu 1
+conv and boolean 1
+conv and distribut 1
+conv and eff 1
+conv ap. 1
+conv approach 1
+conv ar mad 1
+conv architectur 2
+conv cater 1
+conv comput 1
+conv comput schem 1
+conv datab 1
+conv de 2
+conv de garder 1
+conv de norm 1
+conv de prendr 1
+conv developm 1
+conv developm cycl 1
+conv digit 1
+conv digit mach 1
+conv empl 1
+conv engineer 1
+conv engineer procedur 1
+conv esprit 1
+conv esprit br 1
+conv fetch 1
+conv fetch decod 1
+conv figur 1
+conv for boolean 1
+conv for indirect 1
+conv for maint 1
+conv for publ 1
+conv for specif 1
+conv great 1
+conv great simplif 1
+conv heap 1
+conv hi claim 1
+conv ic 1
+conv ic den 1
+conv impl. 1
+conv ind 1
+conv inform 2
+conv learn 1
+conv learn algorithm 1
+conv learn system 1
+conv li 1
+conv loc 2
+conv loc propag 1
+conv mean 2
+conv multiproc 1
+conv multiproc architectur 1
+conv nous 1
+conv nous supposeron 1
+conv of benchmark 1
+conv of figur 1
+conv of processorcluster 1
+conv of writ 1
+conv oop 1
+conv oop langu 1
+conv or object 1
+conv order 1
+conv order method 1
+conv pack 1
+conv pack network 1
+conv problem 1
+conv proc 1
+conv program 1
+conv program langu 1
+conv prolog 1
+conv prolog using 1
+conv proposit 1
+conv proposit calculus 1
+conv recur 1
+conv recur network 1
+conv refer 1
+conv rel 1
+conv se 1
+conv sign 1
+conv softwar 1
+conv softwar developm 1
+conv spreadsh 1
+conv st 1
+conv st schem 1
+conv stack 1
+conv stack architectur 1
+conv start 1
+conv start point 1
+conv support 1
+conv syntac 1
+conv tag 1
+conv tag tok 1
+conv that hi 1
+conv that variabl 1
+conv that z0 1
+conv their understand 1
+conv to assum 1
+conv to check 1
+conv to encod 1
+conv to repr 2
+conv to rever 1
+conv to specif 1
+conv to think 1
+conv to view 2
+conv tw dim 1
+conv util 1
+conv util ee 1
+conv view 1
+conv visu 1
+conv visu techniqu 1
+conv we assum 1
+conv wisdom 1
+conv wisdom say 1
+convainc 2
+convainc dun 1
+convainc dun syst 1
+convaincr 1
+convaincr facil 1
+convaincu 1
+convaincu qu 1
+convaincu qu prolog 1
+convec 13
+convec a project 1
+convec ain 1
+convec ain qu 1
+convec ar 1
+convec argum 1
+convec au 1
+convec au sen 1
+convec avec 1
+convec bound 1
+convec com 1
+convec com le 1
+convec comb 1
+convec cont 1
+convec d efin 1
+convec de 1
+convec don 1
+convec et approxim 1
+convec et pour 1
+convec etc 1
+convec hl 3
+convec hl determin 1
+convec hl iff 1
+convec hl point 1
+convec hl techniqu 1
+convec polygon 2
+convec polygon reg 1
+convec polyhedr 1
+convec polytop 1
+convec polytop entir 1
+convec pour 1
+convec pour la 1
+convec rest 1
+convec rest hor 1
+convec s 1
+convec se 2
+convec sp 1
+convec sp1000 1
+convec suiv 1
+convec suiv le 1
+convec sur 1
+convec sur chaqu 1
+convec sur lac 1
+convec surfac 1
+convect 1
+convect is model 1
+convect result 1
+conveiv 1
+conveiv to control 1
+convenabl 2
+convenabl a celu 1
+convenabl la 1
+convenabl la transform 1
+conver 50
+conver a lin 1
+conver a matr 1
+conver a pointer 1
+conver a polyhedr 1
+conver a rol 1
+conver a user 1
+conver a.4 1
+conver a.4 cop 1
+conver algorithm 1
+conver algorithm describ 1
+conver algorithm run 1
+conver an 1
+conver and regain 1
+conver automat 1
+conver avant 1
+conver bad 1
+conver bad design 1
+conver be shown 1
+conver between upper 1
+conver cad 1
+conver cad conver 1
+conver compon 1
+conver compon composit 1
+conver condit 1
+conver cop 1
+conver cop doubl 1
+conver dadr 1
+conver dadr virtuel 1
+conver dat 1
+conver en 1
+conver en ba 1
+conver fact 1
+conver guar 1
+conver int claus 1
+conver int inequ 1
+conver int neat 1
+conver integer 1
+conver integer div 1
+conver is ea 1
+conver is symmeter 1
+conver langu 1
+conver langu compreh 1
+conver object 1
+conver object orient 1
+conver of complec 1
+conver of dupl 1
+conver of program 1
+conver oper 1
+conver pattern 1
+conver pattern gener 1
+conver polynom 1
+conver polynom constraint 1
+conver qu 1
+conver qu ja 1
+conver rel 1
+conver rout 1
+conver tak 1
+conver th bsp 1
+conver th constraint 1
+conver th equ 1
+conver th giv 1
+conver th inform 1
+conver th object 1
+conver th program 1
+conver th repl 1
+conver to exact 1
+conver to html 1
+conver to upper 1
+conver to work 1
+conver tripl 1
+conver tripl valu 1
+conver typ 1
+conver typ occup 1
+conver with butler 1
+conver with peter 1
+conver within typ 1
+converg 21
+converg an 1
+converg check 1
+converg check mechan 1
+converg consider 1
+converg criter 1
+converg de 1
+converg de ag 1
+converg de algorithm 1
+converg de lag 1
+converg de lagc 1
+converg de lalgorithm 1
+converg de no 1
+converg dur learn 1
+converg est 1
+converg est tr 1
+converg evid 1
+converg is reach 1
+converg nest 1
+converg nest pa 1
+converg pa 1
+converg pa ver 1
+converg rat 1
+converg theor 1
+converg ver 1
+converg ver loptim 1
+converg ver pi1 1
+converg ver un 1
+converg with prob 1
+converg zer 1
+converg zer finder 1
+converger 1
+converger trop 1
+converger trop rapid 1
+converter 2
+converter funct 1
+converter identif 1
+converter stream 1
+converter stream condit 1
+convexit 1
+convexit e dan 1
+convexit e de 1
+convexit e du 1
+convexit e induit 1
+convexit e peut 1
+convexit e suiv 1
+convexit e tout 1
+convext 1
+convext imag 1
+convext imag bound 1
+convinc 8
+convinc glob 1
+convinc glob credit 1
+convinc th reader 1
+convinc th strongest 1
+conw 3
+conw gam 1
+cook 5
+cook a tempor 1
+cool 4
+cool off hot 1
+cool rat 1
+cool schedl 1
+cool schedl ct 1
+cool tuck 1
+cool tuck algorithm 1
+cool without scram 1
+coop 2
+coop erat 1
+coop erat de 1
+coop erat du 1
+coop erat entr 1
+coop erat par 1
+coop erer 1
+cooper 17
+cooper agr 1
+cooper agr number 1
+cooper and commun 1
+cooper and conflict 1
+cooper behavior 1
+cooper behaviour 1
+cooper developer 1
+cooper fellowship 1
+cooper herskovit 1
+cooper proc 1
+cooper shar 1
+cooper shar workspac 1
+cooper task 2
+cooper task appear 1
+cooper task categor 1
+cooper to find 1
+cooper to solut 1
+cooper when execut 1
+cooper work 1
+cooper work environm 1
+cooperativeagreementnumberdaah0495 1
+coord 14
+coord acoustiqu 1
+coord acoustiqu musiqu 1
+coord an 1
+coord and control 1
+coord from comput 1
+coord in shar 1
+coord inform 1
+coord map 1
+coord measur 1
+coord point 1
+coord reconstruc 1
+coordin 19
+coordin act 1
+coordin belong 1
+coordin but phy 1
+coordin cal 1
+coordin design 1
+coordin fash 1
+coordin parallel 1
+coordin parallel proc 1
+coordin sid 1
+coordin th developm 1
+coordin to reconstruc 1
+coordon 1
+coordon ee 1
+coordon ee de 1
+cop 57
+cop a block 1
+cop a jour 1
+cop a number 1
+cop a pair 1
+cop a.5 1
+cop a.5 doubl 1
+cop act 1
+cop act exp 1
+cop and for 1
+cop and sen 1
+cop and shallow 1
+cop approach 1
+cop ar mad 1
+cop avec 1
+cop back dat 1
+cop back pol 1
+cop bp 1
+cop bp dan 1
+cop character 1
+cop clark 1
+cop clark pittman 1
+cop compat 1
+cop compat avec 1
+cop d epen 1
+cop dautr 1
+cop dautr processeur 1
+cop de 2
+cop de ce 2
+cop de disjonct 1
+cop de don 1
+cop de la 2
+cop de leur 1
+cop de pag 1
+cop de register 1
+cop de segm 1
+cop de structur 1
+cop del 1
+cop del tok 1
+cop delin 1
+cop doubl 1
+cop doubl float 1
+cop du 2
+cop du champ 1
+cop du vecteur 1
+cop dun 1
+cop dun pag 1
+cop e dan 1
+cop each string 1
+cop ec 1
+cop ec de 1
+cop ee 1
+cop ee dan 1
+cop ee de 1
+cop en 1
+cop en lectur 1
+cop env2 1
+cop env2 st 1
+cop es 2
+cop es en 1
+cop es loc 1
+cop est 1
+cop est aus 1
+cop est quel 1
+cop et de 1
+cop et du 1
+cop et en 1
+cop et le 1
+cop eventuel 1
+cop eventuel de 1
+cop execut 1
+cop execut instantan 1
+cop explicit 1
+cop fe 1
+cop from user 1
+cop funct 1
+cop funct cop 1
+cop garb 1
+cop garb collect 1
+cop in ca 1
+cop in order 1
+cop inclus 1
+cop int inl 1
+cop int n2 1
+cop inv 1
+cop inv ou 1
+cop is off 1
+cop is read 1
+cop is upd 1
+cop la 1
+cop la var 1
+cop le 1
+cop le contenu 1
+cop list 1
+cop loc 1
+cop loc de 1
+cop m emoir 1
+cop method 1
+cop multipl 1
+cop multipl en 1
+cop nest 1
+cop network 1
+cop nod 1
+cop of correspon 1
+cop of cover 1
+cop of cp 1
+cop of dat 1
+cop of dest 1
+cop of exp 1
+cop of ph 1
+cop of shar 1
+cop of sl 1
+cop of sn 1
+cop of var 1
+cop oper 1
+cop or reproduc 1
+cop plut 1
+cop plut ot 1
+cop pur 1
+cop pur est 1
+cop qu 1
+cop qu le 1
+cop repl 1
+cop repl method 1
+cop sauf 1
+cop sauf cel 1
+cop se 1
+cop se justif 1
+cop should start 1
+cop st 1
+cop st cont 1
+cop string 1
+cop sur 1
+cop sur la 1
+cop th acquaint 1
+cop th cont 2
+cop th default 1
+cop th pair 1
+cop th ph 1
+cop th upd 1
+cop thr register 1
+cop tr 1
+cop upd 1
+cop upd act 1
+cop upon upd 1
+cop valu 1
+cop variabl 1
+cop when transfer 1
+cop wil remain 1
+cop with ch 1
+cop with incompl 1
+cop with nest 1
+cop with var 1
+cop without paym 1
+copeland 1
+copenhag 2
+copieur 1
+coplanar 1
+coplanar fac 1
+coplanar fac belong 1
+coplanar intersect 1
+coppersmith 1
+coproc 2
+coproc for ai 1
+coproc requir 1
+coproc requir ident 1
+copt 1
+copt optim 1
+copt optim chunk 1
+copt using 1
+copter2 1
+copyright 6
+copyright elsev 1
+copyright if accept 1
+copyright not 1
+coquand 1
+cor 22
+cor act 1
+cor act langu 1
+cor algorithm 1
+cor and control 1
+cor and sop 1
+cor calculus 1
+cor calculus underl 1
+cor cam 1
+cor cam ext 1
+cor cam input 1
+cor cam interpreter 1
+cor cam manipl 1
+cor cam program 1
+cor cam sem 1
+cor cam valu 1
+cor categor 1
+cor categor abstract 1
+cor dam 1
+cor expl 1
+cor expl dam 1
+cor ff 1
+cor in ptim 1
+cor ital 1
+cor langu 1
+cor of level 1
+cor part 1
+cor perform 1
+cor phy 1
+cor phy dam 1
+cor proc 1
+cor program 1
+cor program inform 1
+cor reflect 1
+corecam 1
+corin 1
+corin ancourt 1
+corin ancourt avec 1
+corin ancourt examinatr 1
+corl 1
+corm 4
+corneil 1
+cornel 4
+cornel univer ithac 1
+corner 9
+corner ind 1
+corner ind cel 1
+corner tabl 1
+cornerst 2
+corol 20
+corol 7.1i 1
+corol allow 1
+corol hold 1
+corol hold triv 1
+corol of proposit 1
+corol to theorem 3
+corollair 2
+corollair de 1
+corollair de rest 1
+corollair du 1
+corollair du th 1
+corollair import 1
+corollair import de 1
+corollair int 1
+corollair int er 1
+corollair le 1
+corollair suiv 1
+corout 2
+corout ba 1
+corout ba pseud 1
+coroutin 2
+coroutin ar tak 1
+coroutin arithm 1
+coroutin dan 1
+coroutin dan sicstus 1
+coroutin et de 1
+coroutin et le 1
+coroutin is ba 1
+coroutin mod 1
+coroutin ne 1
+coroutin ne sont 1
+coroutin th implem 1
+corp 5
+corp b de 1
+corp de 2
+corp de ce 1
+corp de chaqu 1
+corp de claus 1
+corp de la 2
+corp de rationnel 1
+corp dun 1
+corp dun boucl 1
+corp est 1
+corp est vid 1
+corpor 22
+corpor bus 1
+corpor bus model 1
+corpor cambridg 1
+corpor cambridg research 1
+corpor cm2 1
+corpor research 1
+corpor tr 1
+corpor tr ha87 1
+corpor user 1
+correct 76
+correct abstract 1
+correct abstract oper 1
+correct abstract prim 1
+correct act 2
+correct act ensur 1
+correct act mov 1
+correct ad 1
+correct ad cod 1
+correct after dec 1
+correct an undec 1
+correct and compl 2
+correct and con 1
+correct and eff 1
+correct and guar 1
+correct and minim 1
+correct and perform 1
+correct and robust 1
+correct answer 4
+correct answer exact 1
+correct approxim 1
+correct ar compl 1
+correct ar giv 1
+correct ba 1
+correct behavior 1
+correct build 1
+correct by cal 1
+correct by ignor 1
+correct c cod 1
+correct calcl 1
+correct child 1
+correct cl 1
+correct classif 1
+correct classif rat 1
+correct cod 1
+correct compon 1
+correct compon composit 1
+correct comput 1
+correct condit 3
+correct criter 1
+correct de 3
+correct de charg 1
+correct de lerreur 1
+correct de lincertitud 1
+correct de syst 1
+correct du 1
+correct du vecteur 1
+correct elect 1
+correct elsewh 1
+correct et eoecac 1
+correct et pr 1
+correct execut 3
+correct execut multiproc 2
+correct execut resum 1
+correct exper 1
+correct explan 1
+correct fact 1
+correct fact structur 1
+correct feed 1
+correct follow 1
+correct for horn 1
+correct for parallel 1
+correct form 1
+correct fragm 1
+correct fragm ident 1
+correct front 1
+correct front en 1
+correct funct 1
+correct gener 1
+correct giv 1
+correct gu 1
+correct gu obtain 1
+correct had writ 1
+correct hard dec 1
+correct identif 2
+correct if 8x 1
+correct implem 2
+correct in log 1
+correct indep 1
+correct inform 2
+correct interior 1
+correct interior point 1
+correct is describ 1
+correct is triv 1
+correct is undec 1
+correct it comput 1
+correct it suff 1
+correct langu 1
+correct langu elect 1
+correct leaf 1
+correct leaf nod 1
+correct lerreur 1
+correct lerreur sur 1
+correct mach 1
+correct maint 1
+correct maint chang 1
+correct me 1
+correct me requir 1
+correct method 2
+correct method1 1
+correct method2 1
+correct model 1
+correct need adjustm 1
+correct nod 1
+correct ob 1
+correct object 1
+correct of bool 1
+correct of boolean 1
+correct of construc 1
+correct of exact 1
+correct of invar 1
+correct of optim 1
+correct of program 2
+correct of r1 1
+correct of smallbur 1
+correct of tisld 1
+correct on inst 1
+correct opt 1
+correct or fault 1
+correct or recomput 1
+correct order 1
+correct output 1
+correct parameter 1
+correct parameter determin 1
+correct parser 1
+correct plac 1
+correct po fault 1
+correct predict 1
+correct prim 1
+correct problem 2
+correct procedur 1
+correct proof 4
+correct proof simpl 1
+correct qu 1
+correct qu sil 1
+correct re init 1
+correct reason 1
+correct reason strateg 1
+correct red 1
+correct red requir 1
+correct reduc 1
+correct refin 1
+correct refin step 1
+correct rout 1
+correct schedl 1
+correct se 1
+correct ser 1
+correct ser mult 1
+correct server 1
+correct solut 2
+correct specif 1
+correct srin 1
+correct start 1
+correct start st 1
+correct syntact 1
+correct syntact form 1
+correct system 1
+correct system proc 1
+correct tag 1
+correct th problem 2
+correct th skew 1
+correct th softwar 1
+correct tim 1
+correct to coupl 1
+correct to say 1
+correct trait 1
+correct trait ee 1
+correct transform 1
+correct und 1
+correct und requir 1
+correct unfold 1
+correct unfortun 1
+correct unfortun mi 1
+correct us 1
+correct valu 3
+correct variabl 1
+correct w.r.t 1
+correct when li 1
+correct with respect 1
+correct without requir 1
+correctlypredict 1
+correctlypredict branch 1
+correctn 1
+correctn proof 1
+correl 15
+correl ar affect 1
+correl between adjac 1
+correl between concept 1
+correl is reflect 1
+correl learn 1
+correl learn architectur 1
+correl matr 1
+correl matr hi 1
+correl no 1
+correl of relev 1
+correl of user 1
+correl rl 1
+correl th relationship 1
+correl to cpu 1
+correl variabl 1
+correl with docum 1
+correl with relev 1
+correpon 1
+correspon 110
+correspon 2d 1
+correspon 2d inter 1
+correspon a chacun 1
+correspon a de 2
+correspon a i1 1
+correspon a la 3
+correspon a ladr 1
+correspon a lappel 1
+correspon a lec 1
+correspon a lensembl 1
+correspon a limpl 1
+correspon a linstruc 1
+correspon a linv 1
+correspon a notr 2
+correspon a substr 1
+correspon a tc 1
+correspon a tout 1
+correspon a un 2
+correspon abstract 1
+correspon abstract oper 1
+correspon abstract sem 1
+correspon acc 1
+correspon acknowledg 1
+correspon acquaint 1
+correspon acquaint var 1
+correspon act 1
+correspon act se 1
+correspon activ 1
+correspon activ rat 1
+correspon agent 1
+correspon algorithm 2
+correspon almost verbatim 1
+correspon alor 1
+correspon alor au 1
+correspon and branch 1
+correspon arg 1
+correspon argum 3
+correspon attribut 1
+correspon au 3
+correspon au ca 1
+correspon au calcl 1
+correspon au co 1
+correspon au corp 1
+correspon au fait 1
+correspon au foncteur 1
+correspon au im 1
+correspon au mod 1
+correspon au nombr 2
+correspon au nouveau 1
+correspon au noyau 1
+correspon au p.p.m.c 1
+correspon au parcour 1
+correspon au point 1
+correspon au prem 1
+correspon au segm 1
+correspon au stock 1
+correspon au taux 1
+correspon au temp 1
+correspon au trait 2
+correspon au transfer 1
+correspon au typ 1
+correspon author 1
+correspon aux 5
+correspon aux ac 1
+correspon aux ca 1
+correspon aux coordon 1
+correspon aux coupl 1
+correspon aux diff 1
+correspon aux hypoth 1
+correspon aux incr 1
+correspon aux mi 1
+correspon aux op 1
+correspon aux point 1
+correspon aux tr 1
+correspon aux transit 1
+correspon aux valeur 1
+correspon aux vecteur 1
+correspon avec 1
+correspon avec le 1
+correspon aver 1
+correspon aver tim 1
+correspon b decomposit 1
+correspon ba 1
+correspon ba level 1
+correspon backlog 1
+correspon backlog br 1
+correspon backtrack 1
+correspon backtrack pointer 1
+correspon bal 1
+correspon bal configur 1
+correspon between amin 1
+correspon between antimatr 1
+correspon between block 1
+correspon between boolean 1
+correspon between bus 1
+correspon between imag 1
+correspon between mint 1
+correspon between observ 1
+correspon between oper 1
+correspon between order 1
+correspon bien 2
+correspon bien au 1
+correspon bien aux 1
+correspon bin 1
+correspon bin tr 1
+correspon black 1
+correspon bulk 1
+correspon bulk read 1
+correspon bundl 1
+correspon bundl belong 1
+correspon bus 1
+correspon bus period 1
+correspon c cod 1
+correspon c mint 1
+correspon canon 1
+correspon canon decomposit 1
+correspon center 1
+correspon cfg 1
+correspon cfg nod 1
+correspon cl 1
+correspon claus 2
+correspon claus remov 1
+correspon cod 1
+correspon column 1
+correspon column ind 1
+correspon commun 1
+correspon commun tim 1
+correspon compon 3
+correspon compon wi 1
+correspon concr 1
+correspon concr oper 1
+correspon condit 1
+correspon condit probabil 1
+correspon contour 1
+correspon coter 1
+correspon counter 1
+correspon d dim 1
+correspon dan 2
+correspon dan la 1
+correspon dan le 1
+correspon de 2
+correspon de la 1
+correspon de limpl 1
+correspon de patron 1
+correspon decr 2
+correspon defin 1
+correspon defin rl 1
+correspon definit 1
+correspon departur 1
+correspon departur tim 1
+correspon deriv 1
+correspon disk 1
+correspon disk pag 1
+correspon docum 1
+correspon donc 1
+correspon du 1
+correspon du point 1
+correspon du term 1
+correspon dynam 1
+correspon dynam error 1
+correspon each member 1
+correspon ec4 1
+correspon edg 2
+correspon edg col. 1
+correspon eff 1
+correspon effectiv 1
+correspon egal 1
+correspon egal au 1
+correspon eigenvect 1
+correspon elimin 1
+correspon enabl 1
+correspon enabl act 1
+correspon entr 3
+correspon entr le 1
+correspon entr zn 1
+correspon est 2
+correspon est direct 1
+correspon est don 1
+correspon est triv 1
+correspon et ain 1
+correspon et de 2
+correspon et la 1
+correspon et le 1
+correspon exact 2
+correspon exact au 1
+correspon expr 1
+correspon fe 1
+correspon fe model 1
+correspon featur 1
+correspon fflq 1
+correspon figur 2
+correspon fluid 1
+correspon fluid server 1
+correspon foc 1
+correspon foc context 1
+correspon forml 1
+correspon funct 1
+correspon funct definit 1
+correspon giv 1
+correspon gr 1
+correspon gr 2d 1
+correspon graph 5
+correspon graph repr 1
+correspon growth 2
+correspon ha 1
+correspon ha diagram 1
+correspon help 1
+correspon host 1
+correspon hpf 1
+correspon hpf ver 1
+correspon identif 1
+correspon implem 1
+correspon in 1
+correspon ind 1
+correspon ind proc 1
+correspon infer 1
+correspon infer rl 1
+correspon init 1
+correspon init method 1
+correspon input 1
+correspon input gener 1
+correspon inst 2
+correspon inst siz 1
+correspon instruc 1
+correspon introspect 1
+correspon introspect funct 1
+correspon is determin 1
+correspon kind 1
+correspon la 1
+correspon la transform 1
+correspon langu 1
+correspon langu antimatr 1
+correspon larg st 1
+correspon larger 2
+correspon larger configur 1
+correspon larger execut 1
+correspon loc 2
+correspon loc cop 1
+correspon mach 2
+correspon mach id 1
+correspon mark 1
+correspon mark yellow 1
+correspon match 1
+correspon match schem 1
+correspon me 2
+correspon me construc 1
+correspon me level 1
+correspon menu 1
+correspon menu item 1
+correspon method 1
+correspon method reappear 1
+correspon mmc 1
+correspon mmc inst 1
+correspon monom 1
+correspon mop 1
+correspon mop fpng 1
+correspon mop satisf 1
+correspon mor remot 1
+correspon mp 1
+correspon mp valu 1
+correspon mult 1
+correspon mult step 1
+correspon multidest 1
+correspon multidest worm 1
+correspon multipl 1
+correspon multipl thread 1
+correspon na 1
+correspon na pa 1
+correspon nappart 1
+correspon nappart pa 1
+correspon nd 1
+correspon nd coter 1
+correspon network 1
+correspon new obtain 1
+correspon nod 3
+correspon nod v1 1
+correspon nod v2 1
+correspon object 2
+correspon object liter 1
+correspon of abstract 1
+correspon op 1
+correspon oper 3
+correspon ordin 1
+correspon ordin boolean 1
+correspon origin 1
+correspon origin weight 1
+correspon orthogon 1
+correspon orthogon polynom 1
+correspon output 2
+correspon pa 1
+correspon pa direct 1
+correspon pair 2
+correspon paper 1
+correspon paper cit 1
+correspon part 1
+correspon peer 1
+correspon peer sink 1
+correspon perform 2
+correspon perform bound 1
+correspon perform number 1
+correspon peut 2
+correspon peut etr 2
+correspon peut seffectuer 1
+correspon peuv 1
+correspon peuv etr 1
+correspon pgp 1
+correspon pgp server 1
+correspon point 1
+correspon pot 1
+correspon pour 1
+correspon pour qu 1
+correspon pr 1
+correspon pr calculus 1
+correspon prec 1
+correspon precc 1
+correspon precc specif 1
+correspon princip 1
+correspon princip block 1
+correspon privileg 1
+correspon prob 1
+correspon prob modif 1
+correspon problem 1
+correspon proc 2
+correspon procedur 1
+correspon program 1
+correspon program compon 1
+correspon prolog 1
+correspon prolog system 1
+correspon prompt 1
+correspon propag 1
+correspon propag graph 1
+correspon qu 1
+correspon qu langu 1
+correspon r tr 1
+correspon rec 1
+correspon rec event 1
+correspon record 1
+correspon reduc 2
+correspon regard 1
+correspon rel 2
+correspon residu 1
+correspon residu vect 1
+correspon respectiv 1
+correspon respectiv aux 1
+correspon rl 1
+correspon rough 1
+correspon router 1
+correspon san passer 1
+correspon se 5
+correspon se differ 1
+correspon sect 2
+correspon self 1
+correspon self modif 1
+correspon sequ 1
+correspon serait 1
+correspon serait plut 1
+correspon simpl 1
+correspon simultan 1
+correspon singl 1
+correspon singl net 1
+correspon slot 1
+correspon slot descript 1
+correspon slot valu 1
+correspon son 1
+correspon son becom 1
+correspon sont 1
+correspon sont don 1
+correspon specif 1
+correspon speedup 1
+correspon srin 1
+correspon start 1
+correspon start vect 1
+correspon stat 1
+correspon string 2
+correspon string block 1
+correspon strok 1
+correspon sub 1
+correspon subexpr 1
+correspon subsect 1
+correspon succ 1
+correspon superobject 1
+correspon syntact 1
+correspon syntact object 1
+correspon t block 1
+correspon test 1
+correspon test hist 1
+correspon th exterior 1
+correspon tim 2
+correspon tim decr 1
+correspon tim specif 1
+correspon timesl 1
+correspon to accept 1
+correspon to ad 1
+correspon to aj 1
+correspon to allow 1
+correspon to ar 1
+correspon to asynchron 1
+correspon to bj 1
+correspon to ca 1
+correspon to claus 1
+correspon to coeff 1
+correspon to common 1
+correspon to complec 1
+correspon to conceptu 1
+correspon to conver 1
+correspon to cur 2
+correspon to dat 1
+correspon to design 1
+correspon to disk 1
+correspon to ec 1
+correspon to edg 1
+correspon to eff 1
+correspon to fal 1
+correspon to ff 1
+correspon to find 1
+correspon to finit 1
+correspon to float 1
+correspon to funct 1
+correspon to further 1
+correspon to giv 1
+correspon to gr 1
+correspon to half 1
+correspon to high 1
+correspon to horn 1
+correspon to increm 1
+correspon to input 1
+correspon to inst 1
+correspon to inter 1
+correspon to mach 2
+correspon to multipl 2
+correspon to n0 1
+correspon to netj 1
+correspon to non 1
+correspon to occam 1
+correspon to oe 1
+correspon to oeab 1
+correspon to oj 1
+correspon to output 1
+correspon to pag 1
+correspon to part 1
+correspon to path 1
+correspon to permut 1
+correspon to posit 2
+correspon to pr 1
+correspon to prim 1
+correspon to proc 1
+correspon to qbfun1 1
+correspon to quantif 1
+correspon to reader 1
+correspon to record 1
+correspon to reg 1
+correspon to rel 1
+correspon to remov 1
+correspon to siml 1
+correspon to spar 1
+correspon to st 1
+correspon to stat 1
+correspon to surfac 2
+correspon to sw 1
+correspon to switch 1
+correspon to text 1
+correspon to tot 1
+correspon to train 1
+correspon to ts 1
+correspon to us 1
+correspon to val 1
+correspon to virtu 1
+correspon to whit 1
+correspon to wormhol 1
+correspon to xi 1
+correspon tool 1
+correspon tout 1
+correspon tout simpl 1
+correspon tr 2
+correspon transform 1
+correspon transform ee 1
+correspon traver 1
+correspon traver trac 1
+correspon un 1
+correspon un instruc 1
+correspon upd 2
+correspon upd funct 1
+correspon url 1
+correspon valu 3
+correspon var 2
+correspon var xi.2 1
+correspon variabl 1
+correspon ver 2
+correspon viewer 1
+correspon voron 1
+correspon voron ver 1
+correspon weight 1
+correspon zon 1
+correspondr 3
+correspondr a cel 1
+correspondr a la 2
+correspondr au 1
+correspondr au point 1
+correspondrait 2
+correspondrait a un 1
+correspondrait un 1
+correspondrait un boucl 1
+corrig 1
+corrig es 1
+corrig es dan 1
+corrigendum 1
+corriger 2
+corriger le 2
+corriger le eff 1
+corriger le estimateur 1
+corrobor 5
+corrobor and conflict 1
+corrobor egal 1
+corrobor egal le 1
+corrobor funct 1
+corrobor funct defin 1
+corrobor funct yield 1
+corrobor or conflict 1
+corrobor th accur 2
+corrobor th intuit 1
+corrobor that return 1
+corrupt 7
+corrupt act 1
+corrupt and unrel 1
+corrupt by check 1
+corrupt by no 1
+corrupt chang 1
+corrupt concur 1
+corrupt detect 1
+corrupt good 1
+corrupt input 1
+corrupt me 1
+corrupt occur 1
+corrupt of act 1
+corrupt our not 1
+corrupt proc 1
+corrupt proc st 1
+corrupt st 1
+corrupt th act 1
+corrupt th auxil 1
+corrupt th st 1
+corrupt val 1
+corrupt val dat 1
+corrupt view 1
+corrupt view suggest 1
+corwin.cc.northeastern.edu 1
+cosm 1
+cosm cub 1
+cosmopolitan 1
+cosmopolitan vernacl 1
+cosnard 2
+cost 60
+cost acr router 1
+cost adv 1
+cost an 1
+cost an appl 1
+cost and commun 3
+cost and decr 2
+cost and nec 1
+cost and rel 1
+cost and tradeoff 1
+cost and transm 1
+cost ar expect 1
+cost ar expr 1
+cost ar measur 1
+cost ar neglig 1
+cost ar subject 1
+cost ar tak 1
+cost as follow 1
+cost as sublin 1
+cost assoc 2
+cost becom 1
+cost block 1
+cost block match 1
+cost bonus 1
+cost by gather 1
+cost by using 1
+cost calcl 1
+cost can reduc 1
+cost cc 1
+cost chang 1
+cost character 2
+cost comparison 2
+cost compon 1
+cost condit 1
+cost consider 1
+cost dijkstr 1
+cost dijkstr spf 1
+cost disjoint 1
+cost disjoint cover 1
+cost divid 1
+cost eff 2
+cost effect 8
+cost effect configur 1
+cost effect manner 1
+cost effect network 1
+cost effect parallel 1
+cost effect system 1
+cost estim 1
+cost etc 2
+cost feedback 1
+cost feedback architectur 1
+cost flow 1
+cost for acc 1
+cost for alloc 1
+cost for configur 1
+cost for execut 1
+cost for maintain 1
+cost for stud 1
+cost for upd 1
+cost from spf 1
+cost funct 7
+cost funct compon 1
+cost funct optim 1
+cost funct return 1
+cost funct term 1
+cost funct thereb 1
+cost funct var 1
+cost in iter 1
+cost in me 1
+cost in term 1
+cost inclus 1
+cost incr 3
+cost incr quick 1
+cost inform 1
+cost inh 1
+cost involut 1
+cost is as 1
+cost is defin 2
+cost is incur 1
+cost is indep 1
+cost is low 2
+cost is paid 1
+cost mak 2
+cost match 2
+cost measur 1
+cost minim 1
+cost model 3
+cost no lic 1
+cost occur 1
+cost of acc 1
+cost of addit 1
+cost of attach 1
+cost of build 1
+cost of cal 1
+cost of commun 2
+cost of comput 1
+cost of correspon 1
+cost of decluster 1
+cost of derefer 1
+cost of detach 1
+cost of developm 1
+cost of earl 1
+cost of fal 1
+cost of find 2
+cost of hb 1
+cost of high 1
+cost of incr 2
+cost of inter 1
+cost of intercompon 1
+cost of keep 1
+cost of link 1
+cost of load 1
+cost of loc 2
+cost of log 1
+cost of maint 1
+cost of maintain 2
+cost of object 1
+cost of perform 3
+cost of pot 1
+cost of prev 1
+cost of proc 1
+cost of reason 1
+cost of receiv 1
+cost of regr 1
+cost of remot 2
+cost of retrief 1
+cost of rout 1
+cost of run 1
+cost of select 1
+cost of selecttest 1
+cost of sen 1
+cost of sequ 1
+cost of softwar 2
+cost of synchron 1
+cost of tempor 1
+cost of upd 1
+cost of upgrad 1
+cost of using 1
+cost of zer 1
+cost on tim 1
+cost oper 2
+cost pair 1
+cost pair ec 1
+cost per pag 1
+cost per rang 1
+cost per wir 2
+cost perform 1
+cost perform fact 1
+cost proport 1
+cost ram 1
+cost rat 1
+cost reduc 1
+cost rel 1
+cost spac 1
+cost t wh 1
+cost tempor 1
+cost tempor atom 1
+cost ten 1
+cost that lrc 1
+cost tim 2
+cost to chang 1
+cost to deliver 1
+cost to program 1
+cost tok 1
+cost tradeoff 1
+cost under load 1
+cost upd 1
+cost upd period 1
+cost using 1
+cost using dijkstr 1
+cost usu reflect 1
+cost valu 1
+cost var 1
+cost which dep 1
+cost with cluster 1
+cost worth 2
+costeffect 1
+costeffect configur 1
+costeffect design 1
+costl 3
+costl system 2
+costl to impl 1
+costliest 1
+costliest step 1
+coter 1
+coter and boolean 1
+coter by using 1
+coter c domin 1
+coter domin 1
+coter is non 1
+coter join 1
+coter join algorithm 1
+coter with maxim 1
+cotid 1
+cotid encontrad 1
+cottrel 2
+cou 2
+cou de 1
+cou de claus 1
+cou de la 1
+cou de tout 1
+cou es 1
+cou es ca.txt 1
+cou90a 1
+cou90b 1
+cou93 1
+cou95 1
+couch 1
+couch and andr 1
+couch model 1
+couler 1
+couler beaucoup 1
+couler beaucoup dencr 1
+council 16
+council canad 1
+council canad ottaw 1
+council in franc 1
+council in german 1
+council in spain 1
+council of canad 4
+council under contract 1
+council under grant 1
+count 41
+count 1d 2
+count 1d internetb 2
+count 1d internetw 2
+count al 1
+count algorithm 1
+count and jump 1
+count and upd 1
+count by construc 1
+count commun 1
+count commun indiffer 1
+count cou 1
+count cou es 1
+count dim 1
+count el 1
+count field 2
+count heap 1
+count in cholesk 1
+count infinit 3
+count infinit cart 1
+count infinit dim 1
+count infinit number 1
+count infinit se 2
+count input 1
+count input output 1
+count is decrem 1
+count lat 1
+count mac 1
+count multipl 1
+count numar 1
+count of el 1
+count of maryland 1
+count onl disjunct 1
+count or californ 1
+count over amd 1
+count receiv 1
+count se 2
+count subtr 1
+count th buffer 1
+count th number 7
+count th plac 1
+count th tot 2
+count to wgp 1
+count tw 2
+count using 1
+count valu 1
+count valu assoc 1
+count valu becom 1
+count whil propag 1
+countc 1
+countc and init 1
+countc lj 1
+counter 16
+counter and return 1
+counter becom 1
+counter becom zer 1
+counter by del 1
+counter correspon 1
+counter cp 1
+counter field 1
+counter field track 1
+counter is decrem 1
+counter is increm 2
+counter kg 1
+counter length 1
+counter per fram 1
+counter reach 1
+counter reach zer 1
+counter respon 1
+counter st 1
+counter st measspeed 1
+counter tempor 1
+counter tempor plur 1
+counter tempor struc 1
+counter timer 1
+counter timer period 1
+counter timer valu 1
+counter to point 1
+counter tsp 1
+counter valu 2
+counter when look 1
+counterexampl 2
+counterkg 1
+countermand 1
+countermand al indirect 1
+countermand certain indirect 1
+countermand in inver 1
+countermand prob 1
+countermand prob modif 1
+countermand th modif 1
+counterpart 11
+counterpart defin 1
+counterpart du 1
+counterpart for fo 1
+counterpart hav larger 1
+counterpart in cam 1
+counterpart in main0 1
+counterpart in sy0 1
+counterpart of slot 1
+counterpart of theorem 1
+counterpart to gener 1
+counterpropag 1
+counterpropag and competit 1
+countm 1
+countperiod 1
+countr 3
+countr and cultur 1
+countr hav at 1
+countr of origin 1
+countr order 1
+countr proper 1
+countr proper order 1
+countr regl 1
+countr regl us 1
+countr to countr 1
+countr with simil 1
+countv 1
+coup 5
+coup a traver 1
+coup ch 1
+coup de 2
+coup de ce 1
+coup de feutr 1
+coup e ou 1
+coup e sont 1
+coup init 1
+coup init du 1
+coup lit 1
+coup lit ral 1
+coup par 1
+coup par el 1
+couper 2
+couper de 1
+couper de point 1
+couper le 1
+couper le incr 1
+couper lespac 1
+coupl 25
+coupl ain 1
+coupl and henc 1
+coupl architectur 1
+coupl chinebr 1
+coupl chinebr esil 1
+coupl de 3
+coupl de comp 1
+coupl de congru 1
+coupl de contraint 1
+coupl de observ 1
+coupl dent 1
+coupl dent dabsc 1
+coupl dindividus 1
+coupl dindividus parent 1
+coupl distinct 1
+coupl distinct de 1
+coupl dit 1
+coupl dit erat 1
+coupl ec 1
+coupl ee 2
+coupl ee avec 1
+coupl ee si 1
+coupl facil 1
+coupl form 1
+coupl it respon 1
+coupl m emoir 1
+coupl mult 1
+coupl mult system 1
+coupl multiproc 3
+coupl multiproc system 1
+coupl of approach 1
+coupl of dual 1
+coupl of match 1
+coupl of pl 1
+coupl of prompt 1
+coupl of reason 1
+coupl of rel 1
+coupl per cent 1
+coupl processeur 1
+coupl rol 1
+coupl th comput 1
+coupl than singl 1
+coupl through funct 1
+coupl with dlb 1
+coupl with dynam 1
+coupl with hem 1
+coupl with syntact 1
+coupur 3
+coupur a lav 1
+coupur a lentr 1
+coupur a linconv 1
+coupur a notr 1
+coupur a port 1
+coupur a pour 1
+coupur afin 1
+coupur afin qu 1
+coupur appar 1
+coupur appar dan 1
+coupur apr 1
+coupur apr es 1
+coupur au 1
+coupur au cou 1
+coupur au niveau 1
+coupur au sein 1
+coupur au sous 1
+coupur aurait 1
+coupur aurait pour 1
+coupur avec 1
+coupur calcl 1
+coupur claus 1
+coupur claus par 1
+coupur com 1
+coupur com sil 1
+coupur correspon 1
+coupur correspon au 1
+coupur coupur 1
+coupur couvr 1
+coupur couvr la 1
+coupur d ed 1
+coupur d epen 1
+coupur dan 1
+coupur dan la 1
+coupur dan le 1
+coupur de 3
+coupur de la 1
+coupur de larithm 1
+coupur de point 1
+coupur de sa 1
+coupur dev 1
+coupur dev part 1
+coupur doit 1
+coupur doit etr 1
+coupur douc 1
+coupur du 1
+coupur du pr 1
+coupur en 1
+coupur en cou 1
+coupur entr 1
+coupur entr point 1
+coupur est 1
+coupur est alor 1
+coupur est dan 1
+coupur est direct 1
+coupur est don 1
+coupur est donc 1
+coupur est en 1
+coupur est equiv 1
+coupur est evit 1
+coupur est loc 1
+coupur est probl 1
+coupur est profon 1
+coupur est sauvegard 1
+coupur est syst 1
+coupur est toutef 1
+coupur est tranform 1
+coupur est transform 1
+coupur est un 1
+coupur est util 1
+coupur et ceux 1
+coupur et de 1
+coupur et gest 1
+coupur et la 1
+coupur et le 1
+coupur et ne 1
+coupur et pa 1
+coupur et qu 1
+coupur exclu 1
+coupur exotiqu 1
+coupur facil 1
+coupur facil la 1
+coupur glob 1
+coupur glob de 1
+coupur glob na 1
+coupur hypoth 1
+coupur hypoth etiqu 1
+coupur jou 1
+coupur jusquau 1
+coupur jusquau moment 1
+coupur la 1
+coupur la valeur 1
+coupur le 1
+coupur loc 1
+coupur loc appar 1
+coupur loc introduit 1
+coupur loc ne 1
+coupur loc nest 1
+coupur loc par 1
+coupur loc se 1
+coupur loc sont 1
+coupur loc supprim 1
+coupur m em 1
+coupur multipl 1
+coupur multipl au 1
+coupur na 1
+coupur na pa 1
+coupur nest 1
+coupur nest cr 1
+coupur nest jam 1
+coupur nest sauvegard 1
+coupur nutil 1
+coupur nutil pa 1
+coupur ont 1
+coupur ou 1
+coupur ou dun 1
+coupur par 1
+coupur par transform 1
+coupur perm 1
+coupur perm de 1
+coupur peut 1
+coupur peut alor 1
+coupur peut correspondr 1
+coupur peut etr 1
+coupur peuv 1
+coupur peuv etr 1
+coupur plus sophistiqu 1
+coupur point 1
+coupur point de 1
+coupur pr 1
+coupur pr edicat 1
+coupur pr esent 1
+coupur primitif 1
+coupur primitif de 1
+coupur profon 1
+coupur profon est 1
+coupur profon non 1
+coupur profon termin 1
+coupur propr 1
+coupur propr dit 1
+coupur qu 1
+coupur qu lor 1
+coupur qu ont 1
+coupur qu traver 1
+coupur ren 1
+coupur ren inaccessibl 1
+coupur ren inconditionnel 1
+coupur s elect 1
+coupur s electif 1
+coupur s electiv 1
+coupur san drapeau 1
+coupur soit 1
+coupur soit correct 1
+coupur stan. 1
+coupur standard 1
+coupur standard au 1
+coupur standard ba 1
+coupur standard dan 1
+coupur standard en 1
+coupur standard le 1
+coupur standard lim 1
+coupur standard lorsqu 1
+coupur standard ne 1
+coupur suiv 1
+coupur superficiel 1
+coupur superficiel est 1
+coupur superficiel ou 1
+coupur superficiel requ 1
+coupur supprim 1
+coupur supprim le 1
+coupur sur 1
+coupur sur la 1
+coupur tant 1
+coupur tant dan 1
+coupur termin 1
+coupur va 1
+coupur va avoir 1
+coupur voir 1
+coupur voir sect 1
+coupur vont 1
+coupur vont ain 1
+cour 46
+cour a chaqu 1
+cour a dep 2
+cour a la 1
+cour a locc 1
+cour a partir 1
+cour a sa 1
+cour acr wid 1
+cour and project 1
+cour b ni 1
+cour backtrack 1
+cour backtrack point 1
+cour backtrack program 1
+cour be combin 1
+cour com 1
+cour com etant 1
+cour compr 1
+cour correspon 1
+cour dan 1
+cour dan la 1
+cour dan le 1
+cour dan un 1
+cour de 5
+cour de ce 1
+cour de la 2
+cour de lec 2
+cour de lecol 1
+cour de mal 1
+cour de mi 1
+cour de siml 1
+cour de tr 1
+cour de variabl 1
+cour du 2
+cour du calcl 1
+cour du compteur 1
+cour du program 1
+cour du temp 1
+cour dun 2
+cour dun dur 1
+cour dun ex 1
+cour dun var 1
+cour ear re 1
+cour en 1
+cour en sauvegard 1
+cour est 2
+cour est ain 1
+cour est aus 1
+cour est connu 1
+cour est en 1
+cour est init 1
+cour est le 1
+cour est toujour 1
+cour est unif 1
+cour est vid 1
+cour est virtuel 1
+cour et ai 1
+cour et de 1
+cour et donc 1
+cour et du 1
+cour et fcp 1
+cour et le 1
+cour et mi 1
+cour et na 1
+cour et seq 1
+cour et un 1
+cour font 2
+cour font part 1
+cour font refer 1
+cour institut 2
+cour interest 1
+cour is zer 1
+cour la 1
+cour la repr 1
+cour last environm 1
+cour lectur 1
+cour lectur retard 1
+cour mater 1
+cour multip 1
+cour na 1
+cour nest 1
+cour nest pa 1
+cour not 2
+cour not satisf 1
+cour occup 1
+cour occup un 1
+cour other cl 1
+cour par 1
+cour par linstruc 1
+cour par linterm 1
+cour perm 1
+cour perm deffectuer 1
+cour peut 1
+cour peut etr 1
+cour peuv 1
+cour peuv etr 1
+cour peuv se 1
+cour pour 1
+cour pour savoir 1
+cour probl 1
+cour probl ematiqu 1
+cour qu 1
+cour qu lon 1
+cour r esolu 1
+cour r point 1
+cour rel 1
+cour requ 1
+cour requ ensuit 1
+cour result 1
+cour se 1
+cour se font 1
+cour somehow 1
+cour somehow requir 1
+cour t som 1
+cour tb 1
+cour th cand 1
+cour to non 1
+cour using 1
+cour using isvl 1
+cour wh 1
+cour wh teach 1
+cour which go 1
+cour workbook 1
+cour xn 1
+cour3 1
+couram 2
+couram appel 1
+couram appel ee 1
+couram elit 1
+couram empl 1
+couram empl ee 1
+couram par 1
+couram par la 1
+couram util 1
+couram util ee 1
+courb 2
+courb avec 1
+courb avec quatr 1
+courb de 1
+courb de droit 1
+courb de perform 1
+courb de speed 1
+courb et de 1
+courb et le 1
+courb et surfac 1
+courb illustr 1
+courb illustr egal 1
+courb inf 1
+courb inf erieur 1
+courb int 1
+courb int gral 1
+courb montr 1
+courb montr bien 1
+courb montr qu 1
+courb ou 1
+courb ou de 1
+courb peuv 1
+courb peuv rel 1
+courb qu 1
+courb qu la 1
+courb repr 1
+courb repr sent 1
+courb sem 1
+courb sem logaritmiqu 1
+courb sup 1
+courb sup erieur 1
+courbur 1
+courbur n gat 1
+courcel 1
+courcoub 1
+courir 1
+courir le 1
+courir le risqu 1
+court 6
+court circuit 1
+court circuit anticip 1
+court circuit comprim 1
+court circuit de 1
+court circuit ee 1
+court circuit est 1
+court circuit inclus 1
+court circuit ne 1
+court circuit nest 1
+court circuit ou 1
+court circuit supprim 1
+court circuiter 1
+court circuiter lanc 1
+court de 1
+court de requ 1
+court e1 1
+court e1 e2 1
+court est 1
+court est de 1
+court et const 1
+court etant 1
+court etant allou 1
+court longueur 1
+court longueur de 1
+court of av 1
+court of pr 1
+court qu 2
+court qu la 1
+court qu le 1
+courtcircuit 1
+courtcircuit anticip 1
+cousineau 1
+cousot 1
+couteux 1
+couteux sil 1
+couteux sil est 1
+couver 1
+couver le 1
+couver le tr 1
+couver qu 1
+couver qu quelqu 1
+couvr 2
+couvr de 2
+couvr de domain 1
+couvr de techniqu 1
+couvr donc 1
+couvr la 1
+couvr la majeur 1
+couvr typiqu 1
+couvr typiqu la 1
+couvrir 1
+cov 1
+cov structur 1
+covar 2
+covar du 1
+covar du vecteur 1
+covar ii 1
+covar inclus 1
+covar ind 1
+covar ind pen 1
+covar matr 1
+covar sym 1
+covar sym triqu 1
+coventr 1
+coventr cv4 1
+coventr cv4 7al 1
+cover 41
+cover a se 2
+cover a simpl 1
+cover a tot 1
+cover achief 1
+cover ai 1
+cover al rectangl 1
+cover and differ 1
+cover and j.a 1
+cover and threshold 1
+cover attain 1
+cover ba 1
+cover ba select 1
+cover broad 1
+cover broad ar 1
+cover by ext 1
+cover by neighbor 1
+cover by repl 1
+cover by typ 1
+cover by win 1
+cover cach 1
+cover center 1
+cover claus 1
+cover compon 1
+cover concept 1
+cover consider 1
+cover contextu 1
+cover contextu aspect 1
+cover criter 1
+cover criter ba 1
+cover each edg 1
+cover follow 1
+cover for string 1
+cover funct 1
+cover graph 1
+cover hart 1
+cover hi 1
+cover hi fcover 1
+cover identif 1
+cover identif problem 1
+cover interv 1
+cover learn 1
+cover loc 2
+cover loc propag 1
+cover loc spac 1
+cover modif 1
+cover modif cod 1
+cover modif compon 1
+cover modl 1
+cover nod 1
+cover nod appear 1
+cover nod stem 1
+cover nod v1 1
+cover of awerbuch 1
+cover of u.1 1
+cover of ver 1
+cover rel 1
+cover standard 1
+cover standard matr 1
+cover subsequ 1
+cover th argum 1
+cover th ca 1
+cover th denot 1
+cover th destin 1
+cover th dr 1
+cover th gener 1
+cover th issu 1
+cover th modif 1
+cover th po 1
+cover th remain 1
+cover th repr 1
+cover th situ 1
+cover tw virtu 1
+cover typ 1
+cover typ inclus 1
+cover u1 1
+cover unit 1
+cover using 2
+cover using nit 1
+cover with surfac 1
+cover x1 1
+cover xj 1
+covingt 1
+cow 1
+cowan 1
+cowb 1
+cowb and hor 1
+cowb saddl 1
+cowel 1
+cox 3
+cox and ashwin 1
+cox cc.gatech.edu 1
+cox matur 1
+cox matur ind 1
+coyn 1
+cp 9
+cp a sa 1
+cp ac 1
+cp and ph 1
+cp ar shown 1
+cp can chang 1
+cp cp 1
+cp cp tail 1
+cp dispar 1
+cp doit 1
+cp doit aus 1
+cp environ 1
+cp environ cour 1
+cp et environ 1
+cp et na 1
+cp is bound 1
+cp jusqu 1
+cp length 1
+cp nod 1
+cp p tail 1
+cp pour 1
+cp pour acc 1
+cp prov 1
+cp pu 1
+cp pu etr 1
+cp repr 1
+cp se 1
+cp se trouv 1
+cp sont 1
+cp sont cop 1
+cp sur 1
+cp sur la 1
+cp tail 1
+cp tail instruc 1
+cp.in 1
+cp84 1
+cp93 1
+cp94 1
+cp95 1
+cp96 1
+cpl 1
+cpl of c32 1
+cpl of object 1
+cpn 1
+cpn ar mark 1
+cpn ar shown 1
+cpn dom 1
+cpn dom list 1
+cpn is consider 1
+cpn must occup 1
+cpu 16
+cpu cach 1
+cpu cach con 1
+cpu can perform 1
+cpu cap 1
+cpu cnt 1
+cpu cost 1
+cpu cpu 2
+cpu cpu cpu 1
+cpu cpu mmu 1
+cpu cpu pag 1
+cpu from acc 1
+cpu hardwar 1
+cpu hardwar support 1
+cpu hour 1
+cpu int 1
+cpu int serv 1
+cpu load 1
+cpu mmu 1
+cpu mmu mmu 1
+cpu overhead 1
+cpu pag 1
+cpu pag 1pag 1
+cpu proc 1
+cpu proc tim 1
+cpu quantum 1
+cpu queu 1
+cpu queu del 1
+cpu rat 1
+cpu requir 1
+cpu requir incr 1
+cpu se 1
+cpu sec 1
+cpu secon 1
+cpu tak 1
+cpu tim 8
+cpu tim growth 1
+cpu tim imp 1
+cpu tim measur 2
+cpu tim requir 1
+cpu tim surfac 1
+cpu to simultan 1
+cpu usag 1
+cpu valu 1
+cpu wa implem 1
+cpucnt 1
+cpuinterfac 1
+cpummucach 1
+cpummucach cpummucach 1
+cpummucach cpummucachecachemmucpu 1
+cpummucach cpummucachecachemmucpu cachemmucpu 1
+cpummucachecachemmucpu 1
+cpummucachecachemmucpu cachemmucpu 1
+cpur 1
+cpus 4
+cpus mpl 1
+cpusec 1
+cputim 1
+cq 1
+cql 1
+cql by combin 1
+cql datab 1
+cql datab framework 1
+cql design 1
+cql design principl 1
+cql evalu 1
+cql evalu strateg 1
+cql framework 1
+cql is ba 1
+cql se 1
+cql to describ 1
+cql with den 1
+cql with low 1
+cr 82
+cr a bar 1
+cr a bin 1
+cr a block 1
+cr a caus 1
+cr a construc 1
+cr a csg 1
+cr a fam 1
+cr a fil 1
+cr a fin 1
+cr a foc 1
+cr a fram 1
+cr a funct 1
+cr a grow 1
+cr a meter 1
+cr a mut 1
+cr a nam 1
+cr a non 1
+cr a number 1
+cr a pack 1
+cr a path 1
+cr a produc 1
+cr a profil 1
+cr a program 1
+cr a prolifer 1
+cr a record 1
+cr a satisfact 1
+cr a se 1
+cr a sen 1
+cr a son 1
+cr a st 1
+cr a thin 1
+cr a transit 1
+cr a tripl 1
+cr a unar 1
+cr a vect 1
+cr abstract 1
+cr act 1
+cr act sequ 1
+cr act subsequ 1
+cr ad 1
+cr ad cpu 1
+cr addit 1
+cr addit bind 1
+cr ae 1
+cr ae air 1
+cr an accur 1
+cr an anonym 1
+cr an assoc 1
+cr an empt 1
+cr an evalu 1
+cr an exterior 1
+cr an extr 1
+cr an immut 1
+cr an indep 1
+cr an inst 3
+cr an integr 1
+cr an interm 1
+cr an intern 1
+cr an object 2
+cr and acc 1
+cr and del 1
+cr and incorpor 1
+cr and init 1
+cr and initializ 1
+cr and po 1
+cr and return 1
+cr and start 1
+cr any requir 1
+cr approach 1
+cr ation 1
+cr ation datl 1
+cr ation dun 1
+cr avec 2
+cr avec la 1
+cr avec le 1
+cr b rep 1
+cr both stat 1
+cr categor 1
+cr cfg 1
+cr classif 1
+cr classif using 1
+cr classiqu 1
+cr classiqu qu 1
+cr coar 1
+cr coar graph 1
+cr compl 1
+cr connect 2
+cr connect e0i 1
+cr connect interfer 1
+cr connect start 1
+cr constitu 1
+cr constitu un 1
+cr control 1
+cr control flow 1
+cr correl 1
+cr cr 1
+cr cr decr1 1
+cr dan 1
+cr dan le 1
+cr de 3
+cr de deux 1
+cr de ind 1
+cr de la 1
+cr de pil 1
+cr decr1 1
+cr design 1
+cr design docum 1
+cr dibl 1
+cr dibl en 1
+cr direct 2
+cr direct mut 1
+cr dit 1
+cr dit loc 1
+cr dupl 1
+cr e ee 1
+cr e es 1
+cr eant 1
+cr eant ain 1
+cr eant de 1
+cr eat 3
+cr eat anticip 1
+cr eat de 3
+cr eat denviron 1
+cr eat dinstruc 1
+cr eat du 1
+cr eat dun 2
+cr eat dynamiqu 1
+cr eat eventuel 1
+cr eat instantan 1
+cr eat pr 1
+cr eat retard 1
+cr eat soit 1
+cr ee 3
+cr ee de 3
+cr ee ensuit 1
+cr ee habituel 1
+cr ee le 1
+cr ee pa 1
+cr ee un 1
+cr eent 1
+cr eent pa 1
+cr eent un 1
+cr eer 3
+cr eer aucun 1
+cr eer de 1
+cr eer denviron 1
+cr eer deux 1
+cr eer le 1
+cr eer lenviron 1
+cr eer point 1
+cr eer un 2
+cr eerait 1
+cr eerait en 1
+cr eerait un 1
+cr er 1
+cr est 1
+cr est alor 1
+cr est au 1
+cr est proch 1
+cr est suff 1
+cr est tir 1
+cr et dautr 1
+cr et de 1
+cr et la 1
+cr et mut 1
+cr etant 1
+cr etant appliqu 1
+cr extran 1
+cr extran fac 1
+cr extran triangl 1
+cr fortran 1
+cr g en 1
+cr glob 1
+cr glob ou 1
+cr glob produit 1
+cr inst 2
+cr instruc 1
+cr is greater 1
+cr issu 1
+cr issu dun 1
+cr it compl 1
+cr it exponentiel 1
+cr it midpoint 1
+cr it parent 1
+cr l datab 1
+cr la 1
+cr la tail 1
+cr larg scal 1
+cr lin 1
+cr lin correl 1
+cr liver.bup 1
+cr liver.bup pim 1
+cr loc 1
+cr loc qu 1
+cr loc seffectu 1
+cr m eff 1
+cr mobj 1
+cr modif 1
+cr modif ver 1
+cr modl 1
+cr modl system 1
+cr mor act 1
+cr mor fac 1
+cr mor unit 1
+cr mp 1
+cr mp system 1
+cr mult 1
+cr mult sit 1
+cr my group 1
+cr ne 1
+cr ne modif 1
+cr new candid 1
+cr no ec 1
+cr nod 1
+cr nod bound 1
+cr nonzer 1
+cr nonzer entr 1
+cr object 1
+cr object bound 1
+cr of architectur 1
+cr of comput 1
+cr of cooper 1
+cr of hot 1
+cr of knowledg 1
+cr of me 1
+cr opt 1
+cr optim 1
+cr optim de 1
+cr or reconfigur 1
+cr other object 1
+cr ou 1
+cr ou de 1
+cr over point 1
+cr part 1
+cr partit 1
+cr partit bound 1
+cr pc 1
+cr perm 1
+cr perm de 1
+cr peut 1
+cr peut etr 1
+cr phy 1
+cr phy addr 1
+cr point 3
+cr pour 1
+cr pour obtenir 1
+cr pourt 1
+cr pourt bien 1
+cr prendr 1
+cr prendr dan 1
+cr prior 1
+cr prior group 1
+cr procedur 1
+cr procedur cal 1
+cr produc 2
+cr protein 1
+cr push 1
+cr qu 1
+cr qu nous 1
+cr reasearch 3
+cr reasearch inc 3
+cr refer 3
+cr refer browser 1
+cr reg 1
+cr relativ 1
+cr repr 1
+cr repr esent 1
+cr research 5
+cr research gmbh 1
+cr research inc 1
+cr research ma 1
+cr research t3d 1
+cr rest 1
+cr s s1 1
+cr scal 1
+cr scal vot 1
+cr se 1
+cr sect 4
+cr sect bandwdith 1
+cr sect bandwidth 1
+cr sect con 1
+cr sect dist 1
+cr sect imag 1
+cr sect yield 1
+cr simpl 1
+cr sp 1
+cr sp ec 1
+cr step 1
+cr stop 1
+cr stop dar 1
+cr strength 1
+cr such mater 1
+cr t habituel 1
+cr t lin 1
+cr t ni 1
+cr t qu 1
+cr t strict 1
+cr t3d 8
+cr t3d commun 1
+cr t3d system 4
+cr t3d using 1
+cr t3e 2
+cr th answer 1
+cr th cfg 1
+cr th cop 1
+cr th cur 1
+cr th edg 1
+cr th entir 1
+cr th fram 1
+cr th init 1
+cr th inter 1
+cr th rec 1
+cr th reflect 1
+cr th surfac 1
+cr th tr 1
+cr th univer 1
+cr therefor 1
+cr thr constraint 1
+cr thr fact 1
+cr thr se 1
+cr tim 1
+cr tr 2
+cr tr avec 1
+cr tr dan 1
+cr tr la 1
+cr tw challeng 1
+cr tw unar 1
+cr understand 1
+cr uniform 1
+cr uniform chaqu 1
+cr uniform correspon 1
+cr uniform qu 1
+cr unsaf 1
+cr unsaf program 1
+cr unsatisf 1
+cr unsatisf forml 1
+cr us 1
+cr us self 1
+cr val 1
+cr val gener 1
+cr var 1
+cr var saf 1
+cr wysiwyg 1
+cr wysiwyg transl 1
+cr.2 1
+cr.2 moreover 1
+cr90 1
+cr93 1
+cradl 1
+cradl to grav 1
+craft 3
+craft a soph 1
+craft model 1
+craft of prolog 1
+craig 6
+craig brockschmidt 1
+craig brockschmidt def 1
+craig chamber 2
+craig johnson 1
+cram 1
+cramer 1
+cramer rl 1
+crash 7
+crash and client 1
+crash and crash 1
+crash and link 1
+crash at tc 1
+crash at tim 1
+crash can occur 1
+crash dur recov 1
+crash failur 2
+crash failur outlin 1
+crash failur pr 1
+crash failur protocol 1
+crash failur requir 1
+crash if backtrack 1
+crash init 1
+crash interrupt 1
+crash interrupt recov 1
+crash is ind 1
+crash link 1
+crash link failur 1
+crash link protocol 1
+crash may inclus 1
+crash occur 1
+crash of p1 1
+crash recov 1
+crash until tc 1
+crash wil caus 1
+crash without report 1
+crcc 1
+crcw 2
+crcw pram 2
+crcw pram respect 1
+crcwpram 1
+crcwpram model 1
+creat 50
+creat a child 1
+creat a level 1
+creat a link 1
+creat a shar 1
+creat a suff 1
+creat and activ 1
+creat and half 1
+creat and init 1
+creat and maintain 1
+creat as follow 1
+creat automat 1
+creat bump 1
+creat by ap 1
+creat by cal 1
+creat by correctlypredict 1
+creat by defloc 1
+creat by defvar 1
+creat by dep 1
+creat by dpl 1
+creat by dynam 1
+creat by incorrect 1
+creat by inherit 1
+creat by lambd 1
+creat by prim 1
+creat by random 1
+creat by se 1
+creat by simp 1
+creat cal 1
+creat cal mak 1
+creat ch 1
+creat ch point 1
+creat chunk 1
+creat dat 1
+creat dat loc 1
+creat desc 1
+creat dur unif 1
+creat dynam 1
+creat dynam accord 1
+creat ea 1
+creat either manu 1
+creat el 1
+creat el ti 1
+creat exact 1
+creat fault 1
+creat fault ver 1
+creat for currnod 1
+creat for reduc 1
+creat gener 1
+creat gener funct 1
+creat in eulisp 1
+creat in fac 1
+creat in tdbm 1
+creat intern 1
+creat intern appl 1
+creat larg test 1
+creat manu 1
+creat might look 1
+creat model 1
+creat nod 2
+creat object 1
+creat parent 1
+creat parent nod 1
+creat program 1
+creat prov 1
+creat rol 1
+creat sem 1
+creat sem link 1
+creat sever bind 1
+creat slot 1
+creat slot descript 1
+creat som rout 1
+creat st 1
+creat st remain 1
+creat start 1
+creat start thread 1
+creat task 1
+creat test 1
+creat test pool 1
+creat th altern 1
+creat th beaut 1
+creat th bind 1
+creat th circuit 1
+creat th environm 1
+creat th experim 1
+creat th hist 1
+creat th shar 1
+creat th virtu 1
+creat to describ 1
+creat to ind 1
+creat to overcom 1
+creat to repr 1
+creat to test 1
+creat tr 1
+creat tr structur 1
+creat typ 1
+creat typ task 1
+creat using 1
+creat valu 1
+creat vect 1
+creat with jpdraw 1
+credit 5
+credit alloc 1
+credit assignm 1
+credit assignm problem 1
+credit assignm strateg 1
+credit debit 1
+credit transact 1
+creep 1
+cref 1
+crest 1
+crest lin 1
+crest lin extract 1
+creus 1
+creus sur 1
+creus sur un 1
+crew 1
+crew pram 1
+crib 1
+crimson 1
+crin 1
+crir 1
+crir la 1
+crir la fonct 1
+crisp 1
+crisp defin 1
+crisp defin bound 1
+crit 35
+crit appl 3
+crit appl ar 1
+crit ca 1
+crit differ 1
+crit er 3
+crit er ci 1
+crit er habituel 1
+crit er pr 2
+crit er simpl 1
+crit er tel 1
+crit er th 1
+crit er util 1
+crit execut 1
+crit execut path 1
+crit fact 1
+crit ff 1
+crit filter 1
+crit for integr 1
+crit for load 1
+crit in determin 2
+crit issu 1
+crit led 1
+crit ma 1
+crit observ 1
+crit of lin 1
+crit path 2
+crit path nod 1
+crit period 1
+crit period cost 1
+crit ph 1
+crit ph cost 1
+crit problem 1
+crit problem fac 1
+crit re 1
+crit re de 1
+crit re discr 1
+crit reg 1
+crit remark 1
+crit requir 1
+crit research 1
+crit research quest 1
+crit rol 1
+crit sect 4
+crit system 1
+crit task 1
+crit technolog 1
+crit technolog requir 1
+crit to identif 1
+crit to show 1
+crit upper 2
+crit upper level 2
+crit valu 1
+criter 39
+criter and correspon 1
+criter ar prepar 1
+criter ar satisf 1
+criter ar us 1
+criter ba 1
+criter befor remov 1
+criter f1 1
+criter fil 1
+criter fl 1
+criter fl accord 1
+criter fl tr 1
+criter for achief 1
+criter for bal 1
+criter for datab 1
+criter for decl 1
+criter for del 1
+criter for evalu 1
+criter for foc 1
+criter for load 1
+criter for optim 1
+criter for perform 1
+criter for redund 1
+criter for select 1
+criter for var 1
+criter g tr 1
+criter in figur 1
+criter incr 1
+criter is character 1
+criter is describ 1
+criter is ext 1
+criter is reach 1
+criter ment 1
+criter of distribut 1
+criter or requir 1
+criter put 1
+criter put forth 1
+criter reduc 1
+criter result 1
+criter sam number 1
+criter say 1
+criter st 1
+criter th inaeu 1
+criter that impl 1
+criter that us 1
+criter to dec 1
+criter to ensur 1
+criter to maxim 1
+criter to measur 1
+criter to minim 1
+criter to select 1
+criter tr 1
+criter we consider 1
+criter we us 1
+criter yield 1
+critiqu 4
+critiqu of techniqu 1
+critur 2
+critur de 1
+critur de ce 1
+critur du 1
+critur du chapitr 1
+critur pr 1
+critur requ 1
+critur requ te 1
+critur tc 1
+critur tc temp 1
+crl 3
+crl eng 1
+crl main 1
+crl main foc 1
+crl techn 1
+crl techn report 1
+crl.dec.com 1
+crl90 1
+croch 1
+croch informatiqu 1
+croch informatiqu de 1
+croir 2
+croir quen 1
+croir quen pr 1
+croiser 1
+croiser dun 1
+croiser dun part 1
+croker 1
+crossbar 6
+crossbar interconnect 1
+crossbar interconnect network 1
+crossbar of 5ns 1
+crossbar pack 1
+crossbar pack switch 1
+crossbar path 1
+crossbar switch 2
+crossbar switch control 1
+crosscorrel 1
+crosscorrel ar zer 1
+crosscorrel of sequ 1
+crossect 1
+crossover 5
+crossover and mut 2
+crossover do contribut 1
+crossover etc 1
+crossover is caus 1
+crossover is equiv 1
+crossover mut 1
+crossover mut select 1
+crossover oper 2
+crossover oper establ 1
+crossover point 1
+crossover prob 1
+crossover strateg 1
+crossover typ 1
+crossover typ uniform 1
+crosspoint 1
+crosspoint switch 1
+crosspoint switch del 1
+crossproduc 1
+crosssect 1
+crosssect bandwidth 1
+crosssect bandwidth measur 1
+crowd 1
+crowd a work 1
+crpc 1
+crpc tr92214 1
+cru 1
+cru control 1
+cru control giv 1
+cru control model 1
+cru control siml 1
+cru control system 1
+cru controller 1
+cru controller cruisest 1
+cru controller oper 1
+cru cutout 1
+cru speed 1
+cru speed maint 1
+cruc 19
+cruc and del 1
+cruc at high 1
+cruc dep 1
+cruc featur 1
+cruc for prov 1
+cruc for spec 1
+cruc implem 1
+cruc implem mechan 1
+cruc in obtain 1
+cruc mechan 1
+cruc object 1
+cruc perform 1
+cruc perform ind 1
+cruc point 2
+cruc rol 1
+cruc step 2
+cruc substitut 1
+cruc substitut lem 1
+cruel 1
+cruel environm 1
+cruisespeed 1
+cruisespeed cruisest 1
+cruisespeed cruisest cson 1
+cruisespeed j measspeed 1
+cruisespeed jcruisespeed 1
+cruisespeed jcruisespeedj 1
+cruisespeed maxcruisespeed 1
+cruisespeed mincruisespeed 1
+cruisespeed oracl 1
+cruisespeed oracl enginest 1
+cruisest 1
+cruisest csmaintain 1
+cruisest csmaintain cruisest 1
+cruisest csmaintain resum 1
+cruisest csoff 1
+cruisest csoff switch 1
+cruisest cson 1
+cruisest cson return 1
+cruisest cson switch 1
+crunch 2
+crunch mach 1
+crunch system 1
+crunch way requir 1
+crus 3
+crus approach 1
+crus estim 1
+crus estim using 1
+crus form 1
+crus typ 1
+crush 1
+crush object 1
+crutchfield 1
+crux 2
+cruz 4
+cruz sant 1
+cruz sant cruz 1
+crx 1
+crx echocardiogram 1
+crx echocardiogram flag 1
+crypt 2
+crypt suggest 1
+cryptarithm 1
+cryptograph 2
+cryptograph lim 1
+crystal 4
+crystal a const 1
+crystal growth 1
+crystal growth melt 1
+crystal growth siml 1
+crystal is grown 1
+crystal se 1
+crystal structur 1
+crystallograph 1
+crystallograph comput 1
+crystallograph datab 1
+crystallograph datab inform 1
+cs 35
+cs 2nwg 1
+cs con 1
+cs evalu 1
+cs for strong 1
+cs ital 1
+cs lccr 1
+cs lccr tr 1
+cs next hop 1
+cs s t1 1
+cs s0 1
+cs s1 1
+cs schem 1
+cs sn 1
+cs stat 1
+cs t t0 1
+cs t0 1
+cs tr 10
+cs.anu.edu.au 1
+cs.anu.edu.au techreport 1
+cs.brown.edu 1
+cs.byu.edu 1
+cs.cmu.edu 1
+cs.few.eur.nl 1
+cs.few.eur.nl bdepartm 1
+cs.rochester.edu 1
+cs.strath.ac.uk 1
+cs.sunysb.edu 1
+cs.ualber.ca 2
+cs.ualber.ca uztb 1
+cs.ualber.ca uztb cunyvm.bitnet 1
+cs.ucsb.edu 2
+cs.ucsc.edu 1
+cs.ucsc.edu tsuj 1
+cs.ucsc.edu tsuj cs.ucsc.edu 1
+cs.uiuc.edu 1
+cs.uiuc.edu jun 1
+cs.umd.edu 2
+cs.umd.edu pugh 1
+cs.umd.edu pugh cs.umd.edu 1
+cs.umd.edu1 1
+cs.umn.edu 2
+cs.umn.edu kumar 1
+cs.umn.edu kumar cs.umn.edu 1
+cs.umn.edu siv 1
+cs.umn.edu siv cs.umn.edu 1
+cs.uq.oz.au 1
+cs.ut.edu 1
+cs.waikat.ac.nz 1
+cs.washingt.edu 1
+cs1 1
+cs2 3
+cs2 mach 1
+cs3cal 1
+cs3cal bexit 1
+cs3cal bexit main 1
+cs6exit 1
+cs6exit c cal 1
+cs78 1
+cs91 1
+cs94 1
+cs95 1
+csb 1
+csc 1
+csc tr 1
+cscw 3
+cscw environm 1
+cscw issu 1
+cscw liter 1
+cscw92 1
+csd 6
+csd.uw.ca 2
+csdid 1
+csdij 1
+csdij cij 1
+csdij denot 1
+csdj 1
+csg 3
+csg algorithm 1
+csg algorithm specif 1
+csg b rep 1
+csg dat 1
+csg hierarch 1
+csg hierarch con 1
+csg model 1
+csg nod 1
+csg nod fac 1
+csg oper 1
+csg render 2
+csg render algorithm 1
+csg render using 2
+csg renderer 1
+csg renderer gener 1
+csg structur 1
+csg structur inform 1
+csg system 1
+csg tr 1
+csg tr mak 1
+csim 3
+csim ba 1
+csim ba model 1
+csim to model 1
+csim user 1
+csim user guid 1
+csj 1
+csj iesd.auc.dk 1
+csl 6
+csl lectur 1
+csl lectur not 1
+csl pcd 1
+csl pcd techn 1
+csl peopl 1
+csl stanford 1
+csl.stanford.edu 1
+csl89 1
+csl90 1
+csllm 1
+csm 1
+csmaintain 1
+csmaintain cruisest 1
+csmaintain resum 1
+csmv 1
+csmv pd 1
+csoff 1
+csoff switch 1
+cson 1
+cson return 1
+cson switch 1
+csp 5
+csp and occam 1
+csp form 1
+csp is comp 1
+csp is defin 1
+csp is se 1
+csp lik model 1
+csp lik syntac 1
+csp mean 1
+csp techniqu 1
+csp tool 1
+csp tool ea 1
+csp with geometer 1
+csr 1
+csr techn 1
+csr techn report 1
+csr.toront.edu 1
+csrl 1
+cst 1
+csurk 1
+csvm 1
+csvm distribut 1
+csvm exclus 1
+csvm exclus reg 1
+csvm pd 1
+csvm proc 1
+csvm psect 1
+csvm psect csvm 1
+csvm psect en 1
+csvm sect 1
+csvm templ 1
+csvpm 1
+csvpm is simil 1
+csym 1
+ct 5
+ct ar undon 1
+ct bt 1
+ct com 1
+ct com record 1
+ct comp 1
+ct comp transact 1
+ct exam 1
+ct execut 1
+ct execut ser 1
+ct for nest 1
+ct hold 1
+ct in comb 1
+ct is ad 1
+ct is analog 1
+ct is guaranteed 1
+ct is init 1
+ct is mad 1
+ct is writ 1
+ct is writ. 1
+ct log 1
+ct log record 1
+ct subtransact 1
+ct subtransact com 1
+ct subtransact start 1
+ct that clear 1
+ct to comp 1
+ct using 1
+ct using graylevel 1
+ct2 2
+ct2 7nf 2
+ct2 7nf unit 1
+cth 1
+ctl 1
+ctl cdr 1
+ctr 2
+ctr techn 1
+ctr techn report 1
+ctrl 1
+ctv 1
+cu 11
+cu a la 1
+cu a partir 1
+cu and cohn 1
+cu and cv 1
+cu avec 1
+cu avec li 1
+cu cs 1
+cu ctr 1
+cu ctr techn 1
+cu de 2
+cu de fonct 1
+cu de man 1
+cu fil 1
+cu fil ag 1
+cu init 1
+cu init en 1
+cu pour 1
+cu pour le 1
+cu un 1
+cu www.unig.ch 1
+cu www.unig.ch ea 1
+cu.unig.ch 2
+cu.unig.ch url 1
+cu.unig.ch www 1
+cub 16
+cub basel 1
+cub bus 2
+cub cluster 2
+cub clusterc 1
+cub clusterc organ 1
+cub connect 2
+cub connect cycl 2
+cub cub 1
+cub de 1
+cub dep 1
+cub et du 1
+cub exampl 1
+cub graph 1
+cub ind 1
+cub ind norm 1
+cub interconnect 3
+cub interconnect network 1
+cub internet 2
+cub internet prov 2
+cub is brok 1
+cub is un 1
+cub la 1
+cub la lisent 1
+cub le 1
+cub logiqu 1
+cub logiqu f0 1
+cub logiqu ib 1
+cub may inquir 1
+cub min 1
+cub min mac 1
+cub min moy 1
+cub moy 1
+cub moy moy 1
+cub network 3
+cub of height 1
+cub of sidelength 1
+cub of siz 1
+cub of v1 1
+cub of v2 1
+cub on const 1
+cub polynom 1
+cub rest 1
+cub rest tr 1
+cub system 1
+cub that encl 1
+cub that touch 1
+cub topolog 3
+cub wer an 1
+cub wormhol 2
+cub wormhol rout 2
+cucker 1
+cuing 1
+cuiwww.unig.ch 1
+cuiwww.unig.ch ea 1
+cuiwww.unig.ch ea www 1
+cuiwww.unig.ch scdep 1
+culair 1
+culair lalgorithm 1
+culair lalgorithm de 1
+culik 1
+culik ii 1
+culler 4
+culler et al 1
+cullinan 2
+cullinan hal 2
+cult 1
+cultiv 1
+cultiv a vocabl 1
+cultur 5
+cultur and dynam 1
+cultur aspect 1
+cultur constraint 1
+cultur differ 1
+cultur el 1
+cultur hol 1
+cultur of japan 1
+cum 9
+cum addison wesl 1
+cum publ 6
+cum publ co 1
+cum publ compan 5
+cumbersom 3
+cumbersom in pract 1
+cuml 10
+cuml chang 1
+cuml constraint 1
+cuml de 1
+cuml de xi 1
+cuml distribut 1
+cuml e int 1
+cuml ee 1
+cuml ee est 1
+cuml error 1
+cuml error valu 1
+cuml fil 1
+cuml payoff 1
+cuml run 1
+cuml run tim 1
+cuml siz 1
+cuml speedup 1
+cuml system 1
+cuml system load 1
+cuml tim 1
+cuml tim complec 1
+cuml weight 1
+cun 6
+cun et al 2
+cun research 1
+cun research grant 1
+cun xi 3
+cunyvm.bitnet 1
+cunyvm.bitnet fac 1
+cur 97
+cur abl 1
+cur acc 1
+cur acc acc 1
+cur acpt 1
+cur acpt acpt 1
+cur act 2
+cur act on 1
+cur act opj 1
+cur activ 2
+cur activ rat 1
+cur addr 1
+cur and giorg 1
+cur and hist 1
+cur and print 1
+cur ar 1
+cur artif 1
+cur artif neur 1
+cur assessm 1
+cur assessm techniqu 1
+cur assoc 1
+cur attract 1
+cur avail 6
+cur avail compiler 1
+cur avail tool 1
+cur aver 2
+cur aver payoff 1
+cur aver rat 1
+cur aver sal 1
+cur b rep 1
+cur backlog 1
+cur backlog period 1
+cur backtrack 1
+cur backtrack point 1
+cur bar 1
+cur behaviour 1
+cur being perform 1
+cur being popl 1
+cur being pursu 1
+cur being serv 1
+cur being transm 1
+cur being undertak 1
+cur belief 1
+cur best perform 1
+cur bind 1
+cur bind environm 1
+cur block 2
+cur block writ 1
+cur brack 1
+cur brack instead 1
+cur budg 1
+cur ca 1
+cur cal 1
+cur cap 1
+cur caus 1
+cur caus dag 1
+cur channel 2
+cur channel width 2
+cur character 1
+cur character se 1
+cur cl 1
+cur commerc 1
+cur compact 1
+cur compact counter 1
+cur compiler 1
+cur compiler compiler 1
+cur comput 1
+cur con 1
+cur con tr 1
+cur concentr 1
+cur configur 2
+cur consider 2
+cur consider fal 1
+cur consider us 1
+cur construc 1
+cur cont 2
+cur cu 1
+cur dat 1
+cur datab 1
+cur day 1
+cur day switch 1
+cur deb 1
+cur deb deb 1
+cur deduc 1
+cur departm valu 1
+cur descript 1
+cur design 2
+cur design tren 2
+cur difficult 1
+cur direct 1
+cur disabl 1
+cur ec 1
+cur educ 1
+cur educ mater 1
+cur effort 1
+cur en 1
+cur enabl 2
+cur enabl act 1
+cur env 1
+cur environm 2
+cur environm replac 1
+cur error 1
+cur execut 3
+cur execut cal 1
+cur execut instruc 1
+cur execut ph 1
+cur experim 2
+cur expr 1
+cur fastest 1
+cur fastest algorithm 1
+cur fibonacc 1
+cur fibonacc number 1
+cur field 1
+cur field st 1
+cur fil 1
+cur first order 1
+cur foc 1
+cur forml 1
+cur forml contain 1
+cur fragm 1
+cur fragm ident 1
+cur fram 1
+cur fram number 1
+cur gener 4
+cur gener mach 2
+cur gener med 1
+cur gener parallel 1
+cur glob 1
+cur glob st 1
+cur goal 2
+cur goal contain 1
+cur gp 2
+cur gp ba 1
+cur hardwar 2
+cur hardwar implem 1
+cur hardwar platform 1
+cur he 1
+cur he approxim 1
+cur hierarch 1
+cur high perform 1
+cur hist 1
+cur hpf 1
+cur hpf langu 1
+cur idl 1
+cur imag 1
+cur imag proc 1
+cur implem 13
+cur implem con 1
+cur in progr 1
+cur in serv 1
+cur in us 1
+cur ind 1
+cur inform 1
+cur init 1
+cur init cluster 1
+cur input 2
+cur inst 1
+cur inst technolog 1
+cur instruc 1
+cur internet 1
+cur investig 2
+cur item 1
+cur iter 2
+cur know 1
+cur knowledg 1
+cur kybd 1
+cur kybd kybd 1
+cur larg scal 1
+cur layer 1
+cur le 1
+cur le rest 1
+cur learn 2
+cur learn epoch 1
+cur learn pattern 1
+cur lec 1
+cur lec bind 1
+cur level 2
+cur level number 1
+cur lim 1
+cur liter 2
+cur loc 1
+cur mach 1
+cur mak 1
+cur mar 1
+cur mar prov 1
+cur method 2
+cur method paradox 1
+cur micr 1
+cur micr instruc 1
+cur modif 1
+cur modl 1
+cur modl twosym 1
+cur mult 1
+cur mult strateg 1
+cur multicomputer 1
+cur network 1
+cur neur 1
+cur neur network 1
+cur next hop 1
+cur nod 3
+cur nod cap 1
+cur nod currnod 1
+cur nod n0 1
+cur not implem 1
+cur number 3
+cur object 2
+cur object container 1
+cur object orient 1
+cur op 1
+cur order 1
+cur output 3
+cur output parameter 1
+cur output stream 1
+cur pa 1
+cur pack 3
+cur paper 3
+cur paper allow 1
+cur paper describ 1
+cur parallel 2
+cur parallel system 2
+cur part 1
+cur part evalu 1
+cur pattern 1
+cur payoff 1
+cur payoff tim 1
+cur permut 1
+cur ph 1
+cur ph succ 1
+cur ph unsucc 1
+cur po 1
+cur pointer 1
+cur pointer posit 1
+cur popl 4
+cur popl tren 2
+cur popl wormhol 1
+cur posit 5
+cur posit container 1
+cur pot 1
+cur pract 2
+cur prim 1
+cur prob 1
+cur prob distribut 1
+cur prob valu 1
+cur problem 2
+cur proc 2
+cur proc se 1
+cur program 2
+cur program langu 1
+cur program st 1
+cur prompter 1
+cur prompter appear 1
+cur prototyp 3
+cur prototyp implem 1
+cur prototyp status 1
+cur prototyp system 1
+cur prov 2
+cur quer 1
+cur rat 1
+cur real world 1
+cur record 1
+cur repr 1
+cur research 3
+cur restrict 1
+cur run 2
+cur run cour 1
+cur run jmp 1
+cur sal 1
+cur sal valu 1
+cur sav 1
+cur schem 1
+cur schem implem 1
+cur se 7
+cur secon order 1
+cur select 1
+cur select object 1
+cur self 2
+cur self del 1
+cur self modif 1
+cur ser 1
+cur serv 1
+cur serv peer 1
+cur setup 1
+cur setup connect 1
+cur situ 2
+cur siz 1
+cur sl1 1
+cur sl1 modl 1
+cur slav 1
+cur slav loc 1
+cur slav.loc 1
+cur slav.nextloc 1
+cur softwar 2
+cur softwar coh 1
+cur softwar technolog 1
+cur solut 2
+cur span 1
+cur span tr 1
+cur spat 1
+cur spat datab 1
+cur speed 1
+cur speed cruisespeed 1
+cur spon 1
+cur st 17
+cur stack 1
+cur stack entr 1
+cur statenext 1
+cur statenext tidact 1
+cur status 4
+cur status ad 1
+cur strateg 1
+cur structur 1
+cur structur light 1
+cur stud 4
+cur stud pag 1
+cur subexpr 1
+cur substitut 1
+cur supergraph 1
+cur supersc 1
+cur support 1
+cur symbol 1
+cur symbol var 1
+cur t prev 1
+cur tam 1
+cur tam model 1
+cur targ 1
+cur targ mach 1
+cur task 2
+cur task return 1
+cur techn 1
+cur techn progr 1
+cur th maxim 1
+cur th situ 1
+cur th tren 2
+cur ther appear 1
+cur thread 1
+cur thread funct 1
+cur thread thread 1
+cur tim 7
+cur timestamp 1
+cur top 1
+cur topmost 1
+cur topmost stack 1
+cur tr 1
+cur track 1
+cur track ge 1
+cur train 1
+cur train cycl 1
+cur transport 1
+cur transport pack 1
+cur tren 5
+cur tridiagon 1
+cur tridiagon matr 1
+cur ts 1
+cur ts en 1
+cur tsg 1
+cur typ 1
+cur under implem 1
+cur under investig 1
+cur underw 1
+cur unwind 1
+cur unwind protect 1
+cur us 2
+cur us pearson 1
+cur us self 1
+cur val 3
+cur val pair 1
+cur val prob 1
+cur valu 8
+cur valu exp 1
+cur var 1
+cur var renam 1
+cur ver 8
+cur ver du 1
+cur ver us 1
+cur viewport 1
+cur weight 1
+cur weight valu 1
+cur widespread 1
+cur wil 1
+cur work 10
+cur work inclus 1
+cur work load 1
+cur work proc 1
+cur work therefor 1
+cur writ 1
+cur writ chunk 1
+cur writer 1
+cur1 1
+cur1 in1 1
+curd 1
+curieux 1
+curieux de 1
+curieux de voir 1
+curiosit 1
+curiosit e th 1
+currentk 1
+currentk ink 1
+currentk ink cur 1
+currexp 1
+currexp appear 1
+currexp eq 1
+currexp ha fin 1
+currexp or expr 1
+currexp when procdef 1
+curricl 2
+curricl challeng 1
+currnod 1
+currnod a red 1
+currnod and st 1
+currnod cand 1
+currnod currnod 1
+currnod defrl 1
+currnod expr 1
+currnod in eval 1
+currnod is boldfac 1
+currnod narrow 1
+currnod narrow act 1
+currnod st 1
+currnod st act 1
+currnod th latter 1
+currnod th relev 1
+currnod wa activ 1
+currnod2 1
+currnod3 1
+currnod3 sn 1
+currnod3 sn root3 1
+currnod4 1
+curt 3
+curt eav 1
+curtius 1
+curtius snodgr 1
+curtius snodgr letter 1
+curv 19
+curv achief 1
+curv algorithm 1
+curv and surfac 1
+curv and using 1
+curv approach 1
+curv as shown 1
+curv assum 1
+curv ben 1
+curv con. 1
+curv concept 1
+curv correspon 1
+curv in figur 2
+curv incr 1
+curv inform 1
+curv is aver 1
+curv is bound 1
+curv is prop 1
+curv letter 1
+curv letter detect 1
+curv lin 2
+curv method 1
+curv mult 1
+curv mult step 1
+curv obtain 2
+curv obtain earl 2
+curv of order 1
+curv of var 2
+curv problem 1
+curv proc 1
+curv proc typ 1
+curv segm 1
+curv show 2
+curv that visit 1
+curv to achief 1
+curv transl 1
+curv transl down 1
+curv using 1
+curv wa ment 1
+curv wa steep 1
+cus 1
+cus vont 1
+cus vont ain 1
+custom 10
+custom and ea 1
+custom built 1
+custom built resourc 1
+custom compon 1
+custom con 1
+custom control 1
+custom exampl 1
+custom famil 1
+custom mad 1
+custom mad program 1
+custom mak 1
+custom me 1
+custom me object 1
+custom method 1
+custom method dispatch 1
+custom on con 1
+custom serv 1
+custom syntac 1
+custom th implem 1
+custom th prompter 1
+custom th serv 1
+custom th system 1
+custom to addr 1
+custom to camelot 1
+custom vi direct 1
+customer 3
+customer in futur 1
+customer is particl 1
+customer wil want 1
+customiz 1
+customiz hi log 1
+cut 28
+cut achief 1
+cut acr link 1
+cut and edit 1
+cut and minim 1
+cut and past 1
+cut and remain 1
+cut and simultan 1
+cut avec 1
+cut avec try 1
+cut be strong 1
+cut benefit 1
+cut but improv 1
+cut dat 1
+cut dat rectangl 1
+cut decomposit 1
+cut deriv 1
+cut deriv earl 1
+cut developm 1
+cut di 1
+cut di backtrack 1
+cut down search 1
+cut edg 1
+cut elim 1
+cut elim argum 1
+cut est 1
+cut est un 1
+cut et le 1
+cut et neck 1
+cut for garb 1
+cut fr 1
+cut fr deriv 1
+cut fr subsystem 1
+cut fr subtyp 1
+cut in order 2
+cut last qu 1
+cut ne 1
+cut ne pren 1
+cut of succ 1
+cut oper 2
+cut pack 1
+cut partit 1
+cut past 1
+cut past defin 1
+cut point 2
+cut point de 1
+cut point mark 1
+cut proc 2
+cut produc 1
+cut requir 1
+cut rl 1
+cut separ 1
+cut sont 1
+cut sont sp 1
+cut symbol 1
+cut term 1
+cut th contour 1
+cut th imag 1
+cut th object 1
+cut th solut 1
+cut that ch 1
+cut that com 1
+cut theorem 1
+cut through dev 1
+cut through oper 1
+cut through rout 1
+cut through switch 1
+cut throughlik 1
+cut throughlik mechan 1
+cut to expr 1
+cut to render 1
+cut tool 1
+cut tot 1
+cut ver 1
+cut ver ci 1
+cut ver tr 1
+cut vi 1
+cut vn 1
+cut vn neck 1
+cut vn pour 1
+cut we implem 1
+cut with random 1
+cut y2 1
+cut y2 cut 1
+cut5 1
+cutb 1
+cutb alor 1
+cutb alor quil 1
+cuthil 1
+cuthil mck 1
+cuthil mck schem 1
+cutout 1
+cutout ar introduc 1
+cutp 1
+cutpt 1
+cutpt est 1
+cutpt est sauvegard 1
+cuttingstock 1
+cuttingstock problem 1
+cv 2
+cv center 1
+cv4 1
+cv4 7al 1
+cv88 1
+cvg 1
+cvgip 2
+cvgip in august 1
+cvm 1
+cvm actu 1
+cvm actu oper 1
+cvm by construc 1
+cvm is repr 1
+cvpr 1
+cvpr94 1
+cvpr96 1
+cvrm95 1
+cw 2
+cw fx 1
+cw is defin 1
+cw85 1
+cw87 1
+cx 3
+cx cdr 1
+cy 1
+cy11 1
+cybenk 2
+cyberjourn 1
+cyberjourn sit 1
+cybernet 8
+cybernet and artif 2
+cycl 40
+cycl 100mb 2
+cycl a proc 1
+cycl a tr 1
+cycl acc 1
+cycl acc tim 1
+cycl algorithm 1
+cycl ar defin 1
+cycl ar indep 1
+cycl ba 1
+cycl ba span 1
+cycl be form 1
+cycl by remov 1
+cycl by w1 1
+cycl c ad 1
+cycl c defin 1
+cycl calcl 1
+cycl calcl ph 1
+cycl calcl tim 1
+cycl cannot sign 1
+cycl chang 1
+cycl con 1
+cycl construc 1
+cycl contain 3
+cycl ctr 1
+cycl de 1
+cycl de la 1
+cycl del 1
+cycl dep 1
+cycl dep gener 1
+cycl determin 1
+cycl determin remov 1
+cycl distribut 1
+cycl du 1
+cycl each oper 1
+cycl each tim 1
+cycl en 1
+cycl en ca 1
+cycl epoch 1
+cycl epoch pattern 1
+cycl est 1
+cycl est transpar 1
+cycl exchang 1
+cycl execut 1
+cycl execut tim 1
+cycl fash 1
+cycl find 1
+cycl find algorithm 1
+cycl for addr 1
+cycl for arbitr 1
+cycl for subsequ 1
+cycl for var 2
+cycl gener 1
+cycl h1 1
+cycl h2 1
+cycl idl 1
+cycl idl du 1
+cycl induc 1
+cycl involut 1
+cycl is defin 1
+cycl is repeat 1
+cycl is vi 1
+cycl lat 2
+cycl length 1
+cycl length obtain 1
+cycl length reducead32 1
+cycl length tr 1
+cycl level 1
+cycl m de 1
+cycl number 1
+cycl of 10ns 2
+cycl of 50ns 2
+cycl of coar 1
+cycl of g0 1
+cycl of length 2
+cycl of observ 1
+cycl of requir 1
+cycl on aver 1
+cycl order 1
+cycl path 1
+cycl path reach 1
+cycl problem 1
+cycl rat 1
+cycl repeat 1
+cycl requir 3
+cycl schedl 1
+cycl se 1
+cycl se length 1
+cycl se problem 1
+cycl sequ 1
+cycl shift 1
+cycl solver 1
+cycl structur 1
+cycl subspac 1
+cycl sur 1
+cycl sur la 1
+cycl th order 1
+cycl that assign 1
+cycl that contain 1
+cycl that inclus 1
+cycl through repeat 1
+cycl tim 6
+cycl tim tc 2
+cycl to execut 1
+cycl to sen 1
+cycl tot 1
+cycl wait 1
+cycl which form 1
+cycl wil requir 1
+cycl with feedback 1
+cycl with respect 1
+cycl wt 1
+cyclelengthstat 1
+cycleswrit 1
+cycleswrit buffer 1
+cycleswrit buffer stallswait 1
+cycletimestat 1
+cycliqu 2
+cycliqu avec 1
+cycliqu avec le 1
+cycliqu de 1
+cycliqu de cycl 1
+cycliqu de la 1
+cycliqu de pag 1
+cycliqu dordr 1
+cycliqu du 1
+cycliqu du fait 1
+cycliqu engendr 1
+cycliqu engendr de 1
+cycliqu et par 1
+cycliqu et util 1
+cycliqu le 1
+cycliqu le prem 1
+cycliqu ordonnanc 1
+cycliqu ordonnanc par 1
+cycliqu ou 1
+cycliqu ou par 1
+cycliqu par 1
+cycliqu par bloc 1
+cycliqu pav 1
+cycliqu qu 1
+cycliqu qu assur 1
+cycliqu soit 1
+cycliqu soit par 1
+cycliqu sur 1
+cylinder 3
+cylinder ar 1
+cylinder cw 1
+cylinder import 1
+cylinder import circl 1
+cylinder in figur 1
+cylinder0 1
+cylinder93 1
+cylindr 2
+cylindr a ba 1
+cylindr surfac 1
+cylindr surfac produc 1
+cym 1
+cypher 2
+cytochrom 1
+cytron 1
+cz 2
+czech 2
+czech republ 1
+czech republ institut 1
+czech republ pod 1
+czochralsk 1
+czochralsk crystal 1
+czochralsk crystal growth 1
+d.1 1
+d.11 1
+d.a 4
+d.c 5
+d.d 1
+d.doerman 1
+d.e 6
+d.f 1
+d.g 3
+d.h 3
+d.h.d 3
+d.j 1
+d.k 1
+d.l 1
+d.m 2
+d.p 1
+d.r 2
+d.s 8
+d.t 1
+d.v 1
+d.v and wi 1
+d.w 1
+d0 8
+d0 a subderiv 1
+d0 and claus 1
+d0 d0 1
+d0 denot 1
+d0 g0 2
+d0 iff 1
+d01 1
+d01 d02 1
+d02 1
+d0d1 1
+d0d1 dim 1
+d0d1origin 1
+d1 20
+d1 2d 1
+d1 a2 1
+d1 and d2 3
+d1 contain 1
+d1 contain memor 1
+d1 d2 4
+d1 d2 d2 1
+d1 d2 d3 1
+d1 d2 pfd1 1
+d1 d20 1
+d1 g00 1
+d1 of project 1
+d1 on d2 1
+d1 t1 1
+d1 v d2 1
+d10 1
+d11 2
+d117 1
+d117 d27 1
+d1i 2
+d1i d2i 1
+d1i d2i d3i 1
+d1i2 1
+d1j 1
+d1j with respect 1
+d1m 1
+d2 15
+d2 be collect 1
+d2 color 1
+d2 contain 1
+d2 contain memor 1
+d2 d1 1
+d2 d2 1
+d2 d3 1
+d2 d3 d4 1
+d2 denot 1
+d2 f hg 1
+d2 ffd1 1
+d2 ffd1 d2gg 1
+d2 in d1 1
+d2 instead 1
+d2 pfd1 1
+d2 th problem 1
+d2 tim 1
+d2 tim period 1
+d20 1
+d21 1
+d27 1
+d27 11x 1
+d2g 2
+d2gg 1
+d2gg wh 1
+d2gg wh ffdg 1
+d2i 3
+d2i d3i 1
+d2i with respect 1
+d2ij 1
+d2j 2
+d2m 1
+d2mp 1
+d2q06c 1
+d3 3
+d3 and d4 1
+d3 d4 1
+d3 d4 d5 1
+d3i 2
+d3i of proc 1
+d4 2
+d4 d5 1
+d4 d5 d6 1
+d4i 1
+d4i d5i 1
+d5 1
+d5 d6 1
+d5 d6 d7 1
+d5i 1
+d6 1
+d6 d7 1
+d6 d7 d8 1
+d6 in figur 1
+d6 p i2f1 1
+d6i 1
+d6i and d7i 1
+d6i d7i 1
+d7 2
+d7 and dnameu 1
+d7 d8 1
+d7 d8 d9 1
+d7i 1
+d7i of proc 1
+d7x 1
+d8 1
+d8 d9 1
+d8 d9 d10 1
+d8i 1
+d8i of proc 1
+d9 1
+d9 d10 1
+da 14
+da act 1
+da ba 1
+da breakdown 1
+da breakdown situ 1
+da comput 1
+da daah04 1
+da pract 1
+da problem 2
+da red 1
+da user 1
+da verfahr 1
+da verfahr der 1
+daad 2
+daah04 2
+daal03 2
+dabord 4
+dabord avec 1
+dabord avec retour 1
+dabord cherch 1
+dabord cherch tous 1
+dabord cop 1
+dabord cop ee 1
+dabord de 1
+dabord de deux 1
+dabord distingu 1
+dabord distingu ee 1
+dabord etr 1
+dabord etr transform 1
+dabord la 1
+dabord la gest 1
+dabord le 3
+dabord le mod 1
+dabord le point 1
+dabord le var 1
+dabord li 1
+dabord li ee 1
+dabord montr 1
+dabord partitionner 1
+dabord partitionner le 1
+dabord qu 3
+dabord qu la 1
+dabord qu le 1
+dabord qu lon 1
+dabord quelqu 1
+dabord quelqu propr 1
+dabord remerc 1
+dabord remerc le 1
+dabord un partit 1
+dabord un ping 1
+daborder 1
+daborder la 1
+daborder la th 1
+dabsc 1
+dabsc impair 1
+dabsc pair 1
+dabt 1
+dacc 3
+dacc eder 3
+dacc eder au 1
+dacc eder en 2
+dacc el 3
+dacc el erat 1
+dacc el erer 2
+dacc es 3
+dacc es aux 3
+dacc es correspon 1
+dacc es dan 1
+dacc es de 1
+dacc es dist 1
+dacc es en 2
+dacc es hi 1
+dacc es ir 1
+dacc es lin 1
+dacc es non 1
+dacc es pouv 1
+dacc es si 1
+dacc es sont 1
+dacc es suppl 1
+dacc es sur 1
+dacc s en 1
+daccepter 1
+daccepter aus 1
+daccepter aus de 1
+daccepter de 1
+daccepter de juger 1
+daccessibilit 2
+daccr 1
+daccr tr 1
+daccr tr la 1
+dacquisit 1
+dacquisit dim 1
+dacquisit relativ 1
+dacquisit relativ similair 1
+dact 2
+dact dan 1
+dact sp 1
+dact sp ecifiqu 1
+dactiv 1
+dactiv avec 1
+dactiv avec point 1
+dactiv classiqu 1
+dactiv classiqu avec 1
+dactiv correspon 1
+dactiv de 1
+dactiv de la 1
+dactiv de lappel 1
+dactiv de sa 1
+dactiv dun 1
+dactiv dun appel 1
+dactiv est 1
+dactiv est repr 1
+dactiv n etant 1
+dactiv nest 1
+dactiv nest pa 1
+dactiv pr 1
+dactiv pr ec 1
+dactiv standard 1
+dactiv standard agenc 1
+dactiv standard instruc 1
+dactiv uniqu 1
+dactiv uniqu de 1
+dactiv uniqu qu 1
+dadapt 1
+dadapt s econdair 1
+dadapter 2
+dadapter la 2
+dadapter la repr 1
+dadapter la tail 1
+dadapter le 1
+dadapter le program 1
+dadapter le techniqu 1
+dadm 1
+dadm sasm 1
+dadm sasm sadm 1
+dadm sont 1
+dadm sont constitu 1
+dadmettr 1
+dadmettr quel 1
+dadmettr quel nous 1
+dadr 2
+dadr commun 1
+dadr comp 1
+dadr comp ee 1
+dadr de 1
+dadr de liaison 1
+dadr dev 1
+dadr doiv 1
+dadr et un 1
+dadr glob 2
+dadr glob est 1
+dadr glob pouv 1
+dadr glob sur 1
+dadr instruc 1
+dadr la 1
+dadr la pair 1
+dadr pour 1
+dadr pour le 1
+dadr s equenc 1
+dadr virtuel 1
+dadr virtuel en 1
+dadr vo 1
+daemon 1
+daemon in loc 1
+daffect 1
+daffect destruc 1
+daffect destruc au 1
+daffecter 1
+daffecter a nouveau 1
+daffinit 1
+daffinit e de 1
+daffinit e entr 1
+daffirmer 1
+daffirmer qu 1
+daffirmer qu lin 1
+dag 3
+dag ar assign 1
+dag ar shown 1
+dag as follow 1
+dag con 1
+dag disc 1
+dag disc prev 1
+dag gener 1
+dag gp 1
+dag gq 1
+dag is avail 1
+dag is depict 1
+dag is form 1
+dag is rev 1
+dag on parallel 1
+dag repr 1
+dag schedl 1
+dag schedl algorithm 1
+dag schedl problem 1
+dag schedl report 1
+dag show 1
+dag shown 1
+dag shown earl 1
+dag wer synth 1
+dag wer var 1
+dag when tot 1
+dag with ident 1
+dag with ten 1
+dagenc 1
+dagenc de 1
+dagenc de structur 1
+daggr 1
+daggr egat 1
+daggraver 1
+daggraver lampleur 1
+daggraver lampleur dun 1
+daggraver loccur 1
+daggraver loccur de 1
+dagrandir 1
+dagrandir lenviron 1
+dagstuhl 1
+dahbur 1
+dahl 1
+dahl and mog 1
+dailleur 1
+dailleur a tout 1
+dailleur dan 1
+dailleur dan le 1
+dailleur du 1
+dailleur du recuit 1
+dailleur justif 1
+dailleur justif son 1
+daim 1
+dajouter 2
+dajouter aux 1
+dajouter aux valeur 1
+dajouter et de 1
+dajx0 1
+dajx0 bj 1
+dajx0 bj mj 1
+dajx00 1
+dal 11
+dal jam 1
+dal mol 1
+dal mol dintellig 1
+dal ph 1
+dal ph gly 1
+dalaph 1
+dalaph gly 1
+dalaph gly tyr 1
+dalgorithm 3
+dalgorithm con 1
+dalgorithm doptim 1
+dalgorithm doptim stochastiqu 1
+dalgorithm en 1
+dalgorithm en classif 1
+dalgorithm stochastiqu 1
+dalign 2
+dalign et un 1
+daller 1
+daller retour 1
+daller retour de 1
+dalloc 2
+dalloc alloc 1
+dalloc de 1
+dalloc de don 1
+dalloc et de 1
+dallouer 1
+dallouer aux 1
+dallouer aux deux 1
+dallouer un register 1
+dalm 1
+dalt 1
+daltern 1
+daltern a la 1
+dam 10
+dam algorithm 1
+dam algorithm attempt 1
+dam algorithm describ 1
+dam approach 1
+dam elior 4
+dam elior atteint 1
+dam elior de 3
+dam elior possibl 1
+dam elior prometteus 1
+dam eliorer 2
+dam eliorer ain 1
+dam eliorer au 1
+dam eliorer la 2
+dam eliorer leur 1
+dam model 1
+dam model select 1
+dambiguit 1
+dambiguit e sur 1
+dambr 1
+damender 1
+damender le 1
+damender le sch 1
+damer 1
+damer pour 1
+damer pour la 1
+damortir 1
+damortir le 1
+damortir le co 1
+damp 2
+damp algebr 1
+damp algebr riccat 1
+damp controller 1
+damp controller ba 1
+damp feedback 1
+damp or threshold 1
+damp system 1
+damp system dynam 1
+damp th spur 1
+dan 13
+dan a1 1
+dan a1 avant 1
+dan al 1
+dan aquarius 1
+dan beaucoup 1
+dan beaucoup de 1
+dan bien 1
+dan bien dautr 1
+dan bien de 1
+dan binprolog 1
+dan bon 1
+dan bon nombr 1
+dan bp 1
+dan califan 1
+dan ce 5
+dan ce algorithm 2
+dan ce altern 1
+dan ce an 1
+dan ce approch 1
+dan ce articl 1
+dan ce ba 1
+dan ce ca 3
+dan ce cat 1
+dan ce chapitr 1
+dan ce condit 2
+dan ce context 3
+dan ce dern 3
+dan ce deux 1
+dan ce docum 1
+dan ce espac 1
+dan ce etud 1
+dan ce exempl 2
+dan ce gest 1
+dan ce graph 1
+dan ce lang 1
+dan ce manuscrit 1
+dan ce mod 2
+dan ce mon 1
+dan ce optiqu 1
+dan ce ordr 1
+dan ce pag 1
+dan ce paragraph 3
+dan ce part 2
+dan ce pol 1
+dan ce program 1
+dan ce qu 2
+dan ce rapport 1
+dan ce secon 1
+dan ce sect 1
+dan ce sous 1
+dan ce syst 1
+dan ce techniqu 1
+dan ce th 2
+dan ce typ 2
+dan ce ver 1
+dan ce zon 1
+dan celu 1
+dan celu de 1
+dan certain 3
+dan certain ca 2
+dan certain op 1
+dan certain sous 1
+dan certain traver 1
+dan chacun 1
+dan chacun de 1
+dan chaqu 4
+dan chaqu boucl 1
+dan chaqu ca 1
+dan chaqu cl 1
+dan chaqu claus 1
+dan chaqu environ 1
+dan chaqu instruc 1
+dan chaqu marqu 1
+dan chaqu point 1
+dan combin 1
+dan combin pattern 1
+dan cutpt 1
+dan dautr 2
+dan dautr ca 1
+dan dautr configur 1
+dan dautr structur 1
+dan de 4
+dan de bloc 1
+dan de cach 1
+dan de cel 1
+dan de condit 1
+dan de domain 1
+dan de don 1
+dan de environ 1
+dan de lign 1
+dan de moindr 1
+dan de nombreux 1
+dan de pag 1
+dan de program 1
+dan de proport 1
+dan de register 1
+dan de sc 1
+dan de tel 1
+dan de term 1
+dan de tr 1
+dan de trac 1
+dan deux 2
+dan deux conflit 1
+dan deux don 1
+dan diff 1
+dan diff erent 1
+dan diver 1
+dan diver context 1
+dan dolev 1
+dan du 1
+dan du mouv 1
+dan ecrc 1
+dan ecrc prolog 1
+dan fauger 1
+dan glob 1
+dan glob devr 1
+dan gr 1
+dan gr stat 1
+dan h bler 1
+dan hal 1
+dan ib 1
+dan ib f0 1
+dan icm 1
+dan ie 1
+dan ie int 1
+dan imag 1
+dan imag fus 1
+dan int 1
+dan ir 1
+dan journ 1
+dan journ es 1
+dan kcm 1
+dan l ecritur 1
+dan l elabor 1
+dan l elag 1
+dan l enonc 1
+dan l equip 1
+dan l etat 2
+dan l eventualit 1
+dan l evolut 1
+dan la 5
+dan la ba 1
+dan la bon 1
+dan la boucl 1
+dan la ca 1
+dan la cart 1
+dan la ch 1
+dan la chain 1
+dan la claus 1
+dan la colon 1
+dan la combinaison 1
+dan la con 1
+dan la concept 1
+dan la condit 1
+dan la construc 1
+dan la converg 1
+dan la deux 2
+dan la direct 2
+dan la disc 1
+dan la figur 1
+dan la gard 1
+dan la gest 2
+dan la justif 1
+dan la lign 1
+dan la lit 2
+dan la logiqu 1
+dan la mach 1
+dan la man 1
+dan la mesur 1
+dan la mi 1
+dan la mvp 1
+dan la nouvel 1
+dan la ntoam 1
+dan la pag 1
+dan la part 2
+dan la perform 1
+dan la perspect 1
+dan la ph 3
+dan la pil 1
+dan la plupart 1
+dan la popl 1
+dan la pr 1
+dan la pratiqu 2
+dan la prem 4
+dan la prim 1
+dan la recherch 1
+dan la repr 1
+dan la secon 1
+dan la sect 3
+dan la siml 1
+dan la structur 1
+dan la suit 3
+dan la tabl 2
+dan la th 1
+dan la tr 3
+dan la trajectoir 1
+dan la vam 1
+dan la var 1
+dan la ver 3
+dan la vi 1
+dan la viabilit 1
+dan la wam 1
+dan la zon 1
+dan lagc 1
+dan lagenc 1
+dan lagenc de 1
+dan lagenc du 1
+dan lalgorithm 1
+dan lalgorithm de 1
+dan lanneau 1
+dan lappl 1
+dan lapproch 1
+dan lapproch par 1
+dan laquel 1
+dan laquel sont 1
+dan larbr 1
+dan larbr de 1
+dan larticl 1
+dan lat 1
+dan lat de 1
+dan lautr 1
+dan le 6
+dan le algorithm 1
+dan le architectur 1
+dan le autr 2
+dan le bassin 1
+dan le born 1
+dan le boucl 1
+dan le but 1
+dan le ca 6
+dan le cach 2
+dan le cadr 4
+dan le calculateur 1
+dan le champ 1
+dan le chapitr 3
+dan le claus 1
+dan le cod 2
+dan le commerc 1
+dan le compilateur 2
+dan le concept 2
+dan le condit 2
+dan le context 2
+dan le corp 1
+dan le dern 2
+dan le descript 1
+dan le deux 2
+dan le domain 2
+dan le don 1
+dan le enonc 1
+dan le environ 2
+dan le etud 1
+dan le evalu 1
+dan le exempl 1
+dan le fait 2
+dan le fluc 1
+dan le gard 1
+dan le guid 1
+dan le hypoth 1
+dan le imag 1
+dan le impl 1
+dan le instruc 1
+dan le interv 2
+dan le jeu 1
+dan le lang 1
+dan le logiciel 1
+dan le mach 1
+dan le manuel 1
+dan le marqu 1
+dan le meilleur 1
+dan le mi 1
+dan le milieu 1
+dan le mod 1
+dan le mot 1
+dan le mvp 1
+dan le nid 1
+dan le nombreux 1
+dan le nouveau 1
+dan le nouvel 1
+dan le op 1
+dan le organ 1
+dan le pag 1
+dan le paragraph 2
+dan le parcour 1
+dan le pav 1
+dan le pir 3
+dan le point 1
+dan le popl 1
+dan le pr 1
+dan le prem 2
+dan le probl 1
+dan le program 2
+dan le proj 1
+dan le prot 1
+dan le protocol 1
+dan le rapport 1
+dan le register 1
+dan le rest 1
+dan le sch 1
+dan le segm 1
+dan le sel 1
+dan le sen 2
+dan le sous 1
+dan le support 1
+dan le syst 4
+dan le tableau 1
+dan le tableaux 1
+dan le term 1
+dan le tr 2
+dan le trait 3
+dan le travaux 1
+dan le tutoriel 1
+dan le var 1
+dan le ver 2
+dan le voisin 1
+dan lec 1
+dan lec ecut 1
+dan lemmer 1
+dan lensembl 2
+dan lensembl de 1
+dan lensembl solut 1
+dan lenviron 2
+dan lenviron fortran 1
+dan lenviron init 1
+dan lenviron quapr 1
+dan lequel 3
+dan lequel appar 1
+dan lequel el 2
+dan lequel il 1
+dan lequel la 1
+dan lequel le 1
+dan lequel sont 1
+dan lespac 3
+dan lespac commun 1
+dan lespac de 2
+dan lespac dit 1
+dan lesprit 2
+dan lesprit de 2
+dan lesprit du 1
+dan lesprit dun 1
+dan lesquel 1
+dan lesquel la 1
+dan lestim 1
+dan lestim dun 1
+dan leur 2
+dan leur docum 1
+dan leur recherch 1
+dan lexempl 3
+dan lexempl ci 2
+dan lexempl cidessus 1
+dan lexempl de 1
+dan lexempl pr 2
+dan lexpr 2
+dan lexpr som 1
+dan lhypoth 2
+dan lhypoth es 2
+dan li 1
+dan lim 2
+dan lim de 1
+dan linstruc 1
+dan linstruc dalloc 1
+dan linstruc neck 1
+dan linstruc qu 1
+dan linstruc suiv 1
+dan linstruc trust 1
+dan linstruc try 1
+dan linterv 1
+dan linterv don 1
+dan linterv i2 1
+dan lintroduc 1
+dan lintroduc de 1
+dan lobjectif 1
+dan lobjectif de 1
+dan lombr 1
+dan lop 1
+dan lop erat 1
+dan lordr 3
+dan lordr cr 1
+dan lordr darriv 1
+dan lordr de 1
+dan lordr du 1
+dan lordr inver 1
+dan lordr lexicographiqu 2
+dan lordr sur 1
+dan lun 2
+dan lun de 2
+dan mrc95 1
+dan n3 1
+dan newman 1
+dan newman ou 1
+dan nimport 1
+dan nimport quel 1
+dan no 1
+dan no appl 1
+dan notr 4
+dan notr ca 2
+dan notr cadr 1
+dan notr exempl 1
+dan notr probl 1
+dan notr th 1
+dan plus de 1
+dan plus ou 1
+dan plusieur 2
+dan plusieur context 1
+dan prolog 1
+dan prolog mal 1
+dan quel 3
+dan quel mesur 1
+dan quel ordr 1
+dan quel register 1
+dan quel sen 1
+dan quintus 1
+dan quintus prolog 1
+dan r3 1
+dan ranneb 1
+dan robbin 1
+dan sa 3
+dan sa capacit 1
+dan sa descript 1
+dan sa form 1
+dan sa prem 1
+dan sa th 2
+dan sep 1
+dan sicstus 1
+dan sicstus prolog 1
+dan son 2
+dan son ensembl 1
+dan son fonct 1
+dan son group 1
+dan son impl 1
+dan son int 1
+dan son livr 1
+dan sp 1
+dan sp med 1
+dan springer 1
+dan springer ser 1
+dan th oxford 1
+dan tn 1
+dan tous 2
+dan tous ce 1
+dan tous le 2
+dan tout 3
+dan tout ce 1
+dan tout la 1
+dan tout le 3
+dan un 4
+dan un algorithm 1
+dan un appel 1
+dan un appl 1
+dan un architectur 1
+dan un avenir 1
+dan un boucl 2
+dan un ca 1
+dan un cadr 1
+dan un ch 1
+dan un champ 1
+dan un claus 1
+dan un compilateur 1
+dan un condit 1
+dan un context 2
+dan un deux 1
+dan un direct 1
+dan un disjonct 1
+dan un enregister 1
+dan un ensembl 1
+dan un espac 3
+dan un etat 2
+dan un eventuel 1
+dan un expr 1
+dan un gard 1
+dan un gest 1
+dan un impl 1
+dan un instruc 1
+dan un lang 2
+dan un marqu 1
+dan un mod 1
+dan un moteur 1
+dan un nid 1
+dan un nouveau 1
+dan un nouvel 1
+dan un optim 1
+dan un optiqu 1
+dan un ordr 1
+dan un pag 1
+dan un pav 1
+dan un point 1
+dan un pol 1
+dan un prem 3
+dan un probl 1
+dan un rapport 1
+dan un register 1
+dan un repr 1
+dan un sch 1
+dan un sel 3
+dan un siml 1
+dan un situ 1
+dan un som 1
+dan un structur 1
+dan un syst 2
+dan un tabl 1
+dan un tel 1
+dan un term 1
+dan un uniqu 1
+dan un var 2
+dan un voisin 1
+dan un zon 1
+dan zp 1
+danalyser 1
+danalyser le 1
+danalyser le comport 1
+danalyser le ph 1
+danc 2
+danc hal 1
+danc hal architectur 1
+danciennet 1
+danciennet e dun 1
+dancourt 1
+dancourt et irigoin 1
+dandamud 3
+danger 6
+danger in batch 1
+danger level 1
+danger level ind 1
+danger of destr 1
+danger of stack 1
+danger of subject 1
+danger of thwart 1
+dangl 2
+dangl center 1
+dangl center point 1
+dangl refer 1
+daniel 12
+daniel boissonnat 1
+daniel boissonnat bernhard 1
+daniel diaz 1
+daniel et al 1
+daniel le 1
+daniel lenosk 1
+daniel loprest 1
+daniel loprest andrew 1
+daniel prelinger 1
+daniel sturman 1
+daniel windheiser 1
+danish 3
+danish popl 1
+danish research 2
+danish research council 2
+danish ver 1
+danneaux 1
+danneaux consid 1
+danneaux consid er 1
+dantzig 2
+danv 1
+daoud 1
+daoud stuart 1
+daoud stuart rober 1
+dap 1
+dap fam 1
+dappar 1
+dappar de 1
+dappar de point 1
+dapparit 1
+dapparit de 1
+dapparit de etat 1
+dappart 1
+dappel 1
+dappel aux 1
+dappel aux pr 1
+dappel cal 1
+dappel de 1
+dappel de pr 1
+dappel du 1
+dappel du pr 1
+dappel est 1
+dappel est ladr 1
+dappel interm 1
+dappel interm ediair 1
+dappel non 1
+dappel non termin 1
+dappel sont 1
+dappel sont modif 1
+dappel termin 1
+dappel termin dun 1
+dappel termin en 1
+dappel termin est 1
+dappel termin execut 1
+dappel termin ne 1
+dappel termin nest 1
+dappel termin pur 1
+dappeler 1
+dappeler pil 1
+dappeler pil loc 1
+dappl 5
+dappl adapt 1
+dappl adapt son 1
+dappl aux 2
+dappl aux don 1
+dappl aux sel 1
+dappl auxquel 1
+dappl auxquel il 1
+dappl de 1
+dappl de ce 1
+dappl de transform 1
+dappl direct 1
+dappl plus larg 1
+dappl pour 1
+dappl pour le 1
+dappl r eel 1
+dappl relativ 1
+dappl relativ vast 1
+dappl serait 1
+dappl soit 1
+dappl soit le 1
+dappl sont 1
+dappl sont clair 1
+dappl sont fort 1
+dappliquer 2
+dappliquer loc 1
+dappliquer loc de 1
+dappliquer un 1
+dappliquer un transform 1
+dapporter 1
+dapporter a la 1
+dappr 1
+dappr ec 1
+dappr ec le 1
+dapproxim 1
+dapproxim dan 1
+dapproxim dan le 1
+dapr 3
+dapr es 3
+dapr es ce 1
+dapr es holzbaur 1
+dapr es la 2
+dapr es le 3
+dapr es me 1
+dapr es notr 1
+daquarius 1
+daquarius r eal 1
+dar 5
+dar et en 1
+darbr 1
+darbr dont le 1
+darchitectur 3
+darchitectur a pil 1
+darchitectur la 1
+darchitectur mult 1
+darchitectur mult processeur 1
+darchitectur perform 1
+darchitectur sur 1
+dard 1
+darem 2
+darem rodger 1
+dargum 1
+dargum a restaurer 1
+dargum evid 1
+dargum evid en 1
+dargum pour 1
+dargum pour eviter 1
+dargum sauvegard 1
+dargum sauvegard es 1
+dargum sur 1
+dargum sur la 1
+darit 1
+darit e non 1
+darit e sont 1
+darit e sup 1
+darithm 1
+darithm etiqu 1
+dark 9
+dark botch 1
+dark box 1
+dark box ind 1
+dark color 1
+dark edg 1
+dark edg repr 1
+dark gr 1
+dark in greysc 1
+dark lin 2
+dark rectangl 1
+dark sect 2
+darkest 1
+darkest column 1
+darkgreen 1
+darkgreen and v2v02 1
+darkgreen then le 1
+darlingt 1
+darlingt cl 1
+darlingt cl fold 1
+darmstadt.de 1
+darmstadt.de l 1
+darmstadt.de l ulrik.html 1
+darnel 1
+darp 6
+darp and onr 1
+darp contract 1
+darp contract n00014 1
+darp nsf 1
+darp nsf grant 1
+darp speech 1
+darp under contract 1
+darriv 1
+darriv ee 1
+darriv ee de 1
+darriver 1
+darw 1
+darwin 1
+darwin sur 1
+dasarath 1
+dasgupt 1
+dash 16
+dash and cr 1
+dash architectur 1
+dash arrow 1
+dash conv 1
+dash conv allow 1
+dash cop 1
+dash counterpart 1
+dash curv 1
+dash curv assum 1
+dash edg 1
+dash for eluc 1
+dash ind 1
+dash lin 5
+dash lin ind 2
+dash multiproc 3
+dash prototyp 3
+dash prototyp log 2
+dash record 1
+dash variabl 1
+dashflash 1
+dashflash alewif 1
+dashflash alewif muninivykoan 1
+dassez 1
+dassez ba 1
+dassez ba niveau 1
+dassoc 1
+dassoc un nid 1
+dassouplir 1
+dassouplir au 1
+dassouplir au maxim 1
+dassouplir la 1
+dassur 1
+dassur prot 1
+dassur prot eg 1
+dassurer 1
+dassurer la 1
+dassurer laffinit 1
+dassurer qu 1
+dassurer qu tous 1
+dassurer quavec 1
+dassurer quavec un 1
+dassurer quil 1
+dassurer quil nec 1
+dassurer un bon 1
+dastrophysiqu 1
+dastrophysiqu dil 1
+dastrophysiqu dil de 1
+dat 102
+dat aa 1
+dat aa distribut 1
+dat about lin 1
+dat abstract 4
+dat abstract pr 1
+dat acc 6
+dat acc sequ 1
+dat accept 1
+dat accept button 1
+dat acr proc 1
+dat addr 1
+dat alloc 1
+dat an 2
+dat an disc 1
+dat and addr 1
+dat and algorithm 1
+dat and cal 1
+dat and control 3
+dat and dat 1
+dat and exper 1
+dat and funct 1
+dat and knowledg 1
+dat and laser 1
+dat and modif 1
+dat and ncl 1
+dat and numer 1
+dat and object 1
+dat and partit 1
+dat and perform 1
+dat and quer 1
+dat and resourc 1
+dat and sect 1
+dat and signif 1
+dat and symptom 1
+dat and task 1
+dat and tempor 1
+dat and thus 1
+dat and tim 1
+dat and transm 1
+dat ar 4
+dat ar acc 1
+dat ar con 1
+dat ar coupl 1
+dat ar maintain 1
+dat ar nec 1
+dat ar pr 1
+dat ar random 1
+dat ar rectangl 1
+dat ar regl 1
+dat ar separ 1
+dat ar suff 1
+dat arriv 1
+dat arriv tim 1
+dat as cod 1
+dat assoc 2
+dat auxquel 1
+dat auxquel il 1
+dat ba 7
+dat ba manag 2
+dat bal 1
+dat bal dict 1
+dat bank 3
+dat befor st 1
+dat being sent 1
+dat belong 2
+dat between act 1
+dat bit 3
+dat block 2
+dat block destr 1
+dat block en 1
+dat book 1
+dat broadcast 1
+dat buffer 1
+dat by 1
+dat by allow 1
+dat cach 3
+dat cach acc 1
+dat cach av 1
+dat cacheoff 1
+dat cannot chang 1
+dat chunk 1
+dat cluster 1
+dat cluster util 1
+dat collect 1
+dat com 3
+dat commun 3
+dat compar 1
+dat complec 1
+dat complec an 1
+dat complec bound 1
+dat complec result 1
+dat compr 1
+dat compr standard 1
+dat comput 2
+dat comput model 2
+dat con 1
+dat concern 1
+dat cont 1
+dat dat 1
+dat de 1
+dat de prem 1
+dat decl 1
+dat decl stat 1
+dat deliv 1
+dat dep 8
+dat dep an 1
+dat dep ec 1
+dat dep repr 1
+dat dep structur 1
+dat design 1
+dat design docum 1
+dat dic 1
+dat dic ecut 1
+dat dicm 1
+dat distribut 6
+dat distribut accord 1
+dat distribut consider 1
+dat distribut inform 1
+dat distribut schem 1
+dat distribut step 1
+dat distribut tok 1
+dat domain 1
+dat driv 2
+dat driv execut 1
+dat driv principl 1
+dat driv vl 1
+dat du 1
+dat econom 1
+dat el 3
+dat el remain 1
+dat el shar 1
+dat el vol 1
+dat eld 1
+dat encapsl 1
+dat engineer 9
+dat engineer difficult 1
+dat engineer nec 1
+dat engineer problem 1
+dat engineer vol.5 1
+dat entr 1
+dat entr button 1
+dat exchang 2
+dat extract 1
+dat f pr 1
+dat fil 2
+dat fil codif 1
+dat filesm 1
+dat filesm chunk 1
+dat fit 1
+dat flow 7
+dat flow an 1
+dat flow diagram 1
+dat flow graph 1
+dat flow problem 1
+dat flow program 1
+dat flow test 1
+dat follow 1
+dat for as 1
+dat for comparison 1
+dat for dim 1
+dat for killeen 1
+dat for probabil 1
+dat for year 1
+dat format 1
+dat fragm 1
+dat from multipl 1
+dat from p2 1
+dat from pag 1
+dat from structur 1
+dat gather 1
+dat gener 2
+dat gener collect 1
+dat gener random 1
+dat giv 1
+dat ha obv 1
+dat ha sev 1
+dat handl 1
+dat hid 1
+dat improv 1
+dat in constraint 1
+dat in main 1
+dat in ni 1
+dat in ni0 1
+dat in nod 1
+dat in order 2
+dat in sa 1
+dat in secon 1
+dat in tabl 2
+dat in tempor 1
+dat inclus 1
+dat incon 1
+dat incr 2
+dat incr regl 1
+dat incr start 1
+dat ind 1
+dat indep 1
+dat indep behavior 1
+dat inform 2
+dat input 1
+dat input con 1
+dat instead 1
+dat int 2
+dat int appl 1
+dat int main 1
+dat int piec 1
+dat interfer 1
+dat interfer occur 1
+dat interpol 1
+dat is alloc 1
+dat is con 1
+dat is concern 1
+dat is cur 1
+dat is cycl 1
+dat is distribut 1
+dat is equ 1
+dat is giv 1
+dat is hug 1
+dat is inser 1
+dat is mad 1
+dat is model 1
+dat is partit 1
+dat is pr 1
+dat is receiv 2
+dat is reduc 1
+dat is repl 1
+dat is requir 1
+dat is shar 1
+dat is ver 1
+dat it beat 1
+dat item 7
+dat item del 1
+dat item enter 1
+dat item remain 1
+dat item st 1
+dat layout 1
+dat layout decr 1
+dat layout influ 1
+dat le multicast 1
+dat lin 1
+dat lo 2
+dat load 3
+dat load bal 1
+dat load instruc 1
+dat loc 3
+dat loc optim 2
+dat log 1
+dat maintain 1
+dat manag 1
+dat manag complec 1
+dat manipl 1
+dat map 1
+dat member 1
+dat memor 1
+dat memor refer 1
+dat method 1
+dat min 1
+dat min appl 1
+dat model 9
+dat model aspect 1
+dat model not 1
+dat model quantif 1
+dat model suit 1
+dat model support 1
+dat mov 3
+dat mov accr 1
+dat mov induc 1
+dat must preserv 1
+dat network 1
+dat object 2
+dat object mn 1
+dat of block 1
+dat of length 1
+dat of siz 1
+dat of tabl 1
+dat oi 1
+dat oi oi 1
+dat on parallel 1
+dat or aspect 1
+dat or un 1
+dat order 1
+dat order problem 1
+dat over multipl 1
+dat overlap 1
+dat own 1
+dat pa 1
+dat pack 3
+dat pack del 1
+dat pack siz 1
+dat pag 1
+dat parallel 7
+dat parallel algorithm 1
+dat parallel cod 1
+dat parallel execut 1
+dat parallel langu 1
+dat parallel me 1
+dat parallel styl 1
+dat parallel unit 1
+dat parallel var 1
+dat part 2
+dat partit 1
+dat partit approach 1
+dat partit method 1
+dat partit techniqu 1
+dat partit using 1
+dat path 3
+dat path alloc 1
+dat path mak 1
+dat pattern 1
+dat payload 1
+dat per day 1
+dat per unit 1
+dat plac 4
+dat plac optim 1
+dat plac remain 1
+dat point 3
+dat point accord 1
+dat point correspon 1
+dat point predict 1
+dat point spec 1
+dat point using 1
+dat pr 2
+dat prefetch 1
+dat proc 4
+dat proc oper 1
+dat proct 1
+dat produc 1
+dat protect 1
+dat rac 1
+dat rac affect 1
+dat random 1
+dat random select 1
+dat rat 2
+dat read 1
+dat rectangl 1
+dat rectangl indeed 1
+dat rectangl level 1
+dat reduc 1
+dat refer 2
+dat refer behaviour 1
+dat refer pattern 1
+dat refin 1
+dat refin relationship 1
+dat rel 1
+dat relev 1
+dat repl 3
+dat repl step 1
+dat repr 5
+dat repr pressur 1
+dat requir 1
+dat resid 1
+dat respectiv 1
+dat respectiv de 1
+dat result 1
+dat retrief 1
+dat sampl 2
+dat sampl distribut 1
+dat sb 1
+dat scop 1
+dat se 11
+dat se con 3
+dat se court 1
+dat se empl 1
+dat se illustr 1
+dat se rapid 1
+dat se requir 1
+dat se sa 1
+dat se sb 1
+dat se si 1
+dat seem 1
+dat segm 1
+dat segm encl 1
+dat select 1
+dat select criter 1
+dat serv 1
+dat serv using 1
+dat shar 2
+dat shar commun 1
+dat show 2
+dat simultan 1
+dat siz 1
+dat spac 2
+dat spread 1
+dat st 2
+dat st db 1
+dat st def 1
+dat st numdisk 1
+dat st structur 1
+dat stat 1
+dat stream 1
+dat structur 44
+dat structur acc 1
+dat structur assoc 1
+dat structur atom 1
+dat structur becom 1
+dat structur closer 1
+dat structur compon 1
+dat structur con 1
+dat structur contain 4
+dat structur continu 1
+dat structur correspon 1
+dat structur decl 1
+dat structur distinct 1
+dat structur domain 1
+dat structur featur 1
+dat structur gener 1
+dat structur hold 1
+dat structur manipl 1
+dat structur nec 1
+dat structur precompiler 1
+dat structur proct 1
+dat structur seem 1
+dat structur signif 1
+dat structur spac 1
+dat structur st 1
+dat structur suit 1
+dat structur support 1
+dat structur wid 1
+dat system 1
+dat tabl 1
+dat tabl contain 1
+dat tabl start 1
+dat term 1
+dat th prom 1
+dat th sant 1
+dat that compar 1
+dat that result 2
+dat to achief 1
+dat to idl 1
+dat to incr 1
+dat to match 1
+dat to multipl 1
+dat to perform 1
+dat to produc 1
+dat to sen 1
+dat to support 1
+dat to train 1
+dat traff 1
+dat transfer 7
+dat transfer dat 1
+dat transfer rat 1
+dat transfer schem 1
+dat transform 1
+dat transport 1
+dat typ 8
+dat typ ent 1
+dat typ mn 1
+dat typ protect 1
+dat typ sort 1
+dat uncover 1
+dat unnec 1
+dat upd 1
+dat upd serv 1
+dat util 1
+dat util ee 1
+dat valu 3
+dat vect 2
+dat wa gener 2
+dat wa introduc 1
+dat wa scal 1
+dat wer an 1
+dat wer collect 1
+dat wh 1
+dat wh standard 1
+dat which fit 1
+dat wil fit 1
+dat with bi 1
+dat with correl 1
+dat with strong 1
+dat without pag 1
+dat word 1
+dat writ 5
+dat writ acc 1
+dat writ oper 1
+dat writ rat 1
+dat writ suff 1
+dat xor 1
+dat xor ed 1
+dat2 1
+datab 35
+datab a pract 1
+datab acc 1
+datab acc method 1
+datab administer 1
+datab administer want 1
+datab almost doubl 1
+datab an 1
+datab an austr 1
+datab and bind 1
+datab and cod 1
+datab and confirm 1
+datab and consider 1
+datab and constraint 1
+datab and digit 1
+datab and ec 1
+datab and gener 1
+datab and knowledg 3
+datab and knowledgeb 1
+datab and measur 1
+datab and prec 1
+datab and reason 1
+datab and rev 1
+datab and st 1
+datab and transact 1
+datab and upd 1
+datab and vid 1
+datab appl 3
+datab ar segm 1
+datab atom 1
+datab atom forml 1
+datab atom ri 1
+datab attribut 1
+datab attribut x1 1
+datab ba 1
+datab buffer 1
+datab buffer manag 1
+datab buffer manager 1
+datab by using 1
+datab ca 1
+datab challeng 1
+datab chang 1
+datab con 1
+datab concur 1
+datab concur control 1
+datab contain 1
+datab contain fewer 1
+datab could indeed 1
+datab cur 1
+datab cur know 1
+datab d0 1
+datab d1 1
+datab db 1
+datab decr 1
+datab defin 1
+datab degrad 1
+datab degrad subst 1
+datab du 1
+datab eng 1
+datab engineer 2
+datab eval 1
+datab fact 1
+datab fact using 1
+datab faster 1
+datab for annot 1
+datab for fault 1
+datab for run 1
+datab framework 1
+datab funct 1
+datab giv 1
+datab grow 1
+datab however degrad 1
+datab if oe1 1
+datab in a.u 1
+datab in gener 1
+datab in order 1
+datab in q6 1
+datab inclus 1
+datab incr 1
+datab ind 1
+datab inform 1
+datab inform cont 1
+datab input 1
+datab inst 1
+datab is assum 1
+datab is creat 1
+datab is disc 1
+datab is froz 1
+datab is organ 1
+datab is simil 1
+datab is upd 1
+datab langu 1
+datab lock 1
+datab log 1
+datab log program 1
+datab mach 2
+datab mach project 1
+datab maintain 1
+datab manag 7
+datab manag system 5
+datab manager 2
+datab manipl 1
+datab may involut 1
+datab model 2
+datab navig 1
+datab of cnf 1
+datab of color 1
+datab of learner 1
+datab of siz 1
+datab of user 1
+datab on 1
+datab oper 2
+datab oper system 1
+datab output 1
+datab output lp 1
+datab outputdatab 1
+datab outputdatab input 1
+datab pack 1
+datab parameter 1
+datab part 1
+datab perform 2
+datab perform slower 1
+datab perform tun 1
+datab popl 1
+datab pp 1
+datab pr 1
+datab pr andg 1
+datab pr input 1
+datab pr top 1
+datab proc 1
+datab program 3
+datab program langu 1
+datab prov 1
+datab prov enhanc 1
+datab qu 2
+datab qu comput 1
+datab qu langu 1
+datab quer 2
+datab r0 1
+datab r1 1
+datab record 5
+datab record correspon 1
+datab record tim 1
+datab recov 1
+datab rel 1
+datab reorgan 1
+datab reposit 1
+datab repr 1
+datab repr input 1
+datab requir 2
+datab requir join 1
+datab schem 4
+datab schem manipl 1
+datab search 1
+datab secur 1
+datab secur ii 1
+datab secur vi 1
+datab separ 1
+datab server 2
+datab should maxim 1
+datab simp 1
+datab siz 3
+datab siz etc 1
+datab snapshot 1
+datab softwar 1
+datab softwar system 1
+datab st 4
+datab stil perform 1
+datab support 1
+datab support textur 1
+datab syst 2
+datab system 18
+datab system con 1
+datab system deal 1
+datab system gener 1
+datab system ii 1
+datab system research 1
+datab system support 2
+datab technolog 2
+datab ten 1
+datab terminolog 1
+datab th featur 1
+datab th perform 1
+datab that contain 1
+datab that repr 1
+datab theor 3
+datab theor se 1
+datab to determin 1
+datab to ge 1
+datab to publ 1
+datab transact 2
+datab transact built 1
+datab tupl 1
+datab tupl acc 1
+datab tupl impl 1
+datab typ 2
+datab typ ment 1
+datab under tdbm 1
+datab upd 2
+datab upd langu 2
+datab using 2
+datab using attribut 1
+datab using pack 1
+datab using tupl 1
+datab using var 1
+datab view 1
+datab wa init 1
+datab we refer 1
+datab wh 1
+datab wh record 1
+datab which car 1
+datab which maintain 1
+datab which support 1
+datab which us 1
+datab wil allow 1
+datab with incompl 1
+datab with integr 1
+datab with transact 1
+datab workload 1
+datab workload specif 1
+datab would converg 1
+datadisk 1
+datadistribut 1
+datadistribut datadistributiondefinit 1
+datadistribut workload 1
+datadistribut workload descript 1
+datadistributiondefinit 1
+datadistributiondefinit datadistribut 1
+datadistributiondefinit datadistribut datadistributiondefinit 1
+dataflow 7
+dataflow an 1
+dataflow and controlflow 1
+dataflow architectur 2
+dataflow comput 2
+dataflow comput len 1
+dataflow comput offer 1
+dataflow computer 1
+dataflow environm 1
+dataflow graph 3
+dataflow graph annot 1
+dataflow graph map 1
+dataflow graph not 1
+dataflow implem 2
+dataflow implem using 1
+dataflow inspir 1
+dataflow inspir graph 1
+dataflow langu 1
+dataflow langu luc 1
+dataflow mach 2
+dataflow mach run 1
+dataflow model 2
+dataflow oper 1
+dataflow principl 1
+dataflow program 1
+dataflow program langu 1
+dataflow subsum 1
+dataflow subsum von 1
+dataflow terminolog 1
+dataflowinspir 1
+dataflowinspir conv 1
+datagram 2
+datagram deliv 1
+datagram deliv serv 1
+datalog 1
+datalog boolean 1
+datalog boolean equ 1
+datalog bottom 1
+datalog ca 1
+datalog constraint 1
+datalog constraint program 1
+datalog deriv 1
+datalog deriv tr 1
+datalog framework 1
+datalog na 1
+datalog na bottom 1
+datalog not 1
+datalog program 1
+datalog qu 1
+datalog qu program 1
+datalog quer 1
+datalog rl 1
+datalog with boolean 1
+datalog with constraint 1
+datalog with den 1
+datalog with finit 1
+datalog with polynom 1
+datam 1
+datanpncdatanpncdatanpncdatanpncdatanpncdatanpncdatanpncfirstpfirstcl 1
+datanpncdatanpncdatanpncdatanpncdatanpncdatanpncdatanpncfirstpfirstcl stp 1
+datanpncdatanpncdatanpncdatanpncdatanpncfirstpfirstclastp 1
+datapartit 1
+datapath 1
+datapath alloc 1
+datasystemer 1
+datatyp 1
+datent 1
+datent de 1
+datent de la 1
+datenverarbeitung 2
+datl 1
+datl anatomiqu 1
+datl anatomiqu qu 1
+datm 1
+datteint 1
+datteint dun 1
+datteint dun tel 1
+dattendr 1
+dattendr del 1
+dattendr del montr 1
+dattract 1
+dattrait 1
+dattrait dan 1
+dattrait dan le 1
+dattribuer 2
+dattribuer a deux 1
+dattribuer un 1
+dattribuer un probabilit 1
+datum 3
+dau 2
+dau moin 2
+dau moin deux 1
+daubech 2
+daubech orthonorm 1
+daubech orthonorm wavel.3 1
+daubign 1
+daucun 1
+daucun l ment 1
+daugmenter 3
+daugmenter la 1
+daugmenter la fr 1
+daugmenter la valeur 1
+daugmenter le 2
+daugmenter le chanc 1
+daugmenter le par 1
+daugmenter le part 1
+daugmenter son 1
+daugmenter son efficacit 1
+dauror 1
+daut 3
+daut meilleur 2
+daut meilleur qu 2
+daut plus complec 1
+daut plus deffort 1
+daut plus efficac 1
+daut plus signif 1
+daut plus ten 1
+dautomatiqu 1
+dautomatiqu de 1
+dautomatiqu de grenobl 1
+dautoriser 1
+dautoriser la 1
+dautoriser la cr 1
+dautr 5
+dautr adr 1
+dautr adr de 1
+dautr appl 1
+dautr appl sont 1
+dautr approch 1
+dautr b en 1
+dautr beaucoup 1
+dautr ca 1
+dautr caract 1
+dautr caract ristiqu 1
+dautr ch 1
+dautr ch sont 1
+dautr configur 1
+dautr coupur 1
+dautr coupur dan 1
+dautr el 1
+dautr el ement 1
+dautr fuseaux 1
+dautr fuseaux potentiel 1
+dautr horizon 1
+dautr impl 1
+dautr impl em 1
+dautr ind 1
+dautr ind sont 1
+dautr interpr 1
+dautr interpr etat 1
+dautr lang 1
+dautr lang de 1
+dautr m ecan 1
+dautr man 1
+dautr manuel 1
+dautr op 3
+dautr op erat 1
+dautr op erateur 1
+dautr op rat 1
+dautr opt 1
+dautr opt ec 1
+dautr ouvr 1
+dautr ouvr ont 1
+dautr part 5
+dautr part ce 1
+dautr part chaqu 1
+dautr part de 2
+dautr part dun 1
+dautr part fournir 1
+dautr part il 1
+dautr part la 1
+dautr part laugm 1
+dautr part le 1
+dautr part parc 1
+dautr part po 1
+dautr part si 1
+dautr part un 1
+dautr processeur 1
+dautr propr 1
+dautr pseud 1
+dautr pseud pr 1
+dautr quest 1
+dautr quun 1
+dautr quun fus 1
+dautr quun imag 1
+dautr r ef 1
+dautr solut 1
+dautr solut sont 1
+dautr structur 1
+dautr structur de 1
+dautr techniqu 2
+dautr techniqu fa 1
+dautr techniqu tel 1
+dautr tel 1
+dautr tel qu 1
+dautr term 2
+dautr term comp 1
+dautr transform 1
+dautr transform de 1
+dautr travaux 1
+dautr travaux ont 1
+dautr typ 1
+dav 15
+dav and keith 1
+dav and putnam 1
+dav and r.m 1
+dav de 1
+dav de contraint 1
+dav de me 1
+dav dhypoth 1
+dav dhypoth es 1
+dav particl 1
+dav pour 1
+dav pour de 1
+dav putnam 1
+dav putnam algorithm 1
+dav putnam procedur 1
+dav refer 1
+dav taylor 1
+dav93 2
+davenport 3
+david 28
+david aspin 1
+david barn 1
+david bog 1
+david cohn 1
+david derour 1
+david h.c 1
+david hawk 1
+david kuck 1
+david nakahir 1
+david nicol 1
+david notkin 1
+david parn 1
+david pearson 1
+david turner 1
+david turner help 1
+david ungar 3
+david ungar rec 1
+david wonnacot 1
+david yang 1
+davidor 2
+davidor and ben 1
+davidson 1
+davin 2
+davison 2
+davoir 4
+davoir accept 1
+davoir d ej 1
+davoir de 1
+davoir de estim 1
+davoir lieu 1
+davoir un 1
+davoir un ensembl 1
+davoir un instruc 1
+davood 1
+dawid 1
+dawid univer colleg 1
+dawson 1
+daxer 1
+daxer se 1
+daxer se effort 1
+day 20
+day and last 1
+day and michael 1
+day exper 1
+day lif 1
+day month 1
+day month order 1
+day month year 1
+day not 1
+day of comput 1
+day of computer 1
+day offer 1
+day risc 1
+day risc proc 1
+day switch 1
+day tim 1
+day year 1
+day year order 1
+dayan 1
+dayan and sejnowsk 1
+dayhoff 1
+db 6
+db acc 1
+db acc cal 1
+db buffer 1
+db buffercpu 1
+db cal 1
+db cal tx 1
+db cold 1
+db disk 1
+db dm 1
+db dm cal 1
+db fil 1
+db hot 1
+db siz 1
+db upd 1
+db upd becom 1
+db2 1
+db2 parallel 1
+db2 parallel edit 1
+dbaderg 1
+dbaderg umiac.umd.edu 1
+dbcub 2
+dblog3 1
+dblog3 tc 1
+dblog3 tc t3 1
+dbm 5
+dbm datab 1
+dbm datab manag 1
+dbm follow 1
+dbm perform 1
+dbm perform cockpit 1
+dbm softwar 1
+dbm softwar layout 1
+dbm synth 1
+dbm using 1
+dbobjlock 1
+dbobjlock dbobjlock 1
+dbobjlock translock 1
+dbp 1
+dbp model 1
+dbtmin 1
+dbus 1
+dbus at 1
+dbus cbus 1
+dbus cbus abus 1
+dbus pbus 1
+dbus pbus pbus 1
+dc 6
+dc rr 1
+dc valu 1
+dc.ed.ac.uk 1
+dc.warwick.ac.uk 1
+dcb 1
+dcc 1
+dcr 1
+dct 2
+dct algorithm 1
+dct an attract 1
+dct and wavel 1
+dct cod 1
+dct cod imag 1
+dct coeff 1
+dct coeff ba 1
+dct compr 2
+dct compr imag 1
+dct compr vid 1
+dct follow 1
+dct mand 1
+dct mand subband 1
+dct mand transform1 1
+dct mand. 1
+dct transform 1
+dd 3
+dd ns 1
+dd12 1
+dd1234 1
+dd34 1
+dd78 1
+dd87 1
+dd910 1
+dd95 1
+ddim 1
+ddim hyperoctr 1
+ddimitr.ps 1
+ddm 1
+ddm wh 1
+ddm wh dd 1
+ddmksr 1
+ddp 1
+ddp is gener 1
+ddp is solut 1
+ddpm 1
+ddpm for structur 1
+ddpm is gener 1
+ddpm is solut 1
+ddpm th actu 1
+ddsep 1
+de 51
+de 16mo 1
+de 16mo ext 1
+de 2kd 1
+de 2kd el 1
+de 2r 1
+de a aient 1
+de a de 1
+de a dind 1
+de a est 1
+de a la 1
+de a par 1
+de a perm 1
+de a qu 1
+de a ta 1
+de a.g 1
+de absc 1
+de absc ma 1
+de acc 2
+de acc es 2
+de acquisit 1
+de acquisit en 1
+de act 1
+de act pa 1
+de adr 2
+de adr contigu 1
+de adr cr 1
+de adr de 1
+de adr pa 1
+de adr vo 1
+de ae 1
+de aeou 1
+de aeou dan 1
+de ag 1
+de ag au 1
+de ag dan 1
+de ag don 1
+de ag est 1
+de ag fon 1
+de ag offr 1
+de ag pour 1
+de ag qu 1
+de aik 2
+de aik mod 1
+de ak 1
+de ak0k 1
+de ak0k entr 1
+de algorithm 4
+de algorithm classiqu 1
+de algorithm de 3
+de algorithm est 1
+de algorithm qu 1
+de alloc 1
+de altern 1
+de altern possibl 1
+de am elior 2
+de ambigu 1
+de amer 1
+de an 1
+de an ee 1
+de angl 1
+de appel 1
+de appel au 1
+de appel aux 1
+de appel de 1
+de appel pr 1
+de appl 3
+de appl non 1
+de appl qu 1
+de approch 1
+de approch de 1
+de approch dhybrid 1
+de arc 1
+de arc du 1
+de arc entr 1
+de architectur 3
+de architectur en 1
+de architectur par 1
+de architectur simd 1
+de architectur sont 1
+de argum 1
+de argum au 1
+de argum con 1
+de argum dappel 1
+de argum de 1
+de argum du 1
+de argum en 1
+de argum est 1
+de argum temporair 1
+de articl 1
+de aspect 1
+de aspect ba 1
+de aspect op 1
+de asser 1
+de asser de 1
+de at tim 1
+de atom 1
+de atout 1
+de atout import 1
+de attr2 1
+de attribut 2
+de attribut affect 1
+de attribut de 1
+de attribut est 1
+de aut 1
+de aut ef 1
+de autr 3
+de autr acc 1
+de autr point 1
+de autr register 1
+de autr syst 1
+de auxil 1
+de avant 1
+de b colon 1
+de b est 1
+de b ezout 1
+de b lib 1
+de b pag 1
+de ba 4
+de ba avec 1
+de ba dan 1
+de ba de 3
+de ba dun 1
+de ba la 1
+de ba niveau 2
+de ba pour 4
+de ba soient 1
+de ba sont 2
+de ba sur 1
+de ba4 1
+de ba4 de 1
+de baker 1
+de bal 1
+de bal entr 1
+de banerj 1
+de beaulieu 1
+de bekker 1
+de bien 2
+de bien appr 1
+de bien avoir 1
+de bien comprendr 1
+de bien mettr 1
+de biject 1
+de biject de 1
+de binprolog 1
+de bit 1
+de bit de 1
+de bit en 1
+de bl 1
+de bloc 2
+de bloc de 2
+de bloc diff 1
+de bloc dind 1
+de bloc dit 1
+de bloc entr 1
+de bloc est 1
+de bloc le 1
+de bloc oconsc 1
+de bloc optim 1
+de bloc sont 1
+de boer 1
+de boizumault 1
+de boizumault sur 1
+de bon 3
+de bon fonct 1
+de bon perform 1
+de bord 2
+de bord ce 1
+de bord inattendus 1
+de bord int 1
+de bord pouv 1
+de born 1
+de born 3j 1
+de born de 1
+de born du 1
+de born exact 1
+de born inf 1
+de born th 1
+de bossch 1
+de boucl 1
+de boucl 1d 1
+de boucl ain 1
+de boucl apr 1
+de boucl au 1
+de boucl car 1
+de boucl concern 1
+de boucl cont 1
+de boucl correspon 1
+de boucl dan 1
+de boucl de 1
+de boucl doiv 1
+de boucl du 1
+de boucl dun 1
+de boucl en 1
+de boucl est 1
+de boucl etant 1
+de boucl etc 1
+de boucl etud 1
+de boucl excessiv 1
+de boucl fin 1
+de boucl init 1
+de boucl issus 1
+de boucl ne 1
+de boucl nest 1
+de boucl ninterd 1
+de boucl non 1
+de boucl obtenu 1
+de boucl ont 1
+de boucl ou 1
+de boucl pa 1
+de boucl par 1
+de boucl par. 1
+de boucl parfait 1
+de boucl perm 1
+de boucl peut 1
+de boucl peuv 1
+de boucl pour 1
+de boucl pr 1
+de boucl qu 1
+de boucl similair 1
+de boucl sont 1
+de boucl suiv 1
+de boucl suppl 1
+de boucl sur 1
+de boucl tel 1
+de boucl transform 1
+de boucl vi 1
+de boucl vid 1
+de bp 1
+de bp deep 1
+de branch 2
+de branch conditionnel 1
+de branch im 1
+de branch jump 1
+de branch retard 1
+de branch try 1
+de bruin 1
+de bruit 1
+de bruit homog 1
+de bruit ind 1
+de bruit sur 1
+de but 1
+de but arithm 1
+de but contradictoir 1
+de but cut 1
+de but dan 1
+de but es 1
+de but est 1
+de but fait 1
+de but gel 1
+de but par 1
+de but pr 1
+de but ren 1
+de but suiv 1
+de but sur 1
+de c ot 2
+de c1 3
+de c1 est 1
+de c1 ne 1
+de c1 suiv 1
+de c11 1
+de c2 1
+de c2 est 1
+de c2 ne 1
+de ca 4
+de ca de 2
+de ca le 1
+de ca possibl 1
+de ca un 1
+de cach 2
+de cach adjac 1
+de cach de 1
+de cach du 1
+de cach etant 1
+de cach locaux 1
+de cach ou 1
+de cach si 1
+de cal 1
+de calcl 6
+de calcl afin 1
+de calcl alg 1
+de calcl arithm 1
+de calcl augm 1
+de calcl bien 1
+de calcl comp 1
+de calcl compr 1
+de calcl de 1
+de calcl dev 1
+de calcl dun 1
+de calcl est 3
+de calcl num 1
+de calcl par 1
+de calcl perm 1
+de calcl pouv 1
+de calcl qu 1
+de calcl risqu 1
+de calcl seffectueront 1
+de calcl sp 1
+de calcl suppl 1
+de calcl sur 1
+de calcl tc 1
+de calcl travail 1
+de calcl un 1
+de calculateur 1
+de calculateur sisd 1
+de calculer 3
+de calculer de 1
+de calculer le 2
+de calculer pr 1
+de calculer tout 1
+de capacit 2
+de capacit es 1
+de captur 1
+de captur du 1
+de capturer 1
+de capturer ladr 1
+de capturer le 1
+de caract 4
+de caract er 2
+de caract eristiqu 2
+de caract ristiqu 1
+de cardin 2
+de carlin 1
+de cart 1
+de cart exponentiel 1
+de cat 1
+de cat egor 1
+de catalun 1
+de ce 8
+de ce accr 1
+de ce adjectif 1
+de ce adr 1
+de ce algorithm 3
+de ce allong 1
+de ce an 1
+de ce appel 1
+de ce approch 1
+de ce architectur 1
+de ce argum 1
+de ce articl 1
+de ce aspect 1
+de ce attribut 1
+de ce bar 1
+de ce boucl 1
+de ce branch 1
+de ce ca 1
+de ce caract 1
+de ce cel 1
+de ce ch 2
+de ce chapitr 2
+de ce chiffr 1
+de ce cl 2
+de ce claus 1
+de ce colon 1
+de ce condit 1
+de ce configur 1
+de ce conflit 1
+de ce const 1
+de ce courb 1
+de ce dern 3
+de ce descript 1
+de ce deux 3
+de ce difficult 1
+de ce docum 2
+de ce domain 1
+de ce don 1
+de ce doubl 1
+de ce ecritur 1
+de ce el 1
+de ce enregister 1
+de ce ensembl 1
+de ce environ 2
+de ce espac 1
+de ce etud 1
+de ce exp 2
+de ce expr 1
+de ce ext 1
+de ce fait 1
+de ce fonct 3
+de ce form 2
+de ce forml 1
+de ce genr 1
+de ce grand 1
+de ce incr 1
+de ce inform 1
+de ce instruc 2
+de ce lo 1
+de ce mach 1
+de ce manuscrit 1
+de ce matr 2
+de ce mesur 1
+de ce minim 1
+de ce mod 1
+de ce modif 2
+de ce mut 1
+de ce nid 1
+de ce nombr 1
+de ce noyau 1
+de ce obj 3
+de ce op 2
+de ce organ 1
+de ce pa 1
+de ce pag 1
+de ce paragraph 1
+de ce param 1
+de ce part 3
+de ce partit 1
+de ce ph 1
+de ce pil 1
+de ce point 1
+de ce pol 1
+de ce pr 1
+de ce prem 1
+de ce primitiv 1
+de ce princip 1
+de ce probabilit 1
+de ce probl 4
+de ce processeur 1
+de ce program 1
+de ce proposit 1
+de ce propr 2
+de ce protocol 1
+de ce pseud 1
+de ce qu 1
+de ce recherch 1
+de ce register 1
+de ce repr 1
+de ce sch 1
+de ce sect 1
+de ce seuil 1
+de ce sit 1
+de ce solut 1
+de ce strat 1
+de ce structur 2
+de ce support 1
+de ce suppr 1
+de ce syst 1
+de ce tableau 1
+de ce techniqu 2
+de ce technolog 1
+de ce term 1
+de ce test 1
+de ce text 1
+de ce th 3
+de ce tr 1
+de ce transform 1
+de ce travail 1
+de ce travaux 1
+de ce typ 2
+de ce valeur 1
+de ce var 2
+de ce variabl 1
+de ce vecteur 1
+de ce ver 1
+de ce zon 1
+de cel 3
+de cel allou 1
+de cel ci 2
+de cel con 1
+de cel de 2
+de cel diff 1
+de cel du 1
+de cel encor 1
+de cel ind 1
+de cel modif 1
+de cel vr 1
+de celu 3
+de celu ci 2
+de celu de 1
+de cent 1
+de cent oct 1
+de centraliser 2
+de centraliser dan 1
+de centraliser la 1
+de cerf 1
+de certain 3
+de certain argum 1
+de certain ch 1
+de certain champ 1
+de certain claus 1
+de certain crit 1
+de certain de 1
+de certain op 2
+de certain program 1
+de certain typ 1
+de ceux 2
+de ceux ci 1
+de ceux de 1
+de ceuxc 1
+de ch 2
+de ch abstrait 1
+de ch afin 1
+de ch ain 1
+de ch ait 1
+de ch assoc 1
+de ch attach 1
+de ch aut 1
+de ch avant 1
+de ch avec 1
+de ch cibl 1
+de ch com 1
+de ch compl 1
+de ch con 1
+de ch concr 1
+de ch consid 1
+de ch construit 1
+de ch corp 1
+de ch correpon 1
+de ch correspon 1
+de ch cour 1
+de ch cour3 1
+de ch cr 1
+de ch dan 1
+de ch de 1
+de ch demand 1
+de ch devrait 1
+de ch diff 1
+de ch dind 1
+de ch dispar 1
+de ch doit 1
+de ch don 1
+de ch du 1
+de ch ec 1
+de ch effectu 1
+de ch en 1
+de ch enregister 1
+de ch entr 1
+de ch entrem 1
+de ch est 1
+de ch etant 1
+de ch evit 1
+de ch fait 1
+de ch faux 1
+de ch imp 1
+de ch in 1
+de ch incr 1
+de ch inv 1
+de ch jug 1
+de ch jusqu 1
+de ch le 1
+de ch lib 1
+de ch lor 1
+de ch ma 1
+de ch na 1
+de ch nait 1
+de ch ne 1
+de ch nest 1
+de ch ninterv 1
+de ch occup 1
+de ch ont 1
+de ch ou 1
+de ch par 1
+de ch partiel 1
+de ch peut 1
+de ch peuv 1
+de ch port 1
+de ch potentiel 1
+de ch pour 1
+de ch pr 1
+de ch profon 1
+de ch qu 1
+de ch rempl 1
+de ch ren 1
+de ch requ 1
+de ch rest 1
+de ch sappliqu 1
+de ch sauvegard 1
+de ch sav 1
+de ch sen 1
+de ch seront 1
+de ch soient 1
+de ch soit 1
+de ch sont 1
+de ch sp 1
+de ch standard 1
+de ch successif 1
+de ch suiv 1
+de ch sup 1
+de ch superficiel 1
+de ch sur 1
+de ch syst 1
+de ch tel 1
+de ch uniqu 1
+de ch virtuel 1
+de ch vr 1
+de chacun 1
+de chacun de 1
+de champ 2
+de champ argum 1
+de champ bp 1
+de champ continu 1
+de champ dappl 1
+de champ de 1
+de champ don 1
+de champ du 1
+de champ pr 1
+de champ sp 1
+de chanc 1
+de chang 2
+de chang de 2
+de chang import 1
+de chang sous 1
+de changer 2
+de changer le 2
+de chapitr 1
+de chapitr suiv 1
+de chaqu 3
+de chaqu acc 1
+de chaqu boucl 1
+de chaqu champ 1
+de chaqu cl 1
+de chaqu claus 1
+de chaqu individu 1
+de chaqu instruc 1
+de chaqu nid 1
+de chaqu noeud 1
+de chaqu particl 1
+de chaqu point 1
+de chaqu processeur 1
+de chaqu segm 1
+de chaqu treil 1
+de chaqu typ 1
+de chaqu var 1
+de charg 1
+de charg correct 1
+de charg dan 1
+de charg entr 1
+de charg etc 1
+de charg lor 1
+de charg quand 1
+de charg quel 1
+de chemin 1
+de chemin lor 1
+de chemin se 1
+de chemin sug 1
+de cheng 1
+de cherch 1
+de cherch quand 1
+de choisir 2
+de choisir la 1
+de choisir le 1
+de cholesk 1
+de cholesk pour 1
+de chromosom 1
+de chromosom de 1
+de chromosom humain 1
+de chromosom ou 1
+de chromosom produit 1
+de chromosom sur 1
+de ci 1
+de cibl 1
+de cibl de 1
+de circuit 1
+de circuit int 1
+de citer 1
+de citer le 1
+de cl 2
+de cl de 2
+de clarif 1
+de clarif certain 1
+de classif 3
+de classif le 1
+de classif lensembl 1
+de classif pour 1
+de classioc 1
+de claus 1
+de claus afin 1
+de claus appar 1
+de claus au 1
+de claus auxiliair8 1
+de claus candid 1
+de claus complec 1
+de claus correspon 1
+de claus de 1
+de claus echou 1
+de claus est 1
+de claus famil 1
+de claus nest 1
+de claus ni 1
+de claus non 1
+de claus par 1
+de claus partag 1
+de claus peut 1
+de claus pour 1
+de claus qu 1
+de claus relativ 1
+de claus sont 1
+de claus suiv 1
+de claus uniqu 1
+de claus100 1
+de cluster 1
+de co 1
+de co ut 1
+de cod 3
+de cod binair 1
+de cod compil 1
+de cod correspon 1
+de cod de 2
+de cod du 1
+de cod eml 1
+de cod engendr 1
+de cod entr 1
+de cod interdit 1
+de cod loop 1
+de cod multidimensionnel 1
+de cod natif 1
+de cod par 1
+de cod produit 1
+de cod qu 1
+de cod seffectu 1
+de cod sourc 1
+de cod sp 1
+de cod supprim 1
+de cod transform 1
+de cod wam 1
+de coeff 1
+de coeff de 1
+de cof 1
+de cof perm 1
+de cofacteur 1
+de coh 2
+de coh er 2
+de col 1
+de col entr 1
+de collect 1
+de collect de 1
+de colmerauer 1
+de colon 1
+de colon de 1
+de colon du 1
+de colon espac 1
+de colon etant 1
+de colon ma 1
+de colon sur 1
+de combinaison 1
+de combinaison lin 1
+de combiner 2
+de combiner attribut 1
+de combiner deux 1
+de combiner le 1
+de combiner support 1
+de commencer 1
+de commencer la 1
+de commerc 1
+de common 1
+de common lisp 1
+de commun 3
+de commun com 1
+de commun cr 1
+de commun de 1
+de commun doit 1
+de commun dur 1
+de commun effectif 1
+de commun entr 2
+de commun est 1
+de commun issu 1
+de commun mod 1
+de commun ne 1
+de commun par 1
+de commun pen 1
+de commun perm 1
+de commun possibl 1
+de commun pour 1
+de commun qu 1
+de commun raison 1
+de comp 2
+de comp de 1
+de comp du 2
+de comp dun 1
+de comp electroniqu 1
+de comp import 1
+de compact 1
+de compact de 1
+de comparaison 3
+de comparaison de 1
+de comparaison est 1
+de comparer 3
+de comparer au 1
+de comparer ce 2
+de comparer le 1
+de comparer leur 1
+de comparer notr 1
+de comparer quantitativ 1
+de compil 2
+de compil afin 1
+de compil arithm 1
+de compil de 1
+de compil du 1
+de compil est 1
+de compil glob 1
+de compil na 1
+de compil qu 1
+de compil sembl 1
+de compil sint 1
+de compil util 1
+de compil writ 1
+de compiler 1
+de compiler de 1
+de compiler la 1
+de compiler le 1
+de compl 2
+de compl ement 1
+de compl ementer 1
+de compl eter 1
+de complexit 2
+de compliquer 1
+de compliquer lop 1
+de comport 1
+de comport de 1
+de comport sont 1
+de composit 1
+de composit ne 1
+de compr 1
+de compr de 1
+de comprendr 1
+de comprendr com 1
+de comprendr le 1
+de comprom 1
+de computador 1
+de computador oferecem 1
+de con 5
+de con equ 2
+de con tr 3
+de conc 1
+de concat 1
+de concept 3
+de concept de 2
+de concept diff 1
+de concept en 1
+de concept excessiv 1
+de concept quil 1
+de concept tel 1
+de concevoir 2
+de concevoir dautr 1
+de concevoir de 2
+de concil 1
+de conclur 1
+de conclur quil 1
+de conclus 1
+de condit 3
+de condit act 1
+de condit appel 1
+de condit similair 1
+de conduir 2
+de conf 1
+de conf accept 1
+de conf gaus 1
+de conf significatif 1
+de configur 1
+de configur init 1
+de configur proportionnel 1
+de confirm 1
+de confirm lorsquil 1
+de conflit 2
+de conflit correspon 1
+de conflit dacc 2
+de conflit de 1
+de conflit dur 1
+de conflit effectu 1
+de conflit en 1
+de conflit entr 1
+de conflit est 1
+de conflit evit 1
+de conflit ma 1
+de conflit nous 1
+de conflit pa 1
+de conflit par 1
+de conflit pen 1
+de conflit perm 1
+de conflit qu 1
+de conflit sont 1
+de conflit sur 1
+de conflit val 1
+de conflit var 1
+de congru 1
+de congru adm 1
+de congru de 1
+de congru doiv 1
+de congru est 1
+de congru issu 1
+de congru modl 1
+de congru ni 1
+de congru sont 1
+de congru sur 1
+de conjonct 1
+de conserver 1
+de conserver le 1
+de consid 2
+de consid erat 1
+de consid erer 2
+de consom 2
+de const 2
+de const ent 1
+de const ou 1
+de construc 2
+de construc com 1
+de construc conditionnel 1
+de construc dun 1
+de construc imbriqu 1
+de construir 3
+de construir de 2
+de construir la 1
+de construir un 1
+de cont 1
+de cont dan 1
+de context 1
+de continu 1
+de continu au 1
+de continu bien 1
+de continu ca 1
+de continu contraint 1
+de continu cp 1
+de continu cr 1
+de continu de 1
+de continu du 1
+de continu est 1
+de continu il 1
+de continu na 1
+de continu ne 1
+de continu nest 1
+de continu ni 1
+de continu peut 1
+de continu pour 1
+de continu sont 1
+de continu sur 1
+de continuer 1
+de continuer la 1
+de continuer lec 1
+de contour 1
+de contour de 1
+de contourner 1
+de contourner ce 1
+de contr 3
+de contr ol 3
+de contr oler 2
+de contracter 1
+de contracter le 1
+de contraint 3
+de contraint concern 1
+de contraint de 1
+de contraint imp 1
+de contraint li 1
+de contraint ne 1
+de contraint peut 1
+de contraint redon 1
+de contraint suppl 1
+de contraint sur 1
+de control 1
+de conv 1
+de conv util 1
+de conver 1
+de conver dadr 1
+de converg 1
+de convexit 1
+de cooper 1
+de coord 1
+de coord acoustiqu 1
+de coordon 1
+de coordon ee 1
+de cop 2
+de cop de 1
+de cop du 1
+de cop en 1
+de cop loc 1
+de cop multipl 1
+de corollair 1
+de corollair import 1
+de corollair int 1
+de corriger 1
+de corriger le 1
+de coup 2
+de coup de 1
+de coup par 1
+de couper 1
+de couper de 1
+de couper le 1
+de coupl 2
+de coupl de 1
+de coupl dent 1
+de coupl distinct 1
+de coupur 3
+de coupur appar 1
+de coupur apr 1
+de coupur au 1
+de coupur aurait 1
+de coupur calcl 1
+de coupur claus 1
+de coupur com 1
+de coupur correspon 1
+de coupur dan 1
+de coupur de 3
+de coupur dev 1
+de coupur doit 1
+de coupur du 1
+de coupur en 1
+de coupur entr 1
+de coupur est 1
+de coupur exotiqu 1
+de coupur glob 1
+de coupur hypoth 1
+de coupur jou 1
+de coupur jusquau 1
+de coupur la 1
+de coupur loc 1
+de coupur multipl 1
+de coupur na 1
+de coupur nest 1
+de coupur nutil 1
+de coupur perm 1
+de coupur peut 1
+de coupur peuv 1
+de coupur point 1
+de coupur pr 1
+de coupur primitif 1
+de coupur propr 1
+de coupur qu 1
+de coupur ren 1
+de coupur soit 1
+de coupur stan. 1
+de coupur standard 1
+de coupur suiv 1
+de coupur superficiel 1
+de coupur tant 1
+de coupur termin 1
+de coupur va 1
+de coupur voir 1
+de coupur vont 1
+de courb 1
+de court 2
+de court circuit 1
+de court longueur 1
+de courtcircuit 1
+de courtcircuit anticip 1
+de couvrir 1
+de covar 1
+de covar du 1
+de covar sym 1
+de cr 3
+de cr classiqu 1
+de cr eat 3
+de cr eer 2
+de cr est 1
+de cr glob 1
+de cr issu 1
+de cr loc 1
+de cr ne 1
+de cr ou 1
+de cr pc 1
+de cr peut 1
+de cr prendr 1
+de cr qu 1
+de cr sp 1
+de crit 2
+de crit er 2
+de cut 1
+de cycl 1
+de cylindr 1
+de d ec 1
+de d ecaler 1
+de d eceler 1
+de d ecider 2
+de d ecl 1
+de d eclench 1
+de d ecod 1
+de d ecoup 1
+de d ecr 1
+de d ecrir 3
+de d eduir 1
+de d efail 1
+de d efaut 3
+de d efinir 3
+de d efinit 1
+de d egager 1
+de d egrad 1
+de d el 1
+de d emontrer 2
+de d ep 2
+de d epart 3
+de d epen 1
+de d epiler 1
+de d eplacer 1
+de d er 1
+de d eriv 1
+de d es 1
+de d etail 2
+de d etecter 1
+de d eterm 1
+de d etermin 1
+de d eterminer 3
+de d etr 1
+de d evelop 1
+de d faut 1
+de d grad 1
+de d le 1
+de d onir 1
+de d onit 1
+de d pgcd 1
+de d riv 1
+de d tecter 1
+de d terminer 1
+de d velop 1
+de d velopper 2
+de dan 1
+de dan le 1
+de dappar 1
+de darwin 1
+de darwin sur 1
+de de 4
+de de ce 1
+de de jong 1
+de de pa 1
+de de. 1
+de dealloc 1
+de dealloc est 1
+de debr 1
+de degr 1
+de degr es 1
+de delaun 1
+de delaun appliqu 1
+de delaun de 1
+de dem 2
+de dem largeur 1
+de densit 1
+de dern 1
+de dern maillon 1
+de desc 2
+de desc de 2
+de desc doptim 1
+de desc nutil 1
+de descript 1
+de deux 5
+de deux boucl 1
+de deux ca 1
+de deux ce 1
+de deux cel 1
+de deux claus 1
+de deux colon 1
+de deux configur 1
+de deux constat 1
+de deux em 1
+de deux ent 1
+de deux facteur 1
+de deux fo 1
+de deux imag 1
+de deux individus 1
+de deux man 1
+de deux nid 1
+de deux nouvel 1
+de deux ordonnanc 1
+de deux parent 1
+de deux part 1
+de deux point 1
+de deux prem 1
+de deux processeur 1
+de deux register 1
+de deux sect 1
+de deux techniqu 1
+de deux term 1
+de deux valeur 2
+de deux variabl 2
+de deux vecteur 1
+de deux ver 1
+de devoir 1
+de devoir strict 1
+de diaz 1
+de dic 1
+de dic an 1
+de dic dern 1
+de diff 3
+de diff erent 3
+de differ 1
+de differ typ 1
+de difficult 3
+de difficult es 3
+de diffus 2
+de diffus de 1
+de diffus dun 1
+de diffus sur 1
+de diffuser 1
+de diffuser de 1
+de dilat 1
+de dilat de 1
+de dilat du 1
+de dim 4
+de dim au 1
+de dim compatibl 1
+de dim deux 2
+de dim quelconqu 1
+de diminuer 2
+de diminuer aus 1
+de diminuer la 1
+de diminuer le 1
+de dir 1
+de dir quil 1
+de direct 3
+de direct conjugu 1
+de direct de 1
+de direct manipuler 1
+de directiv 1
+de directiv de 1
+de disj 1
+de disjonct 1
+de disjonct correspondrait 1
+de disjonct en 1
+de disjonct ou 1
+de disjonct rencontr 1
+de disjonct sous 1
+de disponibilit 1
+de disposer 1
+de disposer de 1
+de dispositif 1
+de dispositif electroniqu 1
+de dissembl 1
+de dissimilarit 1
+de dist 3
+de dist de 1
+de dist inter 1
+de dist rieman 1
+de distinguer 2
+de distinguer ce 1
+de distinguer deux 1
+de distinguer entr 1
+de distinguer le 1
+de distribuer 1
+de distribuer la 1
+de distribut 2
+de distribut de 2
+de distribut du 1
+de distribut est 1
+de distribut init 1
+de div 1
+de div ent 1
+de div eucl 1
+de diver 2
+de diver don 1
+de diversit 1
+de dj 1
+de do 1
+de do dun 1
+de doctorat 2
+de doctorat detat 1
+de domain 3
+de domain aus 1
+de domain dit 1
+de domain ent 1
+de domain fin 1
+de domain technologiqu 1
+de don 4
+de don ee 3
+de don es 2
+de donner 2
+de donner de 1
+de donner ic 1
+de dp 1
+de dp temp 1
+de dpl 1
+de drapeaux 1
+de drapeaux peut 1
+de drapeaux superficiel 1
+de droit 2
+de droit dacc 1
+de droit de 1
+de droit en 1
+de ducateur 1
+de dun 1
+de dun certain 1
+de dupl 1
+de dupl de 1
+de dupliquer 2
+de dupliquer le 1
+de dupliquer tout 1
+de dur 1
+de dur ee 1
+de e avec 1
+de e devrait 1
+de e sur 1
+de e1 1
+de ecart 1
+de ecart de 1
+de echang 2
+de echang de 1
+de echec 1
+de echec profon 1
+de ecritur 1
+de ecritur dan 1
+de ecritur donc 1
+de ecritur en 1
+de ecritur pr 1
+de ecritur sestomp 1
+de edgel 1
+de eff 3
+de eff de 1
+de eff du 1
+de eff mortel 1
+de eff ping 1
+de effort 1
+de effort import 1
+de el 1
+de el ement 1
+de elimin 1
+de elimin sur 1
+de en 1
+de en nb 1
+de encyclop 1
+de enf 1
+de enf issus 1
+de enregister 1
+de enregister dactiv 1
+de enregister de 1
+de enregister lib 1
+de enregister qu 1
+de enregister sur 1
+de enseign 1
+de enseign vi 1
+de ensembl 2
+de ensembl de 2
+de ent 1
+de ent naturel 1
+de entit 1
+de environ 3
+de environ ain 1
+de environ com 1
+de environ de 2
+de environ en 1
+de environ est 1
+de environ instruc 1
+de environ la 1
+de environ multiprocesseur 1
+de environ par 1
+de environ peut 1
+de environ pourrait 1
+de environ sur 1
+de environ un 1
+de environ zhou 1
+de environ. 1
+de equ 2
+de equ de 1
+de equ ei 1
+de erreur 2
+de erreur de 1
+de espac 2
+de espac dinvar 1
+de estampil 1
+de estampil correct 1
+de estampil lor 1
+de estim 3
+de estim de 1
+de estim quantit 1
+de estimateur 2
+de estimateur de 1
+de estimateur non 1
+de estreitar 1
+de et de 1
+de etap 1
+de etap de 1
+de etat 5
+de etat caract 1
+de etat de 1
+de etat ne 1
+de etat ou 1
+de etat qu 1
+de etat un 1
+de etiqu 1
+de etiqu ne 1
+de etiqu pr 1
+de etiqu statiqu 1
+de etr 1
+de etr viv 1
+de etud 1
+de etud men 1
+de ev 1
+de ev en 1
+de ex 2
+de ex ecut 2
+de except 1
+de except ne 1
+de except1 1
+de exempl 2
+de exempl de 1
+de exempl qu 1
+de exp 2
+de exp er 1
+de exp ri 1
+de expr 1
+de expr arithm 1
+de ext 1
+de f mur 1
+de f un 1
+de fa 4
+de fa con 3
+de fa import 1
+de fa ordr 1
+de fabr 2
+de fabr assez 1
+de fabr cour 1
+de fabr de 1
+de facil 1
+de facil int 1
+de facilit 1
+de facilit es 1
+de faciliter 2
+de faciliter la 1
+de faciliter le 2
+de fact 2
+de fact standard 2
+de facteur 2
+de facteur orthogonaux 1
+de facteur techniqu 1
+de factoriser 1
+de factoriser alloc 1
+de fail 1
+de fail est 1
+de fair 3
+de fair appar 1
+de fair bien 1
+de fair de 1
+de fair en 1
+de fair evoluer 1
+de fair figurer 1
+de fair la 1
+de fair le 1
+de fair lobj 1
+de fair migrer 1
+de fair partager 1
+de fair perdr 1
+de fair pointer 1
+de fair tourner 1
+de fait 1
+de fant 1
+de fant me 1
+de faus 1
+de faux 2
+de faux part 1
+de faux positif 1
+de fauxpart 1
+de fauxpart qu 1
+de fauxpart sinspir 1
+de favoriser 1
+de favoriser ce 1
+de feutr 1
+de feutr sur 1
+de fiabilit 2
+de figur 2
+de figur ix 1
+de figur peuv 1
+de filtr 1
+de fin 2
+de fin duc 1
+de fit 1
+de fit multimodaux 1
+de flexibilit 1
+de flot 2
+de flot de 2
+de fluc 1
+de fluc de 1
+de fluc dinstruc 1
+de fluc distinct 1
+de fluctu 1
+de fluctu de 1
+de fluid 1
+de flyn 1
+de fo 2
+de fo quil 1
+de fo quon 1
+de fon 1
+de fon appel 1
+de fonct 5
+de fonct co 1
+de fonct couvr 1
+de fonct de 3
+de fonct du 1
+de fonct ent 1
+de fonct est 1
+de fonct mod 1
+de fonct part 1
+de fonct plafon 1
+de fonct planch 1
+de fonct qu 1
+de fonct scalair 1
+de fonct standard 1
+de fonct vectoriel 1
+de foncteur 1
+de foncteur darit 1
+de foncteur de 1
+de foncteur fon 1
+de foncteur princip 1
+de foncteur serait 1
+de fonctionnalit 1
+de form 3
+de form assez 1
+de form ba 1
+de form diff 1
+de form moy 1
+de form norm 1
+de form sup 2
+de form sur 1
+de format 1
+de format de 1
+de forml 3
+de forml atomiqu 1
+de forml conc 1
+de forml correspon 1
+de forml exact 1
+de forml quantif 1
+de four 1
+de four motzkin 1
+de four rap 1
+de four. 1
+de fouriermotzkin 1
+de fouriermotzkin pour 1
+de fournir 3
+de fournir de 3
+de fr 1
+de fr ch 1
+de franc 1
+de freidlin 1
+de freidlin wentzel 1
+de frein 1
+de frein principaux 1
+de fs 1
+de fs opt 1
+de fuit 1
+de fuit de 1
+de fus 2
+de fus de 1
+de fus sont 1
+de fusionner 2
+de fusionner le 1
+de fusionner tout 1
+de fx 1
+de g dan 1
+de g en 3
+de g erer 1
+de g od 1
+de g om 1
+de g rer 1
+de g unter 1
+de g.florin 1
+de ga 1
+de ga qu 1
+de gain 2
+de gain en 2
+de garantir 2
+de garantir la 1
+de garantir laffinit 1
+de garantir qu 1
+de garantir un 2
+de gard 1
+de gard inclu 1
+de garder 3
+de garder ce 1
+de garder dan 1
+de garder en 2
+de garder le 1
+de garder un 1
+de gauch 3
+de gaus 1
+de gb 1
+de geijn 1
+de geler 1
+de gest 4
+de gest ch 1
+de gest constitu 1
+de gest de 3
+de gest doit 1
+de gest du 2
+de gib 1
+de glob 1
+de glob inutil 1
+de globaliser 1
+de gr 1
+de gr probl 1
+de graaf 1
+de graaff 1
+de grad 2
+de grad de 1
+de grad prop 1
+de grain 1
+de grain de 1
+de grain le 1
+de gram 1
+de gram schmidt 1
+de grand 3
+de grand nombr 1
+de grand tail 2
+de grandeur 1
+de grandeur de 1
+de grandeur du 1
+de grandeur qu 1
+de graph 4
+de graph de 1
+de graph quen 1
+de grenobl 1
+de group 2
+de group ag 1
+de group de 2
+de gruyter 1
+de gudeman 1
+de guid 1
+de guid de 1
+de guid issu 1
+de guider 1
+de guider la 1
+de h en 1
+de h est 2
+de hach 1
+de hach de 1
+de ham 1
+de ham entr 1
+de haut 1
+de haut niveau 1
+de herm 1
+de herm qu 1
+de hogger 1
+de hogger echap 1
+de holland 1
+de holland agc 1
+de hook 1
+de hough 1
+de hu 1
+de hu par 1
+de huit 1
+de huit processeur 1
+de hypoth 3
+de hypoth es 3
+de i don 1
+de i le 1
+de i ne 1
+de i.c 1
+de i1 1
+de id ee 2
+de identificateur 1
+de identificateur de 1
+de ik 1
+de ik don 1
+de ik modl 1
+de ik pour 1
+de ik quand 1
+de imag 2
+de imag de 1
+de impl 2
+de impl em 2
+de impr 1
+de impr ci 1
+de in egalit 1
+de inconv 1
+de inconv enient 1
+de incr 1
+de incr ement 1
+de ind 1
+de ind de 1
+de ind xn 1
+de individus 1
+de individus affect 1
+de individus suiv 1
+de inform 3
+de inform de 1
+de inform tic 1
+de inst 2
+de inst dun 1
+de inst host 1
+de inst mach 1
+de inst scenar 1
+de instruc 3
+de instruc amen 1
+de instruc arithm 1
+de instruc charg 1
+de instruc con 1
+de instruc concern 1
+de instruc dappel 1
+de instruc de 1
+de instruc don 1
+de instruc dual 1
+de instruc dunif 1
+de instruc fail 1
+de instruc ge 1
+de instruc manipl 1
+de instruc proceed 1
+de instruc put 1
+de instruc qu 1
+de instruc retr 1
+de instruc se 1
+de instruc sp 1
+de instruc standard 1
+de instruc sur 1
+de instruc try 1
+de instruc unif 1
+de interact 1
+de interact entr 1
+de interfac 1
+de interfac ec 1
+de interv 1
+de interv de 1
+de inv 1
+de inv est 1
+de inv se 1
+de ir 1
+de ir modif 1
+de it erat 1
+de it erateur 1
+de j dan 1
+de j don 1
+de j est 1
+de j0 1
+de j0 dan 1
+de jacob 2
+de jacob sexprim 1
+de janeir 1
+de jeux 1
+de jeux dinstruc 1
+de jg 1
+de jg est 1
+de jong 2
+de journ 2
+de journ doit 1
+de journ ee 1
+de journ quel 1
+de juger 1
+de juger de 1
+de juger mon 1
+de k dan 1
+de k doit 1
+de k fic 1
+de k maxim 1
+de k min 1
+de k mot 1
+de k nimp 1
+de k par 1
+de k possibl 1
+de k pour 1
+de k qu 1
+de k risqu 1
+de kahn 1
+de kalman 1
+de kalman chap 1
+de kalman perm 1
+de kantrowitz 1
+de karch 1
+de kcm 1
+de kcm de 1
+de kcm inclut 1
+de kcm ind 1
+de kcm ne 1
+de kcm pr 1
+de kcm sep 1
+de kcm va 1
+de kergommeaux 1
+de kleer 2
+de koan 1
+de koan ce 1
+de koan cel 1
+de koan dan 1
+de koan me 1
+de kolmogorov 1
+de kolmogorov smirnov 1
+de l an 1
+de l appel 1
+de l appr 1
+de l critur 1
+de l echantillon 1
+de l ecritur 2
+de l ecrivain 1
+de l eg 1
+de l egalit 1
+de l el 1
+de l elabor 1
+de l elag 1
+de l elim 1
+de l en 1
+de l environ 1
+de l equ 1
+de l equilibr 2
+de l equip 2
+de l etap 3
+de l etat 3
+de l etiqu 1
+de l evalu 1
+de l evolut 1
+de l inv 1
+de l ment 1
+de l optim 1
+de l volut 1
+de l1 1
+de l1 doit 1
+de la 10
+de la ba 1
+de la banqu 1
+de la bin 1
+de la biolog 1
+de la bon 1
+de la born 1
+de la boucl 2
+de la caract 1
+de la cel 1
+de la ch 3
+de la charg 1
+de la classif 1
+de la claus 1
+de la coh 1
+de la colon 1
+de la compil 1
+de la complexit 3
+de la composit 1
+de la compr 1
+de la computac 1
+de la concept 2
+de la condit 1
+de la configur 1
+de la consom 1
+de la constitut 1
+de la construc 1
+de la continu 1
+de la continuit 1
+de la contraint 1
+de la converg 1
+de la convexit 1
+de la cop 1
+de la coupur 1
+de la courb 1
+de la cr 2
+de la dec 1
+de la dern 2
+de la deux 1
+de la diff 1
+de la difficil 1
+de la dilat 1
+de la direct 1
+de la disc 1
+de la dist 1
+de la distribut 2
+de la div 1
+de la don 2
+de la dur 2
+de la fa 2
+de la figur 3
+de la fonct 3
+de la form 3
+de la fr 1
+de la gard 1
+de la gaus 1
+de la gest 3
+de la hi 1
+de la ie 1
+de la journ 1
+de la justif 1
+de la lat 1
+de la lectur 1
+de la liaison 1
+de la lib 1
+de la lign 1
+de la lin 1
+de la list 1
+de la lo 1
+de la loc 1
+de la localit 1
+de la mach 4
+de la man 3
+de la matr 3
+de la md 1
+de la meilleur 1
+de la mesur 1
+de la mi 3
+de la migr 1
+de la mod 1
+de la modif 1
+de la moit 1
+de la mppm 1
+de la mut 1
+de la mvp 1
+de la natur 2
+de la non 1
+de la norm 1
+de la not 2
+de la nouvel 3
+de la ntoam 1
+de la pa 1
+de la pag 1
+de la pair 1
+de la pan 1
+de la par 1
+de la paragon 2
+de la part 2
+de la partit 2
+de la pauvr 1
+de la pdb 1
+de la per 1
+de la perform 1
+de la ph 2
+de la philosoph 1
+de la pil 1
+de la plac 2
+de la placer 1
+de la politiqu 1
+de la popl 1
+de la port 1
+de la posit 2
+de la pr 4
+de la prem 3
+de la prim 2
+de la probabilit 2
+de la prochain 1
+de la produc 1
+de la program 2
+de la project 1
+de la proposit 2
+de la propr 1
+de la prot 1
+de la racin 1
+de la rar 1
+de la recherch 3
+de la recherchescientifiqu 1
+de la recon 1
+de la reconstruc 1
+de la repr 3
+de la reproduc 1
+de la responsabilit 1
+de la restaur 1
+de la rom 1
+de la rou 1
+de la sauvegard 1
+de la secon 2
+de la sect 2
+de la siml 1
+de la solut 2
+de la som 1
+de la sp 1
+de la strat 2
+de la structur 4
+de la substitut 1
+de la suit 1
+de la surfac 1
+de la tabl 1
+de la tail 4
+de la techniqu 3
+de la tempor 1
+de la th 5
+de la topolog 1
+de la tr 1
+de la trajectoir 1
+de la transform 3
+de la transit 1
+de la transp 1
+de la traver 1
+de la triangl 1
+de la val 2
+de la valeur 2
+de la validit 1
+de la var 3
+de la ver 1
+de la vi 1
+de la vit 1
+de la wam 1
+de la zon 2
+de lab 2
+de lab de 1
+de lab dun 1
+de lacad 1
+de lacad em 1
+de lacc 1
+de lacc es 1
+de laccuml 1
+de laccuml de 1
+de lacg 1
+de lactiv 1
+de lactiv de 1
+de ladapt 1
+de ladapt du 1
+de ladn 1
+de ladr 1
+de ladr indirect 1
+de laffect 2
+de laffect destruc 1
+de laffect est 1
+de laffect par 1
+de laffinit 1
+de laftd 1
+de laftd dan 1
+de lag 1
+de lag est 1
+de lag hybr 1
+de lag reposerait 1
+de lagc 1
+de lagc au 1
+de lagc ce 1
+de lagc en 1
+de lagc est 1
+de lagc nest 1
+de lagc par 1
+de lagc peut 1
+de lagc qu 1
+de lagc sont 1
+de lagenc 1
+de lagenc de 1
+de lagenc standard 1
+de lagrang 1
+de lagun 1
+de laisser 2
+de laisser au 1
+de laisser le 2
+de laisser se 1
+de lalgorithm 3
+de lalgorithm conduit 1
+de lalgorithm correspon 1
+de lalgorithm dancourt 1
+de lalgorithm de 2
+de lalgorithm dunif 1
+de lalgorithm est 1
+de lalgorithm par 1
+de lalgorithm qu 1
+de lalgorithm standard 1
+de lalgorithm tout 1
+de lalgorithm tr 1
+de lallong 1
+de lallong sur 1
+de laltern 1
+de laltern correspon 1
+de lampleur 1
+de lampleur de 1
+de lan 3
+de lan de 2
+de lan statistiqu 1
+de lanc 1
+de lanc var 1
+de lancer 1
+de lancer la 1
+de lanciennet 1
+de lang 3
+de lang bool 1
+de lang de 1
+de lang util 1
+de lap 1
+de lap ca 1
+de lappel 1
+de lappel correspon 1
+de lappel du 1
+de lappel init 1
+de lappel peut 1
+de lappl 2
+de lappl de 1
+de lappl lin 1
+de lappliquer 1
+de lappliquer il 1
+de lapproch 2
+de lapproxim 1
+de lapproxim obtenu 1
+de laquel 1
+de lar 1
+de lar th 1
+de larbitrair 1
+de larbitrair du 1
+de larbr 1
+de larbr de 1
+de larchitectur 2
+de larchitectur distribu 1
+de larchitectur standard 1
+de largum 1
+de largum dind 1
+de largum du 1
+de largum remplac 1
+de larit 1
+de larithm 2
+de larithm etiqu 2
+de lart 3
+de lart concern 1
+de lart de 1
+de larticl 1
+de lat 1
+de lat du 1
+de lattribut 1
+de lattribut attr1 1
+de lauteur 1
+de lauteur ne 1
+de lauteur sont 1
+de lav 1
+de lav dern 1
+de lawr 1
+de lawr livermor 1
+de lb 1
+de le 2
+de le borner 1
+de le combiner 1
+de le con 1
+de le de 1
+de le form 1
+de le lib 1
+de le modif 1
+de le parcourir 1
+de le utiliser 1
+de lec 3
+de lec dunif 1
+de lec ecut 3
+de lecol 1
+de lecol doct 1
+de lecol polytechniqu 1
+de lect 1
+de lecteur 1
+de lecteur dun 1
+de lecteur est 1
+de lectur 2
+de lectur anticip 1
+de lectur est 1
+de lectur isol 1
+de leeuw 1
+de leff 1
+de leff ping 1
+de leffectif 1
+de leffectif de 1
+de lefficacit 2
+de lempil 1
+de lempil de 1
+de lempil denviron 1
+de lempil dun 1
+de lempl 1
+de lempl dun 1
+de lemployer 1
+de lemployer com 1
+de lenregister 1
+de lenregister cour 1
+de lenregister dactiv 1
+de lensembl 4
+de lensembl de 2
+de lensembl dhyperoctr 1
+de lensembl fc 1
+de lensembl solut 1
+de lentr 1
+de lentr ee 1
+de lentrelacer 1
+de lentrelacer avec 1
+de lenviron 2
+de lenviron ain 1
+de lenviron consid 1
+de lenviron correspon 1
+de lenviron cour 1
+de lenviron dan 1
+de lenviron de 2
+de lenviron dev 1
+de lenviron est 1
+de lenviron facil 1
+de lenviron fortran 1
+de lenviron init 1
+de lenviron lor 1
+de lenviron ne 1
+de lenviron nest 1
+de lenviron ou 1
+de lenviron peuv 1
+de lenviron plut 1
+de lenviron pr 1
+de lenviron pu 1
+de lenviron sel 1
+de lenviron sont 1
+de lenviron supprim 1
+de lenviron2 1
+de leoecacit 1
+de lerreur 1
+de lerreur dan 1
+de lesp 1
+de lesp eranc 1
+de lespac 5
+de lespac dadr 1
+de lespac de 2
+de lespac dispon 1
+de lespac dit 1
+de lespac imag 1
+de lespac nous 1
+de lespac occup 1
+de lespac qu 1
+de lesprit 1
+de lestampil 1
+de lestampil cour 1
+de lestampil demeur 1
+de lestim 1
+de lestim dincertitud 1
+de lestimateur 1
+de lestimateur de 1
+de lettr 1
+de leur 4
+de leur cat 1
+de leur contenu 1
+de leur cr 1
+de leur dern 1
+de leur eff 1
+de leur efficacit 1
+de leur environ 1
+de leur etud 1
+de leur mon 1
+de leur oabilit 1
+de leur posit 1
+de leur signif 1
+de leur simplicit 1
+de leur structur 1
+de leur valeur 1
+de leur variabl 1
+de lexempl 1
+de lexempl de 1
+de lexempl pr 1
+de lexp 1
+de lexp er 1
+de lexper 1
+de lexper de 1
+de lexpr 2
+de lexpr d27 1
+de lexpr d7x 1
+de lexpr par 1
+de lext 1
+de lext com 1
+de lext consid 1
+de lext de 1
+de lextensibilit 1
+de lhistoir 1
+de lhistoir du 1
+de lhorlog 1
+de lhorlog assoc 1
+de lhypercub 1
+de lhypercub lor 1
+de lhyperoctr 1
+de lhyperoctr repr 1
+de li 1
+de li transform 1
+de liaison 2
+de liaison attach 1
+de liaison conditionnel 1
+de liaison dan 1
+de liaison de 1
+de liaison demand 1
+de liaison destructiv 1
+de liaison du 1
+de liaison dun 1
+de liaison enregister 1
+de liaison est 1
+de liaison lor 1
+de liaison ne 1
+de liaison nest 1
+de liaison non 1
+de liaison par 1
+de liaison peut 1
+de liaison pour 1
+de liaison propr 1
+de liaison qu 1
+de liaison quil 1
+de liaison sav 1
+de liaison se 1
+de liaison standard 1
+de liaison sur 1
+de liaison vi 1
+de lib 2
+de lib erat 1
+de lib erer 2
+de liber 1
+de librair 1
+de librair scientifiqu 1
+de lidentit 2
+de lien 1
+de lien de 1
+de lier 1
+de lier la 1
+de lign 2
+de lign augm 1
+de lign de 1
+de lign droit 1
+de lign du 1
+de lign nest 1
+de lim 2
+de lim ain 1
+de lim de 1
+de lim du 1
+de lim dun 1
+de lim si 1
+de limager 1
+de limiter 2
+de limiter le 2
+de limpl 2
+de limpl de 1
+de limpl em 1
+de limport 1
+de limport de 1
+de limpossibilit 1
+de lincertitud 1
+de lincertitud est 1
+de lincertitud sur 1
+de linclus 1
+de lincr 1
+de lincr ement 1
+de lind 1
+de lindividu 1
+de linec 1
+de linec de 1
+de linflu 2
+de linflu de 1
+de linflu du 1
+de linform 3
+de linform condu 1
+de linform dan 1
+de linform de 1
+de linformatiqu 3
+de linformatiqu du 1
+de linformatiqu non 1
+de linformatiqu qu 1
+de linpack 1
+de linr 1
+de linst 1
+de linst pr 1
+de linstitut 1
+de linstitut poincar 1
+de linstruc 2
+de linstruc cal 1
+de linstruc dappel 1
+de linstruc dealloc 1
+de linstruc est 1
+de linstruc ge 1
+de linstruc neck 1
+de linstruc proceed 1
+de linstruc put 1
+de linstruc r1 1
+de linstruc retr 1
+de linstruc trust 1
+de linstruc unif 1
+de lint 1
+de lint er 1
+de linterfac 1
+de linterfac ne 1
+de linterpr 1
+de linterpr etat 1
+de linterv 1
+de linterv de 1
+de lintroduc 1
+de lintroduc dan 1
+de lintroduc de 1
+de linver 2
+de linver de 1
+de lipsc 1
+de lir 3
+de lir la 1
+de lir lestampil 1
+de lit 1
+de lit erat 1
+de llenguatg 1
+de lloyd 1
+de lo 1
+de lo de 1
+de lobj 2
+de lobj recherch 1
+de lobj rel 1
+de loc 1
+de loc de 1
+de localiser 2
+de localiser le 1
+de localiser lensembl 1
+de localit 2
+de longu 1
+de longu ch 1
+de longueur 4
+de longueur la 1
+de longueur multipl 1
+de longueur nl 1
+de longueur non 1
+de longueur ou 1
+de longueur quelconqu 1
+de loop 1
+de lop 3
+de lop erat 3
+de lop erateur 2
+de loptim 3
+de loptim dappel 1
+de loptim de 2
+de loptim du 1
+de loptim est 1
+de loptim num 1
+de loptimalit 1
+de lordonnanc 1
+de lordonnanc ch 1
+de lordonnanc cycliqu 1
+de lordonnanc de 1
+de lordonnanc par 1
+de lordonnanc sur 1
+de lordr 3
+de lordr de 3
+de lordr dic 1
+de lordr du 1
+de lorgan 1
+de lorgan de 1
+de lorig 1
+de loter 1
+de loter bi 1
+de luciol 2
+de luciol b.p 1
+de luciol bp 1
+de lun 1
+de lun de 1
+de lunif 1
+de lunif afin 1
+de lunif compil 1
+de lunif dan 1
+de lunif de 1
+de lunif dun 1
+de lunif etendu 1
+de lunif peut 1
+de lunit 2
+de luniversit 2
+de lutil 3
+de lutil cliniqu 1
+de lutil de 2
+de lutil du 1
+de lutilisateur 1
+de lutilit 1
+de lyon 2
+de lyon unit 1
+de m alag 1
+de m bit 1
+de m ch 1
+de m chromosom 1
+de m ecan 3
+de m em 3
+de m emoir 4
+de m emor 1
+de m emoriser 1
+de m entr 1
+de m es 2
+de m est 1
+de m ethod 3
+de m ethodolog 1
+de m lim 1
+de m par 1
+de m thod 1
+de m triqu 1
+de m0 1
+de m3 1
+de ma 2
+de ma de 1
+de mach 4
+de mach abstrait 1
+de mach com 1
+de mach de 2
+de mach encor 1
+de mach massiv 1
+de mach mimd 1
+de mach monoprocesseur 1
+de mach num 1
+de mach offr 1
+de mach osm 1
+de mach par 2
+de mach partag 1
+de mach po 1
+de mach qu 1
+de mach sp 1
+de mach util 1
+de mach virtuel 1
+de macrocod 1
+de mahalanob 1
+de maint 1
+de maint de 1
+de maintenir 2
+de maintenir de 1
+de maintenir la 1
+de mal 1
+de mal ont 1
+de maladr 1
+de maladr dan 1
+de man 4
+de man er 1
+de manipl 2
+de manipl de 1
+de manipl sur 1
+de maqu 1
+de maqu de 1
+de mar 1
+de mar en 1
+de markov 1
+de markov ergodiqu 1
+de markov fin 1
+de markov homog 1
+de markov ir 1
+de markov sont 1
+de marqu 2
+de marqu accessibl 1
+de marqu de 1
+de mart 1
+de mart continu 1
+de masquer 1
+de masquer la 1
+de mat 4
+de mat er 2
+de mat riel 1
+de match 1
+de match probabil 1
+de math 1
+de math matiqu 1
+de mathemat 1
+de matr 3
+de matr car 1
+de matr conjugu 1
+de matr de 3
+de matr non 1
+de matr rationnel 1
+de matr rectangulair 1
+de matr stochastiqu 1
+de mauv 1
+de mauv fonct 1
+de maxim 1
+de maxim globaux 1
+de me 3
+de me court 1
+de me echang 1
+de me entr 1
+de me long 1
+de me pour 1
+de me rout 1
+de me unif 1
+de meer 1
+de meilleur 3
+de meilleur ch 1
+de meilleur individus 1
+de memberchk 1
+de membr 1
+de membr du 1
+de men 1
+de men avoir 1
+de mener 2
+de mener aux 1
+de mener rapid 1
+de mentionner 1
+de mentionner peuv 1
+de mesur 3
+de mesur con 1
+de mesur de 1
+de mesur doit 1
+de mesur exp 1
+de mesur nous 1
+de mesur ou 1
+de mesur proch 1
+de mesur qu 1
+de mesur quantit 1
+de mesur rel 1
+de mesur temporel 1
+de mesurer 2
+de mesurer le 1
+de mesurer leur 1
+de mettr 4
+de mettr egal 1
+de mettr en 3
+de mettr lacc 1
+de mettr superficiel 1
+de mi 4
+de mi au 1
+de mi condu 1
+de mi conduit 1
+de mi en 3
+de micr 1
+de micr par 1
+de microcod 1
+de mieux 2
+de mieux cerner 1
+de mieux utiliser 1
+de migr 2
+de migr atteint 1
+de migr de 1
+de migr don 1
+de migr du 1
+de migr dun 1
+de migr est 1
+de migr la 1
+de migr pen 1
+de migr peut 1
+de migr qu 1
+de migr rest 1
+de milliard 1
+de milliard dop 1
+de min 1
+de min de 1
+de minimiser 1
+de minimiser le 1
+de minuscl 1
+de mireil 1
+de mk 1
+de mn 1
+de mobilit 1
+de mod 5
+de mod de 1
+de mod el 3
+de mod eliser 1
+de mod le 1
+de mod lectur 1
+de mod li 1
+de mod nest 1
+de mod ou 1
+de modif 4
+de modif ce 1
+de modif de 3
+de modif la 1
+de modif lattribut 1
+de modif le 3
+de modif lop 1
+de modif mineur 1
+de modif notr 1
+de modif sur 2
+de modioc 1
+de modioc apport 1
+de modl 3
+de modl ba 1
+de modulad 1
+de moin 2
+de moin de 1
+de moin est 1
+de moindr 1
+de moindr car 1
+de moindr proport 1
+de moit 1
+de moment 1
+de moment de 1
+de mon 1
+de mon jur 1
+de mont 1
+de mont carl 1
+de montpel 1
+de montrer 2
+de montrer com 1
+de montrer dan 1
+de montrer lefficacit 1
+de montrer qu 2
+de montrer quil 1
+de montrer quun 1
+de morgan 1
+de morgan law 1
+de mot 2
+de mot cl 1
+de mot de 1
+de motif 1
+de motif avec 1
+de motif de 1
+de motif observ 1
+de motif structuraux 1
+de mouv 2
+de mouv de 2
+de moy 3
+de moy coh 1
+de moy de 1
+de moy effectu 1
+de mu 1
+de mu prolog 1
+de multipl 3
+de multipl de 2
+de multipl le 1
+de multiplec 2
+de mut 2
+de mut adapt 1
+de mut au 1
+de mut classiqu 1
+de mut con 1
+de mut concern 1
+de mut conseil 1
+de mut dan 1
+de mut dautr 1
+de mut est 1
+de mut majeur 1
+de mut nl 1
+de mut peut 1
+de mut pm 1
+de mut pour 1
+de mut qu 1
+de mut se 1
+de mut sont 1
+de mvp 1
+de mvp ch 1
+de mvp dan 1
+de mvp la 1
+de mvp ne 1
+de mvp nous 1
+de mvp puisquun 1
+de mvp qu 1
+de mvp sur 1
+de n dnt 1
+de n ecessit 1
+de n imag 1
+de n meilleur 1
+de n mi 1
+de n par 1
+de n point 1
+de n variabl 1
+de nappliquer 1
+de nappliquer la 1
+de nat 1
+de nat consid 1
+de natur 3
+de natur combinatoir 1
+de natur probabil 1
+de natur quelconqu 1
+de navoir 1
+de navoir quun 1
+de ne 4
+de ne calculer 1
+de ne cop 1
+de ne measur 1
+de ne pa 2
+de ne parcourir 1
+de ne partitionner 1
+de ne passer 1
+de ne restaurer 1
+de ne sint 1
+de neck 1
+de neck stat 1
+de nempiler 1
+de nempiler qu 1
+de net 1
+de net de 1
+de neumerkel 1
+de neur 1
+de neur architectur 1
+de nic 1
+de nich 1
+de nich ecologiqu 1
+de nid 1
+de nid cont 1
+de nid de 1
+de nid non 1
+de nid qu 1
+de nid sont 1
+de nimport 1
+de nimport quel 1
+de ning 1
+de ning trout 1
+de nishit 1
+de nishit kumar 1
+de nit 1
+de nn 1
+de nn peut 1
+de no 5
+de no ag 1
+de no algorithm 1
+de no algoritm 1
+de no bi 1
+de no dat 1
+de no exp 1
+de no hypoth 1
+de no inqu 1
+de no perform 1
+de no primitiv 1
+de no pseud 1
+de no sign 1
+de no techniqu2 1
+de no using 1
+de noeud 2
+de noeud compr 1
+de noeud identiqu 1
+de noeud mi 1
+de noeud quon 1
+de noeud se 1
+de nombr 2
+de nombr al 1
+de nombreus 5
+de nombreus appl 2
+de nombreus autr 1
+de nombreus contribut 1
+de nombreus diff 1
+de nombreus etud 1
+de nombreus ext 1
+de nombreus faus 1
+de nombreus mi 1
+de nombreus observ 1
+de nombreus tent 1
+de nombreus var 2
+de nombreus ver 1
+de nombreux 3
+de nombreux ca 1
+de nombreux effort 1
+de nombreux point 2
+de nombreux probl 1
+de nombreux register 1
+de nombreux syst 1
+de non 2
+de non convexit 1
+de norm 1
+de not 2
+de not accompagn 1
+de not caract 1
+de not de 2
+de not pr 1
+de noter 3
+de noter ce 1
+de noter qu 2
+de noter quen 1
+de noter quil 1
+de notr 4
+de notr algorithm 1
+de notr an 1
+de notr approch 1
+de notr cadr 1
+de notr etud 1
+de notr exempl 1
+de notr exp 1
+de notr mod 2
+de notr port 1
+de notr pr 1
+de notr probl 2
+de notr techniqu 1
+de notr transform 1
+de nous 1
+de nous int 1
+de nouveaut 1
+de nouveaux 3
+de nouveaux algorithm 1
+de nouveaux register 1
+de nouveaux term 1
+de nouveaux vecteur 1
+de nouvel 4
+de nouvel appl 2
+de nouvel comp 1
+de nouvel configur 1
+de nouvel direct 1
+de nouvel form 1
+de nouvel not 1
+de nouvel perspectiv 2
+de nouvel primitiv 1
+de nouvel structur 1
+de nouvel subst 1
+de nouvel techniqu 1
+de nouvel unif 1
+de ntot 1
+de nu 1
+de nu prolog 1
+de obj 5
+de obj locaux 1
+de obj manipl 1
+de obj observ 1
+de obj perm 1
+de obj qu 1
+de obj util 1
+de observ 1
+de ocauchemar 1
+de ocauchemar tant 1
+de ocr 1
+de ocr loop 1
+de od 1
+de od epart 1
+de oe 1
+de oeff 1
+de oeff de 1
+de okeef 1
+de op 4
+de op erat 4
+de op erateur 2
+de opr 1
+de opr eparer 1
+de ordinateur 2
+de ordinateur qu 1
+de ordinateur selon 1
+de organ 1
+de os 1
+de os dan 1
+de oscil 1
+de otr 1
+de otr dan 1
+de ou 1
+de ou de 1
+de outil 4
+de outil dan 1
+de outil en 1
+de outil logiciel 1
+de outil pour 1
+de outil tel 1
+de ovr 1
+de ovr part 1
+de p enur 1
+de p multipl 1
+de p ol 1
+de p processeur 1
+de p2 1
+de p2 est 1
+de pa 3
+de pa de 1
+de pa ex 1
+de pa rationnel 1
+de pa xi 1
+de pag 3
+de pag acc 1
+de pag al 1
+de pag attribu 1
+de pag au 1
+de pag av 1
+de pag avec 1
+de pag commun 1
+de pag comport 1
+de pag con 1
+de pag conflictuel 1
+de pag correspon 1
+de pag cr 1
+de pag dan 1
+de pag de 1
+de pag diff 1
+de pag disjoint 1
+de pag distinct 1
+de pag don 1
+de pag donc 1
+de pag du 1
+de pag dun 1
+de pag en 1
+de pag engendr 1
+de pag entr 1
+de pag est 1
+de pag fig 1
+de pag fr 1
+de pag induit 1
+de pag le 1
+de pag loc 1
+de pag lor 1
+de pag lorsqu 1
+de pag ma 1
+de pag montr 1
+de pag ni 1
+de pag non 1
+de pag nous 1
+de pag ou 1
+de pag par 1
+de pag pen 1
+de pag pour 1
+de pag pouv 1
+de pag prov. 1
+de pag provoqu 1
+de pag provoquerait 1
+de pag qu 1
+de pag quil 1
+de pag s 1
+de pag se 1
+de pag si 1
+de pag simultan 1
+de pag situ 1
+de pag sont 1
+de pag stabl 1
+de pag suffit 1
+de pag suiv 1
+de pag sur 2
+de pag util 1
+de pag valent 1
+de pair 1
+de pair de 1
+de pal 1
+de pan 2
+de pan ain 1
+de pan ec 1
+de pan sont 1
+de pap 1
+de pap pr 1
+de par 4
+de par el 2
+de par eliser 1
+de par elism 3
+de par le 1
+de par vi 2
+de paragraph 1
+de paragraph suiv 1
+de param 5
+de param etr 4
+de param tr 1
+de parcour 2
+de parcour beaucoup 1
+de parcour de 2
+de parcour du 1
+de parcourir 1
+de parcourir le 1
+de parent 1
+de parent ayant 1
+de part 4
+de part de 1
+de part dinform 1
+de part entr 1
+de part exhib 1
+de part invar 1
+de part shar 1
+de partager 1
+de partager du 1
+de partager la 1
+de partager le 1
+de partager linform 1
+de partager tn 1
+de participer 1
+de participer au 1
+de particularit 1
+de particularit es 1
+de partit 2
+de partit de 1
+de partit devront 1
+de partit du 1
+de partit elimin 1
+de partit en 1
+de partit est 1
+de partit justif 1
+de partit nest 1
+de partit ont 1
+de partit possibl 1
+de partit pr 1
+de partitionner 1
+de partitionner le 1
+de parvenir 1
+de passer 1
+de passer argum 1
+de passer direct 1
+de passer du 1
+de passer dun 1
+de passer en 1
+de patron 1
+de patron correspon 1
+de patron dan 1
+de patron de 1
+de patron devrait 1
+de patron diff 1
+de patron dun 1
+de patron en 1
+de patron est 1
+de patron nous 1
+de patron ou 1
+de patron par 1
+de patron peut 1
+de patron qu 1
+de patron quen 1
+de patron sont 1
+de patron suffisam 1
+de pav 1
+de pav es 1
+de pav pr 1
+de pav qu 1
+de pay 1
+de pay capit 1
+de pay commun 1
+de pay sous 1
+de pay sur 1
+de pe 2
+de pe tail 2
+de penser 1
+de penser qu 1
+de per 1
+de per de 1
+de perdr 3
+de perdr la 2
+de perdr le 2
+de perform 4
+de perform au 1
+de perform comparabl 1
+de perform consid 1
+de perform dan 1
+de perform de 1
+de perform denviron 1
+de perform du 1
+de perform dun 1
+de perform effectu 1
+de perform equiv 1
+de perform jusqu 1
+de perform montr 1
+de perform obtenu 1
+de perform pour 1
+de perform proch 1
+de perform qu 1
+de perform sont 1
+de perform soulign 1
+de perform sur 1
+de perform typiqu 1
+de perm 2
+de perm eabilit 1
+de permettr 2
+de permettr aux 1
+de permettr un 1
+de perspectiv 1
+de perspectiv th 1
+de perturber 2
+de perturber la 1
+de pesqu 1
+de petit 1
+de petit perturb 1
+de petr 1
+de petr ci 1
+de petr est 1
+de petr quun 1
+de petr sous 1
+de petr stochastiqu 1
+de peu 1
+de peu dint 1
+de pgcd 1
+de ph 2
+de ph de 1
+de ph enom 1
+de ph producteur 1
+de pi 1
+de pil 1
+de pil apr 1
+de pil au 1
+de pil cap 1
+de pil du 1
+de pil est 1
+de pil explicit 1
+de pil glob 1
+de pil loc 1
+de pil nest 1
+de pil pen 1
+de pil perm 1
+de pil qu 1
+de pil som 1
+de pil uniqu 1
+de pil ver 1
+de ping 1
+de ping pong 1
+de pingpong 1
+de pingpong pour 1
+de pipeliner 1
+de pipeliner un 1
+de pk 1
+de pk ce 1
+de plac 4
+de plac cycliqu 1
+de plac dan 1
+de plac de 1
+de plac en 1
+de plac init 1
+de plac ni 1
+de plac pr 1
+de plac successeur 1
+de plus ampl 1
+de plus ce 1
+de plus de 2
+de plus dun 1
+de plus en 3
+de plus fructueux 1
+de plus haut 1
+de plus il 1
+de plus imposer 1
+de plus la 1
+de plus lappl 1
+de plus le 1
+de plus lexploit 1
+de plus nous 1
+de plus qu 1
+de plus sophistiqu 1
+de plus tout 1
+de plus un 1
+de plus util 1
+de plusieur 3
+de plusieur algorithm 1
+de plusieur claus 1
+de plusieur op 1
+de plusieur processeur 2
+de plusieur syst 1
+de pm 1
+de pm fonct 1
+de po 1
+de po eder 1
+de point 4
+de point 3d 1
+de point acc 1
+de point ce 1
+de point ch 1
+de point commun 1
+de point de 3
+de point dentr 1
+de point ent 1
+de point extr 1
+de point isol 1
+de point particl 1
+de point pr 1
+de point qu 1
+de point sous 1
+de point tel 1
+de point util 1
+de point voisin 1
+de pointer 1
+de pointer sur 1
+de pointeur 1
+de pointeur de 1
+de pointeur econom 1
+de pointeur ma 1
+de pointeur sur 1
+de pointeur ta 1
+de pointeur un 1
+de pol 1
+de pol edr 1
+de polyn 1
+de polyn om 1
+de popl 1
+de popl produit 1
+de port 1
+de port ee 1
+de posit 1
+de posit instanc 1
+de possibilit 2
+de possibilit es 1
+de pouv 1
+de pouv etr 1
+de pouvoir 5
+de pouvoir construir 2
+de pouvoir estimer 1
+de pouvoir etr 2
+de pouvoir etud 1
+de pouvoir le 1
+de pouvoir lib 1
+de pouvoir localiser 1
+de pouvoir majorer 1
+de pouvoir tirer 1
+de pouvoir traiter 1
+de powel 1
+de powel se 1
+de pp 1
+de pp opt 1
+de ppcm 1
+de ppcm afin 1
+de pr 4
+de pr ec 1
+de pr echarg 1
+de pr eciser 2
+de pr edicat 1
+de pr ef 1
+de pr es 2
+de pr esenter 3
+de pr eserver 1
+de pr esider 2
+de pr etendr 1
+de pr. 1
+de prat 1
+de prat en 1
+de prem 2
+de prem coup 1
+de prem el 1
+de prem er 1
+de prem ind 1
+de prendr 3
+de prendr com 1
+de prendr con 1
+de prendr en 2
+de prendr le 1
+de prendr lun 1
+de primitiv 3
+de primitiv al 1
+de primitiv compatibl 1
+de primitiv dan 1
+de primitiv de 1
+de primitiv isol 1
+de primitiv quelconqu 1
+de primitiv sel 1
+de primitiv tel 1
+de princip 3
+de princip algorithmiqu 1
+de princip de 1
+de princip macr 1
+de princip motiv 1
+de probabilit 3
+de probabilit es 2
+de probabilt 1
+de probl 5
+de probl em 4
+de probl me 1
+de problem 1
+de problem cotid 1
+de proc edur 2
+de processeur 3
+de processeur acc 1
+de processeur augm 1
+de processeur aux 1
+de processeur cherch 1
+de processeur dev 1
+de processeur diff 1
+de processeur disponibl 1
+de processeur distinct 1
+de processeur dur 1
+de processeur empl 1
+de processeur en 1
+de processeur entr 1
+de processeur est 1
+de processeur etant 1
+de processeur etc 1
+de processeur impliqu 1
+de processeur lim 1
+de processeur ne 1
+de processeur pour 1
+de processeur pouv 1
+de processeur privil 1
+de processeur qu 1
+de processeur rel 1
+de processeur standard 1
+de processeur sur 1
+de processeur util 1
+de processeur var 1
+de processus 3
+de processus dur 1
+de processus interv 1
+de processus par 1
+de processus saccompagn 1
+de processus stochastiqu 1
+de processus sur 1
+de procrast 1
+de procrast8 1
+de procrast8 qu 1
+de produir 1
+de produir du 1
+de produit 1
+de produit tensoriel 1
+de profiter 1
+de profiter de 1
+de profondeur 1
+de profondeur du 1
+de profondeur maxim 1
+de profondeur pm 1
+de progr 1
+de progr le 1
+de program 4
+de program ait 1
+de program appel 1
+de program au 1
+de program ayant 1
+de program classiqu 1
+de program claus 1
+de program de 2
+de program diff 1
+de program du 1
+de program dun 1
+de program en 2
+de program est 1
+de program fortran 1
+de program la 1
+de program lin 1
+de program logiqu 1
+de program mi 1
+de program nous 1
+de program nutil 1
+de program obtenus 1
+de program ont 1
+de program optim 1
+de program orient 1
+de program originaux 1
+de program ou 1
+de program par 2
+de program perm 1
+de program peut 1
+de program pour 2
+de program pr 2
+de program qu 2
+de program rapport 1
+de program remplac 1
+de program retenu 1
+de program simpl 1
+de program spmd 2
+de program transform 1
+de program vi 1
+de project 1
+de project convec 1
+de project de 1
+de project du 1
+de project ent 1
+de prolog 1
+de prolog ait 1
+de prolog ba 1
+de prolog dan 1
+de prolog en 1
+de prolog est 1
+de prolog fourn 1
+de prolog ii 1
+de prolog mal 1
+de prolog ne 1
+de prolog om 1
+de prolog peut 1
+de prolog sont 1
+de prolog standard 1
+de prolog ten 1
+de prolog ver 1
+de propag 2
+de propag de 2
+de propager 1
+de propager de 1
+de proper 1
+de proper enabl 1
+de proport 1
+de proport raisonnabl 1
+de proposer 2
+de proposer de 2
+de proposit 1
+de propr 3
+de propr etair 1
+de prot 2
+de prot eger 1
+de prot in 1
+de protocol 1
+de protocol de 1
+de protocol denv 1
+de protocol perm 1
+de prouver 1
+de prouver qu 1
+de provoquer 1
+de provoquer de 1
+de proxim 1
+de proxim es 1
+de pseud 2
+de pseud but 1
+de pseud pr 1
+de pseud solut 1
+de qn 1
+de qn est 1
+de qp 1
+de qsort 1
+de qsort na 1
+de qualit 1
+de quantif 2
+de quantif de 1
+de quantif le 1
+de quantif lint 1
+de quantif un 1
+de quatern 1
+de quatern unitair 1
+de quatr 2
+de quatr oct 1
+de quatr typ 1
+de quelqu 3
+de quelqu centain 1
+de quelqu dizain 1
+de quelqu instruc 1
+de quelqu mil 1
+de quest 3
+de quest sur 1
+de quest tel 1
+de quitter 1
+de quitter la 1
+de r duir 1
+de r eal 1
+de r ealiser 2
+de r ecept 1
+de r econcil 1
+de r ecup 1
+de r ecur 2
+de r edact 1
+de r educ 3
+de r eduir 2
+de r eel 3
+de r ef 3
+de r egion 1
+de r egl 1
+de r egler 2
+de r einjecter 1
+de r eintroduir 1
+de r ent 1
+de r eorgan 1
+de r epar 1
+de r epartit 1
+de r epliqu 1
+de r epon 1
+de r eseau 1
+de r eseaux 2
+de r esolut 3
+de r esoudr 3
+de r esultat 3
+de r eutil 2
+de r eutiliser 1
+de r ex 1
+de r pon 1
+de r soudr 1
+de r sultat 1
+de r1 1
+de r1 ver 1
+de r2 1
+de r2 ver 1
+de r3 2
+de r3 ne 1
+de raccourc 1
+de raccourc de 1
+de raccourcir 1
+de raccourcir leur 1
+de rain 1
+de rain de 1
+de raison 2
+de raison alg 1
+de raison de 2
+de raison defficacit 1
+de raison didactiqu 1
+de raison particl 1
+de raison suiv 1
+de raisonner 1
+de raisonner en 1
+de raisonner sur 1
+de rajouter 1
+de rajouter de 1
+de ralentir 1
+de ralentir le 1
+de rang 2
+de ranger 1
+de ranger dan 1
+de ranger direct 1
+de ranger linform 1
+de rapporteur 1
+de rapporteur de 1
+de rationnel 1
+de rayon 1
+de rec 1
+de rec appl 1
+de rec capabl 1
+de rec dim 1
+de rec multipl 1
+de rec ou 1
+de rec qu 1
+de rec util 1
+de recenser 1
+de recenser le 1
+de recevoir 1
+de recevoir la 1
+de recevoir un 1
+de recherch 13
+de recherch anticip 1
+de recherch appel 1
+de recherch assoc 1
+de recherch ayant 1
+de recherch command 1
+de recherch connec 1
+de recherch de 2
+de recherch dun 2
+de recherch en 7
+de recherch espac 1
+de recherch est 2
+de recherch inr 3
+de recherch le 1
+de recherch lien 1
+de recherch loc 1
+de recherch nest 1
+de recherch ont 1
+de recherch par 1
+de recherch port 1
+de recherch sp 1
+de recherch th 1
+de recherch tr 1
+de recherch va 1
+de recombiner 1
+de recombiner ce 1
+de recon 2
+de recon correct 1
+de recon de 1
+de recon ent 1
+de recon le 1
+de recon perm 1
+de recon prop 1
+de recon tr 1
+de recop 1
+de recop le 1
+de recourir 1
+de recourir au 1
+de recuit 1
+de recuit siml 1
+de recur 1
+de redon 1
+de reductibilit 1
+de refl 1
+de refl eter 1
+de refusionner 1
+de refusionner le 1
+de regarder 2
+de regarder le 1
+de regarder si 1
+de register 1
+de register argum 1
+de register argum2 1
+de register bp 1
+de register de 1
+de register dest 1
+de register disponibl 1
+de register du 1
+de register entr 1
+de register est 1
+de register impliqu 1
+de register linform 1
+de register mach 1
+de register peuv 1
+de register qu 1
+de register sauv 1
+de register sp 1
+de register util 1
+de regroup 1
+de regroup de 1
+de regrouper 1
+de regrouper ce 1
+de regrouper le 1
+de relancer 1
+de relancer lec 1
+de reloger 1
+de reloger ce 1
+de rem 1
+de rem ed 1
+de remarqu 1
+de remarqu pr 1
+de remettr 1
+de remettr bp 1
+de remplac 1
+de remplac destructif 1
+de remplacer 1
+de remplacer ce 1
+de remplacer dan 1
+de remplacer destructiv 1
+de remplacer linstruc 1
+de ren 3
+de rendr 2
+de rendr appl 1
+de rendr ce 1
+de rendr explicit 1
+de rendr intern 1
+de rendr le 1
+de renommer 1
+de renommer le 1
+de rep 1
+de rep re 1
+de repasser 1
+de repasser par 1
+de repousser 1
+de repousser le 1
+de repr 4
+de repr es 3
+de repr esent 2
+de repr esenter 2
+de reproduc 1
+de reproduc direct 1
+de reproduc peut 1
+de reproduc standard 1
+de reproduc vient 1
+de reproduir 1
+de reproduir de 1
+de requ 1
+de requ es 1
+de request 1
+de request wh 1
+de responsabilit 1
+de ressourc 3
+de ressourc mi 1
+de ressourc physiqu 1
+de ressourc prolog 1
+de rest 1
+de rest chin 1
+de restaurer 1
+de restaurer le 1
+de restaurer linform 1
+de restaurer tout 1
+de restreindr 1
+de restreindr le 1
+de restrict 1
+de restrict li 1
+de restructur 1
+de restructur de 1
+de retarder 2
+de retarder cel 1
+de retarder la 1
+de retarder le 1
+de retirer 1
+de retirer lenregister 1
+de retour 1
+de retour ar 1
+de retour compil 1
+de retour de 1
+de retour est 1
+de retour ne 1
+de retour profon 1
+de retour superficiel 1
+de retour sur 1
+de retourner 1
+de retr 1
+de retrouver 1
+de rev 1
+de rev attr 1
+de revenir 2
+de revenir dan 1
+de riv 1
+de riv er 1
+de rn 2
+de robust 1
+de roever 1
+de rot 1
+de rot on 1
+de rot sous 1
+de rout 2
+de rout dan 1
+de rout sp 1
+de s ecurit 1
+de s elect 2
+de s electionner 2
+de s eloigner 2
+de s emantiqu 1
+de s epargner 1
+de s equ 2
+de s equenc 1
+de s equentialiser 1
+de s er 1
+de s est 1
+de s lectivit 1
+de s soit 1
+de s sur 1
+de s1 1
+de s1 le 1
+de s2 1
+de sa 5
+de sa cr 1
+de sa grand 1
+de sa mach 1
+de sa mi 1
+de sa moy 1
+de sa racin 1
+de sa repr 1
+de sa structur 1
+de sa transit 1
+de sa valeur 2
+de sa var 1
+de sa ver 1
+de sabstrair 1
+de sabstrair de 1
+de sahlin 1
+de sannl 1
+de sannl si 1
+de sapproch 1
+de sapproch de 1
+de sappuyer 1
+de sappuyer sur 1
+de sassurer 1
+de sassurer qu 1
+de sassurer quaucun 1
+de sassurer quun 1
+de satisfair 1
+de satisfair ce 1
+de saturer 1
+de saturer le 1
+de saut 1
+de saut direct 1
+de saut indirect 1
+de sauter 1
+de sauter la 1
+de sauter linstruc 1
+de sauvegarder 1
+de sauvegarder dan 1
+de sauvegarder le 1
+de sauver 1
+de sauver ce 1
+de sav cut 1
+de savoir 3
+de savoir pour 1
+de savoir qu 1
+de savoir quand 1
+de savoir si 3
+de savoir sil 1
+de sc 2
+de sc ne 1
+de scalair 1
+de sch 1
+de sch em 1
+de scinder 1
+de scinder la 1
+de se 4
+de se comp 1
+de se deux 1
+de se diff 1
+de se eff 1
+de se focaliser 1
+de se lib 1
+de se limiter 1
+de se membr 1
+de se passer 1
+de se perform 1
+de se probabilit 1
+de se ramener 1
+de se rapproch 1
+de se reporter 1
+de se reproduir 1
+de se restreindr 1
+de se soulever 1
+de se sous 1
+de se travaux 1
+de se var 1
+de se variabl 1
+de se voir 1
+de se voisin 1
+de secon 1
+de sect 1
+de segm 1
+de segm de 1
+de segm en 1
+de segm peut 1
+de sel 2
+de sel champ 1
+de sel mvp 1
+de sen 1
+de sen qu 1
+de serv 1
+de setarg 1
+de si 1
+de si long 1
+de sic noeud 1
+de sicstus 1
+de sicstus auror 1
+de sicstus prolog 1
+de sign 1
+de sign respectif 1
+de similarit 1
+de similarit es 1
+de similitud 2
+de similitud nous 1
+de siml 2
+de siml algorithmiqu 1
+de siml ensuit 1
+de siml hybr 1
+de siml le 1
+de siml soit 1
+de siml sont 1
+de simpl 2
+de simpl sp 1
+de simpl vecteur 1
+de simplec 1
+de simplec quon 1
+de simplicit 2
+de simplif 2
+de simplif la 1
+de simplif le 1
+de simplioc 1
+de simplioc consid 1
+de singularit 1
+de sinterdir 1
+de sinterdir le 1
+de sinterdir lutil 1
+de sit 1
+de sit actif 1
+de smith 1
+de smith de 1
+de smith ne 1
+de sol 1
+de solut 4
+de solut applicabl 1
+de solut classiqu 1
+de solut dan 2
+de solut du 1
+de solut dun 1
+de solut ent 1
+de solut mat 1
+de solut non 1
+de solut ou 1
+de solut pour 1
+de solut pouv 1
+de solut s 1
+de solut simpl 1
+de solut tant 1
+de solut tout 1
+de som 5
+de som de 1
+de som du 1
+de som pen 1
+de som rest 1
+de som sur 1
+de son 3
+de son elabor 1
+de son etat 1
+de son evolut 1
+de son ex 1
+de son logiciel 1
+de son program 1
+de sort 2
+de sort dun 1
+de sort qu 1
+de sort quil 1
+de sort quun 1
+de sortir 1
+de sortir de 1
+de souligner 1
+de souligner le 1
+de souligner leur 1
+de soupl 1
+de soupl dan 1
+de sous 2
+de sous ensembl 1
+de sous structur 1
+de sousstructur 1
+de sousstructur dan 1
+de souz 1
+de souz92 1
+de souz93 1
+de sp 3
+de sp ec 1
+de sp ecialiser 1
+de sp ecif 2
+de speed 1
+de spendl 1
+de springer 1
+de springer ser 1
+de standard 1
+de standard is 1
+de statistiqu 2
+de statistiqu robust 1
+de statistiqu sur 1
+de statistiqu usuel 1
+de sterl 1
+de strat 2
+de strat eg 2
+de structur 2
+de structur anatomiqu 1
+de structur cel 1
+de structur commun 1
+de structur de 2
+de structur est 1
+de structur le 1
+de structur oblig 1
+de structur par 1
+de structur plut 1
+de structur repr 1
+de structur segm 1
+de structur substitut 1
+de structurer 1
+de structurer le 1
+de subdiv 1
+de subdiv adapt 1
+de substitut 1
+de substitut affect 1
+de substitut conduit 1
+de substitut cr 1
+de substitut dan 1
+de substitut de 1
+de substitut dun 1
+de substitut est 1
+de substitut peut 1
+de substitut pour 1
+de substitut rencontr 1
+de substitut soit 1
+de substitut sont 1
+de succ 3
+de succ es 3
+de suivr 1
+de suivr ce 1
+de suivr le 1
+de suivr pour 1
+de support 1
+de support mat 1
+de support pour 1
+de supprimer 1
+de supprimer certain 1
+de supprimer de 1
+de supprimer le 1
+de surc 1
+de surc ut 1
+de surfac 1
+de surfac au 1
+de surfac ds 1
+de surmonter 1
+de surmonter son 1
+de surv 1
+de survivr 1
+de survivr au 1
+de susp 1
+de susp don 1
+de swap 1
+de swap faus 1
+de sym 1
+de sym tr 1
+de symbol 1
+de symbol de 1
+de symbol fonctionnel 1
+de synchron 2
+de synchron de 1
+de synchron entr 1
+de synchron est 1
+de synchron inutil 1
+de synchron par 1
+de synchron pr 1
+de synchron serait 1
+de synchron sont 1
+de synth 1
+de synth es 1
+de syst 5
+de syst em 5
+de syst ematiqu 1
+de t ach 1
+de t donc 1
+de t entr 1
+de t es 1
+de t est 2
+de t par 1
+de t qu 1
+de tabl 1
+de tableau 1
+de tableau sur 1
+de tableaux 2
+de tableaux appart 1
+de tableaux de 2
+de tableaux diff 1
+de tableaux est 1
+de tableaux po 1
+de tableaux sur 1
+de tail 4
+de tail 2r 1
+de tail dan 1
+de tail de 1
+de tail don 1
+de tail exponentiel 1
+de tail fic 2
+de tail h1 1
+de tail insuff 1
+de tail maxim 2
+de tail moy 1
+de tail signif 1
+de tail tail 1
+de tail var 1
+de tak 1
+de tak qu 1
+de tampon 1
+de taux 1
+de taux respectif 1
+de taylor 1
+de tb 1
+de tb est 1
+de tb introduit 1
+de tc 1
+de techniqu 5
+de techniqu classiqu 1
+de techniqu dacquisit 1
+de techniqu dam 1
+de techniqu dan 1
+de techniqu de 4
+de techniqu dexplor 1
+de techniqu dind 1
+de techniqu doptim 2
+de techniqu empl 1
+de techniqu lourd 1
+de techniqu non 1
+de techniqu qu 1
+de techniqu sel 1
+de techniqu sp 1
+de techniqu vi 1
+de technolog 1
+de technolog de 1
+de tel 5
+de tel algorithm 1
+de tel appl 1
+de tel ca 1
+de tel conflit 1
+de tel disjonct 1
+de tel etat 1
+de tel gard 1
+de tel liaison 1
+de tel list 1
+de tel man 2
+de tel pag 1
+de tel sort 3
+de tel tr 1
+de temp 2
+de temp dacc 1
+de temp dan 1
+de temp entr 1
+de tenseur 1
+de tenseur dordr 1
+de term 4
+de term com 1
+de term comp 1
+de term cycliqu 1
+de term dan 1
+de term dit 1
+de term don 1
+de term du 2
+de term infin 1
+de term modif 1
+de term modifiabl 1
+de term nl 1
+de term par 1
+de term prolog 1
+de term soit 1
+de term substitu 1
+de term substituabl 1
+de termecomp 1
+de termecomp par 1
+de terminer 1
+de terminer la 1
+de test 4
+de test adapt 1
+de test chat 1
+de test conditionnel 1
+de test daquarius 1
+de test de 2
+de test du 1
+de test num 1
+de test port 1
+de test pr 1
+de test qu 2
+de test standard 1
+de test statistiqu 1
+de tester 1
+de tester en 1
+de tester le 1
+de th 3
+de th eor 2
+de th es 1
+de th se 1
+de ti 1
+de ti est 1
+de tick 1
+de tir 1
+de tir de 1
+de tirer 2
+de tirer le 1
+de tirer part 2
+de tirer profit 1
+de tj 1
+de tn 1
+de tn li 1
+de tomber 2
+de tomber dan 2
+de topolog 1
+de topolog 2d 1
+de torel 1
+de torgerson 1
+de touat 1
+de toujour 1
+de toujour utiliser 1
+de tous 3
+de tous le 3
+de tout 4
+de tout autr 1
+de tout claus 1
+de tout import 1
+de tout la 1
+de tout le 2
+de tout machiner 1
+de tout marqu 1
+de tout obj 1
+de tout prem 1
+de tout syst 1
+de tout var 1
+de tr 5
+de tr an 1
+de tr coeff 1
+de tr de 1
+de tr diff 1
+de tr domain 1
+de tr es 2
+de tr form 1
+de tr grand 1
+de tr nag 1
+de tr nag1 1
+de tr nid 1
+de tr op 1
+de tr qsort 1
+de tr techniqu 1
+de tr typ 1
+de tr ver 1
+de trac 1
+de trac de 1
+de trac fourn 1
+de trait 3
+de trait de 1
+de trait doit 1
+de trait du 1
+de trait dun 1
+de trait la 1
+de trait particl 1
+de trait po 1
+de trait uc 1
+de traiter 4
+de traiter ce 1
+de traiter conjoint 1
+de traiter de 1
+de traiter le 2
+de traiter lensembl 1
+de traiter prioritair 1
+de trajectoir 1
+de trajectoir condu 1
+de trajectoir men 1
+de trajectoir pr 1
+de transact 1
+de transfer 2
+de transfer de 1
+de transfer dun 1
+de transfer lor 1
+de transfer pour 1
+de transfer sup 1
+de transform 3
+de transform au 1
+de transform aux 1
+de transform avec 1
+de transform de 2
+de transform du 1
+de transform el 1
+de transform en 2
+de transform lim 1
+de transform lin 1
+de transform non 1
+de transform par 1
+de transform perm 1
+de transform qu 1
+de transform rig 1
+de transform sappliqu 1
+de transform sous 1
+de transform vi 1
+de transformer 1
+de transformer un 1
+de transit 3
+de transit ain 1
+de transit ayant 1
+de transit de 1
+de transit du 1
+de transit entr 1
+de transit probabil 1
+de transit sont 1
+de transit tir 1
+de transit tirabl 1
+de transm 2
+de transm de 1
+de transmettr 1
+de transmettr un 1
+de transp 1
+de transp es 1
+de travail 2
+de travailler 2
+de travailler au 1
+de travaux 2
+de travaux ant 1
+de travaux de 1
+de travaux sur 1
+de travaux tent 1
+de treil 1
+de treil assur 1
+de treil aur 1
+de treil aut 1
+de treil correspon 1
+de treil distinct 1
+de treil perm 1
+de treil pr 1
+de trou 1
+de trou sur 1
+de trouver 4
+de trouver la 1
+de trouver le 2
+de trouver parm 1
+de trouver plusieur 1
+de trouver un 1
+de tur 1
+de turbl 1
+de turbl en 1
+de typ 4
+de typ aik 1
+de typ ba 1
+de typ bbn 1
+de typ cisc 1
+de typ dadm 1
+de typ dautr 1
+de typ de 2
+de typ e0j 1
+de typ ecrivain 1
+de typ fin 1
+de typ fortran77 1
+de typ harvard 1
+de typ i860 1
+de typ interpr 1
+de typ lecteur 1
+de typ non 1
+de typ norm 1
+de typ oself 1
+de typ pa 1
+de typ pj 1
+de typ pjj 1
+de typ point 1
+de typ polymorphiqu 1
+de typ pr 1
+de typ producteur 1
+de typ profon 1
+de typ sasm 1
+de typ self 1
+de typ superficiel 1
+de typ test 1
+de typ um 1
+de typ var 1
+de typ wam 1
+de un 1
+de un agenc 1
+de un champ 1
+de un dan 1
+de unit 1
+de unit es 1
+de univer 1
+de utilidad 1
+de utilidad observ 1
+de v ehiculer 1
+de v erif 1
+de v eritabl 1
+de v requ 1
+de v rioer 1
+de val 2
+de val correct 1
+de val de 2
+de val exact 1
+de val probabil 1
+de val statistiqu 1
+de valeur 5
+de valeur avec 1
+de valeur classiqu 1
+de valeur com 1
+de valeur de 2
+de valeur devrait 1
+de valeur diagon 1
+de valeur est 1
+de valeur excessiv 1
+de valeur ff 1
+de valeur na 1
+de valeur optim 1
+de valeur perm 1
+de valeur peut 1
+de valeur positiv 1
+de valeur respectiv 1
+de valeur sup 1
+de valider 2
+de valider ce 1
+de valider notr 1
+de van 1
+de van roy 1
+de var 3
+de var affaibl 1
+de var ain 1
+de var appar 1
+de var de 1
+de var perman 1
+de var qu 1
+de var ren 1
+de var vl 1
+de variabl 4
+de variabl al 1
+de variabl appar 1
+de variabl attach 1
+de variabl ce 1
+de variabl commun 1
+de variabl dan 1
+de variabl de 1
+de variabl dind 1
+de variabl domain 1
+de variabl du 1
+de variabl dur 1
+de variabl est 1
+de variabl globalisabl 1
+de variabl inutil 1
+de variabl libr 1
+de variabl loc 1
+de variabl ne 1
+de variabl origin 1
+de variabl partag 2
+de variabl perman 1
+de variabl pour 1
+de variabl qu 1
+de variabl standard 1
+de variabl temporair 1
+de vecteur 4
+de vecteur auxilliair 1
+de vecteur caract 1
+de vecteur de 1
+de vecteur diminu 1
+de vecteur dispar 1
+de vecteur dist 1
+de vecteur dit 1
+de vecteur est 1
+de vecteur le 1
+de vecteur locaux 1
+de vecteur minim 1
+de vecteur napport 1
+de vecteur nest 1
+de vecteur pour 1
+de vecteur rot 1
+de veiller 1
+de veld 1
+de venir 1
+de venir travailler 1
+de ver 3
+de ver de 1
+de ver hybr 1
+de ver optim 1
+de ver origin 1
+de ver par 1
+de ver pr 1
+de ver sp 1
+de vi 1
+de vi de 1
+de vi la 1
+de vi ne 1
+de vi suiv 1
+de vi sup 1
+de vi va 1
+de vid 1
+de vid de 1
+de villeneuv 2
+de villeneuv d.h 1
+de visiter 2
+de visiter dan 1
+de visiter le 2
+de vit 2
+de voir 3
+de voir appar 1
+de voir certain 1
+de voir com 1
+de voir lallur 1
+de voir le 2
+de voir se 1
+de voisin 2
+de voisin dev 1
+de voisin entr 1
+de vol 1
+de vol de 1
+de vol deequ 1
+de vol v9 1
+de von 1
+de von neuman 1
+de vouloir 1
+de vouloir imposer 1
+de voxel 1
+de vr 1
+de vraisembl 2
+de vraisembl assoc 1
+de vraisembl du 1
+de vraisembl dun 1
+de vu 3
+de vu applicatif 1
+de vu de 1
+de vu economiqu 1
+de vu informatiqu 1
+de vu possibl 1
+de vu th 2
+de w.j 1
+de war 1
+de war la 1
+de with weight 1
+de x don 1
+de x est 1
+de xc 1
+de xc si 1
+de xi 2
+de xi fpour 1
+de xi par 1
+de xk 1
+de xk etxk 1
+de xtl 1
+de xtl ee 1
+de z2 1
+de z2 sur 1
+de z3 1
+de zd 1
+de zd efin 1
+de ze 1
+de ze pa 1
+de zebr 1
+de zhou 1
+de zhou est 1
+de zn 1
+de zn dan 1
+de zn de 1
+de zn en 1
+de zn par 1
+de zn sur 1
+de zon 1
+de zon quil 1
+de zorn 1
+de zorn dan 1
+de zp 1
+de zurich 1
+de. 2
+de89 1
+deactiv 1
+deactiv proc 1
+dead 5
+dead al 1
+dead al al 1
+dead and al 1
+dead and exact 1
+dead dead 1
+dead dead dead 1
+dead dead deaddeaddeaddeaddeaddead 1
+dead dead deaddeaddeaddeaddeaddeaddead 1
+dead deadalivedead 1
+dead deadalivedead al 1
+dead deaddead 1
+dead deaddead dead 1
+dead deaddeaddeaddeaddeaddead 1
+dead deaddeaddeaddeaddeaddead dead 1
+dead deaddeaddeaddeaddeaddeaddead 1
+dead deaddeaddeaddeaddeaddeaddead deaddead 1
+dead dep 1
+dead en 1
+dead en subproof 1
+dead spac 1
+deadalivedead 1
+deadalivedead al 1
+deadalivedead al dead 1
+deaddead 1
+deaddead al 1
+deaddead al al 1
+deaddead al alivedeaddead 1
+deaddead al deaddead 1
+deaddead al deaddeaddead 1
+deaddead dead 1
+deaddead dead dead 1
+deaddead dead deadalivedead 1
+deaddead deaddeaddead 1
+deaddead deaddeaddead dead 1
+deaddeaddead 1
+deaddeaddead dead 1
+deaddeaddead dead dead 1
+deaddeaddeaddeaddeaddead 1
+deaddeaddeaddeaddeaddead dead 1
+deaddeaddeaddeaddeaddead dead al 1
+deaddeaddeaddeaddeaddeaddead 1
+deaddeaddeaddeaddeaddeaddead deaddead 1
+deaddeaddeaddeaddeaddeaddead deaddead al 1
+deadl 4
+deadl ar consider 1
+deadl assignm 1
+deadl constraint 1
+deadl for produc 1
+deadl is me 1
+deadl monot 1
+deadl monot approach 1
+deadl monot cl 1
+deadl on comput 1
+deadl prior 1
+deadlock 6
+deadlock av 1
+deadlock av adv 1
+deadlock av schem 1
+deadlock can ar 1
+deadlock can ea 1
+deadlock detect 1
+deadlock dur rollback 1
+deadlock fe 1
+deadlock fe parallel 1
+deadlock for multidest 1
+deadlock fr 2
+deadlock fr execut 1
+deadlock fr me 1
+deadlock fr mult 1
+deadlock fr multicast 1
+deadlock fr repl 1
+deadlock fr rout 1
+deadlock freedom 1
+deadlock freedom requir 1
+deadlock in unidirect 1
+deadlock is prev 1
+deadlock might requir 1
+deadlock occur 1
+deadlock or system 1
+deadlock problem 1
+deadlock problem ec 1
+deadlock recov 1
+deadlock recov schem 1
+deadlock scenar 1
+deadlock scenar mdest 1
+deadlock scenar outlin 1
+deadlock sinc lock 1
+deadlock under asynchron 1
+deadlock under synchron 1
+deadlockfreedom 1
+deal 42
+deal by backtrack 1
+deal clean 1
+deal in common 1
+deal le work 1
+deal main 1
+deal of attent 1
+deal of flec 1
+deal of research 1
+deal of tim 2
+deal of work 1
+deal proper 1
+deal sen 1
+deal uncertaint 1
+deal with actu 1
+deal with addr 1
+deal with appl 1
+deal with appropr 1
+deal with backtrack 1
+deal with circumst 1
+deal with concur 1
+deal with cont 1
+deal with contour 1
+deal with definit 1
+deal with engineer 1
+deal with except 1
+deal with fault 1
+deal with gener 1
+deal with high 1
+deal with ie 1
+deal with infinit 1
+deal with interfac 1
+deal with interior 1
+deal with intrasequ 1
+deal with leader 1
+deal with list 1
+deal with mach 1
+deal with mult 1
+deal with mut 2
+deal with natur 1
+deal with no 1
+deal with non 1
+deal with observ 1
+deal with pattern 1
+deal with problem 1
+deal with record 1
+deal with renam 1
+deal with resourc 1
+deal with rev 1
+deal with sequ 1
+deal with stat 1
+deal with system 1
+deal with tim 1
+deal with upd 1
+deal with vast 1
+deal with zon 1
+dealloc 2
+dealloc cod 1
+dealloc cod na 1
+dealloc d ecr 1
+dealloc d epil 1
+dealloc d eplac 1
+dealloc est 1
+dealloc est simpl 1
+dealloc et alloc 1
+dealloc et le 1
+dealloc et linstruc 1
+dealloc execut 1
+dealloc execut qsort 1
+dealloc ne 1
+dealloc ne peut 1
+dealloc proceed 1
+dealloc th proc 1
+dealloc them phy 1
+dealt 12
+dealt with conv 1
+dealt with individu 1
+dealt with undisturb 1
+dean 2
+dean spencer 1
+dean spencer daniel 1
+death 3
+death at tim 1
+death of cop 1
+deb 6
+deb deb 1
+deb ti 1
+debart 1
+debash 3
+debash basak 3
+debit 2
+debit credit 1
+debit credit transact 1
+deborah 2
+debr 2
+debrec 1
+debruijn 4
+debruijn autom 1
+debruijn graph 2
+debug 10
+debug a rout 1
+debug aid 1
+debug and developm 1
+debug and maintain 1
+debug and profil 1
+debug cl 1
+debug cl dict 1
+debug compil 1
+debug compil cod 1
+debug electron 1
+debug electron circuit 1
+debug environm 1
+debug mod 1
+debug or alter 1
+debug or developm 1
+debug parallel 1
+debug parallel program 1
+debug program 1
+debug propag 1
+debug propag pattern 1
+debug purp 1
+debug research 1
+debug se 1
+debug support 1
+debug th system 1
+debug their program 1
+debug toolsremot 1
+debug toolsremot serverssystem 1
+debug ver 1
+debugger 5
+debugger debug 1
+debugger debug compil 1
+debugger for log 1
+debugger for oz 1
+debugger prolog 1
+debugger wa espec 1
+dec 83
+dec about augm 1
+dec about select 1
+dec act 1
+dec alph 1
+dec and becom 1
+dec ar accuml 1
+dec ar label 1
+dec ar mad 1
+dec ar record 1
+dec ar var 1
+dec ba 2
+dec ba classif 1
+dec ba domain 1
+dec between altern 1
+dec bi 1
+dec bound 3
+dec bound quantif 1
+dec bound slight 1
+dec by an 1
+dec by try 1
+dec can improv 1
+dec combin 1
+dec comput 1
+dec comput combin 1
+dec containm 1
+dec cub 1
+dec d tot 1
+dec demon 1
+dec demon ch 1
+dec dep 1
+dec diagram 1
+dec el 1
+dec el pa 1
+dec extrem 2
+dec for cl 1
+dec for determin 1
+dec for horn 1
+dec how further 1
+dec if oe1 1
+dec in lin 1
+dec in ndp 1
+dec in rheumatolog 1
+dec in spur 1
+dec in tim 1
+dec in vot 1
+dec influ 1
+dec inst 1
+dec instead 1
+dec integr 1
+dec integr method 1
+dec integr proc 1
+dec integr schem 1
+dec integr stag 1
+dec is ba 1
+dec is mad 2
+dec is obv 1
+dec is strong 1
+dec is suggest 1
+dec it mak 1
+dec level 1
+dec log 1
+dec log theor 1
+dec mad 1
+dec mad indep 1
+dec mak 8
+dec mak involut 1
+dec mak network 1
+dec mak proc 1
+dec mak schem 1
+dec method 1
+dec model 1
+dec model describ 1
+dec monit 1
+dec monit algorithm 1
+dec monit ba 1
+dec non 1
+dec non gaus 1
+dec of conver 1
+dec of kind 1
+dec of subtyp 1
+dec of typ 1
+dec of typecheck 1
+dec on good 2
+dec on proposit 1
+dec or wh 1
+dec prec 1
+dec problem 2
+dec problem becom 1
+dec problem defin 1
+dec proc 3
+dec procedur 4
+dec procedur techniqu 1
+dec propag 1
+dec propag profil 1
+dec respect 1
+dec result 1
+dec rl 1
+dec satisf 1
+dec schem 1
+dec se 1
+dec se defin 1
+dec squar 1
+dec src 1
+dec src research 1
+dec support 4
+dec support system 3
+dec surfac 1
+dec system 1
+dec system research 1
+dec tech 1
+dec tech report 1
+dec techniqu 2
+dec th anchor 1
+dec th nd 1
+dec th number 1
+dec th output 1
+dec th se 2
+dec that affect 1
+dec theor 1
+dec thus 1
+dec to accept 1
+dec to adopt 1
+dec to approxim 1
+dec to ba 1
+dec to break 1
+dec to build 1
+dec to chang 2
+dec to confirm 1
+dec to determin 2
+dec to develop 1
+dec to ge 1
+dec to giv 1
+dec to hid 1
+dec to import 1
+dec to incr 1
+dec to influ 1
+dec to keep 1
+dec to mov 1
+dec to restructur 1
+dec to resum 1
+dec to st 1
+dec to step 1
+dec to upd 1
+dec to us 3
+dec ultr 1
+dec ultr nl 1
+dec unit 1
+dec unit design 1
+dec var 1
+dec vect 1
+dec ver 2
+dec vot 1
+dec vot obtain 1
+dec wh 2
+dec what harm 1
+dec whether expr 1
+dec whether increm 1
+dec whether pr 1
+dec which architectur 1
+dec which branch 1
+dec which eigenvalu 1
+dec which fac 1
+dec which inst 1
+dec which modl 1
+dec which nod 1
+dec which observ 1
+dec which on 1
+dec which proc 1
+dec which unit 1
+dec with respect 1
+dec.inc.backlogt 1
+dec.inc.backlogt x 1r 1
+dec1 1
+dec2 1
+dec90 1
+decad 11
+decad becom 1
+decad becom incr 1
+decad of empir 1
+decad th import 1
+decalcl 1
+decdt 1
+december 44
+decent 2
+decent docum 1
+decent docum anyw 1
+decent garb 1
+decent garb collect 1
+decentr 2
+decentr cach 1
+decentr cach con 1
+decentr schem 1
+decentr schem work 1
+decept 4
+decept by character 1
+decept funct 1
+decept funct using 1
+decept in trap 1
+decept optim 1
+decept optim problem 1
+decept or conspir 1
+decept problem 1
+dechter 1
+decidecomput 1
+decidecomput nod 1
+decim 5
+decim ar mark 1
+decim plac 1
+decim system 1
+decim var 1
+decim var consider 1
+decintact 1
+decipher 1
+decipher th inform 1
+decl 30
+decl a list 1
+decl a serv 1
+decl a tern 1
+decl acc 1
+decl an empt 1
+decl and definit 1
+decl and eff 1
+decl and log 1
+decl and nonexecut 1
+decl and object 1
+decl and oper 1
+decl and refer 1
+decl ar dep 1
+decl ar forml 1
+decl as plur 1
+decl as subtyp 1
+decl but ad 1
+decl cal 1
+decl chang 1
+decl concur 1
+decl concur object 1
+decl contain 1
+decl correspon 1
+decl datab 2
+decl datab program 1
+decl datab upd 2
+decl debug 1
+decl def 1
+decl effort 1
+decl el 1
+decl el expr 1
+decl ent 1
+decl environm 1
+decl expr 2
+decl for prolog 1
+decl for twosym 1
+decl form 1
+decl fr 1
+decl fr typ 1
+decl gtop 1
+decl hav chang 1
+decl hav simil 1
+decl in ad 1
+decl in circl 1
+decl in knowledg 1
+decl in modl 1
+decl in natur 1
+decl in order 1
+decl in prolog 1
+decl in sl1 1
+decl inclus 1
+decl ind 1
+decl int ad 1
+decl is hid 1
+decl is non 1
+decl is requir 1
+decl knowledg 2
+decl langu 3
+decl langu styl 1
+decl list 1
+decl log 1
+decl log program 1
+decl manner 1
+decl may caus 1
+decl may render 1
+decl may unnec 1
+decl method 1
+decl method devot 1
+decl model 1
+decl natur 1
+decl nod 1
+decl not contain 1
+decl of link 1
+decl of pr 1
+decl of typ 2
+decl of var 1
+decl or defin 1
+decl part 1
+decl priv 1
+decl priv funct 1
+decl proc 1
+decl proc repr 1
+decl program 1
+decl program langu 1
+decl qu 1
+decl qu langu 1
+decl reason 1
+decl reason chain 1
+decl repr 1
+decl sem 4
+decl specif 2
+decl stat 2
+decl styl 1
+decl th condit 1
+decl th ent 1
+decl th extern 1
+decl th funct 1
+decl th object 1
+decl th oper 1
+decl th server 1
+decl th sort 1
+decl that cent 1
+decl that y62l 1
+decl to inherit 1
+decl trac 1
+decl typ 1
+decl upd 1
+decl upd field.2 1
+decl vi 1
+decl vi circl 1
+decl which mak 1
+declarat 1
+declarat iv repr 1
+declin 3
+declin th condit 1
+declin to visit 1
+declip 1
+decluster 2
+decluster a spat 1
+decluster algorithm 1
+decluster and load 1
+decluster by using 1
+decluster coupl 1
+decluster dep 1
+decluster even outperform 1
+decluster for achief 1
+decluster for dlb 1
+decluster is effect 1
+decluster method 2
+decluster method fail 1
+decluster method outperform 1
+decluster method tr 1
+decluster object 1
+decluster of dat 1
+decluster of ext 1
+decluster of spat 1
+decluster oper 1
+decluster problem 1
+decluster spat 2
+decluster spat dat 1
+decluster spat datab 1
+decluster strateg 2
+decluster techniqu 1
+decluster th chunk 1
+decluster th dat 1
+decluster th non 1
+decluster to av 1
+decluster using 1
+decluster using error 1
+decluster using fract 1
+decluster with fic 1
+decluster without tak 1
+decmp 1
+decmp program 1
+decmp program langu 1
+decmp system 1
+decmp system overview 1
+decod 6
+decod a bit 1
+decod execut 1
+decod execut pipel 1
+decod hardwar 1
+decod involut 1
+decod involut comput 1
+decod log 1
+decod log cost 1
+decod log requir 1
+decod mechan 1
+decod proc 1
+decod proc tak 1
+decod stag 1
+decod th multidest 1
+decod th opcod 1
+decod tim 1
+decoder 2
+decoder for transform 1
+decoder us 1
+decoder wil se 1
+decomp 16
+decomp a giv 1
+decomp a posit 1
+decomp a system 1
+decomp and encapsl 1
+decomp and schedl 1
+decomp automat 1
+decomp hypergraph 1
+decomp imag 1
+decomp in order 1
+decomp instruc 1
+decomp instruc deal 1
+decomp int fic 1
+decomp int sub 1
+decomp learn 1
+decomp level 1
+decomp norm 1
+decomp norm form 1
+decomp problem 1
+decomp problem rel 1
+decomp reg 1
+decomp sign 1
+decomp sign band 1
+decomp system 1
+decomp th hierarch 1
+decomp th problem 1
+decompil 1
+decompiler 1
+decompiler compiler 1
+decomposit 25
+decomposit afford 1
+decomposit algorithm 1
+decomposit and confid 1
+decomposit and hierarch 1
+decomposit and interact 1
+decomposit and opt 1
+decomposit as mer 1
+decomposit by integr 1
+decomposit by theorem 1
+decomposit concept 1
+decomposit conduc 1
+decomposit continu 1
+decomposit defin 1
+decomposit descript 1
+decomposit expan 1
+decomposit f f1f2 1
+decomposit f f2f3 1
+decomposit f fj1fj2 1
+decomposit g fj1fj2 1
+decomposit in nc 1
+decomposit int ba 1
+decomposit int object 1
+decomposit interpr 1
+decomposit is brief 1
+decomposit is car 1
+decomposit is decomposit 1
+decomposit is giv 1
+decomposit is perform 1
+decomposit lead 1
+decomposit level 1
+decomposit m1 1
+decomposit method 2
+decomposit modl 1
+decomposit of coter 1
+decomposit of docum 1
+decomposit of fig 1
+decomposit of gener 1
+decomposit of imag 1
+decomposit of l2 1
+decomposit of posit 1
+decomposit of scientif 1
+decomposit of self 1
+decomposit of system 1
+decomposit of theorem 1
+decomposit oper 1
+decomposit oper simil 1
+decomposit over later 1
+decomposit paradigm 1
+decomposit perform 1
+decomposit procedur 1
+decomposit sequ 1
+decomposit step 1
+decomposit system 1
+decomposit task 1
+decomposit that seem 1
+decomposit through fast 1
+decomposit to approxim 1
+decomposit to gd 1
+decomposit wil becom 1
+decompr 2
+decompr imag 1
+decompr imag result 1
+decompsit 1
+decompsit docum 1
+decompsit docum understand 1
+deconfigur 1
+decoposit 1
+decor 1
+decor of nod 1
+decor of st 1
+decoupl 4
+decoupl by measur 1
+decoupl for lin 1
+decoupl graph 1
+decoupl graph interpr 1
+decoupl invar 1
+decoupl problem 1
+decoupl th interdep 1
+decoupl th multipl 1
+decp 1
+decp and incp 1
+decp being switch 1
+decr 56
+decr a register 1
+decr accord 1
+decr addr 1
+decr addr mod 1
+decr bi 1
+decr by half 1
+decr by inser 1
+decr by xor 1
+decr confid 1
+decr confid level 1
+decr cruisespeed 1
+decr del 1
+decr dg 1
+decr dg valu 1
+decr for faster 1
+decr from parameter 1
+decr from q1.6 1
+decr funct 4
+decr hyperbol 1
+decr in capac 2
+decr in depth 1
+decr in speed 1
+decr in speedup 1
+decr in tc 2
+decr it compact 1
+decr it cur 1
+decr key 1
+decr lik 1
+decr m0 1
+decr mod 1
+decr nor incr 1
+decr number 2
+decr of commun 1
+decr of privileg 1
+decr order 5
+decr over learn 1
+decr overlap 1
+decr search 1
+decr search spac 1
+decr slow 1
+decr st 1
+decr st order 1
+decr subscript 1
+decr subscript funct 1
+decr subst 1
+decr system 2
+decr system vol 2
+decr th assoc 1
+decr th aver 1
+decr th block 1
+decr th edg 1
+decr th length 1
+decr th loc 1
+decr th number 1
+decr th over 1
+decr th perform 1
+decr th prob 1
+decr th record 1
+decr th siz 2
+decr th temper 1
+decr th weight 1
+decr tren 1
+decr valu 1
+decr ver rapid 1
+decr weak 1
+decr weight 1
+decr with incr 2
+decr with larger 1
+decr with sub 1
+decr1 1
+decr1 and decr2 1
+decr2 1
+decr2 instruc 1
+decrc 1
+decrc prolog 1
+decreasek 1
+decreasek ef 1
+decreasek ef ci 1
+decrem 4
+decrem algorithm 1
+decrem algorithm inclus 1
+decrem comput 1
+decrem comput quer 1
+decrem downd 1
+decrem mod 1
+decrem order 1
+decrem rl 1
+decrem search 1
+decrem search begin 1
+decrem th fr 1
+decrem timesl 1
+decrem timesl comput 1
+decrem upd 1
+decrementn 1
+decrementn instruc 1
+decst 3
+ded 10
+ded 2tn 1
+ded a signif 1
+ded c cod 1
+ded diagnost 1
+ded diagnost rl 1
+ded hardwar 2
+ded implem 1
+ded loc 1
+ded loc environm 1
+ded me 1
+ded on bus 1
+ded pe 1
+ded pe serv 1
+ded server 1
+ded server pe 1
+ded signif 1
+ded signif fewer 1
+ded th bus 1
+ded tn 1
+ded to direct 1
+ded to inter 1
+ded to interswitch 1
+ded to problem 1
+ded to prolog 1
+dedid 1
+deduc 19
+deduc and accuml 1
+deduc and object 2
+deduc and upd 1
+deduc datab 5
+deduc datab system 1
+deduc datab upd 1
+deduc mechan 1
+deduc proc 1
+deduc propag 1
+deduc propag method 1
+deduc surfac 1
+deduc surfac norm 1
+deduc th nec 1
+deduc th propag 1
+deduc theorem 1
+deduc typ 1
+deduc typ restrict 1
+deduc using 1
+deduc when bar 1
+deduc with assoc 1
+deduc.ps.z 1
+deem 9
+deem a conjunct 1
+deem centr 1
+deem elig 1
+deem grammat 1
+deem impract 1
+deem nec 3
+deem non 1
+deem non determin 1
+deem worth 1
+deep 10
+deep an inherit 1
+deep and complec 1
+deep and qualit 1
+deep and surfac 2
+deep arit 1
+deep au 1
+deep au point 1
+deep backtrack 1
+deep backtrack tak 1
+deep com 1
+deep com de 1
+deep cop 1
+deep differ 1
+deep et fail 1
+deep exper 1
+deep exper system 1
+deep explicit 1
+deep fail 1
+deep hierarch 1
+deep inherit 1
+deep inherit hierarch 1
+deep knowledg 2
+deep level 1
+deep level reason 1
+deep level system 1
+deep model 2
+deep of exper 1
+deep our understand 1
+deep requ 1
+deep requ soit 1
+deep seq 1
+deep simil 1
+deep system 1
+deep tb 1
+deep2 1
+deepak 1
+deepak kapur 1
+deeper 6
+deeper hierarch 1
+deeper issu 1
+deeper posit 1
+deeper th hierarch 1
+deeper than other 1
+deeper understand 2
+deepest 1
+deepest challeng 1
+deepmost 1
+deepmost rightmost 1
+deepmost rightmost act 1
+deequ 1
+deer 3
+def 97
+def a back 1
+def a bound 1
+def a cach 1
+def a cl 1
+def a claus 1
+def a common 1
+def a compl 1
+def a concav 1
+def a convec 1
+def a denot 1
+def a design 1
+def a diagnost 1
+def a fam 1
+def a finit 1
+def a for 1
+def a forest 1
+def a fresh 1
+def a funct 7
+def a gener 1
+def a geometer 1
+def a glob 2
+def a mail 1
+def a map 3
+def a measur 1
+def a med 1
+def a model 1
+def a modl 1
+def a neighbor 1
+def a network 1
+def a parameter 1
+def a particl 1
+def a phy 1
+def a posit 3
+def a pr 2
+def a preorder 1
+def a probabil 1
+def a propag 1
+def a proper 1
+def a prov 1
+def a reader 1
+def a real 1
+def a requir 1
+def a scheduler 1
+def a se 2
+def a sem 2
+def a server 1
+def a simpl 2
+def a specif 1
+def a st 1
+def a syntact 1
+def a system 2
+def a theor 1
+def a tok 1
+def a top 1
+def a transl 1
+def a typ 1
+def a us 1
+def a valu 1
+def a writer 1
+def a5 1
+def adv 4
+def adv research 4
+def ak 1
+def algorithm 1
+def algorithm eval 1
+def an abstract 2
+def an ambigu 1
+def an analog 1
+def an appl 1
+def an ar 1
+def an architectur 1
+def an auxil 2
+def an envelop 1
+def an execut 1
+def an iter 1
+def an mlp 1
+def an oper 1
+def anc 1
+def and demonstr 1
+def and investig 1
+def and nam 1
+def and return 1
+def another funct 1
+def another sem 1
+def any kind 1
+def any oper 1
+def aug 1
+def author 1
+def author path 1
+def ba 1
+def ba term 1
+def bark 1
+def bark explan 1
+def bit 1
+def bit addit 1
+def bj 1
+def ci 1
+def cl 1
+def cl evalu 1
+def cl metaobj 1
+def cl metaobject 1
+def cl point 1
+def claus 1
+def client 1
+def client cl 1
+def compan 1
+def comparison 1
+def constraint 1
+def constraint hierarc 1
+def control 1
+def control regr 1
+def correspon 1
+def correspon sub 1
+def cover 1
+def dat 2
+def dat complec 1
+def dat point 1
+def denot 1
+def denot model 1
+def differ workload 1
+def dilat 1
+def dynam 1
+def dynam relationship 1
+def ei 1
+def error 1
+def error me 1
+def es 2
+def es defeat 1
+def exact 2
+def extern 1
+def extern voron 1
+def f1 1
+def fail 1
+def fail deep 1
+def fail got 1
+def fail shallow 1
+def fault 1
+def ff 1
+def fp 1
+def funct 1
+def fx1 1
+def fx1x2 1
+def fzt 1
+def fzt mzg1 1
+def g0 1
+def gener 2
+def gener compon 1
+def gener loc 1
+def gf 1
+def gt 1
+def hi layer 1
+def horizont 1
+def horizont fragm 1
+def i oe 1
+def implem 1
+def implem specif 1
+def ind2 1
+def ind3 1
+def ind4 1
+def inst 1
+def instead 1
+def io 1
+def io dev 1
+def it behavior 1
+def it funct 1
+def it mean 1
+def it prec 1
+def it se 1
+def j0 1
+def k chang 1
+def k sj 1
+def key 1
+def largest 1
+def link 1
+def link cl 1
+def list 1
+def loc 1
+def loc level 1
+def mac 1
+def mac degr 1
+def mc 1
+def method 2
+def method def 1
+def method evalu 1
+def method metaobj 1
+def method metaobject 1
+def method point 1
+def microsec 1
+def mj 1
+def mult 1
+def mult dim 1
+def multipl 1
+def multipl switch 1
+def nc 1
+def neck 1
+def neck bp 1
+def neck stat 1
+def neck virtu 1
+def new cl 1
+def new parallel 1
+def no string 1
+def nod 1
+def nod cl 1
+def nod cluster 1
+def nod frontendnod 1
+def nod nod 1
+def nod nodeb 1
+def nod processingnod 1
+def nod tp 1
+def non 1
+def non atom 1
+def num 1
+def num menu 1
+def object 1
+def object behavior 1
+def oe 3
+def oe oe 1
+def of mar 1
+def of pi 1
+def ol 1
+def our evalu 1
+def our problem 1
+def our threshold 1
+def parameter 2
+def parameter p1 2
+def parameter p2 2
+def pasc 1
+def patht 1
+def pav 1
+def perform 1
+def perform goal 1
+def posit 1
+def prolog 1
+def prolog me 1
+def re 1
+def recov 1
+def recov tim 1
+def reduc 1
+def refin 1
+def rel 1
+def rel account 1
+def rel db 1
+def retr 1
+def rewrit 1
+def rewrit log 1
+def rl 1
+def rol 1
+def rol relationship 1
+def s 1
+def saf 1
+def saf forml 1
+def se 1
+def sever kind 1
+def simil 1
+def simil matr 1
+def singl 1
+def singl color 1
+def sld 1
+def sld deriv 1
+def smooth 1
+def solut 1
+def som auxil 1
+def som funct 1
+def som measur 1
+def som proper 1
+def stj 1
+def stj msj 1
+def synth 1
+def synth workload 1
+def term 1
+def th act 1
+def th adjac 1
+def th ar 2
+def th architectur 1
+def th ba 1
+def th bound 1
+def th chunk 1
+def th cl 1
+def th claus 1
+def th comput 1
+def th concept 1
+def th conceptu 2
+def th condit 1
+def th conv 1
+def th correspon 1
+def th cost 2
+def th cr 1
+def th cur 1
+def th degr 1
+def th denot 2
+def th dil 1
+def th dim 1
+def th dist 1
+def th domain 1
+def th dum 1
+def th el 1
+def th en 1
+def th equiv 1
+def th ext 2
+def th fac 1
+def th failover 1
+def th famil 1
+def th fan 1
+def th fd 1
+def th fixpoint 1
+def th form 1
+def th fram 1
+def th funct 1
+def th graph 3
+def th high 1
+def th ind 2
+def th inequ 1
+def th infinit 1
+def th init 2
+def th intent 1
+def th interfac 1
+def th level 2
+def th lim 1
+def th map 1
+def th mlp 1
+def th model 1
+def th neighbor 2
+def th norm 1
+def th not 4
+def th observabl 1
+def th oper 4
+def th optim 1
+def th over 1
+def th parameter 1
+def th particl 1
+def th pasc 1
+def th peer 1
+def th pop2 1
+def th posit 2
+def th pr 2
+def th prior 1
+def th problem 2
+def th proof 1
+def th qu 1
+def th quant 1
+def th rad 1
+def th result 1
+def th rl 1
+def th rp 1
+def th schedl 1
+def th scop 1
+def th se 1
+def th sem 2
+def th shout 1
+def th simplif 1
+def th siz 1
+def th sort 1
+def th spat 1
+def th st 1
+def th start 1
+def th string 1
+def th structur 1
+def th switch 1
+def th system 2
+def th tail 1
+def th term 1
+def th theor 1
+def th traver 1
+def th typ 1
+def th union 1
+def th usu 1
+def th var 1
+def th virtu 1
+def th weight 1
+def them construc 1
+def thr abstract 1
+def thr method 1
+def thr refin 1
+def ti 1
+def transact 1
+def transact cl 1
+def trust 1
+def try 1
+def turn 1
+def tw posit 1
+def typ 1
+def typ correct 1
+def us 1
+def us con 1
+def using 1
+def variabl 1
+def ver 1
+def ver fragm 1
+def wavel 1
+def wavel pack 1
+def which fac 1
+def workflow 1
+def workflow cl 1
+def x0 1
+def xi 1
+def ye 1
+def ye string 1
+defact 1
+defact bound 1
+defact bound stack 1
+defact customer 1
+defact dispatch 1
+defact jc 1
+defact mailq 1
+defact mymailq 1
+defact pop2 1
+defact pop2 stack 1
+defact stack 1
+default 24
+default approach 1
+default approach maintain 1
+default argum 1
+default arithm 1
+default arithm compil 1
+default ba 1
+default ba level 1
+default bod 1
+default ca 1
+default ca edg 1
+default comput 1
+default comput inst 1
+default condit 1
+default condit handler 1
+default constraint 1
+default deliv 1
+default deliv rl 1
+default dispatch 2
+default dispatch act 1
+default dispatch mechan 1
+default edg 1
+default effect 1
+default gener 1
+default gener dispatch 1
+default handler 1
+default init 1
+default init method 1
+default init slot 1
+default is cl 1
+default lec 1
+default lec analyser 1
+default left toright 1
+default lexer 1
+default lexer conform 1
+default loc 1
+default loc pol 1
+default mail 1
+default mail queu 1
+default mailq 1
+default me 2
+default me interpreter 1
+default me object 1
+default me siz 1
+default method 1
+default method attach 1
+default method check 1
+default method impl 1
+default method profit 1
+default method return 1
+default multilevel 1
+default multilevel recur 1
+default not 1
+default number 1
+default of np 1
+default organ 1
+default organ pol 1
+default parameter 1
+default perform 1
+default perform parameter 1
+default run 1
+default seed 1
+default seed valu 1
+default string 1
+default supercl 1
+default to comput 1
+default to gener 1
+default to loc 1
+default to method 1
+default valu 1
+defcl 1
+defcl and pa 1
+defcl cl 1
+defcl cl nam 1
+defcl form 1
+defcl form ext 1
+defcl mer 1
+defcl mer bind 1
+defcl syntac 1
+defcondit 1
+defcondit condit 1
+defcondit condit cl 1
+defcondit defin 1
+defcondit defin form 1
+defconst 1
+defconst defin 1
+defconst defin form 1
+defconst identif 1
+defconst identif form 1
+defeat 1
+defeat our hop 1
+defect 1
+defect pot 1
+defect remov 1
+defect remov eff 1
+defer 6
+defer mak 1
+defer oper 1
+defer th credit 1
+defer th split 1
+defer until runtim 1
+deff 3
+deff de 1
+deff de bord 1
+deff gr 1
+deff gr ac 1
+deff peut 1
+deff peut aus 1
+deff ping 1
+deff ping pong 1
+deff significatif 1
+deff significatif sur 1
+deff sur 1
+deff sur le 1
+deffectuer 2
+deffectuer de 1
+deffectuer de modif 1
+deffectuer la 1
+deffectuer la coupur 1
+deffectuer lallong 1
+deffectuer lallong maxim 1
+deffectuer le 1
+deffectuer le partit 1
+deffectuer plusieur 1
+deffectuer plusieur ecritur 1
+deffectuer son 1
+deffectuer son ecritur 1
+deffectuer tous 1
+deffectuer tous se 1
+deffectuer un 1
+deffectuer un elim 1
+deffectuer un etud 1
+deffectuer un partit 1
+defficacit 1
+deffort 1
+deffort doiv 1
+deffort doiv etr 1
+defgener 1
+defgener a gener 1
+defgener and defmethod 1
+defgener and pa 1
+defgener defin 1
+defgener defin form 1
+defgener form 1
+defgener gf 1
+defgener gf nam 1
+defgener identif 1
+defgener identif gen 1
+defgener is giv 1
+defgener or defmethod 1
+defgener rewrit 1
+defgener rewrit rl 1
+defgener syntac 1
+deficit 1
+deficit round robin 1
+defin 101
+defin a cl 1
+defin a datab 1
+defin a doughnut 1
+defin a gener 1
+defin a layer 1
+defin a modl 1
+defin a mult 1
+defin a po 1
+defin a resolut 1
+defin a simpl 1
+defin a st 1
+defin a syntact 1
+defin abstract 1
+defin act 1
+defin act se 1
+defin amount 1
+defin an appropr 1
+defin an ar 1
+defin an inform 1
+defin an interv 1
+defin analog 1
+defin and disc 1
+defin and import 1
+defin and inclus 1
+defin appropr 2
+defin appropr cost 1
+defin appropr strateg 1
+defin as belong 1
+defin as composit 1
+defin as con 1
+defin as design 2
+defin as divid 1
+defin as dl 1
+defin as follow 20
+defin as fx 1
+defin as good 2
+defin as hi 1
+defin as is 1
+defin as ks 1
+defin as lexicograph 1
+defin as oe1oe2 1
+defin as part 1
+defin as predict 1
+defin as program 1
+defin as reader 1
+defin as using 1
+defin as usu 2
+defin as writer 1
+defin at connect 1
+defin at currnod 1
+defin at graph 1
+defin axiom 1
+defin ba 1
+defin benefit 1
+defin between pair 1
+defin bind 1
+defin block 1
+defin block edit 1
+defin bound 1
+defin by ahamad 1
+defin by cam 1
+defin by cw 1
+defin by defin 1
+defin by definit 1
+defin by di 1
+defin by exact 1
+defin by extern 1
+defin by fc 1
+defin by fib 1
+defin by flat 1
+defin by forml 1
+defin by fx 1
+defin by ht 1
+defin by jon 1
+defin by mv 1
+defin by non 1
+defin by rewrit 1
+defin by self 1
+defin by ss 1
+defin by term 1
+defin by xi 1
+defin by yi 1
+defin by2 1
+defin certain funct 1
+defin cl 1
+defin cl describ 1
+defin claus 1
+defin comp 1
+defin comp oper 1
+defin compon 1
+defin concept 1
+defin concept ob 1
+defin const 1
+defin const tick 1
+defin constraint 2
+defin constraint hierarc 1
+defin custom 1
+defin custom famil 1
+defin dat 1
+defin dynam 1
+defin dynam behaviour 1
+defin earl 1
+defin elsewh 1
+defin error 1
+defin error bound 1
+defin event 1
+defin event handler 1
+defin ext 1
+defin fd 1
+defin finit 1
+defin finit output 1
+defin fit 1
+defin for lambd 1
+defin for log 1
+defin for minrol 1
+defin for reduc 1
+defin for rout 1
+defin for system 1
+defin for test 1
+defin form 2
+defin form def 1
+defin form ext 1
+defin from got 1
+defin from ss0 1
+defin funct 2
+defin funct appl 1
+defin funct assum 1
+defin funct cal 1
+defin funct symbol 1
+defin gener 1
+defin gener funct 1
+defin handler 1
+defin ident 1
+defin in alphab 1
+defin in annec 1
+defin in ec 1
+defin in equ 1
+defin in erg 1
+defin in fib 1
+defin in log 1
+defin in plac 1
+defin in precc 1
+defin in sect 6
+defin in tabl 1
+defin in term 10
+defin in transform 1
+defin in var 1
+defin induc 2
+defin inform 1
+defin interfac 1
+defin it using 1
+defin keyword 1
+defin length 1
+defin length specif 1
+defin loc 2
+defin loc correct 1
+defin lock 1
+defin lock 1s 1
+defin memor 1
+defin memor manag 1
+defin metacl 1
+defin method 1
+defin method lookup 1
+defin method spec 1
+defin modl 1
+defin nam 1
+defin new method 1
+defin non 2
+defin non atom 1
+defin non evalu 1
+defin nondetermin 1
+defin nondetermin ch 1
+defin object 3
+defin object cl 1
+defin occur 1
+defin on ad 1
+defin on cl 1
+defin on domain 1
+defin on inst 1
+defin on nod 1
+defin on path 1
+defin on x1 1
+defin on xu 1
+defin oper 1
+defin or search 1
+defin order 2
+defin other field 1
+defin pr 1
+defin prior 1
+defin problem 1
+defin procedur 1
+defin produc 1
+defin produc variabl 1
+defin program 1
+defin protocol 1
+defin qsm 1
+defin recur 3
+defin rel 1
+defin resourc 1
+defin resourc bound 1
+defin rid 1
+defin rl 1
+defin rl assoc 1
+defin rl bool 1
+defin sem 1
+defin separ 1
+defin separ using 1
+defin short 1
+defin simil 2
+defin slot 1
+defin slot descript 1
+defin slot opt 1
+defin step 1
+defin stream 1
+defin stream cl 1
+defin structur 2
+defin structur cl 1
+defin symbol 1
+defin symbol attribut 1
+defin th behaviour 1
+defin th compon 1
+defin th conceptu 1
+defin th condit 1
+defin th domain 1
+defin th edb 1
+defin th funct 1
+defin th idb 1
+defin th impur 1
+defin th indent 1
+defin th lock 1
+defin th optim 1
+defin th polyhedr 1
+defin th rat 1
+defin th rel 1
+defin th relationship 1
+defin th repr 1
+defin th requir 1
+defin th se 1
+defin their relationship 1
+defin through compon 1
+defin through judg 1
+defin through rewrit 1
+defin to commut 1
+defin to man 1
+defin to me 1
+defin to nil 1
+defin to propag 1
+defin to return 1
+defin topolog 1
+defin topolog proper 1
+defin tramsform 1
+defin us 1
+defin us measur 1
+defin using 2
+defin using defcondit 1
+defin wh privileg 1
+defin when using 1
+defin with respect 1
+defin writer 1
+definer 1
+definer can re 1
+definit 89
+definit a point 1
+definit a reg 1
+definit adj 1
+definit al requir 1
+definit and accompan 1
+definit and act 1
+definit and an 1
+definit and appl 1
+definit and assum 1
+definit and axiom 1
+definit and ba 2
+definit and compiler 1
+definit and compon 1
+definit and control 1
+definit and exampl 1
+definit and expr 1
+definit and finit 1
+definit and implem 1
+definit and import 1
+definit and not 3
+definit and prerequisit 1
+definit and protocol 1
+definit and result 1
+definit and typ 1
+definit and user 1
+definit anywh 2
+definit appear 1
+definit ar dynam 1
+definit ar giv 2
+definit ar indep 1
+definit ar mad 1
+definit ar natur 1
+definit ar near 1
+definit ar summar 1
+definit ar transl 1
+definit at tim 1
+definit ba 1
+definit be eventu 1
+definit becaus funct 1
+definit benefit 1
+definit by exampl 1
+definit ca 1
+definit cl 1
+definit cl funct 1
+definit claus 1
+definit compr 1
+definit contain 1
+definit contain entr 1
+definit correspon 2
+definit def 2
+definit def inst 1
+definit describ 2
+definit desir 1
+definit determin 1
+definit displ 1
+definit distract 1
+definit du 1
+definit dur anim 1
+definit ent 1
+definit enter 1
+definit expr 1
+definit fal 1
+definit finit 1
+definit for al 1
+definit for branch 1
+definit for cl 2
+definit for inst 1
+definit for multicast 1
+definit form 1
+definit form using 1
+definit found 1
+definit fulfil 1
+definit funct 1
+definit funct fu0 1
+definit giv 1
+definit guar 1
+definit identif 1
+definit improv 1
+definit in gener 1
+definit in order 1
+definit in ps 1
+definit in sect 2
+definit in term 1
+definit int polygon 1
+definit involut 1
+definit is ba 1
+definit is defin 1
+definit is equiv 1
+definit is frequ 1
+definit is giv 1
+definit is guaranteed 1
+definit is organ 1
+definit is replac 1
+definit is requir 1
+definit is simil 1
+definit is smaller 1
+definit is substitut 1
+definit lin 1
+definit lin funct 1
+definit log 1
+definit log program 1
+definit mach 1
+definit match 1
+definit match cl 1
+definit matr 3
+definit may us 1
+definit mean 1
+definit might rel 1
+definit must ind 1
+definit occur 1
+definit of abcl 1
+definit of abstract 2
+definit of act 1
+definit of an 1
+definit of augm 1
+definit of ba 1
+definit of babel 1
+definit of backtrack 1
+definit of bark 1
+definit of charg 1
+definit of claus 1
+definit of client 1
+definit of cn 1
+definit of constraint 1
+definit of context 1
+definit of converter 1
+definit of dat 1
+definit of deep 1
+definit of defgener 1
+definit of del 1
+definit of deriv 1
+definit of direct 1
+definit of dist 1
+definit of eq 1
+definit of evolut 1
+definit of expect 1
+definit of fd 1
+definit of fdf 1
+definit of fork 1
+definit of front 1
+definit of gener 1
+definit of green 1
+definit of hierarch 1
+definit of hybrid 2
+definit of hyperoctr 1
+definit of import 1
+definit of indistingu 1
+definit of inform 1
+definit of innermost 1
+definit of inv 1
+definit of krestkk 1
+definit of level 1
+definit of lock 1
+definit of mgu 1
+definit of multicast 1
+definit of non 1
+definit of nr 1
+definit of oe0 1
+definit of oper 1
+definit of optim 1
+definit of parallel 1
+definit of part 1
+definit of pasc 1
+definit of perform 1
+definit of pot 1
+definit of privileg 1
+definit of prm 1
+definit of produc 1
+definit of program 1
+definit of prolog 1
+definit of promot 1
+definit of qu 1
+definit of rat 1
+definit of receiver 1
+definit of rel 1
+definit of sign 1
+definit of singl 1
+definit of ssm 1
+definit of standard 1
+definit of topolog 1
+definit of transact 1
+definit of typ 2
+definit of ui 1
+definit of us 1
+definit of v2e 1
+definit of var 1
+definit of variabl 1
+definit of voron 1
+definit of welltyp 1
+definit of wi 1
+definit of workflow 1
+definit or extent 1
+definit over 1
+definit pr 1
+definit prec 1
+definit proc 1
+definit progr 1
+definit program 2
+definit prov 1
+definit prov guid 1
+definit q number 1
+definit requir 3
+definit satisf 1
+definit script 1
+definit script resembl 1
+definit specif 1
+definit status 1
+definit styl 1
+definit synchron 1
+definit system 1
+definit th term 1
+definit to describ 1
+definit to effect 1
+definit to expr 1
+definit to rel 1
+definit us 1
+definit we giv 1
+definit we refer 1
+definit wish 1
+definit wish particl 1
+definit with explan 1
+definit with parameter 1
+definit with respect 2
+definit1 1
+definiteprompt 1
+definitionsprotocol 1
+definitionsprotocol displaydev 1
+definitionsprotocol displaydev extract 1
+defint 1
+defloc 1
+defloc ar modif 1
+defloc ar mut 1
+defloc cr 1
+defloc defin 1
+defloc defin form 1
+defloc form 1
+defloc identif 1
+defloc identif form 1
+defmacr 1
+defmacr form 1
+defmacr form def 1
+defmacr macr 1
+defmacr macr nam 1
+defmacr syntac 1
+defmethod 1
+defmethod form 1
+defmethod gf 1
+defmethod gf nam 1
+defmethod macr 1
+defmethod or gener 1
+defmodl 1
+defmodl a modl 1
+defmodl eulisp 1
+defmodl eulisp level 1
+defmodl form 1
+defmodl form def 1
+defmodl modl 1
+defmodl modl nam 1
+defmodl syntac 1
+deform 2
+deform algorithm 1
+deform and csg 1
+deform csg 1
+deform csg model 1
+deform oper 1
+defrl 1
+defrl i pair 1
+defstruc 1
+defstruc cl 1
+defstruc cl nam 1
+defstruc cr 1
+defstruc defin 1
+defstruc defin form 1
+defstruc form 1
+defstruc in allow 1
+defstruc is defin 1
+defstruc syntac 1
+defstruc syntac cl 1
+defun 1
+defun ar giv 1
+defun form 1
+defun form def 1
+defun funct 1
+defun funct nam 1
+defun identif 1
+defun identif lambd 1
+defun path 1
+defun rewrit 1
+defun rewrit rl 1
+defun syntac 1
+defvar 1
+deg 3
+deg 0.2f 1
+deg degev 1
+deg degev degexc 1
+deg degr 1
+deg mod 1
+deg pathlength 1
+deg reducemac16 1
+deg result 1
+deg84 1
+degener 8
+degener b tr 1
+degener ca 1
+degener cel 1
+degener form 1
+degener int ordin 1
+degener of tetrahedr 1
+degener sol 1
+degener te. 1
+degev 1
+degev bdeg 1
+degev degexc 1
+degexc 1
+degexc deg 1
+degr 48
+degr ae 1
+degr and system 1
+degr ar bound 1
+degr ar inser 1
+degr ba 1
+degr ba order 1
+degr ba osl 1
+degr be evalu 1
+degr can ch 1
+degr clock 1
+degr d inst 1
+degr d problem 1
+degr distribut 1
+degr e accept 1
+degr e de 2
+degr e deux 1
+degr e dinteract 1
+degr e du 2
+degr e dun 1
+degr e est 1
+degr e moin 1
+degr e si 1
+degr e soit 1
+degr e sup 1
+degr es 1
+degr es de 1
+degr es est 1
+degr heur 1
+degr hypercub 1
+degr hypercub network 1
+degr is greater 1
+degr is minim 1
+degr log 1
+degr modl 1
+degr modl opt 1
+degr network 2
+degr network design 1
+degr nod 3
+degr of accur 2
+degr of acquisit 1
+degr of amount 1
+degr of approxim 1
+degr of associat 1
+degr of bronchit 1
+degr of cluster 1
+degr of coarser 1
+degr of con 1
+degr of cont 1
+degr of detail 1
+degr of dev 1
+degr of direct 1
+degr of eff 1
+degr of fal 1
+degr of flec 1
+degr of freedom 5
+degr of funct 1
+degr of g1 1
+degr of graph 1
+degr of imb 1
+degr of interfer 1
+degr of loc 1
+degr of multicast 1
+degr of nod 2
+degr of nonl 1
+degr of parallel 2
+degr of part 1
+degr of rel 1
+degr of repl 2
+degr of shar 1
+degr of shout 1
+degr of str 1
+degr of uncertaint 1
+degr of uniform 1
+degr of val 1
+degr of ver 1
+degr on nod 1
+degr on ver 1
+degr order 1
+degr order algorithm 1
+degr order heur 1
+degr pn 1
+degr polynom 1
+degr reducemac16 1
+degr sendwithad32 1
+degr span 1
+degr span tr 1
+degr spanner 1
+degr specif 1
+degr ss 1
+degr steiner 1
+degr steiner tr 1
+degr than g0 1
+degr thriv 1
+degr thriv temper 1
+degr turn 1
+degr when serv 1
+degr which mak 2
+degrad 22
+degrad caus 1
+degrad du 2
+degrad effect 1
+degrad effect identif 1
+degrad from q1.5 1
+degrad gener 1
+degrad gener accur 1
+degrad ha forc 1
+degrad in execut 1
+degrad in numer 1
+degrad in parallel 1
+degrad in perform 3
+degrad in q7 1
+degrad in ss 1
+degrad in system 1
+degrad incr 1
+degrad int account 1
+degrad is obv 1
+degrad it del 1
+degrad it perform 1
+degrad leav 1
+degrad mod 1
+degrad of fal 1
+degrad of memor 1
+degrad of perform 1
+degrad of softwar 1
+degrad perform 3
+degrad perform signif 1
+degrad regl 1
+degrad subst 1
+degrad th perform 3
+degrad th system 1
+degrad through maint 1
+degrad wa quantif 1
+degroot 2
+dehn 1
+dehn andr 1
+dehn andr fabr 1
+dehn y andr 1
+dehor 3
+dehor de 3
+dehor de attribut 1
+dehor de ce 1
+dehor de trajectoir 1
+dehor du 2
+dehor du cadr 1
+dehor du champ 1
+dehor du context 1
+dehor du retour 1
+dejavu 1
+dejavu implem 1
+dejavu on player 1
+dejavu1 1
+dejavu1 alw select 1
+dejavu1 and dejavu2 1
+dejavu1 reduc 1
+dejavu1 reduc test 1
+dejavu2 1
+dejavu2 averag 1
+dejavu2 find 1
+dejavu2 guar 1
+dejavu2 incr 1
+dejavu2 produc 1
+dejavu2 rang 1
+dejavu2 sav 1
+dejavu2 select 1
+dejong 2
+dejong moon 1
+dekker 2
+del 68
+del a 3d 2
+del a claus 1
+del a compl 1
+del a dan 1
+del a de 2
+del a despac 1
+del a du 2
+del a dun 1
+del a giv 1
+del a nod 1
+del a proc 1
+del a specif 1
+del a tok 1
+del a transform 1
+del acc 1
+del al affect 1
+del al claus 1
+del al edg 1
+del al record 1
+del an 1
+del an entir 1
+del and bandwidth 1
+del and buffer 1
+del and burst 1
+del and decreasek 1
+del and error 1
+del and fair 1
+del and implem 1
+del and maxim 1
+del and me 1
+del and merg 1
+del and modif 1
+del and result 1
+del and split 1
+del and throughput 1
+del ar allow 1
+del ar measur 1
+del ar rel 1
+del ar shown 1
+del architectur 1
+del as follow 1
+del as gp 1
+del avg 1
+del becaus uj 1
+del behavior 1
+del between connect 1
+del between pack 1
+del between succ 1
+del bind 1
+del both nod 1
+del bound 1
+del bound ident 1
+del but cheaper 1
+del but incur 1
+del by di 1
+del by effect 1
+del by overlap 1
+del by superv 1
+del capabil 1
+del cer 3
+del ch 1
+del ch point 1
+del character 1
+del check 1
+del claus 1
+del compon 1
+del comput 1
+del comput non 1
+del constraint 1
+del coord 1
+del coord map 1
+del coord reconstruc 1
+del cop 1
+del correspon 1
+del dam 1
+del dam algorithm 1
+del dam approach 1
+del dam model 1
+del dec 1
+del decl 1
+del decl def 1
+del degrad 1
+del deliv 1
+del dep 1
+del dk 1
+del dsp 1
+del dsp follow 1
+del du 3
+del earliest 1
+del earliest du 1
+del ec 1
+del ed 1
+del ed follow 1
+del effect 1
+del effect pot 1
+del emb 1
+del exampl 1
+del exper 1
+del feedback 1
+del filter 1
+del flag 1
+del flag valu 1
+del follow 1
+del for virtu 1
+del funct 2
+del funct superior 1
+del gald 1
+del gener 1
+del gener tupl 1
+del goal 1
+del guar 1
+del he caus 1
+del in calcl 1
+del in me 1
+del in med 1
+del in millisecon 1
+del in parallel 1
+del in probabil 1
+del in r4 1
+del in sampl 1
+del in scientif 1
+del in shar 1
+del in transit 1
+del incur 1
+del inser 1
+del inser pair 1
+del inst 1
+del intersect 1
+del interv 1
+del irrelev 1
+del irrelev argum 1
+del is greater 1
+del is random 1
+del is requir 1
+del is rol 1
+del is transform 1
+del it instead 1
+del item 1
+del item int 1
+del j formfeed 1
+del jitter 1
+del jitter bound 1
+del larger 1
+del larger batch 1
+del lin 1
+del lin input 1
+del lin start 1
+del mac 2
+del mac del 1
+del mac tok 1
+del macr 1
+del mak 1
+del mar 1
+del me 1
+del memor 1
+del memor structur 1
+del min 1
+del min tok 1
+del montr 1
+del montr qu 1
+del multithread 1
+del n el 1
+del neur 2
+del neur network 2
+del new tr 1
+del nod 3
+del nod dynam 1
+del nod recov 1
+del occur 1
+del of nod 3
+del of object 1
+del of s7 1
+del of se 1
+del of singl 1
+del of ver 1
+del of weight 1
+del on el 1
+del oper 4
+del oper ensur 1
+del oper remov 1
+del or synchron 1
+del pack 1
+del path 1
+del per dat 1
+del per pack 1
+del re 1
+del remain 1
+del remain finit 1
+del respon 1
+del rj 1
+del rol 1
+del rout 1
+del search 1
+del seen 1
+del sen 1
+del sen me 1
+del shift 1
+del shoot 1
+del som solut 1
+del spac 1
+del spac emb 1
+del specif 1
+del stat 1
+del tap 1
+del targ 1
+del th direct 1
+del th edg 2
+del th el 1
+del th item 1
+del th memor 1
+del th parent 1
+del th rep 1
+del th respon 1
+del th satisf 1
+del th ver 1
+del than non 1
+del tim 2
+del tok 1
+del top 1
+del top level 1
+del tradeoff 1
+del until specif 1
+del until suff 1
+del upd 1
+del var 2
+del var s.se 1
+del ver 1
+del vs 1
+del vs tim 1
+del which involut 1
+del wil ad 1
+del with const 1
+del without affect 2
+del without chang 1
+del without privileg 1
+del wont incr 1
+delan 1
+delan granst 1
+delaun 1
+delaun appliqu 1
+delaun appliqu ee 1
+delaun de 1
+delaun de contour 1
+delaun edg 1
+delaun edg dual 1
+delaun reconstruc 1
+delaun reconstruc prop 1
+delaun triangl 1
+delaun triangl becom 1
+delaun triangl maximiz 1
+delayboolean 1
+delayboolean exp 1
+delcourt 1
+delcourt and rober 1
+deleg 4
+deleg automat 1
+deleg link 1
+deleg of control 1
+deleg of work 1
+deleg so ec 1
+deleg th work 1
+deletemin 1
+deletemin by se 1
+deletemin cal 1
+deletemin del 1
+deletemin demonstr 1
+deletemin oper 1
+deletemin oper boil 1
+deletemin proceed 1
+deletemin request 1
+deletemin request simp 1
+deletemin requir 1
+deletemin requir amort 1
+deletemin requir tim 1
+deleter 1
+deleter effect 1
+deletingpijd 1
+deletingpijd for uij 1
+delft 3
+delft delft 2
+delft th netherland 1
+delg 1
+delg tim 1
+deliber 5
+deliber mad 1
+deliber mad denser 1
+deliber restrict 1
+deliber restrict program 1
+deliber simplif 1
+deliber simplif ver 1
+deliber to mus 1
+delim 2
+delim prec 1
+delim self 1
+delim self modif 1
+delim their scop 1
+delimiter 1
+delimiter of pasc 1
+delin 1
+deliv 12
+deliv algorithm 1
+deliv atom 1
+deliv atom multicast 1
+deliv between pair 1
+deliv by me 1
+deliv cannot occur 1
+deliv capabil 1
+deliv del 2
+deliv is trigger 1
+deliv lat 1
+deliv list 1
+deliv me 1
+deliv mechan 1
+deliv occur 1
+deliv of dat 1
+deliv of interrupt 1
+deliv of me 2
+deliv of pack 1
+deliv of result 1
+deliv of transport 1
+deliv of uncorrupt 1
+deliv order 1
+deliv pr 1
+deliv protocol 1
+deliv protocol us 1
+deliv rl 1
+deliv rl 1b 1
+deliv serv 1
+deliv tim.4 1
+deliv tim.4 refer 1
+deliv to user 1
+deliv tr 1
+deliv vehicl 1
+deliver 22
+deliver a me 1
+deliver al sourc 1
+deliver an adv 1
+deliver any me 1
+deliver bandwidth 1
+deliver best perform 1
+deliver better perform 1
+deliver between configur 1
+deliver by tot 1
+deliver ear sourc 1
+deliver good 1
+deliver good collect 1
+deliver good perform 1
+deliver group 1
+deliver group me 1
+deliver high 1
+deliver high perform 1
+deliver high system 1
+deliver interact 1
+deliver interact cour 1
+deliver le throughput 1
+deliver maxim 3
+deliver maxim system 2
+deliver maxim throughput 1
+deliver me 1
+deliver mg 1
+deliver mi 1
+deliver multicast 1
+deliver multicast perform 1
+deliver onl uncorrupt 1
+deliver pm4b 1
+deliver prom 1
+deliver prom softwar 1
+deliver sg 1
+deliver simil 1
+deliver simil perform 1
+deliver spec 1
+deliver spec technolog 1
+deliver sw 1
+deliver th highest 1
+deliver th me 1
+deliver th re. 1
+deliver th result 1
+deliver th root 1
+deliver th technolog 1
+deliver them lat 1
+deliver to exact 1
+deliver vi 1
+deliver vi event 1
+deliver wp1 1
+deliver wp1 t.1.1 1
+dellaroc 1
+dellaroc c.n 1
+delobel 2
+delor 1
+delt 2
+delt meter 1
+delt system 1
+deltablu 1
+deltablu paper 1
+deltastar 1
+deltastar algorithm 1
+dem 4
+dem appl 1
+dem dan 1
+dem et mar 1
+dem largeur 1
+dem obtenu 1
+dem obtenu en 1
+dem prop 1
+dem prop de 1
+dem qu 1
+dem qu lext 1
+dem ton 1
+dem ton dod 1
+dem. 1
+demand 20
+demand 25mb 2
+demand a con 1
+demand a parcourir 1
+demand a reloger 1
+demand a tester 1
+demand and produc 1
+demand ar defin 2
+demand ar disc 2
+demand bandwidth 2
+demand bandwidth w.r.t 2
+demand bisect 2
+demand bisect bandwidth 2
+demand by proc 2
+demand dacc 1
+demand de 1
+demand dep 2
+demand driv 1
+demand e la 1
+demand explicit 1
+demand for continu 1
+demand for predict 1
+demand from multipl 1
+demand in tabl 2
+demand inter 2
+demand inter cluster 2
+demand is sent 1
+demand lat 1
+demand lat bind 1
+demand lead 1
+demand of nd 2
+demand on bandwidth 2
+demand on comput 1
+demand on network 2
+demand pa 1
+demand rat 2
+demand serv 1
+demand simpl 1
+demand simpl de 1
+demand testb 1
+demand to ad 1
+demand tot 2
+demand tot interconnect 2
+demand traff 2
+demand un 1
+demand un an 1
+demand un etud 1
+demand un indirect 1
+demand under loc 2
+demander 1
+demander jusqu 1
+demander si 1
+demander si la 1
+demandeur 1
+demarc 1
+demarc a number 1
+demarc and ec 1
+demarc indirect 1
+demarc th reg 1
+demer 1
+demeter 2
+demeter for cl 1
+demeter for funct 1
+demeter gener 1
+demeter impl 1
+demeter method 2
+demeter paper 1
+demeter system 1
+demeter system con 1
+demeter tool 1
+demeur 2
+demeur import 1
+demichiel 1
+demograph 1
+demograph dat 1
+demon 1
+demon ch 1
+demon had mer 1
+demon in figur 1
+demon may se 1
+demon proc 1
+demon proc using 1
+demon shout 1
+demon that shout 1
+demonstr 57
+demonstr an implem 1
+demonstr by ca 1
+demonstr by evan 1
+demonstr clear 1
+demonstr design 1
+demonstr design cost 1
+demonstr earl 2
+demonstr exact 1
+demonstr further 1
+demonstr how cl 1
+demonstr how complec 1
+demonstr improv 1
+demonstr improv perform 1
+demonstr in sect 1
+demonstr it abil 1
+demonstr it effect 1
+demonstr it pract 1
+demonstr it superior 1
+demonstr loc 1
+demonstr loc propag 1
+demonstr our approach 1
+demonstr our id 1
+demonstr pot 1
+demonstr program 1
+demonstr program construc 1
+demonstr purp 1
+demonstr real 1
+demonstr smooth 1
+demonstr som prom 1
+demonstr th approach 1
+demonstr th behaviour 1
+demonstr th benef 1
+demonstr th benefit 1
+demonstr th complec 1
+demonstr th detail 1
+demonstr th ea 1
+demonstr th effect 1
+demonstr th expr 1
+demonstr th fe 1
+demonstr th flec 1
+demonstr th fundam 1
+demonstr th impact 2
+demonstr th nec 1
+demonstr th pract 1
+demonstr th principl 1
+demonstr th procedur 1
+demonstr th requir 1
+demonstr th robust 1
+demonstr th stat 1
+demonstr th superior 2
+demonstr th transform 1
+demonstr th us 2
+demonstr that giv 1
+demonstr that loc 1
+demonstr that me 1
+demonstr that narx 1
+demonstr that rel 1
+demonstr that scal 1
+demonstr that subst 2
+demonstr that us 1
+demonstr to ec 1
+demonstr unsatisf 1
+demonstr using 1
+demonstr var 1
+demonstr var aspect 1
+dempil 1
+dempil de 1
+dempil de but 1
+dempiler 1
+dempiler le 1
+dempiler le point 1
+dempiler un point 1
+dempstershafer 1
+dempstershafer belief 1
+dempstershafer belief funct 1
+demultiplec 1
+demultiplec me 1
+demultiplec th me 1
+demultiplec th se 1
+demurj 1
+den 30
+den 2n 1
+den accord 1
+den al continu 1
+den as p1 2
+den caract 1
+den caract eriser 1
+den citer 1
+den citer quelqu 1
+den d eduir 1
+den d egager 1
+den d eterminer 1
+den dep 1
+den deutsch 1
+den deutsch akzent 1
+den dur fact 1
+den el 1
+den fact 1
+den funct 2
+den funct pl 1
+den funct pr 1
+den graph 1
+den if pl 1
+den kibler 1
+den lat 1
+den lat model 1
+den lin 1
+den lin const 1
+den lin order 1
+den lu 1
+den lu fact 1
+den matr 2
+den matr comput 1
+den matr fact 1
+den network 1
+den obtenir 1
+den obtenir un 1
+den of cluster 1
+den of dat 1
+den of inser 1
+den of np 1
+den of order 1
+den of regl 1
+den or black 1
+den order 1
+den order equ 1
+den per unit 2
+den popl 1
+den proport 1
+den reg 1
+den satisf 1
+den shash 1
+den souligner 1
+den souligner la 1
+den system 1
+den system fd 1
+den th benefit 1
+den tirer 1
+den tirer de 1
+den utiliser 1
+den utiliser un 1
+den with longer 1
+den. 2
+den76 1
+den93 1
+dench 2
+dench erir 1
+dench erir la 1
+dench nement 1
+dencombrer 1
+dencombrer grav 1
+dencombrer grav le 1
+dencr 1
+denet 2
+denet overview 1
+denet user 1
+denet user guid 1
+dengag 1
+dengag de 1
+dengag de sort 1
+dengendrer 1
+dengendrer de 1
+dengendrer de eff 1
+dengendrer par 1
+dengendrer par exempl 1
+dengendrer un grand 1
+denker 2
+denl 1
+denmark 6
+denmark fkr 1
+denmark tel 2
+denoeux 1
+denomin 3
+denomin is proport 1
+denot 72
+denot a bal 1
+denot a coh 1
+denot a common 1
+denot a concr 1
+denot a connect 1
+denot a developm 1
+denot a doubl 1
+denot a lin 1
+denot a map 1
+denot a mult 1
+denot a network 1
+denot a par 1
+denot a pol 1
+denot a setter 1
+denot a start 1
+denot a symmeter 1
+denot a zer 2
+denot al tetrahedr 1
+denot an immut 1
+denot and oper 1
+denot ar indeed 1
+denot ar prec 1
+denot as gt 1
+denot as sa 1
+denot bal 1
+denot bal cluster 1
+denot both column 1
+denot by 1x 1
+denot by atom 1
+denot by bm 1
+denot by c1 1
+denot by c2i 1
+denot by ci 1
+denot by ck 1
+denot by cover 1
+denot by csb 1
+denot by dash 1
+denot by deriv 1
+denot by dim 1
+denot by dk 1
+denot by ei 1
+denot by f21 1
+denot by ff1 1
+denot by fsn0i 1
+denot by g0 1
+denot by g1 1
+denot by gn 1
+denot by goal 1
+denot by juxtaposit 1
+denot by kak 1
+denot by letter 1
+denot by mint 1
+denot by nw 1
+denot by nx 1
+denot by o0 1
+denot by pid 1
+denot by pj 1
+denot by renam 1
+denot by si 1
+denot by sp 1
+denot by sw 1
+denot by tfk 1
+denot by tupl 1
+denot by ui 1
+denot by vi 1
+denot by ws 1
+denot c1 1
+denot charg 1
+denot comput 1
+denot comput answer 1
+denot defin 1
+denot definit 1
+denot differ 1
+denot distinct 1
+denot distinct el 1
+denot dk 1
+denot earl 1
+denot ei 1
+denot extr 1
+denot extr ind 1
+denot f0 1
+denot fd 1
+denot gm 1
+denot hk 1
+denot in algebr 1
+denot indefinit 1
+denot indefinit block 1
+denot individu 1
+denot individu forml 1
+denot it compl 1
+denot it parent 1
+denot it register 1
+denot jxz1 1
+denot model 1
+denot model part 1
+denot model sld 1
+denot model var 1
+denot mult 1
+denot nj 1
+denot nl 1
+denot observ 1
+denot observabl 1
+denot obtain 1
+denot oe1 1
+denot of forml 1
+denot of oper 1
+denot of pr 1
+denot on el 1
+denot oper 1
+denot overhead 1
+denot overhead incur 1
+denot p1 1
+denot po minim 1
+denot power 1
+denot proc 1
+denot ptx 1
+denot qu 1
+denot qu definit 1
+denot respect 1
+denot restrict 1
+denot ri 1
+denot sem 2
+denot sem definit 1
+denot sem induc 1
+denot som individu 1
+denot spat 1
+denot spat reg 1
+denot st 1
+denot styl 1
+denot sub 1
+denot succ 1
+denot symmeter 1
+denot symmeter funct 1
+denot t e0 1
+denot t1 1
+denot th absolut 1
+denot th abstract 1
+denot th alphab 1
+denot th altern 1
+denot th amount 2
+denot th antimatr 1
+denot th arriv 1
+denot th assoc 1
+denot th aver 3
+denot th ba 1
+denot th bin 1
+denot th box 1
+denot th break 1
+denot th buffer 1
+denot th canon 1
+denot th cardin 1
+denot th cel 1
+denot th channel 1
+denot th cl 1
+denot th cluster 1
+denot th commonjunior 1
+denot th compl 1
+denot th concat 1
+denot th configur 1
+denot th conjunct 1
+denot th consider 1
+denot th correspon 2
+denot th cost 1
+denot th cs 1
+denot th cur 3
+denot th deriv 1
+denot th diagon 1
+denot th direct 2
+denot th disjoint 1
+denot th disjunct 1
+denot th distribut 1
+denot th domain 1
+denot th el 1
+denot th empt 1
+denot th equiv 1
+denot th euclidean 1
+denot th exclus 1
+denot th execut 2
+denot th fact 2
+denot th fam 1
+denot th field 1
+denot th fract 1
+denot th fragm 1
+denot th gener 1
+denot th glob 1
+denot th grad 1
+denot th graph 1
+denot th impact 1
+denot th init 1
+denot th inst 1
+denot th ith 1
+denot th kth 1
+denot th langu 2
+denot th largest 1
+denot th length 4
+denot th loc 1
+denot th lth 1
+denot th maxim 1
+denot th method 2
+denot th minim 1
+denot th mon 1
+denot th natur 1
+denot th nest 1
+denot th network 1
+denot th number 11
+denot th orig. 1
+denot th origin 1
+denot th parallel 1
+denot th part 1
+denot th path 2
+denot th pattern 1
+denot th permut 1
+denot th pot 1
+denot th prob 3
+denot th probabilt 1
+denot th proc 1
+denot th quant 1
+denot th quantif 1
+denot th regl 1
+denot th rel 1
+denot th restrict 1
+denot th result 1
+denot th rol 1
+denot th sampl 1
+denot th se 13
+denot th search 1
+denot th sequ 2
+denot th setter 1
+denot th siz 2
+denot th smallest 1
+denot th start 1
+denot th step 1
+denot th string 1
+denot th subgraph 1
+denot th system 1
+denot th throughput 1
+denot th timestamp 1
+denot th tot 3
+denot th transit 1
+denot th tridiagon 1
+denot th undirect 1
+denot th union 2
+denot th univer 1
+denot th upper 1
+denot th usag 1
+denot th valu 1
+denot that standard 1
+denot that tupl 1
+denot their differ 1
+denot their mop 1
+denot tr 1
+denot transp 1
+denot tw 1
+denot typ 1
+denot univer 1
+denot univer closur 1
+denot weak 1
+denot weak non 1
+denot which model 1
+denot with ae 1
+denot with fn 1
+denot with sk 1
+denot with ta 1
+denot with tk 1
+denot with wi 1
+denot writ 1
+denot writ cycl 1
+denot x1x2 1
+denot xi 1
+denregister 2
+denregister correspon 1
+denregister dactiv 1
+denregister dactiv classiqu 1
+denregister de 1
+denregister de man 1
+denregister indiqu 1
+denregister indiqu un 1
+denregister sur 1
+denregister sur la 1
+denregistrer 1
+denregistrer a la 1
+denregistrer dadr 1
+denregistrer dadr de 1
+denregistrer la 1
+denregistrer la nouvel 1
+denseign 1
+denseign pour 1
+denseign pour un 1
+denser 3
+denser bottom 1
+denser dur fact 1
+denser graph 1
+densit 2
+densit e de 1
+dent 4
+dent and blister 1
+dent and bump 1
+dent congrus 1
+dent dabsc 1
+dent dabsc pair 1
+dent detect 1
+dent detect algorithm 1
+dent detect approach 1
+dent detect softwar 1
+dent greater 1
+dent is read 1
+dent of depth 1
+dent on dr 1
+dent or blister 1
+dent puisqu 1
+dent puisqu le 1
+dent recognit 1
+dent recognit softwar 1
+dent recognit system 1
+dent report 1
+dentit 1
+dentit es 1
+dentr 2
+dentr ee 1
+dentr ee de 1
+dentr ee en 1
+dentr ee sur 1
+dentr eux 1
+dentrelacer 2
+dentrelacer le 2
+dentrelacer le bloc 1
+dentrelacer le deux 1
+denumer 1
+denumer model 1
+denv 1
+denv de 1
+denv de me 1
+denv dinv 1
+denv dinv la 1
+denv dun 1
+denv dun me 1
+denver 1
+denviron 1
+denviron au 1
+denviron au moment 1
+denviron avec 1
+denviron avec pil 1
+denviron de 1
+denviron de la 1
+denviron de program 1
+denviron doit 1
+denviron doit etr 1
+denviron entr 1
+denviron entr le 1
+denviron est 1
+denviron est donc 1
+denviron est retard 1
+denviron et de 1
+denviron explicit 1
+denviron explicit instruc 1
+denviron explicit la 1
+denviron maxim 1
+denviron ou 1
+denviron ou de 1
+denviron peut 1
+denviron peut etr 1
+denviron pour 1
+denviron pour ce 1
+denviron r eutilisabl 1
+denviron retard 1
+denviron retard ee 1
+denviron un 1
+denviron un repr 1
+denviron var 1
+denviron var dun 1
+denzym 1
+deon 1
+deon a mean 1
+deon of dk 1
+deon th dist 1
+deon th se 1
+deonit 1
+deonit and appl 1
+deonit of equ 1
+deonit of rigid 1
+deoxyhaemoglobon 1
+dep 107
+dep acr branch 1
+dep al ec 1
+dep among argum 1
+dep among cel 1
+dep among sub 1
+dep an 5
+dep an system 1
+dep an techniqu 1
+dep and argum 1
+dep and ba 1
+dep and control 1
+dep and indep 1
+dep and parallel 1
+dep and prec 1
+dep and spat 1
+dep ar caus 1
+dep ar design 1
+dep ar ignor 1
+dep ar known 1
+dep ar model 1
+dep ar reminisc 1
+dep ar shown 1
+dep assessm 1
+dep assessm using 1
+dep ba 1
+dep ba program 1
+dep between bod 1
+dep between chain 1
+dep between fact 1
+dep between iter 1
+dep between object 1
+dep between oper 2
+dep between output 1
+dep between p1 1
+dep between refer 1
+dep between specif 1
+dep between succ 1
+dep between system 1
+dep between v1 1
+dep between v3 1
+dep between v4 1
+dep bnf 1
+dep bnf grammar 1
+dep bug 1
+dep by edg 1
+dep by mak 1
+dep can ec 1
+dep caus 1
+dep chang 1
+dep com 1
+dep compl 1
+dep computer 1
+dep computer system 1
+dep con 1
+dep constraint 1
+dep dat 2
+dep dat dep 1
+dep direct 1
+dep direct vect 1
+dep dist 1
+dep dist vect 1
+dep ec 1
+dep edg 1
+dep edg din 1
+dep edg dout 1
+dep entir 1
+dep equ 1
+dep equiv 1
+dep equiv reg 1
+dep execut 1
+dep extract 1
+dep extrem 1
+dep extrem difficult 1
+dep flow 1
+dep flow graph 1
+dep form 1
+dep from s1 1
+dep further 1
+dep gener 1
+dep graph 3
+dep he st 1
+dep heav 2
+dep imp 1
+dep in narx 1
+dep in origin 1
+dep in rel 1
+dep inform 3
+dep inform rel 1
+dep interpr 1
+dep interpr overhead 1
+dep is const 1
+dep is describ 1
+dep is indep 1
+dep is introduc 1
+dep is loop 1
+dep is proport 1
+dep link 1
+dep list 1
+dep may ar 1
+dep measur 1
+dep might ec 1
+dep model 1
+dep modl 1
+dep non 1
+dep non recur 1
+dep observ 1
+dep on acc 1
+dep on actu 1
+dep on appl 1
+dep on assum 1
+dep on chang 1
+dep on desir 1
+dep on dispar 2
+dep on distribut 1
+dep on dynam 1
+dep on fact 1
+dep on individu 1
+dep on introspect 1
+dep on inv 1
+dep on me 1
+dep on multipl 1
+dep on natur 1
+dep on object 1
+dep on particl 1
+dep on phy 1
+dep on prev 1
+dep on reduc 1
+dep on run 1
+dep on scal 1
+dep on structur 1
+dep on surfac 2
+dep on syntact 1
+dep on ti 1
+dep on writ 1
+dep order 1
+dep pattern 1
+dep perceiv 1
+dep probabil 1
+dep problem 1
+dep quant 1
+dep quant no 1
+dep reg 1
+dep rel 2
+dep repr 1
+dep requir 1
+dep result 1
+dep say 1
+dep schem 1
+dep schem ba 1
+dep se 1
+dep signif 1
+dep slowdown 1
+dep slowdown proport 1
+dep sol 1
+dep string 1
+dep strong 2
+dep structur 2
+dep sur 1
+dep sur le 1
+dep system 1
+dep system gener 1
+dep test 2
+dep that result 1
+dep through inherit 1
+dep through wait 1
+dep to execut 1
+dep tok 1
+dep tok arriv 1
+dep typ 1
+dep typ list 1
+dep uniqu 1
+dep uniqu de 1
+dep upon rl 1
+dep upon wh 1
+dep var 1
+dep variabl 1
+dep vect 1
+dep vect becom 1
+dep wa ch 1
+dep which result 1
+dep with dist 1
+dep with s4 1
+dep with switch 1
+dep word 1
+dep word tag 1
+dep would ec 1
+dep.2 2
+dep.de 1
+dep.de inform 1
+depart 5
+depart of computer 1
+depart somewhat 1
+depart th pack 1
+depart th server 1
+depart th system 1
+departam 2
+departam de 2
+departam de inform 1
+departam de llenguatg 1
+departm 2
+departm and project 1
+departm and skil 1
+departm edg 1
+departm of empl 1
+departm part 1
+departm sum 1
+departm to determin 1
+departm1 1
+departmentemployeesemployeelistcompanydepartmentlistdepartmentsempl 1
+departmentemployeesidentnameemployeelistidentnamecompanydepartmentl 1
+departmentemployeesidentnameemployeelistidentnamecompanydepartmentl departmentsidentnamedivisionsdivisionlistdivisionnumberidentemployeefu 1
+departmentemployeesidentnameemployeelistidentnamecompanydepartmentl departmentsidentnamedivisionsdivisionlistdivisionnumberidentemployeefu lltimeparttimesalarynam 1
+departmentl 1
+departmentsidentnamedivisionsdivisionlistdivisionnumberidentemployeefu 1
+departmentsidentnamedivisionsdivisionlistdivisionnumberidentemployeefu lltimeparttimesalarynam 1
+departmentv 1
+departmentv toy 1
+departur 2
+departur tim 1
+depict 19
+depict a cluster 1
+depict a graph 1
+depict a nonblock 1
+depict a sequ 1
+depict an approach 1
+depict an edg 1
+depict as follow 1
+depict compl 1
+depict compl tim 1
+depict for lu 1
+depict in 2d 1
+depict in fig 2
+depict in fig.1 1
+depict in figur 7
+depict in gr 1
+depict in tabl 1
+depict network 1
+depict network repr 1
+depict sampl 1
+depict sampl realm 1
+depict som tim 1
+depict th actu 1
+depict th box 1
+depict th enh 1
+depict th error 1
+depict th funct 1
+depict th irregl 1
+depict th med 1
+depict th over 1
+depict th result 1
+depict th simpl 1
+depict th test 1
+depict th top 1
+depict th valu 1
+depict thr reg 1
+depict tim 1
+depl 3
+deposit 1
+deposit amount 1
+deposit logact 1
+deposit logact bal 1
+depr 2
+depr th return 1
+deprit 1
+dept 15
+dept 5000k 1
+dept 5000k 6000k 1
+dept d1 1
+dept d1 d20 1
+dept m1 1
+dept m1 m20 1
+dept njoin 1
+dept njoin proj 1
+dept on budg 1
+dept wh 1
+dept wh budg 1
+deptb 1
+deptb dn 1
+deptb dn mac 1
+deptb njoin 1
+deptb njoin dept 1
+deptb njoin projb 1
+deptb wh 1
+deptb wh budgetu 1
+depth 17
+depth by eff 1
+depth by m.a 1
+depth cu 1
+depth first intuit 1
+depth first manner 1
+depth first search 3
+depth first traver 1
+depth four main 1
+depth gener 1
+depth gener deriv 1
+depth in intellig 1
+depth in rel 1
+depth of cl 1
+depth of exper 1
+depth of inherit 1
+depth of libr 1
+depth of nest 1
+depth or inappropr 1
+depth percept 1
+depth search 1
+deptm 1
+deptttl 1
+deptttl and projttl 1
+deptttl dn 1
+deptttl dn mac 1
+deptttl is creat 1
+deptttl njoin 1
+deptttl njoin projttl 1
+deptttl wh 1
+deptttl wh manageru 1
+depu 2
+depu le 2
+depu le point 1
+depu longtemp 1
+depu longtemp accept 1
+depu sa 1
+depu sa concept 1
+dequeu 2
+dequeu and to 1
+dequeu el 1
+dequeu lock 1
+dequeu oper 1
+dequeu queu 1
+der 35
+der a bound 1
+der a cl 1
+der a condit 1
+der a correct 1
+der a definit 1
+der a design 1
+der a giv 1
+der a initk 1
+der a lem 1
+der a lower 1
+der a scheduler 1
+der a ser 1
+der a spec 1
+der an appropr 1
+der an idb 1
+der an init 1
+der an nc 1
+der an optim 1
+der biologisch 1
+der biologisch evolut 1
+der block 1
+der block probabil 1
+der bound 1
+der cl 1
+der cl form 1
+der differ recur 1
+der ef 1
+der ef zienzsteigerung 1
+der equ 1
+der expr 1
+der finit 1
+der finit el 1
+der for crash 1
+der gener 1
+der gener idb 1
+der genetisch 1
+der genetisch algorithmus 1
+der gmd 1
+der he 1
+der in sect 1
+der jw 1
+der jw jr 1
+der konjug 1
+der konjug grad 1
+der laag 1
+der lind 1
+der lower 1
+der lower bound 1
+der luft 1
+der luft und 1
+der meyd 1
+der mor insight 1
+der optim 2
+der optim system 2
+der poel 1
+der protocol 1
+der repr 2
+der repr valu 2
+der sever us 1
+der substitut 1
+der substitut try 1
+der suff 1
+der suff condit 1
+der technisch 2
+der technisch wiskund 2
+der th abstract 1
+der th bal 1
+der th correspon 1
+der th cost 1
+der th design 2
+der th expr 1
+der th good 2
+der th label 1
+der th largest 1
+der th maxim 1
+der th minim 1
+der th nxn 1
+der th over 1
+der th predict 1
+der th usu 1
+der th valu 1
+der that dblog3 1
+der universit 2
+der vi na 1
+der woud 1
+deransart 1
+deransart and ma 1
+deref 1
+derefer 3
+derefer a var 1
+derefer and trail 1
+derefer mod 1
+derefer oper 1
+derefer oper consider 1
+dergocit 1
+deriv 66
+deriv a model 1
+deriv a part 1
+deriv a signif 1
+deriv a tabl 1
+deriv algorithm 1
+deriv an algorithm 1
+deriv an optim 2
+deriv analog 1
+deriv analog trac 1
+deriv and disc 1
+deriv and inser 1
+deriv and le 1
+deriv and prov 1
+deriv and util 1
+deriv approach 1
+deriv ar mad 1
+deriv ar strong 1
+deriv as nw 1
+deriv assoc 1
+deriv assum 1
+deriv atom 1
+deriv attribut 1
+deriv ba 1
+deriv bound 1
+deriv brakep 1
+deriv brakep user 1
+deriv by an 1
+deriv by join 1
+deriv by ping 1
+deriv by replac 1
+deriv by solut 1
+deriv constraint 1
+deriv cost 1
+deriv cost effect 1
+deriv definit 1
+deriv denot 1
+deriv design 2
+deriv design fe 2
+deriv du 1
+deriv ea 1
+deriv earl 2
+deriv edg 1
+deriv en 1
+deriv evalu 1
+deriv fact 1
+deriv fhg0 1
+deriv for network 1
+deriv for restrict 1
+deriv for symmeter 1
+deriv form 1
+deriv form specif 1
+deriv forml 1
+deriv from antimatr 1
+deriv from equ 2
+deriv from ground 1
+deriv from import 1
+deriv from map 1
+deriv from modl 1
+deriv from object 1
+deriv from qbfun4 1
+deriv from re 1
+deriv from soc 1
+deriv from tok 1
+deriv g0 1
+deriv idb 1
+deriv idb fact 1
+deriv in adv 1
+deriv in eqn 1
+deriv in equ 1
+deriv in observ 1
+deriv in part 1
+deriv in sec 2
+deriv in term 1
+deriv is ad 1
+deriv is cut 1
+deriv is estim 1
+deriv is going 1
+deriv is succ 1
+deriv is zer 1
+deriv it eff 1
+deriv knowledg 1
+deriv kw 1
+deriv kw kr 1
+deriv maxim 1
+deriv maxim throughput 1
+deriv may incr 1
+deriv modl 1
+deriv modl ss 1
+deriv observ 1
+deriv obtain 1
+deriv oe 1
+deriv of axiom 1
+deriv of claus 1
+deriv of forml 1
+deriv of gaus 1
+deriv of goal 1
+deriv of input 1
+deriv of polymorph 1
+deriv of simpl 1
+deriv of zer 1
+deriv proc 1
+deriv proc se 1
+deriv pulser 1
+deriv pulser actspeed 1
+deriv rel 1
+deriv rl 1
+deriv satisf 1
+deriv satisf tighter 1
+deriv sem 1
+deriv shown 1
+deriv sign 1
+deriv sign featur 1
+deriv st 1
+deriv start 1
+deriv stat 1
+deriv th bal 1
+deriv th largest 1
+deriv th maxim 1
+deriv th relev 1
+deriv th se 1
+deriv theor 1
+deriv theorem 1
+deriv to find 1
+deriv to zer 1
+deriv tr 1
+deriv tr illustr 1
+deriv us 1
+deriv using 4
+deriv using eqn 1
+deriv usu us 1
+deriv valu 1
+deriv variabl 1
+deriv visu 1
+deriv visu featur 1
+deriv windf 1
+deriv windf windk 1
+deriv with respect 1
+deriv with uniform 1
+deriv without explicit 1
+dermorphin 1
+dern 5
+dern afin 1
+dern afin de 1
+dern appel 1
+dern appel du 1
+dern argum 1
+dern argum dun 1
+dern aspect 1
+dern aspect trait 1
+dern but de 1
+dern but dun 1
+dern ca 3
+dern ca deux 1
+dern ca du 1
+dern ca la 1
+dern champ 1
+dern champ etant 1
+dern comport 1
+dern comport plusieur 1
+dern crit 1
+dern d etr 1
+dern doit 1
+dern doit conserver 1
+dern el 1
+dern el ement 1
+dern en 1
+dern en dat 1
+dern enregister 1
+dern enregister dactiv 1
+dern er 2
+dern er an 1
+dern er cel 1
+dern er claus 1
+dern er colon 1
+dern er contraint 1
+dern er de 1
+dern er du 1
+dern er dun 1
+dern er equ 1
+dern er etap 1
+dern er expr 1
+dern er fo 1
+dern er instruc 1
+dern er nest 1
+dern er occur 1
+dern er op 1
+dern er pag 1
+dern er pair 1
+dern er posit 1
+dern er se 1
+dern er sect 1
+dern er situ 1
+dern er soient 1
+dern er sont 1
+dern er sub 1
+dern er valeur 1
+dern inconv 1
+dern inconv enient 1
+dern maillon 1
+dern maillon de 1
+dern maillon ne 1
+dern mot 1
+dern mot empil 1
+dern niveau 1
+dern niveau de 1
+dern pa 1
+dern pa ver 1
+dern pav 1
+dern point 3
+dern point est 3
+dern point fut 1
+dern point qu 1
+dern point ser 1
+dern pr 1
+dern pr edicat 1
+dern probl 1
+dern probl em 1
+dern processeur 1
+dern r esultat 1
+dern re 1
+dern segm 1
+dern segm sur 1
+dern sont 1
+dern sont trait 1
+dern sous 1
+dern sous appel 1
+dern typ 1
+dern typ de 1
+derour 1
+derreur 4
+derreur et de 1
+derreur et echouer 1
+derreur g en 1
+derreur ou 1
+derreur ou de 1
+dershowitz 1
+dershowitz and j.p 1
+desc 20
+desc ba 1
+desc ba algorithm 1
+desc d etermin 1
+desc de 2
+desc de grad 1
+desc de la 1
+desc doptim 1
+desc doptim usuel 1
+desc en 1
+desc en de 1
+desc for adapt 1
+desc learn 1
+desc manner 1
+desc nod 1
+desc nutil 1
+desc nutil pa 1
+desc of act 1
+desc of non 1
+desc order 1
+desc order arrang 1
+desc sequ 1
+desc th import 1
+desc to find 1
+desc wil diverg 1
+describ 114
+describ a compan 1
+describ a compiler 1
+describ a fam 1
+describ a framework 1
+describ a gener 3
+describ a gp 1
+describ a heur 1
+describ a high 1
+describ a langu 1
+describ a merg 1
+describ a method 2
+describ a number 1
+describ a parallel 1
+describ a particl 2
+describ a po 1
+describ a polymorph 1
+describ a postproc 1
+describ a quadtr 1
+describ a real 1
+describ a recov 1
+describ a simpl 1
+describ a singl 1
+describ a slot 1
+describ a structur 1
+describ a subrout 1
+describ a switch 1
+describ a syntact 1
+describ a system 1
+describ abov gener 2
+describ abov imp 1
+describ abov return 1
+describ abov us 1
+describ al relationship 1
+describ algorithm 1
+describ an aff 1
+describ an algorithm 3
+describ an appl 1
+describ an appropr 1
+describ an attempt 1
+describ an exampl 1
+describ an experim 1
+describ an implem 3
+describ an infinit 1
+describ an input 1
+describ an object 1
+describ an output 1
+describ and an 2
+describ and distingu 1
+describ and evalu 1
+describ and implem 1
+describ and justif 1
+describ and nam 1
+describ and program 1
+describ arbitr 1
+describ arbitr appl 1
+describ as collect 1
+describ as empir 1
+describ as fair 1
+describ as follow 6
+describ bisect 1
+describ by carbonel 1
+describ by distribut 1
+describ by ea 1
+describ by ford 1
+describ by forml 1
+describ by goldfeather 1
+describ by harel 1
+describ by nag 1
+describ by prepar 1
+describ by slot 1
+describ by smith 1
+describ cannot guar 1
+describ carv 1
+describ carv up 1
+describ circumscrib 1
+describ circumscrib behaviour 1
+describ cl 2
+describ cl dict 1
+describ cl structur 1
+describ compar 1
+describ compar act 1
+describ comput 1
+describ concept 1
+describ conglomer 1
+describ cont 1
+describ differ schem 1
+describ dynam 1
+describ dynam log 1
+describ each compon 1
+describ each strateg 1
+describ each system 1
+describ each typ 1
+describ earl 3
+describ earl work 1
+describ execut 1
+describ execut mod 1
+describ experim 1
+describ ext 1
+describ ext cam 1
+describ fl 1
+describ foc 1
+describ foc context 1
+describ for bidimin 1
+describ for clr 1
+describ for inequ 1
+describ for inst 1
+describ form 1
+describ four rel 1
+describ fram 1
+describ fram ba 1
+describ fundam 1
+describ fundam datatyp 1
+describ he tak 1
+describ high level 1
+describ how compl 1
+describ how compon 1
+describ how ec 1
+describ how exper 1
+describ how isvl 1
+describ how mult 2
+describ how srin 1
+describ how trac 1
+describ how vm 1
+describ imag 1
+describ imag cont 1
+describ implem 1
+describ improv 1
+describ in a.2.1 1
+describ in algorithm 1
+describ in ca 1
+describ in correspon 1
+describ in detail 11
+describ in equ 1
+describ in figur 2
+describ in gener 1
+describ in greater 1
+describ in ka 1
+describ in prec 1
+describ in refer 1
+describ in sec 1
+describ in sect 30
+describ in step 1
+describ in subsect 1
+describ in subsequ 1
+describ in tabl 1
+describ in term 5
+describ in theorem 1
+describ in xv.2 1
+describ infer 1
+describ interfac 1
+describ it design 1
+describ it parameter 1
+describ later nd 1
+describ layer 1
+describ libr 1
+describ libr chang 1
+describ major 1
+describ major vot 1
+describ man common 1
+describ minor 1
+describ minor modif 1
+describ modif 1
+describ modl 1
+describ modl proc 1
+describ mor tradit 1
+describ n point 1
+describ need appl 1
+describ non 1
+describ non convec 1
+describ object 4
+describ object behavior 1
+describ on simpl 1
+describ ong 1
+describ ong work 1
+describ order 1
+describ order heur 1
+describ our approach 2
+describ our dat 1
+describ our exper 1
+describ our implem 1
+describ our model 3
+describ our prop 1
+describ our system 1
+describ over constrain 1
+describ parameter 1
+describ part 1
+describ part funct 1
+describ physiolog 1
+describ physiolog behavior 1
+describ point 1
+describ point se 1
+describ prev 2
+describ pur 1
+describ pur syntact 1
+describ quit conc 1
+describ refin 1
+describ refin techniqu 1
+describ relationship 1
+describ repetit 1
+describ repetit edg 1
+describ research 1
+describ respect 1
+describ responsibil 1
+describ se 1
+describ situ 1
+describ situ wh 1
+describ som fundam 1
+describ som issu 2
+describ som lower 1
+describ som result 1
+describ srin 1
+describ such system 1
+describ synchron 1
+describ synchron constraint 1
+describ techniqu 3
+describ textur 1
+describ th act 1
+describ th addit 3
+describ th algorithm 2
+describ th altern 1
+describ th appl 2
+describ th approxim 1
+describ th ba 4
+describ th behavior 2
+describ th branch 1
+describ th chang 1
+describ th character 1
+describ th cl 1
+describ th co 1
+describ th collabor 1
+describ th command 1
+describ th comp 1
+describ th comput 1
+describ th condit 1
+describ th construc 1
+describ th cont 1
+describ th cor 2
+describ th cr 1
+describ th csg 1
+describ th dat 1
+describ th delaun 1
+describ th den 1
+describ th dep 1
+describ th design 1
+describ th direct 1
+describ th ent 1
+describ th execut 1
+describ th experim 2
+describ th fir 1
+describ th funct 2
+describ th gener 1
+describ th heur 1
+describ th highlight 1
+describ th hist 1
+describ th imag 1
+describ th implem 3
+describ th interfac 1
+describ th ip 1
+describ th kitlog 1
+describ th label 1
+describ th learn 1
+describ th lesson 1
+describ th loc 2
+describ th log 1
+describ th main 1
+describ th map 1
+describ th modl 2
+describ th motiv 1
+describ th nectar 1
+describ th object 1
+describ th opportun 1
+describ th order 1
+describ th origin 1
+describ th over 1
+describ th parallel 2
+describ th part 1
+describ th physiolog 1
+describ th preproc 1
+describ th proc 4
+describ th procedur 1
+describ th project 1
+describ th protocol 1
+describ th reader 1
+describ th reflect 1
+describ th rel 1
+describ th requir 2
+describ th result 3
+describ th rmsp 1
+describ th rol 2
+describ th satisf 1
+describ th se 1
+describ th search 1
+describ th sem 2
+describ th shap 1
+describ th sid 1
+describ th siem 1
+describ th situ 1
+describ th solver 1
+describ th sourc 1
+describ th specif 1
+describ th spf 1
+describ th st 1
+describ th structur 7
+describ th sub 1
+describ th synchron 1
+describ th syntac 1
+describ th system 1
+describ th techniqu 1
+describ th tempor 1
+describ th theor 1
+describ th tool 1
+describ th tr 1
+describ th trac 1
+describ th triangl 1
+describ th user 1
+describ th var 1
+describ th ver 1
+describ that cost 1
+describ their com 1
+describ their evalu 1
+describ them separ 1
+describ thr approach 1
+describ thr view 1
+describ thr way 1
+describ through object 1
+describ tw approach 1
+describ tw iter 1
+describ tw prop 1
+describ tw repl 1
+describ typ 1
+describ typ aspect 1
+describ using 2
+describ using width 1
+describ vi qualit 1
+describ which gener 1
+describ why 2
+descript 75
+descript and cal 1
+descript and fact 1
+descript and high 1
+descript and implem 1
+descript and ind 1
+descript and inexact 1
+descript and method 1
+descript and multipl 1
+descript and train 1
+descript approach 1
+descript ar defin 1
+descript ar encl 1
+descript assez 1
+descript assez compl 1
+descript assoc 1
+descript by fil 1
+descript by tak 1
+descript cl 1
+descript cl cl 1
+descript cl direct 1
+descript cl inh 1
+descript cl initarg 1
+descript cl slot 1
+descript conceptuel 1
+descript contain 2
+descript correspon 1
+descript d etail 1
+descript de 3
+descript de algorithm 1
+descript de exp 1
+descript de la 1
+descript de mach 1
+descript de war 1
+descript default 1
+descript default method 1
+descript describ 1
+descript determin 1
+descript direct 1
+descript direct initarg 1
+descript direct reflect 1
+descript discard 1
+descript distingu 1
+descript dur cl 1
+descript ea 1
+descript figur 1
+descript figur 5a 1
+descript form 2
+descript format 1
+descript from draw 1
+descript giv 1
+descript in indent 1
+descript in list 1
+descript in sect 1
+descript in xi.2 1
+descript inclus 1
+descript inh 1
+descript inh sd 1
+descript initarg 1
+descript initfunct 1
+descript initfunct slot 1
+descript is avail 1
+descript is defin 1
+descript is inherit 1
+descript is repr 1
+descript keep 1
+descript langu 3
+descript langu hardwarep 1
+descript length 2
+descript length criter 1
+descript length principl 1
+descript level 2
+descript mak 1
+descript mak ment 1
+descript metaobject 1
+descript method 1
+descript method descript 1
+descript model 1
+descript nam 2
+descript nam slot 1
+descript object 1
+descript of algorithm 1
+descript of babel 1
+descript of dat 1
+descript of electrocardiogram 1
+descript of eulisp 1
+descript of ffq 1
+descript of gener 1
+descript of hardwar 1
+descript of innermost 1
+descript of inser 1
+descript of laz 1
+descript of object 1
+descript of random 1
+descript of sect 1
+descript of shap 1
+descript of structur 1
+descript of typ 1
+descript of var 1
+descript or abstract 1
+descript or cl 1
+descript or comput 1
+descript or metacl 1
+descript originel 1
+descript originel de 1
+descript player 1
+descript pr 1
+descript pr ec 1
+descript prec 1
+descript remain 1
+descript remain abstract 1
+descript replac 2
+descript sd 1
+descript sd cl 1
+descript slot 1
+descript slot reader 1
+descript slot writer 1
+descript start 1
+descript synth 1
+descript synth parameter 1
+descript test 1
+descript test ca 1
+descript th valu 1
+descript that occup 1
+descript to impl 1
+descript to ind 1
+descript tok 1
+descript tok workloaddescript 1
+descript typ 1
+descript typ infer 1
+descript we assum 1
+descript we tak 1
+descript which def 1
+descript which tak 1
+descript which us 1
+descript with respect 1
+descriptif 1
+deser 1
+deserv 5
+deserv further 1
+deserv further attent 1
+deserv recognit 1
+deserv th attribut 1
+desider 2
+desider in sect 1
+design 107
+design a cql 1
+design a distribut 1
+design a framework 1
+design a ga 1
+design a gener 1
+design a mach 1
+design a me 1
+design a multitoler 1
+design a parallel 1
+design a pract 1
+design a questionnair 1
+design a rel 1
+design a schedl 1
+design a scheduler 1
+design a simpl 1
+design a spec 1
+design a suit 1
+design a synchron 1
+design a system 3
+design a train 1
+design act 1
+design addr 1
+design administer 1
+design adv 1
+design adv visu 1
+design aim 1
+design al def 1
+design al prov 1
+design algorithm 1
+design allow 3
+design allow dynam 1
+design allow incorrect 1
+design altern 3
+design altern consider 1
+design an 1
+design an actorb 1
+design an atom 1
+design an eff 3
+design an ext 1
+design an optim 1
+design and an 6
+design and compon 1
+design and custom 1
+design and decomposit 1
+design and develop 3
+design and developm 1
+design and enforc 1
+design and evalu 2
+design and evolut 1
+design and fabr 1
+design and impl 1
+design and implem 22
+design and organ 1
+design and pack 2
+design and part 1
+design and program 2
+design and st 1
+design and train 1
+design and verif 1
+design and writ 2
+design ar 1
+design ar abl 1
+design as st 1
+design assum 1
+design at highest 1
+design attribut 1
+design autom 4
+design ba 2
+design bal 1
+design befor verif 1
+design by 1
+design by deutsch 1
+design by kuck 1
+design by multipl 1
+design by replac 1
+design can toler 1
+design ch 4
+design chang 1
+design classif 1
+design cluster 1
+design cluster multiproc 1
+design cod 1
+design con 1
+design configur 1
+design consider 1
+design cost 1
+design cost effect 1
+design criter 1
+design dec 7
+design dec dep 1
+design dec influ 1
+design deep 1
+design deep hierarch 1
+design descript 1
+design diagram 1
+design distribut 2
+design distribut shar 2
+design docum 2
+design docum fl 1
+design docum subject 1
+design docum tool 1
+design each subject 1
+design eff 6
+design eff approxim 1
+design eff constraint 1
+design eff parallel 1
+design eff rout 1
+design effort 2
+design environm 2
+design exampl 1
+design fact 1
+design fault 1
+design fault toler 1
+design faulttoler 1
+design faulttoler comput 1
+design fe 2
+design fe configur 2
+design featur 1
+design figur 1
+design for ap 1
+design for assign 1
+design for determin 1
+design for ext 1
+design for gener 1
+design for implem 1
+design for integr 2
+design for med 1
+design for point 1
+design for propag 1
+design for reus 1
+design for sen 1
+design for siml 1
+design for simpl 1
+design for switch 1
+design for us 1
+design framework 2
+design from consider 1
+design guidel 3
+design guidel assum 2
+design guidel framework 2
+design guidel pr 1
+design hal 1
+design high perform 1
+design hypertext 1
+design hypertext hyperm 1
+design i reus 1
+design impl 1
+design in collabor 1
+design in offer 1
+design in pract 1
+design in principl 1
+design individu 1
+design inform 1
+design inform hid 1
+design interconnect 3
+design interconnect network 3
+design interfac 1
+design involut 1
+design is pr 2
+design is separ 1
+design is shown 1
+design is stud 1
+design is symmeter 1
+design issu 3
+design issu involut 1
+design kb 1
+design langu 1
+design larg hierarch 3
+design larg multiproc 3
+design larg parallel 3
+design larg system 3
+design lead 1
+design level 2
+design maintain 1
+design maxrol 1
+design me 3
+design me object 1
+design me protocol 1
+design mechan 1
+design method 3
+design method correspon 1
+design methodolog 2
+design model 3
+design mor complec 1
+design mor level 2
+design motiv 1
+design mult 1
+design mult interconnect 1
+design n ss 2
+design network 1
+design new concept 1
+design nod 1
+design object 1
+design object orient 1
+design od 1
+design of abcl 1
+design of algorithm 1
+design of appropr 1
+design of bar 1
+design of build 1
+design of compon 1
+design of eff 1
+design of fortran 1
+design of gh 1
+design of good 1
+design of int 1
+design of lower 2
+design of me 1
+design of multitoler 1
+design of nectar 1
+design of norm 1
+design of obsol 1
+design of parallel 1
+design of program 1
+design of sl1 1
+design of softwar 1
+design of specif 1
+design of tempor 1
+design of toler 1
+design on server 1
+design oper 1
+design opt 1
+design or an 1
+design or network 1
+design our experim 1
+design our framework 1
+design paradigm 2
+design parallel 3
+design parallel algorithm 2
+design parallel system 1
+design part 1
+design pattern 1
+design perform 1
+design perform flow 1
+design perspect 1
+design ph 2
+design polynom 1
+design polynom tim 1
+design prim 1
+design principl 3
+design principl outlin 1
+design problem 5
+design problem solut 1
+design proc 5
+design produc 1
+design produc bad 1
+design program 1
+design program famil 1
+design project 1
+design prop 2
+design proper 1
+design proper inherit 1
+design prov 1
+design prov modl 1
+design receiver 1
+design reflect 1
+design reg 1
+design requir 1
+design requir underl 1
+design satisf 1
+design scal 1
+design scal system 1
+design schedl 1
+design schedl algorithm 1
+design scheduler 1
+design se 1
+design se me 1
+design search 1
+design search structur 1
+design separ 1
+design separ cod 1
+design simpler 1
+design simultan 1
+design skel 1
+design soft 1
+design soft designdoc 1
+design softwar 1
+design spac 3
+design spac graph 1
+design specif 1
+design specif contain 1
+design spectr 1
+design standard 1
+design standard int 1
+design strateg 1
+design styl 1
+design sub 1
+design switch 1
+design switch q0 1
+design switch q2 1
+design system 6
+design system ba 1
+design systemat 1
+design systemat allow 1
+design tak 1
+design team 1
+design techniqu 2
+design th algorithm 1
+design th arrang 1
+design th classif 1
+design th med 1
+design th nonlin 1
+design th plac 1
+design th rol 1
+design th root 1
+design th scheduler 1
+design th se 1
+design th subject 1
+design th system 2
+design that maintain 1
+design that offer 1
+design then bad 1
+design then chang 1
+design then good 1
+design theor 1
+design through succ 1
+design tim 1
+design to achief 1
+design to actu 1
+design to ad 1
+design to allow 3
+design to build 1
+design to captur 1
+design to comb 1
+design to cop 1
+design to cover 1
+design to design 1
+design to determin 1
+design to distribut 1
+design to elicit 1
+design to exerc 1
+design to exploit 1
+design to explor 1
+design to fit 1
+design to impl 1
+design to implem 1
+design to impr 1
+design to ind 1
+design to induc 1
+design to learn 1
+design to mak 1
+design to me 1
+design to modif 1
+design to obtain 1
+design to offer 1
+design to proc 1
+design to program 1
+design to reason 1
+design to recogn 1
+design to reduc 2
+design to satisf 1
+design to stud 2
+design to support 1
+design to test 1
+design top 1
+design tren 2
+design under technolog 1
+design us 1
+design us fewer 1
+design user 1
+design user interfac 1
+design using 2
+design using multipl 1
+design using singl 1
+design usu mean 1
+design ver car 1
+design wa appropr 1
+design wa ch 1
+design wa incorrect 1
+design wa str 1
+design we support 1
+design wel multipl 1
+design wer consider 1
+design wer setup 1
+design when disc 1
+design which modif 1
+design with appl 2
+design with featur 1
+design with low 2
+design work 1
+design writedesign.hqx 1
+designdoc 1
+designer 16
+designer about graph 1
+designer and impl 1
+designer can identif 2
+designer dec 1
+designer encounter 1
+designer fail 1
+designer for build 2
+designer ha flec 2
+designer hav claim 1
+designer hav sought 1
+designer must fac 1
+designer of ol 1
+designer of parallel 1
+designer to ch 2
+designer to deal 1
+designer to specif 1
+designf 2
+designf configur 2
+desir 57
+desir a repl 1
+desir abstract 1
+desir abstract level 1
+desir act 1
+desir activ 1
+desir assm 1
+desir attribut 1
+desir behavior 2
+desir character 1
+desir cluster 1
+desir continu 1
+desir continu method 1
+desir contradict 1
+desir dest 1
+desir dest proc 1
+desir developm 1
+desir disk 1
+desir disk en 1
+desir distribut 1
+desir dynam 1
+desir effect 1
+desir featur 3
+desir fin 1
+desir fin posit 1
+desir for system 1
+desir forml 1
+desir forml ea 1
+desir funct 3
+desir high layer 1
+desir integr 1
+desir map 1
+desir mesh 1
+desir mesh featur 1
+desir mesh optim 1
+desir nod 1
+desir number 4
+desir output 2
+desir output vect 1
+desir perform 1
+desir permut 1
+desir program 1
+desir prompt 1
+desir proper 6
+desir rang 1
+desir rel 1
+desir resolut 1
+desir result 5
+desir result accord 1
+desir rout 1
+desir sign 1
+desir singl 1
+desir singl color 1
+desir soft 1
+desir soft dec 1
+desir st 2
+desir st irrespect 1
+desir stat 1
+desir sustain 2
+desir sustain comput 2
+desir system 3
+desir system funct 1
+desir system propertieswh 1
+desir th sign 1
+desir tim 1
+desir tim tx 1
+desir to abstract 1
+desir to compact 1
+desir to def 1
+desir to deliver 1
+desir to fl 1
+desir to further 1
+desir to hid 1
+desir to improv 1
+desir to inser 1
+desir to keep 1
+desir to learn 1
+desir to maintain 1
+desir to reduc 1
+desir to solut 1
+desir topolog 2
+desir tripl 1
+desir upper 1
+desir upper bound 1
+desir valu 1
+desir which mak 1
+desk 2
+desk top 1
+desk top prolog 1
+desktop 3
+desktop publ 1
+desktop publ system 1
+desktop workst 1
+desorm 1
+desorm par 1
+desorm par maint 1
+desouz 1
+desouz csl.stanford.edu 1
+desp 1
+desp erer 1
+desp erer de 1
+desp erer qu 1
+desp erer un 1
+despac 4
+despac d etat 1
+despac dan 1
+despac dan le 1
+despac fin 1
+despac m emoir 1
+despac sur 1
+despac sur la 1
+despac sur le 1
+despain 1
+despain ont 1
+despain ont mesur 1
+desr 1
+dessayer 1
+dessayer la 1
+dessayer la claus 1
+dessus 5
+dessus de 1
+dessus de mal 1
+dessus en 1
+dessus est 2
+dessus est donc 1
+dessus est en 1
+dessus et dadmettr 1
+dessus et port 1
+dessus ob 1
+dessus ob ei 1
+dessus permettrait 1
+dessus qu 1
+dessus qu la 1
+dessus se 1
+dessus se comport 1
+dest 16
+dest a neighbor 1
+dest and comput 1
+dest ar 1
+dest aux 1
+dest aux instruc 1
+dest lead 1
+dest nod 4
+dest of me 1
+dest on switch 1
+dest output 1
+dest output port 1
+dest pack 1
+dest pack pack 1
+dest pair 2
+dest proc 3
+dest proc acquir 1
+dest proc combin 1
+dest proc p0 1
+dest proc p1 1
+dest proc p2 1
+dest proc p3 1
+dest proc proc 1
+dest proc show 1
+dest recur 1
+dest router 1
+dest router wh 1
+dest se 1
+dest switch 1
+dest switch nod 1
+dest vect 1
+dest within finit 1
+destampil 1
+destampil a propr 1
+destampil evit 1
+destampil evit ce 1
+destampil na 1
+destampil temporel 1
+destimer 2
+destimer de 1
+destimer de param 1
+destimer le 1
+destimer le temp 1
+destin 15
+destin ar cover 1
+destin ba 1
+destin by repl 1
+destin destin 1
+destin es 2
+destin graph 1
+destin graph nod 1
+destin next hop 1
+destin to neighbor 2
+destin uniform 2
+destinatair 1
+destinatair env 1
+destinatair pour 1
+destinatair pour sassurer 1
+destinationrouter 1
+destinationrouter communicationm 1
+destinationrouter communicationm interconnect 1
+destr 13
+destr ar loc 1
+destr conflu 1
+destr correct 1
+destr th con 1
+destr th decl 1
+destr th foc 1
+destr th load 1
+destr th minim 1
+destr th po 1
+destr th proper 2
+destr unint 1
+destruc 7
+destruc assignm 2
+destruc au 1
+destruc au niveau 1
+destruc avec 1
+destruc avec estampil 1
+destruc avec la 1
+destruc combin 1
+destruc combin ee 1
+destruc comport 1
+destruc consom 1
+destruc consom moin 1
+destruc devrait 1
+destruc devrait permettr 1
+destruc du 1
+destruc du sch 1
+destruc est 1
+destruc est identiqu 1
+destruc est tout 1
+destruc et le 1
+destruc et setarg 1
+destruc et tr 1
+destruc handl 1
+destruc heur 1
+destruc learn 1
+destruc modif 1
+destruc peut 1
+destruc peut etr 1
+destruc plus gourmand 1
+destruc suppl 1
+destruc suppl ementair 1
+destruc writ 1
+destructif 1
+destructif etant 1
+destructif etant etrang 1
+destructiv 1
+destructiv largum 1
+destructiv largum dun 1
+destructiv largum noarg 1
+destructiv peuv 1
+destructiv peuv aus 1
+destructiv peuv cohabiter 1
+detach 4
+detach a transact 1
+detach attribut 1
+detach task 1
+detach task cost 1
+detail 87
+detail a sum 1
+detail a vi 1
+detail account 1
+detail after defin 1
+detail al prov 1
+detail algorithm 2
+detail algorithm obtain 1
+detail an 1
+detail anatom 1
+detail anatom knowledg 1
+detail and allus 1
+detail and context 1
+detail and rel 1
+detail ar disc 2
+detail can skip 1
+detail center 1
+detail center panel 1
+detail com 1
+detail commun 1
+detail comparison 1
+detail compon 1
+detail concern 1
+detail descript 9
+detail descript level 1
+detail design 2
+detail design impl 1
+detail design specif 1
+detail disc 4
+detail e maintain 1
+detail earl 1
+detail examin 1
+detail exper 1
+detail exper knowledg 1
+detail experim 1
+detail experim comparison 1
+detail for part 1
+detail for var 1
+detail handl 1
+detail handl mult 1
+detail hint 1
+detail in refer 1
+detail in sect 9
+detail is report 1
+detail it axiom 1
+detail justif 1
+detail knowledg 1
+detail langu 1
+detail langu comparison 1
+detail level 2
+detail list 1
+detail log 1
+detail maintain 1
+detail model 1
+detail motiv 1
+detail not 1
+detail of affin 1
+detail of appl 1
+detail of condit 1
+detail of imag 1
+detail of imp 1
+detail of writ 1
+detail on uid 1
+detail or cont 1
+detail our improv 1
+detail our parallel 1
+detail our research 1
+detail pandemon 1
+detail pandemon mechan 1
+detail perform 1
+detail perform evalu 1
+detail pertain 1
+detail protocol 1
+detail protocol an 1
+detail quick 1
+detail quick evalu 1
+detail repr 1
+detail requir 1
+detail result 2
+detail se 1
+detail sem 1
+detail sem descript 1
+detail sever approach 1
+detail solut 1
+detail specif 1
+detail stud 2
+detail subband 1
+detail terminolog 1
+detail terminolog se 1
+detail textu 1
+detail textu account 1
+detail th actu 1
+detail th effect 1
+detail th el 1
+detail th gener 1
+detail th oper 1
+detail th organ 1
+detail th perform 1
+detail th reader 1
+detail to convinc 1
+detail to le 1
+detail to support 1
+detail treatm 1
+detail understand 1
+detail using 1
+detail view 2
+detail wer giv 1
+detail wh 1
+detail which describ 1
+detail yield 1
+detat 1
+detect 43
+detect a failur 1
+detect a lost 1
+detect a repetit 1
+detect al black 1
+detect al outl 1
+detect algorithm 1
+detect and elim 1
+detect and ind 1
+detect and loc 1
+detect and parallel 1
+detect and report 1
+detect and request 1
+detect and respon 2
+detect and retransm 1
+detect and textur 1
+detect and undetect 1
+detect any extr 1
+detect approach 1
+detect approach using 1
+detect ar consider 1
+detect ar exampl 1
+detect ar map 1
+detect ar pr 1
+detect at iter 1
+detect by an 1
+detect by examin 1
+detect cap 1
+detect condit 1
+detect corrupt 1
+detect corrupt occur 1
+detect corrupt proc 1
+detect deform 1
+detect dent 1
+detect dev 1
+detect dur regr 1
+detect edg 1
+detect edg point 1
+detect eff 1
+detect effect 1
+detect failur 1
+detect fault 2
+detect fault assign 1
+detect fault occur 1
+detect fict 1
+detect for exampl 1
+detect forml 1
+detect imag 1
+detect incompat 1
+detect incompat constraint 1
+detect indep 1
+detect inv 1
+detect inv marker 1
+detect investig 1
+detect irrelev 1
+detect is achief 1
+detect is concern 1
+detect is perform 1
+detect it execut 1
+detect knowledg 1
+detect knowledg gap 1
+detect lat 1
+detect mach 1
+detect manner 1
+detect marijuan 1
+detect memor 1
+detect memor acc 1
+detect method 1
+detect monot 1
+detect monot incr 1
+detect network 1
+detect network interfac 1
+detect no differ 1
+detect not relev 1
+detect occur 1
+detect of determ 1
+detect of determin 1
+detect of usag 1
+detect or undetect 1
+detect outl 1
+detect po deform 1
+detect problem 1
+detect program 1
+detect program mistak 1
+detect rat 1
+detect read 1
+detect satisf 1
+detect sc 1
+detect separ 1
+detect server 1
+detect server failur 1
+detect shar 1
+detect shar acc 1
+detect smal dent 1
+detect softwar 1
+detect st 1
+detect st corrupt 1
+detect stack 1
+detect stack overflow 1
+detect strang 1
+detect strang attract 1
+detect strateg 1
+detect syntact 1
+detect syntact differ 1
+detect techniqu 1
+detect th appropr 1
+detect th chang 1
+detect th differ 1
+detect th erron 1
+detect th failur 1
+detect th glob 1
+detect th maxim 1
+detect th mi 1
+detect th point 1
+detect th st 1
+detect th surfac 1
+detect tw kilogram 1
+detect val 1
+detect val dent 1
+detect valu 1
+detect wil prov 1
+deterior 3
+deterior lin 1
+deterior th perform 1
+determ 20
+determ allow 1
+determ and count 1
+determ correspon 1
+determ in funct 1
+determ in log 1
+determ inh 1
+determ of appropr 1
+determ of approxim 1
+determ of avail 1
+determ of coh 1
+determ of condit 1
+determ of loc 1
+determ of modl 1
+determ procedur 1
+determ procedur du 1
+determ turn 1
+determ would requir 1
+determin 106
+determin a cl 1
+determin a cycl 1
+determin a distribut 1
+determin a high 1
+determin a minim 1
+determin a proc 1
+determin a specif 1
+determin a suit 1
+determin a val 1
+determin affect 1
+determin affect variabl 1
+determin al coh 1
+determin al eigenvalu 1
+determin al upd 1
+determin algorithm 3
+determin algorithm giv 1
+determin an eff 2
+determin and assum 1
+determin and bulk 1
+determin and non 1
+determin and stochast 1
+determin and tabl 1
+determin approach 1
+determin approach ba 1
+determin as candid 1
+determin as follow 4
+determin as nw 1
+determin at compil 2
+determin at distribut 1
+determin at run 1
+determin at runtim 1
+determin authorship 1
+determin automat 1
+determin b1 1
+determin ba 1
+determin by an 1
+determin by appropr 1
+determin by caus 1
+determin by check 1
+determin by compar 1
+determin by geograph 1
+determin by giv 1
+determin by init 1
+determin by investig 1
+determin by match 1
+determin by mint 1
+determin by nw 1
+determin by oe 1
+determin by random 1
+determin by specif 1
+determin by test 1
+determin by tim 1
+determin by using 1
+determin ca 1
+determin ch 1
+determin cl 1
+determin commun 1
+determin commun perform 1
+determin complec 1
+determin complec cl 1
+determin comput 3
+determin comput model 1
+determin configur 1
+determin consensus 1
+determin consensus protocol 1
+determin containm 1
+determin control 1
+determin control strateg 1
+determin correspon 1
+determin correspon compon 1
+determin correspon program 1
+determin counterpart 1
+determin cr 1
+determin dep 1
+determin dupl 1
+determin dynam 1
+determin dynam system 1
+determin eff 1
+determin en 1
+determin environm 1
+determin equiv 1
+determin equiv using 1
+determin exact 2
+determin execut 1
+determin fact 1
+determin find 1
+determin finit 2
+determin finit automat 1
+determin finit st 1
+determin from anticip 1
+determin from cr 1
+determin gener 1
+determin gener tren 1
+determin guaranteed 1
+determin how good 1
+determin how modif 1
+determin how ti 1
+determin if academ 1
+determin in gener 1
+determin in polynom 1
+determin in tim 1
+determin invar 1
+determin it default 1
+determin it loc 1
+determin it minim 1
+determin it payrol 1
+determin it typ 1
+determin it width 1
+determin l program 1
+determin langu 1
+determin largest 1
+determin largest system 1
+determin list 1
+determin list concat 1
+determin liv 1
+determin mach 1
+determin mach m0 1
+determin mach recogn 1
+determin mod 1
+determin mod log 1
+determin multicast 1
+determin multicast addr 1
+determin natur 1
+determin network 2
+determin network configur 1
+determin network traff 1
+determin nod 1
+determin nod prior 1
+determin non 1
+determin nw 1
+determin oe1 1
+determin of commun 1
+determin oper 1
+determin order 1
+determin over 2
+determin over system 2
+determin parallel 3
+determin parallel algorithm 1
+determin parallel hierarch 1
+determin parallel sort 1
+determin po 1
+determin po configur 1
+determin po solut 1
+determin polynom 1
+determin polynom tim 1
+determin pot 1
+determin program 2
+determin qu 1
+determin qu polynom 1
+determin reach 1
+determin reach inform 1
+determin real 1
+determin real mach 1
+determin real proper 1
+determin receiver 1
+determin reduc 2
+determin reduc strateg 1
+determin remov 1
+determin requir 1
+determin requir incr 1
+determin rout 1
+determin rout me 1
+determin sampl 1
+determin se 1
+determin secon pa 1
+determin sem 1
+determin sem equiv 1
+determin sender 1
+determin sensit 1
+determin sequ 1
+determin simil 1
+determin simil protein 1
+determin simplif 1
+determin soft 1
+determin soft loc 1
+determin sort 2
+determin sort algorithm 2
+determin ss 1
+determin stat 1
+determin stat equiv 1
+determin stat nonequiv 1
+determin structur 1
+determin sub 1
+determin sub modl 1
+determin subreg 1
+determin such cost 1
+determin test 2
+determin test obsol 1
+determin th amin 1
+determin th amount 1
+determin th asymptot 1
+determin th author 1
+determin th aver 2
+determin th ba 1
+determin th bisect 2
+determin th classif 1
+determin th condit 1
+determin th const 1
+determin th cont 1
+determin th context 1
+determin th correct 1
+determin th dat 1
+determin th differ 1
+determin th dim 1
+determin th direct 1
+determin th displ 1
+determin th dur 1
+determin th edg 1
+determin th effect 2
+determin th eigenvalu 1
+determin th emb 1
+determin th entir 1
+determin th exact 1
+determin th execut 1
+determin th expect 1
+determin th extent 1
+determin th fact 1
+determin th form 1
+determin th gamut 1
+determin th glob 1
+determin th granl 1
+determin th highestprior 1
+determin th ident 1
+determin th implem 1
+determin th incon 1
+determin th inst 1
+determin th int 1
+determin th interfer 1
+determin th landmark 1
+determin th largest 3
+determin th leftmost 1
+determin th loc 1
+determin th lower 1
+determin th matr 1
+determin th maxim 2
+determin th mean 1
+determin th memor 1
+determin th minim 1
+determin th model 1
+determin th number 3
+determin th object 1
+determin th order 2
+determin th outcom 1
+determin th output 1
+determin th pack 1
+determin th parameter 2
+determin th partit 1
+determin th path 1
+determin th posit 2
+determin th prior 2
+determin th privileg 1
+determin th proper 1
+determin th rout 2
+determin th sal 1
+determin th sampl 1
+determin th sensit 1
+determin th sequ 1
+determin th serv 1
+determin th siml 1
+determin th siz 2
+determin th spat 1
+determin th stat 2
+determin th structur 2
+determin th sub 1
+determin th tim 1
+determin th topolog 1
+determin th tot 1
+determin th typ 1
+determin th val 1
+determin th valu 1
+determin that ib 1
+determin that pn 1
+determin that train 1
+determin their degr 1
+determin thread 1
+determin tight 1
+determin tight upper 1
+determin tim 1
+determin tim cl 1
+determin tim complec 1
+determin tim hierarch 1
+determin to mak 1
+determin to maxim 1
+determin unfold 1
+determin union 1
+determin using 4
+determin using cl 1
+determin using loc 1
+determin v0 1
+determin ver 1
+determin wh 1
+determin wh addit 1
+determin what appropr 1
+determin what inform 1
+determin what kind 1
+determin when posit 1
+determin when test 1
+determin whether cod 1
+determin whether increm 1
+determin whether theorem 1
+determin which candid 1
+determin which dat 1
+determin which featur 1
+determin which fil 1
+determin which inst 1
+determin which item 1
+determin which knowledg 1
+determin which loc 1
+determin which method 1
+determin which natur 1
+determin which proc 1
+determin which string 1
+determin without stat 1
+determin2 1
+determin2 program 1
+determiner 2
+determiner adjectivenoun 1
+determiner phr 1
+detract 1
+detrim 3
+detrim influ 1
+detrim mov 1
+detrim step 1
+detrim to understand 1
+detroit 4
+detud 1
+detud et de 1
+deuniver 1
+deus 2
+deus and l.m 1
+deutsch 5
+deutsch akademisch 2
+deutsch akademisch austauschdienst 2
+deutsch akzent 1
+deutsch forschungsgemeinschaft 1
+deutsch saetz 1
+deutsch us 1
+deutsch92 1
+deux 5
+deux a de 1
+deux a deux 2
+deux acc 1
+deux acc es 1
+deux adr 1
+deux adr sauvegard 1
+deux algorithm 1
+deux algorithm direct 1
+deux am elior 2
+deux approch 1
+deux approch se 1
+deux argum 1
+deux argum est 1
+deux aspect 1
+deux aspect quil 1
+deux autr 2
+deux autr candidat 1
+deux autr ver 1
+deux avant 1
+deux avant etant 1
+deux bloc 2
+deux bloc de 1
+deux bloc distinct 1
+deux born 1
+deux born en 1
+deux boucl 1
+deux boucl ce 1
+deux boucl ne 1
+deux boucl refl 1
+deux boucl sont 1
+deux boucl sub 1
+deux ca 2
+deux ca classiqu 1
+deux ca de 1
+deux ca doiv 1
+deux ca en 1
+deux ca particl 2
+deux ca possibl 1
+deux ca simpl 2
+deux ca sont 1
+deux ca suiv 1
+deux ca trait 1
+deux candidat 1
+deux candidat correspon 1
+deux caract 1
+deux caract eristiqu 1
+deux caus 1
+deux caus de 1
+deux ce 1
+deux ce qu 1
+deux cel 1
+deux cel de 1
+deux cel libr 1
+deux ch 1
+deux ch essentiel 1
+deux champ 1
+deux champ sauvegard 1
+deux chromosom 1
+deux chromosom c1 1
+deux cl 1
+deux claus 1
+deux claus etait 1
+deux claus ou 1
+deux claus sont 1
+deux coeff 1
+deux coeff domin 1
+deux colon 1
+deux colon adjac 1
+deux colon diff 1
+deux comp 1
+deux comp qu 1
+deux condit 1
+deux condit de 1
+deux condit en 1
+deux configur 1
+deux configur cod 1
+deux configur planair 1
+deux conflit 1
+deux conflit sil 1
+deux const 1
+deux const sont 1
+deux constat 1
+deux convec 1
+deux coupur 1
+deux coupur glob 1
+deux d efaut 1
+deux d efinit 1
+deux d esav 1
+deux dern 2
+deux dern er 2
+deux dern pr 1
+deux diff 1
+deux diff er 1
+deux dim 1
+deux dim acc 1
+deux direct 1
+deux direct dan 1
+deux disjoint 1
+deux docum 1
+deux docum peut 1
+deux don 2
+deux don ee 2
+deux dur 1
+deux dur ee 1
+deux ecritur 1
+deux ecritur au 1
+deux ecritur con 1
+deux ecritur est 1
+deux ecritur etc 1
+deux ecritur ma 1
+deux ecritur ont 1
+deux ecritur simultan 1
+deux eff 1
+deux el 1
+deux el ement 1
+deux em 3
+deux em argum 1
+deux em ca 2
+deux em claus 1
+deux em colon 1
+deux em direct 1
+deux em est 1
+deux em etap 1
+deux em etud 1
+deux em famil 1
+deux em form 1
+deux em inst 1
+deux em pa 1
+deux em part 1
+deux em point 1
+deux em probl 1
+deux em temp 1
+deux en 1
+deux en lectur 1
+deux enf 1
+deux enf g3 1
+deux ensembl 1
+deux ensembl est 1
+deux ensembl s 1
+deux ensembl sont 1
+deux ent 1
+deux est 1
+deux est le 1
+deux et peuv 1
+deux et qu 1
+deux et revenir 1
+deux etap 2
+deux etiqu 1
+deux etiqu correspon 1
+deux exempl 2
+deux exempl dappl 1
+deux exempl de 1
+deux exempl du 1
+deux exempl sont 1
+deux extr 1
+deux extr em 1
+deux facteur 2
+deux famil 1
+deux famil dinstruc 1
+deux fo 2
+deux fo ce 1
+deux fo le 1
+deux fo si 1
+deux fonct 2
+deux fonct ent 1
+deux fonct vectoriel 1
+deux form 1
+deux form peuv 1
+deux graph 1
+deux graph g1 1
+deux id ee 1
+deux imag 1
+deux impl 1
+deux impl em 1
+deux in egalit 1
+deux ind 1
+deux individus 1
+deux individus binair 1
+deux individus enf 1
+deux individus obtenus 1
+deux individus parent 1
+deux individus x1 1
+deux instruc 2
+deux instruc com 1
+deux instruc peuv 1
+deux instruc sannihil 1
+deux instruc suiv 1
+deux instruc test 1
+deux it erat 1
+deux jacob 1
+deux le 1
+deux le temp 1
+deux logiciel 1
+deux logiciel le 1
+deux m ethod 2
+deux man 1
+deux man er 1
+deux matr 1
+deux matr unimodulair 1
+deux me transform 1
+deux me vol 1
+deux mesur 1
+deux mesur de 1
+deux mi 1
+deux microprogram 1
+deux microprogram diff 1
+deux mot 1
+deux mot mach 1
+deux mouv 1
+deux mouv sont 1
+deux nid 1
+deux nid de 1
+deux nid distinct 1
+deux nid en 1
+deux nid pour 1
+deux niveaux 1
+deux niveaux de 1
+deux nouveaux 1
+deux nouveaux individus 1
+deux nouvel 2
+deux nouvel claus 1
+deux nouvel famil 1
+deux nouvel instruc 1
+deux nouvel pil 1
+deux op 1
+deux op erand 1
+deux op erat 1
+deux ordonnanc 1
+deux ordonnanc classiqu 1
+deux ordonnanc statiqu 1
+deux ou 1
+deux ou tr 1
+deux p ol 1
+deux pa 1
+deux pa qu 1
+deux pag 1
+deux pag conflictuel 1
+deux paragraph 1
+deux paragraph suiv 1
+deux parent 1
+deux parent sont 1
+deux part 4
+deux part est 1
+deux partit 1
+deux partit etud 1
+deux partit possibl 1
+deux patron 1
+deux patron translat 1
+deux ph 1
+deux ph princip 1
+deux pil 1
+deux point 3
+deux point de 1
+deux point est 1
+deux point import 1
+deux pointeur 1
+deux pointeur cr 1
+deux pointeur sont 1
+deux posit 1
+deux posit successiv 1
+deux prem 2
+deux prem argum 1
+deux prem er 2
+deux prem typ 1
+deux principaux 1
+deux principaux typ 1
+deux processeur 2
+deux processeur ayant 1
+deux processeur de 1
+deux processeur dev 1
+deux processeur dic 1
+deux processeur diff 1
+deux processeur doiv 1
+deux processeur en 1
+deux processeur p1 1
+deux processeur sont 1
+deux program 1
+deux program possibl 1
+deux proposit 1
+deux proposit diff 1
+deux proposit ont 1
+deux protocol 1
+deux protocol le 1
+deux r egl 1
+deux raison 2
+deux raison fondam 1
+deux register 1
+deux register de 1
+deux register suppl 1
+deux s equ 1
+deux saut 1
+deux saut direct 1
+deux sect 1
+deux solut 2
+deux solut sont 1
+deux som 1
+deux strat 1
+deux strat eg 1
+deux suit 1
+deux suiv 1
+deux tableaux 1
+deux tableaux appart 1
+deux techniqu 3
+deux techniqu aut 1
+deux techniqu de 1
+deux techniqu ont 1
+deux techniqu pour 1
+deux techniqu sont 1
+deux term 1
+deux term egaux 1
+deux term instanc 1
+deux term modifiabl 1
+deux test 2
+deux test en 1
+deux test sont 1
+deux test successif 1
+deux th 1
+deux th eor 1
+deux transit 1
+deux transit repr 1
+deux treil 1
+deux treil ont 1
+deux typ 2
+deux typ de 2
+deux typ denregister 1
+deux valeur 3
+deux valeur de 2
+deux valeur logiqu 1
+deux variabl 2
+deux variabl affecter 1
+deux variabl de 1
+deux variabl domain 1
+deux variabl gel 1
+deux variabl partag 1
+deux variabl perman 1
+deux variabl vectoriel 1
+deux vecteur 2
+deux vecteur de 1
+deux vecteur etant 1
+deux vecteur sont 1
+deux ver 2
+deux ver de 1
+deux ver dun 1
+deux ver ne 1
+deux ver optim 1
+deux ver pp 1
+deux voisin 1
+deux voisin dan 1
+dev 37
+dev a parallel 1
+dev a sequ 1
+dev a st 1
+dev a test 1
+dev acc 1
+dev acc eder 1
+dev alor 2
+dev alor le 1
+dev alor tr 1
+dev an nc 1
+dev and langu 1
+dev ar assum 1
+dev ar avail 1
+dev ar pref 1
+dev ar typ 1
+dev as stat 1
+dev by goodrich 1
+dev cal impl 1
+dev can simultan 1
+dev coop 1
+dev coop erer 1
+dev d ecisif 1
+dev datadisk 1
+dev de 2
+dev de structur 1
+dev dmdisk 1
+dev driver 1
+dev enabl 1
+dev etr 1
+dev etr court 1
+dev fault 1
+dev for cutout 1
+dev for finit 1
+dev for measur 1
+dev for subband 1
+dev funct 1
+dev funct ship 1
+dev implementer 1
+dev implementer requir 1
+dev in order 1
+dev inconditionnel 1
+dev inutil 1
+dev is avail 1
+dev is ind 1
+dev is therefor 1
+dev l etat 1
+dev la 2
+dev la com 2
+dev la pair 1
+dev le 2
+dev le nouveau 1
+dev le som 1
+dev le term 1
+dev lenviron 1
+dev lenviron cour 1
+dev logdisk 1
+dev may correspon 1
+dev method 1
+dev n eglig 1
+dev nam 1
+dev new compr 1
+dev nt4 1
+dev or compon 1
+dev part 1
+dev part int 1
+dev plus complec 1
+dev ps2 1
+dev rapid 1
+dev rsd0c 1
+dev shar 1
+dev sit 1
+dev std 1
+dev suit 1
+dev suit metaphor 1
+dev to achief 1
+dev to obtain 1
+dev tok 1
+dev tr 1
+dev tr es 1
+dev trop 1
+dev un 2
+dev un abstract 1
+dev un handicap 1
+dev un pil 1
+dev un pointeur 1
+dev vit 1
+dev vit tr 1
+dev wer greater 1
+dev which integr 1
+devait 2
+devait etr 1
+devait etr adapt 1
+devait porter 1
+devait porter le 1
+develom 1
+develom on geometer 1
+develop 86
+develop a bottom 1
+develop a calculus 1
+develop a coh 1
+develop a composit 1
+develop a const 1
+develop a dec 1
+develop a decl 1
+develop a decluster 1
+develop a denot 1
+develop a descript 1
+develop a distribut 1
+develop a framework 1
+develop a gener 2
+develop a langu 2
+develop a lin 1
+develop a network 1
+develop a number 1
+develop a perform 1
+develop a protocol 1
+develop a reflect 1
+develop a rel 1
+develop a schedl 1
+develop a ser 1
+develop a simil 1
+develop a softwar 1
+develop a sound 1
+develop a specif 1
+develop a stat 1
+develop a subst 1
+develop a suff 1
+develop a suit 1
+develop a system 3
+develop a techniqu 1
+develop a theor 2
+develop a tool 1
+develop a tot 1
+develop addit 1
+develop addit condit 1
+develop algorithm 2
+develop an algorithm 2
+develop an altern 1
+develop an an 2
+develop an appl 1
+develop an approxim 1
+develop an educ 1
+develop an empir 1
+develop an exper 1
+develop an experim 1
+develop an ext 1
+develop an industr 1
+develop an optim 1
+develop and an 1
+develop and continu 1
+develop and deliver 1
+develop and evalu 2
+develop and test 1
+develop any inherit 1
+develop arbitr 1
+develop arbitr problem 1
+develop as part 2
+develop as separ 1
+develop at ecrc 1
+develop at ibm 1
+develop at kf 1
+develop at mcc 1
+develop by allender 1
+develop by bierwisch 1
+develop by cardel 1
+develop by dugan 1
+develop by kesim 1
+develop by liang 1
+develop by nod 1
+develop clus. 2
+develop cod 1
+develop compon 1
+develop constraint 1
+develop constraint log 1
+develop contact 1
+develop contact author 1
+develop dat 1
+develop dat distribut 1
+develop decl 1
+develop decl sem 1
+develop design 3
+develop design guidel 3
+develop dur futur 1
+develop dur karin 1
+develop dynam 1
+develop dynam con 1
+develop earl 1
+develop environm 1
+develop fast 1
+develop field 1
+develop for 3d 1
+develop for ai 1
+develop for compil 1
+develop for comput 1
+develop for counterpropag 1
+develop for direct 1
+develop for estim 1
+develop for funct 1
+develop for intr 1
+develop for qu 1
+develop for recur 1
+develop for solut 1
+develop for specif 1
+develop four eff 1
+develop from pool 1
+develop from scratch 1
+develop further 1
+develop gener 2
+develop gener flec 1
+develop gener techniqu 1
+develop graph 1
+develop graph theor 1
+develop hierarch 2
+develop hierarch architectur 2
+develop in hung 1
+develop in sect 2
+develop in xv.5 1
+develop indep 1
+develop inform 1
+develop interest 1
+develop interest loc 1
+develop intern 1
+develop intern softwar 1
+develop knowledg 1
+develop knowledg ba 1
+develop lem 1
+develop lem show 1
+develop loc 1
+develop loc propag 1
+develop mor eff 1
+develop mor suggest 1
+develop object 1
+develop object orient 1
+develop optim 1
+develop optim algorithm 1
+develop our result 1
+develop over tim 1
+develop parallel 2
+develop parallel cg 1
+develop parallel lancz 1
+develop parallel search 1
+develop part 1
+develop pract 1
+develop pract algorithm 1
+develop prefer 1
+develop prelimin 1
+develop prelimin result 1
+develop prim 1
+develop prob 1
+develop prob distribut 1
+develop proc 1
+develop proc algebr 1
+develop proof 1
+develop proof using 1
+develop prov 1
+develop qu 1
+develop qu langu 1
+develop rapid 1
+develop real tim 1
+develop recur 1
+develop recur program 1
+develop rel 1
+develop rel build 1
+develop requir 1
+develop robust 1
+develop robust algorithm 1
+develop rout 1
+develop rout algorithm 1
+develop search 1
+develop search structur 1
+develop sem 1
+develop som form 1
+develop specif 1
+develop t1 1
+develop tak 1
+develop tak point 1
+develop th algorithm 1
+develop th calculus 1
+develop th concept 1
+develop th decl 1
+develop th descript 1
+develop th fixpoint 1
+develop th fundam 1
+develop th high 1
+develop th model 2
+develop th not 1
+develop th origin 1
+develop th simpl 1
+develop th skil 1
+develop th st 1
+develop th theor 1
+develop th tool 1
+develop that find 1
+develop to ad 1
+develop to deal 1
+develop to describ 1
+develop to elim 1
+develop to estim 1
+develop to examin 1
+develop to impl 1
+develop to mak 1
+develop to reason 1
+develop tool 1
+develop using 3
+develop using csim 1
+develop using object 1
+develop which quantif 1
+develop with lelisp 1
+develop with support 1
+develop. 1
+developer 7
+developer and illustr 1
+developer and user 1
+developer ar unlik 1
+developer domain 1
+developer int 1
+developer mak 1
+developer of figur 1
+developer of loc 1
+developer of softwar 1
+developer seek 1
+developer to describ 1
+developer viewpoint 1
+developer viewpoint concern 1
+developer want 1
+developer wil want 1
+developer with refer 1
+developerform.html 1
+developerform2.html 1
+developerworldr 1
+developerworldr system 1
+developm 56
+developm addr 2
+developm and an 1
+developm and debug 1
+developm and enabl 1
+developm and maint 4
+developm and perform 1
+developm and refin 1
+developm approach 2
+developm ar sum 1
+developm compan 1
+developm cost 1
+developm cycl 2
+developm framework 1
+developm in inform 1
+developm in log 1
+developm in proc 3
+developm in sect 1
+developm is wid 1
+developm manu 1
+developm method 3
+developm methodolog 1
+developm might work 1
+developm model 1
+developm of adv 2
+developm of an 1
+developm of analog 1
+developm of appl 1
+developm of appropr 1
+developm of complec 1
+developm of compon 1
+developm of constraint 1
+developm of deduc 1
+developm of distribut 1
+developm of environm 1
+developm of exact 1
+developm of gener 1
+developm of grandmother 1
+developm of implem 1
+developm of kcm 1
+developm of major 1
+developm of mathemat 1
+developm of multidim 1
+developm of object 1
+developm of oper 1
+developm of program 2
+developm of react 1
+developm of search 1
+developm of signif 1
+developm of softwareengineer 1
+developm of soph 1
+developm of support 1
+developm of system 1
+developm of tradit 1
+developm or maint 1
+developm ot 1
+developm ot hahn 1
+developm perform 1
+developm proc 5
+developm proc remain 1
+developm project 2
+developm purp 1
+developm situ 1
+developm step 1
+developm system 1
+developm test 1
+developm th reg 1
+developm tim 3
+developm to cod 1
+developm to undergradu 1
+developm tool 3
+developm using 2
+developm using object 1
+developm using vdm 1
+developm wil involut 1
+developm with matur 1
+developm with stack 1
+developm work 1
+developmentand 1
+developmentand debug 1
+developmentand debug toolsremot 1
+devenu 2
+devenu la 1
+devenu la solut 1
+devenu t enu 1
+devenu un domain 1
+devenus 1
+devenus inaccessibl 1
+devenus inutil 1
+devenus inutil sont 1
+devereux 1
+devijver 1
+devil 1
+devin 1
+devm 1
+devoir 1
+devoir etr 1
+devoir strict 1
+devoir strict cr 1
+devol 1
+devon 1
+devon d eterminer 1
+devon maint 1
+devon maint nous 1
+devon n eanmoin 1
+devot 17
+devot mor attent 1
+devot to ba 1
+devot to conclus 1
+devot to datab 1
+devot to form 1
+devot to glob 1
+devot to sketch 1
+devot to solut 1
+devot to test 1
+devr 2
+devr au 1
+devr au moin 1
+devr donc 1
+devr donc etr 1
+devr etr 1
+devr etr fus 1
+devr etr identiqu 1
+devr fair 1
+devr fair lobj 1
+devr pa 1
+devr pa avoir 1
+devr pa perdurer 1
+devr permettr 1
+devr plut 1
+devr plut ot 1
+devr tenir 1
+devr tenir compt 1
+devr utiliser 1
+devrait 3
+devrait assurer 1
+devrait aus 1
+devrait aus etr 1
+devrait automatiqu 1
+devrait automatiqu charger 1
+devrait con 1
+devrait con equem 1
+devrait donc 1
+devrait etr 1
+devrait etr calcl 1
+devrait etr efficac 1
+devrait etr lim 1
+devrait etr restaur 1
+devrait pa 1
+devrait pa etr 1
+devrait permettr 2
+devrait permettr au 1
+devrait permettr dimpl 1
+devrait permettr un 1
+devrait pointer 1
+devrait pointer sur 1
+devrait r eduir 1
+devrait rendr 1
+devrait rendr acc 1
+devrait saccompagner 1
+devrait saccompagner dun 1
+devrait sav 1
+devrait sav erer 1
+devront 2
+devront etr 2
+devront etr ajust 1
+devront etr effectu 1
+devront permettr 1
+devront permettr de 1
+devront retrouver 1
+devront retrouver leur 1
+dew 2
+dew decim 1
+dew decim system 1
+dewit 2
+dewit et al 1
+dexam 2
+dexaminer 2
+dexaminer ce 1
+dexaminer ce th 1
+dexaminer le 1
+dexempl 1
+dexhaustivit 1
+dexhiber 1
+dexhiber de 1
+dexhiber de program 1
+dexp 2
+dexp er 1
+dexp er men 1
+dexp er ont 1
+dexp er sur 1
+dexp erim 1
+dexp erim de 1
+dexpan 1
+dexpan du 1
+dexpan du cod 1
+dexploit 2
+dexploit dan 1
+dexploit dan le 1
+dexploit de 1
+dexploit de lhypercub 1
+dexploit et ma 1
+dexploit et sur 1
+dexploit ou 1
+dexploit ou le 1
+dexploiter 1
+dexploiter la 1
+dexploiter la localit 1
+dexplor 3
+dexplor de 1
+dexplor de larbr 1
+dexplor partiel 1
+dexplor partiel de 1
+dexplor partiel du 1
+dexplor stochastiqu 1
+dexplor stochastiqu qu 1
+dexplorer 2
+dexplorer dautr 1
+dexplorer dautr fuseaux 1
+dexplorer le 1
+dexplorer le voisin 1
+dexpr 2
+dexpr de 1
+dexpr de typ 1
+dexpr util 1
+dexpr util ee 1
+dexprimer 1
+dexprimer le 1
+dexprimer le born 1
+dext 2
+dext com 1
+dext com la 1
+dext com le 1
+dext de 1
+dext de traiter 1
+dext fa 1
+dext fa appel 1
+dext qu 1
+dext serait 1
+dext serait toutef 1
+dext sont 1
+dext sont sauvegard 1
+dext tel 1
+dext tel qu 1
+dext verif 1
+dext verif attribut 1
+dextensibilit 1
+dextract 2
+dextract de 2
+dextract de primitiv 1
+dextrair 1
+dextrair le 1
+dextrair le nouveau 1
+df 5
+df accept 1
+df con 1
+df con problem 1
+df that accept 1
+dfg 1
+dfg con 1
+dfg dep 1
+dfg dep edg 1
+dfg nod 1
+dfg oper 1
+dfg oper sem 1
+dfg to tim 1
+dfg we build 1
+dfk 1
+dfk oz 1
+dfk oz docum 1
+dfl001 1
+dfr91 1
+dg 8
+dg parcouru 1
+dg parcouru dan 1
+dg valu 1
+dg xi 2
+dg0 1
+dg92 1
+dgmh 1
+dh 1
+dh91 1
+dh94 1
+dhabaleswar 4
+dhabilit 1
+dhabitud 1
+dherm 1
+dherm et en 1
+dhl93 1
+dholzbaur 1
+dhpf 1
+dhpf par 1
+dhpf par exempl 1
+dhybrid 1
+dhybrid de 1
+dhybrid de no 1
+dhybrid et dautr 1
+dhydrodynamiqu 1
+dhyperoctr 1
+dhyperoctr de 1
+dhyperoctr de dim 1
+dhypoth 2
+dhypoth es 2
+dhypoth es de 1
+di 31
+di 3di 1
+di and ei 1
+di ar comput 1
+di ar requir 1
+di arbeit 1
+di arbeit ist 1
+di az 1
+di backtrack 1
+di beziehung 1
+di beziehung zwisch 1
+di certain funct 1
+di del 1
+di descript 1
+di determin 1
+di di 1
+di fail 1
+di from proc 1
+di funct 1
+di gi2i 1
+di inform 3
+di int 1
+di int deutsch 1
+di is defin 1
+di is repair 1
+di is replac 1
+di milan 1
+di msg 1
+di msg expr 1
+di pi 4
+di pij 1
+di rent 1
+di rent suiv 1
+di rent typ 1
+di rentiel 1
+di rentiel de 1
+di rentiel prot 1
+di rentiel qu 1
+di simil 1
+di slav 1
+di slav loc 1
+di standard 1
+di standard optim 1
+di steer 1
+di steer com 1
+di system 2
+di th execut 1
+di th standard 1
+di then le 1
+di vi 1
+di zurig 1
+di. 1
+di.ucm.es 1
+di.unip.it 2
+di0 1
+di0 nt 1
+di0 nt kbt 1
+di2 1
+diab 1
+diab promoter 1
+diab promoter sonar 1
+diag 1
+diagn 4
+diagn and configur 1
+diagn and rout 1
+diagn and techn 1
+diagn and test 1
+diagn cardiac 1
+diagn cardiac arrhythm 1
+diagn consider 1
+diagn cur 1
+diagn cur concentr 1
+diagn ha logarithm 1
+diagn help 1
+diagn in particl 1
+diagn multipl 1
+diagn multipl fault 1
+diagn planar 1
+diagn planar cr 1
+diagn specif 1
+diagn vi caus 1
+diagnost 3
+diagnost algorithm 1
+diagnost complec 2
+diagnost dec 1
+diagnost dec support 1
+diagnost eff 1
+diagnost output 1
+diagnost output difficult 1
+diagnost problem 1
+diagnost reason 1
+diagnost reason ba 1
+diagnost rl 1
+diagnost support 1
+diagnost system 1
+diagon 9
+diagon and bidiagon 1
+diagon ayant 1
+diagon ayant pour 1
+diagon can contain 1
+diagon cont 1
+diagon cont le 1
+diagon contain 1
+diagon dash 1
+diagon dash lin 1
+diagon de 1
+diagon de comp 1
+diagon de la 1
+diagon el 1
+diagon int intern 1
+diagon is subst 1
+diagon mi 1
+diagon nonzer 1
+diagon nonzer structur 1
+diagon random 1
+diagon read 1
+diagon scal 1
+diagonaux 1
+diagonaux de 1
+diagonaux de la 1
+diagram 22
+diagram and delaun 1
+diagram ch 1
+diagram ch giv 1
+diagram commut 2
+diagram delaun 1
+diagram delaun triangl 1
+diagram for sequ 1
+diagram for t1 1
+diagram for t2 1
+diagram for thread 1
+diagram illustr 1
+diagram in figur 1
+diagram of abcl 1
+diagram of impl 1
+diagram of point 1
+diagram of s1 1
+diagram of s2 1
+diagram repr 1
+diagram show 2
+diagram shown 1
+diagram th edg 1
+diagram wh 1
+dial 1
+dialect 2
+dialect of lisp 1
+dialect of prolog 1
+dialect of schem 1
+dialog 3
+dialog box 1
+dialog is intrin 1
+dialog with respect 1
+dialogu 2
+dialogu el 1
+diameter 9
+diameter is logarithm 1
+diameter network 1
+diameter of fi 1
+diameter of greed 1
+diameter of ti 1
+diameter which mak 1
+diamon 2
+diamon proper 1
+dian 1
+diaryloc 1
+diaryloc client 1
+diaryloc client otherloc 1
+diaz 2
+diaz and gyur 1
+diaz et codognet 1
+dibl 1
+dibl en 1
+dibl en imager 1
+dic 6
+dic 3d 1
+dic an 1
+dic cut 1
+dic cut tot 1
+dic dan 1
+dic dan le 1
+dic de 1
+dic de solut 1
+dic dern 1
+dic dern er 1
+dic dun 1
+dic ec 1
+dic ecut 4
+dic ecut assez 1
+dic ecut de 4
+dic ecut don 1
+dic ecut du 2
+dic ecut dun 1
+dic ecut effectu 1
+dic ecut en 1
+dic ecut fork 1
+dic ecut le 1
+dic ecut nest 1
+dic ecut non 1
+dic ecut obtenus 1
+dic ecut par 1
+dic ecut pour 1
+dic ecut report 1
+dic ecut sont 1
+dic ecut standard 1
+dic ecut sur 1
+dic ecut util 1
+dic ecuter 3
+dic ecuter du 1
+dic ecuter en 1
+dic et biolog 1
+dic et en 1
+dic nous 1
+dic nous navon 1
+dic tridimensionnel 1
+dicam 1
+dichotom 2
+dichotom tel 1
+dichotom tel quimpl 1
+dick 1
+dick wer pen 1
+dickman 1
+dickman and winklhofer 1
+dicm 1
+dicm et motiv 1
+dict 12
+dict and object 1
+dict and propag 1
+dict ba 2
+dict by writ 1
+dict for cl 1
+dict from object 1
+dict graph 2
+dict graph anchor 1
+dict graph caus 1
+dict graph contain 1
+dict graph defin 1
+dict graph describ 1
+dict graph evolut 1
+dict graph occur 1
+dict graph specif 1
+dict learn 1
+dict mach 1
+dict object 1
+dict object behavior 1
+dict of quot 1
+dict of word 1
+dict or thesaurus 1
+dict th commun 1
+dict transform 1
+dict v rioc 1
+dict we disc 1
+dict which allow 1
+didactiqu 1
+didentif 2
+didentif a la 1
+didentif le 1
+didentif le pag 1
+didentif pr 1
+didentif pr ec 1
+didentif tous 1
+didentif tous le 1
+didentioer 1
+didentioer la 1
+didentioer la conogur 1
+didentioer le 1
+didentioer le point 1
+didn 1
+didn t read 1
+diederich 1
+dieg 14
+dieg la 1
+dieg la jol 1
+dieter 1
+dieter kolb 1
+dieterich 1
+dietrich 4
+dietrich weber 2
+dietterich 2
+dif 1
+dif cult 1
+diff 7
+diff er 2
+diff er alor 1
+diff er avec 1
+diff er de 2
+diff er entr 1
+diff er est 1
+diff er etant 1
+diff er import 1
+diff er nest 1
+diff er pa 1
+diff er sexpliqu 1
+diff er soit 1
+diff er sont 1
+diff er sub 1
+diff er suiv 1
+diff er tr 1
+diff erem 1
+diff erem de 1
+diff erenc 1
+diff erenc dan 1
+diff erent 5
+diff erent acc 1
+diff erent appart 1
+diff erent architectur 1
+diff erent aus 1
+diff erent banc 1
+diff erent bloc 1
+diff erent boucl 1
+diff erent ca 2
+diff erent cach 1
+diff erent calcl 1
+diff erent cl 1
+diff erent cod 1
+diff erent combinaison 1
+diff erent configur 1
+diff erent conflit 1
+diff erent dan 1
+diff erent de 2
+diff erent du 2
+diff erent dun 3
+diff erent el 1
+diff erent en 1
+diff erent etap 1
+diff erent evalu 1
+diff erent fa 1
+diff erent fonct 1
+diff erent fondam 1
+diff erent lor 1
+diff erent mod 2
+diff erent nid 1
+diff erent niveaux 1
+diff erent noeud 2
+diff erent nous 1
+diff erent op 1
+diff erent optim 1
+diff erent pa 1
+diff erent pag 1
+diff erent param 2
+diff erent peuv 1
+diff erent popl 1
+diff erent primitiv 1
+diff erent processeur 1
+diff erent processus 1
+diff erent program 1
+diff erent protocol 1
+diff erent qu 1
+diff erent quand 1
+diff erent repr 1
+diff erent sch 1
+diff erent sect 1
+diff erent selon 1
+diff erent siml 1
+diff erent sont 1
+diff erent suiv 1
+diff erent symbol 1
+diff erent tail 1
+diff erent techniqu 2
+diff erent tel 1
+diff erent treil 1
+diff erent typ 2
+diff erent unit 1
+diff erent valeur 3
+diff erent ver 1
+diff erentiabilit 1
+diff erentiel 1
+diff erentiel ei 1
+diff is defin 1
+diffeomorph 1
+diffeomorph map 1
+differ 90
+differ acc 1
+differ amount 1
+differ and ext 1
+differ ar 1
+differ ar avail 1
+differ ar scrutin 1
+differ as giv 1
+differ as modif 1
+differ betw 1
+differ between 2cl 1
+differ between act 1
+differ between algorithm 1
+differ between equ 1
+differ between glob 1
+differ between learn 1
+differ between look 1
+differ between lrc 1
+differ between network 1
+differ between pe 1
+differ between permut 1
+differ between rectangl 1
+differ between regr 1
+differ between search 1
+differ between standard 1
+differ between succ 1
+differ between upd 1
+differ between var 2
+differ between voron 1
+differ buffer 1
+differ buffer organ 1
+differ but requir 1
+differ by parameter 1
+differ can cr 1
+differ cap 1
+differ com 1
+differ comput 1
+differ consider 2
+differ dep 2
+differ differ textur 1
+differ differ typ 1
+differ dramat 1
+differ equ 5
+differ for simpl 1
+differ form 1
+differ from appl 1
+differ from defstruc 1
+differ from equ 1
+differ from gsm 1
+differ from mult 1
+differ from staticallytyp 1
+differ from un 1
+differ in behavior 1
+differ in branch 1
+differ in determin 1
+differ in eff 1
+differ in exact 1
+differ in form 1
+differ in growth 1
+differ in langu 1
+differ in level 1
+differ in model 1
+differ in norm 1
+differ in number 1
+differ in parallel 1
+differ in perform 3
+differ in pot 1
+differ in random 1
+differ in serv 1
+differ in tim 1
+differ init 1
+differ init run 1
+differ involut 1
+differ is ident 1
+differ is minim 1
+differ is zer 1
+differ map 1
+differ mark 1
+differ meter 1
+differ method 1
+differ model 1
+differ natur 1
+differ number 1
+differ of continu 1
+differ of cycl 1
+differ of hal 1
+differ of intersect 1
+differ of opinion 1
+differ of serv 1
+differ of underl 1
+differ oper 1
+differ opin 1
+differ our reduc 1
+differ our work 1
+differ param 1
+differ param etr 1
+differ prev 1
+differ prev compar2 1
+differ prim 1
+differ proc 1
+differ qu 1
+differ qu proc 1
+differ qualit 1
+differ refresh 1
+differ refresh algorithm 1
+differ scal 1
+differ scal attribut 1
+differ schem 1
+differ se 1
+differ slight 1
+differ th import 1
+differ timesl 1
+differ timesl comput 1
+differ to prev 1
+differ to reduc 1
+differ to result 1
+differ typ 1
+differ typ de 1
+differ w.r.t 1
+differ wer observ 1
+differ when using 1
+differ wid 1
+differ with oz 1
+differ with regard 1
+differ with respect 3
+differ with stat 1
+differ yj 1
+differ. 1
+difficil 4
+difficil a appr 2
+difficil a justif 1
+difficil a pr 1
+difficil compat 1
+difficil compat avec 1
+difficil compr 1
+difficil compr ehen 1
+difficil dacc 1
+difficil dacc es 1
+difficil de 1
+difficil dignorer 1
+difficil etr 1
+difficil etr trait 1
+difficil evaluabl 1
+difficil lorsqu 1
+difficil lorsqu lon 1
+difficil ma 1
+difficil ma itr 1
+difficult 72
+difficult and confus 1
+difficult and exp 1
+difficult and interest 1
+difficult and offer 1
+difficult ar 2
+difficult ar creat 1
+difficult as find 1
+difficult bal 1
+difficult becaus visu 1
+difficult befor adapt 1
+difficult bug 1
+difficult but interest 1
+difficult but tool 1
+difficult by review 1
+difficult ca 2
+difficult circumst 1
+difficult compar 1
+difficult du 1
+difficult e dan 1
+difficult e de 2
+difficult e emerg 1
+difficult e est 2
+difficult e prov 1
+difficult e suppl 1
+difficult encounter 3
+difficult es 3
+difficult es de 1
+difficult es fondam 1
+difficult es inh 1
+difficult es li 1
+difficult es lor 1
+difficult es majeur 1
+difficult es propr 1
+difficult es rencontr 1
+difficult expr 1
+difficult fact 1
+difficult for computer 1
+difficult for serv 1
+difficult for trac 1
+difficult for user 1
+difficult if inherit 1
+difficult in adopt 1
+difficult in dec 1
+difficult in develop 2
+difficult in elabor 1
+difficult in interpr 1
+difficult in loc 1
+difficult in program 1
+difficult is ea 1
+difficult is overcom 1
+difficult is show 1
+difficult kind 1
+difficult match 1
+difficult nam 1
+difficult non 1
+difficult non monot 1
+difficult of cl 1
+difficult of comput 1
+difficult of input 1
+difficult of understand 1
+difficult pattern 2
+difficult perform 1
+difficult perform hierarch 1
+difficult problem 2
+difficult remain 1
+difficult report 1
+difficult scenar 1
+difficult scenar wh 1
+difficult singl 1
+difficult singl inherit 1
+difficult task 6
+difficult th inappropr 1
+difficult than trac 1
+difficult to accommod 2
+difficult to achief 3
+difficult to ap 1
+difficult to attain 1
+difficult to chang 1
+difficult to character 1
+difficult to compl 1
+difficult to comput 1
+difficult to construc 1
+difficult to detect 1
+difficult to determin 1
+difficult to displ 1
+difficult to explicit 1
+difficult to exploit 1
+difficult to find 2
+difficult to imp 1
+difficult to impl 1
+difficult to know 2
+difficult to maintain 4
+difficult to modif 1
+difficult to overcom 1
+difficult to prov 2
+difficult to satisf 1
+difficult to say 1
+difficult to se 3
+difficult to show 2
+difficult to solut 1
+difficult to tel 1
+difficult to trac 1
+difficult to transform 1
+difficult to understand 1
+difficult to writ 1
+difficult unav 1
+difficult ver 1
+difficult with narx 1
+difficult without good 1
+difficult ye crit 1
+diffract 1
+diffract tr 1
+diffus 6
+diffus comput 1
+diffus comput mechan 1
+diffus de 1
+diffus de don 1
+diffus de lhypercub 1
+diffus de lipsc 1
+diffus dun 1
+diffus dun pag 1
+diffus e automatiqu 1
+diffus e par 1
+diffus et linv 1
+diffus implicit 1
+diffus implicit lor 1
+diffus la 1
+diffus radar 1
+diffus radar targ 1
+diffus sur 1
+diffus sur ecritur 1
+diffus sur lhypercub 1
+diffus syst 1
+diffus syst ematiqu 1
+diffus to by 1
+diffuser 1
+diffuser de 1
+diffuser de cop 1
+diffuser un 1
+diffuser un pag 1
+digit 28
+digit ai 1
+digit and character 1
+digit appl 1
+digit appl domain 1
+digit cl 1
+digit classif 1
+digit classif problem 1
+digit cod 1
+digit distribut 1
+digit distribut transact 1
+digit easynet 1
+digit equipm 7
+digit equipm corpor 7
+digit exampl 1
+digit experim 1
+digit form 1
+digit geometer 1
+digit gu 1
+digit imag 3
+digit imag proc 1
+digit implem 1
+digit key 1
+digit key ind 1
+digit learn 1
+digit libr 2
+digit lik input 1
+digit log 1
+digit mach 1
+digit network 1
+digit non 1
+digit non determ 1
+digit non determin 1
+digit nondeterm 1
+digit nondetermin 1
+digit number 1
+digit number writ 1
+digit pag 1
+digit photogrammeter 1
+digit pr 1
+digit problem 1
+digit produc 1
+digit recogn 1
+digit recognit 2
+digit recognit problem 1
+digit recognit system 1
+digit recognit task 1
+digit repr 1
+digit system 2
+digit system research 1
+digit tabl 1
+digit techn 1
+digit tp 1
+digit tp monit 1
+digit un 1
+digit var 1
+digit vid 1
+digit vid compr 1
+digit wer writ 1
+digit with digit 1
+digit year 1
+digk 1
+dignorer 1
+dignorer san produir 1
+digram 1
+digraph 1
+digraph ar pebbl 1
+digraph by ni 1
+digraph con 1
+digraph is defin 1
+digraph is pebbl 1
+digraph log 1
+digraph wh nod 1
+dij 1
+dij dist 1
+dij dist entr 1
+dijkstr 5
+dijkstr shortest 1
+dijkstr shortest path 1
+dijkstr spf 1
+dijkstr stud 1
+dijkstr styl 1
+dijkstr styl pr 1
+dijkstr weakest 1
+dijkstr weakest precondit 1
+dik 1
+diku 2
+diku report 1
+diku.dk 1
+dil 4
+dil de 1
+dil de franc 1
+dil le 1
+dil le tableau 1
+dilat 1
+dilat a effectuer 1
+dilat correspon 1
+dilat correspon aux 1
+dilat de 1
+dilat de boucl 1
+dilat de colon 1
+dilat de tableaux 1
+dilat de vecteur 1
+dilat du 1
+dilat du tableau 1
+dilat du vecteur 1
+dilat est 1
+dilat est import 1
+dilat et pav 1
+dilat le 1
+dilat le colon 1
+dilat maxim 1
+dilat minim 1
+dilat minim perm 1
+dilat perform 1
+dilat pr 1
+dilat pr ec 1
+dilat raison 1
+dilat util 1
+dilat util ee 1
+dilater 1
+dilater le 1
+dilater le colon 1
+dilem 2
+dillon 1
+dillustrer 2
+dillustrer la 1
+dillustrer sur 1
+dim 56
+dim acc 1
+dim acc edant 1
+dim addr 1
+dim addr spac 1
+dim an 1
+dim an show 1
+dim an techniqu 1
+dim and fic 1
+dim and p1 1
+dim and st 1
+dim ar 3
+dim ar el 1
+dim ar exhaust 1
+dim at fic 1
+dim au 1
+dim au moin 1
+dim b tr 1
+dim button 1
+dim button gener 1
+dim ca 2
+dim chain 1
+dim chain spac 1
+dim compatibl 1
+dim compatibl pour 1
+dim computer 2
+dim computer paradigm 1
+dim computer vi 1
+dim computergener 1
+dim computergener geograph 1
+dim cont 1
+dim coupl 1
+dim cub 1
+dim cur 1
+dim cur problem 1
+dim d con 1
+dim d sur 1
+dim de 4
+dim de champ 1
+dim de la 1
+dim den 1
+dim den system 1
+dim depth 1
+dim depth cu 1
+dim deux 2
+dim deux ou 1
+dim di 1
+dim discr 1
+dim discr grid 1
+dim el 1
+dim el euclidean 1
+dim est 1
+dim est de 1
+dim euclidean 1
+dim euclidean spac 1
+dim ext 1
+dim fac 1
+dim fin 1
+dim finit 1
+dim finit el 1
+dim for classif 1
+dim form 1
+dim graph 2
+dim grid 3
+dim grid exact 1
+dim herbrand 1
+dim herbrand ba 1
+dim herbrand interpr 1
+dim herbrand model 1
+dim hist 1
+dim hist rel 1
+dim hyperoctr 1
+dim icon 1
+dim imag 1
+dim in datab 1
+dim ind 2
+dim ind reduc 1
+dim input 1
+dim input spac 1
+dim int program 1
+dim inter 1
+dim inter cluster 1
+dim intercluster 1
+dim intercluster network 1
+dim interper 1
+dim interpr 1
+dim interpr assign 1
+dim interv 2
+dim interv dat 1
+dim irm 1
+dim irm du 1
+dim is appl 1
+dim is ch 1
+dim is model 1
+dim is orthogon 1
+dim langu 1
+dim langu ml 1
+dim log 1
+dim log ext 1
+dim log ml 1
+dim log program 1
+dim m dic 1
+dim match 1
+dim measur 1
+dim measur purp 1
+dim med 2
+dim med imag 1
+dim mesh 4
+dim mesh defin 1
+dim mesh network 1
+dim mod 1
+dim mod log 1
+dim model 3
+dim num 1
+dim num er 1
+dim object 5
+dim object ba 1
+dim object con 1
+dim object recognit 1
+dim of custom 1
+dim of object 1
+dim of var 1
+dim par 1
+dim par problem 1
+dim particl 1
+dim particl siml 1
+dim per 1
+dim point 1
+dim pointer 1
+dim pointer ba 1
+dim princip 1
+dim princip du 1
+dim program 1
+dim quelconqu 1
+dim quelconqu est 1
+dim reconstruc 2
+dim reconstruc spac 1
+dim rectangl 1
+dim rectangl organ 1
+dim reduc 1
+dim refer 1
+dim reg 1
+dim remain 1
+dim repr 1
+dim room 1
+dim rot 1
+dim rot group 1
+dim sc 1
+dim screen 1
+dim search 1
+dim shadow 1
+dim shadow map 1
+dim shadow spac 1
+dim sign 1
+dim sign featur 1
+dim simp 1
+dim simpl 1
+dim sl 1
+dim sld 1
+dim sld resolut 1
+dim smooth 1
+dim smooth compact 1
+dim spac 8
+dim spac dk 1
+dim spac dm 1
+dim spac invit 1
+dim spac nam 1
+dim spher 1
+dim spreadsh 1
+dim step 1
+dim structur 4
+dim structur motif 1
+dim subspac 1
+dim suiv 1
+dim suiv laquel 1
+dim system 1
+dim that dep 1
+dim to rel 1
+dim to unfold 1
+dim tool 1
+dim tr 1
+dim tr repr 1
+dim tridimensionnel 1
+dim trunk 1
+dim trunk group 1
+dim valu 1
+dim var 1
+dim variabl 1
+dim vi le 1
+dim visu 1
+dim visu paradigm 1
+dim wa greater 1
+dim wavel 1
+dim wavel correspon 1
+dim widg 1
+dim world 1
+dim. 2
+dimac 5
+dimac benchmark 1
+dimac benchmark forml 1
+dimac benchmark problem 1
+dimac challeng 1
+dimac challeng satisf 1
+dimac datab 1
+dimac implem 1
+dimac implem challeng 1
+dimac induc 1
+dimac induc infer 1
+dimac ser 2
+dimac techn 1
+dimac techn report 1
+dimaginer 1
+dimaginer de 1
+dimaginer de syst 1
+dimin 9
+dimin by welldefin 1
+dimin degr 1
+dimin for larger 1
+dimin lik super 1
+dimin perform 1
+dimin suff 1
+dimin th bandwidth 1
+dimin th effect 1
+dimin th expr 1
+dimin th problem 1
+dimin to zer 1
+diminu 3
+diminu consid 1
+diminu consid erabl 1
+diminu ee 1
+diminu ee de 1
+diminu le 2
+diminu le acc 1
+diminu le nombr 1
+diminu si 1
+diminu si la 1
+diminuer 3
+diminuer aus 1
+diminuer aus le 1
+diminuer encor 1
+diminuer encor la 1
+diminuer la 2
+diminuer la consom 1
+diminuer la temp 1
+diminuer le 1
+diminuer le nombr 1
+diminut 1
+diminut de 1
+diminut de acc 1
+diminut de localit 1
+dimitr 3
+dimitr stiliad 1
+dimitroyan 1
+dimpl 2
+dimpl em 2
+dimpl em de 1
+dimpl em diff 1
+dimpl em dun 1
+dimpl em li 1
+dimpl em requ 1
+dimpl ementer 1
+dimpl ementer la 1
+dimpl ementer le 1
+dimpl ementer lunif 1
+dimpl ementer un 1
+dimport 1
+dimport fuit 1
+dimport fuit de 1
+dimposer 2
+dimposer qu 1
+dimposer qu son 1
+dimposer un 1
+dimposer un contraint 1
+din 2
+din dout 1
+din egalit 1
+din egalit es 1
+din vout 1
+din vout dout 1
+dinamyc 1
+dinamyc detect 1
+dinc 2
+dinc ar 1
+dinc avant 1
+dinc du 1
+dinc sur 1
+dinc sur la 1
+dincb 3
+dincertitud 1
+dincertitud sur 1
+dincertitud sur la 1
+dinclur 1
+dinclur le 1
+dinclur le support 1
+dinclur un champ 1
+dincr 1
+dincr ement 1
+dincr ement de 1
+dind 3
+dind assur 1
+dind congru 1
+dind de 2
+dind de dissimilarit 1
+dind de la 1
+dind et int 1
+dind et le 1
+dind i0 1
+dind inf 1
+dind inf erieur 1
+dind l est 1
+dind plus sophistiqu 1
+dind simpl 1
+dind sp 1
+dind sp ec 1
+dind sup 1
+dind sup erieur 1
+dind switch 1
+dind util 1
+dindexer 1
+dindexer sur 1
+dindiquer 1
+dindiquer statiqu 1
+dindirect 1
+dindirect en 1
+dindirect en ca 1
+dindirect entr 1
+dindirect entr la 1
+dindividus 1
+dindividus aux 1
+dindividus aux processeur 1
+dindividus ch 1
+dindividus ch in 1
+dindividus parent 1
+dindividus parent tir 1
+dinduir 1
+dinduir un grand 1
+dinesh 1
+dinesh katiyar 1
+dinfluencer 1
+dinfluencer n egativ 1
+dinform 2
+dinform dan 1
+dinform entr 1
+dinform entr point 1
+dinform lor 1
+dinform lor dic 1
+dinform suppl 1
+dinform suppl ementair 1
+dinitz 1
+dinitz and d.r 1
+dinst 1
+dinst de 1
+dinst de ce 1
+dinstanc 1
+dinstanc com 1
+dinstanc de 1
+dinstanc de argum 1
+dinstanc de lanc 1
+dinstanc est 1
+dinstr 1
+dinstr a la 1
+dinstruc 3
+dinstruc appropr 1
+dinstruc appropr ee 1
+dinstruc compil 1
+dinstruc compil ee 1
+dinstruc conduit 1
+dinstruc correspon 1
+dinstruc correspon peuv 1
+dinstruc d efin 1
+dinstruc d enot 1
+dinstruc de 1
+dinstruc de contr 1
+dinstruc de typ 1
+dinstruc du 1
+dinstruc du program 1
+dinstruc en 1
+dinstruc en mod 1
+dinstruc est 1
+dinstruc est sp 1
+dinstruc et de 1
+dinstruc et dic 1
+dinstruc et du 1
+dinstruc et le 1
+dinstruc et par 1
+dinstruc et plusieur 1
+dinstruc ex 1
+dinstruc ex ecut 1
+dinstruc instruc 1
+dinstruc manipl 1
+dinstruc manipl ce 1
+dinstruc multipl 1
+dinstruc neck 1
+dinstruc par 1
+dinstruc par echec 1
+dinstruc perm 1
+dinstruc perm de 1
+dinstruc peuv 1
+dinstruc peuv etr 1
+dinstruc point 1
+dinstruc point de 1
+dinstruc put 1
+dinstruc put valu 1
+dinstruc sont 1
+dinstruc sont alor 1
+dinstruc sp 1
+dinstruc sp ec 1
+dinstruc suppl 1
+dinstruc suppl ementair 1
+dinstruc try 1
+dinstruc util 1
+dint 2
+dint egrer 1
+dint egrer ce 1
+dint er 2
+dintel 2
+dintel appart 1
+dintel qu 1
+dintel qu est 1
+dintellig 1
+dintellig artif 1
+dintellig artif percept 1
+dinteract 1
+dinteract quil 1
+dinteract quil imp 1
+dinteragir 1
+dinteragir avec 1
+dinteragir avec le 1
+dinterconnec 2
+dinterconnec de 1
+dinterconnec de la 1
+dinterconnec quelquef 1
+dinterconnec quelquef dynamiqu 1
+dinterconnec util 1
+dinterconnec util es 1
+dinterpr 2
+dinterpr eter 1
+dinterpr tat 1
+dintersect 1
+dintersect non 1
+dintersect non vid 1
+dintersect vid 1
+dinterv 2
+dinterv de 1
+dinterv de algorithm 1
+dinterv suff 1
+dinterv suff pour 1
+dintroduir 2
+dintroduir ain 1
+dintroduir ain de 1
+dintroduir de 1
+dintroduir de co 1
+dintroduir le 1
+dintroduir le concept 1
+dintroduir un 1
+dintroduir un architectur 1
+dintroduir un nouvel 1
+dinv 1
+dinv au 1
+dinv au niveau 1
+dinv est 1
+dinv est qu 1
+dinv et regroup 1
+dinv la 1
+dinv la dur 1
+dinv qu 1
+dinv qu sont 1
+dinv sur 1
+dinv sur ecritur 1
+dinvalider 1
+dinvalider le 1
+dinvalider le drapeau 1
+dinvalider superficiel 1
+dinvar 1
+dinvar n air 1
+dinver 1
+dinver ent 1
+dinverser 1
+dinverser ensuit 1
+dinverser ensuit la 1
+dinverser le 1
+dinverser le deux 1
+dinvestig 1
+dinvestig po qu 1
+dioecil 1
+dioecil con 1
+dioecil de 1
+dioecil de concevoir 1
+dioecult 1
+dioecult in 3d 1
+dioeer 1
+dioeer amin 1
+dioeer amin ac 1
+dioeer character 1
+dioeer geometer 1
+dioeer observ 1
+dioeer organ 1
+dioeer start 1
+dioeer start point 1
+dioeer typ 1
+dion 1
+dioph 2
+dioph equ 1
+dioph suiv 1
+dip 1
+dipartim 3
+dipartim di 3
+dipartim di inform 3
+diphthong 1
+diphthong com 1
+diphthong com follow 1
+dipl 1
+diplom 1
+diplom th 1
+diplomarbeit 1
+dir 4
+dir a de 1
+dir ain 1
+dir ain lincertitud 1
+dir au 1
+dir au moin 1
+dir au prochain 1
+dir cherch 1
+dir com 1
+dir com un 1
+dir cop 1
+dir cop sur 1
+dir dan 1
+dir dan le 1
+dir de 2
+dir de acquisit 1
+dir de ne 1
+dir de trouver 1
+dir don 1
+dir don ladr 1
+dir dont le 1
+dir dun 2
+dir dun term 1
+dir dun unif 1
+dir dun valeur 1
+dir ent 1
+dir indiqu 1
+dir indiqu com 1
+dir l etat 1
+dir la 1
+dir la var 1
+dir le 1
+dir le champ 1
+dir le instruc 1
+dir le nombr 1
+dir le register 1
+dir le tr 1
+dir lensembl 1
+dir lensembl de 1
+dir lim 1
+dir lim ee 1
+dir linform 1
+dir linform qu 1
+dir lor 1
+dir lor de 1
+dir qu 2
+dir qu ce 1
+dir qu la 1
+dir qu le 2
+dir qu neffectu 1
+dir qu rn 1
+dir qu si 1
+dir qu son 1
+dir qu utiliser 1
+dir quand 1
+dir quand superficiel 1
+dir quaucun 1
+dir quaucun ne 1
+dir quel 1
+dir quel illustr 1
+dir quil 3
+dir quil est 1
+dir quil faut 1
+dir repr 1
+dir repr esent 1
+dir san elag 1
+dir si 3
+dir si jcj 1
+dir si le 2
+dir sont 1
+dir sont activ 1
+dir suiv 1
+dir suiv le 1
+dir un 1
+dir un architectur 1
+dir un inst 1
+dir un pil 1
+dir un repr 1
+direct 95
+direct a la 1
+direct a spec 1
+direct a templ 1
+direct a1 1
+direct acc 2
+direct acc eder 1
+direct acycl 4
+direct acycl compl 1
+direct acycl graph 3
+direct affect 1
+direct affect ee 1
+direct al serv 1
+direct alter 1
+direct an explan 1
+direct an ind 1
+direct analog 2
+direct and acceler 1
+direct and conclus 1
+direct and dist 1
+direct and indirect 3
+direct and ordin 1
+direct and strict 1
+direct and thus 1
+direct appar 1
+direct appar ee 1
+direct appl 1
+direct applicabl 1
+direct applicabl au 1
+direct approach 1
+direct ar interpr 1
+direct ar mad 1
+direct argum 1
+direct argum using 1
+direct au 1
+direct au dern 1
+direct ba 3
+direct ba cach 2
+direct ba schem 1
+direct backtrack 1
+direct between adjac 1
+direct by induc 1
+direct ca 1
+direct cach 1
+direct cach manag 1
+direct calcl 1
+direct cl 1
+direct co 1
+direct commun 2
+direct commun network 1
+direct commun path 1
+direct comparison 1
+direct compil 1
+direct con 1
+direct conect 1
+direct configur 1
+direct configur cl 1
+direct conjugu 1
+direct conjugu ee 1
+direct connect 2
+direct connect es 1
+direct consequ 3
+direct contain 1
+direct contain fl 1
+direct correspon 2
+direct correspon regard 1
+direct counterpart 1
+direct cs 1
+direct cs 2nwg 1
+direct csg 1
+direct csg render 1
+direct d xp 1
+direct d1 1
+direct dan 1
+direct dan la 1
+direct de 3
+direct de ce 2
+direct de la 2
+direct de lespac 1
+direct de localit 1
+direct de pag 1
+direct de recherch 1
+direct de s1 1
+direct deduc 1
+direct def 1
+direct dict 1
+direct direct 1
+direct direct cl 1
+direct direct configur 1
+direct direct network 1
+direct direct nonblock 1
+direct direct switch 1
+direct direct topolog 1
+direct direct typ 1
+direct don 1
+direct don ee 1
+direct dot 1
+direct dot lin 1
+direct du 3
+direct du contr 1
+direct du dern 1
+direct du processus 1
+direct du th 1
+direct dur rollback 1
+direct edg 6
+direct edg ad 1
+direct edg eman 1
+direct edg en 1
+direct edg gener 1
+direct edg go 1
+direct edg hr 1
+direct edg ht 1
+direct edg hv 1
+direct edg hw 1
+direct effect 5
+direct effect grant 1
+direct empl 1
+direct en 1
+direct en effectu 1
+direct entr 2
+direct entr correspon 1
+direct entr pertain 1
+direct est 2
+direct est d1 1
+direct est le 1
+direct et compl 1
+direct etr 1
+direct etr fourn 1
+direct etr mi 1
+direct evolut 1
+direct ex 1
+direct ex ecut 1
+direct exam 1
+direct exper 1
+direct for ai 1
+direct for developm 1
+direct for further 1
+direct for futur 5
+direct for research 1
+direct funct 1
+direct gener 2
+direct graph 6
+direct graph defin 1
+direct graph gd 1
+direct hierarch 1
+direct imag 1
+direct impact 1
+direct implem 1
+direct in architectur 1
+direct in commun 1
+direct in object 1
+direct in parallel 1
+direct in shap 1
+direct increm 1
+direct influ 2
+direct init 1
+direct init d1 1
+direct initarg 1
+direct initarg inh 1
+direct inspect 1
+direct inspir 1
+direct inst 1
+direct inter 1
+direct inter direct 1
+direct interconnect 1
+direct interconnect pattern 1
+direct interdirect 1
+direct interdirect topolog 1
+direct interest 1
+direct interv 1
+direct involut 1
+direct is comput 1
+direct is conv 1
+direct is equiv 1
+direct is proc 1
+direct issus 1
+direct issus de 1
+direct k ary 2
+direct knowledg 1
+direct knowledg transfer 1
+direct la 2
+direct la concat 1
+direct la configur 1
+direct la fonct 1
+direct la form 1
+direct label 1
+direct label acycl 1
+direct lattribut 1
+direct lattribut dan 1
+direct le 1
+direct learn 1
+direct li 3
+direct li ee 2
+direct lin 2
+direct lin eair 1
+direct link 3
+direct link avail 1
+direct lunif 1
+direct lunif de 1
+direct manipl 2
+direct manipl dialog 1
+direct manipl interfac 1
+direct manipl user 1
+direct manipuler 1
+direct manipuler le 1
+direct manner 2
+direct map 2
+direct map cach 1
+direct map dat 1
+direct master 1
+direct master loc 1
+direct memor 3
+direct memor acc 1
+direct method 1
+direct method involut 1
+direct mont 1
+direct mont carl 1
+direct multigraph 1
+direct multigraph repr 1
+direct mut 1
+direct neighbor 1
+direct network 4
+direct network impl 1
+direct nonblock 1
+direct nonblock network 1
+direct object 1
+direct of incr 2
+direct of parallel 1
+direct of real 1
+direct of search 1
+direct of spec 1
+direct of visu 1
+direct opposit 1
+direct or dynam 1
+direct or indirect 1
+direct or inherit 1
+direct orthogon 1
+direct ou 2
+direct ou indirect 2
+direct outg 1
+direct outg traff 1
+direct pa 1
+direct pa ee 1
+direct par 1
+direct par laquel 1
+direct parameter 1
+direct parameter pa 1
+direct part 1
+direct part privileg 1
+direct path 3
+direct path wh 1
+direct pd 1
+direct pot 1
+direct pr 1
+direct pr esent 1
+direct privil 1
+direct privil eg 1
+direct privileg 1
+direct privileg defin 1
+direct privileg pair 1
+direct privileg se 1
+direct proc 1
+direct proof 1
+direct proof search 1
+direct proper 1
+direct pub 5
+direct pub mar 1
+direct pub publ 2
+direct pub softwar 1
+direct pub svrc 1
+direct qu 1
+direct qu suit 1
+direct quun 1
+direct quun saut 1
+direct rang 1
+direct read 1
+direct read algorithm 1
+direct relationship 2
+direct sampl 1
+direct schedl 1
+direct schedl csvm 1
+direct schem 1
+direct se 1
+direct search 3
+direct search bin 1
+direct search strateg 1
+direct self 1
+direct self loop 1
+direct selfmut 1
+direct separ 1
+direct sequ 1
+direct seront 1
+direct seront prospect 1
+direct serv 1
+direct siml 1
+direct slot 1
+direct slot descript 1
+direct slot specif 1
+direct solut 1
+direct solver 1
+direct sourc 1
+direct sourc cod 1
+direct span 1
+direct span tr 1
+direct spat 1
+direct spat search 1
+direct specif 1
+direct stat 2
+direct stat strateg 1
+direct strateg 1
+direct structur 1
+direct structur tak 1
+direct subcl 1
+direct subcl rel 1
+direct succ 1
+direct sum 1
+direct sum f1 1
+direct supercl 1
+direct supercl direct 1
+direct sur 1
+direct sur le 1
+direct switch 1
+direct switch configur 1
+direct system 2
+direct teach 1
+direct teach forc 1
+direct term 1
+direct term rewrit 1
+direct th edg 1
+direct th learn 1
+direct th search 2
+direct th system 1
+direct to 24x80 1
+direct to find 1
+direct to specif 1
+direct topolog 1
+direct topolog cl 1
+direct tr 2
+direct tr edg 1
+direct transl 1
+direct transl refer 1
+direct typ 1
+direct un foncteur 1
+direct user 1
+direct user manipl 1
+direct util 1
+direct vect 1
+direct ver 2
+direct ver la 1
+direct wa con 1
+direct way using 1
+direct we refer 1
+direct wh 1
+direct wh form 1
+direct whil acknowledg 1
+directeur 1
+directeur de 1
+directeur de lir 1
+directeur de th 1
+directeur dun 1
+directiv 8
+directiv allow 1
+directiv de 1
+directiv de compil 1
+directiv defin 1
+directiv follow 1
+directiv in ba 1
+directiv is giv 1
+directiv that allow 1
+directiv to determin 1
+directmap 1
+directoryfil 1
+directr 1
+directr qu 1
+directr qu devr 1
+direntr 1
+dirichl 1
+dirichl distribut 1
+dirig 1
+dirig e par 1
+diriger 1
+diriger ce 1
+diriger ce th 1
+diron 1
+diron de 1
+diron de typ 1
+diron destructiv 1
+diron qu 1
+diron qu de 1
+dirt 2
+dirt bit 1
+dirt bit ind 1
+dirt upd 1
+disabl 6
+disabl act 1
+disabl backtrack 1
+disabl menu 1
+disabl menu item 1
+disabl restrict 1
+disabl restrict instead 1
+disabl restrict mean 1
+disabl se 1
+disabl th method 1
+disabl to execut 1
+disadv 20
+disadv allow 1
+disadv allow design 1
+disadv ar assoc 1
+disadv compar 2
+disadv du 1
+disadv for dent 1
+disadv of aspect 1
+disadv of inherit 1
+disadv of neur 1
+disadv of structur 1
+disadv of stud 1
+disadv you feel 1
+disagreed 1
+disallow 2
+disallow answer 1
+disambig 1
+disambigu 2
+disappear 3
+disappoint 2
+disappoint low 1
+disappoint low amount 1
+disappoint scal 1
+disappoint scal prospect 1
+disassembl 1
+disassoc 1
+disassoc in term 1
+disastr 2
+disastr situ 1
+disastr solut 1
+disc 109
+disc a client 1
+disc a comparison 1
+disc a cover 1
+disc a fault 1
+disc a novel 1
+disc a number 1
+disc a simpl 1
+disc abov con 1
+disc addit 1
+disc addit improv 1
+disc adv 1
+disc an ext 1
+disc and an 1
+disc and com 1
+disc and compar 1
+disc and conclus 2
+disc and definit 1
+disc and feedback 1
+disc and futur 2
+disc and model 1
+disc and recom 1
+disc appear 1
+disc ba 2
+disc brief 2
+disc by aror 1
+disc by compar 1
+disc by liepin 1
+disc by smith 1
+disc ch 1
+disc cur 2
+disc cur tren 2
+disc differ network 1
+disc earl 4
+disc el 1
+disc elsewh 1
+disc even allow 1
+disc eventhough 1
+disc eventhough hierarch 1
+disc experim 1
+disc experim result 1
+disc explicit 1
+disc feedback 1
+disc feedback control 1
+disc follow result 1
+disc four st 1
+disc furent 1
+disc furent fructueus 1
+disc futur 1
+disc futur work 1
+disc group 1
+disc ha foc 1
+disc ha implicit 1
+disc how asynchron 1
+disc import consider 2
+disc in com 1
+disc in connect 1
+disc in detail 4
+disc in exampl 1
+disc in lem 1
+disc in length 1
+disc in masood 1
+disc in sec 3
+disc in sect 23
+disc in xv.4 1
+disc inherit 1
+disc is random 1
+disc issu 2
+disc issu rel 2
+disc lower 1
+disc lower bound 1
+disc mar 1
+disc mar rel 1
+disc mean 1
+disc mean squar 1
+disc methodolog 2
+disc methodolog achief 2
+disc model 1
+disc model siml 1
+disc mor prec 1
+disc next illustr 1
+disc numer 1
+disc of fact 1
+disc of fair 1
+disc of futur 2
+disc of issu 1
+disc of lim 1
+disc of parod 1
+disc of perform 1
+disc of rel 1
+disc of uniform 1
+disc of why 1
+disc on custom 1
+disc onl inequ 1
+disc ont 1
+disc other benefit 1
+disc other eff 1
+disc other method 1
+disc other neur 1
+disc our algorithm 1
+disc our approach 1
+disc our dec 1
+disc our prop 1
+disc our result 1
+disc our system 1
+disc parameter 1
+disc point 1
+disc pr 1
+disc pr ec 1
+disc prev 2
+disc print 1
+disc sect 1
+disc sever issu 1
+disc show 1
+disc simpl 1
+disc som issu 1
+disc som lingu 1
+disc som reason 1
+disc som theor 1
+disc stat 1
+disc stat aspect 1
+disc th adv 3
+disc th approach 2
+disc th architectur 1
+disc th ba 1
+disc th behavior 1
+disc th bound 1
+disc th brief 2
+disc th cl 2
+disc th compl 1
+disc th compon 1
+disc th concept 1
+disc th conclus 1
+disc th dat 1
+disc th decl 1
+disc th design 1
+disc th effect 1
+disc th evolut 1
+disc th exampl 1
+disc th experim 1
+disc th featur 1
+disc th gener 4
+disc th id 1
+disc th impl 1
+disc th implem 1
+disc th issu 3
+disc th list 1
+disc th load 1
+disc th main 1
+disc th me 1
+disc th mechan 1
+disc th modl 1
+disc th observ 1
+disc th pack 1
+disc th perform 1
+disc th pr 1
+disc th problem 2
+disc th proc 1
+disc th protocol 1
+disc th rat 1
+disc th rel 1
+disc th relationship 2
+disc th relev 1
+disc th result 5
+disc th rl 1
+disc th simplif 1
+disc th specif 2
+disc th specl 1
+disc th status 1
+disc th strength 1
+disc th subtl 1
+disc th task 1
+disc th transform 1
+disc th tren 2
+disc th underl 3
+disc th unexplor 1
+disc th way 1
+disc that follow 1
+disc that graph 1
+disc thr improv 1
+disc thr transform 1
+disc thr var 1
+disc thus 1
+disc to mak 1
+disc to mlp 1
+disc tw addit 1
+disc tw common 2
+disc tw ind 1
+disc tw main 1
+disc tw pot 1
+disc tw techniqu 1
+disc us 2
+disc us issu 1
+disc var 4
+disc var featur 1
+disc var issu 1
+disc var method 1
+disc var recov 1
+disc we assum 1
+disc we ch 1
+disc why 1
+disc why reason 1
+disc with hirosh 1
+disc with particip 1
+disc with rober 1
+disc with sanjeev 1
+disc with ulf 1
+disc.anu.edu.au 1
+discard 20
+discard a tempor 1
+discard after 1
+discard after du 1
+discard al inform 1
+discard an oper 1
+discard dat 1
+discard dat rectangl 1
+discard du 1
+discard it privileg 1
+discard record 1
+discard record older 1
+discard spec leav 1
+discard th edg 1
+discard th hist 1
+discard th liter 1
+discard th neg 1
+discard th old 1
+discard th on 1
+discard th rest 1
+discard th specif 1
+discard th tempor 1
+discard th us 1
+discern 4
+discern effect 1
+discern improv 1
+discharg 2
+discharg act 1
+discharg th proof 1
+discharg th subproof 1
+discipl 7
+discipl and narrow 1
+discipl ar known 1
+discipl at tim 1
+discipl for lim 1
+discipl is respect 1
+discipl that put 1
+discipl which adjust 1
+disciplin 2
+disciplin us 1
+disconcer 1
+disconcer proper 1
+disconnect 8
+disconnect by link 1
+disconnect compon 1
+disconnect nod 1
+disconnect subgraph 1
+disconnect subgraph separ 1
+discontin 1
+discontin arrow 1
+discontinu 5
+discontinu du 1
+discontinu lin 1
+discontinu sur 1
+discontinu sur le 1
+discount 2
+discount fact 1
+discount fact discount 1
+discount th system 1
+discour 4
+discour incoh 1
+discour modl 1
+discour strateg 1
+discour structur 1
+discour structur user 1
+discour top 1
+discourag 2
+discourag sinc su 1
+discov 4
+discov system 1
+discov that perm 1
+discover 15
+discover a ser 1
+discover and disc 1
+discover certain heur 1
+discover control 1
+discover control dep 1
+discover heur 1
+discover new way 1
+discover on docum 1
+discover opin 1
+discover opin simil 1
+discover pragm 1
+discover pragm maint 1
+discover problem 2
+discover problem solut 1
+discover sever prom 1
+discover th destruc 1
+discover th structur 1
+discover that acc 1
+discover that var 1
+discover to intersect 1
+discr 39
+discr algorithm 1
+discr and comput 2
+discr and continu 1
+discr appl 4
+discr appl mathemat 4
+discr co 2
+discr co transform 2
+discr collect 1
+discr complec 1
+discr complec theor 1
+discr constraint 1
+discr constraint satisf 1
+discr de 1
+discr de univer 1
+discr domain 1
+discr domain pr 1
+discr es 3
+discr es est 1
+discr event 3
+discr event modl 1
+discr event network 1
+discr event siml 3
+discr exact 1
+discr exact univer 1
+discr grid 1
+discr grid wh 1
+discr input 1
+discr lead 1
+discr lin 1
+discr lin order 1
+discr math 2
+discr mathemat 4
+discr mesh 1
+discr method 2
+discr order 1
+discr order expr 1
+discr ordin 1
+discr prob 1
+discr prob distribut 1
+discr problem 1
+discr problem involut 1
+discr repr 1
+discr sobolev 1
+discr sobolev spac 1
+discr te 1
+discr te de 1
+discr th object 1
+discr tim 2
+discr tim oper 1
+discr tim step 1
+discr tiser 1
+discr tiser ce 1
+discr univer 1
+discr variabl 2
+discr variabl repr 1
+discr variabl.1 1
+discr wavel 1
+discr wavel transform 1
+discrep 3
+discrep may ec 1
+discrim 5
+discrim color 1
+discrim color actu 1
+discrim is shown 1
+discrim mean 1
+discrim mean featur 1
+discrim procedur 1
+discrim procedur describ 1
+discrim result 1
+discrim system 2
+discrim techniqu 1
+discrim th cod 1
+discrim whether resourc 1
+discrimin 4
+discrimin an 1
+discrimin an techniqu 1
+discrimin differ color 1
+discrimin funct 2
+discrimin funct gener 1
+discrimin funct gf 1
+discrimin funct ind 1
+discrimin funct ment 1
+discut 3
+discut ee 1
+discut es 1
+discut quest 1
+discut quest es 1
+disequ 1
+disestabl 1
+disingu 1
+disintegr 1
+disintegr of discour 1
+disj 1
+disj1 1
+disj2 1
+disjoint 30
+disjoint addr 1
+disjoint addr spac 1
+disjoint and contradict 1
+disjoint and nonempt 1
+disjoint bind 1
+disjoint bind environm 1
+disjoint chain 1
+disjoint condit 1
+disjoint condit c1 1
+disjoint connect 2
+disjoint cover 1
+disjoint disjunct 1
+disjoint et chacun 1
+disjoint et fin 1
+disjoint finit 1
+disjoint finit se 1
+disjoint from con 1
+disjoint from g0 1
+disjoint from nl 1
+disjoint intersect 1
+disjoint intersect segm 1
+disjoint is clear 1
+disjoint natur 1
+disjoint oper 1
+disjoint pair 2
+disjoint path 2
+disjoint posit 1
+disjoint qu 1
+disjoint qu se 1
+disjoint resourc 1
+disjoint resourc commut 1
+disjoint ri 1
+disjoint se 3
+disjoint sub 4
+disjoint sub v1 1
+disjoint subtr 1
+disjoint triangl 1
+disjointg 1
+disjonct 1
+disjonct correspondrait 1
+disjonct de 1
+disjonct de conjonct 1
+disjonct en 1
+disjonct en lign 1
+disjonct et conjonct 1
+disjonct et construc 1
+disjonct et de 1
+disjonct et quun 1
+disjonct ou 1
+disjonct ou de 1
+disjonct ou un 1
+disjonct plut 1
+disjonct plut ot 1
+disjonct qu 1
+disjonct qu aurait 1
+disjonct rencontr 1
+disjonct rencontr ee 1
+disjonct sous 1
+disjonct sous form 1
+disjunct 7
+disjunct and neg 1
+disjunct constraint 2
+disjunct correspon 1
+disjunct form 1
+disjunct goal 1
+disjunct introduc 1
+disjunct norm 1
+disjunct norm form 1
+disjunct of conjunct 1
+disjunct of lin 1
+disjunct of liter 1
+disjunct pr 1
+disjunct propag 1
+disjunct propag respect 1
+disk 17
+disk acc 2
+disk acc each.in 1
+disk acc grow 1
+disk acc tim 1
+disk algorithm 1
+disk alloc 1
+disk and cpus 1
+disk and ship 1
+disk and track 1
+disk and writ 1
+disk ar 2
+disk ar faster 1
+disk ar ma 1
+disk ar number 1
+disk ar repr 1
+disk ar synchron 1
+disk ar writ 1
+disk architectur 1
+disk arm 1
+disk arm io 1
+disk as follow 1
+disk at run 1
+disk block 1
+disk block abstract 1
+disk block bound 1
+disk by d1 1
+disk can simultan 1
+disk cap 1
+disk cl 1
+disk collect 1
+disk concur 1
+disk configur 1
+disk control 1
+disk crash 1
+disk d1 1
+disk dk 1
+disk dmp 1
+disk driv 1
+disk effect 1
+disk effect reduc 1
+disk en 1
+disk en en 1
+disk fail 1
+disk failur 1
+disk fault 1
+disk fr 1
+disk head 1
+disk head num 1
+disk in cluster 1
+disk int memor 1
+disk is assoc 1
+disk is control 1
+disk is partit 1
+disk is specif 1
+disk last disk 1
+disk le desktop 1
+disk loc 1
+disk model 1
+disk modl 1
+disk modl alloc 1
+disk of sit 1
+disk oper 1
+disk oper indep 1
+disk or network 1
+disk pag 5
+disk pag contain 1
+disk pag fault 1
+disk pag loc 1
+disk pag number 1
+disk pag pa 1
+disk pag skip 1
+disk plac 1
+disk plus cpu 1
+disk pointer 1
+disk rot 1
+disk rot num 1
+disk sect 1
+disk sect length 1
+disk shar 1
+disk spac 3
+disk speed 1
+disk st 1
+disk strip 1
+disk system 2
+disk system using 1
+disk th pointer 1
+disk that compr 1
+disk track 1
+disk track pointer 1
+disk wh 1
+disk with dat 1
+disk with db 1
+disk writ 1
+diskbuffer 1
+diskbuffer cl 1
+diskr 2
+diskr siml 1
+diskr siml prinzip 1
+dislodg 1
+dism 2
+dism th featur 1
+disorder 3
+disorder and abstract 1
+disorder nonmonot 1
+disotrop 1
+disp 7
+disp alor 1
+disp alor din 1
+disp d esorm 1
+disp de 1
+disp de protocol 1
+disp dun 2
+disp dun coh 1
+disp dun fonct 1
+disp la 1
+disp la plupart 1
+disp of arbitr 1
+disp thereb 1
+disp thereb enabl 1
+disp without further 1
+dispar 7
+dispar de 1
+dispar de la 1
+dispar fact 2
+dispar itr 1
+dispar itr tous 1
+dispar object 1
+dispar object repr 1
+dispar system 1
+dispar system compon 1
+dispar t du 1
+dispar techniqu 1
+dispar tr 1
+dispar tr de 1
+dispar typ 1
+disparit 3
+disparit e entr 1
+disparit es 1
+disparit es sont 1
+disparu 1
+dispatch 8
+dispatch act 1
+dispatch act cl 1
+dispatch act inherit 1
+dispatch act shar 1
+dispatch algorithm 1
+dispatch and environm 1
+dispatch and mail 1
+dispatch and mutu 1
+dispatch ar describ 1
+dispatch by start 1
+dispatch c dispatch 1
+dispatch csvm 1
+dispatch csvm exclus 1
+dispatch en 1
+dispatch en oper 1
+dispatch expr 1
+dispatch funct 1
+dispatch in pcl 1
+dispatch is pur 1
+dispatch loop 1
+dispatch mechan 1
+dispatch oper 2
+dispatch oper dep 1
+dispatch oper map 1
+dispatch oper thus 1
+dispatch prior 1
+dispatch recv 1
+dispatch rl 1
+dispatch schem 1
+dispatch sen 1
+dispatch strateg 1
+dispatch tabl 1
+dispatch th st 1
+dispatch when appl 1
+disper 4
+disper ar nec 1
+disper es 1
+disper es sur 1
+disper of funct 1
+disper of power 1
+disper oper 1
+dispid 1
+dispid to invoc 1
+displ 23
+displ al avail 1
+displ an html 1
+displ and accept 1
+displ and freez 1
+displ as group 1
+displ border 1
+displ by click 1
+displ comb 1
+displ compon 2
+displ compon inst 1
+displ effect 1
+displ effect input 1
+displ entr 1
+displ error 1
+displ error me 1
+displ execut 1
+displ execut tim 1
+displ imag 1
+displ in bal 1
+displ in figur 2
+displ in tabl 1
+displ is divid 1
+displ is dynam 1
+displ loc 1
+displ loc spac 1
+displ manager 1
+displ manager label 1
+displ mor inform 1
+displ of surfac 1
+displ plan 1
+displ primitiv 1
+displ result 1
+displ sol 1
+displ system 1
+displ th commun 1
+displ th comparison 1
+displ th correspon 2
+displ th docum 1
+displ th expect 1
+displ th fl 1
+displ th init 1
+displ th near 1
+displ th parameter 1
+displ th perform 1
+displ th result 1
+displ th spar 1
+displ th valu 2
+displ to cr 1
+displ to work 1
+displ unit 1
+displ var 1
+displ var tabl 1
+displac 3
+displac ar 1
+displac of rigid 1
+displac or simp 1
+displaydev 1
+displaydev extract 1
+displaydev extract developerworldr 1
+dispon 4
+dispon a lentr 1
+dispon au 1
+dispon au niveau 1
+dispon dan 2
+dispon dan le 2
+dispon du 1
+dispon du term 1
+dispon en 2
+dispon en tant 1
+dispon et de 1
+dispon ve 1
+disponibilit 2
+disponibilit e de 1
+disponibilit e dinform 1
+disponibl 3
+disponibl dan 1
+disponibl dan le 1
+disponibl dur 1
+disponibl dur tout 1
+disponibl est 1
+disponibl mat 1
+disponibl mat eriel 1
+disposer 1
+disposer de 1
+disposer de deux 1
+disposit 4
+disposit a par 1
+disposit de 2
+disposit de outil 1
+disposit de plusieur 1
+disposit du 1
+disposit du programmeur 1
+disposit le 1
+disposit le fonct 1
+disposit lor 1
+disposit lor de 1
+disposit of object 1
+dispositif 2
+dispositif de 1
+dispositif de mvp 1
+dispositif electroniqu 1
+dispositif electroniqu tel 1
+disproport 2
+disproport number 1
+disprov 1
+disprov th nec 1
+disregard 7
+disregard th abandon 1
+disregard th ca 1
+disregard th edg 1
+disregard th non 1
+disregard th po 1
+disregard th test 1
+disrupt 3
+disrupt build 1
+disrupt build block 1
+disrupt th serv 1
+dissatisf 1
+dissect 4
+dissect algorithm 1
+dissect and ext 1
+dissect of reg 1
+dissect order 1
+dissem 5
+dissem mechan 1
+dissem of inform 1
+dissem protocol 1
+dissembl 1
+dissemin 3
+dissemin continu 1
+dissemin continu upd 1
+dissemin pivot 1
+dissemin regl 1
+disser 7
+disser and techn 1
+disser in prepar 1
+dissimil 1
+dissimil threshold 1
+dissimil threshold level 1
+dissimilarit 1
+dissimilarit e de 1
+dissimilarit e entr 1
+dissimilarit e pour 1
+dissimilarit es 1
+dissimilarit es ou 1
+dissip 1
+dissip short period 1
+dissolut 1
+dissolut detect 1
+dist 46
+dist algorithm 1
+dist allow 1
+dist and assign 1
+dist and mov 1
+dist and using 1
+dist ar allow 1
+dist as defin 1
+dist assoc 1
+dist au 1
+dist au gestionnair 1
+dist au propr 1
+dist between dat 1
+dist between intercept 1
+dist between particl 1
+dist between proc 1
+dist between red 1
+dist between user 1
+dist between ver 1
+dist calcl 1
+dist chang 1
+dist chang dun 1
+dist commun 1
+dist commun perform 1
+dist constraint 1
+dist constraint obtain 1
+dist constraint viol 1
+dist dan 1
+dist dan le 1
+dist de 3
+dist de ham 1
+dist de mahalanob 1
+dist du 1
+dist du web 1
+dist dun 1
+dist dun processeur 1
+dist educ 1
+dist eff 1
+dist entr 3
+dist entr ce 1
+dist entr courb 1
+dist entr la 1
+dist entr le 2
+dist entr primitiv 1
+dist est 1
+dist fic 1
+dist fic de 1
+dist for attribut 1
+dist from dat 1
+dist funct 3
+dist funct appropr 1
+dist funct ba 1
+dist funct defin 2
+dist funct describ 1
+dist funct hvdm 1
+dist gestionnair 1
+dist gestionnair lecteur 1
+dist goal 1
+dist goal ment 1
+dist imag 1
+dist in den 1
+dist in figur 1
+dist in meter 1
+dist in spar 1
+dist ind 1
+dist int multipl 1
+dist inter 1
+dist inter chromosomiqu 1
+dist invar 1
+dist is ch 1
+dist is compl 1
+dist is comput 1
+dist is invar 1
+dist is np 1
+dist is obv 1
+dist is posit 1
+dist is select 1
+dist is standard 1
+dist is tradit 1
+dist junct 1
+dist junct tr 1
+dist learn 1
+dist matr 2
+dist may fail 1
+dist measur 4
+dist meter 1
+dist model 1
+dist nc 1
+dist nc entr 1
+dist nest 1
+dist nest mi 1
+dist number 1
+dist of rk 1
+dist on 2
+dist on point 1
+dist on rigid 1
+dist on shap 1
+dist polygon 1
+dist problem 1
+dist proc 1
+dist reducemin16 1
+dist result 1
+dist rieman 1
+dist router 1
+dist self 1
+dist statistiqu 1
+dist statistiqu entr 1
+dist that adm 1
+dist that return 1
+dist threshold 1
+dist uniform 1
+dist user 1
+dist vect 2
+dist vect d1 1
+dist vect rout 1
+dist view 1
+dist wa larger 1
+dist when schedl 1
+distanc 1
+dister 1
+distinct 53
+distinct acc 1
+distinct acc edant 1
+distinct acc edent 1
+distinct and consecut 1
+distinct appart 1
+distinct between deduc 1
+distinct between lec 1
+distinct between libr 1
+distinct between object 1
+distinct cl 2
+distinct concept 1
+distinct const 1
+distinct const symbol 1
+distinct cop 1
+distinct de 2
+distinct de la 1
+distinct de processeur 1
+distinct de vi 1
+distinct direct 1
+distinct direct privileg 1
+distinct eigenvalu 1
+distinct el 3
+distinct entr 1
+distinct entr de 1
+distinct entr le 1
+distinct equiv 1
+distinct equiv cl 1
+distinct et chaqu 1
+distinct expr 1
+distinct f con 1
+distinct featur 4
+distinct fram 1
+distinct fresh 1
+distinct fresh variabl 1
+distinct gat 1
+distinct gat g1 1
+distinct ground 1
+distinct ground se 1
+distinct group 1
+distinct ident 1
+distinct in t2 1
+distinct ind 1
+distinct init 1
+distinct init st 1
+distinct inner 1
+distinct inner dynam 1
+distinct intersect 1
+distinct intersect rectangl 1
+distinct is akin 1
+distinct is mad 1
+distinct issu 1
+distinct issu de 1
+distinct k chang 1
+distinct key 1
+distinct key using 1
+distinct letter 1
+distinct lock 1
+distinct mark 1
+distinct mark green 1
+distinct me 1
+distinct memor 1
+distinct memor st 1
+distinct modif 1
+distinct modif ver 1
+distinct modl 1
+distinct next pack 1
+distinct nod 1
+distinct norm 1
+distinct norm form 1
+distinct object 1
+distinct object cl 1
+distinct occur 1
+distinct oe 1
+distinct of schem 1
+distinct part 1
+distinct ph 1
+distinct point 1
+distinct privileg 1
+distinct privileg number 1
+distinct problem 1
+distinct proc 1
+distinct proc ar 1
+distinct reg 1
+distinct retrospect 1
+distinct row 1
+distinct row zer 1
+distinct runtim 1
+distinct runtim differ 1
+distinct schedl 1
+distinct schedl strateg 1
+distinct se 1
+distinct situ 1
+distinct sub 1
+distinct symbol 1
+distinct t tupl 1
+distinct task 1
+distinct tempor 1
+distinct tempor atom 1
+distinct textur 1
+distinct tim 1
+distinct top 2
+distinct top lec 1
+distinct unit 1
+distinct unmark 1
+distinct unmark green 1
+distinct upper 1
+distinct upper bound 1
+distinct var 1
+distinct var symbol 1
+distinct variabl 4
+distinct variabl denot 1
+distinct view 1
+distinct vocabl 1
+distinct vocabl item 1
+distinct way 1
+distinct weight 1
+distinct weight assoc 1
+distinct word 1
+distinct2 1
+distingu 48
+distingu ain 1
+distingu ain de 1
+distingu among separ 1
+distingu an input 1
+distingu between argum 1
+distingu between classif 1
+distingu between land 1
+distingu between oe1 1
+distingu between random 1
+distingu between read 1
+distingu between shar 1
+distingu between st 1
+distingu between twelv 1
+distingu by look 1
+distingu by mean 1
+distingu cl 1
+distingu cl explicit 1
+distingu clr 1
+distingu cur 1
+distingu cur inform 1
+distingu de 1
+distingu de tout 1
+distingu deriv 1
+distingu e pour 1
+distingu ee 1
+distingu ee suiv 1
+distingu el 1
+distingu el mod 1
+distingu el pg 1
+distingu el root 1
+distingu el stop 1
+distingu es 2
+distingu es par 1
+distingu essentiel 2
+distingu essentiel par 2
+distingu featur 2
+distingu fr 1
+distingu fr var 1
+distingu from for 1
+distingu from prev 1
+distingu g en 1
+distingu garb 1
+distingu garb pattern 1
+distingu in term 1
+distingu inst 1
+distingu inst reduc 1
+distingu knowledg 1
+distingu le 1
+distingu le eff 1
+distingu mlr 1
+distingu mlr recov 1
+distingu nod 2
+distingu oe1 1
+distingu oe2 1
+distingu our approach 1
+distingu our model 1
+distingu par 2
+distingu par de 1
+distingu par leur 1
+distingu plusieur 1
+distingu plusieur cl 1
+distingu point 1
+distingu proc 1
+distingu proper 1
+distingu root 1
+distingu suiv 1
+distingu suiv quel 1
+distingu th ca 1
+distingu th curv 1
+distingu th ga 1
+distingu th inv 1
+distingu th optim 1
+distingu th prim 1
+distingu th typ 1
+distingu thr possibil 1
+distingu thr se 1
+distingu tw ca 3
+distingu tw kind 1
+distingu tw ph 1
+distingu tw possibil 1
+distingu upd 1
+distingu using 1
+distingu variabl 1
+distingu which dat 1
+distinguer 3
+distinguer ce 1
+distinguer ce fo 1
+distinguer ce sous 1
+distinguer deux 1
+distinguer deux caus 1
+distinguer deux typ 1
+distinguer entr 1
+distinguer entr variabl 1
+distinguer le 1
+distinguer le eff 1
+distinguer le influ 1
+distinguer le pag 1
+distinguer rigoureus 1
+distinguer rigoureus ce 1
+distinguer tr 1
+distinguer tr ca 1
+distinguon 1
+distinguon quatr 1
+distinguon quatr cl 1
+distort 2
+distort a displ 1
+distort funct 1
+distort sen 1
+distort view 1
+distract 1
+distribu 3
+distribu aux 1
+distribu aux processeur 1
+distribu e aux 1
+distribu ee 3
+distribu ee constitu 1
+distribu ee de 1
+distribu ee en 2
+distribu ee est 1
+distribu ee exponentiel 1
+distribu ee ma 1
+distribu ee se 1
+distribu ee sous 1
+distribu ee sur 1
+distribu egal 1
+distribu egal aux 1
+distribu es 3
+distribu es dan 1
+distribu es en 1
+distribu es exponentiel 1
+distribu es mod 1
+distribu es sur 2
+distribu le 1
+distribu le el 1
+distribuer 2
+distribuer a chaqu 1
+distribuer aux 1
+distribuer aux processeur 1
+distribuer la 1
+distribuer la boucl 1
+distribuer le 1
+distribuer le nid 1
+distribut 86
+distribut a dat 1
+distribut a en 1
+distribut a read 1
+distribut a sub 1
+distribut accord 1
+distribut act 1
+distribut act program 1
+distribut addr 1
+distribut addr spac 1
+distribut agr 2
+distribut agr protocol 1
+distribut algorithm 7
+distribut among rol 1
+distribut analog 1
+distribut and abstract 1
+distribut and administer 1
+distribut and approxim 1
+distribut and commun 2
+distribut and fil 1
+distribut and indep 1
+distribut and loop 1
+distribut and low 1
+distribut and parallel 2
+distribut and redistribut 1
+distribut and repl 1
+distribut and shar 1
+distribut and var 1
+distribut appl 4
+distribut appl ten 1
+distribut ar pr 1
+distribut ar st 1
+distribut architectur 1
+distribut as part 1
+distribut assign 1
+distribut assum 1
+distribut axiom 1
+distribut b tr 1
+distribut ba 1
+distribut bay 1
+distribut bay object 1
+distribut block 1
+distribut cal semidynam 1
+distribut chang 1
+distribut cl 1
+distribut cl encapsl 1
+distribut cluster 1
+distribut cluster centr 1
+distribut cognit 1
+distribut column 1
+distribut column ind 1
+distribut comput 23
+distribut comput environm 1
+distribut comput system 6
+distribut consensus 1
+distribut consensus problem 1
+distribut consider 1
+distribut control 2
+distribut cost 1
+distribut cur 1
+distribut cur sav 1
+distribut cycliqu 1
+distribut cycliqu de 1
+distribut cycliqu pav 1
+distribut dat 6
+distribut dat bal 1
+distribut dat manag 1
+distribut dat object 1
+distribut dat pattern 1
+distribut dat structur 4
+distribut datab 3
+distribut datab system 2
+distribut dataflow 1
+distribut dataflow environm 1
+distribut de 2
+distribut de bloc 1
+distribut de boucl 1
+distribut de calcl 1
+distribut de certain 1
+distribut de conflit 1
+distribut de don 1
+distribut de pag 1
+distribut de taux 1
+distribut denregister 1
+distribut deriv 1
+distribut deriv du 1
+distribut design 1
+distribut design work 1
+distribut dict 1
+distribut differ 3
+distribut differ consider 1
+distribut differ slight 1
+distribut directiv 1
+distribut directiv allow 1
+distribut du 1
+distribut du contr 1
+distribut dur top 1
+distribut ea 1
+distribut each level 1
+distribut either expon 1
+distribut environm 1
+distribut equ 1
+distribut est 1
+distribut ev 2
+distribut execut 1
+distribut ext 1
+distribut ext hash 1
+distribut fault 1
+distribut fault toler 1
+distribut feedfor 1
+distribut feedfor network 1
+distribut fif 1
+distribut for dat 1
+distribut for irregl 1
+distribut for nod 1
+distribut for np 1
+distribut for parallel 1
+distribut for part 1
+distribut for trunk 1
+distribut format 1
+distribut format assign 1
+distribut format block 1
+distribut from ftp.cc.northeastern.edu 1
+distribut funct 2
+distribut funct fd 1
+distribut g en 1
+distribut garb 1
+distribut garb collect 1
+distribut gather 1
+distribut gather inform 1
+distribut gaus 1
+distribut genet 1
+distribut genet algorithm 1
+distribut hot 1
+distribut hot spot 1
+distribut implem 2
+distribut in order 1
+distribut in stat 1
+distribut in tim 1
+distribut ind 1
+distribut inform 3
+distribut inform system 2
+distribut init 3
+distribut init cycliqu 1
+distribut init dan 1
+distribut init de 1
+distribut init na 1
+distribut init pixel 1
+distribut init q0 1
+distribut instr 1
+distribut interact 2
+distribut interact siml 2
+distribut is approxim 1
+distribut is chang 1
+distribut is dec 1
+distribut is determin 1
+distribut is gaus 1
+distribut is plot 1
+distribut is shift 1
+distribut it effect 1
+distribut it modif 1
+distribut langu 1
+distribut lat 1
+distribut learn 1
+distribut lim 1
+distribut lim rester 1
+distribut lin 1
+distribut lin hash 1
+distribut log 1
+distribut mach 1
+distribut mach support 1
+distribut manner 1
+distribut matr 1
+distribut may turn 1
+distribut measur 1
+distribut memor 13
+distribut memor architectur 3
+distribut memor computer 1
+distribut memor dat 1
+distribut memor mach 7
+distribut memor mult 1
+distribut memor multicomputer 2
+distribut memor multiproc 3
+distribut memor parallel 2
+distribut memor system 2
+distribut modif 1
+distribut monit 1
+distribut monit framework 1
+distribut mov 1
+distribut multiproc 1
+distribut multiproc system 1
+distribut natur 1
+distribut network 2
+distribut neur 1
+distribut neur network 1
+distribut new technolog 1
+distribut no load 1
+distribut not 1
+distribut object 4
+distribut object comput 1
+distribut object oper 1
+distribut of acquir 1
+distribut of cluster 1
+distribut of dat 1
+distribut of docum 1
+distribut of forml 1
+distribut of imag 1
+distribut of individu 1
+distribut of inform 1
+distribut of key 1
+distribut of log 1
+distribut of nod 1
+distribut of oper 1
+distribut of parallel 1
+distribut of privileg 1
+distribut of record 1
+distribut of sat 1
+distribut of sent 1
+distribut of solut 1
+distribut of stat 1
+distribut of task 2
+distribut of templ 1
+distribut of ver 1
+distribut of y1 1
+distribut off 1
+distribut on eight 1
+distribut on se 1
+distribut ont abstract 1
+distribut oper 3
+distribut oper system 3
+distribut or link 1
+distribut or redistribut 1
+distribut order 1
+distribut order preserv 1
+distribut originel 1
+distribut orthogon 1
+distribut over multipl 1
+distribut over tim 1
+distribut par 1
+distribut par bloc 1
+distribut particl 1
+distribut pattern 2
+distribut pattern dynam 1
+distribut ph 1
+distribut pi 1
+distribut pip 1
+distribut privileg 1
+distribut problem 1
+distribut problem solut 1
+distribut proc 11
+distribut proc execut 1
+distribut proc techniqu 1
+distribut program 4
+distribut program environm 1
+distribut protocol 2
+distribut queu 2
+distribut random 3
+distribut random input 1
+distribut random var 1
+distribut random variabl 1
+distribut real memor 1
+distribut reflect 1
+distribut reflect knowledg 1
+distribut repr 2
+distribut resourc 1
+distribut rl 1
+distribut rout 1
+distribut rout protocol 1
+distribut row 1
+distribut row wi 1
+distribut sav 1
+distribut schem 1
+distribut search 1
+distribut search structur 1
+distribut self 1
+distribut self stabil 1
+distribut serv 1
+distribut serv monit 1
+distribut server 1
+distribut server inform 1
+distribut shar 6
+distribut shar memor 6
+distribut should prefer 1
+distribut shown 1
+distribut siml 1
+distribut siml eng 1
+distribut snapshot 1
+distribut soft 2
+distribut soft dec 1
+distribut soft loc 1
+distribut softwar 1
+distribut sort 1
+distribut sort algorithm 1
+distribut sort using 1
+distribut st 1
+distribut st manag 1
+distribut st system 1
+distribut step 1
+distribut strateg 1
+distribut subtr 1
+distribut system 24
+distribut system 1st 1
+distribut system funct 1
+distribut system load 1
+distribut system pag 1
+distribut system project 1
+distribut system typ 1
+distribut tabl 1
+distribut tak 1
+distribut tak tim 1
+distribut techniqu 1
+distribut technolog 1
+distribut templ 1
+distribut th amount 1
+distribut th block 1
+distribut th chunk 1
+distribut th complec 1
+distribut th dat 1
+distribut th direct 1
+distribut th el 1
+distribut th exc 1
+distribut th leaf 1
+distribut th load 1
+distribut th matr 1
+distribut th nod 1
+distribut th protocol 1
+distribut th record 1
+distribut th row 1
+distribut th solut 1
+distribut th tool 1
+distribut th tr 1
+distribut th work 1
+distribut that repr 1
+distribut through templ 1
+distribut throughout vol 1
+distribut tim 1
+distribut to proc 1
+distribut tok 2
+distribut tok datadistribut 1
+distribut tok ring 1
+distribut transact 1
+distribut transact facil 1
+distribut transact proc 1
+distribut troubleshoot 1
+distribut typ 1
+distribut underl 1
+distribut using 1
+distribut usu var 1
+distribut visu 1
+distribut visu inform 1
+distribut wer ident 1
+distribut whiteboard 1
+distribut wil shift 1
+distribut with den 1
+distribut with mean 2
+distribut with succ 1
+distribut with superior 1
+distribut with templ 1
+distribut workst 1
+distribut workst ba 1
+distribut x xj 1
+distributd 1
+distributd system 1
+distributedmemor 2
+distributedmemor parallel 1
+distributedmemor parallel computer 1
+distributedmemor system 1
+distributionreplicationb 1
+distributionreplicationb problem 1
+district 1
+disturb 3
+disturb affect 1
+disturb decoupl 1
+disturb decoupl graph 1
+disturb decoupl problem 1
+disturb learn 1
+disturb reject 1
+disturb th actu 1
+disturb th rel 1
+disturb ver 1
+dit 6
+dit ap 1
+dit ap eriodiqu 1
+dit au 1
+dit au moin 1
+dit aus 1
+dit aus qu 1
+dit binair 1
+dit conditionnel5 1
+dit conditionnel5 sont 1
+dit d etermin 1
+dit de 3
+dit de cr 1
+dit de don 1
+dit de man 1
+dit de part 1
+dit de torgerson 1
+dit du 1
+dit du trait 1
+dit elag 1
+dit elag anticip 1
+dit eml 1
+dit erat 2
+dit erat ait 1
+dit erat convec 1
+dit erat correspon 1
+dit erat de 1
+dit erat du 1
+dit erat dun 1
+dit erat en 1
+dit erat est 1
+dit erat etant 1
+dit erat init 1
+dit erat justif 1
+dit erat maxim 1
+dit erat ne 1
+dit erat nest 1
+dit erat par 1
+dit erat pour 1
+dit erat quil 1
+dit erat ser 1
+dit erat successiv 1
+dit erat transform 1
+dit erat vid 1
+dit ergodiqu 1
+dit form 1
+dit form de 1
+dit fort 1
+dit fort coupl 1
+dit inst 1
+dit inst du 1
+dit instanc 1
+dit instanc ee 1
+dit interpr 1
+dit intrin 1
+dit intrin equ 1
+dit le 1
+dit li 1
+dit li ee 1
+dit loc 1
+dit loc est 1
+dit m convec 1
+dit natif 1
+dit non 1
+dit par 1
+dit par cop 1
+dit par empil 1
+dit perman 1
+dit posit 1
+dit pr 1
+dit quon 1
+dit quun 1
+dit quun processeur 1
+dit quun program 1
+dit r egl 1
+dit rat 1
+dit roug 1
+dit st 1
+dit st si 1
+dit synchr 1
+dit synchr est 1
+dit temporair 1
+diteur 1
+dither 1
+dither and wavel 1
+dither befor quant 1
+dither quant 1
+dither quant system 1
+dither techniqu 1
+dither uniform 1
+dither uniform scal 1
+dither.11 1
+dither.11 th ba 1
+dittrich 1
+div 38
+div a singl 1
+div a typ 1
+div almad 1
+div and conquer 3
+div and divisionl 1
+div and learn 1
+div and modl 1
+div and multip 1
+div at tim 1
+div by separ 1
+div by zer 2
+div check 1
+div counter 1
+div counter kg 1
+div counterkg 1
+div countv 1
+div dep 1
+div ee 2
+div ee en 1
+div ee par 1
+div ent 1
+div ent er 1
+div eucl 1
+div eucl de 1
+div eucl pour 1
+div eucl successiv 1
+div flag 1
+div flag gener 1
+div is allow 1
+div lincertitud 1
+div lincertitud par 1
+div log 1
+div n ev 1
+div of artif 1
+div of labor 1
+div of nod 1
+div of oper 1
+div of wadsworth 1
+div p.o 1
+div par 1
+div pjg 1
+div polynom 1
+div polynom problem 1
+div program 1
+div result 2
+div separ 1
+div st 1
+div t.j 1
+div th avail 1
+div th dat 1
+div th delaun 1
+div th docum 1
+div th form 1
+div th graph 1
+div th head 1
+div th input 1
+div th labour 1
+div th network 3
+div th obtus 1
+div th problem 1
+div th rat 1
+div th se 1
+div th shar 1
+div th tn 1
+div th univer 1
+div u.s 1
+div wer mad 1
+div wheelcirc 1
+div wheelcirc integer 1
+div x52 1
+diver 13
+diver as grammat 1
+diver ba 1
+diver ba infer 1
+diver comput 1
+diver comput model 1
+diver context 1
+diver d etail 1
+diver don 1
+diver don ee 1
+diver dut 1
+diver dut requir 1
+diver et particl 1
+diver of appl 1
+diver outil 1
+diver outil math 1
+diver piec 1
+diver possibilit 1
+diver variabl 1
+diver variabl domain 1
+diver way 1
+diverg 10
+diverg featur 1
+diverg lin 1
+diversif 2
+diversif es 1
+diversif might tak 1
+diversit 1
+diversit e par 1
+diversit e suff 1
+divid 36
+divid and conquer 1
+divid in term 1
+divid int chunk 2
+divid int elev 1
+divid int equ 1
+divid int grid 1
+divid n polygon 1
+divid network 1
+divid network topolog 1
+divid th comput 3
+divid th dat 1
+divid th differ 1
+divid th execut 1
+divid th individu 1
+divid th me 1
+divid th proc 1
+divid th result 1
+divid th spac 1
+divid th work 1
+divid work 1
+divideand 1
+divideand conquer 1
+divideand conquer principl 1
+diviser 2
+diviser en 1
+diviser en deux 1
+diviser lin 1
+diviser lin egalit 1
+diviser par 1
+diviser par deux 1
+divisionl 1
+divisionl cl 1
+dizain 2
+dizain dev 1
+dizain dev vit 1
+dj 8
+dj ej 1
+dj for hid 1
+dj n2 1
+dj t 1ir 1
+dj tel 1
+dj tel qu 1
+dj til 1
+dj0 1
+dj90 1
+dj93 1
+djnpj 1
+djnpj attempt 1
+dk 12
+dk achief 1
+dk be 1
+dk comput 1
+dk cover 1
+dk for output 1
+dk is symmeter 1
+dk oe 1
+dk oe ae 1
+dk on input 1
+dk wil reach 1
+dk wil tak 1
+dk82 1
+dkl 1
+dkm92 1
+dkmin 1
+dkr91 1
+dl 5
+dl 3dl 1
+dl algorithm 1
+dl algorithm gener 1
+dl algorithm run 1
+dl captur 1
+dl captur object 1
+dl for oolp 1
+dl is enrich 1
+dl is select 1
+dl tinter 1
+dl62 1
+dl86 1
+dlb 1
+dlb apprxfil 1
+dlb decluster 1
+dlb decluster method 1
+dlb is evalu 1
+dlb is outperform 1
+dlb method 1
+dlb method d0 1
+dlb mod 1
+dlb using 1
+dlb using random 1
+dlj 1
+dlog 1
+dlog ne 1
+dlog1 1
+dlog1 ffl0 1
+dlog2 2
+dlx 1
+dlx sp 1
+dlx sp analog 1
+dlx tic 1
+dlx tic text 1
+dm 10
+dm and dsm 1
+dm buffer 1
+dm buffer siz 1
+dm cal 1
+dm cal cost 1
+dm dm 1
+dm dm dm 1
+dm interfac 1
+dm interfac cost 1
+dm io 1
+dm io cost 1
+dm io dev 1
+dm is nec 1
+dm j hd 1
+dm89 1
+dm93 1
+dmck92 1
+dmdisk 1
+dmg 1
+dmlstmt 1
+dmlstmt dmlstmtl 1
+dmlstmt dmlstmtl dmlstmt 1
+dmlstmtl 1
+dmlstmtl dmlstmt 1
+dmp 1
+dmxp 1
+dmxp de 1
+dmxp de linpack 1
+dmxp triangulair 1
+dn 14
+dn 1in 1
+dn 4e 1
+dn bind 1
+dn bind domain 1
+dn bind motif 1
+dn budg 1
+dn budg managerv 1
+dn budgetv 1
+dn by rot 1
+dn dept 1
+dn entir 1
+dn from dept 1
+dn mac 1
+dn manager 1
+dn me memoryload 1
+dn pn 1
+dn pn manager 1
+dn pn managerv 1
+dn recognit 1
+dn sequ 1
+dn zon 1
+dn1 1
+dnam 1
+dnam avg 1
+dnam d7 1
+dnam dept 1
+dnam dept d1 1
+dnam emp 1
+dnam emp d1 1
+dnam from dept 1
+dnam from deptttl 1
+dnam from emp 1
+dnam skil 1
+dnamel 1
+dnameu 1
+dnamev 1
+dnamev avg 1
+dnamev d7 1
+dnamev from emp 1
+dnamev from empd 1
+dnamev from empttl 1
+dnamev skillsv 1
+dnf 1
+dnf forml 1
+dng 1
+dnj2 1
+dnj2 ajx00 1
+dnj2 ajx00 bj 1
+dnm 1
+dnr 1
+dnr f1600 1
+dnr f1600 dnr 1
+dnr f3200 1
+dnr f3200 dnr 1
+dnr f6400 1
+dnr f6400 dnr 1
+dnr g125.17 1
+dnr g250.29 1
+dnr g250.29 dnr 1
+dnr ii32b3 1
+dnt 1
+dnt e pav 1
+do 5
+do and thus 1
+do ar f0 1
+do dun 1
+do dun var 1
+do etr 1
+do etr mi 1
+do iten 1
+do iten dispon 1
+do usu 1
+do usu ri 1
+do veiller 1
+do.2 1
+doacr 1
+doacr loop 1
+doal 3
+doal est 1
+doal est partiel 1
+doal ii2 1
+doal j1 1
+doal j1 jj1 1
+doal k kmin 1
+doal l lmin 1
+doal le 1
+doal le vecteur 1
+doal loop 1
+doberkat 1
+doberkat and wegener 1
+doberkat result 1
+dobj 4
+dobj a partir 1
+dobj complec 1
+dobj temporair 1
+dobj temporair locaux 1
+dobjectif 1
+dobjectif sont 1
+dobjectif sont le 1
+dobkin 1
+dobr 2
+dobrovolsk 1
+dobserv 1
+dobson 1
+dobson and mcdermid 1
+dobtenir 5
+dobtenir avec 1
+dobtenir avec ce 1
+dobtenir de 3
+dobtenir de estim 1
+dobtenir de perform 1
+dobtenir de tail 1
+dobtenir le 1
+dobtenir le born 1
+dobtenir lencadr 1
+dobtenir lencadr suiv 1
+dobtenir sp 1
+dobtenir un 2
+dobtenir un classif 1
+dobtenir un imag 1
+doc 3
+doc cg 1
+doc cg out.html 1
+doc doc.html 1
+doc.html 1
+doccur 3
+doccur de 1
+doccur de fauxpart 1
+doccur est 1
+doccur est vraim 1
+dock 1
+doct 2
+doct communitat 1
+doct communitat europ 1
+doct dastrophysiqu 1
+doct dastrophysiqu dil 1
+docteur 2
+docteur de 2
+docteur de luniversit 2
+doctorat 2
+doctorat detat 1
+docum 29
+docum about help 1
+docum accord 1
+docum an 1
+docum and cod 1
+docum and compar 1
+docum and fil 1
+docum and launch 1
+docum and using 1
+docum and vid 1
+docum anyw 1
+docum anywh 1
+docum ar 1
+docum ar ad 1
+docum ar indeed 1
+docum ar relev 1
+docum author 1
+docum avail 2
+docum ba 1
+docum be learn 1
+docum being ind 1
+docum block 1
+docum by repeat 1
+docum can imp 1
+docum can organ 1
+docum captur 1
+docum car 1
+docum ch 1
+docum cluster 1
+docum cluster approach 1
+docum compon 1
+docum contain 3
+docum contain census 1
+docum contain emb 1
+docum conver 1
+docum conver cad 1
+docum could caus 1
+docum cvgip 1
+docum datab 1
+docum de 1
+docum de limport 1
+docum definit 1
+docum deliv 1
+docum deliv capabil 1
+docum deliv mechan 1
+docum design 1
+docum dhabilit 1
+docum differ 1
+docum displ 1
+docum domain 1
+docum dur 1
+docum est 1
+docum est organ 1
+docum et le 1
+docum fl 1
+docum fl captur 1
+docum for non 1
+docum for object 1
+docum for oo 1
+docum gener 1
+docum hav pointer 1
+docum help 1
+docum help organ 1
+docum hierarch 1
+docum identif 1
+docum imag 1
+docum imag proc 1
+docum imag segm 1
+docum in detail 1
+docum inform 1
+docum inform gather 1
+docum int rel 1
+docum interactif 1
+docum intuit 1
+docum is becom 1
+docum is es 1
+docum is good 1
+docum it execut 1
+docum layout 1
+docum layout structur 1
+docum most 1
+docum most lik 1
+docum n etant 1
+docum n24 1
+docum ne 1
+docum ne se 1
+docum object 1
+docum object ea 1
+docum om 1
+docum on el 1
+docum pag 1
+docum pag decomposit 1
+docum pag scan 1
+docum pag segm 1
+docum path 1
+docum peut 1
+docum peut donner 1
+docum peuv 1
+docum peuv etr 1
+docum pr 1
+docum proc 1
+docum proc group 1
+docum proc system 1
+docum progr 1
+docum progr carneg 1
+docum quick 1
+docum reader 1
+docum receiv 1
+docum relev 1
+docum result 1
+docum retrief 1
+docum retrief eng 1
+docum seen 1
+docum segm 1
+docum ser 1
+docum shar 1
+docum shar featur 1
+docum simil 1
+docum sol 1
+docum sometim result 1
+docum sourc 1
+docum sourc compr 1
+docum specif 1
+docum specif featur 1
+docum subject 1
+docum techpaper 1
+docum techpaper gavin.low 1
+docum textu 1
+docum th author 1
+docum th cod 1
+docum that ar 1
+docum that requir 1
+docum that us 1
+docum to exploit 1
+docum to help 1
+docum to suffer 1
+docum tool 1
+docum tool develop 1
+docum typ 1
+docum understand 1
+docum understand text 1
+docum vi emb 1
+docum we becam 1
+docum with complec 1
+docum with emb 1
+docum with simpl 1
+docum www 1
+docum3 1
+dod 4
+dod contract 1
+dod et patr 1
+dod83 1
+dodash 1
+dodg 1
+dodinateur 1
+doduc 1
+doduc hydrocod 1
+doduc hydrocod tin 1
+doduc reduc 1
+doduc reduc tot 1
+doerman 1
+doerman and ram 1
+doesn 1
+dof 1
+dof ask 1
+dog 5
+dog and sniff 1
+dog bark 1
+dog bark inst 1
+dog com 1
+dog either acc 1
+dog in particl 1
+dog paw 1
+dog paw problem 1
+dog paw test 1
+dog sniff 1
+dog sud 1
+dog sud began 1
+dog.j 1
+dog.j ump 1
+dog.q 1
+dog.q uick 1
+dog.q uick string 1
+doit 6
+doit a posterior 1
+doit acc 1
+doit acc eder 1
+doit ajouter 1
+doit ajouter aux 1
+doit alor 2
+doit alor etr 2
+doit alor extrair 1
+doit alor fair 1
+doit alor migrer 1
+doit assurer 1
+doit assurer quil 1
+doit augmenter 1
+doit augmenter ce 1
+doit aus 1
+doit aus etr 1
+doit avoir 1
+doit avoir de 1
+doit bien 1
+doit conserver 1
+doit conserver lordr 1
+doit consid 1
+doit consid erer 1
+doit correspondr 1
+doit donc 3
+doit donc dabord 1
+doit donc doubler 1
+doit donc etr 1
+doit donc inclur 1
+doit donc prendr 1
+doit donc se 1
+doit ecrir 1
+doit ecrir le 1
+doit effectuer 1
+doit effectuer plusieur 1
+doit egal 1
+doit egal prendr 1
+doit en 1
+doit en con 1
+doit encor 1
+doit encor respecter 1
+doit enorm 1
+doit enorm ement 1
+doit etr 2
+doit etr cap 1
+doit etr consid 1
+doit etr cr 1
+doit etr effectu 1
+doit etr enregister 1
+doit etr es 1
+doit etr etendu 1
+doit etr fourn 1
+doit etr gard 1
+doit etr glob 1
+doit etr ignor 1
+doit etr imp 1
+doit etr lev 1
+doit etr mi 1
+doit etr recalcl 1
+doit etr rem 1
+doit etr rep 1
+doit etr sauv 1
+doit etr sauvegard 1
+doit etr temporair 1
+doit etr test 1
+doit etr transm 1
+doit fair 1
+doit fair intervenir 1
+doit fair le 1
+doit indiquer 1
+doit indiquer en 1
+doit lir 1
+doit lir ou 1
+doit maint 1
+doit mettr 1
+doit mettr point 1
+doit non 1
+doit non sel 1
+doit on consid 1
+doit on cr 1
+doit on lib 1
+doit passer 1
+doit passer par 1
+doit permettr 2
+doit permettr davoir 1
+doit permettr de 1
+doit permettr egal 1
+doit prendr 1
+doit prendr not 1
+doit provoquer 1
+doit restaurer 1
+doit restaurer le 1
+doit retourner 1
+doit retourner le 1
+doit retrouver 1
+doit retrouver la 1
+doit sadapter 1
+doit sadapter aux 1
+doit seffectuer 1
+doit seffectuer apr 1
+doit strict 1
+doit strict suivr 1
+doit tenir 1
+doit tenir compt 1
+doit tout 1
+doit tout dabord 1
+doit tr 1
+doit tr util 1
+doiv 4
+doiv a la 1
+doiv alor 1
+doiv alor init 1
+doiv aus 1
+doiv aus etr 1
+doiv donc 1
+doiv donc etr 1
+doiv ecrir 1
+doiv ecrir dan 1
+doiv etr 3
+doiv etr ajout 1
+doiv etr consid 1
+doiv etr conver 1
+doiv etr distribu 1
+doiv etr elagu 1
+doiv etr empl 1
+doiv etr introduit 1
+doiv etr inv 1
+doiv etr mi 1
+doiv etr norm 1
+doiv etr pr 1
+doiv etr produit 1
+doiv etr propag 1
+doiv etr restaur 1
+doiv etr substitu 1
+doiv etr synth 1
+doiv etr val 1
+doiv fair 1
+doiv fair un 1
+doiv modif 1
+doiv modif de 1
+doiv pa 1
+doiv pa etr 1
+doiv pa modif 1
+doiv parf 1
+doiv parf tr 1
+doiv permettr 1
+doiv permettr de 1
+doiv pouvoir 2
+doiv pouvoir substituer 1
+doiv pouvoir tr 1
+doiv prendr 1
+doiv prendr soin 1
+doiv restaurer 1
+doiv restaurer le 1
+doiv rester 2
+doiv rester dan 1
+doiv restreindr 1
+doiv restreindr la 1
+doiv survivr 1
+doj 1
+doklad 1
+dol 3
+dol equ 1
+dol invest 1
+dol sign 1
+dolev 4
+dolev and shavit 1
+dom 14
+dom broadcast 1
+dom dun 1
+dom dun individu 1
+dom dun superindividu 1
+dom gather 1
+dom list 1
+dom list tak 1
+dom of commun 1
+dom of loc 1
+dom st 1
+dom st fs 1
+dom st1 1
+dom st2 1
+dom th complec 1
+dom th spac 2
+domain 60
+domain a haut 1
+domain a project 1
+domain alread defin 1
+domain an 1
+domain and bind 1
+domain and boolean 1
+domain and def 1
+domain and repr 1
+domain and shar 1
+domain and speed 1
+domain approach 1
+domain ar correct 1
+domain ar giv 1
+domain ar rel 2
+domain ar repr 1
+domain assoc 1
+domain attach 1
+domain auquel 1
+domain auquel je 1
+domain aus 1
+domain aus var 1
+domain ba 1
+domain ba regr 1
+domain being model 1
+domain being quest 1
+domain being tackl 1
+domain by incorpor 1
+domain by interact 1
+domain cannot correct 1
+domain cl 1
+domain clash 1
+domain clash tel 1
+domain co 1
+domain co domain 1
+domain concentr 1
+domain concept 2
+domain constraint 1
+domain cont 1
+domain cont extract 1
+domain d emar 1
+domain d1 1
+domain d11 1
+domain d21 1
+domain de 2
+domain de architectur 1
+domain de la 1
+domain de recherch 1
+domain dep 1
+domain dexplor 1
+domain dit 1
+domain dit erat 1
+domain dit rat 1
+domain domain 1
+domain domain1 1
+domain du 1
+domain du probl 1
+domain edg 1
+domain edg detect 1
+domain el 1
+domain el a1 1
+domain ent 1
+domain et identiqu 1
+domain et la 1
+domain exper 1
+domain f0 1
+domain f1 1
+domain fil. 1
+domain filter 1
+domain filter reduc 1
+domain fin 1
+domain fin dan 1
+domain for futur 1
+domain for repr 1
+domain funct 1
+domain funct comput 1
+domain gener 1
+domain gener funct 1
+domain giv 1
+domain handl 1
+domain handl mechan 1
+domain html 1
+domain html viewer 1
+domain http 1
+domain http server 1
+domain imag 1
+domain imag manipl 1
+domain in comput 1
+domain inclus 3
+domain inclus avoc 1
+domain inclus finit 1
+domain indep 3
+domain indep architectur 1
+domain indep langu 1
+domain init 1
+domain int prolog 1
+domain is discr 1
+domain is theor 1
+domain knowledg 2
+domain lookup 1
+domain lookup fn 1
+domain mean 1
+domain meant 1
+domain meant further 1
+domain method 1
+domain method cl 1
+domain model 2
+domain no appl 1
+domain of appl 1
+domain of babel 1
+domain of constraint 1
+domain of dat 1
+domain of datab 1
+domain of detect 1
+domain of drug 1
+domain of exper 1
+domain of geometer 1
+domain of gf 1
+domain of individu 1
+domain of int 1
+domain of method 1
+domain of object 1
+domain of quantif 1
+domain of reg 1
+domain of se 1
+domain of siz 1
+domain of softwar 1
+domain of spat 1
+domain of trp 1
+domain of valu 1
+domain onl requir 1
+domain par 1
+domain postproc 1
+domain pr 1
+domain prior 1
+domain pu 1
+domain pu etr 1
+domain ra 1
+domain repr 1
+domain requir 1
+domain requir continu 1
+domain show 1
+domain show signif 1
+domain signif 1
+domain signif wast 1
+domain soit 1
+domain soit convec 1
+domain solut 1
+domain solver 1
+domain solver compar 1
+domain sont 1
+domain sont repr 1
+domain specif 3
+domain specif compiler 1
+domain specif dbm 1
+domain specif gener 1
+domain specif langu 1
+domain specif optim 1
+domain specif proc 1
+domain specif program 1
+domain specif softwar 1
+domain specif tool 1
+domain sur 1
+domain sur le 1
+domain technologiqu 1
+domain technologiqu de 1
+domain tel 1
+domain tel condit 1
+domain term 1
+domain theor 1
+domain threshold 1
+domain threshold method 1
+domain to mak 1
+domain to order 1
+domain to select 1
+domain truth 1
+domain us 1
+domain util 1
+domain util de 1
+domain valu 1
+domain valu correspon 1
+domain variabl 2
+domain variabl improv 1
+domain variabl using 1
+domain we recogn 1
+domain wer ch 1
+domain which reflect 1
+domain wi 1
+domain with background 1
+domain with const 1
+domain with specif 1
+domain www 1
+domain www server 1
+domain.2 1
+domain1 1
+domain2 1
+domainspecif 2
+domainspecif knowledg 1
+domainspecif knowledg system 1
+domainspecif langu 1
+domainspecif langu preproc 1
+doman 1
+domin 25
+domin a coter 1
+domin act 1
+domin assum 1
+domin color 1
+domin color compon 1
+domin commun 1
+domin compiler 1
+domin compiler compiler 1
+domin del 1
+domin effect 1
+domin etant 1
+domin etant nl 1
+domin fact 3
+domin sequ 1
+domin sequ cluster 1
+domin step 3
+domin th over 1
+domin th perform 1
+domin th qu 1
+domin th tim 3
+domin th tot 1
+domin voxel 1
+domin voxel techniqu 1
+domingu 1
+domingu and eisenstadt 1
+domingu et al 1
+domingu paul 1
+domingu paul mulholland 1
+dominion 2
+dominiqu 1
+dominiqu henr 1
+dominiqu henr de 1
+doml 1
+doml ffl nord 1
+don 12
+don acc 1
+don acc es 1
+don alor 2
+don aus 1
+don aus le 1
+don bat 1
+don by sun 1
+don dan 2
+don dan ce 1
+don dan le 2
+don de 2
+don de bon 1
+don de meilleur 1
+don de pa 1
+don de perform 1
+don diff 1
+don diff erent 1
+don e cont 1
+don e de 2
+don e deux 1
+don e est 1
+don e figur 1
+don e par 3
+don e peut 1
+don e pour 1
+don e rn 1
+don e saccr 1
+don e simultan 1
+don e un 1
+don ee 4
+don ee abstrait 1
+don ee ad 1
+don ee ain 1
+don ee assoc 1
+don ee au 1
+don ee aucun 1
+don ee aus 1
+don ee aux 1
+don ee avant 1
+don ee ce 1
+don ee cest 1
+don ee con 1
+don ee concr 1
+don ee constitu 2
+don ee constitutiv 1
+don ee contr 1
+don ee correspon 2
+don ee dadr 1
+don ee dan 2
+don ee datent 1
+don ee de 3
+don ee diff 1
+don ee disponibl 2
+don ee distinct 2
+don ee doiv 1
+don ee du 2
+don ee dun 3
+don ee en 3
+don ee entr 1
+don ee est 3
+don ee etant 1
+don ee exp 1
+don ee ext 1
+don ee fait 1
+don ee fer 1
+don ee figur 1
+don ee imp 1
+don ee init 1
+don ee inutil 1
+don ee le 2
+don ee loc 1
+don ee ma 1
+don ee manipl 1
+don ee ne 2
+don ee non 1
+don ee nont 1
+don ee nutil 1
+don ee odan 1
+don ee par 3
+don ee partag 1
+don ee pen 1
+don ee perm 1
+don ee peuv 2
+don ee plut 1
+don ee pour 2
+don ee pr 1
+don ee probabil 1
+don ee provoqu 1
+don ee qu 3
+don ee rallong 1
+don ee repr 1
+don ee requ 1
+don ee risqu 1
+don ee simpl 1
+don ee simplif 1
+don ee situ 1
+don ee soit 1
+don ee sont 3
+don ee sur 2
+don ee surviv 1
+don ee tag 1
+don ee tel 1
+don ee trait 1
+don ee un 3
+don ee uniqu 1
+don ee util 2
+don ee va 1
+don ee var 1
+don ee ver 2
+don ee vo 1
+don en 1
+don es 4
+don es aus 1
+don es dan 1
+don es de 1
+don es figur 1
+don es loc 1
+don es par 2
+don es sur 1
+don es synth 1
+don es tridimensionnel 1
+don gilber 1
+don jam 1
+don jam moin 1
+don la 2
+don la form 1
+don la posit 1
+don la tail 1
+don ladr 1
+don ladr du 1
+don larit 1
+don le 3
+don le cod 2
+don le contr 1
+don le courb 1
+don le nombr 3
+don le perform 1
+don le sch 1
+don le som 1
+don le surc 1
+don le temp 1
+don le typ 1
+don le valeur 1
+don lieu 2
+don matth 1
+don na 1
+don notr 1
+don notr techniqu 1
+don of fujitsu 1
+don pa 1
+don pa de 1
+don pour 1
+don pour chaqu 1
+don pour la 1
+don pour le 1
+don respectiv 1
+don respectiv le 1
+don s multipl 1
+don t overlap 1
+don un 4
+don un aper 1
+don un born 1
+don un contribut 1
+don un exempl 1
+don un justif 1
+don un list 1
+don un matr 1
+don un speed 1
+donahu 1
+donald 3
+donald knuth 1
+donald mich 1
+donald mich point 1
+donc 5
+donc 2o 1
+donc 2o processeur 1
+donc a fournir 1
+donc a la 1
+donc a prior 1
+donc a prouver 1
+donc a rendr 1
+donc a tenter 1
+donc ai 1
+donc ajouter 1
+donc ajouter au 1
+donc akl 1
+donc appliquer 1
+donc au 2
+donc au nid 1
+donc au probl 1
+donc au programmeur 1
+donc aucun 1
+donc aucun chanc 1
+donc aucun contraint 1
+donc aux 1
+donc aux fonct 1
+donc bien 2
+donc bien attribu 1
+donc bien quun 1
+donc biject 1
+donc biject sur 1
+donc c11 1
+donc capit 1
+donc capit de 1
+donc centr 1
+donc centr ee 1
+donc cherch 1
+donc clair 1
+donc clair pa 1
+donc co 1
+donc co uteus 1
+donc commun 1
+donc commun ma 1
+donc compat 1
+donc compat avec 1
+donc consom 1
+donc consom alor 1
+donc constitu 1
+donc constitu es 1
+donc d ej 1
+donc d epen 1
+donc d eviter 1
+donc dabord 1
+donc dabord cherch 1
+donc dan 1
+donc dan ce 1
+donc dan la 1
+donc dan le 1
+donc dan lun 1
+donc dan tous 1
+donc dappliquer 1
+donc dappliquer un 1
+donc daugmenter 1
+donc daugmenter la 1
+donc de 4
+donc de attribut 1
+donc de compiler 1
+donc de con 1
+donc de cr 1
+donc de estampil 1
+donc de fair 1
+donc de garantir 1
+donc de la 1
+donc de me 1
+donc de navoir 1
+donc de ne 1
+donc de nous 1
+donc de pal 1
+donc de prendr 1
+donc de recourir 1
+donc de repasser 1
+donc de retarder 1
+donc de savoir 1
+donc de sen 1
+donc de trouver 1
+donc de typ 1
+donc destampil 1
+donc deux 1
+donc deux niveaux 1
+donc dexplorer 1
+donc dexplorer dautr 1
+donc difficil 2
+donc dispar 1
+donc dispar tr 1
+donc dj 1
+donc don 1
+donc doubler 1
+donc doubler le 1
+donc dun 1
+donc dun enregister 1
+donc dutiliser 1
+donc dutiliser la 1
+donc ecrir 1
+donc ecrir lexpr 1
+donc effectu 1
+donc effectu ee 1
+donc egal 1
+donc en 2
+donc encor 1
+donc encor proportionnel 1
+donc ent 1
+donc ent er 1
+donc entr 1
+donc entr un 1
+donc entrer 1
+donc entrer en 1
+donc essentiel 1
+donc essentiel du 1
+donc etr 2
+donc etr consid 1
+donc etr ecrit 1
+donc etr elimin 1
+donc etr empl 1
+donc etr evit 1
+donc etr ladr 1
+donc etr lu 1
+donc etr propag 1
+donc etr retenu 1
+donc etr sign 1
+donc etr trait 1
+donc etr un 1
+donc etr util 1
+donc etr vu 1
+donc eviter 1
+donc eviter de 1
+donc fat 1
+donc fat aux 1
+donc favor 1
+donc favor es 1
+donc fin 1
+donc fin de 1
+donc fin le 1
+donc fusionner 1
+donc fusionner le 1
+donc il 1
+donc il egal 1
+donc il evit 1
+donc implicit 1
+donc inclur 1
+donc indisp 1
+donc int 1
+donc int er 1
+donc interd 1
+donc interd un 1
+donc intern 1
+donc introduit 2
+donc introduit au 1
+donc inutil 1
+donc jj 1
+donc l egitim 1
+donc l el 1
+donc la 3
+donc la colon 1
+donc la dist 1
+donc la form 1
+donc la gest 1
+donc la matr 1
+donc la mi 1
+donc la migr 1
+donc la ph 1
+donc la probabilit 1
+donc la tail 1
+donc lappl 1
+donc lav 1
+donc le 4
+donc le acc 1
+donc le compl 1
+donc le el 1
+donc le nombr 1
+donc le partit 1
+donc le patron 1
+donc le pr 1
+donc le prem 1
+donc le princip 1
+donc le processeur 1
+donc le propr 1
+donc le syst 1
+donc le vecteur 1
+donc leur 1
+donc leur form 1
+donc li 1
+donc lintersect 1
+donc lintersect entr 1
+donc lunif 1
+donc mac 1
+donc maint 1
+donc maint convec 1
+donc mal 1
+donc mal appr 1
+donc marginaux 1
+donc marginaux si 1
+donc mi 1
+donc moin 2
+donc moin co 1
+donc moin il 1
+donc n ecessair 1
+donc naturel 1
+donc naturel port 1
+donc naturel quel 1
+donc ne 1
+donc ne pa 1
+donc non 1
+donc non prouv 1
+donc o extrair 1
+donc o processeur 1
+donc od 1
+donc od ecaler 1
+donc on consid 1
+donc on est 1
+donc orient 1
+donc p est 1
+donc pa 3
+donc pa dan 2
+donc pa de 1
+donc pa deff 1
+donc pa enregister 1
+donc pa exact 1
+donc pa intervenir 1
+donc pa non 1
+donc pa pr 1
+donc pa souc 1
+donc par 1
+donc par ce 1
+donc par la 1
+donc parf 1
+donc penser 1
+donc plus de 1
+donc plus larg 1
+donc plus latteint 1
+donc plus le 1
+donc plus pr 1
+donc plus quel 1
+donc plus sel 1
+donc plut 1
+donc plut ot 1
+donc po de 1
+donc point 1
+donc point de 1
+donc posit 1
+donc potentiel 1
+donc potentiel moin 1
+donc pouvoir 1
+donc pouvoir limiter 1
+donc prendr 1
+donc prendr en 1
+donc ps 1
+donc ps prim 1
+donc pu 1
+donc pu etr 1
+donc qu 2
+donc qu de 1
+donc qu evoqu 1
+donc qu la 1
+donc qu laccr 1
+donc qu le 2
+donc qu si 1
+donc quel 1
+donc quel ne 1
+donc quil 1
+donc quil est 1
+donc quun 1
+donc quun fa 1
+donc r eduir 1
+donc ram 1
+donc ren 1
+donc ren imp 1
+donc respect 1
+donc respect ee 1
+donc rest 1
+donc rest conditionnel6 1
+donc s 1
+donc s 9j 1
+donc sagir 1
+donc sav 1
+donc sav erer 1
+donc scind 1
+donc scind ee 1
+donc se 2
+donc se fair 1
+donc serait 1
+donc serait le 1
+donc si 1
+donc si ce 1
+donc si l2 1
+donc si lon 1
+donc si un 1
+donc simpl 3
+donc simpl soum 1
+donc soit 1
+donc son 1
+donc son attribut 1
+donc sous 1
+donc sous form 1
+donc strict 1
+donc strict inf 1
+donc sur 3
+donc sur le 3
+donc tout 1
+donc tout int 1
+donc tout par 1
+donc tr 2
+donc tr es 2
+donc ua 1
+donc ua vm 1
+donc ua vt 1
+donc un 3
+donc un ca 1
+donc un fo 1
+donc un moy 1
+donc un ph 1
+donc un surc 1
+donc un techniqu 1
+donc un traf 1
+donc un vecteur 1
+donc utiliser 1
+donc utiliser la 1
+donc vain 1
+donc vain de 1
+donc voir 1
+donc voir com 1
+donc vr 1
+donc vr pour 1
+dongar 3
+dongar and dunigan 1
+dongar et bernard 1
+donik 1
+donner 2
+donner a la 1
+donner a penser 1
+donner au 1
+donner de 1
+donner de conclus 1
+donner ic 1
+donner ic leur 1
+donner ladr 1
+donner ladr du 1
+donner lieu 1
+donner un 1
+donner un estim 1
+donneront 1
+donneront lieu 1
+donnon 2
+donnon ci 1
+donnon ci apr 1
+donnon dan 1
+donnon dan ce 1
+donnon egal 1
+donnon le 1
+donnon le raison 1
+donoh 1
+donoh and johnst5 1
+dood91 2
+door 2
+door bathsheb 1
+dop 4
+dop erat 3
+dop erat en 1
+dop erat identiqu 1
+dop erat math 1
+dop erat qu 1
+dop erateur 2
+dop erateur de 1
+dop erateur standard 1
+dop erer 1
+dop erer un 1
+dop rat 1
+dopar 2
+dopar synchron 1
+dopar synchron q0 1
+doppler 1
+doppler labor 1
+doptim 3
+doptim a lucarn 1
+doptim de 2
+doptim de la 1
+doptim de localit 1
+doptim du 1
+doptim du par 1
+doptim dun 1
+doptim dun fonct 1
+doptim etud 1
+doptim etud ee 1
+doptim par 1
+doptim par le 1
+doptim pourrait 1
+doptim pourrait etr 1
+doptim stochastiqu 1
+doptim stochastiqu fon 1
+doptim stochastiqu inspir 1
+doptim suiv 1
+doptim suiv sont 1
+doptim sur 1
+doptim sur le 1
+doptim usuel 1
+doptimiser 1
+doptimiser laffinit 1
+doptimiser sa 1
+doptimiser sa localit 1
+dor 1
+dor enav 1
+dor enav pil 1
+dorad 1
+dorad count 1
+dordinateur 1
+dordinateur don 1
+dordinateur don ee 1
+dordinateur par 1
+dordinateur par el 1
+dordonnanc 2
+dordonnanc et doptim 1
+dordonnanc perm 1
+dordonnanc statiqu 1
+dordr 6
+dordr economiqu 1
+dordr economiqu nous 1
+dordr l est 1
+dordr m2 1
+dordr m3 1
+dordr m3 pour 1
+dordr sup 1
+dordr sup erieur 1
+dordr sur 1
+dordrecht 2
+dorffner 1
+dorgan 1
+dorgan de 1
+dorgan de la 1
+dorig 2
+dorig diver 1
+dorm 1
+dorm mod 1
+dorochevsk 1
+dorochevsk qu 1
+dorochevsk qu ma 1
+doron 1
+doron rotem 1
+dorthonorm 1
+dorthonorm de 1
+dorthonorm de gram 1
+dortmund 2
+doseq 1
+dosgetm 1
+dosgetm ap 1
+dot 16
+dot arrow 2
+dot e actuel 1
+dot e dun 2
+dot edg 1
+dot ee 1
+dot ee dun 1
+dot is bound 1
+dot is plac 1
+dot lin 5
+dot lin mean 1
+dot matr 1
+dot matr an 1
+dot matr plot 1
+dot not 1
+dot plac 1
+dot plot 1
+dot plotter 1
+dot produc 1
+dot produc gt 1
+dou 1
+doub 1
+doub link 1
+doub link list 1
+doubl 26
+doubl approch 1
+doubl approch constitu 1
+doubl avant 1
+doubl benchmark 1
+doubl calculatecycl 1
+doubl click 1
+doubl condit 1
+doubl consom 1
+doubl consom aut 1
+doubl dash 1
+doubl dat 1
+doubl dat typ 1
+doubl ee 1
+doubl ee dun 1
+doubl et dun 1
+doubl et le 1
+doubl et sauvegard 1
+doubl eurocard 1
+doubl eurocard format 1
+doubl float 2
+doubl float a.6 1
+doubl float el 1
+doubl float point 1
+doubl float stream 1
+doubl from q1.6 1
+doubl fut 1
+doubl fut init 1
+doubl group 1
+doubl heur 1
+doubl heur nt 1
+doubl heur uv 1
+doubl in speed 1
+doubl ind 1
+doubl ind indirect 1
+doubl interest 1
+doubl it valu 1
+doubl le 1
+doubl le ca 1
+doubl le mach 1
+doubl lin 1
+doubl lin edg 1
+doubl loop 2
+doubl naccr 1
+doubl ne 1
+doubl ne se 1
+doubl or pointer 1
+doubl perm 1
+doubl perm de 1
+doubl peuv 1
+doubl peuv cep 1
+doubl pil 1
+doubl pil de 1
+doubl pointer 1
+doubl pr 2
+doubl pr ec 2
+doubl prec 4
+doubl prec float 3
+doubl prec peak 1
+doubl r esout 1
+doubl root 1
+doubl sqrt 1
+doubl th aver 1
+doubl th cost 1
+doubl th number 2
+doubl tim 1
+doubl ver 1
+doubl with respect 1
+doubl zer 1
+doubleind 1
+doubleind indirect 1
+doubleind indirect addr 1
+doubler 2
+doubler le 2
+doubler le champ 1
+doubt 4
+doubt th rat 1
+doubt their task 1
+douc 1
+douceur 1
+douceur dun 1
+douceur dun approch 1
+doughnut 3
+doughnut rout 1
+doughnut using 1
+doughnut using connect 1
+dougl 2
+dougl chub 1
+dougl chub greg 1
+dougl chub research 1
+dour 1
+dour bellot92 1
+dout 4
+dout din 1
+dout din dout 1
+dout la 1
+dout la direct 1
+dout margin 1
+dout margin ma 1
+dout pa 1
+dout pa la 1
+dout passer 1
+doutil 3
+doutil alg 1
+doutil alg ebriqu 1
+doutil de 1
+doutil de lan 1
+doutil math 1
+doutil math matiqu 1
+doutil th 1
+doutil th eoriqu 1
+douvr 1
+douvr sur 1
+douvr sur prolog 1
+dover 2
+dover publ 1
+down 4
+down path 1
+down rel 1
+downd 1
+downd a cach 1
+download 3
+download it nod 1
+download th exc 1
+download tool 1
+downstream 2
+downstream neighbor 1
+downstream switch 1
+downtim 1
+downtim in secon 1
+doyl 3
+doz 4
+doz cl 1
+doz larg lp 1
+doz nod 1
+doz of compon 1
+dp 10
+dp an 1
+dp contain 1
+dp contain memor 1
+dp inv 1
+dp inv temp 1
+dp mp 1
+dp ne 1
+dp ne sont 1
+dp ontolog 1
+dp ontolog natur 1
+dp sont 1
+dp sont gard 1
+dp temp 1
+dp temp dp 1
+dp60 1
+dpc 1
+dpc 1e 1
+dpl 3
+dpl algorithm 1
+dpl algorithm us 1
+dpl curv 1
+dpl curv transl 1
+dpl dp 1
+dpl dp inv 1
+dpl framework 1
+dpl grow 1
+dpl is attribut 1
+dpl is high 1
+dpl maxscor 1
+dpl maxscor 2cl 1
+dpl on random 1
+dpl repeat 1
+dpl repeat perform 1
+dpl research.panason.com 1
+dpl research.panason.com andrewt 1
+dpl wa execut 1
+dpl with maxscor 1
+dpq 1
+dpu 1
+dpu con 1
+dputim.tv 1
+dputim.tv sec 1
+dputim.tv sec st1.dpu.dr 1
+dputim.tv usec 1
+dputim.tv usec st1.dpu.dr 1
+dpx 1
+dqg 1
+dqg th se 1
+dr 16
+dr a softwar 1
+dr a.g 1
+dr ar st 1
+dr autom 1
+dr autom enabl 1
+dr by an 1
+dr cand 1
+dr compon 1
+dr compon writ 1
+dr contain 1
+dr horizont 1
+dr ii 1
+dr kevin 1
+dr kevin wait 1
+dr lab 1
+dr laser 1
+dr mod 1
+dr model 1
+dr n.m 1
+dr non 1
+dr non orient 1
+dr other program 1
+dr rotterdam 1
+dr simplif 1
+dr st 1
+dr surfac 1
+dr surfac con 1
+dr surfac giv 1
+dr surfac horizont 1
+dr surfac illumin 1
+dr surfac look 1
+dr surfac using 1
+dr surfac ver 1
+dr surfac.3 1
+dr surfac.4 1
+dr to appropr 1
+dr ver 1
+dr wh 1
+dr1 1
+draft 19
+draft a list 1
+draft fin 1
+draft fin deliver 1
+draft in fresh 1
+draft interview 1
+draft interview templ 1
+draft prop 1
+draft prop standard 1
+draft report 3
+draft system 1
+draft techn 1
+draft techn report 1
+draft templ 1
+draft.tic 1
+drag 4
+drag any compon 1
+drag in interact 1
+drag th mous 1
+dragon 1
+dragon computer 1
+dragon computer system 1
+dragutin 1
+dragutin petkov 1
+drain 1
+dral 1
+dram 8
+dram adv 1
+dram effect 1
+dram improv 1
+dram perform 1
+dram perform gain 1
+dram reduc 1
+dram speed 1
+dram speed continu 1
+dram st 1
+dram st reduc 1
+dramat 5
+dramat differ 1
+dramat smaller 1
+dramat smaller execut 1
+dramatiqu 1
+dramatiqu pouv 1
+drand48 1
+drapeau 1
+drapeau de 1
+drapeau de coupur 1
+drapeau doit 1
+drapeau doit etr 1
+drapeau en 1
+drapeau en par 1
+drapeau est 1
+drapeau est inv 1
+drapeau est syst 1
+drapeau et un 1
+drapeau instruc 1
+drapeau ne 1
+drapeau ne co 1
+drapeau nest 1
+drapeau nest toutef 1
+drapeau point 1
+drapeau point de 1
+drapeau qu 1
+drapeau s equenc 1
+drapeau superficiel 1
+drapeau superficiel devrait 1
+drapeau superficiel est 1
+drapeau superficiel indiqu 1
+drapeaux 1
+drapeaux et lim 1
+drapeaux peut 1
+drapeaux peut etr 1
+drapeaux superficiel 1
+drast 6
+drast chang 1
+drast reduc 1
+drast reduc pag 1
+drastiqu 1
+drastiqu despac 1
+drastiqu despac sur 1
+draw 20
+draw a character 1
+draw a circl 1
+draw a lin 1
+draw any subst 1
+draw at random 1
+draw attent 1
+draw by ad 1
+draw conclus 2
+draw consider 1
+draw consider research 1
+draw docum 1
+draw flac 1
+draw gener 1
+draw gener conclus 1
+draw method 1
+draw method assoc 1
+draw of scen 1
+draw real world 1
+draw th conclus 1
+draw th lin 1
+draw th stud 1
+draw their bound 1
+draw tool 2
+draw with record 1
+drawback 14
+drawback for using 1
+drawback of ch 1
+drawback of mi 1
+drawback of symbol 1
+drawback of work 1
+drawn 14
+drawn ar unlik 1
+drawn bold 1
+drawn can lead 1
+drawn for inst 1
+drawn from context 1
+drawn from gaus 1
+drawn from s4 1
+drawn indep 1
+drawn pict 1
+drawn pict dat 1
+drawn quer 1
+drawn to show 1
+drawn to tabl 1
+dream 1
+dream mach 1
+dref 1
+dref instruc 1
+drift 1
+drink 1
+drink coff 1
+driscol 1
+drisp 1
+driv 22
+driv a particl 1
+driv and goal 1
+driv and thus 1
+driv and us 1
+driv approach 1
+driv by prev 1
+driv execut 1
+driv execut model 1
+driv experim 1
+driv knowledg 1
+driv knowledg acqu 1
+driv principl 1
+driv proc 1
+driv recur 1
+driv recur neur 1
+driv seat 1
+driv siml 3
+driv siml result 1
+driv siml ti 1
+driv st 1
+driv st understand 1
+driv strateg 1
+driv strateg wh 1
+driv system 1
+driv th proc 1
+driv th reasoner 1
+driv understand 1
+driv util 1
+driv vl 1
+driv vl ar 1
+driver 4
+driver and belong 1
+driver and therefor 1
+driver attribut 1
+driver or protocol 1
+driver to support 1
+drivew 1
+drm 1
+droit 4
+droit a gauch 2
+droit dacc 1
+droit dacc es 1
+droit dan 1
+droit dan la 1
+droit dattendr 1
+droit dattendr del 1
+droit de 1
+droit de la 1
+droit de laffect 1
+droit de lectur 1
+droit de linstruc 1
+droit de lir 1
+droit en 1
+droit en ecritur 1
+droit en lectur 1
+droit et la 1
+droit lectur 1
+droit lectur ecritur 1
+droit n ecessair 1
+droit qu 1
+droit sur 1
+droit sur la 1
+droit sur un 1
+drop 18
+drop any receiv 1
+drop as inst 1
+drop from ec1 1
+drop funct 1
+drop funct run100 1
+drop half 1
+drop in gener 1
+drop not 1
+drop pack 2
+drop rand5 1
+drop rat 1
+drop run100 1
+drop signif 1
+drop th argum 1
+drop th ind 1
+drop th repr 1
+drop th subscript 1
+drop th var 1
+drop tim 1
+drop transm 1
+drop transm pack 1
+drop with larger 2
+drop workload 1
+drop workload pack 1
+droptim 1
+droptim oper 1
+drosophil 1
+drosophil et le 1
+drosophil melanogaster 1
+drost 1
+drug 1
+drug bust 1
+drug bust ca 1
+drug dog 1
+drug interdict 1
+drug smuggl 1
+drummon 1
+druschel 2
+druschel and bang 1
+druschel and gaurav 1
+druschel et al 1
+ds 4
+ds adag 1
+ds is simp 1
+ds se 1
+ds se transform 1
+ds82 1
+ds88a 1
+ds88b 1
+ds89 1
+dsb 2
+dsb86 1
+dsc 1
+dsc algorithm 1
+dsc algorithm assum 1
+dsc algorithm gener 1
+dsc algorithm track 1
+dsc algorithm us 1
+dsc etf 1
+dsc etf dl 1
+dsc md 1
+dsc md etf 1
+dsg 2
+dsg framework 1
+dsg in fig 1
+dsg ind 1
+dsg work 1
+dsg work paper 1
+dsj 1
+dsj al variabl 1
+dsj and minl 1
+dsj branch 1
+dsj branch rl 1
+dsj branch strateg 1
+dsj opt 1
+dsj perform 1
+dsj s0432 1
+dsj s0432 mean 1
+dsj strateg 1
+dsj variabl 1
+dsj variabl liter 1
+dsj wa found 1
+dsl 1
+dsl oper 1
+dsm 3
+dsm domain 1
+dsm implem 2
+dsm system 3
+dsm system ba 1
+dsm using 1
+dsm using multidest 1
+dsp 1
+dsp d del 1
+dsp dsp 1
+dsp follow 1
+dspl 1
+dssoul 1
+dst 1
+dst88 1
+dstein 1
+dt 8
+dt ad 1
+dt ad xi 1
+dt ct 1
+dt im 1
+dt t satisf 1
+dt2 1
+dtc 1
+dtim 1
+dtk 1
+dtp 2
+dtx2 1
+dty 1
+dty2 1
+du 91
+du a joachim 1
+du a la 2
+du a lab 1
+du a leff 1
+du a lensembl 1
+du a limpossibilit 1
+du a lutil 1
+du a tick 1
+du and dy 1
+du and j.s 1
+du and theorem 1
+du and wadg 1
+du attent 1
+du au 4
+du au ch 1
+du au fait 2
+du au hasard 1
+du au manqu 1
+du au par 1
+du au part 1
+du aux 1
+du aux acc 1
+du aux congru 1
+du aux lectur 1
+du aux propr 1
+du b en 1
+du banc 1
+du banc dan 1
+du bilan 1
+du bloc 2
+du bloc bn 1
+du bloc de 1
+du bloc par 1
+du bloc pr 1
+du bloc simpl 1
+du bloc simpl136 1
+du bootstrap 1
+du bruit 1
+du bruit de 1
+du bus 1
+du but arithm 1
+du but cibl 1
+du but correspon 1
+du but cour 1
+du but dan 1
+du but el 1
+du but en 1
+du but erron 1
+du but suiv 1
+du ca 1
+du ca de 1
+du ca ik 1
+du ca pm 1
+du cach 2
+du cach de 1
+du cacl 1
+du cacl par 1
+du cadr 1
+du cadr de 1
+du calcl 4
+du calcl afin 1
+du calcl de 2
+du calcl du 1
+du calcl est 1
+du calculateur 1
+du calculateur paragon 1
+du caract 1
+du cardin 1
+du cardin de 1
+du cerveau 1
+du cerveau dun 1
+du ch 4
+du ch de 2
+du ch du 1
+du ch est 1
+du ch optim 1
+du champ 1
+du champ attribut 1
+du champ de 1
+du champ valeur 1
+du chapitr 3
+du chapitr est 1
+du chapitr pr 1
+du chapitr th 1
+du co 2
+du co ut 2
+du cod 3
+du cod binair 1
+du cod cibl 1
+du cod consid 1
+du cod de 2
+du cod dinstr 1
+du cod du 1
+du cod eml 1
+du cod entr 1
+du cod figur 1
+du cod natif 1
+du cod obtenu 1
+du cod peut 1
+du cod pren 1
+du cod prolog 1
+du cod standard 1
+du cod trait 1
+du cod transform 1
+du comp 1
+du compilateur 2
+du compilateur gnu 1
+du compilateur modif 1
+du compilateur ne 1
+du compilateur ont 1
+du compilateur prolog 1
+du compilateur se 1
+du compilateur2 1
+du compilateur2 qu 1
+du comport 3
+du comport asymptotiqu 1
+du comport du 1
+du comport dun 1
+du comport temporel 1
+du compteur 1
+du compteur com 1
+du compteur entr 1
+du compteur est 1
+du compteur lor 1
+du compteur ordin 1
+du conflit 1
+du conflit est 1
+du conflit peut 1
+du conflit sur 1
+du context 1
+du context de 1
+du contr 2
+du contr ol 2
+du corollair 1
+du coroutin 1
+du coroutin dan 1
+du corp 1
+du corp de 1
+du cou 1
+du cou de 1
+du coupl 1
+du coupl ain 1
+du cr 1
+du cr est 1
+du cr mult 1
+du crit 1
+du cub 1
+du cub la 1
+du cub le 1
+du cub min 1
+du cub rest 1
+du d ecal 1
+du d eclench 1
+du d ecoup 1
+du d efaut 1
+du d el 1
+du d emar 1
+du d etr 1
+du d pl 1
+du d termin 1
+du degr 2
+du dern 1
+du dern argum 1
+du dern enregister 1
+du deux 1
+du deux em 1
+du domain 2
+du domain dit 1
+du domain init 1
+du domain sur 1
+du drapeau 1
+du drapeau en 1
+du drapeau ne 1
+du drapeau qu 1
+du fait 3
+du fait de 2
+du fait du 2
+du fait dun 1
+du fait qu 2
+du fait quel 2
+du faux 1
+du faux part 1
+du fit 1
+du fit car 1
+du fit li 1
+du flot 1
+du flot de 1
+du fold 1
+du fold goal 1
+du fon 1
+du fon de 1
+du fon du 1
+du foncteur 1
+du foncteur cour 1
+du foncteur nest 1
+du form 1
+du form de 1
+du fuseau 1
+du g enom 1
+du g nom 1
+du gestionnair 1
+du gestionnair de 1
+du gestionnair gestionnair 1
+du grain 1
+du grain de 1
+du graph 1
+du graph de 1
+du group 2
+du group de 2
+du jacob 1
+du jacob soit 1
+du jargon 1
+du jargon util 1
+du jeu 1
+du jeu dinstruc 1
+du jour 1
+du ki 1
+du ki em 1
+du lancer 1
+du lancer de 1
+du lang 2
+du lang de 2
+du lang fortran 1
+du lang ou 1
+du lang pa 1
+du lem 1
+du lem en 1
+du livr 1
+du log 1
+du log du 1
+du logiciel 1
+du logiciel de 1
+du m ecan 2
+du m em 3
+du m es 1
+du m etainterpr 1
+du major 1
+du major don 1
+du mal 1
+du manuscrit 2
+du march 1
+du marqu 1
+du marqu xi 1
+du mat 2
+du mat eriel 1
+du mat riel 1
+du maxim 1
+du maxim don 1
+du me 1
+du me lu 1
+du meilleur 1
+du meilleur de 1
+du micr 1
+du micr par 1
+du mil 1
+du mil pour 1
+du minim 1
+du minim calcl 1
+du minim th 1
+du mod 4
+du mod de 1
+du mod ecritur 1
+du mod el 3
+du mod le 1
+du modl 1
+du moin 1
+du moin conceptuel 1
+du moin sil 1
+du moment 1
+du moteur 1
+du moteur prolog 1
+du motif 1
+du mouv 1
+du mouv relatif 1
+du mouv tridimensionnel 1
+du n em 1
+du net 1
+du net de 1
+du nid 1
+du nid correspon 1
+du nid de 1
+du nid est 1
+du nid init 1
+du nid origin 1
+du nid sont 1
+du nid transform 1
+du nombr 5
+du nombr de 3
+du nombr dinv 1
+du nombr minim 1
+du nombr moy 1
+du nombr tot 2
+du non 2
+du non part 1
+du nouveau 3
+du nouveau domain 1
+du nouveau point 1
+du nouveau som 1
+du nouveau vecteur 2
+du nouvel 1
+du nouvel argum 1
+du nouvel etat 1
+du noyau 2
+du noyau constitu 1
+du noyau de 1
+du noyau dun 1
+du noyau dur 1
+du nuag 1
+du nuag auquel 1
+du o2 1
+du pa 3
+du pa de 1
+du pa est 1
+du pair 1
+du par 3
+du par elism 2
+du par lism 1
+du paragraph 1
+du paragraph avec 1
+du paragraph pr 1
+du param 2
+du param etr 2
+du parcour 1
+du parcour de 1
+du part 3
+du part de 1
+du part est 2
+du partit 1
+du partit de 1
+du partit en 1
+du partit justif 1
+du partit la 1
+du partit par 1
+du patron 1
+du patron jusqu 1
+du pav 1
+du pav etant 1
+du pav nay 1
+du pav ont 1
+du pav pr 1
+du pav sur 1
+du ph 2
+du ph enom 2
+du ping 1
+du ping pong 1
+du plac 1
+du plac init 1
+du plus anc 1
+du plus haut 1
+du plus petit 1
+du plus proch 1
+du point 3
+du point ch 1
+du point de 2
+du point dentr 1
+du point interm 1
+du point pr 1
+du pol 1
+du pol edr 1
+du potentiel 1
+du potentiel de 1
+du pr 2
+du pr ec 1
+du pr echarg 1
+du pr edicat 1
+du pr. 1
+du prem 3
+du prem argum 1
+du prem bloc 1
+du prem ca 2
+du prem champ 1
+du prem enf 1
+du prem enregister 1
+du prem ind 1
+du prem ordr 1
+du princip 1
+du princip de 1
+du probl 5
+du probl em 4
+du processeur 2
+du processeur en 1
+du processeur i860 1
+du processus 2
+du processus de 2
+du processus dunif 1
+du produit 3
+du produit matr 1
+du produit par 1
+du produit vectoriel 1
+du produit y.p 1
+du program 3
+du program au 1
+du program avec 1
+du program cycliqu 1
+du program de 1
+du program dmxp 1
+du program du 1
+du program en 1
+du program est 2
+du program fortran 1
+du program grand 1
+du program init 1
+du program llk18 1
+du program ne 1
+du program ont 1
+du program origin 1
+du program ou 1
+du program par 2
+du program partit 1
+du program perm 1
+du program pour 1
+du program quel 1
+du program sont 1
+du program transform 1
+du program zebr 1
+du programmeur 1
+du programmeur de 1
+du programmeur deux 1
+du programmeur ou 1
+du proj 2
+du proj fortran 1
+du propr 1
+du propr etair 1
+du protocol 1
+du protocol de 1
+du pseud 1
+du pseud pr 1
+du qu 1
+du r ecup 1
+du r eseau 3
+du r esultat 3
+du r ol 2
+du r seau 1
+du r sultat 1
+du rec 1
+du rec dim 1
+du recouvr 1
+du recouvr rn 1
+du recuit 1
+du recuit siml 1
+du register 1
+du register bp 1
+du register cp 1
+du regroup 1
+du regroup de 1
+du retard 1
+du retard du 1
+du retour 1
+du retour ar 1
+du retour superficiel 1
+du rout 1
+du rout de 1
+du scalair 1
+du scalair ff 1
+du sch 1
+du sch em 1
+du secon ca 1
+du secon pr 1
+du secon processeur 1
+du sen 1
+du sen dan 1
+du shar 1
+du shar fonct 1
+du sign 1
+du sign de 1
+du simpl 2
+du simpl au 1
+du simpl fait 1
+du simplec 1
+du simplec est 1
+du som 1
+du som de 1
+du som du 1
+du sous 1
+du sous arbr 1
+du spectr 1
+du spectr se 1
+du standard 1
+du support 1
+du support pour 1
+du surc 1
+du surc ut 1
+du sy 1
+du sy em 1
+du syst 4
+du syst em 4
+du tableau 2
+du tableau a.3 1
+du tableau dan 1
+du tableau de 1
+du tableau en 1
+du tableau es 1
+du tableau partag 1
+du tableau sont 1
+du tableau sur 1
+du taux 1
+du taux de 1
+du temp 3
+du temp de 2
+du temp dic 1
+du temp sont 1
+du temp tr 1
+du term 1
+du term comp 1
+du term est 1
+du term ti 1
+du test 1
+du test arithm 1
+du test de 1
+du th 2
+du th eor 2
+du to act 1
+du to at 1
+du to backtrack 1
+du to buffer 1
+du to bus 1
+du to cach 1
+du to cardel 1
+du to chang 1
+du to cluster 1
+du to coh 1
+du to compil 1
+du to control 1
+du to dav 2
+du to del 1
+du to experim 2
+du to extern 2
+du to fact 1
+du to fal 2
+du to fellow 1
+du to fin 1
+du to fragm 1
+du to glob 1
+du to grav 1
+du to head 1
+du to incorrect 1
+du to incr 3
+du to indirect 1
+du to inh 1
+du to kifer 1
+du to known 1
+du to larger 1
+du to li 1
+du to lim 3
+du to loc 2
+du to longer 1
+du to lutz 1
+du to marcel 1
+du to mark 1
+du to me 1
+du to minp 1
+du to multicast 1
+du to multipl 1
+du to network 1
+du to no 1
+du to nod 1
+du to non 1
+du to overlap 1
+du to phy 1
+du to pipel 1
+du to prev 1
+du to problem 1
+du to quant 1
+du to rectangl 1
+du to red 1
+du to remain 1
+du to retrief 1
+du to sequ 1
+du to shallow 1
+du to shar 1
+du to simultan 1
+du to spac 3
+du to specl 1
+du to split 1
+du to synchron 1
+du to tran 1
+du to univer 1
+du to var 1
+du to writ 2
+du to xk 1
+du tr 1
+du tr em 1
+du tr nag 1
+du traff 1
+du trait 2
+du trait de 1
+du trait par 1
+du transfer 1
+du transfer par 1
+du travail 2
+du travail glob 1
+du typ 3
+du typ 9ij 1
+du typ darchitectur 1
+du typ de 2
+du typ l0j 1
+du typ particl 1
+du typ simd 1
+du vecteur 4
+du vecteur al 1
+du vecteur auxilliair 1
+du vecteur de 1
+du vecteur dit 1
+du vecteur loc 1
+du vecteur norm 1
+du vecteur repr 1
+du verd 1
+du voisin 1
+du voisin ci 1
+du vol 1
+du vol de 1
+du voxel 1
+du voxel peut 1
+du voyageur 1
+du voyageur de 1
+du web 1
+du web qu 1
+du1 1
+du1 ssu1 1
+dual 12
+dual algorithm 1
+dual and f1 1
+dual and identif 1
+dual boolean 1
+dual boolean funct 1
+dual compar 1
+dual compar funct 1
+dual de 1
+dual de consid 1
+dual form 1
+dual func. 1
+dual funct 1
+dual funct contain 1
+dual funct f1 1
+dual funct f2 1
+dual funct fi 1
+dual funct g1 1
+dual funct pl 1
+dual if fd 1
+dual iff 1
+dual interior 1
+dual interior point 1
+dual major 1
+dual major funct 1
+dual method 1
+dual minor 1
+dual minor funct 1
+dual number 1
+dual number quatern 1
+dual of regl 1
+dual oper 2
+dual oper tw 1
+dual port 3
+dual port disk 1
+dual port interfac 1
+dual port memor 2
+dual proof 1
+dual proof system 1
+dual soient 1
+dual soient rencontr 1
+dual why 1
+dualit 1
+dualit e entr 1
+dualminor 1
+dualminor funct 1
+dualminor funct gener 1
+duat 1
+dub 7
+dub and f.a 1
+dub th bifoc 1
+dub their visu 1
+dub20 1
+dub21 1
+dubnick 1
+dubnick et t.j 1
+dubug 1
+dubug cl 1
+dubug cl dict 1
+duc 4
+duc de 1
+duc de leff 1
+duc in comput 1
+duc th dat 1
+ducateur 1
+ducateur de 1
+ducateur de facil 1
+ducatif 1
+ducatif et sociaux 1
+ducatif se 1
+ducatif se cont 1
+duceus 1
+duceus system 1
+duck.dfk.un 1
+duck.dfk.un sb.de 1
+dud 2
+dud and p.e 1
+duff 1
+duff and torbjorn 1
+duff to label 1
+dufour 2
+dufour ch 1
+dufresn 2
+dugan 1
+dugan is cod 1
+duij 1
+duij accord 1
+duir 1
+duir le 1
+duir le exp 1
+duir notam 1
+duir notam la 1
+duisberg 1
+duj 1
+duj is calcl 1
+duj real valu 1
+duk 2
+dum 9
+dum argum 2
+dum argum ge 1
+dum block 1
+dum connect 1
+dum docum 1
+dum el 1
+dum instruc 1
+dum is bound 1
+dum me 1
+dum partit 1
+dum partit el 1
+dum record 1
+dum symbol 1
+dum var 1
+dumb 2
+dumb network 1
+dumb network system 1
+dump 2
+dump th cor 1
+dump th nec 1
+dun 8
+dun acc 2
+dun acc el 1
+dun acc es 2
+dun accr 1
+dun accr au 1
+dun accr de 1
+dun ag 1
+dun ag classiqu 1
+dun ag en 1
+dun ag par 1
+dun agc 1
+dun agc est 1
+dun agenc 1
+dun agenc compat 1
+dun agenc de 1
+dun aid 1
+dun aid pr 1
+dun alg 1
+dun alg br 1
+dun algorithm 2
+dun algorithm de 1
+dun algorithm est 1
+dun algorithm par 1
+dun alloc 1
+dun alloc de 1
+dun alloc monolithiqu 1
+dun an 1
+dun an glob 1
+dun an statiqu 1
+dun appel 1
+dun appel au 1
+dun appel de 1
+dun appel direct 1
+dun appel indirect 1
+dun appel non 1
+dun approch 1
+dun arbr 1
+dun arbr de 1
+dun architectur 2
+dun architectur multiprocesseur 1
+dun architectur par 1
+dun argum 1
+dun argum du 1
+dun attribut 1
+dun aut 1
+dun autr 3
+dun autr processeur 1
+dun autr prot 1
+dun ba 1
+dun ba de 1
+dun biblioth 1
+dun biblioth equ 1
+dun biolog 1
+dun bloc 2
+dun bloc com 1
+dun bloc de 1
+dun bloc dinstruc 1
+dun bloc ne 1
+dun bloc ser 1
+dun bloc simpl 1
+dun bon 2
+dun bon equilibr 1
+dun bon gest 1
+dun bon sch 1
+dun boucl 1
+dun boucl apr 1
+dun boucl de 1
+dun boucl par 1
+dun boucl transform 1
+dun boucl vid 1
+dun branch 1
+dun branch conditionnel 1
+dun but arithm 1
+dun but modif 1
+dun but uniqu 1
+dun c ot 1
+dun ca 1
+dun ca particl 1
+dun calcl 2
+dun calcl matriciel 1
+dun calculateur 2
+dun calculateur par 1
+dun calculateur simd 1
+dun cel 1
+dun cel au 1
+dun cel c2 1
+dun cel correspon 1
+dun cel de 1
+dun certain 2
+dun certain man 1
+dun certain nombr 2
+dun certain valeur 1
+dun ch 2
+dun ch in 1
+dun ch ne 1
+dun champ 1
+dun champ argum 1
+dun champ arit 1
+dun champ cutpt 1
+dun chang 1
+dun chang de 1
+dun chromosom 1
+dun chromosom est 1
+dun cl 1
+dun cl particl 1
+dun claus 1
+dun claus alor 1
+dun claus ne 1
+dun claus non 1
+dun claus partag 1
+dun claus peut 1
+dun claus termin 1
+dun claus uniqu 1
+dun cod 2
+dun cod dit 1
+dun cod doit 1
+dun cod eml 1
+dun coh 1
+dun coh er 1
+dun colon 1
+dun colon co 1
+dun colon s 1
+dun combinaison 1
+dun combinaison lin 1
+dun comp 1
+dun comp de 1
+dun compil 1
+dun compil de 1
+dun compil glob 1
+dun compil incr 1
+dun compil ver 1
+dun compilateur 2
+dun compilateur pour 1
+dun compilateur raison 1
+dun comprom 1
+dun comprom entr 1
+dun compteur 1
+dun compteur sp 1
+dun conditionnel 1
+dun conflit 1
+dun conflit de 1
+dun conflit en 1
+dun conflit entr 1
+dun conflit est 1
+dun conflit osatur 1
+dun conflit sont 1
+dun confront 1
+dun confront entr 1
+dun conogur 1
+dun conogur tr 1
+dun consom 1
+dun const 1
+dun construc 1
+dun construc conditionnel 1
+dun coop 1
+dun coop erat 1
+dun corp 1
+dun corp de 1
+dun coupl 1
+dun coupl dindividus 1
+dun coupur 1
+dun coupur appar 1
+dun coupur correspon 1
+dun coupur dan 1
+dun coupur loc 1
+dun coupur ou 1
+dun coupur profon 1
+dun coupur standard 1
+dun coupur superficiel 1
+dun cr 1
+dun cr mult 1
+dun cycl 1
+dun d ebogueur 1
+dun d ecl 1
+dun d efaut 1
+dun d epen 1
+dun d eriv 1
+dun d etail 1
+dun d la 1
+dun de 2
+dun de claus 1
+dun de deux 1
+dun de typ 1
+dun debugger 1
+dun debugger prolog 1
+dun diffus 1
+dun diffus implicit 1
+dun dilat 1
+dun dilat de 1
+dun dispositif 1
+dun dispositif de 1
+dun dist 1
+dun dist de 1
+dun distribut 1
+dun distribut du 1
+dun domain 2
+dun domain dit 1
+dun don 1
+dun don ee 1
+dun drapeau 1
+dun dur 1
+dun dur ee 1
+dun echec 1
+dun echec avant 1
+dun echec dan 1
+dun echec potentiel 1
+dun echec pr 1
+dun ecritur 1
+dun ecritur sur 1
+dun eff 1
+dun eff ping 1
+dun efficacit 1
+dun el 1
+dun el ement 1
+dun elag 1
+dun elag retard 1
+dun empil 1
+dun empil par 1
+dun emulateur 1
+dun emulateur au 1
+dun ench 1
+dun ench nement 1
+dun enregister 1
+dun enregister dactiv 1
+dun enregister suppl 1
+dun ensembl 3
+dun ensembl de 2
+dun environ 2
+dun environ de 2
+dun environ doit 1
+dun environ est 1
+dun environ par 1
+dun environ tel 1
+dun espac 1
+dun espac dadr 1
+dun etap 1
+dun etap de 1
+dun etat 2
+dun etat ant 1
+dun etat dic 1
+dun etat ei 1
+dun etiqu 1
+dun etiqu cmp 1
+dun etiqu de 1
+dun etiqu indiqu 1
+dun etiqu sp 1
+dun etud 1
+dun etud pilot 1
+dun ev 1
+dun ev en 1
+dun eventuel 2
+dun eventuel appl 1
+dun eventuel pav 1
+dun eventuel solut 1
+dun ex 3
+dun ex ecut 3
+dun exempl 1
+dun ext 1
+dun ext prolog 1
+dun fa 2
+dun fa con 1
+dun fait 1
+dun famil 1
+dun famil libr 1
+dun faux 1
+dun faux part 1
+dun fonct 3
+dun fonct abstrait 1
+dun fonct co 1
+dun fonct de 2
+dun fonct ent 1
+dun fonct plafon 1
+dun fonct planch 1
+dun fonct quadratiqu 1
+dun fonct scalair 1
+dun foncteur 1
+dun foncteur perm 1
+dun forml 2
+dun forml logiqu 1
+dun g en 1
+dun gest 2
+dun gest de 1
+dun gest dynamiqu 1
+dun gest efficac 1
+dun gestionnair 1
+dun gestionnair de 1
+dun grain 1
+dun grand 3
+dun grand nombr 3
+dun grand sensibilit 1
+dun graph 1
+dun graph dordonnanc 1
+dun group 1
+dun group de 1
+dun horlog 1
+dun horlog glob 1
+dun hyperoctr 1
+dun hyperoctr de 1
+dun imag 1
+dun imag non 1
+dun impl 1
+dun impl em 1
+dun import 1
+dun import capit 1
+dun in egalit 1
+dun incr 1
+dun incr ement 1
+dun ind 1
+dun ind sur 1
+dun individu 1
+dun individu au 1
+dun individu fournit 1
+dun individu ne 1
+dun inst 1
+dun inst de 1
+dun instruc 2
+dun instruc aus 1
+dun instruc cal 1
+dun instruc de 1
+dun instruc dealloc 1
+dun instruc explicit 1
+dun instruc got 1
+dun instruc neck 1
+dun instruc proceed 1
+dun instruc retr 1
+dun instruc trust 1
+dun instruc try 1
+dun int 2
+dun int er 1
+dun int grat 1
+dun interfac 1
+dun interpr 1
+dun interpr es 1
+dun inver 1
+dun inver entr 1
+dun it erat 1
+dun l ment 1
+dun laboratoir 1
+dun laboratoir dimpl 1
+dun lang 2
+dun lang de 1
+dun larg cl 1
+dun lectur 1
+dun liaison 1
+dun liaison destruc 1
+dun liaison standard 1
+dun liaison sur 1
+dun lib 1
+dun lib erat 1
+dun list 1
+dun list par 1
+dun longu 1
+dun longu dur 1
+dun m ecan 1
+dun m em 2
+dun m emoir 2
+dun m es 1
+dun m ethod 1
+dun m triqu 1
+dun mach 3
+dun mach dit 1
+dun mach mun 1
+dun mach num 1
+dun man 2
+dun marqu 1
+dun marqu mk 1
+dun matr 3
+dun matr de 2
+dun matr satisf 1
+dun me 1
+dun me avec 1
+dun me court 1
+dun me onot 1
+dun mesur 2
+dun mesur li 1
+dun mi 2
+dun mi en 2
+dun microsecon 1
+dun milieu 1
+dun milieu poreux 1
+dun millisecon 1
+dun mod 3
+dun mod dic 1
+dun mod el 2
+dun mod sp 1
+dun mot 2
+dun mot de 1
+dun mot par 1
+dun moteur 1
+dun moteur prolog 1
+dun motif 1
+dun motif sp 1
+dun multipl 1
+dun multipl de 1
+dun mut 1
+dun mut tous 1
+dun mvp 1
+dun mvp dot 1
+dun mvp impl 1
+dun mvp mun 1
+dun mvp nintrodu 1
+dun mvp sappu 1
+dun mvp se 1
+dun net 1
+dun net de 1
+dun nid 1
+dun nid de 1
+dun niveau 1
+dun niveau de 1
+dun noeud 1
+dun noeud etiqu 1
+dun nombr 1
+dun nombr fin 1
+dun nouveau 2
+dun nouveau champ 1
+dun nouveau mod 1
+dun nouveau point 1
+dun nouveau register 1
+dun nouveau typ 1
+dun nouvel 3
+dun nouvel echec 1
+dun nouvel environ 1
+dun nouvel mi 1
+dun nouvel op 1
+dun nouvel popl 1
+dun nouvel var 1
+dun num 1
+dun num er 1
+dun op 4
+dun op erat 3
+dun op erateur 1
+dun op rat 1
+dun opt 1
+dun opt de 1
+dun optim 2
+dun optim bien 1
+dun or 1
+dun ordonnanc 1
+dun organ 1
+dun organ de 1
+dun ou 1
+dun ou deux 1
+dun ou quatr 1
+dun pa 2
+dun pa la 1
+dun pa minim 1
+dun pa. 1
+dun pag 1
+dun pag afin 1
+dun pag com 1
+dun pag conflictuel 1
+dun pag en 1
+dun pag entr 1
+dun pag est 1
+dun pag sur 1
+dun pagec 1
+dun par 1
+dun par elism 1
+dun param 1
+dun param etr 1
+dun part 5
+dun part acc 1
+dun part daugmenter 1
+dun part de 2
+dun part il 1
+dun part la 1
+dun part lacc 1
+dun part le 2
+dun part parc 1
+dun part quun 1
+dun part transmettr 1
+dun part un 2
+dun partit 1
+dun partit adapt 1
+dun partit de 1
+dun partit par 1
+dun patron 1
+dun pav 1
+dun peu 1
+dun peu de 1
+dun ph 1
+dun ph doptim 1
+dun pil 1
+dun pil de 1
+dun pil doubl 1
+dun pil uniqu 1
+dun point 4
+dun point de 3
+dun point du 1
+dun point init 1
+dun point uniqu 1
+dun point x0 1
+dun pointeur 1
+dun pointeur sur 1
+dun pol 2
+dun pol edr 2
+dun popl 1
+dun popl etat 1
+dun pr 3
+dun pr ci 1
+dun pr ec 1
+dun pr edicat 1
+dun pr ef 1
+dun prem 1
+dun prim 2
+dun prim al 1
+dun probabilit 1
+dun probl 2
+dun probl em 2
+dun proc edur 1
+dun processeur 1
+dun processeur avec 1
+dun processeur sur 1
+dun processus 1
+dun processus de 1
+dun program 2
+dun program dhydrodynamiqu 1
+dun program en 1
+dun program le 1
+dun program par 1
+dun proposit 1
+dun protocol 1
+dun protocol de 1
+dun prus 1
+dun prus analog 1
+dun quest 1
+dun quest particl 1
+dun r ecup 1
+dun r educ 2
+dun r ef 2
+dun r eseau 1
+dun r esolut 1
+dun r eutil 1
+dun reconstruc 1
+dun reconstruc de 1
+dun register 1
+dun register argum 1
+dun register bp 1
+dun register gb 1
+dun register lb 1
+dun register suppl 1
+dun regroup 1
+dun regroup de 1
+dun repr 3
+dun repr es 2
+dun repr esent 1
+dun restrict 1
+dun restrict de 1
+dun retour 1
+dun retour ar 1
+dun retour profon 1
+dun s emantiqu 1
+dun s equ 2
+dun sauvegard 1
+dun sauvegard de 1
+dun scalair 1
+dun scalair par 1
+dun sch 2
+dun sch em 2
+dun secon drapeau 1
+dun sect 1
+dun sect de 1
+dun sel 3
+dun sel dim 1
+dun sel ten 1
+dun siml 1
+dun siml pr 1
+dun simpl 1
+dun simpl diminut 1
+dun simpl indirect 1
+dun simpl lectur 1
+dun soixantain 1
+dun soixantain de 1
+dun solut 2
+dun solut ent 1
+dun solut est 1
+dun solut optim 1
+dun solut par 1
+dun solut sur 1
+dun som 2
+dun som ch 1
+dun som sur 1
+dun sous 3
+dun sous arbr 1
+dun sous espac 1
+dun sous popl 1
+dun strict 1
+dun strict modif 1
+dun structur 2
+dun structur de 2
+dun subdiv 1
+dun subdiv discr 1
+dun super 1
+dun super individu 1
+dun superindividu 1
+dun synchron 1
+dun synchron dan 1
+dun syst 3
+dun syst em 3
+dun tabl 1
+dun tabl dadr 1
+dun tabl de 1
+dun tableau 1
+dun tableau 2d 1
+dun tableau par 1
+dun tail 1
+dun tail denviron 1
+dun tail fic 1
+dun taux 1
+dun taux elev 1
+dun tel 4
+dun tel cel 1
+dun tel compr 1
+dun tel etat 1
+dun tel laboratoir 1
+dun tel matr 1
+dun tel minim 1
+dun tel not 1
+dun tel register 1
+dun tel sect 1
+dun tel solut 1
+dun tel transform 1
+dun tent 1
+dun tent dunif 1
+dun term 1
+dun term comp 1
+dun term instanc 1
+dun term repr 1
+dun test 1
+dun test de 1
+dun th 1
+dun th or 1
+dun tir 1
+dun tir au 1
+dun tr 1
+dun tr em 1
+dun trajectoir 1
+dun transform 2
+dun transform de 2
+dun transform lin 1
+dun transform nest 1
+dun transform non 1
+dun travail 1
+dun trou 1
+dun trou sur 1
+dun tumeur 1
+dun typ 1
+dun typ de 1
+dun unif 1
+dun unif de 1
+dun unif entr 1
+dun unif qu 1
+dun util 1
+dun util de 1
+dun val 1
+dun val cliniqu 1
+dun valeur 1
+dun var 2
+dun var abstrait 1
+dun var al 1
+dun var dan 1
+dun var don 1
+dun var gel 1
+dun var perman 1
+dun var pren 1
+dun vecteur 1
+dun ver 1
+dun ver revu 1
+dun ver sp 1
+dun vi 1
+dun vi prescript 1
+duncan 1
+dunif 1
+dunif avec 1
+dunif avec etiqu 1
+dunif com 1
+dunif com nous 1
+dunif condu 1
+dunif d er 1
+dunif de 1
+dunif de hu 1
+dunif de man 1
+dunif de prolog 1
+dunif dun 1
+dunif dun var 1
+dunif est 1
+dunif est ai 1
+dunif et le 1
+dunif etendu 1
+dunif etendu en 1
+dunif etendu sous 1
+dunif ext 1
+dunif ext declip 1
+dunif ext ne 1
+dunif init 1
+dunif init prop 1
+dunif le 1
+dunif le deux 1
+dunif me 1
+dunif me unif 1
+dunif peut 1
+dunif peut etr 1
+dunif post 1
+dunif post erieur 1
+dunif pour 1
+dunif pour prendr 1
+dunif pren 1
+dunif pren deux 1
+dunif q dan 1
+dunif qu 1
+dunif qu peuv 1
+dunif r eel 1
+dunif sont 1
+dunif sont de 1
+dunif un param 1
+dunigan 1
+dunimodularit 1
+dunimodularit e ne 1
+dunimodularit e pouvait 1
+dunimodularit e sur 1
+dupl 15
+dupl addr 1
+dupl addr per 1
+dupl addr td 1
+dupl al requir 1
+dupl ar allow 1
+dupl ar creat 1
+dupl befor load 1
+dupl connect 1
+dupl d simplif 1
+dupl de 2
+dupl de cibl 1
+dupl de don 1
+dupl detect 1
+dupl el 1
+dupl int uniqu 1
+dupl lifetim 1
+dupl lifetim host 1
+dupl lifetim td 1
+dupl me 1
+dupl of funct 1
+dupl of me 1
+dupl or corrupt 1
+dupl or disp 1
+dupl pack 1
+dupl path 1
+dupl rol 1
+dupl rol begin 1
+dupl serv 1
+dupl tupl 1
+dupl valu 2
+duplicateelim 1
+duplicateelim step 1
+dupliqu 1
+dupliqu du 1
+dupliqu du cod 1
+dupliqu ee 1
+dupliqu ee lor 1
+dupliqu pa 1
+dupliqu pa dinform 1
+dupliquer 3
+dupliquer chaqu 1
+dupliquer chaqu individu 1
+dupliquer la 1
+dupliquer la repr 1
+dupliquer le 1
+dupliquer le sect 1
+dupliquer linstruc 1
+dupliquer linstruc alloc 1
+dupliquer tout 1
+dupliquer tout le 1
+dupont 1
+duquel 1
+duquel la 1
+duquel la pag 1
+dur 14
+dur and contain 1
+dur by writ 1
+dur ce 1
+dur ce an 1
+dur ce ph 1
+dur du 1
+dur du proj 1
+dur e dun 1
+dur ee 3
+dur ee al 1
+dur ee augm 1
+dur ee cuml 1
+dur ee datteint 1
+dur ee de 3
+dur ee dist 1
+dur ee du 1
+dur ee dun 1
+dur ee entr 1
+dur ee est 1
+dur ee fin 1
+dur ee mac 1
+dur ee maxim 1
+dur ee minim 1
+dur ee obtenu 1
+dur ee sont 1
+dur ee var 1
+dur ee zj 1
+dur for group 1
+dur for med 1
+dur involut 1
+dur la 1
+dur la prem 1
+dur lec 1
+dur lec ecut 1
+dur of mutu 1
+dur of simultan 1
+dur record 1
+dur record und 1
+dur se 1
+dur se dur 1
+dur subtransact 1
+dur tout 1
+dur tout ce 1
+dur tout lec 1
+dur un 1
+dur un boucl 1
+dur un ex 1
+dur un ph 1
+dur util 1
+dur util es 1
+dur why 1
+durch 1
+durch parallelisierung 1
+durham 1
+dus 3
+dus a la 1
+dus au 1
+dus au tr 1
+dus aux 1
+dus aux born 1
+dus aux conflit 1
+dus aux ph 1
+dus zieger 1
+dut 2
+dut funct 1
+dut requir 1
+dut requir assoc 1
+dut requir titl 1
+dutil 3
+dutil de 3
+dutil de la 1
+dutil de lop 1
+dutil de pag 1
+dutil de processeur 1
+dutil du 1
+dutil du micr 1
+dutil et donc 1
+dutiliser 3
+dutiliser ce 3
+dutiliser ce techniqu 1
+dutiliser ce typ 1
+dutiliser ce var 1
+dutiliser de 1
+dutiliser de obj 1
+dutiliser deux 1
+dutiliser deux pil 1
+dutiliser et de 1
+dutiliser la 2
+dutiliser la pag 1
+dutiliser la pil 1
+dutiliser ladr 1
+dutiliser larg 1
+dutiliser larg laffinit 1
+dutiliser le 2
+dutiliser le facilit 1
+dutiliser le register 1
+dutiliser lexpan 1
+dutiliser lexpan de 1
+dutiliser un 3
+dutiliser un approxim 1
+dutiliser un cod 1
+dutiliser un congru 1
+dutiliser un ext 1
+dutiliser un mod 1
+dutiliser un repr 1
+dutiliser un sel 1
+dutiliser un techniqu 1
+dutiliser un vecteur 1
+dutilit 1
+dutilit e de 1
+dutilit e doit 1
+dutilit e du 1
+duumvir 1
+duumvir of control 1
+duz 1
+dv92 1
+dvorak 1
+dvorak conclus 1
+dw 2
+dw correspon 1
+dw is broadcast 1
+dw vect 1
+dw1 1
+dw2 1
+dw3 1
+dw92 1
+dwarf 3
+dwarf csg 1
+dwarf csg tr 1
+dwarf th cost 1
+dwarf th tim 1
+dwb 1
+dwheeler.html 1
+dwjk 1
+dwjk and duij 1
+dwk 1
+dwk in dw 1
+dwk real valu 1
+dwk2 1
+dwk2 is sum 1
+dwk2 valu 1
+dwork 1
+dwork and waart 1
+dwt 1
+dwt coeff 1
+dwt for no 1
+dwt in order 1
+dwt is describ 1
+dwt is us.2 1
+dwt sometim exhibit 1
+dwt threshold 1
+dww 1
+dx 7
+dx 1e 1
+dx 1e lin 1
+dx c wh 1
+dx dy 1
+dx env 1
+dx term 1
+dxb 1
+dxb lin 1
+dxb x bxec 1
+dxg 1
+dxl 1
+dxp 1
+dxp ff 1
+dxu 1
+dy 4
+dy enlever 1
+dy enlever certain 1
+dy env 1
+dy introduir 1
+dy introduir lit 1
+dyad 3
+dyad conver 1
+dyad rel 1
+dyad resc 1
+dyad resc ver 1
+dyer 1
+dylan 1
+dynam 57
+dynam accord 1
+dynam ad 2
+dynam ad instruc 1
+dynam algorithm 1
+dynam alloc 3
+dynam alloc dat 1
+dynam alloc proc 1
+dynam alloc task 1
+dynam an 1
+dynam and adapt 1
+dynam and modif 1
+dynam and mont 1
+dynam appl 1
+dynam ar 1
+dynam ar complec 1
+dynam ar contain 1
+dynam aspect 5
+dynam assign 1
+dynam assign ip 1
+dynam backpropag 1
+dynam backpropag network 1
+dynam behavior 1
+dynam behaviour 1
+dynam bind 4
+dynam bind caus 1
+dynam bind ext 1
+dynam bind problem 1
+dynam bound 1
+dynam bp 1
+dynam bp algorithm 1
+dynam bp model 1
+dynam branch 2
+dynam branch predict 1
+dynam buffer 1
+dynam buffer pool 1
+dynam chang 4
+dynam chang model 1
+dynam chang problem 1
+dynam character 2
+dynam closest 1
+dynam closest handler 1
+dynam cluster 1
+dynam cluster maint 1
+dynam compon 1
+dynam composit 1
+dynam comput 1
+dynam con 1
+dynam con algorithm 1
+dynam configur 1
+dynam configur object 1
+dynam construc 1
+dynam construc accord 1
+dynam context 1
+dynam creat 2
+dynam creat tr 1
+dynam criter 1
+dynam custom 1
+dynam cut 1
+dynam dat 3
+dynam dat load 1
+dynam dat sb 1
+dynam datab 1
+dynam dataflow 2
+dynam dataflow computer 1
+dynam dataflow mach 2
+dynam dataflowinspir 1
+dynam dataflowinspir conv 1
+dynam db 1
+dynam db upd 1
+dynam decentr 1
+dynam decentr cach 1
+dynam del 1
+dynam del intersect 1
+dynam dep 2
+dynam dep an 1
+dynam dep list 1
+dynam determin 1
+dynam direct 1
+dynam direct acycl 1
+dynam driv 1
+dynam driv recur 1
+dynam dur learn 1
+dynam emb 1
+dynam encl 1
+dynam encl dynam 1
+dynam environm 4
+dynam error 1
+dynam evolut 1
+dynam exchang 1
+dynam exchang control 1
+dynam ext 1
+dynam extent 1
+dynam f ye 1
+dynam feedfor 1
+dynam fil 1
+dynam fil alloc 1
+dynam in natur 1
+dynam in softwar 1
+dynam ind 1
+dynam ind structur 1
+dynam ind techniqu 1
+dynam infer 1
+dynam inst 1
+dynam integr 1
+dynam integr constraint 1
+dynam interact 1
+dynam interact context 1
+dynam knowledg 1
+dynam knowledg ba 1
+dynam langu 1
+dynam le 1
+dynam learn 2
+dynam level 1
+dynam level schedl 1
+dynam link 2
+dynam link cost 1
+dynam load 3
+dynam load bal 1
+dynam load dat 1
+dynam loadb 1
+dynam loadb techniqu 1
+dynam log 2
+dynam log con 1
+dynam log inclus 1
+dynam log modl 1
+dynam loop 1
+dynam loop schedl 1
+dynam map 1
+dynam memor 2
+dynam memor manag 1
+dynam menu 1
+dynam menu system 1
+dynam model 1
+dynam modl 1
+dynam modl alloc 1
+dynam natur 1
+dynam network 3
+dynam network architectur 1
+dynam object 1
+dynam object orient 1
+dynam object system 1
+dynam of evolut 1
+dynam of finit 1
+dynam of object 1
+dynam of proof 1
+dynam of rout 1
+dynam overhead 1
+dynam parallel 1
+dynam parallel algorithm 1
+dynam part 2
+dynam permut 1
+dynam permut network 1
+dynam pr 1
+dynam problem 1
+dynam program 4
+dynam program algorithm 2
+dynam program alignm 1
+dynam program procedur 1
+dynam program recur 1
+dynam program solut 1
+dynam proper 1
+dynam rang 2
+dynam re decluster 1
+dynam recogn 1
+dynam reconfigur 1
+dynam relationship 1
+dynam sc 1
+dynam sc an 1
+dynam scop 1
+dynam scop bind 1
+dynam se 1
+dynam setq 1
+dynam shar 1
+dynam shar resourc 1
+dynam slot 1
+dynam slot acc 1
+dynam solut 1
+dynam strateg 1
+dynam system 2
+dynam system identif 1
+dynam system using 1
+dynam tag 1
+dynam tag approach 1
+dynam tag schem 1
+dynam test 1
+dynam test unfortun 1
+dynam text 1
+dynam text cr 1
+dynam that ar 1
+dynam to react 1
+dynam topolog 2
+dynam trac 1
+dynam transact 1
+dynam transact rout 1
+dynam treatm 1
+dynam typ 3
+dynam typ langu 1
+dynam typ object 1
+dynam un explicit 1
+dynam unrel 1
+dynam using 1
+dynam valu 1
+dynam var 1
+dynam virtu 1
+dynam virtu memor 1
+dynam whil perform 1
+dynam work 1
+dynam work distribut 1
+dynam world 1
+dynamik 1
+dynamik der 1
+dynamik der luft 1
+dynamiqu 3
+dynamiqu de 3
+dynamiqu de algorithm 1
+dynamiqu de claus 1
+dynamiqu de environ 1
+dynamiqu de la 2
+dynamiqu de lop 1
+dynamiqu de param 1
+dynamiqu de processus 1
+dynamiqu efficac 1
+dynamiqu efficac de 1
+dynamiqu gr 1
+dynamiqu gr ac 1
+dynamiqu reconfigur 1
+dynamiqu suiv 1
+dynamiqu suiv qu 1
+dyspn 1
+e.a 2
+e.d 2
+e.e 1
+e.f 3
+e.h 1
+e.j 1
+e.l 3
+e.m.morgad 1
+e.n 1
+e.n.s 1
+e.t 1
+e.t.c 1
+e0 16
+e0 a sub 1
+e0 bridg 1
+e0 bridg connect 1
+e0 con 1
+e0 correspon 1
+e0 e t1 1
+e0 e0 1
+e0 e0 t2 1
+e0 e1 1
+e0 e1 t1 1
+e0 e1 t2 1
+e0 e2 1
+e0 e2 t2 1
+e0 el 1
+e0 el e00 1
+e0 hd 1
+e0 impl 1
+e0 is defin 1
+e0 j setcdr 1
+e0 k iff 1
+e0 nil 1
+e0 oe 1
+e0 oe0 1
+e0 oe1 1
+e0 on input 1
+e0 op 1
+e0 s op 1
+e0 say 1
+e0 t2 1
+e0 th result 1
+e0 that bridg 1
+e0 tl 1
+e0 tr 1
+e0 tr edg 1
+e0 v t1 1
+e0 wh addit 1
+e00 4
+e00 strong 1
+e00 strong weakt 1
+e00 wh 1
+e00i 1
+e00j 2
+e00j avec 1
+e01 4
+e01 and e1 1
+e01 ar yellow 1
+e01 describ 1
+e01 satisf 1
+e01 u1w1 1
+e02 2
+e02 is yellow 1
+e02 u2w2 1
+e02g 1
+e0i 1
+e0i and e0j 1
+e0i ar unmark 1
+e0i ar yellow 1
+e0i describ 1
+e0i e0j 1
+e0i encl 1
+e0i is mark 1
+e0i is yellow 1
+e0j 2
+e0j et e00j 1
+e0j shar 1
+e0jg 1
+e0k 1
+e0k and ek 1
+e0k describ 1
+e0k satisf 1
+e0m 1
+e0m describ 1
+e0m satisf 1
+e0m satisf e2 1
+e1 21
+e1 and e2 2
+e1 and therefor 1
+e1 e1 1
+e1 e2 7
+e1 e2 e3 1
+e1 e2 instead 1
+e1 e2 mod 1
+e1 e2 t1 1
+e1 e2 wh 1
+e1 e500 1
+e1 el 1
+e1 el e2 1
+e1 encl 1
+e1 et e2 1
+e1 if pi 1
+e1 occur 1
+e1 satisf 1
+e1 t1 1
+e1 t2 1
+e1 to e500 1
+e1 v1v01 1
+e1.i.j 1
+e10 2
+e10 e14 1
+e100 1
+e100 e143 1
+e14 2
+e14 n 2ds 1
+e143 1
+e143 ar select 1
+e144 1
+e144 and dnameu 1
+e144 and sal 1
+e190 1
+e190 and dnameu 1
+e190 and sal 1
+e199 1
+e1e2 1
+e1t 1
+e1t im e2t 1
+e2 18
+e2 ar expr 1
+e2 ar polynom 1
+e2 but v1 1
+e2 e1 1
+e2 e3 1
+e2 e3 e4 1
+e2 et tel 1
+e2 iff 1
+e2 instead 1
+e2 is satisf 1
+e2 logn 1
+e2 mac 1
+e2 mod 1
+e2 mod ap 1
+e2 ne1 1
+e2 occur 1
+e2 pren 1
+e2 pren la 1
+e2 sur 1
+e2 sur la 1
+e2 t1 1
+e2 t1 t2 1
+e2 t2 1
+e2 v2v002 1
+e2 wh 1
+e2 wh e1 1
+e2b 1
+e2e 1
+e2g 1
+e2ji 1
+e2k 1
+e2k it suf 1
+e2l 1
+e2l 4l5 1
+e2np 1
+e2t 1
+e2t im 1
+e2t im e3t 1
+e3 4
+e3 e4 1
+e3t 1
+e3t im eit 1
+e4 2
+e5 2
+e500 1
+e500 as shown 1
+e6 2
+e7 1
+e8 1
+e9 1
+ea 102
+ea acc 1
+ea accommod 1
+ea accompl 2
+ea achief 2
+ea acr system 1
+ea adapt 3
+ea algorithm 1
+ea analogon 1
+ea and control 1
+ea and eff 1
+ea and safer 1
+ea appl 1
+ea approxim 1
+ea approxim se 1
+ea autom 1
+ea av 1
+ea b const 1
+ea ba 1
+ea be appl 1
+ea be car 1
+ea be chang 1
+ea be check 1
+ea be combin 1
+ea be comput 1
+ea be determin 1
+ea be expr 1
+ea be ext 1
+ea be fit 1
+ea be forc 1
+ea be found 1
+ea be gener 1
+ea be implem 1
+ea be modif 1
+ea be plug 1
+ea be replac 1
+ea be shown 2
+ea be str 1
+ea becom 1
+ea bound 1
+ea bridg 1
+ea build 1
+ea build arbitr 1
+ea by calcl 1
+ea by simp 1
+ea ca 1
+ea chang 1
+ea check 2
+ea combin 1
+ea comput 3
+ea conclus 1
+ea construc 1
+ea correspon 1
+ea count 1
+ea count se 1
+ea d good 1
+ea dec 1
+ea deduc 1
+ea deduc using 1
+ea del 1
+ea der 1
+ea deriv 2
+ea deriv using 1
+ea describ 1
+ea describ synchron 1
+ea detect 1
+ea determin 1
+ea disrupt 1
+ea disrupt build 1
+ea distribut 1
+ea do think 1
+ea evalu 1
+ea exampl 1
+ea exploit 2
+ea ext 8
+ea ext modl 1
+ea follow 4
+ea for object 1
+ea for oo 1
+ea form 1
+ea from convec 1
+ea hard ea 1
+ea identif 3
+ea if abstract 1
+ea ignor 1
+ea ignor com 1
+ea imp 1
+ea imp proof 1
+ea implem 4
+ea in intern 1
+ea in sect 1
+ea incorpor 1
+ea inst 1
+ea integr 1
+ea integr fr 1
+ea interchang 1
+ea interfac 1
+ea is loc 1
+ea iter 1
+ea langu 1
+ea lead 1
+ea learn 1
+ea maint 1
+ea maintain 1
+ea mak 1
+ea master 1
+ea mean 1
+ea modif 2
+ea mov 1
+ea not 1
+ea obtain 1
+ea occur 1
+ea of administer 1
+ea of disc 1
+ea of exposit 1
+ea of ext 1
+ea of illustr 1
+ea of implem 1
+ea of inst 1
+ea of maint 2
+ea of read 1
+ea of rout 1
+ea of softwar 1
+ea of specif 1
+ea of understand 1
+ea of us 2
+ea on 1
+ea on bal 1
+ea on com 1
+ea outperform 1
+ea overlook 1
+ea par 2
+ea par langu 1
+ea par lutil 1
+ea parallel 1
+ea pattern 1
+ea perform 1
+ea port 1
+ea problem 1
+ea program 1
+ea prov 4
+ea quest 1
+ea r01 1
+ea r02 1
+ea re evalu 1
+ea read 1
+ea reason 1
+ea recogn 1
+ea remember 1
+ea remember rang 1
+ea remember se 1
+ea rl 1
+ea scal 2
+ea se 1
+ea seen 3
+ea show 1
+ea shown 2
+ea slow 1
+ea solut 3
+ea solut numer 1
+ea step 1
+ea support 1
+ea task 3
+ea te 1
+ea tel 1
+ea th administer 1
+ea th design 1
+ea th implem 1
+ea th problem 1
+ea th task 2
+ea than introduc 1
+ea to accommod 1
+ea to ad 3
+ea to adapt 1
+ea to answer 1
+ea to begin 1
+ea to bring 1
+ea to check 2
+ea to collect 1
+ea to com 1
+ea to comput 1
+ea to confirm 1
+ea to cr 1
+ea to debug 1
+ea to depl 1
+ea to der 1
+ea to describ 1
+ea to design 1
+ea to detect 1
+ea to determin 1
+ea to develop 1
+ea to distribut 1
+ea to establ 1
+ea to estim 2
+ea to evolut 1
+ea to extract 1
+ea to find 1
+ea to follow 2
+ea to handl 1
+ea to identif 2
+ea to impl 8
+ea to keep 1
+ea to learn 1
+ea to lo 1
+ea to maintain 3
+ea to multip 1
+ea to observ 2
+ea to obtain 1
+ea to perform 1
+ea to proc 1
+ea to prov 3
+ea to put 1
+ea to read 1
+ea to reason 1
+ea to remov 1
+ea to retrief 1
+ea to reus 1
+ea to se 19
+ea to shar 2
+ea to show 6
+ea to spec 1
+ea to specif 1
+ea to transform 1
+ea to transl 1
+ea to triangl 1
+ea to tun 1
+ea to understand 5
+ea to upd 1
+ea to us 8
+ea to var 1
+ea to verif 7
+ea to work 1
+ea to writ 2
+ea tracc 1
+ea tracc tr01 1
+ea tracc tr02 1
+ea transl 2
+ea ttl 1
+ea ttl ee 1
+ea turn 1
+ea turn interact 1
+ea understand 1
+ea understood 2
+ea upper 1
+ea upper bound 1
+ea us 1
+ea verif 4
+ea visu 1
+ea with fact 1
+ea with mi 1
+ea wright 1
+ea wright atl 1
+ea www 2
+ea www bertrand.html 2
+ea www cbl.paper 1
+ea www freetext 1
+ea www www94 1
+ea1 1
+ea1 th interact 1
+ea73 1
+eab 1
+eabilit 1
+eabilit e dun 1
+each.in 1
+each.in th aver 1
+ead 1
+ead91 1
+eagan 1
+eager 11
+eager and increm 1
+eager icon 1
+eager implem 1
+eager increm 1
+eager increm con 1
+eager inst 1
+eager inst variabl 1
+eager is simil 1
+eager maintain 1
+eager to cr 1
+eager6 1
+eair 4
+eair assoc 1
+eair assoc ee 1
+eair avec 1
+eair avec le 1
+eair avec tc 1
+eair de 1
+eair de boucl 1
+eair de dj 1
+eair de nid 1
+eair du 1
+eair du typ 1
+eair en 2
+eair en fonct 1
+eair en nombr 1
+eair ent 1
+eair ent er 1
+eair et gril 1
+eair ind 1
+eair ind epen 1
+eair non 1
+eair non ent 1
+eair posit 1
+eair posit de 1
+eair pouvait 1
+eair pouvait etr 1
+eair sur 1
+eair sur le 1
+eair unimodulair 1
+eak 1
+eal 8
+eal dan 1
+eal dan le 1
+eal dapr 1
+eal dapr es 1
+eal de 3
+eal de la 2
+eal de lenviron 1
+eal de vecteur 1
+eal dun 2
+eal dun dur 1
+eal dun environ 1
+eal dun espac 1
+eal e en 1
+eal ee 4
+eal ee dan 1
+eal ee par 1
+eal ee pour 1
+eal ee soit 1
+eal es 1
+eal es par 1
+eal ffl canad 1
+eal le 1
+eal peuv 1
+eal peuv etr 1
+eal pu 1
+eal pu prendr 1
+eal then prescrib 1
+ealabl 1
+ealabl publ 1
+ealabl publ es 1
+ealiser 4
+ealiser aut 1
+ealiser aut de 1
+ealiser de 1
+ealiser de val 1
+ealiser l etap 1
+ealiser la 1
+ealiser la reproduc 1
+ealiser le 1
+ealiser le retour 1
+ealit 2
+eambl 1
+ean 1
+ean term 1
+eanc 1
+eanc de 1
+eanc de lop 1
+eanc est 1
+eanc est la 1
+eaniqu 1
+eanmoin 2
+eanmoin a plusieur 1
+eanmoin d emontr 1
+eanmoin de 1
+eanmoin de la 1
+eanmoin de probl 1
+eanmoin de souligner 1
+eanmoin garder 1
+eanmoin lav 1
+eanmoin lav de 1
+eanmoin le 1
+eanmoin le techniqu 1
+eanmoin limport 1
+eanmoin limport de 1
+eanmoin qu 1
+eanmoin qu la 1
+eanmoin qu le 1
+eanmoin qu quelqu 1
+eanmoin quil 1
+eanmoin quil peut 1
+eanmoin remarquer 1
+eanmoin remarquer qu 1
+eant 1
+eant ain 1
+eant de 1
+eant de foncteur 1
+eappar 1
+eappar t avec 1
+ear 2
+ear ee 1
+ear ee de 1
+earl 54
+earl and st 1
+earl approach 1
+earl as nw 1
+earl assum 1
+earl by anderson 1
+earl by ten 1
+earl draft 8
+earl exampl 1
+earl exampl becom 1
+earl experim 1
+earl in fig 3
+earl in figur 1
+earl in sec 1
+earl is ba 1
+earl is perform 1
+earl is shown 1
+earl joint 1
+earl joint work 1
+earl not 1
+earl out 1
+earl paper 2
+earl part 1
+earl report 1
+earl research 2
+earl sect 1
+earl slot 1
+earl stack 1
+earl stack entr 1
+earl stud 2
+earl th phy 1
+earl than pi 1
+earl theor 1
+earl tim 2
+earl tim step 1
+earl timesl 1
+earl timestamp 1
+earl ver 8
+earl ver appear 2
+earl we introduc 1
+earl work 6
+earl work ment 1
+earliest 7
+earliest deadl 1
+earliest du 1
+earliest pi 1
+earliest po tim 1
+earliest requir 1
+earliest slot 1
+earliest start 1
+earliest start tim 1
+earliest task 1
+earliest tim 2
+earn 1
+earth 1
+earth sc 1
+easiest 5
+east 5
+east and south 1
+east et macfarlan 1
+east quadr 1
+eastern 1
+eastern terror 1
+eastern terror act 1
+eastman 1
+easynet 1
+eat 3
+eat anticip 1
+eat anticip ee 1
+eat de 3
+eat de aut 1
+eat de ce 1
+eat de celu 1
+eat de ch 1
+eat de chaqu 1
+eat de deux 1
+eat de lenviron 1
+eat de nich 1
+eat de point 1
+eat de processus 1
+eat de term 1
+eat denviron 1
+eat denviron est 1
+eat denviron ou 1
+eat denviron retard 1
+eat dinstruc 1
+eat dinstruc sp 1
+eat du 1
+eat du point 1
+eat dun 2
+eat dun aut 1
+eat dun environ 1
+eat dun inst 1
+eat dun nouveau 1
+eat dun nouvel 2
+eat dun opt 1
+eat dun point 1
+eat dun trou 1
+eat dynamiqu 1
+eat dynamiqu de 1
+eat eventuel 1
+eat eventuel dun 1
+eat instantan 1
+eat instantan ee 1
+eat pr 1
+eat pr eliminair 1
+eat retard 1
+eat retard ee 1
+eat soit 1
+eat soit tout 1
+eatc 3
+eatc monograph 1
+eatoir 3
+eatoir ain 1
+eatoir correspon 1
+eatoir correspon aux 1
+eatoir d efin 2
+eatoir dan 1
+eatoir dan ib 1
+eatoir de 3
+eatoir de fonct 1
+eatoir de la 1
+eatoir de lespac 1
+eatoir de plac 1
+eatoir de som 1
+eatoir de syst 1
+eatoir de tail 1
+eatoir est 1
+eatoir est remplac 1
+eatoir et la 1
+eatoir nimpliqu 1
+eatoir nimpliqu pa 1
+eatoir parm 1
+eatoir parm le 1
+eatoir pour 1
+eatoir pour aider 1
+eatoir quil 1
+eatoir quil rev 1
+eatoir repr 1
+eatoir repr esent 1
+eatoir sur 1
+eatoir sur lindividu 1
+eatoir zj 1
+eatoir zj assoc 1
+eatoir zj est 1
+eav 1
+eb 3
+ebar 1
+ebar de 1
+ebar de la 1
+ebarrasson 1
+ebarrasson nous 1
+ebarrasson nous tout 1
+ebauch 1
+ebauch de 1
+ebauch de la 1
+ebd 1
+ebd e forml 1
+ebd is repr 1
+ebd receiv 1
+ebec 1
+ebec cit 1
+eberlein 1
+ebg 1
+eblog 1
+eblog tc 1
+ebogueur 1
+ebord4 1
+ebr 1
+ebr lin 1
+ebr lin eair 1
+ebriqu 1
+ebriqu de 1
+ebriqu mapl 1
+ebriqu par 1
+ebriqu pu 1
+ebriqu qu 1
+ebriqu qu pur 1
+ebut 3
+ebut de 2
+ebut de an 1
+ebut de bloc 1
+ebut de la 2
+ebut de lec 1
+ebut de pag 1
+ebut du 1
+ebut du program 1
+ebut dun 1
+ebut dun colon 1
+ebut dun pag 1
+ebut evaluer 1
+ebut evaluer le 1
+ebut ou 1
+ebut ou en 1
+ec 110
+ec a biject 1
+ec a chaqu 1
+ec a claus 1
+ec a configur 1
+ec a const 1
+ec a construc 1
+ec a cp 1
+ec a feedback 1
+ec a hierarch 1
+ec a lin 2
+ec a loc 1
+ec a mach 1
+ec a mic 1
+ec a mop 1
+ec a path 2
+ec a phy 1
+ec a point 1
+ec a polynom 3
+ec a prim 1
+ec a proc 1
+ec a quel 1
+ec a rat 1
+ec a regl 1
+ec a renam 1
+ec a repetit 1
+ec a rigid 1
+ec a rol 1
+ec a run 1
+ec a s0 1
+ec a scal 1
+ec a se 1
+ec a skew 1
+ec a solut 1
+ec a sourc 1
+ec a st 2
+ec a sub 1
+ec a substitut 1
+ec a succ 1
+ec a transform 1
+ec a typ 1
+ec a uniqu 3
+ec a ver 1
+ec a weigh 1
+ec a word 1
+ec a yellow 1
+ec act 1
+ec addr 1
+ec algorithm 5
+ec algorithm differ 1
+ec among rol 1
+ec an algorithm 1
+ec an altern 1
+ec an el 1
+ec an explicit 1
+ec an optim 1
+ec and co 1
+ec and emerg 2
+ec and minim 1
+ec and satisf 1
+ec any regl 1
+ec appl 3
+ec appl cod 1
+ec appl softwar 1
+ec approach 2
+ec approxim 1
+ec approxim solut 1
+ec argum 1
+ec as 1
+ec asynchron 1
+ec asynchron sem 1
+ec attr 1
+ec au 3
+ec au marqu 1
+ec au mod 1
+ec au moin 1
+ec aujourdhu 1
+ec aujourdhu de 1
+ec aus 1
+ec axiom 1
+ec axiom guar 1
+ec axiom requir 1
+ec ba 1
+ec befor enter 1
+ec behavior 1
+ec between s2 1
+ec between switch 1
+ec bien 1
+ec bien dautr 1
+ec bind 1
+ec bind environm 1
+ec boolean 1
+ec boolean solver 1
+ec c libr 1
+ec capabil 1
+ec ce 1
+ec ce suj 1
+ec cel 1
+ec cel qu 1
+ec centr 1
+ec centr queu 1
+ec certain 1
+ec certain ca 1
+ec cl 3
+ec cl dict 1
+ec cl method 1
+ec cl relationship 1
+ec claim 1
+ec cliqu 1
+ec cod 1
+ec coeff 1
+ec coeff xi 1
+ec coh 1
+ec coh pair 1
+ec commerc 1
+ec commerc softwar 1
+ec commitm 1
+ec compon 2
+ec con 1
+ec con condit 1
+ec connect 1
+ec consider 1
+ec consider ch 1
+ec const 1
+ec const oen 1
+ec cont 1
+ec cont descript 1
+ec d ej 1
+ec dan 2
+ec dan la 1
+ec dan le 1
+ec datab 1
+ec datab qu 1
+ec dautr 1
+ec dautr approch 1
+ec de 3
+ec de boucl 1
+ec de ce 1
+ec de cod 1
+ec de compil 1
+ec de cop 1
+ec de don 1
+ec de eff 1
+ec de impl 1
+ec de la 1
+ec de solut 1
+ec de transform 1
+ec de valeur 1
+ec definit 1
+ec dep 1
+ec dep an 1
+ec dep test 1
+ec deux 1
+ec deux matr 1
+ec deux typ 1
+ec dinstruc 1
+ec displ 1
+ec displ imag 1
+ec domain 1
+ec domain el 1
+ec donc 1
+ec du 3
+ec du comport 2
+ec du jeu 1
+ec du pr 1
+ec du program 1
+ec du retour 1
+ec du test 1
+ec e par 1
+ec e peut 1
+ec e pour 1
+ec e travailler 1
+ec echec 1
+ec echec succ 1
+ec ed 1
+ec ed le 1
+ec edant 1
+ec edant le 1
+ec edant linstruc 1
+ec edant lop 1
+ec edem 2
+ec edem cit 2
+ec edem dan 1
+ec edem de 1
+ec edem discut 1
+ec edem dun 1
+ec edem empil 1
+ec edem en 1
+ec edem evoqu 1
+ec edem impliqu 1
+ec edem le 1
+ec edem ment 1
+ec edem obtenus 1
+ec edem pr 1
+ec edem prop 1
+ec edem qu 1
+ec edem ramener 1
+ec edem unif 1
+ec edent 4
+ec edent ain 1
+ec edent au 1
+ec edent aut 1
+ec edent aux 1
+ec edent coupur 1
+ec edent de 1
+ec edent dev 1
+ec edent devrait 1
+ec edent don 1
+ec edent en 1
+ec edent est 3
+ec edent etait 1
+ec edent etant 1
+ec edent hor 1
+ec edent le 2
+ec edent nous 1
+ec edent ont 1
+ec edent param 1
+ec edent peut 1
+ec edent point 1
+ec edent pour 1
+ec edent produit 1
+ec edent qu 1
+ec edent ren 1
+ec edent sont 2
+ec edent sur 2
+ec edg 1
+ec ee 3
+ec ee afin 1
+ec ee de 1
+ec ee doiv 1
+ec ee donc 1
+ec ee en 1
+ec ee par 1
+ec ee pren 1
+ec ee si 1
+ec effectiv 1
+ec effectiv de 1
+ec el 1
+ec el a1 1
+ec ement 3
+ec ement avant 1
+ec ement ce 1
+ec ement cel 1
+ec ement dan 1
+ec ement de 1
+ec ement il 1
+ec ement la 1
+ec ement le 2
+ec ement leur 1
+ec ement lor 1
+ec ement pour 1
+ec en 3
+ec en exploit 1
+ec en m0 1
+ec en mk 1
+ec enough consecut 1
+ec environm 1
+ec environm condit 1
+ec es 3
+ec es li 1
+ec es sont 1
+ec es tous 1
+ec espec 1
+ec essair 1
+ec est 2
+ec est suff 1
+ec est un 1
+ec et est 1
+ec et le 1
+ec et nous 1
+ec et perm 1
+ec et unicit 1
+ec exact 1
+ec fact 1
+ec fact follow 1
+ec ffv1 1
+ec fic 1
+ec fic valu 1
+ec finit 1
+ec finit domain 1
+ec for describ 1
+ec for determin 1
+ec for length 1
+ec for tag 1
+ec for unidirect 1
+ec form 1
+ec form developm 1
+ec forml 1
+ec from iter 1
+ec g s.t 1
+ec gener 1
+ec gener funct 1
+ec hardwar 1
+ec hierarch 1
+ec imper 1
+ec imper langu 1
+ec import 2
+ec import fact 1
+ec import mean 1
+ec in determin 1
+ec in junior 1
+ec in log 1
+ec in netsim 1
+ec in proc 1
+ec in refer 1
+ec in standard 1
+ec ind 2
+ec ind ba 1
+ec ind i1 1
+ec infinit 1
+ec infrastructur 1
+ec infrastructur support 1
+ec ink 1
+ec ink datab 1
+ec input 2
+ec inter 1
+ec inter switch 1
+ec is construc 1
+ec is shown 1
+ec item 1
+ec k s.t 1
+ec kb 1
+ec la 2
+ec la dilat 1
+ec la logiqu 1
+ec langu 1
+ec layout 1
+ec le 2
+ec le appel 1
+ec le comport 1
+ec le el 1
+ec le principaux 1
+ec le sen 1
+ec le solut 1
+ec learn 1
+ec learn method 1
+ec lfc 2
+ec link 1
+ec load 1
+ec load bal 1
+ec log 2
+ec log tool 1
+ec lor 1
+ec lor de 1
+ec ma 1
+ec ma est 1
+ec mach 2
+ec mach learn 1
+ec man object 1
+ec matr 1
+ec me 1
+ec me object 1
+ec menus 1
+ec method 3
+ec method interfac 1
+ec model 1
+ec multidim 1
+ec multidim search 1
+ec multipl 1
+ec nc 1
+ec no fl 1
+ec no hamilt 1
+ec no outg 1
+ec non 1
+ec non zer 1
+ec nous 1
+ec nous supposeron 1
+ec nrd 1
+ec nrd inclus 1
+ec object 1
+ec object orient 1
+ec observabl 1
+ec of abstract 1
+ec of approxim 1
+ec of eff 2
+ec of enqueu 1
+ec of equ 1
+ec of fundef 1
+ec of hardwar 1
+ec of inequ 1
+ec of interfac 1
+ec of me 1
+ec of natur 1
+ec of proc 1
+ec of reg 1
+ec of select 1
+ec of spat 1
+ec of tcp 1
+ec on 1
+ec pa 1
+ec pa toujour 1
+ec parallel 3
+ec parallel architectur 1
+ec parallel compiler 1
+ec parallel system 1
+ec part 1
+ec path 1
+ec perform 1
+ec perform requir 1
+ec perm 1
+ec perm de 1
+ec plusieur 1
+ec plusieur modalit 1
+ec point 1
+ec polynom 1
+ec posit 1
+ec posit const 1
+ec pour 1
+ec pour adapter 1
+ec pour identif 1
+ec pr 1
+ec pr ec 1
+ec prim 1
+ec prior 1
+ec prioritair 1
+ec prioritair la 1
+ec problem 1
+ec program 2
+ec proof 1
+ec proof system 1
+ec propag 1
+ec propag direct 1
+ec propag graph 1
+ec propag pattern 1
+ec protocol 1
+ec protocol addr 1
+ec protocol attempt 1
+ec protocol prov 1
+ec prototyp 1
+ec prototyp ment 1
+ec qu 1
+ec qu dan 1
+ec quantif 4
+ec quantif qu 1
+ec quantif variabl 2
+ec realm 1
+ec realm decl 1
+ec reflect 1
+ec reflect langu 1
+ec reg 1
+ec regl 1
+ec regl langu 1
+ec regr 1
+ec regr test 1
+ec rel 2
+ec rel dau 1
+ec rel de 1
+ec rel multicast 1
+ec rel point 1
+ec rel transport 1
+ec requir 2
+ec research 1
+ec research work 1
+ec resourc 1
+ec resourc avail 1
+ec rol 1
+ec rol graph 1
+ec s.t 1
+ec saf 1
+ec saf regr 1
+ec sem 1
+ec sequ 1
+ec sequ method 1
+ec sever eff 1
+ec sever relationship 1
+ec siml 1
+ec simultan 1
+ec softwar 5
+ec softwar as 1
+ec softwar system 2
+ec som const 2
+ec som input 1
+ec som l1 1
+ec som l2 1
+ec som techniqu 1
+ec sont 1
+ec sont prop 1
+ec standard 1
+ec stat 1
+ec string 1
+ec string match 1
+ec suiv 1
+ec support 1
+ec sur 1
+ec sur lexempl 1
+ec syst 1
+ec syst ematiqu 1
+ec system 2
+ec t el 1
+ec t il 1
+ec taxonom 1
+ec techniqu 2
+ec technolog 2
+ec test 2
+ec test program 1
+ec test se 1
+ec test select 1
+ec test suit 1
+ec testb 1
+ec textur 1
+ec textur segm 1
+ec th integr 1
+ec theor 1
+ec theor framework 1
+ec theorem 1
+ec theorem ea 1
+ec to acceler 1
+ec to lim 1
+ec to map 1
+ec to prev 1
+ec tool 1
+ec tout 1
+ec tout en 1
+ec trac 1
+ec trac gener 1
+ec transl 1
+ec transl becom 1
+ec tw edg 1
+ec tw ver 1
+ec typ 1
+ec typ instead 1
+ec un 3
+ec un autr 1
+ec un born 1
+ec un boucl 1
+ec un cop 1
+ec un el 1
+ec un ent 2
+ec un espac 1
+ec un multipl 1
+ec un ou 1
+ec un point 1
+ec un si 1
+ec un solut 2
+ec un vecteur 2
+ec uniqu 1
+ec uniqu au 1
+ec user 1
+ec util 1
+ec util dan 1
+ec ver 1
+ec we writ 1
+ec when transl 1
+ec xi 1
+ec1 1
+ec1 enforc 1
+ec1 enforc ext 1
+ec2 1
+ec3 2
+ec3 th condit 1
+ec4 1
+ec4 wa arriv 1
+ec90 1
+ecal 1
+ecal pouv 1
+ecal pouv exister 1
+ecal sont 1
+ecal sont tr 1
+ecaler 1
+ecaler ce 1
+ecaler ce point 1
+ecaler respectiv 1
+ecaler respectiv de 1
+ecan 5
+ecan dacc 1
+ecan dacc es 1
+ecan dadapt 1
+ecan dadr 1
+ecan dadr glob 1
+ecan dan 1
+ecan de 4
+ecan de ba 1
+ecan de compact 1
+ecan de contr 1
+ecan de coupur 1
+ecan de la 1
+ecan de mvp 1
+ecan de pa 1
+ecan de part 1
+ecan de reproduc 1
+ecan de swap 1
+ecan de tr 1
+ecan destin 1
+ecan destin es 1
+ecan dind 1
+ecan dind assur 1
+ecan dind util 1
+ecan dinv 1
+ecan dinv au 1
+ecan dun 1
+ecan dun grain 1
+ecan est 1
+ecan est repr 1
+ecan et la 1
+ecan fournit 1
+ecan fournit le 1
+ecan g en 1
+ecan impliqu 1
+ecan impliqu le 1
+ecan informatiqu 1
+ecan informatiqu qu 1
+ecan plus pu 1
+ecan qu 1
+ecan qu se 1
+ecan sont 1
+ecan sont distingu 1
+ecan util 1
+ecaniqu 1
+ecaniqu de 1
+ecaniqu de fluid 1
+ecapitl 1
+ecapitl le 1
+ecapitl le structur 1
+ecapitulatif 1
+ecapitulatif de 1
+ecapitulatif de structur 1
+ecart 2
+ecart de 2
+ecart de la 1
+ecart de perform 1
+ecart entr 1
+ecart entr la 1
+ecart entr le 1
+ecart tout 1
+ecart tout dabord 1
+ecart typ 1
+ecart typ est 1
+ecart typ mesur 1
+ecarter 1
+ecaut 1
+ecaut suiv 1
+eccv 1
+eceler 1
+eceler a la 1
+eceler du 1
+eceler du fait 1
+ecem 2
+ecem renom 1
+ecem renom ee 1
+ecem sug 1
+ecem sug er 1
+ecembr 1
+ecent 3
+ecent de 2
+ecent de compil 1
+ecent n etait 1
+ecent ont 1
+ecent qu 1
+ecent qu le 1
+ecent san risquer 1
+ecentr 1
+ecentr de 1
+ecentr de lop 1
+ecept 1
+ecept et denv 1
+ecessair 4
+ecessair a la 2
+ecessair a labout 1
+ecessair a lobt 1
+ecessair a sa 1
+ecessair au 2
+ecessair au ch 1
+ecessair au point 1
+ecessair au processeur 1
+ecessair au retour 1
+ecessair aux 1
+ecessair aux calcl 1
+ecessair caract 1
+ecessair caract eristiqu 1
+ecessair d etud 1
+ecessair dagrandir 1
+ecessair dagrandir lenviron 1
+ecessair dajouter 1
+ecessair dajouter aux 1
+ecessair dan 2
+ecessair dan le 2
+ecessair de 3
+ecessair de cr 1
+ecessair de fair 1
+ecessair de garder 1
+ecessair de globaliser 1
+ecessair de la 1
+ecessair de lop 1
+ecessair de mettr 1
+ecessair de multipl 1
+ecessair de pouvoir 2
+ecessair de prot 1
+ecessair de restaurer 1
+ecessair de sauter 1
+ecessair de sauvegarder 1
+ecessair de sauver 1
+ecessair de savoir 1
+ecessair de se 1
+ecessair de suivr 1
+ecessair de veiller 1
+ecessair de visiter 1
+ecessair deffectuer 1
+ecessair deffectuer un 1
+ecessair dempiler 1
+ecessair dempiler le 1
+ecessair den 1
+ecessair den utiliser 1
+ecessair denregistrer 1
+ecessair denregistrer la 1
+ecessair dic 1
+ecessair dic dun 1
+ecessair du 1
+ecessair du fait 1
+ecessair dun 1
+ecessair dutiliser 1
+ecessair entr 1
+ecessair entr le 1
+ecessair et ain 1
+ecessair et le 1
+ecessair et suff 2
+ecessair etr 1
+ecessair etr trait 1
+ecessair ji 1
+ecessair ji ki 1
+ecessair lor 1
+ecessair lor du 1
+ecessair lorsqu 1
+ecessair lorsqu deux 1
+ecessair ma 1
+ecessair ma non 1
+ecessair mal 1
+ecessair mal connus 1
+ecessair pour 1
+ecessair pour eliminer 1
+ecessair pour eviter 1
+ecessair pour ex 1
+ecessair pour fournir 1
+ecessair pour nautoriser 1
+ecessair pour obtenir 1
+ecessair pour respecter 1
+ecessair pour stocker 1
+ecessair qu 1
+ecessair qu dan 1
+ecessair seront 1
+ecessair seront bien 1
+ecessair un 1
+ecessair un explor 1
+ecessair un net 1
+ecessair ver 1
+ecessair vou 1
+ecessair vou ee 1
+ecesseur 1
+ecesseur de 1
+ecesseur de la 1
+ecesseur inhibiteur 1
+ecesseur inhibiteur de 1
+ecessit 5
+ecessit au 1
+ecessit aucun 1
+ecessit aucun un 1
+ecessit beaucoup 1
+ecessit beaucoup moin 1
+ecessit dav 1
+ecessit dav dhypoth 1
+ecessit de 2
+ecessit de branch 1
+ecessit de calcl 1
+ecessit de mettr 1
+ecessit de op 1
+ecessit e dapporter 1
+ecessit e de 1
+ecessit e dinterpr 1
+ecessit e doptimiser 1
+ecessit e dun 1
+ecessit e imp 1
+ecessit e pour 1
+ecessit et le 1
+ecessit la 1
+ecessit la dupl 1
+ecessit lacc 1
+ecessit lacc es 1
+ecessit le 1
+ecessit lec 1
+ecessit lec ecut 1
+ecessit moin 1
+ecessit moin de 1
+ecessit pa 2
+ecessit pa de 1
+ecessit qu 1
+ecessit qu c1 1
+ecessit quun 1
+ecessit quun attent 1
+ecessit souv 1
+ecessit un 1
+ecessit un an 1
+ecessit un degr 1
+ecessit un environ 1
+ecessit un import 1
+ecessit un mod 1
+ecessit un test 1
+ecessiterait 2
+ecessiterait en 1
+ecessiterait en particl 1
+ecessiterait l evalu 1
+ecg 2
+ecg compr 1
+ecg compr using 1
+ecg interpr 1
+ecg interpr ba 1
+ech 5
+ech chaqu 1
+ech chaqu noeud 1
+ech command 1
+ech eanc 1
+ech eanc de 1
+ech eanc est 1
+ech la 1
+ech la lib 1
+echang 2
+echang de 2
+echang de don 1
+echang de me 2
+echang de meilleur 1
+echang de pag 1
+echang dindividus 1
+echang dindividus aux 1
+echang ee 1
+echang ee par 1
+echang emp 1
+echang emp ech 1
+echang es 2
+echang es autour 1
+echang et le 1
+echang p eriodiqu 1
+echanger 1
+echanger de 1
+echanger de inform 1
+echantillon 2
+echantillon al 1
+echantillon al eatoir 1
+echantillon correspon 1
+echantillon e qu 1
+echantillon e un 1
+echantillon et la 1
+echantillon pr 1
+echantillon pr ef 1
+echap 1
+echap aux 1
+echap aux habituel 1
+echarg 1
+echarg de 1
+echarg de don 1
+echarg engendr 1
+echarg implicit 1
+echarg implicit de 1
+echarg ou 1
+echarg ou de 1
+echarg sont 1
+echec 2
+echec a lautr 1
+echec atteign 1
+echec au 2
+echec au del 1
+echec avant 1
+echec avant tout 1
+echec dan 2
+echec dan la 2
+echec de 1
+echec de la 1
+echec de lappel 1
+echec de lunif 1
+echec du 1
+echec du test 1
+echec dun 1
+echec dun man 1
+echec est 2
+echec est atteint 1
+echec est obligatoir 1
+echec est profon 1
+echec est quil 1
+echec est tr 1
+echec et aux 1
+echec et dan 1
+echec et de 1
+echec et le 1
+echec et non 1
+echec fail 1
+echec fail est 1
+echec fail qu 1
+echec fail shallow 1
+echec inclut 1
+echec inclut dautr 1
+echec kcm 1
+echec lor 1
+echec lor dun 1
+echec me 1
+echec ne 1
+echec ne peut 1
+echec nest 1
+echec nest quun 1
+echec par 1
+echec par concat 1
+echec peut 1
+echec peut prendr 1
+echec potentiel 1
+echec pour 1
+echec pour restaurer 1
+echec pr 1
+echec pr ematur 1
+echec profon 1
+echec profon fail 1
+echec propag 1
+echec propag e6 1
+echec r eduit 1
+echec selon 1
+echec selon le 1
+echec sont 1
+echec sont util 1
+echec standard 1
+echec succ 1
+echec succ es 1
+echec superficiel 1
+echec superficiel fail 1
+echec uniqu 1
+echec ver 1
+echec ver le 1
+echel 1
+echel de 1
+echel de la 1
+echniqu 1
+echniqu decalcl 1
+echocardiogram 1
+echocardiogram flag 1
+echocardiogram flag gl 1
+echou 1
+echou pa 1
+echouer 1
+echouer afin 1
+echouer afin de 1
+echouer avant 1
+echouer avant le 1
+echouer et donc 1
+echoueront 1
+echoueront san eff 1
+eciabl 1
+eciabl a lutil 1
+ecialiser 1
+ecialiser le 1
+ecialiser le retour 1
+ecider 2
+ecider de 1
+ecider de recourir 1
+ecider quand 1
+ecider quand est 1
+ecieus 1
+ecif 4
+ecif afin 1
+ecif afin de 1
+ecif com 1
+ecif com explorer 1
+ecif de 2
+ecif de acc 1
+ecif de modif 1
+ecif ee 1
+ecif ee en 1
+ecif es 2
+ecif es par 1
+ecif la 1
+ecif le 1
+ecificit 3
+ecificit e de 1
+ecificit e du 1
+ecificit e ren 1
+ecificit e suppl 1
+ecifiqu 3
+ecifiqu a disparu 1
+ecifiqu a la 1
+ecifiqu a lext 1
+ecifiqu a prolog 1
+ecifiqu a un 1
+ecifiqu appel 1
+ecifiqu appel ee 1
+ecifiqu au 1
+ecifiqu au contr 1
+ecifiqu au retour 1
+ecifiqu aux 1
+ecifiqu aux mvp 1
+ecifiqu de 1
+ecifiqu de ce 1
+ecifiqu et origin 1
+ecifiqu font 1
+ecifiqu font leur 1
+ecifiqu nec 1
+ecifiqu nec pa 1
+ecifiqu pour 1
+ecifiqu pour fair 1
+ecim 1
+ecipiter 1
+ecipiter un echec 1
+eciproqu 1
+eciproqu si 1
+eciser 2
+eciser certain 1
+eciser com 1
+eciser dan 1
+eciser dan le 1
+eciser la 1
+eciser la form 1
+eciser le 1
+eciser le condit 1
+ecisif 1
+ecisif lorsqu 1
+ecisif lorsqu lon 1
+ecison 3
+ecison dan 1
+ecison dan quel 1
+ecison le 1
+ecison le point 1
+ecison qu 1
+ecison qu larithm 1
+ecl 2
+ecl de 1
+ecl de mod 1
+ecl dun 1
+ecl dun program 1
+ecl e com 1
+ecl e etr 1
+ecl e substitu 1
+ecl ou 1
+ecl ou un 1
+eclair 1
+eclair le 1
+eclair le ch 1
+eclaircit 1
+eclaircit le 1
+eclaircit le similarit 1
+eclam 2
+eclam lec 1
+eclam lec dun 1
+eclam toutef 1
+eclam toutef un 1
+eclam un 1
+eclam un tabl 1
+eclamer 1
+eclamer aucun 1
+eclamer aucun modif 1
+eclench 1
+eclench de 1
+eclench de la 1
+eclench du 1
+eclench du retour 1
+eclench e qu 1
+eclench ee 1
+eclench ee en 1
+eclench un retour 1
+eclip 2
+eclip and oz 1
+eclip cod 1
+eclip d efinit 1
+eclip eclip 1
+eclip et sicstus 1
+eclip inclus 1
+eclip indomain 1
+eclip libr 1
+eclip prov 1
+eclip reduc 1
+eclip resort 1
+eclip run 1
+eclip sicstus 1
+eclip solver 1
+eclip solver improv 1
+eclip sparcst2 1
+eclip speed 1
+eclip system 1
+eclip8 1
+ecn 1
+ecn de 1
+ecn de catalun 1
+ecod 3
+ecod de 1
+ecod de lunit 1
+ecod dont la 1
+ecod du 1
+ecod dun 1
+ecod dun ch 1
+ecod port 1
+ecod sembl 1
+ecol 6
+ecol i ei 1
+ecol nat 1
+ecol nat sup 1
+ecol norm 3
+ecol norm sup 3
+ecol oper 1
+ecol oper. 1
+ecol polytechniqu 3
+ecol polytechniqu feder 1
+ecol vsplit 1
+ecol vsplit nc 1
+ecol vsplit paradigm 1
+ecol0 1
+ecol0 m ecol 1
+ecoln 1
+ecolog 1
+ecolog memor 1
+ecolog memor manag 1
+ecologiqu 1
+ecomp 1
+ecomp et en 1
+ecomposit 2
+ecomposit addit 1
+ecomposit addit de 1
+ecomposit de 2
+ecomposit de c11 1
+ecomposit de la 1
+ecomposit en 1
+ecomposit en valeur 1
+ecomposit est 1
+ecomposit est toujour 1
+ecomposit spectr 1
+ecomposit spectr de 1
+econ 1
+econ ee 1
+econ ee par 1
+econcil 1
+econcil le 1
+econcil le deux 1
+econdair 1
+econdair pour 1
+econdair pour le 1
+econfigur 1
+econiser 1
+econiser plut 1
+econiser plut ot 1
+econison 1
+econison est 1
+econison est de 1
+econnect 1
+econnect ee 1
+econnect ee de 1
+econom 10
+econom and biolog 1
+econom approach 1
+econom attract 1
+econom attract comput 1
+econom build 1
+econom build famil 1
+econom by autom 1
+econom despac 1
+econom despac sur 1
+econom drastiqu 1
+econom drastiqu despac 1
+econom in term 1
+econom le 1
+econom le env 1
+econom of scal 2
+econom pa 1
+econom softwar 1
+econom softwar system 1
+econom system 1
+econom un acc 1
+econom un me 1
+econometer 1
+economiqu 2
+economiqu nous 1
+economiqu nous par 1
+economiqu quarchitectur 1
+economiser 1
+economiser de 1
+economiser de la 1
+econseil 1
+econseil ee 1
+ecoop 3
+ecoop oopsl90 1
+ecoop89 1
+ecoop91 1
+ecoop92 2
+ecoop98 1
+ecoul 3
+ecoul direct 1
+ecoul direct de 1
+ecoul dun 1
+ecoul dun int 1
+ecoul ee 1
+ecoul suiv 1
+ecoul suiv lac 1
+ecoul suiv le 1
+ecoup 3
+ecoup de 2
+ecoup de la 2
+ecoup de patron 1
+ecoup du 1
+ecoup du probl 1
+ecoup ee 1
+ecoup ee en 1
+ecoup en 1
+ecoup en pav 1
+ecoup es 1
+ecoup es en 1
+ecoup et le 1
+ecoup peuv 1
+ecoup qu 1
+ecoup qu se 1
+ecouper 1
+ecouper ceux 1
+ecouper ceux ci 1
+ecouper lespac 1
+ecouper lespac dit 1
+ecouvr 1
+ecouvr naturel 1
+ecouvr naturel le 1
+ecr 3
+ecr avec 1
+ecr avec la 1
+ecr de 1
+ecr de ind 1
+ecr e lenviron 1
+ecr ement 1
+ecr ement tail 1
+ecr est 1
+ecr est suffisam 1
+ecr lor 1
+ecr lor du 1
+ecr t de 1
+ecr t lin 1
+ecr tr 1
+ecrc 3
+ecrc and targ 1
+ecrc common 1
+ecrc common log 1
+ecrc in summer 1
+ecrc munich 1
+ecrc munich german 1
+ecrc prolog 1
+ecrc prolog interm 1
+ecrc shareholder 1
+ecrir 4
+ecrir au 1
+ecrir au paragraph 1
+ecrir avec 1
+ecrir avec un 1
+ecrir dan 1
+ecrir dan deux 1
+ecrir en 1
+ecrir exact 1
+ecrir exact le 1
+ecrir exhaustiv 1
+ecrir exhaustiv la 1
+ecrir la 2
+ecrir la boucl 1
+ecrir la wam 1
+ecrir lb 1
+ecrir lb com 1
+ecrir le 2
+ecrir le corp 1
+ecrir le point 1
+ecrir le pr 1
+ecrir le prem 1
+ecrir lenviron 1
+ecrir lenviron cour 1
+ecrir lexpr 1
+ecrir plus avant 1
+ecrir simultan 1
+ecrir simultan ement 1
+ecrir sont 1
+ecrir sont le 1
+ecrir sous 2
+ecrir sous la 2
+ecrir un environ 1
+ecrir un mot 1
+ecriron 1
+ecriron le 1
+ecriron le instruc 1
+ecrit 5
+ecrit a la 2
+ecrit alor 1
+ecrit au 1
+ecrit au chapitr 1
+ecrit au paragraph 1
+ecrit aux 1
+ecrit aux paragraph 1
+ecrit c1 1
+ecrit ce 1
+ecrit ci 2
+ecrit ci dessus 2
+ecrit com 1
+ecrit com suit 1
+ecrit com un 1
+ecrit dan 3
+ecrit dan ce 1
+ecrit dan la 2
+ecrit dan le 2
+ecrit de 1
+ecrit de la 1
+ecrit donc 1
+ecrit donc fin 1
+ecrit donc sous 1
+ecrit egal 1
+ecrit egal en 1
+ecrit en 3
+ecrit en env2 1
+ecrit en fortran 2
+ecrit en pag 1
+ecrit en util 1
+ecrit figur 1
+ecrit la 2
+ecrit la condit 1
+ecrit la mi 1
+ecrit le 3
+ecrit le diff 1
+ecrit le fluc 1
+ecrit le grand 1
+ecrit le nouvel 1
+ecrit le pir 1
+ecrit le techniqu 1
+ecrit lor 1
+ecrit lor dun 1
+ecrit matriciel 1
+ecrit maxim 1
+ecrit maxim error 1
+ecrit par 2
+ecrit par ancourt 1
+ecrit par bow 1
+ecrit par carlsson 1
+ecrit par de 1
+ecrit par le 1
+ecrit perm 1
+ecrit sch 1
+ecrit sch ematiqu 1
+ecrit simpl 1
+ecrit simpl en 1
+ecrit sous 1
+ecrit sous form 1
+ecrit sur 1
+ecrit sur la 1
+ecrit un 1
+ecrit un ensembl 1
+ecrit un var 1
+ecritur 2
+ecritur a de 1
+ecritur a effectuer 1
+ecritur a la 1
+ecritur a le 1
+ecritur a lint 1
+ecritur a un 1
+ecritur aboutit 1
+ecritur ait 1
+ecritur ait termin 1
+ecritur alor 1
+ecritur alor il 1
+ecritur au 2
+ecritur au champ 1
+ecritur au minim 1
+ecritur au tableau 1
+ecritur avant 1
+ecritur avant de 1
+ecritur avant quun 1
+ecritur avec 1
+ecritur avec le 1
+ecritur car 1
+ecritur car ce 1
+ecritur co 1
+ecritur co utant 1
+ecritur con 1
+ecritur con ecutiv 1
+ecritur cycliqu 1
+ecritur dan 1
+ecritur dan la 1
+ecritur dan le 1
+ecritur dan un 1
+ecritur de 2
+ecritur de boucl 1
+ecritur de ce 1
+ecritur de construc 1
+ecritur de environ 1
+ecritur de la 2
+ecritur de lanc 1
+ecritur de lenviron 1
+ecritur de linstruc 1
+ecritur de microcod 1
+ecritur de nid 1
+ecritur de pi 1
+ecritur de pk 1
+ecritur de program 1
+ecritur de r1 1
+ecritur de r2 1
+ecritur de variabl 1
+ecritur donc 1
+ecritur du 2
+ecritur du point 1
+ecritur du program 1
+ecritur du propr 1
+ecritur dun 1
+ecritur dun processeur 1
+ecritur effectu 1
+ecritur effectu ee 1
+ecritur en 2
+ecritur en bloc 1
+ecritur en plac 1
+ecritur en vu 1
+ecritur est 2
+ecritur est effectu 1
+ecritur est non 1
+ecritur est tel 1
+ecritur et an 1
+ecritur et de 1
+ecritur et deux 1
+ecritur et doit 1
+ecritur et donc 1
+ecritur et en 1
+ecritur et la 1
+ecritur et le 1
+ecritur et lectur 1
+ecritur et lutil 1
+ecritur etc 1
+ecritur group 1
+ecritur group ee 1
+ecritur il 1
+ecritur il prop 1
+ecritur il rest 1
+ecritur inutil 1
+ecritur inutil correspon 1
+ecritur lor 1
+ecritur lor de 1
+ecritur m emoir 1
+ecritur ma 1
+ecritur ma ce 1
+ecritur ma com 1
+ecritur ma la 1
+ecritur multipl 1
+ecritur n etant 1
+ecritur ne 1
+ecritur on nuit 1
+ecritur ont 1
+ecritur ont lieu 1
+ecritur par 1
+ecritur par la 1
+ecritur peut 1
+ecritur peut etr 1
+ecritur possibl 1
+ecritur possibl ne 1
+ecritur pour 1
+ecritur pour eliminer 1
+ecritur pour le 1
+ecritur pr 1
+ecritur pr ec 1
+ecritur privil 1
+ecritur privil eg 1
+ecritur qu 1
+ecritur qu sub 1
+ecritur quun 1
+ecritur quun processeur 1
+ecritur r es 1
+ecritur r1 1
+ecritur ren 1
+ecritur ren loccur 1
+ecritur sappu 1
+ecritur sappu sur 1
+ecritur sestomp 1
+ecritur sestomp lorsqu 1
+ecritur simultan 1
+ecritur simultan ee 1
+ecritur sont 2
+ecritur sont direct 1
+ecritur sont ind 1
+ecritur sont presqu 1
+ecritur sur 1
+ecritur sur ce 1
+ecritur sur la 1
+ecritur sur le 1
+ecritur sur un 1
+ecritur te 1
+ecritur te du 1
+ecritur tout 1
+ecritur tout le 1
+ecritur uniqu 2
+ecritur uniqu comb 1
+ecritur uniqu perm 1
+ecritur var 1
+ecritur var de 1
+ecritur vu 1
+ecriv 2
+ecriv dan 1
+ecriv dan la 1
+ecriv donc 1
+ecriv le 1
+ecriv le transit 1
+ecriv pour 1
+ecriv pour chaqu 1
+ecriv un 1
+ecrivain 1
+ecrivain de 1
+ecrivain de r1 1
+ecrivain de r2 1
+ecrivain ecrivain 1
+ecrivain ecrivain de 1
+ecrivain ecrivain sur 1
+ecrivain et celu 1
+ecrivain et lecteur 1
+ecrivain et un 1
+ecrivain lecteur 1
+ecrivain lecteur de 1
+ecrivain lecteur entr 1
+ecrivain lecteur ou 1
+ecrivain puisquil 1
+ecrivain puisquil ne 1
+ecrivain sur 1
+ecrivain sur lacc 1
+ecrivon 2
+ecrivon au 1
+ecrivon au paragraph 1
+ecrivon le 1
+ecrivon le eff 1
+ecrivon le op 1
+ect 1
+ecu 2
+ecu a la 1
+ecu et sil 1
+ecu. 1
+ecueil 1
+ecueil de 1
+ecueil de solut 1
+eculair 1
+eculair a perm 1
+ecup 1
+ecup er 1
+ecup er ee 1
+ecup er en 1
+ecup erat 1
+ecup erat anticip 1
+ecup erat av 1
+ecup erat de 1
+ecup erat derreur 1
+ecup erat est 1
+ecup erat im 1
+ecup erat instantan 1
+ecup erat par 1
+ecup erat peut 1
+ecup erat sophistiqu 1
+ecup erat sp 1
+ecup erateur 1
+ecup erateur de 1
+ecup erateur par 1
+ecup erer 1
+ecup erer de 1
+ecup erer la 1
+ecup erer lattribut 1
+ecup erer lespac 1
+ecup erer tous 1
+ecur 4
+ecur a gauch 1
+ecur com 1
+ecur com suit 1
+ecur de 1
+ecur de concat 1
+ecur de longueur 1
+ecur du 1
+ecur du pr 1
+ecur en 1
+ecur extrair 1
+ecur extrair ik 1
+ecur le 1
+ecur nest 1
+ecur nest pa 1
+ecur sur 1
+ecur sur la 1
+ecur termin 1
+ecur. 1
+ecurit 2
+ecurit ou 1
+ecurit ou distribu 1
+ecuritair 1
+ecuritair ou 1
+ecuritair ou distribu 1
+ecursif 1
+ecursif a concat 1
+ecursif a droit 1
+ecursif a lieu 1
+ecursif en 1
+ecursif en un 1
+ecursif termin 1
+ecursif termin est 1
+ecursif termin peut 1
+ecursiv 1
+ecursiv est 1
+ecursiv est binair 1
+ecursiv non 1
+ecursiv non binair 1
+ecut 4
+ecut assez 1
+ecut avec 1
+ecut avec la 1
+ecut chacun 1
+ecut chacun sur 1
+ecut chaqu 1
+ecut chaqu program 1
+ecut continu 1
+ecut continu alor 1
+ecut continu avec 1
+ecut continu en 1
+ecut d ecr 1
+ecut d es 1
+ecut d etermin 1
+ecut dact 1
+ecut dact sp 1
+ecut de 4
+ecut de appel 1
+ecut de bloc 1
+ecut de boucl 1
+ecut de ce 1
+ecut de chaqu 1
+ecut de cod 1
+ecut de court 1
+ecut de fa 1
+ecut de gr 1
+ecut de la 2
+ecut de lappel 1
+ecut de linstruc 1
+ecut de lunif 1
+ecut de man 1
+ecut de processus 1
+ecut de program 1
+ecut de prolog 1
+ecut de sa 1
+ecut de test 1
+ecut de trajectoir 1
+ecut de ver 1
+ecut de zebr 1
+ecut don 1
+ecut don un 1
+ecut du 2
+ecut du cod 1
+ecut du corp 1
+ecut du lang 1
+ecut du nid 1
+ecut du program 1
+ecut du test 1
+ecut dun 3
+ecut dun appel 1
+ecut dun boucl 1
+ecut dun instruc 2
+ecut dun pr 1
+ecut dun program 1
+ecut dun sect 1
+ecut e lalgorithm 1
+ecut e par 1
+ecut e sur 1
+ecut ee 3
+ecut ee apr 1
+ecut ee dur 1
+ecut ee en 2
+ecut effectu 1
+ecut effectu ee 1
+ecut en 2
+ecut en mod 1
+ecut en secon 1
+ecut en util 1
+ecut es 2
+ecut es par 1
+ecut es sur 1
+ecut est 2
+ecut est dan 1
+ecut est illustr 1
+ecut est non 1
+ecut est sur 1
+ecut et est 1
+ecut et un 1
+ecut fork 1
+ecut lalgorithm 1
+ecut lalgorithm standard 1
+ecut le 3
+ecut le ca 1
+ecut le liaison 1
+ecut le nombr 1
+ecut le test 1
+ecut ma 1
+ecut ma un 1
+ecut ne 1
+ecut ne peut 1
+ecut ne rev 1
+ecut nen 1
+ecut nen est 1
+ecut nengendr 1
+ecut nengendr aucun 1
+ecut nest 1
+ecut nest imp 1
+ecut non 2
+ecut norm 1
+ecut norm ma 1
+ecut obtenus 1
+ecut obtenus par 1
+ecut on est 1
+ecut p en 1
+ecut par 2
+ecut par bloc 1
+ecut par el 1
+ecut par la 1
+ecut par le 1
+ecut par patron 1
+ecut par rapport 1
+ecut par siml 1
+ecut peut 1
+ecut peut apparem 1
+ecut peut atteindr 1
+ecut pipelin 1
+ecut pipelin ee 1
+ecut plus efficac 1
+ecut plus pr 1
+ecut plusieur 1
+ecut plusieur fluc 1
+ecut pour 1
+ecut pour algorithm 1
+ecut pour deux 1
+ecut pour enregistrer 1
+ecut quel 1
+ecut quel cod 1
+ecut quit 1
+ecut quit la 1
+ecut quit le 1
+ecut quun 1
+ecut quun sous 1
+ecut r ep 1
+ecut report 1
+ecut report es 1
+ecut s equentiel 1
+ecut sappr 1
+ecut sappr es 1
+ecut sar 1
+ecut sar es 1
+ecut se 2
+ecut se poursuit 1
+ecut se termin 1
+ecut se trouv 1
+ecut simultan 1
+ecut simultan ee 1
+ecut simultan ement 1
+ecut sont 1
+ecut sont connu 1
+ecut sont direct 1
+ecut sont en 1
+ecut standard 1
+ecut standard au 1
+ecut sur 2
+ecut sur de 1
+ecut sur deux 1
+ecut sur le 1
+ecut un sel 1
+ecut util 1
+ecut va 1
+ecut va changer 1
+ecut ver 1
+ecut ver la 1
+ecuter 3
+ecuter a la 1
+ecuter de 1
+ecuter dit 1
+ecuter dit erat 1
+ecuter du 1
+ecuter du cod 1
+ecuter en 2
+ecuter en ca 1
+ecuter en par 1
+ecuter en util 1
+ecuter ind 1
+ecuter ind ependam 1
+ecuter le 1
+ecuter un 2
+ecuter un fo 1
+ecuter un op 1
+ecuter un tel 1
+ecuteront 1
+ecuteront le 1
+ecuteront le unit 1
+ecutif 2
+ecutif du 1
+ecutif du tableau 1
+ecutif dun 1
+ecutif dun term 1
+ecutiv 2
+ecutiv de 1
+ecutiv de la 1
+ecutiv de tail 1
+ed 60
+ed a un 1
+ed algorithm 1
+ed as detail 1
+ed as follow 1
+ed au 1
+ed aux 1
+ed aux voisin 1
+ed ce 1
+ed ce pag 1
+ed ce vecteur 1
+ed certain 1
+ed certain propr 1
+ed d ej 1
+ed de 3
+ed de avant 1
+ed de lab 1
+ed de th 1
+ed de tous 1
+ed deux 1
+ed deux point 1
+ed donc 1
+ed donc lav 1
+ed e de 1
+ed e dorthonorm 1
+ed e ne 1
+ed e par 1
+ed ecesseur 1
+ed ecesseur de 1
+ed ecesseur inhibiteur 1
+ed ee 2
+ed ee au 1
+ed ee de 1
+ed ee en 1
+ed ee lor 1
+ed ee par 1
+ed ee qu 1
+ed efin 1
+ed efin cal 1
+ed efin cod 1
+ed efin de 1
+ed efin deref 1
+ed efin dunif 1
+ed efin geler 1
+ed efin neck 1
+ed efin setarg 1
+ed efin utilisabl 1
+ed egal 1
+ed egal de 1
+ed ei 1
+ed es 1
+ed es appart 1
+ed es en 1
+ed es etait 1
+ed es par 1
+ed es sont 1
+ed follow 1
+ed kazmierczak 1
+ed la 1
+ed la plac 1
+ed lav 1
+ed lav davoir 1
+ed lav de 1
+ed le 2
+ed le cou 1
+ed le droit 1
+ed le propr 1
+ed med 1
+ed ot 1
+ed pa 1
+ed pa de 1
+ed pa la 1
+ed pa un 1
+ed plusieur 1
+ed qu 1
+ed rothberg 1
+ed sa 1
+ed sa propr 1
+ed satterthwait 1
+ed simpl 1
+ed simpl con 1
+ed suffisam 1
+ed suffisam de 1
+ed th direct 1
+ed th netherland 1
+ed toujour 1
+ed toujour le 1
+ed un 1
+ed un cop 1
+ed un ensembl 1
+ed un localit 1
+ed un speed 1
+ed un speedup 1
+ed un vecteur 1
+ed yourdon 1
+ed2 1
+ed3 1
+edact 1
+edant 2
+edant a ce 1
+edant a la 1
+edant a un 1
+edant au 1
+edant au bloc 1
+edant au tableau 1
+edant aux 1
+edant ce 1
+edant ce propr 1
+edant en 1
+edant en ecritur 1
+edant le 2
+edant le point 1
+edant linstruc 1
+edant linstruc point 1
+edant lop 1
+edant lop erateur 1
+edant un 1
+edant un cop 1
+edant un espac 1
+edant un pag 1
+edant un protocol 1
+edant vi un 1
+edb 1
+edb atom 1
+edb datab 1
+edb datab pr 1
+edb datab rel 1
+edb herbrand 1
+edb herbrand atom 1
+edb or deriv 1
+edb part 1
+edb pr 1
+edb pr symbol 1
+edb rel 1
+edb rel atom 1
+edbt92 1
+edelman 1
+edem 2
+edem cit 2
+edem cit ee 2
+edem d ecrit 2
+edem d efin 1
+edem dan 1
+edem dan le 1
+edem de 1
+edem de nombreus 1
+edem discut 1
+edem discut ee 1
+edem dun 1
+edem dun claus 1
+edem empil 1
+edem empil ee 1
+edem en 1
+edem evoqu 1
+edem evoqu ee 1
+edem impliqu 1
+edem le 1
+edem le nombr 1
+edem ment 1
+edem ment es 1
+edem obtenus 1
+edem obtenus en 1
+edem pr 1
+edem pr esent 1
+edem prop 1
+edem prop ee 1
+edem qu 1
+edem qu le 1
+edem qu si 1
+edem ramener 1
+edem unif 1
+edenfield 1
+edent 4
+edent a de 1
+edent a un 1
+edent ain 1
+edent ain qu 1
+edent au 1
+edent au nid 1
+edent aut 1
+edent aux 2
+edent aux appl 1
+edent aux argum 1
+edent coupur 1
+edent coupur ont 1
+edent de 2
+edent de atout 1
+edent de ce 1
+edent dev 1
+edent dev la 1
+edent devrait 1
+edent don 1
+edent don pour 1
+edent dont la 1
+edent en 2
+edent en ce 1
+edent en ecritur 1
+edent en eff 1
+edent en optim 1
+edent en par 1
+edent est 3
+edent est egal 1
+edent est equiv 1
+edent est un 1
+edent etait 1
+edent etant 1
+edent g en 1
+edent hor 1
+edent hor de 1
+edent lav 1
+edent lav sur 1
+edent le 3
+edent le point 1
+edent le processus 1
+edent le propr 1
+edent nous 1
+edent ont 1
+edent ont couver 1
+edent pa 1
+edent pa la 1
+edent param 1
+edent param etr 1
+edent peut 1
+edent peut eventuel 1
+edent point 1
+edent point de 1
+edent pour 1
+edent produit 1
+edent produit la 1
+edent qu 1
+edent qu cel 1
+edent ren 1
+edent sont 2
+edent sont apt 1
+edent sont confondus 1
+edent sont util 1
+edent sur 2
+edent sur de 1
+edent tous 1
+edent tous le 1
+edent un co 1
+eder 3
+eder a ce 1
+eder a de 1
+eder a la 2
+eder a larit 1
+eder a nimport 1
+eder a un 1
+eder au 1
+eder au cod 1
+eder aux 2
+eder aux don 1
+eder aux sauvegard 1
+eder aux variabl 1
+eder en 2
+eder en ecritur 1
+eder en lectur 1
+eder en temp 1
+eder la 1
+eder le 2
+eder le droit 1
+eder le valeur 1
+eder pen 1
+eder pen tout 1
+eder simultan 1
+eder simultan ement 1
+eder un minim 1
+edg 37
+edg accur 1
+edg act 1
+edg ad 2
+edg alw impl 1
+edg and ad 1
+edg and bound 1
+edg and comb 1
+edg and comput 1
+edg and fac 1
+edg and inser 1
+edg and intersect 1
+edg and jv 1
+edg and mak 1
+edg and nod 1
+edg and receiv 1
+edg and remov 1
+edg and sen 1
+edg and sharp 1
+edg and ver 2
+edg and ver. 1
+edg ar 1
+edg ar ad 2
+edg ar combin 1
+edg ar correct 1
+edg ar creat 1
+edg ar dash 1
+edg ar defin 2
+edg ar direct 1
+edg ar drawn 1
+edg ar gener 1
+edg ar ignor 1
+edg ar inc 1
+edg ar modif 1
+edg ar sharp 1
+edg ar st 1
+edg ar util 1
+edg ar zer 1
+edg as candid 1
+edg as imag 1
+edg as match 1
+edg aug 1
+edg augm 1
+edg ba 1
+edg ba featur 1
+edg being collap 1
+edg being replac 1
+edg between cu 1
+edg between nod 2
+edg between v1 1
+edg between ver 3
+edg by definit 1
+edg can gener 1
+edg can produc 1
+edg can tak 1
+edg caus 1
+edg caus addit 1
+edg chang 2
+edg cl 1
+edg cl oper 1
+edg col. 1
+edg collap 2
+edg collap id 1
+edg collap oper 1
+edg color 1
+edg color direct 1
+edg color problem 1
+edg compl 1
+edg compl coinc 1
+edg con 1
+edg connect 5
+edg connect nod 1
+edg connect ver 1
+edg constitut 1
+edg correspon 3
+edg cr 3
+edg cr partit 1
+edg cut 1
+edg cut achief 1
+edg cut produc 1
+edg cut requir 1
+edg depict 1
+edg descript 1
+edg detect 2
+edg detect techniqu 1
+edg dil 1
+edg din 1
+edg direct 2
+edg disconnect 1
+edg disjoint 1
+edg disjoint connect 1
+edg distribut 1
+edg dout 1
+edg dual 1
+edg e fe1 1
+edg e fp 1
+edg e yield 1
+edg ea 1
+edg ea correspon 1
+edg each pair 1
+edg each switch 1
+edg eb 1
+edg ec 2
+edg ec ffv1 1
+edg ei 1
+edg eman 1
+edg en 1
+edg endpoint 1
+edg endpoint ver 1
+edg extract 1
+edg extract techniqu 1
+edg fail 1
+edg for interm 1
+edg for parser 1
+edg from cl 1
+edg from minrol 1
+edg from ni 1
+edg from ver 1
+edg gener 1
+edg giv 1
+edg go 1
+edg graph 2
+edg graph color 1
+edg graph shown 1
+edg hav cap 1
+edg hav distinct 1
+edg hav sign 1
+edg hav valu 1
+edg heap 1
+edg hr 1
+edg ht 1
+edg hu 1
+edg hv 1
+edg hw 1
+edg in aug 1
+edg in clustersg 1
+edg in e0 2
+edg in e00 1
+edg in eev 1
+edg in eexc 1
+edg in eq 1
+edg in g0 4
+edg in gd 1
+edg in im 1
+edg in imag 1
+edg in mstg 1
+edg in p1 1
+edg in p2 1
+edg in patht 1
+edg in pi 1
+edg in pj 1
+edg in scal 1
+edg in t0 1
+edg in tot 1
+edg inc 8
+edg induc 1
+edg induc init 1
+edg inform 1
+edg int ver 1
+edg interior 1
+edg interior featur 1
+edg is assign 1
+edg is assoc 1
+edg is inser 1
+edg is known 1
+edg is outg 1
+edg is register 1
+edg is somewhat 1
+edg is term 1
+edg is visit 1
+edg it con 1
+edg j join 1
+edg join 1
+edg join correspon 1
+edg label 2
+edg lead 1
+edg leav 1
+edg leav pr 1
+edg length 2
+edg link 1
+edg list 1
+edg match 2
+edg match fail 1
+edg may allow 1
+edg may con 1
+edg may var 1
+edg must con 1
+edg nam 1
+edg nam e1 1
+edg nontr 1
+edg occur 1
+edg of aug 1
+edg of e0 1
+edg of fm 1
+edg of g0 2
+edg of maxim 1
+edg of pi 1
+edg of ti 1
+edg of tj 1
+edg or branch 1
+edg or textur 1
+edg or ver 1
+edg point 2
+edg regl 1
+edg regl edg 1
+edg repr 4
+edg repr task 1
+edg repr tr 1
+edg retain 1
+edg ri 1
+edg rj 1
+edg se 3
+edg segm 1
+edg segm link 1
+edg separ 2
+edg separ contain 1
+edg separ siz 1
+edg serv 1
+edg shap 1
+edg shar 1
+edg sharp 1
+edg sharp ver 1
+edg sort 1
+edg split 1
+edg split ad 1
+edg structur 1
+edg structur contain 1
+edg t ind 1
+edg targ 1
+edg that bound 1
+edg that constitut 1
+edg that def 1
+edg that enter 1
+edg that join 1
+edg that mak 1
+edg that reach 1
+edg to ascertain 1
+edg to degr 1
+edg to ed 1
+edg to ver 1
+edg trac 1
+edg trac inform 1
+edg traver 1
+edg traver 1t2 1
+edg u0w0 1
+edg uw 1
+edg ver 1
+edg ver test 1
+edg vin 1
+edg viol 1
+edg voron 1
+edg voron diagram 1
+edg vout 1
+edg vout car 1
+edg wa ad 1
+edg wa satisf 1
+edg weight 6
+edg weight criter 1
+edg weight direct 1
+edg weight ew 1
+edg weight ew0 1
+edg weight graph 1
+edg weight undirect 1
+edg wer ad 1
+edg wh inc 1
+edg wh remov 1
+edg wh subdiv 1
+edg wil becom 1
+edg wil therefor 1
+edg with con. 1
+edg with exact 1
+edg with huv 1
+edg with prob 1
+edg with ver 1
+edg within 2d 1
+edg x1 1
+edgel 1
+edgesepar 1
+edhibitoir 1
+ediair 3
+ediair a partit 1
+ediair de 1
+ediair de ce 1
+ediair de la 1
+ediair de nouvel 1
+ediair de pr 1
+ediair du 1
+ediair du point 1
+ediair du pr 1
+ediair du som 1
+ediair dun 1
+ediair dun appel 1
+ediair dun environ 1
+ediair dun exempl 1
+ediair dun instruc 1
+ediair dun interfac 1
+ediair dun pr 1
+ediair dun simpl 1
+ediair dun tabl 1
+ediair dun transform 1
+ediair e2 1
+ediair en 1
+ediair en fait 1
+ediair entr 1
+ediair entr empil 1
+ediair entr impl 1
+ediair est 1
+ediair form 1
+ediair form ee 1
+ediair issu 1
+ediair issu respectiv 1
+ediair libr 1
+ediair libr de 1
+ediair loop 1
+ediair perm 1
+ediair perm de 1
+ediair pour 1
+ediair quun 1
+ediair quun mach 1
+ediair suiv 1
+ediat 3
+ediat clair 1
+ediat elimin 1
+ediat en 1
+ediat en consid 1
+ediat et ne 1
+ediat jump 1
+ediat suiv 1
+ediat suiv dun 1
+ediat util 1
+ediat util es 1
+edicat 1
+edicat a beaucoup 1
+edicat appar 1
+edicat appar dan 1
+edicat appel 1
+edicat appel nest 1
+edicat appel si 1
+edicat arithm 1
+edicat arithm etiqu 1
+edicat attach 1
+edicat attach attribut 1
+edicat auxiliair 1
+edicat avec 1
+edicat avec coupur 1
+edicat cal 1
+edicat cibl 1
+edicat cibl du 1
+edicat classiqu 1
+edicat classiqu concat 1
+edicat com 1
+edicat combiner 1
+edicat combiner attribut 1
+edicat comport 1
+edicat comport plusieur 1
+edicat compr 1
+edicat compr deux 1
+edicat concat 1
+edicat constitu 1
+edicat cont 1
+edicat correspon 1
+edicat cour 1
+edicat d ed 1
+edicat d etermin 1
+edicat dacc 1
+edicat dacc es 1
+edicat dan 1
+edicat dan lequel 1
+edicat darit 1
+edicat de 1
+edicat de la 1
+edicat de typ 1
+edicat derefer 1
+edicat dext 1
+edicat dext de 1
+edicat dext sont 1
+edicat dext verif 1
+edicat disj 1
+edicat dont la 1
+edicat dunif 1
+edicat equiv 1
+edicat equiv constitu 1
+edicat est 1
+edicat est compil 1
+edicat est incr 1
+edicat est plac 1
+edicat est trait 1
+edicat est var 1
+edicat et appel 1
+edicat et sauv 1
+edicat extrair 1
+edicat extrair attribut 1
+edicat facilit 1
+edicat facilit aus 1
+edicat g erant 1
+edicat geler 1
+edicat inclu 1
+edicat init 1
+edicat init cut 1
+edicat instruc 1
+edicat le 1
+edicat loop 1
+edicat me 1
+edicat me unif 1
+edicat memberchk 1
+edicat metac 1
+edicat modif 1
+edicat modif attribut 1
+edicat ne 1
+edicat ne compr 1
+edicat ne sont 1
+edicat non 1
+edicat opaqu 1
+edicat par 1
+edicat par pr 1
+edicat partit 1
+edicat peut 1
+edicat peut donc 1
+edicat pour 1
+edicat pour con 1
+edicat pour lequel 1
+edicat pr 1
+edicat pr ed 1
+edicat proc 1
+edicat prolog 1
+edicat prolog standard 1
+edicat q dan 1
+edicat qsort 1
+edicat qu 1
+edicat qu cont 1
+edicat qu doiv 1
+edicat qu lu 1
+edicat qu ne 1
+edicat qu peuv 1
+edicat r ecursif 1
+edicat s elect 1
+edicat saf 1
+edicat saf setarg 1
+edicat san se 1
+edicat sappu 1
+edicat sappu sur 1
+edicat sav ch 1
+edicat sav cut 1
+edicat soft 1
+edicat soft cut 1
+edicat sont 1
+edicat sont habituel 1
+edicat sp 1
+edicat sp ec 1
+edicat sp ecifiqu 1
+edicat tel 1
+edicat tel qu 1
+edicat unif 1
+edicat unif var 1
+edicat verif 1
+edicat verif attribut 1
+edict 1
+edict et le 1
+edinburg 1
+edinburgh 5
+edinburgh lik prolog 1
+edinburgh techn 2
+edinburgh techn report 2
+edir 1
+edir car 1
+edir car el 1
+edir le 1
+edir le perform 1
+edir san un 1
+edisc 1
+edisc intern 1
+edit 67
+edit and browser 1
+edit and layout 1
+edit by cal 1
+edit cut 1
+edit cut tool 1
+edit dat 1
+edit dist 1
+edit dist algorithm 1
+edit dist allow 1
+edit dist eff 1
+edit dist model 1
+edit dist problem 1
+edit in flesh 1
+edit introduc 1
+edit menu 1
+edit menu open 1
+edit mod 1
+edit model 1
+edit nearest 1
+edit nearest neighbor 1
+edit of ma 1
+edit out no 1
+edit problem 1
+edit prov 1
+edit rl 1
+edit to design 1
+edit tool 1
+edit would mean 1
+editedit 1
+editedit an 1
+editedit an edit 1
+editeur 1
+edler 1
+edmon 1
+edmont 2
+edr 3
+edr avec 1
+edr convec 1
+edr convec avec 1
+edr convec cont 1
+edr convec s 1
+edr d efin 1
+edr de 2
+edr de la 1
+edr de lobj 1
+edr de qn 1
+edr en 2
+edr en dim 1
+edr en util 1
+edr ent 1
+edr ent lintersect 1
+edr est 1
+edr est donc 1
+edr et le 1
+edr init 1
+edr init nest 1
+edr p peut 1
+edr par 1
+edr par de 1
+edr param 1
+edr param etr 1
+edr provoqu 1
+edr provoqu de 1
+edr rationnel 1
+edr rationnel convec 1
+edr suiv 1
+edr suiv chaqu 1
+edr sur 1
+edr sur lac 1
+edr sur le 1
+edrc 1
+edrc carneg 1
+edrc carneg mellon 1
+edu 3
+edu a de 1
+edu bien 1
+edu bien de 1
+edu le 3
+edu le eff 1
+edu le faux 1
+edu le nombr 1
+edu le temp 1
+eduard 1
+eduard ca 1
+educ 15
+educ ambit 1
+educ and research 1
+educ and sc 1
+educ appl 1
+educ ar interest 1
+educ browser 1
+educ can incorpor 1
+educ can overcom 1
+educ center 1
+educ center view 1
+educ commun 1
+educ conditionnel 1
+educ conditionnel de 1
+educ correspon 1
+educ correspon de 1
+educ de 3
+educ de acc 2
+educ de commun 1
+educ de eff 1
+educ de hypoth 1
+educ de la 2
+educ de leff 1
+educ de patron 1
+educ de synchron 1
+educ de var 1
+educ docum 1
+educ du 2
+educ du co 1
+educ du faux 1
+educ du nombr 2
+educ du temp 1
+educ dun 1
+educ dun domain 1
+educ effect 1
+educ effect feedback 1
+educ et de 1
+educ evalu 1
+educ evalu mechan 1
+educ eventuel 1
+educ eventuel de 1
+educ expect 1
+educ exper 1
+educ exper inclus 1
+educ inst 1
+educ interpreter 1
+educ involut 1
+educ involut greater 1
+educ mater 2
+educ mater avail 1
+educ multim 1
+educ nest 1
+educ nest donc 1
+educ opportun 1
+educ opportun unprec 1
+educ program 1
+educ purp 1
+educ re 1
+educ recogn 1
+educ si 1
+educ si el 1
+educ softwar 1
+educ suit 1
+educ sur 1
+educ sur le 1
+educ system 1
+educ to ea 1
+educ to emb 1
+educ to remain 1
+educ tool 2
+educ tool ra 1
+educ tout 1
+educ tout etat 1
+educ us 1
+educ wil mak 1
+educationallycenter 1
+educationallycenter perspect 1
+eductr 1
+eductr de 1
+eductr de la 1
+eduir 3
+eduir a de 1
+eduir consid 1
+eduir consid erabl 1
+eduir de 1
+eduir de born 1
+eduir egal 1
+eduir egal la 1
+eduir en 1
+eduir en se 1
+eduir grand 1
+eduir grand le 1
+eduir la 2
+eduir la band 1
+eduir la born 1
+eduir la ch 1
+eduir la consom 1
+eduir la lat 1
+eduir la longueur 1
+eduir la tail 1
+eduir le 3
+eduir le acc 1
+eduir le co 2
+eduir le eff 1
+eduir le faux 1
+eduir le modif 1
+eduir le nombr 1
+eduir le pa 2
+eduir le patron 1
+eduir le probl 1
+eduir le traf 1
+eduir le traff 1
+eduir leff 1
+eduir leff ping 1
+eduir lensembl 1
+eduir lensembl de 1
+eduir lespac 1
+eduir lespac de 1
+eduir lexpr 1
+eduir lexpr de 1
+eduir limpact 1
+eduir limpact de 1
+eduir limpact du 1
+eduir pour 1
+eduir pour le 1
+eduir qu 1
+eduir qu la 1
+eduir se 1
+eduir se eff 1
+eduir un 1
+eduir un estim 1
+eduisait 1
+eduisait linflu 1
+eduisait linflu du 1
+eduit 3
+eduit a de 1
+eduit a f0g 1
+eduit a un 1
+eduit au 1
+eduit au maxim 1
+eduit aux 1
+eduit aux deux 1
+eduit dapr 1
+eduit dapr es 1
+eduit de 1
+eduit de acc 1
+eduit donc 1
+eduit donc qu 1
+eduit en 1
+eduit en cr 1
+eduit entr 1
+eduit entr nerait 1
+eduit et dun 1
+eduit et le 1
+eduit instruc 1
+eduit jusqu 1
+eduit la 1
+eduit la consom 1
+eduit lampleur 1
+eduit lampleur du 1
+eduit le 1
+eduit le born 1
+eduit le deux 1
+eduit le eff 1
+eduit le nombr 1
+eduit le pag 1
+eduit le th 1
+eduit linflu 1
+eduit linflu sur 1
+eduit ma 1
+eduit ma au 1
+eduit pa 1
+eduit pa le 1
+eduit par 1
+eduit par appl 1
+eduit prop 1
+eduit proportionnel 1
+eduit qu 1
+eduit qu la 1
+eduit qu le 1
+eduit qu lm1 1
+eduit qu vu 1
+eduit quatr 1
+eduit quatr contraint 1
+eduit ren 1
+eduit s equenc 1
+eduit sel 1
+eduit sel le 1
+edur 2
+edur appel 1
+edur appel ee 1
+edur appel est 1
+edur d elag 1
+edur d etermin 1
+edur de 2
+edur de net 1
+edur de powel 1
+edur de program 1
+edur don 1
+edur don le 1
+edur dunif 1
+edur dunif de 1
+edur dunif init 1
+edur dunif pour 1
+edur dunif pren 1
+edur en 1
+edur en elimin 1
+edur fonct 1
+edur fonct de 1
+edur g en 2
+edur it er 1
+edur peut 1
+edur peut etr 1
+edur se 1
+edur se termin 1
+edur standard 1
+edur standard dunif 1
+edur syntaxiqu 1
+edur syntaxiqu qu 1
+edur val 1
+ee 11
+ee a adr 1
+ee a bien 1
+ee a ce 2
+ee a chaqu 2
+ee a ecritur 1
+ee a just 1
+ee a la 5
+ee a lappel 1
+ee a lappl 1
+ee a laut 1
+ee a lautr 1
+ee a le 1
+ee a lec 1
+ee a lensembl 1
+ee a lentr 1
+ee a lheur 1
+ee a linform 1
+ee a lint 1
+ee a linver 1
+ee a lir 1
+ee a lit 1
+ee a lop 1
+ee a lordonnanc 1
+ee a luniqu 1
+ee a lutil 1
+ee a partir 4
+ee a pour 1
+ee a prior 1
+ee a quel 1
+ee a sa 1
+ee a sauvegarder 1
+ee a son 1
+ee a ti 1
+ee a tous 1
+ee a traiter 1
+ee a un 3
+ee a vid 1
+ee abstrait 1
+ee abstrait var 1
+ee ad 1
+ee ad hoc 1
+ee afin 1
+ee afin de 1
+ee ain 2
+ee ain qu 1
+ee ait 1
+ee ait du 1
+ee al 2
+ee al eatoir 2
+ee algorithm 1
+ee am elior 1
+ee an 1
+ee an de 1
+ee appar 1
+ee apr 2
+ee apr es 2
+ee arith 1
+ee assoc 1
+ee assoc ee 1
+ee au 4
+ee au chapitr 1
+ee au cod 1
+ee au compilateur 1
+ee au contr 1
+ee au cou 1
+ee au cour 1
+ee au del 1
+ee au faux 1
+ee au fon 1
+ee au foncteur 1
+ee au lecteur 1
+ee au maxim 1
+ee au moin 1
+ee au moment 1
+ee au niveau 1
+ee au paragraph 2
+ee au point 1
+ee au pr 1
+ee au probl 1
+ee au processeur 1
+ee au program 1
+ee au retour 1
+ee au sein 1
+ee au som 1
+ee au syst 1
+ee au term 1
+ee au th 1
+ee au tout 1
+ee au tr 1
+ee aucun 1
+ee aucun tail 1
+ee augm 1
+ee augm avec 1
+ee aus 1
+ee aus bien 1
+ee automatiqu 1
+ee automatiqu lor 1
+ee aux 4
+ee aux ag 1
+ee aux autr 1
+ee aux deux 1
+ee aux disjonct 1
+ee aux don 1
+ee aux enregister 1
+ee aux environ 1
+ee aux etap 1
+ee aux fluc 1
+ee aux incr 1
+ee aux mvp 1
+ee aux pag 1
+ee aux point 1
+ee aux processeur 1
+ee aux register 1
+ee aux solut 1
+ee aux temp 1
+ee aux transit 1
+ee aux variabl 1
+ee aux zon 1
+ee avant 2
+ee avant deffectuer 1
+ee avant lec 1
+ee avant qu 1
+ee avec 3
+ee avec au 1
+ee avec echantillon 1
+ee avec le 2
+ee avec linstruc 1
+ee avec se 1
+ee avec son 1
+ee avec un 1
+ee be 1
+ee be xe 1
+ee bed 1
+ee bed mc 1
+ee bool 1
+ee bool een 1
+ee car 2
+ee car ee 1
+ee car il 1
+ee ce 1
+ee ce mod 1
+ee ce qu 1
+ee ceg 1
+ee cel 1
+ee cel du 1
+ee cest 1
+ee cest courir 1
+ee ci 1
+ee ci de 1
+ee classiqu 1
+ee cmp 1
+ee cmp demand 1
+ee com 4
+ee com condit 1
+ee com dan 1
+ee com de 2
+ee com grain 1
+ee com indiqu 1
+ee com le 1
+ee com param 1
+ee com part 1
+ee com pr 1
+ee com un 4
+ee compr 1
+ee compr entr 1
+ee con 2
+ee con ecutiv 1
+ee con en 1
+ee concr 1
+ee concr es 1
+ee constitu 2
+ee constitu ee 1
+ee constitu la 1
+ee constitutiv 1
+ee constitutiv dun 1
+ee contr 1
+ee contr etiqu 1
+ee correspon 2
+ee correspon est 1
+ee couram 1
+ee couram par 1
+ee cr 1
+ee cr tr 1
+ee cs 1
+ee cuml 1
+ee cuml ee 1
+ee cycliqu 1
+ee cycliqu avec 1
+ee d echang 1
+ee d efin 1
+ee d elaguer 1
+ee d epen 1
+ee d1 1
+ee dadr 1
+ee dadr vo 1
+ee dalgorithm 1
+ee dalgorithm con 1
+ee dan 4
+ee dan a1 1
+ee dan binprolog 1
+ee dan ce 3
+ee dan cutpt 1
+ee dan de 2
+ee dan la 4
+ee dan laquel 1
+ee dan le 3
+ee dan lensembl 1
+ee dan lenviron 1
+ee dan lordr 1
+ee dan notr 1
+ee dan prolog 1
+ee dan sa 1
+ee dan sicstus 1
+ee dan tous 2
+ee datent 1
+ee datent de 1
+ee datteint 1
+ee datteint dun 1
+ee de 4
+ee de acc 1
+ee de ba 1
+ee de ce 1
+ee de certain 1
+ee de chromosom 1
+ee de claus 1
+ee de comp 1
+ee de continu 1
+ee de court 1
+ee de cr 1
+ee de deux 1
+ee de differ 1
+ee de dissimilarit 1
+ee de don 1
+ee de ecritur 1
+ee de enf 1
+ee de environ 1
+ee de erreur 1
+ee de ex 1
+ee de favoriser 1
+ee de fonct 1
+ee de guid 1
+ee de instruc 1
+ee de interfac 1
+ee de la 4
+ee de larchitectur 1
+ee de larit 1
+ee de lensembl 1
+ee de lenviron 1
+ee de leur 1
+ee de lexempl 1
+ee de linstruc 1
+ee de lop 1
+ee de man 1
+ee de manipl 1
+ee de modif 1
+ee de moit 1
+ee de notr 1
+ee de pair 1
+ee de part 1
+ee de pe 1
+ee de perm 1
+ee de plusieur 2
+ee de point 1
+ee de processus 1
+ee de prolog 1
+ee de remplac 1
+ee de requ 1
+ee de retr 1
+ee de sauvegarder 1
+ee de sort 1
+ee de spendl 1
+ee de statistiqu 1
+ee de strat 1
+ee de techniqu 1
+ee de tel 1
+ee de term 1
+ee de th 1
+ee de ti 1
+ee de tick 1
+ee de tout 2
+ee de tr 2
+ee de trait 1
+ee de typ 1
+ee de variabl 1
+ee de vecteur 1
+ee de vi 1
+ee demand 1
+ee demand de 1
+ee depu 1
+ee depu le 1
+ee deux 2
+ee deux fo 1
+ee dev 2
+ee diff 2
+ee diff erent 2
+ee dinstruc 1
+ee direct 1
+ee direct de 1
+ee direct du 1
+ee directr 1
+ee directr qu 1
+ee disponibl 2
+ee disponibl dan 1
+ee disponibl mat 1
+ee dist 1
+ee dist gestionnair 1
+ee distinct 2
+ee distinct appart 1
+ee distinct issu 1
+ee doit 1
+ee doit etr 1
+ee doiv 2
+ee doiv etr 2
+ee don 1
+ee don de 1
+ee donc 1
+ee donc co 1
+ee dont il 2
+ee dot 1
+ee dot ee 1
+ee du 3
+ee du chapitr 1
+ee du fait 1
+ee du ph 1
+ee du point 1
+ee du pr 1
+ee du pr. 1
+ee du program 1
+ee du retour 1
+ee du sch 1
+ee du surc 1
+ee du taux 1
+ee du term 1
+ee dun 3
+ee dun acc 1
+ee dun bon 1
+ee dun ch 1
+ee dun coupur 1
+ee dun diffus 1
+ee dun ensembl 1
+ee dun fonct 1
+ee dun gestionnair 1
+ee dun liaison 1
+ee dun mot 1
+ee dun op 1
+ee dun param 1
+ee dun part 1
+ee dun program 1
+ee dun protocol 1
+ee dun term 1
+ee dun typ 1
+ee dur 1
+ee dur la 1
+ee dynamiqu 1
+ee echec 1
+ee egal 1
+ee en 4
+ee en annec 1
+ee en aval 1
+ee en avant 1
+ee en bloc 1
+ee en cascad 1
+ee en chaqu 1
+ee en cour 1
+ee en de 1
+ee en deux 2
+ee en diff 1
+ee en ecritur 1
+ee en figur 1
+ee en fonct 2
+ee en introdu 1
+ee en le 1
+ee en lectur 1
+ee en millisecon 1
+ee en mod 1
+ee en nombr 1
+ee en pag 1
+ee en par 1
+ee en param 1
+ee en part 1
+ee en plac 1
+ee en pratiqu 1
+ee en prem 1
+ee en prolog 1
+ee en register 1
+ee en restreign 1
+ee en rev 1
+ee en revu 1
+ee en som 1
+ee en soulign 1
+ee en sous 1
+ee en tout 1
+ee en tr 2
+ee en un 2
+ee en util 2
+ee ensuit 1
+ee entr 3
+ee entr deux 2
+ee entr le 2
+ee entr plusieur 1
+ee entr som 1
+ee essentiel 1
+ee essentiel est 1
+ee est 4
+ee est accru 1
+ee est attractif 1
+ee est au 1
+ee est aus 1
+ee est const 1
+ee est de 1
+ee est distribu 1
+ee est donc 1
+ee est dutiliser 1
+ee est effecu 1
+ee est identiqu 1
+ee est ind 1
+ee est inf 1
+ee est init 1
+ee est la 2
+ee est lanneau 1
+ee est le 1
+ee est mal 1
+ee est rendu 1
+ee est syst 1
+ee est un 3
+ee est util 1
+ee et an 1
+ee et aux 1
+ee et claus 1
+ee et dautr 1
+ee et de 3
+ee et distribu 1
+ee et donc 2
+ee et dordr 1
+ee et du 1
+ee et effectu 1
+ee et enregister 1
+ee et fr 1
+ee et informatiqu 1
+ee et inteconnect 1
+ee et judicieus 1
+ee et la 3
+ee et ladr 1
+ee et largum 1
+ee et le 3
+ee et lec 1
+ee et lordonnanc 1
+ee et lutil 1
+ee et optim 1
+ee et ou 1
+ee et particl 1
+ee et popl 1
+ee et restaur 1
+ee et son 1
+ee et stabl 1
+ee et surtout 1
+ee et tout 1
+ee et un 2
+ee et unif 1
+ee etant 2
+ee etant de 1
+ee etd 1
+ee etd la 1
+ee etr 1
+ee etr init 1
+ee exp 2
+ee exp erim 2
+ee exponentiel 1
+ee exponentiel de 1
+ee ext 1
+ee ext erieur 1
+ee fait 1
+ee fait qu 1
+ee fer 1
+ee fer ain 1
+ee figur 1
+ee fin 1
+ee fin ou 1
+ee fonct 1
+ee fonct de 1
+ee fournit 1
+ee fournit aus 1
+ee fournit donc 1
+ee franc 1
+ee franc de 1
+ee g som 1
+ee glob 3
+ee glob suiv 1
+ee glob sur 1
+ee gr 1
+ee gr ac 1
+ee habituel 1
+ee habituel pa 1
+ee ic 2
+ee imp 1
+ee inconditionnel 1
+ee inconditionnel est 1
+ee ind 2
+ee ind ependam 2
+ee init 1
+ee init afin 1
+ee init consom 1
+ee instruc 1
+ee inutil 1
+ee inutil accessibl 1
+ee isol 1
+ee isol ement 1
+ee jusqu 1
+ee jusquau 1
+ee just 1
+ee just avant 1
+ee koan 1
+ee l eg 1
+ee l egal 1
+ee la 1
+ee la valeur 1
+ee le 3
+ee le inform 1
+ee le lectur 1
+ee le nombr 1
+ee le pr 1
+ee le pseud 1
+ee le transit 1
+ee le variabl 1
+ee libr 1
+ee linform 1
+ee linform de 1
+ee loc 2
+ee lop 1
+ee lop erat 1
+ee lor 2
+ee lor de 2
+ee lor du 1
+ee m em 1
+ee ma 2
+ee ma compl 1
+ee ma sa 1
+ee ma vi 1
+ee mac 1
+ee mac vient 1
+ee maint 1
+ee maint la 1
+ee maintenu 1
+ee maintenu fort 1
+ee manipl 1
+ee manipl ee 1
+ee maxim 1
+ee minim 1
+ee minim dun 1
+ee munin 1
+ee n ecessair 2
+ee n ecessit 1
+ee na 1
+ee na pa 1
+ee nacc 1
+ee nacc edent 1
+ee nait 1
+ee nait pa 1
+ee naurait 1
+ee naurait pa 1
+ee ne 3
+ee ne boug 1
+ee ne boulever 1
+ee ne peut 1
+ee ne peuv 1
+ee ne pourront 1
+ee ne sont 1
+ee ne subit 1
+ee nest 1
+ee nest pa 1
+ee nindu 1
+ee nindu quun 1
+ee non 1
+ee non loc 1
+ee nont 1
+ee nont pa 1
+ee nutil 1
+ee nutil qu 1
+ee obtenu 1
+ee obtenu sont 1
+ee odan 1
+ee odan la 1
+ee on 1
+ee ont 1
+ee ont perm 1
+ee ordinair 1
+ee originel 1
+ee ou 3
+ee ou claus 1
+ee ou encor 1
+ee ou nappart 1
+ee ou non 1
+ee ou qu 1
+ee ou sur 1
+ee pa 2
+ee pa de 1
+ee pa deff 1
+ee pa incontestabl 1
+ee pag 1
+ee pag conflictuel 1
+ee pag fr 1
+ee par 4
+ee par 2k 1
+ee par addit 1
+ee par an 1
+ee par ancourt 1
+ee par bloc 1
+ee par ce 1
+ee par chaqu 1
+ee par cp 1
+ee par d1 1
+ee par de 3
+ee par dem 1
+ee par deux 2
+ee par ek 1
+ee par el 1
+ee par elan 1
+ee par empil 1
+ee par feautr 1
+ee par goldberg 1
+ee par holzbaur 1
+ee par inv 1
+ee par jalb 1
+ee par la 3
+ee par lanc 1
+ee par le 4
+ee par lec 1
+ee par lenv 1
+ee par lexempl 1
+ee par lign 1
+ee par lindgr 1
+ee par linser 1
+ee par linterm 1
+ee par lutilisateur 2
+ee par me 1
+ee par naish 1
+ee par notr 1
+ee par oboyl 1
+ee par ordr 1
+ee par patron 1
+ee par plusieur 2
+ee par robinson 1
+ee par sep 1
+ee par simpl 1
+ee par tarau 1
+ee par taylor 1
+ee par tick 1
+ee par touat 1
+ee par tout 1
+ee par un 3
+ee par van 1
+ee par zhou 1
+ee partag 1
+ee partag ee 1
+ee pen 1
+ee pen lec 1
+ee perm 2
+ee perm de 1
+ee perm desp 1
+ee perm la 1
+ee perman 1
+ee perman afin 1
+ee peut 2
+ee peut etr 1
+ee peut sembler 1
+ee peuv 3
+ee peuv etr 3
+ee peuv provenir 1
+ee pil 1
+ee pil glob 1
+ee pip 1
+ee plus avant 1
+ee plus etendu 1
+ee plus glob 1
+ee plus lim 1
+ee plus qu 1
+ee plut 1
+ee plut ot 1
+ee pour 4
+ee pour assurer 1
+ee pour chaqu 1
+ee pour de 1
+ee pour effectuer 1
+ee pour enregistrer 1
+ee pour etud 1
+ee pour eviter 1
+ee pour exploiter 1
+ee pour impl 1
+ee pour kcm 1
+ee pour la 3
+ee pour lappel 1
+ee pour le 1
+ee pour lop 1
+ee pour modif 1
+ee pour notr 1
+ee pour obtenir 1
+ee pour parvenir 1
+ee pour pouvoir 1
+ee pour produir 1
+ee pour qu 1
+ee pour stocker 1
+ee pour supprimer 1
+ee pour synth 1
+ee pour tous 1
+ee pour traiter 1
+ee pour visualiser 1
+ee pr 2
+ee pr ec 2
+ee pren 1
+ee pren en 1
+ee probabil 1
+ee probabil originel 1
+ee probabil suiv 1
+ee prochain 1
+ee prochain pour 1
+ee provoqu 1
+ee provoqu le 1
+ee qu 4
+ee qu dan 1
+ee qu just 1
+ee qu la 1
+ee qu le 1
+ee qu lorsqu 1
+ee qu nous 1
+ee qu par 2
+ee qu peuv 1
+ee qu pour 1
+ee qu ser 1
+ee qu sur 1
+ee qu vien 1
+ee quand 1
+ee quand il 1
+ee quel 2
+ee quel qu 2
+ee quil 1
+ee quun 1
+ee quun fo 1
+ee quun proj 1
+ee r eal 1
+ee r eel 1
+ee r ef 1
+ee r es 1
+ee r esiduel 1
+ee r esult 2
+ee rallong 1
+ee rallong dun 1
+ee refl 1
+ee refl es 1
+ee relativ 1
+ee relativ difficil 1
+ee repr 1
+ee repr esent 1
+ee requ 1
+ee requ aus 1
+ee requ donc 1
+ee rest 2
+ee rest lec 1
+ee rest libr 1
+ee retenu 1
+ee retenu est 1
+ee risqu 1
+ee risqu de 1
+ee risqu donc 1
+ee s 1
+ee s ecrit 1
+ee san affecter 1
+ee san attendr 1
+ee san co 1
+ee san conflit 1
+ee san possibilit 1
+ee san recour 1
+ee se 3
+ee se comport 1
+ee se lim 1
+ee se pr 1
+ee se sont 1
+ee sect 1
+ee sembl 1
+ee sembl lim 1
+ee seq 1
+ee seq dp 1
+ee seq sh 1
+ee ser 1
+ee ser alor 1
+ee ser de 1
+ee serait 1
+ee serait du 1
+ee sest 1
+ee sest effectu 1
+ee si 3
+ee si el 1
+ee si le 1
+ee si leur 1
+ee si lon 1
+ee similair 1
+ee similair aux 1
+ee simpl 2
+ee simpl dacc 1
+ee simplec 1
+ee simplec method 1
+ee simplif 1
+ee simplif aus 1
+ee simultan 1
+ee simultan ement 1
+ee situ 1
+ee situ ee 1
+ee soit 2
+ee soit automatiqu 1
+ee soit par 2
+ee sont 3
+ee sont compl 1
+ee sont connu 1
+ee sont dan 1
+ee sont dapr 1
+ee sont direct 1
+ee sont don 1
+ee sont du 1
+ee sont echang 1
+ee sont exprim 1
+ee sont issu 1
+ee sont le 1
+ee sont lexicopositif 1
+ee sont pr 1
+ee sont quasim 1
+ee sont rej 1
+ee sont sauvegard 1
+ee sont utilisabl 1
+ee sort 1
+ee sous 2
+ee sous jacent 1
+ee sous le 1
+ee sous leur 1
+ee statiqu 1
+ee suiv 3
+ee suiv ce 1
+ee suiv dun 1
+ee suiv la 1
+ee suiv lorgan 1
+ee sur 4
+ee sur ce 1
+ee sur de 2
+ee sur diff 1
+ee sur la 3
+ee sur lan 1
+ee sur le 4
+ee sur lensembl 1
+ee sur lexempl 1
+ee sur lutil 1
+ee sur un 4
+ee sur usenet 1
+ee surviv 1
+ee surviv au 1
+ee t est 1
+ee tag 1
+ee tb 1
+ee tel 2
+ee tel qu 2
+ee term 1
+ee term comp 1
+ee term mutabl 1
+ee tr 2
+ee tr es 1
+ee tr nag 1
+ee trail 1
+ee trail tid 1
+ee trait 1
+ee trait ee 1
+ee u dordr 1
+ee un 3
+ee un an 1
+ee un grand 1
+ee un indirect 1
+ee un inst 1
+ee un point 1
+ee un tail 1
+ee un trou 1
+ee un vr 1
+ee uniqu 2
+ee uniqu accessibl 1
+ee uniqu de 1
+ee util 2
+ee util ee 2
+ee util un 1
+ee va 2
+ee va clair 1
+ee va orienter 1
+ee va recevoir 1
+ee va simpl 1
+ee var 3
+ee var de 1
+ee var enorm 1
+ee ver 2
+ee ver la 1
+ee ver plusieur 1
+ee ver sa 1
+ee vi lalgorithm 1
+ee vi son 1
+ee vi un 1
+ee vo 1
+ee vo auront 1
+ee vr 1
+ee w jn 1
+ee x1 1
+ee zj 1
+ee zj de 1
+ee4 1
+eec 2
+eec a lunif 1
+eec esprit 1
+eec esprit ba 1
+eel 5
+eel a un 1
+eel additiv 1
+eel altern 1
+eel apr 1
+eel apr es 1
+eel besoin 1
+eel compl 1
+eel compl es 1
+eel d emontr 1
+eel dan 2
+eel dan de 1
+eel dan le 1
+eel de 4
+eel de bl 1
+eel de la 1
+eel de linstruc 1
+eel de migr 1
+eel de recherch 1
+eel de tail 1
+eel de term 1
+eel destructif 1
+eel doit 1
+eel doit etr 1
+eel dun 1
+eel dun conflit 1
+eel en 1
+eel en doubl 1
+eel en simpl 1
+eel et du 1
+eel et en 1
+eel et le 1
+eel et virtuel 1
+eel mn 1
+eel nait 1
+eel ou 1
+eel ou simpl 1
+eel ou virtuel 1
+eel peut 1
+eel peut aus 1
+eel posit 1
+eel pour 1
+eel pour la 1
+eel qu 1
+eel qu veut 1
+eel rest 1
+eel sont 1
+eel sont rar 1
+eel sur 1
+eel tir 1
+eel vn 1
+eel x correspon 1
+eel x01 1
+eel x01 tir 1
+een 4
+een g sur 1
+een reconnaissabl 1
+een suscept 1
+een suscept de 1
+eent 1
+eent pa 1
+eent pa de 1
+eent un 1
+eent un prem 1
+eequ 1
+eequ tim 1
+eer 3
+eer aucun 1
+eer aucun part 1
+eer de 1
+eer de ch 1
+eer de eff 1
+eer de longu 1
+eer de point 1
+eer de pointeur 1
+eer de tel 1
+eer de trou 1
+eer de ver 1
+eer denviron 1
+eer denviron pour 1
+eer deux 1
+eer l etiqu 1
+eer le 1
+eer le bloc 1
+eer lenviron 1
+eer lenviron de 1
+eer point 1
+eer point de 1
+eer un 2
+eer un ensembl 1
+eer un environ 1
+eer un inst 1
+eer un nouvel 1
+eer un point 1
+eer un rou 1
+eerait 1
+eerait en 1
+eerait en eff 1
+eerait un 1
+eerait un confus 1
+eerait un point 1
+eev 1
+eev and eexc 1
+eev and link 1
+eev contribut 1
+eexc 1
+eexc and eev 1
+eexc contribut 1
+eexc is csb 1
+ef 8
+ef ci 1
+ef ci schedl 1
+ef cient 1
+ef cient algorithm 1
+ef cient fetch 1
+ef cient graph 1
+ef cient implem 1
+ef cient prior 1
+ef cient probabil 1
+ef cient select 1
+ef d epen 1
+ef de 2
+ef de ce 1
+ef de lintroduc 1
+ef du 1
+ef du part 1
+ef dun 1
+ef dun bon 1
+ef e ae 1
+ef e de 1
+ef e deux 1
+ef er 5
+ef er aff 1
+ef er antagon 1
+ef er au 2
+ef er aux 1
+ef er bibliographiqu 1
+ef er classiqu 1
+ef er cr 1
+ef er de 2
+ef er doit 1
+ef er du 1
+ef er dun 2
+ef er en 2
+ef er est 2
+ef er ex 1
+ef er fourn 1
+ef er glob 1
+ef er illicit 1
+ef er la 1
+ef er lin 1
+ef er loc 1
+ef er modif 1
+ef er na 1
+ef er ne 1
+ef er ni 1
+ef er ont 1
+ef er ou 1
+ef er par 1
+ef er peut 1
+ef er po 1
+ef er point 1
+ef er pour 2
+ef er prison 1
+ef er qu 1
+ef er quil 1
+ef er r0 1
+ef er ref 1
+ef er ren 1
+ef er repr 1
+ef er sont 1
+ef er standard 1
+ef er sur 1
+ef er tr 1
+ef er un 1
+ef er ver 1
+ef eren 2
+ef erenc 3
+ef erenc ce 1
+ef erenc correspon 1
+ef erenc dan 1
+ef erenc de 1
+ef erenc doit 1
+ef erenc doiv 1
+ef erenc dun 1
+ef erenc ee 3
+ef erenc es 1
+ef erenc est 1
+ef erenc le 1
+ef erenc lor 1
+ef erenc ne 1
+ef erenc pour 1
+ef erenc pu 1
+ef erenc qu 1
+ef erenc retourn 1
+ef erenc un 1
+ef erencer 1
+ef erencer un 1
+ef erent 1
+ef erent la 1
+ef erentiel 1
+ef erentiel est 1
+ef erentiel la 1
+ef erentiel lechantillon 1
+ef erentiel ou 1
+ef erentiel perm 1
+ef erentiel pr 1
+ef erentiel selon 1
+ef eron 1
+ef eron appeler 1
+ef est 1
+ef est doubl 1
+ef expect 1
+ef expect failur 1
+ef implem 1
+ef optim 1
+ef princip 1
+ef princip de 1
+ef qu 1
+ef qu pour 1
+ef rf 1
+ef rf learn 1
+ef zienzsteigerung 1
+ef zienzsteigerung durch 1
+efail 1
+efail du 1
+efail du syst 1
+efail est 1
+efail et donc 1
+efail et se 1
+efail le 1
+efail le syst 1
+efail lorsqu 1
+efail lorsqu la 1
+efair 1
+efair de 1
+efair de tel 1
+efair le 1
+efair le eff 1
+efair le liaison 1
+efait 1
+efait au 1
+efait au retour 1
+efait et lenregister 1
+efast 1
+efaut 3
+efaut a fr 1
+efaut a un 1
+efaut align 1
+efaut align es 1
+efaut au 1
+efaut au cour 1
+efaut augm 1
+efaut augm si 1
+efaut avec 1
+efaut avec le 1
+efaut compr 1
+efaut compr donc 1
+efaut de 2
+efaut de cach 1
+efaut de ce 1
+efaut de convexit 1
+efaut de pag 2
+efaut diminu 1
+efaut diminu si 1
+efaut dinstanc 1
+efaut dinstanc de 1
+efaut doit 1
+efaut doit en 1
+efaut du 1
+efaut du mod 1
+efaut dus 1
+efaut en 1
+efaut en ecritur 1
+efaut en fonct 1
+efaut en lectur 1
+efaut engendr 1
+efaut engendr de 1
+efaut engendr es 1
+efaut env 1
+efaut env un 1
+efaut est 1
+efaut est le 1
+efaut et donc 1
+efaut et le 1
+efaut etant 1
+efaut ma 1
+efaut ma sel 1
+efaut ne 1
+efaut ne po 1
+efaut nengendr 1
+efaut nengendr qu 1
+efaut nest 1
+efaut nest pa 1
+efaut par 1
+efaut par le 1
+efaut po 1
+efaut po ed 1
+efaut pour 1
+efaut pour la 1
+efaut pour obtenir 1
+efaut pourront 1
+efaut pourront etr 1
+efaut pren 1
+efaut pren tout 1
+efaut provoqu 1
+efaut provoqu es 1
+efaut qu 1
+efaut qu ne 1
+efaut quel 1
+efaut re coit 1
+efaut suppl 1
+efaut suppl ementair 1
+efaut ten 1
+efaut ten ver 1
+efaut vont 1
+efaut vont etr 1
+efavor 2
+efavor a lieu 1
+efavor es 1
+efavor es par 1
+eff 93
+eff 3.3how 1
+eff 3.3how ea 1
+eff a caus 1
+eff a manner 1
+eff accommod 1
+eff accru 1
+eff algorithm 12
+eff algorithm ba 1
+eff and comfort 1
+eff and conc 1
+eff and ea 1
+eff and effect 2
+eff and flec 1
+eff and improv 2
+eff and maint 1
+eff and popl 1
+eff and pract 1
+eff and program 2
+eff and put 1
+eff and rel 1
+eff and robust 1
+eff and scal 2
+eff and spac 1
+eff and st 1
+eff and strateg 1
+eff and thorough 1
+eff appl 1
+eff approxim 1
+eff approxim algorithm 1
+eff arrang 1
+eff as using 1
+eff atom 1
+eff atom muticast 1
+eff aux 1
+eff aux sel 1
+eff becaus block 1
+eff bin 1
+eff bin program 1
+eff both prolog 1
+eff bottom 1
+eff bound 1
+eff bound concur 1
+eff broadcast 2
+eff broadcast gather 1
+eff but requir 1
+eff by an 1
+eff by av 1
+eff by maintain 1
+eff by rel 1
+eff by transl 1
+eff ce 1
+eff ce comport 1
+eff ce per 1
+eff character 1
+eff cluster 1
+eff cluster maint 1
+eff cod 2
+eff cod gener 1
+eff cod schedl 1
+eff combin 1
+eff combin algorithm 1
+eff commun 2
+eff commun schem 1
+eff compar 1
+eff comparison 1
+eff compil 1
+eff compil framework 1
+eff compiler 2
+eff comput 3
+eff configur 1
+eff consider 1
+eff constraint 2
+eff constraint hierarc 1
+eff constraint satisf 1
+eff constraint solut 2
+eff construc 2
+eff context 1
+eff context switch 1
+eff converg 1
+eff converg check 1
+eff cop 1
+eff cop garb 1
+eff d eliminer 1
+eff dan 1
+eff dan le 1
+eff dat 2
+eff dat structur 2
+eff dataflow 1
+eff dataflow mach 1
+eff de 3
+eff de bord 2
+eff de ce 1
+eff de conflit 1
+eff de faux 1
+eff de la 1
+eff de lallong 1
+eff de lop 1
+eff de migr 1
+eff de ne 1
+eff de op 1
+eff de pan 1
+eff de ping 1
+eff de pr 1
+eff de substitut 1
+eff de tout 1
+eff de traiter 1
+eff dec 1
+eff dec procedur 1
+eff design 2
+eff determin 1
+eff diagnost 1
+eff diagnost rl 1
+eff differ 1
+eff differ timesl 1
+eff distribut 2
+eff distribut protocol 1
+eff distribut st 1
+eff du 2
+eff du faux 1
+eff du ph 1
+eff du ping 1
+eff du regroup 1
+eff du shar 1
+eff dun 2
+eff dun regroup 1
+eff dun simpl 1
+eff dus 1
+eff dus aux 1
+eff est 1
+eff est par 1
+eff estim 1
+eff evalu 1
+eff evalu constraint 1
+eff evalu langu 1
+eff evalu techniqu 1
+eff execut 6
+eff execut cr 1
+eff execut test 1
+eff exploit 1
+eff fair 1
+eff fair queu 1
+eff feed 1
+eff for displ 1
+eff for rout 1
+eff from av 1
+eff gain 1
+eff gain using 1
+eff gener 1
+eff handl 2
+eff handl tag 1
+eff hardwar 1
+eff hardwar multicast 1
+eff hash 1
+eff hash schem 1
+eff heur 4
+eff heur procedur 3
+eff high bandwidth 1
+eff high level 1
+eff if furthermor 1
+eff ignor 1
+eff impl 2
+eff impl broadcast 1
+eff implem 14
+eff implem multicast 1
+eff implem strateg 1
+eff implem techniqu 2
+eff implicit 1
+eff implicit membership 1
+eff improv 1
+eff in boolean 1
+eff in execut 1
+eff in loc 1
+eff in order 1
+eff in parallel 2
+eff in pract 1
+eff in solut 1
+eff in term 1
+eff ind 2
+eff ind esirabl 1
+eff ind method 1
+eff infer 1
+eff infer method 1
+eff infinit 1
+eff infinit lookahead 1
+eff inl 1
+eff inl cod 1
+eff interconnect 1
+eff interconnect design 1
+eff interconnect multipl 1
+eff interpr 2
+eff interpr c.f 1
+eff interpr cor 1
+eff interpr ext 1
+eff interpr fsu 1
+eff interpreter 1
+eff intersect 1
+eff intersect algorithm 1
+eff inv 1
+eff is guaranteed 2
+eff is improv 1
+eff iter 1
+eff iter algorithm 1
+eff l eff 1
+eff la 1
+eff la pr 1
+eff la prem 1
+eff lav 1
+eff lav de 1
+eff lav dentrelacer 1
+eff layout 2
+eff le 1
+eff le don 1
+eff le lectur 1
+eff lec 1
+eff lec dun 1
+eff libr 1
+eff lisp 1
+eff lisp system 1
+eff list 1
+eff list manag 1
+eff loc 4
+eff loc pol 1
+eff loc search 1
+eff lock 1
+eff m em 1
+eff manner 1
+eff map 2
+eff margin 1
+eff margin si 1
+eff me 1
+eff me layer 1
+eff mean 2
+eff measur 1
+eff mechan 1
+eff method 5
+eff method ba 1
+eff method dispatch 1
+eff methodolog 1
+eff mortel 1
+eff mortel est 1
+eff n ecessair 1
+eff n egatif 1
+eff ne 1
+eff ne peuv 1
+eff nous 1
+eff nous avon 1
+eff of approxim 1
+eff of custom 1
+eff of deep 1
+eff of dejavu1 1
+eff of diagn 1
+eff of imper 1
+eff of interpreter 1
+eff of minim 1
+eff of model 1
+eff of oper 1
+eff of optim 1
+eff of rel 1
+eff of standard 1
+eff on ext 1
+eff optimiser 1
+eff or effect 1
+eff or prec 1
+eff out 1
+eff p1 1
+eff pag 1
+eff pag decomposit 1
+eff parallel 8
+eff parallel algorithm 3
+eff parallel cod 1
+eff parallel hardwar 1
+eff parallel proc 1
+eff parser 1
+eff partit 1
+eff perform 1
+eff peuv 1
+eff peuv etr 1
+eff phy 1
+eff phy dim 1
+eff ping 1
+eff ping pong 1
+eff plus un 1
+eff point 1
+eff pol 1
+eff positif 1
+eff positif de 1
+eff positif ne 1
+eff pr 1
+eff pr es 1
+eff pram 1
+eff pram typ 1
+eff pratiqu 1
+eff problem 1
+eff proc 1
+eff program 3
+eff program an 1
+eff protocol 1
+eff pur 1
+eff pur decl 1
+eff qu 3
+eff qu proc 1
+eff qu si 1
+eff quant 1
+eff quant no 1
+eff quest 1
+eff quest prob 1
+eff ram 1
+eff ram cod 1
+eff real 1
+eff reason 2
+eff reason compon 1
+eff reduc 2
+eff reflect 1
+eff reflect system 1
+eff regr 1
+eff regr test 1
+eff rel 1
+eff rel multicast 1
+eff remov 1
+eff repr 1
+eff robust 1
+eff rout 1
+eff rout schem 1
+eff s equilibr 1
+eff satisf 1
+eff satisf algorithm 1
+eff schedl 2
+eff schedl algorithm 1
+eff schem 1
+eff sd 1
+eff sd inh 1
+eff sd reader 1
+eff sd writer 1
+eff search 1
+eff secondair 1
+eff secondair de 1
+eff sequ 1
+eff sequ algorithm 1
+eff si 1
+eff si ce 1
+eff si deux 1
+eff si lon 1
+eff simpl 1
+eff simpl load 1
+eff singl 1
+eff singl cop 1
+eff softwar 1
+eff softwar ba 1
+eff softwar multicast 1
+eff solut 3
+eff solut cl 1
+eff sort 1
+eff sort algorithm 1
+eff sourn 1
+eff sourn de 1
+eff spac 1
+eff spat 1
+eff spat dat 1
+eff spmd 1
+eff st 2
+eff stat 1
+eff stat topolog 1
+eff subsum 1
+eff subsum resolut 1
+eff support 2
+eff sur 2
+eff sur le 1
+eff sur linstanc 1
+eff system 2
+eff techniqu 2
+eff than cal 1
+eff to increm 1
+eff to interconnect 1
+eff to loc 1
+eff to sign 1
+eff transform 1
+eff transit 1
+eff transit closur 1
+eff transl 1
+eff try 1
+eff un 1
+eff un conflit 1
+eff un doubl 1
+eff univer 1
+eff univer program 1
+eff unshuffl 1
+eff upd 1
+eff upd mater 1
+eff us 5
+eff us clp 1
+eff using 1
+eff ver 2
+eff way using 1
+eff when appl 1
+eff when implem 1
+eff which fac 1
+effect 90
+effect a ind 1
+effect a st 1
+effect addr 1
+effect algorithm 1
+effect allow 1
+effect altern 1
+effect and block 1
+effect and conv 1
+effect and ea 1
+effect and econom 1
+effect and eff 1
+effect and effect 1
+effect and prev 1
+effect and scal 1
+effect and succ 1
+effect appl 1
+effect appl load 1
+effect approach 1
+effect ar illustr 1
+effect ar weaker 1
+effect architectur 2
+effect as shown 1
+effect as system 1
+effect by ext 1
+effect by user 1
+effect by using 1
+effect circuit 1
+effect circuit cluster 1
+effect collect 1
+effect comp 1
+effect compar 1
+effect compar loc 1
+effect configur 1
+effect configur offer 1
+effect corrupt 1
+effect decoupl 1
+effect detect 1
+effect detect edg 1
+effect determin 1
+effect determin test 1
+effect do inform 1
+effect du 1
+effect elimin 1
+effect execut 1
+effect execut decl 1
+effect exploit 4
+effect extract 1
+effect feedback 1
+effect find 1
+effect for achief 1
+effect for compon 1
+effect for gi 1
+effect for implem 1
+effect form 1
+effect found 1
+effect fr 1
+effect grammar 1
+effect grant 1
+effect halt 1
+effect handl 2
+effect heur 2
+effect heur algorithm 1
+effect identif 1
+effect in act 1
+effect in coar 1
+effect in comput 1
+effect in imag 1
+effect in narx 1
+effect in subcl 1
+effect in support 1
+effect in term 1
+effect in transform 1
+effect incorpor 1
+effect incr 1
+effect init 1
+effect init topolog 1
+effect input 1
+effect input bandwidth 1
+effect input load 1
+effect is clear 1
+effect is lim 1
+effect is remov 1
+effect judg 1
+effect judg test 1
+effect learn 1
+effect learn aid 1
+effect load 2
+effect load bal 1
+effect manag 1
+effect manner 1
+effect map 1
+effect mask 2
+effect maxscor 1
+effect maxscor strateg 1
+effect measur 1
+effect measur theor 1
+effect method 2
+effect multicast 1
+effect mut 1
+effect mut rat 1
+effect network 1
+effect network comput 1
+effect nov 1
+effect nov us 1
+effect occur 1
+effect of act 1
+effect of adopt 1
+effect of allow 1
+effect of aud 1
+effect of background 1
+effect of becom 1
+effect of branch 1
+effect of chang 3
+effect of cl 1
+effect of combin 1
+effect of commun 1
+effect of condit 2
+effect of constrain 1
+effect of crossover 1
+effect of dataflow 1
+effect of dejavu 1
+effect of dynam 1
+effect of error 1
+effect of evolut 1
+effect of failur 1
+effect of fal 2
+effect of fault 2
+effect of finit 1
+effect of frug 1
+effect of fw 1
+effect of gener 1
+effect of group 1
+effect of host 1
+effect of incompl 1
+effect of input 1
+effect of interproc 1
+effect of introduc 1
+effect of lim 1
+effect of mak 3
+effect of med 1
+effect of minim 1
+effect of modif 1
+effect of nod 1
+effect of order 1
+effect of other 1
+effect of perfect 1
+effect of pool 1
+effect of prev 1
+effect of problem 1
+effect of proc 2
+effect of quant 1
+effect of recomb 1
+effect of replac 1
+effect of schem 1
+effect of self 2
+effect of shar 1
+effect of specl 1
+effect of spread 1
+effect of suggest 1
+effect of suit 1
+effect of systemdynamicson 1
+effect of test 1
+effect of textur 1
+effect of unrol 1
+effect of using 2
+effect of var 2
+effect of vect 1
+effect on backtrack 1
+effect on br 1
+effect on cl 1
+effect on classif 1
+effect on contempor 1
+effect on funct 1
+effect on neuron 1
+effect optim 1
+effect optim using 1
+effect order 1
+effect order heur 1
+effect overlap 1
+effect parallel 2
+effect parallel system 1
+effect parameter 1
+effect part 1
+effect part evalu 1
+effect plac 1
+effect pot 1
+effect pot yield 1
+effect pr 1
+effect privileg 1
+effect privileg assoc 1
+effect privileg se 1
+effect procedur 1
+effect quer 1
+effect r configur 1
+effect random 1
+effect random test 1
+effect recomb 1
+effect reduc 1
+effect reducibil 1
+effect reflect 1
+effect regr 1
+effect regr test 1
+effect remov 1
+effect replac 1
+effect result 1
+effect rever 1
+effect select 1
+effect select retest 1
+effect sem 1
+effect sem fr 1
+effect slot 1
+effect slot descript 1
+effect softwar 1
+effect softwar system 1
+effect solut 1
+effect spec 1
+effect strateg 1
+effect structur 1
+effect structur method 1
+effect such chang 1
+effect system 1
+effect taught 1
+effect teach 1
+effect techniqu 1
+effect th load 1
+effect th loc 1
+effect th perform 1
+effect th remov 1
+effect th tot 1
+effect that bal 1
+effect to impl 1
+effect to rerun 1
+effect to separ 1
+effect turn 1
+effect us 1
+effect util 2
+effect valu 1
+effect wer overcomp 1
+effect whil maintain 1
+effect with low 1
+effect work 1
+effect yield 1
+effect yield multipl 1
+effectif 1
+effectif fluctu 1
+effectif fluctu alor 1
+effectiv 2
+effectiv a lim 1
+effectiv a un 1
+effectiv de 1
+effectu 4
+effectu alor 1
+effectu alor un 1
+effectu ce 1
+effectu ce sauvegard 1
+effectu dan 1
+effectu dan chaqu 1
+effectu de 1
+effectu de modif 1
+effectu de regroup 1
+effectu e com 1
+effectu e dan 1
+effectu e de 1
+effectu e deux 1
+effectu e par 1
+effectu e plusieur 1
+effectu e sur 1
+effectu e un 1
+effectu ee 4
+effectu ee apr 1
+effectu ee au 1
+effectu ee automatiqu 1
+effectu ee avec 1
+effectu ee dan 1
+effectu ee en 2
+effectu ee lop 1
+effectu ee lor 1
+effectu ee ont 1
+effectu ee par 2
+effectu ee pour 1
+effectu ee qu 1
+effectu ee soit 1
+effectu ee sur 1
+effectu en 1
+effectu en amont 1
+effectu es 3
+effectu es dan 1
+effectu es en 1
+effectu es lor 2
+effectu es par 2
+effectu es pratiqu 1
+effectu es produ 1
+effectu l ecritur 1
+effectu l elim 1
+effectu le 1
+effectu le correspon 1
+effectu le moin 1
+effectu le produit 1
+effectu le requ 1
+effectu loc 1
+effectu loc le 1
+effectu toujour 1
+effectu toujour un 1
+effectu tout 1
+effectu tout le 1
+effectu tr 1
+effectu un 2
+effectu un coupur 1
+effectu un ecritur 1
+effectu un partit 1
+effectu un recherch 1
+effectu un sel 1
+effectuer 3
+effectuer au 1
+effectuer au moin 1
+effectuer dabord 1
+effectuer dan 1
+effectuer dan ce 1
+effectuer deux 1
+effectuer jusqu 1
+effectuer la 1
+effectuer la cop 1
+effectuer la transform 1
+effectuer le 1
+effectuer le ecritur 1
+effectuer lorsquil 1
+effectuer lorsquil obt 1
+effectuer plusieur 1
+effectuer plusieur requ 1
+effectuer pour 1
+effectuer pour obtenir 1
+effectuer pour tout 1
+effectuer quun 1
+effectuer quun ecritur 1
+effectuer un 1
+effectuer un align 1
+effectuer un net 1
+effectuer un test 1
+effectuer un transform 1
+effectuon 1
+effectuon dan 1
+effectuon dan ce 1
+effecu 1
+effecu ee 1
+effecu ee qu 1
+effelsberg 1
+efficac 4
+efficac dan 1
+efficac dan le 1
+efficac de 2
+efficac de ce 1
+efficac de garantir 1
+efficac de la 1
+efficac de modif 2
+efficac de point 1
+efficac du 1
+efficac du retour 1
+efficac en 1
+efficac en pratiqu 1
+efficac et facil 1
+efficac et port 1
+efficac int 1
+efficac int egr 1
+efficac la 1
+efficac la deux 1
+efficac le 1
+efficac le claus 1
+efficac le quantificateur 1
+efficac po de 1
+efficac po le 1
+efficac po tous 1
+efficac qu 2
+efficac qu chacun 1
+efficac qu le 2
+efficac r esolu 1
+efficac si 1
+efficac sil 1
+efficac sil est 1
+efficac sur 2
+efficac sur un 2
+efficacit 2
+efficacit e de 1
+efficacit e en 1
+efficacit e num 1
+efficacit e pour 1
+efficacit e superlin 1
+effor 1
+effor con 1
+effort 33
+effort and comput 1
+effort and exp 1
+effort doit 1
+effort doit etr 1
+effort for interpr 1
+effort ha rec 1
+effort import 1
+effort import rest 1
+effort in menu 1
+effort in using 1
+effort is exp 2
+effort of langu 1
+effort of maintain 1
+effort ont 1
+effort ont donc 1
+effort ont separ 1
+effort requir 3
+effort rest 1
+effort sur 1
+effort sur de 1
+effort than manu 1
+effort to build 1
+effort to fl 1
+effort to ge 1
+effort to identif 1
+effort to maintain 1
+effort to maxim 1
+effort to parallel 1
+effort to prov 1
+effort to support 1
+effort to ti 1
+effort trop 1
+effort try 1
+effort wer mad 1
+effort when compar 1
+effort wil begin 1
+eficierait 1
+eficierait dun 1
+eficierait dun tel 1
+efiltr 1
+efiltr de 1
+efiltr de claus 1
+efin 4
+efin a partir 1
+efin au 1
+efin au th 1
+efin aut 1
+efin aut de 1
+efin cal 1
+efin chacun 1
+efin chacun la 1
+efin ci 1
+efin ci dessus 1
+efin cod 1
+efin cod es 1
+efin com 3
+efin com comp 1
+efin com don 1
+efin com indiqu 1
+efin com lensembl 1
+efin com lim 1
+efin com pr 1
+efin com suit 1
+efin com un 1
+efin d etach 1
+efin dan 3
+efin dan ce 1
+efin dan la 1
+efin dan le 2
+efin de 2
+efin de fa 1
+efin de la 1
+efin de man 2
+efin deref 1
+efin dunif 1
+efin en 1
+efin en fonct 1
+efin en prolog 1
+efin en term 1
+efin est 1
+efin est un 1
+efin et denviron 1
+efin geler 1
+efin inductiv 1
+efin la 2
+efin la coh 1
+efin la valeur 1
+efin le 2
+efin le modif 1
+efin le nouveau 1
+efin le part 1
+efin le point 1
+efin le pr 1
+efin neck 1
+efin neck cut 1
+efin ni 1
+efin ni com 1
+efin par 4
+efin par ce 1
+efin par de 1
+efin par ext 1
+efin par holland 1
+efin par holzbaur 1
+efin par holzbaur143 1
+efin par la 4
+efin par le 4
+efin par lutilisateur 1
+efin par sa 1
+efin par un 2
+efin sav cut 1
+efin seront 1
+efin seront alor 1
+efin setarg 1
+efin statiqu 1
+efin statiqu ne 1
+efin sur 2
+efin sur le 2
+efin un 2
+efin un biject 1
+efin un treil 1
+efin un unif 1
+efin utilisabl 1
+efin utilisabl dan 1
+efinir 3
+efinir cal 1
+efinir ce 1
+efinir ce rel 1
+efinir de 1
+efinir de man 1
+efinir deux 1
+efinir deux nouvel 1
+efinir la 1
+efinir la port 1
+efinir le 3
+efinir le contraint 1
+efinir le pol 1
+efinir le som 1
+efinir pr 1
+efinir pr ec 1
+efinir un 1
+efinir un biject 1
+efinir un lang 1
+efinir un recouvr 1
+efinir un transform 1
+efinit 3
+efinit a la 1
+efinit ain 1
+efinit alor 1
+efinit alor le 1
+efinit assoc 1
+efinit assoc ee 1
+efinit avec 1
+efinit avec le 1
+efinit ci 2
+efinit ci dessus 2
+efinit cl 1
+efinit cl com 1
+efinit classiqu 1
+efinit classiqu de 1
+efinit dan 1
+efinit dan le 1
+efinit de 2
+efinit de ce 1
+efinit de fail 1
+efinit de instruc 1
+efinit de la 1
+efinit de lestampil 1
+efinit de me 1
+efinit de obj 1
+efinit de pav 1
+efinit de pr 1
+efinit de variabl 1
+efinit de vecteur 1
+efinit deux 1
+efinit deux mesur 1
+efinit donc 1
+efinit donc le 1
+efinit du 3
+efinit du point 1
+efinit du sch 1
+efinit du vecteur 1
+efinit dun 2
+efinit dun bon 1
+efinit dun mod 1
+efinit dun pr 1
+efinit dun sch 1
+efinit en 1
+efinit est 2
+efinit est tr 1
+efinit est un 1
+efinit et de 1
+efinit et la 1
+efinit font 1
+efinit font lhypoth 1
+efinit h1 1
+efinit im. 1
+efinit inclut 1
+efinit inclut le 1
+efinit init 1
+efinit init de 1
+efinit jj 1
+efinit jj min 1
+efinit l ag 1
+efinit la 2
+efinit la var 1
+efinit le 2
+efinit le fonct 1
+efinit le mod 1
+efinit le point 1
+efinit lordr 1
+efinit lordr dic 1
+efinit nest 1
+efinit nest pa 1
+efinit notr 1
+efinit notr cr 1
+efinit nous 1
+efinit nous avon 1
+efinit pa 1
+efinit pa de 1
+efinit pa un 1
+efinit po de 1
+efinit possibl 1
+efinit pr 1
+efinit pr ec 1
+efinit prop 1
+efinit prop ee 1
+efinit se 1
+efinit se heurt 1
+efinit seront 1
+efinit seront illustr 1
+efinit sont 1
+efinit sont na 1
+efinit sur 1
+efinit sur lappel 1
+efinit un 2
+efinit un architectur 1
+efinit un biject 1
+efinit un pag 1
+efinit un patron 1
+efinit un pav 1
+efinitiv 1
+efinitiv fic 1
+efinitiv fic ee 1
+efiqu 1
+efiqu en 1
+efiqu en dehor 1
+efit 1
+efluc 1
+efluc of fl52 1
+efoc 1
+efrich 1
+efrich un champ 1
+efut 1
+eg 10
+eg al 1
+eg al eatoir 1
+eg au 1
+eg au rest 1
+eg av 1
+eg av qu 1
+eg d elim 1
+eg dan 1
+eg dan ce 1
+eg de 3
+eg de ba 1
+eg de la 1
+eg de par 1
+eg de partit 1
+eg de recherch 1
+eg dexplor 1
+eg dexplor de 1
+eg dhybrid 1
+eg dinv 1
+eg dinv est 1
+eg dinv sur 1
+eg dont il 1
+eg e tous 1
+eg ee 1
+eg en 2
+eg en er 1
+eg en erent 1
+eg en erer 1
+eg en eresc 1
+eg enerer 1
+eg enerer pa 1
+eg er 1
+eg er de 1
+eg er le 1
+eg er ma 1
+eg er modif 1
+eg er ralent 1
+eg es 1
+eg es interv 1
+eg es parc 1
+eg es sont 1
+eg est 1
+eg est dit 1
+eg hybr 1
+eg le 2
+eg le raffin 1
+eg le traff 1
+eg op 1
+eg op erateur 1
+eg paresseus 1
+eg paresseus qu 1
+eg perm 1
+eg perm la 1
+eg peuv 1
+eg peuv etr 1
+eg util 1
+eg util ee 1
+eg whenever defin 1
+egag 1
+egager 2
+egager de 1
+egager de enseign 1
+egager un 1
+egager un valeur 1
+egal 5
+egal a cel 1
+egal a celu 1
+egal a deux 1
+egal a la 4
+egal a lunit 1
+egal a mac 1
+egal a son 1
+egal a xi 1
+egal appliqu 1
+egal appliqu ee 1
+egal au 2
+egal au co 1
+egal au maxim 1
+egal au nombr 1
+egal au point 1
+egal au temp 1
+egal aux 2
+egal aux autr 1
+egal aux pav 1
+egal aux valeur 1
+egal calcl 1
+egal certain 1
+egal certain transform 1
+egal compar 1
+egal dan 2
+egal dan ce 2
+egal dan no 1
+egal davoir 1
+egal davoir de 1
+egal de 2
+egal de conflit 1
+egal de la 1
+egal de oeff 1
+egal de visiter 1
+egal dinverser 1
+egal dinverser le 1
+egal dutiliser 1
+egal dutiliser le 1
+egal egal 1
+egal egal au 1
+egal el 1
+egal el doit 1
+egal elimin 1
+egal elimin ee 1
+egal en 2
+egal en fortran 1
+egal etr 1
+egal etr appliqu 1
+egal faibl 1
+egal faibl dan 1
+egal fus 1
+egal fus es 1
+egal l elim 1
+egal la 2
+egal la sp 1
+egal la tail 1
+egal lacc 1
+egal lacc sur 1
+egal lav 1
+egal lav de 1
+egal le 1
+egal le born 1
+egal le elimin 1
+egal le etud 1
+egal le nombr 1
+egal le quatr 1
+egal le utilisateur 1
+egal ou 1
+egal ou non 1
+egal perm 1
+egal perm den 1
+egal pour 1
+egal pour eff 1
+egal pour parvenir 1
+egal pour tout 1
+egal prendr 1
+egal prendr en 1
+egal prop 1
+egal qu 1
+egal qu lon 1
+egal s 1
+egal s le 1
+egal saluer 1
+egal saluer sa 1
+egal test 1
+egal un 2
+egal un nouvel 1
+egal un raffin 1
+egal un th 1
+egal un transform 1
+egal vr 1
+egal vr ou 1
+egalit 3
+egalit e compteur 1
+egalit e correspon 1
+egalit e de 1
+egalit e du 2
+egalit e dun 1
+egalit e est 1
+egalit e ind 1
+egalit e obtenu 1
+egalit e par 1
+egalit e pour 1
+egalit e rest 1
+egalit e sous 1
+egalit e suiv 1
+egalit es 1
+egalit es assoc 1
+egalit es avec 1
+egalit es cont 1
+egalit es de 1
+egalit es don 1
+egalit es du 1
+egalit es en 1
+egalit es issu 1
+egalit es ne 1
+egalit es pour 1
+egalit es pr 1
+egalit es quelconqu 1
+egalit es redon 1
+egalit es suppl 1
+egalit es sur 1
+egalit es tel 1
+egant 1
+egard 1
+egard not 1
+egard not qu 1
+egat 2
+egat par 1
+egatif 2
+egatif on obt 1
+egativ 1
+egativ son 1
+egativ son comport 1
+egativ sur 1
+egativ sur la 1
+egaux 2
+egaux par 1
+egaux par substitut 1
+eger 1
+eger largum 1
+eger largum additionnel 1
+egger 4
+egger et r.h 1
+egion 1
+egion acc 1
+egion acc ed 1
+egion atteint 1
+egion atteint par 1
+egion partag 1
+egion partag ee 1
+egitim 1
+egitim d elaguer 1
+egitim de 1
+egitim de modif 1
+egitim ee 1
+egitim ee par 1
+egk 1
+egl 3
+egl contr 1
+egl contr olent 1
+egl de 2
+egl de calcl 1
+egl de recherch 1
+egl de transit 1
+egl ecrit 1
+egl ecrit dan 1
+egl er 3
+egl er avec 1
+egl er la 1
+egl er le 1
+egl er ma 1
+egl er post 1
+egl er quand 1
+egl et il 1
+egl simpl 1
+egl suiv 1
+egl sur 1
+egl sur mach 1
+egler 2
+egler ce 1
+egler ce probl 1
+egler le 2
+egler le diff 1
+egler le probl 1
+egler le trait 1
+eglig 1
+eglig a un 1
+eglig dan 1
+eglig dan le 1
+egligeon 1
+egligeon le 1
+egligeon le migr 1
+egliger 1
+egliger le 1
+egner 1
+egner aus 1
+egner aus bien 1
+egon 1
+egor 2
+egor englob 1
+egor englob le 1
+egor et peuv 1
+egor le 1
+egor le mach 1
+egor qu 1
+egor qu bennet 1
+egor se 1
+egor se fait 1
+egr 4
+egr dan 1
+egr dan le 1
+egr de 1
+egr de domain 1
+egr de la 1
+egr de lenviron 1
+egr de linform 1
+egr de lunif 1
+egr de variabl 1
+egr e au 2
+egr ee 2
+egr ee au 1
+egr ee aux 1
+egr es 1
+egr es fa 1
+egr pa 2
+egr pa bien 1
+egr pa encor 1
+egr tout 1
+egr tout le 1
+egrad 2
+egrad au 1
+egrad au del 1
+egrad de 1
+egrad de perform 1
+egrad dramatiqu 1
+egrad dramatiqu pouv 1
+egrad evol 1
+egrad evol eequ 1
+egrad notabl 1
+egrad notabl de 1
+egrader 1
+egrader la 1
+egrader la perform 1
+egralit 1
+egralit e pr 1
+egrer 2
+egrer a la 1
+egrer a lenviron 1
+egrer ce 1
+egrer la 1
+egrer la coupur 1
+egron 1
+egularit 1
+egularit e de 1
+egularit e du 1
+egularit e refl 1
+egyhaz 1
+egyp 1
+egyp egypt 1
+egypt 1
+eh 2
+eh fh1 1
+eh with ea 1
+eh84 1
+eh9 1
+eh9 3jz 1
+ehcmc 1
+ehcmc a solut 1
+ehcmc problem 1
+ehcmc problem con 1
+ehcmc problem gener 1
+eheader 1
+eheader bod 1
+eheader bod en 1
+ehen 3
+ehen de 2
+ehen de aspect 1
+ehen de certain 1
+ehen de chapitr 1
+ehen de lint 1
+ehen du 1
+ehen du flot 1
+ehen es 1
+ehen minim 1
+ehen minim de 1
+ehen un trait 1
+ehender 3
+ehender car 1
+ehender car le 1
+ehender la 1
+ehender la dynamiqu 1
+ehiculer 1
+ehiculer tout 1
+ehiculer tout le 1
+ehrlich 1
+ehrlich and reingold 1
+ei 25
+ei and ei 1
+ei at tim 1
+ei au 1
+ei au crit 1
+ei au pa 1
+ei bj 1
+ei bj ei 1
+ei ek 1
+ei ek alloc 1
+ei en 1
+ei en fait 1
+ei ic 1
+ei ic el 1
+ei iid 1
+ei nx 2
+ei rout 1
+ei son 1
+ei son ecritur 1
+ei th edg 1
+ei th reg 1
+ei to pe 1
+ei wi 1
+ei1 1
+ei2 1
+eic1 1
+eic1 induc 1
+eick 2
+eidgenossisch 1
+eiffel 3
+eiffel keyword 1
+eiffel keyword obsol 1
+eiffel langu 1
+eiffel object 1
+eigenpair 1
+eigenproblem 1
+eigenproblem ar frequ 1
+eigenproblem con 1
+eigenproblem on distribut 1
+eigenproblem pl 1
+eigenproblem with coeff 1
+eigensolut 1
+eigensolut of symmeter 1
+eigenvalu 3
+eigenvalu and eigenvect 1
+eigenvalu approxim 1
+eigenvalu ar isol 1
+eigenvalu ar larger 1
+eigenvalu ar us 1
+eigenvalu comput 1
+eigenvalu is mark 1
+eigenvalu of sk 1
+eigenvalu of tk 1
+eigenvalu problem 1
+eigenvalu that equ 1
+eigenvect 3
+eigenvect of graph 1
+eigenvect of tk 1
+eigenvect yj 1
+eigenwertaufgab 1
+eigenwertaufgab mi 1
+eigenwertaufgab mi technisch 1
+eight 18
+eight definit 1
+eight differ group 1
+eight disjoint 1
+eight disjoint connect 1
+eight for mp3d 1
+eight hid 1
+eight iter 1
+eight major 1
+eight memor 1
+eight memor modl 1
+eight meter 1
+eight meter typ 1
+eight month 1
+eight multipl 1
+eight neuron 1
+eight piec 1
+eight po combin 1
+eight po. 1
+eight problem 1
+eight proc 3
+eight proc execut 1
+eight proc snoop 1
+eight proc system 1
+eight sampl 1
+eight se 1
+eight se shar 1
+eight se shown 1
+eight submatr 1
+eighth 9
+eighth acm 2
+eighth acm sigact 1
+eighth annu 1
+eighth austr 1
+eighth austr joint 1
+eighth compon 1
+eighth ie 1
+eighth intern 1
+eighth yal 1
+eighth yal workshop 1
+eij 1
+eij denot 1
+eijndhov 1
+eijndhov and leon 1
+eik 1
+ein 1
+ein implementierung 1
+eindhov 2
+eingereicht 1
+einit 1
+einit ee 1
+einjecter 1
+einjecter un 1
+einjecter un not 1
+eint 1
+eint egr 1
+eint egr ee 1
+eintroduir 1
+eintroduir ce 1
+eintroduir ce test 1
+eintroduit 1
+eintroduit dan 1
+eisenb 2
+eisenstadt 1
+eisenstadt and brayshaw 1
+eisenstadt et al 1
+eit 1
+eit im ed 1
+eiter 1
+ej 8
+ej a avoir 1
+ej a charg 1
+ej a elimin 1
+ej a evoqu 1
+ej a faux 1
+ej a instanc 1
+ej a la 1
+ej a le 1
+ej a post 1
+ej a pr 1
+ej a qu 1
+ej a sauvegard 1
+ej a sign 1
+ej a un 1
+ej and e0j 1
+ej pn 1
+ej t 1i 1
+ej wil correspon 1
+ej x xi 1
+ej1 1
+ej2 1
+ejar 1
+ejb 1
+eject 1
+eject a disc 1
+eject as aflever 1
+ejg 1
+ejt 1
+ek 8
+ek alloc 1
+ek ce 1
+ek ce qu 1
+ek cs.uq.oz.au 1
+ek denot 1
+ek is thrown 1
+ek nk 1
+ek satisf 1
+ek t 1i 1
+ek t 1j 1
+ekaw88 1
+ekc 1
+el 104
+el a alor 1
+el a au 1
+el a deux 1
+el a la 2
+el a lat 1
+el a un 1
+el a1 1
+el aboutit 1
+el acc 1
+el act 1
+el act exp4 1
+el ad 3
+el ad equ 1
+el adapt 1
+el adapt ee 1
+el adj 1
+el adj dorad 1
+el affich 1
+el al 2
+el al eatoir 2
+el al nod 1
+el algebr 1
+el alourd 1
+el alourd la 1
+el alread found 1
+el am elior 1
+el and bjarn 1
+el and ch 1
+el and dissemin 1
+el and distribut 1
+el and equ 1
+el and form 1
+el and organ 1
+el and parallel 1
+el and using 1
+el appar 1
+el appar en 1
+el appart 1
+el appl 3
+el ar 2
+el ar actu 1
+el ar alloc 1
+el ar assoc 1
+el ar ch 1
+el ar distribut 1
+el ar equ 2
+el ar giv 1
+el ar inser 1
+el ar map 1
+el ar mov 1
+el ar om 1
+el ar plac 1
+el ar random 1
+el ar remov 1
+el ar replac 1
+el ar retain 1
+el ar retrief 1
+el ar rout 1
+el ar sent 1
+el ar zer 1
+el assign 1
+el at pe 1
+el at proc 1
+el attribut 1
+el attribut upd 1
+el au 1
+el au sen 1
+el auror 1
+el auror foxtrot 1
+el automatiqu 1
+el aux 1
+el aux el 1
+el avec 1
+el avec le 1
+el b b2 1
+el b0 1
+el b1 1
+el ba 1
+el backtrack 1
+el becom 1
+el becom vi 1
+el begin 1
+el between ei 1
+el block 1
+el block cl 1
+el bp 1
+el c c2 1
+el c2 1
+el c2a 1
+el c2a alloc 1
+el c2a c1 1
+el c2a instruc 1
+el c3a 1
+el c3a instruc 1
+el cal 1
+el calcl 1
+el can queu 1
+el canoniqu 1
+el canoniqu de 1
+el centr 1
+el chang 1
+el cl 2
+el claus 1
+el climatiqu 1
+el cod 1
+el compliqu 1
+el comport 1
+el comput 1
+el con 2
+el conceptuel 1
+el concern 1
+el concern le 1
+el concurrentiel 1
+el connu 1
+el connu de 1
+el construc 1
+el cont 1
+el cont de 1
+el contain 1
+el contain object 1
+el contiendront 1
+el contiendront de 1
+el correspon 3
+el correspon au 1
+el counter 1
+el couteux 1
+el couteux sil 1
+el cur 1
+el cur po 1
+el currnod 1
+el d d0 1
+el d ecrit 1
+el d efin 1
+el d epen 2
+el dan 1
+el dan le 1
+el de 4
+el de ag 1
+el de calcl 1
+el de ce 1
+el de celu 1
+el de cholesk 1
+el de coh 1
+el de conflit 1
+el de diffus 1
+el de dim 1
+el de ecritur 1
+el de la 2
+el de lalgorithm 1
+el de migr 1
+el de no 1
+el de par 1
+el de program 2
+el de siml 1
+el de val 1
+el decrem 1
+el decrem timesl 1
+el defin 1
+el defin separ 1
+el del 1
+el del gald 1
+el dep 1
+el dep uniqu 1
+el design 1
+el destin 1
+el dic 2
+el dic ecut 2
+el discr 1
+el distinct 1
+el distribu 1
+el distribu ee 1
+el dobj 1
+el doit 2
+el doit encor 1
+el doit etr 1
+el doiv 1
+el doiv etr 1
+el dorad 1
+el dorad count 1
+el du 1
+el du program 1
+el dun 1
+el dun ag 1
+el dun probl 1
+el e ou 1
+el e par 1
+el e prec 1
+el e0 1
+el e00 1
+el e2 1
+el echou 1
+el echoueront 1
+el ee 2
+el ee aux 1
+el ee on 1
+el ee par 1
+el efficac 1
+el egant 1
+el ei 1
+el ei ek 1
+el ement 4
+el ement acc 1
+el ement appart 1
+el ement con 1
+el ement conflictuel 1
+el ement congru 1
+el ement contenus 1
+el ement dan 2
+el ement dau 1
+el ement de 3
+el ement diff 1
+el ement dind 1
+el ement distinct 1
+el ement du 2
+el ement dun 1
+el ement en 1
+el ement est 2
+el ement etant 1
+el ement fin 1
+el ement majeur 1
+el ement ne 1
+el ement nl 1
+el ement par 1
+el ement positif 1
+el ement qu 1
+el ement quel 1
+el ement sont 1
+el ement subiront 1
+el ement sur 1
+el ementair 3
+el ementair effectu 1
+el ementair fournit 1
+el ementair quec 1
+el ementair susceptibl 1
+el en 3
+el en bloc 1
+el en compar 1
+el en part 1
+el en posit 1
+el en ten 1
+el endif 1
+el endif print 1
+el entr 1
+el entr deux 1
+el entr donc 1
+el entr le 1
+el equ 3
+el equ distribut 1
+el erat 2
+el erat au 1
+el erat de 1
+el erat don 1
+el erat par 1
+el erateur 1
+el erateur de 1
+el erer 3
+el erer le 1
+el erer leur 1
+el erer no 1
+el es 2
+el es appliqu 1
+el es en 1
+el es par 1
+el est 3
+el est acc 1
+el est ag 1
+el est appel 1
+el est au 1
+el est cel 1
+el est cep 1
+el est conflictuel 1
+el est dabord 1
+el est dit 1
+el est donc 1
+el est elev 1
+el est equiv 1
+el est fic 1
+el est fon 1
+el est im 1
+el est inject 1
+el est inv 1
+el est le 1
+el est proportionnel 1
+el est toujour 1
+el est tr 1
+el est util 1
+el et ag 1
+el et de 1
+el et er 1
+el et lad 1
+el et ne 1
+el et neck 1
+el et nous 2
+el et trust 1
+el et un 1
+el etait 1
+el etait son 1
+el euclidean 1
+el euclidean geometer 1
+el ev 1
+el evoqu 1
+el evoqu ee 1
+el exit 1
+el exp 1
+el exp4 1
+el expr 2
+el ext 1
+el ext nod 1
+el extern 1
+el fail 1
+el fail alloc 1
+el fail c2 1
+el fail cod 1
+el fail fail 1
+el fail instruc 1
+el fait 1
+el fait pointer 1
+el fal 1
+el far apart 1
+el fetch 1
+el find 1
+el finit 1
+el finit toujour 1
+el fomel 1
+el fomel de 1
+el formel 1
+el formel nous 1
+el fourn 1
+el from ffq0 1
+el from q0 1
+el from q1 1
+el funct 1
+el funct a.7 1
+el funct event 1
+el g en 1
+el geometer 1
+el gest 1
+el gest de 1
+el got 1
+el got l1 1
+el graph 2
+el graph algorithm 1
+el grid 1
+el hakim 1
+el haw 1
+el head 1
+el hgn 1
+el horwood 2
+el horwood ltd 1
+el identif 1
+el identif wh 1
+el if n0 1
+el if random 1
+el il 1
+el il ont 1
+el im fetch 1
+el impliqu 1
+el impliqu de 1
+el in cand 1
+el in common 1
+el in d2 1
+el in deletemin 1
+el in ffq0 1
+el in ffq1 1
+el in list 1
+el in m0 1
+el in nk 1
+el in non 1
+el in order 2
+el in parallel 1
+el in q0 1
+el in q1 1
+el in qfp 1
+el in qg 1
+el in reserv 1
+el in sa 1
+el in se 1
+el in xi 1
+el inclus 1
+el indiqu 1
+el indiqu simpl 1
+el individu 1
+el induc 1
+el inh 1
+el inh erent 1
+el inidividu 1
+el inser 1
+el inser succ 1
+el instruc 1
+el int q0 1
+el involut 1
+el is affect 1
+el is defin 1
+el is disc 1
+el is enqueu 1
+el is estim 1
+el is inser 1
+el is mov 1
+el is posit 1
+el is retrief 1
+el is rst 1
+el is upd 1
+el it return 1
+el knowledg 1
+el koutsoup 1
+el larger 2
+el le 1
+el lin 1
+el lin algebr 1
+el list 1
+el log 2
+el log funct 1
+el log program 1
+el ls 1
+el m em 3
+el ma 1
+el ma de 1
+el mach 2
+el mach oper 1
+el maint 1
+el maint le 1
+el matr 1
+el maxim 1
+el mesh 3
+el mesh 598a 1
+el mesh aut 1
+el mesh bcsstk31 1
+el mesh cylinder93 1
+el mesh map1 1
+el mesh s38584.1 1
+el mesh trol 1
+el method 3
+el mi 1
+el mimd 1
+el mo 1
+el mod 1
+el model 1
+el mov 1
+el must work 1
+el n cessit 1
+el n evit 1
+el na 1
+el na jam 1
+el na qu 1
+el ne 3
+el ne cont 1
+el ne diff 1
+el ne modif 1
+el ne peuv 1
+el ne po 1
+el ne requ 1
+el ne sont 1
+el nen 1
+el nen garantit 1
+el nest 3
+el nest acc 1
+el nest encor 1
+el nest pa 3
+el nest toutef 1
+el next layer 1
+el nl 1
+el nod 1
+el nous 1
+el nous avon 1
+el nous ser 1
+el number 1
+el object 1
+el of answer 1
+el of ar 1
+el of architectur 1
+el of b0 1
+el of bm 1
+el of f2b 1
+el of inform 1
+el of matr 1
+el of ml 1
+el of parallel 1
+el of q0 1
+el of rel 1
+el of s1 1
+el of s2 1
+el of sidelength 1
+el of synchron 1
+el of t1 1
+el of t2 1
+el of ti 1
+el of typ 1
+el of xj 1
+el om 1
+el on 1
+el on using 1
+el onl 0s 1
+el ont 1
+el ont donc 1
+el or del 1
+el orient 1
+el ou 2
+el ou po 1
+el pa 2
+el pa lattribut 1
+el par 4
+el par distribut 1
+el par el 1
+el par le 1
+el par retour 1
+el parfait 1
+el parfait imbriqu 1
+el per 1
+el per encl 1
+el per puisquil 1
+el per row 1
+el perm 2
+el perm dajouter 1
+el perm de 2
+el perm egal 1
+el perm en 1
+el peut 3
+el peut aus 1
+el peut etr 3
+el peut eventuel 1
+el peut ne 1
+el peut toutef 1
+el peuv 1
+el peuv etr 1
+el pg 1
+el phy 1
+el phy knowledg 1
+el plac 1
+el po 3
+el po ed 2
+el po edent 1
+el pour 4
+el pour aus 1
+el pour la 2
+el pour mach 1
+el pouv 1
+el pouv avoir 1
+el pr 3
+el pr ec 3
+el pr esent 1
+el prob 1
+el prob theor 1
+el problem 1
+el produc 1
+el produit 1
+el produit en 1
+el program 1
+el prov 1
+el qout 1
+el qout known 1
+el qu 2
+el qu constitu 1
+el qu linstruc 1
+el qu nous 2
+el qu sont 1
+el r eclam 1
+el r esiduel 1
+el ralent 1
+el ralent la 1
+el rappel 1
+el rappel qu 1
+el regp 1
+el remain 1
+el rep 1
+el rep erent 1
+el repr 2
+el respect 1
+el respect le 1
+el respectiv 1
+el respectiv par 1
+el result 1
+el return 2
+el return result 1
+el return slowselect 1
+el rl 1
+el root 1
+el rout 1
+el rout proof 1
+el s satisf 1
+el s2 1
+el s2 cod 1
+el s3 1
+el s3 cod 1
+el saccompagn 1
+el sappu 1
+el sappu sur 1
+el se 3
+el se comport 1
+el se heurt 1
+el se par 1
+el se produit 1
+el se trouv 1
+el se trouvait 1
+el sel 1
+el sel produir 1
+el select 1
+el select random 1
+el selon 1
+el selon quel 1
+el sen 1
+el sent 1
+el ser 1
+el ser de 1
+el seront 1
+el seront effectu 1
+el shar 1
+el show 1
+el smaller 1
+el sont 3
+el sont ain 1
+el sont du 1
+el sont empil 1
+el sont fort 1
+el sont peu 1
+el sont princip 1
+el sont toujour 1
+el sont util 1
+el specif 1
+el specl 1
+el spmd 1
+el spmd indu 1
+el standard 2
+el standard ou 1
+el stat 1
+el stop 2
+el succ 1
+el succ pop 1
+el suiv 1
+el superficiel 1
+el superficiel faux 1
+el supprim 1
+el supprim le 1
+el sur 3
+el sur ce 1
+el sur de 2
+el sur laquel 1
+el sur le 1
+el sur un 2
+el systoliqu 1
+el tak 1
+el tak tim 1
+el task 1
+el tel 1
+el tel qu 1
+el temp 1
+el temp pr 1
+el ten 2
+el th 1
+el th eoriqu 1
+el th lower 1
+el th rang 1
+el that intersect 1
+el that requir 1
+el theorem 1
+el ti 1
+el to alloc 1
+el to human 1
+el to proc 1
+el to swap 1
+el to switch 1
+el to tr 1
+el top 1
+el tout 1
+el tout le 1
+el transform 3
+el transform chaqu 1
+el typ 1
+el u wh 1
+el un syst 1
+el un uniqu 1
+el undefin 1
+el unexplor 1
+el unexplor act 1
+el upd 1
+el using 2
+el util 2
+el util es 1
+el util le 1
+el var 1
+el var dep 1
+el vaut 1
+el vaut bp 1
+el vn 1
+el vol 1
+el wa bound 1
+el wa dequeu 1
+el wa plac 1
+el wait 1
+el wh member 1
+el which map 1
+el wil var 1
+el wit 1
+el with ind 1
+el with key 1
+el with rank 1
+el with tot 1
+el without mov 1
+el. 2
+el0 1
+el1 1
+el2 1
+el2 t1 1
+el2 t1 t2 1
+el62 1
+el90 1
+elabor 18
+elabor a ba 1
+elabor a cach 1
+elabor and refin 1
+elabor and rev 1
+elabor b rep 1
+elabor du 1
+elabor du proj 1
+elabor dun 1
+elabor dun graph 1
+elabor es 1
+elabor et le 1
+elabor method 3
+elabor method ec 1
+elabor probabil 1
+elabor probabil bound 1
+elabor quest 1
+elabor quest ask 1
+elabor sent 1
+elabor sent form 1
+elabor stat 1
+elabor stat method 1
+elabor th step 1
+elabor user 1
+elabor user model 1
+elabor wh 1
+elabor wh nec 1
+elag 1
+elag a pr 1
+elag anticip 1
+elag au 1
+elag augm 1
+elag augm le 1
+elag dan 1
+elag dan la 1
+elag dan le 1
+elag de 1
+elag de context 1
+elag de environ 1
+elag de larbr 1
+elag de point 1
+elag de variabl 1
+elag devrait 1
+elag devrait aus 1
+elag et lagenc 1
+elag ne 1
+elag ne justif 1
+elag ne sembl 1
+elag nest 1
+elag nest toutef 1
+elag peut 1
+elag peut etr 1
+elag retard 1
+elag sont 1
+elag sont tr 1
+elag sur 1
+elag sur la 1
+elag tr 1
+elag tr cr 1
+elagu 1
+elagu chaqu 1
+elagu chaqu environ 1
+elagu ee 1
+elagu ee en 1
+elagu es 1
+elagu lenviron 1
+elagu lenviron cour 1
+elaguer 1
+elaguer le 1
+elaguer le point 1
+elaguer pen 1
+elaguer pen lec 1
+elam 1
+elan 2
+elan el 1
+elan el design 1
+elang 1
+elang ee 1
+elang ee de 1
+elang ee libr 1
+elang es 1
+elanger 1
+elanger le 1
+elanger le deux 1
+elant 1
+elant propag 1
+elant propag de 1
+elap 7
+elap between failur 1
+elap real tim 1
+elap tim 2
+elarg 1
+elarg au 1
+elarg au ca 1
+elarg le 1
+elarg le champ 1
+elast 1
+elast sol 1
+elastomer 2
+elastomer connect 2
+elastomer surfac 2
+elastomer surfac connect 2
+elbaum 1
+elc 1
+elc workst 1
+eld 1
+eldrach 1
+elect 7
+elect a leader 1
+elect algorithm 1
+elect algorithm stabiliz 1
+elect and comput 1
+elect and rel 1
+elect ar cl 1
+elect de 2
+elect de claus 1
+elect de la 1
+elect de point 1
+elect de xi 1
+elect dun 1
+elect dun claus 1
+elect e est 2
+elect e pour 1
+elect ee 1
+elect en 1
+elect en offr 1
+elect es 2
+elect es pour 1
+elect in gener 1
+elect me 1
+elect naturel 1
+elect naturel con 1
+elect ne 1
+elect ne perturb 1
+elect non 1
+elect non nl 1
+elect peut 1
+elect peut th 1
+elect proportionnel 1
+elect proportionnel au 1
+elect proportionnel ne 1
+elect protocol 1
+elect sit 1
+elect som 1
+elect som de 1
+elect syst 1
+elect syst ematiqu 1
+electif 1
+electionnabl 1
+electionnabl apr 1
+electionnabl apr es 1
+electionner 3
+electionner est 1
+electionner est don 1
+electionner le 1
+electionner le transit 1
+electionner un 1
+electionner un claus 1
+electionner x1 1
+electionner x1 sinon 1
+electionner xk 1
+electiv 1
+electiv epineus 1
+electr 13
+electr act 1
+electr and computer 1
+electr and electron 2
+electr disorder 1
+electr engineer 3
+electr engineer center 1
+electr magnet 1
+electr magnet forc 1
+electr network 2
+electr transformer 1
+electrocardiogram 1
+electromagnet 1
+electromagnet dev 1
+electron 20
+electron and mechan 1
+electron and rel 1
+electron at http 1
+electron circuit 1
+electron classroom 1
+electron comput 1
+electron comput dev 1
+electron computer 1
+electron dev 1
+electron direct 1
+electron direct serv 1
+electron engineer 2
+electron engineer transact 1
+electron imag 1
+electron implem 1
+electron inform 1
+electron ink 1
+electron mail 4
+electron maz 1
+electron network 1
+electron or opt 1
+electron schem 1
+electron schem match 1
+electron system 2
+electroniqu 1
+electroniqu condu 1
+electroniqu condu au 1
+electroniqu tel 1
+electroniqu tel qu 1
+electrophor 1
+electrophor etiqu 1
+electrophysiolog 1
+eleftheriad 1
+eleg 14
+eleg algorithm 1
+eleg and ea 1
+eleg and eff 1
+eleg cod 1
+eleg learn 1
+eleg manner 1
+eleg solut 1
+eleg workaround 1
+elent 1
+elent tr 1
+elent tr es 1
+eler 1
+eler b en 1
+elev 7
+elev dat 1
+elev e de 1
+elev e etant 1
+elev ee 4
+elev ee de 1
+elev ee pour 1
+elev modl 1
+elev subject 1
+elev subject thought 1
+eleventh 6
+eleventh acm 2
+eleventh annu 2
+eleventh annu intern 1
+eleventh intern 1
+eleventh nat 1
+elgin 1
+elgin le 1
+eliahou 1
+eliaison 1
+eliaison anticip 1
+eliaison anticip ee 1
+elicat 2
+elicat de 1
+elicat de pouvoir 1
+elicit 3
+elicit a respon 1
+elicit ec 1
+elicit ec axiom 1
+elicit inform 1
+elicit knowledg 1
+elicit such axiom 1
+elig 5
+elig act 1
+elig claus 1
+elig is defin 1
+elig typ 1
+elig var 1
+elim 38
+elim aff 1
+elim aff variabl 1
+elim al aff 1
+elim al log 1
+elim al obtus 1
+elim al occur 1
+elim al tetrahedr 1
+elim and indistingu 1
+elim and laplac 1
+elim appl 1
+elim ar shown 1
+elim argum 1
+elim cod 1
+elim compl 1
+elim compl es 1
+elim de 3
+elim de boucl 1
+elim de cod 1
+elim de contraint 1
+elim de coupur 1
+elim de drapeaux 1
+elim de four 1
+elim de four. 1
+elim de fouriermotzkin 1
+elim de la 1
+elim de redon 1
+elim de saut 1
+elim de variabl 2
+elim doit 1
+elim doit fair 1
+elim don 1
+elim don dan 1
+elim du 1
+elim du faux 1
+elim dupl 2
+elim dupl addr 1
+elim ec 1
+elim ec quantif 1
+elim ee 1
+elim ee par 1
+elim en 1
+elim en nombr 1
+elim entrelac 1
+elim entrelac ee 1
+elim est 1
+elim est donc 1
+elim est equiv 1
+elim exact 1
+elim exact en 1
+elim ext 1
+elim fal 1
+elim fal dat 1
+elim form 1
+elim from is0 1
+elim glob 1
+elim glob de 1
+elim involut 1
+elim involut over 1
+elim method 3
+elim of du1 1
+elim of dupl 1
+elim of ec 1
+elim of subband 1
+elim of u0 1
+elim or reduc 1
+elim polynom 1
+elim polynom constraint 1
+elim pr 1
+elim pr ec 1
+elim preserv 1
+elim procedur 3
+elim procedur combin 1
+elim procedur re 1
+elim program 1
+elim quantif 1
+elim quantif instead 1
+elim redund 1
+elim redund arc 1
+elim reg 1
+elim rl 2
+elim s tran 1
+elim s1 1
+elim step 1
+elim such problem 1
+elim techniqu 1
+elim th acc 1
+elim th dupl 1
+elim th inaccur 1
+elim th intersect 1
+elim th overhead 1
+elim th polynom 1
+elim th problem 1
+elim th term 1
+elim th undesir 1
+elim through resolut 1
+elim tot 1
+elim tot du 1
+elim tw pag 1
+elim unnec 1
+elim unnec funct 1
+elim with part 1
+elim yield 1
+elim yield constraint 1
+elimin 28
+elimin a major 1
+elimin a prior 1
+elimin a se 1
+elimin al aff 1
+elimin alor 1
+elimin alor le 1
+elimin any differ 1
+elimin but const 1
+elimin by adh 1
+elimin by ensur 1
+elimin by part 1
+elimin by renam 1
+elimin by rewrit 1
+elimin by scal 1
+elimin by substitut 1
+elimin by using 1
+elimin ce 1
+elimin ce argum 1
+elimin constraint 1
+elimin constraint du 1
+elimin cr 1
+elimin cr nonzer 1
+elimin de 2
+elimin de argum 1
+elimin de boucl 1
+elimin disjonct 1
+elimin dur numer 1
+elimin e de 1
+elimin e lor 1
+elimin e par 1
+elimin e pour 1
+elimin ee 2
+elimin ee en 1
+elimin ee gr 1
+elimin ee si 1
+elimin entir 1
+elimin es 1
+elimin etant 1
+elimin etant daut 1
+elimin fal 2
+elimin fal dat 1
+elimin fal shar 1
+elimin from strong 1
+elimin interchang 1
+elimin interchang valu 1
+elimin la 1
+elimin la var 1
+elimin le 2
+elimin le faux 1
+elimin le variabl 1
+elimin or distribut 1
+elimin ou 1
+elimin pa 1
+elimin pa le 1
+elimin qu 1
+elimin qu le 1
+elimin repetit 1
+elimin som off 1
+elimin successiv 1
+elimin successiv le 1
+elimin such triv 1
+elimin sur 1
+elimin sur xi 1
+elimin th addit 1
+elimin th caus 1
+elimin th cost 1
+elimin th fac 1
+elimin th norm 1
+elimin th requir 1
+elimin th rl 1
+elimin th transport 1
+elimin th valu 1
+elimin tous 1
+elimin tous le 1
+elimin tout 1
+elimin tout faux 1
+elimin tout le 1
+elimin tout risqu 1
+elimin un uniqu 1
+elimin using 1
+elimin var 1
+elimin variabl 1
+elimin without lo 1
+eliminair 2
+eliminair bien 1
+eliminair bien quun 1
+eliminair de 1
+eliminair de ce 1
+eliminair dun 1
+eliminair dun aut 1
+eliminair ont 1
+eliminair ont montr 1
+eliminair se 1
+eliminair se var 1
+eliminer 2
+eliminer certain 1
+eliminer certain de 1
+eliminer i2 1
+eliminer i2 du 1
+eliminer la 2
+eliminer la boucl 1
+eliminer la majorit 1
+eliminer le 1
+eliminer le contraint 1
+eliminer le faux 1
+eliminer le migr 1
+eliminer le part 1
+eliminer le ph 1
+eliminer le ping 1
+eliminer loccur 1
+eliminer loccur de 1
+eliminer loccur dit 1
+eliminer ou 1
+eliminer ou de 1
+eliminer pour 1
+eliminer pour obtenir 1
+eliminer si 1
+eliminer si cest 1
+eliminer tot 1
+eliminer tot le 1
+eliminer tous 2
+eliminer tous le 2
+eliminer tout 2
+eliminer tout aut 1
+eliminer tout risqu 1
+eliminer un eventuel 1
+eliminer un ou 1
+eliminerait 1
+eliminerait egal 1
+eliminerait egal pour 1
+eliminerait le 1
+eliminerait le faux 1
+elior 4
+elior absent 1
+elior absent de 1
+elior apport 1
+elior apport ee 1
+elior atteint 1
+elior au 1
+elior au cod 1
+elior de 3
+elior de la 2
+elior de lalgorithm 1
+elior de no 1
+elior de program 1
+elior de propr 1
+elior du 1
+elior du part 1
+elior e afin 1
+elior ee 1
+elior est 1
+elior est parfait 1
+elior grand 1
+elior grand la 1
+elior la 2
+elior la convexit 1
+elior la lo. 1
+elior la localit 1
+elior la perform 1
+elior li 1
+elior li ee 1
+elior ne 1
+elior ne sont 1
+elior nest 1
+elior nest qu 1
+elior notabl 1
+elior notabl le 1
+elior obtenu 1
+elior obtenu par 1
+elior possibl 1
+elior prometteus 1
+elior vi 2
+eliorer 3
+eliorer ain 1
+eliorer au 1
+eliorer au moin 1
+eliorer en 1
+eliorer en el 1
+eliorer l equilibr 1
+eliorer la 2
+eliorer la granularit 1
+eliorer la localit 2
+eliorer la qualit 1
+eliorer laffinit 1
+eliorer le 2
+eliorer le par 1
+eliorer le perform 1
+eliorer le propr 1
+eliorer le tr 1
+eliorer leur 2
+eliorer leur efficacit 1
+eliorer leur environ 1
+eliorer leur localit 1
+eliorer leur perform 1
+eliorer se 1
+eliorer se propr 1
+elioron 1
+elioron la 1
+elioron la reconstruc 1
+elip 1
+eliser 2
+eliser le 1
+eliser le comport 1
+eliser no 1
+eliser no algorithm 1
+eliser un algorithm 1
+elism 4
+elism contenu 1
+elism contenu dan 1
+elism dan 1
+elism dan le 1
+elism de 3
+elism de contr 1
+elism de la 2
+elism dispon 1
+elism dispon au 1
+elism du 1
+elism du program 1
+elism dun 1
+elism dun program 1
+elism dur 1
+elism dur lec 1
+elism en 1
+elism en ne 1
+elism est 2
+elism est dit 1
+elism est perdu 1
+elism et de 1
+elism et doit 1
+elism et le 1
+elism et lexploit 1
+elism evoqu 1
+elism evoqu un 1
+elism implicit 1
+elism implicit peut 1
+elism inh 1
+elism inh erent 1
+elism n etant 1
+elism ou 1
+elism qu 1
+elism qu nous 1
+elism quel 1
+elism quel rec 1
+elism quil 1
+elism quil cont 1
+elism rappel 1
+elism rappel le 1
+elism risqu 1
+elism trop 1
+elism trop massif 1
+elit 2
+elit fract 1
+elit perc 1
+elit select 1
+elizabeth 1
+ellegard 1
+ellemtel 1
+ellemtel telecommun 1
+ellemtel telecommun system 1
+ellip 3
+ellip ind 1
+ellip ind direct 1
+ellipt 1
+ellipt equ 1
+ellipt inequ 1
+ellipt inequ axx2 1
+elm90 1
+elm92 1
+elmagarmid 1
+elmasr 1
+elnozah 1
+eloign 2
+eloign de 1
+eloign e de 1
+eloign es 1
+eloigner 2
+eloigner de 1
+eloigner de loptimalit 1
+eloigner dun 1
+eloigner dun strict 1
+elong 1
+elong th path 1
+elop 1
+elop es 1
+elsef 1
+elsef put 1
+elseif 1
+elseif cp 1
+elsereturn 1
+elsev 20
+elsev north 1
+elsev north holland 1
+elsev noth 1
+elsev noth holland 1
+elsev publ 1
+elsev sc 7
+elsev sc b.v 1
+elsev sc publ 7
+elsewh 9
+elsner 1
+elt 1
+elt perdu 1
+eluc 2
+eluc problem 1
+elus 1
+elust 1
+em 12
+em a ba 1
+em a co 1
+em a deux 2
+em a empil 1
+em a la 1
+em a lautr 1
+em a notr 1
+em a pil 1
+em a valider 1
+em ac 1
+em ac de 1
+em achop 1
+em achop sur 1
+em adapt 1
+em adapt ee 1
+em adm 1
+em adm alor 1
+em adr 1
+em ain 1
+em ain qu 1
+em algorithm 1
+em align 1
+em align sur 1
+em appel 1
+em appl 1
+em appl de 1
+em approch 1
+em approch qu 1
+em aquarius 1
+em aquarius ex 1
+em argum 1
+em argum de 1
+em argum discrimin 1
+em argum le 1
+em assoc 1
+em assoc entr 1
+em atteindr 1
+em atteindr son 1
+em au 1
+em au pr 1
+em avec 2
+em avec la 1
+em avec lag 1
+em avec pointeur 1
+em ax 1
+em ayant 1
+em ayant un 1
+em b en 1
+em ba 1
+em ba es 1
+em binprolog 1
+em bloc 1
+em boucl 1
+em boucl est 1
+em boucl parcour 1
+em ca 2
+em ca dan 1
+em ca de 1
+em ca se 1
+em cach 1
+em car 2
+em car el 1
+em cat 1
+em cat egor 1
+em cel 1
+em cel de 1
+em cel est 1
+em cel fus 1
+em cel sont 1
+em changer 1
+em changer dun 1
+em chromosom 1
+em chromosom de 1
+em cibl 1
+em classiqu 3
+em classiqu de 1
+em classiqu lorsquon 1
+em claus 1
+em claus de 1
+em claus doit 1
+em claus est 1
+em cod 1
+em cod en 1
+em cognitif 1
+em colon 2
+em colon de 2
+em colon du 1
+em commun 1
+em commun perm 1
+em comp 1
+em comp de 1
+em complec 2
+em complec comport 1
+em complexit 1
+em comport 1
+em comport peut 1
+em comport un 1
+em con 2
+em con alor 1
+em configur 1
+em configur correspon 1
+em consid 1
+em consid er 1
+em construit 1
+em construit au 1
+em correspon 1
+em correspon entr 1
+em cour 1
+em cour de 1
+em d ecr 1
+em d efin 1
+em d efinit 1
+em d elicat 1
+em d esav 1
+em d etiqu 1
+em d evelop 1
+em dacc 1
+em dacc es 1
+em dalloc 1
+em dalloc de 1
+em dam 1
+em dam elior 1
+em dan 2
+em dan ce 2
+em dan la 1
+em dan le 1
+em de 5
+em de aut 1
+em de ba 1
+em de binprolog 1
+em de calcl 1
+em de calculateur 1
+em de ce 1
+em de ch 1
+em de chaqu 1
+em de coh 1
+em de col 1
+em de compil 1
+em de complexit 1
+em de cont 1
+em de convexit 1
+em de coupur 1
+em de court 1
+em de drapeaux 1
+em de faux 1
+em de gaus 1
+em de geler 1
+em de gest 2
+em de grand 1
+em de la 4
+em de lagc 1
+em de liaison 1
+em de lit 1
+em de loc 1
+em de localit 1
+em de lop 1
+em de loptim 1
+em de lunif 1
+em de maint 1
+em de man 1
+em de modl 1
+em de mut 1
+em de non 1
+em de od 1
+em de ovr 1
+em de pe 1
+em de plac 1
+em de plusieur 1
+em de program 2
+em de prolog 1
+em de quantif 1
+em de ralentir 1
+em de register 1
+em de repr 2
+em de rest 1
+em de sch 1
+em de souligner 1
+em de substitut 1
+em de synchron 1
+em de tr 1
+em de typ 1
+em de variabl 1
+em dec 1
+em denl 1
+em dev 1
+em devrait 1
+em devrait etr 1
+em dexploit 2
+em dexploit dan 1
+em dexploit de 1
+em dexploit ou 1
+em di. 1
+em dic 3
+em dic ecut 3
+em diff 1
+em diff erent 1
+em dim 1
+em din 1
+em din egalit 1
+em dind 1
+em dind simpl 1
+em dinver 1
+em dioph 1
+em dioph suiv 1
+em direct 2
+em direct compil 1
+em direct de 1
+em direct pr 1
+em direct qu 1
+em directeur 1
+em directeur dun 1
+em disjoint 1
+em disjoint qu 1
+em doit 1
+em doit prendr 1
+em doiv 1
+em doiv etr 1
+em domain 1
+em don 2
+em don ee 2
+em dont il 1
+em dont le 1
+em doptim 1
+em doptim dun 1
+em doptim par 1
+em doptim suiv 1
+em dou 1
+em du 2
+em du aux 1
+em du bilan 1
+em du compteur 1
+em du faux 1
+em du parcour 1
+em du part 1
+em du pr 1
+em du program 1
+em du tr 1
+em du voyageur 1
+em dun 2
+em dun architectur 1
+em dun calculateur 1
+em dun debugger 1
+em dun empil 1
+em dun prim 1
+em dun ver 1
+em dynamiqu 1
+em e du 1
+em e se 1
+em ecrc 1
+em ecrc prolog 1
+em ecrit 1
+em ecrit dan 1
+em efficac 1
+em efficac de 1
+em el 1
+em el ement 1
+em empl 1
+em empl la 1
+em en 5
+em en augm 1
+em en ce 1
+em en est 1
+em en nombr 1
+em en pr 2
+em en ren 1
+em en sous 1
+em en tir 1
+em enregister 1
+em enregister de 1
+em entit 1
+em epoqu 1
+em epoqu pour 1
+em es 1
+em es de 1
+em essentiel 1
+em essentiel est 1
+em est 4
+em est ai 1
+em est alor 2
+em est convec 1
+em est dan 1
+em est de 2
+em est diff 2
+em est donc 1
+em est ensuit 1
+em est le 1
+em est math 1
+em est op 1
+em est qu 1
+em est quun 1
+em est rendu 1
+em est repr 1
+em est similair 1
+em estampil 1
+em et bien 1
+em et de 2
+em et du 1
+em et ex 1
+em et la 1
+em et non 1
+em et peut 1
+em et prop 1
+em et remarqu 1
+em et util 1
+em etait 1
+em etait donc 1
+em etap 1
+em etap con 1
+em etud 1
+em ex 1
+em ex ecut 1
+em exempl 1
+em exempl du 1
+em exp 1
+em exp er 1
+em famil 1
+em fonct 1
+em fonct dacc 1
+em fonct ent 1
+em fondam 1
+em fondam de 1
+em fondam qu 1
+em form 1
+em g en 2
+em gard 1
+em gard ladr 1
+em genr 1
+em genr de 1
+em glob 1
+em glob de 1
+em globaux 1
+em group 1
+em group de 1
+em incr 1
+em incr em 1
+em ind 1
+em individu 1
+em informatiqu 1
+em init 1
+em init adm 1
+em inst 2
+em inst de 1
+em inst du 1
+em instruc 2
+em instruc put 1
+em int 1
+em int er 1
+em interm 1
+em interm ediair 1
+em intern 1
+em introduc 1
+em introduc sur 1
+em it erat 1
+em ivy 1
+em journ 1
+em journ ee 1
+em k fo 1
+em koan 1
+em koan le 1
+em koan me 1
+em koan ont 1
+em l elim 1
+em le 2
+em le nombr 1
+em le pag 1
+em le tutoriel 1
+em le var 1
+em lec 1
+em lec ecut 1
+em li 1
+em li ee 1
+em li es 1
+em lign 1
+em lign de 1
+em lign du 1
+em lim 1
+em lim en 1
+em lor 1
+em lor de 1
+em lordr 1
+em lordr de 1
+em lorsqu 1
+em m ecan 1
+em m emoir 2
+em m ethod 2
+em ma 1
+em ma rendr 1
+em mach 1
+em majeur 2
+em majeur de 2
+em majeur est 1
+em man 2
+em markov 1
+em markov est 1
+em mod 1
+em mod el 1
+em modif 1
+em modif peuv 1
+em montr 1
+em montr quil 1
+em n ecessair 1
+em na 1
+em ne 2
+em ne fournit 1
+em nec 1
+em nec pa 1
+em nest 1
+em nest pa 1
+em nid 1
+em nid de 1
+em nl 1
+em nl si 1
+em nombr 1
+em nombr dacc 1
+em non 1
+em non wam 1
+em nous 2
+em nous perm 1
+em nous pr 1
+em on peut 1
+em on pl 1
+em ont 1
+em ont serv 1
+em optim 1
+em optim requ 1
+em ordr 1
+em ordr de 1
+em ostrip 1
+em ostrip min 1
+em ou 3
+em ou de 1
+em ou du 1
+em ou le 1
+em ou par 1
+em pa 1
+em pag 1
+em pag ma 1
+em pag peut 1
+em pag peuv 1
+em pag ser 1
+em par 2
+em par el 1
+em par empil 1
+em par transform 1
+em parm 1
+em part 1
+em part de 1
+em part regroup 1
+em particl 1
+em partit 1
+em patron 1
+em patron est 1
+em pc 1
+em pen 1
+em pen lec 1
+em permut 1
+em permut sur 1
+em peut 3
+em peut etr 2
+em peut se 1
+em peut subir 1
+em peuv 2
+em peuv etr 1
+em peuv se 1
+em ph 1
+em plus glob 1
+em po 2
+em po de 1
+em po ed 1
+em po es 1
+em point 1
+em point pl 1
+em port 1
+em port de 1
+em pour 1
+em pour de 1
+em pour la 1
+em pour le 1
+em pouvait 1
+em pouvait etr 1
+em pr 3
+em pr ec 3
+em pren 1
+em pren en 1
+em princip 1
+em princip de 1
+em probl 2
+em probl em 2
+em processeur 1
+em processeur acc 1
+em processeur ce 1
+em processeur com 1
+em processeur effectu 1
+em profit 1
+em profit de 1
+em program 1
+em program diffus 1
+em prolog 1
+em prolog compil 1
+em prolog etendus 1
+em prolog fid 1
+em prolog haut 1
+em prolog ont 1
+em prolog qu 1
+em prolog standard 1
+em propr 1
+em qu 4
+em qu cel 1
+em qu dan 1
+em qu de 1
+em qu le 1
+em qu lor 1
+em qu nous 1
+em qu pour 1
+em qu pr 1
+em qu se 1
+em quavec 1
+em quil 2
+em quil pr 1
+em quil repr 1
+em r eel 1
+em r epon 1
+em r esiduel 1
+em r esum 1
+em raison 2
+em raison le 1
+em raison qu 1
+em relatif 1
+em relatif au 1
+em remarqu 1
+em remarqu sappliqu 1
+em repr 1
+em repr es 1
+em requ 1
+em requ deux 1
+em rest 1
+em rest ne 1
+em rester 1
+em rester inchang 1
+em retourner 1
+em roy 1
+em roy de 1
+em s apr 1
+em s de 1
+em s ecurit 1
+em s emantiqu 1
+em s eminair 1
+em s equ 1
+em s equentiel 1
+em s par 1
+em s ur 1
+em s vi 1
+em san modif 1
+em sat 1
+em se 2
+em se pr 1
+em se traduit 1
+em se trouv 1
+em segm 1
+em sel 1
+em sel partiel 1
+em sen 1
+em sen afin 1
+em sep 1
+em seront 1
+em seront disper 1
+em si 3
+em si ce 1
+em si cest 1
+em si la 1
+em si le 3
+em si lim 1
+em si nous 1
+em signif 1
+em signif qu 1
+em sil 1
+em sil ar 1
+em sil ec 1
+em similair 1
+em simpl 1
+em sont 3
+em sont envisageabl 1
+em sous 1
+em sous ensembl 1
+em sous sa 1
+em souv 1
+em souv le 1
+em structur 1
+em structur pour 1
+em structur qu 1
+em suiv 1
+em suiv montr 1
+em suppl 1
+em suppl ementair 1
+em supposeront 1
+em supposeront un 1
+em sur 3
+em sur de 1
+em sur la 1
+em sur un 1
+em tableau 1
+em tableau est 1
+em tail 3
+em techniqu 1
+em techniqu est 1
+em temp 2
+em temp dan 1
+em temp la 1
+em temp le 1
+em temp qu 1
+em temp quel 1
+em tir 1
+em tir de 1
+em tout 1
+em tout le 1
+em trait 1
+em trait es 1
+em treil 1
+em treil tj 1
+em typ 2
+em typ de 2
+em typ deff 1
+em un 1
+em un ba 1
+em un term 1
+em unit 1
+em util 2
+em util de 1
+em util un 1
+em valeur 3
+em valeur de 1
+em valeur pour 1
+em valeur propr 1
+em valeur qu 1
+em var 1
+em vecteur 1
+em vecteur de 1
+em vecteur est 1
+em vit 1
+em91 1
+emac 1
+emac us 1
+email 22
+email addr 1
+email addr search 1
+email and telephon 1
+eman 1
+eman form 1
+eman form ver 1
+eman from j0 1
+eman from p1 1
+eman from pj 1
+eman from proc 1
+emantiqu 4
+emantiqu d enotationnel 1
+emantiqu de 1
+emantiqu de notr 1
+emantiqu du 2
+emantiqu du pr 1
+emantiqu du probl 1
+emantiqu dun 1
+emantiqu dun transform 1
+emantiqu est 1
+emantiqu est pr 1
+emantiqu imp 1
+emantiqu op 1
+emantiqu op erationnel 1
+emantiqu pr 1
+emantiqu pr ec 1
+emantiqu r egl 1
+emar 2
+emar a fr 1
+emar avec 1
+emar avec linstruc 1
+emar du 1
+emar du processus 1
+emar un 1
+emar un etap 1
+emarch 1
+emarch qu 1
+emarch qu nous 1
+emat 2
+emat abord 1
+emat abord le 1
+emat e sur 1
+ematiqu 4
+ematiqu appar 1
+ematiqu au 1
+ematiqu au cod 1
+ematiqu calcl 1
+ematiqu charg 1
+ematiqu charg ee 1
+ematiqu construir 1
+ematiqu cop 1
+ematiqu d es 1
+ematiqu de 4
+ematiqu de ba 1
+ematiqu de lobj 1
+ematiqu de pag 1
+ematiqu de tout 1
+ematiqu de variabl 1
+ematiqu diff 1
+ematiqu et ne 1
+ematiqu inv 1
+ematiqu lattribut 1
+ematiqu lattribut de 1
+ematiqu le 1
+ematiqu ont 1
+ematiqu par 1
+ematiqu par le 1
+ematiqu perm 1
+ematiqu peut 1
+ematiqu peut toutef 1
+ematiqu pour 2
+ematiqu pour deux 1
+ematiqu pour la 1
+ematiqu ranger 1
+ematiqu ranger larit 1
+ematiqu sauvegard 1
+ematiqu sauvegard es 1
+ematiqu selon 1
+ematiqu selon le 1
+ematiqu sont 1
+ematiqu sont regroup 1
+ematiqu transf 1
+ematiqu transf er 1
+ematiqu util 1
+ematiqu util ee 1
+ematiqu util es 1
+ematur 2
+ematur e dan 1
+ematur ee 1
+ematur ee de 1
+emb 19
+emb a graph 1
+emb an appl 1
+emb answer 1
+emb answer form 1
+emb befor disc 1
+emb boolean 1
+emb boolean expr 1
+emb by transform 1
+emb construc 1
+emb coordin 1
+emb dim 1
+emb dim de 1
+emb dim remain 1
+emb fr 1
+emb fr text 1
+emb funct 1
+emb funct rel 1
+emb gener 1
+emb gh 1
+emb gh approach 1
+emb hypergraph 1
+emb in imag 1
+emb in other 1
+emb inform 1
+emb inform retrief 1
+emb link 1
+emb link hold 1
+emb memor 1
+emb memor architectur 1
+emb memor order 1
+emb memor reduc 1
+emb model 1
+emb prompt 1
+emb prompt strateg 1
+emb repr 1
+emb text 1
+emb text string 1
+emb th log 1
+emb th nod 1
+emb theorem 1
+emb theorem demonstr 1
+emb theorem motiv 1
+emb theorem prov 1
+emb url 1
+emb url refer 1
+emb vect 1
+emb with congest 1
+emb without edg 1
+embedolog 1
+ember 1
+embod 8
+embod a metacircl 1
+embod a repl 1
+embod a se 1
+embod a theor 1
+embod by random 1
+embod th approach 1
+embod th collect 1
+embod th famil 1
+embod th funct 1
+embod th theor 1
+embrac 1
+embrac both softwar 1
+emd 3
+emd and kowalsk 1
+emd and r.a 1
+emd bo 1
+emd et al 1
+ement 4
+ement a la 3
+ement a lutil 1
+ement a prendr 1
+ement a son 1
+ement a traiter 1
+ement acc 1
+ement acc ed 1
+ement appart 1
+ement appart aux 1
+ement applicabl 1
+ement atteint 1
+ement aux 1
+ement aux travaux 1
+ement aux valeur 1
+ement avant 1
+ement ce 1
+ement ce genr 1
+ement cel 1
+ement cel qu 1
+ement con 1
+ement con ecutif 1
+ement conflictuel 1
+ement conflictuel ne 1
+ement congru 1
+ement contenus 1
+ement contenus dan 1
+ement d efin 1
+ement d es 1
+ement dan 2
+ement dan la 1
+ement dan le 1
+ement dan lespac 1
+ement dan un 1
+ement dau 1
+ement dau moin 1
+ement de 3
+ement de ba 2
+ement de ce 1
+ement de chaqu 1
+ement de deux 1
+ement de fa 1
+ement de la 2
+ement de lind 1
+ement de loptim 1
+ement de man 1
+ement de pag 1
+ement de techniqu 1
+ement de zn 1
+ement diff 1
+ement diff erentiel 1
+ement dind 1
+ement dinform 1
+ement dinform dan 1
+ement distinct 1
+ement distinct de 1
+ement du 3
+ement du bloc 1
+ement du jargon 1
+ement du livr 1
+ement du tableau 1
+ement dun 2
+ement dun colon 1
+ement dun syst 1
+ement e au 1
+ement e com 1
+ement e dan 1
+ement e par 1
+ement ee 1
+ement ee dan 1
+ement ee de 1
+ement en 2
+ement en commun 1
+ement en som 1
+ement est 2
+ement est consom 1
+ement est de 1
+ement est empil 1
+ement est lu 1
+ement et en 1
+ement et le 1
+ement et notam 1
+ement etant 1
+ement etant tir 1
+ement fin 1
+ement fin sur 1
+ement il 1
+ement il faut 1
+ement j de 1
+ement l elag 1
+ement la 1
+ement la queu 1
+ement le 3
+ement le born 1
+ement le cardin 1
+ement le ch 1
+ement le diff 1
+ement le evalu 1
+ement le instruc 1
+ement le occ 1
+ement le temp 1
+ement le trac 1
+ement lenviron 1
+ement lenviron le 1
+ement leur 1
+ement leur caus 1
+ement lext 1
+ement lor 1
+ement lor de 1
+ement majeur 1
+ement majeur de 1
+ement n ecessair 1
+ement ne 1
+ement ne peut 1
+ement nl 1
+ement par 1
+ement par colon 1
+ement peut 1
+ement peut donc 1
+ement positif 1
+ement positif par 1
+ement pour 1
+ement pour rendr 1
+ement qu 1
+ement qu termin 1
+ement quel 1
+ement quel qu 1
+ement r ef 1
+ement r esolu 1
+ement sont 1
+ement subiront 1
+ement subiront de 1
+ement suiv 1
+ement suiv la 1
+ement sur 1
+ement sur lesquel 1
+ement tail 1
+ement tail de 1
+ement tail est 1
+ement tout 1
+ement tout conjugu 1
+ement un 1
+ement un var 1
+ement v erif 1
+ementair 3
+ementair a la 1
+ementair a notr 1
+ementair a traver 1
+ementair de 2
+ementair de ce 1
+ementair de kcm 1
+ementair de la 1
+ementair de notr 1
+ementair doit 1
+ementair doit etr 1
+ementair don 1
+ementair don larit 1
+ementair du 2
+ementair du fait 1
+ementair du prem 1
+ementair dus 1
+ementair dus aux 1
+ementair effectu 1
+ementair effectu ee 1
+ementair en 1
+ementair en ecritur 1
+ementair engendr 1
+ementair engendr ee 1
+ementair est 2
+ementair est ajout 1
+ementair est qu 1
+ementair fournit 1
+ementair fournit le 1
+ementair l egal 1
+ementair lor 1
+ementair lor dun 1
+ementair n ecessair 1
+ementair nest 2
+ementair nest pa 1
+ementair peut 1
+ementair peut etr 1
+ementair peuv 1
+ementair peuv etr 1
+ementair qu 1
+ementair qu pour 1
+ementair quec 1
+ementair quec ecuteront 1
+ementair r esid 1
+ementair sur 2
+ementair sur la 2
+ementair sur le 1
+ementair susceptibl 1
+ementair vient 1
+ementair vient du 1
+ementer 1
+ementer bp 1
+ementer disjonct 1
+ementer efficac 1
+ementer efficac le 1
+ementer geler 1
+ementer la 1
+ementer le 1
+ementer le mi 1
+ementer le modif 1
+ementer lunif 1
+ementer lunif syntaxiqu 1
+ementer un 1
+ementer un acc 1
+ementer un repr 1
+emerald 2
+emerald abstract 1
+emerald abstract typ 1
+emerald system 1
+emerg 14
+emerg cluster 1
+emerg from build 1
+emerg from stud 1
+emerg implicit 1
+emerg knowledg 1
+emerg lorsquon 1
+emerg lorsquon appliqu 1
+emerg of optim 1
+emerg pack 2
+emerg pack technolog 2
+emerg proc 1
+emerg proc cluster 1
+emerg risc 1
+emerg to solut 1
+emerg tren 1
+emerg visu 1
+emerg visu appl 1
+emin 1
+eminair 1
+eminair sur 1
+eminair sur le 1
+eml 9
+eml a connect 1
+eml a glob 1
+eml abstract 1
+eml abstract compon 1
+eml allow 1
+eml allow val 1
+eml and discr 1
+eml by metainterpreter 1
+eml e5 1
+eml ee 1
+eml ee est 1
+eml k log 1
+eml mad 1
+eml reproduc 1
+eml soft 1
+eml task 1
+eml th bisect 1
+eml using 1
+eml using inherit 1
+eml vct 1
+eml virtu 1
+eml virtu cut 1
+eml workloadgeneratorrout 1
+emoir 4
+emoir a chaqu 1
+emoir a la 1
+emoir a register 1
+emoir a temp 1
+emoir act 1
+emoir adopt 1
+emoir adopt ee 1
+emoir afin 1
+emoir afin de 1
+emoir ain 1
+emoir ain qu 1
+emoir allou 1
+emoir allou ee 1
+emoir anticip 1
+emoir anticip ee 1
+emoir appel 1
+emoir appel ee 1
+emoir assoc 1
+emoir assoc ee 1
+emoir au 1
+emoir au champ 1
+emoir au retour 1
+emoir au sein 1
+emoir aux 1
+emoir aux don 1
+emoir aux point 1
+emoir avec 1
+emoir avec enregister 1
+emoir cach 1
+emoir centr 1
+emoir cod 1
+emoir cod pr 1
+emoir combin 1
+emoir commun 2
+emoir commun est 1
+emoir commun par 1
+emoir commun perm 1
+emoir contigu 1
+emoir correspon 1
+emoir correspon peut 1
+emoir dan 1
+emoir dan la 1
+emoir de 3
+emoir de 16mo 1
+emoir de kcm 1
+emoir de la 1
+emoir de moit 1
+emoir de pil 1
+emoir de prolog 1
+emoir devr 1
+emoir devr tenir 1
+emoir distribu 2
+emoir distribu ee 2
+emoir doit 1
+emoir doit consid 1
+emoir du 2
+emoir du processeur 1
+emoir dun 1
+emoir dun pag 1
+emoir dynamiqu 1
+emoir en 2
+emoir en compt 1
+emoir en dehor 1
+emoir en ecritur 1
+emoir en lab 1
+emoir en vu 1
+emoir est 3
+emoir est alor 1
+emoir est appel 1
+emoir est aus 1
+emoir est de 1
+emoir est effectu 1
+emoir est fic 1
+emoir est insuff 1
+emoir est le 1
+emoir est physiqu 1
+emoir est segm 1
+emoir est un 1
+emoir et ja 1
+emoir et la 1
+emoir et le 2
+emoir et perm 1
+emoir et se 1
+emoir et toujour 1
+emoir etiqu 1
+emoir etiqu ee 1
+emoir fin 1
+emoir g en 1
+emoir glob 2
+emoir gr 1
+emoir gr ac 1
+emoir hi 1
+emoir hi erarchiqu 1
+emoir inf 1
+emoir inf erieur 1
+emoir instantan 1
+emoir instantan ee 1
+emoir le 1
+emoir le moy 1
+emoir le travaux 1
+emoir lib 1
+emoir lib er 1
+emoir loc 2
+emoir loc classiqu 1
+emoir loc dan 1
+emoir loc de 1
+emoir loc du 1
+emoir loc duquel 1
+emoir loc est 1
+emoir loc peut 1
+emoir loc po 1
+emoir loc se 1
+emoir loc serv 1
+emoir loc soit 1
+emoir loc sont 1
+emoir loc ver 1
+emoir lor 1
+emoir lor de 1
+emoir mal 1
+emoir mi 1
+emoir mi en 1
+emoir moindr 1
+emoir montr 1
+emoir montr qu 1
+emoir n ecessair 1
+emoir n etant 1
+emoir ne 1
+emoir ne peut 1
+emoir nest 2
+emoir nest pa 2
+emoir non 1
+emoir non uniform 1
+emoir num 1
+emoir obtenu 1
+emoir obtenu en 1
+emoir occup 1
+emoir occup ee 1
+emoir offr 1
+emoir offr en 1
+emoir par 2
+emoir par compact 1
+emoir par cop 1
+emoir par le 1
+emoir par marqu 1
+emoir parcimonieus 1
+emoir partag 2
+emoir partag ee 2
+emoir patron 1
+emoir patron dpl 1
+emoir perdu 1
+emoir perdu est 1
+emoir plus dun 1
+emoir pour 2
+emoir pour effectuer 1
+emoir pour obtenir 1
+emoir pour passer 1
+emoir pour recevoir 1
+emoir pr 2
+emoir pr ec 1
+emoir pr en 1
+emoir pr esent 1
+emoir pu 1
+emoir pu etr 1
+emoir pur 1
+emoir pur statiqu 1
+emoir qu 2
+emoir qu la 1
+emoir qu le 1
+emoir quand 1
+emoir quand la 1
+emoir quun 1
+emoir quun architectur 1
+emoir quun interrupt 1
+emoir r esid 1
+emoir ram 1
+emoir ram caus 1
+emoir rap 1
+emoir rap le 1
+emoir rap un 1
+emoir redev 1
+emoir redev ind 1
+emoir requ 1
+emoir rest 2
+emoir rest const 1
+emoir rest donc 1
+emoir saur 1
+emoir secondair 1
+emoir ser 1
+emoir ser tr 1
+emoir sont 2
+emoir sont aus 1
+emoir sont constitu 1
+emoir sont difficil 1
+emoir sont maintenu 1
+emoir soulev 1
+emoir soulev es 1
+emoir statiqu 1
+emoir substantiel 1
+emoir sup 1
+emoir sup erieur 1
+emoir suppl 1
+emoir suppl ementair 1
+emoir sur 1
+emoir sur la 1
+emoir tout 1
+emoir tout le 1
+emoir trop 1
+emoir un 1
+emoir un approch 1
+emoir uniqu 1
+emoir uniqu en 1
+emoir virtuel 2
+emoir virtuel dan 1
+emoir virtuel de 1
+emoir virtuel en 1
+emoir virtuel est 1
+emoir virtuel etant 1
+emoir virtuel goth 1
+emoir virtuel par 1
+emoir virtuel partag 1
+emoir virtuel sont 1
+emoir virtuel sur 1
+emoir viv 1
+emoir viv lorsqu 1
+emoniqu 1
+emoniqu de 1
+emoniqu de okeef 1
+emoniqu suiv 1
+emonstr 2
+emonstr compl 1
+emonstr compl es 1
+emonstr de 2
+emonstr de ce 1
+emonstr de geler 1
+emonstr de la 1
+emonstr de th 1
+emonstr du 2
+emonstr du lem 1
+emonstr du prem 1
+emonstr du th 1
+emonstr qu 1
+emonstr qu nous 1
+emonstratif 1
+emonstratif sur 1
+emonstratif sur de 1
+emontr 3
+emontr clair 1
+emontr clair qu 1
+emontr e la 2
+emontr e qu 2
+emontr e un 1
+emontr est 1
+emontr est qu 1
+emontrer 2
+emontrer ce 2
+emontrer ce lem 1
+emontrer ce propr 1
+emontrer le 1
+emontrer par 1
+emontrer qu 2
+emontrer qu certain 1
+emor 3
+emor e par 1
+emor ee 1
+emor ee est 1
+emor es 1
+emor est 1
+emor est celu 1
+emor le 2
+emor le chemin 1
+emor le temp 1
+emoriser 1
+emoriser le 1
+emoriser le num 1
+emp 4
+emp 50k 1
+emp 50k 120k 1
+emp a1 1
+emp a1 a500 1
+emp d1 1
+emp d1 d20 1
+emp e1 1
+emp e1 e500 1
+emp ech 2
+emp ech chaqu 1
+emp ech la 1
+emp on sal 1
+emp on ssn 1
+emp s1 1
+emp s1 s10 1
+emp wh 1
+emp wh dnam 1
+emp wh dnamev 1
+emp wh enam 1
+emp wh sal 1
+emp wh salaryv 1
+emp wh ssn 1
+empd 1
+empd and empsk 1
+empd njoin 1
+empd njoin empsl 1
+empd rel 1
+empd wh 1
+empd wh dnameu 1
+empd wh dnamev 1
+empd wh ssn 1
+empg 1
+emph 29
+emph an addit 1
+emph implem 1
+emph implem issu 1
+emph in datab 1
+emph in train 1
+emph it simil 1
+emph on cover 1
+emph on minim 1
+emph on observ 1
+emph on problem 1
+emph th act 1
+emph th import 1
+emph th individu 1
+emph th influ 1
+emph th map 1
+emph th pot 1
+emph th thorough 1
+emph th underl 1
+emph th us 1
+emph th val 1
+emph that help 1
+emph that non 1
+emph wa tak 1
+emphasiz 3
+emphasiz dynam 1
+emphasiz dynam aspect 1
+emphasiz log 1
+emphasiz log program 1
+emphasiz th part 1
+empil 1
+empil de 1
+empil de but 1
+empil denviron 1
+empil denviron avec 1
+empil denviron de 1
+empil denviron peut 1
+empil dun 1
+empil dun incr 1
+empil e avant 1
+empil e ou 1
+empil e sur 1
+empil ee 1
+empil ee sur 1
+empil es 1
+empil es apr 1
+empil es avant 1
+empil es de 1
+empil le 1
+empil le but 1
+empil par 1
+empil par but 1
+empil un 1
+empil un aut 1
+empil un repr 1
+empiler 1
+empiler argum 1
+empiler contr 1
+empiler contr ol 1
+empiler lenviron 1
+empiler lenviron avant 1
+empiler un 1
+empiler un nouvel 1
+empir 23
+empir approach 2
+empir dat 4
+empir distribut 1
+empir evalu 3
+empir evid 2
+empir find 1
+empir find using 1
+empir found 1
+empir gener 1
+empir inform 1
+empir inform fil 1
+empir inquir 1
+empir investig 1
+empir justif 1
+empir model 1
+empir model proc 1
+empir modif 1
+empir perform 1
+empir perform model 1
+empir proc 1
+empir procedur 1
+empir research 2
+empir result 3
+empir result report 1
+empir sc 1
+empir stud 9
+empir stud ind 2
+empir stud investig 1
+empir stud report 1
+empir stud suggest 1
+empir stud using 2
+empir techniqu 2
+empir unsubst 1
+empir unsupport 1
+empir unsupport pract 1
+empir var 1
+empir var s2 1
+empir work 3
+empir work suggest 1
+empiriqu 3
+empiriqu de 1
+empiriqu de touat 1
+empiriqu du 1
+empiriqu du comport 1
+empiriqu nous 1
+empiriqu se 1
+empiriqu se situ 1
+empiriqu un 1
+empiriqu un suit 1
+empl 46
+empl a form 1
+empl a gener 1
+empl a logarithm 1
+empl a novel 1
+empl a rel 1
+empl a simil 1
+empl a singl 1
+empl altern 1
+empl altern answer 1
+empl anim 1
+empl any mean 1
+empl ar retrief 1
+empl assign 1
+empl both realm 1
+empl by sit 1
+empl cl 1
+empl cl cod 1
+empl cl po 1
+empl claus 1
+empl condit 1
+empl control 1
+empl control regr 1
+empl cur 1
+empl cur mak 1
+empl cur work 1
+empl du 1
+empl du temp 1
+empl e qu 1
+empl each arg 1
+empl earn 1
+empl ec 1
+empl ec stat 1
+empl ee 2
+empl ee dan 1
+empl ee pour 2
+empl el 1
+empl es 1
+empl fault 1
+empl fault ver 1
+empl fe 1
+empl fe gfdepartm 1
+empl fr 1
+empl fr log 1
+empl ge 1
+empl in context 1
+empl in explor 1
+empl in modern 1
+empl in order 1
+empl in pandemon 1
+empl in parallel 1
+empl is contain 1
+empl it further 1
+empl la 1
+empl la cop 1
+empl list 1
+empl list iter 1
+empl mor power 1
+empl nam 1
+empl nam rang 1
+empl nobeit 1
+empl nobeit qu 1
+empl object 1
+empl on sal 1
+empl onl fault 1
+empl part 1
+empl prim 1
+empl prim empl 1
+empl rel 2
+empl rel giv 1
+empl soph 1
+empl spec match 1
+empl spread 1
+empl sum 1
+empl th algorithm 1
+empl th bfg 1
+empl th concat 1
+empl th loc 1
+empl th pr 1
+empl th result 1
+empl th specif 1
+empl th tradit 1
+empl to approxim 1
+empl to construc 1
+empl to dec 2
+empl to rec 1
+empl walkabout 1
+empl walkabout strength 1
+empl wh cur 1
+empl wh mad 1
+empl wh mak 1
+empl wh nam 1
+empl wh sal 1
+empl wh satisf 1
+empl wh ssn 1
+empl wh work 1
+empl with nam 1
+empl with var 1
+emploieron 1
+emploieron la 1
+employeedsl 1
+employeedsl rel 1
+employeedtim 1
+employeedtim rel 1
+employeeen1 1
+employeeen1 rel 1
+employeeen2 1
+employeeen2 rel 1
+employeel 1
+employeelistg 1
+employeelistg va 1
+employeelistg va femployeeg 1
+employeesl 1
+employeesl rel 1
+employeetdec 1
+employeetdec rel 1
+employeeunpack 1
+employeeunpack rel 1
+employeeunpack yield 1
+employeeusl 1
+employeeusl rel 1
+employer 1
+employer ce 1
+employer de 1
+employer de strat 1
+employm 2
+employm of var 1
+empr 1
+empr softwar 1
+empr softwar inc 1
+emprunt 2
+empseq 1
+empseq stack 1
+empseq stack seq 1
+empsk 1
+empsk rel 1
+empsk wh 1
+empsk wh skillsu 1
+empsk wh ssn 1
+empsl 1
+empsl and empd 1
+empsl is creat 1
+empsl njoin 1
+empsl njoin empd 1
+empsl on salaryv 1
+empsl ssn 1
+empsl ssn mac 1
+empsl wh 1
+empsl wh salaryu 1
+empsl wh salaryv 1
+empsl wh ssn 1
+empt 60
+empt and jrj 1
+empt bod 1
+empt buffer 1
+empt by lem 1
+empt cel 1
+empt cel problem 1
+empt channel 1
+empt circl 1
+empt circl condit 1
+empt circl proper 1
+empt cl 1
+empt cl c.f 1
+empt claus 1
+empt cluster 1
+empt context 1
+empt del 1
+empt del nod 1
+empt domain 2
+empt fam 2
+empt fil1 1
+empt finit 1
+empt finit se 1
+empt for non 1
+empt goal 3
+empt idb 1
+empt if dec 1
+empt im 1
+empt in ca 1
+empt int q1 1
+empt intersect 2
+empt is triv 1
+empt list 3
+empt list writ 1
+empt me 1
+empt me reach 1
+empt of interrupt 1
+empt or merg 1
+empt or non 1
+empt output 1
+empt output datab 1
+empt part 1
+empt performancegoalspecificationl 1
+empt performancegoalspecificationl performancegoalspecif 1
+empt polyhedr 1
+empt polyhedr defin 1
+empt posit 1
+empt proc 1
+empt q0 1
+empt queu 2
+empt queu return 1
+empt reg 1
+empt se 6
+empt sequ 2
+empt slot 1
+empt solut 1
+empt spac 2
+empt spher 1
+empt spher proper 1
+empt string 2
+empt sub 1
+empt substitut 1
+empt substr 1
+empt substr famil 1
+empt syntac 1
+empt syntac oper 1
+empt tr 1
+empt tr equ 1
+empt track 1
+empt typ 1
+empt valu 1
+empt which test 1
+empt word 1
+empttl 1
+empttl dnamev 1
+empttl dnamev avg 1
+empttl on sal 1
+empttl rel 1
+empttl ssn 1
+empttl ssn mac 1
+empttl wh 1
+empttl wh dnameu 1
+empttl wh dnamev 1
+empttl wh enam 1
+empttl wh sal 1
+empttl wh ssn 1
+emptyqueu 1
+emptyqueu queu 1
+emt 1
+emt deutsch92 1
+emulateur 1
+emulateur au 1
+emulateur au point 1
+emycin 1
+en 95
+en a disabl 1
+en a job 1
+en a nod 1
+en a pav 1
+en a pu 1
+en a qualif 1
+en a thorough 1
+en acc 2
+en acc es 2
+en accord 1
+en accord avec 1
+en act 1
+en ad 1
+en ad equ 1
+en addr 1
+en adr 1
+en adr physiqu 1
+en ajout 3
+en ajout au 1
+en ajout aux 1
+en ajout ce 1
+en ajout de 1
+en ajout le 2
+en al eg 1
+en alg 1
+en alg ebr 1
+en allong 1
+en allong la 1
+en am elior 1
+en amont 1
+en amont du 1
+en an 1
+en an act 1
+en an author 1
+en an le 1
+en ancestr 1
+en ancestr check 1
+en and scheduler 1
+en annec 2
+en annl 1
+en annl tous 1
+en another act 1
+en any reconfigur 1
+en appel 1
+en appliqu 3
+en appliqu la 2
+en appliqu le 3
+en argum 1
+en assurer 1
+en assurer la 1
+en at ai 1
+en at amb1 1
+en at ambn 1
+en at death 1
+en at tim 2
+en attendr 1
+en attendr la 1
+en attent 1
+en attribu 1
+en attribu cycliqu 1
+en au 1
+en au ca 1
+en au prem 1
+en aucun 2
+en aucun ca 2
+en augm 2
+en augm la 2
+en aut 1
+en aut de 1
+en automatiqu 5
+en automatiqu laboratoir 1
+en av 1
+en av le 1
+en aval 1
+en aval du 1
+en avant 1
+en avant jusqu 1
+en avant perm 1
+en avoir 1
+en avoir besoin 1
+en avril 1
+en ba 1
+en biolog 1
+en biolog mol 1
+en bloc 2
+en bloc de 1
+en bloc dit 1
+en bloc just 1
+en bloc justif 1
+en bloc ojustif 1
+en broadcast 1
+en broadcast perm 1
+en c avec 1
+en c de 1
+en c fail 1
+en ca 2
+en ca de 2
+en ca derreur 1
+en calcl 1
+en calcl gr 1
+en cascad 1
+en caus 2
+en caus aon 1
+en caus de 1
+en ce 4
+en ce point 1
+en ce qu 3
+en ce sen 2
+en ce term 1
+en cel 1
+en cel de 1
+en cel diff 1
+en ch 2
+en ch le 1
+en ch un 1
+en chaqu 1
+en chaqu etat 1
+en classif 1
+en classif automatiqu 1
+en client 1
+en client thread 1
+en cm 1
+en cod 1
+en cod la 1
+en cod natif 1
+en cofacteur 1
+en cofacteur de 1
+en coh 1
+en coh er 1
+en colon 1
+en com 1
+en combin 1
+en commun 2
+en commun si 1
+en compar 2
+en compar ce 1
+en compar le 1
+en comparaison 1
+en comparaison avec 1
+en comparaison du 1
+en compil 1
+en compil incr 1
+en compl 2
+en compl ement 2
+en compt 3
+en compt afin 1
+en compt au 1
+en compt ce 1
+en compt concern 1
+en compt dan 1
+en compt dav 1
+en compt de 2
+en compt en 1
+en compt la 3
+en compt le 2
+en compt lec 1
+en compt lext 1
+en compt limport 1
+en compt lor 1
+en compt lordonnanc 1
+en compt ni 1
+en compt par 1
+en compt quaux 1
+en compt tous 1
+en con 4
+en con equ 4
+en concat 1
+en concat enant 1
+en conflit 1
+en conflit est 1
+en conflit pour 1
+en conflit quavec 1
+en conflit sur 1
+en connect 1
+en connect le 1
+en conserv 1
+en conserv de 1
+en conserv la 1
+en consid 3
+en consid erant 2
+en consid erat 1
+en consider 1
+en consider le 1
+en constitu 1
+en constru 2
+en constru de 1
+en constru un 1
+en construit 1
+en construit de 1
+en contrepart 2
+en correspon 1
+en correspon avec 1
+en correspon simultan 1
+en cou 1
+en cou de 1
+en cour 2
+en cour de 2
+en couvr 1
+en couvr de 1
+en cr 1
+en cr eant 1
+en critur 1
+en critur pr 1
+en critur requ 1
+en critur tc 1
+en custom 1
+en d ebut 1
+en d ecomp 1
+en d eduir 1
+en d eduit 1
+en d efaut 1
+en d efin 1
+en d efinit 1
+en d epit 1
+en d etail 2
+en d init 1
+en d on 1
+en d termin 1
+en dat 2
+en dat point 1
+en dautr 2
+en dautr term 2
+en de 3
+en de aut 1
+en de ca 1
+en de de 1
+en de dun 1
+en de faux 1
+en de fauxpart 1
+en de ou 1
+en de ping 1
+en de pingpong 1
+en de point 1
+en dehor 3
+en dehor de 3
+en dehor du 2
+en del 1
+en del bound 1
+en del guar 1
+en delimiter 1
+en dep 1
+en dern 1
+en despac 1
+en despac fin 1
+en deux 3
+en deux boucl 1
+en deux etap 2
+en deux instruc 1
+en deux part 3
+en deux treil 1
+en diff 1
+en diff erenc 1
+en diff erent 1
+en dilat 1
+en dilat le 1
+en dim 3
+en dim fin 1
+en diminu 1
+en diminu consid 1
+en distingu 1
+en distingu le 1
+en distribu 1
+en distribu aux 1
+en distribu le 1
+en dit 1
+en dit synchr 1
+en div 2
+en div par 1
+en do en 1
+en do i1 1
+en do r12rd 1
+en doal 1
+en doal le 1
+en don 1
+en don diff 1
+en doubl 1
+en doubl pr 1
+en douceur 1
+en douceur dun 1
+en droit 1
+en droit dattendr 1
+en du 1
+en du par 1
+en dupliqu 1
+en dupliqu du 1
+en dur select 1
+en ec 2
+en ec bien 1
+en ec un 1
+en echec 1
+en echec au 1
+en ecritur 2
+en ecritur au 2
+en ecritur avant 1
+en ecritur avec 1
+en ecritur car 1
+en ecritur dan 1
+en ecritur de 1
+en ecritur du 1
+en ecritur dun 1
+en ecritur il 1
+en ecritur inutil 1
+en ecritur lor 1
+en ecritur ma 1
+en ecritur par 1
+en ecritur pour 1
+en ecritur qu 1
+en ecritur sont 2
+en ecritur sur 1
+en ecritur te 1
+en ecritur var 1
+en ef 2
+en ef de 2
+en ef du 1
+en ef dun 1
+en ef est 1
+en ef optim 1
+en ef princip 1
+en ef qu 1
+en eff 3
+en eff aux 1
+en eff ce 1
+en eff dan 1
+en eff de 1
+en eff la 1
+en eff lav 1
+en eff le 1
+en eff lec 1
+en eff nous 1
+en eff p1 1
+en eff ping 1
+en eff qu 1
+en eff si 1
+en eff un 1
+en effectu 2
+en effectu ce 1
+en effectu de 1
+en effectu en 1
+en eficierait 1
+en eficierait dun 1
+en efiqu 1
+en efiqu en 1
+en el 2
+en elagu 1
+en elagu lenviron 1
+en elarg 1
+en elarg le 1
+en elimin 2
+en elimin la 1
+en elimin le 1
+en em 1
+en em introduc 1
+en empil 1
+en empil un 1
+en en 9
+en en commun 1
+en en en 2
+en en endwhil 1
+en en la 1
+en en lam 1
+en en le 1
+en en lordr 1
+en en nous 1
+en encapsl 2
+en encapsl lattribut 1
+en encapsl le 1
+en endwhil 1
+en engendr 1
+en engendr deux 1
+en enregister 1
+en enregister la 1
+en entr 1
+en entr dan 1
+en env2 1
+en eo 1
+en eo dun 1
+en eo fondam 1
+en eo le 1
+en er 3
+en er ee 2
+en er en 1
+en er es 1
+en er un 1
+en eral 4
+en eral appl 1
+en eral au 3
+en eral aucun 1
+en eral beaucoup 1
+en eral cach 1
+en eral conduit 1
+en eral consid 1
+en eral de 2
+en eral du 1
+en eral dun 1
+en eral dunif 1
+en eral est 2
+en eral exp 1
+en eral fa 1
+en eral fic 2
+en eral le 2
+en eral leur 1
+en eral moin 1
+en eral non 1
+en eral pa 1
+en eral par 2
+en eral plusieur 1
+en eral pour 1
+en eral qu 2
+en eral quatr 1
+en eral quun 1
+en eral retenu 1
+en eral se 1
+en eral similair 1
+en eral son 1
+en eral suiv 1
+en eral sup 1
+en eral suppl 1
+en eral sur 1
+en eral tr 2
+en eral unif 1
+en eraliser 2
+en eraliser ce 1
+en eraliser le 1
+en eraliser lempl 1
+en eraliser loptim 1
+en erat 4
+en erat automatiqu 1
+en erat com 1
+en erat cour 1
+en erat dan 1
+en erat de 3
+en erat dindividus 1
+en erat dun 2
+en erat est 1
+en erat exhaust 1
+en erat perm 1
+en erat qu 1
+en erat rest 1
+en erat sobt 1
+en erat suiv 1
+en erateur 1
+en erateur de 1
+en erationnel 1
+en erationnel fa 1
+en erationnel par 1
+en eratr 1
+en eratr de 1
+en eraux 2
+en eraux de 1
+en eraux qu 1
+en erent 2
+en erent deux 1
+en erent en 1
+en erent le 1
+en erer 4
+en erer de 1
+en erer deux 3
+en erer du 1
+en erer en 1
+en erer le 2
+en erer plusieur 1
+en erer un 2
+en eresc 1
+en eresc en 1
+en eriqu 3
+en eriqu de 2
+en eriqu dunif 1
+en eriqu en 1
+en eriqu md 1
+en es 1
+en es classiqu 1
+en esp 2
+en esp erant 1
+en esp rant 1
+en espac 2
+en espac sur 1
+en est 4
+en est aoeect 1
+en est de 1
+en est markov 1
+en est qu 2
+en est rar 1
+en est tr 1
+en et de 1
+en et dem 1
+en et ne 1
+en etant 1
+en etant cap 1
+en etant extr 1
+en etiqu 1
+en etiqu canoniqu 1
+en etiqu dan 1
+en etiqu diff 1
+en etiqu distribu 1
+en etiqu elit 1
+en etiqu etant 1
+en etiqu fon 1
+en etiqu font 1
+en etiqu hybr 1
+en etiqu indiqu 1
+en etiqu lensembl 1
+en etiqu nest 1
+en etiqu ont 1
+en etiqu par 1
+en etiqu pour 1
+en etiqu qu 1
+en etiqu sont 1
+en etiqu standard 1
+en etr 1
+en etr aus 1
+en etr dan 1
+en etud 2
+en etud le 1
+en evalu 1
+en evid 3
+en evid dautr 1
+en evid dun 1
+en evid quentr 1
+en evid un 1
+en evit 2
+en evit le 1
+en evit loccur 1
+en evit tout 1
+en ex 1
+en ex ecut 1
+en examin 2
+en examin es 1
+en examin le 1
+en exergu 1
+en exergu le 1
+en exploit 1
+en exploit le 1
+en exposer 1
+en exposer le 1
+en fa 3
+en fa explicit 1
+en fa intervenir 1
+en fa pointer 1
+en fa var 1
+en fait 4
+en fait ce 1
+en fait consid 1
+en fait de 1
+en fait deux 1
+en fait dun 1
+en fait evit 1
+en fait il 1
+en fait impl 1
+en fait lanc 1
+en fait lobj 1
+en fait mat 1
+en fait naturel 1
+en fait pa 1
+en fait quun 1
+en fait un 1
+en faveur 1
+en faveur de 1
+en faveur dun 1
+en favor 1
+en favor le 1
+en figur 1
+en fin 3
+en fin de 2
+en fin pour 1
+en fl 1
+en fonct 4
+en fonct dautr 1
+en fonct de 4
+en fonct du 2
+en fonct dun 1
+en fortran 2
+en found 1
+en fourn 1
+en fourn de 1
+en further 1
+en further simplif 1
+en g en 3
+en gac 1
+en gard 3
+en gard la 1
+en gard le 1
+en gard un 1
+en glob 1
+en glob le 1
+en goal 2
+en goal claus 1
+en graph 1
+en graph system 1
+en gu 1
+en gu dexempl 1
+en help 1
+en hexad 1
+en hexad ecim 1
+en i1 1
+en i2 1
+en i2 f0 1
+en if act 1
+en if ad 1
+en if en 1
+en imager 1
+en impl 1
+en impl ement 1
+en in 3
+en in erant 1
+en in j00 1
+en in particl 1
+en in sur 1
+en incr 1
+en incr ement 1
+en increm 1
+en increm self 1
+en ind 1
+en ind esirabl 1
+en inform 3
+en inform facult 2
+en informatiqu 9
+en informatiqu cnam 1
+en introdu 2
+en introdu de 1
+en introdu un 1
+en inver 2
+en inver le 1
+en inver simpl 1
+en is ea 1
+en it adapt 1
+en it erant 1
+en it erat 1
+en jeu 3
+en jeu lorsquil 1
+en jeu sont 1
+en jm 1
+en just requir 1
+en k etap 1
+en koct 1
+en la 2
+en la de 1
+en la segm 1
+en lab 1
+en lab de 1
+en lab dincr 1
+en lab dop 1
+en lab dunif 1
+en lam 1
+en lam elior 1
+en larg scal 1
+en le 3
+en le adapt 1
+en le compar 1
+en le instanc 1
+en le me 1
+en le rempl 1
+en le sup 1
+en lectur 2
+en lectur au 2
+en lectur augm 1
+en lectur aux 1
+en lectur avec 1
+en lectur dan 1
+en lectur de 1
+en lectur diffus 1
+en lectur ecritur 1
+en lectur en 1
+en lectur est 1
+en lectur etait 1
+en lectur etc 1
+en lectur la 1
+en lectur le 1
+en lectur lor 1
+en lectur montr 1
+en lectur ninflu 1
+en lectur ou 2
+en lectur perm 1
+en lectur pipelin 1
+en lectur pour 1
+en lectur qu 1
+en lectur retard 1
+en lectur suppl 1
+en lectur var 1
+en liaison 1
+en liaison inconditionnel 1
+en liant 1
+en liant ce 1
+en lign 1
+en lign arith 1
+en lign de 1
+en lign du 1
+en lign en 1
+en lign qu 1
+en lim 2
+en lim la 1
+en lim le 1
+en lim sa 1
+en loc 1
+en loccur 2
+en loccur le 1
+en loccur mal 1
+en logiqu 1
+en logiqu dext 1
+en logiqu par 1
+en loop 1
+en lordr 1
+en lordr dan 1
+en lu 1
+en lum 1
+en m ecaniqu 1
+en m em 2
+en m emoir 2
+en m0 1
+en m0 ou 1
+en ma 1
+en ma tr 1
+en mach 2
+en mach dan 1
+en march 1
+en march avant 1
+en md 1
+en me 1
+en me le 1
+en me prop 1
+en mesur 1
+en mesur dassurer 1
+en mesur de 1
+en mesur didentif 1
+en milieu 2
+en milieu de 2
+en millisecon 1
+en millisecon dun 1
+en misplac 1
+en misplac object 1
+en mk 1
+en mod 1
+en mod de 1
+en mod ecritur 1
+en mod lectur 1
+en mod profon 1
+en mod superficiel 1
+en mod virtuel 1
+en modif 2
+en modif la 2
+en modif lanc 1
+en modif le 2
+en montr 1
+en montr au 1
+en moy 2
+en moy de 1
+en ms 1
+en multipl 1
+en multipl lidentit 1
+en multiproc 1
+en multiproc graph 1
+en naturel 1
+en naturel de 1
+en nb 1
+en ne 2
+en ne don 1
+en nimport 1
+en nimport quel 1
+en nod 1
+en nod typ 1
+en nombr 1
+en nombr de 1
+en nombr ent 1
+en nombreux 1
+en non 1
+en non fault 1
+en not 3
+en not ej 1
+en not le 1
+en not qu 1
+en nous 1
+en nous faison 1
+en novembr 1
+en nutil 2
+en nutil pa 1
+en nutil qu 1
+en oct 1
+en oct de 1
+en oeuvr 4
+en oeuvr algorithmiqu 1
+en oeuvr autr 1
+en oeuvr dan 4
+en oeuvr dautr 1
+en oeuvr de 3
+en oeuvr dext 1
+en oeuvr du 1
+en oeuvr dun 2
+en oeuvr efficac 1
+en oeuvr logiciel 1
+en oeuvr me 1
+en oeuvr ne 1
+en oeuvr ont 1
+en oeuvr par 1
+en oeuvr peuv 1
+en oeuvr pour 1
+en oeuvr pratiqu 1
+en oeuvr prioritair 1
+en oeuvr prochain 1
+en oeuvr se 1
+en oeuvr simpl 1
+en oeuvr sous 1
+en oeuvr sur 1
+en oeuvr vi 1
+en of container 1
+en of dat 1
+en of execut 1
+en of fil 1
+en of gm 1
+en of intersect 1
+en of lin 1
+en of method 1
+en of mutu 1
+en of oeab 1
+en of opaqu 1
+en of pa 1
+en of procedur 1
+en of quantum 1
+en of record 2
+en of remark 1
+en of se 1
+en of sect 1
+en of stag 1
+en of step 1
+en of transm 1
+en offr 2
+en on 2n 1
+en ont 2
+en ont mi 1
+en oper 1
+en oper nam 1
+en optim 1
+en optim de 1
+en or fic 1
+en outr 2
+en outr de 1
+en outr deux 1
+en outr lint 1
+en outr lunimodularit 1
+en outr qu 1
+en outr sur 1
+en p pn 1
+en p treil 1
+en pack 1
+en pag 2
+en pag de 1
+en pag util 1
+en par 4
+en par el 4
+en parallel 1
+en parallel compiler 1
+en param 1
+en param etr 1
+en part 4
+en part de 2
+en part du 1
+en part dun 1
+en part gauch 1
+en part le 1
+en particl 6
+en particl cel 1
+en particl ceux 1
+en particl de 2
+en particl en 2
+en particl etr 1
+en particl la 1
+en particl lagc 1
+en particl lam 1
+en particl le 1
+en particl nous 1
+en particl pa 1
+en particl pour 1
+en particl sa 1
+en particl si 1
+en particl sur 2
+en particl touch 1
+en particl tous 1
+en particl tout 1
+en particl un 1
+en partit 1
+en partit le 1
+en pav 1
+en pav es 1
+en pen 1
+en pen lec 1
+en peopl 1
+en perform 1
+en perform el 1
+en perman 1
+en peut 1
+en peut etr 1
+en peuv 1
+en peuv se 1
+en ping 1
+en ping pong 1
+en plac 4
+en plac afin 1
+en plac de 1
+en plac dun 1
+en plac est 1
+en plac gr 1
+en plac ou 1
+en plac par 1
+en plac plusieur 1
+en plac plut 1
+en plus de 3
+en plus diver 1
+en plus du 3
+en plus la 1
+en plus perform 1
+en plus probabl 1
+en plusieur 2
+en plusieur pil 1
+en plusieur pr. 1
+en po 1
+en po ed 1
+en point 3
+en point de 1
+en pointil 1
+en posit 2
+en posit dargum 1
+en posit intern 1
+en posit termin 1
+en pourc 2
+en pourc de 1
+en pr 2
+en pr ec 1
+en pr es 2
+en pratiqu 2
+en pratiqu com 1
+en pratiqu puisquil 1
+en prem 2
+en prem argum 1
+en prem lieu 1
+en prem ressort 1
+en pren 3
+en pren com 1
+en pren en 2
+en pren le 2
+en proc 4
+en proc oscil 1
+en proc proc 1
+en proc run 1
+en profit 1
+en profit dun 1
+en profondeur 1
+en profondeur dabord 1
+en profondeur quatr 1
+en program 3
+en program automatiqu 1
+en program fonctionnel 1
+en program lin 1
+en proj 1
+en prolog 1
+en prolog de 1
+en prolog ma 1
+en prop 1
+en prop un 1
+en propag 1
+en propag tim 1
+en prouv 1
+en prouv la 1
+en provoqu 1
+en provoqu un 1
+en pseud 1
+en pu 1
+en pu de 1
+en qu 3
+en qu con 1
+en qu ne 1
+en qu nous 1
+en qu vont 1
+en quelqu 3
+en quelqu sort 3
+en quest 1
+en quest le 1
+en quit 1
+en quit la 1
+en r ealit 1
+en r ecriv 1
+en r edu 1
+en r eduir 1
+en r ef 1
+en r eordon 1
+en r ep 1
+en r esolut 1
+en r esult 3
+en r ev 1
+en raison 1
+en raison de 1
+en raison du 1
+en rar 1
+en rar dan 1
+en re 1
+en red 1
+en red efin 1
+en redon 2
+en redon au 1
+en register 1
+en rempl 1
+en ren 1
+en ren le 1
+en repr 1
+en repr es 1
+en rest 1
+en rest fid 1
+en rest util 1
+en restreign 1
+en restreign le 1
+en result 2
+en resum 1
+en retard 1
+en retard la 1
+en rev 1
+en rev ponctuel 1
+en revanch 1
+en revanch le 1
+en revu 1
+en revu de 1
+en revu diff 1
+en revu le 1
+en rien 1
+en rien la 1
+en robust 1
+en robust dynam 1
+en rout 1
+en rout du 1
+en rreq 1
+en s equ 1
+en s lect 1
+en sait 1
+en sait tr 1
+en sappliqu 1
+en sappliqu par 1
+en sassur 1
+en sassur quil 1
+en sauvegard 1
+en sauvegard dan 1
+en sauvegard le 1
+en se 3
+en se del 1
+en se don 1
+en se fic 1
+en se restreign 1
+en secon 3
+en secon lieu 2
+en secon part 1
+en ser 2
+en ser de 2
+en ser toujour 1
+en serv 1
+en si 1
+en si le 1
+en siml 2
+en siml le 1
+en siml standard 1
+en simpl 2
+en simpl la 1
+en simpl pr 1
+en soit 1
+en soit tir 1
+en som 2
+en som de 1
+en som denviron 1
+en som sur 1
+en somewh 1
+en son 1
+en son inaptitud 1
+en sort 3
+en sort de 1
+en sort est 1
+en sort qu 1
+en sort quun 1
+en soulign 1
+en soulign le 1
+en soum 1
+en soum le 1
+en sous 2
+en sous ensembl 1
+en sous popl 1
+en sp 1
+en sp ec 1
+en specif 1
+en speed 1
+en statistiqu 1
+en subproof 1
+en sup 3
+en sup qu 3
+en sup un 1
+en supprim 2
+en supprim la 1
+en supprim le 1
+en sur 1
+en sur de 1
+en symbol 1
+en syntac 1
+en syntac abstrait 1
+en t ach 1
+en t es 1
+en tail 1
+en tail nen 1
+en tail sur 1
+en tant 3
+en tant qu 2
+en tant quappl 1
+en tant quinstruc 1
+en temp 3
+en temp de 1
+en temp dic 1
+en temp quen 1
+en temp voulu 1
+en ten 1
+en ten compt 1
+en term 3
+en term dacc 1
+en term de 3
+en text 1
+en text libr 1
+en th 1
+en th act 1
+en th computer 1
+en th eor 1
+en th iter 1
+en th libr 1
+en th overlap 1
+en th paper 2
+en th stud 1
+en th subst 1
+en th tailor 1
+en tight 1
+en tight integr 1
+en tim 1
+en tir 2
+en tir part 1
+en tir sur 1
+en to en 2
+en tok 2
+en top 1
+en top level 1
+en tout 2
+en tout point 1
+en tr 4
+en tr em 1
+en tr es 1
+en tr etap 2
+en tr sect 1
+en tr typ 1
+en trait 2
+en trait dim 1
+en trait plein 1
+en treil 1
+en treil assoc 1
+en treil de 1
+en treil est 1
+en treil vu 1
+en tw experim 1
+en un 3
+en un acc 1
+en un adr 1
+en un appel 1
+en un ba 1
+en un bloc 1
+en un boucl 1
+en un claus 1
+en un conjonct 1
+en un eff 1
+en un enregister 1
+en un ensembl 2
+en un etap 1
+en un expr 1
+en un form 1
+en un instruc 1
+en un list 1
+en un marqu 1
+en un mod 1
+en un nombr 1
+en un nouvel 1
+en un op 1
+en un per 1
+en un point 1
+en un pon 1
+en un pr 1
+en un prim 2
+en un produit 1
+en un retour 1
+en un sch 1
+en un sel 1
+en un tableau 1
+en un temp 1
+en un transposit 1
+en un var 1
+en up hold 1
+en upd 1
+en upd veloc 1
+en util 4
+en util au 1
+en util de 1
+en util la 3
+en util lalgorithm 1
+en util le 3
+en util lidentit 1
+en util un 1
+en va 1
+en va de 1
+en valeur 2
+en valeur le 1
+en valeur singl 1
+en valeur tout 1
+en van 1
+en van roy 1
+en variabl 1
+en ver 1
+en vi 1
+en vi par 1
+en vient 1
+en vient remplacer 1
+en virgl 1
+en virgl flot 1
+en vr 1
+en vr grandeur 1
+en vu 3
+en vu dacc 1
+en vu dam 1
+en vu de 1
+en vu dun 2
+en vu dunif 1
+en wer creat 1
+en when detail 1
+en whil en 1
+en whil temp 1
+en with object 1
+en xn 1
+en z er 1
+en zon 1
+en zon de 1
+en. 1
+en.la 1
+en.la propr 1
+en1 1
+en1 empl 1
+en1 empl fe 1
+en1 oper 1
+en1 oper return 1
+en1 oper select 1
+en1 r fx1g 1
+en2 1
+en2 empl 1
+en2 empl fe 1
+en2 r fx1g 1
+enabl 27
+enabl a system 1
+enabl act 2
+enabl act disc 1
+enabl act penabl 1
+enabl act penabledk 1
+enabl act t2 1
+enabl an act 1
+enabl and init 1
+enabl and loc 1
+enabl another act 1
+enabl appl 1
+enabl ar interest 1
+enabl asynchron 1
+enabl asynchron commun 1
+enabl at proc 1
+enabl better prototyp 1
+enabl browser 1
+enabl command 1
+enabl command dat 1
+enabl condit 2
+enabl condit hold 1
+enabl developm 1
+enabl differ client 1
+enabl differ ver 1
+enabl effect 1
+enabl effect part 1
+enabl famil 1
+enabl gener 1
+enabl great 1
+enabl great flec 1
+enabl is eventu 1
+enabl link 1
+enabl link connect 1
+enabl mean 1
+enabl or disabl 1
+enabl path 1
+enabl proc 1
+enabl programmer 1
+enabl rich 1
+enabl rich integr 1
+enabl se 2
+enabl th act 1
+enabl th comb 1
+enabl th estim 1
+enabl th fragm 1
+enabl th integr 1
+enabl th log 1
+enabl th multipl 1
+enabl th network 1
+enabl th nod 1
+enabl th recov 1
+enabl to commun 1
+enabl to custom 1
+enabl to us 1
+enabl tool 1
+enabl tool effect 1
+enabl trem 1
+enabl trem graph 1
+enabl1 1
+enabl3 1
+enabler 1
+enacit 1
+enacit e mont 1
+enag 1
+enag spat 1
+enag spat 2a 1
+enal 1
+enal par 1
+enal par rapport 1
+enaliser 1
+enaliser la 1
+enaliser la gest 1
+enam 1
+enam departm sal 1
+enam e144 1
+enam e190 1
+enant 1
+enant le 1
+enant le corp 1
+enat 2
+enat de 1
+enat de cod 1
+enat dun 1
+enat dun pr 1
+enav 1
+enav pil 1
+enav pil loc 1
+encapsl 10
+encapsl a subtr 1
+encapsl and abstract 1
+encapsl and inherit 1
+encapsl beyon individu 1
+encapsl cal 1
+encapsl commun 1
+encapsl commun protocol 1
+encapsl distribut 1
+encapsl domain 1
+encapsl domain specif 1
+encapsl ee 1
+encapsl idispatch 1
+encapsl is brok 1
+encapsl label 1
+encapsl label collect 1
+encapsl lattribut 1
+encapsl lattribut dan 1
+encapsl le 1
+encapsl le diff 1
+encapsl log 1
+encapsl log funct 1
+encapsl mechan 1
+encapsl of suit 1
+encapsl refer 1
+encapsl subsystem 1
+encapsl th ba 1
+encapsl trac 1
+encapsl trac flow 1
+ench 1
+ench nement 1
+ench nement complec 1
+encin 1
+encin distribut 1
+encin distribut transact 1
+encl 9
+encl a giv 1
+encl a nod 1
+encl a part 1
+encl a record 1
+encl al nod 1
+encl by uw 1
+encl cl 1
+encl color 1
+encl color pattern 1
+encl dynam 1
+encl dynam environm 1
+encl dynam extent 1
+encl either v1 1
+encl exact 1
+encl handler 1
+encl handler funct 1
+encl in squar 1
+encl lec 1
+encl lec environm 1
+encl loop 1
+encl modl 1
+encl squar 1
+encl squar brack 1
+encl th nod 1
+encl that fac 1
+encl tw nod 1
+encl ui 1
+encl uj 1
+encl v0 1
+encl v01 1
+encl v1 1
+enclench 1
+encod 16
+encod addit 1
+encod addit fil 1
+encod addit inform 1
+encod allow 1
+encod an adv 1
+encod and crossover 1
+encod and decod 1
+encod and extract 1
+encod and number 1
+encod and rout 1
+encod as rad 1
+encod as tempor 1
+encod bit 1
+encod cm 1
+encod cm schem 1
+encod con 1
+encod fil 1
+encod fil siz 1
+encod for multicast 1
+encod ga 1
+encod header 1
+encod header arriv 1
+encod header car 1
+encod inform 1
+encod length 1
+encod length heur 1
+encod mechan 1
+encod mechan requir 1
+encod n ary 1
+encod nonlin 1
+encod nonlin oscil 1
+encod of instruc 1
+encod petr 1
+encod petr net 1
+encod pr 1
+encod program 1
+encod program langu 1
+encod schem 3
+encod such inform 1
+encod techniqu 1
+encod techniqu suffer 1
+encod th character 1
+encod th header 1
+encod th proc 1
+encod th symbol 1
+encod th td 1
+encod that accompl 1
+encod typ 1
+encod typ bit 1
+encod typ regl 1
+encod using 2
+encod wa chang 1
+encod wer slight 1
+encod worm 1
+encomp 8
+encomp al topolog 1
+encomp concept 1
+encomp log 1
+encomp sever tun 1
+encomp system 1
+encontrad 1
+encontrad no trabalh 1
+encor 6
+encor a traiter 1
+encor acc 1
+encor acc au 1
+encor contenir 1
+encor contenir de 1
+encor couler 1
+encor couler beaucoup 1
+encor dan 1
+encor dan le 1
+encor de 3
+encor de altern 1
+encor de nombreux 1
+encor de propr 1
+encor de valeur 1
+encor en 1
+encor en program 1
+encor env 1
+encor env la 1
+encor etr 1
+encor etr caus 1
+encor examin 1
+encor examin ee 1
+encor g en 1
+encor il 1
+encor il ny 1
+encor init 1
+encor init es 1
+encor la 2
+encor la complexit 1
+encor leff 1
+encor leff ping 1
+encor lefficacit 1
+encor loin 1
+encor loin de 1
+encor lutil 1
+encor lutil du 1
+encor modif 1
+encor moin 1
+encor moin pu 1
+encor multimac 1
+encor n ecessair 1
+encor nous 1
+encor nous nous 1
+encor plus complec 1
+encor plus vi 1
+encor po dam 1
+encor po dan 1
+encor pour 1
+encor pour eviter 1
+encor proportionnel 1
+encor provoquer 1
+encor qu 1
+encor qu le 1
+encor quembryonnair 1
+encor quun 1
+encor quun fa 1
+encor r edhibitoir 1
+encor renforc 1
+encor respecter 1
+encor respecter la 1
+encor sav 1
+encor sav erer 1
+encor significativ 1
+encor tous 1
+encor tous le 1
+encor util 1
+encor util de 1
+encor visit 1
+encor viv 1
+encounter 28
+encounter a becom 1
+encounter a ca 1
+encounter a parallel 1
+encounter a polynom 1
+encounter a pr 1
+encounter a reason 1
+encounter an anom 1
+encounter at li 1
+encounter at tim 1
+encounter dur unif 1
+encounter for reduc 1
+encounter in evalu 1
+encounter in sem 1
+encounter mor cont 1
+encounter no cont 1
+encounter occur 1
+encounter on l 1
+encounter oper 1
+encounter or anticip 1
+encounter som ser 1
+encounter th differ 1
+encounter th mf 1
+encounter when n3 1
+encounter which form 1
+encounter whil scan 1
+encour 16
+encour a reinforc 1
+encour act 1
+encour act stud 1
+encour chang 1
+encour good 1
+encour good design 1
+encour interact 1
+encour learn 1
+encour object 1
+encour object orient 1
+encour simpl 2
+encour stud 1
+encour th developm 2
+encour th lack 1
+encour to think 1
+encour user 1
+encourag 8
+encourag and help 1
+encourag nont 1
+encourag nont pa 1
+encourag th subject 1
+encourag to cr 1
+encourag to infer 1
+encrypt 1
+encrypt cl 1
+encumber 1
+encumber by cach 1
+encyclop 2
+encyclop of mathemat 2
+endc 1
+endeavour 1
+endeavour as poetr 1
+endebt 1
+endebt to giorg 1
+ender 2
+endext 1
+endext defrl 1
+endext mod 1
+endfor 6
+endfor en 1
+endfor loop 1
+endfor step 1
+endicot 1
+endicot program 1
+endicot program labor 1
+endif 7
+endif print 1
+endif return 1
+endif s8 1
+endifexit 1
+endifexit print 1
+endifnumar 1
+endloop 1
+endm 1
+endor 2
+endow 2
+endow th gener 1
+endow th text 1
+endpoint 5
+endpoint be coalesc 1
+endpoint in pl 1
+endpoint li 1
+endpoint of e01 1
+endpoint of e02 1
+endpoint of e0i 1
+endpoint of e1 1
+endpoint of ei 1
+endpoint of ej 1
+endpoint of ek 1
+endpoint of intersect 1
+endpoint of oe 1
+endpoint of oeab 1
+endpoint of traver 1
+endpoint of uw 1
+endpoint ver 1
+endpoint ver exterior 1
+endpoint wil produc 1
+endroit 2
+endroit du 1
+endroit du program 1
+endroit il 1
+endroit il ont 1
+endroit pour 1
+endroit pour calculer 1
+endroit pr 1
+endroit pr ec 1
+endselfmod 1
+endselfmod act 1
+endselfmod prim 1
+endselfmod prim allow 1
+endselfmod prob 1
+endswitch 1
+endwhil 3
+endwhil step 1
+endwhileavg 1
+endwhileavg calcavg 1
+endwhilefread 1
+enem 1
+enem remain 1
+enerer 1
+enerer pa 1
+enerer pa en 1
+energ 6
+energ conform 1
+energ leak 1
+energ leak problem 1
+energ minim 2
+energ term 1
+energ to develop 1
+enew 1
+enew ecur 1
+enf 2
+enf 2enf 1
+enf com 1
+enf com nous 1
+enf de 1
+enf de la 1
+enf dun 1
+enf dun noeud 1
+enf est 1
+enf est construit 1
+enf et de 1
+enf g3 1
+enf issus 1
+enf issus dun 1
+enf remplac 1
+enf remplac dun 1
+enfin 2
+enfin d la 1
+enfin le 1
+enfin le condit 1
+enfin le paragraph 1
+enfin le princip 1
+enfin le processeur 1
+enfin le test 1
+enfin qu 1
+enfin qu la 1
+enfin quau 1
+enfin quau ca 1
+enfl 1
+enforc 24
+enforc a bal 1
+enforc a singl 1
+enforc a strong 1
+enforc a weak 1
+enforc al mail 1
+enforc an ec 1
+enforc by appl 1
+enforc by synchron 1
+enforc coh 1
+enforc dat 1
+enforc dat dep 1
+enforc dep 1
+enforc ext 1
+enforc fair 1
+enforc log 1
+enforc log secur 1
+enforc modl 1
+enforc modl composit 1
+enforc non 1
+enforc non transit 1
+enforc of distribut 1
+enforc of synchron 1
+enforc or relac 1
+enforc other constraint 1
+enforc parameter 1
+enforc parameter polymorph 1
+enforc ser 1
+enforc short edg 1
+enforc th bal 1
+enforc th dat 1
+enforc th principl 1
+enforc th rl 1
+enforc th siml 1
+enforc transpar 1
+eng 17
+eng acc 1
+eng and user 1
+eng as follow 1
+eng can acc 1
+eng can cal 1
+eng cod 1
+eng fewer 1
+eng fewer server 1
+eng in comput 1
+eng in find 1
+eng initializ 1
+eng initializ variabl 1
+eng inser 1
+eng man 1
+eng of netsim 1
+eng parod 1
+eng pfzj 1
+eng receiv 1
+eng tract 1
+eng tract forc 1
+eng transform 1
+eng wam 1
+eng which execut 1
+eng.auburn.edu 1
+eng.sy 1
+engelwood 1
+engelwood cl 1
+engendr 2
+engendr alor 1
+engendr alor un 1
+engendr de 1
+engendr de direct 1
+engendr de migr 1
+engendr de tr 1
+engendr deux 1
+engendr e entr 1
+engendr e est 1
+engendr e implicit 1
+engendr e par 1
+engendr ee 1
+engendr ee par 1
+engendr en 1
+engendr en eff 1
+engendr entr 1
+engendr entr 2n 1
+engendr es 1
+engendr es par 1
+engendr le 1
+engendr un conflit 1
+engendr un grand 1
+engendr un ph 1
+engendrer 1
+engendrer un 1
+engendrer un per 1
+engineer 60
+engineer a us 1
+engineer and chem 1
+engineer and computer 1
+engineer and inform 2
+engineer and knowledg 2
+engineer and methodolog 4
+engineer and system 1
+engineer appl 2
+engineer ar 1
+engineer auburn 1
+engineer by hofman 1
+engineer center 1
+engineer comb 1
+engineer commun 2
+engineer consult 1
+engineer dec 1
+engineer dev 1
+engineer dev implementer 1
+engineer difficult 1
+engineer difficult encounter 1
+engineer econom 1
+engineer econom system 1
+engineer environm 1
+engineer for induc 1
+engineer for softwar 1
+engineer hav found 1
+engineer inform 1
+engineer inform sc 1
+engineer institut 1
+engineer is nec 1
+engineer issu 1
+engineer mak 1
+engineer mak chang 1
+engineer mak modif 1
+engineer model 2
+engineer must addr 1
+engineer nec 1
+engineer not 3
+engineer of complec 1
+engineer of med 1
+engineer of program 1
+engineer of saf 1
+engineer our dat 1
+engineer platform 1
+engineer problem 1
+engineer proc 1
+engineer procedur 1
+engineer produc 1
+engineer research 9
+engineer research council 7
+engineer research result 1
+engineer review 1
+engineer sc 2
+engineer sc ser 1
+engineer seek 1
+engineer ser 1
+engineer som piec 1
+engineer supercomput 1
+engineer system 1
+engineer task 1
+engineer task forc 1
+engineer team 1
+engineer team design 1
+engineer techniqu 1
+engineer technolog 1
+engineer th dat 1
+engineer th featur 1
+engineer th program 1
+engineer that prev 1
+engineer to fit 1
+engineer to match 1
+engineer tool 1
+engineer transact 1
+engineer typ 1
+engineer typ perform 1
+engineer vol.5 1
+engineer which produc 1
+engineer with minim 1
+enginepower 1
+enginepower actspeed 1
+enginepower actspeed accel 1
+enginest 1
+enginest esoff 1
+enginest eson 1
+enginner 1
+england 4
+englewood 11
+englewood cl 1
+englewood cliff 10
+englob 1
+englob le 1
+enh 26
+enh and correct 1
+enh by ad 1
+enh by repl 1
+enh concur 1
+enh design 1
+enh design spac 1
+enh fair 1
+enh fair ea 1
+enh laser 1
+enh laser strip 1
+enh level 1
+enh loc 1
+enh memor 1
+enh mesh 1
+enh our repertoir 1
+enh test 1
+enh th apprec 1
+enh th decompr 1
+enh th effect 1
+enh th gp 1
+enh th lik 1
+enh th mesh 1
+enh th perform 1
+enh th search 1
+enh th select 1
+enh th util 1
+enh to inclus 1
+enh to us 1
+enh tut 1
+enh tut contact 1
+enh ver 2
+enh with respect 1
+enhanc 11
+enhanc by support 1
+enhanc describ 1
+enhanc of decompr 1
+enhanc of transform 1
+enhanc perform 1
+enhanc problem.1 1
+enhanc schem 1
+enhanc which mak 1
+enient 3
+enient de 2
+enient de compliquer 1
+enient de impl 1
+enient de la 1
+enient de transformer 1
+enient dun 2
+enient dun mvp 1
+enient dun tel 1
+enient li 1
+enient li es 1
+enient majeur 2
+enient majeur de 2
+enient princip 1
+enient princip de 1
+enient qu 1
+enient qu lon 1
+enient quil 1
+enient rest 1
+enient rest lim 1
+enient suppl 1
+enient suppl ementair 1
+enj 3
+enj 1.5ind 1
+enj do think 1
+enj talk 1
+enj than work 1
+enj work 1
+enjalber 1
+enl 1
+enl ve 1
+enl ve donc 1
+enlarg 2
+enlarg rel 1
+enlever 1
+enlever certain 1
+enlever certain pag 1
+enlight 1
+enom 3
+enom en 3
+enom en appel 1
+enom en de 1
+enom en fait 1
+enom en naturel 1
+enom en peut 1
+enom en qu 1
+enom en sur 1
+enom humain 1
+enombr 1
+enombr de 1
+enombr de marqu 1
+enombrer 1
+enombrer dur 1
+enombrer dur lec 1
+enon 1
+enon la 1
+enon la matr 1
+enonc 3
+enonc e au 1
+enonc e en 1
+enonc ee 1
+enonc ee au 1
+enonc es 1
+enonc es est 1
+enorm 4
+enorm ement 2
+enorm ement dun 1
+enorm ement suiv 1
+enorm pract 1
+enot 1
+enot ee 1
+enot ee instruc 1
+enot le 1
+enot le point 1
+enot quil 1
+enot quil ne 1
+enotationnel 1
+enotypiqu 1
+enotypiqu ou 1
+enotypiqu ou provoqu 1
+enqueu 7
+enqueu a request 1
+enqueu ad 1
+enqueu at sa 1
+enqueu at tim 1
+enqueu avail 1
+enqueu avail port 1
+enqueu dequeu 1
+enqueu in pj 1
+enqueu me 1
+enqueu or dequeu 1
+enqueu queu 1
+enqueu queu msg 1
+enqueu request 1
+enqueu result 1
+enqueu th pair 1
+enr 1
+enr se 1
+enregister 2
+enregister avec 1
+enregister avec un 1
+enregister compr 1
+enregister compr tr 1
+enregister correspon 1
+enregister correspon aux 1
+enregister dactiv 1
+enregister dactiv avec 1
+enregister dactiv classiqu 1
+enregister dactiv de 1
+enregister dactiv est 1
+enregister dactiv pr 1
+enregister dactiv standard 1
+enregister dactiv uniqu 1
+enregister de 1
+enregister de la 1
+enregister de liaison 1
+enregister de mi 1
+enregister de tr 1
+enregister devenus 1
+enregister devenus inutil 1
+enregister doit 1
+enregister doit etr 1
+enregister ee 1
+enregister ee dan 1
+enregister ee sur 1
+enregister entr 1
+enregister entr le 1
+enregister es 1
+enregister es dan 1
+enregister est 1
+enregister impliqu 1
+enregister impliqu la 1
+enregister la 1
+enregister la list 1
+enregister la valeur 1
+enregister le 1
+enregister le liaison 1
+enregister lec 1
+enregister lib 1
+enregister lib er 1
+enregister par 1
+enregister par segm 1
+enregister pour 1
+enregister pour etr 1
+enregister qu 1
+enregister sont 1
+enregister suppl 1
+enregister suppl ementair 1
+enregister sur 1
+enregister sur la 1
+enregister sur le 1
+enregister toujour 1
+enregister uniqu 1
+enregistrer 2
+enregistrer le 2
+enregistrer le acc 1
+enregistrer le unif 1
+enrich 4
+enrich th observ 1
+enrich var 1
+enrich var subtyp 1
+enrich with variabl 1
+enrichm 1
+ensam 1
+enseign 1
+enseign n ecessair 1
+enseign vi 1
+ensembl 6
+ensembl al 1
+ensembl al eatoir 1
+ensembl compl 1
+ensembl d etr 1
+ensembl de 5
+ensembl de chromosom 1
+ensembl de claus 1
+ensembl de condit 1
+ensembl de don 1
+ensembl de ent 1
+ensembl de matr 2
+ensembl de noeud 2
+ensembl de nombr 1
+ensembl de op 1
+ensembl de pag 1
+ensembl de point 2
+ensembl de processeur 2
+ensembl de processus 1
+ensembl de repr 1
+ensembl de solut 2
+ensembl de structur 1
+ensembl de tableaux 1
+ensembl de transit 1
+ensembl de zd 1
+ensembl de ze 1
+ensembl dhypoth 1
+ensembl dhypoth es 1
+ensembl dop 1
+ensembl dop erat 1
+ensembl doutil 1
+ensembl doutil th 1
+ensembl est 1
+ensembl est non 1
+ensembl fin 1
+ensembl fv1 1
+ensembl fv1 t1 1
+ensembl non 1
+ensembl non vid 1
+ensembl ont 1
+ensembl ont de 1
+ensembl p de 1
+ensembl par 1
+ensembl par de 1
+ensembl particl 1
+ensembl particl de 1
+ensembl perm 1
+ensembl perm alor 1
+ensembl restreint 1
+ensembl restreint de 1
+ensembl s 1
+ensembl s il 1
+ensembl sont 1
+ensembl sont disjoint 1
+ensembl suff 1
+ensembl suff dop 1
+ensembl un 1
+ensembl un popl 1
+ensembl xij1 1
+ensu 3
+ensu disc 2
+ensuit 6
+ensuit abord 1
+ensuit abord ee 1
+ensuit ce 1
+ensuit de 1
+ensuit de savoir 1
+ensuit deux 1
+ensuit deux man 1
+ensuit discut 1
+ensuit discut es 1
+ensuit la 2
+ensuit la mi 1
+ensuit la rel 1
+ensuit nous 1
+ensuit nous pr 1
+ensuit pa 1
+ensuit pa ee 1
+ensuit pr 1
+ensuit pr esent 1
+ensuit soum 1
+ensuit test 1
+ensuit tr 1
+ensuit tr util 1
+ensuit un nouvel 1
+ensuit util 1
+ensur 59
+ensur a con 1
+ensur a fif 1
+ensur a minim 1
+ensur a rel 1
+ensur a suff 1
+ensur adequ 1
+ensur adequ robust 1
+ensur any me 1
+ensur block 1
+ensur by 1
+ensur by multipl 1
+ensur compensat 1
+ensur compl 1
+ensur con 1
+ensur configur 1
+ensur correct 2
+ensur correct ad 1
+ensur ec 1
+ensur exclus 1
+ensur exclus acc 1
+ensur extern 1
+ensur extern st 1
+ensur fault 1
+ensur fault toler 1
+ensur fl 1
+ensur fl preserv 1
+ensur fresh 1
+ensur high qu 1
+ensur interchang 1
+ensur loc 2
+ensur lrc 1
+ensur method 1
+ensur method us 1
+ensur nonblock 1
+ensur oper 1
+ensur path 1
+ensur path privileg 1
+ensur proper 1
+ensur proper exerc 1
+ensur rel 1
+ensur rel deliv 1
+ensur ser 1
+ensur slot 1
+ensur slot acc 1
+ensur slot reader 1
+ensur slot writer 1
+ensur smal standard 1
+ensur synchron 1
+ensur th ba 1
+ensur th correct 1
+ensur th ec 1
+ensur th po 1
+ensur th pr 1
+ensur th suff 1
+ensur th transact 1
+ensur that argum 1
+ensur that block 1
+ensur that cod 1
+ensur that com 1
+ensur that dat 1
+ensur that definit 1
+ensur that giv 1
+ensur that iec 1
+ensur that manufactur 1
+ensur that measur 1
+ensur that memor 1
+ensur that recov 1
+ensur that subtransact 1
+ensur that subtyp 1
+ensur that term 1
+ensur that typ 1
+ensur that unfold 1
+ensur tr1 1
+ent 27
+ent alread defin 1
+ent an appl 1
+ent ar 1
+ent ar observ 1
+ent ba 1
+ent being loc 1
+ent cal ar 1
+ent cal context 1
+ent comput 1
+ent comput bar 1
+ent con 2
+ent congru 1
+ent contain 1
+ent contain therein 1
+ent contenus 1
+ent contenus dan 1
+ent dan 1
+ent de 1
+ent de ce 1
+ent de la 1
+ent decl 1
+ent defin 1
+ent don 1
+ent don la 1
+ent du 1
+ent du pol 1
+ent dun 1
+ent dun pol 1
+ent er 1
+ent er aux 1
+ent er car 1
+ent er cont 1
+ent er convec 1
+ent er dan 1
+ent er du 1
+ent er dun 1
+ent er en 1
+ent er kcm 1
+ent er non 1
+ent er nous 1
+ent er ont 1
+ent er plafon 1
+ent er planch 1
+ent er plut 1
+ent er posit 1
+ent er pour 1
+ent er suppl 1
+ent et le 1
+ent et var 1
+ent f defin 1
+ent ha respon 1
+ent hid 1
+ent in import 1
+ent in modl 1
+ent in squar 1
+ent in transit 1
+ent inclus 1
+ent inclus giv 1
+ent is lin 1
+ent level 1
+ent lintersect 1
+ent lintersect dun 1
+ent ma 1
+ent ma rationnel 1
+ent mj 1
+ent naturel 2
+ent ne 1
+ent ne lu 1
+ent non 1
+ent non sunt 1
+ent occur 1
+ent ou 1
+ent ou rationnel 1
+ent peut 1
+ent peut contenir 1
+ent quil 1
+ent quil cont 1
+ent relationship 2
+ent relationship approach 1
+ent relationship model 1
+ent rement 1
+ent rement automatiqu 1
+ent respon 1
+ent separ 1
+ent solut 1
+ent solut en 1
+ent som control 1
+ent specif 1
+ent sqr 1
+ent sqr renam 1
+ent strict 1
+ent strict positif 1
+ent sup 1
+ent sup erieur 1
+ent tak 1
+ent tak respon 1
+ent th programmer 1
+ent to maintain 1
+ent v erif 1
+ent vi 1
+ent.nous 1
+ent.nous pr 1
+ent.nous pr esent 1
+entail 8
+entail a correspon 1
+entail elim 1
+entail ext 1
+entail pract 1
+entail pract goal 1
+entail som custom 1
+entail virtu 1
+entailm 3
+entailm for argum 1
+entailm of fd 1
+entailm of finit 1
+entailm rel 1
+entendon 2
+entendon la 1
+entendon la converg 1
+entendon un agenc 1
+entendu 1
+enter 28
+enter a compact 1
+enter a parallel 1
+enter a qu 1
+enter accept 1
+enter accept mod 1
+enter an act 1
+enter as4cal 1
+enter bs5exit 1
+enter ca 1
+enter compact 1
+enter cs6exit 1
+enter dat 1
+enter es 1
+enter es profon 1
+enter ev tim 1
+enter field 1
+enter input 1
+enter main 1
+enter main nec 1
+enter or exit 1
+enter p becom 1
+enter parameter 1
+enter parameter valu 1
+enter th ar 1
+enter th centr 1
+enter th crit 2
+enter th dat 1
+enter th fl 1
+enter th graph 1
+enter th layout 1
+enter th le 1
+enter th liv 1
+enter th loop 1
+enter th pref 1
+enter th procedur 1
+enter th sit 1
+enter that nod 1
+enter their nam 1
+enterpr 5
+enterpr al 1
+enterpr model 1
+enterpr wh secur 1
+enthousiasm 1
+enthousiasm et sa 1
+enthusiasm 2
+entir 57
+entir a structur 1
+entir acquaint 1
+entir acquaint list 1
+entir algorithm 2
+entir an 1
+entir an pack 1
+entir ar 2
+entir b tr 1
+entir befor attempt 1
+entir block 2
+entir block jobj 1
+entir block pack 1
+entir branch 1
+entir cluster 1
+entir cluster disappear 1
+entir collect 1
+entir column 1
+entir complec 1
+entir comput 2
+entir comput halt 1
+entir con 1
+entir contour 1
+entir contour edg 1
+entir deptttl 1
+entir design 1
+entir design sub 1
+entir determin 1
+entir differ act 1
+entir differ ar 1
+entir disk 1
+entir disk block 1
+entir du 1
+entir empsl 1
+entir execut 1
+entir explan 1
+entir expr 1
+entir fft 1
+entir fft digraph 1
+entir funct 1
+entir futur 1
+entir futur evolut 1
+entir geograph 1
+entir geograph datab 1
+entir grammar 1
+entir graph 1
+entir hist 2
+entir hist tupl 1
+entir hist valu 1
+entir in figur 2
+entir in flesh 1
+entir indep 1
+entir interview 1
+entir label 1
+entir label form 1
+entir learn 1
+entir learn hist 1
+entir lin 1
+entir loop 1
+entir measur 1
+entir model 1
+entir model support 1
+entir mous 1
+entir mous driv 1
+entir mult 1
+entir mult dim 1
+entir multicast 1
+entir multidest 1
+entir multidest pack 1
+entir network 2
+entir network remain 1
+entir new engineer 1
+entir new requir 1
+entir oper 1
+entir oper environm 1
+entir pack 1
+entir pack ec 1
+entir pag 2
+entir pag tabl 1
+entir pandemon 1
+entir pandemon system 1
+entir plan 1
+entir prev 1
+entir prev learn 1
+entir proc 1
+entir proc yield 1
+entir procedur 1
+entir program 2
+entir rang 1
+entir remain 1
+entir remain system 1
+entir requisit 1
+entir requisit se 1
+entir sal 1
+entir sal valu 1
+entir sc 1
+entir se 5
+entir shuffl 1
+entir shuffl merg 1
+entir solut 1
+entir solut proc 1
+entir spac 1
+entir spac avail 1
+entir span 1
+entir st 1
+entir suit 1
+entir system 4
+entir system lif 1
+entir tabl 1
+entir test 1
+entir test se 1
+entir test situ 1
+entir text 1
+entir tr 1
+entir track 1
+entir train 1
+entir train se 1
+entir unicast 1
+entir univer 1
+entir vanish 1
+entir within t2 1
+entir wrap 1
+entit 2
+entit e minim 1
+entit e trait 1
+entit s tud 1
+entitl 3
+entitl art 1
+entitl art if 1
+entitl autom 1
+entitl autom fin 1
+entitl to assum 1
+entityrelationship 1
+entr 35
+entr 2n 1
+entr 3j 1
+entr ai 1
+entr and cach 1
+entr and entr0 1
+entr and se 1
+entr appear 1
+entr appear extrem 1
+entr ar opt 1
+entr as necessidad 1
+entr assoc 1
+entr at tim 1
+entr autr 2
+entr bloc 1
+entr bloc de 1
+entr boucl 1
+entr boucl seront 1
+entr button 1
+entr by compar 1
+entr cach 1
+entr cach sont 1
+entr ce 1
+entr ce deux 1
+entr ce processeur 1
+entr ceux 1
+entr ceux ci 1
+entr champ 1
+entr champ de 1
+entr chromosom 1
+entr claus 1
+entr cod 1
+entr con 2
+entr contr 1
+entr contr ol 1
+entr correspon 2
+entr courb 1
+entr cpn 1
+entr dan 2
+entr dan la 1
+entr dan le 1
+entr de 2
+entr de don 1
+entr de patron 1
+entr deux 3
+entr deux acc 1
+entr deux ecritur 1
+entr deux instruc 1
+entr deux nid 1
+entr deux pag 1
+entr deux patron 1
+entr deux posit 1
+entr deux processeur 1
+entr deux som 1
+entr deux variabl 1
+entr diff 3
+entr diff erent 3
+entr disjonct 1
+entr donc 1
+entr donc dan 1
+entr ecrivain 1
+entr ecrivain puisquil 1
+entr ee 1
+entr ee de 1
+entr ee sest 1
+entr empil 1
+entr empil de 1
+entr en 2
+entr en jeu 2
+entr entr0 1
+entr entr0 visit 1
+entr environ 1
+entr equilibr 1
+entr equilibr de 1
+entr eux 1
+entr eux par 1
+entr for f0 1
+entr for individu 1
+entr for loc 1
+entr for pag 1
+entr for shar 1
+entr form 1
+entr from pag 1
+entr greater 1
+entr ia 1
+entr impl 1
+entr impl em 1
+entr in p1s 1
+entr in tabl 1
+entr incr 1
+entr int bin 1
+entr interfac 1
+entr is examin 1
+entr is return 1
+entr it erat 1
+entr l elim 1
+entr la 4
+entr la cel 1
+entr la don 1
+entr la pr 1
+entr la prem 2
+entr la th 1
+entr la var 1
+entr le 5
+entr le adr 1
+entr le bloc 1
+entr le born 1
+entr le boucl 1
+entr le cach 1
+entr le conflit 1
+entr le deux 3
+entr le diff 2
+entr le horlog 1
+entr le individus 1
+entr le instruc 2
+entr le invar 1
+entr le moment 1
+entr le nid 1
+entr le nombr 1
+entr le nouveaux 1
+entr le nouvel 1
+entr le obj 1
+entr le pag 1
+entr le per 1
+entr le perform 1
+entr le ph 1
+entr le point 1
+entr le primitiv 1
+entr le processeur 1
+entr le programmeur 1
+entr le recuit 1
+entr le register 1
+entr le repr 1
+entr le som 1
+entr le sous 1
+entr le taux 1
+entr le temp 1
+entr le tr 1
+entr le ut 1
+entr le variabl 1
+entr le ver 1
+entr lecteur 1
+entr lestampil 1
+entr lestampil cour 1
+entr m emoir 1
+entr ne 2
+entr ne de 1
+entr ne donc 1
+entr ne linv 1
+entr neck 1
+entr neck cut 1
+entr ner 1
+entr ner le 1
+entr nerait 1
+entr nerait deux 1
+entr nid 1
+entr nid de 1
+entr nod 2
+entr nod e0 1
+entr nod.2 1
+entr or fil 1
+entr p1s2 1
+entr p1s2 s3 1
+entr pag 1
+entr pair 1
+entr pair de 1
+entr parenth 1
+entr parenth es 1
+entr per row 1
+entr pertain 1
+entr pi 1
+entr pil 1
+entr pil uniqu 1
+entr pj 1
+entr plac 1
+entr plus de 1
+entr plusieur 2
+entr plusieur processeur 1
+entr point 5
+entr point de 1
+entr primitiv 1
+entr primitiv al 1
+entr procedur 1
+entr processeur 1
+entr processeur dan 1
+entr processeur ecrivain 1
+entr processeur par 1
+entr processeur peuv 1
+entr processus 1
+entr processus compt 1
+entr programmeur 1
+entr requir 1
+entr requir upd 1
+entr rev 1
+entr rn 1
+entr s equ 1
+entr s1 1
+entr s1 s2 1
+entr som 1
+entr som de 1
+entr son 1
+entr son utilisateur 1
+entr t es 1
+entr tail 1
+entr tail de 1
+entr term 1
+entr term comp 1
+entr to keep 1
+entr to read 1
+entr to writ 1
+entr un 2
+entr un cel 1
+entr un pol 1
+entr un processeur 1
+entr un program 1
+entr un techniqu 1
+entr var 1
+entr variabl 1
+entr variabl perman 1
+entr writ 1
+entr writ buffer 1
+entr zn 1
+entr0 1
+entr0 visit 1
+entr1 1
+entrain 2
+entrain de 1
+entrain e par 1
+entrelac 1
+entrelac ee 1
+entrelac ee perm 1
+entrem 1
+entrem el 1
+entrem el ee 1
+entrepr 1
+entrer 1
+entrer en 1
+entrer en conflit 1
+entrevoyon 1
+entrevoyon deux 1
+entrevoyon deux solut 1
+entrop 6
+entrop and conc 1
+entrop ba 1
+entrop ba algorithm 1
+entrop coder 1
+entrop distribut 1
+entrop incr 1
+entrop input 1
+entrop lead 1
+entrop of cl 1
+entrop reduc 1
+entryp1 1
+entrypoint 1
+entrypoint continu 1
+enu 1
+enu entr 1
+enu entr le 1
+enu es 1
+enumer 15
+enumer combin 1
+enumer of key 1
+enumer of polynom 1
+enumer oper 1
+enumer oper deriv 1
+enumer th el 1
+enumer th method 1
+enumer th point 1
+enumer th privileg 1
+enumer th smallest 1
+enumer th solut 1
+enumer using 1
+enur 1
+enur de 1
+enur de register 1
+env 11
+env a chaqu 1
+env a min 1
+env a shar 1
+env any great 1
+env assign 1
+env assign act 1
+env au 1
+env au processeur 1
+env by act 1
+env correspon 1
+env correspon au 1
+env de 2
+env de lap 1
+env de requ 1
+env e au 1
+env est 1
+env est la 1
+env la 1
+env la pag 1
+env le 1
+env le me 1
+env maxrol 1
+env mod 1
+env owner 1
+env perform 1
+env self 1
+env siz 1
+env stag 1
+env stag learn 1
+env textur 1
+env textur ba 1
+env th fin 1
+env that situ 1
+env to act 1
+env un 1
+env un cop 1
+env un me 1
+env un requ 1
+env upd 1
+env upd channel 1
+env1 1
+env2 2
+env2 st 1
+envelop 2
+envelop convec 1
+envelop convec etc 1
+envelop to bound 1
+environ 4
+environ a chaqu 1
+environ a de 1
+environ a env1 1
+environ a lextr 1
+environ ain 1
+environ ain qu 1
+environ avant 1
+environ avant qu 1
+environ avec 1
+environ avec tr 1
+environ com 1
+environ com cont 1
+environ com de 1
+environ correspon 1
+environ cour 1
+environ cour lectur 1
+environ d es 1
+environ de 2
+environ de man 1
+environ de par 1
+environ de program 1
+environ de tail 1
+environ de typ 1
+environ dev 1
+environ dev de 1
+environ dev lenviron 1
+environ doit 1
+environ doit donc 1
+environ dun 1
+environ dun repr 1
+environ en 1
+environ en pr 1
+environ est 1
+environ est cr 1
+environ est inspir 1
+environ est recouver 1
+environ est similair 1
+environ est structur 1
+environ et de 1
+environ et du 1
+environ et lenviron 1
+environ et leur 1
+environ et point 1
+environ et un 1
+environ fait 1
+environ fait part 1
+environ inclut 1
+environ inclut deux 1
+environ instruc 1
+environ la 1
+environ la wam 1
+environ le 1
+environ le foncteur 1
+environ logiciel 1
+environ logiciel de 1
+environ lor 1
+environ lor de 1
+environ m em 1
+environ multiprocesseur 1
+environ occup 1
+environ occup tr 1
+environ ont 1
+environ par 2
+environ par el 1
+environ par loptim 1
+environ peut 1
+environ peut aus 1
+environ plus anc 1
+environ pour 1
+environ pour la 1
+environ pourrait 1
+environ pourrait etr 1
+environ pr 1
+environ pr ec 1
+environ pu 1
+environ pu etr 1
+environ san pr 1
+environ sont 1
+environ sont successiv 1
+environ sug 1
+environ sur 1
+environ sur lesquel 1
+environ tel 1
+environ tel qu 1
+environ un 1
+environ un prem 1
+environ va 1
+environ va etr 1
+environ zhou 1
+environ. 1
+environm 52
+environm al outperform 1
+environm alter 1
+environm analyst 1
+environm analyst requir 1
+environm and autom 1
+environm and ch 1
+environm and chang 1
+environm and dynam 1
+environm and tool 1
+environm and ts 1
+environm appear 1
+environm ar bin 1
+environm ar replac 1
+environm assum 1
+environm assum ea 1
+environm assum hold 1
+environm befor push 1
+environm by explor 1
+environm by mak 1
+environm by upd 1
+environm chang 2
+environm compon 1
+environm compr 1
+environm con 4
+environm condit 2
+environm condit arithm 1
+environm condit condit 1
+environm construc 1
+environm cr 1
+environm ded 1
+environm differ 1
+environm do ec 1
+environm eager 1
+environm error 1
+environm event 1
+environm ext 2
+environm fail 1
+environm for adapt 1
+environm for architectur 1
+environm for evalu 1
+environm for experim 1
+environm for explor 1
+environm for individu 1
+environm for narrow 1
+environm for neur 1
+environm for prolog 1
+environm for reason 1
+environm for siml 1
+environm for sl1 1
+environm for sn 1
+environm for stat 2
+environm for us 1
+environm for workflow 1
+environm fram 1
+environm from exampl 1
+environm from interact 1
+environm funct 1
+environm ha mov 1
+environm incorpor 1
+environm inform 1
+environm init 1
+environm input 1
+environm integr 1
+environm is chang 2
+environm is compl 1
+environm is creat 1
+environm is defin 1
+environm is expect 1
+environm is exper 1
+environm is nonmarkov 1
+environm is unchang 1
+environm lif 1
+environm lik uid 1
+environm manipl 1
+environm may prov 1
+environm of currnod 1
+environm of defcl 1
+environm of defgener 1
+environm of definit 1
+environm of hierarch 1
+environm of method 1
+environm of objectb 1
+environm of var 1
+environm on shar 1
+environm output 1
+environm output deliver 1
+environm over 1
+environm prov 1
+environm prov payoff 1
+environm receiv 1
+environm record 1
+environm repeat 1
+environm replac 1
+environm respect 1
+environm sc 1
+environm sc structur 1
+environm specif 1
+environm specif strateg 1
+environm st 1
+environm stack 1
+environm th confid 1
+environm th subject 1
+environm that ec 1
+environm that track 1
+environm to demonstr 1
+environm to st 1
+environm to support 1
+environm trim 1
+environm trim trim 1
+environm uid 1
+environm using 2
+environm vi virtu 1
+environm we consider 1
+environm wer rank 1
+environm wh 1
+environm wh enabl 1
+environm which support 1
+environm wil exhibit 1
+environm with arbitr 1
+environm with opensim 1
+environm2 1
+envisag 5
+envisag e dutiliser 1
+envisag for nrd 1
+envisag for sv 1
+envisag un align 1
+envisageabl 1
+envisager 2
+envisager de 1
+envisager de comparer 1
+envisager etendr 1
+envisager etendr ce 1
+envisager la 1
+eo 1
+eo dun 1
+eo dun part 1
+eo fondam 1
+eo fondam pour 1
+eo le 1
+eo le gain 1
+eo un pr 1
+eoc 1
+eoccup 3
+eoccup dun 1
+eoccup fondam 1
+eoccup fondam lor 1
+eoccup pa 1
+eoccuper 2
+eoccuper de 2
+eoccuper de la 2
+eoec 1
+eoec autom 1
+eoec autom computer 1
+eoec model 1
+eoec model ba 1
+eoec po 1
+eoec po cluster 1
+eoecac 1
+eoeectiv 1
+eoeectiv en 1
+eoeectiv en compt 1
+eoeectu 1
+eoeur 1
+eof 1
+eom 2
+eom etriqu 2
+eom etriqu ayant 1
+eom etriqu de 1
+eom etriqu po 1
+eoph 1
+eoph dappr 1
+eoph dappr ec 1
+eor 6
+eor algebriqu 1
+eor algebriqu de 1
+eor asymptotiqu 1
+eor asymptotiqu de 1
+eor darwin 1
+eor de 3
+eor de ag 1
+eor de algorithm 1
+eor de darwin 1
+eor de freidlin 1
+eor de graph 1
+eor de la 1
+eor de sch 1
+eor de treil 1
+eor du 1
+eor du par 1
+eor em 2
+eor em car 1
+eor em de 2
+eor em dinver 1
+eor em fondam 1
+eor em montr 1
+eor em nous 1
+eor em peuv 1
+eor em pour 1
+eor em pr 1
+eor em se 1
+eor em suiv 1
+eor markov 1
+eor markov de 1
+eor pren 1
+eor pren en 1
+eor standard 1
+eor standard de 1
+eordon 1
+eordon le 1
+eordon le lign 1
+eordonner 1
+eorgan 1
+eorgan con 1
+eorgan de 1
+eorgan de don 1
+eoriqu 3
+eoriqu de 1
+eoriqu du 1
+eoriqu du cardin 1
+eoriqu et de 1
+eoriqu etr 1
+eoriqu etr om 1
+eoriqu issus 1
+eoriqu issus de 1
+eoriqu perm 1
+eoriqu perm de 1
+eoriqu pour 1
+eoriqu pour la 1
+eoriqu pr 1
+eoriqu pr esent 1
+eoriqu qu 1
+eoriqu qu seront 1
+eoriqu rest 1
+eoriqu rest donc 1
+eoriqu sont 1
+eoriqu sont appliqu 1
+eoriqu vi 1
+ep 7
+ep cont 1
+ep de 2
+ep de capacit 2
+ep es 1
+ep es cycliqu 1
+ep et ee 2
+ep et ep 1
+ep et es 1
+ep etant 1
+ep etant ce 1
+ep eter 1
+ep eter cherch 1
+ep etitif 1
+ep fortran 1
+ep quelqu 1
+ep quelqu dizain 1
+ep sp 1
+ep un 1
+ep un autr 1
+ep un certain 1
+ep1 1
+ep1 jc 1
+ep2 1
+ep2 jc 1
+ep3 1
+ep3 jc 1
+ep89 1
+epar 4
+epar de 2
+epar de distribut 1
+epar de environ 1
+epar du 1
+epar du comp 1
+epar e en 1
+epar ee 1
+epar ee ma 1
+epar ee perm 1
+epar ee pour 1
+epar ement 1
+epar ement le 1
+epar es 1
+epar et de 1
+epar la 1
+epar minim 1
+epar minim tol 1
+epar ser 1
+epar si 1
+epar si il 1
+eparer 2
+eparer le 2
+eparer le don 1
+eparer le pair 1
+epargn 1
+epargn ee 1
+epargn ee au 1
+epargner 1
+epart 4
+epart a fr 1
+epart a la 1
+epart a lit 1
+epart de 1
+epart de la 1
+epart du 1
+epart du patron 1
+epart dun 1
+epart dun etap 1
+epart en 1
+epart entr 1
+epart entr le 1
+epart equitabl 1
+epart equitabl entr 1
+epart equitabl sur 1
+epart est 1
+epart est le 1
+epart etant 1
+epart etant qu 1
+epart le 1
+epart m0 1
+epart pour 1
+epart pour la 1
+epart pour mettr 1
+epart sur 1
+epart sur le 1
+epartir 1
+epartir equitabl 1
+epartir equitabl le 1
+epartir sur 1
+epartir sur le 1
+epartit 4
+epartit de 2
+epartit de calcl 1
+epartit de conflit 1
+epartit de don 1
+epartit de retour 1
+epartit et de 1
+epartit pon 1
+epartit pon er 1
+epartit sont 1
+epartit sont tout 1
+epartit sur 1
+epartit sur le 1
+epen 4
+epen a lint 1
+epen alor 1
+epen alor du 1
+epen alor simpl 1
+epen annonc 1
+epen annonc es 1
+epen assoc 1
+epen assoc ee 1
+epen au 1
+epen au sen 1
+epen aus 1
+epen aus du 1
+epen avec 2
+epen avec la 1
+epen avec le 1
+epen avec sa 1
+epen ce 1
+epen ce qu 1
+epen classiqu 1
+epen classiqu ecrivain 1
+epen contenu 1
+epen contenu dan 1
+epen correspon 1
+epen correspon dan 1
+epen d1 1
+epen dan 1
+epen dan le 1
+epen de 4
+epen de appel 1
+epen de caract 1
+epen de consid 1
+epen de don 1
+epen de ik 1
+epen de la 3
+epen de lappl 1
+epen de leur 1
+epen de lext 1
+epen de lhistoir 1
+epen de lordonnanc 1
+epen de ressourc 1
+epen de test 1
+epen de typ 1
+epen de valeur 1
+epen dj 1
+epen dj tel 1
+epen donc 1
+epen donc qu 1
+epen dont la 1
+epen du 2
+epen du mod 1
+epen du nid 1
+epen du nombr 2
+epen du part 1
+epen du program 1
+epen du tableau 1
+epen du temp 1
+epen dun 1
+epen dun grand 1
+epen dun nid 1
+epen dun program 1
+epen ecrivain 1
+epen ecrivain ecrivain 1
+epen ecrivain lecteur 1
+epen effectiv 1
+epen effectiv de 1
+epen egal 1
+epen egal de 1
+epen encor 1
+epen encor de 1
+epen entr 1
+epen entr boucl 1
+epen entr ceux 1
+epen entr de 1
+epen entr deux 1
+epen entr le 1
+epen entr nid 1
+epen est 1
+epen est donc 1
+epen et le 1
+epen et limpact 1
+epen et quon 1
+epen etant 1
+epen etant dan 1
+epen evidem 1
+epen evidem de 1
+epen l equilibr 1
+epen laffinit 1
+epen larg 1
+epen larg de 1
+epen lecteur 1
+epen lecteur ecrivain 1
+epen lecteur lecteur 1
+epen maint 1
+epen maint du 1
+epen mutuel 1
+epen mutuel de 1
+epen pa 2
+epen pa de 2
+epen pa sel 1
+epen pa tant 1
+epen partiel 1
+epen partiel de 1
+epen perm 1
+epen perm de 1
+epen plus de 1
+epen possibl 2
+epen possibl avec 1
+epen possibl du 1
+epen pour 1
+epen pour la 1
+epen princip 1
+epen princip du 1
+epen producteur 1
+epen producteur producteur 1
+epen qu 2
+epen qu de 1
+epen qu du 1
+epen quelconqu 1
+epen s 1
+epen sec 1
+epen sec ecut 1
+epen sensibl 1
+epen sensibl du 1
+epen ser 1
+epen ser alor 1
+epen si 1
+epen sont 1
+epen sont dan 1
+epen sont de 1
+epen sont donc 1
+epen sur 1
+epen tr 1
+epen tr es 1
+epen un 1
+epen un expr 1
+epen vecteur 1
+epen vecteur de 1
+ependait 1
+ependait de 1
+ependait de linterv 1
+ependait fort 1
+ependait fort de 1
+ependam 4
+ependam de 3
+ependam de approch 1
+ependam de la 2
+ependam de mod 1
+ependam du 1
+ependam du typ 1
+ependam et ag 1
+ependam et uniform 1
+ependam le 2
+ependam le un 2
+ephemer 1
+ephemer mark 1
+epil 1
+epil du 1
+epil ee 1
+epil es 1
+epil le 1
+epiler 1
+epiler la 1
+epiler le 1
+epiler sa 1
+epiler sa valeur 1
+epiler tout 1
+epiler tout cel 1
+epilogu 1
+epineus 1
+epineux 2
+epiphenom 1
+epiphenom coh 1
+episod 1
+epit 1
+epit de 1
+epit de sa 1
+epit du 1
+epit du chapitr 1
+epit dun 1
+epit dun consom 1
+epl 3
+epl de 1
+epl de don 1
+epl ee 1
+epl ee de 1
+epl pa 1
+epl pa le 1
+eplac 2
+eplac ad 1
+eplac ad equat 1
+eplac de 1
+eplac de cod 1
+eplac ee 1
+eplac ee au 1
+eplac ee de 1
+eplac ee en 1
+eplac ee ma 1
+eplac en 1
+eplac en avant 1
+eplac par 1
+eplac par rapport 1
+eplac peuv 1
+eplac peuv changer 1
+eplac peuv etr 1
+eplacer 2
+eplacer dan 2
+eplacer dan ce 1
+eplacer dan le 1
+eplacer la 1
+eplacer la nouvel 1
+eplacer un 1
+eplacer un part 1
+epliqu 1
+epliqu cycliqu 1
+epliqu cycliqu de 1
+epliqu de 1
+epliqu de ce 1
+epliqu du 1
+epliqu du nid 1
+epliqu loc 1
+epliqu loc pour 1
+epoch 5
+epoch as non 1
+epoch cach 1
+epoch is defin 1
+epoch of learn 1
+epoch pattern 1
+epoch per pattern 1
+epon 2
+epon a la 1
+epon altern 1
+epon au 1
+epon au crit 1
+epon dan 1
+epon dan le 1
+epon est 1
+epon est quil 1
+epon possibl 1
+epondez 1
+epondez avec 1
+epondez avec ou 1
+epondr 2
+epondr a ce 1
+epondr aux 1
+epondr aux contraint 1
+epoqu 2
+epoqu pour 1
+epoqu pour tourner 1
+epoqu r ecent 1
+eppinger 1
+epreuv 1
+epson 1
+epson pal 1
+epson pal alt 1
+epsrc 1
+epsrc grant 1
+epsrc grant gr 1
+eq 10
+eq amount 1
+eq intn 1
+eq realn 1
+eq start 1
+eq symbol 1
+eql 1
+eql method 1
+eql method known 1
+eqn 1
+eqntot 1
+eqntot and speech 1
+eqntot truth 1
+eqntot truth tabl 1
+equ 94
+equ abov med 1
+equ acc 1
+equ am eliorer 1
+equ amount 4
+equ and determin 1
+equ and disequ 1
+equ and eigenproblem 1
+equ and inequ 4
+equ and order 1
+equ and rewrit 1
+equ and structur 1
+equ ar gener 1
+equ ar part 1
+equ at o4 1
+equ au 1
+equ au probl 1
+equ aucun 1
+equ aucun conflit 1
+equ avec 1
+equ avec la 1
+equ ax 2
+equ axx2 1
+equ axx2 ayy2 1
+equ bal 1
+equ between term 1
+equ binair 1
+equ block 1
+equ block string 1
+equ bound 1
+equ bound rl 1
+equ by gaus 1
+equ c 2pc 1
+equ c conform 1
+equ c de 1
+equ c1a 1
+equ c1a alor 1
+equ cant le 1
+equ cap 1
+equ cap rl 1
+equ cardin 1
+equ ce 2
+equ ce ch 1
+equ ce claus 1
+equ commun 1
+equ compil 1
+equ compil ee 1
+equ complec 1
+equ comport 1
+equ comport au 1
+equ comput 1
+equ comput power 1
+equ comput tim 1
+equ condu 1
+equ condu aux 1
+equ conduit 1
+equ consid 1
+equ consid erabl 1
+equ constraint 3
+equ constraint captur 1
+equ constraint ext 1
+equ constraint part 1
+equ constraint.2 1
+equ d etermin 1
+equ d ev 1
+equ d eventuel 1
+equ dacc 1
+equ dacc es 1
+equ dan 1
+equ dan lesquel 1
+equ dapparit 1
+equ dapparit de 1
+equ de 4
+equ de acc 1
+equ de ce 2
+equ de claus 1
+equ de conflit 1
+equ de echang 1
+equ de la 1
+equ de larchitectur 1
+equ de leff 1
+equ de longueur 1
+equ de mod 1
+equ de mut 1
+equ de popl 1
+equ de primitiv 1
+equ de processus 1
+equ de transit 1
+equ de typ 1
+equ de van 1
+equ de vecteur 1
+equ def 1
+equ deff 1
+equ deff ping 1
+equ describ 1
+equ describ execut 1
+equ dind 1
+equ dinstruc 2
+equ dinstruc appropr 1
+equ dinstruc compil 1
+equ dinstruc conduit 1
+equ dinstruc correspon 1
+equ dinstruc de 1
+equ dinstruc du 1
+equ dinstruc en 1
+equ dinstruc est 1
+equ dinstruc ex 1
+equ dinstruc instruc 1
+equ dinstruc multipl 1
+equ dinstruc peuv 1
+equ dinstruc point 1
+equ dinstruc sont 1
+equ dinstruc sp 1
+equ dinterv 1
+equ dinterv de 1
+equ dist 1
+equ distribut 2
+equ du 2
+equ du mod 1
+equ du point 1
+equ du protocol 1
+equ du syst 1
+equ dunif 1
+equ dunif condu 1
+equ dynam 1
+equ dynam log 1
+equ ee 1
+equ ee pour 1
+equ effectuer 1
+equ effectuer deux 1
+equ ei 1
+equ elev 1
+equ elev ee 1
+equ en 1
+equ en mod 1
+equ es 1
+equ est 1
+equ est partag 1
+equ etr 1
+equ etr parcouru 1
+equ expr 1
+equ expr rel 1
+equ ffdg 1
+equ ffdg idj 1
+equ ffsg 1
+equ fl 1
+equ fondam 2
+equ fondam de 1
+equ for narrow 1
+equ for shap 1
+equ form 1
+equ forml 1
+equ four quarter 1
+equ fr 1
+equ fr equent 1
+equ giv 1
+equ good 2
+equ good solut 1
+equ halv 1
+equ hold 1
+equ im 1
+equ im ed 1
+equ import 1
+equ import problem 1
+equ import sur 1
+equ in boolean 1
+equ in l0 1
+equ insolit 1
+equ insolit qu 1
+equ is bound 2
+equ is describ 1
+equ is expr 1
+equ is np 1
+equ is replac 1
+equ is thus 1
+equ is triv 1
+equ it follow 1
+equ la 1
+equ la pag 1
+equ langu 1
+equ le 1
+equ le deux 1
+equ le don 1
+equ le nid 1
+equ le not 1
+equ lik 2
+equ lin 1
+equ lin egalit 1
+equ log 3
+equ log program 1
+equ log tool 1
+equ merit 1
+equ minim 1
+equ nod 1
+equ non 1
+equ number 4
+equ number ja 1
+equ nw 1
+equ nw ss 1
+equ of mot 1
+equ on concur 1
+equ on hypercub 1
+equ on mimd 1
+equ oper 1
+equ or eigenproblem 1
+equ or exceed 1
+equ or inequ 1
+equ or stronger 1
+equ or unequ 1
+equ over real 1
+equ part 3
+equ perform 1
+equ peut 1
+equ peut etr 1
+equ peuv 2
+equ peuv etr 2
+equ plus longu 1
+equ pour 1
+equ pour de 1
+equ pour le 1
+equ pratiqu 1
+equ pratiqu du 1
+equ privileg 1
+equ prob 5
+equ proper 1
+equ quon 1
+equ quon est 1
+equ r eal 1
+equ raw 1
+equ raw power 1
+equ rel 4
+equ rel calculus 1
+equ rel de 1
+equ rel steiner 1
+equ result 1
+equ rewrit 1
+equ rewrit techniqu 1
+equ rl 1
+equ rl respect 1
+equ san modif 1
+equ se 1
+equ se comport 1
+equ show 1
+equ si 1
+equ si el 1
+equ simpl 1
+equ siz 6
+equ siz block 1
+equ siz buck 1
+equ siz cel 1
+equ siz network 1
+equ siz sub 1
+equ siz system 1
+equ siz vol 1
+equ solver 1
+equ solver appl 1
+equ sont 1
+equ spac 2
+equ spac ver 1
+equ specif 1
+equ specif method 1
+equ spur 1
+equ spur eigenvalu 1
+equ squar 1
+equ st 1
+equ succ 1
+equ suffisem 1
+equ suffisem fa 1
+equ system 1
+equ th bound 1
+equ th expr 1
+equ th largest 1
+equ th number 1
+equ th pack 1
+equ th particip 1
+equ th pot 1
+equ th smallest 1
+equ th traff 1
+equ that allow 1
+equ that describ 1
+equ their addr 1
+equ their pot 1
+equ to 2c 1
+equ to 2d 1
+equ to 2lj 1
+equ to 2n 1
+equ to ae 1
+equ to atom 1
+equ to ci 1
+equ to ed 1
+equ to fflr 1
+equ to jqj 1
+equ to log2 1
+equ to m2 1
+equ to p2 1
+equ to proof 1
+equ to splitter 1
+equ to st 1
+equ to vj 1
+equ to zer 2
+equ unidirect 1
+equ unint 1
+equ valu 2
+equ wa found 1
+equ weight 1
+equ weight edg 1
+equ wel defin 1
+equ width 1
+equ work 1
+equ xy 1
+equ zi 1
+equalbound 1
+equalbound var 1
+equat 2
+equat a chaqu 1
+equat dun 1
+equat dun som 1
+equationnel 1
+equationnel imp 1
+equationnel soit 1
+equationnel soit pr 1
+equem 1
+equem acc 1
+equem acc ed 1
+equem etr 1
+equem etr mi 1
+equem ignor 1
+equenc 2
+equenc de 2
+equenc de claus 1
+equenc de claus100 1
+equent 4
+equent au 1
+equent au vid 1
+equent dinstruc 1
+equent dinstruc est 1
+equent en 1
+equent en alg 1
+equent qu 1
+equent qu le 1
+equentialiser 1
+equentialiser le 1
+equentialiser le requ 1
+equentialiser tot 1
+equentialiser tot le 1
+equentiel 3
+equentiel a apporter 1
+equentiel avec 1
+equentiel de 3
+equentiel de champ 1
+equentiel de instruc 1
+equentiel de son 1
+equentiel donc 1
+equentiel donc centr 1
+equentiel du 1
+equentiel du program 1
+equentiel dun 1
+equentiel dun de 1
+equentiel ec 1
+equentiel ec en 1
+equentiel en 1
+equentiel et le 1
+equentiel et par 1
+equentiel fortran 1
+equentiel ind 1
+equentiel ind epen 1
+equentiel peut 1
+equentiel peut ain 1
+equentiel sur 2
+equentiel sur tous 1
+equentiel sur un 1
+equid 2
+equid and between 1
+equilater 1
+equilater shap 1
+equilibr 4
+equilibr appar 1
+equilibr between expr 1
+equilibr correct 1
+equilibr correct de 1
+equilibr de 1
+equilibr de charg 1
+equilibr de pag 1
+equilibr ee 1
+equilibr es 1
+equilibr is therefor 1
+equilibr ma 1
+equilibr ma ne 1
+equip 13
+equip ap 1
+equip cap 1
+equip es 1
+equip es dun 1
+equip est 1
+equip est toujour 1
+equip land 1
+equip land tant 1
+equip mal 1
+equip mal de 1
+equip mixt 1
+equip mixt litp 1
+equip solidor 1
+equip to handl 1
+equip with addit 1
+equip with buffer 1
+equip with propag 1
+equip with suff 1
+equip with test 1
+equipm 10
+equipm corpor 7
+equipm corpor cambridg 1
+equipm or furnitur 1
+equit 3
+equit dit 1
+equit dit erat 1
+equitabl 1
+equitabl entr 1
+equitabl entr le 1
+equitabl le 1
+equitabl sur 1
+equitabl sur le 1
+equitz 2
+equiv 68
+equiv 2d 1
+equiv 2d tr 1
+equiv a cel 1
+equiv a la 2
+equiv a linstruc 1
+equiv a lj 1
+equiv a un 1
+equiv algebr 1
+equiv among rel 1
+equiv amount 1
+equiv and def 1
+equiv and simplif 1
+equiv answer 1
+equiv answer conserv 1
+equiv ar disc 1
+equiv between recur 1
+equiv bo 1
+equiv bo mb 1
+equiv can detect 1
+equiv can determin 1
+equiv can ea 1
+equiv can us 1
+equiv cl 5
+equiv cl oe 1
+equiv comput 1
+equiv configur 1
+equiv constitu 1
+equiv constraint 1
+equiv dan 2
+equiv dan la 1
+equiv dan notr 1
+equiv de 2
+equiv de la 1
+equiv de no 1
+equiv de notr 1
+equiv de probl 1
+equiv diagram 1
+equiv disjunct 1
+equiv disjunct norm 1
+equiv du 1
+equiv du non 1
+equiv dun 1
+equiv dun sous 1
+equiv en 2
+equiv en ce 1
+equiv en fa 1
+equiv en nombr 1
+equiv est 1
+equiv est toutef 1
+equiv execut 1
+equiv execut trac 1
+equiv for log 1
+equiv for wellkind 1
+equiv forml 1
+equiv forml oe 1
+equiv fram 1
+equiv fram structur 1
+equiv funct 2
+equiv funct tak 1
+equiv gener 1
+equiv hold 2
+equiv hold good 2
+equiv implem 1
+equiv in gener 1
+equiv in sect 1
+equiv in term 2
+equiv incr 1
+equiv is describ 1
+equiv is shown 1
+equiv is straightfor 1
+equiv langu 1
+equiv langu requir 1
+equiv level 2
+equiv lin 1
+equiv lin repr 1
+equiv liter 1
+equiv liter recognit 1
+equiv liter simplif 1
+equiv mean 1
+equiv modl 1
+equiv modl var 1
+equiv must conserv 1
+equiv non 1
+equiv non reflect 1
+equiv number 1
+equiv observabl 1
+equiv of coar 1
+equiv of denot 1
+equiv of evolut 1
+equiv of exact 1
+equiv of figur 1
+equiv of propag 1
+equiv of s3 1
+equiv of stat 1
+equiv of virtu 1
+equiv on program 1
+equiv oper 1
+equiv perform 1
+equiv pointer 1
+equiv pointer ba 1
+equiv pour 1
+equiv pour lacc 1
+equiv procedur 1
+equiv procedur us 1
+equiv program 2
+equiv program langu 1
+equiv propag 1
+equiv propag equiv 1
+equiv reg 1
+equiv rel 5
+equiv rel induc 1
+equiv replac 1
+equiv repr 1
+equiv result 1
+equiv return 1
+equiv return fal 1
+equiv s 1
+equiv se 1
+equiv server 1
+equiv si 1
+equiv ss 1
+equiv st 1
+equiv st du 1
+equiv st ten 1
+equiv structur 1
+equiv structur program 1
+equiv succ 1
+equiv switch 1
+equiv system 2
+equiv system built 1
+equiv test 1
+equiv tim 1
+equiv to aff 1
+equiv to augm 1
+equiv to cext 1
+equiv to chang 1
+equiv to check 1
+equiv to compon 1
+equiv to denot 1
+equiv to eml 1
+equiv to gener 1
+equiv to gsm 1
+equiv to ignor 1
+equiv to interpr 1
+equiv to k0 1
+equiv to karmarkar 1
+equiv to level 1
+equiv to mach 1
+equiv to oe 1
+equiv to other 1
+equiv to perform 1
+equiv to replac 1
+equiv to saying 2
+equiv to split 1
+equiv to srin 1
+equiv to st 1
+equiv to tur 1
+equiv to whitespac 1
+equiv to ye 1
+equiv transit 1
+equiv transit rel 1
+equiv transl 1
+equiv transl prepar 1
+equiv using 1
+equiv using techniqu 1
+equiv wil produc 1
+equiv with prev 1
+equiv with s1 1
+equiv with s5 1
+equiv with s6 1
+er 20
+er a attribut 1
+er a aucun 1
+er a ce 2
+er a de 2
+er a inver 1
+er a la 2
+er a lim 1
+er a lint 1
+er a observer 1
+er a peu 1
+er a tout 1
+er aff 1
+er aff com 1
+er an 1
+er an ee 1
+er antagon 1
+er atomiqu 1
+er au 2
+er au ca 1
+er au champ 1
+er au comport 1
+er au dern 1
+er au sein 1
+er au tableau 1
+er au typ 1
+er aux 1
+er aux don 1
+er aux transform 1
+er avec 3
+er avec la 2
+er bibliographiqu 1
+er bl 1
+er cel 2
+er cel de 2
+er ch 1
+er ch interd 1
+er ci 1
+er ci dessus 1
+er classiqu 1
+er claus 1
+er claus dun 1
+er com 1
+er com nous 1
+er comp 1
+er comp de 1
+er con 1
+er condit 1
+er condit assur 1
+er cont 1
+er cont ik 1
+er convec 1
+er convec suiv 1
+er correspon 1
+er cr 1
+er cr eent 1
+er d ecrit 1
+er d es 1
+er d etermin 1
+er d evalu 1
+er d eviter 1
+er dalgorithm 1
+er dalgorithm doptim 1
+er dan 2
+er dan la 1
+er dan le 1
+er de 4
+er de ag 1
+er de ba4 1
+er de but 1
+er de cach 1
+er de ce 1
+er de cl 1
+er de claus 1
+er de comprendr 1
+er de cooper 1
+er de cop 1
+er de dilat 1
+er de don 1
+er de instruc 1
+er de la 3
+er de lacc 1
+er de localit 1
+er de pay 1
+er de perform 1
+er de pouvoir 1
+er de quitter 1
+er de r1 1
+er de retour 1
+er denregister 1
+er denregister correspon 1
+er dexp 1
+er dexp er 1
+er diff 1
+er diff erent 1
+er dinstruc 1
+er dinstruc neck 1
+er dmxp 1
+er dmxp triangulair 1
+er doit 1
+er doit etr 1
+er drummon 1
+er du 4
+er du au 1
+er du cr 1
+er du domain 1
+er du fait 2
+er du partit 1
+er du program 1
+er du typ 1
+er dun 2
+er dun famil 1
+er dun group 1
+er dun prem 1
+er e au 1
+er e aux 1
+er e ba 1
+er e com 1
+er e dan 1
+er e de 2
+er e desorm 1
+er e dutiliser 1
+er e est 1
+er e gr 1
+er e le 1
+er e par 3
+er e pl 1
+er e pour 1
+er e suit 1
+er ee 4
+er ee appar 1
+er ee avec 1
+er ee com 3
+er ee constitu 1
+er ee de 2
+er ee entr 1
+er ee est 2
+er ee nindu 1
+er ee ou 1
+er ee par 3
+er ee perman 1
+er ee pour 1
+er ee qu 1
+er ee sur 1
+er ef 1
+er ef eren 1
+er ef erenc 1
+er ef erencer 1
+er effectu 2
+er effectu ee 2
+er efficac 1
+er en 2
+er en ca 1
+er en distribu 1
+er en ecritur 1
+er en lu 1
+er en pr 1
+er en term 1
+er en un 1
+er en util 1
+er enfin 1
+er enfin quau 1
+er entr 2
+er entr diff 1
+er entr le 2
+er entr term 1
+er entr un 1
+er entr variabl 1
+er es 4
+er es aux 1
+er es ci 1
+er es com 2
+er es explicit 1
+er es ont 1
+er es par 3
+er es peut 1
+er es soit 1
+er es sont 1
+er essentiel 1
+er essentiel par 1
+er est 3
+er est alor 1
+er est don 1
+er est en 1
+er est evidem 1
+er est ladr 1
+er est lempl 1
+er est qu 2
+er et apport 1
+er et contribu 1
+er et dan 1
+er et dassurer 1
+er et de 2
+er et dern 1
+er et du 1
+er et dun 1
+er et dutiliser 1
+er et est 1
+er et la 1
+er et majeur 1
+er et optim 1
+er et port 1
+er et pour 1
+er et pr 1
+er et pratiqu 1
+er et princip 1
+er et qu 1
+er et quil 1
+er et sont 1
+er et un 1
+er etant 1
+er etant qu 1
+er etud 2
+er etud de 1
+er etud sur 1
+er evalu 1
+er evalu de 1
+er eventuel 1
+er eventuel de 1
+er ex 1
+er ex ecut 1
+er exp 1
+er exp er 1
+er fa 1
+er fa est 1
+er fa perm 1
+er fa pour 1
+er fa quaux 1
+er fa sur 1
+er fort 1
+er fort de 1
+er fort entr 1
+er fort est 1
+er fort ne 1
+er fort par 1
+er fort pour 1
+er fort sur 1
+er fourn 1
+er fourn dan 1
+er g en 2
+er g er 1
+er glob 1
+er gour 1
+er if var 1
+er illicit 1
+er illicit dec 1
+er impl 1
+er import 1
+er import est 1
+er in egalit 1
+er init 1
+er init xc 1
+er instruc 1
+er instruc de 1
+er instruc est 1
+er la 2
+er la pr 1
+er la secon 1
+er le 3
+er le ca 1
+er le domain 1
+er le gestionnair 1
+er le nombr 1
+er le programmeur 1
+er le propr 1
+er le valeur 1
+er lign 1
+er lign de 1
+er lin 1
+er lin ear 1
+er loc 1
+er lor 1
+er lor de 1
+er lor dun 1
+er mac 1
+er maint 1
+er maint au 1
+er men 1
+er men ee 1
+er model 1
+er model repr 1
+er model thus 1
+er modif 1
+er modif ee 1
+er modif la 1
+er montr 1
+er montr qu 1
+er na 1
+er ne 1
+er ne soient 1
+er ne sont 1
+er nest 1
+er nest pa 1
+er ni 1
+er ni de 1
+er non 1
+er non singl 1
+er nous 2
+er nous avon 1
+er nous pouvon 1
+er nous utiliseron 1
+er occur 1
+er occur de 1
+er oguid 1
+er oguid ea 1
+er om 1
+er om chailloux 1
+er ont 2
+er ont la 1
+er ou 1
+er ou par 1
+er pa 1
+er pa ee 1
+er par 2
+er par exempl 1
+er par la 1
+er par linstruc 1
+er particl 1
+er particl er 1
+er peut 1
+er peut etr 1
+er ph 1
+er ph enotypiqu 1
+er plafon 1
+er plafon ou 1
+er planch 1
+er planch ou 1
+er plus complec 1
+er plus faibl 1
+er plut 1
+er plut ot 1
+er po 1
+er po edent 1
+er point 1
+er point sur 1
+er post 1
+er post ee 1
+er pour 2
+er pour de 1
+er pour la 1
+er pour le 1
+er pr 1
+er pr ec 1
+er prison 1
+er prison er 1
+er prometteus 1
+er qu 3
+er qu appar 1
+er qu compt 1
+er qu dun 1
+er qu laccompagn 1
+er qu le 1
+er qu lon 1
+er qu nous 1
+er quand 1
+er quand la 1
+er quil 1
+er quil cont 1
+er r du 1
+er r prov 1
+er r0 1
+er r0 ex 1
+er ralent 1
+er ralent par 1
+er reduc 1
+er ref 1
+er relat 1
+er relat ee 1
+er remerc 1
+er ren 1
+er ren imp 1
+er repr 1
+er repr esent 1
+er respectiv 1
+er respectiv la 1
+er retenu 1
+er rl 1
+er s er 1
+er schauser 1
+er seffectu 1
+er seffectu par 1
+er sexpliqu 1
+er sexpliqu par 1
+er si 1
+er si el 1
+er simpl 1
+er simpl tel 1
+er soient 1
+er soient introduit 1
+er soit 1
+er soit signif 1
+er sont 2
+er sont caract 1
+er sont le 1
+er sont prison 1
+er sont toutef 1
+er souv 1
+er standard 1
+er sub 1
+er sub au 1
+er sur 2
+er sur ce 1
+er sur de 1
+er sur koan 1
+er sur la 1
+er sur tr 1
+er tel 1
+er tel qu 1
+er th 1
+er th eoriqu 1
+er ther ec 1
+er tout 2
+er tout en 2
+er un 1
+er un coeff 1
+er un don 1
+er un el 1
+er util 2
+er util de 1
+er util es 1
+er variabl 1
+er ver 2
+er ver de 1
+er94 1
+erabl 2
+erabl dan 1
+erabl dan la 1
+erabl la 2
+erabl la complexit 1
+erabl la converg 1
+erabl la tail 1
+erabl sur 1
+erabl sur le 1
+eral 4
+eral a employer 1
+eral a la 1
+eral a transformer 1
+eral appl 1
+eral appl perm 1
+eral appl qu 1
+eral au 3
+eral au bout 1
+eral au ca 1
+eral au traver 1
+eral aucun 1
+eral aucun de 1
+eral beaucoup 1
+eral cach 1
+eral cach cod 1
+eral conduit 1
+eral consid 1
+eral consid erer 1
+eral d efin 1
+eral d etect 1
+eral de 2
+eral de born 1
+eral de ce 2
+eral de domain 1
+eral de la 1
+eral de loptim 1
+eral de procrast8 1
+eral de transform 1
+eral du 1
+eral du au 1
+eral dun 1
+eral dun distribut 1
+eral dun environ 1
+eral dun partit 1
+eral dunif 1
+eral dunif est 1
+eral est 2
+eral est alor 1
+eral est don 1
+eral est peu 1
+eral est uniqu 1
+eral et dobtenir 1
+eral exp 1
+eral exp erim 1
+eral fa 1
+eral fic 2
+eral fic ee 1
+eral fic es 1
+eral le 2
+eral le meilleur 1
+eral leur 1
+eral leur sembl 1
+eral moin 1
+eral moin fr 1
+eral n ecessiterait 1
+eral n efast 1
+eral non 1
+eral non unimodulair 1
+eral on ne 1
+eral on sup 1
+eral pa 1
+eral pa au 1
+eral pa convec 1
+eral pa trop 1
+eral par 2
+eral par linstruc 1
+eral par lutil 1
+eral plusieur 1
+eral plusieur extr 1
+eral pour 1
+eral pour le 1
+eral pour qu 1
+eral qu 2
+eral qu nous 1
+eral quatr 1
+eral quatr typ 1
+eral quun 1
+eral quun pe 1
+eral retenu 1
+eral retenu dan 1
+eral se 1
+eral similair 1
+eral similair avec 1
+eral son 1
+eral son champ 1
+eral suiv 1
+eral sup 1
+eral sup erieur 1
+eral suppl 1
+eral suppl ementair 1
+eral sur 1
+eral sur la 1
+eral sur le 1
+eral tr 2
+eral tr es 2
+eral un peu 1
+eral unif 1
+eral unif deux 1
+eraliser 2
+eraliser ce 1
+eraliser ce cadr 1
+eraliser le 1
+eraliser le techniqu 1
+eraliser lempl 1
+eraliser lempl de 1
+eraliser loptim 1
+eraliser loptim dappel 1
+eram 1
+eram datab 1
+eram datab pack 1
+eram help 1
+eram prov 1
+eram to accommod 1
+eranc 2
+eranc math 2
+eranc math ematiqu 2
+erand 1
+erand qu 1
+erand qu se 1
+erant 3
+erant ce 2
+erant ce erreur 1
+erant ce processus 1
+erant com 1
+erant com indiv 1
+erant en 1
+erant en par 1
+erant fail 1
+erant fail shallow 1
+erant le 2
+erant le cod 1
+erant le difficult 1
+erant lorsqu 1
+erant lorsqu de 1
+erant ne 1
+erant ne pa 1
+erant point 1
+erant point de 1
+erant quun 1
+erant quun pag 1
+erant sur 1
+erant sur un 1
+erarch 1
+erarch m emoir 1
+erarchiqu 1
+erasmus 1
+erasmus univer rotterdam 1
+erat 5
+erat a la 2
+erat a lint 1
+erat a project 1
+erat acc 1
+erat acc edant 1
+erat act 1
+erat act la 1
+erat act provoqu 1
+erat activ 1
+erat activ au 1
+erat activ ee 1
+erat activ son 1
+erat ait 1
+erat ait de 1
+erat anticip 1
+erat anticip ee 1
+erat appart 1
+erat arithm 1
+erat arithm etiqu 1
+erat assoc 1
+erat assoc ee 1
+erat au 1
+erat au niveau 1
+erat automatiqu 1
+erat automatiqu de 1
+erat av 1
+erat av de 1
+erat avec 1
+erat avec un 1
+erat backtrack 1
+erat certain 1
+erat certain propr 1
+erat com 1
+erat com akl 1
+erat con 1
+erat con ecutiv 1
+erat conduir 1
+erat conduir fat 1
+erat cont 1
+erat convec 1
+erat correspon 1
+erat correspon au 1
+erat cour 2
+erat cour qu 1
+erat cr 1
+erat cr ee 1
+erat d ecritur 1
+erat d epen 1
+erat dan 1
+erat dan le 1
+erat de 4
+erat de ag 1
+erat de ba 1
+erat de boucl 1
+erat de ca 1
+erat de cel 1
+erat de chaqu 1
+erat de cod 3
+erat de coupur 1
+erat de cr 1
+erat de deux 1
+erat de diff 1
+erat de environ 1
+erat de filtr 1
+erat de la 2
+erat de lag 1
+erat de lectur 1
+erat de lensembl 1
+erat de lenviron 1
+erat de lespac 1
+erat de liaison 1
+erat de linform 1
+erat de mut 1
+erat de pan 1
+erat de point 1
+erat de processus 1
+erat de reproduc 1
+erat de tail 1
+erat de tel 1
+erat de valeur 1
+erat dempil 1
+erat den. 1
+erat denviron 1
+erat derreur 1
+erat dimpl 1
+erat dimpl em 1
+erat dind 1
+erat dind congru 1
+erat dindividus 1
+erat distinct 1
+erat distinct de 1
+erat doit 1
+erat doit etr 1
+erat don 1
+erat dont le 1
+erat du 2
+erat du nid 1
+erat du point 1
+erat du prem 1
+erat du syst 1
+erat dun 3
+erat dun boucl 1
+erat dun environ 1
+erat dun nid 1
+erat dun nouvel 1
+erat dun point 1
+erat dun test 1
+erat effectu 2
+erat effectu ee 2
+erat el 2
+erat el ementair 2
+erat en 1
+erat en pav 1
+erat en treil 1
+erat en virgl 1
+erat entr 1
+erat entr le 1
+erat entr plusieur 1
+erat est 3
+erat est ai 1
+erat est constitu 1
+erat est fait 1
+erat est quantif 1
+erat et ain 1
+erat et au 1
+erat et dappel 1
+erat et de 1
+erat et leur 1
+erat etant 1
+erat etant lintersect 1
+erat exhaust 1
+erat exhaust sont 1
+erat extern 1
+erat extern le 1
+erat fondam 1
+erat fondam qu 1
+erat i acc 1
+erat i pour 1
+erat i0 1
+erat i1 1
+erat identiqu 1
+erat im 1
+erat im ed 1
+erat init 1
+erat init soit 1
+erat init sur 1
+erat instantan 1
+erat instantan ee 1
+erat inutil 1
+erat inutil qu 1
+erat j est 1
+erat j lorsqu 1
+erat justif 1
+erat justif es 1
+erat m emoir 1
+erat mac6 1
+erat mac6 ou 1
+erat math 1
+erat math ematiqu 1
+erat maxim 1
+erat maxim fic 1
+erat ne 1
+erat ne part 1
+erat ne perm 1
+erat ne sont 1
+erat nest 2
+erat nest assuj 1
+erat nest pa 1
+erat ou 1
+erat ou ce 1
+erat ov 1
+erat ov ne 1
+erat par 3
+erat par cop 1
+erat par echang 1
+erat par exempl 1
+erat par la 1
+erat par lintroduc 1
+erat par marqu 1
+erat par optim 1
+erat par plusieur 1
+erat par util 1
+erat perm 1
+erat peut 1
+erat peut etr 1
+erat plus fin 1
+erat pour 1
+erat pour ce 1
+erat qu 4
+erat qu demand 1
+erat qu entr 1
+erat qu est 1
+erat qu ne 1
+erat qu peuv 1
+erat qu sont 2
+erat quil 1
+erat quil faut 1
+erat r ef 1
+erat rel 1
+erat rel aux 1
+erat rest 1
+erat rest pratiqu 1
+erat s ecriv 1
+erat se 1
+erat se font 1
+erat ser 1
+erat ser toujour 1
+erat sest 1
+erat sest ecoul 1
+erat sobt 1
+erat sont 2
+erat sont effectu 1
+erat sophistiqu 1
+erat sophistiqu ee 1
+erat sp 1
+erat sp ec 1
+erat successiv 1
+erat successiv ont 1
+erat successiv partag 1
+erat suiv 1
+erat suiv est 1
+erat suiv par 1
+erat sur 1
+erat sur le 1
+erat transform 1
+erat vid 1
+erat vid car 1
+erat vid dan 1
+erat vid en 1
+erat vid pa 1
+erateur 4
+erateur ae 1
+erateur ae air 1
+erateur al 1
+erateur al eatoir 1
+erateur classiqu 1
+erateur classiqu de 1
+erateur cr 1
+erateur de 4
+erateur de ba 1
+erateur de boucl 1
+erateur de calcl 1
+erateur de ch 1
+erateur de coupur 1
+erateur de cr 1
+erateur de la 1
+erateur de lagc 1
+erateur de lesp 1
+erateur de mut 1
+erateur de reproduc 1
+erateur de valeur 1
+erateur dit 1
+erateur dit de 1
+erateur du 1
+erateur du nid 1
+erateur dual 1
+erateur et extrait 1
+erateur fondamentaux 1
+erateur fondamentaux de 1
+erateur fourn 1
+erateur fourn toujour 1
+erateur g en 1
+erateur i la 1
+erateur inf 1
+erateur mac 1
+erateur mac par 1
+erateur o1 1
+erateur ont 1
+erateur par 1
+erateur par marqu 1
+erateur peuv 1
+erateur peuv constituer 1
+erateur pour 1
+erateur pour assurer 1
+erateur qu 1
+erateur qu nous 1
+erateur se 1
+erateur se trouv 1
+erateur sinspir 1
+erateur sinspir direct 1
+erateur sont 2
+erateur sont automatiqu 1
+erateur sont inspir 1
+erateur standard 1
+erateur sur 1
+erateur sur lespac 1
+erateur tout 1
+erateur tout en 1
+eratif 2
+eratif de 1
+eratif de recherch 1
+erationnel 4
+erationnel au 1
+erationnel au niveau 1
+erationnel de 1
+erationnel de lalgorithm 1
+erationnel de modif 1
+erationnel de prolog 1
+erationnel du 1
+erationnel du lang 1
+erationnel dun 1
+erationnel dun ext 1
+erationnel fa 1
+erationnel fa appel 1
+erationnel par 1
+erationnel par cop 1
+erationnel par marqu 1
+erationnel qu 1
+erationnel qu lop 1
+erationnel si 1
+erationnel si au 1
+eratoir 1
+eratoir qu 1
+eratoir qu est 1
+eratr 1
+eratr de 1
+eratr de nouvel 1
+eraux 2
+eraux de 1
+eraux de fonct 1
+eraux qu 1
+eraux qu touch 1
+erem 1
+erem de 1
+erem de larchitectur 1
+erem li 1
+erem li ee 1
+eren 2
+eren cant ce 1
+eren cant de 1
+eren cant un 1
+erenc 3
+erenc ce 1
+erenc ce el 1
+erenc correspon 1
+erenc dan 2
+erenc dan le 2
+erenc de 1
+erenc de man 1
+erenc doit 1
+erenc doit retourner 1
+erenc doiv 1
+erenc doiv prendr 1
+erenc dun 1
+erenc dun var 1
+erenc e dan 1
+erenc e est 1
+erenc e par 2
+erenc ee 3
+erenc ee dan 3
+erenc ee de 1
+erenc ee du 1
+erenc ee en 1
+erenc ee par 2
+erenc ee peut 1
+erenc ee pour 1
+erenc ee uniqu 1
+erenc es 1
+erenc es par 1
+erenc est 1
+erenc est pr 1
+erenc est stock 1
+erenc et la 1
+erenc le 1
+erenc le el 1
+erenc lor 1
+erenc lor de 1
+erenc ne 1
+erenc ne peut 1
+erenc ne retourn 1
+erenc pour 1
+erenc pour mettr 1
+erenc pu 1
+erenc pu etr 1
+erenc qu 1
+erenc qu sont 1
+erenc retourn 1
+erenc retourn direct 1
+erenc retourn un 1
+erenc un 1
+erencer 1
+erencer un 1
+erencer un var 1
+erent 5
+erent a ce 1
+erent a la 1
+erent a lutil 1
+erent acc 1
+erent acc edant 1
+erent acc es 1
+erent appart 1
+erent architectur 1
+erent architectur perm 1
+erent aus 1
+erent aus dan 1
+erent aux 1
+erent aux ag 1
+erent aux algorithm 1
+erent banc 1
+erent banc de 1
+erent banc rel 1
+erent bloc 1
+erent bloc doiv 1
+erent boucl 1
+erent ca 2
+erent ca qu 1
+erent ca sont 1
+erent cach 1
+erent cach etant 1
+erent calcl 1
+erent calcl sont 1
+erent cl 1
+erent cl de 1
+erent cod 1
+erent cod possibl 1
+erent combinaison 1
+erent combinaison dordonnanc 1
+erent configur 1
+erent conflit 1
+erent conflit du 1
+erent d efinit 1
+erent dan 3
+erent dan la 1
+erent dan le 2
+erent de 2
+erent de disjonct 1
+erent de leur 1
+erent de matr 1
+erent de variabl 1
+erent deux 1
+erent du 2
+erent du ca 1
+erent du gestionnair 1
+erent du point 1
+erent dun 3
+erent dun echec 1
+erent el 1
+erent el ement 1
+erent en 2
+erent en cel 1
+erent en ping 1
+erent et dautr 1
+erent et de 1
+erent etap 1
+erent etap de 1
+erent evalu 1
+erent fa 1
+erent fa con 1
+erent fonct 1
+erent fonct de 1
+erent fondam 1
+erent fondam de 1
+erent g en 1
+erent in egalit 1
+erent it erat 1
+erent la 2
+erent la gest 1
+erent la tr 1
+erent le 1
+erent le cod 1
+erent le contr 1
+erent le program 1
+erent le term 1
+erent lor 1
+erent lor de 1
+erent m emoir 1
+erent m ethod 2
+erent mod 2
+erent mod de 1
+erent mod el 1
+erent ne 1
+erent ne pa 1
+erent nid 1
+erent nid constitu 1
+erent nid de 1
+erent nid est 1
+erent nid peuv 1
+erent niveaux 1
+erent noeud 2
+erent noeud sont 1
+erent nous 1
+erent nous avon 1
+erent op 1
+erent op erateur 1
+erent optim 1
+erent optim locaux 1
+erent pa 1
+erent pag 1
+erent pag conflictuel 1
+erent par 1
+erent param 2
+erent param etr 2
+erent peuv 1
+erent peuv etr 1
+erent popl 1
+erent popl successiv 1
+erent primitiv 1
+erent processeur 1
+erent processeur dan 1
+erent processeur etant 1
+erent processus 1
+erent processus peuv 1
+erent program 1
+erent protocol 1
+erent protocol ont 1
+erent qu 1
+erent qu dan 1
+erent qu par 1
+erent quand 1
+erent quand il 1
+erent r eal 1
+erent r esolut 1
+erent repr 1
+erent repr es 1
+erent s equ 1
+erent san qu 1
+erent sch 1
+erent sch em 1
+erent sect 1
+erent sect du 1
+erent selon 1
+erent selon le 1
+erent siml 1
+erent sont 1
+erent sont allou 1
+erent suiv 1
+erent suiv le 1
+erent suiv lind 1
+erent sur 1
+erent sur de 1
+erent symbol 1
+erent symbol est 1
+erent tail 1
+erent tail danneaux 1
+erent techniqu 2
+erent techniqu de 1
+erent techniqu evoqu 1
+erent techniqu pr 2
+erent techniqu vi 1
+erent tel 1
+erent tel qu 1
+erent treil 1
+erent treil peuv 1
+erent typ 2
+erent typ dacc 1
+erent typ de 2
+erent un 2
+erent un acc 1
+erent un cel 1
+erent un recherch 1
+erent unit 1
+erent unit es 1
+erent valeur 3
+erent valeur de 2
+erent valeur du 1
+erent valeur num 1
+erent ver 1
+erent ver dan 1
+erent ver de 1
+erent vi 1
+erentiabilit 1
+erentiabilit e de 1
+erentiel 1
+erentiel ei 1
+erentiel est 1
+erentiel est daut 1
+erentiel est un 1
+erentiel la 1
+erentiel la siml 1
+erentiel lechantillon 1
+erentiel lechantillon pr 1
+erentiel ou 1
+erentiel ou import 1
+erentiel perm 1
+erentiel pr 1
+erentiel pr esent 1
+erentiel selon 1
+erentiel selon le 1
+erequ 1
+erequ a un 1
+erer 4
+erer a la 1
+erer appr 1
+erer appr ec 1
+erer ce 1
+erer ce drapeau 1
+erer consommer 1
+erer consommer moin 1
+erer dan 2
+erer dan chaqu 1
+erer dan le 1
+erer de 3
+erer de capacit 1
+erer de conflit 1
+erer de environ 1
+erer de gard 1
+erer de la 1
+erer de point 1
+erer deux 3
+erer deux dur 1
+erer deux nouveaux 1
+erer du 1
+erer du cod 1
+erer efficac 2
+erer efficac dan 1
+erer efficac le 1
+erer en 2
+erer est 2
+erer est dobtenir 1
+erer inutil 1
+erer la 2
+erer la coupur 1
+erer la gard 1
+erer la man 1
+erer la possibilit 1
+erer lattribut 1
+erer lattribut de 1
+erer le 3
+erer le acc 1
+erer le cel 1
+erer le contr 1
+erer le eff 1
+erer le environ 1
+erer le multipl 1
+erer le nouveaux 1
+erer le point 1
+erer le programmeur 1
+erer le raison 1
+erer le retour 1
+erer le test 1
+erer lensembl 1
+erer lensembl du 1
+erer lenviron 1
+erer lenviron init 1
+erer lespac 1
+erer lespac allou 1
+erer leur 1
+erer leur fr 1
+erer leur pu 1
+erer n ecessair 1
+erer no 1
+erer no ag 1
+erer plusieur 1
+erer qu 1
+erer qu le 1
+erer tous 1
+erer tous le 1
+erer tr 1
+erer tr es 1
+erer trop 2
+erer trop co 1
+erer trop elev 1
+erer trop longu 1
+erer un 3
+erer un anneau 1
+erer un autr 1
+erer un co 1
+erer un deux 1
+erer un lim 1
+erer un nouveau 1
+erer un point 1
+erer un recherch 1
+erer util 1
+erer util en 1
+ererait 1
+ererait trop 1
+ererait trop co 1
+ereron 1
+ereron pour 1
+ereron pour chaqu 1
+eresc 1
+eresc en 1
+eresc en ping 1
+eresser 2
+eresser a cel 1
+eresser a lexploit 1
+eresser aux 1
+eresser aux transform 1
+eresser de 1
+eresser de man 1
+eresser maint 1
+eresser maint au 1
+eresser qu 1
+eresseron 1
+eresseron donc 1
+eresseron donc au 1
+eresseron ic 1
+eresseron ic quaux 1
+eresseron pa 1
+eresseron pa aux 1
+eresson 1
+eresson au 1
+eresson au partit 1
+eresson dan 1
+eresson dan ce 1
+eresson nous 1
+eresson nous aux 1
+eresson nous maint 1
+eresson pa 1
+erew 2
+erew pram 2
+erez 1
+erg 1
+erg interact 1
+erg interact theorem 1
+erg theor 1
+erg theor popl 1
+erg theor structur 1
+erg theorem 1
+erg theorem prover 1
+ergodiqu 1
+ergonom 2
+ergonom methodolog 1
+erhel 1
+eriau 1
+eriau a haut 1
+ericsson 1
+ericsson and simon 1
+eriel 3
+eriel aurait 1
+eriel dan 1
+eriel dan le 1
+eriel don 1
+eriel don lieu 1
+eriel et notam 1
+eriel evit 1
+eriel evit ce 1
+eriel pourrait 1
+eriel pourrait sav 1
+eriel qu 1
+eriel qu logiciel 1
+erieur 6
+erieur a ce 1
+erieur a cel 3
+erieur a deux 1
+erieur a l1 1
+erieur a la 2
+erieur a lempil 1
+erieur a n1 1
+erieur a sa 1
+erieur a tr 1
+erieur alor 1
+erieur alor qu 1
+erieur apr 1
+erieur apr es 1
+erieur au 2
+erieur au co 1
+erieur au nombr 1
+erieur au point 1
+erieur au temp 1
+erieur com 1
+erieur com lhom 1
+erieur conclu 1
+erieur conclu quil 1
+erieur correspon 1
+erieur correspon au 1
+erieur de 4
+erieur de boucl 1
+erieur de chaqu 2
+erieur de contour 1
+erieur de lespac 1
+erieur de liaison 1
+erieur de lyon 1
+erieur de min 1
+erieur don 1
+erieur don ee 1
+erieur don le 1
+erieur dordr 1
+erieur dordr m2 1
+erieur dordr m3 1
+erieur du 1
+erieur du nombr 1
+erieur du pol 1
+erieur dun 1
+erieur dun bloc 1
+erieur dun nid 1
+erieur dun patron 1
+erieur dun pav 1
+erieur en 2
+erieur en ca 1
+erieur en informatiqu 2
+erieur en lab 1
+erieur et sup 1
+erieur facil 1
+erieur facil la 1
+erieur la 1
+erieur la valeur 1
+erieur m em 1
+erieur ne 1
+erieur nous 1
+erieur nous ser 1
+erieur ou 2
+erieur ou egal 2
+erieur par 1
+erieur par exempl 1
+erieur peut 1
+erieur peut encor 1
+erieur peuv 1
+erieur peuv etr 1
+erieur pour 1
+erieur pour chacun 1
+erieur pr 1
+erieur pr ed 1
+erieur pren 1
+erieur pren respectiv 1
+erieur san pour 1
+erieur sur 1
+erieur sur limport 1
+erieus 2
+erieus de 2
+erieus de la 1
+erieus de par 1
+erieux 1
+erif 4
+erif a la 1
+erif a lec 1
+erif alor 1
+erif ce 1
+erif ce hypoth 1
+erif de 2
+erif de ce 1
+erif de typ 1
+erif ee 3
+erif ee au 1
+erif ee con 1
+erif ee dan 1
+erif ee ou 1
+erif ee sur 1
+erif egal 1
+erif egal le 1
+erif eventuel 1
+erif eventuel de 1
+erif i2 1
+erif i2 i3 1
+erif ikj 1
+erif l equ 1
+erif lasser 1
+erif lasser de 1
+erif le 1
+erif le crit 1
+erif le hypoth 1
+erif pa 1
+erif pa lasser 1
+erif pa un 1
+erif qu 1
+erif qu loccur 1
+erif quil 1
+erif quil sagit 1
+erif quun 1
+erif quun term 1
+erif si 1
+erif suppl 1
+erif suppl ementair 1
+erig 1
+erig ee 1
+erig ee en 1
+erik 3
+erik hagerst 2
+erik pol 1
+eriksson 1
+erim 4
+erim a partir 1
+erim de 3
+erim de migr 1
+erim de no 1
+erim de princip 1
+erim dev 1
+erim dev tr 1
+erim e ce 1
+erim e tr 1
+erim ee 1
+erim ee pour 1
+erim effectu 1
+erim effectu ee 1
+erim es 1
+erim es regroup 1
+erim et sa 1
+erim obtenu 1
+erim obtenu sur 1
+erim sur 2
+erim sur la 1
+erim sur leff 1
+erimentaux 2
+erimentaux et de 1
+erimentaux exhib 1
+erimentaux exhib de 1
+eriod 2
+eriod commun 1
+eriodiqu 1
+eriodiqu de 1
+eriodiqu de don 1
+eriodiqu est 1
+eriodiqu est dit 1
+eriodiqu si 1
+eriorer 1
+eriorer au 1
+eriorer au del 1
+eriorit 1
+eriorit e de 1
+eriqu 5
+eriqu a acc 1
+eriqu attest 1
+eriqu attest de 1
+eriqu avec 1
+eriqu avec acc 1
+eriqu couram 1
+eriqu couram empl 1
+eriqu de 3
+eriqu de ce 1
+eriqu de journ 1
+eriqu de neumerkel 1
+eriqu de pr 1
+eriqu dunif 1
+eriqu dunif ext 1
+eriqu effectu 1
+eriqu effectu es 1
+eriqu en 1
+eriqu en lign 1
+eriqu md 1
+eriqu san contraint 1
+eriqu sont 1
+eriqu sont caract 1
+eriqu standard 1
+eriqu standard cof 1
+eriqu un 1
+eriqu un identif 1
+eriqu util 1
+eriqu util ee 1
+erir 3
+erir ce 1
+erir ce con 1
+erir jusqu 1
+erir la 1
+erir la probabilit 1
+eriser 2
+eriser la 1
+eriser la localit 1
+eriser le 2
+eriser le faibl 1
+eriser le pag 1
+eristiqu 4
+eristiqu couram 1
+eristiqu couram util 1
+eristiqu d ecrit 1
+eristiqu de 4
+eristiqu de ba 1
+eristiqu de ce 1
+eristiqu de la 2
+eristiqu de larchitectur 1
+eristiqu de limpl 1
+eristiqu de notr 1
+eristiqu du 1
+eristiqu du sch 1
+eristiqu du syst 1
+eristiqu dun 1
+eristiqu fondam 1
+eristiqu fondam de 1
+eristiqu g en 1
+eristiqu majeur 1
+eristiqu majeur fait 1
+eristiqu pr 1
+eristiqu pr ec 1
+eristiqu sont 2
+eristiqu sont illustr 1
+eristiqu sont regroup 1
+eristiqu x solut 1
+erit 1
+erit impl 1
+erit impl em 1
+erit la 1
+erit la cr 1
+erit pil 1
+erit respectif 1
+erit sourc 1
+erit sourc de 1
+erit transform 1
+erit transform de 1
+eritabl 2
+eritabl d epen 1
+eritabl le 1
+eritabl le meilleur 1
+eriv 2
+eriv a echou 1
+eriv a la 1
+eriv cour 1
+eriv de 1
+eriv de cal 1
+eriv e du 1
+eriv ee 2
+eriv ee de 1
+eriv ee en 1
+eriv es 2
+eriv es appel 1
+eriv es powel 1
+eriv infin 1
+eriv sld 1
+eriv sld fin 1
+erivon 1
+erivon un 1
+erivon un impl 1
+erk 1
+erl 2
+erl m86 2
+erlang 2
+erlang and universit 1
+erlang n urnberg 1
+erlang.de 1
+erlbaum 4
+erlbaum assoc 3
+ernest 1
+ernest hemingw 1
+ernest hemingw styl 1
+ernst 1
+ernst buchberger 1
+eron 4
+eron appeler 1
+eron appeler pil 1
+eron ci 1
+eron ci de 1
+eron deux 1
+eron deux chromosom 1
+eron deux direct 1
+eron deux graph 1
+eron ic 1
+eron ic la 1
+eron la 2
+eron la boucl 1
+eron la claus 1
+eron la deux 1
+eron la mi 1
+eron lappel 1
+eron le 2
+eron le ca 1
+eron le cod 1
+eron le deux 1
+eron le program 1
+eron le squel 1
+eron le syst 1
+eron lexempl 2
+eron lexempl de 1
+eron lexempl simpl 1
+eron lexempl suiv 1
+eron maint 1
+eron maint le 1
+eron par 1
+eron par exempl 1
+eron pour 1
+eron pour espac 1
+eron qu 1
+eron qu ce 1
+eron quel 1
+eron quel pu 1
+eron un 1
+eron un ag 1
+eron un algorithm 1
+eron un ch 1
+eron un pr 1
+eronautiqu 1
+eroul 2
+eroul alor 1
+eroul alor com 1
+eroul com 1
+eroul com suit 1
+eroul de 1
+eroul de fa 1
+errad 1
+erreur 2
+erreur de 2
+erreur de mesur 1
+erreur de typ 1
+erreur dinstanc 1
+erreur dinstanc com 1
+erreur dinstanc est 1
+erreur doit 1
+erreur doit etr 1
+erreur et de 1
+erringt 1
+errn.h 1
+errn.h inclus 1
+errn.h inclus sy 1
+erron 11
+erron assum 2
+erron been del 1
+erron claim 1
+erron classif 1
+erron hypoth 1
+erron infer 1
+erron interpr 1
+erron match 1
+erron parameter 1
+erron rang 1
+erron rang dat 1
+erron result 1
+erron situ 1
+erron specl 1
+error 43
+error accuml 1
+error algorithm 1
+error an 2
+error and alloc 1
+error and condit 1
+error and inaccur 1
+error ar 1
+error ar detect 1
+error at tim 1
+error back 1
+error being found 1
+error bit 1
+error bound 2
+error bound defin 1
+error caus 1
+error check 1
+error check involut 1
+error check tim 1
+error compar 1
+error con 1
+error condit 2
+error condit per 1
+error correct 2
+error correct cod 1
+error correct inform 1
+error cost 2
+error cost funct 2
+error cp 1
+error decr 1
+error defin 1
+error definit 1
+error detect 1
+error detect cap 1
+error du 1
+error effect 1
+error estim 3
+error estim hold 1
+error estim techniqu 1
+error evalu 1
+error evalu elit 1
+error evalu error 1
+error evalu mean 1
+error extrem 1
+error for defin 1
+error for larger 1
+error for particl 1
+error funct 3
+error funct sign 1
+error handl 2
+error handl allow 1
+error handl cod 1
+error if objn 1
+error iff 1
+error in figur 1
+error in find 1
+error in progr 1
+error in specl 1
+error introduc 1
+error is deliver 1
+error is discover 1
+error is found 1
+error is sign 1
+error is unaccept 1
+error lim 1
+error margin 1
+error me 4
+error me pl 1
+error me typ 1
+error measur 1
+error meter 1
+error minim 1
+error occur 3
+error of constraint 1
+error of syntact 1
+error on perform 1
+error or lo 1
+error parallel 1
+error parallel sa 1
+error parallel siml 1
+error perc 1
+error perc incr 1
+error pr 3
+error propag 1
+error queu 1
+error rat 1
+error rat show 1
+error remain 2
+error report 2
+error sign 2
+error sign subsequ 1
+error specif 1
+error specl 1
+error string 1
+error system 1
+error then ph 1
+error thread 1
+error thread condit 1
+error threshold 1
+error through incon 1
+error to attempt 1
+error to cal 1
+error to modif 1
+error to read 1
+error to specif 1
+error to us 1
+error toler 1
+error valu 3
+error var 2
+error vect 1
+error vect dw 1
+error vs 1
+error wer accuml 1
+error when chang 1
+eru 1
+ervan 1
+ervan darnel 1
+erx 1
+es 68
+es a a1 1
+es a assurer 1
+es a band 1
+es a ca 1
+es a ce 2
+es a chut 1
+es a de 2
+es a deux 1
+es a direct 1
+es a donner 1
+es a essayer 1
+es a etr 1
+es a fair 1
+es a la 3
+es a larchitectur 1
+es a lautr 1
+es a lav 2
+es a lec 2
+es a lecrc 1
+es a lenviron 1
+es a lutil 1
+es a modif 1
+es a no 1
+es a partir 1
+es a plusieur 1
+es a risc 1
+es a traiter 1
+es a transact 1
+es a un 2
+es a valider 1
+es accessibl 1
+es accessibl quau 1
+es act 1
+es act du 1
+es actif 1
+es actif depu 1
+es actuel 1
+es actuel de 1
+es aff 2
+es aff de 1
+es aff dun 1
+es aff le 1
+es align 1
+es align ee 1
+es alor 1
+es alor le 1
+es am elior 1
+es an 1
+es an augm 1
+es an cap 1
+es analogu 1
+es and acc 1
+es appart 1
+es appel 2
+es appel cal 1
+es appel du 1
+es appel ee 1
+es appel en 1
+es appel se 1
+es appliqu 1
+es appliqu ee 1
+es apr 1
+es apr es 1
+es architectur 2
+es architectur multiprocesseur 1
+es arithm 1
+es arithm etiqu 1
+es ask 1
+es aspect 1
+es assez 1
+es assez bien 1
+es assez fort 1
+es assoc 2
+es assoc ee 1
+es assoc typ 1
+es assur 1
+es attribut 1
+es au 3
+es au ca 1
+es au champ 1
+es au cod 1
+es au cour 1
+es au gestionnair 1
+es au lieu 1
+es au niveau 1
+es au paragraph 1
+es au point 1
+es au propr 1
+es au sein 1
+es au som 1
+es au tr 1
+es aur 1
+es auront 1
+es auront lieu 1
+es aus 2
+es aus bien 1
+es aus volumineus 1
+es autour 1
+es autour de 1
+es aux 5
+es aux altern 1
+es aux attribut 1
+es aux don 2
+es aux etat 1
+es aux matr 1
+es aux pag 1
+es aux point 1
+es aux register 1
+es aux similarit 1
+es aux tableaux 1
+es aux term 1
+es aux variabl 1
+es avait 1
+es avait du 1
+es avant 1
+es avant le 1
+es avec 4
+es avec dautr 1
+es avec de 1
+es avec lav 1
+es avec lopt 1
+es avec sa 1
+es avec succ 1
+es avec un 1
+es avec unif 1
+es avoir 3
+es avoir pour 1
+es avoir rappel 1
+es avoir restaur 1
+es avoir trait 1
+es avoir val 1
+es ayant 1
+es ayant pour 1
+es beaucoup 1
+es behaviour 1
+es bien 2
+es bien correspondr 1
+es bien le 1
+es bien su 1
+es binair 1
+es binair de 1
+es bloc 1
+es bloc la 1
+es boil 1
+es by ad 1
+es ca.txt 1
+es calcl 1
+es calcl le 1
+es car 1
+es car lo 1
+es ce 1
+es ce quon 1
+es ce sch 1
+es ce top 1
+es ch 2
+es chap 1
+es charg 1
+es chromosomiqu 1
+es ci 2
+es ci de 1
+es ci dessus 2
+es cl 1
+es cl es 1
+es classiqu 3
+es classiqu de 1
+es classiqu ont 1
+es classiqu suiv 1
+es com 4
+es com distribu 1
+es com el 1
+es com globalisabl 1
+es com indiqu 1
+es com le 1
+es com pr 1
+es com racin 1
+es compl 1
+es complec 1
+es con 2
+es con dordinateur 1
+es con ee 1
+es conc 1
+es conform 1
+es conform ement 1
+es consacr 1
+es consacr es 1
+es const 1
+es constraint 1
+es cont 1
+es cont alor 1
+es cont de 1
+es contraign 1
+es contraign sur 1
+es converg 1
+es correspon 4
+es correspon arg 1
+es correspon aux 1
+es coupur 1
+es coupur de 1
+es cr 2
+es cr eat 1
+es cr simpl 1
+es cycliqu 1
+es d echec 1
+es d efin 2
+es d efinit 1
+es d elim 1
+es d er 1
+es d etermin 1
+es d1 1
+es dacc 1
+es dacc es 1
+es dam 1
+es dam elior 1
+es dan 5
+es dan ce 3
+es dan de 2
+es dan la 3
+es dan le 4
+es dan lenviron 1
+es dan lordr 2
+es dan plusieur 1
+es dan un 1
+es daugmenter 1
+es daugmenter la 1
+es de 9
+es de ba 1
+es de bekker 1
+es de cach 1
+es de ce 2
+es de cerf 1
+es de certain 1
+es de ch 1
+es de chaqu 2
+es de claus 1
+es de comport 1
+es de conflit 1
+es de coupl 1
+es de coupur 1
+es de diff 1
+es de diffus 1
+es de dim 1
+es de disjonct 1
+es de doctorat 2
+es de don 1
+es de droit 1
+es de fa 2
+es de gauch 1
+es de incr 1
+es de koan 1
+es de la 5
+es de larchitectur 1
+es de lattribut 1
+es de linver 1
+es de localit 1
+es de lop 1
+es de man 2
+es de mar 1
+es de matr 1
+es de mi 1
+es de migr 1
+es de motif 1
+es de non 1
+es de p2 1
+es de pan 1
+es de par 1
+es de part 1
+es de pav 1
+es de plusieur 2
+es de point 1
+es de pr 1
+es de prem 1
+es de processeur 1
+es de prolog 1
+es de pseud 1
+es de repr 1
+es de sort 1
+es de substitut 1
+es de surv 1
+es de tail 1
+es de taylor 1
+es de techniqu 2
+es de tel 1
+es de term 1
+es de tout 1
+es de tr 1
+es de trait 2
+es de transit 1
+es de travail 1
+es de travaux 1
+es de utilidad 1
+es de van 1
+es de variabl 1
+es de w.j 1
+es defeat 1
+es depu 1
+es depu le 1
+es devenus 1
+es devenus inaccessibl 1
+es dextract 1
+es dextract de 1
+es diff 1
+es diff erent 1
+es differ 3
+es differ com 1
+es differ order 1
+es direct 3
+es direct au 1
+es direct de 2
+es direct du 1
+es dispon 1
+es dispon du 1
+es dist 1
+es dist dan 1
+es dist nest 1
+es dit 1
+es dit par 1
+es don 1
+es don pour 1
+es douvr 1
+es douvr sur 1
+es du 2
+es du cod 1
+es du contr 1
+es du corp 1
+es du faux 1
+es du foncteur 1
+es du nid 1
+es du partit 1
+es du point 1
+es du pr 1
+es du prem 1
+es du probl 1
+es du syst 1
+es du typ 1
+es dun 2
+es dun alloc 1
+es dun autr 1
+es dun boucl 1
+es dun champ 1
+es dun claus 1
+es dun compil 1
+es dun coupur 1
+es dun eventuel 1
+es dun incr 1
+es dun ind 1
+es dun lectur 1
+es dun mot 1
+es dun op 1
+es dun pag 1
+es dun pr 1
+es dun prim 1
+es dun program 1
+es dun syst 1
+es dun term 1
+es dun util 1
+es dun vi 1
+es dunimodularit 1
+es dutil 2
+es dutil de 1
+es dutil du 1
+es ee 2
+es ee en 1
+es ee pour 1
+es ee quel 1
+es efficac 3
+es efficac en 1
+es efficac sil 1
+es egal 1
+es egal aux 1
+es el 2
+es el egant 1
+es elev 1
+es elim 1
+es elim de 1
+es en 4
+es en ajout 1
+es en annec 1
+es en bloc 1
+es en ca 2
+es en ce 1
+es en con 1
+es en dupliqu 1
+es en ecritur 2
+es en fonct 1
+es en lectur 2
+es en lign 1
+es en md 1
+es en nombr 1
+es en par 1
+es en pren 1
+es en repr 1
+es en sauvegard 1
+es en term 1
+es en tr 1
+es en util 1
+es encour 1
+es enrich 1
+es entr 3
+es entr contr 1
+es entr eux 1
+es entr le 2
+es environ 1
+es environ multiprocesseur 1
+es equilibr 1
+es equilibr appar 1
+es equilibr de 1
+es est 3
+es est de 1
+es est diminu 1
+es est en 1
+es est le 1
+es est potentiel 1
+es est refus 1
+es est suff 1
+es est sup 1
+es est suscept 1
+es est un 1
+es et adr 1
+es et const 1
+es et correspon 1
+es et dan 1
+es et de 2
+es et dobjectif 1
+es et doiv 1
+es et donc 1
+es et evalu 1
+es et evoqu 1
+es et faux 1
+es et fournit 1
+es et gard 1
+es et identioabl 1
+es et le 2
+es et leur 1
+es et linflu 1
+es et ne 1
+es et par 1
+es et pr 1
+es et program 1
+es et val 1
+es etait 1
+es etait dan 1
+es etud 1
+es etud en 1
+es eucl 1
+es eucl dun 1
+es evalu 1
+es evalu partiel 1
+es exact 2
+es exact de 1
+es exact la 1
+es exclusif 1
+es exclusif dan 1
+es explicit 1
+es exponentiel 1
+es exprim 1
+es exprim ee 1
+es fa 4
+es fa co 2
+es fa localit 1
+es fac 1
+es facil 2
+es facil de 1
+es facil lext 1
+es fact 1
+es fer 1
+es fer migrer 1
+es figur 1
+es fondam 1
+es fondam du 1
+es for build 1
+es for link 1
+es for multicast 1
+es for preserv 1
+es for support 1
+es fort 1
+es fort la 1
+es fourn 1
+es fourn un 1
+es fr 2
+es fr equent 2
+es funct 1
+es fus 2
+es fus ee 1
+es fus est 1
+es g en 1
+es g eom 1
+es g om 1
+es garantit 1
+es garantit laffinit 1
+es gard 1
+es gard tot 1
+es gr 1
+es gr ac 1
+es grand 3
+es grand nombr 1
+es grand rigueur 1
+es grand tail 1
+es habituel 1
+es habituel de 1
+es habituel est 1
+es hi 1
+es holzbaur 1
+es humain 1
+es humain de 1
+es im 1
+es im ediat 1
+es imp 2
+es imp ee 1
+es import 3
+es import dan 1
+es import de 1
+es import en 2
+es improb 1
+es in addit 1
+es in bm 1
+es in honor 1
+es in identif 1
+es in interpr 1
+es in render 1
+es in replac 1
+es ind 2
+es ind ependam 2
+es indep 1
+es inf 1
+es inf erieur 1
+es inform 1
+es inform en 1
+es ingr 1
+es inh 2
+es inh erent 2
+es init 2
+es init de 1
+es init qi 1
+es init uniqu 1
+es initiaux 1
+es int 1
+es int er 1
+es interest 1
+es interpr 1
+es interpr es 1
+es interv 1
+es interv dan 1
+es intrin 1
+es intrin equ 1
+es introduc 1
+es introduc dun 1
+es inutil 1
+es invar 1
+es inver 1
+es inver de 1
+es ir 1
+es ir egl 1
+es issu 1
+es issu de 1
+es l eg 1
+es l etud 2
+es la 3
+es la compil 1
+es la cr 1
+es la form 1
+es la proposit 1
+es la reproduc 1
+es la suppr 1
+es lappel 1
+es larg 1
+es larg cl 1
+es larg exploit 1
+es lautr 1
+es lautr dan 1
+es le 3
+es le calcl 1
+es le chapitr 1
+es le corollair 1
+es le crit 1
+es le cycl 1
+es le dern 1
+es le instruc 1
+es le lem 1
+es le mesur 2
+es le point 1
+es le retour 1
+es le th 2
+es lent 2
+es lent afin 1
+es lenviron 1
+es li 2
+es li ee 1
+es li es 1
+es lib 1
+es lib erat 1
+es lin 2
+es lin eair 1
+es lin proc 1
+es loc 1
+es locaux 1
+es longu 1
+es longu ex 1
+es lop 1
+es lop erat 1
+es lor 3
+es lor appliquer 1
+es lor de 2
+es lor qu 2
+es lourd 1
+es lu 1
+es lu co 1
+es lun 1
+es lun par 1
+es lutil 1
+es lutil de 1
+es m emoir 1
+es majeur 1
+es majeur dan 1
+es mat 1
+es mat eriel 1
+es math 1
+es math ematiqu 1
+es matriciel 1
+es matriciel fondam 1
+es me 2
+es me sender 1
+es mean 1
+es microcod 1
+es microcod test 1
+es mod 1
+es mod el 1
+es modif 2
+es modif ee 1
+es modif es 1
+es n ecessair 1
+es n ecessit 1
+es nabord 1
+es nabord pa 1
+es naurait 1
+es naurait tout 1
+es ne 2
+es ne doiv 1
+es ne fa 1
+es ne le 1
+es ne perm 1
+es ne peut 2
+es ne sont 1
+es nombreux 1
+es nombreux ca 1
+es nombreux conflit 1
+es non 4
+es non conflictuel 1
+es non loc 1
+es non mask 1
+es non uniform 1
+es notr 1
+es nous 1
+es nous avon 1
+es obtenu 1
+es obtenu avec 1
+es of del 1
+es of mult 1
+es ont 2
+es ont la 1
+es ont pour 1
+es oper 1
+es or 1
+es order 2
+es order lp 1
+es ou 3
+es ou de 1
+es ou lab 1
+es ou maxim 1
+es ou par 1
+es ou similarit 1
+es ouver 1
+es ouver le 1
+es pa 1
+es pa en 1
+es pag 1
+es par 4
+es par an 1
+es par cat 1
+es par ce 1
+es par chacun 1
+es par cop 1
+es par de 3
+es par deux 1
+es par el 1
+es par empil 1
+es par etiqu 1
+es par la 2
+es par lam 1
+es par le 4
+es par leur 1
+es par lint 1
+es par part 1
+es par rapport 1
+es par setarg 1
+es par tous 1
+es par un 2
+es parc 1
+es parc quil 1
+es particip 1
+es partiel 1
+es partiel trait 1
+es partit 1
+es pav 1
+es pav de 1
+es pe 1
+es perform 1
+es perform dan 1
+es perm 1
+es peu 1
+es peu de 1
+es peu eucl 1
+es peu sur 1
+es peut 2
+es peut etr 2
+es peut provoquer 1
+es peuv 1
+es peuv sav 1
+es planair 1
+es plus approfon 1
+es po dun 1
+es positif 1
+es pour 5
+es pour caract 1
+es pour chaqu 1
+es pour clarif 1
+es pour de 1
+es pour former 1
+es pour la 2
+es pour lappel 1
+es pour le 2
+es pour linst 1
+es pour mener 1
+es pour obtenir 1
+es pour repr 1
+es pour sp 1
+es pouv 1
+es pouv entr 1
+es powel 1
+es pr 5
+es pr ec 4
+es pr edicat 1
+es pratiqu 1
+es pratiqu en 1
+es probabl 2
+es probabl etr 1
+es probabl serv 1
+es proch 2
+es proch de 1
+es proch du 1
+es proch dun 1
+es produ 1
+es produ de 1
+es profon 1
+es profon dan 1
+es program 1
+es program nb 1
+es propr 1
+es propr du 1
+es qu 3
+es qu ce 1
+es qu dan 1
+es qu eu 1
+es qu exc 1
+es qu la 2
+es qu largum 1
+es qu le 2
+es qu lon 1
+es qu lor 1
+es qu pour 1
+es qu tous 1
+es qu va 1
+es qu vi 1
+es quel 1
+es quel sub 1
+es quelconqu 1
+es quelconqu ne 1
+es quil 1
+es quun 3
+es quun attribut 1
+es quun inst 1
+es quun mi 1
+es quun point 1
+es quun pr 1
+es quun processeur 1
+es r educ 1
+es r egl 1
+es r el 1
+es r esolus 1
+es raisonnabl 1
+es rap 2
+es rap com 1
+es rap si 1
+es rapid 1
+es rapid afin 1
+es rar 1
+es rar donc 1
+es rar voir 1
+es redon 1
+es redon dan 1
+es redon en 1
+es redon ren 1
+es regroup 1
+es regroup un 1
+es rencontr 1
+es rencontr ee 1
+es rep 1
+es rep sur 1
+es replac 1
+es requir 1
+es respectiv 1
+es respectiv par 1
+es restait 1
+es restait const 1
+es restaur 1
+es restaur de 1
+es retard 1
+es retard es 1
+es risqu 1
+es risqu dinduir 1
+es risquerait 1
+es risquerait dintroduir 1
+es rol 3
+es rout 1
+es s ecrit 1
+es s ur 1
+es sam definit 1
+es san avoir 1
+es satisf 2
+es saying 1
+es se 1
+es se ramenait 1
+es sembl 1
+es sembl au 1
+es sen 1
+es sen au 1
+es sensibl 2
+es sensibl au 1
+es sensibl diff 1
+es server 1
+es server buffer 1
+es sest 1
+es si 3
+es si il 1
+es si la 1
+es si le 1
+es sicstus 1
+es similair 3
+es similair au 1
+es simpl 2
+es simpl dan 1
+es simpl le 1
+es simpl perm 1
+es simpl peuv 1
+es simpl puisquil 1
+es simplif 1
+es simultan 1
+es sint 1
+es sint egr 1
+es soit 3
+es soit par 1
+es soit sur 1
+es sont 5
+es sont alor 1
+es sont ceux 1
+es sont constitu 1
+es sont de 1
+es sont donc 1
+es sont du 1
+es sont en 1
+es sont identiqu 1
+es sont issu 1
+es sont issus 1
+es sont parfait 1
+es sont suffisam 1
+es sont superv 1
+es sont tr 1
+es sont vraisemblabl 1
+es souhait 1
+es souhait ee 1
+es sous 3
+es sous form 2
+es sous la 1
+es sous lact 1
+es souv 2
+es souv de 1
+es souv pr 1
+es souv util 1
+es sp 2
+es sp ecifiqu 2
+es stock 1
+es stock es 1
+es stop 1
+es stop word 1
+es structur 1
+es structur correspon 1
+es structur de 1
+es structur sont 1
+es suiv 2
+es suiv illustr 1
+es suiv le 1
+es suiv se 1
+es sup 1
+es sup es 1
+es suppl 2
+es suppl ementair 2
+es sur 4
+es sur chaqu 1
+es sur dautr 1
+es sur kcm 1
+es sur la 2
+es sur le 2
+es sur limpl 1
+es sur quatr 1
+es sur un 1
+es surviv 1
+es susm 1
+es symbol 1
+es symbol ou 1
+es synth 2
+es synth etiqu 1
+es synth tiqu 1
+es syst 1
+es syst ematiqu 1
+es tant 1
+es tant rig 1
+es tel 1
+es tel quil 1
+es th an 1
+es th bottom 1
+es th origin 1
+es th result 1
+es th search 1
+es th usu 1
+es them 1
+es throw 1
+es to distribut 1
+es to edit 1
+es to explicit 1
+es to find 1
+es to identif 1
+es to improv 1
+es to reduc 1
+es to simplif 1
+es to understand 1
+es tot 1
+es tot instanc 1
+es tous 1
+es tous le 1
+es tout 2
+es tout le 1
+es tr 1
+es tr es 1
+es transform 1
+es tridimensionnel 1
+es triv 1
+es triv task 1
+es ult 1
+es ult erieur 1
+es un 3
+es un coupur 1
+es un echec 1
+es un eventuel 1
+es un list 1
+es un mut 1
+es un nombr 1
+es un retour 1
+es un sel 1
+es un transform 1
+es unchang 1
+es universitair 1
+es universitair n.d 1
+es untyp 1
+es untyp framework 1
+es us 1
+es util 3
+es util com 1
+es util ee 1
+es util pour 1
+es var 1
+es var entr 1
+es ver 1
+es vi 1
+es voulu 1
+es when non 1
+es111 1
+es113 1
+es115 1
+es117 1
+es92 1
+es94 1
+esaccord 1
+esaccord sur 1
+esaccord sur le 1
+esager 1
+esager un 1
+esager un lim 1
+esav 1
+esav de 1
+esav de limpl 1
+esav de ne 1
+esav du 1
+esav du retard 1
+esav not 1
+esav not du 1
+esav potentiel 1
+esav potentiel de 1
+esc 3
+escap 4
+escap from loc 1
+escap funct 1
+escap instruc 1
+escap is lim 1
+escap stat 1
+escap stat an 1
+escap th fact 1
+esdij 1
+esdij denot 1
+esdij jej 1
+eseau 5
+eseau de 3
+eseau de commun 1
+eseau de contraint 1
+eseau de petr 1
+eseau dinterconnec 2
+eseau dinterconnec de 1
+eseau dinterconnec quelquef 1
+eseau dodinateur 1
+eseau est 2
+eseau est caract 1
+eseau est compl 1
+eseau et de 1
+eseau mail 1
+eseau pour 1
+eseau pour ex 1
+eseau sur 1
+eseau sur la 1
+eseau synchr 1
+eseau synchr qu 1
+eseaux 3
+eseaux cellulair 1
+eseaux de 1
+eseaux de petr 1
+eseaux dinterconnec 1
+eseaux dinterconnec util 1
+eseaux sont 1
+eseaux sont caract 1
+esec 1
+esent 7
+esent au 2
+esent au chapitr 1
+esent au sein 1
+esent br 1
+esent br ev 1
+esent canoniqu 1
+esent canoniqu de 1
+esent com 1
+esent com un 1
+esent dan 3
+esent dan ce 2
+esent dan la 3
+esent dan le 2
+esent de 3
+esent de ce 1
+esent de coup 1
+esent de difficult 1
+esent de nombreus 1
+esent deux 1
+esent deux aspect 1
+esent direct 1
+esent direct la 1
+esent du 1
+esent du faux 1
+esent e au 1
+esent e dan 2
+esent e explicit 1
+esent e figur 1
+esent e le 1
+esent e par 2
+esent e sur 1
+esent ee 4
+esent ee au 3
+esent ee com 2
+esent ee dan 3
+esent ee dev 2
+esent ee ic 1
+esent ee ind 1
+esent ee par 2
+esent egal 2
+esent egal dan 1
+esent es 2
+esent es au 1
+esent es ci 1
+esent es converg 1
+esent es par 1
+esent es sous 1
+esent et non 1
+esent ic 3
+esent ic deux 1
+esent ic un 2
+esent l etat 1
+esent la 4
+esent la dur 1
+esent la nouvel 1
+esent la sourc 1
+esent la techniqu 1
+esent la var 1
+esent le 4
+esent le argum 1
+esent le caract 2
+esent le context 1
+esent le deux 1
+esent le environ 1
+esent le meilleur 1
+esent le pag 1
+esent le par 1
+esent le strat 1
+esent le techniqu 1
+esent le term 1
+esent le th 1
+esent lensembl 1
+esent lensembl de 1
+esent lim 1
+esent lim de 1
+esent limpl 1
+esent notr 1
+esent notr cod 1
+esent pa 2
+esent pa de 1
+esent physiqu 1
+esent physiqu dan 1
+esent pour 2
+esent pour chaqu 1
+esent pour le 1
+esent qu 1
+esent qu si 1
+esent respectiv 1
+esent respectiv la 1
+esent sommair 1
+esent sommair la 1
+esent sous 1
+esent sous form 1
+esent sous la 1
+esent suffisam 1
+esent suffisam de 1
+esent suiv 1
+esent suiv le 1
+esent tout 1
+esent tout dabord 1
+esent un 4
+esent un adapt 1
+esent un comparaison 1
+esent un exempl 1
+esent un famil 1
+esent un impl 1
+esent un inst 1
+esent un nombr 1
+esent un nouvel 2
+esent un obj 1
+esent un point 1
+esent un rappel 1
+esent un techniqu 1
+esent un tr 1
+esent un var 1
+esent un vecteur 1
+esent vi 1
+esenter 4
+esenter dav 1
+esenter dav particl 1
+esenter de 2
+esenter de not 1
+esenter de techniqu 1
+esenter la 1
+esenter la localit 1
+esenter le 2
+esenter le approch 1
+esenter le contr 1
+esenter pa 1
+esenter pa la 1
+esenter un 2
+esenter un nombr 1
+esenter un nouvel 1
+esenter un tr 1
+esenter un var 1
+esenter vi 1
+esenteron 1
+esenteron de 1
+esenteron de approch 1
+esenteron deux 1
+eserv 2
+eserv de 1
+eserv de man 1
+eserv m em 1
+eserver 2
+eserver la 1
+eserver la coh 1
+eserver lam 1
+eserver lam elior 1
+esfahan 1
+esh 1
+esid 4
+esid alor 1
+esid alor dan 1
+esid dan 2
+esid dan la 1
+esid dan le 1
+esid dan sa 1
+esid en 1
+esid en som 1
+esid en son 1
+esid paul 1
+esid paul feautr 1
+esider 2
+esider ce 1
+esider ce jur 1
+esider la 1
+esider la com 1
+esiduel 2
+esiduel correspon 1
+esiduel dan 1
+esiduel est 1
+esiduel est qu 1
+esiduel pour 1
+esiduel pour terminer 1
+esiduel trjn 1
+esiduel trjn de 1
+esign 2
+esign e le 1
+esign la 1
+esign la dist 1
+esign la fonct 1
+esign la tail 1
+esign le 1
+esign le cardin 1
+esign le nombr 1
+esign le popl 1
+esign lesp 1
+esign lesp eranc 1
+esign respectiv 1
+esign respectiv la 1
+esign un ag 1
+esigner 1
+esigner par 1
+esigner par ssik 1
+esignon 1
+esignon par 1
+esil 1
+esil et u.s.a 1
+esion 1
+esion entr 1
+esion entr champ 1
+esir 2
+esir ee 1
+esir y acc 1
+esirabl 2
+esirabl a un 1
+esirabl qu 1
+esirabl qu peuv 1
+esmon 1
+esoff 1
+esoff off cruisest 1
+esolu 2
+esolu a lec 1
+esolu dan 1
+esolu dan le 1
+esolu de 1
+esolu de deux 1
+esolu en 2
+esolu en not 1
+esolu en sp 1
+esolu en util 1
+esolu par 2
+esolu par ladopt 1
+esolu par lintroduc 1
+esolu par lutil 1
+esolus 1
+esolut 4
+esolut attach 1
+esolut attach ee 1
+esolut avant 1
+esolut comb 1
+esolut comb un 1
+esolut correspon 1
+esolut correspon aux 1
+esolut cour 1
+esolut cour est 1
+esolut de 2
+esolut de but 1
+esolut de ce 1
+esolut de la 1
+esolut de man 1
+esolut de notr 1
+esolut de probl 2
+esolut dont le 1
+esolut du 3
+esolut du ca 1
+esolut du nouveau 1
+esolut du syst 2
+esolut dun 3
+esolut dun microsecon 1
+esolut dun mod 1
+esolut dun probl 2
+esolut empil 1
+esolut empil es 1
+esolut en 2
+esolut en ca 1
+esolut en deux 1
+esolut en millisecon 1
+esolut en nombr 1
+esolut est 2
+esolut est alor 1
+esolut est construit 1
+esolut et est 1
+esolut il 1
+esolut init 1
+esolut le 1
+esolut n ecessit 1
+esolut ne 1
+esolut ne correspon 1
+esolut ne requ 1
+esolut ou 1
+esolut ou de 1
+esolut par 1
+esolut par cop 1
+esolut par de 1
+esolut par empil 1
+esolut partag 1
+esolut partag ee 1
+esolut pr 1
+esolut pr ec 1
+esolut qu 1
+esolut qu peut 1
+esolut rn 1
+esolut rn tout 1
+esolut ser 1
+esolut ser repr 1
+esolut sld 1
+esolut sld en 1
+esolut sld est 1
+esolut sld sappliqu 1
+esolut soient 1
+esolut soient distinct 1
+esolut sont 1
+esolut sont empil 1
+esolut sont repr 1
+esolut sont toujour 1
+esolut suiv 1
+esolut sur 1
+esolut sur lesquel 1
+esolut tout 1
+esolut tout en 1
+esolut vid 1
+eson 1
+eson on enginest 1
+esop 3
+esorm 1
+esorm de 1
+esorm de forml 1
+esoter 1
+esoter interest 1
+esoter interest computer 1
+esoudr 4
+esoudr ce 3
+esoudr ce probl 3
+esoudr ce syst 1
+esoudr certain 1
+esoudr concern 2
+esoudr concern la 1
+esoudr et i1 1
+esoudr le 2
+esoudr le probl 1
+esoudr le syst 1
+esoudr pr 1
+esoudr pr ec 1
+esoudr un 1
+esoudr un nombr 1
+esoudr un probl 1
+esout 1
+esout aus 1
+esout aus le 1
+esout ce 1
+esout ce probl 1
+esout le 1
+esout le probl 1
+esout pa 1
+esout pa le 1
+esout par 1
+esout par linterm 1
+esp 6
+esp er regagner 1
+esp erant 1
+esp erant ne 1
+esp erer 2
+esp erer est 1
+esp erer leur 1
+esp erer qu 1
+esp eron 2
+esp eron qu 1
+esp eron quel 1
+esp ranc 1
+esp ranc au 1
+esp ranc conditionnel 1
+esp ranc dun 1
+esp ranc math 1
+esp rant 1
+esp rant qu 1
+espac 5
+espac a traver 1
+espac aff 1
+espac aff dan 1
+espac d efin 1
+espac d etat 2
+espac dadr 1
+espac dadr glob 1
+espac dadr virtuel 1
+espac darbr 1
+espac de 4
+espac de concept 1
+espac de dim 2
+espac de form 1
+espac de lespac 1
+espac de quatern 1
+espac de recherch 1
+espac de tail 1
+espac dinvar 1
+espac distanc 1
+espac eucl 1
+espac m emoir 1
+espac m triqu 1
+espac perdu 1
+espac perdu par 1
+espac sur 1
+espac sur la 1
+espac tang 1
+espac vectoriel 1
+espac vectoriel eucl 1
+espagn 1
+espec 37
+espec architectur 1
+espec architectur design 1
+espec becaus trip 1
+espec emph 1
+espec extrem 1
+espec extrem point 1
+espec for compl 1
+espec for light 1
+espec for program 1
+espec if sem 1
+espec if syntac 1
+espec if tim 1
+espec in distribut 1
+espec in fem 1
+espec in gestur 1
+espec in non 2
+espec in term 1
+espec instruc 1
+espec interest 3
+espec of tempor 1
+espec sab 1
+espec sab hubrig 1
+espec sensit 1
+espec succ 1
+espec suit 1
+espec th ba 1
+espec to computer 1
+espec us 1
+espec valu 1
+espec wel suit 1
+espec when resourc 1
+espec with respect 1
+espoir 1
+espoir de 1
+espoir de retour 1
+espr 1
+espr and tomcatv 1
+espr boolean 1
+espr boolean bc.in 1
+esprit 8
+esprit ag 1
+esprit ag dg 1
+esprit ba 3
+esprit ba research 3
+esprit br 3
+esprit br apparc 1
+esprit br project 1
+esprit project 1
+esprit project p1098 1
+esprit red 1
+esprit red project 1
+esqu 1
+esqu de 1
+esqu de cod 1
+esqu ee 1
+esqu ee par 1
+esqu le 1
+esqu le pa 1
+essair 1
+essayer 1
+essayer la 1
+essayer la dern 1
+essec 1
+essec.ac.uk 1
+essentiel 3
+essentiel au 1
+essentiel au bon 1
+essentiel au sein 1
+essentiel comp 1
+essentiel comp dan 1
+essentiel dan 1
+essentiel dan le 1
+essentiel de 1
+essentiel de la 1
+essentiel du 1
+essentiel du aux 1
+essentiel du temp 1
+essentiel est 1
+essentiel est de 1
+essentiel est qu 1
+essentiel lalphab 1
+essentiel lalphab binair 1
+essentiel par 3
+essentiel par leur 2
+essentiel par se 1
+essentiel par un 1
+essentiel sur 1
+essentiel sur li 1
+est 11
+est a ce 1
+est a chev 1
+est a comparer 1
+est a droit 1
+est a jour 1
+est a la 2
+est a ladr 1
+est a lavenir 1
+est a lorig 1
+est a noter 1
+est a nouveau 1
+est absol 1
+est abstrait 1
+est abstrait en 1
+est acc 2
+est acc ed 1
+est acc par 1
+est accru 1
+est accru afin 1
+est act 1
+est adr 1
+est affect 1
+est affect ee 1
+est ag 1
+est ag ee 1
+est ai 1
+est ai ee 1
+est ai ement 1
+est ain 2
+est ain en 1
+est ain enregister 1
+est ain exploit 1
+est ain inutil 1
+est ajout 1
+est align 1
+est allou 1
+est allou ee 1
+est alor 4
+est alor automatiqu 1
+est alor calcl 1
+est alor charg 1
+est alor compil 1
+est alor compl 1
+est alor connu 1
+est alor constitu 1
+est alor daut 1
+est alor de 2
+est alor diff 1
+est alor don 1
+est alor egal 1
+est alor empil 1
+est alor etiqu 1
+est alor im 1
+est alor inutil 2
+est alor le 1
+est alor lib 1
+est alor minor 1
+est alor rang 1
+est alor repr 1
+est alor similair 1
+est alor toujour 1
+est alor un 1
+est alor util 1
+est analogu 1
+est and arbitr 1
+est annot 1
+est annot ee 1
+est ant 1
+est ant commutatif 1
+est aoeect 1
+est appel 4
+est appel ee 1
+est appl 1
+est appl tant 1
+est apport 1
+est apport ee 1
+est ar 1
+est assez 1
+est assez fa 1
+est assoc 2
+est assoc ee 1
+est assur 1
+est assur ee 1
+est atteint 4
+est atteint avant 1
+est atteint dan 1
+est atteint lor 1
+est atteint quand 1
+est atteint quel 1
+est attr 1
+est attr dan 1
+est attractif 1
+est au 3
+est au moin 2
+est au pir 1
+est aus 2
+est aus appliqu 1
+est aus bien 1
+est aus de 1
+est aus elev 1
+est aus le 1
+est aus pa 1
+est aus pr 1
+est aus quel 1
+est aus rang 1
+est aus sauvegard 1
+est aus tr 1
+est aus un 2
+est aus util 1
+est automatiqu 2
+est ba 4
+est ba ee 2
+est beaucoup 1
+est bi 1
+est bi ee 1
+est bien 2
+est bien moindr 1
+est biject 1
+est binair 2
+est binair pr 1
+est bon 2
+est bon de 1
+est bon stop 1
+est born 2
+est born ee 1
+est cach 1
+est calcl 2
+est candid 1
+est cap 1
+est cap de 1
+est capit 1
+est capit pour 1
+est caract 2
+est caract er 2
+est ce 1
+est ce qu 1
+est ce quil 1
+est cel 3
+est cel de 2
+est cel qu 1
+est celu 2
+est celu qu 2
+est cep 3
+est cep int 1
+est certain 1
+est ch 1
+est ch de 1
+est charg 1
+est charg ee 1
+est clair 2
+est clair qu 1
+est cod 1
+est comp 2
+est comp ee 1
+est compar 1
+est compar ee 1
+est compil 1
+est compl 2
+est compl es 2
+est complec 1
+est conditionnel 1
+est conditionnel ou 1
+est conditionnel va 1
+est confirm 1
+est conflictuel 1
+est conflictuel dan 1
+est conflictuel s 1
+est conform 1
+est confront 1
+est congru 1
+est connu 1
+est connu de 1
+est connu dynamiqu 1
+est consacr 3
+est consacr ee 2
+est conseil 1
+est consid 1
+est consid er 1
+est consom 1
+est const 2
+est constam 1
+est constam egal 1
+est constitu 3
+est constitu ee 1
+est construc 1
+est construit 2
+est construit en 2
+est construit incr 1
+est contenu 1
+est contenu dan 1
+est convec 1
+est conver 1
+est conver en 1
+est correct 1
+est court 1
+est cr 2
+est critiqu 2
+est cruc 1
+est cycliqu 1
+est d ecl 1
+est d eclench 1
+est d econseil 1
+est d ecoup 1
+est d ecrit 3
+est d efail 1
+est d efait 1
+est d efin 3
+est d efinit 1
+est d efinitiv 1
+est d ej 1
+est d el 1
+est d eliminer 1
+est d epil 1
+est d epl 1
+est d eplac 1
+est d er 1
+est d eriv 1
+est d etail 1
+est d etermin 2
+est d etud 1
+est d eviter 1
+est d moin 1
+est d tud 1
+est d1 1
+est dabord 1
+est dabord cop 1
+est dan 3
+est dan ce 1
+est dan la 1
+est dan le 2
+est dan son 1
+est dappl 1
+est dappl direct 1
+est daut 2
+est daut meilleur 1
+est de 5
+est de autr 1
+est de construir 1
+est de coupur 1
+est de cr 2
+est de degr 1
+est de devoir 1
+est de dim 1
+est de diminuer 1
+est de fair 1
+est de la 2
+est de localiser 1
+est de longueur 1
+est de lordr 1
+est de moin 1
+est de montrer 1
+est de natur 1
+est de ne 2
+est de partager 1
+est de passer 1
+est de pr 4
+est de proposer 1
+est de prouver 1
+est de quatr 1
+est de quelqu 1
+est de rajouter 1
+est de ranger 1
+est de rendr 1
+est de repr 1
+est de retarder 1
+est de savoir 1
+est de tail 1
+est de travailler 1
+est de typ 1
+est deffectuer 1
+est devenu 1
+est dexhiber 1
+est didentif 1
+est diff 2
+est diff erent 2
+est difficil 2
+est difficil de 1
+est diffus 1
+est diminu 1
+est diminu ee 1
+est dintersect 1
+est dintersect non 1
+est dintroduir 1
+est dintroduir un 1
+est dinvalider 1
+est dinvalider le 1
+est direct 2
+est direct affect 1
+est direct appar 1
+est direct la 1
+est direct li 2
+est direct rang 1
+est distinct 1
+est distinct de 1
+est distribu 1
+est distribu ee 1
+est dit 3
+est dit ap 1
+est dit au 1
+est dit binair 1
+est dit de 1
+est dit ergodiqu 1
+est dit form 1
+est dit fort 1
+est dit inst 1
+est dit instanc 1
+est dit intrin 1
+est dit li 1
+est dit non 1
+est dit par 1
+est dit posit 1
+est dit st 1
+est div 1
+est div ee 1
+est dobtenir 1
+est dobtenir sp 1
+est don 4
+est don ee 3
+est donc 4
+est donc ai 1
+est donc bien 1
+est donc capit 1
+est donc compat 1
+est donc constitu 1
+est donc dan 1
+est donc de 3
+est donc difficil 1
+est donc don 1
+est donc effectu 1
+est donc egal 1
+est donc ent 1
+est donc fin 1
+est donc intern 1
+est donc inutil 1
+est donc la 1
+est donc le 1
+est donc li 1
+est donc mac 1
+est donc maint 1
+est donc mi 1
+est donc moin 1
+est donc naturel 1
+est donc parf 1
+est donc posit 1
+est donc ram 1
+est donc respect 1
+est donc simpl 1
+est donc strict 1
+est donc tr 1
+est donc vr 1
+est dop 1
+est dop erer 1
+est dot 1
+est doubl 1
+est du 2
+est du au 2
+est du typ 1
+est dun 2
+est dun import 1
+est dutiliser 3
+est dutiliser la 1
+est dutiliser ladr 1
+est dutiliser un 2
+est dynamiqu 1
+est ecrit 1
+est ecrit en 1
+est effectu 3
+est effectu ee 2
+est effecu 1
+est effecu ee 1
+est egal 3
+est egal au 2
+est egal egal 1
+est el 4
+est el connu 1
+est el ev 1
+est elagu 1
+est elagu ee 1
+est elev 1
+est elev ee 1
+est elimin 2
+est elimin ee 2
+est empil 1
+est empil ee 1
+est empl 1
+est empl ee 1
+est en 4
+est en coh 1
+est en dehor 1
+est en droit 1
+est en eff 2
+est en eo 1
+est en fait 1
+est en faveur 1
+est en mesur 1
+est en moy 1
+est en part 1
+est en particl 1
+est en som 1
+est encor 1
+est encor dan 1
+est encor modif 1
+est encor renforc 1
+est enregister 1
+est enregister ee 1
+est ensuit 2
+est ensuit de 1
+est ensuit soum 1
+est ensuit test 1
+est ent 1
+est env 1
+est equiv 2
+est equiv en 1
+est equiv pour 1
+est erig 1
+est erig ee 1
+est essentiel 1
+est essentiel au 1
+est etendu 1
+est etendu aux 1
+est etiqu 1
+est etroit 1
+est etroit li 1
+est etud 2
+est etud ee 2
+est eucl 1
+est evid 1
+est evidem 2
+est evidem imp 1
+est evidem lexicopositif 1
+est evit 1
+est evit ee 1
+est ex 2
+est ex ecut 2
+est extr 1
+est extr em 1
+est extrait 1
+est extrait de 1
+est fa 1
+est fa par 1
+est facil 2
+est facil de 2
+est facil dexhiber 1
+est fait 1
+est fait apr 1
+est fic 1
+est fic dan 1
+est fic ee 1
+est fin 1
+est fin equiv 1
+est fin le 1
+est fon 1
+est fon ee 1
+est fondam 1
+est forc 1
+est forc visit 1
+est fourn 1
+est fourn par 1
+est fr 2
+est fr equem 1
+est fr equent 1
+est franch 1
+est fus 1
+est g en 2
+est g er 1
+est gal 1
+est gard 1
+est gard ee 1
+est glob 1
+est glob tout 1
+est guid 1
+est habituel 1
+est identiqu 1
+est identiqu dan 1
+est identiqu en 1
+est il 2
+est il de 1
+est il encor 1
+est illustr 2
+est illustr ee 2
+est im 2
+est im ed 1
+est im ediat 1
+est impl 1
+est impl ement 1
+est import 1
+est import car 1
+est import de 3
+est import il 1
+est in 1
+est in epen 1
+est in er 1
+est inact 1
+est inchang 1
+est inconditionnel 1
+est incr 1
+est incr ement 1
+est ind 1
+est ind epen 1
+est indep 1
+est indep du 1
+est indisp 1
+est indisp pour 1
+est inf 1
+est inf erieur 1
+est infin 1
+est influenc 1
+est init 2
+est init allou 1
+est init du 1
+est init la 1
+est init un 1
+est inject 1
+est inspir 1
+est inspir ee 1
+est instanc 1
+est instanc ee 1
+est instructif 1
+est instructif de 1
+est insuff 1
+est insuff pour 1
+est int 2
+est int egr 2
+est int er 1
+est interpr 1
+est intim 1
+est intim li 1
+est intrin 1
+est intrin qu 1
+est introduit 1
+est inutil 2
+est inutil dy 1
+est inv 2
+est inv ee 2
+est invar 1
+est invar par 1
+est inver 1
+est inver proportionnel 1
+est judicieux 1
+est judicieux de 1
+est l egal 1
+est l egitim 1
+est l el 1
+est la 5
+est la condit 1
+est la dat 1
+est la densit 1
+est la dern 1
+est la longueur 1
+est la matr 2
+est la meilleur 1
+est la paragon 1
+est la possibilit 1
+est la probabilit 1
+est la project 1
+est la repr 1
+est la responsabilit 1
+est la sel 1
+est la suiv 3
+est la tail 2
+est la val 1
+est la valeur 1
+est lab 1
+est lab de 1
+est ladapt 1
+est ladapt du 1
+est ladr 1
+est ladr de 1
+est ladr du 1
+est ladr dun 1
+est lanc 1
+est lanc ee 1
+est lanneau 1
+est lattribut 1
+est lattribut de 1
+est le 6
+est le ca 1
+est le calcl 1
+est le ch 1
+est le cofacteur 1
+est le compl 1
+est le concept 1
+est le corollair 1
+est le dern 1
+est le facteur 2
+est le foncteur 1
+est le gestionnair 1
+est le lang 1
+est le maxim 1
+est le mod 2
+est le noeud 1
+est le nombr 3
+est le pa 1
+est le partit 1
+est le ph 1
+est le point 1
+est le pr 1
+est le prem 1
+est le processeur 1
+est le propr 1
+est le rat 1
+est le risqu 1
+est le sous 2
+est le squel 1
+est le suiv 3
+est le temp 2
+est le vecteur 2
+est lempl 1
+est lempl dun 1
+est lensembl 3
+est lensembl de 3
+est lespac 1
+est lespac de 1
+est li 1
+est li ee 1
+est lib 1
+est lib er 1
+est libr 2
+est libr transform 1
+est licit 1
+est licit de 1
+est lim 1
+est lim ee 1
+est lintroduc 1
+est lintroduc du 1
+est loc 1
+est locc 1
+est locc de 1
+est lordinateur 1
+est lordinateur classiqu 1
+est lordr 1
+est lordr lexicographiqu 1
+est lu 1
+est lunificateur 1
+est lunificateur le 1
+est m 2im 1
+est m em 2
+est m emor 1
+est mac 1
+est maint 1
+est maint combinaison 1
+est maint en 1
+est maintenu 1
+est maintenu de 1
+est mal 1
+est mal adapt 1
+est malheureus 2
+est malheureus assez 1
+est malheureus de 1
+est markov 1
+est marqu 1
+est marqu ee 1
+est math 1
+est math ematiqu 1
+est meilleur 2
+est meilleur qu 1
+est mi 2
+est mi en 1
+est mi sur 1
+est minim 1
+est mod 2
+est mod el 2
+est modif 1
+est moin 2
+est moin efficac 1
+est moin grav 1
+est moin import 1
+est moin perform 1
+est montr 1
+est mu 1
+est multipl 1
+est multipl de 1
+est n cessair 1
+est n ecessair 4
+est n egatif 1
+est n eglig 1
+est naturel 1
+est naturel de 1
+est nl 4
+est nl au 1
+est nl si 2
+est non 3
+est non nl 1
+est non vid 1
+est not ee 1
+est notabl 1
+est notoir 1
+est noy 1
+est np 1
+est np compl 1
+est obligatoir 1
+est obligatoir soit 1
+est obtenu 1
+est obtenu aux 1
+est obtenu en 1
+est obtenu par 1
+est obtenu sous 1
+est op 1
+est op erationnel 1
+est organ 2
+est organ ee 2
+est pa 1
+est pa ee 1
+est pa ralent 1
+est pair 1
+est par 2
+est par el 1
+est par exempl 1
+est parf 1
+est parf vit 1
+est parfait 2
+est parfait compat 1
+est parfait imbriqu 1
+est parfait par 1
+est partag 2
+est partag ee 2
+est particl 2
+est particl rement 1
+est partiel 1
+est partiel perdu 1
+est perdu 2
+est petit 1
+est peu 2
+est peu cour 1
+est peu fr 1
+est peu sen 1
+est physiqu 1
+est physiqu distribu 1
+est plac 2
+est plac ee 2
+est plus anc 1
+est plus co 1
+est plus compact 1
+est plus difficil 1
+est plus fa 1
+est plus grand 1
+est plus import 1
+est plus longu 1
+est plus ou 1
+est plus petit 1
+est plus pr 1
+est plus rap 1
+est plus rapid 1
+est po dacc 1
+est po dadapter 1
+est po dallouer 1
+est po de 4
+est po dimaginer 1
+est po dimpl 1
+est po en 1
+est po par 1
+est po si 1
+est posit 2
+est posit par 1
+est posit si 1
+est positif 2
+est positif le 1
+est potentiel 1
+est pour 2
+est pour linst 1
+est pour notr 1
+est pr 2
+est pr ef 1
+est pr en 1
+est pr esent 1
+est pr esup 1
+est pr etendu 1
+est pratiqu 1
+est pratiqu ee 1
+est prem 1
+est prem avec 1
+est presqu 1
+est presqu identiqu 1
+est prim 1
+est primord 1
+est primord dan 1
+est princip 2
+est privil 1
+est privil eg 1
+est probl 1
+est probl ematiqu 1
+est proch 1
+est proch de 1
+est proch du 1
+est profon 1
+est profon dan 1
+est proportionnel 1
+est propr 1
+est propr etair 1
+est qu 4
+est qu ce 1
+est qu cel 2
+est qu com 1
+est qu dan 1
+est qu de 1
+est qu im 1
+est qu la 3
+est qu lalgorithm 1
+est qu lanc 1
+est qu le 3
+est qu lutil 1
+est qu nous 1
+est qu tant 1
+est qu tout 2
+est qualor 1
+est qualor le 1
+est quantif 1
+est quantif ee 1
+est quasim 1
+est quasim in 1
+est quaucun 1
+est quaucun structur 1
+est quel 2
+est quel engendr 1
+est quel impliqu 1
+est quel ne 1
+est quel perm 1
+est quel produit 1
+est quelquef 1
+est quelquef suj 1
+est quil 3
+est quil ec 1
+est quil est 1
+est quil peut 1
+est quil ren 1
+est quun 2
+est quun explor 1
+est quun propr 1
+est quun var 1
+est r eduit 3
+est r eel 1
+est r ef 1
+est r efut 1
+est r egl 1
+est r einit 1
+est r eserv 1
+est r esolu 1
+est raison 1
+est raison de 1
+est ram 1
+est ram ee 1
+est rar 1
+est recouver 1
+est recouver par 1
+est redon 1
+est redon alor 1
+est redon dan 1
+est refus 1
+est refus ee 1
+est relatif 1
+est relativ 2
+est relativ petit 1
+est relativ simpl 1
+est rem 1
+est rempl 2
+est remplac 2
+est remplac ee 2
+est rendu 3
+est rendu assez 1
+est rendu difficil 1
+est rendu imp 1
+est rendu op 1
+est rep 1
+est repr 4
+est repr esent 4
+est reproduit 1
+est reproduit figur 1
+est respectiv 1
+est respectiv de 1
+est rest 1
+est rest ee 1
+est restaur 1
+est retard 2
+est retard ee 2
+est retourn 1
+est retourn ee 1
+est rien 1
+est s elect 1
+est s epar 1
+est s equentiel 2
+est s ur 2
+est san el 1
+est sauvegard 1
+est sauvegard ee 1
+est sb 1
+est scind 1
+est segm 1
+est segm ee 1
+est sensibl 1
+est sensibl moin 1
+est si 1
+est si tent 1
+est similair 2
+est similair au 2
+est simpl 1
+est simpl mi 1
+est simpl modif 1
+est simpl util 1
+est simplif 1
+est soit 1
+est soit mi 1
+est souhait 2
+est souhait de 2
+est souv 1
+est souv raffin 1
+est souv sup 1
+est sp 1
+est sp ec 1
+est stochastiqu 1
+est stochastiqu prim 1
+est stock 2
+est strict 2
+est strict positif 1
+est strict sup 1
+est structur 1
+est substitu 2
+est substitu ee 2
+est suff 3
+est suff com 1
+est suff dan 1
+est suff pour 3
+est suffisam 1
+est suffisam rap 1
+est suiv 1
+est suiv dun 1
+est sup 4
+est sup ee 3
+est sup erieur 3
+est super 1
+est super exponentiel 1
+est superficiel 1
+est sur 1
+est sur le 1
+est surtout 1
+est surtout int 1
+est suscept 2
+est suscept de 1
+est suscept dengendrer 1
+est syst 2
+est syst ematiqu 2
+est t1 1
+est tel 2
+est tel qu 2
+est tel quil 1
+est termin 1
+est tir 2
+est tir ee 2
+est toujour 4
+est toujour acc 1
+est toujour appr 1
+est toujour au 1
+est toujour caus 1
+est toujour dispon 1
+est toujour don 1
+est toujour egal 2
+est toujour faus 1
+est toujour la 1
+est toujour le 1
+est toujour repr 1
+est toujour requ 1
+est toujour termin 1
+est toujour vr 1
+est tout 1
+est toutef 1
+est toutef approxim 1
+est toutef int 1
+est toutef moin 1
+est toutef qu 1
+est tp 1
+est tr 4
+est tr es 4
+est traditionnel 1
+est trait 1
+est tranform 1
+est transf 1
+est transf er 1
+est transform 2
+est transform ee 1
+est transpar 1
+est transpar pour 1
+est transver 1
+est transver aux 1
+est triv 2
+est trop 1
+est trop fa 1
+est trop petit 1
+est trop statiqu 1
+est typiqu 1
+est typiqu appl 1
+est typiqu dun 1
+est un 5
+est un appel 1
+est un appl 1
+est un argum 1
+est un autr 1
+est un ba 1
+est un bon 1
+est un boul 1
+est un ch 1
+est un claus 1
+est un co 1
+est un cod 2
+est un comp 1
+est un configur 1
+est un const 2
+est un de 2
+est un econom 1
+est un ensembl 3
+est un ent 1
+est un espac 1
+est un ev 1
+est un exempl 1
+est un ext 1
+est un fait 1
+est un foncteur 1
+est un ind 1
+est un inst 1
+est un matr 3
+est un multipl 1
+est un non 1
+est un nouvel 2
+est un op 1
+est un peu 1
+est un pol 1
+est un pr 1
+est un prim 1
+est un program 1
+est un propr 1
+est un pseud 1
+est un pu 1
+est un quest 1
+est un raffin 1
+est un register 1
+est un repr 2
+est un structur 1
+est un super 1
+est un symbol 1
+est un syst 1
+est un tableau 1
+est un techniqu 2
+est un term 1
+est un test 1
+est un valeur 1
+est un var 2
+est un vecteur 3
+est un vit 1
+est unif 1
+est unif ee 1
+est uniqu 1
+est util 2
+est util dan 1
+est util ee 2
+est v erif 2
+est val 1
+est var 1
+est vid 1
+est virtuel 1
+est vr 1
+est vr ou 1
+est vr pour 1
+est vr s 1
+est vr si 1
+est vraim 1
+est xp 1
+establ 53
+establ a commun 1
+establ a compl 1
+establ a conflu 1
+establ a connect 2
+establ a correspon 1
+establ a gr 1
+establ a loc 1
+establ a non 1
+establ a request 1
+establ a stat 1
+establ a structur 1
+establ a theor 1
+establ a transport 1
+establ adequ 1
+establ and maintain 1
+establ and switch 1
+establ another 2i 1
+establ as follow 1
+establ both correct 1
+establ by ext 1
+establ by prov 2
+establ by rearrang 1
+establ commun 2
+establ commun channel 1
+establ commutat 1
+establ compl 1
+establ concept 1
+establ conflu 1
+establ connect 1
+establ correct 2
+establ dynam 1
+establ ec 1
+establ ec axiom 1
+establ for explor 1
+establ fundam 1
+establ fundam me 1
+establ handler 1
+establ handler funct 1
+establ how synchron 1
+establ in sec 1
+establ it ba 1
+establ it np 1
+establ lingu 1
+establ lingu featur 1
+establ link 1
+establ new on 1
+establ oc 1
+establ on adeg 1
+establ on za 1
+establ or maintain 1
+establ order 1
+establ order heur 1
+establ signif 1
+establ som optim 1
+establ som techn 1
+establ suit 1
+establ task 1
+establ test 1
+establ test suit 1
+establ th ba 1
+establ th commun 1
+establ th complec 1
+establ th con 1
+establ th connect 1
+establ th correspon 1
+establ th de 1
+establ th decl 1
+establ th ec 1
+establ th equiv 2
+establ th heap 1
+establ th hierarch 1
+establ th loc 1
+establ th motiv 1
+establ th natur 1
+establ th prev 1
+establ th rel 1
+establ th relationship 1
+establ th requir 1
+establ th sound 1
+establ th st 1
+establ th system 1
+establ th tight 1
+establ th triangl 1
+establ th us 1
+establ th valu 1
+establ that ff 1
+establ that jw 1
+establ that room 1
+establ that window 1
+establ their effect 1
+establ tn 1
+establ tw connect 1
+establ tw distinct 1
+establ uniqu 1
+establ user 1
+establ user ba 1
+establ whil try 1
+establishm 4
+establishm algorithm 1
+establishm in wid 1
+establishm may lead 1
+establishm of underl 1
+establishm rl 1
+estampil 1
+estampil a la 1
+estampil commun 1
+estampil correct 1
+estampil de 1
+estampil de liaison 1
+estampil de valeur 1
+estampil devront 1
+estampil devront retrouver 1
+estampil ee 1
+estampil ee avec 1
+estampil ee correspon 1
+estampil ee de 1
+estampil est 1
+estampil est identiqu 1
+estampil et point 1
+estampil inclus 1
+estampil lor 1
+estampil lor dun 1
+estampil par 1
+estampil par adr 1
+estampil pr 1
+estampil pr ec 1
+estampil sup 1
+estampil sup erieur 1
+estampil val 1
+estim 41
+estim a tight 1
+estim and control 1
+estim and found 1
+estim and hypoth 1
+estim and solut 1
+estim ba 1
+estim best parabol 1
+estim cap 1
+estim coeff 1
+estim comput 1
+estim count 1
+estim count cou 1
+estim de 1
+estim de mesur 1
+estim difficult 1
+estim du 1
+estim du co 1
+estim du nombr 1
+estim du vol 1
+estim e qu 1
+estim ee 1
+estim et de 1
+estim fair 1
+estim for cc 1
+estim for dat 1
+estim from frequ 1
+estim gener 1
+estim gener accur 1
+estim gi 1
+estim high 1
+estim hold 1
+estim in pract 1
+estim in term 1
+estim inter 1
+estim inter cluster 1
+estim it lat 1
+estim knowledg 1
+estim knowledg ba 1
+estim med 1
+estim of an 1
+estim of cc 1
+estim of demand 2
+estim of gener 1
+estim of incr 2
+estim of spat 1
+estim of tempor 1
+estim of tim 1
+estim of transform 1
+estim parameter 1
+estim perform 1
+estim pl 1
+estim pl rat 1
+estim posit 1
+estim pr 1
+estim pr ec 1
+estim prec 1
+estim problem 2
+estim procc 1
+estim procc tim 1
+estim quantit 1
+estim quantit fin 1
+estim reason 1
+estim reason accur 1
+estim refer 1
+estim refer curv 1
+estim requir 1
+estim requir forml 1
+estim schem 1
+estim spectr 1
+estim spectr adapt 1
+estim system 1
+estim system pot 1
+estim techniqu 1
+estim th 1
+estim th amount 2
+estim th chang 1
+estim th commun 1
+estim th cost 2
+estim th dat 1
+estim th deform 1
+estim th depth 1
+estim th eoriqu 1
+estim th execut 1
+estim th fair 1
+estim th fract 2
+estim th inter. 1
+estim th loc 1
+estim th longest 1
+estim th magnitud 1
+estim th number 2
+estim th optim 1
+estim th overhead 1
+estim th parabol 1
+estim th perform 1
+estim th pot 1
+estim th prob 2
+estim th respon 1
+estim th row 1
+estim th siz 2
+estim th stal 1
+estim th system 1
+estim th text 1
+estim th thin 1
+estim th tot 1
+estim th uncertaint 1
+estim th us 1
+estim tim 1
+estim tim requir 1
+estim uncertain 1
+estim uncertain spat 1
+estim underst 1
+estim using 1
+estim using bound 1
+estim whether pair 1
+estim whith 1
+estim whith reason 1
+estimateur 2
+estimateur compt 1
+estimateur compt tenu 1
+estimateur de 1
+estimateur de param 1
+estimateur de probabilt 1
+estimateur et de 1
+estimateur non 1
+estimateur non bi 1
+estimer 3
+estimer ce 1
+estimer ce born 1
+estimer le 2
+estimer le bruit 1
+estimer le co 1
+estimer le nombr 1
+estimer limpact 1
+estimer limpact dun 1
+estimer lincertitud 1
+estimer lincertitud sur 1
+estimer par 1
+estimer par exempl 1
+estimer peut 1
+estimer peut etr 1
+estimer un 1
+estimer un mesur 1
+estreitar 1
+estreitar a dist 1
+esulat 1
+esulat obtenus 1
+esulat obtenus pour 1
+esulat siml 1
+esulat siml siml 1
+esult 4
+esult apr 1
+esult apr es 1
+esult de 2
+esult de colon 1
+esult de la 2
+esult de lempil 1
+esult de limpossibilit 1
+esult de lunif 1
+esult doiv 1
+esult doiv etr 1
+esult du 1
+esult dun 2
+esult dun comprom 1
+esult dun retour 1
+esult e en 1
+esult e sur 1
+esult en 1
+esult est 2
+esult est le 1
+esult est moin 1
+esult etant 1
+esult etant essentiel 1
+esult n ecessair 1
+esult qu 2
+esult qu la 1
+esultat 5
+esultat a ceux 1
+esultat a la 1
+esultat aus 1
+esultat aus bon 1
+esultat calcl 1
+esultat calcl es 1
+esultat ce 1
+esultat dan 2
+esultat dan le 2
+esultat de 4
+esultat de calcl 1
+esultat de ce 2
+esultat de la 2
+esultat de lec 1
+esultat de se 1
+esultat delan 1
+esultat delan granst 1
+esultat dev 1
+esultat dev nt4 1
+esultat don 1
+esultat don un 1
+esultat du 2
+esultat du calcl 1
+esultat du lem 1
+esultat du th 1
+esultat du tr 1
+esultat dun 2
+esultat dun op 1
+esultat dun tel 1
+esultat dun travail 1
+esultat empiriqu 1
+esultat empiriqu de 1
+esultat est 2
+esultat est alor 1
+esultat est donc 1
+esultat est obtenu 1
+esultat est qu 1
+esultat est quun 1
+esultat est tr 1
+esultat est un 1
+esultat est vr 1
+esultat exp 2
+esultat exp erimentaux 2
+esultat import quon 1
+esultat int 1
+esultat int er 1
+esultat interm 1
+esultat interm ediair 1
+esultat le 1
+esultat le corollair 1
+esultat montr 1
+esultat montr clair 1
+esultat non 1
+esultat non pa 1
+esultat num 1
+esultat num eriqu 1
+esultat obtenus 4
+esultat obtenus entr 1
+esultat obtenus exp 1
+esultat obtenus montr 1
+esultat obtenus par 2
+esultat obtenus sont 3
+esultat ont 1
+esultat ont de 1
+esultat perm 1
+esultat perm bien 1
+esultat peu 1
+esultat peu significatif 1
+esultat peut 1
+esultat peut se 1
+esultat plin 1
+esultat pour 1
+esultat pour tout 1
+esultat pour un 1
+esultat pr 2
+esultat pr ec 2
+esultat pr edit 1
+esultat principaux 1
+esultat principaux relatif 1
+esultat qu 2
+esultat qu ce 1
+esultat qu fait 1
+esultat quantitatif 1
+esultat quantitatif concern 1
+esultat quantitatif contenus 1
+esultat s eten 1
+esultat se 2
+esultat se rapport 1
+esultat soient 1
+esultat sont 2
+esultat sont dun 1
+esultat souhait 1
+esultat str 1
+esultat suiv 2
+esultat suiv sont 1
+esultat th 1
+esultat th eoriqu 1
+esultat tr 2
+esultat tr es 2
+esulter 1
+esulter du 1
+esulter du faux 1
+esulterait 1
+esulterait en 1
+esum 8
+esum a la 1
+esum a sassurer 1
+esum a un 1
+esum alor 1
+esum alor le 1
+esum au 1
+esum au comport 1
+esum e de 2
+esum e du 1
+esum ee 1
+esum ee dan 1
+esum en 1
+esum en tr 1
+esum es 1
+esum es dan 1
+esum lalgorithm 1
+esum le 1
+esum le contribut 1
+esumer 3
+esumer a la 1
+esumer a un 1
+esumer ain 1
+esumer dan 1
+esumer l etat 1
+esumer succinct 1
+esumer succinct la 1
+esumon 1
+esumon dan 1
+esumon dan le 1
+esup 1
+esup ee 1
+eswaran 2
+et.al 2
+etaappel 1
+etaappel imbriqu 1
+etabl 1
+etablir 2
+etablir la 1
+etablir la nouvel 1
+etablir qu 1
+etablir qu deux 1
+etablir un 1
+etablir un comparaison 1
+etablit 1
+etablit la 1
+etablit la connec 1
+etach 1
+etach attribut 1
+etach de 1
+etach de aspect 1
+etail 3
+etail d epen 1
+etail dagenc 1
+etail dagenc de 1
+etail dan 2
+etail dan ce 1
+etail dan la 1
+etail de 1
+etail de ce 1
+etail de cod 1
+etail de instruc 1
+etail de la 1
+etail de limpl 1
+etail de linterfac 1
+etail dimpl 1
+etail dimpl em 1
+etail don 1
+etail don es 1
+etail ee 2
+etail ee dan 1
+etail ee de 2
+etail ee habituel 1
+etail ee pren 1
+etail ne 1
+etail ne peuv 1
+etail qu 1
+etail qu le 1
+etail sa 1
+etail sa mi 1
+etail sur 1
+etail sur la 1
+etailler 1
+etailler l elag 1
+etainterpr 1
+etainterpr es 1
+etair 1
+etair avait 1
+etair de 1
+etair de la 1
+etair dun 1
+etair dun pag 1
+etair env 1
+etair env un 1
+etair est 1
+etair est le 1
+etair et le 1
+etair gestionnair 1
+etair gestionnair lecteur 1
+etair init 1
+etair init de 1
+etair init dun 1
+etair init dur 1
+etair perd 1
+etair perd le 1
+etair po 1
+etair po ed 1
+etait 2
+etait absent 1
+etait absent de 1
+etait assur 1
+etait assur ee 1
+etait d ej 1
+etait dan 1
+etait dan le 1
+etait diffus 1
+etait donc 1
+etait donc tr 1
+etait du 1
+etait du qu 1
+etait equiv 1
+etait fa 1
+etait implicit 1
+etait implicit le 1
+etait init 1
+etait init le 1
+etait le 1
+etait le ca 1
+etait pa 1
+etait pa sien 1
+etait partag 1
+etait perdu 1
+etait po dattribuer 1
+etait po de 1
+etait pr 1
+etait pr ev 1
+etait proportionnel 1
+etait proportionnel au 1
+etait qu 1
+etait qu le 1
+etait son 1
+etait son incomp 1
+etanch 1
+etant 4
+etant a effectuer 1
+etant adr 1
+etant adr par 1
+etant allou 1
+etant allou ee 1
+etant alor 1
+etant alor el 1
+etant appliqu 1
+etant automatiqu 1
+etant cap 1
+etant cap de 1
+etant ce 1
+etant ce processus 1
+etant cel 1
+etant cel de 1
+etant cr 1
+etant cr la 1
+etant d ecoup 1
+etant d efin 1
+etant dan 1
+etant dan ce 1
+etant dan le 1
+etant daut 1
+etant de 3
+etant de grand 1
+etant de modif 1
+etant de remplacer 1
+etant de typ 1
+etant don 3
+etant don ee 2
+etant en 1
+etant essentiel 1
+etant essentiel du 1
+etant etrang 1
+etant evidem 1
+etant evidem de 1
+etant examin 1
+etant examin es 1
+etant extr 1
+etant extr em 1
+etant fic 1
+etant fic ee 1
+etant g er 1
+etant implicit 1
+etant implicit dan 1
+etant implicit dus 1
+etant ind 1
+etant ind epen 1
+etant interpr 1
+etant inversibl 1
+etant inversibl sont 1
+etant l ag 1
+etant la 2
+etant le 2
+etant le cod 1
+etant le gestionnair 1
+etant le nombr 1
+etant le point 1
+etant le propr 1
+etant lexicopositif 1
+etant lintersect 1
+etant lintersect entr 1
+etant mi 1
+etant n ecessair 1
+etant nl 1
+etant non 2
+etant non singl 1
+etant obtenus 1
+etant obtenus par 1
+etant pa 2
+etant pa compl 1
+etant pa concern 1
+etant pa de 2
+etant pa du 1
+etant pa lim 1
+etant pa retard 1
+etant pa standard 1
+etant pa un 1
+etant pa uniform 1
+etant par 1
+etant par natur 1
+etant partiel 1
+etant partiel trait 1
+etant plus complec 1
+etant plus ralent 1
+etant plus sen 1
+etant potentiel 1
+etant potentiel sup 1
+etant pr 1
+etant pr en 1
+etant prem 1
+etant prem entr 1
+etant qu 1
+etant qu kcm 1
+etant quun 1
+etant quun condit 1
+etant rel 1
+etant respectiv 1
+etant rien 1
+etant rien dautr 1
+etant s equentiel 1
+etant stock 1
+etant temporair 1
+etant temporair sont 1
+etant tir 1
+etant tot 1
+etant tot il 1
+etant toujour 1
+etant toujour termin 1
+etant tr 1
+etant tr es 1
+etant un 3
+etant un figur 1
+etant un pu 1
+etant un sous 1
+etant un term 1
+etant un var 1
+etant util 1
+etant util ee 1
+etant vr 1
+etant vr pour 1
+etap 3
+etap a partir 1
+etap con 3
+etap con en 1
+etap correspon 1
+etap correspon au 1
+etap de 3
+etap de la 2
+etap de lagc 1
+etap de lalgorithm 1
+etap de partit 1
+etap de propag 1
+etap direct 1
+etap direct ou 1
+etap du 1
+etap du processus 1
+etap dun 1
+etap dun reconstruc 1
+etap dunif 1
+etap non 1
+etap non termin 1
+etap par 1
+etap par lutil 1
+etap peut 1
+etap pr 2
+etap pr ec 2
+etap princip 1
+etap qu 1
+etap qu sajout 1
+etap suiv 3
+etap suiv con 2
+etap suiv xe 1
+etap un bloc 1
+etaphoriqu 1
+etat 7
+etat a lentr 1
+etat a restaurer 1
+etat absorb 1
+etat accessibl 1
+etat accessibl de 1
+etat accessibl tr 1
+etat actuel 1
+etat actuel de 1
+etat ai 1
+etat ain 1
+etat ain caract 1
+etat ant 1
+etat ant erieur 1
+etat ap 1
+etat ap eriodiqu 1
+etat au 2
+etat au retour 1
+etat car 1
+etat car le 1
+etat caract 1
+etat caract er 1
+etat cour 1
+etat cour du 1
+etat cutpt 1
+etat d echec 1
+etat d energ 1
+etat d etermin 1
+etat dan 1
+etat de 4
+etat de bon 1
+etat de ce 2
+etat de fait 1
+etat de la 3
+etat de lart 2
+etat de liaison 1
+etat de pag 1
+etat de pan 1
+etat de register 1
+etat de typ 1
+etat dev 1
+etat dev inutil 1
+etat devrait 1
+etat devrait etr 1
+etat dic 1
+etat dic ecut 1
+etat dinstanc 1
+etat dinstanc de 1
+etat dont la 1
+etat du 3
+etat du calcl 1
+etat du point 1
+etat du sy 1
+etat du syst 2
+etat dun 1
+etat dun syst 1
+etat e de 1
+etat ei 1
+etat en 1
+etat en ne 1
+etat est 3
+etat est alor 1
+etat est don 1
+etat est donc 1
+etat est introduit 1
+etat et ayant 1
+etat fin 1
+etat fonctionel 1
+etat g en 1
+etat gigantesqu 1
+etat i au 1
+etat i converg 1
+etat i dev 1
+etat i en 1
+etat i est 1
+etat i le 1
+etat init 1
+etat init de 1
+etat instanc 1
+etat interm 1
+etat interm ediair 1
+etat inv 1
+etat j apr 1
+etat lectur 1
+etat lectur ecritur 1
+etat libr 1
+etat libr de 1
+etat m atteign 1
+etat mk 1
+etat n lor 1
+etat ne 1
+etat ne soit 1
+etat non 1
+etat observ 1
+etat observ est 1
+etat observ xn 1
+etat ou 1
+etat par 1
+etat par le 1
+etat pen 1
+etat pen de 1
+etat peut 1
+etat peut etr 1
+etat plut 1
+etat plut ot 1
+etat proc edur 1
+etat qu 2
+etat qu ne 1
+etat qu se 1
+etat rar 1
+etat san souc 1
+etat sauv 1
+etat sauvegard 1
+etat sp 1
+etat suiv 1
+etat un 1
+etat v erif 1
+etatif 1
+etayer 1
+etayer de 1
+etayer de men 1
+etc 61
+etc as disc 1
+etc is regard 1
+etd 1
+etd la 1
+etd la sort 1
+etect 2
+etect du 1
+etect du faux 1
+etect e en 1
+etect ee 1
+etect tout 1
+etect tout aus 1
+etectabl 1
+etecter 3
+etecter erreur 1
+etecter erreur de 1
+etecter le 1
+etecter le don 1
+etecter tous 1
+etecter tous ce 1
+etemad 1
+etemad and ram 1
+eten 3
+eten au 1
+eten au ca 1
+eten dailleur 1
+eten la 1
+eten la port 1
+eten le 1
+eten le possibilit 1
+eten pal 1
+eten qu 1
+eten qu le 1
+eten tr 1
+eten tr es 1
+etendr 2
+etendr au 1
+etendr au voisin 1
+etendr aux 1
+etendr aux mi 1
+etendr ce 1
+etendr la 1
+etendr la port 1
+etendr la zon 1
+etendr le 2
+etendr le court 1
+etendr le gard 1
+etendr le lang 1
+etendr le possibilit 1
+etendr le retour 1
+etendr le transform 1
+etendr lunif 1
+etendr qu 1
+etendr qu lensembl 1
+etendu 2
+etendu afin 1
+etendu afin dint 1
+etendu assez 1
+etendu assez rar 1
+etendu au 1
+etendu au ca 1
+etendu aux 1
+etendu aux claus 1
+etendu aux point 1
+etendu aux register 1
+etendu dan 1
+etendu dan la 1
+etendu de 1
+etendu de la 1
+etendu doit 1
+etendu doit etr 1
+etendu en 1
+etendu en attent 1
+etendu et donc 1
+etendu sous 1
+etendu sous form 1
+etendus 1
+etendus afin 1
+etendus afin de 1
+etent 2
+etent a un 1
+etent bien 1
+etent bien au 1
+eter 3
+eter ce 1
+eter ce chang 1
+eter cherch 1
+eter cherch le 1
+eter com 1
+eter com de 1
+eter en 1
+eter en un 1
+eter g en 1
+eter l ag 1
+eter l etap 1
+eter l etud 1
+eter la 1
+eter la valeur 1
+eter le 1
+eter le syst 1
+eter r ep 1
+eter un 1
+eter un famil 1
+eterm 3
+eterm daquarius 1
+eterm de 2
+eterm de bloc 1
+eterm de cl 1
+eterm de la 1
+eterm de partit 1
+eterm de pav 1
+eterm digit 1
+eterm est 1
+eterm est cap 1
+eterm ou 1
+eterm ou evaluateur 1
+eterm r eel 1
+etermin 4
+etermin avec 1
+etermin avec point 1
+etermin compil 1
+etermin compil es 1
+etermin dan 1
+etermin dan le 1
+etermin de 1
+etermin de fonct 1
+etermin e le 1
+etermin e loc 1
+etermin e par 1
+etermin e qu 2
+etermin ee 4
+etermin ee bool 1
+etermin ee en 1
+etermin ee le 1
+etermin ee par 1
+etermin ee statiqu 1
+etermin ee va 1
+etermin es 1
+etermin es par 1
+etermin es simpl 1
+etermin est 1
+etermin est const 1
+etermin est qu 1
+etermin et donc 1
+etermin la 1
+etermin la trajectoir 1
+etermin le 1
+etermin lordr 1
+etermin lordr de 1
+etermin ma 1
+etermin ma moin 1
+etermin plus fr 1
+etermin qu 1
+etermin qu condu 1
+etermin r ecursif 1
+etermin si 1
+etermin si en 1
+etermin si un 1
+eterminer 4
+eterminer a la 1
+eterminer a lec 1
+eterminer aus 1
+eterminer aus rapid 1
+eterminer ce 1
+eterminer ce colon 1
+eterminer en 1
+eterminer en fonct 1
+eterminer et parcourir 1
+eterminer exact 1
+eterminer exact le 1
+eterminer l ag 1
+eterminer la 1
+eterminer la posit 1
+eterminer le 3
+eterminer le besoin 1
+eterminer le born 1
+eterminer le caus 1
+eterminer le corp 1
+eterminer le coupl 1
+eterminer le facteur 1
+eterminer le ind 1
+eterminer le nombr 1
+eterminer le param 1
+eterminer le perform 1
+eterminer le processeur 1
+eterminer le solut 1
+eterminer le tr 1
+eterminer le transit 1
+eterminer le typ 1
+eterminer le vecteur 1
+eterminer lensembl 1
+eterminer lensembl de 1
+eterminer par 1
+eterminer par an 1
+eterminer pr 1
+eterminer pr ec 1
+eterminer quand 1
+eterminer quel 1
+eterminer quel sont 1
+eterminer si 1
+eterminer si le 1
+eterminer si lunif 1
+eterminer si un 1
+eterminer sil 1
+eterminer sil ec 1
+eterminer tout 1
+eterminer un 1
+eterminer un partit 1
+eterminer un transform 1
+eterminer un valeur 1
+eterminer xh 1
+eterminerait 1
+eterminerait probabl 1
+eterminerait probabl qu 1
+etermineron 1
+etermineron lensembl 1
+etermineron lensembl de 1
+etermineront 1
+etermineront le 1
+etermineront le diff 1
+etern 1
+etf 1
+etf algorithm 1
+etf algorithm break 1
+etf and dl 1
+etf dl 1
+eth 1
+eth z rich 1
+eth zurich 1
+ethernet 6
+ethernet addr 1
+ethernet addr map 1
+ethernet and tok 1
+ethernet at 10mbit 1
+ethernet connectionservermasterserver1servern 1
+ethernet pack 1
+ethernet work 1
+ethn 1
+ethniqu 1
+ethnomethodolog 1
+ethnomethodolog stud 1
+ethod 4
+ethod a deux 1
+ethod a lav 1
+ethod a originel 1
+ethod actuel 1
+ethod actuel de 1
+ethod afin 1
+ethod afin de 1
+ethod ain 1
+ethod ain qu 1
+ethod approch 1
+ethod approch ee 1
+ethod au 1
+ethod au ca 1
+ethod avec 1
+ethod avec le 1
+ethod ba 2
+ethod ba ee 2
+ethod classiqu 1
+ethod con 1
+ethod con alor 1
+ethod conserv 1
+ethod conserv lint 1
+ethod consistait 1
+ethod consistait alor 1
+ethod d elim 1
+ethod d evalu 1
+ethod dan 2
+ethod dan de 1
+ethod dan le 1
+ethod de 4
+ethod de calcl 1
+ethod de collect 1
+ethod de compil 1
+ethod de desc 1
+ethod de direct 1
+ethod de hook 1
+ethod de moindr 1
+ethod de partit 1
+ethod de pav 1
+ethod de powel 1
+ethod de reproduc 1
+ethod de simplec 1
+ethod de transform 1
+ethod de treil 1
+ethod de val 1
+ethod devr 1
+ethod devr donc 1
+ethod diff 1
+ethod diff erent 1
+ethod dimpl 1
+ethod dimpl em 1
+ethod doptim 1
+ethod du 1
+ethod du pav 1
+ethod ec 1
+ethod en 1
+ethod en com 1
+ethod est 2
+ethod est alor 1
+ethod est ba 1
+ethod est deffectuer 1
+ethod est didentif 1
+ethod est equiv 1
+ethod est la 1
+ethod est malheureus 1
+ethod est qu 1
+ethod est quel 1
+ethod est quil 1
+ethod et don 1
+ethod exempl 1
+ethod fonct 1
+ethod fonct co 1
+ethod fondam 1
+ethod futur 1
+ethod g en 1
+ethod glob 1
+ethod glob de 1
+ethod le 1
+ethod montr 1
+ethod montr qu 1
+ethod ne 3
+ethod ne cherch 1
+ethod ne constitu 1
+ethod ne perm 1
+ethod num 2
+ethod num eriqu 2
+ethod ont 1
+ethod param 1
+ethod param etr 1
+ethod parm 1
+ethod parm lesquel 1
+ethod perm 1
+ethod perm dassurer 1
+ethod perm de 1
+ethod perm dobtenir 1
+ethod peut 1
+ethod peut se 1
+ethod plus glob 1
+ethod plus pr 1
+ethod pour 1
+ethod pour en 1
+ethod pour le 1
+ethod pour lextrair 1
+ethod pr 1
+ethod pr ec 1
+ethod pr esent 1
+ethod proc edent 1
+ethod prop 1
+ethod prop de 1
+ethod prop ee 1
+ethod qu 1
+ethod qu est 1
+ethod qu nous 1
+ethod quancourt 1
+ethod quancourt en 1
+ethod r esid 1
+ethod sav 1
+ethod sav erer 1
+ethod selon 1
+ethod selon quatr 1
+ethod seront 1
+ethod seront cr 1
+ethod sur 1
+ethod sur loptim 1
+ethod tr 1
+ethod tr es 1
+ethod util 1
+ethod util ee 1
+ethod util lalgorithm 1
+ethodolog 2
+ethodolog est 1
+ethodolog est la 1
+ethodolog et architectur 1
+etiolog 1
+etiolog and nosolog 1
+etiqu 5
+etiqu aient 1
+etiqu c1a 1
+etiqu canoniqu 1
+etiqu canoniqu optim 1
+etiqu canoniqu peut 1
+etiqu cl 1
+etiqu cl sp 1
+etiqu cmp 1
+etiqu compil 1
+etiqu compil ee 1
+etiqu conduit 1
+etiqu correspon 1
+etiqu d echec 1
+etiqu dan 1
+etiqu dan la 1
+etiqu dan le 1
+etiqu de 3
+etiqu de don 2
+etiqu de la 1
+etiqu de noeud 1
+etiqu de pointeur 1
+etiqu diff 1
+etiqu diff erent 1
+etiqu direct 1
+etiqu direct li 1
+etiqu distribu 1
+etiqu distribu es 1
+etiqu don 1
+etiqu don le 1
+etiqu dordr 1
+etiqu dordr sup 1
+etiqu dun 1
+etiqu dun part 1
+etiqu e com 1
+etiqu e rn 1
+etiqu e vr 1
+etiqu ee 1
+etiqu ee cmp 1
+etiqu ee seq 1
+etiqu ee vr 1
+etiqu elit 1
+etiqu en 1
+etiqu en ca 1
+etiqu en lign 1
+etiqu entr 1
+etiqu entr tail 1
+etiqu est 1
+etiqu est cod 1
+etiqu et dautr 1
+etiqu et de 1
+etiqu et le 2
+etiqu et notam 1
+etiqu et un 1
+etiqu etant 1
+etiqu etant par 1
+etiqu fon 2
+etiqu fon ee 1
+etiqu font 1
+etiqu font intervenir 1
+etiqu g en 1
+etiqu hybr 1
+etiqu indiqu 2
+etiqu indiqu le 1
+etiqu indiqu qu 1
+etiqu interm 1
+etiqu interm ediair 1
+etiqu l egal 1
+etiqu la 1
+etiqu la requ 1
+etiqu le 1
+etiqu le diff 1
+etiqu lensembl 1
+etiqu lensembl de 1
+etiqu ne 1
+etiqu ne requ 1
+etiqu ne sont 1
+etiqu nest 2
+etiqu nest pa 2
+etiqu nest toutef 1
+etiqu ont 2
+etiqu par 1
+etiqu par el 1
+etiqu perform 1
+etiqu peut 1
+etiqu peut simpl 1
+etiqu plus compact 1
+etiqu pour 1
+etiqu pour la 1
+etiqu pr 2
+etiqu pr ec 2
+etiqu primair 1
+etiqu primair de 1
+etiqu qu 2
+etiqu qu nous 1
+etiqu ref 1
+etiqu repr 1
+etiqu repr esent 1
+etiqu requ 1
+etiqu requ inform 1
+etiqu s equentiel 1
+etiqu secondair 1
+etiqu sel 1
+etiqu sel sont 1
+etiqu seq 1
+etiqu seq correspon 1
+etiqu seq de 1
+etiqu sont 1
+etiqu sont fondam 1
+etiqu sp 1
+etiqu sp ecifiqu 1
+etiqu standard 1
+etiqu statiqu 1
+etiqu statiqu pr 1
+etiqu symboliqu 1
+etiqu symboliqu dan 1
+etiqu un 1
+etiqu util 1
+etiqu util es 1
+etiqu vr 1
+etiser 1
+etiser com 1
+etiser com suit 1
+etiser le 1
+etiser le inform 1
+etit 1
+etit et sel 1
+etitif 1
+etitif et de 1
+etitif et lorsqu 1
+etonner 1
+etonner qu 1
+etonner qu ce 1
+etour 1
+etour qu 1
+etour qu sav 1
+etr 6
+etr a linstruc 1
+etr a lorig 1
+etr a nouveau 1
+etr acc 2
+etr acc ed 2
+etr adapt 1
+etr additionnel 1
+etr additionnel don 1
+etr additionnel indiqu 1
+etr afin 1
+etr afin den 1
+etr ajout 1
+etr ajout ee 1
+etr ajust 1
+etr ajust es 1
+etr alor 1
+etr alor partiel 1
+etr am elior 1
+etr amener 1
+etr appl 1
+etr appliqu 3
+etr appliqu ee 3
+etr apport 1
+etr apport ee 1
+etr appr 1
+etr appr eciabl 1
+etr arbitrair 2
+etr arit 1
+etr at 1
+etr at enu 1
+etr atteint 1
+etr attribu 1
+etr attribu ee 1
+etr aus 1
+etr aus dan 1
+etr beaucoup 1
+etr bien 1
+etr bien au 1
+etr cach 1
+etr cach ee 1
+etr cach es 1
+etr calcl 2
+etr calcl ee 2
+etr calcl es 1
+etr cap 1
+etr cap de 1
+etr caract 1
+etr caract er 1
+etr caus 1
+etr caus de 1
+etr chang 1
+etr chang ee 1
+etr charg 1
+etr charg ee 1
+etr co 1
+etr co uteux 1
+etr combin 2
+etr combin ee 2
+etr combin es 1
+etr compar 1
+etr compar ee 1
+etr compil 1
+etr compil ee 1
+etr compl 1
+etr compl es 1
+etr compr 1
+etr compr com 1
+etr compr quop 1
+etr connu 1
+etr connu avant 1
+etr connu de 1
+etr conseil 1
+etr conseil ee 1
+etr consid 3
+etr consid er 3
+etr construit 1
+etr construit avant 1
+etr contr 1
+etr contr ol 1
+etr conver 1
+etr conver avant 1
+etr correspon 1
+etr corrig 1
+etr corrig es 1
+etr court 1
+etr court circuit 1
+etr cr 1
+etr d eclench 1
+etr d econnect 1
+etr d ecr 1
+etr d ecrit 2
+etr d efait 1
+etr d efin 3
+etr d epil 1
+etr d epl 1
+etr d eplac 1
+etr d eriv 1
+etr d etect 1
+etr d etermin 2
+etr d etruit 1
+etr dalign 1
+etr dan 2
+etr dan ce 1
+etr dan la 1
+etr dan le 1
+etr dan lespac 1
+etr de 3
+etr de form 1
+etr de instruc 1
+etr de lagc 1
+etr de lalgorithm 1
+etr de linstruc 1
+etr de neck 1
+etr de pr 1
+etr de register 1
+etr de siml 1
+etr devenu 1
+etr devenu la 1
+etr direct 1
+etr direct pa 1
+etr disponibl 1
+etr disponibl dur 1
+etr distribu 1
+etr distribu es 1
+etr div 1
+etr div ee 1
+etr don 1
+etr don le 1
+etr dorig 1
+etr dorig diver 1
+etr du 1
+etr du th 1
+etr dun 3
+etr dun instruc 1
+etr dun niveau 1
+etr dun probl 1
+etr dus 1
+etr dus aux 1
+etr e avec 1
+etr e par 1
+etr ecr 1
+etr ecrit 1
+etr edr 1
+etr edr de 1
+etr ee 1
+etr ee de 1
+etr ee par 1
+etr effectu 2
+etr effectu ee 2
+etr effectu es 1
+etr efficac 1
+etr efficac int 1
+etr efficac sur 1
+etr egal 1
+etr egal vr 1
+etr egaux 1
+etr elagu 1
+etr elagu ee 1
+etr elagu es 1
+etr elimin 2
+etr elimin ee 2
+etr elimin es 1
+etr empil 1
+etr empl 1
+etr empl ee 1
+etr en 1
+etr en mesur 1
+etr encor 1
+etr encor significativ 1
+etr engendr 1
+etr engendr ee 1
+etr enonc 1
+etr enregister 1
+etr enregister ee 1
+etr envisag 1
+etr es 2
+etr es ee 1
+etr es par 1
+etr est 1
+etr est util 1
+etr estampil 1
+etr estampil ee 1
+etr et ladr 1
+etr et peut 1
+etr etendu 2
+etr etendu afin 1
+etr etendu au 1
+etr etendu aux 1
+etr etendu de 1
+etr eux 1
+etr evit 1
+etr evit ee 1
+etr evit es 1
+etr ex 2
+etr ex ecut 2
+etr expliqu 1
+etr exploit 1
+etr exploit ee 1
+etr exprim 2
+etr exprim ee 1
+etr extrait 1
+etr extrait de 1
+etr facil 2
+etr facil combin 1
+etr facil compil 1
+etr facil remplac 1
+etr facil transform 1
+etr fait 1
+etr fait de 1
+etr fait en 1
+etr fic 1
+etr fic ee 1
+etr fic ou 1
+etr fourn 3
+etr fourn com 1
+etr fus 2
+etr fus ee 1
+etr fus es 1
+etr g en 2
+etr g er 1
+etr gard 1
+etr gard ee 1
+etr glob 1
+etr glob ee 1
+etr identiqu 1
+etr identiqu avant 1
+etr identiqu dan 1
+etr ignor 1
+etr illustr 1
+etr illustr ee 1
+etr imp 1
+etr impl 1
+etr impl ement 1
+etr ind 1
+etr ind epen 1
+etr indiff 1
+etr indiff erem 1
+etr indiff erent 1
+etr indiqu 1
+etr indiqu larit 1
+etr influ 1
+etr influ sur 1
+etr init 2
+etr init dan 1
+etr init es 1
+etr interpr 2
+etr introduit 2
+etr introduit afin 1
+etr inutil 1
+etr inutil sil 1
+etr inv 2
+etr inv ee 2
+etr l egal 1
+etr la 2
+etr la tail 1
+etr la ten 1
+etr ladr 1
+etr ladr du 1
+etr le 2
+etr le ca 2
+etr lev 1
+etr lev ee 1
+etr li 2
+etr li ee 1
+etr li es 1
+etr lib 1
+etr lib er 1
+etr libr 1
+etr libr etendu 1
+etr libr modif 1
+etr lim 1
+etr lim ee 1
+etr lim es 1
+etr loeuvr 1
+etr loeuvr qu 1
+etr lu 1
+etr lu par 1
+etr lu quau 1
+etr m elang 1
+etr major 1
+etr membr 1
+etr membr de 1
+etr men 1
+etr men es 1
+etr mi 3
+etr mi en 3
+etr mi sous 1
+etr microcod 1
+etr microcod ee 1
+etr mod 1
+etr mod ee 1
+etr modif 2
+etr modif ee 1
+etr modif es 2
+etr moindr 1
+etr n ecessair 1
+etr na 1
+etr nag 1
+etr nag correspon 1
+etr nag de 1
+etr nag influencerait 1
+etr nag la 1
+etr nag ne 1
+etr nag nest 1
+etr nag ou 1
+etr nag pourrait 1
+etr nag sont 1
+etr ne 1
+etr ne se 1
+etr ner 1
+etr net 1
+etr net ee 1
+etr norm 1
+etr norm es 1
+etr observ 1
+etr obtenu 2
+etr obtenu en 1
+etr obtenu par 1
+etr obtenu sur 1
+etr om 1
+etr pa 1
+etr pa ee 1
+etr par 1
+etr par register 1
+etr parcouru 1
+etr parcouru avec 1
+etr parfait 1
+etr partag 1
+etr partag ee 1
+etr partiel 1
+etr partiel rempl 1
+etr partiel retrouv 1
+etr perdu 1
+etr perdu par 1
+etr perm 1
+etr perm de 1
+etr perturb 1
+etr pipelin 1
+etr pipelin ee 1
+etr plus court 1
+etr plus longu 1
+etr plus raison 1
+etr po dan 1
+etr pour 1
+etr pour indiquer 1
+etr pr 2
+etr pr ec 1
+etr pr en 1
+etr pr eserv 1
+etr produit 1
+etr propag 2
+etr propag ee 2
+etr qu 2
+etr qu influ 1
+etr qu lon 1
+etr r eal 2
+etr r ecup 1
+etr r eduit 2
+etr r eint 1
+etr r epart 1
+etr r eserv 1
+etr r esolu 2
+etr r esum 1
+etr r eutil 1
+etr raccourc 1
+etr rang 1
+etr rang ee 1
+etr rapporteur 1
+etr rapporteur de 1
+etr recalcl 1
+etr rel 1
+etr rel ach 1
+etr rem 1
+etr rem ed 1
+etr remarqu 1
+etr remarqu es 1
+etr remplac 1
+etr remplac ee 1
+etr rendu 1
+etr rendu pr 1
+etr rendu transpar 1
+etr rep 1
+etr rep ee 1
+etr repr 2
+etr repr esent 2
+etr respon 1
+etr respon de 1
+etr restaur 1
+etr restaur es 1
+etr retard 1
+etr retard es 1
+etr retenu 1
+etr retenu princip 1
+etr s elect 2
+etr s ur 1
+etr san inc 1
+etr sauv 1
+etr sauv ee 1
+etr sauvegard 1
+etr sauvegard ee 1
+etr scind 1
+etr scind ee 1
+etr sensibl 1
+etr sensibl sur 1
+etr si 1
+etr si lec 1
+etr sign 2
+etr sign es 1
+etr simpl 1
+etr simpl cod 1
+etr simpl elimin 1
+etr simpl impl 1
+etr simpl maintenu 1
+etr simpl modif 1
+etr simpl sp 1
+etr simplif 2
+etr simplif ee 1
+etr soit 2
+etr soit la 1
+etr soit st 1
+etr soit un 1
+etr sont 1
+etr sont connus 1
+etr souhait 1
+etr soum 1
+etr sp 1
+etr sp ec 1
+etr substitu 1
+etr substitu es 1
+etr suiv 1
+etr suiv le 1
+etr sup 1
+etr sup erieur 1
+etr suppl 1
+etr suppl ementair 1
+etr supprim 1
+etr supprim ee 1
+etr supprim es 1
+etr susceptibl 1
+etr susceptibl daggraver 1
+etr synth 1
+etr synth es 1
+etr tel 1
+etr tel qu 1
+etr temporair 1
+etr temporair rang 1
+etr test 2
+etr test ee 1
+etr tr 3
+etr tr es 3
+etr trait 3
+etr trait ee 2
+etr trait es 2
+etr transform 1
+etr transform ee 1
+etr transm 1
+etr transm aux 1
+etr trompeus 1
+etr trop 1
+etr trop import 1
+etr trouv 2
+etr trouv es 2
+etr un 3
+etr un comp 1
+etr un list 1
+etr un op 1
+etr un quest 1
+etr un repr 1
+etr un var 1
+etr unif 1
+etr unif es 1
+etr unimodulair 1
+etr util 2
+etr util ee 2
+etr util es 1
+etr v erif 1
+etr val 1
+etr val es 1
+etr visibl 1
+etr visibl de 1
+etr visu 2
+etr viv 1
+etr vu 3
+etr vu com 3
+etr vus 1
+etr vus com 1
+etrait 1
+etrait usuel 1
+etrang 1
+etrim 1
+etrim de 1
+etrim de retour 1
+etriqu 2
+etriqu ayant 1
+etriqu de 1
+etriqu de ce 1
+etriqu de don 1
+etriqu la 1
+etriqu la pag 1
+etriqu plus le 1
+etriqu po 1
+etriqu po edent 1
+etroit 2
+etroit avec 1
+etroit avec lac 1
+etroit li 1
+etroit li ee 1
+etrol 1
+etruirait 1
+etruirait le 1
+etruirait le bon 1
+etruit 2
+etruit nappar 1
+etruit nappar pa 1
+etruit nest 1
+etruit par 1
+etruit par appl 1
+etruit par lop 1
+etruit potentiel 1
+etruit potentiel le 1
+etter 1
+etud 5
+etud a tout 1
+etud ant 1
+etud ant erieur 1
+etud approfon 1
+etud approfon de 1
+etud arithm 1
+etud arithm etiqu 1
+etud attribu 1
+etud attribu un 1
+etud aux 1
+etud aux ca 1
+etud ce 1
+etud ce ph 1
+etud compar 1
+etud compar syst 1
+etud comport 1
+etud comport deux 1
+etud d ep 1
+etud d etail 1
+etud dam 1
+etud dam elior 1
+etud de 2
+etud de cat 1
+etud de diff 1
+etud de la 1
+etud de lexempl 1
+etud de particularit 1
+etud de perform 1
+etud de se 1
+etud de touat 1
+etud de var 1
+etud de zorn 1
+etud du 3
+etud du ca 1
+etud du caract 1
+etud du comport 1
+etud du contr 1
+etud du paragraph 1
+etud du ph 1
+etud e au 1
+etud e ce 1
+etud e dan 1
+etud e le 1
+etud e sur 1
+etud eclaircit 1
+etud eclaircit le 1
+etud ee 4
+etud ee dan 1
+etud ee de 1
+etud ee egal 1
+etud ee par 2
+etud ee qu 1
+etud effectu 1
+etud effectu ee 1
+etud egal 1
+etud egal un 1
+etud empiriqu 2
+etud empiriqu du 1
+etud empiriqu nous 1
+etud empiriqu se 1
+etud en 1
+etud en profondeur 1
+etud es 3
+etud es dan 1
+etud es peut 1
+etud et de 1
+etud et doiv 1
+etud et le 1
+etud et lordr 1
+etud exp 1
+etud exp erim 1
+etud il 1
+etud il appar 1
+etud individuel 1
+etud individuel de 1
+etud la 2
+etud la converg 1
+etud la distribut 1
+etud le 2
+etud le comport 2
+etud le param 1
+etud le ph 1
+etud le trac 1
+etud men 1
+etud men ee 1
+etud ne 1
+etud ne pren 1
+etud nous 1
+etud nous serviront 1
+etud ont 1
+etud particip 1
+etud particl 1
+etud peut 1
+etud peut sexpliquer 1
+etud pilot 1
+etud pilot sur 1
+etud pr 1
+etud pr eal 1
+etud puisquil 1
+etud puisquil mot 1
+etud qu 1
+etud qu le 1
+etud qu nous 1
+etud quantitativ 1
+etud quantitativ son 1
+etud se 1
+etud se sont 1
+etud sont 1
+etud sur 1
+etud sur le 1
+etud tout 1
+etud tout dabord 1
+etud un grand 1
+etudieron 1
+etudieron donc 1
+etudieron donc en 1
+etudieron seront 1
+etudieron seront de 1
+etxk 1
+eu 3
+eu cr 1
+eu cr eat 1
+eu de 2
+eu de cr 1
+eu de nombreus 1
+eu de point 1
+eu le 1
+eu le droit 1
+eu lieu 2
+eu lieu de 1
+eu lieu le 1
+eubank 1
+eucl 3
+eucl de 3
+eucl de ce 1
+eucl de deux 1
+eucl de dim 1
+eucl de xi 1
+eucl dun 1
+eucl dun matr 1
+eucl et davoir 1
+eucl pour 1
+eucl pour chaqu 1
+eucl successiv 1
+eucl successiv de 1
+euclidean 8
+euclidean dist 4
+euclidean dist funct 1
+euclidean dist measur 1
+euclidean geometer 1
+euclidean graph 1
+euclidean norm 1
+euclidean scal 1
+euclidean scal produc 1
+euclidean shap 1
+euclidean shap spac 1
+euclidean spac 1
+euclidean span 1
+euclidean span tr 1
+euclidean spanner 1
+eudor 1
+eug 2
+eug neidl 1
+eug shekit 1
+eulisp 1
+eulisp ar el 1
+eulisp ar inst 1
+eulisp ar proc 1
+eulisp ar shown 1
+eulisp ar subcl 1
+eulisp ar writ 1
+eulisp both introduc 1
+eulisp break 1
+eulisp by defin 1
+eulisp concentr 1
+eulisp definit 1
+eulisp definit compr 1
+eulisp definit wish 1
+eulisp differ 1
+eulisp enforc 1
+eulisp for block 1
+eulisp group 1
+eulisp is defin 1
+eulisp is reflect 1
+eulisp langu 1
+eulisp level 1
+eulisp me 1
+eulisp modl 1
+eulisp modl schem 1
+eulisp object 1
+eulisp object system 1
+eulisp proc 1
+eulisp program 1
+eulisp rat 1
+eulisp resid 1
+eulisp that characteriz 1
+eulisplevel 1
+eur 3
+eur as 1
+eur par 1
+eur vhdl 1
+eurek 1
+eurek ar support 1
+eurisk 1
+eurisk system 1
+eurocard 1
+eurocard format 1
+eurograph 3
+eurograph uk92 1
+europ 4
+europ.sg.com 1
+europ.sg.com technolog 1
+europ.sg.com technolog hi 1
+europar 1
+europarc 1
+europarc rav 1
+europarc rav system 1
+europcar 1
+european 20
+european assoc 1
+european commun 2
+european commun agreed 1
+european commun countr 1
+european computer 2
+european computer industr 2
+european countr 1
+european design 1
+european design autom 1
+european esprit 1
+european esprit red 1
+european knowledg 1
+european knowledg acquisit 1
+european langu 1
+european mark 1
+european softwar 1
+european softwar engineer 1
+european symp 1
+european teleinformat 1
+european work 1
+european work se 1
+eussir 1
+eussir alor 1
+eussir alor qu 1
+eussit 1
+eussit a son 1
+eussit si 1
+eussit si le 1
+eussit si son 1
+eut 1
+eutil 2
+eutil avec 1
+eutil avec echec 1
+eutil contradictoir 1
+eutil d es 1
+eutil de 2
+eutil de bloc 1
+eutil de ce 1
+eutil de cel 1
+eutil de don 1
+eutil de enregister 1
+eutil de environ 1
+eutil de la 1
+eutil de lenviron 1
+eutil de point 1
+eutil denviron 1
+eutil denviron est 1
+eutil du 2
+eutil du aux 1
+eutil du point 1
+eutil dun 1
+eutil dun point 1
+eutil dynamiqu 1
+eutil dynamiqu de 1
+eutil e avant 1
+eutil ee 1
+eutil en 1
+eutil en lectur 1
+eutil es 1
+eutil es dan 1
+eutil est 1
+eutil est typiqu 1
+eutil et de 1
+eutil et nest 1
+eutil et provoqu 1
+eutil inter 1
+eutil inter claus 1
+eutil intr 1
+eutil intr claus 1
+eutil le 1
+eutil le environ 1
+eutil lenviron 1
+eutil lenviron cour 1
+eutil ou 1
+eutil ou de 1
+eutil par 1
+eutil par la 1
+eutil sappliqu 1
+eutil sappliqu aus 1
+eutil si 1
+eutil si lit 1
+eutil spat 1
+eutil spat est 1
+eutilisabl 1
+eutiliser 1
+eutiliser ce 1
+eutiliser ce enregister 1
+eutiliser la 1
+eutiliser la cel 1
+eutiliser le 1
+eutiliser le cel 1
+eutiliser le cod 1
+eutiliser le point 1
+eutiliser lenregister 1
+eutiliser lenregister dactiv 1
+eutiliser lenviron 1
+eutiliser lenviron de 1
+eutiliser un environ 1
+euug 1
+eux 4
+eux m em 2
+eux m me 1
+eux on en 1
+eux ont 1
+eux ont toujour 1
+eux par 1
+eux qu 1
+eux qu provoqu 1
+ev 17
+ev cal 1
+ev connect 1
+ev cr 1
+ev cr inst 1
+ev del 1
+ev del inst 1
+ev disconnect 1
+ev distribut 6
+ev div 1
+ev divid 1
+ev el 1
+ev el couteux 1
+ev el ee 1
+ev elent 1
+ev elent tr 1
+ev eler 1
+ev elop 1
+ev elop es 1
+ev en 3
+ev en de 1
+ev en dit 1
+ev en est 1
+ev en ind 1
+ev en nombreux 1
+ev en particl 1
+ev en pen 1
+ev en peuv 1
+ev en program 1
+ev en qu 1
+ev en rar 1
+ev en tr 1
+ev en vient 1
+ev enqueu 1
+ev in ph 1
+ev iv 1
+ev le 3
+ev le droit 1
+ev le eff 1
+ev le principaux 1
+ev nod 1
+ev nod produc 1
+ev quun 1
+ev re 1
+ev rec 1
+ev ro 1
+ev ro diku 1
+ev s2 1
+ev spf 1
+ev spf broadcast 1
+ev standard 1
+ev start 1
+ev stop 1
+ev system 1
+ev we ch 1
+eval 6
+eval and boolean 1
+eval and eval 1
+eval ar straightfor 1
+eval axiomatiz 1
+eval begin 1
+eval begin correspon 1
+eval begin self 1
+eval con 1
+eval el 1
+eval el backtrack 1
+eval evalu 1
+eval evalu exp 1
+eval is clear 1
+eval is correct 1
+eval is equiv 1
+eval is fal 1
+eval iter 1
+eval lastnod 1
+eval mod 1
+eval narrow 1
+eval narrow bfather 1
+eval narrow cur 1
+eval of cl 1
+eval op 1
+eval proceed 1
+eval return 2
+eval sav 1
+eval self 1
+eval self exp 1
+eval tak 1
+eval thenif 1
+eval vm 1
+eval x2 1
+eval x5 1
+evalu 70
+evalu a coupl 1
+evalu a model 1
+evalu a number 1
+evalu a quel 1
+evalu accord 1
+evalu al cod 1
+evalu al el 1
+evalu al foc 1
+evalu al stud 1
+evalu algorithm 2
+evalu algorithm eval 1
+evalu algorithm found 1
+evalu algorithm specif 1
+evalu an algorithm 1
+evalu an unfold 1
+evalu and autom 2
+evalu and compar 2
+evalu and comparison 2
+evalu and enhanc 1
+evalu and iter 1
+evalu and predict 1
+evalu and sem 1
+evalu ar greed 1
+evalu as harm 1
+evalu automat 1
+evalu automat residualiz 1
+evalu ba 2
+evalu bottom 1
+evalu bottomup 1
+evalu by execut 1
+evalu by reduc 1
+evalu by rl 1
+evalu can effect 1
+evalu coh 1
+evalu coh method 1
+evalu commun 1
+evalu commun issu 1
+evalu con 2
+evalu condit 1
+evalu configur 1
+evalu conserv 1
+evalu conserv regard 1
+evalu constraint 1
+evalu constraint datab 1
+evalu continu 1
+evalu continu rl 1
+evalu correspon 1
+evalu cycl 1
+evalu cycl chang 1
+evalu dan 2
+evalu dan chaqu 1
+evalu de 4
+evalu de ce 1
+evalu de disponibilit 1
+evalu de la 2
+evalu de perform 1
+evalu de tous 1
+evalu deriv 1
+evalu determin 1
+evalu do cost 1
+evalu do impl 1
+evalu du 1
+evalu du fit 1
+evalu dun 2
+evalu dun forml 1
+evalu dun individu 1
+evalu dur unfold 1
+evalu e par 1
+evalu ea 1
+evalu ea us 1
+evalu each guard 1
+evalu each iter 1
+evalu each tim 1
+evalu ee 1
+evalu eff 1
+evalu elit 1
+evalu elit perc 1
+evalu emph 1
+evalu env 1
+evalu environm 1
+evalu error 1
+evalu error evalu 1
+evalu es 1
+evalu es en 1
+evalu execut 1
+evalu exp 1
+evalu exp env 1
+evalu fail 1
+evalu find 1
+evalu foc 1
+evalu follow 2
+evalu for concur 1
+evalu for datalog 1
+evalu for fl 1
+evalu for point 1
+evalu for sa 1
+evalu for schem 1
+evalu forc 1
+evalu framework 1
+evalu funct 1
+evalu funct symbol 1
+evalu further 1
+evalu further optim 1
+evalu hyperm 1
+evalu hyperm ba 1
+evalu in cl 1
+evalu in incr 1
+evalu in order 1
+evalu in parallel 1
+evalu in pract4 1
+evalu in sect 1
+evalu in sequ 1
+evalu in term 1
+evalu in tim 1
+evalu inclus 1
+evalu inclus ext 1
+evalu indep 1
+evalu is appl 1
+evalu is bottom 1
+evalu is car 1
+evalu is finit 1
+evalu is giv 2
+evalu is integr 1
+evalu is nec 1
+evalu is transfer 1
+evalu langu 1
+evalu langu outlin 1
+evalu le 1
+evalu le configur 1
+evalu lexpr 1
+evalu lexpr arithm 1
+evalu me 1
+evalu me object 1
+evalu mean 1
+evalu mechan 1
+evalu med 1
+evalu method 1
+evalu method appl 1
+evalu method correct 1
+evalu method tr 1
+evalu method work 1
+evalu model 1
+evalu must proceed 1
+evalu new implem 1
+evalu object 1
+evalu object run 1
+evalu obtain 1
+evalu of buffer 1
+evalu of cal 1
+evalu of comput 1
+evalu of csg 1
+evalu of currexp 1
+evalu of dat 1
+evalu of datab 1
+evalu of datalog 1
+evalu of direct 1
+evalu of ec 1
+evalu of exact 1
+evalu of expr 1
+evalu of fic 1
+evalu of funct 1
+evalu of heur 1
+evalu of human 1
+evalu of kcm 1
+evalu of lat 1
+evalu of low 1
+evalu of me 1
+evalu of memor 1
+evalu of multicast 1
+evalu of operand 1
+evalu of prob 1
+evalu of protect 1
+evalu of rel 1
+evalu of result 2
+evalu of retrospect 1
+evalu of satisf 1
+evalu of self 1
+evalu of synchron 1
+evalu of tap 1
+evalu of tempor 1
+evalu of theorem 1
+evalu of tim 1
+evalu of user 1
+evalu of util 1
+evalu order 2
+evalu our algorithm 1
+evalu our regr 1
+evalu our techniqu 1
+evalu par 1
+evalu par linterm 1
+evalu partiel 1
+evalu partiel afin 1
+evalu partiel peut 1
+evalu partiel3 1
+evalu point 1
+evalu pour 1
+evalu pour donc 1
+evalu pr 1
+evalu prob 1
+evalu prob distribut 1
+evalu proceed 1
+evalu proceed bottom 1
+evalu prompt 1
+evalu prompt strateg 1
+evalu qu 1
+evalu qu le 1
+evalu ra 1
+evalu reach 1
+evalu recur 1
+evalu recur interpr 1
+evalu refer 1
+evalu requir 2
+evalu result 2
+evalu revisit 1
+evalu rl 1
+evalu sequ 1
+evalu sever tim 1
+evalu simultan 1
+evalu softwar 1
+evalu softwar visu 1
+evalu som repr 1
+evalu som subexpr 1
+evalu specializ 1
+evalu start 1
+evalu start continu 1
+evalu start rl 1
+evalu stat 1
+evalu strateg 2
+evalu stud 2
+evalu stud suggest 1
+evalu succ 1
+evalu succ inl 1
+evalu techniqu 3
+evalu tempor 1
+evalu tempor algebr 1
+evalu termin 1
+evalu th act 1
+evalu th approach 1
+evalu th boolean 1
+evalu th bottom 1
+evalu th commun 2
+evalu th compl 1
+evalu th constraint 1
+evalu th cost 1
+evalu th del 1
+evalu th effect 2
+evalu th expr 2
+evalu th form 1
+evalu th init 1
+evalu th input 1
+evalu th inter 1
+evalu th me 1
+evalu th memor 1
+evalu th multilevel 1
+evalu th number 1
+evalu th origin 1
+evalu th perform 8
+evalu th polyhedr 1
+evalu th prop 2
+evalu th qu 3
+evalu th recur 1
+evalu th rel 1
+evalu th reus 1
+evalu th suit 1
+evalu th think 1
+evalu th third 1
+evalu th tim 2
+evalu th veloc 1
+evalu their merit 1
+evalu their perform 1
+evalu their respect 1
+evalu through built 1
+evalu tim 1
+evalu to addr 1
+evalu to boolean 1
+evalu to fal 3
+evalu to illustr 1
+evalu to me 1
+evalu to produc 1
+evalu to weak 1
+evalu to zer 1
+evalu tw con 1
+evalu tw loop 1
+evalu uniqu 1
+evalu util 2
+evalu util es 1
+evalu valu 2
+evalu variabl 1
+evalu vm 1
+evalu vm ba 1
+evalu wer compar 1
+evalu whether lif 1
+evalu with respect 1
+evaluabl 1
+evaluateur 1
+evaluateur partiel 1
+evaluateur partiel de 1
+evaluer 2
+evaluer le 1
+evaluer le fit 1
+evaluer leur 1
+evaluer leur fit 1
+evaluer xc 1
+evalueron 1
+evalueron no 1
+evalueron no transform 1
+evalut 1
+evalut th commun 1
+evan 1
+evan tick 1
+evan tick put 1
+evar 1
+evar diku.dk 1
+evar.html 1
+evastateur 1
+evastateur du 1
+evastateur du ph 1
+evaul 1
+evcont 1
+evcont in a3 1
+evcont rl 1
+evd 1
+evelop 3
+evelop darchitectur 1
+evelop darchitectur mult 1
+evelop doutil 1
+evelop doutil th 1
+evelop dun 1
+evelop dun mach 1
+evelop e au 1
+evelop e le 1
+evelop e par 1
+evelop e sur 1
+evelop e un 1
+evelop ee 2
+evelop ee au 2
+evelop ee dan 2
+evelop ee par 1
+evelop ee sont 1
+evelop es 2
+evelop es pour 1
+evelop est 1
+evelop est qu 1
+evelop futur 1
+evelop futur avant 1
+evelop marqu 1
+evelop marqu de 1
+evelopper 2
+evelopper de 1
+evelopper de nouveaux 1
+evelopper un eff 1
+eveloppon 1
+eveloppon de 1
+eveloppon de fa 1
+even 1
+even rar 1
+evenind 1
+evenind proc 1
+event 32
+event a instruc 1
+event and e2 1
+event appl 1
+event appl int 1
+event ar announc 1
+event ar divid 1
+event ar pl 1
+event ar read 1
+event ar standard 1
+event ar writ 1
+event ba 1
+event ba program 1
+event being pa 1
+event calculus 1
+event captur 1
+event de 1
+event descript 1
+event dest 1
+event driv 3
+event driv siml 2
+event e1 1
+event ec 1
+event ei 1
+event ei rout 1
+event either model 1
+event ev 1
+event ev enqueu 1
+event export 1
+event fir 1
+event fir pfp 1
+event format 1
+event format io 1
+event from vi 1
+event gener 1
+event had incr 1
+event handl 1
+event handl mechan 1
+event handler 3
+event handler ca 1
+event handler event 1
+event handler tabl 1
+event help 1
+event help request 1
+event in system 1
+event inclus 1
+event inclus sen 1
+event int 1
+event interfac 1
+event involut 1
+event involut client 1
+event is perfect 1
+event is polynom 1
+event is schedl 1
+event join 1
+event join optim 1
+event learn 1
+event list 2
+event list mean 1
+event list wh 1
+event loop 1
+event modl 1
+event network 1
+event occur 1
+event occur siml 1
+event occur tim 1
+event occur upd 1
+event or featur 1
+event order 2
+event outweigh 1
+event pack 1
+event pack pack 1
+event proc 1
+event queu 1
+event queu scheduler 1
+event register 1
+event register spf 1
+event rel 1
+event remain 1
+event remain unconnect 1
+event rout 1
+event rout execut 1
+event sign 1
+event sign shap 1
+event siml 3
+event siml model 1
+event siml testb 1
+event step 1
+event sud 1
+event test 1
+event that model 1
+event that requir 1
+event that serv 1
+event that verif 1
+event tim 1
+event tim pair 1
+event to aid 1
+event to sign 1
+event typ 2
+event typ event 1
+event upd 1
+event upd perform 1
+event vi 1
+event vi announc 1
+event wh occur 1
+event which caus 1
+eventail 1
+eventail de 1
+eventail de ca 1
+eventhough 1
+eventhough hierarch 1
+eventhough hierarch ec 1
+eventtimestamptyp 1
+eventu 28
+eventu act 1
+eventu act t3 1
+eventu adopt 1
+eventu al group 1
+eventu al proc 1
+eventu be compl 1
+eventu be found 1
+eventu be lost 1
+eventu cal 1
+eventu car 1
+eventu ch 1
+eventu compl 2
+eventu compl buffer 1
+eventu contain 1
+eventu dec 1
+eventu diverg 1
+eventu enough neighbor 1
+eventu execut 1
+eventu execut ph 1
+eventu freed 1
+eventu freed impl 1
+eventu giv 1
+eventu inclus 1
+eventu inclus inst 1
+eventu invok 1
+eventu lead 2
+eventu n se 1
+eventu obtain 1
+eventu obtain spac 1
+eventu perform 1
+eventu proc 2
+eventu produc 1
+eventu reach 6
+eventu reach pur 1
+eventu rec 1
+eventu rec me 1
+eventu reduc 1
+eventu requir 1
+eventu resatisf 1
+eventu result 1
+eventu return 1
+eventu rewrit 1
+eventu se 1
+eventu se sn 1
+eventu solut 1
+eventu term 1
+eventu termin 1
+eventu th comput 1
+eventu th program 1
+eventu th tok 1
+eventu word 1
+eventualit 1
+eventuel 3
+eventuel appl 1
+eventuel apr 1
+eventuel apr es 1
+eventuel compact 1
+eventuel compact ee 1
+eventuel coupl 1
+eventuel coupl ee 1
+eventuel d ecal 1
+eventuel de 3
+eventuel de ceuxc 1
+eventuel de div 1
+eventuel de la 1
+eventuel de retour 1
+eventuel de sp 1
+eventuel dern 1
+eventuel dern pav 1
+eventuel dilat 1
+eventuel dun 1
+eventuel dun point 1
+eventuel et de 1
+eventuel etr 2
+eventuel etr fus 1
+eventuel etr gard 1
+eventuel le 1
+eventuel le register 1
+eventuel marqu 1
+eventuel marqu es 1
+eventuel mi 1
+eventuel n ecessair 1
+eventuel non 1
+eventuel non optim 1
+eventuel pan 1
+eventuel pan catastrophiqu 1
+eventuel parcour 1
+eventuel pav 1
+eventuel point 1
+eventuel point de 1
+eventuel r eutil 1
+eventuel solut 1
+eventuel solut de 1
+eventuel sup 1
+eventuel sup erieur 1
+eventuel transform 1
+eventuel transform de 1
+ever 1
+ever certain 1
+ever certain term 1
+ever et touch 1
+ever jouent 1
+ever laffect 1
+ever laffect destruc 1
+everd 1
+eversibl 1
+eversibl a la 1
+eversibl a par. 1
+eversibl a partir 1
+eversibl ain 1
+eversibl ain qu 1
+eversibl de 1
+eversibl de man 1
+eversibl est 1
+eversibl est cruc 1
+eversibl et autr 1
+eversibl et de 1
+eversibl la 1
+eversibl la mi 1
+eversibl nous 1
+eversibl par 1
+eversibl par le 1
+eversibl par sub. 1
+eversibl par substitut 1
+eversibl peuv 1
+evertsz 1
+everyd 2
+everyd lif 1
+everywh 5
+everywh high nonuniform 1
+evict 1
+evict de 1
+evict de aut 1
+evid 24
+evid by transact 1
+evid dautr 1
+evid dautr op 1
+evid dun 1
+evid dun part 1
+evid en 1
+evid en faveur 1
+evid for justif 1
+evid for prop 1
+evid from ethnomethodolog 1
+evid gather 1
+evid is assum 1
+evid is nec 1
+evid is obtain 1
+evid is slow 1
+evid lordr 1
+evid lordr de 1
+evid of assoc 1
+evid of eff 1
+evid or contextu 1
+evid quentr 1
+evid quentr repr 1
+evid th monit 1
+evid than cur 1
+evid that graph 1
+evid to dec 1
+evid to suggest 2
+evid un 1
+evid un architectur 1
+evid un nouvel 1
+evid weak 1
+evidem 3
+evidem de 1
+evidem de la 1
+evidem de rang 1
+evidem imp 1
+evidem imp puisquil 1
+evidem lexicopositif 1
+evidem pa 1
+evidem pa tr 1
+evidem un frein 1
+evil 1
+evil of asser 1
+eviol 1
+eviol p1 1
+eviol p1 viol 1
+evisibl 1
+evisibl et facil 1
+evit 2
+evit ain 1
+evit ain au 1
+evit ce 1
+evit ce ecueil 1
+evit ce surc 1
+evit certain 1
+evit certain acc 1
+evit d eventuel 1
+evit ee 1
+evit ee dan 1
+evit ee en 1
+evit ee gr 1
+evit ee par 1
+evit encor 1
+evit encor leff 1
+evit es 1
+evit es en 1
+evit es gr 1
+evit es program 1
+evit le 2
+evit le calcl 1
+evit le surc 1
+evit loccur 1
+evit loccur dit 1
+evit qu 1
+evit qu le 1
+evit tout 1
+evit tout recalcl 1
+evit toutef 1
+evit toutef pa 1
+eviter 3
+eviter a lenviron 1
+eviter absol 1
+eviter absol car 1
+eviter ain 1
+eviter ain loccur 1
+eviter bien 1
+eviter bien de 1
+eviter ce 1
+eviter ce ph 1
+eviter dacc 1
+eviter dacc eder 1
+eviter de 2
+eviter de op 1
+eviter de perturber 1
+eviter de tel 1
+eviter de tomber 1
+eviter jusqu 1
+eviter la 1
+eviter la cr 1
+eviter lacc 1
+eviter lacc es 1
+eviter lallong 1
+eviter lallong de 1
+eviter lattribut 1
+eviter le 3
+eviter le co 1
+eviter le faux 1
+eviter le recour 1
+eviter le tr 1
+eviter lec 1
+eviter lec ecut 1
+eviter leff 1
+eviter leff ping 1
+eviter lintroduc 1
+eviter lintroduc dun 1
+eviter loccur 1
+eviter loccur de 1
+eviter loccur dun 1
+eviter lutil 2
+eviter lutil de 1
+eviter lutil dun 1
+eviter qu 1
+eviter qu certain 1
+eviter quil 1
+eviter quil ne 1
+eviter sur 1
+eviter sur cel 1
+eviter tout 1
+eviter tout calcl 1
+eviter un 1
+eviter un lib 1
+eviter un saut 1
+eviter un tr 1
+eviter un trop 1
+evlu 1
+evlu th number 1
+evoir 1
+evoir un 1
+evoir un ph 1
+evok 1
+evok a respon 1
+evol 1
+evol eequ 1
+evol eequ tim 1
+evolu 1
+evolu et de 1
+evoluer 1
+evoluer un 1
+evoluer un popl 1
+evoluer un sel 1
+evolut 33
+evolut a cl 1
+evolut a propag 1
+evolut a system 1
+evolut addit 1
+evolut addit direct 1
+evolut algebr 1
+evolut algebr approach 1
+evolut algebr form 1
+evolut algebr prov 1
+evolut algebr se 1
+evolut algorithm 1
+evolut and appl 1
+evolut and co 1
+evolut and conserv 1
+evolut and genet 1
+evolut and learn 1
+evolut and maint 1
+evolut and model 1
+evolut and reus 1
+evolut ar ba 1
+evolut ar detail 1
+evolut aspect 1
+evolut by me 1
+evolut compon 1
+evolut compon interfac 1
+evolut confus 1
+evolut confus result 1
+evolut correspon 1
+evolut de 4
+evolut de ce 1
+evolut de etr 1
+evolut de la 1
+evolut de lalgorithm 1
+evolut de organ 1
+evolut de techniqu 1
+evolut de technolog 1
+evolut de variabl 1
+evolut developm 1
+evolut dic 1
+evolut dic ecut 1
+evolut discover 1
+evolut distribut 1
+evolut distribut system 1
+evolut du 1
+evolut du mod 1
+evolut dynam 1
+evolut exper 2
+evolut exper modl 1
+evolut exper obtain 1
+evolut futur 1
+evolut futur du 1
+evolut genet 2
+evolut in object 1
+evolut in tim 1
+evolut is concern 1
+evolut is support 1
+evolut knowledg 1
+evolut langu 1
+evolut natur 2
+evolut naturel 1
+evolut naturel de 1
+evolut of bus 1
+evolut of computer 1
+evolut of integr 1
+evolut of intellig 1
+evolut of knowledg 1
+evolut of object 2
+evolut of pot 1
+evolut of requir 1
+evolut of spec 1
+evolut on ec 1
+evolut pa 1
+evolut pa ee 1
+evolut parasit 1
+evolut parasit improv 1
+evolut perform 1
+evolut perform improv 1
+evolut principl 1
+evolut proc 2
+evolut procedur 1
+evolut program 3
+evolut spec 1
+evolut spec net 1
+evolut strateg 2
+evolut techniqu 1
+evolut th cl 1
+evolut th propag 1
+evolut th system 1
+evolut to construc 1
+evolut to cop 1
+evolut to datab 1
+evolut to elong 1
+evolut to inclus 1
+evolut var 1
+evolut var length 1
+evolut when cl 1
+evolutionsstrateg 1
+evolutionsstrateg optimierung 1
+evolutionsstrateg optimierung technisch 1
+evoqu 3
+evoqu de 1
+evoqu de nouvel 1
+evoqu e pr 1
+evoqu ee 3
+evoqu ee ci 1
+evoqu ee dan 2
+evoqu ee sous 1
+evoqu le 1
+evoqu le fait 1
+evoqu quelqu 1
+evoqu quelqu perspectiv 1
+evoqu un 1
+evoqu un ex 1
+evoquer 1
+evoquer concern 1
+evoquer concern la 1
+evr 1
+evstart 1
+evy 1
+ew 1
+ew0 1
+ewan 1
+ewan klein 1
+ewen 1
+ewk 1
+ewsl 1
+ex 6
+ex as univer 1
+ex de 1
+ex de oe 1
+ex ecu. 1
+ex ecut 4
+ex ecut chaqu 1
+ex ecut de 4
+ex ecut dun 1
+ex ecut ee 3
+ex ecut es 2
+ex ecut lalgorithm 1
+ex ecut le 2
+ex ecut par 2
+ex ecut pipelin 1
+ex ecut plusieur 1
+ex ecut sar 1
+ex ecut se 1
+ex ecut simultan 1
+ex ecut sur 1
+ex ecuter 2
+ex ecuter de 1
+ex ecuter dit 1
+ex ecuter en 2
+ex ecuter le 1
+ex ecuter un 2
+ex sen 1
+ex. 1
+exacerb 2
+exacerb for react 1
+exacerb th problem 1
+exact 71
+exact 2b 1
+exact a chaqu 1
+exact a la 1
+exact a polynom 1
+exact a singl 1
+exact amount 1
+exact an 1
+exact and eff 1
+exact and other 1
+exact as async 1
+exact au 1
+exact au parcour 1
+exact ca 1
+exact calcl 1
+exact com 1
+exact com tb 1
+exact comput 1
+exact dat 1
+exact dat oi 1
+exact de 2
+exact de la 1
+exact de longu 1
+exact de migr 1
+exact de pseud 1
+exact definit 1
+exact dep 1
+exact dep an 1
+exact determin 1
+exact du 2
+exact du fait 1
+exact du prem 1
+exact elim 1
+exact en 1
+exact en nombr 1
+exact ev tim 1
+exact fib 1
+exact form 1
+exact forml 1
+exact half 1
+exact in tim 1
+exact is cruc 1
+exact jr 1
+exact k el 1
+exact la 2
+exact la plac 1
+exact la propag 1
+exact le 1
+exact le co 1
+exact le point 1
+exact li 1
+exact li swap 1
+exact lik cel 1
+exact lin 1
+exact lin segm 1
+exact link 2
+exact link cost 2
+exact margin 1
+exact margin distribut 1
+exact match 3
+exact me 1
+exact method 3
+exact method ap 1
+exact natur 1
+exact nk 1
+exact number 2
+exact oe 1
+exact oe cel 1
+exact on atom 1
+exact on boolean 1
+exact on child 1
+exact on color 1
+exact on direct 1
+exact on endpoint 1
+exact on host 1
+exact on hyperedg 1
+exact on me 1
+exact on nod 1
+exact on opt 1
+exact on pa 1
+exact on pot 1
+exact on proc 2
+exact on tok 1
+exact on typ 1
+exact on var 1
+exact onc deliv 1
+exact our deonit 1
+exact point 1
+exact posit 1
+exact posit quer 1
+exact pot 1
+exact pour 1
+exact pour la 1
+exact precondit 1
+exact precondit avail 1
+exact prob 1
+exact prob valu 1
+exact propag 1
+exact propag schem 1
+exact ptim 1
+exact qu 1
+exact qu rel 1
+exact quadr 1
+exact quadr mirror 1
+exact refer 1
+exact rep 1
+exact rep init 1
+exact rep train 1
+exact sam pattern 1
+exact satisf 1
+exact simplif 1
+exact simplif conjunct 1
+exact solut 2
+exact solut vect 1
+exact tent 1
+exact tent de 1
+exact th ba 1
+exact th fact 1
+exact th guaranteed 1
+exact th ith 1
+exact th minim 2
+exact th modif 1
+exact th number 1
+exact th rat 1
+exact th se 1
+exact th test 1
+exact th tim 2
+exact th unnec 1
+exact that bound 1
+exact thr al 1
+exact thr argum 1
+exact thr ver 1
+exact to comput 1
+exact to find 1
+exact tw 1
+exact tw cal 1
+exact tw nod 2
+exact tw tim 1
+exact tw ver 1
+exact und 1
+exact univer 1
+exact valu 1
+exact valu obtain 1
+exact ver 1
+exact ver cover 1
+exact wh 2
+exact what cl 1
+exam 12
+exam de 1
+exam de linflu 1
+exam of connect 1
+exam of st 1
+exam of system 1
+exam of tabl 1
+exam. 1
+examin 43
+examin a var 1
+examin after train 1
+examin al eight 1
+examin an exampl 1
+examin an omnisc 1
+examin and form 1
+examin and modif 1
+examin aud 1
+examin both tran 1
+examin by baykan 1
+examin by compar 1
+examin by got 1
+examin connect 1
+examin connect se 1
+examin dur train 1
+examin e la 1
+examin ee 1
+examin equ 1
+examin es 2
+examin es de 1
+examin ev wor 1
+examin fil 1
+examin fil modif 1
+examin in depth 1
+examin in detail 1
+examin in sect 1
+examin in turn 1
+examin inclus 1
+examin inclus pipelin 1
+examin it find 1
+examin la 1
+examin le 1
+examin le born 1
+examin linflu 1
+examin linflu de 1
+examin mj 1
+examin mor crit 1
+examin network 1
+examin nontr 1
+examin nontr edg 1
+examin onl non 1
+examin ordin 1
+examin ordin heap 1
+examin our experim 1
+examin queu 1
+examin rol 1
+examin rol rol 1
+examin som ec 1
+examin stack 1
+examin stack entr 1
+examin stat 1
+examin stat styl 1
+examin succ 1
+examin switch 1
+examin switch interconnect 1
+examin th 2jth 1
+examin th behavior 2
+examin th ca 1
+examin th chang 1
+examin th cl 1
+examin th concept 2
+examin th condit 1
+examin th cont 1
+examin th cost 1
+examin th decl 1
+examin th degrad 1
+examin th dep 1
+examin th differ 1
+examin th effect 2
+examin th entr 1
+examin th expect 1
+examin th fam 1
+examin th gener 1
+examin th hist 1
+examin th impact 2
+examin th implem 1
+examin th ind 1
+examin th me 1
+examin th parallel 2
+examin th perform 1
+examin th ph 1
+examin th pot 1
+examin th prelimin 1
+examin th proc 1
+examin th rel 1
+examin th relationship 1
+examin th scal 1
+examin th se 1
+examin th sourc 1
+examin th status 1
+examin th tabl 1
+examin th task 1
+examin th var 1
+examin thr discr 1
+examin visu 1
+examin way 1
+examin whether build 1
+examinateur 2
+examinateur andr 1
+examinateur jean 1
+examinateur jean claud 1
+examinateur william 1
+examinateur william jalb 1
+examinatr 1
+examinatr mm 1
+examiner 1
+examiner le 1
+examiner le ca 1
+examinon 1
+examinon le 1
+examinon le successiv 1
+exampl 118
+exampl a fragm 1
+exampl adapt 1
+exampl addr 1
+exampl aff 1
+exampl aff variabl 1
+exampl after loop 1
+exampl after til 1
+exampl al suggest 1
+exampl an anonym 1
+exampl an object 1
+exampl and explain 1
+exampl and rat 1
+exampl ar 1
+exampl ar avail 1
+exampl ar creat 1
+exampl ar csp 1
+exampl ar dat 1
+exampl ar depict 1
+exampl ar displ 1
+exampl ar intel 2
+exampl ar pr 1
+exampl ar render 1
+exampl ar shown 1
+exampl ba 1
+exampl ba level 1
+exampl backtrack 1
+exampl backtrack retract 1
+exampl be found 1
+exampl be handl 1
+exampl becom 2
+exampl becom 12a 1
+exampl can var 1
+exampl circl.squar.sqr 1
+exampl comput 1
+exampl comput ba 1
+exampl con 1
+exampl consider 1
+exampl dag 1
+exampl dag disc 1
+exampl dat 1
+exampl demonstr 3
+exampl diagram 1
+exampl encounter 1
+exampl experim 1
+exampl expr 1
+exampl fact 1
+exampl fact structur 1
+exampl featur 1
+exampl featur vect 1
+exampl figur 2
+exampl follow 1
+exampl for constrain 1
+exampl for extract 1
+exampl for relac 1
+exampl from comput 1
+exampl from sect 1
+exampl from user 1
+exampl fsign 1
+exampl further 1
+exampl gib 1
+exampl gib sampl 1
+exampl giv 3
+exampl graph 1
+exampl hav firm 1
+exampl hist 1
+exampl hist rel 1
+exampl if pi 1
+exampl illustr 9
+exampl illustr why 1
+exampl impl 1
+exampl in cr 2
+exampl in figur 4
+exampl in learn 1
+exampl in sect 1
+exampl inclus 3
+exampl inclus bal 1
+exampl inclus system 1
+exampl interleav 1
+exampl is character 1
+exampl is depict 1
+exampl is giv 2
+exampl is loop 1
+exampl is modif 1
+exampl is program 1
+exampl is pur 1
+exampl is shown 7
+exampl is simil 1
+exampl is simpl 1
+exampl is sup 1
+exampl is unfold 1
+exampl it becom 1
+exampl k ary 2
+exampl loc 2
+exampl loc indep 1
+exampl longer 1
+exampl longer dist 1
+exampl mesh 1
+exampl method 1
+exampl method ba 1
+exampl minim 1
+exampl minim fil 1
+exampl modif 1
+exampl modl 2
+exampl modl definit 1
+exampl modl using 1
+exampl msld 1
+exampl msld deriv 1
+exampl n explicit 1
+exampl network 1
+exampl network configur 1
+exampl no doubt 1
+exampl of algorithm 1
+exampl of ap 1
+exampl of appl 1
+exampl of ar 1
+exampl of buttner 1
+exampl of cal 1
+exampl of character 1
+exampl of compon 1
+exampl of con 1
+exampl of configur 1
+exampl of dataflow 1
+exampl of decl 1
+exampl of defin 1
+exampl of design 2
+exampl of difficult 1
+exampl of fault 1
+exampl of figur 2
+exampl of flat 1
+exampl of glob 1
+exampl of graph 2
+exampl of imag 1
+exampl of langu 1
+exampl of loc 1
+exampl of loop 1
+exampl of modl 1
+exampl of mov 1
+exampl of mult 1
+exampl of nest 1
+exampl of observabl 1
+exampl of parallel 1
+exampl of partit 1
+exampl of prev 2
+exampl of problem 1
+exampl of record 1
+exampl of remov 1
+exampl of rol 1
+exampl of sc 1
+exampl of scal 1
+exampl of sect 3
+exampl of specif 1
+exampl of split 1
+exampl of switch 1
+exampl of system 1
+exampl of theorem 1
+exampl of tight 1
+exampl of train 1
+exampl of typ 2
+exampl of unfold 1
+exampl of unidirect 1
+exampl of us 1
+exampl of wait 1
+exampl of work 1
+exampl onl consider 1
+exampl p1 1
+exampl p1 ss 1
+exampl pattern 1
+exampl polymorph 1
+exampl polymorph caus 1
+exampl pr 2
+exampl pr earl 1
+exampl quer 2
+exampl quer oe1 1
+exampl r1 1
+exampl refer 1
+exampl requir 1
+exampl rl 1
+exampl se 1
+exampl se sect 1
+exampl show 10
+exampl show good 1
+exampl system 2
+exampl system consider 1
+exampl tak 2
+exampl tdfg 1
+exampl tdfg nod 1
+exampl th configur 1
+exampl th curv 1
+exampl th direct 1
+exampl th leftmost 1
+exampl th lin 2
+exampl th load 1
+exampl th loop 1
+exampl th mean 1
+exampl th multipl 1
+exampl th problem 1
+exampl th prolog 1
+exampl th result 1
+exampl th situ 1
+exampl th theor 1
+exampl th top 1
+exampl th tot 1
+exampl th vendor 1
+exampl that cover 1
+exampl that illustr 1
+exampl that us 1
+exampl to illustr 1
+exampl to motiv 3
+exampl to show 3
+exampl using 1
+exampl using le 1
+exampl verif 1
+exampl we distingu 1
+exampl we encod 1
+exampl we produc 1
+exampl we show 3
+exampl wh 8
+exampl wh closur 1
+exampl wh perform 1
+exampl wh text 1
+exampl when cluster 2
+exampl with ts 1
+exampl.6 1
+exampl1 2
+exampl1 pr 1
+exampl2 1
+exbf 1
+exbf allow 1
+exbf and seg 1
+exbf by examin 1
+exbf pack 1
+exbf perform 1
+exc 12
+exc ar shar 1
+exc bandwidth 1
+exc bandwidth avail 1
+exc but tran 1
+exc cumbersom 1
+exc de 1
+exc de point 1
+exc del 1
+exc del du 1
+exc high degr 1
+exc inherit 1
+exc inherit depth 1
+exc inv 1
+exc join 1
+exc join oper 1
+exc load 1
+exc nod 1
+exc norm 1
+exc norm serv 1
+exc rad 1
+exc serv 1
+exc serv receiv 1
+exc siz 1
+exc slow 1
+exceed 26
+exceed 2l 1
+exceed a record 1
+exceed log 1
+exceed npeak 1
+exceed on record 1
+exceed our predict 1
+exceed som ch 1
+exceed th bound 1
+exceed th cap 1
+exceed th construc 1
+exceed th entir 1
+exceed th error 1
+exceed th lim 1
+exceed th logarithm 1
+exceed th number 1
+exceed th offer 2
+exceed th payoff 1
+exceed th pot 1
+exceed th soft 1
+exceed th system 1
+exceed th tim 1
+exceed th tot 1
+exceed th window 1
+exceed toler 1
+exceed toler lim 1
+exceed tx 1
+excel 11
+excel accompan 1
+excel accompan disc 1
+excel award 1
+excel framework 1
+excel graph 1
+excel graph partit 1
+excel isol 1
+excel isol proper 1
+excel match 1
+excel match schem 1
+excel ol 1
+excel ol autom 1
+excel result 1
+excel tool 1
+except 21
+except ar ken 1
+except ar noncoordin 1
+except au 1
+except au voisin 1
+except behaviour 1
+except complec 1
+except fait 1
+except fait de 1
+except handl 1
+except is bbmat 1
+except mechan 1
+except ne 1
+except ne sont 1
+except of rothberg 1
+except of speech 1
+except situ 1
+except1 1
+excessiv 4
+excessiv complec 2
+excessiv complec donc 1
+excessiv elev 1
+excessiv elev ee 1
+excessiv int 1
+excessiv int re 1
+exchang 27
+exchang a me 1
+exchang accord 1
+exchang among internet 1
+exchang and adapt 1
+exchang and link 1
+exchang ar nec 1
+exchang between mat 1
+exchang control 1
+exchang control panel 1
+exchang el 1
+exchang for uniform 1
+exchang format 1
+exchang fract 1
+exchang in network 1
+exchang inform 2
+exchang me 5
+exchang me compr 1
+exchang most comput 1
+exchang nec 1
+exchang nec dat 1
+exchang network 1
+exchang of pivot 1
+exchang on appl 1
+exchang oper 1
+exchang p subsequ 1
+exchang plac 1
+exchang rat 1
+exchang th singl 1
+exchang to support 1
+exchang unit 1
+exchanger 1
+exclam 1
+exclam mark 1
+exclu 2
+exclu tout 1
+exclu tout risqu 1
+exclus 37
+exclus acc 2
+exclus act 1
+exclus al method 1
+exclus and st 1
+exclus and upd 1
+exclus any preproc 1
+exclus any subsequ 1
+exclus ba 1
+exclus begin 1
+exclus blank 1
+exclus blank lin 1
+exclus by block 1
+exclus claus 1
+exclus coarsegrain 1
+exclus coarsegrain algorithm 1
+exclus control 1
+exclus definit 1
+exclus execut 1
+exclus execut mod 1
+exclus fin 1
+exclus fin grain 1
+exclus follow 1
+exclus from consider 1
+exclus from cur 1
+exclus gismon 1
+exclus gismon3 1
+exclus in distribut 1
+exclus in polynom 1
+exclus mechan 1
+exclus mechan pl 1
+exclus mod 1
+exclus modl 1
+exclus of distinct 1
+exclus or oper 1
+exclus reaeect 1
+exclus reg 2
+exclus reg en 1
+exclus relationship 1
+exclus result 1
+exclus serv 1
+exclus sub 1
+exclus such level 1
+exclus test 1
+exclus th ca 1
+exclus th gm 1
+exclus th hotspot 1
+exclus th po 1
+exclus th us 1
+exclus writ 1
+exclusif 1
+exclusif dan 1
+exclusiv 1
+exclusiv cr 1
+exclusiveor 1
+execut 77
+execut a common 1
+execut a cycl 1
+execut a db 1
+execut a glob 1
+execut a lifelong 1
+execut a lock 1
+execut a loop 2
+execut a nod 1
+execut a particl 1
+execut a ph 1
+execut a rec 1
+execut a report 1
+execut a rout 1
+execut a sequ 1
+execut a swap 1
+execut a0 1
+execut accord 1
+execut act 3
+execut act t1 1
+execut act t4 1
+execut after extract 1
+execut agent 1
+execut al oper 1
+execut algorithm 1
+execut an entir 1
+execut an upd 1
+execut and actu 1
+execut and disc 1
+execut and execut 1
+execut and learn 1
+execut and result 1
+execut another oper 1
+execut any funct 1
+execut any program 1
+execut any writ 1
+execut appropr 1
+execut appropr addit 1
+execut as fast 1
+execut as follow 1
+execut asynchron 3
+execut asynchron rec 1
+execut at appropr 1
+execut at tim 2
+execut atom 1
+execut becom 2
+execut becom prim 1
+execut befor i0 1
+execut benchmark 1
+execut benchmark program 1
+execut bod 1
+execut bod liter 1
+execut both ph 1
+execut built 1
+execut by cal 1
+execut by mach 1
+execut by self 1
+execut cal 1
+execut can ec 1
+execut cannot fail 1
+execut cb3 1
+execut chang 2
+execut chang cod 1
+execut charm 1
+execut charm kernel 1
+execut cod 6
+execut cod correspon 1
+execut com 1
+execut compon 1
+execut comput 1
+execut comput agent 1
+execut concat 1
+execut concur 3
+execut condit 2
+execut condit condit 1
+execut condit inv 1
+execut context 1
+execut correct 1
+execut cp 1
+execut cr 1
+execut decl 1
+execut decl specif 1
+execut dep 1
+execut design 1
+execut detail 1
+execut dm 1
+execut doit 1
+execut doit passer 1
+execut dur recov 1
+execut dur system 1
+execut each iter 1
+execut each op 1
+execut eff 1
+execut elseif 1
+execut elseif cp 1
+execut en 1
+execut en un 1
+execut environm 2
+execut environm con 1
+execut et cal 1
+execut et proceed 1
+execut et switch 1
+execut fail 2
+execut fft 1
+execut funct 1
+execut funct upd 1
+execut graph 2
+execut graph expr 1
+execut help 1
+execut high level 1
+execut hist 2
+execut honor 1
+execut in ca 1
+execut in exclus 1
+execut in fortran 1
+execut in incr 1
+execut in order 1
+execut in parallel 4
+execut in rever 1
+execut in term 1
+execut incorrect 1
+execut indep 1
+execut indep instruc 1
+execut instantan 2
+execut instruc 1
+execut inver 1
+execut inver oper 1
+execut is es 1
+execut is giv 1
+execut is protect 1
+execut is simil 1
+execut is support 1
+execut it correspon 1
+execut it norm 1
+execut it ph 1
+execut known 1
+execut lin 1
+execut maxrol 1
+execut mechan 1
+execut mechan differ 1
+execut mod 6
+execut model 7
+execut model support 1
+execut mov 1
+execut multipl 2
+execut multipl cop 1
+execut multipl flow 1
+execut multiproc 2
+execut multiproc program 2
+execut must satisf 1
+execut nest 1
+execut nest loop 1
+execut no chang 1
+execut nod 1
+execut nod explicit 1
+execut nor succ 1
+execut object 2
+execut object cod 1
+execut object fil 1
+execut occur 1
+execut of act 2
+execut of ar 1
+execut of async 1
+execut of bin 1
+execut of by 1
+execut of cal 1
+execut of compmst 1
+execut of comput 1
+execut of computer 1
+execut of crit 1
+execut of deletemin 1
+execut of es 1
+execut of event 1
+execut of handler 1
+execut of imper 1
+execut of indep 1
+execut of inver 1
+execut of iter 1
+execut of loc 1
+execut of locusrout 1
+execut of log 2
+execut of loop 1
+execut of lower 1
+execut of me 1
+execut of method 1
+execut of mp3d 1
+execut of multipl 2
+execut of nest 1
+execut of nondetermin 1
+execut of oper 1
+execut of parallel 2
+execut of ph 1
+execut of privileg 1
+execut of program 2
+execut of prolog 2
+execut of scientif 1
+execut of selectintertest 1
+execut of separ 1
+execut of sign 1
+execut of snoop 1
+execut of task 1
+execut of tempor 2
+execut of test 1
+execut of thread 1
+execut of til 1
+execut on backtrack.1 1
+execut on block 1
+execut on multicomputer 2
+execut on sun 2
+execut on sun10 1
+execut onl comp 1
+execut op 1
+execut oper 2
+execut oper rang 1
+execut optim 1
+execut optim act 1
+execut order 1
+execut ordin 1
+execut ordin ibm 1
+execut our protocol 1
+execut parser 1
+execut partit 1
+execut path 2
+execut per object 1
+execut per se 1
+execut perfom 1
+execut perform 1
+execut ph 1
+execut pipel 1
+execut plan 1
+execut port 1
+execut problem 1
+execut proc 2
+execut profil 2
+execut profil ind 1
+execut profil stat 1
+execut prolog 1
+execut prolog program 1
+execut qsort 1
+execut qu 1
+execut qu fournit 1
+execut rat 1
+execut reduc 1
+execut remot 1
+execut resum 1
+execut rl 1
+execut rl satisf 1
+execut rol 1
+execut run 1
+execut run tim 1
+execut sd 1
+execut self 1
+execut self delim 1
+execut sem 1
+execut sequ 5
+execut sequ proc 1
+execut ser 1
+execut sever iter 1
+execut simultan 1
+execut spac 1
+execut speed 5
+execut stag 1
+execut start 1
+execut stat 1
+execut step 1
+execut sublangu 1
+execut subtransact 1
+execut such method 1
+execut synchron 1
+execut synchron event 1
+execut t1 1
+execut tempor 1
+execut tempor log 1
+execut term 1
+execut test 1
+execut th act 1
+execut th appropr 2
+execut th assign 1
+execut th benchmark 1
+execut th bod 1
+execut th bsen 1
+execut th chain 1
+execut th cod 2
+execut th cur 1
+execut th endselfmod 1
+execut th former 1
+execut th funct 1
+execut th instr 1
+execut th inver 1
+execut th iter 1
+execut th knowledg 1
+execut th match 1
+execut th method 1
+execut th narrow 1
+execut th oper 2
+execut th origin 1
+execut th ph 1
+execut th privileg 1
+execut th program 1
+execut th protocol 1
+execut th quer 1
+execut th respect 1
+execut th rest 1
+execut th sequ 2
+execut th specif 1
+execut th st 1
+execut th su 1
+execut th swap 1
+execut th task 1
+execut th til 1
+execut th transit 1
+execut than non 1
+execut that comp 1
+execut their cur 1
+execut them simultan 1
+execut then cp 1
+execut thereafter 1
+execut therefor 1
+execut therefor dep 1
+execut thread 1
+execut tim 28
+execut tim assum 1
+execut tim breakdown 1
+execut tim c.f 1
+execut tim distribut 1
+execut tim ind 2
+execut tim obtain 1
+execut tim opt 1
+execut tim rel 1
+execut tim report 1
+execut tim scal 1
+execut tim shop 1
+execut tim unoptim 1
+execut tim using 1
+execut tim100.0 1
+execut to bil 1
+execut to en 1
+execut to ensur 1
+execut to obtain 1
+execut to succ 1
+execut to upd 1
+execut trac 1
+execut traff 1
+execut traff pattern 1
+execut transit 1
+execut tw addit 1
+execut tw consecut 1
+execut unit 1
+execut unit connect 1
+execut unit us 1
+execut univer 1
+execut univer ext 1
+execut until s4 1
+execut upd 1
+execut upon user 1
+execut using 2
+execut wa reach 1
+execut when thread 1
+execut wil develop 1
+execut with mal 1
+execut without deadlock 1
+execut without high 1
+execut without me 1
+execut zer 1
+execut.3 1
+execut.3 we cal 1
+executionan 1
+executionmodel 1
+executionmodel executionan 1
+exempl 9
+exempl a caus 1
+exempl a la 2
+exempl aquarius 1
+exempl au 2
+exempl au del 1
+exempl au moy 1
+exempl au traver 1
+exempl avail 1
+exempl binprolog 1
+exempl c dan 1
+exempl com 1
+exempl com indiqu 1
+exempl contraint 1
+exempl d emonstratif 1
+exempl dappl 1
+exempl dappl auxquel 1
+exempl de 4
+exempl de cel 1
+exempl de cod 1
+exempl de concept 1
+exempl de faux 1
+exempl de la 1
+exempl de mach 1
+exempl de marqu 1
+exempl de matr 1
+exempl de partit 1
+exempl de pol 1
+exempl de program 1
+exempl de repr 2
+exempl de syst 1
+exempl de term 1
+exempl de variabl 1
+exempl dext 1
+exempl dext fa 1
+exempl dext qu 1
+exempl du 1
+exempl du deux 1
+exempl du fait 1
+exempl du point 1
+exempl du pr 1
+exempl du prem 1
+exempl ed 1
+exempl en 2
+exempl en ajout 1
+exempl en cr 1
+exempl en distribu 1
+exempl en util 1
+exempl est 1
+exempl est don 1
+exempl figur 1
+exempl illustr 1
+exempl illustr le 1
+exempl illustr lobt 1
+exempl la 2
+exempl la comparaison 1
+exempl la pag 1
+exempl la techniqu 1
+exempl lappl 1
+exempl lappl de 1
+exempl le 2
+exempl le ca 2
+exempl le commun 1
+exempl le deux 1
+exempl le syst 1
+exempl lor 1
+exempl lor de 1
+exempl lorsqu 1
+exempl lorsqu lon 1
+exempl ma 1
+exempl ma le 1
+exempl montr 1
+exempl montr bien 1
+exempl nu 1
+exempl nu prolog 1
+exempl on peut 1
+exempl par 2
+exempl par deux 1
+exempl par evalu 1
+exempl parc 1
+exempl parc quel 1
+exempl passer 1
+exempl passer dun 1
+exempl penser 1
+exempl peut 1
+exempl peut par 1
+exempl pour 2
+exempl pour ajouter 1
+exempl pour effectuer 1
+exempl pour la 1
+exempl qu 1
+exempl qu cel 1
+exempl qu le 1
+exempl qu lon 1
+exempl qu suivront 1
+exempl quen 1
+exempl quen fait 1
+exempl s ecuritair 1
+exempl serv 1
+exempl setof 1
+exempl shallow 1
+exempl shallow fail 1
+exempl si 1
+exempl si c12 1
+exempl simpl 1
+exempl simpl est 1
+exempl sont 1
+exempl sont pr 1
+exempl suit 1
+exempl suit le 1
+exempl un 1
+exempl un mot 1
+exempl un simpl 1
+exempl un term 1
+exempl util 2
+exempl util es 1
+exempl util le 1
+exemplif 5
+exemplif our point 1
+exemplif th ba 1
+exer 2
+exer a forc 1
+exer on particl 1
+exerc 11
+exerc al parameter 1
+exerc ask 1
+exerc ask stud 1
+exerc funct 1
+exerc it privileg 1
+exerc kitlog 1
+exerc le author 1
+exerc m depth 1
+exerc mor author 1
+exerc of power 1
+exerc of privileg 1
+exerc privileg 1
+exerc th commun 1
+exerc th compon 1
+exerc th funct 1
+exerc th privileg 1
+exerc unaid 1
+exergu 1
+exergu le 1
+exergu le consid 1
+exhaust 16
+exhaust and mach 1
+exhaust and pair 1
+exhaust approach 1
+exhaust computer 1
+exhaust examin 1
+exhaust fal 1
+exhaust l 1
+exhaust on attempt 1
+exhaust search 4
+exhaust search fletch 1
+exhaust search strateg 1
+exhaust sont 1
+exhaust surv 1
+exhaustiv 2
+exhaustiv de 1
+exhaustiv de parcour 1
+exhaustiv la 1
+exhaustiv la wam 1
+exhib 2
+exhib de 2
+exhib de gain 1
+exhib de la 1
+exhib e par 2
+exhibit 23
+exhibit a number 1
+exhibit a pract 1
+exhibit a trad 1
+exhibit almost sequ 1
+exhibit an arboresc 1
+exhibit an infinit 1
+exhibit behaviour 1
+exhibit by 1
+exhibit by behavior 1
+exhibit differ smoothabil 1
+exhibit high 1
+exhibit high lat 1
+exhibit impr 1
+exhibit impr instruc 1
+exhibit impr level 1
+exhibit in theorem 1
+exhibit o np 1
+exhibit o p2 1
+exhibit regl 1
+exhibit sen 1
+exhibit sen om 1
+exhibit simil 1
+exhibit simil featur 1
+exhibit somewhat 1
+exhibit somewhat greater 1
+exhibit specif 1
+exhibit specif proper 1
+exhibit superior 1
+exhibit superior perform 1
+exhibit tempor 1
+exhibit tempor reus 1
+exhibit tw gener 1
+exhibit ver simil 1
+exhibit visu 1
+exhibit visu artifact 1
+existait 1
+exister 1
+exister entr 1
+exister entr le 1
+exister un 1
+exister un solut 1
+exister un sous 1
+exit 12
+exit and exit0 1
+exit b nod 1
+exit entr 1
+exit eventu 1
+exit exit 1
+exit form 1
+exit from cm 1
+exit interfac 1
+exit it loop 1
+exit nod 2
+exit nod repr 1
+exit occur 1
+exit pathologicaltraver 1
+exit pathologicaltraver trac 1
+exit stat 1
+exit th loop 1
+exit traver 1
+exit traver trac 1
+exit with failur 1
+exit with succ 1
+exit0 1
+exit0 visit 1
+exit4 1
+exorbit 2
+exorbit compt 1
+exorbit compt tenu 1
+exotiqu 1
+exp 55
+exp act 1
+exp act po 1
+exp an interpreter 1
+exp and act 1
+exp and therefor 1
+exp as implem 1
+exp bind 1
+exp bind bind 1
+exp but nec 1
+exp by test 1
+exp dat 1
+exp direct 1
+exp direct empl 1
+exp env 1
+exp env owner 1
+exp env self 1
+exp env upd 1
+exp er 4
+exp er correspon 1
+exp er dmxp 1
+exp er effectu 2
+exp er en 1
+exp er est 1
+exp er le 1
+exp er men 1
+exp er montr 1
+exp er nous 2
+exp er ont 1
+exp er pa 1
+exp er qu 1
+exp er relat 1
+exp er sur 2
+exp erim 4
+exp erim de 1
+exp erim dev 1
+exp erim ee 1
+exp erim effectu 1
+exp erim es 1
+exp erim obtenu 1
+exp erim sur 2
+exp erimentaux 2
+exp erimentaux exhib 1
+exp fast 1
+exp fast interconnect 1
+exp fault 1
+exp ff m3 1
+exp ffim3 1
+exp fract 1
+exp further 1
+exp further incon 1
+exp gr 1
+exp gr bin 1
+exp hardwar 1
+exp in sect 1
+exp interconnect 1
+exp interm 1
+exp interm st 1
+exp inv 1
+exp j import 1
+exp method 1
+exp modl 1
+exp nj0 1
+exp of doubl 1
+exp of incr 2
+exp of repeat 1
+exp of ser 1
+exp on eff 2
+exp oper 1
+exp osl 1
+exp osl intern 1
+exp po 1
+exp proc 1
+exp r nj0 1
+exp reorthogon 1
+exp reorthogon step 1
+exp ri 1
+exp ri de 1
+exp s stat 1
+exp search 1
+exp search requir 1
+exp subexpr 1
+exp sum 1
+exp th fault 1
+exp th rat 1
+exp than increm 1
+exp to compar 1
+exp to guar 1
+exp to perform 1
+exp to posit 1
+exp to toler 1
+exp to util 1
+exp un 1
+exp un impl 1
+exp under env 1
+exp unexpect 1
+exp unexpect synerg 1
+exp user 1
+exp user interv 1
+exp when solut 1
+exp1 1
+exp3 1
+exp4 1
+exp5 1
+expan 34
+expan 2d 1
+expan a giv 1
+expan a nod 1
+expan accord 1
+expan and maintain 1
+expan ar calcl 1
+expan ar explain 1
+expan bod 1
+expan coeff 1
+expan coeff prov 1
+expan correspon 2
+expan correspon algorithm 1
+expan correspon nod 1
+expan cr 1
+expan cr addit 1
+expan ee 1
+expan ee arith 1
+expan expr 1
+expan is nec 1
+expan lem 1
+expan loc 1
+expan loc using 1
+expan n nod 1
+expan nam 1
+expan nod 1
+expan of form 1
+expan of typ 1
+expan on typ 1
+expan preserv 1
+expan preserv subtyp 1
+expan repr 1
+expan rl 1
+expan sal 1
+expan seem 1
+expan seem ea 1
+expan step 1
+expan syllabus 1
+expan th behavior 1
+expan th benefit 1
+expan th bod 1
+expan th event 1
+expan th inequ 1
+expan th repr 1
+expan th tr 2
+expan tim 1
+expan to inclus 1
+expan to resolut 1
+expan ver 1
+expect 61
+expect a complec 1
+expect a high 1
+expect a lower 1
+expect a me 1
+expect a siz 1
+expect a string 1
+expect about observ 1
+expect addit 1
+expect an el 1
+expect and mean 1
+expect and react 1
+expect and understand 1
+expect answer 1
+expect arc 1
+expect assum 1
+expect autom 1
+expect autom compiler 1
+expect behavior 2
+expect behaviour 1
+expect dist 1
+expect drawback 1
+expect execut 1
+expect execut tim 1
+expect failur 1
+expect failur ar 1
+expect failur caus 1
+expect failur combin 1
+expect failur occur 1
+expect for rad 1
+expect height 1
+expect hyp 1
+expect hyp spec 1
+expect implicit 1
+expect in pract 1
+expect inclus 1
+expect incr 1
+expect interprocedur 1
+expect interprocedur test 1
+expect match 1
+expect me 1
+expect no pronounc 1
+expect nod 1
+expect number 3
+expect o p2 1
+expect object 1
+expect occur 1
+expect of futur 1
+expect ogur 1
+expect or react 1
+expect outcom 2
+expect pinout 2
+expect pinout den 2
+expect poor 1
+expect poor parallel 1
+expect respon 2
+expect respon categor 1
+expect respon tim 1
+expect result 1
+expect sequ 1
+expect signif 1
+expect signif chang 1
+expect smaller 1
+expect smaller gain 1
+expect squar 1
+expect strateg 1
+expect strateg outcom 1
+expect such lim 1
+expect t2 1
+expect tak 1
+expect th ba 1
+expect th confid 1
+expect th intr 1
+expect th perform 1
+expect th superior 1
+expect th system 1
+expect that acc 1
+expect that ca 1
+expect that commun 1
+expect that comput 1
+expect that correspon 1
+expect that giv 1
+expect that technolog 2
+expect tim 3
+expect to achief 1
+expect to compl 1
+expect to continu 1
+expect to decr 1
+expect to develop 1
+expect to ec 1
+expect to exhibit 1
+expect to find 1
+expect to ge 1
+expect to gener 1
+expect to improv 1
+expect to incr 1
+expect to lead 1
+expect to produc 1
+expect to prov 1
+expect to sharp 1
+expect to st 2
+expect to support 1
+expect to term 1
+expect to try 1
+expect to work 1
+expect to yield 1
+expect tren 1
+expect valu 3
+expect wh 1
+expect wh typ 1
+expedit 1
+expedit th converg 1
+expenditur 1
+expenditur on softwar 1
+expenditur ro 1
+exper 40
+exper acquisit 1
+exper and evalu 1
+exper and guesswork 1
+exper and nov 1
+exper and requir 1
+exper any particl 1
+exper ar abl 1
+exper ar nec 1
+exper ar shown 1
+exper automat 1
+exper ba 1
+exper ba approach 1
+exper be coac 1
+exper becom 1
+exper behaviour 1
+exper by garlan 1
+exper can lead 1
+exper cl 1
+exper cl libr 1
+exper collect 1
+exper d ye 1
+exper datab 1
+exper datab system 1
+exper develop 1
+exper distingu 1
+exper domain 1
+exper domain exper 1
+exper driver 1
+exper enabl 1
+exper estim 1
+exper evolut 1
+exper evolut natur 1
+exper evolut procedur 1
+exper exc 1
+exper exc del 1
+exper foc 1
+exper from unicast 1
+exper gain 2
+exper ha shown 2
+exper i multipl 1
+exper illustr 1
+exper inclus 1
+exper inclus peer 1
+exper ind 4
+exper industr 1
+exper industr empl 1
+exper is infer 1
+exper is perform 1
+exper is transform 1
+exper it claim 1
+exper knowledg 3
+exper knowledg elicit 1
+exper listener 1
+exper listener understand 1
+exper littl difficult 1
+exper modl 1
+exper natur 1
+exper object 1
+exper object orient 1
+exper obtain 1
+exper of exper 1
+exper of maint 1
+exper of maintain 1
+exper of oper 1
+exper of produc 1
+exper of transcript 1
+exper pl 1
+exper proc 1
+exper requir 1
+exper show 1
+exper softwar 1
+exper softwar engineer 1
+exper solut 1
+exper som architectur 1
+exper subject 1
+exper subject allow 1
+exper sv 1
+exper system 6
+exper system design 1
+exper system integr 1
+exper system start 1
+exper system technolog 1
+exper system using 1
+exper tel 1
+exper ten 1
+exper th benefit 1
+exper th problem 1
+exper th system 1
+exper that inform 1
+exper to answer 1
+exper to belief 1
+exper to dat 1
+exper to dec 1
+exper to modif 1
+exper to motiv 1
+exper to resolut 1
+exper transl 1
+exper transl rel 1
+exper user 2
+exper user hold 1
+exper var 1
+exper wa larg 1
+exper we report 1
+exper wer abl 1
+exper with actu 1
+exper with adapt 1
+exper with prev 1
+exper6 1
+experiemnt 1
+experim 59
+experim abov certain 1
+experim an 1
+experim and exper 1
+experim and observ 1
+experim and result 1
+experim and siml 1
+experim approach 1
+experim ar avail 1
+experim ar ba 1
+experim ar cur 1
+experim ar describ 1
+experim ar giv 1
+experim ar meant 1
+experim ar pr 1
+experim ar sum 1
+experim architectur 1
+experim at night 1
+experim attempt 1
+experim both wavel 1
+experim by chang 1
+experim by restrict 1
+experim comparison 5
+experim con 2
+experim condit 1
+experim conduc 2
+experim confirm 2
+experim dat 2
+experim dat compar 1
+experim dat gather 1
+experim demonstr 1
+experim demonstr real 1
+experim describ 4
+experim descript 1
+experim design 2
+experim disc 1
+experim dist 1
+experim dist constraint 1
+experim empl 1
+experim error 1
+experim evalu 5
+experim evid 1
+experim ext 1
+experim fiv tim 1
+experim framework 2
+experim ha shown 1
+experim had detect 1
+experim hav shown 3
+experim illustr 1
+experim in cod 1
+experim in comput 1
+experim in implem 1
+experim in sect 2
+experim inclus 1
+experim ind 2
+experim is conduc 1
+experim is difficult 1
+experim is disc 1
+experim is du 1
+experim is lost 1
+experim is perform 1
+experim manag 1
+experim manager 1
+experim measur 1
+experim method 1
+experim methodolog 1
+experim model 1
+experim of figur 1
+experim of sect 1
+experim on compl 1
+experim on cr 1
+experim on synth 1
+experim on tim 1
+experim on var 1
+experim parameter 1
+experim perform 3
+experim platform 1
+experim pr 3
+experim program 1
+experim protocol 1
+experim purp 1
+experim ran 1
+experim rank 1
+experim rank ba 1
+experim remain 1
+experim report 1
+experim result 22
+experim result compar 1
+experim result deriv 1
+experim result illustr 1
+experim result maintain 1
+experim result obtain 1
+experim result pr 1
+experim result show 2
+experim rev 2
+experim se 3
+experim sect 2
+experim sect show 1
+experim setup 1
+experim setup con 1
+experim show 8
+experim shown 1
+experim siml 1
+experim step 1
+experim stud 2
+experim subject 1
+experim suggest 2
+experim techniqu 1
+experim techniqu gener 1
+experim technolog 1
+experim testb 1
+experim th aspect 1
+experim th quer 1
+experim th subject 1
+experim that determin 1
+experim theor 1
+experim theor error 1
+experim titl 1
+experim to ensur 1
+experim to establ 1
+experim to measur 2
+experim to prov 1
+experim to se 1
+experim to test 1
+experim tool 1
+experim tool design 1
+experim tw se 1
+experim us 1
+experim us run100 1
+experim using 4
+experim util 1
+experim val 1
+experim val pattern 1
+experim valu 1
+experim wa calcl 1
+experim wa chang 1
+experim wa conduc 1
+experim wa design 1
+experim wa run 2
+experim wa se 1
+experim we allow 1
+experim we av 1
+experim we ch 1
+experim we def 1
+experim we docum 1
+experim we found 1
+experim we inser 1
+experim we maintain 1
+experim we mov 1
+experim we perform 1
+experim we tr 1
+experim we var 2
+experim wer an 1
+experim wer car 2
+experim wer conduc 3
+experim wer facilit 1
+experim wer perform 3
+experim wer train 1
+experim wh 1
+experim which compar 1
+experim which ext 1
+experim with agent 1
+experim with fic 1
+experim with frug 1
+experim with pc 1
+experim with random 1
+experim with shar 1
+experim with sicstus 1
+experim with softwar 1
+experim with succ 1
+experim with synth 1
+experim with tempor 1
+experim with ts 1
+experim with var 3
+experim yield 1
+experim yield raw 1
+experimenter 1
+experm 1
+experm we consider 1
+expertanswer 1
+expertanswer expertanswer 1
+expertanswer expertanswer expertanswer 1
+expertensystem 2
+expf 2
+expir 2
+expir avant 1
+expir avant qu 1
+expl 8
+expl dam 1
+expl du 1
+expl du nombr 1
+expl of infer 1
+expl th id 1
+expl th int 1
+expl th rel 1
+explain 55
+explain abov determin 1
+explain and learn 1
+explain as follow 2
+explain bil 1
+explain by addr 1
+explain earl 1
+explain further 1
+explain in sect 9
+explain in subsect 1
+explain in text 1
+explain in xv.5 1
+explain it inferior 1
+explain nod 1
+explain norm 1
+explain norm form 1
+explain on var 1
+explain simil 1
+explain simil situ 1
+explain soc 1
+explain soc phenom 1
+explain sort 1
+explain sort algorithm 1
+explain th assoc 1
+explain th detail 1
+explain th id 1
+explain th lo 1
+explain th main 1
+explain th phenomenon 1
+explain th prec 1
+explain th princip 1
+explain th proc 1
+explain th program 1
+explain th qu 1
+explain th reader 1
+explain th reason 2
+explain th red 1
+explain th reduc 1
+explain th repeat 1
+explain th result 1
+explain th rol 1
+explain th specif 1
+explain th underl 1
+explain what default 1
+explain why 6
+explain why heur 1
+explain why lin 1
+explan 18
+explan analog 1
+explan analog susp 1
+explan and viol 1
+explan ar built 1
+explan ar expect 1
+explan augm 1
+explan ba 2
+explan ba gener 2
+explan ba learn 1
+explan caus 1
+explan caus structur 1
+explan coh 1
+explan com 1
+explan for su 1
+explan from s4 1
+explan gener 1
+explan gener quest 1
+explan giv 1
+explan ha somehow 1
+explan is correct 1
+explan is gener 1
+explan is verif 1
+explan issu 1
+explan occur 1
+explan of for 1
+explan of why 2
+explan on learn 1
+explan pattern 1
+explan power 1
+explan rl 1
+explan structur 1
+explan support 1
+explan that dog 1
+explan that link 1
+explan to bi 1
+explan underl 1
+explan underl learn 1
+explan valu 1
+explan which link 1
+explan with respect 1
+explan2 1
+explanationb 1
+explanationb learn 1
+explicit 53
+explicit a prior 1
+explicit account 1
+explicit activ 1
+explicit and ea 1
+explicit and implicit 1
+explicit and prov 1
+explicit as fram 1
+explicit as part 1
+explicit assign 1
+explicit author 1
+explicit avail 1
+explicit ba 1
+explicit bar 1
+explicit bar init 1
+explicit bi 1
+explicit cl 1
+explicit cl object 1
+explicit cod 1
+explicit command 1
+explicit commun 1
+explicit commun pattern 1
+explicit compon 1
+explicit compon interfac 1
+explicit comput 1
+explicit consider 1
+explicit consider fault 1
+explicit construc 2
+explicit cr 1
+explicit d evalu 1
+explicit de 2
+explicit de disjonct 1
+explicit de la 1
+explicit de som 1
+explicit de tous 1
+explicit dec 1
+explicit decl 1
+explicit decl expr 1
+explicit def 1
+explicit def fault 1
+explicit definit 1
+explicit deleg 1
+explicit design 1
+explicit differ 1
+explicit distribut 1
+explicit drawn 1
+explicit ee 1
+explicit en 1
+explicit en consid 1
+explicit et un 1
+explicit expr 1
+explicit extract 1
+explicit fault 1
+explicit fault model 1
+explicit finit 1
+explicit finit differ 1
+explicit flag 1
+explicit form 1
+explicit format 1
+explicit format inform 1
+explicit gener 1
+explicit giv 2
+explicit giv el 1
+explicit glob 1
+explicit glob manager 1
+explicit inclus 1
+explicit inform 2
+explicit instruc 1
+explicit interfac 1
+explicit introduc 1
+explicit invoc 1
+explicit invoc connect 1
+explicit invoc mechan 1
+explicit invok 1
+explicit invok using 1
+explicit invokesexplicit 1
+explicit invokesexplicit invok 1
+explicit is harm 1
+explicit la 1
+explicit la tail 1
+explicit la valeur 1
+explicit le 1
+explicit le quat 1
+explicit lock 2
+explicit manipl 1
+explicit manipl parallel 1
+explicit match 1
+explicit me 1
+explicit me xp 1
+explicit mechan 2
+explicit mult 1
+explicit mult level 1
+explicit n ecessit 1
+explicit nam 1
+explicit order 1
+explicit order command 1
+explicit overflow 1
+explicit overflow check 1
+explicit overrid 1
+explicit pa 1
+explicit par 1
+explicit par un 1
+explicit parallel 2
+explicit parallel mach 1
+explicit parameter 1
+explicit parameter targ 1
+explicit parser 1
+explicit point 1
+explicit precondit 1
+explicit privileg 1
+explicit privileg assignm 1
+explicit produc 1
+explicit r ef 1
+explicit receiv 1
+explicit recur 1
+explicit recur facil 1
+explicit refer 1
+explicit reinst 1
+explicit relationship 1
+explicit repr 7
+explicit request 1
+explicit requir 1
+explicit rollback 1
+explicit run 1
+explicit run tim 1
+explicit satisf 1
+explicit satisf assignm 1
+explicit specif 3
+explicit specif resourc 1
+explicit st 7
+explicit st addit 1
+explicit st ba 1
+explicit substitut 1
+explicit suggest 1
+explicit suggest modif 1
+explicit support 3
+explicit sur 1
+explicit sur la 1
+explicit tempor 2
+explicit tempor dep 1
+explicit test 1
+explicit th cont 1
+explicit tout 1
+explicit tout le 1
+explicit typ 1
+explicit typ framework 1
+explicit us 1
+explicit us priorit 1
+explicit user 1
+explicit user model 1
+explicit using 1
+explicit vi 1
+explicit vi decl 1
+explicit what rel 1
+expliqu 2
+expliqu certain 1
+expliqu certain de 1
+expliqu e par 1
+expliqu le 1
+expliqu le nombr 1
+expliqu le pic 1
+expliqu son 1
+expliqu son util 1
+expliquer 1
+expliquer qu 1
+expliquer qu le 1
+explod 2
+exploit 44
+exploit a graph 1
+exploit a simpl 1
+exploit any graph 1
+exploit arbitr 1
+exploit arbitr task 1
+exploit argum 1
+exploit argum parallel 1
+exploit becom 1
+exploit becom overwhelm 1
+exploit benef 1
+exploit benef effect 1
+exploit benign 1
+exploit benign environm 1
+exploit cach 1
+exploit cach affin 1
+exploit coh 1
+exploit context 2
+exploit context parallel 2
+exploit dun 1
+exploit dun mvp 1
+exploit dur timesl 1
+exploit e en 1
+exploit e la 1
+exploit ee 2
+exploit ee au 1
+exploit ee pour 1
+exploit ee quel 1
+exploit emerg 1
+exploit emerg cluster 1
+exploit emerg proc 1
+exploit es 1
+exploit es de 1
+exploit est 1
+exploit est automatiqu 1
+exploit est encor 1
+exploit et simpl 1
+exploit fast 1
+exploit fast st 1
+exploit in work 1
+exploit la 1
+exploit la soupl 1
+exploit laffinit 1
+exploit le 1
+exploit le par 1
+exploit libr 1
+exploit libr funct 1
+exploit maxim 1
+exploit maxim parallel 1
+exploit of commun 2
+exploit of spat 1
+exploit of surfac 1
+exploit of uniproc 1
+exploit or parallel 1
+exploit parallel 4
+exploit parallel inh 1
+exploit parallel wh 1
+exploit shar 1
+exploit shar memor 1
+exploit som symmeter 1
+exploit speed 1
+exploit task 1
+exploit task specif 1
+exploit th abstract 1
+exploit th benefit 1
+exploit th built 1
+exploit th capabil 1
+exploit th conv 1
+exploit th cost 1
+exploit th degr 1
+exploit th dynam 1
+exploit th emerg 1
+exploit th extr 1
+exploit th fact 6
+exploit th flec 1
+exploit th inh 1
+exploit th layer 1
+exploit th level 1
+exploit th natur 1
+exploit th ph 1
+exploit th problem 1
+exploit th random 1
+exploit th reader 1
+exploit th restrict 1
+exploit th trem 1
+exploit through dynam 1
+exploit to improv 1
+exploit to obtain 1
+exploit to overcom 1
+exploit to prohibit 1
+exploit tradeoff 1
+exploit user 1
+exploit user defin 1
+exploit using 1
+exploit virtu 1
+exploit virtu synchron 1
+exploit what conv 1
+exploit when find 1
+exploit within individu 1
+exploit without sever 1
+exploiter 1
+exploiter la 1
+exploiter la localit 1
+exploiter se 1
+exploiter se propr 1
+exploiteron 1
+exploiteron dan 1
+exploiteron dan no 1
+explor 31
+explor a requir 1
+explor al 1
+explor al eatoir 1
+explor and debug 1
+explor and demonstr 1
+explor and exploit 1
+explor cl 1
+explor cl tap 1
+explor dialog 1
+explor effect 1
+explor en 1
+explor en profondeur 1
+explor environm 1
+explor es 1
+explor exploit 1
+explor exploit tradeoff 1
+explor fil 1
+explor fil outptr 1
+explor for assm 1
+explor from nod 1
+explor gener 1
+explor gener low 1
+explor in depth 1
+explor in dynam 1
+explor investig 1
+explor issu 1
+explor le 1
+explor le rel 1
+explor mor nod 1
+explor of maxim 1
+explor of qu 1
+explor of relationship 1
+explor or prim 1
+explor other architectur 1
+explor our model 1
+explor paper 1
+explor perform 1
+explor perform techniqu 1
+explor plur 1
+explor po method 1
+explor problem 1
+explor problem disc 1
+explor project 1
+explor pseud 1
+explor pseud al 1
+explor reducead16 1
+explor san direct 1
+explor scenar 1
+explor stud 1
+explor system 1
+explor system avail 1
+explor th benefit 1
+explor th cap 2
+explor th compr 1
+explor th concept 1
+explor th difficult 1
+explor th maxim 1
+explor th neighbour 1
+explor th po 1
+explor th rel 1
+explor th spat 1
+explor to produc 1
+explor user 1
+explor user interfac 1
+explor way 1
+explor work 1
+explor work styl 1
+exploredstat 1
+explorer 2
+explorer au 1
+explorer au retour 1
+explorer larbr 1
+explorer larbr de 1
+explorer on srq 1
+explorer tool 1
+exploser 1
+expon 22
+expon aver 1
+expon averag 1
+expon bound 1
+expon bound burst 1
+expon dec 1
+expon decr 1
+expon den 1
+expon distribut 1
+expon funct 2
+expon funct 2cn 1
+expon growth 1
+expon growth rat 1
+expon in tim 1
+expon larger 1
+expon mor quick 1
+expon oper 1
+expon or uniform 1
+expon scal 1
+expon search 1
+expon smal bound 1
+expon smal prob 1
+expon smal term 1
+expon smooth 1
+expon smooth forml 1
+expon term 1
+expon tim 4
+expon tim algorithm 1
+exponentiel 4
+exponentiel avec 1
+exponentiel avec tr 1
+exponentiel correspon 1
+exponentiel correspon aux 1
+exponentiel dan 1
+exponentiel dan le 1
+exponentiel de 1
+exponentiel de taux 1
+exponentiel en 2
+exponentiel en ce 1
+exponentiel en fonct 1
+exponentiel peuv 1
+exponentiel peuv tr 1
+exponentiel sont 1
+exponentiel sont donc 1
+export 5
+export a cl 1
+export a funct 1
+export a se 1
+export a singl 1
+export an oper 1
+export atom 1
+export automat 1
+export bind 1
+export explicit 1
+export form 1
+export funct 1
+export funct implem 1
+export identif 1
+export interfac 2
+export interfac int 1
+export j exp 1
+export loc 1
+export loc bind 1
+export multipl 1
+export multipl interfac 1
+export nam 1
+export object 1
+export oper 1
+export standard 1
+export standard interfac 1
+export sub 1
+export th abstract 1
+export th cl 1
+export th funct 1
+export th interfac 1
+export th modl 1
+export tw gener 1
+exposer 1
+exposer le 1
+exposer le propr 1
+exposit 11
+exposit clear 1
+exposit mult 1
+exposit mult interpr 1
+exposit we assum 1
+exposon 1
+exposon par 1
+exposon par lement 1
+expound 1
+expound in sect 1
+expr 73
+expr a privileg 1
+expr allow 1
+expr an overlap 1
+expr and ad 1
+expr and complec 1
+expr and describ 1
+expr and eff 2
+expr and export 1
+expr and highlight 1
+expr and interpr 1
+expr and lim 1
+expr and reason 1
+expr and return 1
+expr and solut 1
+expr and substitut 1
+expr answer 1
+expr any rel 1
+expr anywh 1
+expr appl 1
+expr ar act 1
+expr ar evalu 1
+expr ar identif 1
+expr ar interpr 1
+expr ar promot 1
+expr ar skip 1
+expr ar typ 1
+expr ar val 1
+expr ar writ 1
+expr argum 1
+expr arithm 1
+expr arithm etiqu 1
+expr as assoc 1
+expr as composit 1
+expr as disabl 1
+expr as ff 1
+expr as follow 4
+expr as further 1
+expr as instruc 1
+expr as junior 1
+expr as link 1
+expr as sp 1
+expr attach 1
+expr b0 1
+expr ba 1
+expr ba proper 1
+expr bm 1
+expr bool 1
+expr bool gen 1
+expr built 1
+expr by appl 1
+expr by equ 1
+expr by gener 1
+expr by mean 1
+expr by program 1
+expr by saying 1
+expr c qu 1
+expr car 1
+expr car person 1
+expr cl 1
+expr cl opt 1
+expr co1 1
+expr co2 1
+expr coin 1
+expr com 2
+expr com con 1
+expr common 1
+expr common funct 1
+expr constraint 1
+expr d6 1
+expr dat 1
+expr de 1
+expr de le 1
+expr defin 1
+expr defin fd 1
+expr degr 1
+expr denot 3
+expr deriv 1
+expr desir 1
+expr desir proper 1
+expr determin 1
+expr du 2
+expr du nid 1
+expr du par 1
+expr du vecteur 1
+expr e evalu 1
+expr e0 1
+expr ei 1
+expr est 1
+expr est complec 1
+expr evalu 1
+expr exact 1
+expr exact ptim 1
+expr expan 1
+expr expr 1
+expr fd 1
+expr finish 1
+expr for aver 1
+expr for htot 1
+expr for maxim 1
+expr for nw 1
+expr for proc 1
+expr for restrict 1
+expr for rt 1
+expr form 1
+expr forml 2
+expr ge 1
+expr ge upd 1
+expr gf 1
+expr gf cl 1
+expr graph 1
+expr ha valu 1
+expr high prob 1
+expr how chang 1
+expr ib 1
+expr ib mean 1
+expr in becom 1
+expr in ca 1
+expr in comput 1
+expr in datalog 1
+expr in fic 1
+expr in figur 1
+expr in flit 1
+expr in form 1
+expr in gener 1
+expr in hal 1
+expr in mod 1
+expr in network 1
+expr in order 1
+expr in pe 1
+expr in rel 1
+expr in secon 1
+expr in sl1 1
+expr in tdbm 1
+expr in term 4
+expr in word 1
+expr ind 1
+expr indiv 1
+expr indiv relationship 1
+expr init 1
+expr init resp 1
+expr int log 1
+expr interm 1
+expr interm result 1
+expr involut 2
+expr involut standard 1
+expr is acc 1
+expr is an 1
+expr is candid 1
+expr is deem 1
+expr is defin 1
+expr is disabl 1
+expr is known 1
+expr is reach 1
+expr is reduc 1
+expr is satisf 1
+expr is split 1
+expr is unif 1
+expr it int 1
+expr j defin 1
+expr lead 2
+expr link 1
+expr mak 1
+expr me 1
+expr me constraint 1
+expr mean 1
+expr mean repeat 1
+expr modl 1
+expr nous 1
+expr nous don 1
+expr nw 1
+expr nw sw 1
+expr obtain 1
+expr of act 1
+expr of chr 1
+expr of deduc 1
+expr of j1 1
+expr of st 1
+expr of starheight 1
+expr on variabl 1
+expr or defin 1
+expr or impl 2
+expr our thank 1
+expr over fd 1
+expr particl 1
+expr point 1
+expr power 7
+expr power desir 1
+expr pr 1
+expr prfd1 1
+expr real dep 1
+expr receiv 1
+expr rectangl 1
+expr rectangl intersect 1
+expr rel 1
+expr repr 1
+expr return 1
+expr rol 1
+expr rol relationship 1
+expr rp 1
+expr simil 1
+expr som confid 1
+expr speak 1
+expr specif 1
+expr synth 1
+expr synth etiqu 1
+expr t1 1
+expr th abstract 1
+expr th ad 1
+expr th claus 1
+expr th concept 1
+expr th cur 1
+expr th dep 2
+expr th effect 1
+expr th fact 1
+expr th forml 1
+expr th intersect 1
+expr th numer 1
+expr th overhead 1
+expr th refer 1
+expr th relationship 1
+expr th requir 1
+expr th respon 1
+expr th restrict 1
+expr th se 1
+expr th throughput 1
+expr than task 1
+expr that involut 1
+expr through exact 1
+expr to an 1
+expr to norm 1
+expr to pref 1
+expr to proc 1
+expr tw dim 1
+expr typ 1
+expr typ system 1
+expr us 1
+expr us chr 1
+expr using 6
+expr using equ 1
+expr using system 1
+expr v b2f0 1
+expr ver simp 1
+expr vol 1
+expr wh 1
+expr wh funct 1
+expr wh valu 1
+expr which us 1
+expr with geometer 1
+expr with log 1
+expr with respect 1
+expr with upd 1
+expr without upd 1
+expressif 1
+exprim 3
+exprim e de 1
+exprim e en 1
+exprim ee 3
+exprim ee au 1
+exprim ee en 1
+exprim ee par 1
+exprim quau 1
+exprim quau moin 1
+exprimer 3
+exprimer au 1
+exprimer au paragraph 1
+exprimer ce 1
+exprimer ce condit 1
+exprimer de 1
+exprimer de concept 1
+ext 99
+ext a theor 1
+ext abstract 3
+ext adv 1
+ext al object 1
+ext algebr 1
+ext algebr framework 1
+ext an 2
+ext and compl 1
+ext and construc 1
+ext and contract 1
+ext and object 1
+ext and optim 1
+ext and refin 1
+ext appl 1
+ext ar eff 1
+ext arithm 1
+ext arithm calcl 1
+ext assessm 1
+ext at level 1
+ext at level1 1
+ext back propag 1
+ext backtrack 1
+ext becaus eq 1
+ext by abstract 1
+ext by ad 2
+ext by clamp 1
+ext by inser 1
+ext by replac 1
+ext by user 1
+ext cal asvm 1
+ext cam 1
+ext cam ba 1
+ext cam giv 1
+ext cam manipl 1
+ext cam sem 1
+ext categor 1
+ext categor abstract 1
+ext chip 1
+ext cod 1
+ext collect 1
+ext consider 1
+ext cover 1
+ext d efin 1
+ext datab 2
+ext datab pr 1
+ext datab technolog 1
+ext de 2
+ext de ce 1
+ext de lalgorithm 1
+ext debug 1
+ext debug environm 1
+ext declip 1
+ext definit 1
+ext dijkstr 1
+ext dijkstr weakest 1
+ext distribut 1
+ext distribut langu 1
+ext do seem 1
+ext du 2
+ext du compilateur 1
+ext du princip 1
+ext du syst 1
+ext e0 1
+ext each inst 1
+ext edit 1
+ext effort 1
+ext entail 1
+ext entail virtu 1
+ext erieur 1
+ext et deux 1
+ext et dinclur 1
+ext exampl 1
+ext exampl illustr 1
+ext experim 2
+ext experim result 1
+ext explan 1
+ext explan ba 1
+ext facil 1
+ext fast 1
+ext fil 1
+ext fil serv 1
+ext for acc 1
+ext for compon 1
+ext for distribut 1
+ext for dynam 1
+ext for handl 1
+ext for ip 2
+ext for union 1
+ext ftcpg 1
+ext gener 1
+ext gener purp 1
+ext gg 1
+ext hardwar 1
+ext hardwar dep 1
+ext hash 2
+ext hash etc 1
+ext hash techniqu 1
+ext hierarch 1
+ext hierarch constraint 1
+ext hpf 1
+ext in stat 1
+ext init 1
+ext int nonlin 1
+ext intern 1
+ext involut 1
+ext is conserv 1
+ext is describ 1
+ext is redund 1
+ext kalman 2
+ext kalman estim 1
+ext kalman filter 1
+ext level 1
+ext mad 1
+ext mar 1
+ext maud 1
+ext me 1
+ext me aqu 1
+ext ml 1
+ext modest 1
+ext modest dun 1
+ext modif 1
+ext modl 1
+ext natur 1
+ext naturel 1
+ext naturel de 1
+ext ne 1
+ext ne chang 1
+ext ne peuv 1
+ext netsim 1
+ext neur 1
+ext neur network 1
+ext nod 1
+ext not 1
+ext number 1
+ext object 1
+ext oe 1
+ext of bi 1
+ext of chernikov 1
+ext of cl 1
+ext of color 1
+ext of csp 1
+ext of fortran 1
+ext of funct 1
+ext of girard 1
+ext of hardwar 1
+ext of herbrand 1
+ext of log 4
+ext of mlp 1
+ext of parallel 1
+ext of po 1
+ext of prev 1
+ext of prolog 1
+ext of rel 1
+ext of ser 1
+ext of shannon 1
+ext of siz 1
+ext of sld 1
+ext of standard 1
+ext of subtyp 1
+ext of system 1
+ext oper 1
+ext or modif 1
+ext or object 1
+ext or simplif 1
+ext or spec 1
+ext our algorithm 1
+ext our an 2
+ext our ec 1
+ext our result 1
+ext our techniqu 1
+ext our work 1
+ext parallel 1
+ext perform 1
+ext perform measur 1
+ext permettr 1
+ext permettr de 1
+ext prolog 3
+ext prolog quelconqu 1
+ext prolog system 1
+ext prompt 1
+ext qu 1
+ext ra 1
+ext rang 1
+ext rebut 1
+ext record 1
+ext recov 1
+ext recov facil 1
+ext rel 3
+ext rel algebr 3
+ext rel datab 1
+ext rel model 2
+ext research 1
+ext research act 1
+ext result 1
+ext result regard 1
+ext reus 1
+ext rev 1
+ext rieur 1
+ext rieur de 1
+ext se 1
+ext self 1
+ext self contain 1
+ext siml 1
+ext so ec1 1
+ext spat 1
+ext spat dat 1
+ext spat object 1
+ext st 1
+ext standard 1
+ext standard construc 1
+ext stat 1
+ext straightfor 1
+ext string 1
+ext stud 6
+ext such softwar 1
+ext suggest 1
+ext switch 1
+ext task 1
+ext test 1
+ext th algorithm 2
+ext th an 3
+ext th approach 3
+ext th architectur 1
+ext th ba 2
+ext th cl 1
+ext th clp 1
+ext th compl 1
+ext th con 1
+ext th concept 1
+ext th definit 2
+ext th defstruc 1
+ext th design 1
+ext th detail 1
+ext th earl 1
+ext th ec 1
+ext th encapsl 1
+ext th exampl 1
+ext th fiducc 1
+ext th fl 1
+ext th form 2
+ext th framework 1
+ext th funct 1
+ext th id 2
+ext th inherit 1
+ext th kernighan 1
+ext th langu 1
+ext th learn 1
+ext th mach 1
+ext th method 1
+ext th model 3
+ext th multidest 1
+ext th not 2
+ext th object 1
+ext th parameter 1
+ext th polyhedr 1
+ext th prescript 1
+ext th prev 1
+ext th proper 1
+ext th qu 1
+ext th rang 1
+ext th rel 1
+ext th result 5
+ext th rl 1
+ext th sem 1
+ext th simplif 1
+ext th specif 1
+ext th st 1
+ext th support 1
+ext th tam 1
+ext th techniqu 2
+ext th term 1
+ext th textur 1
+ext th triangl 1
+ext th underl 1
+ext th univer 1
+ext th visu 1
+ext that id 1
+ext theor 1
+ext tm 1
+ext to allow 1
+ext to bergadan 1
+ext to bp 1
+ext to build 1
+ext to calcl 1
+ext to cater 1
+ext to claus 1
+ext to consider 1
+ext to cover 1
+ext to deal 2
+ext to design 3
+ext to fortran 1
+ext to gener 1
+ext to handl 3
+ext to help 1
+ext to inclus 4
+ext to incompl 1
+ext to integer 1
+ext to langu 1
+ext to layer 1
+ext to mar 1
+ext to mlp 1
+ext to model 1
+ext to multicast 1
+ext to multiproc 1
+ext to ordin 1
+ext to prim 1
+ext to prolog 1
+ext to prov 3
+ext to schem 1
+ext to se 1
+ext to specif 1
+ext to sql 1
+ext to sub 1
+ext to switch 1
+ext to syntact 1
+ext to unif 1
+ext transact 1
+ext transact environm 1
+ext typ 1
+ext typ oper 1
+ext unif 2
+ext unif algorithm 1
+ext univer 1
+ext univer search 1
+ext up 1
+ext us 5
+ext user 3
+ext user manu 2
+ext user test 1
+ext ver 5
+ext ver avail 1
+ext vi comput 1
+ext vi me 1
+ext voient 1
+ext voient le 1
+ext way 1
+ext we retain 1
+ext wer consider 1
+ext which support 1
+ext wilson 1
+ext with nondetermin 1
+ext with pur 1
+ext with setcar 1
+ext with subtyp 1
+extendedcam 1
+extendedcam cod 1
+extendedcam cod sequ 1
+extensibl 1
+extent 19
+extent and typ 1
+extent as ernest 1
+extent if promin 1
+extent of link 1
+extent of privileg 1
+extent of protect 1
+extentron 1
+extentron algorithm 1
+exterior 1
+exterior edg 1
+exterior edg separ 1
+exterior featur 1
+exterior ver 1
+extern 34
+extern and stat 1
+extern appl 1
+extern behaviour 1
+extern by sign 1
+extern ce 1
+extern ce qu 1
+extern co 1
+extern co oper 1
+extern connect 3
+extern connect using 2
+extern const 1
+extern const char 1
+extern control 1
+extern controller 1
+extern dat 1
+extern degr 1
+extern delaun 1
+extern delaun triangl 1
+extern du 1
+extern du nid 1
+extern environm 3
+extern environm compr 1
+extern environm con 1
+extern est 1
+extern est suffisam 1
+extern event 1
+extern fil 1
+extern fil contain 1
+extern fil dev 1
+extern form 1
+extern input 1
+extern interconnect 1
+extern interfac 1
+extern iter 1
+extern iter de 1
+extern knowledg 1
+extern le 1
+extern le acc 1
+extern load 1
+extern med 1
+extern med ac 1
+extern memor 1
+extern n etant 1
+extern ne 1
+extern ne cont 1
+extern ne partag 1
+extern norm 1
+extern norm reg 1
+extern object 1
+extern observer 1
+extern observer dec 1
+extern ou 1
+extern ou intern 1
+extern par 1
+extern par el 1
+extern parcour 1
+extern parcour lim 1
+extern payoff 1
+extern qu 1
+extern qu dan 1
+extern reason 1
+extern reason occur 1
+extern refer 1
+extern reg 1
+extern repl 1
+extern repr 2
+extern request 1
+extern server 1
+extern server avail 1
+extern skel 1
+extern soit 1
+extern soit par 1
+extern sort 1
+extern st 1
+extern st argum 1
+extern sync 1
+extern task 1
+extern task chang 1
+extern teach 1
+extern tetrahedr 1
+extern triangl 1
+extern triangl lying 1
+extern user 1
+extern val 1
+extern viewer 1
+extern voron 1
+extern voron diagram 1
+extern voron skel 1
+extern world 2
+extp 1
+extr 42
+extr argum 2
+extr avail 1
+extr avail inform 1
+extr blank 1
+extr c term 1
+extr comparison 2
+extr complec 2
+extr comput 3
+extr comput requir 1
+extr comput step 1
+extr constraint 2
+extr cycl 1
+extr disk 1
+extr disk acc 1
+extr ec 1
+extr ec axiom 1
+extr edg 1
+extr edg ad 1
+extr effort 2
+extr el 1
+extr el repr 1
+extr em 3
+extr em con 1
+extr em es 1
+extr em globaux 1
+extr em lim 1
+extr em profit 1
+extr em se 1
+extr em simpl 1
+extr exp 1
+extr exp sum 1
+extr expr 1
+extr fac 1
+extr fac caus 1
+extr fd 1
+extr fd variabl 1
+extr flec 2
+extr flec offer 1
+extr form 1
+extr garb 1
+extr garb nod 1
+extr gener 1
+extr gener mak 1
+extr help 1
+extr ind 1
+extr inform 1
+extr intersect 1
+extr kind 1
+extr kind assum 1
+extr level 1
+extr link 1
+extr log 1
+extr log featur 1
+extr long p1 1
+extr maux 1
+extr memor 1
+extr memor cost 1
+extr nod 1
+extr not 1
+extr oper 1
+extr overhead 3
+extr parameter 1
+extr prem 1
+extr prov 1
+extr reason 1
+extr reason begin 1
+extr round 1
+extr round requir 1
+extr select 1
+extr select oper 1
+extr spac 2
+extr spac afford 1
+extr support 2
+extr system 1
+extr system mod 1
+extr targ 1
+extr tim 2
+extr tim requir 1
+extr tr 1
+extr valu 1
+extr variabl 2
+extr whit 1
+extr whit spac 1
+extr work 3
+extr work du 1
+extract 32
+extract a join 1
+extract a standard 1
+extract a vect 1
+extract algorithm 2
+extract algorithm mak 1
+extract an init 1
+extract and imag 1
+extract and ind 1
+extract and learn 1
+extract and pattern 1
+extract and qu 1
+extract and upd 1
+extract and us 1
+extract approach 1
+extract assm 1
+extract ba 1
+extract by measur 1
+extract cliqu 1
+extract collect 1
+extract detail 1
+extract detail requir 1
+extract developerworldr 1
+extract developerworldr system 1
+extract el 1
+extract featur 1
+extract finit 1
+extract finit st 1
+extract for imag 1
+extract from ffq1 1
+extract from gabor 1
+extract from program 1
+extract from wavel 1
+extract hav equiv 1
+extract imag 1
+extract imag cont 1
+extract in mic 1
+extract inst 1
+extract inst variabl 1
+extract isosurfac 1
+extract it loc 1
+extract join 1
+extract join continu 1
+extract keyword 1
+extract low 1
+extract low level 1
+extract mach 1
+extract mean 1
+extract method 1
+extract method rec 1
+extract mor parallel 1
+extract mult 1
+extract mult dim 1
+extract n el 1
+extract new descript 1
+extract of character 1
+extract of contigu 1
+extract of isosurfac 1
+extract of low 1
+extract of visu 1
+extract parallel 2
+extract proc 3
+extract procedur 1
+extract produc 1
+extract produc cl 1
+extract random 1
+extract result 1
+extract rl 1
+extract schem 1
+extract som proper 1
+extract ssm 1
+extract structur 1
+extract techniqu 1
+extract text 2
+extract text reg 1
+extract textur 1
+extract textur reg 1
+extract th actu 1
+extract th ba 1
+extract th cur 1
+extract th forml 1
+extract th glob 1
+extract th inform 1
+extract th init 1
+extract th join 1
+extract th main 1
+extract th network 1
+extract th origin 1
+extract th srin 1
+extract tool 2
+extract tool sourc 1
+extract valu 2
+extract visu 1
+extract visu featur 1
+extract visu sign 1
+extract without user 1
+extrair 2
+extrair ae 1
+extrair ae la 1
+extrair attribut 1
+extrair i2 1
+extrair i2 de 1
+extrair ik 1
+extrair ik de 1
+extrair ik sous 1
+extrair la 1
+extrair la var 1
+extrait 2
+extrait de 2
+extrait de la 2
+extrait de perm 1
+extrait et qu 1
+extrait gr 1
+extrait gr ac 1
+extrait i2 1
+extrait i2 de 1
+extrait la 1
+extrait la var 1
+extran 4
+extran dat 1
+extran fac 1
+extran match 1
+extran synchron 1
+extran triangl 1
+extran triangl produc 1
+extraordin 2
+extraordin growth 1
+extraordin low 1
+extrapol 4
+extrapol mi 1
+extrapol mi point 1
+extrapol to outer 1
+extrem 35
+extrem attract 1
+extrem attract resourc 1
+extrem benef 1
+extrem ca 5
+extrem ca ment 1
+extrem circumst 1
+extrem circumst wh 1
+extrem confus 1
+extrem cont 1
+extrem difficult 1
+extrem econom 1
+extrem eigenvalu 1
+extrem exampl 1
+extrem flec 1
+extrem for divid 1
+extrem high complec 1
+extrem import 1
+extrem ineff 1
+extrem is attempt 1
+extrem larg amount 1
+extrem lightweight 1
+extrem low 1
+extrem low prior 1
+extrem on find 1
+extrem point 3
+extrem point match 1
+extrem poor 1
+extrem power 2
+extrem power not 1
+extrem power reuseb 1
+extrem problem 1
+extrem problem typ 1
+extrem rough 1
+extrem saf 1
+extrem scenar 1
+extrem se 1
+extrem select 1
+extrem short liv 1
+extrem simpl 1
+extrem simpl decod 1
+extrem spar 1
+extrem spar graph 1
+extrem succ 1
+extrem tim 1
+extrem tim consum 1
+extrem us 3
+extrem valu 1
+extrem wel preserv 1
+extrem wh 1
+exu 1
+exu connect 1
+exub 1
+exub erant 1
+ey 4
+ey saf 1
+ey saf beam 1
+ezout 1
+ezout assoc 1
+ezout assoc ee 1
+ezout par 1
+f.a 2
+f.d 1
+f.e 1
+f.f 1
+f.f.a 1
+f.i 1
+f.j 1
+f.m 2
+f.p 2
+f.w 1
+f0 21
+f0 an aff 1
+f0 and f1 1
+f0 ar upd 1
+f0 f0 1
+f0 minff 1
+f0 s2 1
+f0 wh 1
+f0 wh fl 1
+f02n 1
+f0f 1
+f0fskg 1
+f0g 3
+f0g par 1
+f0g par exempl 1
+f0r 1
+f1 35
+f1 and f2 1
+f1 and x2 1
+f1 f f2 1
+f1 f g1 1
+f1 f1 1
+f1 f2 5
+f1 f2 def 1
+f1 f2 f3 1
+f1 f3 1
+f1 ff f2 1
+f1 is posit 1
+f1 is self 1
+f1 is thus 1
+f1 project 1
+f1 s3 1
+f1 wil rec 1
+f10 1
+f100 1
+f11 3
+f11 gd 1
+f11f12 1
+f12 3
+f12 gd 1
+f12 gsmnd 1
+f12 gsmnd k8 1
+f12f13f14 1
+f13 1
+f1600 1
+f1600 dnr 1
+f1600 dnr f3200 1
+f1600 f3200 1
+f1600 f3200 f6400 1
+f1f 1
+f1f2 1
+f1f2 for self 1
+f1f2 int self 1
+f1f2f3 1
+f1f2f3 f2f3f4 1
+f1f2f3 f2f3f4 f2f3f5 1
+f1f4f5 1
+f1fskg 1
+f1g 4
+f1g b f2g 1
+f1g e f5g 1
+f1g f1g 1
+f1g f1g f3g 1
+f1g f3g 1
+f1g f3g f1 1
+f1i 2
+f1i f2i 1
+f1i g1 1
+f1i g1 xi 1
+f1j 1
+f1j f2j 1
+f2 18
+f2 and fd 1
+f2 and henc 1
+f2 ar giv 1
+f2 ar self 1
+f2 def 1
+f2 def f1 1
+f2 def fx1 1
+f2 f g2 1
+f2 f3 2
+f2 for problem 1
+f2 is assum 1
+f2 problem 1
+f2 problem se 1
+f2 produc 1
+f2 s4 1
+f21 2
+f21 and bfg 1
+f21 gdy 1
+f21 problem 1
+f21 problem se 1
+f21f22 1
+f21f24f25 1
+f21f24f25 with f2i 1
+f22 1
+f22 gdy 1
+f2a10b26cj 1
+f2b 1
+f2f3 1
+f2f3f4 1
+f2f3f4 f2f3f5 1
+f2f3f4 f2f3f5 f1f4f5 1
+f2f3f5 1
+f2f3f5 f1f4f5 1
+f2g 4
+f2g c f3g 1
+f2g f3g 1
+f2g f3g f2 1
+f2i 2
+f2i g2 1
+f2i g2 xi 1
+f2j 1
+f2j f1i 1
+f3 8
+f3 wil us 1
+f30602 1
+f3200 1
+f3200 dnr 1
+f3200 dnr f6400 1
+f3200 f6400 1
+f3200 f6400 g125.17 1
+f3g 2
+f3g d f4g 1
+f3g f1 1
+f3g f2 1
+f3g f3 1
+f4 3
+f400 1
+f49620 1
+f4g 1
+f4g f4 1
+f5 1
+f5g 1
+f5g f1 1
+f6 2
+f6400 1
+f6400 dnr 1
+f6400 dnr g125.17 1
+f6400 g125.17 1
+f6400 g125.17 g125.18 1
+f6g 1
+f6g f3g 1
+f6g f3g f3 1
+f7 2
+f7gg 1
+f8 1
+f800 1
+f800 dnr 1
+f800 dnr f1600 1
+f800 f1600 1
+f800 f1600 f3200 1
+f9 3
+fa 18
+fa appel 1
+fa appel aux 1
+fa autour 1
+fa autour dun 1
+fa avec 1
+fa co 2
+fa co ut 2
+fa con 3
+fa con al 1
+fa con automatiqu 1
+fa con beaucoup 1
+fa con brut 1
+fa con classiqu 1
+fa con equit 1
+fa con equiv 1
+fa con fondam 1
+fa con pr 1
+fa con probabil 1
+fa con signif 1
+fa con suiv 2
+fa con transpar 1
+fa d la 1
+fa de 1
+fa de la 1
+fa donc 1
+fa est 1
+fa est certain 1
+fa estim 1
+fa estim du 1
+fa et diffus 1
+fa et pour 1
+fa et util 1
+fa explicit 1
+fa grain 1
+fa grain qu 1
+fa import 1
+fa import dan 1
+fa influ 1
+fa influ sur 1
+fa intervenir 2
+fa intervenir au 1
+fa intervenir de 2
+fa intervenir qu 1
+fa lhypoth 1
+fa lhypoth es 1
+fa lobj 1
+fa lobj du 1
+fa localit 1
+fa lorsquil 1
+fa lorsquil ec 1
+fa on agr 1
+fa ordr 1
+fa ordr auront 1
+fa pa 1
+fa pa intervenir 1
+fa par 1
+fa par rapport 1
+fa part 1
+fa part de 1
+fa perm 1
+fa pointer 1
+fa pointer le 1
+fa pour 2
+fa pour la 1
+fa pour mvp 1
+fa pour qu 1
+fa quaux 1
+fa quaux sel 1
+fa r eal 1
+fa sur 1
+fa sur un 1
+fa surc 1
+fa surc ut 1
+fa tail 1
+fa tail de 1
+fa var 1
+fa var de 1
+fa var la 1
+fa var le 1
+fa1 3
+fabr 7
+fabr assez 1
+fabr assez ai 1
+fabr constraint 2
+fabr cour 1
+fabr de 1
+fabr de dispositif 1
+fabr de la 1
+fabr mostaf 1
+fabr mostaf nassar 1
+fabr of lit 1
+fabr sampl 1
+fabr z mostaf 1
+fac 40
+fac a de 2
+fac a simil 1
+fac adjac 1
+fac adjoin 1
+fac and aud 1
+fac and med 1
+fac and vo 1
+fac ar compar 1
+fac ar indeed 1
+fac ar produc 1
+fac ar retain 1
+fac as trip 1
+fac b closest 1
+fac b0 1
+fac b1 1
+fac b2 1
+fac belong 1
+fac by network 1
+fac can involut 1
+fac caus 1
+fac closest 1
+fac commun 1
+fac commun mod 1
+fac cr 1
+fac environm 1
+fac environm differ 1
+fac ext 1
+fac fac 1
+fac fac mod 1
+fac form 1
+fac imag 1
+fac in calcl 1
+fac in front 1
+fac in p1 1
+fac in p2 1
+fac individu 1
+fac individu result 1
+fac intersect 1
+fac involut 1
+fac is common 1
+fac is defin 1
+fac is ignor 1
+fac is sharp 1
+fac is smaller 1
+fac lat 1
+fac may requir 1
+fac me 1
+fac me environm 1
+fac mod 1
+fac mod ec 1
+fac mor obstacl 1
+fac must adjoin 1
+fac norm 1
+fac of amer 1
+fac of direct 1
+fac of fin 1
+fac of tetrahedr 1
+fac or fac 1
+fac produc 1
+fac regard 1
+fac rot 1
+fac sever difficult 1
+fac shash 1
+fac shash shekhar 1
+fac situ 1
+fac structur 1
+fac support 1
+fac support contact 1
+fac th complec 1
+fac th problem 2
+fac that adjoin 1
+fac that belong 1
+fac that replac 1
+fac tim 1
+fac tim fac 1
+fac tim speedup 1
+fac to describ 1
+fac to fac 2
+fac to facemod 1
+fac to. 1
+fac tofac 1
+fac tofac commun 1
+fac top 1
+fac top level 1
+fac touch 1
+fac ver 1
+fac ver pair 1
+fac vo 1
+fac without affect 1
+fac without lo 1
+fac would reduc 1
+faccg 1
+facemod 1
+facemod group 1
+fachbereich 1
+fachbereich informatik 1
+facil 25
+facil a la 1
+facil a mettr 1
+facil allow 1
+facil allow sl1 1
+facil avail 1
+facil ce 1
+facil ce algorithm 1
+facil certain 1
+facil certain el 1
+facil combin 1
+facil combin ee 1
+facil compil 1
+facil compil ee 1
+facil d etect 1
+facil de 2
+facil de modif 1
+facil de multipl 1
+facil de supprimer 1
+facil dexhiber 1
+facil dexhiber de 1
+facil donc 1
+facil donc la 1
+facil est 1
+facil est de 1
+facil etr 1
+facil etr acc 1
+facil etr compar 1
+facil etr test 1
+facil evit 1
+facil evit ee 1
+facil extensibl 1
+facil for multicast 1
+facil for remot 1
+facil g en 1
+facil grand 1
+facil grand lobt 1
+facil great 1
+facil great simplif 1
+facil guar 1
+facil guar virtu 1
+facil handl 1
+facil handl inform 1
+facil inconceiv 1
+facil int 1
+facil is un 1
+facil l ecritur 1
+facil la 3
+facil la compr 1
+facil la olectur 1
+facil la recherch 1
+facil layout 1
+facil le 1
+facil le ch 1
+facil le court 1
+facil lext 1
+facil lext de 1
+facil lik integer 1
+facil list 1
+facil of dat 1
+facil of sep 1
+facil on top 1
+facil prov 1
+facil prov virtu 1
+facil rel 1
+facil remplac 1
+facil remplac es 1
+facil th resourc 1
+facil to extract 1
+facil transform 1
+facil which enabl 1
+facil which support 1
+facil y etr 1
+facilit 24
+facilit a comparison 1
+facilit a simpl 1
+facilit acc 1
+facilit aus 1
+facilit aus limpl 1
+facilit by adopt 1
+facilit by equipm 1
+facilit by neal 1
+facilit chang 1
+facilit collabor 1
+facilit dat 2
+facilit dat acc 1
+facilit dat shar 1
+facilit e dan 1
+facilit e de 1
+facilit es 1
+facilit es de 1
+facilit feder 1
+facilit implem 1
+facilit interact 1
+facilit interact tool 1
+facilit monit 1
+facilit mor intuit 1
+facilit natur 1
+facilit natur langu 1
+facilit proc 1
+facilit proc interact 1
+facilit procedur 1
+facilit procedur cal 1
+facilit rol 1
+facilit rol part 1
+facilit softwar 2
+facilit softwar developm 2
+facilit such implem 1
+facilit th an 1
+facilit th chain 1
+facilit th connect 1
+facilit th desir 1
+facilit th developm 1
+facilit th execut 1
+facilit th implem 1
+facilit th int 1
+facilit th plac 1
+facilit th pr 1
+facilit th proc 1
+facilit th program 1
+facilit th run 1
+facilit th structur 1
+facilit th stud 1
+facilit th transform 1
+facilit writ 1
+facilit writ error 1
+faciliter 2
+faciliter la 2
+faciliter la compr 1
+faciliter le 2
+faciliter le calcl 2
+faciliter le comparaison 1
+fact 108
+fact a cal 1
+fact a realloc 1
+fact a simpl 1
+fact a typ 1
+fact a uniqu 1
+fact about babel 1
+fact about boolean 1
+fact about dog 1
+fact about solut 1
+fact affect 1
+fact al elimin 1
+fact al nin 1
+fact algorithm 1
+fact allow 1
+fact and affin 1
+fact and cluster 1
+fact and dep 1
+fact and high 1
+fact and observ 1
+fact and rel 1
+fact and rl 2
+fact and simplif 1
+fact and treat 1
+fact and triangl 1
+fact and us 1
+fact ar describ 1
+fact ar discrep 1
+fact ar es 1
+fact ar inter 1
+fact ar nec 1
+fact ar repr 1
+fact as follow 1
+fact as td1 1
+fact be collect 1
+fact be high 1
+fact been solut 1
+fact befor actu 1
+fact being asser 1
+fact being rel 1
+fact by count 1
+fact by find 1
+fact by introduc 1
+fact can interact 1
+fact comb 1
+fact con 1
+fact de 1
+fact de acc 1
+fact def 1
+fact dep 1
+fact dep heav 1
+fact deriv 2
+fact design 1
+fact determin 1
+fact direct influ 1
+fact disc 1
+fact discount 1
+fact do matter 1
+fact docum 1
+fact dynam 1
+fact dynam log 1
+fact ensur 1
+fact equiv 2
+fact es 1
+fact es pour 1
+fact even forml 1
+fact follow 2
+fact for explor 1
+fact for main 1
+fact for poor 1
+fact for widespread 1
+fact form 1
+fact greater 3
+fact greater tim 1
+fact implem 1
+fact in comput 3
+fact in design 1
+fact in disjunct 1
+fact in equ 1
+fact in f0 1
+fact incr 1
+fact indep 1
+fact influ 1
+fact int account 1
+fact int consider 1
+fact interest 1
+fact involut 1
+fact is attach 1
+fact is comput 1
+fact is giv 1
+fact is polynom 1
+fact is wrong 1
+fact join 1
+fact lead 2
+fact learner 1
+fact lik appl 2
+fact lik exact 2
+fact lik path 2
+fact lin 1
+fact lin object 1
+fact might correspon 1
+fact must contain 1
+fact nw 1
+fact nw sw 1
+fact of 2t 1
+fact of act 1
+fact of compmst 1
+fact of group 1
+fact of log 1
+fact of o.log 1
+fact of occur 1
+fact of optim 1
+fact oft mak 1
+fact on disturb 1
+fact on polyhedr 1
+fact oper 1
+fact oper count 1
+fact par 1
+fact par el 1
+fact pl 1
+fact pot 1
+fact proc 1
+fact rel 1
+fact result 1
+fact ri 1
+fact rl 1
+fact run 1
+fact run tim 1
+fact schedl 1
+fact ser 1
+fact should cover 1
+fact soc 1
+fact soc 34th 1
+fact stand 1
+fact standard 2
+fact structur 1
+fact suff 1
+fact suggest 1
+fact support 1
+fact switch 1
+fact techniqu 1
+fact th 3d 1
+fact th constraint 1
+fact th isvl 1
+fact th major 1
+fact th mak 1
+fact th network 1
+fact th polynom 1
+fact th smallest 1
+fact th styl 1
+fact that acc 1
+fact that affect 3
+fact that appear 1
+fact that argum 1
+fact that contribut 2
+fact that cur 1
+fact that dct 1
+fact that deriv 1
+fact that distingu 1
+fact that docum 1
+fact that dog 1
+fact that du 1
+fact that eclip 1
+fact that edg 1
+fact that form 1
+fact that gener 1
+fact that high 1
+fact that human 1
+fact that i0 1
+fact that inclus 1
+fact that influ 1
+fact that input 1
+fact that multip 1
+fact that no 1
+fact that observ 1
+fact that peopl 1
+fact that pi 2
+fact that priork 1
+fact that produc 1
+fact that project 1
+fact that reduc 1
+fact that remot 1
+fact that request 1
+fact that satisf 1
+fact that specif 1
+fact that substitut 1
+fact that switch 1
+fact that text 1
+fact that tim 1
+fact that tok 1
+fact that typ 1
+fact that v0 1
+fact that v1 1
+fact tim 1
+fact to check 1
+fact to consider 1
+fact to mak 1
+fact to prov 1
+fact to us 1
+fact turn 1
+fact under investig 1
+fact underl 1
+fact using 1
+fact using finit 1
+fact valu 2
+fact wer high 1
+fact wer measur 1
+fact which partit 1
+fact whil solut 1
+fact with near 1
+fact with osl 1
+fact with part 1
+fact with respect 1
+fact would benefit 1
+fact x occur 1
+facteur 6
+facteur clef 1
+facteur clef de 1
+facteur dacc 1
+facteur dacc el 1
+facteur dalign 1
+facteur dam 1
+facteur dam elior 1
+facteur dexpan 1
+facteur dexpan du 1
+facteur influ 1
+facteur influ sur 1
+facteur orthogonaux 1
+facteur orthogonaux solut 1
+facteur sont 1
+facteur sont don 1
+facteur techniqu 1
+factoriser 1
+factoriser alloc 1
+factu 3
+factu knowledg 2
+factu knowledg level 2
+factu quest 1
+facturer 1
+facturer of ol 1
+facult 7
+facult anonym 2
+facult anonym ftp 1
+facult anonym ftpsit 1
+facult es 1
+facult es universitair 1
+facult facult 1
+facult neal 1
+facult neal holtz 1
+facult of engineer 2
+facult of techn 2
+facult stud 1
+faculteit 2
+faculteit der 2
+faculteit der technisch 2
+fag 2
+faggrf 1
+fagin 1
+fahlman 1
+faibl 3
+faibl coupl 1
+faibl coupl ee 1
+faibl dan 1
+faibl dan le 1
+faibl de 2
+faibl de la 2
+faibl pour 1
+faibl pour pouvoir 1
+fail 49
+fail alloc 1
+fail alloc cod 1
+fail and om 1
+fail any longer 1
+fail approxim 1
+fail becom 1
+fail by halt 1
+fail c2 1
+fail cod 1
+fail cod de 1
+fail compon 1
+fail concat 1
+fail deep 1
+fail deep com 1
+fail deep requ 1
+fail deep tb 1
+fail est 1
+fail est aus 1
+fail est charg 1
+fail est lim 1
+fail est similair 1
+fail execut 1
+fail fail 2
+fail for semiinterv 1
+fail got 1
+fail got bp 1
+fail heur 1
+fail host 1
+fail indep 1
+fail infer 1
+fail instruc 1
+fail interfac 1
+fail label 1
+fail label strateg 1
+fail larit 1
+fail leav 1
+fail leav contain 1
+fail link 1
+fail loop 1
+fail man tim 1
+fail member 1
+fail mor conspicu 1
+fail ne 1
+fail ne peut 1
+fail of object 1
+fail on arbitr 1
+fail or repair 1
+fail principl 1
+fail principl heur 1
+fail proc 2
+fail proc deliver 1
+fail proc execut 1
+fail proc rec 1
+fail qu 1
+fail qu est 1
+fail r eduit 1
+fail real util 1
+fail run 1
+fail run giv 1
+fail saf 1
+fail saf rout 1
+fail se 1
+fail se charg 1
+fail server 1
+fail shallow 1
+fail shallow alor 1
+fail shallow dun 1
+fail shallow ou 1
+fail shallow peut 1
+fail shallow virtu 1
+fail standard 1
+fail standard instruc 1
+fail stop 3
+fail stop failur 2
+fail stop fault 1
+fail stop proc 2
+fail th criter 1
+fail then exit 1
+fail to account 1
+fail to biconnect 1
+fail to bridg 1
+fail to caus 1
+fail to commun 1
+fail to distingu 1
+fail to elim 1
+fail to ensur 1
+fail to equ 1
+fail to hold 1
+fail to keep 3
+fail to mak 1
+fail to parallel 1
+fail to preserv 1
+fail to prov 2
+fail to reach 1
+fail to reduc 1
+fail to satisfact 1
+fail to tak 2
+fail to term 1
+fail to track 1
+fail tr 1
+fail virtu 1
+fail virtu la 1
+fail when combin 1
+fail when text 1
+fail with reason 1
+fail0 1
+fail0 fail 1
+fail0 rreq 1
+fail1 1
+fail1 fail 1
+fail1 fail2 1
+fail1 fail2 rreq 1
+fail2 1
+fail2 fail 1
+fail2 rreq 1
+failover 2
+failover for appl 1
+failover manag 1
+failover manag softwar 1
+failover mechan 1
+failover mechan arrang 1
+failover mechan prov 1
+failover model 1
+failover model repl 1
+failover occur 1
+failover tim 1
+failover tim 2f 1
+failover tim dep 1
+failover tim giv 1
+failover tim smaller 1
+failsaf 1
+failsaf distribut 1
+failsaf distribut rout 1
+failur 26
+failur al ec 1
+failur al hold 1
+failur al us 1
+failur aler 1
+failur and allow 1
+failur and crash 1
+failur and group 1
+failur and halt 1
+failur and mach 1
+failur and protocol 1
+failur and repair 2
+failur and repair.5 1
+failur and retrief 1
+failur and succ 1
+failur ap 1
+failur ap transl 1
+failur ar 2
+failur ar compl 1
+failur ar count 1
+failur ar fail 1
+failur ar mask 1
+failur assum 1
+failur at tim 1
+failur autom 1
+failur autom reconfigur 1
+failur begin 1
+failur by backtrack 1
+failur by run 1
+failur by using 1
+failur can ar 1
+failur caus 2
+failur combin 1
+failur could occur 1
+failur degr 1
+failur dep 1
+failur detect 3
+failur detect lat 1
+failur disc 1
+failur distribut 1
+failur driv 1
+failur dur recov 1
+failur ev hour 1
+failur event 1
+failur exceed 1
+failur exhibit 1
+failur fr 1
+failur fr run 1
+failur grac 1
+failur handl 1
+failur in ch 1
+failur in high 1
+failur instead 1
+failur is dealt 1
+failur is near 1
+failur is rel 1
+failur is repr 1
+failur is simil 1
+failur key 1
+failur link 1
+failur may go 1
+failur model 1
+failur model concern 1
+failur nod 1
+failur occur 4
+failur occur indep 1
+failur of prev 1
+failur of sit 1
+failur on 1
+failur or ask 1
+failur or host 1
+failur or me 1
+failur or recov 1
+failur outlin 1
+failur pr 2
+failur pr numer 1
+failur prev 1
+failur prob 1
+failur protocol 1
+failur rat 2
+failur recov 1
+failur remain 1
+failur remain unnot 1
+failur repair 1
+failur repair occur 1
+failur requir 1
+failur spec 1
+failur spec ind 1
+failur tb 1
+failur then follow 1
+failur to agr 1
+failur to distingu 1
+failur typ 1
+failur typ incorrect 1
+failur typ list 1
+failur typ xp 1
+failur us 1
+failur us 2f 1
+failur wil appear 1
+failur wil backtrack 1
+failur would lead 1
+fair 41
+fair algorithm 1
+fair amount 1
+fair and conserv 1
+fair and implem 1
+fair and real 1
+fair appar 1
+fair appar tr 1
+fair appel 1
+fair behavior 1
+fair behavior mak 1
+fair bien 1
+fair by offer 1
+fair ce 1
+fair ce op 1
+fair character 1
+fair compar 2
+fair comparison 1
+fair compl 1
+fair compl pictur 1
+fair complec 2
+fair conc 1
+fair conc specif 1
+fair condit 1
+fair correspondr 1
+fair cost 1
+fair cost comparison 1
+fair cr 2
+fair cr sect 1
+fair cr tr 1
+fair dan 2
+fair dan le 1
+fair dan lordr 1
+fair de 3
+fair de hypoth 2
+fair de probabilit 1
+fair den 1
+fair ea 3
+fair effect 1
+fair effectuer 1
+fair effectuer le 1
+fair en 2
+fair en modif 1
+fair en sort 2
+fair et men 1
+fair ev 1
+fair ev distribut 1
+fair evoluer 1
+fair evoluer un 1
+fair fac 1
+fair figurer 1
+fair figurer dan 1
+fair flec 1
+fair for pipelin 1
+fair guar 1
+fair guar ensur 1
+fair ic 1
+fair interleav 1
+fair intervenir 2
+fair intervenir de 2
+fair la 1
+fair la diff 1
+fair la distinct 1
+fair larg buffer 1
+fair le 1
+fair le mi 1
+fair le remarqu 1
+fair leak 1
+fair leak buck 1
+fair lightweight 1
+fair lobj 2
+fair lobj de 1
+fair lobj dun 1
+fair lorsqu 1
+fair lorsqu lec 1
+fair low 1
+fair low specif 1
+fair manner 3
+fair migrer 1
+fair migrer cel 1
+fair migrer la 1
+fair migrer un 1
+fair nous 1
+fair nous consid 1
+fair occuper 1
+fair occuper la 1
+fair of fram 1
+fair of rat 1
+fair of serv 1
+fair par 1
+fair par ecritur 1
+fair parameter 1
+fair partager 1
+fair partager un 1
+fair perdr 1
+fair perdr un 1
+fair pointer 1
+fair pointer le 1
+fair pour 1
+fair pour le 1
+fair pour ne 1
+fair proper 1
+fair quau 1
+fair quau traver 1
+fair queu 1
+fair queu algorithm 1
+fair queu architectur 1
+fair queu belong 1
+fair queu maintain 1
+fair queu requir 1
+fair queu schem 1
+fair queu using 1
+fair r egner 1
+fair refroidir 1
+fair refroidir tr 1
+fair requir 2
+fair san unif 1
+fair schedl 1
+fair schedl algorithm 1
+fair simp 1
+fair simpl 2
+fair simpl pag 1
+fair smal const 1
+fair soit 1
+fair specif 1
+fair specif group 1
+fair st 1
+fair standard 1
+fair straightfor 1
+fair tim 1
+fair tim cost 1
+fair to conclus 1
+fair to estim 1
+fair to individu 1
+fair to say 1
+fair tourner 1
+fair tourner la 1
+fair tous 1
+fair tous se 1
+fair un 1
+fair un requ 1
+fair uniform 1
+fair which follow 1
+fair wid 1
+fair wid avail 1
+fair with regard 1
+faisabilit 1
+faisabilit e de 1
+faison 2
+faison en 1
+faison en outr 1
+faison ic 1
+faison ic lhypoth 1
+faison le 1
+faison le point 1
+fait 5
+fait a ce 1
+fait appel 1
+fait appr 1
+fait appr ec 1
+fait apr 1
+fait apr es 1
+fait au 1
+fait au niveau 1
+fait aucun 1
+fait aucun diff 1
+fait avec 1
+fait avec le 1
+fait ce 1
+fait ce point 1
+fait centr 1
+fait centr de 1
+fait clair 1
+fait clair appar 1
+fait classiqu 1
+fait consid 1
+fait consid er 1
+fait d eliminer 1
+fait d esaccord 1
+fait dailleur 1
+fait dailleur du 1
+fait dan 2
+fait dan ce 1
+fait dan le 1
+fait dan notr 1
+fait de 3
+fait de ca 1
+fait de garder 1
+fait de gauch 1
+fait de la 2
+fait de lab 1
+fait de ladr 1
+fait de lec 1
+fait de lestampil 1
+fait de lintroduc 1
+fait de man 2
+fait de po 1
+fait de pr 1
+fait de raisonner 1
+fait de se 1
+fait de traiter 1
+fait deux 1
+fait diff 1
+fait diff erent 1
+fait donc 1
+fait donc pa 1
+fait du 2
+fait du co 1
+fait du pa 1
+fait du part 1
+fait du surc 1
+fait dun 1
+fait dun coupur 1
+fait dun echec 1
+fait dun net 1
+fait dun tail 1
+fait en 1
+fait en plac 1
+fait encor 1
+fait encor couler 1
+fait et le 1
+fait evit 1
+fait il 1
+fait il nen 1
+fait impl 1
+fait impl ement 1
+fait intervenir 1
+fait intervenir qu 1
+fait l ag 1
+fait l egitim 1
+fait l etud 1
+fait la 1
+fait la preuv 1
+fait lanc 1
+fait lanc attribut 1
+fait le 1
+fait le grand 1
+fait le point 1
+fait lhonneur 2
+fait lhonneur de 2
+fait lhypoth 1
+fait lhypoth es 1
+fait lobj 1
+fait lobj du 1
+fait lor 2
+fait lor de 2
+fait lunanim 1
+fait mat 1
+fait montr 1
+fait montr dun 1
+fait naturel 1
+fait naturel sauvegard 1
+fait not 1
+fait not qu 1
+fait pa 2
+fait pa intervenir 1
+fait pa la 1
+fait pa lhypoth 1
+fait par 1
+fait par el 1
+fait par le 1
+fait part 1
+fait part de 1
+fait peut 1
+fait peut surprendr 1
+fait pointer 1
+fait pointer le 1
+fait pour 1
+fait pour lenviron 1
+fait qu 5
+fait qu ce 2
+fait qu chaqu 1
+fait qu dan 1
+fait qu dupliquer 1
+fait qu la 2
+fait qu le 5
+fait qu lespac 2
+fait qu lint 1
+fait qu lon 1
+fait qu lorsquon 1
+fait qu lutil 1
+fait qu modif 1
+fait qu ol 1
+fait qu rien 1
+fait qu si 1
+fait qu tb 1
+fait quel 2
+fait quel condu 1
+fait quel peut 1
+fait quel pous 1
+fait quil 1
+fait quil ec 1
+fait quil ny 1
+fait quon 1
+fait quon do 1
+fait quun 1
+fait quun point 1
+fait quun tel 1
+fait r eduit 1
+fait r egl 1
+fait reposer 1
+fait reposer la 1
+fait san le 1
+fait tent 1
+fait tent de 1
+fait toutef 1
+fait toutef appel 1
+fait un 1
+fait un biject 1
+fait un recour 1
+fait un transform 1
+fait val 1
+fait val du 1
+faith 4
+faith and sensit 1
+faith captur 1
+faith model 1
+faith to tradit 1
+faith which allow 1
+fak 1
+fak evalu 1
+fakult 1
+fakultat 2
+fakultat fur 2
+fakultat fur informatik 2
+fal 50
+fal and run 1
+fal below sw 1
+fal between aud 1
+fal branch 1
+fal broad 1
+fal dat 2
+fal dat dep 2
+fal dep 1
+fal failur 1
+fal failur detect 1
+fal fal 1
+fal fal fal 1
+fal in bisect 2
+fal in nw 1
+fal in pack 2
+fal in posit 1
+fal int ca 1
+fal int column 1
+fal mi 1
+fal off expon 1
+fal or remain 2
+fal peopl 1
+fal positiv 1
+fal proport 1
+fal shar 3
+fal shar decr 1
+fal shar incr 1
+fal shar occur 1
+fal shar problem 1
+fal shar prov 1
+fal stil leav 1
+fal succ 1
+fal then cm 1
+fal with growth 2
+fal with incr 3
+falasch 1
+falc 1
+falk 1
+fallback 1
+fallback implem 1
+falout 1
+falout and ibrahim 1
+falout and pravin 1
+falout2 1
+falseg 1
+falsif 1
+falv 1
+fam 25
+fam architectur 1
+fam by lem 1
+fam ch 1
+fam collect 1
+fam collect protein 1
+fam correspon 1
+fam def 1
+fam fml 1
+fam fml fml 1
+fam fml solut 1
+fam is constrain 1
+fam is disjoint 1
+fam is ext 1
+fam is unconstrain 1
+fam member 1
+fam middl 1
+fam norm 1
+fam of computer 1
+fam of cut 1
+fam of dat 1
+fam of equ 1
+fam of forml 1
+fam of model 1
+fam of mult 1
+fam of oolp 1
+fam of part 1
+fam of polynom 1
+fam of proper 1
+fam of protocol 1
+fam of realm 1
+fam of rel 4
+fam of se 2
+fam of sequ 1
+fam of simil 1
+fam of sub 1
+fam of tot 1
+fam of tupl 1
+fam of typ 1
+fam of var 1
+fam opaqu 1
+fam opaqu anyw 1
+fam repr 1
+fam stat 1
+fam stat maxscor 1
+famil 25
+famil ar constrain 1
+famil ar inevit 1
+famil assez 1
+famil assez rich 1
+famil be disjoint 1
+famil begin 1
+famil begin en 1
+famil by parameter 1
+famil chest 1
+famil chest clin 1
+famil con 1
+famil con oper 1
+famil contravar 1
+famil contravar covar 1
+famil dalgorithm 1
+famil dalgorithm en 1
+famil dalgorithm stochastiqu 1
+famil datab 1
+famil datab on 1
+famil de 2
+famil de pol 1
+famil dind 1
+famil dind de 1
+famil dinstruc 1
+famil dinstruc de 1
+famil dinstruc peuv 1
+famil dinstruc try 1
+famil fac 1
+famil ha identif 1
+famil is unconstrain 1
+famil libr 1
+famil libr en 1
+famil libr fin 1
+famil look 1
+famil of compon 1
+famil of incr 1
+famil of parallel 1
+famil of regl 1
+famil of rel 1
+famil of softwar 1
+famil of system 1
+famil prolog 1
+famil prolog me 1
+famil qu 1
+famil qu inv 1
+famil styl 1
+famil to til 1
+famil try 1
+famil with hemingw 1
+famil with hilog 1
+famil with prolog 1
+famil with spat 1
+famil word 1
+fan 6
+fan angl 1
+fan explan 1
+fan model 1
+fan model appear 1
+fanc 2
+fanc exampl 1
+fanc why 1
+fanel 1
+fang 2
+fanout 1
+fant 1
+fant me 1
+fant me du 1
+fant me la 1
+fap 1
+far 4
+far na 2
+far na del 2
+far on parallel 1
+farber 1
+farhat 1
+farin 1
+farin del 1
+farin del cer 1
+farm 1
+farm stat 1
+farm stat war 1
+farmer 2
+farrel 1
+farrel for proof 1
+farrokh 1
+farther 6
+farther apart 1
+farthest 4
+farthest leaf 1
+farthest point 1
+farthest ver 1
+fash 22
+fash al subtr 1
+fash d compl 1
+fash for track 1
+fasman 1
+fasman algorithm 1
+fast 54
+fast acc 1
+fast activ 1
+fast activ mechan 1
+fast algorithm 6
+fast algorithm outperform 1
+fast algorithm perform 1
+fast and dsc 1
+fast and eff 2
+fast and effect 1
+fast and exact 1
+fast and pract 2
+fast approxim 1
+fast approxim algorithm 1
+fast arithm 1
+fast as eclip 1
+fast as imper 1
+fast as wgp 1
+fast asleep 1
+fast assignm 1
+fast assignm using 1
+fast broadcast 1
+fast cach 1
+fast cach inv 1
+fast collect 1
+fast collect commun 1
+fast compar 1
+fast compr 1
+fast compr imag 1
+fast computer 1
+fast condit 1
+fast condit branch 1
+fast converg 1
+fast curv 1
+fast dsc 1
+fast dsc etf 1
+fast dsc md 1
+fast eff 1
+fast eff parallel 1
+fast ethernet 1
+fast four 3
+fast four transform 3
+fast gener 1
+fast gener accur 1
+fast grow 1
+fast grow fragm 1
+fast implem 3
+fast interconnect 1
+fast inv 1
+fast inv mechan 1
+fast inv method 1
+fast isod 1
+fast isod cluster 1
+fast mach 1
+fast me 1
+fast me order 1
+fast mu 1
+fast multicast 1
+fast multicast broadcast 1
+fast multilevel 1
+fast multilevel implem 1
+fast network 1
+fast pack 2
+fast pack switch 2
+fast pag 1
+fast pag ba 1
+fast parallel 3
+fast parallel acc 1
+fast parallel algorithm 1
+fast path 1
+fast perform 1
+fast perform problem 1
+fast point 1
+fast point loc 1
+fast pram 1
+fast pram algorithm 1
+fast prior 1
+fast prior queu 1
+fast proc 1
+fast prolog 1
+fast random 1
+fast random acc 1
+fast real 1
+fast real render 1
+fast rel 2
+fast rel broadcast 1
+fast render 1
+fast retreiv 1
+fast retrief 1
+fast sdm 1
+fast sdm implem 1
+fast search 1
+fast search algorithm 1
+fast select 3
+fast select algorithm 1
+fast select coordin 1
+fast select inv 1
+fast siml 2
+fast siml an 1
+fast sparcst 1
+fast sparcst built 1
+fast spectr 1
+fast spectr method 1
+fast st 1
+fast st addr 1
+fast var 1
+faster 26
+faster acc 1
+faster and faster 1
+faster and parallel 1
+faster clock 1
+faster compiler 1
+faster cpus 1
+faster for smaller 1
+faster in aquarius 1
+faster in lrc 1
+faster learn 1
+faster learn var 1
+faster libr 1
+faster network 1
+faster network channel 1
+faster on program 1
+faster or slower 1
+faster our rout 1
+faster pac 1
+faster payoff 1
+faster payoff intak 1
+faster than amd 1
+faster than batch 1
+faster than chac 1
+faster than gr 1
+faster than main 1
+faster than mlb 1
+faster than prev 1
+faster than recur 1
+faster than rm 1
+faster than sa 1
+faster than sen 1
+faster to reinit 1
+faster with wgp 1
+fastest 7
+fastest algorithm 3
+fastest p proc 1
+fastest proc 1
+fastest singl 1
+fastest singl proc 1
+fastest workst 1
+fastidieux 1
+fat 9
+fat a de 1
+fat attempt 1
+fat aux 1
+fat aux perform 1
+fat catastroph 1
+fat error 1
+fat pour 1
+fat pour le 1
+fat tr 3
+fat tr construc 1
+fat tr network 1
+fat tr theor 1
+father 4
+father and activ 1
+father ar n2 1
+father bfather 1
+father cand 1
+father cand list 1
+father currnod 1
+father expr 1
+father funct 1
+father n2 1
+father nod 1
+father posit 1
+father rel 1
+father rel repr 1
+fatherexpr 1
+fatherexpr of currexp 1
+faudr 2
+faudr effectuer 1
+faudr laccompagner 1
+faudr laccompagner dun 1
+faudr veiller 1
+faudrait 1
+faudrait d onir 1
+fauger 1
+faught 1
+fault 21
+fault act 1
+fault act corrupt 1
+fault an 1
+fault and fail 1
+fault and init 1
+fault and swap 1
+fault and therefor 1
+fault ar vi 1
+fault assign 1
+fault at hardwar 1
+fault be detect 1
+fault behavior 1
+fault by introduc 1
+fault caus 1
+fault cl 1
+fault compl 1
+fault compl transpar 1
+fault compon 1
+fault detect 2
+fault detect effect 1
+fault detect forml 1
+fault do model 1
+fault du 1
+fault from nil 1
+fault ha occur 1
+fault handler 1
+fault handler check 1
+fault handler execut 1
+fault in sect 1
+fault inclus 1
+fault inclus incorrect 1
+fault incr 1
+fault instruc 1
+fault involut 1
+fault involut singl 1
+fault is consider 1
+fault is exp 1
+fault is lost 1
+fault is preserv 1
+fault link 1
+fault loc 1
+fault may caus 1
+fault may yield 1
+fault mean 1
+fault model 4
+fault model real 1
+fault modif 1
+fault modif program 1
+fault nod 1
+fault occur 4
+fault occur main 1
+fault of system 1
+fault on ordin 1
+fault on pag 1
+fault onl decr 1
+fault or repair 1
+fault overhead 1
+fault path 1
+fault prim 1
+fault prim.1 1
+fault proc 3
+fault proc chang 1
+fault proc upd 1
+fault program 1
+fault program ver 1
+fault reduc 1
+fault rev 1
+fault rev capabil 1
+fault rev du 1
+fault rev simp 1
+fault rev test 1
+fault seed 1
+fault seem 1
+fault server 1
+fault server becom 1
+fault server detect 1
+fault stop 1
+fault system 1
+fault system behavior 1
+fault that affect 1
+fault that corrupt 1
+fault that effect 1
+fault that mak 1
+fault that perturb 1
+fault that yield 1
+fault tim 1
+fault tim tim 1
+fault toler 13
+fault toler architectur 1
+fault toler comput 5
+fault toler protocol 2
+fault toler queu 1
+fault toler schem 1
+fault toler serv 1
+fault toler system 1
+fault toler topolog 1
+fault tr 1
+fault tr an 1
+fault tr exampl 1
+fault tr not 1
+fault tr st 1
+fault typ 1
+fault until p2 1
+fault ver 1
+faultcl 1
+faultrev 1
+faultrev capabil 1
+faulttoler 1
+faulttoler comput 1
+faulttoler comput system 1
+faus 3
+faus compl 1
+faus compl es 1
+faus d epen 1
+faus ma 1
+faus ma un 1
+faus pour 1
+faustin 2
+faustin and wadg 1
+faut 4
+faut alor 1
+faut alor de 1
+faut alor soit 1
+faut avouer 1
+faut avouer quun 1
+faut cep 1
+faut cep noter 1
+faut choisir 1
+faut choisir dy 1
+faut commencer 1
+faut commencer par 1
+faut d emontrer 1
+faut d eterminer 1
+faut d tr 1
+faut de 1
+faut de pag 1
+faut distinguer 1
+faut distinguer deux 1
+faut donc 1
+faut donc ajouter 1
+faut donc od 1
+faut maint 1
+faut maint savoir 1
+faut modif 1
+faut modif la 1
+faut n eanmoin 2
+faut noter 1
+faut noter qu 1
+faut oenjamber 1
+faut oenjamber lor 1
+faut pour 1
+faut pr 1
+faut pr eciser 1
+faut san dout 1
+faut veiller 1
+faux 3
+faux au 1
+faux au cour 1
+faux en 1
+faux en quit 1
+faux lor 1
+faux lor de 1
+faux n gatif 1
+faux part 1
+faux part cel 1
+faux part com 1
+faux part commenc 1
+faux part comp 1
+faux part dan 1
+faux part difficil 1
+faux part doubl 1
+faux part en 1
+faux part entr 1
+faux part est 1
+faux part lor 1
+faux part ma 1
+faux part occ 1
+faux part ou 1
+faux part par 1
+faux part pour 1
+faux part pouvait 1
+faux part qu 1
+faux part risqu 1
+faux part se 1
+faux part serait 1
+faux part sur 1
+faux part tout 1
+faux positif 1
+faux positif dan 1
+faux pour 1
+fauxpart 1
+fauxpart qu 1
+fauxpart qu est 1
+fauxpart sinspir 1
+fauxpart sinspir de 1
+faveur 1
+faveur de 1
+faveur de la 1
+faveur dun 1
+faveur dun op 1
+faveur dun pa. 1
+favor 10
+favor architectur 1
+favor architectur implem 1
+favor cost 1
+favor cost effect 1
+favor de 1
+favor de la 1
+favor es 1
+favor es au 1
+favor est 1
+favor est celu 1
+favor imag 1
+favor imag proc 1
+favor le 1
+favor le acc 1
+favor mechan 1
+favor mechan real 1
+favor of gener 1
+favor pour 1
+favor pour notr 1
+favor sequ 1
+favor th branch 1
+favor ver 1
+favor ver connect 1
+favorabl 1
+favorabl a la 1
+favoriser 2
+favoriser ce 1
+favoriser ce typ 1
+favoriser la 1
+favoriser la dom 1
+favour 3
+favour of f2 1
+favour th trickledown 1
+favourit 2
+favourit docum 1
+favourit method 1
+faxiom 1
+faxiom for argum 1
+fb 2
+fb0 2
+fb1 2
+fb8 1
+fb93 1
+fbasak 1
+fbf 1
+fbg 2
+fbl 1
+fc 5
+fc defin 1
+fc is dual 1
+fc is dualminor 1
+fc is self 1
+fc0 1
+fc1 1
+fc1ij 1
+fc2ij 1
+fc89 1
+fcal 1
+fcal assign 1
+fcal fo 1
+fcf 2
+fcf queu 1
+fcf serv 1
+fcg 1
+fcheck 1
+fcheck mi 1
+fcig 1
+fcl 1
+fcomin 1
+fcomp 1
+fcomp m1 1
+fcomp mi 1
+fcompan 1
+fconfg 1
+fcover 1
+fcp 1
+fcur 1
+fcur ts 1
+fd 8
+fd and boolean 1
+fd and dual 1
+fd boolean 1
+fd boolean variabl 1
+fd connectiv 1
+fd constraint 1
+fd f f1 1
+fd f fd 1
+fd f1 1
+fd f1 f2 1
+fd gd 1
+fd hold 1
+fd is obtain 1
+fd is posit 1
+fd or atm 1
+fd repr 1
+fd repr show 1
+fd solut 1
+fd solver 1
+fd var 1
+fd var qi 1
+fd variabl 1
+fd variabl approach 1
+fd variabl lead 1
+fd variabl oz 1
+fd variabl solut 1
+fd variabl using 1
+fd0 1
+fd1 2
+fd1 fdhd 1
+fd1 fdhd fd 1
+fd2 1
+fd2 f2 1
+fdav 1
+fdeb 1
+fdeletemin 1
+fdepartmentg 1
+fdepartmentg fnowg 1
+fdepartmentl 1
+fdetail 1
+fdetail is.s 1
+fdf 1
+fdf and ff 1
+fdf ff 1
+fdf ff repr 1
+fdg 1
+fdg f impl 1
+fdg1 1
+fdg1g2 1
+fdgd 1
+fdh 1
+fdhd 1
+fdhd fd 1
+fdnameg 1
+fdnameg avg 1
+fdp 1
+fdsp 1
+fdspl 1
+fdy 1
+fe 37
+fe an 1
+fe an perform 1
+fe appl 1
+fe commun 1
+fe commun schedl 1
+fe competit 1
+fe configur 2
+fe configur offer 2
+fe domain 1
+fe edg 1
+fe g fdepartmentg 1
+fe g fsalaryg 1
+fe gfdepartm 1
+fe hav me 1
+fe institut 1
+fe matr 1
+fe model 1
+fe model com 1
+fe object 1
+fe of cach 1
+fe of tempor 1
+fe parallel 1
+fe parallel cod 1
+fe program 1
+fe program du 1
+fe program smart 1
+fe renc 1
+fe se 1
+fe solut 1
+fe system 2
+fe system configur 2
+fe tim 2
+fe tim ser 1
+fe tim slot 1
+fe to find 1
+fe to solut 1
+fe to us 1
+fe weak 1
+fe weak membership 1
+fe word 1
+fe x2dx 1
+fe00i 1
+fe01 1
+fe0g 1
+fe0i 1
+fe0ig 1
+fe1 3
+fear 1
+featur 60
+featur ad 1
+featur al avail 1
+featur al prov 1
+featur allow 1
+featur and cal 1
+featur and describ 1
+featur and implem 2
+featur and perform 1
+featur and shrink 1
+featur and us 1
+featur and using 1
+featur appl 1
+featur approach 1
+featur ar comput 1
+featur ar espec 1
+featur ar extract 1
+featur ar insuff 1
+featur ar point 1
+featur ar restrict 1
+featur ar result 1
+featur ar select 1
+featur as qu 1
+featur as vect 1
+featur autom 1
+featur autom respon 1
+featur ba 1
+featur ba imag 1
+featur ba vs 1
+featur belong 1
+featur by elimin 1
+featur by using 1
+featur can appear 1
+featur chang 1
+featur chang posit 1
+featur comparison 1
+featur comparison techniqu 1
+featur confound 1
+featur confound an 1
+featur constraint 1
+featur cont 1
+featur could affect 1
+featur could slow 1
+featur dat 1
+featur definit 1
+featur describ 1
+featur disc 1
+featur edg 1
+featur el 1
+featur engineer 1
+featur engineer ar 1
+featur exploit 1
+featur extract 2
+featur extract approach 1
+featur extract procedur 1
+featur extract produc 1
+featur extract techniqu 1
+featur facilit 1
+featur facilit procedur 1
+featur fl 1
+featur fl backtrack 1
+featur for achief 1
+featur for appl 1
+featur for constraint 1
+featur for design 1
+featur for rel 1
+featur for relac 1
+featur for textur 1
+featur found 1
+featur from reduc 1
+featur from spur 1
+featur in 3d 1
+featur in babel 1
+featur in computer 1
+featur in imag 1
+featur in order 1
+featur in prev 1
+featur ind 1
+featur is al 1
+featur is extrem 1
+featur is form 1
+featur is found 1
+featur is simp 1
+featur lik textur 1
+featur lo 1
+featur lo tag 1
+featur map 1
+featur mor rel 1
+featur of abcl 1
+featur of ad 1
+featur of async 1
+featur of ba 1
+featur of dataflow 2
+featur of esp 1
+featur of eulisp 1
+featur of genvoc 1
+featur of hal 1
+featur of internet 1
+featur of log 2
+featur of mar 1
+featur of menus 1
+featur of monit 1
+featur of particl 1
+featur of sequ 1
+featur of sl1 1
+featur of www 1
+featur or cont 1
+featur point 2
+featur point ba 1
+featur point correspon 1
+featur power 1
+featur power pattern 1
+featur procedur 1
+featur procedur separ 1
+featur prov 1
+featur relev 1
+featur se 3
+featur se defin 1
+featur se deriv 1
+featur seem 1
+featur seem consider 1
+featur select 1
+featur select algorithm 1
+featur simil 1
+featur spac 2
+featur spac fy 1
+featur spac overlap 1
+featur spac using 1
+featur th number 1
+featur th workspac 1
+featur that contain 1
+featur that mak 2
+featur to captur 1
+featur to improv 1
+featur to pract 1
+featur tw sv 1
+featur under rigid 1
+featur using 1
+featur vect 2
+featur vect ba 1
+featur vect comput 1
+featur vect con 1
+featur we belief 1
+featur wer adjust 1
+featur when chang 1
+featur which disingu 1
+featur wil help 1
+featur wil improv 1
+featur wil lead 1
+featur wil remain 1
+featur.4 1
+feautr 1
+feautr qu 1
+feautr rapporteur 1
+feautr rapporteur alain 1
+feb 10
+febru 25
+febu 1
+fec 1
+fec is straightfor 1
+fecteau 1
+fed 3
+feder 4
+feder de 1
+feder de zurich 1
+feder di 1
+feder di zurig 1
+feder institut 2
+feder loc 1
+feder minister 1
+feder of loc 1
+fedor 1
+feed 9
+feed appl 1
+feed back loop 2
+feed back mechan 1
+feed collabor 1
+feed collabor appl 1
+feed control 1
+feed control character 1
+feed for 3
+feed for multilayer 1
+feed for neur 3
+feed stat 1
+feedback 16
+feedback architectur 2
+feedback architectur requir 1
+feedback between rout 1
+feedback comp 1
+feedback control 2
+feedback control problem 1
+feedback disturb 1
+feedback disturb decoupl 1
+feedback for structur 1
+feedback from init 1
+feedback is gener 1
+feedback loop 1
+feedback on rel 2
+feedback purp 1
+feedfor 2
+feedfor network 2
+feedfor neur 2
+feedfor neur network 2
+feedfor ph 1
+feel 9
+feel as comfort 1
+feel justif 1
+feel som particip 1
+feel strong 1
+feel that educ 1
+feg 2
+feig 1
+feigenbaum 1
+feigenbaum bottleneck 1
+feiner 1
+feistl 1
+fel 1
+fel70 1
+feldman 1
+feldmar 1
+fellow 1
+fellow and langst 1
+fellowship 8
+felt 7
+felt ar repr 1
+felt le strong 1
+felt nec 1
+felt that vid 1
+felt that work 1
+feltovich 1
+fem 2
+fem appl 1
+femployeeg 1
+femployeeg vt 1
+femployeeg vt fident 1
+fen 1
+fen etr 1
+fen etr de 1
+fenc 2
+fenc that forc 1
+feng 2
+fent 1
+fent et al 1
+fer 4
+fer ain 1
+fer ain migrer 1
+fer lobj 1
+fer lobj du 1
+fer migrer 1
+fer migrer la 1
+fer participer 1
+fer participer qu 1
+ferait 1
+ferait un ensembl 1
+ferguson 2
+ferguson smith 1
+ferm 2
+ferm ee 1
+ferm ee par 1
+fern 1
+fern andez1 1
+fern andez1 pat 1
+fernand 2
+feront 1
+feront loc 1
+ferrar 1
+ferreir 1
+ferroviair 1
+fertil 1
+fertil ground 1
+fetch 10
+fetch a dat 1
+fetch a dum 1
+fetch a sl 1
+fetch ad 1
+fetch ad prim 1
+fetch and incr 1
+fetch and proc 1
+fetch decod 1
+fetch decod execut 1
+fetch dur dlb 1
+fetch extran 1
+fetch extran dat 1
+fetch in nest 1
+fetch is equ 1
+fetch is giv 1
+fetch is split 1
+fetch it environm 1
+fetch mor work 1
+fetch op 1
+fetch such dat 1
+fetch th dat 1
+fetch th desir 1
+fetch th entir 1
+fetch th pag 1
+fetch th qualif 1
+fetch th relev 1
+fetchdecodeexecutepru 1
+feuil 1
+feuil a pour 1
+feutr 1
+feutr sur 1
+fevr 1
+fewer 28
+fewer conflict 1
+fewer connect 2
+fewer context 1
+fewer context switch 1
+fewer dat 1
+fewer dat point 1
+fewer edg 1
+fewer el 1
+fewer environm 1
+fewer error 1
+fewer fac 1
+fewer i os 1
+fewer liter 1
+fewer loc 1
+fewer memor 1
+fewer memor loc 1
+fewer nod 1
+fewer oper 1
+fewer ph 1
+fewer ph using 1
+fewer pi 1
+fewer pi reduc 1
+fewer proc 2
+fewer requir 1
+fewer router 1
+fewer server 1
+fewer step 1
+fewer subject 1
+fewer test 1
+fewer than jqj 1
+fewer tupl 1
+fewer work 1
+fewer work deal 1
+fewest 2
+fewest nonzer 1
+fewest number 1
+ff 23
+ff 1gt 1
+ff 1gt 1gi 1
+ff 1t 1
+ff 81ff 1
+ff a du 1
+ff aij 1
+ff aij ci 1
+ff color 1
+ff de 1
+ff dun 1
+ff dun matr 1
+ff ff log 1
+ff gt 1
+ff gt 1gi 1
+ff hel 1
+ff ind 1
+ff of ff 1
+ff par 1
+ff par un 1
+ff qu 1
+ff qu pren 1
+ff repr 1
+ff satisf 1
+ff satisf gd 1
+ff x1 1
+ff xt 1
+ff yi 1
+ff1 4
+ff1 and ff2 1
+ff1 s2gg 1
+ff1 s2gg wh 1
+ff2 3
+ff2 in order 1
+ff2 log2 1
+ff2 yield 1
+ff2ij 1
+ff3 1
+ff90 1
+ff90 ff95 1
+ff90 ff95 ff99 1
+ff95 1
+ff95 ff99 1
+ff99 1
+ffb 1
+ffd1 1
+ffd1 d2gg 1
+ffd1 d2gg wh 1
+ffdg 1
+ffdg idj 1
+ffdg idj pf 1
+fffig 1
+fffiij 1
+fffl1 1
+ffflg 1
+ffflig 1
+ffflig endfor 1
+ffiblog 1
+ffiblog tc 1
+ffiid 1
+ffiigt 1
+ffiigt gi 1
+ffiij 1
+ffiij dissimilarit 1
+ffij 1
+ffik 1
+ffim 1
+ffim3 1
+ffim3 n2 1
+ffin 1
+ffitn 1
+ffl 4
+ffl xi 1
+ffl yi 1
+ffl0 2
+ffl1 2
+ffl2 1
+ffl2 fflq 1
+fflffl 1
+fflfflfflffl 1
+ffliq 1
+fflk 1
+fflk ff fflk 1
+fflk g appl 1
+fflkg 1
+fflkg can ea 1
+ffln 1
+fflq 1
+fflr 1
+fflt 2
+ffltj 1
+ffq 1
+ffq algorithm 1
+ffq ar ident 1
+ffq belong 1
+ffq bound 1
+ffq by using 1
+ffq server 1
+ffq0 1
+ffq0 denot 1
+ffq0 enumer 1
+ffq0 in sort 1
+ffq0 with replac 1
+ffq0j 1
+ffq0j if m0 1
+ffq1 1
+ffq1 can saf 1
+ffq1gj 1
+ffsg 1
+ffsn00 1
+fft 4
+fft acr system 1
+fft and matr 1
+fft appl 1
+fft appl accept 1
+fft ar shown 1
+fft ba 1
+fft ba permut 1
+fft digraph 1
+fft digraph con 1
+fft digraph log 1
+fft ha log 1
+fft is shown 1
+fft network 1
+fft perform 1
+fft problem 1
+fft requir 1
+fft traff 1
+fft with interleav 1
+ffu1 1
+ffv1 1
+ffx 1
+ffx11 1
+ffy 1
+ffy est 1
+ffy est aus 1
+ffyxf 1
+fg 11
+fg an arbitr 1
+fg ar mutu 1
+fg con 1
+fg forever 1
+fg is comput 1
+fg is equiv 1
+fg is unsatisf 1
+fg then regp 1
+fg then xp 1
+fg tr 1
+fgc92 1
+fgoeman 1
+fgrother 1
+fgt 1
+fh 4
+fh1 1
+fh88 1
+fhb0 1
+fhelman 1
+fhg0 1
+fhigh0 1
+fhng 1
+fi 24
+fi 2f 1
+fi 3f 1
+fi and fi 1
+fi and fj 1
+fi arriv 1
+fi ci 1
+fi ci fj 1
+fi dat 1
+fi dat shar 1
+fi de 1
+fi de chaqu 1
+fi decdt 1
+fi def 1
+fi def io 1
+fi dep 1
+fi describ 1
+fi earliest 1
+fi earliest deadl 1
+fi effectu 1
+fi effectu le 1
+fi f fi 1
+fi f probabilit 1
+fi f xi 1
+fi fd 1
+fi fi 1
+fi fj 1
+fi fl 1
+fi fn 1
+fi g xi 1
+fi gener 1
+fi gener hypoth 1
+fi group 1
+fi group com 1
+fi guard 1
+fi in cl 1
+fi is mad 1
+fi j li 1
+fi j ri 1
+fi learn 1
+fi learn review 1
+fi num 1
+fi pi 2
+fi pour 1
+fi quantum 1
+fi queu 1
+fi queu facil 1
+fi round robin 1
+fi shar 1
+fi sont 1
+fi sont de 1
+fi test 1
+fi test fi 1
+fi that register 1
+fi tpsim 1
+fi tpsim fl 1
+fi verif 1
+fi verif fi 1
+fi wil propag 1
+fi with fi 1
+fi wp 1
+fi xj 1
+fi. 1
+fi0 1
+fi0 jt 1
+fi1 1
+fiabilit 2
+fiabilit e diff 1
+fib 2
+fib fib 1
+fib hav exclus 1
+fib pr 1
+fib program 1
+fib program giv 1
+fib respect 1
+fiber 2
+fiber implem 1
+fiber opt 1
+fibonacc 3
+fibonacc heap 1
+fibonacc number 2
+fibr 1
+fibr channel 1
+fibr channel network 1
+fic 66
+fic a proc 1
+fic a singl 1
+fic al proper 1
+fic algebr 1
+fic allou 1
+fic allou ee 1
+fic and enhanc 1
+fic and nonadapt 1
+fic appel 1
+fic appel es 1
+fic ar 1
+fic ar lik 1
+fic at 4x4 1
+fic at compil 2
+fic au 1
+fic au cour 1
+fic bin 1
+fic bin encod 1
+fic board 2
+fic board siz 2
+fic bound 1
+fic by substitut 1
+fic channel 1
+fic channel width 1
+fic cluster 1
+fic cluster siz 1
+fic const 1
+fic const integer 1
+fic coordin 1
+fic cost 1
+fic dan 1
+fic dan la 1
+fic dan le 1
+fic datalog 1
+fic datalog qu 1
+fic de 2
+fic de diff 1
+fic digit 1
+fic digit gu 1
+fic dim 3
+fic dim ca 1
+fic dist 1
+fic dist threshold 1
+fic dlb 1
+fic domain 1
+fic dur scal 1
+fic e pour 1
+fic ee 1
+fic ee en 1
+fic ee par 1
+fic error 1
+fic es 1
+fic es conform 1
+fic et migr 1
+fic fan 1
+fic finit 1
+fic finit boolean 1
+fic for fil 1
+fic hi cod 1
+fic impl 1
+fic init 1
+fic instead 1
+fic integer 1
+fic interv 1
+fic juxtaposit 1
+fic k docum 1
+fic la 1
+fic la probabilit 1
+fic layout 1
+fic layout lead 1
+fic lead 1
+fic learn 1
+fic learn algorithm 1
+fic learn strateg 1
+fic length 4
+fic length cylinder 1
+fic length gener 1
+fic length interv 1
+fic network 1
+fic network interconnect 1
+fic nod 1
+fic non 1
+fic non const 1
+fic number 5
+fic on object 1
+fic on opposit 1
+fic oper 1
+fic or 1
+fic or var 1
+fic order 1
+fic ou 1
+fic ou dynamiqu 1
+fic overhead 1
+fic pack 1
+fic path 1
+fic pinout 2
+fic point 5
+fic point ext 1
+fic point method 1
+fic polynom 1
+fic posit 1
+fic pour 1
+fic pour objectif 1
+fic prec 1
+fic prec integer 1
+fic program 1
+fic qu 1
+fic qu forml 1
+fic rat 1
+fic rat chang 1
+fic restreint 1
+fic restreint le 1
+fic rout 1
+fic rout cr 1
+fic scal 1
+fic scop 1
+fic scop solut 1
+fic se 2
+fic se pr1 1
+fic se vi 1
+fic seed 1
+fic siftdown 1
+fic siz 6
+fic siz cel 1
+fic siz chunk 2
+fic siz program 1
+fic st 1
+fic st overhead 1
+fic substr 1
+fic surfac 1
+fic surfac form 1
+fic th program 1
+fic th qu 1
+fic th siz 2
+fic th start 1
+fic th subject 1
+fic throughout learn 1
+fic tim 2
+fic tim goal 1
+fic to oo 1
+fic to zer 1
+fic topolog 5
+fic tot 2
+fic tot board 2
+fic un 1
+fic un lim 1
+fic unmaintain 1
+fic unmaintain ensu 1
+fic valu 2
+fic window 1
+fic window oracl 1
+fic ye 1
+fic zer 1
+fic zer elsewh 1
+fich 1
+fict 1
+fid 3
+fid criter 1
+fid el 1
+fid repr 1
+fident 1
+fiducc 1
+fiducc matth 1
+fiducc matth framework 1
+field 45
+field and p.g 1
+field and wait 1
+field ar assoc 1
+field ar block 1
+field ar equ 1
+field ar group 1
+field ar se 1
+field ar shar 1
+field common 1
+field contain 1
+field correct 1
+field correct behavior 1
+field correspon 1
+field def 1
+field giv 1
+field giv inform 1
+field in docum 1
+field in figur 1
+field ind 3
+field ind field 1
+field is common 1
+field is increm 1
+field is larger 1
+field is se 1
+field is specif 1
+field loc 1
+field nam 1
+field of appl 1
+field of concur 1
+field of evolut 1
+field of mathemat 1
+field of proc 2
+field of research 1
+field of se 1
+field of tripl 1
+field of view 1
+field param 1
+field param glob 1
+field per receiver 1
+field point 1
+field program 1
+field program gat 1
+field program log 1
+field prov 1
+field rang 1
+field replac 1
+field requir 2
+field requir nondetermin 1
+field scal 1
+field scal transport 1
+field st 1
+field th rank 1
+field th trap 1
+field that point 1
+field to identif 1
+field to upd 1
+field track 1
+field uniqu 1
+field uniqu identif 1
+field wh 1
+field wh user 1
+field wi 1
+field wi exclus 1
+field with minim 1
+field.2 1
+fierc 1
+fif 6
+fif ba 1
+fif ba hardwar 1
+fif ba implem 1
+fif block 1
+fif channel 1
+fif contain 1
+fif deliver 1
+fif deliver multicast 1
+fif for unicast 1
+fif manner 1
+fif me 1
+fif me deliv 1
+fif order 3
+fif queu 4
+fif queu requir 1
+fif repl 1
+fif repl actu 1
+fif repl lat 1
+fift 2
+fift subscriber 1
+fift such variabl 1
+fifteen 2
+fifteen good 2
+fifteen good ch 2
+fifteenth 4
+fifteenth annu 1
+fifteenth annu acm 1
+fifteenth intern 2
+fifteenth level 1
+fifth 17
+fifth acm 1
+fifth acm workshop 1
+fifth annu 1
+fifth claus 1
+fifth claus say 1
+fifth edit 1
+fifth gener 4
+fifth gener comput 1
+fifth gener computer 4
+fifth int 1
+fifth intern 5
+fifth intern colloqu 1
+fifth intern workshop 1
+fifth nat 1
+fifth proper 1
+fifth siam 1
+fifth term 1
+fifth to proc 1
+fig 18
+fig. 1
+fig.1 1
+fig.2 1
+fig.3 1
+fig.4 1
+fig.5 1
+fig.6 1
+fig.6 som relev 1
+fight 1
+figur 103
+figur 11b 1
+figur 11c 1
+figur 1a 2
+figur 1a show 1
+figur 1b 2
+figur 21a 1
+figur 21b 1
+figur 21b show 1
+figur 2a 1
+figur 2a show 1
+figur 3.th 1
+figur 3.th program 1
+figur 3a 2
+figur 3b 3
+figur 3c 1
+figur 4a 2
+figur 4a illustr 1
+figur 4a show 1
+figur 4b 1
+figur 4c 2
+figur 4c show 1
+figur 5a 2
+figur 5a figur 1
+figur 5a show 1
+figur 5b 2
+figur 5b figur 1
+figur 5b show 2
+figur 5c 1
+figur 5c alloc 1
+figur 5c show 1
+figur 6a 1
+figur 6a show 1
+figur 6b 1
+figur 6b show 1
+figur 6c 1
+figur 6c correspon 1
+figur 7.a 1
+figur 7a 3
+figur 7a show 1
+figur 7b 2
+figur 7b show 1
+figur 8a 1
+figur 8b 1
+figur 8c 1
+figur 9a 2
+figur 9b 1
+figur 9c 1
+figur a.1 1
+figur a.2 1
+figur a.2 kcm 1
+figur a.3 1
+figur a.3 top 1
+figur a.4 1
+figur a.4 kcm 1
+figur a.4 show 1
+figur a.5 1
+figur a.6 1
+figur a.7 1
+figur a.7 giv 1
+figur a.7 kcm 1
+figur a.8 1
+figur a.8 speed 1
+figur al depict 1
+figur al show 3
+figur and gav 1
+figur ar writ 1
+figur by decomp 1
+figur ci 1
+figur ci dessus 1
+figur con 1
+figur construc 1
+figur contain 1
+figur contain procedur 1
+figur correspon 1
+figur dan 1
+figur dan le 1
+figur demarc 1
+figur depict 1
+figur depict network 1
+figur ensur 1
+figur ensur ec 1
+figur est 1
+figur exceed 1
+figur for monolith 1
+figur for scientif 1
+figur g eom 1
+figur giv 1
+figur grow 1
+figur grow super 1
+figur illustr 1
+figur illustr configur 1
+figur inclus 1
+figur ind 3
+figur ix 1
+figur our comparison 1
+figur peuv 1
+figur peuv se 1
+figur pr 1
+figur pr result 1
+figur rel 1
+figur report 1
+figur repr 2
+figur seem 1
+figur seem exorbit 1
+figur show 5
+figur signif 1
+figur signif caus 1
+figur suggest 1
+figur tab 1
+figur tabl 1
+figur tabl a.4 1
+figur we se 1
+figur2 1
+figurer 1
+figurer dan 1
+figurer dan la 1
+fij 1
+fijyj 1
+fik 1
+fil 48
+fil a buffer 1
+fil abstract 1
+fil abstract interfac 1
+fil ag 1
+fil agent 1
+fil agent macr 1
+fil alloc 1
+fil an ar 1
+fil an environm 1
+fil and execut 1
+fil and list 1
+fil and push 1
+fil and record 1
+fil and termin 1
+fil and tty 1
+fil approach 1
+fil ar es 1
+fil ar explain 1
+fil ar object 1
+fil as inform 1
+fil assoc 1
+fil avail 1
+fil block 1
+fil by ap 1
+fil by ph 1
+fil codif 1
+fil commun 1
+fil commun codif 1
+fil comp 1
+fil condit 1
+fil contain 3
+fil curv 1
+fil dep 1
+fil dep extract 1
+fil dev 1
+fil direct 2
+fil distribut 1
+fil doesnt help 1
+fil for ad 1
+fil for macromolecl 1
+fil for rel 1
+fil form 2
+fil fr 1
+fil fr sect 1
+fil hierarch 1
+fil hypoth 1
+fil hypoth dum 1
+fil in cop 1
+fil in result 1
+fil in spar 2
+fil inclus 1
+fil inform 1
+fil int buck 1
+fil int intern 1
+fil interfac 1
+fil intern 1
+fil inver 1
+fil inver approach 1
+fil is ba 1
+fil is creat 1
+fil is main 1
+fil is nam 1
+fil is proc 1
+fil is read 1
+fil kamp.ps.z 1
+fil manager 1
+fil manager buffer 1
+fil modif 2
+fil nam 3
+fil nod 1
+fil of record 1
+fil on multipl 1
+fil onl indirect 1
+fil or agent 1
+fil or chang 1
+fil or displ 1
+fil or prog 1
+fil outptr 1
+fil parallel 1
+fil parallel instruc 1
+fil per cl 1
+fil polygon 1
+fil reduc 1
+fil reduc order 1
+fil resid 1
+fil select 1
+fil select box 1
+fil serv 1
+fil serv writ 1
+fil server 2
+fil siz 2
+fil specif 1
+fil stream 1
+fil structur 2
+fil styl 1
+fil styl promot 1
+fil system 6
+fil system cal 1
+fil system developm 2
+fil system fil 1
+fil system perform 1
+fil th funct 1
+fil th gap 2
+fil th interv 1
+fil th log 1
+fil th pack 1
+fil th window 1
+fil that belong 1
+fil that contain 1
+fil that rol 1
+fil to construc 1
+fil to edit 1
+fil transfer 4
+fil transfer problem 1
+fil transfer protocol 2
+fil transfer schedl 1
+fil typ 2
+fil typ using 1
+fil wer touch 1
+fil wh 1
+fil wh key 1
+fil whil non 1
+fil with chang 1
+fil with maxint 1
+fil with zer 1
+fil. 1
+fil.nam 1
+fil1 1
+fil5 1
+filealu 1
+fileid 1
+filenam 1
+filenam pub 1
+filenam pub docum 1
+fileptr 1
+filer 1
+filer for autom 1
+filesm 1
+filesm chunk 1
+filesm chunk sizebig 1
+filler 1
+film 2
+filter 19
+filter and ambigu 1
+filter and sign 1
+filter as input 1
+filter aspect 1
+filter bank 3
+filter bank implem 1
+filter bank structur 1
+filter can as 1
+filter diameter 1
+filter dist 1
+filter dist imag 1
+filter each demon 1
+filter for imag 1
+filter is allow 1
+filter is construc 1
+filter level 1
+filter mechan 1
+filter modl 1
+filter modl filter 1
+filter no 1
+filter on posit 1
+filter onl repr 1
+filter oper 1
+filter out no 2
+filter pa 1
+filter produc 1
+filter reduc 1
+filter reduc complec 1
+filter reject 1
+filter reject no 1
+filter remain 1
+filter step 1
+filter system 1
+filter techniqu 2
+filter th confid 1
+filter th configur 1
+filter th nam 1
+filter th respon 1
+filter th word 1
+filter that span 1
+filter theor 1
+filter to enh 1
+filter to reduc 2
+filter we us 1
+filter with program 1
+filter would lead 1
+filtr 2
+filtr de 1
+filtr de kalman 1
+fimf 1
+fimf log2 1
+fin 115
+fin 2d 1
+fin 2d tr 1
+fin 2n 1
+fin a bin 1
+fin a jour 1
+fin account 1
+fin accur 1
+fin accur achief 1
+fin act 1
+fin ad 2
+fin agreed 1
+fin algorithm 1
+fin amount 1
+fin amount invest 1
+fin answer 1
+fin appl 1
+fin appl architectur 1
+fin architectur 1
+fin argum 1
+fin assum 1
+fin at datab 1
+fin b rep 1
+fin bit 1
+fin bit map 1
+fin ch 1
+fin cod 1
+fin cod form 1
+fin column 2
+fin column show 1
+fin commun 1
+fin commun tim 1
+fin con 1
+fin con st 1
+fin configur 1
+fin cont 1
+fin cont alor 1
+fin crush 1
+fin crush object 1
+fin cycl 1
+fin d etat 1
+fin dan 2
+fin dan la 1
+fin dan tous 1
+fin de 4
+fin de bloc 1
+fin de ce 1
+fin de cel 1
+fin de celu 1
+fin de chaqu 1
+fin de claus 1
+fin de colon 1
+fin de don 1
+fin de el 1
+fin de la 3
+fin de point 1
+fin de prem 1
+fin de vecteur 1
+fin deadl 1
+fin dec 2
+fin deliver 1
+fin detail 1
+fin detail concern 1
+fin deux 1
+fin deux don 1
+fin dic 1
+fin dic ecut 1
+fin dm 1
+fin draw 1
+fin du 1
+fin du domain 1
+fin duc 1
+fin dun 1
+fin dun tel 1
+fin e dentit 1
+fin e uniform 1
+fin en 1
+fin en milieu 1
+fin equiv 1
+fin est 1
+fin est alor 1
+fin est donc 1
+fin establ 1
+fin et hi 1
+fin exam 1
+fin exit 1
+fin exit interfac 1
+fin failur 1
+fin featur 1
+fin for techn 1
+fin goal 1
+fin good 2
+fin good configur 2
+fin grain 14
+fin grain algorithm 1
+fin grain bar 1
+fin grain comput 1
+fin grain domain 1
+fin grain evalu 1
+fin grain inh 1
+fin grain messagep 1
+fin grain method 1
+fin grain mobil 1
+fin grain multitoler 1
+fin grain oper 1
+fin grain parallel 1
+fin grain program 1
+fin grain solut 1
+fin grain trac 1
+fin grain view 1
+fin grammar 1
+fin granl 2
+fin granl lock 2
+fin in sect 1
+fin init 1
+fin init fin 1
+fin input 1
+fin input vect 1
+fin inst 1
+fin interest 1
+fin interest problem 1
+fin intern 1
+fin intern sort 1
+fin issu 1
+fin it perform 1
+fin l egalit 1
+fin la 2
+fin la tabl 1
+fin le 1
+fin le nombr 1
+fin le program 1
+fin level 1
+fin linflu 1
+fin linflu de 1
+fin major 1
+fin major vot 1
+fin method 1
+fin multipl 1
+fin network 2
+fin network architectur 1
+fin network resourc 1
+fin nod 1
+fin nod separ 1
+fin not 1
+fin number 1
+fin observ 2
+fin observ involut 1
+fin of repr 1
+fin optim 1
+fin or abort 1
+fin ou 1
+fin ou jusqu 1
+fin outl 1
+fin output 1
+fin output tr 1
+fin pa 1
+fin pa describ 1
+fin pandemon 1
+fin pandemon system 1
+fin parameter 1
+fin part 1
+fin part fil 1
+fin partit 1
+fin point 2
+fin posit 1
+fin pour 2
+fin pour lequel 1
+fin pour prendr 1
+fin pour simpl 1
+fin problem 1
+fin program 1
+fin prov 1
+fin qu 1
+fin qu le 1
+fin quest 1
+fin quil 1
+fin quil form 1
+fin receiver 1
+fin reconstruc 1
+fin remark 1
+fin report 1
+fin result 5
+fin rl 1
+fin schedl 1
+fin schedl length 1
+fin scor 1
+fin se 3
+fin se ecritur 1
+fin sect 5
+fin sect conclus 1
+fin sect contain 1
+fin select 1
+fin separ 1
+fin separ contain 1
+fin ser 1
+fin si 1
+fin si le 1
+fin siftdown 1
+fin siftdown resp 1
+fin softwar 1
+fin softwar using 1
+fin solut 1
+fin sort 1
+fin sort pa 1
+fin specif 1
+fin specif report 1
+fin spectr 1
+fin spectr structur 1
+fin st 7
+fin st med 1
+fin step 5
+fin string 1
+fin sub 1
+fin sub order 1
+fin subcomput 1
+fin succ 1
+fin sum 2
+fin supergraph 1
+fin sur 1
+fin sur un 1
+fin tabl 1
+fin th build 1
+fin th getinf 1
+fin th oper 1
+fin th result 1
+fin theorem 1
+fin thread 1
+fin tim 1
+fin tim step 1
+fin tout 1
+fin tout en 1
+fin tr 1
+fin tr structur 1
+fin trickledown 1
+fin tun 1
+fin tun search 1
+fin tw term 1
+fin typ 1
+fin u0 1
+fin valu 5
+fin ver 2
+fin ver took 1
+fin vocabl 1
+fin we ap 1
+fin we conlus 1
+fin we consider 1
+fin we disc 2
+fin we optim 1
+fin whol system 1
+fin work 1
+fin ye 1
+finan512 1
+finaux 1
+finaux de 1
+finaux de deux 1
+find 90
+find a 2t 1
+find a breadth 1
+find a breadthfirst 1
+find a bridg 1
+find a canon 1
+find a correct 1
+find a counterpart 1
+find a cut 1
+find a dat 1
+find a decomposit 1
+find a fil 1
+find a fundam 1
+find a gener 1
+find a good 1
+find a high 1
+find a match 2
+find a maxim 1
+find a minim 4
+find a monom 1
+find a nod 1
+find a pack 1
+find a pag 1
+find a parameter 2
+find a partit 1
+find a proc 1
+find a quick 1
+find a reason 1
+find a recent 1
+find a return 1
+find a rol 1
+find a satisf 1
+find a se 2
+find a shortest 2
+find a signif 1
+find a singl 1
+find a solut 3
+find a span 2
+find a spar 1
+find a steiner 1
+find a sub 1
+find a suit 3
+find a swing 1
+find a unimodl 1
+find a val 1
+find a valu 1
+find a vect 1
+find a w1 1
+find a w2 1
+find abnorm 1
+find abnorm st 1
+find abstract 1
+find abstract task 1
+find al eigenvalu 1
+find al emb 1
+find al imag 1
+find al pair 1
+find al tupl 1
+find algorithm 2
+find altern 1
+find altern axiom 1
+find an act 1
+find an algorithm 1
+find an answer 1
+find an approxim 3
+find an arbitr 1
+find an assignm 1
+find an augm 1
+find an edg 1
+find an emb 1
+find an exampl 1
+find an expr 1
+find an inner 1
+find an interconnect 1
+find an neighbor 1
+find an optim 4
+find an over 1
+find an upper 1
+find and output 1
+find and pick 1
+find and po 1
+find and remov 2
+find and sen 1
+find any reg 1
+find appl 3
+find appropr 1
+find appropr act 1
+find approxim 1
+find better regr 1
+find book 1
+find book simil 1
+find c path 1
+find cluster 1
+find connect 1
+find connect compon 1
+find contain 2
+find correl 1
+find correl rl 1
+find ec 1
+find ec axiom 1
+find eff 1
+find eff infer 1
+find enough spac 1
+find extrem 1
+find extrem se 1
+find framein 1
+find framein buffer 1
+find gener 1
+find gener tren 1
+find good 1
+find group 1
+find imag 1
+find imag contain 1
+find imag reg 1
+find impr 1
+find impr parallel 1
+find improv 1
+find improv implem 1
+find inst 1
+find inst reduc 1
+find intersect 1
+find is compl 1
+find it correspon 1
+find it largest 1
+find it loc 1
+find it minim 1
+find it parent 1
+find larg amount 1
+find leader 1
+find learn 1
+find learn algorithm 1
+find littl prospect 1
+find loc 1
+find lock 1
+find longer 1
+find longer tcp 1
+find m span 1
+find man rel 1
+find maxim 1
+find method 2
+find method bound 1
+find method me 1
+find min 1
+find minim 1
+find mor detail 1
+find mor systemat 1
+find motiv 1
+find multipl 2
+find multipl solut 1
+find no cal 1
+find nod 1
+find nod separ 1
+find nonequiv 1
+find nonequiv succ 1
+find on pag 1
+find on solut 1
+find optim 2
+find optim branch 1
+find optim parameter 1
+find our algorithm 1
+find our book 1
+find p.n1 1
+find pag 1
+find pag posit 1
+find parallel 1
+find partit 1
+find partit el 1
+find prec 1
+find problem 1
+find problem inst 1
+find proper 1
+find prototyp 1
+find record 1
+find record sect 1
+find relev 1
+find s5 1
+find s5a 1
+find s60 1
+find sequ 1
+find short path 1
+find singl 1
+find solut 1
+find som pair 1
+find span 1
+find span tr 1
+find step 1
+find suboptim 1
+find suboptim solut 1
+find test 1
+find th an 1
+find th approxim 1
+find th aver 1
+find th book 1
+find th card 1
+find th chunk 1
+find th configur 1
+find th connect 2
+find th correct 1
+find th cost 1
+find th dat 1
+find th docum 1
+find th en 1
+find th es 1
+find th exact 1
+find th fact 1
+find th fragm 1
+find th good 1
+find th graph 1
+find th greatest 1
+find th imag 2
+find th inst 1
+find th item 1
+find th kth 1
+find th largest 1
+find th layout 1
+find th loc 2
+find th log 1
+find th ls 1
+find th maxim 2
+find th med 1
+find th mi 1
+find th minim 3
+find th nearest 2
+find th network 1
+find th number 1
+find th object 1
+find th optim 3
+find th over 1
+find th pag 1
+find th par 1
+find th parent 1
+find th particl 1
+find th partit 1
+find th phy 1
+find th posit 1
+find th record 1
+find th rectangl 1
+find th return 1
+find th sect 1
+find th shortest 2
+find th sign 1
+find th solut 1
+find th span 2
+find th subforml 1
+find th succ 1
+find th textur 1
+find th tod 1
+find that 2cl 1
+find that s10 1
+find their docum 1
+find their succ 1
+find them lec 1
+find to gather 1
+find tw nod 1
+find us 1
+find using 1
+find using isvl 1
+find valu 1
+find way 1
+find wh 1
+find which bit 1
+find which book 1
+find whil particip 1
+find x0 1
+finder 1
+findk 1
+findnextnod 1
+findnth 1
+findsibl 1
+finegrain 2
+finegrain or coar 1
+finegrain view 1
+finegrain view tel 1
+finer 5
+finer control 1
+finer goal 1
+finer granl 1
+finer granl allow 1
+finer granl enabl 1
+finer graph 1
+finer typ 1
+finest 2
+finest level 1
+finest rel 1
+finest rel contain 1
+fingerhut 1
+fingertip 1
+finin 1
+finish 18
+finish execut 1
+finish execut ph 1
+finish first ph 1
+finish in mod 1
+finish it loc 1
+finish me 1
+finish norm 1
+finish or start 1
+finish pot 1
+finish proc 2
+finish rec 1
+finish serv 1
+finish serv simultan 1
+finish step 1
+finish th comput 1
+finish th filter 1
+finish th proof 1
+finish th til 1
+finish th und 1
+finish tim 3
+finish tim equ 1
+finish tim openshop 1
+finish tim schedl 1
+finish work 1
+finishg 1
+finishg pot 1
+finit 50
+finit agent 1
+finit alphab 2
+finit amount 2
+finit and thus 1
+finit apr 1
+finit apr es 1
+finit autom 2
+finit autom theor 1
+finit automat 1
+finit avant 1
+finit avant la 1
+finit bin 4
+finit bin sequ 1
+finit bin string 1
+finit bin tr 2
+finit bitstr 1
+finit boolean 1
+finit boolean algebr 1
+finit boolean domain 1
+finit boolean equ 1
+finit branch 1
+finit but unpredict 1
+finit collect 1
+finit con 1
+finit con structur 1
+finit configur 1
+finit conjunct 1
+finit counter 1
+finit counter length 1
+finit differ 2
+finit differ method 1
+finit differ model 1
+finit differ schem 1
+finit discr 1
+finit discr lin 1
+finit discr order 1
+finit domain 5
+finit domain constraint 1
+finit domain f1 1
+finit domain solver 1
+finit el 7
+finit el appl 3
+finit el calcl 1
+finit el comput 1
+finit el discr 1
+finit el equ 1
+finit el graph 1
+finit el grid 1
+finit el mach 1
+finit el matr 1
+finit el mesh 3
+finit el method 3
+finit el model 1
+finit el nod 1
+finit el problem 1
+finit execut 1
+finit expect 1
+finit expect object 1
+finit funct 1
+finit ground 1
+finit ground se 1
+finit hardwar 1
+finit ind 1
+finit ind se 1
+finit input 1
+finit input alphab 1
+finit instruc 1
+finit instruc window 1
+finit man program 1
+finit markov 1
+finit markov chain 1
+finit markov proc 1
+finit memor 1
+finit memor ma. 1
+finit memor mach 1
+finit number 10
+finit or infinit 2
+finit output 1
+finit output lp 1
+finit pa 1
+finit pa sur 1
+finit port 1
+finit pr 1
+finit pr theorem 1
+finit prec 1
+finit prec arithm 1
+finit proc 1
+finit queu 1
+finit recur 1
+finit recur schem 1
+finit rel 1
+finit repr 1
+finit resourc 1
+finit schedl 1
+finit schedl window 1
+finit se 13
+finit se f1 1
+finit sequ 1
+finit simpl 1
+finit simpl langu 1
+finit st 4
+finit st autom 1
+finit st automat 1
+finit st environm 1
+finit st langu 1
+finit st mach 3
+finit structur 1
+finit sub 2
+finit substitut 2
+finit substitut oe 1
+finit substitut ss 1
+finit substitut wh 1
+finit system 1
+finit tim 2
+finit toujour 1
+finit toujour par 1
+finit union 2
+finit univer 1
+finit univer reg 1
+finit valu 1
+finit vocabl 1
+finit we us 1
+finit window 1
+finit window length 1
+finit window lim 1
+finit window siz 1
+finiteel 1
+finiteel matr 1
+finitest 1
+finitest mach 1
+finitest mach learn 1
+finkel 1
+finkelstein 1
+finland 2
+finlayson 1
+finlayson and cherit 1
+fion 1
+fion ferguson 1
+fion ferguson smith 1
+fiqb 1
+fir 6
+fir can der 1
+fir compon 1
+fir compon sourc 1
+fir each rl 1
+fir event 1
+fir in na 1
+fir of gener 1
+fir pfp 1
+fir pfp act 1
+fir rl 1
+fir rl start 1
+fir start 1
+fir th event 1
+fir th rl 1
+fir to der 1
+fir wil der 1
+firef 1
+firew 1
+firew concept 1
+firm 4
+firm extern 1
+firm extern connect 1
+firm found 1
+firm stat 1
+firm stat stat 1
+firm tang 1
+firm tang part 1
+firm tang proper 1
+firm upper 1
+firm upper bound 1
+firmwar 1
+firmwar and assemb 1
+firmwar inclus 1
+firmwar support 1
+first 11
+first specif 1
+first th bind 1
+first th not 1
+first1 1
+first1 we pr 1
+firstc 1
+firstchunk 1
+firstchunk field 1
+firstlast 1
+firstp 1
+firstp and firstc 1
+firstpfirstpfirstcfirstclastplastpdatanpncc 1
+firstpfirstpfirstcfirstclastplastpdatanpncc 1datanpncc 1
+firstpfirstpfirstcfirstclastplastpdatanpncc 1datanpncc 1datanpncc 1
+fisch 6
+fisch indep 1
+fish 8
+fish and owen 1
+fish discrimin 1
+fish discrimin an 1
+fish len 1
+fish len browser 1
+fish method 1
+fish method method 1
+fish view 1
+fish wrot 1
+fish7 1
+fisherm 1
+fisherm had argu 1
+fisherman 1
+fit 36
+fit a parabol 1
+fit a surfac 1
+fit al syntact 1
+fit an ec 1
+fit build 1
+fit build block 1
+fit car 1
+fit car ce 1
+fit cl 1
+fit compl 1
+fit curv 1
+fit dan 1
+fit dan la 1
+fit dun 1
+fit dun chromosom 1
+fit et espac 1
+fit et lespac 1
+fit f sur 1
+fit fi 1
+fit fi de 1
+fit funct 2
+fit grand 1
+fit grand ont 1
+fit in cor 1
+fit in intern 1
+fit in nic 1
+fit int cach 1
+fit int intern 1
+fit intuit 1
+fit li 1
+fit model 1
+fit multimodaux 1
+fit neat 1
+fit ou 1
+fit ou fonct 1
+fit parabol 1
+fit parabol assum 1
+fit pentomin2 1
+fit positif 1
+fit schem 1
+fit shar 1
+fit shar memor 1
+fit th criter 1
+fit th equ 1
+fit th gener 1
+fit th memor 1
+fit their stud 1
+fit to contribut 1
+fit tot 1
+fit tot de 1
+fit valu 1
+fitch 1
+fitnessevalu 1
+fitzpatrick 2
+fixablep 1
+fixedplac 1
+fixedplac me 1
+fixedplac me dat 1
+fixer 2
+fixer la 1
+fixer la composit 1
+fixer le 1
+fixon 1
+fixon pour 1
+fixon pour cibl 1
+fixpoint 4
+fixpoint character 1
+fixpoint comput 1
+fixpoint comput rl 1
+fixpoint denot 1
+fixpoint of axpr 1
+fixpoint of tp 1
+fixpoint quer 1
+fixpoint sem 2
+fixpoint solut 1
+fixpoint theor 1
+fixpoint theorem 2
+fj 7
+fj ar maxim 1
+fj cj 1
+fj f xj 1
+fj g xj 1
+fj iesd.auc.dk 1
+fj1 3
+fj1fj2 1
+fjk 1
+fjk fj 1
+fjk with fj 1
+fjm 1
+fk 8
+fk fi 1
+fk fi fj 1
+fk fj 1
+fk is lower 1
+fk94 1
+fkg 2
+fkg a0ic 1
+fkg a0ka 1
+fkg a0ka est 1
+fkg a0ka pi2v 1
+fkg aic 1
+fkg aic akxk 1
+fkg ak0ic 1
+fkg ak0ic ak0k 1
+fkg ak0ic ak0kxk 1
+fkm 1
+fkr 1
+fku77 1
+fkulkarn 1
+fl 69
+fl 3d 1
+fl accord 1
+fl account 1
+fl accur 1
+fl accur object 1
+fl addr 1
+fl adv 1
+fl algorithm 2
+fl an 1
+fl an verb 1
+fl and bal 1
+fl answer 1
+fl appl 1
+fl appl blind 1
+fl apprec 1
+fl apprec reperc 1
+fl assum 1
+fl asynchron 1
+fl asynchron protocol 1
+fl attempt 1
+fl autom 4
+fl autom cont 1
+fl autom method 1
+fl autom techniqu 1
+fl backtrack 1
+fl backtrack asser 1
+fl bandwidth 1
+fl bandwidth receiv 1
+fl black 1
+fl block 1
+fl blown 1
+fl blown increm 1
+fl blown system 1
+fl buffer 1
+fl cannot us 1
+fl capabil 1
+fl captur 2
+fl captur cl 1
+fl ch 1
+fl collect 1
+fl compil 1
+fl compl 1
+fl compl instead 1
+fl conclus 1
+fl connect 4
+fl connect network 1
+fl connect se 1
+fl construc 1
+fl conver 1
+fl conver object 1
+fl cop 1
+fl correct 2
+fl correct proof 1
+fl correctn 1
+fl correctn proof 1
+fl cr 1
+fl cur 1
+fl cur us 1
+fl decl 1
+fl defin 1
+fl definit 1
+fl detail 1
+fl determin 1
+fl determin ca 1
+fl disc 1
+fl disk 2
+fl disk pag 1
+fl disk rot 1
+fl distribut 1
+fl dynam 1
+fl enabl 1
+fl evalu 1
+fl execut 1
+fl explicit 1
+fl explicit form 1
+fl exploit 1
+fl explor 1
+fl extract 1
+fl extract cliqu 1
+fl f0 1
+fl f0 wh 1
+fl fact 1
+fl fact design 1
+fl first comput 1
+fl fl 1
+fl fledg 2
+fl fledg knowledg 1
+fl fledg program 1
+fl for fl 1
+fl form 1
+fl form rel 1
+fl form theor 1
+fl funct 1
+fl funct tool 1
+fl gener 1
+fl gener nondetermin 1
+fl hierarch 1
+fl hierarch shar 1
+fl imag 1
+fl imag match 1
+fl implem 1
+fl in parallel 1
+fl in term 1
+fl inst 1
+fl integr 1
+fl interleav 1
+fl interleav chain 1
+fl is ba 1
+fl is incr 1
+fl k tupl 1
+fl keep 1
+fl keep track 1
+fl label 1
+fl learn 1
+fl loc 1
+fl loc repr 1
+fl maintain 1
+fl mak 1
+fl memoryload 1
+fl mesh 1
+fl mesh collap 1
+fl mot 1
+fl mot vid 1
+fl must ch 1
+fl nam 1
+fl nat 1
+fl network 1
+fl network pot 1
+fl new sect 1
+fl nod 1
+fl norm 1
+fl norm typ 1
+fl optim 1
+fl paper 1
+fl papewr 1
+fl parallel 1
+fl path 1
+fl perform 1
+fl perm 1
+fl permut 1
+fl polynom 1
+fl polynom tim 1
+fl pr 1
+fl precc 1
+fl precc specif 1
+fl preserv 1
+fl prolog 2
+fl prolog system 1
+fl proposit 1
+fl proposit lin 1
+fl qualif 1
+fl qualif nam 1
+fl questionnair 1
+fl rang 1
+fl rank 1
+fl recognit 1
+fl recognit system 1
+fl recover 1
+fl recur 1
+fl recur neur 1
+fl report 1
+fl repr 2
+fl s appl 1
+fl s assum 1
+fl s learn 1
+fl satisf 1
+fl satisfact 1
+fl se 3
+fl se con 1
+fl search 1
+fl sect 1
+fl self 1
+fl self con 1
+fl sourc 1
+fl sourc cod 1
+fl sourc string 1
+fl span 1
+fl span tr 1
+fl specif 2
+fl specif qu 1
+fl st 1
+fl stabil 1
+fl start 1
+fl step 1
+fl substitut 1
+fl substitut evalu 1
+fl substitut rl 1
+fl syntact 1
+fl syntact tr 1
+fl tabl 1
+fl text 1
+fl text cluster 1
+fl text datab 1
+fl text docum 1
+fl text match 1
+fl tim 1
+fl tim bound 1
+fl tim complec 1
+fl to build 1
+fl tr 1
+fl train 1
+fl train se 1
+fl transm 1
+fl treat 1
+fl tur 1
+fl tur comput 1
+fl understood 1
+fl uniproc 1
+fl uniproc perform 1
+fl us 2
+fl ver 3
+fl vid 1
+fl vid search 1
+fl wil cluster 1
+fl52 1
+fl52 a perfect 1
+fl65 1
+flac 1
+flag 10
+flag and adjustm 1
+flag ar st 1
+flag ch 1
+flag ch point 1
+flag dep 1
+flag dep execut 1
+flag exhaust 1
+flag fal 1
+flag gener 1
+flag gl 1
+flag gl heart 1
+flag ind 1
+flag is se 1
+flag queu 1
+flag queu param 1
+flag se 1
+flag select 1
+flag shallow 1
+flag test 1
+flag to ind 1
+flag valu 1
+flag which hold 1
+flajol 1
+flak 1
+flam 1
+flam cain 1
+flam cain pa 1
+flamb 1
+flan 2
+flap 1
+flaschenhalsfr 1
+flaschenhalsfr parallel 1
+flaschenhalsfr parallel prior 1
+flat 11
+flat and sd 1
+flat bo 1
+flat bo lin 1
+flat configur 1
+flat en 1
+flat network 2
+flat network giv 2
+flat nowrit 1
+flat of term 1
+flat or nt 1
+flat rl 1
+flat rl match 1
+flat term 1
+flat term rewrit 1
+flat transact 1
+flat transact recov 1
+flat transact und 1
+flaviu 1
+flaviu cr 1
+flavor 2
+flavor of synchron 1
+flavour 1
+flavour eiffel 1
+flavour eiffel object 1
+flaw 2
+flaw th assum 1
+flc86 1
+flec 46
+flec allow 2
+flec allow compiler 1
+flec and autonom 1
+flec and dynam 1
+flec and ea 1
+flec and eff 1
+flec and fin 1
+flec and power 1
+flec and var 1
+flec ap 1
+flec ap input 1
+flec autom 1
+flec autom client 1
+flec ba 1
+flec cach 1
+flec cach manag 1
+flec cap 1
+flec classif 1
+flec event 1
+flec event handl 1
+flec fash 1
+flec for writ 1
+flec if requir 1
+flec implem 1
+flec in ar 1
+flec in ch 2
+flec in checkpoint 1
+flec in mimick 1
+flec in model 1
+flec in pack 2
+flec in system 1
+flec in upd 1
+flec inh 1
+flec is disallow 1
+flec is requir 1
+flec learn 1
+flec learn system 1
+flec manner 1
+flec mean 1
+flec method 1
+flec of ch 1
+flec of chr 1
+flec of select 1
+flec of using 1
+flec offer 1
+flec pag 1
+flec pag segm 1
+flec platform 1
+flec proc 1
+flec puisqu 1
+flec puisqu le 1
+flec servernet 1
+flec servernet ba 1
+flec system 2
+flec techniqu 1
+flec than requir 1
+flec that chr 1
+flec to an 1
+flec to distribut 1
+flec to support 1
+flec tool 1
+flec when compar 1
+fledg 2
+fledg knowledg 1
+fledg knowledg ba 1
+fledg program 1
+flem 1
+flesh 1
+flesh langu 1
+flesh langu allow 1
+flesh langu offer 1
+flesh program 1
+flesh program langu 1
+flesh script 1
+fletch 3
+flexibilit 1
+flexibilit e au 1
+flexibilit e dan 1
+flexibl 1
+flickner 2
+flight 2
+flight program 1
+flight siml 1
+flip 4
+flip a bit 1
+flip sid 1
+flit 2
+flit ar buffer 1
+flit ar deser 1
+flit ar st 1
+flit ba 1
+flit by flit 1
+flit cannot enter 1
+flit chunk 1
+flit is receiv 1
+flit is requir 1
+flit level 1
+flit level transfer 1
+flit per cycl 1
+flit proceed 1
+flit siz 1
+flit wid 1
+flit wid ram 1
+float 13
+float a.6 1
+float a.6 el 1
+float ad 1
+float den 1
+float doubl 1
+float doubl float 1
+float el 1
+float el funct 1
+float point 10
+float point arithm 2
+float point matr 1
+float point number 4
+float point oper 2
+float point unit 1
+float point valu 3
+float stream 1
+float stream string 1
+float treetimestat 1
+flog.ps.z 1
+flog.ps.z by anonym 1
+flood 1
+floor 5
+floor chang 1
+floor chang attempt 1
+floor control 1
+floor control chang 1
+floor plan 1
+florid 8
+florid gainesvil 2
+florin 1
+florin le 1
+flot 2
+flot de 2
+flot de contr 1
+flot de don 1
+flot dinstruc 1
+flot par 1
+flot par secon 1
+flounder 1
+flour 1
+flow 27
+flow along edg 1
+flow an 3
+flow and dat 1
+flow approach 1
+flow approach requir 1
+flow ba 2
+flow can tak 1
+flow conserv 1
+flow conserv constraint 1
+flow control 4
+flow control design 1
+flow control equ 1
+flow control mechan 2
+flow control stud 1
+flow dat 1
+flow dat dep 1
+flow dep 2
+flow diagram 1
+flow from nod 1
+flow from sub 1
+flow graph 2
+flow graph con 1
+flow graph exchang 1
+flow graph expr 1
+flow graph integr 1
+flow graph po 1
+flow in czochralsk 1
+flow in planar 1
+flow in regr 1
+flow in transport 1
+flow instruc 1
+flow instruc favor 1
+flow instruc using 1
+flow leav 1
+flow level 1
+flow lim 1
+flow lim parallel 1
+flow may accuml 1
+flow mechan 1
+flow min 1
+flow min cut 1
+flow of author 1
+flow of control 4
+flow of tim 1
+flow on parallel 1
+flow path 1
+flow pol 1
+flow problem 1
+flow program 1
+flow program graph 1
+flow shar 1
+flow structur 1
+flow succ 1
+flow test 1
+flow test tool 1
+flow through satur 1
+flow through transport 1
+flow to dat 1
+flow with multiplec 1
+flowchart 1
+floyd 5
+floyd algorithm 1
+floyd hoar 1
+floyd hoar program 1
+floyd method 1
+fluc 2
+fluc de 2
+fluc de contr 1
+fluc de don 1
+fluc dinstruc 1
+fluc distinct 1
+fluctu 1
+fluctu alor 1
+fluctu alor entr 1
+fluctu de 1
+fluctu de hypoth 1
+fluid 3
+fluid and col 1
+fluid flow 1
+fluid model 1
+fluid model rat 1
+fluid model server 1
+fluid model system 1
+fluid molecl 1
+fluid server 1
+fluid server pack 1
+fluid system 1
+fluid ver 1
+fluidmodel 1
+fluk 1
+flur 1
+flur of brok 1
+flush 4
+flush cach 1
+flush cach entr 1
+flush is lim 1
+flush is nec 1
+flush level 1
+flush of level 1
+flush oper 1
+flush or memor 1
+flush stal 1
+flush stal ip 1
+flush succ 1
+flush th buffer 1
+flush th cach 1
+fly 2
+fly del 1
+fly del ec 1
+fly nod 1
+fly nod del 1
+flyn 2
+flyn built 1
+fm 3
+fm and fm 1
+fm ar absorb 1
+fm ar upd 1
+fm is absorb 1
+fm jm 1
+fm lead 1
+fm of fragm 1
+fm wil merg 1
+fm1 1
+fm89 1
+fmatund 1
+fmg 1
+fmg wh 1
+fmin 1
+fminroleg 1
+fmj 1
+fmj denot 1
+fmj f ki 1
+fml 2
+fml f0 1
+fml fml 1
+fml fml var 1
+fml solut 1
+fml solut av 1
+fml var 1
+fml var lit 1
+fmpc 1
+fn 9
+fn f lj 1
+fn fi 1
+fn li 1
+fn li ae 1
+fn method 1
+fn method funct 1
+fn wh 1
+fn wh f1 1
+fn1 1
+fnam 2
+fnam assign 1
+fnam assign pattern 1
+fnam fo 1
+fnam fo pattern 1
+fneighbor 1
+fng 1
+fng f1 1
+fngd92 1
+fngd93 1
+fnilg 1
+fnowg 1
+fo 10
+fo a chaqu 1
+fo a la 1
+fo au 2
+fo au contr 1
+fo au cour 1
+fo au sein 1
+fo aux 1
+fo aux echec 1
+fo avant 1
+fo avant de 1
+fo best ba 1
+fo ce 1
+fo ce nombr 1
+fo ci 1
+fo ci diff 1
+fo ci le 1
+fo conflictuel 1
+fo court 1
+fo d etermin 2
+fo dan 2
+fo dan la 1
+fo dan le 1
+fo dan sep 1
+fo de 1
+fo de mut 1
+fo du 1
+fo du probl 1
+fo effectu 1
+fo effectu ee 1
+fo efficac 1
+fo enclench 1
+fo est 1
+fo est la 1
+fo g rer 1
+fo is renam 1
+fo j oen 1
+fo jusqu 1
+fo la 1
+fo la condit 1
+fo la ver 1
+fo lact 1
+fo lact du 1
+fo ladr 1
+fo ladr de 1
+fo lappel 1
+fo lappel effectu 1
+fo le 3
+fo le adr 1
+fo le avant 1
+fo le claus 1
+fo le dern 1
+fo le nombr 1
+fo le point 1
+fo le probl 1
+fo le project 1
+fo le pseud 1
+fo le quest 1
+fo le rou 1
+fo lib 1
+fo lib er 1
+fo lin 1
+fo lin ear 1
+fo non 1
+fo non conflictuel 1
+fo par 1
+fo par secon 1
+fo par un 1
+fo pattern 1
+fo plus de 1
+fo plus vit 1
+fo qu 3
+fo qu la 1
+fo qu le 1
+fo qu lon 2
+fo quil 1
+fo quil est 1
+fo quon 1
+fo quun 2
+fo quun point 1
+fo quun transit 1
+fo quun var 1
+fo r eel 1
+fo sauvegard 1
+fo sauvegard ee 1
+fo sauvegarder 1
+fo scind 1
+fo si 1
+fo si la 1
+fo sur 2
+fo sur la 1
+fo sur le 1
+fo un 1
+fo un incr 1
+fo un outil 1
+fo un point 1
+fo ver 1
+fo ver la 1
+fo.c 1
+fo.o 1
+fo.o produc 1
+fo.y 1
+fo1 1
+fo2b 1
+fo2b 1g 1
+fo2bg 1
+foc 56
+foc an an 1
+foc ap 1
+foc appear 1
+foc context 1
+foc context consider 1
+foc context foc2 1
+foc creat 1
+foc detect 1
+foc empir 1
+foc empir inquir 1
+foc for keyboard 1
+foc for power 1
+foc for reason 1
+foc in graph 1
+foc in particl 1
+foc inform 1
+foc is appl 1
+foc is expect 1
+foc is mov 1
+foc it learn 1
+foc la 1
+foc la plupart 1
+foc length 1
+foc main 1
+foc method 1
+foc object 1
+foc of attent 1
+foc of developm 1
+foc on appl 1
+foc on autom 1
+foc on chang 1
+foc on clear 1
+foc on concur 1
+foc on dat 1
+foc on detail 1
+foc on determin 1
+foc on ext 1
+foc on graph 1
+foc on hardwar 1
+foc on hierarch 1
+foc on low 1
+foc on memor 1
+foc on nding 1
+foc on order 1
+foc on pair 1
+foc on parallel 1
+foc on proc 1
+foc on prop 1
+foc on repetit 1
+foc on select 1
+foc on specif 1
+foc on st 1
+foc on task 1
+foc our attent 2
+foc point 2
+foc real tim 1
+foc sol 1
+foc spac 1
+foc sur 1
+foc sur de 1
+foc symp 1
+foc th reason 1
+foc upon mach 1
+foc0 1
+foc0 se 1
+foc1 1
+foc1 se 1
+foc2 1
+foc2 se 1
+focaliser 1
+focaliser sur 1
+focaliser sur le 1
+foepg 1
+fof 1
+fof regl 1
+fof regl problem 1
+fog 2
+fog answer 1
+fog91 1
+fogel 1
+fogelman 1
+foght 1
+foght fon 1
+foig 1
+fol 2
+fold 10
+fold cart 1
+fold cart produc 1
+fold cr 1
+fold cr val 1
+fold edit 1
+fold form 1
+fold goal 1
+fold int appl 1
+fold occur 1
+fold or self 1
+fold unfold 1
+fold unfold transform 1
+follow 109
+follow 4d 2
+follow 4d cl 2
+follow a common 1
+follow a div 1
+follow a link 1
+follow a prior 1
+follow a rel 1
+follow a simil 1
+follow a simpl 1
+follow a strict 1
+follow a syntac 1
+follow aid 1
+follow an empir 1
+follow an expect 1
+follow an experim 1
+follow by arbitr 1
+follow by connect 1
+follow by elabor 1
+follow by faster 1
+follow by funct 1
+follow by induc 2
+follow by labor 1
+follow by m0 1
+follow by project 1
+follow by quest 1
+follow by questionnair 1
+follow by rec 1
+follow by reduc 1
+follow by select 1
+follow by solut 1
+follow by substitut 1
+follow by tak 1
+follow by tt 1
+follow by www 1
+follow d trac 1
+follow def 1
+follow def se 1
+follow differ reason 1
+follow ea 2
+follow exact 1
+follow for proc 1
+follow from caratheodor 1
+follow from claim 1
+follow from corol 1
+follow from lem 2
+follow from p1 1
+follow from p2 1
+follow from proposit 2
+follow from remark 1
+follow from theorem 3
+follow in a4 1
+follow in memor 1
+follow in order 1
+follow in proc 1
+follow in sect 1
+follow log 1
+follow specif 1
+follow specif monit 1
+follow th approach 1
+follow th architectur 1
+follow th ba 1
+follow th com 1
+follow th conv 1
+follow th dynam 1
+follow th ea 1
+follow th equ 1
+follow th experim 1
+follow th fundam 1
+follow th guidel 1
+follow th head 1
+follow th law 1
+follow th leftmost 1
+follow th lin 1
+follow th nod 1
+follow th outl 1
+follow th path 1
+follow th pathw 1
+follow th precc 1
+follow th project 1
+follow th proper 1
+follow th syntac 1
+follow th unicast 1
+follow that act 1
+follow that ai 1
+follow that cc 1
+follow that comput 1
+follow that dk 1
+follow that e0i 1
+follow that e2 1
+follow that giv 1
+follow that hi 1
+follow that init0 1
+follow that ker 1
+follow that lj 1
+follow that nr 1
+follow that pj 1
+follow that r0 1
+follow that shar 1
+follow that si1 1
+follow that subsequ 1
+follow that t2 1
+follow that tl 1
+follow that u0w0 1
+follow that uj 1
+follow that v0 1
+follow their outl 1
+follow their terminolog 1
+follow to reach 1
+follow triv 1
+follow we assum 1
+follow we concentr 1
+follow we corrupt 1
+follow we giv 1
+follow we show 1
+follow we us 1
+follow work 1
+folow 1
+folow character 1
+fomel 1
+fomel de 1
+fomel de siml 1
+fon 3
+fon appel 1
+fon de 1
+fon de la 1
+fon de lenviron 1
+fon de lenviron2 1
+fon du 1
+fon du point 1
+fon dun 1
+fon dun bloc 1
+fon ee 2
+fon ee sur 2
+fon es 1
+fon es sur 1
+fon ref 1
+fon ref ref 1
+fonct 6
+fonct a optimiser 2
+fonct a peu 1
+fonct abstrait 1
+fonct abstrait dun 1
+fonct aff 1
+fonct aff en 1
+fonct aff nl 1
+fonct al 1
+fonct al eatoir 1
+fonct appel 1
+fonct appel ee 1
+fonct begin 1
+fonct begin broadcast 1
+fonct bool 1
+fonct bool een 1
+fonct co 1
+fonct co ut 1
+fonct com 1
+fonct com lestampil 1
+fonct comp 1
+fonct couvr 1
+fonct couvr de 1
+fonct d efin 1
+fonct d elag 1
+fonct d evalu 1
+fonct dacc 1
+fonct dacc es 1
+fonct dappart 1
+fonct dautr 1
+fonct dautr pseud 1
+fonct de 6
+fonct de acc 1
+fonct de argum 1
+fonct de ba 1
+fonct de ce 1
+fonct de conver 1
+fonct de cr 1
+fonct de crit 1
+fonct de densit 1
+fonct de deux 1
+fonct de diffus 1
+fonct de don 1
+fonct de ecritur 1
+fonct de fonct 1
+fonct de ik 1
+fonct de journ 1
+fonct de la 4
+fonct de lagc 1
+fonct de lampleur 1
+fonct de leffectif 1
+fonct de lespac 1
+fonct de leur 1
+fonct de lhorlog 1
+fonct de lorgan 1
+fonct de mut 1
+fonct de mvp 1
+fonct de nombr 1
+fonct de part 1
+fonct de plac 2
+fonct de profondeur 1
+fonct de propr 1
+fonct de sign 1
+fonct de son 1
+fonct de tout 1
+fonct de typ 1
+fonct de valeur 1
+fonct dit 1
+fonct dit de 1
+fonct du 3
+fonct du nombr 1
+fonct du nouveau 1
+fonct du plac 1
+fonct du sign 1
+fonct du syst 1
+fonct du typ 1
+fonct dun 1
+fonct dun pr 1
+fonct en 2
+fonct en mod 1
+fonct en par 1
+fonct en redon 1
+fonct ent 1
+fonct ent er 1
+fonct est 2
+fonct est distribu 1
+fonct est mal 1
+fonct etud 1
+fonct etud ee 1
+fonct f est 1
+fonct fi 1
+fonct fi effectu 1
+fonct fin 1
+fonct fin est 1
+fonct implicit 1
+fonct indicatr 1
+fonct indicatr dun 1
+fonct inf 1
+fonct lin 1
+fonct lin eair 1
+fonct m etaphoriqu 1
+fonct mal 1
+fonct mal en 1
+fonct matriciel 1
+fonct matriciel ma 1
+fonct maxim 1
+fonct mod 1
+fonct mod el 1
+fonct multipl 1
+fonct ne 1
+fonct ne soit 1
+fonct optim 1
+fonct optim ee 1
+fonct part 1
+fonct part ent 1
+fonct perm 1
+fonct perm quand 1
+fonct peut 2
+fonct peut etr 1
+fonct plafon 1
+fonct plafon ou 1
+fonct plafon se 1
+fonct planch 1
+fonct planch ou 1
+fonct posit 1
+fonct posit qu 1
+fonct qu 2
+fonct qu de 1
+fonct qu nous 1
+fonct quadratiqu 1
+fonct r eel 1
+fonct r el 1
+fonct scalair 1
+fonct scalair du 1
+fonct scalair ff 1
+fonct scalair ou 1
+fonct scalair sont 1
+fonct selon 1
+fonct selon le 1
+fonct soit 1
+fonct soit en 1
+fonct sont 2
+fonct sont caract 1
+fonct sous 1
+fonct sous la 1
+fonct sp 1
+fonct sp ecif 1
+fonct standard 1
+fonct sur 1
+fonct sur lensembl 1
+fonct uj 1
+fonct vectoriel 1
+fonct vectoriel de 1
+foncteur 1
+foncteur attendu 1
+foncteur cour 1
+foncteur cour se 1
+foncteur darit 1
+foncteur de 1
+foncteur de lenviron 1
+foncteur de pr 1
+foncteur doit 1
+foncteur doit etr 1
+foncteur dun 1
+foncteur dun environ 1
+foncteur en 1
+foncteur en un 1
+foncteur est 1
+foncteur est assoc 1
+foncteur est le 1
+foncteur et ai 1
+foncteur et de 1
+foncteur et suppr 1
+foncteur et sur 1
+foncteur fon 1
+foncteur nest 1
+foncteur nest pa 1
+foncteur perm 1
+foncteur perm de 1
+foncteur point 1
+foncteur princip 1
+foncteur r ef 1
+foncteur serait 1
+foncteur serait retourn 1
+foncteur var 1
+fonctionalit 1
+fonctionalit e nous 1
+fonctionel 1
+fonctionel et elim 1
+fonctionnalit 1
+fonctionnalit s similair 1
+fonctionnel 1
+fonctionner 1
+fondam 5
+fondam condu 1
+fondam dan 2
+fondam dan la 1
+fondam dan notr 1
+fondam de 1
+fondam de a.g 1
+fondam de ag 1
+fondam de algorithm 1
+fondam de autr 1
+fondam de la 1
+fondam de loptim 1
+fondam de mach 1
+fondam diff 1
+fondam diff erent 1
+fondam du 2
+fondam du compteur 1
+fondam du trait 1
+fondam dun 2
+fondam dun group 1
+fondam dun syst 1
+fondam l etud 1
+fondam lor 1
+fondam lor de 1
+fondam par 1
+fondam par el 1
+fondam partag 1
+fondam partag ee 1
+fondam pour 2
+fondam pour envisager 1
+fondam pour le 1
+fondam qu 1
+fondam qu guid 1
+fondam qu sont 1
+fondam s ecrit 1
+fondam s equentiel 1
+fondam sur 1
+fondam sur le 1
+fondamentaux 2
+fondamentaux de 1
+fondamentaux de ag 1
+font 8
+font ain 1
+font ain au 1
+font and text 1
+font en 1
+font en par 1
+font evoluer 1
+font evoluer un 1
+font in qbfun2 1
+font intervenir 3
+font intervenir constam 1
+font intervenir qu 1
+font intervenir un 1
+font le 1
+font leur 1
+font leur apparit 1
+font lhypoth 1
+font lhypoth es 1
+font lobj 1
+font lobj de 1
+font moin 1
+font moin dun 1
+font par 1
+font part 1
+font part de 1
+font part du 1
+font plus dun 1
+font qu 1
+font qu se 1
+font refer 1
+font sentir 1
+font siz 1
+font toutef 1
+font toutef pa 1
+food 1
+fool 1
+fool hi martin 1
+foop 1
+footnot 1
+fop 1
+for 39
+for a cop 1
+for a transport 1
+for addr 1
+for addr stub 1
+for and back 1
+for and backpropag 1
+for and und 1
+for chain 1
+for chain rl 1
+for check 2
+for check search 1
+for check serv 1
+for comp.lang.prolog 1
+for computer 1
+for computer network 1
+for constraint 1
+for datab 1
+for datab oper 1
+for direct 2
+for ent 1
+for execut 1
+for ffl 1
+for futur 1
+for ge 1
+for inform 1
+for it succ 1
+for it up 1
+for log 1
+for loop 1
+for me 2
+for me ver 1
+for ment 1
+for ment paradigm 1
+for ment problem 1
+for methodolog 1
+for multilayer 1
+for multilayer neur 1
+for natur 1
+for network 1
+for neur 3
+for neur network 3
+for of me 1
+for oper 1
+for oper log 1
+for or back 1
+for or ct 1
+for or rollback 1
+for path 1
+for pe 1
+for pe dopar 1
+for ph 1
+for progr 1
+for read 1
+for read support 1
+for refer 1
+for refer facil 1
+for rout 1
+for sampl 1
+for sampl hybrid 1
+for sampl procedur 1
+for solut 1
+for subtransact 1
+for system 1
+for system oper 1
+for th flit 1
+for th inform 1
+for th me 1
+for th not 1
+for th pack 2
+for th tok 1
+for th transport 1
+for to establ 1
+for to gib 1
+for to multipl 1
+for to test 1
+for transact 1
+for transact compl 1
+for window 1
+for1 1
+for85 1
+forbid 2
+forbid a sender 1
+forbid color 1
+forbid color l1 1
+forbid with l1 1
+forbid with respect 1
+forc 44
+forc a batch 1
+forc a hardwar 1
+forc a singl 1
+forc an evalu 1
+forc and pot 1
+forc and proceed 1
+forc and upd 1
+forc any equ 1
+forc ar comput 1
+forc ba 1
+forc bar 1
+forc brakep 1
+forc brakf 1
+forc calcl 1
+forc comput 1
+forc comput using 1
+forc correspon 1
+forc could tak 1
+forc dat 1
+forc dat writ 1
+forc du 1
+forc ement 2
+forc ement en 1
+forc ement lenviron 1
+forc ement tout 1
+forc exer 1
+forc gradf 1
+forc implem 1
+forc int learn 1
+forc is giv 1
+forc is recomput 1
+forc it exer 1
+forc la 1
+forc la compil 1
+forc larg quer 1
+forc memor 1
+forc memor acc 1
+forc ment 1
+forc off 1
+forc re inser 1
+forc research 1
+forc rollf 1
+forc select 2
+forc shift 1
+forc shift sign 1
+forc smal quer 1
+forc substr 1
+forc substr s1 1
+forc th algorithm 1
+forc th fram 1
+forc th maxim 1
+forc th network 1
+forc th system 1
+forc to cont 1
+forc to encl 1
+forc to le 1
+forc to lo 1
+forc to rel 1
+forc to relinqu 1
+forc to sacrif 1
+forc to writ 1
+forc tracf 1
+forc visit 1
+forc visit ee 1
+forc writ 1
+ford 2
+ford and i.a 1
+ford and moghrab 1
+ford rout 1
+fordj 1
+fordj essec.ac.uk 1
+forecast 2
+forecast perform 1
+forecast th futur 1
+forecast vi suboptim 1
+forecl 1
+forecl th stud 1
+forefront 1
+foreg 1
+foreg relationship 1
+foreign 1
+foreign nearest 1
+foreign nearest neighbour 1
+foremost 1
+foremost problem 1
+forenam 1
+forerunner 1
+foreseen 1
+foreseen by tradit 1
+forest 6
+forest and bin 1
+forest con 1
+forest f contain 1
+forest of 2d 1
+forest of inver 1
+forest of n0 1
+forest of part 1
+forest of root 1
+forest of tr 1
+forest po 1
+forest ti1 1
+forever 3
+forever in st 1
+forfeit 1
+forfeit th decl 1
+forg 5
+forg a tot 1
+forg in connect 1
+forg of desir 1
+forg to wear 1
+forg your memor 1
+forgot 1
+fork 4
+fork and join 1
+fork cr 1
+fork cr ee 1
+fork join 2
+fork join execut 1
+fork join model 1
+fork join synchron 1
+fork oper 1
+fork pour 1
+fork pour cr 1
+fork3 1
+form 117
+form a 2d 1
+form a b0 1
+form a centr 1
+form a chain 1
+form a constrain 1
+form a convec 1
+form a diffeomorph 1
+form a direct 1
+form a fl 1
+form a forest 1
+form a fragm 1
+form a gal 1
+form a graph 1
+form a joint 1
+form a kcm 1
+form a key 1
+form a kind 1
+form a monot 1
+form a multigraph 1
+form a nondetermin 1
+form a pair 1
+form a part 2
+form a partit 1
+form a peer 1
+form a permut 1
+form a piec 1
+form a pock 1
+form a pot 1
+form a rever 1
+form a separ 1
+form a simplif 1
+form a singl 1
+form a strong 1
+form a supergraph 1
+form a tot 1
+form a tr 2
+form a univer 1
+form abstract 1
+form ad2at 1
+form addr 1
+form admissibl 1
+form admissibl de 1
+form after form 1
+form after tim 1
+form alg 1
+form alg ebriqu 1
+form algorithmiqu 1
+form algorithmiqu de 1
+form allow 2
+form an 2
+form an antimatr 1
+form an econom 1
+form an iden 1
+form analytiqu 1
+form analytiqu est 1
+form and ask 1
+form and bottom 1
+form and concat 1
+form and cont 2
+form and datab 1
+form and effect 1
+form and emb 1
+form and event 1
+form and hypoth 1
+form and incr 1
+form and interpr 1
+form and kind 1
+form and logspac 1
+form and nc 1
+form and predict 1
+form and ptim 1
+form and server 1
+form and simplif 1
+form and standard 1
+form and substitut 1
+form another tcp 1
+form apparatus 1
+form appear 1
+form approach 2
+form appropr 1
+form ar ad 1
+form ar avail 1
+form ar consider 1
+form ar describ 1
+form ar direct 1
+form ar equiv 1
+form ar evalu 1
+form ar giv 1
+form argum 2
+form argum agr 1
+form as 1
+form asbt 1
+form aspect 2
+form assez 1
+form assez complec 1
+form assum 1
+form aux 1
+form aux fonct 1
+form ax 1
+form b oe1oe2 1
+form b0 1
+form ba 4
+form ba taxonom 1
+form ba tool 1
+form becaus succ 1
+form between tim 1
+form block 1
+form by ap 1
+form by check 1
+form by combin 1
+form by del 1
+form by enumer 1
+form by freuder 1
+form by heur 1
+form by ph 1
+form by program 1
+form by rever 1
+form by using 1
+form chain 1
+form character 1
+form compar 1
+form compar top 1
+form compl 1
+form composit 1
+form comput 1
+form con 1
+form con condit 1
+form concr 1
+form concr syntac 1
+form condit 2
+form constraint 1
+form contain 2
+form context 1
+form curv 1
+form cz 1
+form d eg 1
+form d en 1
+form d on 1
+form dappel 1
+form dappel aux 1
+form dat 1
+form dat model 1
+form de 4
+form de argum 1
+form de ba 1
+form de boucl 1
+form de ce 1
+form de cod 1
+form de compil 1
+form de coupur 1
+form de la 2
+form de lalgorithm 1
+form de linflu 1
+form de matr 1
+form de pav 1
+form de smith 1
+form de sp 1
+form de term 1
+form def 6
+form def dynam 1
+form defin 4
+form definit 11
+form denot 1
+form dep 1
+form deriv 1
+form describ 3
+form descript 1
+form design 1
+form design techniqu 1
+form developm 1
+form developm method 1
+form di 1
+form di di 1
+form diff 1
+form diff erent 1
+form dnf 1
+form don 1
+form don ee 1
+form doptim 1
+form doptim de 1
+form du 2
+form du nid 1
+form du voisin 1
+form dun 4
+form dun arbr 1
+form dun cod 1
+form dun ensembl 1
+form dun matr 1
+form dun point 1
+form dun som 1
+form e de 1
+form each level 1
+form earl 1
+form ee 1
+form ee dan 1
+form ee de 1
+form encapsl 1
+form encapsl ee 1
+form est 1
+form est dit 1
+form evalu 1
+form execut 1
+form execut sem 1
+form expr 2
+form expr rol 1
+form ext 3
+form for arrow 1
+form for compil 1
+form for complec 1
+form for datalog 1
+form for describ 1
+form for horn 1
+form for sem 1
+form for synth 1
+form for us 1
+form for variabl 1
+form for verif 1
+form form1 1
+form forml 1
+form found 3
+form framework 3
+form framework len 1
+form from el 1
+form from tcp 1
+form from tradit 1
+form fun 1
+form funct 1
+form g en 1
+form gener 2
+form gener parameter 1
+form giv 1
+form graph 1
+form h ap 1
+form hav receiv 1
+form hg 1
+form hyperplan 1
+form if condit 1
+form iff 2
+form in bod 1
+form in concur 1
+form in eval 1
+form in figur 1
+form in hol 1
+form in label 1
+form in order 1
+form in step 1
+form in term 1
+form in theor 1
+form indistingu 1
+form init 1
+form init0 1
+form input 1
+form int block 1
+form int group 1
+form is ba 1
+form is empt 1
+form is evalu 2
+form is mut 1
+form is return 1
+form is split 1
+form is st 1
+form is writ 1
+form it prov 1
+form j level 1
+form j reader 1
+form jd 1
+form judg 1
+form justif 1
+form k1 1
+form k1 k2 1
+form kl 1
+form klein 1
+form l1 1
+form la 2
+form langu 2
+form langu theorem 1
+form larger 1
+form larger me 1
+form le 1
+form le pattern 1
+form lead 1
+form lh 1
+form lim 1
+form lim ee 1
+form log 1
+form loop 1
+form m0 1
+form m1 1
+form man requir 1
+form manner 1
+form matriciel 2
+form mean 1
+form mechan 1
+form method 1
+form mi 1
+form model 5
+form modl 1
+form moy 1
+form must result 1
+form nam 1
+form nearest 1
+form nearest neighbour 1
+form new peer 1
+form norm 2
+form norm de 1
+form norm dherm 1
+form norm ee 1
+form object 1
+form obtain 1
+form obtenu 1
+form obtenu pour 1
+form obv 1
+form obv reduc 1
+form occur 1
+form occur encl 1
+form oe0 1
+form oe0 wh 1
+form of abstract 1
+form of an 2
+form of appl 1
+form of atom 1
+form of author 1
+form of auxc 1
+form of batch 1
+form of block 1
+form of boolean 1
+form of bound 1
+form of caus 1
+form of classif 1
+form of coar 1
+form of complec 1
+form of computer 1
+form of constrain 1
+form of constraint 1
+form of contextu 1
+form of datab 1
+form of disk 1
+form of eff 1
+form of extr 1
+form of funct 1
+form of gener 1
+form of geometer 1
+form of goal 1
+form of header 1
+form of import 1
+form of induc 1
+form of inform 1
+form of inherit 1
+form of langu 1
+form of level 1
+form of lock 1
+form of me 1
+form of med 1
+form of microcod 1
+form of mod 1
+form of modif 1
+form of modl 1
+form of multiproc 1
+form of object 1
+form of opportun 1
+form of parallel 2
+form of qualit 1
+form of reason 1
+form of recolor 1
+form of reg 1
+form of register 1
+form of regl 1
+form of rel 1
+form of relationship 1
+form of renam 1
+form of repr 2
+form of ri 1
+form of rol 1
+form of rollback 1
+form of rout 1
+form of schem 1
+form of sem 1
+form of siz 1
+form of sl1 1
+form of specif 1
+form of speech 1
+form of stbar 1
+form of subtyp 1
+form of suff 1
+form of synchron 2
+form of tabl 1
+form of tailor 1
+form of targ 1
+form of taxonom 1
+form of tempor 1
+form of test 1
+form of tr 1
+form of tun 1
+form of vect 1
+form of year 1
+form on peut 1
+form oper 2
+form oper sem 1
+form or prim 1
+form organ 1
+form organ framework 1
+form organ structur 1
+form our method 1
+form our specif 1
+form output 1
+form pack 1
+form pack header 1
+form pair 1
+form param 1
+form param list 1
+form parameter 4
+form parameter nam 1
+form parenth 1
+form parenth string 1
+form part 2
+form peuv 1
+form peuv se 1
+form pour 1
+form pour le 1
+form pr 2
+form pr ec 1
+form prfx 1
+form proc 1
+form program 2
+form program execut 1
+form program writ 1
+form proof 2
+form prop 1
+form prop ee 1
+form proper 2
+form quot 1
+form r0 1
+form r1 1
+form rationnel 1
+form rationnel de 1
+form refin 1
+form refin method 1
+form rel 3
+form rel algebr 1
+form rel schem 1
+form reminisc 1
+form requir 1
+form restk 1
+form result 2
+form ri 3
+form rl 1
+form rol 1
+form rol graph 1
+form rol organ 1
+form runm 1
+form s1 1
+form s1 s2 1
+form sa 1
+form sa partit 1
+form se 2
+form se oper 1
+form sem 4
+form sem ba 1
+form sf2c 1
+form sf2c dt 1
+form shown 1
+form sign 1
+form sl 1
+form solut 1
+form souhait 1
+form souhait ee 1
+form sourc 1
+form sourc interm 1
+form speak 1
+form spec form 1
+form specif 5
+form specif commun 1
+form specif system 1
+form spmd 1
+form st 1
+form st mach 1
+form string 1
+form structur 1
+form structur object 1
+form stud 2
+form sub 1
+form subtyp 1
+form suiv 2
+form sup 2
+form sup erieur 2
+form support 1
+form sur 1
+form sur le 1
+form surfac 1
+form syntac 1
+form syntact 1
+form syntact accept 1
+form system 1
+form tableaux 1
+form tableaux qu 1
+form techniqu 1
+form test 2
+form test refin 1
+form test specif 1
+form th ba 10
+form th block 1
+form th bod 1
+form th coar 1
+form th contain 1
+form th convec 1
+form th cor 1
+form th cover 1
+form th design 1
+form th differ 1
+form th domain 1
+form th fin 1
+form th id 1
+form th intuit 1
+form th leav 2
+form th major 1
+form th mean 1
+form th not 1
+form th output 1
+form th path 1
+form th problem 1
+form th proc 1
+form th prop 1
+form th record 1
+form th refin 1
+form th requir 1
+form th se 3
+form th serv 1
+form th third 1
+form th union 1
+form that belong 1
+form that creat 1
+form that evalu 1
+form that exp 1
+form that oeu 1
+form their sum 1
+form theor 2
+form theor ba 1
+form theor develop 1
+form thus 1
+form to appear 1
+form to constraint 1
+form to describ 1
+form to expr 1
+form to figur 1
+form to oe 1
+form to us 1
+form to user 1
+form top 2
+form top level 1
+form tout 1
+form treatm 1
+form un 2
+form un champ 1
+form un partit 1
+form un var 1
+form under rigid 1
+form unquot 1
+form usag 1
+form using 4
+form using narrow 1
+form uv 1
+form uv wx 1
+form ver 1
+form voulu 1
+form voulu pour 1
+form w.r.t 1
+form wa sent 1
+form we empl 1
+form we mean 1
+form weigh 1
+form weigh matr 1
+form wh 2
+form wh appropr 1
+form wh execut 1
+form wh nod 1
+form wh oper 1
+form wh valu 1
+form which establ 1
+form with featur 1
+form with handler 1
+form with logspac 1
+form writ 1
+form xi 1
+form xi xj 1
+form xy 2
+form xy 1z1 1
+form ye conc 1
+form.html 1
+form1 2
+form1 form2 1
+form2 1
+form3 1
+form6 1
+form6 is main 1
+form7 1
+formaliser 1
+formaliser le 1
+formaliser le appl 1
+formaliser relativ 1
+formaliser relativ facil 1
+formaliz 5
+formaliz an interm 1
+formaliz our ba 1
+formaliz th evolut 1
+formaliz th id 1
+formaliz th inst 1
+formalparam 1
+formalparm 1
+format 21
+format and gener 1
+format assign 1
+format assign block 1
+format block 1
+format de 1
+format de instruc 1
+format directiv 1
+format fault 1
+format fault tr 1
+format for vid 1
+format inform 1
+format input 2
+format input output 1
+format io 1
+format io a.8 1
+format io fic 1
+format man.tic 1
+format nil 1
+format nil path 1
+format of monet 1
+format print 1
+format print stat 1
+format which tak 1
+formatter 1
+formatter recogn 1
+formel 2
+formel nous 1
+formel nous sembl 1
+formentin 1
+former 24
+former and henc 1
+former approach 1
+former assignm 1
+former ca 1
+former cal 1
+former cal sit 1
+former cl 1
+former comput 1
+former contain 1
+former examin 1
+former execut 1
+former execut stat 1
+former is ba 1
+former is bipart 1
+former is ind 1
+former is relev 1
+former is restrict 1
+former mean 1
+former mean chang 1
+former member 1
+former opt 1
+former opt impl 1
+former pa 1
+former pa nb 1
+former project 1
+former tak 2
+former traver 1
+former un scalair 1
+former user 1
+former user rol 1
+former var 1
+former var requir 1
+former work 1
+former yield 1
+former yield high 1
+formfeed 1
+formfeed j linefeed 1
+formid 2
+forml 59
+forml 8x9y 1
+forml 8y9x 1
+forml 9x 1
+forml 9x1 1
+forml 9x2fbmgn 1
+forml 9y 1
+forml a de 1
+forml a detail 1
+forml a theor 1
+forml a ver 1
+forml and closur 1
+forml and finit 1
+forml and shown 1
+forml and us 1
+forml appl 1
+forml ar ch 1
+forml ar construc 2
+forml ar contextu 1
+forml ar giv 1
+forml ar glob 1
+forml ar sub 1
+forml as argum 1
+forml as follow 2
+forml as giv 1
+forml as rewrit 1
+forml assoc 1
+forml assum 1
+forml atomiqu 1
+forml atomiqu ou 1
+forml becom 1
+forml c xi 1
+forml closer 1
+forml combin 1
+forml complec 1
+forml complec jusqu 1
+forml conc 1
+forml contain 2
+forml contain bin 1
+forml correct 1
+forml correct procedur 1
+forml correspon 2
+forml correspon au 1
+forml de 1
+forml de gib 1
+forml decl 1
+forml deriv 1
+forml desir 1
+forml desir singl 1
+forml disc 1
+forml du 1
+forml du th 1
+forml ea 1
+forml ea follow 1
+forml en 1
+forml en le 1
+forml estim 1
+forml et op 1
+forml exact 1
+forml exact pour 1
+forml expr 1
+forml for arbitr 1
+forml for input 1
+forml for quest 1
+forml for srq 1
+forml for stat 1
+forml for transform 1
+forml for triangl 1
+forml from circuit 1
+forml gener 1
+forml hold 1
+forml in claus 1
+forml in conjunct 1
+forml in defin 1
+forml in dnf 1
+forml in figur 1
+forml in hilog 1
+forml in ml 1
+forml in prolog 1
+forml in subsect 1
+forml ind 1
+forml is context 1
+forml is defin 2
+forml is equiv 2
+forml is estim 1
+forml is fic 1
+forml is report 1
+forml is simpler 1
+forml is yi 1
+forml lead 1
+forml logiqu 1
+forml logiqu du 1
+forml mor eff 1
+forml ne 1
+forml ne perm 1
+forml ne prov 1
+forml oe 3
+forml oer 1
+forml of color 1
+forml of constraint 1
+forml of eff 1
+forml of evan 1
+forml of hamilt 1
+forml of interior 1
+forml of length 1
+forml of ml 1
+forml of requir 1
+forml of se 1
+forml of spar 1
+forml of srq 1
+forml of symmeter 1
+forml output 1
+forml perm 1
+forml plus complec 1
+forml pr 2
+forml pr loc 1
+forml prec 1
+forml problem 1
+forml quantif 1
+forml quantif le 1
+forml r0 1
+forml rel 1
+forml report 1
+forml shown 1
+forml siz 1
+forml specif 1
+forml suiv 1
+forml support 1
+forml th concept 1
+forml th design 1
+forml th ec 1
+forml th gener 1
+forml th knowledg 1
+forml th nec 1
+forml th not 1
+forml th perform 1
+forml th problem 3
+forml th proof 1
+forml th view 1
+forml that deriv 1
+forml that estim 1
+forml that say 1
+forml that us 2
+forml to calcl 1
+forml to estim 2
+forml to plot 1
+forml to search 1
+forml to upd 1
+forml univer 1
+forml using 3
+forml using algorithm 1
+forml util 1
+forml util lop 1
+forml var 1
+forml var dep 1
+forml vi syntact 1
+forml wa du 1
+forml wa solut 1
+forml wa transl 1
+forml we elim 1
+forml wer attempt 1
+forml wer deriv 1
+forml whil maintain 1
+forml with const 1
+forml with surpr 1
+forml xi 1
+forml xi xj 1
+formn 1
+formulad 1
+formuler 1
+formuler en 1
+formuler en util 1
+forrest 1
+forschungsbericht 1
+forschungsgemeinschaft 1
+forschungszentr 2
+forschungszentr j ulich 2
+fort 5
+fort coh 1
+fort coh erent 1
+fort coupl 1
+fort coupl ee 1
+fort de 2
+fort de don 1
+fort de la 2
+fort diversif 1
+fort diversif es 1
+fort entr 1
+fort entr cach 1
+fort est 1
+fort est lintroduc 1
+fort est qu 1
+fort et align 1
+fort g er 1
+fort influenc 1
+fort influenc ee 1
+fort la 1
+fort la bon 1
+fort lauderd 1
+fort lutil 1
+fort lutil de 1
+fort ne 1
+fort ne permettr 1
+fort par 1
+fort par inv 1
+fort pour 1
+fort pour ivy 1
+fort probabilit 1
+fort sur 1
+fort sur ce 1
+fort sur la 1
+fort sur le 1
+fort synchron 1
+fort synchron car 1
+fort var 1
+fort var ee 1
+fortgeschrittenenpraktikum 1
+forth 8
+forth ic 1
+forth ic heraklion 1
+forth in sect 1
+forthcom 1
+forthcom evalu 1
+fortran 11
+fortran ar giv 1
+fortran ar parallel 1
+fortran compiler 4
+fortran compiler user 1
+fortran compiler writ 1
+fortran d compiler 1
+fortran distingu 1
+fortran dmxp 1
+fortran dmxp de 1
+fortran environm 1
+fortran et sa 1
+fortran execut 1
+fortran execut tim 1
+fortran for 1
+fortran gener 1
+fortran gener interm 1
+fortran hpf 1
+fortran hpf mp 1
+fortran interfac 2
+fortran is ba 1
+fortran is describ 1
+fortran is giv 1
+fortran langu 2
+fortran langu ext 1
+fortran langu specif 2
+fortran lik program 1
+fortran program 7
+fortran program model 1
+fortran program zur 1
+fortran prov 1
+fortran prov nest 1
+fortran refer 1
+fortran refer manu 1
+fortran rl 1
+fortran s dan 1
+fortran s est 1
+fortran s mapl 1
+fortran s ninclu 1
+fortran s nint 1
+fortran s po 1
+fortran s pour 1
+fortran sourc 1
+fortran sourc cod 1
+fortran stat 1
+fortran stat separ 1
+fortran subrout 1
+fortran templ 1
+fortran to dataflow 1
+fortran us 1
+fortran ver 1
+fortran ver run 1
+fortran77 1
+fortschrittsbericht 1
+fortun 8
+fortun th restrict 1
+foster 1
+fot 1
+fot zaharoglou 1
+foufoul 1
+foufoul georgiou 1
+found 101
+found a branch 1
+found a ca 1
+found a cover 1
+found a ser 1
+found a shorter 1
+found a signif 1
+found accur 1
+found and decl 1
+found approach 1
+found appropr 1
+found between countr 1
+found by appl 1
+found by click 1
+found by construc 1
+found by decr 1
+found by exam 1
+found by nonmonot 1
+found by numer 1
+found by read 1
+found by regr 1
+found by search 2
+found by subtract 1
+found by system 1
+found by using 2
+found chang 1
+found cl 1
+found con 1
+found con tr 1
+found disappoint 1
+found disappoint low 1
+found ea 1
+found elsewh 1
+found for architect 1
+found for build 1
+found for comput 1
+found for computer 1
+found for high 1
+found for method 1
+found for object 3
+found for understand 1
+found grant 3
+found grant mip 2
+found in ap 3
+found in cl 1
+found in common 1
+found in const 1
+found in conv 1
+found in figur 2
+found in lin 1
+found in memoryload 1
+found in os 1
+found in parallel 1
+found in sect 3
+found in siegel 1
+found in taylor 1
+found in tim 2
+found in variabl 1
+found is inclus 1
+found it lim 1
+found it loc 1
+found laid 1
+found lc 1
+found lec 1
+found lec ident 1
+found mar 1
+found march 1
+found march estim 1
+found model 1
+found netsim 1
+found next lik 1
+found of computer 14
+found of equ 1
+found of fault 1
+found of lin 1
+found of log 5
+found of mathemat 3
+found of model 1
+found of mult 1
+found of object 1
+found of prob 1
+found of quer 1
+found of softwar 5
+found on 1
+found or interpol 1
+found or interrupt 1
+found overwhelm 1
+found parameter 1
+found part 1
+found part model 1
+found presid 1
+found presid young 1
+found quick 1
+found recur 1
+found sem 1
+found sib 1
+found sib findsibl 1
+found suit 1
+found th loc 1
+found th pot 1
+found that ad 1
+found that dataflow 1
+found that le 1
+found that me 1
+found that memor 1
+found that mov 1
+found that nov 1
+found that var 1
+found their loc 1
+found to conform 1
+found to contain 1
+found to dev 1
+found to differ 1
+found to ec 1
+found to grow 1
+found to perform 1
+found to point 1
+found to touch 1
+found tw order 1
+found unaccept 1
+found under grant 5
+found us 1
+found us docum 1
+found weaker 1
+found weaker condit 1
+found which mak 1
+found widespread 1
+found widespread appl 1
+found without inver 1
+four 6
+four grenobl 1
+four motzkin 1
+four motzkin algorithm 1
+four motzkin au 1
+four motzkin dan 1
+four motzkin doit 1
+four motzkin el 1
+four motzkin elim 1
+four motzkin le 1
+four motzkin ne 1
+four motzkin nont 1
+four motzkin param 1
+four motzkin pour 1
+four motzkin pouvait 1
+four motzkin pr 1
+four motzkin qu 1
+four motzkin sur 1
+four motzkin tel 1
+four rap 1
+four transform 3
+four window 1
+four. 1
+fouriermotzkin 1
+fouriermotzkin don 1
+fouriermotzkin don de 1
+fouriermotzkin pour 1
+fouriermotzkin pour parcourir 1
+fourm 1
+fourn 5
+fourn a lutilisateur 1
+fourn ain 1
+fourn com 1
+fourn com param 1
+fourn dan 1
+fourn dan le 1
+fourn de 1
+fourn de amer 1
+fourn la 1
+fourn la ba 1
+fourn le 1
+fourn le pa 1
+fourn le point 1
+fourn par 2
+fourn par dr 1
+fourn par eclip 1
+fourn par le 2
+fourn par war 1
+fourn quelqu 1
+fourn quelqu el 1
+fourn toujour 1
+fourn un 1
+fourn un autr 1
+fourn un bon 1
+fourn un interfac 1
+fournir 3
+fournir au 1
+fournir au compilateur 1
+fournir au niveau 1
+fournir aux 1
+fournir aux processeur 1
+fournir de 3
+fournir de condit 1
+fournir de mesur 1
+fournir de program 1
+fournir deux 1
+fournir deux famil 1
+fournir du 1
+fournir du travail 1
+fournir en 1
+fournir en vu 1
+fournir pour 1
+fournir pour acqu 1
+fournir tout 1
+fournir tout le 1
+fournir un 1
+fournir un opt 1
+fournisson 2
+fournisson au 1
+fournisson au chapitr 1
+fournisson un 1
+fournisson un descript 1
+fournit 4
+fournit aus 1
+fournit aus un 1
+fournit automatiqu 1
+fournit automatiqu un 1
+fournit de 1
+fournit de born 1
+fournit de el 1
+fournit donc 1
+fournit donc de 1
+fournit le 2
+fournit le born 1
+fournit le moy 1
+fournit le nouvel 1
+fournit le temp 1
+fournit pa 2
+fournit pa dan 1
+fournit pa la 1
+fournit qu 1
+fournit qu de 1
+fournit quun 1
+fournit quun temp 1
+fournit un 4
+fournit un autr 1
+fournit un ba 1
+fournit un bon 1
+fournit un cadr 1
+fournit un condit 1
+fournit un exempl 1
+fournit un form 1
+fournit un inform 1
+fournit un solut 1
+fourth 29
+fourth algorithm 1
+fourth and fifth 1
+fourth annu 2
+fourth annu acm 1
+fourth annu ie 1
+fourth aspect 1
+fourth aspect deal 1
+fourth bind 1
+fourth block 1
+fourth canad 1
+fourth canad comput 1
+fourth compon 1
+fourth computer 1
+fourth design 1
+fourth design autom 1
+fourth edit 1
+fourth group 1
+fourth intern 9
+fourth intern log 1
+fourth intern workshop 4
+fourth observ 1
+fourth observ demonstr 1
+fourth observ regard 1
+fourth parameter 1
+fourth portugu 1
+fourth program 1
+fourth program claus 1
+fourth proper 1
+fourth proper elimin 1
+fourth rev 1
+fourth se 1
+fourth step 1
+fourth to proc 1
+fourth worker 1
+fourth workshop 1
+fourth year 1
+fourth year undergradu 1
+fout 1
+foutg 1
+fox 4
+fox jump 1
+foxj 1
+foxj ump 1
+foxtrot 1
+fp 10
+fp denot 1
+fp ff 1
+fp int 1
+fp int fortran 1
+fp int scientif 1
+fp ld 1
+fp ld st 1
+fp quantum 1
+fp quantum natom 1
+fp register 1
+fp0 1
+fp1 2
+fpg 2
+fpg ba 1
+fpg ba atm 1
+fpg ba siml 1
+fpig 1
+fpng 1
+fpng and ftng 1
+fpng denot 1
+fpng satisf 1
+fpng th mop 1
+fpour 2
+fpour chaqu 1
+fpour chaqu bloc 1
+fpour fin 1
+fpour pour 1
+fpour qi 1
+fpour qi fic 1
+fprev 1
+fprintf 1
+fpu 2
+fpu status 1
+fpu status flag 1
+fpumwactrailtvmbus 1
+fpumwactrailtvmbus dbus 1
+fpumwactrailtvmbus dbus cbus 1
+fpv1 1
+fq0 1
+fqg 1
+fqg gp 1
+fqig 1
+fr 68
+fr 1.5b 1
+fr acc 1
+fr algorithm 1
+fr and ea 1
+fr and versatil 1
+fr approxim 1
+fr approxim algorithm 1
+fr assign 1
+fr at empt 1
+fr bellman 1
+fr bellman ford 1
+fr boolean 1
+fr boolean algebr 1
+fr ch 1
+fr ch expect 1
+fr ch sen 1
+fr child 1
+fr chunk 1
+fr chunk counter 1
+fr chunk loc 1
+fr color 1
+fr comput 1
+fr conjunct 1
+fr connect 1
+fr construc 1
+fr cr 1
+fr de 1
+fr de ceux 1
+fr deriv 1
+fr dnf 1
+fr dnf forml 1
+fr dur 1
+fr dur lec 1
+fr dynam 1
+fr dynam log 1
+fr equ 3
+fr equ dapparit 1
+fr equ de 3
+fr equ dinterv 1
+fr equ elev 1
+fr equ rel 1
+fr equ suffisem 1
+fr equem 1
+fr equem acc 1
+fr equem ignor 1
+fr equent 2
+fr equent dinstruc 1
+fr equent en 1
+fr equent qu 1
+fr et le 1
+fr execut 1
+fr fact 1
+fr form 3
+fr form composit 1
+fr form curv 1
+fr form output 1
+fr form surfac 1
+fr forml 3
+fr forml correspon 1
+fr from funct 1
+fr from variabl 1
+fr funct 1
+fr gener 1
+fr grammar 2
+fr graph 1
+fr identif 1
+fr incorpor 1
+fr input 1
+fr la 1
+fr la requ 1
+fr list 1
+fr log 1
+fr me 1
+fr me rout 1
+fr mic 1
+fr mon 2
+fr mult 1
+fr mult head 1
+fr multicast 1
+fr multicast implem 1
+fr multicast wormhol 1
+fr ne 1
+fr ne subir 1
+fr ne var 1
+fr nod 1
+fr nod ec 1
+fr object 1
+fr object reduc 1
+fr of built 1
+fr of pitf 1
+fr of ss 1
+fr or quantif 1
+fr ou 1
+fr ou conflictuel 1
+fr parameter 4
+fr ph 1
+fr prior 1
+fr prior queu 1
+fr qu 1
+fr qu cel 1
+fr qu est 1
+fr reg 1
+fr repl 1
+fr rout 2
+fr run 1
+fr schneider 1
+fr sect 1
+fr shar 1
+fr shar memor 1
+fr slot 1
+fr softwar 2
+fr softwar found 1
+fr spac 2
+fr spac count 1
+fr spac log 1
+fr subsystem 1
+fr subtyp 1
+fr switch 1
+fr syntac 1
+fr term 1
+fr term var 1
+fr text 2
+fr text answer 1
+fr th interfac 1
+fr th link 1
+fr th shar 1
+fr th substr 1
+fr to ch 1
+fr to continu 1
+fr to reach 1
+fr to select 1
+fr to us 1
+fr typ 2
+fr typ check 1
+fr typ var 1
+fr uhwirth 2
+fr up spac 1
+fr up st 1
+fr us 1
+fr uwirth 1
+fr var 1
+fr variabl 6
+fr variabl fx1 1
+fr variabl inst 1
+fr variabl x1 1
+fr vibr 1
+fr.berrendorf 1
+fr0 2
+fr1 2
+fr87 1
+fr89 1
+fr91 1
+fr95 1
+fract 23
+fract and elit 1
+fract cod 1
+fract cod algorithm 1
+fract cod len 1
+fract compr 1
+fract compr imag 1
+fract de 1
+fract de variabl 1
+fract dim 1
+fract fact 1
+fract fact design 1
+fract fish 1
+fract fish method 1
+fract for secon 1
+fract imag 1
+fract imag compr 1
+fract of accept 1
+fract of block 1
+fract of mac 1
+fract of me 2
+fract of nearest 1
+fract of pattern 1
+fract of satisf 1
+fract of tot 1
+fract pack 1
+fract part 1
+fract part repr 1
+fract ri 1
+fract wer optim 1
+fragil 1
+fragm 16
+fragm absorb 1
+fragm and sen 1
+fragm and therefor 1
+fragm ar absorb 1
+fragm ar act 1
+fragm ar merg 1
+fragm at level 1
+fragm behav 1
+fragm can rec 1
+fragm cannot exceed 1
+fragm cf 1
+fragm chang 1
+fragm comb 1
+fragm contain 1
+fragm cop 1
+fragm cop character 1
+fragm dep 1
+fragm determin 1
+fragm distinct 1
+fragm edit 1
+fragm f becom 1
+fragm f reach 1
+fragm f1 1
+fragm fenc 1
+fragm fi 1
+fragm fm 1
+fragm for multipl 1
+fragm glob 1
+fragm grow 1
+fragm hav found 1
+fragm hav reach 1
+fragm hav siz 1
+fragm ident 1
+fragm ident differ 1
+fragm in figur 2
+fragm init 1
+fragm int atom 1
+fragm is determin 1
+fragm is form 1
+fragm is found 1
+fragm is reduc 1
+fragm join 1
+fragm know 1
+fragm list 1
+fragm object 1
+fragm object record 1
+fragm of abstract 1
+fragm of intuit 1
+fragm of lin 1
+fragm of rel 1
+fragm of siz 1
+fragm of tempor 1
+fragm pair 1
+fragm reach 1
+fragm remain 1
+fragm root 1
+fragm schem 1
+fragm search 1
+fragm shown 1
+fragm siz 1
+fragm siz becom 1
+fragm siz reach 1
+fragm to reach 1
+fragm to upd 1
+fragm vi upd 1
+fragm wh root 1
+fragm which contain 1
+fragm which span 1
+fragm wil becom 1
+fragm wil determin 1
+fragm with emin 1
+fragm with level 1
+fragmentdefinit 1
+fragu 1
+fragu di.ucm.es 1
+frak 2
+fram 20
+fram act 1
+fram addr 1
+fram addr proc 1
+fram alloc 1
+fram and assum 1
+fram and point 1
+fram approach 1
+fram approach simil 1
+fram ar extrem 1
+fram ar se 1
+fram at tim 1
+fram ba 3
+fram ba fair 1
+fram ba form 1
+fram ba langu 1
+fram ba scheduler 1
+fram by using 1
+fram chang 1
+fram cr 1
+fram cr point 1
+fram cur 1
+fram each connect 1
+fram for procedur 1
+fram for prolog 1
+fram in ffq 1
+fram in progr 1
+fram ind 1
+fram ind bt 1
+fram ind field 1
+fram ind keep 1
+fram ind ts 1
+fram is decrem 1
+fram is perform 1
+fram is upd 1
+fram mechan 1
+fram number 1
+fram number multipl 1
+fram of fic 1
+fram of refer 1
+fram period 1
+fram problem 3
+fram reus 1
+fram siz 1
+fram strateg 1
+fram structur 2
+fram structur inform 1
+fram to keep 1
+fram upd 1
+fram upd mechan 1
+fram upd occur 1
+fram wil allow 1
+fram wil occur 1
+fram work 1
+frameb 2
+frameb conceptu 1
+frameb conceptu hierarch 1
+frameb fair 1
+frameb fair queu 1
+framecr 1
+framecr point 1
+framein 1
+framein buffer 1
+framein buffer fileid 1
+framework 51
+framework al addr 1
+framework al giv 1
+framework allow 2
+framework allow specif 1
+framework alread ec 1
+framework and giv 1
+framework and system 1
+framework ar disc 1
+framework ba 1
+framework can prov 1
+framework captur 1
+framework captur rol 1
+framework claim 1
+framework con 1
+framework custom 1
+framework custom con 1
+framework defin 1
+framework encomp 1
+framework for an 2
+framework for architectur 2
+framework for constraint 1
+framework for deal 1
+framework for describ 1
+framework for design 3
+framework for discr 1
+framework for dynam 2
+framework for exploit 1
+framework for investig 1
+framework for langu 1
+framework for light 1
+framework for load 1
+framework for microsoft 1
+framework for mlp 1
+framework for model 4
+framework for nonlin 1
+framework for object 1
+framework for parallel 1
+framework for rol 1
+framework for schem 2
+framework for shap 1
+framework for siml 1
+framework for solut 2
+framework for specif 1
+framework for step 1
+framework for stud 1
+framework for tempor 1
+framework for tot 1
+framework for treat 1
+framework for uncertaint 1
+framework for unif 1
+framework for upd 1
+framework for workload 1
+framework gener 1
+framework generaliz 1
+framework guid 2
+framework hold 1
+framework is appl 1
+framework is ba 1
+framework is cap 2
+framework is defin 1
+framework is develop 1
+framework is eventu 1
+framework is gener 2
+framework is illustr 2
+framework is pr 1
+framework is respon 1
+framework is syntact 1
+framework is thus 1
+framework len 1
+framework li 2
+framework observabl 1
+framework of design 1
+framework of funct 1
+framework of rat 1
+framework of situ 1
+framework of ts 1
+framework of uniform 1
+framework parameter 1
+framework parameter polymorph 1
+framework prov 1
+framework prov support 1
+framework ra 1
+framework rel 1
+framework requir 1
+framework siml 2
+framework spec 1
+framework tak 2
+framework that purport 1
+framework to compar 1
+framework to design 2
+framework to evalu 1
+framework to obtain 2
+framework to problem 1
+framework to prov 2
+framework to reason 1
+framework to ref 1
+framework to reflect 1
+framework to repr 2
+framework to rot 1
+framework to solut 1
+framework to spat 1
+framework transl 1
+framework using 2
+framework using part 1
+framework wh 1
+framework which consider 1
+framework which expr 1
+framework wil allow 1
+framework wil facilit 1
+framework wil lead 1
+framework with den 1
+framework work 2
+fran 2
+fran co 1
+fran co bodin 1
+fran franc 1
+franc 19
+franc bodin 1
+franc de 1
+franc de program 1
+franc et isr 1
+franc grenobl 1
+franc grenobl ii 1
+franc issn 1
+franc putzol 1
+franc t el 1
+franc te 1
+franc telecom 1
+franc telecom cnet 1
+franc xjodr 1
+francez 1
+franch 2
+franch comt 1
+francisc 16
+frank 11
+frank dehn 1
+frank dehn andr 1
+frank gradu 1
+frank jen 1
+frank muenneman 1
+frank rusk 1
+frank schmuck 1
+frankfurt 1
+franklin 2
+franklin and vasudh 1
+franklin et al 1
+franklin uc.edu 1
+franklin uc.edu url 1
+franklin vasu 1
+franklin vasu wuccrc.wustl.edu 1
+fransisc 1
+frant 1
+fraser 1
+fraun. 1
+fraunhofer 1
+fraunhofer institut 1
+fraz 1
+frazer 1
+frazer bennet 1
+fread 1
+frederick 3
+frederickson 1
+frederikson 1
+fredman 1
+fredman and r.e 1
+fredrickson 1
+fredrickson and jaj 1
+fredrik 3
+fredrik bajer 3
+fredrik bajer vej 3
+freed 3
+freed impl 1
+freedom 7
+freedom for minim 1
+freedom from deadlock 1
+freedom requir 1
+freedom to learn 1
+freedom to organ 1
+freedom to var 2
+freehand 1
+freehand using 1
+freeman 8
+freeman and compan 2
+freeman benson 1
+freest 1
+freetext 1
+freetext answer 1
+freetext answer an 1
+freetext answer.html 1
+freetext developerform.html 1
+freetext developerform2.html 1
+freetext inf.html 1
+freetext inf2.html 1
+freetext tempcrit.txt 1
+freez 4
+freez relev 1
+freez relev abstract 1
+freidlin 1
+freidlin wentzel 1
+freidlin wentzel de 1
+frein 1
+frein aux 1
+frein aux perform 1
+frein principaux 1
+frein principaux aux 1
+french 4
+french langu 1
+french langu ver 1
+french me 1
+french me catalog 1
+french quest.msf 1
+french quest.msf me 1
+french user 1
+french ver 1
+frensl61.bitnet 1
+freq 1
+freq j ai 1
+frequ 37
+frequ an 2
+frequ and mod 1
+frequ and or 1
+frequ and proxim 1
+frequ arithm 1
+frequ arithm instruc 1
+frequ as lat 1
+frequ cannot repr 1
+frequ chang 1
+frequ commun 1
+frequ comput 1
+frequ construc 1
+frequ cont 1
+frequ context 1
+frequ context switch 1
+frequ conver 1
+frequ count 1
+frequ denot 1
+frequ dict 1
+frequ domain 1
+frequ domain term 1
+frequ exam 1
+frequ execut 1
+frequ failur 1
+frequ failur detect 1
+frequ in parallel 1
+frequ inclus 1
+frequ mark 1
+frequ method 1
+frequ method invoc 1
+frequ no greater 1
+frequ observ 1
+frequ of chang 1
+frequ of occur 1
+frequ of perturb 1
+frequ of synchron 1
+frequ of upd 1
+frequ perform 1
+frequ perturb 1
+frequ perturb sign 1
+frequ rang 1
+frequ reus 1
+frequ satisf 1
+frequ solut 2
+frequ us 2
+frequ us algorithm 1
+frequ us item 1
+frequ user 1
+frequ word 1
+frequ word sequ 1
+fresh 5
+fresh look 1
+fresh of subsequ 1
+fresh on 1
+fresh reader 1
+fresh variabl 1
+freshman 1
+freshman and ph.d 1
+freud 1
+freud slip 1
+freuder 3
+freuder and wallac 1
+freund 1
+freytag 1
+freytag and michael 1
+freyung 1
+frg 5
+frg fac 1
+fricker 1
+friedeman 2
+friedeman mattern 1
+friedeman simon 1
+friedeman simon phon 1
+frieder 1
+friedman 2
+friedrich 1
+friedrich phon 1
+friendl 2
+friendl of tempor 1
+fring 1
+fring proper 1
+fritz 1
+fritz henglein 1
+frolund 1
+frolund and daniel 1
+fromand 1
+fromand to valu 1
+fromman 1
+fromman holzboog 1
+front 20
+front and rear 1
+front en 5
+front en mach 1
+front en nod 1
+front en proc 1
+front en specif 1
+front en tok 1
+front er entr 1
+front er est 1
+front implem 1
+front in log 1
+front lin 1
+front list 1
+front list adm 1
+front list correspon 1
+front list maintain 1
+front list support 1
+front of handwrit 1
+front of ma 1
+front oper 1
+front report 1
+front report oper 1
+front se 1
+front2b 1
+frontendnod 1
+frontendnod of cl 1
+froot 1
+froot nodeg 1
+frootg 1
+froz 4
+froz and mov 1
+froz and regard 1
+froz goal 1
+froz goal attach 1
+froz within structur 1
+fru 1
+fruchtenicht 1
+fruchtenicht h.w 1
+fructueus 1
+fructueus sur 1
+fructueux 1
+fructueux pour 1
+fructueux pour la 1
+fruehwirth 1
+fruewirth 1
+frug 1
+frug of oracl 1
+frug oracl 1
+frug oracl perform 1
+frug oracl test 1
+frug oracl ye 1
+frug us 1
+fruit 3
+fruit comparison 1
+fruit disc 1
+fruit quant 1
+frustr 3
+frustr 1.5c 1
+fry 1
+fs 11
+fs fpour 1
+fs fpour fin 1
+fs informatik.un 1
+fs informatik.un kiel.dbp.de 1
+fs is distribut 1
+fs j hg 1
+fs jusqu 1
+fs min 1
+fs ng 1
+fs ng orthogon 1
+fs opt 1
+fs opt au 1
+fs opt dan 1
+fs opt de 1
+fs opt dev 1
+fs opt est 1
+fs opt lim 1
+fs opt pp 1
+fs opt produ 1
+fs opt util 1
+fs result 1
+fs0 1
+fs1 4
+fs1 s2 1
+fs2 1
+fs6ts5 1
+fs6ts5 s10 1
+fsalaryg 1
+fsalaryg fnowg 1
+fsalesg 1
+fsclrg 1
+fsh 1
+fsign 1
+fsinon 1
+fsinon fs 1
+fsinon fs jusqu 1
+fsivaram 1
+fsm 1
+fsm is shown 1
+fsn 1
+fsn01 1
+fsn0i 1
+fsn0n 1
+fspec 1
+fspec and fcheck 1
+fspec mi 1
+fsspg 1
+fssrg 1
+fst 1
+fst cand 1
+fst cand denot 1
+fst cand le 1
+fst cand mod 1
+fst1 1
+fst2 1
+fsu 1
+fsu is defin 1
+fsu manipl 1
+fsu manipl graph 1
+fsu sem 1
+fsu1 1
+fsu12 1
+fsu13 1
+fsw.lim 1
+ft 6
+ft rjnr 1
+ft tf 1
+ft tf p2ft 1
+ft0 1
+ft1 1
+ft2 1
+ft2g 1
+ft3g 1
+ftc 2
+ftcpg 1
+ftcpg for transact 1
+ftg 1
+fth 2
+fth nam 1
+fth tr 1
+fth tr edg 1
+ftng 1
+ftng denot 1
+ftng satisf 1
+ftng th correspon 1
+ftng th mop 1
+ftoysg 1
+ftp 15
+ftp and tel 1
+ftp and telnet 1
+ftp at ftp.cs.umd.edu 1
+ftp at sit 1
+ftp connect 1
+ftp distribut 1
+ftp from cml.ric.edu 1
+ftp from duck.dfk.un 1
+ftp from ftp.comlab.ox.ac.uk 1
+ftp from ftp.cs.ualber.ca 1
+ftp protocol 1
+ftp server 1
+ftp sink 1
+ftp sit 2
+ftp sourc 1
+ftp telnet 1
+ftp telnet connect 1
+ftp to cs.sunysb.edu 1
+ftp.cc.northeastern.edu 1
+ftp.ci.upen.edu 1
+ftp.comlab.ox.ac.uk 1
+ftp.cs.chalmer.se 1
+ftp.cs.ualber.ca 1
+ftp.cs.umd.edu 1
+ftp.cs.umn.edu 1
+ftp.cs.umn.edu user 1
+ftp.cs.umn.edu user kumar 1
+ftp.cs.uq.edu.au 1
+ftp.ic.forth.gr 1
+ftp.tw.tudelft.nl 2
+ftp.uw.fi 1
+ftp.uw.fi direct 1
+ftp.uw.fi direct cs 1
+ftpsit 1
+ftrout 1
+fu 4
+fu chang 1
+fu cheng 1
+fu0 1
+fu1 1
+fuch 5
+fuch et al 1
+fuer 1
+fuer di 1
+fuer di int 1
+fug 2
+fug pick 1
+fuit 1
+fuit de 1
+fuiwig 1
+fuj90 1
+fujimot 2
+fujit 3
+fujitsu 2
+fujitsu anu 1
+fujitsu anu cap 1
+fujitsu ap1000 1
+fujitsu labor 2
+fujitsu labor lim 1
+fujitsu labor ltd 1
+fukunag 1
+fulbright 1
+fulbright com 1
+fulfil 6
+fulfil th condit 1
+fulfil th criter 1
+fulfil th siz 1
+fulfil th zer 1
+fulfilm 1
+fulfilm is reflect 1
+fuller 3
+fuller disc 2
+fuller techn 1
+fuller techn detail 1
+fuller transl 1
+fulltim 1
+fulltim and parttim 1
+fulltim or parttim 1
+fulltimeg 1
+fulltimeg vr 1
+fulltimeg vr fdepartmentl 1
+fun 2
+fun bound 1
+fun bound variabl 1
+fun left lem 1
+fun right lem 1
+fun subtyp 1
+fun typ 1
+funabik 1
+funabik et al 1
+funahash 1
+func. 1
+funct 106
+funct 2cn 1
+funct 2k 1
+funct 2k 2wn 1
+funct a determin 1
+funct a lin 1
+funct a requir 1
+funct a.7 1
+funct a.7 event 1
+funct abcl 1
+funct abcl r3schemeschem 1
+funct abstract 1
+funct accept 1
+funct accept rang 1
+funct act 1
+funct act exp 1
+funct act nod 1
+funct ad 1
+funct ad method 1
+funct ae 1
+funct ae perform 1
+funct affect 1
+funct alloc 1
+funct allow 1
+funct and amount 1
+funct and chang 1
+funct and cl 1
+funct and coh 1
+funct and comput 1
+funct and continu 1
+funct and correspon 1
+funct and default 1
+funct and detect 2
+funct and explain 1
+funct and expon 1
+funct and fpng 1
+funct and funct 2
+funct and knowledg 1
+funct and le 1
+funct and log 1
+funct and macr 1
+funct and method 2
+funct and object 1
+funct and oper 1
+funct and organ 1
+funct and perform 1
+funct and po 1
+funct and pr 2
+funct and privileg 1
+funct and procedur 2
+funct and reflect 1
+funct and rel 1
+funct and requir 1
+funct and specif 1
+funct and start 2
+funct and tel 1
+funct and tempor 1
+funct and tim 1
+funct and timel 1
+funct and univer 1
+funct and variabl 1
+funct ap 2
+funct ap return 1
+funct apart 1
+funct appl 4
+funct appl axiom 1
+funct appl succ 1
+funct approach 1
+funct appropr 1
+funct ar 2
+funct ar act 1
+funct ar appl 1
+funct ar assum 1
+funct ar avail 1
+funct ar consider 1
+funct ar dealt 1
+funct ar defin 1
+funct ar dynam 1
+funct ar evalu 1
+funct ar funct 1
+funct ar hid 1
+funct ar indirect 1
+funct ar label 1
+funct ar modif 1
+funct ar princip 1
+funct ar rel 1
+funct ar sign 1
+funct ar symmeter 1
+funct ar view 1
+funct architectur 1
+funct as addit 1
+funct as input 1
+funct as specif 1
+funct aspect 1
+funct assign 1
+funct assoc 3
+funct assum 2
+funct at currnod 1
+funct at tim 1
+funct ba 2
+funct ba deep 1
+funct being zer 1
+funct belong 1
+funct between pack 1
+funct bound 1
+funct but object 1
+funct by ad 2
+funct by gener 1
+funct ca 1
+funct cal 10
+funct cal deep 1
+funct cal el 1
+funct cal fast 1
+funct cal map 1
+funct cal overhead 1
+funct cal syntac 1
+funct caller 1
+funct caller block 1
+funct can occur 1
+funct cap 1
+funct character 1
+funct character figur 1
+funct cl 3
+funct cl inst 1
+funct cl slot 1
+funct closur 1
+funct cod 2
+funct commun 1
+funct compat 1
+funct compat supercl 1
+funct compon 1
+funct compon inst 1
+funct compon maintain 1
+funct compr 1
+funct comput 1
+funct comput discrimin 1
+funct comput inst 1
+funct comput prim 1
+funct comput slot 1
+funct conform 1
+funct construc 1
+funct construc oper 1
+funct contain 2
+funct contain approxim 1
+funct continu 1
+funct continu simpl 1
+funct control 1
+funct conver 1
+funct conver tak 1
+funct cop 1
+funct cop list 1
+funct cr 1
+funct d cover 1
+funct d transl 1
+funct da 1
+funct decl 1
+funct decomposit 2
+funct decomposit modl 1
+funct decompsit 1
+funct decompsit docum 1
+funct defin 9
+funct defin axiom 1
+funct defin earl 1
+funct definit 4
+funct definit appear 1
+funct definit def 1
+funct definit expr 1
+funct definit occur 1
+funct deletemin 1
+funct denot 1
+funct dep 1
+funct describ 1
+funct descript 3
+funct design 2
+funct determin 1
+funct dim 1
+funct discrimin 1
+funct discrimin funct 1
+funct dispatch 1
+funct dist 1
+funct distinct 1
+funct distribut 1
+funct dk 1
+funct dl 1
+funct domain 1
+funct domain gener 1
+funct el 1
+funct embod 1
+funct empl 1
+funct encapsl 1
+funct enforc 1
+funct ensur 3
+funct ensur by 1
+funct ensur slot 1
+funct eq 1
+funct equ 1
+funct equiv 1
+funct equiv server 1
+funct estim 1
+funct estim procc 1
+funct etc 1
+funct ev 1
+funct ev cal 1
+funct ev enqueu 1
+funct evalu 2
+funct evalu model 1
+funct evalu obtain 1
+funct event 1
+funct event format 1
+funct expr 2
+funct expr allow 1
+funct f appl 1
+funct f determin 1
+funct f ff1 1
+funct f map 1
+funct f qi 1
+funct f ss 1
+funct f1 1
+funct f11 1
+funct f2 1
+funct fault 1
+funct fault model 1
+funct fc 2
+funct fc defin 1
+funct fd 2
+funct fdf 1
+funct fdf ff 1
+funct ff 1
+funct fi 2
+funct fn 1
+funct follow 1
+funct for badg 1
+funct for construc 1
+funct for gt 1
+funct for method 1
+funct for rol 1
+funct for round 1
+funct for structur 1
+funct for sub 1
+funct for xj0 1
+funct for xk 1
+funct from reg 1
+funct from se 1
+funct from variabl 2
+funct fu0 1
+funct funct 1
+funct g method 1
+funct g obtain 1
+funct g simp 1
+funct g1 1
+funct gener 3
+funct gener funct 1
+funct gener method 1
+funct gf 1
+funct gf domain 1
+funct giv 1
+funct gj 1
+funct gj fj 1
+funct grad 1
+funct grad evalu 1
+funct h0 1
+funct ha strict 1
+funct handl 1
+funct handl unknown 1
+funct hav polynom 1
+funct he ch 1
+funct host 1
+funct hvdm 1
+funct id 1
+funct implem 2
+funct implem us 1
+funct in 1st 1
+funct in exampl 1
+funct in order 1
+funct in polynom 1
+funct in schem 1
+funct in sect 1
+funct in ss 1
+funct in t1 1
+funct in tabl 1
+funct in term 2
+funct inclus 3
+funct inclus expon 1
+funct inclus standard 1
+funct ind 1
+funct indep 1
+funct int ba 1
+funct int posit 1
+funct int smaller 1
+funct invoc 1
+funct is appropr 1
+funct is assoc 1
+funct is automat 1
+funct is cl 1
+funct is consider 1
+funct is construc 2
+funct is creat 1
+funct is defin 3
+funct is determin 2
+funct is disestabl 1
+funct is dual 1
+funct is encapsl 1
+funct is execut 1
+funct is forml 1
+funct is giv 1
+funct is known 1
+funct is lim 1
+funct is mint 1
+funct is monit 1
+funct is monot 1
+funct is multipl 1
+funct is np 1
+funct is posit 1
+funct is prepar 1
+funct is requir 1
+funct is trigger 1
+funct is upd 1
+funct it ch 1
+funct it us 1
+funct junior 1
+funct junior se 1
+funct knowledg 1
+funct known 1
+funct krestkk 1
+funct langu 9
+funct langu ba 1
+funct langu luc 1
+funct layout 1
+funct layout an 1
+funct lik fic 1
+funct lik tradit 1
+funct lin 1
+funct lin accord 1
+funct list 1
+funct list con 1
+funct lock 1
+funct lock nl 1
+funct log 1
+funct log langu 1
+funct log program 1
+funct lookup 1
+funct m transform 1
+funct mac 1
+funct mak 2
+funct mak us 1
+funct map 1
+funct map typ 1
+funct may dramat 1
+funct ment 1
+funct metaobject 1
+funct method 2
+funct method cl 1
+funct method gener 1
+funct method lookup 1
+funct methodscl 1
+funct methodscl funct 1
+funct methodscl pr 1
+funct mgu 1
+funct mgu introduc 1
+funct might solut 1
+funct min 1
+funct misplac 1
+funct misplac object 1
+funct modif 1
+funct modif lin 1
+funct mor complec 1
+funct mor extern 1
+funct most common 1
+funct must ad 1
+funct must satisf 1
+funct must therefor 1
+funct myproc 1
+funct nam 2
+funct nam format 1
+funct nam gf 1
+funct nam lambd 1
+funct nam loop 1
+funct nec 1
+funct nl 1
+funct nod 1
+funct nod mean 1
+funct not simp 1
+funct nxp 1
+funct nxp incr 1
+funct obj1 1
+funct oe 2
+funct of acquaint 1
+funct of bit 2
+funct of cl 1
+funct of connect 1
+funct of eulisp 1
+funct of funct 1
+funct of high 1
+funct of inform 1
+funct of input 2
+funct of key 1
+funct of mach 1
+funct of method 1
+funct of number 1
+funct of order 1
+funct of particl 1
+funct of proc 2
+funct of program 1
+funct of regl 1
+funct of se 1
+funct of ss 1
+funct of thread 1
+funct of tim 3
+funct of user 1
+funct of var 1
+funct of yacc 1
+funct on new 1
+funct on random 1
+funct optim 2
+funct or behavior 1
+funct or cl 1
+funct or individu 1
+funct or sign 1
+funct or specif 1
+funct or structur 1
+funct over object 1
+funct overload 1
+funct pa 1
+funct parameter 1
+funct partit 1
+funct partit us 1
+funct path 1
+funct pi 1
+funct pl 2
+funct pm 1
+funct po 1
+funct po dep 1
+funct point 1
+funct pointer 1
+funct pr 1
+funct prod 1
+funct program 10
+funct program build 1
+funct program def 1
+funct program held 1
+funct program langu 6
+funct program pract 1
+funct program program 1
+funct propag 1
+funct protect 1
+funct protect form 1
+funct prov 1
+funct prun 1
+funct prunedmerg 1
+funct prunedmerg proc 1
+funct q pnk 1
+funct r giv 1
+funct randx 1
+funct read 1
+funct recogn 1
+funct record 1
+funct record funct 1
+funct reduc 1
+funct reduc object 1
+funct refer 1
+funct register 1
+funct rel 3
+funct replac 1
+funct repr 1
+funct request 1
+funct request ship 1
+funct requir 4
+funct return 5
+funct return cent 1
+funct rev 1
+funct rev return 1
+funct rl 1
+funct rol 2
+funct run100 1
+funct satisf 3
+funct satisf return 1
+funct select 1
+funct shar 1
+funct ship 1
+funct ship recv 1
+funct ship sen 1
+funct shown 1
+funct sign 1
+funct sign continu 1
+funct sketch 1
+funct softwar 1
+funct spac 1
+funct specif 3
+funct spread 1
+funct superior 1
+funct superior se 1
+funct symbol 5
+funct symbol compl 1
+funct system 2
+funct system oper 1
+funct tak 4
+funct term 1
+funct test 1
+funct test suit 1
+funct th handler 1
+funct th nearest 1
+funct th object 1
+funct that acc 1
+funct that incr 1
+funct that mim 1
+funct that perform 1
+funct that specif 1
+funct that tel 1
+funct thereb 1
+funct thread 1
+funct thread start 1
+funct through prun 1
+funct to acc 1
+funct to ap 1
+funct to correct 1
+funct to correspon 1
+funct to en 1
+funct to ge 1
+funct to gener 1
+funct to impl 1
+funct to inclus 1
+funct to init 2
+funct to input 1
+funct to maintain 1
+funct to mak 1
+funct to read 1
+funct to repr 2
+funct to search 1
+funct to upd 1
+funct to util 1
+funct to writ 1
+funct tool 1
+funct tp 1
+funct traver 1
+funct tupl 1
+funct typ 3
+funct typ list 1
+funct typ specif 1
+funct u differ 1
+funct u0 1
+funct u1 1
+funct uk 1
+funct unit 2
+funct upd 1
+funct us 1
+funct user 1
+funct user group 1
+funct using 3
+funct using loworder 1
+funct valu 2
+funct var 1
+funct var eleg 1
+funct verif 1
+funct vi part 1
+funct w deal 1
+funct w determin 1
+funct w maintain 1
+funct wa creat 1
+funct wa defin 1
+funct wa prop 1
+funct wait 1
+funct we def 1
+funct wh appl 1
+funct wh definit 1
+funct wh rat 1
+funct which determin 2
+funct which follow 1
+funct which map 1
+funct which return 1
+funct which seem 1
+funct which sum 1
+funct which tak 1
+funct which test 1
+funct with appl 1
+funct with lin 1
+funct with parameter 1
+funct with rel 1
+funct with respect 1
+funct with rl 1
+funct with subtyp 1
+funct wn 1
+funct word 1
+funct would incr 1
+funct would ind 1
+funct would look 1
+funct writ 1
+funct ws 1
+funct yield 1
+funct3 1
+functeur 1
+functionsmethod 1
+fund 15
+fund by epsrc 1
+fund from empr 1
+fund from ibm 1
+fund in part 3
+fund me 1
+fund under contract 1
+fundam 32
+fundam abstract 2
+fundam abstract infer 1
+fundam anatom 1
+fundam anatom knowledg 1
+fundam constraint 1
+fundam cycl 1
+fundam cycl algorithm 1
+fundam cycl find 1
+fundam cycl length 1
+fundam cycl se 1
+fundam dat 1
+fundam dat structur 1
+fundam datatyp 1
+fundam ent 1
+fundam featur 2
+fundam featur se 1
+fundam geometer 1
+fundam geometer dat 1
+fundam id 1
+fundam inadequ 1
+fundam inadequ system 1
+fundam issu 3
+fundam issu ar 1
+fundam level 1
+fundam matr 1
+fundam me 1
+fundam me theor 1
+fundam metatheor 1
+fundam method 1
+fundam np 1
+fundam np compl 1
+fundam of datab 1
+fundam of digit 1
+fundam of layer 1
+fundam of spat 1
+fundam parameter 1
+fundam principl 1
+fundam problem 2
+fundam quest 2
+fundam se 1
+fundam speak 1
+fundam techniqu 1
+fundam to genvoc 1
+fundamentalcycl 1
+fundamentalcycl giv 1
+fundef 1
+fur 4
+fur honsel 1
+fur informatik 2
+fur montr 1
+fur montr sur 1
+fur. 1
+furent 1
+furent fructueus 1
+furent fructueus sur 1
+furn 1
+furn introduc 1
+furn86 1
+furnitur 1
+furnitur layout 1
+further 85
+further adv 2
+further algorithm 1
+further an 3
+further and giv 1
+further apart 1
+further appear 1
+further appl 1
+further argum 1
+further assum 1
+further attempt 1
+further attent 1
+further bisect 1
+further but order 1
+further by click 1
+further by introduc 1
+further cl 1
+further classif 1
+further classif regl 1
+further click 1
+further clu 1
+further com 1
+further commitm 1
+further compil 1
+further comput 1
+further consider 1
+further constraint 1
+further constraint inclus 1
+further decr 1
+further detail 7
+further developm 2
+further differ 1
+further disc 2
+further div 1
+further div st 1
+further divid 1
+further empir 2
+further empir inquir 1
+further empir investig 1
+further empir stud 1
+further enh 1
+further evalu 3
+further evalu inclus 1
+further evid 1
+further exampl 1
+further execut 1
+further exp 1
+further expan 1
+further experim 2
+further explain 1
+further explor 1
+further featur 1
+further gener 1
+further high 1
+further high level 1
+further illustr 1
+further impl 1
+further improv 7
+further improv perform 1
+further improv using 1
+further incon 1
+further incon valu 1
+further insight 1
+further int paragraph 1
+further interm 1
+further interm variabl 1
+further investig 4
+further investig point 1
+further issu 1
+further keyword 1
+further learn 1
+further me 1
+further ment 1
+further modif 2
+further nec 1
+further nec be 1
+further not 1
+further of knowledg 1
+further opt 1
+further optim 4
+further optim approach 1
+further optim con 1
+further pack 1
+further partit 2
+further perspectiv 1
+further po 1
+further popl 1
+further post 1
+further post proc 1
+further preproc 1
+further preproc repr 1
+further problem 1
+further proc 2
+further proper 1
+further pursu 1
+further quest 1
+further random 1
+further recov 1
+further reduc 1
+further ref 1
+further refer 1
+further refin 6
+further refin step 1
+further rel 1
+further rel ca 1
+further research 7
+further research continu 1
+further restrict 3
+further restrict number 1
+further result 1
+further rol 1
+further rollback 1
+further scal 1
+further scal lead 1
+further scal using 1
+further search 1
+further sect 1
+further short 1
+further shown 1
+further simpl 1
+further simplif 4
+further specif 1
+further st 2
+further st chang 1
+further st modif 1
+further step 2
+further str 1
+further structur 1
+further stud 1
+further sub 1
+further sub modl 1
+further subdiv 2
+further such deriv 1
+further support 1
+further support ba 1
+further test 1
+further th point 1
+further th tr 1
+further than log 1
+further ti 1
+further tim 1
+further to proc 1
+further transl 1
+further traver 1
+further uncoar 1
+further und 1
+further und recov 1
+further upd 1
+further us 2
+further using 1
+further using graph 1
+further val 1
+further val result 1
+further vot 1
+further we examin 1
+further work 5
+further writ 1
+furthermor 56
+furthermor 9a 1
+furthermor 9a 8d 1
+furthermor 9e 1
+furthermor 9e 8d 1
+furthermor a cal 1
+furthermor allow 1
+furthermor denot 1
+furthermor it requir 1
+furthermor it specif 1
+furthermor th aver 1
+furthermor th valu 1
+furthermor we describ 1
+furthest 1
+furukaw 1
+fus 6
+fus and shap 1
+fus ce 1
+fus ce deux 1
+fus de 2
+fus de boucl 1
+fus de deux 1
+fus de diff 1
+fus de linstruc 1
+fus de point 1
+fus dun 1
+fus dun point 1
+fus e avec 1
+fus ee 1
+fus ee avec 1
+fus ee en 1
+fus es 1
+fus es pour 1
+fus es si 1
+fus est 1
+fus est montr 1
+fus point 1
+fus point de 1
+fus propag 1
+fus soit 1
+fus soit fait 1
+fus sont 1
+fus sont ain 1
+fuseau 1
+fuseau d efin 1
+fuseaux 1
+fuseaux potentiel 1
+fusionner 2
+fusionner ce 1
+fusionner ce tr 1
+fusionner l instruc 1
+fusionner le 1
+fusionner le boucl 1
+fusionner le deux 1
+fusionner tout 1
+fusionner tout ce 1
+fut 3
+fut beaucoup 1
+fut init 1
+fut init prop 1
+fut introduit 1
+fut introduit par 1
+fut r esolu 1
+fut un 1
+fut un pr 1
+fut71 1
+futamur 1
+futamur project 1
+futher 1
+futher issu 1
+futur 63
+futur a proc 2
+futur act 1
+futur act sequ 1
+futur act subsequ 1
+futur and touch 1
+futur and understand 1
+futur appl 1
+futur avant 1
+futur avant de 1
+futur ba 1
+futur ba me 1
+futur ch 1
+futur ch par 1
+futur challeng 1
+futur channel 2
+futur channel width 2
+futur cluster 2
+futur cluster siz 2
+futur correct 1
+futur dat 1
+futur developm 1
+futur direct 4
+futur du 2
+futur du compilateur 1
+futur du syst 1
+futur event 2
+futur evolut 2
+futur ext 3
+futur for system 1
+futur further 1
+futur ge 1
+futur ge oper 1
+futur gener 5
+futur gener computer 3
+futur high perform 1
+futur high speed 1
+futur intersect 1
+futur introduc 1
+futur introduc inaccur 1
+futur investig 1
+futur kb.1 1
+futur langu 1
+futur larg vi 1
+futur larg visu 1
+futur learn 1
+futur mach 2
+futur me 1
+futur modif 2
+futur modif en 1
+futur network 1
+futur network pool 1
+futur of distribut 1
+futur oper 1
+futur oper dep 1
+futur paper 1
+futur parallel 1
+futur parallel architectur 1
+futur payoff 1
+futur perform 1
+futur permut 1
+futur plan 1
+futur point 1
+futur pr 1
+futur proc 1
+futur produc 1
+futur program 1
+futur refer 1
+futur research 10
+futur research ar 1
+futur research direct 2
+futur research en 1
+futur self 1
+futur self modif 1
+futur st 2
+futur step 1
+futur stud 1
+futur stud aim 1
+futur system 4
+futur system developm 1
+futur technolog 2
+futur tim 1
+futur tim pressur 1
+futur tren 2
+futur upd 1
+futur user 1
+futur valu 1
+futur ver 3
+futur wil fit 2
+futur work 23
+futur work inclus 1
+futur would allow 2
+futur year 1
+futureg 1
+fuv 1
+fuw 1
+fuzz 5
+fuzz answer 1
+fuzz cub 1
+fuzz dec 1
+fuzz dec bound 1
+fuzz dec cub 1
+fuzz dec squar 1
+fuzz input 1
+fuzz log 2
+fuzz log ba 1
+fuzz model 1
+fuzz of cl 1
+fuzz of loc 1
+fuzz point 1
+fuzz system 1
+fuzz term 1
+fv 4
+fv 2v 1
+fv0 1
+fv1 3
+fv1 t1 1
+fv2 1
+fvivj 1
+fvj 1
+fvj iesd.auc.dk 1
+fvn 1
+fvv0 1
+fw 4
+fw 0fw 1
+fw 0fw 1fw 1
+fw and bw 1
+fw ar defin 1
+fw comput 1
+fw comput commun 1
+fw help 1
+fw ing0 1
+fw is ch 1
+fw22 1
+fw22 wp.html 1
+fw86 1
+fwmb 1
+fwooyoung 1
+fwooyoung j aghag 1
+fx 24
+fx ag 1
+fx and gx 1
+fx ax 1
+fx ax bg 1
+fx bg 1
+fx co 1
+fx co de 1
+fx e xdx 1
+fx est 1
+fx falseg 1
+fx fgt 1
+fx fonct 1
+fx fonct de 1
+fx g 2s 1
+fx gx 1
+fx j xy 1
+fx j xy1 1
+fx numberg 1
+fx suc 1
+fx trueg 1
+fx x0g 1
+fx00 1
+fx00 1g 1
+fx1 8
+fx1g 1
+fx1g faggrf 1
+fx1g fx2g 1
+fx1g fx2g ftg 1
+fx1u 1
+fx1x2 1
+fx21 1
+fx2g 2
+fx2g ftg 1
+fx3g 1
+fx3g equ 1
+fx6 1
+fxg 1
+fxig 3
+fxj 1
+fxj0 1
+fxjg 2
+fxjg equ 1
+fxjx 1
+fxjx pi 1
+fxm1 1
+fy 7
+fy 1g 1
+fy j xy 1
+fy x00g 1
+fy x2g 1
+fy1 3
+fyg 2
+fyj 1
+fyr 1
+fz 2
+fz j xz 1
+fz x000g 1
+fz1 1
+fzt 1
+fzt mzg1 1
+g.b 1
+g.c 1
+g.c.sih 1
+g.c.sih and e.a 1
+g.e 1
+g.f 4
+g.florin 1
+g.florin et s.natkin 1
+g.h 2
+g.l 3
+g.m 2
+g.w 1
+g.we 1
+g.we observ 1
+g0 15
+g0 and direct 1
+g0 and t0 1
+g0 appl 1
+g0 ar assign 1
+g0 ax0 1
+g0 by going 1
+g0 can ext 1
+g0 connect 1
+g0 contain 1
+g0 correspon 1
+g0 d v0 1
+g0 ext 1
+g0 ext gg 1
+g0 form 1
+g0 g00 1
+g0 g1 1
+g0 g2 1
+g0 g3 1
+g0 gi 1
+g0 ha equ 1
+g0 ha non 1
+g0 hav ident 1
+g0 init0 1
+g0 init0 rest0 1
+g0 is connect 1
+g0 is consider 1
+g0 is hand 1
+g0 is select 1
+g0 is transform 1
+g0 on connect 1
+g0 requir 1
+g0 signif 1
+g0 st 1
+g0 st upd 1
+g0 that biconnect 1
+g0 to biconnect 1
+g0 to bridg 1
+g0 to form 1
+g0 using 1
+g0 with edg 1
+g00 2
+g00 and 8i 1
+g00 mediumw 1
+g00 mediumw eak 1
+g000 1
+g01 1
+g01 b1 1
+g02 1
+g02 b2 1
+g02 g3 1
+g0d 1
+g0i 1
+g0k 1
+g1 18
+g1 1xh 1
+g1 and g2 1
+g1 et g2 1
+g1 f fdg1 1
+g1 f12f13f14 1
+g1 for narrow 1
+g1 g2 3
+g1 g2 g3 1
+g1 graph 1
+g1 graph g2 1
+g1 init0 1
+g1 init0 rest0 1
+g1 is match 1
+g1 is replac 1
+g1 produc 1
+g1 x1 1
+g1 xi 1
+g1 xn 1
+g10t 1
+g12 1
+g125.17 1
+g125.17 g125.18 1
+g125.17 g125.18 g250.15 1
+g125.18 1
+g125.18 g250.15 1
+g125.18 g250.15 g250.29 1
+g12t 1
+g13 1
+g14 1
+g17t 1
+g1g2 1
+g1i 1
+g1i f1i 1
+g1k 1
+g1n 1
+g2 13
+g2 ayant 1
+g2 be goal 1
+g2 f21f24f25 1
+g2 g3 1
+g2 init0 1
+g2 init0 init1 1
+g2 is hamilt 1
+g2 is remov 1
+g2 s fx 1
+g2 wh ver 1
+g2 xi 1
+g250.15 1
+g250.15 dnr 1
+g250.15 dnr g250.29 1
+g250.15 g250.29 1
+g250.15 g250.29 ii32b3 1
+g250.29 1
+g250.29 dnr 1
+g250.29 dnr ii32b3 1
+g250.29 ii32b3 1
+g2k 1
+g2n 1
+g2rl 1
+g2rl g1 1
+g3 5
+g3 et g4 1
+g3 g2 1
+g3 init0 1
+g3 init0 init1 1
+g38652 1
+g38652 and gr 1
+g4 1
+g4 don 1
+g4 don es 1
+g4t 1
+g57864 1
+ga 10
+ga a labor 1
+ga an eff 1
+ga and sa 1
+ga and siml 1
+ga appl 1
+ga ar nec 1
+ga ar stochast 1
+ga control 1
+ga control parameter 1
+ga design 1
+ga experim 1
+ga is depict 1
+ga is subject 1
+ga laur 1
+ga parameter 1
+ga perform 1
+ga pipel 1
+ga pipel oper 1
+ga popl 1
+ga popl becom 1
+ga produc 1
+ga qu 1
+ga qu est 1
+ga run 1
+ga sa 1
+ga sa error 1
+ga search 1
+ga start 1
+ga wa appl 1
+ga wa ea 1
+ga wa optim 1
+ga wh domain 1
+ga when crossover 1
+ga with crossover 1
+ga with rx 1
+ga without crossover 1
+ga2atom 1
+ga79 1
+ga95 1
+gab 3
+gab and h.j 1
+gab87 1
+gabar 1
+gabbriel 1
+gabor 2
+gabor filer 1
+gabor filter 2
+gabor filter bank 1
+gabow 1
+gabriel 3
+gac 1
+gad 1
+gafn 1
+gagliard 1
+gagn 2
+gagn de 1
+gagn de la 1
+gagn un 1
+gagn un cel 1
+gail 2
+gain 30
+gain a snapshot 1
+gain ar found 1
+gain by mov 1
+gain by part 1
+gain confid 2
+gain de 1
+gain dun 1
+gain dun cel 1
+gain eff 1
+gain en 2
+gain en espac 1
+gain en perform 1
+gain en tail 1
+gain en temp 2
+gain equ 1
+gain exclus 1
+gain exclus acc 1
+gain execut 1
+gain execut eff 1
+gain from actu 1
+gain from specl 1
+gain from stat 1
+gain if user 1
+gain in softwar 1
+gain insight 2
+gain is water 1
+gain mor intuit 1
+gain moy 1
+gain moy sur 1
+gain obtain 1
+gain of mov 1
+gain over pur 1
+gain over sc 1
+gain par 1
+gain par rapport 1
+gain sont 1
+gain sont bien 1
+gain th benefit 1
+gain th floor 1
+gain that preserv 1
+gain through decomposit 1
+gain through glob 1
+gain through interact 1
+gain to practitioner 1
+gain using 1
+gain valu 1
+gain whil work 1
+gainesvil 3
+gajsk 1
+gal 6
+gal connect 1
+gal en 1
+gal inser 1
+gal inser hff 1
+gal int 1
+gal int re 1
+gal le 1
+gal le probl 1
+gal tr 1
+gal tr util 1
+gal un point 1
+gal90 1
+galatsan 1
+galbiat 1
+gald 1
+galil 1
+gallager 2
+gallivan 1
+gallon 2
+gallon dr 1
+galt 2
+gam 7
+gam cal empir 1
+gam datab 1
+gam datab mach 1
+gam involut 1
+gam model 1
+gam of lif 1
+gam pl 1
+gam start 1
+gamut 1
+gamut rang 1
+ganl 1
+ganl and cohoon 1
+gannon 1
+gant 1
+gant chart 1
+ganz 1
+gap 16
+gap and no 1
+gap ar identif 1
+gap between cod 1
+gap between decl 1
+gap between funct 1
+gap between loc 1
+gap between microproc 1
+gap between sourc 1
+gap between theor 1
+gap in dim 1
+gap requir 1
+gap requir combin 1
+gap result 1
+gap theorem 1
+gar 14
+gar ain 1
+gar ain qu 1
+gar and johnson 1
+gar dextensibilit 1
+gar johnst 1
+gar la 1
+gar la convexit 1
+gar lab 1
+gar lab dit 1
+gar pru 1
+gar quel 1
+gar quel ne 1
+gar swart 1
+gar82 1
+garantir 3
+garantir la 1
+garantir la form 1
+garantir laffinit 1
+garantir qu 1
+garantir qu lattribut 1
+garantir qu le 1
+garantir quaucun 1
+garantir quaucun term 1
+garantir quil 1
+garantir un 2
+garantir un acc 1
+garantir un bon 1
+garantir un certain 1
+garantir un fr 1
+garantit 3
+garantit laffinit 1
+garantit pa 1
+garantit pa lab 1
+garantit qu 2
+garantit qu la 1
+garantit qu le 1
+garantit un fa 1
+garb 9
+garb act 1
+garb as digit 1
+garb collect 7
+garb collect bit 1
+garb collect schem 1
+garb collect sweep 1
+garb collect tim 1
+garb collect using 1
+garb cut 1
+garb from digit 1
+garb nod 1
+garb nod method 1
+garb nod techniqu 1
+garb nod test 1
+garb pandemon 1
+garb pandemon train 1
+garb pattern 1
+garb pattern appear 1
+garb system 1
+garber 1
+garbow 1
+garbow and hillstrom 1
+garbow and k.e 1
+garc 5
+garc av 1
+garc lun 1
+garc lun acev 1
+garc molin 4
+gard 4
+gard aux 1
+gard aux but 1
+gard ce 1
+gard ce context 1
+gard com 1
+gard com fa 1
+gard con 1
+gard con en 1
+gard d epen 1
+gard de 1
+gard de claus 1
+gard de la 1
+gard ee 2
+gard ee dan 1
+gard ee en 1
+gard ee pour 1
+gard explicit 1
+gard explicit la 1
+gard inclu 1
+gard inclu de 1
+gard la 2
+gard la possibilit 1
+gard la trac 1
+gard ladr 1
+gard ladr du 1
+gard le 1
+gard le not 1
+gard nest 1
+gard nest pa 1
+gard op 1
+gard op erateur 1
+gard peuv 1
+gard peuv aus 1
+gard sont 1
+gard sont typiqu 1
+gard tot 1
+gard tot typ 1
+gard un 1
+gard un aspect 1
+gard un repr 1
+gardarin 1
+gardenfor 1
+gardenfor makinson 1
+garder 3
+garder a lesprit 1
+garder ce 1
+garder ce context 1
+garder dan 1
+garder dan de 1
+garder dan le 1
+garder en 2
+garder l dan 1
+garder la 1
+garder la boucl 1
+garder le 1
+garder le bloc 1
+garder le ch 1
+garder le valeur 1
+garder un 1
+garder un historiqu 1
+garder un matr 1
+garder un maxim 1
+garderon 1
+garderon la 1
+garderon la forml 1
+gargantin 1
+garlan 1
+garlan et al 1
+garland 3
+garland publ 1
+garner 1
+garner dur infer 1
+gaschnig 1
+gat 7
+gat 2ns 1
+gat 2ns del 1
+gat and qualif 1
+gat ar 1
+gat g1 1
+gat gi 1
+gat gj 1
+gat gk 1
+gat gtop 1
+gatew 5
+gatew program 1
+gatew to system 1
+gatew tok 1
+gatew7 1
+gather 15
+gather adjustm 1
+gather al unseen 1
+gather an edg 1
+gather and scatter 1
+gather coalesc 1
+gather dat 3
+gather del 1
+gather del flag 1
+gather div 1
+gather div flag 1
+gather edg 1
+gather edg trac 1
+gather evalu 1
+gather evalu result 1
+gather execut 1
+gather execut profil 1
+gather for execut 1
+gather inform 1
+gather of variabl 1
+gather oper 1
+gather quantit 1
+gather quantit dat 1
+gather record 1
+gather rel 1
+gather rel quick 1
+gather result 1
+gather stat 1
+gather th se 1
+gather that inform 1
+gather using 1
+gatif 1
+gauch 4
+gauch a droit 3
+gauch de 1
+gauch de la 1
+gauch du 1
+gauch est 1
+gauch est evid 1
+gauch est lensembl 1
+gauch et sel 1
+gauch peut 1
+gauch peut toutef 1
+gaug 1
+gaurav 1
+gaurav bang 1
+gaus 14
+gaus assum 1
+gaus aux 1
+gaus aux var 1
+gaus ba 1
+gaus ba es 1
+gaus de 1
+gaus distribut 2
+gaus distribut random 1
+gaus elim 5
+gaus elim appl 1
+gaus elim method 1
+gaus elim procedur 1
+gaus elim program 1
+gaus filter 1
+gaus kernel 1
+gaus natur 1
+gaus no 1
+gaus uniform 1
+gaus variabl 2
+gav 15
+gav a brief 1
+gav a gener 1
+gav a model 1
+gav a protocol 1
+gav a simil 1
+gav a theor 1
+gav an algorithm 1
+gav an interest 1
+gav better result 1
+gav optim 1
+gav optim bound 1
+gav rec 1
+gav slight 1
+gav som interest 1
+gav som intuit 1
+gav th inst 1
+gav th worst 1
+gav us us 1
+gaver 1
+gaver et al 1
+gavin 1
+gavin low 1
+gavin.low 1
+gavin.low casestudytr.ps.gz 1
+gavish 1
+gawlick 1
+gaz 1
+gaz and mutu 1
+gaz and speech 1
+gazdar 1
+gb 3
+gb afin 1
+gb afin dacc 1
+gb doiv 1
+gb est 1
+gb est mi 1
+gb et le 1
+gb et tb 1
+gb ne 1
+gb ne cr 1
+gb wcb 1
+gb wcb lsb 1
+gbit 1
+gblog 1
+gblog tc 1
+gby 2
+gc 2
+gc in singl 1
+gc neur 1
+gc neur network 1
+gc28 1
+gc92 1
+gcag 1
+gcag grant 1
+gcc 2
+gcc ver 1
+gcf 1
+gcg 1
+gcl 1
+gcl connect 1
+gcsp 1
+gcsp and ap 1
+gcsp ar analog 1
+gcsp mean 1
+gcsp mean find 1
+gcsp post 1
+gd 2
+gd ar reach 1
+gd can reach 1
+gd f1 1
+gd f1 f2 1
+gd fd 1
+gd g fd 1
+gd in step 1
+gd is strong 1
+gd that mak 1
+gd with weight 1
+gd y f11f12 1
+gd y gy 1
+gd91 1
+gdeg 1
+gdq92 1
+gdx 1
+gdy 1
+gdy f21f22 1
+gdy of f2 1
+gdy y gdy 1
+ge 81
+ge a 3d 1
+ge a dat 1
+ge a fast 1
+ge a me 1
+ge a rat 1
+ge a receiver 1
+ge a rep 1
+ge a respon 1
+ge a situ 1
+ge a span 1
+ge a sub 3
+ge a supergraph 1
+ge a uniqu 1
+ge absorb 1
+ge activ 1
+ge adv 2
+ge aff 1
+ge aff problem 1
+ge agr 1
+ge an answer 1
+ge an approxim 1
+ge an estim 2
+ge an id 1
+ge an infinit 1
+ge an insight 1
+ge an optim 1
+ge and ml 1
+ge and transm 1
+ge another bin 1
+ge arbitr 1
+ge arbitr part 1
+ge assign 2
+ge better parallel 1
+ge better perform 1
+ge by substitut 1
+ge caught 1
+ge closer 1
+ge cluster 1
+ge constraint 1
+ge contextu 1
+ge contextu inform 1
+ge creat 1
+ge del 1
+ge determin 1
+ge doesnt scal 1
+ge du 1
+ge du attent 1
+ge e1 1
+ge e1 e1 1
+ge elect 1
+ge enhanc 1
+ge enhanc perform 1
+ge er 1
+ge exact 1
+ge execut 2
+ge execut tim 1
+ge expr 1
+ge farther 1
+ge fast 2
+ge fast arithm 1
+ge fast perform 1
+ge faster 1
+ge fil 1
+ge first visit 1
+ge for 1
+ge forml 1
+ge high 1
+ge high label 1
+ge improv 1
+ge inform 1
+ge inherit 1
+ge init 1
+ge init1 1
+ge init1 me 1
+ge int oo 1
+ge involut 1
+ge iron 1
+ge it turn 1
+ge it wrong 2
+ge item 1
+ge item el 1
+ge larger 1
+ge list 1
+ge list a1 1
+ge list a3 1
+ge list ne 1
+ge longer 2
+ge lower 1
+ge maxim 1
+ge maxim perform 1
+ge method 1
+ge mor rel 1
+ge myinf 1
+ge near 1
+ge nil 1
+ge nil a1 1
+ge nil nest 1
+ge nod 1
+ge on me 1
+ge oper 1
+ge oper reflect 1
+ge optim 1
+ge p2 1
+ge pa 1
+ge polynom 1
+ge polynom constraint 1
+ge poor 1
+ge poor result 1
+ge prev 1
+ge protect 1
+ge receiv 1
+ge receiv proc 1
+ge repl 1
+ge repr 3
+ge repr valu 2
+ge rid 5
+ge rout 1
+ge schedl 1
+ge serv 1
+ge shorter 1
+ge smaller 1
+ge smaller expon 1
+ge som input 1
+ge start 1
+ge start pot 1
+ge structur 1
+ge stuck 1
+ge tetrahedr 1
+ge textur 1
+ge textur cl 1
+ge th actu 1
+ge th bound 1
+ge th cl 1
+ge th colour 1
+ge th compiler 1
+ge th compon 1
+ge th correspon 1
+ge th desir 1
+ge th eff 1
+ge th execut 1
+ge th forml 1
+ge th impr 1
+ge th inform 2
+ge th junior 1
+ge th lower 1
+ge th match 1
+ge th prev 1
+ge th program 1
+ge th rep 1
+ge th result 2
+ge th senior 1
+ge th solut 1
+ge th sparser 1
+ge th subject 1
+ge th synchron 1
+ge th term 1
+ge th thread 1
+ge th tok 1
+ge th tot 1
+ge th upper 1
+ge th valu 1
+ge th weigh 1
+ge that po 1
+ge their cont 1
+ge their dat 1
+ge their turn 1
+ge thing 1
+ge thr argum 1
+ge tight 1
+ge tight upper 1
+ge to spen 1
+ge upd 4
+ge valu 2
+ge valu a2 1
+ge valu y1 1
+ge valu y3 1
+ge valu y4 1
+ge var 1
+ge var y1 1
+ge var y2 1
+ge var y3 1
+ge visit 1
+ge w y2f0 1
+ge weigh 1
+ge weigh matr 1
+ge x ac 1
+ge zer 1
+ge. 1
+gear 1
+gear to reduc 1
+gecg 1
+ged 2
+ged pascalstr 1
+geelh 1
+geest 1
+geest portig 1
+gefenst 1
+gegenbauer 1
+gegenbauer ca 1
+geh84 1
+gehan 2
+geig 1
+geiger 1
+geiger soph.inr.fr 1
+geijn 1
+geiser 1
+gel 2
+gel de 1
+gel de but 1
+gel de pr 1
+gel du 1
+gel dun 1
+gel es 1
+gel et dun 1
+gel et ex 1
+gel gel 1
+gelder 3
+gelder and yum 1
+gelder yum 1
+gelenb 1
+geler 1
+gelernter 3
+gelfand 1
+gelfand smith 1
+gelman 1
+gelman rubin 1
+gemst 1
+gemst object 1
+gemst object orient 1
+gen 8
+gen and pr 1
+gen con 1
+gen dbm 1
+gen dbm softwar 1
+gen expr 1
+gen expr co1 1
+gen expr co2 1
+gen expr rp 1
+gen lambd 1
+gen lambd list 1
+gen log 1
+gen log expr 1
+gen offer 1
+gen spafford 1
+gen t.j 1
+gender 2
+gender fem 1
+gender mal 1
+gener 122
+gener a bf 1
+gener a bus 1
+gener a cel 1
+gener a cluster 1
+gener a color 1
+gener a commun 1
+gener a confid 1
+gener a fak 1
+gener a foc 1
+gener a forml 1
+gener a good 1
+gener a greater 1
+gener a hypercub 1
+gener a hypoth 1
+gener a list 1
+gener a me 1
+gener a minim 1
+gener a moder 1
+gener a pract 1
+gener a procedur 1
+gener a program 1
+gener a proof 1
+gener a random 3
+gener a repl 1
+gener a rid 1
+gener a se 1
+gener a search 1
+gener a ser 1
+gener a shift 1
+gener a slight 1
+gener a solut 1
+gener a spec 1
+gener a task 1
+gener a top 1
+gener a tr 2
+gener a traject 1
+gener a val 1
+gener a var 1
+gener a ver 1
+gener a writ 1
+gener abil 2
+gener about sequ 1
+gener accent 1
+gener accent character 1
+gener accept 2
+gener accept form 1
+gener accept solut 1
+gener accord 1
+gener accur 1
+gener accur drop 1
+gener accur slight 1
+gener acknowledg 1
+gener act 1
+gener act lead 1
+gener addit 1
+gener addit proc 1
+gener aff 1
+gener aff constraint 1
+gener agr 1
+gener ahead 1
+gener al maxim 1
+gener al quer 1
+gener algorithm 2
+gener algorithm run 1
+gener alloc 1
+gener alloc funct 1
+gener an 1
+gener an ec 1
+gener an emb 1
+gener an init 2
+gener an interconnect 1
+gener an object 1
+gener and compil 1
+gener and cumbersom 1
+gener and ea 1
+gener and eleg 1
+gener and eoec 1
+gener and evalu 1
+gener and flec 1
+gener and implem 1
+gener and induc 1
+gener and interpr 1
+gener and maintain 1
+gener and power 1
+gener and predict 1
+gener and record 1
+gener and report 1
+gener and subsequ 1
+gener and test 1
+gener and therefor 1
+gener and transact 1
+gener and verif 1
+gener and wid 1
+gener another forest 1
+gener appl 2
+gener appl ar 1
+gener approach 7
+gener appropr 1
+gener appropr me 1
+gener ar correspon 1
+gener ar domain 1
+gener ar st 1
+gener architectur 2
+gener argum 1
+gener arithm 1
+gener assum 2
+gener at random 1
+gener atom 1
+gener atom goal 1
+gener automat 1
+gener b rep 1
+gener be conflict 1
+gener be low 1
+gener be predict 1
+gener behaviour 1
+gener being simpler 1
+gener belief 1
+gener benefit 1
+gener better qu 1
+gener better solut 1
+gener block 1
+gener boolean 1
+gener boolean funct 1
+gener by abstract 1
+gener by acc 1
+gener by algorithm 1
+gener by combin 1
+gener by compon 1
+gener by const 1
+gener by contextu 1
+gener by decomp 1
+gener by fl 1
+gener by funct 1
+gener by fvivj 1
+gener by gonzalez 1
+gener by hand 1
+gener by hofman 1
+gener by initialschedl 1
+gener by lec 1
+gener by member 1
+gener by memor 1
+gener by refer 1
+gener by s2 1
+gener by selfmodif 1
+gener by shannon 1
+gener by spec 1
+gener by transposit 1
+gener by wgp 1
+gener by yard 1
+gener c cod 3
+gener ca 14
+gener ca wh 2
+gener can spec 1
+gener cap 1
+gener chain 1
+gener chain ba 1
+gener chainb 1
+gener chainb parallel 1
+gener chang 1
+gener chang involut 1
+gener cl 7
+gener cl decl 1
+gener cl log 1
+gener classif 2
+gener cluster 1
+gener cnf 1
+gener cnf forml 1
+gener coar 1
+gener coar graph 1
+gener cod 7
+gener cod chang 1
+gener coh 1
+gener coh pair 1
+gener collect 2
+gener collect modl 1
+gener combin 1
+gener combin object 1
+gener commun 2
+gener commun schedl 1
+gener compact 1
+gener compl 1
+gener compon 1
+gener comput 5
+gener comput model 1
+gener computer 8
+gener computer system 8
+gener concept 1
+gener conclus 1
+gener condit 4
+gener condit cl 1
+gener configur 2
+gener configur dep 1
+gener conjectur 1
+gener conjectur assum 1
+gener consider 1
+gener constraint 2
+gener constraint t1 1
+gener construc 1
+gener construc funct 1
+gener construc mak 1
+gener contain 1
+gener context 1
+gener correct 2
+gener correct parser 1
+gener counterpart 1
+gener cql 1
+gener cql se 1
+gener criter 1
+gener dat 3
+gener dat method 1
+gener datab 2
+gener datab attribut 1
+gener datab d1 1
+gener datab defin 1
+gener datab log 1
+gener datab output 1
+gener datab r0 1
+gener datab repr 1
+gener datab system 1
+gener dataflow 1
+gener dataflow graph 1
+gener de 1
+gener de no 1
+gener dec 1
+gener dec mak 1
+gener decomposit 1
+gener default 1
+gener default bod 1
+gener definit 3
+gener deriv 1
+gener deriv tr 1
+gener detail 1
+gener determin 2
+gener determin test 1
+gener developer 1
+gener differ way 1
+gener dim 1
+gener discr 1
+gener dispatch 1
+gener dispatch schem 1
+gener dispatch strateg 1
+gener distribut 1
+gener distribut monit 1
+gener docum 1
+gener docum layout 1
+gener du 2
+gener dur execut 1
+gener dur step 1
+gener each dat 1
+gener ec 1
+gener ec learn 1
+gener edb 1
+gener edb herbrand 1
+gener edb rel 1
+gener edg 1
+gener edg color 1
+gener eff 2
+gener eff cod 1
+gener eff using 1
+gener emb 1
+gener engineer 1
+gener engineer system 1
+gener error 1
+gener ev tim 1
+gener exact 1
+gener exempl 1
+gener exper 3
+gener exper system 3
+gener explan 1
+gener fact 1
+gener failur 2
+gener fal 1
+gener famil 1
+gener fash 1
+gener fe 1
+gener featur 1
+gener fewer 1
+gener fish 1
+gener fish view 1
+gener fl 1
+gener flec 1
+gener follow 2
+gener for acc 1
+gener for ap1000 1
+gener for chain 1
+gener for cl 1
+gener for control 1
+gener for input 1
+gener for learn 1
+gener for match 1
+gener for me 1
+gener for minim 1
+gener for program 1
+gener for string 1
+gener for symbol 1
+gener for vect 1
+gener form 7
+gener form requir 1
+gener format 2
+gener forml 4
+gener four circl 1
+gener fpg 1
+gener framework 4
+gener from infer 1
+gener from length 1
+gener from mod 1
+gener from ser 1
+gener from siml 1
+gener from specif 1
+gener from val 1
+gener funct 7
+gener funct ad 1
+gener funct alloc 1
+gener funct bound 1
+gener funct cl 1
+gener funct commun 1
+gener funct compat 1
+gener funct comput 1
+gener funct definit 2
+gener funct discrimin 1
+gener funct dispatch 1
+gener funct domain 1
+gener funct gf 1
+gener funct list 1
+gener funct metaobject 1
+gener funct method 1
+gener funct nam 1
+gener funct replac 1
+gener funct requir 1
+gener funct return 1
+gener funct test 1
+gener funct wait 1
+gener fundam 1
+gener fundam cycl 1
+gener gener 1
+gener gener funct 1
+gener giv 1
+gener giv term 1
+gener good 1
+gener good solut 1
+gener graph 1
+gener guidel 1
+gener ha siz 1
+gener had low 1
+gener handler 1
+gener help 1
+gener help system 1
+gener herbrand 1
+gener herbrand atom 1
+gener herbrand ba 1
+gener herbrand univer 1
+gener heur 1
+gener high cont 1
+gener high level 1
+gener hydr 1
+gener hydr dat 1
+gener hypoth 2
+gener hypoth fi 1
+gener id 2
+gener idb 1
+gener idb herbrand 1
+gener ignor 1
+gener imp 1
+gener impl 1
+gener implem 1
+gener implem strateg 1
+gener impr 1
+gener in comparison 1
+gener in computer 1
+gener in con 1
+gener in const 1
+gener in feed 1
+gener in tim 1
+gener in weak 1
+gener incap 1
+gener inclus 1
+gener inclus appl 1
+gener ind 1
+gener inform 3
+gener inform author 1
+gener inform proc 1
+gener inform system 1
+gener input 1
+gener instr 1
+gener instr ver 1
+gener int 1
+gener int collect 1
+gener int hyperrectangl 1
+gener interfac 3
+gener interm 1
+gener interm cod 1
+gener interm fortran 1
+gener interpr 1
+gener interpr execut 1
+gener introduc 1
+gener intuit 2
+gener is check 1
+gener is nec 1
+gener is pspac 1
+gener is reach 1
+gener is tak 1
+gener issu 1
+gener it prov 1
+gener it succ 1
+gener junior 1
+gener junior se 1
+gener k bandwidth 1
+gener k tupl 1
+gener key 1
+gener know 1
+gener knowledg 2
+gener lack 1
+gener lambd 1
+gener lambd cr 1
+gener lambd gen 1
+gener lambd macr 1
+gener lambd syntac 1
+gener larg dag 1
+gener lead 1
+gener lem 1
+gener lin 2
+gener lin equ 1
+gener lin ext 1
+gener lioyd 1
+gener lioyd iter 1
+gener list 2
+gener lit 1
+gener lit transform 1
+gener loc 1
+gener loc propag 1
+gener log 3
+gener log ba 1
+gener log program 1
+gener log serv 1
+gener log theor 1
+gener log tool 1
+gener loop 1
+gener loop bound 1
+gener low 1
+gener low level 1
+gener mach 2
+gener mak 1
+gener manner 1
+gener match 1
+gener may spec 1
+gener me 6
+gener me pa 1
+gener me sen 1
+gener me xp 1
+gener mean 2
+gener measur 1
+gener mechan 2
+gener med 1
+gener med grain 1
+gener metaxp 1
+gener method 6
+gener method appl 1
+gener method ba 1
+gener mic 1
+gener mic lin 1
+gener minim 2
+gener minim perfect 1
+gener model 3
+gener modl 1
+gener mor attract 1
+gener mor dif 1
+gener mov 1
+gener mult 2
+gener mult dim 1
+gener mult level 1
+gener multipl 2
+gener multipl inherit 1
+gener multipl solut 1
+gener mus 1
+gener mus knowledg 1
+gener na 1
+gener na bottom 1
+gener na evalu 1
+gener na rl 1
+gener nam 1
+gener natur 1
+gener natur langu 1
+gener nec 1
+gener neither whit 1
+gener nest 1
+gener nest dissect 1
+gener network 3
+gener new loop 1
+gener new proc 1
+gener new reg 1
+gener nondetermin 1
+gener nondetermin unif 1
+gener not 3
+gener not commut 1
+gener not lin 1
+gener not us 1
+gener observ 1
+gener of 2d 1
+gener of approxim 1
+gener of bm 1
+gener of context 2
+gener of contextsensit 1
+gener of experim 1
+gener of fe 1
+gener of infinit 1
+gener of input 1
+gener of minim 1
+gener of mod 1
+gener of model 1
+gener of mov 1
+gener of neur 1
+gener of order 1
+gener of proc 1
+gener of regl 1
+gener of stream 1
+gener of subtr 1
+gener of support 1
+gener of tail 1
+gener of test 1
+gener of typ 1
+gener offer 1
+gener om 1
+gener om failur 1
+gener on subsequ 1
+gener on valu 1
+gener onl correct 1
+gener onl real 1
+gener oolp 1
+gener oolp langu 1
+gener oper 1
+gener opinion 1
+gener or hypoth 1
+gener or retrief 1
+gener other stat 1
+gener output 1
+gener output cod 1
+gener overview 2
+gener pack 3
+gener pack inst 1
+gener pack network 1
+gener pack repl 1
+gener pack switch 1
+gener pad 1
+gener parallel 4
+gener parallel cod 1
+gener parallel mach 1
+gener parallel system 2
+gener param 1
+gener parameter 1
+gener parameter requir 1
+gener parod 1
+gener parod text 1
+gener part 2
+gener partit 2
+gener partit lem 1
+gener pattern 2
+gener pattern match 1
+gener perfect 1
+gener perfect shuffl 1
+gener perform 4
+gener permut 2
+gener perspect 1
+gener ph 1
+gener phr 1
+gener phr structur 1
+gener phy 1
+gener phy law 1
+gener plac 2
+gener plac algorithm 1
+gener plac upd 1
+gener po 1
+gener point 1
+gener polygon 1
+gener polyhedr 1
+gener polynom 2
+gener polynom constraint 1
+gener polynom fring 1
+gener posit 1
+gener posit selfdu 1
+gener possibil 1
+gener pr 1
+gener practitioner 1
+gener practitioner oper 1
+gener pram 1
+gener pram siml 1
+gener primitiv 1
+gener principl 1
+gener problem 7
+gener problem domain 1
+gener problem inst 1
+gener proc 2
+gener proc shar 1
+gener proceed 1
+gener processorshar 1
+gener profil 1
+gener progr 1
+gener progr tetrah. 1
+gener program 5
+gener program langu 1
+gener program model 1
+gener prom 1
+gener proof 3
+gener proof method 1
+gener propag 2
+gener propag algorithm 1
+gener propag task 1
+gener proper 2
+gener propositionalform 1
+gener purp 12
+gener purp architectur 2
+gener purp atm 1
+gener purp bottom 1
+gener purp cl 1
+gener purp computer 1
+gener purp framework 1
+gener purp imper 1
+gener purp instruc 1
+gener purp mach 1
+gener purp microproc 1
+gener purp parallel 1
+gener purp risc 1
+gener purp siml 1
+gener purp switch 1
+gener put 1
+gener qualit 1
+gener qualit model 1
+gener quant 1
+gener quer 1
+gener quest 1
+gener random 3
+gener random dat 1
+gener random graph 1
+gener realm 1
+gener realm requir 1
+gener recur 1
+gener reduc 2
+gener reduc rel 1
+gener reg 1
+gener rel 2
+gener rel algebr 1
+gener rel contain 1
+gener rel form 1
+gener rel fy 1
+gener rel iff 1
+gener rel oe 1
+gener rel r1 1
+gener rel repr 1
+gener rel ri 1
+gener rel.2 1
+gener request 2
+gener result 2
+gener result rel 1
+gener result st 1
+gener rl 3
+gener rmtp 1
+gener rmtp throughput 1
+gener robust 1
+gener robust order 1
+gener rout 1
+gener rout determin 1
+gener rout gener 1
+gener schem 6
+gener schem involut 1
+gener se 8
+gener se me 1
+gener se wh 1
+gener se.1 1
+gener se.1 cook 1
+gener search 2
+gener search heur 1
+gener seed 1
+gener self 1
+gener self dual 1
+gener sem 2
+gener sem descript 1
+gener sender 1
+gener sender init 1
+gener sent 1
+gener sequ 2
+gener sequ interact 1
+gener serv 1
+gener shap 1
+gener shout 1
+gener sid 1
+gener sid effect 1
+gener sign 1
+gener sign dep 1
+gener simpl 1
+gener simultan 1
+gener simultan acc 1
+gener slrn 1
+gener solut 8
+gener solut fi 1
+gener sort 1
+gener sort algorithm 1
+gener specializ 1
+gener speed 1
+gener spmd 2
+gener spmd cod 1
+gener spur 1
+gener spur output 1
+gener st 2
+gener st text 1
+gener stag 1
+gener steiner 1
+gener steiner problem 1
+gener steiner se 1
+gener strateg 2
+gener structur 2
+gener structur appl 1
+gener stud 1
+gener stud foc 1
+gener sub 1
+gener sub collect 1
+gener substitut 1
+gener superior 1
+gener superior se 1
+gener support 1
+gener surfac 1
+gener surfac form 1
+gener surv 1
+gener synchron 1
+gener synchron iter 1
+gener system 6
+gener system closer 1
+gener system outperform 1
+gener system ten 1
+gener system term 1
+gener system wid 1
+gener tak 1
+gener task 3
+gener task approach 1
+gener task architectur 1
+gener task def 1
+gener task graph 1
+gener techniqu 4
+gener techniqu appl 1
+gener term 4
+gener test 3
+gener test using 1
+gener text 1
+gener th abstract 1
+gener th appl 1
+gener th appropr 2
+gener th assoc 1
+gener th ba 1
+gener th bf 1
+gener th block 1
+gener th cm 1
+gener th concept 1
+gener th constraint 2
+gener th construc 1
+gener th correct 1
+gener th correspon 1
+gener th csg 1
+gener th default 1
+gener th del 1
+gener th entir 1
+gener th exampl 1
+gener th groundbreak 1
+gener th height 1
+gener th id 1
+gener th init 1
+gener th intuit 1
+gener th junior 1
+gener th keyword 1
+gener th lin 1
+gener th mean 1
+gener th minim 1
+gener th not 2
+gener th object 1
+gener th parallel 1
+gener th perform 1
+gener th protocol 1
+gener th rel 1
+gener th result 1
+gener th se 1
+gener th sec 1
+gener th sequ 1
+gener th shap 1
+gener th smaller 1
+gener th solut 1
+gener th structur 1
+gener th superior 1
+gener th tdn 1
+gener th techniqu 1
+gener th theor 1
+gener th tt 1
+gener th ttl 1
+gener that somehow 1
+gener that system 1
+gener that t1 1
+gener that us 1
+gener their result 1
+gener their techniqu 1
+gener theor 1
+gener theorem 1
+gener tim 1
+gener tim equ 1
+gener to contain 1
+gener to drug 1
+gener to gener 2
+gener to giv 1
+gener to high 1
+gener to init 1
+gener to loc 1
+gener to mlp 1
+gener to nd 1
+gener to occur 1
+gener to phy 1
+gener to produc 1
+gener to siml 1
+gener to support 1
+gener to work 1
+gener tool 2
+gener tool ba 1
+gener tot 1
+gener tot deliv 1
+gener tp 1
+gener tp monit 1
+gener traff 3
+gener transfer 1
+gener transform 1
+gener tren 3
+gener tridiagon 1
+gener tridiagon matr 1
+gener tupl 1
+gener tupl describ 1
+gener tupl prov 1
+gener tupl repr 1
+gener tw 1
+gener tw desc 1
+gener tw output 1
+gener typ 1
+gener typ check 1
+gener unfruit 1
+gener unfruit andgrammar 1
+gener unif 1
+gener unimodl 2
+gener unimodl loop 2
+gener unlim 1
+gener unsuit 1
+gener us 1
+gener usag 1
+gener usag specif 1
+gener user 1
+gener user interfac 1
+gener using 6
+gener using boolean 1
+gener using dot 1
+gener using smith 1
+gener usu 1
+gener usu stat 1
+gener ver 1
+gener view 2
+gener voron 1
+gener voron diagram 1
+gener vs 1
+gener wa imp 1
+gener wait 1
+gener wait funct 1
+gener way 1
+gener we cit 1
+gener we leav 1
+gener wer deliber 1
+gener wer lim 1
+gener wer stud 1
+gener wh init 1
+gener when bar 1
+gener when inclus 1
+gener which gener 1
+gener with low 1
+gener with lower 1
+gener without difficult 1
+gener. 1
+generaliz 8
+generaliz a var 1
+generaliz and integr 1
+generaliz inst 1
+generaliz rl 1
+generaterandomgraph 1
+generationtoolshardwar 1
+generationtoolshardwar managerkernel 1
+generationtoolshardwar managerkernel control 1
+genest 1
+genest et al 1
+genet 7
+genet algorithm 4
+genet algorithm methodolog 1
+genet crossover 1
+genet crossover oper 1
+genet evolut 1
+genet neur 1
+genet neur network 1
+genet other algorithm 1
+genet program 1
+genet search 1
+genet sequ 1
+genet sequ alignm 1
+genet sequ dot 1
+genetiqu 1
+genetiqu oper 1
+genetisch 1
+genetisch algorithmus 1
+genev 4
+genev ha develop 1
+genev2 1
+gengler 1
+gengler and matthieu 1
+genl 1
+genom 1
+genr 3
+genr de 3
+genr de calcl 1
+genr de conflit 1
+genr de mat 1
+genr de techniqu 1
+genr did ee 1
+genr din 1
+genr din egalit 1
+genr doptim 1
+genr doptim pourrait 1
+gent 1
+gent and walsh 1
+gentil 2
+gentil qu 1
+gentil qu ne 1
+gentl 2
+gentl introduc 1
+genu 1
+genu unfamil 1
+genuin 1
+genuin even distribut 1
+genvoc 1
+genvoc def 1
+genvoc model 1
+genvoc model captur 1
+genvoc softwar 1
+genvoc softwar system 1
+geobild 1
+geoffr 2
+geoffr brown 1
+geoffr pullam 1
+geograph 9
+geograph and polit 1
+geograph appl 1
+geograph datab 3
+geograph descript 1
+geograph dist 1
+geograph environm 1
+geograph inform 2
+geograph inform system 2
+geograph led 1
+geograph loc 1
+geograph satel 1
+geograph satel imag 1
+geograph spac 1
+geolog 1
+geolog system 1
+geometer 19
+geometer algorithm 1
+geometer and biolog 1
+geometer and computer 1
+geometer and featur 1
+geometer and geometer 1
+geometer and log 1
+geometer and phy 1
+geometer and spat 1
+geometer and topolog 2
+geometer approach 3
+geometer approach pr 1
+geometer aspect 1
+geometer assoc 1
+geometer ba 1
+geometer backtrack 1
+geometer backtrack ba 1
+geometer comput 1
+geometer consider 1
+geometer constraint 2
+geometer constraint satisf 1
+geometer dat 2
+geometer dat structur 1
+geometer dev 1
+geometer differ 2
+geometer differ dep 1
+geometer domain 1
+geometer fact 1
+geometer featur 1
+geometer figur 1
+geometer for polyhedr 1
+geometer for triangl 1
+geometer graph 1
+geometer hash 1
+geometer hash using 1
+geometer interchang 1
+geometer intersect 1
+geometer invar 1
+geometer mean 1
+geometer mean inequ 1
+geometer method 1
+geometer object 3
+geometer of multilayer 1
+geometer of sol 1
+geometer partit 1
+geometer partit method 1
+geometer point 1
+geometer prob 1
+geometer proper 1
+geometer prun 2
+geometer reg 1
+geometer reg accord 1
+geometer repr 1
+geometer result 1
+geometer st 1
+geometer task 1
+geometer theorem 1
+geometer theorem prov 1
+geometer viewpoint 1
+geomtr 1
+geomtr point 1
+geoph 1
+georg 13
+georg and joseph 1
+georg and liu 1
+georg cybenk 1
+georg dorffner 1
+georg institut 5
+georg karyp 2
+georg lap 1
+georg plimpt 1
+georg tech 3
+georg tech mobil 1
+georgakopoul 1
+georgiad 1
+georgiannak 1
+georgiou 1
+gep 1
+geq 1
+geq intn 1
+geq realn 1
+ger 2
+ger german 1
+gerald 3
+gerald gazdar 1
+gerald popek 1
+geralm 1
+geralm ignorad 1
+geralm ignorad pel 1
+gerasoul 1
+gerbessiot 1
+gerd 1
+gerd pa 1
+gerhard 3
+gerhard we 1
+gerhard weikum 1
+gerhard widmer 1
+gerl 1
+german 22
+german ar group 1
+german email 1
+german feder 1
+german feder minister 1
+german nat 2
+german nat research 2
+german research 1
+german research center 1
+gerndt 1
+gersh 2
+gershenfeld 1
+gerth 1
+gerth brod 1
+gesellschaft 2
+gesellschaft f ur 2
+gesellschaft institut 1
+gest 5
+gest a lec 1
+gest centr 1
+gest centr ee 1
+gest ch 1
+gest constitu 1
+gest constitu ee 1
+gest correct 2
+gest correct de 2
+gest de 5
+gest de boucl 1
+gest de cach 1
+gest de ce 2
+gest de cod 1
+gest de commun 2
+gest de coupur 1
+gest de deux 1
+gest de diff 2
+gest de drapeaux 1
+gest de environ 1
+gest de espac 1
+gest de ev 1
+gest de la 2
+gest de liaison 1
+gest de me 1
+gest de mvp 1
+gest de pag 1
+gest de point 1
+gest de primitiv 1
+gest de register 1
+gest de ressourc 1
+gest de tampon 1
+gest de variabl 1
+gest doit 1
+gest doit alor 1
+gest du 2
+gest du champ 1
+gest du compteur 1
+gest du contr 1
+gest du drapeau 1
+gest du mod 1
+gest du nid 1
+gest du par 1
+gest du program 1
+gest du retard 1
+gest du retour 1
+gest dun 2
+gest dun compteur 1
+gest dun mvp 1
+gest dynamiqu 2
+gest dynamiqu de 2
+gest dynamiqu efficac 1
+gest efficac 1
+gest efficac de 1
+gest explicit 2
+gest explicit de 2
+gest m emoir 2
+gest par 1
+gest par pag 1
+gest peut 1
+gest peut etr 1
+gest r epart 1
+gest statiqu 1
+gest statiqu de 1
+gestionnair 3
+gestionnair de 3
+gestionnair de la 1
+gestionnair de man 1
+gestionnair de migr 1
+gestionnair de mouv 1
+gestionnair de pag 1
+gestionnair de transact 1
+gestionnair doit 1
+gestionnair doit fair 1
+gestionnair est 1
+gestionnair est le 1
+gestionnair gestionnair 1
+gestionnair la 1
+gestionnair la dur 1
+gestionnair lecteur 1
+gestionnair lecteur gestionnair 1
+gestionnair me 1
+gestionnair ou 1
+gestionnair ou non 1
+gestionnair pour 1
+gestionnair pour lexp 1
+gestionnair qu 1
+gestionnair qu est 1
+gestionnair re coit 1
+gestionnair sont 1
+gestionnair sont distinct 1
+gestionnair trait 1
+gestionnair trait en 1
+gestionnair transm 1
+gestionnair transm ce 1
+gestur 1
+gestur an interfac 1
+gestur and speech 1
+gestur and spok 1
+gestur or speech 1
+gestur symbol 1
+getcc1 1
+getcommand 1
+getinf 1
+getinf oper 1
+getinforesult 1
+getl 1
+getp 2
+getp etc 1
+getp is pot 1
+getproc 1
+gettok 1
+gettok2 1
+geyer 1
+gf 3
+gf and return 1
+gf cl 1
+gf cl nam 1
+gf comput 1
+gf comput method 1
+gf domain 1
+gf domain funct 1
+gf domain lookup 1
+gf is bipart 1
+gf is obv 1
+gf is shown 1
+gf method 1
+gf method gf 1
+gf nam 1
+gf nam gen 1
+gf nam method 1
+gf nam spec 1
+gf11 1
+gf11 mach 1
+gfaat 1
+gfaat bus 1
+gfaat bus model 1
+gfaat siml 1
+gfaat siml tool 1
+gfdepartm 1
+gg 3
+gg1 1
+gg1 g2 1
+gg2 1
+gg24 1
+gg88 1
+ggh91 1
+ggj 1
+ggr 1
+ggt 1
+gh 2
+gh and ed 1
+gh annot 1
+gh annot structur 1
+gh approach 1
+gh datab 1
+gh datab record 1
+gh environm 1
+gh for larger 1
+gh project 1
+gh project tr 1
+gh qu 1
+gh record 1
+gh search 1
+gh to explicit 1
+gh83 1
+gh90 1
+gh93a 1
+gh93b 1
+gh94 1
+ghandeharizadeh 1
+gharachorl 4
+ghel 1
+ghel and benjamin 1
+ghel point 1
+ghemawat 1
+ghj91 1
+ghjv94 1
+ghk 1
+ghm93 1
+ghosh 1
+ghost 2
+ghost list 1
+ghost list oe 1
+ghost list oe0 1
+ghost list order 1
+ghost list using 1
+ghost oe 1
+ghost permut 1
+gi 18
+gi and collap 1
+gi appl 2
+gi as follow 1
+gi by find 1
+gi can me 1
+gi confer architectur 1
+gi d vi 1
+gi di 1
+gi dt 1
+gi dt ad 1
+gi fi 1
+gi g contain 1
+gi g0i 1
+gi gi 1
+gi iad 1
+gi is finer 1
+gi on sa 1
+gi oper 1
+gi problem 1
+gi problem requir 1
+gi project 1
+gi rang 1
+gi rang qu 1
+gi rangequ 1
+gi rangequ oper 1
+gi rangequ problem 1
+gi st 1
+gi xj 2
+gi2i 1
+gi2i f hg 1
+giacobazz 1
+giancarl 1
+giant 1
+giant interconnect 1
+giant interconnect network 1
+giant labyrinth 1
+gib 4
+gib etc 1
+gib phenom 1
+gib sampl 1
+gib sampler 1
+gibbon 4
+gibbon and merrit 1
+gibson 2
+gic 1
+gic prolog 1
+gic prolog mach 1
+gic1 1
+gic1 contain 1
+gic1 d vic1 1
+gic1 is construc 1
+gid 1
+gid th se 1
+giegerich 1
+giegerich and s.l 1
+gier 1
+gier un 1
+gier un imag 1
+gif 1
+gif etc 1
+gig 1
+gig univer 1
+gigab 1
+gigabit 4
+gigabit loc 1
+gigabit loc ar 1
+gigabit nectar 1
+gigabit nectar project 1
+gigabit nectar testb 1
+gigantesqu 1
+gil 7
+gil and c.w 1
+gil barb 1
+gil et al 1
+gil nav 1
+gil nec 1
+gil nec research 1
+gil neiger 1
+gil omlin 1
+gilbaud 1
+gilber 3
+gilber cabil 1
+gilber cabil de 1
+gilk 1
+gin 1
+giordan 1
+giordan integr 1
+giordan integr learn 1
+giordan learn 1
+giordan learn algorithm 1
+giordan method 1
+giorg 2
+giorg ghel 1
+giorg ghel point 1
+giorg lev 1
+gip 1
+gir72 1
+girard 2
+girard candidat 1
+girard candidat de 1
+girard high 1
+girard high order 1
+girard system 1
+girault 1
+girdin 1
+girkar 1
+girl 1
+girl knew 1
+gish 1
+gismon 1
+gismon3 1
+gist 1
+gist pn 1
+gist ssm 1
+git 2
+git cc 1
+git gvu 1
+giusep 2
+giusep attard 1
+giusep castagn 1
+giusep long 1
+giv 120
+giv a 110kby 1
+giv a ba 1
+giv a babel 1
+giv a bal 1
+giv a bin 1
+giv a block 1
+giv a board 2
+giv a brief 4
+giv a canon 1
+giv a chang 1
+giv a character 1
+giv a chronolog 1
+giv a cl 2
+giv a classif 1
+giv a complec 1
+giv a compreh 1
+giv a con 1
+giv a connect 1
+giv a constraint 2
+giv a contradict 1
+giv a contribut 1
+giv a correct 1
+giv a dat 1
+giv a decomposit 1
+giv a degr 1
+giv a deriv 1
+giv a descript 1
+giv a detail 1
+giv a direct 1
+giv a fam 1
+giv a feel 1
+giv a figur 1
+giv a filter 1
+giv a form 2
+giv a gal 1
+giv a gener 2
+giv a good 4
+giv a graph 3
+giv a lim 1
+giv a loc 1
+giv a lower 1
+giv a matr 1
+giv a me 2
+giv a method 1
+giv a modif 1
+giv a modl 1
+giv a nam 2
+giv a nest 1
+giv a network 1
+giv a nod 1
+giv a nonloc 1
+giv a number 2
+giv a pair 1
+giv a parallel 1
+giv a particl 2
+giv a partit 2
+giv a path 1
+giv a polyhedr 1
+giv a posit 1
+giv a prec 1
+giv a program 1
+giv a protocol 1
+giv a random 1
+giv a rang 2
+giv a real 1
+giv a reason 1
+giv a rec 1
+giv a rectangl 2
+giv a recur 1
+giv a regl 1
+giv a scal 1
+giv a se 6
+giv a sen 1
+giv a sender 1
+giv a simpl 4
+giv a simpler 1
+giv a singl 1
+giv a slight 1
+giv a sol 1
+giv a spat 1
+giv a substitut 2
+giv a suff 1
+giv a super 1
+giv a system 1
+giv a tabl 2
+giv a task 1
+giv a tcp 1
+giv a techniqu 1
+giv a test 1
+giv a tot 2
+giv a transact 1
+giv a var 1
+giv a vect 1
+giv a ver 1
+giv a verif 1
+giv a vo 1
+giv a weight 2
+giv acc 2
+giv acc object 1
+giv accur 1
+giv act 1
+giv adequ 1
+giv adequ experim 1
+giv agent 1
+giv al coh 1
+giv al link 1
+giv al prev 1
+giv al prim 1
+giv al symmeter 1
+giv algorithm 3
+giv an accur 1
+giv an algorithm 1
+giv an answer 1
+giv an antimatr 1
+giv an arbitr 3
+giv an axiom 1
+giv an ea 1
+giv an ec 1
+giv an edg 1
+giv an estim 2
+giv an evalu 1
+giv an exact 1
+giv an exampl 5
+giv an execut 1
+giv an extr 1
+giv an id 2
+giv an init 1
+giv an input 1
+giv an inst 2
+giv an iter 1
+giv an mlp 1
+giv an nc 1
+giv an oper 2
+giv an over 2
+giv an overview 3
+giv an undirect 2
+giv an unweight 1
+giv anc 1
+giv and fl 1
+giv another questionnair 1
+giv any control 1
+giv any fact 1
+giv any gener 1
+giv any inst 1
+giv any oe 1
+giv any vect 1
+giv appl 3
+giv appropr 1
+giv appropr problem 1
+giv architectur 1
+giv architectur model 1
+giv argum 2
+giv argum.we 1
+giv as follow 4
+giv as input 1
+giv ast 1
+giv ast good 1
+giv author 2
+giv ba 1
+giv ba network 1
+giv babel 1
+giv babel program 1
+giv beforehand 1
+giv benchmark 1
+giv benchmark program 1
+giv better perform 1
+giv board 2
+giv board ar 2
+giv boolean 1
+giv boolean expr 1
+giv branch 1
+giv branch eman 1
+giv bronchit 1
+giv buck 1
+giv by baudinet 1
+giv by bruc 1
+giv by cardel 1
+giv by cramer 1
+giv by cur 1
+giv by definit 1
+giv by eq 1
+giv by ev 1
+giv by key 1
+giv by mc 1
+giv by mel 1
+giv by mi 1
+giv by newt 1
+giv by npag 1
+giv by plogn 1
+giv by pr 1
+giv by s4 1
+giv by schr 1
+giv by t0 1
+giv by tak 1
+giv c2 1
+giv cal 1
+giv car 1
+giv car attent 1
+giv categor 1
+giv cel 1
+giv chang 1
+giv channel 1
+giv channel width 1
+giv chunk 1
+giv chunk siz 1
+giv cl 3
+giv cl dict 1
+giv claim 1
+giv claim mad 1
+giv claus 1
+giv cluster 1
+giv coh 1
+giv coh mechan 1
+giv column 2
+giv column wi 1
+giv concept 1
+giv concur 1
+giv concur program 1
+giv condit 2
+giv configur 2
+giv conflict 1
+giv conflict result 1
+giv constraint 2
+giv constraint hierarch 1
+giv context 1
+giv contextu 1
+giv contextu unit 1
+giv continu 1
+giv copt 1
+giv correct 1
+giv correct answer 1
+giv cr 1
+giv cr sect 1
+giv cur 1
+giv cur pract 1
+giv dat 2
+giv dat se 1
+giv datab 1
+giv datab inst 1
+giv definit 1
+giv deriv 1
+giv design 1
+giv design switch 1
+giv detail 1
+giv diagon 1
+giv differ appl 1
+giv differ repr 1
+giv differ result 1
+giv dim 1
+giv dim per 1
+giv direct 2
+giv direct edg 1
+giv docum 1
+giv domain 2
+giv each pc 1
+giv earl 2
+giv edb 1
+giv edg 1
+giv edg weight 1
+giv effect 1
+giv effect valu 1
+giv either optim 1
+giv el 1
+giv elsewh 1
+giv enough neuron 1
+giv enough specif 1
+giv enough train 1
+giv environm 1
+giv exact 2
+giv exampl 2
+giv exampl quer 1
+giv expon 1
+giv expon scal 1
+giv expr 1
+giv fact 1
+giv fact lead 1
+giv failur 1
+giv fam 1
+giv fam norm 1
+giv featur 1
+giv few ext 1
+giv figur 1
+giv figur suggest 1
+giv finer 1
+giv finer control 1
+giv first cl 1
+giv for appl 1
+giv for quer 1
+giv forml 2
+giv four sequ 1
+giv fun 1
+giv funct 2
+giv further 1
+giv further insight 1
+giv gdeg 1
+giv gener 1
+giv gener tupl 1
+giv goal 3
+giv goal context 1
+giv good 4
+giv good estim 1
+giv good prom 1
+giv good respon 1
+giv good result 1
+giv graph 3
+giv group 1
+giv group work 1
+giv he correspon 1
+giv he result 1
+giv high 1
+giv high prior 1
+giv hypoth 1
+giv hypoth gener 1
+giv idl 1
+giv implem 1
+giv import 1
+giv import weight 1
+giv in addit 1
+giv in ap 2
+giv in detail 1
+giv in exampl 1
+giv in fig 1
+giv in figur 9
+giv in fl 1
+giv in funct 1
+giv in lem 2
+giv in norm 1
+giv in number 1
+giv in pseudocod 1
+giv in s4 1
+giv in sect 13
+giv in tabl 8
+giv in term 4
+giv in theorem 3
+giv in var 1
+giv incorrect 1
+giv incorrect result 1
+giv individu 2
+giv individu cel 1
+giv induc 1
+giv inform 2
+giv init 2
+giv init solut 1
+giv init subgraph 1
+giv input 4
+giv input gener 1
+giv input siz 1
+giv input zer 1
+giv inst 1
+giv inst a4 1
+giv inter 3
+giv inter board 2
+giv inter cluster 1
+giv interior 1
+giv interior nod 1
+giv interv 1
+giv it contribut 1
+giv it credit 1
+giv learn 1
+giv learn strateg 1
+giv lectur 1
+giv lem 1
+giv level 3
+giv list 1
+giv loc 1
+giv log 1
+giv log program 1
+giv loop 1
+giv loop nest 1
+giv lower 1
+giv lower bound 1
+giv mach 1
+giv mach learn 1
+giv me 2
+giv melod 1
+giv memor 1
+giv memor hierarch 1
+giv method 1
+giv method invoc 1
+giv mlp 1
+giv mlp program 1
+giv model 1
+giv mor abstract 1
+giv mor gener 1
+giv mor inform 1
+giv mor insight 1
+giv mor power 1
+giv mult 1
+giv mult dim 1
+giv n dim 1
+giv n sl 1
+giv network 1
+giv network topolog 1
+giv no explicit 1
+giv no prior 1
+giv nod 2
+giv number 3
+giv object 3
+giv object graph 1
+giv objectiv 1
+giv obsol 1
+giv obsol record 1
+giv oe 1
+giv on method 1
+giv on output 1
+giv oper 2
+giv oper s2 1
+giv oper sem 1
+giv optim 1
+giv optim determin 1
+giv order 1
+giv order forest 1
+giv our algorithm 1
+giv our assum 1
+giv over 1
+giv over complec 1
+giv pag 1
+giv pair 1
+giv par 1
+giv par specif 1
+giv path 1
+giv path termin 1
+giv perform 1
+giv perform measur 1
+giv piec 1
+giv pn 1
+giv po 1
+giv point 2
+giv pointerb 1
+giv pointerb repr 1
+giv polygon 1
+giv polynom 1
+giv polynom tim 1
+giv poor 1
+giv poor result 1
+giv posit 1
+giv posit dual 1
+giv posit self 1
+giv pot 1
+giv pr 1
+giv prev 1
+giv prev assignm 1
+giv problem 1
+giv problem inst 1
+giv proc 5
+giv proc cluster 2
+giv proc tim 1
+giv procedur 1
+giv program 4
+giv program claus 1
+giv program declin 1
+giv protocol 1
+giv qu 2
+giv qu program 1
+giv qu siz 1
+giv quit tight 1
+giv r4 1
+giv rang 1
+giv rang qu 1
+giv reader 1
+giv record 2
+giv reg 1
+giv regl 1
+giv regl langu 1
+giv rel 1
+giv rel estim 1
+giv repr 1
+giv repr color 1
+giv requir 1
+giv respon 1
+giv respon tim 1
+giv ri 10
+giv rol 1
+giv rol determin 1
+giv rol graph 1
+giv rol horizont 1
+giv rol particip 1
+giv rol ri 1
+giv rol ver 1
+giv s0 1
+giv s0 a0 1
+giv satisfact 1
+giv satisfact result 1
+giv scheduler 1
+giv se 11
+giv seed 1
+giv seed valu 1
+giv sem 1
+giv sequ 1
+giv serv 1
+giv serv addr 1
+giv server 1
+giv sever cl 1
+giv sever exampl 1
+giv shunt 1
+giv sic ver 1
+giv simil 2
+giv simil result 1
+giv simil situ 1
+giv sit 1
+giv situ 3
+giv siz 1
+giv smal decomposit 1
+giv smok 1
+giv smok habit 1
+giv som configur 1
+giv som definit 1
+giv som gener 1
+giv som id 1
+giv som ind 1
+giv som insight 1
+giv som intuit 1
+giv som output 1
+giv som re. 1
+giv spac 1
+giv spec attent 1
+giv spec mean 1
+giv sr 1
+giv ss 1
+giv st 3
+giv st loc 1
+giv st organ 1
+giv stag 2
+giv stat 1
+giv stream 1
+giv strong 1
+giv strong boolean 1
+giv subderiv 1
+giv subtyp 1
+giv subtyp deriv 1
+giv subtyp stat 1
+giv such good 1
+giv suff 3
+giv suff acc 1
+giv suff buffer 1
+giv suff power 1
+giv symmeter 1
+giv symmeter posit 1
+giv synchron 1
+giv synchron command 1
+giv system 6
+giv system siz 2
+giv t2 2
+giv t2 shown 1
+giv targ 1
+giv task 3
+giv tempor 1
+giv tempor goal 1
+giv term 1
+giv th acycl 1
+giv th algorithm 1
+giv th analyzer 1
+giv th angl 1
+giv th antimatr 1
+giv th approxim 2
+giv th ar 1
+giv th argum 1
+giv th asap 1
+giv th assum 2
+giv th aver 4
+giv th ba 3
+giv th bisect 2
+giv th cal 1
+giv th canon 1
+giv th channel 2
+giv th coh 1
+giv th color 1
+giv th compl 1
+giv th conclus 2
+giv th concr 1
+giv th coord 1
+giv th correct 1
+giv th correspon 1
+giv th cost 1
+giv th cur 3
+giv th dat 1
+giv th dec 1
+giv th definit 1
+giv th den 1
+giv th desir 2
+giv th detail 4
+giv th dev 1
+giv th displ 1
+giv th execut 1
+giv th fact 1
+giv th fin 1
+giv th fixpoint 1
+giv th form 1
+giv th funct 1
+giv th geometer 1
+giv th hook 1
+giv th hypoth 1
+giv th inform 1
+giv th inst 1
+giv th issu 1
+giv th label 1
+giv th langu 1
+giv th largest 1
+giv th learner 1
+giv th loc 1
+giv th log 1
+giv th main 1
+giv th map 1
+giv th marker 1
+giv th matr 1
+giv th maxim 1
+giv th minim 1
+giv th nam 2
+giv th nc 1
+giv th nec 1
+giv th number 2
+giv th observ 1
+giv th opcod 1
+giv th optim 1
+giv th parallel 1
+giv th perc 1
+giv th plot 1
+giv th posit 1
+giv th prec 1
+giv th probabil 1
+giv th procedur 1
+giv th proof 2
+giv th proport 1
+giv th rang 1
+giv th recur 1
+giv th rel 1
+giv th repr 1
+giv th restrict 1
+giv th result 4
+giv th rid 1
+giv th run 1
+giv th se 1
+giv th sem 3
+giv th sent 1
+giv th siz 2
+giv th slrn 1
+giv th spac 1
+giv th spec 1
+giv th step 1
+giv th stud 1
+giv th syntac 1
+giv th tim 1
+giv th tot 3
+giv th train 2
+giv th transform 1
+giv th transl 1
+giv th triangl 1
+giv th uniqu 1
+giv th url 1
+giv th valu 2
+giv th vect 1
+giv that advanc 1
+giv that const 1
+giv that ffyxf 1
+giv that me 1
+giv that rol 1
+giv that system 1
+giv them quick 2
+giv theor 1
+giv thought 1
+giv thr rol 1
+giv thread 1
+giv threshold 1
+giv tim 15
+giv tim determin 2
+giv tim fram 1
+giv tim interv 1
+giv tim lim 1
+giv timestamp 1
+giv timestamp valu 1
+giv tn 1
+giv tn stat 1
+giv to construc 1
+giv to group 1
+giv to mak 1
+giv to mr 1
+giv to rutcor 1
+giv to setter 1
+giv to sign 1
+giv toler 1
+giv toler fflt 1
+giv tot 1
+giv tot number 1
+giv ts 1
+giv tupl 1
+giv tw bin 1
+giv tw confid 1
+giv tw definit 1
+giv tw deriv 1
+giv tw exampl 1
+giv tw execut 1
+giv tw funct 1
+giv tw pur 1
+giv tw qu 1
+giv tw rol 1
+giv typ 3
+giv undirect 2
+giv undirect graph 1
+giv updater 1
+giv updater object 1
+giv us confid 1
+giv us consider 1
+giv us good 1
+giv us infer 1
+giv us pq 1
+giv user 1
+giv user nod 1
+giv using 1
+giv valu 5
+giv valu vi 1
+giv vi axiom 1
+giv vi canon 1
+giv warn 1
+giv weight 1
+giv wh 1
+giv window 1
+giv word 1
+giv work 1
+giv.2 1
+gj 8
+gj fj 1
+gj79 1
+gk 5
+gk ar posit 1
+gk hk 1
+gk mac 1
+gk satisf 1
+gk satisf condit 1
+gk that satisf 1
+gk85 1
+gkeik 1
+gklr 1
+gklr algorithm 1
+gklr algorithm continu 1
+gklr algorithm us 1
+gklr is faster 1
+gklr is signif 1
+gklr perform 1
+gklr perform subst 1
+gklr produc 1
+gklr refin 1
+gklr refin algorithm 1
+gklr refin schem 1
+gklr rel 1
+gklr requir 1
+gklr requir signif 1
+gklr ten 1
+gkp85 1
+gkw85 1
+gkwn 1
+gl 12
+gl a workflow 1
+gl agh 1
+gl box 1
+gl box approach 1
+gl box langu 1
+gl box solver 1
+gl de 1
+gl de composit 1
+gl de propag 1
+gl heart 1
+gl heart heart.cleveland 1
+gl model 1
+gl tot 1
+gl tot perform 1
+gl91 1
+glanc 3
+glaser 1
+glasgow 2
+glasgow g1 1
+glasgow g1 1xh 1
+glassman 1
+glean 2
+gligor 1
+glob 58
+glob a ce 1
+glob a la 1
+glob a tout 1
+glob accept 1
+glob accept test 1
+glob addr 4
+glob addr memor 1
+glob addr spac 3
+glob alignm 1
+glob alignm method 1
+glob an 1
+glob an modl 1
+glob an obtain 1
+glob an remain 1
+glob and stat 1
+glob architectur 1
+glob architectur structur 1
+glob beaucoup 1
+glob behavior 1
+glob best edg 1
+glob best el 1
+glob best rst 1
+glob better compar 1
+glob better lb 1
+glob blackboard 1
+glob blackboard spac 1
+glob broadcast 1
+glob broadcast network 1
+glob bus 1
+glob by ded 1
+glob clock 1
+glob com 1
+glob com moy 1
+glob common 1
+glob common point 1
+glob commun 1
+glob compil 1
+glob con 2
+glob con maint 1
+glob condit 1
+glob condit involut 1
+glob conduit 1
+glob conduit aus 1
+glob constraint 1
+glob constraint hierarc 1
+glob context 1
+glob contr 1
+glob contr tr 1
+glob correct 1
+glob cover 1
+glob cr 1
+glob cr dan 1
+glob credit 1
+glob credit assignm 1
+glob criter 1
+glob criter incr 1
+glob d ecr 1
+glob d ecrit 1
+glob d eterminerait 1
+glob de 2
+glob de commun 1
+glob de migr 1
+glob de mouv 1
+glob de par 1
+glob de port 1
+glob de transform 1
+glob devr 1
+glob devr permettr 1
+glob direct 1
+glob direct dict 1
+glob dynam 1
+glob dynam program 1
+glob ee 1
+glob effect 1
+glob effectu 1
+glob en 1
+glob en tant 1
+glob environm 1
+glob est 3
+glob est du 1
+glob est forc 1
+glob est quil 1
+glob est substitu 1
+glob est sup 1
+glob et de 1
+glob et glob 1
+glob et la 1
+glob et le 1
+glob et lec 1
+glob et sur 1
+glob etant 1
+glob etant potentiel 1
+glob event 1
+glob expr 1
+glob featur 1
+glob fin 1
+glob fin appl 1
+glob funct 1
+glob g est 1
+glob g nest 1
+glob gard 1
+glob gb 1
+glob glob 1
+glob hierarch 1
+glob hierarch compar 1
+glob hyperm 1
+glob hyperm protocol 1
+glob iff 1
+glob inchang 1
+glob inchang es 1
+glob inform 1
+glob inform shar 1
+glob intersect 1
+glob inutil 1
+glob inutil sont 1
+glob kernighan 1
+glob kernighan lin 1
+glob knowledg 1
+glob knowledg somewh 1
+glob l elim 1
+glob le 1
+glob le variabl 1
+glob level 1
+glob level compar 1
+glob loop 1
+glob loop schedl 1
+glob manager 1
+glob memor 2
+glob memor st 1
+glob mi 1
+glob minim 4
+glob minim comput 1
+glob minim configur 1
+glob minim mov 1
+glob minim weight 1
+glob mov 1
+glob n ecessair 1
+glob na 1
+glob na donc 1
+glob nearoptim 1
+glob object 2
+glob object funct 1
+glob object spac 1
+glob of trail 1
+glob oper 1
+glob optim 2
+glob optim method 1
+glob order 1
+glob order aim 1
+glob ou 2
+glob ou loc 1
+glob ou si 1
+glob par 1
+glob par tous 1
+glob perform 1
+glob perm 1
+glob perm de 1
+glob pictur 1
+glob plur 1
+glob plur variabl 1
+glob plus lent 1
+glob potentiel 1
+glob potentiel ne 1
+glob pouv 1
+glob pouv etr 1
+glob prior 1
+glob prior queu 1
+glob proc 1
+glob produit 1
+glob produit de 1
+glob program 1
+glob program transform 1
+glob qu 2
+glob qu optim 1
+glob quadr 1
+glob quadr bound 1
+glob quel 1
+glob quel qu 1
+glob r eel 1
+glob rel 1
+glob result 2
+glob result vect 1
+glob retir 1
+glob retir ag 1
+glob rigid 1
+glob rigid transform 1
+glob router 1
+glob s epar 1
+glob satisf 1
+glob satisf gb 1
+glob satisf gener 1
+glob sem 1
+glob sem monot 1
+glob sembl 1
+glob sembl simposer 1
+glob shar 2
+glob shar inform 1
+glob shar list 1
+glob si 1
+glob smallest 1
+glob smallest el 1
+glob sont 1
+glob sont effectu 1
+glob sont rar 1
+glob spac 1
+glob splittingph 1
+glob splittingph algorithm 1
+glob st 5
+glob st inform 1
+glob stack 1
+glob stack pointer 1
+glob structur 1
+glob suiv 1
+glob suiv dun 1
+glob sum 1
+glob sur 2
+glob sur lallur 1
+glob sur le 1
+glob sur un 1
+glob syst 1
+glob syst ematiqu 1
+glob task 2
+glob tb 1
+glob telecommun 2
+glob telecommun conferec 1
+glob test 1
+glob test result 1
+glob topolog 1
+glob topolog return 1
+glob tout 1
+glob tout var 1
+glob trac 1
+glob trac edg 1
+glob union 1
+glob union oper 1
+glob valu 2
+glob valu dk 1
+glob var 4
+glob variabl 2
+glob ver 1
+glob ver la 1
+glob vi 1
+glob vi prior 1
+glob virtu 1
+glob virtu tim 1
+glob with unlim 1
+glob work 2
+glob work distribut 1
+glob work pool 1
+glob. 1
+glob.6 1
+glob7 1
+globalisabl 1
+globalisabl aux 1
+globalisabl aux variabl 1
+globalisabl dan 1
+globalisabl dan la 1
+globalisabl en 1
+globalisabl en glob 1
+globalisabl introduit 1
+globalisabl na 1
+globalisabl na pa 1
+globalisabl peuv 1
+globalisabl peuv etr 1
+globaliser 1
+globalmaxjq0j 1
+globalmaxjq0j2 1
+globalmaxjq1j 1
+globalmaxjq1j mn 1
+globalreduc 1
+globaux 1
+globaux de 1
+globew 1
+globew network 1
+globew network academ 1
+globin 1
+globin fam 1
+globin fam collect 1
+globin fold 1
+globin wa ext 1
+gloor 1
+glowinsk 1
+glowinsk et al 1
+glp 1
+glp respect 1
+glp to block 1
+glp using 1
+glpt76 1
+glt89 1
+glu 5
+glu and rog 1
+glu nail 1
+glu which ti 1
+gly 1
+gly tyr 1
+gly tyr pr 1
+glyn 1
+glyph 1
+glyph cal com 1
+glyph cal commerc 1
+glyph cal grav 1
+gm 5
+gm construc 1
+gm contain 1
+gm contain suff 1
+gm d vm 1
+gm is comput 1
+gm is project 1
+gm po 1
+gm problem 1
+gm problem appar 1
+gm procedur 1
+gm produc 1
+gm scenar 1
+gm situ 1
+gm x1 1
+gm xn 1
+gm87 1
+gm97 1
+gmbh 4
+gmbh zentralinstitut 1
+gmd 3
+gmd ii 1
+gmd stud 1
+gmd stud nr.143 1
+gmd.de 1
+gmdz.uucp 1
+gmgu 1
+gmp92 1
+gn 6
+gner 1
+gner funct 1
+gnu 1
+gnu cc 1
+go 46
+go as follow 1
+go beyon model 1
+go beyon multim 1
+go for cluster 2
+go for hardwar 1
+go fst 1
+go fst cand 1
+go further 2
+go int effect 1
+go int further 1
+go int pi 1
+go on step 1
+go queu 1
+go to andr 1
+go to dr 1
+go to ni 1
+go to ni0 1
+go to step 2
+go to switch 1
+go to ter 1
+go undetect 1
+go wrong 1
+goal 56
+goal about aspect 1
+goal and ind 1
+goal and match 1
+goal and pract 1
+goal and understand 1
+goal ar activ 1
+goal ar consum 1
+goal ar expr 1
+goal ar involut 1
+goal ar port 1
+goal ar post 1
+goal ar produc 1
+goal ar spawn 1
+goal ar susp 1
+goal at tim 1
+goal attach 1
+goal claus 2
+goal claus wh 1
+goal comput 1
+goal con 1
+goal concept 1
+goal contain 1
+goal context 1
+goal conv 1
+goal conv problem 1
+goal direct 1
+goal direct deduc 1
+goal direct proof 1
+goal dur st 1
+goal exact 1
+goal exact match 1
+goal exampl 1
+goal explain 1
+goal expr 1
+goal fail 1
+goal field 1
+goal for wc1 1
+goal for workflow 1
+goal g gener 1
+goal g0 1
+goal g2 1
+goal gener 1
+goal gi 1
+goal in design 1
+goal in develop 1
+goal in fact 1
+goal in mind 1
+goal in prog 1
+goal in transact 1
+goal init0 1
+goal init0 init1 1
+goal involut 1
+goal is assign 1
+goal is consider 1
+goal is denot 1
+goal is evalu 1
+goal is kept 1
+goal is perform 1
+goal is post 1
+goal is produc 2
+goal is reach 1
+goal is saf 1
+goal is select 1
+goal is solut 1
+goal is split 1
+goal is switch 1
+goal may over 1
+goal ment 1
+goal obtain 1
+goal of cl 2
+goal of collap 1
+goal of cost 1
+goal of decluster 1
+goal of lit 1
+goal of me 1
+goal of regr 1
+goal organ 1
+goal orient 2
+goal orient learn 1
+goal orient resourc 1
+goal pasc 1
+goal payoff 1
+goal pr 1
+goal pref 1
+goal prior 1
+goal prog 1
+goal satisf 1
+goal simultan 1
+goal to improv 1
+goal to learn 1
+goal tok 1
+goal user 1
+goal using 1
+goal we want 1
+goal wh valu 1
+goal which driv 1
+goal with respect 1
+goal would over 1
+goal yield 1
+goal1 1
+goal2 1
+goalor 1
+goalor dynam 1
+goalor dynam buffer 1
+goalvar 1
+goalvar is init 1
+god 1
+god lik extern 1
+goeman 1
+goeth 1
+goeth and j.j 1
+gog86 1
+gog93 1
+gogu 4
+gogu and adolf 1
+gogu on abstract 1
+gogu s parameter 1
+going 28
+going beyon integer 1
+going from maud 1
+going int detail 1
+going throughinterm 1
+going throughinterm partit 1
+going to alloc 1
+going to answer 1
+going to en 1
+going to find 1
+going to finish 1
+going to hap 1
+going to look 1
+going to perform 1
+going to us 2
+gol 1
+gol compl 1
+gol compl sequ 1
+gol sequ 1
+gol80 1
+gol87 1
+golberg 1
+gold 5
+gold coast 1
+gold standard 1
+gold transact 1
+goldberg 3
+goldberg and spencer 1
+goldberg et richardson 1
+goldblat 1
+goldfarb 1
+goldfeather 2
+goldfeather et al 1
+goldsmith 1
+goldstein 3
+golestan 1
+golf 1
+golf cour 1
+golumb 1
+gomard 2
+gon 2
+gon wrong 1
+gonnet 2
+gonz 1
+gonzalez 2
+gonzalez and sahn 1
+good 70
+good a partit 1
+good abstract 2
+good abstract oper 1
+good accur 1
+good accur transl 1
+good adapt 1
+good agr 1
+good amort 1
+good amort perform 1
+good analog 1
+good and accept 1
+good and bad 1
+good and fast 1
+good approxim 4
+good approxim solut 1
+good as spf 1
+good asymptot 1
+good asymptot perform 1
+good at model 1
+good ba 1
+good bal 1
+good becaus cluster 2
+good becaus fic 1
+good behavior 1
+good bound 1
+good browser 1
+good c book 1
+good candid 4
+good ch 5
+good chanc 3
+good clear 1
+good clear abstract 1
+good cluster 1
+good cluster proper 1
+good coar 1
+good coar schem 1
+good cod 1
+good collect 1
+good collect commun 1
+good computer 1
+good computer skil 1
+good configur 2
+good converg 1
+good curv 1
+good curv letter 1
+good dar 1
+good deal 1
+good decluster 1
+good denot 1
+good denot model 1
+good descript 1
+good design 2
+good design docum 1
+good edg 1
+good edg cut 1
+good educ 1
+good educ mater 1
+good estim 2
+good exampl 2
+good explan2 1
+good first ch 1
+good for compar 2
+good for design 1
+good for giv 1
+good gener 3
+good gener accur 1
+good gener possibil 1
+good grammat 1
+good grammat sen 1
+good guaranteed 1
+good guaranteed perform 1
+good hash 1
+good hash funct 1
+good hop 1
+good id 2
+good ind 2
+good init 2
+good init heur 1
+good init partit 1
+good introduc 1
+good is recur 1
+good knowledg 1
+good landmark 1
+good landmark candid 1
+good link 1
+good link cost 1
+good load 2
+good load bal 2
+good lower 1
+good lower bound 1
+good measur 1
+good moat 1
+good moat rout 1
+good new 1
+good numer 1
+good numer accur 1
+good object 1
+good object orient 1
+good of fit 1
+good of program 1
+good or bad 1
+good order 2
+good order techniqu 1
+good organ 2
+good organ pol 1
+good overview 1
+good pag 1
+good pag segm 1
+good parallel 2
+good parallel perform 1
+good parallel result 1
+good partit 2
+good perform 10
+good perform improv 1
+good pictur 1
+good pipelin 1
+good plac 1
+good plac procedur 1
+good pract 1
+good pract anyw 1
+good program 2
+good program map 1
+good program pract 1
+good prom 1
+good proper 1
+good qu 1
+good qu graph 1
+good reason 2
+good repl 1
+good repr 1
+good respon 1
+good respon tim 1
+good result 6
+good rl 1
+good scal 3
+good scal behavior 1
+good scal behaviour 1
+good schedl 1
+good secon 1
+good secon memor 1
+good separ 1
+good singl 1
+good singl disk 1
+good solut 4
+good spac 1
+good spac util 1
+good speed 1
+good speedup 1
+good st 1
+good st reduc 1
+good start 1
+good start point 1
+good strateg 1
+good styl 3
+good surv 1
+good test 1
+good test pract 1
+good textbook 1
+good th appl 1
+good th microprogram 1
+good th sub 1
+good then understand 1
+good thing 2
+good tn.spec 1
+good tn.spec tspec.good 1
+good to fal 1
+good tool 3
+good tool funct 1
+good tool support 1
+good transl 1
+good understand 2
+good univer 2
+good valu 1
+good ver 1
+good visu 1
+good visu interfac 1
+good with respect 1
+good work 1
+good work knowledg 1
+goodman 6
+goodrich 2
+goodrich an 1
+gop 1
+gopher 3
+gopher and www 1
+gopher.census.gov 1
+gopher.losr.cc.ca.us 1
+gopinath 1
+gopinath et al 1
+gopinath et al8 1
+gopt 1
+gopt tr 1
+gor 1
+gorad 1
+goralw 1
+gordon 2
+gordon and breach 2
+got 7
+got ar grat 1
+got bp 1
+got cl 1
+got cl pd 1
+got cl sp 1
+got l1 1
+got l1 endifexit 1
+got modest 1
+got modest result 1
+got n.m 1
+got on step 1
+got p adr 1
+got rel 1
+got rel ftp 1
+goteborg 2
+goth 1
+goth distribut 1
+goth distribut system 1
+goth et myoan 1
+gotlieb 1
+gottlieb 4
+gottlob 2
+goud 2
+goudreau 1
+goudreau et al 1
+goudreau gil 1
+gour 1
+gour dont le 1
+gouraud 1
+gouraud shad 1
+gourdon 1
+gourmand 1
+gourmand en 1
+govern 8
+govern if keyword 1
+govern th structur 1
+governm 5
+governm print 1
+governm print off 1
+govindan 1
+govindan mark 1
+gower 1
+gower tr 1
+goy 2
+gp 7
+gp algorithm 1
+gp algorithm jt 1
+gp and deg 1
+gp and gc 1
+gp and inclus 1
+gp and virtualclock 1
+gp at proc 1
+gp ba 1
+gp ba heur 1
+gp ba method 1
+gp ba order 1
+gp ba orer 1
+gp ffl nod 1
+gp gp 1
+gp int gc 1
+gp is comprom 1
+gp multiplec 1
+gp multiplexer 1
+gp ont gc 1
+gp scheduler 1
+gp scheduler prov 1
+gp serv 1
+gp server 1
+gp server initializ 1
+gp siml 1
+gp system 1
+gp90 1
+gp92 1
+gpb 1
+gpg 1
+gpk 1
+gpk or hpk 1
+gprfx 1
+gq 1
+gr 34
+gr 2d 1
+gr ac 4
+gr ac au 3
+gr ac aux 3
+gr algorithm 1
+gr algorithm converg 1
+gr algorithm describ 1
+gr algorithm mov 1
+gr algorithm schem 1
+gr and black 1
+gr and gklr 1
+gr and light 1
+gr ar 1
+gr background 1
+gr bin 1
+gr ce 1
+gr ce aux 1
+gr co 1
+gr cod 2
+gr converg 1
+gr dur refin 1
+gr et al 1
+gr for comput 1
+gr g38652 1
+gr g57864 1
+gr level 1
+gr method 1
+gr nod 2
+gr obner 1
+gr obner ba 1
+gr path 1
+gr probl 1
+gr probl em 1
+gr refin 1
+gr reg 1
+gr rement 1
+gr rement com 1
+gr repr 1
+gr repr pictur 1
+gr respect 1
+gr scal 2
+gr scal docum 1
+gr scal imag 1
+gr shad 1
+gr sous 1
+gr sous votr 1
+gr stat 1
+gr stat monograph 1
+gr temp 1
+gr tetrahedr 1
+gr tetrahedr compr 1
+gr vs 1
+gr vs gklr 1
+gr work 1
+gr71 1
+gr78 1
+gr81 1
+gr91 2
+gr93 1
+gr94 1
+graaf 1
+graaf and w.a 1
+graaff 1
+grab 1
+grabowsk 1
+grac 3
+grac degrad 1
+grac explain 1
+grac explain why 1
+grac.c.u 1
+grac.c.u tok.ac.jp 1
+grad 18
+grad algorithm 1
+grad and he 1
+grad approxim 1
+grad auf 1
+grad auf vektorrechern 1
+grad ba 1
+grad ba neur 1
+grad booch 2
+grad classiqu 1
+grad classiqu avec 1
+grad comp1 1
+grad comp1 f12 1
+grad de 2
+grad de perform 1
+grad de vol 1
+grad desc 5
+grad desc ba 1
+grad desc learn 1
+grad differ 1
+grad differ yj 1
+grad estim 1
+grad evalu 1
+grad evalu requir 1
+grad follow algorithm 1
+grad for solut 1
+grad forc 1
+grad forc tracf 1
+grad inform 1
+grad inform determin 1
+grad method 3
+grad optim 1
+grad optim techniqu 1
+grad parallel 1
+grad prop 1
+grad2 1
+grad4 1
+gradf 1
+gradf gravk 1
+gradf rollf 1
+gradf rollf windf 1
+gradientb 1
+gradientb learn 1
+gradientb learn algorithm 1
+gradsim 1
+gradu 13
+gradu cour 1
+gradu fellowship 3
+gradu harder 1
+gradu improv 1
+gradu pattern 1
+gradu pattern infrequ 1
+gradu refin 1
+gradu solut 1
+gradu solut hierarch 1
+gradu stud 3
+gradu stud research 1
+gradu transform 1
+graduel 1
+graduel de 1
+graduel de ce 1
+graduiertenkolleg 1
+graduiertenkolleg informatik 1
+graduiertenkolleg informatik und 1
+graf 3
+graham 3
+grain 18
+grain algorithm 1
+grain bar 1
+grain bar synchron 1
+grain but fewer 1
+grain commun 1
+grain commun character 1
+grain commun oper 1
+grain comput 1
+grain comput inh 1
+grain de 1
+grain de coh 1
+grain de don 1
+grain de maint 1
+grain de par 1
+grain de part 1
+grain de pr 1
+grain de transfer 1
+grain domain 1
+grain domain knowledg 1
+grain evalu 1
+grain fin 1
+grain fin tout 1
+grain import de 1
+grain inh 1
+grain inh concur 1
+grain le 1
+grain messagep 1
+grain messagep mach 1
+grain method 1
+grain mobil 1
+grain moder 1
+grain moder parallel 1
+grain multicomputer 1
+grain multitoler 1
+grain multitoler bar 1
+grain of coh 1
+grain oper 1
+grain parallel 2
+grain parallel task 1
+grain plus gr 1
+grain proc 1
+grain proc car 1
+grain program 1
+grain program satisf 1
+grain qu 1
+grain qu le 1
+grain simd 1
+grain simd hypercub 1
+grain siz 1
+grain solut 1
+grain solut allow 1
+grain to re 1
+grain trac 1
+grain trac opt 1
+grain view 1
+gral 1
+gral abstrait 1
+gral abstrait dun 1
+gral pour 1
+gral pour obtenir 1
+gram 7
+gram dmxp 1
+gram dmxp triangulair 1
+gram llk18 1
+gram s equentiel 1
+gram schimdt 1
+gram schmidt 1
+gram schmidt modif 1
+gram schmidt qu 1
+gram vi 1
+grammar 9
+grammar and assoc 1
+grammar and pseud 1
+grammar and transform 1
+grammar ar adequ 1
+grammar ar weak 1
+grammar ba 1
+grammar built 1
+grammar captur 1
+grammar captur styl 1
+grammar chang 1
+grammar contain 1
+grammar descript 1
+grammar fil 1
+grammar for concr 1
+grammar for thom 1
+grammar from sampl 1
+grammar in figur 2
+grammar in tabl 1
+grammar induc 1
+grammar infer 1
+grammar is as 1
+grammar is prob 1
+grammar modif 1
+grammar modif transform 1
+grammar new transform 1
+grammar origin 1
+grammar origin transform 1
+grammar spec 1
+grammar spec adapt 1
+grammar spec transform 1
+grammar specif 2
+grammar specif fil 1
+grammar specif script 1
+grammar that characteriz 1
+grammar us 1
+grammar with recur 1
+grammar.g 1
+grammar.g transform 1
+grammar.g transform fil 1
+grammat 5
+grammat by speaker 1
+grammat categor 1
+grammat correct 1
+grammat correct me 1
+grammat infer 3
+grammat infer ec 1
+grammat infer problem 1
+grammat infer system 1
+grammat infer task 1
+grammat model 1
+grammat rl 1
+grammat sen 1
+grammat tag 1
+grand 7
+grand approch 1
+grand approch de 1
+grand b en 1
+grand cat 1
+grand cat egor 1
+grand ch 1
+grand challeng 2
+grand challeng problem 1
+grand diffus 1
+grand ethn 1
+grand facilit 1
+grand group 1
+grand group ethniqu 1
+grand influenc 1
+grand int 1
+grand int er 1
+grand la 1
+grand la localit 1
+grand le 1
+grand le eff 1
+grand liber 1
+grand lign 2
+grand lign de 1
+grand lign dun 1
+grand lobt 1
+grand lobt de 1
+grand longueur 1
+grand longueur de 1
+grand majorit 1
+grand nombr 5
+grand nombr daller 1
+grand nombr de 3
+grand nombr denviron 1
+grand nombr dic 1
+grand nombr din 1
+grand ont 1
+grand ou 1
+grand parent 1
+grand part 4
+grand part de 4
+grand part du 1
+grand plaisir 1
+grand plaisir daccepter 1
+grand pour 1
+grand pour assurer 1
+grand pu 1
+grand pu de 1
+grand qu 1
+grand qu ceux 1
+grand qu la 1
+grand red 1
+grand red de 1
+grand rigueur 1
+grand rigueur qu 1
+grand risqu 1
+grand risqu de 1
+grand sen 1
+grand sensibilit 1
+grand similarit 1
+grand soin 1
+grand soin lu 1
+grand sp 1
+grand sp ec 1
+grand tail 3
+grand tail de 1
+grand tail est 1
+grand utilit 1
+grand valeur 1
+grand valeur du 1
+grandeur 3
+grandeur caract 1
+grandeur caract eristiqu 1
+grandeur d efin 1
+grandeur de 1
+grandeur de la 1
+grandeur du 1
+grandeur du co 1
+grandeur qu 1
+grandeur qu la 1
+grandeur un 1
+grandeur un solut 1
+grandmother 1
+grandmother cel 1
+grandmother modl 1
+grandpar 1
+granl 14
+granl allow 1
+granl allow method 1
+granl and perform 1
+granl at claus 1
+granl enabl 1
+granl enabl great 1
+granl is finer 1
+granl issu 2
+granl lock 2
+granl of host 1
+granl of lock 1
+granl of proc 1
+granl of transfer 1
+granl of work 1
+granst 1
+granst et al 1
+granst et h.a.g 1
+grant 47
+grant a3379 1
+grant ccr 11
+grant ccr8701671 1
+grant ccr89 1
+grant cd 1
+grant cd9414015 1
+grant council 1
+grant daal03 1
+grant dcr 1
+grant f49620 1
+grant for non 1
+grant from ibm 2
+grant from microsoft 1
+grant from novel 1
+grant gr 2
+grant gr g38652 1
+grant gr g57864 1
+grant if appropr 1
+grant in aid 1
+grant int 1
+grant ir 4
+grant mip 4
+grant n00014 1
+grant n0001492f1375 1
+grant nsf 1
+grant nsf ccr 1
+grant number 3
+grant number ccr 1
+grant number j2 1
+grant number nag 1
+grant number nag1 1
+grant ogp0041630 1
+grant ogp0951 1
+grant rq 1
+grant schem 1
+grant th lock 1
+grant th request 1
+grant th user 1
+grant that cap 1
+granularit 1
+granularit e de 1
+granularit e du 1
+granvil 1
+graph 77
+graph a croiser 1
+graph account 1
+graph ad 1
+graph adm 1
+graph after coar 1
+graph after uncoar 1
+graph al anchor 1
+graph al show 1
+graph algebr 1
+graph algorithm 4
+graph an 1
+graph anchor 1
+graph and algorithm 1
+graph and appl 3
+graph and assign 1
+graph and cf 1
+graph and chord 1
+graph and compiler 1
+graph and computer 1
+graph and follow 1
+graph and imag 2
+graph and near 1
+graph and produc 1
+graph and propag 1
+graph and ref 1
+graph and report 1
+graph and t0 1
+graph and targ 1
+graph and test 1
+graph and textu 1
+graph and tr 1
+graph and weight 1
+graph annot 1
+graph appl 2
+graph appl targ 1
+graph ar 2
+graph ar allow 1
+graph ar assign 1
+graph ar correct 1
+graph ar dataflow 1
+graph ar giv 2
+graph ar log 1
+graph ar sub 1
+graph ar textur 1
+graph architectur 1
+graph as requir 1
+graph as shown 1
+graph assoc 2
+graph assoc model 1
+graph attribut 1
+graph augm 1
+graph augm problem 1
+graph ba 5
+graph ba algorithm 1
+graph ba approach 1
+graph ba implem 1
+graph ba langu 1
+graph ba method 1
+graph ba partit 1
+graph ba specif 1
+graph between nod 1
+graph bisect 1
+graph bisect ph 1
+graph bisect yield 1
+graph block 1
+graph break 1
+graph build 1
+graph builder 1
+graph by bind 1
+graph by collap 1
+graph by introduc 2
+graph by mean 1
+graph by near 1
+graph by partit 1
+graph by show 1
+graph by using 1
+graph c belong 1
+graph can ea 1
+graph carv 1
+graph caus 1
+graph challeng 1
+graph coar 1
+graph coder 1
+graph color 2
+graph color inst 1
+graph color problem 1
+graph compon 1
+graph con 2
+graph configur 1
+graph configur tim 1
+graph confirm 2
+graph contain 3
+graph contract 1
+graph correspon 3
+graph de 3
+graph de dappar 1
+graph de etat 1
+graph de flot 1
+graph de marqu 1
+graph debugger 1
+graph defin 1
+graph denot 1
+graph depict 2
+graph deriv 1
+graph describ 1
+graph designer 1
+graph disconnect 1
+graph displ 1
+graph displ effect 1
+graph dordonnanc 1
+graph dordonnanc perm 1
+graph du 1
+graph du graph 1
+graph edg 1
+graph edit 1
+graph emph 1
+graph eng 1
+graph eng receiv 1
+graph eng transform 1
+graph et de 1
+graph evolut 1
+graph exchang 1
+graph exchang format 1
+graph explan 1
+graph expr 2
+graph expr dat 1
+graph fish 1
+graph fish view 1
+graph float 1
+graph float den 1
+graph for 1
+graph for compan 1
+graph for inst 1
+graph for lower 1
+graph for main 1
+graph for sy0 1
+graph for us 1
+graph form 3
+graph forml 1
+graph framework 1
+graph from compan 1
+graph from fortran 1
+graph from homework 1
+graph g induc 1
+graph g0 3
+graph g1 2
+graph g1 graph 1
+graph g1 produc 1
+graph g2 2
+graph g3 1
+graph g4 1
+graph gblog 1
+graph gblog tc 1
+graph gc 1
+graph gd 1
+graph gener 2
+graph gener nam 1
+graph gener random 1
+graph gf 1
+graph gi 2
+graph gic1 1
+graph gm 1
+graph gm produc 1
+graph gn 1
+graph gp 1
+graph group 1
+graph grow 1
+graph grow heur 1
+graph ha shrunk 1
+graph ha smaller 1
+graph head 1
+graph imag 1
+graph imag ie 1
+graph in figur 10
+graph in march 1
+graph in not 1
+graph in order 1
+graph in softwar 1
+graph in system 1
+graph in tabl 1
+graph in term 1
+graph inc 1
+graph inclus 1
+graph incorpor 1
+graph incorpor dat 1
+graph inform 1
+graph inform pr 1
+graph inherit 1
+graph input 1
+graph int 1
+graph int height 1
+graph int mac 1
+graph int min 1
+graph int seed 1
+graph integr 1
+graph integr dat 1
+graph interfac 5
+graph interfac pop 1
+graph interpr 1
+graph involut 1
+graph involut pa 1
+graph is abstract 1
+graph is activ 1
+graph is acycl 1
+graph is avail 1
+graph is biconnect 1
+graph is bisect 1
+graph is bridgeconnect 1
+graph is ch 1
+graph is closer 1
+graph is comput 1
+graph is creat 1
+graph is denot 1
+graph is describ 2
+graph is disconnect 1
+graph is du 1
+graph is evolut 1
+graph is exact 1
+graph is found 1
+graph is gener 1
+graph is identif 1
+graph is label 1
+graph is leg 1
+graph is modif 1
+graph is reduc 1
+graph is regard 1
+graph is respon 1
+graph is shown 2
+graph is simil 1
+graph is spar 1
+graph is strong 1
+graph is uncoar 1
+graph isomorph 1
+graph isomorph di 1
+graph isomorph problem 1
+graph issus 1
+graph issus du 1
+graph just construc 1
+graph kn 1
+graph langu 1
+graph leav 1
+graph mach 1
+graph maint 1
+graph maint algorithm 1
+graph map 1
+graph match 1
+graph may chang 1
+graph may result 1
+graph method 1
+graph min 1
+graph min graph 1
+graph mlkp 1
+graph mlkp produc 1
+graph model 4
+graph model facilit 1
+graph model pr 1
+graph model prop 1
+graph modeler 1
+graph modeler anim 1
+graph must inclus 1
+graph narrow 1
+graph narrow abstract 1
+graph narrow mach 1
+graph nest 1
+graph nest donc 1
+graph nod 1
+graph not 2
+graph not involut 1
+graph object 3
+graph object displ 1
+graph object natur 1
+graph occur 1
+graph of concept 1
+graph of constraint 1
+graph of degr 1
+graph of dep 1
+graph of figur 1
+graph of greed 1
+graph of lin 1
+graph of lp 1
+graph of object 1
+graph of siz 1
+graph of var 1
+graph on parallel 1
+graph on point 1
+graph on step 1
+graph oper 1
+graph oper requir 1
+graph optim 1
+graph optim problem 1
+graph or imag 1
+graph organ 1
+graph other 1
+graph parameter 1
+graph part 1
+graph part shar 1
+graph partit 4
+graph partit algorithm 2
+graph partit algorithmand 1
+graph partit ba 1
+graph partit heur 1
+graph partit method 1
+graph partit pack 1
+graph partit problem 2
+graph partit schem 1
+graph partit tak 1
+graph partit work 1
+graph partitioningalgorithm 1
+graph path 1
+graph path definit 1
+graph pg 1
+graph plur 1
+graph po 1
+graph power 1
+graph preproc 1
+graph privileg 1
+graph privileg se 1
+graph problem 1
+graph produc 1
+graph program 1
+graph quen 1
+graph quen compr 1
+graph receiv 1
+graph receiv high 1
+graph reduc 1
+graph reducemac16 1
+graph reducemin16 1
+graph reg 1
+graph remain 1
+graph remain invar 1
+graph render 1
+graph repr 8
+graph repr maintain 1
+graph research 1
+graph research group 1
+graph rg 1
+graph rol 1
+graph rol coupl 1
+graph separ 1
+graph short 1
+graph show 1
+graph shown 3
+graph sinc path 1
+graph spanner 1
+graph specif 2
+graph start 2
+graph stat 1
+graph structur 4
+graph structur dat 1
+graph sub 1
+graph sub reg 1
+graph sub sourc 1
+graph subblock 1
+graph subreg 1
+graph suff 1
+graph supercomputer 1
+graph supercomputer model 1
+graph system 2
+graph system becom 1
+graph system using 1
+graph tak 1
+graph th number 1
+graph that connect 1
+graph that correspon 1
+graph that li 1
+graph that repr 1
+graph theor 10
+graph theor algorithm 1
+graph theor approach 1
+graph theor concept 1
+graph theor condit 1
+graph theor issu 1
+graph theor problem 2
+graph theor suff 1
+graph theor techniqu 1
+graph theor term 1
+graph through nod 1
+graph to impl 1
+graph to incr 1
+graph to model 1
+graph to reach 1
+graph to select 1
+graph to stud 1
+graph to weight 1
+graph traver 1
+graph upon coar 1
+graph us 1
+graph user 5
+graph user displ 1
+graph user interfac 5
+graph valu 1
+graph var 1
+graph ver 1
+graph void 1
+graph void printtr 1
+graph walk 1
+graph walk requir 1
+graph we pick 1
+graph we se 1
+graph wel form 1
+graph wer modif 1
+graph wer se 1
+graph wh 1
+graph wh hamilt 1
+graph wh maxim 1
+graph wh nod 2
+graph wh ver 2
+graph when interpr 1
+graph which allow 1
+graph which def 1
+graph which describ 1
+graph which detail 1
+graph which remov 1
+graph whil preserv 1
+graph wil con 1
+graph with concr 1
+graph with discr 1
+graph with edg 1
+graph with fact 1
+graph with minim 1
+graph with perform 1
+graph with privileg 1
+graph with propag 1
+graph with siz 1
+graph with syntac 1
+graph with targ 1
+graph with tot 1
+graph with weight 1
+graph workst 3
+graph would remain 1
+graph y1 1
+graph yield 1
+graphb 1
+graphb propag 1
+graphb propag pattern 1
+graphnarrow 1
+graphnarrow mach 1
+graphnarrow mach ibam 1
+grat 14
+grat acknowledg 7
+grat acknowledg daniel 1
+grat to frank 1
+grat to john 1
+grat to oliv 1
+grat to ray 1
+grat to ro 1
+graub 1
+grav 5
+grav accent 1
+grav approach 1
+grav le 1
+grav or stag 1
+grav qu 1
+grav qu dan 1
+grav versus stag 1
+grav wonder 1
+grav wonder everd 1
+gravit 1
+gravk 1
+graylevel 1
+graylevel grad 1
+great 39
+great acknowledg 1
+great an effort 1
+great apprec 1
+great benefit 1
+great bod 1
+great concern 1
+great contribut 1
+great deal 8
+great differ 1
+great domin 1
+great exper 1
+great extent 1
+great facilit 2
+great flec 2
+great from disc 1
+great id 1
+great impact 1
+great import 1
+great improv 1
+great in load 1
+great incr 1
+great lak 1
+great major 1
+great man aspect 1
+great man tabl 1
+great multipl 1
+great number 2
+great part 1
+great pot 1
+great pot appl 1
+great problem 1
+great prom 2
+great reduc 4
+great reduc turn 1
+great remov 1
+great rumor 1
+great short 1
+great simplif 8
+great simplif further 1
+great simplif unif 1
+great simplif val 1
+great strength 1
+great support 1
+great th proof 1
+greater 52
+greater amount 1
+greater benefit 1
+greater bisect 2
+greater bisect bandwidth 2
+greater chanc 1
+greater context 1
+greater demand 3
+greater detail 3
+greater detail using 1
+greater flec 1
+greater freedom 1
+greater in ttl 1
+greater interact 1
+greater number 3
+greater open 1
+greater or equ 4
+greater or lesser 2
+greater pinout 2
+greater pot 1
+greater reduc 1
+greater resolut 1
+greater saving 1
+greater scop 1
+greater slop 1
+greater spur 1
+greater spur oscil 1
+greater st 1
+greater st reduc 1
+greater system 2
+greater system vol 2
+greater than 60k 1
+greater than blog 1
+greater than fi 1
+greater than li 1
+greater than lin 1
+greater than tw 2
+greater tim 1
+greater var 1
+greatest 12
+greatest amount 1
+greatest benefit 1
+greatest bound 1
+greatest challeng 2
+greatest challeng fac 1
+greatest common 1
+greatest common div 1
+greatest differ 1
+greatest flec 1
+greatest import 1
+greatest improv 1
+greatest lower 2
+greatest lower bound 2
+greatest marker 1
+greatest number 1
+greec 2
+greed 11
+greed algorithm 2
+greed and neur 1
+greed and random 1
+greed consider 1
+greed fash 1
+greed find 1
+greed heur 1
+greed merg 1
+greed merg sort 1
+greed or glob 1
+greed refin 1
+greed refin algorithm 1
+greed refin coupl 1
+greed refin pol 1
+greed search 1
+greef 1
+greef p.de 1
+greek 1
+greek letter 1
+green 5
+green and blu 1
+green and mark 1
+green and unmark 1
+green nod 1
+greenb 1
+greenbeb 1
+greenberg 1
+greenstr 1
+greenstr and an 1
+greenstr and ka 1
+greenstr and li 1
+greg 5
+greg nelson 1
+greg nuy 1
+greg rothermel 1
+greg turner 1
+greg turner arm 1
+gregor 5
+gregor bochman 1
+gregor calendar 1
+gregor chan 1
+gregor kicz 1
+gregt 1
+gregt adelphiassb01.arm.mil 1
+grenander 1
+grenobl 3
+grenobl ii 1
+grer 2
+grer ce 1
+grer ce calcl 1
+grer dan 1
+grer dan le 1
+grer de 1
+greysc 1
+gribskov 1
+grid 11
+grid appl 1
+grid appl wh 1
+grid architectur 2
+grid ba 1
+grid ba structur 1
+grid by subtract 1
+grid exact 1
+grid fil 2
+grid for dent 1
+grid is split 1
+grid nod 1
+grid of sidelength 1
+grid of siz 2
+grid siz 1
+grid to begin 2
+grid wh 1
+grid without obtus 1
+grid would cost 1
+grid. 2
+grieger 1
+griff 1
+griffith 2
+griffith univer nathan 1
+grig 1
+gril 3
+gril de 2
+gril de la 1
+gril discr 1
+gril discr es 1
+gril im 1
+gril im hemingw 1
+gril in californ 1
+gril origin 1
+gril origin est 1
+grim 1
+grim reaper 1
+grimson 1
+griswold 1
+griswold and david 1
+griswold notkin 1
+grobner 1
+grobner ba 1
+groff 1
+grosserer 1
+ground 8
+ground atom 2
+ground atom forml 1
+ground atom impl 1
+ground canon 1
+ground canon contextu 1
+ground fact 1
+ground for autom 1
+ground for clu 1
+ground for dism 1
+ground inst 1
+ground se 1
+ground term 2
+ground that int 1
+ground truth 1
+ground truth dat 1
+groundbreak 1
+groundbreak work 1
+group 67
+group 9th 1
+group 9th annu 1
+group a sequ 1
+group accord 1
+group ag 1
+group ag sur 1
+group ain 1
+group ain obtenu 1
+group altern 1
+group an aud 1
+group and dynam 1
+group and group 1
+group and tak 1
+group approach 1
+group ar cap 1
+group ar identif 1
+group ar natur 1
+group ar writ 1
+group at m.i.t 1
+group ba 1
+group belong 1
+group by fund 1
+group by group 1
+group can proceed 1
+group center 1
+group chang 1
+group com 1
+group commun 3
+group commun proc 1
+group commun protocol 1
+group con 2
+group contain 1
+group correspon 1
+group dan 1
+group de 4
+group de li 1
+group de program 1
+group de similitud 1
+group de tableaux 1
+group de transform 1
+group design 1
+group disotrop 1
+group distinct 1
+group doing remot 1
+group ee 1
+group ee en 1
+group effort 1
+group en 1
+group en appliqu 1
+group et dautr 1
+group et le 1
+group ethniqu 1
+group first me 1
+group for creat 1
+group for digit 1
+group for int 1
+group form 1
+group from buck 1
+group from sj 1
+group g1 1
+group gi 1
+group ha multicast 1
+group hpf 1
+group hpf compiler 1
+group identif 1
+group in consecut 1
+group in dat 1
+group ind 1
+group is assign 1
+group is author 1
+group is avail 1
+group is grat 1
+group is greater 1
+group is modif 1
+group is st 1
+group is structur 1
+group mad 1
+group may giv 1
+group me 1
+group member 3
+group membership 3
+group membership facil 1
+group membership protocol 2
+group multicast 2
+group multicast commun 1
+group nod 2
+group of 2d 1
+group of 2n 1
+group of 4n2 1
+group of act 1
+group of arbitr 1
+group of atom 1
+group of block 1
+group of character 1
+group of cl 1
+group of claus 1
+group of collabor 2
+group of concur 1
+group of consecut 2
+group of cooper 1
+group of edg 1
+group of field 1
+group of forml 1
+group of inform 1
+group of interrel 1
+group of light 1
+group of lock 1
+group of method 2
+group of nod 3
+group of observ 1
+group of oper 1
+group of proc 1
+group of rel 1
+group of research 1
+group of siz 3
+group of st 1
+group of strateg 1
+group on computer 1
+group on manag 1
+group opt 1
+group opt prov 1
+group ou 1
+group ou un 1
+group paper 1
+group paper ps 1
+group parenth 1
+group per bar 1
+group per targ 1
+group perform 1
+group pointer 1
+group privileg 1
+group proc 1
+group program 1
+group program langu 1
+group prov 1
+group random 1
+group record 1
+group rel 1
+group rel docum 1
+group rol 1
+group select 1
+group simil 1
+group simil dat 1
+group siz 2
+group siz incr 2
+group sum 1
+group task 1
+group task typ 1
+group technolog 1
+group th item 1
+group that fal 1
+group that model 1
+group theor 1
+group theor method 1
+group threshold 1
+group throughput 1
+group to cluster 1
+group to maintain 1
+group together dat 1
+group top 1
+group top peopl 1
+group using 1
+group wa support 1
+group wer solut 1
+group wer view 1
+group wh commun 1
+group with artif 1
+group work 1
+groupwar 1
+groupwar technolog 1
+grov 3
+grow 34
+grow adapt 1
+grow adapt object 1
+grow and pot 1
+grow and prun 1
+grow asymptot 1
+grow awar 1
+grow continu 2
+grow disjoint 1
+grow disjoint subtr 1
+grow disproport 1
+grow even wor 1
+grow expon 1
+grow fragm 1
+grow fragm comb 1
+grow heur 1
+grow hierarch 1
+grow in tim 1
+grow layer 1
+grow lin 2
+grow mor rapid 1
+grow number 2
+grow ph 1
+grow ph simil 1
+grow proport 1
+grow quick 1
+grow recognit 1
+grow slight 1
+grow slight faster 1
+grow slight slower 1
+grow sourc 1
+grow super 1
+grow super lin 1
+grow th zon 1
+grow tw 1
+grow under technolog 1
+grow vol 1
+grow without actu 1
+grown 7
+grown aren 1
+grown by explor 1
+grown by inclus 1
+grown in phy 2
+grown produc 1
+grown signif 1
+grown signif rel 1
+growth 12
+growth and obtain 1
+growth and requir 1
+growth by mean 1
+growth comparison 1
+growth in appl 1
+growth in bisect 2
+growth in cluster 2
+growth melt 1
+growth of candid 1
+growth of fragm 1
+growth of pincount 2
+growth of proc 2
+growth plan 1
+growth plan con 1
+growth rat 1
+growth rat comparison 1
+growth rat funct 1
+growth siml 1
+growth support 1
+grph 1
+grph object 1
+grph object pictur 1
+gruber 1
+grun 1
+gruyter 1
+gs 4
+gs cur 1
+gs cur iter 1
+gs gb 1
+gs gb wcb 1
+gs1000 1
+gs93 1
+gsb 1
+gsen 1
+gsen cl connect 1
+gser 1
+gsm 1
+gsm constraint 1
+gsm constraint hierarc 1
+gsm lack 1
+gsm requir 1
+gsm satisf 1
+gsmnd 1
+gsmnd k8 1
+gsmnd k8 ken18 1
+gsync 1
+gt 5
+gt 1gi 1
+gt c gt 1
+gt denot 1
+gt f tg 1
+gt gi 1
+gt gi di 1
+gt gi dt 1
+gt intn 1
+gt is restrict 1
+gt nj0 1
+gt nj0c 1
+gt nj0c rpb 1
+gt prototyp 1
+gt prototyp con 1
+gt realn 1
+gtop 1
+gtop som ztop 1
+gtop with gtop 1
+gu 13
+gu an assignm 1
+gu and cpu 1
+gu and tim 1
+gu and verif 1
+gu ar sequ 1
+gu as fast 1
+gu assignm 1
+gu cr 1
+gu cr unsatisf 1
+gu decr 1
+gu develop 1
+gu dexempl 1
+gu growth 1
+gu growth comparison 1
+gu in np 1
+gu is plot 1
+gu is requir 1
+gu lead 1
+gu lik 1
+gu lik answer 1
+gu nam 1
+gu non 1
+gu non determin 1
+gu obtain 1
+gu obtain using 1
+gu on pr60 1
+gu or backtrack 1
+gu or branch 1
+gu rang 1
+gu seem 1
+gu th compl 1
+gu th result 1
+gu than dpl 1
+gu than prev 1
+gu var 1
+gu y correspon 1
+gu ziec 1
+guag 1
+guag th perform 1
+guang 1
+guar 50
+guar a saf 1
+guar a weak 1
+guar about compon 1
+guar an appropr 1
+guar atom 1
+guar bal 1
+guar bal acc 1
+guar behavior 1
+guar behavior con 1
+guar correct 2
+guar deadlock 1
+guar deadlock fr 1
+guar del 1
+guar del jitter 1
+guar effect 1
+guar effect decoupl 1
+guar ensur 1
+guar equiv 1
+guar extern 1
+guar extern st 1
+guar for 1
+guar for individu 1
+guar for progr 1
+guar for synchron 1
+guar freedom 1
+guar good 1
+guar good spac 1
+guar high prob 1
+guar invar 1
+guar nonblock 1
+guar oc 1
+guar of ffq 1
+guar of form 1
+guar real tim 1
+guar recov 1
+guar recov idempot 1
+guar rel 2
+guar rel deliv 1
+guar saf 1
+guar syntact 1
+guar syntact adequ 1
+guar term 1
+guar th avail 1
+guar th con 1
+guar th de 1
+guar th ec 1
+guar th glob 1
+guar th oc 1
+guar th oper 1
+guar th real 1
+guar th rel 1
+guar th smooth 1
+guar th suff 1
+guar th thing 1
+guar th val 1
+guar th weaker 1
+guar that conver 1
+guar that fl 1
+guar that job 1
+guar that me 1
+guar that recov 1
+guar that sf2c 1
+guar that step 1
+guar to prev 1
+guar uniqu 1
+guar virtu 1
+guar virtu synchron 1
+guar wel kind 1
+guar would ensur 1
+guaran. 1
+guaranteed 34
+guaranteed by mak 1
+guaranteed in gener 1
+guaranteed perform 1
+guaranteed rat 1
+guaranteed subject 1
+guaranteed that tr 1
+guaranteed to compl 1
+guaranteed to fit 1
+guaranteed to halt 1
+guaranteed to li 2
+guaranteed to reach 1
+guaranteed to return 1
+guaranteed with prob 1
+guard 9
+guard act 1
+guard and bod 1
+guard ar test 1
+guard bod 1
+guard command 2
+guard command not 1
+guard command specif 1
+guard condit 1
+guard equ 1
+guard evalu 2
+guard expr 1
+guard gi 1
+guard is satisf 1
+guard method 1
+guard method invoc 1
+guard should tak 1
+guard stop 1
+guard.ch 1
+guard.ch boolean 1
+guard.ch boolean proc 1
+guard.ch j condit 1
+guardedch 1
+gucht 1
+gudeman 1
+gudmundsson 1
+guesswork 1
+guest 1
+guest edit 1
+guest edit introduc 1
+guid 34
+guid act 1
+guid act select 1
+guid ain 1
+guid ain lexplor 1
+guid and encourag 1
+guid and refer 3
+guid aspect 1
+guid by particl 1
+guid by pr 1
+guid by pract 1
+guid de 2
+guid de la 1
+guid de ressourc 1
+guid e par 1
+guid e uniqu 1
+guid ee 1
+guid ee avec 1
+guid ee est 1
+guid es 1
+guid es par 1
+guid et un 1
+guid fit 1
+guid fit intuit 1
+guid for pen 1
+guid interact 1
+guid issu 1
+guid issu de 1
+guid lalgorithm 1
+guid on gestur 1
+guid pa 1
+guid pa suffisam 1
+guid seem 1
+guid siml 1
+guid test 1
+guid test ca 1
+guid th complec 1
+guid th developm 2
+guid th explan 1
+guid th gener 1
+guid th knowledg 1
+guid th programmer 1
+guid th proof 1
+guid th siml 1
+guid th stud 1
+guid to develop 1
+guidel 10
+guidel and consider 2
+guidel ar accept 1
+guidel ar avail 1
+guidel ar pr 1
+guidel ar subject 1
+guidel ar val 1
+guidel assum 2
+guidel ba 2
+guidel for build 2
+guidel for ch 1
+guidel for determin 1
+guidel framework 2
+guidel framework siml 2
+guidel lead 1
+guidel of inform 1
+guidel pr 1
+guidel to libr 1
+guidel to mak 1
+guidel to organ 1
+guidel to system 2
+guidel using 1
+guidel using larger 1
+guidel we assum 1
+guidel which hold 2
+guider 3
+guider la 2
+guider la recherch 1
+guider la siml 1
+guider le 1
+guider le ch 1
+guillerm 1
+guillerm arang 1
+gultekin 1
+gultekin ozsoyoglu 1
+gun86 1
+gunadh 1
+gunadh and ar 1
+gunadh event 1
+gunadh event join 1
+gunderson 1
+gunnar 1
+gunnar overgaard 1
+gunter 2
+gunter and john 1
+gunther 1
+gupt 14
+gupt and kumar 1
+gupt and vipin 1
+gupt et w.d 1
+gur 1
+gur88 1
+gur91 1
+gurd 1
+gurdip 1
+gurdip singh 1
+gurevich 2
+gurevich evolut 1
+gurevich evolut algebr 1
+gurevich not 1
+gurl 1
+gustav 1
+gustav streseman 1
+gustav streseman institut 1
+gut84a 1
+gut84b 1
+guttman 1
+guyon 2
+gvu 1
+gw 3
+gw hsing 1
+gw hsing yu 1
+gw kingsum 1
+gw kingsum th 1
+gw1 1
+gw93 1
+gwc1 1
+gwc1 fl 1
+gwc1 wp 1
+gwc1 wp wt 1
+gwc2 1
+gwc2 fl 1
+gx 1
+gx contain 1
+gxj0 1
+gy 1
+gysin 1
+gysin and jennifer 1
+gyur 1
+gyur laj 1
+gz0 1
+gz0 prfgt 1
+gz0 prfgt 1gz1 1
+h.a 1
+h.a.g 1
+h.b 1
+h.c 2
+h.d 1
+h.e 1
+h.f 2
+h.g 1
+h.html 1
+h.j 2
+h.k 1
+h.k.n 1
+h.kasahar 1
+h.l 1
+h.m 1
+h.p 1
+h.r 1
+h.s 1
+h.t 2
+h.v 2
+h.w 1
+h0 5
+h0 l0 1
+h0 l00 1
+h01 1
+h02 1
+h02 h01 1
+h03 1
+h03 h02 1
+h03 h02 h01 1
+h04 1
+h04 h03 1
+h04 h03 h02 1
+h0i 1
+h0n 1
+h1 8
+h1 h2 1
+h1 h2 h3 1
+h1 par 1
+h1 par lappl 1
+h1 with abff 1
+h1k 1
+h1n 1
+h2 5
+h2 h3 1
+h2 h3 h4 1
+h2k 1
+h2n 2
+h3 2
+h3 h4 1
+h3 h4 h04 1
+h3a 1
+h3a 2a7 1
+h4 2
+h4 h04 1
+h4 h04 h03 1
+h5 1
+h6 1
+h8 1
+h8m0 1
+h8q 1
+h8x0 1
+ha 7
+ha diagram 1
+ha fw22 1
+ha fw22 wp.html 1
+ha0 1
+ha87 1
+haag 1
+haar 1
+haberman 1
+habit 3
+habit and character 1
+habit ten 1
+habit that other 1
+habitud 1
+habitud de 1
+habitud de program 1
+habituel 2
+habituel avec 1
+habituel avec de 1
+habituel compil 1
+habituel compil es 1
+habituel d ecrit 1
+habituel daccessibilit 1
+habituel dan 1
+habituel dan le 1
+habituel de 1
+habituel de la 1
+habituel du 1
+habituel du calcl 1
+habituel est 1
+habituel est qu 1
+habituel idiosyncr 1
+habituel idiosyncr de 1
+habituel pa 1
+habituel pa de 1
+habituel par 1
+habituel par un 1
+habituel un ou 1
+habituel un paradigm 1
+habituel util 1
+habituel util es 1
+hach 1
+hach de 1
+hach de lespac 1
+hach g om 1
+hachman 1
+hack 1
+hadamard 1
+hadamard matr 1
+haderl 2
+hadzilac 2
+haerder 1
+hafner 1
+hag 1
+hag and andrew 1
+hagerst 2
+hagerst and seif 2
+haghighat 2
+haghighat and polychronopoul 1
+hagl 1
+hahad 1
+hahn 1
+hahn ring 1
+haif 2
+hair 1
+hajek 1
+hajek and sasak 1
+hakim 3
+hakim meadow 1
+hal 44
+hal allow 1
+hal and abcl 1
+hal architectur 1
+hal charlottesvil 1
+hal compiler 1
+hal compiler gener 1
+hal condit 1
+hal condit follow 1
+hal condit hold 1
+hal for eff 1
+hal incorpor 1
+hal intern 3
+hal intern ser 1
+hal is design 1
+hal milt 1
+hal milt keyn 1
+hal mur 1
+hal program 1
+hal program run 1
+hal proper 1
+hal proper follow 1
+hal prov 1
+hal should support 1
+hal support 1
+hal tak 1
+hal theorem 1
+hal theorem hold 1
+half 36
+half a billion 1
+half a day 1
+half a year 1
+half adder 1
+half adder circuit 1
+half an hour 1
+half b tr 1
+half for direct 1
+half hour 1
+half interv 1
+half it key 1
+half it maxim 1
+half of c2i 1
+half of column 1
+half of figur 2
+half of window 1
+half plan 1
+half spac 1
+half split 1
+half split oper 1
+half techniqu 1
+half th dr 1
+half th key 1
+half th length 1
+half th nearest 1
+half th number 1
+half th sidelength 1
+half th st 1
+half th valu 1
+half to find 1
+half ton 1
+half ton text 1
+halfadder 1
+halfw 1
+hallam 2
+halld 1
+halld orsson 1
+halld orsson approxim 1
+halm 1
+halpern 1
+halstead 2
+halstead jr 1
+halt 11
+halt by deadlock 1
+halt by produc 1
+halt cur 1
+halt cur run 1
+halt exact 1
+halt in finit 1
+halt nor chang 1
+halt prematur 1
+halt prob 1
+halt program 1
+halt situ 1
+halt th addit 1
+halt th cur 1
+halt th del 1
+halt when pr 1
+halt with succ 1
+halv 2
+ham 6
+ham dist 4
+ham entr 1
+ham entr le 1
+hamach 1
+hamid 1
+hamid pirahesh 1
+hamilt 6
+hamilt and thus 1
+hamilt cycl 1
+hamilt cycl h1 1
+hamilt graph 1
+hamilt of graph 1
+hamilt path 2
+hamilt path hk 1
+hamilt path pi 1
+hamilt path problem 1
+hamilt proper 1
+hamilt quest 1
+hamilt quest natur 1
+hamilt system 1
+haml 1
+hammer 1
+hammerstrom 1
+hammon 1
+hamper 1
+hamsch 1
+han 5
+han benker 1
+han peter 1
+han peter kriegel 1
+han91 1
+hanazaw 1
+hand 72
+hand a singl 1
+hand ad 1
+hand built 1
+hand built hierarch 1
+hand cod 1
+hand cod simpl 1
+hand drawn 1
+hand drawn pict 1
+hand edg 1
+hand edit 1
+hand held 1
+hand held recorder 1
+hand in theorem 1
+hand inclus 1
+hand is solut 1
+hand libr 1
+hand libr upd 1
+hand of numer 1
+hand on approach 1
+hand on exerc 1
+hand on se 1
+hand pa 1
+hand pa midnight 1
+hand pick 1
+hand prem 1
+hand requir 1
+hand resolut 1
+hand resolut obv 1
+hand show 1
+hand sid 12
+hand sid prov 1
+hand sid repr 1
+hand sid unif 1
+hand sid ver 1
+hand sid yield 1
+hand specif 2
+hand specif repr 1
+hand th aver 1
+hand th nov 1
+hand theorem 1
+hand writ 1
+hand writ me 1
+handbood 1
+handbood of stat 1
+handbook 11
+handbook for autom 1
+handbook for datab 1
+handbook of algorithm 1
+handbook of industr 1
+handbook of log 1
+handbook of mathemat 1
+handbook of theor 6
+handicap 2
+handicap vi 1
+handl 60
+handl a conjunct 1
+handl a denot 1
+handl a fic 1
+handl a key 1
+handl a me 1
+handl a number 1
+handl a particl 1
+handl a request 1
+handl a var 1
+handl al langu 1
+handl al pract 1
+handl al typ 1
+handl allow 1
+handl and memor 1
+handl and resum 1
+handl any input 1
+handl ar addr 1
+handl arbitr 1
+handl arbitr amount 1
+handl as describ 2
+handl be 1
+handl both cl 1
+handl both interprocedur 1
+handl both intraprocedur 1
+handl both nt 1
+handl but fortun 1
+handl by addit 1
+handl by autom 1
+handl by extern 1
+handl by modif 1
+handl by ph 1
+handl by symbol 1
+handl ca 1
+handl ca stat 1
+handl certain langu 1
+handl chang 2
+handl clr 1
+handl cod 1
+handl compon 1
+handl compon failur 1
+handl concav 1
+handl concern control 1
+handl constraint 2
+handl constraint imp 1
+handl constraint satisf 1
+handl detect 1
+handl detect fault 1
+handl each intersect 1
+handl each synchron 1
+handl either ca 1
+handl enginest 1
+handl exact 1
+handl failur 2
+handl fault 1
+handl garb 1
+handl garb pattern 1
+handl growth 1
+handl heter 1
+handl heter appl 1
+handl in prolog 1
+handl infinit 1
+handl infinit tempor 1
+handl inform 1
+handl irregl 1
+handl irregl dat 1
+handl is lim 1
+handl langu 1
+handl langu grammar 1
+handl larg scal 1
+handl learner 1
+handl learner answer 1
+handl lik shar 1
+handl m2 1
+handl map 1
+handl map task 1
+handl me 1
+handl me sent 1
+handl mechan 2
+handl mechan connect 1
+handl model 1
+handl mor gener 1
+handl mult 2
+handl mult format 1
+handl multipl 2
+handl multipl modif 1
+handl multipl pointer 1
+handl network 1
+handl nondetermin 1
+handl nondetermin server 1
+handl of act 1
+handl of answer 1
+handl of assignm 1
+handl of error 1
+handl of garb 1
+handl of hyperm 1
+handl of unsaf 1
+handl onl subscript 1
+handl polynom 1
+handl polynom constraint 1
+handl power 1
+handl power constraint 1
+handl program 1
+handl program langu 1
+handl quit ea 1
+handl rat 1
+handl remot 1
+handl remot fil 1
+handl rich 1
+handl rl 1
+handl select 1
+handl select chang 1
+handl simil 2
+handl situ 1
+handl situ overlook 1
+handl siz 1
+handl spat 1
+handl spat dat 1
+handl stack 1
+handl tag 1
+handl tag handl 1
+handl tag word 1
+handl techniqu 1
+handl telephon 1
+handl telephon number 1
+handl templ 1
+handl tempor 1
+handl tempor dat 1
+handl th altern 2
+handl th bound 1
+handl th ca 3
+handl th complec 1
+handl th cruc 1
+handl th demand 2
+handl th event 1
+handl th fact 1
+handl th form 1
+handl th initarg 1
+handl th interprocedur 1
+handl th libr 1
+handl th lo 1
+handl th me 1
+handl th oper 1
+handl th pedagog 1
+handl th pr 1
+handl th problem 1
+handl th quest 1
+handl th recur 1
+handl th sem 1
+handl th situ 1
+handl through constraint 1
+handl tim 2
+handl tim de. 1
+handl trac 1
+handl tw level 1
+handl unknown 1
+handl unknown input 1
+handl using 2
+handl var 2
+handl var demand 1
+handl view 1
+handl with compiler 1
+handl with mont 1
+handler 5
+handler accept 1
+handler act 1
+handler ar establ 1
+handler ca 1
+handler ca ev 1
+handler check 1
+handler check proc 1
+handler deal 2
+handler dec 1
+handler event 1
+handler event gener 1
+handler execut 1
+handler expr 1
+handler form 1
+handler funct 1
+handler funct pa 1
+handler funct protect 1
+handler funct specif 1
+handler funct tak 1
+handler handler 1
+handler handler funct 1
+handler hap 1
+handler is disc 1
+handler is inform 1
+handler is shadow 1
+handler of ev 1
+handler on p2 1
+handler spec form 1
+handler tabl 1
+handler th condit 1
+handler with condit 1
+handler with prov 1
+handshak 1
+handshak and negot 1
+handsid 1
+handwrit 4
+handwrit character 1
+handwrit character recognit 1
+handwrit digit 2
+handwrit digit experim 1
+handwrit digit learn 1
+handwrit digit problem 1
+handwrit digit produc 1
+handwrit digit recognit 2
+handwrit drawn 1
+handwrit drawn quer 1
+handwrit japan 1
+handwrit japan character 1
+handwrit recognit 1
+handwrit text 1
+handwrit zip 2
+handwrit zip cod 2
+hang 1
+hankin 1
+hannan 2
+hanson 3
+hanus 1
+hap 39
+hap as var 1
+hap for exampl 1
+hap le frequ 1
+hap prec 1
+hap th conjectur 1
+hap that wgp 1
+hap to fal 1
+hap to object 1
+hap to us 1
+hap when memor 1
+hap when try 1
+hap with prob 1
+haphazard 1
+haphazard by individu 1
+har 5
+har bretthauer 1
+har their pot 1
+haralick 1
+harcourt 2
+harcourt brac 2
+harcourt brac jovanovich 2
+hard 8
+hard contribut 1
+hard du 1
+hard ever countermand 1
+hard grammar 1
+hard is im 1
+hard novel 1
+hard of approxim 1
+hard parod 1
+hard parod gener 1
+hard simpler 1
+hard th descript 1
+hard through stat 1
+hard using 1
+hard. 1
+harder 8
+harder but tool 1
+harder c us 1
+harder m multipl 1
+harder problem 1
+harder than nec 1
+harder that understand 1
+harder to comb 1
+harder to find 1
+harder to follow 1
+harder to understand 1
+hardest 4
+hardest part 1
+hardest point 1
+hardest singl 1
+hardest singl part 1
+hardin 1
+hardwar 33
+hardwar acc 1
+hardwar acc manager 1
+hardwar adv 1
+hardwar and compiler 1
+hardwar and favor 1
+hardwar and firmwar 1
+hardwar and interconnect 1
+hardwar and softwar 6
+hardwar any configur 1
+hardwar approach 1
+hardwar architect 1
+hardwar architect seem 1
+hardwar architectur 2
+hardwar atom 1
+hardwar ba 2
+hardwar ba approach 1
+hardwar ba cach 1
+hardwar ba implem 1
+hardwar ba method 1
+hardwar ba multicast 1
+hardwar ba solut 1
+hardwar bound 1
+hardwar bound giv 1
+hardwar cal 1
+hardwar cap 1
+hardwar centr 1
+hardwar centr buffer 1
+hardwar compon 1
+hardwar decod 1
+hardwar dep 1
+hardwar dep flow 1
+hardwar descript 1
+hardwar descript langu 1
+hardwar design 1
+hardwar dfg 1
+hardwar dfg oper 1
+hardwar eff 1
+hardwar eff fair 1
+hardwar evalu 1
+hardwar featur 1
+hardwar featur lo 1
+hardwar for prolog 1
+hardwar found 1
+hardwar hav mad 1
+hardwar implem 6
+hardwar implem method 1
+hardwar implem shar 1
+hardwar input 1
+hardwar input fif 1
+hardwar insid cluster 1
+hardwar interfac 1
+hardwar inv 1
+hardwar inv ba 1
+hardwar is becom 1
+hardwar is describ 1
+hardwar is remov 1
+hardwar level 1
+hardwar lim 1
+hardwar memor 1
+hardwar memor architectur 1
+hardwar monit 1
+hardwar multicast 1
+hardwar multicast ca 1
+hardwar multicast displ 1
+hardwar multicast experim 1
+hardwar multicast implem 1
+hardwar multicast lat 1
+hardwar multicast occup 1
+hardwar multicast perform 1
+hardwar multicast perturb 1
+hardwar multicast schem 1
+hardwar multicast using 1
+hardwar nec 1
+hardwar nod 1
+hardwar nod repr 1
+hardwar nonblock 1
+hardwar nonblock configur 1
+hardwar nor compiler 1
+hardwar or kernel 1
+hardwar or libr 1
+hardwar or softwar 2
+hardwar overhead 1
+hardwar path 1
+hardwar path ba 1
+hardwar platform 1
+hardwar primitiv 1
+hardwar register 1
+hardwar repl 1
+hardwar repl method 1
+hardwar repl schem 1
+hardwar requir 1
+hardwar resourc 1
+hardwar snoop 1
+hardwar snoop cach 1
+hardwar support 7
+hardwar support sum 1
+hardwar tabl 1
+hardwar textur 1
+hardwar textur map 1
+hardwar than strict 1
+hardwar that impl 1
+hardwar to check 1
+hardwar to inv 1
+hardwar to reduc 1
+hardwar to support 1
+hardwar troubleshoot 1
+hardwar using 1
+hardwar which ensur 1
+hardwarep 1
+hardwick 1
+hardwir 3
+hardwir a particl 1
+hardwir control 1
+hardwir control abort 1
+hardwir siz 1
+hardyesqu 1
+hardyesqu styl 1
+harel 3
+harel maintain 1
+harid 5
+harl 1
+harl dav 1
+harland 1
+harm 4
+harm and help 1
+harm consequ 1
+harm in discard 1
+harm using 1
+harmel 1
+harmon 3
+harmon exampl 1
+harmon map 1
+harmon melod 1
+harmon number 1
+harmon number ht 1
+harmon rl 1
+harp 1
+harp fil 1
+harp fil system 1
+harper 3
+harper and brother 1
+harper fer 1
+harrison 2
+harrold 1
+harrold and m.l 1
+harroldg 1
+harroldg ci.oh 1
+harroldg ci.oh st.edu 1
+harsh 1
+harsh for lack 1
+hart 3
+hart identif 1
+hart p.e 1
+harter 1
+hartman 3
+hartman and d.j 1
+hartmut 1
+hartmut dieterich 1
+hartson 1
+haru 1
+haru ho 1
+harvard 2
+harvard architectur 1
+hasard 2
+hasard dan 1
+hasard ou 1
+hasard ou sont 1
+hasard parm 1
+hasard parm le 1
+hasemer 1
+hash 11
+hash algorithm 1
+hash and alignm 1
+hash approach 1
+hash etc 1
+hash for main 1
+hash for match 1
+hash funct 5
+hash funct distribut 1
+hash join 1
+hash method 1
+hash problem 1
+hash schem 1
+hash suggest 1
+hash tabl 3
+hash techniqu 1
+hash using 1
+hash using lin 1
+hashchain 1
+hashchain lockschain 1
+haskel 1
+haskin 1
+haskin et al 1
+hasl 1
+hassib 1
+hassib and david 1
+hassoun 2
+hat 1
+hat te 1
+hau 1
+haut 4
+haut int 1
+haut niveau 1
+haut niveau de 1
+haut perform 1
+haut perform parm 1
+haut risqu 1
+haut temp 1
+haut temp er 1
+hav 1
+havan 1
+haw 5
+haw intern 2
+haw intl 1
+hawk 1
+hay 4
+hay et al 1
+hay roth 1
+hay roth hay 1
+hay s.a 1
+hay92 1
+haydn 1
+haydn or charl 1
+haygood 1
+hazard 2
+hazard ar 1
+hazard ar giv 1
+hazard by ad 1
+hazard shap 1
+hazard tabl 1
+hazard using 1
+hazard using acc 1
+hazard wast 1
+hb 3
+hb contain 1
+hb l0 1
+hb l00 1
+hb tr 1
+hb86 1
+hbf 1
+hc 4
+hc hypercub 1
+hc intern 1
+hc1 1
+hc2 1
+hck 1
+hck 1u1 1
+hclp 1
+hclp inst 1
+hclp schem 1
+hcub 2
+hd 6
+hd nil 1
+hd vd 1
+hd which return 1
+hd1 1
+hdf 1
+hdl 1
+hdl specif 1
+hdu 1
+he 3
+he approxim 1
+he approxim bi 1
+he82 1
+he91 1
+he93 1
+head 26
+head an empt 1
+head and tail 2
+head ar norm 1
+head ar pursu 1
+head atom 1
+head dat 1
+head dat member 1
+head from track 1
+head is deem 1
+head is deriv 1
+head may funct 1
+head norm 2
+head norm form 2
+head num 1
+head num sect 1
+head oem 1
+head of lin 1
+head of program 1
+head of queu 1
+head of rl 1
+head remain 1
+head sound 1
+head sound system 1
+head symbol 1
+head unif 1
+head unif succeed 1
+head wormhol 1
+head wormhol rout 1
+head0 1
+headach 1
+headach and prohibit 1
+header 5
+header a switch 1
+header and examin 1
+header arriv 1
+header car 1
+header chunk 1
+header chunk point 1
+header chunk read 1
+header chunk writ 1
+header chunk.2 1
+header dest 1
+header dest proc 1
+header encod 1
+header encod inform 1
+header encod mechan 1
+header identif 1
+header impl 1
+header is separ 1
+header is writ 1
+header manipl 1
+header of ev 1
+header prov 1
+header prov rout 1
+header r1r0r1 1
+header requir 1
+header symbol 1
+header that describ 1
+header to determin 1
+header to repr 1
+headertransport 1
+headertransport pack 1
+headertransport pack length 1
+headquarter 1
+headquarter empl 1
+headquarter oper 1
+health 1
+health and saf 1
+heap 10
+heap algorithm 1
+heap alloc 2
+heap alloc dat 1
+heap and examin 1
+heap and random 1
+heap and triangl 1
+heap backtrack 1
+heap backtrack point 1
+heap con 1
+heap construc 1
+heap construc algorithm 1
+heap counterpart 1
+heap fast 1
+heap in conv 1
+heap is approxim 1
+heap is bound 1
+heap is empt 1
+heap is particl 1
+heap mor rel 1
+heap nod 1
+heap of cub 1
+heap perfect 1
+heap perfect perfect 1
+heap proper 1
+heap q1 1
+heap qd 1
+heap qd hold 1
+heap renam 1
+heap requir 1
+heap requir exact 1
+heap sort 2
+heap sort beat 1
+heap structur 1
+heap structur rev 1
+heap th largest 1
+heap th number 1
+heap th siftdown 1
+heap th underl 1
+heap th upper 1
+heap that requir 1
+heap using 1
+heap which st 1
+heap with 2t 1
+heap with appl 1
+heap with height 1
+heap1 1
+heap1 implem 1
+heapif 1
+heapif by repeat 1
+heapsort 1
+heapsort is approxim 1
+heapsort sort 1
+heapsort us 1
+heapsort us swap 1
+heapsort var 1
+heapsort var improv 1
+heapsort which sort 1
+hear 4
+hear al me 1
+hear al nod 1
+hear th broadcast 1
+hear th me 1
+heard 1
+heart 8
+heart beat 1
+heart beat mechan 1
+heart electr 1
+heart electr act 1
+heart heart.cleveland 1
+heart heart.cleveland heart.hungar 1
+heart is compar 1
+heart.cleveland 1
+heart.cleveland heart.hungar 1
+heart.cleveland heart.hungar heart.long 1
+heart.hungar 1
+heart.hungar heart.long 1
+heart.hungar heart.long beach 1
+heart.long 1
+heart.long beach 1
+heart.long beach va 1
+heart.mor 1
+heart.mor heart.sw 1
+heart.mor heart.sw hepatit 1
+heart.sw 1
+heart.sw dat 1
+heart.sw hepatit 1
+heart.sw hepatit hor 1
+heartbeat 1
+heat 2
+heat exchanger 1
+heath 3
+heath and padm 1
+heav 14
+heav affect 1
+heav and heaviest 1
+heav dep 2
+heav edg 2
+heav edg match 2
+heav load 1
+heav load on 1
+heav nod 1
+heav nod separ 1
+heav us 1
+heav us catalog 1
+heav us pattern 1
+heav weight 1
+heaviest 1
+heaviest edg 1
+heaviest edg inc 1
+heaviest edg match 1
+hebrew 1
+heckber 2
+hedr 1
+hedr sustain 1
+hedr sustain equilater 1
+hedr with scal 1
+heed 1
+heffernan 1
+hefl 1
+hegron 1
+heidelberg 2
+heidelberg new york 1
+heidelberger 1
+heideman 2
+heideman and gerald 1
+heideman and popek 1
+height 15
+height 2blog 1
+height 2blog tc 1
+height 2blog tcw 1
+height 2i 2
+height ar shown 1
+height bump 1
+height cycl 1
+height cycl length 1
+height equ 1
+height ha incr 1
+height in heap 1
+height incr 1
+height larger 1
+height log 1
+height n uv 1
+height occur 1
+height of span 1
+height reducemac16 1
+height step 1
+height with respect 1
+heintz 1
+heinz 3
+heinz seidl 1
+heiser 1
+heiser pi 1
+heister 1
+heitmeyer 1
+heitmeyer and labaw 1
+hel 2
+hel dn 1
+hel dn bind 1
+hel motif 1
+hel that form 1
+hel turn 1
+hel turn hel 1
+hel world 1
+held 15
+held at mi 1
+held between constitu 1
+held by cur 1
+held in bright 1
+held in ib 1
+held in plovdiv 1
+held in shunt 1
+held in variabl 1
+held recorder 1
+held th lock 1
+hellerstein 1
+helm 2
+helman 1
+helman joseph 1
+help 54
+help adv 1
+help and adapt 1
+help and individu 1
+help autom 1
+help b difficult 1
+help build 1
+help c problem 1
+help com 3
+help compl 1
+help correct 1
+help cover 1
+help debug 1
+help deep 1
+help deliver 1
+help deliver prom 1
+help disc 2
+help e ye 1
+help establ 1
+help establ adequ 1
+help explain 1
+help facil 1
+help facil handl 1
+help for understand 1
+help gener 1
+help graph 1
+help graph build 1
+help hem 1
+help identif 2
+help illustr 1
+help illustr exact 1
+help in abstract 1
+help in build 1
+help in compar 1
+help in control 1
+help in creat 1
+help in design 1
+help in gener 1
+help in mak 1
+help in organ 1
+help in overcom 1
+help in regl 1
+help in structur 1
+help in verif 1
+help inform 2
+help insur 1
+help is definit 1
+help it av 1
+help l encapsl 1
+help of sorcerer 1
+help on why 1
+help organ 2
+help organ docum 1
+help prefer 1
+help produc 1
+help produc nic 1
+help protein 1
+help protein design 1
+help prov 1
+help prov extern 1
+help reduc 1
+help refer 1
+help request 1
+help solut 1
+help stud 1
+help system 1
+help system envisag 1
+help th diagn 1
+help th id 1
+help th nod 1
+help th reader 1
+help th stud 2
+help th switch 1
+help th system 1
+help th user 1
+help them relac 1
+help them solut 1
+help to av 1
+help to continu 1
+help to cr 1
+help to debug 1
+help to def 1
+help to foc 1
+help to grow 1
+help to identif 1
+help to read 1
+help to reduc 1
+help to simplif 1
+help to start 1
+help to transform 1
+help to underl 1
+help to visu 1
+help transform 1
+help understand 1
+help us av 1
+help us determin 1
+help us draw 1
+help user 1
+help user perc 1
+help usu requir 1
+help with act 1
+help with cr 1
+help with nod 1
+help you master 1
+helpm 1
+helpm mobil 1
+helpm mobil robot 1
+helsink 1
+hem 3
+hem against hem 1
+hem and gklr 1
+hem and gr 1
+hem and hem 1
+hem bind 1
+hem bind motif 1
+hem can mi 1
+hem coar 1
+hem coar schem 1
+hem con 1
+hem con produc 1
+hem disregard 1
+hem doing slight 1
+hem dur coar 1
+hem framework 1
+hem gr 1
+hem gr refin 1
+hem group 1
+hem hem 1
+hem hem gr 1
+hem is faster 1
+hem is simil 1
+hem is slower 1
+hem match 1
+hem match schem 1
+hem may occ 1
+hem produc 1
+hem produc coar 1
+hem produc partit 1
+hem reduc 1
+hem rm 1
+hem rm match 1
+hem schem 1
+hem strateg 1
+hem strateg random 1
+hem to cr 1
+hem to perform 1
+hem wa origin 1
+hem with gr 1
+hemachandr 1
+hemaspaandr 1
+hemingw 1
+hemingw attachm 1
+hemingw competit 1
+hemingw contest 1
+hemingw cosmopolitan 1
+hemingw cosmopolitan vernacl 1
+hemingw distinct 1
+hemingw distinct top 1
+hemingw grammar 1
+hemingw may explain 1
+hemingw model 1
+hemingw model attempt 1
+hemingw offer 1
+hemingw output 1
+hemingw parod 1
+hemingw produc 1
+hemingw styl 1
+hemingw styl trademark 1
+hemingw th prescript 1
+hemingw work 1
+hemingw work allow 1
+hemingwayesqu 1
+hemingwayesqu attribut 1
+hemoglobin 1
+hemoglobin bind 1
+hemoglobin from petromyzon 1
+hen 5
+hen 96a 1
+hen 96b 1
+henc 66
+henc 1nf 1
+henc 1nf rel 1
+henc 8s 1
+henc a cler 1
+henc a0 1
+henc better understand 1
+henc by theorem 1
+henc c0 1
+henc c1 1
+henc comput 1
+henc comput result 1
+henc cut 1
+henc cut ver 1
+henc dep 1
+henc ea 1
+henc each diagon 1
+henc each specif 1
+henc enh 1
+henc enh concur 1
+henc equ 1
+henc ev perfect 1
+henc f1 1
+henc fd 1
+henc fi 1
+henc fi fd 1
+henc ha high 1
+henc improv 1
+henc in g0 1
+henc inclus 1
+henc inclus power 1
+henc is indistingu 1
+henc jt 1
+henc le visu 1
+henc lock 1
+henc m decl 1
+henc mak 1
+henc may deadlock 1
+henc mint 1
+henc monot 1
+henc multipl 1
+henc multipl transact 1
+henc nc 1
+henc oe1 1
+henc overlap 1
+henc overlap privileg 1
+henc pb1 1
+henc perform 3
+henc pl 1
+henc recov 1
+henc recov requir 1
+henc rel 1
+henc resolut 1
+henc run 1
+henc singl 1
+henc singl thread 1
+henc speed 1
+henc such privileg 1
+henc t0 1
+henc t1 1
+henc th claim 1
+henc th comput 1
+henc th connect 1
+henc th crossover 1
+henc th determin 1
+henc th execut 1
+henc th extern 1
+henc th field 1
+henc th hierarch 1
+henc th hp 1
+henc th id 1
+henc th incr 1
+henc th interfer 1
+henc th me 1
+henc th minim 1
+henc th multigraph 1
+henc th nam 1
+henc th natur 1
+henc th number 1
+henc th optim 1
+henc th peak 2
+henc th plac 1
+henc th project 1
+henc th protect 1
+henc th protocol 1
+henc th qu 1
+henc th run 1
+henc th system 1
+henc th testb 1
+henc th tim 2
+henc th ver 1
+henc that oper 1
+henc think 1
+henc tim 1
+henc timec 1
+henc u1 1
+henc w satisf 1
+henc we assum 2
+henc we conclus 2
+henc we obtain 1
+henc writ 1
+henceforth 7
+henceforth cal targ 1
+henceforth refer 1
+henceforth th rcc 1
+henceforth we adopt 1
+henceforth we tak 1
+hench 1
+henderson 2
+hendr 1
+hendrick 1
+hendrickson 3
+hendrickson and ed 1
+hendrickson and leland 1
+hendrickson and rober 2
+hendrickson and rothberg 1
+hendrickson indep 1
+hendrickson indep pr 1
+hendrik 1
+hendrik barendregt 1
+henglein 1
+henk 1
+henk j.m 1
+henr 5
+henr de 1
+henr de villeneuv 1
+henr et al 1
+henr fuch 1
+henr og 1
+henr og mar 1
+henricson 1
+henricson and nyqu 1
+henson 1
+hentenryck 4
+henz 2
+henz oz 1
+henz oz puzzl 1
+henz.ps.z 1
+hepatit 1
+hepatit hor 1
+hepatit hor col 1
+heptapept 1
+heptapept in tor 1
+heptapept opt 1
+heq 1
+heq uickb 1
+heq uickb rown 1
+heraklion 1
+herald 1
+herber 1
+herber stoyan 1
+herbrand 3
+herbrand atom 1
+herbrand atom d1 1
+herbrand atom denot 1
+herbrand ba 2
+herbrand ba bp 1
+herbrand interpr 1
+herbrand model 2
+herbrand univer 2
+hereafter 2
+hereafter dbp 1
+hereafter th term 1
+hereafter uj 1
+hereafter we us 1
+hereafter wj 1
+hereb 3
+hereb reflect 1
+hereb understand 1
+hereb understand appl 1
+heredit 1
+heredit induc 1
+heredit induc subgraph 1
+herer 1
+herm 5
+herm and skew 1
+herm ca 1
+herm lin 1
+herm lin system 1
+herm polynom 1
+herm polynom fhng 1
+herm qu 1
+herm qu fourn 1
+herm solut 1
+herm system 1
+herman 1
+hermel 1
+hermenegild 2
+hermenegild and penjam 1
+hern92 1
+herndon 2
+herold 2
+herskovit 1
+hertfordshir 1
+hertz 1
+herzig 2
+hessellund 1
+hessellund and dahl 1
+hesser 1
+hest 1
+hest and stiefel 1
+heter 9
+heter algebr 1
+heter appl 1
+heter datab 1
+heter datab system 1
+heter dist 1
+heter dist funct 1
+heter micr 1
+heter micr structur 1
+heter multicomputer 1
+heter multiproc 1
+heter multiproc graph 1
+heter proc 1
+heter proc architectur 1
+heter system 1
+heter var 1
+heter var satur 1
+heterogeneouscluster 1
+heur 27
+heur algorithm 2
+heur and implem 1
+heur and mad 1
+heur approach 3
+heur ar ba 1
+heur ar cap 1
+heur ar loc 1
+heur ar prop 1
+heur ar shown 1
+heur as label 1
+heur assum 1
+heur cal uv 1
+heur ch 1
+heur classif 1
+heur con 1
+heur dec 1
+heur describ 1
+heur differ 1
+heur doubl 1
+heur doubl calculatecycl 1
+heur doubl heur 1
+heur empl 1
+heur empl rel 1
+heur for blam 1
+heur for ch 1
+heur for discover 1
+heur for finit 1
+heur for improv 1
+heur for init 1
+heur for interconnect 1
+heur for loc 1
+heur for lp 1
+heur for order 1
+heur for reduc 2
+heur for select 1
+heur gp 1
+heur hav evolut 1
+heur known 1
+heur le 1
+heur le temp 1
+heur method 4
+heur nt 1
+heur nt build 1
+heur nt def 1
+heur nt explor 1
+heur nt found 1
+heur nt requir 1
+heur nt took 1
+heur nt treetimestat 1
+heur num 1
+heur num eriqu 1
+heur observ 1
+heur observ succ 1
+heur on graph 1
+heur on tor 1
+heur or rl 1
+heur problem 1
+heur problem solut 1
+heur procedur 3
+heur produc 1
+heur produc overwhelm 1
+heur prompt 1
+heur prompt int 1
+heur prop 1
+heur regard 1
+heur report 1
+heur rl 1
+heur search 2
+heur search brief 1
+heur signif 1
+heur signif improv 1
+heur solut 1
+heur sort 1
+heur start 1
+heur strateg 1
+heur tact 1
+heur techniqu 1
+heur ten 1
+heur th tim 1
+heur that offer 1
+heur that reorder 1
+heur to comput 1
+heur to determin 2
+heur to partit 1
+heur to reduc 2
+heur to solut 1
+heur uv 1
+heur uv ch 1
+heur uv explor 1
+heur uv found 1
+heur uv treetimestat 1
+heur wer implem 1
+heur with random 1
+heur would pick 1
+heurt 3
+heurt a de 1
+heurt alor 1
+heurt au 1
+heurt au probl 1
+heurt donc 1
+heurt donc au 1
+heurt n eanmoin 1
+heurt souv 1
+heurt toutef 1
+hewit 3
+hewit and agh 1
+hewit group 1
+hewl 3
+hewl packard 3
+hewl packard compan 1
+hewl packard hp 1
+hewl packard nl 1
+hexad 1
+hexad ecim 1
+hexagon 1
+hexagon contain 1
+hexagon contain rectangl 1
+hexp 1
+hext 1
+hext et himsworth 1
+hey 2
+hey sem 1
+heyb 2
+hez 1
+hf 1
+hf0 1
+hf88 1
+hff 1
+hfjdwk 1
+hfjdwk adwjk 1
+hg 2
+hg and fc 1
+hg0 1
+hg00 1
+hg000 1
+hg1 2
+hg2 1
+hgk 1
+hgn 1
+hguard 1
+hh 1
+hh91 1
+hhhhhhhhhhhj 1
+hhhhj 1
+hhhhj ae 1
+hi 15
+hi av.html 1
+hi def 1
+hi erarch 1
+hi erarchiqu 1
+hi est 1
+hi est un 1
+hi fcover 1
+hi is construc 1
+hi rt 1
+hi rt wi 1
+hi sequ 1
+hi with mi 1
+hibbard 1
+hick 1
+hick et mudamb 1
+hid 27
+hid and deleg 1
+hid and encapsl 1
+hid and implicit 1
+hid and output 1
+hid behind interfac 1
+hid definit 1
+hid detail 2
+hid field 1
+hid field contain 1
+hid insid black 1
+hid knowledg 1
+hid lat 1
+hid layer 3
+hid layer activ 1
+hid layer calculatedj 1
+hid layer contain 1
+hid layer feedfor 1
+hid layer siz 1
+hid markov 1
+hid markov model 1
+hid neuron 1
+hid nod 3
+hid nod com 1
+hid nod pandemon 1
+hid nod singl 1
+hid problem 1
+hid som detail 1
+hid st 1
+hid surfac 1
+hid surfac algorithm 1
+hid th commun 1
+hid th distribut 1
+hid th funct 1
+hid th lat 1
+hid th repr 1
+hid through encapsl 1
+hid train 1
+hid unit 2
+hid unit number 1
+hid unit pandemon 1
+hid unit requir 1
+hid unit system 1
+hid val 2
+hid var 1
+hid var valu 1
+hid variabl 1
+hidehik 1
+hidehik masuhar 1
+hierarc 1
+hierarc com. 1
+hierarc compar 1
+hierarc satisf 1
+hierarc satisf algorithm 1
+hierarch 44
+hierarch algorithm 2
+hierarch algorithm ba 1
+hierarch allow 3
+hierarch allow programmer 1
+hierarch allow thicker 2
+hierarch and cach 2
+hierarch and funct 1
+hierarch and glob 1
+hierarch and loc 1
+hierarch and mak 2
+hierarch and typ 1
+hierarch and virtu 1
+hierarch ar gener 1
+hierarch ar mic 1
+hierarch architectur 2
+hierarch as follow 1
+hierarch as problem 1
+hierarch ba 1
+hierarch block 1
+hierarch block segm 1
+hierarch brow 1
+hierarch by allow 1
+hierarch by combin 1
+hierarch by repeat 1
+hierarch can caus 1
+hierarch compar 1
+hierarch compar comp 1
+hierarch compar pr 1
+hierarch comparison 1
+hierarch con 2
+hierarch con tr 1
+hierarch concept 1
+hierarch configur 2
+hierarch constraint 2
+hierarch constraint log 1
+hierarch constraint satisf 1
+hierarch control 1
+hierarch control flow 1
+hierarch correct 1
+hierarch correct proof 1
+hierarch dat 2
+hierarch dat se 1
+hierarch dat structur 1
+hierarch decomposit 2
+hierarch dep 1
+hierarch dep structur 1
+hierarch design 1
+hierarch diagn 1
+hierarch diagnost 1
+hierarch diagnost algorithm 1
+hierarch dim 1
+hierarch distribut 1
+hierarch du 1
+hierarch ec 1
+hierarch ensur 1
+hierarch exhibit 1
+hierarch for cam 1
+hierarch for cor 1
+hierarch for ext 1
+hierarch found 1
+hierarch four level 1
+hierarch from piec 1
+hierarch gener 1
+hierarch ha becom 1
+hierarch hav lower 1
+hierarch hierarch 2
+hierarch hypercub 1
+hierarch hypercub multicomputer 1
+hierarch in figur 1
+hierarch in order 1
+hierarch ind 1
+hierarch inform 1
+hierarch inform se 1
+hierarch int disjoint 1
+hierarch interconnect 2
+hierarch interconnect network 2
+hierarch is deep 1
+hierarch is design 1
+hierarch is interchang 1
+hierarch is nonmonot 1
+hierarch is particl 1
+hierarch is replac 1
+hierarch is shown 1
+hierarch is specif 1
+hierarch is structur 1
+hierarch just describ 1
+hierarch match 2
+hierarch maxim 2
+hierarch maxim board 2
+hierarch may chang 1
+hierarch mean 1
+hierarch memor 2
+hierarch memor manag 1
+hierarch memor model 1
+hierarch model 1
+hierarch model ba 1
+hierarch model principl 1
+hierarch modl 1
+hierarch modl system 1
+hierarch multilevel 1
+hierarch multilevel memor 1
+hierarch multiproc 3
+hierarch multiproc interconnect 2
+hierarch multiproc system 3
+hierarch network 4
+hierarch network perform 3
+hierarch of cl 1
+hierarch of docum 1
+hierarch of equ 1
+hierarch of failur 1
+hierarch of fl 1
+hierarch of method 1
+hierarch of mult 1
+hierarch of natur 1
+hierarch of pool 1
+hierarch of theor 1
+hierarch of virtu 2
+hierarch of weak 1
+hierarch on system 1
+hierarch order 2
+hierarch organ 2
+hierarch organ inform 1
+hierarch origin 1
+hierarch origin constraint 1
+hierarch over implem 1
+hierarch pack 2
+hierarch part 1
+hierarch part constraint 1
+hierarch pr 1
+hierarch prefer 1
+hierarch repr 1
+hierarch round robin 1
+hierarch rout 1
+hierarch rout algorithm 1
+hierarch satisf 1
+hierarch satisf exclus 1
+hierarch shar 2
+hierarch shar half 1
+hierarch softwar 1
+hierarch softwar system 1
+hierarch strength 1
+hierarch structur 4
+hierarch structur inform 1
+hierarch structur system 1
+hierarch sub 1
+hierarch sub task 1
+hierarch support 1
+hierarch system 5
+hierarch system decomposit 1
+hierarch th inclus 1
+hierarch theor 1
+hierarch theorem 1
+hierarch theorem hold 1
+hierarch to find 1
+hierarch to mak 1
+hierarch topolog 1
+hierarch topolog allow 1
+hierarch tr 1
+hierarch tr definit 1
+hierarch turn 1
+hierarch tw ph 1
+hierarch typ 2
+hierarch typ inclus 1
+hierarch typ support 1
+hierarch using 1
+hierarch we pr 1
+hierarch wh 2
+hierarch wh design 1
+hierarch wh timel 1
+hierarch when using 1
+hierarch wil cluster 1
+hierarch window 1
+hierarch within lin 1
+hierarch within problem 1
+hig 1
+high 76
+high 1x 1
+high accur 2
+high activ 1
+high arithm 1
+high asynchron 1
+high asynchron minim 1
+high asynchron protocol 1
+high author 1
+high author rol 1
+high avail 2
+high avail dat 1
+high avail distribut 1
+high avail ip 1
+high avail network 1
+high avail serv 1
+high avail web 1
+high aver 1
+high aver gener 1
+high bandwidth 1
+high bandwidth network 1
+high channel 1
+high channel bandwidth 1
+high channel width 1
+high commun 1
+high commun cost 1
+high complec 2
+high compr 1
+high comput 1
+high comput complec 1
+high concur 1
+high concur search 1
+high confid 2
+high confid valu 1
+high context 1
+high context dep 1
+high cost 3
+high crypt 1
+high crypt suggest 1
+high cycl 2
+high dec 1
+high dec level 1
+high degr 2
+high del 1
+high del exper 1
+high dep 5
+high dep system 1
+high desir 2
+high desir proper 1
+high develop 1
+high develop field 1
+high dim 5
+high dim ext 1
+high dim inter 1
+high dim par 1
+high dim spac 1
+high dim. 1
+high discrim 1
+high discrim result 1
+high dispar 1
+high dispar techniqu 1
+high displac 1
+high distribut 1
+high distribut dataflow 1
+high distribut multiproc 1
+high educ 1
+high effect 1
+high effect structur 1
+high en 1
+high fil 1
+high filter 1
+high filter level 1
+high fit 1
+high fit schem 1
+high flec 1
+high for rm 1
+high gener 1
+high gener accur 1
+high hierarch 2
+high in pffq 1
+high incompl 1
+high ineff 1
+high integr 1
+high intellig 1
+high intellig gener 1
+high interact 1
+high interact system 1
+high interconnect 1
+high interconnect perform 1
+high intract 1
+high intract form 1
+high is 1
+high is proc 1
+high label 1
+high lat 1
+high layer 2
+high lead 2
+high level 21
+high level answer 1
+high level ar 1
+high level aspect 1
+high level assum 1
+high level concept 1
+high level constraint 1
+high level direct 2
+high level feedback 1
+high level form 1
+high level fragm 1
+high level ga 1
+high level inter 2
+high level interrupt 1
+high level l 1
+high level langu 1
+high level lock 1
+high level master 1
+high level number 1
+high level oper 1
+high level pool 1
+high level proc 1
+high level prun 1
+high level structur 3
+high level subtransact 1
+high level transact 1
+high level und 1
+high lim 2
+high lo 1
+high load 1
+high maxim 1
+high mobil 1
+high mobil environm 1
+high network 2
+high network bandwidth 1
+high network block 1
+high non 2
+high non lin 1
+high non stat 1
+high number 1
+high nw 1
+high or lower 1
+high order 13
+high order build 1
+high order condit 1
+high order construc 1
+high order deriv 1
+high order expr 1
+high order funct 3
+high order log 1
+high order me 1
+high order method 1
+high order not 1
+high order polymorph 1
+high order program 2
+high order subtyp 1
+high order term 1
+high order unif 1
+high order var 1
+high parallel 5
+high parallel act 1
+high parallel comput 2
+high parallel mach 2
+high parallel system 1
+high per me 1
+high perform 1
+high pinout 1
+high posit 1
+high prior 2
+high prior nod 1
+high prior pack 1
+high prob 5
+high prob assignm 1
+high prob condit 1
+high prob number 1
+high produc 1
+high psnr 1
+high random 1
+high random act 1
+high random self 1
+high recognit 1
+high recognit rat 1
+high redund 1
+high redund fash 1
+high rel 2
+high relev 1
+high repr 1
+high resolut 1
+high resolut dat 1
+high restrict 1
+high restrict world 1
+high run 1
+high run tim 1
+high scal 1
+high scal parallel 1
+high sensit 1
+high shar 1
+high shar act 1
+high shout 1
+high signif 1
+high simil 1
+high skew 1
+high skew distribut 1
+high specif 1
+high speed 1
+high speedup 1
+high st 1
+high st requir 1
+high stat 1
+high stat level 1
+high structur 1
+high structur natur 1
+high subject 1
+high sum 1
+high system 1
+high system perform 1
+high than ml 1
+high than pi 1
+high then q1.8 1
+high throughput 1
+high train 1
+high train net 1
+high transfer 1
+high transfer rat 1
+high unlik 2
+high unlik event 1
+high unst 1
+high unst nod 1
+high util 1
+high util valu 1
+high valu 3
+high valu w2 1
+high var 1
+high var number 1
+high0 1
+high0 op 1
+high0 op upd 1
+higherorder 2
+higherorder model 1
+higherorder variabl 1
+highest 20
+highest absolut 1
+highest absolut perform 1
+highest activ 1
+highest activ rat 1
+highest aggreg 1
+highest aggreg throughput 1
+highest avail 1
+highest avail optim 1
+highest bandwidth 1
+highest classif 2
+highest classif inform 1
+highest classif rat 1
+highest confid 1
+highest degr 1
+highest degr nod 1
+highest expr 1
+highest field 1
+highest gain 1
+highest gener 1
+highest gener accur 1
+highest implem 1
+highest implem complec 1
+highest key 1
+highest label 1
+highest layer 1
+highest level 3
+highest level oper 1
+highest min 1
+highest min confid 1
+highest output 1
+highest output confid 1
+highest perform 1
+highest prior 3
+highest prior nod 1
+highest qsm 1
+highest rat 1
+highest reduc 1
+highest sal 1
+highest sal earn 1
+highest shout 1
+highest shout valu 1
+highest simil 1
+highest user 1
+highest user exper 1
+highest valu 1
+highest valu key 1
+highest weight 1
+highestdegreenod 1
+highestprior 1
+highestprior nod 1
+highestprior nod induc 1
+highestprioritynod 1
+highlight 15
+highlight a coupl 1
+highlight a fact 1
+highlight certain problem 1
+highlight differ 1
+highlight direct 1
+highlight how overhead 1
+highlight opt 1
+highlight reg 1
+highlight th architectur 1
+highlight th fact 1
+highlight th lim 1
+highlight th multiproc 1
+highlight th problem 2
+highlight th reg 1
+highlight th way 1
+highlight their differ 1
+highlight wh 1
+highperform 1
+highperform architectur 1
+highw 1
+highw network 1
+highw network map2 1
+highw network rotor 1
+hij 2
+hij 8i 1
+hij d esign 1
+hil 24
+hil and j.w 1
+hil climb 3
+hil climb capabil 1
+hil climb method 1
+hil climb procedur 1
+hil cs.brown.edu 1
+hil farm 1
+hil farm stat 1
+hil mak 1
+hil mak us 1
+hilber 2
+hilber ba 1
+hilber ba decluster 1
+hilber curv 1
+hilber curv achief 1
+hilber pack 1
+hilber r tr 1
+hilber spac 1
+hilber valu 1
+hilbertpack 1
+hilbertpack r tr 1
+hilfinger 1
+hillclimb 2
+hillclimb evolut 1
+hillclimb evolut genet 1
+hillclimb search 1
+hillsd 4
+hillstrom 1
+hilog 1
+hilog allow 1
+hilog allow arbitr 1
+hilog ar dynam 1
+hilog ar list 1
+hilog attempt 1
+hilog captur 1
+hilog con 1
+hilog on top 1
+hilog program 1
+hilog subdomain 1
+hilog subdomain utru 1
+hilog term 1
+hilog to mak 1
+hilog wi 1
+himabindu 1
+himabindu gurl 1
+himawan 1
+himawan gunadh 1
+himawan gunadh event 1
+himsworth 1
+hinder 3
+hinder som prev 1
+hinder th implem 1
+hinder th serv 1
+hindr 1
+hinrich 1
+hint 6
+hint for computer 1
+hint if part 1
+hint of correct 1
+hint to find 1
+hinterberger 1
+hip 2
+hip and atm 1
+hip or fibr 1
+hip switch 1
+hirok 1
+hirok konak 1
+hirosh 3
+hirosh hosob 1
+hirosh nagamoch 1
+hirosh tezuk 1
+hisg 1
+hist 21
+hist a displ 1
+hist and a1 1
+hist and acc 1
+hist and acknowledg 1
+hist and program 1
+hist and tempor 2
+hist and view 1
+hist ar consider 1
+hist attribut 1
+hist cach 1
+hist d displ 1
+hist dat 1
+hist dat repr 1
+hist datab 1
+hist for procedur 1
+hist in stack 1
+hist incr 1
+hist inform 1
+hist int account 1
+hist is mad 1
+hist is maintain 1
+hist kept 1
+hist of brok 1
+hist of chang 1
+hist of empl 1
+hist of event 1
+hist of id 1
+hist of interact 1
+hist of learn 1
+hist of maint 1
+hist of object 1
+hist of perform 1
+hist of prev 1
+hist of project 1
+hist of rel 1
+hist of sal 1
+hist of sc 1
+hist of system 1
+hist of typ 1
+hist of us 1
+hist perspect 1
+hist quer 1
+hist rel 1
+hist rel dat 1
+hist rel datab 1
+hist standard 1
+hist structur 1
+hist tupl 1
+hist valu 1
+hist ver 1
+histogram 3
+histogram and text 1
+histogram ar defin 1
+histogram can prov 1
+histogram dist 1
+histogram featur 1
+histogram in figur 1
+histogram ind 1
+histogram is sup 1
+histogram platform 1
+histogram quer 1
+histogram rel 1
+histogram to discrim 1
+histogram vect 1
+histoir 1
+historiqu 2
+historiqu de 1
+historiqu de la 1
+historiqu dutil 1
+historiqu dutil de 1
+historytestsonedg 1
+hit 7
+hit rat 3
+hit rat degrad 1
+hit reduc 1
+hit reduc caus 1
+hit return 1
+hit th number 1
+hiw 1
+hiw rt 1
+hiw rt wi 1
+hiwirt 1
+hiwirt riwt 1
+hiwirt riwt hi 1
+hjf 1
+hjrw 1
+hk 4
+hk and sk 1
+hk mac 1
+hkust 1
+hl 4
+hl and voron 1
+hl determin 1
+hl iff 1
+hl of s1 1
+hl point 1
+hl point iff 1
+hl techniqu 1
+hl87 1
+hlast 1
+hm 4
+hm0 1
+hmg 1
+hmin 1
+hmin using 1
+hmin using expr 1
+hmt95 1
+hmv1 1
+hmv2 1
+hn 7
+hn b0 1
+hn83 1
+hn93 1
+hnam 1
+ho 6
+ho85 1
+ho94 1
+hoad 1
+hoad and tut 1
+hoad m251067 1
+hoar 4
+hoar program 1
+hoar program log 1
+hoc 8
+hoc chang 1
+hoc datab 1
+hoc datab quer 1
+hoc hom grown 1
+hoc manner 1
+hoc method 1
+hoc optim 1
+hoc optim transpar 1
+hoc solut 1
+hochreiter 1
+hochschild 2
+hochschl 1
+hod 1
+hodg 1
+hoehn 1
+hofer 1
+hofer gesellschaft 1
+hofer gesellschaft institut 1
+hoffman 1
+hoffmeister 1
+hofman 2
+hofman and benjamin 1
+hofman and pierc 1
+hogger 1
+hogger echap 1
+hogger echap aux 1
+hoich 2
+hoich cheong 2
+hoiem 1
+hol 10
+hol a princip 1
+hol in iter 1
+hol is cl 1
+hol remain 1
+hol wh 1
+holbrook 1
+hold 65
+hold a correspon 1
+hold a loc 1
+hold a reserv 1
+hold and request 1
+hold and thus 1
+hold between item 1
+hold between reg 1
+hold between spat 1
+hold c.f 1
+hold consider 1
+hold day 1
+hold decr 1
+hold decr key 1
+hold exact 1
+hold explicit 1
+hold explicit inform 1
+hold for arbitr 1
+hold for fail 1
+hold for posit 1
+hold for pur 1
+hold for suff 1
+hold for term 1
+hold for tr 1
+hold good 2
+hold good univer 2
+hold in configur 1
+hold in gener 2
+hold in order 1
+hold in pract 1
+hold indep 1
+hold inform 1
+hold it valu 1
+hold link 1
+hold lock 1
+hold mor nod 1
+hold nam 1
+hold oe 1
+hold on tur 1
+hold pointer 2
+hold prec 1
+hold regard 1
+hold th addr 1
+hold th correct 1
+hold th incom 1
+hold th init 1
+hold th key 1
+hold th lock 2
+hold th menu 1
+hold th nam 1
+hold th old 1
+hold th result 1
+hold th root 1
+hold th squar 1
+hold th valu 1
+hold that c2c 1
+hold that ss 1
+hold triv 2
+hold valu 1
+hold valu receiv 1
+hold weight 1
+hold with infl 1
+hold with oen 1
+hold with polynom 1
+holder 4
+holder or rol 1
+holder result 1
+holder result var 1
+holdman 1
+holland 23
+holland agc 1
+holland agc conserv 1
+holland elsev 1
+holland publ 3
+holland publ co 1
+holland publ compan 2
+hollander 3
+hollander is acknowledg 1
+hollevil 1
+holmer 1
+holt 1
+holt rinehart 1
+holtz 1
+holtz bi.html 1
+holtz6 1
+holtz6 tut 1
+holtz6 tut gatew7 1
+holyer 1
+holzbaur 2
+holzbaur a prop 1
+holzbaur sappliqu 1
+holzbaur sappliqu aus 1
+holzbaur143 1
+holzboog 1
+hom 9
+hom color 1
+hom color pattern 1
+hom featur 1
+hom gw 1
+hom gw kingsum 1
+hom host 1
+hom list 1
+hom mach 1
+hom mach proj 1
+hom output 1
+hom proc 1
+hom proc ar 1
+hom rel 1
+hom rel model 1
+hom textur 1
+hom textur cont 1
+hom textur featur 1
+hom traff 1
+hom traff environm 1
+hom tupl 1
+hom. 1
+hom.netscap.com 1
+hom.netscap.com as 1
+hom.netscap.com as net 1
+homer 1
+homewood 1
+homework 1
+homework is ea 1
+homog 2
+homog en 1
+homog en despac 1
+homog en fin 1
+homog en.la 1
+homog en.la propr 1
+homog ne 1
+homog ne com 1
+homog ne en 1
+homogeneouscluster 1
+homogeneouscluster nod 1
+homogeneouscluster of cl 1
+homograph 1
+homograph nont 1
+homograph nont pa 1
+homolog 1
+homomorph 2
+homomorph character 1
+homomorph from oe2 1
+homomorph map 1
+homomorph map oe2 1
+homomorph proper 1
+homomorph proper fail 1
+homomorph proper hold 1
+homomorph theorem 1
+homonym 1
+homonym r2 1
+homonym r2 rl 1
+homonym rl 1
+homoth 1
+homoth es 1
+homoth etiqu 1
+hon 1
+honest 3
+honest be said 1
+honest programmer 1
+honeycomb 1
+honeycomb architectur 1
+hong 4
+hong cit.gu.edu.au 1
+hong kong 2
+hong kong research 1
+hong shen 1
+honolulu 2
+honor 2
+honor al lock 1
+honor both implicit 1
+honor of alan 1
+honor th norm 1
+honsel 1
+honzatk 1
+hood 2
+hood refer 1
+hood refer manu 1
+hood techn 1
+hood techn group 1
+hoog 1
+hoog r.de 1
+hooh.nc.uiuc.edu 1
+hooh.nc.uiuc.edu cg 1
+hooh.nc.uiuc.edu cg overview.html 1
+hooh.nc.uiuc.edu doc 1
+hooh.nc.uiuc.edu doc cg 1
+hook 4
+hook et jeev 1
+hook int unif 1
+hooker 1
+hooker and vin 1
+hooker belief 1
+hooker ha advoc 1
+hoop 1
+hoop describ 1
+hop 34
+hop and cost 1
+hop can tak 1
+hop count 1
+hop for gener 1
+hop for map 1
+hop guid 1
+hop is nil 1
+hop mak 1
+hop network 2
+hop norm 1
+hop norm del 1
+hop of captur 1
+hop of ext 1
+hop of gener 1
+hop of maintain 1
+hop on aver 1
+hop our forthcom 1
+hop rout 1
+hop rout algorithm 1
+hop rout protocol 1
+hop tak 1
+hop th featur 1
+hop that gp 1
+hop that using 1
+hop to achief 1
+hop to ad 1
+hop to def 1
+hop to ext 1
+hop to keep 1
+hop to minim 1
+hop to nil 1
+hop to reduc 1
+hop to show 1
+hop wil giv 1
+hop94 1
+hopcroft 4
+hopcroft and j.d 1
+hopcroft and karp 1
+hopcroft ullman 1
+hopfield 1
+hopfield model 1
+hopkin 4
+hopper 1
+hor 10
+hor col 1
+hor col imag.segm 1
+hor compl 1
+hor conclus 1
+hor court 1
+hor court circuit 1
+hor de 3
+hor de ce 1
+hor de la 2
+hor de notr 1
+hor diagonaux 1
+hor diagonaux de 1
+hor may exchang 1
+hor retour 1
+hor retour ar 1
+horac 1
+horac meng 1
+horaud 1
+horgan 1
+horiuch 1
+horizon 3
+horizon g om 1
+horizon supercomput 1
+horizon supercomput system 1
+horizont 14
+horizont ac 2
+horizont and ver 1
+horizont by ad 1
+horizont constraint 1
+horizont constraint length 1
+horizont control 1
+horizont control dat 1
+horizont dash 1
+horizont dash lin 1
+horizont dot 1
+horizont dot arrow 1
+horizont fragm 1
+horizont input 1
+horizont int narrow 1
+horizont int rol 1
+horizont laser 1
+horizont laser strip 1
+horizont lin 2
+horizont or ver 3
+horizont partit 1
+horizont point 1
+horizont reconfigur 1
+horizont reconfigur architectur 1
+horizont resolut 1
+horizont rol 1
+horizont rol partit 1
+horizont run 1
+horizont run length 1
+horizont scan 1
+horizont scan design 1
+horizont scan structur 1
+horizont strip 1
+horizontalfragmentdefinit 1
+horizontalfragmentdefinit verticalfragmentdefinit 1
+horlog 1
+horlog de 1
+horlog de diff 1
+horlog glob 1
+horn 10
+horn and c.l 1
+horn ca 1
+horn claus 5
+horn claus log 1
+horn claus program 2
+horn fragm 1
+horn log 1
+horn pr 1
+horn pr log 1
+horn program 2
+hornik 2
+horowitz 1
+horst 3
+horst friedrich 1
+horst friedrich phon 1
+horst.friedrich 1
+horst.friedrich isst.fhg.de 1
+hort 2
+hort90 1
+horwat 1
+horwitz 1
+horwood 2
+horwood ltd 1
+hosob 1
+host 11
+host 2host 1
+host ad 1
+host and network 1
+host ar avail 1
+host ar connect 1
+host ar identif 1
+host ar loop 1
+host ar refer 1
+host ar serv 1
+host ar uniqu 1
+host arp 1
+host arp cach 1
+host at se 1
+host be fic 1
+host belief 1
+host belong 1
+host busloc 1
+host busloc buspriv 1
+host by fast 1
+host by siem 1
+host can chang 1
+host character 1
+host clock 1
+host cod 1
+host commun 1
+host commun using 1
+host con 1
+host connect 1
+host crash 1
+host ext 2
+host failur 1
+host failur rat 1
+host ha fail 1
+host imperson 1
+host in adv 1
+host in order 1
+host inf 1
+host inf datab 1
+host ip 1
+host ip addr 1
+host is al 1
+host is assum 1
+host is cap 1
+host is funct 1
+host is interpr 1
+host is isol 1
+host is select 1
+host is serv 1
+host kcm 1
+host kcm interact 1
+host kernel 1
+host kernel contain 1
+host mach 1
+host merg 1
+host monit 1
+host of parallel 1
+host oper 1
+host oper system 1
+host or select 1
+host path 1
+host path wh 1
+host proc 1
+host prolog 1
+host prov 1
+host prov var 1
+host requir 1
+host requir docum 1
+host rowan.ukc.ac.uk 1
+host run 1
+host sen 1
+host sen me 1
+host sen period 1
+host serv 1
+host softwar 1
+host speed 1
+host status 1
+host status contain 1
+host status datab 1
+host status inform 1
+host system 1
+host think 1
+host timeout 1
+host to imperson 1
+host transm 1
+host transm period 1
+host with smallest 1
+host withdraw 1
+host without disrupt 1
+hostinf 1
+hot 5
+hot after quant 1
+hot cod 1
+hot encod 1
+hot proc 1
+hot solut 1
+hot spar 1
+hot spot 2
+hot spot distribut 1
+hot spot ind 1
+hotl 1
+hotspot 1
+hotspot nod 1
+hotspot with background 1
+hou 1
+houck 1
+hough 1
+hough transform 1
+hough transfrom 1
+hour 13
+hour by rober 1
+hour cpu 1
+hour cpu tim 1
+hour handl 1
+hour handl enginest 1
+hour in writ 1
+hour lead 1
+hour mincruisespeed 1
+hour of an 1
+hour of combin 1
+hour of execut 1
+hour of human 1
+hour of lectur 1
+hour of siml 1
+hour of subject 1
+hour of test 1
+hour of think 1
+hour on mach 1
+hour repr 1
+hour sav 1
+hour to produc 1
+hour to schedl 1
+hour wer fl 1
+hous 3
+hous puzzl 1
+hous rowan.ukc.ac.uk 1
+housekeep 1
+housekeep oper 1
+housekeep oper perform 1
+houst 3
+houtan 1
+houtan aghil 1
+how68 1
+howd 1
+hp 5
+hp ux 1
+hp ux nl 1
+hp workst 1
+hp1 1
+hp91 1
+hp93 1
+hp94 1
+hpc 1
+hpc95 1
+hpcc 1
+hpcc gcag 1
+hpcc gcag grant 1
+hpf 2
+hpf and svm 1
+hpf avail 1
+hpf compiler 1
+hpf compiler avail 1
+hpf in form 1
+hpf langu 1
+hpf langu ver 1
+hpf mp 1
+hpf proc tim 1
+hpf ver 1
+hpf ver compil 1
+hpg 1
+hpg appl 1
+hpg compon 1
+hpg oft cach 1
+hpg unit 1
+hpg unit retrief 1
+hpk 1
+hr 3
+hr89 1
+hrdm 1
+hs 3
+hsc95 1
+hsing 1
+hsing yu 1
+hstat 1
+hsu 8
+hsu and r.c.t 1
+hsueh 1
+hsueh i lu 1
+hsx91 1
+ht 4
+ht ar defin 1
+ht pt 1
+htj 1
+html 4
+html befor displ 1
+html docum 2
+html langu 1
+html langu allow 1
+html pag 1
+html spec 1
+html spec 8.html 1
+html spec html 1
+html syntac 1
+html viewer 1
+htot 1
+htot denot 1
+htot rhn 1
+http 21
+http http2.html 1
+http protocol 3
+http protocol3 1
+http server 2
+http server avail 1
+http2.html 1
+hu 9
+hu par 1
+hu par le 1
+hu teng 1
+hu0 1
+hu1 1
+hu79 1
+huang 3
+hub91 1
+hubbard 4
+huber 2
+huberman 1
+hubick 1
+hubick and sysl 1
+hubrig 1
+hubrig schaumburg 1
+hudak 3
+hudson 1
+hudson val 1
+hufschmidt 1
+hug 14
+hug addr 1
+hug addr spac 1
+hug amount 2
+hug chunk 1
+hug chunk siz 1
+hug dag 1
+hug del 1
+hug del du 1
+hug disadv 1
+hug fan 1
+hug glob 1
+hug glob spac 1
+hug imag 1
+hug imag datab 1
+hug margin 1
+hug monster 1
+hug number 1
+hug quant 1
+hug transact 1
+hug transact tim 1
+hug valu 1
+hug var 1
+hug vol 1
+hugh 2
+hugin 1
+hugin sen 1
+hugin univer 1
+hugin univer becom 1
+hugu 1
+hugu ler 1
+huh93 1
+huhn 1
+huit 3
+huit processeur 1
+huitouz 1
+hullot 1
+humain 4
+humain de 1
+humain de se 1
+human 23
+human act 1
+human aspect 1
+human being 1
+human bod 1
+human can identif 1
+human cognit 1
+human cognit abil 1
+human commun 1
+human commun mod 1
+human computer 4
+human computer dialog 1
+human computer interact 3
+human consider 1
+human dec 1
+human dec proc 1
+human deoxyhaemoglobon 1
+human effort 2
+human ey 1
+human fac 1
+human fac imag 1
+human fact 4
+human fact soc 1
+human imag 1
+human imag allow 1
+human int 1
+human intellig 1
+human interpr 1
+human langu 1
+human libr 1
+human libr patron 1
+human mind 1
+human mind abil 1
+human observer 1
+human oper 1
+human or computer 1
+human organ 1
+human pelv 1
+human perc 1
+human perc textur 1
+human programmer 1
+human read 1
+human reader 1
+human subject 1
+human subject percept 1
+human tim 1
+human to human 1
+human typ 1
+human typ perc 1
+human understand 1
+human user 1
+human vi 1
+human vi system 1
+human work 1
+humbl 1
+humbl and spir 1
+humboldt 1
+humboldt found 1
+hummel 1
+humphr 1
+hundr 10
+hundr act 1
+hundr act select 1
+hundr keyword 1
+hundr nod 1
+hundr nod dep 1
+hundr of act 1
+hundr of cycl 1
+hundr of mil 1
+hundr of tim 1
+hundr tim 1
+hundr tim faster 1
+hundr to thousand 1
+hundr ver 1
+hung 3
+hung al featur 1
+hunk 1
+hunk jc 1
+hunk jc hunkn 1
+hunk2chu 1
+hunk2chu nk1c 1
+hunk2chu nk1c hunkn 1
+hunkn 1
+hunt 2
+hunter 2
+hunter et al 1
+hunter of idl 1
+huntingt 2
+huntingt av 1
+huntingt avenu 1
+hur 2
+hurdl 2
+hurlber 1
+hurt 1
+hurt th classif 1
+hus 1
+hus lederman 1
+husband 1
+hush 1
+hussein 1
+hussein zedan 1
+hustrus 1
+hustrus fon 1
+hut 1
+hut91 1
+hutchin 1
+hutchin et al 1
+hutchinson 3
+hutchinson and peterson 1
+huttenloch 1
+huv 1
+hv 2
+hv94 1
+hvdm 1
+hvdm dist 1
+hvdm dist funct 1
+hw 2
+hw cq 1
+hw fif 1
+hwang 2
+hwsw.ged.de 1
+hx 2
+hx j xi 1
+hx0 1
+hx1 1
+hx2 1
+hxiduj 1
+hxiduj aduij 1
+hy 1
+hy j xi 1
+hybr 3
+hybr d esign 1
+hybr de 1
+hybr de ag 1
+hybr grad 1
+hybr grad classiqu 1
+hybr qu 1
+hybr qu sembl 1
+hybrid 13
+hybrid and 2d 1
+hybrid con 1
+hybrid con wh 1
+hybrid de 1
+hybrid de no 1
+hybrid en 1
+hybrid en combin 1
+hybrid f op 1
+hybrid fragm 1
+hybrid integr 1
+hybrid integr system 1
+hybrid langu 1
+hybrid method 1
+hybrid nearest 1
+hybrid nearest neighbor 1
+hybrid neur 1
+hybrid neur method 1
+hybrid propag 1
+hybrid propag exact 1
+hybrid propag method 1
+hybrid propag schem 1
+hybrid search 1
+hybrid search strateg 1
+hybrid stack 1
+hybrid stack orient 1
+hybrid strateg 1
+hybrid system 1
+hybrid tr 1
+hybrid tr form 1
+hybrid tr formaliz 1
+hybrid tr merg 1
+hybrid traff 1
+hybrid traff con 1
+hybrid unicast 1
+hydr 1
+hydr dat 1
+hydr dat wh 1
+hydrocod 1
+hydrocod tin 1
+hydrolog 1
+hyg 1
+hyg expan 1
+hyp 1
+hyp ebg 1
+hyp in hypoth 1
+hyp spec 1
+hyp spec ind 1
+hyper 2
+hyper rl 1
+hyperbol 3
+hyperbol and ellipt 1
+hyperbol branch 1
+hyperbol constraint 1
+hyperbol equ 1
+hyperbol equ axx2 1
+hyperbol equ xy 1
+hyperbol inequ 1
+hyperbol inequ xy 1
+hyperbol tang 1
+hyperbol tang funct 1
+hyperbol with parameter 1
+hypercub 16
+hypercub algorithm 1
+hypercub and mesh 1
+hypercub and rel 1
+hypercub and therefor 1
+hypercub avec 1
+hypercub concur 1
+hypercub concur computer 1
+hypercub connect 1
+hypercub connect vect 1
+hypercub construc 1
+hypercub construc algorithm 1
+hypercub de 1
+hypercub de dim 1
+hypercub internet 2
+hypercub internet follow 2
+hypercub internet prov 2
+hypercub mach 1
+hypercub multicomputer 1
+hypercub multicomputer interconnect 1
+hypercub multiproc 3
+hypercub multiproc concur 1
+hypercub network 4
+hypercub of dim 1
+hypercub oper 1
+hypercub or cub 1
+hypercub or mesh 1
+hypercub parallel 1
+hypercub parallel proc 1
+hypercub shar 1
+hypercub shar virtu 1
+hypercub sur 1
+hypercub sur lipsc 1
+hypercub th tim 1
+hypercubew 2
+hypercubew p 2logm 2
+hypercubiqu 1
+hypercueb 2
+hypercueb mp 2
+hypercueb mp 2logm 2
+hypercuew 2
+hypercuew p 2logm 2
+hyperdocum 1
+hyperedg 1
+hyperedg ar giv 1
+hyperedg contain 1
+hyperedg contain exact 1
+hyperedg continu 1
+hyperedg hav exact 1
+hyperedg hi 1
+hyperedg point 1
+hyperedg point defin 1
+hyperedg th belong 1
+hyperedg zer 1
+hyperedg3 1
+hyperfiel 1
+hyperfield 1
+hyperfield of context 1
+hypergeometer 2
+hypergeometer prob 1
+hypergeometer prob distribut 1
+hypergeometer ser 1
+hypergraph 4
+hypergraph and rel 1
+hypergraph emb 1
+hypergraph sat 1
+hypergraph sat algorithm 1
+hypergraph with nod 1
+hyperlink 1
+hyperlink or refer 1
+hyperm 3
+hyperm and remot 1
+hyperm ba 1
+hyperm ba learn 1
+hyperm docum 1
+hyperm for learn 1
+hyperm protocol 1
+hypernym 1
+hypernym fil 1
+hypernym of bicycl 1
+hyperoctr 1
+hyperoctr and giv 1
+hyperoctr and hybrid 1
+hyperoctr de 1
+hyperoctr de dim 1
+hyperoctr from multidim 1
+hyperoctr from se 1
+hyperoctr repr 1
+hyperoctr t1 1
+hyperplan 5
+hyperplan ar construc 1
+hyperplan ar parallel 1
+hyperplan between possibil 1
+hyperplan bi 1
+hyperplan configur 1
+hyperplan configur se 1
+hyperplan defin 1
+hyperplan div 1
+hyperplan famil 1
+hyperplan in pattern 1
+hyperplan method 1
+hyperplan satisf 1
+hyperplan somewhat 1
+hyperplan somewhat larger 1
+hyperplan spin 1
+hyperplan spin dynam 1
+hyperplan to til 1
+hyperplan with arbitr 1
+hyperrectangl 1
+hyperrectangl algorithm 1
+hyperrectangl learn 1
+hyperrectangl learn method 1
+hyperrectangl or rl 1
+hyperrectangl to classif 1
+hyperrectangl to repr 1
+hyperscript 1
+hyperscript innov 1
+hyperscript innov educ 1
+hyperstructur 1
+hypertext 4
+hypertext author 1
+hypertext author system 1
+hypertext hyperm 1
+hypertext markup 1
+hypertext markup langu 1
+hypertext paradigm 1
+hypertext transfer 1
+hypertext transfer protocol 1
+hypertext www 1
+hypertext www markup 1
+hypertext www protocol 1
+hypertextu 1
+hypertextu capabil 1
+hypertool 1
+hyph 2
+hyph ind 1
+hyph nam 1
+hyph rl 1
+hypotenus 1
+hypotenus edg 1
+hypoth 40
+hypoth and remov 1
+hypoth and split 1
+hypoth appl 1
+hypoth ar gener 1
+hypoth ar test 1
+hypoth ar verif 1
+hypoth assum 1
+hypoth compar 1
+hypoth dum 1
+hypoth dum record 1
+hypoth es 4
+hypoth es analogu 1
+hypoth es assez 1
+hypoth es contraign 1
+hypoth es de 1
+hypoth es imp 1
+hypoth es math 1
+hypoth es ne 1
+hypoth es pr 1
+hypoth es proch 1
+hypoth es qu 1
+hypoth es quil 1
+hypoth es soit 1
+hypoth es sont 1
+hypoth es suiv 1
+hypoth es sur 1
+hypoth etiqu 1
+hypoth etiqu nest 1
+hypoth fi 1
+hypoth fi verif 1
+hypoth form 2
+hypoth gener 1
+hypoth gener inclus 1
+hypoth gener ph 1
+hypoth gener strateg 1
+hypoth giv 1
+hypoth hold 1
+hypoth in equ 1
+hypoth is gener 1
+hypoth is verif 1
+hypoth match 1
+hypoth model 1
+hypoth reason 1
+hypoth se 1
+hypoth se nest 1
+hypoth stud 1
+hypoth stud bil 1
+hypoth system 1
+hypoth system wh 1
+hypoth test 2
+hypoth then appl 1
+hypoth to construc 1
+hypoth to find 1
+hypoth to prov 1
+hypoth to t1 1
+hypoth verif 1
+hypoth verif inclus 1
+hypoth we assum 1
+hypoth we know 1
+hypothesizedin 1
+hyster 1
+hyster bin 1
+hyster bin neuron 1
+hytelnet 1
+hz 1
+i.3.5 1
+i.a 3
+i.c 1
+i.conf 1
+i.daubech 1
+i.i.d 1
+i.j 2
+i.k 1
+i.loc 1
+i.loc describ 1
+i0 2
+i0 acc 1
+i0 dun 1
+i0 dun part 1
+i0 ij 1
+i0 lt 1
+i0 nt 1
+i0 nt bt 1
+i0 nt kbt 1
+i0 read 1
+i0 that writ 1
+i0 writ 1
+i01 1
+i0n 1
+i1 11
+i1 2j1 1
+i1 2j1 i21 1
+i1 2j2 1
+i1 2j2 i21 1
+i1 aic0 1
+i1 aic0 bi 1
+i1 and i1 1
+i1 correspon 1
+i1 d1i2 1
+i1 do i2 1
+i1 ej 1
+i1 est 1
+i1 est obtenu 1
+i1 et i1 1
+i1 et i2 1
+i1 et le 1
+i1 for i2 1
+i1 i2 3
+i1 i2 dj 1
+i1 i2 i2 1
+i1 i2 j2 1
+i1 i21 1
+i1 i3 1
+i1 ij 1
+i1 ij lt 1
+i1 j jt 1
+i1 j2 1
+i1 j2 i1 1
+i1 j2 i2 1
+i1 j2 j1 1
+i1 jm 1
+i1 jx1j 1
+i1 l1 1
+i1 la 1
+i1 la localit 1
+i1 la var 1
+i1 li 1
+i1 li1 1
+i1 lt 1
+i1 min1 1
+i1 n 2j2 1
+i1 n i1 1
+i1 n i2 1
+i1 n j1 1
+i1 n j2 1
+i1 of ind 1
+i1 to n1 1
+i1do 1
+i1do i2 1
+i2 9
+i2 2j2 1
+i2 2j2 i22 1
+i2 a pu 1
+i2 and expan 1
+i2 appart 1
+i2 appart donc 1
+i2 d epen 1
+i2 de 1
+i2 de fonct 1
+i2 deux 1
+i2 dj 1
+i2 du 1
+i2 du nid 1
+i2 du syst 1
+i2 ek 1
+i2 etant 1
+i2 etant ind 1
+i2 f0 1
+i2 i 3k 1
+i2 i1 2
+i2 i1 j2 1
+i2 i2 1
+i2 i2 i22 1
+i2 i22 1
+i2 i3 2
+i2 i3 appart 1
+i2 in ph 1
+i2 is depict 1
+i2 is replac 1
+i2 j2 1
+i2 j2 i2 1
+i2 le 1
+i2 le point 1
+i2 li2 1
+i2 mac 1
+i2 n j1 1
+i2 of ph 1
+i2 r1 1
+i2 root 1
+i2 to n2 1
+i2 to perform 1
+i21 1
+i21 3i1 1
+i21 i1 1
+i21 i1 2j1 1
+i21 i1 i21 1
+i22 1
+i22 3i2 1
+i22 i2 1
+i2b 1
+i2e 1
+i2e ti 1
+i2f1 1
+i2f2 1
+i2f3 1
+i2f4 1
+i2f6 1
+i2f7 1
+i2f8 1
+i2f9 1
+i2i 2
+i2i gi 1
+i2i xi 1
+i2j 1
+i2lh 1
+i2n 2
+i2n an enumer 1
+i2n as follow 1
+i2n cover 1
+i2n est 1
+i2n est un 1
+i2njiij 1
+i2rh 1
+i2v 1
+i2v aic 1
+i2v aic 1g 1
+i2v aic est 1
+i2v fkg 1
+i2v fkg a0ka 1
+i2v fkg ak0ic 1
+i3 4
+i3 3k 1
+i3 appart 1
+i3 appart donc 1
+i3 f0 1
+i3 i2 1
+i3 is giv 1
+i3 matr 1
+i3 matr identit 1
+i4 1
+i4 f12 1
+i56 1
+i59 1
+i6 2
+i6 h xi 1
+i860 3
+i860 dintel 1
+i860 dont lun 1
+i860 xp 1
+i860 xr 1
+ia 2
+ia c mod 1
+iad 1
+iag 1
+iain 1
+iain duff 1
+ian 4
+ian holland 2
+iand 1
+iapr 1
+iapr inter 1
+ib 6
+ib and affin 1
+ib and ir 1
+ib and symbol 1
+ib and upper 1
+ib ar describ 1
+ib f0 1
+ib is step 1
+ib loop 1
+ib mean 1
+ib pn 1
+ib tn 1
+ib2 1
+ib2 and ib3 1
+ib2 s problem 1
+ib3 1
+ib3 inclus 1
+ib3 wa abl 1
+ibam 1
+ibam and imp 1
+ibam belong 1
+ibam implem 1
+ibar 1
+ibarak 1
+ibarak kuamp.kyot 1
+ibarak kuamp.kyot u.ac.jp 1
+ibbar 1
+ibbar and m.h 1
+ibf 1
+ibf schl 1
+ibf schl dagstuhl 1
+ibg 1
+ibin 1
+ibir 1
+ibir cod 1
+ibl 1
+ibm 28
+ibm almad 1
+ibm almad research 1
+ibm and microsoft 1
+ibm cooper 1
+ibm cooper fellowship 1
+ibm corp 1
+ibm corpor 1
+ibm db2 1
+ibm do prov 1
+ibm endicot 1
+ibm endicot program 1
+ibm gf11 1
+ibm gf11 mach 1
+ibm gradu 2
+ibm gradu fellowship 2
+ibm intern 1
+ibm intern techn 1
+ibm mid hudson 1
+ibm optim 1
+ibm optim subrout 1
+ibm os 1
+ibm oweg 1
+ibm powerparallel 1
+ibm prior 1
+ibm research 5
+ibm research cyberjourn 1
+ibm research div 1
+ibm research report 5
+ibm risc 1
+ibm rj 1
+ibm rp3 1
+ibm rs 1
+ibm rs6000 1
+ibm sp 2
+ibm sp1 2
+ibm sp1 mpl 1
+ibm sp1 sp2 1
+ibm sp2 3
+ibm sp2 mp 1
+ibm sp2 wn 1
+ibm system 3
+ibm t.j 1
+ibm techn 1
+ibm techn report 1
+ibm vs 1
+ibm vs ext 1
+ibm yorktown 1
+ibm93 1
+ibm94 1
+ibmapromsequencerrammirpsptpcu 1
+ibn 2
+ibn and obn 1
+ibn ar uncolor 1
+ibn reach 1
+ibrahim 4
+ibrahim kamel 1
+ibrahim kamel3 1
+ibrahim mat 1
+ibtp 1
+ibtp irp 1
+ibtp irp 1bus 1
+ibus 1
+ibus cbus 1
+ibus cbus abus 1
+ibus ofsbus 1
+ibus ofsbus abus 1
+ic 10
+ic a savoir 1
+ic au 1
+ic au rec 1
+ic avec 1
+ic de 1
+ic de calculer 1
+ic de group 1
+ic den 1
+ic den citer 1
+ic deux 1
+ic deux techniqu 1
+ic distinguer 1
+ic distinguer tr 1
+ic e ll 1
+ic el 1
+ic forth 1
+ic g en 1
+ic han 1
+ic han benker 1
+ic heraklion 1
+ic la 2
+ic la classif 1
+ic la wam 1
+ic lapproxim 1
+ic lapproxim qu 1
+ic leur 1
+ic leur expr 1
+ic lhypoth 1
+ic lhypoth es 1
+ic ll 1
+ic pour 1
+ic pour le 1
+ic qu 3
+ic qu de 1
+ic qu le 1
+ic qu lutil 1
+ic quaux 1
+ic quaux architectur 1
+ic sont 1
+ic sont princip 1
+ic un 3
+ic un algorithm 1
+ic un ext 1
+ic un solut 1
+ic un techniqu 1
+ic92.dv.z 1
+icalp 3
+icassp 1
+icc 2
+icc94 1
+iccv 1
+iccv95 1
+iccv95 and ipm95 1
+icf 1
+icg 1
+icl 1
+icl ecrc 1
+icl pw 1
+iclp 2
+iclp workshop 1
+iclp90 1
+iclp91 1
+iclp91 workshop 1
+iclp93 1
+iclp94 1
+iclp94 worshop 1
+icm 1
+icm3 1
+icm4 1
+icml 1
+icmp 1
+icmp ech 1
+icmp ech command 1
+icn 1
+icod 1
+icon 8
+icon cod 1
+icon cod tr 1
+icon edit 1
+icon for task 1
+icon imag 1
+icon imag cl 1
+icon ind 1
+icon menus 1
+icon therefor 1
+iconnectionpoint 1
+iconnectionpoint interfac 1
+icot 4
+icot stand 1
+icp 3
+icp workshop 1
+ictl94 1
+ictur 1
+ictur ba 1
+ictur ba block 1
+id 80
+id about gener 1
+id algorithm 2
+id and perform 1
+id and show 1
+id and tak 1
+id appl 1
+id ar part 1
+id ar prop 1
+id architectur 1
+id as nec 1
+id bal 1
+id bal weight 1
+id behind laz 1
+id behind sort 1
+id but differ 1
+id by ad 1
+id ca 1
+id can ea 1
+id can mak 1
+id com 1
+id compl 1
+id condit 1
+id configur 1
+id describ 2
+id differ 1
+id empl 1
+id ent 1
+id expr 1
+id fair 1
+id fair behavior 1
+id for combin 1
+id for deal 1
+id for ext 1
+id for find 1
+id for learn 1
+id for lit 1
+id for modl 1
+id for predict 1
+id framework 1
+id gener 1
+id gener system 1
+id in gener 1
+id in log 1
+id in program 1
+id involut 1
+id is ba 1
+id is introduc 1
+id is simp 1
+id lik input 1
+id lim 1
+id load 1
+id load bal 1
+id med 1
+id med architectur 1
+id multithread 1
+id multithread mach 1
+id nic 1
+id of abstract 1
+id of adapt 1
+id of chain 1
+id of coh 1
+id of combin 1
+id of compon 1
+id of crossover 1
+id of de 1
+id of decluster 1
+id of differ 1
+id of dither 1
+id of exact 1
+id of fe 1
+id of incorpor 1
+id of introduc 1
+id of modl 1
+id of multilevel 1
+id of propag 1
+id of resolut 1
+id of siz 1
+id of soft 1
+id of syntac 1
+id of tak 1
+id of timesl 1
+id of tool 1
+id of transform 2
+id of typ 1
+id of using 2
+id of util 1
+id of weak 1
+id on edg 1
+id on good 1
+id on inst 1
+id oracl 1
+id oracl model 1
+id pr 2
+id prev 1
+id prev work 1
+id scal 1
+id schedl 1
+id schedl discipl 1
+id server 1
+id should build 1
+id shown 1
+id situ 1
+id solut 2
+id som keyword 1
+id spat 1
+id spat adapt 1
+id suit 2
+id that bound 1
+id theor 1
+id to def 1
+id to gener 1
+id to highlight 1
+id to look 1
+id tw level 1
+id wareh 1
+id wareh manag 1
+id wh checkbook 1
+id which ap 1
+id which form 1
+id which underl 1
+id0 1
+id0 form1 1
+id1 3
+id1 as id2 1
+id1 form1 1
+id1 id2 1
+id1 id2 id3 1
+id1 is refer 1
+id2 2
+id2 form2 1
+id2 id3 1
+id2 renam 1
+id2 renam standard 1
+id3 1
+idb 1
+idb atom 1
+idb fact 1
+idb fact ri 1
+idb herbrand 1
+idb herbrand atom 1
+idb pr 1
+idb pr parameter 1
+idb pr symbol 1
+idb pr valu 1
+idb rel 1
+idb rel aexpr 1
+idb rel atom 1
+idb rel replac 1
+idempot 7
+idempot and satisf 1
+idempot for non 1
+idempot of recov 1
+idempot oper 1
+idempot substitut 2
+iden 1
+iden matr 1
+ident 60
+ident and ext 1
+ident and henc 1
+ident and individu 1
+ident and level 1
+ident and match 1
+ident and propag 1
+ident and start 1
+ident answer 1
+ident behav 1
+ident behav act 1
+ident coordin 1
+ident dat 1
+ident dat format 1
+ident dest 1
+ident differ 1
+ident disposit 1
+ident distribut 2
+ident distribut random 1
+ident el 1
+ident el nl 1
+ident equ 1
+ident er 1
+ident funct 1
+ident input 1
+ident interfac 1
+ident is denot 1
+ident is propag 1
+ident label 1
+ident label edg 1
+ident matr 3
+ident me 1
+ident nod 2
+ident nod weight 1
+ident of edg 1
+ident of indiscernibl 1
+ident of nod 1
+ident of slav 1
+ident off diagon 1
+ident order 1
+ident output 1
+ident pack 1
+ident pack flit 1
+ident popl 1
+ident privileg 1
+ident privileg se 1
+ident problem 1
+ident proof 1
+ident random 1
+ident random var 1
+ident se 1
+ident structur 1
+ident thr dim 1
+ident to cal 1
+ident to cl2 1
+ident to execut 1
+ident to loop 1
+ident to margin 1
+ident to oe1 1
+ident to q1.5 1
+ident to rt1 1
+ident to tradit 1
+ident weight 1
+identif 74
+identif a cl 1
+identif a cp 1
+identif a finit 1
+identif a loc 1
+identif a nec 1
+identif a person 1
+identif a prior 1
+identif a reason 1
+identif a rol 1
+identif a task 1
+identif a yellow 1
+identif acc 1
+identif al test 1
+identif and control 1
+identif and dent 1
+identif and handl 1
+identif and manu 1
+identif and real 1
+identif and strateg 1
+identif and subdivid 1
+identif and tim 1
+identif appear 1
+identif appropr 1
+identif appropr prescript 1
+identif ar imp 1
+identif as common 1
+identif as conceptu 1
+identif as oper 1
+identif as text 1
+identif author 1
+identif begin 1
+identif behaviour 1
+identif bod 1
+identif by garlan 1
+identif by human 1
+identif by unquot 1
+identif by view 1
+identif ca 1
+identif ce 1
+identif ce ca 1
+identif chang 1
+identif cl 1
+identif cl nam 1
+identif cl opt 1
+identif closest 1
+identif closest match 1
+identif constraint 1
+identif construc 1
+identif construc spec 1
+identif correspon 1
+identif criter 1
+identif denot 1
+identif direct 1
+identif direct edg 1
+identif docum 1
+identif docum object 1
+identif ea 1
+identif eight 1
+identif equiv 1
+identif equiv liter 1
+identif error 1
+identif expr 1
+identif expr cl 1
+identif expr gf 1
+identif fac 1
+identif failur 1
+identif failur typ 1
+identif follow 1
+identif for chang 1
+identif for vi 1
+identif form 1
+identif four main 1
+identif four mayor 1
+identif from giv 1
+identif futur 1
+identif futur work 1
+identif garb 1
+identif gen 1
+identif gen lambd 1
+identif graph 1
+identif graph reg 1
+identif group 1
+identif identif 1
+identif in object 1
+identif init 1
+identif initarg 1
+identif initarg nam 1
+identif is bound 1
+identif issu 1
+identif it sender 1
+identif j acc 1
+identif j cl 1
+identif j identif 1
+identif j initform 1
+identif j simpl 1
+identif j writer 1
+identif keyword 1
+identif lambd 1
+identif lambd list 1
+identif major 1
+identif major docum 1
+identif modif 1
+identif modif traver 1
+identif modl 1
+identif modl direct 1
+identif nam 1
+identif nam symbol 1
+identif new identif 1
+identif nonobsol 1
+identif nonobsol test 1
+identif number 1
+identif of abut 1
+identif of chem 1
+identif of compon 1
+identif of correct 1
+identif of equiv 1
+identif of handwrit 1
+identif of posit 1
+identif of program 1
+identif of relev 1
+identif on med 1
+identif opportun 1
+identif opportun dec 1
+identif ph 1
+identif port 1
+identif prec 2
+identif problem 2
+identif problem fi 1
+identif prom 1
+identif prom direct 1
+identif quest 1
+identif quest fi 1
+identif rectangl 1
+identif rectangl structur 1
+identif reg 1
+identif reg bound 1
+identif rel 1
+identif relev 1
+identif relev agent 1
+identif schem 1
+identif schem disc 1
+identif seen 1
+identif sever level 1
+identif sever problem 1
+identif shar 1
+identif shar el 1
+identif should emerg 1
+identif slot 1
+identif slot opt 1
+identif som interest 1
+identif st 1
+identif succeed 1
+identif supercl 1
+identif supercl nam 1
+identif syntact 1
+identif syntact differ 1
+identif system 1
+identif system organ 1
+identif test 1
+identif text 1
+identif text reg 1
+identif textur 1
+identif textur cont 1
+identif th bar 1
+identif th caus 1
+identif th compon 1
+identif th condit 1
+identif th cost 1
+identif th dat 1
+identif th differ 1
+identif th docum 1
+identif th dynam 1
+identif th error 1
+identif th fact 1
+identif th fault 1
+identif th insuff 1
+identif th issu 1
+identif th lock 1
+identif th log 1
+identif th minim 1
+identif th modif 1
+identif th multim 1
+identif th oper 1
+identif th over 1
+identif th pot 1
+identif th reg 1
+identif th relev 1
+identif th requir 1
+identif th se 3
+identif th shar 1
+identif th splitter 1
+identif th test 1
+identif th text 1
+identif th theor 1
+identif th typ 2
+identif th weakest 1
+identif th yellow 1
+identif than implem 1
+identif their character 1
+identif thr experim 1
+identif thr kind 1
+identif to examin 1
+identif unar 1
+identif unar pr 1
+identif uniqu 1
+identif using 3
+identif using eqn 1
+identif using neur 1
+identif wh 1
+identif wh lec 1
+identif which se 1
+identif which uniqu 1
+identificateur 1
+identificateur de 1
+identificateur de foncteur 1
+identificateur uniqu 1
+identificateur uniqu du 1
+identioabl 1
+identioabl en 1
+identioabl en tout 1
+identioc 1
+identioc and measur 1
+identiqu 3
+identiqu a la 1
+identiqu a linstruc 1
+identiqu au 1
+identiqu au cod 1
+identiqu au mod 1
+identiqu avant 1
+identiqu avant le 1
+identiqu contraint 1
+identiqu dan 1
+identiqu dan le 1
+identiqu de 1
+identiqu de register 1
+identiqu en 1
+identiqu en ce 1
+identiqu est 1
+identiqu est tp 1
+identiqu rel 1
+identiqu rel es 1
+identit 2
+identit s remarquabl 1
+idiosyncr 1
+idiosyncr de 1
+idiosyncr de prolog 1
+idispatch 1
+idispatch prov 1
+idj 1
+idj pf 1
+idj pf ffdg 1
+idl 12
+idl and bus 1
+idl bus 1
+idl connect 1
+idl connect becom 1
+idl connect start 1
+idl cycl 1
+idl du 1
+idl if se 1
+idl lock 1
+idl network 1
+idl network 10ms 1
+idl output 1
+idl output port 1
+idl period 1
+idl proc 1
+idl proc acc 1
+idl proc fetch 1
+idl proc using 1
+idl se 1
+idl specif 1
+idl th system 1
+idl tim 2
+idl to fil 1
+idl wait 1
+idl workst 1
+idleapprxfil 1
+idn 1
+idxp 1
+idxp norm 1
+idxp norm vect 1
+ie 85
+ie 11th 1
+ie 11th intern 1
+ie acm 2
+ie acm transact 1
+ie acoust 1
+ie annu 1
+ie annu symp 1
+ie ar introduc 1
+ie arithm 1
+ie bulletin 2
+ie commun 3
+ie commun magaz 3
+ie comp 2
+ie compcon 1
+ie computer 27
+ie computer graph 3
+ie computer soc 13
+ie correspon 1
+ie dat 1
+ie dat engineer 1
+ie design 1
+ie design autom 1
+ie exper 1
+ie first intern 1
+ie float 1
+ie float point 1
+ie foc 2
+ie glob 1
+ie glob telecommun 1
+ie in 1
+ie in intern 1
+ie infocom 1
+ie int 2
+ie inter 1
+ie intern 14
+ie intern as 1
+ie intern computer 1
+ie intern parallel 1
+ie intl 1
+ie lign 1
+ie loc 1
+ie loc computer 1
+ie ma 1
+ie ma st 1
+ie micr 4
+ie multim 1
+ie multim magaz 1
+ie network 1
+ie pam 1
+ie parallel 1
+ie pr 4
+ie real tim 1
+ie reg 1
+ie sign 1
+ie softwar 7
+ie softwar pp 1
+ie southeast 1
+ie spring 1
+ie standard 1
+ie standard vhdl 1
+ie std 1
+ie sym 1
+ie symp 2
+ie sypmp 1
+ie t pam 1
+ie tran 21
+ie transact 47
+ie workshop 3
+iec 4
+iec di 1
+iec jtc1 2
+iec jtc1 sc2 1
+iec jtc1 sc29 1
+iec problem 1
+iec problem inst 1
+ied 1
+ied safem 1
+ierard 1
+iesd.auc.dk 2
+iewd 1
+iewd vint 1
+iewd vint hil 1
+if 3
+if intellig 1
+if universit 1
+if8 1
+ifac 1
+ifc 1
+iff 17
+iff 8g 1
+iff 8y9x 1
+iff 9so 1
+iff a0i 1
+iff a0i a0j 1
+iff both e1 1
+iff c vi 1
+iff c1 1
+iff c1 appear 1
+iff cl2 1
+iff constraint 1
+iff constraint si 1
+iff each level 1
+iff fi 1
+iff fi fj 1
+iff i e0 1
+iff it constraint 1
+iff it map 1
+iff it satisf 1
+iff it sequ 1
+iff no request 1
+iff p1 1
+iff sn 1
+iff step 1
+iff th aff 1
+iff th constraint 1
+iff th mult 1
+iff th quantif 1
+iff ther ec 4
+iff ui 1
+iff w0 1
+iff xi 1
+iff xi xj 1
+ifip 4
+ifip 13th 1
+ifip 13th world 1
+ifip89 1
+ifl 1
+ifmod 1
+ifmod ap 1
+ifmod ap currexp 1
+ift 1
+ift g1 1
+ig 3
+igarash 1
+igarash and naok 1
+igj 1
+iglehart 1
+ignac 1
+ignac silv 1
+ignac silv lep 1
+ignor 30
+ignor adjustm 1
+ignor adjustm valu 1
+ignor al fal 1
+ignor al request 1
+ignor an addit 1
+ignor any dep 1
+ignor as mi 1
+ignor bar 1
+ignor bar creat 1
+ignor bound 1
+ignor bound effect 1
+ignor by networker 1
+ignor com 1
+ignor control 1
+ignor control dep 1
+ignor coplanar 1
+ignor coplanar intersect 1
+ignor dan 1
+ignor dan quel 1
+ignor e dan 1
+ignor e le 1
+ignor e ou 1
+ignor es 1
+ignor extr 1
+ignor extr whit 1
+ignor inser 1
+ignor interior 1
+ignor interior edg 1
+ignor kind 1
+ignor la 1
+ignor la pr 1
+ignor neg 1
+ignor neg liter 1
+ignor or appropr 1
+ignor or consider 1
+ignor output 1
+ignor th init 1
+ignor th inst 1
+ignor th interact 1
+ignor th partit 1
+ignor th quant 1
+ignor th serv 1
+ignor th third 1
+ignor th writ 1
+ignor whit 1
+ignor whit spac 1
+ignorad 1
+ignorad pel 1
+ignorad pel particip 1
+ignorer 1
+ignorer le 1
+ignorer le lang 1
+ignorer le point 1
+ignorer le probl 1
+ignoreron 1
+ignoreron aus 1
+ignoreron aus le 1
+ignoreron la 1
+ignoreron la mi 1
+igor 1
+igor moz 1
+igpl 1
+iguez 2
+iguez artalej 1
+ih 2
+ih x0iy0i 1
+ii 63
+ii accord 1
+ii and iv 1
+ii ar renam 1
+ii ba 1
+ii ba vehicl 1
+ii d zi 1
+ii degr 1
+ii demonstr 1
+ii examin 1
+ii gener 1
+ii gener architectur 1
+ii in ps 1
+ii incorpor 1
+ii incorpor context 1
+ii iproc 1
+ii mal 1
+ii mi 1
+ii pr 1
+ii requir 1
+ii rr 1
+ii run 1
+ii run sicstus 1
+ii st 1
+ii th pyramid 1
+ii to support 1
+ii tr 1
+ii tr structur 1
+ii un 1
+ii un etud 1
+ii we describ 1
+ii wil help 1
+ii.1 2
+ii.1 ba 1
+ii.1 ba principl 1
+ii.1 soft 1
+ii.1 soft loc 1
+ii.2 2
+ii.2 dec 1
+ii.2 dec propag 1
+ii.2 el 1
+ii.2 el block 1
+ii.3 2
+ii.3 incorpor 1
+ii.3 incorpor model 1
+ii.3 log 1
+ii.3 log exampl 1
+ii.4 1
+ii.4 dynam 1
+ii.4 dynam reconfigur 1
+ii.5 1
+ii.5 from cac 1
+ii.5 overview 1
+ii.c 1
+ii.c and ii.d 1
+ii.d 1
+ii16 1
+ii2 1
+ii32 1
+ii32b3 1
+ii32c3 1
+ii32d3 1
+ii32d3 and par32 1
+ii32d3 ii32e3 1
+ii32e3 1
+ii8 1
+iid 1
+iin 1
+iin term 1
+ij 8
+ij c mod 1
+ij cij 1
+ij don 1
+ij don es 1
+ij ek 1
+ij en 1
+ij en part 1
+ij en util 1
+ij ff 1
+ij gi 1
+ij gi xj 1
+ij ju 1
+ij ju uc 1
+ij k 1jykj 1
+ij lcj 1
+ij lm 1
+ij lt 1
+ij or njk 1
+ij qu 1
+ij qu lon 1
+ij self 1
+ij self del 1
+ij t 1ikj 1
+ij u cj 1
+ij uj 1
+ij.si 1
+ijc 5
+ijcn 1
+ijcv 1
+ijj 1
+ijj lt 1
+ijj sont 1
+ijj sont dan 1
+ijjt 1
+ijr 1
+ik 5
+ik a donc 1
+ik c mod 1
+ik dan 1
+ik dan lexpr 1
+ik de 1
+ik de ce 1
+ik de fonct 1
+ik de la 1
+ik de lexpr 1
+ik de tout 1
+ik don 1
+ik don ee 1
+ik dun 1
+ik dun combinaison 1
+ik dun fonct 1
+ik est 1
+ik est le 1
+ik et au 1
+ik interv 1
+ik interv au 1
+ik lck 1
+ik lk 1
+ik lt 1
+ik modl 1
+ik modl tous 1
+ik not 1
+ik not le 1
+ik pour 1
+ik pour lesquel 1
+ik quand 1
+ik quand est 1
+ik sous 1
+ik sous un 1
+ik u ck 1
+ik uk 2
+ik0 1
+ik1 1
+ik92 1
+ik97 1
+ikik 1
+ikj 1
+ikn 1
+ikn tel 1
+ikn tel qu 1
+ikn v erif 1
+il 19
+il a aus 1
+il a besoin 2
+il a exp 1
+il a lav 1
+il a ten 1
+il a tout 1
+il ahn 1
+il and ir 1
+il and shad 1
+il appar 1
+il appart 1
+il appart donc 1
+il avait 1
+il avait eventuel 1
+il avou 1
+il avou qu 1
+il con 1
+il condit 1
+il condit tous 1
+il consid 1
+il cont 1
+il cont au 1
+il conv 1
+il conv de 1
+il conv ic 1
+il correspon 1
+il correspon egal 1
+il d efin 1
+il d efinit 1
+il d ep 1
+il d epen 1
+il de 1
+il de autr 1
+il desc 1
+il desc en 1
+il dev 1
+il dev alor 1
+il disp 1
+il disp de 1
+il doit 1
+il doit etr 1
+il doiv 1
+il doiv etr 1
+il dun 1
+il dun nouvel 1
+il dw 1
+il ec 4
+il ec aujourdhu 1
+il ec aus 1
+il ec certain 1
+il ec dautr 1
+il ec de 1
+il ec deux 1
+il ec donc 1
+il ec plusieur 1
+il ec un 1
+il effectu 1
+il en 4
+il en don 1
+il en ec 1
+il en est 1
+il en ser 2
+il en va 1
+il encor 1
+il encor util 1
+il engendr 1
+il engendr en 1
+il engendr le 1
+il envisag 1
+il est 6
+il est absol 1
+il est ain 1
+il est alor 2
+il est atteint 1
+il est aus 1
+il est beaucoup 1
+il est bon 1
+il est cep 2
+il est clair 1
+il est comp 1
+il est conseil 1
+il est dan 1
+il est difficil 1
+il est dintersect 1
+il est donc 2
+il est egal 1
+il est en 1
+il est encor 1
+il est facil 2
+il est fondam 1
+il est instructif 1
+il est int 1
+il est inutil 1
+il est lattribut 1
+il est licit 1
+il est montr 1
+il est naturel 1
+il est nl 1
+il est organ 1
+il est parf 1
+il est pr 1
+il est profon 1
+il est propr 1
+il est quasim 1
+il est raison 1
+il est relatif 1
+il est relativ 1
+il est rep 1
+il est si 1
+il est souhait 2
+il est souv 1
+il est syst 1
+il est toujour 1
+il est tout 1
+il est toutef 1
+il est tr 1
+il est trop 1
+il etait 1
+il etait absent 1
+il evit 1
+il evit ain 1
+il exister 1
+il exister un 1
+il exp 1
+il exp un 1
+il faudr 2
+il faudr effectuer 1
+il faudr veiller 1
+il faut 4
+il faut alor 1
+il faut avouer 1
+il faut cep 1
+il faut choisir 1
+il faut commencer 1
+il faut donc 1
+il faut maint 1
+il faut modif 1
+il faut noter 1
+il faut pour 1
+il faut pr 1
+il faut veiller 1
+il fournit 1
+il imp 1
+il imp pour 1
+il import 1
+il import alor 1
+il import de 1
+il in med 1
+il le 1
+il le ser 1
+il lu 1
+il lu est 1
+il ma 1
+il ma conduit 1
+il ne 4
+il ne fait 1
+il ne fournit 1
+il ne nous 3
+il ne peut 1
+il ne pouvait 1
+il ne rest 1
+il ne sagit 1
+il ne sattach 1
+il ne ser 1
+il ne sont 2
+il nec 2
+il nec aucun 1
+il nec pa 1
+il nen 1
+il nen est 1
+il nest 3
+il nest alor 1
+il nest en 1
+il nest pa 3
+il nest toutef 1
+il nous 3
+il nous est 1
+il nous faut 1
+il nous rest 1
+il nous sembl 2
+il ny 3
+il ny aur 1
+il ont 2
+il ont besoin 1
+il ont cherch 1
+il ont egal 1
+il ont lieu 1
+il ont pour 1
+il ont sug 1
+il perm 1
+il perm egal 1
+il perm la 1
+il peut 3
+il peut arriver 1
+il peut aus 1
+il peut etr 2
+il peut exister 1
+il peut sautoriser 1
+il peut sav 1
+il peut sel 1
+il pourrait 1
+il pourrait etr 1
+il pr 2
+il pr eserv 1
+il pr eten 1
+il produit 1
+il produit din 1
+il prop 1
+il prop donc 1
+il prop en 1
+il provoqu 1
+il provoqu alor 1
+il raccourcit 1
+il raccourcit aus 1
+il raccourcit le 1
+il ren 1
+il ressort 1
+il ressort clair 1
+il rest 3
+il rest alor 1
+il rest encor 1
+il rest loc 1
+il rest pr 1
+il rest quand 1
+il rest un 1
+il sagirait 1
+il sagirait donc 1
+il sagit 5
+il sagit alor 1
+il sagit dan 1
+il sagit de 3
+il sagit donc 2
+il sagit dun 3
+il sagit en 1
+il sagit maint 1
+il sagit simpl 1
+il sagit soit 1
+il sav 1
+il se 2
+il se comport 1
+il se simpl 1
+il sembl 2
+il sembl donc 1
+il sembl qu 1
+il sembl raison 1
+il sembl valoir 1
+il ser 1
+il ser donc 1
+il ser le 1
+il serait 3
+il serait fat 1
+il serait gal 1
+il serait int 1
+il serait probabl 1
+il serait sauvegard 1
+il sest 1
+il sest princip 1
+il sint 1
+il sint er 1
+il sont 1
+il sont distribu 1
+il sont donc 1
+il sont prem 1
+il suffit 3
+il suffit de 3
+il suffit deffectuer 1
+il suffit dimposer 1
+il suffit donc 2
+il suffit dutiliser 1
+il suffit en 1
+il suffit pour 1
+il sug 1
+il surv 1
+il termin 1
+il termin nest 1
+il th abil 1
+il th ar 1
+il un point 1
+il util 1
+il util de 1
+il util lalgorithm 1
+il util le 1
+il util par 1
+il va 1
+il va donc 1
+il vaut 1
+il vaut en 1
+il vaut mieux 1
+il viendr 1
+il viendr lir 1
+il xx 1
+il y aur 1
+il y avait 1
+il y deux 1
+il y en 1
+il87 1
+il91 1
+ileid 1
+illeg 3
+illeg and zon 1
+illeg construc 1
+illicit 1
+illicit dec 1
+illicit vi lintroduc 1
+illin 8
+illin at urban 4
+illin at urbanachampaign 1
+illin champaign 1
+illin hardwar 1
+illin hardwar inv 1
+illin inv 1
+illin inv ba 1
+illtyp 1
+illtyp answer 1
+illtyp construc 1
+illumin 1
+illus 4
+illus of fr 1
+illus than peopl 1
+illustr 76
+illustr a ca 1
+illustr a phy 1
+illustr a proc 1
+illustr a schem 1
+illustr a se 1
+illustr a span 1
+illustr an exampl 2
+illustr appl 1
+illustr ba 1
+illustr ba aspect 1
+illustr ba principl 1
+illustr by exampl 1
+illustr by figur 1
+illustr by mean 1
+illustr ce 1
+illustr configur 1
+illustr dat 1
+illustr dat rectangl 1
+illustr e figur 1
+illustr ee 2
+illustr ee au 1
+illustr ee par 2
+illustr ee sur 1
+illustr egal 1
+illustr emph 1
+illustr exact 1
+illustr exampl 2
+illustr experim 1
+illustr few exampl 1
+illustr how initialschedl 1
+illustr how learn 1
+illustr how selecttest 1
+illustr in fig 4
+illustr in figur 16
+illustr interprocedur 1
+illustr interprocedur test 1
+illustr la 1
+illustr lagenc 1
+illustr lagenc dun 1
+illustr lappl 1
+illustr lappl de 1
+illustr le 2
+illustr le ca 1
+illustr le comport 1
+illustr le fait 2
+illustr le perform 1
+illustr le var 1
+illustr le vit 1
+illustr limport 1
+illustr lobt 1
+illustr lobt de 1
+illustr man tim 1
+illustr nest 1
+illustr nest transact 1
+illustr of graph 1
+illustr of handler 1
+illustr of problem 1
+illustr our belief 1
+illustr our ch 1
+illustr our framework 1
+illustr our gener 1
+illustr our hybrid 1
+illustr our proof 1
+illustr our schem 1
+illustr pict 1
+illustr po configur 1
+illustr program 1
+illustr program execut 1
+illustr simil 1
+illustr simil effect 1
+illustr som exampl 1
+illustr som interfac 1
+illustr th abil 1
+illustr th accur 1
+illustr th algorithm 1
+illustr th appear 1
+illustr th appl 1
+illustr th ba 2
+illustr th bound 1
+illustr th calculus 1
+illustr th coar 1
+illustr th concept 1
+illustr th cql 1
+illustr th de 1
+illustr th desir 1
+illustr th distribut 1
+illustr th dynam 1
+illustr th eff 1
+illustr th effect 1
+illustr th es 1
+illustr th evolut 1
+illustr th exampl 2
+illustr th flec 1
+illustr th gener 1
+illustr th id 3
+illustr th import 1
+illustr th influ 1
+illustr th init 1
+illustr th langu 1
+illustr th lingu 1
+illustr th main 1
+illustr th merg 1
+illustr th methodolog 1
+illustr th over 1
+illustr th perform 1
+illustr th po 1
+illustr th point 1
+illustr th pot 3
+illustr th prev 1
+illustr th prim 1
+illustr th problem 1
+illustr th proper 1
+illustr th refin 1
+illustr th relationship 1
+illustr th remain 1
+illustr th repr 1
+illustr th result 1
+illustr th rol 1
+illustr th se 1
+illustr th singl 1
+illustr th situ 1
+illustr th solut 1
+illustr th specl 1
+illustr th step 1
+illustr th structur 1
+illustr th support 1
+illustr th system 1
+illustr th techniqu 1
+illustr th textur 1
+illustr th typ 1
+illustr th us 5
+illustr th util 1
+illustr th var 1
+illustr th work 3
+illustr that subst 1
+illustr un tel 1
+illustr using 2
+illustr why 1
+illustr with respect 1
+illustrer 2
+illustrer ce 1
+illustrer ce sp 1
+illustrer la 1
+illustrer sur 1
+illustreron 1
+illustreron ce 1
+illustron 4
+illustron a la 1
+illustron avec 1
+illustron avec un 1
+illustron ce 1
+illustron ce op 1
+illustron le 1
+illustron le princip 1
+illustron sel 1
+illustron sel lappl 1
+ilog 2
+ilog inc 1
+ilog s.a 1
+ilog.com 1
+ilp93 1
+ilp93 workshop 1
+ilp94 1
+ilp94 post 1
+im 28
+im addr 1
+im as follow 1
+im consequ 3
+im consequ oper 1
+im corol 1
+im curv 1
+im curv approach 1
+im ed 3
+im ed de 2
+im ediat 3
+im ediat clair 1
+im ediat elimin 1
+im ediat en 1
+im ediat jump 1
+im ediat suiv 1
+im ediat util 1
+im effect 1
+im exper 1
+im exper distingu 1
+im from lem 2
+im from theorem 1
+im hemingw 1
+im hemingw competit 1
+im hemingw contest 1
+im im 1
+im im exper 1
+im junior 1
+im junior rol 1
+im junior se 1
+im neighbor 1
+im neighbour 1
+im payoff 1
+im prompt 1
+im senior 1
+im subserv 1
+im subserv rol 1
+im succ 1
+im superior 1
+im superior se 1
+im t spanner 1
+im th me 1
+im to check 1
+im to se 1
+im vs 1
+im vs fast 1
+im workshop 1
+im workshop vol 1
+im. 1
+im91 1
+imac 3
+imac an 1
+imac world 1
+imac world congr 1
+imag 32
+imag acc 1
+imag acc system 1
+imag acquir 1
+imag after imag 1
+imag allow 1
+imag an 1
+imag and consider 1
+imag and creat 1
+imag and graph 1
+imag and look 1
+imag and molecl 1
+imag and replac 1
+imag and show 1
+imag and sign 1
+imag and speckl 1
+imag and text 1
+imag and vi 2
+imag and vid 1
+imag and wavel 1
+imag ar calcl 1
+imag ar captur 1
+imag ar correl 1
+imag ar describ 1
+imag ar repr 1
+imag ar requir 1
+imag ar retrief 1
+imag ar signif 1
+imag ar treat 1
+imag archiv 1
+imag at interact 1
+imag at low 1
+imag at posit 1
+imag ba 2
+imag be recomput 1
+imag block 2
+imag block point 1
+imag block siz 1
+imag block using 1
+imag block wh 1
+imag bound 1
+imag bp 1
+imag bp psnr 1
+imag by cont 1
+imag can correspon 1
+imag captur 1
+imag cl 3
+imag cod 4
+imag cod effort 1
+imag cod schem 1
+imag cod standard 1
+imag cod using 2
+imag coder 1
+imag coder text 1
+imag color 1
+imag color featur 1
+imag column 1
+imag com 1
+imag compon 1
+imag compr 2
+imag compr techniqu 1
+imag comput 1
+imag cont 2
+imag cont extract 1
+imag cont ind 1
+imag contain 2
+imag contain reg 1
+imag contain spot 1
+imag coord 1
+imag coord measur 1
+imag cover 1
+imag cut 1
+imag dat 3
+imag dat compr 1
+imag datab 1
+imag datab appl 1
+imag datab ind 1
+imag datab prov 1
+imag datab simp 1
+imag datab support 1
+imag de 2
+imag de certain 1
+imag de domain 1
+imag de treil 1
+imag de vecteur 1
+imag decomposit 1
+imag dep 1
+imag dep pattern 1
+imag dep quant 1
+imag docum 1
+imag docum cvgip 1
+imag doiv 1
+imag doiv aus 1
+imag du 2
+imag du champ 1
+imag du domain 1
+imag enhanc 1
+imag enhanc problem.1 1
+imag et vi 2
+imag featur 1
+imag featur extract 1
+imag found 1
+imag fram 1
+imag from ct 1
+imag from figur 1
+imag fus 1
+imag gener 3
+imag gener method 1
+imag graph 1
+imag half 1
+imag half ton 1
+imag hardwar 1
+imag ie 1
+imag ie tran 1
+imag ind 1
+imag ind techniqu 1
+imag indep 1
+imag indep no 1
+imag inst 1
+imag int top 1
+imag is an 1
+imag is approxim 1
+imag is clip 1
+imag is consider 1
+imag is dither 1
+imag is gener 1
+imag is no 1
+imag is requir 1
+imag is support 1
+imag is threshold 1
+imag lab 1
+imag log 1
+imag log perm 1
+imag m dic 1
+imag major 1
+imag major vot 1
+imag manipl 1
+imag match 1
+imag method 1
+imag non 1
+imag non convec 1
+imag object 1
+imag oeld 1
+imag of compl 1
+imag of e0 1
+imag of figur 1
+imag of siz 1
+imag of techn 1
+imag off board 1
+imag or bin 1
+imag or chain 1
+imag or graph 1
+imag par 1
+imag par rapport 1
+imag part 1
+imag plan 1
+imag plan angl 1
+imag plan imag 1
+imag prior 1
+imag proc 11
+imag proc algorithm 1
+imag proc dep 1
+imag proc rout 1
+imag proc softwar 1
+imag proc task 1
+imag proc techniqu 1
+imag proc technolog 1
+imag proc tool 1
+imag proc typ 1
+imag qu 1
+imag qu system 1
+imag quer 1
+imag recov 1
+imag reg 2
+imag reg object 1
+imag reg respect 1
+imag register 2
+imag register techniqu 1
+imag resolut 1
+imag result 1
+imag s02 1
+imag s02 s12 1
+imag sampl 2
+imag sampl techniqu 1
+imag sect 1
+imag segm 1
+imag sequ 1
+imag ser 1
+imag ser tak 1
+imag sign 1
+imag siz 1
+imag sont 1
+imag sont convec 1
+imag soul 1
+imag soul ve 1
+imag spac 1
+imag spot 1
+imag sub 1
+imag sub block 1
+imag subband 1
+imag subband comput 1
+imag tak 1
+imag technolog 1
+imag text 1
+imag textur 1
+imag textur segm 1
+imag to attenu 1
+imag to av 1
+imag to eff 1
+imag to perform 1
+imag to produc 1
+imag to suppr 1
+imag understand 2
+imag understand system 1
+imag unit 1
+imag using 2
+imag using edg 1
+imag using method 1
+imag vid 1
+imag vid server 1
+imag view 1
+imag view point 1
+imag visu 1
+imag visu qu 1
+imag wa gather 1
+imag wa tak 1
+imag wer captur 1
+imag wer gather 1
+imag wer gener 1
+imag wh 2
+imag within text 1
+imag without clear 1
+imag.segm 1
+imag.segm ionospher 1
+imag.segm ionospher ir 1
+imager 1
+imager m dic 1
+imagin 5
+imagin exposit 1
+imagin lin 1
+imagin lin perpendicl 1
+imagin part 1
+imagin plac 1
+imaginer 2
+imaginer ensuit 1
+imaginer et tester 1
+imb 8
+imb between part 1
+imb du 1
+imb incr 1
+imb lim 1
+imbriqu 2
+imbriqu e acc 1
+imbriqu ee 2
+imbriqu ee est 1
+imbriqu es 1
+imbu 1
+imbu level 1
+imielinsk 1
+imin 1
+immater 1
+immd 1
+immd vi 1
+immd7 1
+immerman 1
+immun 1
+immun and thus 1
+immun is inclus 1
+immut 1
+immut bind 1
+immut bound 1
+immut status 1
+immut top 1
+immut top lec 1
+imp 71
+imp a constraint 1
+imp a fat 1
+imp a lim 1
+imp a natur 2
+imp a siz 1
+imp a strict 1
+imp an order 1
+imp any addr 1
+imp any order 1
+imp approxim 1
+imp autom 1
+imp autom redistribut 1
+imp by control 1
+imp by rx 1
+imp by triangl 1
+imp certain constraint 1
+imp certain restrict 1
+imp church 1
+imp church rosser 1
+imp conflict 1
+imp constraint 5
+imp control 1
+imp control dep 1
+imp de 1
+imp de garder 1
+imp donc 1
+imp donc qu 1
+imp e entr 1
+imp ee 3
+imp ee aux 1
+imp ee par 1
+imp ee pour 1
+imp en 1
+imp en outr 1
+imp entr 1
+imp entr son 1
+imp erieus 1
+imp erieus de 1
+imp execut 1
+imp execut speed 1
+imp h2n 1
+imp it neg 1
+imp la 1
+imp la sauvegard 1
+imp layout 1
+imp layout specif 1
+imp le 1
+imp le retard 1
+imp lec 1
+imp lec ecut 1
+imp new problem 1
+imp no asymptot 1
+imp nonblock 1
+imp object 1
+imp object del 1
+imp on 1
+imp on mart 1
+imp on system 2
+imp or impract 1
+imp order 1
+imp output 1
+imp output vect 1
+imp overhead 1
+imp par 1
+imp par la 1
+imp phy 2
+imp phy cluster 2
+imp pour 1
+imp pour cel 1
+imp proof 1
+imp puisquil 1
+imp puisquil requ 1
+imp qu 2
+imp qu jc2j 1
+imp quun 1
+imp quun grand 1
+imp restrict 6
+imp shar 1
+imp shar dat 1
+imp string 1
+imp string perform 1
+imp strong 1
+imp strong con 1
+imp structur 1
+imp th addit 1
+imp th inequ 1
+imp th inst 1
+imp th transfer 1
+imp that problem 1
+imp to achief 1
+imp to compl 2
+imp to def 1
+imp to interpr 1
+imp to notif 1
+imp to overlap 1
+imp to plac 1
+imp to predict 1
+imp to recogn 1
+imp to reconstruc 1
+imp to recover 1
+imp to resolut 1
+imp to tak 1
+imp tw chang 1
+imp un 1
+imp un effort 1
+imp un ordr 1
+impact 30
+impact fondam 1
+impact fondam sur 1
+impact identif 1
+impact of abstract 1
+impact of ad 1
+impact of adv 1
+impact of affin 1
+impact of channel 2
+impact of constraint 1
+impact of enhanc 1
+impact of fac 1
+impact of human 1
+impact of incr 1
+impact of input 1
+impact of maxim 1
+impact of me 2
+impact of multicast 1
+impact of synchron 1
+impact of system 1
+impact of technolog 1
+impact of using 1
+impact of var 2
+impact of wir 3
+impact on channel 1
+impact on comput 1
+impact on design 1
+impact on ibm 1
+impact on learn 1
+impact on nw 1
+impact on parallel 1
+impact on perform 1
+impact on program 1
+impact on tot 1
+impact on understand 1
+impact r eduit 1
+impact significatif 1
+impact sur 1
+impact sur la 1
+impact sur le 1
+impact th field 1
+impact th pot 1
+impact th softwar 1
+impair 1
+impart 1
+impart se 1
+impedim 1
+imper 11
+imper and funct 1
+imper cod 1
+imper colleg 2
+imper colleg techn 1
+imper langu 4
+imper langu program 1
+imper program 6
+imper program stem 1
+imper system 1
+imper to determin 1
+impercept 1
+impercept chang 1
+imperfect 3
+imperfect and unrel 1
+imperfect s erieus 1
+imperfect st 1
+imperson 2
+imperson and multicast 1
+imperson th ip 1
+impl 83
+impl 8d0 1
+impl 9c 1
+impl 9c l1 1
+impl a custom 1
+impl a dat 1
+impl a del 1
+impl a distribut 1
+impl a fault 1
+impl a form 1
+impl a funct 1
+impl a greater 2
+impl a kind 1
+impl a level 1
+impl a link 1
+impl a list 1
+impl a log 1
+impl a number 1
+impl a pack 1
+impl a particl 1
+impl a phenomenon 1
+impl a recov 1
+impl a rel 1
+impl a shar 1
+impl a singl 2
+impl a sort 1
+impl a specif 1
+impl a stat 2
+impl a super 1
+impl a switch 1
+impl a system 1
+impl a task 1
+impl a tim 1
+impl a var 2
+impl altern 1
+impl altern dispatch 1
+impl an abstract 1
+impl an introspect 1
+impl and caus 1
+impl ar defin 1
+impl ar unclear 1
+impl ar uncomplem 1
+impl aspect 1
+impl backtrack 1
+impl backtrack asser 1
+impl broadcast 1
+impl bsen 1
+impl built 1
+impl c li 1
+impl c2 1
+impl can determin 1
+impl cannot achief 1
+impl combin 1
+impl context 1
+impl context parallel 1
+impl contextu 1
+impl contextu ext 1
+impl correct 1
+impl de 2
+impl de ce 1
+impl de don 1
+impl de la 1
+impl deadlock 1
+impl deadlock fr 1
+impl dep 1
+impl deriv 1
+impl desir 1
+impl differ method 1
+impl e au 1
+impl e en 1
+impl e sur 1
+impl ee 1
+impl ee dan 1
+impl eff 1
+impl em 2
+impl em adapt 1
+impl em classiqu 1
+impl em de 1
+impl em devrait 1
+impl em direct 1
+impl em dun 1
+impl em efficac 1
+impl em na 1
+impl em optim 1
+impl em par 1
+impl em simpl 1
+impl em sont 1
+impl em sur 1
+impl em util 1
+impl ement 1
+impl ement de 1
+impl ement ee 1
+impl ement le 1
+impl ement lext 1
+impl ement un 1
+impl ementer 1
+impl ementer disjonct 1
+impl ementer efficac 1
+impl ementer geler 1
+impl ementer le 1
+impl ementer un 1
+impl en 1
+impl equ 1
+impl es 1
+impl es au 1
+impl f2 1
+impl fd 1
+impl fd gd 1
+impl for futur 1
+impl for refin 1
+impl for rol 1
+impl for theor 1
+impl graph 1
+impl h1 1
+impl hardwar 1
+impl hardwar primitiv 1
+impl hi oper 1
+impl hn 1
+impl implicit 1
+impl implicit invoc 1
+impl in vl 1
+impl incr 1
+impl incr lat 1
+impl informatiqu 1
+impl integr 1
+impl is obv 1
+impl it eff 1
+impl it using 1
+impl keep 1
+impl larg failur 1
+impl log 1
+impl log sem 1
+impl m xj1xj2 1
+impl man bit 1
+impl merg 1
+impl mi 1
+impl model 1
+impl mor rel 1
+impl mov 1
+impl multicast 1
+impl multidest 1
+impl multidest worm 1
+impl must bal 1
+impl new alloc 1
+impl oe 1
+impl of cach 1
+impl of fd 1
+impl of finit 1
+impl of giv 1
+impl of inst 1
+impl of mult 1
+impl of privileg 1
+impl of proc 1
+impl of split 1
+impl of structur 1
+impl on architectur 1
+impl on rol 1
+impl other gener 1
+impl other langu 1
+impl other relationship 1
+impl our system 1
+impl our tool 1
+impl p roct 1
+impl parallel 1
+impl parallel oper 1
+impl particl 1
+impl particl camelot 1
+impl perm 1
+impl platform 1
+impl prolog 1
+impl rc 1
+impl recur 1
+impl recur quadrisect 1
+impl rel 1
+impl rewrit 1
+impl rewrit log 1
+impl ri 1
+impl ri rj 1
+impl rpc 1
+impl rpc styl 1
+impl sam sort 1
+impl serv 1
+impl serv out 1
+impl shar 1
+impl shar funct 1
+impl sid 1
+impl sid effect 1
+impl smaller 1
+impl smaller bi 1
+impl som chang 1
+impl sont 1
+impl sont ensuit 1
+impl techniqu 1
+impl th abstract 1
+impl th algorithm 2
+impl th ba 1
+impl th behavior 1
+impl th bi 1
+impl th built 1
+impl th calcl 1
+impl th coh 1
+impl th deon 1
+impl th distribut 1
+impl th dsj 1
+impl th en 1
+impl th featur 1
+impl th forml 1
+impl th funct 1
+impl th glob 1
+impl th int 1
+impl th med 1
+impl th method 2
+impl th mn 1
+impl th model 1
+impl th monit 1
+impl th mov 1
+impl th oper 2
+impl th over 1
+impl th propag 1
+impl th relationship 1
+impl th serv 1
+impl th standard 2
+impl th strateg 1
+impl th system 2
+impl th theor 1
+impl th trac 1
+impl th vhdl 1
+impl th vi 1
+impl th vm 1
+impl that ba 2
+impl that ln 1
+impl that n3 1
+impl that nq 1
+impl that pack 1
+impl that realm 1
+impl that softwar 1
+impl that u1i 1
+impl that valu 2
+impl tn 1
+impl tn n2 1
+impl to achief 1
+impl tw kind 1
+impl typ 2
+impl typ hierarch 1
+impl using 1
+impl var 1
+impl var algorithm 1
+impl virtu 1
+impl virtu cach 1
+impl we ch 2
+impl without float 1
+impl. 3
+implantabl 1
+implanter 1
+implanter dan 1
+implanter dan le 1
+implanter un 1
+implanter un ver 1
+implem 100
+implem a bof 1
+implem a clp 1
+implem a compon 1
+implem a distribut 1
+implem a domain 1
+implem a fast 1
+implem a fl 1
+implem a fr 1
+implem a memor 1
+implem a pack 1
+implem a pipelin 1
+implem a prototyp 1
+implem a siml 1
+implem a singl 1
+implem a stop 1
+implem a var 1
+implem ad 1
+implem affect 1
+implem affect background 1
+implem al tr 1
+implem algorithm 1
+implem allow 1
+implem alread defin 1
+implem an ip 1
+implem an nt 1
+implem and algorithm 1
+implem and del 1
+implem and evalu 1
+implem and illustr 1
+implem and log 3
+implem and modif 1
+implem and parallel 1
+implem and perform 4
+implem and program 1
+implem and run 1
+implem and thus 1
+implem another ver 1
+implem appropr 1
+implem ar ba 1
+implem ar describ 1
+implem ar evalu 1
+implem ar indep 1
+implem ar model 1
+implem arbitr 1
+implem arbitr learn 1
+implem as follow 1
+implem as preproc 1
+implem aspect 1
+implem assum 1
+implem ba 3
+implem bar 1
+implem bar synchron 1
+implem both heur 1
+implem built 1
+implem by an 1
+implem by me 1
+implem by replac 1
+implem by requir 1
+implem by stipl 1
+implem by tag 1
+implem by using 2
+implem cal asvm 1
+implem can perform 1
+implem cannot exploit 1
+implem cannot handl 1
+implem ch 1
+implem challeng 1
+implem chang 1
+implem chang default 1
+implem complec 2
+implem computer 1
+implem computer program 1
+implem con 2
+implem consider 1
+implem contain 1
+implem cost 2
+implem cost effect 1
+implem dat 1
+implem dat structur 1
+implem dec 1
+implem defin 2
+implem defin const 1
+implem defin dat 1
+implem defin keyword 1
+implem defin step 1
+implem dep 1
+implem dep com 1
+implem dep observ 1
+implem describ 3
+implem detail 6
+implem differ 1
+implem differ prim 1
+implem distribut 2
+implem distribut feedfor 1
+implem distribut search 1
+implem du 1
+implem dynam 1
+implem dynam typ 1
+implem each op 1
+implem each sr 1
+implem ef 1
+implem ef ci 1
+implem eff 4
+implem eff simpl 1
+implem effort 1
+implem environm 1
+implem exampl 1
+implem expect 1
+implem expect tak 1
+implem ext 1
+implem fault 1
+implem fault toler 1
+implem filter 1
+implem for atm 1
+implem for common 1
+implem for crit 1
+implem for gener 1
+implem for level 1
+implem for maud 1
+implem for phy 1
+implem for singl 1
+implem for snoop 1
+implem for system 1
+implem for workst 1
+implem from detail 1
+implem ha signif 1
+implem hierarch 1
+implem high 1
+implem high order 1
+implem high perform 1
+implem in ad 1
+implem in andor 1
+implem in assemb 1
+implem in centr 1
+implem in datab 1
+implem in dynam 1
+implem in eclip8 1
+implem in ext 1
+implem in hal 1
+implem in hardwar 1
+implem in identif 1
+implem in logspac 1
+implem in mar 1
+implem in multipl 1
+implem in occam2 1
+implem in pack 1
+implem in parallel 2
+implem in perl 1
+implem in prolog 2
+implem in softwar 2
+implem in split 1
+implem in term 1
+implem in tim 1
+implem incur 2
+implem incur exact 1
+implem incur run 1
+implem involut 2
+implem is ba 2
+implem is car 1
+implem is decentr 1
+implem is describ 1
+implem is empl 1
+implem is head 1
+implem is hid 1
+implem is indistingu 1
+implem is parameter 1
+implem is plan 1
+implem is prim 1
+implem is problem 1
+implem is scal 1
+implem is somewhat 1
+implem is ti 1
+implem issu 5
+implem issu involut 1
+implem issu rel 1
+implem langu 4
+implem langu equiv 1
+implem langu result 1
+implem level 2
+implem loc 1
+implem loc neur 1
+implem lock 1
+implem log 2
+implem log custom 1
+implem log program 1
+implem mak 1
+implem mak us 1
+implem me 1
+implem me object 1
+implem mechan 1
+implem mehrotr 1
+implem mehrotr predict 1
+implem method 4
+implem methodolog 1
+implem ml 1
+implem mod 1
+implem mod log 1
+implem model 1
+implem mor eff 1
+implem mov 1
+implem mult 1
+implem mult mod 1
+implem multicast 1
+implem multidest 1
+implem multidest worm 1
+implem multipl 1
+implem multipl hid 1
+implem network 1
+implem network protocol 1
+implem object 1
+implem object behavior 1
+implem of asynchron 1
+implem of ca 1
+implem of chronolog 1
+implem of clp 1
+implem of collect 1
+implem of con 1
+implem of conjunct 1
+implem of constraint 1
+implem of coroutin 1
+implem of del 1
+implem of dispatch 1
+implem of distribut 1
+implem of dpl 1
+implem of dynam 1
+implem of ec 1
+implem of equiv 1
+implem of eulisp 1
+implem of ext 1
+implem of fl 1
+implem of for 1
+implem of fram 1
+implem of funct 1
+implem of genet 1
+implem of gp 1
+implem of hierarch 1
+implem of hilog 1
+implem of hugin 1
+implem of hybrid 1
+implem of inherit 1
+implem of int 1
+implem of level 1
+implem of lock 1
+implem of log 3
+implem of lrc 1
+implem of mar 1
+implem of ment 1
+implem of mercur 1
+implem of metalevel 1
+implem of mlp 1
+implem of mn 1
+implem of mov 1
+implem of mp 1
+implem of mult 1
+implem of multidest 1
+implem of neur 1
+implem of parallel 2
+implem of polymorph 1
+implem of pram 1
+implem of prolog 1
+implem of recur 1
+implem of rel 1
+implem of replac 2
+implem of rpc 1
+implem of sa 1
+implem of sc 1
+implem of schem 1
+implem of selectintertest 1
+implem of selecttest 1
+implem of self 1
+implem of siml 1
+implem of simpl 1
+implem of spar 1
+implem of spectr 1
+implem of spin 1
+implem of st 1
+implem of suit 1
+implem of surfac 1
+implem of tdbm 1
+implem of tempor 2
+implem of tr 1
+implem of tupl 1
+implem of upd 1
+implem of us 1
+implem on cam 1
+implem on describ 1
+implem on distribut 1
+implem on fortran 1
+implem on intel 1
+implem on mach 1
+implem on mult 1
+implem on parallel 1
+implem on top 1
+implem op 1
+implem or parallel 1
+implem other graph 1
+implem our algorithm 2
+implem our compiler 1
+implem our compon 1
+implem our method 1
+implem our tool 1
+implem over boolean 1
+implem parallel 1
+implem parallel langu 1
+implem perform 1
+implem perform inser 1
+implem pipel 1
+implem point 1
+implem pr 1
+implem prolog 1
+implem prolog compil 1
+implem proper 2
+implem prototyp 1
+implem prov 2
+implem recover 2
+implem recover request 2
+implem reduc 1
+implem refer 1
+implem rel 4
+implem rel aspect 1
+implem rel datab 1
+implem rel group 1
+implem remov 1
+implem requir 4
+implem requir dlog2 1
+implem result 1
+implem reus 1
+implem reus softwar 1
+implem satisf 1
+implem select 1
+implem select test 1
+implem sem 1
+implem sever el 1
+implem shar 1
+implem shar virtu 1
+implem show 1
+implem sid 1
+implem simpl 1
+implem softwar 2
+implem softwar multicast 1
+implem softwar visu 1
+implem solut 1
+implem solver 1
+implem som minor 1
+implem specif 2
+implem specif cl 1
+implem specif proper 1
+implem stat 1
+implem straight 1
+implem strateg 1
+implem strong 1
+implem succ 1
+implem such pipelin 1
+implem such synchron 1
+implem support 2
+implem system 3
+implem tak 1
+implem tak adv 1
+implem task 1
+implem task simpler 1
+implem techniqu 7
+implem techniqu requir 1
+implem technolog 4
+implem tempor 1
+implem tempor log 1
+implem th acor 1
+implem th algorithm 2
+implem th anchor 1
+implem th behavior 1
+implem th chr 1
+implem th client 1
+implem th earl 1
+implem th featur 1
+implem th hybrid 1
+implem th increm 1
+implem th langu 1
+implem th me 1
+implem th prop 1
+implem th selecttest 1
+implem th solut 1
+implem th synchron 1
+implem th transform 2
+implem th univer 1
+implem that allow 1
+implem that conform 1
+implem that export 1
+implem that us 1
+implem that work 1
+implem then ye 1
+implem thing 1
+implem to comp 1
+implem to re 1
+implem tr 1
+implem tr oper 1
+implem trad 1
+implem trad off 1
+implem trip 1
+implem tw approach 1
+implem tw layer 1
+implem tw memor 1
+implem typ 1
+implem typ inform 1
+implem univer 1
+implem univer person 1
+implem us 4
+implem us oper 1
+implem us ordin 1
+implem using 13
+implem using altern 1
+implem using mp 1
+implem using mult 1
+implem using pcct 1
+implem using split 1
+implem using standard 1
+implem using structur 1
+implem using tag 1
+implem var 2
+implem ver 1
+implem ver simp 1
+implem versus using 1
+implem we look 1
+implem wer found 1
+implem when dist 1
+implem which demonstr 1
+implem which keep 1
+implem which optim 1
+implem which perform 1
+implem with direct 2
+implem with featur 1
+implem with signif 1
+implem with singl 1
+implem without requir 1
+implem without sen 1
+implem would requir 1
+implem writ 1
+implementationdep 1
+implementer 2
+implementer an automot 1
+implementer compon 1
+implementer engineer 1
+implementer engineer dev 1
+implementer in ch 1
+implementer interact 1
+implementer or engineer 1
+implementer requir 1
+implementer view 1
+implementer viewpoint 1
+implementierung 1
+implementierung in prolog 1
+implicit 33
+implicit ad 1
+implicit ad extr 1
+implicit and explicit 2
+implicit assum 3
+implicit by le 1
+implicit car 1
+implicit car for 1
+implicit coerc 1
+implicit connect 1
+implicit consider 1
+implicit context 1
+implicit dan 1
+implicit dan la 1
+implicit de 1
+implicit de don 1
+implicit du 1
+implicit du fait 1
+implicit dus 1
+implicit et le 1
+implicit from research 1
+implicit giv 1
+implicit import 1
+implicit inclus 1
+implicit inform 2
+implicit inform assoc 1
+implicit invoc 1
+implicit invoc mechan 1
+implicit invok 1
+implicit invok byimplicit 1
+implicit le 1
+implicit lock 1
+implicit lor 1
+implicit lor dun 1
+implicit membership 1
+implicit membership test 1
+implicit optim 1
+implicit or explicit 2
+implicit par 1
+implicit par la 1
+implicit parallel 1
+implicit peut 1
+implicit peut se 1
+implicit rel 1
+implicit repr 1
+implicit run 1
+implicit run tim 1
+implicit s equ 1
+implicit satisf 1
+implicit specif 1
+implicit univer 1
+implicit univer quantif 1
+implicit universel 1
+implicit universel quantif 1
+implicit whenever individu 1
+impliqu 4
+impliqu de 1
+impliqu de interact 1
+impliqu e le 1
+impliqu ee 1
+impliqu ee dan 1
+impliqu es 2
+impliqu es dan 2
+impliqu la 1
+impliqu la possibilit 1
+impliqu le 1
+impliqu le syst 1
+impliqu lind 1
+impliqu lind epen 1
+impliqu lor 1
+impliqu lor de 1
+impliqu lun 1
+impliqu lun de 1
+impliqu naturel 1
+impliqu naturel un 1
+impliqu qu 2
+impliqu qu la 1
+impliqu qu le 1
+impliqu un 1
+impliqu un lim 1
+impliquer 1
+impliquer aus 1
+impliquer aus bien 1
+impliquer de 1
+impliquer de echec 1
+impor 2
+impor issu 1
+import 38
+import a number 1
+import allow 1
+import allow renam 1
+import alor 1
+import alor de 1
+import and conserv 1
+import and export 1
+import and inst 1
+import and link 1
+import and mad 1
+import and vi 1
+import another sl1 1
+import assoc 1
+import bind 1
+import bind bind 1
+import bring 1
+import by fam 1
+import capit 2
+import capit pour 1
+import circl 1
+import claus 1
+import dan 1
+import dan de 1
+import de 2
+import de cherch 1
+import de la 2
+import de pag 1
+import de pouvoir 1
+import de savoir 1
+import decl 1
+import dep 1
+import dep form 1
+import direct 1
+import direct specif 1
+import directiv 1
+import du 1
+import du ch 1
+import dun 1
+import dun syst 1
+import en 1
+import en statistiqu 1
+import ent 1
+import est 1
+import est qu 1
+import et dautr 1
+import fact 1
+import fact pot 1
+import for draw 1
+import id1 1
+import if uniform 1
+import in broad 1
+import in off 1
+import inform 1
+import int cylinder 1
+import interfac 1
+import is giv 1
+import it encl 1
+import it export 1
+import item 1
+import j syntac 1
+import mean 1
+import modl 2
+import modl inst 1
+import modl vi 1
+import nat 1
+import of abstract 1
+import of branch 1
+import of control 1
+import of deal 1
+import of design 1
+import of experim 1
+import of fal 1
+import of going 1
+import of greed 1
+import of group 1
+import of integr 1
+import of invar 1
+import of predict 1
+import of specif 1
+import other modl 1
+import peu 1
+import plac 1
+import plus capit 1
+import pour 1
+import pour assurer 1
+import pour la 1
+import puisquil 1
+import puisquil sagit 1
+import qu 1
+import qu en 1
+import quil 1
+import quil navait 1
+import rest 1
+import sampl 1
+import schem 1
+import sort 1
+import squar 1
+import stat 1
+import suiv 1
+import sur 1
+import sur la 1
+import symtab 1
+import symtabref 1
+import tant 1
+import tant du 1
+import th modl 1
+import th upd 1
+import that pack 1
+import theor 1
+import to diagn 1
+import to knowledg 1
+import weight 1
+import when computer 1
+import when try 1
+imposer 3
+imposer un 1
+imposer un contraint 1
+imposer un surc 1
+imposeront 1
+imposeront un ordr 1
+imposon 1
+imposon en 1
+imposon en outr 1
+impr 8
+impr ci 1
+impr ci au 1
+impr ec 1
+impr ev 1
+impr instruc 1
+impr instruc level 1
+impr level 1
+impr number 1
+impr parallel 1
+impr result 1
+impract 9
+impract criter 1
+impract for appl 1
+impract to solut 1
+imprec 3
+imprec is unav 1
+imprec test 1
+imprec test select 1
+imprint 1
+imprint a recogn 1
+improb 3
+improb to solut 1
+improv 79
+improv a giv 1
+improv a phonem 1
+improv achief 1
+improv al reduc 1
+improv algorithm 3
+improv algorithm using 1
+improv an 1
+improv and developm 1
+improv and simplif 1
+improv approxim 2
+improv approxim algorithm 2
+improv ar achief 1
+improv around tim 1
+improv attain 1
+improv began 1
+improv but adm 1
+improv by acc 1
+improv by ad 1
+improv by algorithm 1
+improv by bodlaender 1
+improv by darnel 1
+improv by part 1
+improv by perm 1
+improv by redistribut 1
+improv by rt3 1
+improv by throw 1
+improv by transfer 1
+improv by using 2
+improv cach 1
+improv cach affin 1
+improv can us 1
+improv compar 1
+improv computer 1
+improv computer program 1
+improv concur 1
+improv connect 1
+improv connect respon 1
+improv converg 1
+improv dat 1
+improv dat loc 1
+improv decoder 1
+improv defect 1
+improv defect remov 1
+improv diagnost 1
+improv diagnost eff 1
+improv eff 1
+improv encour 1
+improv equiv 1
+improv equiv incr 1
+improv for 1
+improv for check 1
+improv for logarithm 1
+improv further 1
+improv futur 1
+improv futur perform 1
+improv gener 3
+improv gener accur 1
+improv gener perform 2
+improv gener speed 1
+improv groupwar 1
+improv groupwar technolog 1
+improv hardwar 1
+improv hardwar multicast 1
+improv heter 1
+improv heter dist 1
+improv heur 1
+improv if jv1 1
+improv implem 2
+improv in developm 1
+improv in eff 2
+improv in intersect 1
+improv in link 2
+improv in numer 1
+improv in order 1
+improv in perform 1
+improv in proc 2
+improv in qu 1
+improv in regr 1
+improv in stat 1
+improv in term 1
+improv ind 2
+improv ind us 1
+improv involut 1
+improv involut solut 1
+improv is observ 1
+improv is signif 1
+improv it abil 1
+improv it complec 1
+improv it eff 1
+improv it knowledg 1
+improv it perform 1
+improv it result 1
+improv keep 1
+improv keep us 1
+improv load 1
+improv load bal 1
+improv loc 3
+improv lower 1
+improv lower bound 1
+improv may result 1
+improv me 1
+improv me optim 1
+improv menu 1
+improv menu structur 1
+improv network 2
+improv network optim 1
+improv network partit 1
+improv not 1
+improv nxn 1
+improv nxn commun 1
+improv of eff 1
+improv of pag 1
+improv on cur 1
+improv over monot 1
+improv over sager 1
+improv over tradit 1
+improv pack 1
+improv pack techniqu 1
+improv paradigm 1
+improv paradigm addr 1
+improv paradigm appear 1
+improv parallel 1
+improv particl 1
+improv perform 7
+improv pi 1
+improv program 2
+improv program perform 1
+improv prolog 1
+improv prolog implem 1
+improv r tr 1
+improv real 1
+improv reg 1
+improv reg smooth 1
+improv rel 1
+improv result 1
+improv retrief 1
+improv retrief tim 1
+improv sampl 1
+improv sampl sort 1
+improv schem 1
+improv siml 1
+improv siml evolut 1
+improv slow 1
+improv smooth 1
+improv solut 2
+improv solut emerg 1
+improv spectr 1
+improv spectr graph 1
+improv speed 1
+improv split 1
+improv split algorithm 1
+improv split ph 1
+improv step 1
+improv suff 1
+improv system 2
+improv system perform 2
+improv th 1xn 1
+improv th bal 1
+improv th cap 2
+improv th compil 1
+improv th confid 1
+improv th constraint 1
+improv th edg 1
+improv th eff 2
+improv th execut 1
+improv th gener 1
+improv th implem 1
+improv th init 1
+improv th interact 1
+improv th leg 1
+improv th load 1
+improv th object 1
+improv th order 1
+improv th origin 1
+improv th over 1
+improv th paper 1
+improv th perform 9
+improv th problem 1
+improv th produc 1
+improv th project 1
+improv th qu 3
+improv th register 1
+improv th respon 1
+improv th robust 1
+improv th run 2
+improv th runtim 1
+improv th schedl 1
+improv th search 1
+improv th throughput 1
+improv th tim 1
+improv th triv 1
+improv th us 1
+improv th worst 1
+improv that knowledg 1
+improv their eff 1
+improv their run 1
+improv to equiv 1
+improv to mak 1
+improv to yield 1
+improv understand 2
+improv using 1
+improv vect 1
+improv ver 1
+improv wa obtain 1
+improv we ge 1
+improv wer observ 1
+improv which last 1
+improv without chang 1
+impur 2
+impur dialect 1
+impur primitiv 1
+imq 1
+imq we occ 1
+imx 1
+imxj 1
+in 15
+in au 1
+in au co 1
+in binair 1
+in binair de 1
+in concern 1
+in concern es 1
+in de 1
+in de markov 1
+in de ren 1
+in er 1
+in er au 1
+in er ee 1
+in er si 1
+in erant 1
+in erant le 1
+in erer 1
+in erer en 1
+in est 1
+in est dun 1
+in et soulign 1
+in in strong 1
+in intern 1
+in intern joint 1
+in on composit 1
+in particl 1
+in particl rement 1
+in pr 2
+in pr sent 1
+in sur 2
+in sur larchitectur 1
+in sur le 1
+in techn 1
+in techn differ 1
+in to form 1
+in wa pr 1
+in1 1
+in2 1
+in88 1
+inacc 1
+inaccessibl 1
+inaccessibl le 1
+inaccessibl le cel 1
+inaccessibl le part 1
+inaccur 5
+inaccur inform 1
+inaccur on 1
+inaccur stat 1
+inaccur stat predict 1
+inact 5
+inact and x1 1
+inact inclus 1
+inact left neighbour 1
+inact on 1
+inact on caus 1
+inact period 1
+inact proc 1
+inact st 1
+inact to act 1
+inadequ 8
+inadequ or unnec 1
+inadequ system 1
+inadequ system cap 1
+inadequ to model 1
+inadver 1
+inadver be encourag 1
+inaeu 1
+inaeuencer 1
+inaeuencer le 1
+inaeuencer le algorithm 1
+inanim 1
+inanim object 1
+inappl 3
+inappropr 6
+inappropr appl 1
+inappropr comb 1
+inappropr design 1
+inappropr for color 1
+inappropr inherit 1
+inappropr inherit caus 1
+inappropr or inappl 1
+inappropr us 1
+inaptitud 1
+inaptitud a eviter 1
+inasmuch 1
+inasmuch as parod 1
+inattendus 1
+inausp 1
+inausp to simp 1
+inc 52
+inc edg 6
+inc edg disconnect 1
+inc geometer 1
+inc geometer point 1
+inc link 1
+inc link switch 1
+inc of weapon 1
+inc path 1
+inc sur 1
+inc sur la 1
+inc to distinct 1
+inc to g0 1
+inc to ri 1
+inc to rj 1
+inc to rol 1
+inc to ver 1
+inc to vi 1
+inc upon v4 1
+inc ver 1
+inc ver belong 1
+inc with delaun 1
+incap 1
+incap of deal 1
+incapabl 1
+incapabl de 1
+incapabl de proposer 1
+incarn 2
+incarn compil 1
+incarn compil ee 1
+incarn of log 1
+incent 2
+incent stem 1
+incentiv 1
+incentiv for excel 1
+incertain 1
+incertain pour 1
+incertain pour qu 1
+incertitud 1
+inch 1
+inch approxim 1
+inch pixel 1
+inchang 3
+inchang e si 1
+inchang ee 1
+inchang es 1
+inchang es sous 1
+incl 1
+inclu 2
+inclu certain 1
+inclu certain surc 1
+inclu de 1
+inclu de appel 1
+inclu de op 1
+inclu de pr 1
+inclu de term 1
+inclu le 1
+inclu le ca 1
+inclu loptim 1
+inclu loptim dappel 1
+inclur 2
+inclur un 1
+inclur un inform 1
+inclus 104
+inclus a benefit 1
+inclus a brief 1
+inclus a broader 1
+inclus a ca 1
+inclus a comparison 1
+inclus a dash 1
+inclus a descript 1
+inclus a distingu 1
+inclus a distribut 1
+inclus a fl 1
+inclus a gaus 1
+inclus a glob 1
+inclus a langu 1
+inclus a match 1
+inclus a menu 1
+inclus a model 1
+inclus a not 1
+inclus a number 2
+inclus a pa 1
+inclus a particl 1
+inclus a power 1
+inclus a proc 2
+inclus a quantif 1
+inclus a realm 1
+inclus a reason 1
+inclus a red 1
+inclus a road 1
+inclus a se 1
+inclus a simpl 1
+inclus a singl 1
+inclus a specif 1
+inclus a tok 1
+inclus a unif 1
+inclus a writ 1
+inclus account 1
+inclus act 1
+inclus adapt 1
+inclus adapt tim 1
+inclus adjust 1
+inclus ai 1
+inclus al branch 1
+inclus al inc 1
+inclus al industr 1
+inclus al inform 1
+inclus al memor 1
+inclus al pract 1
+inclus al quantit 1
+inclus algorithm 1
+inclus an integer 1
+inclus and parameter 2
+inclus appl 1
+inclus appropr 1
+inclus appropr wait 1
+inclus argum 1
+inclus argum return 1
+inclus aver 1
+inclus aver number 1
+inclus avoc 1
+inclus ba 1
+inclus ba event 1
+inclus bal 1
+inclus befor disc 1
+inclus behavior 1
+inclus behavior definit 1
+inclus boolean 1
+inclus boolean oper 1
+inclus both dat 1
+inclus both prolog 1
+inclus both softwar 1
+inclus both st 1
+inclus capabil 1
+inclus cl 1
+inclus cn 1
+inclus color 1
+inclus color featur 1
+inclus compar 1
+inclus compar an 1
+inclus compl 1
+inclus consider 1
+inclus cpu 1
+inclus cpu tim 1
+inclus cur 1
+inclus cur number 1
+inclus cut 1
+inclus dat 1
+inclus dat dep 1
+inclus datab 1
+inclus datab manag 1
+inclus dec 1
+inclus defin 1
+inclus definit 1
+inclus definit program 1
+inclus detail 1
+inclus detect 1
+inclus dev 1
+inclus develop 1
+inclus digit 1
+inclus digit geometer 1
+inclus distribut 1
+inclus distribut instr 1
+inclus e ai 1
+inclus encor 1
+inclus encor multimac 1
+inclus entr 1
+inclus errn.h 1
+inclus errn.h inclus 1
+inclus et lautr 1
+inclus ev test 1
+inclus exact 1
+inclus exact prob 1
+inclus expect 1
+inclus expect failur 1
+inclus explan 1
+inclus explan ba 1
+inclus expon 2
+inclus expon aver 1
+inclus ext 1
+inclus ext user 1
+inclus fic 1
+inclus fil 2
+inclus finit 1
+inclus finit el 1
+inclus for ae 1
+inclus for compl 1
+inclus format 1
+inclus format fault 1
+inclus four constraint 1
+inclus frequ 1
+inclus frequ count 1
+inclus futur 1
+inclus futur self 1
+inclus gener 2
+inclus gener fact 1
+inclus gener proc 1
+inclus giv 1
+inclus giv se 1
+inclus graph 1
+inclus graph edit 1
+inclus handl 1
+inclus high level 1
+inclus horn 1
+inclus horn claus 1
+inclus hot 1
+inclus hot spar 1
+inclus ib2 1
+inclus in addit 1
+inclus in character 1
+inclus in sf2c 1
+inclus in upd 1
+inclus inc 1
+inclus inc link 1
+inclus inclus 1
+inclus inclus me 1
+inclus incorrect 1
+inclus incorrect init 1
+inclus infinit 1
+inclus infinit behaviour 1
+inclus inform 2
+inclus inform regard 1
+inclus inst 2
+inclus inst throughput 1
+inclus inst util 1
+inclus instruc 1
+inclus interfac 2
+inclus interfac failur 1
+inclus interfac register 1
+inclus intersect 1
+inclus intersect typ 1
+inclus intersper 1
+inclus intersper inact 1
+inclus it strength 1
+inclus iter 2
+inclus iter algorithm 1
+inclus iter method 1
+inclus k ary 1
+inclus knowledg 1
+inclus lingu 1
+inclus lingu support 1
+inclus link 1
+inclus link nod 1
+inclus loc 1
+inclus loc queu 1
+inclus loop 1
+inclus loop skew 1
+inclus man older 1
+inclus manu 1
+inclus maspar 1
+inclus maspar mp 1
+inclus math.h 1
+inclus math.h def 1
+inclus maxrol 1
+inclus me 1
+inclus me variabl 1
+inclus measur 1
+inclus memor 1
+inclus memor refer 1
+inclus menu 1
+inclus menu item 1
+inclus method 1
+inclus method invoc 1
+inclus minim 1
+inclus minim hardwar 1
+inclus mor object 1
+inclus most dynam 1
+inclus most synchron 1
+inclus mp 1
+inclus mp resourc.h 1
+inclus mpl.h 1
+inclus mpl.h inclus 1
+inclus mult 1
+inclus mult by 1
+inclus multipl 3
+inclus multipl inherit 1
+inclus never del 1
+inclus nl 1
+inclus nl typ.h 1
+inclus nod 3
+inclus nod status 1
+inclus nondetermin 1
+inclus nondetermin oper 1
+inclus nonparameter 1
+inclus nonparameter method 1
+inclus numer 2
+inclus numer inform 1
+inclus numer memor 1
+inclus object 1
+inclus object plac 1
+inclus occam.h 1
+inclus of funct 1
+inclus of graph 1
+inclus of priorit 1
+inclus oper 1
+inclus or exclus 1
+inclus other interv 1
+inclus output 2
+inclus output act 1
+inclus output variabl 1
+inclus part 1
+inclus part fil 1
+inclus peer 1
+inclus peer collabor 1
+inclus pen 1
+inclus pen comput 1
+inclus pipelin 1
+inclus pipelin ram 1
+inclus plain 1
+inclus plain transfer 1
+inclus plan 1
+inclus polymorph 1
+inclus polymorph frustr 1
+inclus polymorph lead 1
+inclus port 1
+inclus power 1
+inclus power aggreg 1
+inclus predict 1
+inclus prob 1
+inclus prob modif 1
+inclus program 4
+inclus program execut 1
+inclus program langu 1
+inclus program specif 1
+inclus propag 1
+inclus propag del 1
+inclus quest 1
+inclus quest involut 1
+inclus quest.h 1
+inclus queu 1
+inclus queu tim 1
+inclus read 1
+inclus receiver 1
+inclus recov 1
+inclus recur 2
+inclus recur project 1
+inclus recur typ 1
+inclus reduc 1
+inclus refer 1
+inclus refer manu 1
+inclus reflec 1
+inclus reg 1
+inclus reg satel 1
+inclus rel 2
+inclus rel algebr 1
+inclus rel datab 1
+inclus replac 1
+inclus replac telephon 1
+inclus ri 1
+inclus rl 1
+inclus rn 1
+inclus scatter 1
+inclus schedl 1
+inclus scientif 1
+inclus scientif comput 1
+inclus se 1
+inclus se design 1
+inclus sen 1
+inclus sen me 1
+inclus sever dimac 1
+inclus sever exclus 1
+inclus short descript 1
+inclus simd 1
+inclus simd mach 1
+inclus som abstract 1
+inclus som ind 1
+inclus speed 1
+inclus spreadsh 1
+inclus standard 1
+inclus standard se 1
+inclus std.h 1
+inclus std.h inclus 1
+inclus stdlib.h 1
+inclus stdlib.h inclus 1
+inclus string.h 1
+inclus string.h inclus 1
+inclus su 1
+inclus subrout 2
+inclus subrout cal 1
+inclus subtransact 1
+inclus such composit 1
+inclus such endeavour 1
+inclus swap 1
+inclus sy 1
+inclus sy tim.h 1
+inclus system 1
+inclus system login 1
+inclus tang 1
+inclus task 1
+inclus task model 1
+inclus techniqu 1
+inclus test 1
+inclus test environm 1
+inclus th an 1
+inclus th ba 1
+inclus th cit 1
+inclus th cl 1
+inclus th claus 1
+inclus th comput 2
+inclus th computer 1
+inclus th con 1
+inclus th cost 2
+inclus th cpu 1
+inclus th cr 2
+inclus th design 1
+inclus th disk 1
+inclus th distingu 1
+inclus th distribut 1
+inclus th dum 1
+inclus th dynam 1
+inclus th edg 2
+inclus th effect 1
+inclus th en 1
+inclus th expect 1
+inclus th fact 1
+inclus th forml 1
+inclus th graph 1
+inclus th heap 1
+inclus th influ 1
+inclus th infr 1
+inclus th inherit 1
+inclus th leader 1
+inclus th link 1
+inclus th loc 1
+inclus th log 1
+inclus th manag 1
+inclus th nl 1
+inclus th number 1
+inclus th oj 1
+inclus th on 1
+inclus th oper 1
+inclus th oracl 1
+inclus th overhead 1
+inclus th part 1
+inclus th po 2
+inclus th problem 1
+inclus th proc 2
+inclus th reduc 1
+inclus th requir 1
+inclus th resourc 1
+inclus th result 1
+inclus th root 1
+inclus th scenar 1
+inclus th select 1
+inclus th slot 1
+inclus th specif 2
+inclus th st 1
+inclus th steep 1
+inclus th structur 1
+inclus th subproblem 1
+inclus th tel 1
+inclus th think 1
+inclus th tim 1
+inclus th typ 1
+inclus th upd 1
+inclus th user 1
+inclus th usu 1
+inclus th valu 1
+inclus th vid 1
+inclus th work 1
+inclus their assum 1
+inclus thr dat 1
+inclus tim 1
+inclus tim requir 1
+inclus tool 1
+inclus tool select 1
+inclus tot 1
+inclus tot buffer 1
+inclus transl 1
+inclus tw distingu 1
+inclus tw level 2
+inclus undec 1
+inclus uniform 1
+inclus uniform memor 1
+inclus unit 1
+inclus unit claus 1
+inclus user 1
+inclus user custom 1
+inclus var 3
+inclus var del 1
+inclus var non 1
+inclus var nonmonot 1
+inclus vid 1
+inclus wh 1
+inclus within docum 1
+inclus workst 1
+inclus workst consol 1
+inclus x window 1
+inclut 1
+inclut dautr 1
+inclut dautr op 1
+inclut de 1
+inclut de don 1
+inclut deux 1
+inclut deux champ 1
+inclut deux register 1
+inclut le 1
+inclut un 1
+inclut un estampil 1
+inclut un param 1
+inclut un register 1
+inclut un test 1
+incoh 2
+incoh pag 1
+incom 10
+incom argum 1
+incom argum term 1
+incom channel 1
+incom commun 1
+incom dep 1
+incom dep edg 1
+incom edg 2
+incom inform 1
+incom input 1
+incom input rel 1
+incom link 1
+incom me 2
+incom outg 1
+incom pattern 1
+incom request 1
+incom resourc 1
+incom resourc dep 1
+incom row 1
+incom row tag 1
+incom tok 1
+incom tok using 1
+incom workload 1
+incom workload pack 1
+incomp 1
+incomp es 1
+incompar 4
+incompat 4
+incompat constraint 2
+incompat method 1
+incompat method domain 1
+incompatibil 1
+incompatibil and support 1
+incompatibil in assum 1
+incompatibl 2
+incompatibl lectur 1
+incompl 14
+incompl and incon 1
+incompl car 1
+incompl de 1
+incompl event 1
+incompl event interfac 1
+incompl execut 1
+incompl execut subtransact 1
+incompl inform 1
+incompl k tupl 1
+incompl l1 1
+incompl l1 oper 1
+incompl ne 1
+incompl ne contenait 1
+incompl ol 1
+incompl ol support 1
+incompl on en 1
+incompl op 1
+incompl op 1s 1
+incompl or empt 1
+incompl or incorrect 1
+incompl or us 1
+incompl schem 1
+incompl se 1
+incompl sect 1
+incompl self 1
+incompl self modif 1
+incompl shap 1
+incompl subtransact 1
+incompl te 1
+incompl theor 1
+incompl top 1
+incompl top level 1
+incompl transact 1
+incompl understand 1
+incompl world 1
+incompl world knowledg 1
+incompr 1
+incon 12
+incon ar remov 1
+incon du 1
+incon e unit 1
+incon nam 1
+incon object 1
+incon object nam 1
+incon ol 1
+incon ol support 1
+incon older 1
+incon older knowledg 1
+incon st 1
+incon stateoptim 1
+incon stateoptim st 1
+incon that ec 1
+incon theor 1
+incon valu 1
+inconceiv 1
+inconditionnel 1
+inconditionnel beaucoup 1
+inconditionnel demand 1
+inconditionnel demand simpl 1
+inconditionnel est 1
+inconditionnel est transpar 1
+inconditionnel le 1
+inconditionnel le raison 1
+inconditionnel par 1
+inconditionnel par affect 1
+inconditionnel tout 1
+inconditionnel tout le 1
+inconnu 1
+incontestabl 1
+incontestabl par 1
+incontestabl par un 1
+incontr 1
+incontr ol 1
+incontr ol ee 1
+inconv 5
+inconv enient 3
+inconv enient de 2
+inconv enient dun 2
+inconv enient li 1
+inconv enient qu 1
+inconv enient quil 1
+inconv enient rest 1
+inconv enient suppl 1
+inconv to specif 1
+incooper 1
+incooper mut 1
+incorpor 39
+incorpor a detail 1
+incorpor a merg 1
+incorpor a number 2
+incorpor a qualit 1
+incorpor a sen 1
+incorpor a taxonom 1
+incorpor acycl 1
+incorpor addit 2
+incorpor addit knowledg 1
+incorpor addit serv 1
+incorpor al mean 1
+incorpor an eff 1
+incorpor an enh 1
+incorpor any me 1
+incorpor assessm 1
+incorpor by requir 1
+incorpor context 1
+incorpor context inform 1
+incorpor dat 1
+incorpor del 1
+incorpor differ con 1
+incorpor difficult 1
+incorpor distribut 1
+incorpor distribut dat 1
+incorpor domainspecif 1
+incorpor domainspecif knowledg 1
+incorpor el 1
+incorpor explicit 1
+incorpor explicit format 1
+incorpor extr 1
+incorpor extr prov 1
+incorpor fault 1
+incorpor fault toler 1
+incorpor in chem 1
+incorpor in program 1
+incorpor inclus 1
+incorpor inclus polymorph 1
+incorpor ind 1
+incorpor int columb 1
+incorpor int parameter 1
+incorpor interact 1
+incorpor liter 1
+incorpor liter const 1
+incorpor model 1
+incorpor mor elabor 1
+incorpor mor evid 1
+incorpor mor principl 2
+incorpor new 1
+incorpor new acquir 1
+incorpor new knowledg 1
+incorpor of appl 1
+incorpor of for 1
+incorpor of gener 1
+incorpor of sem 1
+incorpor of structur 1
+incorpor optim 1
+incorpor optim constraint 1
+incorpor parallel 1
+incorpor prior 1
+incorpor prior knowledg 1
+incorpor sever us 1
+incorpor som constraint 1
+incorpor specl 1
+incorpor specl comput 1
+incorpor structur 1
+incorpor structur inform 1
+incorpor such featur 1
+incorpor th object 1
+incorpor th opt 1
+incorpor th result 1
+incorpor th tim 1
+incorpor th tpsim 1
+incorpor to tak 1
+incorrect 19
+incorrect answer 1
+incorrect argum 1
+incorrect befor resum 1
+incorrect branch 1
+incorrect cal 1
+incorrect ch 1
+incorrect classif 1
+incorrect compil 1
+incorrect compil cod 1
+incorrect dat 1
+incorrect enabl 1
+incorrect enabl command 1
+incorrect execut 1
+incorrect init 1
+incorrect loc 1
+incorrect mac 1
+incorrect or empt 1
+incorrect or inappropr 1
+incorrect or incompl 1
+incorrect predict 1
+incorrect predict branch 1
+incorrect reason 1
+incorrect reason ch 1
+incorrect repr 1
+incorrect result 1
+incorrect retrief 1
+incorrect solut 1
+incorrect taught 1
+incorrect under closer 1
+incorrect valu 1
+incorrect with respect 1
+incorrect world 1
+incorrect world model 1
+incorrectworld 1
+incorrectworld model 1
+incp 1
+incp act 1
+incp and decp 1
+incp or decp 1
+incr 87
+incr a confid 1
+incr amount 1
+incr and decr 2
+incr and np 1
+incr asymptot 1
+incr attent 1
+incr author 1
+incr avail 2
+incr b level 1
+incr board 2
+incr board ar 2
+incr by ch 1
+incr by exact 1
+incr by ten 1
+incr c lead 1
+incr cardin 1
+incr channel 1
+incr channel speed 1
+incr channel width 1
+incr cluster 3
+incr cluster siz 3
+incr column 1
+incr column ind 1
+incr commun 1
+incr complec 1
+incr comput 1
+incr comput cost 1
+incr concur 1
+incr congest 1
+incr cost 2
+incr cruisespeed 1
+incr cruisespeed cruisest 1
+incr datab 1
+incr datab siz 1
+incr decr 1
+incr decr addr 1
+incr decr mod 1
+incr degr 1
+incr del 1
+incr deliver 1
+incr deliver bandwidth 1
+incr demand 2
+incr demand lead 1
+incr dep 2
+incr div 1
+incr div counterkg 1
+incr dur execut 1
+incr eff 1
+incr em 1
+incr em du 1
+incr ement 1
+incr ement de 1
+incr ement ee 1
+incr ement peut 1
+incr ementer 1
+incr ementer bp 1
+incr exact 1
+incr expl 1
+incr expon 1
+incr failur 1
+incr failur detect 1
+incr fal 1
+incr fal shar 1
+incr faster 1
+incr from kmac 1
+incr from q1.6 1
+incr from q2.0 1
+incr funct 2
+incr gener 1
+incr gener accur 1
+incr guid 1
+incr h lead 1
+incr imp 1
+incr import 1
+incr in bus 1
+incr in channel 1
+incr in cluster 3
+incr in commun 1
+incr in compl 1
+incr in concur 1
+incr in cost 2
+incr in den 1
+incr in depth 1
+incr in dim 1
+incr in execut 1
+incr in frequ 1
+incr in input 1
+incr in level 1
+incr in n2 1
+incr in parallel 1
+incr in proc 3
+incr in procc 1
+incr in siz 1
+incr in speedup 1
+incr ind 2
+incr inform 1
+incr inter 1
+incr inter cluster 1
+incr interest 1
+incr it complec 1
+incr it level 1
+incr it ph 1
+incr it rel 1
+incr it search 1
+incr it sequ 1
+incr it writ 1
+incr key 1
+incr key valu 1
+incr larg random 1
+incr lat 1
+incr lexicograph 1
+incr lexicograph order 1
+incr lin 1
+incr loc 1
+incr m decr 1
+incr map 1
+incr map siz 1
+incr mark 1
+incr mark compar 1
+incr marker 1
+incr match 1
+incr me 2
+incr me length 1
+incr me siz 1
+incr memor 1
+incr memor siz 1
+incr ment 1
+incr ment pour 1
+incr monot 1
+incr most quick 1
+incr much faster 1
+incr network 2
+incr network bisect 1
+incr network cont 1
+incr next track 1
+incr nrd 1
+incr nrd perceiv 1
+incr number 6
+incr of cp 1
+incr of nod 1
+incr of t3 1
+incr oper 1
+incr or blow 1
+incr or decr 5
+incr order 3
+incr over tim 1
+incr overlap 1
+incr parallel 1
+incr perform 1
+incr perform du 1
+incr pinout 1
+incr po 1
+incr popl 2
+incr post 1
+incr problem 1
+incr problem siz 1
+incr produc 1
+incr produc funct 1
+incr proper 1
+incr proport 1
+incr qu 1
+incr qu lin 1
+incr quick 1
+incr quit stead 1
+incr recogn 1
+incr regl 1
+incr rout 1
+incr rout hardwar 1
+incr scrutin 1
+incr sect 1
+incr sect length 1
+incr sent 1
+incr sent complec 1
+incr sharp 1
+incr signif 2
+incr signif instead 1
+incr siz 2
+incr smooth 1
+incr softwar 1
+incr softwar degrad 1
+incr start 1
+incr subst 1
+incr tb 1
+incr tcom 1
+incr th accur 1
+incr th avail 1
+incr th aver 1
+incr th buffer 1
+incr th candid 1
+incr th chanc 2
+incr th complec 2
+incr th compon 1
+incr th condit 1
+incr th congest 1
+incr th connect 1
+incr th context 1
+incr th cost 3
+incr th cuml 1
+incr th datab 1
+incr th deform 1
+incr th depth 1
+incr th difficult 2
+incr th eff 3
+incr th fault 1
+incr th fil 1
+incr th fin 1
+incr th foc 1
+incr th former 1
+incr th group 1
+incr th hard 1
+incr th init 1
+incr th intercluster 1
+incr th length 1
+incr th level 2
+incr th lim 1
+incr th load 1
+incr th loc 1
+incr th me 3
+incr th network 1
+incr th number 9
+incr th opt 1
+incr th optim 1
+incr th over 1
+incr th overhead 2
+incr th overlap 1
+incr th perceiv 1
+incr th pool 1
+incr th pot 1
+incr th prec 2
+incr th privileg 1
+incr th prob 2
+incr th proc 1
+incr th qu 1
+incr th register 1
+incr th reserv 1
+incr th robust 2
+incr th sal 1
+incr th sensit 1
+incr th siz 2
+incr th spac 1
+incr th system 1
+incr th tim 2
+incr th tot 2
+incr th us 1
+incr th user 1
+incr th valu 2
+incr th wir 1
+incr their cap 1
+incr their confid 1
+incr their level 1
+incr their ph 1
+incr their proc 1
+incr to blog 1
+incr to o3 1
+incr tot 1
+incr tot work 1
+incr unaccept 1
+incr us instead 1
+incr val 1
+incr val marker 1
+incr valu 2
+incr var 1
+incr ver slow 1
+incr vi 1
+incr vocabl 1
+incr weak 1
+incr wealth 1
+incr weight 1
+incr with cluster 2
+incr with incr 1
+incr with offer 1
+incr with rat 1
+incr with tim 1
+increm 37
+increm acc 1
+increm acc method 1
+increm algorithm 3
+increm and decrem 1
+increm and therefor 1
+increm and upd 1
+increm approach 2
+increm as learn 1
+increm chang 2
+increm cl 2
+increm cl dict 1
+increm cl reorgan 1
+increm compact 1
+increm compact counter 1
+increm compil 1
+increm compiler 1
+increm comput 1
+increm con 1
+increm con maint 1
+increm conceptu 1
+increm conceptu cluster 1
+increm constraint 1
+increm constraint solver 1
+increm dat 1
+increm dat flow 1
+increm developm 1
+increm edinburgh 1
+increm enrich 1
+increm ev cycl 1
+increm evalu 1
+increm expan 1
+increm ext 1
+increm from ptx 1
+increm hillclimb 1
+increm hillclimb search 1
+increm implem 1
+increm implem model 1
+increm integr 1
+increm join 1
+increm join attachm 1
+increm knowledg 1
+increm knowledg int 1
+increm learn 2
+increm learn ba 1
+increm learn situ 1
+increm maintain 1
+increm maintain con 1
+increm model 1
+increm modif 1
+increm modif learn 1
+increm or decrem 1
+increm parameter 1
+increm parameter instead 1
+increm ph 1
+increm port 1
+increm port prolog 1
+increm proc 2
+increm proc perform 1
+increm program 1
+increm program test 1
+increm prolog 1
+increm prolog compiler 1
+increm prolog system 1
+increm quer 1
+increm rang 1
+increm rang quer 1
+increm regr 1
+increm regr test 1
+increm retrief 1
+increm schem 1
+increm schem inclus 1
+increm search 2
+increm search begin 1
+increm search problem 1
+increm search task 1
+increm self 1
+increm self improv 1
+increm selfimprov 1
+increm selfimprov paradigm 1
+increm spec 1
+increm system 1
+increm th bin 1
+increm th sal 1
+increm th ver 1
+increm timesl 1
+increm to keep 1
+increm to point 1
+increm upd 2
+increm us 1
+increm valu 1
+increm var 1
+incrementn 1
+incrementn instruc 1
+incur 16
+incur a lat 1
+incur any dep 1
+incur by hold 1
+incur even high 1
+incur exact 1
+incur high complec 1
+incur high developm 1
+incur in divid 1
+incur much overhead 1
+incur no addit 1
+incur no overhead 1
+incur per by 1
+incur run 1
+incur run tim 1
+incur th overhead 1
+incur to acquir 1
+incur ver low 1
+incur when execut 1
+ind 103
+ind a ba 1
+ind a bar 1
+ind a crit 1
+ind a deux 1
+ind a good 1
+ind a lack 1
+ind a restrict 1
+ind a subcl 1
+ind a tren 1
+ind a typ 1
+ind absolut 1
+ind absolut certaint 1
+ind acc 1
+ind acc edant 1
+ind addr 1
+ind addr mod 1
+ind algorithm 1
+ind altern 1
+ind an expon 1
+ind an idl 1
+ind an interest 1
+ind an opt 1
+ind and acc 1
+ind and determin 1
+ind and discrim 1
+ind and explain 1
+ind and fact 1
+ind and fl 1
+ind and fuzz 1
+ind and hash 1
+ind and imag 1
+ind and qu 1
+ind and retrief 1
+ind and tim 1
+ind and vid 1
+ind approach 1
+ind ar 1
+ind ar ask 1
+ind argum 1
+ind automat 1
+ind ba 1
+ind border 1
+ind border marker 1
+ind bt 1
+ind build 1
+ind by dim 1
+ind by oe 1
+ind by spac 1
+ind by var 1
+ind by whit 1
+ind calcl 1
+ind can pl 1
+ind cel 1
+ind collect 1
+ind column 1
+ind compat 1
+ind consid 1
+ind contrair 1
+ind count 1
+ind datab 1
+ind de 4
+ind de boucl 1
+ind de but 1
+ind de comp 1
+ind de figur 1
+ind de fonctionnalit 1
+ind de mot 1
+ind de tabl 1
+ind de val 1
+ind defin 1
+ind dep 1
+ind diab 1
+ind diab promoter 1
+ind differ 1
+ind direct 1
+ind disjunct 1
+ind diverg 1
+ind domain 1
+ind each imag 1
+ind earl 1
+ind en 1
+ind en nutil 1
+ind encomp 1
+ind epen 3
+ind epen au 1
+ind epen avec 1
+ind epen d1 1
+ind epen de 3
+ind epen du 2
+ind epen sec 1
+ind ependam 4
+ind ependam de 3
+ind ependam du 1
+ind ependam le 2
+ind esirabl 2
+ind esirabl qu 1
+ind est 1
+ind est qu 1
+ind et crit 1
+ind etermin 1
+ind etermin ee 1
+ind exact 1
+ind exact wh 1
+ind execut 1
+ind extr 1
+ind extr ind 1
+ind f1 1
+ind field 2
+ind fil 1
+ind fil typ 1
+ind fin 1
+ind fin network 1
+ind for 3d 1
+ind for acc 1
+ind for brow 1
+ind for exampl 1
+ind for geometer 1
+ind for inform 1
+ind for mult 1
+ind for qu 1
+ind for rang 1
+ind for recogn 1
+ind for transact 1
+ind form 1
+ind funct 1
+ind g om 1
+ind gener. 1
+ind how lik 1
+ind i0 1
+ind i1 1
+ind ij 1
+ind ij don 1
+ind ij en 1
+ind imag 1
+ind imag reg 1
+ind implem 1
+ind in contextu 1
+ind in dim 1
+ind in eqn 1
+ind in exper 1
+ind in figur 1
+ind in memor 1
+ind in sect 1
+ind incr 1
+ind incr imp 1
+ind ind 3
+ind indirect 1
+ind indirect addr 1
+ind instead 1
+ind instruc 1
+ind introduc 1
+ind is comput 1
+ind is found 1
+ind is gener 1
+ind is giv 1
+ind is lim 1
+ind it gener 1
+ind keep 1
+ind keep track 1
+ind knowledg 1
+ind knowledg structur 1
+ind larg vol 1
+ind last acc 1
+ind learn 1
+ind level 1
+ind manag 1
+ind manag method 1
+ind measur 1
+ind measur valu 1
+ind mechan 2
+ind mechan inclus 1
+ind method 3
+ind model 1
+ind model predict 1
+ind monot 1
+ind monot incr 1
+ind network 1
+ind network resourc 1
+ind new valu 1
+ind no shuffl 1
+ind nod 1
+ind norm 1
+ind norm fil 1
+ind obsol 1
+ind obsol record 1
+ind of cn 1
+ind of connect 1
+ind of construc 1
+ind of cur 1
+ind of docum 2
+ind of fl 1
+ind of imag 1
+ind of item 1
+ind of kung 1
+ind of order 1
+ind of rel 1
+ind of workload 1
+ind on transact 1
+ind oper 1
+ind or top 1
+ind pa 1
+ind pen 1
+ind per row 1
+ind perm 1
+ind perm dam 1
+ind posit 2
+ind prev 1
+ind priopt 1
+ind proc 2
+ind proc autom 1
+ind prov 1
+ind qu 1
+ind qu techniqu 1
+ind rang 1
+ind reduc 1
+ind reduc redund 1
+ind rel 1
+ind repetit 1
+ind respect 2
+ind respect run 1
+ind se 1
+ind shift 1
+ind should prev 1
+ind simultan 1
+ind sont 1
+ind sont util 1
+ind spac 1
+ind string 1
+ind string concat 1
+ind structur 3
+ind support 1
+ind support krom 1
+ind sur 1
+ind sur deux 1
+ind sur le 1
+ind system 1
+ind system support 1
+ind tak 1
+ind tak plac 1
+ind techniqu 3
+ind techniqu ba 1
+ind th act 1
+ind th addit 1
+ind th confid 1
+ind th configur 2
+ind th cop 1
+ind th degr 1
+ind th error 1
+ind th fram 1
+ind th group 1
+ind th hyperedg 1
+ind th im 1
+ind th ind 2
+ind th ind. 1
+ind th interconnect 1
+ind th interpr 1
+ind th length 1
+ind th nam 1
+ind th nec 1
+ind th nic 1
+ind th nod 1
+ind th number 6
+ind th parameter 1
+ind th partit 1
+ind th posit 2
+ind th prob 1
+ind th proc 1
+ind th record 1
+ind th repr 1
+ind th rout 1
+ind th scop 1
+ind th se 1
+ind th signif 1
+ind th speed 1
+ind th stat 1
+ind th subject 1
+ind th thread 1
+ind th tim 3
+ind th transform 1
+ind th us 1
+ind th user 1
+ind that appear 1
+ind that copt 1
+ind that edg 1
+ind that exper 1
+ind that further 1
+ind that garb 1
+ind that gklr 1
+ind that incr 1
+ind that load 1
+ind that mach 1
+ind that mlkp 1
+ind that mut 1
+ind that nod 1
+ind that particl 1
+ind that proc 2
+ind that propag 1
+ind that report 1
+ind that rx 1
+ind that valu 1
+ind their deriv 1
+ind through 2d 1
+ind tim 1
+ind tim spac 1
+ind to com 1
+ind to measur 1
+ind to proc 1
+ind tok 1
+ind tr 1
+ind ts 1
+ind tw val 1
+ind ument 1
+ind ument modif 1
+ind unexpect 1
+ind unexpect structur 1
+ind us 1
+ind us shift 1
+ind var 2
+ind var dan 1
+ind variabl 2
+ind vect 1
+ind vi 1
+ind what chang 1
+ind which nod 1
+ind xn 1
+ind. 1
+ind.html 1
+ind2 1
+ind3 1
+ind4 1
+indag 1
+indebt 1
+indebt to mark 1
+indeed 36
+indeed a coh 1
+indeed a dec 1
+indeed a denot 1
+indeed a proc 1
+indeed avail 1
+indeed be control 1
+indeed be self 1
+indeed ca 1
+indeed ca wh 1
+indeed cannot cater 1
+indeed chang 1
+indeed coh 1
+indeed coh pair 1
+indeed defin 1
+indeed ea 1
+indeed equiv 1
+indeed hierarch 1
+indeed hierarch system 1
+indeed indirect 1
+indeed indirect link 1
+indeed intersect 1
+indeed latent 1
+indeed latent somewh 1
+indeed lead 1
+indeed merg 1
+indeed much wor 1
+indeed network 1
+indeed network constrain 1
+indeed organ 1
+indeed our ch 1
+indeed prec 1
+indeed repr 1
+indeed requir 1
+indeed signif 1
+indeed signif speed 1
+indeed th entir 1
+indeed to evolut 1
+indeed triangl 1
+indeed typ 1
+indeed work 1
+indefinit 3
+indefinit block 1
+indefinit dat 1
+indefinit extent 1
+indefinit man direct 1
+indefinit number 1
+indegr 2
+indegr zer 1
+indent 2
+indent form 1
+indent form wh 1
+indent grammar 1
+indep 78
+indep 1x 1
+indep achief 1
+indep allow 1
+indep allow eff 1
+indep and flat 1
+indep and henc 1
+indep and object 1
+indep and output 1
+indep and self 1
+indep and targ 1
+indep architectur 1
+indep ascertain 1
+indep at random 1
+indep attempt 1
+indep azar 1
+indep behavior 2
+indep bernoul 1
+indep bernoul experim 1
+indep between pair 1
+indep by shib 1
+indep column 1
+indep compon 1
+indep comput 3
+indep comput agent 1
+indep continu 1
+indep continu act 1
+indep could prov 1
+indep count 1
+indep dec 1
+indep develop 1
+indep distribut 1
+indep do loop 1
+indep docum 1
+indep docum imag 1
+indep du 1
+indep du caract 1
+indep el 1
+indep el transform 1
+indep execut 1
+indep fic 1
+indep fic tim 1
+indep flow 1
+indep format 1
+indep forml 1
+indep fortran 1
+indep fortran stat 1
+indep fr 1
+indep fr parameter 1
+indep giv 1
+indep graph 1
+indep in ca 1
+indep in mathemat 1
+indep in parallel 1
+indep in read 1
+indep instruc 1
+indep interest 2
+indep internet 1
+indep internet ba 1
+indep ip 1
+indep is achief 1
+indep join 1
+indep join continu 1
+indep kernel 1
+indep langu 1
+indep loc 1
+indep loc queu 1
+indep maintain 1
+indep mean 1
+indep measur 1
+indep model 2
+indep model theor 1
+indep modl 1
+indep network 1
+indep no 1
+indep nod 1
+indep nod ba 1
+indep of cod 1
+indep of imag 1
+indep of oper 1
+indep of pj 1
+indep of proc 1
+indep of step 1
+indep of text 1
+indep of tim 1
+indep of x02 1
+indep of xn 1
+indep on 1
+indep on neighbor 1
+indep pair 1
+indep part 1
+indep path 1
+indep phy 1
+indep phy pag 1
+indep pr 1
+indep pr evid 1
+indep random 2
+indep random gener 1
+indep random variabl 1
+indep reus 1
+indep reus compon 1
+indep rol 1
+indep s valu 1
+indep sampl 1
+indep se 6
+indep se layer 1
+indep se level 1
+indep se ublog 1
+indep shar 1
+indep shar compon 1
+indep sign 1
+indep sign featur 1
+indep slav 1
+indep slav loc 1
+indep softwar 1
+indep standard 1
+indep sub 3
+indep sub fa1 1
+indep sub m1 1
+indep sub task 1
+indep subtask 1
+indep techniqu 1
+indep th client 1
+indep to allow 1
+indep transact 1
+indep transform 1
+indep var 2
+indep variabl 1
+indep ver 1
+indep with expon 1
+indep with replac 1
+inder93inpr1shel93shy161trollvenkat25bbmatlhr71map1map2finan512ken11s38584.1 1
+indexedstructur 1
+indexinf 1
+indextimestamp 1
+indicatr 1
+indicatr dun 1
+indicatr dun ensembl 1
+indiff 1
+indiff erem 1
+indiff erem li 1
+indiff erent 1
+indiff erent quand 1
+indiffer 2
+indig 1
+indig engl speak 1
+indig2 1
+indig2 r10000 1
+indig2 r10000 195mhz 1
+indiqu 2
+indiqu clair 1
+indiqu clair se 1
+indiqu com 1
+indiqu com interpr 1
+indiqu dan 1
+indiqu dan quel 1
+indiqu e figur 1
+indiqu larit 1
+indiqu le 1
+indiqu le typ 1
+indiqu lutil 1
+indiqu lutil dun 1
+indiqu qu 2
+indiqu qu dan 1
+indiqu qu la 2
+indiqu quel 1
+indiqu simpl 1
+indiqu simpl un 1
+indiqu un 1
+indiqu un ab 1
+indiquer 2
+indiquer en 1
+indiquer quel 1
+indiquer quel argum 1
+indirect 21
+indirect a traver 1
+indirect acc 2
+indirect addr 3
+indirect addr cel 1
+indirect addr purp 1
+indirect and approxim 1
+indirect and no 1
+indirect and thus 1
+indirect appl 1
+indirect approach 1
+indirect assoc 1
+indirect au 1
+indirect au traver 1
+indirect avail 1
+indirect cal 1
+indirect connect 1
+indirect connect path 1
+indirect connect request 1
+indirect connect se 1
+indirect dan 1
+indirect dan le 1
+indirect de 1
+indirect de instruc 1
+indirect distribut 1
+indirect effect 1
+indirect en 1
+indirect en lectur 1
+indirect est 1
+indirect est evit 1
+indirect fl 1
+indirect fl connect 1
+indirect improv 1
+indirect in term 1
+indirect incr 1
+indirect inst 1
+indirect jump 1
+indirect link 1
+indirect mean 1
+indirect pourrait 1
+indirect pourrait etr 1
+indirect privileg 1
+indirect qu 1
+indirect qu contribu 1
+indirect rest 1
+indirect result 1
+indirect subcl 1
+indirect supercl 1
+indirect suppl 1
+indirect suppl ementair 1
+indirect var 1
+indiscern 1
+indiscern with respect 1
+indiscernibl 1
+indisp 3
+indisp et just 1
+indisp pour 1
+indisp pour obtenir 1
+indistingu 8
+indistingu argum 1
+indistingu argum simil 1
+indistingu const 1
+indistingu from for 1
+indistingu from oe 1
+indistingu from oeb 1
+indistingu nod 1
+indistingu point 1
+indistingu point denot 1
+indistingu to handl 1
+indistingu to sa 1
+indiv 3
+indiv franklin 1
+indiv lec 1
+indiv lec ecut 1
+indiv oper 1
+indiv oper assoc 1
+indiv propag 1
+indiv relationship 1
+individu 47
+individu a lot 1
+individu and indep 1
+individu and point 1
+individu approach 1
+individu ar giv 1
+individu attribut 1
+individu attribut dist 1
+individu au 1
+individu au cour 1
+individu ba 2
+individu backlog 1
+individu backlog connect 1
+individu backlog se 1
+individu be 1
+individu be wh 1
+individu by step 1
+individu ca.17 1
+individu ca.17 consider 1
+individu can con 1
+individu can specif 1
+individu cel 1
+individu character 1
+individu character glyph 1
+individu cl 1
+individu color 1
+individu color histogram 1
+individu com 1
+individu complec 1
+individu complec deriv 1
+individu compon 2
+individu compon failur 1
+individu comput 1
+individu concur 1
+individu concur proc 1
+individu connect 1
+individu constraint 1
+individu cost 1
+individu cost funct 1
+individu dataflow 1
+individu dataflow graph 1
+individu de 1
+individu de la 1
+individu de lag 1
+individu de qualit 1
+individu del 1
+individu di 1
+individu differ 1
+individu direct 1
+individu direct entr 1
+individu dur off 1
+individu ecol 1
+individu ecol oper 1
+individu effect 1
+individu el 1
+individu ent 1
+individu ent ba 1
+individu est 1
+individu est automatiqu 1
+individu et tout 1
+individu event 1
+individu fact 1
+individu featur 2
+individu forml 1
+individu fournit 1
+individu fournit un 1
+individu fragm 1
+individu funct 2
+individu graph 1
+individu host 1
+individu interact 1
+individu is ineff 1
+individu k ye 1
+individu langu 1
+individu level 1
+individu librar 1
+individu lim 1
+individu loc 1
+individu loc pol 1
+individu lorsquon 1
+individu lorsquon ne 1
+individu may specif 1
+individu modl 1
+individu modl problem 1
+individu mult 1
+individu mult step 1
+individu ne 1
+individu ne repr 1
+individu network 1
+individu network becom 1
+individu object 2
+individu of reg 1
+individu ou 1
+individu ou chromosom 1
+individu pag 1
+individu paper 1
+individu pol 1
+individu polygon 1
+individu polygon fac 1
+individu proc 1
+individu queu 1
+individu queu acc 1
+individu remov 1
+individu reserv 1
+individu result 1
+individu run 1
+individu s hotl 1
+individu schem 1
+individu schem pl 1
+individu se 1
+individu sect 1
+individu server 1
+individu string 1
+individu string el 1
+individu sub 1
+individu sub modl 1
+individu sub task 1
+individu subject 1
+individu subject mad 1
+individu switch 1
+individu switch us 1
+individu task 1
+individu task usag 1
+individu term 1
+individu themslev 1
+individu to specif 1
+individu tool 1
+individu tool act 1
+individu triangl 1
+individu triangl fac 1
+individu user 3
+individu var 1
+individu variabl 3
+individu variabl obtain 1
+individu variabl rang 1
+individu visu 1
+individu visu featur 1
+individu weight 1
+individu weight dynam 1
+individu wh 1
+individu whil using 1
+individu wil contain 1
+individu work 1
+individu worker 1
+individu xi 1
+individu xi calculer 1
+individu xm 1
+individuel 2
+individuel de 1
+individuel de transform 1
+individuel la 1
+individus 1
+individus a croiser 1
+individus a lenviron 1
+individus a partir 1
+individus affect 1
+individus affect es 1
+individus aient 1
+individus ayant 1
+individus ayant surv 1
+individus binair 1
+individus binair dun 1
+individus de 1
+individus de la 1
+individus dun 1
+individus dun popl 1
+individus enf 1
+individus enf de 1
+individus entr 1
+individus entr le 1
+individus et ain 1
+individus le 1
+individus le moin 1
+individus obtenus 1
+individus obtenus par 1
+individus parent 1
+individus parent de 1
+individus re cus 1
+individus sont 1
+individus sont ch 1
+individus sont ensuit 1
+individus suiv 1
+individus suiv cl 1
+individus util 1
+individus util de 1
+individus x1 1
+indomain 1
+indomain label 1
+indomain label improv 1
+indomain mean 1
+indor 1
+indor research 1
+indu 1
+indu un co 1
+indu un tr 1
+induc 48
+induc a compl 1
+induc a multim 1
+induc a partit 1
+induc a ping 1
+induc an observ 1
+induc and inst 1
+induc argum 1
+induc as follow 1
+induc ba 2
+induc ba design 1
+induc bi 1
+induc bi creat 1
+induc bi gener 1
+induc by appl 1
+induc by asynchron 1
+induc by explor 1
+induc by fal 1
+induc by mi 1
+induc by therm 1
+induc ca 1
+induc color 1
+induc color subgraph 1
+induc concept 1
+induc concept learn 1
+induc construc 1
+induc construc method 1
+induc def 1
+induc dent 1
+induc depth 1
+induc direct 1
+induc direct edg 1
+induc equiv 1
+induc high network 1
+induc hypoth 12
+induc hypoth appl 1
+induc hypoth giv 1
+induc in scientif 1
+induc infer 3
+induc infer ba 1
+induc infer benchmark 1
+induc infer dimac 1
+induc infer forml 1
+induc infer problem 1
+induc init 1
+induc init pr 1
+induc is inclus 1
+induc is us 1
+induc larg scal 1
+induc learn 3
+induc no incon 1
+induc of dynam 1
+induc of finit 2
+induc of probabil 1
+induc on abstract 1
+induc on deriv 1
+induc on jej 1
+induc on oe 1
+induc on vi 1
+induc proc 1
+induc proof 2
+induc reason 1
+induc reason lead 1
+induc rl 1
+induc sever typ 1
+induc som atom 1
+induc spik 1
+induc start 1
+induc step 3
+induc subgraph 1
+induc th largest 1
+induc th order 1
+induc th worst 1
+induc to work 1
+induc var 1
+induc var recognit 1
+inductiv 1
+inductiv a partir 1
+induit 1
+induit cep 1
+induit en 1
+induit en fait 1
+induit par 1
+induit sur 1
+induit un co 1
+indust 1
+industr 19
+industr administer 1
+industr administer carneg 1
+industr and appl 1
+industr appl 1
+industr control 1
+industr cour 1
+industr deem 1
+industr empl 1
+industr engineer 1
+industr expenditur 1
+industr exper 1
+industr hav simil 1
+industr help 1
+industr help prov 1
+industr in situ 1
+industr p etrol 1
+industr prov 1
+industr prov extern 1
+industr qu 1
+industr qu softwar 1
+industr research 2
+industr research center 1
+industr research centr 1
+industr robot 1
+industr se 1
+industr se ten 1
+industr should determin 1
+industr softwar 1
+industr softwar project 1
+industr strength 2
+industr strength cap 1
+industr strength mult 1
+industr subject 1
+industr user 1
+industr vi 1
+industr vi tool 1
+industriel 1
+industriel pr 1
+industriel pr ef 1
+inec 1
+ineff 15
+ineff com 1
+ineff compar 1
+ineff introduc 1
+ineff memor 1
+ineff memor manag 1
+ineff proc 1
+ineff to sen 1
+ineff us 2
+ineffect 3
+ineffect approach 1
+ineffect approach ba 1
+ineffect at rev 1
+ineffect of crossover 1
+inequ 19
+inequ and equ 1
+inequ and writ 1
+inequ assoc 1
+inequ axx2 1
+inequ axx2 ayy2 1
+inequ by repeat 1
+inequ constraint 3
+inequ contain 1
+inequ def 1
+inequ describ 1
+inequ expr 1
+inequ expr ib 1
+inequ follow 3
+inequ for dep 1
+inequ hav integr 1
+inequ ib 1
+inequ is known 1
+inequ is respect 1
+inequ is simil 1
+inequ ln 1
+inequ over real 2
+inequ produc 1
+inequ test 1
+inequ to look 1
+inequ to neg 1
+inequ we ge 1
+inequ wh coeff 1
+inequ with coeff 1
+inequ with non 1
+inequ with posit 1
+inequ without arithm 1
+inequ xy 1
+iner 1
+iner or transport 1
+inestim 2
+inestim fact 2
+inevit 6
+inevit and therefor 1
+inevit by produc 1
+inevit obtain 1
+inevit that 2cl 1
+inevit tradeoff 1
+inevit would evolut 1
+inexact 2
+inexact graph 1
+inexact graph match 1
+inexact match 1
+inexact of banerj 1
+inexp 4
+inexp disk 1
+inexp solut 1
+inexp to deliver 1
+inf 22
+inf datab 1
+inf erieur 4
+inf erieur au 1
+inf erieur correspon 1
+inf erieur don 1
+inf erieur dordr 1
+inf erieur facil 1
+inf erieur ne 1
+inf erieur nous 1
+inf erieur ou 1
+inf erieur peut 1
+inf erieur pr 1
+inf erieur pren 1
+inf f2g 1
+inf form 1
+inf loc 1
+inf loc diaryloc 1
+inf m2mk 1
+inf m2mkng 1
+inf not 2
+inf not d1 1
+inf oper 1
+inf rieur 1
+inf.ethz.ch 1
+inf.html 1
+inf.ps 1
+inf.puc 1
+inf.puc ri.br 1
+inf2.html 1
+inf5 1
+inf5 propag 1
+infam 1
+infam styl 1
+infer 32
+infer a grammar 1
+infer a srin 1
+infer a ssm 1
+infer an assm 1
+infer an improv 1
+infer an ssm 1
+infer and axiom 1
+infer and complec 1
+infer and find 1
+infer and finitest 1
+infer and langu 1
+infer and search 1
+infer and theor 1
+infer and tim 1
+infer and typ 1
+infer ar val 1
+infer ar valu 1
+infer as giv 1
+infer ba 2
+infer benchmark 1
+infer benchmark forml 1
+infer by autom 1
+infer by program 1
+infer co 1
+infer co proc 1
+infer crunch 1
+infer crunch mach 1
+infer dimac 1
+infer dimac benchmark 1
+infer do mak 1
+infer ec 1
+infer edg 2
+infer eng 1
+infer for ml 1
+infer for record 1
+infer for simpl 1
+infer forml 1
+infer from funct 1
+infer from iter 1
+infer from non 1
+infer from segm 1
+infer further 1
+infer further assum 1
+infer giv 1
+infer grammar 1
+infer implem 1
+infer implem typ 1
+infer in prolog 1
+infer initk 1
+infer is imp 1
+infer is saf 1
+infer it correct 1
+infer larger 1
+infer larger ssm 1
+infer lec 1
+infer lec categor 1
+infer mach 2
+infer mechan 1
+infer method 2
+infer method drast 1
+infer method heur 1
+infer need further 1
+infer of finit 1
+infer of form 1
+infer of log 1
+infer of polymorph 1
+infer of regl 1
+infer on belief 1
+infer on satisf 1
+infer problem 3
+infer proc 3
+infer proc follow 1
+infer pursu 1
+infer r1 1
+infer rl 4
+infer rl system 1
+infer simil 1
+infer ssm 1
+infer step 2
+infer step giv 1
+infer step match 1
+infer step perform 1
+infer structur 2
+infer structur rel 1
+infer support 1
+infer synchron 1
+infer synchron sequ 1
+infer system 2
+infer tag 1
+infer tag mov 1
+infer task 1
+infer techniqu 1
+infer th assm 1
+infer th ec 1
+infer th gener 1
+infer th nec 1
+infer th particip 1
+infer th st 1
+infer th structur 1
+infer th typ 2
+infer using 1
+infer using gib 1
+infer valu 1
+inferior 4
+inferior in textur 1
+inferior to purer 1
+inferior to uniform 1
+inff 1
+infg 1
+infin 2
+infinit 25
+infinit amount 1
+infinit behaviour 1
+infinit bin 1
+infinit bin string 1
+infinit cart 1
+infinit cart produc 1
+infinit chain 1
+infinit character 1
+infinit character sequ 1
+infinit comput 1
+infinit den 1
+infinit desc 1
+infinit desc sequ 1
+infinit dim 1
+infinit dist 1
+infinit div 1
+infinit domain 1
+infinit domain.2 1
+infinit fast 1
+infinit fast computer 1
+infinit flavor 1
+infinit forml 1
+infinit graph 1
+infinit hierarch 2
+infinit hierarch order 1
+infinit iter 1
+infinit lif 1
+infinit lif span 1
+infinit long forml 1
+infinit look 1
+infinit look ahead 1
+infinit lookahead 1
+infinit lookahead tool 1
+infinit loop 2
+infinit man ai 1
+infinit man funct 1
+infinit man input 1
+infinit man step 1
+infinit memor 1
+infinit memor renam 1
+infinit number 4
+infinit or finit 1
+infinit plan 1
+infinit proc 1
+infinit qu 1
+infinit qu answer 1
+infinit reduc 1
+infinit reduc begin 1
+infinit register 1
+infinit register renam 1
+infinit renam 1
+infinit se 2
+infinit sequ 3
+infinit sequ n1 1
+infinit ser 1
+infinit st 1
+infinit st mach 1
+infinit stream 1
+infinit sup 1
+infinit tail 1
+infinit tail con 1
+infinit tempor 1
+infinit tempor dat 1
+infinit tr 1
+infinitesim 2
+infinitesim in diameter 1
+infinitesim smal pack 1
+infl 3
+infl datalog 1
+infl neg 1
+infl sem 1
+infl th parallel 1
+infl th serv 1
+influ 27
+influ by empir 1
+influ by featur 1
+influ by pol 1
+influ datab 1
+influ datab qu 1
+influ de 2
+influ de la 1
+influ de lind 1
+influ de lordonnanc 1
+influ du 2
+influ du co 1
+influ du mat 1
+influ extern 1
+influ featur 1
+influ n egativ 1
+influ of coh 1
+influ of commun 1
+influ of dat 1
+influ of fal 1
+influ of individu 1
+influ of med 1
+influ of overlap 1
+influ of prev 1
+influ on eff 1
+influ payoff 1
+influ payoff gener 1
+influ respectiv 1
+influ respectiv de 1
+influ sur 1
+influ sur lampleur 1
+influ sur le 1
+influ th approach 1
+influ th aver 1
+influ th context 1
+influ th del 1
+influ th design 1
+influ th en 1
+influ th environm 1
+influ th learn 1
+influ th loc 1
+influ th microarchitectur 1
+influ th over 1
+influ th predict 1
+influ th problem 1
+influ th solut 1
+influ th st 1
+influ th succ 1
+influ v4 1
+influ variabl 1
+influ variabl v1 1
+influ variabl v3 1
+influenc 3
+influenc e la 1
+influenc e par 2
+influenc ee 1
+influenc ee par 1
+influencer 2
+influencer consid 1
+influencer consid erabl 1
+influencer le 1
+influencer le perform 1
+influencer lefficacit 1
+influencerait 1
+influencerait la 1
+influencerait la valeur 1
+influer 1
+influer sur 1
+influer sur le 1
+infocom 4
+infoflec 1
+infoflec in design 1
+infoflec project 1
+inform 117
+inform a high 1
+inform a workload 1
+inform about anim 1
+inform about eulisp 1
+inform about inform 1
+inform about membership 1
+inform about object 1
+inform about resourc 1
+inform about st 1
+inform about start 1
+inform about strong 1
+inform about task 1
+inform acc 1
+inform acc restrict 1
+inform administer 1
+inform administer rol 1
+inform ag 1
+inform ahead 1
+inform algorithm 1
+inform algorithm describ 1
+inform algorithm gener 1
+inform allow 1
+inform alread ec 1
+inform among scient 1
+inform and annot 1
+inform and attempt 1
+inform and commun 1
+inform and comput 4
+inform and computer 1
+inform and control 8
+inform and indep 1
+inform and knowledg 2
+inform and learn 1
+inform and mak 1
+inform and merg 1
+inform and po 1
+inform and softwar 1
+inform and tak 1
+inform and test 1
+inform ar client 1
+inform ar incorpor 1
+inform ar said 1
+inform ar var 1
+inform as op 1
+inform as slav 1
+inform assoc 3
+inform at 2
+inform author 1
+inform avail 4
+inform becom 2
+inform becom avail 1
+inform befor ch 1
+inform being collect 1
+inform between test 1
+inform by integr 1
+inform by pol 1
+inform by repr 1
+inform by using 1
+inform can actu 1
+inform com 1
+inform comparison 1
+inform concern 1
+inform concern le 1
+inform consumer 1
+inform cont 2
+inform contain 3
+inform control 1
+inform conv 1
+inform criter 1
+inform dan 1
+inform de 1
+inform de continu 1
+inform de retour 1
+inform de typ 1
+inform defin 1
+inform dep 1
+inform describ 2
+inform determin 1
+inform dincertitud 1
+inform dispon 1
+inform dissem 1
+inform dissem mechan 1
+inform each member 1
+inform en 1
+inform en ce 1
+inform esp 1
+inform esp ranc 1
+inform essentiel 1
+inform essentiel comp 1
+inform exchang 1
+inform explan 1
+inform explicit 1
+inform extract 2
+inform facult 2
+inform fil 2
+inform filter 1
+inform flow 2
+inform flow an 1
+inform flow pol 1
+inform for assignm 1
+inform for high 1
+inform for spec 1
+inform for word 1
+inform gather 1
+inform giv 1
+inform glean 1
+inform glob 1
+inform handl 1
+inform hid 3
+inform if requir 1
+inform in appl 1
+inform in block 1
+inform in dynam 1
+inform in hid 1
+inform in id 1
+inform in keep 1
+inform in sect 1
+inform in shar 1
+inform in tabl 2
+inform in uid 1
+inform in wid 1
+inform introduc 1
+inform is accompl 1
+inform is avail 3
+inform is broadcast 1
+inform is dep 1
+inform is dissemin 1
+inform is emb 1
+inform is govern 1
+inform is grant 1
+inform is indeed 1
+inform is kept 1
+inform is known 1
+inform is loc 1
+inform is lost 1
+inform is mad 1
+inform is propag 1
+inform is read 2
+inform is receiv 1
+inform is relev 1
+inform is requir 1
+inform is st 2
+inform is writ 1
+inform it contain 1
+inform it hold 1
+inform it prev 1
+inform it sibl 1
+inform item 1
+inform item posit 1
+inform learn 1
+inform learn sect 1
+inform loc 1
+inform ma 1
+inform ma en 1
+inform manag 1
+inform manag system 1
+inform mean 1
+inform measur 1
+inform measur usl.128 1
+inform mor eff 1
+inform motiv 1
+inform n ecessair 1
+inform nec 2
+inform neighbor 1
+inform neighbor nod 1
+inform nest 1
+inform nest pa 1
+inform not rel 1
+inform observ 1
+inform occur 1
+inform of prev 1
+inform on correspon 1
+inform on evolut 1
+inform on load 1
+inform on om 1
+inform on v1 1
+inform or interest 1
+inform pa 1
+inform period 1
+inform period using 1
+inform pertain 3
+inform peut 1
+inform peut facil 1
+inform pr 1
+inform proc 20
+inform proc appl 1
+inform proc capabil 1
+inform proc letter 9
+inform proc system 3
+inform proc task 1
+inform procedur 1
+inform procedur construc 1
+inform prof 1
+inform proof 1
+inform provider 1
+inform qu 1
+inform qu vont 1
+inform regard 3
+inform regard om 1
+inform rel 3
+inform relev 1
+inform requir 2
+inform resourc 1
+inform resourc avail 1
+inform retrief 5
+inform retrief ba 1
+inform retrief facil 1
+inform retrief research 1
+inform retrief system 1
+inform rev 1
+inform sc 21
+inform sc institut 1
+inform sc oh 2
+inform se 2
+inform sem 1
+inform sen 1
+inform server 1
+inform server concept 1
+inform shar 1
+inform specif. 1
+inform st 2
+inform stanford 1
+inform sur 2
+inform sur le 1
+inform sur linstanc 1
+inform syntac 1
+inform syntac definit 1
+inform system 15
+inform system developm 1
+inform system vol 1
+inform system vol.13 1
+inform technolog 12
+inform technolog artif 1
+inform technolog direct 1
+inform technolog griffith 1
+inform technolog interfac 1
+inform technolog labor 3
+inform technolog nat 1
+inform tel 1
+inform test 1
+inform test historytestsonedg 1
+inform th client 1
+inform th mean 1
+inform th modl 1
+inform th parent 1
+inform th sender 1
+inform th system 1
+inform than mer 1
+inform that cover 1
+inform that help 1
+inform that valu 1
+inform theor 9
+inform theor consider 1
+inform through integr 1
+inform through propag 1
+inform through soft 1
+inform thus 1
+inform thus gather 1
+inform tic 1
+inform to acc 1
+inform to claim 1
+inform to commun 1
+inform to edg 1
+inform to effect 1
+inform to html 1
+inform to intellig 1
+inform to mak 2
+inform to perform 1
+inform to prov 1
+inform to reconstruc 1
+inform to select 1
+inform to show 1
+inform to solut 1
+inform to tak 1
+inform transm 1
+inform typ 1
+inform typ inclus 1
+inform univer 1
+inform us 1
+inform vi rol 1
+inform vicin 1
+inform visu 1
+inform visu tool 1
+inform when init 1
+inform when inst 1
+inform window 1
+inform window open 1
+inform y autom 1
+inform. 1
+informat 2
+informat mekelweg 1
+informatik 9
+informatik bericht 1
+informatik der 1
+informatik der universit 1
+informatik ii 1
+informatik spektr 1
+informatik und 1
+informatik und technik 1
+informatik.tu 1
+informatik.tu muench.de 1
+informatik.un 2
+informatik.un erlang.de 1
+informatik.un kiel.dbp.de 1
+informatiqu 11
+informatiqu cnam 1
+informatiqu de 1
+informatiqu de prot 1
+informatiqu et automatiqu 2
+informatiqu et commun 2
+informatiqu et en 4
+informatiqu et syst 1
+informatiqu le 1
+informatiqu le don 1
+informatiqu pour 1
+informatiqu pour la 1
+informatiqu qu 1
+informatiqu qu perm 1
+informatiqu th 1
+informatiqu th eoriqu 1
+informatyk 1
+informatyk teoretycznej 1
+informel 1
+informel d ecrit 1
+infotbl 1
+infr 1
+infr structur 1
+infr structur facil 1
+infrastructur 5
+infrastructur for tempor 1
+infrastructur prop 1
+infrastructur support 1
+infrastructur to transport 1
+infrequ 6
+infrequ burst 1
+infrequ or environm 1
+inftj2t 1
+ing 5
+ing method 1
+ing structur 1
+ing0 1
+ingr 3
+ingr constitut 1
+ingrid 1
+ingrid agr 1
+ingrid bring 1
+ingrid evalu 1
+ingrid highlight 1
+ingrid johnson 1
+ingrid pl 1
+ingrid ring 1
+ingrid s cur 1
+ingrid s interfac 1
+ingrid us 1
+inh 26
+inh adv 1
+inh concur 1
+inh connect 1
+inh decl 1
+inh dynam 2
+inh dynam character 1
+inh dynam natur 1
+inh erent 3
+inh erent aux 1
+inh erent dan 1
+inh error 1
+inh fin 1
+inh fin grain 1
+inh fuzz 1
+inh in act 1
+inh in log 2
+inh in prim 1
+inh in tempor 1
+inh initarg 1
+inh interpr 1
+inh interpr possibil 1
+inh larg number 1
+inh lat 1
+inh lim 1
+inh lin 1
+inh lin proc 1
+inh mor us 1
+inh non 1
+inh non determ 1
+inh object 1
+inh object or 1
+inh order 1
+inh proper 1
+inh sd 1
+inh sd slot 1
+inh sequ 1
+inh ser 1
+inh ser algorithm 1
+inh spacepartit 1
+inh spacepartit proper 1
+inh structur 1
+inh structur rel 1
+inh to asser 1
+inh. 1
+inhabit 1
+inhabit by term 1
+inhabit s1 1
+inhabit s2 1
+inherit 16
+inherit a big 1
+inherit a trojan 1
+inherit adv 1
+inherit adv disadv 1
+inherit allow 1
+inherit an issu 1
+inherit and dynam 1
+inherit and inappropr 1
+inherit and repetit 1
+inherit and subtyp 1
+inherit and synchron 1
+inherit as deep 1
+inherit as describ 1
+inherit as implicit 1
+inherit aspect 1
+inherit assum 1
+inherit attribut 2
+inherit by ment 1
+inherit by union 1
+inherit can caus 1
+inherit can compl 1
+inherit can mak 1
+inherit can spread 1
+inherit capabil 1
+inherit caus 1
+inherit caus difficult 1
+inherit cl 4
+inherit cl hierarch 1
+inherit com 2
+inherit compl 1
+inherit compl thing 1
+inherit comput 1
+inherit depth 1
+inherit edg 1
+inherit encour 1
+inherit encour good 1
+inherit ensur 1
+inherit ensur interchang 1
+inherit facil 1
+inherit for complec 1
+inherit from ec 1
+inherit g multipl 1
+inherit good 1
+inherit graph 1
+inherit ha ec 1
+inherit had benefit 1
+inherit help 1
+inherit hierarch 4
+inherit in object 1
+inherit inform 1
+inherit initarg 1
+inherit initarg cl 1
+inherit introduc 1
+inherit is deep 1
+inherit is design 1
+inherit is inappropr 1
+inherit isnt worth 1
+inherit it took 1
+inherit j trac 1
+inherit lead 1
+inherit lead prev 1
+inherit m lo 1
+inherit mak 1
+inherit mak understand 1
+inherit map 1
+inherit mechan 2
+inherit member 1
+inherit member funct 1
+inherit member variabl 1
+inherit nam 1
+inherit of slot 1
+inherit of synchron 1
+inherit or mixin 1
+inherit prov 1
+inherit rel 1
+inherit rl 1
+inherit should aid 1
+inherit simplif 1
+inherit simplif thing 1
+inherit slot 1
+inherit slot descript 1
+inherit strateg 1
+inherit strateg defin 1
+inherit structur 1
+inherit th ba 1
+inherit th behavior 1
+inherit th initarg 1
+inherit th initform 1
+inherit th interfac 1
+inherit th non 1
+inherit th parameter 1
+inherit their tag 1
+inherit to impl 1
+inherit tr 2
+inherit us 1
+inherit versus multipl 1
+inherit vi intersect 1
+inherit wa disc 1
+inherit wh 1
+inhibit 2
+inhibit between dec 1
+inhibit effect 1
+inhibit profil 1
+inhibitbiasedclimb 1
+inhibiteur 1
+inhibiteur de 1
+inhibiteur de la 1
+inhom 2
+inhom collect 1
+inhom collect center 1
+inidividu 1
+ininternet 2
+ininternet number 2
+ininternet number ofinternetchannel 2
+init 92
+init a cl 1
+init a connect 1
+init a ct 1
+init a direct 1
+init a master 1
+init a se 1
+init a separ 1
+init a shift 1
+init a slot 1
+init abort 1
+init accord 1
+init adm 1
+init adm un 1
+init afin 1
+init afin qu 1
+init after system 1
+init al iter 1
+init aleatoir 1
+init aleatoir popl 1
+init algebr 1
+init algorithm 1
+init algorithm loc 1
+init allou 1
+init allou ee 1
+init an intern 1
+init an iter 1
+init ancestr 1
+init ancestr list 1
+init and client 1
+init and control 1
+init and extern 1
+init and inherit 1
+init and modif 1
+init and receiver 1
+init and surnam 1
+init and termin 2
+init and tun 1
+init and upd 1
+init appropr 1
+init appropr transit 1
+init ar pr 1
+init arbitrair 1
+init arbitrair x1 1
+init argum 1
+init as follow 1
+init assum 1
+init at random 1
+init au 1
+init au processeur 1
+init avec 1
+init avec lalgorithm 1
+init b tr 1
+init back propag 1
+init be se 1
+init benchmark 1
+init bi 1
+init boot 1
+init bp 1
+init broadcast 1
+init by defin 1
+init by evalu 1
+init cal 1
+init cal structur 1
+init caract 1
+init caract er 1
+init cel 1
+init cel definit 1
+init centr 1
+init certain st 1
+init cl 1
+init cl hierarch 1
+init cluster 1
+init cluster centr 1
+init cluster valu 1
+init cod 1
+init command 1
+init condit 2
+init condit cl 1
+init configur 4
+init consider 1
+init consom 1
+init construc 1
+init cont 1
+init contain 1
+init cost 1
+init ct 1
+init currnod 1
+init cut 1
+init cycliqu 1
+init cycliqu de 1
+init d efin 1
+init d efinir 1
+init d1 1
+init dan 1
+init dan la 1
+init danish 1
+init danish ver 1
+init dat 2
+init dat distribut 1
+init dat filesm 1
+init dat layout 1
+init de 2
+init de ce 1
+init de don 1
+init de la 2
+init de pag 1
+init de tak 1
+init de term 1
+init descript 1
+init design 1
+init dic 1
+init dic ecut 1
+init differ 1
+init disadv 1
+init disadv du 1
+init disk 1
+init disk ar 1
+init distribut 1
+init du 4
+init du tableau 1
+init du vecteur 1
+init dun 1
+init dun pag 1
+init dunif 1
+init dur 1
+init dur tout 1
+init e dan 1
+init e de 1
+init ee 1
+init ee avant 1
+init elim 1
+init emb 1
+init emb dim 1
+init emb vect 1
+init empir 1
+init empir stud 1
+init empt 5
+init empt output 1
+init empt valu 1
+init en 1
+init en aut 1
+init en vu 1
+init enabl 1
+init enabl proc 1
+init encod 1
+init entr 1
+init entr deux 1
+init equip 1
+init es 1
+init es par 1
+init est 2
+init est tr 1
+init estim 2
+init et qu 1
+init ev cycl 1
+init ev ver 1
+init evaluer 1
+init evaluer xc 1
+init evid 1
+init evid gather 1
+init exact 1
+init exact pot 1
+init experim 2
+init experim suggest 1
+init explor 1
+init explor stud 1
+init expr 1
+init expr finish 1
+init fact 1
+init fact structur 1
+init fin 1
+init fin init 1
+init fin sum 1
+init first ph 1
+init form 1
+init forml 1
+init from init 1
+init funct 1
+init funct appl 1
+init funct fn 1
+init gener 3
+init gener funct 1
+init gener test 2
+init ghost 1
+init ghost list 1
+init giv 1
+init giv goal 1
+init goal 5
+init gu 1
+init gu decr 1
+init ha siz 1
+init heur 1
+init heur signif 1
+init high 1
+init high random 1
+init incon 1
+init incon st 1
+init incr 1
+init inst 2
+init interview 1
+init introduc 1
+init investm 1
+init invoc 1
+init is docum 1
+init is requir 1
+init it dat 1
+init known 1
+init koan 1
+init la 1
+init la forml 1
+init la list 1
+init la prem 1
+init lalgorithm 1
+init lalgorithm de 1
+init last disk 1
+init lastnod 1
+init le 1
+init le inform 1
+init le motorol 1
+init le prem 1
+init learn 1
+init learn rat 1
+init libr 1
+init link 1
+init link connect 1
+init loc 1
+init loc ancestr 1
+init lock 1
+init look 1
+init ma 1
+init ma de 1
+init map 1
+init map algorithm 1
+init me 1
+init me contain 1
+init menu 1
+init mesh 1
+init method 2
+init min 1
+init min modl 1
+init model 1
+init moment 1
+init multipl 1
+init multipl register 1
+init na 1
+init na donc 1
+init ne 1
+init ne guid 1
+init nest 2
+init nest pa 2
+init network 1
+init non 1
+init non termin 1
+init object 1
+init of babel 1
+init of cluster 1
+init of multipl 1
+init oper 1
+init oper appl 1
+init opt 1
+init opt inclus 1
+init order 2
+init order depth 1
+init par 1
+init par ph 1
+init partag 1
+init partag es 1
+init partit 2
+init partit algorithm 1
+init partit ph 1
+init partit tim 1
+init permut 1
+init ph 2
+init pixel 1
+init plac 2
+init popl 1
+init pot 1
+init pour 1
+init pour le 1
+init pr 2
+init pr esent 1
+init prior 1
+init probabil 1
+init proc 1
+init proc se 1
+init program 1
+init program langu 1
+init prop 1
+init prop ee 1
+init protocol 2
+init protocol rel 1
+init protocol requir 1
+init prototyp2 1
+init q0 2
+init qi 1
+init qu 1
+init qu de 1
+init random 2
+init random hyperplan 1
+init random popl 1
+init rat 1
+init receiv 1
+init register 1
+init rel 1
+init rel multicast 1
+init request 1
+init resp 1
+init result 1
+init run 1
+init san quil 1
+init schedl 2
+init schedl produc 1
+init schedl using 1
+init schem 1
+init schem implicit 1
+init se 2
+init se contain 1
+init seed 2
+init seed valu 2
+init sen 1
+init sender 1
+init sequ 1
+init sit 1
+init sit propag 1
+init sit start 1
+init situ 1
+init situ shown 1
+init slot 1
+init slot valu 1
+init soit 1
+init solut 1
+init solut point 1
+init sont 3
+init sont collect 1
+init sont construit 1
+init sont le 1
+init sort 1
+init specif 2
+init spread 1
+init st 12
+init st correspon 1
+init st sleep 1
+init st var 1
+init st vect 1
+init st1 1
+init stack 1
+init start 1
+init start point 1
+init stat 1
+init step 1
+init strateg 1
+init strateg develop 1
+init stud 1
+init subgraph 1
+init subgraph connect 1
+init subgraph detail 1
+init subgraph g0 1
+init succ 1
+init sug 1
+init sug er 1
+init supergraph 1
+init sur 1
+init sur le 1
+init techniqu 1
+init temper 1
+init th act 1
+init th bar 1
+init th cluster 1
+init th command 1
+init th correspon 1
+init th dat 1
+init th developer 1
+init th diameter 1
+init th em 1
+init th goal 1
+init th matr 1
+init th menu 1
+init th neutr 1
+init th object 1
+init th pot 1
+init th system 1
+init th top 1
+init that ca 1
+init tim 2
+init tim sav 1
+init tl 1
+init tl tabl 1
+init to match 1
+init to nl 1
+init to resum 1
+init to valu 1
+init to zer 1
+init topolog 1
+init trait 2
+init trait es 1
+init transact 1
+init transform 1
+init transform ee 1
+init truth 1
+init tsp 1
+init tsp tsq 1
+init tw point 1
+init un 1
+init un var 1
+init unfamil 1
+init uniqu 1
+init uniqu accessibl 1
+init unknown 1
+init upd 1
+init upd upd 1
+init valeus 1
+init valu 13
+init valu guar 1
+init valu random 1
+init vect 1
+init vect q1 1
+init vot 1
+init we comput 1
+init weight 2
+init with inform 1
+init with maxim 1
+init with zer 1
+init x0 1
+init xc 1
+init xc solut 1
+init xo 1
+init xp 1
+init xp yp 1
+init0 1
+init0 init1 1
+init0 init1 pasc 1
+init0 init1 prior1 1
+init0 init1 rest0 1
+init0 init1 rest1 1
+init0 pasc 1
+init0 prior0 1
+init0 prior0 init1 1
+init0 rest0 1
+init0 rest0 init1 1
+init0 rest1 1
+init0 rest1 pasc 1
+init1 2
+init1 me 1
+init1 me reach 1
+init1 pasc 1
+init1 prior0 1
+init1 prior0 pasc 1
+init1 prior1 1
+init1 prior1 pasc 1
+init1 prior1 x0 1
+init1 rest0 1
+init1 rest0 pasc 1
+init1 rest0 prior1 1
+init1 rest1 1
+init1 rest1 pasc 1
+init2 1
+init2 me 1
+initarg 1
+initarg a valu 1
+initarg and cal 1
+initarg ar inherit 1
+initarg ar leg 1
+initarg cl 1
+initarg cl direct 1
+initarg cl inst 1
+initarg cl opt 1
+initarg comput 1
+initarg identif 1
+initarg inclus 1
+initarg inh 1
+initarg inh initarg 1
+initarg initarg 1
+initarg initarg nam 1
+initarg is defin 1
+initarg is giv 1
+initarg is opt 1
+initarg is requir 1
+initarg list 1
+initarg n valu 1
+initarg nam 1
+initarg slot 1
+initarg slot opt 1
+initarg wh nam 1
+initarg which return 1
+initform 1
+initform ar cl 1
+initform decl 1
+initform form 1
+initform slot 1
+initform slot opt 1
+initfunct 1
+initfunct captur 1
+initfunct reader 1
+initfunct reader writer 1
+initfunct slot 1
+initfunct slot descript 1
+initialiser 1
+initialiser hor 1
+initialiser hor de 1
+initializ 6
+initializ a pag 1
+initializ an assoc 1
+initializ an object 1
+initializ th pot 1
+initializ th slot 1
+initializ th top 1
+initializ variabl 1
+initialmodel 1
+initialmodel adm 1
+initialschedl 1
+initiaux 1
+initiaux de 1
+initiaux de man 1
+initiaux nest 1
+initiaux nest pa 1
+initk 1
+initk priork 1
+initk refer 1
+initk restk 1
+initl 1
+initl as argum 1
+initl is ignor 1
+initl to mark 1
+initn 1
+initn wh 1
+initopt 1
+initopt ar specif 1
+inject 11
+inject 2tn 1
+inject a me 1
+inject bandwidth 2
+inject bandwidth bi 1
+inject bandwidth offer 1
+inject const 1
+inject entr 1
+inject entr le 1
+inject error 1
+inject et donc 1
+inject fault 1
+inject of me 1
+inject on unit 1
+inject or rec 1
+inject rat 1
+inject tn 1
+ink 2
+ink alphab 1
+ink alphab using 1
+ink cur 1
+ink cur ts 1
+ink datab 1
+ink match 1
+inl 4
+inl arithm 1
+inl arithm wh 1
+inl cod 2
+inl th oper 1
+inlin 2
+inlin and spec 1
+inm 1
+inm lim 1
+inner 11
+inner and top 1
+inner control 1
+inner control loop 1
+inner dynam 1
+inner dynam bind 1
+inner dynam environm 1
+inner if expr 1
+inner induc 1
+inner j loop 1
+inner lec 1
+inner lec bind 1
+inner lec environm 1
+inner loop 4
+inner nod 1
+inner produc 3
+inner reg 1
+inner subderiv 1
+innerm 1
+innerm red 1
+innermost 3
+innermost babel 1
+innermost graph 1
+innermost graph narrow 1
+innermost graphnarrow 1
+innermost graphnarrow mach 1
+innermost loop 1
+innermost mean 1
+innermost narrow 1
+innermost narrow sem 1
+innermost red 1
+innermost seq 1
+innermost seq construc 1
+innermost strateg 1
+innermost subexpr 1
+innermost ver 1
+innov 6
+innov educ 1
+innov educ us 1
+innov impl 1
+innov impl aspect 1
+innov rel 1
+innov rel an 1
+innov to mark 1
+innov with zer 1
+inom 1
+inom is reach 1
+inon 1
+inonit 1
+inonit simaux 1
+inop 1
+inop erant 1
+inop erant lorsqu 1
+inord 1
+inord tim 1
+inorder 1
+inorder number 1
+inorder traver 1
+inorder traver number 1
+inordin 1
+inordin difficult 1
+inout 1
+inpat 1
+inpr1 1
+input 66
+input a se 1
+input a sent 1
+input act 1
+input addr 1
+input addr xor 1
+input alphab 2
+input and giv 1
+input and output 16
+input and produc 1
+input and read 1
+input and recognit 1
+input and targ 1
+input appl 1
+input ar 1
+input ar refer 1
+input arc 1
+input assoc 1
+input at proc 1
+input at ti 1
+input attribut 1
+input bandwidth 1
+input bandwidth mb 1
+input bit 2
+input buffer 1
+input buffer ba 1
+input buffer compl 1
+input buffer fil 1
+input buffer implem 1
+input burst 1
+input by input 1
+input by spec 1
+input ca 1
+input ca list 1
+input cel 1
+input cel fa 1
+input chang 1
+input closer 1
+input com 1
+input con 4
+input concept 1
+input conv 1
+input conv inform 1
+input creat 1
+input d2 1
+input d2 instead 1
+input dat 8
+input dat con 1
+input dat se 1
+input dat vect 1
+input datab 1
+input datab r1 1
+input datab rel 1
+input deem 1
+input dev 1
+input distribut 1
+input docum 1
+input docum sourc 1
+input edg 1
+input edg vin 1
+input el 1
+input evalu 1
+input featur 1
+input featur vect 1
+input fft 1
+input fft digraph 1
+input field 3
+input fif 1
+input fif ba 1
+input fif contain 1
+input fif deliver 1
+input fif repl 1
+input fil 2
+input filter 1
+input filter system 1
+input foc 1
+input form 1
+input format 1
+input forml 2
+input from shunt 1
+input gener 2
+input gener datab 1
+input gener edb 1
+input gener rel 1
+input graph 2
+input graph g0 1
+input graph void 1
+input imag 3
+input imag block 1
+input imag s02 1
+input imag sampl 1
+input integer 1
+input integer subtract 1
+input is ech 1
+input is elimin 1
+input is ev 1
+input is giv 1
+input it ge 1
+input key 1
+input key performanceassessm 1
+input kybd 1
+input langu 1
+input layer 1
+input length 2
+input length jf 1
+input lin 1
+input list 1
+input load 1
+input look 1
+input m0 1
+input may chang 1
+input may occur 1
+input me 1
+input memor 1
+input memor order 1
+input memor tap 1
+input mod 1
+input model 1
+input natur 1
+input natur number 1
+input nod 2
+input nod act 1
+input nod ni 1
+input occur 1
+input of dupl 1
+input of eval 1
+input of step 1
+input operand 1
+input or ouput 1
+input or output 1
+input order 1
+input output 12
+input output behavior 1
+input output complec 1
+input output oper 2
+input output pair 1
+input output port 2
+input output primitiv 1
+input output rel 1
+input output system 1
+input output variabl 1
+input pa. 1
+input parameter 3
+input parameter gener 1
+input parameter inclus 1
+input parameter valu 1
+input pattern 2
+input pattern spac 1
+input pattern wonder 1
+input pe 1
+input permut 1
+input permut network 1
+input polygon 1
+input port 2
+input port du 1
+input port fif 1
+input port writ 1
+input posit 1
+input program 1
+input quest 1
+input queu 2
+input queu model 1
+input r0 1
+input registerstart 1
+input registerstart programstart 1
+input rel 1
+input repr 1
+input requir 1
+input respect 1
+input run 1
+input se 2
+input sent 2
+input sent length 1
+input sequ 1
+input shown 1
+input shunt 1
+input sign 2
+input sign imag 1
+input sign repr 1
+input sit 1
+input siz 7
+input spac 2
+input spac handl 1
+input specif 1
+input specif follow 1
+input stack 1
+input stack valu 1
+input string 2
+input susp 1
+input symbol 1
+input symbol appl 1
+input tap 2
+input termin 1
+input textur 1
+input textur key 1
+input th graph 1
+input th input 1
+input th pixel 1
+input th se 1
+input that giv 1
+input that match 1
+input tim 2
+input tim del 1
+input to addr 1
+input to classif 1
+input to definit 1
+input to nod 1
+input to output 1
+input to program 1
+input to rl 1
+input to shunt 1
+input tok 2
+input tok tim 1
+input traff 1
+input traff model 1
+input ttl 1
+input ttl frequ 1
+input tw number 1
+input unit 1
+input unrestrict 1
+input unrestrict rel 1
+input using 1
+input valu 6
+input valu using 1
+input var 2
+input var infrequ 1
+input variabl 3
+input vect 4
+input vect h3 1
+input ver 1
+input wer corrupt 1
+input widg 1
+input window 1
+input x dec 1
+input x x1 1
+input x62l 1
+input xi 1
+input zer 1
+inputendg 1
+inputmemor 1
+inputmemor and output 1
+inputstart 1
+inputstart i inputendg 1
+inputstart input 1
+inputstart input registerstart 1
+inputtargetoutput 1
+inputtargetoutput input 1
+inputtargetoutput input key 1
+inputtest 1
+inputtest edg 1
+inputtest edg traver 1
+inqu 1
+inqu etud 1
+inquir 2
+inquir a spher 1
+inr 15
+inr en 1
+inr grant 1
+inr grant int 1
+inr ir 1
+inr lorrain 1
+inr lorrain ac 1
+inr lorrain stac93.ps.z 1
+inr nff1678 1
+inr research 1
+inr research report 1
+inr rocquencourt 3
+inr rocquencourt rapport 1
+inr soph 1
+inr soph antipol 1
+inr sophiaantipol 2
+inr support 1
+inr support work 1
+insensit 5
+insensit to arriv 1
+insensit to traff 1
+insepar 1
+inser 33
+inser 2d 1
+inser a loc 1
+inser a pseud 1
+inser a test 1
+inser a third 1
+inser a tot 1
+inser a valu 1
+inser acc 1
+inser addit 1
+inser addit prior 1
+inser algorithm 1
+inser algorithm extr 1
+inser an el 1
+inser and 8d 1
+inser and abstract 1
+inser and character 1
+inser and del 6
+inser and deletemin 1
+inser and refin 1
+inser and split 1
+inser ar mad 1
+inser begin 1
+inser br 1
+inser cach 1
+inser cach inv 1
+inser can guar 1
+inser caus 1
+inser del 1
+inser del upd 1
+inser deletemin 1
+inser deletemin cal 1
+inser el 1
+inser first search 1
+inser hff 1
+inser in list 1
+inser in transact 1
+inser inser 1
+inser int avg 1
+inser int g0 1
+inser int p1s 1
+inser int q0 1
+inser int se 1
+inser is ad 1
+inser le 1
+inser me 1
+inser n el 1
+inser new point 1
+inser obtain 1
+inser of me 1
+inser on pe 1
+inser oper 3
+inser oper result 1
+inser oper work 1
+inser or del 2
+inser or deletemin 1
+inser pair 1
+inser plus del 1
+inser plus deletemin 1
+inser plus extract 1
+inser point 1
+inser prior 1
+inser prior bi 1
+inser prior knowledg 1
+inser pseud 1
+inser pseud nod 1
+inser q el 1
+inser receiv 1
+inser receiv el 1
+inser request 1
+inser rol 1
+inser rol elim 1
+inser s0 1
+inser sort 1
+inser succ 1
+inser th ad 1
+inser th event 1
+inser th item 1
+inser th key 1
+inser th n0 1
+inser th oper 1
+inser th pseud 1
+inser them explicit 1
+inser to backlog 1
+inser to fail 1
+inser tr 1
+inser ver 1
+inser wil instantan 1
+inser with prob 1
+inser would caus 1
+insider 1
+insider gmbh 1
+insight 18
+insight and adjustm 1
+insight com 1
+insight int other 1
+insight int regr 1
+insight int test 1
+insight int user 1
+insight int wh 1
+insight to domain 1
+insight we develop 1
+insignif 2
+insignif entr 1
+insignif for real 1
+insipid 1
+insipid hav mad 1
+insisteron 1
+insisteron sur 1
+insisteron sur limpact 1
+insofar 1
+insolit 1
+insolit qu 1
+insolit qu pour 1
+insolubl 1
+inspect 13
+inspect and control 1
+inspect and ea 1
+inspect and surv 1
+inspect behavior 1
+inspect ha near 1
+inspect of figur 1
+inspect of satur 1
+inspect th reason 1
+inspect th rl 1
+inspect th se 1
+inspir 12
+inspir by ph 1
+inspir e de 1
+inspir ee 2
+inspir ee direct 1
+inspir ee du 1
+inspir ee par 1
+inspir es 1
+inspir es direct 1
+inspir from waltz 1
+inspir graph 1
+inspir graph incorpor 1
+inspir much subsequ 1
+inst 80
+inst a commun 1
+inst a cop 1
+inst a custom 1
+inst a parameter 1
+inst a1 1
+inst a3 1
+inst a4 1
+inst account 1
+inst account cold 1
+inst account hot 1
+inst aij 1
+inst aij mean 1
+inst and behaviour 1
+inst and connect 2
+inst and control 1
+inst and correspon 1
+inst and de 1
+inst and goal 1
+inst and intern 1
+inst and renam 1
+inst and yield 1
+inst ar consider 1
+inst ar individu 1
+inst ar integer 1
+inst ar mad 1
+inst ar produc 1
+inst ar random 1
+inst ar remov 1
+inst ar sort 1
+inst ar treat 1
+inst as e1.i.j 1
+inst as shown 1
+inst automat 1
+inst automat construc 1
+inst aver 1
+inst aver del 1
+inst ba 2
+inst ba learn 1
+inst being remov 1
+inst belong 1
+inst by appropr 1
+inst by assoc 1
+inst by direct 1
+inst by using 1
+inst can interact 1
+inst can mak 1
+inst caus 1
+inst ch 1
+inst cl 1
+inst common 1
+inst commun 1
+inst contain 1
+inst cr 1
+inst cz 1
+inst dar 1
+inst de 3
+inst de ce 1
+inst de claus 1
+inst de cod 1
+inst de la 1
+inst de structur 1
+inst de term 1
+inst defin 1
+inst definit 1
+inst definit def 1
+inst del 1
+inst del shoot 1
+inst del vs 1
+inst don 1
+inst du 2
+inst du motif 1
+inst du point 1
+inst du term 1
+inst dun 1
+inst dun motif 1
+inst each me 1
+inst ensembl 1
+inst est 1
+inst est repr 1
+inst execut 1
+inst for reus 1
+inst for writ 1
+inst funct 1
+inst funct cal 1
+inst furthest 1
+inst gener 2
+inst gener phr 1
+inst gener task 1
+inst giv 2
+inst graph 1
+inst ha ns 1
+inst henc 1
+inst host 1
+inst i satisf 1
+inst i2 1
+inst i3 1
+inst id defin 1
+inst iec 1
+inst im 1
+inst in conform 1
+inst in determin 1
+inst in exampl 1
+inst in fig 1
+inst in inst 1
+inst in proport 1
+inst in tim 1
+inst init0 1
+inst init0 rest0 1
+inst int rl 1
+inst interact 1
+inst invoc 1
+inst is creat 1
+inst is cur 1
+inst is depict 1
+inst is difficult 1
+inst is exact 1
+inst is gener 1
+inst is giv 2
+inst is init 1
+inst is misclassif 1
+inst is reduc 1
+inst is remov 1
+inst is support 1
+inst is test 1
+inst is thus 1
+inst it gener 1
+inst list 1
+inst list neighbor 1
+inst mach 1
+inst match 1
+inst may cover 1
+inst me 1
+inst measur 1
+inst might becom 1
+inst misclassif 1
+inst mo 1
+inst must continu 1
+inst network 1
+inst network throughput 1
+inst norm 1
+inst norm serv 1
+inst object 1
+inst occur 1
+inst of abstract 2
+inst of cl 2
+inst of condit 1
+inst of degr 1
+inst of exact 1
+inst of funct 1
+inst of level 1
+inst of loc 1
+inst of lock 1
+inst of mlp 1
+inst of molog 1
+inst of object 1
+inst of parameter 1
+inst of partit 1
+inst of program 1
+inst of rel 1
+inst of relationship 1
+inst of squar 1
+inst of system11 1
+inst of tblh1 1
+inst of tblh2 1
+inst of thread 1
+inst of tim 1
+inst of transit 1
+inst of typ 1
+inst of univer 1
+inst of var 1
+inst of x5 1
+inst of xp 1
+inst on task 1
+inst oper 2
+inst order 1
+inst output 1
+inst output repr 1
+inst pair 1
+inst pair construc 1
+inst parallel 1
+inst param 1
+inst param brdcast 1
+inst param seq 1
+inst parameter 1
+inst parameter modl 1
+inst per cl 1
+inst perform 1
+inst perform measur 1
+inst pfp 1
+inst pfp act 1
+inst pot 1
+inst proper 1
+inst prun 1
+inst prun techniqu 1
+inst ra 1
+inst random 1
+inst rat 1
+inst rat proport 1
+inst rb 1
+inst reduc 1
+inst reduc issu 1
+inst reduc techniqu 1
+inst rel 1
+inst remain 1
+inst repl 1
+inst report 1
+inst repr 1
+inst respon 1
+inst respon tim 1
+inst result 1
+inst result produc 1
+inst retain 1
+inst rout 1
+inst rout load 1
+inst rs 1
+inst rs oper 1
+inst s1 1
+inst s2 1
+inst scenar 1
+inst se 1
+inst se reduc 1
+inst select 1
+inst separ 1
+inst serv 1
+inst serv rat 1
+inst short menu 1
+inst siz 1
+inst siz appl 1
+inst siz cl 1
+inst siz comput 1
+inst siz method 1
+inst solut 1
+inst solut problem 1
+inst som rel 1
+inst sometim caus 1
+inst st 2
+inst substitut 1
+inst t accord 1
+inst t1 1
+inst t1 r1 1
+inst tak 2
+inst technolog 1
+inst technolog cap 1
+inst term 1
+inst term rel 1
+inst th edg 1
+inst th event 1
+inst th fr 1
+inst th funct 1
+inst th pattern 1
+inst th templ 1
+inst th variabl 2
+inst than e0 1
+inst that separ 1
+inst throughput 1
+inst throughput vs 1
+inst thus 1
+inst thus describ 1
+inst to classif 1
+inst to def 1
+inst to ev 1
+inst to fl 1
+inst to inst 1
+inst to keep 1
+inst to remov 1
+inst to var 1
+inst unsign 1
+inst unsign int 1
+inst using 1
+inst util 1
+inst var 2
+inst var acc 1
+inst var lock 1
+inst var nam 1
+inst var valu 1
+inst variabl 2
+inst variabl g0 1
+inst ver 1
+inst visit 1
+inst wer classif 1
+inst wer order 1
+inst wer remov 1
+inst wh 1
+inst wh error 1
+inst when mak 1
+inst which record 1
+inst whil retain 1
+inst whil try 1
+inst wil typ 1
+inst with fan 1
+inst with known 1
+inst with renam 1
+inst would remain 1
+instanc 3
+instanc e dan 1
+instanc e de 1
+instanc e est 1
+instanc e requ 1
+instanc e standard 1
+instanc ee 2
+instanc ee dan 1
+instanc ee du 1
+instanc ee ne 1
+instanc es 1
+instanc le 1
+instanc le variabl 1
+instanceb 1
+instancedefinit 1
+instancedefinit fragmentdefinit 1
+instancereferenceloc 1
+instancereferenceloc referencelocalitydefinit 1
+instancereferenceloc referencelocalitydefinit instancereferenceloc 1
+instantan 5
+instantan acc 1
+instantan becom 1
+instantan becom vi 1
+instantan commun 1
+instantan ee 1
+instantan ee au 1
+instantan ee de 1
+instantan ee est 1
+instantan ee peut 1
+instantan either acc 1
+instantan either commun 1
+instat 1
+instat fr 1
+instat fr variabl 1
+instead 70
+instead absent 1
+instead absent du 1
+instead be abl 1
+instead comput 1
+instead defin 1
+instead dep 1
+instead forml 1
+instead gener 2
+instead gener tool 1
+instead ha ch 1
+instead of acc 1
+instead of adopt 1
+instead of ask 1
+instead of automat 1
+instead of bm 1
+instead of border 1
+instead of build 1
+instead of cal 1
+instead of calcl 1
+instead of ch 2
+instead of commun 1
+instead of d1 1
+instead of defin 1
+instead of describ 1
+instead of design 1
+instead of divid 1
+instead of enabl 1
+instead of exact 1
+instead of find 2
+instead of form 1
+instead of glob 1
+instead of gu 1
+instead of guar 1
+instead of hi 1
+instead of influ 1
+instead of inv 1
+instead of jump 1
+instead of match 1
+instead of mj 1
+instead of model 1
+instead of multiplec 1
+instead of nest 1
+instead of neur 1
+instead of optim 1
+instead of parallel 1
+instead of pr 1
+instead of proc 1
+instead of prov 1
+instead of random 1
+instead of reason 1
+instead of rectangl 1
+instead of recur 1
+instead of regl 1
+instead of replac 2
+instead of repr 1
+instead of rev 1
+instead of rl 1
+instead of select 1
+instead of simp 1
+instead of singl 1
+instead of ssn 1
+instead of st 1
+instead of stop 1
+instead of succ 1
+instead of sum 1
+instead of support 1
+instead of tempor 1
+instead of triangl 1
+instead of try 1
+instead of using 1
+instead of wind 1
+instead of writ 1
+instead of y1 1
+instead produc 1
+instead return 1
+instead seek 1
+instead ther ec 1
+instead us 1
+instead we us 1
+institut 50
+institut dal 1
+institut dal mol 1
+institut de 4
+institut de form 2
+institut de recherch 2
+institut f ur 4
+institut for adv 7
+institut for appl 2
+institut for artif 1
+institut for computer 2
+institut for electron 2
+institut for inform 2
+institut for numer 1
+institut for siml 1
+institut for softwar 1
+institut for system 1
+institut fur 1
+institut fur informatik 1
+institut infrastructur 1
+institut infrastructur prop 1
+institut nat 6
+institut nat de 6
+institut of computer 3
+institut of electr 2
+institut of inform 1
+institut of mathemat 1
+institut of scientif 1
+institut of technolog 11
+institut on parallel 1
+institut or compan 1
+institut report 1
+institut report ke.u.87.13 1
+instr 7
+instr a program 1
+instr and method 1
+instr facil 1
+instr for developm 1
+instr in popl 1
+instr or run 1
+instr tool 1
+instr ver 1
+instr with assum 1
+instruc 28
+instruc a dat 1
+instruc a mem 1
+instruc a tout 1
+instruc acc 1
+instruc acc edent 1
+instruc alloc 1
+instruc allow 1
+instruc alw tak 1
+instruc amen 1
+instruc amen ee 1
+instruc and dat 1
+instruc and fl 1
+instruc and gener 1
+instruc and instruc 1
+instruc and memor 1
+instruc and recur 1
+instruc and tak 1
+instruc appear 1
+instruc ar del 1
+instruc ar gener 1
+instruc ar issu 1
+instruc ar requir 1
+instruc ar st 1
+instruc argum 1
+instruc arithm 1
+instruc arithm etiqu 1
+instruc at parallel 1
+instruc at run 1
+instruc aus 1
+instruc aus complec 1
+instruc being fetch 1
+instruc buffer 2
+instruc buffer ib 1
+instruc buffer perform 1
+instruc cach 1
+instruc cal 1
+instruc cal devr 1
+instruc cal ou 1
+instruc charg 1
+instruc charg ee 1
+instruc com 1
+instruc com un 1
+instruc con 1
+instruc con cu 1
+instruc concern 1
+instruc concern ee 1
+instruc constitut 1
+instruc contain 1
+instruc correspon 2
+instruc correspon sont 1
+instruc cost 1
+instruc count 2
+instruc cr 1
+instruc cr ee 1
+instruc cut 1
+instruc cut vn 1
+instruc cycl 1
+instruc d ecritur 1
+instruc d ed 1
+instruc d efinit 1
+instruc dacc 1
+instruc dacc es 1
+instruc dalloc 1
+instruc dappel 1
+instruc dappel cal 1
+instruc dappel de 1
+instruc dappel non 1
+instruc de 2
+instruc de branch 1
+instruc de contr 1
+instruc de coupur 1
+instruc de gest 1
+instruc de la 1
+instruc de retour 1
+instruc de saut 1
+instruc de tr 1
+instruc deal 1
+instruc dealloc 1
+instruc decod 1
+instruc decod tim 1
+instruc deep 1
+instruc deep fail 1
+instruc design 1
+instruc dind 1
+instruc dind sp 1
+instruc don 1
+instruc don ee 1
+instruc dual 1
+instruc dual soient 1
+instruc dunif 1
+instruc dunif avec 1
+instruc dunif de 1
+instruc dunif est 1
+instruc dunif peut 1
+instruc dunif qu 1
+instruc dunif sont 1
+instruc dur claus 1
+instruc eml 1
+instruc est 1
+instruc est remplac 1
+instruc est util 1
+instruc et de 1
+instruc et en 1
+instruc et ren 1
+instruc evit 1
+instruc evit le 1
+instruc ex 1
+instruc ex ecut 1
+instruc execut 3
+instruc explicit 1
+instruc exploit 1
+instruc exploit fast 1
+instruc facil 1
+instruc fail 1
+instruc fail deep 1
+instruc fail shallow 1
+instruc favor 1
+instruc fetch 1
+instruc field 1
+instruc figur 1
+instruc flow 1
+instruc font 1
+instruc font part 1
+instruc for adapt 1
+instruc format 1
+instruc from separ 1
+instruc funct 1
+instruc funct host 1
+instruc g en 1
+instruc ge 2
+instruc ge execut 1
+instruc ge list 1
+instruc ge structur 1
+instruc ge var 1
+instruc gener 1
+instruc got 1
+instruc held 1
+instruc if nec 1
+instruc in favor 1
+instruc inclus 1
+instruc inclut 1
+instruc instruc 1
+instruc involut 1
+instruc involut derefer 1
+instruc is comput 1
+instruc is execut 1
+instruc is handl 1
+instruc is nop 1
+instruc job 1
+instruc level 1
+instruc level parallel 1
+instruc manipl 1
+instruc manipl le 1
+instruc mi 1
+instruc multipl 1
+instruc multipl dat 1
+instruc n ecessair 1
+instruc n ecessit 1
+instruc ne 1
+instruc ne romp 1
+instruc nec 1
+instruc neck 1
+instruc neck doit 1
+instruc neck garantit 1
+instruc neck inutil 1
+instruc neck ninv 1
+instruc neck ou 1
+instruc neck remplit 1
+instruc neck sp 1
+instruc neck stat 1
+instruc nod 1
+instruc of empseq 1
+instruc opcod 1
+instruc opcod mak 1
+instruc operand 1
+instruc pack 1
+instruc pag 1
+instruc pag ba 1
+instruc par 1
+instruc par de 1
+instruc parallel 1
+instruc part 1
+instruc part try 1
+instruc pathlength 1
+instruc per cycl 1
+instruc perform 1
+instruc peuv 1
+instruc peuv donc 1
+instruc pipel 1
+instruc plus tard 1
+instruc po argum 1
+instruc pointer 1
+instruc proc 1
+instruc proceed 1
+instruc proceed ou 1
+instruc produc 1
+instruc program 1
+instruc put 1
+instruc put unsaf 1
+instruc put valu 1
+instruc qu 1
+instruc qu lon 1
+instruc qu manipl 1
+instruc r ef 1
+instruc r1 1
+instruc r2 1
+instruc register 1
+instruc rel 1
+instruc repeat 1
+instruc responsabl 1
+instruc responsabl de 1
+instruc retr 1
+instruc retr me 1
+instruc retr ou 1
+instruc retr peut 1
+instruc retr shallow 1
+instruc s equ 1
+instruc sannihil 1
+instruc sav ch 1
+instruc sav cut 1
+instruc se 5
+instruc se computer 1
+instruc se fait 1
+instruc se level 1
+instruc sen 1
+instruc separ 1
+instruc sequ 1
+instruc serv 1
+instruc shown 1
+instruc simpl 1
+instruc simpl par 1
+instruc soft 1
+instruc soft cut 1
+instruc softwar 1
+instruc sont 1
+instruc sont dupliqu 1
+instruc sp 1
+instruc sp ec 1
+instruc standard 1
+instruc standard de 1
+instruc stream 2
+instruc stream multipl 1
+instruc stream parallel 1
+instruc stream singl 1
+instruc suiv 1
+instruc suiv empil 1
+instruc suiv lient 1
+instruc sur 1
+instruc sur le 1
+instruc suscept 1
+instruc susceptibl 1
+instruc susceptibl de 1
+instruc tak 2
+instruc test 1
+instruc test donc 1
+instruc that ad 1
+instruc that group 1
+instruc to attempt 1
+instruc to compar 1
+instruc trac 1
+instruc trac gener 1
+instruc trait 1
+instruc trait ee 1
+instruc trigger 1
+instruc trust 1
+instruc trust ain 1
+instruc trust est 1
+instruc trust fonct 1
+instruc trust si 1
+instruc try 1
+instruc try ou 1
+instruc un param 1
+instruc unif 1
+instruc unif de 1
+instruc unif valu 1
+instruc unif var 1
+instruc uniqu 1
+instruc using 1
+instruc using im 1
+instruc util 1
+instruc util ee 1
+instruc v erif 1
+instruc valu 1
+instruc wam 1
+instruc wam ninterv 1
+instruc wh valu 1
+instruc which attach 1
+instruc which handl 1
+instruc which impl 1
+instruc which mak 1
+instruc which receiv 1
+instruc which trap 1
+instruc window 1
+instruc word 1
+instruc word architectur 1
+instructif 1
+instructif de 1
+instructif de comparer 1
+instructionlevel 1
+instructionlevel parallel 1
+instructionpointer 1
+insuf 1
+insuf cient 1
+insuff 8
+insuff attent 1
+insuff compon 1
+insuff compon adapt 1
+insuff for defin 1
+insuff knowledg 1
+insuff knowledg ec 1
+insuff pour 1
+insuff pour lu 1
+insuff pour permettr 1
+insuff rich 1
+insuff rich event 1
+insuff tim 1
+insuff to identif 1
+insur 3
+insur compan 1
+insur compan claim 1
+insur th health 1
+insur th user 1
+int 64
+int addr 1
+int al inclus 1
+int algorithm 1
+int an 1
+int and rang 1
+int and string 1
+int answer 1
+int answer found 1
+int appl 2
+int appl ar 1
+int arg1 1
+int argc 1
+int as equiv 1
+int ask 1
+int collect 2
+int collect realm 1
+int comp 1
+int comp typ 1
+int dat 3
+int decl 1
+int deutsch 1
+int deutsch saetz 1
+int dut 1
+int dut requir 1
+int egr 4
+int egr de 1
+int egr ee 2
+int egr es 1
+int egr tout 1
+int egralit 1
+int egrer 2
+int egrer ce 1
+int egrer la 1
+int eoc 1
+int er 4
+int er avec 1
+int er com 1
+int er con 1
+int er dalgorithm 1
+int er dan 1
+int er de 3
+int er du 3
+int er ee 1
+int er en 1
+int er es 1
+int er est 1
+int er si 1
+int er sur 1
+int er tout 1
+int eresser 1
+int eresser aux 1
+int eresser maint 1
+int eresseron 1
+int eresseron donc 1
+int eresseron ic 1
+int eresseron pa 1
+int eresson 1
+int eresson au 1
+int eresson dan 1
+int eresson nous 1
+int eresson pa 1
+int ev 1
+int ev cal 1
+int event 1
+int field 1
+int for build 1
+int for integr 1
+int for multim 1
+int for secur 1
+int fortran 1
+int fortran program 1
+int fr 1
+int fr slot 1
+int frustr 1
+int ge 1
+int ge valu 1
+int gral 1
+int gral pour 1
+int grat 1
+int grer 1
+int grer ce 1
+int grer dan 1
+int height 1
+int horn 1
+int horn claus 1
+int ii 1
+int imag 1
+int imag gener 1
+int ind 1
+int inform 1
+int instead 1
+int interpr 1
+int item 1
+int item number 1
+int langu 1
+int lc 1
+int lc flag 1
+int learn 1
+int len 1
+int link 2
+int link cost 1
+int link list 1
+int loc 1
+int loc cycl 1
+int log 2
+int log langu 1
+int log program 1
+int mac 1
+int mac graph 1
+int mac tr 1
+int maxbloc 1
+int mean 4
+int min 1
+int min graph 1
+int mintreestat 1
+int model 1
+int np 1
+int num 1
+int num explor 1
+int num exploredstat 1
+int numer 1
+int numer method 1
+int of fal 1
+int on window 1
+int oper 1
+int our evalu 1
+int output 2
+int output port 1
+int parameter 1
+int parameter begin 1
+int parameter pl 1
+int pattern 1
+int pattern develop 1
+int pr 1
+int pr 3.eqn 1
+int problem 1
+int program 2
+int program. 1
+int proof 1
+int re 1
+int re concern 1
+int re de 1
+int re ic 1
+int req 1
+int req typ 1
+int research 1
+int resson 1
+int resson ain 1
+int resson ic 1
+int result 2
+int robot 1
+int robot system 1
+int root 1
+int samestr 1
+int scientif 1
+int scientif engineer 1
+int scientif program 1
+int seed 1
+int sem 1
+int serv 1
+int siz 1
+int spot 1
+int stud 1
+int stud approach 1
+int temp 1
+int temp pr 1
+int that implem 1
+int their softwar 1
+int to accommod 1
+int to accompl 1
+int to ap 1
+int to compil 1
+int to de 1
+int to describ 1
+int to develop 1
+int to en 1
+int to form 2
+int to gener 1
+int to go 1
+int to imp 1
+int to incorpor 1
+int to introduc 1
+int to prov 1
+int to re 1
+int to reduc 1
+int to reflect 1
+int to reus 1
+int to satisf 1
+int to serv 1
+int to support 3
+int topolog 1
+int tot 1
+int tot cycl 1
+int treeheightstat 1
+int us 2
+int usag 1
+int valu 2
+int89 1
+intact 1
+intak 1
+intak is const 1
+intak learn 1
+intak per tim 1
+inteconnect 1
+integ 1
+integ wrt 1
+integ wrt tim 1
+integer 57
+integer a.9 1
+integer a.9 format 1
+integer addr 1
+integer and atom 1
+integer and doubl 1
+integer and integer 1
+integer and perform 1
+integer and produc 1
+integer ar proper 1
+integer argum 1
+integer argum valu 1
+integer arithm 1
+integer arithm instruc 1
+integer ba 1
+integer ba program 1
+integer benchmark 1
+integer benchmark valu 1
+integer ca 1
+integer comput 1
+integer confid 1
+integer confid level 1
+integer const 3
+integer correspon 1
+integer dat 2
+integer dat eld 1
+integer dat item 1
+integer denot 1
+integer div 4
+integer div countv 1
+integer domain 1
+integer domain variabl 1
+integer float 1
+integer float doubl 1
+integer funct 1
+integer funct lock 1
+integer identif 1
+integer input 1
+integer instruc 1
+integer instruc valu 1
+integer is chang 1
+integer key 1
+integer length 1
+integer mak 1
+integer mak thing 1
+integer matr 1
+integer multipl 1
+integer n1 1
+integer number 3
+integer number dep 1
+integer object 1
+integer occur 1
+integer of absolut 1
+integer of polynom 1
+integer of siz 1
+integer or float 2
+integer order 1
+integer output 1
+integer part 2
+integer part repr 1
+integer point 3
+integer point lay 1
+integer program 5
+integer program algorithm 2
+integer program problem 2
+integer real produc 1
+integer register 1
+integer result 1
+integer sequ 1
+integer shift 1
+integer siz 1
+integer smaller 1
+integer solut 1
+integer string 1
+integer subtract 1
+integer t jqj 1
+integer t1 1
+integer transl 1
+integer typ 1
+integer using 1
+integer using rad 1
+integer valu 2
+integer var 2
+integer var ge 1
+integer ver 1
+integer we us 1
+integer wh 1
+integer which partit 1
+integer whil other 1
+integer x x1 1
+integerg 1
+integerg il typ 1
+integr 57
+integr a rev 1
+integr a select 1
+integr a var 1
+integr algorithm 1
+integr and master 1
+integr and pol 1
+integr and regr 1
+integr and reus 1
+integr and softwar 1
+integr and system 1
+integr ar support 1
+integr avail 1
+integr between compon 1
+integr caus 1
+integr classif 1
+integr classif ba 1
+integr coeff 1
+integr commun 2
+integr compon 2
+integr compon appl 1
+integr compon definit 1
+integr con 1
+integr con checker 1
+integr const 1
+integr constraint 5
+integr criter 1
+integr dat 1
+integr dec 1
+integr dec mad 1
+integr differ visu 1
+integr environm 3
+integr fash 1
+integr featur 1
+integr featur map 1
+integr fr 1
+integr fr text 1
+integr framework 1
+integr geometer 1
+integr in identif 1
+integr inclus 1
+integr industr 2
+integr industr strength 2
+integr insid cluster 1
+integr int rg 1
+integr investig 1
+integr is ba 1
+integr is gener 1
+integr is lead 1
+integr is signif 1
+integr larg scal 1
+integr learn 1
+integr learn strateg 1
+integr level 1
+integr loc 2
+integr loc dec 1
+integr log 1
+integr manner 1
+integr matr 1
+integr mechan 1
+integr method 1
+integr model 1
+integr multim 1
+integr multim mater 1
+integr number 1
+integr of appl 2
+integr of appropr 1
+integr of compl 1
+integr of constraint 1
+integr of dat 1
+integr of datab 2
+integr of distribut 1
+integr of ext 1
+integr of heter 1
+integr of int 1
+integr of langu 1
+integr of loc 1
+integr of log 1
+integr of multim 1
+integr of object 2
+integr of soft 1
+integr of traff 1
+integr of view 1
+integr or mont 1
+integr overview 1
+integr part 2
+integr patternmatch 1
+integr problem 1
+integr proc 2
+integr prop 1
+integr rang 1
+integr rel 1
+integr rel datab 1
+integr relationship 1
+integr requir 2
+integr rigor 1
+integr schem 1
+integr schem describ 1
+integr segm 1
+integr segm result 1
+integr soft 1
+integr soft loc 1
+integr stag 1
+integr step 1
+integr str 1
+integr such submodl 1
+integr sum 1
+integr sv 1
+integr symbol 1
+integr system 2
+integr system approach 1
+integr technolog 2
+integr test 1
+integr th appl 1
+integr th dat 1
+integr th mater 1
+integr th piec 1
+integr th prim 1
+integr th requir 1
+integr th resourc 1
+integr th separ 1
+integr th sv 1
+integr th syntact 1
+integr that tool 1
+integr theor 1
+integr to detect 1
+integr to www 1
+integr tool 1
+integr tool rapid 1
+integr using 1
+integr using mathem 1
+integr vi 1
+integr vid 1
+integr view 1
+integr web 1
+integr web technolog 1
+integr with domain 2
+integr with featur 1
+integr with rel 1
+integr within scal 1
+integrad 1
+integrad program 1
+intel 17
+intel corpor 4
+intel i860 2
+intel i860 xr 1
+intel ipsc 3
+intel ipsc ser 1
+intel ipsc860 1
+intel paragon 8
+intel paragon osf 1
+intel paragon supercomputer 1
+intel paragon xp 1
+intel pent 1
+intel pent ba 1
+intel scientif 1
+intel scientif computer 1
+intel supercomput 1
+intel supercomput system 1
+intel supercomputer 1
+intel supercomputer system 1
+intel touchst 1
+intel touchst delt 1
+intellect 1
+intellectu 2
+intellectu man 1
+intellig 41
+intellig agent 1
+intellig and art 1
+intellig and computer 2
+intellig and geometer 1
+intellig and mathemat 1
+intellig and mus 1
+intellig and siml 1
+intellig appl 1
+intellig approach 1
+intellig artificiel 1
+intellig ba 1
+intellig cad 1
+intellig cad system 1
+intellig centr 1
+intellig centr server 1
+intellig commun 1
+intellig distribut 1
+intellig enforc 1
+intellig field 1
+intellig gener 1
+intellig gener behaviour 1
+intellig in engineer 1
+intellig in medicin 2
+intellig inform 2
+intellig inform system 2
+intellig interpr 1
+intellig is abl 1
+intellig iv 1
+intellig labor 1
+intellig memor 2
+intellig memor model 1
+intellig memor order 1
+intellig method 1
+intellig network 1
+intellig network control 1
+intellig off 1
+intellig off docum 1
+intellig reduc 1
+intellig reduc techniqu 1
+intellig research 4
+intellig research div 1
+intellig saf 1
+intellig saf system 1
+intellig ser 1
+intellig sign 1
+intellig sign proc 1
+intellig system 2
+intellig techniqu 1
+intellig trad 1
+intellig tut 1
+intellig user 1
+intellig user interfac 1
+intensiv 1
+intensiv test 1
+intent 11
+intent and desir 1
+intent datab 1
+intent datab pr 1
+intent decept 1
+intent to cover 1
+intent to en 1
+intepr 1
+inter 21
+inter block 1
+inter block invoc 1
+inter board 2
+inter board channel 2
+inter board link 2
+inter board network 2
+inter board wir 2
+inter chromosomiqu 1
+inter cl 1
+inter claus 1
+inter claus la 1
+inter cluster 3
+inter cluster bisect 3
+inter cluster channel 3
+inter cluster interconnect 1
+inter cluster network 3
+inter cluster router 1
+inter cluster siz 1
+inter cluster topolog 3
+inter cluster wir 1
+inter correl 1
+inter dep 1
+inter direct 1
+inter direct cl 1
+inter direct configur 1
+inter direct interconnect 1
+inter direct topolog 1
+inter direct typ 1
+inter edit 1
+inter hierarch 1
+inter hierarch comparison 1
+inter loop 1
+inter loop commun 1
+inter loop loc 1
+inter object 1
+inter object connect 1
+inter oper 1
+inter pack 1
+inter pack gener 1
+inter partit 1
+inter partit connect 1
+inter partit edg 1
+inter proc 3
+inter proc commun 3
+inter processeur 1
+inter relationship 1
+inter server 1
+inter server pointer 1
+inter switch 1
+inter switch bi 1
+inter switch commun 1
+inter switch lin 1
+inter switch link 1
+inter switch traff 1
+inter switch trunk 1
+inter wir 2
+inter wir spac 2
+inter. 3
+interac 1
+interac environm 1
+interact 46
+interact 3d 1
+interact 3d graph 1
+interact an empir 1
+interact and appl 1
+interact and develop 1
+interact and mak 1
+interact and perform 1
+interact and react 1
+interact anim 1
+interact appl 1
+interact ar neglig 1
+interact between compon 1
+interact between group 1
+interact between layer 1
+interact between loc 1
+interact between multicast 1
+interact between smaller 1
+interact between subject 1
+interact between subtyp 1
+interact by exchang 1
+interact by shar 1
+interact collabor 1
+interact collabor appl 1
+interact context 1
+interact control 1
+interact cour 1
+interact determin 1
+interact docum 1
+interact effect 1
+interact emerg 1
+interact entr 2
+interact entr diff 1
+interact entr le 2
+interact environm 1
+interact form1 1
+interact graph 1
+interact hom 1
+interact hom mach 1
+interact human 1
+interact human commun 1
+interact in concur 1
+interact in explor 1
+interact int slow 1
+interact interact 1
+interact interfac 1
+interact is embod 1
+interact manipl 1
+interact mater 1
+interact model 1
+interact model environm 1
+interact model system 1
+interact modif 1
+interact multim 1
+interact multim commun 1
+interact object 1
+interact object me 1
+interact of multicast 1
+interact of simpl 1
+interact of unwind 1
+interact on 1
+interact on shar 1
+interact parallel 1
+interact perform 1
+interact power 1
+interact power method 1
+interact program 1
+interact rat 1
+interact relationship 1
+interact remain 1
+interact remain remark 1
+interact retrief 1
+interact run 1
+interact schem 1
+interact select 1
+interact sequ 1
+interact sequ using 1
+interact shadow 1
+interact siml 2
+interact siml system 1
+interact stretch 1
+interact styl 1
+interact system 2
+interact system interfac 1
+interact techniqu 1
+interact th prompter 1
+interact that perv 1
+interact theorem 1
+interact theorem prover 1
+interact to allow 1
+interact to infer 1
+interact tool 1
+interact tool select 1
+interact upon agent 1
+interact us 1
+interact vi form 1
+interact vi point 1
+interact whil help 1
+interact with computer 1
+interact with exp 1
+interact with export 1
+interact with human 1
+interact with inherit 1
+interact with lower 1
+interact with po 1
+interact with rout 1
+interact with typ 1
+interactif 1
+interactif sur 1
+interactif sur le 1
+interagir 1
+interagir quen 1
+intercept 1
+intercept point 1
+interch 1
+interchang 8
+interchang and loop 1
+interchang between valu 1
+interchang color 1
+interchang compon 1
+interchang in order 1
+interchang object 1
+interchang preproc 1
+interchang subtr 1
+interchang th nod 1
+interchang tw el 1
+interchang tw valu 1
+interchang valu 1
+interchanger 1
+interchanger un sous 1
+intercluster 3
+intercluster channel 1
+intercluster channel width 1
+intercluster network 3
+intercluster siz 1
+intercluster topolog 1
+intercluster topolog fic 1
+intercompon 2
+intercompon commun 1
+intercompon spac 1
+interconnec. 1
+interconnect 26
+interconnect a system 1
+interconnect algorithm 1
+interconnect among connect 1
+interconnect and describ 1
+interconnect ar mesh 1
+interconnect ar optim 2
+interconnect bandwidth 2
+interconnect between switch 1
+interconnect by link 1
+interconnect channel 3
+interconnect channel width 2
+interconnect constrain 1
+interconnect constrain heter 1
+interconnect constraint 2
+interconnect cost 1
+interconnect cost reduc 1
+interconnect degexc 1
+interconnect design 1
+interconnect elan 1
+interconnect elan el 1
+interconnect hip 1
+interconnect hip switch 1
+interconnect langu 1
+interconnect lik ethernet 1
+interconnect link 2
+interconnect mem 1
+interconnect mor cluster 1
+interconnect mor proc 1
+interconnect mp3d 1
+interconnect multipl 3
+interconnect multipl inst 1
+interconnect multipl proc 1
+interconnect multipl switch 1
+interconnect network 12
+interconnect network bandwidth 2
+interconnect network commun 1
+interconnect network compr 1
+interconnect network design 3
+interconnect network determin 1
+interconnect network gener 1
+interconnect network infer 1
+interconnect network nod 1
+interconnect network perform 3
+interconnect network ra 1
+interconnect network result 1
+interconnect network rout 1
+interconnect network sourc 1
+interconnect network structur 1
+interconnect network tak 1
+interconnect network topolog 1
+interconnect network using 1
+interconnect network1 1
+interconnect of connect 1
+interconnect on sub 1
+interconnect other switch 1
+interconnect pattern 3
+interconnect perform 1
+interconnect problem 1
+interconnect proc 1
+interconnect proc cluster 1
+interconnect processorcluster 1
+interconnect requir 1
+interconnect schem 1
+interconnect siz 1
+interconnect siz lead 1
+interconnect softwar 1
+interconnect softwar compon 1
+interconnect stat 1
+interconnect stat nod 1
+interconnect striv 1
+interconnect structur 1
+interconnect switch 1
+interconnect system 1
+interconnect technolog 3
+interconnect technolog ge 2
+interconnect th el 1
+interconnect th stat 1
+interconnect th switch 1
+interconnect through bus 2
+interconnect tn 1
+interconnect tn stat 1
+interconnect to remain 1
+interconnect topolog 3
+interconnect topolog con 1
+interconnect util 1
+interconnect vi permut 1
+interconnect wa ba 1
+interconnect wir 1
+interconnect with redund 1
+interconnect with switch 1
+interconnectnbnon 1
+interconnectnbnon bus 1
+interconnectnbnon bus interconnect 1
+intercorrel 1
+interd 2
+interd a deux 1
+interd epen 1
+interd epen avec 1
+interd epen possibl 1
+interd un 1
+interd un ex 1
+interdep 2
+interdict 1
+interdirect 1
+interdirect topolog 1
+interdirect topolog cl 1
+interdit 2
+interdit a deux 1
+interdit de 1
+interdit de lemployer 1
+interdit lutil 1
+interdit lutil de 1
+interdit tout 1
+interdit tout modif 1
+interedit 1
+interest 86
+interest and eff 1
+interest appl 3
+interest aspect 1
+interest character 2
+interest cl 1
+interest computer 1
+interest computer gener 1
+interest consequ 1
+interest dilem 1
+interest experim 1
+interest experim framework 1
+interest ext 2
+interest fact 1
+interest featur 3
+interest for dist 1
+interest for prompt 1
+interest for sa 1
+interest group 2
+interest group 9th 1
+interest in answer 1
+interest in appl 1
+interest in autom 1
+interest in ca 1
+interest in compar 1
+interest in configur 1
+interest in deriv 1
+interest in distribut 1
+interest in examin 1
+interest in growth 1
+interest in identif 1
+interest in loc 1
+interest in mult 1
+interest in multicast 1
+interest in optim 1
+interest in polynom 1
+interest in problem 1
+interest in quest 2
+interest in reduc 1
+interest in run 1
+interest in stud 1
+interest in transfer 1
+interest in using 1
+interest interpr 1
+interest is eff 1
+interest issu 2
+interest loc 1
+interest loc dec 1
+interest long term 1
+interest measur 1
+interest observ 2
+interest of simpl 1
+interest parallel 1
+interest parallel project 1
+interest part 2
+interest point 3
+interest point mad 1
+interest polygon 1
+interest possibil 1
+interest prim 1
+interest probabil 1
+interest probabil techniqu 1
+interest problem 4
+interest program 1
+interest promot 1
+interest proper 1
+interest quest 4
+interest reader 1
+interest research 1
+interest research problem 1
+interest restrict 1
+interest result 2
+interest schem 1
+interest sid 1
+interest sid effect 1
+interest simil 1
+interest spec ca 1
+interest theorem 1
+interest to adapt 1
+interest to collabor 1
+interest to compar 3
+interest to consider 1
+interest to design 1
+interest to determin 1
+interest to establ 1
+interest to examin 2
+interest to explor 1
+interest to ext 1
+interest to find 1
+interest to investig 2
+interest to know 2
+interest to merg 1
+interest to not 1
+interest to observ 1
+interest to se 4
+interest to specl 1
+interest to stud 3
+interest to unfold 1
+interest top 1
+interest trad 1
+interest var 1
+interest way 1
+interfac 48
+interfac a med 1
+interfac act 1
+interfac aim 1
+interfac al avail 1
+interfac al mean 1
+interfac al prov 1
+interfac allow 1
+interfac and mlp 1
+interfac and renam 1
+interfac and sem 1
+interfac and surround 1
+interfac and underl 1
+interfac ar implem 1
+interfac ar interconnect 2
+interfac ar introduc 1
+interfac ar kept 1
+interfac ar plug 1
+interfac ar standard 1
+interfac architectur 1
+interfac assoc 1
+interfac befor report 1
+interfac board 1
+interfac ca 1
+interfac ca ev 1
+interfac cal idispatch 1
+interfac can fail 1
+interfac chang 1
+interfac chang becom 1
+interfac chang involut 1
+interfac chang specif 1
+interfac cod 1
+interfac command 1
+interfac compl 1
+interfac compl fail 1
+interfac consider 1
+interfac construc 2
+interfac cont 1
+interfac correspon 2
+interfac cost 1
+interfac cost tok 1
+interfac custom 1
+interfac decl 1
+interfac defin 1
+interfac definit 1
+interfac design 3
+interfac design environm 1
+interfac designer 1
+interfac develop 1
+interfac displ 1
+interfac ec 1
+interfac environm 1
+interfac environm uid 1
+interfac export 1
+interfac ext 1
+interfac ext prompt 1
+interfac facilit 1
+interfac failur 1
+interfac failur pr 1
+interfac failur remain 1
+interfac fil 1
+interfac for as 1
+interfac for control 1
+interfac for hist 1
+interfac for infoflec 1
+interfac for input 1
+interfac for intern 1
+interfac for log 1
+interfac for mov 1
+interfac for program 1
+interfac for select 1
+interfac for shar 2
+interfac fortran 1
+interfac funct 1
+interfac funct pm 1
+interfac g en 1
+interfac gener 1
+interfac in design 1
+interfac inclus 2
+interfac inclus manu 1
+interfac int 1
+interfac integr 1
+interfac is bigger 1
+interfac is bind 1
+interfac is defin 1
+interfac is describ 1
+interfac is detect 1
+interfac is ea 1
+interfac is funct 1
+interfac is indeed 1
+interfac is rough 1
+interfac is straightfor 1
+interfac keep 1
+interfac layout 1
+interfac log 2
+interfac manu 2
+interfac may lim 2
+interfac memor 1
+interfac method 1
+interfac mod 1
+interfac multimod 1
+interfac multimod interfac 1
+interfac need typ 1
+interfac obv 1
+interfac of lipt 1
+interfac of mar 1
+interfac of netsim 1
+interfac oft prov 1
+interfac on lin 1
+interfac oper 1
+interfac or browser 1
+interfac parameter 1
+interfac part 1
+interfac per host 1
+interfac pop 1
+interfac pr 1
+interfac principl 1
+interfac prov 4
+interfac prov addit 1
+interfac prov compl 1
+interfac prov further 1
+interfac register 1
+interfac seem 1
+interfac seen 1
+interfac show 2
+interfac show textur 1
+interfac softwar 1
+interfac specif 1
+interfac specif chang 1
+interfac specif fil 1
+interfac standard 1
+interfac stat 1
+interfac support 2
+interfac support interrupt 1
+interfac support multipl 1
+interfac system 1
+interfac th appl 1
+interfac th compon 1
+interfac th prompt 1
+interfac that cam 1
+interfac through select 1
+interfac to interact 1
+interfac to libr 1
+interfac to mak 1
+interfac to mlp 1
+interfac to oper 1
+interfac to prov 1
+interfac to reduc 1
+interfac to resourc 1
+interfac using 1
+interfac using motif 1
+interfac void 1
+interfac void sum 1
+interfac which allow 1
+interfac which prov 1
+interfac which requir 1
+interfac wil dep 1
+interfac with extern 1
+interfac work 1
+interfac would yield 1
+interfer 13
+interfer between expr 1
+interfer between instruc 1
+interfer between proc 1
+interfer caus 1
+interfer occur 1
+interfer of shar 1
+interfer phenom 1
+interfer problem 1
+interfer problem using 1
+interfer would unfavour 1
+interim 2
+interim that nod 1
+interior 6
+interior ar 1
+interior edg 1
+interior edg act 1
+interior edg separ 1
+interior featur 1
+interior nod 2
+interior of polyhedr 1
+interior of rectangl 1
+interior point 1
+interior point algorithm 1
+interior point lin 1
+interior point method 1
+interior ver 2
+interior ver creat 1
+interior ver put 1
+interior ver remov 1
+interior ver requir 1
+interleav 10
+interleav a se 1
+interleav chain 1
+interleav dat 1
+interleav dat alloc 1
+interleav mean 1
+interleav memor 1
+interleav memor modl 1
+interleav of event 1
+interleav of step 1
+interleav singl 1
+interleav singl step 1
+interleav th del 1
+interleav with commun 1
+interlisp 1
+interlisp refer 1
+interlisp refer manu 1
+interlocut 1
+interm 36
+interm act 1
+interm activ 1
+interm activ valu 1
+interm approach 1
+interm boolean 1
+interm boolean variabl 1
+interm chang 1
+interm chang request 1
+interm cod 2
+interm cod gener 1
+interm column 1
+interm dat 1
+interm dat structur 1
+interm del 1
+interm distribut 1
+interm distribut block 1
+interm edg 1
+interm ediair 3
+interm ediair e2 1
+interm ediair en 1
+interm ediair entr 1
+interm ediair est 1
+interm ediair form 1
+interm ediair issu 1
+interm ediair libr 1
+interm ediair loop 1
+interm ediair perm 1
+interm ediair pour 1
+interm ediair quun 1
+interm ediair suiv 1
+interm equiv 1
+interm equiv rel 1
+interm form 1
+interm fortran 1
+interm langu 1
+interm langu plm 1
+interm length 1
+interm memor 1
+interm nod 1
+interm objectiv 1
+interm proc 1
+interm rel 1
+interm rel result 1
+interm repr 1
+interm result 4
+interm router 1
+interm router destinationrouter 1
+interm server 1
+interm shunt 1
+interm shunt mid 1
+interm sit 1
+interm sit wait 1
+interm st 2
+interm stag 2
+interm step 2
+interm step wh 1
+interm subtyp 1
+interm subtyp system 1
+interm switch 2
+interm switch con 1
+interm switch nod 1
+interm switch using 1
+interm term 1
+interm tim 1
+interm traff 1
+interm tupl 1
+interm valu 2
+interm valu mid 1
+interm variabl 1
+interm ver 1
+interm virtu 1
+interm virtu mach 1
+intermeter 2
+intermeter inc 1
+intermin 1
+intermin adapt 1
+intermin adapt tim 1
+intermod 1
+intermod imag 1
+intermod imag register 1
+intern 97
+intern a la 1
+intern and extern 4
+intern and transl 1
+intern appl 1
+intern as 1
+intern caus 1
+intern ce 1
+intern ce vecteur 1
+intern colloqu 2
+intern com 1
+intern compon 1
+intern comput 1
+intern computer 2
+intern computer softwar 1
+intern concur 1
+intern concur impl 1
+intern concur mak 1
+intern confer 1
+intern confer connect 1
+intern congr 1
+intern coordin 1
+intern counter 1
+intern dat 1
+intern dat structur 1
+intern de 1
+intern de ce 1
+intern degr 1
+intern delaun 1
+intern delaun edg 1
+intern delaun triangl 1
+intern distribut 1
+intern du 1
+intern du nid 1
+intern en 1
+intern en bloc 1
+intern ent 1
+intern est 1
+intern event 1
+intern featur 1
+intern fil 1
+intern fil structur 1
+intern form 1
+intern format 1
+intern high perform 1
+intern imag 1
+intern imag cod 1
+intern inc 1
+intern incon 1
+intern incon du 1
+intern incr 1
+intern incr decr 1
+intern ind 1
+intern ind datab 1
+intern inst 1
+intern institut 1
+intern interfac 1
+intern joint 8
+intern la 1
+intern la direct 1
+intern le 1
+intern le direct 1
+intern log 2
+intern log program 2
+intern md 1
+intern md ba 1
+intern mechan 1
+intern medicin 1
+intern memor 1
+intern memor cap 1
+intern memor siz 1
+intern memor using 1
+intern minimumdegr 1
+intern minimumdegr ba 1
+intern mult 1
+intern mult stag 1
+intern ne 1
+intern ne cont 1
+intern neffectu 1
+intern neffectu qu 1
+intern nod 7
+intern nod connect 1
+intern norm 1
+intern norm reg 1
+intern number 1
+intern of softwar 1
+intern opcod 1
+intern order 1
+intern order rout 1
+intern ou 1
+intern ou extern 1
+intern parallel 4
+intern parallel proc 4
+intern parl 1
+intern point 2
+intern proc 1
+intern proc tim 1
+intern program 1
+intern prompt 1
+intern qu 1
+intern qu dan 1
+intern qu peut 1
+intern register 1
+intern report 3
+intern report lag 1
+intern repr 3
+intern select 1
+intern select proc 1
+intern ser 2
+intern shift 1
+intern softwar 1
+intern sort 1
+intern sort step 1
+intern st 6
+intern st rl 1
+intern stat 1
+intern stat an 1
+intern structur 2
+intern support 1
+intern tabl 1
+intern techn 1
+intern techn support 1
+intern to cluster 1
+intern triangl 1
+intern triangl lying 1
+intern un 1
+intern un direct 1
+intern us 2
+intern us ed 1
+intern user 1
+intern user interfac 1
+intern var 2
+intern var number 1
+intern var shuffl 1
+intern ver 2
+intern vldb 1
+intern voron 1
+intern voron skel 1
+intern workshop 20
+intern workshop pdk91 1
+intern world 1
+intern world wid 1
+internalxp 1
+internalxp nod 1
+internat 2
+internatin 1
+interner 3
+interner bericht 3
+interner bericht immd7 1
+internet 15
+internet addr 1
+internet and internet 2
+internet at sit 1
+internet b m2 2
+internet b m3 2
+internet ba 3
+internet ba environm 1
+internet ba gam 1
+internet ba serv 1
+internet backbon 1
+internet backbon show 1
+internet becom 2
+internet becom optim 2
+internet can accommod 1
+internet channel 2
+internet channel requir 2
+internet channel width 2
+internet client 1
+internet client server 1
+internet companion 1
+internet configur 2
+internet e introduz 1
+internet engineer 1
+internet engineer task 1
+internet explor 1
+internet explor system 1
+internet fal 2
+internet follow 2
+internet follow 4d 2
+internet for var 2
+internet gopher 1
+internet growth 1
+internet host 1
+internet infrastructur 1
+internet is equiv 2
+internet is good 2
+internet item 1
+internet link 2
+internet network 1
+internet network group 1
+internet offer 1
+internet primer 1
+internet protocol 2
+internet prov 2
+internet prov ea 2
+internet prov simil 2
+internet request 1
+internet resourc 2
+internet router 2
+internet router log 2
+internet serv 1
+internet server 1
+internet show 2
+internet siz 2
+internet softwar 1
+internet softwar visu 1
+internet to deliver 2
+internet to tackl 1
+internet toolbox 1
+internet topolog 2
+internet usag 1
+internet user 1
+internet visu 1
+internet we find 2
+internet we se 2
+internet wh 2
+internet when writ 1
+internet wir 2
+internet with bus 2
+internet with min 2
+internetb 2
+internetb m p2 2
+internetb p 2d 2
+internetchannelwidth 2
+internetchannelwidth w 2d 2
+internetchannelwidthw 2
+internetchannelwidthw 3d 2
+internettopolog 2
+internettopolog cluster 2
+internettopolog cluster sizec 2
+internetw 2
+internetwir 2
+internetwir internetchannelwidth 2
+internetwork 1
+internship 1
+internship at matsushit 1
+interop 1
+interop95 1
+interop95 engineer 1
+interoper 3
+interoper experim 1
+interoper of separ 1
+interoper report 1
+interp 2
+interp fl 1
+interp fl qualif 1
+interpack 1
+interpack tim 1
+interpack tim distribut 1
+interper 1
+interpl 1
+interpl between nw 1
+interpl of nw 1
+interpol 10
+interpol and render 1
+interpol grad 1
+interpol grad approxim 1
+interpol in intersect 1
+interpol is perform 1
+interpol nec 1
+interpol or symbol 1
+interpol par 1
+interpol par la 1
+interpol problem 1
+interpol step 1
+interpol var 1
+interpol wa disc 1
+interpr 49
+interpr a protocol 1
+interpr and abstract 1
+interpr and answer 1
+interpr and evalu 1
+interpr and unjustif 1
+interpr ar execut 1
+interpr ar ext 1
+interpr ar indep 1
+interpr ar model 1
+interpr ar satisfact 1
+interpr as ae0 1
+interpr as approxim 1
+interpr as asser 1
+interpr as dct 1
+interpr as denot 1
+interpr as el 1
+interpr as execut 1
+interpr as follow 2
+interpr as no 1
+interpr as radon 1
+interpr as repr 2
+interpr as result 1
+interpr assign 1
+interpr assign mean 1
+interpr ba 1
+interpr c.f 1
+interpr cam 1
+interpr cam program 1
+interpr comput 1
+interpr cor 1
+interpr cor cam 1
+interpr datab 1
+interpr datab atom 1
+interpr definit 1
+interpr e com 1
+interpr edb 1
+interpr edb atom 1
+interpr es 1
+interpr es au 1
+interpr es avec 1
+interpr es de 1
+interpr es en 1
+interpr es fourn 1
+interpr es ne 1
+interpr es pr 1
+interpr es rep 1
+interpr et ee 1
+interpr et es 1
+interpr etat 3
+interpr etat de 2
+interpr etat fonctionel 1
+interpr etat plut 1
+interpr etatif 1
+interpr eter 2
+interpr eter com 1
+interpr eter la 1
+interpr exact 1
+interpr execut 1
+interpr expr 1
+interpr ext 1
+interpr ext cam 1
+interpr f program 1
+interpr for structur 1
+interpr framework 1
+interpr fsu 1
+interpr if laid 1
+interpr in ea 1
+interpr is ba 1
+interpr is giv 1
+interpr is perform 1
+interpr larg dat 1
+interpr loop 1
+interpr me 1
+interpr me object 1
+interpr mechan 1
+interpr model 1
+interpr of cl 1
+interpr of compon 1
+interpr of confid 1
+interpr of decl 1
+interpr of lin 1
+interpr of log 2
+interpr of ml 1
+interpr of prolog 2
+interpr of result 1
+interpr of scal 1
+interpr of se 1
+interpr of st 1
+interpr of subtyp 1
+interpr on 1
+interpr oper 1
+interpr or vect 1
+interpr over domain 1
+interpr overhead 2
+interpr overhead heav 1
+interpr overlap 1
+interpr possibil 1
+interpr pr 1
+interpr proc 1
+interpr program 2
+interpr purp 1
+interpr rel 1
+interpr result 1
+interpr script 1
+interpr script langu 1
+interpr shap 1
+interpr sound 1
+interpr sound wav 1
+interpr subject 1
+interpr subject color 1
+interpr symbol 1
+interpr tat 1
+interpr techniqu 2
+interpr th benchmark 1
+interpr th cam 1
+interpr th cod 1
+interpr th dat 1
+interpr th flesh 1
+interpr th gener 1
+interpr th glob 1
+interpr th program 1
+interpr th recur 1
+interpr th rel 1
+interpr th var 1
+interpr th view 1
+interpr their cooper 1
+interpr theor 1
+interpr theor allow 1
+interpr thereoff 1
+interpr to interpr 1
+interpr to mean 1
+interpr to satisf 1
+interpr using 1
+interpr using techniqu 1
+interpr with empt 1
+interpr with respect 1
+interpreter 11
+interpreter and compiler 1
+interpreter and interpr 1
+interpreter ec 1
+interpreter for interm 1
+interpreter for pluc 1
+interpreter henc 1
+interpreter in reflect 1
+interpreter is describ 1
+interpreter is eff 1
+interpreter is pr 1
+interpreter is us 1
+interpreter of cor 1
+interpreter prov 1
+interpreter prov abstract 1
+interpreter which detect 1
+interpreter work 1
+interproc 8
+interproc commun 7
+interproc commun tim 1
+interproc interrupt 1
+interproc interrupt mechan 1
+interprocedur 3
+interprocedur algorithm 1
+interprocedur an 2
+interprocedur and intraprocedur 1
+interprocedur ca 1
+interprocedur context 1
+interprocedur dat 1
+interprocedur dat flow 1
+interprocedur regr 1
+interprocedur regr test 1
+interprocedur test 1
+interprocedur test select 1
+interprocedur tim 1
+interpter 1
+interreduc 1
+interrel 3
+interrel algorithm 1
+interrel among concept 1
+interrel cl 1
+interrel funct 1
+interrompu 1
+interrompu dur 1
+interrompu dur ce 1
+interrupt 11
+interrupt and compl 1
+interrupt bit 1
+interrupt handl 1
+interrupt high 1
+interrupt high level 1
+interrupt it proc 1
+interrupt l1 1
+interrupt l1 subtransact 1
+interrupt li 1
+interrupt mechan 1
+interrupt notif 1
+interrupt op 1
+interrupt parent 1
+interrupt parent transact 1
+interrupt recov 1
+interrupt th actu 1
+interrupt th kcm 1
+interrupt to notif 1
+interrupt transact 1
+interrupt transact und 1
+interrupt unfold 1
+intersc 3
+intersec. 1
+intersect 24
+intersect a fac 1
+intersect algorithm 1
+intersect and color 1
+intersect and degener 1
+intersect and differ 1
+intersect and inver 1
+intersect and strok 1
+intersect ar creat 1
+intersect ar denot 1
+intersect as plan 1
+intersect between polyhedr 1
+intersect between spat 1
+intersect between triangl 1
+intersect bs 1
+intersect bs plan 1
+intersect by compar 1
+intersect calcl 1
+intersect comput 1
+intersect configur 1
+intersect fac 1
+intersect hit 1
+intersect hyperplan 1
+intersect indep 1
+intersect involut 1
+intersect is empt 1
+intersect is found 1
+intersect is proc 1
+intersect not 1
+intersect occur 2
+intersect of artif 1
+intersect of bi 1
+intersect of cliqu 1
+intersect of color 1
+intersect of fac 1
+intersect of interv 1
+intersect of oe 1
+intersect of polyhedr 1
+intersect of se 1
+intersect of tetrahedr 1
+intersect on fac 1
+intersect oper 1
+intersect plan 1
+intersect point 1
+intersect proc 1
+intersect proc halt 1
+intersect proc mak 1
+intersect proc perform 1
+intersect proper 3
+intersect proper hold 1
+intersect qu 1
+intersect rectangl 1
+intersect segm 1
+intersect segm correspon 1
+intersect segm creat 1
+intersect segm en 1
+intersect segm link 1
+intersect segm oeab 1
+intersect segm touch 1
+intersect sever fac 1
+intersect sl 1
+intersect test 1
+intersect th bound 1
+intersect th edg 1
+intersect th polygon 1
+intersect th qu 1
+intersect that produc 1
+intersect to mak 1
+intersect triangl 1
+intersect tw fac 2
+intersect typ 2
+intersect voron 1
+intersect voron edg 1
+intersect whatsoever 1
+intersect whil collap 1
+intersect wil introduc 1
+intersect with b0 1
+intersper 1
+intersper inact 1
+intersper inact on 1
+interst 1
+interst to not 1
+interswitch 1
+interswitch commun 1
+interswitch link 1
+interswitch traff 1
+intertext 1
+intertext publ 1
+intertwin 1
+interv 43
+interv ad 1
+interv ai 1
+interv an 1
+interv and experim 1
+interv ar constraint 1
+interv au 1
+interv au moin 1
+interv ba 1
+interv ba repr 1
+interv between succ 1
+interv cal upd 1
+interv calculus 1
+interv cover 1
+interv dan 1
+interv dan deux 1
+interv dat 1
+interv de 2
+interv de conf 1
+interv de la 1
+interv don 1
+interv don es 1
+interv en 1
+interv ent 1
+interv graph 1
+interv hav incr 1
+interv hav length 1
+interv i doubl 1
+interv impl 1
+interv is assoc 1
+interv is compar 1
+interv log 2
+interv lorsquau 1
+interv lorsquau moin 1
+interv maintenac 1
+interv model 1
+interv occur 1
+interv of integer 1
+interv of length 1
+interv of tim 4
+interv peut 1
+interv peut alor 1
+interv quer 1
+interv requir 1
+interv requir reduc 1
+interv respect 1
+interv sur 1
+interv sur le 1
+interv that satisf 1
+interv tim 1
+interv tim t0 1
+interv unwind 1
+interv unwind protect 1
+interv versus probabil 1
+interv wil result 1
+intervalorder 1
+intervalorder dag 1
+intervenir 4
+intervenir au 1
+intervenir constam 1
+intervenir constam de 1
+intervenir dan 1
+intervenir dan lec 1
+intervenir de 3
+intervenir de congru 1
+intervenir de div 1
+intervenir de estim 1
+intervenir de not 1
+intervenir la 1
+intervenir la var 1
+intervenir le 1
+intervenir qu 2
+intervenir qu de 1
+intervenir qu deux 1
+intervenir qu le 1
+intervenir quapr 1
+intervenir quapr es 1
+intervenir un 1
+intervertir 1
+intervertir le 1
+intervertir le boucl 1
+interview 2
+interview and tabl 1
+interview dat 1
+interview dat uncover 1
+interview direct 1
+interview exper 1
+interview exper subject 1
+interview exper user 1
+interview find 1
+interview last 1
+interview method 1
+interview proc 1
+interview promot 1
+interview promot detail 1
+interview quest 1
+interview requir 1
+interview se 1
+interview se encourag 1
+interview techniqu 1
+interview templ 1
+interview templ quest 1
+interview th subject 1
+interview think 1
+interview thought 1
+interview to explor 1
+interview to help 1
+interview transcript 1
+interview user 1
+interview using 1
+interview wa structur 1
+interview we found 1
+interview wer car 1
+interview wer conduc 1
+interviewer 1
+interviewer bi 1
+interviewer exper 1
+interviewer return 1
+interviewer to motiv 1
+interviewer wish 1
+intim 2
+intim intertwin 1
+intim li 1
+intim li ee 1
+intl 15
+intl parallel 1
+intl parallel proc 1
+intn 1
+intn id eq 1
+intn id geq 1
+intn id gt 1
+intn id leq 1
+intn id lt 1
+intn id neq 1
+intoduc 1
+intoduc program 1
+intoduc program dep 1
+intr 10
+intr an 1
+intr and interprocedur 1
+intr cl 1
+intr cl var 1
+intr claus 1
+intr claus dan 1
+intr cluster 3
+intr cluster commun 1
+intr cluster interconnect 2
+intr cluster network 3
+intr cluster rout 1
+intr fact 1
+intr loop 1
+intr loop commun 1
+intracluster 1
+intracluster commun 1
+intract 7
+intract form 1
+intract form system 1
+intract problem 2
+intraprocedur 1
+intraprocedur algorithm 1
+intraprocedur and interprocedur 1
+intraprocedur context 1
+intraprocedur regr 1
+intraprocedur regr test 1
+intraprocedur selecttest 1
+intraprocedur selecttest algorithm 1
+intraprocedur test 1
+intraprocedur test select 1
+intrasequ 1
+intrasequ rearrang 1
+intriangl 1
+intrigu 1
+intrin 10
+intrin corrupt 1
+intrin differ way 1
+intrin difficult 1
+intrin equ 2
+intrin equ de 1
+intrin equ du 1
+intrin equ peuv 1
+intrin equ quon 1
+intrin equ si 1
+intrin lim 1
+intrin mc 1
+intrin ontolog 1
+intrin ontolog natur 1
+intrin overhead 1
+intrin problem 1
+intrin proper 1
+intrin qu 1
+intrin qu incertain 1
+intrin qu la 1
+intrin self 1
+intrin self assessm 1
+intrin tak 1
+introdu 2
+introdu de 1
+introdu de instruc 1
+introdu de var 1
+introdu un 1
+introdu un dist 1
+introduc 126
+introduc a constraint 1
+introduc a del 1
+introduc a finit 1
+introduc a funct 1
+introduc a gener 2
+introduc a hybrid 1
+introduc a kind 1
+introduc a lan 1
+introduc a le 1
+introduc a link 1
+introduc a lot 1
+introduc a methodolog 1
+introduc a nl 1
+introduc a novel 1
+introduc a perman 1
+introduc a proper 1
+introduc a rel 1
+introduc a requir 1
+introduc a restrict 1
+introduc a rl 1
+introduc a se 1
+introduc a shunt 1
+introduc a signif 1
+introduc a simpl 1
+introduc a specif 1
+introduc a strong 1
+introduc a subkind 1
+introduc a techn 1
+introduc a writ 1
+introduc abstract 1
+introduc abstract ver 1
+introduc ad 1
+introduc ad 9x 1
+introduc addit 1
+introduc addit introspect 1
+introduc agent 1
+introduc altern 1
+introduc an addit 2
+introduc an agent 1
+introduc an algorithm 2
+introduc an approach 1
+introduc an arbitr 1
+introduc an auxil 1
+introduc an explicit 1
+introduc an ext 1
+introduc an int 1
+introduc an order 1
+introduc an unnec 1
+introduc an unneed 1
+introduc and an 1
+introduc and connect 1
+introduc and elim 1
+introduc and rel 1
+introduc and test 1
+introduc and upd 1
+introduc another level 1
+introduc any cal 1
+introduc any nondetermin 1
+introduc any occur 1
+introduc approxim 1
+introduc aux 1
+introduc aux probabilit 1
+introduc auxil 1
+introduc auxil variabl 1
+introduc becaus measur 1
+introduc book 1
+introduc bound 1
+introduc bound quantif 1
+introduc bug 1
+introduc by av 1
+introduc by definit 1
+introduc by fit 1
+introduc by gottlieb 1
+introduc by harel 1
+introduc by inform 1
+introduc by iserl 1
+introduc by kiparsk 1
+introduc by lipt 1
+introduc by martin 1
+introduc by william 1
+introduc cam 1
+introduc cel 1
+introduc contextu 1
+introduc contextu oper 1
+introduc cycl 1
+introduc dat 1
+introduc dat shar 1
+introduc degener 1
+introduc degener cel 1
+introduc deriv 1
+introduc deriv edg 1
+introduc differ kind 1
+introduc difficult 1
+introduc dun 1
+introduc dun instruc 1
+introduc dur maint 1
+introduc dur split 1
+introduc eager 1
+introduc error 2
+introduc error funct 1
+introduc est 1
+introduc fault 1
+introduc fault model 1
+introduc for complec 1
+introduc for conv 1
+introduc glob 1
+introduc glob sem 1
+introduc hardwar 1
+introduc hardwar support 1
+introduc high degr 1
+introduc hot 1
+introduc hot spot 1
+introduc id 1
+introduc in deltablu 1
+introduc in e0 1
+introduc in proposit 1
+introduc in sect 4
+introduc inaccur 1
+introduc inclus 1
+introduc inclus refer 1
+introduc int arbitr 1
+introduc int ca 1
+introduc inter 1
+introduc inter server 1
+introduc intern 1
+introduc intern ver 1
+introduc is suff 1
+introduc larg commun 1
+introduc le 1
+introduc le syst 1
+introduc level 1
+introduc level compar 1
+introduc libr 1
+introduc libr chang 1
+introduc loc 1
+introduc loc indep 1
+introduc loop 1
+introduc mesh 1
+introduc n addit 1
+introduc new id 1
+introduc new interfac 1
+introduc new interm 1
+introduc new modl 1
+introduc new privileg 1
+introduc new problem 1
+introduc obj3 1
+introduc of backtrack 1
+introduc of inherit 2
+introduc of maxrol 1
+introduc of minrol 1
+introduc of rl 1
+introduc of st 1
+introduc of synonym 1
+introduc of user 1
+introduc oper 1
+introduc order 1
+introduc order partit 1
+introduc other var 1
+introduc our not 1
+introduc parameter 1
+introduc parameter specif 1
+introduc plan 1
+introduc plan link 1
+introduc prev 1
+introduc propag 1
+introduc propag pattern 1
+introduc random 1
+introduc rec 1
+introduc relev 1
+introduc relev definit 1
+introduc rl 1
+introduc run 1
+introduc run tim 1
+introduc se 1
+introduc sect 1
+introduc sequ 1
+introduc sequ composit 1
+introduc ser 1
+introduc ser conjunct 1
+introduc shunt 1
+introduc shunt writ 1
+introduc signif 1
+introduc signif techn 1
+introduc smooth 1
+introduc som algorithm 1
+introduc som not 2
+introduc som simpl 1
+introduc som terminolog 1
+introduc spec stream 1
+introduc stat 1
+introduc structur 2
+introduc structur shar 1
+introduc structur system 1
+introduc subtl 1
+introduc subtl error 1
+introduc sur 1
+introduc sur le 1
+introduc techniqu 1
+introduc th approxim 1
+introduc th ba 2
+introduc th branch 1
+introduc th concept 8
+introduc th cur 1
+introduc th ev 1
+introduc th extentron 1
+introduc th fram 1
+introduc th fundam 1
+introduc th increm 1
+introduc th knowledg 1
+introduc th langu 1
+introduc th nest 1
+introduc th not 1
+introduc th oracl 1
+introduc th pair 1
+introduc th parallel 1
+introduc th po 1
+introduc th polynom 1
+introduc th precc 1
+introduc th restrict 1
+introduc th ri 1
+introduc th techniqu 1
+introduc th term 1
+introduc th triangl 1
+introduc th writ 1
+introduc to algorithm 3
+introduc to autom 3
+introduc to cap 1
+introduc to cluster 1
+introduc to comput 1
+introduc to execut 1
+introduc to greed 1
+introduc to kolmogorov 1
+introduc to lin 1
+introduc to log 3
+introduc to mak 1
+introduc to mu 1
+introduc to multidim 1
+introduc to multivar 2
+introduc to orthogon 1
+introduc to parallel 5
+introduc to prolog 1
+introduc to protein 1
+introduc to prov 2
+introduc to rol 1
+introduc to softwar 1
+introduc to sol 1
+introduc to st 1
+introduc to stand 1
+introduc to stat 1
+introduc to toler 1
+introduc to wavel 1
+introduc top 1
+introduc tw proper 1
+introduc var 1
+introduc variabl 1
+introduc which div 1
+introduc which show 1
+introduc with parallel 1
+introduir 2
+introduir de 1
+introduir de nouvel 1
+introduir la 1
+introduir la not 1
+introduir lit 1
+introduir lit erateur 1
+introduir un nouveau 1
+introduison 2
+introduison deux 1
+introduison deux caract 1
+introduison la 1
+introduison la not 1
+introduison le 1
+introduison le principaux 1
+introduison pour 1
+introduison pour cel 1
+introduit 4
+introduit afin 1
+introduit afin de 1
+introduit afin dinvalider 1
+introduit au 1
+introduit au paragraph 1
+introduit dan 1
+introduit dan prolog 1
+introduit de 1
+introduit de pointeur 1
+introduit de tel 1
+introduit et util 1
+introduit par 2
+introduit par dem 1
+introduit par holland 1
+introduit par lop 1
+introduit par war 1
+introduit quatr 1
+introduit tr 1
+introduit tr var 1
+introduit un 1
+introduit un nouveau 1
+introduit un secon 1
+introduit un surc 1
+introduz 1
+introduz um 1
+introduz um proj 1
+introspect 7
+introspect by appl 1
+introspect explan 1
+introspect funct 1
+introspect funct cl 1
+introspect may mak 1
+introspect me 1
+introspect me aqu 1
+introspect me xp 1
+introspect metaxp 1
+introspect oper 2
+introspect primitiv 1
+introspect reason 1
+introspect requir 1
+introspect structur 1
+introspect ver 1
+introspect verb 1
+inttyp 1
+intuit 35
+intuit about authorship 1
+intuit about herbrand 1
+intuit and prov 2
+intuit answer 1
+intuit assessm 1
+intuit behind constraint 1
+intuit behind retain 1
+intuit com 1
+intuit crit 1
+intuit dialog 1
+intuit explan 1
+intuit guid 1
+intuit id 1
+intuit is verif 1
+intuit level 1
+intuit lin 1
+intuit lin log 1
+intuit no 1
+intuit no toler 1
+intuit not 1
+intuit obv 1
+intuit phr 1
+intuit read 1
+intuit reason 1
+intuit result 1
+intuit rl 1
+intuit seem 1
+intuit sen 2
+intuit that interconnect 1
+intuit that link 1
+intuit that proc 1
+intuit underl 1
+intuit understand 1
+intuit user 1
+intuit user input 1
+intuit we expect 1
+intuit ye power 1
+intuitiv 2
+intuitiv cel 1
+intuitiv cel traduit 1
+intuitiv on peut 1
+inutil 2
+inutil accessibl 1
+inutil accru 1
+inutil correspon 1
+inutil correspon au 1
+inutil dan 1
+inutil dan bien 1
+inutil de 1
+inutil de mettr 1
+inutil dy 1
+inutil dy introduir 1
+inutil enregister 1
+inutil enregister ee 1
+inutil es 1
+inutil es au 1
+inutil est 1
+inutil est evit 1
+inutil et conduit 1
+inutil qu 1
+inutil qu peuv 1
+inutil sil 1
+inutil sil est 1
+inutil sont 1
+inutil sont evit 1
+inutil sont simpl 1
+inutil un environ 1
+inutilit 1
+inutilit e dun 1
+inv 17
+inv and flush 1
+inv and perform 1
+inv and recomput 1
+inv av 1
+inv av inv 1
+inv ba 1
+inv ba coh 1
+inv ba snoopycach 1
+inv befor modif 1
+inv boolean 1
+inv boolean ind 1
+inv by server 1
+inv cach 1
+inv cach lin 1
+inv dat 1
+inv dat unnec 1
+inv de 2
+inv de koan 1
+inv de pag 1
+inv du 1
+inv e dan 1
+inv e en 1
+inv ee 2
+inv ee est 1
+inv es 1
+inv es par 1
+inv est 1
+inv est assez 1
+inv et de 1
+inv et util 1
+inv input 2
+inv input output 1
+inv instruc 1
+inv it cach 1
+inv it pt 1
+inv le 1
+inv le drapeau 1
+inv lecteur 1
+inv marker 1
+inv mechan 1
+inv method 1
+inv method dep 1
+inv of cach 1
+inv on 1
+inv oper 1
+inv oper execut 1
+inv oper object 1
+inv or spur 1
+inv or upd 1
+inv ou 1
+inv ou diffus 1
+inv ou lectur 1
+inv overhead 1
+inv pair 1
+inv pattern 1
+inv point 1
+inv point de 1
+inv record 1
+inv reg 1
+inv se 1
+inv se fait 1
+inv sel 1
+inv select 1
+inv select using 1
+inv spec reg 1
+inv sur 1
+inv sur ecritur 1
+inv temp 1
+inv th approach 1
+inv th cach 1
+inv th compact 1
+inv th cop 1
+inv th dat 1
+inv them individu 1
+inv tlb 1
+inv tlb entr 1
+inv to multipl 1
+inv to pag 1
+inv tout 1
+inv tout le 1
+inv traff 1
+invalider 1
+invalider le 1
+invalider le cop 1
+invalidvouch 1
+invalu 1
+invalu disc 1
+invar 18
+invar al hold 1
+invar approach 1
+invar asser 1
+invar binair 1
+invar by requir 1
+invar by rigid 1
+invar constraint 1
+invar de 2
+invar de la 1
+invar de no 1
+invar dwt 1
+invar el 1
+invar el begin 1
+invar et espac 1
+invar for 3d 1
+invar geometer 1
+invar geometer hash 1
+invar in computer 1
+invar inform 1
+invar is triv 1
+invar key 1
+invar match 1
+invar n air 1
+invar of context 1
+invar of tim 1
+invar par 2
+invar par lact 1
+invar par tout 1
+invar qu 1
+invar qu perm 1
+invar s eten 1
+invar se 1
+invar subspac 1
+invar sur 1
+invar sur ce 1
+invar that kind 1
+invar un alter 1
+invar under conver 1
+invar under promot 1
+invar under rigid 1
+invar under rot 1
+invar with respect 1
+invent 6
+invent a prolog 1
+invent a techniqu 1
+invent a var 1
+invent control 1
+invent dun 1
+invent dun architectur 1
+invent of np 1
+inver 27
+inver a matr 1
+inver approach 1
+inver de 3
+inver de deux 1
+inver de ind 1
+inver de la 1
+inver de lordr 1
+inver de matr 1
+inver ent 1
+inver entr 1
+inver entr le 1
+inver et inver 1
+inver et non 1
+inver fil 1
+inver fil approach 1
+inver funct 1
+inver he 1
+inver le 1
+inver le ind 1
+inver low 1
+inver low level 1
+inver of dat 1
+inver of high 1
+inver of imb 1
+inver of multilayer 1
+inver of tetrahedr 1
+inver oper 2
+inver order 1
+inver orthonorm 1
+inver orthonorm dwt 1
+inver po 1
+inver po ed 1
+inver problem 1
+inver proport 1
+inver proportionnel 1
+inver proportionnel au 1
+inver relationship 1
+inver simpl 1
+inver simpl lordr 1
+inver subtr 1
+inver templ 1
+inver templ distribut 1
+inver text 1
+inver th dat 1
+inver th not 1
+inver th problem 1
+inver th subject 1
+inver to comput 1
+inver tr 1
+inver tr form 1
+inver tr root 1
+inversibl 1
+inversibl sont 1
+inversibl sont de 1
+invest 2
+invest hav half 1
+invest in reason 1
+invest strateg 1
+investig 50
+investig a cl 1
+investig a nontriv 1
+investig a simpl 1
+investig and evolut 1
+investig and part 1
+investig award 3
+investig by ladkin 1
+investig correl 1
+investig differ reorder 1
+investig ec 1
+investig ec axiom 1
+investig further 1
+investig how collect 1
+investig in rel 1
+investig is war 1
+investig loc 1
+investig loc propag 1
+investig mechan 1
+investig new knowledg 1
+investig of imag 1
+investig on lin 1
+investig particl 1
+investig particl detail 1
+investig point 1
+investig point mad 1
+investig requir 1
+investig rev 1
+investig sem 1
+investig sem constraint 1
+investig sever ext 1
+investig show 1
+investig suggest 1
+investig tableaux 1
+investig tableaux quer 1
+investig th ba 1
+investig th conjectur 1
+investig th design 1
+investig th eff 1
+investig th effect 2
+investig th extent 1
+investig th further 2
+investig th inclus 1
+investig th issu 1
+investig th number 1
+investig th perform 2
+investig th relationship 1
+investig th sensit 1
+investig th shap 1
+investig th us 1
+investig through structur 1
+investig using 1
+investig using tdfg 1
+investig var 1
+investig way 1
+investig what reg 1
+investig when begin 1
+investig when undertak 1
+investig which offer 1
+investm 3
+investm in reason 1
+investm in research 1
+invit 3
+invit entir 1
+invit lectur 1
+invit lectur pr 1
+invit th dim 1
+invoc 15
+invoc and tak 1
+invoc connect 1
+invoc from vi 1
+invoc in non 1
+invoc is measur 1
+invoc mechan 2
+invoc of assign 1
+invoc of compar 1
+invoc of rel 1
+invoc of writer 1
+invoc on s4 1
+invoc on sequ 1
+invoc on slav 1
+invoc on writer 1
+invoc parameter 1
+invoc parameter valu 1
+invoc request 1
+invoc run 1
+invoc that match 1
+invoc tim 1
+invoc to determin 1
+invoc to extern 1
+invoc to loc 1
+invoc to perform 1
+invoc ultim 1
+invoc ultim identif 1
+invok 16
+invok a loc 1
+invok accept 1
+invok anywh 1
+invok by acc 1
+invok byimplicit 1
+invok byimplicit invok 1
+invok compar2 1
+invok compon 1
+invok compon int 1
+invok finish 1
+invok implicit 1
+invok in rec 1
+invok method 1
+invok method accept 1
+invok off lin 1
+invok on patholog 1
+invok other oper 1
+invok pm 1
+invok rar 1
+invok selecttest2 1
+invok simpl 1
+invok simpl an 1
+invok som appropr 1
+invok spec 1
+invok spec an 1
+invok th distribut 1
+invok th load 1
+invok th me 1
+invok th method 1
+invok th ordin 1
+invok th spec 1
+invok to ref 1
+invok using 1
+invok using built 1
+invok with p2 1
+invoker 1
+invokesexplicit 1
+invokesexplicit invok 1
+involut 83
+involut a car 1
+involut a gatew 1
+involut a hypoth 1
+involut a join 1
+involut a laser 1
+involut a lim 1
+involut a lin 1
+involut a me 1
+involut a particl 1
+involut a plur 1
+involut a rang 1
+involut a rev 1
+involut a sal 1
+involut a se 1
+involut a sequ 1
+involut a softwar 1
+involut a system 1
+involut a tradeoff 1
+involut a wid 1
+involut ad 1
+involut addit 1
+involut affect 1
+involut affect adapt 1
+involut al appl 1
+involut al proc 1
+involut allow 1
+involut an arbitr 1
+involut an autonom 1
+involut an exterior 1
+involut an inevit 1
+involut an init 1
+involut answer 1
+involut any particl 1
+involut any program 1
+involut ar es 1
+involut bil 1
+involut boolean 1
+involut boolean variabl 1
+involut build 1
+involut build caus 1
+involut ch 1
+involut client 1
+involut comb 1
+involut commun 2
+involut comput 1
+involut con 1
+involut concur 1
+involut concur writ 1
+involut connect 1
+involut constraint 1
+involut contextu 1
+involut contextu oper 1
+involut cost 1
+involut cost oper 1
+involut cur 1
+involut cur dat 1
+involut dat 1
+involut dat spread 1
+involut dec 1
+involut deep 1
+involut derefer 1
+involut dev 1
+involut dev suit 1
+involut differ empir 1
+involut divid 1
+involut ec 1
+involut ec quantif 1
+involut elimin 1
+involut elimin variabl 1
+involut ellipt 1
+involut ellipt equ 1
+involut employm 1
+involut enforc 1
+involut estim 1
+involut exampl 1
+involut exampl wh 1
+involut execut 1
+involut execut traff 1
+involut ext 2
+involut ext us 1
+involut extern 1
+involut extern refer 1
+involut fault 1
+involut fault modif 1
+involut find 1
+involut first design 1
+involut four datab 1
+involut four step 1
+involut gener 1
+involut great 1
+involut great simplif 1
+involut greater 1
+involut greater interact 1
+involut group 1
+involut high 1
+involut high order 1
+involut hyperbol 1
+involut hyperbol equ 1
+involut hypoth 1
+involut hypoth form 1
+involut im 1
+involut im superior 1
+involut impl 1
+involut implem 1
+involut implicit 2
+involut import 1
+involut import weight 1
+involut in accept 1
+involut in accompl 1
+involut in construc 1
+involut in dec 1
+involut in distribut 1
+involut in evalu 1
+involut in futur 1
+involut in interconnect 1
+involut in obtus 1
+involut in polynom 1
+involut in problem 1
+involut in produc 1
+involut in program 1
+involut in prompt 1
+involut in receiv 1
+involut in st 1
+involut in term 1
+involut in train 1
+involut increm 1
+involut increm expan 1
+involut integer 1
+involut integer div 1
+involut integr 1
+involut intern 1
+involut intern st 1
+involut is larger 1
+involut join 1
+involut long me 1
+involut ma 1
+involut ma amount 1
+involut man compl 1
+involut maxrol 1
+involut minim 1
+involut minim chang 1
+involut modif 1
+involut mor mathemat 1
+involut much specl 1
+involut multicast 1
+involut multipl 3
+involut multipl ch 1
+involut multipl chang 1
+involut multipl hop 1
+involut on lin 1
+involut onl cur 1
+involut over 1
+involut over privileg 1
+involut overload 1
+involut overload funct 1
+involut pa 2
+involut part 1
+involut particl 1
+involut particl problem 1
+involut partit 1
+involut random 1
+involut random number 1
+involut reach 1
+involut reach comput 1
+involut reassessm 1
+involut redesign 1
+involut reforml 1
+involut remov 1
+involut resolut 1
+involut resolut conflict 1
+involut rol 1
+involut rol configur 1
+involut run 1
+involut run tim 1
+involut self 1
+involut self gener 1
+involut separ 1
+involut separ disk 1
+involut server 1
+involut server sid 1
+involut sever dim 1
+involut sever stag 1
+involut simp 1
+involut simp mak 1
+involut singl 1
+involut singl lin 1
+involut solut 1
+involut som lim 1
+involut spat 1
+involut spat tempor 1
+involut specif 1
+involut st 1
+involut standard 1
+involut standard funct 1
+involut strateg 1
+involut structur 1
+involut tempor 1
+involut tempor attribut 1
+involut th addit 1
+involut th compl 1
+involut th complec 1
+involut th comput 1
+involut th construc 1
+involut th cur 1
+involut th design 1
+involut th elim 1
+involut th evalu 1
+involut th execut 1
+involut th expr 1
+involut th extent 1
+involut th fixpoint 1
+involut th im 1
+involut th imag 1
+involut th match 1
+involut th molecl 1
+involut th not 2
+involut th object 1
+involut th qu 1
+involut th regr 1
+involut th rest 1
+involut th select 1
+involut th specif 1
+involut th supergener 1
+involut th var 1
+involut th variabl 1
+involut thousand 1
+involut thr peopl 1
+involut triangl 1
+involut triangl polyhedr 1
+involut tw peopl 1
+involut tw ph 1
+involut tw reduc 1
+involut tw step 1
+involut tw writ 1
+involut upd 1
+involut upd gener 1
+involut using 1
+involut using intuit 1
+involut var 1
+involut with dispatch 1
+io 5
+io a.8 1
+io a.8 funct 1
+io cop 1
+io cop del 1
+io cost 1
+io cost tok 1
+io del 1
+io del mac 1
+io del min 1
+io dev 1
+io dev datadisk 1
+io dev dmdisk 1
+io dev logdisk 1
+io dev tok 1
+io fic 1
+io fic prec 1
+io iff 1
+io load 1
+io load del 1
+io m ib 1
+io rot 1
+io rot del 1
+io seek 1
+io seek del 1
+io tok 1
+io which correspon 1
+iodevicedefinit 1
+iodevicedefinit nodeclassdefinit 1
+iodevicedefinit nodeclassdefinit nodeclusterdefinit 1
+ionospher 1
+ionospher ir 1
+ionospher ir led 1
+iosifescu 1
+ip 11
+ip addr 1
+ip addr map 1
+ip addr using 1
+ip algorithm 1
+ip and xn 1
+ip byp 1
+ip ca1 1
+ip ca1 jmpleq 1
+ip ca3 1
+ip ca3 ad 1
+ip ca3 jmpeq 1
+ip comput 1
+ip e0 1
+ip failover 1
+ip failover mechan 1
+ip fl 1
+ip host 1
+ip host requir 1
+ip is increm 1
+ip is re 1
+ip is se 1
+ip may point 1
+ip method 1
+ip multicast 2
+ip point 1
+ip protocol 1
+ip protocol suit 1
+ip rp 1
+ip rp gp 1
+ip to ethernet 1
+ipc 1
+ipc interproc 1
+ipc interproc commun 1
+ipl.t 1
+ipm95 1
+iproc 1
+iproc n plur 1
+ipsc 4
+ipsc proc 1
+ipsc proc i860 1
+ipsc ser 1
+ipsc ser mach 1
+ipsc system 1
+ipsc system overview 1
+ipsc860 1
+ipsj 1
+ipsj sig 1
+ipsj sig not 1
+ipswich 1
+ipx 2
+iq 1
+iqb 1
+ir 19
+ir al clock 1
+ir cam 1
+ir commun 1
+ir educ 1
+ir educ tout 1
+ir egl 1
+ir egl er 1
+ir egl sur 1
+ir filter 1
+ir filter diameter 1
+ir for iw 1
+ir if 1
+ir irish 1
+ir j qu 1
+ir jr 1
+ir jr mn 1
+ir jw 1
+ir led 1
+ir led cr 1
+ir m iw 1
+ir modif 1
+ir njr 1
+ir njr kr 1
+ir ren 2
+iran 1
+ircam 1
+ircam in par 1
+irigoin 2
+irigoin and triol 1
+irisainstitutderechercheeninformatiqueetsyst 1
+irisainstitutderechercheeninformatiqueetsyst me 1
+irisainstitutderechercheeninformatiqueetsyst me atoiresp 1
+irish 1
+irm 1
+irm du 1
+irm du cerveau 1
+irn 1
+iron 2
+iron et al 1
+iron metabol 1
+irp 1
+irp 1bus 1
+irp 1bus pbus 1
+irreduc 1
+irreflec 1
+irreflec den 1
+irreflec den lin 1
+irregl 16
+irregl and incompr 1
+irregl and non 1
+irregl cod 1
+irregl commun 1
+irregl commun schem 1
+irregl control 1
+irregl control flow 1
+irregl dat 1
+irregl dat acc 1
+irregl discr 1
+irregl discr mesh 1
+irregl fp 1
+irregl fp int 1
+irregl graph 2
+irregl grid 1
+irregl grid appl 1
+irregl interconnect 1
+irregl layout 1
+irregl layout structur 1
+irregl mesh 1
+irregl network 1
+irregl network using 1
+irregl parallel 1
+irregl parallel program 1
+irregl program 1
+irregl rout 1
+irregl shap 1
+irregl shap object 1
+irregl structur 3
+irregl structur problem 2
+irregl surfac 1
+irregl switch 1
+irregl switch ba 1
+irregl topolog 2
+irregl turb 1
+irregl turb blad 1
+irregl vol 1
+irregl vol dat 1
+irregl96 1
+irrelev 8
+irrelev and autonom 1
+irrelev argum 1
+irrelev attribut 1
+irrelev in coar 1
+irrelev match 1
+irrelev to doduc 1
+irrelev to fp 1
+irrespect 5
+irrespect of internet 2
+irrevoc 1
+iruk 1
+irv 3
+irv mach 1
+irv mach learn 1
+irv traiger 1
+irv4 1
+irvin 1
+irx01 1
+is 13
+is a ch 1
+is a distribut 1
+is hierarch 1
+is iec 3
+is iec di 1
+is iec jtc1 2
+is is 1
+is latin 1
+is or inherit 1
+is proc 1
+is proc lin 1
+is proc plan 1
+is processorl 1
+is prolog 1
+is wg16 1
+is wg16 docum 1
+is xcal 1
+is.s 1
+is.s.u 1
+is.s.u tok.ac.jp 1
+is.sg.u 1
+is.sg.u tok.ac.jp 1
+is0 1
+is0 al aff 1
+is0 ont ib 1
+is0 to gener 1
+isaac 1
+isbn 1
+isc 1
+isd 1
+isd bericht 1
+isdn 2
+isdn and asynchron 1
+isdn architectur 1
+isdn system 2
+isenhour 1
+iserl 1
+iserl et al 1
+isharp 1
+ishfaq 1
+ishfaq ahmad 1
+ishikaw 2
+ishikaw and tokor 1
+isjunior 1
+island 7
+islower 1
+ismail 1
+isnumconst 1
+isod 1
+isod cluster 1
+isod cluster algorithm 1
+isoint 1
+isoint surfac 1
+isol 23
+isol an en 1
+isol and appropr 1
+isol and identif 1
+isol but lead 1
+isol chang 1
+isol ee 1
+isol el 1
+isol ement 2
+isol es 1
+isol in interv 1
+isol int distinct 1
+isol is nec 1
+isol me 1
+isol me overhead 1
+isol of flow 1
+isol phr 1
+isol proper 1
+isol simpl 1
+isol simpl eigenvalu 1
+isol text 1
+isol th appl 1
+isol th influ 1
+isol th langu 1
+isol th multicast 1
+isol th tim 1
+isol without tak 1
+isol word 1
+isol word recognit 1
+isomorph 8
+isomorph and den 1
+isomorph by equiv 1
+isomorph de 1
+isomorph de graph 1
+isomorph di 1
+isomorph hold 1
+isomorph problem 1
+isomorph vi hi 1
+isosurfac 1
+isosurfac which confirm 1
+isotrop 1
+isovalu 1
+isr 2
+isr el 1
+isr el qu 1
+isr israel 1
+israel 9
+israel and li 1
+israel and ming 1
+isrn 2
+isrn sic 1
+issn 9
+issroff 1
+isst 1
+isst.fhg.de 1
+isstrconst 1
+issu 78
+issu a quit 1
+issu about incorpor 1
+issu addr 1
+issu affect 1
+issu and algorithm 1
+issu and perform 1
+issu and perspectiv 1
+issu and refin 1
+issu ar 1
+issu ar addr 1
+issu ar compl 1
+issu ar encapsl 1
+issu as perceiv 1
+issu beyon unicast 1
+issu cruc 1
+issu de 4
+issu de deux 1
+issu de fluc 1
+issu de la 3
+issu de loptim 1
+issu de pap 1
+issu de travaux 1
+issu disc 1
+issu discover 1
+issu dun 1
+issu dun etud 1
+issu dun tir 1
+issu dur system 1
+issu explicit 1
+issu explicit order 1
+issu f op 1
+issu for log 1
+issu for mobil 1
+issu for robust 1
+issu from pfefferkorn 1
+issu from prev 1
+issu go 1
+issu in build 1
+issu in compil 1
+issu in construc 1
+issu in design 3
+issu in implem 3
+issu in load 1
+issu in narx 1
+issu in natur 1
+issu in object 1
+issu in sect 2
+issu inclus 1
+issu inclus minim 1
+issu involut 6
+issu involut var 1
+issu is me 1
+issu may mak 1
+issu memor 1
+issu memor acc 1
+issu not addr 1
+issu of algorithm 1
+issu of cach 1
+issu of complec 1
+issu of control 1
+issu of defin 1
+issu of dynam 1
+issu of eff 1
+issu of el 1
+issu of extern 2
+issu of fault 1
+issu of handl 1
+issu of implem 1
+issu of inst 1
+issu of multiproc 1
+issu of mutu 1
+issu of polymorph 1
+issu of preserv 1
+issu of regr 1
+issu of rel 1
+issu of rol 1
+issu of self 1
+issu of sem 1
+issu of sigplan 2
+issu of trac 1
+issu of transact 1
+issu of us 1
+issu on architectur 1
+issu on caus 1
+issu on cod 1
+issu on intellig 1
+issu on neur 1
+issu on parallel 1
+issu on virtu 1
+issu on vual 1
+issu on wavel 1
+issu quer 1
+issu ra 1
+issu rat 1
+issu rel 11
+issu relev 1
+issu requir 1
+issu respectiv 1
+issu respectiv du 1
+issu th command 1
+issu th lowest 1
+issu that ar 1
+issu that industr 1
+issu then ar 1
+issu we int 1
+issu we want 1
+issu when giv 1
+issu which ar 1
+issu with respect 1
+issus 3
+issus de 2
+issus de ce 1
+issus de notr 1
+issus de propr 1
+issus dexp 1
+issus dexp er 1
+issus du 1
+issus du cr 1
+issus dun 1
+issus dun cr 1
+ist 3
+ist bmd 1
+ist repr 1
+ist repr um 1
+ist zur 1
+ist zur publik 1
+istok 1
+isvl 1
+isvl al support 1
+isvl approach 1
+isvl ar tak 1
+isvl automat 1
+isvl automat record 1
+isvl cod 1
+isvl cod develop 1
+isvl compar 1
+isvl embod 1
+isvl environm 1
+isvl featur 1
+isvl http 1
+isvl http protocol 1
+isvl in respon 1
+isvl int rec 1
+isvl interfac 1
+isvl is ba 1
+isvl is comp 1
+isvl is shown 1
+isvl prov 1
+isvl server 1
+isvl support 1
+isvl support stud 1
+isvl tak 1
+isvl therefor 1
+isvl therefor redef 1
+isvl wil allow 1
+isvl wil form 1
+isvl wil il 1
+it 12
+it and meyer 1
+it from cod 1
+it ital 1
+it slot 1
+it slot descript 1
+it tetrahedr 1
+it.kth.se 1
+itab 1
+itab tmp 1
+itab tmp c0 1
+itab1 1
+itab1 vy 1
+ital 6
+ital font 1
+item 23
+item and blank 1
+item and phr 1
+item and resourc 1
+item ar ad 1
+item ar automat 1
+item ar blank 1
+item ar bound 1
+item ar chang 1
+item ar contain 1
+item ar del 1
+item ar describ 1
+item ar lik 1
+item ar shift 1
+item avail 1
+item ba 1
+item can caus 1
+item cont 1
+item del 1
+item ea 1
+item el 1
+item el cur 1
+item enter 1
+item fac 1
+item fal 1
+item gener 1
+item gener profil 1
+item in computer 1
+item in memor 1
+item in natur 1
+item in order 1
+item in posit 1
+item in quest 1
+item in se 1
+item ind 1
+item int 1
+item int ge 1
+item is bound 1
+item is init 1
+item is mov 1
+item it contain 1
+item must tak 1
+item number 1
+item number num 1
+item or nl 1
+item perceiv 1
+item posit 1
+item pr 1
+item principl 1
+item remain 1
+item st 1
+item t ge 1
+item that flow 1
+item through pr 1
+item to invok 1
+item us 1
+item var 1
+item void 1
+item void remov 1
+iten 1
+iten dispon 1
+iten dispon ve 1
+iter 44
+iter a rel 1
+iter accord 1
+iter al affect 1
+iter algorithm 4
+iter algorithm exampl 1
+iter algorithm model 1
+iter algorithm proceed 1
+iter algoritm 1
+iter and execut 1
+iter and individu 1
+iter ar alloc 1
+iter ar altern 1
+iter ar assign 1
+iter ar avail 1
+iter ar coupl 1
+iter ar execut 1
+iter ar known 1
+iter ar proport 1
+iter ar shown 1
+iter ar span 1
+iter ar suf 1
+iter begin 1
+iter block 1
+iter by sen 1
+iter can stop 1
+iter con 1
+iter con sol 1
+iter construc 1
+iter counter 1
+iter de 1
+iter de la 1
+iter decr 1
+iter decr m0 1
+iter determin 1
+iter developm 1
+iter distribut 1
+iter distribut ba 1
+iter ec 1
+iter enforc 1
+iter for find 1
+iter grow 1
+iter grow slight 1
+iter ha compl 1
+iter ha fin 1
+iter i0 1
+iter in iter 1
+iter in natur 1
+iter in prolog 1
+iter incr 1
+iter ind 1
+iter init 1
+iter init configur 1
+iter involut 2
+iter is consider 1
+iter is continu 1
+iter is distribut 1
+iter is equ 1
+iter is execut 1
+iter is inser 1
+iter is near 1
+iter is particl 1
+iter is perform 1
+iter is solut 1
+iter is stop 1
+iter issu 1
+iter issu rat 1
+iter lat 1
+iter lat comput 1
+iter level 2
+iter maxim 1
+iter method 6
+iter next arg 1
+iter number 1
+iter number correspon 1
+iter of doacr 1
+iter of stat 1
+iter of var 1
+iter on proc 1
+iter or invent 1
+iter pattern 1
+iter point 1
+iter point match 1
+iter predict 1
+iter predict var 1
+iter proc 3
+iter proc converg 1
+iter proc start 1
+iter procedur 2
+iter proceed 1
+iter produc 1
+iter prolog 1
+iter prolog program 1
+iter requir 3
+iter requir li 1
+iter result 1
+iter reweight 1
+iter schedl 1
+iter schem 1
+iter short 1
+iter siml 1
+iter siml using 1
+iter solut 1
+iter solver 1
+iter spac 4
+iter spac acc 1
+iter spac assoc 1
+iter spac distribut 1
+iter spac polyhedr 1
+iter spac using 1
+iter stag 1
+iter step 4
+iter step nec 1
+iter subdiv 1
+iter suff 1
+iter techniqu 1
+iter th compon 1
+iter th criter 1
+iter th proc 2
+iter th recur 1
+iter th se 1
+iter th vect 1
+iter that cal 1
+iter then lower 1
+iter tim 1
+iter to com 1
+iter to incr 1
+iter wa stop 1
+iter wil tak 1
+iter with scal 1
+iter without scal 1
+iter xi 2
+itg 1
+itg gi 1
+ith 18
+ith bit 3
+ith bit posit 1
+ith bundl 1
+ith bundl eman 1
+ith coeff 1
+ith column 1
+ith compon 2
+ith del 1
+ith del oper 1
+ith diagon 1
+ith el 1
+ith el show 1
+ith group 2
+ith hyperedg 1
+ith iter 2
+ith iter ec 1
+ith log 1
+ith log track 1
+ith memoryload 1
+ith nod 1
+ith order 1
+ith order respect 1
+ith posit 1
+ith real valu 1
+ith row 1
+ith run 1
+ith siftdown 1
+ith sort 1
+ith sort se 1
+ith subar 1
+ith subband 1
+ith symbol 1
+ith tim 1
+ith tim step 1
+ith track 1
+ith unit 1
+ith unit column 1
+ithac 6
+ithac ny 1
+itl 1
+itl prepubl 1
+itl prepubl ser 1
+itr 1
+itr de 1
+itr de ceux 1
+itr tous 1
+itr tous le 1
+itrison 1
+itrison la 1
+itrison la signif 1
+iu 1
+iv 18
+iv ev 1
+iv further 1
+iv further exampl 1
+iv postproc 1
+iv pr 1
+iv un 1
+iv un etud 1
+iv.1 1
+iv.1 rel 1
+iv.1 rel distribut 1
+iv.2 1
+iv.2 th camelot 1
+iv.b 1
+ivan 2
+ivan sag 1
+ivar 1
+ivar jacob 1
+ivy 1
+iw 1
+iw allow 1
+iw ir 1
+iw jr 1
+iw jr ir 1
+iw jw 1
+iw m ir 1
+iw njw 1
+iw njw kw 1
+iw njw mn 1
+iwan 1
+iwanag 1
+iwarp 1
+iwm 1
+ix 5
+ix explain 1
+ix rc 1
+ix wa collect 1
+iy 2
+iyengar 1
+iyer 1
+iyv 1
+iz 1
+j.a 7
+j.a.n 1
+j.b 2
+j.b.domingu 1
+j.b.j 1
+j.c 4
+j.d 7
+j.de 1
+j.e 4
+j.f 5
+j.g 1
+j.ghosh 1
+j.ghosh and a.c.bovik 1
+j.gu 1
+j.h 4
+j.hench 1
+j.hench read.ac.uk 1
+j.j 4
+j.j mor 1
+j.j mor navar 1
+j.j.hwang 1
+j.k 3
+j.k bennet 1
+j.l 5
+j.m 7
+j.m st 1
+j.p 3
+j.p.martin 1
+j.p.martin and e.m.morgad 1
+j.r 2
+j.s 5
+j.se 1
+j.t 2
+j.targ.se 1
+j.targ.se do remov 1
+j.w 3
+j.w.j 1
+j0 5
+j0 0m 1
+j0 0m sg 1
+j0 and en 1
+j0 dan 1
+j0 dan le 1
+j0 dan linterv 1
+j0 en 1
+j0 en util 1
+j00 1
+j00 ar color 1
+j0s 1
+j0s fragm 1
+j0s fragm ident 1
+j0s level 1
+j0s level number 1
+j1 7
+j1 2k1 1
+j1 i1 1
+j1 i1 j2 1
+j1 j1 1
+j1 j1 j2 1
+j1 j2 1
+j1 jj1 1
+j1 jmin 1
+j1 jn 1
+j1 jn j1 1
+j1 k1 1
+j1 lj1 1
+j1 t2 1
+j1 t2 j2 1
+j2 7
+j2 donc 1
+j2 i1 1
+j2 i2 1
+j2 j1 2
+j2 j1 j1 1
+j2 lj2 1
+j2 mac 1
+j2b 1
+j2e 1
+j2e tj 1
+j2j 1
+j2j xj 1
+j2k 1
+j2k avec 1
+j2kjqj 1
+j3 1
+j3 c le 1
+ja 8
+ja aus 1
+ja aus grand 1
+ja beaucoup 1
+ja beaucoup appr 1
+ja j hh 1
+ja pr 1
+ja pu 1
+ja pu avoir 1
+jaakkol 1
+jabbar 1
+jac84 1
+jac94 1
+jacent 3
+jacent est 1
+jacent sont 1
+jacent sont conserv 1
+jack 1
+jackel 2
+jackknif 1
+jackknif for multidim 1
+jackson 2
+jackson system 1
+jackson system developm 1
+jacm 5
+jacob 7
+jacob ca 1
+jacob de 1
+jacob de ce 1
+jacob de fonct 1
+jacob de la 1
+jacob du 1
+jacob du produit 1
+jacob est 1
+jacob est la 1
+jacob et soulign 1
+jacob lik procedur 1
+jacob or bessel 1
+jacob ou 1
+jacob ou di 1
+jacob polynom 1
+jacob polynom fp 1
+jacob sexprim 1
+jacob sexprim par 1
+jacob soit 1
+jacob stein 1
+jacobson 2
+jacqu 1
+jacqu noy 1
+jaeckel 1
+jaeckel design 1
+jaeckel select 1
+jaeckel select coordin 1
+jaekel 1
+jaff 1
+jaffar 3
+jaffar and m.j 1
+jag 2
+jag sol 1
+jag sol lin 1
+jag90 1
+jagad 2
+jahan 1
+jaij 1
+jaimer 1
+jaimer citer 1
+jain 3
+jair 1
+jaj 5
+jaj jbj 2
+jaj kg 1
+jajg 1
+jajod 1
+jajszczyk 1
+jakob 1
+jakob niel 1
+jakob peter 1
+jakob peter niel 1
+jalb 2
+jalb et al 1
+jalb examinateur 1
+jalb examinateur andr 1
+jam 8
+jam a moin 1
+jam barnet 1
+jam de 1
+jam de part 1
+jam donahu 1
+jam eu 1
+jam eu de 1
+jam laudon 1
+jam moin 1
+jam moin dun 1
+jam parson 1
+jam un 1
+jam un eff 1
+jam util 1
+jam wilson 1
+jam york 1
+jamov 1
+jampel 1
+jampel construc 1
+jan 19
+jan edler 1
+jan et al 1
+jan van 1
+jan van leeuw 1
+janeir 1
+janson 1
+janu 43
+januar 1
+janv 2
+jap 2
+jap japan 1
+jap jew 1
+jap math.bath.ac.uk 1
+japan 12
+japan character 1
+japan character recognit 1
+japan fdetail 1
+japan fdetail is.s 1
+japon 1
+jaquel 1
+jaquel susan 1
+jaquel susan novel 1
+jargon 1
+jargon util 1
+jason 1
+jason pen 1
+jaswinder 1
+jaswinder pal 1
+jaswinder pal singh 1
+jaumard 1
+jaumard et.al 1
+jaur 1
+jaur bu 1
+jaur bu la 1
+jav 4
+jav awar 1
+jav awar browser 1
+jav b ejar 1
+jav bytecod 1
+jav bytecod compiler1 1
+jav cod 1
+jav compl 1
+jav compl browser 1
+jav.html 1
+jav.sun.com 1
+jav2 1
+jav2 enabl 1
+jav2 enabl browser 1
+jay 1
+jayaraman 1
+jayn 1
+jayn.book 1
+jaynesbook.html 1
+jazwinsk 1
+jazz.ric.edu 1
+jb 2
+jb aik 1
+jb aik jd 1
+jb jd 1
+jbf 1
+jbf random.wustl.edu 1
+jbg 1
+jbij 1
+jbj 4
+jbjg 1
+jc 6
+jc hunkn 1
+jc1j 1
+jc2j 1
+jc2j jc1j 1
+jcij 1
+jcj 1
+jcj t bt 1
+jcjc 1
+jcover 1
+jcruisespeed 1
+jcruisespeedj 1
+jd 2
+jd cs.strath.ac.uk 1
+jd est 1
+jd jd 1
+jdj 1
+jdk 1
+jdp 1
+jdpl 1
+je 5
+je cr 1
+je cr pourt 1
+je fait 1
+je le 1
+je le remerc 1
+je me su 1
+je remerc 1
+je remerc daniel 1
+je voudr 2
+je voudr aus 1
+je voudr dabord 1
+je voudr egal 1
+je voudr en 1
+je voudr remerc 2
+je0j 1
+je1 1
+je1j 1
+je1j je2j 1
+je1j je2j 2n 1
+je2j 1
+je2j 2n 1
+jean 10
+jean bolot 1
+jean claud 1
+jean claud syr 1
+jean daniel 1
+jean daniel boissonnat 1
+jean harrold 1
+jean lou 1
+jean lou lassez 1
+jean loup 1
+jean loup baer 1
+jean michel 1
+jean michel beacc 1
+jean omn 1
+jean pier 2
+jean pier ban 2
+jean yv 2
+jean yv girard 2
+jeev 1
+jeev et pouv 1
+jeff 3
+jeff dalt 1
+jeff thom 1
+jeffr 7
+jeffr scot 1
+jeffr scot vitter 1
+jeffr shallit 1
+jeffr92 1
+jej 5
+jej je0j 1
+jen 4
+jen and le 1
+jen et al 1
+jen frank 1
+jen frank jen 1
+jen jen 1
+jennifer 2
+jennifer seber 1
+jer 12
+jer com 1
+jerem 1
+jeroslow 1
+jeroslow and wang 1
+jeroslow wang 1
+jeroslow wang rl 1
+jerusalem 5
+jerusalem israel 1
+jeu 3
+jeu de 2
+jeu de don 1
+jeu de la 1
+jeu dinstruc 1
+jeu dinstruc manipl 1
+jeu dinstruc perm 1
+jeu dinstruc util 1
+jeu lorsquil 1
+jeu lorsquil sagit 1
+jeu sont 1
+jeu sont suffisam 1
+jeun 1
+jeun qu 1
+jeun qu le 1
+jeux 1
+jeux dinstruc 1
+jew 1
+jew jewish 1
+jewish 1
+jf 6
+jf j test 1
+jf j typ 1
+jf jc 1
+jfagj 1
+jfb 1
+jfc 1
+jfdj 1
+jff 2
+jff gj 1
+jff1 1
+jff1 et jff2 1
+jff2 1
+jff2 se 1
+jff2 se deux 1
+jffl 1
+jffl nodesj 1
+jffl nodesj proc 1
+jfg 1
+jfh 1
+jfij 1
+jfj 2
+jfjgj 1
+jfk 1
+jfork 1
+jfv 1
+jg 9
+jg est 1
+jg hav execut 1
+jg mi 1
+jg nvt 1
+jg with phy 1
+jg1 1
+jg2q 1
+jg2q bi 1
+jg93 1
+jgoalvar 1
+jgoalvar j solut 1
+jh 1
+jhij 1
+jhingran 1
+jhu 1
+ji 4
+ji bing 1
+ji bing yu 1
+ji ei 1
+ji et ki 1
+ji j wh 1
+ji ki 1
+ji kmac 1
+ji ms 1
+ji ms ki 1
+ji sont 1
+ji sont calcl 1
+ji1 1
+jiang 2
+jianp 1
+jicslp 1
+jifeng 2
+jignesh 1
+jignesh patel 1
+jigsaw 1
+jigsaw puzzl 1
+jigsaw puzzl prov 1
+jij 2
+jij jjj 1
+jijj 1
+jik 1
+jil 1
+jilk 1
+jim 6
+jim dav 1
+jim de 1
+jim de riv 1
+jim fol 1
+jim gr 1
+jim mullin 1
+jim plank 1
+jir 1
+jitter 1
+jitter bound 1
+jitter by del 1
+jitter earliest 1
+jitter earliest du 1
+jj 7
+jj direct 1
+jj direct edg 1
+jj en 1
+jj et quen 1
+jj iproc 1
+jj je 1
+jj min 1
+jj obntim 1
+jj obntim e2t 1
+jj p random 1
+jj s2 1
+jj typ 1
+jj typ de 1
+jj1 1
+jjj 1
+jjjjjjj 1
+jk 5
+jk 1p 1
+jl 61
+jl 31st 1
+jl aug 1
+jl august 2
+jl in iter 1
+jl nj 1
+jl padg 1
+jm 4
+jm et termin 1
+jm etant 1
+jm0j 1
+jm0j pb 1
+jm86 1
+jmac 2
+jmac sont 1
+jmac sont le 1
+jmap 1
+jmin 2
+jmin et jmac 1
+jmin n knsn 1
+jml 1
+jmp 1
+jmpcc 1
+jmpcc fal 1
+jmpeq 1
+jmpleq 1
+jmr 1
+jn 12
+jn ce 1
+jn gj 1
+jn gn 1
+jn j1 1
+jn j1 jn 1
+jn jo 1
+jn m jn 1
+jn mac 1
+jn n ib 1
+jn s e0 1
+jn s eng 1
+jn0 1
+jn0 becom 1
+jn0 becom jt 1
+jn0 cp 1
+jn1 1
+jn1 n2 1
+jn2 1
+jng 2
+jng and 8ik 1
+jnj1 1
+jnj1 j1 1
+jnj1 j1 jn 1
+jnpj 1
+jnpj deg 1
+jo 13
+jo ar old 1
+jo e meseguer 1
+jo in io 1
+jo io 1
+jo princip 1
+jo t.v 1
+jo zef 1
+jo zef stefan 1
+joachim 1
+joachim schimpf 1
+joachimiak 1
+joan 1
+joan dugan 1
+job 11
+job ar schedl 1
+job block 1
+job con 1
+job consum 1
+job in distribut 1
+job in hand 1
+job of ch 1
+job schedl 1
+job shop 1
+job shop schedl 1
+job string 1
+job substr 1
+job to tim 1
+job with length 1
+job yield 1
+jobj 1
+jobj can term 1
+jobj may en 1
+jobj may start 1
+jobt 1
+jock 1
+joel 3
+joel ai.iit.nrc.ca 1
+joel martin 1
+joel saltz 1
+joh74 1
+joh95 1
+john 36
+john barn 1
+john domingu 1
+john domingu paul 1
+john fitch 1
+john forrest 1
+john ftoysg 1
+john heideman 1
+john hen 2
+john hopkin 3
+john hugh 1
+john johnson 1
+john matiasek 1
+john mccr 1
+john mcpherson 1
+john mitchel 1
+john moor 1
+john reynold 1
+john stapl 1
+john toy 1
+john toy jan 1
+john wawrzynek 1
+john wil 12
+john wil son 7
+john wil soon 1
+john92 1
+johnathon 1
+johnathon gibbon 1
+johnson 25
+johnson and colbrook 1
+johnson and keshav 1
+johnson and lapaugh 1
+johnson and lionnel 1
+johnson and m.e 1
+johnson and william 1
+johnson kotz 1
+johnson maxim 1
+johnson maxim satisf 1
+johnson opdyk 1
+johnson pk 1
+johnson pk ci.ufl.edu 1
+johnst 2
+johnst5 1
+joich 1
+join 23
+join algorithm 1
+join and enumer 1
+join attachm 1
+join attribut 1
+join continu 1
+join continu act 1
+join correspon 1
+join correspon ver 1
+join execut 1
+join execut model 1
+join improv 1
+join in quer 1
+join induit 1
+join involut 1
+join involut tempor 1
+join is requir 1
+join model 1
+join of tempor 1
+join oper 1
+join oper incr 1
+join optim 1
+join pour 1
+join pour en 1
+join qu 2
+join qu program 1
+join quer 1
+join sl 1
+join step 1
+join synchron 1
+join th childr 1
+join th cur 1
+join th junior 1
+join th multicast 1
+join th opposit 1
+join th se 1
+join th senior 1
+join th shortest 1
+join th tr 1
+join to cluster 1
+join to form 1
+join tw hybrid 1
+join using 1
+join ver 1
+joint 24
+joint computer 2
+joint computer sc 1
+joint consider 1
+joint den 1
+joint den satisf 1
+joint developm 1
+joint developm work 1
+joint endeavour 1
+joint exhaust 1
+joint expr 1
+joint handl 1
+joint intl 2
+joint maximiz 1
+joint prob 1
+joint prob distribut 1
+joint program 1
+joint program off 1
+joint project 1
+joint project ap 1
+joint support 1
+joint transform 1
+joint transform con 1
+joint transform fffl1 1
+joint work 2
+jol 2
+jolion 1
+jom 1
+jon 11
+jon for ib3 1
+jon for introduc 1
+jon lou 1
+jon lou bentl 1
+jon sketch 1
+jon90 1
+jon93 1
+jon94 1
+jonathan 4
+jonathan coh 1
+jonathan pr 1
+jonathan re 1
+jonathan.bow 1
+jonathan.bow comlab.ox.ac.uk 1
+jong 2
+jong d emontr 1
+jonh 1
+jonh wil 1
+jonh wil son.1990 1
+jonsson 1
+jorck 1
+jorck og 1
+jorck og hustrus 1
+jordan 2
+jorg 1
+jorg nolt 1
+joseph 12
+joseph and kenneth 1
+joseph and soar 1
+joseph four 1
+joseph four grenobl 1
+joseph gogu 2
+joseph j aj 1
+joseph jaj 1
+joseph mund 1
+josh 1
+josk 1
+jossom 1
+jossom ear id 1
+jou 2
+jou e par 1
+jou quun 1
+jou quun simpl 1
+jouannaud 1
+jouent 1
+jouent le 1
+jouer 1
+jouer en 1
+jouer en faveur 1
+jouerait 1
+jouerait le 1
+joup 1
+jour 7
+jour a chaqu 2
+jour a la 1
+jour a tout 1
+jour affect 1
+jour affect de 1
+jour afin 1
+jour afin de 1
+jour ajout 1
+jour alor 1
+jour alor qu 1
+jour appart 1
+jour appart maint 1
+jour avant 1
+jour avant de 1
+jour avec 1
+jour avec la 1
+jour ce 1
+jour ce pointeur 1
+jour certain 1
+jour con 1
+jour con ecutiv 1
+jour conditionnel 1
+jour conditionnel don 1
+jour conditionnel fait 1
+jour conditionnel par 1
+jour correspon 1
+jour correspon na 1
+jour cour 1
+jour d ag 1
+jour dan 1
+jour dan le 1
+jour de 2
+jour de attribut 1
+jour de c1 1
+jour de c2 1
+jour de droit 1
+jour de estampil 1
+jour de gb 1
+jour de la 1
+jour de lattribut 1
+jour de lestampil 1
+jour de leur 1
+jour de man 1
+jour de pointeur 1
+jour de register 1
+jour de tout 1
+jour demand 1
+jour doiv 1
+jour doiv etr 1
+jour du 2
+jour du champ 1
+jour du compteur 1
+jour du drapeau 1
+jour du point 1
+jour du som 1
+jour du tableau 1
+jour dun 1
+jour dun attribut 1
+jour dun cel 1
+jour effectu 1
+jour effectu ee 1
+jour en 1
+jour en con 1
+jour en plac 1
+jour est 1
+jour est aus 1
+jour est don 1
+jour est effectu 1
+jour est enregister 1
+jour est inconditionnel 1
+jour et donc 1
+jour et point 1
+jour explicit 1
+jour explicit par 1
+jour implicit 1
+jour implicit du 1
+jour inconditionnel 1
+jour inconditionnel beaucoup 1
+jour inconditionnel le 1
+jour inconditionnel par 1
+jour indiqu 1
+jour indiqu qu 1
+jour l etat 1
+jour la 2
+jour la ba 1
+jour la cel 1
+jour le 2
+jour le champ 1
+jour le compteur 1
+jour le deux 1
+jour le estampil 1
+jour le point 1
+jour le propr 1
+jour le register 1
+jour le som 1
+jour linform 1
+jour linform de 1
+jour lor 1
+jour lor de 1
+jour lor dun 1
+jour mi 1
+jour multipl 1
+jour ne 1
+jour ne comport 1
+jour ne cont 1
+jour nest 1
+jour nest donc 1
+jour nest pa 1
+jour nest toutef 1
+jour ou 1
+jour ou ne 1
+jour par 1
+jour par substitut 1
+jour peut 1
+jour peut ain 1
+jour peut etr 1
+jour peut seffectuer 1
+jour peuv 1
+jour peuv alor 1
+jour pour 1
+jour pr 1
+jour pr ec 1
+jour r eversibl 1
+jour requ 1
+jour requ soit 1
+jour san cr 1
+jour sont 1
+jour sont alor 1
+jour successiv 1
+jour successiv de 1
+jour suiv 1
+jour suiv de 1
+jour test3 1
+jour test3 mi 1
+jour un attribut 1
+jour un point 1
+jour un register 1
+jour un sous 1
+jour var 1
+jour var var 1
+journ 6
+journ doit 1
+journ doit sadapter 1
+journ ee 2
+journ ee an 1
+journ ee de 1
+journ ee franc 1
+journ es 1
+journ es or 1
+journ g en 1
+journ quel 1
+journ quel util 1
+jovanovich 3
+jovanovich colleg 1
+jovanovich publ 1
+joy 1
+jp 4
+jp93 1
+jp94 1
+jpb 1
+jpdraw 1
+jpeg 2
+jpeg algorithm 1
+jpeg basel 1
+jpeg basel system 1
+jpeg cod 1
+jpeg cod imag 1
+jpeg compr 1
+jpeg compr imag 1
+jpeg dct 1
+jpeg dct algorithm 1
+jpeg dct compr 1
+jpeg method 1
+jpeg stil imag 1
+jpl 1
+jq 2
+jq in m0 1
+jq0j 1
+jqij 1
+jqj 2
+jqj and jy1j 1
+jqj is finit 1
+jqj j sf 1
+jqj st 1
+jr 11
+jr for jw 1
+jr ir 1
+jr iw 1
+jr iw ir 1
+jr mn 1
+jr mn iw 1
+jr0n 1
+jr1n 1
+jrin 1
+jrj 1
+jrn 1
+jrtj 1
+js 6
+js denot 1
+js j jsj 1
+js ptj 1
+jsd95 1
+jsij 1
+jsj 2
+jsj denot 1
+jsj js 1
+jsp 1
+jsp eng 1
+jsq 1
+jssst 1
+jssst intern 1
+jt 9
+jt i1 1
+jt i2j 1
+jt j bit 1
+jt j me 1
+jt j tim 1
+jt jn 1
+jt jn0 1
+jt jn0 becom 1
+jt jn0 cp 1
+jt jn2 1
+jt1 1
+jtail 1
+jtc1 2
+jtc1 sc2 1
+jtc1 sc2 wg8 1
+jtc1 sc29 1
+jtc1 sc29 wg11 1
+jth 8
+jth branch 1
+jth buck 1
+jth buck con 1
+jth buck sj 1
+jth bus 1
+jth bus period 1
+jth chunk 1
+jth column 1
+jth compon 1
+jth del 1
+jth del oper 1
+jth incom 1
+jth incom edg 1
+jth iter 1
+jth mach 1
+jth me 1
+jth pack 1
+jth server 1
+jth symbol 1
+jth task 1
+jth uncolor 1
+jth uncolor branch 1
+jtij 1
+jtj 1
+ju 2
+ju uc 1
+juan 2
+jublog 1
+jublog tc 1
+jublog tc 1j 1
+jud 4
+jud ch 1
+jud datasystemer 1
+jud list 1
+jud list manag 1
+jud us 1
+judg 9
+judg accord 1
+judg ar mutu 1
+judg by compar 1
+judg form 1
+judg form subtyp 1
+judg hardwar 1
+judg hardwar multicast 1
+judg test 1
+judg test correct 1
+judg to harsh 1
+judicieus 2
+judicieus de 1
+judicieus de register 1
+judicieus synchron 1
+judicieus synchron ee 1
+judicieux 2
+judicieux daxer 1
+judicieux daxer se 1
+judicieux de 1
+judicieux de fair 1
+juelich.de 2
+jug 3
+jug de 1
+jug de ce 1
+jug es 2
+jug es com 1
+jug es inutil 1
+jug quil 1
+jug quil apport 1
+juger 2
+juger de 2
+juger de leoecacit 1
+juger de lutilit 1
+juger mon 1
+juger mon travail 1
+juil 1
+juin 3
+juj 1
+juk 1
+juk box 1
+julianalaan 2
+jump 10
+jump ahead 1
+jump ahead connect 1
+jump and branch 1
+jump dest 1
+jump instruc 2
+jump int prov 1
+jump loop 1
+jump loop dupl 1
+jump occur 1
+jump or branch 1
+jump predict 1
+jump predict addr 1
+jump predict capabil 1
+jump siz 1
+jump targ 1
+jump targ wh 1
+jumpleq 1
+jumpleq etc 1
+jun 54
+jun gu 1
+jun jl 2
+jun lu 1
+junct 2
+junct graph 1
+junct tr 2
+junct tr condit 1
+junct tr correspon 1
+junct tr displ 1
+junct tr ext 1
+junct tr giv 1
+junct tr hold 1
+junct tr propag 1
+junct tr proper 1
+junct tr simplif 1
+junct tr yield 1
+jungclaus 1
+junior 2
+junior and common 1
+junior and senior 1
+junior and superior 1
+junior en 1
+junior level 1
+junior level undergradu 1
+junior oper 1
+junior relationship 1
+junior relationship denot 1
+junior relationship ec 1
+junior relationship inclus 1
+junior rol 1
+junior rol exerc 1
+junior rol se 1
+junior se 1
+junior senior 1
+junior senior relationship 1
+jup 1
+jur 2
+jur malgr 1
+jurg 1
+jurg schmidhuber 1
+jurij 1
+jurij silc 1
+jusqu 4
+jusqu a 2r 1
+jusqu a ar 1
+jusqu a bon 1
+jusqu a ce 2
+jusqu a condit 1
+jusqu a la 2
+jusqu a lapparit 1
+jusqu a lec 1
+jusqu a loccur 1
+jusqu a obtenir 1
+jusqu a pm 1
+jusqu a pr 1
+jusqu a tr 1
+jusqu a un 1
+jusquau 2
+jusquau d epart 1
+jusquau minim 1
+jusquau minim don 1
+jusquau moment 1
+jusquau moment de 1
+jusquau point 1
+jusquau point cou 1
+jusquau prem 1
+jusquau prem appel 1
+just 5
+just avant 1
+just avant la 1
+just avant lappel 1
+just avant lun 1
+just d etr 1
+just es 1
+just lutil 1
+just lutil de 1
+just qu 1
+just qu naut 1
+just titr 1
+just titr com 1
+justif 23
+justif a concr 1
+justif a direct 1
+justif and war 1
+justif andreol 1
+justif de 2
+justif de lempl 1
+justif de tout 1
+justif dun 1
+justif dun var 1
+justif e ba 1
+justif e dan 1
+justif e sur 1
+justif e util 1
+justif ee 1
+justif es 1
+justif es assur 1
+justif es en 1
+justif es garantit 1
+justif es ne 1
+justif es sest 1
+justif es111 1
+justif es113 1
+justif es115 1
+justif es117 1
+justif essentiel 1
+justif essentiel par 1
+justif for using 2
+justif further 1
+justif further empir 1
+justif hav mach 1
+justif in describ 1
+justif in group 1
+justif is im 1
+justif l etud 1
+justif le 1
+justif le ch 1
+justif lhypoth 1
+justif lhypoth es 1
+justif lint 1
+justif lint er 1
+justif pa 1
+justif pa de 1
+justif par 2
+justif par la 1
+justif par le 1
+justif par un 1
+justif sever design 1
+justif son 1
+justif son nom 1
+justif th ab 1
+justif th ad 1
+justif th ch 1
+justif th method 1
+justif their unrestrict 1
+justif tr 1
+justif try 1
+juxtaposit 3
+juxtaposit de 1
+juxtaposit de point 1
+juxtaposit of el 1
+jv 6
+jv j jv1j 1
+jv we denot 1
+jv0j 1
+jv0j jv1j 1
+jv0j jv1j jv2j 1
+jv0j k ver 1
+jv1 1
+jv1j 2
+jv1j jv2j 2
+jv1n 1
+jv1s 1
+jv2i 1
+jv2j 2
+jv2j jv1j 1
+jvij 1
+jvivj 1
+jvivj jg 1
+jvj 1
+jvmj 1
+jw 2
+jw deriv 1
+jw deriv kw 1
+jw ir 1
+jw iw 1
+jw iw jr 1
+jw jr 1
+jw jr iw 1
+jw m ir 1
+jw0j 1
+jw0w1j 1
+jw0w1j jvivj 1
+jw0w1j jvivj jg 1
+jw89 1
+jw90 1
+jwj 2
+jwj jqj 1
+jwj x x2w 1
+jwjg 1
+jwn 1
+jx 4
+jx nq 1
+jx1j 1
+jxj 3
+jxj 1j 1
+jxj 1j jxj 1
+jxj 2n 1
+jxj 2n qg 1
+jxj denot 2
+jxj j ffl 1
+jxj jy1j 1
+jxj such pref 1
+jxjc 1
+jxz1 1
+jy 1
+jy1j 1
+jy1jjy2j 1
+jyij 1
+jyk 1
+jym 1
+jym 1jg 1
+jytj 1
+jytj jqj 1
+jz1j 1
+jzj 1
+jzj denot 1
+jztj 1
+jztj jqj 1
+k.a 2
+k.c 2
+k.e 3
+k.etemad 1
+k.etemad and ram 1
+k.f 2
+k.g 1
+k.h 1
+k.j 4
+k.k 1
+k.l 1
+k.m 2
+k.mckinl 1
+k.o 1
+k.p 1
+k.poul 1
+k.r 1
+k.ramamohanar 1
+k.ramamohanar hav shown 1
+k.s 2
+k.u 1
+k.v 1
+k.y 1
+k0 5
+k0 2e2b 1
+k0 2e2b e2 1
+k0 blogn 1
+k0 is prefer 1
+k0 k n0 1
+k0 kt 1
+k0 q 3bk 1
+k0.1 1
+k0.1 therefor 1
+k02n 1
+k02n 3kn0 1
+k02n 3kn0 logn 1
+k0e2 1
+k0e2 2blogn 1
+k0i 1
+k0n 1
+k0n n0k 1
+k0nn0k 1
+k1 7
+k1 and k2 1
+k1 ind 1
+k1 ind form 1
+k1 is bound 1
+k1 jmin 1
+k1 k2 2
+k1 k2 classif 1
+k1 k4 1
+k1 k4 k2 1
+k1 mod 1
+k1 mod p1 1
+k1 p1 1
+k1 pid 1
+k1 s1 1
+k1 to pe0 1
+k1 to typ 1
+k1 w1 1
+k1.4 1
+k12 1
+k12 a k22 1
+k1a 2
+k1a 0r6 2
+k1c 1
+k1c tabl 1
+k1c tabl lookup 1
+k1n2 1
+k1s 1
+k1s 5b6 1
+k1s 5b6 zinr 1
+k1s1 1
+k1s1 s1 1
+k2 12
+k2 classif 1
+k2 classif typ 1
+k2 doal 1
+k2 fun 1
+k2 is bound 1
+k2 is hamilt 1
+k2 is smaller 1
+k2 k3 1
+k2 log 1
+k2 pb 1
+k2 which us 1
+k21 1
+k21 k23 1
+k22 2
+k22 k24 1
+k23 1
+k24 1
+k2jt 1
+k2l 1
+k2l log 1
+k2m 1
+k2n 1
+k2n log 1
+k2n log2 1
+k2s 1
+k2x 1
+k3 2
+k32 1
+k32 a k42 1
+k3k4 1
+k4 1
+k4 integer 1
+k4 k2 1
+k4 k2 k3 1
+k42 1
+k8 1
+k8 ken18 1
+k8 ken18 kk3 1
+ka 4
+ka li 1
+kabanz 1
+kabr 1
+kac 2
+kac s ecart 1
+kad 1
+kad approach 1
+kad approach def 1
+kad approach prov 1
+kad system 1
+kaelbl 1
+kaelbl sometim refer 1
+kaft86 1
+kafur 1
+kag89 1
+kagel 1
+kageyam 1
+kah87 1
+kahl 1
+kahl medl91 1
+kahl88 1
+kahn 4
+kahn et carlsson 1
+kahn interm 1
+kahn rec 1
+kahn rec instruc 1
+kahng 1
+kaizhong 1
+kaizhong zhang 1
+kak 2
+kal 2
+kalman 2
+kalman chap 1
+kalman estim 1
+kalman filter 1
+kalman filter produc 1
+kalman filter techniqu 1
+kalman perm 1
+kalman perm un 1
+kalmanek 1
+kalsow 1
+kam 2
+kamel 2
+kamel and chr 1
+kamel3 1
+kamp 1
+kamp.ps.z 1
+kamran 1
+kamran cfar.umd.edu 1
+kamran etemad 1
+kan 7
+kan st 1
+kanak 1
+kanamor 1
+kanatan 1
+kanellak 2
+kanellak gabriel 1
+kanellak1 1
+kanerv 1
+kanerv sdm 1
+kanerv sdm memor 1
+kanerv spar 1
+kanerv spar distribut 1
+kang 2
+kang pu 1
+kang pu liou 1
+kang zhang 1
+kang zhang mehm 1
+kanj 1
+kanovich 1
+kantrowitz 1
+kapidak 1
+kaplan 1
+kapur 1
+kapur and yagit 1
+kar 1
+kar di 1
+kar di system 1
+karamch 1
+karavassil 1
+karch 1
+kard 2
+kard a stud 1
+kard system 1
+kard system deal 1
+karger 2
+kargupt 1
+karin 1
+karin peter 1
+karin peter ka 1
+karin peter summer 1
+karl 4
+karl and a.s 1
+karl frank 1
+karl lieberh 2
+karlin 1
+karlsruh 3
+karlsruh.4 1
+karlsruh.4 a centr 1
+karlsson 1
+karmarkar 1
+karmarkar project 1
+karmarkar project method 1
+karnin 2
+karp 4
+karp algorithm 1
+karp and zhang 1
+karp zhang 1
+karp zhang parallel 1
+karyp 4
+karyp and kumar 1
+karyp and vipin 2
+karyp me 1
+karyp me me.html 1
+karyp paper 1
+karyp paper mlevel 1
+kastur 1
+katev 1
+kathleen 1
+kathleen fish 1
+kathryn 1
+katiyar 1
+katiyar and sriram 1
+katsaggel 1
+katsavounid 1
+katsun 1
+katz 3
+katz ont 1
+katz ont an 1
+kaufman 19
+kaufman publ 6
+kawakam 1
+kawamur 1
+kawarasak 1
+kay 1
+kaz92 1
+kazmierczak 1
+kazu 1
+kazu misu 1
+kazuh 1
+kazuh makin 1
+kazut 1
+kazut kubot 1
+kb 4
+kb developm 1
+kb is perform 1
+kb pag 1
+kb prev 1
+kb prev ment 1
+kb.1 1
+kbm 1
+kbt 1
+kbt c1i 1
+kbt c1i c2j 1
+kbt c1i1 1
+kbt ci 1
+kbt ci i0 1
+kby 5
+kby direct 1
+kby direct map 1
+kby instruc 1
+kby of st 1
+kc 3
+kc dat 1
+kc dat point 1
+kc nc 1
+kc transfer 1
+kcm 1
+kcm act 1
+kcm addr 1
+kcm and eclip 1
+kcm as 1
+kcm assemb 1
+kcm assemb cod 1
+kcm assum 1
+kcm can commun 1
+kcm cod 1
+kcm correspon 1
+kcm de 1
+kcm de man 1
+kcm dev 1
+kcm dev driver 1
+kcm et de 1
+kcm funct 1
+kcm funct descript 1
+kcm hardwar 1
+kcm hardwar implem 1
+kcm host 1
+kcm host prolog 1
+kcm impl 1
+kcm impl ement 1
+kcm inclus 1
+kcm inclut 1
+kcm ind 1
+kcm ind sur 1
+kcm instruc 1
+kcm interact 1
+kcm interfac 1
+kcm interfac board 1
+kcm is ded 1
+kcm is faster 1
+kcm is slower 1
+kcm is therefor 1
+kcm kernel 1
+kcm kernel prov 1
+kcm kernel support 1
+kcm macr 1
+kcm macr assembler 1
+kcm microcod 1
+kcm microcod manu 1
+kcm ne 1
+kcm ne diff 1
+kcm oper 1
+kcm oper system 1
+kcm outperform 1
+kcm outperform eclip 1
+kcm pipelin 1
+kcm pr 1
+kcm pr esent 1
+kcm project 1
+kcm prolog 1
+kcm prolog dat 1
+kcm result 1
+kcm sep 1
+kcm sep implem 1
+kcm sep kcm 1
+kcm sep run 1
+kcm sep runtim 1
+kcm sep se 1
+kcm sep wh 1
+kcm sid 1
+kcm softwar 1
+kcm softwar architectur 1
+kcm softwar system 1
+kcm standard 1
+kcm standard kcm 1
+kcm stat 1
+kcm stat an 1
+kcm system 1
+kcm tak 1
+kcm un 1
+kcm us 1
+kcm us word 1
+kcm util 1
+kcm util un 1
+kcm va 1
+kcm vi specif 1
+kcm vs 1
+kcm vs eclip 1
+kcm wa design 1
+kcm wa implem 1
+kcm wer concern 1
+kcm wer design 1
+kcm with standard 1
+kcm word 1
+kcm word format 1
+kcm would decr 1
+kcz91 1
+kd 4
+kd is increm 1
+kd is re 1
+kd number 1
+kd s 1
+kd tr 1
+kdim 1
+kdim tr 1
+kdrb91 1
+ke 1
+ke hpk 1
+ke.u.87.13 1
+kean 1
+kearn 2
+kearn val 1
+kebl 1
+kebl road 1
+kedar 1
+kedar cabel 1
+kedarcabel 1
+kedem 1
+keen 3
+keen for keyboard 1
+keen to read 1
+keen to se 1
+keep 56
+keep a compar 1
+keep a const 1
+keep a datab 1
+keep a finit 1
+keep a list 1
+keep a polynom 1
+keep a record 1
+keep a standard 1
+keep a status 1
+keep a tabl 1
+keep abstract 1
+keep al tempor 1
+keep appl 1
+keep bar 1
+keep bar creat 1
+keep being pr 1
+keep bigger 1
+keep bigger object 1
+keep both sibl 1
+keep c distinct 1
+keep cach 1
+keep cach coh 1
+keep coh 1
+keep coh decr 1
+keep dat 1
+keep dat structur 1
+keep direct 1
+keep ev fact 1
+keep execut 1
+keep execut optim 1
+keep for 1
+keep for inform 1
+keep from train 1
+keep futur 1
+keep futur oper 1
+keep going 1
+keep in mind 5
+keep intercluster 1
+keep intercluster topolog 1
+keep it fragm 1
+keep it old 1
+keep k fic 1
+keep lp 1
+keep main 1
+keep main memor 1
+keep man pot 1
+keep memor 1
+keep memor usag 1
+keep modif 1
+keep network 1
+keep network topolog 1
+keep no 1
+keep no inst 1
+keep non 1
+keep non no 1
+keep object 1
+keep object orient 1
+keep old 1
+keep old interfac 1
+keep onl prob 1
+keep or kil 1
+keep our correct 1
+keep privileg 1
+keep privileg se 1
+keep q0 1
+keep serv 1
+keep succ 1
+keep succ cod 1
+keep tag 1
+keep th an 1
+keep th caller 1
+keep th character 1
+keep th correct 1
+keep th cost 1
+keep th dep 1
+keep th developm 1
+keep th disc 1
+keep th enterpr 1
+keep th ident 1
+keep th implem 1
+keep th ind 1
+keep th inter 1
+keep th me 1
+keep th measur 1
+keep th nod 1
+keep th number 1
+keep th old 1
+keep th order 1
+keep th other 1
+keep th proc 1
+keep th profil 1
+keep th record 1
+keep th siz 1
+keep th spac 1
+keep th strateg 1
+keep th subband 1
+keep th system 1
+keep th tdfg 1
+keep th view 1
+keep that overhead 1
+keep their old 1
+keep their privileg 1
+keep them simpl 1
+keep topolog 1
+keep track 14
+keep us 1
+keep us self 1
+keh 1
+keh92 1
+keith 2
+keith marzl 1
+keith playford 1
+kel 2
+kel and william 1
+keleh 1
+kelleh 1
+keller 3
+kemmerer 1
+kemp 1
+ken 14
+ken by mov 1
+ken ken 1
+ken regan 1
+ken squar 6
+ken squar research 5
+ken wakit 1
+ken wakit help 1
+ken18 1
+ken18 kk3 1
+ken18 kk3 kk6 1
+kenich 1
+kenich as 1
+kenich as offer 1
+kenjir 1
+kenjir taur 1
+kennard 1
+kenneth 3
+kenneth birman 1
+kent 4
+kent at canterbur 1
+kent canterbur 1
+kent ct2 1
+kent ct2 7nf 1
+kentuck 1
+kenz 1
+kep75 1
+keppel 1
+kept 22
+kept apart 1
+kept as inform 1
+kept fic 1
+kept in intern 1
+kept in mind 2
+kept low 1
+kept or replac 1
+kept sequ 1
+kept sequ con 1
+kept th old 1
+kept under control 1
+kept vi attribut 1
+kept when perform 1
+ker 3
+ker yi 1
+keravnou 1
+keravnou and washbrook 1
+keravnou e.t 1
+kergommeaux 1
+kerh 1
+kerh we occ 1
+kerman 1
+kernel 16
+kernel ba 1
+kernel ba oper 1
+kernel cod 1
+kernel contain 1
+kernel control 1
+kernel control agent 1
+kernel dat 1
+kernel debug 1
+kernel debug support 1
+kernel for commun 1
+kernel for kernel 1
+kernel is run 1
+kernel keep 1
+kernel keep track 1
+kernel langu 2
+kernel libr 1
+kernel libr giv 1
+kernel mod 1
+kernel modif 1
+kernel proc 1
+kernel prov 1
+kernel prov program 1
+kernel should behav 1
+kernel support 1
+kernel th kcm 1
+kernel to filter 1
+kernel ver 1
+kernel wer avail 1
+kernigham 1
+kernighan 3
+kernighan lin 2
+kernighan lin algorithm 1
+kernighan lin refin 1
+kervair 1
+kervel 2
+kerz 1
+kesavan 1
+kesavan and pan 1
+keshav 2
+keshav ping 1
+kesim 1
+kesim and sergot 1
+kestrel 1
+kestrel institut 1
+kestrel institut report 1
+keszenheimer 1
+kevin 4
+kevin mcauliff 1
+kevin wait 1
+key 52
+key and correspon 1
+key and integer 1
+key and pr 1
+key and remov 1
+key and return 1
+key and valu 1
+key ar gener 1
+key ar kept 1
+key ar nic 1
+key ar sup 1
+key aspect 1
+key at level 1
+key avg 1
+key b dep 1
+key ba 1
+key ba search 1
+key being search 1
+key bind 1
+key caus 1
+key cl 1
+key compon 2
+key comput 1
+key comput step 1
+key concept 1
+key differ 2
+key distribut 1
+key distribut pattern 1
+key el 1
+key eq 1
+key fact 1
+key featur 4
+key field 1
+key fkm 1
+key for nod 1
+key for prov 1
+key for repr 1
+key form 1
+key from user 1
+key gener 1
+key gener pattern 1
+key id 5
+key in comb 1
+key in mak 1
+key ind 1
+key ingr 1
+key inser 1
+key inst 1
+key inst variabl 1
+key intuit 1
+key intuit com 1
+key is ch 1
+key is inclus 1
+key is inser 1
+key is manag 1
+key key 1
+key lem 1
+key mak 1
+key not 1
+key not hemingw 1
+key observ 3
+key of figur 1
+key of keyboard 1
+key order 1
+key organ 1
+key organ principl 1
+key part 1
+key per proc 1
+key performanceassessm 1
+key performanceassessm confid 1
+key phr 1
+key phr found 1
+key po 1
+key point 1
+key pr 1
+key problem 2
+key progr 1
+key progr recur 1
+key proper 1
+key rang 1
+key reason 1
+key reduc 1
+key requir 1
+key result 2
+key retrief 1
+key rol 4
+key rol envisag 1
+key sort 1
+key st 1
+key step 4
+key t return 1
+key th search 1
+key theor 1
+key theor issu 1
+key to autom 1
+key to eff 1
+key to imag 1
+key to prov 1
+key to softwar 1
+key to valu 1
+key unit 1
+key using 1
+key using ordin 1
+key valu 4
+key valu bj 1
+key1 1
+key1 obj1 1
+keyboard 5
+keyboard and mous 1
+keyboard and output 1
+keyboard assign 1
+keyboard entr 1
+keyboard event 1
+keyboard input 1
+keyboard light 1
+keyn 2
+keyn objn 1
+keyst 1
+keystrok 1
+keystrok comb 1
+keystrok comb involut 1
+keyword 10
+keyword and form 1
+keyword and keyword 1
+keyword and maintain 1
+keyword and proxim 1
+keyword and user 1
+keyword and valu 1
+keyword ar extract 1
+keyword ar relev 1
+keyword ar strong 1
+keyword can appear 1
+keyword correspon 1
+keyword from hyperlink 1
+keyword giv 1
+keyword in com 1
+keyword ind 1
+keyword is follow 1
+keyword lead 1
+keyword lik 1
+keyword obsol 1
+keyword op 1
+keyword posit 1
+keyword record 1
+keyword search 1
+keyword that appear 1
+kf 3
+kf icg 1
+kf juelich.de 2
+kf zam 2
+kf zam ib 2
+kf92 1
+kf93 1
+kf94 1
+kfj 1
+kg 7
+kg 1k2 1
+kg 1k2 fflr 1
+kg exp 1
+kg nj 1
+kg nj pb 1
+kg nj pbg 1
+kg nj0 1
+kg number 1
+kgm93 1
+kh 1
+khan 1
+khuller 1
+khuller and thurimel 1
+ki 6
+ki and pi 1
+ki appart 1
+ki em 1
+ki em nid 1
+ki em vecteur 1
+ki fm 1
+ki fmj 1
+ki gi 1
+ki ns 1
+ki th correspon 1
+kian 1
+kian le 1
+kian le tan 1
+kibler 1
+kibler alber 1
+kick 1
+kick draw 1
+kick draw flac 1
+kicz 2
+kicz and lu 1
+kiel 2
+kiel dww 1
+kiel institut 1
+kiel.dbp.de 1
+kienholz 1
+kierstead 1
+kierstead and trotter 1
+kierstead and w.t 1
+kif 1
+kifer 4
+kifer and wu 1
+kifer cs.sunysb.edu 1
+kifer flog.ps.z 1
+kik 1
+kikin 1
+kil 4
+kil and restart 1
+kil any finit 1
+kilimanjar 1
+kilimanjar and madrid 1
+kilimanjar belief 1
+kilimanjaroand 1
+killeen 1
+kilogram 1
+kilogram of marijuan 1
+kim 8
+kim and gl 1
+kim bruc 1
+kim quadtr 1
+kim quadtr build 1
+kin 1
+kind 55
+kind and context 1
+kind and reduc 1
+kind and substitut 1
+kind and wn 1
+kind ar consider 1
+kind as prev 1
+kind assum 1
+kind by subject 1
+kind contigu 1
+kind describ 1
+kind discipl 1
+kind ec 1
+kind form 1
+kind hypoth 1
+kind init 1
+kind init pot 1
+kind input 1
+kind invar 1
+kind is introduc 1
+kind is reflec 1
+kind judg 1
+kind k1 1
+kind k2 1
+kind kt 1
+kind of act 1
+kind of answer 1
+kind of apart 1
+kind of author 1
+kind of axiom 1
+kind of ba 1
+kind of block 1
+kind of breakdown 1
+kind of cal 1
+kind of chang 1
+kind of cheap 1
+kind of cl 3
+kind of combin 1
+kind of complec 1
+kind of computer 1
+kind of con 1
+kind of condit 2
+kind of const 1
+kind of constraint 1
+kind of control 1
+kind of cut 1
+kind of da 1
+kind of dat 1
+kind of deform 1
+kind of deriv 1
+kind of dev 1
+kind of edg 1
+kind of entr 1
+kind of event 1
+kind of experim 1
+kind of expr 1
+kind of fact 1
+kind of failur 1
+kind of feedback 1
+kind of filter 1
+kind of funct 1
+kind of ge 1
+kind of glob 1
+kind of gr 1
+kind of grid 1
+kind of growth 1
+kind of guid 1
+kind of hierarch 1
+kind of hybrid 1
+kind of impl 1
+kind of implem 1
+kind of inform 4
+kind of init 1
+kind of input 1
+kind of interact 1
+kind of interleav 1
+kind of knowledg 1
+kind of langu 1
+kind of layer 1
+kind of liter 1
+kind of loc 2
+kind of mach 1
+kind of macr 1
+kind of master 1
+kind of me 1
+kind of memor 1
+kind of mult 1
+kind of nest 1
+kind of network 1
+kind of nod 1
+kind of non 2
+kind of nontr 1
+kind of object 1
+kind of occ 1
+kind of om 1
+kind of ontolog 1
+kind of oper 1
+kind of optim 1
+kind of par 1
+kind of parallel 1
+kind of pattern 1
+kind of problem 3
+kind of puzzl 1
+kind of re 2
+kind of regl 1
+kind of relationship 2
+kind of repr 1
+kind of resourc 2
+kind of restructur 1
+kind of s1 1
+kind of se 1
+kind of server 1
+kind of simplif 1
+kind of situ 1
+kind of spat 1
+kind of specif 1
+kind of stud 1
+kind of subderiv 1
+kind of support 1
+kind of sv 1
+kind of system 1
+kind of technolog 1
+kind of tetrahedr 1
+kind of topolog 1
+kind of train 1
+kind of transfer 1
+kind of typ 1
+kind of univer 1
+kind of user 1
+kind of workload 1
+kind rel 1
+kind rl 1
+kind stat 1
+kind subderiv 1
+kind subderiv lem 1
+kind subtyp 1
+kind subtyp stat 1
+kind system 2
+kind term 1
+kind typ 1
+kinder 1
+kinderman 1
+king 5
+king build 1
+king colleg 1
+kingdom 3
+kingsum 1
+kingsum chow 1
+kingsum th 1
+kingsum th as 1
+kinitkk 1
+kinkad 1
+kip 1
+kiparsk 1
+kiparsk ueber 1
+kiparsk ueber den 1
+kipn 1
+kir79 1
+kirb 1
+kirchner 2
+kirchoff 1
+kirkham 1
+kirkpatrick 1
+kirschenbaum 1
+kishimot 1
+kist 2
+kist sw 1
+kit 1
+kitlog 1
+kitlog block 1
+kitlog block abstract 1
+kitlog fournit 1
+kitlog fournit un 1
+kitlog model 1
+kitlog model break 1
+kitlog prototyp 1
+kitlog prototyp log 1
+kitlog prov 1
+kitlog serv 1
+kitlog support 1
+kitlog support log 1
+kitsuregaw 1
+kittler 1
+kjaerulff 1
+kjaerulff aalborg 1
+kjaerulff steff 1
+kjk 1
+kjt 1
+kk 1
+kk p random 1
+kk3 1
+kk3 kk6 1
+kk3 kk6 os60 1
+kk6 1
+kk6 os60 1
+kk6 os60 pd20 1
+kkk 1
+kkok89 1
+kkz 1
+kkz gav 1
+kkz method 1
+kkz method obtain 1
+kl 5
+kl aij 1
+kl algorithm 1
+kl ck 1
+kl est 1
+kl refin 1
+kl refin algorithm 1
+kl92 1
+kl94 1
+kl95 1
+klaud 1
+klaud dus 1
+klaud dus zieger 1
+klaus 2
+klaus d assler 1
+klaus er 1
+klaus er schauser 1
+kleen 3
+kleen recur 2
+kleen recur theorem 2
+kleen star 1
+kleer 2
+kleer and william 1
+kleer et al 1
+kleer j.de 1
+kleijn 1
+klein 7
+klein and finin 1
+klein b uning 1
+klein four group 1
+klein gener 1
+kleinrock 2
+kleitman 1
+klingenberg 1
+klmn 1
+klmn ck 1
+klmr90 1
+kloglogn 1
+klop 1
+klug 1
+kluwer 8
+kluwer academ 7
+kluwer academ publ 6
+km 3
+km def 1
+km def fzt 1
+km kybd 1
+km kybd ti 1
+km pb 1
+km2 1
+km92 1
+kmac 2
+kmac fpour 1
+kmac fpour chaqu 1
+kmc72 1
+kmean 1
+kmean algorithm 1
+kmin 1
+kmin ji 1
+kmin ji kmac 1
+kmin k kmac 1
+kmot 1
+kmot de 1
+kmot de point 1
+kmot denviron 1
+kn 15
+kn algorithm 1
+kn bandwidth 1
+kn cluster 2
+kn cluster interfac 2
+kn el 1
+kn jmin 1
+kn log 1
+kn mesh 1
+kn mvect 1
+kn q mod 1
+kn q pn 1
+kn q wn 1
+kn router 1
+kn router interconnect 1
+kn sn 1
+kn to classif 1
+kn with channel 1
+kn0 1
+knapsack 1
+knapsack problem 1
+knapsack problem suggest 1
+knaster 1
+knaster tarsk 1
+knaster tarsk fixpoint 1
+knew 1
+knew weatherbur 1
+knight 1
+knlogn 1
+know 70
+know a good 1
+know about natur 1
+know about tac 1
+know about ton 1
+know altern 1
+know altern rl 1
+know as fil 1
+know at compil 1
+know ev mark 1
+know exact 1
+know exact wh 1
+know from lem 1
+know how accur 1
+know in order 1
+know nm 1
+know nm beforehand 1
+know non 1
+know non determ 1
+know oe 1
+know or acquir 1
+know th accur 1
+know th cod 1
+know th correct 1
+know th cur 1
+know th desir 2
+know th distribut 1
+know th exact 1
+know th expr 1
+know th form 1
+know th ident 2
+know th implem 1
+know th ind 1
+know th interconnect 1
+know th intern 1
+know th length 1
+know th level 1
+know th measur 1
+know th network 1
+know th nl 1
+know th number 1
+know th outcom 1
+know th popl 1
+know th rang 1
+know th relationship 1
+know th rol 1
+know th standard 1
+know th structur 1
+know th topolog 1
+know th upper 1
+know th weight 2
+know that charg 1
+know that e01 1
+know that e0i 1
+know that e0k 1
+know that flow 1
+know that input 1
+know that jw 1
+know that larger 1
+know that pi 1
+know that pj 1
+know that sk 1
+know that t1 1
+know that u0 1
+know that ui 1
+know that uv 1
+know that uw 1
+know that v0 1
+know that w0 1
+know to proc 1
+know u0 1
+know uw 1
+know uw u0w0 1
+know v3 1
+know w v0 1
+know wh 2
+know wh exact 1
+know wherein 1
+know whether payoff 1
+know which compon 1
+know which edg 1
+know which input 1
+know which intersect 1
+know which mach 1
+know which pag 1
+know which st 1
+know which test 1
+knowledg 55
+knowledg about appl 1
+knowledg about domain 1
+knowledg about resourc 1
+knowledg about tempor 1
+knowledg about typ 1
+knowledg acqu 1
+knowledg acquisit 4
+knowledg acquisit proc 2
+knowledg acquisit support 1
+knowledg acquisit tool 1
+knowledg acquisit workshop 1
+knowledg among individu 1
+knowledg and correct 1
+knowledg and dat 7
+knowledg and effort 1
+knowledg and prefer 1
+knowledg and spat 1
+knowledg and tool 1
+knowledg appear 1
+knowledg avail 1
+knowledg ba 10
+knowledg ba con 1
+knowledg ba design 2
+knowledg ba knowledg 1
+knowledg ba mach 1
+knowledg ba managem 1
+knowledg ba neur 1
+knowledg ba post 1
+knowledg ba postproc 1
+knowledg ba reason 1
+knowledg ba system 3
+knowledg becom 1
+knowledg becom tot 1
+knowledg bound 1
+knowledg by describ 1
+knowledg collect 1
+knowledg com 1
+knowledg crunch 1
+knowledg crunch mach 1
+knowledg crunch system 1
+knowledg dec 1
+knowledg depth 1
+knowledg distribut 1
+knowledg dur hypoth 1
+knowledg dynam 1
+knowledg ec 1
+knowledg elicit 1
+knowledg engineer 6
+knowledg engineer review 1
+knowledg exchang 1
+knowledg fit 1
+knowledg for exper 1
+knowledg for hypoth 1
+knowledg for learn 1
+knowledg for transact 1
+knowledg gap 2
+knowledg goal 1
+knowledg in kard 1
+knowledg in larger 1
+knowledg in order 1
+knowledg inclus 1
+knowledg inclus gener 1
+knowledg increm 1
+knowledg int 1
+knowledg int knowledg 1
+knowledg int learn 1
+knowledg is avail 1
+knowledg is built 1
+knowledg is indeed 1
+knowledg is langu 1
+knowledg is relev 1
+knowledg is repr 1
+knowledg level 2
+knowledg mak 1
+knowledg manag 1
+knowledg may dec 1
+knowledg med 1
+knowledg med institut 1
+knowledg of ba 1
+knowledg of babel 1
+knowledg of finit 1
+knowledg of funct 1
+knowledg of modif 1
+knowledg of mus 1
+knowledg of object 1
+knowledg of pol 1
+knowledg of structur 1
+knowledg of wh 1
+knowledg or expect 1
+knowledg overrl 1
+knowledg overrl incon 1
+knowledg part 1
+knowledg part distribut 1
+knowledg prior 1
+knowledg progr 1
+knowledg program 1
+knowledg program system 1
+knowledg repr 4
+knowledg repr langu 2
+knowledg requir 1
+knowledg resid 1
+knowledg somewh 1
+knowledg sourc 1
+knowledg specif 1
+knowledg st 1
+knowledg structur 3
+knowledg structur vs 1
+knowledg system 2
+knowledg system labor 1
+knowledg through repr 1
+knowledg transfer 2
+knowledg transfer etc 1
+knowledg typ 1
+knowledg us 2
+knowledg us level 1
+knowledg wer prop 1
+knowledg which com 1
+knowledg within softwar 1
+knowledgeb 1
+knowledgeb mach 1
+known 78
+known a prior 3
+known act 1
+known ahead 1
+known algorithm 3
+known and eff 1
+known approach 1
+known argum 1
+known armstrong 1
+known armstrong axiom 1
+known as backquot 1
+known as bit 1
+known as block 1
+known as context 1
+known as determ 1
+known as determin 1
+known as floyd 1
+known as grammat 1
+known as heav 1
+known as lsd 1
+known as merg 1
+known as multipl 1
+known as parallel 1
+known as pgp 1
+known as random 1
+known as refin 1
+known as st 1
+known as symbol 1
+known as t1 1
+known as uniform 1
+known as wareh 1
+known benchmark 1
+known benchmark program 1
+known blast 1
+known blast algorithm 1
+known but nonoptim 1
+known by design 1
+known caus 1
+known character 1
+known concept 1
+known const 2
+known construc 1
+known covar 1
+known disturb 1
+known disturb decoupl 1
+known explan 1
+known explan pattern 1
+known fact 2
+known famil 1
+known fd 1
+known fd solut 1
+known for determin 1
+known from cl 1
+known from log 1
+known from tur 1
+known habit 1
+known imag 1
+known imag proc 1
+known in adv 3
+known inform 2
+known integer 1
+known integer const 1
+known langu 1
+known lif 1
+known lif form 1
+known log 1
+known log en 1
+known lower 1
+known lower bound 1
+known mathemat 1
+known mathemat structur 1
+known method 2
+known method using 1
+known modif 1
+known open problem 1
+known output 1
+known output cl 1
+known pathophysiolog 1
+known pathophysiolog rel 1
+known pram 1
+known pram algorithm 1
+known prev 1
+known problem 4
+known procedur 1
+known quadtr 1
+known quadtr dat 1
+known rel 2
+known report 1
+known report eff 1
+known result 4
+known sequ 1
+known sequ quicksortlik 1
+known shortcut 1
+known synchron 1
+known synchron oper 1
+known synchron primitiv 1
+known system 1
+known techniqu 1
+known that allow 1
+known that banerj 1
+known that fib 1
+known that langu 1
+known that obtain 1
+known that prolog 1
+known that shar 1
+known that standard 1
+known to belong 1
+known to ec 3
+known to hold 1
+known to li 1
+known to setter 1
+known to wear 1
+known upper 1
+known upper bound 1
+known upper lim 1
+known using 1
+known var 1
+known which oper 1
+known work 1
+known work conserv 1
+known worst 1
+known worst ca 1
+known.2 1
+knsn 1
+knsn sn 1
+knu 1
+knuth 7
+knuth and l.m 1
+kny95 1
+koan 2
+koan ce 1
+koan ce comport 1
+koan cel 1
+koan cel correspon 1
+koan d evelop 1
+koan dan 1
+koan dan tous 1
+koan en 1
+koan en util 1
+koan et tout 1
+koan le 1
+koan le co 1
+koan me 1
+koan ont 1
+koan ont perm 1
+koan program 1
+koan program environm 1
+koan shar 2
+koan shar virtu 2
+kob 1
+kobayash 1
+koch 2
+koct 1
+kod 1
+kod and rusk 1
+koetzl 1
+kohav 1
+kohon 2
+kohon et al 1
+kohon net 1
+kohon net cluster 1
+koiran 1
+koiran august 1
+kolait 1
+kolasinsk 1
+kolb 1
+kolbez 1
+kolmogorov 2
+kolmogorov complec 1
+kolmogorov smirnov 1
+kolodner 1
+kolodner simpson 1
+kolovson 1
+kolovson and michael 1
+kom 1
+kon 1
+konak 1
+kong 4
+kong research 1
+kong research grant 1
+konjug 1
+konjug grad 1
+konjug grad auf 1
+konopk 1
+kop 1
+kopt 1
+kopt is giv 1
+kopt return 1
+kor 1
+korel 1
+kort 1
+korth 2
+kosk 1
+koster 1
+kostersg 1
+kostersg wi.leidenuniv.nl 1
+kotz 1
+koud1 1
+koud1 and chr 1
+koukouvin 1
+koun 1
+kouramaij 1
+kourosh 2
+kourosh gharachorl 2
+kouroush 1
+kouroush gharachorl 1
+koutsoup 1
+koutsoup for us 1
+kowalik 1
+kowalik and s.p 1
+kowalsk 3
+kowalsk and k.a 1
+kowalsk event 1
+kowalsk event calculus 1
+koz 4
+koz sugiyam 1
+kp 1
+kp2 1
+kp2xh 1
+kp2xh wh 1
+kp2xh wh ps2xh 1
+kp84 1
+kp88 1
+kp93 1
+kpn 1
+kpriorkk 1
+kpriorkk and krestkk 1
+kpt96 1
+kpth 1
+kpth record 1
+kq1k2 1
+kr 4
+kr 1k2 1
+kr p iw 1
+kr torp 1
+kr torp le 1
+kr90 1
+kr91 1
+kr94 1
+krah 1
+kral 1
+kramer 3
+kramer and malk 1
+kramer gav 1
+kranz 2
+krauser 1
+krestk 1
+krestk ak 1
+krestk ak krestkk 1
+krestkk 1
+kriegel 1
+krik2 1
+kripk 1
+kripk po world 1
+krishn 1
+krishn theodor 1
+krishn theodor johnson 1
+krishnamoorth 2
+krishnamoorth fin 1
+krishnamoorth fin establ 1
+krishnamurth 1
+kristoffer 1
+kristoffer ro 1
+kristol 1
+kriwaczek 1
+krogh 1
+krogh and j.a 1
+krom 1
+krom forml 1
+krom subsum 1
+krom subsum resolut 1
+kromodimoelj 1
+krst 1
+krusk 8
+krusk algorithm 1
+krusk algorithm accord 1
+krusk algorithm work 1
+krusk shepard 1
+krusk shepard pi 1
+krusk wal 1
+krusk wal non 1
+krylov 1
+krylov subspac 1
+krylov subspac method 1
+ks 4
+ks cop 1
+ks kt 1
+ks output 1
+ks output port 1
+ks88 1
+ks91 2
+ks92 1
+ksl 1
+ksr 6
+ksr compiler 1
+ksr compiler prov 1
+ksr fortran 1
+ksr fortran program 1
+ksr mach 1
+ksr multiproc 1
+ksr subp 1
+ksr system 1
+ksr techn 2
+ksr techn sum 2
+ksr with thread 1
+kt 3
+kth 10
+kth block 1
+kth cel 1
+kth chunk 1
+kth cluster 1
+kth cluster ck 1
+kth compon 2
+kth dim 1
+kth item 1
+kth iter 2
+kth log 1
+kth log track 1
+kth nod 1
+kth occur 1
+kth pack 1
+kth pack leav 1
+kth pack start 1
+kth smallest 1
+kth smallest key 1
+kth smallest record 1
+kth track 1
+ku 6
+ku leuv 1
+kuamp.kyot 1
+kuamp.kyot u.ac.jp 1
+kuan 1
+kuan cheng 1
+kubiatowicz 1
+kubot 1
+kuch 1
+kuck 4
+kuck and assoc 1
+kuczaj 1
+kuebler 1
+kuehm 1
+kuehm zf.siem.de 1
+kuehn 1
+kuhn 3
+kuiper 1
+kuiper b.j 1
+kulikowsk 1
+kulikowsk c.a 1
+kulkarn 4
+kulkarn and cliff 1
+kulkarn anish 1
+kulkarn anish aror 1
+kullman 1
+kum88 1
+kumar 13
+kumar cs.umn.edu 1
+kumar describ 1
+kumar for us 1
+kumar hem 1
+kumar jam 1
+kumar jam parson 1
+kumar pr eff 1
+kummer 1
+kun 1
+kunar 1
+kunar found 1
+kung 3
+kung et al 1
+kunifuj 1
+kunst 1
+kunst und 1
+kunst und ai 1
+kunt 1
+kunz 1
+kunz j.c 1
+kup89 1
+kuper 2
+kuper2 1
+kuperz 1
+kuperz peter 1
+kupiec 1
+kur 1
+kursaw 1
+kurstr 1
+kutner 1
+kv 1
+kw 3
+kw kr 1
+kw mn 1
+kw mn ir 1
+kw njr 1
+kw njr kr 1
+kw partit 1
+kw partit algorithm 1
+kw v2 1
+kw v2 kr 1
+kwok 1
+kwok and m.y 1
+kwong 1
+kwong kwok 1
+kword 1
+kword cach 1
+kx 6
+kx map 1
+kx map denot 1
+kxk 1
+kxk qx 1
+kxk qx x2 1
+kxk2 1
+kxk2kyk2 1
+kxk3 1
+kybd 1
+kybd and acc 1
+kybd and prev 1
+kybd becaus acc 1
+kybd kybd 1
+kybd ti 1
+kybd wh 1
+kybdg 1
+kyot 3
+l 5
+l attent 1
+l attent drawn 1
+l level 1
+l level list 1
+l simultan 1
+l ulrik.html 1
+l.a 3
+l.e 2
+l.g 2
+l.j 1
+l.k 1
+l.m 5
+l.p 1
+l.pl 1
+l.pl umer 1
+l0 6
+l0 abstract 1
+l0 belong 1
+l0 is propag 1
+l0 is respon 1
+l0 is said 1
+l0 log 2
+l0 may mak 1
+l0 need und 1
+l0 oper 1
+l0 recov 1
+l0 recov begin 1
+l0 recov method 1
+l0 techniqu 1
+l0 und 1
+l0 und pr 1
+l0 using 1
+l0 using upd 1
+l00 1
+l00 l0 1
+l0j 1
+l0m1m2 1
+l0m2 1
+l0n 1
+l1 16
+l1 alor 1
+l1 alor il 1
+l1 and l2 2
+l1 doit 1
+l1 doit etr 1
+l1 endifexit 1
+l1 endifexit print 1
+l1 et l2 1
+l1 et l3 1
+l1 il 1
+l1 is tj 1
+l1 l2 1
+l1 min 1
+l1 oc 1
+l1 oper 1
+l1 s fr 1
+l1 subtransact 1
+l1 to color 1
+l1i 2
+l1i ai 1
+l1i ai l2i 1
+l1i l2i 1
+l1i u1i 1
+l1l2 1
+l2 12
+l2 and b2 1
+l2 be regl 1
+l2 execut 1
+l2 execut partit 1
+l2 l1 2
+l2 l1 alor 1
+l2 l1 il 1
+l2h 1
+l2h el 1
+l2i 1
+l2i ai 1
+l2s1 1
+l2s2 1
+l3 3
+l4 1
+l5 1
+l60a13l1d 1
+l99a13l1d 1
+la 22
+la alor 1
+la alor dispar 1
+la b color 1
+la ba 3
+la ba bb 1
+la ba canoniqu 1
+la ba de 1
+la ba dimpl 1
+la band 1
+la band pa 1
+la banqu 1
+la banqu de 1
+la biblioth 1
+la biblioth equ 1
+la biject 1
+la biject sous 1
+la bin 1
+la bin ma 1
+la biolog 2
+la biolog mol 2
+la bon 3
+la bon claus 1
+la bon converg 1
+la bon exploit 1
+la bon propr 1
+la bon valeur 1
+la born 2
+la born consid 1
+la born de 1
+la born inf 1
+la born sup 2
+la boucl 2
+la boucl ayant 1
+la boucl ce 1
+la boucl de 1
+la boucl doal 1
+la boucl doiv 1
+la boucl en 1
+la boucl est 1
+la boucl etud 1
+la boucl ex. 1
+la boucl extern 1
+la boucl i1 1
+la boucl i2 1
+la boucl init 1
+la boucl intern 1
+la boucl la 1
+la boucl lalloc 1
+la boucl ne 1
+la boucl obtenu 1
+la boucl par 1
+la boucl qu 1
+la boucl s 1
+la boucl suiv 1
+la boucl transfor. 1
+la boucl transform 1
+la ca 1
+la ca de 1
+la calcl 1
+la calcl du 1
+la capacit 1
+la caract 2
+la caract er 2
+la cart 1
+la cart exponentiel 1
+la cart loc 1
+la cart princip 1
+la cartograph 1
+la cartograph physiqu 1
+la cel 1
+la cel affect 1
+la cel ain 1
+la cel allou 1
+la cel c1 1
+la cel ch 1
+la cel correspon 1
+la cel de 1
+la cel don 1
+la cel est 1
+la cel estampil 1
+la cel mi 1
+la cel modif 1
+la cel occup 1
+la cel partag 1
+la cel peut 1
+la cel pourrait 1
+la cel qu 1
+la cel repr 1
+la cel retourn 1
+la cel suiv 1
+la cel sur 1
+la cel termin 1
+la cel vr 1
+la ch 3
+la ch in 1
+la ch ne 2
+la chain 1
+la chain rdp 1
+la charg 2
+la charg de 2
+la charg du 1
+la cl 2
+la cl dadm 1
+la cl de 2
+la cl sadm 1
+la cl sasm 1
+la classif 2
+la classif de 1
+la classif util 1
+la claus 1
+la claus afin 1
+la claus appar 1
+la claus appel 1
+la claus au 1
+la claus auxiliair 1
+la claus binair 1
+la claus ci 1
+la claus comport 1
+la claus cont 1
+la claus correspon 1
+la claus cour 1
+la claus dan 1
+la claus du 1
+la claus en 1
+la claus est 1
+la claus fus 1
+la claus init 1
+la claus le 1
+la claus nest 1
+la claus non 1
+la claus partag 1
+la claus qu 1
+la claus se 1
+la claus sont 1
+la claus suiv 1
+la claus termin 1
+la cliqu 1
+la cliqu maxim 1
+la cm 1
+la coh 2
+la coh er 1
+la coh esion 1
+la collabor 1
+la collabor entr 1
+la colon 1
+la colon est 1
+la com 2
+la com dexam 2
+la combinaison 2
+la combinaison de 2
+la combinaison dun 1
+la commun 1
+la commun par 1
+la communaut 1
+la comp 2
+la comp es 1
+la comp x2i 1
+la comparaison 3
+la comparaison de 1
+la comparaison est 1
+la comparaison na 1
+la compil 2
+la compil de 2
+la compil en 1
+la compil la 1
+la compil le 1
+la compil peut 1
+la compil pour 1
+la compil quau 1
+la compil si 1
+la compil soit 1
+la compil transform 1
+la complexit 5
+la composit 2
+la composit de 2
+la composit exact 1
+la compr 3
+la compr de 2
+la compr ehen 2
+la compr modif 1
+la compr ne 1
+la computac 1
+la con 3
+la con de 1
+la con du 1
+la con equ 1
+la concat 1
+la concat enat 1
+la concept 4
+la concept de 2
+la concept du 1
+la concept dun 1
+la conclus 1
+la concur 1
+la condit 4
+la condit daccessibilit 1
+la condit de 2
+la condit dun 1
+la condit ou 1
+la condit souhait 1
+la condit suff 1
+la conduit 1
+la conf 1
+la conf quil 1
+la configur 1
+la configur de 1
+la configur ffy 1
+la configur issu 1
+la configur recherch 1
+la conjonct 1
+la connec 2
+la connec entr 1
+la connec invar 1
+la connec tant 1
+la conogur 1
+la conogur de 1
+la consom 1
+la consom de 1
+la constitut 1
+la constitut de 1
+la construc 4
+la construc av 1
+la construc conditionnel 1
+la construc de 3
+la construc du 1
+la construc dun 2
+la cont 1
+la cont dan 1
+la continu 1
+la continu de 1
+la continuit 1
+la contraint 2
+la contraint dunimodularit 1
+la contraint est 1
+la contraint init 1
+la contraint pr 1
+la contraint sur 2
+la conv 1
+la conv de 1
+la conv li 1
+la converg 1
+la converg de 1
+la converg est 1
+la converg nest 1
+la converg ver 1
+la convexit 1
+la coop 1
+la coop erat 1
+la cop 2
+la cop de 1
+la cop est 1
+la cop loc 1
+la coupur 1
+la coupur appar 1
+la coupur au 1
+la coupur avec 1
+la coupur couvr 1
+la coupur de 1
+la coupur douc 1
+la coupur est 1
+la coupur facil 1
+la coupur glob 1
+la coupur le 1
+la coupur loc 1
+la coupur na 1
+la coupur nest 1
+la coupur par 1
+la coupur perm 1
+la coupur pr 1
+la coupur profon 1
+la coupur standard 1
+la coupur sur 1
+la courb 2
+la courb de 1
+la courb inf 1
+la courb ou 1
+la courb repr 1
+la courb sup 1
+la cr 4
+la cr ation 1
+la cr de 1
+la cr eat 2
+la cr ee 1
+la d ec 1
+la d ecl 1
+la d ecomposit 1
+la d ecr 1
+la d ecrir 1
+la d efail 1
+la d efinit 2
+la d el 1
+la d eliaison 1
+la d emarch 1
+la d emonstr 2
+la d epen 1
+la d er 1
+la d eriv 1
+la d etect 1
+la d eterm 1
+la d ev 1
+la d pen 1
+la d riv 1
+la d tect 1
+la d term 1
+la dadr 1
+la dadr glob 1
+la dat 1
+la dat du 1
+la de 2
+la de calcl 1
+la de ce 1
+la de champ 1
+la de instruc 1
+la de la 1
+la de laffect 1
+la de quelqu 1
+la de transform 1
+la de variabl 1
+la dec 2
+la densit 2
+la dern 4
+la descript 2
+la descript de 2
+la descript originel 1
+la destruc 1
+la destruc du 1
+la deux 3
+la deux cel 1
+la deux em 3
+la diagon 1
+la diff 3
+la diff er 2
+la diff erentiabilit 1
+la difficil 1
+la difficil ma 1
+la difficult 2
+la diffus 1
+la diffus dun 1
+la diffus syst 1
+la dilat 1
+la dilat de 1
+la dilat est 1
+la dilat maxim 1
+la dilat minim 1
+la dilat pr 1
+la dim 3
+la dim de 2
+la dim est 1
+la dim princip 1
+la dim suiv 1
+la diminut 1
+la diminut de 1
+la direct 2
+la direct de 1
+la direct la 1
+la direct par 1
+la disc 1
+la disc ont 1
+la disc pr 1
+la disjonct 1
+la disparit 1
+la disponibilit 1
+la disposit 2
+la disposit de 1
+la disposit du 1
+la dist 3
+la dist au 1
+la dist de 2
+la dist dun 1
+la dist entr 2
+la dist est 1
+la distinct 1
+la distinct entr 1
+la distribut 3
+la distribut de 1
+la distribut denregister 1
+la distribut init 2
+la distribut lim 1
+la div 1
+la div eucl 1
+la dom 1
+la dom dun 1
+la don 4
+la don ee 3
+la drapeau 1
+la drapeau superficiel 1
+la drosophil 1
+la du 1
+la du pr 1
+la du test 1
+la dualit 1
+la dun 3
+la dun branch 1
+la dun compilateur 1
+la dun compteur 1
+la dun conditionnel 1
+la dun enregister 1
+la dun int 1
+la dun regroup 1
+la dun tabl 1
+la dupl 1
+la dupl de 1
+la dur 3
+la dur ee 3
+la dynamiqu 1
+la dynamiqu de 1
+la e par 1
+la es 1
+la es ouver 1
+la esp 1
+la esp erer 1
+la fa 2
+la fa con 2
+la fa tail 1
+la fabr 1
+la fabr de 1
+la facilit 1
+la fair 1
+la fair correspondr 1
+la faisabilit 1
+la fait 1
+la fait dan 1
+la famil 1
+la famil de 1
+la feuil 1
+la fic 1
+la fic de 1
+la figur 4
+la figur ci 1
+la figur tab 1
+la fin 4
+la fin de 4
+la fin dic 1
+la fin du 1
+la fin dun 1
+la fo 3
+la fo au 1
+la fo aux 1
+la fo avant 1
+la fo conflictuel 1
+la fo court 1
+la fo dan 1
+la fo du 1
+la fo efficac 1
+la fo jusqu 1
+la fo la 1
+la fo ladr 1
+la fo le 2
+la fo non 1
+la fo par 1
+la fo sauvegarder 1
+la fo sur 2
+la fo un 1
+la fonct 3
+la fonct aff 1
+la fonct appel 1
+la fonct co 1
+la fonct comp 1
+la fonct dacc 1
+la fonct de 2
+la fonct dit 1
+la fonct ent 1
+la fonct etud 1
+la fonct fin 1
+la fonct multipl 1
+la fonct optim 1
+la fonct planch 1
+la fonct posit 1
+la fonct scalair 1
+la fonct sous 1
+la form 5
+la form analytiqu 1
+la form de 3
+la form don 1
+la form du 2
+la form dun 3
+la form jd 1
+la form la 1
+la form norm 1
+la form obtenu 1
+la form pr 1
+la form rationnel 1
+la form souhait 1
+la form sourc 1
+la form suiv 2
+la form voulu 1
+la forml 3
+la forml du 1
+la forml suiv 1
+la forml util 1
+la fr 3
+la fr equ 3
+la franc 1
+la front 2
+la fus 3
+la fus de 2
+la fus soit 1
+la g en 3
+la g om 1
+la gard 1
+la gard com 1
+la gard con 1
+la gard de 1
+la gard nest 1
+la gauch 1
+la gauch du 1
+la gaus 1
+la gest 5
+la gest correct 1
+la gest de 5
+la gest du 2
+la gest dun 2
+la gest dynamiqu 2
+la gest explicit 2
+la gest par 1
+la gest peut 1
+la glob 1
+la glob con 1
+la grand 1
+la grand majorit 1
+la granularit 1
+la gril 1
+la gril origin 1
+la hi 1
+la hi erarch 1
+la i em 1
+la ie 1
+la ie lign 1
+la j em 2
+la jol 2
+la journ 1
+la justif 1
+la justif de 1
+la justif dun 1
+la juxtaposit 1
+la juxtaposit de 1
+la ksr 1
+la l egalit 1
+la la 1
+la la gest 1
+la laisson 1
+la laisson se 1
+la largeur 1
+la lat 1
+la lat de 1
+la lat du 1
+la lectur 2
+la lectur de 2
+la lectur retard 1
+la liaison 1
+la liaison conditionnel 1
+la liaison de 1
+la liaison dev 1
+la liaison doit 1
+la liaison du 1
+la liaison dun 1
+la liaison peut 1
+la liaison sappliqu 1
+la lib 1
+la lib erat 1
+la liber 1
+la librair 1
+la librair lapack 1
+la librair nag 1
+la lign 2
+la lign de 2
+la lim 2
+la lim ci 1
+la lim du 1
+la lin 1
+la lin er 1
+la lisent 1
+la lisent pu 1
+la list 1
+la list de 1
+la list vid 1
+la lit 3
+la lit er 2
+la lo 1
+la lo de 1
+la lo gaus 1
+la lo. 1
+la loc 2
+la loc de 2
+la loc rel 1
+la localit 2
+la logiqu 1
+la logiqu de 1
+la logiqu dutilit 1
+la longueur 3
+la longueur de 3
+la longueur du 1
+la lourdeur 1
+la lourdeur peut 1
+la lum 1
+la m em 3
+la m emoir 3
+la m es 1
+la m ethod 3
+la m ethodolog 1
+la m thod 1
+la m.d.s 1
+la ma 3
+la ma de 2
+la ma tr 1
+la mach 4
+la mach abstrait 1
+la mach cibl 1
+la mach de 1
+la mach dec 1
+la mach ex 1
+la mach icm 1
+la mach kcm 1
+la mach par 1
+la mach paragon 1
+la mach plm 1
+la mach pour 1
+la mach sont 1
+la mach sous 1
+la mach trait 1
+la mach util 1
+la main 1
+la maint 1
+la maint chez 1
+la majeur 1
+la majeur part 1
+la majorit 2
+la man 3
+la marqu 1
+la marqu de 1
+la matr 4
+la matr ain 1
+la matr ant 1
+la matr antisym 1
+la matr ayant 1
+la matr car 2
+la matr conserv 1
+la matr de 3
+la matr diagon 1
+la matr dinc 1
+la matr identit 1
+la matr inver 1
+la matr non 1
+la matr qu 1
+la matr sont 1
+la matr util 1
+la matr xx 1
+la md 1
+la md nous 1
+la md ou 1
+la meilleur 3
+la meilleur gar 1
+la meilleur solut 1
+la meilleur tail 1
+la meilleur vo 1
+la ment 1
+la ment dan 1
+la ment mi 1
+la mesur 4
+la mesur de 2
+la mi 4
+la mi au 2
+la mi en 4
+la migr 1
+la migr de 1
+la migr est 1
+la migr syst 1
+la minim 3
+la minim de 1
+la minim du 1
+la minim glob 1
+la ml 1
+la ml sur 1
+la mod 1
+la mod li 1
+la modif 3
+la modif de 3
+la modif dun 1
+la modif en 1
+la modif par 1
+la modif pour 1
+la modif ser 1
+la modif suiv 1
+la moin 1
+la moin bon 1
+la moit 1
+la montr 1
+la motiv 1
+la motiv prem 1
+la moy 1
+la moy au 1
+la moy dun 1
+la mppm 1
+la multipl 2
+la multipl de 1
+la multipl matriciel 1
+la multiplicit 1
+la mut 1
+la mut constitu 1
+la mut est 1
+la mut se 1
+la mvp 1
+la mvp au 1
+la mvp cont 1
+la mvp dan 1
+la mvp de 1
+la mvp disp 1
+la mvp en 1
+la mvp es 1
+la mvp est 1
+la mvp etant 1
+la mvp koan 1
+la mvp lor 1
+la mvp peuv 1
+la mvp pu 1
+la mvp sapproch 1
+la mvp se 1
+la mvp sont 1
+la mvp suiv 1
+la mvp sur 1
+la n ecessit 3
+la n egat 1
+la n otr 1
+la na 1
+la na dun 1
+la natur 3
+la natur de 2
+la natur du 1
+la natur est 1
+la natur math 1
+la non 2
+la non convexit 1
+la norm 1
+la not 4
+la not danciennet 1
+la not de 3
+la not lcj 1
+la not math 1
+la not techniqu 1
+la nouvel 3
+la nouvel boucl 1
+la nouvel direct 1
+la nouvel fonct 1
+la nouvel instruc 1
+la nouvel mi 1
+la nouvel particl 1
+la nouvel popl 1
+la nouvel tail 1
+la nouvel valeur 1
+la nouvel var 1
+la nouvel ver 1
+la ntoam 1
+la ntoam avec 1
+la ntoam consom 1
+la ntoam de 1
+la ntoam ne 1
+la ntoam pu 1
+la oabilit 1
+la olectur 1
+la olectur de 1
+la p eriod 1
+la pa 1
+la pag 2
+la pag afin 1
+la pag au 1
+la pag aux 1
+la pag avec 1
+la pag ce 1
+la pag com 1
+la pag conflictuel 1
+la pag correspon 1
+la pag dan 1
+la pag doit 1
+la pag en 1
+la pag entr 2
+la pag est 1
+la pag finit 1
+la pag modif 1
+la pag ne 1
+la pag nest 1
+la pag pa 1
+la pag pour 1
+la pag qu 1
+la pag ser 1
+la pag si 1
+la pag sont 1
+la pag sur 1
+la pair 1
+la pair correspon 1
+la pair cour 1
+la pair dinstruc 1
+la pair en 1
+la pair pr 1
+la pan 1
+la panac 1
+la panac ee 1
+la par 2
+la par el 2
+la paragon 2
+la paragon dintel 1
+la paragon qu 1
+la part 3
+la part condit 1
+la part continu 1
+la part de 1
+la part droit 1
+la part du 1
+la part gauch 1
+la part prop 1
+la part suiv 1
+la part sur 1
+la part util 1
+la particularit 3
+la partit 3
+la partit du 1
+la partit en 1
+la partit le 1
+la pauvr 1
+la pdb 1
+la pdb avec 1
+la pdb tout 1
+la pein 1
+la pein de 1
+la per 4
+la per de 2
+la per du 1
+la per en 1
+la per pr 1
+la percept 1
+la percept de 1
+la perform 3
+la perform de 2
+la perform ignorer 1
+la perform intrin 1
+la perform na 1
+la perform optim 1
+la perform ou 1
+la perspect 1
+la perspect de 1
+la perspicacit 1
+la ph 3
+la ph dappl 1
+la ph de 1
+la ph dunif 1
+la ph fin 1
+la ph init 1
+la philosoph 1
+la philosoph adopt 1
+la pil 1
+la pil au 1
+la pil de 1
+la pil denviron 1
+la pil en 1
+la pil est 1
+la pil eventuel 1
+la pil glob 1
+la pil loc 1
+la pil mach 1
+la pil qu 1
+la plac 3
+la plac de 1
+la plac dispon 1
+la plac est 1
+la plac lib 1
+la plac pi 1
+la placer 1
+la placer dan 1
+la planioc 1
+la planioc dun 1
+la plupart 3
+la plupart de 3
+la plupart du 2
+la plus anc 1
+la plus court 1
+la plus direct 1
+la plus efficac 1
+la plus fa 1
+la plus facil 1
+la plus grand 3
+la plus naturel 1
+la plus pe 1
+la plus proch 1
+la plus prometteus 1
+la plus simpl 2
+la plus sophistiqu 1
+la po pr 1
+la politiqu 2
+la politiqu de 2
+la popl 1
+la popl cour 1
+la popl est 1
+la popl init 1
+la popl interm 1
+la popl la 1
+la popl loc 1
+la popl peut 1
+la popl proportionnel 1
+la popl pt 1
+la popl subit 1
+la popl trait 1
+la port 1
+la port ee 1
+la posit 2
+la posit de 2
+la posit dun 1
+la posit rel 1
+la possibilit 4
+la pr 6
+la pr ci 1
+la pr dan 1
+la pr ec 4
+la pr edict 1
+la pr en 2
+la pr es 3
+la pr esager 1
+la pr par 2
+la pratiqu 2
+la prem 5
+la preuv 1
+la preuv de 1
+la prim 3
+la prim fail 1
+la prim fork 1
+la princip 1
+la princip faibl 1
+la probabilit 3
+la probl 1
+la probl ematiqu 1
+la proc edur 2
+la prochain 2
+la prochain pair 1
+la produc 2
+la produc de 2
+la profondeur 2
+la profondeur de 1
+la profondeur maxim 1
+la progr 1
+la progr par 1
+la program 4
+la program en 1
+la program logiqu 1
+la program orient 1
+la program ou 1
+la program util 1
+la project 2
+la project dan 1
+la project de 1
+la project du 1
+la project orthogon 1
+la project qu 1
+la project rationnel 1
+la project sur 1
+la propag 1
+la propag de 1
+la proport 2
+la proport de 1
+la proposit 2
+la proposit dan 1
+la proposit de 1
+la proposit est 1
+la proposit mult 1
+la proposit pr 1
+la propr 3
+la prot 1
+la prot in 1
+la pu 2
+la pu de 1
+la pu dun 1
+la qualit 2
+la quantif 1
+la quantif explicit 1
+la quantioc 1
+la quantioc du 1
+la quantit 1
+la quatr 1
+la quatr em 1
+la quest 2
+la quest du 1
+la quest est 1
+la quest se 2
+la quest tout 1
+la queu 1
+la queu de 1
+la queu tn 1
+la r eal 2
+la r ecup 1
+la r ecur 1
+la r educ 2
+la r ef 2
+la r egl 1
+la r egularit 1
+la r epar 1
+la r epartit 1
+la r esolut 3
+la r eutil 2
+la r solut 1
+la racin 1
+la racin de 1
+la radiograph 1
+la raison 2
+la raison en 2
+la raison est 1
+la raison pour 1
+la rapidit 2
+la rar 1
+la recherch 4
+la recherch conjoint 1
+la recherch daffinit 1
+la recherch dam 1
+la recherch de 2
+la recherch dun 1
+la recherch peut 1
+la recherch scientifiqu 1
+la recherch tel 1
+la recherchescientifiqu 1
+la recon 1
+la recon aon 1
+la recon de 1
+la recon est 1
+la recon sont 1
+la reconstruc 1
+la reconstruc en 1
+la reconstruc tridimensionnel 1
+la rel 3
+la rel dordr 1
+la rel entr 1
+la rel est 1
+la rem 1
+la rendr 1
+la rendr artificiel 1
+la rendr efficac 1
+la repr 3
+la repr es 2
+la repr sent 1
+la reproduc 1
+la reproduc est 1
+la requ 2
+la requ es 2
+la requ te 1
+la responsabilit 2
+la restaur 1
+la restaur de 1
+la restaur du 1
+la restaur dun 1
+la restaur sappliqu 1
+la restructur 1
+la restructur de 1
+la ri 1
+la ri em 1
+la rigueur 1
+la rigueur dan 1
+la rigueur scientifiqu 1
+la robust 1
+la robust de 1
+la rom 1
+la rom de 1
+la rou 1
+la rou bi 1
+la rou proportionnel 1
+la rus 1
+la s ecurit 1
+la s elect 2
+la s emantiqu 3
+la s epar 2
+la s equ 3
+la s er 1
+la satisfaisabilit 1
+la sauvegard 1
+la sauvegard de 1
+la sauvegard sur 1
+la sauvegarder 1
+la sauvegarder dan 1
+la secon 4
+la secon boucl 1
+la secon caus 1
+la secon claus 1
+la secon con 1
+la secon condit 1
+la secon ecritur 1
+la secon observ 1
+la secon part 1
+la secon proposit 1
+la secon raison 1
+la secon solut 1
+la secon valeur 1
+la secon ver 1
+la sect 3
+la sect dan 1
+la sect de 1
+la sect esqu 1
+la sect suiv 1
+la segm 2
+la segm du 1
+la sel 2
+la sel charg 1
+la sel curiosit 1
+la sel diff 1
+la sel lim 1
+la sel solut 1
+la sel vo 1
+la sensibilit 1
+la signif 1
+la signif de 1
+la signioc 1
+la signioc suiv 1
+la siml 1
+la siml de 1
+la siml du 1
+la siml dun 1
+la siml guid 1
+la siml par 1
+la siml pr 1
+la siml qu 1
+la siml rep 1
+la siml rest 1
+la siml sor 1
+la simpl 1
+la simpl util 1
+la simplicit 1
+la simplif 1
+la simplif correspon 1
+la situ 1
+la situ est 1
+la solut 4
+la solut adopt 1
+la solut altern 1
+la solut ch 1
+la solut classiqu 1
+la solut con 1
+la solut glob 1
+la solut la 1
+la solut pr 1
+la solut qu 1
+la solut se 1
+la solut standard 1
+la som 3
+la som de 2
+la som du 1
+la som sur 1
+la sort 2
+la sort de 1
+la soupl 2
+la soupl de 2
+la soupl dinterv 1
+la sourc 1
+la sourc de 1
+la sourc princip 1
+la sourc soit 1
+la sous 1
+la sous popl 1
+la soustract 1
+la soustract sont 1
+la sp 3
+la sp ec 1
+la sp ecificit 2
+la strat 3
+la strat eg 3
+la structur 4
+la structur algorithmiqu 1
+la structur atomiqu 1
+la structur de 4
+la structur du 2
+la structur dun 2
+la structur est 1
+la structur particl 1
+la structur simd 1
+la substitut 1
+la substitut avec 1
+la substitut est 1
+la substitut la 1
+la substitut ne 1
+la substitut ou 1
+la sug 1
+la sug er 1
+la suit 4
+la suit cr 1
+la suit de 3
+la suit dench 1
+la suit du 2
+la suit dun 1
+la suit le 1
+la suit qu 1
+la suiv 3
+la sup 1
+la sup eriorit 1
+la supposer 1
+la supposer me 1
+la supposer qu 1
+la suppr 1
+la suppr du 1
+la surfac 1
+la surv 1
+la surv du 1
+la svd 1
+la svd de 1
+la sym 1
+la sym tr 1
+la synchron 2
+la synchron de 1
+la syntac 2
+la syntac concr 1
+la syntac de 1
+la syntac du 1
+la synth 1
+la synth es 1
+la t ach 1
+la t es 1
+la ta 1
+la tabl 3
+la tabl correspon 1
+la tabl dadr 1
+la tabl de 1
+la tabl don 1
+la tabl fournit 1
+la tail 5
+la tail de 4
+la tail don 1
+la tail du 3
+la tail dun 3
+la tail en 1
+la tail est 1
+la tail exact 1
+la tail import 1
+la tail init 1
+la tail ne 1
+la tail optim 1
+la tail tot 1
+la tail var 1
+la taxinom 1
+la taxinom de 1
+la techniqu 4
+la techniqu classiqu 1
+la techniqu de 3
+la techniqu destampil 1
+la techniqu du 2
+la techniqu pr 2
+la technolog 1
+la technolog de 1
+la temp 1
+la temp er 1
+la tempor 1
+la tempor al 1
+la tempor est 1
+la tempor stochastiqu 1
+la ten 1
+la ten futur 1
+la ten sinver 1
+la terminolog 1
+la terminolog de 1
+la terminolog dholzbaur 1
+la terminolog util 1
+la th 5
+la th eor 4
+la th es 3
+la th or 1
+la th se 1
+la topolog 2
+la topolog adopt 1
+la topolog consid 1
+la topolog de 1
+la topolog du 1
+la tr 3
+la tr em 3
+la trac 1
+la trac de 1
+la trajectoir 1
+la trajectoir suiv 1
+la trajectoir visit 1
+la transform 3
+la transform adapt 1
+la transform appliqu 2
+la transform assoc 2
+la transform aux 1
+la transform avec 1
+la transform con 1
+la transform correspon 1
+la transform de 2
+la transform don 1
+la transform dun 1
+la transform en 1
+la transform est 3
+la transform estim 1
+la transform fait 1
+la transform na 1
+la transform pa 1
+la transform perm 1
+la transform pr 2
+la transform prop 1
+la transform ren 1
+la transform se 1
+la transform sont 1
+la transform sur 1
+la transform ta 1
+la transform ten 1
+la transit 1
+la transit pan 1
+la transit tir 1
+la transit tj 1
+la transp 1
+la traver 1
+la traver ee 1
+la triangl 1
+la triangl de 1
+la un point 1
+la v erif 1
+la v rioc 1
+la val 3
+la val convainc 1
+la val de 2
+la val du 1
+la val exact 1
+la val probabil 1
+la valeur 4
+la valeur attr 1
+la valeur compteur 1
+la valeur correspon 2
+la valeur cour 1
+la valeur de 3
+la valeur du 2
+la valeur dun 2
+la valeur init 1
+la valeur pr 1
+la validit 4
+la vam 1
+la var 5
+la var al 1
+la var appar 1
+la var attribu 1
+la var ci 1
+la var cut 1
+la var dan 1
+la var de 2
+la var du 1
+la var dynamiqu 1
+la var en 1
+la var entr 1
+la var est 1
+la var gel 1
+la var i1 1
+la var i2 1
+la var ik 1
+la var la 1
+la var li 1
+la var libr 1
+la var perman 1
+la var pr 1
+la var qu 1
+la var se 1
+la var soit 1
+la var vi 1
+la var x1 1
+la var xk 1
+la ver 3
+la ver actuel 1
+la ver aftd 1
+la ver de 1
+la ver empl 1
+la ver en 1
+la ver fs 1
+la ver lin 1
+la ver op 1
+la ver orig 1
+la ver origin 2
+la ver oth 1
+la ver par 1
+la ver point 1
+la ver pp 1
+la ver prolog 1
+la ver simpl 1
+la ver triangulair 1
+la ver un 1
+la ver util 1
+la vi 4
+la vi classiqu 1
+la vi de 1
+la vi est 1
+la vi par 1
+la viabilit 1
+la virtualit 1
+la vit 2
+la vit de 1
+la vit dic 1
+la vo 1
+la volont 3
+la vraisembl 1
+la vraisembl de 1
+la vu 1
+la vu au 1
+la wam 1
+la wam afin 1
+la wam allou 1
+la wam assimil 1
+la wam avec 1
+la wam conduit 1
+la wam consid 1
+la wam de 1
+la wam dintroduir 1
+la wam doit 1
+la wam el 1
+la wam en 1
+la wam est 1
+la wam etant 1
+la wam fait 1
+la wam fonct 1
+la wam impl 1
+la wam ma 1
+la wam na 1
+la wam ne 1
+la wam ont 1
+la wam par 1
+la wam perm 1
+la wam peut 1
+la wam pour 1
+la wam qu 1
+la wam rajout 1
+la wam rep 1
+la wam restaur 1
+la wam sappu 1
+la wam se 1
+la wam sinterdit 1
+la wam soit 1
+la wam sont 1
+la wam standard 1
+la wam suff 1
+la wam suiv 1
+la wam sur 1
+la yougoslav 1
+la yougoslav qu 1
+la zon 2
+la zon de 1
+la zon par 1
+la zon peu 1
+la zon solut 1
+la78 1
+laag 1
+laag of erasmus 1
+lab 14
+lab and darp 1
+lab at ukc 1
+lab d elag 1
+lab de 3
+lab de ce 1
+lab de champ 1
+lab de compact 1
+lab de compr 1
+lab de coupur 1
+lab de court 1
+lab de courtcircuit 1
+lab de liaison 1
+lab de non 1
+lab de pav 1
+lab de point 1
+lab de support 1
+lab de test 1
+lab de tr 1
+lab denregister 1
+lab denregister indiqu 1
+lab destampil 1
+lab dincr 1
+lab dincr ement 1
+lab dit 1
+lab dit erat 1
+lab dop 1
+lab dop erateur 1
+lab dun 1
+lab dunif 1
+lab fl 1
+lab of columb 1
+lab of digit 1
+lab95 1
+labandon 1
+labandon du 1
+labandon du champ 1
+labaw 1
+labaw specif 1
+label 32
+label a0 1
+label accept 1
+label accept mod 1
+label accord 1
+label acycl 1
+label acycl graph 1
+label al sharp 1
+label as follow 1
+label as graph 1
+label as text 1
+label assign 1
+label assignm 1
+label b1 1
+label bod 1
+label by appl 1
+label collect 1
+label combin 1
+label con 1
+label confirm 1
+label confirm light 1
+label construc 1
+label construc edg 1
+label correct 1
+label displ 1
+label displ manager 1
+label docum 1
+label each link 1
+label edg 1
+label edg leav 1
+label el 1
+label el dorad 1
+label featur 1
+label form 1
+label funct 1
+label improv 1
+label li1 1
+label lrc 1
+label lrc 8k 1
+label neg 1
+label nl 1
+label of digit 1
+label of loop 1
+label of macr 1
+label on edg 1
+label oper 1
+label oper prov 1
+label out edg 1
+label proc 1
+label proc describ 1
+label r0 1
+label reg 2
+label reg refer 1
+label repr 1
+label scor 1
+label scor show 1
+label screen 1
+label screen clear 1
+label simpl 1
+label smal subgraph 1
+label spec form 1
+label specif 1
+label strateg 1
+label strateg respect 1
+label strateg tim 1
+label strateg11 1
+label th cluster 1
+label th displ 1
+label th nod 1
+label th root 1
+label th tetrahedr 1
+label to ind 1
+label tot 1
+label tr 1
+label using 1
+labor 38
+labor adelph 1
+labor ba 1
+labor ba experim 1
+labor becam 1
+labor becam oper 1
+labor box 1
+labor condit 1
+labor cooper 1
+labor cooper agr 1
+labor cooperativeagreementnumberdaah0495 1
+labor cr 1
+labor experim 2
+labor f ur 1
+labor for an 1
+labor for computer 1
+labor inform 1
+labor inform system 1
+labor institut 1
+labor lim 1
+labor ltd 1
+labor mur 1
+labor mur hil 1
+labor of computer 2
+labor pag 1
+labor proc 1
+labor research 1
+labor stud 1
+labor stud work 1
+labor techn 1
+labor wer perform 1
+labor wil allow 1
+labor1 1
+laboratoir 3
+laboratoir dautomatiqu 1
+laboratoir dautomatiqu de 1
+laboratoir de 2
+laboratoir dimpl 1
+laboratoir dimpl em 1
+labour 1
+labout 1
+labout dun 1
+labout dun op 1
+labrinid 1
+labyrinth 1
+lac 4
+lac de 1
+lac de absc 1
+lac in enforc 1
+lac m ed 1
+lacad 1
+lacad em 1
+lacad em roy 1
+lacc 3
+lacc el 1
+lacc el erat 1
+lacc es 3
+lacc es aux 1
+lacc es dun 1
+lacc es en 1
+lacc es par 1
+lacc es simultan 1
+lacc est 1
+lacc est mi 1
+lacc sur 2
+lacc sur la 1
+lacc sur lefficacit 1
+lacc sur leur 1
+laccompagn 1
+laccompagn ayant 1
+laccompagn pa 1
+laccompagn pa dun 1
+laccompagner 1
+laccompagner dun 1
+laccompagner dun partit 1
+laccr 2
+laccr du 2
+laccr du bruit 1
+laccr du nombr 1
+laccuml 1
+laccuml de 1
+laccuml de erreur 1
+lacg 1
+lack 24
+lack a convinc 1
+lack a subtransact 1
+lack any capabil 1
+lack any sort 1
+lack continu 1
+lack in gener 1
+lack of attent 1
+lack of bi 1
+lack of cap 1
+lack of chang 1
+lack of eff 2
+lack of empir 1
+lack of enthusiasm 1
+lack of explor 1
+lack of expr 1
+lack of fac 1
+lack of knowledg 1
+lack of me 1
+lack of method 1
+lack of opportun 1
+lack of support 1
+lack of theor 1
+lack of transl 1
+lack of uniqu 1
+lack th famil 1
+lack th report 1
+lack thereof 1
+lacr 1
+lact 2
+lact de 2
+lact de fail 1
+lact de transform 1
+lact du 2
+lact du group 1
+lactiv 1
+lactiv de 1
+lactiv de la 1
+lactiv de lop 1
+lacun 1
+lacun quant 1
+lad 1
+lad equ 1
+lad equ avec 1
+ladapt 1
+ladapt de 1
+ladapt de protocol 1
+ladapt du 1
+ladapt du program 1
+ladapt du protocol 1
+ladapter 1
+ladapter exact 1
+laddit 2
+laddit dun 1
+laddit dun champ 1
+laddit dun instruc 1
+laddit dun nouveau 1
+laddit et la 1
+ladin 1
+ladkin 1
+ladn 1
+ladopt 1
+ladopt dun 1
+ladopt dun architectur 1
+ladr 2
+ladr correspon 1
+ladr dan 1
+ladr dan la 1
+ladr de 1
+ladr de la 1
+ladr de lenregister 1
+ladr de retour 1
+ladr de variabl 1
+ladr don 1
+ladr don ee 1
+ladr du 1
+ladr du bloc 1
+ladr du champ 1
+ladr du cod 1
+ladr du dern 1
+ladr du fon 1
+ladr du point 1
+ladr du som 1
+ladr dun 1
+ladr dun bloc 1
+ladr est 1
+ladr est sauvegard 1
+ladr indirect 1
+ladr indirect en 1
+ladr m em 1
+ladr oe 1
+ladr physiqu 1
+ladr physiqu correspon 1
+ladr virtuel 1
+ladr virtuel nest 1
+laf 1
+laffect 3
+laffect de 1
+laffect de cel 1
+laffect destruc 1
+laffect destruc avec 1
+laffect destruc combin 1
+laffect destruc consom 1
+laffect destruc devrait 1
+laffect destruc peut 1
+laffect est 2
+laffect est suffisam 1
+laffect par 1
+laffect par lappel 1
+laffect seffectu 1
+laffect seffectu avant 1
+laffinit 1
+laffinit e entr 1
+laffinit e pag 1
+lafont 1
+laftd 1
+laftd dan 1
+lag 5
+lag au 1
+lag au bout 1
+lag com 1
+lag est 1
+lag est de 1
+lag hybr 1
+lag hybr grad 1
+lag in serv 1
+lag par 1
+lag par el 1
+lag reposerait 1
+lag reposerait sur 1
+lag soit 1
+lagc 1
+lagc au 1
+lagc au moy 1
+lagc avec 1
+lagc avec le 1
+lagc ce 1
+lagc ce qu 1
+lagc converg 1
+lagc converg ver 1
+lagc en 1
+lagc est 1
+lagc est consid 1
+lagc est gard 1
+lagc et indiqu 1
+lagc et le 1
+lagc nest 1
+lagc nest quun 1
+lagc par 1
+lagc par le 1
+lagc peut 1
+lagc peut etr 1
+lagc qu 1
+lagc qu la 1
+lagc sont 1
+lagc sont guid 1
+lagenc 1
+lagenc de 1
+lagenc de argum 1
+lagenc de ce 1
+lagenc de lenviron 1
+lagenc du 1
+lagenc du point 1
+lagenc dun 1
+lagenc dun environ 1
+lagenc dun point 1
+lagenc standard 1
+lagrang 1
+lagu 1
+laguer 1
+laguer ca 1
+laguer polynom 1
+laguer polynom fl 1
+lagun 1
+lahjomr 1
+lahjomr et al 1
+laid 2
+laidlaw 1
+laidlaw et al 1
+lair 1
+lair techn 1
+lair techn report 1
+laisser 3
+laisser au 2
+laisser au programmeur 1
+laisser la 1
+laisser la gest 1
+laisser le 2
+laisser le probl 1
+laisser le syst 1
+laisser se 1
+laisser se multipl 1
+laisser un 1
+laisser un cop 1
+laisson 1
+laisson se 1
+laisson se poursuivr 1
+laj 1
+lajout 3
+lajout de 2
+lajout de ce 1
+lajout de contraint 1
+lajout dun 1
+lajout dun etiqu 1
+lak 3
+lak cit 1
+lakshman 1
+lal 1
+lalg 1
+lalg br 1
+lalg br de 1
+lalgorithm 4
+lalgorithm conduit 1
+lalgorithm conduit alor 1
+lalgorithm correspon 1
+lalgorithm dancourt 1
+lalgorithm de 3
+lalgorithm de courtcircuit 1
+lalgorithm de el 1
+lalgorithm de four 1
+lalgorithm de fouriermotzkin 1
+lalgorithm de gram 1
+lalgorithm de jacob 1
+lalgorithm de recon 1
+lalgorithm du 1
+lalgorithm du simplec 1
+lalgorithm dunif 1
+lalgorithm dunif de 1
+lalgorithm est 1
+lalgorithm est daut 1
+lalgorithm et particl 1
+lalgorithm g en 2
+lalgorithm orient 1
+lalgorithm par 1
+lalgorithm par el 1
+lalgorithm peut 1
+lalgorithm peut converger 1
+lalgorithm po 1
+lalgorithm po ed 1
+lalgorithm qu 1
+lalgorithm qu nous 1
+lalgorithm standard 2
+lalgorithm standard de 1
+lalgorithm standard sur 1
+lalgorithm stochastiqu 1
+lalgorithm stochastiqu de 1
+lalgorithm suiv 1
+lalgorithm tout 1
+lalgorithm tout ent 1
+lalgorithm tr 1
+lalgorithm tr nid 1
+lalgorithm util 1
+lalgorithm util de 1
+lalign 1
+lalign de 1
+lalign de don 1
+lalign de lign 1
+lalign du 1
+lalign du tableau 1
+lalloc 2
+lalloc de 1
+lalloc de la 1
+lalloc dun 1
+lalloc dun environ 1
+lalloc physiqu 1
+lalloc physiqu de 1
+lallong 2
+lallong de 2
+lallong de certain 1
+lallong de vecteur 1
+lallong est 1
+lallong est born 1
+lallong est de 1
+lallong maxim 1
+lallong maxim en 1
+lallong perm 1
+lallong sur 1
+lallong sur le 1
+lallur 2
+lallur de 2
+lallur de perform 1
+lalon 1
+lalphab 1
+lalphab binair 1
+lalphab binair conform 1
+lalphab binair f0 1
+lalr 1
+laltern 2
+laltern correspon 1
+laltern correspon au 1
+laltern suiv 1
+lam 7
+lam and wilson 1
+lam elior 3
+lam elior de 1
+lam elior du 1
+lam elior obtenu 1
+lam enag 1
+lam enag spat 1
+lam et j.l 1
+lam hav report 1
+lam79 1
+lamb 1
+lamb list 1
+lambd 7
+lambd abstract 1
+lambd and le 1
+lambd and pa 1
+lambd calculus 4
+lambd cr 1
+lambd fnam 1
+lambd form 1
+lambd form def 1
+lambd gen 1
+lambd gen lambd 1
+lambd is domain 1
+lambd is ext 1
+lambd lambd 1
+lambd lambd list 1
+lambd list 1
+lambd list bod 1
+lambd list congru 1
+lambd list form 1
+lambd list incompat 1
+lambd list level 1
+lambd list syntac 1
+lambd list tel 1
+lambd list wid 1
+lambd macr 1
+lambd method 1
+lambd method init 1
+lambd spec form 1
+lambd syntac 1
+lambdaprolog 1
+lamdan 1
+lampleur 2
+lampleur de 1
+lampleur de conflit 1
+lampleur du 1
+lampleur du probl 1
+lampleur dun 1
+lampleur dun conflit 1
+lamport 8
+lamport and michael 1
+lampr 1
+lampr hemoglobin 1
+lampson 2
+lampson and other 1
+lan 13
+lan and p.t 1
+lan and wan 1
+lan compr 1
+lan connect 1
+lan de 4
+lan de dem 1
+lan de don 1
+lan de la 1
+lan de nid 1
+lan de propr 1
+lan doit 1
+lan doit egal 1
+lan environm 2
+lan environm con 2
+lan glob 1
+lan glob perm 1
+lan m etriqu 1
+lan multidimensionnel 1
+lan multidimensionnel de 1
+lan num 1
+lan num eriqu 1
+lan statistiqu 1
+lan statistiqu concern 1
+lan summerhil 1
+lan summerhil put 1
+lan summerhil93 1
+lan vs 1
+lan91 1
+lanalog 1
+lanalog avec 1
+lanalog avec le 1
+lanatom 1
+lanatom de 1
+lanatom de prolog 1
+lanc 1
+lanc attribut 1
+lanc attribut en 1
+lanc ee 1
+lanc etat 1
+lanc etat dev 1
+lanc foncteur 1
+lanc foncteur doit 1
+lanc r esolut 1
+lanc valeur 1
+lanc valeur de 1
+lanc var 1
+lanc var com 1
+lanc var nest 1
+lancer 2
+lancer de 1
+lancer de rayon 1
+lancer la 1
+lanciennet 1
+lanciennet e rel 1
+lancz 1
+lancz algorithm 1
+lancz lik algorithm 1
+lancz matr 1
+lancz method 1
+lancz method appl 1
+lancz method lansp 1
+lancz spar 1
+lancz tridiagon 1
+lancz tridiagon suggest 1
+lancz vect 1
+lancz vect qi 1
+land 6
+land dr 1
+land mil 1
+land of research 1
+land parcel 1
+land tant 1
+land tant pour 1
+landau 1
+landmark 1
+landmark candid 1
+landmark candid thank 1
+landmark correspon 1
+landmark dat 1
+landmark under rigid 1
+landwehr 1
+lang 8
+lang a la 1
+lang autr 1
+lang autr qu 1
+lang bool 1
+lang bool een 1
+lang c est 1
+lang cibl 1
+lang cibl du 1
+lang de 2
+lang de program 2
+lang de typ 1
+lang dimpl 1
+lang dimpl em 1
+lang expressif 1
+lang fortran 1
+lang on parl 1
+lang ou 1
+lang ou acc 1
+lang pa 1
+lang pa par 1
+lang perm 1
+lang perm la 1
+lang prolog 1
+lang soient 1
+lang soient tr 1
+lang util 1
+langl 1
+langst 1
+langt 1
+langu 74
+langu a gener 1
+langu abcl 1
+langu abcl r3 1
+langu about tw 1
+langu accept 1
+langu allow 3
+langu alphab 1
+langu alread offer 1
+langu an 1
+langu an mil 1
+langu and appl 3
+langu and cam 1
+langu and compiler 6
+langu and composit 1
+langu and computer 2
+langu and implem 2
+langu and inform 3
+langu and interfac 1
+langu and lingu 1
+langu and mach 1
+langu and memor 1
+langu and model 1
+langu and oper 8
+langu and pr 1
+langu and program 3
+langu and run 1
+langu and system 5
+langu and tool 1
+langu antimatr 1
+langu any decl 1
+langu appear 2
+langu approach 1
+langu ar ba 1
+langu ar eager 1
+langu ar inadequ 1
+langu ar mand 1
+langu ar strict 1
+langu as defin 1
+langu as part 1
+langu aspect 1
+langu awk 1
+langu ba 7
+langu babel 1
+langu be den 1
+langu both support 1
+langu by control 1
+langu by map 1
+langu by rel 1
+langu by separ 1
+langu cal maudelog 1
+langu cal oblog 1
+langu can ea 1
+langu cap 1
+langu cc 1
+langu cesp 1
+langu chal 1
+langu chip 2
+langu chronolog 1
+langu cl 1
+langu cl ti 1
+langu coinc 2
+langu combin 2
+langu combin arithm 1
+langu combin funct 1
+langu commun 1
+langu comparison 1
+langu compiler 2
+langu compl 1
+langu compreh 1
+langu compreh using 1
+langu con 3
+langu concept 1
+langu construc 6
+langu construc mark 1
+langu construc prompt 1
+langu construc using 1
+langu construc wh 1
+langu consult 1
+langu consult system 1
+langu dat 3
+langu dat domain 1
+langu defin 2
+langu defin symbol 1
+langu definit 2
+langu definit status 1
+langu dep 1
+langu dep modl 1
+langu dep string 1
+langu describ 1
+langu descript 2
+langu design 11
+langu design effort 1
+langu design principl 1
+langu developm 2
+langu developm tool 1
+langu differ 1
+langu docum 1
+langu el 1
+langu elect 1
+langu equiv 1
+langu eulisp 1
+langu europ 1
+langu except tempor 1
+langu ext 4
+langu famil 1
+langu featur 4
+langu for ad 1
+langu for combin 1
+langu for dat 1
+langu for datab 1
+langu for dataflow 1
+langu for decl 1
+langu for describ 2
+langu for exper 1
+langu for fin 1
+langu for oper 1
+langu for shar 1
+langu for softwar 1
+langu for solut 1
+langu for tempor 1
+langu for writ 1
+langu framework 1
+langu from posit 1
+langu from sect 1
+langu gener 2
+langu giv 1
+langu grammar 2
+langu hardwarep 1
+langu haskel 1
+langu hav mutu 1
+langu hoop 1
+langu hoop describ 1
+langu html 1
+langu identif 1
+langu impl 2
+langu impl typ 1
+langu implem 4
+langu implementer 1
+langu in appl 1
+langu in individu 1
+langu in quest 1
+langu inclus 1
+langu indep 5
+langu indep kernel 1
+langu indep model 2
+langu infer 1
+langu infl 1
+langu infl sem 1
+langu input 1
+langu int 1
+langu int cod 1
+langu int simpl 1
+langu integr 1
+langu interfac 2
+langu involut 1
+langu is assemblerlik 1
+langu is ba 1
+langu is bound 1
+langu is defin 2
+langu is design 1
+langu is ext 1
+langu is giv 1
+langu is rich 1
+langu is self 1
+langu is spok 1
+langu is starheight 1
+langu is suit 1
+langu is univer 1
+langu kcm 1
+langu kcm host 1
+langu label 1
+langu label strateg 1
+langu learn 1
+langu lik ad 1
+langu lik hilog 1
+langu lik smalltalk 1
+langu luc 2
+langu manu 1
+langu may help 1
+langu may inclus 1
+langu mean 1
+langu mechan 1
+langu mechan inherit 1
+langu ment 1
+langu ml 2
+langu ml empl 1
+langu model 2
+langu model unclear 1
+langu mor faith 1
+langu object 1
+langu object prolog 1
+langu occam 1
+langu of den 2
+langu of dl 1
+langu of dynam 1
+langu of fifth 1
+langu of polynom 2
+langu of rel 1
+langu of stimulus 1
+langu of typ 1
+langu offer 1
+langu on top 1
+langu onl support 1
+langu or langu 1
+langu outlin 1
+langu paradigm 2
+langu paradigm con 1
+langu pl 1
+langu plm 1
+langu pltim 1
+langu pract 1
+langu preproc 1
+langu proc 3
+langu proc system 1
+langu proc tool 1
+langu program 1
+langu prolog 1
+langu refer 3
+langu refer manu 3
+langu requir 2
+langu result 1
+langu s built 1
+langu schem 2
+langu sl1 1
+langu sort 1
+langu sort particl 1
+langu specif 5
+langu specif el 1
+langu specif featur 1
+langu stream 1
+langu structur 2
+langu styl 1
+langu subject 1
+langu subject po 1
+langu such commun 1
+langu support 3
+langu support nest 1
+langu support serv 1
+langu syntac 1
+langu techniqu 1
+langu text 2
+langu th claus 1
+langu th compiler 1
+langu th user 1
+langu that ext 1
+langu that inclus 1
+langu that offer 1
+langu that support 1
+langu theorem 1
+langu theorem perspectiv 1
+langu to def 1
+langu to incorpor 1
+langu to learn 1
+langu to par 1
+langu to program 1
+langu to us 2
+langu tok 2
+langu transl 1
+langu transl using 1
+langu typ 1
+langu under consider 1
+langu under un 1
+langu understand 3
+langu understand problem 1
+langu us 2
+langu us inherit 1
+langu us1 1
+langu user 1
+langu user guid 1
+langu using 3
+langu using part 1
+langu usu support 1
+langu ver 3
+langu we us 1
+langu wer explor 1
+langu wh exper 1
+langu wh modl 1
+langu when compar 1
+langu which con 1
+langu which explicit 1
+langu with cl 1
+langu with const 1
+langu with constraint 1
+langu with fd 1
+langu with inherit 1
+langu with multipl 1
+langu with polynom 1
+langu with proc 1
+langu with select 1
+langu workshop 2
+lanneau 2
+lannec 1
+lannec a don 1
+lannec a est 1
+lannl 1
+lansp 1
+lansp prov 1
+lansym 1
+lanzol 1
+lap 4
+lap ca 1
+lap oper 1
+lapack 2
+lapack rout 1
+lapack rout dstein 1
+lapack user 1
+lapack user guid 1
+lapadl 1
+lapadl model 1
+lapalm 1
+lapalm and vauch 1
+lapaugh 2
+laplac 1
+laplac equ 1
+laplac equ solver 1
+lapparit 2
+lapparit de 1
+lapparit dun 1
+lapparit dun ev 1
+lappel 2
+lappel a celu 1
+lappel a cut 1
+lappel a proc 1
+lappel a un 1
+lappel au 1
+lappel au pr 1
+lappel correspon 1
+lappel correspon au 1
+lappel cour 1
+lappel du 1
+lappel du pr 1
+lappel du prem 1
+lappel effectu 1
+lappel init 1
+lappel peut 1
+lappel peut etr 1
+lappel r ecursif 1
+lappel sp 1
+lappel sp ec 1
+lappel termin 1
+lappel termin aur 1
+lappl 3
+lappl aff 1
+lappl aff h1 1
+lappl assoc 1
+lappl assoc ee 1
+lappl de 2
+lappl de ce 2
+lappl de la 1
+lappl direct 1
+lappl direct de 1
+lappl doutil 1
+lappl doutil alg 1
+lappl du 1
+lappl du corollair 1
+lappl du lem 1
+lappl du partit 1
+lappl dun 1
+lappl dun tel 1
+lappl dun transform 1
+lappl h est 1
+lappl lin 1
+lappl lin eair 1
+lappl nl 1
+lappl pay 1
+lappl pay uniqu 1
+lappl t etant 1
+lappl t perm 1
+lappl t qu 1
+lappliquer 1
+lappliquer dan 1
+lappliquer dan le 1
+lappliquer il 1
+lappliquer il faudr 1
+lapport 2
+lapport de 1
+lapport de don 1
+lapport dun 1
+lapport dun siml 1
+lapproch 5
+lapproch a perm 1
+lapproch de 1
+lapproch de val 1
+lapproch omanuel 1
+lapproch par 1
+lapproch par diffus 1
+lapproch par inv 1
+lapproch r ecent 1
+lapproxim 1
+lapproxim obtenu 1
+lapproxim obtenu dan 1
+lapproxim qu 1
+lapproxim qu lon 1
+laqu 1
+laqu ryer 1
+laqu ryer93 1
+laquel 4
+laquel agit 1
+laquel aucun 1
+laquel aucun de 1
+laquel cach 1
+laquel cach de 1
+laquel ce 1
+laquel ce maxim 1
+laquel chaqu 1
+laquel chaqu individu 1
+laquel correspondrait 1
+laquel correspondrait un 1
+laquel de 1
+laquel de el 1
+laquel est 1
+laquel est ex 1
+laquel il 1
+laquel il ser 1
+laquel il termin 1
+laquel la 1
+laquel la vi 1
+laquel le 2
+laquel le perform 1
+laquel le tableau 1
+laquel on ajout 1
+laquel on va 1
+laquel rep 1
+laquel rep ce 1
+laquel reposeront 1
+laquel reposeront lespac 1
+laquel sappliqu 1
+laquel sappliqu la 1
+laquel sont 1
+laquel sont rang 1
+lar 13
+lar baekgaard 1
+lar carter 1
+lar et du 1
+lar hag 1
+lar ol 1
+lar ol ander 1
+lar peterson 1
+lar rudolph 1
+lar surfac 1
+lar th 1
+lar th oriqu 1
+lar wal 1
+lar92 1
+larbitrair 1
+larbitrair du 1
+larbitrair du ch 1
+larbr 1
+larbr a pour 1
+larbr de 1
+larbr de recherch 1
+larchitectur 3
+larchitectur a pil 1
+larchitectur a topolog 1
+larchitectur distribu 1
+larchitectur distribu ee 1
+larchitectur et aux 1
+larchitectur mimd 1
+larchitectur mimd diff 1
+larchitectur simd 1
+larchitectur simd comport 1
+larchitectur sisd 1
+larchitectur sisd est 1
+larchitectur standard 1
+larg 11
+larg applicabl 1
+larg dappl 1
+larg de 1
+larg de propr 1
+larg exploit 1
+larg ind 1
+larg ind epen 1
+larg indep 2
+larg indep compon 1
+larg indistingu 1
+larg laffinit 1
+larg orthogon 1
+larg posit 1
+larg respon 1
+larg th work 1
+larg unr 1
+larg unstructur 1
+larg unstructur system 1
+larg unsuit 1
+larg untyp 1
+larg untyp langu 1
+larg util 1
+larger 58
+larger 8x8 1
+larger 8x8 interconnect 1
+larger 8x8 mesh 1
+larger amount 1
+larger and denser 1
+larger and larger 2
+larger ar 3
+larger b decomposit 1
+larger b level 1
+larger batch 1
+larger blip 1
+larger block 1
+larger block siz 1
+larger buffer 1
+larger bw 1
+larger bw gener 1
+larger c impl 1
+larger c program 1
+larger cardin 1
+larger channel 3
+larger channel width 3
+larger chunk 1
+larger chunk siz 1
+larger cluster 3
+larger cluster maintain 1
+larger cluster modl 1
+larger cluster nb 1
+larger cluster offer 2
+larger cluster requir 1
+larger cluster siz 3
+larger cluster technolog 1
+larger cod 2
+larger commun 1
+larger compon 1
+larger configur 1
+larger configur keep 1
+larger configur nec 1
+larger configur support 1
+larger context 1
+larger cost 1
+larger cost effect 1
+larger dat 1
+larger dat block 1
+larger datab 2
+larger digit 1
+larger domain 1
+larger effort 1
+larger ent 1
+larger environm 1
+larger execut 1
+larger execut spac 1
+larger forml 1
+larger fw 1
+larger fw help 1
+larger group 1
+larger ident 1
+larger imag 2
+larger in modulus 1
+larger input 1
+larger integer 1
+larger inter 2
+larger inter wir 2
+larger interconnect 1
+larger interconnect requir 1
+larger lower 1
+larger lower bound 1
+larger m impl 1
+larger mc 1
+larger mc reg 1
+larger me 2
+larger me siz 1
+larger misclassif 1
+larger misclassif rat 1
+larger network 3
+larger network random 1
+larger number 8
+larger overhead 1
+larger overlap 1
+larger overlap ar 1
+larger pack 1
+larger pack siz 1
+larger pag 1
+larger pag actu 1
+larger part 1
+larger part cl 1
+larger pattern 1
+larger perc 1
+larger problem 5
+larger problem rel 1
+larger problem solut 1
+larger proc 1
+larger proc cluster 1
+larger processorcluster 1
+larger program 2
+larger puzzl 1
+larger quer 1
+larger reduc 1
+larger sampl 1
+larger scal 1
+larger scal ca 1
+larger se 1
+larger sect 1
+larger shar 1
+larger shar us 1
+larger siz 4
+larger siz system 1
+larger siz using 1
+larger ssm 1
+larger st 1
+larger st requir 1
+larger subject 1
+larger supernod 1
+larger supernod mean 1
+larger switch 1
+larger system 6
+larger system deliver 1
+larger system result 1
+larger td 1
+larger text 1
+larger text reg 1
+larger th integer 1
+larger th problem 1
+larger th tail 1
+larger than ln 1
+larger than min 1
+larger than test 1
+larger than tol 1
+larger than usu 1
+larger toler 1
+larger unsatisf 1
+larger unsatisf forml 1
+larger valu 1
+larger vocabl 1
+larger window 1
+larger window prov 1
+larger window sign 1
+largest 26
+largest amount 1
+largest b level 1
+largest bal 1
+largest bal cluster 1
+largest block 1
+largest board 2
+largest board siz 2
+largest child 1
+largest cluster 3
+largest cluster siz 3
+largest confid 1
+largest connect 1
+largest connect se 1
+largest const 1
+largest dev 1
+largest differ 1
+largest el 1
+largest el om 1
+largest ind 1
+largest init 1
+largest init order 1
+largest length 1
+largest multicast 1
+largest multicast pack 1
+largest nod 1
+largest number 6
+largest pack 2
+largest perform 1
+largest perform gain 1
+largest po compar 1
+largest po network 1
+largest po start 1
+largest power 1
+largest problem 1
+largest reserv 1
+largest reserv el 1
+largest sum 1
+largest system 1
+largest system siz 1
+largest ten 1
+largest ten problem 1
+largest timestamp 1
+largest timestamp tx0 1
+largest typ 1
+largest valu 3
+largest valu allow 1
+largeur 2
+largeur et la 1
+largum 1
+largum additionnel 1
+largum additionnel de 1
+largum additionnel est 1
+largum de 1
+largum dind 1
+largum du 1
+largum dun 1
+largum dun term 1
+largum est 1
+largum est init 1
+largum est instanc 1
+largum nest 1
+largum nest pa 1
+largum no de 1
+largum noarg 1
+largum noarg de 1
+largum remplac 1
+largum sav 1
+largum suppl 1
+largum suppl ementair 1
+larit 1
+larit e com 1
+larit e dan 1
+larit e de 1
+larit e du 1
+larit e est 1
+larit e peut 1
+larit e se 1
+larithm 2
+larithm etiqu 2
+larithm etiqu compil 1
+larithm etiqu dordr 1
+larithm etiqu dun 1
+larithm etiqu nest 1
+larithm etiqu ont 1
+larithm etiqu requ 1
+larrab 1
+larrab algorithm 1
+larson 1
+larson upd 1
+larson upd deriv 1
+lart 3
+lart concern 1
+lart de 1
+lart de algorithm 1
+larticl 4
+larticl de 1
+larticl de synth 1
+larticl de van 1
+larticl entr 1
+larticl entr la 1
+larus 1
+laser 3
+laser and camer 1
+laser beam 1
+laser cover 1
+laser dat 1
+laser int 1
+laser int collect 1
+laser int dat 1
+laser is project 1
+laser light 1
+laser light plan 1
+laser mount 1
+laser project 1
+laser ray 1
+laser ray project 1
+laser scan 1
+laser spot 1
+laser spot cr 1
+laser strip 1
+laser strip contrast 1
+laser strip project 1
+laser strip prototyp 1
+laser strip result 1
+lashl 1
+lasir 1
+lask 1
+laspect 2
+laspect qu 1
+laspect qu peut 1
+laspect statistiqu 1
+laspect statistiqu du 1
+lasser 1
+lasser de 1
+lasser de bon 1
+lasser est 1
+lassez 2
+last 3
+last until tim 1
+lastc 1
+lastchunk 1
+lastchunk is upd 1
+lastnod 1
+lastnod act 1
+lastnod act nod 1
+lastnod ar handl 1
+lastnod currnod 1
+lastnod currnod cand 1
+lastnod is introduc 1
+lastnod is se 1
+lastnod4 1
+lastnod4 si 1
+lastp 1
+lastuc 1
+lastuc qu 1
+lastuc qu con 1
+lastverteilungsalgorithm 1
+lastverteilungsalgorithm f ur 1
+lat 35
+lat 1970s 1
+lat and bandwidth 1
+lat and bound 1
+lat and del 1
+lat and ea 1
+lat and incr 1
+lat and isol 1
+lat and offer 1
+lat and requir 1
+lat and show 1
+lat and slight 1
+lat approach 1
+lat as pgp 1
+lat asp 1
+lat bind 1
+lat but satur 1
+lat by inser 1
+lat commun 1
+lat comput 1
+lat curv 1
+lat cycl 1
+lat cycl tim 1
+lat de 2
+lat de commun 1
+lat de la 2
+lat decr 1
+lat definit 1
+lat draft 1
+lat du 1
+lat el 1
+lat expr 1
+lat fair 1
+lat fair complec 1
+lat for broadcast 1
+lat for synchron 1
+lat graph 1
+lat grow 1
+lat grow disproport 1
+lat hav fixpoint 1
+lat in cycl 1
+lat incr 1
+lat is attain 1
+lat is infinit 1
+lat is problem 1
+lat macr 1
+lat macr pack 1
+lat model 2
+lat of agreed 1
+lat of broadcast 1
+lat of dupl 1
+lat of id 1
+lat of multicast 1
+lat of prefetch 1
+lat of softwar 1
+lat of sub 1
+lat overl 1
+lat overl techniqu 1
+lat problem 1
+lat rat 1
+lat rat server 1
+lat reduc 1
+lat result 1
+lat result inclus 1
+lat seen 1
+lat server 1
+lat should cl 1
+lat si 1
+lat si repr 1
+lat structur 1
+lat suffer 1
+lat throughput 1
+lat tim 1
+lat tim slot 1
+lat to prov 1
+lat un multicast 1
+lat user 1
+lat user guid 1
+lat using 1
+lat using centr 1
+lat var 1
+lat versus bo 1
+lat versus sustain 1
+lat versus throughput 1
+lat vs 2
+lat which inclus 1
+latbw 1
+latbw commperf.html 1
+latch 2
+latch is shown 1
+latch to act 1
+latencythroughput 1
+latencythroughput character 1
+latent 1
+latent somewh 1
+later 3
+later and ver 1
+later inhibit 1
+later modl 1
+later net 1
+lateron 1
+latest 6
+latest deadl 1
+latest input 1
+latest input tok 1
+latest tim 1
+latest tw approxim 1
+latest ver 2
+latin 3
+latin capit 1
+latin capit letter 1
+latin squar 1
+latin squar design 1
+latitud 1
+latitud and longitud 1
+latomb 1
+latteint 1
+latteint de 1
+latter 49
+latter accord 1
+latter act 1
+latter algorithm 2
+latter algorithm empl 1
+latter algorithm tak 1
+latter approach 3
+latter approach cr 1
+latter ar comput 1
+latter ar evalu 1
+latter ask 1
+latter ask succ 1
+latter aspect 1
+latter ca 7
+latter comp 1
+latter comput 1
+latter condit 1
+latter correspon 1
+latter criter 1
+latter do dut 1
+latter environm 1
+latter featur 1
+latter forc 1
+latter ha high 1
+latter hap 1
+latter inclus 1
+latter inclus argum 1
+latter is defin 1
+latter is init 1
+latter is lim 1
+latter is simil 1
+latter is term 1
+latter is view 1
+latter keep 1
+latter may contain 1
+latter mean 1
+latter method 1
+latter modl 1
+latter modl optim 1
+latter paper 1
+latter paper contain 1
+latter prim 1
+latter prim domin 1
+latter problem 3
+latter qu 1
+latter repr 1
+latter requir 1
+latter requir dat 1
+latter result 1
+latter schem 1
+latter signif 1
+latter situ 1
+latter st 1
+latter tak 2
+latter tak cl 1
+latter tw opt 1
+latter us 1
+latter wil suffer 1
+latter work 1
+lattribut 2
+lattribut a bien 1
+lattribut attr1 1
+lattribut cour 1
+lattribut cour dun 1
+lattribut dan 1
+lattribut dan le 1
+lattribut de 1
+lattribut de la 1
+lattribut dun 2
+lattribut dun boucl 1
+lattribut dun var 1
+lattribut ec 1
+lattribut est 1
+lattribut est repr 1
+lattribut pr 1
+lattribut pr ec 1
+lau 1
+lau and t.p 1
+lau94 1
+lauderd 1
+laudon 2
+lauer 1
+laugm 1
+laugm brut 1
+laugm brut de 1
+laugm de 1
+laugm de la 1
+laugm du 1
+laugm du nombr 1
+laugm du par 1
+launch 1
+launch th correspon 1
+laur 2
+laur ha 1
+laurin 1
+lauritz 2
+lauritz aalborg 1
+lauritz and spiegelhalter 1
+lauritz cowel 1
+lauritz ol 1
+lauritz spiegelhalter 1
+laus 1
+laut 3
+laut d epen 1
+laut ef 1
+laut ef er 1
+laut r ef 1
+laut stabil 1
+laut stabil dan 1
+lauteur 2
+lauteur ne 2
+lauteur ne compact 1
+lauteur ne don 1
+lauteur sont 1
+lauteur sont pa 1
+lautr 2
+lautr au 1
+lautr au retour 1
+lautr dan 1
+lautr dan un 1
+lautr dun 1
+lautr dun multipl 1
+lautr en 1
+lautr en mod 1
+lautr extr 1
+lautr extr em 1
+lautr fon 1
+lautr fon ee 1
+lautr pour 1
+lautr pour le 1
+lautr sur 1
+lautr sur la 1
+lautr var 1
+lav 5
+lav d etr 3
+lav davoir 1
+lav de 3
+lav de ce 1
+lav de conduir 1
+lav de faciliter 2
+lav de fournir 1
+lav de la 1
+lav de laisser 1
+lav de ne 2
+lav de opr 1
+lav de restreindr 1
+lav de sauver 1
+lav de tirer 1
+lav dentrelacer 1
+lav dentrelacer le 1
+lav dern 1
+lav dern appel 1
+lav dexplorer 1
+lav dexplorer le 1
+lav en 1
+lav en du 1
+lav est 1
+lav est quaucun 1
+lav princip 1
+lav princip dun 1
+lav sur 1
+lav sur ce 1
+lavenir 1
+lavenir le 1
+lavenir le sel 1
+lavingt 1
+lavon 1
+lavon sign 1
+lavon vu 1
+lavon vu la 1
+lavrac 1
+law 11
+law and air 1
+law b.1 1
+law b.10 1
+law b.11 1
+law b.2 1
+law b.3 1
+law b.4 1
+law b.5 1
+law b.6 1
+law b.7 1
+law b.8 1
+law b.9 1
+law of demeter 2
+law of gravit 1
+law of inform 1
+law of mot 1
+law wil tak 1
+law93 1
+lawler 3
+lawr 8
+lawr erlbaum 3
+lawr erlbaum assoc 3
+lawr livermor 1
+lawr livermor kernel 1
+lawson 1
+lay 2
+lay ar 1
+lay out hierarch 1
+layer 17
+layer abstract 1
+layer abstract funct 1
+layer abstract system 1
+layer abstract techniqu 1
+layer acknowledg 1
+layer activ 1
+layer and run 1
+layer and support 1
+layer ar comp 1
+layer ar compon 1
+layer bp 1
+layer bp model 1
+layer bp network 1
+layer calculatedj 1
+layer calculatedj using 1
+layer contain 1
+layer deep 1
+layer definit 1
+layer demultiplec 1
+layer feed 1
+layer feed for 1
+layer feedfor 1
+layer feedfor network 1
+layer feedfor neur 1
+layer flow 1
+layer flow control 1
+layer hierarch 1
+layer hierarch system 1
+layer impl 3
+layer inclus 1
+layer indep 1
+layer indep se 1
+layer is connect 1
+layer is correct 1
+layer is ea 1
+layer is load 1
+layer is pr 1
+layer is stat 1
+layer label 1
+layer libr 1
+layer lit 1
+layer lit bp 1
+layer multicast 1
+layer multiplec 1
+layer must us 1
+layer network 1
+layer of abstract 1
+layer of hid 1
+layer of kcm 1
+layer of neuron 1
+layer of perceptron 1
+layer of softwar 1
+layer of weight 1
+layer on top 1
+layer or problem 1
+layer organ 1
+layer overhead 1
+layer pa 1
+layer parameter 1
+layer parameter specif 1
+layer perceptron 1
+layer problem 1
+layer prov 1
+layer recogniz 1
+layer recov 1
+layer recur 1
+layer recur neur 1
+layer refer 1
+layer rn 1
+layer se 1
+layer se st 1
+layer siz 1
+layer st 1
+layer subsystem 1
+layer system 1
+layer system realiz 1
+layer that guar 1
+layer thus 1
+layer thus transform 1
+layer to comp 1
+layer to man 1
+layer to prov 1
+layer transact 1
+layer wil timeout 1
+layer with proc 1
+layerindep 1
+layerindep libr 1
+layout 18
+layout algorithm 2
+layout an 1
+layout an method 1
+layout and expr 1
+layout and fal 1
+layout and font 1
+layout and structur 1
+layout and typograph 1
+layout ar 1
+layout decr 1
+layout design 1
+layout determin 1
+layout edit 1
+layout indep 1
+layout indep docum 1
+layout indep phy 1
+layout influ 1
+layout is compext 1
+layout is correct 1
+layout is strong 1
+layout lead 1
+layout plan 1
+layout problem 2
+layout problem assoc 1
+layout problem using 1
+layout repr 1
+layout repr con 1
+layout simil 1
+layout specif 1
+layout specif constraint 1
+layout structur 1
+layout synth 1
+layout synth system 1
+layout system 1
+layout techniqu 1
+layout techniqu ba 1
+layout to user 1
+layyer 1
+layyer approach 1
+laz 8
+laz con 1
+laz dog 1
+laz inform 1
+laz inform neighbor 1
+laz inv 1
+laz inv av 1
+laz inv method 1
+laz list 1
+laz manner 1
+laz narrow 1
+laz receiver 1
+laz receiver proc 1
+laz rel 1
+laz rel con 1
+laz sem 1
+laz upd 1
+lazowsk 1
+lb 2
+lb com 1
+lb com le 1
+lb doit 1
+lb doit etr 1
+lb et la 1
+lb marqu 1
+lb marqu lendroit 1
+lb n econom 1
+lb pour 1
+lb pour deux 1
+lb rempl 1
+lbh 1
+lbl 2
+lbl of label 1
+lbl workshop 1
+lbsl91 1
+lc 7
+lc dist 1
+lc dist router 1
+lc ear break 1
+lc flag 1
+lc stag 1
+lc87 1
+lcbw93 1
+lccr 1
+lccr tr 1
+lcf 1
+lcj 1
+lck 1
+ld 2
+ld min 1
+ld p ld 1
+ld st 1
+le 98
+le 3d 1
+le 3d de 1
+le a ai 1
+le a b0 1
+le a b1 1
+le a configur 1
+le a denot 1
+le a distingu 1
+le a fault 1
+le a funct 1
+le a limk 1
+le a ln 1
+le a load 1
+le a parallel 1
+le a se 1
+le a v0n 1
+le a0 2
+le a1 3
+le a4 1
+le ac 2
+le ac correspon 1
+le ac de 1
+le ac dit 1
+le acc 2
+le acc edent 1
+le acc es 2
+le adapt 1
+le adj 1
+le adr 2
+le adr de 2
+le adr sont 1
+le adr virtuel 1
+le affect 1
+le affect destructiv 1
+le ag 1
+le ag constitu 1
+le ag nutil 1
+le ag rep 1
+le ag sont 1
+le ag travail 1
+le ag util 1
+le ai 2
+le ai 2l 1
+le al 1
+le al denot 1
+le algorithm 2
+le algorithm classiqu 1
+le algorithm de 2
+le algorithm eux 1
+le algorithm par 1
+le algorithm sont 1
+le alloc 1
+le altern 1
+le altern vou 1
+le am elior 1
+le an atom 1
+le an integer 1
+le an interpr 1
+le anc 2
+le anc direct 1
+le anc valeur 1
+le another handler 1
+le appar 1
+le appar dan 1
+le appel 1
+le appel aux 1
+le appel interm 1
+le appl 3
+le appl dan 1
+le appl potentiel 1
+le appl rationnel 1
+le appl tud 1
+le approch 1
+le approch qu 1
+le ar giv 1
+le architect 1
+le architect diff 1
+le architectur 2
+le architectur mimd 1
+le architectur par 2
+le argum 2
+le argum au 1
+le argum combinatoir 1
+le argum de 1
+le argum doiv 1
+le argum etant 1
+le argum modif 1
+le argum sauvegard 1
+le argum soient 1
+le argum temporair 1
+le argum util 1
+le aspect 3
+le aspect du 1
+le aspect ducatif 1
+le aspect th 1
+le atom 1
+le atout 1
+le atout de 1
+le attent 1
+le attribut 1
+le attribut de 1
+le attribut en 1
+le attribut inutil 1
+le attribut ne 1
+le attribut sous 1
+le aut 2
+le aut ef 1
+le auteur 2
+le auteur appliqu 1
+le auteur conclu 1
+le auteur de 1
+le auteur prop 1
+le autr 3
+le autr argum 1
+le autr ca 3
+le autr cel 1
+le autr champ 1
+le autr colon 1
+le autr cop 1
+le autr en 1
+le autr etant 1
+le autr etud 1
+le autr group 1
+le autr mi 1
+le autr opt 1
+le autr processeur 1
+le autr register 1
+le autr transform 1
+le autr valeur 1
+le autr variabl 1
+le av 1
+le avant 2
+le avant conceptuel 1
+le avant de 1
+le avant dun 1
+le b colon 1
+le b en 2
+le ba 2
+le ba de 1
+le ba dun 1
+le ba th 1
+le barycentr 1
+le barycentr dun 1
+le bassin 1
+le bateau 1
+le bateau par 1
+le bbn 1
+le besoin 1
+le besoin dinclur 1
+le besoin du 1
+le bi 5
+le bi du 1
+le bi dun 1
+le bind 1
+le bind introduc 1
+le bit 1
+le bloc 2
+le bloc bn 1
+le bloc de 1
+le bloc est 1
+le bloc nest 1
+le bloc sont 1
+le bloc sur 1
+le bm 1
+le bon 2
+le bon comport 1
+le bon propr 1
+le borgn 1
+le born 1
+le born assoc 1
+le born correspon 1
+le born de 1
+le born don 1
+le born du 1
+le born en 1
+le born inf 1
+le born li 1
+le born obtenu 1
+le born suiv 1
+le born sup 1
+le borner 1
+le boucl 1
+le boucl ce 1
+le boucl de 1
+le boucl extern 1
+le boucl intern 1
+le boucl ne 1
+le boucl par 1
+le boucl pr 1
+le boucl puisquon 1
+le bp 1
+le branch 1
+le breslau 1
+le bruit 1
+le bruit sur 1
+le build 1
+le build block 1
+le but 1
+le but cibl 1
+le but constitu 1
+le but cour 1
+le but cut 1
+le but dan 1
+le but danalyser 1
+le but de 4
+le but du 1
+le but eux 1
+le but geler 1
+le but init 1
+le but le 1
+le but ser 1
+le but suiv 1
+le but tout 1
+le c denot 4
+le c jy1jjy2j 1
+le c on 1
+le c1 1
+le ca 6
+le ca cc 1
+le ca com 1
+le ca contrair 3
+le ca dacc 1
+le ca dan 2
+le ca de 4
+le ca dobj 1
+le ca du 3
+le ca dun 4
+le ca el 1
+le ca en 1
+le ca epineux 1
+le ca etud 1
+le ca evoqu 1
+le ca favor 1
+le ca ic 1
+le ca le 1
+le ca lor 1
+le ca lorsquon 1
+le ca non 1
+le ca osm 1
+le ca p0 1
+le ca par 1
+le ca particl 2
+le ca pour 2
+le ca qu 1
+le ca quand 1
+le ca rationnel 1
+le ca rig 1
+le ca si 1
+le ca sil 1
+le ca sur 1
+le ca vectoriel 1
+le cach 2
+le cach augm 1
+le cach de 2
+le cach du 1
+le cach est 1
+le cadr 4
+le cadr de 4
+le cadr dhpf 1
+le cadr du 2
+le cadr dun 2
+le cadr pr 1
+le cadr st 1
+le calcl 4
+le calcl de 2
+le calcl du 3
+le calcl inutil 1
+le calcl modif 1
+le calcl par 1
+le calcl peut 1
+le calcl pr 1
+le calcl relatif 1
+le calcl suiv 1
+le calculateur 1
+le calculateur multiprocesseur 1
+le calculateur paragon 1
+le calculateur vectoriel 1
+le capacit 1
+le capacit es 1
+le capit 1
+le caract 3
+le caract eristiqu 3
+le cardin 2
+le cardin de 2
+le cardin du 1
+le cart 1
+le cart exponentiel 1
+le caus 1
+le caus mi 1
+le caus possibl 1
+le cc 1
+le cc accept 1
+le cc cr 1
+le cc fail 1
+le cc form 1
+le cc identif 1
+le cc k1 1
+le cc k2 1
+le cc succeed 1
+le cel 1
+le cel allou 1
+le cel correspon 1
+le cel estampil 1
+le cel inaccessibl 1
+le cel sur 1
+le cel variabl 1
+le ch 5
+le ch concern 1
+le ch dan 1
+le ch de 3
+le ch dun 4
+le ch entr 1
+le ch in 1
+le ch li 1
+le ch ne 1
+le ch par 1
+le ch qu 2
+le ch sest 1
+le champ 4
+le champ applicatif 1
+le champ argum 1
+le champ attribut 1
+le champ bp 1
+le champ continu 1
+le champ cutpt 1
+le champ dappl 2
+le champ de 1
+le champ est 1
+le champ non 1
+le champ point 1
+le champ substitut 1
+le champ valeur 1
+le champ vaut 1
+le chanc 1
+le chanc dobtenir 1
+le chang 3
+le chang de 2
+le chang du 1
+le chapitr 3
+le chapitr est 1
+le chapitr inclut 1
+le chapitr suiv 2
+le chapitr ult 1
+le charg 1
+le charg seront 1
+le charger5 1
+le chemin 1
+le chemin non 1
+le chromosom 1
+le chromosom est 1
+le cl 2
+le cl ad 1
+le cl denot 1
+le claus 1
+le claus avec 1
+le claus binair 1
+le claus candid 1
+le claus entr 1
+le claus interm 1
+le claus non 1
+le claus qu 1
+le claus sont 1
+le claus suiv 1
+le claus termin 1
+le clef 1
+le clef adapt 1
+le cm 1
+le cn 1
+le co 4
+le co ut 4
+le cod 3
+le cod abstrait 1
+le cod binair 1
+le cod correspon 1
+le cod de 1
+le cod du 1
+le cod en 1
+le cod est 1
+le cod eventuel 1
+le cod exploser 1
+le cod figur 1
+le cod fin 1
+le cod init 1
+le cod interm 1
+le cod ne 1
+le cod num 1
+le cod obtenu 1
+le cod optim 1
+le cod par 1
+le cod produit 1
+le cod prolog 1
+le cod scientifiqu 1
+le cod sourc 1
+le cod spmd 1
+le cod transform 1
+le cod wam 1
+le coeff 1
+le coeff de 1
+le coeff ji 1
+le coeff positif 1
+le coeff soit 1
+le coeur 1
+le coeur du 1
+le cofacteur 1
+le cofacteur de 1
+le colon 2
+le colon de 2
+le colon du 1
+le colon font 1
+le colon sont 1
+le com 1
+le combiner 3
+le combiner dan 1
+le commerc 1
+le commun 1
+le commun entr 1
+le commun suiv 1
+le comp 4
+le comp de 1
+le comp du 1
+le comp i1 1
+le comp sont 2
+le compar 1
+le compar aux 1
+le comparaison 2
+le comparaison avec 1
+le comparaison sont 1
+le compil 1
+le compil en 1
+le compilateur 2
+le compilateur classiqu 1
+le compilateur daquarius 1
+le compilateur de 2
+le compilateur doit 1
+le compilateur fortran 1
+le compilateur kcm 1
+le compilateur par 1
+le compilateur perm 1
+le compilateur peut 1
+le compilateur pour 1
+le compilateur produit 1
+le compilateur prolog 1
+le compilateur qu 1
+le compl 2
+le compl ementair 2
+le compl eter 1
+le comport 4
+le comport asymptotiqu 1
+le comport de 3
+le comport du 2
+le comport dun 1
+le comport effectif 1
+le comport est 1
+le comport lim 1
+le comport relatif 1
+le comport sont 1
+le comprom 1
+le compteur 1
+le compteur do 1
+le compteur lor 1
+le compteur ordin 1
+le compteur sp 1
+le con 3
+le con de 1
+le con equ 1
+le con sur 1
+le con tir 1
+le concept 3
+le concept de 2
+le concept dun 1
+le concepteur 2
+le concepteur montr 1
+le conclus 1
+le conclus suiv 1
+le condit 3
+le condit de 2
+le condit dic 1
+le condit qu 1
+le configur 2
+le configur quil 1
+le configur spat 1
+le configur suiv 1
+le conflit 1
+le conflit entr 1
+le conflit est 1
+le conflit eventuel 1
+le conflit ne 1
+le conflit ont 1
+le conflit peut 1
+le conflit se 1
+le conflit sont 1
+le cong 1
+le congru 1
+le congru sont 1
+le conjonct 1
+le conserv 1
+le conserv pa 1
+le consid 1
+le consid erat 1
+le construc 1
+le construc conditionnel 1
+le constructeur 1
+le constructeur de 1
+le contenu 2
+le contenu de 2
+le contenu du 1
+le context 2
+le context de 2
+le context du 1
+le context dun 1
+le context est 1
+le context etait 1
+le context init 1
+le contour 1
+le contr 1
+le contr ol 1
+le contraint 3
+le contraint concern 1
+le contraint du 1
+le contraint imp 1
+le contraint inh 1
+le contraint qu 2
+le contraint redon 1
+le contraint rest 1
+le contraint sous 1
+le contraint sur 1
+le contraint temporel 1
+le contribut 1
+le contribut de 1
+le cop 1
+le cop dautr 1
+le cop de 1
+le cop ec 1
+le cop loc 1
+le cop sauf 1
+le corollair 1
+le corollair de 1
+le corollair du 1
+le corollair le 1
+le corollair suiv 1
+le coroutin 1
+le coroutin ne 1
+le corp 2
+le corp de 2
+le corp dun 1
+le correspon 1
+le correspon entr 1
+le cou 1
+le cou de 1
+le coupl 3
+le coupl chinebr 1
+le coupl de 2
+le coupl dit 1
+le coupl form 1
+le coupl processeur 1
+le coupur 1
+le coupur loc 1
+le coupur profon 1
+le coupur standard 1
+le coupur superficiel 1
+le courb 2
+le courb de 1
+le courb peuv 1
+le court 1
+le court circuit 1
+le cover 1
+le cr 3
+le cr constitu 1
+le cr etant 1
+le cr loc 1
+le cr mult 1
+le cr repr 1
+le cr t3d 1
+le cr uniform 1
+le crit 3
+le crit er 1
+le crit re 1
+le croir 1
+le cub 1
+le cub logiqu 1
+le cun 2
+le cycl 1
+le cycl de 1
+le d 10mb 2
+le d ebut 2
+le d eclench 1
+le d ecod 1
+le d ecomposit 1
+le d ecoup 1
+le d efaut 1
+le d efinit 2
+le d egrad 1
+le d el 2
+le d emar 1
+le d emonstr 1
+le d epart 1
+le d epen 1
+le d epil 1
+le d epiler 1
+le d eplac 1
+le d es 1
+le d esav 1
+le d etail 1
+le d eterm 1
+le d eterminer 1
+le d etr 1
+le d evelop 2
+le d g00 1
+le d riv 1
+le d termin 1
+le d velop 1
+le d2 1
+le dat 1
+le dat auxquel 1
+le dat de 1
+le dat util 1
+le de 3
+le de bruit 1
+le de con 1
+le de la 1
+le def 1
+le deg 1
+le degexc 1
+le degexc deg 1
+le degr 1
+le degr es 1
+le dern 3
+le dern aspect 1
+le dern ca 2
+le dern champ 1
+le dern en 1
+le dern er 1
+le dern maillon 1
+le dern mot 1
+le dern pav 1
+le dern point 1
+le dern pr 1
+le dern processeur 1
+le dern segm 1
+le descript 1
+le descript de 1
+le deux 5
+le deux acc 1
+le deux adr 1
+le deux approch 1
+le deux argum 1
+le deux autr 1
+le deux bloc 1
+le deux boucl 1
+le deux ca 2
+le deux claus 1
+le deux coeff 1
+le deux condit 1
+le deux convec 1
+le deux coupur 1
+le deux dern 2
+le deux eff 1
+le deux em 1
+le deux ensembl 1
+le deux famil 1
+le deux impl 1
+le deux instruc 2
+le deux logiciel 1
+le deux mi 1
+le deux nid 1
+le deux op 1
+le deux ordonnanc 1
+le deux paragraph 1
+le deux part 1
+le deux partit 1
+le deux point 2
+le deux pointeur 1
+le deux prem 2
+le deux principaux 1
+le deux processeur 1
+le deux program 1
+le deux proposit 1
+le deux protocol 1
+le deux suit 1
+le deux suiv 1
+le deux techniqu 2
+le deux th 1
+le deux transit 1
+le deux treil 1
+le deux typ 1
+le deux valeur 1
+le deux variabl 1
+le deux vecteur 2
+le deux ver 2
+le dg 1
+le di 1
+le di rent 1
+le diff 5
+le diff er 1
+le diff erent 5
+le differ 1
+le differ param 1
+le difficult 2
+le difficult es 2
+le dilat 1
+le dilat util 1
+le dim 1
+le direct 3
+le direct a1 1
+le direct correspon 1
+le direct init 1
+le disc 1
+le disc furent 1
+le disjonct 1
+le dispositif 1
+le dispositif de 1
+le distingu 1
+le distingu de 1
+le distribut 1
+le distribut originel 1
+le diver 1
+le diver variabl 1
+le dl 1
+le dnt 1
+le do 1
+le dock 1
+le doiv 1
+le doiv pa 1
+le domain 3
+le domain auquel 1
+le domain de 2
+le domain dexplor 1
+le domain dit 1
+le domain soit 1
+le don 5
+le don ee 4
+le don es 1
+le drapeau 1
+le drapeau doit 1
+le drapeau est 1
+le drapeau superficiel 1
+le droit 1
+le droit dacc 1
+le droit de 1
+le droit en 1
+le droit lectur 1
+le droit sur 1
+le dur 3
+le dur ee 3
+le e denot 1
+le e0 1
+le e00i 1
+le e00j 1
+le e0i 1
+le e1 1
+le each proc 3
+le each secon 1
+le ecart 1
+le ecart typ 1
+le echang 1
+le echang dindividus 1
+le echantillon 1
+le ecritur 1
+le ecritur dan 1
+le ecritur r1 1
+le ecritur sur 1
+le ecueil 1
+le ecueil de 1
+le eexc 1
+le eff 4
+le eff de 3
+le eff du 2
+le eff dun 1
+le eff dus 1
+le eff ind 1
+le eff positif 1
+le ei 2
+le ek 1
+le ek denot 1
+le el 2
+le el ement 2
+le elimin 1
+le elimin de 1
+le elimin etant 1
+le encourag 1
+le encourag nont 1
+le endroit 1
+le endroit du 1
+le enf 2
+le enf dun 1
+le enf remplac 1
+le enonc 1
+le enonc es 1
+le enregister 1
+le enregister avec 1
+le enregister correspon 1
+le enregister de 1
+le enregister devenus 1
+le enregister entr 1
+le enregister toujour 1
+le enseign 1
+le env 1
+le env de 1
+le environ 3
+le environ de 1
+le environ dev 1
+le environ dun 1
+le environ par 1
+le environ pr 1
+le environ sug 1
+le espac 2
+le espac dadr 1
+le espac de 1
+le estampil 1
+le estampil de 1
+le estampil lor 1
+le estimateur 1
+le estimateur compt 1
+le et al 1
+le et ken 1
+le etap 1
+le etap dun 1
+le etat 1
+le etat ain 1
+le etat de 1
+le etat ne 1
+le etiqu 1
+le etiqu cl 1
+le etiqu seq 1
+le etud 2
+le etud ant 1
+le etud empiriqu 1
+le ev 1
+le ev en 1
+le ev pair 1
+le ev proc 1
+le evalu 2
+le evalu de 1
+le evalu du 1
+le eventuel 1
+le exempl 2
+le exempl qu 1
+le exempl util 1
+le exp 3
+le exp er 2
+le exp ri 1
+le expr 1
+le expr com 1
+le ext 1
+le ext ne 1
+le extr 1
+le extr em 1
+le f denot 2
+le f fl 1
+le f ki 1
+le f1 2
+le f1i 1
+le f1i f2i 1
+le facilit 1
+le facilit es 1
+le facteur 4
+le facteur clef 1
+le facteur dacc 1
+le facteur dam 1
+le facteur dexpan 1
+le facteur influ 1
+le facteur sont 1
+le faibl 2
+le faibl de 2
+le fair 3
+le fair pour 1
+le fair refroidir 1
+le fait 5
+le fait de 2
+le fait qu 5
+le fait quil 1
+le fait quon 1
+le faux 1
+le faux part 1
+le fauxpart 1
+le fen 1
+le fen etr 1
+le fer 1
+le fer participer 1
+le ferait 1
+le ff 1
+le ffl0 1
+le fi 1
+le fi sont 1
+le figur 2
+le fin 1
+le fin de 1
+le fit 1
+le fit dun 1
+le fit fi 1
+le fit tot 1
+le flot 1
+le flot de 1
+le fluc 1
+le fluc de 1
+le fon 1
+le fon de 1
+le fon du 1
+le fonct 4
+le fonct begin 1
+le fonct co 1
+le fonct de 3
+le fonct du 1
+le fonct fi 1
+le fonct inf 1
+le fonct matriciel 1
+le fonct maxim 1
+le fonct scalair 1
+le fonct uj 1
+le foncteur 1
+le foncteur darit 1
+le foncteur de 1
+le foncteur dun 1
+le foncteur nest 1
+le foncteur point 1
+le foncteur princip 1
+le foncteur var 1
+le fonctionnalit 1
+le font 1
+le font le 1
+le for inst 1
+le form 3
+le form aux 1
+le fournit 1
+le fournit pa 1
+le fp 1
+le fp denot 1
+le fpng 1
+le fpng denot 1
+le fs1 1
+le fs1 s2 1
+le ftng 1
+le ftng satisf 1
+le fu0 1
+le fuit 1
+le fuit de 1
+le fur 1
+le fur montr 1
+le fx 1
+le fx1 1
+le fxg 1
+le g en 2
+le g merg 1
+le g od 1
+le g0 3
+le gain 2
+le gain de 1
+le gain dun 1
+le gain en 1
+le gain moy 1
+le gain par 1
+le gard 1
+le gard aux 1
+le gard inclu 1
+le gard peuv 1
+le gel 1
+le gel dun 1
+le gener 1
+le gener rel 1
+le gestionnair 2
+le gestionnair de 2
+le gestionnair doit 1
+le gestionnair est 1
+le gestionnair la 1
+le gestionnair me 1
+le gestionnair ou 1
+le gestionnair pour 1
+le gestionnair qu 1
+le gestionnair sont 1
+le gestionnair trait 1
+le gestionnair transm 1
+le ggt 1
+le gil 2
+le gil nec 1
+le gk 1
+le gk hk 1
+le glob 1
+le glob sont 1
+le gp 1
+le grad 1
+le grain 1
+le grain de 1
+le grand 2
+le grand lign 2
+le grand plaisir 1
+le grandeur 2
+le grandeur caract 1
+le graph 3
+le graph de 2
+le graph g1 1
+le group 2
+le group ain 1
+le gt 1
+le gt denot 1
+le guid 1
+le guid de 1
+le gxj0 1
+le h denot 1
+le h1 1
+le habitud 1
+le habitud de 1
+le hd 1
+le hi 2
+le hierarch 1
+le hierarch compar 1
+le hn 2
+le horlog 1
+le horlog de 1
+le htot 1
+le htot denot 1
+le huitouz 1
+le hypoth 2
+le hypoth es 2
+le i charg 1
+le i em 1
+le i ssr 1
+le id ee 3
+le id0 1
+le ignorer 1
+le ik1 1
+le imag 2
+le imag de 1
+le impl 2
+le impl de 1
+le impl em 1
+le implanter 1
+le implanter dan 1
+le in egalit 1
+le inconv 2
+le inconv enient 2
+le incr 1
+le incr ement 1
+le ind 4
+le ind acc 1
+le ind consid 1
+le ind de 3
+le ind en 1
+le ind est 1
+le ind i0 1
+le ind ij 1
+le ind var 1
+le individus 1
+le individus aient 1
+le individus ayant 1
+le individus de 1
+le individus dun 1
+le individus le 1
+le individus parent 1
+le individus sont 1
+le individus util 1
+le industriel 1
+le industriel pr 1
+le influ 1
+le influ respectiv 1
+le inform 2
+le inform concern 1
+le inform de 1
+le inform ma 1
+le inform qu 1
+le inst 2
+le inst de 2
+le inst ensembl 1
+le instanc 1
+le instruc 2
+le instruc cal 1
+le instruc correspon 1
+le instruc dacc 1
+le instruc dalloc 1
+le instruc dappel 1
+le instruc de 2
+le instruc dealloc 1
+le instruc dunif 1
+le instruc fail 1
+le instruc figur 1
+le instruc ne 1
+le instruc neck 1
+le instruc part 1
+le instruc put 1
+le instruc qu 1
+le instruc r1 1
+le instruc responsabl 1
+le instruc retr 1
+le instruc susceptibl 1
+le instruc trait 1
+le instruc trust 1
+le instruc try 1
+le instruc util 1
+le instruc wam 1
+le int 2
+le int egrer 1
+le int grer 1
+le integer 1
+le interact 2
+le interact entr 2
+le interd 1
+le interd epen 1
+le interfac 1
+le interv 2
+le interv de 1
+le interv don 1
+le invar 1
+le it childr 1
+le it erat 1
+le it erateur 1
+le j chang 1
+le jacob 1
+le jacob de 1
+le jacob est 1
+le japon 1
+le jeu 2
+le jeu de 1
+le jeu dinstruc 1
+le jour 1
+le jour ou 1
+le jp 1
+le jug 2
+le jug de 1
+le jug quil 1
+le k prem 1
+le k rang 1
+le k repr 1
+le ki 1
+le ki em 1
+le kn 1
+le ks 1
+le kx 1
+le l ab 1
+le l etiqu 1
+le l m2 1
+le l ment 1
+le l0 1
+le l1 2
+le l1i 1
+le l1i l2i 1
+le lang 2
+le lang cibl 1
+le lang de 1
+le lang dimpl 1
+le lang fortran 1
+le lang prolog 1
+le last disk 1
+le le 1
+le le con 1
+le lecteur 2
+le lecteur se 1
+le lecteur sont 1
+le lecteur trouver 1
+le lectur 1
+le lectur peuv 1
+le lectur se 1
+le lem 1
+le lettr 1
+le lettr bloqu 1
+le level 1
+le level compar 1
+le li 2
+le li em 1
+le liaison 1
+le liaison au 1
+le liaison concern 1
+le liaison conditionnel 1
+le liaison enregister 1
+le liaison responsabl 1
+le lib 1
+le lib erer 1
+le lien 2
+le lien avec 1
+le lien entr 2
+le lieu 1
+le lieu de 1
+le lign 3
+le lign de 1
+le lign du 1
+le lign qu 1
+le lim 2
+le lim de 1
+le lisp 2
+le lisp de 1
+le lisp ver 1
+le list 1
+le liv 1
+le livr 1
+le livr de 1
+le lk 1
+le lk denot 1
+le loc 1
+le loc queu.first 1
+le logiciel 1
+le logiciel utilisabl 1
+le long de 1
+le lost 1
+le lost me 1
+le m ecan 5
+le m em 3
+le m emoir 2
+le m es 1
+le m etayer 1
+le m ethod 3
+le m thod 1
+le m triqu 1
+le m xj1xj2 1
+le m1 2
+le ma 1
+le mach 4
+le mach abstrait 1
+le mach actuel 1
+le mach de 1
+le mach le 1
+le mach mimd 1
+le mach offr 1
+le mach par 1
+le mach sont 1
+le macr 2
+le maint 1
+le maint de 1
+le manuel 1
+le manuel de 1
+le marg 1
+le marg de 1
+le mark 1
+le mark chr 1
+le marqu 2
+le marqu cour 1
+le marqu evit 1
+le marqu init 1
+le marqu mk 1
+le marqu xn 1
+le mat 2
+le mat eriel 2
+le math 1
+le math emat 1
+le matr 3
+le matr de 1
+le matr dinc 1
+le maxim 2
+le maxim de 1
+le maxim est 1
+le maxim fourn 1
+le me 2
+le me au 1
+le me check 1
+le me de 1
+le meilleur 4
+le meilleur de 1
+le meilleur fit 1
+le meilleur individu 1
+le meilleur individus 1
+le meilleur moy 1
+le meilleur perform 1
+le meilleur solut 1
+le menu 1
+le menu ma 1
+le mesur 2
+le mesur don 1
+le mesur effectu 1
+le mesur loc 1
+le mesur qu 1
+le mg 1
+le mgu 1
+le mgu mgu 1
+le mi 4
+le mi en 2
+le micr 1
+le micr par 1
+le microprocesseur 1
+le mieux 2
+le mieux adapt 2
+le mieux qu 1
+le migr 1
+le migr de 1
+le migr suppl 1
+le milieu 1
+le milieu etud 1
+le minim 2
+le minim don 1
+le minim dun 1
+le minim obtenu 1
+le minim th 1
+le minim usuel 1
+le ml 1
+le ml minfp 1
+le mod 5
+le mod dacc 1
+le mod de 3
+le mod dunif 1
+le mod el 3
+le modif 3
+le modif de 2
+le modif du 1
+le modif non 1
+le modif par 1
+le modif qu 1
+le modl 2
+le modl assoc 1
+le modl engendr 1
+le modl var 1
+le moin 2
+le moin favor 1
+le moin fort 1
+le moment 1
+le montr 3
+le montr ce 2
+le montr la 2
+le montr le 1
+le montrer 1
+le montrer dan 1
+le mor cycl 1
+le mor soph 1
+le mot 1
+le mot pr 1
+le motorol 1
+le mouv 2
+le mouv de 2
+le moy 2
+le moy de 1
+le moy mn 1
+le multicast 1
+le multicast switch 1
+le multipl 2
+le multipl de 1
+le multipl valeur 1
+le munir 1
+le munir dun 1
+le mvp 1
+le mvp ec 1
+le n card 1
+le n colon 1
+le n ecessit 1
+le n jxz1 1
+le n qn 1
+le n upl 1
+le n.v 1
+le n1 1
+le nb 1
+le nb denot 1
+le nc 1
+le ncub 1
+le net 1
+le net de 1
+le new locationentr 1
+le next trackk 1
+le nid 1
+le nid comport 1
+le nid de 1
+le nid init 1
+le nid ne 1
+le nid nest 1
+le nid origin 1
+le nid seront 1
+le nid suiv 1
+le nid transform 1
+le niveaux 1
+le niveaux de 1
+le nk 2
+le nk denot 1
+le nod 1
+le noeud 3
+le noeud destinatair 1
+le noeud echang 1
+le noeud la 1
+le noeud util 1
+le nom 3
+le nom de 3
+le nom du 1
+le nombr 5
+le nombr alarm 1
+le nombr cour 1
+le nombr dacc 2
+le nombr dargum 1
+le nombr de 5
+le nombr dindirect 1
+le nombr dinv 1
+le nombr dit 2
+le nombr doccur 1
+le nombr exact 1
+le nombr exp 1
+le nombr glob 1
+le nombr maxim 1
+le nombr minim 1
+le nombr moy 1
+le nombr tot 2
+le nombreus 2
+le nombreus conver 1
+le nombreus recherch 1
+le nombreus var 1
+le nombreux 2
+le nombreux ca 1
+le nombreux domain 1
+le norm 1
+le not 3
+le not de 2
+le not du 1
+le not pr 1
+le not puisqu 1
+le not qu 1
+le not suiv 2
+le not th 1
+le nouveau 2
+le nouveau nid 1
+le nouveau point 1
+le nouveau propr 1
+le nouveau som 1
+le nouveau syst 1
+le nouveau vecteur 1
+le nouveaux 3
+le nouveaux individus 1
+le nouveaux term 1
+le nouveaux vecteur 1
+le nouvel 4
+le nouvel argum 1
+le nouvel attribut 1
+le nouvel born 1
+le nouvel don 1
+le nouvel environ 1
+le nouvel etat 1
+le nouvel op 1
+le noyau 1
+le noyau de 1
+le noyau du 1
+le nr 2
+le num 2
+le num er 2
+le nw 1
+le nw denot 1
+le o pav 1
+le o1 1
+le obj 3
+le obj accessibl 1
+le obj consid 1
+le obj locaux 1
+le obj qu 1
+le obj util 1
+le object 1
+le object contr 1
+le occ 1
+le oe 3
+le oe fx 1
+le oe oe 1
+le oe oe1 1
+le oe1 1
+le oe2 1
+le oltr 1
+le oltr de 1
+le op 5
+le op erat 4
+le op erateur 3
+le op rat 1
+le optim 1
+le optim classiqu 1
+le optim du 1
+le optim prop 1
+le ordonnanc 1
+le ordonnanc cycliqu 1
+le organ 1
+le organ sup 1
+le outil 1
+le outil arithm 1
+le outil dan 1
+le p ad 1
+le p denot 1
+le p fp1 1
+le p js 1
+le p n1 1
+le p patht 1
+le p processeur 1
+le p1 3
+le pa 4
+le pa dacc 1
+le pa dargum 1
+le pa de 2
+le pa denot 1
+le pa du 1
+le pa graduel 1
+le pa obtenu 1
+le pa pour 1
+le pa quon 1
+le pa xi 1
+le pag 1
+le pag acc 1
+le pag au 1
+le pag conflictuel 1
+le pag cont 1
+le pag dan 1
+le pag de 1
+le pag etant 1
+le pag fr 1
+le pag modif 1
+le pag qu 1
+le pag rest 1
+le pag sont 1
+le pag stabl 1
+le pair 1
+le pair en 1
+le par 2
+le par elism 2
+le paragraph 2
+le paragraph don 1
+le paragraph pr 2
+le paragraph suiv 2
+le param 4
+le param etr 3
+le param tr 1
+le parcour 1
+le parcour de 1
+le parcour du 1
+le parcour est 1
+le parcourir 1
+le parcourir par 1
+le part 3
+le part com 1
+le part de 1
+le part dun 1
+le part en 1
+le part non 1
+le part se 1
+le partit 1
+le partit adapt 1
+le partit de 1
+le partit devait 1
+le partit du 1
+le partit en 1
+le partit le 1
+le partit par 1
+le partit qu 1
+le pathlength 1
+le patron 1
+le patron acc 1
+le patron aut 1
+le patron ch 1
+le patron dind 1
+le patron jusqu 1
+le patron nest 1
+le patron peut 1
+le patron peuv 1
+le patron ser 1
+le patron seront 1
+le patron sont 1
+le pattern 1
+le pav 1
+le pav avec 1
+le pav es 1
+le pav perm 1
+le pav prop 1
+le pav suiv 1
+le pb 1
+le pb denot 1
+le per 1
+le per en 1
+le perd 1
+le perd pour 1
+le perform 4
+le perform acceptabl 1
+le perform actuel 1
+le perform de 4
+le perform du 1
+le perform dun 3
+le perform es 1
+le perform gr 1
+le perform obtenu 1
+le perform respectiv 1
+le perform seront 1
+le perform si 1
+le perform sont 2
+le person 2
+le person int 1
+le person qu 2
+le petit 1
+le petit tail 1
+le pgcd 1
+le pgcd de 1
+le ph 2
+le ph de 1
+le ph doptim 1
+le ph enom 2
+le pi 3
+le pic 1
+le pic de 1
+le pil 1
+le pil cr 1
+le pil loc 1
+le ping 1
+le ping pong 1
+le pir 3
+le pir ca 2
+le pir comport 1
+le pir de 2
+le plac 1
+le plac de 1
+le plan 2
+le plan exp 1
+le plus abstrait 1
+le plus anc 1
+le plus classiqu 1
+le plus co 1
+le plus de 2
+le plus efficac 3
+le plus eloign 1
+le plus fa 1
+le plus favor 1
+le plus fin 1
+le plus fr 1
+le plus intern 1
+le plus mal 1
+le plus mauv 1
+le plus novateur 1
+le plus perform 2
+le plus petit 2
+le plus proch 1
+le plus rapid 2
+le plus souv 2
+le plus util 2
+le plus vast 1
+le po 1
+le poid 1
+le poid de 1
+le poid relatif 1
+le poid respectif 1
+le point 4
+le point acc 1
+le point ch 1
+le point cl 1
+le point constitu 1
+le point correspon 1
+le point dabsc 1
+le point de 2
+le point dengag 1
+le point dentr 1
+le point ent 1
+le point extr 1
+le point fa 1
+le point interm 1
+le point ou 1
+le point pour 1
+le point projectif 1
+le point sur 1
+le pointeur 1
+le pointeur de 1
+le pol 1
+le pol edr 1
+le popl 1
+le popl init 1
+le popl naturel 1
+le popl successiv 1
+le port 1
+le port de 1
+le possibilit 2
+le possibilit es 1
+le potentiel 1
+le potentiel de 1
+le potentiel dun 1
+le pour 1
+le pour un 1
+le pourc 1
+le pourc de 1
+le pourc denviron 1
+le ppcm 1
+le pr 2
+le pr ecaut 1
+le pr edicat 1
+le pr ef 1
+le pr es 1
+le pr symbol 1
+le pr1 1
+le prab 1
+le prem 4
+le prem acc 1
+le prem appel 1
+le prem argum 1
+le prem aux 1
+le prem ca 2
+le prem champ 1
+le prem compilateur 1
+le prem coupl 1
+le prem dan 1
+le prem de 1
+le prem dun 1
+le prem el 2
+le prem er 3
+le prem etant 1
+le prem ind 1
+le prem inutil 1
+le prem livr 1
+le prem nid 1
+le prem patron 1
+le prem point 1
+le prem probl 1
+le prem register 1
+le prem sav 1
+le prem sur 1
+le prem syst 1
+le prem tableau 1
+le prem term 1
+le prem travaux 1
+le prem vecteur 1
+le prim 1
+le primitiv 3
+le primitiv fail 1
+le primitiv ont 1
+le primitiv qu 1
+le primitiv sont 1
+le princip 4
+le princip caract 1
+le princip de 2
+le princip diff 1
+le princip en 1
+le princip enonc 1
+le princip inconv 1
+le princip int 1
+le princip mach 1
+le princip propr 1
+le principaux 4
+le principaux aspect 1
+le principaux el 1
+le principaux outil 1
+le principaux param 2
+le principaux probl 1
+le probabilit 2
+le probabilit es 2
+le probl 5
+le probl em 4
+le probl me 1
+le processeur 3
+le processeur ayant 1
+le processeur cibl 1
+le processeur dan 1
+le processeur de 1
+le processeur disponibl 1
+le processeur du 1
+le processeur ecrit 1
+le processeur effectu 1
+le processeur en 1
+le processeur est 1
+le processeur etant 1
+le processeur font 1
+le processeur gr 1
+le processeur le 1
+le processeur ne 2
+le processeur non 1
+le processeur nous 1
+le processeur num 1
+le processeur p0 1
+le processeur par 1
+le processeur pen 1
+le processeur peuv 1
+le processeur po 1
+le processeur privil 1
+le processeur pu 1
+le processeur qu 1
+le processeur soit 1
+le processeur sont 1
+le processeur sourc 1
+le processeur termin 1
+le processus 4
+le processus continu 1
+le processus de 1
+le processus en 1
+le processus ne 1
+le processus peuv 1
+le prochain 1
+le prochain paragraph 1
+le produir 1
+le produir en 1
+le produit 2
+le produit dun 1
+le produit ext 1
+le produit matr 1
+le produit vectoriel 1
+le program 2
+le program ayant 1
+le program com 2
+le program comport 1
+le program correspon 1
+le program de 2
+le program don 1
+le program du 1
+le program fortran 1
+le program fs 1
+le program glob 1
+le program init 1
+le program ne 1
+le program nutil 1
+le program ont 1
+le program ordonnanc 1
+le program par 1
+le program partit 1
+le program perm 1
+le program peuv 1
+le program po 1
+le program qu 1
+le program ser 1
+le program sont 1
+le program suiv 2
+le program transform 2
+le program util 1
+le programmeur 3
+le programmeur ch 1
+le programmeur de 1
+le programmeur ou 1
+le programmeur pour 1
+le programmeur sous 1
+le proj 2
+le proj ep 1
+le proj fortran 1
+le proj kcm 1
+le proj pandor 1
+le proj universitair 1
+le project 1
+le project de 1
+le project du 1
+le project ne 1
+le project sur 1
+le propr 4
+le propr etair 1
+le prot 1
+le prot in 1
+le protocol 2
+le protocol adapt 1
+le protocol court 1
+le protocol de 2
+le prouv 1
+le prouv le 1
+le provost 2
+le pseud 2
+le pseud but 1
+le pseud cod 1
+le pseud pr 1
+le pseud variabl 1
+le psn 1
+le psn denot 1
+le psw 1
+le psw denot 1
+le pu 1
+le pu actuel 1
+le pu de 1
+le pv 1
+le pv denot 1
+le q denot 1
+le qi 1
+le qualit 1
+le qualit es 1
+le quantificateur 1
+le quantificateur de 1
+le quat 1
+le quat de 1
+le quatern 1
+le quatr 1
+le quest 1
+le quest de 1
+le queu 1
+le queu de 1
+le quot 1
+le quot de 1
+le r denot 1
+le r ecup 1
+le r eduir 1
+le r ef 2
+le r egion 1
+le r egl 2
+le r eordonner 1
+le r eseau 3
+le r eseaux 2
+le r esolut 1
+le r esoudr 1
+le r esulat 1
+le r esultat 4
+le r esum 1
+le r eutil 1
+le r eutiliser 1
+le r evolut 1
+le r gl 1
+le r ol 3
+le r sultat 1
+le r0 3
+le r0 correspon 1
+le r1 4
+le r1 giv 1
+le r2 1
+le raffin 2
+le raffin de 1
+le raffin qu 1
+le raison 3
+le raison appliqu 1
+le raison de 1
+le raison equationnel 1
+le raison est 1
+le raison qu 1
+le rapport 2
+le rapport de 1
+le rapport du 1
+le rapport entr 1
+le rapport originel 1
+le rat 1
+le rat de 1
+le rec 1
+le rec classiqu 1
+le rec multipl 1
+le rec obtenu 1
+le rec par 1
+le rec var 1
+le recalcl 1
+le recalcl du 1
+le recour 1
+le recour au 1
+le recouvrer 1
+le recuit 1
+le recuit physiqu 1
+le recuit siml 1
+le register 1
+le register a0 1
+le register a1 1
+le register a2 1
+le register a3 1
+le register argum 1
+le register bp 1
+le register correspon 1
+le register cp 1
+le register cutb 1
+le register de 1
+le register e2 1
+le register gb 1
+le register lb 1
+le register lor 1
+le register mach 1
+le register marqu 1
+le register peuv 1
+le register quen 1
+le register sauvegard 1
+le register sont 1
+le register tb 1
+le register vm 1
+le register vn 1
+le register x5 1
+le regroup 1
+le regroup de 1
+le regrouper 1
+le regrouper de 1
+le rel 3
+le rel entr 2
+le remarqu 1
+le remarqu concern 1
+le remarqu suiv 1
+le remerc 1
+le remerc pour 1
+le rempl 1
+le remplac 1
+le remplac dinstruc 1
+le rendr 1
+le rendr automatiqu 1
+le renforc 1
+le rep 1
+le rep re 1
+le repr 3
+le repr es 2
+le repr sent 1
+le requ 1
+le requ es 1
+le rest 5
+le rest de 3
+le rest du 1
+le restaurer 1
+le restaurer au 1
+le restructur 1
+le restructur de 1
+le retard 1
+le retard de 1
+le retard du 1
+le retour 1
+le retour ar 1
+le retour de 1
+le retour est 1
+le retrouv 1
+le retrouv aus 1
+le rewrit 1
+le rewrit rl 1
+le ri 2
+le ri ae 1
+le risqu 3
+le risqu de 3
+le risqu dimport 1
+le risqu dun 1
+le risqu qu 1
+le rot 1
+le rou 1
+le rou de 1
+le rout 1
+le rout qu 1
+le rs 1
+le s epar 1
+le s equ 2
+le s equenc 2
+le s er 1
+le s0 1
+le s0i 1
+le s1 2
+le s1 fl 1
+le saut 1
+le saut indirect 1
+le scalair 2
+le scalair en 1
+le scalair partag 1
+le scalair sont 1
+le scanner 1
+le sch 4
+le sch em 4
+le scm 1
+le secon argum 1
+le secon ca 2
+le secon dan 1
+le secon enf 1
+le secon po 1
+le secon term 1
+le sect 2
+le sect ind 1
+le sect monoprocesseur 1
+le sect partag 1
+le sect pr 1
+le sect suiv 1
+le segm 2
+le segm de 1
+le segm en 1
+le segm finaux 1
+le sel 3
+le sel ca 2
+le sel chang 1
+le sel deux 1
+le sel op 1
+le sel trait 1
+le sel valeur 1
+le self 1
+le self output 1
+le sen 2
+le sen de 2
+le sen dun 1
+le sen inver 1
+le ser 1
+le ser automatiqu 1
+le seront 1
+le seront donc 1
+le si 4
+le si denot 1
+le si sont 1
+le sign 1
+le sign de 1
+le similarit 1
+le similarit es 1
+le similitud 1
+le similitud ou 1
+le siml 1
+le siml de 1
+le simplec 2
+le simplec est 1
+le simplec etant 1
+le simulateur 1
+le simulateur ser 1
+le simulateur va 1
+le sisd 1
+le sit 2
+le sit de 1
+le sit ind 1
+le situ 1
+le situ particl 1
+le sj 2
+le sk 2
+le sl 1
+le sm 1
+le smj 1
+le sniewsk 1
+le sniewsk theor 1
+le soient 1
+le soient pa 1
+le solut 2
+le solut altern 1
+le solut de 1
+le solut ent 1
+le solut optim 1
+le solut prop 1
+le solut qu 1
+le solut rationnel 1
+le solut sont 1
+le som 2
+le som de 2
+le som du 1
+le som dun 1
+le som respectif 1
+le sont 3
+le sont pa 1
+le sont parc 1
+le sourir 1
+le sourir de 1
+le sous 3
+le sous ensembl 3
+le sous espac 1
+le sous graph 1
+le sous modl 1
+le sous popl 1
+le sousespac 1
+le sp 1
+le spec 1
+le speed 1
+le squel 1
+le squel de 1
+le squel du 1
+le sr 1
+le sr denot 1
+le ss 4
+le ss fh 1
+le ss0 1
+le stack 1
+le stat 1
+le stat peut 1
+le stock 1
+le stock loc 1
+le str 1
+le str est 1
+le strat 2
+le strat eg 2
+le structur 2
+le structur commun 1
+le structur de 1
+le structur fonct 1
+le structur pr 1
+le structur sont 1
+le successiv 1
+le sug 1
+le suiv 4
+le suj 2
+le suj na 1
+le sup 1
+le sup compl 1
+le support 3
+le support ad 1
+le support de 2
+le support dexp 1
+le support du 1
+le supprim 1
+le surc 3
+le surc ut 3
+le surfac 1
+le surfac com 1
+le switch 1
+le symbol 1
+le syst 5
+le syst em 4
+le t ach 2
+le t es 1
+le t maxfm 1
+le t0 1
+le t1 2
+le ta 1
+le tabl 1
+le tableau 2
+le tableau a.2 1
+le tableau a.3 1
+le tableau a.4 1
+le tableau acc 1
+le tableau compr 1
+le tableau de 1
+le tableau est 1
+le tableau pour 1
+le tableau suiv 1
+le tableaux 2
+le tableaux ci 1
+le tableaux dan 1
+le tableaux sont 1
+le tableaux susceptibl 1
+le tableaux zu 1
+le tail 2
+le tail de 2
+le tan 1
+le taux 2
+le taux de 2
+le tc 1
+le tc microsecon 1
+le techniqu 4
+le techniqu actuel 1
+le techniqu classiqu 1
+le techniqu dacquisit 1
+le techniqu de 3
+le techniqu dextract 1
+le techniqu dind 1
+le techniqu doptim 1
+le techniqu ec 1
+le techniqu pr 2
+le techniqu qu 1
+le techniqu rec 1
+le techniqu util 1
+le temp 5
+le temp cuml 1
+le temp dacc 1
+le temp de 4
+le temp deffectuer 1
+le temp dic 3
+le temp dp 1
+le temp entr 1
+le temp moy 1
+le temp pa 1
+le temp perdu 1
+le temp tot 1
+le ten 1
+le ten actuel 1
+le teraflop 1
+le term 4
+le term akl 1
+le term comp 1
+le term cop 1
+le term de 2
+le term est 1
+le term etiqu 1
+le term evalu 1
+le term hor 1
+le term if8 1
+le term initiaux 1
+le term instanc 1
+le term interpr 1
+le term ne 1
+le term nj2 1
+le term non 1
+le term rationnel 1
+le term requ 1
+le term simpl 1
+le term sont 1
+le term ta 1
+le term term 1
+le term var 1
+le term vont 1
+le test 3
+le test arithm 1
+le test correspon 1
+le test de 2
+le test dic 1
+le test doccur 1
+le test don 1
+le test du 1
+le test est 1
+le test montr 1
+le test ne 1
+le test sont 1
+le test sur 1
+le text 1
+le text standard 1
+le th 2
+le th appl 1
+le th channel 1
+le th charg 1
+le th compon 1
+le th construc 1
+le th cur 1
+le th datab 1
+le th eor 2
+le th ff 1
+le th graph 2
+le th learner 1
+le th master 1
+le th matr 1
+le th maxim 1
+le th neighbor 1
+le th network 2
+le th nod 1
+le th not 1
+le th number 1
+le th pack 1
+le th parameter 1
+le th pictur 1
+le th prob 2
+le th random 1
+le th rank 1
+le th result 1
+le th st 1
+le th system 1
+le th task 1
+le th tim 1
+le th ver 1
+le them commun 1
+le ti 2
+le tir 1
+le tir de 1
+le titr 2
+le titr de 2
+le tj 2
+le tj sont 1
+le tl 1
+le tloc 1
+le tournur 1
+le tournur du 1
+le tp 2
+le tp sec 1
+le tr 4
+le tr ca 1
+le tr colon 1
+le tr condit 1
+le tr continu 1
+le tr dan 1
+le tr de 1
+le tr dun 1
+le tr em 1
+le tr instruc 1
+le tr man 1
+le tr nag 1
+le tr op 1
+le tr paragraph 1
+le tr pil 1
+le tr prem 2
+le tr processeur 1
+le tr treil 1
+le tr typ 1
+le trac 1
+le trac de 1
+le traf 1
+le traff 1
+le traff sur 1
+le trait 5
+le trait automatiqu 1
+le trait compr 1
+le trait de 4
+le trait du 2
+le trait dun 1
+le trait haut 1
+le trait rigoureux 1
+le trajectoir 1
+le trajectoir men 1
+le trajectoir nous 1
+le transfer 3
+le transfer ayant 1
+le transfer de 2
+le transfer inter 1
+le transfer par 1
+le transform 3
+le transform aoen 1
+le transform appart 1
+le transform consid 1
+le transform constitu 1
+le transform de 1
+le transform lin 1
+le transform non 1
+le transform op 1
+le transform rig 1
+le transit 2
+le transit interm 1
+le transit potentiel 1
+le transit qu 1
+le transit susceptibl 1
+le transl 1
+le travail 2
+le travail qu 1
+le travail ser 1
+le travaux 4
+le travaux actuel 1
+le travaux dappel 1
+le travaux de 3
+le travaux le 1
+le treil 1
+le treil aff 1
+le treil ent 1
+le treil sont 1
+le treil tj 1
+le treil tk 1
+le tutoriel 1
+le tutoriel da 1
+le typ 3
+le typ dacc 1
+le typ de 3
+le typ du 1
+le typ dun 1
+le typ ent 1
+le typ list 1
+le u denot 1
+le u.s.a 1
+le u0 2
+le uid 1
+le uiw 1
+le un 3
+le un de 2
+le un stabilit 1
+le unif 1
+le unif appel 1
+le unif ayant 1
+le unif etendu 1
+le unit 1
+le unit es 1
+le us ap 1
+le us assum 7
+le us ch 1
+le us com 1
+le us comput 1
+le us concentr 1
+le us consider 10
+le us def 7
+le us denot 2
+le us der 1
+le us disc 1
+le us form 1
+le us gener 1
+le us illustr 3
+le us introduc 1
+le us motiv 1
+le us not 2
+le us observ 1
+le us prov 2
+le us review 2
+le us say 1
+le us start 1
+le us tak 1
+le us us 1
+le ut 1
+le ut qu 1
+le ut sont 1
+le util 2
+le util de 1
+le utilisateur 1
+le utilisateur de 1
+le utiliser 1
+le utiliser pour 1
+le utilison 1
+le utilison dan 1
+le uw 1
+le v denot 1
+le v fv 1
+le v0 1
+le v1 2
+le v2e 1
+le v2i 1
+le va 1
+le va inaeuencer 1
+le valeur 3
+le valeur 2i 1
+le valeur absolu 1
+le valeur de 3
+le valeur du 1
+le valeur exp 1
+le valeur num 1
+le valeur ou 1
+le valeur possibl 1
+le valeur pr 1
+le valeur quil 1
+le valeur th 1
+le valider 1
+le valider sur 1
+le var 3
+le var connu 1
+le var de 1
+le var en 1
+le var pr 1
+le variabl 3
+le variabl afin 1
+le variabl allou 1
+le variabl appar 1
+le variabl cr 1
+le variabl de 1
+le variabl dind 1
+le variabl domain 1
+le variabl dun 1
+le variabl globalisabl 1
+le variabl i1 1
+le variabl ik 1
+le variabl libr 1
+le variabl perman 1
+le variabl qu 1
+le variabl sont 1
+le variabl standard 1
+le variabl successiv 1
+le variabl suiv 1
+le variabl xi 1
+le vb 1
+le vc 1
+le vc repr 1
+le vecteur 4
+le vecteur ak 1
+le vecteur caract 1
+le vecteur co 1
+le vecteur d1 1
+le vecteur d2 1
+le vecteur da 1
+le vecteur de 4
+le vecteur di 1
+le vecteur dist 1
+le vecteur dit 1
+le vecteur ik1 1
+le vecteur loc 1
+le vecteur luim 1
+le vecteur norm 1
+le vecteur propr 1
+le vecteur s1 1
+le vecteur sont 1
+le vecteur souhait 1
+le vecteur td 1
+le ver 3
+le ver altern 1
+le ver futur 1
+le ver hybr 1
+le ver optim 1
+le ver orig 1
+le ver par 1
+le ver pp 1
+le verron 3
+le verron au 1
+le verron ci 1
+le vi 2
+le vit 1
+le vit de 1
+le vj 1
+le vj splitter 1
+le voir 1
+le voir sur 1
+le voisin 2
+le voisin de 1
+le voisin dun 1
+le vol 1
+le vol de 1
+le volut 1
+le volut de 1
+le w1 2
+le w2 1
+le web 1
+le wi 1
+le wmac 1
+le wmin 1
+le world 1
+le world wid 1
+le wv 1
+le x denot 1
+le x ffx11 1
+le x prem 1
+le x x1x2 1
+le x0 1
+le x0 x1 1
+le x1 3
+le x2 1
+le xi 3
+le xi denot 1
+le xi par 1
+le xilj 1
+le xilj sont 1
+le xj 2
+le y edg 1
+le y nod 1
+le y0 1
+le yi 1
+le z modl 1
+le za 1
+le zon 1
+le zon de 1
+le.loc 1
+lead 70
+lead prev 1
+lead prev cod 1
+lead th log 1
+lead th system 1
+lead to absurd 1
+lead to awk 1
+lead to bad 1
+lead to bottom 1
+lead to build 1
+lead to cheaper 1
+lead to commun 1
+lead to compl 2
+lead to configur 1
+lead to confus 2
+lead to consider 1
+lead to cont 1
+lead to correct 1
+lead to deadlock 2
+lead to degrad 1
+lead to design 1
+lead to difficult 1
+lead to dimin 1
+lead to disorder 1
+lead to ea 1
+lead to effect 1
+lead to faster 1
+lead to fm 1
+lead to good 1
+lead to greater 3
+lead to hazard 1
+lead to high 3
+lead to htot 1
+lead to identif 1
+lead to im 1
+lead to improv 1
+lead to incorrect 2
+lead to incr 1
+lead to increm 1
+lead to larger 1
+lead to lesser 3
+lead to low 3
+lead to memor 1
+lead to minim 1
+lead to mismatch 1
+lead to multicast 1
+lead to non 1
+lead to nw 1
+lead to observ 1
+lead to optim 2
+lead to over 1
+lead to payoff 1
+lead to pot 1
+lead to problem 1
+lead to proc 1
+lead to result 1
+lead to seeing 1
+lead to serv 1
+lead to shorter 2
+lead to simil 1
+lead to slight 1
+lead to slower 1
+lead to smaller 1
+lead to split 1
+lead to starv 1
+lead to stat 1
+lead to strang 1
+lead to subtl 1
+lead to suit 1
+lead to tcp 1
+lead to tupl 1
+lead to typ 1
+lead to underflow 1
+lead to unequ 1
+lead to unmaintain 1
+lead to vk 1
+lead to wast 2
+lead to xq 1
+lead to yp 1
+leader 4
+leader an 1
+leader broadcast 1
+leader continu 1
+leader elect 2
+leader elect algorithm 1
+leader elect protocol 1
+leader from db 1
+leader ge 1
+leader is act 1
+leader is head 1
+leader is respon 1
+leader may lo 1
+leader not 1
+leader of act 1
+leader proc 1
+leader proc forc 1
+leader proc tak 1
+leader reassign 1
+leaf 13
+leaf as shown 1
+leaf by inser 1
+leaf is creat 1
+leaf is label 1
+leaf level 3
+leaf level nod 1
+leaf list 1
+leaf nod 8
+leaf nod colour 1
+leaf nod contain 1
+leaf nod distribut 1
+leaf nod found 1
+leaf nod ge 1
+leaf nod mov 1
+leaf nod sen 2
+leaf nod wait 1
+leaf of t0 1
+leaf of t2 1
+leaf of t3 1
+leaf of ti 1
+leaf pag 1
+leaf path 1
+leaf port 1
+leaf proc 1
+leaf proc hold 1
+leaf proc inser 1
+leaf shel 1
+leaf shel antimatr 1
+leaf shel sequ 1
+leaf sol 1
+leaf span 1
+leaf span tr 1
+leak 5
+leak buck 1
+leak buck shap 1
+leak buck shaper 1
+leak inform 1
+leak problem 1
+leak problem assoc 1
+lean 1
+leap 2
+learn 28
+learn a cl 3
+learn a concept 1
+learn a greater 1
+learn a hierarch 1
+learn a pattern 1
+learn a self 1
+learn a singl 1
+learn a ssm 1
+learn about middl 1
+learn about on 1
+learn about p1s 1
+learn aid 1
+learn algoirthm 1
+learn algorithm 10
+learn algorithm assoc 1
+learn algorithm attempt 1
+learn algorithm built 1
+learn algorithm etc 1
+learn algorithm gener 1
+learn an assm 1
+learn an input 1
+learn an unknown 1
+learn and collabor 2
+learn and cut 1
+learn and dynam 1
+learn and encour 1
+learn and execut 1
+learn and extract 1
+learn and gener 1
+learn and memor 1
+learn and network 1
+learn and optim 1
+learn and train 1
+learn anyth approach 1
+learn approach 2
+learn ar ba 1
+learn ar tackl 1
+learn architectur 1
+learn assum 1
+learn ba 2
+learn backtrack 1
+learn behavior 2
+learn behavior objectiv 1
+learn belief 1
+learn belief network 1
+learn boolean 1
+learn boolean forml 1
+learn by analog 1
+learn by childr 1
+learn by chunk 1
+learn by gener 1
+learn by knowledg 1
+learn by osm 1
+learn cap 1
+learn ch 1
+learn cl 1
+learn cl dict 1
+learn commun 2
+learn commun highlight 1
+learn complec 4
+learn complec concept 1
+learn complec rl 1
+learn condit 1
+learn const 1
+learn control 1
+learn control inform 1
+learn control strateg 1
+learn curv 1
+learn cycl 1
+learn cycl requir 1
+learn datab 1
+learn datab reposit 1
+learn each pattern 1
+learn eff 1
+learn effect 1
+learn environm 1
+learn epoch 1
+learn ev tim 1
+learn everyth perfect 1
+learn exact 1
+learn exper 2
+learn finit 1
+learn finit st 1
+learn from del 1
+learn from experim 1
+learn from invar 1
+learn from spar 1
+learn from specif 1
+learn garb 1
+learn garb pattern 1
+learn ha tak 1
+learn harmon 1
+learn harmon rl 1
+learn hid 1
+learn hid variabl 1
+learn hierarch 1
+learn hist 1
+learn in computer 1
+learn in determin 1
+learn in domain 1
+learn in markov 1
+learn in me 1
+learn in reinforc 1
+learn in rel 1
+learn increm 1
+learn interconnec. 1
+learn interconnect 1
+learn interconnect network 1
+learn intern 1
+learn intern repr 1
+learn is assoc 1
+learn is ba 1
+learn is compl 1
+learn is ident 1
+learn is induc 1
+learn is moder 1
+learn it learn 1
+learn iter 1
+learn knowledg 1
+learn knowledg progr 1
+learn larg debruijn 1
+learn long term 1
+learn mater 1
+learn method 4
+learn mod 1
+learn model 1
+learn modl 1
+learn multipl 2
+learn multipl inherit 1
+learn mus 1
+learn mus concept 1
+learn new pattern 1
+learn object 1
+learn object orient 1
+learn of cl 1
+learn of digit 1
+learn of explan 1
+learn of in 1
+learn of interconnect 1
+learn of item 1
+learn of object 1
+learn of self 1
+learn or cluster 1
+learn outcom 1
+learn overlap 1
+learn overlap cluster 1
+learn paradigm 1
+learn paradigm design 1
+learn pattern 1
+learn perform 1
+learn ph 1
+learn problem 1
+learn proc 2
+learn procedur 1
+learn proceed 1
+learn proper 1
+learn prospect 1
+learn random 1
+learn random pattern 1
+learn rat 3
+learn rat algorithm 1
+learn rat decr 1
+learn rat reach 1
+learn requir 1
+learn review 1
+learn rl 1
+learn sc 1
+learn scenar 1
+learn sect 1
+learn sever separ 1
+learn signif 1
+learn situ 1
+learn som rel 1
+learn someth us 1
+learn srin 1
+learn ssm 1
+learn stag 2
+learn strateg 3
+learn succ 1
+learn succ predict 1
+learn such assoc 1
+learn synchron 1
+learn synchron sequ 1
+learn syntac 1
+learn system 5
+learn system archictectur 1
+learn system point 1
+learn tak 1
+learn task 2
+learn techniqu 1
+learn techniqu an 1
+learn th assoc 1
+learn th compl 1
+learn th concept 1
+learn th cur 1
+learn th entir 1
+learn th environm 1
+learn th gener 1
+learn th ident 1
+learn th interconnect 1
+learn th par 1
+learn th pattern 1
+learn th structur 1
+learn th train 1
+learn that hold 1
+learn that link 1
+learn that p2 1
+learn that produc 1
+learn that result 1
+learn them fl 1
+learn theor 2
+learn ther result 1
+learn through modl 1
+learn tim 3
+learn tim character 1
+learn to assoc 1
+learn to av 1
+learn to cr 1
+learn to distingu 1
+learn to dubug 1
+learn to form 1
+learn to handl 1
+learn to harmon 1
+learn to improv 1
+learn to interpr 1
+learn to know 1
+learn to mak 1
+learn to map 1
+learn to pa 1
+learn to recover 1
+learn to remember 1
+learn to reproduc 1
+learn to solut 1
+learn toler 1
+learn tr 1
+learn unit 1
+learn using 1
+learn using me 1
+learn var 1
+learn ver quick 1
+learn wa se 1
+learn with incompl 1
+learn with www 1
+learn1 1
+learner 4
+learner abil 1
+learner answer 1
+learner assessm 1
+learner can interact 1
+learner cr 1
+learner disk 1
+learner disk spac 1
+learner enter 1
+learner foc 1
+learner ha giv 1
+learner id 1
+learner input 1
+learner interact 1
+learner interv 1
+learner knowledg 1
+learner mach 1
+learner misconcept 1
+learner most recent 1
+learner must know 1
+learner pot 1
+learner profil 1
+learner system 1
+learner to gu 1
+learner to navig 1
+learner to remain 1
+learner us 1
+learner viewer 1
+learner wil se 1
+learnt 1
+leasur 2
+leav 38
+leav a slit 1
+leav a suff 1
+leav accept 1
+leav accept mod 1
+leav achief 1
+leav an unw 1
+leav and work 1
+leav ap 1
+leav ar distribut 1
+leav ar prim 1
+leav asid 1
+leav asid in 1
+leav both ss 1
+leav can particip 1
+leav contain 2
+leav few doubt 1
+leav for fic 1
+leav funct 1
+leav funct symbol 1
+leav hav foc 1
+leav hol 1
+leav hol wh 1
+leav in cub 1
+leav in t0 1
+leav is np 1
+leav nod 1
+leav of ti 1
+leav of tp 1
+leav of tv2 1
+leav onl cn 1
+leav our specif 1
+leav out integer 1
+leav pr 1
+leav pr nod 1
+leav repr 1
+leav repr signif 1
+leav room 1
+leav smoother 1
+leav smoother dec 1
+leav span 1
+leav span tr 1
+leav structur 1
+leav th an 1
+leav th dec 1
+leav th del 1
+leav th detail 1
+leav th graph 1
+leav th group 1
+leav th nod 1
+leav th privileg 1
+leav th prp 1
+leav th remain 1
+leav th rp 1
+leav th server 1
+leav th strateg 1
+leav th subsect 1
+leav th system 2
+leav th valu 1
+leav th wonder 1
+leaver 1
+leb 1
+leban 1
+lebanon 1
+lebesgu 1
+lebesgu measur 1
+lebesgu measur zer 1
+leblanc 2
+leblanc and john 1
+leblanc and mellor 1
+lec 10
+lec a lec 1
+lec an 2
+lec analyser 2
+lec analyser gener 1
+lec analyzer 1
+lec analyzer schedl2 1
+lec analyzer totinf 1
+lec and dynam 1
+lec and yacc 1
+lec approach 1
+lec bind 1
+lec bind creat 1
+lec bind defin 1
+lec bind ext 1
+lec bind init 1
+lec bind nam 1
+lec categor 1
+lec de 1
+lec de attribut 1
+lec de deux 1
+lec de liaison 1
+lec de nombreux 1
+lec differ label 1
+lec dun 3
+lec dun el 1
+lec dun espac 1
+lec dun nouveau 1
+lec dun pil 1
+lec dun point 1
+lec dun register 1
+lec dun solut 1
+lec dunif 1
+lec dunif etendu 1
+lec ecut 3
+lec ecut avec 1
+lec ecut continu 1
+lec ecut dact 1
+lec ecut de 3
+lec ecut du 2
+lec ecut dun 3
+lec ecut en 2
+lec ecut est 2
+lec ecut le 2
+lec ecut ma 1
+lec ecut ne 1
+lec ecut nen 1
+lec ecut nengendr 1
+lec ecut non 1
+lec ecut norm 1
+lec ecut par 1
+lec ecut peut 1
+lec ecut pour 1
+lec ecut quel 1
+lec ecut quit 1
+lec ecut sappr 1
+lec ecut se 1
+lec ecut sont 1
+lec ecut sur 2
+lec ecut va 1
+lec ecut ver 1
+lec encl 1
+lec encl lec 1
+lec environm 1
+lec environm compr 1
+lec environm ext 1
+lec frequ 1
+lec group 1
+lec ident 1
+lec ind 1
+lec infer 1
+lec infer proc 1
+lec item 1
+lec nonid 1
+lec scop 1
+lec specif 1
+lec tak 1
+lec tool 1
+lec util 1
+lec var 1
+lec yacc 1
+lechantillon 1
+lechantillon pr 1
+lechantillon pr ef 1
+lecol 1
+lecol doct 1
+lecol doct dastrophysiqu 1
+lecol polytechniqu 1
+lecrc 1
+lect 2
+lect tr 1
+lecteur 2
+lecteur a un 1
+lecteur de 1
+lecteur de linstruc 1
+lecteur de r1 1
+lecteur dun 1
+lecteur dun pag 1
+lecteur ecrivain 1
+lecteur ecrivain de 1
+lecteur entr 1
+lecteur entr le 1
+lecteur est 1
+lecteur est au 1
+lecteur et ecrivain 1
+lecteur gestionnair 1
+lecteur lecteur 1
+lecteur lecteur pour 1
+lecteur n etant 1
+lecteur ou 1
+lecteur ou lecteur 1
+lecteur pour 1
+lecteur pour le 1
+lecteur se 1
+lecteur se convaincr 1
+lecteur sont 1
+lecteur sont distinct 1
+lecteur trouver 1
+lecteur trouver de 1
+lectivit 1
+lectroniqu 1
+lectur 24
+lectur a un 1
+lectur anticip 1
+lectur anticip ee 1
+lectur au 2
+lectur au point 1
+lectur au tableau 1
+lectur augm 1
+lectur aux 1
+lectur aux tableaux 1
+lectur avec 1
+lectur avec migr 1
+lectur d ecl 1
+lectur dan 1
+lectur dan le 1
+lectur de 2
+lectur de ce 2
+lectur de lestampil 1
+lectur de r2 1
+lectur de r3 1
+lectur de variabl 1
+lectur diffus 1
+lectur dun 1
+lectur dun champ 1
+lectur dun register 1
+lectur ecritur 1
+lectur ecritur alor 1
+lectur ecritur sur 1
+lectur en 1
+lectur est 1
+lectur est cel 1
+lectur est peu 1
+lectur et aux 1
+lectur et de 1
+lectur et dun 1
+lectur et ecritur 1
+lectur et en 1
+lectur et ne 1
+lectur et un 1
+lectur etait 1
+lectur etait assur 1
+lectur etc 1
+lectur isol 1
+lectur isol ee 1
+lectur la 1
+lectur la requ 1
+lectur le 1
+lectur le propr 1
+lectur lor 1
+lectur lor du 1
+lectur lor dun 1
+lectur m emoir 1
+lectur montr 1
+lectur montr linflu 1
+lectur n etant 1
+lectur ninflu 1
+lectur ninflu qu 1
+lectur not 20
+lectur on boolean 1
+lectur on wavel 2
+lectur ou 2
+lectur ou en 2
+lectur paresseus 1
+lectur paresseus du 1
+lectur per week 1
+lectur perm 1
+lectur perm lexploit 1
+lectur peuv 1
+lectur peuv encor 1
+lectur pipelin 1
+lectur pipelin es 1
+lectur pour 1
+lectur pour chaqu 1
+lectur pr 1
+lectur proc edur 1
+lectur qu 1
+lectur qu le 1
+lectur retard 1
+lectur retard ee 1
+lectur retard es 1
+lectur se 1
+lectur se font 1
+lectur suppl 1
+lectur suppl ementair 1
+lectur var 1
+lectur var entr 1
+lecun 1
+led 16
+led cr 1
+led cr liver.bup 1
+led our effort 1
+led teach 1
+led teach scenar 1
+led to consider 1
+led to good 1
+led to system 1
+ledbetter 1
+lederberg 1
+lederman 1
+leed 6
+leed annu 1
+leed annu stat 1
+leed ls2 1
+leed ls2 9jt 1
+leen 1
+leeser 1
+leeuw 7
+leeuw edit 1
+leeuw heiser 1
+leeuw heiser pi 1
+leff 4
+leff de 3
+leff de ce 1
+leff de la 1
+leff ping 1
+leff ping pong 1
+leffectif 1
+leffectif de 1
+leffectif de la 1
+leffectif de se 1
+leffectif tot 1
+leffectif tot de 1
+lefficacit 3
+lefficacit e de 2
+lefficacit e du 2
+lefficacit e dun 1
+lefficacit e est 1
+lefficacit e rel 1
+leffort 1
+leffort a fournir 1
+left 1
+left tr 1
+left tr var 1
+leftmost 7
+leftmost and rightmost 1
+leftmost child 1
+leftmost innerm 1
+leftmost innerm red 1
+leftmost innermost 1
+leftmost innermost narrow 1
+leftmost innermost red 1
+leftmost innermost strateg 1
+leftmost innermost subexpr 1
+leftmost leader 1
+leftmost leader broadcast 1
+leftmost mi 1
+leftmost on comput 1
+leftmost on problem 1
+leftmost outermost 1
+leftmost outermost reduc 1
+leftmost point 1
+leftmost proc 1
+leftmost select 1
+leftmost select rl 1
+leftmost subexpr 1
+leftover 1
+leftover port 1
+leg 15
+leg and deadlock 1
+leg and sign 1
+leg argum 3
+leg argum typ 1
+leg arithm 1
+leg arithm oper 1
+leg bool 1
+leg bool ean 1
+leg configur 1
+leg hilog 1
+leg hilog term 1
+leg ind 1
+leg initarg 1
+leg initarg list 1
+leg locomot 1
+leg object 1
+leg object object 1
+leg obtain 1
+leg obtain cop 1
+leg of program 1
+leg parameter 1
+leg parameter valu 1
+leg posit 1
+leg sequ 1
+leg subsystem 1
+leg subsystem implem 1
+leg unimodl 1
+leg unimodl unimodl 1
+leg with respect 1
+legendspecl 1
+legitim 1
+legitim assign 1
+legitim in hilog 1
+legypt 1
+legypt et lind 1
+lehman 2
+lehman and ya 1
+lehman p.l 1
+lehner 1
+lehrstuhl 2
+lehrstuhl informatik 1
+lehrstuhl informatik ii 1
+lehrstuhl prof 1
+leibniz 1
+leibniz principl 1
+leid 2
+leifker 1
+leight 2
+leight columnsort 1
+leight columnsort algorithm 1
+leipzig 1
+leiserson 5
+leiserson et al 1
+lejter 1
+lejter et al 1
+leland 2
+leler 1
+lelisp 2
+lelisp modl 1
+lelisp modl system 1
+lem 33
+lem allow 1
+lem and conclus 1
+lem and lem 1
+lem and theorem 1
+lem answer 1
+lem appl 1
+lem asser 1
+lem ba 1
+lem ba say 1
+lem below show 1
+lem by contradict 1
+lem by exhibit 1
+lem by induc 1
+lem by show 1
+lem captur 1
+lem character 1
+lem en 1
+lem en div 1
+lem ensur 1
+lem establ 1
+lem expr 1
+lem follow 1
+lem for typ 1
+lem giv 2
+lem hold 2
+lem hold triv 1
+lem impl 1
+lem in t1 1
+lem in theor 1
+lem introduc 1
+lem is clear 1
+lem is fal 1
+lem is giv 1
+lem is im 1
+lem is prov 2
+lem is straightfor 1
+lem is thus 1
+lem is triv 1
+lem lead 1
+lem par 1
+lem pr 1
+lem prov 2
+lem rel 1
+lem relev 1
+lem say 1
+lem saying 1
+lem show 3
+lem simil 1
+lem st 1
+lem sup 1
+lem that enabl 1
+lem that forml 1
+lem that lead 1
+lem to classif 1
+lem to der 1
+lem to describ 1
+lem to disc 1
+lem to elim 1
+lem to ge 1
+lem to obtain 1
+lem to show 1
+lem triv 1
+lem triv hold 1
+lem wa prov 1
+lem we ge 1
+lement 1
+lement un 1
+lemmer 2
+lemon 1
+lemon de 1
+lempel 1
+lempil 1
+lempil de 1
+lempil de but 1
+lempil de ce 1
+lempil de nombreux 1
+lempil denviron 1
+lempil denviron un 1
+lempil du 1
+lempil du point 1
+lempil dun 1
+lempil dun nouveau 1
+lempil dun nouvel 1
+lempil dun point 1
+lempl 3
+lempl de 2
+lempl de matr 1
+lempl de techniqu 1
+lempl de tenseur 1
+lempl dun 2
+lempl dun ag 1
+lempl dun tel 1
+lemplac 2
+lemplac de 1
+lemplac de lop 1
+lemplac dun 1
+lemplac dun don 1
+lemployer 1
+lemployer com 1
+lemployer com transform 1
+len 10
+len an explan 1
+len browser 1
+len distort 1
+len imag 1
+len imag using 1
+len nc 1
+len th chem 1
+len wer mad 1
+lenat 1
+lencadr 1
+lencadr suiv 1
+lendroit 1
+lengel 1
+length 68
+length 2l 1
+length 2n 2
+length 3n 1
+length 4n2d 1
+length 4pa 2
+length 5r 1
+length 7n 1
+length a synch 1
+length algorithm 1
+length algorithm start 1
+length and aver 1
+length and bon 1
+length and cardin 1
+length and form 1
+length and incr 1
+length and number 1
+length and posit 1
+length and width 1
+length ar determin 1
+length ar equ 1
+length by bound 1
+length cardin 1
+length cardin emp 1
+length cardin tupl 1
+length claus 1
+length condit 1
+length criter 1
+length cycl 1
+length cycl ba 1
+length cylinder 1
+length definit 1
+length deriv 1
+length encod 1
+length for heur 1
+length for random 1
+length fundam 1
+length fundam cycl 1
+length gener 1
+length gener key 1
+length greater 1
+length heur 1
+length i1 1
+length in bit 1
+length incr 2
+length incr produc 1
+length int 1
+length interv 1
+length is mac 1
+length is minim 1
+length is short 1
+length it tag 1
+length jf 1
+length jfdj 1
+length jvivj 1
+length jvivj jg 1
+length lim 1
+length lim requir 1
+length longer 1
+length me 2
+length mn 1
+length n 2a10b26c 1
+length o pnlogn 1
+length obtain 1
+length of crit 1
+length of gener 1
+length of gol 1
+length of group 1
+length of hist 1
+length of input 1
+length of lm 1
+length of program 1
+length of test 1
+length of tetrahedr 1
+length of tim 1
+length of wavel 1
+length on nw 1
+length or angl 1
+length or lat 1
+length param 1
+length param brdcast 1
+length po 1
+length prev 1
+length prev tran 1
+length principl 1
+length produc 1
+length prolog 1
+length prolog program 1
+length reducead32 1
+length smooth 1
+length span 1
+length span tr 1
+length specif 1
+length test 1
+length test tim 1
+length than heur 1
+length tinit 1
+length to chang 2
+length tr 1
+length tr height 1
+length wa fic 1
+length wer mad 1
+length which explain 1
+length why 1
+length why lin 1
+length wil incr 1
+lenjeu 1
+lenjeu est 1
+lenjeu est de 1
+lenosk 5
+lenosk et al 3
+lenregister 1
+lenregister correspon 1
+lenregister correspon de 1
+lenregister correspon elimin 1
+lenregister correspon peut 1
+lenregister cour 1
+lenregister cour pour 1
+lenregister dactiv 1
+lenregister dactiv correspon 1
+lenregister dactiv de 1
+lenregister dactiv dun 1
+lenregister dactiv nest 1
+lenregister de 1
+lenregister de la 1
+lenregister dun 1
+lenregister dun liaison 1
+lenregister empil 1
+lenregister inclut 1
+lenregister inclut un 1
+lenregister sur 1
+lenregister sur la 1
+lensembl 5
+lensembl a etud 1
+lensembl d ecrit 1
+lensembl d enombr 1
+lensembl de 4
+lensembl de algorithm 1
+lensembl de arc 1
+lensembl de bloc 1
+lensembl de ch 1
+lensembl de claus 1
+lensembl de combinaison 1
+lensembl de comp 1
+lensembl de coupl 1
+lensembl de diff 2
+lensembl de don 1
+lensembl de el 1
+lensembl de ext 1
+lensembl de individus 1
+lensembl de marqu 1
+lensembl de nat 1
+lensembl de nid 1
+lensembl de obj 1
+lensembl de pag 1
+lensembl de pil 1
+lensembl de plac 1
+lensembl de point 1
+lensembl de probl 1
+lensembl de som 1
+lensembl de structur 1
+lensembl de tous 1
+lensembl de transit 1
+lensembl de valeur 1
+lensembl dhyperoctr 1
+lensembl dhyperoctr de 1
+lensembl du 1
+lensembl du contr 1
+lensembl du processus 1
+lensembl fc 1
+lensembl s de 1
+lensembl solut 1
+lensembl solut en 1
+lenstr 1
+lent 2
+lent a la 1
+lent afin 1
+lent afin de 1
+lenth 1
+lenth of test 1
+lentr 3
+lentr ee 3
+lentr ee de 2
+lentr ee du 1
+lentr ee etd 1
+lentrelacer 1
+lentrelacer avec 1
+lentrelacer avec la 1
+lenv 1
+lenv de 1
+lenv de cop 1
+lenv de inv 1
+lenv dun 1
+lenv dun me 1
+lenvelop 1
+lenvelop convec 1
+lenvelop convec de 1
+lenviron 3
+lenviron a chaqu 1
+lenviron a pour 1
+lenviron ain 1
+lenviron ain qu 1
+lenviron aus 1
+lenviron aus peut 1
+lenviron avant 1
+lenviron avant le 1
+lenviron compl 1
+lenviron compl est 1
+lenviron consid 1
+lenviron consid er 1
+lenviron correspon 1
+lenviron correspon au 1
+lenviron cour 1
+lenviron cour nest 1
+lenviron cour perm 1
+lenviron cour peut 1
+lenviron cour qu 1
+lenviron d etr 1
+lenviron dan 1
+lenviron dan la 1
+lenviron dan le 1
+lenviron de 2
+lenviron de la 1
+lenviron de man 1
+lenviron de program 1
+lenviron de tel 1
+lenviron de typ 1
+lenviron dev 1
+lenviron dev part 1
+lenviron en 1
+lenviron en plac 1
+lenviron env2 1
+lenviron est 1
+lenviron est dan 1
+lenviron est diff 1
+lenviron est don 1
+lenviron est en 1
+lenviron et du 1
+lenviron et en 1
+lenviron et le 1
+lenviron et qu 1
+lenviron et un 1
+lenviron facil 1
+lenviron facil le 1
+lenviron fortran 1
+lenviron init 1
+lenviron init ma 1
+lenviron le 1
+lenviron lor 1
+lenviron lor de 1
+lenviron ne 1
+lenviron ne peut 1
+lenviron nest 1
+lenviron nest pa 1
+lenviron ou 1
+lenviron ou dun 1
+lenviron peut 1
+lenviron peut etr 1
+lenviron peuv 1
+lenviron peuv direct 1
+lenviron plut 1
+lenviron plut ot 1
+lenviron pr 1
+lenviron pr ec 1
+lenviron pr esent 1
+lenviron pu 1
+lenviron pu etr 1
+lenviron qu 1
+lenviron qu le 1
+lenviron quapr 1
+lenviron quapr es 1
+lenviron sel 1
+lenviron soit 1
+lenviron soit cr 1
+lenviron sont 1
+lenviron sont larg 1
+lenviron supprim 1
+lenviron supprim la 1
+lenviron2 1
+lenviron7 1
+leoecacit 1
+leomarkg 1
+leomarkg cc.gatech.edu 1
+leomarkg cc.gatech.edu csj 1
+leon 1
+leon stok 1
+leonard 1
+leonard and goodman 1
+leong 1
+leontarit 1
+leontarit and s.a 1
+lep 1
+lept 1
+lept ensam 1
+leq 1
+leq intn 1
+leq realn 1
+lequel 4
+lequel a la 1
+lequel agit 1
+lequel appar 1
+lequel el 2
+lequel el appar 1
+lequel el doiv 1
+lequel el se 1
+lequel il 2
+lequel il ec 1
+lequel il est 1
+lequel la 1
+lequel la construc 1
+lequel la coupur 1
+lequel le 3
+lequel le domain 1
+lequel le optim 1
+lequel le register 1
+lequel le temp 1
+lequel lespac 1
+lequel linform 1
+lequel linform de 1
+lequel on veut 1
+lequel prolog 1
+lequel prolog mal 1
+lequel se 1
+lequel se foc 1
+lequel sont 1
+lequel sont ecrit 1
+lequel tout 1
+lequel tout le 1
+lequel un 1
+lequel un solut 1
+ler 3
+lerman 1
+lerman sous 1
+lerman sous le 1
+lerner 1
+lerreur 1
+lerreur dan 1
+lerreur dan ce 1
+lerreur dan le 1
+lerreur et tr 1
+lerreur sur 1
+lerreur sur le 1
+lescan 1
+lescot 1
+lesk 3
+lesk et al 1
+lesk et choth 1
+lesk schmidt 1
+lesl 4
+lesl kaelbl 1
+lesl lamport 3
+lesp 3
+lesp eranc 2
+lesp eranc math 2
+lesp ranc 1
+lesp ranc de 1
+lespac 5
+lespac adr 1
+lespac adr par 1
+lespac allou 1
+lespac commun 1
+lespac commun la 1
+lespac d etat 1
+lespac dadr 1
+lespac dadr commun 1
+lespac de 4
+lespac de ch 1
+lespac de etat 1
+lespac de matr 1
+lespac de recherch 2
+lespac de repr 1
+lespac de rot 1
+lespac de sch 1
+lespac de structur 1
+lespac de trajectoir 1
+lespac dispon 1
+lespac dispon en 1
+lespac dit 1
+lespac dit erat 1
+lespac imag 1
+lespac nous 1
+lespac nous par 1
+lespac occup 1
+lespac qu 1
+lespac qu pu 1
+lespac r eel 1
+lespac vectoriel 1
+lespac vectoriel unidimensionnel 1
+lesprit 2
+lesprit de 2
+lesprit de ag 1
+lesprit de la 1
+lesprit du 1
+lesprit du cod 1
+lesprit dun 1
+lesprit dun enregister 1
+lesprit qu 1
+lesprit qu la 1
+lesprit qu le 1
+lesquel 3
+lesquel ce 1
+lesquel ce contraint 1
+lesquel il 1
+lesquel il ny 1
+lesquel la 2
+lesquel la claus 1
+lesquel la contraint 1
+lesquel la var 1
+lesquel le 1
+lesquel le bloc 1
+lesquel le born 1
+lesquel le par 1
+lesquel le vecteur 1
+lesquel lext 1
+lesquel lext du 1
+lesquel lutil 1
+lesquel lutil de 1
+lesquel nous 2
+lesquel nous construison 1
+lesquel nous som 1
+lesquel on peut 1
+lesquel on veut 1
+lesquel ont 1
+lesquel ont eu 1
+lesquel outr 1
+lesquel outr koan 1
+lessentiel 1
+lessentiel de 1
+lessentiel de calcl 1
+lessentiel du 1
+lessentiel du calcl 1
+lesser 10
+lesser degr 1
+lesser extent 3
+lesser inter 1
+lesser inter cluster 1
+lesser load 2
+lesser number 3
+lesser nw 1
+lesser nw 8w 1
+lesser or equ 1
+lesser reassignm 1
+lesser ten 1
+lesson 4
+lesson is heed 1
+lesson learn 2
+lesson learnt 1
+lestampil 1
+lestampil cour 1
+lestampil cour est 1
+lestampil cour nest 1
+lestampil cour peut 1
+lestampil cour tb 1
+lestampil de 1
+lestampil de la 1
+lestampil de liaison 1
+lestampil demeur 1
+lestampil na 1
+lestampil peut 1
+lestampil peut etr 1
+lestampil pren 1
+lestampil pren la 1
+lestampil temporel 1
+lestim 3
+lestim de 2
+lestim de lincertitud 1
+lestim de perform 1
+lestim de se 1
+lestim dincertitud 1
+lestim dincertitud sur 1
+lestim du 2
+lestim du co 1
+lestim du mod 1
+lestim dun 1
+lestim dun mesur 1
+lestimateur 1
+lestimateur de 1
+lestimateur de sannl 1
+lestimateur y de 1
+letter 21
+letter abbrev 1
+letter classif 1
+letter classif problem 1
+letter detect 1
+letter for const 1
+letter for funct 1
+letter for object 1
+letter for variabl 1
+letter nam 1
+letter oe 1
+letter spec 1
+letter whil int 1
+lettr 1
+lettr bloqu 1
+lettr bloqu lop 1
+leu 1
+leung 2
+leung and l.j 1
+leung and whit 1
+leur 7
+leur anc 1
+leur anc valeur 1
+leur apparit 1
+leur approch 1
+leur approch par 1
+leur cat 1
+leur cat egor 1
+leur caus 1
+leur commentair 1
+leur commentair qu 1
+leur comport 1
+leur conf 1
+leur conf ma 1
+leur conseil 1
+leur conseil sur 1
+leur contenu 1
+leur cr 1
+leur cr eat 1
+leur d efaut 1
+leur d riv 1
+leur degr 1
+leur degr es 1
+leur dern 1
+leur direct 1
+leur direct en 1
+leur docum 1
+leur docum www 1
+leur doit 1
+leur doit enorm 1
+leur dur 1
+leur dur ee 1
+leur ecritur 1
+leur ecritur cycliqu 1
+leur eff 2
+leur eff est 1
+leur efficacit 1
+leur elag 1
+leur elag dan 1
+leur empl 1
+leur empl nobeit 1
+leur environ 1
+leur environ de 1
+leur etud 2
+leur etud de 1
+leur etud eclaircit 1
+leur etud qu 1
+leur evalu 1
+leur evalu pour 1
+leur eviter 1
+leur eviter de 1
+leur exploit 1
+leur exploit est 1
+leur expr 1
+leur expr particl 1
+leur fit 1
+leur form 1
+leur form de 1
+leur form la 1
+leur fr 1
+leur fr equ 1
+leur fruit 1
+leur fruit quant 1
+leur gest 1
+leur imag 1
+leur imag sont 1
+leur impact 1
+leur impact sur 1
+leur inst 1
+leur int 1
+leur int er 1
+leur interact 1
+leur localit 1
+leur longueur 1
+leur longueur est 1
+leur m erit 1
+leur mesur 1
+leur mesur est 1
+leur mi 1
+leur mi en 1
+leur migr 1
+leur migr sur 1
+leur mod 1
+leur mod de 1
+leur modl 1
+leur modl op 1
+leur mon 1
+leur nombr 1
+leur nombr tot 1
+leur oabilit 1
+leur ordonnanc 1
+leur ordonnanc temporel 1
+leur organ 1
+leur part 1
+leur part de 1
+leur perform 1
+leur perform sur 1
+leur pgcd 1
+leur plus proch 1
+leur posit 1
+leur posit est 1
+leur posit respectiv 1
+leur pr 1
+leur pr ci 1
+leur prinicip 1
+leur prinicip est 1
+leur propr 1
+leur pu 1
+leur pu intrin 1
+leur qualit 1
+leur qualit es 1
+leur r epartit 1
+leur r epl 1
+leur r eseau 1
+leur r esultat 1
+leur rang 1
+leur rang en 1
+leur recherch 1
+leur recherch dam 1
+leur remarqu 1
+leur remarqu pertin 1
+leur sembl 1
+leur sembl insolubl 1
+leur signif 1
+leur simplicit 1
+leur sont 1
+leur sont assoc 1
+leur sp 1
+leur sp ecificit 1
+leur structur 1
+leur structur pour 1
+leur tail 1
+leur topolog 1
+leur topolog qu 1
+leur tour 1
+leur tour fair 1
+leur unif 1
+leur util 1
+leur util difficil 1
+leur valeur 1
+leur valeur cour 1
+leur valeur de 1
+leur variabl 1
+leur variabl commun 1
+leuv 1
+lev 8
+lev and mar 1
+lev and martel 1
+lev ee 1
+lev88 1
+level 86
+level a softwar 1
+level abov l0 1
+level abov li 1
+level abov wh 1
+level abstract 1
+level act 2
+level act langu 1
+level affin 1
+level affin schedl 1
+level agr 1
+level agr sl 1
+level alap 1
+level algorithm 1
+level alloc 1
+level alloc construc 1
+level alloc primitiv 1
+level and aid 1
+level and blevel 1
+level and knowledg 1
+level and me 1
+level and merg 1
+level and metaobject 1
+level and posit 1
+level and therefor 1
+level answer 1
+level answer accept 1
+level appl 1
+level ar 1
+level ar consider 1
+level ar conv 1
+level ar label 1
+level ar record 1
+level ar requir 1
+level ar suff 1
+level architectur 2
+level architectur facilit 1
+level architectur requir 1
+level argum 2
+level as inst 1
+level asid 1
+level aspect 1
+level assum 1
+level attempt 1
+level automat 2
+level automat determin 2
+level b level 1
+level ba 1
+level ba level 1
+level be uniform 1
+level build 1
+level build block 1
+level by level 3
+level ca 1
+level ca exploit 1
+level cach 1
+level cach hierarch 1
+level cl 1
+level cluster 2
+level cluster con 2
+level cluster configur 2
+level cluster network 2
+level coarser 1
+level coarser graph 1
+level cod 2
+level cod gener 1
+level cod optim 1
+level cod transform 1
+level collabor 1
+level comp 1
+level comp act 1
+level comp oper 1
+level compar 1
+level compar contribut 1
+level compar defin 1
+level compar pr 1
+level compar result 1
+level comput 1
+level con 3
+level concept 2
+level concur 3
+level concur control 1
+level concur design 1
+level concur langu 1
+level connect 1
+level connect irrespect 1
+level constraint 2
+level construc 2
+level contain 1
+level correspon 1
+level cover 1
+level cover criter 1
+level cpur 1
+level credit 1
+level credit assignm 1
+level dat 3
+level dat cach 1
+level dat structur 1
+level datab 1
+level datab lock 1
+level decluster 1
+level definit 2
+level descript 4
+level descript langu 1
+level design 1
+level diagn 1
+level diagn specif 1
+level direct 2
+level disk 1
+level disk model 1
+level dur und 1
+level e multipl 1
+level each contain 1
+level encounter 1
+level ensur 1
+level ent 1
+level evalu 1
+level featur 1
+level featur extract 1
+level featur map 1
+level feedback 1
+level feedback loop 1
+level filter 1
+level finer 1
+level finer graph 1
+level flow 1
+level flow control 1
+level form 1
+level fragm 1
+level fram 1
+level funct 2
+level funct specif 1
+level ga 1
+level gener 2
+level gener proc 1
+level gener purp 1
+level geometer 1
+level geometer dat 1
+level grammar 1
+level graph 1
+level graph account 1
+level greater 1
+level h con 1
+level hard 1
+level hierarch 2
+level hierarch configur 2
+level hierarch system 2
+level i nod 1
+level in exact 1
+level in object 1
+level in order 1
+level in term 1
+level incr 1
+level ind 2
+level inst 1
+level inst variabl 1
+level instruc 1
+level inter 2
+level inter cluster 2
+level interrupt 1
+level interrupt transact 1
+level inver 1
+level inver oper 1
+level is achief 1
+level is burst 1
+level is calcl 1
+level is ch 1
+level is chang 1
+level is examin 1
+level is init 1
+level is li 1
+level is mad 1
+level is maintain 1
+level issu 1
+level j contain 1
+level k ary 2
+level l 1
+level l merg 1
+level l0 3
+level l0 log 1
+level l0 recov 1
+level l1 1
+level langu 7
+level langu compiler 1
+level langu construc 1
+level layer 1
+level li 2
+level lik fil 1
+level list 1
+level lj 1
+level lj receiv 1
+level lock 1
+level lock lock 1
+level log 3
+level manag 2
+level master 1
+level may encour 1
+level may interact 1
+level me 1
+level memor 1
+level memor model 1
+level method 2
+level method invoc 1
+level ml 1
+level ml system 1
+level mlt 1
+level mlt mult 1
+level model 3
+level model deriv 1
+level model repr 1
+level modif 1
+level mor crit 2
+level multicast 1
+level network 2
+level nod 1
+level nod manager 1
+level not 1
+level nuclear 1
+level nuclear wast 1
+level number 4
+level number accord 1
+level number assoc 1
+level number becom 1
+level number chang 1
+level number greater 1
+level number incr 1
+level number l0 1
+level number lj 1
+level number prev 1
+level number receiv 1
+level number schem 1
+level object 3
+level object cod 1
+level object orient 1
+level object us 1
+level obtain 1
+level of abstract 6
+level of advanc 2
+level of cluster 2
+level of coar 1
+level of collabor 1
+level of commitmentand 1
+level of confid 2
+level of decomposit 1
+level of descript 1
+level of detail 4
+level of developm 1
+level of exper 2
+level of fact 1
+level of fair 1
+level of gener 2
+level of indirect 2
+level of infer 2
+level of inherit 1
+level of instruc 1
+level of integr 2
+level of isol 1
+level of kind 1
+level of mach 1
+level of memor 1
+level of mimicr 1
+level of modl 1
+level of nest 1
+level of object 1
+level of observ 1
+level of optim 3
+level of parallel 1
+level of partit 1
+level of perform 1
+level of ph 1
+level of phy 1
+level of pr 1
+level of proc 2
+level of produc 1
+level of reconstruc 1
+level of recur 3
+level of rel 1
+level of relev 1
+level of repr 1
+level of resolut 1
+level of support 1
+level of ti 1
+level of toler 1
+level of und 1
+level of unfair 1
+level offer 1
+level op 1
+level oper 3
+level oper log 1
+level oper op 1
+level or simp 1
+level or van 1
+level order 1
+level order pointer 1
+level orient 1
+level orient serv 1
+level overhead 1
+level pack 2
+level parallel 2
+level parallel execut 1
+level part 1
+level pattern 1
+level perform 1
+level perform strict 1
+level pm 1
+level pool 1
+level pool contain 1
+level pr 1
+level primitiv 1
+level problem 1
+level problem specif 1
+level proc 3
+level proc overhead 1
+level program 10
+level program construc 2
+level program langu 3
+level program requir 1
+level prolog 1
+level prolog instruc 1
+level prov 1
+level prov ser 1
+level prun 1
+level prun structur 1
+level qualit 1
+level qualit model 1
+level random 1
+level rang 1
+level reason 2
+level reason techniqu 1
+level recov 1
+level recov algorithm 1
+level recov requir 1
+level red 1
+level refin 1
+level refin rl 1
+level rel 1
+level rel model 1
+level requir 1
+level run 1
+level run tim 1
+level runtim 1
+level runtim datab 1
+level scan 1
+level schedl 1
+level scheduler 1
+level schem 1
+level secur 1
+level secur constraint 1
+level seem 1
+level seem unnatur 1
+level sem 3
+level sem oper 1
+level ser 1
+level server 1
+level server proc 1
+level sign 1
+level sign featur 1
+level simil 1
+level softwar 1
+level softwar ba 1
+level softwar method 1
+level specif 2
+level specif caus 1
+level split 1
+level st 2
+level st model 1
+level st system 1
+level start 1
+level strateg 1
+level structur 3
+level structur mechan 1
+level structur repr 1
+level sub 1
+level sub log 1
+level subtransact 1
+level succ 1
+level switch 1
+level synth 1
+level synth system 1
+level synth tool 1
+level system 6
+level system ba 2
+level system developm 1
+level system op 1
+level system recov 1
+level system understand 1
+level system using 1
+level t level 1
+level tak 2
+level tak tim 1
+level th system 1
+level than typ 1
+level to exploit 1
+level to improv 1
+level to lower 1
+level to pa 1
+level to perm 1
+level transact 1
+level transact comp 1
+level transact instead 1
+level transact manag 1
+level transact nt 1
+level transact recov 1
+level transfer 1
+level transfer correspon 1
+level transform 1
+level typ 1
+level und 1
+level und model 1
+level und oper 1
+level und recov 1
+level undergradu 1
+level understand 1
+level uniform 1
+level uniform scal 1
+level user 1
+level user dialog 1
+level usu requir 1
+level ver 1
+level vi 2
+level vi proc 1
+level visu 1
+level visu featur 1
+level visu sem 1
+level wa quest 1
+level wa test 1
+level wavel 3
+level wavel decomposit 3
+level wavel transform 1
+level we obtain 1
+level wer test 1
+level which mak 1
+level which requir 1
+level with shrink 1
+level1 1
+levelmodl 1
+levenberg 1
+levenberg marquardt 1
+levenberg marquardt approxim 1
+lever 2
+lever ce 1
+lever ce restrict 1
+levesqu 2
+levin 1
+levin complec 1
+levin complec se 1
+levin univer 1
+levin univer search 1
+levit 1
+levrat 1
+lew 4
+lexactitud 1
+lexactitud de 1
+lexactitud de solut 1
+lexcept 1
+lexcept de 1
+lexcept de la 1
+lexcept de tak 1
+lexcept dun 1
+lexclus 1
+lexclus de 1
+lexclus de lappel 1
+lexempl 3
+lexempl ci 2
+lexempl ci dessus 2
+lexempl cidessus 1
+lexempl classiqu 1
+lexempl classiqu de 1
+lexempl de 2
+lexempl de la 1
+lexempl de qsort 1
+lexempl du 2
+lexempl du nid 1
+lexempl du paragraph 1
+lexempl du pr 1
+lexempl pr 2
+lexempl pr ec 2
+lexempl simpl 1
+lexempl simpl de 1
+lexempl suiv 1
+lexer 1
+lexer and parser 1
+lexer and test 1
+lexer conform 1
+lexer conv 1
+lexer conv sign 1
+lexer gener 1
+lexer pa 1
+lexicograp 1
+lexicograp from z1 1
+lexicograph 7
+lexicograph comparison 1
+lexicograph nonid 1
+lexicograph order 5
+lexicograph posit 1
+lexicograph succ 1
+lexicographiqu 2
+lexicographiqu inver 1
+lexicographiqu inver de 1
+lexicographiqu sur 1
+lexicographiqu sur le 1
+lexicopositif 1
+lexingt 1
+lexingt avenu 1
+lexiqu 1
+lexp 3
+lexp er 2
+lexp er de 1
+lexp er sur 1
+lexp erim 1
+lexp erim de 1
+lexpan 1
+lexpan de 1
+lexpan de larbr 1
+lexpan de term 1
+lexper 1
+lexper de 1
+lexper de membr 1
+lexploit 2
+lexploit de 1
+lexploit de la 1
+lexploit de propr 1
+lexploit du 1
+lexploit du potentiel 1
+lexploit dun 2
+lexploit dun eventuel 1
+lexploit dun mvp 1
+lexplor 1
+lexplor du 1
+lexplor du graph 1
+lexpr 4
+lexpr arithm 1
+lexpr arithm etiqu 1
+lexpr d27 1
+lexpr d27 11x 1
+lexpr d7x 1
+lexpr de 1
+lexpr de born 1
+lexpr du 1
+lexpr du th 1
+lexpr par 1
+lexpr par le 1
+lexpr som 1
+lext 3
+lext com 1
+lext com foncteur 1
+lext consid 1
+lext consid er 1
+lext de 2
+lext de ce 1
+lext de la 1
+lext de lalgorithm 1
+lext de transform 1
+lext du 2
+lext du form 1
+lext du retour 1
+lextensibilit 1
+lextensibilit e de 1
+lextr 1
+lextr em 1
+lextrair 1
+lextrair dun 1
+lfc 2
+lfc techn 1
+lfc techn report 1
+lfp 2
+lg 5
+lg and bl 1
+lg m0 1
+lg n oel 1
+lg n swap 1
+lg oe 1
+lg oe ss 1
+lg q0 1
+lg wil denot 1
+lg90 1
+lgam 1
+lgj 1
+lgj n0 1
+lgj qout 1
+lglwww.epfl.ch 1
+lglwww.epfl.ch ad 1
+lglwww.epfl.ch ad tut 1
+lh 4
+lh def 1
+lh def fx1x2 1
+lh fi 1
+lh ot 1
+lh rh 1
+lh89 2
+lhabituel 1
+lhabituel pr 1
+lhabituel pr edicat 1
+lheur 2
+lheur actuel 2
+lheur actuel sur 1
+lhistoir 1
+lhistoir du 1
+lhistoir du calcl 1
+lhmpw 1
+lhom 1
+lhonneur 2
+lhonneur de 2
+lhonneur de pr 2
+lhorlog 1
+lhorlog assoc 1
+lhorlog assoc ee 1
+lhr71 1
+lhr88 1
+lhslx92 1
+lhypercub 1
+lhypercub et perm 1
+lhypercub ipsc 1
+lhypercub lor 1
+lhypercub lor de 1
+lhyperoctr 1
+lhyperoctr repr 1
+lhyperoctr repr esent 1
+lhypoth 2
+lhypoth es 2
+lhypoth es dun 1
+lhypoth es dunimodularit 1
+lhypoth es habituel 1
+lhypoth es pr 1
+lhypoth es qu 1
+lhypoth es quun 1
+li 47
+li 1g 1
+li ae 2
+li ae ci 1
+li ae lmac 1
+li ae mac 1
+li ae sk 1
+li and eqntot 1
+li and fp 1
+li and paul 1
+li and ri 1
+li and u0n 1
+li and ui 1
+li and vit 1
+li and vitan 1
+li as op 1
+li as specif 1
+li automatiqu 1
+li automatiqu dobj 1
+li begin 1
+li between mac 1
+li beyon cal 1
+li bi 1
+li bi ei 1
+li c ui 1
+li ci 1
+li closest 1
+li clr 1
+li clr comp 1
+li ct 1
+li ct com 1
+li de 2
+li de la 1
+li de variabl 1
+li e au 1
+li e dun 1
+li e quun 1
+li ee 4
+li ee ait 1
+li ee au 2
+li ee aux 2
+li ee avant 1
+li ee de 3
+li ee dun 1
+li ee est 1
+li ee etant 1
+li ee inconditionnel 1
+li ee ma 1
+li ee naurait 1
+li ee ordinair 1
+li ee par 1
+li ee peut 1
+li ee quil 1
+li ee quun 1
+li ee retenu 1
+li ee se 1
+li ee simpl 1
+li ee suiv 2
+li em 1
+li em patron 1
+li es 4
+li es aux 1
+li es com 1
+li et rec 1
+li field 1
+li g om 1
+li group 1
+li in compiler 1
+li interrupt 1
+li interrupt transact 1
+li is defin 1
+li is receiv 1
+li is said 1
+li jqj 1
+li la 1
+li la mesur 1
+li le 1
+li le di 1
+li level 1
+li li 2
+li lisp 1
+li lisp interpreter 1
+li lj 2
+li lj level 1
+li lj log 1
+li ljaej 1
+li lmac 1
+li nod 1
+li nod contain 1
+li oc 1
+li oe 1
+li on n2 1
+li op 1
+li po 1
+li po par 1
+li pour 1
+li pour le 1
+li pr 2
+li qu 1
+li qu de 1
+li recov 1
+li recov und 1
+li s n0m0 1
+li son 1
+li son argum 1
+li swap 1
+li th 1
+li th oriqu 1
+li to maintain 1
+li transform 1
+li transform rig 1
+li ui 1
+li uj 1
+li un probl 1
+li und 1
+li und ph 1
+li valu 1
+li ver den 1
+li wang 2
+li when und 1
+li whenever li 1
+li xi 1
+li xi ui 1
+li1 2
+li1 and ll1 1
+li2 2
+li3 1
+li4 1
+li87 1
+li88 2
+li92 1
+liaison 2
+liaison a de 1
+liaison a la 1
+liaison attach 1
+liaison attach ee 1
+liaison au 1
+liaison au retour 1
+liaison concern 1
+liaison concern de 1
+liaison conditionnel 1
+liaison conditionnel doit 1
+liaison conditionnel don 1
+liaison conditionnel en 1
+liaison conditionnel ont 1
+liaison dan 1
+liaison dan le 1
+liaison dan lenviron 1
+liaison de 1
+liaison de ce 1
+liaison de champ 1
+liaison de leur 1
+liaison de longueur 1
+liaison de sa 1
+liaison de variabl 1
+liaison de vi 1
+liaison demand 1
+liaison demand un 1
+liaison destruc 1
+liaison destruc comport 1
+liaison destruc est 1
+liaison destruc suppl 1
+liaison destructiv 1
+liaison destructiv peuv 1
+liaison dev 1
+liaison dev inconditionnel 1
+liaison dit 1
+liaison dit conditionnel5 1
+liaison doit 1
+liaison doit etr 1
+liaison dont la 1
+liaison du 1
+liaison du champ 1
+liaison dun 1
+liaison dun var 1
+liaison enregister 1
+liaison enregister ee 1
+liaison enregister le 1
+liaison est 1
+liaison est conditionnel 1
+liaison est donc 1
+liaison est empil 1
+liaison est enregister 1
+liaison et de 1
+liaison et test 1
+liaison inconditionnel 1
+liaison inconditionnel demand 1
+liaison lor 1
+liaison lor de 1
+liaison ne 1
+liaison ne peut 1
+liaison nest 1
+liaison nest pa 1
+liaison non 1
+liaison non triv 1
+liaison par 1
+liaison par simpl 1
+liaison peut 1
+liaison peut etr 1
+liaison peut ne 1
+liaison plus anc 1
+liaison plus jeun 1
+liaison pour 1
+liaison pour acc 1
+liaison propr 1
+liaison qu 1
+liaison qu lon 1
+liaison qu nauront 1
+liaison quil 1
+liaison quil est 1
+liaison r esult 1
+liaison responsabl 1
+liaison responsabl dun 1
+liaison sappliqu 1
+liaison sav 1
+liaison se 1
+liaison sont 1
+liaison sont fait 1
+liaison standard 1
+liaison standard en 1
+liaison standard ne 1
+liaison sur 1
+liaison sur la 1
+liaison vi 1
+liang 3
+liang and richard 1
+liang li 1
+liang liang 1
+liang liang li 1
+liang richard 1
+liant 1
+liant ce 1
+liant ce var 1
+lib 2
+lib er 2
+lib er ee 1
+lib er es 1
+lib er le 2
+lib er pa 1
+lib er tous 1
+lib erant 1
+lib erant point 1
+lib erat 1
+lib erat cr 1
+lib erat de 1
+lib erat denviron 1
+lib erat doit 1
+lib erat du 1
+lib erat dun 1
+lib erat est 1
+lib erat instantan 1
+lib erat inutil 1
+lib erat par 1
+lib erer 2
+lib erer dan 1
+lib erer de 1
+lib erer est 1
+lib erer inutil 1
+lib erer la 1
+lib erer le 2
+lib erer lenviron 1
+libc.h 1
+libc.h inclus 1
+libc.h inclus mp 1
+liber 4
+liber approach 1
+liber e dact 1
+liber e dan 1
+liber e la 1
+libr 31
+libr an issu 1
+libr and appl 2
+libr and oo 1
+libr appl 1
+libr ar indeed 1
+libr ar modif 1
+libr ar mutu 1
+libr ar st 1
+libr ar stat 1
+libr au 1
+libr au sein 1
+libr by upd 1
+libr cal 1
+libr calloverhead 1
+libr calloverhead communicationm 1
+libr chang 1
+libr chang specif 1
+libr client 1
+libr cod 1
+libr comlab.ox.ac.uk 1
+libr converter 1
+libr dan 2
+libr dan le 1
+libr dan leur 1
+libr de 1
+libr de la 1
+libr de variabl 1
+libr each appl 1
+libr en 1
+libr en un 1
+libr et lattribut 1
+libr etendu 1
+libr f definit 1
+libr fin 1
+libr fin de 1
+libr for borland 1
+libr for scal 1
+libr funct 3
+libr giv 1
+libr hav becom 1
+libr incr 1
+libr interfac 1
+libr interfac chang 1
+libr is upd 1
+libr isol 1
+libr l ext 1
+libr level 1
+libr m dep 1
+libr maintainer 1
+libr maintainer annot 1
+libr maintainer dec 1
+libr maintainer rev 1
+libr maintainer writ 1
+libr manager 1
+libr mechan 1
+libr modif 2
+libr modif es 1
+libr modl 1
+libr mp 1
+libr of compon 1
+libr of congr 1
+libr of eclip 1
+libr of orthonorm 1
+libr of templ 1
+libr offer 1
+libr offer high 1
+libr onc st 1
+libr oper 1
+libr par 1
+libr patron 1
+libr patron know 1
+libr patron simp 1
+libr patron want 1
+libr pour 1
+libr pour ranger 1
+libr prov 1
+libr prov lever 1
+libr random 1
+libr random number 1
+libr requir 1
+libr requir chang 1
+libr rout 2
+libr s chang 1
+libr s syntac 1
+libr simp 1
+libr sourc 1
+libr sourc chang 1
+libr specif 1
+libr specif modl 1
+libr ten 1
+libr th overhead 1
+libr that chang 1
+libr that support 1
+libr transform 1
+libr transform term 1
+libr unit 1
+libr upd 1
+libr user 1
+libr which langu 1
+libr without mak 1
+libr.2 1
+librair 1
+librair lapack 1
+librair nag 1
+librair nag ecrit 1
+librair scientifiqu 1
+librar 2
+librar or patron 1
+librar to find 1
+libtp 1
+lic 4
+lic agr 1
+lic cost 1
+lic91 1
+lic92 1
+lichnewsk 1
+lichnewsk pour 1
+lichnewsk pour avoir 1
+lichnewsk rapporteur 1
+lichnewsk rapporteur m 1
+licit 1
+licit de 1
+lidentit 2
+lidentit e de 1
+lieber 1
+lieber corwin.cc.northeastern.edu 1
+lieberh 3
+lieberh and arthur 1
+lieberh and cun 3
+lieberh and ian 2
+lieberh and karl 1
+lieberh xi 1
+lieberman 1
+lieberman and fry 1
+lien 4
+lien avec 1
+lien avec le 1
+lien de 1
+lien de commun 1
+lien entr 2
+lien entr la 1
+lien entr le 1
+lien subtil 1
+lient 1
+lient la 1
+lient la var 1
+lient pa 1
+lient pa de 1
+liepin 1
+liepin and vo 1
+lier 2
+lier anc 1
+lier de 1
+lier de variabl 1
+lier la 1
+lier la var 1
+lier un 1
+lier un var 1
+lieu 5
+lieu a cop 1
+lieu a lint 1
+lieu a un 1
+lieu au 1
+lieu au contrair 1
+lieu au niveau 1
+lieu dacc 1
+lieu dacc es 1
+lieu dan 2
+lieu dan la 1
+lieu dan le 1
+lieu dan un 1
+lieu de 4
+lieu de cel 1
+lieu de consid 1
+lieu de coupur 1
+lieu de point 1
+lieu de tr 1
+lieu dextrair 1
+lieu dextrair le 1
+lieu dhypoth 1
+lieu dhypoth es 1
+lieu dun 1
+lieu dun point 1
+lieu entr 1
+lieu entr deux 1
+lieu et le 1
+lieu le 1
+lieu le pa 1
+lieu loc 1
+lieu lor 1
+lieu lor de 1
+lieu lor dun 1
+lieu lorsquil 1
+lieu of bool 1
+lieu par 1
+lieu par pag 1
+lieu par pair 1
+lieu remerc 1
+lieu remerc le 1
+lieu ser 1
+lieu ser la 1
+lieu sur 1
+lieu sur de 1
+liew 1
+lif 22
+lif abstract 1
+lif appl 1
+lif attribut 1
+lif attribut distribut 1
+lif begin 1
+lif cycl 3
+lif ea 1
+lif en 1
+lif exampl 1
+lif form 1
+lif ii 1
+lif is consider 1
+lif is ea 1
+lif is view 1
+lif lp 1
+lif lp problem 1
+lif of n2 1
+lif problem 2
+lif program 1
+lif situ 1
+lif situ wh 1
+lif span 2
+lif span strateg 1
+lif threat 1
+lif threat consequ 1
+lif tim 2
+lif wil indeed 1
+lifecycl 2
+lifecycl cost 1
+lifelong 1
+lifelong sequ 1
+lifetim 7
+lifetim host 1
+lifetim host timeout 1
+lifetim is lim 1
+lifetim of dupl 1
+lifetim td 1
+lift 4
+lift act 1
+lift for goal 1
+light 25
+light and clear 1
+light and imag 1
+light and screen 1
+light beam 1
+light condit 1
+light constraint 1
+light distribut 1
+light gr 1
+light gr repr 1
+light in greysc 1
+light it mak 2
+light load 4
+light load mach 1
+light manager 1
+light manager label 1
+light of exper 1
+light on fundam 1
+light plan 1
+light room 1
+light room thought 1
+light shad 2
+light shad field 1
+light shad repr 1
+light system 1
+light system con 1
+light system describ 1
+light system design 1
+light system mov 1
+light system plac 1
+light system prototyp 1
+light system scan 1
+light system3 1
+light weight 4
+light weight lec 1
+light weight object 1
+light weight proc 1
+light weight se 1
+light wil go 1
+lighter 1
+lighter remain 1
+lighter remain edg 1
+lightest 1
+lightest column 1
+lightweight 4
+lightweight caus 1
+lightweight sourc 1
+lightweight sourc model 1
+lign 4
+lign a coeff 1
+lign arith 1
+lign augm 1
+lign augm par 1
+lign de 2
+lign de ak 1
+lign de cach 1
+lign de la 2
+lign de lalgorithm 1
+lign de larithm 1
+lign de tableau 1
+lign droit 1
+lign droit dan 1
+lign du 2
+lign du cach 1
+lign du tableau 1
+lign du test 1
+lign dun 1
+lign en 1
+lign en un 1
+lign en util 1
+lign et le 1
+lign et perm 1
+lign nest 1
+lign nest optim 1
+lign qu 1
+lign qu forc 1
+lign qu nous 1
+lign sont 1
+lign sont identiqu 1
+ligom 1
+ligur 1
+lij 1
+lik 43
+lik a subcl 1
+lik answer 1
+lik by autom 1
+lik decr 1
+lik div 1
+lik du 1
+lik estim 1
+lik exampl 1
+lik exampl encounter 1
+lik for host 1
+lik loc 1
+lik loc using 1
+lik meant 1
+lik of using 1
+lik perform 1
+lik problem 1
+lik problem ar 1
+lik result 1
+lik sourc 1
+lik storytel 1
+lik that futur 1
+lik that modif 1
+lik to aid 1
+lik to allow 1
+lik to appear 1
+lik to ar 1
+lik to benefit 1
+lik to caus 1
+lik to chang 1
+lik to com 1
+lik to ea 1
+lik to exacerb 1
+lik to exceed 1
+lik to giv 1
+lik to grab 1
+lik to incr 1
+lik to maintain 1
+lik to perform 1
+lik to propag 1
+lik to prov 1
+lik to qualif 1
+lik to render 1
+lik to result 2
+lik to satisf 1
+lik to se 1
+lik to succeed 1
+lik to var 1
+lik to want 1
+lik to yield 1
+lik valu 1
+lik ver difficult 1
+lil 1
+lim 79
+lim a appar 1
+lim a lallong 1
+lim acc 2
+lim ain 1
+lim ain qu 1
+lim alg 1
+lim alg ebriqu 1
+lim and def 1
+lim and risk 1
+lim and sanj 1
+lim appear 1
+lim appl 1
+lim ar attack 1
+lim ar deriv 2
+lim ar exceed 2
+lim ar intrin 1
+lim ar known 1
+lim au 2
+lim au cr 1
+lim au sous 1
+lim automatiqu 1
+lim automatiqu la 1
+lim bus 1
+lim bus bandwidth 1
+lim by coh 1
+lim by memor 1
+lim ca 1
+lim cabinet 2
+lim cabinet siz 2
+lim can becom 1
+lim chang 1
+lim ci 1
+lim ci dessus 1
+lim cluster 2
+lim cluster siz 2
+lim connect 1
+lim correspon 1
+lim dan 1
+lim dan ce 1
+lim de 3
+lim de ce 1
+lim de chaqu 1
+lim de el 1
+lim de la 3
+lim de lespac 1
+lim de nn 1
+lim de pag 1
+lim de zn 1
+lim disc 1
+lim distribut 1
+lim distribut not 1
+lim domain 1
+lim du 1
+lim du domain 1
+lim du grain 1
+lim du pol 1
+lim dun 1
+lim dun domain 1
+lim dynam 1
+lim dynam bind 1
+lim e au 1
+lim e dan 1
+lim e de 1
+lim ee 2
+lim ee au 1
+lim ee aux 1
+lim ee de 1
+lim ee en 1
+lim ee par 1
+lim ee qu 1
+lim effect 1
+lim en 2
+lim en retard 1
+lim en speed 1
+lim equ 1
+lim es 3
+lim es par 1
+lim exp 1
+lim fact 1
+lim feedback 1
+lim feedback architectur 1
+lim for appl 1
+lim for suppl 1
+lim foreseen 1
+lim form 1
+lim from theorem 1
+lim g roguewav 1
+lim hil 1
+lim hil climb 1
+lim import 1
+lim in memor 1
+lim in observ 1
+lim interconnect 1
+lim interconnect util 1
+lim is plac 1
+lim la 2
+lim la compr 1
+lim la tail 1
+lim le 1
+lim le eff 1
+lim le nombr 1
+lim lintroduc 1
+lim lintroduc de 1
+lim list 1
+lim maint 1
+lim maxim 1
+lim maxim perform 1
+lim moindr 1
+lim moindr en 1
+lim neg 1
+lim neg learn 1
+lim non 1
+lim non nl 1
+lim number 2
+lim nw 1
+lim oalg 1
+lim oalg ebriqu 1
+lim of ad 1
+lim of clp 1
+lim of comput 1
+lim of control 1
+lim of cpu 1
+lim of cur 2
+lim of dat 1
+lim of induc 1
+lim of instruc 1
+lim of item 1
+lim of multilayer 1
+lim of offer 1
+lim of parallel 1
+lim of spac 1
+lim on instruc 1
+lim on interconnect 3
+lim on learn 1
+lim on parallel 1
+lim optim 1
+lim optim problem 1
+lim or known 1
+lim oracl 1
+lim oracl measur 1
+lim par 1
+lim parallel 3
+lim parallel unnec 1
+lim plac 1
+lim put 1
+lim rang 1
+lim reducibil 1
+lim reflect 1
+lim reflect capabil 1
+lim register 1
+lim register siz 1
+lim rel 1
+lim requir 1
+lim requir keep 1
+lim resolut 1
+lim resolut continu 1
+lim resourc 2
+lim resourc avail 1
+lim rester 1
+lim rester inchang 1
+lim reus 1
+lim sa 1
+lim sa port 1
+lim sampl 1
+lim sampl siz 1
+lim se 1
+lim select 1
+lim serait 1
+lim serait le 1
+lim si 1
+lim siz 1
+lim souv 1
+lim spac 2
+lim spec proc 1
+lim stack 1
+lim stack circl 1
+lim structur 1
+lim succ 1
+lim templ 1
+lim templ facil 1
+lim tempor 1
+lim th appl 1
+lim th avail 1
+lim th cl 1
+lim th cluster 1
+lim th ec 1
+lim th effect 1
+lim th infer 1
+lim th largest 1
+lim th maxim 2
+lim th number 3
+lim th proc 1
+lim th rang 1
+lim th rat 1
+lim th search 1
+lim th siz 1
+lim th speedup 1
+lim th system 1
+lim to ar 1
+lim to constraint 1
+lim to dump 1
+lim to hypercub 1
+lim to mult 1
+lim to oper 1
+lim to peer 1
+lim to var 1
+lim us 3
+lim util 1
+lim valu 1
+lim view 1
+lim vocabl 1
+lim vocabl imp 1
+lim wa adopt 1
+lim window 1
+lim window siz 1
+limager 1
+limager m dic 1
+limitait 1
+limitait aux 1
+limitait aux matr 1
+limiter 2
+limiter a sauvegarder 1
+limiter a un 1
+limiter la 1
+limiter la consom 1
+limiter le 2
+limiter le eff 1
+limiter le facteur 1
+limiter le pa 1
+limiter le traf 1
+limiteron 2
+limiteron a un 1
+limiteron dan 1
+limiteron dan le 1
+limiteron donc 1
+limiteron donc aux 1
+limk 2
+limk 1mk 1
+limk 1mk limk 1
+limn 1
+limpact 2
+limpact de 2
+limpact de ce 1
+limpact de conflit 1
+limpact de modif 1
+limpact du 1
+limpact du faux 1
+limpact dun 1
+limpact dun transform 1
+limpact est 1
+limpact est extr 1
+limpact exact 1
+limpact exact de 1
+limpact fin 1
+limpact fin de 1
+limpact import de 1
+limpl 3
+limpl de 1
+limpl de koan 1
+limpl du 1
+limpl du part 1
+limpl em 1
+limpl em consid 1
+limpl em cour 1
+limpl em de 1
+limpl em du 1
+limpl em dun 1
+limpl em na 1
+limport 2
+limport capit 1
+limport capit de 1
+limport d etendr 1
+limport de 2
+limport de ce 2
+limport de contraint 1
+limport de la 2
+limport de not 1
+limport de propr 1
+limport de se 1
+limport du 1
+limposeron 1
+limpossibilit 1
+limpossibilit e de 1
+limt 1
+limt 1pfxt 1
+lin 101
+lin acc 1
+lin acc str 1
+lin accord 1
+lin air 1
+lin algebr 4
+lin algebr equ 1
+lin algorithm 3
+lin and branch 2
+lin and character 1
+lin and com 1
+lin and detect 1
+lin and eventu 1
+lin and hit 1
+lin and integer 3
+lin and lin 1
+lin and ni 1
+lin and non 2
+lin and peleg 1
+lin and pointer 1
+lin and produc 1
+lin and surfac 1
+lin and text 1
+lin ar 1
+lin ar fil 1
+lin ar inv 1
+lin ar learn 1
+lin ar refer 1
+lin ar smooth 1
+lin arithm 1
+lin arrang 1
+lin assum 1
+lin belong 1
+lin between piec 1
+lin block 1
+lin bound 1
+lin by using 3
+lin ca 1
+lin calculus 1
+lin chang 2
+lin cluster 1
+lin com 1
+lin comb 1
+lin combin 1
+lin connect 1
+lin connectiv 1
+lin const 1
+lin const symbol 1
+lin constraint 1
+lin contextu 1
+lin contextu help 1
+lin control 1
+lin control appl 1
+lin correl 2
+lin correspon 1
+lin cost 1
+lin cost model 1
+lin d dim 1
+lin datab 1
+lin datalog 1
+lin defin 1
+lin definit 1
+lin dep 1
+lin descript 1
+lin dioph 1
+lin dioph equ 1
+lin docum 1
+lin docum quick 1
+lin docum3 1
+lin dual 1
+lin eair 3
+lin eair assoc 1
+lin eair avec 1
+lin eair de 1
+lin eair du 1
+lin eair en 2
+lin eair ent 1
+lin eair ind 1
+lin eair non 1
+lin eair posit 1
+lin eair pouvait 1
+lin eair sur 1
+lin eair unimodulair 1
+lin ear 1
+lin ear ee 1
+lin edg 2
+lin edg repr 1
+lin egalit 2
+lin equ 10
+lin equ ax 2
+lin equ constraint 1
+lin er 1
+lin er de 1
+lin estim 1
+lin experim 1
+lin expon 1
+lin ext 1
+lin ext fast 1
+lin ext us 1
+lin extract 2
+lin featur 1
+lin feed 1
+lin feed control 1
+lin fil 1
+lin fit 1
+lin for pag 1
+lin form 2
+lin form ba 1
+lin form mi 1
+lin form3 1
+lin frequ 1
+lin frequ mark 1
+lin from softwar 1
+lin funct 10
+lin funct assoc 1
+lin funct defin 1
+lin funct fu0 1
+lin graph 1
+lin hash 1
+lin hash method 1
+lin help 1
+lin help facil 1
+lin help system 1
+lin hierarch 1
+lin hybrid 1
+lin hybrid tr 1
+lin impl 1
+lin impl combin 1
+lin in fig 1
+lin in figur 4
+lin in p1 1
+lin in pag 1
+lin incr 1
+lin ind 2
+lin ind measur 1
+lin ind model 1
+lin indep 1
+lin indep column 1
+lin indep sub 1
+lin inequ 3
+lin inequ constraint 1
+lin inform 3
+lin inherit 1
+lin inherit hierarch 1
+lin input 1
+lin integer 1
+lin integer arithm 1
+lin interact 1
+lin interfac 2
+lin interpol 1
+lin interv 2
+lin interv maintenac 1
+lin inv 1
+lin is greater 1
+lin is simp 1
+lin is smooth 1
+lin is util 1
+lin it follow 1
+lin join 1
+lin lec 1
+lin lec specif 1
+lin length 1
+lin level 1
+lin list 1
+lin loc 1
+lin loc search 1
+lin log 1
+lin log approach 1
+lin log ge 1
+lin log justif 1
+lin log program 1
+lin log regard 1
+lin log us 1
+lin loop 1
+lin loop nest 1
+lin mach 1
+lin manner 1
+lin mean 1
+lin measur 1
+lin med 1
+lin med record 1
+lin model 3
+lin multivar 1
+lin multivar control 1
+lin neg 1
+lin neg oe 1
+lin nonpreemt 1
+lin nonpreemt prior 1
+lin now follow 1
+lin number 2
+lin object 2
+lin object system 1
+lin object us 1
+lin of assemb 1
+lin of cod 5
+lin of dep 1
+lin of frug 1
+lin of futur 1
+lin of intersect 1
+lin of method 1
+lin of pag 1
+lin of reason 1
+lin of recur 1
+lin of research 1
+lin of sect 1
+lin of shar 1
+lin of subscript 1
+lin of text 1
+lin on figur 1
+lin on irregl 1
+lin opt 1
+lin opt inclus 1
+lin optim 1
+lin optim techniqu 1
+lin or 1
+lin or mult 1
+lin or pag 1
+lin or plan 1
+lin or sublin 1
+lin oracl 1
+lin oracl retain 1
+lin oracl ye 1
+lin order 2
+lin order ca 1
+lin order constraint 1
+lin order domain 1
+lin order expr 1
+lin order inequ 1
+lin ordin 1
+lin ordin leav 1
+lin p4 1
+lin pa 1
+lin perpendicl 2
+lin prob 1
+lin problem 2
+lin proc 2
+lin produc 1
+lin program 6
+lin program approxim 1
+lin program commun 1
+lin program flap 1
+lin program lhr71 1
+lin program problem 3
+lin program result 1
+lin program se 1
+lin quadr 1
+lin quadr control 1
+lin quadtr 2
+lin quadtr approach 1
+lin quadtr root 1
+lin rank 1
+lin rank filter 1
+lin re definit 1
+lin re program 1
+lin read 1
+lin read fault 1
+lin recur 1
+lin refer 1
+lin refin 1
+lin refin algorithm 1
+lin regr 1
+lin regr an 1
+lin rel 1
+lin relationship 1
+lin remot 1
+lin remot writ 1
+lin repr 2
+lin repr instead 1
+lin repr tl 1
+lin requir 1
+lin rl 1
+lin scal 1
+lin scan 2
+lin schedl 1
+lin schedl heur 1
+lin search 1
+lin segm 4
+lin segm oe 1
+lin select 1
+lin sensit 1
+lin serv 1
+lin shift 1
+lin siz 2
+lin spac 1
+lin spac dat 1
+lin specif 1
+lin specif tak 1
+lin speed 2
+lin speedup 3
+lin stack 1
+lin stack model 1
+lin start 1
+lin subscript 1
+lin subscript funct 1
+lin system 7
+lin system defin 1
+lin system identif 1
+lin th effect 1
+lin th measur 1
+lin th point 1
+lin that contain 1
+lin that serv 1
+lin tim 13
+lin tim algorithm 4
+lin tim complec 1
+lin tim dec 1
+lin tim fact 1
+lin tim heur 1
+lin tim hierarch 1
+lin tim loc 1
+lin tim minor 1
+lin tim sequ 2
+lin tim tempor 2
+lin tim ver 1
+lin timedec 1
+lin timedec problem 1
+lin to 40k 1
+lin tool 1
+lin tr 1
+lin tr t1 1
+lin tr tj 1
+lin tr tl 1
+lin transact 1
+lin transact proc 1
+lin transform 3
+lin triangl 1
+lin triangl matr 1
+lin using 1
+lin vect 1
+lin vect quant 1
+lin ver 2
+lin vi 1
+lin vol 1
+lin with cluster 2
+lin with gener 1
+lin with respect 2
+lin with siz 1
+lin with text 1
+lin.2 1
+linaptitud 1
+linaptitud a eviter 1
+linar 1
+lincertitud 1
+lincertitud dan 1
+lincertitud dan le 1
+lincertitud de 1
+lincertitud de la 1
+lincertitud du 1
+lincertitud du rec 1
+lincertitud est 1
+lincertitud est indisp 1
+lincertitud par 1
+lincertitud par deux 1
+lincertitud sur 1
+lincertitud sur la 1
+lincertitud sur le 1
+linclus 1
+linclus de 1
+linclus de droit 1
+linclus de gauch 1
+linconv 3
+linconv enient 3
+linconv enient de 1
+linconv enient majeur 2
+linconv enient princip 1
+lincr 1
+lincr ement 1
+lincr ement atteint 1
+lincr ement est 1
+lind 15
+lind and christoph 1
+lind de 1
+lind de la 1
+lind epen 1
+lind epen mutuel 1
+lind erringt 1
+lind et la 1
+lind figur 1
+lind figur dan 1
+lind ij 1
+lind ij qu 1
+lind in context 1
+lind k dun 1
+lind k var 1
+lind keszenheimer 1
+lind ne 1
+lind ne peut 1
+lind qu 1
+lind qu sont 1
+lind seiter 1
+lind seiter suggest 1
+lind va 1
+lind va choisir 1
+lindenmayr 1
+linderman 1
+lindgr 1
+lindgr ont 1
+lindholm 1
+lindiqu 1
+lindiqu la 1
+lindiqu la propr 1
+lindiqu le 1
+lindiqu le sch 1
+lindividu 1
+lindividu de 1
+lindividu de ag 1
+lindividu le 1
+lindstrom 2
+lindustr 1
+lindustr pharmaceutiqu 1
+lineand 1
+lineand plan 1
+lineand plan separ 1
+linec 1
+linec de 1
+linec de trajectoir 1
+linefeed 1
+linefeed j newl 1
+linflu 3
+linflu de 3
+linflu de ce 1
+linflu de la 2
+linflu de larbitrair 1
+linflu de lop 1
+linflu de param 1
+linflu du 1
+linflu du co 1
+linflu du grain 1
+linflu du temp 1
+linflu quil 1
+linflu quil ont 1
+linflu sur 1
+linflu sur la 1
+linform 3
+linform condu 1
+linform dan 1
+linform de 1
+linform de continu 1
+linform de contr 1
+linform est 1
+linform est contenu 1
+linform g om 1
+linform n ecessair 1
+linform qu 1
+linform qu aurait 1
+linformatiqu 3
+linformatiqu du 1
+linformatiqu du par 1
+linformatiqu non 1
+linformatiqu non sel 1
+linformatiqu qu 1
+linformatiqu qu lon 1
+ling 2
+ling ton 1
+ling ton chen 1
+lingu 7
+lingu an 1
+lingu and cultur 1
+lingu comp 1
+lingu comp transl 1
+lingu comput 1
+lingu construc 1
+lingu ext 2
+lingu featur 2
+lingu framework 1
+lingu natur 1
+lingu support 1
+lingu theor 1
+lingu work 1
+lingu work environm 1
+lingu workplac 1
+liningt 1
+linit 2
+linit de 2
+linit de bp 1
+linit de lalgorithm 1
+linit de part 1
+linit de variabl 1
+link 49
+link 4x4 1
+link 4x4 bidirect 1
+link a dynam 1
+link a network 1
+link a number 1
+link actu 1
+link actu ch 1
+link algorithm 1
+link amount 1
+link and nod 1
+link and router 1
+link and switch 1
+link antec 1
+link antec condit 1
+link ar comput 1
+link ar creat 1
+link ar determin 1
+link ar exp 2
+link ar report 1
+link ar uniqu 1
+link assoc 1
+link assoc manifest 1
+link attach 1
+link avail 1
+link bandwidth 2
+link bandwidth eff 1
+link becom 1
+link between item 1
+link between nod 1
+link between p1 1
+link between proc 1
+link between rol 1
+link between separ 1
+link between switch 1
+link between variabl 2
+link by dot 1
+link can caus 1
+link can support 2
+link ch 1
+link chang 2
+link chang du 1
+link chang ge 1
+link cl 1
+link cl tok 1
+link compon 1
+link compon inclus 1
+link compon inst 1
+link compon model 1
+link computer 1
+link computer loc 1
+link connect 2
+link connect connect 1
+link correspon 1
+link cost 4
+link cost calcl 1
+link cost chang 1
+link cost compon 1
+link cost dijkstr 1
+link cost funct 1
+link cost inform 1
+link cost tim 1
+link cost upd 1
+link cost valu 1
+link dep 1
+link determin 2
+link distribut 1
+link edg 2
+link edg point 1
+link edg segm 1
+link el 1
+link el object 1
+link fail 1
+link failur 3
+link failur model 1
+link for separ 1
+link form 1
+link from eev 1
+link funct 1
+link group 1
+link hb 1
+link hc 1
+link held 1
+link hold 1
+link hold nam 1
+link in eev 1
+link in eexc 1
+link in increm 1
+link in spf 1
+link inc 1
+link inform 1
+link interconnect 1
+link is ch 1
+link is clear 1
+link is connect 1
+link is creat 1
+link is expect 1
+link is impl 1
+link is ind 1
+link is optim 1
+link is refer 1
+link list 6
+link list belong 1
+link list collect 1
+link list compon 1
+link list con 1
+link list dat 1
+link list implem 1
+link list offer 1
+link ls 1
+link ls broadcast 1
+link macintosh 1
+link may lo 1
+link me 1
+link mean 1
+link model 1
+link model ethernet 1
+link modl 1
+link nec 1
+link new rol 1
+link nod 1
+link nod failur 1
+link nonblock 1
+link nonblock problem 1
+link of log 1
+link of maxim 1
+link of vk 1
+link of weight 1
+link or bdeg 1
+link ph 1
+link proc 1
+link propag 1
+link propag del 1
+link protocol 2
+link protocol es 1
+link protocol rout 1
+link prov 1
+link queu 1
+link queu discipl 1
+link rat 1
+link rat alloc 1
+link rel 1
+link rel view 1
+link repair 1
+link repr 2
+link schedl 2
+link schedl discipl 1
+link shutdown 1
+link shutdown pkt 1
+link speed 3
+link st 2
+link st algorithm 1
+link st pack 1
+link st pkt 1
+link st rout 1
+link subtransact 1
+link switch 1
+link techniqu 1
+link th den 1
+link th individu 1
+link th reg 1
+link th st 1
+link th structur 1
+link th var 1
+link that inclus 1
+link that point 1
+link til correct 1
+link tim 2
+link tim conflict 1
+link to actu 1
+link to incr 1
+link to nod 1
+link to satisf 1
+link to super 1
+link to tak 1
+link to vdest 1
+link to vk 1
+link together increm 1
+link tr 1
+link tr algorithm 1
+link tr prop 1
+link tr protocol 1
+link tr search 1
+link traff 1
+link traff chang 1
+link traver 1
+link upd 1
+link upd me 1
+link util 1
+link ver 1
+link ver number 1
+link wakeup 1
+link wakeup pkt 1
+link wer deriv 1
+link wgp 1
+link which lead 1
+link which perm 1
+link which support 1
+link wil result 1
+link with label 1
+link1 1
+link1 link 1
+linkclassdefinit 1
+linkclassdefinit linkdefinit 1
+linkdefinit 1
+linker 1
+linkoep 1
+linnenkugel 1
+linpack 1
+linpack user 1
+linpack user guid 1
+linr 1
+linser 2
+linser de 1
+linser de test 1
+linser dun 1
+linser dun instruc 1
+linst 4
+linst a justif 1
+linst de 1
+linst le 1
+linst le volut 1
+linst pr 1
+linst pr esent 1
+linst pur 1
+linst pur arbitrair 1
+linst un 1
+linst un matr 1
+linst val 1
+linstanc 1
+linstanc de 1
+linstanc de la 1
+linstanc de variabl 1
+linstitut 1
+linstitut poincar 1
+linstruc 2
+linstruc alloc 1
+linstruc alloc avant 1
+linstruc alloc cr 1
+linstruc alloc est 1
+linstruc alloc ne 1
+linstruc alloc peut 1
+linstruc cal 1
+linstruc cal pr 1
+linstruc ch 1
+linstruc correspon 1
+linstruc correspon peut 1
+linstruc cour 1
+linstruc cr 1
+linstruc cr ee 1
+linstruc cut 1
+linstruc daccepter 1
+linstruc daccepter aus 1
+linstruc dalloc 1
+linstruc dalloc alloc 1
+linstruc dappel 1
+linstruc dappel est 1
+linstruc dappel non 1
+linstruc dappel termin 1
+linstruc dealloc 1
+linstruc dealloc ne 1
+linstruc dind 1
+linstruc dind switch 1
+linstruc echou 1
+linstruc est 1
+linstruc est bien 1
+linstruc est equiv 1
+linstruc est util 1
+linstruc eval 1
+linstruc eval sav 1
+linstruc eval vm 1
+linstruc execut 1
+linstruc execut doit 1
+linstruc ge 1
+linstruc ge nil 1
+linstruc ge structur 1
+linstruc ge valu 1
+linstruc lt 1
+linstruc lt vm 1
+linstruc neck 1
+linstruc neck ajout 1
+linstruc neck cr 1
+linstruc neck cut 1
+linstruc neck pour 1
+linstruc neck qu 1
+linstruc part 1
+linstruc part try 1
+linstruc point 1
+linstruc point ee 1
+linstruc postalloc 1
+linstruc pr 1
+linstruc pr eliminair 1
+linstruc prealloc 1
+linstruc prealloc calcl 1
+linstruc proceed 1
+linstruc prochain 1
+linstruc put 1
+linstruc put unsaf 1
+linstruc put valu 1
+linstruc qu 1
+linstruc qu suit 1
+linstruc r1 1
+linstruc r1 sur 1
+linstruc retr 1
+linstruc retr se 1
+linstruc sav cut 1
+linstruc se 1
+linstruc se comport 1
+linstruc standard 1
+linstruc standard put 1
+linstruc standard sauf 1
+linstruc suiv 1
+linstruc suiv dan 1
+linstruc suiv linstruc 1
+linstruc switch 1
+linstruc trust 1
+linstruc trust acc 1
+linstruc trust doit 1
+linstruc trust est 1
+linstruc trust par 1
+linstruc trust pour 1
+linstruc try 1
+linstruc try cr 1
+linstruc try sauv 1
+linstruc uclock 1
+linstruc unif 1
+linstruc unif valu 1
+linstruc unif var 1
+linsuff 1
+linsuff de 1
+linsuff de plac 1
+lint 5
+lint egr 1
+lint egr de 1
+lint er 3
+lint erieur 3
+lint erieur de 3
+lint erieur du 1
+lint erieur dun 1
+lint gral 1
+lint gral abstrait 1
+linterfac 1
+linterfac dunif 1
+linterfac dunif ext 1
+linterfac fourn 1
+linterfac fourn par 1
+linterfac ne 1
+linterfac ne suiv 1
+linterfac rep 1
+linterfac rep sur 1
+linterm 1
+linterm ediair 1
+linterm ediair de 1
+linterm ediair du 1
+linterm ediair dun 1
+linterpr 2
+linterpr etat 2
+linterpr etat de 1
+lintersect 1
+lintersect dun 1
+lintersect dun pol 1
+lintersect entr 1
+lintersect entr le 1
+linterv 2
+linterv de 2
+linterv de conf 1
+linterv de temp 1
+linterv don 1
+linterv dun 1
+linterv dun fonct 1
+linterv ent 1
+linterv entr 1
+linterv entr deux 1
+linterv i1 1
+linterv i2 1
+linterv i2 le 1
+lintroduc 4
+lintroduc dan 1
+lintroduc dan la 1
+lintroduc de 3
+lintroduc de deux 1
+lintroduc de drapeaux 1
+lintroduc de la 1
+lintroduc de laffect 1
+lintroduc de lalgorithm 1
+lintroduc de linformatiqu 1
+lintroduc de moy 1
+lintroduc de nouveaux 1
+lintroduc de tableaux 1
+lintroduc de tenseur 1
+lintroduc de variabl 1
+lintroduc dext 1
+lintroduc dext com 1
+lintroduc dinstruc 1
+lintroduc dinstruc suppl 1
+lintroduc du 1
+lintroduc du ph 1
+lintroduc dun 3
+lintroduc dun architectur 1
+lintroduc dun faux 1
+lintroduc dun instruc 1
+lintroduc dun nouveau 1
+lintroduc dun part 1
+lintroduc dun register 1
+lintroduc dun syst 1
+lintroduc dun tel 2
+linv 2
+linv de 2
+linv de cop 1
+linv de point 1
+linv de tout 1
+linv du 1
+linv du drapeau 1
+linv dun 1
+linv dun environ 1
+linv sur 1
+linv sur ecritur 1
+linver 4
+linver dan 1
+linver dan le 1
+linver de 2
+linver de la 1
+linver et du 1
+linver nous 1
+linver nous perm 1
+lionel 1
+lionel ni 1
+lionnel 1
+lionnel maug 1
+lionnel maug dept 1
+liou 1
+lioyd 1
+lioyd iter 1
+lip 2
+lip frensl61.bitnet 1
+lip lip.en 1
+lip lip.en lyon.fr 1
+lip.en 1
+lip.en lyon.fr 1
+lip89 1
+lipid 1
+lipid contain 1
+lipid contain complec 1
+liplaboratoir 1
+liplaboratoir de 1
+liplaboratoir de linformatiqu 1
+lipman 1
+lippman 5
+lipsc 1
+lipsc dintel 1
+lipt 5
+lipt and sandberg 1
+liquid 2
+liquid system 1
+lir 3
+lir dan 1
+lir dan lespac 1
+lir egularit 1
+lir et de 1
+lir et ma 1
+lir la 1
+lir la pag 1
+lir lestampil 1
+lir ou 1
+lir ou ecrir 1
+lir par 1
+lir pour 1
+lir pour dun 1
+lirm 1
+lisb 1
+lisbon 1
+lisent 1
+lisent pu 1
+lisent pu le 1
+liskov 3
+lism 1
+lism ecol 1
+lism ecol norm 1
+lisp 12
+lisp and funct 4
+lisp and prolog 1
+lisp and symbol 5
+lisp de 1
+lisp de linr 1
+lisp dialect 1
+lisp error 1
+lisp error system 1
+lisp format 1
+lisp funct 1
+lisp funct cal 1
+lisp implem 1
+lisp interpreter 1
+lisp lik langu 1
+lisp mach 2
+lisp me 1
+lisp me circl 1
+lisp object 1
+lisp object system 1
+lisp recur 1
+lisp recur oper 1
+lisp simpl 1
+lisp simpl vect 1
+lisp standard 1
+lisp system 1
+lisp th langu 1
+lisp tradit 1
+lisp typ 1
+lisp typ system 1
+lisp ver 1
+lisp vm 1
+lisp ymplem 1
+lisp ymplem cau.gmd.isst.vw 1
+lisp2 1
+lisp2 per 1
+lisp2 per object 1
+lisper 1
+lisper it.kth.se 1
+lissu 1
+lissu de 1
+lissu de ce 1
+lissu du 1
+lissu du partit 1
+list 80
+list a in 1
+list a number 1
+list a partitionner 1
+list a1 1
+list a1 partitit 1
+list a3 1
+list adm 1
+list adm distribut 1
+list after appl 1
+list al templ 1
+list and ar 1
+list and bod 1
+list and cop 1
+list and count 1
+list and disjoint 1
+list and incr 1
+list and prov 1
+list and return 2
+list and schedl 1
+list and select 1
+list and support 1
+list ar ap 1
+list ar distribut 1
+list ar remov 1
+list ar repr 1
+list ar said 1
+list ar simil 1
+list at post 1
+list begin 1
+list belong 2
+list bod 1
+list both algorithm 1
+list by decomp 1
+list can impl 1
+list cand 1
+list circulair 1
+list circulair de 1
+list cl 1
+list cl direct 1
+list cl slot 1
+list collect 1
+list collect el 1
+list compon 1
+list compon oper 1
+list compon us 1
+list compr 1
+list con 2
+list con nl 1
+list concat 1
+list congru 1
+list contain 4
+list contain id 1
+list contain list 1
+list control 1
+list control system 1
+list correspon 1
+list cover 1
+list creat 1
+list cur 1
+list dat 1
+list dat structur 1
+list de 3
+list de not 1
+list de param 1
+list de point 1
+list de propr 1
+list de register 1
+list def 1
+list delayboolean 1
+list delayboolean exp 1
+list denviron 1
+list dep 1
+list describ 2
+list dunif 1
+list dunif etendu 1
+list dx 1
+list dx dy 1
+list es 1
+list es ingr 1
+list explicit 1
+list for arg 1
+list for further 1
+list for templ 1
+list form 1
+list implem 1
+list in ap 1
+list in od 1
+list in order 1
+list in pol 1
+list in proct 1
+list in tabl 4
+list in theorem 1
+list in upd 1
+list incompat 1
+list incompat method 1
+list is assoc 1
+list is augm 1
+list is compl 1
+list is construc 1
+list is defin 1
+list is empt 2
+list is exhaust 1
+list is giv 1
+list is init 1
+list is learner 1
+list is pa 1
+list is stat 1
+list is termin 1
+list is upd 3
+list iter 1
+list j rest 1
+list level 1
+list list 1
+list maintain 1
+list manag 1
+list manag schem 1
+list manag techniqu 1
+list mean 1
+list member 1
+list ne 1
+list ne peut 1
+list neighbor 1
+list oe 1
+list oe0 1
+list of acknowledg 1
+list of acronym 1
+list of act 1
+list of ad 1
+list of adequ 1
+list of altern 2
+list of appl 1
+list of argum 1
+list of assoc 1
+list of atom 1
+list of block 1
+list of candid 1
+list of chunk 1
+list of cl 1
+list of claus 1
+list of combin 1
+list of compon 1
+list of consider 1
+list of desider 1
+list of direct 1
+list of directiv 1
+list of el 1
+list of exact 1
+list of exampl 1
+list of favourit 1
+list of fe 1
+list of figur 1
+list of form 1
+list of fr 1
+list of high 1
+list of id 1
+list of identif 1
+list of inherit 1
+list of init 1
+list of integer 2
+list of interfac 1
+list of iter 1
+list of job 1
+list of keyword 1
+list of length 1
+list of lower 1
+list of me 1
+list of method 1
+list of modl 1
+list of nam 2
+list of nearest 1
+list of neighbor 1
+list of nod 3
+list of number 1
+list of obsol 1
+list of opt 1
+list of pag 1
+list of path 1
+list of point 1
+list of pot 2
+list of problem 2
+list of proc 1
+list of prun 1
+list of refer 2
+list of rl 1
+list of sign 1
+list of slav 1
+list of slot 1
+list of solut 1
+list of sourc 1
+list of stud 1
+list of synonym 1
+list of tabl 1
+list of techn 1
+list of test 1
+list of transact 1
+list of user 1
+list of var 1
+list of variabl 2
+list of word 1
+list offer 1
+list onl axiom 1
+list or l 1
+list or structur 2
+list order 1
+list ou 1
+list ou structur 1
+list par 1
+list par dichotom 1
+list pi 1
+list pr 1
+list produc 1
+list publ 1
+list remain 1
+list remain separ 1
+list result 1
+list return 1
+list s implem 1
+list schedl 1
+list schedl approach 1
+list schedl method 1
+list sen 1
+list sen mail 1
+list sever closur 1
+list simpl 1
+list simpl list 1
+list sont 1
+list sont aus 1
+list ss 1
+list stat 2
+list stat measur 1
+list structur 2
+list succ 1
+list succ fe 1
+list succeed 1
+list support 1
+list support mov 1
+list syntac 1
+list t ar 1
+list tak 1
+list tel 1
+list tel condit 1
+list term 1
+list th aver 3
+list th conclus 1
+list th dat 1
+list th definit 1
+list th execut 1
+list th fe 1
+list th latter 1
+list th parallel 1
+list th peer 1
+list th perform 1
+list th procedur 1
+list th refin 1
+list th variabl 1
+list that allow 1
+list that describ 1
+list that map 1
+list to detect 1
+list to order 1
+list tr 1
+list tr list 1
+list unus 1
+list using 2
+list valu 1
+list vid 1
+list wh 1
+list wh el 1
+list which contain 1
+list which support 1
+list wid 1
+list with assoc 1
+list with construc 1
+list would wid 1
+list writ 1
+list x1 1
+list.ap 1
+list.clear 1
+list1 1
+listener 2
+listener is superior 1
+listener know 1
+listener understand 1
+listexhaust 1
+listexhaust and cl 1
+lit 6
+lit accompl 1
+lit av 1
+lit av stddev 1
+lit bp 1
+lit can pot 1
+lit cr 1
+lit er 2
+lit er de 1
+lit erat 2
+lit erat suiv 1
+lit erateur 1
+lit for dynam 1
+lit for network 1
+lit for stat 1
+lit model 1
+lit network 1
+lit network accompl 1
+lit prov 1
+lit ral 1
+lit ral le 1
+lit redesign 1
+lit strateg 1
+lit structur 1
+lit structur reflect 1
+lit support 1
+lit support gener 1
+lit transform 1
+lit with assoc 1
+liter 41
+liter account 1
+liter and seem 1
+liter asc 1
+liter asc lin 1
+liter asser 1
+liter asser del 1
+liter befor discard 1
+liter concern 1
+liter const 1
+liter demonstr 1
+liter dpl 1
+liter dpl maxscor 1
+liter expr 1
+liter for bandwidth 1
+liter in claus 1
+liter in common 1
+liter in order 1
+liter is assoc 1
+liter is avail 1
+liter lingu 1
+liter lingu comput 1
+liter mak 1
+liter mak us 1
+liter mean 1
+liter mean stder 1
+liter object 1
+liter object liter 1
+liter occur 1
+liter on group 1
+liter on integr 1
+liter on typ 1
+liter recognit 1
+liter report 1
+liter report stud 1
+liter rl 1
+liter sect 1
+liter shar 1
+liter simplif 1
+liter siz 1
+liter siz av 1
+liter stop 1
+liter surv 1
+liter surv refer 1
+liter tac 1
+liter tac account 1
+liter that deal 1
+liter that demonstr 1
+liter to describ 1
+liter to eff 1
+liter to model 1
+liter to resolut 1
+liter to show 1
+liter usu bear 1
+liter wh argum 1
+liter which show 1
+liter x occur 1
+liter xi 1
+liter.y 1
+liter.y precc 1
+liter.y precc specif 1
+litp 2
+litp rxf 1
+litzkow 1
+liu 11
+liu ext 1
+liu xiaop 1
+liv 11
+liv by perform 1
+liv contact 1
+liv illustr 1
+liv in el 1
+liv loop 1
+liv loop degrad 1
+liv loop sever 1
+liv research 1
+liv valu 1
+liv89 1
+livelock 1
+livelock th appl 1
+liver.bup 1
+liver.bup pim 1
+liver.bup pim ind 1
+livermor 1
+livermor do i1 1
+livermor kernel 1
+liverpool 1
+livingst 1
+livingst tower 1
+livn 2
+livr 1
+livr de 1
+livr de boizumault 1
+livr de hogger 1
+livr de lloyd 1
+livr de sterl 1
+lizuk 1
+lj 8
+lj aej 1
+lj aej cj 1
+lj aej smj 1
+lj aj 1
+lj aj ln 1
+lj and init 1
+lj and st 1
+lj and ui 1
+lj fn 1
+lj fn li 1
+lj g fm 1
+lj ij 1
+lj ij uj 1
+lj l lj 1
+lj level 1
+lj level lj 1
+lj li 1
+lj li lj 1
+lj lj 1
+lj lj aej 1
+lj log 1
+lj log lj 1
+lj log log 1
+lj ne 1
+lj ne font 1
+lj receiv 1
+lj subtransact 1
+lj subtransact guar 1
+lj then nod 1
+lj then sit 1
+lj to compl 1
+lj to nod 1
+lj uj 1
+lj1 1
+lj1 to uj1 1
+lj2 1
+lj2 to uj2 1
+ljaej 1
+ljaej cj 1
+ljubljan 1
+ljung 1
+ljx 1
+ljx xg 1
+lk 4
+lk ae 1
+lk ae mac 1
+lk ak 1
+lk denot 1
+lk ik 1
+lk ik uk 1
+lk or uk 1
+lk w fi 1
+lkir 1
+ll 6
+ll in span 1
+ll us 1
+ll1 1
+ll1 ar del 1
+ll2 1
+ll3 1
+ll4 1
+ll5 1
+ll6 1
+ll7 1
+ll85 1
+llb 1
+llb method 1
+llb ran 1
+llenguatg 1
+llenguatg i sistem 1
+llj 1
+llk18 1
+llm88 1
+llnc 1
+llnc styl 1
+lloc 1
+lloc of fragm 1
+lloyd 5
+lltimeparttimesalarynam 1
+lm 6
+lm and rm 1
+lm lmac 1
+lm1 1
+lm1 km2 1
+lmac 2
+lmac ae 1
+lmac ae lj 1
+lmac ae ljaej 1
+lmac aej 1
+lmac aej li 1
+lmac mac 1
+lmac r li 1
+lmac th maxim 1
+lmac trunc 1
+lmin 2
+lmin min 1
+lmj 1
+lmj uj 1
+lmr 1
+ln 12
+ln aen 1
+ln ar liter 1
+ln comp 1
+ln oe 1
+ln prfx 1
+ln with pi 1
+ln2 2
+lnc 17
+lnw 1
+lo 66
+lo a resolver 1
+lo alam 4
+lo alam nat 1
+lo alt 8
+lo amount 1
+lo and behold 1
+lo and learn 1
+lo and mach 1
+lo angel 3
+lo angel tim 1
+lo any deriv 1
+lo any gener 1
+lo as seen 1
+lo bound 1
+lo character 1
+lo compl 1
+lo connect 1
+lo coupl 3
+lo coupl multiproc 2
+lo de 2
+lo de grand 1
+lo de probabilit 1
+lo detect 1
+lo dist 1
+lo du 1
+lo entrop 1
+lo entrop coder 1
+lo est 1
+lo est de 1
+lo est un 1
+lo gaus 1
+lo gaus aux 1
+lo gaus ba 1
+lo hop 1
+lo imag 1
+lo imag dat 1
+lo in accur 1
+lo in nw 1
+lo in runtim 1
+lo is du 1
+lo it eff 1
+lo me 1
+lo of cap 1
+lo of commun 1
+lo of con 1
+lo of concur 1
+lo of continu 1
+lo of cool 1
+lo of eff 1
+lo of gener 21
+lo of inform 1
+lo of lin 1
+lo of me 1
+lo of parallel 1
+lo of prec 1
+lo or dupl 1
+lo pourrait 1
+lo pourrait ain 1
+lo prec 2
+lo prob 1
+lo probabil 1
+lo rat 1
+lo ri 1
+lo ri colleg 1
+lo slight 1
+lo som incom 1
+lo spac 1
+lo synchron 1
+lo synchron algorithm 1
+lo tag 1
+lo tag architectur 1
+lo text 1
+lo text compr 1
+lo th benefit 1
+lo their mutu 1
+lo track 1
+lo. 1
+lo87 1
+lo93 1
+load 34
+load a heav 1
+load acc 1
+load acc stal 1
+load among proc 1
+load and cap 1
+load and mod 1
+load and modif 1
+load and network 1
+load and rout 2
+load and st 2
+load and therefor 2
+load ar calcl 1
+load at boot 1
+load at proc 1
+load bal 11
+load bal achief 1
+load bal algorithm 2
+load bal consider 1
+load bal correct 1
+load bal du 1
+load bal key 1
+load bal load 1
+load bal map 1
+load bal method 1
+load bal prior 1
+load bal reduc 1
+load bal rout 1
+load bal stat 1
+load bal techniqu 1
+load being inject 1
+load caus 1
+load caus signif 1
+load coin 1
+load coin wh 1
+load condit 1
+load control 1
+load dat 2
+load dat bal 1
+load del 1
+load del tok 1
+load disk 1
+load disk arm 1
+load du 1
+load for exbf 1
+load for softwar 1
+load forecast 1
+load from memor 1
+load graph 1
+load hi solut 1
+load host 1
+load imb 3
+load imb incr 1
+load imb lim 1
+load imp 1
+load increm 1
+load instruc 1
+load instruc tak 1
+load introduc 1
+load is bal 1
+load is du 1
+load is ev 1
+load mach 1
+load manager 1
+load may byp 1
+load may chang 1
+load microcod 1
+load monit 1
+load monit system 1
+load on 1
+load on network 1
+load on timeshar 1
+load oper 3
+load opt 1
+load or st 1
+load pr 1
+load qx 1
+load rang 1
+load reduc 1
+load refer 1
+load regl 1
+load regl benchmark 1
+load request 1
+load shar 1
+load st 1
+load stand 1
+load term 1
+load th dat 1
+load th test 1
+load th tupl 1
+load to compl 1
+load to completecycl 1
+load to en 1
+load to light 1
+load upsurg 1
+load valu 1
+load var 1
+load var behavior 1
+load var incr 1
+load versus tim 1
+load vs 1
+load vs tim 1
+load wa light 1
+loadb 2
+loadb system 1
+loadb techniqu 1
+loader 1
+loader connect 1
+loader for stand 1
+loadermonitorssymbol 1
+loadermonitorssymbol serverm 1
+loadermonitorssymbol serverm pa 1
+lobj 4
+lobj de 2
+lobj de ce 1
+lobj de la 1
+lobj de transform 1
+lobj du 1
+lobj du chapitr 1
+lobj dun 1
+lobj pour 1
+lobj pour munin 1
+lobj recherch 1
+lobj rel 1
+lobj rel le 1
+lobjectif 3
+lobjectif de 2
+lobjectif de ce 1
+lobjectif de lag 1
+lobjectif de op 1
+lobjectif de paragraph 1
+lobjectif dun 1
+lobjectif dun agc 1
+lobjectif princip 1
+lobjectif princip de 1
+lobjectif vi 1
+lobserv 2
+lobserv essentiel 1
+lobserv essentiel est 1
+lobserv qu 2
+lobt 1
+lobt de 1
+lobt de boucl 1
+lobt de ce 1
+lobt de forml 1
+lobt dun 1
+lobt dun bon 1
+loc 92
+loc a ba 1
+loc a cal 1
+loc a la 1
+loc a lappel 1
+loc acc 2
+loc acr sit 1
+loc actu 1
+loc actu tak 1
+loc ad 1
+loc ad queu 1
+loc addr 3
+loc addr spac 1
+loc administer 1
+loc after weaker 1
+loc agr 1
+loc al loc 1
+loc algorithm 2
+loc algorithm therefor 1
+loc alignm 1
+loc alignm search 1
+loc an individu 1
+loc ancestr 1
+loc ancestr ar 1
+loc and dec 1
+loc and detect 1
+loc and glob 1
+loc and i.loc 1
+loc and introduc 1
+loc and metropolitan 1
+loc and nextloc 1
+loc and parallel 1
+loc and plac 1
+loc and rel 1
+loc and reus 1
+loc and rev 1
+loc and thus 1
+loc and user 1
+loc ao 1
+loc ao register 1
+loc appar 1
+loc appar dan 1
+loc appl 1
+loc approach 1
+loc ar 5
+loc ar ad 1
+loc ar environm 1
+loc ar network 5
+loc ar st 1
+loc ar sum 1
+loc ar tak 1
+loc as text 1
+loc ascertain 1
+loc assoc 1
+loc at addr 1
+loc aux 2
+loc aux processeur 1
+loc avec 1
+loc avec un 1
+loc be tr 1
+loc becom 1
+loc becom fundam 1
+loc being correct 1
+loc best edg 1
+loc better compar 1
+loc better ls 1
+loc bind 1
+loc block 1
+loc block list 1
+loc both object 1
+loc both return 1
+loc cap 1
+loc capabil 1
+loc chang 2
+loc chang cod 1
+loc chang oper 1
+loc cl 2
+loc cl libr 1
+loc cl oper 1
+loc classif 1
+loc classiqu 1
+loc com 1
+loc com op 1
+loc commun 1
+loc compact 1
+loc comparison 1
+loc comput 4
+loc comput interleav 1
+loc comput step 1
+loc computer 1
+loc computer network 1
+loc concav 1
+loc concav mesh 1
+loc confid 1
+loc confid valu 1
+loc connect 1
+loc connect attempt 1
+loc connect request 1
+loc constraint 1
+loc constraint hierarc 1
+loc contain 1
+loc control 1
+loc control using 1
+loc cop 4
+loc cop execut 1
+loc cop upd 1
+loc cop variabl 1
+loc correct 1
+loc correct abstract 1
+loc correct w.r.t 1
+loc correspon 1
+loc correspon aux 1
+loc corrobor 1
+loc cost 1
+loc counter 1
+loc cycl 1
+loc cycl ctr 1
+loc cycl tot 1
+loc dan 2
+loc dan la 1
+loc dat 7
+loc dat acc 1
+loc dat incr 1
+loc dat se 1
+loc dat spac 1
+loc de 2
+loc de argum 1
+loc de ce 1
+loc de chaqu 1
+loc de conflit 1
+loc de diff 1
+loc de don 1
+loc de eff 1
+loc de la 1
+loc de processeur 1
+loc dec 2
+loc dec ba 1
+loc dec combin 1
+loc dec mad 1
+loc dec monit 1
+loc dec schem 1
+loc dec techniqu 1
+loc dec unit 1
+loc decl 1
+loc def 1
+loc defin 1
+loc defin bind 1
+loc definit 1
+loc del 1
+loc del character 1
+loc dent 1
+loc denzym 1
+loc detect 1
+loc diaryloc 1
+loc diaryloc client 1
+loc direct 1
+loc direct entr 1
+loc direct master 1
+loc disk 1
+loc don 1
+loc don es 1
+loc driv 1
+loc driv strateg 1
+loc du 1
+loc du processeur 1
+loc duquel 1
+loc duquel la 1
+loc e loc 1
+loc ee 1
+loc ee sur 1
+loc el 1
+loc energ 1
+loc energ minim 1
+loc ent 1
+loc entr 1
+loc environm 1
+loc error 1
+loc error minim 1
+loc es 1
+loc est 3
+loc est cycliqu 1
+loc est de 1
+loc est maintenu 1
+loc est pour 1
+loc est rempl 1
+loc est suff 1
+loc est tir 1
+loc est util 1
+loc et cach 1
+loc et coupur 1
+loc et du 1
+loc et glob 1
+loc et la 1
+loc et le 1
+loc et par 1
+loc et pil 1
+loc exact 1
+loc exit 1
+loc exit form 1
+loc exit occur 1
+loc exper 1
+loc explicit 1
+loc expr 2
+loc fl 1
+loc fl se 1
+loc flag 1
+loc for plac 1
+loc for ukc 1
+loc form 1
+loc fut 1
+loc fut un 1
+loc giv 1
+loc giv conflict 1
+loc greed 1
+loc greed heur 1
+loc hardwar 1
+loc hardwar tabl 1
+loc hold 1
+loc host 1
+loc hypoth 1
+loc if good 1
+loc iff 1
+loc imag 1
+loc imag reg 1
+loc improv 1
+loc improv algorithm 1
+loc improv heur 1
+loc improv step 1
+loc in a5 1
+loc in direct 1
+loc in memor 1
+loc in order 1
+loc in pag 1
+loc in prior 1
+loc in quest 1
+loc in separ 1
+loc in spac 1
+loc in term 1
+loc ind 1
+loc indep 2
+loc indep allow 1
+loc indep network 1
+loc indep nod 1
+loc indep se 1
+loc indep shar 1
+loc indep transform 1
+loc indep ver 1
+loc inform 4
+loc inform avail 1
+loc interfac 1
+loc introduit 1
+loc introduit par 1
+loc is establ 1
+loc is exhaust 1
+loc is overconfid 1
+loc is repr 1
+loc is return 1
+loc is us 1
+loc is writ 1
+loc issu 1
+loc knowledg 1
+loc knowledg distribut 1
+loc l est 1
+loc l mac 1
+loc le 1
+loc le calcl 1
+loc le el 1
+loc learner 1
+loc learner profil 1
+loc level 1
+loc level compar 1
+loc link 1
+loc link cost 1
+loc list 1
+loc load 1
+loc load bal 1
+loc loc 1
+loc loc request 1
+loc locationentr 1
+loc locationentr le 1
+loc lor 1
+loc lor de 1
+loc m 2k 1
+loc ma 1
+loc major 1
+loc major column 1
+loc match 1
+loc match return 1
+loc maxim 1
+loc may conflict 1
+loc may tak 1
+loc mean 1
+loc measur 1
+loc mechan 1
+loc mechan empl 1
+loc memor 13
+loc memor bank 1
+loc memor con 1
+loc memor contain 1
+loc memor loc 1
+loc memor lp 1
+loc memor manag 1
+loc merg 1
+loc might allow 1
+loc minim 5
+loc minim con 1
+loc minim partit 1
+loc minim point 1
+loc model 2
+loc model describ 2
+loc mov 1
+loc mutu 1
+loc mutu recur 1
+loc nam 1
+loc natur 2
+loc ne 1
+loc ne peut 1
+loc neighbor 1
+loc neighbor search 1
+loc nest 1
+loc network 1
+loc neur 1
+loc neur network 1
+loc nod 5
+loc nod edg 1
+loc nod param 1
+loc nod se 1
+loc nod skip 1
+loc not return 1
+loc object 2
+loc object search 1
+loc of acc 1
+loc of docum 1
+loc of environm 1
+loc of equ 1
+loc of equid 1
+loc of fil 1
+loc of point 1
+loc of refer 1
+loc of secon 1
+loc of typ 1
+loc oft refer 2
+loc on 1
+loc on cur 1
+loc on disk 1
+loc on pal 1
+loc on shar 1
+loc oper 4
+loc oper receiv 1
+loc oper return 1
+loc optim 3
+loc optim algorithm 3
+loc optim solut 1
+loc optim tr 1
+loc or import 1
+loc or suppl 1
+loc pack 2
+loc pack technolog 2
+loc par 2
+loc par un 1
+loc parallel 1
+loc paramter 1
+loc paramter using 1
+loc part 3
+loc part pertain 1
+loc part result 1
+loc part vi 1
+loc particl 1
+loc pb 1
+loc perceiv 1
+loc person 1
+loc person computer 1
+loc peut 1
+loc peut navoir 1
+loc po 1
+loc po ed 1
+loc point 2
+loc pol 1
+loc pol loc 1
+loc pol.list.first 1
+loc pol.list.next 1
+loc pol.threshold 1
+loc pour 1
+loc pour le 1
+loc pr 1
+loc pr ident 1
+loc pr prm 1
+loc pr queu 1
+loc principl 1
+loc proc 6
+loc proc cost 1
+loc proc number 1
+loc proc tim 1
+loc proc timeserver 1
+loc proc timetimetim 1
+loc produc 1
+loc program 1
+loc prolog 1
+loc propag 2
+loc propag algorithm 1
+loc propag constraint 1
+loc propag gradu 1
+loc propag handl 1
+loc propag satisf 1
+loc propag schem 1
+loc propag tak 1
+loc propag therein 1
+loc proper 1
+loc qout 1
+loc qu 1
+loc qu agit 1
+loc queu 2
+loc queu acc 1
+loc queu st 1
+loc queu tr 1
+loc queu vouch 1
+loc queu.clear 1
+loc queu.empt 1
+loc queu.first 1
+loc queu.inser 1
+loc queu.next 1
+loc queu.remov 1
+loc r esult 1
+loc read 1
+loc refin 1
+loc refin heur 1
+loc register 2
+loc rel 2
+loc rel de 1
+loc remot 1
+loc remot architectur 1
+loc repr 2
+loc repr return 1
+loc requ 1
+loc request 2
+loc requir 2
+loc requir cooper 1
+loc requir pr 1
+loc resembl 1
+loc result 2
+loc result vect 1
+loc result y1 1
+loc retransm 1
+loc return 1
+loc return multipl 1
+loc rout 1
+loc rout compon 1
+loc rout tabl 1
+loc san pour 1
+loc satisf 2
+loc satisf rb 1
+loc schem 1
+loc se 3
+loc se comport 1
+loc se pr 1
+loc search 3
+loc search algorithm 1
+loc search ba 1
+loc search problem 1
+loc search proc 1
+loc search techniqu 2
+loc seffectu 1
+loc seffectu com 1
+loc select 1
+loc select rl 1
+loc serv 2
+loc should attempt 1
+loc shunt 1
+loc simultan 2
+loc simultan constraint 1
+loc sink 1
+loc sit 1
+loc sit identif 1
+loc slot 1
+loc slot descript 1
+loc smallest 1
+loc smallest el 1
+loc soft 1
+loc soft classif 1
+loc soft dec 1
+loc softwar 1
+loc soit 1
+loc soit quil 1
+loc somewh 1
+loc sont 2
+loc sont de 1
+loc sont donc 1
+loc sont typiqu 1
+loc sort 1
+loc sort el 1
+loc sourc 1
+loc spac 2
+loc specif 1
+loc specif dat 1
+loc specif inform 1
+loc specif modl 1
+loc specif part 1
+loc specif text 1
+loc split 1
+loc split algorithm 1
+loc split ph 1
+loc st 4
+loc st pointer 1
+loc st spac 1
+loc stat 2
+loc stat nod 1
+loc strateg 1
+loc strateg dep 1
+loc such bug 1
+loc suggest 1
+loc suit 1
+loc suit experim 1
+loc supprim 1
+loc supprim le 1
+loc sur 1
+loc sur de 1
+loc system 1
+loc system avail 1
+loc system develop 1
+loc system inf 1
+loc system us 1
+loc task 1
+loc templ 1
+loc templ descript 1
+loc temporair 1
+loc test 1
+loc th actu 1
+loc th cach 1
+loc th compon 1
+loc th disk 1
+loc th label 1
+loc th record 1
+loc th scop 1
+loc th se 1
+loc th valu 1
+loc than simp 1
+loc that def 1
+loc theor 1
+loc tim 1
+loc timestamp 1
+loc to appear 1
+loc to comput 1
+loc to dat 1
+loc to deal 1
+loc to loc 1
+loc to particl 1
+loc to proc 1
+loc to read 1
+loc to return 1
+loc to select 1
+loc topolog 1
+loc topolog link 1
+loc topolog tabl 1
+loc traff 2
+loc traff model 2
+loc traff pattern 2
+loc turn 1
+loc unambigu 1
+loc upd 1
+loc upd exp 1
+loc using 1
+loc using loc 1
+loc util 1
+loc valu 3
+loc valu dispar 1
+loc var 3
+loc var xp 1
+loc variabl 3
+loc vect 2
+loc vect vect 1
+loc ver 2
+loc ver test 1
+loc ver un 1
+loc vi po 1
+loc vot 1
+loc vot propag 1
+loc vouch 1
+loc vouch loc 1
+loc wa found 1
+loc window 1
+loc with object 1
+loc within parallel 1
+loc www 1
+loc www server 1
+loc xnet 1
+loc.contain 1
+loc1 1
+localcut 1
+localfeatur 1
+localfeatur foc 1
+localfeatur foc method 1
+localiser 2
+localiser ce 1
+localiser ce dern 1
+localiser le 1
+localiser le conflit 1
+localiser lensembl 1
+localit 2
+localit e ain 1
+localit e au 1
+localit e avec 1
+localit e ce 1
+localit e dacc 1
+localit e dan 1
+localit e de 2
+localit e doiv 1
+localit e du 2
+localit e import 1
+localit e ne 1
+localit e nest 1
+localit e par 1
+localit e pren 1
+localit e princip 1
+localit e qu 1
+localit e s2 1
+localit e sont 1
+localit e spat 1
+localit e sur 1
+localit e temporel 1
+localiz 1
+localiz th enforc 1
+locallyoptimaltr 1
+localnam 1
+localsearch 1
+localsearch method 1
+locateresult 1
+locationentr 1
+locationentr le 1
+locationentr le loc 1
+locationentr structur 1
+locationentr structur contain 1
+locationindep 1
+locationindep nod 1
+locationindep regard 1
+locatorfailur 1
+locaux 2
+locaux afin 1
+locaux afin de 1
+locaux de 1
+locaux de tail 1
+locaux en 1
+locaux modif 1
+locaux modif es 1
+locaux r1 1
+locc 2
+locc de 1
+locc de revenir 1
+locc de souligner 1
+locc dun 1
+locc dun retour 1
+loccur 4
+loccur d ev 1
+loccur de 3
+loccur de celu 1
+loccur de etat 1
+loccur de fauxpart 1
+loccur de la 1
+loccur de tel 2
+loccur dit 1
+loccur dit erat 1
+loccur dun 2
+loccur dun eff 1
+loccur dun test 1
+loccur le 1
+loccur le transl 1
+loccur mal 1
+lock 12
+lock 1s 1
+lock 1s acquir 1
+lock a lock 1
+lock acquir 1
+lock actu 1
+lock altern 1
+lock and bar 1
+lock and def 1
+lock and degr 1
+lock and part 2
+lock and unlock 1
+lock ar compat 1
+lock ar held 1
+lock ar lock 1
+lock ar retain 1
+lock ar serv 1
+lock at li 1
+lock ba 1
+lock becom 1
+lock becom unlock 1
+lock befor com 1
+lock can gain 1
+lock can result 1
+lock chang 1
+lock chang owner 1
+lock cl 1
+lock command 1
+lock command inclus 1
+lock command traff 1
+lock dat 1
+lock dat transfer 1
+lock definit 1
+lock design 1
+lock dur rollback 1
+lock dx 1
+lock dx dy 1
+lock evalu 1
+lock for concur 1
+lock funct 1
+lock held 1
+lock involut 1
+lock involut enforc 1
+lock is defin 1
+lock is implicit 1
+lock is lock 1
+lock is rel 1
+lock is satisfact 1
+lock lock 1
+lock manager 1
+lock manager log 1
+lock may continu 1
+lock mod 1
+lock mod conflict 1
+lock monit 1
+lock monit algorithm 1
+lock must guar 1
+lock must observ 1
+lock nl 1
+lock nl number 1
+lock number 1
+lock number integer 1
+lock of agent 1
+lock on ind 1
+lock oper 1
+lock or unlock 1
+lock ownership 1
+lock perm 1
+lock perm restrict 1
+lock procedur 1
+lock protocol 1
+lock remot 1
+lock remot dat 1
+lock request 1
+lock request becom 1
+lock request command 1
+lock request peer 1
+lock requir 1
+lock respect 1
+lock st 1
+lock st variabl 1
+lock step 1
+lock suppl 1
+lock tabl 1
+lock techniqu 1
+lock th object 1
+lock that minim 1
+lock to av 1
+lock to contain 1
+lock to protect 1
+lock until regp 1
+lock until subtransact 1
+lock using 1
+lock using swap 1
+lock wil caus 1
+lockhasht 1
+lockj 1
+lockj held 1
+lockj might remain 1
+lockp 1
+lockp funct 1
+lockschain 1
+lockschain objlink 1
+lockschain objlink txlink 1
+locomot 1
+locomot in biolog 1
+locqueu.remov 1
+locusrout 1
+locusrout being shar 1
+loeuvr 1
+loeuvr qu 1
+loeuvr qu dun 1
+log 84
+log 2l 1
+log 2l ni 1
+log abstract 1
+log acknowledg 1
+log adjac 1
+log adjac nod 1
+log ai 1
+log ai ai 1
+log algorithm 1
+log and appl 1
+log and cach 2
+log and comput 1
+log and computer 1
+log and constraint 1
+log and dempstershafer 1
+log and direct 2
+log and funct 1
+log and kripk 1
+log and lock 1
+log and log 1
+log and maudelog 1
+log and proof 1
+log and prov 1
+log and simpl 1
+log and thus 1
+log and using 1
+log approach 1
+log approxim 1
+log approxim se 1
+log ar client 1
+log ar defin 1
+log ar kept 1
+log ar read 1
+log as clr 1
+log as incompl 1
+log as ind 1
+log as oper 1
+log as part 1
+log as tempur 1
+log axiom 2
+log axiom bear 1
+log ba 8
+log ba calculus 1
+log ba knowledg 2
+log ba langu 1
+log ba mitig 2
+log ba model 1
+log ba object 1
+log ba receiver 1
+log ba retrief 1
+log ba st 1
+log back 1
+log back multipl 1
+log back perform 1
+log bar 1
+log by record 1
+log by st 1
+log can model 1
+log car 1
+log car ec 1
+log clogn 1
+log cluster 3
+log collap 1
+log compact 1
+log compact problem 1
+log composit 1
+log composit graph 1
+log con 1
+log concur 1
+log concur object 1
+log configur 1
+log conjunct 1
+log connectiv 3
+log consequ 3
+log constraint 1
+log constraint commun 1
+log contain 2
+log cost 1
+log custom 1
+log dat 2
+log dat segm 1
+log dat st 1
+log datab 1
+log deduc 1
+log deduc proc 1
+log def 1
+log def io 1
+log denot 1
+log designer 2
+log designer encounter 1
+log dev 1
+log disk 1
+log dm 1
+log dm io 1
+log du 1
+log emerg 1
+log en 1
+log en dep 1
+log en found 1
+log en inform 1
+log en loc 1
+log entailm 1
+log entailm rel 1
+log equ 1
+log es 1
+log exampl 1
+log expr 1
+log ext 1
+log facil 1
+log fd 1
+log fd connectiv 1
+log featur 1
+log featur confound 1
+log ffiij 1
+log fil 2
+log fil contain 1
+log for 2
+log for autom 2
+log for commun 1
+log for mlr 1
+log for mut 1
+log for nest 1
+log for oper 1
+log for problem 2
+log for program 2
+log for reason 1
+log for subtransact 1
+log for transact 1
+log forml 2
+log forml rel 1
+log forml using 1
+log found 1
+log fr 1
+log fr spac 1
+log funct 5
+log funct appl 1
+log funct langu 1
+log funct program 1
+log ge 1
+log ge rid 1
+log graph 1
+log group 2
+log ha rich 1
+log ident 1
+log identif 1
+log implem 1
+log in computer 4
+log in order 1
+log inclus 1
+log incr 1
+log infer 1
+log inherit 1
+log inherit comput 1
+log inst 1
+log interfac 1
+log io 1
+log io cost 1
+log io del 1
+log io dev 1
+log is combin 1
+log is compl 1
+log is consider 1
+log is effect 1
+log is empl 1
+log is forc 1
+log is glob 1
+log is incompl 1
+log is larg 1
+log is np 1
+log is rel 1
+log is repl 1
+log is repr 1
+log is st 1
+log is undec 1
+log justif 1
+log k ph 1
+log k0e2 1
+log k0e2 2blogn 1
+log k0n 1
+log k0n n0k 1
+log k0nn0k 1
+log l incr 1
+log l log 1
+log langu 9
+log langu ba 1
+log langu babel 1
+log langu int 1
+log lj 1
+log log 3
+log log lj 1
+log log log 1
+log log mc 1
+log log multiplec 1
+log log plot 1
+log log proper 1
+log m bit 1
+log m div 1
+log m level 1
+log m log 1
+log m tim 1
+log maintain 1
+log manag 1
+log manag pol 1
+log manager 1
+log mc 1
+log mechan 1
+log med 1
+log method 1
+log minfm 1
+log ml 1
+log mn 1
+log mn logn 1
+log model 1
+log model int 1
+log modl 1
+log multiplec 1
+log n bit 3
+log n contain 1
+log n differ 1
+log n ev 1
+log n fragm 1
+log n hybrid 1
+log n iter 1
+log n level 1
+log n log 4
+log n minfk 1
+log n pair 2
+log n ph 1
+log n st 1
+log n wh 1
+log n2 1
+log nam 1
+log neighbor 1
+log ng 1
+log ni 1
+log nlog 1
+log np 1
+log number 1
+log object 1
+log object approach 1
+log occur 1
+log of act 1
+log of el 1
+log of imper 1
+log of mlp 1
+log of procedur 1
+log of program 1
+log of sc 1
+log of st 1
+log of tempor 1
+log of tim 2
+log omnisc 1
+log op 1
+log oper 4
+log oper sem 1
+log opt 1
+log overhead 4
+log p log 1
+log p var 1
+log paradigm 1
+log parameter 1
+log pe 1
+log perm 1
+log phenom 1
+log plot 1
+log point 1
+log port 1
+log posit 1
+log proc 3
+log proc spac 1
+log program 16
+log program approach 1
+log program architectur 1
+log program ba 3
+log program commun 1
+log program con 1
+log program confer91 1
+log program construc 1
+log program execut 2
+log program framework 2
+log program implem 1
+log program langu 9
+log program lloyd 1
+log program machin 1
+log program mechan 1
+log program model 1
+log program object 1
+log program offer 1
+log program paradigm 2
+log program program 1
+log program purp 1
+log program rel 1
+log program schem 1
+log program select 1
+log program ser 2
+log program spreadsh 1
+log program summer 1
+log program synth 1
+log program system 4
+log program techniqu 1
+log program theor 1
+log program tool 1
+log program using 2
+log program workshop 1
+log program85 2
+log program90 1
+log proper 2
+log protocol 1
+log prov 1
+log qu 1
+log qu program 1
+log record 3
+log record describ 1
+log record encounter 1
+log record keep 1
+log record pair 1
+log reduc 1
+log refer 1
+log regard 1
+log regard proposit 1
+log rel 2
+log rel dat 1
+log remain 1
+log remain simil 1
+log repl 1
+log requir 1
+log respon 1
+log restrict 1
+log rl 1
+log rl list 1
+log s4 1
+log scal 2
+log scan 1
+log secur 1
+log sem 2
+log separ 1
+log sequ 1
+log sequ number 1
+log serv 1
+log serv ch 1
+log serv gener 1
+log serv start 1
+log server 2
+log sound 1
+log st 2
+log st chang 1
+log st med 1
+log st unit 1
+log stem 1
+log strateg 1
+log structur 3
+log structur fil 1
+log symbol 1
+log tak 1
+log tak pa 1
+log test 1
+log test pr 1
+log test succeed 1
+log th langu 1
+log th proof 1
+log th valu 2
+log theor 2
+log theor lead 1
+log to comput 1
+log to optim 1
+log to repl 1
+log to repr 1
+log to st 1
+log to und 1
+log to writ 1
+log tool 2
+log tool satisf 1
+log track 1
+log track en 1
+log transact 1
+log transact manager 1
+log transl 1
+log treat 1
+log und 1
+log und progr 1
+log und recov 1
+log undesir 1
+log undesir gap 1
+log unsuit 1
+log us 1
+log valu 1
+log var 1
+log variabl 2
+log view 1
+log view belong 1
+log view interfac 1
+log view object 1
+log view transfer 1
+log w.r.t 1
+log we describ 1
+log which encomp 1
+log which model 1
+log whil block 1
+log with count 1
+log with meter 1
+log with multipl 1
+log with simpl 1
+log with unbound 1
+log would suggest 1
+log writ 2
+log writ oper 1
+log1 2
+log2 8
+log2 f bit 1
+log2 n log 1
+log2 xg 1
+log2n 1
+log3 2
+log3 n log1 1
+log3 t log 1
+logact 1
+logact bal 1
+logact bal amount 1
+logarithm 12
+logarithm amount 1
+logarithm diameter 1
+logarithm diameter network 1
+logarithm fact 1
+logarithm number 1
+logarithm of respon 1
+logarithm or faster 1
+logarithm scal 1
+logarithm siz 1
+logarithm spac 1
+logarithm tim 4
+logarithm tim complec 1
+logarithm tim membership 1
+logarithm tim upd 1
+logarithm y ac 1
+logaritmiqu 1
+logb 1
+logdel 1
+logdel threshold 1
+logdij 1
+logdisk 1
+logeman 1
+logeman and loveland 1
+logglobalmaxjq0j 1
+logicalc 1
+logiciel 4
+logiciel a transit 1
+logiciel de 2
+logiciel de la 1
+logiciel de program 1
+logiciel du 1
+logiciel du fait 1
+logiciel le 1
+logiciel utilisabl 1
+logiciel utilisabl par 1
+login 2
+login and fil 1
+login inform 1
+logiqu 3
+logiqu avec 1
+logiqu avec contraint 1
+logiqu de 1
+logiqu de deux 1
+logiqu de la 1
+logiqu dext 1
+logiqu dext com 1
+logiqu du 1
+logiqu du prem 1
+logiqu dutilit 1
+logiqu f0 1
+logiqu ib 1
+logiqu ib f0 1
+logiqu ou 1
+logiqu par 1
+logiqu par contraint 1
+logiqu qu 2
+logiqu qu ne 1
+logit 1
+logit x log 1
+logk 1
+logk step 1
+logkn 1
+logkn 1g 1
+logloglogn 1
+logloglogn log 1
+loglogn 1
+logm 3
+logm b min 1
+logm b minfm 1
+logm is expon 1
+logm logn 1
+logm0 1
+logn 4
+logn cal 1
+logn log 1
+logn log mn 1
+logn loglogn 1
+logn logn 1
+logn p 3bklogn 1
+logn then q1 1
+logn tim 1
+lognloglogn 1
+logp 1
+logp n 2t 1
+logsc 1
+logspac 1
+logspac algorithm 1
+logspac compl 1
+logspac compl problem 1
+logspac complec 1
+logspac dat 1
+logspac dat complec 1
+logspac datalog 1
+logspac logspac 1
+logspac logspac datalog 1
+logt 1
+loin 3
+loin de 1
+loin de ce 1
+loin du 1
+loin du major 1
+lol 1
+lol fam 1
+lom 2
+lom and be 1
+lombr 1
+lon 6
+lon a alor 1
+lon a coup 1
+lon ait 1
+lon ait mi 1
+lon ajout 1
+lon ajout aux 1
+lon ajout lin 1
+lon appel 3
+lon appel le 1
+lon appel par 1
+lon appel tr 1
+lon appliqu 1
+lon appliqu un 1
+lon augm 1
+lon augm la 1
+lon aurait 1
+lon aurait obtenu 1
+lon cherch 1
+lon con 2
+lon consid 2
+lon d eduit 1
+lon disp 1
+lon disp la 1
+lon effectu 1
+lon effectu dan 1
+lon effectu un 1
+lon empil 1
+lon empil le 1
+lon extrait 1
+lon fait 1
+lon fait lhypoth 1
+lon gard 1
+lon gard ce 1
+lon imp 1
+lon imp en 1
+lon in 1
+lon ne 2
+lon ne con 2
+lon ne peut 1
+lon ne veut 1
+lon not 2
+lon not cmac 1
+lon obt 2
+lon obt apr 1
+lon obt de 1
+lon obtiendrait 1
+lon pa 1
+lon pa de 1
+lon partit 1
+lon partit le 1
+lon peut 3
+lon peut ain 1
+lon peut contourner 1
+lon peut en 1
+lon peut encor 1
+lon peut etr 1
+lon peut imaginer 1
+lon pouvait 2
+lon pouvait sy 1
+lon pouvait traiter 1
+lon pr 1
+lon pr ef 1
+lon pren 1
+lon pren com 1
+lon pu 3
+lon pu conclur 1
+lon pu esp 1
+lon pu penser 1
+lon r esout 1
+lon recherch 1
+lon recherch le 1
+lon remplac 1
+lon remplac dan 1
+lon sait 1
+lon se 1
+lon se fic 1
+lon sint 2
+lon sint er 2
+lon sort 1
+lon sort du 1
+lon souhait 2
+lon souhait obtenir 1
+lon souhait permettr 1
+lon sup 2
+lon sup qu 1
+lon sup quil 1
+lon trouv 1
+lon trouv de 1
+lon veut 1
+lon veut traiter 1
+lon vient 1
+lon vient de 1
+london 16
+london math 1
+london ontar 1
+london ontar n6a 1
+london orland 1
+london uff 1
+london uff kjaerulff 1
+long 3
+long mo 1
+longer 48
+longer a neighbor 1
+longer a st 1
+longer altern 1
+longer and requir 1
+longer assum 1
+longer avail 1
+longer be block 1
+longer be control 1
+longer be correct 1
+longer be nec 1
+longer be val 1
+longer by 1
+longer claus 1
+longer collap 1
+longer conform 1
+longer consider 1
+longer consider us 1
+longer del 1
+longer dep 1
+longer developm 1
+longer developm tim 1
+longer dist 1
+longer ec 2
+longer filter 1
+longer for perfect 1
+longer hist 1
+longer hist incr 1
+longer hold 1
+longer int tempor 1
+longer intercorrel 1
+longer length 2
+longer lin 1
+longer link 1
+longer link tim 1
+longer multipl 1
+longer nec 3
+longer need und 1
+longer of period 1
+longer path 1
+longer period 1
+longer point 1
+longer respon 1
+longer respon tim 1
+longer sequ 3
+longer shadow 1
+longer solut 1
+longer tcp 1
+longer text 1
+longer th domin 1
+longer to com 1
+longer to gener 1
+longer to proc 1
+longer to respon 1
+longer traject 1
+longer tupl 1
+longer tupl length 1
+longer uniqu 1
+longer us 2
+longer us vouch 1
+longer wel typ 1
+longer with larger 2
+longer zer 1
+longest 6
+longest fundam 1
+longest fundam cycl 1
+longest interv 1
+longest length 1
+longest path 3
+longest path problem 1
+longest period 1
+longest root 1
+longest root leaf 1
+longest search 1
+longest search path 1
+longitud 1
+longitudin 1
+longitudin ac 1
+longtemp 2
+longtemp accept 1
+longtemp et donc 1
+longterm 1
+longterm behavior 1
+longu 4
+longu a traiter 1
+longu ch 1
+longu ch ne 1
+longu dur 1
+longu dur ee 1
+longu ex 1
+longu ex ecut 1
+longu qu 1
+longu qu le 1
+longu sur 1
+longu sur ce 1
+longueur 4
+longueur de 3
+longueur de ch 1
+longueur de colon 1
+longueur de la 1
+longueur du 1
+longueur du cod 1
+longueur est 1
+longueur est nl 1
+longueur la 1
+longueur la tail 1
+longueur multipl 1
+longueur multipl de 1
+longueur n est 1
+longueur n qu 1
+longueur n sur 1
+longueur nl 1
+longueur nl sont 1
+longueur non 1
+longueur non nl 1
+longueur ou 1
+longueur ou de 1
+longueur quelconqu 1
+longueur quelconqu est 1
+loog 1
+look 49
+look ahead 4
+look ahead compiler 1
+look ahead window 1
+look and feel 3
+look at ec 1
+look at interconnect 1
+look at st 1
+look at them.5 1
+look difficult 1
+look for blunder 1
+look for condit 1
+look for instruc 1
+look for maxim 1
+look for non 1
+look for oper 1
+look for pair 1
+look for parallel 1
+look for pattern 1
+look for prec 1
+look for program 1
+look for quest 1
+look for redund 1
+look for remain 1
+look for way 2
+look kl 1
+look le prom 1
+look lik good 1
+look lik standard 1
+look object 1
+look object orient 1
+look ok 1
+look pr 1
+look pr indistingu 1
+look prom 1
+look record 1
+look specif 1
+look specif prov 1
+look up dist 1
+look up funct 1
+look ver 1
+look ver me 1
+lookahead 2
+lookahead and backtrack 1
+lookahead and handl 1
+lookahead at runtim 1
+lookahead glob 1
+lookahead glob cover 1
+lookahead implem 1
+lookahead tool 1
+lookasid 1
+lookasid buffer 1
+lookasid buffer mechan 1
+lookup 8
+lookup algorithm 1
+lookup and gener 1
+lookup and invoc 1
+lookup and us 1
+lookup ar identif 1
+lookup asser 1
+lookup determin 1
+lookup dx 1
+lookup dx env 1
+lookup dy 1
+lookup dy env 1
+lookup fn 1
+lookup fn method 1
+lookup funct 1
+lookup funct gener 1
+lookup funct gf 1
+lookup in lin 1
+lookup protocol 1
+lookup strateg 1
+lookup tim 1
+lookup to error 1
+lookup x env 1
+lookup y env 1
+loop 36
+loop accord 1
+loop acr parallel 1
+loop after norm 1
+loop after skew 1
+loop after til 1
+loop algorithm 1
+loop and condit 2
+loop and const 1
+loop and parallel 1
+loop and repr 1
+loop ar doacr 1
+loop ar doal 1
+loop ar interchang 1
+loop ar prefer 1
+loop ar shown 1
+loop as shown 1
+loop becom 1
+loop becom longer 1
+loop block 1
+loop block using 1
+loop bod 3
+loop bod b0 1
+loop bod produc 1
+loop bound 5
+loop bound def 1
+loop by unimodl 1
+loop can involut 1
+loop cod 1
+loop cod gener 1
+loop commun 1
+loop commun le 1
+loop commun problem 1
+loop commun tak 1
+loop commun tim 1
+loop compl 1
+loop construc 1
+loop consum 1
+loop degrad 1
+loop dep 2
+loop dupl 1
+loop dupl de 1
+loop entir 1
+loop et dupliquer 1
+loop execut 1
+loop execut tim 1
+loop for mov 1
+loop for multicomputer 1
+loop for non 1
+loop for til 1
+loop fr 1
+loop fr bellman 1
+loop fr rout 1
+loop fragm 1
+loop from system 1
+loop gener 1
+loop gener rout 1
+loop glob 1
+loop ib 1
+loop in algorithm 1
+loop in fewer 1
+loop in figur 1
+loop ind 2
+loop ind variabl 2
+loop indefinit 1
+loop indep 1
+loop infinit 1
+loop input 1
+loop integr 1
+loop interchang 2
+loop is const 1
+loop is construc 1
+loop is execut 1
+loop is fl 1
+loop is parallel 1
+loop is repeat 1
+loop is sequ 1
+loop is typ 1
+loop iter 5
+loop iter level 1
+loop iter short 1
+loop known 1
+loop loc 1
+loop macr 1
+loop macr repr 1
+loop may allow 1
+loop may caus 1
+loop ms 1
+loop ms start 1
+loop nest 3
+loop nest assoc 1
+loop nest consider 1
+loop nest correspon 1
+loop nest extract 1
+loop nest iter 1
+loop nest level 1
+loop nest partit 1
+loop nest perform 1
+loop nest transform 1
+loop norm 1
+loop of lin 1
+loop of remov 1
+loop oft split 1
+loop on distribut 1
+loop on input 1
+loop on ma 1
+loop on multicomputer 1
+loop on multiproc 1
+loop parameter 1
+loop period 1
+loop read 1
+loop restructur 1
+loop rever 1
+loop schedl 1
+loop schedl strateg 1
+loop secon parameter 1
+loop sever 1
+loop sever degrad 1
+loop shown 1
+loop simultan 1
+loop skew 2
+loop skew transform 1
+loop system 2
+loop that wait 1
+loop through pt 1
+loop til 1
+loop to control 1
+loop to form 1
+loop to overlap 1
+loop to run 1
+loop to st 1
+loop transform 3
+loop transform framework 1
+loop transform known 1
+loop transform origin 1
+loop transform theor 2
+loop variabl 1
+loop vs 1
+loop wh dat 1
+loop when nr 1
+loop whil boolean 1
+loop wil exit 1
+loop wil guar 1
+loop with const 1
+loop with dep 1
+loop without dat 1
+loopfr 1
+loopfr algorithm 1
+loopindep 1
+lop 4
+lop e com 1
+lop erat 3
+lop erat act 1
+lop erat assoc 1
+lop erat backtrack 1
+lop erat de 2
+lop erat est 1
+lop erat mac6 1
+lop erat sest 1
+lop erateur 2
+lop erateur cr 1
+lop erateur de 2
+lop erateur dual 1
+lop erateur mac 1
+lop erateur se 1
+lop erateur sont 1
+lopez 1
+lopez krah 1
+lopportunit 1
+lopportunit e dun 1
+loprest 1
+loprest andrew 1
+loprest andrew tomkin 1
+lopstr 1
+lopt 1
+lopt darithm 1
+lopt darithm etiqu 1
+lopt de 1
+lopt de compil 1
+loptim 4
+loptim dappel 1
+loptim dappel termin 1
+loptim de 3
+loptim de ce 1
+loptim de cod 1
+loptim de fonct 1
+loptim de la 1
+loptim du 1
+loptim du fit 1
+loptim est 1
+loptim est notoir 1
+loptim glob 1
+loptim glob si 1
+loptim num 1
+loptim num eriqu 1
+loptimalit 1
+lor 10
+lor appliquer 1
+lor appliquer nimport 1
+lor dappel 1
+lor dappel interm 1
+lor de 4
+lor de ce 2
+lor de chaqu 1
+lor de commun 1
+lor de coupur 1
+lor de ecritur 1
+lor de la 2
+lor de lacc 1
+lor de lav 1
+lor de le 1
+lor de lec 3
+lor de lempil 1
+lor de limpl 1
+lor de lintroduc 1
+lor de loptim 1
+lor de lunif 1
+lor de lutil 2
+lor de no 1
+lor de ph 1
+lor de retour 1
+lor de son 1
+lor dic 1
+lor dic ecut 1
+lor dop 1
+lor dop erat 1
+lor du 2
+lor du ch 1
+lor du retour 1
+lor du test 1
+lor du th 1
+lor dun 3
+lor dun appel 1
+lor dun coupur 1
+lor dun echec 1
+lor dun etat 1
+lor dun ex 1
+lor dun ind 1
+lor dun instruc 1
+lor dun liaison 1
+lor dun mi 1
+lor dun nouvel 1
+lor dun op 1
+lor dun ph 1
+lor dun retour 1
+lor dun tent 1
+lor dun trajectoir 1
+lor dun unif 1
+lor dunif 1
+lor dunif post 1
+lor men 1
+lor qu 2
+lor qu le 1
+lor qu lhypoth 1
+lor qu lon 1
+lordinateur 1
+lordinateur classiqu 1
+lordinateur classiqu de 1
+lordinateur ex 1
+lordinateur ex ecut 1
+lordonnanc 2
+lordonnanc ch 1
+lordonnanc ch perm 1
+lordonnanc cycliqu 1
+lordonnanc dan 1
+lordonnanc dan lespac 1
+lordonnanc de 1
+lordonnanc de boucl 1
+lordonnanc de instruc 1
+lordonnanc du 1
+lordonnanc du program 1
+lordonnanc ni 1
+lordonnanc ni lorgan 1
+lordonnanc par 1
+lordonnanc par bloc 1
+lordonnanc sur 1
+lordonnanc sur le 1
+lordr 4
+lordr cr 1
+lordr d ecr 1
+lordr dan 1
+lordr dan lequel 1
+lordr darriv 1
+lordr darriv ee 1
+lordr de 4
+lordr de elimin 1
+lordr de grandeur 1
+lordr de m3 1
+lordr de nid 1
+lordr de nouvel 1
+lordr de obj 1
+lordr de perform 1
+lordr de quelqu 1
+lordr de segm 1
+lordr dic 1
+lordr dic ecut 1
+lordr du 2
+lordr du jour 1
+lordr du mil 1
+lordr du prem 1
+lordr dun 1
+lordr dun sch 1
+lordr init 1
+lordr init dic 1
+lordr inver 1
+lordr inver de 1
+lordr lexicographiqu 2
+lordr lexicographiqu inver 1
+lordr lexicographiqu sur 1
+lordr sur 1
+lordr sur le 1
+lordr textuel 1
+lordr textuel du 1
+lorentz 2
+lorentz and roger 1
+lorenz 1
+lorenz alv 1
+lorgan 2
+lorgan de 1
+lorgan de don 1
+lorgan de la 1
+lorgan du 1
+lorgan du chapitr 1
+lorgan et de 1
+lorgan par 1
+lorgan par empil 1
+lorgan physiqu 1
+lorgan physiqu de 1
+lorganigram 1
+lorig 3
+lorig de 2
+lorig de difficult 1
+lorig de la 1
+lorig de probl 1
+lorig du 1
+lorig du ph 1
+lorig ou 1
+lorig ou le 1
+lorrain 1
+lorrain ac 1
+lorrain ac deduc.ps.z 1
+lorrain stac93.ps.z 1
+lorsqu 5
+lorsqu ce 2
+lorsqu ce align 1
+lorsqu ce el 1
+lorsqu cel 1
+lorsqu cel est 1
+lorsqu celu 2
+lorsqu celu ci 2
+lorsqu cest 1
+lorsqu cest le 1
+lorsqu de 1
+lorsqu de op 1
+lorsqu deux 2
+lorsqu deux const 1
+lorsqu deux nid 1
+lorsqu jc1j 1
+lorsqu la 4
+lorsqu la distribut 1
+lorsqu la dur 1
+lorsqu la matr 1
+lorsqu la plac 1
+lorsqu la siml 1
+lorsqu la substitut 1
+lorsqu la tail 1
+lorsqu le 4
+lorsqu le acc 1
+lorsqu le argum 1
+lorsqu le born 1
+lorsqu le comport 1
+lorsqu le degr 1
+lorsqu le deux 1
+lorsqu le lign 1
+lorsqu le marqu 1
+lorsqu le nombr 1
+lorsqu le processeur 1
+lorsqu le program 1
+lorsqu le register 1
+lorsqu le surc 1
+lorsqu le symbol 1
+lorsqu le temp 1
+lorsqu lec 1
+lorsqu lec ecut 1
+lorsqu linterv 1
+lorsqu linterv entr 1
+lorsqu lon 3
+lorsqu lon augm 1
+lorsqu lon imp 1
+lorsqu lon pa 1
+lorsqu lon recherch 1
+lorsqu lon souhait 2
+lorsqu lon trouv 1
+lorsqu lun 1
+lorsqu lun de 1
+lorsqu nous 2
+lorsqu nous evalueron 1
+lorsqu nous ex 1
+lorsqu pi 1
+lorsqu t 0.25h 1
+lorsquau 1
+lorsquau moin 1
+lorsquau moin deux 1
+lorsquaucun 1
+lorsquaucun de 1
+lorsquaucun de ce 1
+lorsquil 3
+lorsquil ec 1
+lorsquil ec de 1
+lorsquil ec un 1
+lorsquil ny 1
+lorsquil obt 1
+lorsquil obt un 1
+lorsquil po 1
+lorsquil po ed 1
+lorsquil saccompagn 1
+lorsquil saccompagn de 1
+lorsquil sagit 2
+lorsquil sagit de 2
+lorsquil va 1
+lorsquil va sagir 1
+lorsquon 3
+lorsquon appliqu 1
+lorsquon atteint 1
+lorsquon atteint le 1
+lorsquon aut 1
+lorsquon aut la 1
+lorsquon cherch 1
+lorsquon d epil 1
+lorsquon doit 1
+lorsquon doit ecrir 1
+lorsquon ne 1
+lorsquon ne le 1
+lorsquon regard 1
+lorsquon regard lag 1
+lorsquon sappu 1
+lorsquon sappu sur 1
+lorsquon util 1
+lorsquon util la 1
+lorsquun 2
+lorsquun claus 1
+lorsquun claus appar 1
+lorsquun claus nest 1
+lorsquun enregister 1
+lorsquun enregister est 1
+lorsquun environ 1
+lorsquun environ est 1
+lorsquun pr 1
+lorsquun pr edicat 1
+lorsquun var 1
+lorsquun var temporair 1
+lorus 1
+lost 18
+lost and retransm 1
+lost ar bound 1
+lost b quick 1
+lost cap 1
+lost compl 1
+lost du 1
+lost is equ 1
+lost me 2
+lost me navig 1
+lost pack 2
+lost sinc p1 1
+lost som serv 1
+lost through forg 1
+lost to restructur 1
+lot 16
+lot and mak 1
+lot ea 1
+lot for object 1
+lot j us 1
+lot of adv 1
+lot of cod 1
+lot of disk 1
+lot of fil 1
+lot of flec 1
+lot of g0 1
+lot of inform 1
+lot of match 1
+lot of possibil 1
+lot of prob 1
+lot of redund 1
+lot of research 1
+lot of structur 1
+lot of traff 1
+lot of valu 1
+lot simpler 1
+lot to approxim 1
+lot to expect 1
+lot wh perform 1
+lot with perform 1
+loter 1
+loter bi 1
+loter bi ee 1
+lotus 1
+lou 5
+lou bentl 1
+lou cur 1
+lou lassez 1
+lou wang 1
+loucopoul 1
+loucopoul and rober 1
+loud 1
+loudest 1
+loudest is tak 1
+louisvil 1
+loup 1
+loup baer 1
+lourd 2
+lourd dan 1
+lourd dan glob 1
+lourdeur 1
+lourdeur peut 1
+lourdeur peut ralentir 1
+louvr 1
+louvr de 1
+louvr de okeef 1
+lov 3
+lov and shreek 1
+lov peter 1
+lov peter steenk 1
+lovasz 1
+lovelac 1
+lovelac dwheeler.html 1
+lovelac userg.html 1
+loveland 1
+loveman 1
+low 49
+low algorithm 1
+low algorithm prob 1
+low amount 1
+low and hussein 1
+low and upper 1
+low bandwidth 2
+low bandwidth network 2
+low bit 1
+low bit rat 1
+low block 1
+low block probabil 1
+low by hist 1
+low cod 1
+low cod writ 1
+low complec 5
+low complec algorithm 1
+low complec dag 1
+low complec method 1
+low complec run 1
+low conceptu 1
+low conceptu jump 1
+low cont 3
+low cost 4
+low cost tempor 1
+low dat 1
+low dat complec 1
+low degr 2
+low degr polynom 1
+low distribut 1
+low distribut cost 1
+low en 1
+low int 1
+low int spot 1
+low kolmogorov 1
+low kolmogorov complec 1
+low lat 4
+low lat commun 1
+low level 15
+low level alloc 1
+low level cluster 2
+low level cod 1
+low level datab 1
+low level featur 1
+low level gener 1
+low level instruc 1
+low level issu 1
+low level lock 1
+low level model 1
+low level not 1
+low level nuclear 1
+low level object 1
+low level oper 2
+low level part 1
+low level primitiv 1
+low level problem 1
+low level recov 1
+low level red 1
+low level refin 1
+low level runtim 1
+low level sign 1
+low level specif 1
+low level st 1
+low level system 1
+low level vi 1
+low level visu 1
+low levin 1
+low levin complec 1
+low load 1
+low loc 1
+low m multicast 1
+low me 1
+low me overhead 1
+low multicast 1
+low multicast degr 1
+low number 1
+low order 1
+low order schem 1
+low overhead 4
+low overhead coh 1
+low overhead stat 1
+low overhead synchron 1
+low pa 1
+low parallel 1
+low prior 1
+low prior probabil 1
+low rel 1
+low rel impl 1
+low resolut 2
+low resolut dat 1
+low resolut imag 1
+low resolut sign 1
+low road 1
+low road program 1
+low runtim 1
+low runtim overhead 1
+low scor 1
+low se 2
+low se lat 1
+low siz 1
+low specif 1
+low specif mach 1
+low th individu 1
+low therm 1
+low therm dissip 1
+low throughput 1
+low to support 1
+low valu 3
+low var 1
+low var acc 1
+low water 1
+low water mark 1
+low weight 1
+low94 1
+low95 1
+lowel 1
+lower 59
+lower achief 1
+lower achief bandwidth 1
+lower and incr 1
+lower and satur 1
+lower and upper 4
+lower aver 2
+lower aver accur 1
+lower aver del 1
+lower bit 1
+lower bound 25
+lower bound ap 1
+lower bound appl 2
+lower bound argum 1
+lower bound dep 1
+lower bound giv 1
+lower bound hold 2
+lower bound prov 1
+lower bound recur 1
+lower bound rel 1
+lower bound valu 1
+lower bound1 1
+lower bound1 upper 1
+lower boundn 1
+lower boundn upper 1
+lower by click 1
+lower ca 4
+lower ca character 1
+lower ca letter 2
+lower combin 1
+lower combin lat 1
+lower complec 1
+lower compon 1
+lower confid 2
+lower confid valu 1
+lower cost 1
+lower crit 1
+lower crit ph 1
+lower dim 2
+lower dim simpl 1
+lower error 1
+lower exp 1
+lower exp interconnect 1
+lower for 2cl 1
+lower funct 1
+lower hierarch 2
+lower hierarch allow 2
+lower in interconnect 1
+lower interconnect 1
+lower interconnect cost 1
+lower lat 1
+lower layer 1
+lower layer st 1
+lower left corner 1
+lower level 13
+lower level architectur 1
+lower level cluster 2
+lower level comp 1
+lower level con 2
+lower level dat 1
+lower level fragm 1
+lower level interrupt 1
+lower level inver 1
+lower level langu 1
+lower level lock 1
+lower level op 1
+lower level oper 1
+lower level parallel 1
+lower level program 1
+lower level prov 1
+lower level random 1
+lower level run 1
+lower level st 1
+lower level subtransact 1
+lower level transact 1
+lower level und 1
+lower lin 1
+lower number 2
+lower or high 1
+lower order 1
+lower order on 1
+lower order rol 1
+lower per me 1
+lower perform 1
+lower pivot 1
+lower port 1
+lower posit 1
+lower pot 1
+lower qu 1
+lower rat 1
+lower realm 1
+lower reserv 1
+lower right corner 1
+lower satur 1
+lower satur bandwidth 1
+lower secur 1
+lower secur protect 1
+lower speed 1
+lower split 1
+lower st 1
+lower st requir 1
+lower switch 1
+lower switch del 1
+lower th an 1
+lower th order 1
+lower th over 1
+lower th technolog 1
+lower th tim 1
+lower then expect 1
+lower threshold 1
+lower to bt 1
+lower triangl 1
+lower triangl fact 1
+lower ts 1
+lower valu 2
+lower vol 1
+lower vol threshold 1
+loweralph 1
+loweralph digit 1
+loweralph rl 1
+loweralph rl output 1
+lowerlevel 1
+lowerlevel perform 1
+lowest 15
+lowest bandwidth 1
+lowest bound 1
+lowest degr 1
+lowest dim 1
+lowest fundam 1
+lowest fundam level 1
+lowest lat 1
+lowest layer 1
+lowest level 3
+lowest level oper 1
+lowest level recov 1
+lowest number 2
+lowest number unissu 1
+lowest over 1
+lowest over aver 1
+lowest perform 1
+lowest perform gain 1
+lowest po number 1
+lowest point 1
+lowest rat 1
+lowest resolut 1
+lowest resolut rough 1
+lowest st 1
+lowest st requir 1
+lowlevel 1
+lowlevel program 1
+lowlevel program langu 1
+loworder 1
+loworder walsh 1
+loworder walsh coeff 1
+lowr 1
+lozinsk 1
+lp 11
+lp algorithm 1
+lp algorithm adapt 1
+lp assum 1
+lp assum nonneg 1
+lp avec 1
+lp ba 1
+lp ba program 1
+lp commun 1
+lp contain 1
+lp fg 1
+lp finit 1
+lp finit repr 1
+lp forml 1
+lp fr 1
+lp fr algorithm 1
+lp fr approxim 1
+lp h8x0 1
+lp he nam 1
+lp inst 1
+lp is deriv 1
+lp langu 1
+lp langu awk 1
+lp matr 1
+lp matr typ 1
+lp method 1
+lp optim 1
+lp optim solut 1
+lp or autom 1
+lp paradigm 1
+lp problem 2
+lp problem list 1
+lp problem using 1
+lp program 1
+lp s decl 1
+lp system 1
+lp system implem 1
+lp th intersect 1
+lp92 1
+lp96 1
+lpjlock 1
+lpjlock fg 1
+lpjx 1
+lpjx denot 1
+lpjx fg 1
+lpm 1
+lq 1
+lr 3
+lr is tj 1
+lr s fr 1
+lr server 1
+lr server allow 1
+lr server prov 1
+lr to color 1
+lr89 1
+lrc 1
+lrc 8k 1
+lrc 8k show 1
+lrc algorithm 1
+lrc and lrc 1
+lrc and snoop 1
+lrc approach 1
+lrc as compar 1
+lrc execut 1
+lrc implem 1
+lrc incur 1
+lrc is ea 1
+lrc is gener 1
+lrc is implem 1
+lrc laz 1
+lrc laz rel 1
+lrc maintain 1
+lrc over rc 1
+lrc overhead 1
+lrc overhead account 1
+lrc perform 1
+lrc perform wor 1
+lrc scal 1
+lrc scal nic 1
+lrc th number 1
+lrc tr 1
+lrc versus sc 1
+lrc versus snoop 1
+lrh71 1
+lrp 1
+lru 1
+ls 6
+ls broadcast 1
+ls estim 1
+ls lb 1
+ls2 1
+ls2 9jt 1
+ls90 1
+lsb 1
+lsd 1
+lsd descript 1
+lsd is shown 1
+lsd not 1
+lsd script 1
+lsdagentsobserv 1
+lsdagentsobserv definitionsprotocol 1
+lsdagentsobserv definitionsprotocol displaydev 1
+lsn 2
+lsn resourcemanager 1
+lsn resourcemanager se 1
+lsup 1
+lsw 1
+lsw transit 1
+lt 3
+lt a5 1
+lt intn 1
+lt realn 1
+lt vm 1
+lt88 1
+lt92 1
+lt94 1
+ltc 1
+ltd 6
+lth 2
+lth fibonacc 1
+lth fibonacc number 1
+lth iter 1
+lu 13
+lu and r.c 1
+lu assoc 1
+lu assoc la 1
+lu co 1
+lu co uter 1
+lu est 3
+lu est affect 1
+lu est assoc 2
+lu fact 1
+lu fair 1
+lu fair occuper 1
+lu far 1
+lu far na 1
+lu fournir 1
+lu fournir tout 1
+lu hil 1
+lu hil cs.brown.edu 1
+lu le 1
+lu le nombr 1
+lu le traff 1
+lu m em 2
+lu matr 1
+lu matr decomposit 1
+lu par 1
+lu par linterm 1
+lu permettr 1
+lu permettr deffectuer 1
+lu quau 1
+lu quau traver 1
+lu rodriguez 1
+lu sel 1
+lu sel destimer 1
+lu soit 1
+lu soit apport 1
+lu sont 1
+lu sont assoc 1
+lu stev 1
+lu v color 1
+lu zar 1
+luan 1
+lub 1
+lub oper 1
+luc 9
+luc and int 2
+luc cardel 2
+luc command 1
+luc command aus 1
+luc diffus 1
+luc diffus la 1
+luc implem 1
+luc len 1
+luc lik int 1
+luc lik oper 1
+luc moran 1
+luc program 1
+lucarn 1
+lucarn perm 1
+lucarn perm ain 1
+lucil 1
+lucil glassman 1
+luciol 2
+luciol b.p 1
+luciol bp 1
+luckhardt 1
+ludwig 2
+ludwig fingerhut 1
+ludwig maximil 1
+ludwig maximil universit 1
+luft 1
+luft und 1
+luft und raumfahrtkonstrukt 1
+lug 1
+lug is inanim 1
+lug somehow 1
+lug somehow threat 1
+lugiez 1
+luim 1
+luim em 1
+lum 1
+lum er de 1
+lun 7
+lun acev 1
+lun apr 1
+lun apr es 1
+lun avec 1
+lun avec support 1
+lun de 5
+lun de adr 1
+lun de argum 1
+lun de comp 1
+lun de deux 3
+lun de difficult 1
+lun de instruc 1
+lun de point 1
+lun de princip 1
+lun de processeur 1
+lun de raison 1
+lun de se 1
+lun de term 1
+lun de tr 1
+lun deux 1
+lun deux est 1
+lun est 1
+lun est dutiliser 1
+lun fon 1
+lun fon ee 1
+lun fonct 1
+lun fonct en 1
+lun par 1
+lun par rapport 1
+lun pour 1
+lun pour le 1
+lun soccup 1
+lun soccup essentiel 1
+lun sp 1
+lun sp ecifiqu 1
+lun sur 1
+lun sur le 1
+lun util 1
+lunanim 1
+lunar 1
+lunar calendar 1
+lund 1
+lung 1
+lung cancer 1
+lunif 1
+lunif afin 1
+lunif afin de 1
+lunif compil 1
+lunif compil ee 1
+lunif cr 1
+lunif cr eent 1
+lunif dan 1
+lunif dan la 1
+lunif de 1
+lunif de deux 1
+lunif de la 1
+lunif de variabl 1
+lunif dun 1
+lunif dun cl 1
+lunif dun de 1
+lunif dun man 1
+lunif dun var 1
+lunif echou 1
+lunif est 1
+lunif est alor 1
+lunif est suscept 1
+lunif est val 1
+lunif et au 1
+lunif et deffectuer 1
+lunif et du 1
+lunif etendu 1
+lunif ext 1
+lunif g en 1
+lunif li 1
+lunif li de 1
+lunif ne 1
+lunif ne cr 1
+lunif ne peut 1
+lunif peut 1
+lunif peut aus 1
+lunif r eel 1
+lunif r eussit 1
+lunif ren 1
+lunif ren deux 1
+lunif s emantiqu 1
+lunif se 1
+lunif syntaxiqu 1
+lunif syntaxiqu habituel 1
+lunificateur 1
+lunificateur le 1
+lunimodularit 1
+lunimodularit e de 1
+luniqu 2
+luniqu point 1
+luniqu point ent 1
+luniqu probl 1
+luniqu probl em 1
+luniqu r ol 1
+luniqu structur 1
+luniqu structur de 1
+lunit 3
+lunit e de 3
+lunit e dic 1
+luniversit 2
+luniversit e de 2
+lusk 2
+lusk and overbeek 1
+lusk and r.a 1
+lustig 1
+lusz 1
+lusz nsk 1
+lut92 1
+lutgard 1
+lutil 4
+lutil cliniqu 1
+lutil cliniqu qu 1
+lutil de 4
+lutil de ag 1
+lutil de bloc 1
+lutil de ce 2
+lutil de cod 1
+lutil de cop 1
+lutil de deux 1
+lutil de directiv 1
+lutil de fonct 1
+lutil de form 1
+lutil de graph 1
+lutil de instruc 1
+lutil de la 3
+lutil de laffect 1
+lutil de lalgorithm 1
+lutil de lar 1
+lutil de lop 1
+lutil de lunit 1
+lutil de point 1
+lutil de program 1
+lutil de tb 1
+lutil de test 1
+lutil de transform 1
+lutil de treil 1
+lutil de variabl 1
+lutil de ver 1
+lutil denregister 1
+lutil denregister dactiv 1
+lutil dobj 1
+lutil dobj temporair 1
+lutil dop 1
+lutil dop erat 1
+lutil du 2
+lutil du mod 1
+lutil du partit 1
+lutil du prem 1
+lutil du register 1
+lutil dun 2
+lutil dun architectur 1
+lutil dun biblioth 1
+lutil dun elag 1
+lutil dun environ 1
+lutil dun etiqu 1
+lutil dun instruc 1
+lutil dun mvp 1
+lutil dun nouveau 1
+lutil dun optim 1
+lutil dun par 1
+lutil dun prim 1
+lutil dun protocol 1
+lutil dun syst 1
+lutil dun tabl 1
+lutil dun transform 1
+lutil le 1
+lutilisat 1
+lutilisat de 1
+lutilisat de transform 1
+lutilisateur 3
+lutilisateur a la 1
+lutilisateur de 1
+lutilisateur de supprimer 1
+lutilisateur fin 1
+lutilisateur ne 1
+lutilisateur ne soit 1
+lutilisateur ou 1
+lutilisateur ou calcl 1
+lutilisateur par 1
+lutilisateur par linterm 1
+lutilisateur sont 1
+lutilisateur sont vr 1
+lutilisateur un acc 1
+lutilit 2
+lutilit e de 2
+lutilit e du 1
+lutilit e dun 1
+lutilit e rel 1
+lutton 2
+lutz 1
+luv 1
+lv89 2
+lvq 1
+lw91 1
+lw92 1
+lx 3
+lx minx 1
+lx nq 1
+lx93 1
+lxsl91 1
+ly 2
+ly min 1
+lyd 1
+lying 4
+lying in reg 1
+lying insid other 1
+lying on extern 1
+lyl 2
+lyl kip 1
+lyl min 1
+lyl87 1
+lyn 2
+lyn pointer 1
+lynch 5
+lyngb 1
+lyon 5
+lyon ced 1
+lyon unit 1
+lyon.fr 1
+lyzeng 1
+m 1
+m corin 1
+m corin ancourt 1
+m.a 5
+m.antonion 1
+m.apperl 1
+m.apperl cs.waikat.ac.nz 1
+m.b 2
+m.c 3
+m.d 2
+m.d.s 1
+m.e 3
+m.f 1
+m.f.p 1
+m.g 2
+m.gerndtg 1
+m.gerndtg kf 1
+m.gerndtg kf juelich.de 1
+m.gondran 1
+m.h 4
+m.horowitz 1
+m.i 2
+m.i.t 2
+m.j 4
+m.l 3
+m.m 2
+m.o 1
+m.r 4
+m.s 1
+m.v 1
+m.w 1
+m.w.van 1
+m.y 3
+m0 11
+m0 correspon 1
+m0 in oe 1
+m0 in oeab 1
+m0 le 1
+m0 le marqu 1
+m0 n0 1
+m0 of siz 1
+m0 ou 1
+m0 ou en 1
+m0 r0 1
+m0 recogn 1
+m0 that result 1
+m0 to output 1
+m0 to proc 1
+m0 vsplit 1
+m0 vsplit vsplit1 1
+m0 wa enqueu 1
+m0 wa sent 1
+m01 1
+m0i 1
+m0i en 1
+m0n 1
+m1 14
+m1 10q1 1
+m1 acknowledg 1
+m1 acknowledg me 1
+m1 and m2 2
+m1 arg1 1
+m1 arg1 cl 1
+m1 arg2 1
+m1 arg2 cl 1
+m1 continu 1
+m1 continu flag 1
+m1 continu self 1
+m1 et m2 1
+m1 f12 1
+m1 in tabl 1
+m1 limk 1
+m1 limk 1mk 1
+m1 m2 2
+m1 m2 m3 1
+m1 m20 1
+m1 us 1
+m1 win 1
+m14b 1
+m16 1
+m1m2 1
+m1mt1 1
+m1mt1 m2mt2 1
+m1mt1 m2mt2 m3mt3 1
+m2 16
+m2 3p 2
+m2 8n 1
+m2 arg1 1
+m2 arg1 cl 1
+m2 arg2 1
+m2 arg2 cl 1
+m2 bn 1
+m2 bn block 1
+m2 deux 1
+m2 deux ent 1
+m2 div 1
+m2 etant 1
+m2 etant prem 1
+m2 f13 1
+m2 in tabl 1
+m2 m3 2
+m2 n record 1
+m2 of theorem 1
+m20 1
+m21 1
+m251067 1
+m2g 1
+m2g m log 1
+m2mk 1
+m2mkng 1
+m2mt2 1
+m2mt2 m3mt3 1
+m2mt2 m3mt3 m4mt4 1
+m2n 1
+m2s2 1
+m3 10
+m3 4p 2
+m3 and m4 1
+m3 arg1 1
+m3 arg1 cl 1
+m3 arg2 1
+m3 arg2 cl 1
+m3 in tabl 1
+m3 n2 1
+m3 n2 exp 1
+m3 n2 ln2 1
+m3 pour 1
+m3 term 1
+m3 tim 1
+m37 1
+m3mt3 1
+m3mt3 m4mt4 1
+m3mt3 m4mt4 win 1
+m3n3 1
+m4 3
+m4 in tabl 1
+m4 mak 1
+m4 mak us 1
+m4 q1 1
+m4 q2 1
+m4 q3 1
+m4 q4 1
+m4 q5 1
+m42 1
+m44 1
+m4mt4 1
+m4mt4 win 1
+m5 1
+m5 is found 1
+m5s 1
+m5s 1a1 1
+m6 1
+m86 2
+m88 1
+m93 1
+m95 1
+ma 51
+ma a contribu 1
+ma a donner 1
+ma a lacc 1
+ma accueil 1
+ma actspeed 1
+ma actspeed integ 1
+ma aid 1
+ma amount 2
+ma and mollioer 1
+ma appliqu 1
+ma appliqu ee 1
+ma assur 1
+ma assur lexactitud 1
+ma au 1
+ma au pr 1
+ma aus 2
+ma aus dan 1
+ma aus de 1
+ma aus par 1
+ma aus quil 1
+ma aus un 1
+ma avant 1
+ma avant la 1
+ma beaucoup 1
+ma beaucoup aid 1
+ma ce 2
+ma ce deux 1
+ma ce fo 1
+ma ce nombr 1
+ma ce opt 1
+ma cec 1
+ma cec rest 1
+ma cel 2
+ma cel ci 1
+ma com 1
+ma com con 1
+ma com le 1
+ma compl 1
+ma compl es 1
+ma conduit 1
+ma const 1
+ma d ecoul 1
+ma d epen 1
+ma dautr 2
+ma dautr adr 1
+ma dautr ouvr 1
+ma de 4
+ma de ag 1
+ma de calcl 1
+ma de commun 1
+ma de don 1
+ma de le 1
+ma de lentrelacer 1
+ma de man 1
+ma de zn 1
+ma dextrair 1
+ma doit 1
+ma doit fair 1
+ma egal 1
+ma egal de 1
+ma elim 1
+ma en 1
+ma en vu 1
+ma encor 1
+ma encor il 1
+ma est 2
+ma est quelquef 1
+ma et juin 1
+ma excessiv 1
+ma excessiv int 1
+ma fait 1
+ma fait appr 1
+ma fait lhonneur 1
+ma from proc 1
+ma il 3
+ma il est 1
+ma il ont 1
+ma il peut 1
+ma illustron 1
+ma illustron sel 1
+ma induit 1
+ma induit cep 1
+ma inform 1
+ma inform st 1
+ma itr 1
+ma itr de 1
+ma itrison 1
+ma itrison la 1
+ma la 3
+ma la caract 1
+ma la consom 1
+ma la nouvel 1
+ma la pag 1
+ma la per 1
+ma la plupart 1
+ma la sym 1
+ma la ten 1
+ma lab 1
+ma lab destampil 1
+ma lauteur 1
+ma lauteur ne 1
+ma le 4
+ma le but 1
+ma le compteur 1
+ma le coupl 1
+ma le domain 1
+ma le el 1
+ma le gestionnair 1
+ma le nombr 1
+ma le par 1
+ma le point 1
+ma le temp 1
+ma le term 1
+ma le travaux 1
+ma lor 1
+ma lor de 1
+ma lusz 1
+ma lusz nsk 1
+ma lutil 1
+ma lutil de 1
+ma moin 1
+ma moin rap 1
+ma n ecessit 1
+ma n etant 1
+ma nassur 1
+ma nassur pa 1
+ma ne 2
+ma ne perm 1
+ma ne sannl 1
+ma ne sont 1
+ma ne va 1
+ma non 1
+ma non suff 1
+ma nous 1
+ma nous esp 1
+ma of car 1
+ma ont 1
+ma ont rej 1
+ma p1 2
+ma p1 p2 2
+ma pa 2
+ma pa dan 1
+ma pa de 2
+ma pa la 1
+ma pa le 1
+ma pa toujour 1
+ma parallel 12
+ma parallel bay 1
+ma parallel comput 1
+ma parallel computer 3
+ma parallel genet 1
+ma parallel implem 1
+ma parallel mach 1
+ma parallel proc 1
+ma parallel program 1
+ma parallel separ 1
+ma parallel simd 1
+ma parallel system 2
+ma parallel tren 2
+ma perm 2
+ma perm de 2
+ma peut 2
+ma peut aller 1
+ma peut encor 1
+ma peut rester 1
+ma plus co 1
+ma plut 1
+ma plut ot 1
+ma po 1
+ma po edent 1
+ma port 1
+ma port maint 1
+ma pour 1
+ma pour calculer 1
+ma princip 1
+ma princip de 1
+ma qu 2
+ma qu ce 1
+ma qu fair 1
+ma qu ninterv 1
+ma qu sont 1
+ma quaucun 1
+ma quaucun point 1
+ma r ecup 1
+ma r eduit 1
+ma rationnel 1
+ma rendr 1
+ma s1 1
+ma sa 1
+ma sa valeur 1
+ma san quil 1
+ma san trop 1
+ma sav 2
+ma se 1
+ma se foc 1
+ma sel 1
+ma sel de 1
+ma serait 1
+ma serait plut 1
+ma sexpliqu 1
+ma sexpliqu de 1
+ma si 1
+ma si ce 1
+ma st 2
+ma st system 1
+ma technolog 2
+ma technolog technolog 2
+ma tous 1
+ma tous ce 1
+ma tr 1
+ma tr de 1
+ma tr la 1
+ma travail 1
+ma travail sur 1
+ma un 3
+ma un mesur 1
+ma un sel 1
+ma un util 1
+ma vi 1
+ma vi glob 1
+ma. 1
+ma87 1
+ma92 1
+mac 36
+mac angl 1
+mac block 1
+mac block acc 1
+mac d dr 1
+mac d i2 1
+mac d1 1
+mac degr 1
+mac del 1
+mac del avg 1
+mac each proc 1
+mac el 1
+mac equ 1
+mac equ rel 1
+mac f og 1
+mac f sg 1
+mac fcur 1
+mac fcur ts 1
+mac find 1
+mac find step 1
+mac flow 1
+mac flow min 1
+mac ft 1
+mac gain 1
+mac gain en 1
+mac graph 1
+mac graph min 1
+mac graph reducemac16 1
+mac ii8 1
+mac jdp 1
+mac jdpl 1
+mac lsn 1
+mac lsn resourcemanager 1
+mac min 2
+mac min mac 1
+mac min moy 1
+mac moy 1
+mac moy dev 1
+mac p fmpc 1
+mac par 1
+mac par souc 1
+mac planck 1
+mac planck institut 1
+mac r4r 1
+mac rel 1
+mac result 1
+mac result aim 1
+mac s0432 1
+mac scal 1
+mac scal keep 1
+mac siz 1
+mac snp 1
+mac snp compl 1
+mac term 1
+mac tok 1
+mac tr 1
+mac tr reducemac16 1
+mac transact 1
+mac transact cl 1
+mac unsat 1
+mac vient 1
+mac vient du 1
+mac1 3
+mac1 i nff 1
+mac1 j sfd 1
+mac2 1
+mac2cjf 1
+mac6 1
+mac6 ou 1
+mac6 ou la 1
+mac77 1
+mac82 1
+mac91 1
+macartn 1
+macew 1
+macfarlan 1
+mach 75
+mach a adr 1
+mach a platform 1
+mach abstract 1
+mach abstract level 1
+mach abstrait 1
+mach abstrait ba 1
+mach abstrait daquarius 1
+mach abstrait de 1
+mach abstrait decrc 1
+mach abstrait du 1
+mach abstrait prolog 1
+mach abstrait sp 1
+mach abstrait toam 1
+mach actuel 1
+mach actuel le 1
+mach ain 1
+mach ain qu 1
+mach alphab 1
+mach and disk 1
+mach and knowledg 1
+mach and me 1
+mach and network 1
+mach and proc 1
+mach and refin 1
+mach and weak 1
+mach approach 1
+mach ar dat 1
+mach ar good 1
+mach ar plain 1
+mach ar shown 1
+mach architectur 3
+mach as describ 1
+mach as illustr 1
+mach asymptot 1
+mach asymptot tp 1
+mach au 1
+mach au register 1
+mach benchmark 1
+mach benchmark user 1
+mach bp 1
+mach but retain 1
+mach by abdelguerf 1
+mach cam 1
+mach can achief 1
+mach can perform 1
+mach character 1
+mach cibl 1
+mach cibl don 1
+mach cm 4
+mach cod 2
+mach cod gener 1
+mach com 2
+mach com ou 1
+mach com pil 1
+mach con 1
+mach connect 1
+mach corpor 2
+mach corpor cm2 1
+mach corpor tr 1
+mach cr 2
+mach cr t3e 1
+mach crash 1
+mach d ed 1
+mach d eriv 1
+mach dan 1
+mach dan un 1
+mach de 4
+mach de ce 1
+mach de concept 1
+mach de tur 1
+mach de typ 1
+mach dec 1
+mach defin 1
+mach design 1
+mach distribu 1
+mach distribu ee 1
+mach dit 1
+mach en 1
+mach en plusieur 1
+mach encor 1
+mach encor moin 1
+mach engendr 1
+mach equip 1
+mach equiv 1
+mach equiv langu 1
+mach equiv program 1
+mach et de 1
+mach et la 1
+mach et son 1
+mach evit 1
+mach evit certain 1
+mach ex 1
+mach ex ecut 1
+mach fail 1
+mach fail approxim 1
+mach failur 1
+mach first gu 1
+mach for discr 1
+mach for funct 1
+mach for implem 1
+mach for ti 1
+mach g en 1
+mach group 1
+mach group mad 1
+mach h ot 1
+mach ha input 1
+mach ha procedur 1
+mach ibam 1
+mach icm 1
+mach id 1
+mach identif 1
+mach impl 2
+mach implem 1
+mach in sect 1
+mach inc 1
+mach indep 2
+mach indep format 1
+mach infer 1
+mach instruc 4
+mach instruc tak 1
+mach intel 1
+mach intellig 6
+mach interm 1
+mach interm ediair 1
+mach involut 1
+mach is natur 1
+mach is prop 1
+mach is unfortun 1
+mach kcm 1
+mach le 1
+mach le abstract 1
+mach learn 9
+mach learn algorithm 2
+mach learn commun 1
+mach learn datab 1
+mach learn method 1
+mach learn paradigm 1
+mach learn techniqu 1
+mach learner 1
+mach lying 1
+mach m comput 1
+mach m0 1
+mach m0 recogn 1
+mach m1 1
+mach m1 us 1
+mach m2 1
+mach m3 1
+mach m4 1
+mach massiv 1
+mach massiv par 1
+mach may deliver 1
+mach may serv 1
+mach mimd 1
+mach mimd en 1
+mach mimd se 1
+mach mimd sont 1
+mach model 3
+mach model ignor 1
+mach monoprocesseur 1
+mach multicomputer 2
+mach multiprocesseur 1
+mach mun 1
+mach mun dun 1
+mach must ask 1
+mach num 1
+mach num de 1
+mach of bl 1
+mach of equ 1
+mach offr 2
+mach offr diff 1
+mach offr la 1
+mach on 1
+mach ont 1
+mach ont actuel 1
+mach oper 2
+mach oper system 1
+mach or intel 1
+mach or proc 1
+mach or tak 1
+mach orient 2
+mach orient effect 1
+mach orient log 1
+mach os 1
+mach os ts 1
+mach osm 1
+mach par 2
+mach par el 2
+mach paragon 1
+mach paragon dintel 1
+mach paragon don 1
+mach paragon est 1
+mach paragon xp 1
+mach partag 1
+mach partag ee 1
+mach plm 1
+mach plm est 1
+mach plm ne 1
+mach po 1
+mach po edant 1
+mach pot 1
+mach pot requir 1
+mach pour 1
+mach pour traduir 1
+mach predict 2
+mach program 1
+mach proj 1
+mach proj repc 1
+mach project 1
+mach prolog 1
+mach prolog construit 1
+mach prototyp 2
+mach qu 1
+mach qu le 1
+mach r eel 1
+mach rang 1
+mach read 1
+mach read text 1
+mach recogn 1
+mach repr 1
+mach repr st 1
+mach requir 1
+mach run 1
+mach simd 1
+mach siz 1
+mach sont 4
+mach sont cep 1
+mach sont de 1
+mach sont le 1
+mach sont sp 1
+mach sont syst 1
+mach souffr 1
+mach sous 1
+mach sous jacent 1
+mach sp 1
+mach sp ec 1
+mach specif 1
+mach specif collect 1
+mach st 1
+mach structur 1
+mach stud 4
+mach support 3
+mach support ext 1
+mach system 1
+mach techn 1
+mach techn report 1
+mach th def 1
+mach that util 1
+mach theor 1
+mach to me 1
+mach to minim 1
+mach to reach 1
+mach trait 1
+mach try 1
+mach un impact 1
+mach us 2
+mach us ben 1
+mach using 2
+mach usu comb 1
+mach util 2
+mach util de 1
+mach util ee 1
+mach vi 2
+mach virtuel 2
+mach virtuel dec 1
+mach virtuel partag 1
+mach wa built 1
+mach wa connect 1
+mach wa oper 1
+mach wer es 1
+mach wer oper 1
+mach wer subsequ 1
+mach wh gu 1
+mach which matter 1
+mach with asynchron 1
+mach with color 1
+mach with depth 1
+mach with discr 1
+mach with hardwar 1
+mach with input 1
+mach with order 1
+mach with priv 1
+mach with prolog 1
+mach with self 1
+mach with sparc 1
+mach with suf 1
+mach with support 1
+mach with tr 1
+mach with tun 1
+mach without order 1
+machin 7
+machin analog 1
+machin of constraint 1
+machineor 1
+machineor specif 1
+machiner 1
+machiner sp 1
+machiner sp ecifiqu 1
+machmouch 1
+macht 1
+macintosh 3
+macintosh styl 1
+macintosh styl user 1
+mack91 1
+mackinl 1
+mackinl and card 1
+mackworth 3
+mackworth a.k 1
+mackworth and freuder 1
+macl 1
+maclin 1
+maclin shavlik 1
+macmillan 1
+macmillan compan 1
+macpaint 1
+macpaint show 1
+macq 1
+macquar 2
+macquar univer sydn 1
+macqueen 4
+macr 15
+macr assembler 1
+macr assembler refer 1
+macr assemblerlinkerprolog 1
+macr assemblerlinkerprolog compilerun 1
+macr c de 1
+macr capabil 1
+macr cel 1
+macr empt 1
+macr expan 1
+macr expr 1
+macr expr expan 1
+macr for help 1
+macr for tim 1
+macr from argon 1
+macr interrupt 1
+macr interrupt bit 1
+macr is automat 1
+macr is describ 1
+macr level 1
+macr monit 1
+macr mut 1
+macr n ecessair 1
+macr nam 1
+macr nam lambd 1
+macr nod 1
+macr or microinstruc 1
+macr pack 1
+macr pipel 1
+macr pipelin 1
+macr pixel 1
+macr prov 1
+macr repr 1
+macr to fit 1
+macr voron 1
+macr voron cel 1
+macrocod 1
+macrocod level 1
+macrocod or intern 1
+macrocod or prolog 1
+macroinstruc 1
+macromolecl 3
+macromolecl compr 1
+macromolecl compr cl 1
+macromolecl structur 1
+macwhin 1
+mad 75
+mad 60k 1
+mad a conjectur 1
+mad a number 1
+mad a revolut 1
+mad a simil 1
+mad about cont 1
+mad about siml 1
+mad acc 1
+mad and justif 1
+mad any us 1
+mad ar object 1
+mad arbitr 2
+mad automat 1
+mad avail 8
+mad avail short 1
+mad awar 2
+mad by brayshaw 1
+mad by defloc 1
+mad by developer 1
+mad by field 1
+mad by mean 1
+mad by numer 1
+mad by remov 1
+mad by self 1
+mad by sv 1
+mad categor 1
+mad claim 1
+mad clear 1
+mad clearer 1
+mad con 1
+mad con using 1
+mad crowd 1
+mad denser 1
+mad ea 2
+mad explicit 2
+mad explicit avail 1
+mad for ea 1
+mad for peopl 1
+mad for reduc 1
+mad form 1
+mad form using 1
+mad from fac 1
+mad had degrad 1
+mad hav degrad 1
+mad if actu 1
+mad im avail 1
+mad in compiler 1
+mad in design 1
+mad in figur 1
+mad in ml 1
+mad in research 1
+mad in term 1
+mad indep 1
+mad inv 1
+mad it ea 3
+mad man claim 1
+mad mor ef 1
+mad mor eff 1
+mad mor lik 1
+mad on behalf 1
+mad opaqu 1
+mad or prop 1
+mad palindrom 1
+mad part 1
+mad peer 1
+mad prev 1
+mad program 1
+mad quick 1
+mad rec 1
+mad recover 1
+mad redund 1
+mad regard 1
+mad regl 1
+mad signif 1
+mad signif progr 1
+mad simil 1
+mad simil stat 1
+mad simpler 1
+mad slight 1
+mad slight simpler 1
+mad solut 1
+mad th assum 1
+mad th ch 1
+mad th commun 1
+mad th implem 1
+mad th point 1
+mad th program 1
+mad th st 1
+mad th subject 1
+mad then unmaintain 1
+mad to accept 1
+mad to accommod 1
+mad to ap 1
+mad to build 1
+mad to character 1
+mad to compar 1
+mad to determin 1
+mad to ensur 2
+mad to ge 1
+mad to isol 1
+mad to loc 1
+mad to log 1
+mad to med 1
+mad to optim 1
+mad to preserv 1
+mad to reduc 1
+mad to specif 2
+mad to term 1
+mad to upd 1
+mad to wait 1
+mad toft 1
+mad us 1
+mad vi 1
+mad whil creat 1
+mad wil affect 1
+madan 1
+madhurim 1
+madhurim gh 1
+madison 3
+madison wisconsin 1
+madrid 4
+madrid wer frequ 1
+maffiol 1
+mag 5
+mag condit 1
+mag se 1
+mag se evalu 1
+mag squar 1
+mag squar puzzl 1
+mag squar solut 1
+mag templ 1
+magaz 8
+magin 1
+magnet 3
+magnet disk 1
+magnet forc 1
+magnet reson 1
+magnet reson mod 1
+magnif 1
+magnif tool 1
+magnitud 18
+magnitud faster 2
+magnitud improv 1
+magnitud longer 1
+magnitud lower 1
+magnitud slower 1
+magnitud smaller 1
+mah 1
+mahalanob 2
+mahalanob dist 2
+mahalanob et le 1
+mahan 1
+maibaum 2
+mail 26
+mail addr 1
+mail and other 1
+mail announc 1
+mail list 1
+mail phon 1
+mail phon fac 1
+mail queu 1
+mail queu act 1
+mail queu dispatch 1
+mail techn 1
+mail techn report 1
+mail to mar 1
+mail ut 1
+mail ut ut.ca.cz 1
+maillon 1
+maillon a la 1
+maillon dan 1
+maillon dan un 1
+maillon de 1
+maillon de la 1
+maillon ne 1
+maillon ne peut 1
+mailq 1
+mailq expr 1
+main 75
+main adv 2
+main and main0 1
+main any further 1
+main appl 1
+main appl ar 1
+main approach 1
+main approach issu 1
+main architectur 2
+main architectur featur 1
+main argum 2
+main ask 1
+main aspect 3
+main ba 1
+main backtrack 1
+main backtrack mechan 1
+main benefit 1
+main bod 1
+main categor 3
+main chang 1
+main character 1
+main cl 2
+main com 1
+main comp 1
+main compar 1
+main compar work 1
+main compon 1
+main comput 1
+main comput cost 1
+main concept 1
+main condit 1
+main condit imp 1
+main connect 1
+main constraint 1
+main construc 1
+main contribut 6
+main crit 1
+main dat 3
+main dat ar 2
+main dat complec 1
+main describ 1
+main design 3
+main design dec 1
+main determin 1
+main differ 4
+main differ w.r.t 1
+main disadv 2
+main du 2
+main exampl 1
+main explor 1
+main explor perform 1
+main fact 4
+main fact involut 1
+main featur 3
+main foc 4
+main for acc 1
+main goal 2
+main goal expr 1
+main id 3
+main id com 1
+main innov 1
+main interest 1
+main issu 3
+main judg 1
+main judg form 1
+main langu 1
+main loop 3
+main loop read 1
+main measur 1
+main mechan 1
+main memor 11
+main memor acc 1
+main memor avail 1
+main memor cop 1
+main memor datab 3
+main memor speed 1
+main memor upd 1
+main nec 1
+main nec reach 1
+main not 1
+main observ 2
+main on var 1
+main or control 1
+main part 2
+main perform 1
+main perform lo 1
+main pr 1
+main problem 4
+main program 2
+main puzzl 1
+main queu 1
+main reason 4
+main reduc 1
+main reduc algorithm 1
+main rel 1
+main resourc 1
+main result 13
+main result con 1
+main result st 1
+main rol 1
+main rout 1
+main rout contain 1
+main runtim 1
+main runtim dat 1
+main spar 1
+main spar dag 1
+main step 3
+main task 1
+main techn 1
+main techn reason 1
+main theorem 1
+main to investig 1
+main to proct 1
+main tren 1
+main tren observ 1
+main typ 2
+main wam 1
+main wam var 1
+main weak 1
+main with valu 1
+main work 1
+main0 1
+mainfram 1
+mainstream 1
+mainstream parallel 1
+mainstream parallel computer 1
+maint 23
+maint a caract 1
+maint a leur 1
+maint a lin 1
+maint act 1
+maint act perform 1
+maint algorithm 2
+maint and lim 1
+maint and upgrad 1
+maint au 2
+maint au ca 1
+maint au nid 1
+maint auteur 1
+maint being requir 1
+maint calculer 1
+maint calculer le 1
+maint ce 1
+maint ce boucl 1
+maint ce qu 1
+maint chang 1
+maint chang ea 1
+maint chang mad 1
+maint cherch 1
+maint chez 1
+maint chez lutilisateur 1
+maint com 2
+maint com cel 1
+maint com le 1
+maint combinaison 1
+maint combinaison lin 1
+maint compr 1
+maint construir 1
+maint construir de 1
+maint convec 1
+maint cost 2
+maint d etailler 1
+maint d eterminer 1
+maint de 3
+maint de coh 1
+maint de courb 1
+maint de la 1
+maint de structur 1
+maint difficult 1
+maint domin 1
+maint du 1
+maint du banc 1
+maint effort 1
+maint en 1
+maint en mesur 1
+maint engineer 1
+maint engineer consult 1
+maint engineer mak 1
+maint envisager 1
+maint envisager la 1
+maint etr 1
+maint etr rang 1
+maint f un 1
+maint g trac 1
+maint illustrer 1
+maint illustrer sur 1
+maint ineff 1
+maint is ea 1
+maint la 1
+maint la boucl 1
+maint le 1
+maint le deux 1
+maint le nid 1
+maint li 2
+maint li es 1
+maint lif 1
+maint lif cycl 1
+maint m inh 1
+maint mechan 1
+maint mechan rest 1
+maint method 1
+maint modif 1
+maint nous 2
+maint nous chantillonnon 1
+maint nous int 1
+maint of cl 1
+maint of direct 1
+maint of object 1
+maint of oper 1
+maint overhead 1
+maint overhead spent 1
+maint partag 1
+maint partag ee 1
+maint perspect 1
+maint ph 1
+maint plus qu 1
+maint point 1
+maint pract 1
+maint problem 1
+maint proc 3
+maint qu 1
+maint qu le 1
+maint qu lon 1
+maint qu sel 1
+maint quel 1
+maint quel dilat 1
+maint savoir 1
+maint savoir si 1
+maint soit 1
+maint soit tr 1
+maint support 2
+maint sur 1
+maint sur le 1
+maint system 1
+maint task 1
+maint test 1
+maint test ba 1
+maint through extern 1
+maint tim 1
+maint tool 1
+maint un 1
+maint ver 1
+maint ver un 1
+maint we wish 1
+maint would eventu 1
+maintain 67
+maintain a backlog 1
+maintain a candid 1
+maintain a centr 1
+maintain a compl 1
+maintain a control 1
+maintain a cop 1
+maintain a counter 1
+maintain a datab 1
+maintain a descript 1
+maintain a flit 1
+maintain a forest 1
+maintain a fr 1
+maintain a list 4
+maintain a loc 2
+maintain a main 1
+maintain a minim 1
+maintain a permut 1
+maintain a piec 1
+maintain a popl 1
+maintain a prec 1
+maintain a profil 1
+maintain a project 1
+maintain a rout 1
+maintain a se 1
+maintain a sequ 1
+maintain a server 1
+maintain a smaller 1
+maintain a span 1
+maintain a timer 1
+maintain a var 1
+maintain a vect 1
+maintain a view 1
+maintain acr read 1
+maintain actu 1
+maintain addit 1
+maintain addit inform 1
+maintain al multicast 1
+maintain al pair 1
+maintain an ack 1
+maintain an assoc 1
+maintain an integr 1
+maintain an oo 1
+maintain and manipl 1
+maintain and oe 1
+maintain and period 1
+maintain and regl 1
+maintain another invar 1
+maintain as part 1
+maintain by acc 1
+maintain by incr 1
+maintain by separ 1
+maintain by using 1
+maintain by vi 1
+maintain c cod 1
+maintain cach 1
+maintain cach coh 1
+maintain cach con 1
+maintain chang 1
+maintain cl 1
+maintain cl libr 1
+maintain cluster 1
+maintain cluster siz 1
+maintain coh 2
+maintain compl 1
+maintain compl hist 1
+maintain complec 1
+maintain complec low 1
+maintain comput 1
+maintain comput tempor 1
+maintain con 4
+maintain differ rout 1
+maintain distribut 1
+maintain distribut st 1
+maintain dur inser 1
+maintain eager 1
+maintain ec 1
+maintain ec propag 1
+maintain eff 1
+maintain establ 1
+maintain establ test 1
+maintain explicit 1
+maintain first pack 1
+maintain for real 1
+maintain frequ 1
+maintain good 1
+maintain good gener 1
+maintain high level 1
+maintain imper 1
+maintain imper cod 1
+maintain in unit 1
+maintain invar 1
+maintain is great 1
+maintain it cop 1
+maintain it port 1
+maintain it st 1
+maintain it transit 1
+maintain knowledg 1
+maintain level 1
+maintain level number 1
+maintain libr 1
+maintain loc 1
+maintain loc cop 1
+maintain longer 1
+maintain longer hist 1
+maintain multipl 1
+maintain multipl ver 1
+maintain network 1
+maintain network topolog 1
+maintain nw 1
+maintain object 2
+maintain object behavior 1
+maintain object orient 1
+maintain oe 1
+maintain of object 1
+maintain on counter 1
+maintain over 1
+maintain over coh 1
+maintain parallel 1
+maintain per proc 1
+maintain perform 1
+maintain pol 1
+maintain pol list 1
+maintain propag 1
+maintain propag pattern 1
+maintain sam tot 2
+maintain sem 1
+maintain sem con 1
+maintain som con 1
+maintain st 1
+maintain st pertain 1
+maintain stat 1
+maintain stat es 1
+maintain system 2
+maintain system perform 1
+maintain system wid 1
+maintain tag 1
+maintain th addit 1
+maintain th aver 1
+maintain th backlog 1
+maintain th cluster 1
+maintain th con 4
+maintain th criter 1
+maintain th cultur 1
+maintain th cur 2
+maintain th dat 1
+maintain th dep 1
+maintain th desir 3
+maintain th fif 1
+maintain th ghost 1
+maintain th ident 1
+maintain th inform 1
+maintain th inter 1
+maintain th interconnect 1
+maintain th invar 2
+maintain th libr 1
+maintain th mean 1
+maintain th object 1
+maintain th order 1
+maintain th pag 1
+maintain th polyhedr 1
+maintain th prolog 1
+maintain th qo 1
+maintain th rel 1
+maintain th repeat 1
+maintain th repl 1
+maintain th se 2
+maintain th simpl 1
+maintain th specif 1
+maintain th st 1
+maintain th stronger 1
+maintain th system 1
+maintain th user 1
+maintain th valu 1
+maintain th virtu 1
+maintain that solut 1
+maintain their coh 1
+maintain their disjoint 1
+maintain tw fl 1
+maintain var 1
+maintain var typ 1
+maintain ver 1
+maintainer 2
+maintainer annot 1
+maintainer annot chang 1
+maintainer can prov 1
+maintainer could prov 1
+maintainer dec 1
+maintainer difficult 1
+maintainer ha modif 1
+maintainer hap 1
+maintainer import 1
+maintainer in term 1
+maintainer introduc 1
+maintainer introduc signif 1
+maintainer is requir 1
+maintainer is unawar 1
+maintainer may examin 1
+maintainer rev 1
+maintainer to annot 1
+maintainer to gain 1
+maintainer to pa 1
+maintainer to propag 1
+maintainer to specif 1
+maintainer to tel 1
+maintainer want 1
+maintainer wh appl 1
+maintainer writ 1
+maintenac 1
+maintenir 3
+maintenir de 1
+maintenir de man 1
+maintenir la 1
+maintenir la coh 1
+maintenir un 1
+maintenir un compil 1
+maintenir un diversit 1
+maintenu 2
+maintenu a la 1
+maintenu coh 1
+maintenu coh erent 1
+maintenu de 1
+maintenu de man 1
+maintenu fort 1
+maintenu fort coh 1
+maitr 1
+majeur 5
+majeur dan 2
+majeur dan la 2
+majeur de 4
+majeur de ce 2
+majeur de chapitr 1
+majeur de lappl 1
+majeur de prolog 1
+majeur est 1
+majeur est toutef 1
+majeur fait 1
+majeur fait dailleur 1
+majeur part 1
+majeur part du 1
+majewsk 1
+major 54
+major adv 5
+major and repr 1
+major aspect 1
+major benefit 1
+major block 1
+major bottleneck 1
+major caus 1
+major chang 1
+major cl 1
+major column 1
+major compon 1
+major concern 1
+major conclus 1
+major conclus deriv 1
+major contribut 2
+major cost 1
+major dat 1
+major dat model 1
+major def 1
+major differ 5
+major direct 1
+major disadv 1
+major disrupt 1
+major docum 1
+major docum block 1
+major don 1
+major drawback 2
+major e par 1
+major emph 1
+major except 1
+major fact 1
+major featur 2
+major foc 1
+major forc 1
+major funct 1
+major gap 1
+major hardwar 1
+major hid 1
+major hid problem 1
+major high 1
+major high level 1
+major hurdl 1
+major influ 1
+major is conp 1
+major issu 1
+major nous 1
+major nous pouvon 1
+major object 1
+major obstacl 1
+major of accuml 1
+major of ca 1
+major of cal 1
+major of connect 1
+major of cur 1
+major of dat 1
+major of ec 1
+major of lp 1
+major of proc 1
+major of recent 1
+major of shar 1
+major of spar 1
+major of subject 1
+major of weight 1
+major order 2
+major part 3
+major perform 1
+major perform trad 1
+major problem 2
+major program 1
+major program paradigm 1
+major reason 2
+major reason why 1
+major recent 1
+major recent developm 1
+major responsibil 1
+major responsibil involut 1
+major sect 1
+major sourc 1
+major step 1
+major strength 1
+major system 1
+major task 1
+major text 1
+major text reg 1
+major theor 1
+major theor framework 1
+major threshold 1
+major threshold parameter 1
+major variabl 1
+major vot 1
+major vot confid 1
+major vot method 1
+major whit 1
+major whit spac 1
+majorer 1
+majorer leur 1
+majorer leur nombr 1
+majorit 2
+majorit e de 2
+mak 109
+mak a big 1
+mak a ch 1
+mak a chang 1
+mak a compar 1
+mak a compl 1
+mak a condit 1
+mak a cop 2
+mak a correct 1
+mak a dec 2
+mak a differ 1
+mak a fast 1
+mak a great 1
+mak a group 1
+mak a mistak 1
+mak a multiproc 2
+mak a pur 1
+mak a recur 1
+mak a request 2
+mak a ser 1
+mak a server 1
+mak a siz 1
+mak a strateg 1
+mak a subdiv 1
+mak a succ 1
+mak a techniqu 1
+mak a val 1
+mak abstract 2
+mak abstract mach 1
+mak abstract model 1
+mak adequ 1
+mak adequ prov 1
+mak al program 1
+mak an assum 1
+mak an bed 1
+mak an environm 1
+mak an init 1
+mak and break 1
+mak anom 1
+mak any assum 1
+mak any chang 1
+mak any gener 1
+mak any recur 1
+mak any sen 1
+mak appl 1
+mak appl mobil 1
+mak assum 1
+mak autom 1
+mak autom chang 1
+mak avail 3
+mak avail event 1
+mak better us 1
+mak between 25k 1
+mak between 50k 1
+mak c somewhat 1
+mak cal 1
+mak cel 1
+mak cfg 1
+mak ch 1
+mak chang 1
+mak channel 1
+mak channel cr 1
+mak clear 1
+mak cluster 1
+mak cod 1
+mak cod gener 1
+mak comparison 2
+mak control 1
+mak control regr 1
+mak cr 1
+mak dct 1
+mak dec 1
+mak deep 1
+mak deep explicit 1
+mak del 1
+mak demand 2
+mak dep 1
+mak dep an 1
+mak design 2
+mak design dec 2
+mak disk 1
+mak disk shar 1
+mak each track 1
+mak edg 1
+mak eff 1
+mak eff algorithm 1
+mak ent 1
+mak env 1
+mak env self 1
+mak environm 1
+mak evalu 1
+mak experim 1
+mak explicit 1
+mak fault 1
+mak fault compl 1
+mak few assum 1
+mak fewer 1
+mak fewer error 1
+mak fil 1
+mak fil system 1
+mak fl 1
+mak fl us 1
+mak for slow 1
+mak for test 1
+mak form 1
+mak fruit 1
+mak fruit comparison 1
+mak funct 2
+mak funct cal 1
+mak further 1
+mak further st 1
+mak good 1
+mak good grammat 1
+mak gu 1
+mak im 1
+mak im superior 1
+mak increm 1
+mak increm chang 1
+mak ind 1
+mak ind build 1
+mak inquir 1
+mak interfac 1
+mak interfac chang 1
+mak interpol 1
+mak interpol nec 1
+mak intuit 1
+mak intuit sen 1
+mak involut 1
+mak it aff 1
+mak it calcl 1
+mak it con 1
+mak it conserv 1
+mak it dec 2
+mak it definit 1
+mak it dep 1
+mak it difficult 3
+mak it ea 9
+mak it explicit 1
+mak it glob 1
+mak it harder 2
+mak it imp 3
+mak it impract 1
+mak it inconv 1
+mak it indeed 1
+mak it inv 1
+mak it me 1
+mak it myop 1
+mak it nec 1
+mak it network 1
+mak it rel 1
+mak it suit 1
+mak it tough 2
+mak it triv 1
+mak it unaccept 1
+mak it unavail 1
+mak item 1
+mak item ea 1
+mak lif 1
+mak lif ea 1
+mak link 1
+mak link list 1
+mak loc 1
+mak loc dec 1
+mak lock 1
+mak maint 1
+mak maint chang 1
+mak maxrol 1
+mak ment 1
+mak minim 1
+mak minim assum 1
+mak minor 1
+mak minor chang 1
+mak mistak 1
+mak mlr 1
+mak mlr recov 1
+mak modif 1
+mak modl 1
+mak mor assum 1
+mak mor sen 1
+mak n step 1
+mak ne 1
+mak network 1
+mak new fac 1
+mak new predict 1
+mak no effort 1
+mak no us 1
+mak non 1
+mak non loc 1
+mak object 1
+mak object st 1
+mak observ 1
+mak on fin 2
+mak on lock 1
+mak onl us 1
+mak optim 1
+mak optim increm 1
+mak optim us 1
+mak or gener 1
+mak our algorithm 1
+mak our model 2
+mak our solut 1
+mak our system 1
+mak particl 1
+mak particl infer 1
+mak peopl 1
+mak peopl help 1
+mak pertin 1
+mak pertin contribut 1
+mak pi 1
+mak pract 1
+mak prec 1
+mak predict 2
+mak proc 2
+mak proc crash 1
+mak procedur 1
+mak procedur cal 1
+mak progr 1
+mak program 2
+mak program harder 1
+mak program using 1
+mak proper 2
+mak proper infer 1
+mak proper upd 1
+mak prov 1
+mak pur 1
+mak pur object 1
+mak qmr 1
+mak random 1
+mak random select 1
+mak re definit 1
+mak refer 1
+mak request 2
+mak return 1
+mak scal 2
+mak scal difficult 2
+mak schem 1
+mak search 1
+mak select 1
+mak sem 1
+mak sem chang 1
+mak sen 9
+mak simil 1
+mak simil argum 1
+mak som approxim 1
+mak som minor 1
+mak specif 1
+mak specif system 1
+mak st 1
+mak st respon 1
+mak step 1
+mak straightfor 1
+mak straightfor us 1
+mak strong 2
+mak strong assum 1
+mak such conflict 1
+mak such heur 1
+mak suggest 1
+mak synchron 1
+mak synchron variabl 1
+mak t denot 1
+mak tdfg 1
+mak th algorithm 1
+mak th allow 1
+mak th appl 2
+mak th assum 1
+mak th bind 1
+mak th bod 1
+mak th ch 4
+mak th chr 1
+mak th chunk 1
+mak th claim 1
+mak th coeff 1
+mak th comparison 1
+mak th compiler 1
+mak th continu 1
+mak th conver 2
+mak th datab 1
+mak th dec 4
+mak th decl 1
+mak th definit 1
+mak th deliv 1
+mak th design 5
+mak th determ 1
+mak th differ 1
+mak th ec 1
+mak th effect 1
+mak th ent 1
+mak th entr 1
+mak th error 1
+mak th estim 1
+mak th except 1
+mak th exposit 1
+mak th forml 1
+mak th ga 1
+mak th goal 1
+mak th identif 1
+mak th implem 1
+mak th init 1
+mak th inser 1
+mak th inst 1
+mak th interfac 1
+mak th job 1
+mak th knowledg 1
+mak th langu 3
+mak th look 1
+mak th mater 1
+mak th mesh 1
+mak th nod 1
+mak th number 2
+mak th optim 1
+mak th paper 1
+mak th parameter 1
+mak th ph 1
+mak th point 1
+mak th power 1
+mak th precondit 1
+mak th prelimin 1
+mak th prob 1
+mak th problem 1
+mak th proc 1
+mak th program 2
+mak th protocol 1
+mak th real 1
+mak th result 1
+mak th rl 1
+mak th satisf 1
+mak th schem 1
+mak th siml 1
+mak th simplif 1
+mak th sit 1
+mak th sort 1
+mak th specif 1
+mak th specl 1
+mak th st 1
+mak th stack 1
+mak th stat 1
+mak th step 1
+mak th submodl 1
+mak th substitut 2
+mak th succeed 1
+mak th system 7
+mak th targ 1
+mak th task 4
+mak th thousand 1
+mak th trac 1
+mak th transit 1
+mak th voron 1
+mak th weight 1
+mak their algorithm 1
+mak their project 1
+mak them good 1
+mak thing 3
+mak thing difficult 1
+mak thing ea 1
+mak to ind 1
+mak trac 1
+mak tradit 1
+mak tradit lp 1
+mak transact 1
+mak transact tim 1
+mak transl 1
+mak tut 1
+mak tut intellig 1
+mak tw cop 1
+mak tw implem 1
+mak u reach 1
+mak understand 1
+mak understand difficult 1
+mak understand ea 1
+mak upd 1
+mak us 21
+mak us inform 1
+mak user 1
+mak user perc 1
+mak using 1
+mak vi 1
+mak virtu 1
+mak virtu art 1
+mak wi 1
+mak wil dep 1
+mak worst 1
+mak worst ca 1
+mak your design 1
+makefil 1
+makefil exampl 1
+makefil exampl show 1
+makeheap 1
+makeheap establ 1
+makepat 1
+makespan 1
+makespan openshop 1
+makespan openshop preempt 1
+makespan openshop schedl 1
+maketriangularheap 1
+maketriangularheap establ 1
+makin 1
+makin of kyot 1
+makinson 1
+makov 1
+makov model 1
+mal 9
+mal a fourn 1
+mal a traiter 1
+mal adapt 1
+mal adapt ee 1
+mal and lar 1
+mal appr 1
+mal appr ehen 1
+mal cl 1
+mal cl es 1
+mal connus 1
+mal de 1
+mal de se 1
+mal en 1
+mal en pr 1
+mal et prolog 1
+mal et sic 1
+mal et sicstus 1
+mal ne 1
+mal ne fait 1
+mal ont 1
+mal pedag. 1
+mal refer 1
+mal refer manu 1
+mal sappu 1
+mal v06 1
+mal wh volunteer 1
+malach 1
+maladr 1
+maladr dan 1
+maladr dan la 1
+maladr dan le 1
+malag 1
+malcolm 1
+malcolm rig 1
+malek 1
+malencontreus 1
+malenf 1
+malform 1
+malgr 4
+malgr e le 2
+malgr e notr 1
+malheureus 4
+malheureus assez 1
+malheureus assez co 1
+malheureus de 1
+malheureus de grain 1
+malheureus obtenir 1
+malheureus on perd 1
+malinowsk 1
+malk 2
+malk refin 1
+mallat 2
+mallat and zhong 1
+malon 1
+malt 1
+malumbr 1
+malusz 1
+malusz nsk 1
+mam 1
+mamdan 2
+man 42
+man a se 1
+man a sequ 1
+man a tr 1
+man and cybernet 1
+man and proc 1
+man complec 2
+man concur 1
+man concur acc 1
+man cybernet 1
+man developm 1
+man each partit 1
+man er 2
+man er ad 1
+man er al 1
+man er analogu 1
+man er anticip 1
+man er classiqu 2
+man er de 2
+man er direct 1
+man er dual 1
+man er dur 1
+man er efficac 1
+man er entr 1
+man er equiv 1
+man er evid 1
+man er impr 1
+man er incr 1
+man er int 1
+man er la 1
+man er lim 1
+man er modulair 1
+man er monolithiqu 1
+man er not 1
+man er paresseus 1
+man er pr 1
+man er qu 2
+man er quun 1
+man er similair 2
+man er simpl 1
+man er sp 1
+man er strict 1
+man er suiv 3
+man er syst 2
+man er tot 1
+man er tr 1
+man fiv dat 1
+man imag 1
+man mach 4
+man mach stud 4
+man memor 1
+man multicast 1
+man multicast commun 1
+man nam 1
+man nam paul 1
+man pag 2
+man phy 1
+man phy log 1
+man re de 1
+man re exact 1
+man re intrin 1
+man record 1
+man record repl 1
+man scal 1
+man son 1
+man spat 1
+man spat dat 1
+man such chang 1
+man th complec 1
+man th cop 1
+man th environm 1
+man th event 1
+man th phy 1
+man th plac 1
+man th queu 1
+man them increm 1
+man theor 1
+man to big 1
+man. 1
+man.tic 1
+man89 1
+manag 40
+manag and cod 1
+manag and failur 1
+manag and garb 1
+manag and incorpor 1
+manag by assoc 1
+manag by compiler 1
+manag by glob 1
+manag by rmsp 1
+manag car 1
+manag coalit 1
+manag coalit specif 1
+manag coh 1
+manag complec 1
+manag complec dep 1
+manag facil 1
+manag for concur 1
+manag for datab 1
+manag for distribut 1
+manag for sequ 1
+manag from softwar 1
+manag funct 1
+manag funct sketch 1
+manag group 1
+manag id 1
+manag id describ 1
+manag in loc 1
+manag in mult 1
+manag in multiproc 1
+manag in quicksilver 1
+manag in recent 1
+manag in scal 1
+manag inform 1
+manag inform system 1
+manag is achief 1
+manag is tak 1
+manag issu 1
+manag lim 1
+manag method 1
+manag method using 1
+manag of choicepoint 1
+manag of dat 5
+manag of distribut 1
+manag of med 1
+manag of phy 1
+manag of program 1
+manag of rol 1
+manag of specif 1
+manag oper 1
+manag overhead 1
+manag pol 2
+manag pol design 1
+manag pol lm 1
+manag pr 1
+manag primitiv 1
+manag problem 1
+manag protocol 1
+manag sc 1
+manag schem 3
+manag softwar 1
+manag strateg 2
+manag system 8
+manag system ba 1
+manag task 1
+manag techniqu 2
+manag techniqu describ 1
+manag techniqu disc 1
+manag techniqu work 1
+manag tool 1
+manag unit 2
+manag unit deal 1
+managem 1
+managem system 1
+manager 16
+manager actu 1
+manager actu handl 1
+manager agent 1
+manager and project 1
+manager and skil 1
+manager arrang 1
+manager at level 1
+manager aud 1
+manager b var 1
+manager begin 1
+manager being un 1
+manager buffer 1
+manager buffer manager 1
+manager by budg 1
+manager dept 1
+manager dept m1 1
+manager detect 1
+manager determin 1
+manager enabl 1
+manager for 1
+manager from dept 1
+manager hist 1
+manager interfac 1
+manager is inform 1
+manager j accept 1
+manager j confirm 1
+manager j oe 1
+manager j screen 1
+manager label 1
+manager label accept 1
+manager label confirm 1
+manager label displ 1
+manager label screen 1
+manager log 1
+manager log manager 1
+manager maintain 1
+manager maintain var 1
+manager man 1
+manager may ea 1
+manager med 1
+manager med manager 1
+manager nod 1
+manager nod manager 1
+manager nod managerqueu 1
+manager period 1
+manager queu 1
+manager queu manager 1
+manager sen 1
+manager that multicast 1
+manager that us 1
+manager to keep 1
+manager to obtain 1
+manager valu 1
+manager which support 1
+managerkernel 1
+managerkernel control 1
+managerkernel control agentprolog 1
+managerqueu 1
+managerqueu manager 1
+managerqueu manager queu 1
+managerresourc 1
+managerresourc managertransact 1
+managertransact 1
+manageru 1
+managerv 1
+managerv from deptttl 1
+manber 1
+manchand 1
+manchester 3
+manchester dataflow 1
+manchester dataflow mach 1
+manchester prototyp 1
+manchester prototyp dataflow 1
+manchester univer pr 1
+mancl 1
+mancl and havan 1
+mand 6
+mand and maxim 1
+mand co 1
+mand constraint 1
+mand privileg 1
+mand privileg se 1
+mand subband 1
+mand transform1 1
+mand tw spac 1
+mand. 1
+mandel 1
+manderick 1
+manderick introduc 1
+mandril 1
+mandril imag 1
+maneuver 1
+mangus 1
+mangus christerson 1
+manh 1
+manh ch 1
+manhattan 1
+manifest 2
+manifest pa 1
+manifest pa un 1
+manifest with abstract 1
+manifold 3
+manifold of featur 1
+manifold to 2d 1
+manipl 33
+manipl a ba 1
+manipl a caus 1
+manipl a pen 1
+manipl algorithm 1
+manipl algorithm giv 1
+manipl and composit 1
+manipl and featur 1
+manipl and filter 1
+manipl and heter 1
+manipl and parameter 1
+manipl and upd 1
+manipl by eram 1
+manipl by program 1
+manipl ce 1
+manipl collect 1
+manipl constraint 1
+manipl de 1
+manipl de adr 1
+manipl de point 1
+manipl dialog 1
+manipl e par 1
+manipl ee 1
+manipl es 1
+manipl graph 1
+manipl graph structur 1
+manipl imag 1
+manipl imag ba 1
+manipl in var 1
+manipl interfac 1
+manipl is perform 1
+manipl le 1
+manipl le point 1
+manipl multipl 1
+manipl multipl infinit 1
+manipl object 2
+manipl object defin 1
+manipl of spar 1
+manipl of spat 1
+manipl on constraint 1
+manipl onl integer 1
+manipl parallel 1
+manipl screen 1
+manipl screen spac 1
+manipl structur 2
+manipl subexpr 1
+manipl sur 1
+manipl sur lalg 1
+manipl system 1
+manipl tempor 2
+manipl tempor dat 2
+manipl th const 1
+manipl th el 1
+manipl th garb 1
+manipl th graph 1
+manipl to equ 1
+manipl tr 1
+manipl tr structur 1
+manipl user 1
+manipl user interfac 1
+manipl var 1
+manipl var boolean 1
+manipuler 2
+manipuler du 1
+manipuler du cod 1
+manipuler informatiqu 1
+manipuler informatiqu le 1
+manipuler le 1
+manipuler le compteur 1
+manmach 1
+manmach stud 1
+mannequin 1
+mannequin assoc 1
+manner 48
+manner analog 1
+manner ar pr 1
+manner best suit 1
+manner by repr 1
+manner by using 1
+manner con 1
+manner connect 1
+manner connect orient 1
+manner correspon 1
+manner dep 1
+manner describ 1
+manner int 1
+manner of distribut 1
+manner of fig 1
+manner of introduc 1
+manner of relationship 1
+manner of track 1
+manner on nod 1
+manner paradigm 1
+manner prev 1
+manner prev describ 1
+manner simil 1
+manner that suit 1
+manner through adapt 1
+manner to ar 1
+manner using 1
+manner without modif 1
+manojit 1
+manojit sarkar 1
+manol 2
+manol fanel 1
+manol marazak 1
+manqu 2
+manqu con 1
+manqu de 2
+manqu de flexibilit 1
+manqu de plac 1
+manscript 1
+mansour 1
+manu 31
+manu and definit 1
+manu construc 1
+manu construc grammar 1
+manu control 1
+manu control cruisest 1
+manu for id 1
+manu implem 1
+manu in addit 1
+manu input 1
+manu inspect 1
+manu ir 1
+manu ir filter 1
+manu mak 1
+manu mak tdfg 1
+manu seed 1
+manu seed fault 1
+manu trad 1
+manu upd 1
+manu ver 1
+manu wil nec 1
+manu. 1
+manuel 3
+manuel de 2
+manuel de sicstus 1
+manufactur 5
+manufactur artifact 1
+manufactur by transit 1
+manufactur famil 1
+manufactur fault 1
+manufactur modif 1
+manufactur modif ver 1
+manufactur test 1
+manufactur test suit 1
+manufactur th memor 1
+manufacturer 3
+manufacturer in layer 1
+manufacturer pr 1
+manuscript 7
+manuscrit 2
+manuscrit devrait 1
+manuscrit devrait permettr 1
+manuscrit et pr 1
+manuscrit le 1
+manuscrit le ba 1
+manuscrit na 1
+manuscrit na pa 1
+manuscrit ne 1
+manuscrit ne tien 1
+manuscrit rep 1
+manuscrit rep ent 1
+map 54
+map 16x 1
+map 16x map 1
+map 1x 1
+map 2x 1
+map 2x map 1
+map 4x 1
+map 4x map 1
+map 8x 1
+map 8x map 1
+map a detail 1
+map a hist 1
+map a major 1
+map a pair 1
+map a traver 1
+map ae 1
+map algorithm 1
+map algorithm prov 1
+map an upd 1
+map and construc 1
+map and test 1
+map ar prop 1
+map between compon 1
+map between procedur 1
+map between resourc 1
+map between substr 1
+map by neur 1
+map by replac 1
+map c1 1
+map cach 1
+map complec 1
+map dat 4
+map dat cach 1
+map dat structur 1
+map defin 1
+map denot 1
+map dispid 1
+map div 1
+map eff 2
+map el 1
+map f map 1
+map f0 1
+map for cont 1
+map form 1
+map from ar 1
+map from rel 1
+map from sign 1
+map from sub 1
+map from t2 1
+map from unrestrict 1
+map from variabl 1
+map funct 2
+map h dep 1
+map h ext 1
+map hk 1
+map improv 1
+map int kick 1
+map irregl 1
+map irregl parallel 1
+map is monot 1
+map is nec 1
+map is obtain 1
+map is var 1
+map it output 1
+map loc 1
+map loc dat 1
+map look 1
+map look prom 1
+map map 1
+map memor 2
+map memor exper 1
+map modl 1
+map modl nam 1
+map nest 1
+map nest loop 1
+map oe 2
+map oe2 1
+map of gp 1
+map of parallel 2
+map of procedur 1
+map of sourc 1
+map of unseen 1
+map on underl 2
+map ont regl 1
+map over compl 1
+map parallel 2
+map parallel algorithm 1
+map parallel comput 1
+map problem 2
+map program 1
+map program graph 1
+map project 1
+map r1 1
+map r1 rl 1
+map re 1
+map reg 1
+map repr 1
+map repr veg 1
+map rl 1
+map satisf 1
+map simil 1
+map siz 1
+map ss 1
+map st 1
+map stack 1
+map stack el 1
+map strateg 1
+map task 1
+map termin 1
+map th abstract 1
+map th avail 1
+map th const 1
+map th input 1
+map th low 1
+map th re 1
+map th row 1
+map th singl 1
+map th slrn 1
+map th sum 1
+map th tth 1
+map that assoc 1
+map to 16x 1
+map to avail 1
+map to dispid 1
+map to establ 1
+map to input 1
+map to output 1
+map tp 2
+map typ 1
+map we env 1
+map with parallel 1
+map1 1
+map1 and map2 1
+map2 1
+mapb 1
+mapl 2
+mapl de 1
+mapl de calcl 1
+mapl la 1
+mapl la structur 1
+mapl publ 1
+mapl v langu 1
+maqu 1
+maqu de 1
+maqu de siml 1
+mar 17
+mar allow 1
+mar and obtain 1
+mar ar measur 1
+mar ar spf 1
+mar can writ 1
+mar ch 1
+mar ch me 1
+mar crash 1
+mar cur 2
+mar cur prov 1
+mar cur support 1
+mar di.ucm.es 1
+mar en 1
+mar en ont 1
+mar ext 1
+mar ext netsim 1
+mar graph 1
+mar ha link 1
+mar in var 1
+mar interact 1
+mar interfac 1
+mar is avail 1
+mar is compil 1
+mar is develop 1
+mar is start 1
+mar jean 1
+mar jean harrold 1
+mar prov 1
+mar prov record 1
+mar rel 1
+mar rel issu 1
+mar rodr 1
+mar skov 1
+mar skov fon 1
+mar th door 1
+mar to evalu 1
+mar to siml 1
+mar user 1
+mar user cs.umd.edu1 1
+mar user request 1
+mar work 1
+mar88 1
+marazak 1
+marc 10
+marc comin 1
+marc gengler 1
+marc gysin 1
+marc snir 1
+marc speh 1
+marcel 3
+marcel dekker 2
+march 44
+march april 1
+march avant 1
+march cub 1
+march estim 1
+march estim reason 1
+march lin 1
+march lin algorithm 1
+march tetrahedr 1
+marchionin 1
+mard 1
+maresc 1
+marg 1
+marg de 1
+marg de la 1
+margar 2
+margar el 1
+margar sp 1
+margherit 3
+margherit ligur 1
+margin 12
+margin amount 1
+margin ar av 1
+margin calcl 1
+margin commun 1
+margin den 1
+margin distribut 1
+margin exact 1
+margin interest 1
+margin last commun 1
+margin ma 1
+margin ma pa 1
+margin measur 1
+margin probabil 1
+margin si 1
+margin speedup 1
+margin var 1
+margin wid 1
+margin wid rapid 1
+marginaux 2
+marginaux si 1
+marginaux si la 1
+margit 1
+margit kinder 1
+marijuan 1
+marinescu 1
+marinescu and benjamin 1
+marinus 1
+marius 1
+marius zimand 1
+mark 54
+mark a natur 1
+mark aagaard 1
+mark act 1
+mark and sweep 1
+mark apperl 2
+mark as del 1
+mark as non 1
+mark both nod 1
+mark by oval 1
+mark c visit 1
+mark c0 1
+mark c0 visit 1
+mark cel 1
+mark cel endif 1
+mark center 1
+mark certain tr 1
+mark chr 1
+mark compar 1
+mark dat 1
+mark drawn 1
+mark entr 1
+mark entr entr0 1
+mark explor 1
+mark forc 1
+mark franklin 1
+mark green 1
+mark green nod 1
+mark greenstr 1
+mark hil 1
+mark horowitz 1
+mark if mi 1
+mark in transit 1
+mark inact 1
+mark inclus 1
+mark interest 1
+mark linderman 1
+mark link 1
+mark link ph 1
+mark lo 1
+mark mean 1
+mark mi 1
+mark must consider 1
+mark nod 3
+mark onl requir 1
+mark p30 1
+mark p30 visit 1
+mark pack 1
+mark pag 1
+mark point 1
+mark red 1
+mark ring 1
+mark s visit 1
+mark s10 1
+mark s10 visit 1
+mark s2 1
+mark s2 s20 1
+mark s3 1
+mark s3 s30 1
+mark s3 visit 1
+mark s30 1
+mark s30 visit 1
+mark som nod 1
+mark step 1
+mark succ 1
+mark succ predict 1
+mark symbol 1
+mark th begin 2
+mark th correspon 1
+mark th en 1
+mark th exit 1
+mark th op 1
+mark th part 1
+mark th point 1
+mark th turnstil 1
+mark th valu 1
+mark to ind 1
+mark twain 1
+mark ut 1
+mark ver 1
+mark x act 1
+mark yellow 1
+mark yellow endpoint 1
+mark yellow nod 1
+markat 1
+markel 1
+marker 2
+marker and sect 1
+marker ar comp 1
+marker ar incr 1
+marker compact 1
+marker compact counter 1
+marker contain 1
+marker for contigu 1
+marker m6 1
+marker to av 1
+marker val 1
+marker valu 1
+markov 6
+markov and non 1
+markov chain 3
+markov chain an 1
+markov chain mont 1
+markov chain propag 1
+markov de 1
+markov de processus 1
+markov dont nous 1
+markov environm 1
+markov ergodiqu 1
+markov est 1
+markov est lab 1
+markov fin 1
+markov homog 1
+markov homog en 1
+markov homog en.la 1
+markov interfac 1
+markov ir 1
+markov ir educ 1
+markov maz 1
+markov maz task 1
+markov model 1
+markov network 1
+markov proc 1
+markov sont 1
+markov sont exploit 1
+markov tr 1
+markup 2
+markup html 1
+markup html spec 1
+markup langu 1
+markup langu html 1
+markup langu specif 1
+markus 3
+markus kom 1
+markus tresch 1
+markus.gr 1
+marlow 1
+maron 1
+marqu 4
+marqu accessibl 1
+marqu accessibl constitu 1
+marqu accessibl du 1
+marqu accessibl dun 1
+marqu cour 1
+marqu cour xn 1
+marqu de 2
+marqu de dic 1
+marqu de la 1
+marqu don 1
+marqu du 1
+marqu e de 1
+marqu e par 1
+marqu ee 1
+marqu ee par 1
+marqu es 1
+marqu es correspon 1
+marqu et compact 1
+marqu et cop 1
+marqu et la 1
+marqu evit 1
+marqu evit qu 1
+marqu import 1
+marqu import qu 1
+marqu init 1
+marqu init du 1
+marqu init ne 1
+marqu le 1
+marqu le cou 1
+marqu lendroit 1
+marqu mk 1
+marqu mk atteint 1
+marqu mk est 1
+marqu mk par 1
+marqu mk si 1
+marqu mk tel 1
+marqu mn 1
+marqu s de 1
+marqu xi 1
+marqu xn 1
+marqu xn pour 1
+marquardt 1
+marquardt approxim 1
+marquer 1
+marquer lanc 1
+marquer lanc var 1
+marqueur 1
+marqueur syntaxiqu 1
+marrakch 1
+marrakch troud 1
+marriot 1
+marseil 1
+marsmeterwindow 1
+marst 1
+mart 4
+mart con 1
+mart continu 1
+mart continu dan 1
+mart dan 1
+mart dan le 1
+mart for defin 1
+mart ha dep 1
+mart in tim 1
+mart sirkin 1
+mart sur 1
+mart sur un 1
+martel 3
+martensstr 1
+martign 1
+martin 11
+martin and billman 1
+martin and death 1
+martin and felt 1
+martin and nipkow 1
+martin billman 1
+martin eldrach 1
+martin for insight 1
+martin hofman 1
+martin huhn 1
+martin knowledg 1
+martin knowledg system 1
+martin l of 1
+martin steff 1
+martinez 2
+martinez computer 1
+martinez computer sc 1
+martinez cs.byu.edu 1
+martlesham 1
+martlesham heath 1
+marvel 1
+marvel dev 1
+maryland 9
+maryland colleg 2
+maryland colleg park 2
+maryland rout 1
+maryland rout siml 1
+maryland techn 1
+maryland techn report 1
+marzl 1
+mask 6
+mask a singl 1
+mask by ad 1
+mask by requir 1
+mask by vot 1
+mask commun 1
+mask commun del 1
+mask commun lat 1
+mask fault 1
+mask fault toler 1
+mask techniqu 1
+mask th commun 1
+mask toler 1
+maslov 1
+maslov william 1
+maslov william pugh 1
+masood 1
+masood cs.waikat.ac.nz 1
+masood et al 1
+masood masood 1
+maspar 2
+maspar libr 1
+maspar libr rout 1
+maspar mach 1
+maspar mach involut 1
+maspar mesh 1
+maspar mp 1
+maspar mp libc.h 1
+maspar parallel 1
+maspar parallel langu 1
+maspar rout 1
+maspar runtim 1
+masquer 1
+masquer la 1
+masquer la non 1
+massachus 12
+massachus institut 3
+massif 1
+massif pour 1
+massif pour un 1
+massiv 1
+massiv par 1
+massiv par el 1
+master 17
+master and slav 1
+master by teach 1
+master can expan 1
+master control 1
+master control window 1
+master go 1
+master loc 1
+master loc algorithm 1
+master loc direct 1
+master loc interfac 1
+master loc return 1
+master loc se 1
+master loc system 1
+master of sc 1
+master or slav 1
+master proc 2
+master proc encounter 1
+master proc execut 1
+master proc memor 1
+master proc wh 1
+master s th 1
+master sen 1
+master server 1
+master server activ 1
+master serverserver 1
+master serverserver 1server 1
+master sit 1
+master th 8
+master th objectiv 1
+master th uncertaint 1
+masud 1
+masugan 1
+masuhar 1
+masuhar grac.c.u 1
+masuhar grac.c.u tok.ac.jp 1
+masunag 1
+mat 17
+mat and a.u 1
+mat carlsson 1
+mat er 2
+mat eriau 1
+mat eriel 3
+mat eriel aurait 1
+mat eriel dan 1
+mat eriel don 1
+mat eriel evit 1
+mat eriel pourrait 1
+mat eriel qu 1
+mat riel 1
+mat riel ducatif 1
+mat riel interactif 1
+mat string 1
+matador 1
+matador and aficionad 1
+matador fr 1
+matam 1
+match 54
+match 3d 1
+match 3d curv 1
+match a canon 1
+match a claus 1
+match a giv 1
+match a posit 1
+match a term 1
+match a ver 1
+match abstract 1
+match abstract solut 1
+match adver 1
+match adver affect 1
+match against program 1
+match ai 1
+match algorithm 5
+match altern 1
+match altern answer 1
+match alw ec 1
+match an expect 1
+match and heav 1
+match and mark 1
+match and plac 1
+match and register 1
+match and replac 1
+match and select 1
+match and syntact 1
+match and unif 1
+match appl 2
+match approach 1
+match approach describ 1
+match ar comput 1
+match ar discard 1
+match assum 1
+match assum underl 1
+match at step 1
+match between a1 1
+match between a3 1
+match between ai 1
+match between job 1
+match by hem 1
+match by incr 1
+match by mi 1
+match can occur 1
+match canon 1
+match canon inst 1
+match chem 1
+match chem structur 1
+match cl 3
+match cl specif 1
+match claus 1
+match cod 1
+match connect 1
+match context 1
+match could com 1
+match describ 1
+match differ kind 1
+match disconnect 1
+match disconnect nod 1
+match dur coar 1
+match ec 2
+match eff 1
+match el 1
+match en 1
+match en somewh 1
+match ever harder 1
+match fail 1
+match for ai 1
+match for coar 1
+match for en 1
+match for ind 1
+match for loc 1
+match for register 1
+match fund 2
+match fx 1
+match fx fgt 1
+match ha cost 1
+match handwrit 1
+match handwrit drawn 1
+match ignor 1
+match imag 1
+match in bipart 1
+match in comput 1
+match in dioeer 1
+match in model 1
+match in protein 1
+match in sublin 1
+match inform 1
+match init 1
+match int multinod 1
+match involut 1
+match is ba 1
+match is comput 1
+match is construc 1
+match is establ 1
+match is o.je 1
+match it el 1
+match langu 1
+match method 1
+match mi 1
+match neighbor 1
+match neighbor block 1
+match object 1
+match object select 1
+match obtain 1
+match of 3d 1
+match of bipart 1
+match of brain 1
+match of gi 1
+match of keyword 1
+match of maxim 1
+match of objectm 1
+match of protein 1
+match of tempor 1
+match or classif 1
+match or rang 1
+match over karyp 1
+match paradigm 1
+match perform 2
+match perform bound 1
+match point 1
+match probabil 1
+match problem 1
+match proc 1
+match program 2
+match program claus 1
+match proper 1
+match proper requir 1
+match pursuit 1
+match r refl 1
+match retrief 1
+match return 1
+match rewrit 1
+match rewrit rl 1
+match schem 2
+match schem describ 1
+match schem perform 1
+match softwar 1
+match sw 1
+match synonym 1
+match synonym hypernym 1
+match techniqu 2
+match th actu 1
+match th argum 1
+match th assum 1
+match th conclus 1
+match th condit 1
+match th constraint 1
+match th context 1
+match th cur 1
+match th fft 1
+match th fnam 1
+match th goal 1
+match th incr 1
+match th input 1
+match th invoc 1
+match th liter 2
+match th percept 1
+match th perform 1
+match th point 1
+match th result 1
+match th speed 1
+match th tempor 1
+match th tim 1
+match th virtu 1
+match that inclus 1
+match that tr 1
+match to giv 1
+match tok 1
+match tool 1
+match tupl 1
+match tw com 1
+match upper 1
+match upper bound 1
+match view 1
+match vs 1
+match vs hem 1
+match wider 1
+match wider dat 1
+match with bound 1
+match with dist 1
+match with job 1
+match with maxim 1
+matem 1
+mater 11
+mater acr mach 1
+mater ar cont 1
+mater avail 1
+mater can us 1
+mater induc 1
+mater int ea 1
+mater on grammar 1
+mater pr 1
+mater problem 1
+mater self 1
+mater self contain 1
+mater should prov 1
+mater th result 1
+mater to ea 1
+mater to incorpor 1
+mater view 1
+mater wa high 1
+math 17
+math emat 1
+math emat abord 1
+math ematiqu 3
+math ematiqu de 3
+math ematiqu ont 1
+math ematiqu perm 1
+math ematiqu pour 1
+math ematiqu selon 1
+math ematiqu util 1
+math matiqu 1
+math matiqu au 1
+math matiqu de 1
+math matiqu dun 1
+math matiqu pour 1
+math matiqu usuel 1
+math.bath.ac.uk 1
+math.h 1
+math.h def 1
+math.h def mac 1
+mathem 3
+mathemat 44
+mathemat an 1
+mathemat and artif 1
+mathemat and computer 3
+mathemat and informat 2
+mathemat and modeltheor 1
+mathemat and phy 1
+mathemat and theor 2
+mathemat and work 1
+mathemat ba 1
+mathemat computer 1
+mathemat computer sc 1
+mathemat correct 1
+mathemat correct proof 1
+mathemat definit 1
+mathemat descript 1
+mathemat engineer 1
+mathemat found 3
+mathemat funct 1
+mathemat georg 1
+mathemat georg institut 1
+mathemat imag 2
+mathemat in sc 1
+mathemat introduc 1
+mathemat log 2
+mathemat measur 1
+mathemat model 1
+mathemat of control 1
+mathemat of oper 1
+mathemat optim 1
+mathemat prec 1
+mathemat program 3
+mathemat program stud 1
+mathemat reason 1
+mathemat requir 1
+mathemat research 3
+mathemat research centr 1
+mathemat research group 1
+mathemat research staff 1
+mathemat rutger 1
+mathemat sc 4
+mathemat soc 3
+mathemat softwar 2
+mathemat specif 1
+mathemat structur 2
+mathemat subrout 1
+mathemat theor 2
+mathemat tool 1
+mathemat toolkit 1
+mathemat train 1
+mathemat univer 1
+mathematik 5
+mathematik und 2
+mathematik und datenverarbeitung 2
+mathematik.tu 1
+mathematik.tu chemnitz.de 1
+mathematik.tu chemnitz.de mehrman 1
+mathematisch 1
+mathematisch centr 1
+mathew 1
+mathieu 1
+mathieu and i.daubech 1
+mathur 1
+matiasek 1
+matiqu 1
+matiqu au 1
+matiqu au sen 1
+matiqu de 1
+matiqu de la 1
+matiqu de rot 1
+matiqu dun 1
+matiqu dun var 1
+matiqu pour 1
+matiqu pour aborder 1
+matiqu usuel 1
+matlab 1
+matlab program 1
+matr 31
+matr 64ec 1
+matr 64ec 128ec 1
+matr a de 1
+matr a repr 1
+matr a0 1
+matr a00 1
+matr a01f 1
+matr ablog 1
+matr ablog tc 1
+matr ad2at 1
+matr ad2at remain 1
+matr ai 1
+matr ain 1
+matr ain construit 1
+matr aj 1
+matr an 2
+matr anal 1
+matr and put 1
+matr and vect 1
+matr ant 1
+matr ant sym 1
+matr antisym 1
+matr antisym triqu 1
+matr appl 1
+matr approxim 1
+matr ar 3
+matr ar aw 1
+matr ar comput 1
+matr ar describ 1
+matr ar determin 1
+matr ar giv 1
+matr ar good 1
+matr ar known 1
+matr ar overwrit 1
+matr assoc 2
+matr avec 1
+matr avec la 1
+matr ayant 1
+matr bbmat 1
+matr bcsstk32 1
+matr bi 1
+matr both hem 1
+matr brack2 1
+matr by mean 1
+matr c0 1
+matr car 2
+matr car ee 1
+matr chap 1
+matr column 1
+matr column correspon 1
+matr comput 2
+matr conjectur 1
+matr conjugu 1
+matr conserv 1
+matr conserv le 1
+matr consider 1
+matr contain 1
+matr copter2 1
+matr creus 1
+matr creus sur 1
+matr d riv 1
+matr dat 1
+matr de 3
+matr de cofacteur 1
+matr de covar 1
+matr de dissimilarit 1
+matr de don 1
+matr de grand 1
+matr de mn 1
+matr de proxim 1
+matr de rot 1
+matr de tail 2
+matr de transform 1
+matr de transit 1
+matr decomposit 1
+matr dep 1
+matr diagon 3
+matr diagon ayant 1
+matr diagon cont 1
+matr diagon de 1
+matr dim 1
+matr dinc 1
+matr dinc avant 1
+matr dinc du 1
+matr direct reflect 1
+matr dit 1
+matr dit de 1
+matr dur fact 1
+matr el 1
+matr et don 1
+matr et du 1
+matr et dun 1
+matr et tendr 1
+matr fact 2
+matr fact deriv 1
+matr finan512 1
+matr for skew 1
+matr from environm 1
+matr from fe 1
+matr from row 1
+matr from singl 1
+matr from structur 1
+matr gklr 1
+matr hem 1
+matr hi 1
+matr identit 2
+matr in tabl 2
+matr in wgp 1
+matr inpr1 1
+matr intern 1
+matr inver 1
+matr is defin 1
+matr is dimin 1
+matr is gener 1
+matr is integr 1
+matr is pr 1
+matr is regl 1
+matr is reorder 1
+matr jacob 1
+matr ken 1
+matr m non 1
+matr m stochastiqu 1
+matr m1 1
+matr m14b 1
+matr ma 1
+matr ma illustron 1
+matr mad 1
+matr mor amen 1
+matr multilevel 1
+matr multilevel recur 1
+matr multip 1
+matr multipl 3
+matr multipl algorithm 1
+matr multipl follow 1
+matr multipl problem 1
+matr n cessitait 1
+matr nam 1
+matr ne 1
+matr ne nous 1
+matr non 1
+matr non ent 1
+matr non unimodulair 1
+matr obtain 1
+matr of finit 1
+matr of g0 1
+matr of order 2
+matr of random 1
+matr of rat 1
+matr of simil 1
+matr of siz 2
+matr of suit 1
+matr oft becom 1
+matr or order 1
+matr or se 1
+matr or vot 1
+matr order 2
+matr order algorithm 1
+matr order ba 1
+matr order method 1
+matr order pack 1
+matr order subrout 1
+matr order system 2
+matr osl 1
+matr osl order 1
+matr p de 1
+matr plot 1
+matr plot appear 1
+matr posit 1
+matr posit est 1
+matr prim 1
+matr proceed 1
+matr qu 1
+matr qu la 1
+matr r educ 1
+matr r eel 1
+matr r el 1
+matr rationnel 1
+matr rationnel non 1
+matr rectangulair 1
+matr reorder 1
+matr s crit 1
+matr satisf 1
+matr satisf daut 1
+matr shy161 1
+matr solut 1
+matr sont 1
+matr sont maint 1
+matr stochastiqu 1
+matr stochastiqu avec 1
+matr stochastiqu don 1
+matr stochastiqu posit 1
+matr stochastiqu st 1
+matr sym 1
+matr sym triqu 1
+matr t requir 1
+matr t tel 1
+matr t transform 1
+matr tak 1
+matr tak tw 1
+matr technolog 1
+matr term 1
+matr test 1
+matr th differ 1
+matr that impl 1
+matr ti 1
+matr to reduc 1
+matr transform 1
+matr transp 1
+matr transp ee 1
+matr transposit 1
+matr transposit algorithm 1
+matr transposit problem 1
+matr triangulair 1
+matr triangulair prop 1
+matr typ 1
+matr unimodulair 1
+matr unimodulair afin 1
+matr using 2
+matr using multisect 1
+matr util 1
+matr util ee 1
+matr vect 2
+matr vect multipl 1
+matr vect produc 1
+matr vecteur 1
+matr venkat25 1
+matr vtot 1
+matr vtot contain 1
+matr wa approxim 1
+matr wav 1
+matr we plot 1
+matr wer comput 1
+matr wer determin 1
+matr wh row 1
+matr when window 1
+matr with arbitr 1
+matr with bandwidth 1
+matr with eigensolut 1
+matr with eigenvect 1
+matr with entr 1
+matr with ident 1
+matr with larger 1
+matr with zer 1
+matr without bandwidth 1
+matr x solut 1
+matr x tx 1
+matr xx 1
+matr. 1
+matriciel 3
+matriciel assoc 1
+matriciel converg 1
+matriciel et vectoriel 1
+matriciel fondam 1
+matriciel fondam partag 1
+matriciel ma 1
+matriciel ma cel 1
+matrixvect 1
+matrixvect produc 1
+matrixvect produc dep 1
+matriz 1
+matsliach 1
+matsu 1
+matsu ipl.t 1
+matsud 1
+matsuok 2
+matsushit 3
+matsushit inform 3
+matsushit inform technolog 3
+mattavel 1
+matter 25
+matter how good 1
+matter how user 1
+matter of fact 2
+matter of hour 1
+matter of incr 1
+matter of reduc 1
+matter of repr 1
+matter of secon 1
+matter of show 1
+matter of speed 1
+matter to determin 1
+matter wh 1
+matter which proof 1
+mattern 2
+matth 4
+matth framework 1
+matth schneiderhufschmidt 1
+matthew 1
+matthieu 1
+matthieu martel 1
+matund 1
+matund nyancham 1
+matund nyancham sylv 1
+matur 6
+matur form 1
+matur form definit 1
+matur ind 1
+matur of ba 1
+matwin 1
+maud 1
+maud an object 1
+maud modl 1
+maud to maudelog 1
+maudelog 1
+maudelog which inclus 1
+maug 1
+maug dept 1
+mauldin 1
+maun 2
+mauv 4
+mauv attribut 1
+mauv attribut init 1
+mauv cod 1
+mauv cod de 1
+mauv comport 1
+mauv comport lorsqu 1
+mauv de 1
+mauv de la 1
+mauv esc 1
+mauv fonct 1
+mauv fonct sp 1
+maux 1
+mavronicol 1
+maxbloc 1
+maxbloc nprim 1
+maxboard 2
+maxboard siz 2
+maxboard siz maxboard 2
+maxboard sizeimprov 2
+maxc 1
+maxc l2h 1
+maxc l2h el 1
+maxcountv 1
+maxcountv measspeed 1
+maxcruisespeed 1
+maxd 2
+maxd mind 1
+maxemchuk 1
+maxf 2
+maxf j ti 1
+maxf oi 1
+maxf oi tg 1
+maxf1 1
+maxfb 1
+maxfcur 1
+maxfcur ts 1
+maxfd 2
+maxff 1
+maxflog 1
+maxfm 2
+maxfn 1
+maxfp 2
+maxfrp 1
+maxfrp gp 1
+maxfrp gp gp 1
+maxft1 1
+maxfw 1
+maxfwt 1
+maxg 1
+maxim 82
+maxim a modif 1
+maxim achief 1
+maxim achief network 1
+maxim achief throughput 1
+maxim addr 1
+maxim addr non 1
+maxim aggreg 1
+maxim aggreg network 1
+maxim aggreg throughput 1
+maxim allow 2
+maxim allow cluster 1
+maxim allow tim 1
+maxim amount 2
+maxim and aver 1
+maxim and minim 4
+maxim ar 1
+maxim attain 2
+maxim attain parallel 1
+maxim attain speedup 1
+maxim avail 1
+maxim avail channel 1
+maxim aver 2
+maxim aver lat 1
+maxim aver separ 1
+maxim backlog 1
+maxim backlog qk 1
+maxim bandwidth 3
+maxim biconnect 1
+maxim biconnect subgraph 1
+maxim board 2
+maxim board siz 2
+maxim bound 1
+maxim buck 1
+maxim buck occup 1
+maxim budg 1
+maxim cap 2
+maxim channel 3
+maxim channel width 3
+maxim character 1
+maxim character siz 1
+maxim cl 3
+maxim cl separ 2
+maxim cliqu 1
+maxim cluster 2
+maxim cluster diameter 1
+maxim cluster siz 1
+maxim collect 1
+maxim commun 1
+maxim commun bandwidth 1
+maxim complec 1
+maxim complec mc 1
+maxim concur 2
+maxim confid 1
+maxim congest 1
+maxim cuml 1
+maxim cuml payoff 1
+maxim d el 1
+maxim dan 2
+maxim dan ce 1
+maxim dan le 1
+maxim dat 1
+maxim dat pack 1
+maxim de 5
+maxim de ce 1
+maxim de conflit 1
+maxim de flexibilit 1
+maxim de la 1
+maxim de migr 1
+maxim de pm 1
+maxim de som 1
+maxim de tr 1
+maxim de vraisembl 1
+maxim degr 5
+maxim del 1
+maxim del dk 1
+maxim del guar 1
+maxim del seen 1
+maxim dexpr 1
+maxim dexpr de 1
+maxim diameter 1
+maxim differ 1
+maxim dist 2
+maxim dist junct 1
+maxim don 1
+maxim du 1
+maxim du conflit 1
+maxim dupl 1
+maxim dupl lifetim 1
+maxim dur 1
+maxim edg 1
+maxim edg weight 1
+maxim eff 2
+maxim eff us 1
+maxim effort 1
+maxim effort requir 1
+maxim el 1
+maxim el top 1
+maxim en 2
+maxim en fonct 1
+maxim entrop 1
+maxim entrop distribut 1
+maxim error 2
+maxim error toler 1
+maxim est 2
+maxim est alor 1
+maxim est atteint 2
+maxim et le 1
+maxim execut 1
+maxim execut tim 1
+maxim expr 1
+maxim expr us 1
+maxim extent 1
+maxim fic 1
+maxim fin 1
+maxim fin scor 1
+maxim flec 1
+maxim for rot 1
+maxim fourn 1
+maxim fourn par 1
+maxim fram 1
+maxim fram siz 1
+maxim futur 1
+maxim futur payoff 1
+maxim gener 1
+maxim globaux 1
+maxim globaux de 1
+maxim height 1
+maxim incr 1
+maxim indep 2
+maxim indep se 2
+maxim int 1
+maxim int valu 1
+maxim interswitch 1
+maxim interswitch traff 1
+maxim interv 2
+maxim is reach 1
+maxim is uniqu 1
+maxim iter 3
+maxim iter level 1
+maxim iter tim 1
+maxim lag 1
+maxim lat 1
+maxim lat seen 1
+maxim le 1
+maxim le hypoth 1
+maxim le pa 1
+maxim leaf 1
+maxim leaf span 1
+maxim learn 1
+maxim learn rat 1
+maxim leav 1
+maxim leav span 1
+maxim length 4
+maxim level 2
+maxim lik 1
+maxim lik estim 1
+maxim lim 1
+maxim lim equ 1
+maxim lin 1
+maxim lin length 1
+maxim load 2
+maxim load graph 1
+maxim load valu 1
+maxim load var 1
+maxim match 2
+maxim match algorithm 1
+maxim me 2
+maxim me del 1
+maxim me handl 1
+maxim monit 1
+maxim monit complec 1
+maxim nest 1
+maxim network 2
+maxim network cap 1
+maxim network throughput 2
+maxim norm 2
+maxim norm serv 1
+maxim number 23
+maxim occup 1
+maxim occup problem 1
+maxim of input 1
+maxim of item 1
+maxim of top 1
+maxim of ts 1
+maxim oper 1
+maxim oper point 1
+maxim optim 1
+maxim or zer 1
+maxim over posit 1
+maxim over rl 1
+maxim pack 3
+maxim pack siz 2
+maxim parallel 7
+maxim parallel hypoth 1
+maxim parallel model 1
+maxim path 2
+maxim path length 1
+maxim payoff 1
+maxim perform 4
+maxim pm 1
+maxim pm de 1
+maxim po system 1
+maxim po valu 1
+maxim point 1
+maxim posit 1
+maxim posit funct 1
+maxim pot 1
+maxim pour 1
+maxim pour chacun 1
+maxim pour obtenir 1
+maxim privileg 1
+maxim privileg proper 1
+maxim privileg se 1
+maxim rad 1
+maxim rat 1
+maxim reach 1
+maxim rel 1
+maxim rel error 1
+maxim resembl 1
+maxim rl 1
+maxim satisf 1
+maxim satisf approxim 1
+maxim scal 1
+maxim scal absolut 1
+maxim scor 1
+maxim se 3
+maxim se dur 1
+maxim separ 1
+maxim separ signif 1
+maxim serv 1
+maxim serv offer 1
+maxim shout 1
+maxim siz 8
+maxim siz appear 1
+maxim siz reduc 1
+maxim siz work 1
+maxim span 1
+maxim span tr 1
+maxim speedup 2
+maxim speedup reflect 1
+maxim sub 3
+maxim sub task 1
+maxim subsequ 1
+maxim sustain 1
+maxim sustain throughput 1
+maxim synerg 1
+maxim synerg optim 1
+maxim synerg relationship 1
+maxim system 3
+maxim system perform 2
+maxim system siz 1
+maxim term 1
+maxim term reflect 1
+maxim th 1
+maxim th aggreg 1
+maxim th connect 1
+maxim th criter 1
+maxim th decr 1
+maxim th eoriqu 1
+maxim th minim 1
+maxim th number 1
+maxim th opt 1
+maxim th over 1
+maxim th parallel 1
+maxim th quant 1
+maxim th siz 1
+maxim th sum 2
+maxim th vol 1
+maxim than commun 1
+maxim their cach 1
+maxim throughput 3
+maxim throughput match 1
+maxim throughput perform 1
+maxim throughput support 2
+maxim tim 5
+maxim tim lim 1
+maxim tot 2
+maxim tot amount 1
+maxim tot flow 1
+maxim tr 1
+maxim tr construc 1
+maxim traff 1
+maxim traff amount 1
+maxim transfer 1
+maxim transfer rat 1
+maxim transm 1
+maxim transm rat 1
+maxim typ 1
+maxim uncorrel 1
+maxim valu 9
+maxim valu allow 1
+maxim valu pa 1
+maxim weight 2
+maxim weight match 1
+maxim weight span 1
+maxim when a1 1
+maxim whil satisf 1
+maxim with respect 2
+maximaux 1
+maximaux dan 1
+maximaux de 1
+maximaux de conflit 1
+maximaux diff 1
+maximaux diff erent 1
+maximaux sur 1
+maximaux sur tout 1
+maximil 1
+maximil universit 1
+maximiser 1
+maximiz 4
+maximiz prfmac1 1
+maximiz th criter 1
+maximiz th expr 1
+maximiz th minim 1
+maximiz th sum 1
+maxint 1
+maxint ab 1
+maxint mac 1
+maxint maxint 1
+maxj 1
+maxl 2
+maxl maxl23 1
+maxl maxl23 dsj 1
+maxl variabl 1
+maxl23 1
+maxl23 dsj 1
+maxl23 dsj s0432 1
+maxl23 variabl 1
+maxl6 1
+maxn 1
+maxp 1
+maxp fl 1
+maxp0 1
+maxprompt 1
+maxrol 1
+maxrol a nonexecut 1
+maxrol and assign 1
+maxrol and minrol 1
+maxrol can comprom 1
+maxrol can execut 1
+maxrol conceptu 1
+maxrol conceptu correspon 1
+maxrol expr 1
+maxrol hold 1
+maxrol maxrol 1
+maxrolemaxrol 1
+maxscor 1
+maxscor 2cl 1
+maxscor 2cl dsj 1
+maxscor 2cl maxscor 1
+maxscor al variabl 1
+maxscor and dsj 1
+maxscor grow 1
+maxscor minl 1
+maxscor minl minl23 1
+maxscor strateg 1
+maxstep 1
+maxstep is fic 1
+maxtreestat 1
+maxxf 1
+maxxfc 1
+may 1
+may92 1
+mayan 1
+mayan moudgil 1
+mayb 3
+mayb sever tim 1
+maybeck 1
+mayor 1
+mayor reg 1
+mayordom 1
+mayrhauser 1
+maz 2
+maz of docum 1
+maz task 1
+mb 11
+mb acq1 1
+mb acq1 acq2 1
+mb is effect 1
+mb s fast 1
+mb sec 1
+mb shar 1
+mb shar dat 1
+mb tr 1
+mb89 1
+mbamalu 1
+mbit 2
+mbit chip 1
+mbit sec 1
+mbon 1
+mbr 1
+mbr that cover 1
+mby 5
+mby board 1
+mby board using 1
+mby log 1
+mby log io 1
+mby of ram 1
+mc 9
+mc actorc 1
+mc configur 1
+mc dct 1
+mc dct compr 1
+mc formulad 1
+mc kenz 1
+mc nc 1
+mc nm 1
+mc oe 1
+mc reg 1
+mc reg nc 1
+mc ss 1
+mc that dimin 1
+mc to de 1
+mc univer 1
+mc univer slb 1
+mc68040 1
+mc86 1
+mc88200 1
+mcast 1
+mcast traff 1
+mcauliff 1
+mcav 1
+mcbryan 1
+mcc 2
+mcc in collabor 1
+mcc84 1
+mcc92 1
+mcc94 1
+mccab 1
+mccahil 1
+mccahil92 1
+mccan 1
+mccart 1
+mccart log 1
+mccarth 2
+mccarth and monk 1
+mccarth situ 1
+mccarth situ calculus 1
+mccelland 1
+mcclelland 3
+mccol 1
+mccr 1
+mccreight 3
+mcdermid 1
+mcdermot 1
+mcdiarmid 1
+mcdiarmid and b.a 1
+mcdonald 1
+mcg 1
+mcgeh 1
+mcgil 1
+mcgrath 1
+mcgrath s task 1
+mcgraw 9
+mcgraw hil 9
+mcguffin 1
+mcjon 2
+mck 4
+mck and shen 1
+mck schem 1
+mck85 1
+mckenz 2
+mckenz and snodgr 1
+mckenz bibliograph 1
+mckeown 1
+mckinl 4
+mcl 1
+mcmc 1
+mcmc method 1
+mcmillan 1
+mcpherson 1
+mcquillan 1
+md 15
+md actord 1
+md algorithm 1
+md algorithm produc 1
+md algorithm schedl 1
+md algorithm select 1
+md and dsc 1
+md and gp 1
+md ba 1
+md ba counterpart 1
+md ba heur 1
+md ba method 1
+md ba order 1
+md est 1
+md est invar 1
+md et prop 1
+md etf 1
+md etf dl 1
+md genet 1
+md gregt 1
+md gregt adelphiassb01.arm.mil 1
+md is prop 1
+md nous 1
+md nous codon 1
+md ou 1
+md ou de 1
+md un aspect 1
+md904 1
+md972 1
+mdest 1
+mdest worm1 1
+mdest worm1 mdest 1
+mdest worm2 1
+mdest worm2 reservedoutputportsrequestedoutputport 1
+mdf 1
+mdf expr 1
+mdf expr defin 1
+mdf form 1
+mdf form contain 1
+mdl 1
+mdx 1
+mdx patrec 1
+me 79
+me a buffer 1
+me a jour 2
+me a la 1
+me a nod 1
+me a notr 1
+me acknowledg 1
+me after me 1
+me al 1
+me al appl 1
+me allow 1
+me alw start 1
+me an object 1
+me and consequ 1
+me and fail 1
+me and identif 1
+me and li 1
+me and lj 1
+me and network 1
+me and prec 1
+me and reason 2
+me and rec 2
+me and sen 2
+me and shut 1
+me and sit 1
+me and st 2
+me and tim 1
+me and tp 1
+me and transm 1
+me and us 1
+me and wak 1
+me and warn 1
+me announc 1
+me applicatif 1
+me appliqu 1
+me aqu 1
+me aqu consider 1
+me aqu control 1
+me aqu embod 1
+me aqu knowledg 1
+me aqu perform 1
+me aqu produc 1
+me aqu us 1
+me aqu ver 1
+me ar 1
+me ar act 1
+me ar arriv 1
+me ar buffer 1
+me ar bundl 1
+me ar compar 1
+me ar deliver 1
+me ar for 1
+me ar gener 1
+me ar inser 1
+me ar nec 1
+me ar neutr 1
+me ar receiv 2
+me ar rel 1
+me ar repr 1
+me ar requir 1
+me ar rout 2
+me ar schedl 1
+me ar sent 5
+me ar transm 1
+me ar typ 1
+me arriv 3
+me arriv tim 1
+me as follow 1
+me as import 1
+me as prev 1
+me at rat 1
+me at tim 1
+me atoiresp 1
+me au 1
+me au sit 1
+me avec 1
+me avec protocol 1
+me bandwidth 1
+me bandwidth achief 1
+me be deliver 1
+me being sent 1
+me between configur 1
+me between nod 1
+me between proc 1
+me bit 1
+me by becom 1
+me by chang 1
+me by tim 1
+me can acc 1
+me can ad 1
+me can ge 1
+me can tak 1
+me can win 1
+me catalog 1
+me character 1
+me character scal 1
+me circl 1
+me circl interpreter 1
+me cl 3
+me cl match 1
+me cl system 1
+me cod 1
+me complec 1
+me complec an 1
+me complec low 1
+me compr 1
+me configur 1
+me constrain 1
+me constraint 1
+me constraint combin 1
+me construc 2
+me construc funct 1
+me contain 6
+me contain particl 1
+me contain piggyback 1
+me could repl 1
+me court 1
+me court de 1
+me court e1 1
+me court est 1
+me cr 1
+me cycl 1
+me dan 1
+me dat 2
+me dat log 1
+me dat typ 1
+me de 3
+me de confirm 1
+me de contr 1
+me de estreitar 1
+me de moin 1
+me de recon 1
+me de tail 1
+me del 2
+me deliv 3
+me deliv del 1
+me deliv tim.4 1
+me deliver 1
+me derreur 1
+me describ 1
+me destin 2
+me devront 1
+me devront permettr 1
+me diffus 1
+me direct 1
+me distribut 1
+me distribut algorithm 1
+me driv 1
+me driv proc 1
+me du 1
+me dum 1
+me each iter 1
+me ec 1
+me ec requir 1
+me echang 1
+me echang es 1
+me eman 1
+me en 3
+me en evid 1
+me entr 1
+me entr le 1
+me environm 1
+me et du 1
+me et joachim 1
+me et lib 1
+me ev branch 1
+me even earl 1
+me eventu 1
+me eventu return 1
+me evolut 1
+me exchang 1
+me fil 1
+me filter 1
+me fit 1
+me fit compl 1
+me fl 1
+me flow 2
+me for exampl 1
+me for link 1
+me forml 1
+me from client 1
+me from extern 1
+me from fi 1
+me from nod 1
+me from other 1
+me from p1 2
+me from p2 1
+me from pe 1
+me from queu 1
+me from random 1
+me from remot 1
+me from server 1
+me from sit 1
+me functeur 1
+me g om 1
+me ge 2
+me ge init 1
+me gener 2
+me going 2
+me gold 1
+me grand 1
+me grand parent 1
+me guar 1
+me ha fan 1
+me ha fic 1
+me handl 1
+me handl rat 1
+me header 1
+me header prov 1
+me identif 1
+me in broadcast 1
+me in giv 1
+me in lexicograph 1
+me in rec 1
+me in rmsp 1
+me in september 1
+me in shorter 1
+me in ss 1
+me in ss0 1
+me ind 1
+me indep 1
+me inform 1
+me init 1
+me init1 1
+me inject 1
+me inject bandwidth 1
+me inject rat 1
+me int larger 1
+me int standard 1
+me int transport 1
+me interact 1
+me interpr 1
+me interpreter 1
+me interpreter prov 1
+me interpter 1
+me is accept 1
+me is ad 1
+me is assoc 1
+me is assum 1
+me is avail 2
+me is broadcast 2
+me is color 1
+me is del 1
+me is deliver 1
+me is fl 1
+me is gener 1
+me is guaranteed 1
+me is hap 1
+me is ident 1
+me is ignor 1
+me is impact 1
+me is init 1
+me is inser 1
+me is led 1
+me is lost 1
+me is mad 1
+me is proc 1
+me is receiv 4
+me is remov 1
+me is respon 2
+me is rout 1
+me is seen 1
+me is sent 2
+me is shown 1
+me is term 1
+me is therefor 1
+me is transm 1
+me is yp 1
+me is ys 1
+me it caus 1
+me it rel 1
+me it reput 1
+me it sen 1
+me k sender 1
+me lacc 1
+me lacc sur 1
+me langu 1
+me lat 4
+me lat expr 1
+me layer 2
+me le 1
+me le syst 1
+me learn 1
+me length 5
+me lest ec 1
+me leur 1
+me leur oabilit 1
+me level 3
+me level architectur 1
+me level ba 1
+me level cl 1
+me level comput 1
+me level funct 1
+me level method 1
+me level modif 1
+me level object 1
+me level oper 1
+me level program 1
+me level seem 1
+me lo 2
+me lo amount 1
+me long 1
+me long de 1
+me lu 1
+me m follow 1
+me m receiv 1
+me m1 1
+me m1 acknowledg 1
+me m1 win 1
+me m2 1
+me ma 1
+me mathemat 1
+me may fail 1
+me may occ 1
+me me 2
+me me level 1
+me me.html 1
+me messagefselect 1
+me messagefselect mov 1
+me mi 1
+me model 1
+me mov 1
+me mp 1
+me mp sent 1
+me multicast 2
+me multicast group 1
+me multicl 1
+me multicl workload 1
+me multiplec 1
+me must pa 1
+me must traver 1
+me n ecessair 1
+me navig 1
+me never destr 1
+me non 1
+me non triv 1
+me object 3
+me object abcm 1
+me object affect 1
+me object caus 1
+me object definit 1
+me object descript 1
+me object design 1
+me object ea 1
+me object exhibit 1
+me object impl 1
+me object look 1
+me object manipl 1
+me object metaobj 1
+me object method 1
+me object protocol 2
+me object prov 1
+me object run 1
+me object straightfor 1
+me object using 1
+me object virtu 1
+me occur 1
+me of aver 1
+me of fi 1
+me of proc 1
+me of siz 1
+me onot 1
+me onot read 1
+me oper 1
+me optim 1
+me optim protocol 1
+me or acknowledg 1
+me order 2
+me order nondeterm 1
+me order preserv 1
+me origin 1
+me ouvr 1
+me ouvr la 1
+me over simpl 1
+me overhead 2
+me overhead constrain 1
+me overhead continu 1
+me overhead cost 1
+me overhead fact 1
+me overhead offer 1
+me overhead ts 1
+me pa 20
+me pa algorithm 1
+me pa approach 2
+me pa architectur 2
+me pa cod 1
+me pa collect 1
+me pa complec 1
+me pa compon 1
+me pa concept 1
+me pa implem 1
+me pa interfac 2
+me pa mak 1
+me pa mechan 2
+me pa mimd 1
+me pa oper 1
+me pa paradigm 1
+me pa perform 1
+me pa prim 1
+me pa program 1
+me pa schem 1
+me pa standard 1
+me pa system 4
+me pa ver 1
+me pack 1
+me pair 1
+me parameter 1
+me pattern 1
+me per nod 1
+me per proc 1
+me per transport 1
+me per transportlevel 1
+me percol 1
+me perform 1
+me permettrait 1
+me permettrait de 1
+me pl 2
+me pl rep 1
+me platform 1
+me po 1
+me point 1
+me point de 1
+me pour 1
+me pour permettr 1
+me pr 2
+me pr cal 1
+me pr und 1
+me pratiqu 1
+me problem 1
+me proc 2
+me proc cap 1
+me program 1
+me propag 1
+me propag cod 1
+me protocol 1
+me qsort 1
+me queu 4
+me queu proc 1
+me r epondez 1
+me reach 2
+me receiv 5
+me recov 1
+me reduc 1
+me regard 1
+me regard link 1
+me rel 1
+me rel sequ 1
+me rencontr 1
+me request 2
+me request acc 1
+me requir 4
+me rest 1
+me room 1
+me rout 2
+me rout es 1
+me s0 1
+me satisf 1
+me schedl 1
+me schedl car 1
+me search 1
+me sec 1
+me sen 3
+me sen oper 1
+me sen pattern 1
+me sen prim 1
+me sen primitiv 1
+me sender 1
+me sent 8
+me seq 1
+me sequ 1
+me sg 1
+me simpl 1
+me simultan 1
+me siz 4
+me siz 2we 1
+me siz arbitr 1
+me siz expr 1
+me siz fit 1
+me specif 2
+me specif dut 1
+me st 2
+me start 2
+me startup 3
+me startup overhead 3
+me stream 1
+me stream held 1
+me string 1
+me succ 1
+me such requir 1
+me such respon 1
+me support 1
+me system 2
+me system requir 1
+me tak 2
+me term 2
+me text 1
+me th bound 1
+me th challeng 2
+me th constraint 2
+me th funct 1
+me th goal 1
+me th learn 1
+me th lower 1
+me th nec 1
+me th object 1
+me th over 1
+me th proc 1
+me th remov 1
+me th repr 1
+me th specif 1
+me th throughput 1
+me that ar 1
+me that caus 1
+me that misnavig 1
+me that prec 1
+me that proc 1
+me that rec 1
+me that requir 1
+me their requir 1
+me then cl 1
+me then discard 1
+me then follow 1
+me then go 1
+me theor 1
+me theor result 1
+me throughput 3
+me to awak 1
+me to deliver 1
+me to determin 1
+me to flush 1
+me to incr 1
+me to multicast 1
+me to nod 1
+me to p2 1
+me to pa 1
+me to pe 1
+me to perform 1
+me to proc 3
+me to q4 1
+me to random 1
+me to reach 1
+me to rel 1
+me to rmsp 1
+me to sit 1
+me to specif 1
+me to transfer 1
+me tr 1
+me traff 3
+me traff du 1
+me traject 1
+me transfer 2
+me transm 2
+me transm tim 1
+me transport 1
+me transport pack 1
+me travel 2
+me traver 1
+me typ 2
+me typ inclus 1
+me unif 1
+me unif list 1
+me upd 1
+me upd channel 1
+me using 1
+me using ec 1
+me variabl 1
+me vect 1
+me vect me 1
+me ver 1
+me vi parallel 1
+me virtu 1
+me vot 1
+me wa fair 1
+me we random 1
+me wer select 1
+me when issu 1
+me wil ar 1
+me wil contribut 1
+me wil reach 2
+me wil rec 1
+me wil tak 1
+me with fragm 1
+me with level 1
+me with non 1
+me with st 1
+me within sl 1
+me xp 1
+me xp allow 1
+me xp con 1
+me xp direct 1
+me xp ec 1
+me xp explain 1
+me xp mak 1
+me xp nod 1
+me xp perform 1
+me xp record 1
+me xp structur 1
+me xp trac 1
+me xp xp 1
+me your requir 1
+me. 2
+me.2 1
+me.2 in particl 1
+me.html 1
+me1 1
+mead 2
+meader 1
+meadow 1
+mean 101
+mean a construc 1
+mean a disadv 1
+mean a good 1
+mean a hierarch 1
+mean a nod 1
+mean a non 1
+mean a pag 1
+mean a rang 1
+mean a sid 1
+mean a tok 1
+mean abbrev 1
+mean ad 1
+mean ai 1
+mean algorithm 1
+mean algorithm using 1
+mean an inst 1
+mean and oe2 1
+mean and run 1
+mean and unit 1
+mean and user 1
+mean and var 1
+mean as bin 1
+mean as prev 1
+mean as register 1
+mean as rplac 1
+mean asser 1
+mean assign 1
+mean assignm 1
+mean branch 1
+mean branch a2c 1
+mean ch 1
+mean chang 1
+mean circuit 1
+mean cl 1
+mean cl inst 1
+mean cluster 1
+mean cluster method 1
+mean cpu 1
+mean cpu secon 1
+mean decl 1
+mean detect 1
+mean detect rat 1
+mean differ 1
+mean differ thing 1
+mean each repr 1
+mean execut 1
+mean execut zer 1
+mean featur 1
+mean find 1
+mean finit 1
+mean finit prec 1
+mean for commun 1
+mean for conduc 1
+mean for gener 2
+mean for man 1
+mean for measur 2
+mean for rol 1
+mean for structur 1
+mean framework 1
+mean frequ 1
+mean frequ context 1
+mean giv 1
+mean good 1
+mean good cod 1
+mean hardwir 1
+mean in mind 1
+mean ind 1
+mean inequ 1
+mean inform 1
+mean is clear 1
+mean is run 1
+mean it se 1
+mean k tupl 1
+mean keep 1
+mean keep bigger 1
+mean le fil 1
+mean longer 1
+mean longer respon 1
+mean mean 2
+mean mean circuit 1
+mean mean mean 1
+mean method 1
+mean mor succ 1
+mean must support 1
+mean no parallel 1
+mean nod 1
+mean nod util 1
+mean number 1
+mean of administer 1
+mean of commun 2
+mean of conduc 1
+mean of definit 1
+mean of determin 1
+mean of distribut 1
+mean of econom 1
+mean of eff 1
+mean of effect 1
+mean of elimin 1
+mean of equiv 1
+mean of evolut 1
+mean of experim 1
+mean of find 1
+mean of follow 1
+mean of form 1
+mean of forml 1
+mean of gestur 1
+mean of group 1
+mean of hid 1
+mean of icon 1
+mean of incorpor 1
+mean of ir 1
+mean of maintain 1
+mean of man 1
+mean of metaterm 1
+mean of qualif 1
+mean of reach 1
+mean of row 1
+mean of select 1
+mean of simpl 1
+mean of sock 1
+mean of spec 1
+mean of st 1
+mean of sum 1
+mean of user 1
+mean of wait 1
+mean ogur 1
+mean pn 1
+mean preconceiv 1
+mean proc 1
+mean proc tim 1
+mean project 1
+mean receiv 1
+mean receiv network 1
+mean relationship 1
+mean repeat 1
+mean repeat zer 1
+mean rewrit 1
+mean rewrit rl 1
+mean rigid 1
+mean rigid shap 1
+mean rough 1
+mean rough equ 1
+mean shap 1
+mean shap appl 1
+mean shap ba 1
+mean shap comput 1
+mean shap estim 1
+mean shap prec 1
+mean shap problem 1
+mean siz 1
+mean solut 1
+mean squar 4
+mean squar error 4
+mean stder 1
+mean stder mean 1
+mean th built 1
+mean th comparison 1
+mean th correspon 1
+mean th cr 1
+mean th kth 1
+mean th log 1
+mean th map 1
+mean th restrict 1
+mean th se 1
+mean th sequ 1
+mean th solut 1
+mean th stud 1
+mean th tim 1
+mean th tut 1
+mean th valu 1
+mean that arbitr 1
+mean that argum 1
+mean that avail 1
+mean that chang 1
+mean that cl 1
+mean that currexp 1
+mean that dat 1
+mean that dk 1
+mean that expr 1
+mean that good 1
+mean that horizont 1
+mean that inst 1
+mean that limn 1
+mean that logm 1
+mean that lower 1
+mean that nod 1
+mean that proc 1
+mean that red 1
+mean that rn 1
+mean that se 1
+mean that substitut 1
+mean that test 1
+mean that tim 1
+mean that truth 1
+mean thorough 1
+mean thorough conclus 1
+mean throughput 1
+mean to acc 1
+mean to bound 1
+mean to chang 1
+mean to compar 1
+mean to displ 1
+mean to find 2
+mean to ge 1
+mean to gener 1
+mean to inst 1
+mean to lif 1
+mean to map 1
+mean to narrow 1
+mean to navig 1
+mean to prescrib 1
+mean to ref 1
+mean to select 1
+mean to smooth 1
+mean trac 1
+mean ubiqu 1
+mean valu 4
+mean ver 1
+mean we found 1
+mean whenever oe 1
+mean with respect 1
+mean without perm 2
+mean z0 1
+meant 11
+meant build 1
+meant for secur 1
+meant further 1
+meant further investig 1
+meant respon 1
+meant to bridg 1
+meant to captur 1
+meant to convinc 1
+meant to illustr 1
+meantim 4
+meantim som me 1
+measspeed 1
+measur 65
+measur a dist 1
+measur a pur 1
+measur about pack 1
+measur after train 1
+measur alw result 1
+measur and an 2
+measur and correct 1
+measur and model 2
+measur and record 1
+measur appar 1
+measur appar over 1
+measur ar ba 2
+measur ar defin 1
+measur ar transform 1
+measur assoc 1
+measur board 2
+measur board siz 2
+measur by mac2cjf 1
+measur by repeat 1
+measur calcl 1
+measur cap 1
+measur cc 1
+measur cluster 1
+measur cluster perform 1
+measur contribut 1
+measur cpu 1
+measur cpu tim 1
+measur dat 1
+measur defin 1
+measur dist 1
+measur equ 1
+measur equ zi 1
+measur execut 1
+measur execut tim 1
+measur fact 1
+measur feedback 1
+measur for dat 1
+measur for random 1
+measur from diverg 1
+measur gaz 1
+measur i mi 1
+measur in by 1
+measur in discr 1
+measur in instruc 1
+measur in latitud 1
+measur in millisecon 1
+measur in mip 1
+measur in subexpon 1
+measur in term 3
+measur inclus 2
+measur inclus cur 1
+measur incorpor 1
+measur is comput 1
+measur is du 1
+measur is mean 1
+measur is moreover 1
+measur is obtain 1
+measur is suf 1
+measur is upd 1
+measur lat 1
+measur of color 1
+measur of comput 1
+measur of disper 1
+measur of fair 1
+measur of inform 1
+measur of map 1
+measur of mean 1
+measur of perform 2
+measur of proc 1
+measur of resourc 1
+measur of smooth 1
+measur of transact 1
+measur on decst 1
+measur on junct 1
+measur on wavel 1
+measur or map 1
+measur parallel 1
+measur parallel figur 1
+measur perform 3
+measur perform inform 1
+measur perform show 1
+measur perform sol 1
+measur proc 1
+measur proc tim 1
+measur purp 1
+measur qsm 1
+measur quant 1
+measur quant led 1
+measur quantit 1
+measur rel 2
+measur remov 1
+measur ser 1
+measur short 1
+measur short after 1
+measur should prefer 1
+measur test 1
+measur test adequ 1
+measur th abil 1
+measur th actu 1
+measur th aver 1
+measur th color 1
+measur th commun 1
+measur th cost 1
+measur th del 1
+measur th di 1
+measur th dist 1
+measur th eff 1
+measur th effect 1
+measur th ext 1
+measur th extent 1
+measur th id 1
+measur th impact 1
+measur th individu 1
+measur th lat 1
+measur th lim 1
+measur th mach 1
+measur th parallel 1
+measur th perform 2
+measur th qu 1
+measur th run 1
+measur th schedl 1
+measur th simil 1
+measur th siz 1
+measur th smooth 1
+measur th spac 1
+measur th spar 1
+measur th subband 1
+measur th succ 1
+measur th tim 1
+measur that identif 1
+measur that rel 1
+measur their import 1
+measur their smooth 1
+measur theor 1
+measur tim 4
+measur tim complec 1
+measur tim doubl 1
+measur to character 1
+measur to evalu 1
+measur to facilit 1
+measur to reach 1
+measur u defin 1
+measur uncertaint 1
+measur us 1
+measur usl.128 1
+measur valu 2
+measur variabl 1
+measur ver 1
+measur what hap 1
+measur zer 2
+measurm 1
+mec 5
+mec mexican 1
+mech 1
+mechan 59
+mechan accompl 1
+mechan allow 1
+mechan an 1
+mechan and concur 1
+mechan and cr 1
+mechan and imag 1
+mechan and thus 1
+mechan ar desir 1
+mechan ar distingu 1
+mechan ar incompat 1
+mechan ar meant 1
+mechan arrang 1
+mechan as ext 1
+mechan ba 1
+mechan can actu 1
+mechan can deliver 1
+mechan can great 1
+mechan ch 1
+mechan conform 1
+mechan connect 1
+mechan connect synchron 1
+mechan could slow 1
+mechan dam 1
+mechan deal 1
+mechan decr 1
+mechan design 1
+mechan design diagram 1
+mechan differ 1
+mechan differ mark 1
+mechan do contribut 1
+mechan empl 1
+mechan engineer 1
+mechan for answer 1
+mechan for dat 1
+mechan for dec 1
+mechan for eff 2
+mechan for fast 1
+mechan for find 1
+mechan for gener 1
+mechan for group 1
+mechan for implem 1
+mechan for integr 2
+mechan for log 1
+mechan for man 1
+mechan for nod 1
+mechan for prolog 1
+mechan for reason 1
+mechan for record 1
+mechan for refer 1
+mechan for sdm 1
+mechan for snoop 1
+mechan for st 2
+mechan for structur 1
+mechan for switch 1
+mechan for text 1
+mechan for trac 1
+mechan in support 1
+mechan in tcp 1
+mechan inclus 1
+mechan inherit 1
+mechan int el 1
+mechan int prolog 1
+mechan is ba 1
+mechan is embod 1
+mechan lik fast 1
+mechan link 1
+mechan mak 1
+mechan not pol 1
+mechan of adapt 1
+mechan of ba 1
+mechan of human 1
+mechan of interact 1
+mechan of mean 1
+mechan of model 1
+mechan of natur 1
+mechan of object 1
+mechan of sl1 1
+mechan of thought 1
+mechan oper 1
+mechan or electromagnet 1
+mechan pl 1
+mechan protocol 1
+mechan prov 2
+mechan prov abstract 1
+mechan prov high 1
+mechan real 1
+mechan requir 2
+mechan requir extrem 1
+mechan rest 1
+mechan sampl 1
+mechan sampl matr 1
+mechan should prov 1
+mechan th memor 1
+mechan that allow 1
+mechan that broadcast 1
+mechan that distingu 1
+mechan that ensur 1
+mechan that monit 1
+mechan that support 1
+mechan that us 1
+mechan through sem 1
+mechan to assur 1
+mechan to bound 1
+mechan to co 1
+mechan to dump 1
+mechan to har 1
+mechan to incorpor 1
+mechan to re 1
+mechan to switch 1
+mechan transl 1
+mechan us 1
+mechan wa origin 1
+mechan whereb 1
+mechan which allow 1
+mechan with bandwidth 1
+mechan without subst 1
+mechan2 1
+mechan2 using 1
+mechan2 using roundtrip 1
+meckler 1
+med 38
+med ac 1
+med ac en 1
+med ac repr 1
+med among concur 1
+med and acc 1
+med and fin 1
+med and stat 1
+med and techn 2
+med appl 1
+med appl form 1
+med appl ten 1
+med approach 1
+med ar register 1
+med architectur 1
+med at boot 1
+med ba 1
+med ba approach 1
+med ba architectur 1
+med ba real 1
+med begin 1
+med block 1
+med block cl 1
+med by explicit 1
+med by lock 1
+med car 1
+med cl 1
+med commun 2
+med compact 1
+med cybernet 2
+med dat 1
+med datab 1
+med db 1
+med dec 1
+med dec mak 1
+med design 1
+med design method 1
+med diagn 2
+med diagn planar 1
+med diagnost 1
+med diagnost support 1
+med differ 1
+med domain 1
+med en 1
+med execut 1
+med execut tim 1
+med exper 2
+med exper system 2
+med failur 1
+med field 1
+med field correct 1
+med filter 1
+med flush 1
+med for glob 1
+med for st 1
+med from invok 1
+med g00 1
+med g00 mediumw 1
+med grain 2
+med grain multicomputer 1
+med grain solut 1
+med imag 3
+med imag ba 1
+med imag datab 1
+med imag oeld 1
+med init 1
+med institut 1
+med is decomp 1
+med mac 1
+med mac ii8 1
+med mac s0432 1
+med mac unsat 1
+med manager 1
+med master 1
+med master control 1
+med nam 1
+med nam tim 1
+med object 1
+med of cel 1
+med of commun 1
+med plac 1
+med problem 1
+med record 3
+med sc 1
+med sc gener 1
+med scal 3
+med scal encapsl 1
+med scal med 1
+med scal parallel 1
+med scor 1
+med sect 1
+med select 1
+med select algorithm 1
+med spac 1
+med st 1
+med strateg 1
+med sub 1
+med sub cl 1
+med talk 1
+med to integr 1
+med to look 1
+med to respon 1
+med to vi 1
+med using 1
+med valu 1
+med vs 1
+med would register 1
+med would respon 1
+med z yield 1
+med3 1
+med3 execut 1
+med3 execut tim 1
+medicin 3
+medicin a dec 1
+medim96 1
+mediumg 1
+mediumt 1
+mediumt larg siz 1
+mediumw 1
+mediumw eak 1
+medl 2
+medl91 1
+medtim 1
+medtim e14 1
+meer 2
+meer plin 1
+meer plin nplin 1
+meer prov 1
+meg 2
+meg log 1
+meg log infer 1
+meg oct 1
+meg oct est 1
+megab 3
+megab of dual 1
+megab of main 1
+megab of swap 1
+megab priv 1
+megab priv memor 1
+megalog 1
+megaprogram 1
+megid 1
+mehl 1
+mehm 2
+mehm.orgun 1
+mehm.orgun mq.edu.au 1
+mehrman 1
+mehrman mathematik.tu 1
+mehrman mathematik.tu chemnitz.de 1
+mehrmannz 1
+mehrotr 2
+mehrotr predict 1
+mehrotr predict correct 1
+meht 1
+meijer 1
+meik 3
+meik cs 3
+meik cs2 2
+meik cs2 mach 1
+meilleur 4
+meilleur ch 1
+meilleur comprom 1
+meilleur comprom entr 1
+meilleur de 2
+meilleur de ca 2
+meilleur fit 1
+meilleur fit dan 1
+meilleur gar 1
+meilleur gar dextensibilit 1
+meilleur individu 1
+meilleur individu est 1
+meilleur individu lorsquon 1
+meilleur individu xm 1
+meilleur individus 1
+meilleur individus de 1
+meilleur individus entr 1
+meilleur localit 1
+meilleur m ethod 1
+meilleur moy 1
+meilleur moy darriver 1
+meilleur perform 1
+meilleur perform es 1
+meilleur qu 3
+meilleur qu ce 1
+meilleur qu la 1
+meilleur qu lefficacit 1
+meilleur r esultat 1
+meilleur ser 1
+meilleur solut 1
+meilleur solut avec 1
+meilleur solut obtenu 1
+meilleur tail 1
+meilleur tail fic 1
+meilleur vo 1
+meilleur vo pour 1
+meisel 1
+mekelweg 1
+mel 5
+mel et al 1
+mel la 1
+mel la ment 1
+mel smith 3
+mel smith suggest 1
+melanogaster 1
+melbourn 3
+mellon 4
+mellon mach 1
+mellon mach group 1
+mellon univer pittsburgh 1
+mellor 3
+mellor cr 3
+melod 2
+melod and harmon 1
+melt 2
+meltzer 1
+mem 8
+mem arbitr 1
+mem arbitr interconnect 1
+mem mem 1
+mem mem arbitr 1
+mem mem mem 1
+mem techniqu 1
+mem techniqu requir 1
+member 28
+member a targ 1
+member al belong 1
+member ar st 1
+member funct 4
+member funct implem 1
+member funct mak 1
+member in solut 1
+member inform 1
+member int transport 1
+member is determin 1
+member leav 1
+member loc 1
+member nod 1
+member of adeg 1
+member of ajt 1
+member of bjt 1
+member of ci 1
+member of osl 1
+member of sj 1
+member requir 1
+member var 1
+member var ge 1
+member variabl 1
+member variabl wh 1
+member wil rec 1
+member wil register 1
+member wish 1
+memberchk 1
+membership 10
+membership algorithm 1
+membership and deliv 1
+membership and virtu 1
+membership compar 1
+membership compar se 1
+membership facil 1
+membership facil guar 1
+membership facil prov 1
+membership from outd 1
+membership in np 2
+membership is polynom 1
+membership oper 1
+membership proper 1
+membership proper ment 1
+membership protocol 2
+membership test 1
+membership using 1
+membership valu 1
+membr 2
+membr de 1
+membr de mon 1
+membr du 1
+membr du group 1
+membr du noyau 1
+memoir 1
+memoir ut 1
+memor 60
+memor abstract 2
+memor acc 12
+memor acc addr 1
+memor acc appear 1
+memor acc attempt 1
+memor acc block 1
+memor acc bound 1
+memor acc buffer 1
+memor acc compl 1
+memor acc conflict 1
+memor acc cost 1
+memor acc cycleswrit 1
+memor acc del 1
+memor acc du 1
+memor acc perform 1
+memor acc rout 1
+memor acc transm 1
+memor addr 3
+memor addr spac 1
+memor aid 1
+memor alloc 2
+memor alloc strateg 1
+memor amount 1
+memor and 200mhz 1
+memor and buffer 1
+memor and facilit 1
+memor and instruc 1
+memor and learn 1
+memor and me 1
+memor and multipl 1
+memor and object 1
+memor and proc 1
+memor and prov 1
+memor and rel 1
+memor and secon 1
+memor and sparc 1
+memor and tak 1
+memor and writ 1
+memor ar 1
+memor ar assum 1
+memor ar ba 1
+memor ar consider 1
+memor ar guaran. 1
+memor ar read 1
+memor ar separ 1
+memor architectur 9
+memor architectur correspon 1
+memor architectur reduc 1
+memor assoc 1
+memor assum 1
+memor assum addr 1
+memor at runtim 1
+memor avail 1
+memor ba 3
+memor ba reason 1
+memor bandwidth 1
+memor bandwidth lo 1
+memor bank 1
+memor behavior 1
+memor behaviour 1
+memor block 1
+memor board 1
+memor bus 1
+memor by key 1
+memor cach 1
+memor can st 1
+memor cap 2
+memor cel 2
+memor chip 2
+memor chip dom 2
+memor coh 2
+memor com 1
+memor computer 3
+memor computer addr 1
+memor con 3
+memor con model 1
+memor conflict 1
+memor cont 1
+memor cont du 1
+memor contain 2
+memor contain subst 1
+memor cop 2
+memor cost 1
+memor dat 1
+memor dat structur 1
+memor datab 3
+memor datab system 1
+memor defin 1
+memor disambigu 1
+memor du 1
+memor eff 1
+memor eff st 1
+memor el 1
+memor environm 1
+memor exper 1
+memor ext 1
+memor for dat 1
+memor for st 1
+memor fram 1
+memor hierarch 6
+memor ii 1
+memor impact 1
+memor implem 1
+memor in pa 1
+memor in qi 1
+memor in term 1
+memor inclus 1
+memor inclus pipelin 1
+memor incoh 1
+memor inform 1
+memor int separ 1
+memor integr 2
+memor integr technolog 2
+memor introduc 1
+memor io 1
+memor io load 1
+memor is conduc 1
+memor is design 1
+memor is develop 1
+memor is empt 2
+memor is glob 1
+memor is implem 1
+memor is inver 1
+memor is obtain 1
+memor is separ 1
+memor is shar 1
+memor is therefor 1
+memor is transform 1
+memor is vi 1
+memor item 1
+memor lat 2
+memor lat cycl 1
+memor lat model 1
+memor le 1
+memor lead 1
+memor leak 1
+memor libr 1
+memor lo 1
+memor load 1
+memor loc 8
+memor loc assoc 1
+memor loc pb 1
+memor loc read 1
+memor loc requir 1
+memor loc simultan 1
+memor log 1
+memor lp 1
+memor ma. 1
+memor mach 8
+memor mach cr 1
+memor manag 6
+memor manag facil 1
+memor manag funct 1
+memor manag id 1
+memor manag oper 1
+memor manag overhead 1
+memor manag schem 1
+memor manag unit 2
+memor manager 1
+memor model 4
+memor model con 1
+memor model describ 1
+memor model support 1
+memor model wh 1
+memor modl 2
+memor modl connect 1
+memor mult 1
+memor mult proc 1
+memor multicomputer 2
+memor multiproc 10
+memor multiproc guar 1
+memor multiproc multidisk 1
+memor multiproc schedl 1
+memor of narx 1
+memor of order 1
+memor of proc 2
+memor of siz 1
+memor on lo 2
+memor on memoryload 1
+memor onl con 1
+memor oper 1
+memor or distribut 1
+memor or read 1
+memor or un 1
+memor order 1
+memor order effect 1
+memor order select 1
+memor organ 1
+memor overhead 1
+memor pag 1
+memor pag siz 1
+memor parallel 4
+memor parallel architectur 1
+memor parallel computer 1
+memor parallel mach 1
+memor parallel program 1
+memor penalt 1
+memor penalt ba 1
+memor per proc 3
+memor perform 2
+memor perm 1
+memor predict 1
+memor predict predict 1
+memor program 3
+memor program paradigm 1
+memor read 1
+memor read writ 1
+memor reclam 1
+memor reduc 1
+memor refer 3
+memor refer behavior 1
+memor refer bottleneck 1
+memor refer start 1
+memor reg 1
+memor reg len 1
+memor register 1
+memor register renam 1
+memor renam 1
+memor repr 1
+memor requir 8
+memor reus 1
+memor reus bottleneck 1
+memor secon 1
+memor secon st 1
+memor siz 2
+memor spac 3
+memor speed 1
+memor st 1
+memor st correspon 1
+memor structur 1
+memor styl 1
+memor styl synchron 1
+memor subsystem 1
+memor sustem 1
+memor system 12
+memor system con 1
+memor system intel 1
+memor system ipsc 1
+memor system multicast 1
+memor system perform 1
+memor tap 1
+memor th kth 1
+memor th main 1
+memor th occup 1
+memor th subfil 1
+memor that mak 1
+memor that us 1
+memor to def 1
+memor to me 1
+memor to st 2
+memor traff 2
+memor transl 1
+memor transl hardwar 1
+memor unit 1
+memor unit con 1
+memor upd 1
+memor us 1
+memor usag 1
+memor usag stat 1
+memor using 1
+memor using fl 1
+memor wa defin 1
+memor which support 1
+memor whil maintain 1
+memor whil preserv 1
+memor wil appear 1
+memor without clip 1
+memor without giv 1
+memor zon 1
+memor zon exhaust 1
+memor.13 1
+memorandum 1
+memoryaid 1
+memoryaid system 1
+memoryload 1
+memoryload account 1
+memoryload ar partit 1
+memoryload ar writ 1
+memoryload by memoryload 1
+memoryload by mi 1
+memoryload dur pa 1
+memoryload intern 1
+memoryload is brought 1
+memoryload is permut 1
+memoryload is writ 1
+memoryload mi 1
+memoryload mi belong 1
+memoryload of record 1
+memoryload that contribut 1
+memoryload we retain 1
+mempt1 1
+mempt1 pt2 1
+mempt1 pt2 nil 1
+mempt1 pt2r 1
+mempt1 pt2r rph 1
+men 5
+men aux 1
+men aux etat 1
+men avoir 1
+men avoir offer 1
+men ee 2
+men ee en 1
+men ee pour 1
+men ee sur 2
+men es 1
+men franc 1
+men franc grenobl 1
+mendel 1
+mendel rosenbl 1
+mendelson 1
+mendelzon 1
+mener 2
+mener a bien 1
+mener aux 1
+mener aux etat 1
+mener rapid 1
+mener tous 1
+mener tous le 1
+meng 1
+menl 3
+menl park 3
+ment 63
+ment a quick 1
+ment abov appear 1
+ment abov mak 1
+ment act 1
+ment adv 1
+ment ajout 1
+ment al 1
+ment al atoir 1
+ment al coh 1
+ment algorithm 1
+ment and car 1
+ment anyth design 1
+ment architectur 1
+ment aus 1
+ment aus la 1
+ment by solomonoff 1
+ment calcl 1
+ment dan 1
+ment de 1
+ment de la 1
+ment de longueur 1
+ment design 1
+ment diagonaux 1
+ment diagonaux de 1
+ment difficult 1
+ment distribut 1
+ment distribut funct 1
+ment e ci 1
+ment e lutil 1
+ment e qu 1
+ment e simplif 1
+ment earl 6
+ment ee 1
+ment ee par 1
+ment enabl 1
+ment es 1
+ment est 1
+ment est donc 1
+ment event 1
+ment g od 1
+ment id 1
+ment in pa 1
+ment in prev 1
+ment in sect 7
+ment in subsect 1
+ment in theorem 1
+ment informatiqu 2
+ment init 1
+ment it map 1
+ment la 1
+ment le 1
+ment le comp 1
+ment le mouv 1
+ment loc 1
+ment map 1
+ment method 1
+ment mi 1
+ment model 1
+ment not 1
+ment of docum 1
+ment of progr 1
+ment oper 1
+ment pa 1
+ment paradigm 1
+ment pattern 1
+ment pattern match 1
+ment polynom 1
+ment pour 1
+ment pour mettr 1
+ment prev 1
+ment problem 1
+ment proc 1
+ment qu 1
+ment qu tr 1
+ment result 1
+ment result ment 1
+ment someth specif 1
+ment switch 1
+ment system 1
+ment th forml 1
+ment th futur 1
+ment th learn 1
+ment th us 1
+ment that docum 1
+ment that good 1
+ment that inherit 1
+ment that multipl 1
+ment that neur 1
+ment that polymorph 1
+ment that self 1
+ment that tim 1
+ment that tool 1
+ment that trac 1
+ment to explain 1
+ment to mak 1
+ment tr 1
+ment tr test 1
+ment when tim 1
+mentair 1
+mentair n cessair 1
+mentallyresult 1
+mentionner 1
+mentionner peuv 1
+mentionner peuv etr 1
+mentionnon 1
+mentionnon fin 1
+mentionnon fin qu 1
+mentionnon qu 1
+mentionnon qu le 1
+menu 8
+menu ba 1
+menu ba natur 1
+menu bar offer 1
+menu dat 1
+menu dat structur 1
+menu driv 1
+menu driv system 1
+menu hierarch 1
+menu hierarch typ 1
+menu interfac 1
+menu is perform 1
+menu item 4
+menu item fal 1
+menu layout 1
+menu ma 1
+menu ma se 1
+menu of command 1
+menu open 1
+menu or dialog 1
+menu string 1
+menu structur 1
+menu system 1
+menu system wh 1
+menu th search 1
+menu to facilit 1
+menu wh 1
+menu which offer 1
+menus 3
+menus accord 1
+menus and dialog 1
+menus ar configur 1
+menus involut 1
+menus involut particl 1
+menus of edit 1
+menus prov 1
+menus prov opportun 1
+meog 1
+meog di.unip.it 1
+mer 17
+mer a matter 1
+mer a ye 1
+mer alter 1
+mer bind 1
+mer by rewrit 1
+mer compil 1
+mer compil me 1
+mer distribut 1
+mer ec 1
+mer ensur 1
+mer int 1
+mer int parameter 1
+mer interfac 1
+mer interfac chang 1
+mer look 1
+mer manag 1
+mer manag inform 1
+mer mov 1
+mer ozsoyoglu 1
+mer perform 1
+mer rot 1
+mer rot learn 1
+mer th fact 1
+mer to manipl 1
+mer to separ 1
+mer unknown 1
+mer unknown funct 1
+mer91 1
+merc 1
+merc a vous 1
+mercer 1
+mercer str 1
+mercur 1
+mereolog 1
+merg 21
+merg algorithm 1
+merg algorithm transform 1
+merg and tak 1
+merg as describ 1
+merg at half 1
+merg clip 1
+merg clip sub 1
+merg compon 1
+merg con 1
+merg cost 1
+merg cost tok 1
+merg cycl 1
+merg cycl dep 1
+merg dur schem 1
+merg en 1
+merg equiv 1
+merg equiv st 1
+merg equiv switch 1
+merg hybrid 1
+merg hybrid tr 1
+merg in step 1
+merg is requir 1
+merg iter 1
+merg join 1
+merg lin 1
+merg lin tr 1
+merg log 1
+merg neighbor 1
+merg neighbor imag 1
+merg nod 1
+merg of nod 1
+merg of transl 1
+merg oper 3
+merg pa 1
+merg pattern 1
+merg perform 1
+merg ph 1
+merg prim 1
+merg problem 1
+merg protocol 1
+merg reg 1
+merg result 1
+merg rout 1
+merg rout requir 1
+merg run 1
+merg sort 2
+merg sort algorithm 2
+merg sort requir 1
+merg sort seem 1
+merg strateg 1
+merg succeed 1
+merg th argum 1
+merg th fragm 1
+merg th incom 1
+merg th inform 1
+merg th multipl 1
+merg th result 1
+merg th ssm 1
+merg th tr 1
+merg their observ 1
+merg to form 1
+merg to produc 1
+merg together se 1
+merg tw sort 1
+merg using 1
+merg v1 1
+merg v1 en 1
+merg with fragm 1
+merg1 1
+merger 1
+merger of oop 1
+meriald 1
+merit 12
+merit and def 1
+merit each system 1
+merit in construc 1
+merit is assign 1
+merit of clp 1
+merit of heur 1
+merit of multipl 1
+merlin 2
+merrit 2
+mersereau 1
+merz 1
+merz murph 1
+meseguer 1
+meseguer argu 1
+meseguer cal 1
+meseguer cal log 1
+meseguer prop 1
+mesg 1
+mesg streamrest 1
+mesg1 1
+mesg2 1
+mesh 18
+mesh 598a 1
+mesh and adapt 1
+mesh and consum 1
+mesh architectur 1
+mesh aut 1
+mesh bcsstk31 1
+mesh befor collap 1
+mesh bound. 1
+mesh collap 1
+mesh connect 5
+mesh connect architectur 1
+mesh connect computer 3
+mesh connect mach 1
+mesh connect parallel 1
+mesh cylinder93 1
+mesh decim 1
+mesh defin 1
+mesh describ 1
+mesh featur 1
+mesh for iter 1
+mesh hypercub 2
+mesh hypercub network 2
+mesh inter 1
+mesh inter cluster 1
+mesh interconnect 1
+mesh is cut 1
+mesh is displ 1
+mesh is regl 1
+mesh map1 1
+mesh multicomputer 1
+mesh network 2
+mesh of voron 1
+mesh optim 1
+mesh optim criter 1
+mesh orient 1
+mesh orient comput 1
+mesh partit 1
+mesh r con 1
+mesh reconstruc 1
+mesh reg 1
+mesh s38584.1 1
+mesh satisf 1
+mesh simplif 1
+mesh simplif method 1
+mesh stem 1
+mesh to connect 1
+mesh topolog 2
+mesh tor 1
+mesh trol 1
+mesh using 1
+mesh wh 1
+mesh when collap 1
+mesh with broadcast 1
+mesh with multipl 1
+mesh with row 1
+mesicar 1
+mesicar a med 1
+mesquit 1
+mesquit inc 1
+messagefselect 1
+messagefselect mov 1
+messagep 2
+messagep algorithm 1
+messagep mach 1
+messerschm 1
+mesur 5
+mesur con 1
+mesur dassurer 1
+mesur dassurer quavec 1
+mesur de 4
+mesur de calculer 1
+mesur de ce 1
+mesur de comparer 1
+mesur de construir 1
+mesur de dist 1
+mesur de fournir 1
+mesur de la 1
+mesur de le 1
+mesur de perform 2
+mesur de pr 1
+mesur de proposer 1
+mesur de qualit 1
+mesur de terminer 1
+mesur didentif 1
+mesur didentif le 1
+mesur doit 1
+mesur doit augmenter 1
+mesur doit permettr 1
+mesur don 1
+mesur don ee 1
+mesur e la 1
+mesur e le 1
+mesur e sur 1
+mesur ee 1
+mesur effectu 1
+mesur effectu ee 1
+mesur es 1
+mesur es en 1
+mesur es sont 1
+mesur est 1
+mesur et de 1
+mesur exp 1
+mesur exp erim 1
+mesur invar 1
+mesur le 1
+mesur le calcl 1
+mesur le temp 1
+mesur li 1
+mesur li ee 1
+mesur linstruc 1
+mesur linstruc uclock 1
+mesur loc 1
+mesur loc avec 1
+mesur nous 1
+mesur nous int 1
+mesur ou 1
+mesur ou du 1
+mesur par 1
+mesur par lexpr 1
+mesur proch 1
+mesur proch de 1
+mesur qu 2
+mesur qu nous 1
+mesur qu soit 1
+mesur quantit 1
+mesur rel 1
+mesur simpl 1
+mesur sont 1
+mesur sont don 1
+mesur temporel 1
+mesur temporel rel 1
+mesurer 3
+mesurer le 1
+mesurer le taux 1
+mesurer leur 1
+mesurer pr 1
+mesurer pr ci 1
+metaaqu 1
+metaaqu empl 1
+metaaqu reason 1
+metabol 1
+metac 2
+metacircl 1
+metacircl interpreter 1
+metacl 1
+metacl can prov 1
+metacl control 1
+metacl in eulisp 1
+metaevolut 1
+metaevolut recur 1
+metaevolut recur cr 1
+metainst 1
+metainterpreter 1
+metainterpreter is pr 1
+metal 2
+metal wir 2
+metalangu 1
+metalevel 1
+metalevel architectur 1
+metamathemat 1
+metaobj 1
+metaobject 2
+metaobject and point 1
+metaobject level 1
+metaobject level program 1
+metaobject point 1
+metaobject protocol 2
+metaobjfcl 1
+metaobjfcl point 1
+metaphor 2
+metaproduc 1
+metaproduc which help 1
+metaprogram 2
+metaprogram purp 1
+metastructur 2
+metastructur vs 1
+metaterm 2
+metaterm and ext 1
+metaterm handler 1
+metaterm is record 1
+metatheor 1
+metavariabl 1
+metavariabl appear 1
+metavariabl wh valu 1
+metaxp 1
+metaxp ar structur 1
+metcalf 1
+meter 16
+meter and cod 1
+meter and enter 1
+meter and object 1
+meter and spac 2
+meter and topolog 1
+meter ar displ 1
+meter ar specif 1
+meter ba 1
+meter field 1
+meter opt 1
+meter parameter 1
+meter proper 1
+meter system 1
+meter to an 1
+meter to determin 1
+meter to test 1
+meter typ 1
+meter typ avail 1
+meter window 1
+meth 1
+method 97
+method accept 1
+method accept mer 1
+method ad 1
+method ad subsequ 1
+method al ec 1
+method algorithm 1
+method algorithm using 1
+method allow 3
+method alw belong 1
+method and abstract 1
+method and appl 2
+method and architectur 1
+method and compar 1
+method and dat 1
+method and disabl 1
+method and funct 1
+method and method 1
+method and pract 1
+method and problem 1
+method and structur 1
+method and system 3
+method and tool 1
+method and var 1
+method ap 1
+method appear 3
+method appl 3
+method appl algorithm 1
+method approach 2
+method ar appl 3
+method ar attach 1
+method ar cl 1
+method ar creat 1
+method ar defin 1
+method ar dep 1
+method ar develop 1
+method ar disabl 1
+method ar disc 2
+method ar flec 1
+method ar gener 1
+method ar good 1
+method ar heur 1
+method ar immut 1
+method ar overload 1
+method ar particl 1
+method ar plan 1
+method ar pr 1
+method ar pract 1
+method ar prop 1
+method ar report 1
+method ar sort 1
+method ar spec 1
+method ar split 1
+method ar subcl 1
+method ar test 1
+method arg 1
+method as funct 1
+method as good 1
+method assoc 2
+method attach 1
+method attempt 1
+method av 1
+method av oper 1
+method avail 1
+method ba 8
+method behaviour 1
+method being ad 1
+method bod 2
+method bound 1
+method but exploit 1
+method by cal 1
+method by enabl 1
+method cal explor 1
+method cal heapsort 1
+method can mak 1
+method can outperform 1
+method can signif 1
+method cannot inclus 1
+method cel 1
+method cel se 1
+method ch 1
+method chang 1
+method check 1
+method cl 1
+method cl gener 1
+method cl method 1
+method cl nam 1
+method comb 3
+method con 1
+method concentr 1
+method contain 1
+method contain becom 1
+method cop 1
+method correct 1
+method correspon 1
+method could handl 1
+method cur 1
+method cur consider 1
+method d0 1
+method def 1
+method defin 2
+method definit 2
+method dep 4
+method der 1
+method der finit 1
+method describ 6
+method descript 1
+method descript method 1
+method design 1
+method detract 1
+method develop 1
+method devot 1
+method dispatch 1
+method dispatch algorithm 1
+method dist 1
+method distribut 1
+method distribut cluster 1
+method divid 1
+method do subst 1
+method domain 1
+method domain clash 1
+method domain tel 1
+method drast 1
+method e prov 1
+method each constraint 1
+method ec 1
+method embod 1
+method ensur 1
+method eval 1
+method evalu 2
+method evalu point 1
+method execut 3
+method execut becom 1
+method execut dep 1
+method f2 1
+method f21 1
+method fail 1
+method finish 1
+method first satisf 1
+method for 3d 1
+method for achief 2
+method for adjust 1
+method for an 1
+method for assign 1
+method for block 1
+method for build 1
+method for chunk 1
+method for cl 1
+method for classif 1
+method for cluster 1
+method for compan 1
+method for comput 1
+method for computer 2
+method for concat 1
+method for control 1
+method for creat 1
+method for decluster 1
+method for determin 4
+method for diffus 1
+method for distribut 1
+method for divid 1
+method for dynam 1
+method for el 1
+method for elimin 1
+method for estim 1
+method for extract 1
+method for feedfor 1
+method for find 1
+method for grammat 1
+method for handl 1
+method for imp 1
+method for implem 1
+method for improv 1
+method for ind 1
+method for infer 1
+method for init 1
+method for inst 1
+method for integr 1
+method for interconnect 1
+method for interior 1
+method for keep 1
+method for knowledg 2
+method for learn 1
+method for lin 2
+method for low 1
+method for lp 1
+method for mod 1
+method for multistrateg 1
+method for no 1
+method for nonherm 1
+method for object 1
+method for parallel 1
+method for partit 1
+method for perform 1
+method for plan 1
+method for point 2
+method for probabil 1
+method for quick 1
+method for rang 1
+method for rat 1
+method for reason 1
+method for reconstruc 1
+method for recov 1
+method for register 1
+method for rest 1
+method for rev 1
+method for sensit 1
+method for simplif 1
+method for solut 3
+method for specif 1
+method for ssm 1
+method for standard 1
+method for stat 1
+method for structur 2
+method for support 1
+method for synchron 1
+method for tempor 1
+method for theor 1
+method for toeplitz 1
+method for tr 2
+method for unconstrain 1
+method form 1
+method from mathemat 1
+method from sect 1
+method funct 2
+method g level 1
+method gav 1
+method gener 2
+method gener funct 1
+method gf 1
+method gf comput 1
+method gf method 1
+method giv 2
+method ha congest 1
+method ha knowledg 1
+method ha succ 1
+method handl 1
+method heur 1
+method heur classif 1
+method hold 1
+method hold lock 1
+method impl 1
+method in bound 1
+method in effort 1
+method in fact 1
+method in figur 1
+method in imag 1
+method in lin 1
+method in object 1
+method in oop 1
+method in pe 1
+method in phy 1
+method in polynom 1
+method in schem 1
+method in sect 1
+method in sem 1
+method in term 1
+method in tim 1
+method incorpor 1
+method incorpor context 1
+method ind 1
+method init 2
+method init opt 1
+method int record 1
+method interfac 1
+method interfac defin 1
+method invoc 4
+method invoc mechan 1
+method invoc request 1
+method invoc run 1
+method involut 4
+method involut answer 1
+method involut st 1
+method is absolut 1
+method is ad 1
+method is analog 1
+method is appl 3
+method is assoc 1
+method is ba 2
+method is branch 1
+method is complec 1
+method is comput 1
+method is conver 1
+method is cost 1
+method is cur 1
+method is defin 2
+method is denot 1
+method is describ 1
+method is effect 1
+method is evalu 1
+method is expect 1
+method is funct 1
+method is ident 1
+method is implem 1
+method is invok 1
+method is larg 1
+method is nec 1
+method is obtain 1
+method is perform 1
+method is pr 1
+method is prec 1
+method is program 1
+method is prop 1
+method is sensit 1
+method is somewhat 1
+method is suff 1
+method is thus 1
+method it dec 1
+method known 3
+method label 1
+method label simpl 1
+method lambd 1
+method lambd form 1
+method lambd method 1
+method lansp 1
+method laz 1
+method laz inv 1
+method lead 1
+method learn 1
+method list 2
+method look 1
+method lookup 2
+method lookup determin 1
+method lookup funct 1
+method lookup protocol 1
+method lookup strateg 1
+method loop 1
+method loop gener 1
+method m dlb 1
+method m ye 1
+method m1 1
+method m2 1
+method mak 3
+method mak form 1
+method mathemat 1
+method may caus 1
+method may chang 1
+method may handl 1
+method me 1
+method metaobj 1
+method metaobject 2
+method metaobject point 1
+method method 2
+method method descript 1
+method method domain 1
+method method spec 1
+method most appropr 1
+method mov 1
+method must group 1
+method must spec 1
+method nam 5
+method nam conv 1
+method nam correspon 1
+method nam dist 1
+method nam exp 1
+method nam mov 1
+method nam sum 1
+method next method 1
+method non 1
+method non congru 1
+method object 1
+method obtain 1
+method of activ 1
+method of an 2
+method of anim 1
+method of attack 1
+method of cach 1
+method of calcl 2
+method of ch 2
+method of comput 1
+method of conjug 1
+method of construc 2
+method of decluster 1
+method of decomposit 1
+method of defin 1
+method of del 1
+method of determin 1
+method of dynam 1
+method of edg 1
+method of edit 1
+method of elicit 1
+method of exper 1
+method of explor 1
+method of inform 1
+method of learn 1
+method of me 2
+method of measur 1
+method of metaobj 1
+method of model 1
+method of pag 1
+method of parallel 1
+method of pederson 1
+method of prepar 1
+method of reason 1
+method of reflect 1
+method of repeat 1
+method of repl 1
+method of report 1
+method of repr 1
+method of schem 1
+method of sect 2
+method of separ 1
+method of siz 1
+method of spat 1
+method of ssm 1
+method of structur 1
+method of theorem 1
+method of think 1
+method of viewcach 1
+method of weight 1
+method offer 1
+method oft reduc 1
+method oft seek 1
+method on a1 1
+method on compl 1
+method on gener 1
+method on multidisk 1
+method on un 1
+method onl search 1
+method oper 2
+method or ap 1
+method outperform 3
+method outperform random 1
+method p return 1
+method paradox 1
+method paradox lead 1
+method perform 2
+method point 1
+method port 1
+method port low 1
+method pr 1
+method produc 1
+method profit 1
+method program 1
+method prop 1
+method prov 3
+method prov good 1
+method rank 1
+method rank ba 1
+method reappear 1
+method rec 2
+method rec develop 1
+method rec simp 1
+method recogn 1
+method reduc 1
+method remov 1
+method requir 3
+method requir compiler 1
+method requir ks 1
+method retain 1
+method return 1
+method revisit 2
+method script 1
+method sect 1
+method simil 2
+method siz 1
+method siz unoptim 1
+method spec 2
+method spec form 1
+method spec lamb 1
+method spec lambd 1
+method specif 2
+method split 1
+method st 1
+method st var 1
+method stud 1
+method stud using 1
+method suffer 1
+method suggest 1
+method support 2
+method support fin 2
+method tabl 1
+method tak 1
+method tel 1
+method tel condit 1
+method th garb 1
+method th situ 1
+method th system 1
+method th valu 1
+method that allow 1
+method that construc 1
+method that corrobor 1
+method that particl 1
+method that requir 2
+method that transform 1
+method that us 1
+method to acc 1
+method to cal 1
+method to car 1
+method to cluster 1
+method to cr 1
+method to decluster 1
+method to deliver 1
+method to determin 2
+method to eff 1
+method to estim 1
+method to extern 1
+method to giv 1
+method to impl 1
+method to improv 1
+method to inclus 1
+method to init 1
+method to know 1
+method to label 1
+method to maintain 2
+method to obtain 2
+method to overcom 1
+method to perform 2
+method to post 1
+method to push 1
+method to reduc 1
+method to regr 1
+method to requir 1
+method to resolut 1
+method to return 1
+method to solut 1
+method to specif 1
+method to support 1
+method to understand 1
+method tok 1
+method tr 3
+method tripletvalu 1
+method try 3
+method under consider 1
+method us 1
+method using 6
+method using error 1
+method using lat 1
+method using minim 1
+method using ordin 1
+method using writ 1
+method wa appl 1
+method wa design 1
+method wa develop 1
+method we obtain 1
+method we preserv 1
+method wer perform 1
+method when build 1
+method whenever fe 1
+method which acquir 1
+method which concentr 1
+method which describ 1
+method which encomp 1
+method which spec 2
+method which specializ 1
+method which upd 1
+method whil retain 1
+method wil con 1
+method wil obv 1
+method wil result 2
+method wil suffer 1
+method with good 1
+method with map 1
+method with polynom 1
+method with respect 1
+method with system 1
+method within level 1
+method within object 1
+method work 3
+method work brief 1
+method yield 1
+method1 1
+method2 1
+methodinit 1
+methodinit opt 1
+methodolog 28
+methodolog achief 2
+methodolog and model 1
+methodolog and system 1
+methodolog as describ 1
+methodolog developm 1
+methodolog for comp 1
+methodolog for control 1
+methodolog for perform 1
+methodolog for reduc 1
+methodolog for retest 1
+methodolog for select 1
+methodolog for test 1
+methodolog group 1
+methodolog ha emerg 1
+methodolog impl 1
+methodolog involut 1
+methodolog involut execut 1
+methodolog of integr 1
+methodolog of var 1
+methodolog to funct 1
+methodscl 1
+methodscl funct 1
+methodscl funct methodscl 1
+methodscl pr 1
+methodscl pr processingpartialevaluationpost 1
+metropol 1
+metropol test 1
+metropolitan 1
+metropolitan ar 1
+metropolitan ar network 1
+mettler 1
+mettler tol 1
+mettr 4
+mettr a jour 2
+mettr au 1
+mettr au compt 1
+mettr egal 1
+mettr egal lacc 1
+mettr en 3
+mettr en ad 1
+mettr en exergu 1
+mettr en oeuvr 2
+mettr en plac 1
+mettr en valeur 1
+mettr lacc 1
+mettr lacc sur 1
+mettr le 1
+mettr le register 1
+mettr lin 1
+mettr lin egalit 1
+mettr oeuvr 1
+mettr point 1
+mettr point de 1
+mettr sous 1
+mettr sous un 1
+mettr superficiel 1
+meulman 1
+meurig 1
+meurig beynon 1
+meurig beynon stev 1
+mexican 1
+mexprimer 1
+mey88 1
+meyd 1
+meyer 9
+meyer and wier 1
+meyer auf 1
+meyer auf der 1
+meyer et al 1
+mf 2
+mf heur 1
+mf heur prop 1
+mf problem 1
+mf problem ar 1
+mf problem us 1
+mfc 1
+mfc migr 1
+mfc migr guid 1
+mflop 1
+mg 5
+mg 8j 1
+mg fa 1
+mg futur 1
+mg is st 1
+mg shuffl 1
+mg shuffl merg 1
+mg97 1
+mgnsg 1
+mgnsg fa 1
+mgnsg nvt 1
+mgnw 1
+mgnw is consider 1
+mgu 3
+mgu introduc 1
+mgu mgu 1
+mgu nil 1
+mgu return 1
+mgus 1
+mhf93 1
+mhp92 1
+mhz 8
+mhz clock 2
+mhz cpu 1
+mhz intel 1
+mhz intel pent 1
+mhz pc 1
+mhz pc took 1
+mhz sparc 1
+mhz sparc proc 1
+mi 61
+mi a contribut 1
+mi a faux 1
+mi a jour 3
+mi a path 1
+mi a vr 1
+mi ai 1
+mi ai lab 1
+mi al 1
+mi al eatoir 1
+mi alignm 1
+mi and mj 1
+mi ar artif 1
+mi au 2
+mi au point 2
+mi belong 1
+mi center 1
+mi classif 1
+mi classif reg 1
+mi condu 1
+mi conduit 1
+mi correspon 1
+mi cx 1
+mi d zi 1
+mi dat 1
+mi docum 1
+mi edg 2
+mi edg segm 1
+mi egrad 1
+mi egrad evol 1
+mi en 5
+mi en caus 1
+mi en correspon 1
+mi en evid 3
+mi en jeu 1
+mi en lum 1
+mi en oeuvr 4
+mi en plac 2
+mi en rout 1
+mi est 1
+mi est diff 1
+mi explan 1
+mi for uniproc 1
+mi guid 1
+mi guid ee 1
+mi implicit 1
+mi implicit invoc 1
+mi import docum 1
+mi ind 1
+mi ind knowledg 1
+mi ind structur 1
+mi indexedstructur 1
+mi int intern 1
+mi ip 1
+mi ip addr 1
+mi is ad 1
+mi is agreed 1
+mi is shown 1
+mi is st 1
+mi it respon 1
+mi j mach 2
+mi keyword 1
+mi label 1
+mi label edg 1
+mi lc 1
+mi le 1
+mi le contraint 1
+mi le valeur 1
+mi m1 1
+mi mi 1
+mi mi pgcd 1
+mi netsim 1
+mi nj 1
+mi nj mj 1
+mi occur 2
+mi or inadequ 1
+mi pack 1
+mi pack using 1
+mi pgcd 1
+mi po solut 1
+mi point 3
+mi point incr 1
+mi point problem 1
+mi pr 28
+mi predict 1
+mi predict branch 1
+mi rat 2
+mi schem 1
+mi schem mak 1
+mi serv 1
+mi som heav 1
+mi sous 1
+mi sous la 1
+mi sur 1
+mi sur la 1
+mi technisch 1
+mi technisch anwendung 1
+mi th car 1
+mi valu 2
+mi var 1
+mi worker 1
+mi1 1
+mi1 aic0 1
+mi1 aic0 bi 1
+mi90 1
+miam 1
+miam beach 1
+mic 16
+mic and match 2
+mic cl 2
+mic connect 1
+mic connect pair 1
+mic connect se 1
+mic datab 1
+mic datab workload 1
+mic fic 1
+mic fic oper 1
+mic fl 1
+mic fl connect 1
+mic graph 1
+mic graph assoc 1
+mic in cl 1
+mic in method 1
+mic increm 1
+mic increm compil 1
+mic indirect 1
+mic indirect connect 1
+mic indirect fl 1
+mic lin 1
+mic lin program 1
+mic list 1
+mic object 1
+mic object orient 1
+mic of pandemon 1
+mic of vid 1
+mic program 1
+mic program contain 1
+mic scal 1
+mic scal decomposit 1
+mic term 1
+mic text 1
+mic text graph 1
+mic text imag 1
+micah 1
+micah beck 1
+mich 4
+mich aslup 1
+mich me 1
+mich point 1
+michael 21
+michael barborak 1
+michael ber 1
+michael burrow 1
+michael car 1
+michael cox 1
+michael dobrovolsk 1
+michael fisch 1
+michael freest 1
+michael gerndt 1
+michael jackson 1
+michael kif 1
+michael leu 1
+michael mel 1
+michael mel smith 1
+michael mil 1
+michael natkin 1
+michael sak 1
+michael stonebaker 1
+michael stonebraker 1
+michael william 1
+michael wolf 1
+michalsk 1
+michel 4
+michel beacc 1
+michel dorochevsk 1
+michel dorochevsk qu 1
+michel ruffin 1
+michelin 1
+michigan 5
+michigan pr 1
+michigan st 1
+mick 1
+mick jordan 1
+micr 10
+micr and macr 1
+micr dev 1
+micr electron 1
+micr instruc 1
+micr instruc register 1
+micr kernel 2
+micr kernel ba 1
+micr par 1
+micr par elism 1
+micr parallel 1
+micr parallel avail 1
+micr pipel 1
+micr pipel micr 1
+micr sec 1
+micr secon 1
+micr structur 1
+micr vac 1
+micr vac workst 1
+microarchitectur 2
+microarchitectur for reus 1
+microceyx 1
+microcod 1
+microcod and hardwar 1
+microcod branch 1
+microcod control 1
+microcod control unit 1
+microcod ee 1
+microcod et de 1
+microcod funct 1
+microcod funct cod 1
+microcod level 1
+microcod manu 1
+microcod mult 1
+microcod of condit 1
+microcod ram 1
+microcod ren 1
+microcod rout 1
+microcod rout correspon 1
+microcod spec ver 1
+microcod test 1
+microcod test program 1
+microfilm 2
+microinstruc 1
+micron 2
+micron apart 2
+microphon 1
+microproc 4
+microproc adv 1
+microproc adv inform 1
+microproc and microprogram 2
+microproc ext 1
+microproc speed 1
+microprocesseur 1
+microprogram 3
+microprogram and prov 1
+microprogram diff 1
+microprogram diff erent 1
+microprogram environm 1
+microprogram part 1
+microprogram produc 1
+microprogram th wam 1
+microsec 2
+microsecon 5
+microsecon and network 1
+microsoft 6
+microsoft corpor 2
+microsoft found 1
+microsoft found cl 1
+microsoft ol 1
+microsoft ol technolog 1
+microsoft os 1
+microsoft pr 1
+microsoft s acc 1
+microsoft s migr 1
+microsoft s windowstm 1
+microsoft system 1
+microsoft window 2
+microsoft word 1
+microstructur 2
+microstructur of cognit 2
+microsystem 6
+microsystem inc 2
+microsystem sparcst 1
+mid 1
+mid di 1
+mid di del 1
+mid is rel 1
+middl 10
+middl ca 1
+middl eastern 1
+middl eastern terror 1
+middl level 1
+middl point 1
+middl tw level 1
+midnight 1
+midpoint 1
+midterm 1
+midterm and fin 1
+mieux 4
+mieux a ce 1
+mieux adapt 2
+mieux adapt ee 1
+mieux adapt es 1
+mieux cerner 1
+mieux cerner le 1
+mieux comprendr 1
+mieux comprendr la 1
+mieux en 1
+mieux en term 1
+mieux laisser 1
+mieux laisser au 1
+mieux pouvoir 1
+mieux pouvoir le 1
+mieux qu 1
+mieux qu lon 1
+mieux utiliser 1
+mieux utiliser le 1
+migr 8
+migr algorithm 1
+migr atteint 1
+migr atteint le 1
+migr daemon 1
+migr de 1
+migr de bloc 1
+migr de cel 1
+migr de diff 1
+migr de don 1
+migr de la 1
+migr de pag 1
+migr de processus 1
+migr don 1
+migr du 1
+migr dun 1
+migr dun pag 1
+migr est 1
+migr est alor 1
+migr est assur 1
+migr est egal 1
+migr et de 1
+migr guid 1
+migr inv 1
+migr la 1
+migr la popl 1
+migr mechan 1
+migr par 1
+migr par el 1
+migr par group 1
+migr pen 1
+migr pen le 1
+migr peut 1
+migr peut etr 1
+migr pour 1
+migr pour chaqu 1
+migr proc 1
+migr qu 1
+migr qu peuv 1
+migr rest 1
+migr rest loin 1
+migr sel 1
+migr suppl 1
+migr suppl ementair 1
+migr sur 1
+migr sur le 1
+migr syst 1
+migr syst ematiqu 1
+migr techniqu 1
+migr ver 1
+migr ver la 1
+migrateur 1
+migrer 1
+migrer au 1
+migrer au moin 1
+migrer cel 1
+migrer cel ci 1
+migrer la 1
+migrer la don 1
+migrer la pag 1
+migrer sur 1
+migrer sur le 1
+migrer un 1
+migrer un bloc 1
+migrer un fo 1
+migrer un lign 1
+mihelc 1
+mihn 1
+mihn marinescu 1
+mij 1
+mij phij 1
+mik 7
+mik blasg 1
+mik goodrich 1
+mik le 1
+mik mozer 1
+mik oft forg 1
+mik reev 1
+mik reiter 1
+mik rizz 1
+mikelson 1
+mil 13
+mil and naut 1
+mil d etat 1
+mil dic 1
+mil dic ecut 1
+mil dur ww 1
+mil hour 1
+mil hour handl 1
+mil hour mincruisespeed 1
+mil milliard 1
+mil milliard dop 1
+mil of appl 1
+mil of edg 1
+mil of intersect 1
+mil of libr 1
+mil of tran 1
+mil pour 1
+mil pour le 1
+mil secon 1
+mil std 3
+mil std 1815a 2
+mil90 1
+mil92 1
+milan 1
+mild 3
+mild alter 1
+mild condit 2
+milieu 2
+milieu de 2
+milieu de ch 1
+milieu de pag 1
+milieu de pil 1
+milieu etud 1
+milieu poreux 1
+milit 2
+milit secur 1
+milit secur pol 1
+milit targ 1
+milit targ recognit 1
+miller 13
+miller and thatch 1
+miller et al 1
+miller gil 1
+miller ic92.dv.z 1
+milliard 1
+milliard dop 1
+milliard dop erat 1
+million 5
+million edg 1
+million host 1
+million inst 1
+million instruc 1
+million lin 1
+million oper 1
+million user 1
+millisecon 3
+millisecon ar ind 1
+millisecon dun 1
+millisecon suiv 1
+millisecon suiv le 1
+millroth 1
+millroth ont 1
+millroth ont etud 1
+milner 3
+milner slogan 1
+milt 1
+milt keyn 1
+mim 3
+mim th ba 1
+mim th phy 1
+mimd 8
+mimd architectur 1
+mimd computer 2
+mimd constitu 1
+mimd constitu le 1
+mimd diff 1
+mimd dintel 1
+mimd dintel appart 1
+mimd distribut 1
+mimd distribut memor 1
+mimd en 1
+mimd en fonct 1
+mimd est 1
+mimd est dit 1
+mimd mach 2
+mimd multiproc 1
+mimd multiproc mach 1
+mimd parallel 1
+mimd parallel proc 1
+mimd se 1
+mimd se distingu 1
+mimd shar 1
+mimd shar memor 1
+mimd sont 2
+mimd sont pur 1
+mimd sont tout 1
+mimd spmd 1
+mimdsimd 1
+mimick 2
+mimick syntact 1
+mimick th concr 1
+mimicr 1
+mimicr achief 1
+min 39
+min a singl 1
+min ae 1
+min ajt 1
+min algorithm 1
+min and jean 1
+min angl 1
+min appl 1
+min assoc 1
+min assoc rl 1
+min automat 1
+min automat spec 1
+min avg 1
+min ba 2
+min ba cluster 2
+min block 1
+min block acc 1
+min by chiang 1
+min by xu 1
+min confid 1
+min cut 1
+min cut theorem 1
+min de 1
+min de par 1
+min direct 2
+min direct network 2
+min etc 1
+min f og 1
+min f sg 1
+min ffq1 1
+min ffq1gj 1
+min graph 1
+min graph reducemin16 1
+min ha simp 1
+min inputstart 1
+min inputstart input 1
+min introspect 1
+min is ch 1
+min is tak 1
+min is un 1
+min j2b 1
+min k2 1
+min mac 5
+min mac equ 1
+min mac min 1
+min mac rel 1
+min mac transact 1
+min maxfw 1
+min maxp 1
+min maxp fl 1
+min med 1
+min med mac 1
+min min 1
+min modl 1
+min modl altogether 1
+min modl architectur 1
+min modl avail 1
+min modl contain 1
+min modl environm 1
+min modl prescript 1
+min modl start 1
+min moy 1
+min moy mac 1
+min network 1
+min network respect 1
+min oe2s 1
+min or fat 1
+min pandemon 1
+min pandemon system 1
+min specif 1
+min superv 1
+min system 1
+min t min 1
+min to empl 1
+min to learn 1
+min tok 1
+min topolog 1
+min wa greater 1
+min worker 1
+min. 1
+min1 2
+min1 i nf 1
+min1 i p0 1
+minair 1
+minair de 1
+minair de probabilit 1
+minam 1
+mincruisespeed 1
+mincycl 1
+mincycl algorithm 1
+mind 22
+mind abil 1
+mind and thus 1
+mind can interpr 1
+mind f ye 1
+mind for mak 1
+mind interpr 1
+mind is kept 1
+mind th benefit 2
+mind th crimson 1
+mind th incr 1
+mind th lim 1
+mind that candid 1
+mind when compar 1
+mind you leav 1
+mineur 1
+mineur du 1
+mineur du moteur 1
+mineur et il 1
+minf 1
+minf kn 1
+minf kn log 1
+minfd 1
+minff 1
+minfg 1
+minfk 2
+minfkn 1
+minfm 2
+minfn 3
+minfp 3
+minfr 1
+minfw 1
+minfwt 1
+ming 3
+ming chiang 1
+ming li 1
+miniat 1
+miniatur 1
+miniatur de 1
+miniatur de comp 1
+minidescript 1
+minidescript langu 1
+minim 87
+minim adequ 1
+minim adequ test 1
+minim aim 1
+minim alloc 1
+minim alloc rat 1
+minim amount 6
+minim and arrow 1
+minim and ea 1
+minim and maxim 7
+minim and merg 1
+minim and optim 1
+minim and saf 1
+minim and sum 1
+minim angl 1
+minim as compar 1
+minim assum 1
+minim au 1
+minim au sen 1
+minim aver 1
+minim aver lat 1
+minim ba 1
+minim bandwidth 1
+minim bandwidth alloc 1
+minim both tcomp 1
+minim bound 1
+minim bound rectangl 1
+minim bridg 1
+minim bridg connect 1
+minim calcl 1
+minim canon 1
+minim canon decomposit 1
+minim cap 1
+minim chang 1
+minim character 1
+minim character se 1
+minim commun 1
+minim complec 2
+minim complec msy 1
+minim comput 1
+minim comput follow 1
+minim con 2
+minim con maint 1
+minim condit 1
+minim configur 1
+minim congest 1
+minim congest hypergraph 1
+minim context 1
+minim context requir 1
+minim cost 5
+minim cost flow 1
+minim cover 1
+minim cp.in 1
+minim cr 1
+minim cr sect 1
+minim criter 1
+minim crosssect 1
+minim crosssect bandwidth 1
+minim curv 1
+minim curv algorithm 1
+minim curv approach 1
+minim curv con. 1
+minim curv concept 1
+minim curv method 1
+minim curv mult 1
+minim curv problem 1
+minim cycl 1
+minim cycl ba 1
+minim d el 1
+minim de 4
+minim de dist 1
+minim de migr 1
+minim de princip 1
+minim de temp 1
+minim decomposit 1
+minim degr 4
+minim degr ba 1
+minim degr heur 1
+minim degr network 1
+minim degr order 1
+minim degr span 1
+minim degr steiner 1
+minim degr turn 1
+minim del 3
+minim depth 1
+minim depth gener 1
+minim descript 2
+minim descript length 2
+minim determ 1
+minim df 1
+minim df con 1
+minim disjunct 1
+minim disjunct form 1
+minim disrupt 1
+minim dist 3
+minim disturb 1
+minim disturb learn 1
+minim don 1
+minim du 1
+minim du pa 1
+minim dun 2
+minim dun fonct 1
+minim dur learn 1
+minim edg 2
+minim edg cut 1
+minim edg separ 1
+minim el 4
+minim emb 1
+minim emb dim 1
+minim energ 1
+minim energ conform 1
+minim error 1
+minim error var 1
+minim est 1
+minim est atteint 1
+minim et maxim 1
+minim etait 1
+minim etait fa 1
+minim ext 1
+minim fil 2
+minim fil siz 1
+minim finish 1
+minim finish tim 1
+minim for copt 1
+minim format 1
+minim glob 1
+minim glob de 1
+minim hardwar 2
+minim hardwar bound 1
+minim hardwar nec 1
+minim hardwar nonblock 1
+minim hardwar requir 1
+minim hardwar support 1
+minim herbrand 1
+minim herbrand model 1
+minim hi 1
+minim hyperplan 1
+minim hyperplan configur 1
+minim incr 1
+minim incr channel 1
+minim infer 1
+minim inform 1
+minim inform assoc 1
+minim interv 2
+minim is achief 1
+minim is definit 1
+minim is tak 1
+minim it tot 1
+minim lat 3
+minim lat suffer 1
+minim layout 1
+minim layout ar 1
+minim le 1
+minim le pa 1
+minim leaf 1
+minim leaf span 1
+minim learn 1
+minim learn rat 1
+minim length 4
+minim length claus 1
+minim length cycl 1
+minim length encod 1
+minim length fundam 1
+minim lim 1
+minim lim equ 1
+minim link 1
+minim link nonblock 1
+minim loc 1
+minim loc mov 1
+minim mach 1
+minim mand 1
+minim mand privileg 1
+minim model 2
+minim model sem 1
+minim mov 1
+minim mult 1
+minim mult dim 1
+minim narx 1
+minim narx architectur 1
+minim ne 1
+minim ne refl 1
+minim nf 1
+minim nf problem 1
+minim nod 1
+minim nod cont 1
+minim non 1
+minim non neg 1
+minim number 14
+minim obtenu 1
+minim obtenu au 1
+minim occur 1
+minim of addit 1
+minim of crosspoint 1
+minim of experim 1
+minim of min 1
+minim of network 1
+minim on fault 1
+minim oper 1
+minim oper train 1
+minim or maxim 1
+minim other quant 1
+minim ou 1
+minim overhead 1
+minim par 1
+minim par acc 1
+minim partit 1
+minim perfect 1
+minim perfect hash 1
+minim perm 1
+minim perm ce 1
+minim po number 1
+minim po solut 1
+minim po valu 1
+minim point 2
+minim posit 2
+minim posit funct 1
+minim pot 1
+minim pour 1
+minim pour tout 1
+minim privileg 1
+minim privileg proper 1
+minim privileg se 1
+minim random 1
+minim random select 1
+minim rat 1
+minim rat equ 1
+minim repr 1
+minim reprogram 1
+minim reprogram effort 1
+minim requir 2
+minim requir incr 1
+minim residu 1
+minim residu method 1
+minim respon 2
+minim respon tim 2
+minim se 1
+minim serv 1
+minim serv offer 1
+minim siz 2
+minim solut 1
+minim solut requir 1
+minim span 4
+minim span tr 4
+minim ssm 1
+minim sub 2
+minim sub satisf 1
+minim system 1
+minim system complec 1
+minim techniqu 2
+minim test 1
+minim test select 1
+minim th 1
+minim th amount 2
+minim th ca 1
+minim th dist 1
+minim th edg 3
+minim th en 1
+minim th eoriqu 1
+minim th implem 1
+minim th lat 2
+minim th link 1
+minim th load 1
+minim th maxim 2
+minim th norm 1
+minim th number 3
+minim th object 1
+minim th overlap 1
+minim th po 1
+minim th respon 1
+minim th siz 1
+minim th squar 1
+minim th sum 1
+minim th surfac 1
+minim th task 1
+minim th tot 1
+minim th work 1
+minim than schem 1
+minim tim 2
+minim tol 1
+minim tol er 1
+minim tot 2
+minim tot commun 1
+minim tot length 1
+minim train 1
+minim train cost 1
+minim transver 1
+minim tru vect 1
+minim typ 1
+minim typ proper 1
+minim typ system 1
+minim typ work 1
+minim unidimensionel 1
+minim unidimensionel peut 1
+minim usuel 1
+minim valu 2
+minim vect 1
+minim ver 1
+minim ver le 1
+minim vol 1
+minim vol ac 1
+minim w.r.t 1
+minim weight 3
+minim weight arboresc 1
+minim weight augm 1
+minim weight bridg 1
+minim weight compar 1
+minim weight connect 1
+minim weight edg 2
+minim weight outg 1
+minim weight path 1
+minim weight span 2
+minim weight steiner 1
+minim weight subgraph 1
+minim width 1
+minim with respect 1
+minim without viol 1
+minim x qu 1
+minimac 1
+minimac polynom 1
+minimac polynom precondit 1
+minimiser 3
+minimiser cest 1
+minimiser cest notr 1
+minimiser le 2
+minimiser le co 1
+minimiser le crit 1
+minimiz 8
+minimiz cont 1
+minimiz rt 1
+minimiz th cost 1
+minimiz th edg 1
+minimiz th impact 2
+minimiz th number 1
+minimiz th respon 1
+minimiz th tot 1
+minimumand 1
+minimumand maxim 1
+minimumand maxim siz 1
+minimumdegr 1
+minimumdegr ba 1
+minimumdegr ba order 1
+minimumweight 1
+minimumweight outg 1
+minimumweight outg edg 1
+minister 3
+minister for research 1
+minister of educ 1
+minister of sc 1
+minit 1
+mink2 1
+minker 1
+minl 1
+minl branch 1
+minl branch strateg 1
+minl minl23 1
+minl minl23 maxl 1
+minl strateg 1
+minl variabl 1
+minl23 1
+minl23 maxl 1
+minl23 maxl maxl23 1
+minl23 variabl 1
+minmaxp 1
+minneapol 5
+minneman 1
+minnesot 6
+minnesot supercomputer 1
+minnesot supercomputer institut 1
+minofg 1
+minor 18
+minor addit 1
+minor alter 1
+minor and posit 1
+minor chang 2
+minor cultur 1
+minor cultur differ 1
+minor differ 1
+minor ee 1
+minor ee par 1
+minor format 1
+minor funct 1
+minor funct gj 1
+minor import 1
+minor improv 2
+minor modif 2
+minor part 1
+minor point 1
+minor refin 1
+minor sinc fd 1
+minor test 1
+minour 1
+minoux 1
+minp 1
+minp being posit 1
+minrol 1
+minrol and assign 1
+minrol and maxrol 1
+minrol ensur 1
+minrol if nec 1
+minrol is encounter 1
+minrol minrol 1
+minrol privileg 1
+minrol privileg se 1
+minrol rj 1
+minrol rj maxrol 1
+minroleg 1
+minroleminrol 1
+minroleminrol minrol 1
+minsk 1
+minsk soc 1
+mint 3
+mint eresser 1
+mint eresser de 1
+mintreestat 1
+mintz 1
+minuscl 1
+minuscl d enot 1
+minut 15
+minut and restart 1
+minut and secon 1
+minut between mak 1
+minut could mean 1
+minut hand 1
+minut hand pa 1
+minut to gener 2
+minut using 1
+minw2v 1
+minw2v fa 1
+minx 1
+minxf 1
+minzer 1
+mip 14
+mip r3000 2
+mip r3000 proc 2
+mip r4400 2
+mip r4400 proc 2
+mip risc 1
+mip risc architectur 1
+mip workst 1
+mir 1
+mireil 1
+mireil duc 1
+mireil et sarah 1
+miriam 1
+miriam leeser 1
+miroslaw 1
+miroslaw malek 1
+mirror 4
+mirror disk 1
+mirror disk configur 1
+mirror fil 1
+mirror filter 1
+misalignm 1
+misbehav 1
+misbehav connect 1
+misbehav flow 1
+misbehav whil other 1
+miscellan 1
+miscellean 1
+misclassif 2
+misclassif inst 1
+misclassif rat 1
+misconcept 1
+misconcept that going 1
+mishr 2
+mishr and u.s 1
+misind 1
+misind structur 1
+misind structur direct 1
+mislead 4
+mislead quest 1
+mislead result 1
+mislead th user 1
+mislead when interpr 1
+mismatch 5
+mismatch addr 1
+mismatch addr bit 1
+mismatch by modif 1
+mismatch character 1
+mismatch difficult 1
+mismatch difficult report 1
+mismatch exper 1
+mismatch identif 1
+mismatch occur 1
+mismatch or why 1
+misnavig 1
+misnavig oper 1
+misplac 2
+misplac object 1
+misplac object search 1
+misplac recur 1
+misplac recur cal 1
+mispredict 1
+mispredict branch 1
+mispredict result 1
+misr 1
+misrepr 1
+misrepr abstract 1
+missour 1
+mistak 6
+mistak mad 1
+mistak renam 1
+mistak thought 1
+mistak to try 1
+mister 1
+mister against mak 1
+mistim 1
+misu 1
+misu and koz 1
+misunderstand 2
+misunderstand which render 1
+misunderstood 1
+misus 1
+mitarbeiter 1
+mitarbeiter schmidhu.html 1
+mitchel 5
+mitchel and faustin 1
+mitchel wand 1
+mitig 5
+mitig th effect 1
+mitl 1
+mitr 1
+mitr corpor 1
+mitsuh 1
+mitsuh sat 1
+mitteilung 1
+mitzel 1
+mixedmot 1
+mixer 1
+mixf 1
+mixf not 1
+mixin 1
+mixin inherit 1
+mixt 2
+mixt litp 1
+mixt litp rxf 1
+mixtur 3
+mixtur of fac 1
+mixtur of loc 1
+mixtur of transform 1
+mixtus 1
+miyak 2
+miyashit 1
+miz 1
+mizun 1
+mj 7
+mj alor 1
+mj alor ij 1
+mj dan 1
+mj dan linterv 1
+mj e bn2 1
+mj e dajx00 1
+mj e en 1
+mj e ni2 1
+mj e nj2 1
+mj est 1
+mj est ent 1
+mj pgcd 1
+mj tel 1
+mj tel qu 1
+mk 6
+mk alor 1
+mk alor ik 1
+mk atteint 1
+mk atteint par 1
+mk cand 1
+mk est 1
+mk est appel 1
+mk et guid 1
+mk int decr 1
+mk mi 1
+mk of featur 1
+mk par 1
+mk par un 1
+mk produit 1
+mk produit matriciel 1
+mk rm 1
+mk si 1
+mk si mk 1
+mk soit 1
+mk soit posit 1
+mk tel 1
+mk tel qu 1
+mk2 1
+mk2 kfj 1
+mk7 1
+mk7 6aa 1
+mkl 1
+mkl bmk 1
+mklesson5 1
+mklesson5 download 1
+mklesson5 download tool 1
+mklr90 1
+ml 14
+ml and locusrout 1
+ml and sl 1
+ml and water 1
+ml ar giv 1
+ml automat 1
+ml automat deduc 1
+ml concur 1
+ml concur control 1
+ml empl 1
+ml except 1
+ml except mechan 1
+ml framework 1
+ml layer 1
+ml layer impl 1
+ml maxfp 1
+ml minfp 1
+ml mult 1
+ml mult level 1
+ml onl return 1
+ml perform 1
+ml recov 1
+ml return 1
+ml sever tim 1
+ml sur 1
+ml sur limport 1
+ml system 1
+ml system disc 1
+ml system exploit 1
+ml system framework 1
+ml system prov 1
+ml to accomod 1
+ml86 1
+ml89 1
+mlb 1
+mlb algorithm 1
+mlb algorithm rel 1
+mlb perform 1
+mlb produc 1
+mlb produc partit 1
+mlearn 1
+mlearn mlreposit.html 1
+mlevel 1
+mlevel an.ps 1
+mlevel ser.ps 1
+mlip 1
+mlkp 1
+mlkp algorithm 1
+mlkp and mlb 1
+mlkp comput 1
+mlkp do slight 1
+mlkp is wor 1
+mlkp perform 1
+mlkp perform signif 1
+mlkp produc 1
+mlkp produc partit 1
+mlp 2
+mlp allow 1
+mlp ba 1
+mlp is defin 1
+mlp is disc 1
+mlp program 1
+mlp program adapt 1
+mlp program satisf 1
+mlp program using 1
+mlp rel 1
+mlr 1
+mlr approach 1
+mlr clr 1
+mlr cop 1
+mlr dur 1
+mlr dur record 1
+mlr framework 1
+mlr framework hold 1
+mlr log 1
+mlr log for 1
+mlr log record 1
+mlr minimiz 1
+mlr oper 1
+mlr oper log 1
+mlr recov 1
+mlr recov id 1
+mlr recov method 1
+mlr recov perm 1
+mlr recov work 1
+mlr requir 1
+mlr rol 1
+mlr rollback 1
+mlr solut 1
+mlreposit.html 1
+mlt 2
+mlt ct 1
+mlt is illustr 1
+mlt layer 1
+mlt mult 1
+mlt mult level 1
+mlt subtransact 1
+mlt subtransact cap 1
+mlt wil eventu 1
+mm 10
+mm diameter 1
+mm horizont 1
+mm horizont resolut 1
+mm mn 1
+mm mn log 1
+mm weight 1
+mm93 1
+mmc 1
+mmc as follow 1
+mmc inst 1
+mmc problem 1
+mmc problem correspon 1
+mmc problem gener 1
+mmc problem inst 1
+mmc with fan 1
+mmd 1
+mmd and amd 1
+mmd by georg 1
+mmd produc 1
+mmd produc slight 1
+mmod 1
+mmu 3
+mmu cach 1
+mmu cach cach 1
+mmu mmu 1
+mmu mmu cach 1
+mmu prov 1
+mmu to support 1
+mmucondit 1
+mmucondit cod 1
+mmucondit cod offsetbus 1
+mmus 1
+mmw92 1
+mmy96 1
+mn 17
+mn 1i 1
+mn and weight 1
+mn emoniqu 1
+mn emoniqu de 1
+mn emoniqu suiv 1
+mn h iter 1
+mn ir 1
+mn ir njr 1
+mn iw 1
+mn iw njw 1
+mn kh 1
+mn log 1
+mn log2 1
+mn logn 1
+mn m0 1
+mn mi 2
+mn mi cx 1
+mn mi egrad 1
+mn nl 1
+mn nl og 1
+mn o pmn 1
+mn ou 1
+mn95 2
+mnr 1
+mnr nl 1
+mnr nl og 1
+mnsteff 1
+mnsteff informatik.un 1
+mnsteff informatik.un erlang.de 1
+mo 6
+mo and repetit 1
+mo s bandwidth 1
+mo85 1
+moat 1
+moat rout 1
+moat rout algorithm 1
+moat router 1
+mobil 9
+mobil and addr 1
+mobil and tel 1
+mobil center 1
+mobil center track 1
+mobil character 1
+mobil comput 1
+mobil comput system 1
+mobil direct 1
+mobil environm 1
+mobil for schedl 1
+mobil investig 1
+mobil mechan 1
+mobil platform 1
+mobil robot 3
+mobil robot labor 1
+mobil robot manufactur 1
+mobil robot ster 1
+mobil robot vi 1
+mobil structur 1
+mobil structur light 1
+mobilit 1
+mobj 1
+mobj and me 1
+mobj me 1
+mobj metaobjfcl 1
+mobj metaobjfcl point 1
+mod 50
+mod 2k 1
+mod a narrow 1
+mod act 1
+mod al proc 1
+mod and dynam 1
+mod and modif 1
+mod and queu 1
+mod and repl 1
+mod and tempor 2
+mod ap 1
+mod ap currexp 1
+mod ap thenif 1
+mod ar form 1
+mod attach 1
+mod attach attribut 1
+mod avail 1
+mod by click 1
+mod cand 1
+mod cat 1
+mod cat describ 1
+mod concat 1
+mod conflict 1
+mod conflict matr 1
+mod continu 1
+mod continu po 1
+mod continu thenif 1
+mod currexp 1
+mod dacc 1
+mod dacc es 1
+mod dadr 1
+mod dadr pour 1
+mod de 4
+mod de commun 1
+mod de compil 1
+mod de construc 1
+mod de cr 1
+mod de fonct 1
+mod de par 1
+mod de program 2
+mod de reproduc 1
+mod de retour 1
+mod decl 1
+mod derefer 1
+mod dic 1
+mod dic ecut 1
+mod dorm 1
+mod dunif 1
+mod ec 1
+mod ecritur 1
+mod ecritur de 1
+mod ecritur peut 1
+mod ee 1
+mod ee ind 1
+mod el 5
+mod el al 1
+mod el canoniqu 1
+mod el centr 1
+mod el climatiqu 1
+mod el conceptuel 1
+mod el concurrentiel 1
+mod el de 3
+mod el dic 2
+mod el en 1
+mod el es 1
+mod el est 1
+mod el etait 1
+mod el fomel 1
+mod el formel 1
+mod el ne 1
+mod el nest 1
+mod el nous 1
+mod el par 2
+mod el per 1
+mod el peuv 1
+mod el pouv 1
+mod el pr 2
+mod el qu 1
+mod el saccompagn 1
+mod el sappu 1
+mod el se 1
+mod el spmd 1
+mod el systoliqu 1
+mod el th 1
+mod eliser 1
+mod eliser le 1
+mod est 1
+mod est var 1
+mod eval 1
+mod eval thenif 1
+mod expon 1
+mod expon oper 1
+mod extrair 1
+mod extrair attribut 1
+mod fam 1
+mod for commun 1
+mod for lexer 1
+mod forml 1
+mod guar 1
+mod in cscw 1
+mod in schedl 1
+mod in support 1
+mod in traff 1
+mod infer 1
+mod infer rl 1
+mod is dorm 1
+mod is eval 1
+mod le 1
+mod le 3d 1
+mod le de 1
+mod le moy 1
+mod le un 1
+mod le va 1
+mod lectur 1
+mod li 1
+mod li automatiqu 1
+mod li de 1
+mod li la 1
+mod li le 1
+mod li po 1
+mod li th 1
+mod log 2
+mod log program 2
+mod log s4 1
+mod logn 1
+mod m jd 1
+mod m sont 1
+mod manager 1
+mod manager label 1
+mod manager period 1
+mod maxcountv 1
+mod maxcountv measspeed 1
+mod me 1
+mod me lo 1
+mod mi 1
+mod mj 1
+mod mj alor 1
+mod mk 1
+mod mk alor 1
+mod modif 1
+mod modif attribut 1
+mod nest 1
+mod nest pa 1
+mod of acc 1
+mod of commun 1
+mod of cour 1
+mod of figur 1
+mod of interact 1
+mod of me 1
+mod of oper 2
+mod on computer 1
+mod oper 1
+mod oper nec 1
+mod ou 1
+mod ou de 1
+mod overhead 1
+mod p com 1
+mod p1 1
+mod perform 1
+mod pl 1
+mod pn 2
+mod pr 1
+mod pr log 1
+mod profon 1
+mod profon de 1
+mod profon modif 1
+mod queu 1
+mod queu st 1
+mod r eel 1
+mod requir 1
+mod return 1
+mod return bfather 1
+mod select 1
+mod select thenif 1
+mod shap 1
+mod sp 1
+mod sp ec 1
+mod superficiel 1
+mod superficiel de 1
+mod superficiel ne 1
+mod superficiel nec 1
+mod superficiel point 1
+mod superficiel retr 1
+mod superficiel trust 1
+mod th subject 1
+mod that fal 1
+mod then turn 1
+mod to acc 1
+mod to act 1
+mod to dorm 1
+mod to proc 1
+mod transl 1
+mod translockx 1
+mod translockx mod 1
+mod unif 1
+mod unif var 1
+mod util 1
+mod virtuel 1
+mod wa wor 1
+mod wh 1
+mod wh appear 1
+mod. 1
+mod3 1
+mod3 is continu 1
+mod31 1
+mod32 1
+mod4 1
+modalit 1
+modalit es 1
+modalit es de 1
+model 101
+model a bidirect 1
+model a flec 1
+model a gu 1
+model a network 1
+model a targ 1
+model a un 1
+model a wait 1
+model a wid 1
+model a worthwhil 1
+model abstract 3
+model abstract accord 1
+model abstract allow 1
+model account 1
+model act 1
+model ad 2
+model adequ 1
+model affect 1
+model affect pot 1
+model al illustr 1
+model al reduc 1
+model algorithm 1
+model allow 5
+model allow rel 1
+model alread comput 1
+model an architectur 1
+model an execut 1
+model and algebr 1
+model and altern 2
+model and built 1
+model and control 1
+model and design 1
+model and elabor 1
+model and enterpr 1
+model and experim 1
+model and ext 1
+model and forecast 1
+model and graph 1
+model and hey 1
+model and imag 1
+model and implem 1
+model and iter 1
+model and langu 1
+model and measur 2
+model and not 1
+model and pattern 1
+model and prepar 1
+model and prior 1
+model and qu 1
+model and refin 1
+model and result 1
+model and sem 1
+model and sql 1
+model and targ 1
+model and text 1
+model appear 1
+model appear anom 1
+model appear difficult 1
+model appl 1
+model approxim 1
+model ar candid 1
+model ar consider 1
+model ar const 1
+model ar creat 1
+model ar deeper 1
+model ar defin 1
+model ar develop 1
+model ar explain 1
+model ar isomorph 1
+model ar judg 1
+model ar on 1
+model ar repr 1
+model ar reproduc 1
+model ar sum 1
+model as defin 1
+model as den 1
+model asoc 1
+model aspect 1
+model assum 1
+model at interact 1
+model at tim 1
+model attempt 1
+model automat 1
+model automat appl 1
+model ba 7
+model ba approach 1
+model ba architectur 1
+model ba diagn 2
+model ba invar 1
+model ba knowledg 1
+model ba method 1
+model ba reason 2
+model ba recognit 1
+model ba rol 1
+model behaviour 1
+model being suggest 1
+model break 1
+model build 1
+model built 1
+model built using 1
+model by allow 1
+model by appropr 1
+model by dec 1
+model by identif 2
+model by pan 1
+model by record 1
+model by rewrit 1
+model by unidirect 1
+model by us 1
+model can elim 1
+model can fail 1
+model captur 1
+model categor 1
+model categor learn 1
+model channel 1
+model channel error 1
+model claim 1
+model com 1
+model comp 1
+model compar 1
+model complec 1
+model complec system 1
+model comput 1
+model con 4
+model con caus 1
+model concept 1
+model concept simil 1
+model concern 1
+model concern lo 1
+model concur 2
+model concur system 1
+model cover 1
+model cover funct 1
+model definit 1
+model deriv 1
+model describ 5
+model describ why 1
+model design 1
+model develop 1
+model dict 1
+model differ 1
+model direct 1
+model driv 1
+model driv knowledg 1
+model dynam 1
+model dynam proper 1
+model edit 1
+model empl 1
+model environm 2
+model estim 1
+model ethernet 1
+model explicit 2
+model extract 1
+model facilit 1
+model facilit rol 1
+model featur 2
+model first order 1
+model flit 1
+model flit level 1
+model flow 1
+model for adv 1
+model for an 2
+model for approxim 1
+model for babel 1
+model for chronolog 1
+model for computer 1
+model for creat 1
+model for dat 1
+model for distribut 1
+model for doubl 1
+model for ep 1
+model for fast 1
+model for fl 1
+model for gener 1
+model for gi 1
+model for high 1
+model for implem 1
+model for integer 1
+model for lampr 1
+model for lo 1
+model for mathemat 1
+model for multiag 1
+model for non 1
+model for nonlin 1
+model for parallel 3
+model for phr 1
+model for prolog 1
+model for recur 1
+model for rol 1
+model for shar 1
+model for start 1
+model for stat 1
+model for string 1
+model for surviv 1
+model for synchron 1
+model for system 1
+model for tam 1
+model for tempor 1
+model for traff 2
+model for transact 1
+model for unfold 1
+model framework 1
+model from environm 1
+model ftp 1
+model further 1
+model further using 1
+model ge 1
+model ge poor 1
+model gener 1
+model geograph 1
+model geograph appl 1
+model gs1000 1
+model ha chang 1
+model hav demonstr 1
+model identif 1
+model ignor 1
+model ignor control 1
+model illustr 1
+model im 1
+model im exper 1
+model imp 1
+model in acc 1
+model in build 1
+model in dat 2
+model in kb 1
+model in mind 1
+model in order 2
+model in var 1
+model inclus 2
+model inclus recur 1
+model incorpor 1
+model infer 1
+model infer further 1
+model int 1
+model int cl 1
+model int submodel 1
+model inter 1
+model inter loop 1
+model intersect 2
+model intersect proper 2
+model introduc 1
+model introduc se 1
+model involut 2
+model involut triangl 1
+model is abl 1
+model is ba 5
+model is compil 1
+model is complec 1
+model is construc 2
+model is defin 2
+model is develop 1
+model is dynam 1
+model is ext 1
+model is giv 1
+model is incompar 1
+model is individu 1
+model is isomorph 1
+model is mov 1
+model is proc 1
+model is repr 1
+model is simil 3
+model is spmd 1
+model is st 1
+model is therefor 1
+model knowledg 1
+model len 1
+model lik bsp 1
+model list 1
+model long term 1
+model mak 2
+model may us 1
+model mean 1
+model mechan 1
+model mechan deal 1
+model memor 1
+model memor architectur 1
+model ment 1
+model method 2
+model method allow 1
+model method dep 1
+model method mak 1
+model model 2
+model modl 1
+model modl isomorph 1
+model mor abstract 1
+model must begin 1
+model natur 2
+model natur ext 1
+model network 1
+model non 1
+model non termin 1
+model not 1
+model object 3
+model object st 1
+model of act 1
+model of author 1
+model of chang 1
+model of chronolog 1
+model of cluster 2
+model of complec 1
+model of comput 5
+model of computer 2
+model of concur 2
+model of cont 1
+model of cr 1
+model of dat 2
+model of distribut 1
+model of dynam 1
+model of field 1
+model of high 1
+model of human 1
+model of iron 1
+model of karp 1
+model of langu 1
+model of lin 1
+model of log 2
+model of mlp 1
+model of modest 1
+model of molecl 1
+model of motif 1
+model of mus 1
+model of nest 1
+model of parallel 2
+model of part 1
+model of plan 1
+model of react 1
+model of reason 1
+model of record 1
+model of recov 1
+model of rel 1
+model of requir 1
+model of resourc 1
+model of schem 1
+model of secon 1
+model of sect 1
+model of secur 1
+model of sign 1
+model of sparc 1
+model of subtyp 1
+model of tam 1
+model of uniform 1
+model of upd 1
+model of var 1
+model of water 1
+model on traff 1
+model oo 1
+model oo not 1
+model or comput 1
+model order 1
+model order accord 1
+model outl 1
+model outl detect 1
+model paradigm 2
+model paradigm exhibit 1
+model paradigm formaliz 1
+model parallel 1
+model parameter 1
+model part 1
+model part sld 1
+model pertain 1
+model pr 2
+model predict 2
+model predict incr 1
+model presum 1
+model presum suff 1
+model principl 1
+model proc 2
+model proc match 1
+model proc reflect 1
+model prop 2
+model prov 2
+model prov funct 1
+model quantif 1
+model quit accur 1
+model quit rel 1
+model rat 1
+model rat proport 1
+model real 1
+model real fault 1
+model rel 1
+model renam 1
+model renam renam 1
+model repl 1
+model repl block 1
+model repr 3
+model repr var 1
+model requir 1
+model result 1
+model rol 1
+model rol organ 1
+model rout 1
+model rout protocol 1
+model schedl 1
+model script 1
+model script langu 1
+model seek 1
+model seem 2
+model select 1
+model select algorithm 1
+model select techniqu 1
+model sem 2
+model server 1
+model server ba 1
+model sever nonlin 1
+model sever spar 1
+model sever step 1
+model ship 1
+model should reflect 2
+model show 1
+model siml 1
+model simultan 1
+model sl1 1
+model sl1 modl 1
+model sl1 parameter 1
+model sld 1
+model sld deriv 1
+model spar 1
+model spar system 1
+model specif 5
+model specif langu 1
+model sporad 1
+model stil show 1
+model structur 1
+model such direct 1
+model suit 1
+model summer 1
+model support 8
+model support intern 1
+model support look 1
+model support transact 1
+model suppr 1
+model system 2
+model tempor 3
+model tempor dat 1
+model tempor datab 2
+model th abstract 1
+model th approxim 1
+model th arrang 1
+model th ba 1
+model th behaviour 1
+model th compon 1
+model th context 1
+model th cost 1
+model th dat 1
+model th dec 1
+model th del 1
+model th design 1
+model th dynam 1
+model th fact 1
+model th featur 1
+model th glob 1
+model th impact 1
+model th import 1
+model th inst 1
+model th kcm 1
+model th kind 1
+model th memor 1
+model th nsfnet 1
+model th phy 1
+model th pot 1
+model th problem 1
+model th relationship 1
+model th search 1
+model th sect 1
+model th simultan 1
+model th st 1
+model th structur 2
+model th targ 1
+model th tempor 1
+model th tim 1
+model th transl 1
+model th typ 1
+model th underl 1
+model th user 1
+model th wait 1
+model th worst 1
+model that account 1
+model that approxim 1
+model that identif 1
+model that incorpor 1
+model that tak 1
+model that turn 1
+model theor 6
+model theor approach 1
+model theor framework 1
+model theor proper 2
+model theor reconstruc 1
+model thus 1
+model thus def 1
+model tim 1
+model to account 1
+model to admir 1
+model to allow 1
+model to an 1
+model to ch 2
+model to cluster 1
+model to compar 1
+model to comput 1
+model to def 1
+model to der 2
+model to diagn 1
+model to estim 1
+model to learn 1
+model to measur 1
+model to program 1
+model to prov 1
+model to re 1
+model to restrict 2
+model to verif 1
+model to workflow 1
+model topolog 1
+model tot 1
+model tot unfold 1
+model try 1
+model typ 1
+model unclear 1
+model under consider 1
+model under var 2
+model uniform 1
+model us 2
+model us prun 1
+model using 2
+model using ec 1
+model var 1
+model var observabl 1
+model vid 1
+model wa develop 1
+model wa giv 1
+model wa lim 1
+model wa prop 1
+model wait 1
+model we consider 1
+model we der 1
+model we prov 1
+model we us 1
+model wer ba 1
+model wer siml 1
+model wh 3
+model wh connect 1
+model wh intern 1
+model wh load 1
+model which an 1
+model which siml 1
+model which specif 1
+model wil guid 1
+model with appl 1
+model with consider 1
+model with control 1
+model with ec 1
+model with gener 1
+model with infinit 1
+model with infinitesim 1
+model with parallel 1
+model with part 1
+model with respect 1
+model with rot 1
+model with specl 1
+model with variabl 1
+model with work 1
+model without schedl 1
+model would converg 1
+model1 1
+modeldescriptionlangu 1
+modeldescriptionlangu start 1
+modeldescriptionlangu start run 1
+modeldesign 1
+modeler 1
+modeler anim 1
+modeler anim trim 1
+modeller 1
+modeller can act 1
+modeller in im 1
+modeltheor 1
+modeltheor result 1
+moder 7
+moder comput 1
+moder comput complec 1
+moder number 1
+moder optim 1
+moder optim schedl 1
+moder parallel 1
+moder parallel mach 1
+moder siz 2
+moder siz problem 2
+moder tim 1
+moder tim complec 1
+moder usag 1
+modern 5
+modern c compiler 1
+modern compiler 1
+modern computer 2
+modern phy 1
+modern sign 1
+modern sign proc 1
+modern workst 1
+modest 8
+modest ambit 1
+modest ambit appl 1
+modest complec 1
+modest dun 1
+modest dun lang 1
+modest famil 1
+modest model 1
+modest result 1
+modif 80
+modif a apporter 1
+modif a cl 1
+modif a collect 1
+modif a dat 1
+modif a liter 1
+modif a method 1
+modif a pour 1
+modif acc 1
+modif accord 1
+modif act 1
+modif act execut 1
+modif after stack 1
+modif algorithm 3
+modif algorithm postpon 1
+modif an ec 1
+modif an ef 1
+modif an immut 1
+modif and enh 1
+modif and evolut 1
+modif and expan 1
+modif and ext 1
+modif and refin 1
+modif and thus 1
+modif appear 1
+modif appear justif 1
+modif ar mad 1
+modif arbitr 1
+modif arbitr pij 1
+modif as follow 4
+modif attribut 1
+modif aus 1
+modif aus le 1
+modif by dynam 1
+modif by incr 1
+modif by khuller 1
+modif by prev 1
+modif by randel 1
+modif by repeat 1
+modif by setq 1
+modif cal 1
+modif cal rl 1
+modif capabil 1
+modif caus 1
+modif caus error 1
+modif ce 1
+modif ce ch 1
+modif ce register 1
+modif cg 1
+modif cg algorithm 1
+modif cg method 1
+modif chest 1
+modif chest clin 1
+modif chr 1
+modif chr finit 1
+modif cod 2
+modif cod appear 1
+modif compmst 1
+modif compon 1
+modif comput 1
+modif cruc 1
+modif cruc mechan 1
+modif de 4
+modif de aut 1
+modif de ce 1
+modif de distribut 1
+modif de don 1
+modif de droit 1
+modif de la 2
+modif de lo 1
+modif de lop 1
+modif de lordonnanc 1
+modif de lorgan 1
+modif de man 2
+modif de plac 1
+modif de register 1
+modif describ 1
+modif design 1
+modif dist 1
+modif dist funct 1
+modif doiv 1
+modif doiv etr 1
+modif donc 1
+modif donc le 1
+modif du 3
+modif du foncteur 1
+modif du protocol 1
+modif dun 2
+modif dun instruc 1
+modif dun mot 1
+modif e afin 1
+modif e de 1
+modif e du 1
+modif e en 1
+modif e par 1
+modif ed 1
+modif edg 1
+modif edg weight 1
+modif ee 3
+modif ee afin 1
+modif ee com 1
+modif ee en 1
+modif ee ne 1
+modif ee ou 1
+modif ee par 1
+modif en 1
+modif en plac 1
+modif eram 1
+modif es 2
+modif es au 1
+modif es ne 1
+modif es par 2
+modif es qu 1
+modif es si 1
+modif est 1
+modif est remplac 1
+modif et lu 1
+modif evalu 1
+modif evalu continu 1
+modif eventuel 1
+modif eventuel le 1
+modif foc 1
+modif for handl 1
+modif for implem 1
+modif for procedur 1
+modif fortran 1
+modif fortran program 1
+modif fournit 1
+modif funct 1
+modif funct ensur 1
+modif gener 1
+modif gram 1
+modif gram schimdt 1
+modif graph 1
+modif heav 1
+modif heav edg 1
+modif hem 1
+modif heur 1
+modif implem 1
+modif increm 1
+modif indep 1
+modif inst 1
+modif inst variabl 1
+modif instruc 1
+modif int account 1
+modif involut 1
+modif involut run 1
+modif ip 1
+modif is adequ 1
+modif is rar 1
+modif is reduc 1
+modif is reflect 1
+modif it prior 1
+modif it search 1
+modif it valu 1
+modif it wh 1
+modif l eg 1
+modif la 3
+modif la longueur 1
+modif la pag 1
+modif la part 1
+modif la pil 1
+modif la port 1
+modif la probabilit 1
+modif la syntac 1
+modif la tail 1
+modif la topolog 1
+modif la wam 1
+modif lanc 1
+modif lanc attribut 1
+modif lancz 1
+modif lancz tridiagon 1
+modif lattribut 1
+modif lattribut dun 1
+modif le 3
+modif le attribut 1
+modif le champ 1
+modif le cod 1
+modif le don 1
+modif le foncteur 1
+modif le meilleur 1
+modif le program 1
+modif le protocol 1
+modif le register 1
+modif learn 1
+modif learn rl 1
+modif lin 1
+modif list 1
+modif lop 1
+modif lop erat 1
+modif lordr 1
+modif lordr de 1
+modif mad 1
+modif mak 1
+modif mak us 1
+modif med 1
+modif med strateg 1
+modif mineur 1
+modif mineur du 1
+modif ne 1
+modif ne fait 1
+modif network 1
+modif network configur 1
+modif ni 1
+modif ni lordonnanc 1
+modif non 1
+modif non observabl 1
+modif notr 1
+modif notr sp 1
+modif of aic 1
+modif of bind 1
+modif of concept 1
+modif of context 1
+modif of dpl 1
+modif of ec 1
+modif of flesh 1
+modif of ip 1
+modif of ph 1
+modif of pij 1
+modif of prob 1
+modif of singl 1
+modif of xunrang 1
+modif omt 1
+modif omt diagram 1
+modif on lin 1
+modif ont 1
+modif ont pour 1
+modif or affect 1
+modif or built 1
+modif or funct 1
+modif or propr 1
+modif orient 1
+modif orient softwar 1
+modif our algorithm 1
+modif pa 3
+modif pa lanc 1
+modif pa le 2
+modif pa lordr 1
+modif par 2
+modif par affect 1
+modif par rapport 1
+modif per tim 1
+modif peut 1
+modif peut etr 1
+modif peuv 1
+modif peuv etr 1
+modif plus notabl 1
+modif pour 1
+modif pour la 1
+modif problem 1
+modif procedur 1
+modif program 2
+modif program acceler 1
+modif program cel 1
+modif program comput 1
+modif program consider 1
+modif program cur 1
+modif program en 1
+modif program execut 1
+modif program lead 1
+modif program modif 1
+modif program prec 1
+modif program remain 1
+modif program run 1
+modif program underg 1
+modif program ver 1
+modif qu 3
+modif qu peuv 1
+modif qu pour 1
+modif qu tr 1
+modif quadtr 1
+modif quadtr dat 1
+modif quand 1
+modif quand cest 1
+modif r ever 1
+modif r eversibl 1
+modif recur 1
+modif recur neur 1
+modif rest 2
+modif rest list 1
+modif rmsp 1
+modif rmsp nak 1
+modif rmsp rmsp 1
+modif rmsp throughput 1
+modif se 1
+modif select 1
+modif select rl 1
+modif ser 1
+modif ser destampil 1
+modif shar 1
+modif shar dat 1
+modif siml 1
+modif siml scenar 1
+modif simultan 1
+modif slight 2
+modif softwar 1
+modif som constraint 1
+modif som prob 1
+modif spat 1
+modif spat qu 1
+modif speed 1
+modif stat 1
+modif stop 1
+modif stop rl 1
+modif suiv 1
+modif sur 2
+modif sur la 2
+modif th algorithm 2
+modif th bind 1
+modif th cach 1
+modif th cod 1
+modif th cont 1
+modif th context 1
+modif th correspon 1
+modif th cur 1
+modif th dist 1
+modif th docum 1
+modif th ec 1
+modif th environm 1
+modif th environm2 1
+modif th execut 1
+modif th heur 1
+modif th implem 1
+modif th init 1
+modif th inst 1
+modif th look 1
+modif th mov 1
+modif th network 1
+modif th origin 3
+modif th plan 1
+modif th probabil 1
+modif th proof 1
+modif th qu 1
+modif th refin 1
+modif th rl 1
+modif th schem 1
+modif th se 1
+modif th st 1
+modif th tr 1
+modif th transl 1
+modif th transport 1
+modif that speed 1
+modif to accommod 1
+modif to def 1
+modif to describ 1
+modif to drop 1
+modif to expan 1
+modif to handl 1
+modif to incorpor 1
+modif to ind 1
+modif to maintain 1
+modif to menu 1
+modif to player 1
+modif to reduc 1
+modif to start 1
+modif to support 2
+modif to us 2
+modif to work 1
+modif transform 1
+modif transform spec 1
+modif traver 1
+modif traver du 1
+modif traver test 1
+modif un 2
+modif un mot 1
+modif un var 2
+modif us 1
+modif valu 1
+modif var 1
+modif var init 1
+modif ver 7
+modif ver individu 1
+modif vi reif 1
+modif wa reason 1
+modif weight 1
+modif weight funct 1
+modif wer cancel 1
+modif wer comput 1
+modif when unif 1
+modif would lead 1
+modifiabl 1
+modifiabl unif 1
+modifiabl unif leur 1
+modificationtraver 1
+modioc 1
+modioc apport 1
+modioc apport es 1
+modl 37
+modl a import 1
+modl a mak 1
+modl a theor 1
+modl accompan 1
+modl ad 1
+modl ad method 1
+modl adapt 1
+modl adapt spec 1
+modl after syntac 1
+modl al mean 1
+modl alloc 2
+modl alloc method 1
+modl alloc techniqu 1
+modl allow 1
+modl altogether 1
+modl and abstract 1
+modl and coroutin 1
+modl and div 1
+modl and gener 1
+modl and interfac 1
+modl and link 1
+modl and mic 1
+modl and prev 1
+modl and syntac 1
+modl and tak 1
+modl approach 1
+modl appropr 1
+modl ar assoc 1
+modl ar bound 1
+modl ar built 1
+modl ar concern 1
+modl ar conserv 1
+modl ar defin 1
+modl ar distinct 1
+modl ar empl 1
+modl ar extr 1
+modl ar manag 1
+modl ar requir 1
+modl ar val 1
+modl architectur 2
+modl as roam 1
+modl as st 1
+modl ask 1
+modl assoc 1
+modl avail 1
+modl b vi 1
+modl ba 1
+modl begin 1
+modl begin proc 1
+modl being defin 1
+modl being exp 1
+modl bind 1
+modl bind environm 1
+modl but using 1
+modl by ad 1
+modl by using 1
+modl cal 1
+modl cal hierarch 1
+modl cal subsolver 1
+modl can self 1
+modl ch 1
+modl circl 1
+modl cl 1
+modl cl resembl 1
+modl cod 1
+modl compiler 1
+modl composit 2
+modl composit rl 1
+modl compr 1
+modl compr eulisp 1
+modl compr level 1
+modl con 2
+modl concept 1
+modl connect 1
+modl construc 1
+modl contain 1
+modl contain worker 1
+modl correspon 1
+modl cylinder 1
+modl cylinder0 1
+modl de 1
+modl de commun 1
+modl de zn 1
+modl dec 1
+modl decl 1
+modl decomposit 1
+modl def 1
+modl defin 1
+modl definit 2
+modl definit compr 1
+modl definit form 1
+modl definit proc 1
+modl definit us 1
+modl dep 1
+modl describ 1
+modl descript 1
+modl descript discard 1
+modl descript keep 1
+modl descript replac 1
+modl determin 1
+modl direct 2
+modl direct acc 1
+modl directiv 1
+modl disassoc 1
+modl discrim 1
+modl dynam 1
+modl dynam load 1
+modl engendr 1
+modl environm 1
+modl equiv 1
+modl equiv rel 1
+modl et dassoc 1
+modl eulisp 1
+modl eulisp level 1
+modl export 1
+modl ext 2
+modl filter 1
+modl filter modl 1
+modl fo.o 1
+modl fo.o produc 1
+modl for gener 1
+modl for inform 1
+modl for particl 1
+modl for standard 1
+modl form 1
+modl from promot 1
+modl funct 1
+modl funct follow 1
+modl giv 1
+modl hav overlap 1
+modl hierarch 2
+modl hierarch compar 1
+modl hypoth 1
+modl id 1
+modl if nec 1
+modl illustr 1
+modl import 2
+modl in docum 1
+modl in figur 1
+modl in sl1 1
+modl in us 1
+modl indep 1
+modl input 1
+modl input sit 1
+modl inst 1
+modl integr 1
+modl interconnect 1
+modl interconnect langu 1
+modl interfac 2
+modl is an 1
+modl is ch 1
+modl is commun 1
+modl is condit 1
+modl is cruc 1
+modl is describ 1
+modl is event 1
+modl is exact 1
+modl is expan 1
+modl is giv 2
+modl is illustr 1
+modl is import 1
+modl is inst 1
+modl is lik 1
+modl is lock 1
+modl is nec 1
+modl is refer 1
+modl is rel 1
+modl is requir 1
+modl is shown 4
+modl is simp 1
+modl is thread 1
+modl is transl 1
+modl is writ 1
+modl isomorph 1
+modl issu 1
+modl issu ra 1
+modl k arithm 1
+modl l equiv 1
+modl level 2
+modl libr 1
+modl lik circl 1
+modl loc 1
+modl loc bind 1
+modl m au 1
+modl m de 1
+modl m engendr 1
+modl m tel 1
+modl m tout 1
+modl m vect 1
+modl may becom 1
+modl may com 1
+modl may def 1
+modl mechan 2
+modl mechan prov 1
+modl method 1
+modl mj 1
+modl mj dan 1
+modl mj tel 1
+modl n arithm 1
+modl nam 2
+modl nam part 1
+modl neur 1
+modl neur network 1
+modl number 1
+modl object 1
+modl on import 1
+modl onl contain 1
+modl op 1
+modl op eratoir 1
+modl opt 1
+modl optim 1
+modl or proc 1
+modl or switch 1
+modl overus 1
+modl p est 1
+modl p ppcm 1
+modl pandemon 1
+modl pandemon system 1
+modl paradigm 1
+modl parallel 1
+modl parallel computer 1
+modl parameter 1
+modl per monit 1
+modl period 1
+modl period an 1
+modl peut 1
+modl peut etr 1
+modl po 1
+modl po self 1
+modl prescript 1
+modl problem 1
+modl problem complec 1
+modl proc 2
+modl proc getp 1
+modl produc 1
+modl prolog 1
+modl prolog import 1
+modl prov 1
+modl receiv 1
+modl recomposit 1
+modl recomposit confus 1
+modl reduc 1
+modl refer 2
+modl refer mechan 1
+modl refer sem 1
+modl refer vect 1
+modl regr 1
+modl regr test 1
+modl renam 1
+modl run 1
+modl schem 1
+modl sect 1
+modl so spec 1
+modl soc 1
+modl soc structur 1
+modl somewh 1
+modl spec 1
+modl specif 3
+modl specif giv 1
+modl squar 1
+modl ss 1
+modl stabil 1
+modl start 1
+modl straightaw 1
+modl structur 3
+modl structur correspon 1
+modl syntac 1
+modl syntac modl 1
+modl system 3
+modl system equiv 1
+modl techniqu 1
+modl techniqu ge 1
+modl technolog 1
+modl technolog offer 1
+modl test 1
+modl test ca 1
+modl th 1
+modl th ac 1
+modl th cultur 1
+modl th sect 1
+modl th specif 1
+modl than ad 1
+modl that creat 1
+modl that impl 1
+modl that import 1
+modl to ad 1
+modl to ch 1
+modl to export 1
+modl to inclus 1
+modl to mak 1
+modl to repr 1
+modl tous 1
+modl tous le 1
+modl tout 1
+modl tout sous 1
+modl transact 1
+modl twosym 1
+modl un renom 1
+modl unit 1
+modl using 2
+modl using exp 1
+modl var 2
+modl vi 1
+modl weight 1
+modl weight method 1
+modl wer allow 1
+modl which act 1
+modl which def 1
+modl which follow 1
+modl which infer 1
+modl which rel 1
+modl wil becom 1
+modl wil involut 1
+modl wil separ 1
+modl with actu 1
+modl with clear 1
+modl with renam 1
+modl with respect 1
+modl with specif 1
+modl with unit 1
+modl without import 1
+modl work 1
+modl2 2
+modp 1
+modulad 1
+modulair 2
+modulair afin 1
+modulair afin de 1
+modulair haut 1
+modulair haut niveau 1
+modulenam 1
+modulus 1
+modus 1
+modus pon 1
+modus pon funct 1
+moff 1
+moff field 1
+moffat 1
+moffr 1
+moffr de 1
+moffr de nouvel 1
+mog 1
+mog hessellund 1
+moghrab 1
+moghrabiz 1
+mogl 1
+moham 2
+moham al 1
+moham al daoud 1
+moham errad 1
+mohamad 1
+mohan 4
+moin 5
+moin ardu 1
+moin ardu suiv 1
+moin bon 1
+moin bon tail 1
+moin co 2
+moin co uteus 2
+moin conceptuel 1
+moin convainc 1
+moin d ecritur 1
+moin dan 1
+moin dan la 1
+moin dautoriser 1
+moin dautoriser la 1
+moin de 3
+moin de 2kd 1
+moin de calcl 1
+moin de cent 1
+moin de champ 1
+moin de conflit 1
+moin de dim 1
+moin de pag 1
+moin deux 1
+moin deux colon 1
+moin deux processeur 1
+moin dhypoth 1
+moin dhypoth es 1
+moin direct 1
+moin dun 2
+moin dun pag 1
+moin dun pagec 1
+moin dun var 1
+moin efficac 1
+moin efficac qu 1
+moin egal 2
+moin equiv 1
+moin equiv de 1
+moin est 1
+moin est util 1
+moin etendu 1
+moin favor 1
+moin favor est 1
+moin fort 1
+moin fort de 1
+moin fr 1
+moin fr equent 1
+moin g en 1
+moin grav 1
+moin grav qu 1
+moin il 1
+moin import 2
+moin import quil 1
+moin la 1
+moin la localit 1
+moin le 1
+moin le nombr 1
+moin migrer 1
+moin migrer un 1
+moin npb 1
+moin npb ce 1
+moin partiel 2
+moin partiel bien 1
+moin partiel la 1
+moin partiel le 1
+moin perform 1
+moin perform lorsqu 1
+moin perform qu 1
+moin pu 2
+moin qu 2
+moin qu le 2
+moin quil 1
+moin quil ne 1
+moin r eduir 1
+moin rad 1
+moin rad ma 1
+moin rap 1
+moin rap dan 1
+moin sensibl 1
+moin sensibl au 1
+moin sil 1
+moin sil sagit 1
+moin strict 1
+moin un 1
+moin un acc 1
+moin un comp 1
+moin un dan 1
+moin un de 1
+moin un el 2
+moin un ent 1
+moin un equip 1
+moin un fo 1
+moin un morceau 1
+moin un pag 1
+moin un profondeur 1
+moin un solut 1
+moindr 4
+moindr car 3
+moindr car es 2
+moindr co 2
+moindr co ut 2
+moindr en 1
+moindr en speed 1
+moindr gr 1
+moindr gr ac 1
+moindr o2 1
+moindr proport 1
+moindr quon 1
+moindr quon peut 1
+moir 1
+moir acc 1
+moir loc 1
+moir loc don 1
+moir partag 1
+moit 2
+moit e de 1
+mok 1
+mokobodzk 1
+mol 3
+mol culair 1
+mol culair lalgorithm 1
+mol dintellig 1
+mol dintellig artif 1
+mol eculair 1
+mold 3
+molecl 7
+molecl and stat 1
+molecl ar order 1
+molecl biolog 2
+molecl dat 1
+molecl dat structur 1
+molecl dynam 2
+molecl dynam appl 1
+molecl evolut 1
+molecl evolut genet 1
+molecl in solut 1
+molecl lik protein 1
+molecl manag 1
+molecl may lead 1
+molecl model 1
+molecl mov 1
+molecl object 1
+molecl structur 2
+molecl to aid 1
+moler 1
+molin 4
+mollioer 1
+mollioer smooth 1
+molnar 2
+molog 2
+molog ba 1
+molog ba mod 1
+moment 21
+moment and u1 1
+moment comput 1
+moment de 2
+moment de la 1
+moment de primitiv 1
+moment dempiler 1
+moment direct 1
+moment direct knowledg 1
+moment if exact 1
+moment in tim 2
+moment k problem 1
+moment m em 1
+moment moin 1
+moment moin de 1
+moment no matter 1
+moment problem 1
+moment problem situ 1
+moment th docum 1
+moment u1 1
+moment we drop 1
+momentum 2
+momentum const 1
+momentum wa switch 1
+mon 11
+mon and pur 1
+mon directeur 1
+mon directeur de 1
+mon doubl 1
+mon g om 1
+mon gener 1
+mon jur 1
+mon lam 1
+mon of word 1
+mon orthogon 1
+mon orthogon polynom 1
+mon polynom 1
+mon polynom fpng 1
+mon siz 1
+mon siz layout 1
+mon travail 2
+mon ver 1
+monagan 1
+mondragon 1
+monet 1
+monet format 1
+monet inform 1
+monet item 1
+monfr 1
+mong 1
+monit 21
+monit a distribut 1
+monit agent 1
+monit agent help 1
+monit al collect 1
+monit algorithm 2
+monit and upd 1
+monit ar al 1
+monit ar ignor 1
+monit ar requir 1
+monit ba 1
+monit can inform 1
+monit complec 1
+monit compon 2
+monit compon collect 1
+monit conflict 1
+monit div 1
+monit dur train 1
+monit framework 1
+monit framework spec 1
+monit ge 1
+monit in fortran 1
+monit instead 1
+monit is inordin 1
+monit is train 1
+monit learn 1
+monit level 1
+monit link 1
+monit link traff 1
+monit maintain 1
+monit maintain pol 1
+monit me 1
+monit me traff 1
+monit monit 1
+monit net 1
+monit network 1
+monit nod 1
+monit object 1
+monit part 1
+monit perform 1
+monit perform neg 1
+monit proc 1
+monit requir 1
+monit requir mer 1
+monit serv 1
+monit shunt 1
+monit siz 1
+monit sub 1
+monit sub modl 1
+monit sub monit 1
+monit sub network 1
+monit sub system 1
+monit system 2
+monit system describ 1
+monit th aver 1
+monit th condit 1
+monit th interact 1
+monit th progr 1
+monit th relationship 1
+monit th request 1
+monit th status 1
+monit that ind 1
+monit to bring 1
+monit tr 1
+monit unlearn 1
+monit unlearn method 1
+monit unlearn system 1
+monit unlearn techniqu 1
+monit unlearn test 1
+monit upd 1
+monit upd period 1
+monit var 1
+monit var internet 1
+monit wer reduc 1
+monit with highest 1
+monitornet 1
+monk 1
+monkeberg 1
+monogr 1
+monograf 1
+monograf em ci 1
+monograph 3
+monograph and cour 1
+monograph in computer 1
+monograph on theor 1
+monolith 3
+monolith network 1
+monolith network id 1
+monolith script 1
+monolith structur 1
+monolithiqu 1
+monolithiqu de 1
+monolithiqu de la 1
+monom 1
+monom for decomp 1
+monom m xj1xj2 1
+monom mv 1
+monom mv defin 1
+monom x1x3 1
+monoproc 1
+monoproc cach 1
+monoproc cach memor 1
+monoproc problem 1
+monoprocesseur 1
+monot 19
+monot ac 1
+monot ac intersect 1
+monot and finit 1
+monot approach 1
+monot b tr 1
+monot chang 1
+monot cl 1
+monot constraint 1
+monot constraint system 1
+monot cr 1
+monot cr optim 1
+monot decr 2
+monot decr funct 1
+monot ensur 1
+monot exhibit 1
+monot form 1
+monot iff 1
+monot in satisf 1
+monot incr 4
+monot incr key 1
+monot incr proper 1
+monot incr valu 1
+monot issu 1
+monot issu involut 1
+monot issu rel 1
+monot map 2
+monot map defin 1
+monot of constraint 1
+monot of del 1
+monot of rol 1
+monot polygon 1
+monot polygon individu 1
+monot posit 1
+monot posit boolean 1
+monot problem 1
+monot proper 1
+monot rout 1
+monot rout oper 1
+monot rout refer 1
+monot satisf 1
+monot sequ 1
+monot subtyp 1
+monot tower 1
+monot with respect 2
+monot wsb 1
+monot wsb wsb 1
+monster 1
+mont 4
+mont carl 3
+mont carl constitu 1
+mont carl est 1
+mont carl mach 1
+mont carl method 2
+mont carl sampl 1
+mont carl siml 1
+mont e carl 1
+mont fait 1
+mont fait le 1
+mont marqu 1
+mont ouver 1
+mont ouver le 1
+mont perm 1
+mont perm de 1
+montaut 2
+monter 2
+montgom 2
+montgom and e.a 1
+montgom count 1
+month 7
+month and form 1
+month and prov 1
+month day 1
+month day offer 1
+month day year 1
+month or year 1
+month order 1
+month period 1
+month period start 1
+month year 1
+montpel 2
+montr 7
+montr a quel 1
+montr au 1
+montr au pa 1
+montr bien 2
+montr bien qu 2
+montr ce 2
+montr ce dern 1
+montr ce sect 1
+montr clair 1
+montr clair qu 1
+montr com 2
+montr com int 1
+montr com le 1
+montr de 1
+montr de equ 1
+montr dun 1
+montr dun prus 1
+montr e au 1
+montr e com 2
+montr e dan 1
+montr e lir 1
+montr e qu 3
+montr e quun 1
+montr e sur 1
+montr eal 3
+montr encor 1
+montr encor lefficacit 1
+montr es 1
+montr es sur 1
+montr fin 1
+montr ic 1
+montr ic qu 1
+montr la 2
+montr la figur 2
+montr la form 1
+montr la tabl 1
+montr lam 1
+montr lam elior 1
+montr laspect 1
+montr laspect qu 1
+montr le 3
+montr le bon 1
+montr le exp 1
+montr le figur 1
+montr le lim 1
+montr le perform 1
+montr le pol 1
+montr le speed 1
+montr le temp 1
+montr limpact 1
+montr limpact de 1
+montr linflu 1
+montr linflu de 1
+montr par 1
+montr par exempl 1
+montr pour 1
+montr pour chaqu 1
+montr qu 4
+montr qu ce 1
+montr qu de 1
+montr qu dun 1
+montr qu fouriermotzkin 1
+montr qu la 3
+montr qu le 2
+montr qu lintroduc 1
+montr qu lon 1
+montr qu lutil 2
+montr quel 1
+montr quel po 1
+montr quil 1
+montr quil suffit 1
+montr quun 2
+montr quun rec 1
+montr succinct 1
+montr succinct le 1
+montr sur 1
+montr sur de 1
+montr un posit 1
+montrer 3
+montrer com 1
+montrer com obtenir 1
+montrer com partitionner 1
+montrer dan 1
+montrer dan le 1
+montrer dan quel 1
+montrer le 1
+montrer lefficacit 1
+montrer linflu 1
+montrer linflu de 1
+montrer lint 1
+montrer lint er 1
+montrer qu 2
+montrer qu ce 1
+montrer qu la 1
+montrer qu lappl 1
+montrer qu le 1
+montrer qu zn 1
+montrer quel 1
+montrer quel induit 1
+montrer quel peut 1
+montrer quil 1
+montrer quil est 1
+montrer quil ny 1
+montrer quun 1
+montrer quun ch 1
+montrer quun fo 1
+montrer trop 1
+montrer trop restrict 1
+montreron 1
+montreron au 1
+montreron au paragraph 1
+montron 3
+montron a quel 1
+montron au 1
+montron au chapitr 1
+montron com 3
+montron com ce 1
+montron com le 1
+montron com pal 1
+montron dan 1
+montron dan ce 1
+montron dan la 1
+montron ic 1
+montron ic qu 1
+montron linclus 1
+montron linclus de 1
+montron maint 1
+montron maint qu 1
+montron maint quel 1
+montron tout 2
+montron tout dabord 2
+mood 3
+moon 2
+moor 5
+moor mach 1
+mop 3
+mop fpng 1
+mop fpng satisf 1
+mop is uniqu 1
+mop satisf 1
+mop with respect 1
+mor 6
+mor acc 1
+mor graph 1
+mor navar 1
+mor90 1
+moran 2
+morceau 1
+morceau de 1
+morceau de colon 1
+moreau 1
+moreover 40
+moreover a div 1
+moreover both endpoint 1
+moreover each maxim 1
+moreover ev goal 1
+moreover high avail 1
+moreover intrin 1
+moreover intrin corrupt 1
+moreover of dat 1
+moreover or 1
+moreover pj 1
+moreover pj pi 1
+moreover sinc c2 1
+moreover th exampl 1
+moreover th show 1
+moreover th techniqu 2
+moreover we denot 1
+moreover writ 1
+morgan 20
+morgan conv 1
+morgan kaufman 18
+morgan kaufman publ 6
+morgan law 1
+morgan work 1
+morgankaufman 1
+morph 2
+morpholog 2
+morpholog kernel 1
+morpholog oper 1
+morphometer 1
+morphometer anatom 1
+morphometer anatom atl 1
+morphometer tool 1
+mortel 1
+mortel est 1
+mortel est de 1
+morz 1
+morz show 1
+moschovak 1
+moser 1
+moser and agraw 1
+mosh 1
+mosh vard 1
+most 13
+most as implem 1
+most been develop 1
+most compil 1
+most con 1
+most concern 1
+most du 1
+most fact 1
+most lik 1
+most rather obv 1
+most refer 1
+most straightfor 2
+most straightfor ext 1
+mostaf 2
+mostaf mukesh 1
+mostaf mukesh singh 1
+mostaf nassar 1
+mostaf nassar andrew 1
+moszkowsk 1
+mot 18
+mot cl 6
+mot cl es 3
+mot clef 2
+mot dan 1
+mot dan ce 1
+mot de 2
+mot de quatr 1
+mot empil 1
+mot est 1
+mot est diffus 1
+mot est don 1
+mot est donc 1
+mot evoqu 1
+mot evoqu le 1
+mot group 1
+mot lint 1
+mot lint er 1
+mot m emoir 2
+mot mach 1
+mot mach de 1
+mot of oper 1
+mot of replac 1
+mot ok 2
+mot or finit 1
+mot ou 1
+mot par 1
+mot par cel 1
+mot plan 1
+mot pr 1
+mot pr ec 1
+mot requir 1
+mot to optim 1
+mot vid 1
+mot vid link 1
+moteur 1
+moteur prolog 1
+moteur prolog de 1
+moteur prolog en 1
+moteur prolog tel 1
+motif 4
+motif avec 1
+motif constitut 1
+motif de 1
+motif de liaison 1
+motif du 1
+motif g om 1
+motif in protein 1
+motif interfac 1
+motif interfac manu 1
+motif interfac parameter 1
+motif interfac prov 1
+motif is displ 1
+motif observ 1
+motif program 1
+motif sp 1
+motif sp ecif 1
+motif structuraux 1
+motif structuraux en 1
+motif would allow 1
+motif x si 1
+motiv 42
+motiv an algorithm 1
+motiv and framework 1
+motiv and objectiv 1
+motiv and rel 1
+motiv and result 1
+motiv by hardwar 1
+motiv cl 1
+motiv cl dict 1
+motiv de 1
+motiv de ce 1
+motiv e par 1
+motiv ee 1
+motiv ee par 1
+motiv exampl 1
+motiv explan 1
+motiv explan ba 1
+motiv for car 1
+motiv for ch 1
+motiv for find 1
+motiv for further 1
+motiv for perform 1
+motiv for stud 1
+motiv from rel 1
+motiv maxim 1
+motiv maxim siz 1
+motiv of ph 1
+motiv our approach 1
+motiv prem 1
+motiv s tvar 1
+motiv th definit 1
+motiv th design 2
+motiv th desir 1
+motiv th developm 1
+motiv th disc 2
+motiv th problem 1
+motiv th subject 1
+motiv th techniqu 1
+motiv th work 1
+motiv using 1
+motiv we search 1
+motohik 1
+motohik matsud 1
+motok 1
+motok nakad 1
+motor 1
+motor typ 1
+motor typ task 1
+motorol 3
+motwan 1
+motwan and ramkumar 1
+motzkin 1
+motzkin a la 1
+motzkin a pour 1
+motzkin algorithm 1
+motzkin au 1
+motzkin au ca 1
+motzkin dan 1
+motzkin dan le 1
+motzkin doit 1
+motzkin doit donc 1
+motzkin el 1
+motzkin el ementair 1
+motzkin elim 1
+motzkin elim ext 1
+motzkin le 1
+motzkin le born 1
+motzkin ne 1
+motzkin ne pr 1
+motzkin nont 1
+motzkin nont pa 1
+motzkin on obt 1
+motzkin param 1
+motzkin param etr 1
+motzkin pour 1
+motzkin pour la 1
+motzkin pouvait 1
+motzkin pouvait etr 1
+motzkin pr 1
+motzkin pr esent 1
+motzkin qu 1
+motzkin qu gar 1
+motzkin qu ser 1
+motzkin sur 1
+motzkin sur le 1
+motzkin tel 1
+motzkin tel quel 1
+motzkin tel quil 1
+moudgil 1
+moulin 1
+moult 1
+mount 3
+mount extern 1
+mount extern sync 1
+mount to construc 1
+mountain 3
+mountain view 3
+mour 1
+mour et val 1
+mous 3
+mous button 1
+mous control 1
+mous driv 1
+mous keyboard 1
+mous sh ch 1
+mout 1
+mout compan 1
+mouth 1
+mouth opinion 1
+mouv 3
+mouv de 3
+mouv de don 2
+mouv de pag 1
+mouv de register 1
+mouv relatif 1
+mouv relatif de 1
+mouv sont 1
+mouv sont identiqu 1
+mouv tridimensionnel 1
+mov 53
+mov a funct 1
+mov a model 1
+mov a nod 1
+mov a point 1
+mov a singl 1
+mov a ver 1
+mov accr 1
+mov aggreg 1
+mov aggreg cach 1
+mov ahead 1
+mov an input 1
+mov an irregl 1
+mov and connect 1
+mov and prop 1
+mov ar undon 1
+mov aver 2
+mov becom 1
+mov becom upd 1
+mov between proc 2
+mov closer 1
+mov dat 1
+mov dep 1
+mov disk 1
+mov disk head 1
+mov dur garb 1
+mov el 2
+mov exceed 1
+mov for 2
+mov from conceptu 1
+mov from hx1 1
+mov from part 1
+mov from proc 1
+mov from q1 1
+mov from sc 1
+mov from start 1
+mov front 1
+mov front implem 1
+mov half 1
+mov in 1
+mov induc 1
+mov it sen 1
+mov it ver 1
+mov lem 1
+mov lim 1
+mov lim equ 1
+mov mad 1
+mov nod 1
+mov object 2
+mov ont larger 1
+mov oper 1
+mov oper s6 1
+mov or swap 1
+mov p record 1
+mov rel 1
+mov seam 1
+mov tak 1
+mov tak plac 1
+mov th light 1
+mov th load 1
+mov th system 1
+mov th text 1
+mov that allow 1
+mov to bil 1
+mov to front 1
+mov to front2b 1
+mov to list 1
+mov to proc 1
+mov to row 1
+mov tofront 1
+mov tofront implem 1
+mov tofront record 1
+mov up 1
+mov up recur 1
+mov upd 1
+mov var 1
+mov var mov 1
+mov ver 3
+mov wa exceed 1
+mov which ch 1
+mov window 2
+mov window aver 1
+mov window oper 1
+movingwindow 1
+movingwindow aver 1
+movingwindow aver rout 1
+mowr 1
+moy 6
+moy au 1
+moy au sen 1
+moy avant 1
+moy avant absorb 1
+moy coh 1
+moy coh rent 1
+moy dam 1
+moy dam eliorer 1
+moy darriver 1
+moy de 3
+moy de contr 1
+moy de distinguer 1
+moy de faux 1
+moy de lordr 1
+moy de sch 1
+moy destampil 1
+moy dev 1
+moy dev std 1
+moy dinvestig 1
+moy dun 3
+moy dun an 1
+moy dun ch 1
+moy dutil 1
+moy dutil de 1
+moy effectu 1
+moy effectu ee 1
+moy espac 1
+moy espac eucl 1
+moy et covar 1
+moy et fus 1
+moy mac 1
+moy mac min 1
+moy mn 1
+moy mn emoniqu 1
+moy moy 1
+moy origin 1
+moy origin de 1
+moy partiel 1
+moy partiel fourn 1
+moy sur 1
+moy sur tous 1
+moy tr 1
+moy tr es 1
+moz 2
+mozer 3
+mozer bachrach 1
+mp 18
+mp 2logm 2
+mp ba 1
+mp ba implem 1
+mp bcast 1
+mp combin 1
+mp cop 1
+mp demonstr 1
+mp fortran 1
+mp fortran program 1
+mp implem 1
+mp implem incur 1
+mp is treat 1
+mp libc.h 1
+mp libc.h inclus 1
+mp lik commun 1
+mp log 1
+mp pack 1
+mp proc tim 1
+mp program 1
+mp recv 1
+mp reduc 1
+mp resourc.h 1
+mp resourc.h inclus 1
+mp sb.mpg.de 1
+mp scan 1
+mp sent 1
+mp slow 1
+mp standard 1
+mp system 1
+mp that cop 1
+mp typ 1
+mp typ system 1
+mp valu 1
+mp waitsom 1
+mp3d 1
+mp3d and ge 1
+mp3d decr 1
+mp3d evalu 1
+mp3d show 1
+mp3d th overhead 1
+mp3d ver 1
+mp3d would perform 1
+mp3ds 1
+mp3ds behavior 1
+mpc 2
+mpc approach 1
+mpeg 2
+mpeg compr 1
+mpeg compr domain 1
+mpeg compr vid 1
+mpeg domain 1
+mpeg format 1
+mpgetrus 1
+mphf 1
+mphf algorithm 1
+mphf problem 1
+mpl 3
+mpl program 1
+mpl tok 1
+mpl.h 1
+mpl.h inclus 1
+mpl.h inclus std.h 1
+mpm 1
+mppm 1
+mppm95 1
+mprus 1
+mprus s st1 1
+mq 1
+mq.edu.au 1
+mq.edu.au e mail 1
+mr 6
+mr dat 1
+mr fion 1
+mr fion ferguson 1
+mr imag 2
+mr nl 1
+mr nl og 1
+mr v0 1
+mr89 1
+mr92 1
+mraz 1
+mrc95 1
+mrn 1
+mrn ba 1
+mrn ba window 1
+mrt 1
+ms 11
+ms and exbf 1
+ms and rx 1
+ms av 1
+ms av loop 1
+ms by 1
+ms by ms 1
+ms ci 1
+ms for inser 1
+ms ki 1
+ms ki ns 1
+ms optim 1
+ms optim nonlin 1
+ms pack 1
+ms q aver 1
+ms scal 1
+ms scal by 1
+ms schem 1
+ms schem rev 1
+ms sen 1
+ms si 1
+ms si ce 1
+ms start 1
+ms th 1
+ms to av 1
+ms to drop 1
+ms85 1
+ms91 1
+msc 1
+msc th 1
+msec 3
+msec io 1
+msec io del 1
+mseg 1
+msg 7
+msg baseact 1
+msg credit 1
+msg credit debit 1
+msg dest 1
+msg expr 1
+msg expr expr 1
+msg expr specif 1
+msg is msg 1
+msg microsec 1
+msg transfer 1
+msgfflffl 1
+msj 1
+msl92 1
+msld 1
+msld deriv 1
+msld deriv fhg0 1
+msld refut 1
+msld resolut 1
+msld resolut form 1
+msld resolut step 1
+msm90 1
+mst 2
+mst and therefor 1
+mst protocol 1
+mst1 1
+mstg 1
+msu 1
+msu cp 1
+msu cp ac 1
+msy 1
+msy c mc 1
+msy c nm 1
+mt 5
+mt 1t 1
+mt ad 1
+mt ad a023588 1
+mt henz.ps.z 1
+mth 1
+mth pack 1
+mtl 1
+mtl program 1
+mtl resolut 1
+mu 2
+mu e en 1
+mu prolog 1
+muc 1
+muc problem 1
+mudamb 2
+mudamb introdu 1
+mudamb introdu de 1
+muehl 1
+muehl gmdz.uucp 1
+muench.de 1
+muench.de mitarbeiter 1
+muench.de mitarbeiter schmidhu.html 1
+muenneman 1
+muenneman from resonec 1
+muit 1
+muit ma 1
+muit tip 1
+muit tip de 1
+muk 1
+mukesh 1
+mukesh singh 1
+mulholland 1
+mulker 1
+mullender 2
+muller 1
+mullerburg 1
+mullin 1
+mult 43
+mult addr 1
+mult addr encod 1
+mult agent 1
+mult agent cooper 1
+mult attribut 1
+mult attribut decluster 1
+mult by 1
+mult by character 1
+mult cast 1
+mult channel 1
+mult channel gabor 1
+mult chip 1
+mult chip modl 1
+mult cl 1
+mult column 1
+mult column pag 1
+mult column wh 1
+mult computer 1
+mult computer architectur 1
+mult contain 1
+mult dim 4
+mult dim herbrand 1
+mult dim interper 1
+mult dim interpr 1
+mult dim interv 1
+mult dim langu 1
+mult dim log 1
+mult dim model 1
+mult dim object 2
+mult dim point 1
+mult dim sign 1
+mult dim sld 1
+mult dim spac 1
+mult dim. 1
+mult disk 1
+mult disk architectur 1
+mult format 1
+mult format input 1
+mult head 1
+mult head wormhol 1
+mult hom 1
+mult hom host 1
+mult interconnect 3
+mult interconnect network 3
+mult interpr 1
+mult langu 1
+mult langu approach 1
+mult layer 2
+mult layer feed 1
+mult layer system 1
+mult layout 1
+mult level 3
+mult level ca 1
+mult level concur 1
+mult level layer 1
+mult level lock 1
+mult level method 1
+mult level ml 1
+mult level mlt 1
+mult level pack 1
+mult level recov 1
+mult level schem 1
+mult level subtransact 1
+mult level system 1
+mult level transact 1
+mult level und 1
+mult lingu 1
+mult lingu work 1
+mult lingu workplac 1
+mult manner 1
+mult me 1
+mult me multicast 1
+mult med 1
+mult method 2
+mult method approach 1
+mult method program 1
+mult mod 1
+mult mod log 1
+mult network 3
+mult object 1
+mult object composit 1
+mult of attribut 1
+mult of edg 1
+mult of forml 1
+mult of substr 1
+mult percept 1
+mult ph 1
+mult ph implem 1
+mult proc 6
+mult proc architectur 1
+mult proc mach 2
+mult proc system 1
+mult proc un 1
+mult processeur 1
+mult processeur assez 1
+mult program 1
+mult program level 1
+mult queu 1
+mult queu buffer 1
+mult rat 1
+mult rat filter 1
+mult register 1
+mult register problem 1
+mult resolut 2
+mult resolut an 1
+mult resolut increm 1
+mult resolut repr 1
+mult resolut sign 1
+mult s equ 1
+mult scal 2
+mult scal context 1
+mult scal decomposit 1
+mult scal edg 1
+mult scal featur 1
+mult scal input 1
+mult scal repr 1
+mult scal wavel 1
+mult sen 1
+mult sen robot 1
+mult sit 1
+mult sit classiqu 1
+mult sit de 1
+mult sit est 1
+mult sit ou 1
+mult stag 2
+mult stag interconnect 2
+mult step 4
+mult step algorithm 1
+mult step enabl 1
+mult step ordin 1
+mult step perform 1
+mult step predict 1
+mult step qu 1
+mult step reduc 1
+mult strateg 1
+mult strateg learn 1
+mult strateg system 1
+mult switch 1
+mult switch interconnect 1
+mult switch network 1
+mult system 1
+mult system dat 1
+mult thread 2
+mult thread parallel 1
+mult union 2
+mult user 1
+mult user draw 1
+mult ver 1
+mult ver memor 1
+mult view 1
+mult view edit 1
+mult way addr 1
+mult way branch 1
+mult way equ 1
+mult way inequ 1
+mult way loc 1
+mult. 1
+multiag 1
+multiag interact 1
+multiattribut 1
+multiattribut ind 1
+multiattribut ind method 1
+multibean 1
+multibean satel 1
+multibean satel system 1
+multicach 1
+multicach system 1
+multicast 6
+multicast a me 1
+multicast a pack 1
+multicast a se 1
+multicast addr 1
+multicast addr becom 1
+multicast al satur 1
+multicast algorithm 1
+multicast and multipl 1
+multicast and rel 1
+multicast and unicast 1
+multicast appl 1
+multicast appl var 1
+multicast ar 1
+multicast ar part 1
+multicast at low 1
+multicast backbon 1
+multicast bo 1
+multicast broadcast 1
+multicast broadcast oper 1
+multicast built 1
+multicast by wait 1
+multicast ca 1
+multicast chang 1
+multicast commun 2
+multicast commun inform 1
+multicast commun manag 1
+multicast commun model 1
+multicast commun serv 1
+multicast connect 1
+multicast datagram 1
+multicast datagram deliv 1
+multicast deadlock 1
+multicast degr 1
+multicast dest 1
+multicast dest se 1
+multicast displ 1
+multicast exampl 1
+multicast experim 1
+multicast facil 1
+multicast facil great 1
+multicast facil guar 1
+multicast facil prov 1
+multicast facil rel 1
+multicast for distribut 1
+multicast for dynam 1
+multicast for mesh 1
+multicast for pack 1
+multicast framework 1
+multicast group 2
+multicast group con 1
+multicast group member 1
+multicast group nod 1
+multicast group siz 1
+multicast group throughput 1
+multicast ha low 1
+multicast implem 1
+multicast implem affect 1
+multicast in fewer 1
+multicast in interconnect 1
+multicast in mult 1
+multicast in wormhol 1
+multicast inform 2
+multicast is allow 1
+multicast is guaranteed 1
+multicast is high 1
+multicast is lik 1
+multicast lat 1
+multicast lat grow 1
+multicast lat incr 1
+multicast lat using 1
+multicast lat var 1
+multicast me 3
+multicast me multicast 1
+multicast me transport 1
+multicast method 1
+multicast network 1
+multicast nod 1
+multicast now satur 1
+multicast occup 1
+multicast occup network 1
+multicast of dat 1
+multicast on irregl 1
+multicast on mult 1
+multicast on myrinet 1
+multicast on network 1
+multicast on parallel 1
+multicast on wormhol 1
+multicast oper 1
+multicast or entir 1
+multicast or eurek 1
+multicast outperform 1
+multicast outperform hardwar 1
+multicast pack 3
+multicast pack allow 1
+multicast pack chunk 1
+multicast pack continu 1
+multicast pack header 1
+multicast pack switch 1
+multicast parameter 1
+multicast perform 1
+multicast perform simil 1
+multicast perturb 1
+multicast perturb unicast 1
+multicast pip 1
+multicast prim 1
+multicast primitiv 1
+multicast primitiv prov 1
+multicast problem 1
+multicast prop 1
+multicast protocol 1
+multicast result 1
+multicast rout 1
+multicast schedl 1
+multicast schem 1
+multicast schem compar 1
+multicast schem prop 1
+multicast schem using 1
+multicast se 2
+multicast se me 1
+multicast se protocol 1
+multicast shown 1
+multicast si 1
+multicast si me 1
+multicast siml 1
+multicast siml issu 1
+multicast support 1
+multicast switch 1
+multicast switch architectur 1
+multicast system 1
+multicast techniqu 1
+multicast techniqu prop 1
+multicast th pack 1
+multicast to arbitr 1
+multicast to giv 1
+multicast to loc 1
+multicast traff 2
+multicast traff evalu 1
+multicast traff load 1
+multicast transport 1
+multicast transport connect 1
+multicast transport protocol 1
+multicast using 1
+multicast using bit 1
+multicast using unicast 1
+multicast versus softwar 1
+multicast with centr 1
+multicast with input 1
+multicast wormhol 1
+multicast wormhol rout 1
+multicl 1
+multicl real tim 1
+multicl workload 1
+multicl workload respon 1
+multicommod 1
+multicommod flow 1
+multicomputer 9
+multicomputer can support 1
+multicomputer con 1
+multicomputer interconnect 1
+multicomputer network 1
+multicomputer system 3
+multicomputer without interproc 1
+multiconfer 1
+multiconfer on artif 1
+multiconnect 1
+multiconnect network 1
+multidest 1
+multidest me 1
+multidest me pa 1
+multidest pack 1
+multidest rout 1
+multidest worm 1
+multidest worm adapt 1
+multidest worm arriv 1
+multidest worm ba 1
+multidest worm car 1
+multidest worm enqueu 1
+multidest worm header 1
+multidest worm mak 1
+multidest worm proceed 1
+multidest worm prov 1
+multidest worm travel 1
+multidest wormhol 1
+multidest wormhol me 1
+multidim 12
+multidim and geometer 1
+multidim bin 2
+multidim bin imag 1
+multidim bin search 1
+multidim dat 1
+multidim dat cluster 1
+multidim digit 1
+multidim digit imag 1
+multidim domain 1
+multidim dynam 1
+multidim dynam ind 1
+multidim herbrand 1
+multidim herbrand model 1
+multidim ind 1
+multidim interfac 1
+multidim nmr 1
+multidim nmr spectroscop 1
+multidim object 1
+multidim scal 1
+multidim scal method 1
+multidim search 2
+multidim search algorithm 1
+multidim search problem 1
+multidim spac 1
+multidim system 1
+multidim system theor 1
+multidim ver 1
+multidimensionnel 2
+multidimensionnel de 1
+multidimensionnel de don 1
+multidimod 1
+multidimod funct 1
+multidimod funct optim 1
+multidirect 1
+multidirect inform 1
+multidirect inform flow 1
+multidisk 2
+multidisk or mult 1
+multidisk system 1
+multifrequ 1
+multifrequ channel 1
+multifrequ channel decomposit 1
+multigraph 2
+multigraph g0 1
+multigraph repr 1
+multihierarch 1
+multihierarch neur 1
+multihierarch neur network 1
+multik 1
+multik fil 1
+multik fil structur 1
+multilayer 3
+multilayer feedfor 1
+multilayer feedfor network 1
+multilayer net 1
+multilayer neur 1
+multilayer neur network 1
+multilayer perceptron 2
+multilayer perceptron solut 1
+multilevel 8
+multilevel algorithm 2
+multilevel algorithm disc 1
+multilevel atom 1
+multilevel bisect 1
+multilevel bisect algorithm 1
+multilevel graph 2
+multilevel graph partit 2
+multilevel hierarch 1
+multilevel hierarch memor 1
+multilevel implem 1
+multilevel kw 1
+multilevel kw partit 1
+multilevel layer 1
+multilevel memor 1
+multilevel model 1
+multilevel neur 1
+multilevel neur network 1
+multilevel octasect 1
+multilevel octasect algorithm 1
+multilevel pack 2
+multilevel recur 2
+multilevel recur bisect 2
+multilevel recur octasect 1
+multilevel recur partit 1
+multilevel schem 2
+multilevel secur 1
+multilevel spectr 1
+multilevel spectr bisect 1
+multilevel spectr partit 1
+multilevel system 1
+multilevel system suggest 1
+multiloop 1
+multiloop dep 1
+multiloop dep equ 1
+multim 9
+multim and hyperm 1
+multim commun 1
+multim confer 1
+multim cour 1
+multim cour mater 1
+multim digit 1
+multim digit libr 1
+multim docum 1
+multim docum deliv 1
+multim featur 1
+multim lab 1
+multim magaz 1
+multim mater 1
+multim multicast 1
+multim multicast ar 1
+multim multicast problem 1
+multim multicast schedl 1
+multim orient 1
+multim orient research 1
+multim serv 1
+multim support 1
+multim support collabor 1
+multim traff 1
+multim traff support 1
+multim unicast 1
+multim unicast problem 1
+multim user 1
+multim user interfac 1
+multim vid 1
+multim vod 1
+multim vod testb 1
+multimac 1
+multimod 2
+multimod interfac 1
+multimod interfac aim 1
+multimod interfac facilit 1
+multimod interfac multimod 1
+multimod match 1
+multimod user 1
+multimod user interfac 1
+multimodaux 1
+multinod 1
+multinod con 1
+multinod incr 1
+multinom 1
+multinom tr 1
+multinom tr ba 1
+multip 10
+multip a tcp 1
+multip by hand 1
+multip th dat 1
+multip th init 1
+multip th matr 1
+multip th parallel 1
+multip th sequ 1
+multip th weight 1
+multip visit 1
+multip visit nod 1
+multip visitednod 1
+multip visitednod condit 1
+multiparadigm 1
+multiparadigm log 1
+multiparadigm log program 1
+multiparadigm program 1
+multiph 1
+multiph bar 1
+multiph bar synchron 1
+multipl 87
+multipl acc 3
+multipl acc path 1
+multipl act 1
+multipl act mach 1
+multipl addr 1
+multipl algorithm 1
+multipl and div 1
+multipl and sum 1
+multipl ap 1
+multipl appropr 1
+multipl attribut 2
+multipl au 2
+multipl au chapitr 1
+multipl au sein 1
+multipl backlog 1
+multipl backlog period 1
+multipl bin 1
+multipl bind 1
+multipl board 2
+multipl broadcast 1
+multipl buffer 1
+multipl bus 1
+multipl candid 1
+multipl ch 2
+multipl ch quest 1
+multipl ch test 1
+multipl chang 1
+multipl channel 1
+multipl channel width 1
+multipl chap 1
+multipl cl 1
+multipl coar 2
+multipl coar bisect 1
+multipl coar grain 1
+multipl coinc 1
+multipl coinc edg 1
+multipl color 1
+multipl color spac 1
+multipl command 1
+multipl commun 1
+multipl conflict 1
+multipl conflict loc 1
+multipl conjunct 1
+multipl connect 1
+multipl connectionor 1
+multipl connectionor switch 1
+multipl consid 1
+multipl consid erabl 1
+multipl cont 1
+multipl cont fr 1
+multipl context 1
+multipl control 1
+multipl control thread 1
+multipl cop 1
+multipl correspon 1
+multipl cycl 1
+multipl dat 4
+multipl dat comput 1
+multipl dat stream 1
+multipl de 4
+multipl de ak0k 1
+multipl de ce 1
+multipl de cel 1
+multipl de chromosom 1
+multipl de fonct 1
+multipl de la 1
+multipl de matr 1
+multipl de ppcm 1
+multipl de var 1
+multipl degr 1
+multipl destin 1
+multipl dev 1
+multipl dev fault 1
+multipl differ synchron 1
+multipl disjoint 1
+multipl disjoint intersect 1
+multipl disjunct 1
+multipl disk 2
+multipl disk system 1
+multipl each input 1
+multipl edg 1
+multipl ee 1
+multipl ee par 1
+multipl eigenvalu 1
+multipl el 1
+multipl en 1
+multipl en lectur 1
+multipl et daborder 1
+multipl f op 1
+multipl fact 3
+multipl fault 2
+multipl fault cl 1
+multipl featur 1
+multipl flit 1
+multipl flit siz 1
+multipl flow 1
+multipl foc 1
+multipl foc point 1
+multipl follow 1
+multipl fragm 1
+multipl ge 1
+multipl good 2
+multipl good ch 2
+multipl graph 1
+multipl head 2
+multipl head atom 1
+multipl hid 1
+multipl hid layer 1
+multipl hop 1
+multipl in gener 1
+multipl infinit 1
+multipl infinit stream 1
+multipl inherit 3
+multipl inherit allow 1
+multipl inherit com 2
+multipl inherit compl 1
+multipl inherit help 1
+multipl inherit mak 1
+multipl inherit map 1
+multipl inherit us 1
+multipl input 1
+multipl input buffer 1
+multipl inst 3
+multipl instruc 2
+multipl instruc multipl 1
+multipl instruc stream 1
+multipl interfac 1
+multipl ip 1
+multipl ip addr 1
+multipl le 2
+multipl le nombr 1
+multipl lead 1
+multipl learn 1
+multipl learn modl 1
+multipl level 3
+multipl lidentit 1
+multipl link 1
+multipl loc 3
+multipl loc match 1
+multipl loc mechan 1
+multipl log 2
+multipl log manag 1
+multipl loop 2
+multipl loop iter 1
+multipl loop nest 1
+multipl match 1
+multipl match algorithm 1
+multipl matriciel 1
+multipl method 1
+multipl method invoc 1
+multipl minim 1
+multipl minim degr 1
+multipl model 1
+multipl model simultan 1
+multipl modif 1
+multipl multicast 1
+multipl multicast traff 1
+multipl multilevel 1
+multipl multilevel recur 1
+multipl network 2
+multipl network interfac 1
+multipl network system 1
+multipl nod 1
+multipl nod using 1
+multipl observ 1
+multipl obtain 1
+multipl occur 2
+multipl occur random 1
+multipl of exampl 1
+multipl of p2s 1
+multipl of qu 1
+multipl of sequ 1
+multipl of submatr 1
+multipl of tern 1
+multipl on oev 1
+multipl or branch 1
+multipl or div 1
+multipl or proc 1
+multipl output 1
+multipl output port 1
+multipl pa 1
+multipl pack 1
+multipl par 2
+multipl par le 1
+multipl par un 2
+multipl paradigm 1
+multipl parallel 1
+multipl parallel edg 1
+multipl part 1
+multipl particip 1
+multipl perform 1
+multipl perform guar 1
+multipl ph 2
+multipl ph ca 1
+multipl platform 1
+multipl po succ 1
+multipl pointer 1
+multipl pol 1
+multipl pol implem 1
+multipl predec 1
+multipl problem 1
+multipl problem inst 1
+multipl proc 4
+multipl proc cluster 1
+multipl proc particip 1
+multipl procedur 1
+multipl procedur argum 1
+multipl put 1
+multipl r ol 1
+multipl random 1
+multipl random acc 1
+multipl rang 1
+multipl rang quer 1
+multipl reader 2
+multipl reader register 1
+multipl record 1
+multipl record descript 1
+multipl recur 1
+multipl red 1
+multipl red log 1
+multipl register 1
+multipl register criter 1
+multipl register problem 1
+multipl register step 1
+multipl regr 1
+multipl rel 1
+multipl repr 1
+multipl run 1
+multipl run pr 1
+multipl sampl 1
+multipl scal 1
+multipl scan 1
+multipl scan mult 1
+multipl se 1
+multipl se act 1
+multipl search 1
+multipl search algorithm 1
+multipl secon 1
+multipl secon st 1
+multipl sect 1
+multipl sequ 1
+multipl serv 1
+multipl serv concur 1
+multipl server 2
+multipl simultan 1
+multipl simultan request 1
+multipl solut 2
+multipl spat 1
+multipl ssm 1
+multipl stat 1
+multipl stat nod 1
+multipl step 2
+multipl step enabl 1
+multipl strateg 1
+multipl such branch 1
+multipl such vect 1
+multipl supercl 1
+multipl switch 1
+multipl switch interconnect 1
+multipl switch network 1
+multipl th appropr 1
+multipl th weight 1
+multipl theor 1
+multipl thread 2
+multipl tim 3
+multipl tim step 1
+multipl tor 1
+multipl tor angl 1
+multipl transact 2
+multipl tupl 1
+multipl tupl requir 1
+multipl tw vect 1
+multipl unit 1
+multipl unrel 1
+multipl unrel program 1
+multipl upd 1
+multipl user 1
+multipl using 1
+multipl valeur 1
+multipl valeur de 1
+multipl valu 1
+multipl valu pr 1
+multipl variabl 1
+multipl ver 2
+multipl vi arithm 1
+multipl viewpoint 1
+multipl virtu 1
+multipl virtu circuit 1
+multipl with appropr 1
+multipl writ 1
+multipl writ col 1
+multipl writer 1
+multipl writer fal 1
+multiplatform 1
+multiplec 5
+multiplec and acc 1
+multiplec client 1
+multiplec client level 1
+multiplec fact 1
+multiplec fact incr 1
+multiplec indep 1
+multiplec indep se 1
+multiplec is defin 1
+multiplec me 1
+multiplec mechan 1
+multiplec offer 1
+multiplec se 1
+multiplec se layer 1
+multiplec se me 1
+multiplec sever se 1
+multiplec th me 1
+multiplec th record 1
+multiplec tw log 1
+multiplec wa prop 1
+multiplec wh 1
+multiplexer 2
+multiplexer input 1
+multiplicand 1
+multiplicand praeter 1
+multiplicand praeter necessitatatem 1
+multiplicit 1
+multiplicit e de 1
+multiplyvisit 1
+multiplyvisit nod 1
+multiplyvisit nod condit 1
+multiport 1
+multiport ba 1
+multiport ba encod 1
+multiport encod 1
+multiport encod schem 1
+multiport encod worm 1
+multiproc 26
+multiproc and compil 1
+multiproc and memor 1
+multiproc and multicomputer 1
+multiproc and requir 1
+multiproc and telephon 1
+multiproc architectur 3
+multiproc architectur siml 1
+multiproc built 1
+multiproc cach 2
+multiproc cach design 1
+multiproc cach mi 1
+multiproc commun 1
+multiproc computer 2
+multiproc concur 1
+multiproc environm 1
+multiproc graph 1
+multiproc graph system 1
+multiproc guar 1
+multiproc hardwar 1
+multiproc interconnect 4
+multiproc interconnect network 3
+multiproc interconnect technolog 1
+multiproc mach 2
+multiproc mach using 1
+multiproc memor 2
+multiproc memor behavior 1
+multiproc memor system 2
+multiproc model 1
+multiproc model ment 1
+multiproc multidisk 1
+multiproc multidisk system 1
+multiproc nod 1
+multiproc oper 1
+multiproc oper system 1
+multiproc or distribut 1
+multiproc or telephon 1
+multiproc problem 1
+multiproc program 2
+multiproc schedl 2
+multiproc schedl algorithm 1
+multiproc schedl problem 1
+multiproc shar 1
+multiproc shar virtu 1
+multiproc system 10
+multiproc system fal 1
+multiproc system perform 1
+multiproc using 1
+multiproc using uniproc 1
+multiproc ver 1
+multiproc with priv 1
+multiproc workst 1
+multiprocesseur 2
+multiprogram 1
+multiprozessorund 1
+multiprozessorund netzwerkkonfigur 1
+multiresolut 3
+multiresolut model 1
+multiresolut narrow 1
+multiresolut narrow band 1
+multiresolut surfac 1
+multiresolut surfac model 1
+multisc 2
+multisc docum 1
+multisc docum pag 1
+multisc edg 1
+multisc featur 1
+multisect 1
+multiselect 1
+multiselect se 1
+multisensoriel 1
+multistrateg 1
+multistrateg learn 1
+multistrateg task 1
+multistrateg task adapt 1
+multisystem 1
+multisystem coupl 1
+multitermin 1
+multitermin net 1
+multithr 1
+multithread 2
+multithread and specl 1
+multithread architectur 1
+multithread architectur model 1
+multithread exhibit 1
+multithread exhibit impr 1
+multithread mach 1
+multithread model 1
+multithread model ge 1
+multithread orig 1
+multithread proc 1
+multithread proc architectur 1
+multithread schedl 1
+multithread schedl strateg 1
+multithread smart 1
+multithread smart stupid 1
+multithread supersc 1
+multithread supersc supersc 1
+multithread ye 1
+multitoler 1
+multitoler bar 1
+multitoler bar synchron 1
+multitoler is us 1
+multitoler of bar 1
+multitoler program 1
+multitoler solut 1
+multitoler solut satisf 1
+multitoler to st 1
+multitoler tok 1
+multitoler tok ring 1
+multitud 2
+multitud dimpl 1
+multitud dimpl em 1
+multitud of programmer 1
+multivar 5
+multivar an 3
+multivar control 1
+multivar observ 1
+multivar st 1
+multivar st spac 1
+multivar stat 1
+multivar stat an 1
+mumick 1
+mummer 1
+mun 3
+mun de 1
+mun de la 1
+mun du 1
+mun du syst 1
+mun dun 3
+mun dun dispositif 1
+mun dun or 1
+mun dun protocol 1
+mun dun subdiv 1
+munch 2
+mund 2
+mundan 1
+mundan task 1
+munenor 1
+munenor ma 1
+munich 6
+munich german 1
+munin 1
+muninivykoan 1
+muninivykoan myoan 1
+munir 1
+munir dun 1
+mur 7
+mur hil 2
+muraok 1
+murat 1
+murat kunt 1
+murog 1
+murph 3
+murph and david 1
+murph notkin 1
+murt 1
+mus 5
+mus concept 1
+mus concept effect 1
+mus grammar 1
+mus in intellig 1
+mus knowledg 1
+mus m.a 1
+mus percept 1
+mus task 1
+mus to bear 1
+mus to weather 1
+musculoskel 1
+musculoskel system 1
+museum 1
+musiqu 1
+mut 12
+mut accord 1
+mut adapt 1
+mut adapt es 1
+mut and crossover 1
+mut and select 1
+mut ar pack 1
+mut as op 1
+mut au 1
+mut au niveau 1
+mut bit 1
+mut classiqu 1
+mut classiqu se 1
+mut con 1
+mut concern 1
+mut concern un 1
+mut conseil 1
+mut conseil ee 1
+mut const 1
+mut constitu 1
+mut constitu un 1
+mut dan 1
+mut dan lagc 1
+mut dat 1
+mut dautr 1
+mut dautr part 1
+mut de 1
+mut de probabilit 1
+mut dim 1
+mut dim interpr 1
+mut du 1
+mut du caract 1
+mut est 1
+mut est born 1
+mut est consid 1
+mut est don 1
+mut est donc 1
+mut et la 1
+mut hil 1
+mut hil climb 1
+mut imp 1
+mut in drosophil 1
+mut in order 1
+mut is nec 1
+mut lop 1
+mut lop erat 1
+mut majeur 1
+mut mut 1
+mut mut prob 1
+mut nl 1
+mut nl es 1
+mut object 1
+mut object st 1
+mut oper 2
+mut or learn 1
+mut parent 1
+mut parent model 1
+mut peut 1
+mut pm 1
+mut pour 1
+mut pour maintenir 1
+mut prob 1
+mut probabil 1
+mut qu 1
+mut qu chang 1
+mut rat 1
+mut rat caus 1
+mut rat imp 1
+mut se 1
+mut se font 1
+mut se poursuit 1
+mut select 1
+mut select schem 1
+mut si 1
+mut si xm 1
+mut sont 1
+mut sont de 1
+mut sont egal 1
+mut st 1
+mut top 1
+mut top lec 1
+mut tous 1
+mut tous le 1
+mut typ 1
+mut typ point 1
+mut var 1
+mut variabl 1
+mut vect 1
+mut vect object 1
+mut92 1
+mutabl 1
+muth 1
+muticast 1
+muticast protocol 1
+mutipl 1
+mutipl cop 1
+mutk 1
+mutlipl 1
+mutlipl form 1
+mutlipl form dep 1
+mutu 18
+mutu algorithm 1
+mutu algorithm inform 1
+mutu compl 1
+mutu con 1
+mutu con order 1
+mutu connect 1
+mutu exclus 8
+mutu exclus begin 1
+mutu exclus follow 1
+mutu exclus mechan 1
+mutu exclus result 1
+mutu exclus test 1
+mutu gaz 1
+mutu interact 1
+mutu interfer 1
+mutu non 1
+mutu non empt 1
+mutu orthogon 2
+mutu recur 3
+mutu recur funct 2
+mutu refer 1
+mutu refer modl 1
+mutu sil 1
+mutu sil dur 1
+mutuel 1
+mutuel de 1
+mutuel de variabl 1
+mv 2
+mv defin 1
+mv es 1
+mv es ver 1
+mv xi1xi2 1
+mvect 1
+mvp 1
+mvp au 1
+mvp au chapitr 1
+mvp ch 1
+mvp ch dutiliser 1
+mvp cont 1
+mvp cont le 1
+mvp dan 1
+mvp dan le 1
+mvp de 1
+mvp de techniqu 1
+mvp disp 1
+mvp disp dun 1
+mvp dot 1
+mvp ec 1
+mvp ec nous 1
+mvp en 1
+mvp en distingu 1
+mvp es 1
+mvp es de 1
+mvp est 1
+mvp et de 1
+mvp et est 1
+mvp et le 1
+mvp et nous 1
+mvp etant 1
+mvp etc 1
+mvp impl 1
+mvp impl ee 1
+mvp koan 1
+mvp koan en 1
+mvp la 1
+mvp la la 1
+mvp lor 1
+mvp lor de 1
+mvp mun 1
+mvp mun dun 1
+mvp ne 1
+mvp ne soit 1
+mvp nintrodu 1
+mvp nintrodu pa 1
+mvp nous 1
+mvp peuv 1
+mvp peuv donc 1
+mvp pour 1
+mvp pour lipsc 1
+mvp pu 1
+mvp pu etr 1
+mvp puisquun 1
+mvp puisquun processeur 1
+mvp qu 1
+mvp qu dan 1
+mvp sapproch 1
+mvp sapproch de 1
+mvp sappu 1
+mvp sappu sur 1
+mvp se 1
+mvp se charger 1
+mvp se heurt 1
+mvp sont 1
+mvp sont intim 1
+mvp suiv 1
+mvp suiv le 1
+mvp sur 1
+mvp sur de 1
+mvp util 1
+mvp util un 1
+mw 2
+mw cl 1
+mwac 1
+mwjkp 1
+mx 3
+mx x1 1
+mycin 1
+mycroft 2
+mycroft and okeef 1
+mycroft and r.a 1
+mycroft okeef 1
+mycroftokeef 1
+myer 2
+myinf 1
+myinf from db 1
+mymailq 1
+mynod 1
+myoan 2
+myoglobin 1
+myoglobin and cytochrom 1
+myoglobin and hemoglobin 1
+myop 1
+myop oracl 1
+myop oracl giv 1
+myop oracl perform 1
+myop oracl schedl 1
+myop oracl ye 1
+myproc 1
+myproc.ne.0 1
+myrinet 2
+myron 1
+myron flickner 1
+myth 1
+myth and re 1
+mz 1
+mzg1 1
+n 1
+n.a 4
+n.b 1
+n.d 1
+n.e 1
+n.j 1
+n.m 3
+n.r 1
+n.s 2
+n.v 1
+n.v is ed 1
+n.v is non 1
+n.v that satisf 1
+n.v to mov 1
+n.v we comput 1
+n.y 2
+n0 5
+n0 2bnlogn 1
+n0 2bnlogn e2k 1
+n0 bn 1
+n0 bn 2c 1
+n0 el 1
+n0 el smaller 1
+n0 for n1 1
+n0 inver 1
+n0 inver subtr 1
+n0 jt 1
+n0 jt jn0 1
+n0 m0 1
+n0 n k0i 1
+n0 n logn 1
+n0 nod 1
+n0 proc 1
+n0 smallest 1
+n0 smallest el 1
+n0 stat 1
+n0 th 1
+n0 th number 1
+n0 th smallest 1
+n0 then n0 1
+n0 then q0 1
+n0 then qout 1
+n0 ver 1
+n00014 6
+n0001492f1375 1
+n0001492f1375 and n0001492f4083 1
+n0001492f4083 1
+n01 2
+n01 n02 1
+n02 1
+n0820 1
+n0g 1
+n0g tim 1
+n0j 1
+n0k 1
+n0m0 1
+n1 13
+n1 2o 1
+n1 and n2 3
+n1 as activ 1
+n1 cand 1
+n1 do i2 1
+n1 fimf 1
+n1 fimf log2 1
+n1 mayb 1
+n1 n2 2
+n1 n2 n3 1
+n1 n3 1
+n1 pr 1
+n1 protocol 1
+n1 qu 1
+n1 yield 1
+n1 yield high 1
+n12 1
+n12 n2 1
+n1g 1
+n1g and c2 1
+n1jy1j 1
+n1nf 1
+n1nf tupl 1
+n2 30
+n2 2bdeg 1
+n2 and n3 1
+n2 calcl 1
+n2 calcl locaux 1
+n2 cand 1
+n2 cop 1
+n2 cop de 1
+n2 crosspoint 1
+n2 cycl 1
+n2 differ label 1
+n2 exp 1
+n2 is creat 1
+n2 ln2 1
+n2 log 1
+n2 log2 1
+n2 log3 1
+n2 logn 1
+n2 mi 1
+n2 n3 2
+n2 n3 cand 1
+n2 n3 env 1
+n2 n3 n4 2
+n2 n7 1
+n2 protocol 1
+n2 r1 1
+n2 shar 1
+n2 t log1 1
+n2 tg 1
+n2 tn 1
+n2 wer execut 1
+n2 yield 1
+n2 yield high 1
+n24 1
+n2g 1
+n2k02kn0 1
+n2k02kn0 3n02k2n 1
+n2kg 1
+n2kg mk2 1
+n2l 1
+n2l 3g1 1
+n2p 1
+n2p el 1
+n3 8
+n3 3bn2 1
+n3 3bn23 1
+n3 3dn2 1
+n3 and n4 1
+n3 cand 1
+n3 cycl 1
+n3 do i3 1
+n3 env 1
+n3 et nont 1
+n3 is reactiv 1
+n3 m3 1
+n3 n4 2
+n3 n4 n5 1
+n3 r1 1
+n3 respect 1
+n3 rl 1
+n3 rl g2 1
+n3 ser 1
+n3 ser st 1
+n3 wa creat 1
+n3k 1
+n3n2 1
+n3n2 rl 1
+n3n2 rl g2rl 1
+n4 5
+n4 hav n1 1
+n4 n4 1
+n4 n5 1
+n4 n5 n4 1
+n4 n5 n6 1
+n4 n5 n6n7 1
+n4 n8 1
+n4 n8 n9 1
+n4 wer introduc 1
+n4p 1
+n4p el 1
+n4pr 1
+n5 3
+n5 n2 1
+n5 n2 n7 1
+n5 n4 1
+n5 n5 1
+n5 n5 n2 1
+n5 n6 1
+n5 n6 n8 1
+n5 n6n7 1
+n5 n6n7 n8n9 1
+n5 n8 1
+n6 2
+n6 is transfer 1
+n6 n6 1
+n6 n8 1
+n6 n9 1
+n6 n9 n6 1
+n6a 2
+n6a 5b7 2
+n6a 5b7 canad 1
+n6n7 1
+n6n7 n8n9 1
+n7 3
+n745 1
+n8 1
+n8 n4 1
+n8 n4 n4 1
+n8 n9 1
+n8n9 1
+n9 1
+n9 n6 1
+n91 1
+na 31
+na a deux 1
+na a prior 1
+na algorithm 3
+na algorithm ba 1
+na am 2
+na am grant 1
+na am research 1
+na approach 2
+na attempt 1
+na aucun 2
+na aucun conflit 1
+na aucun fonct 1
+na aucun solut 1
+na besoin 1
+na besoin de 1
+na bottom 1
+na c na 1
+na de 1
+na de sen 1
+na del 3
+na del cer 2
+na del mar 1
+na donc 3
+na donc bien 1
+na donc de 1
+na donc pa 2
+na dun 1
+na dun super 1
+na en 1
+na en con 1
+na evalu 1
+na expect 1
+na ext 1
+na finit 1
+na finit el 1
+na gradu 1
+na gradu stud 1
+na gu 1
+na implem 3
+na implem me 1
+na inser 1
+na internet 1
+na jam 1
+na na 1
+na pa 4
+na pa besoin 1
+na pa de 3
+na pa deff 1
+na pa demand 1
+na pa dinc 1
+na pa dint 1
+na pa encor 1
+na pa grand 1
+na pa le 2
+na pa non 1
+na pa suiv 1
+na parallel 1
+na parallel ver 1
+na plus de 1
+na pu 1
+na pu aboutir 1
+na qu 1
+na qu peu 1
+na quun 1
+na quun impact 1
+na rl 1
+na rl fir 1
+na system 1
+na system div 1
+na tabl 1
+na tabl lookup 1
+na toutef 1
+na toutef pa 1
+na under grant 1
+na ve 1
+na ve de 1
+na89 1
+nab 1
+nabord 1
+nabord pa 1
+naborderon 1
+naborderon ni 1
+naborderon ni le 1
+naborderon pa 1
+naborderon pa le 1
+nacc 1
+nacc ed 1
+nacc ed qu 1
+nacc edent 1
+nacc edent qu 1
+naccr 1
+naccr t qu 1
+nach 1
+nach prinzip 1
+nach prinzip der 1
+nachtig 1
+nack 2
+naclp 2
+naclp workshop 1
+nadathur 2
+nag 6
+nag a de 1
+nag avant 1
+nag avant chaqu 1
+nag aveugl 1
+nag aveugl est 1
+nag aveugl lor 1
+nag aveugl ren 1
+nag aveugl sont 1
+nag correspon 1
+nag dadr 1
+nag de 1
+nag de liaison 1
+nag de mi 1
+nag de valeur 1
+nag dun 1
+nag dun liaison 1
+nag ecrit 1
+nag ecrit egal 1
+nag en 1
+nag est 1
+nag est simplif 1
+nag et au 1
+nag et du 1
+nag et mi 1
+nag etendu 1
+nag influencerait 1
+nag influencerait la 1
+nag la 1
+nag la restaur 1
+nag la sauvegard 1
+nag ne 1
+nag ne march 1
+nag ne peuv 1
+nag ne soit 1
+nag ne voit 1
+nag nest 1
+nag nest pa 1
+nag ou 1
+nag ou de 1
+nag par 1
+nag par var 1
+nag pourrait 1
+nag pourrait etr 1
+nag requ 1
+nag requ erent 1
+nag s electif 1
+nag sont 1
+nag sont compar 1
+nag sont evit 1
+nag sont toujour 1
+nag standard 1
+nag va 1
+nag va dir 1
+nag1 2
+nagamoch 1
+nagamoch and kazuh 1
+nagasak 1
+nagel 1
+naik 1
+nail 1
+naish 1
+naish pour 1
+naish pour impl 1
+nait 1
+nait pa 1
+nait pa de 1
+najork 1
+nak 2
+nak ack 1
+nak ack rmsp 1
+nak and retransm 1
+nak protocol 1
+nak protocol proc 1
+nak protocol receiver 1
+nak protocol sen 1
+nak protocol var 1
+nak sh death 1
+nakad 1
+nakahir 1
+nakajim 1
+nakashim 1
+nakayam 1
+nakazaw 1
+nal 2
+nal consider 1
+nal consider acc 1
+nal integr 1
+nal number 1
+nalt 1
+nalt er en 1
+nam 72
+nam 2n 1
+nam 2n 2p 1
+nam a bind 1
+nam a cl 1
+nam a defin 1
+nam a del 1
+nam a follow 1
+nam a log 1
+nam a slot 1
+nam a subcl 1
+nam a symbol 1
+nam a var 1
+nam abstract 1
+nam abstract proc 1
+nam act 1
+nam act se 1
+nam an immut 1
+nam and addr 1
+nam and argum 2
+nam and departm 1
+nam and empl 1
+nam and ext 1
+nam and object 1
+nam and privileg 1
+nam and rp 1
+nam and sal 1
+nam and st 1
+nam and status 1
+nam and valu 1
+nam and var 1
+nam ar ad 1
+nam ar character 1
+nam ar kept 1
+nam ar lower 1
+nam ar merg 1
+nam ar regard 1
+nam ar standard 1
+nam ar twosym 1
+nam ar un 1
+nam arbitr 1
+nam arbitr ch 1
+nam as argum 2
+nam babel 1
+nam by funct 1
+nam by identif 1
+nam by macr 1
+nam by modl 1
+nam chang 1
+nam chronolog 1
+nam chronolog virtu 1
+nam cl 1
+nam clash 2
+nam closur 1
+nam coar 1
+nam collect 1
+nam compon 1
+nam con 1
+nam con object 1
+nam conv 3
+nam conv ind 1
+nam correspon 1
+nam d1 1
+nam defin 2
+nam descript 1
+nam detect 1
+nam direct 1
+nam dist 1
+nam domain 1
+nam domain variabl 1
+nam e1 2
+nam e1 encl 1
+nam edg 1
+nam emp 1
+nam emp e1 1
+nam exchang 1
+nam exp 2
+nam exp env 1
+nam export 1
+nam expr 1
+nam field 2
+nam follow 1
+nam for 1
+nam for attribut 1
+nam for individu 1
+nam for regl 1
+nam for sampl 1
+nam for se 1
+nam for variabl 1
+nam format 1
+nam from modl 1
+nam funct 1
+nam g0 1
+nam gen 1
+nam gen lambd 1
+nam gener 1
+nam gener funct 1
+nam gf 1
+nam giv 1
+nam group 2
+nam group privileg 1
+nam hal 1
+nam he kalman 1
+nam help 1
+nam in commmon 1
+nam in common 1
+nam in cour 1
+nam in oper 1
+nam in order 1
+nam incompatibil 1
+nam inherit 1
+nam init 1
+nam init opt 1
+nam initfunct 1
+nam initfunct reader 1
+nam integer 1
+nam is assoc 1
+nam is big 1
+nam is defin 1
+nam is exc 1
+nam is initarg 1
+nam is stigmerg 1
+nam is vi 1
+nam j identif 1
+nam j initform 1
+nam j method 1
+nam j modl 1
+nam jw0w1j 1
+nam jw0w1j jvivj 1
+nam lambd 1
+nam lambd list 1
+nam list 1
+nam loc 1
+nam log 1
+nam log omnisc 1
+nam loop 1
+nam loweralph 1
+nam loweralph digit 1
+nam mak 1
+nam maxrol 1
+nam me 1
+nam me queu 1
+nam method 1
+nam method init 1
+nam min 1
+nam minrol 1
+nam mmd 1
+nam modulenam 1
+nam mov 1
+nam n ad 1
+nam n outfil 1
+nam n output 1
+nam nam 1
+nam net 1
+nam net.motif 1
+nam not ment 1
+nam occur 1
+nam of algorithm 1
+nam of argum 1
+nam of attribut 1
+nam of bind 1
+nam of bound 1
+nam of compon 1
+nam of decl 1
+nam of inclus 1
+nam of instruc 1
+nam of item 1
+nam of lisp 1
+nam of modl 1
+nam of oper 1
+nam of program 1
+nam of top 1
+nam or activ 1
+nam or identif 1
+nam p1 1
+nam p1 ss 1
+nam part 2
+nam patht 1
+nam paul 1
+nam paul key 1
+nam point 1
+nam point se 1
+nam pr 1
+nam pr calculus 1
+nam presid 1
+nam procedur 1
+nam procedur cal 1
+nam protect 1
+nam protect domain 1
+nam quer 1
+nam rang 1
+nam refer 1
+nam reg 1
+nam rel 1
+nam rel program 1
+nam relstder 1
+nam relstder refer 1
+nam remain 1
+nam rnam 1
+nam rnam uniqu 1
+nam run 1
+nam schem 1
+nam se 2
+nam self 1
+nam self clock 1
+nam should achief 1
+nam sit 1
+nam slot 1
+nam slot descript 1
+nam slot opt 1
+nam sort 1
+nam spac 1
+nam spec 1
+nam spec lambd 1
+nam specif 1
+nam suggest 1
+nam sum 1
+nam supercl 1
+nam supercl nam 1
+nam symbol 1
+nam th approach 1
+nam th cl 1
+nam th continu 1
+nam th cr 1
+nam th dog 1
+nam th effect 1
+nam th equiv 1
+nam th half 1
+nam th init 1
+nam th input 1
+nam th internet 1
+nam th loc 1
+nam th modl 1
+nam th procedur 1
+nam th refer 1
+nam th self 1
+nam that agent 1
+nam that input 1
+nam them individu 1
+nam tim 1
+nam tim er 1
+nam to cl 1
+nam to ip 1
+nam trickledown 1
+nam ue 1
+nam unit 1
+nam v0 1
+nam valu 1
+nam valu pair 1
+nam wa ch 1
+nam wavel 1
+nam wavel pack 1
+namel 1
+namur 1
+nanc 1
+nand 1
+nanosecon 1
+naok 2
+naok kobayash 1
+naok sait 1
+naor 1
+nappar 2
+nappar dan 1
+nappar dan lenviron 1
+nappar pa 2
+nappar pa dan 2
+nappar qu 1
+nappar qu dan 1
+nappar t ni 1
+nappar t pa 1
+nappart 2
+nappart pa 1
+nappart pa au 1
+nappliquer 1
+nappliquer la 1
+nappliquer la coh 1
+napport 1
+napport pa 1
+napport pa sel 1
+naq 1
+nar 4
+nar colour 1
+nar colour videotap 1
+nar model 1
+nar show 1
+narasimhan 1
+narasimhan and soar 1
+narayanswam 1
+nard 1
+narendr 2
+narendr karmarkar 1
+narit 1
+narm 1
+narm model 1
+narrow 13
+narrow a modl 1
+narrow abstract 1
+narrow abstract mach 1
+narrow act 1
+narrow act env 1
+narrow an expr 1
+narrow and backtrack 1
+narrow appl 1
+narrow as oper 1
+narrow band 1
+narrow band filter 1
+narrow bfather 1
+narrow bfather env 1
+narrow by rl 1
+narrow channel 2
+narrow cur 1
+narrow cur env 1
+narrow currexp 1
+narrow deriv 1
+narrow domain 1
+narrow environm 1
+narrow expr 1
+narrow graph 1
+narrow interfac 1
+narrow mach 1
+narrow mach implem 1
+narrow rang 1
+narrow rectangl 1
+narrow rectangl matr 1
+narrow sem 1
+narrow step 1
+narrow step correspon 1
+narrow tak 1
+narrow tak plac 1
+narrow th dist 1
+narrow th entir 1
+narrow th rang 1
+narrow tr 1
+narrow ver 1
+narrow ver strip 1
+narrower 1
+narsingh 1
+narsingh de 1
+narsingh de nishit 1
+narx 1
+narx and input 1
+narx architectur 1
+narx model 1
+narx network 1
+narx network becom 1
+narx neur 1
+narx neur network 1
+narx recur 1
+narx recur neur 1
+nashvil 1
+nasr 1
+nasrabad 1
+nassar 1
+nassar andrew 1
+nassar andrew rau 1
+nassim 2
+nassur 1
+nassur pa 1
+nassur pa quel 1
+nastiest 1
+nastiest configur 1
+nastiest configur dep 1
+nat 43
+nat addr 1
+nat addr spac 1
+nat adv 1
+nat adv research 1
+nat amount 1
+nat and intern 1
+nat bureau 1
+nat cod 1
+nat cod compil 1
+nat cod execut 1
+nat compiler 1
+nat computer 1
+nat consid 1
+nat consid er 1
+nat de 6
+nat de la 1
+nat de recherch 6
+nat engl speak 1
+nat is import 1
+nat kcm 1
+nat kcm cod 1
+nat labor 6
+nat langu 2
+nat langu support 1
+nat me 1
+nat oid 1
+nat oid oid 1
+nat ou 1
+nat ou peupl 1
+nat phy 1
+nat phy labor 1
+nat research 4
+nat research center 1
+nat research centr 2
+nat research council 2
+nat sc 11
+nat sc found 11
+nat speaker 1
+nat standard 1
+nat standard institut 1
+nat sup 1
+nat sup erieur 1
+nat support 1
+nat support record 1
+nat telecommun 1
+nat univer canber 1
+nat var 1
+nat with husband 1
+nathan 2
+nathan goodman 1
+natif 1
+natif d ecouvr 1
+natif du 1
+natif du compilateur 1
+natif qu 1
+natif qu du 1
+natif sur 1
+natif sur un 1
+natkin 2
+natkin and rober 1
+natkin le 1
+natkin stochast 1
+natkin stochast petr 1
+natom 1
+natsort 1
+natsort sort 1
+natur 76
+natur and artif 1
+natur and implem 1
+natur and problem 1
+natur and us 1
+natur ar 1
+natur assum 2
+natur be view 1
+natur bottom 1
+natur break 1
+natur break point 1
+natur by further 1
+natur candid 1
+natur capabil 1
+natur ch 3
+natur cl 1
+natur combinatoir 1
+natur comput 1
+natur comput problem 1
+natur const 1
+natur constraint 1
+natur constraint qu 1
+natur correspon 1
+natur de 2
+natur de ce 1
+natur de don 1
+natur de nid 1
+natur de pag 1
+natur defin 1
+natur degrad 1
+natur domain 1
+natur du 1
+natur du probl 1
+natur encounter 1
+natur environm 1
+natur est 1
+natur est princip 1
+natur expr 1
+natur ext 4
+natur frequ 1
+natur genet 1
+natur heptapept 1
+natur heptapept opt 1
+natur identif 1
+natur imag 1
+natur imp 2
+natur implem 1
+natur import aspect 1
+natur in exploit 1
+natur init 1
+natur init partit 1
+natur join 1
+natur join oper 1
+natur k multipl 1
+natur langu 9
+natur langu allow 1
+natur langu cap 1
+natur langu consult 1
+natur langu dat 1
+natur langu docum 1
+natur langu gener 1
+natur langu input 1
+natur langu proc 2
+natur langu structur 1
+natur langu text 2
+natur langu understand 3
+natur langu workshop 1
+natur lim 2
+natur logarithm 1
+natur manner 1
+natur manner paradigm 1
+natur match 1
+natur math 1
+natur math ematiqu 1
+natur neighbor 1
+natur neighbor sort 1
+natur non 1
+natur non determin 1
+natur not 2
+natur number 4
+natur obtain 1
+natur of compon 1
+natur of connect 1
+natur of correct 1
+natur of definit 1
+natur of hierarch 1
+natur of inclus 1
+natur of lp 1
+natur of object 2
+natur of part 1
+natur of rewrit 1
+natur of specif 1
+natur of textur 1
+natur par 1
+natur par el 1
+natur perm 1
+natur perm eff 1
+natur plac 1
+natur probabil 1
+natur probabil est 1
+natur program 1
+natur program langu 1
+natur proof 1
+natur proof search 1
+natur quelconqu 1
+natur quelconqu dan 1
+natur quest 1
+natur r ep 1
+natur result 1
+natur sc 7
+natur sc ar 1
+natur sc engineer 1
+natur select 1
+natur sem 1
+natur suit 1
+natur support 1
+natur support broadcast 1
+natur tak 1
+natur th dynam 1
+natur to ask 1
+natur to assum 1
+natur to comb 1
+natur to expect 1
+natur to ext 1
+natur to investig 1
+natur to row 1
+natur to stud 1
+natur to view 1
+natur to work 1
+natur way 1
+naturel 3
+naturel a valeur 1
+naturel and artif 1
+naturel con 1
+naturel de 3
+naturel de cr 1
+naturel de distinguer 1
+naturel de etr 1
+naturel de la 1
+naturel de matr 1
+naturel et de 1
+naturel et relatif 1
+naturel exploit 1
+naturel exploit ee 1
+naturel k tel 1
+naturel le 1
+naturel port 1
+naturel qu 1
+naturel qu soit 1
+naturel quel 1
+naturel quel appar 1
+naturel sauvegard 1
+naturel un 2
+naturel un localit 1
+naturel un simpl 1
+naudin 1
+naught 1
+naur 1
+naur pa 1
+naur pa de 1
+naurait 2
+naurait pa 2
+naurait pa de 1
+naurait pa lieu 1
+naurait tout 1
+naurait tout simpl 1
+nauront 1
+nauront plus dic 1
+naut 2
+naut en 1
+naut en aucun 1
+naut mil 1
+nautoriser 1
+nautoriser quun 1
+nautoriser quun sel 1
+nav 7
+nav and arnon 1
+nav research 4
+nav stok 1
+nav stok tor 1
+nav warfar 1
+nav warfar system 1
+navait 1
+navar 1
+navath 3
+navath and raf 1
+navig 10
+navig allow 1
+navig and interact 1
+navig effort 1
+navig task 1
+navig through docum 1
+navig through hyperdocum 1
+navig with relev 1
+navin 2
+navin budhiraj 1
+navin kabr 1
+navoir 1
+navoir aucun 1
+navoir aucun droit 1
+navoir quun 1
+navoir quun eff 1
+navoir quun fa 1
+navon 2
+navon besoin 1
+navon besoin ic 1
+navon cherch 1
+navon pa 1
+navon pa de 1
+navon plus ni 1
+navon pour 1
+navon pour linst 1
+nay 1
+nay pa 1
+nay pa encor 1
+nay pa un 1
+naylor 1
+naylor algorithm 1
+naylor demonstr 1
+nb 6
+nb b nb 1
+nb de 1
+nb de dp 1
+nb de dpl 1
+nb denot 1
+nb m emoir 1
+nb point 1
+nb point de 1
+nb rec 1
+nb retour 1
+nb sect 1
+nb sect contigu 1
+nb sect sect 1
+nb snooplrclrc 1
+nb snooplrclrc 8kg100norm 1
+nb snooplrclrc 8kloc100norm 1
+nb snooplrclrc 8kml100norm 1
+nb snooplrclrc 8kmp3d100norm 1
+nb snooplrclrc 8kwater100norm 1
+nb.6 1
+nb.7 1
+nbnod 1
+nbnod numnod 1
+nbnod pav 1
+nbq 1
+nc 14
+nc ae 1
+nc ae nm 1
+nc algorithm 2
+nc avec 1
+nc avec le 1
+nc bound 1
+nc da 1
+nc da comput 1
+nc dat 1
+nc dat complec 1
+nc distinct 1
+nc distinct cl 1
+nc e ll 1
+nc entr 1
+nc logspac 1
+nc logspac logspac 1
+nc mo 1
+nc pav 1
+nc reg 1
+nc reg 8c 1
+nc reg maxim 1
+nc reg offer 1
+ncel 1
+ncel si 1
+ncel t isharp 1
+nch 1
+nch ap 1
+nch dep 1
+nch pch 1
+ncl 2
+ncn 1
+nconf 1
+nconf dm 1
+nconf npb 1
+nconf nst 1
+ncr 2
+ncub 7
+ncub cluster 3
+ncub fam 1
+ncyclelength 1
+ncycletim 1
+nd 11
+nd coter 1
+nd european 1
+nd european symp 1
+nd f cycl 1
+nd2 1
+nd91 1
+ndest 1
+nding 1
+nding th n0 1
+nding th number 1
+ndom 1
+ndp 1
+ndp ad 1
+ndp ad ae 1
+ndp ad np 1
+ndp denot 1
+ndp denot weak 1
+ne 11
+ne a common 1
+ne au 1
+ne au tr 1
+ne bloquait 1
+ne bloquait pa 1
+ne boug 1
+ne boulever 1
+ne boulever pa 1
+ne calculer 1
+ne calculer le 1
+ne chang 1
+ne chang pa 1
+ne cherch 1
+ne cherch pa 1
+ne cherchon 1
+ne cherchon pa 1
+ne co 1
+ne co ut 1
+ne com 2
+ne com le 1
+ne com pa 1
+ne compact 1
+ne compact pa 1
+ne comport 2
+ne comport aucun 1
+ne comport qu 2
+ne comport quun 2
+ne compr 1
+ne compr qu 1
+ne con 3
+ne con quen 1
+ne concern 2
+ne concern en 1
+ne concern pa 1
+ne concern qu 2
+ne concernait 1
+ne concernait qu 1
+ne conduit 1
+ne conduit pa 1
+ne connaisson 2
+ne connaisson pa 2
+ne constitu 2
+ne constitu donc 1
+ne constitu pa 1
+ne construit 1
+ne construit pa 1
+ne cont 2
+ne cont le 1
+ne cont pa 1
+ne cont pourt 1
+ne cont qu 2
+ne cont quun 1
+ne contenait 1
+ne contenait qu 1
+ne contr 1
+ne contr olent 1
+ne contrebalanc 1
+ne contrebalanc pa 1
+ne converg 1
+ne converg pa 1
+ne cop 1
+ne cop qu 1
+ne correspon 1
+ne correspon pa 1
+ne cr 1
+ne cr ee 1
+ne cr eent 1
+ne d ecr 1
+ne d efinit 1
+ne d eg 1
+ne d epen 3
+ne d epl 1
+ne d pen 1
+ne de 2
+ne de bit 1
+ne de liaison 1
+ne de longueur 1
+ne de simplioc 1
+ne de trait 1
+ne de variabl 1
+ne dec 1
+ne dec el 1
+ne demand 1
+ne demand pa 1
+ne denot 1
+ne dev 1
+ne devr 1
+ne devr pa 1
+ne devrait 1
+ne devrait pa 1
+ne diff 1
+ne diff erent 1
+ne doiv 1
+ne doiv pa 1
+ne don 1
+ne don jam 1
+ne don pa 1
+ne donc 1
+ne dupliqu 1
+ne dupliqu pa 1
+ne en 1
+ne en util 1
+ne est 1
+ne est de 1
+ne est toujour 1
+ne et isotrop 1
+ne fa 1
+ne fa intervenir 1
+ne fa pa 1
+ne fait 3
+ne fait aucun 1
+ne fait donc 1
+ne fait intervenir 1
+ne fait lunanim 1
+ne fait pa 2
+ne fait qu 1
+ne finit 1
+ne finit pa 1
+ne font 2
+ne font intervenir 1
+ne font qu 1
+ne font toutef 1
+ne fournit 2
+ne fournit pa 1
+ne fournit qu 1
+ne fournit quun 1
+ne grain 1
+ne grain commun 1
+ne guid 1
+ne guid pa 1
+ne is fr 1
+ne jou 1
+ne jou quun 1
+ne justif 1
+ne justif pa 1
+ne la 1
+ne la supposer 1
+ne laccompagn 1
+ne laccompagn pa 1
+ne le 4
+ne le conserv 1
+ne le doiv 1
+ne le fer 1
+ne le fournit 1
+ne le seront 1
+ne le soient 1
+ne le sont 2
+ne lest pa 1
+ne li 1
+ne li qu 1
+ne lib 1
+ne lient 1
+ne lient pa 1
+ne linv 1
+ne linv de 1
+ne lu 1
+ne lu est 1
+ne march 1
+ne measur 1
+ne ment 1
+ne ment pa 1
+ne modif 3
+ne modif ni 1
+ne modif pa 3
+ne n ecessit 3
+ne ne 1
+ne ne peut 1
+ne nest 1
+ne nest pa 1
+ne nous 4
+ne nous concern 1
+ne nous conformeron 1
+ne nous imp 1
+ne nous int 1
+ne nous par 1
+ne nous rest 1
+ne nous sembl 1
+ne nous som 1
+ne pa 4
+ne pa alourdir 1
+ne pa alt 1
+ne pa appar 1
+ne pa appliquer 1
+ne pa avoir 1
+ne pa changer 1
+ne pa confondr 2
+ne pa cr 1
+ne pa elaguer 1
+ne pa en 1
+ne pa etr 1
+ne pa ex 1
+ne pa fair 1
+ne pa introduir 1
+ne pa lib 1
+ne pa mettr 1
+ne pa modif 2
+ne pa permettr 1
+ne pa privil 1
+ne pa ralentir 1
+ne pa rallonger 1
+ne pa repr 1
+ne pa retarder 1
+ne pa retenir 1
+ne pa traiter 1
+ne parcourir 1
+ne parcourir quun 1
+ne part 2
+ne part pa 2
+ne partag 1
+ne partag jam 1
+ne partit 1
+ne partit qu 1
+ne partitionner 1
+ne partitionner quen 1
+ne partitionner quun 1
+ne partitionnon 1
+ne partitionnon la 1
+ne passer 1
+ne passer qu 1
+ne perd 1
+ne perd la 1
+ne perm 2
+ne perm pa 2
+ne perm quun 1
+ne permettait 1
+ne permettait pa 1
+ne permettr 1
+ne permettr pa 1
+ne perturb 1
+ne perturb pa 1
+ne peut 4
+ne peut alor 1
+ne peut avoir 1
+ne peut donc 2
+ne peut en 1
+ne peut etr 3
+ne peut intervenir 1
+ne peut pa 3
+ne peut prendr 1
+ne peut se 2
+ne peut toutef 1
+ne peuv 4
+ne peuv effectuer 1
+ne peuv etr 3
+ne peuv interagir 1
+ne peuv pa 2
+ne peuv qu 1
+ne po 2
+ne po ed 1
+ne po edent 1
+ne po en 1
+ne po pa 1
+ne pour 2
+ne pour aller 1
+ne pour etr 2
+ne pourrait 1
+ne pourrait etr 1
+ne pourront 1
+ne pourront pa 1
+ne pouv 1
+ne pouv etr 1
+ne pouvait 1
+ne pouvon 1
+ne pouvon apporter 1
+ne pouvon donc 1
+ne pr 2
+ne pr esent 1
+ne pr esenter 1
+ne pren 2
+ne pren pa 1
+ne pren qu 1
+ne pren toutef 1
+ne prouv 1
+ne prouv qu 1
+ne prouv quel 1
+ne prouv quil 1
+ne prov 1
+ne prov qu 1
+ne r eclamer 1
+ne r esout 1
+ne re coit 1
+ne refl 1
+ne refl es 1
+ne rem 1
+ne rem pa 1
+ne ren 1
+ne ren pa 1
+ne rentr 1
+ne rentr pa 1
+ne rentreron 1
+ne rentreron donc 1
+ne repr 1
+ne repr esent 1
+ne requ 1
+ne requ alor 1
+ne requ aucun 1
+ne requ pa 1
+ne requ qu 1
+ne rest 1
+ne rest maint 1
+ne restaurer 1
+ne restaurer le 1
+ne restreint 1
+ne restreint pa 1
+ne retourn 1
+ne retourn pa 1
+ne rev 1
+ne rev pa 1
+ne rien 1
+ne risqu 2
+ne risqu pa 1
+ne romp 1
+ne romp pa 1
+ne saccompagn 1
+ne saccompagn pa 1
+ne sag 1
+ne sag dun 1
+ne sagit 1
+ne sagit alor 1
+ne sagit cep 1
+ne sagit pa 1
+ne sait 3
+ne sait donc 1
+ne sait pa 2
+ne sannl 1
+ne sannl pa 1
+ne sappliqu 2
+ne sappliqu pa 1
+ne satisfait 1
+ne satisfait pa 1
+ne sattach 1
+ne sattach pa 1
+ne saurait 1
+ne saurait ignorer 1
+ne saurait le 1
+ne savon 1
+ne se 3
+ne se chevauch 1
+ne se comport 1
+ne se produir 1
+ne se produit 1
+ne se veut 1
+ne sembl 1
+ne sembl pa 1
+ne sen 1
+ne sen pr 1
+ne ser 3
+ne ser acc 1
+ne ser conserv 1
+ne ser cr 1
+ne ser distribu 1
+ne ser non 1
+ne ser pa 1
+ne serait 3
+ne serait alor 1
+ne serait ce 1
+ne serait pa 2
+ne serait rest 1
+ne sinscrit 1
+ne sinscrit pa 1
+ne sint 2
+ne sint egr 1
+ne sint er 1
+ne sint eresser 1
+ne soient 1
+ne soient dupliqu 1
+ne soient modif 1
+ne soit 4
+ne soit atteint 1
+ne soit cr 1
+ne soit lib 1
+ne soit pa 4
+ne soit tot 1
+ne soit trait 1
+ne sont 4
+ne sont applicabl 1
+ne sont connus 1
+ne sont couver 1
+ne sont don 1
+ne sont donc 1
+ne sont en 1
+ne sont mi 1
+ne sont pa 4
+ne sont possibl 1
+ne sont qu 2
+ne sont restaur 1
+ne sont sauvegard 1
+ne sont suffisam 1
+ne sont toutef 1
+ne subir 1
+ne subir quun 1
+ne subit 1
+ne subit linflu 1
+ne suiv 1
+ne suiv pa 1
+ne surprendr 1
+ne surprendr pa 1
+ne th approach 1
+ne tien 1
+ne tien qu 1
+ne tient 1
+ne tient pa 1
+ne tr 1
+ne trait 1
+ne trait pa 1
+ne trouv 1
+ne trouv qu 1
+ne v erif 1
+ne va 1
+ne va cop 1
+ne va pa 1
+ne valu 1
+ne var 1
+ne var pa 1
+ne veut 2
+ne veut pa 2
+ne voit 1
+ne voit pa 1
+ne1 1
+ne1 e2 1
+ne91 1
+ne94 1
+neal 2
+neal holtz 1
+neal holtz bi.html 1
+near 27
+near as ext 1
+near const 1
+near doubl 1
+near equ 3
+near equ spac 1
+near equ valu 1
+near ev 1
+near ev divid 1
+near fcf 1
+near fcf queu 1
+near half 2
+near ident 2
+near ident proof 1
+near im after 1
+near imp 1
+near indiffer 1
+near invar 1
+near minim 1
+near minim degr 1
+near near test 1
+near neartest 1
+near neartest se 1
+near optim 2
+near optim solut 1
+near proper 1
+near regl 1
+near regl graph 1
+near synchron 1
+near synchron behavior 1
+near ten 1
+near ten year 1
+near th entir 1
+nearb 3
+nearb in spac 1
+nearb inst 1
+nearest 13
+nearest cluster 1
+nearest cluster centr 1
+nearest earl 1
+nearest enem 1
+nearest enem remain 1
+nearest fr 1
+nearest fr child 1
+nearest hyperrectangl 1
+nearest hyperrectangl algorithm 1
+nearest hyperrectangl learn 1
+nearest inst 1
+nearest integer 2
+nearest neighbor 4
+nearest neighbor algorithm 1
+nearest neighbor classif 1
+nearest neighbor connect 1
+nearest neighbor contour 1
+nearest neighbor dec 1
+nearest neighbor edit 1
+nearest neighbor p.n1 1
+nearest neighbor pattern 1
+nearest neighbor rl 1
+nearest neighbor search 1
+nearest neighbour 1
+nearest neighbour classif 1
+nearest neighbour point 1
+nearest power 1
+nearest sourc 1
+nearest to furthest 1
+nearest tw inst 1
+nearest whol number 1
+nearesthyperrectangl 1
+nearesthyperrectangl algorithm 1
+nearestneighbour 1
+nearestneighbour classif 1
+nearlin 1
+nearlin speed 1
+nearoptim 1
+neartest 1
+neartest se 1
+neat 2
+neat systol 1
+neat systol algorithm 1
+nec 90
+nec 2oe 1
+nec a lack 1
+nec a pol 1
+nec a valu 1
+nec act 1
+nec adjac 1
+nec amount 1
+nec and suff 3
+nec ar 1
+nec argum 1
+nec aucun 1
+nec aucun etat 1
+nec ba 1
+nec ba oper 1
+nec bad 1
+nec be 1
+nec be uniqu 1
+nec bin 1
+nec bin vect 1
+nec but fe 1
+nec car 1
+nec car ec 1
+nec coinc 1
+nec condit 4
+nec conform 1
+nec consider 1
+nec constraint 1
+nec dat 1
+nec defin 1
+nec definit 1
+nec demand 1
+nec detect 1
+nec disjoint 1
+nec distinct 2
+nec distinct letter 1
+nec du 1
+nec ea 1
+nec ec 1
+nec ecut 1
+nec ecut quun 1
+nec eff 1
+nec eff solut 1
+nec equilibr 1
+nec exclus 1
+nec fif 1
+nec finit 1
+nec finit hardwar 1
+nec first step 1
+nec for av 1
+nec for gener 1
+nec for load 1
+nec for phy 1
+nec for proc 1
+nec for tak 1
+nec for test 1
+nec for understand 1
+nec funct 1
+nec funct requir 1
+nec imp 2
+nec import 1
+nec improv 1
+nec improv nxn 1
+nec in complec 1
+nec in order 2
+nec in pen 1
+nec in situ 1
+nec in spac 1
+nec interfac 1
+nec interfac chang 1
+nec inv 1
+nec knowledg 1
+nec known 1
+nec lead 1
+nec level 1
+nec maint 1
+nec maint act 1
+nec mak 1
+nec mak optim 1
+nec mean 2
+nec mean preconceiv 1
+nec minim 1
+nec minim number 1
+nec number 1
+nec obv 1
+nec of triangl 1
+nec optim 1
+nec pa 2
+nec pa dan 2
+nec pa dautr 1
+nec pa de 1
+nec pa dent 1
+nec pa despac 1
+nec pa dit 1
+nec pa lorsquon 1
+nec part 2
+nec part result 1
+nec perform 1
+nec posit 1
+nec precondit 1
+nec proposit 1
+nec reach 1
+nec reduc 1
+nec reflect 2
+nec requir 2
+nec research 2
+nec research institut 2
+nec result 1
+nec rev 1
+nec safeguard 1
+nec select 1
+nec stat 1
+nec test 1
+nec th minim 1
+nec th start 1
+nec to acc 1
+nec to accompl 1
+nec to achief 1
+nec to ad 1
+nec to allow 1
+nec to backtrack 1
+nec to bal 1
+nec to calcl 1
+nec to check 1
+nec to compl 1
+nec to consider 1
+nec to construc 1
+nec to cr 2
+nec to custom 1
+nec to determin 2
+nec to develop 1
+nec to distingu 3
+nec to draw 1
+nec to encod 1
+nec to ensur 1
+nec to enumer 1
+nec to establ 1
+nec to estim 1
+nec to evolut 1
+nec to execut 1
+nec to ext 1
+nec to fil 1
+nec to find 2
+nec to fit 1
+nec to forml 1
+nec to giv 1
+nec to gu 1
+nec to guar 1
+nec to init 1
+nec to inser 1
+nec to integr 1
+nec to introduc 1
+nec to know 3
+nec to look 1
+nec to maintain 2
+nec to mak 3
+nec to nam 2
+nec to perform 1
+nec to period 1
+nec to plac 1
+nec to preserv 1
+nec to recogn 1
+nec to ref 1
+nec to repr 1
+nec to resum 1
+nec to show 1
+nec to solut 1
+nec to st 1
+nec to support 1
+nec to toler 1
+nec to understand 1
+nec to us 3
+nec to val 1
+nec to yield 1
+nec transl 1
+nec uniqu 1
+nec us 1
+nec without major 1
+nec writ 1
+necc 1
+necc non 1
+necc non loc 1
+necessidad 1
+necessidad do 1
+necessidad do usu 1
+necessit 4
+necessit conver 1
+necessit th ec 1
+necessit th us 1
+necessitatatem 1
+neck 1
+neck ajout 1
+neck ajout ee 1
+neck arit 1
+neck bp 1
+neck compl 1
+neck compl es 1
+neck cr 1
+neck cr eerait 1
+neck cut 1
+neck cut ne 1
+neck cut point 1
+neck cut sont 1
+neck cut vn 1
+neck devr 1
+neck devr etr 1
+neck doit 1
+neck doit aus 1
+neck et cut 1
+neck et pa 1
+neck et trust 1
+neck garantit 1
+neck garantit qu 1
+neck inutil 1
+neck inutil est 1
+neck ninv 1
+neck ninv le 1
+neck ou 1
+neck ou neck 1
+neck ou trust 1
+neck pour 1
+neck pour mettr 1
+neck pour savoir 1
+neck proceed 1
+neck qu 1
+neck qu soit 1
+neck real bp 1
+neck rem 1
+neck rem bp 1
+neck remplit 1
+neck remplit le 1
+neck sp 1
+neck sp ecifiqu 1
+neck stat 1
+neck stat adr 1
+neck trust 1
+neck virtu 1
+neckcut 1
+nectar 2
+nectar network 1
+nectar network interfac 1
+nectar project 1
+nectar project network 1
+nectar testb 1
+nedv 1
+needham 1
+neffectu 2
+neffectu pa 1
+neffectu pa le 1
+neffectu qu 1
+neffectu qu de 1
+neffectu quun 1
+neffectu quun simpl 1
+neg 37
+neg acknowledg 1
+neg acknowledgm 1
+neg and control 1
+neg and equiv 1
+neg and neg 1
+neg and posit 1
+neg and quantif 1
+neg aspect 2
+neg atom 1
+neg by fixpoint 1
+neg compon 1
+neg conclus 1
+neg correl 1
+neg cost 1
+neg cost pair 1
+neg dist 1
+neg div 1
+neg doubl 1
+neg doubl prec 1
+neg exampl 1
+neg feedback 1
+neg fic 1
+neg fic prec 1
+neg fr 1
+neg gain 1
+neg gain valu 1
+neg in hilog 1
+neg in sect 1
+neg individu 1
+neg integer 4
+neg integer denot 1
+neg key 1
+neg key valu 1
+neg learn 1
+neg liter 2
+neg match 1
+neg match ignor 1
+neg natur 1
+neg negr 1
+neg not neg 1
+neg number 1
+neg oe 1
+neg of conjunct 1
+neg of posit 1
+neg on 2
+neg propag 1
+neg propag respect 1
+neg quant 1
+neg real 1
+neg result 1
+neg root 1
+neg scor 1
+neg sign 1
+neg sign respect 1
+neg signaloutput 1
+neg string 1
+neg th con 1
+neg th condit 1
+neg valu 3
+neg variabl 1
+neg ver 1
+neg weight 2
+neg weight graph 1
+neg zer 1
+negahdaripour 1
+neglect 5
+neglect th commun 1
+neglect th fact 1
+negleg 1
+negleg user 1
+negleg user mod 1
+neglig 6
+neglig compar 1
+neglig overhead 1
+neglig startup 1
+neglig startup overhead 1
+neglig ts 1
+negot 2
+negot and migr 1
+negot design 1
+negot protocol 1
+negot protocol follow 1
+negr 1
+neidl 1
+neiger 2
+neiger and sam 1
+neighbor 26
+neighbor acc 1
+neighbor algorithm 1
+neighbor algorithm learn 1
+neighbor and nearest 1
+neighbor and nearesthyperrectangl 1
+neighbor and neighbor 1
+neighbor and sen 1
+neighbor ar al 1
+neighbor ar exclus 1
+neighbor ar remov 1
+neighbor block 2
+neighbor can becom 1
+neighbor cel 1
+neighbor classif 1
+neighbor cluster 3
+neighbor cluster pair 1
+neighbor compon 1
+neighbor compon inst 1
+neighbor connect 1
+neighbor contour 1
+neighbor contour part 1
+neighbor cover 1
+neighbor dec 1
+neighbor dec rl 1
+neighbor edit 1
+neighbor edit rl 1
+neighbor for search 1
+neighbor fragm 1
+neighbor imag 1
+neighbor imag block 1
+neighbor is remov 1
+neighbor molecl 1
+neighbor n.v 1
+neighbor neighbor 1
+neighbor nod 2
+neighbor of discontinu 1
+neighbor or upd 1
+neighbor p.n1 1
+neighbor part 1
+neighbor pattern 1
+neighbor pattern classif 1
+neighbor point 1
+neighbor proc 2
+neighbor qu 1
+neighbor qu tr 1
+neighbor receiver 1
+neighbor rl 1
+neighbor rl using 1
+neighbor search 2
+neighbor sort 1
+neighbor tetrahedr 1
+neighbor tetrahedr becom 1
+neighbor to break 1
+neighbor ver 1
+neighbor wer al 1
+neighbour 10
+neighbour and form 1
+neighbour classif 1
+neighbour classif perform 1
+neighbour classif system 1
+neighbour domain 1
+neighbour iter 1
+neighbour must hold 1
+neighbour of se 1
+neighbour of targ 1
+neighbour point 1
+neighbour univer 1
+neighbour univer etc 1
+neil 5
+neil avenu 1
+neil avenu columbus 1
+neil coburn 1
+neil jon 1
+neilson 2
+neilson refut 1
+neisser 1
+nelson 3
+nelson morgan 1
+nement 3
+nement complec 1
+nement complec dun 1
+nement d ev 1
+nempiler 1
+nempiler qu 1
+nempiler qu le 1
+nen 2
+nen ec 1
+nen ec pa 1
+nen est 2
+nen est pa 1
+nen est rien 1
+nen garantit 1
+nen garantit pa 1
+nen r eduit 1
+nen vaut 1
+nen vaut pa 1
+nencombr 1
+nencombr pa 1
+nencombr pa le 1
+nengendr 1
+nengendr aucun 1
+nengendr aucun ph 1
+nengendr de 1
+nengendr de faux 1
+nengendr pa 1
+nengendr pa de 1
+nengendr qu 1
+nengendr qu de 1
+nengendr quun 1
+nengendr quun sel 1
+nengendrer 1
+nengendrer de 1
+nengendrer de faux 1
+nentr 1
+nentr donc 1
+nentr donc pa 1
+nenv 1
+nenv et ne 1
+neomycin 1
+neomycin system 1
+neq 1
+neq intn 1
+neq realn 1
+ner 2
+ner le 2
+ner le chang 1
+ner le variabl 1
+nerait 1
+nerait deux 1
+nerait deux test 1
+nest 29
+nest acc 1
+nest acc ed 1
+nest alor 1
+nest alor sauv 1
+nest and mult 1
+nest appl 3
+nest appl quau 1
+nest appl system 1
+nest ar consider 1
+nest ar determin 1
+nest ar signif 1
+nest assoc 1
+nest assuj 1
+nest assuj qu 1
+nest be ser 1
+nest by find 1
+nest can induc 1
+nest cap 1
+nest cap qu 1
+nest cl 1
+nest clair 1
+nest clair pa 1
+nest consider 1
+nest correct 1
+nest correct qu 1
+nest correspon 1
+nest cr 1
+nest dissect 2
+nest dissect algorithm 1
+nest dissect order 1
+nest dit 1
+nest dit du 1
+nest donc 4
+nest donc clair 1
+nest donc pa 2
+nest donc ps 1
+nest donc quun 1
+nest en 1
+nest en fait 1
+nest encor 2
+nest encor quembryonnair 1
+nest encor quun 1
+nest evidem 1
+nest evidem pa 1
+nest extract 1
+nest fiv layer 1
+nest funct 1
+nest funct cal 1
+nest gener 1
+nest gener exempl 1
+nest if el 1
+nest if expr 1
+nest if stat 1
+nest imp 1
+nest in order 1
+nest is addr 1
+nest is defin 1
+nest is equ 1
+nest is extract 1
+nest is parallel 1
+nest iter 1
+nest iter spac 1
+nest jam 2
+nest jam util 1
+nest layer 1
+nest level 1
+nest loop 3
+nest loop consum 1
+nest loop known 1
+nest loop shown 1
+nest m em 1
+nest manifest 1
+nest manifest pa 1
+nest mi 1
+nest mi en 1
+nest modl 1
+nest n ecessair 2
+nest ni 1
+nest ni la 1
+nest of langu 1
+nest optim 1
+nest optim pour 1
+nest pa 5
+nest pa acc 1
+nest pa activ 1
+nest pa ai 1
+nest pa alor 1
+nest pa atteint 1
+nest pa au 1
+nest pa cel 1
+nest pa clair 1
+nest pa compat 1
+nest pa conflictuel 1
+nest pa connu 1
+nest pa convec 1
+nest pa correct 1
+nest pa de 2
+nest pa div 1
+nest pa effectu 1
+nest pa en 1
+nest pa equit 1
+nest pa exclu 1
+nest pa flec 1
+nest pa forc 1
+nest pa init 1
+nest pa interrupt 1
+nest pa le 2
+nest pa modif 1
+nest pa motiv 1
+nest pa non 2
+nest pa nouvel 1
+nest pa optim 1
+nest pa parfait 1
+nest pa partag 1
+nest pa pr 2
+nest pa propr 1
+nest pa quun 1
+nest pa respect 1
+nest pa restreint 1
+nest pa satisf 1
+nest pa si 1
+nest pa significatif 1
+nest pa sp 1
+nest pa strict 1
+nest pa su 1
+nest pa surpr 1
+nest pa syst 1
+nest pa tot 2
+nest pa toujour 4
+nest pa tout 1
+nest pa transpar 1
+nest pa un 1
+nest pa unimodulair 1
+nest pa util 1
+nest pa vain 1
+nest pa vraim 1
+nest parallel 2
+nest partag 1
+nest partag ee 1
+nest partit 1
+nest perform 1
+nest plus acc 1
+nest plus appl 1
+nest plus aus 1
+nest plus de 1
+nest plus proportionnel 1
+nest plus quun 1
+nest plus respect 1
+nest plus util 1
+nest plus vr 1
+nest pr 1
+nest pr esent 1
+nest procedur 1
+nest procedur invoc 1
+nest qu 1
+nest qu de 1
+nest quun 3
+nest quun simpl 1
+nest quun sous 1
+nest quun traduc 1
+nest rel 1
+nest respect 1
+nest respect ee 1
+nest rien 1
+nest rien dautr 1
+nest s ur 1
+nest san dout 1
+nest sauvegard 1
+nest term 1
+nest th purp 1
+nest top 1
+nest top level 1
+nest toutef 1
+nest toutef pa 1
+nest transact 3
+nest transact comp 1
+nest transact contain 1
+nest transact ct 1
+nest transact layer 1
+nest transact recov 1
+nest transact retain 1
+nest transform 1
+nest with lin 1
+nest without dep 1
+nestorreader 1
+nestorreader character 1
+net 23
+net adapt 1
+net adapt self 1
+net approach 1
+net ar somehow 1
+net arbitr 1
+net avail 1
+net ba 1
+net ba sem 1
+net becom 1
+net can solut 1
+net cluster 1
+net cluster method 1
+net comput 1
+net de 1
+net de la 1
+net dur problem 1
+net ee 1
+net effect 2
+net experim 1
+net for catch 1
+net for exampl 1
+net giv 1
+net giv expon 1
+net ha reach 1
+net hav simil 1
+net in log 1
+net is bound 1
+net is mad 1
+net is requir 1
+net is unimport 1
+net le 1
+net le not 1
+net learn 2
+net learn algorithm 1
+net learn method 1
+net lik hardwar 1
+net may start 1
+net perform 1
+net perform model 1
+net produc 1
+net requir 1
+net result 1
+net sit 1
+net sit pushpl.html 1
+net sourc 1
+net surf 1
+net system 1
+net system drop 1
+net talk 1
+net that look 1
+net to solut 1
+net train 1
+net wer init 1
+net wer unchang 1
+net workload 1
+net.motif 1
+neter 2
+netherland 12
+netherland e mail 1
+netherland lnc 1
+netj 1
+netj of output 1
+netj or yk 1
+netj real valu 1
+netnew 1
+netscap 1
+netscap server 1
+netscap server push 1
+netsim 1
+netsim cannot model 1
+netsim cod 1
+netsim featur 1
+netsim for user 1
+netsim from 18k 1
+netsim from mi 1
+netsim is design 1
+netsim is structur 1
+netsim most suit 1
+netsim support 1
+nettl 1
+nettl et subraman 1
+network 64
+network 10ms 1
+network 10ms cc 1
+network a bar 1
+network a transform 1
+network academ 1
+network accompl 1
+network act 1
+network act remain 1
+network addr 1
+network addr imperson 1
+network administer 1
+network after prun 1
+network aggreg 1
+network aggreg throughput 1
+network algorithm 1
+network and decr 1
+network and degener 1
+network and describ 1
+network and determin 1
+network and distribut 1
+network and fewer 1
+network and fft 1
+network and fuzz 1
+network and gener 1
+network and host 1
+network and interfac 2
+network and isdn 2
+network and link 1
+network and me 1
+network and narm 1
+network and oe 1
+network and oper 1
+network and pattern 1
+network and po 1
+network and ssm 1
+network and stat 1
+network and telephon 1
+network appl 4
+network approach 1
+network ar abl 1
+network ar character 1
+network ar count 1
+network ar dead 1
+network ar determin 1
+network ar empl 1
+network ar exp 1
+network ar expect 1
+network ar fair 1
+network ar indeed 1
+network ar intrin 1
+network ar loc 1
+network ar network 1
+network ar pr 1
+network ar satisf 1
+network ar train 1
+network ar typ 1
+network ar unfold 1
+network ar univer 1
+network ar wid 1
+network architectur 10
+network architectur ch 1
+network architectur en 1
+network architectur prov 1
+network arrang 1
+network as b1 2
+network automat 1
+network ba 4
+network ba edg 1
+network ba multicomputer 1
+network backplan 1
+network baltimor 1
+network bandwidth 7
+network bandwidth demand 2
+network be known 1
+network becom 3
+network becom lower 1
+network being init 1
+network bisect 1
+network bisect bandwidth 1
+network bisect constrain 1
+network bisect constraint 1
+network bisect perform 1
+network bisect resourc 1
+network block 1
+network block probabil 1
+network block rat 1
+network by alloc 1
+network by calcl 1
+network by divid 1
+network by gdeg 1
+network by ge 1
+network by lin 1
+network by loc 2
+network by mark 1
+network by refer 1
+network by soft 1
+network by succ 1
+network by using 1
+network can contain 1
+network can ea 1
+network can support 2
+network cap 1
+network cap avail 1
+network ch 1
+network channel 3
+network channel cycl 1
+network channel proc 2
+network channel transm 1
+network character 1
+network clock 2
+network clock cycl 2
+network cluster 2
+network commun 1
+network complec 2
+network complec lim 1
+network compon 1
+network compr 1
+network comput 4
+network comput equiv 1
+network comput power 1
+network comput system 2
+network con 4
+network confer 1
+network configur 6
+network configur ba 1
+network configur con 1
+network configur offer 1
+network connect 3
+network constrain 1
+network constrain ba 1
+network construc 1
+network construc algorithm 1
+network cont 3
+network control 1
+network control point 1
+network controller 1
+network cooper 1
+network cr 1
+network cr sect 1
+network cycl 1
+network cycl tim 1
+network del 1
+network deliver 1
+network dep 3
+network dep compl 1
+network descript 1
+network design 7
+network design ba 2
+network design fact 1
+network design problem 1
+network determin 1
+network dev 1
+network diameter 1
+network differ 1
+network digraph 1
+network direct correspon 1
+network disk 1
+network disk speed 1
+network displ 1
+network div 1
+network enough neuron 1
+network ensur 1
+network environm 3
+network equ 1
+network execut 1
+network experim 1
+network fil 2
+network fil inclus 1
+network fil server 1
+network find 1
+network for grammat 1
+network for improv 2
+network for locomot 1
+network for mult 1
+network for multicast 2
+network for multicomputer 2
+network for multilevel 2
+network for multiproc 2
+network for ocean 1
+network for proc 1
+network for rout 2
+network for speech 1
+network for switch 1
+network for synchron 1
+network for tempor 1
+network for textur 1
+network form 1
+network from dat 1
+network from remain 1
+network further 1
+network gener 1
+network gener us 1
+network giv 2
+network giv nod 2
+network group 1
+network guid 1
+network had learn 1
+network hav 2i 1
+network hav becom 1
+network id 1
+network impl 1
+network implem 1
+network in figur 1
+network in graph 1
+network in term 2
+network incr 2
+network infer 1
+network infer problem 1
+network int 1
+network int serv 1
+network interconnect 2
+network interconnect proc 1
+network interconnect processorcluster 1
+network interconnect topolog 1
+network interfac 6
+network interfac architectur 1
+network interfac assoc 1
+network interfac failur 1
+network interfac log 2
+network interfac prov 1
+network intern 1
+network intern repr 1
+network is describ 1
+network is drop 1
+network is equip 1
+network is fast 1
+network is faster 1
+network is found 1
+network is kept 1
+network is lin 1
+network is maxim 1
+network is nkn 1
+network is nonblock 1
+network is oper 1
+network is pr 1
+network is read 1
+network is retrain 1
+network is shown 1
+network is train 2
+network is upd 1
+network is zer 1
+network itself learn 1
+network known 1
+network lat 2
+network lat vs 1
+network layer 2
+network layer indep 1
+network layer prov 1
+network layerindep 1
+network layerindep libr 1
+network learn 2
+network level 1
+network lik butter 1
+network link 1
+network liter 1
+network logm 1
+network manag 1
+network manag protocol 1
+network map2 1
+network maxim 1
+network maxim aggreg 1
+network may con 1
+network may drop 1
+network may lo 1
+network me 1
+network model 6
+network modl 1
+network modl method 1
+network mor eff 1
+network must contain 1
+network must support 1
+network need disturb 1
+network nm 1
+network no longer 1
+network nod 1
+network nsar 1
+network nsar gav 1
+network of larger 1
+network of locationindep 1
+network of lr 1
+network of me 1
+network of proc 3
+network of rateproport 1
+network of rel 1
+network of sen 1
+network of server 1
+network of siz 2
+network of sparc 1
+network of sun 2
+network of switch 2
+network of var 1
+network of vi 1
+network of workst 3
+network offer 3
+network offer adv 1
+network offer user 1
+network optim 2
+network optim problem 1
+network or internet 2
+network or nsar 1
+network organ 1
+network output 2
+network output indep 1
+network output valu 1
+network overload 1
+network pack 1
+network pack com 1
+network pack remain 1
+network parameter 3
+network particl 1
+network partit 2
+network perform 4
+network plast 1
+network po 1
+network pool 1
+network pool id 1
+network pot 1
+network procedur 1
+network proceed 1
+network program 1
+network program actu 1
+network proper 1
+network protocol 2
+network prun 1
+network ra 1
+network rad 1
+network random 2
+network random init 1
+network random traff 1
+network rel 1
+network remain 1
+network repr 1
+network requir 1
+network resourc 2
+network resourc becom 1
+network resourc discov 1
+network resourc us 1
+network respect 1
+network result 1
+network rotor 1
+network rout 2
+network router 1
+network satisf 1
+network select 1
+network sensit 1
+network server 1
+network should dep 1
+network show 1
+network show explicit 1
+network shown 1
+network siml 3
+network siml using 1
+network siz 2
+network siz restrict 1
+network solut 1
+network sourc 1
+network sourc router 1
+network spec 1
+network speed 4
+network standard 1
+network structur 2
+network structur prov 1
+network subsystem 1
+network subsystem architectur 1
+network support 1
+network switch 1
+network synchron 1
+network system 2
+network system assoc 1
+network tak 1
+network th avail 1
+network th overlap 1
+network th pandemon 1
+network th problem 1
+network that allow 1
+network that contain 1
+network that dep 1
+network that emb 1
+network that us 1
+network through problem 1
+network throughput 3
+network throughput correspon 1
+network throughput nw 1
+network thus 2
+network to allow 1
+network to build 1
+network to character 1
+network to deal 1
+network to determin 1
+network to dj 1
+network to dk 1
+network to improv 1
+network to inclus 1
+network to learn 1
+network to monit 1
+network to optim 1
+network to prov 3
+network to recover 1
+network to support 1
+network to teach 1
+network to telecommun 1
+network took 1
+network topolog 7
+network topolog ba 1
+network topolog fic 1
+network topolog param 1
+network topolog refer 1
+network topolog typ 1
+network topolog.instead 1
+network traff 6
+network train 1
+network transm 1
+network transm tim 1
+network transpar 1
+network typ 2
+network under util 1
+network upon arriv 1
+network us 1
+network us model 1
+network user 1
+network using 3
+network using cut 1
+network using multiport 1
+network using point 2
+network util 1
+network vi relev 1
+network vi robust 1
+network vs 1
+network wa abl 1
+network wa ch 1
+network wa giv 1
+network wa pr 1
+network wa train 1
+network wer ch 1
+network wer int 1
+network wer retrain 1
+network wer test 1
+network wer train 1
+network wh 3
+network wh ba 1
+network wh commun 1
+network wh nod 1
+network wh rl 1
+network wh stat 1
+network when me 1
+network when train 1
+network when using 1
+network which div 1
+network which me 1
+network which us 1
+network wil con 1
+network wil dom 1
+network with 3d 1
+network with ar 2
+network with arbitr 1
+network with channel 1
+network with cluster 1
+network with fic 2
+network with input 1
+network with larger 1
+network with multidest 1
+network with prototyp 1
+network with respect 1
+network with restrict 1
+network with rout 1
+network with tr 1
+network with transceiver 1
+network with unequ 1
+network with unnec 1
+network with unrel 1
+network with var 3
+network with wormhol 1
+network work 2
+network work group 1
+network.6 1
+network.6 each me 1
+network1 2
+networkconstrain 1
+networker 1
+networkinterfac 1
+networkinterfac libr 1
+networkinterfac libr calloverhead 1
+networkinterfac networkinterfac 1
+networkinterfac networkinterfac libr 1
+netzwerkkonfigur 1
+netzwerkkonfigur with as 1
+neuman 2
+neuman comput 1
+neumerkel 2
+neumerkel a appliqu 1
+neur 9
+neur architectur 2
+neur comput 4
+neur darw 1
+neur dynam 1
+neur hardwar 1
+neur inform 4
+neur inform proc 4
+neur memor 1
+neur method 1
+neur model 2
+neur model categor 1
+neur net 5
+neur net arbitr 1
+neur net learn 2
+neur network 7
+neur network appl 2
+neur network approach 1
+neur network architectur 4
+neur network ba 1
+neur network baltimor 1
+neur network commun 1
+neur network comput 1
+neur network construc 1
+neur network design 1
+neur network div 1
+neur network experim 1
+neur network implem 1
+neur network learn 1
+neur network liter 1
+neur network model 5
+neur network modl 1
+neur network nsar 1
+neur network output 1
+neur network procedur 1
+neur network program 1
+neur network select 1
+neur network solut 1
+neur network system 1
+neur network thus 1
+neur network train 1
+neur proc 1
+neur sic2 1
+neur sic2 labor 1
+neur system 3
+neurocomput 1
+neurocomput research 1
+neurocomput research centr 1
+neurocomputer 1
+neurocomputer could pot 1
+neurocomputer synap 1
+neurocomputer system 1
+neuron 3
+neuron and prun 1
+neuron ar consider 1
+neuron as reason 1
+neuron group 1
+neuron group select 1
+neuron instead 1
+neuron is cap 1
+neuron shown 1
+neuron to ea 1
+neuron to repr 1
+neuron using 1
+neuron with lin 1
+neuron yi 1
+neutr 4
+neutr be 1
+neutr pot 2
+neutr pot con 1
+neutr term 1
+neutr term control 1
+neveu 2
+neveu and brigit 1
+nevil 1
+nevil man 1
+new 21
+new acquir 1
+new acquir knowledg 1
+new alloc 1
+new alloc inst 1
+new alloc list 1
+new backlog 1
+new backlog connect 1
+new creat 6
+new creat chunk 1
+new creat el 1
+new creat gener 1
+new creat object 1
+new creat parent 1
+new creat rol 1
+new creat vect 1
+new defin 2
+new defin cl 1
+new defin lock 1
+new defin slot 1
+new deriv 1
+new deriv constraint 1
+new determin 1
+new determin structur 1
+new evalu 1
+new evalu valu 1
+new execut 1
+new gener 1
+new inclus 1
+new inclus nod 1
+new inser 1
+new inser el 1
+new serv 1
+new server 1
+new worth 1
+newarg 1
+newel 1
+newel got 1
+newer 3
+newer knowledg 1
+newer knowledg overrl 1
+newer timesl 1
+newjob 1
+newl 2
+newl character 1
+newl return 1
+newman 2
+newman lem 1
+newman ou 1
+newman ou schrijver 1
+nework 1
+newport 1
+newsletter 4
+newsletter vol.15 1
+newsletter vol.15 nb.6 1
+newspaper 1
+newspaper imag 1
+newspaper imag block 1
+newst 1
+newstuff 1
+newt 4
+newt bar 1
+newt bar method 1
+newt law 2
+newt method 1
+newt search 1
+newt search direct 1
+newt secon law 1
+newt univer 1
+newt univer law 1
+newyork 1
+nexclut 2
+nexclut en 1
+nexclut en aucun 1
+nexclut pa 1
+nexpir 1
+nexpir ou 1
+nexpir ou si 1
+next 1
+nextloc 1
+nextloc in order 1
+nextloc invoc 1
+nextloc on cur 1
+nextloc oper 1
+nextpack 1
+nextpack pointer 1
+nextpack pointer assoc 1
+nf 9
+nf 1qf 1
+nf and thus 1
+nf problem 1
+nf refer 1
+nf serv 1
+nf84 1
+nfc92 1
+nff 2
+nff1 1
+nff1678 1
+nff1752 1
+nff2 1
+nff3 1
+nff4 1
+nff8 1
+nfg 1
+nfosl 1
+nfosl tosl 1
+nfosl tosl nnzwgp 1
+nfr 1
+nfr ntot 1
+nfr ntot nconf 1
+nfv 1
+nfwgp 1
+nfwgp twgp 1
+nfwgp twgp tosl 1
+nfyg 1
+ng 24
+ng 1qg 1
+ng and ri 1
+ng and s2 1
+ng bi 1
+ng bi xi 1
+ng et i4 1
+ng moon 1
+ng orthogon 1
+ng refer 1
+ng satisf 1
+ng sur 1
+ng tr 1
+ng tr matr 1
+ng we def 1
+ngouenet 1
+ngt 1
+nh 1
+nh2 1
+nh84 1
+nholtz 1
+nholtz tut 1
+nholtz tut doc 1
+ni 18
+ni 2j 1
+ni 2l 1
+ni a en 1
+ni attach 1
+ni attach stat 1
+ni calcl 1
+ni calcl de 1
+ni cart 1
+ni cart princip 1
+ni com 1
+ni conflictuel 1
+ni dan 1
+ni dan la 1
+ni de 2
+ni de calcl 1
+ni de cr 1
+ni de la 1
+ni dim 1
+ni dim spac 1
+ni div 1
+ni div ent 1
+ni fonct 1
+ni fonct de 1
+ni for schedl 1
+ni hav prop 1
+ni l etat 1
+ni l etud 1
+ni la 1
+ni la dern 1
+ni la prem 1
+ni le 3
+ni le point 1
+ni le register 1
+ni le techniqu 1
+ni log 1
+ni log 2l 1
+ni lordonnanc 1
+ni lordonnanc ni 1
+ni lorgan 1
+ni lorgan de 1
+ni mi 1
+ni mi nj 1
+ni ne 1
+ni st 1
+ni stabl 1
+ni variabl 1
+ni ver 1
+ni ver quick 1
+ni0 1
+ni2 1
+ni2 bi 1
+niblack 2
+niblack et al 1
+nic 16
+nic and pract 1
+nic behaviour 1
+nic character 1
+nic cl 1
+nic design 1
+nic distribut 1
+nic effect 1
+nic effect load 1
+nic error 1
+nic error me 1
+nic haberman 1
+nic in achief 1
+nic in approach 1
+nic proper 1
+nic repr 1
+nic thing 2
+nicer 1
+nicer new graph 1
+nich 1
+nich ecologiqu 1
+nichol 4
+nichol hal 1
+nichol roussopoul 1
+nick 1
+nick roussopoul 1
+nickel 1
+nicol 3
+nicol graub 1
+nicolau 3
+nicolau and fish 1
+nid 1
+nid a un 1
+nid comport 1
+nid comport deux 1
+nid comport plusieur 1
+nid constitu 1
+nid constitu le 1
+nid cont 1
+nid cont plusieur 1
+nid correspon 1
+nid correspon au 1
+nid de 1
+nid de boucl 1
+nid de calcl 1
+nid de cop 1
+nid de dim 1
+nid de fa 1
+nid de la 1
+nid de man 1
+nid diff 1
+nid diff erent 1
+nid distinct 1
+nid en 1
+nid est 1
+nid est par 1
+nid est pour 1
+nid et le 1
+nid init 1
+nid init caract 1
+nid init en 1
+nid init pr 1
+nid init qu 1
+nid ne 1
+nid ne comport 1
+nid ne cont 1
+nid nest 1
+nid nest pa 1
+nid non 1
+nid non parfait 1
+nid origin 1
+nid origin ma 1
+nid origin po 1
+nid perm 1
+nid perm de 1
+nid peut 1
+nid peut alor 1
+nid peuv 1
+nid peuv etr 1
+nid plus co 1
+nid pour 1
+nid pour assurer 1
+nid qu 1
+nid qu de 1
+nid seront 1
+nid seront ind 1
+nid serv 1
+nid sont 1
+nid sont montr 1
+nid suiv 1
+nid transform 1
+niel 1
+niel again say 1
+niel an 1
+niel say 1
+nievergelt 3
+niez 1
+nif 1
+nif improv 1
+niggl 1
+night 1
+nightmar 2
+nightmar to understand 1
+nij 2
+nij random 1
+nijmeg 2
+nijmeg computer 1
+nijmeg computer sc 1
+nijmeg nl 1
+nik 2
+nik koud1 1
+nikhil 1
+nikhil and arvind 1
+nikodym 1
+nikodym deriv 1
+nikolaou 1
+nil 10
+nil a1 1
+nil acc 1
+nil and inv 1
+nil and p2s 1
+nil as leav 1
+nil fal 1
+nil for leav 1
+nil funct 1
+nil is defin 1
+nil j con 1
+nil j hd 1
+nil nest 1
+nil nest pa 1
+nil next hop 1
+nil nl 1
+nil path 1
+nil then exp 1
+nil then go 1
+nil then mod 1
+nil to read 1
+nil valu 1
+nil when inv 1
+nil wph 1
+nil wph pfn 1
+nilsson 1
+nimp 1
+nimp aucun 1
+nimp aucun test 1
+nimp donc 1
+nimp donc aucun 1
+nimpliqu 2
+nimpliqu pa 2
+nimpliqu pa qu 1
+nimport 2
+nimport quel 2
+nimport quel nombr 1
+nimport quel ordr 1
+nimport quel partit 1
+nimport quel typ 1
+nimport quel zon 1
+nin 8
+nin addit 1
+nin addit boolean 1
+nin ar 1
+nin boolean 1
+nin boolean algebr 1
+nin ca 1
+nin ca correspon 1
+nin color 1
+nin differ benchmark 1
+nin month 1
+nin month period 1
+nin sort 1
+nin sort benchmark 1
+nin step 1
+nin topolog 1
+nin topolog distinct 1
+ninclu 1
+ninclu pa 1
+ninclu pa encor 1
+nindu 1
+nindu quun 1
+nindu quun fa 1
+nineteenth 2
+nineteenth acm 1
+nineteenth annu 2
+nineteenth annu acm 1
+nineteenth annu haw 1
+ninflu 1
+ninflu qu 1
+ninflu qu sur 1
+ning 1
+ning trout 1
+nint 1
+nint egr 1
+nint egr pa 1
+ninterd 1
+ninterd pa 1
+ninterd pa le 1
+ninterv 2
+ninterv pa 2
+ninterv pa dan 1
+ninterv pa de 1
+ninterv pa lor 1
+ninterv plus aucun 1
+ninterv qu 1
+ninterv qu le 1
+ninth 1
+ninth intern 1
+nintrodu 1
+nintrodu pa 1
+nintrodu pa de 1
+ninv 1
+ninv le 1
+ninv le drapeau 1
+nip 2
+nipkow 1
+nipkow method 1
+nish 1
+nishikaw 1
+nishit 1
+nishit kumar 1
+nishit kumar jam 1
+nishizek 1
+nit 2
+nit of parallel 1
+nit st 1
+nit st mach 1
+nivat 1
+niveau 5
+niveau algorithmiqu 1
+niveau algorithmiqu dan 1
+niveau architectur 1
+niveau architectur par 1
+niveau com 1
+niveau com le 1
+niveau de 5
+niveau de boucl 1
+niveau de complexit 1
+niveau de conf 1
+niveau de diff 1
+niveau de don 1
+niveau de la 3
+niveau de ladn 1
+niveau de larchitectur 1
+niveau de lenviron 1
+niveau de mach 1
+niveau de pag 1
+niveau de probabilit 1
+niveau de profondeur 1
+niveau de prolog 1
+niveau de register 1
+niveau du 2
+niveau du lang 1
+niveau du mod 1
+niveau du syst 1
+niveau le 1
+niveau m es 1
+niveau mat 1
+niveau mat eriel 1
+niveau mol 1
+niveau mol eculair 1
+niveau pur 1
+niveau pur descriptif 1
+niveau sourc 1
+niveau sourc par 1
+niveau synth 1
+niveau synth etiqu 1
+niveau th 1
+niveau th oriqu 1
+niveaux 2
+niveaux de 2
+niveaux de la 1
+niveaux de part 1
+nj 23
+nj 3n 1
+nj at tim 1
+nj j nj 1
+nj mj 1
+nj pb 1
+nj pbg 1
+nj pq 1
+nj qn 1
+nj random 1
+nj th ddp 1
+nj th largest 1
+nj0 1
+nj0 pb 1
+nj0 pb nj0 1
+nj0c 1
+nj0c rpb 1
+nj0c rpb cr 1
+nj2 1
+nj2 pgcd 1
+njk 1
+njk for wjk 1
+njk self 1
+njk self del 1
+njoin 1
+njoin assign 1
+njoin asst 1
+njoin assttl 1
+njoin dept 1
+njoin deptm 1
+njoin deptttl 1
+njoin empd 1
+njoin empsk 1
+njoin empsl 1
+njoin proj 1
+njoin projb 1
+njoin projttl 1
+njr 1
+njr kr 1
+njw 1
+njw and jwn 1
+njw kw 1
+njw kw mn 1
+njw kw njr 1
+njw mn 1
+njw mn ir 1
+nk 7
+nk 2l 1
+nk ae 1
+nk and nk 1
+nk denot 1
+nk respect 1
+nk0 1
+nk0 n0k 1
+nk1c 1
+nk1c hunk 1
+nk1c hunk jc 1
+nk1c hunkn 1
+nkat25wav 1
+nkf 1
+nkg 1
+nkn 1
+nl 31
+nl a lindividu 1
+nl a.10 1
+nl a.10 number 1
+nl argum 1
+nl au 1
+nl au prem 1
+nl catd 1
+nl catd catd 1
+nl dan 1
+nl dan lestim 1
+nl del 1
+nl deriv 1
+nl each tim 1
+nl en 1
+nl en colon 1
+nl environm 1
+nl environm ext 1
+nl es 1
+nl es de 1
+nl et appart 1
+nl extract 1
+nl extract tool 1
+nl funct 1
+nl funct symbol 1
+nl hypoth 1
+nl hypoth hold 1
+nl if succ 1
+nl key 1
+nl key valu 1
+nl lock 1
+nl lock number 1
+nl method 1
+nl number 1
+nl number object 1
+nl og 1
+nl pack 1
+nl par 1
+nl par rapport 1
+nl pour 1
+nl pour tout 1
+nl prov 1
+nl qu 1
+nl qu lorsqu 1
+nl rang 1
+nl rang ee 1
+nl reader 1
+nl reader nl 1
+nl reg 1
+nl si 2
+nl si ce 1
+nl si lop 1
+nl sont 1
+nl sont facil 1
+nl text 1
+nl typ.h 1
+nl typ.h inclus 1
+nl valu 1
+nl writer 1
+nl writersbecomerichard 1
+nlog 2
+nlog mn 1
+nlogm 2
+nlogn 3
+nlogn el 1
+nlogn glob 1
+nlogn glob smallest 1
+nlogn smallest 1
+nlogn smallest el 1
+nlp 1
+nlp at gw 1
+nlu 1
+nlu system 1
+nm 11
+nm beforehand 1
+nm cff 1
+nm logn 1
+nm modl 1
+nm of pattern 1
+nm pair 1
+nm pattern 1
+nm with bfather 1
+nmac 3
+nmac and npeak 1
+nmaxtr 1
+nmg 1
+nmin 1
+nmr 1
+nmr experim 1
+nmr experim result 1
+nmr spectroscop 1
+nmt 1
+nn 6
+nn algorithm 1
+nn algorithm start 1
+nn method 1
+nn minfkn 1
+nn n mm 1
+nn pattern 1
+nn peut 1
+nn peut etr 1
+nn rl 1
+nn0 1
+nner 1
+nnumexplor 1
+nnz 1
+nnzosl 1
+nnzosl nfosl 1
+nnzosl nfosl tosl 1
+nnzosl nnzwgp 1
+nnzosl nnzwgp nnzosl 1
+nnzwgp 1
+nnzwgp nfwgp 1
+nnzwgp nfwgp twgp 1
+nnzwgp nnzosl 1
+nnzwgp nnzosl nnzwgp 1
+no 16
+no ag 1
+no ag par 1
+no algorithm 2
+no algorithm calqu 1
+no algorithm de 1
+no algorithm demeur 1
+no algorithm est 1
+no algorithm par 1
+no algorithm porter 1
+no algorithm pour 1
+no algoritm 1
+no an 1
+no an sur 1
+no and background 1
+no and degrad 1
+no and improv 1
+no and light 1
+no and outl 1
+no and signif 1
+no and siz 1
+no and us 1
+no appl 1
+no appl larchitectur 1
+no appl le 1
+no ar avail 1
+no bi 1
+no border 1
+no border point 1
+no bright 1
+no bright spot 1
+no by damp 1
+no by soft 1
+no by wavel 1
+no dat 2
+no du 2
+no effect 1
+no enregister 1
+no enregister dactiv 1
+no exp 1
+no exp er 1
+no filter 1
+no filter pa 1
+no fr 2
+no fr input 1
+no hypoth 1
+no hypoth es 1
+no in term 1
+no individus 1
+no individus sont 1
+no induc 1
+no induc spik 1
+no innov 1
+no inqu 1
+no inqu etud 1
+no inst 1
+no is suppr.5 1
+no level 1
+no mesur 1
+no mesur linstruc 1
+no observ 1
+no or random 1
+no perform 1
+no point 1
+no point nearb 1
+no primitiv 1
+no primitiv po 1
+no principaux 1
+no probl 2
+no probl em 1
+no probl me 1
+no pseud 1
+no pseud pr 1
+no r esultat 1
+no r sultat 1
+no rat 1
+no recherch 1
+no recherch ver 1
+no reduc 2
+no reduc dev 1
+no reduc step 1
+no reduc techniqu 1
+no reduc using 1
+no reg 1
+no remov 1
+no sch 1
+no sch em 1
+no seldom 1
+no seldom an 1
+no sign 1
+no sign using 1
+no spot 1
+no suppr 1
+no techniqu 1
+no techniqu sont 1
+no techniqu2 1
+no th shift 1
+no toler 1
+no toler algorithm 1
+no transform 1
+no transform avec 1
+no transform sur 1
+no travaux 1
+no travaux peuv 1
+no uniform 1
+no uniform distribut 1
+no using 1
+no var 1
+no vi dither 1
+no.1 2
+no.10 1
+no.1658 1
+no.2 3
+no.2 pp.247 1
+no.3 2
+no.3 pp 1
+no.4 1
+no.6 2
+no.8 1
+no.9 1
+no.ofcluster 2
+no1697 1
+no89 1
+no93a 1
+no93b 1
+no94 1
+noak 2
+noarg 1
+noarg de 1
+noarg de termecomp 1
+nob 1
+nobeit 1
+nobeit qu 1
+nod 62
+nod 2k 1
+nod a mov 1
+nod a multicast 1
+nod a nod 1
+nod a particl 1
+nod a result 1
+nod acc 1
+nod accord 1
+nod act 2
+nod ad 1
+nod addit 1
+nod addr 1
+nod addr con 1
+nod adjac 2
+nod adjust 1
+nod al deduc 1
+nod al maintain 1
+nod al observ 1
+nod al sen 1
+nod al st 2
+nod alread ec 1
+nod alw hear 1
+nod alw remain 1
+nod alw tak 1
+nod among switch 1
+nod and arc 1
+nod and atom 1
+nod and dealloc 1
+nod and edg 3
+nod and establ 1
+nod and for 1
+nod and individu 1
+nod and investig 1
+nod and leaf 1
+nod and link 1
+nod and mak 1
+nod and modif 1
+nod and proc 2
+nod and proceed 1
+nod and receiv 1
+nod and st 1
+nod and substitut 1
+nod and switch 1
+nod and us 2
+nod and vitter 1
+nod and weight 1
+nod and zer 1
+nod anod 1
+nod anod anod 1
+nod ap 1
+nod appear 2
+nod appl 1
+nod appl layer 1
+nod ar 1
+nod ar accur 1
+nod ar ad 2
+nod ar affect 1
+nod ar allow 1
+nod ar assign 1
+nod ar assum 1
+nod ar attach 2
+nod ar check 1
+nod ar cl 1
+nod ar color 1
+nod ar commun 1
+nod ar communin 1
+nod ar compar 1
+nod ar connect 2
+nod ar count 1
+nod ar creat 1
+nod ar deriv 1
+nod ar distribut 1
+nod ar elimin 1
+nod ar emb 1
+nod ar equiv 1
+nod ar ev 1
+nod ar expan 1
+nod ar expon 1
+nod ar fail 1
+nod ar fl 1
+nod ar handl 1
+nod ar ident 1
+nod ar internalxp 1
+nod ar label 3
+nod ar liter 1
+nod ar lo 1
+nod ar merg 2
+nod ar monit 1
+nod ar mov 1
+nod ar multicast 1
+nod ar object 1
+nod ar order 2
+nod ar overlaid 1
+nod ar particip 1
+nod ar proc 1
+nod ar prun 1
+nod ar regl 1
+nod ar remov 1
+nod ar repl 1
+nod ar repr 1
+nod ar schedl 1
+nod ar solut 1
+nod ar st 1
+nod ar tempor 1
+nod ar term 1
+nod ar transfer 1
+nod ar uniform 1
+nod ar uniqu 1
+nod ar val 1
+nod ar visit 1
+nod arriv 1
+nod as addr 1
+nod as fr 1
+nod as impl 1
+nod as individu 1
+nod as stub 1
+nod assign 1
+nod at level 3
+nod at random 2
+nod at rat 1
+nod at tim 1
+nod at var 1
+nod attach 1
+nod attempt 1
+nod b demultiplec 1
+nod b nod 1
+nod b sen 1
+nod ba 2
+nod bar 1
+nod bar command 1
+nod becom 2
+nod befor sen 1
+nod behav 1
+nod belong 1
+nod below level 1
+nod between proc 1
+nod beyon cal 1
+nod bisect 1
+nod block 1
+nod both slow 1
+nod bound 2
+nod by click 1
+nod by exact 1
+nod by mean 1
+nod by n1 1
+nod by plac 1
+nod c nod 1
+nod ca 1
+nod cal 1
+nod calcl 1
+nod can contribut 1
+nod can deduc 1
+nod can grow 1
+nod can particip 1
+nod can rec 1
+nod can sen 1
+nod can support 1
+nod can tak 2
+nod can transm 1
+nod can upd 1
+nod cap 1
+nod ce 1
+nod child 1
+nod cl 1
+nod cl nodetyp 1
+nod cl tok 1
+nod closest 1
+nod cluster 1
+nod cluster heterogeneouscluster 1
+nod cluster homogeneouscluster 1
+nod cluster tp 1
+nod cnod 1
+nod coar 1
+nod coar graph 1
+nod collap 1
+nod colour 1
+nod com 2
+nod command 1
+nod commun 3
+nod commun non 1
+nod compl 1
+nod compon 1
+nod compon inclus 1
+nod compon inst 1
+nod compon model 1
+nod comput 2
+nod comput nod 1
+nod comput zi 1
+nod condit 1
+nod condit hold 1
+nod connect 5
+nod const 1
+nod const indep 1
+nod consult 1
+nod cont 1
+nod contain 5
+nod contain entr 1
+nod continu 1
+nod continu gener 1
+nod correspon 4
+nod cost 1
+nod count 1
+nod cr 3
+nod cr t3d 2
+nod creat 1
+nod csvm 1
+nod csvm templ 1
+nod currnod 1
+nod dag 1
+nod dat 2
+nod dat repr 1
+nod dat structur 1
+nod def 1
+nod def nod 1
+nod degr 1
+nod del 3
+nod del check 1
+nod dep 1
+nod desir 1
+nod determin 1
+nod disjoint 1
+nod disjoint path 1
+nod distribut 2
+nod div 1
+nod div check 1
+nod div separ 1
+nod divid 1
+nod do div 1
+nod dynam 1
+nod e mentallyresult 1
+nod e0 1
+nod ec 1
+nod edg 1
+nod edg ver 1
+nod either break 1
+nod el 1
+nod encod 1
+nod equ 1
+nod equ fl 1
+nod establ 1
+nod ev 1
+nod ev divid 1
+nod eventu 1
+nod eventu reach 1
+nod exceed 1
+nod exclus 1
+nod execut 1
+nod expan 1
+nod explicit 1
+nod explicit repr 1
+nod explor 1
+nod extern 1
+nod extern reg 1
+nod f op 1
+nod fac 1
+nod fac tim 1
+nod fail 2
+nod failur 2
+nod failur detect 1
+nod fal 1
+nod fat 1
+nod fat tr 1
+nod fetch 1
+nod follow 1
+nod follow specif 1
+nod for altern 1
+nod for design 1
+nod for implem 1
+nod for preproc 1
+nod for rmsp 1
+nod for transm 1
+nod found 3
+nod from fragm 1
+nod from nod 1
+nod from switch 1
+nod from vk 1
+nod frontendnod 1
+nod ge 3
+nod ge high 1
+nod ge involut 1
+nod gener 3
+nod gener se 1
+nod gener traff 1
+nod giv 1
+nod granl 2
+nod granl issu 2
+nod graph 3
+nod graph gener 1
+nod ha degr 1
+nod ha determin 1
+nod ha indegr 1
+nod ha inform 1
+nod ha outdegr 1
+nod ha reach 1
+nod half 1
+nod half split 1
+nod hardwar 1
+nod hardwar multicast 1
+nod hav adequ 1
+nod hav arriv 1
+nod hav equ 1
+nod hav inter 1
+nod hav length 1
+nod hav level 1
+nod hav link 1
+nod hav reach 1
+nod hav status 1
+nod hear 1
+nod i div 1
+nod i keep 1
+nod i pick 1
+nod i upd 1
+nod ibm 1
+nod ibm sp 1
+nod identif 1
+nod in adj 1
+nod in cl 1
+nod in cluster 1
+nod in common 1
+nod in e0 1
+nod in f1 1
+nod in fi 1
+nod in figur 1
+nod in fm 1
+nod in fragm 1
+nod in g0 3
+nod in gp 1
+nod in level 2
+nod in main 1
+nod in main0 1
+nod in memor 1
+nod in nod3 1
+nod in p1 1
+nod in patht 1
+nod in pi 1
+nod in pk 1
+nod in pl 1
+nod in quest 1
+nod in r0 1
+nod in senior 1
+nod in t0 1
+nod in transit 1
+nod in traver 1
+nod in v1 1
+nod in v2 1
+nod in v2e 1
+nod in v2l 1
+nod in v3 1
+nod in y0s 1
+nod indep 1
+nod indep ascertain 1
+nod indep count 1
+nod indep dec 1
+nod indep maintain 1
+nod induc 1
+nod inform 1
+nod input 2
+nod input nod 1
+nod int transport 1
+nod interconnect 1
+nod intern 1
+nod involut 1
+nod is ad 1
+nod is assign 1
+nod is black 1
+nod is bound 1
+nod is check 1
+nod is compar 1
+nod is connect 3
+nod is construc 1
+nod is cover 1
+nod is creat 1
+nod is determin 1
+nod is equ 2
+nod is evalu 1
+nod is exact 1
+nod is expect 1
+nod is fl 2
+nod is found 2
+nod is giv 1
+nod is green 1
+nod is inclus 1
+nod is increm 1
+nod is ind 2
+nod is indep 1
+nod is inform 1
+nod is init 1
+nod is inser 2
+nod is label 1
+nod is larger 1
+nod is link 1
+nod is lock 1
+nod is om 1
+nod is read 1
+nod is rel 1
+nod is replac 1
+nod is reus 1
+nod is rough 1
+nod is schedl 1
+nod is se 1
+nod is st 1
+nod is tl 1
+nod is train 1
+nod is treat 1
+nod is unlock 1
+nod is yellow 1
+nod issu 1
+nod it check 1
+nod itself reach 1
+nod j calcl 1
+nod j receiv 1
+nod j self 1
+nod just proc 1
+nod keep 1
+nod know 1
+nod l level 1
+nod label 2
+nod lat 1
+nod layer 1
+nod layer label 1
+nod leaf 1
+nod list 2
+nod list def 1
+nod loc 3
+nod loc ascertain 1
+nod loc indep 1
+nod lock 1
+nod lock request 1
+nod lower 1
+nod mad 1
+nod mad redund 1
+nod maintain 2
+nod manager 1
+nod manager actu 1
+nod manager begin 1
+nod manager enabl 1
+nod manager for 1
+nod manager nod 1
+nod managerqueu 1
+nod managerqueu manager 1
+nod mark 2
+nod mark succ 1
+nod may execut 1
+nod may inject 1
+nod may rec 1
+nod may result 1
+nod me 1
+nod mean 1
+nod method 1
+nod migr 1
+nod migr algorithm 1
+nod migr mechan 1
+nod mobil 1
+nod mobil mechan 1
+nod mov 1
+nod mov tak 1
+nod multicast 1
+nod multicast me 1
+nod must ded 1
+nod must equ 1
+nod must support 1
+nod must us 1
+nod must wait 1
+nod n empt 1
+nod n fn1 1
+nod n input 1
+nod n0 1
+nod n1 1
+nod n2 1
+nod n3 1
+nod n6 1
+nod nam 1
+nod ncub 1
+nod negot 1
+nod neighbor 1
+nod new addr 1
+nod ni 2
+nod no longer 1
+nod nod 1
+nod nodeb 1
+nod now form 1
+nod np 1
+nod number 2
+nod number int 1
+nod number repr 1
+nod observ 1
+nod obtain 1
+nod of 15ns 1
+nod of bar 1
+nod of cl 1
+nod of degr 1
+nod of g0 1
+nod of gp 1
+nod of list 1
+nod of nod 2
+nod of tl 1
+nod on level 1
+nod on list 1
+nod oper 2
+nod or gather 1
+nod or link 1
+nod or proc 1
+nod order 1
+nod output 1
+nod output error 1
+nod overflow 1
+nod own outstand 1
+nod p issu 1
+nod p upd 1
+nod p40 1
+nod pa 2
+nod pa queu 1
+nod pa tok 1
+nod pair 1
+nod pandemon 1
+nod param 1
+nod param rout 1
+nod particip 1
+nod per inst 1
+nod per network 1
+nod per switch 1
+nod perform 1
+nod period 2
+nod period report 1
+nod plur 1
+nod plur int 1
+nod point 2
+nod prior 1
+nod problem 1
+nod proc 1
+nod proc overhead 1
+nod proc tim 1
+nod processingnod 1
+nod produc 1
+nod produc cal 1
+nod produc event 1
+nod r receiv 1
+nod random 1
+nod re 2
+nod realiz 1
+nod rec 1
+nod rec se 1
+nod receiv 6
+nod receiv exact 1
+nod receiv tok 1
+nod record 1
+nod recov 1
+nod recov protocol 1
+nod rel 3
+nod relabel 1
+nod remain 3
+nod remain fic 1
+nod remain unverif 1
+nod report 1
+nod repr 6
+nod repr block 1
+nod repr entr 1
+nod repr oper 1
+nod request 2
+nod requir 1
+nod respect 2
+nod return 2
+nod return cur 1
+nod rmsp 1
+nod root 1
+nod s bi 1
+nod s dat 1
+nod s inform 1
+nod s over 1
+nod s2 1
+nod s3 1
+nod s5 1
+nod se 6
+nod se mint 1
+nod select 1
+nod select proc 1
+nod self 1
+nod self del 1
+nod sen 3
+nod sen multicast 1
+nod sen transport 1
+nod separ 1
+nod separ con 1
+nod separ dep 1
+nod separ mean 1
+nod separ siz 1
+nod shar 1
+nod show 2
+nod show execut 1
+nod shutdown 1
+nod shutdown pkt 1
+nod siml 1
+nod simpler 1
+nod simultan 1
+nod sinc currnod 1
+nod singl 1
+nod singl net 1
+nod siz 1
+nod skip 1
+nod sl 1
+nod smal nod 1
+nod sp 1
+nod specif 1
+nod split 2
+nod st 2
+nod status 1
+nod stem 1
+nod structur 2
+nod sub 1
+nod suggest 1
+nod switch 1
+nod switchm 1
+nod system 1
+nod system exhibit 1
+nod t3d 1
+nod tak 1
+nod techniqu 1
+nod test 1
+nod th proc 1
+nod than heur 1
+nod that block 1
+nod that connect 1
+nod that contain 1
+nod that differ 1
+nod that rout 1
+nod that simultan 1
+nod that wait 1
+nod their cover 1
+nod then proc 1
+nod then sen 1
+nod therefor 1
+nod therefor st 1
+nod throughput 1
+nod throughput improv 1
+nod to achief 1
+nod to becom 2
+nod to calcl 1
+nod to ch 1
+nod to comp 1
+nod to comput 1
+nod to determin 1
+nod to exclus 1
+nod to execut 1
+nod to explor 1
+nod to handl 1
+nod to inclus 1
+nod to interm 1
+nod to nod 1
+nod to obtain 1
+nod to proc 2
+nod to recover 1
+nod to reflect 1
+nod to select 1
+nod to sen 2
+nod to start 1
+nod to upd 1
+nod to us 1
+nod topolog 1
+nod tp 1
+nod tp nod 1
+nod tr 2
+nod tr degr 1
+nod transfer 2
+nod transfer request 1
+nod transfer step 1
+nod transm 3
+nod transm nonloc 1
+nod truth 1
+nod truth slot 1
+nod typ 1
+nod typ def 1
+nod upd 2
+nod us 1
+nod using 5
+nod using flood 1
+nod using rmsp 1
+nod util 1
+nod v1 1
+nod v2 1
+nod v4 1
+nod valu 1
+nod verif 1
+nod wa dram 1
+nod wait 2
+nod wak 1
+nod wakeup 1
+nod wakeup pkt 1
+nod weight 3
+nod weight nw 1
+nod weight vect 1
+nod wer arbitr 1
+nod wer respect 1
+nod wh 1
+nod wh behavior 1
+nod wh operand 1
+nod when found 1
+nod when n3 1
+nod whenever equ 1
+nod which approxim 1
+nod which caus 1
+nod which correspon 1
+nod which induc 1
+nod which lead 2
+nod which prev 1
+nod which rec 1
+nod which receiv 1
+nod which refer 1
+nod which request 1
+nod which wish 1
+nod whit 1
+nod wil attempt 1
+nod wil div 1
+nod wil execut 1
+nod wil incr 1
+nod wil lik 1
+nod wil rec 1
+nod wil simultan 1
+nod wil tak 1
+nod with exc 1
+nod with fic 2
+nod with hardwar 1
+nod with highest 1
+nod with ident 1
+nod with larger 1
+nod with level 1
+nod with low 1
+nod with non 1
+nod with pack 1
+nod with particl 1
+nod with proc 1
+nod with tim 1
+nod work 1
+nod would po 1
+nod.2 1
+nod.2 we disc 1
+nod1 1
+nod2 1
+nod3 1
+nod3 fs0 1
+nod3 is reconstruc 1
+nod4 1
+nodeand 1
+nodeand edg 1
+nodeand edg weight 1
+nodeb 1
+nodeb of cl 1
+nodeclassdefinit 1
+nodeclassdefinit nodeclusterdefinit 1
+nodeclassdefinit nodeclusterdefinit nodedefinit 1
+nodeclusterdefinit 1
+nodeclusterdefinit nodedefinit 1
+nodeclusterdefinit nodedefinit linkclassdefinit 1
+nodecomput 1
+nodecomput nod 1
+nodedefinit 1
+nodedefinit linkclassdefinit 1
+nodedefinit linkclassdefinit linkdefinit 1
+nodeg 1
+nodeproc 1
+nodeproc pair 1
+nodesepar 1
+nodesj 1
+nodesj proc 1
+nodesj proc unit 1
+nodetyp 1
+nodetyp fe 1
+nodetypeb 1
+nodewhich 1
+nodewhich is actu 1
+noem 1
+noem rodriguez 1
+noer 1
+noether 1
+noeud 3
+noeud compr 1
+noeud de 3
+noeud de calcl 1
+noeud de la 1
+noeud de larbr 1
+noeud de tomber 1
+noeud de trait 1
+noeud destinatair 1
+noeud destinatair env 1
+noeud destinatair pour 1
+noeud echang 1
+noeud etendr 1
+noeud etiqu 1
+noeud evalu 1
+noeud evalu le 1
+noeud ex 1
+noeud ex ecut 1
+noeud identiqu 1
+noeud identiqu rel 1
+noeud la 1
+noeud la es 1
+noeud mi 1
+noeud perm 1
+noeud quon 1
+noeud quon peut 1
+noeud se 1
+noeud se fait 1
+noeud sont 1
+noeud sont rel 1
+noeud syst 1
+noeud syst em 1
+noeud system 1
+noeud util 1
+noeud util es 1
+nof 1
+nogood 1
+nol 1
+nolt 1
+nom 4
+nom de 3
+nom de champ 1
+nom de cylindr 1
+nom de entit 1
+nom de lext 1
+nom de matr 1
+nom du 1
+nom du foncteur 1
+nom est 1
+nom est de 1
+nom form 1
+nom humain 1
+nombr 7
+nombr accru 1
+nombr accru de 1
+nombr al 1
+nombr al eatoir 1
+nombr alarm 1
+nombr alarm de 1
+nombr consid 1
+nombr consid rabl 1
+nombr correspon 1
+nombr correspon de 1
+nombr cour 1
+nombr cour de 1
+nombr d ecritur 1
+nombr d el 1
+nombr d ev 1
+nombr dacc 2
+nombr dacc es 2
+nombr daller 1
+nombr daller retour 1
+nombr dappl 1
+nombr dappl sont 1
+nombr dargum 1
+nombr dargum sauvegard 1
+nombr de 5
+nombr de but 1
+nombr de ca 1
+nombr de ce 1
+nombr de cel 1
+nombr de ch 1
+nombr de claus 1
+nombr de colon 1
+nombr de commun 1
+nombr de configur 1
+nombr de conflit 1
+nombr de contraint 1
+nombr de conv 1
+nombr de cop 1
+nombr de difficult 1
+nombr de faux 1
+nombr de fo 1
+nombr de fonct 1
+nombr de individus 1
+nombr de lecteur 1
+nombr de librair 1
+nombr de mi 1
+nombr de migr 1
+nombr de modl 1
+nombr de mouv 1
+nombr de no 1
+nombr de noeud 1
+nombr de pag 1
+nombr de param 3
+nombr de point 2
+nombr de posit 1
+nombr de primitiv 1
+nombr de probl 1
+nombr de processeur 2
+nombr de program 2
+nombr de proposit 1
+nombr de register 1
+nombr de retour 1
+nombr de sch 1
+nombr de solut 2
+nombr de surc 1
+nombr de synchron 1
+nombr de syst 1
+nombr de tel 1
+nombr de test 2
+nombr de tir 1
+nombr de valeur 1
+nombr de var 1
+nombr de variabl 2
+nombr de vecteur 1
+nombr de ver 1
+nombr dentr 1
+nombr dentr eux 1
+nombr denviron 1
+nombr derreur 1
+nombr dic 1
+nombr dic ecut 1
+nombr din 1
+nombr din egalit 1
+nombr dindirect 1
+nombr dindirect en 1
+nombr dinst 1
+nombr dinst de 1
+nombr dinv 1
+nombr dit 2
+nombr dit erat 2
+nombr doccur 1
+nombr doccur de 1
+nombr dop 1
+nombr dop rat 1
+nombr ent 2
+nombr ent don 1
+nombr ent ou 1
+nombr equit 1
+nombr equit dit 1
+nombr est 2
+nombr est egal 1
+nombr et la 1
+nombr et nous 1
+nombr exact 1
+nombr exact de 1
+nombr exp 1
+nombr exp erim 1
+nombr fin 2
+nombr fin de 1
+nombr glob 1
+nombr glob de 1
+nombr import de 2
+nombr inf 1
+nombr inf erieur 1
+nombr lim 1
+nombr maxim 2
+nombr maxim de 2
+nombr minim 1
+nombr minim de 1
+nombr moy 2
+nombr moy de 2
+nombr ne 1
+nombr ne perm 1
+nombr peut 1
+nombr peut etr 1
+nombr positif 1
+nombr r eel 2
+nombr r el 1
+nombr repr 1
+nombr repr esent 1
+nombr tot 3
+nombr tot de 2
+nombr tot dic 1
+nombr tot rest 1
+nombr var 1
+nombr var de 1
+nombreus 5
+nombreus appl 2
+nombreus appl util 1
+nombreus autr 1
+nombreus autr person 1
+nombreus contribut 1
+nombreus contribut ont 1
+nombreus conver 1
+nombreus conver qu 1
+nombreus diff 1
+nombreus diff er 1
+nombreus etud 1
+nombreus etud ont 1
+nombreus ext 1
+nombreus ext voient 1
+nombreus faus 1
+nombreus m ethod 1
+nombreus mi 1
+nombreus mi en 1
+nombreus observ 1
+nombreus observ suppl 1
+nombreus recherch 1
+nombreus tent 1
+nombreus tent de 1
+nombreus var 2
+nombreus var de 2
+nombreus var sont 1
+nombreus ver 1
+nombreus ver de 1
+nombreux 4
+nombreux ca 1
+nombreux ca ce 1
+nombreux conflit 1
+nombreux d velop 1
+nombreux domain 1
+nombreux effort 1
+nombreux effort ont 1
+nombreux effort rest 1
+nombreux n ecessair 1
+nombreux point 2
+nombreux point de 1
+nombreux point rest 1
+nombreux probl 1
+nombreux probl me 1
+nombreux qu 1
+nombreux qu le 1
+nombreux r sultat 1
+nombreux register 1
+nombreux register mach 1
+nombreux syst 1
+nombreux syst em 1
+nomin 4
+nomin and continu 1
+nomin and preposit 1
+nomin attribut 1
+nomin frequ 1
+nomin group 1
+non 96
+non a lec 1
+non a un 1
+non adapt 2
+non adapt filter 1
+non adapt strateg 1
+non adjac 3
+non adjac tetrahedr 1
+non adjac ver 1
+non aff 1
+non aff constraint 1
+non agr 1
+non ambigu 1
+non ambigu match 1
+non atom 2
+non atom abstract 1
+non atom memor 1
+non atom oper 1
+non atom read 1
+non atom variabl 1
+non au 1
+non au cour 1
+non aux 1
+non aux lim 1
+non aux point 1
+non avail 1
+non bi 1
+non bi es 1
+non bin 1
+non bin dec 1
+non bin output 1
+non binair 1
+non binair est 1
+non block 5
+non block commun 2
+non block cop 1
+non block network 1
+non block shar 1
+non block switch 1
+non boolean 1
+non boolean constraint 1
+non boolean finit 1
+non bus 1
+non bus interconnect 1
+non cach 1
+non chang 1
+non chang part 1
+non claus 1
+non claus proposit 1
+non coinc 1
+non coinc triangl 1
+non compact 1
+non compact se 1
+non composit 1
+non composit part 1
+non computerb 1
+non computerb work 1
+non concur 1
+non conflictuel 2
+non conflictuel aux 1
+non conflictuel est 1
+non conflictuel moin 1
+non congru 1
+non congru lambd 1
+non const 3
+non const amount 1
+non const valu 1
+non continu 1
+non continu error 1
+non continu sign 1
+non convec 3
+non convec ar 1
+non convec com 1
+non convec se 1
+non convexit 1
+non convext 1
+non convext imag 1
+non corrupt 1
+non corrupt proc 1
+non cut 1
+non d efin 1
+non d eterm 2
+non d etermin 2
+non de 1
+non de son 1
+non decl 1
+non decl effort 1
+non decomp 1
+non decomp norm 1
+non decr 4
+non decr funct 1
+non decr order 1
+non decr search 1
+non decr weight 1
+non default 2
+non default constraint 1
+non defin 1
+non defin form 1
+non degener 1
+non denumer 1
+non denumer model 1
+non desc 2
+non desc order 1
+non destruc 1
+non destruc handl 1
+non determ 6
+non determ allow 1
+non determ inh 1
+non determ turn 1
+non determin 5
+non determin algorithm 1
+non determin ch 1
+non determin cl 1
+non determin counterpart 1
+non determin mach 1
+non determin natur 1
+non determin network 1
+non determin polynom 1
+non determin sampl 1
+non determin union 1
+non disciplin 1
+non discr 1
+non discr sobolev 1
+non distingu 1
+non distingu point 1
+non domin 1
+non dur 1
+non dur subtransact 1
+non dynam 1
+non dynam problem 1
+non ec 1
+non ec method 1
+non el 1
+non empt 14
+non empt cl 1
+non empt domain 1
+non empt fam 2
+non empt finit 1
+non empt intersect 2
+non empt part 1
+non empt polyhedr 1
+non empt reg 1
+non empt se 4
+non empt string 1
+non empt tr 1
+non empt typ 1
+non encor 1
+non encor init 1
+non encor visit 1
+non ent 1
+non ent er 1
+non ent.nous 1
+non ent.nous pr 1
+non er 1
+non er rl 1
+non error 1
+non error me 1
+non es 1
+non es ch 1
+non european 1
+non european countr 1
+non evalu 1
+non evalu funct 1
+non exclus 1
+non exclus sub 1
+non exhaustiv 1
+non exhaustiv de 1
+non exploit 1
+non exploit es 1
+non extrem 1
+non extrem ca 1
+non fail 3
+non fail leav 1
+non fail member 1
+non fail proc 2
+non fault 2
+non fault link 1
+non fault path 1
+non fault prim 1
+non fault proc 1
+non fault server 1
+non fin 1
+non fin st 1
+non first norm 1
+non fl 1
+non fl nod 1
+non funct 2
+non funct requir 1
+non gaus 1
+non glob 1
+non graph 1
+non graph appl 1
+non gsm 1
+non gsm satisf 1
+non halt 1
+non halt program 1
+non herm 1
+non herm system 1
+non hierarch 1
+non hom 2
+non hom list 1
+non hom tupl 1
+non idempot 1
+non idempot oper 1
+non identioabl 1
+non identioabl en 1
+non imag 1
+non imag cl 1
+non impl 1
+non increm 2
+non increm search 1
+non inform 1
+non inject 1
+non input 1
+non input nod 1
+non integer 1
+non integer ca 1
+non integr 1
+non interest 1
+non interest polygon 1
+non interpr 1
+non intersect 1
+non intersect hyperplan 1
+non is giv 1
+non isol 1
+non isol simpl 1
+non l clr 1
+non le 1
+non le param 1
+non leaf 3
+non leaf level 1
+non leaf nod 3
+non leaf port 1
+non learn 1
+non left lin 1
+non li 1
+non li ee 1
+non lin 6
+non lin correl 1
+non lin equ 1
+non lin estim 1
+non lin interact 1
+non lin problem 1
+non lin rank 1
+non lin subscript 1
+non lin transform 1
+non list 1
+non list term 1
+non loc 7
+non loc connect 1
+non loc dat 3
+non loc exit 1
+non loc fl 1
+non loc part 1
+non loc request 1
+non log 2
+non log parameter 1
+non log st 1
+non markov 1
+non markov environm 1
+non markov maz 1
+non mask 1
+non mask fault 1
+non master 1
+non master go 1
+non master proc 1
+non maxim 1
+non maxim span 1
+non mic 1
+non mic connect 1
+non mic fl 1
+non mic indirect 1
+non modif 1
+non modif traver 1
+non monot 1
+non monot issu 1
+non monot problem 1
+non n eg 1
+non n eglig 1
+non neg 11
+non neg doubl 1
+non neg fic 1
+non neg integer 2
+non neg number 1
+non neg quant 1
+non neg real 1
+non neg variabl 1
+non neg weight 1
+non neglig 1
+non neglig overhead 1
+non neur 1
+non neur network 1
+non ni 1
+non nil 1
+non nil valu 1
+non nl 6
+non nl argum 1
+non nl key 1
+non nl par 1
+non nl qu 1
+non nl rang 1
+non no 1
+non no border 1
+non no compl 1
+non norm 1
+non numer 1
+non numer program 1
+non object 2
+non object ent 1
+non object orient 1
+non observabl 1
+non observabl de 1
+non obtus 1
+non obtus angl 1
+non obtus triangl 1
+non oo 1
+non oo program 1
+non oo system 1
+non op 1
+non op erat 1
+non optim 3
+non optim architectur 1
+non optim se 1
+non optim solut 1
+non oracl 1
+non oracl branch 1
+non orient 1
+non output 1
+non output nod 1
+non overlap 6
+non overlap color 1
+non overlap con 1
+non overlap constraint 1
+non overlap reg 1
+non overlap se 1
+non overrid 1
+non overrid part 1
+non pa 3
+non pa dan 1
+non pa le 1
+non pa linver 1
+non pa lop 1
+non pa pour 1
+non pa un 1
+non par 1
+non par el 1
+non parallel 1
+non parallel overhead 1
+non parameter 3
+non parameter an 1
+non parameter sl1 1
+non parameter typ 1
+non parfait 1
+non parfait par 1
+non part 1
+non part de 1
+non partag 1
+non partag ee 1
+non pattern 1
+non plac 1
+non plac object 1
+non plus compat 1
+non plus convec 1
+non plus de 1
+non plus deff 1
+non plus simpl 1
+non plus sur 1
+non posit 1
+non posit const 1
+non preempt 1
+non preempt mod 1
+non prison 1
+non privil 1
+non privil eg 1
+non privileg 1
+non privileg client 1
+non profit 1
+non profit educ 1
+non prouv 1
+non prouv es 1
+non r ecursif 1
+non r ef 1
+non r egl 1
+non rectangl 1
+non rectangl object 1
+non recur 2
+non recur cal 1
+non redund 2
+non redund lin 1
+non reflect 1
+non reflect langu 1
+non reflect program 1
+non reflect show 1
+non reflectivepeinterpr 1
+non rel 1
+non rep 1
+non rep exper 1
+non repl 1
+non resourc 1
+non resourc model 1
+non rig 1
+non robust 1
+non rout 1
+non rout compon 1
+non s elect 1
+non scientif 1
+non scientif program 1
+non sel 3
+non sel cel 1
+non sel dan 2
+non sel la 1
+non sel veiller 1
+non self 2
+non self refer 2
+non shar 2
+non shar bind 1
+non shar dev 1
+non singl 2
+non singl er 1
+non singl matr 1
+non singl term 1
+non sol 1
+non sol connect 1
+non sourc 2
+non sourc candid 1
+non sourc me 1
+non sourc nod 1
+non spur 1
+non spur eigenvalu 1
+non standard 4
+non standard log 2
+non standard opt 1
+non standard slot 1
+non standard word 1
+non stat 1
+non strict 1
+non structur 2
+non structur inform 1
+non suff 1
+non suff pour 1
+non sunt 1
+non sunt multiplicand 1
+non surpr 1
+non symmeter 2
+non symmeter shap 1
+non synchron 1
+non syntaxdirect 1
+non syntaxdirect rl 1
+non tang 1
+non tang proper 1
+non techn 1
+non techn docum 1
+non termin 3
+non termin cal 1
+non termin comput 2
+non termin correspon 1
+non termin dan 1
+non termin de 1
+non termin en 1
+non termin ne 1
+non termin sont 1
+non text 1
+non text non 1
+non text reg 1
+non tim 1
+non tim var 1
+non to belief 1
+non tr 2
+non tr edg 2
+non tr neighbor 1
+non transit 1
+non transit vi 1
+non triv 11
+non triv ain 1
+non triv bridgeconnect 1
+non triv comput 1
+non triv condit 1
+non triv oper 1
+non triv problem 1
+non triv program 1
+non triv result 1
+non triv task 1
+non typ 1
+non un 1
+non un approxim 1
+non uniform 4
+non uniform acc 1
+non uniform distribut 1
+non uniform me. 1
+non uniform memor 1
+non unimodl 1
+non unimodl loop 1
+non unimodl transform 1
+non unimodulair 1
+non unimodulair ajout 1
+non unimodulair en 1
+non unimodulair ne 1
+non unimodulair nest 1
+non unimodulair perm 1
+non unit 1
+non unit claus 1
+non univer 1
+non univer search 1
+non v erif 1
+non vanish 2
+non vanish funct 1
+non vanish halt 1
+non var 2
+non var term 2
+non vid 1
+non vid avec 1
+non vid de 1
+non vid s 1
+non visit 1
+non visit neighbor 1
+non volatil 1
+non wam 1
+non work 1
+non work conserv 1
+non zer 6
+non zer assign 1
+non zer bi 1
+non zer const 1
+non zer init 1
+non zer matr 1
+non zer result 1
+non zer sect 1
+non zer vot 1
+non zn 1
+non zn tout 1
+non. 1
+nonadapt 1
+nonaff 1
+nonatom 1
+nonatom program 1
+nonb 1
+nonb network 1
+nonblock 4
+nonblock among tn 1
+nonblock and block 1
+nonblock configur 1
+nonblock graph 1
+nonblock graph con 1
+nonblock in theorem 1
+nonblock interconnect 1
+nonblock interconnect network 1
+nonblock manner 1
+nonblock multiconnect 1
+nonblock multiconnect network 1
+nonblock network 1
+nonblock network ensur 1
+nonblock network support 1
+nonblock network wh 1
+nonblock prim 1
+nonblock problem 1
+nonblock proper 1
+nonblock protocol 1
+nonblock protocol toler 1
+nonblock result 1
+nonblock shar 1
+nonblock shar memor 1
+nonblock stat 1
+nonblock stat nod 1
+nonblock sub 1
+nonblock to imp 1
+nonblock ver 1
+nonblock vs 1
+nonblock whil support 1
+nonboolean 1
+nonboolean domain 1
+nonbranch 1
+nonbranch nondirect 1
+nonbranch nondirect graph 1
+noncomputer 1
+noncomputer ba 1
+noncomputer ba problem 1
+nonconflu 1
+nonconflu part 1
+nonconflu part giv 1
+nonconflu red 1
+nonconflu rewrit 1
+nonconflu rewrit rl 1
+nonconflu rewrit system 1
+nonconflu rl 1
+nonconflu term 1
+nonconflu term rewrit 1
+noncontinu 1
+noncontinu condit 1
+noncoordin 1
+noncoordin subprogram 1
+noncoordin subprogram cal 1
+noncover 1
+noncover nod 1
+noncrossingbclimb 1
+noncrossingbdesc 1
+nondeterm 4
+nondeterm can break 1
+nondeterm is cancel 1
+nondeterm is nonconflu 1
+nondeterm is thus 1
+nondeterm of prolog 1
+nondeterm then occur 1
+nondetermin 11
+nondetermin behaviour 1
+nondetermin ch 3
+nondetermin ch valu 1
+nondetermin constraint 1
+nondetermin expon 1
+nondetermin expon tim 1
+nondetermin init 1
+nondetermin init valu 1
+nondetermin langu 1
+nondetermin oper 1
+nondetermin program 1
+nondetermin recur 1
+nondetermin recur program 1
+nondetermin reduc 1
+nondetermin rewrit 1
+nondetermin rewrit rl 1
+nondetermin server 1
+nondetermin to runtim 1
+nondetermin unif 1
+nondetermin world 1
+nondirect 1
+nondirect graph 1
+nonec 1
+nonempt 9
+nonempt buck 1
+nonempt buck remain 1
+nonempt disjoint 1
+nonempt disjoint sub 1
+nonempt domain 1
+nonempt intersect 1
+nonempt reduc 1
+nonempt se 3
+nonequiv 1
+nonequiv along pair 1
+nonequiv execut 1
+nonequiv execut trac 1
+nonequiv mor prec 1
+nonequiv succ 1
+nonequiv succ p4 1
+nonequiv.8 1
+nonequiv.8 a simpl 1
+noneth 2
+noneth th program 1
+nonexecut 2
+nonexecut init 1
+nonexecut init stat 1
+nonexecut rol 1
+nongrowth 1
+nonherm 1
+nonherm lin 1
+nonherm lin system 1
+nonid 1
+nonid but sem 1
+noninteract 1
+noninteract and lin 1
+nonintersect 1
+nonintersect part 1
+nonl 2
+nonleaf 1
+nonleaf nod 1
+nonlin 7
+nonlin architectur 1
+nonlin architectur affect 1
+nonlin autoregr 1
+nonlin autoregr model 1
+nonlin autoregr mov 1
+nonlin funct 2
+nonlin interpol 1
+nonlin map 2
+nonlin map funct 1
+nonlin method 1
+nonlin model 1
+nonlin oscil 1
+nonlin oscil assoc 1
+nonlin parameter 1
+nonlin parameter estim 1
+nonlin predict 1
+nonlin problem 1
+nonlin proc 1
+nonlin rl 1
+nonlin sign 1
+nonlin sign proc 1
+nonlin singl 1
+nonlin singl control 1
+nonlin singl system 1
+nonlin spac 1
+nonlin spac var 1
+nonlin spar 1
+nonlin spar model 1
+nonlin sub 1
+nonlin sub model 1
+nonlin system 2
+nonlin system identif 1
+nonlin tim 1
+nonlin tim ser 1
+nonlin ver 1
+nonlin wavel 1
+nonlin wavel method 1
+nonliner 1
+nonliner model 1
+nonloc 2
+nonloc connect 1
+nonloc connect request 1
+nonloc oper 1
+nonloc stat 1
+nonloc stat nod 1
+nonm 1
+nonm indirect 1
+nonm indirect fl 1
+nonmarkov 1
+nonmask 1
+nonmask toler 1
+nonmaster 1
+nonmaster proc 1
+nonmaster proc wait 1
+nonmeter 1
+nonmeter multidim 1
+nonmeter multidim scal 1
+nonmonot 2
+nonmonot and inter 1
+nonmonot constraint 1
+nonmonot constraint system 1
+nonmonot log 1
+nonmonot log valu 1
+nonmonot proper 1
+nonmonot proper giv 1
+nonmonot satisf 1
+nonmonot system 1
+nonneg 6
+nonneg integer 2
+nonneg integer n1 1
+nonneg integer t1 1
+nonneg random 1
+nonneg random var 1
+nonneg real valu 1
+nonneg t bound 1
+nonneg weight 1
+nonneg weight funct 1
+nonobsol 1
+nonobsol test 1
+nonoptim 1
+nonoptim perform 1
+nonoptim techniqu 1
+nonoracl 1
+nonoracl model 1
+nonpair 1
+nonpair t test 1
+nonparameter 1
+nonparameter method 1
+nonparameter stat 1
+nonparameter stat infer 1
+nonperiod 1
+nonperiod autocorrel 1
+nonperiod autocorrel funct 1
+nonpreemt 1
+nonpreemt prior 1
+nonrandom 1
+nonrandom forml 1
+nonrearrang 1
+nonrearrang nonblock 1
+nonrearrang nonblock network 1
+nonrecur 1
+nonrecur datalog 1
+nonrecur datalog not 1
+nonrecur datalog rl 1
+nonstandard 2
+nonstandard part 1
+nonstandard sem 1
+nonstandard sem describ 1
+nonstop 2
+nonstop kernel 1
+nonstop sql 1
+nonstrict 3
+nonstrict oper 1
+nonstrict subtyp 1
+nonstrict subtyp relationship 1
+nont 3
+nont donc 1
+nont donc aucun 1
+nont pa 3
+nont pa beaucoup 1
+nont pa cr 1
+nont pa de 1
+nont pa encor 1
+nont pa non 1
+nontang 1
+nontang proper 1
+nontang proper part 1
+nonterm 1
+nontermin 2
+nontermin symbol 1
+nontr 3
+nontr edg 2
+nontr neighbor 1
+nontr path 1
+nontr reducemac16 1
+nontransit 1
+nontransit scop 1
+nontriv 6
+nontriv cl 1
+nontriv improv 1
+nontriv oper 1
+nontriv pref 1
+nontriv pref x0 1
+nontriv subrout 1
+nontriv undertak 1
+nonun. 1
+nonunifom 1
+nonunifom walsh 1
+nonunifom walsh schem 1
+nonuniform 5
+nonuniform complec 1
+nonuniform counterpart 1
+nonuniform distribut 1
+nonuniform memor 1
+nonuniform memor acc 1
+nonvar 1
+nonzer 5
+nonzer el 1
+nonzer entr 1
+nonzer if splitter 1
+nonzer per column 1
+nonzer row 1
+nonzer structur 2
+nonzer task 1
+nonzer valu 1
+noonan 1
+noor 1
+nop 2
+nop 1g 1
+nop differ valu 1
+nop maxint 1
+nop probabil 1
+nop real valu 1
+nop variabl 1
+nord 1
+norfolk 2
+norm 63
+norm accelp 1
+norm act 2
+norm and chain 1
+norm and geometer 2
+norm and henc 1
+norm and rollback 1
+norm appl 1
+norm approach 1
+norm argum 1
+norm autocorrel 1
+norm autocorrel funct 1
+norm back link 1
+norm backtrack 1
+norm backtrack prolog 1
+norm bay 1
+norm bay method 1
+norm behaviour 1
+norm between numer 1
+norm bin 1
+norm bin resolut 1
+norm both sid 1
+norm by divid 1
+norm circumst 1
+norm com 2
+norm compl 1
+norm compl tim 1
+norm concur 1
+norm concur control 1
+norm condit 1
+norm connect 1
+norm connect uw 1
+norm control 1
+norm control loop 1
+norm criter 1
+norm dat 1
+norm dat commun 1
+norm dataflow 1
+norm dataflow principl 1
+norm de 1
+norm de herm 1
+norm de smith 1
+norm del 1
+norm del funct 1
+norm demand 2
+norm demand bandwidth 2
+norm dherm 1
+norm distribut 2
+norm du 1
+norm du vecteur 1
+norm e de 1
+norm e en 1
+norm e etait 1
+norm ee 2
+norm equiv 1
+norm es 1
+norm es gr 1
+norm est 1
+norm event 1
+norm execut 4
+norm execut tim 2
+norm fac 1
+norm fact 1
+norm fam 1
+norm fil 1
+norm for 1
+norm for datab 1
+norm for oper 1
+norm for system 1
+norm form 11
+norm form comput 1
+norm form condit 1
+norm form dat 1
+norm form describ 1
+norm form dnf 1
+norm form funct 1
+norm form iff 1
+norm form nam 1
+norm form obtain 1
+norm form proper 1
+norm form rel 1
+norm form result 1
+norm form tableaux 1
+norm form test 1
+norm form using 1
+norm form w.r.t 1
+norm funct 1
+norm funct appl 1
+norm guar 1
+norm guar oc 1
+norm hk 1
+norm interact 2
+norm lambd 1
+norm le 1
+norm le point 1
+norm leaf 1
+norm leav 1
+norm liter 1
+norm ma 1
+norm mean 1
+norm mean squar 1
+norm ms 1
+norm of b0 1
+norm of leaf 1
+norm of reduc 1
+norm of subexpr 1
+norm of typ 1
+norm oper 1
+norm oper log 1
+norm point 2
+norm point mut 1
+norm primitiv 1
+norm proc 1
+norm proc mod 1
+norm project 1
+norm prolog 1
+norm prolog claus 1
+norm prompt 1
+norm prompt strateg 1
+norm qu 1
+norm qu pouv 1
+norm rat 1
+norm reduc 1
+norm reg 1
+norm requir 2
+norm schedl 1
+norm schedl length 1
+norm separ 1
+norm separ procedur 1
+norm serv 1
+norm serv offer 1
+norm serv receiv 1
+norm step 1
+norm subtransact 1
+norm suff 1
+norm sup 3
+norm sup erieur 2
+norm sup rieur 1
+norm system 2
+norm system assum 1
+norm system oper 1
+norm tak 1
+norm th appl 1
+norm th argum 1
+norm th arv 1
+norm th control 1
+norm th integer 1
+norm to def 1
+norm together imp 1
+norm typ 1
+norm typ expr 1
+norm um 1
+norm um num 1
+norm us 1
+norm var 1
+norm vect 3
+norm vect comput 1
+norm vect shader 1
+norm with respect 1
+norm work 1
+norm wormhol 1
+norm wormhol switch 1
+norman 2
+norman wild 1
+nort 2
+north 24
+north carolin 1
+north east 1
+north holland 16
+north holland elsev 1
+north holland publ 2
+north west 1
+northeastern 2
+northholland 5
+northwest 1
+northwest softwar 1
+northwest softwar qu 1
+norwel 1
+nosolog 1
+nostrand 3
+nostrand reinhold 2
+not 119
+not a denot 1
+not a descript 1
+not a good 1
+not a le 1
+not a macr 1
+not accept 1
+not accompagn 1
+not accompagn ee 1
+not addit 1
+not addit implem 1
+not allow 1
+not alor 1
+not alor le 1
+not am elior 1
+not and cl 1
+not and known 1
+not and prerequisit 1
+not and stud 1
+not and terminolog 1
+not and using 1
+not any serv 1
+not as ar 1
+not as p.a1 1
+not au 1
+not au pa 1
+not aus 1
+not aus le 1
+not aus qu 1
+not aus quun 1
+not bien 1
+not bien qu 1
+not by sinclair 1
+not by sprung 1
+not by using 1
+not c1 1
+not caract 1
+not caract eristiqu 1
+not cep 2
+not cep qu 2
+not cep quil 1
+not chang 1
+not character 1
+not classif 1
+not cmac 1
+not cmac le 1
+not compl 1
+not compl es 1
+not conv 1
+not correspon 1
+not d ag 1
+not d elag 1
+not d le 1
+not d pgcd 1
+not d1 1
+not d1 d2 1
+not danciennet 1
+not de 4
+not de bruit 1
+not de cr 1
+not de direct 1
+not de droit 1
+not de gard 1
+not de group 1
+not de la 1
+not de localit 1
+not de moy 1
+not de pag 1
+not de par 1
+not de pav 1
+not de point 1
+not de propr 1
+not de sch 1
+not de sp 1
+not de statistiqu 1
+not de term 1
+not de tous 1
+not de transform 1
+not de var 1
+not de voisin 1
+not diag 1
+not du 2
+not du part 1
+not du th 1
+not earl 2
+not eff 1
+not eff reduc 1
+not egal 1
+not egal la 1
+not egal qu 1
+not ej 1
+not ej pn 1
+not enfin 1
+not enfin qu 1
+not entr 1
+not espec 1
+not et hypoth 1
+not even further 1
+not evolut 1
+not evolut dic 1
+not exampl 2
+not exampl inclus 1
+not except 3
+not fin 1
+not fin la 1
+not first intern 1
+not for babel 1
+not for list 1
+not for ordin 1
+not for quer 1
+not for refer 1
+not for siggraph 1
+not for simpl 1
+not form 1
+not frequ 1
+not from figur 1
+not h lappl 1
+not hemingw 1
+not hemingw attachm 1
+not illustr 1
+not in artif 1
+not in ba 1
+not in computer 17
+not in contrast 1
+not in eulisp 1
+not in math 2
+not in sect 1
+not incr 1
+not introduc 3
+not introduc prev 1
+not is abus 1
+not is introduc 1
+not is symmeter 1
+not j lenvelop 1
+not japan 1
+not k la 1
+not known 1
+not la 1
+not la project 1
+not lcj 1
+not le 1
+not le eff 1
+not le ki 1
+not le nombr 1
+not lsd 1
+not m rm 1
+not math 1
+not math matiqu 1
+not n eanmoin 1
+not ne 1
+not ne rentr 1
+not oe 2
+not oe ladr 1
+not of al 1
+not of appl 1
+not of appropr 1
+not of approxim 1
+not of behavior 1
+not of bi 1
+not of block 1
+not of candid 1
+not of closur 1
+not of commun 1
+not of con 1
+not of confid 1
+not of configur 1
+not of correct 1
+not of deduc 1
+not of deep 1
+not of dynam 2
+not of entailm 1
+not of evolut 1
+not of expect 1
+not of fal 1
+not of grandmother 1
+not of init 1
+not of interfac 1
+not of intersect 1
+not of kcm 1
+not of log 2
+not of minim 1
+not of modl 1
+not of observ 1
+not of overwrit 1
+not of parallel 2
+not of point 1
+not of polymorph 1
+not of power 1
+not of progr 1
+not of program 2
+not of reduc 1
+not of residu 1
+not of rewrit 1
+not of sect 1
+not of sld 1
+not of speedup 1
+not of spher 1
+not of structur 1
+not of styl 1
+not of task 1
+not of termin 1
+not of truth 1
+not of typ 1
+not of typecorrect 1
+not of user 1
+not of val 1
+not of weak 1
+not om 1
+not on damp 1
+not on datab 1
+not on step 1
+not p 2ln 1
+not p le 1
+not par 1
+not perform 1
+not perform enhanc 1
+not peut 1
+not peut tr 1
+not point 1
+not pr 2
+not pr ec 1
+not pr eliminair 1
+not puisqu 1
+not puisqu lon 1
+not q pour 1
+not qu 2
+not qu ce 2
+not qu dan 1
+not qu kcm 1
+not qu la 1
+not qu le 2
+not qu li 1
+not qu linstruc 1
+not qu lunif 1
+not qu notr 1
+not qu nous 1
+not qu prior 1
+not qu si 2
+not quen 1
+not quen pratiqu 1
+not quil 1
+not quil est 1
+not quil nest 1
+not quinvalider 1
+not quinvalider superficiel 1
+not quun 1
+not quun trait 1
+not r son 1
+not remark 1
+not satisf 1
+not se 1
+not se retrouv 1
+not simil 1
+not simpl 1
+not simpl de 1
+not suiv 2
+not t le 1
+not techniqu 1
+not techniqu originel 1
+not th 1
+not th chang 1
+not th differ 1
+not th ext 1
+not th fact 1
+not th issu 1
+not th lo 1
+not th logarithm 1
+not th model 1
+not th mult 1
+not th oriqu 1
+not th proc 1
+not th run 1
+not th sem 1
+not th spik 1
+not th susp 1
+not th system 1
+not th term 1
+not th var 1
+not th viol 1
+not that 4ep2 1
+not that accept 1
+not that aik 1
+not that b0 1
+not that blank 1
+not that bool 1
+not that cal 1
+not that chang 1
+not that charg 1
+not that coar 1
+not that commun 1
+not that compon 1
+not that condit 1
+not that contextu 1
+not that cor 1
+not that crash 1
+not that d1 1
+not that decomposit 1
+not that deliver 1
+not that dep 1
+not that dim 1
+not that e0j 1
+not that ec 1
+not that eq 1
+not that eventu 1
+not that evolut 1
+not that expr 1
+not that fd 1
+not that figur 1
+not that firstp 1
+not that funct 1
+not that g0 1
+not that gd 1
+not that gener 1
+not that h0 1
+not that higherorder 1
+not that hyperedg 1
+not that increm 1
+not that integer 1
+not that isol 1
+not that kn 1
+not that le 1
+not that lem 1
+not that lm 1
+not that loc 1
+not that m1 1
+not that mcgrath 1
+not that me 2
+not that mod 1
+not that model 1
+not that msld 1
+not that nab 1
+not that nod 2
+not that norm 1
+not that oe1 1
+not that oper 1
+not that optim 1
+not that path 1
+not that pb4 1
+not that ph 1
+not that proc 1
+not that r1 1
+not that repetit 1
+not that robust 1
+not that s1 1
+not that sc 1
+not that schedl 1
+not that shadow 1
+not that shannon 1
+not that slb 1
+not that sub 1
+not that tcol 1
+not that tdbm 1
+not that tempor 1
+not that theorem 2
+not that thread 1
+not that tot 1
+not that typ 2
+not that v002 1
+not that v02 1
+not that v1 1
+not that valu 2
+not that var 1
+not that ver 1
+not that x1 1
+not to decoupl 1
+not to draw 1
+not to refer 1
+not to repr 1
+not tout 1
+not tout dabord 1
+not toutef 1
+not toutef quil 1
+not user 1
+not using 1
+not util 1
+not util es 1
+not vol.22 1
+not vol.22 nb.7 1
+not vol.30 1
+not wa put 1
+not we develop 1
+not we forml 1
+not we start 1
+not we stud 1
+not with tomcatv 1
+notabl 2
+notabl de 1
+notabl de perform 1
+notabl le 1
+notabl le retour 1
+notabl ont 1
+notabl ont aus 1
+notabl plus rap 1
+notam 4
+notam au 1
+notam au niveau 1
+notam dan 1
+notam dan le 1
+notam dappr 1
+notam dappr ec 1
+notam de 1
+notam dominiqu 1
+notam dominiqu henr 1
+notam du 1
+notam du syst 1
+notam en 1
+notam en ca 1
+notam la 2
+notam la complexit 1
+notam lagc 1
+notam le 1
+notam le besoin 1
+notam lor 1
+notam lor de 1
+notam par 1
+notam par an 1
+notam pour 1
+notam pour le 1
+notam un autr 1
+notam util 1
+notam util ee 1
+notent 1
+notent respectiv 1
+notent respectiv le 1
+notequ 1
+notequ rel 1
+notequ rel instead 1
+noter 3
+noter ce 1
+noter le 1
+noter le deux 1
+noter qu 2
+noter qu ce 1
+noter qu la 1
+noter qu larchitectur 1
+noter qu le 1
+noter qu quel 1
+noter quen 1
+noter quen lab 1
+noter quil 1
+noter quil nec 1
+noter quil nen 1
+noter t 2r 1
+noteron 2
+noteron ce 1
+noteron ce champ 1
+noteron enfin 1
+noteron respectivementntot 1
+noteworth 1
+notg 1
+noth 1
+noth holland 1
+nothingham 1
+notif 13
+notif al object 1
+notif and multicast 1
+notif cpu 1
+notif is broadcast 1
+notif it reif 1
+notif nod 1
+notif other 1
+notif sent 1
+notif th host 1
+notif th kcm 1
+notkin 2
+notoir 1
+notoir un probl 1
+notor 2
+notor failur 1
+notor tur 1
+notor tur test 1
+notr 5
+notr adapt 1
+notr algorithm 1
+notr algorithm avec 1
+notr an 1
+notr an quun 1
+notr approch 1
+notr av 1
+notr but est 1
+notr ca 2
+notr ca le 1
+notr ca par 2
+notr cadr 2
+notr cadr algorithmiqu 1
+notr classif 2
+notr classif de 1
+notr classif temporair 1
+notr cod 1
+notr cod qu 1
+notr con 2
+notr con la 1
+notr con le 1
+notr contribut 1
+notr contribut personnel 1
+notr courb 1
+notr courb avec 1
+notr cr 1
+notr cr dit 1
+notr d ecoup 1
+notr d efinit 1
+notr dam 1
+notr descript 1
+notr disposit 2
+notr disposit de 1
+notr disposit le 1
+notr disposit lor 1
+notr espac 1
+notr espac de 1
+notr estim 1
+notr estim th 1
+notr etud 2
+notr etud du 1
+notr etud puisquil 1
+notr exempl 1
+notr exempl en 1
+notr exp 2
+notr exp er 2
+notr g en 1
+notr m es 1
+notr m ethod 1
+notr mod 2
+notr mod el 2
+notr not 1
+notr not de 1
+notr objectif 1
+notr objectif est 1
+notr point 1
+notr point de 1
+notr port 1
+notr port ee 1
+notr pr 1
+notr pr dict 1
+notr prem 1
+notr probl 2
+notr probl em 2
+notr sav ch 1
+notr sch 1
+notr sch em 1
+notr souhait 1
+notr souhait le 1
+notr sp 1
+notr sp ecif 1
+notr techniqu 1
+notr techniqu appliqu 1
+notr techniqu qu 1
+notr techniqu sur 1
+notr th 1
+notr th or 1
+notr transform 1
+notr transform seront 1
+notr ver 1
+notr ver de 1
+noun 2
+noun and verb 1
+noun lik kilimanjar 1
+noun phr 2
+nour 1
+nour omid 1
+nous 8
+nous a amen 1
+nous a conduit 1
+nous a convaincu 1
+nous a perm 2
+nous a serv 1
+nous adopt 1
+nous adopt lapproch 1
+nous ajout 1
+nous allon 2
+nous allon dabord 1
+nous allon dan 1
+nous allon distinguer 1
+nous allon donc 1
+nous allon illustrer 1
+nous allon le 1
+nous allon maint 2
+nous allon montrer 1
+nous allon nous 1
+nous allon pr 1
+nous allon utiliser 1
+nous allon voir 1
+nous am elioron 1
+nous am ne 1
+nous analyson 1
+nous appelleron 1
+nous appelleron ce 1
+nous appelleron dor 1
+nous appelleron point 1
+nous appelleron tr 1
+nous appelleron un 1
+nous appelon 3
+nous appelon cart 1
+nous appelon desc 1
+nous appelon par 1
+nous appelon syst 1
+nous appliquon 2
+nous appliquon au 1
+nous appliquon dan 1
+nous appliquon maint 1
+nous appliquon un 1
+nous apport 1
+nous apport de 1
+nous aux 1
+nous avon 5
+nous avon abord 1
+nous avon adopt 1
+nous avon assoc 1
+nous avon aus 1
+nous avon bien 1
+nous avon ch 2
+nous avon cherch 2
+nous avon compl 1
+nous avon conclu 1
+nous avon dan 1
+nous avon de 1
+nous avon dit 1
+nous avon donc 1
+nous avon effectu 1
+nous avon egal 1
+nous avon entrepr 1
+nous avon eoeectu 1
+nous avon etud 2
+nous avon exp 2
+nous avon fait 1
+nous avon fourn 1
+nous avon ignor 1
+nous avon implanter 1
+nous avon introduit 1
+nous avon ment 1
+nous avon mesur 1
+nous avon mi 1
+nous avon montr 2
+nous avon pr 4
+nous avon prop 3
+nous avon pu 1
+nous avon soulign 2
+nous avon sup 2
+nous avon tent 1
+nous avon tout 1
+nous avon trait 1
+nous avon util 2
+nous avon vu 3
+nous calculon 1
+nous calculon dan 1
+nous chantillonnon 1
+nous chantillonnon notr 1
+nous chercheron 1
+nous cherchon 1
+nous codon 1
+nous com 2
+nous com ceron 1
+nous com con 2
+nous commenceron 1
+nous commenceron par 1
+nous comparon 1
+nous comparon le 1
+nous concentreron 1
+nous concentreron sur 1
+nous concentron 1
+nous concentron sur 1
+nous concern 2
+nous concern aucun 1
+nous concern cest 1
+nous concern dan 1
+nous concerner 1
+nous concerner dan 1
+nous conduit 2
+nous conduit au 1
+nous conformeron 1
+nous conformeron pa 1
+nous conjecturon 1
+nous conjecturon qu 1
+nous conseillon 1
+nous conseillon fort 1
+nous consid 5
+nous consid ereron 1
+nous consid eron 3
+nous consid ron 1
+nous construison 2
+nous construison de 1
+nous construison sur 1
+nous construison un 1
+nous contenteron 1
+nous contenteron dan 1
+nous contenteron de 1
+nous contenteron donc 1
+nous continueron 1
+nous continueron dappeler 1
+nous d ecriron 1
+nous d ecrivon 2
+nous d erivon 1
+nous d etermineron 1
+nous d eveloppon 1
+nous d veloppon 1
+nous devon 1
+nous devon maint 1
+nous diron 1
+nous diron de 1
+nous diron destructiv 1
+nous diron qu 1
+nous distinguon 1
+nous distinguon quatr 1
+nous don 1
+nous don un 1
+nous donnon 2
+nous donnon ci 1
+nous donnon dan 1
+nous donnon egal 1
+nous donnon le 1
+nous effectuon 1
+nous effectuon dan 1
+nous effor 1
+nous effor con 1
+nous emploieron 1
+nous emploieron la 1
+nous entendon 2
+nous entendon la 1
+nous entrevoyon 1
+nous entrevoyon deux 1
+nous esp 2
+nous esp eron 2
+nous est 1
+nous est ain 1
+nous etud 1
+nous etud peut 1
+nous etud sont 1
+nous etudieron 1
+nous etudieron seront 1
+nous evalueron 1
+nous evalueron no 1
+nous ex 1
+nous ex ecut 1
+nous exploit 1
+nous exploit la 1
+nous exploiteron 1
+nous exploiteron dan 1
+nous exposon 1
+nous exposon par 1
+nous faison 2
+nous faison en 1
+nous faison ic 1
+nous faison le 1
+nous faut 1
+nous faut distinguer 1
+nous fixon 1
+nous fixon pour 1
+nous fournisson 2
+nous fournisson au 1
+nous fournisson un 1
+nous garderon 1
+nous garderon la 1
+nous ignoreron 1
+nous ignoreron aus 1
+nous ignoreron la 1
+nous illustreron 1
+nous illustreron ce 1
+nous illustron 2
+nous illustron avec 1
+nous imp 1
+nous imp qu 1
+nous imposon 1
+nous imposon en 1
+nous in 1
+nous in sur 1
+nous indiqu 1
+nous indiqu qu 1
+nous insisteron 1
+nous insisteron sur 1
+nous int 3
+nous int er 1
+nous int eresser 1
+nous int eresseron 1
+nous int eresson 1
+nous int re 1
+nous int resson 1
+nous introduison 1
+nous introduison pour 1
+nous la 1
+nous la laisson 1
+nous lavon 1
+nous lavon sign 1
+nous lavon vu 1
+nous le 3
+nous le utilison 1
+nous le verron 3
+nous lim 2
+nous lim au 1
+nous lim dan 1
+nous limiteron 2
+nous limiteron dan 1
+nous limiteron donc 1
+nous limposeron 1
+nous lindiqu 1
+nous lindiqu la 1
+nous lindiqu le 1
+nous m ne 1
+nous ma 1
+nous ma itrison 1
+nous maint 1
+nous maint au 1
+nous montr 1
+nous montr succinct 1
+nous montreron 1
+nous montreron au 1
+nous montron 3
+nous montron au 1
+nous montron com 3
+nous montron dan 1
+nous montron ic 1
+nous montron tout 1
+nous n egligeon 1
+nous n etudieron 1
+nous naborderon 1
+nous naborderon ni 1
+nous naborderon pa 1
+nous navon 2
+nous navon besoin 1
+nous navon cherch 1
+nous navon pa 1
+nous navon pour 1
+nous ne 4
+nous ne cherchon 1
+nous ne connaisson 2
+nous ne nous 3
+nous ne partitionnon 1
+nous ne pouvon 1
+nous ne rentreron 1
+nous ne savon 1
+nous not 1
+nous not par 1
+nous noteron 2
+nous noteron ce 1
+nous noteron enfin 1
+nous noteron respectivementntot 1
+nous nous 3
+nous nous concentreron 1
+nous nous concentron 1
+nous nous contenteron 1
+nous nous effor 1
+nous nous fixon 1
+nous nous imposon 1
+nous nous int 2
+nous nous lim 2
+nous nous limiteron 2
+nous nous limposeron 1
+nous nous proposon 1
+nous nous restreignon 1
+nous nous som 2
+nous oblig 1
+nous oblig com 1
+nous offr 1
+nous ont 1
+nous ont perm 1
+nous organison 1
+nous organison ce 1
+nous par 4
+nous par int 1
+nous partageon 1
+nous partageon la 1
+nous penson 2
+nous penson qu 2
+nous penson quil 1
+nous perm 4
+nous perm alor 1
+nous perm de 2
+nous perm destimer 1
+nous perm didentif 2
+nous perm dillustrer 2
+nous perm donc 1
+nous permettr 1
+nous permettr de 1
+nous permettr den 1
+nous pouvon 2
+nous pouvon ain 1
+nous pouvon citer 1
+nous pouvon conclur 1
+nous pouvon donc 1
+nous pouvon maint 1
+nous pouvon surestimer 1
+nous pr 6
+nous pr ecison 1
+nous pr econison 1
+nous pr ef 1
+nous pr eoccup 2
+nous pr esent 5
+nous pr esenteron 1
+nous prenon 1
+nous prenon con 1
+nous proposon 4
+nous proposon alor 1
+nous proposon au 1
+nous proposon aux 1
+nous proposon cherch 1
+nous proposon dan 2
+nous proposon de 1
+nous proposon donc 1
+nous proposon dun 1
+nous proposon dutiliser 1
+nous proposon en 1
+nous proposon est 1
+nous proposon ic 1
+nous proposon maint 1
+nous proposon nest 1
+nous proposon peut 1
+nous proposon peuv 1
+nous proposon pour 1
+nous proposon pren 1
+nous proposon un 3
+nous qualioeron 1
+nous qualioeron de 1
+nous r esumon 1
+nous r sumon 1
+nous ram 1
+nous ram en 1
+nous ramener 1
+nous rappelon 2
+nous rappelon le 2
+nous rappelon qu 1
+nous remarquon 1
+nous remarquon qu 1
+nous renfor 1
+nous renfor con 1
+nous repl 1
+nous repl on 1
+nous reprenon 1
+nous reprenon ic 1
+nous rest 2
+nous restreignon 2
+nous restreignon au 1
+nous restreignon dan 1
+nous restreignon en 1
+nous restreindr 1
+nous restreindr au 1
+nous retiendr 1
+nous retiendr qu 1
+nous reviendr 2
+nous reviendr sur 2
+nous sembl 5
+nous sembl dioecil 1
+nous sembl la 1
+nous sembl le 1
+nous sembl pa 1
+nous sembl prometteur 1
+nous sembl tr 1
+nous ser 1
+nous ser tr 1
+nous ser util 1
+nous seron 1
+nous seron ain 1
+nous seron en 1
+nous serviront 1
+nous serviront de 1
+nous som 4
+nous som cep 1
+nous som concentr 1
+nous som cont 2
+nous som donc 1
+nous som en 1
+nous som maint 1
+nous som pa 1
+nous som restreint 1
+nous souhait 1
+nous souhait quun 1
+nous soulignon 1
+nous soulignon quand 1
+nous supposeron 2
+nous supposeron aus 1
+nous supposeron dan 1
+nous supposeron qu 2
+nous supposon 4
+nous supposon en 1
+nous supposon la 1
+nous supposon qu 1
+nous supposon savoir 1
+nous supposon toujour 1
+nous tenon 1
+nous tenteron 1
+nous termineron 1
+nous termineron ce 1
+nous terminon 1
+nous terminon par 1
+nous tiendront 1
+nous tiendront lieu 1
+nous tout 1
+nous tout dabord 1
+nous tud 1
+nous tud actuel 1
+nous tud donc 1
+nous utiliseron 3
+nous utiliseron dan 1
+nous utiliseron de 1
+nous utiliseron egal 2
+nous utiliseron ic 1
+nous utilison 2
+nous utilison ce 1
+nous utilison dan 1
+nous utilison ic 1
+nous utilison le 1
+nous utilison pour 1
+nous utilison un 2
+nous veilleron 1
+nous veillon 1
+nous venon 3
+nous venon de 3
+nous verron 1
+nous verron au 1
+nous verron dan 1
+nous verron de 1
+nous verron qu 1
+nous voul 1
+nous voyon 1
+nous y reviendr 1
+nouveau 5
+nouveau but cour 1
+nouveau champ 1
+nouveau champ cutpt 1
+nouveau champ de 1
+nouveau de 1
+nouveau de pseud 1
+nouveau domain 1
+nouveau domain dit 1
+nouveau drapeau 1
+nouveau m dicam 1
+nouveau marqu 1
+nouveau marqu mk 1
+nouveau mod 1
+nouveau mod dadr 1
+nouveau n ecessair 1
+nouveau nid 1
+nouveau nid de 1
+nouveau op 1
+nouveau op erateur 1
+nouveau patron 1
+nouveau point 2
+nouveau point de 1
+nouveau propr 1
+nouveau propr etair 1
+nouveau pseud 1
+nouveau pseud pr 1
+nouveau register 1
+nouveau register bp 1
+nouveau register don 1
+nouveau som 1
+nouveau som de 1
+nouveau syst 1
+nouveau syst em 1
+nouveau term 1
+nouveau term comp 1
+nouveau typ 1
+nouveau typ de 1
+nouveau util 1
+nouveau util ee 1
+nouveau vecteur 2
+nouveau vecteur dit 1
+nouveau vecteur est 1
+nouveaut 1
+nouveaut e dan 1
+nouveaux 3
+nouveaux algorithm 1
+nouveaux algorithm destin 1
+nouveaux individus 1
+nouveaux individus enf 1
+nouveaux it erateur 1
+nouveaux register 1
+nouveaux term 1
+nouveaux term aux 1
+nouveaux vecteur 1
+nouveaux vecteur dit 1
+nouvel 5
+nouvel appel 1
+nouvel appl 2
+nouvel appl de 1
+nouvel approch 2
+nouvel approch de 2
+nouvel argum 1
+nouvel argum alt 1
+nouvel argum au 1
+nouvel argum doit 1
+nouvel argum en 1
+nouvel attribut 1
+nouvel attribut en 1
+nouvel attribut est 1
+nouvel aut 1
+nouvel ba 2
+nouvel ba de 2
+nouvel born 1
+nouvel born de 1
+nouvel boucl 1
+nouvel cel 1
+nouvel cel de 1
+nouvel claus 1
+nouvel claus doiv 1
+nouvel comp 1
+nouvel comp se 1
+nouvel configur 1
+nouvel configur par 1
+nouvel configur suiv 1
+nouvel cop 1
+nouvel cop avec 1
+nouvel coupur 1
+nouvel coupur glob 1
+nouvel cr 1
+nouvel direct 1
+nouvel direct de 1
+nouvel direct est 1
+nouvel don 1
+nouvel don ee 1
+nouvel echec 1
+nouvel eff 1
+nouvel eff de 1
+nouvel environ 1
+nouvel environ occup 1
+nouvel es 1
+nouvel es avec 1
+nouvel etat 1
+nouvel faibl 1
+nouvel faibl de 1
+nouvel famil 1
+nouvel famil dalgorithm 1
+nouvel famil dind 1
+nouvel fonct 1
+nouvel fonct de 1
+nouvel form 1
+nouvel form de 1
+nouvel g en 1
+nouvel indirect 1
+nouvel instruc 1
+nouvel instruc neck 1
+nouvel instruc trust 1
+nouvel it erat 1
+nouvel mi 1
+nouvel not 1
+nouvel not de 1
+nouvel op 2
+nouvel op erat 1
+nouvel op erateur 1
+nouvel particl 1
+nouvel particl de 1
+nouvel perspectiv 2
+nouvel perspectiv sur 1
+nouvel pil 1
+nouvel popl 1
+nouvel popl est 1
+nouvel prim 1
+nouvel primitiv 1
+nouvel proposit 1
+nouvel proposit se 1
+nouvel r ef 1
+nouvel r esolut 1
+nouvel structur 1
+nouvel structur de 1
+nouvel subst 1
+nouvel subst susceptibl 1
+nouvel tail 1
+nouvel tail de 1
+nouvel techniqu 1
+nouvel techniqu proch 1
+nouvel transform 1
+nouvel unif 1
+nouvel unif affect 1
+nouvel unif impliqu 1
+nouvel valeur 1
+nouvel valeur de 1
+nouvel var 1
+nouvel var gel 1
+nouvel var perman 1
+nouvel var pour 1
+nouvel ver 1
+nouvel ver de 1
+nouvelarg 1
+nov 15
+nov and exper 1
+nov computer 1
+nov computer programmer 1
+nov could start 1
+nov dec 1
+nov popl 1
+nov sv 1
+nov ten 1
+nov us 1
+nov user 1
+nov user know 1
+nov wer un 1
+nov93 1
+novateur 1
+novb 1
+novc 1
+novel 16
+novel abstract 1
+novel contribut 1
+novel corp 1
+novel ebg 1
+novel el 1
+novel environm 1
+novel inc 1
+novel increm 1
+novel increm selfimprov 1
+novel list 1
+novel list manag 1
+novel melod 1
+novel method 1
+novel multidim 1
+novel multidim interfac 1
+novel paradigm 1
+novel posthum 1
+novel posthum produc 1
+novel prob 1
+novel prob modif 1
+novel schedl 1
+novel schedl algorithm 1
+novel sit 1
+novel situ 1
+novel situ altern 1
+novel situ alternativerefut 1
+novel situ occur 1
+novel techniqu 2
+novel term 1
+novel term compr 1
+novel traff 1
+novel traff schedl 1
+novel var 1
+novel word 1
+novelsitu 1
+novelsitu direct 1
+novelt 2
+novelt and signif 1
+novelt pr 1
+november 34
+novembr 3
+now 1
+now cow 1
+nowad 1
+nowatzyk 2
+nowg 1
+nowg t0 1
+nowg t0 t1 1
+nowlan 1
+nowlan and g.e 1
+nowrit 1
+noy 3
+noy e par 1
+noyau 2
+noyau comport 1
+noyau comport tr 1
+noyau constitu 1
+noyau constitu ee 1
+noyau de 1
+noyau de lappl 1
+noyau du 1
+noyau du program 1
+noyau dun 1
+noyau dun program 1
+noyau dur 1
+noyau dur du 1
+noyau ker 1
+np 33
+np 1pi 1
+np a se 1
+np ad 1
+np ad ndp 1
+np ae 1
+np ae np 1
+np compl 15
+np compl column 1
+np compl np 1
+np compl problem 4
+np compl reduc 1
+np compl sect 1
+np complec 1
+np decr 1
+np el 1
+np fl 1
+np hard 1
+np hard optim 2
+np hard problem 3
+np head0 1
+np input 1
+np input valu 1
+np is obv 1
+np is triv 1
+np j1 1
+np log 2
+np log np 1
+np ns 1
+np ns p2 1
+np oe 1
+np pnp 1
+np pol 1
+np pol ae 1
+np repr 1
+np repr task 1
+np result 1
+np th 1
+np th el 1
+np valu 1
+np2 1
+np2 el 1
+np2 np 1
+np2 nsp 1
+np2 nsp 4p 1
+np2 s th 1
+np2 th 1
+npaf 1
+npag 1
+npb 2
+npb ce 1
+npb ce qu 1
+npb et nst 1
+npd 1
+npeak 1
+npeak nmac 1
+npg 1
+npg el 1
+nplin 1
+nplin de 1
+nplin de meer 1
+nplin result 1
+npn 2
+npn pn 1
+npn pn bu1 1
+npn pn u0 1
+npolylog 1
+npq 1
+nprim 1
+nq 3
+nr 6
+nr is calcl 1
+nr t0 1
+nr.143 1
+nrd 1
+nrd inclus 1
+nrd perceiv 1
+nrd perceiv us 1
+nrd seem 1
+nrever 1
+nrever pol 1
+ns 10
+ns is greater 1
+ns md904 1
+ns p2 1
+ns sproc 1
+ns0 1
+ns0 contain 1
+ns0 ns1 1
+ns0 ns1 qr 1
+ns1 1
+ns1 contain 1
+ns1 qr 1
+ns81 1
+nsar 1
+nsar gav 1
+nsar network 1
+nsar neur 1
+nsar neur network 1
+nsar prov 1
+nsec 2
+nsec cycl 1
+nserc 3
+nserc research 1
+nserc research grant 1
+nsf 26
+nsf career 1
+nsf career award 1
+nsf ccr 2
+nsf grant 14
+nsf grant ccr 8
+nsf grant cd 1
+nsf grant cd9414015 1
+nsf grant ir 2
+nsf grant mip 2
+nsf hpcc 1
+nsf hpcc gcag 1
+nsf inr 1
+nsf inr grant 1
+nsf institut 1
+nsf institut infrastructur 1
+nsf int 1
+nsf py 3
+nsf py award 2
+nsf py grant 1
+nsf research 1
+nsf research grant 1
+nsf sc 1
+nsf ser 1
+nsf under grant 3
+nsf young 1
+nsf young investig 1
+nsfnet 1
+nsfnet t1 1
+nsfnet t1 backbon 1
+nsk 2
+nsp 1
+nsp 4p 1
+nst 1
+nst le 1
+nst le nombr 1
+nsubbandsg 1
+nsw 3
+nt 10
+nt 1t 1
+nt and mlt 1
+nt ar comp 1
+nt bt 1
+nt build 1
+nt chain 1
+nt deadlock 1
+nt deadlock occur 1
+nt def 1
+nt explor 1
+nt found 1
+nt in determin 1
+nt is effect 1
+nt is encounter 1
+nt is fr 1
+nt is illustr 1
+nt is reach 1
+nt kbt 1
+nt kbt c1i 1
+nt kbt c1i1 1
+nt kbt ci 1
+nt layer 1
+nt log 1
+nt n uv 1
+nt ne 1
+nt nest 1
+nt nest transact 1
+nt of act 1
+nt over heur 1
+nt requir 1
+nt system 1
+nt th tim 1
+nt took 1
+nt treetimestat 1
+nt uv 1
+nt uv nt 1
+nt4 1
+ntail 1
+nth 2
+nth inst 1
+nth subtr 1
+ntjytj 1
+ntjytj jxz1 1
+ntk 1
+ntk log 1
+ntn 1
+ntoam 1
+ntoam avec 1
+ntoam consom 1
+ntoam de 1
+ntoam de deux 1
+ntoam ne 1
+ntoam ne dupliqu 1
+ntoam ne peut 1
+ntoam ne va 1
+ntoam pu 1
+ntot 1
+ntot dnm 1
+ntot nconf 1
+ntot nconf npb 1
+ntot nconf nst 1
+ntotaltim 1
+ntp 1
+ntp axiom 1
+ntp of x2 1
+ntppg 1
+ntreetim 1
+nu 4
+nu aux 1
+nu aux perform 1
+nu cc 1
+nu prolog 1
+nu1 1
+nu1 cndu1 1
+nuag 1
+nuag auquel 1
+nuag auquel il 1
+nucl 2
+nucl ac 1
+nucl ac pl 1
+nucl eair 1
+nuclear 3
+nuclear instr 1
+nuclear react 1
+nuclear react appl 1
+nuclear wast 1
+nuclear wast dr 1
+nucleot 1
+nuit 1
+nuit aux 1
+nuit aux lectur 1
+num 14
+num architectur 1
+num block 1
+num cc 1
+num cc num 1
+num client 1
+num compiler 1
+num de 1
+num de typ 1
+num disk 1
+num er 3
+num er de 2
+num er ee 1
+num eriqu 3
+num eriqu attest 1
+num eriqu avec 1
+num eriqu couram 1
+num eriqu de 1
+num eriqu effectu 1
+num eriqu sont 1
+num eriqu standard 1
+num eriqu un 1
+num eriqu util 1
+num et cc 1
+num et osm 1
+num explor 1
+num explor reducead16 1
+num exploredstat 1
+num head 1
+num item 1
+num menu 1
+num menu item 1
+num nod 1
+num on aut 1
+num osm 1
+num osm com 1
+num parameter 1
+num recvd 1
+num recvd num 1
+num ro 1
+num sect 1
+num seg 1
+numaq 1
+numaq ind.html 1
+numar 1
+number 121
+number a.11 1
+number a.11 object 1
+number accord 1
+number agr 1
+number al identif 1
+number alloc 1
+number and cost 2
+number and fragm 1
+number and funct 1
+number and item 1
+number and jvij 1
+number and proc 1
+number and resid 1
+number and v2 1
+number ar approxim 1
+number ar expect 1
+number ar explicit 1
+number ar further 1
+number ar giv 1
+number ar mark 1
+number ar pref 1
+number ar requir 1
+number ar uniqu 1
+number as label 1
+number assoc 2
+number attach 1
+number becom 1
+number becom greater 1
+number bi 1
+number bi occur 1
+number by tim 1
+number cannot exceed 1
+number ccr 1
+number chang 2
+number compar 1
+number consider 1
+number continu 1
+number correspon 2
+number count 1
+number crunch 1
+number cs95 1
+number daah04 2
+number dep 2
+number displ 1
+number fair 1
+number fair simpl 1
+number float 1
+number for conv 1
+number for nod 1
+number for osl 1
+number for pag 1
+number from proc 1
+number from tabl 1
+number gener 5
+number gener random 1
+number gener seed 1
+number greater 2
+number handl 1
+number hav exact 1
+number hkust 1
+number ht 1
+number idxp 1
+number idxp norm 1
+number in figur 1
+number in order 1
+number in parenth 1
+number in s2 1
+number in ti 1
+number incr 1
+number ind 2
+number int 1
+number int tot 1
+number integer 1
+number integer float 1
+number is determin 1
+number is equ 2
+number is follow 1
+number is guaranteed 1
+number is ident 1
+number is increm 1
+number is larger 1
+number is lim 1
+number is smaller 1
+number is upd 1
+number j2 1
+number ja 1
+number k output 1
+number l contain 1
+number l l0 1
+number l0 1
+number lj 1
+number may determin 1
+number mor quick 1
+number multipl 1
+number n00014 1
+number nag 1
+number nag1 1
+number num 1
+number num menu 1
+number number 2
+number number number 1
+number object 1
+number oe 1
+number of acc 1
+number of act 5
+number of activ 1
+number of ad 1
+number of addit 4
+number of adequ 1
+number of adjac 1
+number of adv 2
+number of agent 1
+number of algorithm 2
+number of altern 4
+number of answer 2
+number of ap 1
+number of appl 4
+number of approach 1
+number of ar 1
+number of arc 1
+number of argum 4
+number of aspect 1
+number of assoc 1
+number of atom 3
+number of attach 1
+number of attempt 1
+number of avail 3
+number of ba 1
+number of backlog 1
+number of bar 1
+number of benefit 1
+number of bernoul 1
+number of bit 4
+number of blank 1
+number of block 2
+number of board 2
+number of bound 1
+number of branch 2
+number of buffer 1
+number of bundl 1
+number of bus 2
+number of by 1
+number of ca 2
+number of cach 1
+number of cal 2
+number of candid 1
+number of cap 1
+number of categor 1
+number of cel 1
+number of centr 1
+number of cg 1
+number of ch 4
+number of chang 1
+number of channel 1
+number of character 3
+number of chunk 3
+number of cl 2
+number of claus 1
+number of clear 1
+number of cliqu 1
+number of closur 1
+number of cluster 6
+number of coar 1
+number of col. 1
+number of color 1
+number of column 1
+number of combin 2
+number of commerc 3
+number of common 1
+number of commun 4
+number of compar2 1
+number of comparison 1
+number of compl 1
+number of complec 1
+number of compon 2
+number of comput 1
+number of computer 1
+number of concur 1
+number of conjectur 1
+number of connect 5
+number of consider 1
+number of const 1
+number of constraint 3
+number of context 1
+number of contigu 1
+number of continu 1
+number of contour 1
+number of contract 1
+number of cpu 1
+number of cpus 1
+number of crosspoint 1
+number of cycl 3
+number of dag 1
+number of dat 7
+number of dataflow 1
+number of decl 1
+number of ded 1
+number of degr 1
+number of design 3
+number of desir 3
+number of detect 1
+number of digit 2
+number of dim 1
+number of direct 1
+number of discrimin 1
+number of disk 3
+number of dist 1
+number of distinct 7
+number of diver 1
+number of docum 1
+number of domain 1
+number of drop 1
+number of dupl 1
+number of dynam 2
+number of edg 12
+number of eff 1
+number of effort 1
+number of eigenvalu 1
+number of el 9
+number of encod 1
+number of entr 1
+number of erron 2
+number of error 1
+number of evalu 1
+number of event 1
+number of exact 1
+number of execut 1
+number of exempl 1
+number of expan 1
+number of exper 1
+number of experim 1
+number of explicit 1
+number of extr 2
+number of extrem 1
+number of fac 1
+number of fact 5
+number of fail 1
+number of failur 3
+number of featur 1
+number of fi 1
+number of fic 1
+number of find 1
+number of floor 1
+number of flush 1
+number of form 2
+number of fr 1
+number of fram 1
+number of ftp 1
+number of funct 3
+number of fundam 1
+number of garb 1
+number of gat 2
+number of gener 3
+number of geometer 1
+number of glob 1
+number of goal 1
+number of graph 1
+number of green 1
+number of grid 1
+number of group 2
+number of gu 1
+number of head 1
+number of heap 1
+number of hid 3
+number of hierarch 2
+number of hop 1
+number of hyperplan 2
+number of id 1
+number of im 1
+number of imag 1
+number of inc 1
+number of individu 1
+number of infer 1
+number of init 2
+number of input 7
+number of inser 3
+number of inst 3
+number of instruc 2
+number of integer 2
+number of inter 5
+number of interconnect 1
+number of interest 2
+number of interm 1
+number of intern 1
+number of internet 3
+number of interswitch 1
+number of inv 2
+number of issu 2
+number of item 1
+number of iter 14
+number of job 1
+number of key 3
+number of knowledg 1
+number of langu 2
+number of layer 1
+number of leader 1
+number of learn 1
+number of leav 2
+number of level 4
+number of lin 4
+number of link 4
+number of liter 1
+number of loc 5
+number of log 1
+number of loop 1
+number of lower 1
+number of ma 1
+number of margin 1
+number of matr 1
+number of me 13
+number of mean 1
+number of memor 2
+number of method 2
+number of mi 1
+number of min 1
+number of minor 1
+number of mismatch 1
+number of modif 1
+number of modl 2
+number of mov 2
+number of multicast 1
+number of nam 1
+number of ne 1
+number of nec 1
+number of neighbor 1
+number of nest 1
+number of network 4
+number of neuron 1
+number of next 1
+number of nod 15
+number of non 8
+number of nonblock 1
+number of nontr 1
+number of nonzer 2
+number of number 1
+number of numer 1
+number of object 4
+number of occur 2
+number of oper 5
+number of organ 1
+number of other 1
+number of outg 2
+number of output 3
+number of pa 1
+number of pack 2
+number of pag 3
+number of pair 3
+number of parallel 5
+number of parameter 1
+number of part 2
+number of particip 2
+number of particl 1
+number of partit 2
+number of path 2
+number of pattern 2
+number of pe 2
+number of peopl 1
+number of ph 2
+number of pi 1
+number of piec 1
+number of pin 2
+number of pivot 1
+number of pixel 1
+number of point 7
+number of pointer 3
+number of polygon 2
+number of polynom 1
+number of port 1
+number of posit 1
+number of possibil 1
+number of pr 1
+number of prev 1
+number of prob 1
+number of problem 2
+number of proc 26
+number of procedur 1
+number of produc 1
+number of progn 1
+number of program 1
+number of project 2
+number of prompt 1
+number of prop 1
+number of proposit 1
+number of publ 1
+number of qu 2
+number of qualif 1
+number of quant 1
+number of quantif 1
+number of quest 3
+number of reason 1
+number of rec 2
+number of record 3
+number of rectangl 1
+number of recur 1
+number of reduc 1
+number of refer 1
+number of refin 1
+number of reg 2
+number of register 1
+number of regr 1
+number of rel 1
+number of remain 2
+number of repetit 1
+number of repl 2
+number of repr 1
+number of request 1
+number of requir 3
+number of research 3
+number of result 1
+number of rl 2
+number of rol 1
+number of round 1
+number of rout 1
+number of router 1
+number of row 2
+number of run 1
+number of sampl 3
+number of se 2
+number of secon 1
+number of segm 1
+number of sent 1
+number of separ 2
+number of sequ 2
+number of server 2
+number of shar 1
+number of shortcom 2
+number of sibl 1
+number of signif 1
+number of simil 1
+number of simpl 1
+number of simultan 3
+number of singl 1
+number of sit 1
+number of situ 1
+number of slav 1
+number of spec 1
+number of split 1
+number of st 2
+number of stack 1
+number of stag 1
+number of stat 3
+number of step 4
+number of string 1
+number of stud 1
+number of sub 1
+number of subject 1
+number of submodl 1
+number of subtl 1
+number of succ 1
+number of super 1
+number of superver 1
+number of support 1
+number of swap 1
+number of switch 2
+number of symmeter 1
+number of system 2
+number of task 2
+number of techn 1
+number of techniqu 1
+number of tempor 1
+number of test 3
+number of tetrahedr 1
+number of tim 18
+number of tj 1
+number of tok 1
+number of tr 1
+number of track 1
+number of tradit 1
+number of trailer 1
+number of train 1
+number of transl 1
+number of triangl 3
+number of trick 1
+number of tripl 1
+number of tupl 1
+number of typ 1
+number of uncolor 1
+number of uniqu 1
+number of unmark 1
+number of unnec 1
+number of unseen 1
+number of unsucc 1
+number of upd 3
+number of us 1
+number of user 2
+number of utter 1
+number of valu 1
+number of variabl 8
+number of vect 1
+number of ver 8
+number of view 1
+number of virtu 1
+number of vot 2
+number of vsplit 1
+number of wavel 1
+number of way 1
+number of weight 2
+number of wir 3
+number of word 1
+number of work 1
+number of workst 1
+number of writ 1
+number of yellow 1
+number of zer 1
+number ofinternetchannel 2
+number on channel 1
+number on receiv 1
+number or addr 1
+number or order 1
+number outsid ind 1
+number over emin 1
+number p follow 1
+number prec 1
+number prev 1
+number prev st 1
+number proc 1
+number quatern 1
+number quest 1
+number rang 1
+number receiv 1
+number report 1
+number repr 3
+number s submonit 1
+number sc23 1
+number schem 1
+number schem.th 1
+number schem.th construc 1
+number shown 1
+number simpl 1
+number simpl part 1
+number ss 1
+number th report 1
+number that satisf 1
+number to blog 1
+number to correspon 1
+number to lj 1
+number to mac 1
+number tot 1
+number track 1
+number unissu 1
+number unissu pi 1
+number unsuit 1
+number using 1
+number using merg 1
+number we us 1
+number wil incr 1
+number wil reach 1
+number with construc 1
+number with person 1
+number with respect 1
+number within 2d 1
+number writ 1
+number yi 1
+numberdepartmentemployeesidentnameidentemployeelistidentnamecompanydep 1
+numberdepartmentemployeesidentnameidentemployeelistidentnamecompanydep artmentlistdepartmentsemployeefulltimeparttimesalarynam 1
+numberg 2
+numberg lambd 1
+numberg lambd fnam 1
+numberg mak 1
+numcl 1
+numcl of cl 1
+numdisk 1
+numer 39
+numer academ 1
+numer accur 1
+numer algorithm 1
+numer an 4
+numer an etc 1
+numer anan 1
+numer and algebr 1
+numer and nomin 1
+numer and perform 1
+numer appl 2
+numer attribut 1
+numer benchmark 1
+numer challeng 1
+numer claus 1
+numer cod 2
+numer coder 1
+numer commun 1
+numer comparison 1
+numer comput 1
+numer condit 1
+numer condit branch 1
+numer consequ 1
+numer dat 3
+numer dat mov 1
+numer day 1
+numer day month 1
+numer differ typ 1
+numer disc 1
+numer effort 1
+numer entr 1
+numer experim 1
+numer fact 1
+numer fact tim 1
+numer format 1
+numer help 1
+numer help disc 1
+numer hybrid 1
+numer hybrid neur 1
+numer incon 1
+numer indep 1
+numer indep pair 1
+numer industr 1
+numer industr softwar 1
+numer infer 1
+numer infer ba 1
+numer inform 1
+numer integr 2
+numer integr using 1
+numer loop 1
+numer loop nest 1
+numer mathemat 1
+numer memor 1
+numer memor refer 1
+numer method 3
+numer methodolog 1
+numer model 1
+numer modl 1
+numer of point 1
+numer oper 1
+numer perform 1
+numer prec 1
+numer prev 1
+numer prev algorithm 1
+numer proc 2
+numer program 1
+numer recip 2
+numer result 1
+numer rout 1
+numer satisf 1
+numer satisf algorithm 1
+numer scientif 1
+numer scientif program 1
+numer siml 1
+numer siml method 1
+numer simpl 1
+numer simpl eigenvalu 1
+numer solut 2
+numer system 1
+numer univer 1
+numer workload 1
+numericc 1
+numerisch 2
+numerisch mathematik 1
+numerisch optimierung 1
+numerisch optimierung von 1
+numitem 1
+numnod 2
+numpath 1
+numpath denot 1
+numproc 1
+nupairoj 1
+nupairoj and l.m 1
+nupairoj and ni 1
+nupl 1
+nurtur 1
+nurtur outer 1
+nurtur outer specl 1
+nussinov 1
+nut 1
+nuth 1
+nutil 5
+nutil pa 4
+nutil pa de 2
+nutil pa le 1
+nutil pa lunif 1
+nutil pa tout 1
+nutil qu 2
+nutil qu de 1
+nutil qu le 1
+nuy 1
+nuy ilog.com 1
+nvt 1
+nvvar 1
+nvvar is inst 1
+nw 2
+nw 224w 1
+nw 2nkn 1
+nw 2w 1
+nw 2w cl 1
+nw 48w 1
+nw 8w 1
+nw 8ww 1
+nw al fal 1
+nw and sw 1
+nw by incr 1
+nw denot 1
+nw fal 1
+nw incr 1
+nw is pr 1
+nw lead 1
+nw me 1
+nw me sec 1
+nw ss 1
+nw ss sw 1
+nw sw 1
+nw sw ss 1
+nx 13
+nx libr 1
+nx nx 1
+nxn 1
+nxn commun 1
+nxn commun model 1
+nxn commun paradigm 1
+nxn connect 1
+nxn connect throughput 1
+nxn group 1
+nxn group commun 1
+nxn group multicast 1
+nxn multicast 1
+nxn multicast commun 1
+nxn multicast connect 1
+nxn wh 1
+nxp 1
+nxp incr 1
+nxq 1
+nxr 1
+ny 25
+ny 3brown 1
+ny a aucun 2
+ny a donc 2
+ny a pa 3
+ny a quun 1
+ny a rien 1
+ny ait 2
+ny ait jam 1
+ny ait pa 2
+ny aur 2
+ny aur pa 2
+ny nx 1
+ny ny 1
+ny pa 1
+ny pa de 1
+nyancham 1
+nyancham sylv 1
+nyancham sylv osborn 1
+nyqu 1
+nyu 1
+nyu ultracomputer 1
+nyu ultracomputer approach 1
+o.a 1
+o.g 1
+o.h 1
+o.je 1
+o.je j logk 1
+o.jej 1
+o.jej tim 1
+o.jv 1
+o.jv j log 1
+o.k 1
+o.log 1
+o.log k faster 1
+o0 5
+o0 and o2 1
+o0 belong 1
+o0 th targ 1
+o01 1
+o1 9
+o1 and o2 1
+o1 for doduc 1
+o1 must touch 1
+o1 o2 1
+o1 oep 1
+o1 reproduc 1
+o1 reproduc lop 1
+o1 respect 1
+o1o2o3o4o1o2o 1
+o2 10
+o2 cr 1
+o2 cr relativ 1
+o2 et o3 1
+o2 must belong 1
+o2 must verif 1
+o2 oe1 1
+o2 reduc 1
+o2 test 1
+o2b 1
+o2b oe2b 1
+o2o1e 1
+o3 6
+o3 and o4 1
+o3 mut 1
+o3 mut lop 1
+o3 oe2 1
+o3 opt 1
+o3 qu 1
+o3 qu nous 1
+o3.9 1
+o4 5
+o4 and o5 1
+o4 kn 2
+o4 kn mvect 1
+o4.7 1
+o5 2
+o6 1
+o6.11 1
+oa89 1
+oabilit 1
+oak 1
+oak ridg 1
+oak ridg nat 1
+oaklisp 1
+oalg 1
+oalg ebriqu 1
+oalg ebriqu par 1
+oant 1
+oant dep 1
+ob 11
+ob a singl 1
+ob ei 1
+ob ei au 1
+ob ei en 1
+ob jj 1
+ob jj obntim 1
+ob project 1
+ob th axiom 1
+ob th concur 1
+ob th triangl 1
+ob1s 1
+ob1s tring 1
+obj 9
+obj a lint 1
+obj accessibl 1
+obj consid 1
+obj consid er 1
+obj dan 1
+obj dan la 1
+obj de 2
+obj de dim 1
+obj de synchron 1
+obj fam 1
+obj if obj 1
+obj locaux 1
+obj locaux modif 1
+obj manipl 1
+obj manipl es 1
+obj migrateur 1
+obj observ 1
+obj perm 1
+obj perm le 1
+obj pour 1
+obj pour le 1
+obj qu 2
+obj qu ne 1
+obj qu nous 1
+obj return 1
+obj sur 1
+obj sur la 1
+obj util 1
+obj util sont 1
+obj1 1
+obj1 through objn 1
+obj1 to objn 1
+obj3 1
+obj3 equ 1
+obj3 equ log 1
+object 83
+object a inherit 1
+object abcm 1
+object accord 2
+object actu 1
+object affect 1
+object affect over 1
+object allow 1
+object an 1
+object and act 1
+object and appl 1
+object and check 1
+object and compl 1
+object and design 1
+object and ea 1
+object and execut 1
+object and featur 1
+object and gener 1
+object and introduc 1
+object and invok 1
+object and lin 1
+object and me 1
+object and metacl 1
+object and method 1
+object and multiplec 1
+object and oper 2
+object and overlap 1
+object and return 1
+object and subtyp 1
+object and typ 1
+object appear 1
+object approach 1
+object ar adm 1
+object ar approxim 1
+object ar avail 1
+object ar design 1
+object ar el 1
+object ar firm 1
+object ar inst 1
+object ar interchang 1
+object ar irregl 1
+object ar loc 1
+object ar mutu 1
+object ar obtain 1
+object ar overlap 1
+object ar power 1
+object ar program 1
+object ar refin 1
+object ar repr 1
+object ar said 1
+object ar simpl 1
+object ar structur 1
+object ar transl 1
+object as encapsl 1
+object as perpetu 1
+object as predec 1
+object as se 1
+object as ver 1
+object ask 1
+object ask stud 1
+object asproc 1
+object asproc approach 1
+object assessm 1
+object at differ. 1
+object attribut 1
+object ba 4
+object ba langu 1
+object ba oolp 1
+object ba parallel 1
+object ba view 1
+object behavior 2
+object behavior defin 1
+object being inspect 1
+object belong 3
+object bound 2
+object by alignm 1
+object by default 1
+object by multipl 1
+object by nam 1
+object c oo 1
+object cach 1
+object cal 1
+object cal alloc 1
+object can export 1
+object cannot handl 1
+object caus 1
+object caus sever 1
+object character 1
+object character condit 1
+object cl 6
+object cl ch 1
+object classif 2
+object clon 1
+object cod 5
+object cod correspon 1
+object cod level 1
+object cod siz 1
+object cod using 1
+object compon 1
+object composit 2
+object composit behav 1
+object comput 2
+object con 1
+object configur 1
+object conform 1
+object connect 1
+object connect dep 1
+object contain 1
+object contain inherit 1
+object container 1
+object container cont 1
+object contour 1
+object contr 1
+object contr le 1
+object correspon 2
+object cr 1
+object creat 1
+object criter 1
+object csg 1
+object csg nod 1
+object datab 1
+object decl 1
+object def 1
+object defin 1
+object definit 1
+object del 1
+object dep 1
+object descript 2
+object design 1
+object design aim 1
+object differ 1
+object direct 1
+object direct succ 1
+object displ 1
+object displ compon 1
+object do support 1
+object dynam 1
+object ea 2
+object ea slow 1
+object ec 1
+object en 1
+object en plac 1
+object encapsl 2
+object ent 1
+object enter 1
+object equiv 1
+object exhibit 1
+object exper 1
+object export 1
+object export multipl 1
+object extract 1
+object extract result 1
+object fil 2
+object fil comp 1
+object follow 1
+object for becom 1
+object for guard 1
+object for visu 1
+object found 1
+object framework 1
+object funct 7
+object funct tak 1
+object funct valu 1
+object g slot 1
+object gather 1
+object gather record 1
+object gener 2
+object giv 2
+object graph 1
+object hav acc 1
+object hav built 1
+object hav method 1
+object hav var 1
+object hierarch 1
+object hierarch dim 1
+object hist 1
+object hold 1
+object hold pointer 1
+object id 1
+object identif 2
+object impl 1
+object in bin 1
+object in concur 1
+object in constraint 1
+object in decl 1
+object in ec 1
+object in eulisp 1
+object in gener 1
+object in order 1
+object in part 1
+object in pattern 1
+object in pract 1
+object in preorder 1
+object in rel 1
+object in spac 1
+object ind 1
+object indep 1
+object indep techniqu 1
+object inherit 1
+object init 1
+object init funct 1
+object int 1
+object int fr 1
+object int nonintersect 1
+object integer 1
+object interact 1
+object interfac 1
+object intersect 1
+object invok 1
+object is achief 1
+object is avail 1
+object is character 2
+object is consum 1
+object is conver 1
+object is creat 1
+object is custom 1
+object is defin 3
+object is describ 1
+object is difficult 2
+object is execut 1
+object is explain 1
+object is giv 1
+object is implem 1
+object is interpr 1
+object is intersect 1
+object is mitig 1
+object is model 2
+object is part 1
+object is plac 1
+object is predefin 1
+object is princip 1
+object is repr 3
+object is select 1
+object is spec 1
+object is transform 2
+object is writ 1
+object it repr 1
+object keep 1
+object keep for 1
+object langu 4
+object lead 1
+object level 3
+object level dat 1
+object level definit 1
+object level ent 1
+object level langu 1
+object lik bound 1
+object link 1
+object liter 1
+object log 2
+object log contain 1
+object log program 1
+object look 1
+object mak 2
+object mak object 1
+object manipl 1
+object may mak 1
+object may pl 1
+object me 1
+object me configur 1
+object me pair 1
+object measur 2
+object metaobj 1
+object method 3
+object migr 1
+object mind 1
+object mn 1
+object mobil 1
+object model 4
+object modl 1
+object modl fo.o 1
+object mor effect 1
+object mov 2
+object must cover 1
+object nam 1
+object natur 1
+object new cl 1
+object not creat 1
+object o1 1
+object object 2
+object object ask 1
+object of andreol 1
+object of cl 2
+object of dog 1
+object of giv 1
+object of interest 1
+object of parod 1
+object of typ 1
+object oi 1
+object ok 1
+object oper 1
+object or 3
+object or facilit 1
+object or me 1
+object or outl 1
+object orient 25
+object orient an 1
+object orient andor 1
+object orient anim 1
+object orient approach 1
+object orient architectur 1
+object orient cocktail 1
+object orient cod 1
+object orient concur 2
+object orient dat 2
+object orient datab 5
+object orient dbm 2
+object orient design 8
+object orient developm 1
+object orient dialect 1
+object orient distribut 1
+object orient dynam 1
+object orient exper 1
+object orient ext 2
+object orient fash 1
+object orient featur 1
+object orient framework 2
+object orient graph 1
+object orient interfac 1
+object orient issu 1
+object orient kernel 1
+object orient knowledg 3
+object orient langu 10
+object orient liter 1
+object orient log 1
+object orient method 1
+object orient mind 1
+object orient model 2
+object orient paradigm 4
+object orient program 12
+object orient programmer 1
+object orient prolog 1
+object orient repr 1
+object orient siml 1
+object orient skil 1
+object orient softwar 6
+object orient solut 1
+object orient specif 3
+object orient structur 1
+object orient styl 1
+object orient system 2
+object orient techniqu 1
+object orient technolog 3
+object orient tool 1
+object orient transact 1
+object orient user 1
+object orient ver 1
+object pa 1
+object paradigm 2
+object parallel 1
+object parameter 2
+object perform 1
+object perform transm 1
+object pictur 1
+object pixel 1
+object pl 1
+object plac 1
+object plac problem 1
+object post 1
+object pr 1
+object prescrib 1
+object preserv 2
+object preserv cl 2
+object proc 1
+object program 1
+object prolog 1
+object protocol 2
+object prov 1
+object prov abstract 1
+object put 1
+object qu 1
+object r dynam 1
+object receiv 1
+object recognit 2
+object recognit using 1
+object record 1
+object reduc 1
+object refer 1
+object reg 1
+object rel 1
+object repr 3
+object return 1
+object run 1
+object run signif 1
+object search 2
+object seem 1
+object segm 1
+object select 1
+object sen 1
+object separ 1
+object serv 1
+object shap 1
+object should behav 1
+object siz 1
+object spac 1
+object spac reappear 1
+object st 5
+object st chang 1
+object st dynam 1
+object st system 1
+object st valu 1
+object stat 1
+object status 1
+object stil remain 1
+object straightfor 1
+object straightfor proc 1
+object structur 2
+object succ 1
+object system 7
+object system cl 1
+object system specif 1
+object technolog 1
+object term 1
+object test 1
+object test cover 1
+object textur 1
+object th connectiv 1
+object that belong 1
+object that contain 1
+object that maintain 1
+object that prov 1
+object that repr 1
+object that respon 1
+object that support 1
+object then prov 1
+object to cl 1
+object to cr 1
+object to detect 1
+object to examin 1
+object to idl 1
+object to init 1
+object to me 1
+object to mic 1
+object to plac 1
+object to satisf 1
+object to se 1
+object to signif 1
+object transm 1
+object under geometer 1
+object us 2
+object us me 1
+object using 2
+object using equ 1
+object using part 1
+object valu 1
+object var 1
+object var regard 1
+object variabl 1
+object virtu 1
+object virtu fail 1
+object wa es 1
+object wa inherit 1
+object wa prop 1
+object we obtain 1
+object wh cl 1
+object wh inst 1
+object wh member 1
+object wh refer 1
+object wh shadow 1
+object when teach 1
+object which caus 1
+object which configur 1
+object which contain 1
+object which describ 1
+object which involut 1
+object which threat 1
+object with attribut 1
+object with consider 1
+object with dynam 1
+object with multipl 1
+object with particl 1
+object z repr 1
+object z specif 1
+object1 1
+object2 1
+objectb 1
+objectb serv 1
+objectif 3
+objectif de 2
+objectif de localiser 1
+objectif de montrer 1
+objectif est 1
+objectif principaux 1
+objectif principaux lam 1
+objectif se 1
+objectif se restreint 1
+objectiv 6
+objectiv and intern 1
+objectiv and strateg 1
+objectiv ar handl 1
+objectiv ar test 1
+objectiv as se 1
+objectiv se 1
+objectm 1
+objectm pair 1
+objectop 1
+objectrepl 1
+objectsdont 1
+objectsdont overlap 1
+objectsdont overlap constraint 1
+objectspecif 1
+objectspecif menus 1
+objectwindow 1
+objectwindow libr 1
+objectwindow libr converter 1
+objlink 1
+objlink txlink 1
+objlink txlink txlink 1
+objn 1
+objvlisp 1
+objvlisp model 1
+objvprolog 1
+objvprolog of malenf 1
+oblig 6
+oblig a conserver 1
+oblig act 1
+oblig assoc 1
+oblig com 1
+oblig for refin 1
+oblig is satisf 1
+oblig oft refer 1
+obligatoir 1
+obligatoir de 1
+obligatoir de coupur 1
+obligatoir soit 1
+obligatoir soit un 1
+oblog 1
+obn 1
+obn ar rel 1
+obner 1
+obner ba 1
+obntim 1
+obntim e2t 1
+oboyl 1
+oboyl et al 1
+obscur 3
+obscur i tim 1
+obscur nam 1
+obscur nam funct 1
+obscur specif 1
+obscur th detail 1
+observ 93
+observ a behaviour 1
+observ about error 1
+observ about learn 1
+observ al nod 1
+observ and act 1
+observ and behaviour 1
+observ and control 1
+observ and experim 2
+observ and inform 1
+observ and interpr 1
+observ and puzzl 1
+observ and recom 1
+observ and tempor 1
+observ ar coupl 1
+observ ar fundam 1
+observ ar val 1
+observ as prim 1
+observ assoc 1
+observ bar 1
+observ bar command 1
+observ behaviour 1
+observ by examin 1
+observ by rot 1
+observ clear 1
+observ clear cut 1
+observ comput 1
+observ comput behaviour 1
+observ con 1
+observ concern 1
+observ concur 1
+observ concur control 1
+observ defin 1
+observ degrad 1
+observ demonstr 2
+observ differ 1
+observ dynam 1
+observ dynam system 1
+observ e en 1
+observ effect 1
+observ equ 1
+observ equiv 1
+observ equiv ss 1
+observ est 1
+observ est cel 1
+observ evid 1
+observ evid weak 1
+observ execut 1
+observ execut tim 1
+observ experim 2
+observ featur 1
+observ for bpc 1
+observ framework 1
+observ growth 1
+observ growth rat 1
+observ hav motiv 1
+observ in fig 1
+observ in lem 1
+observ in ma 2
+observ in order 1
+observ in sect 1
+observ induc 1
+observ involut 1
+observ is confirm 1
+observ is shap 1
+observ it ea 1
+observ it effect 1
+observ it follow 1
+observ le 1
+observ le eff 1
+observ lead 3
+observ mad 1
+observ motiv 2
+observ na 1
+observ na internet 1
+observ no rel 1
+observ no signif 1
+observ on task 1
+observ orst 1
+observ ou 1
+observ pattern 1
+observ per cel 1
+observ perform 1
+observ proper 2
+observ proper domain 1
+observ qu 1
+observ qu dan 1
+observ qu le 1
+observ quant 1
+observ quil 1
+observ quil ny 1
+observ reader 1
+observ regard 3
+observ rel 1
+observ start 1
+observ succ 1
+observ such sw 1
+observ suppl 1
+observ suppl mentair 1
+observ sur 2
+observ sur ce 1
+observ sur laquel 1
+observ test 1
+observ test sampl 1
+observ th chang 1
+observ th distribut 1
+observ th dynam 1
+observ th effect 2
+observ th fair 1
+observ th interact 1
+observ th sign 1
+observ th stream 1
+observ th synchron 1
+observ th system 1
+observ th view 1
+observ th writ 1
+observ that act 1
+observ that compar 1
+observ that copt 1
+observ that edg 1
+observ that g0 1
+observ that nd 1
+observ that network 1
+observ that part 1
+observ that proof 1
+observ that refin 1
+observ that sniff 1
+observ that softwar 1
+observ that standard 1
+observ that start 1
+observ that symbol 1
+observ that tr 1
+observ that using 1
+observ that x2 1
+observ to perm 1
+observ to refer 1
+observ to var 1
+observ together val 1
+observ toutef 1
+observ toutef certain 1
+observ tran 1
+observ tran perform 1
+observ val 1
+observ val eqn 1
+observ val result 1
+observ valu 2
+observ var 1
+observ var valu 1
+observ variabl 1
+observ variabl.2 1
+observ viewpoint 1
+observ wa ind 1
+observ we cal 1
+observ we relac 1
+observ wer sampl 1
+observ wh justif 1
+observ which support 1
+observ wil show 1
+observ with fft 1
+observ with high 1
+observ with number 1
+observ xn 1
+observabl 3
+observabl ar abstract 1
+observabl ar repr 1
+observabl as gal 1
+observabl by tak 1
+observabl de 1
+observabl in term 1
+observabl of sect 1
+observabl we consider 1
+observabl which guar 1
+observer 7
+observer dec 1
+observer le 1
+observer le fonct 1
+observer un comport 1
+observer view 1
+observer with addit 1
+obsol 5
+obsol for program 1
+obsol inform 1
+obsol parent 1
+obsol parent pointer 1
+obsol record 1
+obsol record list 1
+obsol technolog 1
+obsol test 1
+obst 1
+obst difficult 1
+obstacl 6
+obstacl in using 1
+obt 6
+obt ain 1
+obt ain en 1
+obt alor 1
+obt alor en 1
+obt alor la 1
+obt alor min 1
+obt alor un 1
+obt apr 2
+obt apr es 2
+obt com 1
+obt conform 1
+obt conform ement 1
+obt de 1
+obt de parcour 1
+obt donc 1
+obt donc fin 1
+obt en 1
+obt en not 1
+obt facil 1
+obt facil la 1
+obt la 1
+obt le 1
+obt le born 1
+obt successiv 1
+obt un 2
+obt un appl 1
+obt un cl 1
+obt un pag 1
+obt un tel 1
+obt zk 1
+obtain 91
+obtain a cach 1
+obtain a clear 1
+obtain a contradict 1
+obtain a cycl 1
+obtain a dat 1
+obtain a decomposit 1
+obtain a deriv 1
+obtain a dist 1
+obtain a forest 1
+obtain a gener 1
+obtain a good 1
+obtain a high 1
+obtain a lin 1
+obtain a map 1
+obtain a minim 3
+obtain a model 2
+obtain a parameter 1
+obtain a particl 1
+obtain a partit 1
+obtain a polynom 1
+obtain a program 1
+obtain a protocol 1
+obtain a saf 1
+obtain a se 1
+obtain a simpl 1
+obtain a span 1
+obtain a straightfor 1
+obtain a supergraph 1
+obtain a system 2
+obtain a tetrahedr 1
+obtain a theorem 1
+obtain a theseus 1
+obtain a tr 1
+obtain a triangl 1
+obtain an accept 1
+obtain an augm 1
+obtain an equiv 1
+obtain an inequ 1
+obtain an infinit 1
+obtain an nc 1
+obtain an upper 2
+obtain another tcp 1
+obtain answer 1
+obtain any insight 1
+obtain approxim 2
+obtain approxim algorithm 2
+obtain as describ 1
+obtain as follow 1
+obtain attribut 1
+obtain attribut valu 1
+obtain better speedup 1
+obtain better start 1
+obtain between birth 1
+obtain bound 1
+obtain by ad 1
+obtain by appl 8
+obtain by backpropag 1
+obtain by cal 1
+obtain by collap 1
+obtain by collect 1
+obtain by composit 1
+obtain by concat 2
+obtain by del 1
+obtain by direct 1
+obtain by evalu 1
+obtain by fit 1
+obtain by for 1
+obtain by heur 1
+obtain by increm 1
+obtain by interchang 1
+obtain by link 1
+obtain by logit 1
+obtain by microcod 1
+obtain by multipl 2
+obtain by multiplec 1
+obtain by narrow 1
+obtain by neg 1
+obtain by nonmonot 1
+obtain by pa 1
+obtain by parm 1
+obtain by pick 2
+obtain by read 1
+obtain by recur 1
+obtain by replac 2
+obtain by rever 2
+obtain by run 1
+obtain by se 1
+obtain by shannon 1
+obtain by subtract 1
+obtain by system 1
+obtain by tak 2
+obtain by test 1
+obtain by train 1
+obtain by transfer 1
+obtain by unfold 1
+obtain by using 3
+obtain cl 1
+obtain cl estim 1
+obtain compact 1
+obtain compact repr 1
+obtain compmst 1
+obtain con 1
+obtain con glob 1
+obtain confid 1
+obtain cop 1
+obtain copt 1
+obtain correct 1
+obtain correct solut 1
+obtain cycl 1
+obtain cycl ba 1
+obtain demonstr 1
+obtain design 2
+obtain design guidel 2
+obtain ea 1
+obtain earl 3
+obtain estim 1
+obtain excel 1
+obtain excel result 1
+obtain execut 1
+obtain execut tim 1
+obtain figur 1
+obtain for qsm 1
+obtain from a0 1
+obtain from dejavu2 1
+obtain from ec 1
+obtain from eqn 1
+obtain from gn 1
+obtain from indep 1
+obtain from minim 1
+obtain from unif 2
+obtain good 2
+obtain good numer 1
+obtain good parallel 1
+obtain ha maxim 1
+obtain html 1
+obtain html pag 1
+obtain in ca 1
+obtain inclus 1
+obtain indep 1
+obtain inform 2
+obtain it control 1
+obtain lin 1
+obtain lin speedup 1
+obtain longer 1
+obtain longer sequ 1
+obtain longer tcp 1
+obtain mor flec 1
+obtain mor rel 1
+obtain multipl 1
+obtain multipl foc 1
+obtain new fact 1
+obtain new loop 1
+obtain on cfd 1
+obtain on measur 1
+obtain optim 1
+obtain optim algorithm 1
+obtain our empir 1
+obtain perform 1
+obtain perform measur 1
+obtain pi 1
+obtain posit 1
+obtain posit dual 1
+obtain prec 1
+obtain prec result 1
+obtain prev 1
+obtain r1 1
+obtain respect 1
+obtain respect speedup 1
+obtain result 2
+obtain satisf 1
+obtain satisf result 1
+obtain sev 1
+obtain signif 2
+obtain signif estim 1
+obtain signif improv 1
+obtain simil 1
+obtain simil result 1
+obtain solut 2
+obtain som result 1
+obtain spac 1
+obtain speedup 1
+obtain such subject 1
+obtain systol 1
+obtain systol algorithm 1
+obtain th addit 1
+obtain th algorithm 1
+obtain th behavior 1
+obtain th cal 1
+obtain th coh 1
+obtain th compl 1
+obtain th correspon 1
+obtain th desir 1
+obtain th fin 3
+obtain th ha 1
+obtain th hybrid 1
+obtain th inform 1
+obtain th map 1
+obtain th margin 1
+obtain th modif 1
+obtain th optim 1
+obtain th ph 1
+obtain th privileg 1
+obtain th program 1
+obtain th requir 1
+obtain th result 1
+obtain th subject 1
+obtain th subsequ 1
+obtain th wavel 1
+obtain their key 1
+obtain their ph 1
+obtain through benchmark 1
+obtain through nondetermin 1
+obtain through parallel 1
+obtain using 6
+obtain using context 1
+obtain using mar 1
+obtain using rm 1
+obtain valu 1
+obtain vi computer 1
+obtain vi numer 1
+obtain vi tomograph 1
+obtain when shift 1
+obtain whil build 1
+obtain with bpc 1
+obtain with cluster 1
+obtain with correspon 1
+obtain with rx 1
+obtain z1 1
+obtain z1 z2 1
+obtain zer 1
+obtain zer lat 1
+obtenir 4
+obtenir a la 1
+obtenir de 3
+obtenir de algorithm 1
+obtenir de bon 2
+obtenir de chromosom 1
+obtenir de solut 1
+obtenir de tail 1
+obtenir la 2
+obtenir la pag 1
+obtenir la valeur 1
+obtenir lalign 1
+obtenir lalign de 1
+obtenir le 3
+obtenir le born 1
+obtenir le droit 1
+obtenir le jacob 1
+obtenir le perform 1
+obtenir le titr 2
+obtenir un 2
+obtenir un cop 1
+obtenir un crit 1
+obtenir un domain 1
+obtenir un equilibr 1
+obtenir un estim 1
+obtenir un meilleur 1
+obtenir un nid 1
+obtenir un tail 1
+obtent 1
+obtenu 5
+obtenu a celu 1
+obtenu a partir 2
+obtenu a un 1
+obtenu apr 1
+obtenu apr es 1
+obtenu au 1
+obtenu au th 1
+obtenu aux 1
+obtenu aux paragraph 1
+obtenu avec 1
+obtenu avec la 1
+obtenu constitu 1
+obtenu cont 1
+obtenu cont alor 1
+obtenu correspon 1
+obtenu correspon exact 1
+obtenu dan 3
+obtenu dan le 2
+obtenu dan un 1
+obtenu en 3
+obtenu en calcl 1
+obtenu en cod 1
+obtenu en inver 1
+obtenu en ma 1
+obtenu en pren 1
+obtenu en red 1
+obtenu en sassur 1
+obtenu en util 1
+obtenu est 1
+obtenu est don 1
+obtenu gr 1
+obtenu gr ac 1
+obtenu nest 1
+obtenu nest pa 1
+obtenu par 2
+obtenu par la 1
+obtenu par lag 1
+obtenu par lagc 1
+obtenu par lalgorithm 1
+obtenu par le 1
+obtenu par lidentit 1
+obtenu par lutil 1
+obtenu par notr 1
+obtenu pour 1
+obtenu pour la 1
+obtenu pour le 1
+obtenu pr 1
+obtenu pr ec 1
+obtenu selon 1
+obtenu selon le 1
+obtenu sont 1
+obtenu sont de 1
+obtenu sous 1
+obtenu sous form 1
+obtenu sur 2
+obtenu sur chaqu 1
+obtenu sur de 1
+obtenu sur la 1
+obtenu sur le 1
+obtenu valent 1
+obtenus 4
+obtenus en 1
+obtenus en appliqu 1
+obtenus en compil 1
+obtenus en modif 1
+obtenus entr 1
+obtenus entr le 1
+obtenus exp 1
+obtenus exp erim 1
+obtenus montr 1
+obtenus montr qu 1
+obtenus nest 1
+obtenus nest pa 1
+obtenus par 3
+obtenus par goldberg 1
+obtenus par siml 1
+obtenus par transl 1
+obtenus pour 1
+obtenus pour diff 1
+obtenus sont 3
+obtenus sont favorabl 1
+obtenus sont toujour 1
+obtiendrait 2
+obtiendrait a la 1
+obtiendrait en 1
+obtiendrait en se 1
+obtus 1
+obtus angl 1
+obtus angl op 1
+obtus delaun 1
+obtus delaun triangl 1
+obtus triangl 1
+obtus triangl mesh 1
+obv 56
+obv a softwar 1
+obv adv 1
+obv axiom 1
+obv be repr 1
+obv be simplif 1
+obv been achief 1
+obv bipart 1
+obv ca 1
+obv candid 1
+obv ch 1
+obv channel 1
+obv channel commun 1
+obv condit 1
+obv contr 1
+obv cover 1
+obv decomposit 1
+obv decomposit interpr 1
+obv definit 1
+obv dep 1
+obv exampl 2
+obv foc 1
+obv foc object 1
+obv from figur 1
+obv gener 2
+obv incon 1
+obv invar 1
+obv it perform 1
+obv lower 1
+obv lower bound 1
+obv mean 3
+obv method 2
+obv mi 1
+obv next quest 1
+obv o1 1
+obv o1 oep 1
+obv obstacl 1
+obv parallel 1
+obv parallel evalu 1
+obv parameter 1
+obv reason 1
+obv reduc 1
+obv requir 2
+obv simd 1
+obv simd candid 1
+obv sinc fdg 1
+obv solut 1
+obv sourc 1
+obv sourc cod 1
+obv th cod 1
+obv th dx 1
+obv th sparsest 1
+obv th st 1
+obv th tim 1
+obv th tot 1
+obv that algorithm 1
+obv to solut 1
+obv u0 1
+obv upon incr 1
+obv var 1
+obv work 1
+obv worser 1
+oc 3
+oc and de 1
+oc at level 1
+oc at li 1
+oc eaniqu 1
+oc proper 1
+oc proper solut 1
+oc st 1
+oc93 1
+ocauchemar 1
+ocauchemar tant 1
+ocauchemar tant il 1
+occ 12
+occ com 1
+occ com de 1
+occ con 1
+occ con rest 1
+occ denot 1
+occ e par 1
+occ execut 1
+occ execut self 1
+occ exper 1
+occ exper exc 1
+occ fail 1
+occ in troubl 1
+occ jump 1
+occ paper 1
+occ th environm 1
+occ we denot 1
+occ writ 2
+occ writ input 1
+occam 2
+occam and tok 1
+occam construc 1
+occam could theor 1
+occam fold 1
+occam fold edit 1
+occam is particl 1
+occam langu 1
+occam nest 1
+occam nest layer 1
+occam parser 1
+occam program 1
+occam program langu 1
+occam razor 1
+occam show 1
+occam specif 1
+occam syntac 1
+occam.h 1
+occam.h fil 1
+occam.h fil contain 1
+occam2 1
+occlus 2
+occlus and thus 1
+occult 1
+occup 16
+occup a deeper 1
+occup an earl 1
+occup e par 1
+occup ee 1
+occup ee par 1
+occup exact 1
+occup exact half 1
+occup high 1
+occup high posit 1
+occup le spac 1
+occup lower 1
+occup lower posit 1
+occup network 1
+occup network link 1
+occup plus de 1
+occup problem 1
+occup th opposit 1
+occup th reg 1
+occup tr 1
+occup tr es 1
+occup un 1
+occup un sect 1
+occuper 1
+occuper la 1
+occuper la plac 1
+occur 84
+occur along edg 1
+occur an aver 1
+occur and mak 1
+occur and natur 1
+occur anywh 1
+occur ar divid 1
+occur around tim 1
+occur as number 1
+occur at arbitr 1
+occur at rel 1
+occur at tim 4
+occur befor a2 1
+occur befor e2 1
+occur between candid 1
+occur between modl 1
+occur by 2cl 1
+occur check 1
+occur check problem 1
+occur dan 1
+occur dan la 1
+occur dan le 1
+occur de 1
+occur de variabl 1
+occur dern 1
+occur despit effort 1
+occur dun 1
+occur dun var 1
+occur dur compact 1
+occur dur execut 2
+occur dur recov 1
+occur earl 1
+occur encl 1
+occur entir 1
+occur escap 1
+occur est 1
+occur est dan 1
+occur exact 1
+occur faster 1
+occur for attribut 1
+occur fr 1
+occur if s2 1
+occur in claus 1
+occur in cycl 1
+occur in exact 1
+occur in g10t 1
+occur in gdeg 1
+occur in loop 1
+occur in minim 1
+occur in oe3 1
+occur in pr 1
+occur in pract 1
+occur in quer 1
+occur in string 1
+occur increm 1
+occur indep 2
+occur infrequ 1
+occur insid compon 1
+occur instantan 1
+occur instead 1
+occur is inevit 1
+occur is schedl 1
+occur is shar 1
+occur lat 1
+occur main 1
+occur matr 1
+occur of affect 1
+occur of const 1
+occur of currexp 1
+occur of defin 1
+occur of evcont 1
+occur of event 1
+occur of fault 1
+occur of liter 1
+occur of record 1
+occur of ri 1
+occur of s1 1
+occur of tj 1
+occur of variabl 1
+occur of xj 1
+occur of yi 1
+occur onl subsequ 1
+occur over tim 1
+occur quit frequ 1
+occur random 1
+occur siml 1
+occur simultan 1
+occur so infrequ 1
+occur suff 1
+occur tim 1
+occur to frequ 1
+occur tw 1
+occur upd 1
+occur vi user 1
+occur when 2i 1
+occur when evolut 1
+occur when molecl 1
+occur when perform 1
+occur with frequ 1
+occur with rt1 1
+occur with sharp 1
+occur within compl 1
+occur within interrupt 1
+occur within tacpt 1
+ocean 3
+ocean acoust 1
+ocean acoust dat 1
+ocean acoust exampl 1
+ocean engineer 2
+ocean of inform 1
+ochsman 1
+ochsman s work 1
+ockerbloom 1
+oconsc 1
+oconsc de 1
+oconsc de pag 1
+ocoup 1
+ocoup le 1
+ocoup le patron 1
+ocr 2
+ocr algorithm 1
+ocr docum 1
+ocr loop 1
+ocr loop dep 1
+ocr phy 1
+ocr phy pag 1
+oct 15
+oct de 1
+oct de pag 1
+oct est 1
+oct est de 1
+oct et un 1
+oct ne 1
+oct ne comport 1
+oct seffectu 1
+oct seffectu en 1
+octasect 1
+octasect algorithm 1
+octasect algorithm describ 1
+octasect algorithm perform 1
+octasect compar 1
+octasect direct div 1
+octasect in signif 1
+octasect spen 1
+octasect vs 1
+octasect vs multilevel 1
+october 44
+octobr 1
+octr 1
+octr ba 1
+octr ba dat 1
+octr var 1
+octr var describ 1
+od 20
+od ba 1
+od ba word 1
+od cycl 1
+od datum 1
+od direntr 1
+od ecaler 1
+od ecaler respectiv 1
+od en 1
+od epart 1
+od for other 1
+od ind 1
+od ind proc 1
+od integer 1
+od is straightfor 1
+od level 1
+od level number 1
+od loc 1
+od loc system 1
+od number 1
+od number quest 1
+od od 1
+od par 1
+od par funct 1
+od polynom 1
+od project 1
+od proper 1
+od scap 1
+od siqu 1
+od siqu compl 1
+od siqu dan 1
+od siqu pa 1
+od siqu pour 1
+od siqu rest 1
+od siqu sur 1
+od valu 1
+od70 1
+od87 1
+odan 1
+odan la 1
+odan la direct 1
+odegard 1
+odel 1
+odel program 1
+odel program langu 1
+odersk 1
+odifr 1
+odin 1
+odonnel 1
+odr 1
+oe 37
+oe 9t0 1
+oe 9t0 8t00 1
+oe a prior 1
+oe ae 1
+oe and ae 1
+oe and ae1 1
+oe and oeab 1
+oe and oeb 2
+oe and perform 1
+oe and ss 1
+oe and sup 1
+oe and term 1
+oe ar boolean 1
+oe ar singl 1
+oe as follow 1
+oe as oe 1
+oe at tim 1
+oe bit 1
+oe by oe 1
+oe cel 1
+oe comput 1
+oe contain 1
+oe credit 1
+oe credit alloc 1
+oe dat 1
+oe def 3
+oe def oe 1
+oe denot 1
+oe df 1
+oe du 1
+oe each datab 1
+oe f1 1
+oe follow 1
+oe fx 1
+oe giv 1
+oe hap 1
+oe hav upd 1
+oe iff 2
+oe iff w0 1
+oe in constraint 1
+oe interpr 1
+oe intersect 1
+oe is defin 1
+oe is empt 1
+oe is fal 1
+oe is posit 1
+oe is val 1
+oe l1 1
+oe ladr 1
+oe ladr dan 1
+oe lc 1
+oe li 1
+oe ln 1
+oe map 1
+oe map c1 1
+oe mod 1
+oe n t0 1
+oe nam 1
+oe nr 1
+oe nr t0 1
+oe oe 3
+oe oe1 1
+oe or oeb 1
+oe order 1
+oe p j2b 1
+oe pr 1
+oe pr ae 1
+oe pvj 1
+oe r li 1
+oe r lj 1
+oe ref 1
+oe ri 1
+oe sc 1
+oe sc exp 1
+oe sn 1
+oe ss 1
+oe t2 1
+oe that interpr 1
+oe that map 1
+oe that tak 1
+oe then maintain 1
+oe threshold 1
+oe to denot 1
+oe to server 1
+oe ts0 1
+oe ts0 oe 1
+oe tsp 1
+oe unchang 1
+oe us 1
+oe us resourc 1
+oe var 1
+oe w0 1
+oe w0 ae 1
+oe wh 1
+oe wh ae 1
+oe would suff 1
+oe x2 1
+oe x2 oe 1
+oe xn 1
+oe xor 1
+oe xor bit 1
+oe y1 1
+oe y2 1
+oe y2 oe 1
+oe ym 1
+oe0 5
+oe0 a ff 1
+oe0 a0 1
+oe0 and ss0 1
+oe0 and ssp 1
+oe0 is defin 1
+oe0 wh 1
+oe0 wh t0 1
+oe02 1
+oe0r 1
+oe0r and ss0 1
+oe1 6
+oe1 again yield 1
+oe1 al c1 1
+oe1 and oe2 2
+oe1 and oe3 1
+oe1 becom 1
+oe1 becom ss0p 1
+oe1 from oe2 1
+oe1 from oe3 1
+oe1 giv 1
+oe1 iff 1
+oe1 is contain 1
+oe1 oe2 1
+oe1 oe2 oe3 1
+oe1 t1 1
+oe1 t1 c2 1
+oe1 t1 cn 1
+oe1 t1 tn 1
+oe1 t1t0 1
+oe1 t2 1
+oe1 t2 c2ss2 1
+oe1 t2 ss2 1
+oe1 through tm 1
+oe1 yield 1
+oe1 yield r00 1
+oe1jdom 1
+oe1oe2 2
+oe1oe2 t1t2 1
+oe1oe2 t1t2 u1 1
+oe1oe2 t2t3 1
+oe1oe2 t2t3 u1 1
+oe1oe2 t2t3 x4 1
+oe1t0 1
+oe1t1 1
+oe1t1 and mak 1
+oe2 7
+oe2 after renam 1
+oe2 al giv 1
+oe2 and oe3 1
+oe2 ar indistingu 1
+oe2 crash 1
+oe2 dec 1
+oe2 denot 1
+oe2 from oe3 1
+oe2 iff 1
+oe2 in norm 1
+oe2 int oe1 1
+oe2 is ea 1
+oe2 oe3 1
+oe2 oe3 oe4 1
+oe2 t2 1
+oe2 t2 c1 1
+oe2 that ext 1
+oe2 through tim 1
+oe2 through tm 1
+oe2 to oe1 1
+oe2 which ar 1
+oe2b 1
+oe2b return 1
+oe2n 1
+oe2n 1h2n 1
+oe2s 1
+oe3 2
+oe3 oe4 1
+oe3 oe4 oe5 1
+oe3 that ext 1
+oe3 through tim 1
+oe3 through tm 1
+oe4 2
+oe4 oe5 1
+oe5 1
+oeab 3
+oeab 8p 1
+oeab al satisf 1
+oeab and oeab0 1
+oeab and therefor 1
+oeab at tim 1
+oeab contain 1
+oeab fact 1
+oeab is indistingu 1
+oeab is non 1
+oeab is repr 1
+oeab li 1
+oeab mc 1
+oeab or oe 1
+oeab overlap 1
+oeab overlap fact 1
+oeab that satisf 1
+oeab touch 1
+oeab0 1
+oeapbp 1
+oeapbp oeab 1
+oeapbp oeab 8p 1
+oeb 2
+oeb and oeab 1
+oeb ar st 1
+oeb contain 1
+oeb server 1
+oeb server sa 1
+oeb wh 1
+oeb wil li 1
+oed 2
+oef 2
+oef report 1
+oef tr 2
+oef1g 1
+oef1g f1g 1
+oeff 1
+oeff de 1
+oeff de bord 1
+oefx 1
+oefx eg 1
+oeij 1
+oeij oe0 1
+oeir 1
+oej 3
+oej def 1
+oek 1
+oel 1
+oel triangl 1
+oel triangl heap 1
+oeld 1
+oeld rang 1
+oem 3
+oem triangl 1
+oem triangl heap 1
+oemg 1
+oemg and fo1 1
+oen 2
+oen 1tn 1
+oen ig 1
+oen non 1
+oen non zer 1
+oen tn 1
+oen tn tn 1
+oenhn 1
+oenjamber 1
+oenjamber lor 1
+oenjamber lor de 1
+oentn 1
+oep 1
+oep should writ 1
+oep5 1
+oep5 oel 1
+oer 1
+oeshar 1
+oeshar et caract 1
+oeshar mesur 1
+oeshar sinon 1
+oeu 2
+oeu 9u0 1
+oeu 9u0 9u00 1
+oeu is margin 1
+oeuvr 4
+oeuvr a partir 1
+oeuvr algorithmiqu 1
+oeuvr autr 1
+oeuvr autr qu 1
+oeuvr dan 4
+oeuvr dan le 4
+oeuvr dan lenviron 1
+oeuvr dautr 1
+oeuvr dautr lang 1
+oeuvr de 3
+oeuvr de algorithm 1
+oeuvr de ce 1
+oeuvr de certain 1
+oeuvr de coupur 1
+oeuvr de la 1
+oeuvr de lalgorithm 1
+oeuvr de lang 1
+oeuvr de lop 1
+oeuvr de mvp 1
+oeuvr de nombreus 1
+oeuvr de point 1
+oeuvr de prolog 1
+oeuvr de syst 1
+oeuvr de tr 1
+oeuvr de transform 1
+oeuvr dext 1
+oeuvr dext tel 1
+oeuvr du 1
+oeuvr du coroutin 1
+oeuvr du pr 1
+oeuvr dun 2
+oeuvr dun gest 1
+oeuvr dun lang 1
+oeuvr efficac 1
+oeuvr efficac de 1
+oeuvr et tr 1
+oeuvr logiciel 1
+oeuvr logiciel du 1
+oeuvr me 1
+oeuvr me lacc 1
+oeuvr ne 1
+oeuvr ne sont 1
+oeuvr on aurait 1
+oeuvr ont 1
+oeuvr ont cherch 1
+oeuvr par 1
+oeuvr par el 1
+oeuvr peuv 1
+oeuvr peuv etr 1
+oeuvr pour 1
+oeuvr pour mettr 1
+oeuvr pratiqu 1
+oeuvr pratiqu qu 1
+oeuvr prioritair 1
+oeuvr prochain 1
+oeuvr prochain de 1
+oeuvr se 1
+oeuvr se distingu 1
+oeuvr simpl 1
+oeuvr simpl dun 1
+oeuvr sous 1
+oeuvr sous form 1
+oeuvr sur 1
+oeuvr sur fortran 1
+oeuvr vi 1
+oev 2
+oev 9v0 1
+oev 9v0 9v00 1
+oev wh 1
+oez 1
+oezx 1
+of 1
+of method 1
+of proof 1
+ofaus 1
+ofdefinit 1
+ofdefinit stimulus 1
+ofdefinit stimulus responsepattern 1
+ofer 1
+oferecem 1
+oferecem a seus 1
+off 27
+off and determ 1
+off and nb 1
+off atom 1
+off autom 1
+off autom project 1
+off between shar 1
+off by simpler 1
+off com 1
+off contract 1
+off contract da 1
+off correspon 1
+off docum 1
+off docum an 1
+off endor 2
+off environm 1
+off equ 1
+off for reason 1
+off grant 1
+off grant daal03 1
+off hour 1
+off inform 1
+off is ad 1
+off of academ 1
+off of nav 4
+off of scientif 1
+off off 1
+off pol 2
+off sourc 1
+off th saving 1
+offer 35
+offer a big 1
+offer a commerc 1
+offer a flec 1
+offer a glob 1
+offer a hug 1
+offer a lot 1
+offer a mean 1
+offer a number 1
+offer a power 1
+offer a prom 1
+offer a signif 1
+offer a simplif 1
+offer a system 1
+offer adv 1
+offer an accept 1
+offer an extr 1
+offer an id 1
+offer another exampl 1
+offer approxim 1
+offer approxim algorithm 1
+offer ar appl 1
+offer at compar 1
+offer bandwidth 3
+offer bandwidth curv 2
+offer best system 2
+offer bisect 2
+offer bisect bandwidth 2
+offer bisect curv 2
+offer by bsp 1
+offer by design 2
+offer by dn 1
+offer by tem. 1
+offer by tempor 1
+offer cluster 1
+offer cluster technolog 1
+offer const 1
+offer cour 1
+offer differ 1
+offer differ acc 1
+offer direct 1
+offer direct exper 1
+offer effect 1
+offer equ 1
+offer equ perform 1
+offer facil 1
+offer facil inconceiv 1
+offer featur 1
+offer featur simil 1
+offer flec 2
+offer good 3
+offer good gener 1
+offer good perform 1
+offer good pipelin 1
+offer great 1
+offer great prom 1
+offer greater 3
+offer greater bisect 2
+offer greater saving 1
+offer high 2
+offer high avail 1
+offer high bandwidth 1
+offer high degr 1
+offer im 1
+offer im exper 1
+offer in addit 1
+offer in ambigu 1
+offer insight 1
+offer it user 1
+offer larg comput 1
+offer larger 1
+offer larger cluster 1
+offer largest 1
+offer largest cluster 1
+offer lingu 1
+offer lingu ext 1
+offer lopportunit 1
+offer low 2
+offer low lat 2
+offer lower 1
+offer lower interconnect 1
+offer man posit 1
+offer match 1
+offer match perform 1
+offer mor serv 1
+offer multipl 1
+offer multipl level 1
+offer nw 1
+offer nw sw 1
+offer per proc 1
+offer perform 2
+offer perform greater 2
+offer psycholog 1
+offer psycholog plaus 1
+offer reason 1
+offer reason bandwidth 1
+offer reflect 1
+offer reflect ap 1
+offer rich 1
+offer rich featur 1
+offer sam sw 1
+offer scal 1
+offer serv 1
+offer sever difficult 1
+offer sever lingu 1
+offer signif 1
+offer signif adv 1
+offer signif improv 1
+offer solut 1
+offer som perform 2
+offer ss 1
+offer ss sw 1
+offer sw 1
+offer th adv 1
+offer th ch 2
+offer th greatest 1
+offer th maxim 1
+offer th po 1
+offer th prompter 1
+offer thr hand 1
+offer thr submenus 1
+offer to connect 1
+offer to se 1
+offer tw tempor 1
+offer us 1
+offer us inform 1
+offer user 1
+offer ver simil 1
+offer w bit 1
+offer wid 1
+officer 1
+offr 3
+offr a lutilisateur 1
+offr ain 2
+offr ain un 1
+offr diff 1
+offr diff erent 1
+offr en 1
+offr en eff 1
+offr la 1
+offr la possibilit 1
+offr un 1
+offr un collect 1
+offr un espac 1
+offr un point 1
+offrir 1
+offrir de 1
+offrir de perform 1
+offsetbus 1
+offsetbus ibus 1
+offsetbus ibus cbus 1
+offsetnb 1
+offsetnb rec 1
+offsetnb rec 500496t1t2 1
+offsid 1
+offspr 2
+offspr model 1
+offth 1
+offth shelf 1
+offth shelf uniproc 1
+ofinternetchannel 2
+oflow 1
+oflow dep 1
+ofsbus 1
+ofsbus abus 1
+ofsbus abus dt 1
+ofserv 1
+ofserv and pol 1
+ofst 1
+ofst nod 1
+ofv 1
+ofx 1
+og 4
+og hustrus 1
+og hustrus fon 1
+og mac 1
+og mar 1
+og mar skov 1
+og o mr 1
+og94 1
+ogihar 1
+ogniewicz 1
+ogp0041630 1
+ogp0951 1
+ograd 1
+ograd and michael 1
+oguid 1
+oguid ea 1
+oguid ea par 1
+ogur 1
+ogur and mean 1
+ogur and shap 1
+ogy 3
+oh 10
+oh st 8
+oh st cluster 1
+oh term 1
+ohk 2
+ohlbach 1
+ohlman 1
+ohm 1
+ohp 1
+ohp project 1
+oi 5
+oi ar typ 1
+oi oe 1
+oi oi 1
+oi tg 1
+oi th list 1
+oid 2
+oid me 1
+oid nat 1
+oid nat me 1
+oid oid 1
+oid oid me 1
+oid typ 1
+oil 1
+oil reservoir 1
+oil reservoir siml 1
+oinput 1
+oinput dep 1
+oj 3
+oj accord 1
+oj inclus 1
+oj interm 1
+oj interm activ 1
+oj output 1
+oj output vect 1
+oj to produc 1
+oj2 1
+ojk 1
+ojk ojwjk 1
+ojk real valu 1
+ojp 1
+ojustif 1
+ojustif es 1
+ojustif es perm 1
+ojwjk 1
+ok 10
+ok and barbar 1
+ok as subderiv 1
+ok for output 1
+ok h inherit 1
+ok is defin 1
+ok of output 1
+ok right fin 1
+ok techn 1
+ok techn review 1
+ok tk 1
+okab 1
+okamur 1
+okeef 2
+okeef prop 1
+okeef prop le 1
+ol 9
+ol a ex 1
+ol a la 1
+ol a lun 1
+ol ander 1
+ol appear 1
+ol ar 1
+ol architectur 1
+ol architectur framework 1
+ol as head 1
+ol au 1
+ol au fon 1
+ol au point 1
+ol au traceur 1
+ol autom 1
+ol autom client 1
+ol autom object 1
+ol autom server 1
+ol avant 1
+ol avant par 1
+ol ba 1
+ol ba compon 1
+ol compl 1
+ol compl appl 1
+ol compon 1
+ol compon approach 1
+ol cr 1
+ol daggr 1
+ol daggr egat 1
+ol dan 1
+ol dan la 1
+ol dan le 1
+ol dattract 1
+ol de 3
+ol de changer 1
+ol de diff 1
+ol de la 2
+ol de linstruc 1
+ol de prolog 1
+ol def 1
+ol demand 1
+ol demand lat 1
+ol destampil 1
+ol devr 1
+ol devr etr 1
+ol dirig 1
+ol doit 1
+ol doit strict 1
+ol du 2
+ol du compilateur 1
+ol du point 1
+ol du program 1
+ol dun 1
+ol dun coupur 1
+ol e par 1
+ol ee 1
+ol ee du 1
+ol es 1
+ol es ind 1
+ol est 2
+ol est dinvalider 1
+ol est env 1
+ol est transf 1
+ol et est 1
+ol et le 1
+ol fondam 1
+ol fondam dan 1
+ol g el 1
+ol impliqu 1
+ol impliqu ee 1
+ol import dan 1
+ol init 1
+ol interfac 1
+ol is unnec 1
+ol lorsqu 1
+ol lorsqu celu 1
+ol majeur 1
+ol majeur dan 1
+ol object 1
+ol object conform 1
+ol object export 1
+ol obv 1
+ol obv sourc 1
+ol of cl 1
+ol of form1 1
+ol of formn 1
+ol ou 1
+ol ou par 1
+ol ou sp 1
+ol par 1
+ol par de 1
+ol par microcod 1
+ol par part 1
+ol particl 1
+ol particl jou 1
+ol perm 1
+ol perm de 1
+ol plus fin 1
+ol pour 1
+ol pour le 1
+ol pr 1
+ol prem 1
+ol prem de 1
+ol primord 1
+ol qu 1
+ol qu sont 1
+ol respectif 1
+ol respectif de 1
+ol se 1
+ol se situ 1
+ol secondair 1
+ol secondair de 1
+ol standard 1
+ol standard de 1
+ol suggest 1
+ol support 1
+ol sur 1
+ol sur tout 1
+ol technolog 1
+ol technolog work 1
+ol tr 1
+ol tr typ 1
+ol uc 1
+ol uniqu 1
+ol uniqu fus 1
+ol uniqu utiliserait 1
+ol valeur 1
+ol valeur retourn 1
+olafur 1
+olafur gudmundsson 1
+oland 1
+olariu 2
+olcoz 1
+old 29
+old algorithm 1
+old beggar 1
+old cop 2
+old cur 1
+old cur nod 1
+old dominion 2
+old edg 1
+old fac 1
+old fac form 1
+old featur 1
+old identif 1
+old in accord 1
+old inform 1
+old interfac 1
+old iter 1
+old iter spac 1
+old learn 1
+old libr 1
+old libr interfac 1
+old link 1
+old link cost 1
+old loop 1
+old loop variabl 1
+old man 1
+old nam 1
+old next hop 1
+old on 1
+old parent 1
+old parent pointer 1
+old payoff 1
+old payoff tim 1
+old per 1
+old per record 1
+old phy 1
+old phy addr 1
+old prob 1
+old prob distribut 1
+old root 2
+old root nod 1
+old rout 1
+old sourc 1
+old sourc ast 1
+old st 3
+old techniqu 1
+old theor 1
+old third 1
+old third parameter 1
+old valu 3
+old ver 3
+old x interfac 1
+oldenbourg 2
+oldenbourg verlag 1
+older 7
+older algorithm 1
+older imper 1
+older imper system 1
+older knowledg 1
+older langu 1
+older timesl 1
+oldest 1
+oldest stack 1
+oldest stack entr 1
+oldp 1
+oldp pi 1
+olectur 1
+olectur de 1
+olectur de propr 1
+olent 2
+olent la 1
+olent pa 1
+olent pa le 1
+oler 2
+oler ce 1
+oler ce expl 1
+oler la 1
+oler la validit 1
+oler leff 1
+oler leff ping 1
+oler lexpan 1
+oler lexpan de 1
+oliv 3
+oliv danv 1
+oliv research 1
+oliv research lim 1
+oliv ridoux 1
+oliv thibault 1
+oliver 1
+olk 1
+olldobler 1
+oller 1
+olson 3
+olson et al 1
+olter 1
+olthoff 1
+oltp 1
+oltp on lin 1
+oltr 1
+oltr de 1
+oltr de kalman 1
+om 28
+om a st 1
+om and rec 1
+om ar network 1
+om as mean 1
+om ca 1
+om ca wh 1
+om chailloux 1
+om el 1
+om failur 1
+om failur ap 1
+om failur exhibit 1
+om failur requir 1
+om failur us 1
+om fault 1
+om fault rev 1
+om for simpl 1
+om further 1
+om further detail 1
+om habituel 1
+om in subsequ 1
+om n 2f 1
+om n b3f2 1
+om or gener 1
+om or repeat 1
+om orthogonaux 1
+om orthogonaux sem 1
+om part 1
+om prim 1
+om protocol 1
+om stack 1
+om stack support 1
+om step 1
+om subscript 1
+om subscript oe 1
+om such fault 1
+om t2 1
+om test 1
+om th detail 1
+om th nod 1
+om th parameter 1
+om th proof 4
+om th rl 1
+om th subscript 1
+om th vect 1
+om th word 1
+om to rec 1
+om to sen 1
+om tr 1
+om tr algorithmiqu 1
+om tr di 1
+om tr rieman 1
+om triqu 1
+om triqu automatiqu 1
+om triqu dan 1
+om triqu de 1
+om triqu en 1
+om triqu habituel 1
+om triqu li 1
+om triqu nous 1
+om triqu peut 1
+om triqu si 1
+om triqu tr 1
+om triqu usuel 1
+om variabl 1
+om when unchang 1
+om92 1
+omal 1
+omanager 1
+omanuel 1
+omatch 1
+omeg 4
+omeg butterf 1
+omeg butterf cub 1
+omeg network 1
+omeg test 2
+omeg test framework 1
+omeg.math.alban.edu 1
+omegasub 1
+omg 1
+omg ar equ 1
+omid 1
+omlin 2
+omn 2
+omn of dg 1
+omn oracl 1
+omn oracl omn 1
+omnisc 3
+omnisc myop 1
+omnisc nar 1
+omnisc oracl 1
+omnisc oracl giv 1
+omnisc oracl mach 1
+omnisc oracl model 1
+omnisc oracl parallel 1
+omnisc oracl specl 1
+omnisc oracl ye 1
+omnisc specl 1
+omnisc specl multithread 1
+omnisc tr 1
+omron 1
+omron lun 1
+omt 1
+omt diagram 1
+on 54
+on acc 1
+on acc right 1
+on alread disc 1
+on ar empl 1
+on caus 1
+on com 1
+on de 2
+on de man 1
+on defin 1
+on defin nondetermin 1
+on describ 1
+on disc 1
+on drawn 1
+on embod 1
+on exper 1
+on for cach 1
+on for sort 1
+on for typ 1
+on in interpr 1
+on in non 1
+on le 1
+on le not 1
+on man 1
+on man phy 1
+on memor 1
+on obtain 1
+on of aquarius 1
+on out automat 1
+on par 1
+on par ken 1
+on par le 1
+on part 1
+on part ii 1
+on perform 1
+on pot 1
+on relev 1
+on satisf 1
+on satisf reason 1
+on search 1
+on shown 1
+on that actu 1
+on that lead 1
+on to keep 1
+on to run 1
+on tout 1
+on tout dabord 1
+on unav 1
+on unav catastroph 1
+on using 2
+on using connectiv 1
+on we stud 1
+on we us 1
+on yield 1
+oneil 1
+onestep 1
+onfeld 1
+ong 8
+ong ar 1
+ong effort 1
+ong effort try 1
+ong for design 1
+ong futur 1
+ong futur work 1
+ong guid 1
+ong research 1
+ong ten 1
+ong to improv 1
+ong work 1
+onir 1
+onir ce 1
+onir ce lo 1
+onir de 1
+onir de algorithm 1
+onir le 1
+onir un 1
+onir un dist 1
+onir un mesur 1
+onit 1
+onit ou 1
+onit ou autr 1
+onl 6
+onl at ftp.ic.forth.gr 1
+onl docum 1
+onl intersect 1
+onl learn 1
+onl part 1
+onl part evalu 1
+onot 1
+onot read 1
+onr 4
+onr contract 1
+onr contract number 1
+onr grant 1
+onr grant n00014 1
+onr under contract 1
+ont 4
+ont accept 1
+ont actuel 1
+ont alor 1
+ont alor montr 1
+ont an 1
+ont au 1
+ont au moin 1
+ont aus 1
+ont aus envisag 1
+ont aus jou 1
+ont aus leur 1
+ont besoin 1
+ont ch 1
+ont ch de 1
+ont chacun 1
+ont chacun leur 1
+ont cherch 1
+ont conduit 1
+ont couver 1
+ont couver le 1
+ont d ej 2
+ont d etermin 1
+ont d evelop 1
+ont de 2
+ont de bruit 1
+ont de con 1
+ont de el 1
+ont de project 1
+ont direct 1
+ont direct util 1
+ont disparu 1
+ont donc 1
+ont donc naturel 1
+ont donc pu 1
+ont egal 1
+ont egal perm 1
+ont egal prop 1
+ont engendr 1
+ont estim 1
+ont etud 1
+ont eu 1
+ont eu lieu 1
+ont exp 1
+ont fait 1
+ont fait la 1
+ont introduit 1
+ont introduit un 1
+ont la 1
+ont la bon 1
+ont leur 1
+ont leur dern 1
+ont leur int 1
+ont lieu 1
+ont lieu par 1
+ont lieu sur 1
+ont mesur 1
+ont mi 2
+ont mi en 2
+ont montr 4
+ont n eanmoin 1
+ont paru 1
+ont paru peu 1
+ont perm 2
+ont perm de 1
+ont perm didentioer 1
+ont perm dobtenir 1
+ont plus de 1
+ont port 1
+ont pour 2
+ont pour but 1
+ont pour eff 1
+ont pour etiqu 1
+ont pour foncteur 1
+ont prop 1
+ont pu 1
+ont pu etr 1
+ont r esult 1
+ont re cu 1
+ont recherch 1
+ont rej 1
+ont relu 1
+ont relu ce 1
+ont serv 2
+ont serv doutil 1
+ont soulign 1
+ont sug 1
+ont sug er 1
+ont sur 1
+ont sur la 1
+ont toujour 2
+ont toujour un 1
+ont toutef 1
+ont un 1
+ont un dur 1
+ont un port 1
+ontar 10
+ontar london 1
+ontar london ontar 1
+ontar n6a 1
+ontar n6a 5b7 1
+ontolog 2
+ontolog character 1
+ontolog natur 1
+ontolog natur domain 1
+oo 3
+oo cod 1
+oo cod qu 1
+oo fash 1
+oo is tak 1
+oo langu 1
+oo langu famil 1
+oo not 1
+oo pasc 1
+oo pasc siml 1
+oo program 1
+oo softwar 1
+oo softwar system 1
+oo system 1
+oolog 1
+oolog st.ps.z 1
+oolp 1
+oolp ha com 1
+oolp langu 1
+oolp langu ba 1
+oolp program 1
+oolp se 1
+oolp system 1
+oop 1
+oop and lp 1
+oop langu 1
+oop wh 1
+oopsl 6
+oopsl86 1
+oopsl87 1
+oopsl89 2
+oopsl90 1
+oopsl95 1
+ooutput 1
+ooutput dep 1
+op 36
+op 1s 1
+op a connect 1
+op a rang 1
+op amount 1
+op and cl 1
+op and operand 1
+op ar rel 1
+op as for 1
+op as ind 1
+op command 1
+op command respect 1
+op command situ 1
+op er 1
+op er ee 1
+op erand 1
+op erand qu 1
+op erant 2
+op erant en 1
+op erant sur 1
+op erat 5
+op erat activ 1
+op erat arithm 1
+op erat assoc 1
+op erat conduir 1
+op erat cour 1
+op erat dan 1
+op erat de 4
+op erat dempil 1
+op erat den. 1
+op erat effectu 2
+op erat el 2
+op erat fondam 1
+op erat nest 1
+op erat par 1
+op erat peut 1
+op erat qu 2
+op erat rel 1
+op erat se 1
+op erat sont 2
+op erat suiv 1
+op erateur 3
+op erateur ae 1
+op erateur al 1
+op erateur classiqu 1
+op erateur de 3
+op erateur dit 1
+op erateur fondamentaux 1
+op erateur fourn 1
+op erateur inf 1
+op erateur o1 1
+op erateur ont 1
+op erateur peuv 1
+op erateur qu 1
+op erateur sinspir 1
+op erateur sont 1
+op erateur standard 1
+op erateur sur 1
+op erateur tout 1
+op erationnel 4
+op erationnel au 1
+op erationnel de 1
+op erationnel du 1
+op erationnel dun 1
+op erationnel qu 1
+op erationnel si 1
+op eratoir 1
+op eratoir qu 1
+op erent 1
+op erent sur 1
+op erent un 1
+op execut 1
+op execut order 1
+op fil 1
+op ha compl 1
+op is part 1
+op j branch 1
+op lookup 1
+op ml 1
+op ml mult 1
+op monit 1
+op monit algorithm 1
+op norm 1
+op norm for 1
+op oep 1
+op op 1
+op or inclus 1
+op or keep 1
+op parent 1
+op parent grandpar 1
+op peter 1
+op peter paul 1
+op rat 1
+op rat atomiqu 1
+op rat chirurg 1
+op rat de 1
+op rat particl 1
+op rat si 1
+op rat statistiqu 1
+op rat util 1
+op rateur 1
+op repr 1
+op rl 1
+op schem 1
+op synchron 1
+op synchron primitiv 1
+op targ 1
+op that conflict 1
+op that constitut 1
+op that occur 1
+op to actu 1
+op to contour 1
+op to dec 1
+op to develop 1
+op to dumb 1
+op to explicit 1
+op to fl 1
+op to fr 1
+op to gener 1
+op to individu 1
+op to infer 1
+op to qu 1
+op to random 1
+op to self 1
+op to sourc 1
+op to top 1
+op to undirect 1
+op to variabl 1
+op und 1
+op und requir 1
+op upd 1
+op which acquir 1
+op which contain 1
+op.cit 1
+op0s 1
+op0s act 1
+opal 1
+opaqu 4
+opaqu a tout 1
+opaqu anyw 1
+opaqu dat 1
+opaqu dat block 1
+opaqu record 1
+opaqu record dat 1
+opaqu to emph 1
+opcod 3
+opcod mak 1
+opcount 1
+opcountamd 1
+opcountamd opcountwgp 1
+opcountwgp 1
+opdyk 1
+open 3
+open.ac.uk 1
+openshop 1
+openshop con 1
+openshop preempt 1
+openshop preempt schedl 1
+openshop problem 1
+openshop problem giv 1
+openshop schedl 1
+openshop schedl problem 1
+opensim 1
+openvm 1
+openvm period 1
+openvm period inform 1
+oper 104
+oper a siml 1
+oper acquir 1
+oper ad 1
+oper affect 1
+oper affect larger 1
+oper again tak 1
+oper al affect 1
+oper allow 3
+oper allow client 1
+oper among organ 1
+oper analog 1
+oper and argum 1
+oper and assum 1
+oper and auxil 1
+oper and condit 1
+oper and denot 1
+oper and fur. 1
+oper and ge 1
+oper and map 1
+oper and oe 1
+oper and perform 1
+oper and pr 1
+oper and select 1
+oper and sem 1
+oper and st 1
+oper and subtransact 1
+oper and tempor 1
+oper and thus 1
+oper and valu 1
+oper appear 2
+oper appl 1
+oper ar appl 2
+oper ar atom 1
+oper ar avail 1
+oper ar bound 1
+oper ar compl 1
+oper ar de 1
+oper ar defin 4
+oper ar del 1
+oper ar design 1
+oper ar distribut 2
+oper ar elimin 1
+oper ar eventu 1
+oper ar execut 2
+oper ar giv 1
+oper ar group 1
+oper ar ind 1
+oper ar inst 1
+oper ar log 1
+oper ar model 1
+oper ar near 1
+oper ar new 1
+oper ar pa 1
+oper ar pack 1
+oper ar perform 3
+oper ar pr 1
+oper ar preserv 1
+oper ar reduc 1
+oper ar reflect 1
+oper ar regar 1
+oper ar requir 1
+oper ar retain 1
+oper ar rout 1
+oper ar separ 2
+oper ar shown 1
+oper ar simpl 1
+oper ar suff 1
+oper arbitr 1
+oper as abort 1
+oper as effect 1
+oper as justif 1
+oper as ordin 1
+oper as shorthand 1
+oper as shown 1
+oper assoc 2
+oper assum 1
+oper at li 1
+oper at tim 1
+oper at user 1
+oper avail 2
+oper behavior 1
+oper being perform 1
+oper bind 1
+oper boil 1
+oper bound 1
+oper break 1
+oper but repeat 1
+oper by comp 1
+oper by proc 1
+oper by term 1
+oper cal ask 1
+oper cal dispatch 1
+oper cal segm 1
+oper cal shuffl 1
+oper can reduc 1
+oper can return 1
+oper cannot upd 1
+oper cod 1
+oper commut 2
+oper compl 3
+oper comput 1
+oper con 2
+oper con datab 1
+oper con proper 1
+oper con shadow 1
+oper condit 1
+oper conflict 1
+oper consider 1
+oper contribut 1
+oper control 1
+oper correct 1
+oper count 1
+oper cover 1
+oper cr 1
+oper creat 1
+oper def 1
+oper defin 3
+oper definit 1
+oper degrad 1
+oper del 1
+oper deletemin 1
+oper deletemin del 1
+oper dep 3
+oper deriv 1
+oper describ 1
+oper determin 1
+oper do contribut 1
+oper dur execut 1
+oper dur und 1
+oper dynam 1
+oper dynam using 1
+oper each typ 1
+oper ec 1
+oper elim 1
+oper elim rl 1
+oper elimin 1
+oper encounter 1
+oper ensur 1
+oper environm 2
+oper environm analyst 1
+oper equiv 2
+oper establ 1
+oper etc 1
+oper except exp 1
+oper execut 2
+oper execut condit 1
+oper export 1
+oper expr 1
+oper f defin 1
+oper fi 1
+oper first follow 1
+oper first refer 1
+oper flight 1
+oper flight program 1
+oper flush 1
+oper for announc 1
+oper for build 1
+oper for guard 1
+oper for inter 1
+oper for minim 1
+oper for op 1
+oper for q1.3 1
+oper for q1.4 1
+oper for reach 1
+oper for specif 1
+oper for tim 1
+oper forc 1
+oper forc dat 1
+oper form 1
+oper formaliz 1
+oper from acc 1
+oper from anywh 1
+oper from produc 1
+oper fun 1
+oper funct 1
+oper further 1
+oper further apart 1
+oper ge 1
+oper ge rid 1
+oper gener 1
+oper ha heav 1
+oper ha wid 1
+oper hold 1
+oper impl 1
+oper in commun 1
+oper in comparison 1
+oper in compl 1
+oper in const 1
+oper in dataflow 1
+oper in eram 1
+oper in exclus 1
+oper in execut 1
+oper in incompl 1
+oper in jl 1
+oper in pa 1
+oper in parallel 1
+oper in proc 1
+oper in quest 1
+oper in rever 1
+oper in step 2
+oper in tim 1
+oper in tot 1
+oper in transact 1
+oper in tt 1
+oper in typ 1
+oper inclus 2
+oper incr 1
+oper ind 1
+oper indep 2
+oper inser 2
+oper inser inser 1
+oper int pi 1
+oper interfac 1
+oper introduc 1
+oper introduc rl 1
+oper involut 4
+oper involut pa 1
+oper involut thousand 1
+oper is appl 1
+oper is approxim 1
+oper is assign 1
+oper is car 1
+oper is compl 1
+oper is cur 1
+oper is defin 4
+oper is del 1
+oper is determin 1
+oper is es 1
+oper is execut 3
+oper is exp 1
+oper is giv 1
+oper is induc 1
+oper is init 1
+oper is introduc 1
+oper is invok 1
+oper is lambd 1
+oper is meant 1
+oper is nec 1
+oper is neglig 1
+oper is perform 5
+oper is regl 1
+oper is replac 1
+oper is requir 1
+oper is sent 1
+oper is simil 1
+oper is tag 1
+oper is transm 1
+oper j top 1
+oper lead 1
+oper leav 1
+oper level 1
+oper level number 1
+oper lik bar 1
+oper lik def 1
+oper lik evalu 1
+oper lik overlap 1
+oper lik sort 1
+oper log 1
+oper log record 1
+oper lookup 1
+oper lookup asser 1
+oper man 1
+oper map 2
+oper map dispid 1
+oper mar 1
+oper mar graph 1
+oper mar interact 1
+oper may ec 1
+oper mod 1
+oper model 2
+oper modif 1
+oper mov 1
+oper must therefor 1
+oper nam 2
+oper navig 1
+oper nec 1
+oper nec 2oe 1
+oper need recov 1
+oper not dep 1
+oper object 1
+oper obtain 1
+oper occur 1
+oper occur instantan 1
+oper of comput 1
+oper of cour 1
+oper of cutout 1
+oper of direct 1
+oper of figur 1
+oper of ml 1
+oper of mor 1
+oper of proc 1
+oper of prolog 1
+oper of read 1
+oper of rel 1
+oper of shuffl 1
+oper of siz 1
+oper of subtransact 1
+oper of tr 1
+oper of tripl 1
+oper of unif 1
+oper on behalf 1
+oper on comput 1
+oper on constraint 1
+oper on deriv 1
+oper on direct 1
+oper on disjoint 1
+oper on gener 1
+oper on graph 1
+oper on hypercub 1
+oper on iand 1
+oper on iin 1
+oper on integer 2
+oper on log 1
+oper on longer 1
+oper on matr 1
+oper on modern 1
+oper on nod 1
+oper on oe 1
+oper on per 1
+oper on polygon 1
+oper on polyhedr 1
+oper on proc 1
+oper on rel 1
+oper on sld 1
+oper on sol 1
+oper on st 1
+oper on thread 1
+oper on vi 1
+oper onl concern 1
+oper onl rearrang 1
+oper op 3
+oper open 1
+oper operand 1
+oper or lower 1
+oper or rl 1
+oper outlin 1
+oper over tim 1
+oper overload 1
+oper overload exper 1
+oper p comput 1
+oper p turn 1
+oper pa 1
+oper pa multipl 1
+oper pack 1
+oper pair 1
+oper pair se 1
+oper part 1
+oper perform 6
+oper ph 1
+oper pl 1
+oper point 2
+oper pr 1
+oper prepar 1
+oper prepar futur 1
+oper problem 1
+oper problem solut 1
+oper proper 1
+oper prov 1
+oper rang 2
+oper read 1
+oper receiv 1
+oper reflect 1
+oper rel 1
+oper remov 1
+oper reportk 1
+oper repr 1
+oper requir 7
+oper requir decompr 1
+oper research 8
+oper research appl 1
+oper research letter 2
+oper result 1
+oper return 3
+oper row 1
+oper row tim 1
+oper rplac 1
+oper s1 1
+oper s2 1
+oper s2 read 1
+oper s2 writ 1
+oper s6 1
+oper scenar 1
+oper scheduler 1
+oper schem 1
+oper schem implicit 1
+oper schem upd 1
+oper select 1
+oper sem 9
+oper sem ba 1
+oper sem pr 1
+oper sem wh 1
+oper sen 1
+oper sequ 1
+oper show 1
+oper sign 1
+oper sign inclus 1
+oper simil 1
+oper simultan 1
+oper simultan execut 1
+oper specif 1
+oper st1 1
+oper start 1
+oper strateg 1
+oper strength 1
+oper subtyp 1
+oper support 3
+oper system 26
+oper system cach 1
+oper system design 1
+oper system ext 1
+oper system featur 1
+oper system follow 1
+oper system interfac 1
+oper system level 1
+oper system manufacturer 1
+oper system memor 1
+oper system principl 2
+oper system prov 1
+oper system review 3
+oper system scheduler 1
+oper system serv 1
+oper system siml 1
+oper system softwar 1
+oper tag 1
+oper tak 2
+oper tak forml 1
+oper tak polynom 1
+oper th remain 1
+oper th templ 1
+oper that acc 1
+oper that caus 1
+oper that deal 1
+oper that impl 1
+oper that incr 1
+oper that occur 1
+oper that produc 1
+oper that purg 1
+oper that read 1
+oper that rel 1
+oper that spawn 1
+oper that touch 1
+oper that transfer 1
+oper that upd 2
+oper that writ 1
+oper then select 1
+oper through dynam 1
+oper thus 1
+oper thus perm 1
+oper to atom 1
+oper to check 1
+oper to comput 1
+oper to determin 1
+oper to elim 1
+oper to fetch 1
+oper to manipl 1
+oper to model 1
+oper to produc 1
+oper to reach 1
+oper to reconstruc 2
+oper to specl 1
+oper train 1
+oper transform 1
+oper transform plan 1
+oper trim 1
+oper turn 1
+oper tw 1
+oper under program 1
+oper unlock 1
+oper unlock lock 1
+oper upd 1
+oper upd us 1
+oper us 1
+oper using 4
+oper using genet 1
+oper using tradit 1
+oper vi program 1
+oper wa appl 1
+oper wa design 1
+oper wa develop 1
+oper wa execut 1
+oper we ge 1
+oper wer introduc 1
+oper wer measur 1
+oper when appl 1
+oper when return 1
+oper which allow 1
+oper which construc 1
+oper which map 1
+oper which requir 1
+oper which shar 1
+oper which tak 1
+oper which uniqu 1
+oper which us 1
+oper whil mlt 1
+oper wil continu 1
+oper wil dep 1
+oper wil eventu 1
+oper wil honor 1
+oper window 1
+oper with block 1
+oper with ident 1
+oper with loc 1
+oper with respect 1
+oper with threshold 1
+oper with window 1
+oper with zer 1
+oper without exc 1
+oper without interrupt 1
+oper without sort 1
+oper without variabl 1
+oper work 2
+oper would ea 1
+oper. 2
+oper2 1
+operand 8
+operand and instruc 1
+operand ar avail 1
+operand expr 1
+operand field 1
+operand list 1
+operand list list 1
+operand prepar 1
+operand rel 1
+operand rel form 1
+operat 1
+operat criter 1
+opez 1
+opez fragu 1
+opfailur 1
+opfailur l opreason 1
+opin 3
+opin about publ 1
+opin from exper 1
+opin gain 1
+opin on ec 1
+opin on object 1
+opin simil 1
+opinion 3
+opinion and talk 1
+opinion did ar 1
+opj 1
+opportun 15
+opportun approach 1
+opportun approach allow 1
+opportun dec 1
+opportun for abus 1
+opportun for adapt 1
+opportun for confirm 1
+opportun for improv 1
+opportun memor 1
+opportun plan 1
+opportun reason 1
+opportun to adapt 1
+opportun to becom 1
+opportun to car 1
+opportun to chang 1
+opportun to custom 1
+opportun to extract 1
+opportun to optim 1
+opportun to run 1
+opportun to select 1
+opportun to structur 1
+opportun to switch 1
+opportun to us 1
+opportun unprec 1
+opposit 15
+opposit angl 1
+opposit correspon 1
+opposit direct 5
+opposit extrem 2
+opposit extrem wh 1
+opposit order 1
+opposit plan 1
+opposit point 1
+opposit ver 1
+opr 1
+opr eparer 1
+opr eparer le 1
+opreason 1
+oprivil 1
+oprivil eg 1
+oprivil eg es 1
+opstatus 1
+opsucc 1
+opsucc record 1
+opt 37
+opt and pl 1
+opt ar interpr 1
+opt ar replac 1
+opt argum 1
+opt argum argum 1
+opt as answer 1
+opt as follow 1
+opt as shown 1
+opt as specif 1
+opt attempt 1
+opt au 1
+opt au del 1
+opt avail 1
+opt be control 1
+opt character 1
+opt character recognit 1
+opt continu 1
+opt dan 1
+opt dan le 1
+opt de 2
+opt de ce 1
+opt de compil 1
+opt dev 1
+opt dev rapid 1
+opt disk 1
+opt ec 1
+opt engineer 1
+opt est 2
+opt est beaucoup 1
+opt est dintroduir 1
+opt est inver 1
+opt est meilleur 1
+opt est moin 1
+opt est notabl 1
+opt est sensibl 1
+opt et est 1
+opt et fs 1
+opt fiber 1
+opt fiber implem 1
+opt for cl 1
+opt for gener 1
+opt for sem 1
+opt for slot 1
+opt for user 1
+opt fs 1
+opt fs opt 1
+opt graph 1
+opt graph interfac 1
+opt guid 1
+opt hardwar 1
+opt identif 1
+opt identif denot 1
+opt impl 1
+opt implem 1
+opt inclus 3
+opt inclus cl 1
+opt is expr 1
+opt is follow 1
+opt is recogn 1
+opt j cl 1
+opt lim 1
+opt lim la 1
+opt menu 1
+opt na 1
+opt na pa 1
+opt of attempt 1
+opt of lim 1
+opt of using 2
+opt part 1
+opt perm 1
+opt perm de 1
+opt pp 1
+opt pp opt 1
+opt produ 1
+opt prov 1
+opt r esult 1
+opt reduc 1
+opt reduc fil 1
+opt restrict 1
+opt restrict claus 1
+opt se 1
+opt siml 1
+opt soc 1
+opt specif 1
+opt technolog 1
+opt technolog matur 1
+opt to attempt 1
+opt to build 1
+opt to emph 1
+opt to reduc 1
+opt to scal 1
+opt to shuffl 1
+opt to tak 1
+opt turn 1
+opt user 1
+opt user involut 1
+opt util 1
+opt util au 1
+opt waveguid 1
+opt when init 1
+opt which model 1
+opt. 1
+optim 79
+optim a lucarn 1
+optim a tout 1
+optim abstract 1
+optim abstract counterpart 1
+optim abstract oper 1
+optim abstract sem 1
+optim abstract ver 1
+optim act 2
+optim act plac 1
+optim adapt 1
+optim adapt schedl 1
+optim algorithm 5
+optim almon 1
+optim almon tr 1
+optim alor 1
+optim alor quel 1
+optim and an 1
+optim and approxim 1
+optim and ind 1
+optim and load 1
+optim and mach 1
+optim and partit 1
+optim and schedl 1
+optim and sub 1
+optim approach 2
+optim arboresc 1
+optim arboresc search 1
+optim architectur 1
+optim architectur comprom 1
+optim assum 2
+optim augm 1
+optim ba 1
+optim ba np 1
+optim between imag 1
+optim bien 1
+optim bound 1
+optim brain 1
+optim brain dam 1
+optim brain surgeon 1
+optim branch 1
+optim broadcast 1
+optim but requir 1
+optim by mic 1
+optim by part 1
+optim by using 1
+optim c compiler 1
+optim ca 2
+optim cal 1
+optim cal rl 1
+optim cap 1
+optim ch 2
+optim chunk 2
+optim chunk siz 2
+optim classiqu 1
+optim cm 1
+optim cm schem 1
+optim cod 3
+optim cod remain 1
+optim color 1
+optim comb 1
+optim compiler 2
+optim compl 1
+optim compr 2
+optim comput 2
+optim comput speedup 1
+optim con 1
+optim condit 1
+optim configur 1
+optim congest 1
+optim congest valu 1
+optim connect 1
+optim constraint 1
+optim construc 1
+optim construc interconnect 1
+optim cost 1
+optim cover 1
+optim criter 1
+optim cruc 1
+optim cruc implem 1
+optim cuml 1
+optim cuml payoff 1
+optim dan 1
+optim dan la 1
+optim dappel 1
+optim dappel termin 1
+optim dat 1
+optim dat transfer 1
+optim de 2
+optim de ae 1
+optim de bloc 1
+optim de fonct 1
+optim de la 1
+optim decluster 1
+optim degr 2
+optim design 1
+optim design classif 1
+optim determin 1
+optim determin parallel 1
+optim determin sort 1
+optim direct 1
+optim dist 1
+optim dist threshold 1
+optim distribut 3
+optim distribut algorithm 1
+optim distribut sort 1
+optim du 1
+optim du chapitr 1
+optim dun 1
+optim dun algorithm 1
+optim dur learn 1
+optim ee 2
+optim ee de 1
+optim ee don 1
+optim ee du 1
+optim ee est 1
+optim ee par 1
+optim ee rest 1
+optim ee sur 1
+optim est 1
+optim est egal 1
+optim estim 1
+optim etud 1
+optim etud ee 1
+optim fil 1
+optim fil distribut 1
+optim for gener 1
+optim for network 1
+optim for neur 1
+optim for parallel 1
+optim for spat 1
+optim for supercomputer 2
+optim for tempor 1
+optim for triangu. 1
+optim form 1
+optim fortran 1
+optim framework 1
+optim framework transl 1
+optim framework using 1
+optim funct 1
+optim funct langu 1
+optim fundam 1
+optim fundam cycl 1
+optim ga 1
+optim gcsp 1
+optim glob 1
+optim glob quel 1
+optim implem 3
+optim in order 1
+optim in tempor 1
+optim in term 2
+optim increm 1
+optim increm us 1
+optim init 1
+optim init seed 1
+optim interconnect 1
+optim interconnect pattern 1
+optim is reach 1
+optim is shown 1
+optim is test 1
+optim issu 1
+optim junct 1
+optim junct tr 1
+optim la 1
+optim la localit 1
+optim last return 1
+optim leader 1
+optim leader elect 1
+optim level 1
+optim lik inlin 1
+optim loc 2
+optim locaux 1
+optim map 1
+optim memor 2
+optim memor order 1
+optim memor reclam 1
+optim method 4
+optim method appear 1
+optim method comb 1
+optim model 1
+optim multipl 1
+optim multipl search 1
+optim mut 1
+optim mut rat 1
+optim network 1
+optim network structur 1
+optim neur 1
+optim neur network 1
+optim non 2
+optim non block 1
+optim non lin 1
+optim nonlin 1
+optim nonlin funct 1
+optim number 4
+optim object 1
+optim of cl 1
+optim of dataflow 1
+optim of fl 1
+optim of me 1
+optim of parallel 2
+optim of rout 1
+optim of tr 1
+optim on mesh 1
+optim on synchron 1
+optim on tdfg 1
+optim oper 1
+optim order 2
+optim out 1
+optim p oper 1
+optim par 1
+optim par de 1
+optim par en 1
+optim parallel 2
+optim parallel algorithm 1
+optim parallel init 1
+optim parameter 1
+optim path 1
+optim pebbl 1
+optim perform 4
+optim plac 1
+optim posit 2
+optim posit ec 1
+optim pour 2
+optim pour le 1
+optim pour tout 1
+optim prim 1
+optim prior 1
+optim prior bi 1
+optim problem 9
+optim problem accord 1
+optim problem becom 1
+optim problem interreduc 1
+optim problem ultim 1
+optim procedur 2
+optim proceed 1
+optim program 1
+optim program transform 1
+optim prolog 1
+optim prolog compiler 1
+optim prop 1
+optim prop ee 1
+optim protocol 1
+optim psnr 1
+optim psnr estim 1
+optim r esult 1
+optim random 1
+optim random algorithm 1
+optim reduc 1
+optim rel 1
+optim replac 1
+optim replac behavior 1
+optim requ 1
+optim requ deux 1
+optim resourc 1
+optim resourc alloc 1
+optim respon 1
+optim respon tim 1
+optim result 2
+optim return 1
+optim return rl 1
+optim rout 2
+optim san contraint 1
+optim schedl 2
+optim schedl quick 1
+optim se 3
+optim search 1
+optim search algorithm 1
+optim select 1
+optim sequ 2
+optim sequ algorithm 1
+optim sequ program 1
+optim shallow 1
+optim shallow backtrack 1
+optim should support 1
+optim softwar 1
+optim softwar multicast 1
+optim solut 9
+optim solut ec 1
+optim solut valu 1
+optim sort 1
+optim sort algorithm 1
+optim spac 2
+optim spac distribut 1
+optim structur 1
+optim sub 1
+optim sub select 1
+optim subrout 1
+optim subrout libr 1
+optim supercompiler 1
+optim surfac 1
+optim surfac reconstruc 1
+optim switch 2
+optim switch algorithm 1
+optim switch o4 1
+optim synchron 1
+optim system 2
+optim system configur 2
+optim tail 1
+optim tail recur 1
+optim task 1
+optim techniqu 8
+optim techniqu ba 1
+optim techniqu using 1
+optim textur 1
+optim textur dist 1
+optim th architectur 1
+optim th chunk 1
+optim th ga 1
+optim th implem 1
+optim th mean 1
+optim th memor 1
+optim th nonlin 1
+optim th number 1
+optim th part 1
+optim th ph 1
+optim th respon 1
+optim th result 1
+optim th unit 1
+optim th us 1
+optim their rel 1
+optim theor 1
+optim threshold 1
+optim tim 1
+optim to chang 1
+optim to decluster 1
+optim to prov 1
+optim to reduc 2
+optim topolog 2
+optim tot 1
+optim tot commun 1
+optim tr 2
+optim tradeoff 1
+optim transact 1
+optim transact com 1
+optim transform 2
+optim transpar 1
+optim triangl 1
+optim un 1
+optim un fonct 1
+optim under constraint 1
+optim upd 1
+optim upd yield 1
+optim upper 1
+optim us 2
+optim using 1
+optim using part 1
+optim valu 4
+optim valu kopt 1
+optim var 1
+optim var du 1
+optim wa incr 1
+optim wer introduc 1
+optim when log 1
+optim wir 1
+optim with dat 1
+optim with dioeer 1
+optim with ext 1
+optim with joint 1
+optimaux 1
+optimierung 1
+optimierung technisch 1
+optimierung technisch system 1
+optimierung von 1
+optimierung von computer 1
+optimiser 3
+optimiser direct 1
+optimiser direct la 1
+optimiser in comparison 1
+optimiser la 1
+optimiser la localit 1
+optimiser le 1
+optimiser le par 1
+optimiser par 1
+optimiser par le 1
+optimiser un 1
+optimiser un fonct 1
+optimiz 1
+optimiz commun 1
+optiqu 1
+optiqu orient 1
+optm 1
+optm th perform 1
+or 11
+or ar discr 1
+or canad 1
+or de 1
+or de form 1
+or de probabilit 1
+or de statistiqu 1
+or et son 1
+or et un 1
+or facilit 1
+or facilit chang 1
+or g om 1
+or ha mad 1
+or it del 1
+or it div 1
+or me 1
+or ne 1
+or ne concernait 1
+or of bs 1
+or peut 1
+or peut tr 1
+or rever 1
+or using 1
+or using orthonorm 1
+or using unit 1
+or variabl 1
+or86 1
+oracl 4
+oracl abil 1
+oracl abil del 1
+oracl allow 1
+oracl allow renam 1
+oracl and forc 1
+oracl and lin 1
+oracl and mach 1
+oracl and mov 1
+oracl and myop 1
+oracl and spec 1
+oracl ar ident 1
+oracl brakep 1
+oracl brakep deriv 1
+oracl branch 1
+oracl branch predict 1
+oracl by mak 1
+oracl can se 1
+oracl enginest 1
+oracl even com 1
+oracl giv 1
+oracl hav unlim 1
+oracl is giv 1
+oracl level 1
+oracl lik branch 1
+oracl mach 1
+oracl mach model 1
+oracl measur 1
+oracl model 1
+oracl multithread 1
+oracl multithread supersc 1
+oracl omn 1
+oracl omn oracl 1
+oracl onl account 1
+oracl oracl 1
+oracl oracl omn 1
+oracl parallel 1
+oracl parallel drop 1
+oracl perform 1
+oracl perform signif 1
+oracl prop 1
+oracl retain 1
+oracl schedl 1
+oracl schedl oper 1
+oracl specl 1
+oracl specl multithr 1
+oracl test 1
+oracl which determin 1
+oracl ye 1
+oracl ye disambig 1
+oracl ye heap 1
+oracl ye stack 1
+orang 1
+orbit 1
+orchestr 1
+ord 4
+ord ac 1
+ord th loc 1
+order 120
+order 4t 1
+order accord 2
+order aim 1
+order al aid 1
+order algorithm 3
+order algorithm cur 1
+order algorithm follow 1
+order algorithm involut 1
+order algorithm regard 1
+order algorithm show 1
+order among block 1
+order an lp 1
+order and comput 1
+order and den 1
+order and determin 1
+order and graph 1
+order and implementationdep 1
+order and list 1
+order and membership 1
+order and po 1
+order and privileg 1
+order and rol 1
+order and simp 1
+order and symbol 1
+order and unorder 1
+order and wgp 1
+order and wh 1
+order approach 1
+order ar disc 1
+order ar preserv 1
+order arrang 1
+order as describ 1
+order asser 1
+order automat 1
+order automat cr 1
+order automat form 1
+order axiom 1
+order ba 1
+order between subsequ 1
+order between weak 1
+order bit 1
+order bit serv 1
+order bound 1
+order bound quantif 1
+order build 1
+order build block 1
+order by appl 1
+order by const 1
+order by decr 1
+order by electron 1
+order by inclus 1
+order by interview 1
+order by observ 1
+order ca 1
+order calculus 1
+order cl 2
+order cl assoc 1
+order cod 1
+order command 1
+order condit 1
+order condit dep 1
+order consensus 1
+order constraint 1
+order constraint program 1
+order construc 1
+order decept 1
+order decept funct 1
+order defin 1
+order deliv 1
+order depth 1
+order deriv 2
+order determin 1
+order differ typ 1
+order domain 1
+order dynam 1
+order dynam log 1
+order effect 1
+order encounter 1
+order ent 1
+order equ 1
+order equ rel 1
+order equiv 1
+order ev pr 1
+order evalu 1
+order exhaust 1
+order expr 2
+order expr exact 1
+order expr involut 1
+order fair 1
+order faster 1
+order first plac 1
+order foc 1
+order foc context 1
+order for hk 1
+order for kind 1
+order for match 2
+order for solut 1
+order for spar 1
+order forest 1
+order forml 1
+order forml oe 1
+order fragm 1
+order from nearest 1
+order funct 4
+order funct definit 1
+order funct langu 1
+order funct program 1
+order funct symbol 1
+order gener 2
+order genet 1
+order genet algorithm 1
+order giv 2
+order grad 1
+order heter 1
+order heter algebr 1
+order heur 1
+order in accur 1
+order in hk 1
+order in incr 1
+order in lexicograph 1
+order in lin 1
+order in oe 1
+order in parallel 1
+order in recur 1
+order in scal 2
+order in ss 1
+order in ss0 1
+order in term 1
+order in transact 1
+order ind 2
+order inequ 1
+order inequ constraint 1
+order inform 2
+order inform handl 1
+order is an 1
+order is assum 1
+order is calcl 1
+order is desir 1
+order is domin 1
+order is equiv 1
+order is imp 1
+order is introduc 1
+order is particl 1
+order is plac 1
+order is select 1
+order it requir 1
+order key 1
+order lexicograp 1
+order lin 1
+order lin log 1
+order link 1
+order link chang 1
+order list 1
+order log 6
+order log car 1
+order log langu 1
+order log program 1
+order lp 1
+order mak 1
+order matr 1
+order me 2
+order me arriv 1
+order me construc 1
+order mean 1
+order method 2
+order most specif 1
+order nk 1
+order nnzosl 1
+order nnzosl nfosl 1
+order nondeterm 1
+order not 1
+order number 1
+order of acc 1
+order of act 1
+order of appear 1
+order of argum 1
+order of arriv 1
+order of childr 1
+order of complec 1
+order of decr 1
+order of dynam 1
+order of ecol 1
+order of emb 1
+order of evalu 1
+order of event 4
+order of execut 1
+order of f0 1
+order of for 1
+order of header 1
+order of inst 1
+order of instruc 1
+order of inver 1
+order of known 1
+order of magnitud 11
+order of map 1
+order of maxim 1
+order of me 1
+order of narx 1
+order of network 1
+order of nod 2
+order of pack 1
+order of peer 1
+order of plac 1
+order of pointer 1
+order of polynom 2
+order of pr 1
+order of prompt 1
+order of receipt 1
+order of remov 1
+order of rol 1
+order of row 1
+order of se 1
+order of senior 1
+order of spar 1
+order of specif 1
+order of st 1
+order of ten 1
+order of tot 1
+order of transm 1
+order on 1
+order on alphab 1
+order on ch 1
+order onl ap 1
+order oper 1
+order or equ 1
+order or numer 1
+order or permut 1
+order or sequ 1
+order or weight 1
+order orient 1
+order orient tr 1
+order over md 1
+order overlap 1
+order overlap rl 1
+order pack 2
+order pack transm 1
+order pair 1
+order pair pb 1
+order partit 1
+order partit hp 1
+order pl 1
+order pn 1
+order pointer 1
+order pointer ba 1
+order polymorph 1
+order polymorph calculus 1
+order polynom 1
+order pr 4
+order pr calculus 3
+order pr calculus4 1
+order preserv 3
+order preserv condit 1
+order preserv conflict 1
+order preserv list1 1
+order preserv sen 1
+order problem 1
+order problem assoc 1
+order proc 1
+order procedur 1
+order produc 1
+order program 2
+order program featur 1
+order proper 1
+order protocol 1
+order protocol maintain 1
+order protocol pr 1
+order pur 1
+order pur funct 1
+order qu 1
+order rank 1
+order rank lexicograph 1
+order recur 2
+order recur funct 1
+order recur network 1
+order recur neur 1
+order reduc 1
+order reflect 1
+order rel 3
+order rel reflect 1
+order repl 1
+order repr 1
+order requir 2
+order respect 1
+order rol 1
+order rol connect 1
+order rout 1
+order schem 1
+order se 3
+order select 1
+order sem 1
+order sensit 1
+order sensit measur 1
+order singl 1
+order singl layer 1
+order slrn 1
+order slrn network 1
+order softwar 1
+order sort 2
+order sort log 1
+order sort typ 1
+order spar 2
+order spar matr 2
+order sub 2
+order sub partit 1
+order subgraph 1
+order subgraph using 1
+order subrout 1
+order subtyp 1
+order such dat 1
+order system 3
+order taylor 1
+order taylor ser 1
+order techniqu 1
+order tempor 1
+order tempor log 1
+order term 4
+order term unif 1
+order term using 1
+order th appear 1
+order th ar 1
+order th caus 1
+order th chunk 1
+order th dct 1
+order th ibn 1
+order th incom 1
+order th inser 1
+order th me 2
+order th nod 1
+order th pack 1
+order th par 1
+order th proc 1
+order th se 1
+order than amd 1
+order than md 1
+order that requir 1
+order theor 5
+order through acquir 1
+order tim 1
+order tim using 1
+order to acc 2
+order to accommod 1
+order to accur 1
+order to achief 8
+order to acquir 1
+order to ad 1
+order to aid 1
+order to allev 1
+order to allow 2
+order to an 1
+order to ap 1
+order to approxim 1
+order to automat 1
+order to av 11
+order to bal 1
+order to bal. 1
+order to bisect 1
+order to bound 1
+order to broad 1
+order to capit 1
+order to captur 1
+order to car 1
+order to chang 1
+order to clarif 1
+order to column 1
+order to com 1
+order to compar 4
+order to compl 1
+order to comput 4
+order to conform 1
+order to connect 1
+order to consider 1
+order to construc 5
+order to continu 1
+order to cop 2
+order to cut 1
+order to deal 1
+order to dec 3
+order to decr 1
+order to def 4
+order to depict 1
+order to der 2
+order to describ 1
+order to design 1
+order to detect 2
+order to determin 3
+order to develop 1
+order to differ 1
+order to disc 2
+order to div 2
+order to draw 1
+order to emph 1
+order to ensur 4
+order to establ 2
+order to estim 2
+order to evalu 3
+order to evolut 1
+order to examin 1
+order to exclus 1
+order to execut 2
+order to expl 1
+order to explain 1
+order to exploit 1
+order to explor 3
+order to expr 1
+order to ext 1
+order to facilit 2
+order to faith 1
+order to find 4
+order to form 2
+order to forml 2
+order to fulfil 1
+order to further 1
+order to gain 1
+order to ge 7
+order to gener 5
+order to giv 2
+order to go 1
+order to guar 4
+order to handl 1
+order to highlight 1
+order to identif 2
+order to illustr 1
+order to impl 2
+order to improv 2
+order to incr 2
+order to init 1
+order to insur 1
+order to introduc 1
+order to inv 2
+order to justif 1
+order to keep 5
+order to le 1
+order to learn 2
+order to link 1
+order to loc 1
+order to lower 1
+order to maintain 3
+order to mak 13
+order to maxim 1
+order to me 1
+order to measur 1
+order to merg 1
+order to minim 4
+order to model 3
+order to multicast 1
+order to obtain 9
+order to offer 1
+order to overcom 1
+order to per 1
+order to perform 3
+order to preserv 2
+order to proceed 1
+order to produc 2
+order to protect 1
+order to prov 9
+order to reach 1
+order to read 1
+order to recogn 1
+order to reduc 4
+order to reflect 1
+order to rel 1
+order to resolut 1
+order to retrief 1
+order to rev 1
+order to satisf 1
+order to select 1
+order to shar 1
+order to shift 1
+order to show 2
+order to siml 1
+order to simplif 5
+order to solut 2
+order to speed 1
+order to st 1
+order to stand 1
+order to stud 2
+order to support 1
+order to switch 1
+order to test 1
+order to toler 1
+order to transl 1
+order to understand 1
+order to us 5
+order to val 1
+order to verif 1
+order to wit 1
+order turn 1
+order unif 1
+order upd 1
+order upd belong 1
+order using 1
+order var 1
+order var com 1
+order variabl 1
+order variabl x1 1
+order ver 1
+order vs 1
+order wa repl 1
+order wa turn 1
+order wgp 1
+order wgp order 1
+order wh register 1
+order with const 1
+order with level 1
+order with respect 1
+order xy 1
+order3 1
+order4 1
+ordin 22
+ordin ac 1
+ordin acc 1
+ordin act 2
+ordin adjust 1
+ordin adjust parameter 1
+ordin al loc 1
+ordin and triangl 1
+ordin asynchron 1
+ordin asynchron me 1
+ordin boolean 1
+ordin boolean se 1
+ordin ca 1
+ordin classif 1
+ordin dat 1
+ordin dat acc 1
+ordin empl 1
+ordin heap 1
+ordin heap counterpart 1
+ordin heap structur 1
+ordin heapsort 1
+ordin heapsort us 1
+ordin ibm 1
+ordin leav 1
+ordin leav structur 1
+ordin listener 1
+ordin listener know 1
+ordin load 1
+ordin log 1
+ordin log program 1
+ordin ma 1
+ordin ma le 1
+ordin man step 1
+ordin monot 1
+ordin monot constraint 1
+ordin or part 1
+ordin par 1
+ordin par elism 1
+ordin parameter 1
+ordin power 1
+ordin pren 1
+ordin program 1
+ordin reduc 1
+ordin renderer 1
+ordin requir 1
+ordin singl 2
+ordin singl step 2
+ordin sld 1
+ordin sld resolut 1
+ordin sum 1
+ordin sum f1 1
+ordin sum result 1
+ordin trip 1
+ordin trip ver 1
+ordin typ 1
+ordin unif 1
+ordin workst 1
+ordinair 1
+ordinair a laquel 1
+ordinair soit 1
+ordinateur 3
+ordinateur ind 1
+ordinateur ind epen 1
+ordinateur mimd 1
+ordinateur mimd dintel 1
+ordinateur mimd sont 1
+ordinateur par 1
+ordinateur par el 1
+ordinateur qu 1
+ordinateur qu jusqu 1
+ordinateur selon 1
+ordinateur selon la 1
+ordinateur sisd 1
+ordon 1
+ordon es 1
+ordon es com 1
+ordonnanc 2
+ordonnanc classiqu 1
+ordonnanc classiqu de 1
+ordonnanc cycliqu 1
+ordonnanc cycliqu de 1
+ordonnanc cycliqu engendr 1
+ordonnanc cycliqu ordonnanc 1
+ordonnanc ee 1
+ordonnanc ee cycliqu 1
+ordonnanc es 1
+ordonnanc es respectiv 1
+ordonnanc et un 1
+ordonnanc fic 1
+ordonnanc par 1
+ordonnanc par bloc 1
+ordonnanc par patron 1
+ordonnanc statiqu 1
+ordonnanc statiqu suiv 1
+ordonnanc temporel 1
+ordonnancer 1
+ordonnancer le 1
+ordonnancer le bloc 1
+ordonner 1
+ordonner le 1
+ordonner le term 1
+ordr 4
+ordr appropr 1
+ordr auront 1
+ordr auront ten 1
+ordr cr 1
+ordr cr de 1
+ordr d ecr 1
+ordr de 1
+ordr de grandeur 1
+ordr dic 1
+ordr dic ecut 1
+ordr doit 1
+ordr doit etr 1
+ordr etant 1
+ordr etant tot 1
+ordr il 1
+ordr il sont 1
+ordr quelconqu 1
+oregon 3
+oren 1
+oren tversk 1
+oren tversk tak 1
+orenstein 1
+orer 1
+org 2
+org kinderman 1
+organ 68
+organ a docum 1
+organ a domain 1
+organ accord 1
+organ advoc 1
+organ an individu 1
+organ and acc 1
+organ and benefit 1
+organ and develop 1
+organ and individu 1
+organ and program 1
+organ and scal 1
+organ ar al 1
+organ ar dead 1
+organ as follow 28
+organ as layer 1
+organ becom 1
+organ becom dead 1
+organ behavior 1
+organ by cl 1
+organ chemister 1
+organ commun 1
+organ commun memor 1
+organ compon 2
+organ concept 1
+organ concur 1
+organ concur system 1
+organ constraint 1
+organ continu 1
+organ de 2
+organ de mach 1
+organ de typ 1
+organ deriv 1
+organ docum 1
+organ docum intuit 1
+organ e com 1
+organ ee 2
+organ ee com 1
+organ ee de 1
+organ enabl 1
+organ for acc 1
+organ for compan 1
+organ for implem 1
+organ for rol 1
+organ for support 1
+organ framework 1
+organ framework captur 1
+organ in ba 1
+organ in chem 1
+organ inform 1
+organ int group 1
+organ int lin 1
+organ is develop 1
+organ is prop 1
+organ it knowledg 1
+organ level 1
+organ long run 1
+organ m emoir 1
+organ m moir 1
+organ model 1
+organ must preserv 1
+organ natur 1
+organ natur langu 1
+organ occur 1
+organ of cl 1
+organ of docum 1
+organ of object 1
+organ of rol 1
+organ oft refer 1
+organ order 1
+organ order partit 1
+organ po 1
+organ pol 1
+organ prem 1
+organ principl 1
+organ prov 1
+organ rel 1
+organ rel mater 1
+organ repr 1
+organ repr singl 1
+organ requir 1
+organ s over 1
+organ schem 1
+organ schem allow 1
+organ spat 1
+organ spat acc 1
+organ st 1
+organ st dead 1
+organ structur 1
+organ structur acycl 1
+organ sup 1
+organ sup erieur 1
+organ th dat 2
+organ th interview 1
+organ th memor 1
+organ th proc 1
+organ th record 1
+organ th recov 1
+organ th requir 1
+organ th univer 1
+organ that reduc 1
+organ them using 1
+organ to impl 1
+organ to mak 1
+organ whil retain 1
+organ wil becom 1
+organigram 1
+organigram de 1
+organigram de lacg 1
+organison 1
+organison ce 1
+organison ce paragraph 1
+orger 1
+orgun 2
+orgun and ma 1
+orgun and wadg 1
+orgun weichang 1
+orgun weichang du 1
+orient 41
+orient act 1
+orient act sequ 1
+orient algebr 1
+orient an 1
+orient and fram 1
+orient and log 1
+orient and sem 1
+orient andor 1
+orient anim 1
+orient approach 1
+orient approach particl 1
+orient architectur 1
+orient architectur framework 1
+orient c softwar 1
+orient cocktail 1
+orient cod 1
+orient cod qu 1
+orient comput 1
+orient concur 2
+orient concur langu 2
+orient concur reflect 1
+orient concur system 2
+orient cpu 1
+orient dat 3
+orient dat ba 1
+orient dat model 3
+orient datab 6
+orient datab recov 1
+orient datab separ 1
+orient datab system 2
+orient dbm 2
+orient design 8
+orient design allow 1
+orient design methodolog 1
+orient design model 1
+orient design top 1
+orient developm 1
+orient dialect 1
+orient distribut 1
+orient distribut oper 1
+orient dynam 1
+orient dynam langu 1
+orient e architectur 1
+orient e environ 1
+orient e no 1
+orient e obj 1
+orient e prim 1
+orient effect 1
+orient effect addr 1
+orient engineer 1
+orient environm 1
+orient es 1
+orient es architectur 1
+orient es environ 1
+orient exper 1
+orient exper var 1
+orient explan 1
+orient ext 2
+orient fash 1
+orient featur 2
+orient featur approach 1
+orient form 1
+orient framework 2
+orient framework con 1
+orient graph 1
+orient graph langu 1
+orient if nec 1
+orient interfac 1
+orient issu 1
+orient kernel 1
+orient knowledg 3
+orient knowledg ba 1
+orient knowledg repr 1
+orient langu 10
+orient langu abcl 1
+orient langu ba 1
+orient langu compl 1
+orient langu pract 1
+orient langu schem 1
+orient langu subject 1
+orient learn 1
+orient liter 1
+orient liter concern 1
+orient log 2
+orient log ba 1
+orient log program 1
+orient method 1
+orient mind 1
+orient model 3
+orient model method 1
+orient model presum 1
+orient network 1
+orient paradigm 4
+orient point 1
+orient program 13
+orient program caus 1
+orient program ecoop91 1
+orient program langu 5
+orient program pract 1
+orient program subject 1
+orient program system 4
+orient program work 1
+orient programmer 1
+orient prolog 1
+orient rectilin4 1
+orient rectilin4 rectangl 1
+orient repr 1
+orient research 1
+orient resourc 1
+orient resourc manag 1
+orient sem 1
+orient serv 2
+orient siml 2
+orient siml labor 1
+orient skil 1
+orient softwar 6
+orient softwar construc 1
+orient softwar developm 2
+orient softwar engineer 1
+orient softwar evolut 1
+orient softwar maint 1
+orient softwar system 1
+orient softwar test 1
+orient solut 1
+orient specif 3
+orient structur 1
+orient styl 1
+orient switch 1
+orient switch ar 1
+orient switch ba 1
+orient system 2
+orient system appear 1
+orient system con 1
+orient system disper 1
+orient system specif 1
+orient techniqu 2
+orient techniqu prov 1
+orient technolog 3
+orient to cnf 1
+orient to satisf 1
+orient tool 1
+orient tr 1
+orient transact 1
+orient transact system 1
+orient user 1
+orient ver 1
+orient view 1
+orient84 1
+orient84k 1
+orienter 1
+orienter la 1
+orienter la siml 1
+orig 3
+orig de 1
+orig de la 1
+orig du 1
+orig du group 1
+orig et pp 1
+orig pp 1
+orig pp opt 1
+orig sur 1
+orig un 1
+orig un etud 1
+orig. 1
+origin 79
+origin 1st 1
+origin 1st order 1
+origin a ce 1
+origin a graph 1
+origin a reader 1
+origin acquaint 1
+origin acquaint list 1
+origin algorithm 3
+origin an 1
+origin an model 1
+origin and dim 1
+origin and transform 1
+origin approach 1
+origin argum 1
+origin assign 1
+origin assign funct 1
+origin ba 1
+origin ba level 1
+origin brodatz 1
+origin brodatz test 1
+origin bsen 1
+origin bsen expr 1
+origin cal 1
+origin calcl 1
+origin cam 1
+origin camer 1
+origin camer man 1
+origin cg 1
+origin cg method 1
+origin chest 1
+origin chest clin 1
+origin cod 2
+origin compl 1
+origin compl nt 1
+origin con 2
+origin con alor 1
+origin con tr 1
+origin condit 1
+origin condit probabil 1
+origin constraint 2
+origin constraint hierarch 1
+origin contour 1
+origin dat 2
+origin dat se 2
+origin de 1
+origin de captur 1
+origin de la 1
+origin dec 1
+origin dec bound 1
+origin defin 1
+origin definit 2
+origin dep 1
+origin dep flow 1
+origin design 2
+origin design prop 1
+origin detail 1
+origin dev 1
+origin develop 2
+origin disc 1
+origin docum 1
+origin du 1
+origin du simplec 1
+origin edg 1
+origin enabl 1
+origin equ 1
+origin est 1
+origin est de 1
+origin et optim 1
+origin et transform 1
+origin execut 1
+origin execut honor 1
+origin exempl 1
+origin fac 1
+origin fast 1
+origin fast sdm 1
+origin fil 1
+origin find 1
+origin for 1
+origin for transact 1
+origin form 2
+origin forml 1
+origin forml pr 1
+origin from proc 1
+origin from substitut 1
+origin from us 1
+origin funct 1
+origin goal 2
+origin grammar 1
+origin grammar origin 1
+origin graph 3
+origin graph g0 1
+origin graph receiv 1
+origin hid 1
+origin hid layer 1
+origin hid nod 1
+origin id 1
+origin id shown 1
+origin imag 4
+origin imag sign 1
+origin implem 1
+origin in step 1
+origin input 1
+origin input layer 1
+origin inst 1
+origin inst occur 1
+origin int 1
+origin interfac 1
+origin introduc 1
+origin laidlaw 1
+origin lancz 1
+origin lancz method 1
+origin len 1
+origin len imag 1
+origin libr 1
+origin libr funct 1
+origin loc 1
+origin loc specif 1
+origin low 1
+origin low level 1
+origin ma 1
+origin ma travail 1
+origin matr 3
+origin me 2
+origin me object 1
+origin me text 1
+origin memor 1
+origin memor loc 1
+origin menu 1
+origin mesh 2
+origin method 2
+origin minim 1
+origin mlt 1
+origin mlt subtransact 1
+origin model 1
+origin n nod 1
+origin netj 1
+origin network 2
+origin neur 1
+origin neur network 1
+origin next sibl 1
+origin nod 3
+origin nod collap 1
+origin nt 1
+origin object 1
+origin objectiv 1
+origin of constraint 1
+origin oj 1
+origin on 2
+origin op 1
+origin op execut 1
+origin oper 1
+origin order 2
+origin osl 1
+origin osl order 1
+origin output 1
+origin output layer 1
+origin output nod 1
+origin oz 1
+origin oz program 1
+origin oz solut 1
+origin paper 2
+origin parent 2
+origin parent nod 1
+origin plan 1
+origin pn 1
+origin pn pn 1
+origin po 1
+origin po ed 1
+origin polygon 1
+origin polynom 1
+origin polynom constraint 1
+origin posit 2
+origin posit self 1
+origin pr 1
+origin problem 5
+origin proc 1
+origin program 5
+origin prop 5
+origin propag 1
+origin propag graph 1
+origin quantif 1
+origin quantif boolean 1
+origin reduc 2
+origin reduc tak 1
+origin refer 2
+origin rel 1
+origin restrict 1
+origin restrict top 1
+origin rmsp 1
+origin robertson 1
+origin root 1
+origin rtrl 1
+origin rtrl algorithm 1
+origin run 1
+origin se 1
+origin sender 1
+origin sequ 2
+origin sign 2
+origin sign spac 1
+origin simp 1
+origin siz 1
+origin solut 2
+origin sourc 1
+origin spar 2
+origin spar matr 2
+origin specif 1
+origin st 1
+origin st spac 1
+origin subtyp 1
+origin subtyp rel 1
+origin subtyp rl 1
+origin subtyp system 1
+origin suggest 1
+origin sur 1
+origin surround 1
+origin system 4
+origin t0 1
+origin task 1
+origin term 1
+origin test 1
+origin test se 1
+origin test suit 1
+origin text 1
+origin theor 1
+origin theor restrict 1
+origin thin 1
+origin thin lin 1
+origin tim 1
+origin tim ser 1
+origin tr 1
+origin train 1
+origin train se 1
+origin transform 1
+origin transform spec 1
+origin triangl 1
+origin triangl heap 1
+origin tripl 1
+origin tw reg 1
+origin typ 1
+origin typ rel 1
+origin unstretch 1
+origin unstretch form 1
+origin untransp 1
+origin untransp matr 1
+origin valu 2
+origin ver 4
+origin ver laser 1
+origin weight 1
+origin wgp 1
+origin work 1
+origin zer 1
+origin zer entr 1
+originaux 1
+originaux ecrit 1
+originaux ecrit en 1
+originel 3
+originel de 1
+originel de la 1
+originel de war 1
+originel et modif 1
+originel pour 1
+originel sur 1
+originel sur la 1
+oriordan 1
+oriqu 1
+oriqu de 1
+oriqu de algorithm 1
+oriqu de ba 1
+oriqu de la 1
+oriqu et pratiqu 1
+oriqu int 1
+oriqu int re 1
+oriqu nous 1
+oriqu nous ont 1
+oriqu pr 1
+oriqu pr sent 1
+oriqu rest 1
+oriqu rest encor 1
+oriqu rigoureus 1
+oriqu rigoureus tait 1
+oriqu sur 1
+oriqu sur lesp 1
+orl 1
+orl act 1
+orl act badg 1
+orland 8
+orlean 3
+orn 1
+orn lisper 1
+orner 1
+orner and g.m 1
+ornl 1
+orphan 1
+orphan subtransact 1
+orsson 1
+orsson approxim 1
+orsson approxim discr 1
+orst 1
+orst imag 1
+orst intern 1
+orst intern workshop 1
+orst k tupl 1
+orst method 1
+orst on y1 1
+orst order 1
+orst order taylor 1
+orst part 1
+orst part concern 1
+orst show 1
+orteg 1
+orth 1
+orth complem 1
+orth complem lat 1
+orthogon 20
+orthogon compl 1
+orthogon de 1
+orthogon design 1
+orthogon design od 1
+orthogon du 1
+orthogon du pol 1
+orthogon hyperplan 1
+orthogon hyperplan famil 1
+orthogon interact 1
+orthogon map 1
+orthogon map satisf 1
+orthogon matr 1
+orthogon polynom 1
+orthogon polynom fpng 1
+orthogon polynom sequ 1
+orthogon project 1
+orthogon spac 1
+orthogon spac decomposit 1
+orthogon sub 1
+orthogon sub spac 1
+orthogon subdivid 1
+orthogon til 1
+orthogon view 1
+orthogon wavel 1
+orthogon wavel domain 1
+orthogon with respect 1
+orthogonaux 2
+orthogonaux sem 1
+orthogonaux sem classiqu 1
+orthogonaux solut 1
+orthogonaux solut par 1
+orthonorm 5
+orthonorm ba 2
+orthonorm ba select 1
+orthonorm discr 1
+orthonorm discr wavel 1
+orthonorm dwt 1
+orthonorm es 1
+orthonorm es de 1
+orthonorm matr 1
+orthonorm vect 1
+orthonorm vect qi 1
+orthonorm wavel 1
+orthonorm wavel domain 1
+orthonorm wavel.3 1
+orthonormaliser 1
+orthonormaliser sur 1
+os 11
+os 2s 1
+os 2s dosgetm 1
+os and amount 1
+os and intern 1
+os dan 1
+os dan le 1
+os gener 1
+os gener help 1
+os in order 1
+os is disc 1
+os is expon 1
+os kernel 1
+os kernel ver 1
+os may dep 1
+os or intern 1
+os or memor 1
+os recur 1
+os recur da 1
+os requir 1
+os softwar 1
+os to compl 1
+os to find 1
+os to partit 1
+os tp 1
+os ts 1
+os ts clock 1
+os60 1
+os60 pd20 1
+os60 pd20 pilot 1
+osatur 1
+osatur ea 1
+osborn 1
+oscar 1
+oscar bosman 1
+oscil 7
+oscil assoc 1
+oscil behavior 1
+oscil in neur 1
+oscil introduc 1
+oscopiqu 1
+oscopiqu et percept 1
+osd 1
+osecon 1
+osecon plac 1
+oself 1
+oself output 1
+oself output dep 1
+osf 4
+osf sunm 1
+osh 1
+osl 2
+osl and wgp 1
+osl for interior 1
+osl inclus 1
+osl inclus subrout 1
+osl intern 1
+osl intern md 1
+osl intern minimumdegr 1
+osl intern order 1
+osl libr.2 1
+osl order 1
+osl order produc 1
+osl order wgp 1
+osl run 1
+osl run tim 1
+osl user 1
+osm 2
+osm com 1
+osm com exempl 1
+osm et par 1
+osm i learn 1
+osm le 1
+osm le don 1
+ost 1
+ostabl 1
+ostabl et donc 1
+ostrand 1
+ostrand and e.j 1
+ostrand and m.j 1
+ostrip 1
+ostrip min 1
+osu 6
+osu ci 2
+osu ci lair 1
+osu cisrc 4
+osu cisrc tr 1
+osu cisrc tr37 1
+osu grant 1
+ot 7
+ot a ar 1
+ot aux 1
+ot aux minim 1
+ot dan 1
+ot dan ce 1
+ot de 1
+ot de kcm 1
+ot dordr 1
+ot dordr economiqu 1
+ot e ad 1
+ot e de 1
+ot e egal 1
+ot e le 1
+ot hahn 1
+ot hahn ring 1
+ot in 1
+ot in er 1
+ot inter 1
+ot l etat 1
+ot passer 1
+ot passer en 1
+ot pour 1
+ot pour caract 1
+ot qu 2
+ot qu dan 1
+ot qu davoir 1
+ot qu de 2
+ot qu dindexer 1
+ot qu du 1
+ot qu la 1
+ot qu par 1
+ot quau 1
+ot quau point 1
+ot quaux 1
+ot quaux conjonct 1
+ot quun 2
+ot quun compteur 1
+ot quun foncteur 1
+ot quun lim 1
+ot un 1
+ot un sourc 1
+otaxiqu 1
+otaxiqu sont 1
+otaxiqu sont de 1
+otc 1
+oth 1
+oth eoriqu 1
+oth eoriqu pr 1
+other 56
+other ar amen 1
+other ar del 1
+other ar describ 1
+other ar float 1
+other ar observ 1
+other ar straightfor 1
+other ar susp 1
+other ar transm 1
+other as backup 1
+other as cl 1
+other at low 1
+other brief 1
+other consider 1
+other consider gener 1
+other const 1
+other dual 1
+other feel 1
+other field 1
+other hav concentr 1
+other hav not 1
+other knowledg 1
+other may becom 1
+other object 1
+other of bar 1
+other or wh 1
+other order 1
+other prev 1
+other prev learn 1
+other rec 1
+other requir 1
+other requir approxim 1
+other st 1
+other subinterv 1
+other turn 1
+other with stat 1
+other work 1
+other.sit 1
+other.sit pub 1
+other.sit pub design 1
+otherloc 1
+otherloc badg 1
+otherloc badg loc 1
+otherwisec 1
+otherwisec hunk 1
+otp3 1
+otp3 system 1
+otr 1
+otr dan 1
+otr dan le 1
+ottaw 4
+otwinowsk 1
+oty97 1
+ou 8
+ou a calculer 1
+ou a ex 1
+ou a la 2
+ou a laffect 1
+ou a lappel 1
+ou a montr 1
+ou a son 1
+ou a0k 1
+ou acc 1
+ou affect 1
+ou affect destruc 1
+ou aftd 1
+ou aftd sobt 1
+ou aik 1
+ou arbr 1
+ou arbr sld 1
+ou atom 1
+ou au 1
+ou au compilateur 1
+ou au moin 1
+ou autr 1
+ou bien 1
+ou bien de 1
+ou bp 1
+ou calcl 1
+ou calcl ee 1
+ou calculer 1
+ou calculer le 1
+ou ce 1
+ou ce qu 1
+ou cel 1
+ou cel qu 1
+ou charger 1
+ou charger en 1
+ou chromosom 1
+ou claus 1
+ou claus auxiliair 1
+ou coh 1
+ou coh er 1
+ou com 1
+ou com param 1
+ou combin 1
+ou combin ee 1
+ou compl 1
+ou conflictuel 1
+ou coup 1
+ou coup ch 1
+ou dan 2
+ou dan le 2
+ou dautr 1
+ou dautr techniqu 1
+ou de 6
+ou de citer 1
+ou de compil 1
+ou de construc 1
+ou de coupur 1
+ou de don 1
+ou de fa 1
+ou de fus 1
+ou de la 2
+ou de laffect 1
+ou de laffinit 1
+ou de laftd 1
+ou de lenviron 1
+ou de localit 1
+ou de lun 1
+ou de man 1
+ou de motif 1
+ou de mut 1
+ou de ne 1
+ou de pag 1
+ou de pav 1
+ou de per 1
+ou de ping 1
+ou de point 2
+ou de se 1
+ou de serv 1
+ou de sous 1
+ou de surfac 1
+ou de term 1
+ou de trajectoir 1
+ou de transm 1
+ou deux 2
+ou deux dim 1
+ou deux mot 1
+ou deux pag 1
+ou di 1
+ou di rentiel 1
+ou diffus 1
+ou distribu 2
+ou distribu es 1
+ou doubl 1
+ou du 3
+ou du champ 1
+ou du compilateur 1
+ou du lang 1
+ou du nombr 1
+ou du register 1
+ou dun 3
+ou dun cod 1
+ou dun coupur 1
+ou dun ench 1
+ou dun environ 1
+ou dun instruc 1
+ou dynamiqu 1
+ou dynamiqu suiv 1
+ou echouer 1
+ou ecrir 1
+ou egal 2
+ou eliminer 1
+ou eliminer le 1
+ou en 3
+ou en ecritur 2
+ou en espac 1
+ou en fin 1
+ou en lectur 1
+ou encor 2
+ou encor en 1
+ou encor pour 1
+ou et ex 1
+ou evaluateur 1
+ou evaluateur partiel 1
+ou execut 1
+ou execut qu 1
+ou extern 1
+ou fa 1
+ou fail 1
+ou fail deep 1
+ou faus 2
+ou faus ma 1
+ou faus pour 1
+ou faux 1
+ou faux au 1
+ou fin 1
+ou fin en 1
+ou fonct 1
+ou foncteur 1
+ou fr 1
+ou hjf 1
+ou hpf 1
+ou import 1
+ou import sampl 1
+ou inconditionnel 1
+ou indirect 2
+ou indirect dan 1
+ou intern 1
+ou intern est 1
+ou ir 1
+ou ir egl 1
+ou jusqu 1
+ou just 1
+ou l chograph 1
+ou l equilibr 1
+ou la 3
+ou la claus 1
+ou la cm 1
+ou la dern 1
+ou la form 1
+ou la mesur 1
+ou la par 1
+ou la possibilit 1
+ou la tail 1
+ou lab 1
+ou lab de 1
+ou lacc 1
+ou lacc el 1
+ou lannl 1
+ou le 3
+ou le compilateur 1
+ou le cr 1
+ou le droit 1
+ou le mat 1
+ou le mod 1
+ou le primitiv 1
+ou le transform 1
+ou lecteur 1
+ou lecteur ecrivain 1
+ou lectur 1
+ou lib 1
+ou lib er 1
+ou lign 1
+ou lign de 1
+ou loc 1
+ou loc est 1
+ou logiqu 1
+ou lor 1
+ou lor de 1
+ou lutil 1
+ou m em 1
+ou maxim 1
+ou maxim de 1
+ou mod 1
+ou mod el 1
+ou moin 3
+ou moin ardu 1
+ou moin convainc 1
+ou moin de 1
+ou moin direct 1
+ou moin pu 1
+ou n egatif 1
+ou n est 1
+ou nappart 1
+ou ne 1
+ou ne serait 1
+ou neck 1
+ou neck stat 1
+ou no answer 1
+ou non 3
+ou non au 1
+ou non li 1
+ou non ni 1
+ou nonvar 1
+ou omanager 1
+ou or non 1
+ou osm 1
+ou osm le 1
+ou ou 1
+ou ou non 1
+ou pa 2
+ou pa se 1
+ou par 2
+ou par affect 1
+ou par bloc 1
+ou par el 1
+ou par part 1
+ou par patron 1
+ou par un 1
+ou perman 1
+ou peupl 1
+ou pip 1
+ou pip lin 1
+ou plafon 1
+ou planch 1
+ou planch cont 1
+ou planch dexpr 1
+ou planch imbriqu 1
+ou plus court 1
+ou plus de 1
+ou plus elabor 1
+ou plus pr 1
+ou plusieur 3
+ou plusieur cop 1
+ou plusieur flot 1
+ou plusieur fluc 1
+ou plusieur point 1
+ou plusieur processeur 1
+ou plusieur variabl 1
+ou po 1
+ou po ed 1
+ou point 1
+ou point de 1
+ou profon 1
+ou program 1
+ou provoqu 1
+ou provoqu de 1
+ou qu 1
+ou qu lon 1
+ou quatr 1
+ou quatr pag 1
+ou quel 1
+ou quel doit 1
+ou r al 1
+ou r edu 1
+ou r el 1
+ou rationnel 1
+ou requ 1
+ou requ es 1
+ou retr 1
+ou retr deep 1
+ou s elect 1
+ou schrijver 1
+ou se 1
+ou se restreign 1
+ou servir 1
+ou servir damer 1
+ou si 4
+ou si au 1
+ou si de 1
+ou si ij 1
+ou si ik 1
+ou si linform 1
+ou similarit 1
+ou similarit es 1
+ou simpl 2
+ou simpl de 1
+ou simpl mettr 1
+ou simpl mi 1
+ou sont 1
+ou sont signioc 1
+ou sp 1
+ou sp ecifiqu 1
+ou structur 1
+ou sur 1
+ou sur la 1
+ou surfac 1
+ou tr 1
+ou tr mun 1
+ou treil 1
+ou trust 1
+ou un 4
+ou un an 1
+ou un autr 1
+ou un boucl 1
+ou un construc 1
+ou un cop 1
+ou un cr 1
+ou un de 1
+ou un etap 1
+ou un maxim 1
+ou un produit 1
+ou un term 1
+ou un var 1
+ou unificateur 1
+ou unificateur le 1
+ou variabl 1
+ou vectoriel 1
+ou ver 1
+ou ver un 1
+ou virtuel 1
+ou virtuel de 1
+ou xi 1
+oubl 1
+oubl le 1
+oubl le noeud 1
+ounc 1
+ouput 1
+ouput arc 1
+ous 1
+ous al ks 1
+ousterhout 3
+out 6
+out closest 1
+out finit 1
+out for differ 1
+out is 1
+out is proc 1
+out is simil 1
+out lead 1
+out of bound 1
+out period 1
+out point 1
+out point norm 1
+out to occur 1
+out. 1
+out.html 1
+outbeat 1
+outbeat it ordin 1
+outcom 13
+outcom expect 1
+outcom expect outcom 1
+outcom is init 1
+outcom of branch 1
+outcom of perform 1
+outcom prompt 1
+outcom rev 1
+outd 2
+outd inform 1
+outdegr 2
+outdegr zer 1
+outer 10
+outer block 1
+outer control 1
+outer control loop 1
+outer doal 1
+outer doal loop 1
+outer funct 1
+outer funct symbol 1
+outer if expr 1
+outer is infinit 1
+outer loop 4
+outer loop ib 1
+outer loop ind 1
+outer loop input 1
+outer minim 1
+outer posit 1
+outer reach 1
+outer red 1
+outer reduc 1
+outer reduc lem 1
+outer reg 1
+outer specl 1
+outermost 6
+outermost construc 1
+outermost hyperplan 1
+outermost loop 1
+outermost red 1
+outermost reduc 1
+outermost reduc corol 1
+outermost seq 1
+outermost symbol 1
+outfil 1
+outg 12
+outg altern 1
+outg altern edg 1
+outg and incom 1
+outg buffer 1
+outg edg 5
+outg link 3
+outg link ls 1
+outg me 1
+outg queu 1
+outg traff 1
+outg transport 1
+outg transport buffer 1
+outg transport level 1
+outg transport pack 1
+outil 5
+outil arithm 1
+outil arithm etiqu 1
+outil dan 1
+outil dan de 1
+outil de 1
+outil de val 1
+outil en 1
+outil en plac 1
+outil et de 1
+outil fondamentaux 1
+outil logiciel 1
+outil math 1
+outil math ematiqu 1
+outil pour 1
+outil pour simplif 1
+outil tel 1
+outil tel qu 1
+outil th 1
+outil th eoriqu 1
+outil util 1
+outil util es 1
+outl 25
+outl a framework 1
+outl a method 1
+outl a multidim 1
+outl a se 1
+outl a spreadsh 1
+outl an ef 1
+outl approach 1
+outl detect 2
+outl detect algorithm 1
+outl for inst 1
+outl from fit 1
+outl glob 1
+outl glob loop 1
+outl imag 1
+outl our implem 1
+outl our protocol 1
+outl point 1
+outl point ibin 1
+outl prim 1
+outl reg 1
+outl rel 1
+outl th algorithm 1
+outl th ba 1
+outl th design 1
+outl th protocol 1
+outl th result 1
+outl th syntac 1
+outl th view 1
+outl tw approach 1
+outl tw computer 1
+outl tw method 1
+outl wer depict 1
+outlin 13
+outlin an educ 1
+outlin any reg 1
+outlin as follow 1
+outlin in dylan 1
+outlin in figur 2
+outlin in sect 2
+outlin it featur 1
+outlook 1
+outlook on further 1
+outmost 1
+outmost loop 1
+outmost sequ 1
+outmost sequ loop 1
+outperform 15
+outperform al simil 1
+outperform and spec 1
+outperform by sa 1
+outperform by siml 1
+outperform by slb 1
+outperform eclip 1
+outperform eclip run 1
+outperform group 1
+outperform hardwar 1
+outperform hardwar multicast 1
+outperform nomin 1
+outperform nomin group 1
+outperform numer 1
+outperform numer prev 1
+outperform other 1
+outperform random 1
+outperform random decluster 1
+outperform th 2d 2
+outperform th 4d 2
+outperform th centr 1
+outperform th dsc 1
+outperform th etf 1
+outperform th kkz 1
+outperform th method 1
+outperform th result 1
+outperform th soft 1
+outperform th softwar 1
+outperform uv 1
+outptr 1
+output 56
+output a forml 1
+output a loc 1
+output a posit 1
+output a se 2
+output accord 1
+output act 1
+output alphab 1
+output and ant 1
+output and input 1
+output and thus 1
+output ar 1
+output ar accept 1
+output ar gener 1
+output arc 1
+output as shunt 1
+output as wj 1
+output bandwidth 1
+output bandwidth bo 1
+output becom 1
+output becom issu 1
+output behavior 1
+output bit 1
+output buffer 2
+output buffer ba 1
+output buffer modif 1
+output buffer switch 1
+output buffer techniqu 1
+output by eval 1
+output can tak 1
+output cl 1
+output cod 1
+output cod requir 1
+output complec 1
+output con 2
+output confid 1
+output confid highest 1
+output correspon 1
+output cost 1
+output dat 2
+output dat dep 1
+output datab 1
+output datab rel 1
+output deliver 2
+output dep 4
+output dep sur 1
+output dep.2 1
+output dev 2
+output difficult 1
+output edg 1
+output edg vout 1
+output error 1
+output error valu 1
+output feedback 1
+output feedback disturb 1
+output fil 2
+output fil wh 1
+output from untrain 1
+output funct 2
+output g0 1
+output gat 1
+output gener 2
+output gener datab 1
+output gener lack 1
+output gener rel 1
+output hav length 1
+output hyperoctr 1
+output if dual 1
+output iff 1
+output indep 1
+output input 1
+output is advantag 1
+output is car 1
+output is fed 1
+output is level 1
+output is obtain 1
+output is rel 1
+output is unus 1
+output label 1
+output label neg 1
+output layer 2
+output length 1
+output length jfdj 1
+output level 1
+output lin 1
+output link 1
+output link bandwidth 1
+output look 1
+output lp 1
+output lp finit 1
+output map 1
+output map look 1
+output memor 1
+output memor order 1
+output memor tap 1
+output must occur 1
+output neuron 1
+output neuron instead 1
+output nj 1
+output nod 4
+output nod np 1
+output nod problem 1
+output nod remain 1
+output not typ 1
+output of eval 1
+output of hid 1
+output of inform 1
+output of na 1
+output of neuron 1
+output ok 1
+output on block 1
+output oper 2
+output oper compl 1
+output order 1
+output pack 1
+output pair 1
+output parameter 5
+output parameter gener 1
+output parameter inclus 1
+output parameter model 1
+output parameter renam 1
+output po 1
+output port 5
+output port ar 1
+output port begin 1
+output port firstchunk 1
+output port pack 1
+output port pair 1
+output port queu 1
+output port read 1
+output port requir 1
+output port sid 1
+output possibil 1
+output primitiv 1
+output produc 1
+output prov 1
+output prov soft 1
+output queu 1
+output rel 2
+output repr 2
+output should tak 1
+output shunt 1
+output sit 1
+output siz 2
+output span 1
+output span tr 1
+output stream 1
+output string 1
+output symbol 1
+output symbol allow 1
+output symbol assoc 1
+output system 1
+output tak 1
+output tak valu 1
+output tap 2
+output termin 1
+output text 1
+output th character 1
+output th desir 1
+output th mean 1
+output th truth 1
+output th valu 1
+output that differ 1
+output their squar 1
+output their sum 1
+output to occur 1
+output tok 1
+output tok tim 1
+output tr 1
+output tupl 1
+output unit 4
+output unit classif 1
+output valu 4
+output valu assoc 1
+output valu wh 1
+output var 1
+output variabl 2
+output variabl domin 1
+output vect 3
+output vect h4 1
+output vect oj 1
+output vect restrict 1
+output ver 1
+output vi prin 1
+output waveform 1
+output waveform produc 1
+output we ch 1
+output which mak 1
+output with respect 1
+output xn 1
+output0error 1
+output0error edg 1
+outputconfidenceambigu 1
+outputdatab 1
+outputdatab input 1
+outr 3
+outr de 1
+outr de fair 1
+outr deux 1
+outr koan 1
+outr la 1
+outr la strat 1
+outr le 2
+outr le champ 1
+outr le fait 1
+outr le propr 1
+outr lint 1
+outr lint er 1
+outr lunimodularit 1
+outr qu 1
+outr qu chaqu 1
+outr qu la 1
+outr sur 1
+outr sur le 1
+outr un processeur 1
+outright 2
+outright under uniform 2
+outstand 1
+outstand lock 1
+outstand lock request 1
+outweigh 4
+outweigh init 1
+outweigh init disadv 1
+outweigh th cost 1
+outweigh th extr 1
+outwith 1
+outwith it ba 1
+ouver 2
+ouver le 1
+ouver le port 1
+ouvr 3
+ouvr la 1
+ouvr la vo 1
+ouvr ont 1
+ouvr ont leur 1
+ouvr r ecent 1
+ov 1
+ov ne 1
+ov ne modif 1
+ov91 1
+oval 1
+over 54
+over a 3d 1
+over act 1
+over algorithm 2
+over algorithm con 1
+over approach 2
+over architectur 1
+over aver 1
+over b tr 1
+over behaviour 1
+over classif 1
+over coarser 1
+over coarser goal 1
+over coh 1
+over complec 4
+over conceptu 1
+over conceptu st 1
+over conclus 2
+over configur 2
+over construc 1
+over context 1
+over control 1
+over control mechan 1
+over cost 3
+over dep 1
+over design 2
+over design guidel 1
+over design principl 1
+over developm 2
+over developm proc 2
+over edg 1
+over edg cut 1
+over effect 3
+over eight 1
+over eight sampl 1
+over engineer 1
+over engineer proc 1
+over execut 3
+over execut speed 1
+over execut tim 2
+over exper 1
+over framework 1
+over gain 1
+over gentl 1
+over gentl introduc 1
+over goal 1
+over graph 1
+over graph con 1
+over impact 1
+over in term 1
+over integr 1
+over integr requir 1
+over inter 1
+over inter switch 1
+over lower 1
+over model 1
+over mphf 1
+over mphf algorithm 1
+over network 2
+over network bandwidth 1
+over network interconnect 1
+over number 2
+over observ 1
+over order 1
+over order proc 1
+over order procedur 1
+over output 1
+over parallel 1
+over partit 1
+over partit algorithm 1
+over pattern 1
+over perform 6
+over perform fal 1
+over perform tcomp 1
+over perspect 1
+over phenom 1
+over pictur 2
+over privileg 1
+over privileg assoc 1
+over privileg reduc 1
+over problem 1
+over purp 1
+over qu 1
+over reconstruc 1
+over regr 1
+over regr test 1
+over requir 1
+over result 1
+over run 4
+over run tim 4
+over runtim 1
+over saving 1
+over sensit 1
+over shap 1
+over softwar 1
+over softwar maint 1
+over solut 1
+over solut tim 1
+over spec 1
+over specif 2
+over st 1
+over structur 2
+over system 3
+over system avail 1
+over system perform 3
+over th 2d 1
+over th 3d 1
+over th activ 1
+over th coarser 1
+over th conceptu 1
+over th system 1
+over their plan 1
+over throughput 1
+over tim 2
+over tim complec 2
+over traff 1
+over vol 1
+over vol ten 1
+over wc1 1
+over wc1 wc2 1
+overbeek 2
+overboard 1
+overcom 23
+overcom by using 1
+overcom catastroph 1
+overcom catastroph forg 1
+overcom commun 1
+overcom commun del 1
+overcom deadlock 1
+overcom in clark 1
+overcom memor 1
+overcom memor acc 1
+overcom no 1
+overcom no bright 1
+overcom sever weak 1
+overcom th architectur 1
+overcom th bottleneck 1
+overcom th deadlock 2
+overcom th del 1
+overcom th difficult 1
+overcom th drawback 1
+overcom th lim 1
+overcom th mi 1
+overcom th obstacl 1
+overcom th problem 5
+overcom th situ 1
+overcom th tran 1
+overcom weak 1
+overcomp 1
+overconfid 1
+overconfid rel 1
+overcrowd 1
+overdefin 1
+overfit 2
+overfit av 1
+overflow 5
+overflow and trigger 1
+overflow ar replac 1
+overflow check 1
+overflow occur 1
+overflow requir 1
+overgaard 1
+overhead 39
+overhead account 1
+overhead and incr 1
+overhead and negleg 1
+overhead and perform 3
+overhead ar const 1
+overhead ar low 1
+overhead ar reduc 1
+overhead as ts 1
+overhead assoc 2
+overhead begin 1
+overhead between receiv 1
+overhead by requir 1
+overhead can lim 1
+overhead coh 1
+overhead coh solut 1
+overhead constrain 1
+overhead constrain perform 1
+overhead continu 1
+overhead cost 1
+overhead dep 1
+overhead du 3
+overhead fact 1
+overhead for compl 1
+overhead for explicit 1
+overhead for implem 1
+overhead for loop 1
+overhead for specl 1
+overhead for using 1
+overhead from pack 1
+overhead ge 1
+overhead ge lower 1
+overhead heav 1
+overhead heav affect 1
+overhead in gather 1
+overhead in me 1
+overhead in part 1
+overhead in pe 1
+overhead in tim 1
+overhead in wormhol 1
+overhead incur 2
+overhead involut 1
+overhead is common 1
+overhead is incur 2
+overhead is indep 1
+overhead is influ 1
+overhead is low 1
+overhead is minim 1
+overhead is neglect 1
+overhead is reduc 1
+overhead is signif 1
+overhead is typ 1
+overhead low 1
+overhead main 1
+overhead main com 1
+overhead memor 1
+overhead memor acc 1
+overhead minim 1
+overhead of acc 2
+overhead of acknowledg 1
+overhead of charm 1
+overhead of me 1
+overhead of oper 1
+overhead of procedur 1
+overhead of recomput 1
+overhead of specl 1
+overhead of system 1
+overhead of tag 1
+overhead of ts 1
+overhead offer 1
+overhead on appl 1
+overhead on lock 1
+overhead on system 1
+overhead per by 1
+overhead per me 1
+overhead per nod 1
+overhead per record 1
+overhead per se 1
+overhead per sect 1
+overhead rc 1
+overhead sol 1
+overhead sol caus 1
+overhead spent 1
+overhead stat 1
+overhead stat strateg 1
+overhead synchron 1
+overhead th overhead 1
+overhead to demonstr 1
+overhead to keep 1
+overhead to program 1
+overhead ts 1
+overhead uniform 1
+overhead wa imp 1
+overhead whil rmsp 1
+overhead with sw 1
+overheadalgorithm 1
+overheadalgorithm overhead 1
+overheadalgorithm overhead memor 1
+overheadalgorithm overheadmemor 1
+overheadalgorithm overheadmemor acc 1
+overheadmemor 1
+overheadmemor acc 1
+overheadmemor acc cycleswrit 1
+overheadsync 1
+overheadsync overheadalgorithm 1
+overheadsync overheadalgorithm overhead 1
+overl 2
+overl techniqu 1
+overl th 2d 1
+overl tr 1
+overlaid 1
+overlaid to produc 1
+overlap 34
+overlap ai 1
+overlap and adjac 1
+overlap and pipel 1
+overlap and pipelin 1
+overlap appointm 1
+overlap ar 1
+overlap atom 1
+overlap beteen 1
+overlap between comput 1
+overlap between non 1
+overlap between rel 1
+overlap between unrel 1
+overlap bound 1
+overlap ca 1
+overlap can occur 1
+overlap cb 1
+overlap cluster 1
+overlap color 1
+overlap color reg 1
+overlap commun 1
+overlap commun del 1
+overlap con 1
+overlap con maint 1
+overlap concept 1
+overlap constraint 1
+overlap constraint constraint 1
+overlap either b1 1
+overlap execut 1
+overlap execut reduc 1
+overlap fact 1
+overlap funct 1
+overlap hierarch 1
+overlap in reg 1
+overlap in tim 1
+overlap interv 1
+overlap is perm 1
+overlap is redund 1
+overlap is symmeter 1
+overlap object 1
+overlap oeapbp 1
+overlap of comput 1
+overlap of respon 1
+overlap of succ 1
+overlap on pictur 1
+overlap privileg 1
+overlap reg 3
+overlap reg bound 1
+overlap remot 1
+overlap remot memor 1
+overlap result 1
+overlap rl 1
+overlap se 1
+overlap separ 1
+overlap separ iter 1
+overlap term 1
+overlap th commun 1
+overlap th comput 1
+overlap th iter 1
+overlap vect 1
+overlap vect repr 1
+overlap with broadcast 1
+overlap with imag 1
+overlap y 9z 1
+overload 8
+overload and default 1
+overload ar design 1
+overload exper 1
+overload for thorough 1
+overload funct 2
+overload k ye 1
+overload not pl 1
+overload th produc 1
+overload us sen 1
+overlook 7
+overlook or perform 1
+overlook th entir 1
+overlook th high 1
+overregl 1
+overregl problem 1
+overrid 3
+overrid a method 1
+overrid inherit 1
+overrid method 1
+overrid part 1
+overrid with prim 1
+overrl 1
+overrl incon 1
+overrl incon older 1
+overshoot 2
+overspec 1
+overspec and developm 1
+overtak 2
+overtak th correspon 1
+overus 1
+overus or inappropr 1
+overview 44
+overview and bibliograph 1
+overview introduc 1
+overview introduc dat 1
+overview is creat 1
+overview manu 1
+overview of ansawar 1
+overview of contribut 1
+overview of cur 1
+overview of eulisp 1
+overview of ga 1
+overview of hilog 1
+overview of level 1
+overview of lit 1
+overview of ol 1
+overview of prolog 1
+overview of relev 1
+overview of sequ 1
+overview of sorcerer 1
+overview of svm 1
+overview of switch 1
+overview of tempor 1
+overview of var 2
+overview of workflow 1
+overview prev 1
+overview prev research 1
+overview strateg 1
+overview th dynam 1
+overview.html 2
+overwhelm 7
+overwhelm becaus queu 1
+overwhelm better solut 1
+overwhelm major 1
+overwhelm our analyzer 1
+overwhelm prob 1
+overwhelm th observer 1
+overwhelm with dat 1
+overwrit 3
+overwrit earl 1
+overwrit earl stack 1
+overwrit of valu 1
+ovr 1
+ovr part 1
+ow 3
+ow of dat 1
+ow thank 1
+ow92 1
+ow93 1
+oweg 1
+owen 4
+owen evan 1
+owen traynor 1
+owick 1
+owick and anant 1
+owing 1
+own 5
+own by proc 1
+own it cop 1
+own th dat 1
+own workst 1
+own workst environm 1
+ownabovethreat 1
+ownbelowthreat 1
+owner 6
+owner comput 2
+owner comput rl 2
+owner of register 1
+owner using 1
+owner using me 1
+ownership 2
+ownership is transfer 1
+ox 1
+ox number 1
+ox r1 1
+ox1 2
+ox1 3qd 2
+oxford 17
+oxford clarendon 1
+oxford clarendon pr 1
+oxford dict 1
+oxford engineer 1
+oxford engineer sc 1
+oxford ox1 2
+oxford ox1 3qd 2
+oxford sc 1
+oxford sc publ 1
+oxford system 1
+oxford univer comput 3
+oxford univer pr 7
+oyam 1
+oz 1
+oz and chr 1
+oz docum 1
+oz docum ser 1
+oz explorer 1
+oz giv 1
+oz indomain 1
+oz is tw 1
+oz langu 1
+oz langu appear 1
+oz perform 1
+oz perform result 1
+oz program 1
+oz propag 1
+oz puzzl 1
+oz puzzl srat 1
+oz solut 1
+oz solut improv 1
+oz solut involut 1
+oz solver 1
+oz solver involut 1
+oz th oz 1
+oz which clarif 1
+oz12 1
+ozalp 1
+ozalp bab 1
+ozalp bab glu 1
+ozch94 1
+ozg 1
+ozg uner 1
+ozkarahan 1
+ozsoyoglu 1
+ozsoyoglu and mer 1
+ozsoyoglu for perm 1
+ozsu 2
+ozsug 1
+ozsug cs.ualber.ca 1
+ozsug cs.ualber.ca uztb 1
+p 3
+p b qq 1
+p.105 2
+p.107 1
+p.124 1
+p.15 1
+p.160 1
+p.17 1
+p.173 1
+p.18 1
+p.19 1
+p.201 1
+p.23 1
+p.258 1
+p.27 1
+p.27 ff 1
+p.353 1
+p.39 1
+p.4 1
+p.40 1
+p.41 1
+p.42 1
+p.433 1
+p.5 1
+p.6 1
+p.81 1
+p.83 1
+p.88 1
+p.a 7
+p.a1 1
+p.ai 1
+p.ai to us 1
+p.ai.nk 1
+p.c 2
+p.de 1
+p.e 4
+p.e.resultexpr 1
+p.e.resultexpr specializationpoint 1
+p.e.resultexpr specializationpoint funct 1
+p.g 2
+p.heidelberger 1
+p.j 1
+p.k 1
+p.l 2
+p.m 6
+p.mulholland 1
+p.n1 1
+p.o 4
+p.o.box 1
+p.p.m.c 1
+p.p.m.c de 1
+p.p.m.c de diff 1
+p.r 1
+p.s.p 1
+p.shahabudin 1
+p.t 1
+p.z 1
+p0 14
+p0 anchor 1
+p0 anchor rootp4 1
+p0 and reach 1
+p0 ar disjoint 1
+p0 distribu 1
+p0 distribu egal 1
+p0 ecrit 1
+p0 ecrit dan 1
+p0 env 1
+p0 le 1
+p0 le vecteur 1
+p0 or exit 1
+p0 or p0 1
+p0 p1 1
+p0 p1 p2 1
+p0 p2 1
+p0 p3 1
+p0 p3 r0r1 1
+p0 p3p2 1
+p0 p3p2 p1 1
+p0 pu 1
+p0 puw 1
+p0 r1 1
+p0 r1 p1 1
+p0 re 1
+p0 soccup 1
+p0 soccup de 1
+p0 wil correspon 1
+p00 2
+p00 j 9p0 1
+p0d 1
+p0dj 1
+p0g 1
+p0gj 1
+p0i 1
+p0i hck 1
+p0i hck 1u1 1
+p0p1p0p0p1p1pag 1
+p0p1p0p0p1p1pag xpag 1
+p1 34
+p1 1024p1 2
+p1 1024p1 p1 2
+p1 16.0p1 2
+p1 16.0p1 33.8p1 2
+p1 a alor 1
+p1 after tim 1
+p1 and p10 1
+p1 and p2 8
+p1 and p3 1
+p1 and p30 1
+p1 and q1 1
+p1 at tc 1
+p1 b2 1
+p1 c2 1
+p1 c3 1
+p1 c4 1
+p1 cal 1
+p1 cannot distingu 1
+p1 continu 1
+p1 crash 1
+p1 ecrit 1
+p1 ecrit sur 1
+p1 et de 1
+p1 et p2 1
+p1 expect 1
+p1 ha dat 1
+p1 ha effect 1
+p1 ha fail 1
+p1 imp 1
+p1 inv 1
+p1 is compl 1
+p1 is correct 1
+p1 is darkgreen 1
+p1 le 1
+p1 le uw 1
+p1 or p2 3
+p1 p1 1
+p1 p1 c2 1
+p1 p1 c3 1
+p1 p1 c4 1
+p1 p1 u0 1
+p1 p2 8
+p1 p2 ca 1
+p1 p2 del 1
+p1 p2 p0 1
+p1 p2 p1 2
+p1 p2 p3 1
+p1 p2 r0r0r0 1
+p1 p2 r1r1r0r0r1 1
+p1 p4 1
+p1 p4 p5 1
+p1 p50 1
+p1 q1 1
+p1 r1r1r0 1
+p1 r1r1r0 p3 1
+p1 receiv 1
+p1 rel 1
+p1 remain 1
+p1 s4s5 1
+p1 sen 1
+p1 sen dum 1
+p1 sen me 1
+p1 specl 1
+p1 ss 1
+p1 ss p2 1
+p1 t3 1
+p1 that uw 1
+p1 through pj 1
+p1 to mak 1
+p1 to p2 2
+p1 tr 1
+p1 u0 1
+p1 viol 1
+p1 viol p3viol 1
+p1 we search 1
+p1 wil correspon 1
+p1 wil mak 1
+p1 would approxim 1
+p1 writ 1
+p10 3
+p1036 1
+p1098 1
+p11 2
+p11 p12 1
+p12 1
+p12i 1
+p16 1
+p1a 1
+p1a q1 1
+p1b 1
+p1b q1 1
+p1p0 1
+p1p0 p0 1
+p1p0 p0 p3p2 1
+p1p2acquir 1
+p1r 1
+p1r p21 1
+p1r p21 p22 1
+p1s 2
+p1s crash 1
+p1s pag 1
+p1s pag tabl 1
+p1s pt 1
+p1s pt chang 1
+p1s retr 1
+p1s trac 1
+p1s writ 1
+p1s writ buffer 1
+p1s2 1
+p1s2 l1 1
+p1s2 s3 1
+p1s2 s3 entr 1
+p1s2s3s4s5 1
+p2 31
+p2 3d 2
+p2 3d internet 2
+p2 acquir 1
+p2 after tim 1
+p2 al perform 1
+p2 and block 1
+p2 and p20 1
+p2 and p3 1
+p2 arriv 1
+p2 be program 1
+p2 becom 1
+p2 c1 1
+p2 c2 1
+p2 c5 1
+p2 ca 1
+p2 cannot distingu 1
+p2 compl 1
+p2 connect 1
+p2 construc 1
+p2 cooper 1
+p2 cut 1
+p2 del 1
+p2 del path 1
+p2 e2 1
+p2 est 1
+p2 est retard 1
+p2 et le 1
+p2 field 1
+p2 grammar 1
+p2 ha becom 1
+p2 hav load 1
+p2 hav read 1
+p2 iff 1
+p2 iff 8g 1
+p2 iff p1 1
+p2 inv 1
+p2 inver 1
+p2 is del 1
+p2 is fault 1
+p2 is green 1
+p2 is implem 1
+p2 la 1
+p2 la lit 1
+p2 le 1
+p2 load 1
+p2 log 2
+p2 p0 1
+p2 p0 p1 1
+p2 p1 5
+p2 p1 r1r1r0 1
+p2 p3 1
+p2 p3 p0 1
+p2 p3 p4 1
+p2 p6 1
+p2 p6 p8 1
+p2 pannereparationfin 1
+p2 pannereparationfin de 1
+p2 perform 1
+p2 proc 1
+p2 q2 1
+p2 q2 q1 1
+p2 r0r0r0 1
+p2 r0r0r0 p0 1
+p2 r1r1r0r0r1 1
+p2 r1r1r0r0r1 p1 1
+p2 read 1
+p2 read shar 1
+p2 reflect 2
+p2 result 1
+p2 s4 1
+p2 t2 1
+p2 tim 1
+p2 to inv 1
+p2 u0 1
+p2 upd 1
+p2 we know 1
+p2 which li 1
+p2 wil correspon 1
+p2 wil crash 1
+p2 wil eventu 1
+p2 wil mak 1
+p2 wil se 1
+p2 writ 1
+p20 1
+p20 compar 1
+p20 compar consider 1
+p21 1
+p21 p22 1
+p22 1
+p25 1
+p2b 1
+p2b nm 1
+p2b nm logn 1
+p2c 1
+p2c q2 1
+p2d 1
+p2d q2 1
+p2ft 1
+p2ft p3p4t 1
+p2ft p3p4t s5 1
+p2gk 1
+p2hk 1
+p2n 2
+p2p 1
+p2p gkwn 1
+p2p1p3 1
+p2phkwn 1
+p2pj 2
+p2r 1
+p2s 2
+p2s pt 1
+p2s pt chang 1
+p3 11
+p3 and p30 1
+p3 c2 1
+p3 le 1
+p3 le uw 1
+p3 must transm 1
+p3 p0 1
+p3 p0 p1 1
+p3 p1 1
+p3 p1 p4 1
+p3 p2 1
+p3 p2 p1 1
+p3 p4 1
+p3 p4 processeur 1
+p3 r0r1 1
+p3 r0r1 p2 1
+p3 t2 1
+p3 t3 1
+p3 we know 1
+p3 wil correspon 1
+p3 wil mak 1
+p30 1
+p30 visit 1
+p3g 1
+p3p2 1
+p3p2 p1 1
+p3p2 p1p0 1
+p3p2 p1p0 p0 1
+p3p4t 1
+p3p4t s5 1
+p3viol 1
+p3viol p2 1
+p4 7
+p4 and p40 1
+p4 and s9 1
+p4 c3 1
+p4 e1 1
+p4 in procedur 1
+p4 p5 1
+p4 p5 p7 1
+p4 proc 1
+p4 processeur 1
+p4 processeur ca 1
+p4.s5a 1
+p40 1
+p40 in avg2s 1
+p40 to compar 1
+p4p3 1
+p5 4
+p5 p7 1
+p5 p7 p2 1
+p50 1
+p6 4
+p6 np 1
+p6 np result 1
+p6 p8 1
+p6 p8 p9 1
+p6j 1
+p6j pn 1
+p7 4
+p7 p2 1
+p7 p2 p6 1
+p75 1
+p8 3
+p8 p9 1
+p9 3
+pa 74
+pa a cel 1
+pa a coeff 1
+pa a continu 1
+pa a de 1
+pa a eliminer 1
+pa a ker 1
+pa a la 1
+pa a ladapter 1
+pa a lu 1
+pa a me 2
+pa a nn 1
+pa a prior 1
+pa a rout 1
+pa a syntac 1
+pa a templ 1
+pa a un 1
+pa ab 1
+pa abord 1
+pa abord es 1
+pa acc 2
+pa acc ed 1
+pa activ 1
+pa ai 1
+pa ai ee 1
+pa algorithm 1
+pa algorithm facilit 1
+pa algorithm us 1
+pa alor 1
+pa alor fondam 1
+pa alourdir 1
+pa alourdir la 1
+pa alt 1
+pa alt erer 1
+pa and rad 1
+pa and requir 1
+pa and st 1
+pa appar 2
+pa appar tr 1
+pa appel 1
+pa appliquer 1
+pa appliquer glob 1
+pa approach 2
+pa approach lead 1
+pa aq 1
+pa ar lim 1
+pa architectur 2
+pa architectur reduc 1
+pa argum 2
+pa argum valu 1
+pa as argum 1
+pa atteint 2
+pa atteint avant 1
+pa au 1
+pa au domain 1
+pa au moin 1
+pa au voisin 1
+pa automat 1
+pa automatiqu 1
+pa automatiqu dan 1
+pa aux 1
+pa aux techniqu 1
+pa avoir 2
+pa avoir lieu 1
+pa beaucoup 1
+pa beaucoup dattrait 1
+pa befor sort 1
+pa besoin 1
+pa besoin de 1
+pa between neighbour 1
+pa between proc 1
+pa bien 1
+pa bien au 1
+pa bin 1
+pa bin prolog 1
+pa by refer 1
+pa caddr 1
+pa calculer 1
+pa can ea 1
+pa ce 1
+pa ce etat 1
+pa ce propr 1
+pa cel 1
+pa cel qu 1
+pa certain 1
+pa certain calcl 1
+pa ceux 1
+pa ceux qu 1
+pa changer 1
+pa changer le 1
+pa clair 1
+pa clair qu 1
+pa clair quun 1
+pa cod 1
+pa collect 1
+pa collect commun 1
+pa compat 1
+pa compat avec 1
+pa compenser 1
+pa compenser la 1
+pa compilabl 1
+pa compilabl en 1
+pa compl 1
+pa compl es 1
+pa complec 1
+pa compon 1
+pa compt 1
+pa compt de 1
+pa concept 1
+pa concern 1
+pa concern ee 1
+pa concevabl 1
+pa conduir 1
+pa conflictuel 1
+pa conflictuel puisqu 1
+pa conflictuel si 1
+pa confondr 2
+pa confondr avec 1
+pa conjoint 1
+pa conjoint leff 1
+pa connu 2
+pa connu lor 1
+pa connu pr 1
+pa consid 1
+pa consid rer 1
+pa control 1
+pa convec 1
+pa convec ain 1
+pa convec sur 1
+pa correct 1
+pa correspon 1
+pa cr 1
+pa cr eat 1
+pa cr ee 1
+pa cr eer 1
+pa d eliminer 1
+pa d equiv 1
+pa d etiqu 1
+pa d etruit 1
+pa dacc 2
+pa dacc es 2
+pa daffirmer 1
+pa daffirmer qu 1
+pa dambiguit 1
+pa dan 4
+pa dan ce 3
+pa dan dautr 1
+pa dan la 2
+pa dan lautr 1
+pa dan le 3
+pa dan lenviron 1
+pa dan lobjectif 1
+pa dan n3 1
+pa dan notr 1
+pa dargum 1
+pa dargum evid 1
+pa dargum pour 1
+pa dargum sur 1
+pa dat 1
+pa dautr 1
+pa dautr coupur 1
+pa dautr man 1
+pa de 5
+pa de aik 1
+pa de argum 1
+pa de biject 1
+pa de ce 1
+pa de certain 1
+pa de chaqu 1
+pa de claus 1
+pa de co 1
+pa de comprom 1
+pa de conflit 1
+pa de continu 1
+pa de cop 1
+pa de coupur 1
+pa de cr 1
+pa de fa 1
+pa de faux 1
+pa de forml 1
+pa de la 3
+pa de lagenc 1
+pa de lectur 1
+pa de lettr 1
+pa de liaison 1
+pa de lien 1
+pa de loptim 1
+pa de mettr 1
+pa de migr 1
+pa de notr 1
+pa de nouveaut 1
+pa de otr 1
+pa de pag 1
+pa de param 1
+pa de part 1
+pa de partager 1
+pa de ping 1
+pa de point 1
+pa de possibilit 1
+pa de probl 1
+pa de progr 1
+pa de project 1
+pa de raison 1
+pa de retour 1
+pa de se 1
+pa de sen 1
+pa de solut 2
+pa de syst 1
+pa de tail 1
+pa de term 2
+pa de test 1
+pa de tomber 1
+pa de trait 1
+pa de traiter 1
+pa de typ 1
+pa de valeur 1
+pa de var 1
+pa de variabl 1
+pa deff 2
+pa deff de 1
+pa deff sur 1
+pa demand 1
+pa denot 1
+pa denregister 1
+pa denregister sur 1
+pa denregistrer 1
+pa denregistrer dadr 1
+pa dent 1
+pa dent congrus 1
+pa denv 1
+pa denv dinv 1
+pa denviron 1
+pa denviron au 1
+pa describ 1
+pa despac 1
+pa deux 1
+pa deux ecritur 1
+pa diff 1
+pa diff erem 1
+pa dim 1
+pa dim de 1
+pa dinc 1
+pa dinc sur 1
+pa dincr 1
+pa dincr ement 1
+pa dinform 1
+pa dinform lor 1
+pa dint 1
+pa dint er 1
+pa dir 1
+pa dir qu 1
+pa direct 2
+pa direct li 1
+pa dit 1
+pa dit erat 1
+pa div 1
+pa div ee 1
+pa donc 1
+pa donc par 1
+pa du 2
+pa du au 1
+pa du manuscrit 1
+pa du point 1
+pa dun 2
+pa dun register 1
+pa e com 1
+pa e en 1
+pa e par 1
+pa e pour 1
+pa each dr 1
+pa each tim 1
+pa echouer 1
+pa echouer avant 1
+pa ee 4
+pa ee com 1
+pa ee en 1
+pa ee par 1
+pa ee sur 1
+pa effectu 1
+pa effectuer 1
+pa effectuer le 1
+pa elagu 1
+pa elagu es 1
+pa elaguer 1
+pa elaguer pen 1
+pa eliminer 1
+pa eliminer le 1
+pa en 2
+pa en avoir 1
+pa en cel 1
+pa en compt 1
+pa en ping 1
+pa en revu 1
+pa en som 1
+pa encor 2
+pa encor env 1
+pa encor la 1
+pa enregister 1
+pa enregister ee 1
+pa equit 1
+pa equiv 1
+pa es 1
+pa es rapid 1
+pa est 2
+pa est moin 1
+pa etr 2
+pa etr connu 1
+pa etr disponibl 1
+pa etr effectu 1
+pa etr elagu 1
+pa etr enregister 1
+pa etr indiff 1
+pa etr init 1
+pa etr le 1
+pa etr modif 1
+pa etr pr 1
+pa etr rep 1
+pa etr retard 1
+pa etr simpl 1
+pa etr un 1
+pa etr unif 1
+pa etr visibl 1
+pa eu 1
+pa eu de 1
+pa ev character 1
+pa evalu 1
+pa evalu ee 1
+pa ex 2
+pa ex ecuter 2
+pa exact 1
+pa exact du 1
+pa exclu 1
+pa execut 1
+pa execut sem 1
+pa exempl 1
+pa exempl la 1
+pa explicit 1
+pa explicit ee 1
+pa fair 1
+pa fair en 1
+pa fic 1
+pa filter 1
+pa flec 1
+pa flec puisqu 1
+pa forc 3
+pa forc ement 2
+pa forc ment 1
+pa from input 1
+pa from thread 1
+pa fs 1
+pa graduel 1
+pa graduel de 1
+pa grand 1
+pa grand sen 1
+pa i1 1
+pa ic 1
+pa im 1
+pa im ediat 1
+pa implem 1
+pa in initl 1
+pa in junct 1
+pa in min 1
+pa in tradit 1
+pa incontestabl 1
+pa incontestabl par 1
+pa init 1
+pa init ee 1
+pa init partag 1
+pa init un 1
+pa interfac 3
+pa interfac chang 1
+pa interrompu 1
+pa interrompu dur 1
+pa interrupt 1
+pa intervenir 1
+pa intervenir de 1
+pa intervenir la 1
+pa intervenir le 1
+pa introduir 1
+pa introduir de 1
+pa judicieux 1
+pa judicieux daxer 1
+pa l ecritur 1
+pa l egal 1
+pa la 4
+pa la bon 1
+pa la deux 1
+pa la diminut 1
+pa la distinct 1
+pa la meilleur 1
+pa la pag 1
+pa la panac 1
+pa la pein 1
+pa la pil 1
+pa la port 1
+pa la possibilit 1
+pa la technolog 1
+pa lab 1
+pa lanc 1
+pa lanc valeur 1
+pa lasser 1
+pa lasser de 1
+pa lattribut 1
+pa lattribut dun 1
+pa le 4
+pa le ca 3
+pa le claus 1
+pa le compteur 1
+pa le condit 1
+pa le coupur 1
+pa le droit 1
+pa le fait 1
+pa le faux 1
+pa le flot 1
+pa le gestionnair 1
+pa le mi 1
+pa le nombr 1
+pa le pr 1
+pa le program 1
+pa le register 1
+pa le sign 1
+pa le som 1
+pa le typ 1
+pa le variabl 1
+pa le vecteur 1
+pa lenviron 1
+pa lhypoth 1
+pa lhypoth es 1
+pa lib 1
+pa lib erer 1
+pa lieu 1
+pa lieu dan 1
+pa lim 2
+pa lim es 1
+pa lintroduc 1
+pa lintroduc de 1
+pa linver 1
+pa linver de 1
+pa lop 1
+pa lor 1
+pa lor du 1
+pa lordr 1
+pa lordr de 1
+pa lorsquon 1
+pa lorsquon util 1
+pa lunif 1
+pa lunif etendu 1
+pa m emoir 1
+pa mak 1
+pa me 1
+pa mechan 3
+pa mechan conform 1
+pa mettr 1
+pa midnight 1
+pa mimd 1
+pa mimd architectur 1
+pa minim 1
+pa modif 2
+pa modif ce 1
+pa modif ee 1
+pa modif la 2
+pa modif le 1
+pa motiv 1
+pa motiv ee 1
+pa multipl 1
+pa multipl sect 1
+pa n cessair 1
+pa n ecessair 4
+pa nb 1
+pa nb sect 1
+pa non 3
+pa notr 2
+pa notr ca 1
+pa notr descript 1
+pa nouvel 1
+pa obligatoir 1
+pa obligatoir de 1
+pa obtenu 1
+pa obtenu nest 1
+pa of distribut 1
+pa of ph 1
+pa of self 1
+pa oper 2
+pa optim 1
+pa optim dan 1
+pa p enaliser 1
+pa pa 1
+pa pa par 1
+pa par 3
+pa par de 1
+pa par la 1
+pa par lutil 1
+pa par un 1
+pa paradigm 1
+pa parameter 1
+pa parfait 1
+pa parfait par 1
+pa part 2
+pa part comp 1
+pa part de 1
+pa partag 1
+pa partag ee 1
+pa partag es 1
+pa particl 1
+pa particl er 1
+pa perdurer 1
+pa perdurer dan 1
+pa perform 1
+pa permettr 1
+pa permettr de 1
+pa peut 1
+pa peut donc 1
+pa plus dun 1
+pa plusieur 1
+pa plusieur ecritur 1
+pa po de 1
+pa po dindiquer 1
+pa pour 2
+pa pour chaqu 1
+pa pour le 1
+pa pour linst 1
+pa pour savoir 1
+pa pr 2
+pa pr ec 1
+pa pr en 1
+pa pr esent 1
+pa pr esenter 1
+pa prem 1
+pa prem entr 1
+pa prim 1
+pa privil 1
+pa privil gier 1
+pa program 1
+pa prolog 1
+pa prolog eng 1
+pa propag 1
+pa propag ee 1
+pa propr 1
+pa propr nouvel 1
+pa purp 1
+pa qp 1
+pa qp bq 1
+pa qu 3
+pa qu de 1
+pa qu la 1
+pa qu lintroduc 1
+pa qu lop 1
+pa qu transform 1
+pa quel 1
+pa queu 1
+pa queu rout 1
+pa quon 1
+pa quon peut 1
+pa quun 1
+pa quun vu 1
+pa r educ 1
+pa r eel 1
+pa r ef 1
+pa r egl 1
+pa r epart 1
+pa ralent 1
+pa ralent pour 1
+pa ralentir 1
+pa ralentir le 1
+pa rallonger 1
+pa rallonger le 1
+pa rapid 1
+pa rapid en 1
+pa rationnel 1
+pa record 1
+pa repr 1
+pa repr esenter 1
+pa requir 1
+pa respect 1
+pa respect ee 1
+pa restreint 1
+pa restreint syntaxiqu 1
+pa retard 1
+pa retard ee 1
+pa retard es 1
+pa retarder 1
+pa retarder le 1
+pa retenir 1
+pa retenir ce 1
+pa retourner 1
+pa revenir 1
+pa revenir sur 1
+pa ring 1
+pa sa 1
+pa san eff 1
+pa san inconv 1
+pa satisf 1
+pa sauvegard 1
+pa sauvegard es 1
+pa schem 1
+pa se 1
+pa sel 1
+pa sel du 1
+pa sequ 1
+pa server 1
+pa server agenthardwareemulatorsystem 1
+pa shar 1
+pa shar memor 1
+pa si 2
+pa si de 1
+pa si simpl 1
+pa sien 1
+pa significatif 1
+pa sont 1
+pa sont aus 1
+pa sortir 1
+pa sortir du 1
+pa souc 1
+pa souc es 1
+pa soum 1
+pa sp 1
+pa sp ecif 1
+pa sp ecifiqu 1
+pa spread 1
+pa standard 2
+pa straightfor 1
+pa straightfor suggest 1
+pa strict 2
+pa strict au 1
+pa styl 2
+pa su 1
+pa substantiel 1
+pa substantiel de 1
+pa suffisam 1
+pa suffisam la 1
+pa suiv 1
+pa suiv pour 1
+pa sur 2
+pa sur ce 1
+pa sur un 1
+pa surpr 1
+pa surpr qu 1
+pa syst 1
+pa syst ematiqu 1
+pa system 4
+pa tant 1
+pa tant de 1
+pa th dog 1
+pa th me 1
+pa th notor 1
+pa th other 1
+pa th pack 2
+pa th request 1
+pa th rest 1
+pa th valu 1
+pa their lockj 1
+pa through simpl 1
+pa through unaffect 1
+pa through unalter 1
+pa to ap 1
+pa to init 1
+pa to inser 1
+pa to mak 1
+pa to method 1
+pa to prim 1
+pa to sign 1
+pa tok 2
+pa tot 2
+pa tot accord 1
+pa tot coh 1
+pa tot exploit 1
+pa tot satisf 1
+pa toujour 4
+pa toujour compr 1
+pa toujour im 1
+pa tout 2
+pa tout se 1
+pa tr 2
+pa tr es 2
+pa trait 1
+pa trait es 1
+pa traiter 1
+pa traiter un 1
+pa transpar 1
+pa trop 1
+pa trop de 1
+pa un 4
+pa un acc 1
+pa un asser 1
+pa un biject 1
+pa un bon 1
+pa un cadr 1
+pa un cel 1
+pa un cop 1
+pa un espac 1
+pa un etat 1
+pa un fait 1
+pa un multipl 1
+pa un partit 1
+pa un preuv 1
+pa un project 1
+pa un tutoriel 1
+pa un var 1
+pa unchang 1
+pa uniform 1
+pa uniform sur 1
+pa unimodulair 1
+pa unimodulair dan 1
+pa util 2
+pa util de 1
+pa util ee 1
+pa util es 1
+pa v ecu 1
+pa v erif 1
+pa v eritabl 1
+pa vain 1
+pa vain pour 1
+pa ver 3
+pa ver la 1
+pa ver loptim 1
+pa vraim 1
+pa vraim dunif 1
+pa vraim justif 1
+pa vu 1
+pa vu le 1
+pa wa predetermin 1
+pa we merg 1
+pa xi 1
+pa xi en 1
+pa xi suiv 1
+pa y avoir 1
+pa. 2
+pa2np 1
+pac 2
+pac than proc 1
+pac.html 1
+paccept 1
+pacif 5
+pacif computer 1
+pacif computer commun 1
+pacif grov 2
+pacif northwest 1
+pacif northwest softwar 1
+pacif softwar 1
+pacif softwar engineer 1
+pack 37
+pack a lot 1
+pack a me 1
+pack accept 1
+pack ack 1
+pack ack list 1
+pack ad 1
+pack ad unnec 1
+pack adm 1
+pack advanc 3
+pack after tim 1
+pack al attribut 1
+pack algorithm 1
+pack allow 1
+pack and appropr 1
+pack and dec 1
+pack and for 1
+pack and interconnect 2
+pack and organ 1
+pack and pa 1
+pack and schedl 1
+pack and sen 2
+pack and technolog 1
+pack and unpack 2
+pack approxim 1
+pack ar 1
+pack ar assign 1
+pack ar avail 1
+pack ar block 1
+pack ar consider 1
+pack ar cur 1
+pack ar serv 1
+pack ar sort 1
+pack ar transm 1
+pack ar wait 1
+pack ar writ 1
+pack arriv 2
+pack at fl 1
+pack await 1
+pack await proc 1
+pack await transm 1
+pack ba 2
+pack ba tran 1
+pack backlog 1
+pack becom 1
+pack becom greater 1
+pack begin 1
+pack being proc 1
+pack being serv 1
+pack being transm 1
+pack belong 1
+pack buffer 1
+pack buffer spac 1
+pack by pack 1
+pack bypack 1
+pack bypack server 1
+pack can fal 1
+pack car 1
+pack chac 1
+pack chunk 1
+pack com 1
+pack compact 1
+pack compl 1
+pack con. 1
+pack consider 2
+pack constraint 3
+pack constraint lim 1
+pack continu 1
+pack cost 2
+pack cost mak 2
+pack cr 1
+pack creat 1
+pack cur 1
+pack decl 1
+pack decomposit 1
+pack del 1
+pack dest 1
+pack discard 1
+pack drop 1
+pack drop funct 1
+pack drop rat 1
+pack ec 1
+pack ec prior 1
+pack equ 1
+pack expan 1
+pack expan correspon 1
+pack field 1
+pack finish 1
+pack finish serv 1
+pack flit 1
+pack flow 1
+pack for sharedmemor 1
+pack format 1
+pack from connect 1
+pack from multipl 1
+pack from prev 1
+pack from se 1
+pack from tim 1
+pack futur 2
+pack futur mach 2
+pack gener 1
+pack gener tim 1
+pack grow 1
+pack grow lin 1
+pack hav prior 1
+pack header 2
+pack header chunk 1
+pack hierarch 2
+pack id1 1
+pack id2 1
+pack id2 renam 1
+pack in block 1
+pack in burst 1
+pack in design 1
+pack in incr 1
+pack in maintain 1
+pack in progr 1
+pack in rmtp 1
+pack in serv 1
+pack in transit 1
+pack in transm 1
+pack inform 1
+pack inject 1
+pack inject bandwidth 1
+pack inst 1
+pack int pi 1
+pack interfac 1
+pack interfac decl 1
+pack is 4.5msec 1
+pack is 6msec 1
+pack is avail 1
+pack is block 1
+pack is buffer 1
+pack is calcl 1
+pack is comput 1
+pack is divid 1
+pack is drop 1
+pack is lost 1
+pack is manag 1
+pack is mark 1
+pack is receiv 1
+pack is repl 1
+pack is schedl 1
+pack is serv 1
+pack is transm 1
+pack is writ 1
+pack it multicast 1
+pack it receiv 1
+pack j start 1
+pack leav 1
+pack length 1
+pack level 1
+pack level gener 1
+pack level scheduler 1
+pack level ver 1
+pack list 1
+pack list describ 1
+pack list remain 1
+pack lo 3
+pack lo amount 1
+pack lo character 1
+pack lo detect 1
+pack lo prob 1
+pack lo rat 1
+pack may propag 1
+pack me 1
+pack model 1
+pack network 1
+pack network ba 1
+pack network requir 1
+pack occur 1
+pack of connect 1
+pack of cut 1
+pack of requir 1
+pack of se 1
+pack of siz 2
+pack of typ 1
+pack of virtu 1
+pack oper 1
+pack order 1
+pack pack 2
+pack parallel 1
+pack parallel instruc 1
+pack per connect 1
+pack per track 1
+pack pointer 1
+pack prev 1
+pack prev introduc 1
+pack prior 1
+pack queu 1
+pack r tr 1
+pack rat 1
+pack rat proport 1
+pack rateproport 1
+pack rateproport server 1
+pack rec 1
+pack rec bandwidth 1
+pack receiv 1
+pack remain 1
+pack remain const 1
+pack repl 2
+pack repl schem 1
+pack repr 1
+pack restrict 2
+pack schedl 2
+pack schedl algorithm 1
+pack schedl capabil 1
+pack scheduler 1
+pack sent 1
+pack serv 1
+pack server 1
+pack server occur 1
+pack shown 1
+pack simil 1
+pack siz 5
+pack siz allow 1
+pack siz equ 1
+pack specif 1
+pack st 1
+pack standard 1
+pack start 1
+pack start serv 1
+pack structur 1
+pack switch 5
+pack switch environm 1
+pack switch network 2
+pack switch support 1
+pack switch wh 1
+pack system 1
+pack tag 1
+pack techniqu 1
+pack techniqu ba 1
+pack technol. 2
+pack technolog 3
+pack technolog mak 2
+pack technolog offer 2
+pack th loop 1
+pack th oper 1
+pack th part 1
+pack that ar 1
+pack that arriv 1
+pack to ar 1
+pack to nod 1
+pack to pa 1
+pack to reduc 1
+pack to transm 1
+pack tr 1
+pack transm 3
+pack transm tim 1
+pack traver 1
+pack tw 1
+pack typ 1
+pack us 1
+pack using 3
+pack using neg 1
+pack using proc 1
+pack ver 1
+pack virtualclock 1
+pack virtualclock server 1
+pack wa serv 1
+pack wer serv 1
+pack wer transm 1
+pack wh destin 1
+pack which model 1
+pack wil eventu 1
+pack with actu 1
+pack with finish 1
+pack with interpack 1
+pack with llnc 1
+pack with multiplec 1
+pack with prob 1
+pack with proc 1
+pack with start 1
+pack.h 1
+pack.h fil 1
+packard 5
+packard and digit 1
+packard compan 1
+packard fellowship 1
+packard hp 1
+packard hp ux 1
+packard nl 1
+packard nl pack 1
+pact96 1
+pad 3
+pad se 1
+padg 1
+padm 1
+padm raghavan 1
+padmanabhan 3
+padmashr 1
+padmashr krishn 1
+padmashr krishn theodor 1
+padu 3
+padusk 1
+paek 2
+pag 72
+pag 0pag 1
+pag 0pag 3pag 1
+pag 1pag 1
+pag 1pag 4pag 1
+pag 2pag 1
+pag 30msec 1
+pag 30msec 10msec 1
+pag 7pag 1
+pag 7pag 6pag 1
+pag a la 1
+pag a laquel 1
+pag a migrer 1
+pag acc 2
+pag acc ed 1
+pag acc fault 1
+pag actu 1
+pag actu deterior 1
+pag ae 1
+pag affect 1
+pag afin 1
+pag afin de 1
+pag al 1
+pag al jusqu 1
+pag alor 1
+pag alor quil 1
+pag and comput 1
+pag and inv 1
+pag and therefor 1
+pag as cach 1
+pag attribu 1
+pag attribu ee 1
+pag au 1
+pag au moin 1
+pag au processeur 1
+pag aux 1
+pag aux eff 1
+pag av 1
+pag av le 1
+pag avec 1
+pag avec de 1
+pag avec diff 1
+pag avec le 1
+pag avec notr 1
+pag ba 4
+pag ba cach 1
+pag becom 1
+pag becom shar 1
+pag bound 1
+pag buffer 1
+pag buffer siz 1
+pag bus 1
+pag bus ba 1
+pag but us 1
+pag can separ 1
+pag cc 1
+pag ccidl 1
+pag ccidl tim 1
+pag ce 1
+pag ce qu 1
+pag chang 1
+pag chunk 1
+pag chunk siz 1
+pag chunk typ 1
+pag com 1
+pag com apr 1
+pag com avant 1
+pag com entit 1
+pag com grain 1
+pag com suit 1
+pag commun 1
+pag commun s 1
+pag comport 1
+pag comport un 1
+pag con 1
+pag con ecutiv 1
+pag con equent 1
+pag confirm 1
+pag conflictuel 1
+pag conflictuel dan 1
+pag conflictuel de 1
+pag conflictuel devr 1
+pag conflictuel du 1
+pag conflictuel dur 1
+pag conflictuel est 1
+pag conflictuel le 1
+pag conflictuel nengendr 1
+pag conflictuel ont 1
+pag conflictuel ou 1
+pag conflictuel pour 1
+pag conflictuel provoqu 1
+pag conflictuel qu 1
+pag conflictuel sont 1
+pag conflictuel subit 1
+pag conflictuel var 1
+pag cont 1
+pag cont dautr 1
+pag cont de 1
+pag cont soit 1
+pag cont tr 1
+pag contain 1
+pag copt 1
+pag copt optim 1
+pag correspon 1
+pag correspon aux 1
+pag cr 1
+pag d ecr 1
+pag d ep 1
+pag d es 1
+pag dan 1
+pag dan chaqu 1
+pag dan le 1
+pag dan sa 1
+pag dan tous 1
+pag dan un 1
+pag de 1
+pag de ce 1
+pag de chaqu 1
+pag de koan 1
+pag de la 1
+pag de mvp 1
+pag de tail 1
+pag decomposit 1
+pag decomposit system 1
+pag decomposit task 1
+pag diff 1
+pag diff erent 1
+pag disjoint 1
+pag disk 1
+pag disk acc 1
+pag distinct 1
+pag doit 1
+pag doit alor 1
+pag doit effectuer 1
+pag don 1
+pag don ee 1
+pag donc 1
+pag donc de 1
+pag dont signif 1
+pag du 1
+pag du au 1
+pag du prem 1
+pag du program 1
+pag dun 1
+pag dun mvp 1
+pag el 1
+pag el appart 1
+pag en 1
+pag en commun 1
+pag en conflit 1
+pag en conserv 1
+pag en critur 1
+pag en ecritur 1
+pag en esp 1
+pag en fonct 1
+pag en lectur 1
+pag en util 1
+pag engendr 1
+pag engendr ee 1
+pag engendr es 1
+pag entr 2
+pag entr en 1
+pag entr le 1
+pag entr ne 1
+pag entr processeur 1
+pag est 1
+pag est allou 1
+pag est appel 1
+pag est conflictuel 1
+pag est dit 1
+pag est donc 1
+pag est dynamiqu 1
+pag est equiv 1
+pag est init 1
+pag est inv 1
+pag est le 1
+pag est partag 1
+pag est quasim 1
+pag est similair 1
+pag et celu 1
+pag et com 1
+pag et de 1
+pag et donc 1
+pag et du 1
+pag et la 1
+pag et le 2
+pag et lenv 1
+pag et lutil 1
+pag et p2 1
+pag et processeur 1
+pag et qu 1
+pag et si 1
+pag et tail 1
+pag et util 1
+pag etant 1
+pag etant de 1
+pag etant implicit 1
+pag fault 3
+pag fault caus 1
+pag fault du 1
+pag fault handler 1
+pag fault incr 1
+pag fault mean 1
+pag fault occur 2
+pag fault overhead 1
+pag fault reduc 1
+pag fault tim 1
+pag fig 1
+pag finit 1
+pag finit apr 1
+pag finit avant 1
+pag for qu 1
+pag fr 1
+pag fr cr 1
+pag fr dur 1
+pag fr ne 1
+pag fr ou 1
+pag fr qu 1
+pag from techn 1
+pag giv 1
+pag giv respon 1
+pag granl 1
+pag i com 1
+pag i cont 1
+pag i est 1
+pag i ne 1
+pag i56 1
+pag ii 2
+pag il 1
+pag il engendr 1
+pag impliqu 1
+pag impliqu un 1
+pag induit 1
+pag induit par 1
+pag int block 1
+pag is ad 1
+pag is alloc 1
+pag is altern 1
+pag is pa 1
+pag is repr 1
+pag is shown 1
+pag is skew 1
+pag is st 1
+pag iv 1
+pag k repr 1
+pag layout 1
+pag le 1
+pag le chang 1
+pag level 1
+pag level affin 1
+pag loc 2
+pag lock 1
+pag lor 1
+pag lor de 1
+pag lorsqu 1
+pag lorsqu lon 1
+pag ma 1
+pag ma dautr 1
+pag ma la 1
+pag ma le 1
+pag ma peut 1
+pag may loc 1
+pag migr 1
+pag migr dun 1
+pag mod 2
+pag modif 1
+pag modif ee 1
+pag modif es 1
+pag montr 1
+pag montr qu 1
+pag n ecessair 1
+pag ne 1
+pag ne peuv 1
+pag ne po 1
+pag nest 1
+pag nest pa 1
+pag ni 1
+pag ni conflictuel 1
+pag non 1
+pag non conflictuel 1
+pag nous 1
+pag nous oblig 1
+pag nous permettr 1
+pag number 4
+pag of chang 1
+pag of memor 1
+pag on obt 1
+pag on virtu 1
+pag oper 1
+pag or 1
+pag or cach 1
+pag or docum 1
+pag ou 1
+pag ou dan 1
+pag ou lign 1
+pag ou lutil 1
+pag ou si 1
+pag p est 1
+pag p2 1
+pag pa 2
+pag pa dan 1
+pag par 1
+pag par acc 1
+pag par le 1
+pag par plusieur 1
+pag par un 1
+pag parm 1
+pag parm le 1
+pag pen 1
+pag pen lec 1
+pag perm 1
+pag perm de 1
+pag peut 1
+pag peut appartenir 1
+pag peuv 1
+pag peuv etr 1
+pag pi 1
+pag pi pj 1
+pag posit 1
+pag posit using 1
+pag posit wh 1
+pag pour 1
+pag pour chaqu 1
+pag pour eviter 1
+pag pour ivy 1
+pag pour recouvrer 1
+pag pour utiliser 1
+pag pouv 1
+pag pouv dan 1
+pag prequest 1
+pag processeur 1
+pag processeur entr 1
+pag propr 1
+pag propr etair 1
+pag protect 1
+pag protect se 1
+pag protect transit 1
+pag prov. 1
+pag provoqu 1
+pag provoqu es 1
+pag provoquerait 1
+pag provoquerait non 1
+pag qu 1
+pag qu con 1
+pag qu de 1
+pag qu la 1
+pag qu provoquer 1
+pag qu risquer 1
+pag qu seront 1
+pag quil 1
+pag quil engendr 1
+pag rel 1
+pag rest 1
+pag s 1
+pag scan 1
+pag se 1
+pag se font 1
+pag segm 1
+pag segm ba 1
+pag segm experim 1
+pag segm result 1
+pag segm task 1
+pag segm using 1
+pag separ 1
+pag ser 1
+pag ser beaucoup 1
+pag ser ch 1
+pag si 1
+pag si bien 1
+pag si le 1
+pag si se 1
+pag simultan 3
+pag simultan es 1
+pag simultan shar 1
+pag situ 1
+pag situ ee 1
+pag siz 5
+pag siz expr 1
+pag siz parameter 1
+pag skew 1
+pag skip 1
+pag sont 1
+pag sont alor 1
+pag sont conflictuel 1
+pag sont donc 1
+pag sont insuff 1
+pag sont le 1
+pag stabl 1
+pag stabl dur 1
+pag stabl est 1
+pag stabl seront 1
+pag status 1
+pag status word 1
+pag strateg 1
+pag suffit 1
+pag suffit pour 1
+pag suiv 1
+pag suiv le 1
+pag suiv leur 1
+pag sur 2
+pag sur deux 1
+pag sur koan 1
+pag sur laquel 1
+pag sur le 2
+pag sur lesquel 1
+pag suscept 1
+pag suscept de 1
+pag tabl 2
+pag tabl entr 1
+pag th number 1
+pag that contain 1
+pag to disk 1
+pag to hypoth 1
+pag to keep 1
+pag to nil 1
+pag touch 1
+pag traff 1
+pag transl 1
+pag transl us 1
+pag util 1
+pag util ee 1
+pag valent 1
+pag valent respectiv 1
+pag ver 1
+pag ver number 1
+pag wa tak 1
+pag wa tim 1
+pag wh 1
+pag wh text 1
+pag when kopt 1
+pag when underg 1
+pag wil incr 1
+pag wil therefor 1
+pag with mult 1
+pag writ 1
+pagec 1
+pagescolon 1
+pagescolon p0 1
+pagescolon p0 p1 1
+paid 5
+paig 1
+paig and fritz 1
+pain 2
+pain and transl 1
+pain of parameter 1
+pair 71
+pair a establ 1
+pair a rel 1
+pair a.12 1
+pair a.12 stream 1
+pair actu 1
+pair and connect 1
+pair and zer 1
+pair appear 1
+pair approach 1
+pair ar indeed 1
+pair belong 1
+pair compar 1
+pair comparison 1
+pair con 3
+pair configur 1
+pair construc 1
+pair correspon 1
+pair cour 1
+pair cover 1
+pair cover concept 1
+pair dadr 1
+pair de 2
+pair de la 1
+pair de point 1
+pair de processeur 1
+pair dinstruc 1
+pair disjoint 2
+pair disjoint path 1
+pair disjoint se 1
+pair ec 1
+pair en 1
+pair en point 1
+pair en som 1
+pair et c11 1
+pair evcont 1
+pair fail 1
+pair fd 1
+pair for lin 1
+pair forc 1
+pair form 1
+pair form ee 1
+pair fu 1
+pair fu0 1
+pair go 1
+pair ha compl 1
+pair hav cost 1
+pair hg 1
+pair hn 1
+pair horizont 1
+pair hp 1
+pair in ai 1
+pair in pb 1
+pair in so 1
+pair is execut 1
+pair is gener 1
+pair is giv 2
+pair is guaranteed 1
+pair is lin 1
+pair is produc 1
+pair is tak 1
+pair it st 1
+pair m0 1
+pair m0 r0 1
+pair may us 1
+pair merg 1
+pair merg ph 1
+pair must commun 1
+pair of 2d 1
+pair of adjac 4
+pair of answer 1
+pair of bar 1
+pair of block 1
+pair of claus 1
+pair of connect 1
+pair of connectiv 1
+pair of constraint 1
+pair of correspon 1
+pair of discr 1
+pair of disjoint 1
+pair of distinct 1
+pair of distribut 1
+pair of edg 1
+pair of el 1
+pair of ep 1
+pair of fac 1
+pair of funct 2
+pair of height 1
+pair of ident 1
+pair of imag 1
+pair of laser 1
+pair of letter 1
+pair of mach 1
+pair of map 1
+pair of marker 1
+pair of me 1
+pair of nod 4
+pair of object 1
+pair of observ 1
+pair of orthogon 1
+pair of part 1
+pair of particl 1
+pair of path 1
+pair of pb 1
+pair of polygon 1
+pair of posit 1
+pair of preproc 1
+pair of prim 1
+pair of proc 2
+pair of procedur 1
+pair of qu 1
+pair of reg 1
+pair of resolut 1
+pair of rl 1
+pair of sampl 1
+pair of self 1
+pair of sibl 1
+pair of signif 1
+pair of sit 2
+pair of stat 2
+pair of sub 2
+pair of substr 1
+pair of switch 1
+pair of symmeter 1
+pair of term 1
+pair of traver 1
+pair of triangl 1
+pair of unidirect 1
+pair of univer 1
+pair of variabl 2
+pair of vect 1
+pair of ver 3
+pair of zer 1
+pair pb 1
+pair pr 1
+pair pr ec 1
+pair record 1
+pair record clr 1
+pair regard 1
+pair request 1
+pair se 1
+pair se union 1
+pair shortest 2
+pair shortest path 2
+pair st 1
+pair stream 1
+pair stream string 1
+pair sum 1
+pair superp 1
+pair system 1
+pair t i1 1
+pair t test 1
+pair test 1
+pair test compar 1
+pair th clr 1
+pair th op 1
+pair that giv 1
+pair that proc 1
+pair that writ 1
+pair to method 1
+pair to replac 1
+pair upgrad 1
+pair wa introduc 1
+pair wa report 1
+pair we introduc 1
+pair wer ch 1
+pair wh 1
+pair wh turn 1
+pair wi 1
+pair wi match 1
+pairnod 1
+pal 13
+pal a ce 1
+pal alt 6
+pal alt labor 1
+pal alt research 1
+pal aux 1
+pal aux inconv 1
+pal ce 2
+pal ce inconv 1
+pal ce probl 1
+pal le 1
+pal le probl 1
+pal singh 1
+palam 1
+palindrom 1
+palindrom by commutat 1
+palindrom order 1
+palindrom sequ 1
+palmer 1
+pam 3
+pam figur 1
+pan 10
+pan ain 1
+pan ain qu 1
+pan catastrophiqu 1
+pan ci.oh 2
+pan ci.oh st.edu 2
+pan dept 1
+pan displ 1
+pan displ loc 1
+pan ec 1
+pan est 1
+pan est franch 1
+pan et al 1
+pan et de 1
+pan pac.html 1
+pan paper.html 1
+pan par 1
+pan se 1
+pan se produit 1
+pan sont 1
+pan sont distribu 1
+panac 1
+panac ee 1
+panangad 1
+panason 1
+panason technolog 1
+pancak 1
+pandag 2
+pandag ci.oh 2
+pandag ci.oh st.edu 2
+pandemon 1
+pandemon agr 1
+pandemon another techniqu 1
+pandemon answer 1
+pandemon answer reason 1
+pandemon architectur 1
+pandemon architectur allow 1
+pandemon architectur giv 1
+pandemon becom 1
+pandemon but min 1
+pandemon ca 1
+pandemon classif 1
+pandemon complec 1
+pandemon complec str 1
+pandemon con 1
+pandemon decomposit 1
+pandemon decomposit method 1
+pandemon develop 1
+pandemon discrim 1
+pandemon draft 1
+pandemon ev worker 1
+pandemon filter 1
+pandemon id 1
+pandemon in solut 1
+pandemon is disc 1
+pandemon level 1
+pandemon mechan 1
+pandemon modl 1
+pandemon modl architectur 1
+pandemon monit 1
+pandemon monit unlearn 1
+pandemon network 1
+pandemon network system 1
+pandemon pictur 1
+pandemon problem 1
+pandemon problem decomposit 1
+pandemon prov 1
+pandemon reflect 1
+pandemon reflect system 1
+pandemon superv 1
+pandemon system 1
+pandemon system admon 1
+pandemon system con 1
+pandemon system integr 1
+pandemon system perform 1
+pandemon system rapid 1
+pandemon th number 1
+pandemon to spec 1
+pandemon train 1
+pandemon wer init 1
+pandemon wil prov 1
+pandor 1
+pandor ii 1
+panel 5
+panel dimin 1
+panel dimin degr 1
+panel disc 1
+panel of programmer 1
+panel rec 1
+pang 1
+pannereparationfin 1
+pannereparationfin de 1
+panwar 1
+panwar and chirst 1
+pap 2
+pap pour 1
+pap pour leur 1
+pap pr 1
+pap pr ealabl 1
+pap.informatik.tu 1
+pap.informatik.tu muench.de 1
+pap.informatik.tu muench.de mitarbeiter 1
+pap94 1
+papadimitriou 5
+papadimitriou and yannakak 1
+papamarc 1
+papeg 1
+paper 117
+paper a posterior 1
+paper abstract 1
+paper abstract interch 1
+paper accept 1
+paper actu 1
+paper actu work 1
+paper addr 2
+paper addr me 1
+paper al establ 1
+paper al serv 1
+paper allow 1
+paper allow arbitr 1
+paper allow multicast 1
+paper an 1
+paper and book 1
+paper and lic 1
+paper and point 1
+paper appear 7
+paper ar appl 5
+paper ar avail 2
+paper ar encour 1
+paper ar implem 1
+paper ar inclus 1
+paper ar organ 1
+paper ar root 1
+paper ar support 1
+paper argu 1
+paper bar 1
+paper bar synchron 1
+paper borrow 1
+paper borrow id 1
+paper by reed 1
+paper by suggest 1
+paper cit 1
+paper cl 1
+paper concentr 2
+paper concern featur 1
+paper conclus 2
+paper connect 1
+paper connect structur 1
+paper consider 1
+paper constitut 1
+paper contain 2
+paper deal 4
+paper demonstr 1
+paper describ 12
+paper describ ong 1
+paper detail 1
+paper disc 5
+paper disc feedback 1
+paper disc methodolog 2
+paper elabor 1
+paper examin 3
+paper examin rol 1
+paper examin switch 1
+paper ext 2
+paper first appear 1
+paper first introduc 1
+paper foc 5
+paper foc main 1
+paper giv 1
+paper giv lower 1
+paper ha appear 1
+paper ha dealt 1
+paper ha pr 1
+paper harel 1
+paper harel maintain 1
+paper i investig 1
+paper introduc 5
+paper introduc id 1
+paper introduc loc 1
+paper is adapt 1
+paper is avail 1
+paper is cl 1
+paper is comp 1
+paper is concern 1
+paper is gear 1
+paper is meant 1
+paper is organ 24
+paper is partit 1
+paper is sect 1
+paper is structur 1
+paper label 1
+paper latbw 1
+paper latbw commperf.html 1
+paper lg 1
+paper log 1
+paper log denot 1
+paper may deserv 1
+paper ment 1
+paper miller 1
+paper miller ic92.dv.z 1
+paper mlevel 1
+paper mlevel an.ps 1
+paper mlevel ser.ps 1
+paper mor self 1
+paper mt 1
+paper mt henz.ps.z 1
+paper of aa 1
+paper on adapt 1
+paper on minim 1
+paper on standard 1
+paper organ 1
+paper outl 1
+paper parallel 1
+paper parallel algorithm 1
+paper pr 12
+paper pr specl 1
+paper prop 2
+paper prop specl 1
+paper prov 4
+paper ps 1
+paper ps inf.ps 1
+paper ps rqtkd96.ps 1
+paper report 3
+paper ser 1
+paper show 3
+paper th decomposit 1
+paper th graph 1
+paper th quest 1
+paper that appear 1
+paper that reason 1
+paper to appear 1
+paper to en 1
+paper to illustr 2
+paper to solut 1
+paper tr 1
+paper us 2
+paper wa compl 1
+paper wa publ 1
+paper we ad 1
+paper we addr 3
+paper we assum 4
+paper we build 1
+paper we ch 2
+paper we concentr 1
+paper we consider 3
+paper we describ 5
+paper we develop 1
+paper we disc 3
+paper we elabor 1
+paper we evalu 1
+paper we examin 1
+paper we exploit 1
+paper we giv 1
+paper we introduc 3
+paper we investig 1
+paper we mak 1
+paper we outl 1
+paper we pr 1
+paper we prop 4
+paper we regard 1
+paper we report 1
+paper we review 1
+paper we show 2
+paper we stud 2
+paper we tak 2
+paper we us 7
+paper we work 2
+paper which describ 1
+paper wil appear 1
+paper wil prov 2
+paper.html 2
+paper2 1
+paper2 accur 1
+paper2 accur an 1
+paperswww94 1
+paperswww94 ddimitr.ps 1
+paperswww94 speh.ps 1
+papewr 1
+papewr is avail 1
+papoul 1
+par 34
+par 2k 1
+par abus 1
+par abus de 1
+par acc 1
+par acc es 1
+par addit 1
+par adr 1
+par affect 1
+par affect destruc 1
+par ailleur 3
+par ailleur ain 1
+par ailleur chaqu 1
+par al expr 1
+par am elior 1
+par an 2
+par an de 1
+par an le 1
+par an quil 1
+par an statiqu 1
+par analog 1
+par analog avec 1
+par analyser 1
+par analyser le 1
+par ancourt 1
+par and ambigu 1
+par appl 3
+par appl de 3
+par arg1 1
+par bien 1
+par bien de 1
+par bit 1
+par bloc 1
+par bloc ca 1
+par bloc de 1
+par bloc distribut 1
+par bloc dit 1
+par bloc dun 1
+par bloc justif 1
+par bloc le 1
+par bloc provoqu 1
+par bloc sur 1
+par bow 1
+par bp 1
+par bp ou 1
+par bus 1
+par bus ou 1
+par but 1
+par but na 1
+par carlsson 1
+par carlsson dan 1
+par cat 1
+par cat egor 1
+par ce 2
+par ce calcl 1
+par ce cel 1
+par ce environ 1
+par ce proposit 1
+par ce protocol 1
+par ce syst 1
+par ced 1
+par cel 1
+par certain 1
+par certain ch 1
+par chacun 1
+par chacun de 1
+par chaqu 2
+par chaqu instruc 1
+par chaqu point 1
+par cherch 1
+par cherch le 1
+par claus 1
+par claus instruc 1
+par claus na 1
+par claus se 1
+par colon 2
+par colon dan 1
+par colon donc 1
+par colon si 1
+par compact 1
+par compact afin 1
+par comparaison 1
+par comparaison avec 1
+par comput 1
+par con 2
+par con equent 2
+par concat 2
+par concat enat 2
+par connec 1
+par connec au 1
+par construc 1
+par construc de 1
+par contr 4
+par contr dautr 1
+par contr el 1
+par contr lalgorithm 1
+par contr le 1
+par contraint 1
+par contraint chip 1
+par contrap 1
+par conv 1
+par cop 1
+par cop compat 1
+par cop de 1
+par cop est 1
+par cop nest 1
+par cop pur 1
+par cop se 1
+par cp 1
+par cr 1
+par cr pour 1
+par cutpt 1
+par d ecrir 1
+par d efaut 2
+par d efinit 2
+par d le 1
+par d onit 1
+par d1 1
+par de 6
+par de acc 1
+par de acquisit 1
+par de algorithm 1
+par de appel 1
+par de asser 1
+par de aut 1
+par de bloc 1
+par de but 1
+par de calcl 1
+par de ce 2
+par de cel 1
+par de consid 1
+par de dilat 1
+par de enregister 1
+par de environ 1
+par de facteur 2
+par de gain 1
+par de grain 1
+par de hypoth 1
+par de instruc 1
+par de nid 1
+par de nouvel 1
+par de op 1
+par de outil 1
+par de port 1
+par de prat 1
+par de processeur 1
+par de propr 1
+par de register 1
+par de saut 1
+par de techniqu 1
+par de term 1
+par de test 1
+par de variabl 1
+par de vecteur 1
+par dem 1
+par dem dan 1
+par deux 4
+par deux ch 1
+par deux facteur 1
+par deux le 1
+par deux point 1
+par deux processeur 1
+par deux raison 1
+par devoir 1
+par devoir etr 1
+par dichotom 1
+par dichotom tel 1
+par differ 1
+par diffus 1
+par diffus sur 1
+par distribut 1
+par distribut de 1
+par distribut du 1
+par dr 1
+par e ibn 1
+par e tail 1
+par echang 1
+par echang de 1
+par echantillon 1
+par echantillon pr 1
+par echec 1
+par eclip 1
+par ecritur 1
+par ek 1
+par el 6
+par el ad 1
+par el adapt 1
+par el affich 1
+par el au 1
+par el auror 1
+par el automatiqu 1
+par el aux 1
+par el avec 1
+par el compliqu 1
+par el comport 1
+par el con 1
+par el correspon 1
+par el dan 1
+par el de 3
+par el distribu 1
+par el du 1
+par el dun 1
+par el ee 1
+par el efficac 1
+par el ement 1
+par el en 1
+par el entr 1
+par el est 2
+par el evoqu 1
+par el extern 1
+par el finit 1
+par el il 1
+par el ma 1
+par el mimd 1
+par el ne 1
+par el orient 1
+par el ou 1
+par el par 1
+par el parfait 1
+par el perm 1
+par el po 1
+par el pour 3
+par el pr 2
+par el produit 1
+par el qu 1
+par el respectiv 1
+par el selon 1
+par el sont 2
+par el standard 1
+par el suiv 1
+par el sur 2
+par el tel 1
+par el ten 1
+par el util 1
+par elan 1
+par eliser 1
+par eliser no 1
+par elism 4
+par elism contenu 1
+par elism dan 1
+par elism de 3
+par elism dispon 1
+par elism du 1
+par elism dun 1
+par elism dur 1
+par elism en 1
+par elism est 2
+par elism evoqu 1
+par elism implicit 1
+par elism inh 1
+par elism ou 1
+par elism qu 1
+par elism quel 1
+par elism quil 1
+par elism rappel 1
+par elism risqu 1
+par elism trop 1
+par empil 1
+par empil de 1
+par empil denviron 1
+par en 1
+par en erat 1
+par environ 1
+par environ de 1
+par etiqu 1
+par etiqu de 1
+par evalu 1
+par evalu partiel 1
+par examiner 1
+par examiner le 1
+par exempl 6
+par exempl aquarius 1
+par exempl au 1
+par exempl binprolog 1
+par exempl com 1
+par exempl contraint 1
+par exempl de 2
+par exempl du 1
+par exempl en 2
+par exempl la 1
+par exempl le 2
+par exempl lor 1
+par exempl lorsqu 1
+par exempl ma 1
+par exempl nu 1
+par exempl par 2
+par exempl parc 1
+par exempl passer 1
+par exempl penser 1
+par exempl pour 2
+par exempl qu 1
+par exempl setof 1
+par exempl shallow 1
+par exempl si 1
+par exempl un 1
+par experim 1
+par exprimer 1
+par exprimer au 1
+par ext 1
+par ext qu 1
+par faux 1
+par faux part 1
+par feautr 1
+par funct 1
+par g en 1
+par goldberg 1
+par gr 1
+par gr temp 1
+par group 1
+par h de 1
+par h du 1
+par h ma 1
+par holland 1
+par holzbaur 1
+par holzbaur sappliqu 1
+par holzbaur143 1
+par hybrid 1
+par hybrid en 1
+par hypoth 1
+par hypoth es 1
+par icp 1
+par inform 1
+par inform glob 1
+par int 1
+par int object 1
+par int re 1
+par inv 1
+par inv de 1
+par inv ou 1
+par inv sur 1
+par inver 1
+par inver de 1
+par is ba 1
+par is concern 1
+par it bien 1
+par it jm 1
+par jalb 1
+par ken 1
+par koan 1
+par l echec 1
+par l elag 1
+par l equ 2
+par l mac 1
+par la 5
+par la boucl 1
+par la cel 1
+par la claus 1
+par la communaut 1
+par la condit 1
+par la coupur 1
+par la cr 1
+par la disparit 1
+par la disposit 1
+par la dom 1
+par la don 1
+par la figur 1
+par la fonct 1
+par la form 1
+par la forml 2
+par la gest 1
+par la ma 1
+par la matr 1
+par la meilleur 1
+par la mi 1
+par la modif 1
+par la mut 1
+par la pr 1
+par la prim 1
+par la probabilit 1
+par la proposit 1
+par la recherch 1
+par la sel 1
+par la solut 1
+par la sp 1
+par la structur 1
+par la suit 3
+par la svd 1
+par la tabl 1
+par la tail 1
+par la th 1
+par la transform 2
+par la valeur 1
+par la var 1
+par la ver 2
+par la volont 2
+par la wam 1
+par lab 1
+par lab de 1
+par lact 1
+par lact du 1
+par ladopt 1
+par ladopt dun 1
+par ladr 1
+par ladr du 1
+par lag 1
+par lag au 1
+par lagc 1
+par lagc est 1
+par lalgorithm 1
+par lalgorithm de 1
+par lalgorithm suiv 1
+par lalloc 1
+par lalloc dun 1
+par lam 1
+par lam elior 1
+par lanc 1
+par langu 1
+par lappel 1
+par lappl 1
+par lappl nl 1
+par laquel 1
+par laquel ce 1
+par laut 1
+par le 5
+par le ac 1
+par le ag 1
+par le algorithm 1
+par le appl 1
+par le attribut 1
+par le bi 2
+par le cach 1
+par le ch 2
+par le champ 1
+par le co 1
+par le cod 1
+par le colon 1
+par le compilateur 2
+par le concepteur 2
+par le conflit 1
+par le construc 1
+par le contraint 1
+par le degr 1
+par le deux 2
+par le diff 2
+par le don 2
+par le fait 4
+par le fonct 1
+par le foncteur 1
+par le fur 1
+par le gestionnair 1
+par le huitouz 1
+par le ind 1
+par le instruc 1
+par le interfac 1
+par le marqu 1
+par le mat 2
+par le matr 2
+par le menu 1
+par le mod 1
+par le nombr 2
+par le obj 1
+par le op 1
+par le partit 1
+par le point 1
+par le pour 1
+par le pr 1
+par le prem 1
+par le processeur 1
+par le programmeur 2
+par le proj 1
+par le protocol 1
+par le pseud 1
+par le pu 1
+par le rapport 1
+par le register 1
+par le retour 1
+par le simplec 1
+par le simulateur 1
+par le syst 1
+par le tableau 1
+par le temp 1
+par le term 1
+par le th 1
+par le tir 1
+par le tutoriel 1
+par le variabl 1
+par le vecteur 3
+par le ver 1
+par le vol 1
+par lec 2
+par lec dun 1
+par lec ecut 1
+par lectur 1
+par lement 1
+par lement un 1
+par lenv 1
+par lenv dun 1
+par lenviron 1
+par lequel 1
+par lequel linform 1
+par leur 2
+par leur mod 1
+par leur modl 1
+par leur organ 1
+par leur topolog 1
+par lexempl 1
+par lexempl classiqu 1
+par lexpr 1
+par lidentit 1
+par lign 1
+par lin 2
+par lin egalit 2
+par lindgr 1
+par linit 1
+par linit de 1
+par linser 1
+par linser de 1
+par linstruc 1
+par linstruc cut 1
+par linstruc eval 1
+par linstruc neck 1
+par linstruc qu 1
+par linstruc retr 1
+par linstruc trust 1
+par linstruc try 1
+par linstruc unif 1
+par lint 1
+par lint egr 1
+par linterm 1
+par linterm ediair 1
+par lintroduc 2
+par lintroduc de 1
+par lintroduc dun 1
+par lism 1
+par lism ecol 1
+par loc 1
+par loc par 1
+par lop 2
+par lop erateur 2
+par loptim 1
+par loptim dappel 1
+par lunif 1
+par lunit 1
+par lutil 2
+par lutil de 2
+par lutil dobj 1
+par lutil dop 1
+par lutil du 1
+par lutil dun 2
+par lutilisateur 2
+par lutilisateur ne 1
+par lutilisateur ou 1
+par lutilisateur sont 1
+par mac 1
+par maint 1
+par maint auteur 1
+par marqu 1
+par me 1
+par me dan 1
+par mi 1
+par microcod 1
+par microcod ren 1
+par mitteilung 1
+par mod 1
+par mod dunif 1
+par montrer 1
+par montrer qu 1
+par montrer quel 1
+par montrer quil 1
+par naish 1
+par naish pour 1
+par natur 2
+par natur par 1
+par nid 1
+par notr 1
+par notr ver 1
+par nous 1
+par nous ramener 1
+par nouvelarg 1
+par oboyl 1
+par of arbitr 1
+par of occam 1
+par optim 1
+par optim dappel 1
+par ordinateur 1
+par ordr 1
+par p r0 1
+par p un 1
+par pa 2
+par pa de 2
+par pag 1
+par pag dan 1
+par pag de 1
+par pag etant 1
+par pag perm 1
+par pair 1
+par paron 1
+par part 2
+par part de 2
+par part se 1
+par patron 1
+par patron apr 1
+par patron assur 1
+par patron le 1
+par patron pour 1
+par pav 1
+par pav es 1
+par ph 1
+par pl 1
+par plusieur 3
+par plusieur branch 1
+par plusieur nid 1
+par plusieur processeur 2
+par pr 2
+par pr eciser 1
+par pr edicat 1
+par problem 2
+par problem con 1
+par proc 1
+par quelqu 1
+par quelqu instruc 1
+par r ecur 1
+par r esumer 2
+par rappeler 1
+par rappeler certain 1
+par rapport 4
+par rapport au 2
+par rapport aux 1
+par register 1
+par remarquer 1
+par remarquer qu 1
+par reproduc 1
+par research 1
+par research labor 1
+par retour 1
+par retour ar 1
+par robinson 1
+par s equ 1
+par sa 1
+par sa matr 1
+par se 2
+par se bon 1
+par se colon 1
+par secon 2
+par segm 1
+par sep 1
+par setarg 1
+par si 1
+par siml 1
+par siml de 1
+par siml guid 1
+par siml la 1
+par siml pour 1
+par siml pr 1
+par siml standard 1
+par simpl 1
+par simpl adr 1
+par simpl cop 1
+par simpl modif 1
+par simpl substitut 1
+par simpl transform 1
+par son 2
+par son expr 1
+par son inver 1
+par son propr 1
+par souc 1
+par souc de 1
+par souc dexhaustivit 1
+par sp 1
+par sp ecif 1
+par specif 1
+par ssik 1
+par ssik la 1
+par stream 1
+par sub. 1
+par substitut 1
+par substitut est 1
+par t 1i 1
+par t pa 1
+par t particl 1
+par t t4 1
+par tarau 1
+par tarau dan 1
+par taylor 1
+par taylor dan 1
+par th 1
+par th entir 1
+par th method 1
+par th montaut 1
+par th sent 1
+par tick 1
+par tick pour 1
+par tim 1
+par tim test 1
+par to disc 1
+par touat 1
+par tous 1
+par tous le 1
+par tout 2
+par tout autr 1
+par tout leur 1
+par tout transform 1
+par tr 3
+par tr difficil 1
+par tr simpl 1
+par transform 2
+par transform de 2
+par transl 1
+par transl de 1
+par trop 1
+par trop exub 1
+par tw level 1
+par un 6
+par un acc 1
+par un adr 1
+par un ag 1
+par un ajust 1
+par un algorithm 1
+par un allong 1
+par un an 2
+par un appl 1
+par un aut 1
+par un autr 1
+par un bus 1
+par un cel 1
+par un ch 1
+par un cl 1
+par un coeff 1
+par un conclus 1
+par un conflit 1
+par un const 1
+par un coupur 1
+par un cr 1
+par un de 1
+par un dilat 1
+par un direct 1
+par un eff 1
+par un emulateur 1
+par un ensembl 1
+par un facteur 1
+par un fonct 3
+par un glob 1
+par un grand 1
+par un instruc 1
+par un list 1
+par un loc 1
+par un matr 2
+par un meilleur 1
+par un mut 1
+par un non 1
+par un op 2
+par un ou 1
+par un pa 1
+par un pair 1
+par un partit 1
+par un pil 1
+par un point 2
+par un politiqu 1
+par un pr 1
+par un princip 1
+par un processeur 1
+par un program 1
+par un proposit 1
+par un protocol 1
+par un repr 1
+par un sel 1
+par un simpl 2
+par un syst 1
+par un tabl 1
+par un tel 1
+par un term 1
+par un transform 2
+par un var 1
+par un vecteur 2
+par unif 1
+par unif conduit 1
+par unif ou 1
+par util 1
+par util de 1
+par v de 1
+par van 1
+par van roy 1
+par var 1
+par var domain 1
+par variabl 1
+par variabl partag 1
+par vi 6
+par war 1
+par war com 1
+par war dan 1
+par workshop 1
+par x1i 1
+par x1i x2i 1
+par xd 1
+par xz 1
+par zhou 1
+par zhou dan 1
+par. 2
+par16 1
+par32 1
+par76 1
+par8 1
+parabol 2
+parabol and consider 1
+parabol assum 1
+parabol assum perfect 1
+parabol model 1
+parabol model outl 1
+parabol show 1
+parabol that minimiz 1
+parabol to consecut 1
+parabol without signif 1
+parad 1
+paradigm 26
+paradigm addr 1
+paradigm and distribut 1
+paradigm and self 1
+paradigm appear 1
+paradigm ar cur 1
+paradigm ar incr 1
+paradigm ar inh 1
+paradigm avail 1
+paradigm ba 1
+paradigm can trem 1
+paradigm con 1
+paradigm de 1
+paradigm de typ 1
+paradigm design 1
+paradigm did indeed 1
+paradigm exhibit 1
+paradigm for learn 1
+paradigm for softwar 1
+paradigm formaliz 1
+paradigm hav mad 1
+paradigm in order 1
+paradigm is pr 1
+paradigm is slop 1
+paradigm of loc 1
+paradigm of perform 1
+paradigm of react 1
+paradigm to exploit 1
+paradigm us cost 1
+paradigm wh 1
+paradigm with rel 1
+paradox 2
+paradox de 1
+paradox lead 1
+parafr 2
+paragon 9
+paragon and cr 1
+paragon ar reduc 1
+paragon compar 1
+paragon de 1
+paragon de lir 1
+paragon dintel 1
+paragon dintel qu 1
+paragon don 1
+paragon est 1
+paragon est relativ 1
+paragon fortran 1
+paragon fortran compiler 1
+paragon mer 1
+paragon multiproc 1
+paragon multiproc shar 1
+paragon osf 2
+paragon proc 2
+paragon proc i860 1
+paragon program 1
+paragon program paradigm 1
+paragon qu 1
+paragon qu garantit 1
+paragon supercomputer 1
+paragon user 1
+paragon user guid 1
+paragon xp 7
+paragraph 12
+paragraph a la 1
+paragraph au 1
+paragraph auront 1
+paragraph auront pour 1
+paragraph avec 1
+paragraph certain 1
+paragraph certain ca 1
+paragraph com 2
+paragraph com calculer 1
+paragraph com suit 1
+paragraph compl 1
+paragraph compl eter 1
+paragraph d ecrit 1
+paragraph don 1
+paragraph don dan 1
+paragraph don un 1
+paragraph entitl 1
+paragraph entitl autom 1
+paragraph est 1
+paragraph est de 1
+paragraph et par 1
+paragraph foc 1
+paragraph illustrer 1
+paragraph illustrer sur 1
+paragraph ind 1
+paragraph la 1
+paragraph la form 1
+paragraph le 1
+paragraph le deux 1
+paragraph le impl 1
+paragraph nous 2
+paragraph nous avon 1
+paragraph nous pr 1
+paragraph ont 1
+paragraph par 1
+paragraph par un 1
+paragraph pr 2
+paragraph pr ec 2
+paragraph pr esent 1
+paragraph qu 1
+paragraph qu le 1
+paragraph suiv 3
+paragraph suiv com 1
+paragraph suiv don 1
+paragraph suiv est 1
+paragraph suiv illustr 1
+paragraph suiv le 1
+paragraph suiv par 1
+paragraph suiv pr 1
+paragraph suiv un 1
+paragraph we compar 1
+parallel 75
+parallel a singl 1
+parallel acc 2
+parallel accord 1
+parallel accordint 1
+parallel achief 2
+parallel act 1
+parallel act ba 1
+parallel algorithm 22
+parallel algorithm allev 1
+parallel algorithm expan 1
+parallel algorithm follow 1
+parallel algorithm giv 1
+parallel algorithm lansp 1
+parallel algorithm map 1
+parallel algorithm repr 1
+parallel algorithm run 1
+parallel algorithm show 1
+parallel an individu 1
+parallel and allev 1
+parallel and block 1
+parallel and commun 1
+parallel and dat 2
+parallel and distribut 22
+parallel and distributd 1
+parallel and glob 1
+parallel and loc 1
+parallel and measur 1
+parallel and mult 1
+parallel and pack 1
+parallel and react 1
+parallel and reduc 1
+parallel and schedl 1
+parallel and ser 1
+parallel and smooth 1
+parallel and vect 3
+parallel and work 1
+parallel appear 1
+parallel appl 4
+parallel approach 1
+parallel ar 2
+parallel ar describ 1
+parallel ar implem 1
+parallel ar pr 1
+parallel architectur 7
+parallel architectur design 1
+parallel at var 1
+parallel avail 2
+parallel b tr 1
+parallel ba 1
+parallel bay 1
+parallel bay object 1
+parallel be distribut 1
+parallel bit 1
+parallel block 1
+parallel block transfer 1
+parallel bottom 1
+parallel branch 1
+parallel but context 1
+parallel but suffer 1
+parallel by an 1
+parallel by appl 1
+parallel by elimin 1
+parallel by partit 1
+parallel by stat 1
+parallel cal 1
+parallel can offer 1
+parallel can tel 1
+parallel capabil 1
+parallel cg 1
+parallel cg algorithm 1
+parallel clp 1
+parallel clp system 1
+parallel cod 4
+parallel com 1
+parallel compiler 5
+parallel compiler an 1
+parallel complec 1
+parallel composit 2
+parallel composit a1 1
+parallel composit termin 1
+parallel comput 25
+parallel comput favor 1
+parallel comput for 1
+parallel comput geometer 1
+parallel comput model 1
+parallel comput system 2
+parallel computer 15
+parallel computer architectur 1
+parallel computer assoc 1
+parallel computer giv 1
+parallel computer rout 1
+parallel computer support 1
+parallel computer system 1
+parallel construc 2
+parallel construc def 1
+parallel could pot 1
+parallel count 1
+parallel count algorithm 1
+parallel d1 1
+parallel datab 2
+parallel datab system 1
+parallel dbm 1
+parallel dbm follow 1
+parallel decomposit 1
+parallel digit 1
+parallel digit implem 1
+parallel directiv 1
+parallel discr 2
+parallel discr event 2
+parallel disk 1
+parallel distribut 5
+parallel distribut comput 1
+parallel distribut proc 3
+parallel distribut program 1
+parallel docum 1
+parallel docum retrief 1
+parallel dramat 1
+parallel drop 1
+parallel dur norm 1
+parallel ec 3
+parallel edg 1
+parallel edit 1
+parallel evalu 2
+parallel evalu method 1
+parallel execut 10
+parallel execut bod 1
+parallel execut mod 1
+parallel execut model 2
+parallel execut tim 2
+parallel exper 1
+parallel experim 1
+parallel explicit 1
+parallel exploit 2
+parallel exploit becom 1
+parallel f op 1
+parallel facil 1
+parallel facil avail 1
+parallel fact 1
+parallel fash 1
+parallel ffl 1
+parallel figur 1
+parallel figur report 1
+parallel for oracl 1
+parallel for part 1
+parallel for speech 1
+parallel for supersc 1
+parallel forml 2
+parallel forml disc 1
+parallel fortran 2
+parallel fortran compiler 1
+parallel fortran environm 1
+parallel from cod 1
+parallel funct 1
+parallel genet 1
+parallel genet algorithm 1
+parallel geograph 1
+parallel geograph inform 1
+parallel gi 1
+parallel gi problem 1
+parallel glob 1
+parallel graph 2
+parallel graph algorithm 1
+parallel graph partit 1
+parallel hardwar 1
+parallel hardwar implem 1
+parallel hav tak 1
+parallel heap 1
+parallel hid 1
+parallel hid surfac 1
+parallel hierarch 1
+parallel hierarch algorithm 1
+parallel hierarch memor 1
+parallel hypercub 1
+parallel hypercub algorithm 1
+parallel hyperplan 1
+parallel hyperplan defin 1
+parallel hypoth 1
+parallel i os 1
+parallel impl 1
+parallel implem 8
+parallel implem involut 1
+parallel in appl 1
+parallel in chronolog 1
+parallel in comput 2
+parallel in datalog 1
+parallel in genet 1
+parallel in log 1
+parallel in loop 1
+parallel in nest 1
+parallel in order 1
+parallel in pc 1
+parallel in regl 1
+parallel in spac 1
+parallel inh 2
+parallel init 1
+parallel init algorithm 1
+parallel inser 1
+parallel instruc 1
+parallel int inh 1
+parallel interfac 1
+parallel is achief 1
+parallel is avail 1
+parallel is concentr 1
+parallel is exploit 1
+parallel is greater 1
+parallel is implem 1
+parallel is lim 1
+parallel is prop 1
+parallel is therefor 1
+parallel is tru 1
+parallel is us 1
+parallel issu 1
+parallel iter 2
+parallel iter solver 1
+parallel lancz 1
+parallel lancz method 1
+parallel lancz tridiagon 1
+parallel langu 4
+parallel langu construc 1
+parallel lim 1
+parallel lo 1
+parallel log 1
+parallel log program 1
+parallel loop 4
+parallel loop bound 1
+parallel loop cod 1
+parallel loop glob 1
+parallel mach 8
+parallel mach model 2
+parallel man re. 1
+parallel man real 1
+parallel manipl 1
+parallel matr 1
+parallel matr vect 1
+parallel matur 1
+parallel me 1
+parallel me pa 1
+parallel measur 1
+parallel memor 1
+parallel memor hierarch 1
+parallel memor ii 1
+parallel might var 1
+parallel mod 2
+parallel model 3
+parallel mov 1
+parallel mov lem 1
+parallel multilevel 1
+parallel multilevel graph 1
+parallel multiproc 1
+parallel multiproc system 1
+parallel n bod 1
+parallel nest 1
+parallel nest dissect 1
+parallel network 1
+parallel number 1
+parallel object 1
+parallel object orient 1
+parallel obtain 1
+parallel of awerbuch 1
+parallel of eqntot 1
+parallel of gi 1
+parallel of goal 1
+parallel of grid 1
+parallel of iter 1
+parallel of numer 1
+parallel of tempor 1
+parallel offer 1
+parallel ont finit 1
+parallel oper 2
+parallel oper further 1
+parallel or vect 1
+parallel other fil 1
+parallel over tim 1
+parallel overhead 1
+parallel pattern 1
+parallel pattern proc 1
+parallel perform 1
+parallel plan 1
+parallel plan p1 1
+parallel po 1
+parallel pref 1
+parallel pref start 1
+parallel pref sum 1
+parallel primitiv 1
+parallel prior 1
+parallel prior dat 1
+parallel prior queu 1
+parallel problem 1
+parallel problem solut 1
+parallel proc 33
+parallel proc construc 1
+parallel proc model 1
+parallel proc symp 3
+parallel proc symposioum 1
+parallel proc system 1
+parallel proc techniqu 1
+parallel profil 1
+parallel profil smooth 1
+parallel program 13
+parallel program command 1
+parallel program construc 1
+parallel program design 2
+parallel program model 3
+parallel program perform 1
+parallel program schedl 1
+parallel project 1
+parallel prolog 2
+parallel prolog eng 1
+parallel prolog implem 1
+parallel proper 1
+parallel r tr 1
+parallel random 1
+parallel random acc 1
+parallel rar 1
+parallel rar exceed 1
+parallel real 1
+parallel real render 1
+parallel reduc 1
+parallel reduc coinc 1
+parallel reduc preserv 1
+parallel reg 1
+parallel rel 2
+parallel rel plan 1
+parallel result 1
+parallel result greater 1
+parallel rl 1
+parallel run 1
+parallel run tim 1
+parallel sa 1
+parallel sa algorithm 1
+parallel scientif 1
+parallel scientif comput 1
+parallel se 2
+parallel search 1
+parallel search structur 1
+parallel sect 1
+parallel sect construc 1
+parallel sect nonmaster 1
+parallel select 1
+parallel select algorithm 1
+parallel sem 1
+parallel separ 2
+parallel sequ 1
+parallel shar 1
+parallel shar memor 1
+parallel simd 1
+parallel simd mach 1
+parallel siml 3
+parallel siml an 2
+parallel smooth 1
+parallel so effect 1
+parallel sort 3
+parallel sort algorithm 1
+parallel spar 2
+parallel spar cholesk 1
+parallel spar matr 1
+parallel strateg 2
+parallel styl 1
+parallel such loop 1
+parallel supercomputer 1
+parallel support 1
+parallel svm 1
+parallel svm fortran 1
+parallel symbol 2
+parallel symbol comput 2
+parallel symbol langu 1
+parallel system 12
+parallel system ba 2
+parallel system con 1
+parallel system configur 1
+parallel system design 1
+parallel system du 1
+parallel system fal 1
+parallel system giv 1
+parallel system group 1
+parallel system using 1
+parallel task 2
+parallel techniqu 1
+parallel th appl 1
+parallel th gi 1
+parallel th loop 1
+parallel th program 1
+parallel th rang 1
+parallel than found 1
+parallel than minim 1
+parallel through parallel 1
+parallel through unif 1
+parallel tiefensuch 1
+parallel tim 2
+parallel to st 1
+parallel train 1
+parallel train approach 1
+parallel tren 2
+parallel unit 1
+parallel unnec 1
+parallel using 2
+parallel using control 1
+parallel using metropol 1
+parallel var 2
+parallel ver 3
+parallel virtu 1
+parallel virtu mach 1
+parallel vl 1
+parallel vl standard 1
+parallel wh 1
+parallel wi 1
+parallel wir 1
+parallel with derefer 1
+parallel with minim 1
+parallel with s1 1
+parallel with svm 1
+parallel within ba 1
+parallel work 1
+parallel writ 1
+parallel1 1
+parallelepip 2
+parallelepip of height 1
+parallelepip produc 1
+parallelisierung 1
+param 8
+param brdcast 1
+param brdcast period 1
+param etr 4
+param etr additionnel 1
+param etr afin 1
+param etr arit 1
+param etr correspon 1
+param etr dalign 1
+param etr dan 1
+param etr de 2
+param etr don 1
+param etr dorig 1
+param etr du 1
+param etr dun 3
+param etr ee 1
+param etr es 1
+param etr est 1
+param etr eux 1
+param etr indiqu 1
+param etr influ 1
+param etr la 1
+param etr li 1
+param etr ne 1
+param etr par 1
+param etr perm 1
+param etr pour 1
+param etr qu 2
+param etr sont 1
+param etr suiv 1
+param etr suppl 1
+param etr susceptibl 1
+param glob 1
+param glob topolog 1
+param list 1
+param loc 1
+param loc topolog 1
+param queu 1
+param rout 1
+param rout tabl 1
+param seq 1
+param structur 1
+param structur contain 1
+param tr 1
+param tr import 1
+param tr sont 1
+param triqu 1
+param triqu syst 1
+parameter 81
+parameter 180ff 1
+parameter a configur 1
+parameter actu 1
+parameter actu determin 1
+parameter affect 1
+parameter allow 1
+parameter an 1
+parameter and acc 1
+parameter and compon 2
+parameter and condit 1
+parameter and inclus 1
+parameter and methodolog 1
+parameter and output 1
+parameter and thus 1
+parameter and var 1
+parameter and variabl 1
+parameter ar 1
+parameter ar assign 1
+parameter ar ch 1
+parameter ar defin 1
+parameter ar describ 1
+parameter ar determin 1
+parameter ar giv 1
+parameter ar init 1
+parameter ar inject 1
+parameter ar known 1
+parameter ar re 1
+parameter ar substitut 1
+parameter as common 1
+parameter assoc 1
+parameter begin 1
+parameter being incr 1
+parameter bit 2
+parameter bit cycl 2
+parameter by realm 1
+parameter capabil 1
+parameter ch 1
+parameter cl 1
+parameter combin 1
+parameter compon 1
+parameter construc 1
+parameter cr 1
+parameter ct 1
+parameter d repr 1
+parameter datab 1
+parameter datab input 1
+parameter def 2
+parameter def comparison 1
+parameter describ 1
+parameter design 1
+parameter design model 1
+parameter determin 2
+parameter domain 1
+parameter e1 1
+parameter encod 1
+parameter estim 1
+parameter evalu 1
+parameter facil 1
+parameter fact 1
+parameter fk 1
+parameter for random 1
+parameter for rout 1
+parameter for st 1
+parameter gener 1
+parameter gener datab 1
+parameter gener tupl 1
+parameter giv 1
+parameter h con 1
+parameter identif 1
+parameter imp 1
+parameter in ad 1
+parameter in term 1
+parameter inclus 1
+parameter inclus aver 1
+parameter inclus inst 1
+parameter inclus nod 1
+parameter ind 1
+parameter inst 1
+parameter instead 1
+parameter integer 1
+parameter integer program 1
+parameter inter 2
+parameter inter cluster 2
+parameter involut 1
+parameter is alloc 1
+parameter is ba 1
+parameter is introduc 1
+parameter layout 1
+parameter layout repr 1
+parameter lik cluster 1
+parameter list 1
+parameter list creat 1
+parameter log 1
+parameter mak 1
+parameter mak pract 1
+parameter may requir 1
+parameter mean 2
+parameter mechan 1
+parameter model 1
+parameter modif 1
+parameter modif funct 1
+parameter modl 1
+parameter modl defin 1
+parameter nam 1
+parameter number 1
+parameter nw 1
+parameter occur 1
+parameter of cl 1
+parameter of distribut 1
+parameter of hop 1
+parameter of modl 1
+parameter of optim 1
+parameter of other 1
+parameter of prim 1
+parameter of rel 1
+parameter of ts 1
+parameter on appl 1
+parameter on nw 1
+parameter optim 1
+parameter or var 1
+parameter order 1
+parameter order sort 1
+parameter p valu 1
+parameter p1 2
+parameter p2 2
+parameter pa 1
+parameter pa mechan 1
+parameter pertain 1
+parameter pl 1
+parameter polyhedr 1
+parameter polyhedr using 1
+parameter polymorph 2
+parameter polymorph collap 1
+parameter polymorph interact 1
+parameter pr 1
+parameter pr closur 1
+parameter program 1
+parameter program model 1
+parameter realm 1
+parameter remain 1
+parameter remain unchang 1
+parameter remov 1
+parameter renam 1
+parameter repr 3
+parameter requir 1
+parameter s valu 1
+parameter se 3
+parameter se a1 1
+parameter se a2 1
+parameter se. 1
+parameter should fit 1
+parameter show 1
+parameter shown 1
+parameter sl1 1
+parameter sl1 modl 1
+parameter solut 1
+parameter solut iff 1
+parameter spac 1
+parameter specif 2
+parameter stat 1
+parameter strong 1
+parameter strong affect 1
+parameter sw 1
+parameter tacpt 1
+parameter targ 1
+parameter targ hierarch 1
+parameter tdsp 1
+parameter text 1
+parameter text transl 1
+parameter th bisect 2
+parameter th concept 1
+parameter th demand 2
+parameter th inst 1
+parameter th largest 1
+parameter th maxim 1
+parameter th typ 1
+parameter that determin 1
+parameter that grow 1
+parameter that minimiz 1
+parameter that repr 1
+parameter to allow 1
+parameter to cop 1
+parameter to gener 1
+parameter to repr 1
+parameter to se 1
+parameter to yield 1
+parameter tp 1
+parameter tp determin 1
+parameter train 1
+parameter ts 1
+parameter tupl 1
+parameter tupl describ 1
+parameter typ 3
+parameter typ interact 1
+parameter valu 7
+parameter valu chang 1
+parameter valu correspon 1
+parameter valu entr 1
+parameter valu mean 1
+parameter valu period 1
+parameter valu simil 1
+parameter vect 1
+parameter ver 1
+parameter wa accept 1
+parameter wa compar 1
+parameter wa encod 1
+parameter wa evalu 1
+parameter wa modif 1
+parameter wa tak 1
+parameter we conduc 1
+parameter wer adjust 1
+parameter wer assum 1
+parameter wer ch 1
+parameter wer neglect 1
+parameter wer test 1
+parameter which model 1
+parameter wijk 1
+parameter with respect 2
+parameter wmac 1
+parameter writ 1
+parameterop 1
+parameterop parameter 1
+paramter 1
+paramter using 1
+paramter using dual 1
+paraphr 3
+paraphr form 1
+paraphr that descript 1
+parasit 1
+parasit improv 1
+parasit improv siml 1
+parasol 1
+parasol fl 1
+parasol user 1
+parasol user guid 1
+parc 2
+parc con 1
+parc con tr 1
+parc qu 1
+parc qu le 1
+parc qu son 1
+parc quel 1
+parc quel est 1
+parc quel ne 1
+parc quel pr 1
+parc quil 1
+parc quil commenc 1
+parc quil exploit 1
+parc quil repr 1
+parc quil se 1
+parc quil termin 1
+parcel 1
+parcimonieus 2
+parcimonieus avec 1
+parcimonieus avec la 1
+parcour 3
+parcour beaucoup 1
+parcour de 2
+parcour de ce 1
+parcour de graph 1
+parcour de i1 1
+parcour de la 1
+parcour de lim 1
+parcour de matr 1
+parcour de pag 1
+parcour de point 1
+parcour de pol 1
+parcour donc 1
+parcour donc le 1
+parcour du 1
+parcour du pol 1
+parcour est 1
+parcour est transver 1
+parcour la 1
+parcour le 1
+parcour le tableau 1
+parcour lim 1
+parcour lim du 1
+parcour non 1
+parcour non convec 1
+parcour par 1
+parcour par pa 1
+parcour r ep 1
+parcourir 3
+parcourir la 1
+parcourir la pil 1
+parcourir le 2
+parcourir le point 1
+parcourir le trajectoir 1
+parcourir lensembl 1
+parcourir lensembl de 1
+parcourir par 1
+parcourir par de 1
+parcourir quun 1
+parcourir quun sous 1
+parcourir tout 1
+parcourir tout lespac 1
+parcourir un 1
+parcourir un trajectoir 1
+parcourt 1
+parcourt la 1
+parcourt le 1
+parcourt lensembl 1
+parcouru 1
+parcouru avec 1
+parcouru avec de 1
+parcouru dan 1
+parcouru san branch 1
+parcourus 1
+parcourus dan 1
+parcourus dan le 1
+parekh 1
+parent 26
+parent abstract 1
+parent and proc 1
+parent and zer 1
+parent as teach 1
+parent ayant 1
+parent ayant le 1
+parent chang 1
+parent cpn 1
+parent de 1
+parent de la 1
+parent enf 1
+parent figur 1
+parent grandpar 1
+parent if od 1
+parent is mad 1
+parent is nod 1
+parent is schedl 1
+parent may caus 1
+parent model 1
+parent nod 9
+parent nod receiv 1
+parent of nod 1
+parent or 1
+parent parent 1
+parent parent parent 1
+parent point 1
+parent pointer 1
+parent pointer prov 1
+parent popl 1
+parent proc 2
+parent proof 1
+parent s finish 1
+parent sen 1
+parent sont 1
+parent sont echang 1
+parent string 1
+parent sum 1
+parent tir 1
+parent to hold 1
+parent to rel 1
+parent to split 1
+parent transact 1
+parent transact record 1
+parent transact rollback 1
+parent upd 1
+parent upon subtransact 1
+parent wa oscil 1
+parent wil find 1
+parent with childr 1
+parenth 9
+parenth correspon 2
+parenth es 1
+parenth for cl 1
+parenth string 1
+paresch 2
+paresch compar 1
+paresch in saying 1
+paresch numer 1
+paresch us 1
+paresseus 1
+paresseus de 1
+paresseus de acc 1
+paresseus du 1
+paresseus du point 1
+paresseus qu 1
+paresseus qu sous 1
+parf 2
+parf insolubl 1
+parf po de 1
+parf tr 1
+parf tr fact 1
+parf vit 1
+parf vit de 1
+parfait 4
+parfait adapt 1
+parfait adapt es 1
+parfait compat 1
+parfait compat avec 1
+parfait dappl 1
+parfait dappl pour 1
+parfait et donc 1
+parfait imbriqu 1
+parfait imbriqu es 1
+parfait par 1
+parfait par el 1
+pargaonkar 1
+parikh 1
+paritybit 1
+park 16
+park road 1
+parker 3
+parker us 1
+parker us link 1
+parkin 1
+parkinson 1
+parkison 1
+parl 5
+parl alor 2
+parl alor de 2
+parl de 2
+parl de ba 1
+parl de court 1
+parl dun 1
+parl dun efficacit 1
+parl egal 1
+parl egal dan 1
+parl89 1
+parler 2
+parler de 1
+parler de par 1
+parler r eduit 1
+parlog 2
+parlog object 1
+parlog object orient 1
+parlog to polk 1
+parm 4
+parm an 1
+parm ce 1
+parm is slower 1
+parm is specif 1
+parm le 3
+parm le comp 1
+parm le mach 1
+parm le probl 1
+parm le techniqu 1
+parm lesquel 1
+parm lesquel le 1
+parm lesquel lutil 1
+parm lesquel outr 1
+parm un ensembl 1
+parmac 1
+parmac macr 1
+parn 2
+parn esp 1
+parn observ 1
+parod 1
+parod ba 1
+parod ba grammar 1
+parod demonstr 1
+parod gener 1
+parod gener system 1
+parod hemingw 1
+parod hemingw produc 1
+parod qu 1
+parod seem 1
+parod text 1
+parod th not 1
+parod to construc 1
+paron 1
+parqu 1
+parrot 1
+parser 6
+parser behaviour 1
+parser can allow 1
+parser construc 1
+parser correct 1
+parser definit 1
+parser descript 1
+parser for langu 1
+parser for occam 1
+parser gener 1
+parser is introduc 1
+parser itself run 1
+parser nam 1
+parser of chat 1
+parser rout 1
+parser rout gener 1
+parser siml 1
+parser siml eng 1
+parser specif 1
+parser specif inclus 1
+parser technolog 1
+parser that follow 1
+parser tr 1
+parser transformer 1
+parsetr 1
+parson 1
+part 116
+part a character 1
+part a grain 1
+part a lint 1
+part abstract 1
+part abstract typ 1
+part acc 1
+part acc edent 1
+part am elior 1
+part an 1
+part and consign 1
+part and le 1
+part and relationship 1
+part answer 1
+part appl 2
+part appl rl 1
+part appl7 1
+part ar prov 1
+part been pr 1
+part been shar 1
+part begin 1
+part begin sequ 1
+part being refin 1
+part belief 1
+part big 1
+part by appl 1
+part by fund 1
+part by grant 3
+part by ibm 1
+part by motorol 1
+part by na 1
+part by nserc 1
+part by nsf 12
+part by rom 1
+part by tatp 1
+part ce 1
+part ce modif 1
+part cel 1
+part cel perm 1
+part chac 1
+part chac multilevel 1
+part chaqu 1
+part chaqu processeur 1
+part cl 1
+part cl dict 1
+part com 1
+part com assouplir 1
+part com le 1
+part com nous 1
+part commenc 1
+part comp 3
+part comp le 1
+part comput 2
+part comput answer 1
+part concern 1
+part concern med 1
+part condit 1
+part condit de 1
+part connect 1
+part constraint 1
+part constraint satisf 1
+part contain 1
+part contain rough 1
+part context 1
+part continu 2
+part continu de 1
+part contr 1
+part contr cop 1
+part control 1
+part correct 1
+part correspon 1
+part cover 2
+part dan 1
+part dan de 1
+part dan le 1
+part daugmenter 1
+part daugmenter le 1
+part de 4
+part de calcl 1
+part de ce 2
+part de certain 1
+part de champ 1
+part de cod 1
+part de deux 1
+part de don 1
+part de etud 1
+part de fournir 1
+part de instruc 1
+part de la 3
+part de ladapt 1
+part de lenviron 1
+part de lextensibilit 1
+part de lim 1
+part de linform 1
+part de mettr 1
+part de mieux 1
+part de nouvel 1
+part de pag 1
+part de program 1
+part de repr 1
+part de responsabilit 1
+part de structur 1
+part de var 1
+part de variabl 1
+part de ver 1
+part de zn 1
+part descript 1
+part differ 4
+part differ equ 4
+part difficil 1
+part dinform 1
+part dinform entr 1
+part distribut 1
+part doubl 1
+part doubl ee 1
+part droit 1
+part droit de 1
+part du 3
+part du chapitr 1
+part du cod 1
+part du contr 1
+part du fait 1
+part du manuscrit 1
+part du non 1
+part du nouvel 1
+part du pr 1
+part du programmeur 1
+part du retour 1
+part dun 3
+part dun an 1
+part dun aut 1
+part dun cel 1
+part dun ensembl 1
+part dun impl 1
+part dun nouvel 1
+part dun point 1
+part dynam 1
+part dynam parallel 1
+part effect 1
+part effectu 1
+part effectu loc 1
+part elimin 1
+part elimin ce 1
+part en 3
+part en appliqu 1
+part en ecritur 1
+part en rev 1
+part enabl 1
+part enabl act 1
+part enabl mean 1
+part ent 1
+part ent er 1
+part entr 1
+part entr de 1
+part entr ecrivain 1
+part entr le 1
+part entr processeur 1
+part equiv 1
+part equiv rel 1
+part est 3
+part est alor 1
+part est consacr 1
+part est de 1
+part est elimin 1
+part est en 1
+part est la 1
+part est ladapt 1
+part est le 1
+part est marqu 1
+part et couram 1
+part et dam 1
+part et de 2
+part et den 1
+part et en 1
+part et i1 1
+part et inutilit 1
+part et le 1
+part et limport 1
+part et lobt 1
+part et loptim 1
+part et mi 1
+part et sp 1
+part evalu 5
+part evalu automat 1
+part evalu conserv 1
+part evalu ea 1
+part evalu fail 1
+part evalu me 1
+part evalu object 1
+part evalu refer 1
+part evalu specializ 1
+part evalu succ 1
+part evalu techniqu 2
+part evalu termin 1
+part evalu tim 1
+part evaul 1
+part execut 1
+part execut oper 1
+part exhib 1
+part fail 1
+part fil 2
+part fil block 1
+part fil dep 1
+part fl 1
+part fournir 1
+part fournir au 1
+part funct 5
+part fund 2
+part g en 1
+part gauch 1
+part gauch de 1
+part gauch est 1
+part giv 2
+part giv sem 1
+part graph 1
+part ha rough 1
+part ii 6
+part il 1
+part il ne 1
+part il peut 1
+part implem 1
+part in channel 2
+part in n.v 1
+part ind 1
+part influ 1
+part inform 2
+part inspir 1
+part inst 2
+part inst funct 1
+part int 1
+part int egr 1
+part invar 1
+part involut 1
+part is concern 1
+part is eff 1
+part is minim 1
+part is obv 1
+part is show 1
+part is simp 1
+part iter 1
+part iv 1
+part j de 1
+part knowledg 1
+part known 1
+part known argum 1
+part la 1
+part la facilit 1
+part la loc 1
+part la perform 1
+part la prim 1
+part la ver 1
+part lacc 1
+part lacc es 1
+part laugm 1
+part laugm du 1
+part le 3
+part le ch 1
+part le corp 1
+part le coupl 1
+part le fait 1
+part le habitud 1
+part le noeud 1
+part le outil 1
+part le probl 1
+part le syst 1
+part list 1
+part lor 1
+part lor de 1
+part ma 1
+part ma sel 1
+part mask 1
+part match 2
+part match retrief 1
+part maxim 1
+part maxim dist 1
+part maxim weight 1
+part med 1
+part med failur 1
+part memor 1
+part memor renam 1
+part model 2
+part model result 1
+part multilevel 1
+part multilevel recur 1
+part n cessiterait 1
+part n ecessit 1
+part nam 1
+part nam presid 1
+part non 1
+part non partag 1
+part object 1
+part occ 1
+part of abort 1
+part of adapt 1
+part of appl 1
+part of arbitr 1
+part of bimod 1
+part of build 1
+part of character 1
+part of cl 1
+part of expr 1
+part of flat 1
+part of graph 1
+part of gs 1
+part of hierarch 1
+part of incompl 1
+part of input 1
+part of intern 1
+part of kc 1
+part of lem 1
+part of me 1
+part of mlt 1
+part of modl 1
+part of numer 1
+part of object 1
+part of precc 1
+part of rl 1
+part of singl 1
+part of sort 1
+part of word 1
+part ont 1
+part ont fait 1
+part or compl 1
+part order 9
+part order defin 1
+part order rel 1
+part order theor 1
+part ou 1
+part ou au 1
+part ou de 1
+part overlap 2
+part pa 2
+part pa de 1
+part pa le 1
+part par 1
+part par un 1
+part parameter 1
+part parc 1
+part parc qu 1
+part parc quel 1
+part part 1
+part perm 1
+part pertain 1
+part phr 1
+part pivot 3
+part pivot method 1
+part po 1
+part po edent 1
+part polyhedr 1
+part polyhedr object 1
+part pour 1
+part pour un 1
+part pouvait 1
+part privileg 1
+part privileg common 1
+part privileg criter 1
+part privileg relationship 1
+part privileg shar 1
+part prop 1
+part prop diff 1
+part prov 1
+part qu 2
+part qu interv 1
+part qu nous 1
+part quun 1
+part quun modif 1
+part random 1
+part random select 1
+part real 1
+part recolor 1
+part record 1
+part record connect 1
+part regroup 1
+part regroup de 1
+part rem 1
+part repr 2
+part requ 1
+part requ de 1
+part resort 1
+part respon 1
+part result 3
+part result y0 1
+part result y2 1
+part result y3 1
+part risqu 1
+part risqu de 1
+part rollback 2
+part rollback using 2
+part schedl 1
+part schedl dag 1
+part se 4
+part se justif 1
+part se stabil 1
+part sel 1
+part sel de 1
+part select 1
+part select assignm 1
+part ser 1
+part ser util 1
+part serait 1
+part serait trop 1
+part serv 1
+part serv receiv 1
+part shar 3
+part shar dat 1
+part shar qu 1
+part si 1
+part si il 1
+part sld 1
+part sld tr 1
+part solut 1
+part span 1
+part span tr 1
+part st 2
+part st order 1
+part stat 1
+part stat dat 1
+part structur 1
+part suiv 1
+part suiv com 1
+part sum 1
+part sum ts 1
+part superobject 1
+part support 8
+part support giv 1
+part sur 2
+part sur ce 1
+part sur le 2
+part sur un 1
+part tak 1
+part tak polynom 1
+part th integer 1
+part th multipl 1
+part th reason 2
+part that deal 1
+part that es 1
+part that lead 1
+part then giv 1
+part tim 1
+part to imb 1
+part tout 1
+part tout en 1
+part tr 2
+part transmettr 1
+part try 1
+part typ 1
+part typ infer 1
+part un 3
+part un architectur 1
+part un etud 1
+part un mod 1
+part un strat 1
+part uncoar 1
+part unif 1
+part us 1
+part using 1
+part util 1
+part util de 1
+part vect 1
+part vi 1
+part vi object 1
+part view 1
+part view maintain 1
+part we ge 1
+part wer turn 1
+part wh siz 1
+part which describ 1
+part which requir 1
+part whol rel 1
+part without knowledg 1
+part word 1
+part. 1
+part2 1
+part2 learn 1
+partag 3
+partag e apr 1
+partag e entr 1
+partag e gr 1
+partag ee 3
+partag ee com 1
+partag ee de 2
+partag ee doit 1
+partag ee dot 1
+partag ee en 1
+partag ee entr 1
+partag ee est 1
+partag ee koan 1
+partag ee la 1
+partag ee maintenu 1
+partag ee munin 1
+partag ee ont 1
+partag ee ou 1
+partag ee pa 1
+partag ee par 3
+partag ee peuv 2
+partag ee sembl 1
+partag ee suiv 1
+partag ee sur 1
+partag ee util 1
+partag ee va 1
+partag es 2
+partag es dan 1
+partag jam 1
+partag jam un 1
+partag la 1
+partag le 1
+partag le term 1
+partag le valeur 1
+partag un 1
+partag un attribut 1
+partageon 1
+partageon la 1
+partageon la conclus 1
+partager 1
+partager certain 1
+partager certain don 1
+partager du 1
+partager du cod 1
+partager la 1
+partager le 1
+partager le cod 1
+partager linform 1
+partager linform de 1
+partager tn 1
+partager tn entr 1
+partager un 1
+partager un cel 1
+parthasarath 1
+particip 19
+particip a vect 1
+particip and counter 1
+particip ar co 1
+particip contribut 1
+particip counter 1
+particip da 1
+particip da red 1
+particip felt 1
+particip field 1
+particip field st 1
+particip host 1
+particip ident 1
+particip in concur 1
+particip in oper 1
+particip in qu 1
+particip nod 1
+particip ou 1
+particip ou non 1
+particip proc 1
+particip sid 1
+particip task 1
+particip variabl 1
+particip work 1
+participer 2
+participer a un 1
+participer au 1
+participer au jur 1
+participer qu 1
+participl 1
+participl auxil 1
+participl auxil connect 1
+particl 101
+particl act 2
+particl alloc 1
+particl amen 1
+particl an intellig 1
+particl and upd 1
+particl appar 1
+particl appl 2
+particl approach 1
+particl approach select 1
+particl appropr 1
+particl aspect 2
+particl attent 1
+particl attitud 1
+particl attract 1
+particl author 1
+particl ba 1
+particl be consider 1
+particl benef 1
+particl block 2
+particl block edit 1
+particl block interfac 1
+particl boolean 1
+particl boolean form 1
+particl ca 1
+particl camelot 1
+particl camelot log 1
+particl canon 1
+particl canon form 1
+particl cel 2
+particl cel ai 1
+particl cel valu 1
+particl ceux 1
+particl ceux pouv 1
+particl ch 1
+particl cl 4
+particl cl cal 1
+particl cl specif 1
+particl com 1
+particl com mener 1
+particl com tout 1
+particl commun 1
+particl compon 1
+particl comput 1
+particl comput dev 1
+particl computer 1
+particl computer support 1
+particl concern 1
+particl cost 1
+particl cost funct 1
+particl cu 1
+particl dat 1
+particl de 4
+particl de fonct 1
+particl de la 2
+particl de matr 1
+particl de recherch 1
+particl decomposit 1
+particl decomposit lead 1
+particl deep 1
+particl definit 1
+particl describ 1
+particl detail 1
+particl dev 1
+particl diagram 1
+particl diagram show 1
+particl difficult 1
+particl difficult compar 1
+particl disc 1
+particl disk 1
+particl div 1
+particl docum 1
+particl domain 2
+particl du 2
+particl du dern 1
+particl dun 1
+particl dun boucl 1
+particl dur shallow 1
+particl empl 1
+particl en 2
+particl en ce 1
+particl en term 1
+particl ent 1
+particl entr 1
+particl entr point 1
+particl er 4
+particl er au 1
+particl er cel 1
+particl er dan 1
+particl er de 2
+particl er du 1
+particl er dun 1
+particl er efficac 1
+particl er est 1
+particl er le 2
+particl er prometteus 1
+particl er qu 1
+particl er remerc 1
+particl er soit 1
+particl et ain 1
+particl etr 1
+particl etr fus 1
+particl exer 1
+particl f op 1
+particl fam 1
+particl fam member 1
+particl finit 1
+particl finit configur 1
+particl foc 1
+particl for langu 1
+particl for larger 1
+particl for quadtr 1
+particl for saf 1
+particl forc 1
+particl forc calcl 1
+particl form 1
+particl gl 1
+particl gl box 1
+particl goal 1
+particl good 1
+particl good curv 1
+particl hardwar 1
+particl hardwar lim 1
+particl host 1
+particl if compon 1
+particl if dat 1
+particl if loc 1
+particl implem 3
+particl implem ba 1
+particl implem technolog 1
+particl import 1
+particl in distribut 1
+particl in pr 1
+particl in recogn 1
+particl indebt 1
+particl infer 2
+particl infer mach 1
+particl inform 1
+particl input 1
+particl inst 2
+particl instruc 2
+particl interest 3
+particl interest schem 1
+particl involut 1
+particl is giv 1
+particl is lik 1
+particl is specl 1
+particl issu 1
+particl item 1
+particl job 1
+particl jou 1
+particl keen 1
+particl keyword 1
+particl kind 2
+particl kind contigu 1
+particl la 1
+particl la pag 1
+particl la techniqu 1
+particl lagc 1
+particl lam 1
+particl lam elior 1
+particl langu 1
+particl larg network 1
+particl le 1
+particl le ca 1
+particl learn 1
+particl learn strateg 1
+particl length 1
+particl letter 1
+particl letter spec 1
+particl level 2
+particl lisp 1
+particl lisp dialect 1
+particl list 1
+particl loc 1
+particl loc system 1
+particl lock 1
+particl log 2
+particl log log 1
+particl log manag 1
+particl manner 1
+particl me 1
+particl method 1
+particl min 1
+particl model 2
+particl modl 1
+particl moment 1
+particl multicast 1
+particl network 3
+particl network ch 1
+particl nod 2
+particl nod execut 1
+particl nous 1
+particl nous pouvon 1
+particl number 2
+particl object 3
+particl offer 1
+particl ohp 1
+particl ohp project 1
+particl on crit 1
+particl oper 2
+particl oper strateg 1
+particl optim 1
+particl order 2
+particl organ 1
+particl pa 1
+particl pa de 1
+particl pair 2
+particl pandemon 1
+particl pandemon system 1
+particl pattern 1
+particl piec 1
+particl plac 1
+particl platform 1
+particl point 2
+particl point nam 1
+particl posit 1
+particl pour 1
+particl pour analyser 1
+particl prob 1
+particl prob distribut 1
+particl problem 6
+particl problem domain 1
+particl proc 2
+particl proc cast 1
+particl prolog 1
+particl prolog not 1
+particl prom 1
+particl promin 1
+particl prompt 1
+particl proper 3
+particl re 1
+particl reason 1
+particl reason method 1
+particl reason strateg 1
+particl record 1
+particl record look 1
+particl reg 1
+particl register 1
+particl rel 2
+particl rel answer 1
+particl relationship 1
+particl relev 2
+particl rement 1
+particl rement import 1
+particl rement sur 1
+particl requir 1
+particl result 1
+particl rid 1
+particl rol 1
+particl row 1
+particl sa 1
+particl sa rel 1
+particl schem 1
+particl se 2
+particl self 1
+particl self modif 1
+particl sequ 2
+particl show 1
+particl shunt 1
+particl si 1
+particl siml 2
+particl singl 1
+particl singl level 1
+particl slav 1
+particl slot 1
+particl solut 1
+particl som typ 1
+particl sont 1
+particl spec 1
+particl srq 1
+particl st 2
+particl st organ 1
+particl stag 1
+particl strateg 1
+particl styl 2
+particl substr 1
+particl substr famil 1
+particl suit 2
+particl sur 2
+particl sur le 2
+particl switch 1
+particl switch nod 1
+particl tak 1
+particl targ 1
+particl task 4
+particl task context 1
+particl termin 1
+particl test 3
+particl test adequ 1
+particl test se 1
+particl th ar 1
+particl th epilogu 1
+particl th hypercub 1
+particl th loc 1
+particl th show 1
+particl theor 1
+particl thought 1
+particl thought proc 1
+particl through unif 1
+particl tim 3
+particl to acknowledg 1
+particl to poor 1
+particl to proc 1
+particl to rectangl 1
+particl to specl 1
+particl to thank 1
+particl top 1
+particl touch 1
+particl tous 1
+particl tous le 1
+particl tout 1
+particl tout le 1
+particl tr 1
+particl track 1
+particl trait 1
+particl typ 4
+particl um 1
+particl um architectur 1
+particl un 1
+particl un rem 1
+particl un ver 1
+particl us 4
+particl using 1
+particl valu 3
+particl viewpoint 1
+particl visit 1
+particl visit ee 1
+particl visu 1
+particl wavel 1
+particl way 1
+particl we assum 1
+particl weak 1
+particl weight 2
+particl wh 2
+particl when combin 1
+particl when dl 1
+particl when procedur 1
+particl with explicit 1
+particl with multipl 1
+particl without explicit 1
+particularit 3
+particularit e de 1
+particularit e fondam 1
+particularit e qu 1
+particularit es 1
+particularit es de 1
+partiel 3
+partiel a le 1
+partiel afin 1
+partiel bien 1
+partiel bien attribu 1
+partiel constitu 1
+partiel de 2
+partiel de graph 1
+partiel de lext 1
+partiel de sahlin 1
+partiel du 1
+partiel du graph 1
+partiel fourn 1
+partiel fourn par 1
+partiel fus 1
+partiel fus es 1
+partiel instanc 1
+partiel instanc es 1
+partiel la 1
+partiel la convexit 1
+partiel le 1
+partiel le ca 1
+partiel loop 1
+partiel ou 1
+partiel ou compl 1
+partiel perdu 1
+partiel perm 1
+partiel perm de 1
+partiel peut 1
+partiel peut etr 1
+partiel po con 1
+partiel r egl 1
+partiel r egler 1
+partiel rempl 1
+partiel rempl par 1
+partiel rendait 1
+partiel rendait imp 1
+partiel retrouv 1
+partiel retrouv es 1
+partiel trait 1
+partiel3 1
+partir 7
+partir dappar 1
+partir dappar de 1
+partir dappl 1
+partir de 7
+partir de articl 1
+partir de ce 2
+partir de champ 1
+partir de coup 1
+partir de desc 1
+partir de deux 1
+partir de don 1
+partir de enregister 1
+partir de instruc 1
+partir de la 3
+partir de laquel 1
+partir de lensembl 1
+partir de lenviron 1
+partir de lo 1
+partir de m0 1
+partir de mal 1
+partir de mi 1
+partir de mk 1
+partir de modif 1
+partir de point 1
+partir de program 1
+partir de rn 1
+partir de sa 1
+partir de symbol 1
+partir de tout 1
+partir de variabl 1
+partir de xk 1
+partir dim 1
+partir dim irm 1
+partir du 3
+partir du cod 1
+partir du compilateur 1
+partir du marqu 1
+partir du moment 1
+partir du point 1
+partir du syst 1
+partir dun 3
+partir dun individu 1
+partir dun marqu 1
+partir dun point 1
+partir dun syst 1
+partit 47
+partit a fil 1
+partit a giv 1
+partit a graph 1
+partit a rol 1
+partit adapt 1
+partit adapt es 1
+partit algorithm 3
+partit algorithm compar 1
+partit algorithm describ 1
+partit algorithm prov 1
+partit algorithm rel 1
+partit algorithm satisf 1
+partit algorithm us 1
+partit algorithm work 1
+partit algorithmand 1
+partit algorithmand compar 1
+partit and chac 1
+partit and cluster 2
+partit and distribut 1
+partit and dlb 1
+partit and dynam 1
+partit and label 1
+partit and map 2
+partit and order 1
+partit and requir 1
+partit and schedl 1
+partit and spar 2
+partit any further 1
+partit approach 1
+partit ar great 1
+partit ar shown 1
+partit as follow 2
+partit ba 1
+partit ba order 1
+partit ba spar 1
+partit ba wgp 1
+partit bal 1
+partit bal condit 1
+partit bound 1
+partit ca 1
+partit can caus 1
+partit cb 1
+partit compan 1
+partit connect 1
+partit constitut 1
+partit cost 1
+partit cycliqu 1
+partit cycliqu par 1
+partit de 1
+partit de boucl 1
+partit de ce 1
+partit de don 1
+partit de ecritur 1
+partit de grain 1
+partit de la 1
+partit de nid 1
+partit de pag 1
+partit de transform 1
+partit de z2 1
+partit de zn 1
+partit devait 1
+partit devait etr 1
+partit devront 1
+partit devront etr 1
+partit du 2
+partit du domain 1
+partit du probl 1
+partit dun 1
+partit dun nid 1
+partit e par 1
+partit ec 1
+partit ec rol 1
+partit edg 1
+partit efficac 1
+partit el 1
+partit el b0 1
+partit el b1 1
+partit elimin 1
+partit elimin ou 1
+partit en 2
+partit en bloc 1
+partit en pav 1
+partit en treil 1
+partit est 1
+partit et dordonnanc 1
+partit etud 1
+partit etud es 1
+partit ext 1
+partit ext spat 1
+partit f1 1
+partit failur 1
+partit for bbmat 1
+partit funct 1
+partit go 1
+partit graph 3
+partit ha smaller 1
+partit heur 1
+partit horizont 1
+partit hp 1
+partit imp 1
+partit imp approxim 1
+partit in ph 1
+partit in step 1
+partit in subst 1
+partit in tim 1
+partit in turn 1
+partit int 2m 1
+partit int block 2
+partit int buck 1
+partit int consecut 1
+partit int m1 1
+partit int maxim 1
+partit int rol 1
+partit int segm 1
+partit int separ 2
+partit int sub 1
+partit int submesh 1
+partit irregl 2
+partit irregl graph 2
+partit is approxim 1
+partit is faster 1
+partit is graph 1
+partit is mad 1
+partit is perform 1
+partit is project 1
+partit is reduc 1
+partit is select 1
+partit is shown 1
+partit is signif 2
+partit iter 1
+partit judicieux 1
+partit justif 1
+partit la 1
+partit le 2
+partit le domain 1
+partit le prem 1
+partit leav 1
+partit lem 1
+partit m1 1
+partit maint 1
+partit maint ce 1
+partit matr 1
+partit matr 64ec 1
+partit method 4
+partit molecl 1
+partit multidim 1
+partit multidim spac 1
+partit multilevel 1
+partit n record 1
+partit nest 1
+partit nest appl 1
+partit of gi 1
+partit of gic1 1
+partit of gm 1
+partit of hp 1
+partit of memor 1
+partit of outg 1
+partit of register 1
+partit of rm 1
+partit of simil 1
+partit on peut 1
+partit ont 1
+partit ont soulign 1
+partit oper 1
+partit or bisect 1
+partit p ev 1
+partit pack 1
+partit pack chac 1
+partit par 1
+partit par bloc 1
+partit par paron 1
+partit par patron 1
+partit par pav 1
+partit pb 1
+partit perform 1
+partit perm 1
+partit perm dutiliser 1
+partit ph 2
+partit pi 1
+partit pic1 1
+partit pm 1
+partit possibl 1
+partit pr 1
+partit pr esent 1
+partit problem 3
+partit proc 2
+partit produc 1
+partit q0 1
+partit qu 1
+partit qu eliminerait 1
+partit qu la 1
+partit qu nous 1
+partit refin 1
+partit refin algorithm 1
+partit schem 2
+partit schem describ 1
+partit schem produc 1
+partit secon 1
+partit secon st 1
+partit sn 1
+partit spar 1
+partit spar matr 1
+partit st 2
+partit strateg 1
+partit tak 1
+partit techniqu 3
+partit techniqu div 1
+partit techniqu instead 1
+partit techniqu motiv 1
+partit th coar 1
+partit th dat 1
+partit th edg 1
+partit th fil 1
+partit th graph 3
+partit th iter 1
+partit th nod 1
+partit th object 1
+partit th pair 1
+partit th produc 1
+partit th record 1
+partit th remain 1
+partit th se 2
+partit th server 1
+partit th sort 1
+partit th system 1
+partit th ver 1
+partit than chac 1
+partit than mlb 1
+partit that minimiz 1
+partit that satisf 1
+partit then n.v 1
+partit tim 1
+partit to construc 1
+partit to elim 1
+partit tr 1
+partit unstructur 1
+partit unstructur graph 1
+partit unstructur problem 1
+partit us 1
+partit us spec 1
+partit using 3
+partit using gklr 1
+partit using system 1
+partit vect 1
+partit vect pi 1
+partit ver 1
+partit vm 1
+partit vs 1
+partit vs chac 1
+partit wh edg 1
+partit whil refin 1
+partit with respect 1
+partit work 1
+partit z2 1
+partit z2 en 1
+partitiong 1
+partitiong using 1
+partitiong using rm 1
+partitioningalgorithm 1
+partitionner 2
+partitionner appart 1
+partitionner est 1
+partitionner est de 1
+partitionner la 1
+partitionner la boucl 1
+partitionner le 1
+partitionner le nid 1
+partitionner le pag 1
+partitionner quen 1
+partitionner quen fonct 1
+partitionner quun 1
+partitionner quun de 1
+partitionner un nid 1
+partitionnon 1
+partitionnon la 1
+partitionnon la boucl 1
+partitit 1
+partner 2
+partnership 2
+partnership 2sw 1
+partnership 2sw institut 1
+partnership of rutger 1
+partof 2
+partof or us 1
+partof term 1
+parttim 1
+parttim cl 1
+paru 1
+paru peu 1
+paru peu rigoureux 1
+parvenir 1
+parvenir au 1
+parvenir conjoint 1
+parvenir dilater 1
+parvenir dilater le 1
+pasad 3
+pasc 8
+pasc and organ 1
+pasc beyl 1
+pasc br 1
+pasc br mont 1
+pasc koiran 1
+pasc koiran august 1
+pasc lemon 1
+pasc lemon de 1
+pasc pr 1
+pasc pr var 1
+pasc program 1
+pasc program giv 1
+pasc siml 1
+pasc siml smalltalk 1
+pasc triangl 1
+pasc var 1
+pascalstr 1
+passau 1
+passenger 1
+passenger lug 1
+passer 4
+passer argum 1
+passer de 2
+passer de attr2 1
+passer de lattribut 1
+passer de synchron 1
+passer direct 1
+passer direct du 1
+passer du 1
+passer du champ 1
+passer du point 1
+passer dun 1
+passer dun proposit 1
+passer dun repr 1
+passer en 1
+passer en douceur 1
+passer en param 1
+passer par 2
+passer par la 1
+passer par linterm 1
+passer par un 2
+passer qu 1
+passer qu deux 1
+passer un term 1
+past 2
+past defin 1
+past exerc 1
+pat 10
+pat ba 1
+pat hil 1
+pat il 1
+pat in ac 1
+pat in order 1
+pat indep 1
+pat ma 1
+pat ont 1
+pat ont montr 1
+pat problem 1
+pat record 1
+pat wil eventu 1
+patashnik 1
+patch 1
+patel 2
+patern 1
+patern an 1
+path 51
+path algorithm 2
+path alloc 1
+path and appear 1
+path and captur 1
+path and fil 1
+path and gatew 1
+path and sav 1
+path ar disjoint 1
+path ar rel 1
+path ar remov 1
+path as follow 1
+path as specif 1
+path assoc 1
+path ba 1
+path ba model 1
+path ba multicast 1
+path between compan 1
+path between nod 1
+path between object 1
+path between ver 1
+path by assum 1
+path can therefor 1
+path captur 1
+path chang 1
+path chang an 1
+path con 1
+path consum 1
+path consum 2pathlength 1
+path contain 3
+path contain zer 1
+path cover 1
+path defin 1
+path definit 1
+path ec 1
+path first algorithm 1
+path follow 1
+path for determin 1
+path for hk 1
+path for hyperedg 1
+path for minim 1
+path for program 1
+path for propag 1
+path form 1
+path from compan 1
+path from liter 1
+path from start 1
+path gener 1
+path h0 1
+path ha valu 1
+path hk 1
+path in gc 1
+path in graph 1
+path in h2 1
+path in turn 1
+path inc 1
+path indep 1
+path is quest 1
+path is shown 2
+path length 4
+path length incr 1
+path length span 1
+path list 1
+path mak 1
+path must contain 1
+path must cr 1
+path must equ 1
+path must keep 1
+path nam 1
+path nod 1
+path not using 1
+path of act 1
+path of interact 1
+path of length 1
+path of minim 1
+path of relationship 1
+path on router 1
+path open tak 1
+path or cycl 1
+path or subgraph 1
+path over st 1
+path p4 1
+path pi 3
+path pi con 1
+path plan 1
+path privileg 1
+path privileg chang 1
+path privileg invar 1
+path problem 2
+path proper 1
+path proper po 1
+path qi 1
+path reach 2
+path ri 1
+path rol 1
+path rol se 1
+path satisf 1
+path select 1
+path start 2
+path strung 1
+path tak 2
+path tak upt 1
+path termin 1
+path that begin 1
+path that connect 1
+path that inclus 1
+path that start 1
+path to cod 1
+path to root 1
+path to singl 1
+path to worst 1
+path tot 1
+path tot order 1
+path tr 1
+path tr root 1
+path unaffect 1
+path uvu0 1
+path wh 2
+path wh path 1
+path whil going 1
+path width 2
+pathak 1
+pathl 1
+pathl nam 1
+pathlength 2
+pathlength and numpath 1
+pathlength db 1
+pathlength db cal 1
+pathlength for direct 1
+pathlength n input 1
+pathlength n unit 1
+patholog 1
+patholog and patholog0 1
+patholog contain 1
+patholog contain test 1
+patholog of figur 1
+patholog on test 1
+patholog0 1
+patholog0 on test 1
+pathologicaltraver 1
+pathologicaltraver trac 1
+pathophysiolog 1
+pathophysiolog rel 1
+patht 1
+patht2 1
+pathw 3
+pathw tmf 1
+patil 1
+patil et al 1
+patil r.s 1
+patr 2
+patr boizumault 1
+patr boizumault mont 1
+patr boizumault rapporteur 1
+patr teller 1
+patrec 1
+patrick 2
+patrick amest 1
+patrick van 1
+patrick van der 1
+patrik 1
+patrik jonsson 1
+patron 2
+patron acc 1
+patron acc ed 1
+patron apr 1
+patron apr es 1
+patron assur 1
+patron assur quil 1
+patron aut 1
+patron aut de 1
+patron can expect 1
+patron ch 1
+patron ch est 1
+patron correspon 1
+patron correspon au 1
+patron correspon donc 1
+patron d epen 1
+patron dan 1
+patron dan le 1
+patron de 1
+patron de tail 1
+patron de typ 1
+patron devrait 1
+patron devrait saccompagner 1
+patron diff 1
+patron diff erent 1
+patron dind 1
+patron dpl 1
+patron dpl dp 1
+patron dun 1
+patron dun ou 1
+patron dun pag 1
+patron en 1
+patron en modif 1
+patron est 1
+patron est alor 1
+patron est constitu 1
+patron est don 1
+patron est ram 1
+patron est repr 1
+patron et du 1
+patron et le 1
+patron et ordonnanc 1
+patron jusqu 1
+patron know 1
+patron le 1
+patron le li 1
+patron may want 1
+patron might want 1
+patron ne 1
+patron ne cont 1
+patron nest 1
+patron nest pa 1
+patron nous 1
+patron nous avon 1
+patron ou 1
+patron ou de 1
+patron par 1
+patron peut 1
+patron peut etr 1
+patron peuv 1
+patron peuv etr 1
+patron pour 1
+patron pour la 1
+patron pour parvenir 1
+patron qu 1
+patron qu en 1
+patron quen 1
+patron quen es 1
+patron s ecrit 1
+patron s respon 1
+patron ser 1
+patron ser trop 1
+patron seront 1
+patron seront petit 1
+patron simp 1
+patron simp want 1
+patron sont 1
+patron sont confondu 1
+patron sont constitu 1
+patron suffisam 1
+patron suffisam petit 1
+patron to brow 1
+patron to quick 1
+patron translat 1
+patron translat es 1
+patron want 1
+patron wil find 1
+patron would discover 1
+pattern 62
+pattern accept 1
+pattern allow 1
+pattern an 5
+pattern anal 1
+pattern and appl 1
+pattern and determin 1
+pattern and part 1
+pattern and targ 1
+pattern and test 1
+pattern appear 2
+pattern appl 1
+pattern ar appl 1
+pattern ar isol 1
+pattern ar pr 1
+pattern ar shown 1
+pattern ba 1
+pattern becom 1
+pattern becom evid 1
+pattern being pr 1
+pattern belong 1
+pattern by show 1
+pattern clamp 1
+pattern classif 3
+pattern classif problem 1
+pattern classif task 1
+pattern classioc 1
+pattern cod 1
+pattern com 1
+pattern compl 1
+pattern compl uncorrel 1
+pattern contain 1
+pattern dealt 1
+pattern def 1
+pattern def object 1
+pattern dep 2
+pattern describ 1
+pattern develop 1
+pattern dur cl 1
+pattern dur system 1
+pattern dynam 1
+pattern ea 1
+pattern ev epoch 1
+pattern exhibit 1
+pattern for part 1
+pattern for sum 1
+pattern from val 1
+pattern funct 1
+pattern further 1
+pattern further expan 1
+pattern gener 3
+pattern gener using 1
+pattern giv 1
+pattern in interact 1
+pattern in multiproc 1
+pattern in part 1
+pattern in rl 1
+pattern ind 1
+pattern infer 1
+pattern infrequ 1
+pattern is frequ 1
+pattern is going 1
+pattern is map 1
+pattern is pr 2
+pattern is replac 1
+pattern is requir 1
+pattern is sent 1
+pattern it wish 1
+pattern match 7
+pattern match appl 1
+pattern match approach 1
+pattern match cod 1
+pattern match inform 1
+pattern match object 1
+pattern match program 1
+pattern match softwar 1
+pattern match techniqu 1
+pattern match tool 1
+pattern not belong 1
+pattern of arriv 1
+pattern of combin 1
+pattern of commun 1
+pattern of dat 2
+pattern of dep 1
+pattern of interconnect 1
+pattern of interfac 1
+pattern of intersect 1
+pattern of libr 1
+pattern of mutu 1
+pattern of pa 1
+pattern of satisf 1
+pattern of soc 1
+pattern of stat 1
+pattern of vot 1
+pattern output 1
+pattern output cod 1
+pattern pr 1
+pattern proc 1
+pattern program 1
+pattern program tool 1
+pattern put 2
+pattern put lesser 2
+pattern recognit 8
+pattern recognit 2nd 1
+pattern recognit experim 1
+pattern recognit letter 1
+pattern recognit principl 1
+pattern recognit system 1
+pattern remain 1
+pattern remain simil 1
+pattern replac 1
+pattern replac usl.123 1
+pattern se 1
+pattern spac 1
+pattern spac compr 1
+pattern spread 1
+pattern sum 1
+pattern sum squar 1
+pattern sumsquar 1
+pattern sumsquar error 1
+pattern support 1
+pattern support system 1
+pattern th progr 1
+pattern th suggest 1
+pattern then mov 1
+pattern through monit 1
+pattern to accompl 1
+pattern to ensur 1
+pattern to separ 1
+pattern to support 1
+pattern to util 1
+pattern transform 1
+pattern us 1
+pattern wa minim 1
+pattern wa pr 1
+pattern wa random 1
+pattern we describ 1
+pattern we show 2
+pattern wer develop 1
+pattern wer st 1
+pattern which interconnect 1
+pattern which minimiz 1
+pattern which sum 1
+pattern wil encour 1
+pattern wil ten 1
+pattern wonder 1
+pattern work 1
+patternmatch 1
+patternmatch and par 1
+patterson 4
+patterson expr 1
+paul 18
+paul and solomonoff 1
+paul bergstein 1
+paul feautr 1
+paul feautr qu 1
+paul feautr rapporteur 1
+paul hudak 1
+paul jacobson 1
+paul johnson 1
+paul key 1
+paul key not 1
+paul mar 1
+paul mcjon 1
+paul mulholland 1
+paul sabat 1
+paul sever 1
+paul stodghil 1
+paul taylor 1
+paul wilm 1
+paus 2
+paus between typ 1
+paus to establ 1
+pauvr 1
+pauvr e de 1
+pav 2
+pav avec 1
+pav avec dautr 1
+pav bloc 1
+pav ceil 1
+pav de 1
+pav de lalgorithm 1
+pav du 1
+pav du tableau 1
+pav e com 1
+pav e compl 1
+pav e cont 1
+pav e en 1
+pav e est 1
+pav e incompl 1
+pav e introduit 1
+pav e la 1
+pav e le 1
+pav e vaut 1
+pav en 1
+pav en fa 1
+pav es 1
+pav es compl 1
+pav es cont 1
+pav es de 1
+pav es nous 1
+pav es ou 1
+pav es se 1
+pav es sont 1
+pav es suiv 1
+pav es sup 1
+pav es var 1
+pav et du 1
+pav etant 1
+pav etant cr 1
+pav nay 1
+pav nay pa 1
+pav ont 1
+pav perm 1
+pav perm un 1
+pav pr 1
+pav pr esent 1
+pav prop 1
+pav prop un 1
+pav qu 1
+pav qu nous 1
+pav r es 1
+pav suiv 1
+pav sur 1
+pav sur la 1
+pavl 1
+paw 1
+paw print 1
+paw problem 1
+paw test 1
+paw test involut 1
+pay 12
+pay attent 1
+pay capit 1
+pay certain attent 1
+pay commun 1
+pay divid 1
+pay et tir 1
+pay littl effort 1
+pay particl 1
+pay particl attent 1
+pay sous 1
+pay sur 1
+pay sur le 1
+pay to support 1
+pay to verif 1
+pay uniqu 1
+pay uniqu le 1
+payan 1
+payload 1
+paym 2
+paym of royalt 1
+payn 1
+payoff 1
+payoff at death 1
+payoff chang 1
+payoff equ 1
+payoff event 1
+payoff funct 1
+payoff gener 1
+payoff in ca 1
+payoff intak 1
+payoff intak learn 1
+payoff is gener 1
+payoff obtain 1
+payoff per payoff 1
+payoff per tim 1
+payoff tim 1
+payoff tim rat 1
+payrol 1
+payrol oblig 1
+pazat 1
+pb 5
+pb abq 1
+pb ar rel 1
+pb consecut 1
+pb consecut track 1
+pb denot 1
+pb is expon 1
+pb log 1
+pb memor 1
+pb memor loc 1
+pb nj0 1
+pb term 1
+pb1 1
+pb1 is satisf 1
+pb1 requir 1
+pb2 1
+pb2 distingu 1
+pb2 follow 1
+pb2 follow triv 1
+pb3 1
+pb3 specif 1
+pb4 1
+pb4 requir 1
+pb5 1
+pb5 p1 1
+pb5 p1 continu 1
+pbg 1
+pbj 1
+pblog3 1
+pblog3 tc 1
+pbm 1
+pbm for dlb 1
+pbm method 1
+pbq 1
+pbsg 1
+pbus 1
+pbus dbus 1
+pbus dbus at 1
+pbus pbus 1
+pbus pbus rloc 1
+pbus rloc 1
+pbus rloc bus 1
+pc 11
+pc addr 1
+pc onl alloc 1
+pc ou 1
+pc ou aftd 1
+pc princip 1
+pc princip coord 1
+pc sub 2
+pc sub grid 2
+pc took 1
+pc x pc 2
+pc1 1
+pc78 1
+pcc 1
+pcct 1
+pcct and lec 1
+pcct and sorcerer 1
+pcct but chang 1
+pcct coordin 1
+pcct gener 1
+pcct is simil 1
+pcct prov 1
+pcct prov nic 1
+pcct sorcerer 1
+pcct system 1
+pcd 1
+pcd project 1
+pcd techn 1
+pcd techn report 1
+pcf 1
+pcf fortran 1
+pcf77 1
+pch 1
+pcl 1
+pct 2
+pct fl 1
+pct.oftest 1
+pct.test 1
+pcur 1
+pd 6
+pd d enot 1
+pd n trust 1
+pd20 1
+pd20 pilot 1
+pd20 pilot usair 1
+pdb 1
+pdb avec 1
+pdb avec el 1
+pdb tout 1
+pdb tout ent 1
+pdk91 1
+pdp 1
+pdp contribut 1
+pdp extrem 1
+pdp network 1
+pe 11
+pe 1pe 1
+pe and interpr 1
+pe and non 1
+pe by frequ 1
+pe con 1
+pe difficult 1
+pe dopar 1
+pe dopar synchron 1
+pe dur logn 1
+pe either sen 1
+pe fract 1
+pe fract de 1
+pe ge 2
+pe ge exact 1
+pe ge nod 1
+pe gep 1
+pe hav compl 1
+pe hold 1
+pe i determin 1
+pe inser 1
+pe inser receiv 1
+pe is bound 1
+pe is connect 1
+pe langu 1
+pe lim 1
+pe may var 1
+pe pm 1
+pe pm se 1
+pe rel 1
+pe sen 1
+pe serv 1
+pe serv queu 1
+pe show 1
+pe tail 2
+pe tail condu 1
+pe tail ma 1
+pe tang 1
+pe valeur 1
+pe valeur de 1
+pe which man 1
+pe whil deletemin 1
+pe0 1
+pe0 and pe1 1
+pe0 finish 1
+pe0 pe1 1
+pe1 1
+peak 9
+peak filter 1
+peak hour 1
+peak inst 1
+peak inst parallel 1
+peak perform 2
+peak procedur 1
+peak sign 1
+peak singl 1
+peak singl prec 1
+peak speedup 1
+pean 1
+pean arithm 1
+pean arithm encod 1
+pearl 1
+pearlmutter 1
+pearson 2
+pearson s test 1
+pebbl 1
+pebbl for 1
+pebbl instead 1
+pebbl nod 1
+pebbl nod ni 1
+peck 1
+pecl 2
+pecl to prolog 1
+pedag. 1
+pedagog 2
+pedagog interact 1
+pedagog us 1
+pedagog valu 1
+peder 1
+peder and l.k 1
+pederson 1
+pederson and han 1
+pednault 1
+pedr 1
+peephol 1
+peephol optim 1
+peer 5
+peer by appropr 1
+peer collabor 1
+peer commun 1
+peer compon 1
+peer explor 1
+peer group 1
+peer sink 1
+peer sink compon 1
+pegasus 2
+pegasus an as 1
+pegasus method 1
+pehrson 2
+pein 2
+pein de 1
+pein de perdr 1
+pein de tester 1
+pein eoeur 1
+pejhan 1
+pejor 1
+pejor connot 1
+pel 3
+pel particip 1
+pel particip da 1
+pelagat 1
+pelat 1
+peleg 3
+peleg and sch 1
+peleg and ullman 1
+peleg and upf 1
+pelv 1
+pelv in fig 1
+pen 14
+pen and jacob 1
+pen ba 1
+pen ba system 1
+pen by rout 1
+pen caract 1
+pen caract er 1
+pen chung 1
+pen chung yew 1
+pen comput 1
+pen connect 1
+pen daucun 1
+pen de 2
+pen de si 1
+pen de succ 1
+pen for exc 1
+pen input 1
+pen la 2
+pen la siml 1
+pen le 1
+pen le conflit 1
+pen le program 1
+pen lec 2
+pen lec ecut 2
+pen longtemp 1
+pen se 1
+pen sever 1
+pen tout 1
+pen tout lec 1
+pen un 1
+pen un ex 1
+pen vol 1
+pen vol chang 1
+penabl 1
+penabl se 1
+penabl1 1
+penabledk 1
+penalt 8
+penalt ba 1
+penalt ba rel 1
+penalt dimin 1
+penalt du 1
+penalt for collect 1
+penalt for erron 1
+pench 1
+pench es 1
+pench es sur 1
+pendl 1
+pener 1
+pener and moult 1
+penetr 1
+peng 1
+penjam 1
+pennebaker 1
+pennec 1
+pennec et ayach 1
+pennec et thir 1
+pennec inr 1
+pennsylvan 4
+penser 4
+penser a un 1
+penser qu 3
+penser qu ce 1
+penser qu la 2
+penser qu le 1
+penser quun 1
+penser quun processeur 1
+penson 2
+penson qu 2
+penson qu ce 1
+penson qu le 1
+penson qu no 1
+penson quil 1
+penson quil est 1
+penson quil faudrait 1
+pensylvan 1
+pent 4
+pent ba 1
+pent ba computer 1
+pent d epen 1
+pent hal 1
+pentomin 1
+pentomin problem 1
+pentomin2 1
+pentton 2
+peopl 19
+peopl agent 1
+peopl agent comun 1
+peopl and equipm 1
+peopl ar ext 1
+peopl ar lik 1
+peopl ar seen 1
+peopl awar 1
+peopl bool 1
+peopl can interpr 1
+peopl direct contribut 1
+peopl doing maint 1
+peopl evar.html 1
+peopl facult 1
+peopl facult neal 1
+peopl from european 1
+peopl giv 1
+peopl had suff 1
+peopl hav begun 1
+peopl help 1
+peopl help prefer 1
+peopl in californ 1
+peopl in da 1
+peopl know 1
+peopl look 1
+peopl or computer 1
+peopl or team 1
+peopl peopl 1
+peopl peopl bool 1
+peopl per group 1
+peopl perform 1
+peopl str 1
+peopl ten 2
+peopl that deal 1
+peopl think 1
+peopl to perform 1
+peopl to softwar 1
+peopl wh felt 1
+peopl wh tackl 1
+peopl wil wish 1
+peopl with singl 1
+peopl work 1
+peopl worldw 1
+pepid 1
+pepm97 1
+pept 1
+pept con 1
+per 16
+per and sam 1
+per and tran 1
+per between me 1
+per de 5
+per de coh 1
+per de diversit 1
+per de la 1
+per de perform 1
+per de temp 1
+per de vit 1
+per du 1
+per du par 1
+per en 1
+per en espac 1
+per en temp 1
+per object 3
+per object orient 1
+per object system 1
+per pr 1
+per pr ematur 1
+per proper 1
+per puisquil 1
+per puisquil nous 1
+per record 1
+per to larger 1
+per virtu 1
+per virtu memor 1
+per. 1
+perc 27
+perc and threshold 1
+perc faster 1
+perc for interm 1
+perc improv 1
+perc incr 1
+perc is smaller 1
+perc of bit 1
+perc of error 1
+perc of imag 1
+perc of input 1
+perc of inst 1
+perc of maint 1
+perc of parallel 1
+perc of recomput 1
+perc of shar 1
+perc of softwar 1
+perc of test 2
+perc of tim 1
+perc of tot 1
+perc of variabl 1
+perc recomput 1
+perc textur 1
+perc th posit 1
+perc th us 1
+perceiv 9
+perceiv adv 1
+perceiv between observ 1
+perceiv ea 1
+perceiv environm 1
+perceiv environm input 1
+perceiv environm st 1
+perceiv event 1
+perceiv funct 1
+perceiv load 1
+perceiv most lik 1
+perceiv perform 1
+perceiv system 1
+perceiv system st 1
+perceiv th po 1
+perceiv us 1
+percentil 2
+percentil respon 1
+percentil respon tim 1
+percept 14
+percept and behavior 1
+percept and privileg 1
+percept de 1
+percept de nat 1
+percept dist 1
+percept for robot 1
+percept model 1
+percept multisensoriel 1
+percept of harmon 1
+percept of human 1
+percept of melod 1
+percept of speech 1
+percept trembl 1
+perceptron 3
+perceptron solut 1
+perceptu 1
+perceptu artifact 1
+perceptu qu 1
+perceptu undesir 1
+perceptu undesir imag 1
+percol 2
+percol an upd 1
+perd 2
+perd ain 1
+perd ain la 1
+perd de 1
+perd de la 1
+perd donc 1
+perd donc tout 1
+perd la 1
+perd la propr 1
+perd le 1
+perd le droit 1
+perd pour 1
+perd pour tout 1
+perdr 3
+perdr la 2
+perdr la propr 1
+perdr la valeur 1
+perdr le 2
+perdr le droit 1
+perdr le meilleur 1
+perdr un 1
+perdr un grand 1
+perdu 2
+perdu est 1
+perdu est de 1
+perdu et la 1
+perdu le 1
+perdu le context 1
+perdu par 1
+perdu par faux 1
+perdurer 1
+perdurer dan 1
+perdurer dan le 1
+perez 3
+perf 1
+perf monit 1
+perfect 22
+perfect al 1
+perfect al an 1
+perfect alignm 1
+perfect benchmark 1
+perfect bound 1
+perfect bound extract 1
+perfect branch 1
+perfect branch predict 1
+perfect cach 1
+perfect club 1
+perfect club benchmark 1
+perfect compiler 1
+perfect compiler al 1
+perfect corp 1
+perfect gener 1
+perfect graph 1
+perfect hash 1
+perfect hash funct 1
+perfect in modl 1
+perfect is extrem 1
+perfect isol 1
+perfect learn 1
+perfect load 1
+perfect load bal 1
+perfect match 1
+perfect memor 1
+perfect memor disambigu 1
+perfect model 2
+perfect nest 1
+perfect nest loop 1
+perfect observ 1
+perfect observabl 1
+perfect perfect 1
+perfect perfect ye 1
+perfect perform 1
+perfect reconstruc 2
+perfect reconstruc condit 1
+perfect reconstruc decomposit 1
+perfect shuf 1
+perfect shuffl 1
+perfect simil 1
+perfect squar 1
+perfect synchron 1
+perfect to garb 1
+perfect ye 1
+perfom 2
+perfom at connec 1
+perfom th transform 1
+perform 110
+perform 3d 1
+perform 3d object 1
+perform a ba 1
+perform a cl 1
+perform a compar 1
+perform a comparison 1
+perform a computer 1
+perform a fin 1
+perform a giv 2
+perform a greed 1
+perform a half 1
+perform a lexicograph 1
+perform a minim 1
+perform a minor 1
+perform a moindr 1
+perform a mov 1
+perform a pair 1
+perform a perfect 1
+perform a recomput 1
+perform a reduc 1
+perform a report 1
+perform a rl 1
+perform a segm 1
+perform a sequ 2
+perform a ser 3
+perform a stat 1
+perform a sum 1
+perform a task 1
+perform a terror 1
+perform a transit 1
+perform a transp 1
+perform a tripl 1
+perform a typ 1
+perform a union 1
+perform a writ 1
+perform acceptabl 1
+perform achief 4
+perform actuel 1
+perform actuel de 1
+perform addit 1
+perform addit experim 1
+perform adv 2
+perform al experim 1
+perform al loc 1
+perform al modif 1
+perform al oper 1
+perform allow 1
+perform an 9
+perform an act 1
+perform an aver 1
+perform an empir 1
+perform an expan 1
+perform an input 1
+perform an upd 1
+perform and bottleneck 1
+perform and complec 1
+perform and cost 3
+perform and elabor 1
+perform and guid 1
+perform and memor 1
+perform and pot 1
+perform and qu 1
+perform and responsetim 1
+perform and scal 1
+perform and simpl 1
+perform and st 1
+perform and therefor 1
+perform and tim 1
+perform and transact 1
+perform any bin 1
+perform any funct 1
+perform any relev 1
+perform any wor 1
+perform appl 1
+perform appl dep 1
+perform approxim 1
+perform approxim comput 1
+perform ar observ 1
+perform ar reflect 1
+perform arbitr 1
+perform arbitr comput 1
+perform architectur 2
+perform argum 1
+perform argum pa 1
+perform art 1
+perform as 1
+perform as deriv 1
+perform aspect 1
+perform aspect allow 1
+perform assessm 1
+perform assessm block 1
+perform at georg 1
+perform at minim 1
+perform at p1 1
+perform at sw 1
+perform au 1
+perform au moin 1
+perform automat 1
+perform ba 2
+perform ba block 1
+perform back en 1
+perform bad 1
+perform bar chart 1
+perform bay 1
+perform bay infer 1
+perform becom 2
+perform befor subject 1
+perform begin 1
+perform benefit 2
+perform benefit assoc 1
+perform between polygon 1
+perform blam 1
+perform blam assignm 1
+perform boolean 2
+perform boolean eval 1
+perform boolean oper 1
+perform both rol 1
+perform bottleneck 2
+perform bound 3
+perform bound using 1
+perform by ad 1
+perform by adapt 1
+perform by compar 1
+perform by comput 1
+perform by grad 1
+perform by human 1
+perform by keyword 1
+perform by mean 1
+perform by peopl 1
+perform by proc 1
+perform by propag 1
+perform by read 1
+perform by remot 1
+perform by transcript 1
+perform by upd 1
+perform calcl 1
+perform can mean 1
+perform cannot sum 1
+perform character 4
+perform classif 1
+perform cler 1
+perform cler dut 1
+perform cockpit 1
+perform cod 1
+perform cod mot 1
+perform collect 1
+perform column 1
+perform common 1
+perform common comput 1
+perform compar 3
+perform compar cl 1
+perform comparabl 1
+perform comparabl aux 1
+perform comparison 6
+perform compil 1
+perform compil tim 1
+perform compl 2
+perform comput 7
+perform comput as 1
+perform comput ba 1
+perform comput research 2
+perform computer 1
+perform computer network 1
+perform computingresearch 1
+perform computingresearch center 1
+perform consid 1
+perform consid erabl 1
+perform cont 1
+perform cont search 1
+perform continu 1
+perform continu pa 1
+perform control 1
+perform control dep 1
+perform correct 1
+perform correct rout 1
+perform cost 1
+perform cost rat 1
+perform could ea 1
+perform d es 1
+perform d famil 1
+perform dan 2
+perform dan ce 1
+perform dan leur 1
+perform dat 3
+perform dat concern 1
+perform dat show 1
+perform datab 1
+perform datab proc 1
+perform de 5
+perform de ag 1
+perform de ce 2
+perform de cod 1
+perform de impl 1
+perform de inst 1
+perform de kcm 1
+perform de la 2
+perform de lalgorithm 1
+perform de lordonnanc 1
+perform de program 2
+perform de tr 1
+perform de ver 1
+perform def 1
+perform degrad 5
+perform degrad du 1
+perform degrad incr 1
+perform degrad regl 1
+perform deleg 1
+perform deleg automat 1
+perform demand 2
+perform denviron 1
+perform dep 4
+perform dep heav 1
+perform dep strong 1
+perform differ 3
+perform du 4
+perform du bloc 1
+perform du bus 1
+perform du gestionnair 1
+perform du march 1
+perform du nid 1
+perform du noyau 1
+perform du pav 1
+perform du program 1
+perform du protocol 1
+perform du syst 2
+perform dun 3
+perform dun algorithm 1
+perform dun calculateur 1
+perform dun mvp 1
+perform dun nid 1
+perform dun syst 2
+perform dur problem 1
+perform dur qu 1
+perform each atom 1
+perform ebg 1
+perform eff 1
+perform effectu 1
+perform effectu ee 1
+perform either batch 1
+perform el 3
+perform el attribut 1
+perform el transform 1
+perform elabor 1
+perform elabor quest 1
+perform empir 2
+perform empir stud 1
+perform empir work 1
+perform enhanc 1
+perform equiv 1
+perform error 1
+perform es 1
+perform es obtenu 1
+perform es tr 1
+perform estim 1
+perform evalu 10
+perform evalu result 1
+perform evalu stud 1
+perform exact 1
+perform exact dep 1
+perform exact elim 1
+perform experim 3
+perform experim using 2
+perform ext 1
+perform ext siml 1
+perform fact 3
+perform fact greater 1
+perform failur 1
+perform fal 1
+perform fast 1
+perform fast point 1
+perform few oper 1
+perform flow 1
+perform flow control 1
+perform for 1
+perform for jpeg 1
+perform for sampl 1
+perform for subband 1
+perform for wid 1
+perform form 1
+perform fortran 2
+perform fortran for 1
+perform fortran langu 2
+perform from osl 1
+perform further 1
+perform further an 1
+perform fus 1
+perform gain 4
+perform garb 1
+perform garb collect 1
+perform geograph 1
+perform geograph inform 1
+perform gi 1
+perform glob 2
+perform glob test 1
+perform glp 1
+perform goal 1
+perform goal satisf 1
+perform goal tok 1
+perform good 1
+perform good coar 1
+perform gr 1
+perform gr ce 1
+perform graph 1
+perform greater 2
+perform guar 2
+perform hard threshold 1
+perform hav beed 1
+perform hierarch 1
+perform hierarch decomposit 1
+perform i allow 1
+perform ignorer 1
+perform ignorer le 1
+perform impact 2
+perform impl 1
+perform improv 6
+perform improv ind 1
+perform improv particl 1
+perform improv slow 1
+perform in adv 1
+perform in amort 1
+perform in cor 1
+perform in fer 1
+perform in gi 1
+perform in parallel 5
+perform in ptim 1
+perform in siml 1
+perform in step 1
+perform in term 2
+perform in tim 1
+perform in wgp 1
+perform inadequ 1
+perform ind 3
+perform individu 1
+perform individu ecol 1
+perform inform 1
+perform inherit 1
+perform inherit comput 1
+perform inser 1
+perform int payoff 1
+perform interconnect 1
+perform interconnect network 1
+perform internet 1
+perform internet serv 1
+perform interpl 1
+perform intersect 1
+perform intersect calcl 1
+perform intrin 1
+perform intrin equ 1
+perform ip 1
+perform ip failover 1
+perform is achief 2
+perform is adequ 1
+perform is compar 1
+perform is concern 1
+perform is consider 1
+perform is determin 1
+perform is es 1
+perform is high 1
+perform is maintain 1
+perform is near 1
+perform is obtain 1
+perform is rapid 1
+perform is render.1 1
+perform it con 1
+perform it intersect 1
+perform jusqu 1
+perform knowledg 1
+perform knowledg structur 1
+perform l eg 1
+perform lan 1
+perform lan environm 1
+perform lexicograph 1
+perform lexicograph comparison 1
+perform lin 1
+perform lin using 1
+perform lo 2
+perform loc 3
+perform loc chang 1
+perform loc cl 1
+perform log 2
+perform log program 1
+perform loop 1
+perform loop block 1
+perform lorsqu 1
+perform lorsqu le 1
+perform low 1
+perform low level 1
+perform maint 1
+perform mathemat 1
+perform mathemat subrout 1
+perform measur 8
+perform measur calcl 1
+perform measur inclus 1
+perform memor 1
+perform memor renam 1
+perform might rel 1
+perform model 3
+perform model develop 1
+perform monit 1
+perform monit compon 1
+perform monit ge 1
+perform monit maintain 1
+perform monit upd 1
+perform montr 1
+perform montr qu 1
+perform mor effect 1
+perform mov 1
+perform mult 1
+perform mult queu 1
+perform multicast 1
+perform multicast using 1
+perform multiproc 1
+perform na 1
+perform na toutef 1
+perform neg 1
+perform neg learn 1
+perform network 1
+perform neur 1
+perform neur network 1
+perform nic 1
+perform nod 1
+perform nod del 1
+perform nod div 1
+perform number 1
+perform object 1
+perform object orient 1
+perform objectiv 1
+perform obtenu 1
+perform obtenu par 1
+perform obtenu sur 1
+perform octasect 1
+perform of 2cl 1
+perform of asynchron 1
+perform of block 1
+perform of bound 1
+perform of compiler 1
+perform of compmst 1
+perform of coupl 1
+perform of crystal 1
+perform of custom 1
+perform of ded 1
+perform of dlb 1
+perform of ec 1
+perform of hierarch 2
+perform of hmin 1
+perform of laz 1
+perform of lrc 1
+perform of na 1
+perform of narx 1
+perform of non 1
+perform of parallel 1
+perform of prior 1
+perform of prolog 1
+perform of rang 1
+perform of repr 1
+perform of satisf 1
+perform of shallow 1
+perform of sml 1
+perform of snapshot 1
+perform of softwar 1
+perform of specl 1
+perform of spin 1
+perform of ss 1
+perform of sun 1
+perform of sw 1
+perform of synchron 1
+perform of system 2
+perform of tempor 1
+perform of tt 1
+perform of ttl 1
+perform of var 3
+perform of vm 1
+perform offer 1
+perform on computer 1
+perform on futur 1
+perform on individu 1
+perform on modif 1
+perform on ph 1
+perform on random 1
+perform on triangl 1
+perform onl determin 1
+perform oper 1
+perform optim 3
+perform ou 1
+perform ou lacc 1
+perform our experim 1
+perform overlap 1
+perform parallel 5
+perform parallel architectur 1
+perform parallel compiler 1
+perform parallel comput 1
+perform parallel computer 1
+perform parallel interfac 1
+perform parameter 1
+perform parm 1
+perform pattern 1
+perform penalt 5
+perform penalt dimin 1
+perform penalt du 1
+perform per dat 1
+perform per unit 1
+perform perfect 1
+perform ph 1
+perform platform 1
+perform plus soupl 1
+perform poor 1
+perform pour 1
+perform pr 1
+perform predict 2
+perform probabil 1
+perform probabil weight 1
+perform problem 1
+perform problem solver 1
+perform proc 1
+perform proch 1
+perform proch dun 1
+perform prolog 1
+perform prolog implem 1
+perform prolog proc 1
+perform qu 1
+perform qu en 1
+perform qu fs 1
+perform qu la 1
+perform qu lalign 1
+perform quick 2
+perform quick fic 1
+perform quit simil 1
+perform rat 2
+perform rat exhibit 1
+perform real 1
+perform recov 1
+perform recur 1
+perform recur cal 1
+perform red 1
+perform red recov 1
+perform reduc 1
+perform regr 1
+perform regr test 1
+perform rel 2
+perform rel infrequ 1
+perform rel stat 1
+perform remain 2
+perform remain unchang 1
+perform report 2
+perform report oper 1
+perform report2b 1
+perform requir 5
+perform requir using 1
+perform resolut 1
+perform respectiv 1
+perform respectiv dun 1
+perform result 6
+perform schedl 1
+perform se 1
+perform select 1
+perform select prompt 1
+perform self 1
+perform self observ 1
+perform sem 2
+perform sem check 1
+perform sem preserv 1
+perform separ 1
+perform seront 1
+perform seront lim 1
+perform sever experim 1
+perform sever measur 1
+perform show 2
+perform si 1
+perform signif 5
+perform signif wor 2
+perform silicon 1
+perform silicon ar 1
+perform simil 3
+perform simil act 1
+perform simil optim 1
+perform simultan 1
+perform simultan tr 1
+perform singl 1
+perform singl step 1
+perform slight 1
+perform slight wor 1
+perform slower 1
+perform sol 1
+perform sol lin 1
+perform som chang 1
+perform som funct 1
+perform som reduc 1
+perform som tim 1
+perform sont 2
+perform sont probabl 1
+perform sont sensibl 1
+perform sont sup 1
+perform sont tr 1
+perform soph 1
+perform soph an 1
+perform soulign 1
+perform soulign ee 1
+perform spec 1
+perform spec task 1
+perform standard 1
+perform standard bp 1
+perform standpoint 1
+perform stat 1
+perform strict 1
+perform string 1
+perform stud 4
+perform subst 2
+perform such loc 1
+perform such ment 1
+perform such search 1
+perform sum 1
+perform sur 1
+perform sur un 1
+perform switch 2
+perform synchron 1
+perform syntac 1
+perform syntac tr 1
+perform task 1
+perform tcomp 1
+perform tcomp tcom 1
+perform techniqu 1
+perform test 2
+perform test select 1
+perform th acquir 1
+perform th act 1
+perform th algorithm 1
+perform th an 1
+perform th appropr 2
+perform th approxim 1
+perform th assignm 2
+perform th bal 1
+perform th behavior 1
+perform th calcl 1
+perform th coar 1
+perform th comparison 1
+perform th complec 1
+perform th comput 1
+perform th construc 1
+perform th decluster 1
+perform th dynam 1
+perform th el 1
+perform th execut 1
+perform th exp 1
+perform th experim 1
+perform th fault 1
+perform th gener 1
+perform th gp 1
+perform th init 1
+perform th inver 1
+perform th map 2
+perform th merg 1
+perform th minim 2
+perform th modif 1
+perform th monit 1
+perform th mov 1
+perform th multim 1
+perform th oper 2
+perform th origin 1
+perform th rever 1
+perform th rewrit 1
+perform th run 1
+perform th search 1
+perform th step 1
+perform th synchron 1
+perform th textur 1
+perform th thin 1
+perform th triangl 1
+perform th unif 1
+perform th wavel 1
+perform th work 1
+perform than architectur 1
+perform than commerc 1
+perform than network 1
+perform than using 1
+perform that algorithm 1
+perform then tt 1
+perform thr kind 1
+perform through maxim 1
+perform timesl 1
+perform to en 1
+perform to select 1
+perform to siml 1
+perform to upd 1
+perform tok 1
+perform tok level 1
+perform trad 1
+perform transact 1
+perform transact proc 1
+perform transact system 1
+perform transm 1
+perform transpar 1
+perform tren 1
+perform triangl 2
+perform triangl produc 1
+perform triangl triangl 1
+perform tru grad 1
+perform tun 1
+perform tw 1
+perform tw funct 1
+perform tw rol 1
+perform tw task 1
+perform typiqu 1
+perform und 1
+perform und recov 1
+perform under rigor 1
+perform unit 1
+perform unit claus 1
+perform upd 2
+perform using 5
+perform using recur 1
+perform using visu 1
+perform virtu 1
+perform virtu trim 1
+perform wa ch 1
+perform wa measur 1
+perform wel wrt 1
+perform wer compar 1
+perform when com 1
+perform when select 1
+perform when solut 1
+perform when using 1
+perform with ac 1
+perform with cheapest 2
+perform with incr 2
+perform with nm 1
+perform with parallel 1
+perform with problem 1
+perform with respect 1
+perform with uniform 1
+perform with wider 1
+perform wor 2
+perform work 1
+perform workst 1
+perform x ver 1
+performac 2
+performac computer 1
+performac computer architectur 1
+performac tun 1
+performanceassessm 1
+performanceassessm confid 1
+performancegoalspecif 1
+performancegoalspecificationl 1
+performancegoalspecificationl performancegoalspecif 1
+pergamon 2
+pergamon pr 2
+pergamon pr ltd 1
+pericl 1
+pericl loucopoul 1
+perikl 1
+perimeter 4
+perimeter of 4pa 2
+perimeter of length 2
+period 28
+period an 1
+period and act 1
+period and parameter 1
+period and spf 1
+period ar serv 1
+period arp 1
+period arp resolut 1
+period at tim 2
+period autocorrel 1
+period autocorrel funct 1
+period be number 1
+period calcl 1
+period cost 1
+period event 1
+period event ec 1
+period expan 1
+period for se 1
+period for spf 1
+period forml 1
+period in interv 1
+period inform 1
+period inv 1
+period is defin 1
+period is reach 1
+period is uniform 1
+period is us 1
+period length 1
+period length param 1
+period lo 1
+period loop 1
+period maxcountv 1
+period may actu 1
+period may appear 1
+period may becom 1
+period may contain 1
+period may occur 1
+period me 1
+period me announc 1
+period must en 1
+period of connect 1
+period of individu 1
+period of length 1
+period of se 1
+period of tim 5
+period p fout 1
+period p prev 1
+period p prev1 1
+period pl 1
+period prov 1
+period refin 1
+period report 1
+period ri 1
+period riccat 1
+period riccat equ 1
+period schur 1
+period schur decomposit 1
+period sd 1
+period sen 1
+period sen me 1
+period shift 1
+period shift ver 1
+period standard 1
+period standard dev 1
+period start 2
+period synchron 1
+period task 1
+period task respect 1
+period th connect 1
+period th server 1
+period that start 1
+period tim 1
+period to commun 1
+period to discard 1
+period transm 1
+period under observ 1
+period upd 1
+period upd perform 1
+period using 1
+period versus tim 1
+period wh 1
+periph 2
+periph pinout 2
+periph pinout technolog 2
+periph tech 2
+periph tech pincount 2
+periph technolog 2
+peripher 3
+peripher connect 2
+peripher hardwar 1
+peripher or surfac 2
+peripher pin 2
+peripher pin count 2
+peripher pinout 2
+peripher pinout technolog 2
+peripher technolog 2
+peripher technolog respect 2
+peripher technolog technolog 2
+perish 1
+perl 2
+perl script 1
+perm 35
+perm a de 1
+perm a detail 1
+perm a fl 2
+perm a la 1
+perm a sequ 1
+perm abbrev 1
+perm abbrev refer 1
+perm ain 1
+perm alor 1
+perm alor dappliquer 1
+perm alor dassoc 1
+perm alor de 1
+perm an ea 1
+perm aus 1
+perm autom 1
+perm autom object 1
+perm aux 1
+perm aux ducateur 1
+perm backtrack 1
+perm bien 1
+perm bien la 1
+perm ce 1
+perm constraint 1
+perm cr 1
+perm cr classif 1
+perm d crir 1
+perm d eliminer 1
+perm d etablir 1
+perm d etendr 1
+perm d eviter 2
+perm dajouter 1
+perm dam 1
+perm dam eliorer 1
+perm dan 1
+perm dan le 1
+perm dassurer 1
+perm dassurer la 1
+perm dassurer quil 1
+perm dat 1
+perm dat commun 1
+perm dattribuer 1
+perm dattribuer un 1
+perm davoir 1
+perm de 5
+perm de calculer 1
+perm de capturer 1
+perm de clarif 1
+perm de classif 1
+perm de comparaison 1
+perm de comparer 1
+perm de compiler 1
+perm de compl 1
+perm de consid 1
+perm de construir 2
+perm de contr 1
+perm de contracter 1
+perm de disposer 1
+perm de distinguer 1
+perm de factoriser 1
+perm de fair 1
+perm de garantir 1
+perm de garder 1
+perm de laisser 1
+perm de le 1
+perm de lier 1
+perm de localiser 1
+perm de masquer 1
+perm de mettr 1
+perm de mieux 1
+perm de modif 1
+perm de montrer 1
+perm de nappliquer 1
+perm de ne 1
+perm de partager 1
+perm de participer 1
+perm de parvenir 1
+perm de quantif 1
+perm de recon 1
+perm de recop 1
+perm de regrouper 1
+perm de remplacer 1
+perm de rendr 2
+perm de repr 1
+perm de reproduir 1
+perm de retourner 1
+perm de retrouver 1
+perm de sabstrair 1
+perm de sassurer 1
+perm de sauter 1
+perm de savoir 2
+perm de se 1
+perm de simplif 1
+perm de solut 1
+perm de supprimer 1
+perm de tirer 2
+perm de traiter 2
+perm de transformer 1
+perm de trouver 1
+perm de valider 2
+perm de visiter 1
+perm de voir 1
+perm deffectuer 1
+perm deffectuer la 1
+perm den 1
+perm den caract 1
+perm descript 1
+perm desp 1
+perm desp erer 1
+perm destimer 1
+perm destimer de 1
+perm didentif 2
+perm didentif pr 1
+perm didentif tous 1
+perm didentioer 1
+perm didentioer la 1
+perm didentioer le 1
+perm dillustrer 2
+perm dillustrer la 1
+perm dillustrer sur 1
+perm dimpl 1
+perm dimpl ementer 1
+perm dobtenir 1
+perm dobtenir avec 1
+perm dobtenir de 1
+perm dobtenir le 1
+perm dobtenir lencadr 1
+perm dobtenir un 1
+perm donc 2
+perm donc de 1
+perm donc soit 1
+perm dutiliser 2
+perm dutiliser larg 1
+perm dutiliser un 1
+perm eabilit 1
+perm ear deliv 1
+perm eff 1
+perm eff cluster 1
+perm egal 2
+perm egal davoir 1
+perm egal dutiliser 1
+perm egal en 1
+perm en 2
+perm en eo 1
+perm en outr 1
+perm encor 1
+perm encor de 1
+perm enter 1
+perm et gram 1
+perm etud 1
+perm exampl 1
+perm experim 1
+perm hierarch 1
+perm hierarch tr 1
+perm impl 1
+perm inst 1
+perm l echang 1
+perm l ecritur 1
+perm l elim 1
+perm la 3
+perm la cr 1
+perm la mi 2
+perm lappl 1
+perm lappl doutil 1
+perm le 1
+perm le calcl 1
+perm le mesur 1
+perm le stock 1
+perm learn 1
+perm lexploit 1
+perm lexploit de 1
+perm lor 1
+perm lor de 1
+perm lutil 1
+perm lutil de 1
+perm nous 1
+perm other bind 1
+perm our tool 1
+perm pa 2
+perm pa daffirmer 1
+perm pa de 2
+perm pa plusieur 1
+perm parent 1
+perm parent transact 1
+perm part 1
+perm part rollback 1
+perm pen 1
+perm pen lec 1
+perm plus de 1
+perm quand 1
+perm quun 1
+perm quun ecritur 1
+perm quun sel 1
+perm red 1
+perm red recov 1
+perm restrict 1
+perm restrict low 1
+perm sever good 1
+perm stud 1
+perm th comput 1
+perm th correspon 1
+perm th definer 1
+perm th deliv 1
+perm th entir 1
+perm th introduc 1
+perm th program 1
+perm th remov 1
+perm to continu 1
+perm to cop 1
+perm to div 1
+perm to introduc 1
+perm to log 1
+perm to rollback 1
+perm toujour 1
+perm toujour dacc 1
+perm un 4
+perm un adr 1
+perm un autr 1
+perm un co 1
+perm un cop 1
+perm un ou 1
+perm un repr 1
+perm un solut 1
+perm und 1
+perm und recov 1
+perman 8
+perman a ecritur 1
+perman a partir 1
+perman activ 1
+perman afin 1
+perman afin de 1
+perman appar 1
+perman appar dan 1
+perman appar pour 1
+perman argum 1
+perman argum de 1
+perman au 1
+perman au sein 1
+perman avant 1
+perman avant lempil 1
+perman avec 1
+perman avec le 1
+perman dan 1
+perman dan de 1
+perman dan lenviron 1
+perman dapr 1
+perman dapr es 1
+perman de 1
+perman de mettr 1
+perman de se 1
+perman doiv 1
+perman doiv rester 1
+perman dont le 1
+perman en 1
+perman en param 1
+perman est 1
+perman est qu 1
+perman ind 1
+perman inutil 1
+perman lor 1
+perman lor de 1
+perman nappar 1
+perman nappar dan 1
+perman ne 1
+perman ne sont 1
+perman nouvel 1
+perman nouvel cr 1
+perman ordinair 1
+perman prendr 1
+perman prendr en 1
+perman qu 1
+perman qu nappar 1
+perman qu ont 1
+perman relationship 1
+perman rest 1
+perman rest un 1
+perman rev 1
+perman sen 1
+perman sen trouv 1
+perman sont 1
+perman sont accessibl 1
+perman sont rang 1
+perman st 1
+perman util 1
+perman var 1
+perman var slot 1
+perman variabl 1
+perman vi 1
+perman vi window 1
+perman x1 1
+perman y3 1
+permettait 1
+permettait pa 1
+permettr 5
+permettr a chaqu 1
+permettr a lop 1
+permettr au 1
+permettr aux 1
+permettr aux pr 1
+permettr d eliminer 1
+permettr davoir 1
+permettr davoir de 1
+permettr de 4
+permettr de distinguer 1
+permettr de lib 1
+permettr de profiter 1
+permettr de tirer 1
+permettr de traiter 1
+permettr deffectuer 1
+permettr deffectuer son 1
+permettr den 1
+permettr den souligner 1
+permettr dimpl 1
+permettr dimpl ementer 1
+permettr egal 1
+permettr egal de 1
+permettr le 1
+permettr le migr 1
+permettr lec 1
+permettr lec ecut 1
+permettr pa 1
+permettr pa deux 1
+permettr un 2
+permettr un acc 1
+permettr un align 1
+permettr un elim 1
+permettr un ex 1
+permettr un tel 1
+permettr un volut 1
+permettrait 2
+permettrait d eviter 1
+permettrait de 1
+permettrait de construir 1
+permettrait la 1
+permettrait la cr 1
+permu. 1
+permut 17
+permut and mov 1
+permut and repl 1
+permut ar ba 1
+permut ar equ 1
+permut argum 1
+permut by mov 1
+permut compl 1
+permut compl exchang 1
+permut compl oper 1
+permut correspon 1
+permut de 1
+permut de boucl 1
+permut giv 1
+permut group 1
+permut hp1 1
+permut ikik 1
+permut in ti 1
+permut inform 1
+permut is oe 1
+permut is ss 1
+permut n record 1
+permut network 2
+permut network algorithm 1
+permut network digraph 1
+permut o determin 1
+permut oe 2
+permut oe1 1
+permut of f1 2
+permut of ind 1
+permut of object 1
+permut of part 1
+permut of proc 1
+permut of request 1
+permut of row 1
+permut order 1
+permut random 1
+permut record 1
+permut rout 2
+permut ss 1
+permut sur 1
+permut sur le 1
+permut th problem 1
+permut th record 1
+permut th se 1
+permut wa comput 1
+permut wil belong 1
+perpendicl 3
+perpendicl bisect 1
+perpetu 1
+perpetu object 1
+perpetu object approach 1
+perpetu pr 1
+perpetu reappear 1
+person 25
+person an 1
+person appl 1
+person cod 1
+person commun 6
+person computer 1
+person di 1
+person di system 1
+person direct 1
+person direct wh 1
+person frank 1
+person from sit 1
+person group 1
+person in denmark 1
+person int 1
+person int er 1
+person ir 1
+person is known 1
+person is unlik 1
+person jennifer 1
+person may ch 1
+person month 1
+person ont 1
+person ont aus 1
+person or chair 1
+person or peer 1
+person perform 1
+person program 1
+person qu 2
+person qu ont 2
+person san qu 1
+person sequ 1
+person sequ infer 1
+person telecommun 1
+person to contact 1
+person week 1
+person with exper 1
+personnel 4
+personnel train 1
+personnel train proper 1
+perspect 14
+perspect de 1
+perspect de la 1
+perspect nous 1
+perspect nous par 1
+perspect of model 1
+perspect on program 1
+perspect on typ 1
+perspect project 1
+perspect project result 1
+perspect serv 1
+perspect view 2
+perspect wal 1
+perspectiv 7
+perspectiv chap 1
+perspectiv dep 1
+perspectiv for adapt 1
+perspectiv of program 1
+perspectiv sur 1
+perspectiv sur de 1
+perspectiv sur la 1
+perspectiv th 1
+perspectiv th oriqu 1
+perspicacit 1
+perspicacit e de 1
+pertain 11
+pertain tim 1
+pertain tim var 1
+pertain to loc 1
+pertain to on 1
+pertin 4
+pertin contribut 1
+pertin mont 1
+pertin mont perm 1
+pertin parameter 1
+perturb 7
+perturb al 1
+perturb al eatoir 1
+perturb e par 1
+perturb le 1
+perturb le variabl 1
+perturb pa 1
+perturb proc 1
+perturb sign 1
+perturb th instruc 1
+perturb th network 1
+perturb th system 1
+perturb th unicast 1
+perturb unicast 1
+perturb unicast traff 1
+perturber 2
+perturber l etat 1
+perturber la 1
+perturber la hi 1
+perunit 1
+perunit cost 1
+perutz 1
+perv 2
+perv complec 1
+perv complec system 1
+perv run 1
+pesqu 1
+pesqu em andam 1
+peter 22
+peter broadb 1
+peter can 1
+peter coad 1
+peter dayan 1
+peter druschel 2
+peter ead 1
+peter freeman 1
+peter hart 1
+peter hart identif 1
+peter ka 1
+peter ka li 1
+peter kearn 1
+peter keleh 1
+peter kriegel 1
+peter m uller 1
+peter niel 1
+peter paul 1
+peter paul mar 1
+peter revesz3 1
+peter sander 1
+peter scheuerman 1
+peter sestoft 1
+peter steenk 1
+peter steenk thom 1
+peter stock 1
+peter summer 1
+peter summer internship 1
+peter turn 1
+peter wegner 1
+peter zabback 1
+peterborough 2
+peterson 3
+peterson method 1
+petit 3
+petit aspect 1
+petit aspect positif 1
+petit compar 1
+petit convec 1
+petit convec cont 1
+petit ent 1
+petit ent sup 1
+petit et au 1
+petit gr 1
+petit gr sous 1
+petit lexiqu 1
+petit multipl 1
+petit multipl commun 1
+petit n n1 1
+petit n solut 1
+petit nombr 1
+petit nombr de 1
+petit perturb 1
+petit perturb al 1
+petit pol 1
+petit pol edr 1
+petit qu 2
+petit qu la 1
+petit qu le 2
+petit tail 1
+petit tail de 1
+petkov 1
+petr 3
+petr a partir 1
+petr and green 1
+petr ci 1
+petr ci de 1
+petr est 1
+petr est alor 1
+petr est dun 1
+petr net 2
+petr net perform 1
+petr quun 1
+petr quun condit 1
+petr sous 1
+petr sous jacent 1
+petr stochastiqu 1
+petr stochastiqu markov 1
+petr stochastiqu qu 1
+petroleum 1
+petroleum refin 1
+petromyzon 1
+petromyzon marinus 1
+petronilh 1
+petrov 1
+petrovack 1
+peu 4
+peu a attendr 1
+peu aux 1
+peu aux chang 1
+peu co 1
+peu co uteus 1
+peu cour 1
+peu dattrait 1
+peu dattrait dan 1
+peu de 4
+peu de aeou 1
+peu de celu 1
+peu de group 1
+peu de param 1
+peu de register 1
+peu din 1
+peu din egalit 1
+peu dint 2
+peu dint er 2
+peu efficac 1
+peu efficac la 1
+peu eucl 1
+peu fr 1
+peu fr equent 1
+peu int 1
+peu int er 1
+peu moin 2
+peu moin de 1
+peu moin perform 1
+peu perform 1
+peu plus complec 1
+peu plus de 1
+peu plus despac 1
+peu pr 1
+peu pr es 1
+peu profon 1
+peu rigoureux 1
+peu sen 1
+peu sensibl 1
+peu significatif 1
+peu sur 1
+peu sur la 1
+peu vi 1
+peu vi dan 1
+peugeot 1
+peupl 1
+peut 5
+peut a el 1
+peut acc 1
+peut acc eder 1
+peut ain 5
+peut ain caract 1
+peut ain conduir 1
+peut ain cr 1
+peut ain ecrir 2
+peut ain etr 1
+peut ain se 1
+peut aller 1
+peut aller au 1
+peut alor 3
+peut alor conduir 1
+peut alor distribuer 1
+peut alor diviser 1
+peut alor effectuer 1
+peut alor etr 2
+peut alor fixer 1
+peut alor parcourir 1
+peut alor utiliser 1
+peut apparem 1
+peut appartenir 1
+peut appliquer 1
+peut appliquer un 1
+peut arriver 1
+peut arriver qu 1
+peut atteindr 1
+peut augmenter 1
+peut aus 2
+peut aus engendrer 1
+peut aus envisager 1
+peut aus etr 1
+peut aus permettr 1
+peut avoir 2
+peut avoir lieu 1
+peut avoir ten 2
+peut bien 1
+peut bien interpr 1
+peut calculer 1
+peut calculer de 1
+peut choisir 1
+peut choisir un 1
+peut citer 3
+peut citer entr 1
+peut citer ivy 1
+peut citer la 1
+peut com 1
+peut com pr 1
+peut conclur 1
+peut conclur de 1
+peut conduir 1
+peut consid 1
+peut consid erer 1
+peut contenir 1
+peut contenir de 1
+peut contourner 1
+peut contourner ce 1
+peut converger 1
+peut converger trop 1
+peut correspondr 1
+peut correspondr au 1
+peut cr 1
+peut cr eer 1
+peut d ecrir 1
+peut d eduir 2
+peut d efinir 1
+peut d egrader 1
+peut d es 1
+peut d eterminer 1
+peut d onir 1
+peut demander 1
+peut demander jusqu 1
+peut direct 1
+peut direct etr 1
+peut diviser 1
+peut diviser en 1
+peut donc 2
+peut donc ecrir 1
+peut donc entrer 1
+peut donc etr 2
+peut donc le 1
+peut donc par 1
+peut donc sav 1
+peut donc se 2
+peut donner 1
+peut ecarter 1
+peut effectuer 1
+peut effectuer lorsquil 1
+peut en 2
+peut en aucun 1
+peut encor 1
+peut encor contenir 1
+peut encor etr 1
+peut encor sav 1
+peut ensuit 1
+peut ensuit tr 1
+peut etr 4
+peut etr amener 1
+peut etr appliqu 2
+peut etr arbitrair 1
+peut etr atteint 1
+peut etr bien 1
+peut etr cach 1
+peut etr calcl 1
+peut etr caract 1
+peut etr chang 1
+peut etr combin 1
+peut etr compil 1
+peut etr compr 1
+peut etr conseil 1
+peut etr consid 1
+peut etr construit 1
+peut etr court 1
+peut etr direct 1
+peut etr div 1
+peut etr effectu 1
+peut etr efficac 1
+peut etr egal 1
+peut etr elimin 2
+peut etr encor 1
+peut etr enonc 1
+peut etr etendu 1
+peut etr evit 1
+peut etr expliqu 1
+peut etr exploit 1
+peut etr exprim 1
+peut etr facil 1
+peut etr fait 1
+peut etr fic 1
+peut etr illustr 1
+peut etr indiff 1
+peut etr interpr 2
+peut etr le 2
+peut etr li 1
+peut etr lib 1
+peut etr libr 1
+peut etr lu 1
+peut etr major 1
+peut etr mi 2
+peut etr microcod 1
+peut etr mod 1
+peut etr modif 2
+peut etr moindr 1
+peut etr na 1
+peut etr obtenu 1
+peut etr pa 1
+peut etr partag 1
+peut etr partiel 1
+peut etr pr 1
+peut etr rel 1
+peut etr remplac 1
+peut etr rendu 1
+peut etr rep 1
+peut etr repr 2
+peut etr sauvegard 1
+peut etr scind 1
+peut etr sign 1
+peut etr simpl 1
+peut etr soit 2
+peut etr souhait 1
+peut etr soum 1
+peut etr sp 1
+peut etr sup 1
+peut etr tel 1
+peut etr transform 1
+peut etr un 3
+peut etr util 1
+peut etr visu 2
+peut etr vu 3
+peut eventuel 2
+peut eventuel etr 2
+peut eviter 2
+peut eviter le 1
+peut eviter lec 1
+peut evoluer 1
+peut exister 1
+peut exister un 1
+peut extrair 1
+peut extrair ik 1
+peut facil 1
+peut facil etr 1
+peut favoriser 1
+peut favoriser la 1
+peut gal 1
+peut gal tr 1
+peut garantir 1
+peut garantir quaucun 1
+peut garantir quil 1
+peut imaginer 1
+peut imaginer ensuit 1
+peut impliquer 1
+peut impliquer aus 1
+peut intervenir 1
+peut intervenir quapr 1
+peut l egal 1
+peut la 1
+peut le 1
+peut le voir 1
+peut m em 1
+peut maint 2
+peut maint envisager 1
+peut maint etr 1
+peut malheureus 1
+peut malheureus obtenir 1
+peut navoir 1
+peut navoir aucun 1
+peut ne 2
+peut ne pa 1
+peut ne rien 1
+peut noter 1
+peut noter quil 1
+peut obtenir 1
+peut obtenir la 1
+peut pa 3
+peut pa calculer 1
+peut pa compenser 1
+peut pa conduir 1
+peut pa consid 1
+peut pa echouer 1
+peut pa etr 2
+peut pa retourner 1
+peut pa revenir 1
+peut par 2
+peut par exempl 1
+peut par tr 1
+peut partiel 1
+peut permettr 1
+peut permettr de 1
+peut plus etr 2
+peut po 1
+peut po eder 1
+peut pr 1
+peut pr evoir 1
+peut prendr 3
+peut prendr egal 1
+peut prendr qu 1
+peut prendr tout 1
+peut prendr un 1
+peut provoquer 1
+peut provoquer jusqu 1
+peut r ecup 1
+peut r eduir 1
+peut r eutiliser 1
+peut ralentir 1
+peut ralentir le 1
+peut rattach 1
+peut redevenir 1
+peut redevenir la 1
+peut remarquer 1
+peut remarquer qu 1
+peut requ 1
+peut requ erir 1
+peut rester 1
+peut rester const 1
+peut retrouver 1
+peut retrouver son 1
+peut s ecrir 2
+peut s etendr 1
+peut s etonner 1
+peut sappliquer 1
+peut sappliquer aux 1
+peut sattendr 1
+peut sautoriser 1
+peut sautoriser de 1
+peut sav 2
+peut sav erer 2
+peut se 4
+peut se borner 1
+peut se contenter 1
+peut se demander 1
+peut se fair 1
+peut se formuler 1
+peut se limiter 1
+peut se poser 1
+peut se produir 1
+peut se ramener 1
+peut se reporter 1
+peut seffectuer 2
+peut seffectuer au 1
+peut seffectuer lorsqu 1
+peut sel 1
+peut sel etr 1
+peut sembler 1
+peut sembler peu 1
+peut sengager 1
+peut sexpliquer 1
+peut sexpliquer soit 1
+peut sexprimer 1
+peut sexprimer en 1
+peut simpl 1
+peut simpl etr 1
+peut souhaiter 1
+peut souhaiter eviter 1
+peut souhaiter laisser 1
+peut souv 1
+peut souv concentrer 1
+peut subir 1
+peut subir de 1
+peut surprendr 1
+peut surprendr ma 1
+peut th 1
+peut th eoriqu 1
+peut tirer 1
+peut tirer le 1
+peut toujour 1
+peut toujour compl 1
+peut toujour employer 1
+peut toujour se 1
+peut toutef 1
+peut toutef accr 1
+peut toutef etr 1
+peut tr 2
+peut tr abord 1
+peut tr appliqu 1
+peut tr es 1
+peut tr obtenu 1
+peut tr tendu 1
+peut y remarquer 1
+peuv 6
+peuv a prior 1
+peuv alor 2
+peuv alor etr 2
+peuv alor se 2
+peuv appar 1
+peuv appar tr 1
+peuv aus 1
+peuv aus etr 1
+peuv aus fair 1
+peuv avoir 1
+peuv avoir de 1
+peuv b en 1
+peuv cep 1
+peuv cep influencer 1
+peuv changer 1
+peuv changer dun 1
+peuv cohabiter 1
+peuv cohabiter gr 1
+peuv communiquer 1
+peuv communiquer par 1
+peuv constituer 1
+peuv constituer un 1
+peuv contenir 1
+peuv contenir plusieur 1
+peuv d ej 1
+peuv dan 1
+peuv dan ce 1
+peuv direct 1
+peuv direct etr 1
+peuv donc 1
+peuv donc etr 1
+peuv echouer 1
+peuv effectuer 1
+peuv effectuer quun 1
+peuv encor 1
+peuv encor provoquer 1
+peuv etr 5
+peuv etr alor 1
+peuv etr appliqu 2
+peuv etr attribu 1
+peuv etr cach 1
+peuv etr calcl 2
+peuv etr charg 1
+peuv etr combin 1
+peuv etr compr 1
+peuv etr connu 1
+peuv etr consid 2
+peuv etr de 1
+peuv etr dus 1
+peuv etr elimin 2
+peuv etr engendr 1
+peuv etr evit 1
+peuv etr ex 1
+peuv etr facil 2
+peuv etr fourn 1
+peuv etr fus 2
+peuv etr inv 1
+peuv etr li 1
+peuv etr lib 1
+peuv etr libr 1
+peuv etr modif 2
+peuv etr obtenu 1
+peuv etr parfait 1
+peuv etr partag 1
+peuv etr partiel 1
+peuv etr pipelin 1
+peuv etr pr 1
+peuv etr raccourc 1
+peuv etr sauv 1
+peuv etr simpl 1
+peuv etr supprim 1
+peuv etr synth 1
+peuv etr trait 1
+peuv etr trop 1
+peuv etr trouv 2
+peuv etr util 1
+peuv etr vus 1
+peuv eviter 1
+peuv eviter jusqu 1
+peuv fonctionner 1
+peuv interagir 1
+peuv interagir quen 1
+peuv maint 1
+peuv offrir 1
+peuv offrir de 1
+peuv pa 2
+peuv pa etr 2
+peuv partager 1
+peuv partager certain 1
+peuv pr 2
+peuv pr ecipiter 1
+peuv pr senter 1
+peuv provenir 1
+peuv provenir de 1
+peuv qu 1
+peuv qu difficil 1
+peuv rel 1
+peuv rel de 1
+peuv rendr 1
+peuv rester 1
+peuv rester tr 1
+peuv sav 1
+peuv sav erer 1
+peuv se 4
+peuv se fair 1
+peuv se lier 1
+peuv se produir 1
+peuv se regrouper 1
+peuv se reproduir 1
+peuv se retrouver 1
+peuv se synth 1
+peuv se trouver 1
+peuv sec 1
+peuv sec ecuter 1
+peuv survenir 1
+peuv toutef 1
+peuv toutef influer 1
+peuv tr 1
+peuv tr di 1
+peuv trouver 1
+peuv trouver un 1
+pev 1
+pey 1
+pey jon 1
+pf 2
+pf ffdg 1
+pf ffsg 1
+pf proc 1
+pf proc tim 1
+pf si 1
+pf si gi2i 1
+pf75 1
+pfaf 1
+pfahringer 2
+pfd 1
+pfd gi2i 1
+pfd1 1
+pfefferkorn 1
+pfefferkorn cp 1
+pfeifer 1
+pfen 1
+pffq 1
+pffq and scfq 1
+pffq is abl 1
+pffq owing 1
+pffq prov 1
+pffq scfq 1
+pffq scfq bandwidth 1
+pffq server 1
+pfister 2
+pfleeger 1
+pfn 1
+pfn phy 1
+pfn phy pfn 1
+pfp 1
+pfp act 1
+pfxt 1
+pfzj 1
+pfzj ag 1
+pfzj ag si 1
+pfzj w jn 1
+pg 8
+pg en 1
+pg en en 1
+pg hpf 1
+pg hpf compiler 1
+pg is abstract 1
+pg of program 1
+pg pointer 1
+pg pointer link 1
+pgcd 1
+pgcd de 1
+pgdcfk 1
+pgdcfk pk 1
+pgk 1
+pgp 1
+pgp consider 1
+pgp li 1
+pgp li lmac 1
+pgp or weight 1
+pgp scheduler 1
+pgp server 1
+ph 47
+ph algorithm 2
+ph amen 1
+ph and chang 1
+ph and control 1
+ph and discrim 1
+ph and thus 1
+ph ar deriv 1
+ph ar execut 1
+ph ar typ 1
+ph at tim 1
+ph begin 1
+ph build 1
+ph by sen 1
+ph ca 1
+ph can achief 1
+ph clock 1
+ph com 2
+ph com protocol 1
+ph compar 1
+ph compl 1
+ph comput 1
+ph con 1
+ph conflictuel 1
+ph contribut 1
+ph contribut signif 1
+ph correct 1
+ph cost 1
+ph d ecritur 1
+ph d elim 1
+ph dacc 1
+ph dacc el 1
+ph dappl 1
+ph dappl aux 1
+ph de 2
+ph de calcl 1
+ph de compil 1
+ph de consom 1
+ph de dilat 1
+ph de lunif 1
+ph de mi 1
+ph de partit 1
+ph dec 1
+ph dep 1
+ph distribut 2
+ph distribut memor 1
+ph doptim 2
+ph doptim du 1
+ph dunif 1
+ph each requir 1
+ph ec 1
+ph en 2
+ph enom 3
+ph enom en 3
+ph enotypiqu 1
+ph enotypiqu ou 1
+ph execut 1
+ph execut incorrect 1
+ph fin 1
+ph fin de 1
+ph follow 1
+ph for find 1
+ph gly 1
+ph gly tyr 1
+ph hash 1
+ph hybrid 1
+ph hybrid tr 1
+ph i hybrid 1
+ph implem 1
+ph in separ 1
+ph incorrect 1
+ph ind 1
+ph init 1
+ph init dunif 1
+ph is arbitr 1
+ph is ch 1
+ph is compl 1
+ph is execut 1
+ph is greater 1
+ph is increm 1
+ph is known 1
+ph is model 1
+ph is modif 1
+ph is repeat 1
+ph is shown 1
+ph is unchang 1
+ph lock 2
+ph look 1
+ph may dep 1
+ph may execut 1
+ph may viol 1
+ph multinom 1
+ph multinom tr 1
+ph number 1
+ph of augm 1
+ph of concur 1
+ph of execut 1
+ph of fm 1
+ph of learn 1
+ph of modl 1
+ph of order 1
+ph of proc 1
+ph of program 1
+ph of reason 1
+ph of recov 1
+ph of regr 1
+ph of test 1
+ph of understand 1
+ph of wgp 1
+ph or log 1
+ph pair 1
+ph princip 1
+ph proc 2
+ph producteur 1
+ph producteur consommateur 1
+ph propag 1
+ph provid proc 1
+ph regr 1
+ph regr test 1
+ph repl 1
+ph repl dat 1
+ph requir 3
+ph requir dat 1
+ph requir li 1
+ph rl 1
+ph satisf 1
+ph satisf saf 1
+ph simil 1
+ph spac 1
+ph succ 1
+ph synchron 1
+ph tak 2
+ph termin 1
+ph th graph 1
+ph th input 1
+ph th partit 1
+ph th quest 1
+ph th sl 1
+ph that cost 1
+ph that mak 1
+ph then becam 1
+ph then us 1
+ph therefor 1
+ph therefor perform 1
+ph to achief 1
+ph to count 1
+ph to cover 1
+ph to obtain 1
+ph to remember 1
+ph triangl 1
+ph unsucc 1
+ph using 1
+ph variabl 1
+ph wil compl 1
+ph wil requir 1
+ph.5 1
+ph.d 11
+ph.i 1
+ph.j 1
+ph87 1
+phag 1
+pharmaceutiqu 1
+phd 34
+phd disser 2
+phd scholarship 1
+phd th 31
+phenom 9
+phenom encounter 1
+phenom link 1
+phenom link group 1
+phenom of interest 1
+phenom requir 1
+phenomenon 10
+phenomenon by show 1
+phenomenon cal fal 1
+phenomenon ineff 1
+phenomenon is illustr 1
+phenomenon is know 1
+phij 1
+phil 1
+phil th 1
+philadelph 8
+philip 8
+philip balb 1
+philip charman 1
+philip dawid 1
+philip hollevil 1
+philip klein 2
+phillip 2
+phillip gibbon 1
+philosoph 5
+philosoph adopt 1
+philosoph adopt ee 1
+philosoph occam 1
+philosoph occam razor 1
+philosoph of synchron 1
+philosoph principl 1
+phip 1
+phk 1
+phk ik 1
+phm 1
+phon 14
+phon cal 1
+phon fac 1
+phon fac shash 1
+phonem 3
+phonem classif 1
+phonem classif neur 1
+phonem recognit 1
+phonem recognit using 1
+phonem se 1
+phonem string 1
+phonet 1
+phot 1
+phot east 1
+photogrammeter 1
+photogrammeter and triangl 1
+photograph 1
+photograph album 1
+photoprint 2
+phoutiou 1
+phr 9
+phr an error 1
+phr ar expr 1
+phr as maxim 1
+phr comb 1
+phr construc 1
+phr dep 1
+phr dep word 1
+phr differ 1
+phr found 1
+phr introduc 1
+phr mor clever 1
+phr produc 1
+phr produc rl 1
+phr proper 1
+phr proper regr 1
+phr segm 1
+phr structur 1
+phr structur grammar 1
+phr substructur 1
+phr wer construc 1
+phy 44
+phy acc 1
+phy acc structur 1
+phy addr 2
+phy addr al 1
+phy addr bit 1
+phy addr guar 1
+phy addr transl 1
+phy adjac 1
+phy adjac nod 1
+phy appear 1
+phy aspect 1
+phy block 1
+phy cach 1
+phy cach tag 1
+phy cl 1
+phy cluster 2
+phy connect 1
+phy constraint 2
+phy dam 1
+phy dat 1
+phy dat plac 1
+phy descript 1
+phy dev 3
+phy dim 3
+phy disk 1
+phy disk sect 1
+phy dist 1
+phy driv 1
+phy driv seat 1
+phy faith 1
+phy form 1
+phy graph 1
+phy implem 1
+phy interconnect 1
+phy interpr 1
+phy knowledg 1
+phy labor 1
+phy law 2
+phy link 1
+phy loc 1
+phy log 1
+phy log compact 1
+phy log en 1
+phy log rel 1
+phy mean 1
+phy med 1
+phy memor 3
+phy memor acc 1
+phy memor addr 1
+phy memor con 1
+phy memor loc 1
+phy network 1
+phy network model 1
+phy nod 1
+phy object 4
+phy optim 1
+phy optim method 1
+phy or soc 1
+phy pag 3
+phy pag number 2
+phy pag segm 1
+phy parallel 1
+phy parallel proc 1
+phy path 1
+phy pe 1
+phy pfn 1
+phy port 1
+phy problem 2
+phy proc 3
+phy proc assign 1
+phy procedur 1
+phy reason 1
+phy refer 1
+phy rel 1
+phy research 1
+phy review 1
+phy review letter 1
+phy scal 1
+phy segm 1
+phy separ 2
+phy separ chang 1
+phy separ me 1
+phy spac 1
+phy spac cel 1
+phy structur 1
+phy system 2
+phy task 1
+phy topolog 1
+physiolog 1
+physiolog behavior 1
+physiolog behavior using 1
+physiolog mechan 1
+physiolog structur 1
+physiqu 5
+physiqu correspon 1
+physiqu correspon nappart 1
+physiqu dan 1
+physiqu dan le 1
+physiqu de 2
+physiqu de la 1
+physiqu de lespac 1
+physiqu de sol 1
+physiqu distribu 1
+physiqu distribu ee 1
+physiqu du 1
+physiqu et en 1
+physiqu et sur 1
+physiqu ou 1
+physiqu ou logiqu 1
+physiqu sont 1
+pi 32
+pi a fin 1
+pi adj 1
+pi and le 1
+pi and pj 2
+pi ar encl 1
+pi ar pointer 1
+pi at tim 1
+pi avail 1
+pi ba 1
+pi becom 1
+pi becom fl 1
+pi by definit 1
+pi by show 1
+pi calculus 1
+pi con 1
+pi contain 1
+pi dan 1
+pi dan le 1
+pi decr 1
+pi doesnt incr 1
+pi ei 1
+pi ei nx 1
+pi et pj 1
+pi fail 1
+pi fi 1
+pi finish 1
+pi finish work 1
+pi from pic1 1
+pi hu 1
+pi is darkgreen 1
+pi is def 1
+pi is fil 1
+pi is greater 1
+pi is green 1
+pi is inc 1
+pi is indep 1
+pi is init 1
+pi is lim 1
+pi is repr 1
+pi li 1
+pi merg 1
+pi nar 1
+pi nar show 1
+pi pattern 1
+pi perform 1
+pi pj 2
+pi pj pk 1
+pi plus deux 1
+pi quun 1
+pi reduc 1
+pi rout 1
+pi rt 1
+pi rt gi 1
+pi sen 1
+pi sen me 1
+pi should rec 1
+pi to exceed 1
+pi to pj 1
+pi to proc 1
+pi unshuffl 1
+pi us 1
+pi us bin 1
+pi vj 1
+pi vj vj 1
+pi w pi 1
+pi width 1
+pi width lim 1
+pi wp 1
+pi wp wt 1
+pi1 2
+pi1 pi2 1
+pi1 pi2 pi3 1
+pi2 1
+pi2 pi3 1
+pi2v 1
+pi2v fkg 1
+pi2v fkg a0ic 1
+pi2v fkg a0ka 1
+pi2v fkg aic 1
+pi2v fkg ak0ic 1
+pi3 1
+pi92 1
+pib 1
+pib to ge 1
+pic 2
+pic de 1
+pic de la 1
+pic1 1
+picard 1
+pick 19
+pick a arbitr 1
+pick a fr 1
+pick a leaf 1
+pick a loc 1
+pick a nod 1
+pick a proc 1
+pick a receiver 1
+pick accord 1
+pick an unmatch 1
+pick it using 1
+pick on assignm 1
+pick r ln 1
+pick som inequ 1
+pick th edg 1
+pick th glob 1
+pick th med 1
+pick th method 1
+pick th optim 1
+pick th switch 1
+pick to help 1
+pict 5
+pict dat 1
+pict datab 1
+pict datab using 1
+pict exampl 1
+pict in figur 1
+pictur 19
+pictur and graph 1
+pictur and icon 1
+pictur and text 1
+pictur compon 1
+pictur datab 1
+pictur in figur 2
+pictur is surround 1
+pictur of rec 1
+pictur would addit 1
+pid 3
+pid 1mod2 1
+pid ar pointer 1
+piec 20
+piec a1 1
+piec each bear 1
+piec lin 2
+piec lin datalog 1
+piec lin funct 1
+piec lin program 1
+piec of adv 1
+piec of cod 4
+piec of knowledg 3
+piec of paper 1
+piec of pi 1
+piec of softwar 3
+piec of text 1
+piec result 1
+piec wi 1
+piec wi continu 1
+piecem 2
+piecem fash 1
+piecem from inst 1
+pier 6
+pier ban 2
+pier ban atr 2
+pier et mar 1
+pier lou 1
+pier lou cur 1
+pier men 1
+pier men franc 1
+pier parqu 1
+pierc 3
+pierc a fac 1
+pierc and david 1
+pierc and turner 1
+piergiorg 1
+piergiorg odifr 1
+pift 2
+pift program 2
+pig 1
+piggyback 2
+piggyback inform 1
+pigj 1
+pij 3
+pij denot 1
+pij specif 1
+pij valu 1
+pijd 1
+pijd n ij 1
+pijd prob 1
+pik 1
+pil 1
+pil a la 1
+pil a mac 1
+pil a partir 1
+pil apr 1
+pil apr es 1
+pil au 1
+pil au moment 1
+pil au retour 1
+pil cap 1
+pil cap de 1
+pil com 1
+pil com triv 1
+pil cr 1
+pil cr dan 1
+pil d elim 1
+pil de 1
+pil de contr 1
+pil de la 1
+pil de pair 1
+pil de point 1
+pil de recherch 1
+pil de var 1
+pil denviron 1
+pil denviron doit 1
+pil denviron maxim 1
+pil doubl 1
+pil doubl condit 1
+pil doubl consom 1
+pil doubl le 1
+pil doubl naccr 1
+pil doubl ne 1
+pil doubl perm 1
+pil doubl peuv 1
+pil du 1
+pil du syst 1
+pil en 1
+pil en prem 1
+pil est 1
+pil est calcl 1
+pil est don 1
+pil est incr 1
+pil est mac 1
+pil est simplif 1
+pil est sup 1
+pil et charg 1
+pil et la 1
+pil et le 1
+pil et point 1
+pil eventuel 1
+pil eventuel compact 1
+pil explicit 1
+pil explicit instruc 1
+pil glob 1
+pil glob com 1
+pil glob conduit 1
+pil glob contr 1
+pil glob cr 1
+pil glob est 1
+pil glob etant 1
+pil glob gard 1
+pil glob gb 1
+pil glob glob 1
+pil glob mi 1
+pil glob qu 1
+pil glob sont 1
+pil glob tb 1
+pil glob ver 1
+pil glob7 1
+pil loc 1
+pil loc dan 1
+pil loc est 1
+pil loc explicit 1
+pil loc fut 1
+pil loc lor 1
+pil loc ne 1
+pil loc prolog 1
+pil loc requ 1
+pil loc sont 1
+pil logiqu 1
+pil m em 1
+pil mach 1
+pil mach com 1
+pil mach cr 1
+pil nest 1
+pil nest pa 1
+pil pen 1
+pil pen la 1
+pil perm 1
+pil perm toujour 1
+pil physiqu 1
+pil pour 1
+pil pour le 1
+pil qu 1
+pil qu est 1
+pil qu la 1
+pil refl 1
+pil refl es 1
+pil s epar 1
+pil som 1
+pil som de 1
+pil un 1
+pil un zon 1
+pil uniqu 1
+pil uniqu avec 1
+pil uniqu lor 1
+pil uniqu ou 1
+pil uniqu pourrait 1
+pil ver 1
+pil ver le 1
+pilat 1
+pilot 4
+pilot dat 1
+pilot dat entr 1
+pilot ha compl 1
+pilot is requir 1
+pilot mach 1
+pilot sur 1
+pilot sur la 1
+pilot system 1
+pilot to sign 1
+pilot usair 1
+pilot87 1
+pim 1
+pim ind 1
+pim ind diab 1
+pin 6
+pin count 2
+pin point 1
+pin unpin 1
+pin unpin pag 1
+pincount 2
+pincount with board 2
+ping 5
+ping et al 1
+ping pong 2
+ping pong dev 1
+ping pong en 1
+ping pong entr 1
+ping pong est 1
+ping pong le 1
+ping pong lorsquau 1
+ping pong ne 1
+ping pong pen 1
+ping pong peut 1
+ping pong phenomenon 1
+ping pong po 1
+ping pong pour 1
+ping pong qu 1
+ping pong si 1
+ping pong tr 1
+ping th router 1
+pingpong 1
+pingpong pour 1
+pingpong pour diff 1
+pink 2
+pink ind 1
+pinker 1
+pinot 1
+pinout 3
+pinout and wider 1
+pinout appl 2
+pinout ar becom 2
+pinout den 2
+pinout is lim 2
+pinout it lead 2
+pinout technolog 2
+pinout with p1 2
+pinout with p2 2
+pinout withp1 2
+pint 1
+pint and bil 1
+pinter 1
+pinter an algorithm 1
+pioneer 3
+pioneer a techniqu 1
+pioneer work 2
+pip 5
+pip after recogn 1
+pip for learn 1
+pip is obtain 1
+pip is prefer 1
+pip lin 1
+pip schem 1
+pip sem 1
+pip with proc 1
+pipel 8
+pipel behavior 1
+pipel behavior chang 1
+pipel break 1
+pipel describ 1
+pipel fash 1
+pipel micr 1
+pipel micr instruc 1
+pipel of preproc 1
+pipel oper 1
+pipel oper using 1
+pipel th commun 1
+pipel th macr 1
+pipel th transfer 1
+pipelin 11
+pipelin b tr 1
+pipelin broadcast 1
+pipelin chain 1
+pipelin chain wh 1
+pipelin comput 1
+pipelin comput execut 1
+pipelin dat 1
+pipelin dat parallel 1
+pipelin distribut 1
+pipelin ee 1
+pipelin effect 1
+pipelin es 1
+pipelin es par 1
+pipelin hypercub 2
+pipelin memor 1
+pipelin memor acc 1
+pipelin on coar 1
+pipelin prolog 1
+pipelin prolog proc 1
+pipelin ram 1
+pipelin ram enforc 1
+pipelin ram model 1
+pipelin tr 1
+pipelin tr reduc 1
+pipelin transform 1
+pipeliner 1
+pipeliner un 1
+pir 3
+pir ca 2
+pir comport 1
+pir comport est 1
+pir de 2
+pir de ca 2
+pir san eff 1
+pirahesh 4
+pirot 1
+pissanetsk 1
+pit 2
+pit pfxt 1
+pit qu 1
+pit qu lag 1
+pit warmuth 1
+pitf 5
+pitf and fal 1
+pitf of tetrahedr 1
+pitf when unfold 1
+pith 1
+pith record 1
+pitman 5
+pittman 1
+pittman ltd 1
+pittsburgh 3
+pittsburgh supercomput 1
+pittsburgh supercomput center 1
+pivot 4
+pivot for partit 1
+pivot is ba 1
+pivot li 1
+pivot method 1
+pivot ph 1
+pivot row 1
+piwowarsk 1
+piwpiwt 1
+pixel 7
+pixel and bandwidth 1
+pixel and curv 1
+pixel appl 1
+pixel ar se 1
+pixel den 1
+pixel inform 1
+pixel level 1
+pixel light 1
+pixel parallel 1
+pixel parallel hid 1
+pixel plan 1
+pixel plan system 1
+pixel rel 1
+pixel repr 1
+pixel siz 1
+pixel siz 16x24 1
+pixel sub 1
+pixel sub block 1
+pixel valu 1
+pixel x deriv 1
+piyawad 2
+piyawad no 1
+piyawad sukavir 1
+pj 11
+pj ar connect 1
+pj at tim 1
+pj color 1
+pj com 1
+pj do l1 1
+pj et pk 1
+pj fpour 1
+pj fpour qi 1
+pj in step 1
+pj is inc 1
+pj is select 1
+pj lead 1
+pj loop 1
+pj pi 1
+pj pk 1
+pj queu 1
+pj sen 1
+pj when nr 1
+pj87 1
+pjg 1
+pjg prob 1
+pjj 1
+pjkd 1
+pjkd for wjk 1
+pjkd njk 1
+pjkd njk self 1
+pk 13
+pk ce 1
+pk ce qu 1
+pk ci.ufl.edu 1
+pk ci.ufl.edu ted 1
+pk coeff 1
+pk coeff de 1
+pk ne 1
+pk ne perm 1
+pk termin 1
+pklogn 1
+pkt 1
+pkt th invoker 1
+pl 48
+pl a centr 1
+pl a cruc 1
+pl a key 2
+pl a pag 1
+pl a rol 1
+pl an asymmeter 1
+pl an es 2
+pl an integr 1
+pl back cap 1
+pl back capabil 1
+pl cal predefin 1
+pl direct 1
+pl direct correspon 1
+pl down menu 1
+pl down submenus 1
+pl ee 1
+pl ee dan 1
+pl environm 1
+pl for 1
+pl form 1
+pl form de 1
+pl in determin 1
+pl in order 1
+pl is assum 1
+pl loc 1
+pl loc system 1
+pl no further 1
+pl no rol 1
+pl not 2
+pl on hemingw 1
+pl opt 1
+pl per revolut 1
+pl pour 1
+pl pour lintroduc 1
+pl rat 1
+pl rep 1
+pl rep ye 1
+pl se 1
+pl th rol 1
+pl to acknowledg 2
+pl tridimensionnel 1
+pl tridimensionnel de 1
+pl valu 1
+pl0 1
+pl0 syntac 1
+pl1 1
+pl2 1
+pl81 1
+pl89 1
+plac 72
+plac a cap 1
+plac a filter 1
+plac a finit 1
+plac a la 1
+plac a restrict 1
+plac afin 1
+plac afin de 1
+plac after weaker 1
+plac algorithm 1
+plac an object 1
+plac and coh 1
+plac and displac 1
+plac and load 1
+plac and quant 1
+plac and re 1
+plac and rout 1
+plac and sizing 1
+plac and writ 1
+plac anywh 1
+plac as describ 1
+plac chord 1
+plac chord symbol 1
+plac cycliqu 1
+plac cycliqu qu 1
+plac dan 1
+plac dan le 1
+plac dan un 1
+plac dat 1
+plac de 2
+plac de attribut 1
+plac de ce 1
+plac de don 1
+plac de instruc 1
+plac de la 1
+plac de lenviron 1
+plac de loptim 1
+plac de pag 1
+plac de tout 1
+plac dispon 1
+plac dispon dan 1
+plac dispon en 1
+plac dun 1
+plac dun gest 1
+plac dun laboratoir 1
+plac dur cod 1
+plac e dan 1
+plac ee 2
+plac ee au 1
+plac ee dan 1
+plac ee en 1
+plac ee just 1
+plac ee linform 1
+plac en 1
+plac espac 1
+plac espac dadr 1
+plac est 2
+plac est identiqu 1
+plac est suff 1
+plac et transit 1
+plac gr 1
+plac gr ac 1
+plac holder 2
+plac holder result 1
+plac in context 1
+plac in dynam 1
+plac in p1 1
+plac in posit 1
+plac in subexpr 1
+plac incompat 1
+plac incompat constraint 1
+plac indep 1
+plac init 1
+plac init de 1
+plac int correspon 1
+plac is dynam 1
+plac le 1
+plac le emph 1
+plac lib 1
+plac lib er 1
+plac lim 1
+plac m emoir 2
+plac must continu 1
+plac n cluster 1
+plac n ecessair 1
+plac ni 1
+plac ni cart 1
+plac no restrict 1
+plac o1 1
+plac o3 1
+plac object 1
+plac object link 1
+plac object post 1
+plac object seem 1
+plac of accent 1
+plac of cod 1
+plac of dat 1
+plac of el 1
+plac of inter 1
+plac of log 1
+plac of mod 1
+plac of o1o2o3o4o1o2o 1
+plac of o2 1
+plac of o3 1
+plac of object 1
+plac of osecon 1
+plac of pattern 1
+plac of rectangl 1
+plac of switch 1
+plac oi 1
+plac on f1 1
+plac on text 1
+plac on top 1
+plac optim 1
+plac or exit 1
+plac ou 1
+plac ou encor 1
+plac par 1
+plac par la 1
+plac pi 1
+plac pi dan 1
+plac plac 1
+plac plac espac 1
+plac plac plac 1
+plac plusieur 1
+plac plusieur fo 1
+plac plut 1
+plac plut ot 1
+plac po loc 1
+plac pr 1
+plac pr ed 1
+plac problem 1
+plac procedur 1
+plac procedur assign 1
+plac random 1
+plac remain 1
+plac rout 1
+plac rout problem 1
+plac san interv 1
+plac se 1
+plac se number 1
+plac smaller 2
+plac somewh 1
+plac strong 1
+plac strong restrict 1
+plac subtr 1
+plac successeur 1
+plac successeur de 1
+plac tak 1
+plac tak account 1
+plac test 1
+plac th 2k 1
+plac th biggest 1
+plac th com 1
+plac th container 1
+plac th object 1
+plac th work 1
+plac that induc 1
+plac them compl 1
+plac them correspon 1
+plac through cal 1
+plac to evalu 1
+plac to inser 1
+plac to me 1
+plac transit 1
+plac tw interchang 1
+plac tw subdirect 1
+plac un niveau 1
+plac un sch 1
+plac upd 2
+plac upd facil 1
+plac wh 5
+plac wh random 1
+plac when libr 1
+plac when unif 1
+plac without affect 1
+placeholder 3
+placeholder dont car 1
+placer 2
+placer dan 1
+placer le 2
+placer le point 1
+placer le scalair 1
+plafon 1
+plafon et planch 1
+plafon ou 1
+plafon ou planch 1
+plafon se 1
+plafon se trait 1
+plagu 1
+plagu graph 1
+plagu graph designer 1
+plain 6
+plain appl 1
+plain gener 1
+plain kanerv 1
+plain kanerv sdm 1
+plain neur 1
+plain neur network 1
+plain se 1
+plain server 1
+plain text 1
+plain transfer 1
+plaisir 1
+plaisir daccepter 1
+plaisir daccepter de 1
+plan 42
+plan algorithm 1
+plan and boolean 1
+plan and freud 1
+plan and requir 1
+plan and situ 1
+plan angl 1
+plan ar 1
+plan ar parallel 1
+plan ba 1
+plan ba model 1
+plan coh 1
+plan coh st 1
+plan con 1
+plan dat 1
+plan dat instead 1
+plan de 1
+plan de la 1
+plan definit 1
+plan depict 1
+plan div 1
+plan divid 1
+plan exp 1
+plan figur 1
+plan figur con 1
+plan for erg 1
+plan form 1
+plan imag 1
+plan imag plan 1
+plan in convec 1
+plan in mk 1
+plan instead 1
+plan intersect 1
+plan is divid 1
+plan is refer 1
+plan langu 1
+plan lead 1
+plan link 1
+plan link assoc 1
+plan link form 1
+plan mechan 1
+plan mult 1
+plan mult method 1
+plan norm 1
+plan norm vect 1
+plan not 1
+plan of fac 1
+plan p1 1
+plan parallel 1
+plan problem 1
+plan problem inclus 1
+plan problem wh 1
+plan qualitatif 1
+plan qualitatif pour 1
+plan quantitatif 1
+plan separ 1
+plan system 1
+plan to adapt 1
+plan to consider 1
+plan to develop 1
+plan to ext 1
+plan to find 1
+plan to impl 1
+plan to introduc 1
+plan to stud 1
+plan to us 3
+plan with abstract 1
+plan with fic 1
+plan with high 1
+planair 1
+planair dun 1
+planair dun matr 1
+planar 6
+planar contour 2
+planar contour extract 1
+planar cr 2
+planar cr sect 2
+planar graph 3
+planar moat 1
+planar moat rout 1
+planar reg 1
+planar triangl 1
+planar triangl problem 1
+planch 1
+planch cont 1
+planch cont la 1
+planch dexpr 1
+planch dexpr de 1
+planch imbriqu 1
+planch imbriqu ee 1
+planch ou 1
+planch ou plafon 1
+planck 2
+planck institut 1
+planioc 1
+planioc dun 1
+planioc dun op 1
+plank 1
+planner 1
+planner csp 1
+planner csp tool 1
+planner prototyp 1
+planner prototyp ea 1
+planner system 1
+planner system wright 1
+planner using 1
+planner using heur 1
+plant 3
+plant and anim 1
+plant or anim 1
+plast 1
+plast modl 1
+plat 1
+plat not 1
+platform 18
+platform con 1
+platform for develop 2
+platform for eff 1
+platform indep 2
+platform indep internet 1
+platform indep softwar 1
+platform indep standard 1
+platform is microsoft 1
+platform subject 1
+platform to maxim 1
+platform val 1
+platform wa motiv 1
+platform wa unavail 1
+plaus 10
+plaus account 1
+plaus et nexclut 1
+plaus explan 1
+plaus justif 1
+plaus look 1
+plaus look specif 1
+plaus reason 1
+plaus to us 1
+plaxt 2
+playback 1
+playback mechan 1
+player 2
+player execut 1
+player program 1
+player to chang 1
+playford 1
+plc92 1
+pld92 1
+pleasur 2
+pleasur to acknowledg 1
+pleasur to thank 1
+plein 2
+plein no 1
+plein no algorithm 1
+plen 5
+plen pr 3
+plen publ 1
+plent 1
+plethor 1
+plethor of algorithm 1
+plevel 1
+plg 1
+plg inc 1
+plif 1
+plilp 1
+plilp91 1
+plimpt 1
+plin 1
+plin nplin 1
+plin nplin result 1
+plm 1
+plm de 1
+plm de war 1
+plm est 1
+plm in order 1
+plm ne 1
+plm ne comport 1
+plm tir 1
+plm tir part 1
+plogn 1
+plogn log 1
+plogn log log 1
+plot 13
+plot an 1
+plot an result 1
+plot appear 1
+plot ar shown 1
+plot by lik 1
+plot depict 1
+plot for rm 1
+plot in figur 1
+plot lat 1
+plot of b.taurus 1
+plot of figur 1
+plot output 1
+plot output bandwidth 1
+plot perform 1
+plot perform measur 1
+plot th rat 1
+plot th respon 1
+plot wer deriv 1
+plot with neglig 1
+plotkin 3
+plotter 1
+plovdiv 1
+pltim 1
+pluc 1
+plug 7
+plug and pl 1
+plug compat 1
+plug numer 1
+plug numer modl 1
+plupart 3
+plupart de 3
+plupart de acc 1
+plupart de ca 1
+plupart de ce 3
+plupart de conflit 1
+plupart de inconv 1
+plupart de mi 1
+plupart de mod 1
+plupart de mvp 1
+plupart de syst 1
+plupart de techniqu 1
+plupart de travaux 1
+plupart du 2
+plupart du temp 2
+plur 2
+plur and quant 1
+plur counter 1
+plur counter tempor 1
+plur expr 1
+plur if stat 1
+plur int 1
+plur int ii 1
+plur int lc 1
+plur int loc 1
+plur int temp 1
+plur lc 1
+plur lc dist 1
+plur or group 1
+plur short act 1
+plur short ancestr 1
+plur short deg 1
+plur short degr 1
+plur short dist 1
+plur short flag 1
+plur short ii 1
+plur short nontr 1
+plur short pr 1
+plur short tr 1
+plur short unexplor 1
+plur short vt 1
+plur var 1
+plur var incl 1
+plur variabl 1
+plur variabl plur 1
+pluriel 1
+plusieur 5
+plusieur acc 1
+plusieur acc es 1
+plusieur algorithm 1
+plusieur algorithm qu 1
+plusieur auteur 1
+plusieur auteur se 1
+plusieur branch 1
+plusieur branch ex 1
+plusieur cl 1
+plusieur cl parm 1
+plusieur claus 1
+plusieur claus candid 1
+plusieur conflit 1
+plusieur conflit sont 1
+plusieur context 1
+plusieur cop 1
+plusieur cop de 1
+plusieur difficult 1
+plusieur difficult es 1
+plusieur direct 2
+plusieur direct de 1
+plusieur direct seront 1
+plusieur ecritur 1
+plusieur ecritur avant 1
+plusieur extr 1
+plusieur extr em 1
+plusieur flot 1
+plusieur flot de 1
+plusieur fluc 2
+plusieur fluc de 2
+plusieur fluc dinstruc 1
+plusieur fo 3
+plusieur fo au 1
+plusieur fo de 1
+plusieur fo le 1
+plusieur group 1
+plusieur group distinct 1
+plusieur individus 1
+plusieur m ethod 1
+plusieur modalit 1
+plusieur modalit es 1
+plusieur nid 1
+plusieur nid de 1
+plusieur op 1
+plusieur op erat 1
+plusieur pav 1
+plusieur pav en 1
+plusieur pil 1
+plusieur pil physiqu 1
+plusieur point 2
+plusieur point cl 1
+plusieur point de 1
+plusieur pr. 1
+plusieur processeur 2
+plusieur processeur acc 1
+plusieur processeur au 1
+plusieur processeur contr 1
+plusieur processeur dan 1
+plusieur processeur sur 1
+plusieur r ef 1
+plusieur raison 1
+plusieur requ 1
+plusieur requ es 1
+plusieur s equ 1
+plusieur strat 1
+plusieur strat eg 1
+plusieur structur 1
+plusieur structur rig 1
+plusieur syst 1
+plusieur syst em 1
+plusieur tableaux 1
+plusieur tableaux diff 1
+plusieur typ 1
+plusieur typ de 1
+plusieur unit 1
+plusieur unit es 1
+plusieur variabl 1
+plusieur ver 1
+plusieur ver par 1
+plut 4
+plut ot 3
+plut ot aux 1
+plut ot dan 1
+plut ot de 1
+plut ot dordr 1
+plut ot in 1
+plut ot inter 1
+plut ot passer 1
+plut ot pour 1
+plut ot qu 2
+plut ot quau 1
+plut ot quaux 1
+plut ot quun 2
+plut ot un 1
+plut t df 1
+pm 15
+pm 1g 1
+pm b ln2 1
+pm de 1
+pm de fonct 1
+pm fonct 1
+pm fonct ent 1
+pm gpb 1
+pm ha bad 1
+pm le 1
+pm of gm 1
+pm pm 1
+pm sa 1
+pm se 1
+pm se traduit 1
+pm string 1
+pm4b 1
+pmbp 1
+pmbp ln 1
+pmj 1
+pmk 1
+pmn 1
+pmn logn 1
+pmn logn logn 1
+pn 24
+pn 1i 1
+pn assign 1
+pn bu1 1
+pn bu1 npn 1
+pn budg 1
+pn budgetv 1
+pn cnpn 1
+pn from assign 1
+pn from proj 1
+pn from projttl 1
+pn ha polynom 1
+pn is unsatisf 1
+pn lg 1
+pn manager 1
+pn managerv 1
+pn mesh 1
+pn pn 2
+pn pn mesh 1
+pn proc 2
+pn proc nod 2
+pn proj 1
+pn q cn 1
+pn qn 1
+pn qn qn 1
+pn try 1
+pn typ 1
+pn typev 1
+pn u0 1
+pn0 3
+pn0 edg 1
+pn0 edg connect 1
+pn0 pn1 2
+pn0 pn1 pnc 2
+pn1 2
+pn1 pnc 2
+pnam 1
+pnam p7 1
+pnam proj 1
+pnam proj p1 1
+pnc 2
+pnew 1
+pnew pcur 1
+png 1
+pnj 2
+pnk 1
+pnlogm 1
+pnlogn 1
+pnntail 1
+pnp 1
+pnpm 2
+pnpt 1
+pnuel 2
+po 77
+po 3oe 1
+po a composit 1
+po a form 1
+po a list 1
+po a number 1
+po a se 1
+po a slav 1
+po act 1
+po act po 1
+po al lin 1
+po and anc 1
+po and consider 1
+po and cont 1
+po antimatr 1
+po as defin 1
+po be chang 1
+po better approach 1
+po bj 1
+po bj gener 1
+po both discr 1
+po by hubick 1
+po by transposit 1
+po caus 1
+po caus util 1
+po cluster 1
+po com 1
+po complec 1
+po complec serv 1
+po con 1
+po concur 1
+po concur execut 1
+po contain 2
+po contain longer 1
+po de 3
+po de fa 1
+po de probl 1
+po de un 1
+po dep 1
+po differ mean 1
+po differ vect 1
+po e1 1
+po e2 1
+po ec 1
+po ed 2
+po ed ce 1
+po ed certain 1
+po ed de 1
+po ed donc 1
+po ed egal 1
+po ed la 1
+po ed lav 1
+po ed le 1
+po ed pa 1
+po ed plusieur 1
+po ed sa 1
+po ed suffisam 1
+po ed toujour 1
+po ed un 1
+po edant 1
+po edant ce 1
+po edant le 1
+po edant un 1
+po edent 3
+po edent de 1
+po edent en 1
+po edent lav 1
+po edent le 1
+po edent pa 1
+po eder 1
+po eder le 1
+po ee 1
+po empt 2
+po empt domain 1
+po empt sequ 1
+po en 1
+po es 1
+po es par 1
+po estim 1
+po exp 1
+po fal 1
+po for stat 1
+po for uphil 1
+po hav compl 1
+po high 1
+po high order 1
+po ident 1
+po implicit 1
+po in evcont 1
+po inclus 1
+po inclus reduc 1
+po infinit 3
+po infinit se 1
+po intersect 1
+po invok 1
+po is init 1
+po is underscor 1
+po knowledg 2
+po knowledg goal 1
+po le 2
+po le probl 2
+po li 1
+po man user 1
+po may li 1
+po misbehav 1
+po non 2
+po non inject 1
+po non norm 1
+po nonconflu 1
+po nonconflu part 1
+po of abstract 2
+po of block 1
+po of combin 1
+po of comput 1
+po of concur 1
+po of conver 1
+po of del 1
+po of deriv 2
+po of failur 1
+po of gener 1
+po of intent 1
+po of match 1
+po of nod 1
+po of nonterm 1
+po of parallel 1
+po of perform 1
+po of st 1
+po of using 1
+po on pair 1
+po op 1
+po other not 1
+po other proc 1
+po overlap 1
+po pa 1
+po pa de 1
+po par 1
+po par contr 1
+po plus alor 1
+po plusieur 1
+po plusieur difficult 1
+po probl 1
+po quer 1
+po quest 1
+po quest interest 1
+po reduc 1
+po rel 1
+po relev 1
+po replac 1
+po rudim 1
+po rudim syntact 1
+po s par 1
+po scal 1
+po self 1
+po self assessm 1
+po sever desir 1
+po sever problem 1
+po skim 1
+po slight 1
+po th dat 1
+po th net 1
+po th respon 1
+po th setcar 1
+po then exp 1
+po then mod 1
+po thread 1
+po tin 1
+po to displ 1
+po to follow 1
+po to overcom 1
+po to po 1
+po unsucc 1
+po valu 1
+po wait 1
+po wer giv 1
+po which con 1
+po wider 1
+po wider channel 1
+po with abstract 1
+po with loc 1
+po with prim 1
+po with repetit 1
+po zer 1
+po. 1
+po.1 1
+po3 1
+po4 1
+po5 1
+poc 1
+poc requir 1
+poch 1
+poch du 1
+pock 2
+pock calcl 1
+pod 5
+pod vod 1
+pod vod arenskou 1
+pod83 1
+pod88 1
+pod89 1
+podc 1
+podelsk 2
+poel 1
+poetr 2
+poetr may repr 1
+poid 1
+poid de 1
+poid de ce 1
+poid relatif 1
+poid relatif de 1
+poid respectif 1
+poid respectif de 1
+poincar 1
+point 96
+point 3d 1
+point a la 1
+point a prendr 1
+point a writer 1
+point abov lim 1
+point acc 2
+point acc ed 1
+point acc method 1
+point accord 1
+point al satisf 1
+point algorithm 1
+point alor 1
+point alor sur 1
+point an angl 1
+point and converg 1
+point and detect 1
+point and di 1
+point and environm 1
+point and fram 1
+point and lin 2
+point and nearest 1
+point and procedur 1
+point and rectangl 1
+point and thereb 1
+point another fact 1
+point ao 1
+point appart 1
+point appart effectiv 1
+point appl 1
+point appl rl 1
+point apr 1
+point apr es 1
+point ar approxim 1
+point ar candid 1
+point ar consider 1
+point ar detect 1
+point ar foreign 1
+point ar good 1
+point ar identif 2
+point ar loc 1
+point ar mi 1
+point ar point 1
+point ar random 1
+point ar view 1
+point ar weight 1
+point arithm 2
+point as input 1
+point assum 1
+point at tim 1
+point aurait 1
+point ba 2
+point ba requir 1
+point befor border 1
+point between rn 1
+point but entir 1
+point by ad 1
+point by calcl 1
+point cand 1
+point ce 1
+point ce ch 1
+point ch 2
+point ch com 1
+point ch instruc 1
+point ch ne 1
+point ch profon 1
+point ci 1
+point ci dessus 1
+point cl 1
+point closer 1
+point color 1
+point com 1
+point commun 3
+point commun avec 1
+point commun primitiv 1
+point concern optim 1
+point constitu 1
+point constitu le 1
+point correspon 4
+point cou 1
+point cou de 1
+point could caus 1
+point cr 1
+point creat 1
+point creat prov 1
+point crossover 1
+point d ecrit 1
+point dabsc 1
+point dabsc impair 1
+point dabsc pair 1
+point dan 1
+point dan lombr 1
+point dat 1
+point de 4
+point de ch 1
+point de continu 1
+point de coupur 1
+point de la 1
+point de lespac 1
+point de notr 1
+point de perspectiv 1
+point de program 1
+point de qn 1
+point de quitter 1
+point de retour 1
+point de vu 3
+point defin 1
+point dengag 1
+point dengag de 1
+point denot 1
+point dentr 1
+point dentr ee 1
+point dep 1
+point dinfluencer 1
+point dioecil 1
+point dioecil con 1
+point du 3
+point du group 1
+point du program 1
+point dun 2
+point dun compilateur 1
+point dun program 1
+point dun var 1
+point dur par 1
+point dynam 1
+point e par 1
+point ec 1
+point ee 1
+point ee par 1
+point el 1
+point el perm 1
+point ent 1
+point ent contenus 1
+point ent dan 1
+point ent de 1
+point ent du 1
+point ent dun 1
+point ent ne 1
+point ent peut 1
+point ent quil 1
+point ent solut 1
+point equ 1
+point est 3
+point est en 1
+point est fr 1
+point est illustr 1
+point est indisp 1
+point est le 1
+point et il 1
+point et le 1
+point et soum 1
+point exit 1
+point ext 2
+point extr 1
+point extr maux 1
+point fa 1
+point fa de 1
+point featur 1
+point fin 1
+point flag 1
+point for further 1
+point for sub 1
+point fram 1
+point funct 1
+point fut 1
+point hx1 1
+point ibin 1
+point iff 1
+point implicit 1
+point import 1
+point import puisqu 1
+point import suiv 1
+point in bold 1
+point in car 1
+point in cel 1
+point in common 2
+point in figur 1
+point in find 1
+point in keep 1
+point in learn 1
+point in oe1 1
+point in oe2 1
+point in rm 1
+point in tabl 1
+point in tim 3
+point in try 1
+point in visit 1
+point in vol 1
+point inclus 1
+point inclus cn 1
+point incr 1
+point init 1
+point init arbitrair 1
+point init x0 1
+point instead 1
+point interm 2
+point interm ediair 2
+point intern 1
+point is 4n 1
+point is ba 1
+point is creat 1
+point is cruc 1
+point is del 1
+point is detect 1
+point is divid 1
+point is identif 1
+point is induc 1
+point is mi 1
+point is remov 1
+point is repr 1
+point is split 1
+point is suff 1
+point is transform 1
+point is turn 1
+point isol 1
+point it measur 1
+point la 1
+point la front 1
+point lay 1
+point lin 1
+point lin program 1
+point link 3
+point loc 3
+point lying 1
+point ma 1
+point mad 1
+point mad prev 1
+point mak 1
+point manuel 1
+point mark 1
+point match 1
+point matr 1
+point maxim 1
+point maxim aver 1
+point me 1
+point me pa 1
+point method 2
+point method f2 1
+point minim 1
+point minim ver 1
+point mov 1
+point mut 1
+point mut mut 1
+point nam 1
+point ne 1
+point ne sont 1
+point nearb 1
+point network 1
+point network del 1
+point network.6 1
+point non 1
+point non fault 1
+point norm 1
+point norm vect 1
+point number 5
+point number consider 1
+point number using 1
+point of bind 1
+point of discontinu 1
+point of doubt 1
+point of foc 1
+point of o1 1
+point of o2 1
+point of refer 1
+point of rmk 1
+point of tp 1
+point of view 16
+point onl prov 1
+point ont memor 1
+point oper 2
+point or conflict 1
+point or empt 1
+point or fram 1
+point or interv 1
+point orient 1
+point ou 1
+point ou le 1
+point par 1
+point particl 1
+point per cluster 1
+point per row 1
+point peuv 1
+point peuv toutef 1
+point pl 1
+point pl pour 1
+point point 1
+point point tim 1
+point pour 1
+point pour pouvoir 1
+point pr 2
+point pr ec 2
+point predict 1
+point problem 1
+point projectif 1
+point projectif soum 1
+point qu 5
+point qu est 1
+point qu je 1
+point qu nous 1
+point quer 2
+point quer select 1
+point refer 1
+point register 1
+point remain 1
+point rest 1
+point rest ouver 1
+point rig 1
+point satisf 1
+point se 4
+point se using 1
+point ser 1
+point ser etud 1
+point shar 1
+point shar serv 1
+point shown 1
+point similitud 1
+point sit 1
+point sl1 1
+point sl1 modl 1
+point soit 1
+point sont 1
+point sont de 1
+point sous 1
+point sous optimaux 1
+point spec 1
+point spec clientcl.tp 1
+point st 1
+point st valu 1
+point stack 1
+point subtyp 1
+point subtyp rl 1
+point sur 1
+point sur ce 1
+point sur de 1
+point sur la 1
+point sur le 1
+point sur lenviron 1
+point sur un 1
+point t1 1
+point tel 1
+point tel qu 1
+point th algorithm 1
+point th author 1
+point th control 1
+point th parameter 1
+point th siml 1
+point th standard 1
+point that ea 1
+point that evalu 1
+point that li 1
+point that object 1
+point that satisf 1
+point that verb 1
+point til 1
+point til pelv 1
+point tim 1
+point tim point 1
+point to ap 1
+point to appropr 1
+point to cel 1
+point to cluster 1
+point to comput 1
+point to detect 1
+point to direct 1
+point to lik 1
+point to not 1
+point to point 8
+point to pot 1
+point to program 1
+point to register 1
+point to st 1
+point to textil 1
+point topoint 2
+point topoint commun 1
+point topoint connect 1
+point transport 1
+point transport header 1
+point transport layer 1
+point trim 1
+point undefin 1
+point uniqu 1
+point unit 1
+point using 1
+point using cl 1
+point util 1
+point val 1
+point val de 1
+point valu 3
+point valu uniform 1
+point ver 1
+point ver le 1
+point voisin 1
+point voisin sur 1
+point vont 1
+point vont dan 1
+point vs 1
+point wa mad 1
+point we requir 1
+point we wish 1
+point wel loc 1
+point wer overlook 1
+point wh 7
+point wh coordin 1
+point wh dk 1
+point which incr 1
+point which li 1
+point wi 1
+point wi ext 1
+point with equ 1
+point with proper 1
+point x0 2
+point xi 1
+point y resid 1
+pointand 1
+pointand click 1
+pointer 22
+pointer adjust 1
+pointer adjust appropr 1
+pointer and argum 1
+pointer and nod 1
+pointer and part 1
+pointer and perform 1
+pointer ar assum 1
+pointer ar repr 1
+pointer ar upd 2
+pointer assoc 1
+pointer ba 1
+pointer ba hyperoctr 1
+pointer ba quadtr 1
+pointer ba repr 1
+pointer ba tr 1
+pointer becom 1
+pointer becom inv 1
+pointer being mad 1
+pointer between nod 1
+pointer cach 1
+pointer cach contain 1
+pointer comparison 1
+pointer ec 1
+pointer field 1
+pointer field requir 1
+pointer in clr 1
+pointer in intern 1
+pointer in nod 1
+pointer is inser 1
+pointer is se 1
+pointer is skip 1
+pointer is upd 1
+pointer last disk 1
+pointer le 2
+pointer le champ 1
+pointer le lost 1
+pointer le pointeur 1
+pointer le register 1
+pointer link 1
+pointer loc 1
+pointer mak 1
+pointer mak del 1
+pointer number 1
+pointer of block 1
+pointer on record 1
+pointer or hyperlink 1
+pointer or lin 1
+pointer point 1
+pointer posit 1
+pointer prov 1
+pointer refer 1
+pointer rel 1
+pointer se 1
+pointer se strateg 1
+pointer structur 1
+pointer structur byp 1
+pointer sur 1
+pointer sur la 1
+pointer sur le 1
+pointer sur linstruc 1
+pointer sur un 1
+pointer tag 1
+pointer tag mak 1
+pointer tak 1
+pointer to act 1
+pointer to chang 1
+pointer to disk 1
+pointer to find 1
+pointer to implem 1
+pointer to loc 1
+pointer to pag 1
+pointer to remember 1
+pointer to scan 1
+pointer to subprogram 1
+pointer which eventu 1
+pointerb 1
+pointerb repr 1
+pointeur 1
+pointeur a chaqu 1
+pointeur a un 1
+pointeur correspon 1
+pointeur cr 1
+pointeur cr avec 1
+pointeur de 1
+pointeur de la 1
+pointeur de pil 1
+pointeur de som 1
+pointeur de structur 1
+pointeur econom 1
+pointeur explicit 1
+pointeur explicit de 1
+pointeur ma 1
+pointeur ma plut 1
+pointeur sont 1
+pointeur sont egaux 1
+pointeur sur 1
+pointeur sur la 1
+pointeur sur le 1
+pointeur ta 1
+pointeur un 1
+pointeur un repr 1
+pointfx 1
+pointil 1
+poizat 1
+pol 27
+pol ae 1
+pol ae np 1
+pol and check 1
+pol and np 1
+pol approach 1
+pol ar lik 1
+pol ch 1
+pol dassur 1
+pol dassur prot 1
+pol defin 1
+pol design 1
+pol dog 1
+pol dog sniff 1
+pol drug 1
+pol drug dog 1
+pol edr 3
+pol edr avec 1
+pol edr convec 1
+pol edr de 1
+pol edr en 2
+pol edr ent 1
+pol edr est 1
+pol edr init 1
+pol edr par 1
+pol edr param 1
+pol edr provoqu 1
+pol edr rationnel 1
+pol edr suiv 1
+pol edr sur 1
+pol enforc 1
+pol exhaust 1
+pol experim 1
+pol for act 1
+pol for comput 1
+pol for interconnect 1
+pol implem 1
+pol int 1
+pol is assum 1
+pol is character 1
+pol is measur 1
+pol is seldom 1
+pol is select 1
+pol is specif 1
+pol list 2
+pol list dep 1
+pol lm 1
+pol loc 1
+pol loc pol 1
+pol matur 1
+pol may ch 1
+pol mechan 1
+pol must specif 1
+pol oper 1
+pol polish 1
+pol requir 1
+pol restrict 1
+pol result 1
+pol rloc 1
+pol rloc cur 1
+pol suppl 1
+pol th link 1
+pol tim 1
+pol tim ca 1
+pol tim solut 1
+pol to prov 1
+pol user 1
+pol user interfac 1
+pol wil allow 1
+pol would advoc 1
+pol would giv 1
+pol.list.first 1
+pol.list.next 1
+pol.threshold 1
+polish 1
+polit 2
+polit ecn 1
+polit ecn de 1
+polit fact 1
+politecn 2
+politecn di 1
+politecn di milan 1
+politecn feder 1
+politecn feder di 1
+politiqu 2
+politiqu de 2
+politiqu de gest 2
+politiqu vi 1
+polk 1
+pollack 2
+pollerman 1
+pollut 1
+pollut in geolog 1
+polson 1
+polychronopoul 2
+polychronopoul finit 1
+polychronopoul finit differ 1
+polychronopoul prop 1
+polyglot 1
+polyglot and tongu 1
+polygon 5
+polygon and plan 1
+polygon ar shown 1
+polygon ar triangl 1
+polygon bound 1
+polygon by polygon 1
+polygon cannot doubl 1
+polygon clip 1
+polygon clip problem 1
+polygon containm 1
+polygon cylinder 1
+polygon defin 1
+polygon el 1
+polygon el mo 1
+polygon fac 1
+polygon from sb 1
+polygon individu 1
+polygon is monot 1
+polygon is proport 1
+polygon is repr 1
+polygon is suff 1
+polygon level 1
+polygon level decluster 1
+polygon level filter 1
+polygon map 1
+polygon map repr 1
+polygon norm 1
+polygon norm vect 1
+polygon or polyhedr 1
+polygon or rectangl 1
+polygon per chunk 1
+polygon reg 1
+polygon repr 2
+polygon simplif 1
+polygon th result 1
+polygon to triangl 1
+polygon ver 1
+polygon ver mak 1
+polyhedr 6
+polyhedr and parallel 1
+polyhedr ar compl 1
+polyhedr ar handl 1
+polyhedr ar simpler 1
+polyhedr as compact 1
+polyhedr as intersect 1
+polyhedr assoc 1
+polyhedr b rep 1
+polyhedr being combin 1
+polyhedr bound 1
+polyhedr bound repr 1
+polyhedr character 1
+polyhedr con 1
+polyhedr correspon 1
+polyhedr decomposit 1
+polyhedr defin 2
+polyhedr dep 1
+polyhedr differ 1
+polyhedr eff 1
+polyhedr framework 1
+polyhedr ge 1
+polyhedr in bag 1
+polyhedr is built 1
+polyhedr object 1
+polyhedr of dat 1
+polyhedr of rm 1
+polyhedr of rn 1
+polyhedr offer 1
+polyhedr oper 1
+polyhedr pp 1
+polyhedr pp assoc 1
+polyhedr primitiv 1
+polyhedr produc 1
+polyhedr qp 1
+polyhedr repr 2
+polyhedr repr pack 1
+polyhedr sol 1
+polyhedr th produc 1
+polyhedr that intersect 1
+polyhedr using 2
+polyhedr using bin 1
+polyhedr using four 1
+polyhedr wh 1
+polyhedr wh fac 1
+polyhedr wh intersect 1
+polylogarithm 2
+polylogarithm parallel 1
+polylogarithm parallel tim 1
+polymorph 5
+polymorph and aggreg 1
+polymorph and dynam 1
+polymorph ar preserv 1
+polymorph calculus 1
+polymorph can introduc 1
+polymorph caus 1
+polymorph caus understand 1
+polymorph collap 1
+polymorph consider 1
+polymorph consider harm 1
+polymorph for pr 1
+polymorph frustr 1
+polymorph funct 1
+polymorph high 1
+polymorph high order 1
+polymorph in log 1
+polymorph interact 1
+polymorph is problemat 1
+polymorph lead 1
+polymorph method 2
+polymorph no longer 1
+polymorph nor typ 1
+polymorph order 1
+polymorph order sort 1
+polymorph system 1
+polymorph system prop 1
+polymorph torus 1
+polymorph torus network 1
+polymorph typ 1
+polymorph typ becom 1
+polymorph typ check 1
+polymorph typ log 1
+polymorph typ specif 1
+polymorph typ system 1
+polymorphiqu 1
+polymorphiqu a la 1
+polyn 1
+polyn om 1
+polyn om orthogonaux 1
+polynom 24
+polynom algorithm 1
+polynom and aff 1
+polynom and coh 1
+polynom b defin 1
+polynom bound 1
+polynom cn 1
+polynom cn defin 1
+polynom commun 1
+polynom commun spac 1
+polynom constraint 2
+polynom constraint ar 1
+polynom constraint chang 1
+polynom constraint remain 1
+polynom constraint simplif 1
+polynom constraint using 1
+polynom den 2
+polynom den accord 1
+polynom den order 1
+polynom den. 1
+polynom equ 2
+polynom equ constraint 1
+polynom fact 1
+polynom fact greater 1
+polynom fb 1
+polynom fhng 1
+polynom fl 1
+polynom fp 1
+polynom fp ff 1
+polynom fpng 1
+polynom fring 1
+polynom fring proper 1
+polynom fs 1
+polynom fs ng 1
+polynom funct 2
+polynom hierarch 1
+polynom id 1
+polynom id theor 1
+polynom inequ 1
+polynom inequ constraint 1
+polynom interpol 1
+polynom number 2
+polynom of degr 1
+polynom on weight 1
+polynom or 2cn 1
+polynom or expon 1
+polynom orthogon 1
+polynom precondit 1
+polynom precondit result 1
+polynom problem 1
+polynom problem using 1
+polynom sequ 1
+polynom siz 2
+polynom smal fract 1
+polynom solut 1
+polynom ss 1
+polynom tim 14
+polynom tim algorithm 9
+polynom tim approxim 1
+polynom tim bound 1
+polynom tim comput 1
+polynom tim construc 1
+polynom tim dec 1
+polynom tim dual 1
+polynom tim equiv 1
+polynom tim gener 1
+polynom tim heur 1
+polynom tim isomorph 1
+polynom tim membership 1
+polynom tim produc 1
+polynom tim qu 1
+polynom tim reduc 2
+polynom tim solut 1
+polynom with au 1
+polynom with degr 1
+polynom with respect 1
+polynomialtim 1
+polynomialtim reduc 1
+polyph 1
+polyph transform 1
+polysacchar 1
+polysacchar and lipid 1
+polytechniqu 3
+polytechniqu feder 1
+polytechniqu feder de 1
+polytop 1
+polytop entir 1
+polytop entir wrap 1
+pon 4
+pon en 1
+pon en text 1
+pon er 1
+pon er ee 1
+pon funct 1
+pon rat 1
+pon rat ff 1
+ponctuel 2
+ponctuel soit 1
+ponder 1
+ponder and bush 1
+ponent 1
+ponent which st 1
+pong 2
+pong d ependait 1
+pong dev 1
+pong dev de 1
+pong en 1
+pong en augm 1
+pong entr 1
+pong entr pi 1
+pong entr pj 1
+pong est 1
+pong est le 1
+pong est moin 1
+pong et la 1
+pong le 1
+pong lorsquau 1
+pong lorsquau moin 1
+pong ne 1
+pong ne peut 1
+pong pen 1
+pong pen le 1
+pong peut 1
+pong peut etr 1
+pong phenomenon 1
+pong po 1
+pong po ed 1
+pong pour 1
+pong pour diff 1
+pong qu 1
+pong qu ont 1
+pong si 1
+pong si bien 1
+pong tr 1
+pong tr es 1
+ponnusam 1
+pool 7
+pool accord 1
+pool ba 1
+pool ba method 1
+pool buffer 1
+pool buffer manager 1
+pool contain 1
+pool contain program 1
+pool dat 1
+pool for replac 1
+pool id 1
+pool manag 1
+pool may result 1
+pool of dat 1
+pool of min 1
+pool of network 1
+pool of program 1
+pool of self 1
+pool refer 1
+pool siz 2
+pool siz using 1
+pool to fetch 1
+pool to help 1
+pool we obtain 1
+poor 21
+poor approxim 1
+poor ch 1
+poor cluster 1
+poor cluster perform 1
+poor docum 1
+poor du 1
+poor featur 1
+poor isol 1
+poor isol proper 1
+poor load 1
+poor load bal 1
+poor loc 1
+poor loc minim 1
+poor network 1
+poor network util 1
+poor parallel 2
+poor parallel perform 1
+poor parallel result 1
+poor perceiv 1
+poor perceiv perform 1
+poor perform 4
+poor resolut 1
+poor result 4
+poor shap 1
+poor shap simpl 1
+poor util 2
+poorer 1
+poorer perform 1
+pop 7
+pop and push 1
+pop and rest 1
+pop entrypoint 1
+pop entrypoint continu 1
+pop me 1
+pop on el 1
+pop prob 1
+pop prob distribut 1
+pop th return 1
+pop th stack 1
+pop th topmost 1
+pop tw el 1
+pop up menus 1
+pop2 1
+pop2 entrypoint 1
+pop2 entrypoint continu 1
+pop2 method 1
+pop2 stack 1
+pop2 stack cl 1
+popek 2
+popl 31
+popl a board 2
+popl act 1
+popl algorithm 2
+popl algorithm approach 1
+popl and commerc 1
+popl and develop 2
+popl and distribut 1
+popl and real 1
+popl approach 2
+popl apr 1
+popl apr converg 1
+popl ar evalu 1
+popl background 1
+popl becom 1
+popl constitu 1
+popl constitu ee 1
+popl cour 1
+popl cour est 1
+popl cour occup 1
+popl d esir 1
+popl de 1
+popl de fa 1
+popl de point 1
+popl de pseud 1
+popl de solut 1
+popl de tail 1
+popl dindividus 1
+popl dindividus ch 1
+popl ee 1
+popl ee par 1
+popl est 1
+popl est comp 1
+popl est div 1
+popl est tr 1
+popl estim 1
+popl estim count 1
+popl et dun 1
+popl et la 1
+popl etant 1
+popl etat 1
+popl f pn 1
+popl fiducc 1
+popl fiducc matth 1
+popl for solut 1
+popl funct 1
+popl h.e 1
+popl i au 1
+popl init 1
+popl init aleatoir 1
+popl init cont 1
+popl init evaluer 1
+popl init sont 1
+popl interm 1
+popl interm ediair 1
+popl is affect 1
+popl is gener 1
+popl is map 1
+popl is network 1
+popl k ary 2
+popl la 1
+popl la valeur 1
+popl label 1
+popl label strateg 1
+popl loc 1
+popl model 1
+popl naturel 1
+popl nrd 1
+popl object 1
+popl object orient 1
+popl of candid 1
+popl of el 1
+popl of model 1
+popl of subject 1
+popl of tr 1
+popl p se 1
+popl peut 1
+popl peut sav 1
+popl peuv 1
+popl peuv rester 1
+popl plan 1
+popl plan link 1
+popl produit 1
+popl produit par 1
+popl proportionnel 1
+popl pt 1
+popl qu 1
+popl qu lu 1
+popl rgb 1
+popl rgb color 1
+popl se 1
+popl se fait 1
+popl should mak 1
+popl siz 1
+popl solut 1
+popl subcl 1
+popl subit 1
+popl subit de 1
+popl successiv 1
+popl successiv obtenu 1
+popl suffer 1
+popl th datab 1
+popl tool 1
+popl tool se 1
+popl trait 1
+popl trait ee 1
+popl tren 2
+popl wa observ 1
+popl wa var 1
+popl with cod 1
+popl with dat 1
+popl with libr 1
+popl wormhol 1
+popl wormhol rout 1
+popl www 1
+popl www docum 1
+popl79 1
+popov 1
+por 2
+por log 1
+por log program 1
+por med 1
+poreux 1
+poreux a deux 1
+port 46
+port a me 1
+port and eff 1
+port and encounter 1
+port and inter 1
+port and tun 1
+port and versatil 1
+port ar 1
+port ar bus 1
+port ar read 1
+port ar typ 1
+port as hn 1
+port as part 1
+port begin 1
+port begin read 1
+port can read 1
+port can retrief 1
+port can sen 1
+port can sustain 1
+port can writ 1
+port concern 1
+port concern le 1
+port de 1
+port de la 1
+port de mal 1
+port de pil 1
+port ded 1
+port disk 1
+port du 1
+port e direct 1
+port e sur 1
+port each switch 1
+port ee 2
+port ee de 1
+port ee diff 1
+port ee du 1
+port ee dun 1
+port ee glob 1
+port ee le 1
+port ee loc 1
+port ee se 1
+port ev cycl 1
+port fif 1
+port fif repl 1
+port first chunk 1
+port firstchunk 1
+port firstchunk field 1
+port for inter 1
+port form 1
+port gnu 1
+port gnu cc 1
+port guid 1
+port hav read 1
+port hav shar 1
+port hypercub 1
+port i maintain 1
+port implem 1
+port implem using 1
+port interfac 1
+port interfac memor 1
+port is read 1
+port is real 1
+port is subsequ 1
+port is thus 1
+port is unb 1
+port issu 2
+port leur 1
+port leur fruit 1
+port lisp 1
+port lisp ymplem 1
+port low 1
+port low level 1
+port maint 1
+port maint sur 1
+port memor 2
+port o maintain 1
+port object 1
+port object system 1
+port of ar 1
+port of computer 1
+port of graph 1
+port of symbol 1
+port of tr 1
+port on lan 1
+port pack 1
+port pack queu 1
+port pair 1
+port pc 1
+port per switch 1
+port pr 1
+port proceed 1
+port proceed multidest 1
+port prolog 1
+port prolog compiler 1
+port queu 1
+port ram 1
+port read 1
+port register 1
+port register fil 1
+port rel 1
+port rel multicast 1
+port requir 1
+port sid 1
+port sp2 1
+port sp2 switch 1
+port sur 3
+port sur de 1
+port sur lappel 1
+port sur le 2
+port sur plusieur 1
+port sur un 1
+port switch 2
+port system 1
+port tak 1
+port tak turn 1
+port th cod 1
+port to inter 1
+port to interswitch 1
+port to maintain 1
+port to match 1
+port to switch 1
+port way using 1
+port which lead 1
+port writ 1
+port xoutput 1
+port xoutput port 1
+porter 3
+porter dr 1
+porter le 1
+porter le test 1
+porter sur 1
+porter sur la 1
+porterfield 1
+porteur 1
+porteur dun 1
+porteur dun peu 1
+portfol 1
+portig 1
+portland 4
+portland group 1
+portland group hpf 1
+portlandgroup 1
+portug 3
+portugu 1
+poseidon 1
+poseidon hous 1
+poser 2
+poser de 1
+poser de quest 1
+poser lorsqu 1
+poser lorsqu le 1
+posit 89
+posit 2b 1
+posit 3n 1
+posit accord 1
+posit ack 1
+posit acknowledg 1
+posit acknowledgm 1
+posit ad 1
+posit ad equ 1
+posit amount 1
+posit and chang 1
+posit and comput 1
+posit and consider 1
+posit and contain 1
+posit and dual 1
+posit and fic 1
+posit and misalignm 1
+posit and neg 4
+posit and or 2
+posit and replac 1
+posit and self 1
+posit and veloc 1
+posit answer 1
+posit ar upd 1
+posit argum 1
+posit aspect 1
+posit at iter 1
+posit between featur 1
+posit boolean 1
+posit boolean funct 1
+posit ca 1
+posit closur 1
+posit com 1
+posit com etant 1
+posit const 3
+posit const hyperbol 1
+posit container 1
+posit container cont 1
+posit cor 1
+posit cor ff 1
+posit correspon 1
+posit dargum 1
+posit dat 1
+posit de 2
+posit de deux 1
+posit de la 2
+posit de sa 1
+posit definit 5
+posit definit cl 1
+posit definit funct 1
+posit definit matr 3
+posit definit system 1
+posit detect 1
+posit dual 1
+posit dual minor 1
+posit dualminor 1
+posit dualminor funct 1
+posit dun 1
+posit dun don 1
+posit ec 1
+posit effect 1
+posit error 2
+posit est 2
+posit est connu 1
+posit est prim 1
+posit est un 1
+posit et st 1
+posit exampl 1
+posit execut 1
+posit execut chang 1
+posit fragm 1
+posit from error 1
+posit from read 1
+posit funct 1
+posit funct contain 1
+posit funct f1 1
+posit funct fc 1
+posit funct ff 1
+posit identif 1
+posit impact 1
+posit in inst 1
+posit in mod 1
+posit in po 1
+posit in re 1
+posit in v00 1
+posit ind 1
+posit instanc 1
+posit instanc ee 1
+posit integer 7
+posit integer const 1
+posit intern 1
+posit intern ou 1
+posit intern qu 1
+posit is calcl 1
+posit is deon 1
+posit is found 1
+posit is read 1
+posit is root 1
+posit is sent 1
+posit is succ 1
+posit is therefor 1
+posit key 1
+posit key valu 1
+posit learn 1
+posit lin 1
+posit lin comb 1
+posit lin combin 1
+posit liter 1
+posit match 1
+posit match synonym 1
+posit measur 1
+posit not 1
+posit number 1
+posit number repr 1
+posit of en 1
+posit of f1 1
+posit of ff 1
+posit of list 1
+posit of menu 1
+posit of oe 1
+posit of ptx 1
+posit of ss 1
+posit of tim 1
+posit of water 1
+posit on 1
+posit or monot 1
+posit or neg 2
+posit oracl 1
+posit oracl brakep 1
+posit p0 1
+posit paper 2
+posit par 1
+posit par colon 1
+posit po 1
+posit po.1 1
+posit ptx 1
+posit qu 1
+posit qu lon 1
+posit quer 1
+posit re 1
+posit read 1
+posit read chang 1
+posit real valu 1
+posit rel 1
+posit rel de 1
+posit remain 1
+posit repeat 1
+posit respect 1
+posit respectiv 1
+posit respectiv dan 1
+posit respon 1
+posit scor 1
+posit self 1
+posit self dual 1
+posit selfdu 1
+posit selfdu funct 1
+posit si 1
+posit si lop 1
+posit string 1
+posit succ 1
+posit successiv 1
+posit termin 1
+posit termin dan 1
+posit thus 1
+posit to cop 1
+posit to error 1
+posit to execut 1
+posit to read 1
+posit to repeat 1
+posit to succ 1
+posit tr 1
+posit tr es 1
+posit train 1
+posit train se 1
+posit unit 1
+posit unit claus 1
+posit using 1
+posit usu tak 1
+posit valu 2
+posit variabl 1
+posit variabl belong 1
+posit wer gener 1
+posit wh 4
+posit which mean 1
+posit with respect 1
+posit within inst 1
+posit without check 1
+posit x ray 1
+posit zer 1
+positan 1
+positif 4
+positif dan 1
+positif dan le 1
+positif de 1
+positif est 1
+positif est un 1
+positif le 1
+positif le el 1
+positif ne 1
+positif ne contrebalanc 1
+positif on obt 1
+positif ou 1
+positif par 1
+positif par colon 1
+positionw 1
+positionw wil us 1
+positiv 2
+positiv dan 1
+positiv dan lespac 1
+positiveg 1
+possibil 17
+possibil allow 1
+possibil ar shown 1
+possibil for construc 1
+possibil for form 1
+possibil for neg 1
+possibil for rever 1
+possibil for schedl 1
+possibil lead 1
+possibil shown 1
+possibil to chang 1
+possibil to overcom 1
+possibil with ven 1
+possibilit 5
+possibilit e dacc 1
+possibilit e de 2
+possibilit e dic 1
+possibilit e dun 2
+possibilit e dutiliser 1
+possibilit e est 1
+possibilit e etait 1
+possibilit e nest 1
+possibilit e qu 1
+possibilit es 1
+possibilit es actuel 1
+possibilit es dam 1
+possibilit es de 1
+possibilit es dun 1
+possibilit es dutil 1
+possibilit s de 1
+possibilit s techniqu 1
+possibl 4
+possibl a la 1
+possibl avec 1
+possibl avec la 1
+possibl dan 1
+possibl dan la 1
+possibl de 2
+possibl de aik 1
+possibl de la 1
+possibl de lim 1
+possibl de se 1
+possibl du 1
+possibl du program 1
+possibl du tableau 1
+possibl et le 1
+possibl lorsqu 1
+possibl lorsqu jc1j 1
+possibl ne 1
+possibl physiqu 1
+possibl plut 1
+possibl plut ot 1
+possibl pour 1
+possibl qu 1
+possibl qu si 1
+possibl valu 1
+post 15
+post a knowledg 1
+post a me 1
+post and proc 1
+post classif 1
+post classif stag 1
+post confer iclp 1
+post confer workshop 1
+post ee 1
+post ee sur 1
+post erieur 1
+post erieur au 1
+post iclp94 1
+post iclp94 worshop 1
+post incr 1
+post incr decr 1
+post log 1
+post log record 1
+post maint 1
+post maint test 1
+post no tr 1
+post of upd 1
+post proc 6
+post proc ba 1
+post proc imag 1
+post proc method 1
+post proc stag 1
+post proc step 1
+post proc text 1
+post proc transform 1
+post schedl 1
+post schedl window 1
+post th me 1
+postalloc 1
+postcondit 2
+postcondit ar part 1
+postcondit as giv 1
+postcondit as op 1
+postcondit of act 1
+postcondit of respect 1
+postcondit would satisf 1
+poster 2
+poster abstract 1
+poster abstract hc 1
+posterior 2
+posterior eliminer 1
+posterior eliminer certain 1
+posterior etr 1
+posterior etr simplif 1
+posterior to evalu 1
+postf 2
+postf expr 1
+postf not 1
+postfilter 1
+postfilter for dct 1
+postgr 1
+postgr paper 1
+postgr st 1
+postgr st system 1
+postgradu 1
+postgradu and eight 1
+posthum 1
+posthum produc 1
+postl 4
+postl a fifth 1
+postl for upd 1
+postl system 1
+postl system giv 1
+postpon 7
+postpon test 1
+postpon test select 1
+postpon th inv 1
+postpon th transm 1
+postproc 4
+postproc of block 1
+postproc of cod 1
+postproc of dct 1
+postproc step 2
+postproc to incorpor 1
+postscript 4
+postscript fil 1
+postscript fil avail 1
+postscript form 2
+pot 47
+pot a le 1
+pot abl 1
+pot an order 2
+pot and connect 1
+pot and improv 1
+pot and offer 1
+pot and thus 1
+pot appl 3
+pot appl inclus 1
+pot ar calcl 1
+pot ar ident 1
+pot assoc 1
+pot assoc link 1
+pot at tim 1
+pot be attain 1
+pot be upd 1
+pot becom 1
+pot becom high 1
+pot benefit 1
+pot block 1
+pot block nod 1
+pot bottleneck 1
+pot bottleneck affect 1
+pot build 1
+pot build block 1
+pot can evolut 1
+pot can yield 1
+pot catch 1
+pot caus 1
+pot caus rel 1
+pot chang 1
+pot combin 1
+pot combin cap 1
+pot con 1
+pot conflict 1
+pot continu 1
+pot differ se 1
+pot disastr 1
+pot disastr situ 1
+pot effect 2
+pot equ 1
+pot exp 1
+pot expr 1
+pot faster 1
+pot foc 1
+pot for extr 1
+pot for optim 1
+pot funct 1
+pot funct pi 1
+pot funct satisf 1
+pot giv 1
+pot high 3
+pot high fit 1
+pot high recognit 1
+pot hug 1
+pot hug quant 1
+pot hug transact 1
+pot in offer 1
+pot in virtualclock 1
+pot inclus 1
+pot inclus program 1
+pot incoh 1
+pot incoh pag 1
+pot incr 1
+pot incr exact 1
+pot infinit 1
+pot infinit hierarch 1
+pot infinit lif 1
+pot introduc 1
+pot is comput 1
+pot is estim 1
+pot is giv 1
+pot is illustr 1
+pot is incr 1
+pot is margin 1
+pot is non 1
+pot is re 1
+pot is se 1
+pot larg number 1
+pot loc 2
+pot loc indep 1
+pot me 1
+pot misunderstand 1
+pot must incr 1
+pot network 1
+pot network user 1
+pot not high 1
+pot oeu 1
+pot of backlog 1
+pot of cel 1
+pot of connect 1
+pot of greater 1
+pot of highperform 1
+pot of idl 1
+pot of individu 1
+pot of mak 1
+pot of new 1
+pot of nw 1
+pot of other 1
+pot of pack 1
+pot of pj 1
+pot of proc 1
+pot of queu 1
+pot of se 1
+pot on se 1
+pot on sub 1
+pot overlap 1
+pot parallel 1
+pot parallel inh 1
+pot perform 1
+pot perform benefit 1
+pot pi 1
+pot pj 1
+pot pk 1
+pot point 1
+pot problem 3
+pot problem effect 1
+pot produc 1
+pot profit 1
+pot profit technolog 1
+pot promot 1
+pot promot valu 1
+pot prov 1
+pot remain 1
+pot remain const 1
+pot remain equ 1
+pot requir 1
+pot requir bring 1
+pot ri 1
+pot signif 1
+pot signif sourc 1
+pot sj 1
+pot slow 1
+pot slow congest 1
+pot sourc 2
+pot support 3
+pot support dynam 1
+pot support larger 2
+pot tabl 1
+pot tabl wh 1
+pot th perform 1
+pot than other 1
+pot that keep 1
+pot to 2t 1
+pot to allev 1
+pot to block 1
+pot to exceed 1
+pot to offer 1
+pot to reduc 1
+pot to run 1
+pot to timestamp 1
+pot typ 1
+pot us 3
+pot us near 1
+pot user 1
+pot viol 1
+pot viol encapsl 1
+pot wait 1
+pot wait tim 1
+pot way 1
+pot wil appear 1
+pot wil incr 1
+pot x match 1
+pot yield 1
+pot yield signif 1
+pot. 1
+potentiel 5
+potentiel a de 1
+potentiel de 2
+potentiel de calcl 1
+potentiel de micr 1
+potentiel dun 1
+potentiel dun tel 1
+potentiel int 1
+potentiel int er 1
+potentiel le 1
+potentiel moin 1
+potentiel moin de 1
+potentiel ne 1
+potentiel ne concern 1
+potentiel peut 1
+potentiel peut simpl 1
+potentiel plus efficac 1
+potentiel r eduir 1
+potentiel sont 1
+potentiel sont import 1
+potentiel sup 1
+potentiel sup erieur 1
+poter 1
+poth 2
+potlap 1
+potsdam 1
+pound 1
+pour 8
+pour aborder 1
+pour aborder ce 1
+pour acc 1
+pour acc eder 1
+pour acqu 1
+pour acqu erir 1
+pour activer 1
+pour activer lop 1
+pour adapter 1
+pour adapter la 1
+pour adr 1
+pour affirmer 1
+pour affirmer qu 1
+pour ag 1
+pour aider 1
+pour ajouter 1
+pour ajouter dynamiqu 1
+pour algorithm 1
+pour algorithm ir 1
+pour aller 1
+pour aller au 1
+pour am eliorer 2
+pour analyser 1
+pour analyser dautr 1
+pour appliquer 1
+pour appliquer le 1
+pour assurer 2
+pour assurer la 1
+pour atteindr 2
+pour atteindr ce 1
+pour atteindr le 1
+pour aus 1
+pour aus cr 1
+pour aut 2
+pour aut fair 1
+pour avoir 2
+pour avoir accept 1
+pour avoir lieu 1
+pour avoir un 1
+pour bi 1
+pour but 1
+pour but danalyser 1
+pour but de 1
+pour but dun 1
+pour but lam 1
+pour but princip 1
+pour calculer 2
+pour calculer la 1
+pour calculer le 2
+pour caract 1
+pour caract eriser 1
+pour ce 5
+pour ce claus 1
+pour ce dern 1
+pour ce deux 1
+pour ce fair 3
+pour ce qu 2
+pour ce raison 1
+pour ce valeur 1
+pour cel 4
+pour cel de 1
+pour cel deffectuer 1
+pour cel deux 1
+pour cel la 1
+pour cel le 1
+pour cel nous 1
+pour cel un 1
+pour certain 1
+pour certain valeur 1
+pour ch 1
+pour ch ner 1
+pour chacun 2
+pour chacun de 2
+pour chaqu 3
+pour chaqu chemin 1
+pour chaqu cl 1
+pour chaqu claus 1
+pour chaqu don 1
+pour chaqu echantillon 1
+pour chaqu ecritur 1
+pour chaqu el 1
+pour chaqu environ 1
+pour chaqu pag 1
+pour chaqu processeur 1
+pour chaqu program 1
+pour chaqu segm 1
+pour chaqu tail 1
+pour chaqu treil 1
+pour chaqu valeur 1
+pour chaqu var 2
+pour chaqu vecteur 1
+pour chaqu ver 1
+pour cibl 1
+pour cibl etant 1
+pour clarif 1
+pour clarif la 1
+pour compiler 1
+pour compiler le 1
+pour con 2
+pour con tr 2
+pour conditionner 1
+pour conditionner le 1
+pour conormer 1
+pour conormer la 1
+pour construir 2
+pour construir le 1
+pour construir un 1
+pour contr 1
+pour contr oler 1
+pour corriger 1
+pour corriger le 1
+pour couper 1
+pour couper lespac 1
+pour cr 2
+pour cr eer 2
+pour cut 1
+pour d cider 1
+pour d eterminer 2
+pour d evelopper 1
+pour d pgcd 1
+pour d terminer 1
+pour d velopper 1
+pour de 3
+pour de grand 1
+pour de group 1
+pour de nombreus 1
+pour de nouvel 1
+pour de point 1
+pour de raison 2
+pour de retour 1
+pour de tel 1
+pour dern 1
+pour deux 2
+pour deux raison 2
+pour diff 2
+pour diff erent 2
+pour distinguer 1
+pour distinguer le 1
+pour donc 1
+pour donc se 1
+pour dun 1
+pour dun part 1
+pour eff 2
+pour eff de 1
+pour eff secondair 1
+pour effectuer 2
+pour effectuer la 1
+pour effectuer un 1
+pour el 1
+pour el ement 1
+pour eliminer 1
+pour eliminer le 1
+pour eliminer loccur 1
+pour en 1
+pour en attendr 1
+pour en con 1
+pour enregistrer 2
+pour enregistrer le 2
+pour envisager 1
+pour envisager de 1
+pour espac 1
+pour espac de 1
+pour estimer 3
+pour estimer le 1
+pour estimer limpact 1
+pour estimer lincertitud 1
+pour estimer par 1
+pour estimer un 1
+pour etiqu 1
+pour etiqu la 1
+pour etiqu le 1
+pour etiqu un 1
+pour etr 2
+pour etr apport 1
+pour etr compl 1
+pour etr effectu 1
+pour etr empl 1
+pour etr exploit 1
+pour etr loeuvr 1
+pour etr men 1
+pour etr rang 1
+pour etr sauvegard 1
+pour etud 3
+pour etud ce 1
+pour etud la 1
+pour etud le 2
+pour eviter 2
+pour eviter de 1
+pour eviter le 2
+pour eviter sur 1
+pour ex 1
+pour ex ecuter 1
+pour exploiter 1
+pour exploiter la 1
+pour exprimer 1
+pour exprimer de 1
+pour extrair 1
+pour extrair ik 1
+pour extrair la 1
+pour faciliter 1
+pour faciliter le 1
+pour fair 1
+pour fair la 1
+pour fixer 1
+pour fixer le 1
+pour foncteur 1
+pour former 1
+pour fournir 1
+pour fournir du 1
+pour g en 1
+pour g erer 1
+pour g rer 1
+pour garantir 1
+pour guider 1
+pour guider le 1
+pour i var 1
+pour i0 1
+pour icm 1
+pour identif 1
+pour identif ce 1
+pour imaginer 1
+pour impl 1
+pour impl ementer 1
+pour indiquer 1
+pour indiquer quel 1
+pour ivy 1
+pour j j0 1
+pour k suffisam 1
+pour kcm 1
+pour l elim 1
+pour l etap 1
+pour l etat 1
+pour l ment 1
+pour la 6
+pour la boucl 1
+pour la cartograph 1
+pour la claus 1
+pour la comp 1
+pour la composit 1
+pour la compr 1
+pour la conf 1
+pour la construc 1
+pour la converg 1
+pour la convexit 1
+pour la dern 1
+pour la deux 2
+pour la diffus 1
+pour la fus 1
+pour la m.d.s 1
+pour la mach 1
+pour la md 1
+pour la mesur 1
+pour la mi 4
+pour la mod 1
+pour la mut 1
+pour la mvp 1
+pour la par 1
+pour la part 1
+pour la planioc 1
+pour la prem 1
+pour la propag 1
+pour la recherch 1
+pour la recon 1
+pour la rendr 1
+pour la secon 1
+pour la tr 2
+pour la val 1
+pour la var 2
+pour la ver 1
+pour la wam 1
+pour lacc 1
+pour lacc es 1
+pour lalgorithm 1
+pour lalgorithm de 1
+pour lappel 1
+pour lappel au 1
+pour lappel cour 1
+pour laquel 3
+pour laquel aucun 1
+pour laquel cach 1
+pour laquel chaqu 1
+pour laquel le 2
+pour lattribut 1
+pour le 5
+pour le ag 1
+pour le algorithm 1
+pour le autr 1
+pour le besoin 1
+pour le born 1
+pour le boucl 1
+pour le ca 2
+pour le calcl 1
+pour le calculateur 1
+pour le champ 1
+pour le claus 1
+pour le combiner 1
+pour le court 1
+pour le cr 1
+pour le deux 2
+pour le diff 1
+pour le environ 1
+pour le espac 1
+pour le fait 1
+pour le fit 1
+pour le foncteur 1
+pour le gestionnair 1
+pour le graph 1
+pour le instruc 1
+pour le jug 1
+pour le mach 3
+pour le maint 1
+pour le matr 1
+pour le me 1
+pour le moment 1
+pour le op 1
+pour le pag 1
+pour le perform 2
+pour le point 2
+pour le pr 1
+pour le prem 1
+pour le produir 1
+pour le program 1
+pour le programmeur 2
+pour le propr 1
+pour le prot 1
+pour le qualit 1
+pour le rec 1
+pour le recouvrer 1
+pour le register 1
+pour le rendr 1
+pour le rest 1
+pour le retour 1
+pour le rot 1
+pour le segm 1
+pour le similitud 1
+pour le support 1
+pour le syst 1
+pour le tableau 1
+pour le techniqu 1
+pour le trait 1
+pour le transfer 1
+pour le transform 1
+pour le treil 1
+pour le variabl 2
+pour le vecteur 1
+pour lec 1
+pour lec ecut 1
+pour lempl 1
+pour lempl dun 1
+pour lenv 1
+pour lenv de 1
+pour lenviron 1
+pour lenviron de 1
+pour lequel 2
+pour lequel il 1
+pour lequel le 2
+pour lequel lespac 1
+pour lequel tout 1
+pour lequel un 1
+pour lesquel 2
+pour lesquel ce 1
+pour lesquel la 1
+pour lesquel le 1
+pour lesquel lext 1
+pour leur 2
+pour leur commentair 1
+pour leur conseil 1
+pour lexp 1
+pour lexp er 1
+pour lextrair 1
+pour lextrair dun 1
+pour limiter 1
+pour limiter le 1
+pour lind 2
+pour lindividu 1
+pour lindustr 1
+pour lindustr pharmaceutiqu 1
+pour linst 3
+pour linst de 1
+pour linst le 1
+pour linst pur 1
+pour linst un 1
+pour linst val 1
+pour linstruc 1
+pour linstruc daccepter 1
+pour lint 1
+pour lint er 1
+pour lintroduc 1
+pour lintroduc de 1
+pour lipsc 1
+pour longueur 1
+pour longueur de 1
+pour lop 1
+pour lop erat 1
+pour loptim 1
+pour loptim de 1
+pour lu 2
+pour lu fair 1
+pour lu permettr 1
+pour lun 1
+pour lun de 1
+pour lunif 1
+pour lunif syntaxiqu 1
+pour lutilisateur 1
+pour mach 2
+pour mach par 1
+pour mach simd 1
+pour maintenir 2
+pour maintenir la 1
+pour manipuler 1
+pour manipuler informatiqu 1
+pour matr 1
+pour matr creus 1
+pour mener 1
+pour mettr 3
+pour mettr en 1
+pour mettr lin 1
+pour mieux 1
+pour mieux pouvoir 1
+pour minimiser 1
+pour minimiser le 1
+pour mod 1
+pour modif 2
+pour modif le 1
+pour modif lordr 1
+pour montrer 1
+pour montrer linflu 1
+pour multiprocesseur 1
+pour munin 1
+pour mvp 1
+pour nautoriser 1
+pour nautoriser quun 1
+pour ne 2
+pour ne pa 2
+pour no 1
+pour no mesur 1
+pour notr 2
+pour notr exp 1
+pour notr probl 1
+pour notr techniqu 1
+pour nous 1
+pour objectif 2
+pour objectif de 2
+pour obtenir 4
+pour obtenir de 3
+pour obtenir la 2
+pour obtenir lalign 1
+pour obtenir le 3
+pour obtenir un 2
+pour onir 1
+pour optimiser 1
+pour optimiser la 1
+pour ordr 1
+pour orig 1
+pour orig un 1
+pour orthonormaliser 1
+pour orthonormaliser sur 1
+pour pal 2
+pour pal ce 1
+pour pal le 1
+pour par 1
+pour par eliser 1
+pour parcourir 1
+pour parcourir le 1
+pour partitionner 1
+pour partitionner la 1
+pour parvenir 1
+pour parvenir au 1
+pour parvenir conjoint 1
+pour passer 1
+pour passer de 1
+pour permettr 1
+pour permettr de 1
+pour permettr le 1
+pour permettr lec 1
+pour permettr un 1
+pour plusieur 1
+pour plusieur raison 1
+pour pm 1
+pour pm le 1
+pour point 1
+pour point de 1
+pour port 1
+pour port ee 1
+pour pouvoir 3
+pour pouvoir esp 1
+pour pouvoir extrair 1
+pour pouvoir partager 1
+pour prem 1
+pour prem argum 1
+pour prem term 1
+pour prendr 2
+pour prendr en 2
+pour princip 1
+pour princip inconv 1
+pour produir 1
+pour produir un 1
+pour propager 1
+pour propager le 1
+pour proposer 1
+pour qu 3
+pour qu ce 2
+pour qu le 1
+pour qu lon 2
+pour qu ninterv 1
+pour quatr 1
+pour quatr tail 1
+pour quil 2
+pour quil ne 1
+pour quil soient 1
+pour quun 1
+pour quun processeur 1
+pour r duir 1
+pour r ealiser 2
+pour r eduir 1
+pour r epondr 1
+pour r esoudr 3
+pour r esumer 1
+pour r ol 1
+pour raccourcir 1
+pour raccourcir le 1
+pour racin 1
+pour racin un 1
+pour ranger 1
+pour recevoir 1
+pour recevoir le 1
+pour recouvrer 1
+pour recouvrer ce 1
+pour refair 1
+pour refair de 1
+pour remettr 1
+pour rendr 1
+pour rendr intern 1
+pour repr 2
+pour repr esenter 2
+pour respecter 1
+pour respecter ce 1
+pour restaurer 1
+pour restaurer le 1
+pour sa 1
+pour sa part 1
+pour saffranchir 1
+pour saffranchir de 1
+pour sassurer 1
+pour sassurer quil 1
+pour sauvegarder 1
+pour sauvegarder le 1
+pour sav 1
+pour sav ch 1
+pour sav erer 1
+pour savoir 2
+pour savoir si 2
+pour se 2
+pour se conseil 1
+pour se contenter 1
+pour se ramener 1
+pour signaler 1
+pour signaler loccur 1
+pour simpl 1
+pour simplif 3
+pour simplif aut 1
+pour simplif le 2
+pour son 1
+pour son aid 1
+pour sp 1
+pour sp ecif 1
+pour stocker 2
+pour stocker de 1
+pour stocker le 1
+pour suivr 1
+pour suoesam 1
+pour suoesam fa 1
+pour supprimer 1
+pour supprimer la 1
+pour synth 1
+pour synth etiser 1
+pour t 0.25h 1
+pour tc 1
+pour tc var 1
+pour tenir 1
+pour tenir compt 1
+pour tenter 1
+pour tenter egal 1
+pour terminer 1
+pour terminer lop 1
+pour tourner 1
+pour tourner sur 1
+pour tous 1
+pour tous le 1
+pour tout 4
+pour tout ce 2
+pour tout cel 1
+pour tout coupl 1
+pour tout dupl 1
+pour tout etat 1
+pour tout fonct 1
+pour tout le 3
+pour tout matr 1
+pour tout part 1
+pour tout pi 1
+pour tout un 1
+pour tout valeur 1
+pour tr 1
+pour tr es 1
+pour traduir 1
+pour traduir le 1
+pour traiter 2
+pour traiter ce 1
+pour traiter le 1
+pour traiter lerreur 1
+pour traiter no 1
+pour trouver 1
+pour trouver le 1
+pour un 4
+pour un ag 1
+pour un appl 2
+pour un bon 1
+pour un cod 1
+pour un de 1
+pour un echec 1
+pour un gest 1
+pour un ind 1
+pour un instruc 1
+pour un maxim 1
+pour un me 1
+pour un mi 1
+pour un op 1
+pour un ordinateur 1
+pour un ordonnanc 1
+pour un part 1
+pour un pr 1
+pour un recouvr 1
+pour un repr 1
+pour un retour 1
+pour un succ 1
+pour un synth 1
+pour un tel 1
+pour un trajectoir 1
+pour un valeur 1
+pour utiliser 1
+pour utiliser direct 1
+pour utiliser la 1
+pour v erif 1
+pour valeur 1
+pour valeur bp 1
+pour valeur cp 1
+pour valeur le 1
+pour valeur un 1
+pour valider 1
+pour valider le 1
+pour visualiser 1
+pour visualiser la 1
+pour voir 1
+pour voir de 1
+pour x sont 1
+pour y avec 1
+pour y pal 1
+pour y parvenir 1
+pourc 2
+pourc de 2
+pourc de plac 1
+pourc de point 1
+pourc de retour 1
+pourc denviron 1
+pourc sest 1
+pourc sest av 1
+pourqu 2
+pourqu ce 1
+pourqu ce typ 1
+pourqu la 1
+pourqu la form 1
+pourqu le 1
+pourqu le mod 1
+pourqu ne 1
+pourqu nous 1
+pourqu nous calculon 1
+pourqu nous cherchon 1
+pourqu nous proposon 1
+pourrait 4
+pourrait adopter 1
+pourrait adopter de 1
+pourrait ain 1
+pourrait ain tr 1
+pourrait aus 1
+pourrait cr 1
+pourrait cr eer 1
+pourrait de 1
+pourrait donc 1
+pourrait donc penser 1
+pourrait envisager 1
+pourrait envisager etendr 1
+pourrait etr 2
+pourrait etr envisag 1
+pourrait etr impl 1
+pourrait etr retard 1
+pourrait etr supprim 1
+pourrait etr util 1
+pourrait eventuel 1
+pourrait eventuel etr 1
+pourrait jouer 1
+pourrait jouer en 1
+pourrait passer 1
+pourrait passer par 1
+pourrait sav 1
+pourrait sav erer 1
+pourrait traduir 1
+pourrait traduir ce 1
+pourrait tud 1
+pourrait tud le 1
+pourront 1
+pourront donc 1
+pourront donc etr 1
+pourront en 1
+pourront en particl 1
+pourront etr 1
+pourront etr corrig 1
+pourront pa 1
+pourront pa etr 1
+poursuit 3
+poursuit alor 1
+poursuit au 1
+poursuit au niveau 1
+poursuit la 1
+poursuivr 1
+poursuivr en 1
+poursuivr en dehor 1
+pourt 2
+pourt bien 1
+pourt bien bal 1
+pourt qu 1
+pourt qu de 1
+pourvu 1
+pourvu qu 1
+pourvu qu le 1
+pous 1
+pous e li 1
+pous le 1
+pous le princip 1
+pouv 4
+pouv apporter 1
+pouv apporter de 1
+pouv avoir 2
+pouv avoir de 1
+pouv avoir lieu 1
+pouv communiquer 1
+pouv d ecrir 1
+pouv dan 1
+pouv dan ce 1
+pouv entr 1
+pouv entr ner 1
+pouv etr 2
+pouv etr acc 1
+pouv etr appr 1
+pouv etr combin 1
+pouv etr effectu 1
+pouv etr obtenu 1
+pouv etr parcouru 1
+pouv etr trait 1
+pouv exister 1
+pouv exister entr 1
+pouv inclur 1
+pouv inclur un 1
+pouv mener 1
+pouv mener aux 1
+pouv r esulter 1
+pouvait 3
+pouvait d eg 1
+pouvait etr 1
+pouvait etr etendu 1
+pouvait etr util 1
+pouvait facil 1
+pouvait impliquer 1
+pouvait impliquer de 1
+pouvait se 1
+pouvait se montrer 1
+pouvait sy 1
+pouvait sy attendr 1
+pouvait traiter 1
+pouvait y avoir 1
+pouvoir 5
+pouvoir construir 2
+pouvoir construir la 1
+pouvoir d eclench 1
+pouvoir d ecouper 1
+pouvoir d etecter 1
+pouvoir d eterminer 1
+pouvoir d terminer 1
+pouvoir esp 1
+pouvoir esp erer 1
+pouvoir estimer 1
+pouvoir estimer ce 1
+pouvoir etr 2
+pouvoir etr partag 1
+pouvoir etr restaur 1
+pouvoir etr util 1
+pouvoir etud 1
+pouvoir etud la 1
+pouvoir extrair 1
+pouvoir extrair ik 1
+pouvoir g rer 1
+pouvoir le 2
+pouvoir le combiner 1
+pouvoir le restaurer 1
+pouvoir lib 1
+pouvoir lib erer 1
+pouvoir limiter 1
+pouvoir limiter la 1
+pouvoir localiser 1
+pouvoir localiser ce 1
+pouvoir m elanger 1
+pouvoir majorer 1
+pouvoir majorer leur 1
+pouvoir partager 1
+pouvoir partager un 1
+pouvoir r ealiser 1
+pouvoir r soudr 1
+pouvoir situer 1
+pouvoir situer ain 1
+pouvoir substituer 1
+pouvoir substituer de 1
+pouvoir tirer 1
+pouvoir tirer de 1
+pouvoir tr 1
+pouvoir traiter 1
+pouvoir traiter au 1
+pouvon 2
+pouvon ain 1
+pouvon ain calculer 1
+pouvon apporter 1
+pouvon apporter aucun 1
+pouvon citer 1
+pouvon citer la 1
+pouvon conclur 1
+pouvon conclur qu 1
+pouvon d esigner 1
+pouvon donc 1
+pouvon donc fusionner 1
+pouvon maint 1
+pouvon maint calculer 1
+pouvon surestimer 1
+pouvon surestimer leff 1
+powel 1
+powel se 1
+power 55
+power abstract 3
+power adver 1
+power aggreg 1
+power aggreg featur 1
+power an educ 1
+power and eff 1
+power and flec 2
+power and inclus 1
+power and learn 1
+power and memor 1
+power and rel 1
+power architectur 1
+power architectureindep 1
+power ba 1
+power but hard 1
+power but incr 1
+power capabil 1
+power capabil correspon 1
+power constraint 2
+power constraint form 1
+power constraint system 1
+power desir 1
+power developm 1
+power developm tool 1
+power direct transl 2
+power enough match 1
+power failur 1
+power failur aler 1
+power featur 1
+power framework 2
+power framework wh 1
+power gain 1
+power in theor 1
+power is desir 1
+power langu 1
+power langu featur 1
+power level 1
+power li 1
+power loc 1
+power loc improv 1
+power mach 1
+power mach model 1
+power mean 1
+power method 1
+power model 3
+power model inclus 1
+power new techniqu 1
+power not 2
+power of branch 1
+power of constraint 1
+power of equ 1
+power of infl 1
+power of loc 1
+power of tempor 1
+power of tp 1
+power of tr 1
+power oper 1
+power pattern 1
+power pattern match 1
+power piec 1
+power proc 1
+power proc connect 1
+power program 1
+power program tool 1
+power refin 1
+power refin algorithm 1
+power reuseb 1
+power reuseb softwar 1
+power se 3
+power system 3
+power than tur 1
+power to model 1
+power to predict 1
+power to specif 1
+power typ 1
+powerparallel 1
+pp 47
+pp ab 1
+pp ab qq 1
+pp assoc 1
+pp bin 1
+pp broadcast 1
+pp distribut 1
+pp merg 1
+pp opt 1
+pp opt est 1
+pp opt fs 1
+pp opt perm 1
+pp opt util 1
+pp select 1
+pp.1 1
+pp.1019 1
+pp.102 1
+pp.11 1
+pp.117 1
+pp.133 1
+pp.1464 1
+pp.1469 1
+pp.147 1
+pp.157 1
+pp.161 1
+pp.165 1
+pp.2025 1
+pp.221 1
+pp.225 1
+pp.229 1
+pp.23 1
+pp.247 1
+pp.313 1
+pp.323 1
+pp.461 1
+pp.475 1
+pp.48 1
+pp.519 1
+pp.559 1
+pp.596 1
+pp.619 1
+pp.88 1
+pp.893 1
+pp.916 1
+pp.99 1
+pp2 1
+pp84 1
+ppav 1
+ppav nbnod 1
+ppav nbnod pav 1
+ppb 1
+ppcm 1
+ppcm afin 1
+ppcm afin de 1
+ppcp94 1
+ppg 1
+ppig 1
+ppq 2
+ppq ap 1
+ppt 1
+pq 5
+pq abp 1
+pq el 1
+pq produit 1
+pq produit de 1
+pq record 1
+pqp 1
+pqp q0r 1
+pr 125
+pr 3.eqn 1
+pr a block 1
+pr a ca 1
+pr a calculus 1
+pr a caus 1
+pr a collect 1
+pr a compar 1
+pr a compil 1
+pr a compreh 2
+pr a coupl 1
+pr a dat 1
+pr a deliber 1
+pr a doubl 1
+pr a fam 1
+pr a fin 1
+pr a fl 1
+pr a gener 1
+pr a learn 1
+pr a method 2
+pr a model 1
+pr a neur 1
+pr a parallel 3
+pr a port 1
+pr a precc 1
+pr a protocol 1
+pr a qualit 1
+pr a refin 1
+pr a research 1
+pr a rich 1
+pr a ser 2
+pr a softwar 1
+pr a strateg 1
+pr a stud 2
+pr a taxonom 1
+pr a techniqu 3
+pr a theor 1
+pr a theorem 1
+pr a throughput 1
+pr a unif 1
+pr a view 1
+pr act 1
+pr act prompt 1
+pr addit 1
+pr addit result 1
+pr ae 1
+pr ae 9j 1
+pr ae mac 1
+pr ae xj0 1
+pr ae y1 1
+pr algorithm 1
+pr an 1
+pr an activ 1
+pr an algorithm 2
+pr an an 4
+pr an appl 1
+pr an eff 1
+pr an exampl 3
+pr an experim 1
+pr an implem 1
+pr an inform 1
+pr an integr 1
+pr an lit 1
+pr an overview 3
+pr and con 2
+pr and conv 1
+pr and disc 1
+pr and dist 1
+pr and fact 1
+pr and funct 1
+pr and geometer 1
+pr and illustr 1
+pr and intern 1
+pr and mcgraw 1
+pr and part 1
+pr and poetr 1
+pr and post 1
+pr and postcondit 2
+pr and pr 1
+pr and thereb 1
+pr and val 1
+pr and verif 1
+pr andg 1
+pr appl 1
+pr appl compon 1
+pr ar aver 1
+pr ar defin 2
+pr ar ech 1
+pr ar eff 1
+pr ar incorpor 1
+pr ar prim 1
+pr ar transl 1
+pr argum 1
+pr as compl 1
+pr as nonrecur 1
+pr as norm 1
+pr as uninterpr 1
+pr assum 1
+pr at acm 1
+pr axiom 1
+pr ba 1
+pr ba modl 1
+pr by abstract 1
+pr by ad 1
+pr by dongar 1
+pr by hil 1
+pr c dem 1
+pr c dent 1
+pr cach 1
+pr cal 2
+pr calculus 4
+pr calculus adopt 1
+pr calculus4 1
+pr can 1
+pr can proc 1
+pr can proceed 1
+pr can prompt 1
+pr car 1
+pr certain key 1
+pr ci 1
+pr ci bien 1
+pr ci de 1
+pr ci ment 1
+pr ci quil 1
+pr circumv 1
+pr clair 1
+pr clair lobjectif 1
+pr closur 1
+pr collect 1
+pr com 2
+pr com hypoth 1
+pr com point 1
+pr condit 1
+pr congru 1
+pr consc 1
+pr consc de 1
+pr d az 1
+pr dan 1
+pr dan le 1
+pr de 1
+pr de vu 1
+pr definit 1
+pr del 1
+pr deliber 1
+pr detect 1
+pr determin 2
+pr determin multicast 1
+pr determin sub 1
+pr dict 1
+pr dir 1
+pr dir ain 1
+pr dun 1
+pr dun accr 1
+pr dun gest 1
+pr dun liaison 1
+pr each ph 1
+pr eal 2
+pr eal de 1
+pr ealabl 1
+pr ealabl publ 1
+pr eambl 1
+pr earl 2
+pr ec 5
+pr ec dan 1
+pr ec de 3
+pr ec du 3
+pr ec ed 1
+pr ec edant 1
+pr ec edem 2
+pr ec edent 4
+pr ec ee 1
+pr ec ement 3
+pr ec en 1
+pr ec es 1
+pr ec est 1
+pr ec la 2
+pr ec le 2
+pr ec ma 1
+pr ec pour 1
+pr ec pr 1
+pr ec prioritair 1
+pr ec qu 1
+pr ec rel 1
+pr ec sont 1
+pr ec suiv 1
+pr ec tout 1
+pr ecaut 1
+pr ecaut suiv 1
+pr echarg 1
+pr echarg de 1
+pr echarg engendr 1
+pr echarg implicit 1
+pr echarg ou 1
+pr echarg sont 1
+pr ecieus 1
+pr ecipiter 1
+pr eciser 2
+pr eciser certain 1
+pr eciser com 1
+pr eciser dan 1
+pr eciser la 1
+pr eciser le 1
+pr ecison 3
+pr ecison dan 1
+pr ecison le 1
+pr ecison qu 1
+pr econ 1
+pr econ ee 1
+pr econiser 1
+pr econiser plut 1
+pr econison 1
+pr econison est 1
+pr ed 3
+pr ed ecesseur 1
+pr ed efin 1
+pr edicat 1
+pr edicat appar 1
+pr edicat appel 1
+pr edicat arithm 1
+pr edicat attach 1
+pr edicat auxiliair 1
+pr edicat avec 1
+pr edicat cal 1
+pr edicat cibl 1
+pr edicat classiqu 1
+pr edicat com 1
+pr edicat combiner 1
+pr edicat comport 1
+pr edicat compr 1
+pr edicat concat 1
+pr edicat constitu 1
+pr edicat cont 1
+pr edicat correspon 1
+pr edicat cour 1
+pr edicat dacc 1
+pr edicat dan 1
+pr edicat darit 1
+pr edicat de 1
+pr edicat derefer 1
+pr edicat dext 1
+pr edicat disj 1
+pr edicat dunif 1
+pr edicat equiv 1
+pr edicat est 1
+pr edicat extrair 1
+pr edicat facilit 1
+pr edicat geler 1
+pr edicat inclu 1
+pr edicat init 1
+pr edicat instruc 1
+pr edicat le 1
+pr edicat loop 1
+pr edicat me 1
+pr edicat memberchk 1
+pr edicat metac 1
+pr edicat modif 1
+pr edicat ne 1
+pr edicat non 1
+pr edicat opaqu 1
+pr edicat par 1
+pr edicat partit 1
+pr edicat peut 1
+pr edicat pour 1
+pr edicat pr 1
+pr edicat proc 1
+pr edicat prolog 1
+pr edicat qsort 1
+pr edicat qu 1
+pr edicat saf 1
+pr edicat sappu 1
+pr edicat soft 1
+pr edicat sont 1
+pr edicat sp 1
+pr edicat tel 1
+pr edicat unif 1
+pr edicat verif 1
+pr edict 1
+pr edir 1
+pr edir car 1
+pr edir le 1
+pr edit 1
+pr eec 1
+pr ef 4
+pr ef er 2
+pr ef erent 1
+pr ef erentiel 1
+pr ef eron 1
+pr eff 1
+pr eff implem 1
+pr efiltr 1
+pr efiltr de 1
+pr elig 1
+pr eliminair 2
+pr eliminair bien 1
+pr eliminair de 1
+pr eliminair dun 1
+pr eliminair ont 1
+pr eliminair se 1
+pr elsewh 1
+pr ematur 2
+pr ematur ee 1
+pr empir 1
+pr empir result 1
+pr en 2
+pr en compt 2
+pr entr 1
+pr eoccup 3
+pr eoccup dun 1
+pr eoccup fondam 1
+pr eoccup pa 1
+pr eoccuper 2
+pr eoccuper de 2
+pr eparer 1
+pr eparer le 1
+pr erequ 1
+pr es 3
+pr es classiqu 1
+pr es dacc 1
+pr es de 3
+pr es du 1
+pr es dun 2
+pr es habituel 1
+pr es ou 1
+pr es suiv 1
+pr es tous 1
+pr esager 1
+pr esager un 1
+pr esent 6
+pr esent au 2
+pr esent br 1
+pr esent com 1
+pr esent dan 2
+pr esent de 2
+pr esent deux 1
+pr esent direct 1
+pr esent du 1
+pr esent ee 4
+pr esent egal 2
+pr esent es 2
+pr esent ic 3
+pr esent la 1
+pr esent le 4
+pr esent notr 1
+pr esent pa 1
+pr esent physiqu 1
+pr esent pour 1
+pr esent qu 1
+pr esent sommair 1
+pr esent sous 1
+pr esent suffisam 1
+pr esent suiv 1
+pr esent tout 1
+pr esent un 4
+pr esenter 4
+pr esenter dav 1
+pr esenter de 2
+pr esenter le 1
+pr esenter pa 1
+pr esenter un 1
+pr esenteron 1
+pr esenteron de 1
+pr esenteron deux 1
+pr eserv 1
+pr eserv de 1
+pr eserver 2
+pr eserver la 1
+pr eserver lam 1
+pr esid 2
+pr esid paul 1
+pr esider 2
+pr esider ce 1
+pr esider la 1
+pr esup 1
+pr esup ee 1
+pr eten 1
+pr eten pal 1
+pr eten qu 1
+pr etendr 1
+pr etendr qu 1
+pr etendu 1
+pr etendu assez 1
+pr etent 2
+pr etent bien 1
+pr etrait 1
+pr etrait usuel 1
+pr ev 1
+pr evalu 1
+pr evid 1
+pr evisibl 1
+pr evoir 1
+pr evoir un 1
+pr experim 2
+pr experim dat 1
+pr experim result 1
+pr fin 1
+pr fin result 1
+pr fl 1
+pr fl questionnair 1
+pr for ap 1
+pr for cluster 1
+pr for datab 1
+pr for learn 1
+pr for scfq 1
+pr for vect 1
+pr funct 1
+pr fx 1
+pr fy1 1
+pr he demonstr 1
+pr help 1
+pr help inform 1
+pr hierarch 1
+pr identif 2
+pr identif construc 1
+pr if nec 1
+pr in correspon 1
+pr in detail 1
+pr in fig 1
+pr in figur 2
+pr in intl 1
+pr in microcod 1
+pr in paraphr 1
+pr in sec 1
+pr in sect 10
+pr in tabl 4
+pr inc 2
+pr incorpor 1
+pr incorpor addit 1
+pr indistingu 1
+pr input 1
+pr intriangl 1
+pr invoc 1
+pr is ba 1
+pr is compil 1
+pr is defin 1
+pr is design 1
+pr is implem 1
+pr is inclus 1
+pr is satisf 1
+pr isol 1
+pr isol ement 1
+pr lim 1
+pr loc 1
+pr lock 1
+pr log 3
+pr log program 2
+pr ltd 1
+pr man exampl 1
+pr man kind 1
+pr may ad 1
+pr min 1
+pr must cover 1
+pr n.y 1
+pr no condit 1
+pr nod 1
+pr numer 1
+pr numer challeng 1
+pr occup 1
+pr of abstract 1
+pr of altern 1
+pr of artif 1
+pr of babel 1
+pr of build 1
+pr of compon 1
+pr of control 1
+pr of detect 1
+pr of distribut 1
+pr of dual 1
+pr of dupl 1
+pr of fail 1
+pr of fault 2
+pr of implicit 1
+pr of inequ 1
+pr of inst 1
+pr of irrelev 1
+pr of kcm 1
+pr of lin 1
+pr of lost 1
+pr of measur 1
+pr of multipl 1
+pr of no 2
+pr of object 1
+pr of proc 1
+pr of prompt 1
+pr of signif 1
+pr of spac 1
+pr of strong 1
+pr of subtyp 1
+pr of undetect 1
+pr of unexpect 1
+pr of var 1
+pr of verb 1
+pr opportun 1
+pr optim 1
+pr optim upper 1
+pr or ab 1
+pr or pr 1
+pr or rel 1
+pr our comput 1
+pr our conclus 1
+pr our interprocedur 1
+pr our reflec 1
+pr our reflect 1
+pr oxford 1
+pr paid 1
+pr par 3
+pr par de 2
+pr parameter 2
+pr parameter show 1
+pr pasc 1
+pr perform 4
+pr perform memor 1
+pr perform result 1
+pr person 1
+pr person appl 1
+pr pr 2
+pr prm 1
+pr prmyp1 1
+pr prmyp1 prmyp2 1
+pr problem 1
+pr proc 1
+pr procedur 1
+pr procedur avg2 1
+pr processingpartialevaluationpost 1
+pr processingpartialevaluationpost proc 1
+pr program 1
+pr program execut 1
+pr project 1
+pr quit wid 1
+pr r eduit 1
+pr result 1
+pr result using 1
+pr router 1
+pr s techniqu 1
+pr satisf 1
+pr satisf algorithm 1
+pr schedl 1
+pr schedl window 1
+pr selecttest 1
+pr sent 2
+pr sent ce 1
+pr sent un 1
+pr senter 2
+pr senter de 1
+pr senter du 1
+pr ser 1
+pr ser nh2 1
+pr serv 1
+pr simil 1
+pr simil stat 1
+pr som result 1
+pr som stat 1
+pr som suff 1
+pr specif 1
+pr specif giv 1
+pr specl 1
+pr specl comput 1
+pr st 1
+pr stat 1
+pr styl 1
+pr suggest 1
+pr symbol 3
+pr symbol occur 1
+pr symbol r1 1
+pr symbol ri 1
+pr symbol var 1
+pr t0 1
+pr tak 1
+pr th accept 1
+pr th an 1
+pr th bnf 1
+pr th conclus 1
+pr th dat 1
+pr th deriv 1
+pr th detail 2
+pr th experim 1
+pr th form 1
+pr th impact 1
+pr th pr 1
+pr th problem 1
+pr th program 1
+pr th proper 1
+pr th rat 1
+pr th result 1
+pr th rol 1
+pr th technolog 1
+pr th transform 1
+pr th weakest 1
+pr that ind 1
+pr theorem 1
+pr thr intuit 1
+pr to degrad 1
+pr to gener 1
+pr to inclus 1
+pr to misunderstand 1
+pr to pay 2
+pr to proc 1
+pr to try 1
+pr top 1
+pr trabalh 1
+pr trabalh discut 1
+pr tw drawback 1
+pr tw se 1
+pr tw switch 1
+pr typ 1
+pr und 1
+pr valu 2
+pr var 1
+pr wa defin 1
+pr wcon 1
+pr we mean 1
+pr we pay 1
+pr wer compil 1
+pr wh valu 1
+pr which ext 1
+pr which ind 1
+pr which receiv 1
+pr workst 1
+pr workst softwar 1
+pr writ 2
+pr x oper 1
+pr x sum 1
+pr xp 1
+pr xp nod 1
+pr. 3
+pr0 1
+pr0 pr1 1
+pr0 pr1 pr2 1
+pr0pr2 1
+pr0pr2 pr1pr0 1
+pr0pr2 pr1pr0 pr0 1
+pr1 3
+pr1 and pr2 1
+pr1 pr0pr2 1
+pr1 pr0pr2 pr1pr0 1
+pr1 pr2 2
+pr150 1
+pr1pr0 1
+pr1pr0 pr0 1
+pr1pr0 pr0 pr1 1
+pr2 3
+pr2 with scop 1
+pr60 1
+pr86 1
+pr93 1
+pr95 1
+prab 1
+prabhakaran 1
+prabhu 1
+prac 1
+pract 85
+pract al dep 1
+pract algorithm 3
+pract and complec 1
+pract and design 1
+pract and exper 4
+pract and optim 1
+pract and port 1
+pract and real 1
+pract and theor 1
+pract anyw 1
+pract appl 7
+pract approach 1
+pract as follow 1
+pract aspect 1
+pract be implem 1
+pract ca 2
+pract conclus 1
+pract control 1
+pract control regr 1
+pract decompiler 1
+pract decompiler compiler 1
+pract definit 1
+pract effect 1
+pract engineer 1
+pract ergonom 1
+pract ergonom methodolog 1
+pract exampl 2
+pract exampl show 1
+pract exclus 1
+pract exper 2
+pract exper collect 1
+pract fl 1
+pract fl blown 1
+pract form 1
+pract form techniqu 1
+pract framework 1
+pract goal 1
+pract hardwar 1
+pract implem 2
+pract implem du 1
+pract import 1
+pract in hierarch 1
+pract in lp 1
+pract integer 2
+pract integer program 2
+pract interest 4
+pract is correct 1
+pract is justif 1
+pract is requir 1
+pract issu 2
+pract issu rel 1
+pract mach 1
+pract markov 1
+pract markov chain 1
+pract mathemat 1
+pract mathemat research 1
+pract moat 1
+pract moat router 1
+pract multiproc 1
+pract multiproc schedl 1
+pract network 1
+pract network appl 1
+pract no differ 1
+pract occam 1
+pract occam program 1
+pract of bottleneck 1
+pract of constraint 1
+pract of parallel 1
+pract of sequ 1
+pract of softwar 2
+pract of tempor 2
+pract of test 1
+pract optim 1
+pract or phy 1
+pract parallel 1
+pract perspect 1
+pract po 1
+pract point 3
+pract problem 2
+pract problem involut 1
+pract program 1
+pract program deriv 1
+pract purp 2
+pract random 1
+pract random approach 1
+pract real world 1
+pract reason 1
+pract relev 1
+pract relev dec 1
+pract schedl 1
+pract schedl algorithm 1
+pract separ 1
+pract signif 1
+pract system 1
+pract th bottleneck 1
+pract th number 1
+pract tim 1
+pract tim pressur 1
+pract tool 1
+pract tracer 1
+pract unchang 1
+pract us 6
+pract us proper 1
+pract valu 1
+pract ver 1
+pract ver interest 1
+pract viewpoint 1
+pract4 1
+practitioner 4
+practitioner approach 1
+practitioner oper 1
+prad 2
+praeter 1
+praeter necessitatatem 1
+pragm 3
+pragm maint 1
+pragm proc 1
+pragmat 1
+pragmat of cour 1
+pragmatiqu 1
+pragu 2
+prah 2
+pram 9
+pram algorithm 3
+pram and const 1
+pram model 2
+pram oper 1
+pram respect 1
+pram siml 1
+pram siml techniqu 1
+pram th algorithm 1
+pram typ 1
+pram typ algorithm 1
+pramanik 2
+prasad 1
+prasan 1
+prat 5
+prat en 1
+prat en vu 1
+prat proc 1
+prat proc log 1
+pratiqu 5
+pratiqu com 1
+pratiqu com lensembl 1
+pratiqu du 1
+pratiqu du th 1
+pratiqu ee 1
+pratiqu ee dan 1
+pratiqu en 1
+pratiqu en appliqu 1
+pratiqu et appliqu 1
+pratiqu inchang 1
+pratiqu le 1
+pratiqu le instruc 1
+pratiqu puisquil 1
+pratiqu puisquil fournit 1
+pratiqu qu 1
+pratiqu qu ce 1
+pratiqu se 1
+pratiqu se sont 1
+pravin 1
+pravin bhagwat 1
+prbd 1
+prcd 1
+prcd of procedur 1
+prdc 1
+prdc be procedur 1
+prealloc 1
+prealloc calcl 1
+prealloc calcl le 1
+prealloc et postalloc 1
+prec 58
+prec a form 1
+prec about why 1
+prec abstract 1
+prec alignm 1
+prec an expr 1
+prec analogu 1
+prec and detail 1
+prec and eff 1
+prec and reason 1
+prec and succeed 1
+prec arithm 1
+prec arithm del 1
+prec asymptot 1
+prec asymptot behavior 1
+prec board 2
+prec board spac 2
+prec by mov 1
+prec cel 1
+prec character 3
+prec constraint 2
+prec constraint me 1
+prec correspon 1
+prec count 1
+prec dat 1
+prec dat complec 1
+prec definit 1
+prec den 1
+prec descript 1
+prec du 1
+prec each tok 1
+prec eclip 1
+prec eclip indomain 1
+prec evalu 1
+prec exampl 1
+prec float 3
+prec float point 3
+prec forml 2
+prec funct 1
+prec graph 1
+prec ident 1
+prec identif 2
+prec identif shar 1
+prec if 8x1 1
+prec improv 1
+prec improv suff 1
+prec in order 1
+prec ind 1
+prec integer 1
+prec integer a.9 1
+prec integer funct 1
+prec integer smaller 1
+prec langu 1
+prec last cal 1
+prec list 1
+prec list cl 1
+prec list control 1
+prec list return 1
+prec map 1
+prec mean 1
+prec measur 1
+prec narrow 1
+prec narrow step 1
+prec order 2
+prec peak 1
+prec peak singl 1
+prec program 1
+prec record 1
+prec recr 1
+prec rel 2
+prec repr 1
+prec result 1
+prec saf 1
+prec saf algorithm 1
+prec saf test 1
+prec se 1
+prec sect 2
+prec sect.1 1
+prec segm 1
+prec segm requir 1
+prec self 1
+prec self modif 1
+prec solut 1
+prec solut techniqu 1
+prec specif 1
+prec st 2
+prec stat 1
+prec such self 1
+prec supergraph 1
+prec t tim 1
+prec tabl 1
+prec tail 1
+prec tail env 1
+prec test 1
+prec test select 1
+prec th dot 1
+prec th lim 1
+prec th not 1
+prec th rel 1
+prec th se 1
+prec th test 1
+prec than cal 1
+prec typ 1
+prec we prov 1
+prec wh 1
+prec which test 1
+prec with funct 1
+precaut 2
+precaut in mind 1
+precc 1
+precc about ten 1
+precc al scor 1
+precc alw shift 1
+precc attempt 1
+precc can handl 1
+precc can mak 1
+precc can match 1
+precc can us 1
+precc cod 1
+precc compil 1
+precc compiler 1
+precc compiler compiler 1
+precc construc 1
+precc decl 1
+precc decl sem 1
+precc default 1
+precc default lexer 1
+precc design 1
+precc design assum 1
+precc discharg 1
+precc discharg act 1
+precc gener 1
+precc grammar 1
+precc grammar specif 1
+precc guardedch 1
+precc impl 1
+precc in comparison 1
+precc infinit 1
+precc infinit look 1
+precc infinit lookahead 1
+precc is cur 1
+precc is def 1
+precc is modl 1
+precc is shown 1
+precc kernel 1
+precc kernel libr 1
+precc langu 1
+precc parser 1
+precc parser definit 1
+precc parser nam 1
+precc parser specif 1
+precc prov 1
+precc request 1
+precc reserv 1
+precc run 1
+precc run quick 1
+precc script 1
+precc sem 1
+precc specif 1
+precc specif allow 1
+precc specif differ 1
+precc specif empl 1
+precc specif fil 1
+precc specif script 1
+precc specif us 1
+precc syntac 1
+precc tool 1
+precc tool allow 1
+preceed 2
+preceed exampl 1
+preceed exampl becom 1
+preceed proof 1
+preceed proof maintain 1
+precipit 1
+precipit th sever 1
+precison 1
+precison qu 1
+precison qu ce 1
+preclus 2
+preclus hardwar 1
+preclus hardwar support 1
+preclus th us 1
+precompiler 1
+precomput 1
+preconceiv 1
+precondit 7
+precondit avail 1
+precondit for herm 1
+precondit ha becom 1
+precondit is conjoin 1
+precondit is fulfil 1
+precondit method 1
+precondit of stat 1
+precondit result 1
+precondit result es 1
+precondit sem 1
+precondit st 1
+preconditioner 1
+precur 1
+precur mult 1
+precur mult level 1
+predec 6
+predec a pointer 1
+predec both resid 1
+predec by replac 1
+predec ni 1
+predec of x1 1
+predec resid 1
+predec st 1
+predec to nod 1
+predefin 10
+predefin accur 1
+predefin aggreg 1
+predefin as part 1
+predefin boolean 1
+predefin boolean expr 1
+predefin cl 1
+predefin condit 1
+predefin equ 1
+predefin execut 1
+predefin execut design 1
+predefin funct 1
+predefin maxim 1
+predefin maxim transm 1
+predefin oper 1
+predefin or dynam 1
+predefin or user 1
+predefin order 1
+predefin prec 1
+predefin prompt 1
+predefin prompt strateg 1
+predefin reader 1
+predefin schedl 1
+predefin schedl csmv 1
+predefin strateg 1
+predefin threshold 1
+predescrib 1
+predescrib sensit 1
+predescrib sensit threshold 1
+predetermin 4
+predetermin const 1
+predict 27
+predict a perform 1
+predict abil 1
+predict addr 1
+predict and control 1
+predict and grammat 1
+predict and retrief 1
+predict and sign 1
+predict and subst 1
+predict and verif 1
+predict ar compar 1
+predict behavior 1
+predict branch 1
+predict branch outcom 1
+predict by eqn 1
+predict cap 1
+predict capabil 1
+predict classif 1
+predict correct 2
+predict correct interior 1
+predict correct method 1
+predict count 1
+predict from tim 1
+predict ha occur 1
+predict in adv 1
+predict incr 1
+predict is model 1
+predict is shown 1
+predict jump 1
+predict manner 1
+predict nod 1
+predict of ac 1
+predict of chem 1
+predict of laser 1
+predict of memor 1
+predict of numer 1
+predict of sunspot 1
+predict on event 1
+predict output 1
+predict perform 1
+predict predict 1
+predict predict sep 1
+predict problem 1
+predict produc 1
+predict qu 1
+predict reason 1
+predict relationship 1
+predict relev 1
+predict result 1
+predict sep 1
+predict sinc min 1
+predict sunspot 1
+predict th execut 1
+predict th form 1
+predict th futur 1
+predict th impact 1
+predict th se 1
+predict thr collap 1
+predict tim 1
+predict using 1
+predict valu 1
+predict var 1
+predict var prop 1
+predict we giv 1
+predict wer mad 1
+predict which st 1
+predictionk 1
+predom 1
+predomin 2
+predomin govern 1
+preempt 2
+preempt mod 1
+preempt occur 1
+preempt openshop 1
+preempt openshop problem 1
+preempt prior 1
+preempt prior schedl 1
+preempt schedl 1
+preempt schedl problem 1
+preempt ver 1
+pref 17
+pref ab 1
+pref and monot 1
+pref ar select 1
+pref comput 1
+pref fa 1
+pref for tr 1
+pref form7 1
+pref of d0 1
+pref of p0 1
+pref of tr 1
+pref of vi 1
+pref of vj 1
+pref of word 1
+pref of xg 1
+pref st 1
+pref start 1
+pref sum 1
+pref th nam 1
+pref u0 1
+pref u0 xyc1s1 1
+pref x0 1
+prefabr 1
+prefabr compon 1
+prefer 30
+prefer act 1
+prefer addr 1
+prefer al dec 1
+prefer approach 1
+prefer be strong 1
+prefer cal 1
+prefer cal plac 1
+prefer corner 1
+prefer for coar 1
+prefer for pract 1
+prefer in conjunct 1
+prefer of featur 1
+prefer on output 1
+prefer or default 1
+prefer serv 1
+prefer serv addr 1
+prefer substr 1
+prefer substr famil 1
+prefer th explan 1
+prefer th strateg 1
+prefer to decr 1
+prefer to find 1
+prefer to plot 1
+prefer to tak 1
+prefer to uncom 1
+prefer to us 2
+prefer usag 1
+prefer user 1
+prefer with respect 1
+prefetch 4
+prefetch and multithread 1
+prefetch strateg 1
+prefetch unit 1
+prefetch unit connect 1
+prelimin 28
+prelimin condit 1
+prelimin exper 1
+prelimin investig 1
+prelimin investig show 1
+prelimin kernel 1
+prelimin kernel langu 1
+prelimin perform 1
+prelimin perform dat 1
+prelimin ph 1
+prelimin ph.5 1
+prelimin quest 1
+prelimin regr 1
+prelimin regr test 1
+prelimin report 1
+prelimin repr 1
+prelimin repr conver 1
+prelimin result 4
+prelimin result suggest 1
+prelimin siml 1
+prelimin siml result 1
+prelimin stud 2
+prelimin stud show 1
+prelimin surv 1
+prelimin system 1
+prelimin system specif 1
+prelimin ver 7
+prelimin ver appear 1
+prelimin work 1
+prelimin work suggest 1
+prelinger 1
+prelus 1
+prem 13
+prem a avoir 1
+prem a constater 1
+prem acc 1
+prem acc es 1
+prem appel 1
+prem appel inclus 1
+prem ar cut 1
+prem ar prov 1
+prem argum 1
+prem argum dan 1
+prem argum de 1
+prem argum discrimin 1
+prem argum du 1
+prem argum la 1
+prem argum ne 1
+prem aspect 1
+prem aux 1
+prem avec 1
+prem bloc 1
+prem bloc du 1
+prem but de 1
+prem but du 1
+prem but dun 1
+prem but exclus 1
+prem ca 2
+prem ca dan 1
+prem ca de 1
+prem ca du 1
+prem ca est 1
+prem ca le 1
+prem ca sel 1
+prem champ 1
+prem champ argum 1
+prem compilateur 1
+prem compilateur prolog 1
+prem coup 1
+prem coup de 1
+prem coupl 1
+prem coupl de 1
+prem d esav 1
+prem dan 1
+prem dan la 1
+prem de 2
+prem de la 2
+prem dun 1
+prem dun pag 1
+prem el 2
+prem el ement 2
+prem enf 1
+prem enf com 1
+prem enregister 1
+prem enregister sur 1
+prem entr 1
+prem entr eux 1
+prem er 3
+prem er act 1
+prem er adr 1
+prem er approch 1
+prem er approxim 1
+prem er boucl 1
+prem er caus 1
+prem er cel 1
+prem er claus 1
+prem er colon 1
+prem er comp 1
+prem er con 1
+prem er condit 2
+prem er coupur 1
+prem er de 1
+prem er direct 1
+prem er don 1
+prem er est 2
+prem er etap 3
+prem er etud 2
+prem er evalu 1
+prem er ex 1
+prem er exp 1
+prem er famil 1
+prem er fo 1
+prem er impl 1
+prem er instruc 1
+prem er lign 1
+prem er mach 1
+prem er mi 1
+prem er modif 1
+prem er occur 1
+prem er pa 1
+prem er pan 1
+prem er part 1
+prem er ph 1
+prem er qu 1
+prem er raison 1
+prem er requ 1
+prem er sect 1
+prem er solut 1
+prem er sourc 1
+prem er tout 1
+prem er transform 1
+prem er util 1
+prem er valeur 1
+prem er var 1
+prem er variabl 1
+prem er ver 2
+prem et le 1
+prem et tr 1
+prem etant 1
+prem for object 1
+prem ind 2
+prem inutil 1
+prem inutil es 1
+prem lieu 1
+prem livr 1
+prem livr de 1
+prem me 1
+prem me de 1
+prem nid 1
+prem ordr 2
+prem patron 1
+prem patron est 1
+prem point 2
+prem point ci 1
+prem point de 1
+prem point dioecil 1
+prem probl 1
+prem probl em 1
+prem r esultat 1
+prem re impr 1
+prem re part 1
+prem re transform 1
+prem register 1
+prem register argum 1
+prem rem 1
+prem rem ed 1
+prem ressort 1
+prem sav 1
+prem sur 1
+prem syst 1
+prem syst em 1
+prem tableau 1
+prem tableau de 1
+prem temp 3
+prem temp de 1
+prem temp nous 1
+prem temp un 1
+prem term 1
+prem term de 1
+prem th rl 1
+prem that modern 1
+prem to ensur 1
+prem travaux 1
+prem travaux concern 1
+prem travaux effectu 1
+prem typ 1
+prem typ dexp 1
+prem vecteur 1
+prem wh appl 1
+prematur 2
+prematur interrupt 1
+prematur interrupt unfold 1
+premedit 1
+premedit network 1
+premedit network architectur 1
+premerlan 1
+pren 4
+pren com 1
+pren com point 1
+pren com tail 1
+pren deux 1
+pren deux term 1
+pren en 3
+pren en compt 2
+pren en consid 1
+pren eoeectiv 1
+pren eoeectiv en 1
+pren habituel 1
+pren la 1
+pren la valeur 1
+pren le 2
+pren le compl 1
+pren pa 1
+pren pa en 1
+pren pour 1
+pren pour valeur 1
+pren prioritair 1
+pren prioritair en 1
+pren qu 1
+pren qu de 1
+pren respectiv 1
+pren respectiv le 1
+pren tout 1
+pren tout le 1
+pren toutef 1
+pren toutef pa 1
+pren ult 1
+pren ult erieur 1
+pren un 1
+pren un import 1
+prendr 3
+prendr a compt 1
+prendr com 1
+prendr com tail 1
+prendr con 1
+prendr con de 1
+prendr dan 1
+prendr dan le 1
+prendr de 1
+prendr de form 1
+prendr egal 1
+prendr en 2
+prendr en compt 2
+prendr le 1
+prendr le risqu 1
+prendr lun 1
+prendr lun de 1
+prendr not 1
+prendr not de 1
+prendr qu 1
+prendr qu le 1
+prendr soin 1
+prendr soin de 1
+prendr tout 1
+prendr tout le 1
+prendr un 1
+prendr un form 1
+prendr xk 1
+prenon 1
+prenon con 1
+prenon con de 1
+prent 32
+prent hal 32
+prent hal intern 3
+prenticeh 2
+preorder 3
+preorder th spar 1
+prep 1
+prepar 26
+prepar a se 1
+prepar and inject 1
+prepar and m.i 1
+prepar and sham 1
+prepar cost 1
+prepar cost tok 1
+prepar dat 1
+prepar for cal 1
+prepar for mlr 1
+prepar for techn 1
+prepar futur 1
+prepar futur ge 1
+prepar of impor 1
+prepar of list 1
+prepar softwar 1
+prepar th docum 1
+prepar their docum 2
+prepar to deal 1
+prepar to repeat 1
+preposit 1
+preposit phr 1
+preposit phr segm 1
+preprint 3
+preprint of ap 1
+preproc 16
+preproc algorithm 1
+preproc can improv 1
+preproc cost 1
+preproc cost inclus 1
+preproc directiv 1
+preproc for domain 1
+preproc further 1
+preproc further support 1
+preproc high degr 1
+preproc is requir 1
+preproc repr 1
+preproc rout 1
+preproc stag 1
+preproc step 5
+preproc step involut 1
+preproc step perform 1
+preproc th distribut 1
+preproc th sourc 1
+preproc th symbol 1
+preproc ver 1
+preproc ver lin 1
+preproc which transl 1
+preproc wil encapsl 1
+prepubl 1
+prepubl ser 1
+prequest 1
+prerequisit 3
+prescrib 4
+prescrib a sequ 1
+prescrib appropr 1
+prescrib appropr behaviour 1
+prescrib post 1
+prescrib post proc 1
+prescrib system 1
+prescrib system behaviour 1
+prescrib th correct 1
+prescrib th natur 1
+prescrib th speed 1
+prescript 7
+prescript approach 1
+prescript de 1
+prescript de mod 1
+prescript for agent 1
+prescript for succ 1
+prescript for system 1
+prescript hemingw 1
+prescript hemingw grammar 1
+prescript theor 1
+preserv 35
+preserv acr block 1
+preserv al univer 1
+preserv bal 1
+preserv by reduc 1
+preserv cl 2
+preserv cl transform 2
+preserv compat 1
+preserv compl 1
+preserv condit 1
+preserv condit simp 1
+preserv conflict 1
+preserv conflict ba 1
+preserv dur optim 1
+preserv edg 1
+preserv init 1
+preserv is adopt 1
+preserv it deriv 1
+preserv it proper 1
+preserv it textu 1
+preserv kind 1
+preserv list1 1
+preserv norm 1
+preserv of sem 1
+preserv of subtyp 1
+preserv of unfold 1
+preserv or grad 1
+preserv or improv 1
+preserv or reduc 1
+preserv part 1
+preserv part funct 1
+preserv proper 1
+preserv reduc 1
+preserv sen 1
+preserv sen prim 1
+preserv sent 1
+preserv sent coh 1
+preserv subtyp 1
+preserv system 1
+preserv system st 1
+preserv th acycl 1
+preserv th approxim 1
+preserv th benefit 1
+preserv th con 2
+preserv th concur 1
+preserv th connect 1
+preserv th decl 1
+preserv th equilater 1
+preserv th fin 1
+preserv th gaus 1
+preserv th intent 1
+preserv th ment 1
+preserv th near 1
+preserv th nonblock 1
+preserv th over 1
+preserv th proper 1
+preserv th rol 1
+preserv th se 1
+preserv th sem 1
+preserv th subtyp 1
+preserv tot 1
+preserv tot correct 1
+preserv transact 1
+preserv transform 1
+preserv unfold 1
+preserv whil maintain 1
+preserv zer 1
+preserv zer nonperiod 1
+presid 3
+presid fellowship 1
+presid which caus 1
+presid young 1
+presid young investig 1
+prespecif 1
+prespecif number 1
+presqu 2
+presqu aus 1
+presqu aus nombreux 1
+presqu identiqu 1
+presqu identiqu au 1
+presqu lin 1
+presqu lin eair 1
+pressman 1
+pressur 4
+pressur and quick 1
+pressur do ec 1
+pressur ec 1
+pressur g ye 1
+pressur sensit 1
+pressur sensit pl 1
+pressur to appear 1
+presum 9
+presum by using 1
+presum it worker 1
+presum suff 1
+presum suff knowledg 1
+presum th computer 1
+presum to ec 1
+presum to oper 1
+presum vi 1
+presup 1
+presup any specif 1
+pretendid 1
+pretendid me 1
+pretendid me de 1
+pretolan 1
+preusserstr 1
+preuv 3
+preuv con 1
+preuv con equ 1
+preuv de 1
+preuv de leur 1
+preuv lop 1
+preuv lop erateur 1
+preuv plus simpl 1
+preuv qu 1
+preuv qu le 1
+preuv soit 1
+prev 103
+prev a clear 1
+prev a constrain 1
+prev a garb 1
+prev a repl 1
+prev acc 1
+prev acquir 1
+prev acquir acc 1
+prev act 1
+prev addr 2
+prev al futur 2
+prev algebr 1
+prev algorithm 2
+prev approach 3
+prev approach explor 1
+prev approxim 1
+prev approxim algorithm 1
+prev arbitr 1
+prev arbitr ind 1
+prev architectur 1
+prev argum 1
+prev arriv 1
+prev assignm 1
+prev assoc 1
+prev assum 1
+prev attempt 1
+prev been car 1
+prev been visit 1
+prev benchmark 1
+prev best match 1
+prev bind 2
+prev block 1
+prev bound 1
+prev broadcast 1
+prev bus 1
+prev bus period 1
+prev bw 1
+prev bw valu 1
+prev ca 5
+prev caus 1
+prev cel 1
+prev ch 1
+prev ch fact 1
+prev cod 1
+prev cod redund 1
+prev column 1
+prev com 1
+prev compar2 1
+prev compl 2
+prev compl level 1
+prev compl subtransact 1
+prev comput 2
+prev comput quer 1
+prev comput timesl 1
+prev connect 1
+prev connect pair 1
+prev consider 1
+prev constraint 1
+prev constraint program 1
+prev cur 1
+prev cycl 1
+prev cycl wait 1
+prev dat 1
+prev datab 1
+prev datab st 1
+prev deadlock 2
+prev decl 1
+prev decomposit 1
+prev defin 1
+prev definit 1
+prev describ 5
+prev describ interfac 1
+prev describ techniqu 1
+prev detail 1
+prev detail algorithm 1
+prev dev 1
+prev disc 5
+prev disc mean 1
+prev dyad 1
+prev dyad conver 1
+prev each buck 1
+prev ec 2
+prev ec connect 1
+prev ec link 1
+prev edg 1
+prev edg inc 1
+prev eff 1
+prev eff algorithm 1
+prev effort 2
+prev equ 1
+prev establ 1
+prev event 1
+prev exampl 3
+prev execut 1
+prev exper 1
+prev exper6 1
+prev experim 2
+prev expon 1
+prev expon search 1
+prev fact 2
+prev fact valu 1
+prev ff 1
+prev ff color 1
+prev for po 1
+prev forml 1
+prev forml estim 1
+prev found 1
+prev found on 1
+prev from enter 1
+prev group 1
+prev group pointer 1
+prev handler 1
+prev held 1
+prev holder 1
+prev impl 1
+prev implem 1
+prev in decomp 1
+prev inform 1
+prev inform dissem 1
+prev inst 1
+prev introduc 1
+prev iter 4
+prev jump 1
+prev jump dest 1
+prev key 1
+prev key pr 1
+prev knowledg 1
+prev knowledg becom 1
+prev known 1
+prev known algorithm 1
+prev kybd 1
+prev layer 1
+prev learn 2
+prev learn algorithm 1
+prev learn method 1
+prev learn system 1
+prev learn tim 1
+prev lem 4
+prev lem impl 1
+prev level 3
+prev load 1
+prev loop 1
+prev loop nest 1
+prev maint 1
+prev me 3
+prev me object 1
+prev ment 4
+prev ment qu 1
+prev ment system 1
+prev method 3
+prev method av 1
+prev misclassif 1
+prev misclassif inst 1
+prev moment 1
+prev multicast 1
+prev multicast deadlock 1
+prev nearest 1
+prev nearest neighbour 1
+prev neighbor 1
+prev nod 1
+prev nod wh 1
+prev observ 1
+prev on 3
+prev on unav 1
+prev oper 2
+prev ordin 1
+prev ordin load 1
+prev pa 1
+prev pack 1
+prev paper 3
+prev paragraph 2
+prev parallel 1
+prev parallel experim 1
+prev ph 1
+prev point 1
+prev posit 1
+prev prob 1
+prev prob modif 1
+prev problem 2
+prev proc 1
+prev prop 2
+prev prop multilevel 1
+prev publ 2
+prev publ algorithm 1
+prev purp 1
+prev quest 1
+prev reflect 1
+prev reflect langu 1
+prev reinforc 1
+prev reinforc learn 1
+prev remark 1
+prev remov 1
+prev report 1
+prev report algorithm 1
+prev research 4
+prev result 4
+prev return 1
+prev return loc 1
+prev sa 1
+prev sa experim 1
+prev se 1
+prev sect 24
+prev sect allow 1
+prev sect captur 1
+prev select 1
+prev select object 1
+prev self 1
+prev self modif 1
+prev separ 1
+prev separ measur 1
+prev solut 1
+prev sort 1
+prev sort algorithm 1
+prev st 3
+prev stag 1
+prev starv 1
+prev step 5
+prev strateg 1
+prev stud 5
+prev stud interconnect 1
+prev stud jigsaw 1
+prev stud show 1
+prev stud succ 1
+prev stud switch 1
+prev subsect 2
+prev such self 1
+prev suggest 1
+prev system 2
+prev task 2
+prev techniqu 2
+prev term 1
+prev term result 1
+prev th block 1
+prev th computer 1
+prev th cpu 1
+prev th determ 1
+prev th med 1
+prev th network 1
+prev th system 1
+prev th top 1
+prev th viol 1
+prev that oper 1
+prev theorem 2
+prev thr lem 1
+prev tim 2
+prev tim step 1
+prev to produc 1
+prev to test 1
+prev tr 1
+prev tran 1
+prev ts 1
+prev ts cur 1
+prev tsg 1
+prev tw paragraph 1
+prev typ 1
+prev upd 1
+prev upd period 1
+prev us 1
+prev us self 1
+prev valu 3
+prev var 1
+prev vect 1
+prev ver 1
+prev visit 1
+prev visit ver 1
+prev wa defin 1
+prev week 1
+prev work 20
+prev work abcl 1
+prev work disc 1
+prev work rel 1
+prev1 1
+previousk 1
+prf1 1
+prfc 1
+prfc cig 1
+prfd1 1
+prfgt 1
+prfgt 1g 1
+prfgt 1g gt 1
+prfgt 1gz1 1
+prfgt gz0 1
+prfgt gz0 prfgt 1
+prfl 1
+prfl ljx 1
+prfl ljx xg 1
+prfmac1 1
+prfmac1 k cfxj 1
+prfx 1
+prfx g prfx 1
+prfx gprfx 1
+prfx t 1g 1
+prfx tg 1
+prfx ug 1
+prfxj0 1
+prg 2
+prg ou 1
+prg ou hjf 1
+prg tr 1
+prg tr10 1
+prim 56
+prim acc 1
+prim act 1
+prim act perform 1
+prim adv 2
+prim aim 1
+prim akin 1
+prim al 1
+prim al atoir 1
+prim algorithm 1
+prim algorithm construc 1
+prim alloc 1
+prim alloc cl 1
+prim alloc object 1
+prim alloc us 1
+prim allow 1
+prim and argum 1
+prim and dissem 1
+prim and reflect 1
+prim and secon 1
+prim and takeover 1
+prim argum 1
+prim at t1 1
+prim at tim 1
+prim ba 1
+prim ba structur 1
+prim ba taxonom 1
+prim backup 1
+prim backup approach 1
+prim backup protocol 1
+prim bar 1
+prim bar method 1
+prim c0 1
+prim c0 de 1
+prim can sen 1
+prim candid 1
+prim car 1
+prim ced 1
+prim cl 1
+prim cl describ 1
+prim claus 1
+prim com 1
+prim com cost 1
+prim concept.1 1
+prim conceptu 1
+prim conceptu relationship 1
+prim concern 1
+prim cop 1
+prim cop approach 1
+prim cop method 1
+prim d echec 1
+prim dat 1
+prim dat memor 1
+prim de 1
+prim de lim 1
+prim denot 1
+prim denot differ 1
+prim domin 1
+prim dual 1
+prim dual interior 1
+prim dual method 1
+prim dyad 1
+prim dyad rel 1
+prim el 2
+prim el theorem 1
+prim empl 1
+prim empl claus 1
+prim ensur 1
+prim equiv 1
+prim exact 1
+prim fail 2
+prim fail deep 1
+prim fail larit 1
+prim fail ne 1
+prim fail se 1
+prim featur 2
+prim for finit 1
+prim for influ 1
+prim for perceiv 1
+prim for unrel 1
+prim fork 1
+prim fork cr 1
+prim fork pour 1
+prim getp 1
+prim giv 1
+prim ident 1
+prim impl 1
+prim impl mi 1
+prim implem 2
+prim implem challeng 1
+prim in ps 1
+prim instruc 1
+prim instruc design 1
+prim introduc 1
+prim investig 1
+prim is forc 1
+prim is implem 1
+prim is repr 1
+prim join 1
+prim join pour 1
+prim key 2
+prim key valu 1
+prim lem 1
+prim level 1
+prim link 1
+prim mak 1
+prim mak channel 1
+prim mathemat 1
+prim mathemat definit 1
+prim me 1
+prim me xp 1
+prim med 1
+prim med car 1
+prim no matter 1
+prim not 1
+prim object 2
+prim oper 2
+prim oper impl 1
+prim or subscript 1
+prim pj 1
+prim polyhedr 1
+prim polyhedr sol 1
+prim pr 1
+prim pr del 1
+prim prepar 1
+prim prepar cost 1
+prim prob 1
+prim prob distribut 1
+prim problem 1
+prim problem assoc 1
+prim purp 1
+prim qu 1
+prim qu nous 1
+prim reader 1
+prim reader using 1
+prim reason 1
+prim receiv 1
+prim ref 1
+prim ref prim 1
+prim rel 1
+prim relationship 1
+prim remain 1
+prim research 1
+prim respon 1
+prim sem 2
+prim sem funct 1
+prim sem oper 1
+prim sen 1
+prim sen inform 1
+prim server 1
+prim server p1 1
+prim smal numer 1
+prim sol 1
+prim sourc 2
+prim subject 1
+prim support 1
+prim targ 1
+prim targ system 1
+prim than circumscrib 1
+prim than mov 1
+prim that ignor 1
+prim through tim 1
+prim through tr 1
+prim until tim 1
+prim ver 1
+prim with number 1
+prim with retrief 1
+prim writer 1
+prim writer using 1
+prim.1 1
+primair 1
+primair de 1
+primarybackup 1
+primarybackup approach 1
+primer 3
+primer for inform 1
+primitif 1
+primitif de 1
+primitif de prolog 1
+primitiv 21
+primitiv al 1
+primitiv al atoir 1
+primitiv and assum 1
+primitiv and lock 1
+primitiv and shar 1
+primitiv ar actu 1
+primitiv ar defin 1
+primitiv ar design 1
+primitiv ar nec 1
+primitiv ar scal 1
+primitiv ar shown 1
+primitiv as part 1
+primitiv com 1
+primitiv com de 1
+primitiv compatibl 1
+primitiv d echang 1
+primitiv d echec 1
+primitiv dan 1
+primitiv dan le 1
+primitiv de 2
+primitiv de commun 1
+primitiv de mod 1
+primitiv est 1
+primitiv est intrin 1
+primitiv execut 1
+primitiv fail 1
+primitiv fail shallow 1
+primitiv for addr 1
+primitiv for var 1
+primitiv form 1
+primitiv form un 1
+primitiv from tabl 1
+primitiv g om 1
+primitiv gather 1
+primitiv gener 1
+primitiv implem 1
+primitiv in addit 1
+primitiv in tabl 1
+primitiv inclus 1
+primitiv inclus act 1
+primitiv incp 1
+primitiv int asynchron 1
+primitiv is pr 1
+primitiv isol 1
+primitiv isol es 1
+primitiv le 1
+primitiv le not 1
+primitiv lead 1
+primitiv mak 1
+primitiv may requir 1
+primitiv of prolog 1
+primitiv ont 1
+primitiv ont de 1
+primitiv plus complec 1
+primitiv po 1
+primitiv po de 1
+primitiv prop 1
+primitiv prov 1
+primitiv qu 1
+primitiv qu nous 1
+primitiv quelconqu 1
+primitiv random 1
+primitiv reflect 1
+primitiv san trop 1
+primitiv sel 1
+primitiv sel homog 1
+primitiv sont 1
+primitiv sont trop 1
+primitiv tel 1
+primitiv tel qu 1
+primitiv that reduc 1
+primitiv that scal 1
+primitiv transp 1
+primitiv wer allow 1
+primitiv with obv 1
+primitiv with problem 1
+primord 2
+primord dan 1
+primord dan le 1
+prin 1
+prin and writ 1
+princ 9
+princ univer pr 2
+princip 15
+princip acc 1
+princip algorithmiqu 1
+princip algorithmiqu de 1
+princip algorithmiqu pr 1
+princip an 1
+princip b en 1
+princip block 1
+princip caract 1
+princip caract eristiqu 1
+princip coord 1
+princip coord an 1
+princip dan 1
+princip dan le 1
+princip daugmenter 1
+princip daugmenter son 1
+princip de 5
+princip de ba 1
+princip de ce 1
+princip de ga 1
+princip de guid 1
+princip de la 2
+princip de lagc 1
+princip de lempil 1
+princip de loptim 1
+princip de par 1
+princip de procrast 1
+princip de rep 1
+princip defin 1
+princip designer 1
+princip diff 1
+princip diff er 1
+princip differ 1
+princip du 1
+princip du compilateur 1
+princip du protocol 1
+princip du tableau 1
+princip dual 1
+princip dual de 1
+princip dun 1
+princip dun espac 1
+princip en 1
+princip en est 1
+princip enonc 1
+princip est 1
+princip est toutef 1
+princip faibl 1
+princip faibl de 1
+princip g en 2
+princip g om 1
+princip guidel 1
+princip id 1
+princip inconv 2
+princip inconv enient 2
+princip int 1
+princip int er 1
+princip la 1
+princip la cr 1
+princip la form 1
+princip le 1
+princip le compilateur 1
+princip leur 1
+princip leur impact 1
+princip lim 1
+princip lim ee 1
+princip lintroduc 1
+princip lintroduc dun 1
+princip mach 1
+princip macr 1
+princip measur 1
+princip motiv 1
+princip motiv de 1
+princip propr 1
+princip qu 1
+princip qu nous 1
+princip rest 1
+princip rest un 1
+princip sappar 1
+princip sappar convenabl 1
+princip sur 1
+princip sur li 1
+princip term 1
+princip term voron 1
+principaux 6
+principaux aspect 1
+principaux aspect de 1
+principaux aux 1
+principaux aux perform 1
+principaux de 1
+principaux de coupur 1
+principaux el 1
+principaux el ement 1
+principaux lam 1
+principaux lam elior 1
+principaux m ecan 1
+principaux outil 1
+principaux outil util 1
+principaux param 2
+principaux param etr 2
+principaux probl 1
+principaux probl em 1
+principaux r esultat 1
+principaux r sultat 1
+principaux relatif 1
+principaux relatif aux 1
+principaux sont 1
+principaux sont abord 1
+principaux typ 1
+principaux typ de 1
+principl 60
+principl and diagnost 1
+principl and illustr 1
+principl and pract 4
+principl and problem 1
+principl and system 1
+principl approach 1
+principl be ch 1
+principl cap 1
+principl compon 1
+principl compon an 1
+principl differ 1
+principl disc 1
+principl for resil 1
+principl for typ 1
+principl from experim 1
+principl he us 1
+principl heur 1
+principl in self 1
+principl knowledg 2
+principl man var 1
+principl method 1
+principl of compiler 1
+principl of datab 8
+principl of diagn 2
+principl of distribut 5
+principl of fast 1
+principl of knowledg 1
+principl of loc 1
+principl of program 12
+principl of self 1
+principl of sem 1
+principl of transact 1
+principl outlin 1
+principl pattern 1
+principl pattern infer 1
+principl reason 1
+principl reason method 1
+principl simil 1
+principl step 1
+principl stud 1
+principl th extract 1
+principl that oper 1
+principl to cr 1
+principl to dec 1
+principl to exploit 1
+principl way 1
+principl wil contain 1
+prinicip 1
+prinicip est 1
+prinicip est dop 1
+print 15
+print a grammat 1
+print a me 1
+print and par 1
+print circuit 1
+print circuit board 1
+print compon 1
+print docum 1
+print interm 1
+print interm result 1
+print kcm 1
+print kcm prolog 1
+print nam 1
+print off 1
+print pag 1
+print stat 1
+print text 1
+print th input 1
+print th span 1
+printer 1
+printf 4
+printgraph 1
+printspac 1
+printtr 1
+prinzip 2
+prinzip der 1
+prinzip der biologisch 1
+prinzip und 1
+prinzip und problem 1
+priol 2
+priol et al 1
+priopt 1
+prior 55
+prior algorithm 1
+prior and condit 1
+prior and fram 1
+prior and gener 1
+prior assum 1
+prior aucun 1
+prior bi 1
+prior bi eff 1
+prior bi start 1
+prior can incur 1
+prior can tak 1
+prior comput 1
+prior count 1
+prior dat 1
+prior dat structur 1
+prior de 2
+prior de la 1
+prior de typ 1
+prior dec 1
+prior dec bi 1
+prior dintersect 1
+prior dintersect vid 1
+prior distribut 1
+prior driv 1
+prior effort 1
+prior execut 1
+prior expect 1
+prior for parallel 1
+prior for schedl 1
+prior for task 1
+prior group 1
+prior id prior 1
+prior if xi 1
+prior inc 1
+prior ind 2
+prior ind epen 1
+prior ind priopt 1
+prior inform 1
+prior interdit 1
+prior interdit de 1
+prior invoc 1
+prior knowledg 7
+prior knowledg resid 1
+prior le 1
+prior le altern 1
+prior list 1
+prior list implem 1
+prior lower 1
+prior lower level 1
+prior method 1
+prior mor accur 1
+prior nod 2
+prior nod ad 1
+prior of nod 2
+prior op 1
+prior or deriv 1
+prior over workload 1
+prior over writ 1
+prior pa 1
+prior pack 1
+prior par 1
+prior par tr 1
+prior peer 1
+prior peer group 1
+prior prob 1
+prior probabil 1
+prior proc 1
+prior prun 2
+prior prun techniqu 1
+prior qu 1
+prior qu le 1
+prior quest 1
+prior queu 5
+prior queu acc 1
+prior queu ba 1
+prior queu cal 1
+prior queu el 1
+prior queu implem 1
+prior queu loc 2
+prior queu oper 1
+prior queu ra 1
+prior queu sem 1
+prior queu server 1
+prior reason 1
+prior schedl 1
+prior scheduler 2
+prior scheduler schedl1 1
+prior scheduler tc 1
+prior search 1
+prior search tr 1
+prior significatif 1
+prior to an 1
+prior to build 1
+prior to claus 1
+prior to com 1
+prior to compar 1
+prior to cpn 1
+prior to enter 1
+prior to investig 1
+prior to li 1
+prior to publ 1
+prior to quant 1
+prior to select 1
+prior to writ 1
+prior typ 1
+prior typ prior 1
+prior unimodulair 1
+prior vot 1
+prior work 1
+prior0 1
+prior0 init1 1
+prior0 init1 pasc 1
+prior0 init1 rest1 1
+prior0 organ 1
+prior0 pasc 1
+prior0 rest1 1
+prior0 rest1 organ 1
+prior1 1
+prior1 organ 1
+prior1 pasc 1
+prior1 prior0 1
+prior1 prior0 organ 1
+prior1 x0 1
+prior2 1
+prior2 count 1
+prior2 count al 1
+prior2 lon 1
+prior2 neighbor 1
+prior2 organ 1
+prior2 overcrowd 1
+priorit 2
+priorit deadl 1
+priorit in parallel 1
+priorit job 1
+priorit job yield 1
+prioritair 1
+prioritair en 1
+prioritair en compt 1
+prioritair la 1
+prioritair la distribut 1
+prioritair le 1
+prioritair le faux 1
+priork 1
+priork and restk 1
+priork th prev 1
+prison 1
+prison er 1
+prison er est 1
+prison er lor 1
+prison er par 1
+priv 16
+priv cach 1
+priv cach memor 1
+priv commun 2
+priv dat 1
+priv empl 1
+priv es 1
+priv es de 1
+priv funct 1
+priv member 1
+priv memor 3
+priv network 1
+priv oper 2
+priv own 1
+priv own workst 1
+priv part 1
+priv proper 1
+priv re 1
+priv trail 1
+priv variabl 1
+privil 3
+privil eg 2
+privil eg ee 1
+privil eg es 1
+privil eg le 1
+privil gier 1
+privil gier un 1
+privileg 3
+privileg administer 1
+privileg and funct 1
+privileg ar encounter 1
+privileg ar indirect 1
+privileg ar int 1
+privileg ar introduc 1
+privileg ar partit 1
+privileg ar scatter 1
+privileg ar shar 1
+privileg ar specif 1
+privileg assignm 1
+privileg assoc 1
+privileg augm 1
+privileg augm privileg 1
+privileg author 1
+privileg author involut 1
+privileg avail 1
+privileg can caus 1
+privileg can remain 1
+privileg chang 1
+privileg client 1
+privileg client entr 1
+privileg common 1
+privileg common privileg 1
+privileg criter 1
+privileg defin 1
+privileg dep 1
+privileg direct assoc 1
+privileg distribut 1
+privileg distribut tabl 1
+privileg elim 1
+privileg elim involut 1
+privileg espec 1
+privileg explicit 1
+privileg explicit specif 1
+privileg for act 1
+privileg for maxrol 1
+privileg from direct 1
+privileg from rol 1
+privileg from senior 1
+privileg funct 1
+privileg graph 1
+privileg graph other 1
+privileg in nod 1
+privileg inclus 1
+privileg invar 1
+privileg is ad 1
+privileg manag 1
+privileg number 1
+privileg of ec 1
+privileg of maxrol 1
+privileg of path 1
+privileg of targ 1
+privileg of var 1
+privileg output 1
+privileg pair 1
+privileg pertain 1
+privileg proper 1
+privileg reduc 1
+privileg reduc entail 1
+privileg relationship 1
+privileg remain 1
+privileg remain invar 1
+privileg repr 1
+privileg repr predefin 1
+privileg resolut 1
+privileg se 1
+privileg se assoc 1
+privileg se form 1
+privileg se invar 1
+privileg se minrol 1
+privileg se pair 1
+privileg se repr 1
+privileg se uniqu 1
+privileg shar 1
+privileg shar using 1
+privileg specif 1
+privileg sub 1
+privileg than lower 1
+privileg to act 1
+privileg to chang 1
+privileg to facilit 1
+privileg to ge 1
+privileg to rol 1
+privileg to simplif 1
+privileg to superior 1
+privileg wh 1
+privileg which facilit 1
+privileg which requir 1
+prm 2
+prm of procedur 1
+prm.3 1
+prmyp1 1
+prmyp1 def 1
+prmyp1 prmyp2 1
+prmyp2 1
+prmyp2 can hold 1
+prmyp2 def 1
+proach 1
+proach us 1
+prob 41
+prob 1n 1
+prob a request 1
+prob a stat 1
+prob al cel 1
+prob and belief 1
+prob approach 1
+prob assignm 1
+prob ba 1
+prob ba grammar 1
+prob bound 1
+prob calculus 1
+prob chang 1
+prob compar 1
+prob condit 1
+prob condit dep 1
+prob de 1
+prob de voir 1
+prob distribut 5
+prob distribut cur 1
+prob distribut modif 1
+prob distribut pi 1
+prob distribut reflect 1
+prob distribut sav 1
+prob distribut tak 1
+prob distribut underl 1
+prob driv 1
+prob experim 1
+prob gener 1
+prob gener funct 1
+prob giv 1
+prob interpr 1
+prob interpr result 1
+prob io 1
+prob io tok 1
+prob is bound 1
+prob is giv 1
+prob is greater 1
+prob is minim 1
+prob is posit 1
+prob is se 1
+prob is slight 1
+prob measur 1
+prob modif 1
+prob modif act 1
+prob modif appear 1
+prob modif arbitr 1
+prob modif comput 1
+prob modif foc 1
+prob modif gener 1
+prob modif instruc 1
+prob number 1
+prob of accept 2
+prob of dat 1
+prob of div 1
+prob of divid 1
+prob of error 1
+prob of execut 1
+prob of ge 1
+prob of giv 1
+prob of inst 1
+prob of lo 1
+prob of mak 1
+prob of mi 1
+prob of observ 1
+prob of pm 1
+prob of select 1
+prob of self 1
+prob of uncover 1
+prob of using 1
+prob of v3 1
+prob of v4 1
+prob of var 1
+prob of vk 1
+prob paccept 1
+prob ph 1
+prob tabl 1
+prob term 1
+prob th cur 1
+prob th system 1
+prob that nod 1
+prob that switch 1
+prob that t1 1
+prob that wij 1
+prob theor 3
+prob ti 1
+prob to go 2
+prob tok 1
+prob tok realn 1
+prob uniform 1
+prob univer 1
+prob univer search 1
+prob upd 1
+prob valu 3
+prob valu pij 1
+prob vs 1
+prob wer determin 1
+prob wh 1
+prob wh tcol 1
+prob wil occur 1
+probabil 21
+probabil a pour 1
+probabil accept 1
+probabil algorithm 1
+probabil an 2
+probabil approach 1
+probabil ar deriv 1
+probabil ar high 1
+probabil ar repr 1
+probabil ar somewhat 1
+probabil assoc 1
+probabil bound 1
+probabil de 1
+probabil de syst 1
+probabil est 1
+probabil est suff 1
+probabil event 1
+probabil exper 1
+probabil exper system 1
+probabil fash 1
+probabil for bal 1
+probabil infer 1
+probabil input 1
+probabil input traff 1
+probabil la 1
+probabil la difficult 1
+probabil loc 1
+probabil loc search 1
+probabil model 1
+probabil network 3
+probabil nod 1
+probabil nod div 1
+probabil obtain 1
+probabil of addit 1
+probabil of divid 1
+probabil of futur 1
+probabil of occur 1
+probabil of program 1
+probabil of suffer 1
+probabil on graph 2
+probabil oper 1
+probabil originel 1
+probabil par 1
+probabil par siml 1
+probabil parallel 1
+probabil parallel algorithm 1
+probabil peut 1
+probabil peut etr 1
+probabil proof 1
+probabil qu 1
+probabil qu perm 1
+probabil reflect 1
+probabil result 1
+probabil se 1
+probabil speak 1
+probabil suiv 1
+probabil techniqu 1
+probabil to succ 1
+probabil val 1
+probabil val method 1
+probabil weight 1
+probabil weight del 1
+probabil wer arriv 1
+probabil wer deriv 1
+probabil wer se 1
+probabil with fewer 1
+probabilit 4
+probabilit e assoc 1
+probabilit e conditionnel 1
+probabilit e cuml 1
+probabilit e de 3
+probabilit e doccur 1
+probabilit e fa 1
+probabilit e inf 2
+probabilit e li 1
+probabilit e modif 1
+probabilit e originel 1
+probabilit e pc 1
+probabilit e pe 1
+probabilit e peut 1
+probabilit e pi 1
+probabilit e pit 1
+probabilit e qu 2
+probabilit e quun 2
+probabilit e suff 1
+probabilit e sup 1
+probabilit e tr 1
+probabilit es 2
+probabilit es de 2
+probabilit es dutil 1
+probabilit es init 1
+probabilit es modif 1
+probabilit es quun 1
+probabilit s sur 1
+probabilit s xx 1
+probabilit s xxv 1
+probabilt 2
+probabilt a stat 1
+probabilt a switch 1
+probabilt block 1
+probabilt e de 1
+probabl 4
+probabl a switch 1
+probabl ce 1
+probabl ce qu 1
+probabl etr 1
+probabl etr ind 1
+probabl extr 1
+probabl extr em 1
+probabl minim 1
+probabl qu 1
+probabl qu le 1
+probabl serv 1
+probabl serv par 1
+probelm 1
+probelm in con 1
+probibilt 1
+probl 7
+probl em 6
+probl em achop 1
+probl em au 1
+probl em avec 1
+probl em classiqu 3
+probl em commun 1
+probl em complec 1
+probl em con 1
+probl em dacc 1
+probl em dalloc 1
+probl em de 5
+probl em denl 1
+probl em dev 1
+probl em don 1
+probl em doptim 1
+probl em du 2
+probl em dun 1
+probl em en 3
+probl em essentiel 1
+probl em est 3
+probl em glob 1
+probl em int 1
+probl em li 1
+probl em lor 1
+probl em majeur 2
+probl em nec 1
+probl em par 1
+probl em particl 1
+probl em pc 1
+probl em peut 2
+probl em po 2
+probl em pouvait 1
+probl em pr 1
+probl em qu 2
+probl em quil 1
+probl em relatif 1
+probl em sat 1
+probl em similair 1
+probl em sont 1
+probl em suppl 1
+probl em trait 1
+probl ematiqu 3
+probl ematiqu appar 1
+probl ematiqu diff 1
+probl ematiqu pour 1
+probl ematiqu sont 1
+probl me 1
+probl me applicatif 1
+probl me appliqu 1
+probl me dan 1
+probl me de 1
+probl me du 1
+probl me en 1
+probl me encor 1
+probl me ouvr 1
+probl me permettrait 1
+probl me peut 1
+probl me po 1
+probl me pratiqu 1
+probl me princip 1
+probl me rencontr 1
+probl me rest 1
+probl me th 1
+probl me tr 1
+problem 119
+problem about regl 1
+problem accord 1
+problem actu 1
+problem actu sum 1
+problem adm 1
+problem al allow 1
+problem and advoc 1
+problem and describ 1
+problem and develop 1
+problem and gener 1
+problem and incr 1
+problem and plac 1
+problem and prop 1
+problem and prov 2
+problem and rel 1
+problem and remov 1
+problem and rest 1
+problem and result 1
+problem and simplif 1
+problem and surv 1
+problem and therefor 1
+problem and tim 1
+problem and tr 1
+problem and work 1
+problem appar 1
+problem appar ar 1
+problem appl 1
+problem ar 3
+problem ar bbmat 1
+problem ar common 1
+problem ar compound 1
+problem ar disc 1
+problem ar found 1
+problem ar glob 1
+problem ar known 1
+problem ar ment 1
+problem ar np 1
+problem ar sort 1
+problem ar suit 1
+problem ar tak 1
+problem ar typ 1
+problem as diver 1
+problem ask 1
+problem assoc 6
+problem at hand 6
+problem b speed 1
+problem ba 1
+problem be alter 1
+problem becaus split 1
+problem becom 3
+problem being mad 1
+problem bfg 1
+problem breakdown 1
+problem bring 1
+problem by allow 1
+problem by craft 1
+problem by decomp 1
+problem by exper 1
+problem by ext 1
+problem by introduc 1
+problem by macr 1
+problem by measur 1
+problem by search 1
+problem by specif 2
+problem by st 1
+problem by transform 1
+problem by using 1
+problem can ec 1
+problem can occur 1
+problem can produc 1
+problem can tak 1
+problem caus 1
+problem ch 1
+problem character 1
+problem compl 3
+problem complec 1
+problem complec explod 1
+problem compr 1
+problem comput 1
+problem comput slow 1
+problem con 6
+problem contribut 1
+problem correspon 1
+problem cotid 1
+problem cotid encontrad 1
+problem dec 2
+problem decomposit 1
+problem decomposit paradigm 1
+problem defin 2
+problem definit 1
+problem deliver 1
+problem der 1
+problem der ef 1
+problem describ 3
+problem disc 3
+problem domain 6
+problem du 1
+problem dur spec 1
+problem ec 2
+problem effect 1
+problem exact 1
+problem examin 1
+problem exclus 1
+problem exclus gismon 1
+problem exper 1
+problem fac 1
+problem fi 1
+problem find 2
+problem find appl 2
+problem fit 1
+problem fit neat 1
+problem for appl 1
+problem for constrain 1
+problem for find 1
+problem for junct 1
+problem for lin 1
+problem for optim 1
+problem for regl 1
+problem for softwar 1
+problem for terrain 1
+problem for triangl 1
+problem form 1
+problem forml 2
+problem g a3 1
+problem ge 1
+problem ge iron 1
+problem gener 2
+problem giv 1
+problem glob 1
+problem go 1
+problem h hug 1
+problem ha appl 1
+problem ha congest 1
+problem ha object 1
+problem hard 1
+problem hav eff 1
+problem if peopl 1
+problem imp 1
+problem in ai 3
+problem in asynchron 1
+problem in bay 1
+problem in chr 1
+problem in clp 1
+problem in collect 1
+problem in combin 1
+problem in computer 2
+problem in connect 1
+problem in constraint 1
+problem in construc 1
+problem in deletemin 1
+problem in fault 1
+problem in figur 1
+problem in gener 2
+problem in grammat 1
+problem in hand 1
+problem in hash 1
+problem in implem 1
+problem in langu 1
+problem in log 1
+problem in med 1
+problem in ml 1
+problem in mult 1
+problem in multicach 1
+problem in object 1
+problem in p2 1
+problem in pattern 1
+problem in phy 1
+problem in prolog 1
+problem in rel 1
+problem in sc 1
+problem in shar 1
+problem in softwar 1
+problem in spat 1
+problem in tabl 1
+problem in term 1
+problem inclus 3
+problem inclus object 1
+problem incr 1
+problem input 1
+problem inst 4
+problem inst defin 1
+problem inst giv 1
+problem inst i2 1
+problem inst i3 1
+problem instead 1
+problem int non 1
+problem int simpler 1
+problem interreduc 1
+problem introduc 1
+problem involut 4
+problem involut boolean 1
+problem involut constraint 1
+problem involut implicit 1
+problem is actu 1
+problem is aim 1
+problem is appropr 1
+problem is cal 1
+problem is clear 1
+problem is closest 1
+problem is compat 1
+problem is compl 1
+problem is compound 1
+problem is defin 4
+problem is describ 1
+problem is du 1
+problem is ea 1
+problem is felt 1
+problem is forml 1
+problem is gener 1
+problem is giv 1
+problem is handl 1
+problem is ind 1
+problem is indeed 1
+problem is interest 1
+problem is known 1
+problem is np 7
+problem is orthogon 1
+problem is polynom 1
+problem is reduc 1
+problem is rel 2
+problem is said 1
+problem is separ 1
+problem is shown 1
+problem is signif 2
+problem is solut 2
+problem is tract 1
+problem is transact 1
+problem is writ 1
+problem is0 1
+problem it harder 1
+problem it solut 1
+problem l depth 1
+problem l multipl 1
+problem li 1
+problem lik find 1
+problem lik regl 1
+problem list 1
+problem mak 2
+problem mak gu 1
+problem mak sen 1
+problem map 1
+problem match 1
+problem may caus 1
+problem ment 2
+problem muc 1
+problem nl 1
+problem nl reg 1
+problem occur 4
+problem of 3d 1
+problem of adapt 1
+problem of appl 1
+problem of attempt 1
+problem of autom 1
+problem of bad 1
+problem of bi 1
+problem of boolean 1
+problem of ch 2
+problem of cod 1
+problem of comput 3
+problem of concur 1
+problem of construc 2
+problem of cover 1
+problem of dedid 1
+problem of defin 1
+problem of degr 1
+problem of design 1
+problem of determin 2
+problem of diagn 2
+problem of distingu 1
+problem of divid 1
+problem of ec 1
+problem of eff 2
+problem of elect 1
+problem of emb 1
+problem of estim 1
+problem of evalu 1
+problem of evalut 1
+problem of evlu 1
+problem of fft 1
+problem of find 8
+problem of fundam 1
+problem of gener 1
+problem of geometer 1
+problem of graph 1
+problem of handl 1
+problem of high 2
+problem of identif 1
+problem of imperfect 1
+problem of improv 1
+problem of incr 1
+problem of infer 1
+problem of inform 1
+problem of inherit 1
+problem of inst 1
+problem of keep 1
+problem of larger 1
+problem of learn 1
+problem of loc 2
+problem of log 1
+problem of mach 1
+problem of maintain 1
+problem of map 1
+problem of memor 1
+problem of merg 1
+problem of mi 1
+problem of minim 1
+problem of monit 1
+problem of multiparadigm 1
+problem of multipl 1
+problem of mut 1
+problem of no 1
+problem of object 1
+problem of obtain 1
+problem of onl 1
+problem of optim 1
+problem of overcom 1
+problem of pack 1
+problem of partit 1
+problem of perform 1
+problem of poor 1
+problem of prec 1
+problem of pump 1
+problem of qu 1
+problem of reconstruc 1
+problem of reduc 1
+problem of regr 1
+problem of rel 1
+problem of remov 1
+problem of scal 1
+problem of schedl 1
+problem of select 1
+problem of self 1
+problem of siz 2
+problem of soc 1
+problem of sort 3
+problem of specif 1
+problem of strong 1
+problem of train 1
+problem of uniform 1
+problem of unst 1
+problem of upd 1
+problem of view 1
+problem of vl 1
+problem oft assoc 1
+problem on mesh 1
+problem on network 1
+problem or stop 1
+problem orient 1
+problem our approach 1
+problem over finit 1
+problem over nm 1
+problem parameter 2
+problem part 1
+problem pn 1
+problem prec 1
+problem rang 1
+problem reduc 1
+problem rel 5
+problem remain 3
+problem remain difficult 1
+problem remain pract 1
+problem report 1
+problem requir 2
+problem requir run 1
+problem respect 1
+problem result 1
+problem rl 1
+problem run 1
+problem se 2
+problem show 1
+problem simplif 1
+problem simplif occur 1
+problem simplifypolynom 1
+problem situ 1
+problem siz 4
+problem siz incr 1
+problem siz lin 1
+problem sl1 1
+problem solut 12
+problem solut behavior 1
+problem solut cl 1
+problem solut design 1
+problem solut environm 1
+problem solut method 1
+problem solut power 1
+problem solut proc 2
+problem solut sequ 1
+problem solut situ 2
+problem solut strateg 2
+problem solut task 1
+problem solut work 1
+problem solut. 1
+problem solver 1
+problem spac 1
+problem specif 3
+problem specif act 1
+problem specif bi 1
+problem specif built 1
+problem specif learn 1
+problem specif prim 1
+problem specif primitiv 1
+problem specif regl 1
+problem specif repr 1
+problem stat 1
+problem stem 2
+problem suggest 1
+problem symmeter 1
+problem tak 1
+problem th build 1
+problem th gi 1
+problem th monit 1
+problem than adv 1
+problem than structur 1
+problem than tim 1
+problem that appl 1
+problem that ar 4
+problem that compel 1
+problem that human 1
+problem that log 1
+problem that straight 1
+problem to acc 1
+problem to ap 1
+problem to determin 1
+problem to develop 1
+problem to find 1
+problem to handl 1
+problem to mf 1
+problem to produc 1
+problem to rest 1
+problem to softwar 1
+problem to solut 1
+problem tod.1 1
+problem treat 1
+problem typ 1
+problem typ ec 1
+problem ultim 1
+problem ultim problem 1
+problem under consider 1
+problem us 1
+problem us var 1
+problem using 7
+problem using bar 1
+problem using constraint 1
+problem using dat 1
+problem using ip 1
+problem usu show 1
+problem ver difficult 1
+problem wa consider 1
+problem wa giv 1
+problem wa prop 1
+problem wa shown 1
+problem wa solut 1
+problem wa speed 1
+problem wa tackl 1
+problem we consider 2
+problem we encounter 1
+problem we solut 1
+problem wer found 1
+problem wer partit 1
+problem wer shown 1
+problem wer solut 2
+problem wh 3
+problem wh discr 1
+problem wh ser 1
+problem when me 1
+problem which con 1
+problem whil st 1
+problem wil us 1
+problem with asser 1
+problem with con 1
+problem with congest 1
+problem with continu 1
+problem with discr 1
+problem with equ 1
+problem with fan 1
+problem with fl 1
+problem with good 1
+problem with loc 1
+problem with macr 1
+problem with maint 1
+problem with minim 1
+problem with object 1
+problem with oper 1
+problem with polynom 1
+problem with prec 1
+problem with rectangl 1
+problem with respect 2
+problem with standard 1
+problem with taxonom 1
+problem with tim 1
+problem with util 1
+problem would result 1
+problem.1 1
+problem.3 1
+problemat 1
+problemsolut 2
+problemsolut group 1
+problemsolut proc.2 1
+proc 118
+proc a ba 1
+proc a becom 1
+proc a non 2
+proc a pag 1
+proc a proc 1
+proc a se 1
+proc a sequ 1
+proc a var 1
+proc acc 5
+proc acc simultan 1
+proc accommod 1
+proc accord 2
+proc acquir 1
+proc act 4
+proc act se 1
+proc aff 1
+proc against mechan 1
+proc al incom 1
+proc algebr 1
+proc algebr model 1
+proc algebr sem 1
+proc algorithm 1
+proc algorithm requir 1
+proc alloc 2
+proc alread own 1
+proc an approach 1
+proc an attract 1
+proc an el 1
+proc an exp 1
+proc an imag 1
+proc and 1gby 1
+proc and an 1
+proc and appl 1
+proc and chang 1
+proc and channel 2
+proc and commun 6
+proc and computer 2
+proc and deduc 1
+proc and ec 1
+proc and exchang 1
+proc and fifth 1
+proc and filter 1
+proc and fin 1
+proc and for 1
+proc and henc 1
+proc and implem 1
+proc and indep 1
+proc and input 1
+proc and interconnect 2
+proc and mak 1
+proc and manag 1
+proc and memor 3
+proc and mutu 1
+proc and network 2
+proc and norm 1
+proc and numer 1
+proc and organ 1
+proc and percol 1
+proc and re 1
+proc and recogn 1
+proc and rerout 1
+proc and result 1
+proc and sent 1
+proc and spac 1
+proc and st 1
+proc and transm 1
+proc and upd 1
+proc and us 1
+proc and window 1
+proc and xi 1
+proc another min 1
+proc any method 1
+proc appl 2
+proc approach 1
+proc ar 4
+proc ar ad 1
+proc ar alloc 1
+proc ar arbitr 1
+proc ar arrang 1
+proc ar assign 1
+proc ar attach 1
+proc ar avail 1
+proc ar avail.2 1
+proc ar block 1
+proc ar connect 5
+proc ar corrupt 1
+proc ar creat 1
+proc ar empl 1
+proc ar exchang 1
+proc ar execut 1
+proc ar fif 1
+proc ar fin 1
+proc ar ignor 1
+proc ar inform 1
+proc ar involut 1
+proc ar light 1
+proc ar lik 1
+proc ar maintain 1
+proc ar pl 1
+proc ar poor 1
+proc ar reactiv 1
+proc ar repr 1
+proc ar se 1
+proc ar spawn 1
+proc ar suff 1
+proc ar synchron 2
+proc ar ultim 1
+proc ar upd 1
+proc ar urg 1
+proc ar util 1
+proc ar zer 1
+proc architectur 6
+proc arrang 1
+proc arriv 1
+proc as commitm 1
+proc as constrain 1
+proc as nod 1
+proc as shown 1
+proc as tseq 1
+proc assign 2
+proc assoc 1
+proc at 40mhz 1
+proc at interv 1
+proc at posit 1
+proc at proc 1
+proc at run 1
+proc attempt 1
+proc autom 1
+proc avail 3
+proc await 1
+proc b belong 1
+proc b dec 1
+proc b proc 1
+proc b ssp 1
+proc ba 3
+proc ba comput 1
+proc ba system 1
+proc bar 1
+proc bar command 1
+proc be avail 1
+proc be lock 1
+proc becaus find 1
+proc befor control 1
+proc begin 1
+proc begin1 1
+proc being dynam 1
+proc being number 1
+proc being siml 1
+proc belong 2
+proc between cooper 1
+proc board 4
+proc board pinout 2
+proc board restrict 2
+proc board siz 2
+proc board technolog 2
+proc bound 1
+proc buffer 1
+proc by lem 1
+proc by network 1
+proc by pref 1
+proc by prov 1
+proc by tel 1
+proc c nod 1
+proc ca 1
+proc cach 2
+proc cach affin 1
+proc cal 1
+proc cal procedur 1
+proc cal svm 1
+proc calculus 1
+proc can acc 1
+proc can aid 1
+proc can commun 1
+proc can detect 2
+proc can distingu 1
+proc can dr 1
+proc can execut 1
+proc can ge 1
+proc can hold 1
+proc can inject 1
+proc can keep 1
+proc can mak 1
+proc can perform 1
+proc can perman 1
+proc can pot 1
+proc can read 1
+proc can resum 1
+proc can sen 1
+proc can start 1
+proc can stop 1
+proc cannot init 1
+proc cannot push 1
+proc cannot rec 1
+proc cannot start 1
+proc cap 3
+proc capabil 1
+proc car 1
+proc car memor 1
+proc cast 1
+proc cast vot 1
+proc chang 2
+proc check 2
+proc chip 2
+proc cluster 3
+proc cluster ad 1
+proc cluster allow 2
+proc cluster ba 1
+proc cluster benefit 1
+proc cluster connect 1
+proc cluster design 2
+proc cluster modl 1
+proc cluster offer 1
+proc cluster siz 1
+proc cluster technolog 1
+proc combin 1
+proc command 1
+proc command lin 1
+proc commun 6
+proc commun perform 1
+proc commun schem 1
+proc compl 2
+proc complec 1
+proc comput 3
+proc comput abil 1
+proc comput part 1
+proc con 2
+proc con1 1
+proc connect 3
+proc construc 1
+proc cont 1
+proc contain 3
+proc contain dat 1
+proc continu 4
+proc continu program 1
+proc control 1
+proc convec 1
+proc convec polygon 1
+proc converg 1
+proc cooper 1
+proc correspon 2
+proc cost 2
+proc could demonstr 1
+proc could init 1
+proc council 1
+proc crash 1
+proc cycl 1
+proc cycl level 1
+proc decl 1
+proc decl knowledg 1
+proc def 1
+proc del 2
+proc deliver 1
+proc demand 2
+proc demand 25mb 2
+proc demand bandwidth 2
+proc demand rat 2
+proc demand tot 2
+proc dep 1
+proc describ 1
+proc describ prev 1
+proc descript 1
+proc design 1
+proc determin 1
+proc determin b1 1
+proc develop 1
+proc differ 1
+proc differ wid 1
+proc direct 1
+proc draft 1
+proc draft fin 1
+proc du 2
+proc each method 1
+proc ec 1
+proc eff 1
+proc el 6
+proc eml 1
+proc en 1
+proc encounter 1
+proc enh 1
+proc enh memor 1
+proc ensur 1
+proc enter 2
+proc equ 1
+proc equ bal 1
+proc ev pair 1
+proc examin 1
+proc exampl 1
+proc execut 8
+proc execut act 1
+proc execut asynchron 1
+proc execut cb3 1
+proc execut cod 1
+proc execut inver 1
+proc execut ph 1
+proc execut transit 1
+proc f ye 1
+proc fail 1
+proc failur 3
+proc fam 1
+proc fetch 2
+proc fil 1
+proc find 1
+proc find lock 1
+proc finish 1
+proc first chang 1
+proc first check 1
+proc first perform 1
+proc fo1 1
+proc follow 2
+proc for artifact 1
+proc for construc 1
+proc for control 1
+proc for dlb 1
+proc for dynam 1
+proc for level 1
+proc for mlt 1
+proc for parallel 1
+proc for quadtr 1
+proc for scientif 3
+proc forc 1
+proc fp1 1
+proc fract 2
+proc from network 1
+proc from rgb 1
+proc funct 1
+proc ge 2
+proc ge faster 1
+proc ge near 1
+proc getp 1
+proc giv 1
+proc group 3
+proc group approach 1
+proc group center 1
+proc ha high 2
+proc ha led 1
+proc ha mask 1
+proc ha near 1
+proc ha read 1
+proc ha receiv 2
+proc ha sent 1
+proc ha succ 1
+proc halt 1
+proc handl 1
+proc hav acc 1
+proc hav compl 1
+proc hav execut 1
+proc hav read 1
+proc hav register 1
+proc hav relinqu 1
+proc hav succ 1
+proc hav unbound 1
+proc henc 1
+proc high level 1
+proc hold 2
+proc i cast 1
+proc i mi 1
+proc i se 1
+proc i specl 1
+proc i vot 1
+proc i860 1
+proc i860 xp 1
+proc i860 xr 1
+proc id comput 1
+proc ident 2
+proc ident problem 1
+proc idl 1
+proc if gi 1
+proc imag 2
+proc imag using 1
+proc imp 1
+proc implem 1
+proc implem refer 1
+proc import 1
+proc import directiv 1
+proc in control 1
+proc in eulisp 1
+proc in fif 1
+proc in figur 1
+proc in multiproc 1
+proc in order 1
+proc in parallel 1
+proc in row 1
+proc in schedl 1
+proc in syntact 1
+proc in tempor 1
+proc in term 1
+proc in tim 1
+proc in transactiontim 1
+proc in turn 1
+proc incr 3
+proc ind 1
+proc indep 1
+proc individu 1
+proc induc 1
+proc inform 2
+proc inject 1
+proc input 1
+proc inser 1
+proc inst 1
+proc instead 2
+proc int 1
+proc int equ 1
+proc int group 1
+proc interact 1
+proc interconnect 4
+proc interleav 1
+proc invok 1
+proc involut 2
+proc is activ 1
+proc is alloc 1
+proc is appl 1
+proc is assum 1
+proc is attract 2
+proc is ba 1
+proc is bal 1
+proc is bus 1
+proc is chang 1
+proc is compact 1
+proc is complec 1
+proc is connect 1
+proc is continu 1
+proc is control 1
+proc is corrupt 1
+proc is deriv 1
+proc is desir 1
+proc is detect 1
+proc is drop 1
+proc is entir 1
+proc is equ 3
+proc is error 1
+proc is execut 2
+proc is fl 1
+proc is follow 1
+proc is fr 2
+proc is idl 1
+proc is in 1
+proc is infinit 1
+proc is init 1
+proc is inser 1
+proc is inver 1
+proc is invok 1
+proc is kept 1
+proc is lim 1
+proc is near 1
+proc is outlin 1
+proc is perform 1
+proc is perturb 1
+proc is poor 1
+proc is pr 1
+proc is proc 1
+proc is read 1
+proc is recur 1
+proc is repeat 5
+proc is requir 2
+proc is respon 3
+proc is sent 1
+proc is shown 1
+proc is slower 1
+proc is spawn 1
+proc is succ 1
+proc is susp 2
+proc is termin 1
+proc is therefor 1
+proc is upd 1
+proc is var 1
+proc is wait 1
+proc it appropr 1
+proc it color 1
+proc it resid 1
+proc j addit 1
+proc j maintain 1
+proc j sen 1
+proc j0 1
+proc j00 1
+proc k know 1
+proc know 1
+proc kopt 1
+proc kopt return 1
+proc langu 1
+proc letter 9
+proc level 1
+proc level program 1
+proc lin 1
+proc lin shift 1
+proc load 3
+proc load caus 1
+proc loc 3
+proc loc memor 2
+proc loc retransm 1
+proc lock 1
+proc lock request 1
+proc log 1
+proc mach 3
+proc magaz 1
+proc maintain 1
+proc mak 3
+proc mak demand 2
+proc match 1
+proc match cl 1
+proc may correspon 1
+proc may fit 1
+proc may ge 1
+proc may occur 1
+proc may rec 1
+proc may sen 1
+proc may simultan 1
+proc may slow 1
+proc may transm 1
+proc may writ 1
+proc mechan 1
+proc memor 4
+proc memor el 1
+proc memor integr 2
+proc memor le 1
+proc memoryload 1
+proc mer 1
+proc mer perform 1
+proc merg 1
+proc mesh 1
+proc method 1
+proc mg 1
+proc might finish 1
+proc might request 1
+proc might run 1
+proc mod 1
+proc model 4
+proc modif 1
+proc monit 1
+proc mor retransm 1
+proc mp 1
+proc mp cop 1
+proc must distribut 1
+proc must exchang 1
+proc must preserv 1
+proc must prov 1
+proc must request 1
+proc must satisf 1
+proc must sen 1
+proc must sign 1
+proc n chang 1
+proc net 1
+proc net produc 1
+proc network 5
+proc network channel 2
+proc network perform 1
+proc new solut 1
+proc nod 5
+proc nod typ 1
+proc nondetermin 1
+proc nondetermin ch 1
+proc np 1
+proc number 5
+proc number idxp 1
+proc obtain 1
+proc oep 1
+proc of 18th 1
+proc of a0 1
+proc of acquir 1
+proc of adapt 1
+proc of commun 1
+proc of construc 1
+proc of dat 1
+proc of docum 1
+proc of evalu 1
+proc of explan 1
+proc of fac 1
+proc of fact 1
+proc of find 2
+proc of graph 2
+proc of group 1
+proc of horizont 1
+proc of id 1
+proc of incorpor 1
+proc of integr 1
+proc of intersect 1
+proc of label 1
+proc of lin 1
+proc of map 1
+proc of method 1
+proc of mov 1
+proc of multipl 1
+proc of pilot 1
+proc of plur 1
+proc of pointer 1
+proc of pop 1
+proc of posit 1
+proc of probabil 1
+proc of quadtr 1
+proc of refin 1
+proc of reg 1
+proc of se 1
+proc of siz 1
+proc of softwar 1
+proc of spat 2
+proc of specif 1
+proc of transform 1
+proc offer 1
+proc offer im 1
+proc on disk 1
+proc on fif 1
+proc on interior 1
+proc on transport 1
+proc on var 1
+proc oper 3
+proc oper con 1
+proc or enh 1
+proc or fil 1
+proc or involut 1
+proc or thread 1
+proc or upd 1
+proc oscil 1
+proc outlin 1
+proc overhead 3
+proc overhead uniform 1
+proc own 1
+proc p bus 1
+proc p execut 1
+proc p not 1
+proc p proc 1
+proc p random 1
+proc p re 1
+proc p upd 1
+proc p0 2
+proc p1 5
+proc p1 tr 1
+proc p1s 1
+proc p1s pag 1
+proc p2 2
+proc p2 perform 1
+proc p3 1
+proc pa 1
+proc pag 1
+proc pag tabl 1
+proc pair 1
+proc part 1
+proc particip 1
+proc particl 1
+proc particl commun 1
+proc per server 1
+proc perform 8
+proc perform offer 1
+proc perform regr 1
+proc pi 4
+proc pi finish 1
+proc pi merg 1
+proc pi perform 1
+proc pi rout 1
+proc pi unshuffl 1
+proc pi us 1
+proc pj 4
+proc pj color 1
+proc pj sen 1
+proc pk 1
+proc plan 1
+proc posit 1
+proc posit acknowledg 1
+proc power 4
+proc pp 1
+proc pp broadcast 1
+proc pp merg 1
+proc pp select 1
+proc pr 2
+proc pr collect 1
+proc predict 1
+proc prior 1
+proc proc 3
+proc program 1
+proc program langu 1
+proc project 1
+proc project docum 1
+proc protect 1
+proc protect form 1
+proc pt 1
+proc pu 1
+proc q bus 1
+proc q read 1
+proc q wait 1
+proc r assign 1
+proc r devot 1
+proc r le 1
+proc r mov 1
+proc r perform 1
+proc r read 1
+proc r rewrit 1
+proc r wait 1
+proc r writ 1
+proc re 1
+proc re activ 1
+proc re execut 1
+proc re valu 1
+proc read 1
+proc read lock 1
+proc rec 3
+proc rec xk 1
+proc receiv 5
+proc receiv me 2
+proc record 1
+proc reflect 1
+proc register 1
+proc register segm 1
+proc remain 3
+proc repeat 1
+proc repeat select 1
+proc repl 1
+proc repr 1
+proc repr simil 1
+proc request 2
+proc request acc 1
+proc request dat 1
+proc requir 7
+proc requir becom 1
+proc requir d2 1
+proc requir specif 1
+proc respon 1
+proc restart 1
+proc resum 1
+proc resum execut 1
+proc retransm 1
+proc retransm request 1
+proc rout 1
+proc router 1
+proc rs 1
+proc rs register 1
+proc run 3
+proc s follow 1
+proc s read 1
+proc schedl 2
+proc schem 1
+proc scop 1
+proc scop typ 1
+proc se 5
+proc se accord 1
+proc se con 1
+proc se execut 1
+proc se form 1
+proc se inform 1
+proc se reach 1
+proc se rel 1
+proc se therefor 1
+proc se wait 1
+proc se wh 1
+proc search 1
+proc sen 5
+proc sen coh 1
+proc sequ 1
+proc sever oper 1
+proc shar 1
+proc shar approach 1
+proc should continu 1
+proc should prov 1
+proc should util 1
+proc show 1
+proc simd 1
+proc simd hypercub 1
+proc simil 2
+proc simil situ 1
+proc simp 1
+proc simp se 1
+proc skip 1
+proc snoop 1
+proc softwar 1
+proc spac 2
+proc spac complec 1
+proc specl 1
+proc speed 4
+proc speed incr 1
+proc speed interconnect 2
+proc spen 1
+proc spen wait 1
+proc spent 1
+proc st 5
+proc st loc 1
+proc stag 1
+proc start 4
+proc start execut 1
+proc stat 3
+proc stat network 1
+proc status 1
+proc status word 1
+proc step 1
+proc stop 1
+proc subsequ 1
+proc subsequ request 1
+proc succeed 2
+proc such constraint 1
+proc support 1
+proc symp 3
+proc symposioum 1
+proc synchron 3
+proc synchron iter 1
+proc system 16
+proc system cr 1
+proc system st 1
+proc system subject 1
+proc tak 4
+proc tak polynom 1
+proc tak tim 1
+proc task 3
+proc task con 1
+proc techniqu 4
+proc technolog 1
+proc text 1
+proc th act 1
+proc th ath 1
+proc th becom 1
+proc th command 1
+proc th correspon 1
+proc th datab 1
+proc th edg 1
+proc th expr 1
+proc th fil 1
+proc th funct 1
+proc th imag 1
+proc th inform 1
+proc th interior 1
+proc th intersect 1
+proc th output 1
+proc th pixel 1
+proc th polygon 1
+proc th problem 1
+proc th qu 1
+proc th receiv 1
+proc th request 1
+proc th st 1
+proc th syntac 1
+proc th tt 1
+proc th ver 1
+proc th visu 1
+proc than arbitr 1
+proc than iter 1
+proc that abort 1
+proc that allow 1
+proc that conflict 1
+proc that execut 1
+proc that forml 1
+proc that mov 1
+proc that prec 1
+proc that request 1
+proc that requir 1
+proc that sent 1
+proc that succ 1
+proc that tak 1
+proc that tr 1
+proc that vot 1
+proc their loc 1
+proc then follow 1
+proc then sen 1
+proc then us 1
+proc therefor 1
+proc therefor iter 1
+proc ti 1
+proc tim 7
+proc tim assoc 1
+proc tim assum 1
+proc tim decr 1
+proc tim fal 1
+proc tim follow 1
+proc tim multicast 1
+proc tim requir 2
+proc tim signif 1
+proc tim vs 1
+proc tim vs.group 1
+proc tim xf 1
+proc tim xp 1
+proc tim xs 1
+proc tim ya 1
+proc tim yp 1
+proc tim ys 1
+proc timeserver 1
+proc timeserver 1server 1
+proc timetimetim 1
+proc to acc 1
+proc to build 1
+proc to chang 1
+proc to commun 2
+proc to compr 1
+proc to continu 1
+proc to enforc 1
+proc to execut 1
+proc to finish 1
+proc to ge 1
+proc to gener 1
+proc to hold 1
+proc to init 1
+proc to keep 1
+proc to know 1
+proc to loc 1
+proc to memor 1
+proc to mov 1
+proc to perform 1
+proc to posit 1
+proc to rec 1
+proc to reflect 1
+proc to shift 1
+proc to siml 1
+proc to st 1
+proc to start 1
+proc to touch 1
+proc to us 1
+proc to var 1
+proc to verif 1
+proc to wait 2
+proc tool 2
+proc tr 1
+proc transform 2
+proc transform abstract 1
+proc transform cod 1
+proc triangl 1
+proc tt 1
+proc tt quer 1
+proc typ 1
+proc un 1
+proc un system 1
+proc under consider 1
+proc under constraint 1
+proc unit 2
+proc until converg 1
+proc upd 3
+proc us 6
+proc us bar 1
+proc us bus 1
+proc us specl 1
+proc using 8
+proc using bal 1
+proc using dynam 1
+proc using neur 1
+proc using parameter 1
+proc using recur 1
+proc util 2
+proc util profil 1
+proc var 1
+proc var great 1
+proc vi register 1
+proc vi user 1
+proc virtu 1
+proc virtu mach 1
+proc vs 1
+proc wa detect 1
+proc wa kept 1
+proc wa measur 1
+proc wa perform 1
+proc wait 3
+proc want 1
+proc we model 1
+proc we scal 1
+proc wel suit 1
+proc wh 5
+proc wh control 1
+proc wh id 1
+proc wh prev 1
+proc wh ps 1
+proc when lock 1
+proc when particl 1
+proc when server 1
+proc which assum 1
+proc which attempt 1
+proc which configur 1
+proc which evalu 1
+proc which form 1
+proc which shar 1
+proc whil maintain 1
+proc whil other 1
+proc wil cal 1
+proc wil continu 1
+proc wil deliver 1
+proc wil ensur 1
+proc wil exchang 1
+proc wil execut 2
+proc wil explor 1
+proc wil hold 1
+proc wil jump 1
+proc wil lead 1
+proc wil reduc 1
+proc wil run 1
+proc wish 1
+proc with 3d 2
+proc with built 2
+proc with cluster 1
+proc with const 1
+proc with extract 1
+proc with iproc 1
+proc with maxim 1
+proc with multipl 1
+proc with nod 1
+proc with proc 3
+proc with specl 1
+proc without pag 1
+proc without using 1
+proc work 2
+proc writ 3
+proc writ pag 1
+proc yield 2
+proc zer 1
+proc. 1
+proc.2 2
+proc.ekaw90 1
+proc.ninth 1
+proc.ninth annu 1
+proc5 1
+proc5 at 167mhz 1
+procc 4
+procc tim 2
+procdef 1
+procdef dep 1
+procdef return 1
+procedur 61
+procedur ad 1
+procedur ad queu 1
+procedur al inclus 1
+procedur and becom 1
+procedur and decl 2
+procedur and equ 1
+procedur and heur 1
+procedur ar evalu 1
+procedur ar indirect 1
+procedur ar repr 1
+procedur argum 1
+procedur assign 1
+procedur avg 1
+procedur avg2 1
+procedur avg2 p4.s5a 1
+procedur bar 1
+procedur boolean 1
+procedur boolean eval 1
+procedur cal 9
+procedur cal ba 1
+procedur cal bound 1
+procedur cal inform 1
+procedur cal msld 1
+procedur cal tisld 1
+procedur can exit 1
+procedur can specif 1
+procedur check 1
+procedur check fileptr 1
+procedur clear 1
+procedur cm 1
+procedur cod 2
+procedur combin 1
+procedur compar 1
+procedur compar2 1
+procedur construc 1
+procedur contain 3
+procedur contain act 1
+procedur contain loop 1
+procedur continu 1
+procedur definit 2
+procedur describ 3
+procedur descript 1
+procedur do ec 1
+procedur doesnt elim 1
+procedur du 1
+procedur encounter 1
+procedur ensur 1
+procedur execut 1
+procedur execut perfom 1
+procedur fib 1
+procedur fo 1
+procedur for assign 1
+procedur for comput 1
+procedur for construc 1
+procedur for correct 1
+procedur for gener 2
+procedur for heapsort 1
+procedur for identif 1
+procedur for integr 1
+procedur for interact 1
+procedur for langu 1
+procedur for log 1
+procedur for lp 1
+procedur for partit 3
+procedur for prun 2
+procedur for quantif 1
+procedur for reduc 1
+procedur for sat 1
+procedur for solut 1
+procedur for stud 1
+procedur for tempor 1
+procedur for triangl 1
+procedur from ba 1
+procedur from for 1
+procedur gac 1
+procedur gm 1
+procedur gm construc 1
+procedur ha extrem 1
+procedur heapsort 1
+procedur heapsort sort 1
+procedur in clp 1
+procedur in figur 1
+procedur in modif 1
+procedur in numer 1
+procedur in order 1
+procedur initialschedl 1
+procedur input 1
+procedur input output 1
+procedur inser 1
+procedur inst 1
+procedur invoc 1
+procedur is bound 1
+procedur is comput 1
+procedur is describ 1
+procedur is execut 1
+procedur is exit 1
+procedur is giv 1
+procedur is inform 1
+procedur is lin 1
+procedur is oper 1
+procedur is repeat 1
+procedur langu 2
+procedur langu gener 1
+procedur lik patholog 1
+procedur liter 1
+procedur loc 1
+procedur loc nod 1
+procedur loc ver 1
+procedur locallyoptimaltr 1
+procedur mak 1
+procedur makeheap 1
+procedur makeheap establ 1
+procedur maketriangularheap 1
+procedur maketriangularheap establ 1
+procedur nam 1
+procedur not 1
+procedur not using 1
+procedur number 1
+procedur obtain 1
+procedur occur 1
+procedur of chronolog 1
+procedur of construc 1
+procedur of fic 1
+procedur of mlp 1
+procedur of tarsk 1
+procedur on 1
+procedur or program 1
+procedur p contain 1
+procedur patholog 1
+procedur plac 1
+procedur pr 1
+procedur print 1
+procedur proc 1
+procedur proc scop 1
+procedur q color 1
+procedur quit simil 1
+procedur re 1
+procedur red 1
+procedur red priv 1
+procedur rem 1
+procedur rem red 1
+procedur run 1
+procedur sd 1
+procedur selecttest 1
+procedur selecttest2 1
+procedur separ 1
+procedur separ allow 1
+procedur siftdown 1
+procedur siftdown build 1
+procedur styl 1
+procedur swap 1
+procedur t1t2test 1
+procedur t1t2test test 1
+procedur tabl 1
+procedur tak 1
+procedur techniqu 1
+procedur termin 2
+procedur then cr 1
+procedur to av 1
+procedur to determin 1
+procedur to find 1
+procedur to show 1
+procedur triangularheapsort 1
+procedur triangularheapsort sort 1
+procedur triangularsiftdown 1
+procedur triangulartrickledown 1
+procedur trickledown 1
+procedur twovisit 1
+procedur typ 1
+procedur us 4
+procedur us ol 1
+procedur wa found 1
+procedur wa perform 1
+procedur we know 1
+procedur when cal 1
+procedur wil conf 1
+procedur wil result 1
+procedur without becom 1
+procedur.se 1
+proceed 45
+proceed analog 1
+proceed and select 1
+proceed as follow 1
+proceed as shown 1
+proceed beyon symbol 1
+proceed bottom 1
+proceed by induc 1
+proceed by introduc 1
+proceed by rewrit 1
+proceed by show 1
+proceed by structur 1
+proceed by turn 1
+proceed cod 1
+proceed cod na 1
+proceed concur 1
+proceed correspon 1
+proceed down 1
+proceed error 1
+proceed for execut 1
+proceed from top 1
+proceed in lock 1
+proceed in parallel 1
+proceed in synchron 1
+proceed in timestep 1
+proceed multidest 1
+proceed multidest worm 1
+proceed of usen 1
+proceed ou 1
+proceed ou execut 1
+proceed simil 1
+proceed suiv 1
+proceed suiv le 1
+proceed to check 1
+proceed to construc 1
+proceed to dim 1
+proceed to disc 1
+proceed to execut 1
+proceed to form 1
+proceed to invok 1
+proceed to lower 1
+proceed to mak 1
+proceed to show 1
+proceed with fl 1
+processeur 4
+processeur a avoir 1
+processeur a besoin 1
+processeur a de 1
+processeur a lint 1
+processeur a modif 1
+processeur a plusieur 1
+processeur a pour 1
+processeur a un 1
+processeur acc 1
+processeur acc ed 1
+processeur acc edant 1
+processeur acc edent 1
+processeur acc eder 1
+processeur afin 1
+processeur afin den 1
+processeur appel 1
+processeur assez 1
+processeur assez complec 1
+processeur au 1
+processeur au cour 1
+processeur augm 1
+processeur aur 1
+processeur aur le 1
+processeur aux 1
+processeur aux pag 1
+processeur avec 1
+processeur avec le 1
+processeur ayant 1
+processeur ayant la 1
+processeur ayant le 1
+processeur ca 1
+processeur ce 1
+processeur ce qu 1
+processeur cherch 1
+processeur cibl 1
+processeur cibl etait 1
+processeur com 1
+processeur contr 1
+processeur contr ol 1
+processeur d ecrir 1
+processeur d esir 1
+processeur dacc 1
+processeur dacc eder 1
+processeur dan 1
+processeur dan la 1
+processeur dan le 1
+processeur dan un 1
+processeur de 2
+processeur de bloc 1
+processeur de lhypercub 1
+processeur de man 1
+processeur de typ 1
+processeur dev 1
+processeur dev acc 1
+processeur dev trop 1
+processeur dic 1
+processeur dic ecuter 1
+processeur diff 1
+processeur diff erent 1
+processeur direct 1
+processeur direct connect 1
+processeur disponibl 2
+processeur disponibl est 1
+processeur distinct 1
+processeur distinct acc 1
+processeur doit 1
+processeur doit acc 1
+processeur doiv 1
+processeur doiv ecrir 1
+processeur doiv modif 1
+processeur du 1
+processeur du cub 1
+processeur dun 1
+processeur dun boucl 1
+processeur dun pag 1
+processeur dur 1
+processeur dur un 1
+processeur ecrit 1
+processeur ecrit dan 1
+processeur ecrivain 1
+processeur effectu 2
+processeur effectu de 1
+processeur effectu le 1
+processeur effectu toujour 1
+processeur effectu tout 1
+processeur effectu un 1
+processeur empl 1
+processeur empl es 1
+processeur en 1
+processeur en attribu 1
+processeur en conflit 1
+processeur en in 1
+processeur en pren 1
+processeur en util 1
+processeur entr 1
+processeur entr le 1
+processeur est 2
+processeur est alor 1
+processeur est egal 1
+processeur est en 1
+processeur est inf 1
+processeur est le 1
+processeur est privil 1
+processeur est t1 1
+processeur est trop 1
+processeur et com 1
+processeur et constitu 1
+processeur et de 1
+processeur et dev 1
+processeur et la 1
+processeur et le 2
+processeur et rest 1
+processeur et seront 1
+processeur etant 1
+processeur etant dan 1
+processeur etant le 1
+processeur etant util 1
+processeur etc 1
+processeur ex 2
+processeur ex ecut 2
+processeur font 1
+processeur gr 1
+processeur gr ac 1
+processeur gril 1
+processeur gril de 1
+processeur i ecrit 1
+processeur i ecriv 1
+processeur i mod 1
+processeur i trait 1
+processeur i860 1
+processeur identiqu 1
+processeur identiqu est 1
+processeur impliqu 1
+processeur impliqu es 1
+processeur interv 1
+processeur interv dan 1
+processeur l ecritur 1
+processeur la 1
+processeur la forml 1
+processeur la var 1
+processeur le 2
+processeur le calcl 1
+processeur le dat 1
+processeur le don 1
+processeur le program 1
+processeur le sont 1
+processeur le temp 1
+processeur lim 1
+processeur m emoir 1
+processeur modif 1
+processeur montr 1
+processeur montr qu 1
+processeur n etant 1
+processeur nacc 1
+processeur nacc ed 1
+processeur ne 2
+processeur ne part 1
+processeur ne perd 1
+processeur ne peut 1
+processeur ne peuv 1
+processeur ne risqu 1
+processeur non 1
+processeur non privil 1
+processeur nous 1
+processeur nous avon 1
+processeur num 1
+processeur num er 1
+processeur ont 1
+processeur ont perm 1
+processeur oprivil 1
+processeur oprivil eg 1
+processeur p r0 1
+processeur p r1 1
+processeur p ri 1
+processeur p rj 1
+processeur p0 2
+processeur p0 env 1
+processeur p0 le 1
+processeur p0 p1 1
+processeur p1 1
+processeur par 1
+processeur par ce 1
+processeur par un 1
+processeur parcourt 1
+processeur parcourt la 1
+processeur particl 1
+processeur pen 1
+processeur pen un 1
+processeur peut 1
+processeur peut acc 1
+processeur peut effectuer 1
+processeur peut po 1
+processeur peuv 2
+processeur peuv fonctionner 1
+processeur peuv se 1
+processeur po 1
+processeur po ed 1
+processeur po edant 1
+processeur pour 2
+processeur pour le 1
+processeur pour tous 1
+processeur pouv 1
+processeur pouv communiquer 1
+processeur privil 1
+processeur privil eg 1
+processeur pu 1
+processeur pu le 1
+processeur qu 2
+processeur qu atteint 1
+processeur qu effectu 1
+processeur qu en 1
+processeur qu le 1
+processeur qu lutil 1
+processeur qu po 1
+processeur qu provoqu 1
+processeur qu se 1
+processeur re coit 1
+processeur rel 1
+processeur rel es 1
+processeur soccup 1
+processeur soccup de 1
+processeur soit 1
+processeur soit cycliqu 1
+processeur sont 1
+processeur sont de 1
+processeur sont distinct 1
+processeur sont le 1
+processeur sont privil 1
+processeur sourc 1
+processeur sourc env 1
+processeur standard 1
+processeur sur 1
+processeur sur de 1
+processeur sur lesquel 1
+processeur sur un 1
+processeur termin 1
+processeur termin alor 1
+processeur tient 1
+processeur tient compt 1
+processeur trait 2
+processeur un nombr 2
+processeur util 1
+processeur util es 1
+processeur var 1
+processeur var de 1
+processeur var ou 1
+processingnod 1
+processingnod of cl 1
+processingpartialevaluationpost 1
+processingpartialevaluationpost proc 1
+processorcluster 1
+processorcluster modl 1
+processorcluster of incr 1
+processorcluster of siz 1
+processordest 1
+processordest interm 1
+processordest interm router 1
+processorl 1
+processorshar 1
+processorsofnumber 1
+processorsourc 1
+processorsourc processordest 1
+processorsourc processordest interm 1
+processus 4
+processus a besoin 1
+processus al 1
+processus al eatoir 1
+processus compt 1
+processus compt tenu 1
+processus continu 1
+processus correspon 1
+processus correspon au 1
+processus de 2
+processus de cod 1
+processus de fon 1
+processus de multipl 1
+processus dunif 1
+processus dur 1
+processus dur lec 1
+processus en 1
+processus en est 1
+processus est 2
+processus est cr 1
+processus est rendu 1
+processus et un 1
+processus interv 1
+processus interv sur 1
+processus markov 1
+processus ne 1
+processus ne peuv 1
+processus par 1
+processus par el 1
+processus peuv 1
+processus peuv communiquer 1
+processus saccompagn 1
+processus saccompagn de 1
+processus stochastiqu 1
+processus stochastiqu dan 1
+processus sur 1
+processus sur tous 1
+proch 6
+proch de 4
+proch de la 2
+proch de loptim 1
+proch de sa 1
+proch du 4
+proch du ch 1
+proch du maxim 1
+proch du meilleur 1
+proch du nombr 1
+proch du som 1
+proch dun 2
+proch dun mach 1
+proch dun syst 1
+proch qu 1
+proch qu ne 1
+proch voisin 2
+prochain 4
+prochain but cour 1
+prochain de 1
+prochain de ce 1
+prochain it erat 1
+prochain pa 1
+prochain pa du 1
+prochain pair 1
+prochain pair dadr 1
+prochain paragraph 1
+prochain paragraph auront 1
+prochain pour 1
+prochain pour exploiter 1
+prochain r esolut 1
+prochain ver 1
+prochain ver un 1
+procrast 1
+procrast a son 1
+procrast8 1
+procrast8 qu 1
+procrast8 qu conseil 1
+procrust 1
+procrust method 1
+proct 1
+proct oe 1
+proct or status 1
+proct to oe 1
+proct to select 1
+proct with status 1
+prod 1
+prod and compl 1
+produ 2
+produ de 1
+produ plus de 1
+produc 89
+produc a bush 1
+produc a cel 1
+produc a compl 1
+produc a curv 1
+produc a cycl 1
+produc a damp 1
+produc a default 1
+produc a degener 1
+produc a fin 1
+produc a fragm 1
+produc a further 1
+produc a good 2
+produc a hyperbol 1
+produc a laser 1
+produc a list 1
+produc a mach 1
+produc a measur 1
+produc a piec 1
+produc a quant 1
+produc a quantif 1
+produc a reconstruc 1
+produc a saving 1
+produc a schedl 1
+produc a schem 1
+produc a singl 3
+produc a smooth 1
+produc a soc 1
+produc a speech 1
+produc a tool 1
+produc a trac 1
+produc a valu 1
+produc a ver 1
+produc a ye 1
+produc accur 1
+produc accur loc 1
+produc achief 1
+produc ad 1
+produc ad2at 1
+produc ad2at consum 1
+produc addit 1
+produc addit aff 1
+produc after futur 1
+produc after replac 1
+produc al sent 1
+produc altern 1
+produc altern answer 1
+produc an anom 1
+produc an answer 1
+produc an imag 1
+produc an integer 1
+produc an interior 1
+produc an interpol 1
+produc an optim 1
+produc an output 3
+produc an over 1
+produc an unsubsum 1
+produc and denot 1
+produc and natur 1
+produc and qu 1
+produc and saxp 1
+produc and vect 1
+produc another hypoth 1
+produc another imag 1
+produc any blowup 1
+produc any growth 1
+produc any output 1
+produc appl 2
+produc appl dialog 1
+produc appl equ 1
+produc aq 1
+produc ar avail 1
+produc ar comput 1
+produc ar exchang 1
+produc ar perform 1
+produc ar sent 1
+produc at ti 1
+produc b rep 1
+produc bad 1
+produc bad cod 1
+produc better partit 1
+produc better qu 1
+produc better result 1
+produc better solut 1
+produc bi 1
+produc bush 1
+produc bush tr 1
+produc by affin 1
+produc by appl 1
+produc by art 1
+produc by branch 1
+produc by decr1 1
+produc by direct 1
+produc by execut 1
+produc by gklr 1
+produc by gr 1
+produc by hem 1
+produc by henricson 1
+produc by high 1
+produc by initialschedl 1
+produc by mlkp 1
+produc by multilevel 1
+produc by proc 1
+produc by project 1
+produc by reflect 1
+produc by replac 2
+produc by rm 2
+produc by shift 2
+produc by system 1
+produc by var 1
+produc c sourc 1
+produc cal 1
+produc cl 1
+produc coar 1
+produc coar graph 1
+produc com 1
+produc compan 1
+produc compreh 1
+produc compreh inst 1
+produc con 1
+produc con curv 1
+produc connect 1
+produc connect edg 1
+produc consort 1
+produc damp 1
+produc damp controller 1
+produc de 2
+produc de cod 1
+produc de contraint 1
+produc dep 1
+produc descript 1
+produc disjunct 1
+produc dur unif 1
+produc dwk2 1
+produc e00 1
+produc eff 1
+produc eff schedl 1
+produc either confid 1
+produc el 1
+produc el produc 1
+produc environm 1
+produc equ 1
+produc erron 1
+produc erron result 1
+produc event 1
+produc everyd 1
+produc exact 1
+produc execut 1
+produc execut cod 1
+produc fac 1
+produc fal 1
+produc fal positiv 1
+produc fil 1
+produc freehand 1
+produc freehand using 1
+produc from edg 1
+produc from grammar 1
+produc from proc 1
+produc from textur 1
+produc funct 1
+produc further 1
+produc further quest 1
+produc gener 1
+produc gener cod 1
+produc good 1
+produc good init 1
+produc good partit 1
+produc group 1
+produc group work 1
+produc growth 1
+produc gt 1
+produc gt gi 1
+produc guidel 1
+produc hard 1
+produc hard contribut 1
+produc high 1
+produc high skew 1
+produc high throughput 1
+produc ident 1
+produc ident output 1
+produc if interior 1
+produc illtyp 1
+produc illtyp answer 1
+produc imag 1
+produc intern 1
+produc is compl 1
+produc is correct 1
+produc is creat 1
+produc is describ 1
+produc is perform 1
+produc is pr 1
+produc is proport 1
+produc is regr 1
+produc is rel 1
+produc it output 1
+produc it span 1
+produc it specif 1
+produc layout 1
+produc layout plan 1
+produc libr 1
+produc littl benefit 1
+produc loc 1
+produc loc optim 1
+produc longer 1
+produc longer text 1
+produc mor complec 1
+produc mor gener 1
+produc mor nondetermin 1
+produc mor soph 1
+produc mor us 1
+produc near optim 1
+produc new red 1
+produc new reg 1
+produc nic 1
+produc nic design 1
+produc njw 1
+produc no infer 1
+produc no intersect 1
+produc no learn 1
+produc of connect 1
+produc of d1 1
+produc of distinct 1
+produc of proc 1
+produc of regl 1
+produc of se 1
+produc of sequ 1
+produc of softwar 1
+produc of var 1
+produc of variabl 1
+produc on imag 1
+produc on solut 1
+produc onl funct 1
+produc or modif 1
+produc or work 1
+produc order 1
+produc output 1
+produc overview 3
+produc overwhelm 1
+produc pack 1
+produc part 1
+produc part us 1
+produc partit 1
+produc per cg 1
+produc per iter 1
+produc poor 3
+produc poor result 2
+produc poor shap 1
+produc pot 1
+produc pot conflict 1
+produc prec 1
+produc prec improv 1
+produc proc 1
+produc project 1
+produc project natur 1
+produc r configur 1
+produc reason 1
+produc reg 1
+produc reg ec 1
+produc rel 2
+produc rel answer 1
+produc requir 2
+produc requir commun 1
+produc result 1
+produc rl 3
+produc rl contain 1
+produc rl ind 1
+produc simplif 1
+produc simplif polynom 1
+produc slight 1
+produc som gener 1
+produc spac 1
+produc spac xu 1
+produc span 1
+produc span tr 1
+produc straight 1
+produc straight lin 1
+produc string 1
+produc th answer 1
+produc th canon 1
+produc th closest 1
+produc th comput 1
+produc th correct 1
+produc th docum 1
+produc th effect 1
+produc th expect 2
+produc th highest 1
+produc th imag 1
+produc th interior 1
+produc th ith 1
+produc th operand 1
+produc th optim 1
+produc th result 1
+produc th sought 1
+produc th subtr 1
+produc th worst 1
+produc thin 1
+produc thin lin 1
+produc to proc 1
+produc tok 1
+produc trac 1
+produc triangl 1
+produc tw imag 1
+produc tw laser 1
+produc undesir 1
+produc undesir result 1
+produc using 2
+produc using standard 1
+produc valu 1
+produc valu correspon 1
+produc var 1
+produc variabl 1
+produc ver accur 1
+produc ver good 1
+produc verif 1
+produc web 1
+produc web ba 1
+produc wer replac 1
+produc with loc 1
+produc workload 1
+produc workload pack 1
+produc zer 1
+produc zer confid 1
+producer 1
+producteur 1
+producteur consommateur 1
+producteur producteur 1
+produir 3
+produir de 1
+produir du 2
+produir du cod 1
+produir du faux 1
+produir en 1
+produir en fonct 1
+produir le 1
+produir le cod 1
+produir le deux 1
+produir le diff 1
+produir pa 1
+produir pa de 1
+produir quau 1
+produir quau bout 1
+produir un 1
+produir un cop 1
+produir un nombr 1
+produit 5
+produit a la 1
+produit automatiqu 1
+produit automatiqu par 1
+produit dan 1
+produit dan le 1
+produit de 2
+produit de matr 1
+produit de quatern 1
+produit deux 1
+produit deux individus 1
+produit din 1
+produit din egalit 1
+produit dun 1
+produit dun matr 1
+produit en 1
+produit en util 1
+produit est 2
+produit est alor 1
+produit est ant 1
+produit et facil 1
+produit ext 1
+produit ext rieur 1
+produit jam 1
+produit la 2
+produit la configur 1
+produit la contraint 1
+produit le 1
+produit lor 1
+produit lor dun 1
+produit matr 1
+produit matr vecteur 1
+produit matriciel 1
+produit matriciel converg 1
+produit mixt 1
+produit naturel 1
+produit naturel de 1
+produit par 3
+produit par concat 1
+produit par lagc 1
+produit par un 1
+produit peu 1
+produit peu din 1
+produit scalair 1
+produit scalair eucl 1
+produit sel 1
+produit sel le 1
+produit tensoriel 1
+produit tensoriel di 1
+produit tr 1
+produit tr ver 1
+produit un tr 1
+produit vectoriel 1
+produit vectoriel dan 1
+produit vectoriel ou 1
+produit y.p 1
+prof 8
+prof gultekin 1
+prof gultekin ozsoyoglu 1
+profil 9
+profil ba 1
+profil ba method 1
+profil ba system 1
+profil cut 1
+profil fail 1
+profil if anonym 1
+profil ind 1
+profil inform 1
+profil of item 1
+profil of rang 1
+profil smooth 1
+profil stat 1
+profil support 1
+profit 9
+profit de 1
+profit de comparer 1
+profit de facilit 1
+profit de la 1
+profit de laffinit 1
+profit de propr 1
+profit dun 1
+profit dun pa 1
+profit educ 1
+profit if smaller 1
+profit in reduc 1
+profit incr 1
+profit link 1
+profit speedup 1
+profit speedup fact 1
+profit technolog 1
+profiter 1
+profiter de 1
+profiter de champ 1
+profiter de la 1
+profon 2
+profon a lieu 1
+profon d efin 1
+profon dan 1
+profon dan la 1
+profon de 2
+profon de ag 1
+profon de la 1
+profon dun 1
+profon dun claus 1
+profon est 1
+profon est aus 1
+profon est en 1
+profon est identiqu 1
+profon est termin 1
+profon et chaqu 1
+profon et lautr 1
+profon et superficiel 1
+profon fail 1
+profon fail deep 1
+profon modif 1
+profon modif eventuel 1
+profon non 1
+profon non termin 1
+profon peut 1
+profon peut direct 1
+profon peut etr 1
+profon po exhib 1
+profon qu 1
+profon qu co 1
+profon san compromettr 1
+profon san touch 1
+profon sappu 1
+profon sappu sur 1
+profon termin 1
+profon termin sont 1
+profon vn 1
+profondeur 2
+profondeur d epen 1
+profondeur dabord 1
+profondeur dabord avec 1
+profondeur de 2
+profondeur de boucl 1
+profondeur de fonct 1
+profondeur de pil 1
+profondeur du 1
+profondeur du nid 1
+profondeur et dapr 1
+profondeur maxim 1
+profondeur maxim de 1
+profondeur maxim pm 1
+profondeur pm 1
+profondeur quatr 1
+profondeur quatr aspect 1
+profound 1
+profound understand 1
+prog 2
+prog claus 1
+prog goal 1
+prog nam 1
+prog nam nam 1
+progn 1
+progn form 1
+progn form occur 1
+progn modl 1
+progn modl form 1
+progn return 1
+progn spec form 1
+progr 33
+progr alw adv 1
+progr an output 1
+progr and system 1
+progr ar satisf 1
+progr at tim 1
+progr being mad 1
+progr by writ 1
+progr can resum 1
+progr carneg 1
+progr carneg mellon 1
+progr construc 1
+progr improv 2
+progr in artif 1
+progr in mathemat 1
+progr in vl 1
+progr incr 2
+progr is ident 1
+progr le 1
+progr learn 1
+progr learn proper 1
+progr mad 1
+progr mesh 1
+progr of bar 1
+progr of evalu 1
+progr par 1
+progr par pa 1
+progr recur 1
+progr refin 1
+progr refin tetrahedr 1
+progr simpl 1
+progr simpl complec 1
+progr slow 1
+progr tetrah. 1
+progr tetrahedr 1
+progr tetrahedr. 1
+progr tetrahedralizat. 1
+progr to real 1
+progr vi clr 1
+program 94
+program a distribut 1
+program acceler 1
+program acceler payoff 1
+program accord 1
+program act 1
+program actu 1
+program actu act 1
+program adapt 1
+program affect 1
+program agent 1
+program agent fil 1
+program aid 1
+program ait 1
+program ait vraim 1
+program al def 1
+program algorithm 4
+program alignm 1
+program allow 1
+program an 5
+program an ba 1
+program an framework 1
+program an inform 2
+program an tool 1
+program an using 1
+program and chang 2
+program and conver 1
+program and dat 2
+program and deduc 1
+program and displ 1
+program and eff 2
+program and expr 1
+program and ext 1
+program and extr 1
+program and freed 1
+program and high 1
+program and le 1
+program and lfp 1
+program and log 1
+program and lp 1
+program and model 1
+program and modif 1
+program and pct 1
+program and peopl 1
+program and proc 1
+program and prop 1
+program and react 1
+program and select 1
+program and simplif 1
+program and st 1
+program and synchron 1
+program and term 1
+program and test 2
+program and therefor 1
+program and toy 1
+program and typ 1
+program and valu 1
+program and ver 1
+program appear 1
+program appel 1
+program appl 2
+program appl con 1
+program approach 1
+program approxim 1
+program approxim approxim 1
+program ar 3
+program ar comput 1
+program ar consider 2
+program ar construc 1
+program ar contextu 1
+program ar control 1
+program ar deem 1
+program ar defin 1
+program ar difficult 1
+program ar equiv 1
+program ar execut 3
+program ar form 1
+program ar forml 1
+program ar interpr 1
+program ar rar 1
+program ar repr 1
+program ar systemat 1
+program ar transform 1
+program ar traver 1
+program ar typ 1
+program ar unchang 1
+program ar writ 1
+program architectur 1
+program arith 1
+program as 1
+program as dat 1
+program as introduc 1
+program as map 1
+program as separ 1
+program as typ 1
+program as valu 1
+program attempt 1
+program au 2
+program au ca 1
+program au context 1
+program au plac 1
+program automatiqu 1
+program avec 1
+program avec lorgan 1
+program avg 1
+program ayant 1
+program ayant pour 1
+program ayant serv 1
+program ba 3
+program ba object 1
+program becam 1
+program becam softwar 1
+program becaus backtrack 1
+program began 1
+program began execut 1
+program behavior 1
+program behavior const.11 1
+program behaviour 1
+program being appl 1
+program below illustr 1
+program boast 1
+program build 2
+program but program 1
+program but sp 1
+program by exampl 1
+program by manu 1
+program by select 1
+program by ullman 1
+program cal maud 1
+program cal me 1
+program can arbitr1 1
+program can find 1
+program can prov 1
+program can rel 1
+program can show 1
+program can tak 1
+program can us 1
+program cannot distingu 1
+program cannot produc 1
+program cannot rel 1
+program caus 2
+program caus distribut 1
+program caus problem 1
+program cb 1
+program cel 1
+program cel ai 1
+program cel cont 1
+program cel fa 1
+program classiqu 1
+program claus 5
+program claus contain 1
+program claus def 1
+program claus regard 1
+program cod 1
+program com 2
+program com etant 1
+program command 1
+program commun 2
+program compl 1
+program compon 1
+program comport 1
+program comput 2
+program con 3
+program con sur 1
+program concept 1
+program confer91 1
+program consider 1
+program consider us 1
+program construc 6
+program construc purp 2
+program contain 5
+program contain sid 1
+program context 1
+program continu 1
+program control 1
+program control tabl 1
+program conv 1
+program correspon 1
+program could comb 1
+program counter 2
+program cour 1
+program cr 1
+program cur 1
+program cur consider 1
+program curricl 1
+program cycliqu 1
+program cycliqu sur 1
+program d efin 1
+program d etermin 1
+program datab 1
+program datab outputdatab 1
+program de 3
+program de calcl 1
+program de cod 1
+program de la 1
+program de man 1
+program de propag 1
+program de secon 1
+program de tail 1
+program de test 1
+program de tr 1
+program de typ 1
+program declin 1
+program def 1
+program defin 1
+program denot 1
+program dep 4
+program dep graph 1
+program dep interpr 1
+program dep slowdown 1
+program deriv 1
+program descript 1
+program descript test 1
+program design 4
+program design techniqu 1
+program dev 1
+program developm 1
+program developm methodolog 1
+program dhydrodynamiqu 1
+program diff 1
+program diff erent 1
+program diffus 1
+program direct chang 1
+program direct modif 1
+program directiv 1
+program dispatch 1
+program dispatch csvm 1
+program dmxp 1
+program dmxp triangulair 1
+program don 1
+program dont le 1
+program du 3
+program du paragraph 1
+program du typ 1
+program dun 1
+program dun acc 1
+program e par 1
+program ea 1
+program each dim 1
+program each tim 1
+program ecoop91 1
+program effect 1
+program electron 1
+program electron computer 1
+program en 4
+program en conserv 1
+program en diff 1
+program en lim 1
+program en logiqu 1
+program en offr 1
+program en proc 1
+program en secon 1
+program en vu 1
+program enter 1
+program environm 8
+program environm using 1
+program equiv 1
+program escap 1
+program escap stat 1
+program est 2
+program est devenu 1
+program est guid 1
+program est tel 1
+program et de 1
+program et du 1
+program et exploiter 1
+program et outil 1
+program et princip 1
+program et sur 1
+program evalu 2
+program eventu 1
+program eventu reach 1
+program eventu resatisf 1
+program evolut 2
+program except fp 1
+program execut 11
+program execut graph 1
+program execut hist 1
+program execut known 1
+program execut model 1
+program execut speed 1
+program execut tim 1
+program exhib 1
+program exhib de 1
+program exper 1
+program famil 1
+program featur 1
+program ff 1
+program find 1
+program flap 1
+program flat 1
+program fonctionnel 1
+program for complec 1
+program for comput 1
+program for conw 1
+program for de 1
+program for distribut 1
+program for execut 1
+program for fast 1
+program for human 1
+program for matr 1
+program for model 1
+program for nest 1
+program for order 1
+program for parallel 1
+program for partit 1
+program for perform 1
+program for react 1
+program for sa 1
+program for select 1
+program for solut 2
+program for st 1
+program for stud 1
+program for synchron 1
+program for theorem 1
+program for upd 1
+program for visu 1
+program for worldw 1
+program form 2
+program fortran 1
+program fortran dmxp 1
+program fr 2
+program fr forml 1
+program fragm 2
+program framework 2
+program from low 1
+program from old 1
+program from specif 1
+program from splash 1
+program fs 1
+program fs opt 1
+program funct 1
+program gat 1
+program gat ar 1
+program gener 3
+program giv 2
+program giv earl 1
+program glob 1
+program grand 1
+program grand challeng 1
+program graph 2
+program graph gp 1
+program guidel 1
+program ha succeed 1
+program harder 1
+program hav report 1
+program heapsort 1
+program held 1
+program high 2
+program high level 1
+program high parallel 1
+program if 8d 1
+program if oe 1
+program implem 3
+program in act 1
+program in argus 1
+program in chron 1
+program in comparison 1
+program in concur 1
+program in conjunct 1
+program in depth 1
+program in eulisp 1
+program in fact 1
+program in figur 2
+program in langu 1
+program in lin 1
+program in lind 1
+program in log 1
+program in mlp 1
+program in pe 1
+program in prolog 2
+program in sect 1
+program in term 1
+program in theor 1
+program inclu 1
+program inclu de 1
+program incorpor 1
+program incorpor structur 1
+program induc 1
+program inevit 1
+program inform 1
+program init 1
+program init est 1
+program init sont 1
+program init trait 1
+program int constraint 1
+program int segm 1
+program int sequ 1
+program integr 1
+program integr algorithm 1
+program interest 1
+program interest group 1
+program interfac 1
+program invok 1
+program involut 1
+program is activ 1
+program is ba 2
+program is compil 1
+program is compl 1
+program is comput 1
+program is concern 1
+program is consider 1
+program is conver 1
+program is defin 2
+program is deriv 1
+program is design 1
+program is du 1
+program is embod 1
+program is execut 2
+program is fe 1
+program is fic 1
+program is fin 1
+program is giv 2
+program is id 1
+program is known 1
+program is link 1
+program is non 1
+program is part 1
+program is particl 1
+program is prepar 1
+program is presum 1
+program is real 1
+program is reason 1
+program is repr 2
+program is run 1
+program is said 1
+program is st 1
+program is support 1
+program is tak 1
+program is typ 1
+program isol 1
+program it eratif 1
+program l egal 1
+program la 1
+program la diffus 1
+program labor 1
+program langu 46
+program langu an 1
+program langu appear 1
+program langu aspect 1
+program langu ba 1
+program langu babel 1
+program langu cesp 1
+program langu chal 1
+program langu chip 2
+program langu chronolog 1
+program langu commun 1
+program langu compiler 1
+program langu concept 1
+program langu construc 1
+program langu dat 1
+program langu design 6
+program langu eulisp 1
+program langu haskel 1
+program langu implem 3
+program langu indep 1
+program langu luc 1
+program langu manu 1
+program langu ml 1
+program langu occam 1
+program langu pltim 1
+program langu prolog 1
+program langu refer 1
+program langu support 1
+program langu tok 2
+program langu us 1
+program langu user 1
+program lawr 1
+program lawr livermor 1
+program le 1
+program le nombr 1
+program le pav 1
+program lead 2
+program level 1
+program level cpur 1
+program lhr71 1
+program lif 1
+program lif cycl 1
+program lik eqntot 1
+program lik figur 1
+program lik fp 1
+program lik li 1
+program lik speech 1
+program lin 2
+program lin eair 2
+program llk18 1
+program lloyd 1
+program loc 1
+program log 3
+program log langu 1
+program logiqu 1
+program logiqu avec 1
+program logiqu de 1
+program logiqu qu 1
+program look 1
+program loop 1
+program loop indefinit 1
+program lor 1
+program lor de 1
+program lun 1
+program lun apr 1
+program m ye 1
+program machin 1
+program machin analog 1
+program manipl 1
+program manu 1
+program map 1
+program may exhibit 1
+program may fal 1
+program may lead 1
+program may produc 2
+program may result 1
+program mechan 2
+program methodolog 1
+program methodolog group 1
+program mi 1
+program mi au 1
+program mistak 1
+program model 9
+program model comp 1
+program model concept 1
+program model intersect 1
+program model support 1
+program model try 1
+program modif 2
+program modif program 1
+program multipl 3
+program multipl dat 3
+program must assum 1
+program must conform 1
+program nam 2
+program nb 1
+program nb point 1
+program nb retour 1
+program ne 2
+program ne constitu 1
+program ne serait 1
+program ne soit 1
+program near 1
+program near doubl 1
+program no longer 1
+program no proc 1
+program not 1
+program nous 1
+program nous avon 1
+program nutil 2
+program nutil pa 1
+program nutil qu 1
+program object 1
+program object orient 1
+program obtenus 1
+program obtenus nest 1
+program oe 1
+program oe comput 1
+program oe oe 1
+program oe1 1
+program oe2 1
+program of complec 1
+program of concur 1
+program of datalog 1
+program of empir 1
+program of figur 1
+program of mlp 1
+program of react 1
+program of research 1
+program off 1
+program offer 1
+program oft constitut 1
+program on est 1
+program on high 1
+program on multiproc 1
+program on prim 1
+program onc prepar 1
+program onl after 1
+program ont 2
+program ont hom 1
+program ont port 1
+program ont pour 1
+program optim 1
+program optim la 1
+program or procedur 1
+program or subsystem 1
+program order 2
+program ordonnanc 1
+program ordonnanc es 1
+program orient 1
+program origin 1
+program originaux 1
+program originaux ecrit 1
+program ou 1
+program ou de 1
+program our analyzer 1
+program p con 1
+program p start 1
+program p1 1
+program par 3
+program par echang 1
+program par ecritur 1
+program par el 2
+program par le 2
+program par part 1
+program par son 1
+program par transform 1
+program paradigm 7
+program paradigm avail 1
+program parallel 1
+program partit 1
+program patholog 1
+program perform 4
+program period 1
+program perl 1
+program perm 1
+program perm de 1
+program perm etud 1
+program perm nous 1
+program peut 1
+program peut etr 1
+program peuv 1
+program peuv contenir 1
+program peuv offrir 1
+program plus complec 1
+program po 1
+program po ed 1
+program pointer 1
+program pool 1
+program possibl 1
+program pour 2
+program pour estimer 1
+program pour la 1
+program pour lesquel 1
+program pour mach 1
+program pour mvp 1
+program pour quatr 1
+program ppq 1
+program pr 2
+program pr ec 1
+program pr esent 1
+program pract 2
+program prec 1
+program prefer 1
+program prescrib 1
+program problem 4
+program proc 1
+program procedur 2
+program procedur loc 1
+program produc 1
+program produc pot 1
+program program 3
+program prolog 1
+program prolog ex 1
+program purp 1
+program put 1
+program qu 2
+program qu le 1
+program qu lon 1
+program qu nous 1
+program qu sont 1
+program quel 1
+program quel dev 1
+program r eclam 1
+program r eel 1
+program r esult 1
+program rapport 1
+program rapport de 1
+program rar 1
+program rar remain 1
+program reach 2
+program recover 1
+program recur 2
+program recur find 1
+program reg 1
+program rel 3
+program rel smaller 1
+program remain 1
+program remain us 1
+program remplac 1
+program remplac chaqu 1
+program repetit 1
+program repetit task 1
+program replac 1
+program report 1
+program repr 1
+program requir 2
+program research 3
+program research group 3
+program respect 1
+program restructur 1
+program result 2
+program retenu 1
+program reus 1
+program reus dat 1
+program rl 1
+program rl g1 1
+program rom 1
+program run 4
+program s equentiel 2
+program s eten 1
+program s start 1
+program san arithm 1
+program san lectur 1
+program satisf 2
+program satisf progr 1
+program saw 1
+program saw improv 1
+program schedl 1
+program schem 2
+program se 1
+program select 1
+program select research 1
+program separ 1
+program ser 3
+program ser donc 1
+program should st 1
+program should tak 1
+program show 1
+program show mark 1
+program shown 2
+program shuffl 1
+program simpl 1
+program siz 2
+program siz reduc 1
+program smart 1
+program so nam 1
+program solut 4
+program sont 2
+program sont don 1
+program sont donc 1
+program sont typiqu 1
+program sourc 1
+program sourc chang 1
+program specif 4
+program specif writ 1
+program speedup 1
+program spen 1
+program spmd 2
+program spmd issu 1
+program spmd perm 1
+program spreadsh 1
+program ss 3
+program st 1
+program stack 1
+program stack renam 1
+program standard 1
+program start 1
+program stat 2
+program stem 1
+program stil consider 1
+program strextract 1
+program structur 3
+program structur tr 1
+program stud 1
+program styl 2
+program styl issu 1
+program subject 1
+program such system 1
+program such transact 1
+program suiv 2
+program suiv habituel 1
+program summer 1
+program support 1
+program support libr 1
+program sur 1
+program sur le 1
+program sy 1
+program sy contain 1
+program synth 1
+program system 9
+program tail 1
+program tail mac 1
+program tak 1
+program task 3
+program techniqu 4
+program termin 1
+program test 2
+program test using 1
+program text 1
+program th compon 1
+program th computer 1
+program th metaobject 1
+program th viewpoint 1
+program than simp 1
+program that comput 1
+program that con 1
+program that contain 1
+program that coord 1
+program that def 1
+program that dr 1
+program that explain 1
+program that exploit 1
+program that gener 1
+program that impl 1
+program that occur 1
+program that seem 1
+program that solut 1
+program that specif 1
+program that us 3
+program that work 1
+program that writ 1
+program then car 1
+program theor 1
+program through stat 1
+program timer 1
+program timer acc 1
+program to appear 1
+program to check 1
+program to comput 1
+program to execut 1
+program to exper 1
+program to extern 1
+program to fail 1
+program to handl 1
+program to help 1
+program to hpf 1
+program to me 1
+program to model 1
+program to nam 1
+program to object 1
+program to perform 1
+program to program 1
+program to reflect 1
+program to run 1
+program to sen 1
+program to solut 1
+program to succeed 1
+program to us 1
+program to vect 3
+program tok 1
+program tool 4
+program tool develop 1
+program tourn 1
+program transform 6
+program transform es 1
+program triangularheapsort 1
+program under prepar 1
+program under test 1
+program underg 1
+program understand 1
+program us 4
+program using 5
+program using dataflow 1
+program using equ 1
+program using fr 1
+program using non 1
+program usu con 1
+program util 1
+program util ce 1
+program util es 1
+program ver 1
+program ver flec 1
+program vi 1
+program vi ext 1
+program vi textu 1
+program visu 1
+program visu system 1
+program wa ba 1
+program wa develop 1
+program wa siml 1
+program we def 1
+program wer compil 2
+program wer consider 1
+program wer run 1
+program wh 5
+program wh direct 1
+program wh diversif 1
+program wh effect 1
+program wh multipl 1
+program wh term 1
+program which an 1
+program which contain 1
+program which follow 1
+program which modif 1
+program which solut 1
+program which us 1
+program whil improv 1
+program wil far 1
+program wil gener 1
+program wil remain 1
+program wil ten 1
+program with cl 1
+program with constraint 1
+program with custom 1
+program with den 1
+program with exp 1
+program with finit 1
+program with funct 1
+program with gap 1
+program with gener 1
+program with inst 1
+program with irregl 1
+program with lim 1
+program with me 1
+program with memor 2
+program with meter 1
+program with neg 1
+program with nondeterm 1
+program with nondetermin 1
+program with part 1
+program with polymorph 1
+program with pr 1
+program with proc 1
+program with propag 1
+program with recur 1
+program with respect 1
+program with reus 1
+program with sequ 1
+program with simpler 1
+program with smaller 1
+program with stat 1
+program with typ 1
+program with underl 1
+program with virtu 1
+program without affect 1
+program without inherit 1
+program without me 1
+program without recur 1
+program without using 1
+program work 4
+program workshop 1
+program writ 9
+program writ using 1
+program zebr 1
+program zur 1
+program zur method 1
+program. 1
+program.14 1
+program85 2
+program90 1
+programer 1
+programer comp 1
+programmer 26
+programmer agr 1
+programmer and eml 1
+programmer and modif 1
+programmer ar recom 1
+programmer can ad 1
+programmer can reason 1
+programmer can us 1
+programmer can writ 1
+programmer could specif 1
+programmer customiz 1
+programmer differ 1
+programmer differ qualit 1
+programmer dont think 1
+programmer enh 1
+programmer in build 1
+programmer is requir 1
+programmer maintain 1
+programmer mak 1
+programmer mak fewer 1
+programmer manu 3
+programmer manu ver 1
+programmer must inclus 1
+programmer must understand 1
+programmer onl us 1
+programmer s guid 1
+programmer select 1
+programmer should author 1
+programmer should concentr 1
+programmer should ensur 1
+programmer should writ 1
+programmer specif 1
+programmer to describ 1
+programmer to perform 1
+programmer to put 1
+programmer to specif 1
+programmer to understand 1
+programmer to writ 2
+programmer vi 1
+programmer wa car 1
+programmer wil adm 1
+programmeur 4
+programmeur ch 1
+programmeur ch de 1
+programmeur dappl 1
+programmeur dappl adapt 1
+programmeur de 1
+programmeur de probl 1
+programmeur de sassurer 1
+programmeur deux 1
+programmeur deux typ 1
+programmeur et le 1
+programmeur ou 1
+programmeur ou au 1
+programmeur ou du 1
+programmeur ou le 1
+programmeur pour 1
+programmeur sous 1
+programmeur sous form 1
+programmeur un 1
+programmeur un vi 1
+programmultipl 1
+programmultipl dat 1
+programmultipl dat comput 1
+programstart 1
+programstart mac 1
+prohibit 10
+prohibit appl 1
+prohibit cycl 1
+prohibit cycl dep 1
+prohibit degener 1
+prohibit of scal 1
+prohibit privileg 1
+prohibit privileg shar 1
+prohibit to plac 1
+prohibit tru interact 1
+proj 7
+proj 5000k 1
+proj 5000k 6000k 1
+proj and assign 1
+proj avort 1
+proj de 1
+proj de pesqu 1
+proj ep 1
+proj fortran 1
+proj kcm 1
+proj p1 1
+proj p1 p50 1
+proj pandor 1
+proj repc 1
+proj sor 1
+proj sor institut 1
+proj universitair 1
+proj universitair montr 1
+proj wh 1
+proj wh budg 1
+proj wh pn 1
+proj wh pnam 1
+proj x sur 1
+projb 1
+projb wh 1
+projb wh budgetu 1
+projb wh pn 1
+project 53
+project a cost 1
+project a horizont 1
+project a partit 1
+project a strip 1
+project a ver 1
+project ag 6
+project an ey 1
+project and found 1
+project and inser 1
+project and led 1
+project ap 1
+project at berkel 1
+project at oxford 1
+project ba 1
+project ba spat 1
+project built 1
+project compr 1
+project confer 1
+project convec 1
+project convec rest 1
+project convec sur 1
+project correspon 1
+project dan 1
+project dan un 1
+project de 1
+project de e1 1
+project de lensembl 1
+project de point 1
+project docum 1
+project du 1
+project du domain 1
+project du pol 1
+project each empl 1
+project either ver 1
+project emp 1
+project empsl 1
+project empttl 1
+project ent 1
+project ent er 1
+project esp 1
+project ha develop 1
+project horizont 1
+project horizont laser 1
+project i work 1
+project in prob 1
+project int subproject 1
+project is organ 1
+project is perform 1
+project is theor 1
+project is0 1
+project laser 1
+project laser beam 1
+project laser strip 1
+project lyd 1
+project m convec 1
+project manag 1
+project manag lim 1
+project method 1
+project natur 1
+project natur join 1
+project ne 1
+project ne sont 1
+project network 1
+project network ba 1
+project newt 1
+project newt bar 1
+project number 1
+project of ev 1
+project of larger 1
+project of polyhedr 1
+project of ver 1
+project oper 2
+project or filter 1
+project orthogon 1
+project orthogon de 1
+project orthogon du 1
+project out aff 1
+project out var 1
+project p1098 1
+project partit 1
+project partit pi 1
+project polyhedr 1
+project profil 1
+project profil ba 1
+project profil cut 1
+project profil fail 1
+project qu 1
+project qu retourn 1
+project rationnel 1
+project register 1
+project result 1
+project select 1
+project select join 1
+project sum 1
+project sur 1
+project sur le 1
+project th laser 1
+project th sign 1
+project th vect 1
+project to a1 1
+project to ad 1
+project to langu 1
+project to succ 1
+project took 1
+project tr 1
+project tw ey 1
+project undertak 1
+project undertak inclus 1
+project underw 1
+project using 1
+project using object 1
+project ver 2
+project wa motiv 1
+project wh cur 1
+project which us 1
+projectif 1
+projectif dim 1
+projectif soum 1
+projectif soum aux 1
+projttl 1
+projttl rel 1
+projttl wh 1
+projttl wh budgetu 1
+projttl wh pn 1
+projttl wh pnam 1
+prolifer 3
+prolifer of proc 1
+prolifer of switch 1
+prolog 13
+prolog a futur 1
+prolog a mieux 1
+prolog a partir 1
+prolog a prolog 1
+prolog ait 1
+prolog an impur 1
+prolog and dat 1
+prolog and infinit 1
+prolog and knowledg 1
+prolog and prov 1
+prolog and run 1
+prolog and zstep 1
+prolog approach 1
+prolog architectur 1
+prolog as bin 1
+prolog as implem 1
+prolog as op 1
+prolog ba 1
+prolog ba ee 1
+prolog becaus writ 1
+prolog by allow 1
+prolog by bim 1
+prolog by tr 1
+prolog claus 2
+prolog commun 1
+prolog compil 1
+prolog compil pr 1
+prolog compiler 2
+prolog compiler bear 1
+prolog construit 1
+prolog construit au 1
+prolog control 1
+prolog control flow 1
+prolog dan 1
+prolog dan le 1
+prolog dat 1
+prolog dat refer 1
+prolog de 1
+prolog de ba 1
+prolog de kantrowitz 1
+prolog de kcm 1
+prolog de la 1
+prolog deal 1
+prolog debugger 1
+prolog developm 1
+prolog eff 1
+prolog en 1
+prolog en term 1
+prolog en util 1
+prolog eng 2
+prolog eng wam 1
+prolog ent 1
+prolog est 1
+prolog est de 1
+prolog est pr 1
+prolog est traditionnel 1
+prolog et de 1
+prolog et la 1
+prolog et le 1
+prolog et lunif 1
+prolog et son 1
+prolog et wam 1
+prolog etendus 1
+prolog evolu 1
+prolog ex 1
+prolog ex ecut 1
+prolog execut 2
+prolog ext 1
+prolog featur 1
+prolog featur fl 1
+prolog fid 1
+prolog fid el 1
+prolog flag 1
+prolog form 1
+prolog fourn 1
+prolog goal 1
+prolog goal direct 1
+prolog hardwar 1
+prolog hardwar support 1
+prolog haut 1
+prolog haut perform 1
+prolog ii 3
+prolog ii mal 1
+prolog implem 4
+prolog implem techniqu 1
+prolog import 1
+prolog in contrast 1
+prolog in hilog 1
+prolog ind 1
+prolog ind instruc 1
+prolog init 1
+prolog init de 1
+prolog instruc 3
+prolog instruc involut 1
+prolog instruc se 3
+prolog interm 1
+prolog interm langu 1
+prolog interpreter 1
+prolog is concern 1
+prolog is enlarg 1
+prolog layer 1
+prolog layer impl 1
+prolog layer inclus 1
+prolog leftmost 1
+prolog leftmost select 1
+prolog loader 1
+prolog ma 1
+prolog ma sav 1
+prolog mach 2
+prolog mach architectur 1
+prolog mak 1
+prolog mal 1
+prolog mal refer 1
+prolog mal sappu 1
+prolog manag 1
+prolog manag group 1
+prolog manu 1
+prolog me 1
+prolog me pr 1
+prolog mechan 1
+prolog memor 1
+prolog memor perform 1
+prolog memor refer 1
+prolog modl 1
+prolog modl system 1
+prolog ne 1
+prolog ne saurait 1
+prolog not 1
+prolog om 1
+prolog om habituel 1
+prolog ont 1
+prolog ont direct 1
+prolog oper 1
+prolog optim 1
+prolog optim compiler 1
+prolog peut 1
+prolog peut etr 1
+prolog pour 1
+prolog pour kcm 1
+prolog proc 1
+prolog program 4
+prolog program fr 1
+prolog qu 2
+prolog qu demand 1
+prolog quelconqu 1
+prolog quelconqu est 1
+prolog rep 1
+prolog rep sur 1
+prolog runtim 1
+prolog runtim structur 1
+prolog s equentiel 1
+prolog s erieux 1
+prolog say 1
+prolog search 1
+prolog search rl 1
+prolog select 1
+prolog select rl 1
+prolog sont 1
+prolog specif 1
+prolog specif instruc 1
+prolog spreadsh 1
+prolog stack 1
+prolog standard 1
+prolog standard control 1
+prolog status 1
+prolog status flag 1
+prolog styl 1
+prolog support 1
+prolog support tot 1
+prolog system 3
+prolog system ba 1
+prolog system develop 1
+prolog system inclus 1
+prolog system run 1
+prolog talk 1
+prolog tel 1
+prolog tel qu 1
+prolog ten 1
+prolog ten compt 1
+prolog user 1
+prolog user manu 1
+prolog using 1
+prolog using norm 1
+prolog util 1
+prolog util deux 1
+prolog ver 1
+prolog ver le 1
+prolog which inser 1
+prolog with mod 3
+prolog word 1
+prologu 1
+prologu test 1
+prom 19
+prom a prior 1
+prom approach 1
+prom avenu 1
+prom comput 1
+prom direct 2
+prom for discov 1
+prom for further 1
+prom for med 1
+prom mean 1
+prom much faster 1
+prom new approach 1
+prom new research 1
+prom of rapid 1
+prom rapid 1
+prom rapid developm 1
+prom result 1
+prom robust 1
+prom seem 1
+prom server 1
+prom softwar 1
+prom softwar engineer 1
+prom spec 1
+prom techniqu 1
+prom technolog 1
+prom to prov 1
+prom would prov 1
+promel 1
+prometteur 2
+prometteur concern 1
+prometteur concern la 1
+prometteur de 1
+prometteus 3
+prometteus et font 1
+prometteus passer 1
+prometteus passer par 1
+promin 3
+promin in narx 1
+promin reg 1
+promin reg ba 1
+promot 8
+promot and subtyp 1
+promot ar straightfor 1
+promot by stroustrup 1
+promot ca 1
+promot claus 1
+promot detail 1
+promot detail exper 1
+promot en 1
+promot giv 1
+promot giv s0 1
+promot mak 1
+promot mak straightfor 1
+promot norm 1
+promot norm form 1
+promot of typ 1
+promot prec 1
+promot rel 1
+promot rl 1
+promot softwar 1
+promot softwar qu 1
+promot step 1
+promot step wh 1
+promot th fact 1
+promot th recomb 1
+promot th vi 1
+promot to obtain 1
+promot tvar 1
+promot us 1
+promot valu 1
+promot wil remain 1
+promoter 1
+promoter sonar 1
+promoter sonar soybean 1
+prompt 9
+prompt a med 1
+prompt accord 1
+prompt an act 1
+prompt an earl 1
+prompt ar exchang 1
+prompt ar offer 1
+prompt ar pr 1
+prompt as appl 1
+prompt attempt 1
+prompt can appear 1
+prompt can benefit 1
+prompt candid 1
+prompt combin 1
+prompt combin overlap 1
+prompt command 1
+prompt con 1
+prompt cycl 1
+prompt cycl con 1
+prompt ech 1
+prompt either occ 1
+prompt for enabl 1
+prompt in direct 1
+prompt in multimod 1
+prompt inform 1
+prompt int 1
+prompt int research 1
+prompt is adjust 1
+prompt is follow 1
+prompt is offer 1
+prompt is tak 1
+prompt it start 1
+prompt match 1
+prompt mechan 1
+prompt prov 1
+prompt prov guid 1
+prompt strateg 1
+prompt strateg defin 1
+prompt strateg describ 1
+prompt strateg design 1
+prompt strateg support 1
+prompt sup 1
+prompt sup dep 1
+prompt support 1
+prompt support user 1
+prompt th definit 1
+prompt th design 1
+prompt th reasoner 1
+prompt th user 2
+prompt to com 1
+prompt which keep 1
+prompter 1
+prompter a prompter 1
+prompter allow 1
+prompter alw observ 1
+prompter appear 1
+prompter approach 1
+prompter by mean 1
+prompter design 1
+prompter design systemat 1
+prompter evalu 1
+prompter fail 1
+prompter fail infer 1
+prompter for subsequ 1
+prompter interact 1
+prompter interfac 1
+prompter interfac custom 1
+prompter interfac keep 1
+prompter is ba 1
+prompter is describ 1
+prompter keep 1
+prompter keep track 1
+prompter menu 1
+prompter obv 1
+prompter obv requir 1
+prompter prov 1
+prompter s opt 1
+prompter support 1
+prompter to oper 1
+prompter window 1
+prompter window contain 1
+prompter work 1
+prompter would imp 1
+promulg 1
+promulg by standard 1
+pronoun 1
+pronounc 6
+pronounc differ 1
+pronounc for graph 1
+pronounc for lp 1
+proof 56
+proof a lot 1
+proof abov giv 1
+proof an earl 1
+proof and proper 1
+proof and typ 1
+proof ar broad 1
+proof ar straightfor 1
+proof assum 2
+proof ba 1
+proof being develop 1
+proof by algorithm 1
+proof by contradict 1
+proof by induc 1
+proof by lem 1
+proof by rewrit 1
+proof by se 1
+proof checker 1
+proof checker implem 1
+proof cl 1
+proof cl follow 1
+proof construc 1
+proof construc proc 1
+proof dep 1
+proof develop 1
+proof developm 1
+proof follow 5
+proof for distribut 2
+proof for ibam 1
+proof for ordin 1
+proof for substr 1
+proof giv 2
+proof im 1
+proof in cl 1
+proof in detail 1
+proof in order 1
+proof init 1
+proof is analog 1
+proof is ba 1
+proof is compl 1
+proof is giv 1
+proof is ident 1
+proof is om 1
+proof is requir 1
+proof is simil 5
+proof is straightfor 1
+proof it follow 1
+proof le 3
+proof le g0 1
+proof length 1
+proof maintain 1
+proof map 1
+proof method 2
+proof methodolog 1
+proof oblig 1
+proof oblig act 1
+proof of church 1
+proof of concept 1
+proof of converg 1
+proof of correct 4
+proof of cut 1
+proof of dec 1
+proof of lem 9
+proof of main 1
+proof of meer 1
+proof of norm 1
+proof of progr 1
+proof of strong 1
+proof of theorem 12
+proof of tr1 1
+proof of tr2 1
+proof of tr3 1
+proof outl 1
+proof proc 2
+proof procedur 2
+proof proceed 2
+proof proceed analog 1
+proof proposit 1
+proof put 1
+proof rel 2
+proof requir 1
+proof rl 3
+proof search 2
+proof search algorithm 1
+proof search infer 1
+proof search lead 1
+proof search mak 1
+proof simil 1
+proof simpl 1
+proof sinc ui 1
+proof sketch 3
+proof strateg 3
+proof system 3
+proof techniqu 3
+proof th correct 1
+proof th equ 1
+proof th nec 1
+proof th proof 3
+proof theor 3
+proof theor an 1
+proof theor found 1
+proof theor proper 1
+proof theor stud 1
+proof thereof 1
+proof tool 1
+proof tr 1
+proof tr observ 1
+proof using 1
+proof verif 1
+proof we prov 1
+proof wil follow 1
+proof work 1
+proof work simil 1
+prooftheor 1
+prooftheor proper 1
+proot 2
+prop 84
+prop 2cl 1
+prop 2cl algorithm 1
+prop a 3d 1
+prop a dev 1
+prop a distribut 1
+prop a framework 1
+prop a gener 1
+prop a guid 1
+prop a high 1
+prop a log 1
+prop a low 1
+prop a method 2
+prop a model 2
+prop a modif 1
+prop a mult 1
+prop a multiport 1
+prop a nonlin 1
+prop a number 1
+prop a pipelin 1
+prop a principl 1
+prop a protocol 1
+prop a prun 1
+prop a qu 1
+prop a simpl 1
+prop a simpler 1
+prop a softwar 2
+prop a solut 2
+prop a theor 1
+prop a var 2
+prop addit 1
+prop addit valu 1
+prop algorithm 4
+prop algorithm requir 1
+prop altern 1
+prop altern implem 1
+prop altern switch 1
+prop an algorithm 3
+prop an altern 1
+prop an an 1
+prop an eff 1
+prop an ext 1
+prop an iter 1
+prop and disc 1
+prop and implem 2
+prop and prov 1
+prop and rev 1
+prop another iter 1
+prop approach 1
+prop approach took 1
+prop architectur 2
+prop by avnaim 1
+prop by awerbuch 1
+prop by can 1
+prop by con 1
+prop by el 1
+prop by etter 1
+prop by faustin 1
+prop by gopinath 1
+prop by greenstr 1
+prop by jean 1
+prop by odr 1
+prop by research 2
+prop by rivest 1
+prop by sagiv 1
+prop by srtc 1
+prop by trakhtenbrot 1
+prop by using 1
+prop by wang 1
+prop by weig 1
+prop by william 1
+prop compiler 1
+prop compiler loop 1
+prop d etendr 1
+prop dan 1
+prop dan ce 1
+prop dassouplir 1
+prop dassouplir la 1
+prop de 2
+prop de calculer 1
+prop de cherch 1
+prop de venir 1
+prop design 2
+prop design guidel 2
+prop diff 1
+prop diff erent 1
+prop dillustrer 1
+prop dillustrer la 1
+prop direct 2
+prop direct privileg 1
+prop direct search 1
+prop donc 1
+prop donc un 1
+prop dutiliser 1
+prop dutiliser ce 1
+prop e dadapter 1
+prop e de 2
+prop e dentrelacer 1
+prop e deux 1
+prop e dutiliser 1
+prop e maint 1
+prop e par 1
+prop e un 2
+prop earl 2
+prop ee 3
+prop ee au 1
+prop ee avec 1
+prop ee dan 1
+prop ee en 1
+prop ee maint 1
+prop ee par 2
+prop ee peuv 1
+prop ee pour 1
+prop ee sont 1
+prop en 1
+prop en outr 1
+prop es 2
+prop execut 1
+prop execut model 1
+prop ext 1
+prop ext entail 1
+prop fast 1
+prop fast algorithm 1
+prop for comput 2
+prop for direct 1
+prop for estim 1
+prop for extract 1
+prop for improv 1
+prop for multicast 1
+prop for nest 1
+prop for rem 1
+prop for typ 1
+prop framework 3
+prop framework tak 2
+prop gener 1
+prop gener loc 1
+prop guidel 1
+prop guidel using 1
+prop hardwar 2
+prop hardwar implem 1
+prop hardwar repl 1
+prop implem 2
+prop implem prov 1
+prop improv 1
+prop improv me 1
+prop in emerald 1
+prop in kahn 1
+prop in particl 1
+prop in result 1
+prop in sect 1
+prop integr 1
+prop integr featur 1
+prop le 2
+prop le grand 1
+prop le moy 1
+prop lead 1
+prop mak 1
+prop mak us 1
+prop me 1
+prop me object 1
+prop mechan 1
+prop med 1
+prop med ba 1
+prop method 2
+prop mov 1
+prop multilevel 1
+prop multilevel recur 1
+prop network 1
+prop network design 1
+prop new me 1
+prop new softwar 1
+prop on mesh 1
+prop our architectur 1
+prop parallel 2
+prop parallel algorithm 1
+prop parallel forml 1
+prop part 1
+prop part constraint 1
+prop partit 1
+prop partit strateg 1
+prop preserv 1
+prop prompt 1
+prop prompt match 1
+prop rewrit 1
+prop rewrit log 1
+prop s pour 1
+prop schedl 1
+prop schedl algorithm 1
+prop se 1
+prop sever adequ 1
+prop sever structur 1
+prop som novel 1
+prop specl 1
+prop specl comput 1
+prop standard 1
+prop step 1
+prop structur 1
+prop sur 1
+prop sur le 1
+prop switch 1
+prop switch architectur 1
+prop system 1
+prop th bin 1
+prop th incorpor 1
+prop th model 1
+prop th triangl 1
+prop th us 1
+prop that arbitr 1
+prop that prun 1
+prop tim 1
+prop tim stamp 1
+prop to abstract 1
+prop to accommod 1
+prop to comput 1
+prop to deal 1
+prop to ded 1
+prop to detect 1
+prop to explicit 1
+prop to explor 1
+prop to ext 1
+prop to improv 2
+prop to integr 1
+prop to overcom 2
+prop to simplif 1
+prop to start 1
+prop to support 1
+prop to us 3
+prop tw conjectur 1
+prop tw fast 1
+prop typ 1
+prop typ system 1
+prop un 2
+prop un ajust 1
+prop un algorithm 1
+prop un assoupl 1
+prop un classif 1
+prop un etud 1
+prop un ext 1
+prop un gestionnair 1
+prop un protocol 1
+prop un ver 1
+prop ver 1
+prop vm 1
+prop vm ba 1
+prop which treat 1
+propag 31
+propag a me 1
+propag a request 1
+propag algorithm 4
+propag algorithm becom 1
+propag and integr 1
+propag and test 1
+propag and transform 1
+propag ar lim 1
+propag avec 1
+propag avec un 1
+propag between constraint 1
+propag between rat 1
+propag by me 1
+propag can continu 1
+propag can oper 1
+propag cod 1
+propag conjunct 1
+propag constraint 3
+propag constraint solver 1
+propag correct 1
+propag cycl 1
+propag cycl requir 1
+propag de 2
+propag de ce 1
+propag de contraint 1
+propag de moment 1
+propag del 1
+propag dep 1
+propag difficult 1
+propag direct 2
+propag direct backtrack 1
+propag direct def 1
+propag direct involut 1
+propag direct pd 1
+propag direct pot 1
+propag directiv 1
+propag e6 1
+propag ee 2
+propag ee de 1
+propag ee jusquau 1
+propag ee pr 1
+propag equiv 1
+propag est 1
+propag est au 1
+propag etc 1
+propag exact 1
+propag for boolean 1
+propag for fd 1
+propag grad 1
+propag grad inform 1
+propag gradu 1
+propag gradu solut 1
+propag graph 2
+propag graph defin 1
+propag graph involut 1
+propag graph pg 1
+propag graph program 1
+propag handl 1
+propag in junct 2
+propag in markov 1
+propag init1 1
+propag interfac 1
+propag learn 1
+propag learn procedur 1
+propag matr 1
+propag method 3
+propag method giv 1
+propag nec 1
+propag nec interfac 1
+propag network 1
+propag of condit 1
+propag of gener 1
+propag of init2 1
+propag of multidest 1
+propag of probabil 1
+propag of report 1
+propag of st 1
+propag on constraint 1
+propag part 1
+propag pattern 2
+propag pattern allow 1
+propag pattern becom 1
+propag pattern cod 1
+propag pattern contain 1
+propag pattern def 1
+propag pattern funct 1
+propag pattern further 1
+propag pattern program 1
+propag pattern support 1
+propag pattern transform 1
+propag pattern us 1
+propag pattern work 1
+propag proc 1
+propag profil 1
+propag respect 1
+propag satisf 1
+propag schem 2
+propag should start 1
+propag soft 1
+propag soft loc 1
+propag strength 1
+propag tak 1
+propag tak adv 1
+propag task 1
+propag task con 1
+propag techniqu 1
+propag techniqu nam 1
+propag th classif 1
+propag th edg 1
+propag th error 1
+propag th finish 1
+propag th init1 1
+propag th me 1
+propag th upd 1
+propag therein 1
+propag through tim 1
+propag tim 2
+propag to nod 1
+propag to solut 1
+propag to supertyp 1
+propag to theor 1
+propag tool 1
+propag tool ast 1
+propag train 2
+propag train neur 2
+propag wer siml 1
+propag wil classif 1
+propag with adapt 1
+propag with concat6 1
+propager 3
+propager de 1
+propager de test 1
+propager le 2
+propager le meilleur 1
+propager le mi 1
+propager lin 1
+propager lin egalit 1
+proper 94
+proper act 1
+proper al guar 1
+proper and appl 1
+proper and configur 1
+proper and prun 1
+proper and rel 2
+proper and spar 1
+proper and stabil 1
+proper and strong 1
+proper ar describ 1
+proper ar enforc 1
+proper ar es 1
+proper ar expr 1
+proper ar guaranteed 1
+proper ar investig 1
+proper ar preserv 1
+proper ar requir 1
+proper ar shown 1
+proper architectur 1
+proper by direct 1
+proper cal glob 1
+proper ch 1
+proper character 1
+proper cit 1
+proper comprom 1
+proper dep 1
+proper describ 1
+proper design 1
+proper determin 1
+proper determin execut 1
+proper disc 1
+proper domain 1
+proper du 1
+proper elimin 1
+proper enabl 2
+proper enabl programmer 1
+proper espec 1
+proper exerc 1
+proper expr 1
+proper fail 1
+proper fd 1
+proper follow 2
+proper for arbitr 1
+proper for gener 1
+proper for horn 1
+proper for lo 1
+proper for obtain 1
+proper form 1
+proper forml 1
+proper funct 1
+proper giv 1
+proper guar 2
+proper ha interest 1
+proper hold 5
+proper implem 1
+proper implem using 1
+proper in gener 1
+proper in oo 1
+proper in order 1
+proper in sld 1
+proper in standard 1
+proper in term 2
+proper inclus 2
+proper infer 1
+proper inherit 1
+proper init 1
+proper init valeus 1
+proper is clear 1
+proper is expr 1
+proper is help 1
+proper is particl 1
+proper is regard 1
+proper is rest 1
+proper is said 1
+proper kind 1
+proper kind discipl 1
+proper layout 1
+proper list 2
+proper man constraint 1
+proper may allow 1
+proper mean 1
+proper memor 2
+proper memor architectur 1
+proper memor hierarch 1
+proper memor order 1
+proper ment 2
+proper noun 1
+proper of algorithm 1
+proper of atom 1
+proper of bsp 1
+proper of calcl 1
+proper of combin 1
+proper of conceptu 1
+proper of constraint 1
+proper of definit 2
+proper of desir 1
+proper of edg 1
+proper of ext 1
+proper of funct 1
+proper of ge 1
+proper of gener 1
+proper of hierarch 1
+proper of increm 1
+proper of infer 1
+proper of int 1
+proper of kind 1
+proper of lin 1
+proper of loc 1
+proper of log 1
+proper of ml 1
+proper of mlr 1
+proper of mutu 1
+proper of nearest 1
+proper of norm 1
+proper of ol 1
+proper of order 1
+proper of pffq 1
+proper of phy 1
+proper of po 1
+proper of polyhedr 1
+proper of prim 1
+proper of primitiv 1
+proper of rat 1
+proper of reduc 1
+proper of reg 1
+proper of regl 1
+proper of shap 1
+proper of sld 1
+proper of substitut 1
+proper of switch 1
+proper of tempor 1
+proper of transact 1
+proper of unfold 1
+proper of upd 1
+proper of vi 1
+proper order 2
+proper p1 1
+proper pack 1
+proper pack schedl 1
+proper part 1
+proper pb1 1
+proper pb1 requir 1
+proper pb2 1
+proper pb2 distingu 1
+proper pb2 follow 1
+proper pb3 1
+proper plac 1
+proper po 1
+proper regr 1
+proper regr test 1
+proper rel 2
+proper rel hff 1
+proper relac 1
+proper requir 1
+proper rot 1
+proper scop 1
+proper sil 1
+proper solut 2
+proper st 2
+proper sub 2
+proper sub relationship 1
+proper substitut 1
+proper supertyp 1
+proper th ec 1
+proper than algorithm 1
+proper that gener 1
+proper that handl 1
+proper that impl 1
+proper that jqj 1
+proper that li 1
+proper that membership 1
+proper that oe1oe2 1
+proper that output 1
+proper that term 1
+proper then big 1
+proper then object 1
+proper then understand 1
+proper to mark 1
+proper train 1
+proper transl 1
+proper upd 2
+proper us 1
+proper valu 1
+proper view 1
+proper we found 1
+proper we observ 1
+proper we want 1
+proper which enh 1
+propertieswh 1
+propertieswh th system 1
+proport 28
+proport chang 1
+proport const 1
+proport d ecritur 1
+proport de 1
+proport de la 1
+proport incr 1
+proport larger 1
+proport larger channel 1
+proport mor coar 1
+proport of evalu 1
+proport raisonnabl 1
+proport scheduler 1
+proport server 1
+proport server belong 1
+proport server prov 1
+proport server receiv 1
+proport server serv 1
+proport server using 1
+proport server wh 1
+proport to den 1
+proport to oe 2
+proport wider 1
+proport wider channel 1
+proport wider network 1
+proportionnel 3
+proportionnel a la 2
+proportionnel a leffectif 1
+proportionnel a sa 1
+proportionnel a son 1
+proportionnel au 2
+proportionnel au co 1
+proportionnel au nombr 1
+proportionnel au rang 1
+proportionnel aux 1
+proportionnel aux sel 1
+proportionnel et un 1
+proportionnel ne 1
+proportionnel ne converg 1
+proposer 3
+proposer de 2
+proposer de solut 1
+proposer de valeur 1
+proposer un algorithm 1
+proposer un gestionnair 1
+proposer un raffin 1
+proposit 20
+proposit a lautr 1
+proposit ar du 1
+proposit ar ident 1
+proposit as resourc 1
+proposit calculus 3
+proposit dan 1
+proposit dan le 1
+proposit de 1
+proposit de cod 1
+proposit de diaz 1
+proposit de kahn 1
+proposit de mar 1
+proposit de van 1
+proposit deriv 1
+proposit dholzbaur 1
+proposit dhybrid 1
+proposit dhybrid de 1
+proposit diff 1
+proposit diff erent 1
+proposit est 2
+proposit est im 1
+proposit est la 1
+proposit forml 3
+proposit hold 1
+proposit ind 1
+proposit letter 1
+proposit letter oe 1
+proposit lin 1
+proposit lin calculus 1
+proposit lin log 1
+proposit mult 1
+proposit of sect 1
+proposit ont 1
+proposit ont toutef 1
+proposit pr 1
+proposit pr ec 1
+proposit r ecent 1
+proposit satisf 1
+proposit satisf problem 1
+proposit se 1
+proposit se posit 1
+proposit tautolog 1
+proposit to empl 1
+proposit variabl 1
+propositionalform 1
+proposon 4
+proposon a la 1
+proposon alor 1
+proposon alor de 1
+proposon alor un 1
+proposon au 1
+proposon au chapitr 1
+proposon au paragraph 1
+proposon aux 1
+proposon aux proposit 1
+proposon cherch 1
+proposon d etendr 1
+proposon dan 2
+proposon dan ce 1
+proposon dan la 2
+proposon de 1
+proposon de lalgorithm 1
+proposon de mod 1
+proposon de montrer 1
+proposon de recherch 1
+proposon donc 1
+proposon donc dan 1
+proposon donc dappliquer 1
+proposon dun 1
+proposon dun part 1
+proposon dutiliser 1
+proposon en 1
+proposon en particl 1
+proposon est 1
+proposon est construc 1
+proposon ic 1
+proposon ic un 1
+proposon maint 1
+proposon maint de 1
+proposon nest 1
+proposon peut 1
+proposon peut donc 1
+proposon peuv 1
+proposon peuv se 1
+proposon pour 1
+proposon pren 1
+proposon pren prioritair 1
+proposon un 3
+proposon un ext 1
+proposon un ph 1
+proposon un raffin 1
+proposon un siml 1
+proposon un techniqu 1
+propr 7
+propr a un 1
+propr aux 1
+propr aux term 1
+propr avant 1
+propr dit 1
+propr du 1
+propr et es 5
+propr etair 1
+propr etair avait 1
+propr etair de 1
+propr etair dun 1
+propr etair env 1
+propr etair est 1
+propr etair gestionnair 1
+propr etair init 1
+propr etair perd 1
+propr etair po 1
+propr m emoir 1
+propr non 1
+propr non nl 1
+propr nouvel 1
+propr orthonorm 1
+propr orthonorm es 1
+propr parler 1
+propr protocol 1
+propr tair 1
+propr tair propr 1
+propr unit 1
+prospect 3
+prospect ee 1
+prospect ee pour 1
+prospect of emerg 1
+prot 4
+prot eg 2
+prot eg de 2
+prot eger 1
+prot eger largum 1
+prot in 1
+prot in concern 1
+prot in est 1
+prot in pr 1
+protect 12
+protect a bin 1
+protect affirm 1
+protect ar evalu 1
+protect bit 1
+protect by addit 1
+protect by lock 1
+protect cal 1
+protect cal k1 1
+protect dat 2
+protect dat item 1
+protect domain 1
+protect expr 1
+protect for appl 1
+protect form 1
+protect inherit 1
+protect instead 1
+protect is design 1
+protect mechan 1
+protect ment 1
+protect of pag 1
+protect offer 1
+protect offer flec 1
+protect protect 1
+protect protect form 1
+protect reg 1
+protect se 2
+protect som implem 1
+protect spec form 1
+protect st 1
+protect st assoc 1
+protect techniqu 1
+protect th system 1
+protect transit 1
+protect with non 1
+protein 4
+protein and nucl 1
+protein dat 1
+protein dat bank 1
+protein design 1
+protein fold 1
+protein molecl 1
+protein or help 1
+protein struc 1
+protein structur 2
+protein structur determ 1
+proth 1
+proth mil 1
+protocol 30
+protocol accru 1
+protocol adapt 1
+protocol addr 1
+protocol addr multicast 1
+protocol an 1
+protocol and adapt 1
+protocol and der 1
+protocol and disc 1
+protocol and dynam 1
+protocol and hardwar 1
+protocol and ind 1
+protocol and knowledg 1
+protocol and pol 1
+protocol and sect 1
+protocol and simpl 1
+protocol and st 1
+protocol ar ba 1
+protocol ar lower 1
+protocol ar respon 1
+protocol arrang 1
+protocol async 1
+protocol async thereafter 1
+protocol attempt 1
+protocol becom 1
+protocol behav 1
+protocol by decl 1
+protocol by sen 1
+protocol can perm 1
+protocol can tak 1
+protocol compmst 1
+protocol constrain 1
+protocol construc 1
+protocol court 1
+protocol de 3
+protocol de coh 1
+protocol de commun 1
+protocol de cr 1
+protocol de gest 1
+protocol de migr 1
+protocol de speed 1
+protocol def 1
+protocol defin 1
+protocol denv 1
+protocol denv de 1
+protocol descript 1
+protocol design 1
+protocol dinv 1
+protocol dinv qu 1
+protocol dinv sur 1
+protocol do toler 1
+protocol enginest 1
+protocol enginest esoff 1
+protocol ensur 1
+protocol error 1
+protocol error du 1
+protocol es 1
+protocol es us 1
+protocol evalu 1
+protocol facil 1
+protocol failur 1
+protocol follow 1
+protocol for anim 1
+protocol for atom 1
+protocol for client 2
+protocol for collabor 1
+protocol for comput 1
+protocol for construc 1
+protocol for count 1
+protocol for crash 1
+protocol for deliver 1
+protocol for distribut 1
+protocol for gener 1
+protocol for interact 1
+protocol for nod 1
+protocol for obtain 1
+protocol for rec 1
+protocol for rel 1
+protocol for sen 1
+protocol for status 1
+protocol giv 1
+protocol hav failover 1
+protocol http 2
+protocol http http2.html 1
+protocol impl 2
+protocol impl es 1
+protocol in industr 1
+protocol incr 1
+protocol int 1
+protocol int egr 1
+protocol involut 1
+protocol is built 1
+protocol is deliv 1
+protocol is ext 1
+protocol is giv 1
+protocol is guaranteed 1
+protocol is high 1
+protocol is indep 1
+protocol is invok 2
+protocol is port 1
+protocol is pr 1
+protocol is specif 1
+protocol is therefor 1
+protocol is typ 1
+protocol layer 1
+protocol layer multicast 1
+protocol le 1
+protocol load 1
+protocol long util 1
+protocol maintain 2
+protocol me 2
+protocol me overhead 1
+protocol mor synchron 1
+protocol must monit 1
+protocol must reduc 1
+protocol n1 1
+protocol n2 1
+protocol n2 yield 1
+protocol nam 1
+protocol nonblock 1
+protocol of act 1
+protocol of agent 1
+protocol ont 1
+protocol par 1
+protocol par inv 1
+protocol perform 1
+protocol perm 1
+protocol perm dobtenir 1
+protocol pr 3
+protocol proc 1
+protocol proc overhead 1
+protocol proc posit 1
+protocol proceed 1
+protocol prov 1
+protocol prov nxn 1
+protocol receiv 1
+protocol receiver 1
+protocol reduc 1
+protocol reduc deliv 1
+protocol rel 2
+protocol requir 2
+protocol rout 1
+protocol rout me 1
+protocol satisf 1
+protocol satisf pb4 1
+protocol sect 1
+protocol sen 1
+protocol specif 2
+protocol start 1
+protocol such overhead 1
+protocol suit 1
+protocol support 1
+protocol support 1xn 1
+protocol support nxn 1
+protocol tak 2
+protocol tak adv 1
+protocol termin 1
+protocol th overhead 1
+protocol th pr 1
+protocol that distingu 1
+protocol that satisf 1
+protocol that show 1
+protocol that support 1
+protocol that toler 2
+protocol that viol 1
+protocol to impl 1
+protocol to link 1
+protocol to multicast 1
+protocol to perm 1
+protocol to reach 1
+protocol to reduc 1
+protocol to toler 1
+protocol toler 1
+protocol toler crash 1
+protocol toler rec 1
+protocol toler sen 1
+protocol upd 1
+protocol us 3
+protocol using 2
+protocol using equ 1
+protocol using mar 1
+protocol var 1
+protocol wa giv 1
+protocol wa shown 1
+protocol we an 1
+protocol which requir 1
+protocol whil guar 1
+protocol wil requir 1
+protocol wil sen 1
+protocol wil tak 1
+protocol wil term 1
+protocol wil work 1
+protocol with failur 1
+protocol with me 1
+protocol without bounc 1
+protocol work 1
+protocol3 1
+prototyp 34
+prototyp an 1
+prototyp an tool 1
+prototyp and iter 1
+prototyp and testb 1
+prototyp approach 1
+prototyp ar merg 1
+prototyp block 1
+prototyp block interfac 1
+prototyp by conduc 1
+prototyp compiler 1
+prototyp con 1
+prototyp constraint 1
+prototyp constraint solver 1
+prototyp dataflow 1
+prototyp dataflow computer 1
+prototyp difficult 1
+prototyp difficult singl 1
+prototyp ea 1
+prototyp ea ba 1
+prototyp environm 1
+prototyp fish 1
+prototyp fish len 1
+prototyp for nearest 1
+prototyp gener 1
+prototyp gh 1
+prototyp gh environm 1
+prototyp implem 1
+prototyp in order 1
+prototyp is comp 1
+prototyp is cur 1
+prototyp is loc 1
+prototyp log 3
+prototyp log manag 1
+prototyp log overhead 2
+prototyp logspac 1
+prototyp logspac compl 1
+prototyp mach 1
+prototyp ment 1
+prototyp ment earl 1
+prototyp network 1
+prototyp object 1
+prototyp of 3d 1
+prototyp of funct 1
+prototyp of futur 1
+prototyp parallel 2
+prototyp parallel compiler 1
+prototyp prolog 1
+prototyp prolog interpreter 1
+prototyp prov 1
+prototyp purp 1
+prototyp rl 1
+prototyp rl oper 1
+prototyp should foc 1
+prototyp status 1
+prototyp system 5
+prototyp tempor 1
+prototyp tempor rel 1
+prototyp test 1
+prototyp test tool 1
+prototyp tool 2
+prototyp ver 1
+prototyp wa design 1
+prototyp wil funct 1
+prototyp work 1
+prototyp2 1
+prototyp4 1
+prototyp4 assum 1
+prouv 2
+prouv ce 1
+prouv ce lim 1
+prouv es 1
+prouv la 1
+prouv la validit 1
+prouv le 1
+prouv le th 1
+prouv qu 1
+prouv qu ce 1
+prouv qu pour 1
+prouv qu tj 1
+prouv qu zn 1
+prouv quel 1
+prouv quel soit 1
+prouv quil 1
+prouv quil en 1
+prouv sa 1
+prouver 1
+prouver lec 1
+prouver lec dun 1
+prouver qu 1
+prouver qu de 1
+prouver qu le 1
+prov 114
+prov a 3d 1
+prov a ba 4
+prov a bal 1
+prov a brief 1
+prov a ch 1
+prov a chanc 1
+prov a character 1
+prov a clear 2
+prov a client 1
+prov a command 1
+prov a compact 1
+prov a compl 1
+prov a compreh 1
+prov a conjunct 1
+prov a context 1
+prov a conv 5
+prov a counter 1
+prov a demonstr 1
+prov a disc 1
+prov a distinct 1
+prov a dynam 1
+prov a fair 2
+prov a flec 1
+prov a form 3
+prov a forml 1
+prov a found 1
+prov a framework 1
+prov a gap 1
+prov a gener 2
+prov a glob 1
+prov a good 4
+prov a graph 2
+prov a guar 1
+prov a key 1
+prov a list 1
+prov a lo 1
+prov a log 1
+prov a lower 2
+prov a mathemat 1
+prov a maxim 1
+prov a mean 3
+prov a measur 1
+prov a mechan 3
+prov a minim 1
+prov a mod 1
+prov a natur 1
+prov a nec 1
+prov a not 1
+prov a number 2
+prov a p6 1
+prov a perform 1
+prov a polynom 1
+prov a posit 1
+prov a power 1
+prov a pyramid 1
+prov a recip 1
+prov a rel 3
+prov a rich 1
+prov a se 3
+prov a separ 1
+prov a sequ 1
+prov a ser 1
+prov a signif 1
+prov a simil 1
+prov a simpl 2
+prov a simpler 1
+prov a singl 1
+prov a solut 1
+prov a specif 1
+prov a standard 2
+prov a strong 1
+prov a structur 2
+prov a suff 1
+prov a system 1
+prov a theor 2
+prov a theorem 1
+prov a tool 1
+prov a transform 1
+prov a uniform 2
+prov a us 2
+prov a user 1
+prov a vi 1
+prov a wealth 1
+prov abstract 4
+prov acc 2
+prov accur 2
+prov accur bound 1
+prov accur estim 1
+prov act 1
+prov addit 3
+prov addit funct 1
+prov addit register 1
+prov addit typ 1
+prov adequ 1
+prov adequ typ 1
+prov al inform 1
+prov algorithm 1
+prov an 1
+prov an abstract 1
+prov an adapt 1
+prov an addit 1
+prov an addr 1
+prov an aid 1
+prov an altern 1
+prov an answer 1
+prov an appropr 2
+prov an architectur 1
+prov an ea 2
+prov an eff 1
+prov an emb 1
+prov an encapsl 1
+prov an environm 2
+prov an exampl 1
+prov an explicit 1
+prov an id 1
+prov an implem 1
+prov an induc 1
+prov an integr 1
+prov an nxn 1
+prov an oper 1
+prov an opt 1
+prov an optim 1
+prov an origin 1
+prov an overview 1
+prov an understand 1
+prov an unrel 1
+prov and plan 1
+prov another strik 1
+prov answer 1
+prov any clu 1
+prov any con 1
+prov appropr 1
+prov appropr norm 1
+prov as evid 1
+prov as follow 2
+prov atom 1
+prov atom oper 1
+prov background 1
+prov background inform 1
+prov best perform 2
+prov better perform 1
+prov better techniqu 1
+prov both aver 1
+prov both direct 1
+prov both stead 1
+prov broad 1
+prov broad simil 1
+prov by construc 1
+prov by cut 1
+prov by induc 3
+prov by meer 1
+prov by shallit 1
+prov by yu 1
+prov c softwar 1
+prov church 1
+prov church rosser 1
+prov clamp 1
+prov commut 1
+prov compl 1
+prov concept 1
+prov conceptu 1
+prov conceptu coh 1
+prov conclus 1
+prov condit 1
+prov conf tacc 1
+prov confid 1
+prov connect 1
+prov connect orient 1
+prov construc 2
+prov containm 1
+prov continu 1
+prov continu internet 1
+prov converg 1
+prov converg evid 1
+prov correct 9
+prov correct elsewh 1
+prov correct front 1
+prov correct indep 1
+prov correct proof 1
+prov correct refin 1
+prov correct system 1
+prov correct transform 1
+prov correspon 1
+prov correspon acc 1
+prov cr 1
+prov cr refer 1
+prov de 1
+prov de la 1
+prov deadlock 1
+prov deadlock fr 1
+prov definit 1
+prov design 2
+prov design guidel 2
+prov detail 1
+prov detail hint 1
+prov differ empir 1
+prov differ interconnect 1
+prov differ interpr 1
+prov differ level 1
+prov differ rel 1
+prov direct 1
+prov du 1
+prov du ca 1
+prov dut 1
+prov dut funct 1
+prov ea 3
+prov ea scal 2
+prov each direct 1
+prov ef 1
+prov ef cient 1
+prov eff 3
+prov eff mean 1
+prov eff singl 1
+prov eff us 1
+prov empir 1
+prov empir evid 1
+prov en 1
+prov enhanc 1
+prov enough inform 1
+prov equ 1
+prov equiv 1
+prov erron 1
+prov erron rang 1
+prov evid 1
+prov excel 1
+prov excel graph 1
+prov experim 1
+prov experim measur 1
+prov explicit 3
+prov explicit construc 1
+prov explicit support 2
+prov ext 1
+prov ext experim 1
+prov extern 1
+prov extern val 1
+prov extr 2
+prov extr flec 1
+prov extr support 1
+prov extrem 1
+prov extrem benef 1
+prov facil 1
+prov fault 1
+prov fault toler 1
+prov flec 2
+prov flec cach 1
+prov foc 1
+prov for act 1
+prov for adequ 1
+prov for asynchron 1
+prov for cheap 1
+prov for collect 1
+prov for ea 2
+prov for fair 1
+prov for hyg 1
+prov for inclus 1
+prov for loc 1
+prov funct 1
+prov further 3
+prov further disc 1
+prov further evid 1
+prov further perspectiv 1
+prov further random 1
+prov futur 1
+prov futur research 1
+prov good 7
+prov good moat 1
+prov good perform 2
+prov good program 1
+prov good result 1
+prov good solut 1
+prov good st 1
+prov gr 1
+prov gr cod 1
+prov great 1
+prov great flec 1
+prov greater 2
+prov greater freedom 1
+prov greater scop 1
+prov guid 2
+prov guidel 1
+prov hardwar 1
+prov hardwar monit 1
+prov heur 1
+prov heur solut 1
+prov high 2
+prov high avail 1
+prov high comput 2
+prov high flec 1
+prov high gener 1
+prov high rel 1
+prov high throughput 1
+prov id 1
+prov id fair 1
+prov in ap 1
+prov inappropr 1
+prov inclus 1
+prov inclus polymorph 1
+prov incorrect 1
+prov ind 1
+prov indep 1
+prov individu 1
+prov individu com 1
+prov inform 6
+prov init 2
+prov init evid 1
+prov insight 1
+prov inspect 1
+prov interpr 1
+prov interpr model 1
+prov introduc 1
+prov intuit 1
+prov it correct 1
+prov it funct 1
+prov it hap 1
+prov it sound 1
+prov it user 1
+prov le spat 1
+prov lem 2
+prov lever 1
+prov light 1
+prov light weight 1
+prov lim 1
+prov lim templ 1
+prov lot 1
+prov low 1
+prov low se 1
+prov lower 1
+prov lower bound 1
+prov mad 1
+prov major 1
+prov major benefit 1
+prov match 1
+prov match upper 1
+prov maxim 1
+prov maxim gener 1
+prov mean 4
+prov mean ind 1
+prov mint 1
+prov modl 1
+prov modl overus 1
+prov mor flec 1
+prov mor freedom 1
+prov mor knowledg 1
+prov most interest 1
+prov motiv 1
+prov much flec 1
+prov multipl 1
+prov multipl serv 1
+prov mutu 1
+prov mutu exclus 1
+prov nest 1
+prov nest parallel 1
+prov new kind 1
+prov nf 1
+prov nf serv 1
+prov nic 1
+prov nic error 1
+prov no 1
+prov no featur 1
+prov no support 1
+prov no toler 1
+prov nxn 1
+prov nxn multicast 1
+prov of addit 1
+prov of guid 1
+prov of internet 1
+prov old 1
+prov old phy 1
+prov on lin 1
+prov onl nec 1
+prov onl singl 1
+prov oper 2
+prov oper con 1
+prov oper sem 1
+prov opportun 1
+prov opt 1
+prov optim 1
+prov or disprov 1
+prov our evalu 1
+prov our point 1
+prov output 1
+prov output valu 1
+prov par 1
+prov payoff 1
+prov per connect 1
+prov perfect 2
+prov perfect bound 1
+prov perfect reconstruc 1
+prov perform 1
+prov perform measur 1
+prov pop 1
+prov proc 1
+prov procedur 1
+prov program 1
+prov program run 1
+prov proper 2
+prov proper rel 1
+prov prov 1
+prov prov good 1
+prov qu 2
+prov qu dun 1
+prov quantif 1
+prov real 1
+prov real tim 1
+prov reason 1
+prov reason respon 1
+prov record 1
+prov recur 1
+prov recur macr 1
+prov regard 1
+prov regard proper 1
+prov rel 1
+prov rel deliv 1
+prov repr 1
+prov repr valu 1
+prov requir 1
+prov rout 1
+prov rout inform 1
+prov ser 1
+prov serv 1
+prov sever empt 1
+prov sever form 1
+prov sever proper 1
+prov sever uniqu 1
+prov shorter 1
+prov shorter path 1
+prov signif 1
+prov signif speedup 1
+prov simil 4
+prov simpl 1
+prov simpl descript 1
+prov simultan 1
+prov soft 1
+prov soft non 1
+prov solut 3
+prov solut equiv 1
+prov som addit 1
+prov som answer 1
+prov som condit 1
+prov som excel 1
+prov som guidel 1
+prov som intuit 1
+prov som level 1
+prov som motiv 1
+prov som result 2
+prov som siml 1
+prov som weight 1
+prov standard 1
+prov standard perform 1
+prov stat 1
+prov stricter 1
+prov stricter isol 1
+prov stronger 1
+prov stronger empir 1
+prov subst 2
+prov subst bi 1
+prov subst inst 1
+prov succ 1
+prov such ext 1
+prov such weight 1
+prov suff 1
+prov suff inform 1
+prov superior 1
+prov superior perform 1
+prov support 4
+prov support evid 1
+prov sur answer 1
+prov symbol 1
+prov symbol nam 1
+prov system 1
+prov system wid 1
+prov taskspecif 1
+prov taskspecif input 1
+prov techn 1
+prov techn detail 1
+prov tempor 1
+prov tempor match 1
+prov textur 1
+prov textur synth 1
+prov th ab 1
+prov th ad 1
+prov th aspect 1
+prov th aver 1
+prov th ba 2
+prov th cap 1
+prov th ch 1
+prov th character 1
+prov th claim 2
+prov th conclus 1
+prov th construc 1
+prov th conver 1
+prov th correct 4
+prov th correspon 1
+prov th dec 1
+prov th decomposit 1
+prov th def 1
+prov th default 1
+prov th definit 1
+prov th ec 1
+prov th emb 1
+prov th equ 1
+prov th equiv 1
+prov th expect 1
+prov th funct 2
+prov th gap 1
+prov th goal 1
+prov th guid 1
+prov th host 1
+prov th id 1
+prov th illus 1
+prov th implem 1
+prov th inform 1
+prov th intuit 1
+prov th kcm 1
+prov th learn 1
+prov th lem 5
+prov th loc 1
+prov th log 1
+prov th main 1
+prov th nec 1
+prov th opt 1
+prov th perform 1
+prov th point 1
+prov th prim 1
+prov th program 1
+prov th reflect 1
+prov th result 4
+prov th run 1
+prov th serv 1
+prov th shar 1
+prov th standard 1
+prov th strong 1
+prov th substr 1
+prov th suff 1
+prov th support 1
+prov th system 1
+prov th term 1
+prov th theorem 4
+prov th third 1
+prov th tot 1
+prov th user 3
+prov th weight 1
+prov that digit 1
+prov that e1 1
+prov that fram 1
+prov that glob 1
+prov that hal 1
+prov that loc 1
+prov that pj 1
+prov that selecttest 1
+prov that v1 1
+prov their eff 1
+prov their sem 1
+prov theor 1
+prov theorem 1
+prov to exp 1
+prov to form 1
+prov to mak 1
+prov to show 1
+prov to work 1
+prov tot 1
+prov tot order 1
+prov tr1 1
+prov transpar 1
+prov transpar failover 1
+prov trem 1
+prov trem adv 1
+prov tw direct 1
+prov us 5
+prov us inform 1
+prov us insight 1
+prov us measur 1
+prov user 1
+prov using 6
+prov using ec 1
+prov valu 2
+prov valu insight 2
+prov var 1
+prov var serv 1
+prov ver adequ 1
+prov virtu 1
+prov virtu synchron 1
+prov without using 1
+prov wor 1
+prov wor partit 1
+prov. 1
+provan 1
+provenir 1
+provenir de 1
+provenir de fluc 1
+prover 4
+prover than program 1
+prover v4.0 1
+provid 7
+provider 3
+provider form.html 1
+provider to run 1
+provok 4
+provok by system 1
+provok crit 1
+provok quest 1
+provok th com 1
+provoqu 3
+provoqu alor 1
+provoqu alor un 1
+provoqu beaucoup 1
+provoqu beaucoup moin 1
+provoqu de 2
+provoqu de acc 1
+provoqu de eff 1
+provoqu de elimin 1
+provoqu de migr 1
+provoqu ee 1
+provoqu ee par 1
+provoqu es 1
+provoqu es par 1
+provoqu le 2
+provoqu le chang 1
+provoqu le eff 1
+provoqu le transfer 1
+provoqu souv 1
+provoqu souv de 1
+provoqu un 1
+provoqu un affinit 1
+provoqu un conflit 1
+provoquer 1
+provoquer de 1
+provoquer de conflit 1
+provoquer de laffinit 1
+provoquer jusqu 1
+provoquer lec 1
+provoquer lec ecut 1
+provoquer un nombr 1
+provoquer un ph 1
+provoquerait 1
+provoquerait non 1
+provoquerait non sel 1
+provost 2
+prox 1
+prox and new 1
+proxim 6
+proxim and pag 1
+proxim e contruit 1
+proxim e par 1
+proxim e util 1
+proxim es 1
+proxim featur 1
+proxim ind 1
+proxim inform 1
+proxim quer 1
+proxim rel 1
+prp 1
+prp ar work 1
+prp as compar 1
+prp in incr 1
+prp serv 1
+prp serv discipl 1
+prp system 1
+prp system using 1
+prpl 1
+pru 2
+pru exu 1
+pru exu connect 1
+prun 15
+prun algorithm 1
+prun and good 1
+prun ba 2
+prun ba algorithm 1
+prun back propag 1
+prun block 1
+prun block branch 1
+prun com 1
+prun con 1
+prun continu 1
+prun inst 1
+prun merg 1
+prun merg succeed 1
+prun method 1
+prun network 1
+prun network took 1
+prun neur 1
+prun neur network 1
+prun of constraint 1
+prun oft result 1
+prun recur 2
+prun recur neur 2
+prun run 1
+prun stop 1
+prun structur 2
+prun tak 1
+prun tak plac 1
+prun techniqu 2
+prun th narx 1
+prun th order 1
+prun th search 1
+prun th tap 1
+prun th weight 1
+prun wh 1
+prunedmerg 1
+prunedmerg proc 1
+prus 1
+prus analog 1
+prus analog avec 1
+prusinkiewicz 1
+przytl 1
+ps 14
+ps algorithm 1
+ps and ts 1
+ps ar st 1
+ps aver 1
+ps aver pack 1
+ps dep 1
+ps for solut 1
+ps gener 1
+ps ii 1
+ps inf.ps 1
+ps memor 1
+ps memor model 1
+ps pattern 1
+ps pattern sum 1
+ps plac 1
+ps prim 1
+ps rqtkd96.ps 1
+ps tak 1
+ps www.dfk.un 1
+ps www.dfk.un sb.de 1
+ps2 1
+ps2x 1
+ps2x and y0i 1
+ps2xh 1
+ps2xh xht 1
+ps2y 1
+ps85 1
+psalt 1
+psc 1
+psc cun 1
+psc cun research 1
+psect 1
+psect csvm 1
+psect csvm sect 1
+psect en 1
+pselect 1
+pselect se 1
+pseud 17
+pseud aff 1
+pseud aff schedl 1
+pseud al 1
+pseud al eatoir 1
+pseud algorithm 1
+pseud boolean 1
+pseud boolean constraint 1
+pseud but 1
+pseud cod 6
+pseud cod assum 1
+pseud cod suiv 1
+pseud cod summariz 1
+pseud concur 1
+pseud echec 1
+pseud echec superficiel 1
+pseud gib 1
+pseud gib phenom 1
+pseud nl 1
+pseud nod 1
+pseud object 1
+pseud pr 1
+pseud pr edicat 1
+pseud random 2
+pseud random no 1
+pseud random number 1
+pseud random sign 1
+pseud solut 1
+pseud variabl 1
+pseudocod 3
+pseudocod form 1
+pseudocod form using 1
+pseudocod over abstract 1
+pseudogib 1
+pseudogib phenom 1
+pseudorandom 2
+pseudorandom funct 1
+pseudorandom number 1
+pseudorandom number gener 1
+pseudosolut 1
+psim4 1
+psk94 1
+pskhk 1
+pskhk 2i 1
+pskhk 2i f1fskg 1
+psn 1
+psn denot 1
+psnr 1
+psnr estim 1
+psnr estim spectr 1
+pspac 1
+psr 1
+psser 1
+psw 2
+psw bit 1
+psw denot 1
+psych 2
+psych motor 1
+psych motor typ 1
+psycholog 5
+psycholog bulletin 1
+psycholog feel 1
+psycholog feel strong 1
+psycholog of computer 1
+psycholog of program 1
+psycholog of telecommun 1
+psycholog plaus 1
+psycholog plaus account 1
+psychoph 1
+psychoph research 1
+psychoph stud 1
+pt 8
+pt and cach 1
+pt chang 1
+pt correspon 1
+pt entr 1
+pt for pag 1
+pt ha read 1
+pt ha writ 1
+pt protect 1
+pt protect se 1
+pt remot 1
+pt remot writ 1
+pt repr 1
+pt to nil 1
+pt to read 1
+pt to writ 1
+pt writ 1
+pt writ fault 1
+pt1 1
+pt2 1
+pt2 nil 1
+pt2 nil wph 1
+pt2r 1
+pt2r rph 1
+pt2r rph pfn 1
+pt93a 1
+pt93b 1
+pth 2
+pth record 1
+pth sampl 1
+pth splitter 1
+ptim 1
+ptim comput 1
+ptim dat 1
+ptim dat complec 1
+ptim ptim 1
+ptj 1
+ptk 1
+ptk xj 1
+ptk94 1
+ptr 3
+ptvf92 1
+ptx 1
+ptx 1ptx 1
+ptx 1ptx 1xtpxtp 1
+ptx0 1
+ptx0 j increm 1
+ptx0 pag 1
+ptx0 pag posit 1
+pu 10
+pu aboutir 1
+pu actuel 1
+pu aller 1
+pu avoir 1
+pu avoir avec 1
+pu caract 1
+pu caract riser 1
+pu ce 1
+pu ce nouveau 1
+pu conclur 1
+pu conclur quil 1
+pu d terminer 1
+pu de 2
+pu de calcl 1
+pu de deux 1
+pu de matr 1
+pu de primitiv 1
+pu decr 1
+pu decr dg 1
+pu discr 1
+pu discr tiser 1
+pu dun 1
+pu dun algorithm 1
+pu effectuer 1
+pu effectuer au 1
+pu en 2
+pu en constru 1
+pu env 1
+pu env au 1
+pu esp 1
+pu esp erer 1
+pu etr 2
+pu etr calcl 1
+pu etr de 1
+pu etr effectu 1
+pu etr exprim 1
+pu etr extrait 1
+pu etr identiqu 1
+pu etr observ 1
+pu etr remarqu 1
+pu etr test 1
+pu formaliser 1
+pu formaliser relativ 1
+pu intrin 1
+pu intrin equ 1
+pu la 3
+pu la dern 1
+pu la direct 1
+pu la mi 1
+pu la moy 1
+pu le 2
+pu le processeur 1
+pu le segm 1
+pu liou 1
+pu lorsqu 1
+pu lorsqu pi 1
+pu mettr 1
+pu n egliger 1
+pu nous 1
+pu nous pr 1
+pu on extrait 1
+pu on ocoup 1
+pu or pv 1
+pu ordonnancer 1
+pu ordonnancer le 1
+pu penser 1
+pu penser qu 1
+pu pr 1
+pu pr sent 1
+pu prendr 1
+pu prendr de 1
+pu profiter 1
+pu profiter de 1
+pu qu 1
+pu qu le 1
+pu r eutiliser 1
+pu recevoir 1
+pu recevoir individuel 1
+pu un 2
+pu un environ 1
+pu un siml 1
+pu v rioer 1
+pu y fair 1
+puaut 2
+pub 10
+pub ccl 1
+pub ccl inr 1
+pub demeter 1
+pub design 1
+pub design soft 1
+pub design writedesign.hqx 1
+pub docum 1
+pub docum techpaper 1
+pub mar 1
+pub oolog 1
+pub oolog st.ps.z 1
+pub paper 1
+pub paper miller 1
+pub paper mt 1
+pub publ 2
+pub publ tech 2
+pub softwar 1
+pub svrc 1
+pub svrc techreport 1
+pub techreport 2
+pub techreport kifer 1
+pub techreport tr93 1
+pub xsb 1
+publ 56
+publ account 1
+publ algorithm 2
+publ april 1
+publ as computer 1
+publ as sigplan 1
+publ as techn 1
+publ b.v 5
+publ by morgan 1
+publ by thibault 1
+publ c langu 1
+publ co 4
+publ compan 16
+publ compan inc 1
+publ corpor 1
+publ deal 1
+publ describ 1
+publ describ research 1
+publ elsewh 1
+publ empir 1
+publ empir result 1
+publ es 1
+publ group 1
+publ heur 1
+publ hierarch 1
+publ hierarch ind 1
+publ in cvgip 1
+publ in ijcv 1
+publ in neur 1
+publ inform 1
+publ intern 1
+publ joint 1
+publ number 1
+publ number sc23 1
+publ or perish 1
+publ overview.html 1
+publ problem 1
+publ prolog 1
+publ prolog manag 1
+publ research 1
+publ strateg 1
+publ system 1
+publ tech 2
+publ tech report 2
+publik 1
+publik eingereicht 1
+puc 1
+puc ri 1
+puc ri ru 1
+puer 1
+puer rican 1
+pug92 1
+pugh 3
+pugh and david 1
+pugh cs.umd.edu 1
+puisqu 3
+puisqu ce 1
+puisqu ce architectur 1
+puisqu de 1
+puisqu de exp 1
+puisqu jc2j 1
+puisqu la 2
+puisqu la boucl 1
+puisqu la distribut 1
+puisqu la fin 1
+puisqu la meilleur 1
+puisqu le 2
+puisqu le co 1
+puisqu lon 1
+puisqu lon con 1
+puisquel 1
+puisquel ne 1
+puisquel ne pren 1
+puisquil 3
+puisquil fournit 1
+puisquil fournit un 1
+puisquil mot 1
+puisquil mot lint 1
+puisquil ne 1
+puisquil ne saccompagn 1
+puisquil nous 1
+puisquil nous perm 1
+puisquil ny 1
+puisquil ny aur 1
+puisquil requ 1
+puisquil requ la 1
+puisquil sagit 2
+puisquil sagit de 1
+puisquil sagit dun 1
+puisquil sont 1
+puisquil sont ensuit 1
+puisquon 1
+puisquon na 1
+puisquon na pa 1
+puisquon ne 1
+puisquon ne modif 1
+puisquun 2
+puisquun construc 1
+puisquun construc conditionnel 1
+puisquun processeur 1
+puisquun processeur peut 1
+pullam 1
+pulldown 1
+pulldown sequ 1
+pulser 1
+pulser actspeed 1
+pulser actspeed div 1
+pump 1
+pump th record 1
+pun 1
+pun for scratch 1
+pung 1
+punishm 1
+pup 1
+pup proc 1
+pur 28
+pur and appl 1
+pur and comb 1
+pur appl 2
+pur arbitrair 1
+pur calculus 1
+pur cent 1
+pur cg 1
+pur cg method 1
+pur cl 1
+pur cl ba 1
+pur claus 1
+pur clp 1
+pur cod 1
+pur connect 1
+pur connect orient 1
+pur connectionor 1
+pur connectionor network 1
+pur connectionor switch 1
+pur decl 1
+pur decl log 1
+pur definit 1
+pur denot 1
+pur descriptif 1
+pur est 1
+pur est aus 1
+pur form 1
+pur form object 1
+pur funct 2
+pur funct ca 1
+pur funct evalu 1
+pur funct langu 1
+pur funct program 1
+pur funct system 1
+pur geometer 1
+pur geometer result 1
+pur informatiqu 1
+pur int 1
+pur int program 1
+pur last cal 1
+pur liter 1
+pur liter rl 1
+pur liter simplif 1
+pur loc 1
+pur loc approach 1
+pur log 1
+pur log rl 1
+pur logiciel 1
+pur mat 1
+pur mat eriel 1
+pur model 1
+pur model theor 1
+pur nondetermin 1
+pur nondetermin ch 1
+pur object 1
+pur object orient 1
+pur par 1
+pur par el 1
+pur prolog 1
+pur pur 1
+pur pur pur 1
+pur qu 1
+pur qu del 1
+pur random 1
+pur random map 1
+pur statiqu 1
+pur statiqu de 1
+pur string 1
+pur string handl 1
+pur syntact 1
+pur synth 1
+pur synth attribut 1
+pur tempor 1
+pur term 1
+pur term rewrit 1
+pur textu 1
+pur textu aspect 1
+pur typ 1
+pur typ system 1
+pur wormhol 1
+pur wormhol rout 1
+purdu 1
+purdu compiler 1
+purdu compiler construc 1
+purer 1
+purer object 1
+purer object orient 1
+purer oo 1
+purer oo langu 1
+purg 1
+purg th system 1
+purp 68
+purp and inform 1
+purp architectur 2
+purp atm 1
+purp atm switch 1
+purp been high 1
+purp bottom 1
+purp built 1
+purp built computer 1
+purp cl 1
+purp computer 1
+purp computer pack 1
+purp fr 1
+purp fr form 1
+purp framework 1
+purp hardwar 1
+purp hid 2
+purp hid detail 2
+purp imper 1
+purp imper program 1
+purp instruc 1
+purp instruc constitut 1
+purp instruc se 1
+purp larg switch 1
+purp mach 1
+purp method 1
+purp microproc 1
+purp microproc ext 1
+purp not 1
+purp not known 1
+purp of bound 1
+purp of cluster 1
+purp of compl 1
+purp of computer 1
+purp of definit 1
+purp of docum 1
+purp of enabl 1
+purp of establ 1
+purp of execut 1
+purp of gener 1
+purp of imag 1
+purp of implem 1
+purp of inherit 1
+purp of inst 1
+purp of introspect 1
+purp of loc 1
+purp of loop 1
+purp of mak 1
+purp of parameter 1
+purp of perform 1
+purp of propag 1
+purp of regr 1
+purp of requir 1
+purp of secur 1
+purp of suppr 1
+purp of td 1
+purp of tim 1
+purp of typ 1
+purp of user 1
+purp parallel 1
+purp parallel computer 1
+purp proc 2
+purp risc 1
+purp risc architectur 1
+purp siml 1
+purp switch 1
+purp th siz 1
+purp we assum 1
+purp we ch 1
+purp we consider 1
+purp we modif 1
+purpl 2
+purpl signif 1
+purpl signif chang 1
+purport 2
+purport goal 1
+purport to en 1
+pursu 7
+pursu indep 1
+pursu is combin 1
+pursu th approach 1
+pursu th goal 1
+pursuit 1
+pursuit with tim 1
+push 13
+push and pop 2
+push con 1
+push constraint 1
+push constraint select 1
+push j swap 1
+push le 1
+push le rest 1
+push method 2
+push ont memor 1
+push or pop 1
+push out 1
+push out lead 1
+push parallel 1
+push parallel oper 1
+push techniqu4 1
+push th ch 1
+push th w1 1
+push to posit 1
+pushpl.html 1
+put 43
+put a restrict 2
+put a se 1
+put an upper 2
+put and ge 1
+put appropr 1
+put appropr cal 1
+put at post 1
+put c3 1
+put effort 1
+put emph 1
+put for 3
+put form 1
+put forth 1
+put h2n 1
+put hi isvl 1
+put in plac 1
+put int digit 1
+put lesser 2
+put lesser load 2
+put msg 1
+put n fug 1
+put new dat 1
+put restrict 1
+put syntact 1
+put syntact restrict 1
+put th key 1
+put th me 1
+put th new 1
+put th piec 1
+put through cod 1
+put to explan 1
+put under control 1
+put unnec 1
+put unnec constraint 1
+put unsaf 1
+put unsaf valu 1
+put valu 1
+put valu a6 1
+put valu a7 1
+put valu x5 1
+put valu y1 1
+put valu y2 1
+put valu y3 1
+put valu y4 1
+put valu yn 1
+put ver 1
+putnam 1
+putnam algorithm 1
+putnam procedur 1
+putzl 1
+putzol 1
+putzolu 1
+puw 1
+puzzl 3
+puzzl about comp 1
+puzzl can prov 1
+puzzl caus 1
+puzzl contain 1
+puzzl first describ 1
+puzzl incorpor 1
+puzzl incorpor difficult 1
+puzzl prov 1
+puzzl seem 1
+puzzl srat 1
+puzzl srq 1
+puzzl th number 1
+puzzl that comb 1
+pv 4
+pv denot 1
+pvj 1
+pvm 3
+pvm environm 1
+pvm mp 1
+pvm mp ba 1
+pvm mp implem 1
+pvm mp pack 1
+pvm mp typ 1
+pvm program 1
+pvm program environm 1
+pvm requir 1
+pvm requir ts 1
+pvng 1
+pvw 1
+pw 2
+pw publ 1
+pw publ compan 1
+pw92 2
+pw93 1
+pwrd 1
+pwrd p pol 1
+pwt 1
+px 3
+py 5
+py and u.s 1
+py award 2
+py award ccr 1
+py award mip 1
+py grant 1
+py grant ccr 1
+pym 1
+pyramid 2
+pyramid ind 1
+pyramid ind execut 1
+pyramid mult 1
+pyramid mult resolut 1
+pyramid wavel 1
+pyramid wavel transform 1
+pz 1
+q.f.stout 1
+q.y 1
+q0 7
+q0 and q1 1
+q0 and qout 1
+q0 below min 1
+q0 int q1 1
+q0 is empt 1
+q0 is suf 1
+q0 nfv 1
+q0 oe 1
+q0 tak 1
+q0 tak tim 1
+q0 using 1
+q0 using merg 1
+q0 which act 1
+q0limk 1
+q0limk 1mk 1
+q0limk 1mk q0m1 1
+q0m1 1
+q0r 1
+q1 11
+q1 and q0 1
+q1 and simplif 1
+q1 as relac 1
+q1 at pe 1
+q1 for algorithm 1
+q1 if polynom 1
+q1 oe 1
+q1 q0limk 1
+q1 q0limk 1mk 1
+q1 r0 1
+q1 s electionner 1
+q1 satisfait 1
+q1 tak 1
+q1 tak tim 1
+q1 to q0 1
+q1 when deletemin 1
+q1 with kq1k2 1
+q1.0 1
+q1.0 point 1
+q1.0 point qu 1
+q1.0 to q9 1
+q1.1 1
+q1.1 and q1.2 1
+q1.1 point 1
+q1.1 point qu 1
+q1.10 1
+q1.10 ar rang 1
+q1.10 du 1
+q1.10 rang 1
+q1.10 rang qu 1
+q1.11 1
+q1.11 and q1.12 1
+q1.11 rang 1
+q1.11 rang qu 1
+q1.12 1
+q1.12 and q1.13 1
+q1.12 rang 1
+q1.12 rang qu 1
+q1.13 1
+q1.13 ar rang 1
+q1.13 rang 1
+q1.13 rang qu 1
+q1.14 1
+q1.14 point 1
+q1.14 point qu 1
+q1.14 select 1
+q1.2 1
+q1.2 ar point 1
+q1.2 point 1
+q1.2 point qu 1
+q1.3 1
+q1.3 and q1.4 1
+q1.3 point 1
+q1.3 point qu 1
+q1.4 1
+q1.4 point 1
+q1.4 point qu 1
+q1.5 1
+q1.5 and q1.6 1
+q1.5 rang 1
+q1.5 rang qu 1
+q1.5 retrief 1
+q1.5 retrief empl 1
+q1.5 to q1.6 1
+q1.6 1
+q1.6 and q1.7 1
+q1.6 du 1
+q1.6 rang 1
+q1.6 rang qu 1
+q1.6 select 1
+q1.6 to q1.7 1
+q1.7 1
+q1.7 ar rang 1
+q1.7 counterpart 1
+q1.7 counterpart du 1
+q1.7 du 1
+q1.7 rang 1
+q1.7 rang qu 1
+q1.7 respect 1
+q1.7 select 1
+q1.8 1
+q1.8 and q1.9 1
+q1.8 rang 1
+q1.8 rang qu 1
+q1.9 1
+q1.9 and q1.10 1
+q1.9 as compar 1
+q1.9 rang 1
+q1.9 rang qu 1
+q10 2
+q10 select 1
+q11 1
+q11 aggreg 1
+q11 for ath 1
+q12 1
+q12 aggreg 1
+q13 1
+q13 aggreg 1
+q14 1
+q14 aggreg 1
+q15 1
+q15 aggreg 1
+q1i 1
+q2 5
+q2 oe 1
+q2 q1 1
+q2 strip 1
+q2.0 1
+q2.0 and q2.1 1
+q2.0 rang 1
+q2.0 rang qu 1
+q2.0 select 1
+q2.0 select ssn 1
+q2.0 to q2.1 1
+q2.1 1
+q2.1 du 1
+q2.1 is simil 1
+q2.1 rang 1
+q2.1 rang qu 1
+q2.1 respect 1
+q2.1 retrief 1
+q2.1 retrief skil 1
+q3 3
+q3 from figur 1
+q3 oe 1
+q3 q4 1
+q3 therefor 1
+q3 therefor deliver 1
+q3.0 1
+q3.0 and q3.1 1
+q3.0 rang 1
+q3.0 rang qu 1
+q3.1 1
+q3.1 ar simil 1
+q3.1 is simil 1
+q3.1 rang 1
+q3.1 rang qu 1
+q4 3
+q4 ar shown 1
+q4 join 1
+q4 oe 1
+q4 q5 1
+q4.0 1
+q5 3
+q5 join 1
+q5 oe 1
+q5 q6 1
+q5.0 1
+q5.0 al show 1
+q5g 1
+q6 2
+q6 and q7 1
+q6 in figur 1
+q6 is simil 1
+q6 join 1
+q6 q7 1
+q7 2
+q7 ar join 1
+q7 du 1
+q7 join 1
+q7 q8 1
+q8 2
+q8 and q8.1 1
+q8 involut 1
+q8.0 1
+q8.0 and q8.1 1
+q8.0 join 1
+q8.1 1
+q8.1 join 1
+q9 2
+q9 join 1
+qa 1
+qaab 1
+qaq 1
+qaq q qb 1
+qb 3
+qb system 1
+qbfun1 1
+qbfun2 1
+qbfun3 1
+qbfun4 1
+qbfun4 contain 1
+qbp 1
+qbp q ap 1
+qbq 1
+qc 1
+qd 4
+qd hold 1
+qd hold decr 1
+qd k 1q 1
+qe 1
+qf 1
+qf1 1
+qf1 qf2 1
+qf2 1
+qfp 1
+qfp qgp 1
+qft 1
+qg 6
+qg b maxfp 1
+qg if minfp 1
+qgp 1
+qi 11
+qi ei 1
+qi fic 1
+qi fic la 1
+qi iff 1
+qi is equ 1
+qi pj 1
+qi pj fpour 1
+qi pour 1
+qi problem 1
+qi qi 1
+qi qi pj 1
+qi ri 1
+qi0 1
+qi0 q0 1
+qi1 1
+qik 1
+qin 2
+qin wh 1
+qin wh qi0 1
+qj 4
+qj in m0 1
+qj must contain 1
+qj1 1
+qk 5
+qk fs 1
+qk fs fpour 1
+qk oe 1
+qk oe ae 1
+qk of se 1
+qk pk 1
+qk qk 1
+qk qk wjkf 1
+qk wjkf 1
+qld 2
+qm 1
+qmr 1
+qmr algorithm 1
+qmr iter 1
+qn 5
+qn d efin 1
+qn est 1
+qn qn 1
+qn t.q 1
+qnest 1
+qnest qsm 1
+qnest qsm qnest 1
+qnest singl 1
+qnest singl net 1
+qnp 1
+qo 1
+qo guar 1
+qout 1
+qout known 1
+qp 4
+qp abaq 1
+qp bq 1
+qp is comput 1
+qp qaab 1
+qq 3
+qq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq pr 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq root 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq pr 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq 1
+qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq root 1
+qr 2
+qr contain 1
+qr mach 1
+qrf 1
+qrf qrg 1
+qrf qrg qwg 1
+qrf qwf 1
+qrf qwf qrg 1
+qrf qwf qwg 1
+qrf qwg 1
+qrg 1
+qrg qwg 1
+qs 2
+qs and rs 1
+qs avail 1
+qs1 1
+qs2 1
+qs2 and qs3 1
+qs3 1
+qs4 1
+qs4 algorithm 1
+qsim 1
+qsim approach 1
+qsm 2
+qsm and qnest 1
+qsm ar shown 1
+qsm qnest 1
+qsm qnest qsm 1
+qsm qnest singl 1
+qsort 2
+qsort est 1
+qsort est typiqu 1
+qsort na 1
+qsort na pa 1
+qsort nod 1
+qsort point 1
+qsp 1
+qt 1
+qt aq 1
+qu 54
+qu 8j 1
+qu a actuel 1
+qu a ce 1
+qu a de 1
+qu a depu 1
+qu a egal 1
+qu a fusionner 1
+qu a la 2
+qu a lav 2
+qu a le 1
+qu a lentr 1
+qu a lext 1
+qu a lieu 1
+qu a lint 1
+qu a lissu 1
+qu a ne 1
+qu a partir 1
+qu a partitionner 1
+qu a pour 2
+qu a prior 1
+qu a suiv 1
+qu a travail 1
+qu a usv 1
+qu acc 1
+qu acc ed 1
+qu acc edent 1
+qu accept 1
+qu accept dexaminer 1
+qu aff 1
+qu aff solut 1
+qu agit 1
+qu agit loc 1
+qu aik 1
+qu allow 1
+qu allow inform 1
+qu am en 1
+qu am ne 1
+qu analyseur 1
+qu analyseur de 1
+qu and complec 1
+qu and exclus 1
+qu and rel 1
+qu and retrief 1
+qu and sen 1
+qu annl 1
+qu annl la 1
+qu answer 1
+qu appar 2
+qu appar entr 1
+qu appar tr 1
+qu appart 1
+qu appart init 1
+qu approach 1
+qu approxim 1
+qu approxim se 1
+qu ar 1
+qu arriv 1
+qu assur 2
+qu assur la 1
+qu assur le 1
+qu assur quil 1
+qu atteint 1
+qu atteint ce 1
+qu augm 1
+qu augm le 1
+qu aurait 1
+qu aurait ecr 1
+qu aurait pour 1
+qu aurait un 1
+qu be finit 1
+qu beaucoup 1
+qu bennet 1
+qu bi 1
+qu bi est 1
+qu boolean 1
+qu boolean funct 1
+qu box 1
+qu by imag 1
+qu by pict 1
+qu by textur 1
+qu by using 1
+qu bytextur 1
+qu bytextur using 1
+qu c etait 1
+qu c soit 1
+qu c1 1
+qu calcl 1
+qu calcl la 1
+qu can try 1
+qu ce 5
+qu ce approch 1
+qu ce ba 1
+qu ce classif 1
+qu ce coeff 1
+qu ce condit 1
+qu ce contraint 1
+qu ce cr 1
+qu ce cycl 1
+qu ce dern 2
+qu ce deux 1
+qu ce dist 1
+qu ce environ 1
+qu ce etat 1
+qu ce form 1
+qu ce genr 1
+qu ce hypoth 1
+qu ce instruc 1
+qu ce mot 1
+qu ce nest 1
+qu ce nid 1
+qu ce nombr 1
+qu ce not 1
+qu ce nouveau 1
+qu ce op 1
+qu ce pag 1
+qu ce point 1
+qu ce possibilit 1
+qu ce probl 1
+qu ce processeur 1
+qu ce produit 1
+qu ce propr 1
+qu ce sch 1
+qu ce siml 1
+qu ce techniqu 1
+qu ce th 1
+qu ce top 1
+qu ce transform 1
+qu ce travail 1
+qu ce typ 2
+qu ce var 1
+qu ce variabl 1
+qu ce vecteur 1
+qu cel 3
+qu cel ait 1
+qu cel ci 1
+qu cel de 2
+qu cel engendr 1
+qu cel facil 1
+qu cel impliqu 1
+qu cel nengendr 1
+qu cel util 1
+qu certain 4
+qu certain inform 1
+qu certain propr 1
+qu ceux 2
+qu ceux obtenus 1
+qu chacun 2
+qu chacun de 2
+qu chang 1
+qu chang de 1
+qu chaqu 2
+qu chaqu boucl 1
+qu chaqu niveau 1
+qu chaqu program 1
+qu charg 1
+qu charg un 1
+qu claus 2
+qu claus non 1
+qu co 1
+qu co utent 1
+qu cod 1
+qu cod gener 1
+qu com 1
+qu comb 1
+qu comb inform 1
+qu combin 1
+qu combin le 1
+qu commenc 1
+qu commenc ou 1
+qu comparison 1
+qu comport 1
+qu comport tout 1
+qu compt 1
+qu compt le 1
+qu comput 1
+qu con 4
+qu con lalgorithm 1
+qu concern 3
+qu concern la 3
+qu concern lagenc 1
+qu concern lappl 1
+qu concern le 2
+qu concern limpl 1
+qu concern lincertitud 1
+qu concern un 1
+qu condu 1
+qu conduit 1
+qu conduit au 1
+qu conduit aux 1
+qu conduit en 1
+qu conduit par 1
+qu conseil 1
+qu conseil de 1
+qu constitu 2
+qu constitu lessentiel 1
+qu constitu un 1
+qu cont 2
+qu cont de 1
+qu cont init 1
+qu cont le 1
+qu cont un 1
+qu contain 1
+qu containm 1
+qu containm hold 1
+qu contredit 1
+qu contredit le 1
+qu contribu 1
+qu convec 1
+qu correct 1
+qu correct trait 1
+qu correspon 3
+qu correspon au 2
+qu correspon aux 1
+qu correspon bien 1
+qu cost 1
+qu cost tradeoff 1
+qu couvr 1
+qu couvr typiqu 1
+qu cp 1
+qu cp pu 1
+qu cr 1
+qu cr ee 1
+qu d 2min 1
+qu d coup 1
+qu d ec 1
+qu d efin 1
+qu d efinit 1
+qu d eliminer 1
+qu d epen 1
+qu d etermin 1
+qu d etermineront 1
+qu d pgcd 1
+qu dailleur 1
+qu dailleur justif 1
+qu dan 3
+qu dan bien 1
+qu dan ce 3
+qu dan celu 1
+qu dan certain 1
+qu dan dautr 1
+qu dan la 2
+qu dan le 2
+qu dan lhypoth 1
+qu dan un 1
+qu dapr 1
+qu dapr es 1
+qu datab 2
+qu datab manag 1
+qu datab record 1
+qu davoir 1
+qu davoir un 1
+qu de 4
+qu de acc 1
+qu de boucl 1
+qu de but 1
+qu de calculer 1
+qu de cel 1
+qu de cherch 1
+qu de contraint 1
+qu de dilat 1
+qu de el 1
+qu de enregister 1
+qu de inv 1
+qu de la 2
+qu de linst 1
+qu de me 1
+qu de mettr 1
+qu de migr 1
+qu de mouv 1
+qu de nombreux 1
+qu de peu 1
+qu de point 1
+qu de primitiv 1
+qu de protocol 1
+qu de pseud 1
+qu de rep 1
+qu de retarder 1
+qu de solut 1
+qu de techniqu 1
+qu de tel 1
+qu de traiter 1
+qu de treil 1
+qu de variabl 2
+qu de vecteur 1
+qu definit 1
+qu definit lin 1
+qu del 1
+qu demand 1
+qu demand un 1
+qu dep 1
+qu deux 3
+qu deux argum 1
+qu deux bloc 1
+qu deux condit 1
+qu deux exempl 1
+qu deux processeur 1
+qu deux vecteur 1
+qu dev 1
+qu dev le 1
+qu dev un 1
+qu devr 1
+qu devr fair 1
+qu devrait 1
+qu devrait assurer 1
+qu devront 1
+qu devront etr 1
+qu difficil 1
+qu difficil etr 1
+qu dindexer 1
+qu dindexer sur 1
+qu doit 2
+qu doit correspondr 1
+qu doiv 1
+qu doiv restreindr 1
+qu doiv survivr 1
+qu don 2
+qu don acc 1
+qu don ladr 1
+qu don le 1
+qu don notr 1
+qu don pour 1
+qu don respectiv 1
+qu donc 1
+qu donc rest 1
+qu du 2
+qu du cod 1
+qu du compilateur2 1
+qu du point 1
+qu du recouvr 1
+qu dun 3
+qu dun ca 1
+qu dun part 2
+qu dun point 1
+qu dun processus 1
+qu dupliquer 1
+qu dupliquer la 1
+qu e don 1
+qu e sont 1
+qu ebec 1
+qu ebec cit 1
+qu effectu 1
+qu effectu le 1
+qu elagu 1
+qu elagu chaqu 1
+qu eliminerait 1
+qu eliminerait le 1
+qu emp 1
+qu emp ech 1
+qu en 2
+qu en engendr 1
+qu en ont 1
+qu en po 1
+qu en sort 1
+qu enregister 1
+qu enregister de 1
+qu enregister la 1
+qu entr 1
+qu entr en 1
+qu env 1
+qu env la 1
+qu es 1
+qu es par 1
+qu est 5
+qu est binair 1
+qu est capit 1
+qu est cel 1
+qu est compl 1
+qu est de 1
+qu est dot 1
+qu est egal 1
+qu est en 3
+qu est ensuit 1
+qu est equiv 1
+qu est etud 1
+qu est evidem 1
+qu est int 1
+qu est la 1
+qu est le 2
+qu est li 1
+qu est libr 1
+qu est np 1
+qu est par 1
+qu est pr 1
+qu est primord 1
+qu est sauvegard 1
+qu est sp 1
+qu est toujour 1
+qu est toutef 1
+qu est tr 2
+qu est vr 1
+qu etablit 1
+qu etablit la 1
+qu etait 1
+qu etait implicit 1
+qu etant 1
+qu etant don 1
+qu evalu 1
+qu evalu algorithm 1
+qu eventuel 1
+qu eventuel non 1
+qu evit 1
+qu eviter 1
+qu eviter lutil 1
+qu evoqu 1
+qu evoqu ee 1
+qu exampl 1
+qu exc 1
+qu exc de 1
+qu execut 1
+qu expliqu 1
+qu expliqu le 1
+qu expliqu son 1
+qu expr 1
+qu expr rectangl 1
+qu facil 1
+qu facil le 1
+qu fair 1
+qu fair dan 1
+qu fair lorsqu 1
+qu fait 1
+qu fait encor 1
+qu fait montr 1
+qu fant 1
+qu fer 1
+qu fer lobj 1
+qu fonct 1
+qu fonct en 1
+qu forc 1
+qu forc la 1
+qu form 1
+qu form sa 1
+qu forml 1
+qu forml appl 1
+qu fortran 1
+qu fouriermotzkin 1
+qu fouriermotzkin don 1
+qu fourn 1
+qu fourn le 1
+qu fournit 2
+qu fournit le 1
+qu fs 1
+qu fs opt 1
+qu funct 1
+qu fut 1
+qu fut beaucoup 1
+qu gar 1
+qu gar lab 1
+qu garantit 1
+qu gard 1
+qu gard explicit 1
+qu graph 1
+qu graph partit 1
+qu guid 1
+qu guid lalgorithm 1
+qu h1 1
+qu ha fail 1
+qu ha op 1
+qu hold 1
+qu holzbaur 1
+qu hpf 1
+qu i ej 1
+qu i ek 1
+qu i est 1
+qu i identif 1
+qu i soit 1
+qu i1 1
+qu i1 i2 1
+qu i2 1
+qu ia 1
+qu illustr 1
+qu illustr le 1
+qu im 1
+qu im ediat 1
+qu imp 1
+qu imp qu 1
+qu impliqu 2
+qu impliqu lind 1
+qu impliqu qu 1
+qu imposeront 1
+qu in cl 1
+qu incertain 1
+qu incr 1
+qu ind 1
+qu ind mechan 1
+qu indep 1
+qu indep sub 1
+qu influ 1
+qu influ sur 1
+qu interv 1
+qu interv lorsquau 1
+qu inv 1
+qu inv le 1
+qu inv point 1
+qu is adjust 1
+qu is blur 1
+qu is ch 1
+qu is degrad 1
+qu is execut 1
+qu is expr 1
+qu is issu 1
+qu is receiv 1
+qu is rel 1
+qu is repr 1
+qu is shown 1
+qu is simil 1
+qu ja 1
+qu ja pu 1
+qu jc2j 1
+qu jc2j jc1j 1
+qu jcj 1
+qu je 1
+qu je cr 1
+qu ji 1
+qu ji ms 1
+qu jusqu 1
+qu just 1
+qu just avant 1
+qu justif 1
+qu justif lhypoth 1
+qu justif lint 1
+qu k etiqu 1
+qu kcm 1
+qu kcm impl 1
+qu kcm util 1
+qu key 1
+qu l bxc 1
+qu l el 1
+qu l elag 1
+qu l elim 1
+qu l est 1
+qu l etat 1
+qu l ev 1
+qu la 5
+qu la born 1
+qu la boucl 1
+qu la claus 1
+qu la colon 1
+qu la combinaison 1
+qu la commun 1
+qu la comparaison 1
+qu la compil 1
+qu la complexit 1
+qu la compr 1
+qu la con 1
+qu la concur 1
+qu la condit 1
+qu la conduit 1
+qu la consom 1
+qu la construc 1
+qu la cont 1
+qu la contraint 1
+qu la conv 1
+qu la converg 1
+qu la cop 1
+qu la coupur 1
+qu la dec 1
+qu la densit 1
+qu la deux 1
+qu la diff 1
+qu la dist 1
+qu la distribut 1
+qu la dur 1
+qu la esp 1
+qu la fic 1
+qu la fonct 1
+qu la fr 1
+qu la fus 1
+qu la gest 2
+qu la ksr 1
+qu la liber 1
+qu la logiqu 1
+qu la matr 1
+qu la mesur 1
+qu la mi 1
+qu la modif 2
+qu la mut 1
+qu la non 2
+qu la ntoam 1
+qu la pag 2
+qu la pil 1
+qu la plupart 1
+qu la possibilit 1
+qu la pr 2
+qu la prem 1
+qu la prim 1
+qu la proposit 1
+qu la propr 1
+qu la recherch 1
+qu la reproduc 1
+qu la rus 1
+qu la sel 1
+qu la siml 1
+qu la sourc 1
+qu la structur 1
+qu la substitut 1
+qu la tail 2
+qu la th 1
+qu la transit 1
+qu la valeur 1
+qu la var 1
+qu la ver 2
+qu la vit 1
+qu la wam 1
+qu laccompagn 1
+qu laccompagn ayant 1
+qu laccr 1
+qu laddit 1
+qu laddit dun 1
+qu ladr 1
+qu ladr de 1
+qu ladr du 1
+qu laffect 1
+qu laffect destruc 1
+qu lag 1
+qu lag soit 1
+qu lalgorithm 1
+qu lalgorithm de 1
+qu lalgorithm util 1
+qu lalign 1
+qu lalign de 1
+qu lanc 1
+qu lanc valeur 1
+qu langu 4
+qu langu con 1
+qu langu design 1
+qu langu techniqu 1
+qu langu using 1
+qu lappel 1
+qu lappl 1
+qu larchitectur 1
+qu largum 1
+qu largum remplac 1
+qu larithm 1
+qu larithm etiqu 1
+qu lattribut 1
+qu lattribut ec 1
+qu le 5
+qu le acc 2
+qu le algorithm 1
+qu le argum 1
+qu le attribut 1
+qu le aut 1
+qu le born 1
+qu le boucl 1
+qu le build 1
+qu le but 1
+qu le calcl 2
+qu le ch 2
+qu le claus 1
+qu le co 2
+qu le cod 3
+qu le coeff 1
+qu le colon 1
+qu le comp 1
+qu le compil 1
+qu le compilateur 1
+qu le compteur 1
+qu le conclus 1
+qu le conflit 1
+qu le contenu 1
+qu le context 2
+qu le coroutin 1
+qu le coupl 1
+qu le coupur 1
+qu le cr 1
+qu le crit 1
+qu le degr 1
+qu le deux 2
+qu le difficult 1
+qu le disc 1
+qu le distingu 1
+qu le domain 1
+qu le don 1
+qu le drapeau 1
+qu le dur 1
+qu le el 1
+qu le environ 1
+qu le etap 1
+qu le ev 1
+qu le eventuel 1
+qu le facilit 1
+qu le faux 1
+qu le fonct 1
+qu le glob 1
+qu le grain 1
+qu le imag 1
+qu le ind 1
+qu le instruc 2
+qu le interd 1
+qu le lecteur 1
+qu le lem 1
+qu le liaison 1
+qu le mach 1
+qu le maxim 1
+qu le meilleur 1
+qu le mod 1
+qu le nid 1
+qu le nombr 3
+qu le pag 1
+qu le param 1
+qu le parcour 1
+qu le part 1
+qu le partit 1
+qu le patron 1
+qu le pav 1
+qu le perform 2
+qu le ph 1
+qu le pil 1
+qu le point 3
+qu le pointeur 1
+qu le pr 1
+qu le prem 2
+qu le principaux 1
+qu le probl 4
+qu le processeur 1
+qu le processus 1
+qu le produit 1
+qu le program 1
+qu le proj 1
+qu le propr 1
+qu le protocol 1
+qu le pseud 1
+qu le quest 1
+qu le raison 1
+qu le register 1
+qu le regroup 1
+qu le rep 1
+qu le repr 1
+qu le rest 1
+qu le restructur 1
+qu le retour 1
+qu le sit 1
+qu le som 1
+qu le sous 1
+qu le stat 1
+qu le suj 1
+qu le syst 2
+qu le tableau 1
+qu le tableaux 1
+qu le taux 1
+qu le techniqu 2
+qu le term 1
+qu le test 1
+qu le tj 1
+qu le tr 2
+qu le trait 1
+qu le transfer 1
+qu le transform 1
+qu le treil 1
+qu le tutoriel 1
+qu le typ 1
+qu le unif 1
+qu le valeur 3
+qu le variabl 2
+qu le vecteur 2
+qu lec 1
+qu lec dun 1
+qu lefficacit 1
+qu lenregister 1
+qu lenregister sur 1
+qu lensembl 2
+qu lensembl de 1
+qu lenviron 1
+qu lenviron peut 1
+qu lenviron soit 1
+qu lespac 2
+qu lespac adr 1
+qu lespac occup 1
+qu lestampil 1
+qu leur 2
+qu leur mi 1
+qu leur sont 1
+qu lexpr 1
+qu lext 1
+qu lext du 1
+qu lhypoth 1
+qu lhypoth es 1
+qu li 1
+qu li ee 1
+qu lib 1
+qu lim 1
+qu lim reducibil 1
+qu lin 3
+qu lin eair 1
+qu lin egalit 1
+qu lin manner 1
+qu linaptitud 1
+qu linit 1
+qu linit de 1
+qu linstruc 2
+qu linstruc ch 1
+qu linstruc correspon 1
+qu linstruc dappel 1
+qu linstruc trust 1
+qu linstruc unif 1
+qu lint 1
+qu lint er 1
+qu lintroduc 2
+qu lintroduc dan 1
+qu lintroduc dun 1
+qu linv 1
+qu linv dun 1
+qu lm1 1
+qu lm1 km2 1
+qu loccur 1
+qu logiciel 1
+qu lon 5
+qu lon ait 1
+qu lon ajout 1
+qu lon appel 3
+qu lon aurait 1
+qu lon cherch 1
+qu lon consid 1
+qu lon effectu 1
+qu lon empil 1
+qu lon extrait 1
+qu lon gard 1
+qu lon ne 1
+qu lon not 1
+qu lon obt 2
+qu lon obtiendrait 1
+qu lon partit 1
+qu lon peut 3
+qu lon pouvait 1
+qu lon pr 1
+qu lon pren 1
+qu lon pu 3
+qu lon remplac 1
+qu lon sait 1
+qu lon se 1
+qu lon sint 1
+qu lon sort 1
+qu lon souhait 1
+qu lon trouv 1
+qu lon veut 1
+qu lon vient 1
+qu lop 2
+qu lop erateur 2
+qu lor 2
+qu lor de 2
+qu lorsqu 3
+qu lorsqu la 2
+qu lorsquon 1
+qu lu 2
+qu lu est 2
+qu lu sont 1
+qu lun 1
+qu lun de 1
+qu lunif 1
+qu lunif de 1
+qu lunif ne 1
+qu lunif se 1
+qu luniqu 1
+qu luniqu point 1
+qu lutil 2
+qu lutil de 2
+qu lutil du 1
+qu lutil dun 1
+qu lutil le 1
+qu lutilit 1
+qu m em 1
+qu m emor 1
+qu m es 1
+qu m2 1
+qu m2 div 1
+qu ma 1
+qu ma aid 1
+qu mach 1
+qu mach abstrait 1
+qu manipl 1
+qu manipl de 1
+qu mapl 1
+qu mapl de 1
+qu match 1
+qu maxff 1
+qu may retrief 1
+qu me fait 1
+qu measur 1
+qu measur qsm 1
+qu ment 1
+qu ment es 1
+qu mesurer 1
+qu mesurer pr 1
+qu michel 1
+qu michel dorochevsk 1
+qu minim 1
+qu minim residu 1
+qu minimiser 1
+qu minimiser cest 1
+qu mk 2
+qu mk mi 1
+qu mk soit 1
+qu mod 2
+qu mod el 1
+qu mod li 1
+qu modif 1
+qu modif de 1
+qu mont 1
+qu montr 3
+qu montr qu 1
+qu montr quun 1
+qu multilevel 2
+qu multilevel schem 2
+qu n ecessair 1
+qu n ecessit 1
+qu n ecessiterait 1
+qu n elimin 1
+qu n es 1
+qu na 1
+qu na de 1
+qu na pa 1
+qu nalt 1
+qu nappar 1
+qu nappar qu 1
+qu naurait 1
+qu naurait pa 1
+qu nauront 1
+qu naut 1
+qu naut en 1
+qu ne 5
+qu ne cont 1
+qu ne devr 1
+qu ne diff 1
+qu ne doiv 1
+qu ne la 1
+qu ne le 2
+qu ne peut 3
+qu ne requ 1
+qu ne se 1
+qu ne sen 1
+qu ne ser 1
+qu ne serait 1
+qu ne sinscrit 1
+qu ne soit 1
+qu ne sont 3
+qu ne surprendr 1
+qu ne trait 1
+qu neck 1
+qu neck cut 1
+qu neffectu 1
+qu neffectu quun 1
+qu nenv 1
+qu nest 4
+qu nest cap 1
+qu nest manifest 1
+qu nest ni 1
+qu nest pa 1
+qu nest quun 1
+qu newt 1
+qu newt method 1
+qu newt search 1
+qu ni 1
+qu ni le 1
+qu ninterv 2
+qu ninterv pa 2
+qu no 1
+qu no travaux 1
+qu notr 1
+qu notr classif 1
+qu nous 5
+qu nous appelleron 1
+qu nous appelon 3
+qu nous apport 1
+qu nous avon 4
+qu nous concern 1
+qu nous concerner 1
+qu nous conduit 1
+qu nous conseillon 1
+qu nous consid 2
+qu nous continueron 1
+qu nous diron 1
+qu nous effectuon 1
+qu nous etud 1
+qu nous etudieron 1
+qu nous illustron 1
+qu nous int 2
+qu nous lindiqu 1
+qu nous noteron 1
+qu nous nous 1
+qu nous perm 2
+qu nous pr 3
+qu nous prenon 1
+qu nous proposon 3
+qu nous qualioeron 1
+qu nous ram 1
+qu nous reprenon 1
+qu nous sembl 3
+qu nous tiendront 1
+qu nous utiliseron 1
+qu nous utilison 1
+qu nous venon 3
+qu nous voul 1
+qu nous voyon 1
+qu nutil 1
+qu nutil pa 1
+qu oe1 1
+qu oe2 1
+qu of altern 1
+qu of answer 1
+qu of coar 1
+qu of computer 2
+qu of decluster 1
+qu of design 1
+qu of dialog 1
+qu of ec 1
+qu of el 1
+qu of gr 1
+qu of multilevel 1
+qu of nest 1
+qu of order 1
+qu of parod 1
+qu of serv 4
+qu of shap 1
+qu of siz 1
+qu of solut 1
+qu ol 1
+qu ol valeur 1
+qu ont 2
+qu ont accept 1
+qu ont conduit 1
+qu ont engendr 1
+qu ont leur 1
+qu ont lieu 1
+qu ont relu 1
+qu ont serv 1
+qu ont un 1
+qu op 1
+qu op erent 1
+qu oper 1
+qu optim 5
+qu or stab 1
+qu order 1
+qu order faster 1
+qu over sp 1
+qu par 2
+qu par cop 1
+qu par de 1
+qu par la 1
+qu par le 2
+qu par linstruc 1
+qu par simpl 1
+qu par son 1
+qu par un 1
+qu param 1
+qu param etr 1
+qu partag 1
+qu partag le 1
+qu perm 6
+qu perm aux 1
+qu perm dam 1
+qu perm davoir 1
+qu perm de 5
+qu perm desp 1
+qu perm dimpl 1
+qu perm encor 1
+qu perm un 2
+qu permettrait 1
+qu permettrait la 1
+qu peu 2
+qu peu dattrait 1
+qu peu de 1
+qu peu dint 1
+qu peut 3
+qu peut donc 2
+qu peut etr 2
+qu peut evoluer 1
+qu peut impliquer 1
+qu peut prendr 1
+qu peut redevenir 1
+qu peut se 1
+qu peut tr 1
+qu peuv 4
+qu peuv alor 1
+qu peuv appar 1
+qu peuv echouer 1
+qu peuv etr 3
+qu peuv pr 1
+qu peuv se 1
+qu peuv sec 1
+qu peuv survenir 1
+qu pk 1
+qu pk termin 1
+qu plus anc 1
+qu plus la 1
+qu plus le 1
+qu plusieur 1
+qu plusieur processeur 1
+qu po 2
+qu po de 1
+qu po du 1
+qu po ed 1
+qu po la 1
+qu po le 1
+qu polynom 1
+qu polynom tim 1
+qu port 1
+qu port sur 1
+qu pour 2
+qu pour avoir 1
+qu pour de 1
+qu pour etr 1
+qu pour la 1
+qu pour le 2
+qu pour pm 1
+qu pour sav 1
+qu pour son 1
+qu pourrait 1
+qu pourrait etr 1
+qu pourrait eventuel 1
+qu pourrait jouer 1
+qu pouv 2
+qu pouv apporter 1
+qu pouv avoir 1
+qu pp 1
+qu pp opt 1
+qu pr 3
+qu pr ec 1
+qu pr esent 1
+qu pr sent 1
+qu pren 1
+qu pren eoeectiv 1
+qu problem 1
+qu problem imp 1
+qu problem using 1
+qu proc 7
+qu proc techniqu 1
+qu proc tim 1
+qu produc 1
+qu produit 1
+qu program 1
+qu program appl 1
+qu program datab 1
+qu program form 1
+qu program oe 1
+qu program oe1 1
+qu program oe2 1
+qu program ss 1
+qu program using 1
+qu prolog 1
+qu prop 1
+qu prot 1
+qu prot eg 1
+qu prouv 1
+qu prouv qu 1
+qu prouv sa 1
+qu provoqu 1
+qu provoqu le 1
+qu provoquer 1
+qu provoquer lec 1
+qu pu 1
+qu pugh 1
+qu pur 1
+qu pur informatiqu 1
+qu q1.0 1
+qu qk 1
+qu qu 1
+qu quel 1
+qu quel qu 1
+qu quelqu 2
+qu quelqu aspect 1
+qu qx 1
+qu r eclam 1
+qu r eduit 1
+qu r ef 1
+qu r esulterait 1
+qu ralentit 1
+qu ralentit leur 1
+qu rectangl 1
+qu rectangl degener 1
+qu rel 1
+qu rel event 1
+qu rem 1
+qu rem simpl 1
+qu ren 1
+qu ren la 1
+qu ren leur 1
+qu ren tr 1
+qu ren un 1
+qu rep 2
+qu rep sur 2
+qu repr 2
+qu repr esent 2
+qu requ 1
+qu requ qu 1
+qu requir 1
+qu resolut 1
+qu resolut algorithm 1
+qu rest 3
+qu rest libr 1
+qu rest sensibil 1
+qu restreindront 1
+qu restreindront la 1
+qu restreint 1
+qu restreint en 1
+qu restreint son 1
+qu retourn 2
+qu retourn pour 1
+qu retourn un 1
+qu retr 1
+qu retr doit 1
+qu rev 1
+qu rien 1
+qu rien dan 1
+qu risquer 1
+qu risquer de 1
+qu rl 1
+qu rn 1
+qu s ecrit 1
+qu s ecriv 1
+qu s soit 1
+qu sa 2
+qu sa sel 1
+qu sajout 1
+qu sajout au 1
+qu sav 3
+qu sav cut 1
+qu sav erent 1
+qu sav erer 1
+qu se 6
+qu se cach 1
+qu se charg 1
+qu se comport 1
+qu se concentr 1
+qu se distingu 1
+qu se pa 1
+qu se peut 1
+qu se pr 1
+qu se propag 1
+qu se regrouper 1
+qu se simplif 1
+qu se sont 1
+qu se traduit 1
+qu se trouv 1
+qu sel 1
+qu sel la 1
+qu sembl 1
+qu sembl etr 1
+qu sep 1
+qu ser 4
+qu ser etud 1
+qu ser plac 1
+qu ser pr 1
+qu ser produit 1
+qu serait 2
+qu serait im 1
+qu seront 2
+qu seront susceptibl 1
+qu seront util 1
+qu sest 1
+qu sest retrouv 1
+qu si 3
+qu si cel 1
+qu si la 2
+qu si lallong 1
+qu si largum 1
+qu si lattribut 1
+qu si le 2
+qu si lenregister 1
+qu si lon 1
+qu si un 2
+qu sicstus 1
+qu sicstus prolog 1
+qu sid 1
+qu sid experim 1
+qu sid qx 1
+qu signif 1
+qu signif qu 1
+qu sil 1
+qu sil est 1
+qu sil ny 1
+qu simpl 1
+qu simplif 1
+qu simplif le 1
+qu siz 3
+qu softwar 1
+qu softwar tool 1
+qu soit 5
+qu soit ce 1
+qu soit congru 1
+qu soit cr 1
+qu soit la 2
+qu soit le 2
+qu soit limpl 1
+qu soit optim 1
+qu soit proch 1
+qu soit son 1
+qu son 2
+qu son anc 1
+qu son champ 1
+qu son corp 1
+qu son estampil 1
+qu son exploit 1
+qu son inver 1
+qu son prem 1
+qu sont 5
+qu sont alor 1
+qu sont commun 1
+qu sont de 1
+qu sont en 1
+qu sont le 2
+qu sont tirabl 1
+qu sont toujour 1
+qu sont transpar 1
+qu sous 1
+qu sous trait 1
+qu stag 1
+qu start 1
+qu su 1
+qu su fair 1
+qu sub 1
+qu sub nengendr 1
+qu sug 1
+qu suit 2
+qu suit la 1
+qu suit nous 1
+qu suivront 1
+qu suivront nous 1
+qu sup 2
+qu sup donc 1
+qu sup pour 1
+qu sup qu 1
+qu sup un 1
+qu sur 2
+qu sur le 1
+qu switch 1
+qu system 1
+qu t est 1
+qu t nexpir 1
+qu t2 1
+qu tak 1
+qu tak signif 1
+qu tant 1
+qu tant lenviron 1
+qu tb 1
+qu tb rest 1
+qu techniqu 1
+qu termin 1
+qu termin la 1
+qu th loc 1
+qu th secon 1
+qu ti 1
+qu ti est 1
+qu tien 1
+qu tien compt 1
+qu tiendr 1
+qu tiendr lieu 1
+qu tj 1
+qu tj tk 1
+qu touch 1
+qu tous 3
+qu tous ce 1
+qu tous le 3
+qu tout 2
+qu tout agc 1
+qu tout le 1
+qu tr 4
+qu tr approach 1
+qu tr ba 1
+qu tr dat 1
+qu tr decomposit 1
+qu tr es 2
+qu tr nod 1
+qu tr repr 1
+qu tr segm 1
+qu tr spat 1
+qu tr structur 1
+qu tr termin 1
+qu traduit 1
+qu traduit lexempl 1
+qu traduit notr 1
+qu transform 1
+qu transform la 1
+qu transform le 1
+qu traver 1
+qu traver aus 1
+qu turk 1
+qu turk ne 1
+qu unif 1
+qu unif son 1
+qu uniform 1
+qu util 2
+qu util la 1
+qu util un 1
+qu utiliser 1
+qu utiliser la 1
+qu v erif 1
+qu va 2
+qu va etr 1
+qu va suivr 1
+qu val 1
+qu val plein 1
+qu valu 1
+qu var 2
+qu var indiqu 1
+qu var perman 1
+qu var tr 1
+qu veut 1
+qu veut dir 1
+qu veut qu 1
+qu vi 1
+qu vien 1
+qu vien sintercaler 1
+qu vient 1
+qu vient doubler 1
+qu vont 2
+qu vont dispar 1
+qu vont permettr 1
+qu vu 1
+qu vu dan 1
+qu week 1
+qu which return 1
+qu wil activ 1
+qu wil retrief 1
+qu wil return 1
+qu with respect 1
+qu y ax 1
+qu zn 1
+qu zn ae 1
+qu zn sj2e 1
+quadr 16
+quadr bound 1
+quadr coeff 1
+quadr constraint 2
+quadr control 1
+quadr curv 1
+quadr equ 3
+quadr equ constraint 1
+quadr error 1
+quadr error meter 1
+quadr etc 1
+quadr mirror 1
+quadr mirror filter 1
+quadr relac 1
+quadr term 1
+quadr tim 1
+quadr vid 1
+quadr vid mixer 1
+quadratiqu 1
+quadratiqu g successiv 1
+quadrisect 1
+quadrisect and octasect 1
+quadrupl 3
+quadrupl hu 1
+quadrupl selon 1
+quadrupl selon le 1
+quadtr 3
+quadtr and appl 1
+quadtr and rel 1
+quadtr approach 1
+quadtr build 1
+quadtr build algorithm 1
+quadtr dat 2
+quadtr dat structur 2
+quadtr manipl 1
+quadtr problem 1
+quadtr repr 1
+quadtr root 1
+qualif 9
+qualif chunk 1
+qualif dat 2
+qualif dat valu 1
+qualif de 1
+qualif de ocauchemar 1
+qualif nam 1
+qualif nam occur 1
+qualif object 1
+qualif pag 1
+qualif th utter 1
+qualif to answer 1
+qualif transl 1
+qualif tupl 1
+qualif tupl incr 1
+qualioeron 1
+qualioeron de 1
+qualit 13
+qualit an 1
+qualit ap 1
+qualit de 1
+qualit de guid 1
+qualit dep 1
+qualit dep rel 1
+qualit diagn 1
+qualit diagn consider 1
+qualit distinct 1
+qualit distinct se 1
+qualit e au 1
+qualit e du 1
+qualit es 1
+qualit es humain 1
+qualit examin 1
+qualit explan 1
+qualit featur 1
+qualit knowledg 1
+qualit model 2
+qualit percept 1
+qualit percept model 1
+qualit reason 1
+qualit rel 1
+qualit simil 1
+qualit siml 2
+qualit siml model 1
+qualit spat 1
+qualit techniqu 1
+qualit theor 1
+qualitatif 1
+qualitatif pour 1
+qualitatif pour exprimer 1
+qualor 1
+qualor le 1
+qualor le boucl 1
+quancourt 1
+quancourt en 1
+quancourt en ce 1
+quand 3
+quand bien 1
+quand cest 1
+quand cest le 1
+quand est 1
+quand est ce 1
+quand il 1
+quand il ny 1
+quand il sagit 1
+quand l etat 1
+quand la 1
+quand la coupur 1
+quand la cr 1
+quand le 2
+quand le bloc 1
+quand le claus 1
+quand le nombr 1
+quand le tr 1
+quand lunif 1
+quand lunif se 1
+quand on parcourt 1
+quand on peut 2
+quand superficiel 1
+quand superficiel vaut 1
+quand un 1
+quand un argum 1
+quand un attribut 1
+quand un claus 1
+quand un de 1
+quand un nouveau 1
+quant 27
+quant a la 2
+quant a lunif 1
+quant a uniform 1
+quant acc 1
+quant and sign 1
+quant and subtract 1
+quant ar equ 1
+quant ar estim 1
+quant ar shown 1
+quant au 1
+quant au test 1
+quant codebook 1
+quant codebook gener 1
+quant dep 1
+quant design 1
+quant ed 1
+quant error 1
+quant expon 1
+quant g0 1
+quant imag 1
+quant imag using 1
+quant in nlp 1
+quant led 1
+quant maxf1 1
+quant no 1
+quant no effect 1
+quant no reduc 1
+quant oe 1
+quant oej 1
+quant of dat 1
+quant of inform 1
+quant of pattern 1
+quant of transm 1
+quant output 1
+quant output xn 1
+quant pol 1
+quant rang 1
+quant repr 2
+quant repr st 1
+quant system 1
+quant techniqu 1
+quant th measur 1
+quant th uncertaint 1
+quant tw valu 1
+quant using 1
+quant valu 1
+quant vid 1
+quant vid sequ 1
+quant wer gener 1
+quantif 21
+quantif altogether 1
+quantif asser 1
+quantif boolean 2
+quantif boolean forml 2
+quantif by in 1
+quantif de 1
+quantif de certain 1
+quantif depth 1
+quantif descript 1
+quantif ee 2
+quantif ee par 1
+quantif elim 3
+quantif elim method 1
+quantif elim preserv 1
+quantif elim procedur 2
+quantif elim techniqu 1
+quantif elim yield 1
+quantif explicit 1
+quantif for object 1
+quantif fr 2
+quantif fr conjunct 1
+quantif fr dnf 1
+quantif fr forml 2
+quantif guar 1
+quantif hav interv 1
+quantif in nu 1
+quantif instead 1
+quantif is dec 1
+quantif is equ 1
+quantif is undec 1
+quantif le 1
+quantif le perform 1
+quantif lint 1
+quantif lint er 1
+quantif qu 1
+quantif rang 1
+quantif stat 1
+quantif stat lead 1
+quantif subtyp 1
+quantif subtyp rl 1
+quantif th benefit 1
+quantif th comparison 1
+quantif th cost 1
+quantif th not 1
+quantif th proper 1
+quantif theor 1
+quantif to individu 1
+quantif typ 1
+quantif un 1
+quantif un transform 1
+quantif variabl 3
+quantif variabl appear 1
+quantif variabl using 1
+quantif with widest 1
+quantificateur 1
+quantificateur de 1
+quantificateur de nu 1
+quantioc 1
+quantioc du 1
+quantioc du mouv 1
+quantit 15
+quantit algorithm 1
+quantit and compar 1
+quantit comparison 2
+quantit dat 1
+quantit de 1
+quantit definit 1
+quantit dit 1
+quantit dit de 1
+quantit e de 1
+quantit e posit 1
+quantit et non 1
+quantit fin 1
+quantit fin pour 1
+quantit measur 1
+quantit qu 1
+quantit qu con 1
+quantit schem 1
+quantit techniqu 1
+quantitatif 2
+quantitatif concern 1
+quantitatif concern notr 1
+quantitatif contenus 1
+quantitatif contenus dan 1
+quantitativ 1
+quantitativ le 1
+quantitativ le pav 1
+quantitativ son 1
+quantitativ son eff 1
+quantum 2
+quantum natom 1
+quappl 1
+quappl lin 1
+quappl lin eair 1
+quapproximativ 1
+quapr 1
+quapr es 1
+quapr es la 1
+quarchitectur 1
+quarter 3
+quasiapproxim 1
+quasim 1
+quasim in 1
+quasim in au 1
+quasim ind 1
+quasim ind epen 1
+quasim san eff 1
+quasiquot 1
+quasiquot expr 1
+quasiquot macr 1
+quasiquot skel 1
+quast 1
+quat 1
+quat de 1
+quaterman 1
+quatern 1
+quatern et ant 1
+quatern et control 1
+quatern et quaternion 1
+quatern et vecteur 1
+quatern in robot 1
+quatern unitair 1
+quaternion 1
+quaternion assoc 1
+quaternion matriciel 1
+quaternion matriciel assoc 1
+quatr 4
+quatr ac 1
+quatr ac principaux 1
+quatr aspect 1
+quatr aspect import 1
+quatr cl 1
+quatr cl de 1
+quatr contraint 1
+quatr contraint sur 1
+quatr em 1
+quatr em part 1
+quatr etiqu 1
+quatr etiqu sel 1
+quatr fo 1
+quatr me part 1
+quatr oct 1
+quatr oct est 1
+quatr pag 1
+quatr r esultat 1
+quatr s equ 1
+quatr tail 1
+quatr tail diff 1
+quatr typ 2
+quatr typ de 1
+quatr variabl 1
+quau 4
+quau bout 1
+quau bout dun 1
+quau ca 1
+quau moin 1
+quau nid 1
+quau nid de 1
+quau niveau 2
+quau niveau de 1
+quau niveau th 1
+quau point 1
+quau point de 1
+quau traver 1
+quau traver de 1
+quaucun 2
+quaucun bloc 1
+quaucun bloc vid 1
+quaucun m ecan 1
+quaucun ne 1
+quaucun partit 1
+quaucun partit de 1
+quaucun point 2
+quaucun point de 1
+quaucun point ent 1
+quaucun structur 1
+quaucun structur suppl 1
+quaucun term 1
+quaucun term comp 1
+quaur 1
+quaur je 1
+quaur je fait 1
+quaux 2
+quaux architectur 1
+quaux architectur mimd 1
+quaux conjonct 1
+quaux conjonct don 1
+quaux etap 1
+quaux etap suiv 1
+quaux sel 1
+quaux sel sect 1
+quaux techniqu 1
+quaux techniqu math 1
+quavec 1
+quavec se 1
+quavec se deux 1
+quavec un 1
+quavec un protocol 1
+quavec un tail 1
+quebec 1
+quebec cit 1
+quec 1
+quec ecuteront 1
+quec ecuteront le 1
+queen 4
+queen problem 3
+queen problem run 1
+queen search1 1
+queen seem 1
+queensland 2
+queinnec 2
+quel 5
+quel a sub 1
+quel appar 1
+quel appar avec 1
+quel argum 1
+quel argum correspon 1
+quel argum restaurer 1
+quel claus 1
+quel cod 1
+quel cod ex 1
+quel con 1
+quel condit 1
+quel condit le 1
+quel condu 1
+quel conduit 1
+quel d epen 1
+quel dev 1
+quel dev un 1
+quel dilat 1
+quel dilat est 1
+quel doit 1
+quel doit seffectuer 1
+quel en 1
+quel en prouv 1
+quel endroit 1
+quel endroit il 1
+quel engendr 1
+quel est 2
+quel est acc 1
+quel est empl 1
+quel est fourn 1
+quel est habituel 1
+quel est intim 1
+quel est la 1
+quel est pr 1
+quel est pratiqu 1
+quel est util 1
+quel illustr 1
+quel illustr la 1
+quel impliqu 1
+quel impliqu naturel 1
+quel induit 1
+quel induit en 1
+quel mesur 1
+quel mesur le 1
+quel n ecessit 1
+quel ne 2
+quel ne cont 1
+quel ne pren 1
+quel ne soit 2
+quel nest 1
+quel nest en 1
+quel noeud 1
+quel noeud etendr 1
+quel nombr 1
+quel nous 1
+quel nous perm 1
+quel ordr 2
+quel ordr appropr 1
+quel ordr il 1
+quel pag 1
+quel pag el 1
+quel part 1
+quel part de 1
+quel partag 1
+quel partit 1
+quel partit cycliqu 1
+quel perm 2
+quel perm un 1
+quel peut 2
+quel peut favoriser 1
+quel po 1
+quel po ed 1
+quel point 1
+quel point el 1
+quel point la 1
+quel pous 1
+quel pous le 1
+quel pr 1
+quel pr esent 1
+quel produit 1
+quel produit peu 1
+quel pu 1
+quel pu profiter 1
+quel qu 4
+quel qu soit 4
+quel quil 1
+quel quil soit 1
+quel rec 1
+quel rec el 1
+quel register 1
+quel register charger 1
+quel rep 1
+quel rep sur 1
+quel respect 1
+quel respect le 1
+quel sen 1
+quel sen nous 1
+quel soit 1
+quel soit unimodulair 1
+quel sont 1
+quel sont ce 1
+quel sub 1
+quel typ 1
+quel typ dordonnanc 1
+quel util 1
+quel v erif 1
+quel variabl 1
+quel variabl devait 1
+quel vient 1
+quel zon 1
+quel zon en 1
+quelconqu 4
+quelconqu dan 1
+quelconqu est 2
+quelconqu est dexhiber 1
+quelconqu est obtenu 1
+quelconqu est un 1
+quelconqu et fournit 1
+quelconqu ne 1
+quelconqu ne concern 1
+quelqu 5
+quelqu appl 1
+quelqu aspect 1
+quelqu aspect de 1
+quelqu centain 1
+quelqu centain de 1
+quelqu crit 1
+quelqu crit er 1
+quelqu d efaut 1
+quelqu d riv 1
+quelqu dizain 2
+quelqu dizain dev 1
+quelqu el 2
+quelqu el ement 2
+quelqu ind 1
+quelqu ind perm 1
+quelqu instruc 1
+quelqu instruc dind 1
+quelqu instruc simpl 1
+quelqu mil 1
+quelqu perspectiv 1
+quelqu perspectiv sur 1
+quelqu probl 1
+quelqu probl me 1
+quelqu propr 1
+quelqu r esultat 1
+quelqu rappel 1
+quelqu remarqu 1
+quelqu remarqu dun 1
+quelqu sort 3
+quelqu sort larticl 1
+quelqu un 1
+quelqu v erif 1
+quelquef 1
+quelquef dynamiqu 1
+quelquef dynamiqu reconfigur 1
+quelquef suj 1
+quembryonnair 1
+quen 3
+quen ca 1
+quen ca de 1
+quen ch 1
+quen ch convenabl 1
+quen compr 1
+quen compr dim 1
+quen con 1
+quen con equ 1
+quen es 1
+quen es daugmenter 1
+quen espac 1
+quen est 1
+quen est il 1
+quen fait 1
+quen fait ce 1
+quen fonct 1
+quen fonct de 1
+quen lab 1
+quen lab de 1
+quen pr 1
+quen pr es 1
+quen pratiqu 1
+quen pratiqu le 1
+quen s echang 1
+quen un simpl 1
+quentiel 1
+quentr 1
+quentr repr 1
+quentr repr es 1
+quer 13
+quer and dirt 1
+quer and evalu 1
+quer and integr 1
+quer and q1.0 1
+quer ar high 1
+quer ar natur 1
+quer ar obtain 1
+quer ar perform 1
+quer ar sup 1
+quer becom 1
+quer by imag 1
+quer by user 1
+quer comput 1
+quer contain 1
+quer contain inequ 1
+quer du 1
+quer execut 1
+quer follow 1
+quer imag 1
+quer in rel 2
+quer in term 1
+quer inclus 1
+quer incr 1
+quer indefinit 1
+quer indefinit dat 1
+quer involut 1
+quer involut cur 1
+quer is high 1
+quer lik find 1
+quer list 1
+quer not involut 1
+quer oe1 1
+quer on chang 1
+quer on spat 1
+quer on var 1
+quer q1.0 1
+quer q1.0 point 1
+quer q1.5 1
+quer q1.8 1
+quer q8.0 1
+quer requir 1
+quer requir exc 1
+quer requir join 1
+quer requir unpack 1
+quer retrief 1
+quer se 1
+quer select 1
+quer tak 1
+quer tak longer 1
+quer than timesl 1
+quer that return 1
+quer to stud 1
+quer us 1
+quer using 2
+quer using pr 1
+quer wer run 1
+quer wer squar 1
+quer wh tt 1
+quer when compar 1
+quer which count 1
+quer which find 1
+quer which involut 1
+quer which retrief 1
+quer which select 1
+quer with constraint 1
+quer with integer 1
+quer with lin 1
+quer with var 1
+querybound 1
+querybound mach 1
+quest 57
+quest 1.5a 1
+quest allou 1
+quest allou ee 1
+quest and assign 1
+quest and ccidl 1
+quest and fr 1
+quest and hypoth 1
+quest and issu 1
+quest and quest 1
+quest and return 1
+quest answer 2
+quest appl 1
+quest ar 3
+quest ar addr 1
+quest ar answer 1
+quest ar ind 1
+quest ar list 1
+quest ar po 1
+quest ask 2
+quest ask appl 1
+quest assoc 1
+quest becaus nam 1
+quest being po 1
+quest below equ 1
+quest by assum 1
+quest by gener 1
+quest by show 1
+quest ce 1
+quest ce quun 1
+quest concern 1
+quest consider 1
+quest correct 1
+quest d elag 1
+quest darchitectur 1
+quest de 1
+quest de bal 1
+quest de compil 1
+quest driv 1
+quest driv st 1
+quest driv understand 1
+quest du 1
+quest du co 1
+quest es 1
+quest es de 1
+quest est 1
+quest est de 1
+quest est en 1
+quest fi 1
+quest fi gener 1
+quest for architect 1
+quest for benchmark 1
+quest for futur 1
+quest fr 1
+quest funct 1
+quest gener 1
+quest how expr 1
+quest identif 1
+quest identif ph 1
+quest il ask 1
+quest in prev 1
+quest interest 1
+quest involut 1
+quest involut multipl 1
+quest is addr 1
+quest is answer 1
+quest is consider 1
+quest is dealt 1
+quest is object 1
+quest is po 1
+quest is ra 1
+quest is rel 1
+quest is repr 1
+quest is resum 1
+quest is triv 1
+quest le 1
+quest le techniqu 1
+quest may lead 1
+quest mov 1
+quest natur 1
+quest natur ar 1
+quest not answer 1
+quest not ask 1
+quest of compl 1
+quest of composit 1
+quest of ec 1
+quest of qu 1
+quest of sid 1
+quest of var 1
+quest or knowledg 1
+quest ouver 1
+quest particl 1
+quest pattern 1
+quest po 2
+quest po li 1
+quest po skim 1
+quest prob 1
+quest ra 1
+quest regard 2
+quest remain 2
+quest repr 1
+quest requir 1
+quest requir answer 1
+quest se 2
+quest se po 1
+quest se poser 1
+quest siz 1
+quest string 1
+quest string hold 1
+quest sur 1
+quest sur la 1
+quest tel 1
+quest tel qu 1
+quest th eff 1
+quest th gener 1
+quest than srq 1
+quest that ar 1
+quest to ask 1
+quest to compar 1
+quest tout 1
+quest tout en 1
+quest wa tackl 1
+quest we compar 1
+quest wer design 1
+quest wer disc 1
+quest wer trunc 1
+quest wh answer 1
+quest which ar 1
+quest wil repr 1
+quest with answer 1
+quest with ident 1
+quest within web 1
+quest would plac 1
+quest ye 1
+quest ye answer 1
+quest.cat 1
+quest.h 1
+quest.msf 1
+quest.msf me 1
+questionnair 2
+questionnair surv 1
+questionnair that record 1
+questionnair to confirm 1
+questionnair wa reason 1
+questionnair which record 1
+questiontarg 1
+questiontarg verdict 1
+questiontarg verdict verdict 1
+queu 21
+queu acc 1
+queu acc tak 1
+queu acc turn 1
+queu act 1
+queu act cl 1
+queu act correspon 1
+queu act shar 1
+queu algorithm 1
+queu and behavior 1
+queu and dispatch 1
+queu and doughnut 1
+queu and incorpor 1
+queu and input 1
+queu and plac 1
+queu and pol 1
+queu and propag 1
+queu and show 1
+queu and sign 1
+queu and transm 1
+queu ar fram 1
+queu ar return 1
+queu architectur 1
+queu ba 2
+queu ba hardwar 1
+queu ba implem 1
+queu ba schem 1
+queu ba softwar 1
+queu ba switch 1
+queu belong 1
+queu buffer 1
+queu buffer organ 1
+queu by execut 1
+queu cal 1
+queu dat 1
+queu dat structur 1
+queu de 1
+queu de argum 1
+queu de ce 1
+queu de la 1
+queu del 2
+queu discipl 1
+queu dispatch 1
+queu dispatch act 1
+queu el 2
+queu facil 1
+queu for fast 1
+queu for lock 1
+queu for parallel 1
+queu for se 1
+queu for unicast 1
+queu from figur 1
+queu hav attract 1
+queu implem 1
+queu in hypercub 1
+queu intern 1
+queu is empt 1
+queu is entir 1
+queu is exhaust 1
+queu is order 1
+queu is repl 1
+queu length 1
+queu loc 2
+queu loc queu 1
+queu lock 1
+queu lock request 1
+queu maint 1
+queu maint cost 1
+queu maintain 2
+queu manager 2
+queu manager man 1
+queu manager nod 1
+queu manager queu 1
+queu me 1
+queu model 1
+queu msg 1
+queu of client 1
+queu of lock 1
+queu of me 1
+queu of pack 2
+queu of parameter 1
+queu of pi 1
+queu of server 1
+queu of siz 1
+queu on distribut 1
+queu oper 1
+queu organ 1
+queu over input 1
+queu pack 1
+queu param 1
+queu proc 1
+queu queu 1
+queu ra 1
+queu requir 2
+queu return 1
+queu return dum 1
+queu rout 1
+queu rout pack 1
+queu scheduler 1
+queu schem 1
+queu sem 1
+queu server 1
+queu server thread 1
+queu siz 1
+queu st 2
+queu st method 1
+queu system 2
+queu that st 1
+queu tim 1
+queu tn 1
+queu tn de 1
+queu tr 1
+queu tr list.ap 1
+queu under probabil 1
+queu using 1
+queu using deficit 1
+queu vouch 1
+queu vouch rloc.vouch 1
+queu which allow 1
+queu which exchang 1
+queu with feedback 1
+queu with random 1
+queu with speedup 1
+queu would li 1
+queu.clear 1
+queu.empt 1
+queu.first 1
+queu.inser 1
+queu.next 1
+queu.remov 1
+quick 34
+quick and inexp 1
+quick and not 1
+quick and unhinder 1
+quick becaus intersect 1
+quick brown 1
+quick brown fox 1
+quick check 1
+quick comput 1
+quick comput pseudorandom 1
+quick determin 1
+quick discover 1
+quick establ 1
+quick evalu 1
+quick feedback 2
+quick fic 1
+quick fic instead 1
+quick fic lead 1
+quick fic unmaintain 1
+quick find 1
+quick find nod 1
+quick identif 1
+quick if inst 1
+quick improv 1
+quick improv began 1
+quick in parallel 1
+quick in pract 1
+quick in siz 1
+quick mask 1
+quick prototyp 3
+quick prototyp difficult 1
+quick prototyp system 1
+quick remov 1
+quick sequ 1
+quick solut 1
+quick sort 2
+quick sort algorithm 1
+quick substitut 1
+quick surv 1
+quick to chaot 1
+quick using 1
+quick verif 1
+quick without spen 1
+quick without start 1
+quicker 1
+quicksilver 1
+quicksort 1
+quicksortlik 1
+quicksortlik med 1
+quicksortlik med select 1
+quietblank 1
+quietblank whitespac 1
+quil 5
+quil a bien 1
+quil a su 1
+quil appel 1
+quil appel de 1
+quil apport 2
+quil av 1
+quil commenc 1
+quil cont 1
+quil cont ne 1
+quil cont parcour 1
+quil d efin 1
+quil d evelop 1
+quil doiv 1
+quil doiv fair 1
+quil ec 2
+quil ec au 1
+quil ec de 1
+quil ec effectiv 1
+quil ec un 2
+quil en 2
+quil en ec 1
+quil en po 1
+quil en ser 1
+quil en soit 1
+quil engendr 1
+quil est 4
+quil est difficil 1
+quil est don 1
+quil est facil 1
+quil est fr 1
+quil est impl 1
+quil est judicieux 1
+quil est souhait 1
+quil est toujour 1
+quil etait 2
+quil exploit 1
+quil exploit laffinit 1
+quil faudr 1
+quil faudr laccompagner 1
+quil faudrait 1
+quil faut 2
+quil faut oenjamber 1
+quil form 1
+quil form un 1
+quil imp 1
+quil imp entr 1
+quil li 1
+quil li son 1
+quil n ecessit 1
+quil na 1
+quil na pa 1
+quil navait 1
+quil ne 2
+quil ne perm 1
+quil ne po 1
+quil ne sag 1
+quil ne sagit 1
+quil ne se 1
+quil ne soit 1
+quil nec 2
+quil nec pa 2
+quil nen 1
+quil nen ec 1
+quil nest 1
+quil nest pa 1
+quil ny 3
+quil ny ait 2
+quil ny aur 1
+quil ont 1
+quil ont sur 1
+quil particip 1
+quil particip ou 1
+quil peut 2
+quil peut etr 1
+quil peut exister 1
+quil peut ne 1
+quil po 1
+quil po ed 1
+quil pouvait 1
+quil pouvait facil 1
+quil pr 1
+quil pr eten 1
+quil ren 1
+quil ren peu 1
+quil repr 2
+quil repr esent 2
+quil rest 1
+quil rev 1
+quil sagit 1
+quil sagit bien 1
+quil sagit simpl 1
+quil se 1
+quil se pr 1
+quil ser 1
+quil ser difficil 1
+quil serait 1
+quil serait de 1
+quil serait donc 1
+quil soient 1
+quil soient vraim 1
+quil soit 1
+quil soit aus 1
+quil sont 2
+quil sont aut 1
+quil subsistait 1
+quil suffit 1
+quil suffit donc 1
+quil termin 1
+quil y ait 1
+quil y aur 1
+quimpl 1
+quimpl ement 1
+quimprimer 1
+quimprimer un me 1
+quin 1
+quinstruc 1
+quint 1
+quinterv 1
+quinterv le 1
+quinterv le probl 1
+quintupl 1
+quintus 2
+quintus curtius 1
+quintus curtius snodgr 1
+quintus prolog 1
+quinvalider 1
+quinvalider superficiel 1
+quinvalider superficiel dan 1
+quit 4
+quit a cr 1
+quit a fair 1
+quit a intervertir 1
+quit a le 1
+quit command 1
+quit la 1
+quit la zon 1
+quit le 1
+quit le pr 1
+quitter 1
+quitter la 1
+quitter la claus 1
+quitter la zon 1
+quiz 1
+quiz quest 1
+quizz 1
+qun 1
+qun op 1
+qun op erat 1
+quoiqu 1
+quoiqu tr 1
+quoiqu tr es 1
+quon 3
+quon a besoin 1
+quon a exploit 1
+quon a inter 1
+quon appel 1
+quon appel leff 1
+quon atteignait 1
+quon atteignait un 1
+quon cherch 1
+quon d emontr 1
+quon do 1
+quon do veiller 1
+quon est 1
+quon est en 1
+quon na 1
+quon na donc 1
+quon obtiendrait 1
+quon obtiendrait en 1
+quon peut 2
+quon peut avoir 1
+quon peut diviser 1
+quon peut prendr 1
+quon peut rattach 1
+quon peut toujour 1
+quon se 1
+quon se heurt 1
+quon trouv 1
+quon trouv en 1
+quon vient 1
+quon vient de 1
+quop 1
+quop erationnel 1
+quot 12
+quot as bad 1
+quot datum 1
+quot de 1
+quot de la 1
+quot evalu 1
+quot in ericsson 1
+quot ind 1
+quot jon 1
+quot le 1
+quot le rest 1
+quot mancl 1
+quot metaobject 1
+quot method 1
+quot spac 1
+quot spac mk 1
+quot spec form 1
+quot th specif 1
+quresh 1
+qutnrc 1
+quun 5
+quun affair 1
+quun affair de 1
+quun approch 1
+quun approch paresseus 1
+quun architectur 1
+quun asser 1
+quun asser de 1
+quun attent 1
+quun attent particl 1
+quun attribut 1
+quun attribut est 1
+quun bon 3
+quun bon con 1
+quun bon part 1
+quun ch 1
+quun ch judicieux 1
+quun claus 1
+quun compteur 1
+quun compteur sp 1
+quun concept 1
+quun condit 1
+quun conflit 1
+quun contraint 1
+quun contraint imp 1
+quun d efaut 1
+quun de 1
+quun de boucl 1
+quun drapeau 1
+quun drapeau de 1
+quun ecritur 1
+quun ecritur avant 1
+quun eff 2
+quun eff loc 1
+quun eff margin 1
+quun el 1
+quun el ement 1
+quun etat 1
+quun examinateur 1
+quun explor 1
+quun explor pseud 1
+quun fa 2
+quun fa estim 1
+quun fa influ 1
+quun fa surc 1
+quun fo 2
+quun fo lib 1
+quun foncteur 1
+quun fus 1
+quun fus dun 1
+quun grand 1
+quun grand soin 1
+quun imag 1
+quun imag du 1
+quun impact 1
+quun inst 1
+quun inst de 1
+quun instruc 1
+quun instruc neck 1
+quun interrupt 1
+quun lim 1
+quun m em 1
+quun m ethod 1
+quun mach 1
+quun mach abstrait 1
+quun mi 2
+quun mi en 1
+quun mod 1
+quun mod li 1
+quun modif 2
+quun modif de 1
+quun moy 1
+quun moy origin 1
+quun nouveau 1
+quun nouveau drapeau 1
+quun op 1
+quun op erateur 1
+quun pag 1
+quun pag est 1
+quun pe 1
+quun pe fract 1
+quun point 1
+quun point dan 1
+quun point de 1
+quun pr 1
+quun pr edicat 1
+quun processeur 1
+quun processeur acc 1
+quun processeur aur 1
+quun processeur est 1
+quun processeur modif 1
+quun processeur nacc 1
+quun processeur ne 1
+quun processeur peut 1
+quun processeur pu 1
+quun program 1
+quun program exhib 1
+quun proj 1
+quun proj avort 1
+quun propr 1
+quun pseud 1
+quun pseud pr 1
+quun r ecup 1
+quun rec 1
+quun rec dun 1
+quun repr 1
+quun repr es 1
+quun s elect 1
+quun s equ 1
+quun saut 1
+quun saut indirect 1
+quun sch 1
+quun sch em 1
+quun sel 2
+quun sel acc 1
+quun sel conflit 1
+quun sel ecritur 1
+quun sel etap 1
+quun sel fo 1
+quun sel group 1
+quun sel inconnu 1
+quun sel pav 1
+quun sel processeur 1
+quun sel transfer 1
+quun simpl 1
+quun simpl branch 1
+quun simpl transfer 1
+quun solut 1
+quun solut uniqu 1
+quun sous 3
+quun sous ensembl 1
+quun sous espac 1
+quun sous top 1
+quun tel 1
+quun tel probl 1
+quun tel repr 1
+quun temp 1
+quun temp glob 1
+quun term 1
+quun term instanc 1
+quun tr 1
+quun tr nag 1
+quun traduc 1
+quun traduc de 1
+quun trait 1
+quun trait compl 1
+quun transform 2
+quun transform de 2
+quun transit 1
+quun transit appart 1
+quun unit 1
+quun var 1
+quun var perman 1
+quun var peut 1
+quun vu 1
+quun vu de 1
+quun zon 1
+quun zon comport 1
+quunif 1
+quunif un term 1
+quutil 1
+quutil dan 1
+quutil dan certain 1
+quutil e dan 1
+qw 1
+qwf 1
+qwf qrg 1
+qwf qrg qwg 1
+qwf qwg 1
+qwg 1
+qx 2
+qx c chunk 1
+qx qy 1
+qx x2 1
+qy 1
+qy d prec 1
+qy qu 1
+qy qu sid 1
+qy wil retrief 1
+r.a 4
+r.c 1
+r.c.t 2
+r.de 1
+r.e 2
+r.e.lord 1
+r.g 3
+r.h 1
+r.i 1
+r.l 5
+r.m 3
+r.o 1
+r.p 4
+r.r 1
+r.racl 1
+r.rnam 1
+r.rnam and r.rp 1
+r.rp 1
+r.rp refer 1
+r.s 1
+r.so 1
+r.so and j.gu 1
+r.t 3
+r.w 2
+r0 14
+r0 al occur 1
+r0 and r1 1
+r0 and se 1
+r0 ar ch 1
+r0 correspon 1
+r0 env 1
+r0 env la 1
+r0 env un 1
+r0 est 1
+r0 est le 1
+r0 ex 1
+r0 ex ecut 1
+r0 fr 1
+r0 in unquantif 1
+r0 is sent 1
+r0 modif 1
+r0 modif le 1
+r0 q rt0 1
+r0 r1 1
+r0 r1 r2 1
+r0 sont 1
+r0 sont ecrit 1
+r0 that repr 1
+r0 var 1
+r0 var donc 1
+r0 with r0 1
+r00 2
+r01 2
+r01 r00 1
+r02 2
+r02 r01 1
+r02 r01 r00 1
+r02 r03 1
+r03 2
+r03 r02 1
+r03 r02 r01 1
+r04 2
+r04 and racc 1
+r04 r03 1
+r04 r03 r02 1
+r0i 2
+r0n 2
+r0r0r0 1
+r0r0r0 p0 1
+r0r0r0 p0 p3 1
+r0r1 1
+r0r1 p2 1
+r0r1 p2 p1 1
+r0s 1
+r0s eventu 1
+r0s eventu termin 1
+r0s is infinit 1
+r1 25
+r1 acc 1
+r1 acc edent 1
+r1 and commut 1
+r1 and r0 1
+r1 and r2 5
+r1 and s1 1
+r1 arg1 1
+r1 arg1 r2 1
+r1 can introduc 1
+r1 correspon 1
+r1 e0 1
+r1 e00 1
+r1 effectu 1
+r1 env 1
+r1 env un 1
+r1 et perd 1
+r1 et r2 1
+r1 et r3 1
+r1 g0 1
+r1 g0 g2 1
+r1 g01 1
+r1 g01 b1 1
+r1 giv 1
+r1 hc1 1
+r1 is actu 1
+r1 is conflu 1
+r1 is layer 1
+r1 le 1
+r1 nf 1
+r1 now read 1
+r1 oev 1
+r1 p1 1
+r1 p1 p2 1
+r1 r1 1
+r1 r2 4
+r1 r2 r3 1
+r1 red 1
+r1 rl 1
+r1 s1 1
+r1 s1 system11 1
+r1 s1n 1
+r1 s2 1
+r1 s2 system12 1
+r1 specif 1
+r1 sr2 1
+r1 sur 1
+r1 sur el 1
+r1 t0 1
+r1 t00 1
+r1 to homonym 1
+r1 u1 1
+r1 u3 1
+r1 v0 1
+r1 v00 1
+r1 ver 1
+r1 ver r2 1
+r1 ver r3 1
+r10 1
+r100.5 1
+r100.5 r200.5 1
+r100.5 r200.5 r300.5 1
+r10000 1
+r10000 195mhz 1
+r11 1
+r11 r12 1
+r12 1
+r12rd 1
+r12rd i1 1
+r1g 1
+r1i 1
+r1n 1
+r1r0r1 1
+r1r1r0 1
+r1r1r0 p3 1
+r1r1r0r0r1 1
+r1r1r0r0r1 p1 1
+r1r1r0r0r1 p1 p2 1
+r1r2r3r41oe2 1
+r2 22
+r2 2r 1
+r2 al hap 1
+r2 ar correct 1
+r2 ar orthogon 1
+r2 ar solut 1
+r2 be correct 1
+r2 be giv 1
+r2 begin 1
+r2 begin r3 1
+r2 commut 1
+r2 de 1
+r2 de ce 1
+r2 diff 1
+r2 diff erent 1
+r2 e0 1
+r2 e00 1
+r2 et lacc 1
+r2 g02 1
+r2 g02 b2 1
+r2 g02 g3 1
+r2 hc2 1
+r2 hold 1
+r2 is correct 1
+r2 is flat 1
+r2 is layer 1
+r2 nf 1
+r2 oeu 1
+r2 r1 1
+r2 r3 1
+r2 r3 r4 1
+r2 red 1
+r2 rl 1
+r2 s1 1
+r2 s1 system21 1
+r2 s2 1
+r2 s2 system22 1
+r2 t0 1
+r2 t00 1
+r2 tw disjoint 1
+r2 u0 1
+r2 un t0 1
+r2 v0 1
+r2 v00 1
+r2 ver 1
+r2 ver r3 1
+r2 yield 1
+r2 yield commut 1
+r200.5 1
+r200.5 r300.5 1
+r200.5 r300.5 r400.5 1
+r2i 1
+r2j 1
+r2r 1
+r2r1n 1
+r2rn 1
+r2rs 1
+r3 11
+r3 as follow 1
+r3 belong 1
+r3 et la 1
+r3 et lacc 1
+r3 in a3 1
+r3 ne 1
+r3 ne fait 1
+r3 r4 1
+r3 r4 r04 1
+r3 system33 1
+r3 to schem 1
+r3 wa design 1
+r300.5 1
+r300.5 r400.5 1
+r300.5 r400.5 r500.5 1
+r3000 2
+r3000 proc 2
+r3schemeschem 1
+r4 5
+r4 of rl 1
+r4 r04 1
+r4 r04 r03 1
+r4 th pair 1
+r4 to us 1
+r400.5 1
+r400.5 r500.5 1
+r4400 2
+r4400 proc 2
+r4400 proc run 1
+r4r 1
+r5 1
+r500.5 1
+r80 1
+r90005 1
+r93 1
+r94 1
+r95 1
+r96 1
+ra 29
+ra a fundam 1
+ra a number 1
+ra an error 1
+ra an interest 1
+ra and answer 1
+ra and lower 1
+ra futher 1
+ra futher issu 1
+ra in sect 1
+ra interest 1
+ra is describ 1
+ra leid 1
+ra new issu 1
+ra parallel 1
+ra port 1
+ra port issu 1
+ra prov 1
+ra prov high 1
+ra rb 1
+ra som interest 1
+ra system 1
+ra th issu 3
+ra th quest 3
+ra us 1
+ra1 1
+raab 1
+rabain 1
+rabbit 1
+rabit 1
+rabl 1
+rabl larg 1
+rabl larg dappl 1
+rabl qu 1
+rabl qu ne 1
+rac 3
+rac affect 1
+rac car 1
+racc 1
+racc satisf 1
+raccourc 1
+raccourc de 1
+raccourc de ch 1
+raccourcir 1
+raccourcir le 1
+raccourcir le ch 1
+raccourcir leur 1
+raccourcir leur dur 1
+raccourcit 1
+raccourcit aus 1
+raccourcit aus le 1
+raccourcit le 1
+raccourcit le ch 1
+racetrack 1
+racetrack aficionad 1
+rachid 1
+rachid dssoul 1
+racin 1
+racin de 1
+racin de la 1
+racin de larbr 1
+racin et about 1
+racin un 1
+racl 1
+rad 18
+rad approach 2
+rad chang 1
+rad character 1
+rad lik 8x4 1
+rad m not 1
+rad ma 1
+rad n posit 1
+rad new funct 1
+rad sort 1
+rad sort algorithm 1
+rad sort requir 1
+rad th ep 1
+rad therap 1
+rad therap plan 1
+rad valiv 1
+radar 1
+radar targ 1
+radar targ imag 1
+radc 1
+radig 1
+radioact 1
+radiograph 1
+radius 2
+radj 1
+radon 1
+radon nikodym 1
+radon nikodym deriv 1
+radrddibir 1
+radrddibir 1racregister 1
+radrddibir 1racregister filealu 1
+raefsk 1
+raf 1
+raf ahm 1
+raf ahm tempor 1
+raffin 2
+raffin de 2
+raffin de ce 1
+raffin de la 2
+raffin de lalgorithm 1
+raffin ee 1
+raffin qu 1
+raffin qu nous 1
+rafr 1
+rafr ch 1
+raghavachar 1
+raghavachar show 1
+raghavan 1
+raghavendr 2
+raghu 1
+raghu ramakrishnan 1
+raghunath 3
+raghunath and abhiram 2
+rah92 1
+rahedr 1
+rahedr shar 1
+rahm 1
+raid 2
+raid liter 1
+railroad 1
+railroad compan 1
+railroad compan defin 1
+rain 1
+rain de 1
+rain de mach 1
+rair 2
+rair mod 1
+rair mod el 1
+rair recherch 1
+rair recherch op 1
+raison 4
+raison alg 1
+raison alg ebriqu 1
+raison appliqu 1
+raison d equilibr 1
+raison d etr 1
+raison de 4
+raison de ce 1
+raison de faux 1
+raison de laisser 1
+raison de limport 1
+raison de ne 1
+raison de penser 1
+raison de sauvegarder 1
+raison de simplicit 1
+raison de vouloir 1
+raison defficacit 1
+raison didactiqu 1
+raison du 1
+raison du transfer 1
+raison en 2
+raison en est 2
+raison equationnel 1
+raison equationnel imp 1
+raison equationnel soit 1
+raison est 2
+raison est la 1
+raison est le 1
+raison est qu 1
+raison est quel 1
+raison fondam 1
+raison fondam condu 1
+raison le 1
+raison le vecteur 1
+raison particl 1
+raison particl er 1
+raison pour 1
+raison pour laquel 1
+raison qu 3
+raison qu justif 1
+raison qu nous 1
+raison qu pour 1
+raison suiv 1
+raison tient 1
+raison tient pour 1
+raisonnabl 1
+raisonner 1
+raisonner en 1
+raisonner en term 1
+raisonner sur 1
+raisonner sur ce 1
+raj 1
+rajasekaran 1
+rajeev 1
+rajeev sivaram 1
+rajeev sivaram dhabaleswar 1
+rajopadh 1
+rajout 1
+rajout un dern 1
+rajouter 1
+rajouter de 1
+rajouter de register 1
+raju 2
+raju panwar 1
+rakesh 1
+rakesh agraw 1
+ral 3
+ral de 1
+ral de la 1
+ral direct 1
+ral direct est 1
+ral dufour 2
+ral dufour ch 1
+ral est 1
+ral le 1
+ral le probl 1
+ral pa 1
+ral possibl 1
+ral possibl de 1
+ral pour 1
+ral pour obtenir 1
+ralent 2
+ralent la 1
+ralent la gest 1
+ralent par 2
+ralent par de 1
+ralent par la 1
+ralent pour 1
+ralent pour aut 1
+ralentir 2
+ralentir le 2
+ralentir le calcl 1
+ralentir le pa 1
+ralentir le program 1
+ralentit 1
+ralentit leur 1
+ralentit leur gest 1
+ralisabl 1
+raliser 1
+raliser bon 1
+raliser bon nombr 1
+raliser ensuit 1
+raliser ensuit ce 1
+ralison 1
+ralison alor 1
+ralison alor dautr 1
+rallong 1
+rallong dun 1
+rallong dun pa 1
+rallonger 1
+rallonger le 1
+rallonger le ch 1
+ralph 2
+ralph mcg 1
+ram 9
+ram caus 1
+ram caus de 1
+ram chellap 1
+ram chellap docum 1
+ram cod 1
+ram cox 1
+ram cox cc.gatech.edu 1
+ram e au 1
+ram ee 1
+ram en 1
+ram en au 1
+ram enforc 1
+ram in tim 1
+ram instead 1
+ram is transform 1
+ram model 1
+ram pi 1
+ram read 1
+ram read port 1
+ram that constitut 1
+ram to match 1
+ram writ 1
+ram writ port 1
+ramach 1
+ramachandran 2
+ramag 1
+ramag cc.gatech.edu 1
+ramakrishnan 2
+ramakrishnan and ter 1
+ramakrishnan srik 1
+ramamoorth 1
+ramamritham 1
+ramamurth 1
+ramanujam 1
+ramchandran 1
+ramenait 1
+ramenait a de 1
+ramener 2
+ramener a de 1
+ramener a un 1
+ramener l equ 1
+rameter 1
+ramez 1
+ramez elmasr 1
+ramif 2
+ramif ar pr 1
+ramif of construc 1
+ramkumar 2
+rammaohanar 1
+ran 12
+ran 2cl 1
+ran a cod 1
+ran al avail 1
+ran dejavu1 1
+ran dejavu2 1
+ran faster 1
+ran our an 1
+ran our cod 1
+ran sever experim 1
+ran th benchmark 1
+ran th experim 1
+ran th siml 1
+ranad 4
+ranc 1
+ranc au 1
+ranc au sen 1
+ranc conditionnel 1
+ranc de 1
+ranc de fr 1
+ranc dun 1
+ranc dun fonct 1
+ranc math 1
+ranc math matiqu 1
+rand 3
+rand axon.cs.byu.edu 1
+rand pollack 1
+rand wilson 1
+rand wilson ton 1
+rand5 1
+rand5 and failur 1
+randel 1
+randel et al 1
+random 45
+random 3cnf 1
+random 3cnf forml 1
+random acc 4
+random acc mach 1
+random acc secon 1
+random accord 1
+random act 1
+random algorithm 3
+random algorithm describ 1
+random algorithm simil 1
+random alloc 2
+random and ambigu 1
+random and geometer 1
+random and indep 1
+random and structur 1
+random approach 1
+random assignm 1
+random bimod 1
+random bimod traff 1
+random bit 1
+random bit vect 1
+random by le 1
+random by shuffl 1
+random ch 5
+random ch interconnect 1
+random ch pair 1
+random ch point 1
+random ch suit 1
+random cnf 1
+random cnf forml 1
+random color 1
+random color distribut 1
+random compl 1
+random conserv 1
+random conserv inequ 1
+random crossover 1
+random crossover oper 1
+random dag 1
+random dag gener 1
+random dat 1
+random decluster 1
+random decluster coupl 1
+random decluster method 1
+random def 1
+random def dat 1
+random determin 1
+random determin receiver 1
+random determin sender 1
+random df 1
+random distribut 3
+random dupl 1
+random fact 1
+random featur 1
+random finit 1
+random finit autom 1
+random forml 1
+random forml report 1
+random funct 1
+random gener 4
+random gener forml 1
+random gener task 1
+random graph 1
+random graph ad 1
+random graph gener 1
+random graph gn 1
+random hyperplan 1
+random hyperplan div 1
+random in intern 1
+random in loc 1
+random in ph 1
+random init 2
+random init min 1
+random input 2
+random inst 1
+random inver 1
+random is typ 1
+random kc 1
+random kc dat 1
+random map 1
+random match 2
+random match describ 1
+random maxim 1
+random maxim match 1
+random mult 1
+random mult interconnect 1
+random multicast 1
+random mut 3
+random mut hil 1
+random mut parent 1
+random no 1
+random number 6
+random number gener 4
+random order 4
+random overhead 1
+random parallel 2
+random parallel algorithm 1
+random parallel select 1
+random partit 2
+random partit proc 1
+random pattern 2
+random pattern appear 1
+random pe 1
+random permut 2
+random pick 1
+random plac 1
+random plac dat 1
+random popl 1
+random prior 1
+random prior queu 1
+random problem 1
+random put 1
+random real valu 1
+random remov 1
+random remov inst 1
+random rout 1
+random sampl 3
+random sampl sort 1
+random scrambl 1
+random sect 1
+random select 8
+random select assignm 1
+random select lp 1
+random select parameter 1
+random select pe 1
+random select sampl 1
+random self 1
+random self modif 1
+random sequ 1
+random shap 1
+random sign 1
+random siz 1
+random sort 1
+random sort algorithm 1
+random string 1
+random string gener 1
+random synchron 1
+random synchron parallel 1
+random techniqu 1
+random test 1
+random through distribut 1
+random tim 1
+random to ch 1
+random traff 1
+random traff requir 1
+random transm 1
+random transm pack 1
+random unicast 1
+random unicast me 1
+random valu 2
+random var 4
+random variabl 4
+random ver 1
+random word 1
+random word sequ 1
+random xor 1
+random xor mask 1
+random.wustl.edu 1
+random100 1
+randx 1
+randx which drop 1
+rang 73
+rang and ad 1
+rang and int 1
+rang and siz 1
+rang ar retrief 1
+rang as 1
+rang as technolog 1
+rang aus 1
+rang aus un 1
+rang camer 1
+rang camer using 1
+rang control 1
+rang dan 1
+rang dan le 1
+rang dat 1
+rang e dan 1
+rang e sur 1
+rang ee 2
+rang ee au 1
+rang ee dan 1
+rang ee en 1
+rang ee le 1
+rang ee par 1
+rang en 1
+rang from e1 1
+rang from intel 1
+rang from molecl 1
+rang from peopl 1
+rang from pm 1
+rang from poor 1
+rang from tabl 1
+rang from ten 1
+rang from workst 1
+rang halt 1
+rang in siz 2
+rang lim 1
+rang map 1
+rang of appl 2
+rang of approxim 1
+rang of architectur 1
+rang of avail 1
+rang of caus 1
+rang of character 1
+rang of comput 1
+rang of computer 1
+rang of context 1
+rang of destin 1
+rang of edg 1
+rang of educ 1
+rang of exper 1
+rang of fair 1
+rang of gener 1
+rang of graph 1
+rang of larger 1
+rang of link 1
+rang of matr 1
+rang of multicast 2
+rang of object 1
+rang of observ 1
+rang of oe 1
+rang of oper 1
+rang of parameter 2
+rang of platform 1
+rang of sal 1
+rang of secur 1
+rang of shift 1
+rang of situ 1
+rang of succ 1
+rang of sv 1
+rang of traff 1
+rang of valu 3
+rang of var 1
+rang of virtu 1
+rang of vol 1
+rang of web 1
+rang opt 1
+rang or standard 1
+rang or term 1
+rang ou 1
+rang ou dautr 1
+rang over domain 1
+rang over ext 1
+rang over non 1
+rang par 1
+rang par colon 1
+rang predomin 1
+rang qu 3
+rang qu arriv 1
+rang qu dep 1
+rang qu oper 1
+rang qu problem 1
+rang qu proc 1
+rang qu siz 1
+rang quer 3
+rang reperc 1
+rang search 1
+rang sen 1
+rang siz 1
+rang tim 1
+rang tim rang 1
+rang to lead 1
+rang typ 1
+rang with color 1
+rangequ 1
+rangequ oper 1
+rangequ oper show 1
+rangequ problem 1
+ranger 2
+ranger dan 1
+ranger direct 1
+ranger direct lattribut 1
+ranger larit 1
+ranger linform 1
+ranger linform de 1
+ranger of calcl 1
+rank 12
+rank and dim 1
+rank ba 1
+rank ba select 1
+rank differ 1
+rank filter 1
+rank jq 1
+rank lexicograph 1
+rank of simil 1
+rank of string 1
+rank of templ 1
+rank qj 1
+rank test 1
+rank th fac 1
+rank th sampl 1
+rank wa specif 1
+rank xerox 1
+rank xerox franc 1
+ranneb 1
+ranst 1
+ranst dur red 1
+ranst is empt 1
+ranst transact 1
+ranst transact tabl 1
+rant 2
+rant la 1
+rant la localit 1
+rant qu 1
+rant qu ce 1
+raoult 1
+rap 4
+rap com 1
+rap com le 1
+rap dan 1
+rap dan le 1
+rap en 2
+rap en pr 1
+rap et perm 1
+rap le 1
+rap le voisin 1
+rap pour 1
+rap pour quil 1
+rap qu 1
+rap qu le 1
+rap qu pp 1
+rap si 1
+rap si le 1
+rap un 1
+rap un don 1
+rapid 23
+rapid a de 1
+rapid abord 1
+rapid abord ee 1
+rapid acc 1
+rapid afin 1
+rapid afin de 1
+rapid and inexp 1
+rapid and occur 1
+rapid chang 2
+rapid chang pack 2
+rapid composit 1
+rapid destr 1
+rapid developm 4
+rapid en 1
+rapid en revu 1
+rapid et le 1
+rapid for larger 1
+rapid implem 1
+rapid in parallel 1
+rapid lim 1
+rapid overtak 1
+rapid plus perform 1
+rapid po de 1
+rapid prototyp 1
+rapid qu 1
+rapid rat 1
+rapid speed 1
+rapid string 1
+rapid string comparison 1
+rapid using 1
+rapid ver 1
+rapid ver le 1
+rapidit 2
+rappel 2
+rappel de 1
+rappel en 1
+rappel en eff 1
+rappel le 1
+rappel le ca 1
+rappel qu 1
+rappel qu dan 1
+rappel qu la 1
+rappel quun 1
+rappel quun transform 1
+rappel sur 1
+rappel sur le 1
+rappel un corollair 1
+rappeler 1
+rappeler certain 1
+rappelon 4
+rappelon br 1
+rappelon br ev 1
+rappelon dabord 1
+rappelon dabord quelqu 1
+rappelon le 2
+rappelon le princip 1
+rappelon limport 1
+rappelon limport de 1
+rappelon qu 2
+rappelon qu ce 2
+rappelon simpl 1
+rappelon simpl qu 1
+rapport 9
+rapport a ce 1
+rapport a dautr 1
+rapport a de 1
+rapport a la 2
+rapport a lautr 1
+rapport a loptim 1
+rapport a un 1
+rapport au 2
+rapport au cod 1
+rapport au nombr 1
+rapport au pav 1
+rapport aux 2
+rapport aux born 1
+rapport aux cod 1
+rapport conv 1
+rapport conv esprit 1
+rapport de 8
+rapport de de 2
+rapport de gudeman 1
+rapport de recherch 6
+rapport du 1
+rapport du fit 1
+rapport entr 1
+rapport entr var 1
+rapport originel 1
+rapport originel sur 1
+rapport sur 1
+rapport sur tr 1
+rapport techniqu 2
+rapport techniqu ee 1
+rapport techniqu rc11506 1
+rapport techniqu rc11552 1
+rapport techniqu tr 1
+rapporteur 2
+rapporteur alain 1
+rapporteur alain lichnewsk 1
+rapporteur bart 1
+rapporteur bart dem 1
+rapporteur de 1
+rapporteur de ce 1
+rapporteur m 1
+rapporteur m corin 1
+rapproch 2
+rapproch aut 1
+rapproch aut qu 1
+rapproch de 1
+rapproch de ce 1
+rapproch plus profon 1
+rar 17
+rar atteint 1
+rar be requir 1
+rar ca 1
+rar dan 2
+rar dan la 1
+rar dan le 1
+rar donc 1
+rar donc difficil 1
+rar e de 1
+rar e voir 1
+rar effect 1
+rar et donc 1
+rar event 2
+rar exceed 2
+rar remain 1
+rar remain stat 1
+rar voir 1
+rar voir inec 1
+rar work 1
+raref 1
+raref fluid 1
+raref fluid flow 1
+rashid 1
+rasmol 1
+rasmus 3
+raster 2
+raster graph 1
+raster techniqu 1
+rat 65
+rat act1 1
+rat ae 1
+rat ae1 1
+rat ae1 ae2 1
+rat algorithm 1
+rat alloc 1
+rat alw tak 1
+rat and comput 1
+rat and retrain 1
+rat approxim 1
+rat ar approach 1
+rat ar bound 1
+rat ar giv 1
+rat ar inclus 1
+rat ar rel 1
+rat as 1flop 2
+rat assign 1
+rat at subst 1
+rat at tim 1
+rat atomiqu 1
+rat avg 1
+rat ba 2
+rat ba mechan 1
+rat ba serv 1
+rat behind integr 1
+rat between accept 1
+rat between rmsp 1
+rat caus 1
+rat chang 1
+rat chirurg 1
+rat chirurg ou 1
+rat coeff 1
+rat compar 1
+rat comparison 1
+rat configur 1
+rat control 1
+rat control server 1
+rat cut 1
+rat cut partit 1
+rat de 2
+rat de ba 1
+rat de vraisembl 1
+rat decr 2
+rat degrad 1
+rat distort 1
+rat distort funct 1
+rat distort sen 1
+rat earl 1
+rat equ 1
+rat exhibit 1
+rat ff 1
+rat ff qu 1
+rat filter 1
+rat filter bank 1
+rat for gu 1
+rat for mp3d 1
+rat for multipl 1
+rat for random 1
+rat funct 1
+rat gener 1
+rat greater 1
+rat grow 1
+rat grow proport 1
+rat ha incr 1
+rat imag 1
+rat imag compr 1
+rat imp 1
+rat in futur 2
+rat in stead 1
+rat in term 1
+rat interpr 1
+rat is const 1
+rat is incr 1
+rat is indep 1
+rat is slow 1
+rat is wor 1
+rat me 1
+rat me sent 1
+rat multiplec 1
+rat multiplec fact 1
+rat nnzosl 1
+rat nnzosl nnzwgp 1
+rat number 2
+rat oe 1
+rat of 1oe 1
+rat of 2cl 1
+rat of ae 1
+rat of augm 1
+rat of brow 1
+rat of chain 1
+rat of claus 1
+rat of commun 1
+rat of converg 1
+rat of dat 1
+rat of entrop 1
+rat of failur 1
+rat of grad 1
+rat of growth 1
+rat of incr 1
+rat of inject 1
+rat of maxim 1
+rat of me 1
+rat of occur 2
+rat of pack 1
+rat of progr 1
+rat of queen 1
+rat of se 1
+rat of serv 1
+rat offer 1
+rat on network 2
+rat on program 1
+rat or measur 1
+rat or reintegr 1
+rat or transit 1
+rat or unit 1
+rat order 1
+rat particl 1
+rat particl re 1
+rat per 1
+rat point 1
+rat polyhedr 2
+rat polyhedr qp 1
+rat postl 1
+rat pour 1
+rat pour traiter 1
+rat proport 1
+rat proport scheduler 1
+rat proport server 1
+rat reach 1
+rat requir 1
+rat row 1
+rat server 1
+rat show 1
+rat si 1
+rat si dautr 1
+rat statistiqu 1
+rat stud 1
+rat tcoh 1
+rat tcoh t3t4 1
+rat term 1
+rat term2 1
+rat th init 1
+rat that allow 1
+rat tlayout 1
+rat tlayout t2t3 1
+rat to individu 1
+rat tosl 1
+rat tosl twgp 1
+rat traff 1
+rat upon div 1
+rat util 1
+rat util es 1
+rat var 1
+rat var accord 1
+rat variabl 1
+rat variabl occur 1
+rat vs 1
+rat wa an 1
+rat wa decr 1
+rat wa observ 1
+rat weight 1
+rat wer suggest 1
+rat whil requir 1
+rat wil continu 1
+rat with connect 1
+ratcliff 1
+rateproport 1
+rateproport server 1
+rateur 1
+rateur al 1
+rateur al atoir 1
+rateur inonit 1
+rateur inonit simaux 1
+ratingt 1
+ratingu 1
+ratingv 1
+ratingv from assr 1
+ratingv from assttl 1
+ratingv ssn 1
+rationnel 2
+rationnel convec 1
+rationnel convec don 1
+rationnel d ecrit 1
+rationnel de 1
+rationnel de lalgorithm 1
+rationnel du 1
+rationnel du syst 1
+rationnel est 1
+rationnel est tr 1
+rationnel et de 1
+rationnel et le 1
+rationnel non 1
+rationnel non singl 1
+rationnel p sur 1
+rattach 1
+rattach a la 1
+rau 1
+rau chaplin 1
+rau chaplin rad 1
+raumfahrtkonstrukt 1
+raumfahrtkonstrukt der 1
+raumfahrtkonstrukt der universit 1
+raux 1
+rav 5
+rav and rreq 1
+rav andrew.cmu.edu 1
+rav andrew.cmu.edu gradu 1
+rav rav 1
+rav rav andrew.cmu.edu 1
+rav system 1
+rav vipin 1
+rav vipin kumar 1
+ravikumar 1
+ravishankar 1
+raw 7
+raw cost 1
+raw execut 1
+raw execut perform 1
+raw execut tim 1
+raw imag 2
+raw imag dat 1
+raw link 1
+raw link cost 1
+raw perform 1
+raw perform dat 1
+raw power 1
+raw vot 1
+raw vot scor 1
+ray 6
+ray cast 1
+ray cast occur 1
+ray cast step 1
+ray is cast 1
+ray project 1
+ray solomonoff 1
+ray strong 2
+ray wil pierc 1
+raymon 2
+raymon lor 1
+rayon 1
+rayshad 1
+rayshad environm 1
+razor 1
+razor which separ 1
+rb 5
+rb gs 1
+rb gs gb 1
+rbwk91 1
+rc 8
+rc in hardwar 1
+rc in softwar 1
+rc is ensur 1
+rc no 1
+rc no spot 1
+rc plan 1
+rc reason 1
+rc reason chain 1
+rc sp 1
+rc sp ef 1
+rc to perform 1
+rc11506 1
+rc11552 1
+rc16431 1
+rc16606 1
+rc18139 1
+rcc 1
+rcc axiom 1
+rcc axiom prov 1
+rcc calculus 1
+rcc form 1
+rcc rel 1
+rcc spat 1
+rcc spat log 1
+rcc system 1
+rcc theor 1
+rcc theor contain 1
+rcc theor ensur 1
+rch0110 1
+rcm 1
+rcmac 1
+rconfigur 1
+rconfigur is project 1
+rcr 1
+rd 2
+rd begin 1
+rd dat 1
+rd dat block 1
+rdec 1
+rdp 1
+re 43
+re a cop 1
+re a desir 1
+re al permut 1
+re ar clear 1
+re ar using 1
+re as part 1
+re ba 1
+re being transform 1
+re by complec 1
+re by pl 1
+re certain desir 1
+re concern 1
+re concern la 1
+re dan 1
+re dan lalgorithm 1
+re de 1
+re de match 1
+re de rec 1
+re et certain 1
+re et le 1
+re fact 1
+re forc 1
+re forc brakep 1
+re forc gradf 1
+re forc rollf 1
+re hi oper 1
+re ic 1
+re ic sont 1
+re is compl 1
+re it cop 1
+re lastnod 1
+re low 1
+re low complec 1
+re mutu 1
+re mutu exclus 1
+re of system 1
+re on backtrack 1
+re se 1
+re se vouch 1
+re sem 1
+re sem orient 1
+re softwar 1
+re softwar degrad 1
+re sont 1
+re sont identioabl 1
+re system 1
+re th ba 1
+re th buffer 1
+re th div 1
+re th fin 1
+re th goal 2
+re th lock 1
+re th minim 1
+re th model 1
+re th particip 1
+re th permut 1
+re that nod 1
+re to zer 1
+re valu 1
+re without viol 1
+re. 5
+reacc 1
+reacc would remain 1
+reach 66
+reach a const 1
+reach a cpn 1
+reach a crit 2
+reach a desir 1
+reach a detect 1
+reach a fin 1
+reach a fragm 1
+reach a giv 2
+reach a high 1
+reach a leaf 2
+reach a level 1
+reach a nod 2
+reach a pair 1
+reach a particl 2
+reach a point 1
+reach a posit 1
+reach a proc 1
+reach a se 1
+reach a sit 1
+reach a st 4
+reach a stag 1
+reach a start 1
+reach a succ 1
+reach a ver 1
+reach addit 1
+reach addit modif 1
+reach agr 1
+reach al network 2
+reach al nod 1
+reach and connect 1
+reach and output 1
+reach by using 1
+reach cal 1
+reach cal nod 1
+reach comput 1
+reach ea 1
+reach empl 1
+reach en 1
+reach f9 1
+reach from init 1
+reach from q0 1
+reach hor 1
+reach hor conclus 1
+reach inform 1
+reach inform assoc 1
+reach it conclus 1
+reach it dest 2
+reach it stead 1
+reach level 1
+reach log 1
+reach log record 1
+reach modif 1
+reach modif acc 1
+reach n log 1
+reach nod 2
+reach nod cal 1
+reach p3 1
+reach pur 1
+reach pur cod 1
+reach s1 1
+reach s5 1
+reach simultan 1
+reach siz 1
+reach som level 1
+reach som rn 1
+reach som stat 1
+reach string 1
+reach string assoc 1
+reach switch 1
+reach switch vk 1
+reach th bar 1
+reach th bound 1
+reach th cal 1
+reach th client 1
+reach th desir 2
+reach th dest 1
+reach th eff 1
+reach th empl 1
+reach th empt 1
+reach th en 2
+reach th exit 1
+reach th hist 1
+reach th learn 1
+reach th maxim 1
+reach th minim 1
+reach th modif 1
+reach th nod 2
+reach th point 2
+reach th pot 1
+reach th procedur 1
+reach th root 3
+reach th sender 1
+reach th stack 1
+reach th stat 1
+reach th targ 1
+reach th tim 1
+reach th valu 2
+reach that label 1
+reach that point 1
+reach their dest 1
+reach their destin 1
+reach their posit 1
+reach their retir 1
+reach tw neighbor 1
+reach using 1
+reach using funct 1
+reach wh 1
+reach which edg 1
+reach zer 2
+react 11
+react appl 1
+react behaviour 1
+react environm 1
+react of train 1
+react program 1
+react system 3
+react to fault 1
+react to pixel 1
+reactiv 2
+reactiv for try 1
+read 74
+read a fil 2
+read a phy 1
+read a rep 1
+read a st 1
+read a structur 1
+read a valu 1
+read aa 1
+read aa ref 1
+read acc 3
+read al ch 1
+read al claus 1
+read al occur 1
+read algorithm 1
+read allow 1
+read alw occur 1
+read an individu 1
+read and bulk 1
+read and con 1
+read and cop 1
+read and freed 1
+read and i0 1
+read and incr 1
+read and output 1
+read and qw 1
+read and restart 1
+read and schedl 1
+read and st 1
+read and writ 10
+read any fil 1
+read any register 1
+read any valu 1
+read anyw 1
+read appl 1
+read ar correct 1
+read ar gener 1
+read ar uncommon 1
+read as count 1
+read as pseudocod 1
+read avail 3
+read avail inclus 1
+read avail langu 1
+read bank 1
+read bank check 1
+read block 1
+read buffer 1
+read by eulisp 1
+read by human 1
+read by oper 1
+read by other 1
+read can occur 1
+read cel 2
+read cel cont 1
+read cel st 1
+read chang 1
+read char 1
+read chunk 1
+read cp 1
+read cycl 1
+read dat 1
+read detect 1
+read dur pa 1
+read each oper 1
+read elseif 1
+read elseif cp 1
+read ext 1
+read fault 1
+read flit 1
+read for lin 1
+read for ocr 1
+read from ith 1
+read from kth 1
+read from secon 1
+read from xw 1
+read ha return 1
+read identif 1
+read if output 1
+read in model 1
+read in order 2
+read in uncertain 1
+read incorpor 1
+read int intern 1
+read intern 1
+read intern nod 1
+read is st 1
+read lock 1
+read ma 2
+read mad 1
+read mad solut 1
+read massachus 1
+read me 1
+read mi 1
+read mod 1
+read nod 2
+read nod desir 1
+read occur 1
+read onl acc 1
+read onl cop 1
+read onl input 1
+read onl shar 1
+read oper 7
+read oper read 1
+read oper work 1
+read operand 1
+read or concur 1
+read or execut 1
+read or writ 6
+read our descript 1
+read pag 1
+read pag rel 1
+read per memoryload 1
+read ph 1
+read port 1
+read prolog 1
+read prolog program 1
+read readm 1
+read readm fil 1
+read record 1
+read record back 1
+read record correspon 1
+read record for 1
+read return 1
+read sect 1
+read sever tim 1
+read shar 1
+read shar pag 1
+read sign 1
+read sign output 1
+read sj 1
+read start 1
+read stat 1
+read suggest 1
+read suggest univer 1
+read support 1
+read support red 1
+read support und 1
+read tak 1
+read tak plac 1
+read targ 1
+read term 1
+read text 1
+read th algorithm 1
+read th block 1
+read th chunk 1
+read th com 1
+read th correspon 2
+read th dat 1
+read th draft 1
+read th entir 1
+read th graph 1
+read th loc 1
+read th log 1
+read th old 1
+read th oper 1
+read th output 1
+read th pack 1
+read th proper 1
+read th record 1
+read th rl 1
+read th sect 1
+read th stat 1
+read th valu 1
+read then cp 1
+read tim 1
+read to accept 2
+read to describ 1
+read to execut 1
+read to interact 1
+read to introduc 1
+read to mov 1
+read writ 7
+read writ ca 1
+read writ entir 1
+read writ fault 1
+read writ head 1
+read writ oper 1
+read writ synchron 1
+read xi 1
+read.ac.uk 1
+read1 1
+reader 36
+reader a writer 1
+reader and comput 1
+reader and ensur 1
+reader and nl 1
+reader and writer 2
+reader ar refer 1
+reader ar request 1
+reader can find 1
+reader can inadver 1
+reader can reason 1
+reader can verif 1
+reader cl 1
+reader cl sd 1
+reader conv 1
+reader conv figur 1
+reader funct 1
+reader identif 1
+reader in implem 1
+reader is famil 1
+reader is gener 1
+reader is refer 2
+reader may find 1
+reader may skip 1
+reader method 1
+reader method invoc 1
+reader must not 1
+reader nl 1
+reader nl writersbecomerichard 1
+reader onl rudim 1
+reader or writer 1
+reader register 1
+reader should not 1
+reader slot 1
+reader slot descript 1
+reader to endow 1
+reader to judg 1
+reader to verif 1
+reader to zhang 1
+reader understand 1
+reader using 1
+reader using cl 1
+reader using slot 1
+reader wil not 2
+reader wil se 2
+reader writer 3
+reader writer initarg 1
+reader writer method 1
+readloc 1
+readloc firstc 1
+readloc firstp 1
+readm 1
+readm fil 1
+readm fil assoc 1
+reaeect 1
+real 52
+real a glob 1
+real a nearest 1
+real a vid 1
+real abstract 1
+real account 1
+real account pract 1
+real against imag 1
+real and eff 1
+real appl 1
+real approach 1
+real assum 1
+real assum allow 1
+real by ba 1
+real by standard 1
+real by using 2
+real ca 1
+real correspon 1
+real demonstr 1
+real developm 1
+real developm situ 1
+real environm 1
+real fash 1
+real fault 1
+real fortran 1
+real fortran program 1
+real gener 1
+real high perform 1
+real implem 2
+real in pract 2
+real in tag 1
+real init 1
+real input 1
+real input siz 1
+real it cal 1
+real larg dag 1
+real mach 1
+real mach model 1
+real manner 1
+real model 1
+real network 1
+real network environm 1
+real object 1
+real object orient 1
+real observ 1
+real of continu 1
+real of for 1
+real of siftdown 1
+real of transact 1
+real of var 1
+real or discr 1
+real pack 1
+real pack con. 1
+real pag 1
+real pag siz 1
+real parallel 1
+real parallel algorithm 1
+real parser 1
+real po 1
+real pram 1
+real pram model 1
+real problem 1
+real prompt 1
+real proper 1
+real protect 1
+real render 2
+real render algorithm 1
+real requir 1
+real restrict 1
+real risk 1
+real se 1
+real test 1
+real test suit 1
+real th behavior 1
+real th perform 1
+real th prom 1
+real tim 1
+real tim parameter 1
+real to perform 1
+real topolog 1
+real tr 1
+real treatm 1
+real tw level 1
+real with addit 1
+real without alter 1
+realencod 1
+realencod parameter 1
+realign 1
+realign th record 1
+realiz 5
+realiz a se 1
+realiz multilevel 1
+realiz multilevel secur 1
+realiz mutu 1
+realiz mutu exclus 1
+realiz simultan 1
+realiz simultan satisf 1
+realiz that bar 1
+realloc 1
+realloc of proc 1
+realm 3
+realm and compon 1
+realm and typ 1
+realm collect 1
+realm collect cl 1
+realm construc 1
+realm decl 1
+realm enumer 1
+realm inherit 1
+realm int 1
+realm int collect 1
+realm interfac 1
+realm is fundam 1
+realm of pen 1
+realm parameter 1
+realm parameter facil 1
+realm parameter imp 1
+realm parameter ver 1
+realm requir 1
+realm requir const 1
+realm s interfac 1
+realm specif 1
+realn 1
+realn id gt 1
+realn id leq 1
+realn id lt 1
+realn id neq 1
+realworld 1
+realworld problem 1
+reap 1
+reap th benefit 1
+reaper 1
+reappear 1
+reappear in maud 1
+reappl 1
+rear 2
+rear view 1
+rearrang 3
+rearrang it ec 1
+rearrang nonblock 1
+rearrang nonblock network 1
+rearrang sequ 1
+rearrang sequ yield 1
+rearrang th el 1
+reasearch 3
+reasearch inc 3
+reason 88
+reason a giv 1
+reason a sort 1
+reason about caus 1
+reason about composit 1
+reason about concur 1
+reason about edg 1
+reason about knowledg 1
+reason about mus 1
+reason about non 1
+reason about oper 1
+reason about part 1
+reason about phy 1
+reason about pr 1
+reason about problem 1
+reason about program 1
+reason about proper 1
+reason about relationship 1
+reason about secur 1
+reason about sl1 1
+reason about spat 1
+reason about specif 1
+reason about stat 1
+reason about tim 1
+reason about transact 1
+reason about typ 1
+reason about upd 1
+reason accur 2
+reason algorithm 1
+reason algorithm parallel 1
+reason altern 1
+reason amount 4
+reason and com 1
+reason and consider 1
+reason and gu 1
+reason and learn 1
+reason and refin 1
+reason approach 3
+reason approxim 1
+reason ar follow 1
+reason assoc 1
+reason assum 1
+reason assum seem 1
+reason ba 2
+reason bandwidth 1
+reason be claim 1
+reason be hop 1
+reason begin 1
+reason begin show 1
+reason ca 1
+reason can contribut 1
+reason ch 1
+reason ch mad 1
+reason ch occur 1
+reason chain 1
+reason compon 1
+reason comput 1
+reason comput cost 1
+reason condit 1
+reason degr 1
+reason disc 1
+reason dur problem 1
+reason eff 2
+reason eff compiler 1
+reason effect 1
+reason enumer 1
+reason environm 1
+reason error 1
+reason expect 1
+reason explain 3
+reason explan 1
+reason explan analog 1
+reason explicit 2
+reason failur 1
+reason fast 1
+reason for addit 1
+reason for ch 2
+reason for constraint 1
+reason for inser 1
+reason for mp3ds 1
+reason for perform 1
+reason for using 1
+reason giv 1
+reason giv ri 1
+reason good 3
+reason good partit 1
+reason high compar 1
+reason high confid 1
+reason hypoth 1
+reason hypoth assum 1
+reason implem 1
+reason in cardiac 1
+reason in geograph 1
+reason in isol 1
+reason is outlin 1
+reason is simil 2
+reason l listexhaust 1
+reason larg input 1
+reason larg valu 1
+reason lead 1
+reason maxim 1
+reason maxim oper 1
+reason method 2
+reason method ba 1
+reason method oper 1
+reason model 1
+reason number 2
+reason object 1
+reason occur 1
+reason of read 1
+reason or problem 1
+reason pay 1
+reason pay divid 1
+reason perform 1
+reason power 1
+reason proc 3
+reason proc cost 1
+reason proc oper 1
+reason proc using 1
+reason program 1
+reason program environm 1
+reason prompt 1
+reason quest 1
+reason respon 1
+reason return 1
+reason rout 1
+reason rout procedur 1
+reason simil 1
+reason simpl 2
+reason simpl techniqu 1
+reason siz 1
+reason spar 1
+reason speedup 1
+reason speedup run 1
+reason st 1
+reason step 1
+reason strateg 1
+reason sub 1
+reason sub monit 1
+reason subject 1
+reason support 1
+reason support specif 1
+reason switch 2
+reason switch del 2
+reason system 1
+reason system record 1
+reason task 1
+reason techniqu 1
+reason techniqu combin 1
+reason th graph 1
+reason th standard 1
+reason th structur 1
+reason that convinc 1
+reason that ec 1
+reason that me 1
+reason that replac 1
+reason to assum 1
+reason to belief 1
+reason to exclus 1
+reason to expect 1
+reason to further 1
+reason to predict 1
+reason to quest 1
+reason to say 1
+reason to seek 1
+reason to select 1
+reason to tak 1
+reason to us 1
+reason trac 1
+reason undertak 1
+reason vs 1
+reason we know 1
+reason weight 1
+reason wel cater 1
+reason wel known 1
+reason why 11
+reason why eclip 1
+reason why enabl 1
+reason why fl 1
+reason why hypoth 1
+reason why med 1
+reason with funct 1
+reason with non 1
+reasoner 1
+reasoner abil 1
+reasoner ch 1
+reasoner could us 1
+reasoner ha knowledg 1
+reasoner predict 1
+reasoner retrief 1
+reasoner to explain 1
+reasoner to mak 1
+reasoner to recover 1
+reasoner wil spawn 1
+reassessm 1
+reassign 1
+reassign th serv 1
+reassignm 1
+reassignm me 1
+reboot 1
+reboot th host 1
+rebroadcast 1
+rebuild 1
+rebuild a subderiv 1
+rebuilt 1
+rebuilt to try 1
+rebut 1
+rebut by evid 1
+rec 81
+rec 500496t1t2 1
+rec a connect 1
+rec a me 4
+rec a multicast 1
+rec a number 1
+rec a simpl 1
+rec adopt 1
+rec an act 1
+rec an addit 1
+rec an equiv 1
+rec an input 1
+rec and acknowledg 1
+rec and proc 2
+rec and random 1
+rec and sen 1
+rec and unpack 1
+rec any giv 1
+rec any kind 1
+rec any me 2
+rec appear 1
+rec appl 1
+rec appl en 1
+rec architectur 1
+rec architectur framework 1
+rec argu 1
+rec bandwidth 1
+rec bandwidth bo 1
+rec been devot 1
+rec capabl 1
+rec capabl de 1
+rec classiqu 1
+rec classiqu qu 1
+rec dat 1
+rec de 1
+rec de point 1
+rec de structur 1
+rec decl 1
+rec deg 1
+rec develop 2
+rec dim 1
+rec dim irm 1
+rec dun 1
+rec dun pr 1
+rec ee 2
+rec ee au 1
+rec ee sur 1
+rec effect 1
+rec el 1
+rec el en 1
+rec event 1
+rec exclus 1
+rec exclus serv 1
+rec execut 1
+rec execut act 1
+rec failur 1
+rec ffq0 1
+rec fil 1
+rec found 1
+rec from singl 1
+rec half 1
+rec hap 1
+rec hostinf 1
+rec in knowledg 1
+rec in prp 1
+rec in sect 1
+rec instruc 2
+rec it classif 1
+rec keyboard 1
+rec keyboard input 1
+rec l 2n 1
+rec level 1
+rec level number 1
+rec m0 1
+rec me 4
+rec mobj 1
+rec mobj me 1
+rec mod 1
+rec mor serv 1
+rec multicast 1
+rec multicast se 1
+rec multipl 1
+rec multipl au 1
+rec multipl chap 1
+rec no serv 1
+rec obtenu 1
+rec old 1
+rec old link 1
+rec om 1
+rec om failur 1
+rec om prim 1
+rec on mobj 1
+rec on multicast 1
+rec op 1
+rec op fil 1
+rec other 1
+rec ou 1
+rec ou de 1
+rec pack 1
+rec pack drop 1
+rec par 1
+rec par icp 1
+rec perform 1
+rec ph 1
+rec ph ind 1
+rec posit 1
+rec posit acknowledg 1
+rec pr 1
+rec proc 1
+rec prop 1
+rec proper 1
+rec qu 1
+rec qu dun 1
+rec qu nous 1
+rec react 1
+rec read 1
+rec report 1
+rec rig 1
+rec rout 1
+rec se 1
+rec se me 1
+rec select 1
+rec select act 1
+rec self 1
+rec self me 1
+rec serv 1
+rec serv proport 1
+rec shown 1
+rec shown p2 1
+rec simp 1
+rec simp proceed 1
+rec som ba 1
+rec som relev 1
+rec ss 1
+rec stat 1
+rec such me 1
+rec sum 1
+rec susp 1
+rec susp goal 1
+rec th appropr 1
+rec th correct 1
+rec th definit 2
+rec th gener 1
+rec th highest 1
+rec th init 1
+rec th me 3
+rec th multicast 1
+rec th nod 1
+rec th result 1
+rec th sequ 1
+rec th serv 1
+rec th tok 1
+rec that 2ri 1
+rec that block 1
+rec that bsen 1
+rec that claus 1
+rec that cover 1
+rec that gd 1
+rec that gener 1
+rec that jaj 1
+rec that link 1
+rec that loc 1
+rec that pack 1
+rec that rl 1
+rec that string 1
+rec tloc 1
+rec tw algorithm 1
+rec unif 1
+rec util 1
+rec util norm 1
+rec var 1
+rec var gr 1
+rec whil connect 1
+rec writ 2
+rec xk 1
+recalcl 2
+recalcl de 1
+recalcl du 1
+recalcl du som 1
+recalcl of prior 1
+recapitl 1
+recapitl som ba 1
+receipt 7
+receipt clerk 1
+receipt superv 1
+receipt superv receipt 1
+receiv 47
+receiv a chang 2
+receiv a connect 1
+receiv a const 1
+receiv a dat 1
+receiv a del 1
+receiv a disproport 1
+receiv a div 1
+receiv a finish 1
+receiv a link 1
+receiv a loc 1
+receiv a me 4
+receiv a measur 1
+receiv a multicast 1
+receiv a nak 1
+receiv a nod 1
+receiv a non 1
+receiv a part 1
+receiv a particl 1
+receiv a remot 1
+receiv a rep 1
+receiv a request 1
+receiv a respon 1
+receiv a test 1
+receiv a tok 1
+receiv a transport 1
+receiv a valu 1
+receiv act 1
+receiv act me 1
+receiv after tim 1
+receiv al nec 1
+receiv al necc 1
+receiv an acknowledgm 1
+receiv an addit 1
+receiv an aver 1
+receiv an empt 1
+receiv an equ 1
+receiv an init 1
+receiv an inst 1
+receiv an integer 1
+receiv an interm 1
+receiv an upd 1
+receiv and perform 1
+receiv and proc 1
+receiv another request 1
+receiv any giv 1
+receiv any oper 1
+receiv any serv 1
+receiv ar achief 1
+receiv as upd 1
+receiv at tim 1
+receiv attent 1
+receiv ba 1
+receiv be tm 1
+receiv by connect 1
+receiv by p2 1
+receiv by pack 1
+receiv by sa 1
+receiv by se 1
+receiv by server 1
+receiv earl 1
+receiv el 1
+receiv ev sourc 1
+receiv exact 1
+receiv from childr 1
+receiv from industr 1
+receiv from instruc 1
+receiv from mik 1
+receiv from neighbour 1
+receiv from nod 1
+receiv from other 1
+receiv high 1
+receiv high label 1
+receiv in exc 1
+receiv in step 1
+receiv init1 1
+receiv init2 1
+receiv it me 1
+receiv it se 1
+receiv le serv 1
+receiv link 1
+receiv link cost 1
+receiv load 1
+receiv m0 1
+receiv margin 1
+receiv margin interest 1
+receiv maxim 1
+receiv maxim payoff 1
+receiv me 4
+receiv me request 1
+receiv mor dupl 1
+receiv mor norm 1
+receiv mor serv 1
+receiv multicast 1
+receiv multicast me 1
+receiv network 1
+receiv network pack 1
+receiv new inform 1
+receiv no serv 1
+receiv nod 1
+receiv non 1
+receiv non loc 1
+receiv o4 1
+receiv on posit 1
+receiv pack 2
+receiv proc 3
+receiv record 1
+receiv rel 1
+receiv report 1
+receiv report me 1
+receiv request 1
+receiv return 1
+receiv return funct 1
+receiv se 1
+receiv se me 1
+receiv serv 1
+receiv serv proport 1
+receiv smal me.2 1
+receiv such me 1
+receiv support 1
+receiv switch 1
+receiv th attent 1
+receiv th broadcast 1
+receiv th commun 1
+receiv th exc 1
+receiv th inform 2
+receiv th init 1
+receiv th input 1
+receiv th invoker 1
+receiv th me 4
+receiv th nod 1
+receiv th spat 1
+receiv th third 1
+receiv th tok 1
+receiv th upd 1
+receiv timestamp 1
+receiv timestamp lower 1
+receiv tok 1
+receiv traff 1
+receiv until tim 1
+receiv upd 3
+receiv upd me 1
+receiv upd st 1
+receiv valu 2
+receiv vs 1
+receiveom 1
+receiveom failur 1
+receiver 9
+receiver act 1
+receiver and receiv 1
+receiver ar reduc 1
+receiver as govern 1
+receiver cannot synchron 1
+receiver com 1
+receiver dur nod 1
+receiver for 1
+receiver id transport 1
+receiver init 1
+receiver init protocol 1
+receiver init rel 1
+receiver is read 1
+receiver nod 1
+receiver object 2
+receiver object receiv 1
+receiver oid 1
+receiver per pack 1
+receiver pick 1
+receiver proc 3
+receiver proc tim 1
+receiver receiv 1
+receiver rel 1
+receiver rel multicast 1
+receiver return 1
+receiver sen 1
+receiver sen link 1
+receiver sid 1
+receiver spen 1
+receiver st 1
+receiver st chang 1
+receiver stil for 1
+receiver that ge 1
+receiver throughput 1
+receiver to detect 1
+receiver to succ 1
+receiver upd 1
+receiver us 1
+receiver wil remov 1
+receiverinit 1
+receivethread 1
+recenser 1
+recenser le 1
+recenser le diff 1
+recent 51
+recent adv 3
+recent advanc 1
+recent algorithm 2
+recent and continu 1
+recent appl 1
+recent appl inclus 1
+recent approach 1
+recent assoc 1
+recent bar 1
+recent bar encounter 1
+recent book 1
+recent condit 1
+recent condit branch 1
+recent count 1
+recent deb 1
+recent developm 1
+recent docum 1
+recent earl 1
+recent earl timestamp 1
+recent experim 1
+recent group 1
+recent introduc 1
+recent introduc book 1
+recent investig 2
+recent investig rev 1
+recent iter 1
+recent iter xi 1
+recent liter 1
+recent liter surv 1
+recent mach 1
+recent micr 1
+recent micr kernel 1
+recent neurocomputer 1
+recent neurocomputer system 1
+recent paper 2
+recent pattern 1
+recent peer 1
+recent peer group 1
+recent port 1
+recent prev 1
+recent prev us 1
+recent prob 1
+recent prob modif 1
+recent progr 1
+recent protocol 1
+recent protocol tak 1
+recent report 1
+recent research 6
+recent respon 1
+recent result 2
+recent risc 1
+recent risc ba 1
+recent select 1
+recent select match 1
+recent self 1
+recent self modif 1
+recent sever work 1
+recent stud 3
+recent succ 1
+recent surv 5
+recent surv se 1
+recent sv 1
+recent sv evalu 1
+recent system 1
+recent tim 1
+recent trac 1
+recent trac driv 1
+recent tren 3
+recent typ 1
+recent us 1
+recent us self 1
+recent valu 1
+recent visit 1
+recent work 9
+recent writ 1
+recent writ took 1
+recent year 5
+recentlyus 1
+recentlyus tim 1
+recentlyus tim stamp 1
+recept 3
+recept and an 1
+recept and control 1
+recevoir 2
+recevoir individuel 1
+recevoir individuel la 1
+recevoir la 1
+recevoir la requ 1
+recevoir le 2
+recevoir le adr 1
+recevoir le inst 1
+recevoir le me 1
+recevoir un 1
+recevoir un cop 1
+recharg 1
+recharg es 1
+recharg es en 1
+rechenberg 1
+recherch 13
+recherch a lint 1
+recherch a pour 1
+recherch anticip 1
+recherch anticip ee 1
+recherch appel 1
+recherch assoc 1
+recherch ayant 1
+recherch ayant pour 1
+recherch command 1
+recherch command un 1
+recherch conjoint 1
+recherch conjoint darchitectur 1
+recherch connec 1
+recherch d efinit 1
+recherch d etat 1
+recherch d evelop 1
+recherch daffinit 1
+recherch dam 2
+recherch dam elior 2
+recherch de 4
+recherch de born 1
+recherch de no 1
+recherch de partit 1
+recherch de perform 1
+recherch de point 1
+recherch de prolog 1
+recherch de ren 1
+recherch de similarit 1
+recherch de structur 1
+recherch de techniqu 1
+recherch de transform 1
+recherch de vecteur 1
+recherch dun 3
+recherch dun comprom 1
+recherch dun matr 1
+recherch dun ordonnanc 1
+recherch dun sel 1
+recherch dun solut 2
+recherch e de 1
+recherch ee 1
+recherch en 8
+recherch en elimin 1
+recherch en informatiqu 6
+recherch en part 1
+recherch en supprim 1
+recherch espac 1
+recherch espac de 1
+recherch est 2
+recherch est infin 1
+recherch et de 1
+recherch inr 3
+recherch inr nff1678 1
+recherch inr soph 1
+recherch inr sophiaantipol 1
+recherch le 2
+recherch le minim 1
+recherch le partit 1
+recherch lensembl 1
+recherch lensembl de 1
+recherch lien 1
+recherch loc 1
+recherch loc com 1
+recherch loc est 1
+recherch nest 1
+recherch nest pa 1
+recherch ont 1
+recherch ont port 1
+recherch op 1
+recherch op erationnel 1
+recherch par 1
+recherch par un 1
+recherch peut 1
+recherch peut etr 1
+recherch port 1
+recherch r esult 1
+recherch s par 1
+recherch scientifiqu 1
+recherch scientifiqu institut 1
+recherch sp 1
+recherch sp ecif 1
+recherch stochastiqu 1
+recherch stochastiqu sur 1
+recherch tel 1
+recherch tel quil 1
+recherch th 1
+recherch th oriqu 1
+recherch tr 1
+recherch tr es 1
+recherch un partit 1
+recherch va 1
+recherch ver 1
+recherch ver un 1
+recherchescientifiqu 1
+recip 8
+recip en 1
+recip proc 1
+reciproc 3
+reciproc fact 1
+reciproc natur 1
+reckon 1
+reckon in real 1
+reckon to fl 1
+reclaim 3
+reclaim by garb 1
+reclaim th resourc 1
+reclam 1
+recn 1
+recod 1
+recog 1
+recogn 24
+recogn a digit 1
+recogn a particl 1
+recogn and filter 1
+recogn and loc 1
+recogn anom 1
+recogn boolean 1
+recogn boolean langu 1
+recogn by captur 1
+recogn dead 1
+recogn dent 1
+recogn dent greater 1
+recogn digit 1
+recogn in determin 1
+recogn in lin 1
+recogn in tim3 1
+recogn log 1
+recogn log dat 1
+recogn parallel 1
+recogn part 1
+recogn sol 1
+recogn sol object 1
+recogn th expr 1
+recogn th influ 1
+recogn th input 1
+recogn th plac 1
+recogn th pot 1
+recogn that hyph 1
+recogn that programmer 1
+recogn tim 1
+recogn tim zon 1
+recogn tw simil 1
+recogn unbound 1
+recogn unbound variabl 1
+recogn visu 1
+recogn visu shap 1
+recognit 19
+recognit 2nd 1
+recognit 2nd ed 1
+recognit algorithm 1
+recognit and artif 2
+recognit and descript 1
+recognit and loc 1
+recognit and posit 1
+recognit and register 1
+recognit by computer 1
+recognit by geometer 1
+recognit by mach 1
+recognit by protein 1
+recognit edit 1
+recognit experim 2
+recognit in robot 1
+recognit letter 1
+recognit mechan 1
+recognit of common 1
+recognit of keyword 1
+recognit on ncub 1
+recognit paradigm 1
+recognit power 1
+recognit power gain 1
+recognit principl 1
+recognit problem 1
+recognit program 1
+recognit program tak 1
+recognit rat 1
+recognit schem 1
+recognit softwar 1
+recognit softwar con 1
+recognit system 4
+recognit task 1
+recognit that ec 1
+recognit using 3
+recognit using alignm 1
+recognit using tim 1
+recognit wer investig 1
+recogniz 4
+recogniz character 1
+recogniz character featur 1
+recogniz that me 1
+recolor 1
+recolor we def 1
+recom 7
+recom for improv 1
+recom for saf 1
+recom pract 1
+recom produc 1
+recom proper 1
+recom usu involut 1
+recomb 2
+recomb might enh 1
+recomb of build 1
+recomb of low 1
+recomb oper 1
+recomb th result 1
+recomb tr 1
+recomb tr solut 1
+recomb wa test 1
+recombin 1
+recombin produc 1
+recombin to improv 1
+recombiner 1
+recombiner ce 1
+recombiner ce build 1
+recompil 2
+recompil separ 1
+recomposit 1
+recomposit confus 1
+recomposit confus problem 1
+recomposit problem 1
+recomput 5
+recomput and comput 1
+recomput du 1
+recomput it variabl 1
+recomput th reserv 1
+recomput th variabl 1
+recomput tim 1
+recon 2
+recon aon 1
+recon aon de 1
+recon arbr 1
+recon arbr dinterpr 1
+recon correct 1
+recon de 1
+recon de sous 1
+recon de sousstructur 1
+recon dun 1
+recon dun point 1
+recon ent 1
+recon ent rement 1
+recon est 1
+recon est particl 1
+recon et de 1
+recon et le 1
+recon identit 1
+recon le 1
+recon le util 1
+recon mod 1
+recon mod li 1
+recon perm 1
+recon perm de 1
+recon prop 1
+recon sont 1
+recon sont de 1
+recon tr 1
+recon tr deux 1
+recon. 1
+reconcil 2
+reconcil environm 1
+reconcil environm integr 1
+reconfigur 6
+reconfigur architectur 1
+reconfigur architectur comput 1
+reconfigur in network 1
+reconfigur of internet 1
+reconfigur tak 1
+reconfigur tak plac 1
+reconfigur th system 1
+reconfigur to handl 1
+reconfigur upon failur 1
+reconnaissabl 1
+reconnect 1
+reconsid 1
+reconsid erer 1
+reconsid erer la 1
+reconsider 2
+reconsider th hierarch 1
+reconstitut 1
+reconstitut by read 1
+reconstitut th inform 1
+reconstruc 14
+reconstruc 3d 1
+reconstruc 3d dobj 1
+reconstruc algorithm 1
+reconstruc algorithm look 1
+reconstruc algorithm work 1
+reconstruc an unknown 1
+reconstruc and vol 1
+reconstruc ar shown 1
+reconstruc as describ 1
+reconstruc condit 1
+reconstruc de 1
+reconstruc de la 1
+reconstruc decomposit 1
+reconstruc dim 1
+reconstruc en 1
+reconstruc en ajout 1
+reconstruc error 1
+reconstruc from cr 1
+reconstruc from planar 2
+reconstruc imag 1
+reconstruc in reproduc 1
+reconstruc in sect 1
+reconstruc issu 1
+reconstruc level 1
+reconstruc mesh 1
+reconstruc method 1
+reconstruc method mak 1
+reconstruc no 1
+reconstruc no du 1
+reconstruc no.8 1
+reconstruc object 1
+reconstruc oe 1
+reconstruc of block 1
+reconstruc of complec 1
+reconstruc of human 1
+reconstruc problem 2
+reconstruc problem solut 1
+reconstruc problem using 1
+reconstruc prop 1
+reconstruc sign 1
+reconstruc spac 1
+reconstruc subject 1
+reconstruc surfac 1
+reconstruc th map 1
+reconstruc th origin 3
+reconstruc th permut 1
+reconstruc th se 1
+reconstruc th sequ 1
+reconstruc th st 1
+reconstruc tim 1
+reconstruc to comput 1
+reconstruc to reduc 1
+reconstruc tridimensionnel 1
+reconstruc tridimensionnel dobj 1
+recop 1
+recop le 1
+recop le don 1
+recop le obj 1
+recop loc 1
+recop loc le 1
+record 44
+record a decl 1
+record a hist 1
+record a log 1
+record a particl 1
+record a singl 1
+record a stat 1
+record a trac 1
+record abstract 1
+record ai 1
+record al loc 1
+record al pair 1
+record al prev 1
+record among multipl 1
+record an oper 1
+record and comput 1
+record and funct 1
+record and manag 1
+record and pl 1
+record and st 1
+record and subtransact 1
+record and t1 1
+record ar cach 1
+record ar decl 1
+record ar encounter 1
+record ar partit 1
+record ar read 1
+record ar record 1
+record ar requir 1
+record ar sent 1
+record ar shown 1
+record ar shuffl 1
+record ar st 2
+record ar tempor 1
+record ar transfer 1
+record ar writ 1
+record arriv 1
+record arriv order 1
+record as comp 1
+record back 1
+record back ge 1
+record befor displ 1
+record befor sen 1
+record belong 1
+record bod 1
+record by proc 1
+record cannot fit 1
+record cl 1
+record cl event 1
+record clr 1
+record compr 1
+record compr m0 1
+record con 1
+record concat 1
+record connect 1
+record cont 1
+record correspon 3
+record dat 1
+record dat block 1
+record describ 1
+record descript 1
+record descript form 1
+record docum 1
+record en 1
+record encounter 1
+record ev 1
+record event 1
+record explicit 1
+record fil 2
+record fil specif 1
+record for 1
+record for configur 1
+record for ge 1
+record for interrupt 1
+record for mlt 1
+record for mult 1
+record for nest 1
+record for nt 1
+record for oper 1
+record for reconstruc 1
+record form 1
+record found 1
+record from ri 1
+record funct 1
+record funct abcl 1
+record great 1
+record great domin 1
+record ha mov 1
+record hav var 1
+record identif 1
+record imag 1
+record in buck 1
+record in intern 1
+record in main 1
+record in memor 2
+record in mi 1
+record in pa 1
+record int block 1
+record int buck 1
+record int memor 1
+record is ad 1
+record is nec 1
+record is post 1
+record is read 1
+record is repl 1
+record is scan 1
+record is shown 1
+record is st 1
+record is writ 1
+record keep 1
+record keep track 1
+record lat 1
+record lif 1
+record lif tim 1
+record link 1
+record list 1
+record loc 1
+record look 1
+record may becom 1
+record mi 1
+record multiplec 1
+record negot 1
+record negot design 1
+record of rank 1
+record older 1
+record on undamag 1
+record on var 1
+record opaqu 1
+record opaqu dat 1
+record opt 1
+record order 1
+record pack 1
+record pair 1
+record per block 1
+record per diagon 1
+record per pag 1
+record pl 1
+record put 1
+record rd 1
+record read 1
+record reflect 1
+record repl 1
+record ri 1
+record rid 1
+record se 1
+record se show 1
+record search 1
+record search tim 1
+record sect 1
+record siz 1
+record sound 1
+record sound qu 1
+record split 1
+record st 1
+record start 1
+record th aver 1
+record th chang 1
+record th configur 1
+record th datab 1
+record th earliest 1
+record th fact 1
+record th failur 1
+record th hist 1
+record th ident 1
+record th ind 1
+record th level 1
+record th manner 1
+record th nam 1
+record th origin 1
+record th proc 1
+record th server 1
+record th tim 1
+record th tool 1
+record th typ 1
+record th upper 1
+record that en 1
+record their expect 1
+record their react 1
+record tim 1
+record tim var 1
+record to buck 1
+record to docum 1
+record to partit 1
+record to remov 1
+record trailer 1
+record und 1
+record und progr 1
+record und recov 1
+record unif 1
+record upd 1
+record using 1
+record vid 1
+record vid tap 1
+record wa brok 1
+record wh ge 1
+record which chunk 1
+record which pointer 1
+record with key 1
+record with rid 1
+record writ 1
+record3 1
+recorder 1
+recour 1
+recour a de 1
+recour au 1
+recour au champ 1
+recour au part 1
+recourir 1
+recourir a la 1
+recourir au 1
+recourir au tr 1
+recouver 1
+recouver par 1
+recouver par lenviron 1
+recouvr 2
+recouvr de 1
+recouvr don 1
+recouvr du 1
+recouvr du dern 1
+recouvr dun 1
+recouvr dun tableau 1
+recouvr possibl 1
+recouvr possibl du 1
+recouvr rn 1
+recouvr rn ch 1
+recouvr s 1
+recouvr s il 1
+recouvrer 1
+recouvrer ce 1
+recouvrer ce droit 1
+recov 13
+recov act 1
+recov algorithm 2
+recov and dec 1
+recov appl 1
+recov ar concern 1
+recov ar nic 1
+recov ar repeat 1
+recov at l0 1
+recov attempt 1
+recov be interrupt 1
+recov begin 1
+recov by comp 1
+recov can accommod 1
+recov can continu 1
+recov can leav 1
+recov can repeat 1
+recov control 1
+recov facil 1
+recov for ind 1
+recov for li 1
+recov for op 1
+recov for shar 1
+recov from prior 1
+recov fundam 1
+recov ha compl 1
+recov id 1
+recov idempot 1
+recov in ca 1
+recov in datab 1
+recov in mult 1
+recov is assur 1
+recov is compl 2
+recov is mad 1
+recov is perform 1
+recov is us 1
+recov level 1
+recov manag 1
+recov manager 3
+recov mechan 1
+recov method 2
+recov method ba 1
+recov method support 2
+recov must cop 1
+recov must honor 1
+recov of lost 1
+recov of memor 1
+recov of record 1
+recov of sign 1
+recov oper 1
+recov perm 1
+recov perm impl 1
+recov pr 1
+recov prior 1
+recov proc 1
+recov proc execut 1
+recov progr 1
+recov protocol 2
+recov requir 1
+recov requir retent 1
+recov satisf 1
+recov schem 2
+recov tim 1
+recov to proceed 1
+recov to und 1
+recov und 1
+recov using 1
+recov wil work 1
+recov work 1
+recover 12
+recover abstract 1
+recover an unknown 1
+recover and learn 1
+recover befor high 1
+recover by execut 1
+recover by und 1
+recover dead 1
+recover dead spac 1
+recover from detect 1
+recover from failur 1
+recover from misnavig 1
+recover from system 1
+recover oper 1
+recover queu 1
+recover request 2
+recover request using 2
+recover server 1
+recover subtransact 1
+recover suff 1
+recover suff memor 1
+recover th coin 1
+recover th correct 1
+recover th estim 1
+recover th level 1
+recover th underl 1
+recr 1
+recr th entir 1
+recreat 2
+recreat to inclus 1
+rectangl 16
+rectangl and triangl 1
+rectangl ar 1
+rectangl block 1
+rectangl bound 1
+rectangl bound box 1
+rectangl box 1
+rectangl degener 1
+rectangl del 1
+rectangl du 1
+rectangl for defin 1
+rectangl in chunk 1
+rectangl ind 1
+rectangl ind domain 1
+rectangl ind spac 1
+rectangl indeed 1
+rectangl indeed intersect 1
+rectangl int piec 1
+rectangl int point 1
+rectangl intersect 1
+rectangl intersect not 1
+rectangl is bound 1
+rectangl is defin 1
+rectangl left align 1
+rectangl level 1
+rectangl lin 1
+rectangl matr 1
+rectangl n1 1
+rectangl object 1
+rectangl object bound 1
+rectangl of fic 1
+rectangl of height 1
+rectangl of major 1
+rectangl of minim 1
+rectangl of var 1
+rectangl organ 1
+rectangl problem 1
+rectangl qu 1
+rectangl qu box 1
+rectangl refer 1
+rectangl reg 1
+rectangl rout 1
+rectangl shap 1
+rectangl structur 1
+rectangl symbol 1
+rectangl symbol lin 1
+rectangl that cr 1
+rectangl til 1
+rectangl to plac 1
+rectangl to satisf 1
+rectangl wer st 1
+rectangl with corner 1
+rectangl with nam 1
+rectangulair 1
+rectif 1
+rectif reg 1
+rectif reg bound 1
+rectilin 1
+rectilin4 1
+rectilin4 rectangl 1
+recuit 1
+recuit physiqu 1
+recuit physiqu de 1
+recuit siml 1
+recur 50
+recur altern 1
+recur altern produc 1
+recur and branch 1
+recur and handl 1
+recur and recur 1
+recur appl 3
+recur appl canon 1
+recur appl program 1
+recur architectur 1
+recur as follow 2
+recur bind 1
+recur bind instruc 1
+recur bind intoduc 1
+recur bisect 2
+recur bisect algorithm 1
+recur bisect ba 1
+recur bisect heur 1
+recur bisect multilevel 1
+recur bisect perform 1
+recur bisect vs 1
+recur bread 1
+recur by ap 1
+recur by ch 1
+recur cal 9
+recur cal continu 1
+recur cal dm 1
+recur cal mad 1
+recur cal remain 1
+recur cal valu 1
+recur compar 1
+recur compar cal 1
+recur cr 1
+recur da 1
+recur da red 1
+recur dat 1
+recur dat structur 1
+recur defin 1
+recur defin procedur 1
+recur definit 1
+recur desc 2
+recur desc manner 1
+recur descript 1
+recur distribut 1
+recur distribut sort 1
+recur elim 1
+recur facil 1
+recur find 1
+recur flush 1
+recur for l2 1
+recur form 1
+recur funct 4
+recur funct cr 1
+recur funct definit 1
+recur funct nam 1
+recur giv 1
+recur giv simil 1
+recur ha fl 1
+recur in natur 1
+recur in simil 1
+recur in step 1
+recur inclus 1
+recur infinit 1
+recur infinit st 1
+recur interpr 1
+recur interpr expr 1
+recur invoc 1
+recur is perform 1
+recur level 1
+recur macr 2
+recur macr capabil 1
+recur narx 1
+recur narx neur 1
+recur natur 1
+recur network 2
+recur network model 1
+recur neur 2
+recur neur architectur 1
+recur neur model 1
+recur neur network 2
+recur octasect 1
+recur octasect algorithm 1
+recur octasect compar 1
+recur octasect spen 1
+recur octasect vs 1
+recur olter 1
+recur oper 1
+recur oper rplac 1
+recur optim 1
+recur or resourc 1
+recur partit 1
+recur partit algorithm 1
+recur pr 1
+recur pr earl 1
+recur procedur 3
+recur procedur boolean 1
+recur procedur obtain 1
+recur program 1
+recur program schem 1
+recur program ss 1
+recur project 1
+recur project profil 1
+recur promin 1
+recur quadrisect 1
+recur regener 1
+recur rel 2
+recur rel becom 1
+recur requir 1
+recur schem 1
+recur schem using 1
+recur solut 1
+recur sort 1
+recur spectr 1
+recur spectr bisect 1
+recur step 1
+recur stop 1
+recur string 1
+recur string pattern 1
+recur subdiv 1
+recur termin 1
+recur theorem 2
+recur theorem hold 1
+recur to allow 1
+recur to comput 1
+recur to solut 1
+recur to work 1
+recur train 1
+recur train algorithm 1
+recur typ 1
+recur us 1
+recur vs 1
+recurrenttrain 1
+recv 5
+recv com 1
+recv com cost 1
+recv cost 1
+recv cost tok 1
+recv drop 1
+recv drop run100 1
+recv me 1
+recv prepar 1
+recv prepar cost 1
+recvd 1
+recvd num 1
+recvd num recvd 1
+recvd whil num 1
+red 19
+red alread appear 1
+red and blu 1
+red and orang 1
+red and und 1
+red appear 1
+red arc 1
+red arc procedur 1
+red comp 1
+red de 1
+red de computador 1
+red efin 1
+red efin com 1
+red efin le 1
+red efinit 1
+red efinit lordr 1
+red fil 1
+red fil modif 1
+red filter 1
+red for nondetermin 1
+red in e0 1
+red in outer 1
+red in t1 1
+red ind 1
+red ind structur 1
+red is reduc 1
+red is replac 1
+red is respon 1
+red is underscor 1
+red lin 1
+red log 1
+red occup 1
+red past act 1
+red ph 1
+red priv 1
+red priv re 1
+red project 1
+red project docum 1
+red recov 1
+red red 1
+red red arc 1
+red requir 1
+red to pink 1
+red w.r.t 1
+red when reduc 1
+red85 1
+red87 1
+redef 5
+redef th push 1
+redef th rol 1
+redefin 5
+redefin and support 1
+redefin cl 1
+redefin or simplif 1
+redefin their corpor 1
+redefinit 3
+redefinit nor chang 1
+redefinit of po 1
+redefinit or agent 1
+redesign 6
+redesign a user 1
+redesign compl 1
+redesign ge 1
+redesign structur 1
+redesign structur light 1
+redesign th ba 1
+redesign th interfac 1
+redesign th network 1
+redesign th origin 1
+redev 1
+redev ind 1
+redev ind epen 1
+redevenir 1
+redevenir la 1
+redirect 2
+redirect level 1
+redistribut 5
+redistribut a templ 1
+redistribut continu 1
+redistribut everywh 1
+redistribut is fin 1
+redistribut of bound 1
+redistribut of nod 1
+redistribut oper 1
+redistribut part 1
+redistribut start 1
+redistribut strateg 1
+redistribut task 1
+redmon 1
+redmon wa 1
+redon 4
+redon alor 1
+redon au 1
+redon au register 1
+redon dan 1
+redon dan le 1
+redon dan lordr 1
+redon en 1
+redon en util 1
+redon ren 1
+redon ren le 1
+reduc 87
+reduc a comput 1
+reduc a dec 1
+reduc a network 1
+reduc algorithm 1
+reduc algorithm ment 1
+reduc algorithm rt1 1
+reduc amb 1
+reduc amb light 1
+reduc among combin 1
+reduc and addit 1
+reduc and broadcast 1
+reduc and establ 1
+reduc and gener 1
+reduc and reduc 1
+reduc and scan 1
+reduc and subtyp 1
+reduc and thus 1
+reduc and toler 1
+reduc and uniqu 1
+reduc any incon 1
+reduc ar defin 1
+reduc as prun 1
+reduc at compil 1
+reduc ba 1
+reduc ba select 1
+reduc befor try 1
+reduc begin 1
+reduc block 1
+reduc block artifact 1
+reduc branch 1
+reduc by allow 1
+reduc by appl 1
+reduc by ca 1
+reduc by ch 2
+reduc by creat 1
+reduc by incr 1
+reduc by mer 1
+reduc by pa 1
+reduc by propag 1
+reduc by sort 1
+reduc by tak 1
+reduc by using 1
+reduc c incr 1
+reduc cach 1
+reduc cach inv 1
+reduc can occur 1
+reduc can result 1
+reduc cannot cr 1
+reduc caus 1
+reduc cod 1
+reduc cod complec 1
+reduc coh 1
+reduc coh cost 1
+reduc coinc 1
+reduc commun 2
+reduc commun hardwar 1
+reduc commun traff 1
+reduc complec 1
+reduc concern 1
+reduc configur 1
+reduc configur induc 1
+reduc conflict 1
+reduc conflict report 1
+reduc cont 1
+reduc corol 1
+reduc cost 1
+reduc currexp 1
+reduc defin 1
+reduc deliv 1
+reduc deliv lat 1
+reduc derefer 1
+reduc deriv 1
+reduc dev 1
+reduc df 1
+reduc dur symbol 1
+reduc entail 1
+reduc entail elim 1
+reduc equiv 1
+reduc evalu 1
+reduc evalu cycl 1
+reduc fair 1
+reduc fair simp 1
+reduc fal 1
+reduc fal shar 1
+reduc fil 2
+reduc for object 1
+reduc for typ 1
+reduc form 1
+reduc forml 1
+reduc forml siz 1
+reduc from t0 1
+reduc from t2 1
+reduc further 1
+reduc futur 1
+reduc futur tim 1
+reduc gener 1
+reduc gener accur 1
+reduc giv 1
+reduc giv valu 1
+reduc hold 1
+reduc imprec 1
+reduc imprec test 1
+reduc in cut 1
+reduc in defect 1
+reduc in dynam 1
+reduc in jpeg 1
+reduc in parallel 2
+reduc in qu 1
+reduc in r1 1
+reduc in siz 1
+reduc in st 1
+reduc in t1 1
+reduc in typ 1
+reduc instead 1
+reduc instruc 1
+reduc instruc se 1
+reduc is actu 1
+reduc is dep 1
+reduc is measur 1
+reduc is perform 1
+reduc is reminisc 1
+reduc is strong 1
+reduc is writ 1
+reduc issu 1
+reduc it proc 1
+reduc lat 1
+reduc lem 1
+reduc level 1
+reduc mach 1
+reduc may go 1
+reduc mean 1
+reduc mechan 1
+reduc memor 1
+reduc memor penalt 1
+reduc might gain 1
+reduc min 1
+reduc multipl 2
+reduc multipl scan 1
+reduc multipl writer 1
+reduc multiproc 1
+reduc multiproc cach 1
+reduc nearest 1
+reduc nearest neighbor 1
+reduc network 1
+reduc nn 1
+reduc nn algorithm 1
+reduc nn rl 1
+reduc no 2
+reduc object 1
+reduc object return 1
+reduc of block 1
+reduc of cl 1
+reduc of cod 1
+reduc of context 1
+reduc of developm 1
+reduc of diagnost 2
+reduc of expr 1
+reduc of memor 1
+reduc of mult 1
+reduc of near 1
+reduc of nonconflu 1
+reduc of number 1
+reduc of object 1
+reduc of term 1
+reduc of typ 1
+reduc on aver 1
+reduc on typ 1
+reduc onl red 1
+reduc oper 2
+reduc or mask 1
+reduc order 1
+reduc other cod 1
+reduc output 1
+reduc output alphab 1
+reduc over q0 1
+reduc overhead 1
+reduc pag 1
+reduc pag traff 1
+reduc path 1
+reduc power 1
+reduc prec 1
+reduc preserv 1
+reduc preserv subtyp 1
+reduc proc 1
+reduc proc interact 1
+reduc proceed 1
+reduc program 1
+reduc program work 1
+reduc proper 1
+reduc proper sil 1
+reduc red 1
+reduc redund 2
+reduc rel 2
+reduc report 1
+reduc result 1
+reduc rl 1
+reduc search 2
+reduc search complec 1
+reduc search spac 2
+reduc sensit 1
+reduc sequ 1
+reduc sequ start 1
+reduc sever tim 1
+reduc simultan 1
+reduc sort 1
+reduc st 1
+reduc st requir 1
+reduc start 2
+reduc step 3
+reduc step simil 1
+reduc strateg 3
+reduc strateg w.r.t 1
+reduc subtyp 1
+reduc subtyp rel 1
+reduc such overhead 1
+reduc sw 1
+reduc system 3
+reduc system degrad 1
+reduc tak 2
+reduc tak plac 1
+reduc tak polynom 1
+reduc techniqu 3
+reduc test 1
+reduc test se 1
+reduc test suit 1
+reduc text 1
+reduc text transm 1
+reduc th acc 2
+reduc th amount 1
+reduc th aver 2
+reduc th benefit 1
+reduc th bi 1
+reduc th block 1
+reduc th ch 1
+reduc th cod 1
+reduc th coeff 1
+reduc th color 1
+reduc th complec 6
+reduc th comput 1
+reduc th configur 1
+reduc th cost 3
+reduc th crit 1
+reduc th cuml 1
+reduc th dat 1
+reduc th deleter 1
+reduc th depth 1
+reduc th differ 1
+reduc th dist 1
+reduc th edg 1
+reduc th effect 2
+reduc th execut 1
+reduc th extent 1
+reduc th fact 2
+reduc th field 1
+reduc th fil 1
+reduc th gener 1
+reduc th grad 1
+reduc th impact 1
+reduc th inh 1
+reduc th lat 2
+reduc th load 1
+reduc th me 1
+reduc th multipl 1
+reduc th navig 1
+reduc th network 1
+reduc th no 1
+reduc th non 1
+reduc th number 17
+reduc th occur 1
+reduc th order 2
+reduc th origin 1
+reduc th outer 1
+reduc th over 2
+reduc th overhead 2
+reduc th parallel 1
+reduc th parameter 1
+reduc th problem 2
+reduc th proc 1
+reduc th rang 1
+reduc th requir 1
+reduc th risk 1
+reduc th run 1
+reduc th se 1
+reduc th search 2
+reduc th sem 1
+reduc th sensit 1
+reduc th separ 1
+reduc th ser 1
+reduc th siz 10
+reduc th solut 2
+reduc th st 1
+reduc th stabil 1
+reduc th stud 1
+reduc th synchron 1
+reduc th tim 7
+reduc th tot 4
+reduc th transport 1
+reduc th us 1
+reduc th var 1
+reduc th weakl 1
+reduc their ambigu 1
+reduc their confid 1
+reduc to anywh 1
+reduc to car 1
+reduc to du1 1
+reduc to nil 1
+reduc to norm 2
+reduc to oe 1
+reduc to produc 1
+reduc to top 1
+reduc to u0 1
+reduc to xdu1 1
+reduc to zer 1
+reduc tot 1
+reduc tot pi 1
+reduc tr 1
+reduc tran 1
+reduc tran effect 1
+reduc transact 1
+reduc transact proc 1
+reduc turn 1
+reduc typ 1
+reduc u2 1
+reduc under binder 1
+reduc unnec 1
+reduc unnec inv 1
+reduc using 1
+reduc using wavel 1
+reduc vi wavel 1
+reduc w1 1
+reduc wait 1
+reduc wait tim 1
+reduc when plac 1
+reduc whil continu 1
+reduc wil proceed 1
+reduc wil us 1
+reduc with input 1
+reduc with larger 1
+reduc with tim 2
+reduc work 1
+reducead 1
+reducead16 1
+reducead32 1
+reduceand 1
+reducemac 1
+reducemac16 1
+reducemin16 1
+reducer 1
+reducer nowrit 1
+reducibil 1
+reductibilit 1
+redund 19
+redund altern 1
+redund altern path 1
+redund and non 1
+redund ar 1
+redund arc 1
+redund arc gener 1
+redund broadcast 2
+redund broadcast bus 1
+redund broadcast channel 2
+redund c aid 1
+redund commun 1
+redund commun path 1
+redund comput 1
+redund constraint 1
+redund edg 1
+redund fash 1
+redund graph 1
+redund graph edg 1
+redund in constraint 1
+redund in datalog 1
+redund in respect 1
+redund is junior 1
+redund lin 1
+redund lin inequ 1
+redund me 1
+redund network 1
+redund network incr 1
+redund of repr 1
+redund path 2
+redund privileg 1
+redund privileg specif 1
+redund se 1
+redund server 1
+redund to obtain 1
+redund unif 1
+redund unif instruc 1
+redund which incr 1
+redund with respect 1
+redwood 2
+redwood cit 2
+redynam 1
+redynam e par 1
+redynam ee 1
+reed 2
+reenter 1
+reev 3
+reevalu 1
+reexamin 1
+ref 14
+ref a giv 1
+ref a specif 1
+ref and produc 1
+ref attr2 1
+ref babel 1
+ref babel tr 1
+ref cb 1
+ref command 1
+ref command specif 1
+ref it step 1
+ref nod 1
+ref nod separ 1
+ref oe 1
+ref on part 1
+ref our not 1
+ref our specif 1
+ref part 1
+ref prim 1
+ref prim alloc 1
+ref program 1
+ref program cb 1
+ref ref 1
+ref ref oe 1
+ref ref ref 1
+ref return 1
+ref return cur 1
+ref st 1
+ref st valu 1
+ref symtab 1
+ref th act 1
+ref th descript 1
+ref th edg 1
+ref th granl 1
+ref th nod 1
+ref th schedl 1
+ref th templ 1
+ref th treatm 1
+ref valu0 1
+ref vr 1
+refact 1
+refact and aggreg 1
+refact object 1
+refact object orient 1
+refair 1
+refair de 1
+refair de act 1
+refer 123
+refer ac 1
+refer ac 5a 1
+refer and manipl 1
+refer and multip 1
+refer and therefor 1
+refer aptitud 1
+refer aptitud test 1
+refer as part 1
+refer as tloc 1
+refer babu 1
+refer behavior 1
+refer behaviour 1
+refer bottleneck 1
+refer browser 1
+refer but non 1
+refer by dynam 1
+refer by variabl 1
+refer cannot hit 1
+refer chain 1
+refer character 1
+refer collect 1
+refer constraint 1
+refer context 1
+refer could refer 1
+refer cur 1
+refer cur slav 1
+refer curv 1
+refer curv using 1
+refer exhibit 1
+refer exhibit tempor 1
+refer facil 1
+refer for object 1
+refer for oo 1
+refer guid 1
+refer hist 2
+refer in export 1
+refer in loop 1
+refer inclus 1
+refer instruc 1
+refer is allow 1
+refer is defin 1
+refer langu 1
+refer learn 1
+refer learn ba 1
+refer lin 1
+refer lin vect 1
+refer manu 13
+refer manu mak 1
+refer may introduc 1
+refer mechan 1
+refer model 2
+refer modl 2
+refer modl import 1
+refer neur 1
+refer neur net 1
+refer of locusrout 1
+refer of tupl 1
+refer other modl 1
+refer pa 1
+refer pa oper 1
+refer pattern 1
+refer per cycl 1
+refer point 2
+refer primitiv 1
+refer primitiv incp 1
+refer purp 1
+refer puzzl 1
+refer quiz 1
+refer quizz 1
+refer ra 1
+refer reader 1
+refer real conflict 1
+refer repr 1
+refer requir 1
+refer requir test 1
+refer se 1
+refer sem 1
+refer sol 1
+refer st 1
+refer start 1
+refer surfac 1
+refer th addit 1
+refer th begin 1
+refer th ent 1
+refer th reader 2
+refer th substr 1
+refer that point 1
+refer to ar 1
+refer to arbitr 1
+refer to artif 1
+refer to chang 1
+refer to collect 1
+refer to context 1
+refer to dat 1
+refer to dist 1
+refer to en 1
+refer to ent 2
+refer to fig 1
+refer to figur 3
+refer to geometer 1
+refer to main 1
+refer to newl 1
+refer to oper 1
+refer to program 1
+refer to rcc 1
+refer to rel 1
+refer to secon 1
+refer to sect 2
+refer to self 1
+refer to slav 1
+refer to specif 1
+refer to sqr 1
+refer to st 1
+refer to stat 1
+refer to tabl 1
+refer to unrel 1
+refer transpar 2
+refer vect 1
+refer ver 1
+refer weight 1
+refer weight matr 1
+refer with lin 1
+refer word 1
+referencelocalitydefinit 1
+referencelocalitydefinit instancereferenceloc 1
+refin 28
+refin a bisect 1
+refin a nod 1
+refin algorithm 1
+refin algorithm ad 1
+refin allow 1
+refin an edg 1
+refin and fin 1
+refin and program 1
+refin and reason 1
+refin bar 1
+refin bar synchron 1
+refin between program 1
+refin between st 1
+refin by experim 1
+refin by sauer 1
+refin calcl 1
+refin calculus 2
+refin calculus method 1
+refin compon 1
+refin concept 1
+refin concept form 1
+refin coupl 1
+refin decr 1
+refin descript 1
+refin edg 1
+refin edg separ 1
+refin for program 1
+refin heur 1
+refin in cogit 1
+refin in sl1 1
+refin in tam 1
+refin inclus 1
+refin is ba 1
+refin is chang 1
+refin is consider 2
+refin is describ 1
+refin is mad 1
+refin is particl 1
+refin is shown 1
+refin is signif 1
+refin it using 1
+refin law 1
+refin method 3
+refin method algorithm 1
+refin method yield 1
+refin modl 1
+refin must preserv 1
+refin norm 1
+refin norm form 1
+refin of complec 1
+refin of distribut 1
+refin of init 1
+refin of object 1
+refin of sequ 1
+refin of solut 1
+refin of symbol 1
+refin ph 2
+refin pol 1
+refin proc 3
+refin proc en 1
+refin proc transform 1
+refin program 1
+refin program work 1
+refin proof 1
+refin proof oblig 1
+refin prov 1
+refin prov greater 1
+refin rel 1
+refin relationship 1
+refin remain 1
+refin remain pur 1
+refin rl 2
+refin schem 2
+refin sl1 1
+refin sl1 specif 1
+refin stat 1
+refin step 3
+refin techniqu 1
+refin techniqu ba 1
+refin templ 1
+refin test 1
+refin tetrahedr 1
+refin tetrahedr gener 1
+refin th approach 1
+refin th chou 1
+refin th edg 1
+refin th edgesepar 1
+refin th partit 1
+refin th theor 1
+refin them using 1
+refin tim 1
+refin to conc 1
+refin to detail 1
+refin to nearest 1
+refin to obtain 1
+refin to specif 1
+refin to st 1
+refin using 1
+refin ver 1
+refin z specif 1
+refl 3
+refl ca 1
+refl es 2
+refl es alor 1
+refl es bien 1
+refl es pa 1
+refl etant 1
+refl etant cel 1
+refl etant le 1
+refl eter 1
+refl eter ce 1
+refl us 1
+reflec 8
+reflec and antisymmeter 1
+reflec and symmeter 1
+reflec and transit 2
+reflec check 1
+reflec closur 1
+reflec model 1
+reflec model compar 1
+reflec transit 1
+reflec transit closur 1
+reflec typ 1
+reflec typ system 1
+reflect 47
+reflect a chang 1
+reflect a dat 1
+reflect a lim 1
+reflect a propag 1
+reflect a refin 1
+reflect a tren 1
+reflect abstract 1
+reflect act 1
+reflect act model 1
+reflect an approxim 1
+reflect and self 1
+reflect and sem 2
+reflect annot 1
+reflect ap 1
+reflect architectur 1
+reflect aspect 1
+reflect both form 1
+reflect by maintain 1
+reflect by po 1
+reflect by record 1
+reflect cap 1
+reflect cap nec 1
+reflect capabil 1
+reflect comput 1
+reflect comput power 1
+reflect concur 1
+reflect concur object 1
+reflect contempor 1
+reflect contempor tren 1
+reflect gr 1
+reflect gr cod 1
+reflect in parallel 1
+reflect in soft 1
+reflect it level 2
+reflect knowledg 1
+reflect knowledg us 1
+reflect langu 1
+reflect langu abcl 1
+reflect langu using 1
+reflect min 1
+reflect min modl 1
+reflect modl 1
+reflect modl neur 1
+reflect mor subtl 1
+reflect neur 1
+reflect neur network 1
+reflect object 1
+reflect object orient 1
+reflect of hemingw 1
+reflect on bil 1
+reflect onl backtrack 1
+reflect or refract 1
+reflect produc 1
+reflect program 1
+reflect quit natur 1
+reflect sever architectur 1
+reflect show 1
+reflect simultan 1
+reflect symp96 1
+reflect system 3
+reflect system id 1
+reflect th acknowledg 1
+reflect th annot 1
+reflect th assum 1
+reflect th author3 1
+reflect th ba 1
+reflect th backtrack 1
+reflect th chang 2
+reflect th coh 1
+reflect th commun 1
+reflect th differ 1
+reflect th effect 1
+reflect th esoter 1
+reflect th fact 4
+reflect th hist 1
+reflect th iter 1
+reflect th load 1
+reflect th loc 1
+reflect th manner 1
+reflect th order 1
+reflect th pin 2
+reflect th posit 2
+reflect th pot 1
+reflect th proc 1
+reflect th receipt 1
+reflect th record 1
+reflect th robust 1
+reflect th strength 1
+reflect th system 1
+reflect th tradeoff 1
+reflect th user 1
+reflect th weight 1
+reflect that symmeter 1
+reflect their spat 1
+reflect tim 1
+reflect tim consider 1
+reflect to measur 1
+reflect transit 1
+reflect tw ser 1
+reflect var 1
+reflectivepeinterpr 1
+reform 1
+reform system 1
+reforml 9
+reforml constraint 1
+reforml constraint hierarch 1
+reforml in term 1
+reforml of constraint 1
+reforml of mult 1
+reforml system 1
+reforml th constraint 1
+reforml th definit 1
+reforml th enrich 1
+reforml th network 1
+refract 1
+refrain 1
+refrain from sen 1
+refresh 1
+refresh algorithm 1
+refroidir 1
+refroidir tr 1
+refroidir tr es 1
+refus 1
+refus ee 1
+refus ee par 1
+refusionner 1
+refusionner le 1
+refusionner le deux 1
+refut 4
+refut ar canon 1
+refut procedur 1
+reg 28
+reg 8c 1
+reg 8c r4r 1
+reg a0 1
+reg accord 1
+reg adjac 1
+reg and appl 1
+reg and connect 1
+reg and def 1
+reg and graph 1
+reg and sol 1
+reg appear 1
+reg ar construc 1
+reg ar detect 1
+reg ar disjoint 1
+reg ar firm 1
+reg ar mutu 1
+reg ar refer 1
+reg ar typ 1
+reg ar unlik 1
+reg at exact 1
+reg ba 1
+reg ba low 1
+reg befor appl 1
+reg befor attempt 1
+reg being part 1
+reg better lsb 1
+reg bound 2
+reg but compl 1
+reg by color 1
+reg by comb 1
+reg by contract 1
+reg by drag 1
+reg by draw 1
+reg coinc 1
+reg con 1
+reg connect 1
+reg correspon 1
+reg creat 1
+reg describ 1
+reg ec 1
+reg ej 1
+reg en 1
+reg en en 1
+reg establ 1
+reg exhibit 1
+reg exhibit specif 1
+reg extract 1
+reg extract proc 1
+reg follow 1
+reg fr 1
+reg fr reg 1
+reg from ec 1
+reg from old 1
+reg gener 1
+reg i automat 1
+reg i cr 1
+reg in lin 1
+reg in order 1
+reg int part 1
+reg int triangl 1
+reg involut 1
+reg involut great 1
+reg is acycl 1
+reg is analog 1
+reg is denot 1
+reg is extern 2
+reg is intern 1
+reg is mad 1
+reg is proport 1
+reg is triangl 1
+reg is typ 1
+reg len 1
+reg len nc 1
+reg maxim 1
+reg maxim throughput 1
+reg may loc 1
+reg must ec 1
+reg must mean 1
+reg nc 1
+reg nc reg 1
+reg object 1
+reg of ca 1
+reg of cb 1
+reg of cod 1
+reg of exper 1
+reg of graph 1
+reg of learn 1
+reg of randel 1
+reg of simil 1
+reg of spac 1
+reg of spec 1
+reg of uncertaint 1
+reg offer 1
+reg offer nw 1
+reg or sol 1
+reg overlap 1
+reg produc 1
+reg refer 1
+reg rel 1
+reg repr 1
+reg respect 1
+reg satel 1
+reg satel feed 1
+reg segm 1
+reg smooth 1
+reg start 1
+reg th obv 1
+reg th voron 1
+reg that overlap 1
+reg ther ec 1
+reg to comb 1
+reg to ec 1
+reg to reg 1
+reg to repr 1
+reg we clear 1
+reg we know 1
+reg wer split 1
+reg wh ec 1
+reg wh pixel 1
+reg when appropr 1
+reg which appear 1
+reg which contain 1
+reg with clear 1
+reg with distinct 1
+reg with hom 1
+reg.5 1
+reg94 1
+regagner 1
+regagner le 1
+regagner le bon 1
+regain 1
+regain it effect 1
+regan 1
+regar 1
+regar as mer 1
+regard 49
+regard a 2d 1
+regard a cnf 1
+regard a mut 1
+regard adapt 1
+regard adapt sourc 1
+regard as axiom 1
+regard as construc 1
+regard as defin 1
+regard as ec 1
+regard as edg 1
+regard as encomp 1
+regard as fic 1
+regard as good 1
+regard as ident 1
+regard as strength 1
+regard dynam 1
+regard dynam bind 1
+regard ev graph 1
+regard lag 1
+regard lag com 1
+regard link 1
+regard link chang 1
+regard most 1
+regard most variabl 1
+regard object 1
+regard object orient 1
+regard of prev 1
+regard of system 1
+regard of typ 1
+regard om 1
+regard om el 1
+regard on person 1
+regard our forml 1
+regard proper 1
+regard proposit 1
+regard smal method 1
+regard softwar 1
+regard softwar reus 1
+regard th act 1
+regard th behavior 1
+regard th bitstr 1
+regard th block 1
+regard th ec 1
+regard th effect 1
+regard th futur 2
+regard th issu 2
+regard th lim 1
+regard th matr 1
+regard th number 1
+regard th posit 1
+regard th pot 1
+regard th preserv 1
+regard th reader 1
+regard th relationship 1
+regard th ser 1
+regard th spanner 1
+regard th symmeter 1
+regard th top 1
+regard th transit 1
+regard to cover 1
+regard to high 1
+regard to no 1
+regard to over 1
+regard to requir 1
+regard to tim 1
+regard unfold 1
+regarder 2
+regarder le 1
+regarder le lien 1
+regarder si 1
+regarder si el 1
+regardon 2
+regardon ce 1
+regardon ce qu 1
+regardon lim 1
+regardon lim par 1
+regardon maint 1
+regardon maint ce 1
+regardon maint com 1
+regardon maint le 1
+regeln 1
+regeln fuer 1
+regeln fuer di 1
+regener 3
+regener to adapt 1
+regener to fit 1
+regener to produc 1
+register 19
+register a condit 1
+register a fat 1
+register a lintroduc 1
+register a partir 1
+register a register 1
+register a0 1
+register a0 nest 1
+register a1 1
+register a1 ne 1
+register a2 1
+register a2 cont 1
+register a2 le 1
+register a3 1
+register a3 ait 1
+register a3 dan 1
+register acc 1
+register accur 1
+register additionnel 1
+register additionnel sont 1
+register addr 1
+register addr calcl 1
+register ai 1
+register ai seront 1
+register algorithm 1
+register algorithm common 1
+register alloc 1
+register alloc tak 1
+register and develop 1
+register and fus 1
+register and mean 1
+register and memor 2
+register and merg 1
+register and pa 1
+register and thus 1
+register apport 1
+register apport dautr 1
+register ar 1
+register ar conv 1
+register ar introduc 1
+register argum 1
+register argum a1 1
+register argum ai 1
+register argum ain 1
+register argum correspon 1
+register argum dan 1
+register argum de 1
+register argum en 1
+register argum ne 1
+register argum ni 1
+register argum ont 1
+register argum ou 1
+register argum soit 1
+register argum sont 1
+register argum2 1
+register at proc 1
+register b dev 1
+register b devrait 1
+register b don 1
+register b est 1
+register b point 1
+register b sinon 1
+register b son 1
+register ba 1
+register bp 1
+register bp deep 1
+register bp ne 1
+register bp qu 1
+register by genet 1
+register ca 1
+register can becom 1
+register cel 1
+register cel fa 1
+register charger 1
+register charger le 1
+register contain 1
+register correspon 1
+register correspon au 1
+register cp 1
+register cp dispar 1
+register cp doit 1
+register cp pour 1
+register cp se 1
+register criter 1
+register cutb 1
+register cutb alor 1
+register d ej 1
+register d etat 1
+register dan 1
+register dan le 1
+register de 1
+register de ba 1
+register de continu 1
+register de la 1
+register dest 1
+register dest aux 1
+register devot 1
+register disponibl 1
+register doit 1
+register doit alor 1
+register don 1
+register don la 1
+register du 1
+register e au 1
+register e peut 1
+register e point 1
+register e sur 1
+register e vient 1
+register e2 1
+register e2 pren 1
+register each pair 1
+register entr 1
+register est 1
+register est aus 1
+register est bien 1
+register et champ 1
+register et de 1
+register et util 1
+register fil 2
+register for pa 1
+register g nest 1
+register gb 1
+register gb afin 1
+register gb est 1
+register ha siz 1
+register i serait 1
+register imag 1
+register impliqu 1
+register impliqu es 1
+register in 3d 1
+register indep 1
+register int 1
+register int imag 1
+register int se 1
+register interm 1
+register interm ediair 1
+register is idl 1
+register is label 1
+register is main 1
+register is partit 1
+register j est 1
+register l correspon 1
+register lb 1
+register lb doit 1
+register lb pour 1
+register linform 1
+register lor 1
+register lor de 1
+register mach 1
+register mach ain 1
+register mach au 1
+register mach bp 1
+register mach evit 1
+register marqu 1
+register marqu es 1
+register med 1
+register med imag 1
+register method 1
+register method ba 1
+register nec 1
+register of 3d 1
+register of fr 1
+register of med 1
+register of proc 1
+register of siz 1
+register or memor 1
+register ou 1
+register ou dan 1
+register own 1
+register per proc 1
+register peuv 1
+register peuv etr 1
+register problem 1
+register problem appl 1
+register qu 1
+register qu ne 1
+register quen 1
+register quen ca 1
+register r est 1
+register r point 1
+register r repr 1
+register re coiv 1
+register read 1
+register read writ 1
+register renam 1
+register ri 1
+register s dan 1
+register sauv 1
+register sauv es 1
+register sauvegard 1
+register sauvegard es 1
+register se 1
+register segm 1
+register segm sr 1
+register sinc rs 1
+register siz 1
+register siz log 1
+register siz polylogarithm 1
+register sont 1
+register sont recharg 1
+register sont restaur 1
+register sp 1
+register sp ec 1
+register sp ecifiqu 1
+register spf 1
+register step 1
+register suppl 1
+register suppl ementair 1
+register t nest 1
+register task 1
+register tb 1
+register tb correspon 1
+register techniqu 1
+register temporair 1
+register th pair 1
+register th specif 1
+register thus 1
+register to contain 1
+register to execut 1
+register to perform 1
+register to pipel 1
+register tout 1
+register tout com 1
+register tp 1
+register tp hold 1
+register trademark 1
+register transfer 2
+register transfer level 1
+register util 1
+register util es 1
+register valu 1
+register vm 1
+register vm repr 1
+register vn 1
+register window 1
+register with yi 1
+register x5 1
+registerstart 1
+registerstart programstart 1
+registerstart programstart mac 1
+regl 42
+regl 1nf 1
+regl 1nf rel 1
+regl a boolean 1
+regl accord 1
+regl and purp 1
+regl and rel 1
+regl and simpl 1
+regl b tr 1
+regl benchmark 1
+regl bin 1
+regl bin encod 1
+regl bin number 1
+regl boolean 2
+regl boolean funct 1
+regl boolean se 1
+regl commun 1
+regl commun primitiv 1
+regl commun requir 1
+regl con 1
+regl con structur 1
+regl crossover 1
+regl crossover oper 1
+regl dat 1
+regl dat dep 1
+regl dep 1
+regl dep structur 1
+regl discr 1
+regl discr mesh 1
+regl dl 1
+regl ec 1
+regl edg 1
+regl edg sharp 1
+regl environm 1
+regl exchang 1
+regl exchang inform 1
+regl expr 2
+regl expr denot 1
+regl expr deriv 1
+regl expr pr 1
+regl expr repr 1
+regl expr using 1
+regl fash 1
+regl feedback 1
+regl finit 1
+regl finit el 1
+regl first order 1
+regl fp 1
+regl fp int 1
+regl graph 1
+regl grid 2
+regl integer 1
+regl integer string 1
+regl interconnect 2
+regl interfac 1
+regl intersect 1
+regl interv 2
+regl langu 2
+regl langu accept 1
+regl menu 1
+regl menu interfac 1
+regl mesh 1
+regl mesh topolog 1
+regl method 1
+regl number 1
+regl number schem.th 1
+regl numer 1
+regl numer cod 1
+regl of chain 1
+regl oper 1
+regl part 1
+regl pattern 1
+regl problem 1
+regl proc 1
+regl proc ar 1
+regl reconstruc 1
+regl sampl 1
+regl sampl approach 1
+regl sampl sort 1
+regl se 3
+regl se cover 1
+regl sort 1
+regl sort algorithm 1
+regl spac 1
+regl spac aff 1
+regl st 1
+regl structur 1
+regl th traff 1
+regl to nod 1
+regl topol. 1
+regl topolog 2
+regl triangl 1
+regl triangl grid 1
+regl upd 1
+regl us 2
+regl us si 1
+regl user 1
+regl user interfac 1
+regl variabl 2
+regl ver 1
+regl with incr 1
+regp 1
+regp after proc 1
+regp until regp 1
+regr 8
+regr algorithm 1
+regr an 2
+regr and an 1
+regr and outl 1
+regr dat 1
+regr dat inclus 1
+regr equ 2
+regr equ minim 1
+regr integr 1
+regr integr test 1
+regr method 1
+regr model 1
+regr test 1
+regr test appl 1
+regr test begin 1
+regr test constitut 1
+regr test experim 1
+regr test glob 1
+regr test modif 1
+regr test ph 1
+regr test pl 1
+regr test proc 1
+regr test select 1
+regr test span 1
+regr test strateg 1
+regr test techniqu 1
+regr test tim 1
+regr test tool 1
+regr test using 1
+regr variabl 1
+regr wil influ 1
+regr with rot 1
+regroup 4
+regroup de 2
+regroup de ecritur 1
+regroup de exempl 1
+regroup de mach 1
+regroup de op 1
+regroup ee 2
+regroup ee en 1
+regroup ee sous 1
+regroup enfin 1
+regroup enfin le 1
+regroup le 1
+regroup le lign 1
+regroup un 1
+regroup un appl 1
+regrouper 1
+regrouper ce 1
+regrouper ce deux 1
+regrouper dan 1
+regrouper de 1
+regrouper de man 1
+regrouper en 1
+regrouper en util 1
+regrouper le 1
+regrouper le op 1
+regrouper le scalair 1
+regrouper le tableaux 1
+regulinsk 1
+rehfus 1
+reibman 1
+reichgelt 1
+reid 1
+reidel 2
+reidel publ 1
+reidel publ co 1
+reif 5
+reif constraint 1
+reif constraint form 1
+reif dispatch 1
+reif dispatch act 1
+reif form 1
+reif form mean 1
+reif it dispatch 1
+reif mail 1
+reif mail queu 1
+reif typ 1
+reih 1
+reil 4
+reil assoc 1
+reiman 1
+reinforc 1
+reinforc environm 1
+reinforc learn 1
+reinforc learn algorithm 1
+reinforc learn system 1
+reingold 2
+reinhold 2
+reinholdt 1
+reinit 1
+reinsch 1
+reinst 1
+reinst recur 1
+reinst recur cal 1
+reintegr 1
+reintegr of recover 1
+reinvest 1
+reinvest on il 1
+reinvok 1
+reinvok selecttest2 1
+reischuk 1
+reiter 4
+reiter th conclus 1
+rej 1
+rej e ce 1
+rej ee 1
+reject 14
+reject and accept 1
+reject for structur 1
+reject in order 1
+reject level 1
+reject me 1
+reject no 2
+reject of input 1
+reject outright 2
+reject rat 2
+reject rat grow 1
+reject rat requir 1
+reject th atom 1
+reject th weakest 1
+rejoign 1
+rejoign au 1
+rejoign au niveau 1
+rejoin 1
+rejoint 1
+rejoint dan 1
+rejoint dan li 1
+rel 123
+rel a la 2
+rel a loccur 1
+rel a lock 2
+rel ab 1
+rel absolut 1
+rel absolut speed 1
+rel acc 1
+rel account 1
+rel ach 1
+rel ach ee 1
+rel acquir 1
+rel acquir sequ 1
+rel adv 1
+rel ae 1
+rel ae0 1
+rel ae1 1
+rel aexpr 1
+rel after t2 1
+rel al acquir 1
+rel al inclus 1
+rel algebr 4
+rel algebr ba 1
+rel algebr inclus 1
+rel algebr incorpor 1
+rel algebr oper 1
+rel algorithm 1
+rel algorithm complec 1
+rel allow 2
+rel allow fair 1
+rel an 1
+rel an techniqu 1
+rel and atom 1
+rel and attach 1
+rel and concur 1
+rel and constitut 1
+rel and constraint 1
+rel and deadl 1
+rel and deduc 1
+rel and ea 1
+rel and eff 1
+rel and introduc 1
+rel and le 1
+rel and load 1
+rel and object 1
+rel and qu 1
+rel and sequ 1
+rel and transm 1
+rel and us 1
+rel answer 1
+rel ar 2
+rel ar ap 1
+rel ar creat 1
+rel ar defin 1
+rel ar encod 1
+rel ar finit 1
+rel ar gener 1
+rel ar guaranteed 1
+rel ar hom 1
+rel ar join 1
+rel ar project 1
+rel ar upd 1
+rel ar writ 1
+rel as part 1
+rel aspect 1
+rel assessm 1
+rel atom 2
+rel atom broadcast 1
+rel attribut 1
+rel author 1
+rel automat 1
+rel aux 1
+rel aux ev 1
+rel bar 1
+rel bar synchron 1
+rel becom 1
+rel between art 1
+rel between deep 1
+rel between featur 1
+rel between finit 1
+rel between log 1
+rel between old 1
+rel between permut 1
+rel between shar 1
+rel between u0w0 1
+rel bien 1
+rel bien connu 1
+rel book 1
+rel broadcast 2
+rel broadcast protocol 1
+rel broadcast requir 1
+rel build 1
+rel build block 1
+rel by control 1
+rel by remov 1
+rel ca 2
+rel ca a1 1
+rel ca stud 1
+rel calculus 2
+rel calculus constraint 1
+rel calculus forml 1
+rel calculus nc 1
+rel cannot hold 1
+rel caus 1
+rel caus broadcast 1
+rel caus multicast 1
+rel cheap 1
+rel cl 1
+rel claus 1
+rel cod 1
+rel coinc 1
+rel commun 1
+rel commun guar 1
+rel compon 1
+rel con 5
+rel con model 1
+rel con wh 1
+rel concern steiner 1
+rel condit 1
+rel const 1
+rel const degr 1
+rel contain 3
+rel context 2
+rel control 1
+rel cost 2
+rel d jnpj 1
+rel d produc 1
+rel dat 4
+rel dat deliv 1
+rel dat model 2
+rel datab 7
+rel datab attribut 1
+rel datab langu 1
+rel datab manag 3
+rel datab model 1
+rel datab qu 1
+rel datab repr 1
+rel datab system 2
+rel datab theor 1
+rel dau 1
+rel dau moin 1
+rel db 1
+rel db cold 1
+rel db hot 1
+rel de 4
+rel de cel 1
+rel de deux 1
+rel de diff 1
+rel de point 1
+rel de pr 1
+rel de sch 1
+rel de segm 1
+rel dec 1
+rel decl 1
+rel decr 1
+rel defin 2
+rel deliv 3
+rel den 1
+rel dissem 1
+rel dissem protocol 1
+rel dist 1
+rel distribut 4
+rel distribut comput 2
+rel distribut pip 1
+rel distribut system 1
+rel docum 1
+rel dordr 1
+rel dordr sur 1
+rel e ff1 1
+rel e qu 1
+rel ea 3
+rel effect 2
+rel empir 1
+rel empir work 1
+rel entr 4
+rel entr le 3
+rel error 1
+rel es 2
+rel es direct 1
+rel es entr 1
+rel es par 1
+rel est 1
+rel est qu 1
+rel estim 1
+rel etroit 1
+rel etroit avec 1
+rel event 2
+rel event de 1
+rel event occur 1
+rel execut 1
+rel exper 1
+rel expr 1
+rel extract 1
+rel extract keyword 1
+rel failur 1
+rel failur detect 1
+rel featur 1
+rel fec 1
+rel few hyperrectangl 1
+rel few neur 1
+rel for finit 1
+rel for reg 1
+rel for replac 1
+rel form 3
+rel fram 1
+rel fram act 1
+rel from everyd 1
+rel ftp 1
+rel funct 1
+rel funct defin 1
+rel fy 1
+rel fy x2g 1
+rel giv 2
+rel goal 1
+rel goal user 1
+rel good 1
+rel group 1
+rel group membership 1
+rel growth 2
+rel guar 1
+rel hav attribut 1
+rel heav 3
+rel help 1
+rel help request 1
+rel hff 1
+rel hierarch 1
+rel hierarch dat 1
+rel high me 1
+rel hold 3
+rel hyperplan 1
+rel hyperplan bi 1
+rel i tim 1
+rel id 1
+rel iff 1
+rel impact 1
+rel impl 1
+rel import 2
+rel import assoc 1
+rel import featur 1
+rel in artif 1
+rel in ca 1
+rel in cl 1
+rel in compr 1
+rel in order 1
+rel in term 1
+rel incr 1
+rel ind 2
+rel induc 1
+rel inform 1
+rel infrequ 1
+rel insensit 1
+rel instead 1
+rel interpr 1
+rel interpr definit 1
+rel is avail 1
+rel is cl 1
+rel is const 1
+rel is contain 1
+rel is creat 1
+rel is defin 1
+rel is deriv 1
+rel is du 1
+rel is equiv 1
+rel is explor 1
+rel is lik 1
+rel is maintain 1
+rel is reflec 1
+rel is repr 1
+rel is standard 1
+rel is transit 1
+rel is writ 1
+rel issu 2
+rel iter 2
+rel iter predict 1
+rel itself pr 1
+rel larg ar 1
+rel larg number 1
+rel larg siz 1
+rel le 1
+rel le contour 1
+rel level 1
+rel light 1
+rel light load 1
+rel link 1
+rel littl attent 1
+rel littl effect 1
+rel loc 1
+rel log 1
+rel low 5
+rel low complec 1
+rel low level 2
+rel magnitud 1
+rel markov 1
+rel markov chain 1
+rel match 1
+rel mater 1
+rel me 1
+rel me cl 1
+rel measur 1
+rel mechan 1
+rel ment 1
+rel merit 5
+rel minim 1
+rel minim leaf 1
+rel mobil 1
+rel model 8
+rel model allow 1
+rel modl 1
+rel mult 1
+rel mult step 1
+rel multicast 3
+rel multicast facil 1
+rel multicast framework 1
+rel multicast protocol 1
+rel multicast se 1
+rel multicast techniqu 1
+rel multicast transport 1
+rel multipl 1
+rel multipl match 1
+rel nam 2
+rel nod 1
+rel norm 1
+rel norm vect 1
+rel number 1
+rel nxn 1
+rel nxn multicast 1
+rel obtain 1
+rel oe 1
+rel of a1 1
+rel of answer 1
+rel of ar 1
+rel of compon 1
+rel of connect 1
+rel of exper 1
+rel of figur 1
+rel of object 1
+rel of refin 1
+rel on 3d 1
+rel on adh 1
+rel on an 1
+rel on assum 1
+rel on ba 1
+rel on cluster 1
+rel on concur 1
+rel on explicit 3
+rel on gr 1
+rel on loc 1
+rel on min 1
+rel on msld 1
+rel on pseudorandom 1
+rel on seeing 1
+rel on sem 1
+rel on sub 1
+rel on typ 1
+rel on x2n 1
+rel open problem 1
+rel oper 4
+rel or retent 1
+rel order 4
+rel our result 1
+rel our work 1
+rel pain 1
+rel paper 1
+rel parameter 1
+rel part 1
+rel perform 7
+rel perform differ 1
+rel plan 1
+rel plan langu 1
+rel po 1
+rel point 2
+rel posit 2
+rel pref 1
+rel pref form7 1
+rel prim 1
+rel problem 7
+rel proc 1
+rel program 2
+rel program equiv 1
+rel proper 1
+rel qu 2
+rel qu langu 1
+rel qu qu 1
+rel quant 1
+rel quer 1
+rel quer comput 1
+rel quick 1
+rel r assoc 1
+rel r con 1
+rel r defin 1
+rel r repr 1
+rel r1 1
+rel random 1
+rel random number 1
+rel rank 1
+rel re 1
+rel receipt 1
+rel recent 1
+rel reflect 1
+rel remain 1
+rel rep 1
+rel rep rel 1
+rel replac 1
+rel repr 2
+rel repr backtrack 1
+rel repr po 1
+rel repr unrestrict 1
+rel request 1
+rel research 1
+rel research foc 1
+rel result 2
+rel return 1
+rel ri 1
+rel run 1
+rel run tim 1
+rel saf 1
+rel saf net 1
+rel schedl 1
+rel schedl algorithm 1
+rel schem 1
+rel se 1
+rel sect 1
+rel seem 1
+rel seldom 1
+rel sen 1
+rel sequ 1
+rel sequ number 1
+rel sharp 1
+rel sharp featur 1
+rel shorter 1
+rel shorter hist 1
+rel show 1
+rel show empl 1
+rel shown 1
+rel sign 1
+rel sign deliv 1
+rel signif 1
+rel signif drop 1
+rel siml 1
+rel siml tupl 1
+rel simpl 6
+rel simpl typ 1
+rel siz 1
+rel slow 2
+rel slow chang 1
+rel slow cpu 1
+rel smal method 1
+rel smal number 1
+rel smal rot 1
+rel smaller 1
+rel smooth 1
+rel smooth tempor 1
+rel sol 1
+rel soph 1
+rel soph tool 1
+rel specif 1
+rel st 2
+rel st chang 1
+rel standard 1
+rel standard error 1
+rel stat 2
+rel steiner 1
+rel steiner tr 1
+rel straightfor 2
+rel structur 1
+rel structur finit 1
+rel stud 1
+rel sub 1
+rel succ 1
+rel succ perform 1
+rel system 1
+rel tabl 1
+rel tak 1
+rel task 2
+rel task prov 1
+rel technolog 1
+rel term 1
+rel term theorem 1
+rel th implem 1
+rel th lockj 1
+rel th maxim 1
+rel th number 1
+rel th output 1
+rel th qu 1
+rel th string 1
+rel th structur 1
+rel th term 1
+rel th typ 2
+rel that ec 1
+rel their sourc 1
+rel tim 1
+rel tim constraint 1
+rel to 2cl 1
+rel to act 1
+rel to agent 1
+rel to amd 1
+rel to bottom 1
+rel to bsen 1
+rel to commun 1
+rel to comput 1
+rel to cont 1
+rel to csp 1
+rel to dat 1
+rel to datab 1
+rel to depth 1
+rel to detect 1
+rel to diagn 1
+rel to ec 1
+rel to eff 1
+rel to el 1
+rel to exper 1
+rel to gener 1
+rel to glob 1
+rel to gr 1
+rel to implem 2
+rel to interfac 1
+rel to learn 1
+rel to maintain 1
+rel to memor 1
+rel to mimd 1
+rel to min 1
+rel to non 1
+rel to object 1
+rel to orthogon 1
+rel to pack 2
+rel to pe 1
+rel to problem 1
+rel to reduc 1
+rel to repr 1
+rel to resourc 1
+rel to spac 1
+rel to srq 1
+rel to st 1
+rel to string 1
+rel to surround 1
+rel to term 1
+rel to triangl 1
+rel to typ 1
+rel to uid 1
+rel to unrestrict 1
+rel top 2
+rel traff 1
+rel transport 1
+rel transport issu 1
+rel transport layer 1
+rel transport protocol 1
+rel u0 1
+rel u0 bu1 1
+rel unimport 2
+rel unimport featur 1
+rel unstructur 1
+rel unstructur lp 1
+rel using 2
+rel using attribut 1
+rel using pair 1
+rel valu 1
+rel valu rang 1
+rel variabl 1
+rel ver quick 1
+rel view 1
+rel view explicit 1
+rel wa explicit 1
+rel weight 1
+rel wh el 1
+rel which con 1
+rel which contain 1
+rel which hold 1
+rel which us 1
+rel wil contain 1
+rel with abstract 1
+rel with correspon 1
+rel with rel 1
+rel with se 1
+rel work 23
+rel work var 1
+rel. 1
+rel.2 1
+rel.std 1
+rel.std med 1
+rel.std med nam 1
+relabel 4
+relabel of separ 1
+relabel their nod 1
+relac 16
+relac and answer 1
+relac befor ask 1
+relac con 1
+relac con model 1
+relac con schem 1
+relac constraint 1
+relac heap 1
+relac heap qd 1
+relac memor 1
+relac memor con 1
+relac of constraint 1
+relac proc 1
+relac strong 1
+relac syntact 1
+relac syntact constraint 1
+relac th con 1
+relac th constraint 5
+relac th dep 1
+relac th optim 1
+relac th prior 1
+relac th requir 2
+relac th restrict 2
+relac tim 1
+relancer 1
+relancer lec 1
+relancer lec ecut 1
+relat 1
+relat ee 1
+relat ee dan 1
+relatif 4
+relatif a laccr 1
+relatif au 1
+relatif au contr 1
+relatif aux 1
+relatif aux processus 1
+relatif de 2
+relatif de architectur 1
+relatif de la 1
+relatif de os 1
+relatif de tr 1
+relationdefinit 1
+relationdefinit aliasdefinit 1
+relationdefinit aliasdefinit instancedefinit 1
+relationschem 1
+relationschem tupl 1
+relationship 37
+relationship among dat 1
+relationship among imag 1
+relationship among nonmonot 1
+relationship among rol 1
+relationship and st 1
+relationship approach 1
+relationship ar disjoint 1
+relationship as connect 1
+relationship as form 1
+relationship between abstract 1
+relationship between cl 1
+relationship between disturb 1
+relationship between exper 1
+relationship between form 1
+relationship between interconnect 1
+relationship between master 1
+relationship between object 2
+relationship between p1 2
+relationship between program 1
+relationship between resourc 1
+relationship between sol 1
+relationship between ssm 1
+relationship between subsequ 1
+relationship between system 1
+relationship between textur 1
+relationship between thread 1
+relationship between typ 1
+relationship between user 1
+relationship between workload 1
+relationship compl 1
+relationship denot 1
+relationship disc 1
+relationship ec 1
+relationship fal 1
+relationship fj1 1
+relationship hold 3
+relationship inclus 1
+relationship inclus reflec 1
+relationship introduc 1
+relationship is establ 1
+relationship is specif 1
+relationship model 1
+relationship obtain 1
+relationship of method 1
+relationship of nonmonot 1
+relationship or cl 1
+relationship or path 1
+relationship rel 1
+relationship that hold 1
+relationship to cl 1
+relationship to growth 1
+relationship to propag 1
+relationship to util 1
+relationship to voron 1
+relationship which dep 1
+relationship which form 1
+relationship with maxrol 1
+relationship with prev 1
+relationship with proc 1
+relationship with regard 1
+relativ 3
+relativ a deux 1
+relativ a la 1
+relativ anc 1
+relativ anc com 1
+relativ au 1
+relativ au nombr 1
+relativ co 1
+relativ co uteux 1
+relativ compl 1
+relativ compl es 1
+relativ difficil 1
+relativ difficil dacc 1
+relativ dioecil 1
+relativ efficac 1
+relativ facil 1
+relativ facil ce 1
+relativ fr 1
+relativ fr equent 1
+relativ petit 1
+relativ petit compar 1
+relativ rar 1
+relativ similair 1
+relativ simpl 1
+relativ simpl de 1
+relativ vast 1
+relc 1
+relc and auxc 1
+relc and relc 1
+releg 1
+relev 32
+relev abstract 1
+relev abstract deriv 1
+relev agent 1
+relev and common 1
+relev ar ol 1
+relev assessm 1
+relev block 1
+relev block probabil 1
+relev chunk 1
+relev context 1
+relev context inform 1
+relev contribut 1
+relev dec 1
+relev dec problem 1
+relev definit 1
+relev dep 1
+relev dep dat 1
+relev edg 1
+relev fact 1
+relev featur 1
+relev feedback 1
+relev for satisf 1
+relev for solut 1
+relev for user 1
+relev in mak 1
+relev inform 4
+relev interfac 1
+relev iter 1
+relev keyword 1
+relev loc 1
+relev loc expr 1
+relev map 1
+relev method 1
+relev of gener 1
+relev parameter 1
+relev part 2
+relev port 2
+relev quant 1
+relev quant oe 1
+relev quantit 1
+relev recur 1
+relev recur string 1
+relev result 1
+relev se 1
+relev stack 1
+relev stack pointer 1
+relev step 1
+relev subexpr 1
+relev to classif 1
+relev to conv 1
+relev to maintain 1
+relev to mult 1
+relev to requir 1
+relev tw step 1
+relev weight 1
+relev weight vot 1
+relev word 1
+relev work 1
+relief 3
+relief th algorithm 1
+relief th appl 1
+relief th interfac 1
+relief user 1
+relig 1
+relig fan 1
+relig fan explan 1
+relinqu 2
+relinqu control 1
+reload 1
+reloc 1
+reloc chain 1
+relog 1
+relog ee 1
+relog ee sur 1
+relog es 1
+relog es en 1
+reloger 1
+reloger ce 1
+reloger ce repr 1
+reloger lenviron 1
+relstder 1
+relstder refer 1
+relu 1
+relu ce 1
+relu ce pap 1
+reluc 2
+reluc to rel 1
+reluc to us 1
+rem 9
+rem a jour 1
+rem a la 1
+rem ar consider 1
+rem bp 1
+rem by ad 1
+rem ed 1
+rem ed simpl 1
+rem en 2
+rem en caus 1
+rem en quest 1
+rem pa 1
+rem pa le 1
+rem red 1
+rem red arc 1
+rem simpl 1
+rem th problem 1
+rem we explor 1
+remain 83
+remain a challeng 1
+remain a path 1
+remain a problem 1
+remain abstract 1
+remain after tim 1
+remain anonym 1
+remain ar 2
+remain argum 1
+remain around cur 2
+remain attribut 1
+remain attribut agr 1
+remain avail 1
+remain backlog 1
+remain bal 2
+remain bit 1
+remain bit ind 1
+remain block 2
+remain block wait 1
+remain brok 1
+remain buck 1
+remain bundl 1
+remain ca 1
+remain candid 2
+remain candid rl 1
+remain column 1
+remain compar 1
+remain competit 1
+remain con 1
+remain const 7
+remain continu 1
+remain continu backlog 1
+remain criter 1
+remain cur 1
+remain dat 3
+remain dat item 1
+remain dat point 1
+remain dat requir 1
+remain destin 1
+remain difficult 1
+remain dim 1
+remain edg 2
+remain edg sort 1
+remain eigenvalu 1
+remain el 1
+remain elus 1
+remain empir 1
+remain empir unsubst 1
+remain empt 1
+remain equ 1
+remain experim 1
+remain fac 1
+remain fe 1
+remain featur 1
+remain featur disc 1
+remain fi 1
+remain fic 4
+remain fic impl 1
+remain finit 1
+remain fiv week 1
+remain forever 1
+remain graph 1
+remain graph denot 1
+remain hid 1
+remain high compar 1
+remain idl 2
+remain idl tim 1
+remain il typ 1
+remain in control 1
+remain in error 1
+remain in norm 1
+remain in succ 1
+remain in theor 1
+remain indirect 1
+remain indirect connect 1
+remain inner 1
+remain inner nod 1
+remain insensit 1
+remain invar 1
+remain issu 1
+remain larg 1
+remain larg unr 1
+remain loc 1
+remain loc el 1
+remain low 1
+remain mach 1
+remain mach try 1
+remain memor 1
+remain memor order 1
+remain modl 1
+remain modl compr 1
+remain nod 3
+remain non 2
+remain non determ 1
+remain non sol 1
+remain nonblock 1
+remain oper 1
+remain p2 1
+remain p2 construc 1
+remain part 3
+remain path 1
+remain pattern 1
+remain plaus 1
+remain polygon 1
+remain pract 1
+remain pract unchang 1
+remain problem 1
+remain proc 2
+remain proc follow 1
+remain pur 1
+remain remark 1
+remain remark natur 1
+remain request 1
+remain request output 1
+remain rl 1
+remain se 1
+remain sect 1
+remain separ 1
+remain server 1
+remain simil 2
+remain sit 1
+remain st 1
+remain stat 1
+remain string 2
+remain subject 1
+remain subject main 1
+remain switch 1
+remain system 1
+remain system lif 1
+remain task 1
+remain th difficult 1
+remain th main 1
+remain th prim 1
+remain thr act 1
+remain to impl 1
+remain to prov 2
+remain to show 1
+remain unaffect 1
+remain unavail 1
+remain unbound 1
+remain unchang 5
+remain unconnect 1
+remain undefin 1
+remain under util 1
+remain unmatch 1
+remain unnot 1
+remain unsatisf 1
+remain unutil 1
+remain unverif 1
+remain us 1
+remain valu 2
+remain valu o1 1
+remain vect 1
+remain vect oper 1
+remain ver 1
+remain weight 1
+remain wel typ 1
+remain work 1
+remainder 26
+remainder decl 1
+remainder is organ 1
+remainder of sect 1
+remark 37
+remark a abl 1
+remark a chang 1
+remark a cod 1
+remark a difficult 1
+remark a ge 1
+remark a mak 1
+remark a singl 1
+remark a tim 1
+remark a tool 1
+remark a troubl 1
+remark a ye 1
+remark about tim 1
+remark and conclus 1
+remark and futur 4
+remark ar pr 2
+remark de 1
+remark de no 1
+remark difficult 1
+remark ea 1
+remark flec 1
+remark flec proc 1
+remark i ii 1
+remark ii 1
+remark in sect 2
+remark int account 1
+remark mad 1
+remark natur 1
+remark on earl 1
+remark on implem 1
+remark on rel 1
+remark power 1
+remark read 1
+remark result 1
+remark th situ 1
+remark that individu 1
+remark wer mad 1
+remarqu 3
+remarqu concern 1
+remarqu concern le 1
+remarqu dun 1
+remarqu dun biolog 1
+remarqu e dun 1
+remarqu es 1
+remarqu es lor 1
+remarqu pertin 1
+remarqu pertin mont 1
+remarqu pr 1
+remarqu pr ec 1
+remarqu qu 1
+remarqu qu la 1
+remarqu qu le 1
+remarqu sappliqu 1
+remarqu sappliqu au 1
+remarqu suiv 1
+remarqu sur 1
+remarqu sur le 1
+remarquabl 1
+remarquer 3
+remarquer le 1
+remarquer le princip 1
+remarquer qu 3
+remarquer qu dan 1
+remarquer qu le 2
+remarquer qu lorsqu 1
+remarquon 2
+remarquon qu 2
+remember 18
+remember n 2k 1
+remember rang 1
+remember se 1
+remember th bind 1
+remember wh 1
+remember what fac 1
+rement 1
+rement automatiqu 1
+rement com 1
+rement import 1
+rement sur 1
+rement sur de 1
+rement sur lestim 1
+remerc 3
+remerc daniel 1
+remerc daniel le 1
+remerc e davoir 1
+remerc le 2
+remerc le person 2
+remerc mon 1
+remerc mon directeur 1
+remerc pasc 1
+remerc pasc lemon 1
+remerc pour 1
+remerc pour lint 1
+remerc r em 1
+remettr 1
+remettr a jour 1
+remettr bp 1
+remind 5
+remind and learn 1
+remind me 1
+remind me aqu 1
+remind th axiom 1
+remind th reader 2
+reminisc 4
+reminisc of ar 1
+reminisc of funct 1
+remot 26
+remot acc 1
+remot architectur 1
+remot collabor 2
+remot collabor work 1
+remot conver 1
+remot cooper 1
+remot dat 1
+remot docum 1
+remot docum deliv 1
+remot fil 1
+remot link 1
+remot login 1
+remot mach 1
+remot me 1
+remot me support 1
+remot memor 5
+remot memor acc 5
+remot memor loc 1
+remot nod 2
+remot nod se 1
+remot object 1
+remot pag 1
+remot pag fault 1
+remot particl 1
+remot particl posit 1
+remot proc 4
+remot procedur 2
+remot procedur cal 2
+remot read 2
+remot read fault 1
+remot real tim 1
+remot reg 1
+remot reg appear 1
+remot request 1
+remot request funct 1
+remot respon 1
+remot server 3
+remot sharedworkspac 1
+remot sharedworkspac collabor 1
+remot sit 1
+remot sit master 1
+remot through www 1
+remot upd 1
+remot user 1
+remot writ 2
+remot writ fault 1
+remov 58
+remov a leaf 1
+remov a method 1
+remov a nod 1
+remov a wir 1
+remov ad 1
+remov addit 1
+remov addit inst 1
+remov al item 1
+remov al nod 1
+remov al prim 1
+remov al redund 1
+remov al sequ 1
+remov al ver 1
+remov an edg 1
+remov an inst 1
+remov and fir 1
+remov and reorder 1
+remov any dupl 1
+remov any inst 1
+remov any link 1
+remov begin 1
+remov block 1
+remov block effect 1
+remov border 1
+remov border point 1
+remov center 1
+remov center point 1
+remov cl border 1
+remov criter 1
+remov direct 1
+remov direct path 1
+remov domain 1
+remov domain specif 1
+remov dupl 1
+remov dupl connect 1
+remov dupl path 1
+remov each inst 1
+remov eff 1
+remov entir 1
+remov entir cluster 1
+remov extern 1
+remov extern tetrahedr 1
+remov from t0 1
+remov high degr 1
+remov in low 1
+remov inclus 1
+remov inclus fil 1
+remov incon 1
+remov incon valu 1
+remov inst 1
+remov inst furthest 1
+remov inst random 1
+remov instruc 1
+remov instruc decod 1
+remov interpr 1
+remov interpr using 1
+remov is improv 1
+remov issu 1
+remov key 1
+remov key featur 1
+remov leav 1
+remov lin 1
+remov link 1
+remov log 1
+remov log undesir 1
+remov maxrol 1
+remov minrol 1
+remov mor compl 1
+remov no 1
+remov no inst 1
+remov nor method 1
+remov of inst 1
+remov of stairc 1
+remov of text 1
+remov on liter 1
+remov or chang 1
+remov or renam 1
+remov other 1
+remov p caus 1
+remov pag 1
+remov point 1
+remov random 1
+remov random compl 1
+remov redund 3
+remov redund arc 1
+remov redund constraint 1
+remov redund me 1
+remov redund privileg 1
+remov regard 1
+remov result 1
+remov ri 1
+remov separ 1
+remov smal reg 1
+remov spot 1
+remov spot no 1
+remov such claus 1
+remov t subsum 1
+remov tetrahedr 1
+remov text 1
+remov th 2k 1
+remov th assum 1
+remov th bi 1
+remov th compact 1
+remov th dangl 1
+remov th dat 1
+remov th effect 1
+remov th facil 1
+remov th gener 1
+remov th item 1
+remov th key 1
+remov th largest 1
+remov th lim 1
+remov th link 1
+remov th me 1
+remov th memor 1
+remov th n0 1
+remov th nlogn 1
+remov th no 1
+remov th nod 1
+remov th old 1
+remov th oper 1
+remov th order 1
+remov th pointer 1
+remov th port 1
+remov th rl 1
+remov th sign 1
+remov th ver 1
+remov th worker 1
+remov that me 1
+remov them.6 1
+remov to tak 1
+remov using 2
+remov using no 1
+remov using rt3 1
+remov wa record 1
+remov when modl 1
+remov with rel 1
+remov without affect 1
+remov would caus 1
+rempl 2
+rempl cant la 1
+rempl cant le 1
+rempl cant par 1
+rempl cant sa 1
+rempl par 1
+rempl par linit 1
+remplac 3
+remplac chaqu 1
+remplac chaqu term 1
+remplac dan 1
+remplac dan le 1
+remplac de 1
+remplac de man 1
+remplac destructif 1
+remplac destructif etant 1
+remplac destructiv 1
+remplac destructiv largum 1
+remplac dinstruc 1
+remplac dinstruc put 1
+remplac dun 1
+remplac dun fa 1
+remplac e est 1
+remplac e nest 1
+remplac e par 1
+remplac ee 2
+remplac ee de 1
+remplac ee par 2
+remplac es 1
+remplac es par 1
+remplac le 1
+remplac le calcl 1
+remplacer 2
+remplacer ce 1
+remplacer ce coupur 1
+remplacer ce instruc 1
+remplacer dan 1
+remplacer dan chaqu 1
+remplacer destructiv 1
+remplacer destructiv largum 1
+remplacer laut 1
+remplacer laut ef 1
+remplacer le 2
+remplacer le contenu 1
+remplacer lec 1
+remplacer lec ecut 1
+remplacer linstruc 1
+remplacer linstruc retr 1
+remplacer linstruc trust 1
+remplacer tous 1
+remplacer tous le 1
+remplacer un term 1
+remplacer xh 1
+remplacer xh par 1
+remplit 1
+remplit le 1
+remplit le champ 1
+ren 7
+ren beaucoup 1
+ren ce 2
+ren ce architectur 1
+ren ce deux 1
+ren ced 1
+ren ced franc 1
+ren de 1
+ren deux 1
+ren deux term 1
+ren et en 1
+ren fondam 1
+ren i ment 1
+ren imp 1
+ren imp la 1
+ren imp lec 1
+ren imp un 1
+ren inaccessibl 1
+ren inaccessibl le 1
+ren incompatibl 1
+ren incompatibl lectur 1
+ren inconditionnel 1
+ren inconditionnel tout 1
+ren intern 1
+ren intern le 1
+ren la 2
+ren la gest 1
+ren la liaison 1
+ren la recherch 1
+ren laffect 1
+ren laffect destruc 1
+ren le 2
+ren le acc 1
+ren le born 1
+ren le mi 1
+ren le temp 1
+ren leur 1
+ren leur util 1
+ren loccur 1
+ren loccur dun 1
+ren n ecessair 1
+ren pa 1
+ren pa encor 1
+ren peu 1
+ren peu efficac 1
+ren physiolog 1
+ren plus facil 1
+ren po de 1
+ren po la 1
+ren po part 1
+ren po un 2
+ren r egl 1
+ren tr 1
+ren tr es 1
+ren un 1
+ren un bar 1
+renam 13
+renam a member 1
+renam ae 1
+renam and branch 1
+renam and chang 1
+renam and disambigu 1
+renam and expan 1
+renam and scal 1
+renam any number 1
+renam apart 1
+renam apart claus 1
+renam apart el 1
+renam apart proper 1
+renam apart ver 1
+renam branch 1
+renam branch jump 1
+renam decl 1
+renam direct 1
+renam du 1
+renam filter 1
+renam funct 1
+renam funct nam 1
+renam ind 1
+renam ind vi 1
+renam is appl 1
+renam is extrem 1
+renam is select 1
+renam occur 1
+renam of stack 1
+renam of variabl 1
+renam of ver 1
+renam on import 1
+renam pair 1
+renam renam 1
+renam renam branch 1
+renam select 1
+renam select rl 1
+renam standard 1
+renam th attribut 1
+renam th bind 1
+renam th nam 1
+renam th schem 1
+renam th var 1
+renam to common 1
+renam to natsort 1
+renam to z1 1
+renam ver 1
+renc 2
+renc fa 1
+renc fort 1
+rencontr 2
+rencontr ee 1
+rencontr ee dan 1
+rencontr ee depu 1
+rencontr es 1
+rencontr s dan 1
+rendait 1
+rendait imp 1
+rendait imp le 1
+render 16
+render a test 1
+render a theor 1
+render algorithm 2
+render algorithm describ 1
+render and direct 1
+render as nest 1
+render cl 1
+render cl log 1
+render hardwar 1
+render hardwar found 1
+render it intern 1
+render it polygon 1
+render larger 1
+render larger problem 1
+render model 1
+render of irregl 1
+render of molecl 1
+render on standard 1
+render th approach 1
+render th figur 1
+render th form 1
+render th order 1
+render them sever 1
+render typ 1
+render typ correct 1
+render using 2
+render using tr 2
+render.1 1
+render.1 to evalu 1
+renderer 1
+renderer gener 1
+renderer gener tak 1
+rendezv 1
+rendezv point 1
+rendr 2
+rendr a multipl 1
+rendr acc 1
+rendr appl 1
+rendr appl un 1
+rendr artificiel 1
+rendr artificiel unimodulair 1
+rendr automatiqu 1
+rendr ce 1
+rendr ce pr 1
+rendr efficac 1
+rendr explicit 1
+rendr explicit tout 1
+rendr il egal 1
+rendr intern 1
+rendr intern ce 1
+rendr intern la 1
+rendr intern un 1
+rendr l egal 1
+rendr le 2
+rendr le retour 1
+rendr po de 1
+rendr po lam 1
+rendr r ever 1
+rendrait 1
+rendrait difficil 1
+rendrait difficil compr 1
+rendu 3
+rendu assez 1
+rendu assez epineux 1
+rendu difficil 1
+rendu difficil lorsqu 1
+rendu imp 1
+rendu imp par 1
+rendu op 1
+rendu op erationnel 1
+rendu po en 1
+rendu pr 1
+rendu pr ec 1
+rendu transpar 1
+rendu transpar par 1
+renegar 1
+renfor 1
+renfor con 1
+renfor con le 1
+renforc 2
+renforc e par 1
+renforc est 1
+renforc est ba 1
+renforcer 1
+renforcer le 1
+renforcer le taux 1
+rengarajan 1
+renom 1
+renom de 1
+renom de variabl 1
+renom ee 1
+renom ee term 1
+renommer 1
+renommer le 1
+renommer le variabl 1
+renorm 2
+renorm output 1
+rent 3
+rent dop 1
+rent et non 1
+rent qu 1
+rent suiv 1
+rent suiv le 1
+rent typ 1
+rent typ de 1
+rentiel 1
+rentiel de 1
+rentiel de la 1
+rentiel et rieman 1
+rentiel prot 1
+rentiel prot in 1
+rentiel qu 1
+rentiel qu nest 1
+rentr 1
+rentr pa 1
+rentr pa dan 1
+rentreron 1
+rentreron donc 1
+rentreron donc pa 1
+reon 1
+reon of myoglobin 1
+reop 2
+reop th fil 1
+reorder 12
+reorder by shuffl 1
+reorder complec 1
+reorder complec expr 1
+reorder funct 1
+reorder funct parameter 1
+reorder me 1
+reorder of contextu 1
+reorder schem 1
+reorder strateg 1
+reorder th column 1
+reorder th structur 1
+reorder th subtr 1
+reorder transform 1
+reorder when format 1
+reorgan 4
+reorgan approach 1
+reorgan of menus 1
+reorgan th cl 1
+reorthogon 1
+reorthogon step 1
+rep 24
+rep and invok 1
+rep and remov 1
+rep and touch 1
+rep ar triangl 1
+rep aus 1
+rep aus sur 1
+rep can arrang 1
+rep can tak 1
+rep ce 1
+rep ce travail 1
+rep e ver 1
+rep ee 1
+rep ee au 1
+rep ent 1
+rep erent 1
+rep erent le 1
+rep essentiel 1
+rep essentiel sur 1
+rep evalu 1
+rep evalu algorithm 1
+rep exper 1
+rep from complec 1
+rep from csg 1
+rep g0 1
+rep g0 st 1
+rep init 1
+rep init condit 1
+rep just creat 1
+rep me 1
+rep method 1
+rep pack 1
+rep re 1
+rep re dan 1
+rep re sem 1
+rep re sont 1
+rep rel 1
+rep rel ab 1
+rep should contain 1
+rep sur 5
+rep sur ce 1
+rep sur le 1
+rep sur leur 1
+rep sur lexploit 1
+rep sur lobserv 1
+rep sur lutil 1
+rep sur un 3
+rep that contain 1
+rep that repr 1
+rep to qu 1
+rep train 1
+rep train event 1
+rep train iter 1
+rep train sequ 1
+rep valu 1
+rep ver quick 1
+rep ye 1
+repair 4
+repair a link 1
+repair and maint 1
+repair at tim 1
+repair event 1
+repair link 1
+repair link becom 1
+repair occur 1
+repair of link 1
+repair of nod 1
+repair proc 1
+repair th problem 1
+repair.5 1
+repair.5 we def 1
+repart 1
+repart en 1
+repart en avant 1
+repasser 1
+repasser par 1
+repasser par linterm 1
+repc 1
+repeat 52
+repeat acc 1
+repeat and unnec 1
+repeat appl 5
+repeat ask 1
+repeat bool 1
+repeat bool lem 1
+repeat c group 1
+repeat cal 1
+repeat ch 2
+repeat circl 1
+repeat circl exact 1
+repeat comput 1
+repeat construc 1
+repeat construc joint 1
+repeat each experim 1
+repeat endif 1
+repeat endif return 1
+repeat fail 1
+repeat fail loop 1
+repeat fir 1
+repeat fir rl 1
+repeat hist 1
+repeat if lp 1
+repeat if lpjlock 1
+repeat if xp 1
+repeat if xq 1
+repeat if yp 1
+repeat interchang 1
+repeat is propag 1
+repeat length 1
+repeat length definit 1
+repeat letter 1
+repeat loop 1
+repeat man tim 1
+repeat mov 1
+repeat n tim 3
+repeat perform 1
+repeat perform unit 1
+repeat recur 1
+repeat regp 1
+repeat remov 1
+repeat repeat 1
+repeat repeat regp 1
+repeat sa 1
+repeat select 2
+repeat select uniqu 1
+repeat sen 1
+repeat sen request 1
+repeat simil 1
+repeat simil failur 1
+repeat step 3
+repeat subdivid 1
+repeat subdivid vol 1
+repeat substitut 1
+repeat th cm 1
+repeat th failur 1
+repeat th mistak 1
+repeat th ms 1
+repeat th oper 1
+repeat th oper. 1
+repeat th point 1
+repeat th proc 3
+repeat th proof 1
+repeat th result 1
+repeat th uncoar 1
+repeat that mi 1
+repeat to mov 1
+repeat tw 1
+repeat tw loop 1
+repeat until classif 1
+repeat upd 1
+repeat us 1
+repeat using 1
+repeat zer 1
+reperc 2
+reperc in term 1
+repertoir 2
+repertoir of luc 1
+repertoir of method 1
+repertoir of standard 1
+repetit 15
+repetit and narrow 1
+repetit cl 2
+repetit edg 1
+repetit is nec 1
+repetit natur 1
+repetit of equiv 1
+repetit of proc 1
+repetit of swap 1
+repetit pattern 1
+repetit requir 1
+repetit sequ 1
+repetit sequ protein 1
+repetit task 1
+repetit ver 1
+repetit ver vt 1
+rephr 1
+rephr our recur 1
+repl 23
+repl a multidest 1
+repl actu 1
+repl actu perform 1
+repl and centr 1
+repl and distribut 2
+repl and induc 1
+repl ar 1
+repl becaus multipl 1
+repl block 2
+repl block cl 1
+repl block handl 1
+repl block tim 1
+repl but wish 1
+repl by window 1
+repl cap 1
+repl cl 1
+repl cl embod 1
+repl cl man 1
+repl dat 5
+repl dat structur 1
+repl debug 1
+repl debug se 1
+repl degr 1
+repl down 1
+repl ea 1
+repl execut 1
+repl execut mod 1
+repl experim 1
+repl flit 1
+repl for exampl 1
+repl for gener 1
+repl from diverg 1
+repl giv 1
+repl header 1
+repl header chunk 1
+repl implem 1
+repl in bil 1
+repl in me 1
+repl invoc 1
+repl is requir 1
+repl is suscept 1
+repl lat 1
+repl lat decr 1
+repl le number 2
+repl mak 1
+repl mak progr 1
+repl mechan 1
+repl method 1
+repl mod 1
+repl nod 1
+repl number 1
+repl object 1
+repl object cl 1
+repl object gener 1
+repl occur 1
+repl occur lat 1
+repl of dat 1
+repl of experim 1
+repl of multidest 1
+repl of record 1
+repl on 1
+repl on disk 1
+repl on tout 1
+repl or mirror 1
+repl output 1
+repl output pack 1
+repl pol 1
+repl problem 1
+repl protocol 1
+repl prov 1
+repl prov support 1
+repl reg 1
+repl requir 2
+repl schem 2
+repl schem exhibit 1
+repl serv 1
+repl step 1
+repl step follow 1
+repl th com 1
+repl th hardwar 1
+repl th log 1
+repl th me 1
+repl th serv 1
+repl th singl 1
+repl to facilit 1
+repl to improv 1
+repl to prov 1
+repl tw 1
+replac 72
+replac a typ 1
+replac al vi. 1
+replac algorithm 2
+replac an edg 1
+replac an md 1
+replac an occur 1
+replac an old 1
+replac ar inappropr 1
+replac ar modif 1
+replac ar refer 1
+replac behavior 1
+replac behavior inv 1
+replac behavior involut 1
+replac bfather 1
+replac bfather env 1
+replac bool 1
+replac by induc 1
+replac by level 1
+replac by loc 1
+replac by maxint 1
+replac by measur 1
+replac by non 1
+replac by po 1
+replac by proposit 1
+replac by suit 1
+replac by weaker 1
+replac c cod 1
+replac common 1
+replac common argum 1
+replac concr 1
+replac concr emb 1
+replac concur 1
+replac contain 1
+replac each ba 1
+replac each ik 1
+replac each occur 1
+replac each sign 1
+replac each stat 1
+replac each typ 1
+replac equ 1
+replac ev string 1
+replac evcont 1
+replac for prev 1
+replac group 1
+replac in currnod 1
+replac in oe 1
+replac it jth 1
+replac le 1
+replac le si 1
+replac lem 1
+replac list 1
+replac lock 1
+replac nor interfer 1
+replac of d2 1
+replac of glob 1
+replac on fr 1
+replac oper 1
+replac osl 1
+replac osl intern 1
+replac p isomorph 1
+replac pb1 1
+replac refer 1
+replac s tvar 1
+replac siftdown 1
+replac siftdown everywh 1
+replac targ 1
+replac telephon 1
+replac telephon number 1
+replac th acquaint 1
+replac th ba 1
+replac th bs 1
+replac th cal 1
+replac th concr 1
+replac th fin 1
+replac th float 1
+replac th guard 1
+replac th imag 1
+replac th irregl 1
+replac th occur 1
+replac th remain 1
+replac th rl 1
+replac th select 2
+replac th sen 1
+replac th subsystem 1
+replac th tr 1
+replac th var 1
+replac that edg 1
+replac usl.123 1
+replac usl.123 usl.128totinf 1
+replac util 1
+replac v1 1
+replac with act 1
+replac with dat 1
+replac with produc 1
+report 109
+report a list 1
+report a low 1
+report a var 2
+report a vid 1
+report adag 1
+report adag ibm 1
+report algorithm 1
+report an error 1
+report an evalu 1
+report and chang 1
+report and not 1
+report anl 1
+report ar avail 1
+report ar extrem 1
+report ar pl 1
+report as detect 1
+report as outl 1
+report as unsatisf 1
+report at compil 1
+report at ftp.tw.tudelft.nl 1
+report bw106 1
+report by billionnet 1
+report by cameron 1
+report by garlan 1
+report by wild 1
+report by zarndt 1
+report ca 1
+report cd 1
+report cd tr 1
+report ceng 1
+report ci 1
+report ci tr 1
+report coin 1
+report coin techn 1
+report crcc 1
+report crl90 1
+report crpc 1
+report crpc tr92214 1
+report cs 12
+report cs tr 6
+report cs94 1
+report csc 1
+report csc tr 1
+report csd 2
+report csm 1
+report csr 1
+report cu 1
+report cu cs 1
+report describ 1
+report detail 2
+report di 1
+report doc 1
+report docum 1
+report docum progr 1
+report dp 1
+report ec 2
+report ec lfc 2
+report eff 1
+report eff schedl 1
+report error 1
+report es 1
+report es correspon 1
+report experim 2
+report experim result 1
+report experim us 1
+report facil 1
+report fk 2
+report fn 1
+report from november 1
+report gg24 1
+report git 2
+report git cc 1
+report git gvu 1
+report he prov 1
+report he show 1
+report ii 1
+report ii rr 1
+report in refer 1
+report in sect 1
+report in tabl 2
+report in zhang 1
+report informatik 1
+report informatik bericht 1
+report is avail 2
+report is ba 1
+report is du 1
+report is inadequ 1
+report is organ 2
+report it status 1
+report jhu 1
+report ke.u.87.13 1
+report kf 1
+report kf zam 1
+report la 1
+report lag 1
+report lim 1
+report list 1
+report list publ 1
+report litp 1
+report liv 1
+report lp 1
+report me 1
+report mi 1
+report mi lc 1
+report msu 1
+report msu cp 1
+report mt 1
+report mt ad 1
+report ni 1
+report no.1658 1
+report nr 2
+report nu 1
+report nu cc 1
+report number 2
+report number cs95 1
+report occ 1
+report occ paper 1
+report on character 1
+report on haskel 1
+report on schem 1
+report oper 1
+report optim 1
+report optim algorithm 1
+report osu 5
+report osu ci 1
+report osu cisrc 4
+report our result 1
+report pr 1
+report prepar 1
+report prg 1
+report prg tr 1
+report prg tr10 1
+report qutnrc 1
+report r90005 1
+report r93 1
+report r95 1
+report r96 1
+report rc 2
+report rc16431 1
+report rc16606 1
+report rc18139 1
+report result 1
+report ric 1
+report rj 1
+report rj5244 1
+report rj6649 1
+report rnr 1
+report rr 1
+report ruu 1
+report ruu cs 1
+report sand88 1
+report sand92 1
+report sand93 2
+report sc 1
+report sc tr 1
+report ser 3
+report ser report 1
+report sf 1
+report sf tr 1
+report sg 1
+report sg manuscript 1
+report simil 1
+report simil result 1
+report sr 2
+report sr csl 2
+report src 2
+report src research 1
+report src tr 1
+report stat 1
+report stat95 1
+report stud 1
+report system 1
+report t91 1
+report tcm 1
+report td 1
+report techn 2
+report techn report 2
+report test 1
+report test inform 1
+report th aver 1
+report th branch 1
+report th minim 1
+report th observ 1
+report th qu 1
+report th result 1
+report th run 1
+report th trac 1
+report that count 1
+report that grad 1
+report that tim 1
+report their stud 1
+report tr 9
+report tr91 2
+report tr93 1
+report trc 1
+report ucsc 1
+report uiucdc 2
+report umiac 5
+report umiac tr 5
+report using 1
+report uuc 1
+report uuc tr 1
+report uw 1
+report uw cs 1
+report ver 1
+report wh 1
+report which return 1
+report wil appear 1
+report writ 1
+report yc 1
+report.ps 1
+report2b 1
+report2b return 1
+report2b return oe1 1
+reporter 1
+reporter a rain 1
+reporter pour 1
+reporter pour suivr 1
+reportk 1
+reportk that return 1
+reposer 1
+reposer la 1
+reposer la gest 1
+reposerait 1
+reposerait sur 1
+reposerait sur la 1
+reposeront 1
+reposeront lespac 1
+reposeront lespac dadr 1
+reposit 5
+reposit and libr 1
+reposit c1 1
+reposit for individu 1
+reposit manager 1
+reposit manager maintain 1
+reposit of mach 1
+reposit th record 1
+repousser 1
+repousser le 1
+repousser le acc 1
+repr 113
+repr 2g 1
+repr 2g distinct 1
+repr a 2x2 1
+repr a black 1
+repr a categor 1
+repr a cl 1
+repr a cluster 1
+repr a color 1
+repr a common 1
+repr a configur 1
+repr a convec 1
+repr a cover 1
+repr a csg 1
+repr a danger 1
+repr a datab 1
+repr a fair 1
+repr a funct 1
+repr a gap 1
+repr a gener 2
+repr a heap 1
+repr a high 1
+repr a job 1
+repr a land 1
+repr a leg 1
+repr a log 1
+repr a mean 1
+repr a menu 1
+repr a network 1
+repr a nonblock 1
+repr a parallel 1
+repr a particl 1
+repr a partof 1
+repr a permut 1
+repr a polyhedr 1
+repr a posit 1
+repr a qu 1
+repr a reduc 1
+repr a rel 1
+repr a sc 1
+repr a se 1
+repr a singl 1
+repr a sl 1
+repr a spac 1
+repr a string 1
+repr a sub 1
+repr a substr 1
+repr a system 1
+repr a t1 1
+repr a t2 1
+repr a task 1
+repr a tripl 1
+repr a typ 1
+repr a uniqu 1
+repr a valu 1
+repr accur 2
+repr accur giv 1
+repr act 2
+repr act proc 1
+repr adjac 1
+repr adjac crossect 1
+repr adjac sl 1
+repr affect 1
+repr al allow 1
+repr al memor 1
+repr al tupl 1
+repr allow 1
+repr altern 1
+repr altern implem 1
+repr an ant 1
+repr an assignm 1
+repr an edg 1
+repr an es 1
+repr an estim 1
+repr an imag 1
+repr an incr 1
+repr an inst 1
+repr an is 1
+repr an outg 1
+repr an unbound 1
+repr an uncolor 1
+repr analogu 1
+repr analogu quant 1
+repr and autom 1
+repr and check 1
+repr and estim 1
+repr and induc 1
+repr and inexact 1
+repr and par 1
+repr and propag 1
+repr and reason 2
+repr and train 1
+repr and transform 1
+repr and us 1
+repr another intersect 1
+repr any assoc 1
+repr apath 1
+repr approach 1
+repr ar appropr 1
+repr ar assum 1
+repr ar known 1
+repr ar tak 1
+repr architectur 2
+repr architectur character 2
+repr as ddm 1
+repr as fi 1
+repr as follow 3
+repr as group 1
+repr as individu 1
+repr as rectangl 1
+repr as string 1
+repr as targ 1
+repr as tim 1
+repr as tripl 2
+repr as tupl 1
+repr as var 1
+repr assoc 2
+repr avail 1
+repr avail color 1
+repr babel 1
+repr babel comput 1
+repr backtrack 1
+repr bandwidth 1
+repr bandwidth comsum 1
+repr block 2
+repr block match 1
+repr by abstract 1
+repr by attribut 1
+repr by circl 1
+repr by discontin 1
+repr by distribut 1
+repr by dot 1
+repr by error 1
+repr by gener 1
+repr by horizont 1
+repr by hybrid 1
+repr by lin 1
+repr by mean 1
+repr by nop 1
+repr by ol 1
+repr by part 1
+repr by perpetu 1
+repr by pointer 1
+repr by polynom 1
+repr by rectangl 1
+repr by shad 1
+repr by sol 1
+repr by spher 1
+repr by variabl 1
+repr by ver 1
+repr by w0 1
+repr ca 1
+repr ca stat 1
+repr can mak 1
+repr can yield 1
+repr capabil 1
+repr chang 1
+repr collect 2
+repr color 1
+repr color list 1
+repr con 1
+repr conceptu 1
+repr constraint 1
+repr cont 1
+repr control 2
+repr control dep 1
+repr control path 1
+repr conver 1
+repr cpu 1
+repr cpu load 1
+repr cub 1
+repr dan 1
+repr dan larticl 1
+repr dat 2
+repr dat dep 1
+repr decl 1
+repr del 1
+repr del dec 1
+repr demand 2
+repr demand bisect 2
+repr dep 1
+repr dep inform 1
+repr describ 1
+repr diagon 1
+repr discr 1
+repr discr grid 1
+repr domain 1
+repr domain knowledg 1
+repr each fault 1
+repr each opt 1
+repr each polyhedr 1
+repr edg 1
+repr en 1
+repr entr 1
+repr equiv 1
+repr equiv st 1
+repr es 3
+repr es aff 1
+repr es au 1
+repr es avait 1
+repr es binair 1
+repr es chromosomiqu 1
+repr es con 1
+repr es de 3
+repr es direct 1
+repr es dispon 1
+repr es dit 1
+repr es du 1
+repr es dun 1
+repr es est 1
+repr es eucl 1
+repr es init 1
+repr es math 1
+repr es ne 1
+repr es par 1
+repr es planair 1
+repr es pour 1
+repr es qu 1
+repr es sous 1
+repr es sp 1
+repr es sur 1
+repr es tout 1
+repr es util 1
+repr esent 6
+repr esent canoniqu 1
+repr esent dan 1
+repr esent de 2
+repr esent ee 3
+repr esent es 2
+repr esent la 3
+repr esent le 3
+repr esent lensembl 1
+repr esent lim 1
+repr esent limpl 1
+repr esent pa 1
+repr esent pour 1
+repr esent respectiv 1
+repr esent un 2
+repr esent vi 1
+repr esenter 3
+repr esenter la 1
+repr esenter le 1
+repr esenter un 2
+repr esenter vi 1
+repr ev el 1
+repr except 1
+repr except situ 1
+repr execut 1
+repr explicit 2
+repr fac 1
+repr fac norm 1
+repr failur 1
+repr fal 1
+repr featur 1
+repr featur vect 1
+repr fl 1
+repr fl bandwidth 1
+repr for bind 1
+repr for ca 1
+repr for cl 1
+repr for dec 1
+repr for distribut 2
+repr for exampl 1
+repr for loc 1
+repr for reason 1
+repr for rigid 1
+repr for situ 1
+repr for succ 1
+repr format 1
+repr framecr 1
+repr framecr point 1
+repr gener 1
+repr hom 1
+repr hom list 1
+repr imag 1
+repr imag fram 1
+repr in digit 1
+repr in imag 1
+repr in term 1
+repr inact 1
+repr inact proc 1
+repr inclus 1
+repr individu 1
+repr individu pag 1
+repr input 2
+repr input unrestrict 1
+repr instead 1
+repr int 1
+repr int asynchron 1
+repr integer 1
+repr integer div 1
+repr is appropr 1
+repr is parameter 2
+repr is pur 1
+repr is therefor 1
+repr is unusu 1
+repr issu 1
+repr it main 1
+repr job 1
+repr la 1
+repr la mi 1
+repr la valeur 1
+repr langu 2
+repr le 2
+repr le valeur 1
+repr leader 1
+repr lexempl 1
+repr lexempl de 1
+repr maintain 1
+repr me 1
+repr me xp 1
+repr mor principl 1
+repr mult 1
+repr mult union 1
+repr nonuniform 1
+repr object 1
+repr of actu 1
+repr of anatom 1
+repr of chang 1
+repr of chord 1
+repr of constraint 1
+repr of control 1
+repr of dat 1
+repr of docum 1
+repr of environm 1
+repr of equiv 1
+repr of gener 2
+repr of hybrid 1
+repr of infinit 1
+repr of input 2
+repr of inter 2
+repr of introspect 1
+repr of knowledg 3
+repr of label 1
+repr of log 1
+repr of method 1
+repr of object 1
+repr of oe 1
+repr of pasc 1
+repr of phy 1
+repr of prev 1
+repr of quadtr 1
+repr of sign 1
+repr of signif 1
+repr of spat 2
+repr of st 1
+repr of structur 1
+repr of succeed 1
+repr of switch 1
+repr of tempor 1
+repr of triangl 1
+repr of typ 1
+repr of unbound 1
+repr of variabl 1
+repr of zfc 1
+repr off 1
+repr off pol 1
+repr on distinct 1
+repr on iter 1
+repr on st 1
+repr oper 1
+repr ordin 1
+repr ordin monot 1
+repr output 1
+repr pack 1
+repr pack ad 1
+repr perceiv 1
+repr perceiv system 1
+repr pictur 1
+repr pl 1
+repr platform 1
+repr po 1
+repr po architectur 1
+repr po infinit 1
+repr polyhedr 1
+repr polynom 1
+repr polynom constraint 1
+repr posit 1
+repr power 1
+repr predefin 1
+repr predefin execut 1
+repr pressur 1
+repr problem 1
+repr problem inst 1
+repr proc 2
+repr proc demand 2
+repr q0 1
+repr q1 1
+repr quadtr 1
+repr r proc 1
+repr rectangl 1
+repr refin 1
+repr rel 1
+repr rel rep 1
+repr requir 2
+repr result 1
+repr return 1
+repr s proc 1
+repr sampl 1
+repr schem 1
+repr se 1
+repr sem 1
+repr sem inform 1
+repr sent 2
+repr sent aff 1
+repr sent de 1
+repr sent discr 1
+repr sent la 1
+repr sent param 1
+repr sent tout 1
+repr senter 1
+repr show 1
+repr signif 2
+repr signif compon 1
+repr signif progr 1
+repr simil 2
+repr simpl 1
+repr simpl stat 1
+repr singl 1
+repr singl valu 1
+repr solut 1
+repr som configur 1
+repr som vol 1
+repr somewh 1
+repr squar 1
+repr ssm 1
+repr st 2
+repr st vect 1
+repr such overhead 1
+repr surfac 1
+repr surfac knowledg 1
+repr switch 1
+repr switch q3 1
+repr switch q4 1
+repr task 2
+repr term 1
+repr th ab 1
+repr th actu 1
+repr th ad 1
+repr th amount 1
+repr th appl 1
+repr th attribut 2
+repr th aver 1
+repr th ba 1
+repr th behavior 1
+repr th bfather 1
+repr th block 1
+repr th boolean 1
+repr th cl 1
+repr th commun 1
+repr th compl 2
+repr th concept 1
+repr th condit 1
+repr th construc 1
+repr th contour 1
+repr th corrupt 1
+repr th cost 1
+repr th cr 1
+repr th cur 4
+repr th cut 1
+repr th demand 2
+repr th dep 1
+repr th desir 1
+repr th dest 1
+repr th dist 1
+repr th domain 1
+repr th edg 1
+repr th elap 1
+repr th endpoint 1
+repr th entir 1
+repr th estim 1
+repr th exclus 1
+repr th execut 2
+repr th expect 2
+repr th explan 1
+repr th featur 1
+repr th fin 1
+repr th finit 1
+repr th flow 1
+repr th fundam 1
+repr th hist 1
+repr th impact 1
+repr th indiv 1
+repr th input 1
+repr th inst 1
+repr th integr 1
+repr th interior 1
+repr th is 1
+repr th job 1
+repr th jth 1
+repr th knowledg 1
+repr th length 1
+repr th lin 2
+repr th loc 1
+repr th low 1
+repr th maxim 1
+repr th mbr 1
+repr th me 1
+repr th mean 1
+repr th meter 1
+repr th method 1
+repr th multiplec 1
+repr th network 1
+repr th nonstrict 1
+repr th number 3
+repr th object 1
+repr th off 1
+repr th organ 1
+repr th output 2
+repr th pack 1
+repr th pattern 1
+repr th permut 1
+repr th pith 1
+repr th port 1
+repr th posit 1
+repr th pr 1
+repr th proc 2
+repr th quot 1
+repr th rel 1
+repr th remain 1
+repr th resourc 1
+repr th result 1
+repr th se 2
+repr th sit 1
+repr th skil 1
+repr th sniff 1
+repr th solut 1
+repr th sourc 1
+repr th span 1
+repr th st 5
+repr th standard 1
+repr th start 1
+repr th structur 2
+repr th stud 1
+repr th subtr 1
+repr th supertyp 1
+repr th switch 1
+repr th task 1
+repr th term 1
+repr th tim 1
+repr th tot 2
+repr th tr 1
+repr th trac 1
+repr th tren 2
+repr th uncolor 1
+repr th understand 1
+repr th univer 1
+repr th unrestrict 1
+repr th upcom 1
+repr th us 1
+repr th wid 1
+repr th worst 1
+repr theorem 1
+repr tim 1
+repr tim step 1
+repr tl 1
+repr to learn 1
+repr to overcom 1
+repr to support 1
+repr toggl 1
+repr topolog 1
+repr topolog distinct 1
+repr tp 1
+repr tr 1
+repr tr edg 1
+repr tru stat 1
+repr tw altern 1
+repr typ 1
+repr typ inform 1
+repr um 1
+repr um lacun 1
+repr unrestrict 1
+repr unrestrict rel 1
+repr using 2
+repr using dat 1
+repr valu 3
+repr var 1
+repr var level 1
+repr vect 1
+repr veg 1
+repr veg typ 1
+repr vi log 1
+repr with link 1
+repr without rel 1
+repr. 2
+reprel 1
+reprenon 1
+reprenon ic 1
+reprenon ic avec 1
+reprint 4
+reprint in shafer 1
+reprint or leg 1
+reprodu 1
+reproduc 14
+reproduc direct 1
+reproduc direct inspir 1
+reproduc est 1
+reproduc et le 1
+reproduc identif 1
+reproduc identif behaviour 1
+reproduc lop 1
+reproduc lop erateur 1
+reproduc measur 1
+reproduc peut 1
+reproduc peut etr 1
+reproduc plus just 1
+reproduc s elect 1
+reproduc standard 1
+reproduc standard introduit 1
+reproduc th behaviour 1
+reproduc th cur 1
+reproduc th ph 1
+reproduc th train 1
+reproduc vient 1
+reproduc vient du 1
+reproduc view 1
+reproduc way using 1
+reproduir 1
+reproduir de 1
+reproduir de distribut 1
+reproduir et lorsqu 1
+reproduit 2
+reproduit figur 1
+reproduit le 1
+reproduit le noyau 1
+reprogram 1
+reprogram effort 1
+republ 2
+republ institut 1
+republ of slov 1
+republ pod 1
+republ pod vod 1
+reput 2
+reput for ea 1
+req 2
+req typ 1
+reqiur 1
+requ 4
+requ alor 1
+requ alor qu 1
+requ aucun 1
+requ aucun acc 1
+requ aus 1
+requ d etendr 1
+requ de 2
+requ de fair 1
+requ de man 1
+requ de tr 1
+requ deux 1
+requ deux famil 1
+requ deux pa 1
+requ donc 1
+requ donc la 1
+requ ensuit 1
+requ ensuit la 1
+requ er donc 1
+requ erent 1
+requ erent un 1
+requ erir 1
+requ erir jusqu 1
+requ es 2
+requ es au 1
+requ es de 1
+requ es dun 1
+requ es est 1
+requ es ou 1
+requ es par 1
+requ es pour 1
+requ inform 1
+requ inform de 1
+requ la 2
+requ la con 1
+requ la cr 1
+requ le 1
+requ le pa 1
+requ lintroduc 1
+requ lintroduc dun 1
+requ lor 1
+requ lor de 1
+requ pa 1
+requ pa denregistrer 1
+requ pa lintroduc 1
+requ pour 1
+requ pour la 1
+requ qu 1
+requ qu deux 1
+requ qu le 1
+requ qu proc 1
+requ soit 1
+requ soit de 1
+requ te 1
+requ te en 1
+requ toutef 1
+requ toutef de 1
+requ un 1
+requ un acc 1
+requ un lectur 1
+requ un rem 1
+requ un repr 1
+request 37
+request a connect 1
+request a non 1
+request a read 1
+request a receiver 1
+request a tok 1
+request acc 2
+request after tim 1
+request an infinit 1
+request and answer 1
+request and grant 1
+request and rel 1
+request and rep 1
+request and sen 1
+request and upd 1
+request another connect 1
+request another valu 1
+request ap 1
+request ar ap 1
+request ar collect 1
+request ar non 1
+request ar simultan 1
+request ar st 1
+request arriv 3
+request at interv 1
+request becom 1
+request being me 2
+request between switch 1
+request by modif 1
+request by sen 1
+request can ea 1
+request chunk 1
+request command 1
+request con 1
+request connect 1
+request correspon 1
+request cs.umd.edu 1
+request dat 1
+request dat loc 1
+request dat simultan 1
+request dep 1
+request ec 2
+request elicit 1
+request enqueu 1
+request enqueu avail 1
+request exact 1
+request exact posit 1
+request fal 1
+request fil 1
+request for com 2
+request for tpt 1
+request form 1
+request from agent 1
+request from proc 1
+request from vk 1
+request funct 1
+request funct ship 1
+request gener 2
+request hav prior 1
+request id prior 1
+request in oeb 1
+request input 1
+request input port 1
+request is alloc 1
+request is ap 1
+request is pa 1
+request is plac 1
+request is propag 1
+request is receiv 1
+request is sent 2
+request is st 1
+request is us 1
+request join 1
+request lockj 1
+request m evok 1
+request m0 1
+request mad 2
+request mi 1
+request mi pack 1
+request must elicit 1
+request not going 2
+request of lock 1
+request other var 1
+request output 1
+request output port 1
+request own peer 1
+request peer 1
+request peer group 1
+request posit 1
+request queu 1
+request resid 1
+request respon 2
+request respon pair 1
+request se 1
+request sent 1
+request server 1
+request server 1server 1
+request ship 1
+request sid 1
+request simp 1
+request simp acc 1
+request simultan 1
+request simultan influ 1
+request stat 1
+request stat nod 1
+request tak 1
+request th ownership 1
+request to comput 1
+request to join 1
+request to merg 1
+request to p1 1
+request to refer 1
+request to serv 1
+request to vk 1
+request typ 2
+request typ int 1
+request using 2
+request using queu 2
+request valu 1
+request wer ap 1
+request wer sent 1
+request wh 1
+request which fit 1
+request wil ar 1
+request wil com 1
+request with approxim 1
+request with assoc 1
+request with deadl 1
+request with nam 1
+request with path 1
+request with transact 1
+request within tim 1
+request.2 1
+requester 1
+requeststim 1
+requeststim to sen 1
+requich 1
+requir 116
+requir 10m 1
+requir 10m by 1
+requir 2.2m 1
+requir 2.2m by 1
+requir a bar 1
+requir a bit 1
+requir a broader 1
+requir a browser 1
+requir a candud 1
+requir a car 1
+requir a chang 1
+requir a chunk 1
+requir a collap 1
+requir a color 1
+requir a compl 1
+requir a concur 1
+requir a const 2
+requir a day 1
+requir a declarat 1
+requir a div 1
+requir a duplicateelim 1
+requir a fragm 1
+requir a group 1
+requir a join 1
+requir a libr 1
+requir a list 1
+requir a prelimin 1
+requir a prior 1
+requir a schedl 1
+requir a sender 1
+requir a separ 1
+requir a sequ 1
+requir a shar 1
+requir a solut 1
+requir a sort 1
+requir a specif 1
+requir a subst 2
+requir a templ 1
+requir a test 1
+requir a tim 1
+requir a trem 1
+requir a uniform 1
+requir a vast 1
+requir a ver 1
+requir a virtu 1
+requir a work 1
+requir about prec 1
+requir acc 2
+requir acc mil 1
+requir accord 1
+requir acknowledg 1
+requir addit 3
+requir addit test 2
+requir addit work 1
+requir adjustm 1
+requir adm 1
+requir al pe 1
+requir al proc 1
+requir amort 1
+requir amort tim 1
+requir an 2
+requir an ad 1
+requir an addit 4
+requir an estim 1
+requir an execut 1
+requir an explicit 2
+requir an extern 1
+requir an extr 1
+requir an mmu 1
+requir an object 1
+requir an underl 1
+requir an unpack 1
+requir and featur 1
+requir and implem 1
+requir and med 1
+requir and phy 1
+requir and program 1
+requir and slow 1
+requir and speed 1
+requir and tim 1
+requir answer 1
+requir answer ba 1
+requir any knowledg 1
+requir appl 1
+requir appl modif 1
+requir approxim 1
+requir ar const 1
+requir ar modest 1
+requir ar nec 1
+requir ar restrict 1
+requir argum 2
+requir argum posit 1
+requir assoc 1
+requir at level 1
+requir becom 1
+requir behaviour 1
+requir being abl 1
+requir between intern 1
+requir both oc 1
+requir both rel 1
+requir bound 1
+requir bound commun 1
+requir bring 1
+requir buffer 1
+requir buffer spac 1
+requir by ca 1
+requir by eram 1
+requir by gklr 1
+requir by gr 1
+requir by heur 1
+requir by lem 1
+requir by mar 1
+requir by multicast 1
+requir by netsim 1
+requir by prolog 1
+requir by rc 1
+requir by rt3 1
+requir by selectintertest 1
+requir by stat 1
+requir by stud 1
+requir capabil 1
+requir catalog 1
+requir chang 3
+requir cod 1
+requir coh 1
+requir coh act 1
+requir combin 1
+requir combin adv 1
+requir commun 4
+requir comp 1
+requir compiler 1
+requir compiler support 1
+requir compl 2
+requir compl architectur 1
+requir compl inform 1
+requir complec 1
+requir complec an 1
+requir comput 1
+requir comput cost 1
+requir con 1
+requir con us 1
+requir consider 2
+requir const 2
+requir const tim 1
+requir continu 1
+requir continu serv 1
+requir cooper 1
+requir count 1
+requir cut 1
+requir cut separ 1
+requir d tim 1
+requir d2 1
+requir d2 tim 1
+requir dat 4
+requir dat produc 1
+requir decompr 1
+requir degr 1
+requir diagram 1
+requir diagram commut 1
+requir differ resourc 1
+requir differ tag 1
+requir dlog2 1
+requir docum 1
+requir drop 1
+requir each proc 1
+requir eff 1
+requir eff dat 1
+requir effect 1
+requir elicit 1
+requir engineer 2
+requir ev me 1
+requir event 1
+requir event sign 1
+requir exact 1
+requir exact li 1
+requir exc 1
+requir exc join 1
+requir execut 1
+requir explicit 1
+requir explicit specif 1
+requir ext 2
+requir ext backtrack 1
+requir ext effort 1
+requir extr 1
+requir extr support 1
+requir extrem 1
+requir extrem simpl 1
+requir fast 1
+requir fast collect 1
+requir few tupl 1
+requir fewer 2
+requir fewer router 1
+requir fift 1
+requir for adapt 1
+requir for comput 1
+requir for construc 1
+requir for converg 1
+requir for dec 1
+requir for dent 1
+requir for developm 1
+requir for discharg 1
+requir for distinct 1
+requir for distribut 1
+requir for encod 1
+requir for evalu 1
+requir for inser 1
+requir for internet 1
+requir for leader 1
+requir for learn 1
+requir for log 1
+requir for maintain 1
+requir for modl 1
+requir for partit 1
+requir for proc 1
+requir for react 1
+requir for read 1
+requir for recov 1
+requir for retrief 1
+requir for robust 1
+requir for softwar 1
+requir for sort 1
+requir for step 1
+requir for top 1
+requir for tt 1
+requir for univer 1
+requir for vi 1
+requir for vm 1
+requir form 1
+requir form support 1
+requir forml 1
+requir frequ 1
+requir frequ commun 1
+requir from heitmeyer 1
+requir from pragmat 1
+requir from react 1
+requir further 3
+requir further investig 2
+requir further me 1
+requir glob 1
+requir glob con 1
+requir graph 1
+requir ha becom 1
+requir high memor 1
+requir hold 1
+requir hyperplan 1
+requir ident 1
+requir ident dat 1
+requir imag 1
+requir imag technolog 1
+requir imp 2
+requir in ad 1
+requir in async 1
+requir in build 1
+requir in equ 1
+requir in finit 1
+requir in gener 1
+requir in handl 1
+requir in heter 1
+requir in lem 1
+requir in lu 1
+requir in order 5
+requir in pgp 1
+requir in proc 1
+requir in q1.11 1
+requir in q1.8 1
+requir in sect 1
+requir incr 2
+requir incr channel 1
+requir int 1
+requir int an 1
+requir int compon 1
+requir int requir 1
+requir inter 1
+requir inter proc 1
+requir intermin 1
+requir intermin adapt 1
+requir interpr 1
+requir interv 1
+requir is ba 1
+requir is bound 1
+requir is expect 1
+requir is rel 1
+requir is satisf 3
+requir iter 1
+requir join 1
+requir join oper 1
+requir just ten 1
+requir keep 1
+requir kind 1
+requir kind hypoth 1
+requir knowledg 3
+requir ks 1
+requir larg scal 1
+requir larger 1
+requir le aggreg 1
+requir le memor 1
+requir le number 1
+requir le proc 1
+requir le refin 1
+requir le tim 1
+requir le work 1
+requir lesser 1
+requir lesser inter 1
+requir lesser nw 1
+requir li 2
+requir li swap 1
+requir link 1
+requir littl effort 1
+requir littl spac 1
+requir loc 1
+requir loc inform 1
+requir maint 1
+requir me 1
+requir me order 1
+requir mer 1
+requir minim 2
+requir minim number 2
+requir mor addit 1
+requir mor car 1
+requir mor ch 1
+requir mor comparison 1
+requir mor effort 1
+requir mor hop 1
+requir mor memor 1
+requir mor proc 1
+requir mor refin 1
+requir mor repl 1
+requir mor research 1
+requir mor router 1
+requir mor tim 1
+requir mor work 1
+requir much ea 1
+requir multicast 1
+requir multicast support 1
+requir multipl 3
+requir multipl acc 1
+requir multipl cont 1
+requir multipl theor 1
+requir n 2f 1
+requir n b3f2 1
+requir n pmbp 1
+requir nam 1
+requir natur 1
+requir natur langu 1
+requir network 1
+requir network transpar 1
+requir new 1
+requir new inser 1
+requir no addit 1
+requir no com 1
+requir no map 1
+requir nod 1
+requir nondetermin 1
+requir nondetermin expon 1
+requir number 3
+requir o np 1
+requir o tcol 1
+requir object 1
+requir of bal 1
+requir of cour 1
+requir of fair 1
+requir of fr 1
+requir of futur 1
+requir of isvl 1
+requir of kn 1
+requir of mar 1
+requir of numer 1
+requir of rt3 1
+requir of softwar 1
+requir of vect 1
+requir on further 1
+requir on parameter 1
+requir on tim 1
+requir oper 1
+requir or non 1
+requir our testb 1
+requir outlin 1
+requir output 1
+requir output port 1
+requir p2 1
+requir palindrom 1
+requir palindrom sequ 1
+requir parameter 1
+requir per pattern 1
+requir pr 1
+requir prior 1
+requir prior comput 1
+requir prior knowledg 1
+requir program 1
+requir proper 2
+requir r1 1
+requir rang 1
+requir ray 1
+requir ray cast 1
+requir re 1
+requir recompil 1
+requir reduc 1
+requir rel 1
+requir rel dat 1
+requir rel receipt 1
+requir rel transport 1
+requir requir 1
+requir resourc 2
+requir resourc bound 1
+requir resourc rreq 1
+requir result 1
+requir retent 1
+requir rollback 1
+requir router 1
+requir rreq 1
+requir run 1
+requir run tim 1
+requir s2 1
+requir s2 t2 1
+requir scal 1
+requir scan 1
+requir shap 1
+requir shar 1
+requir shar memor 1
+requir short respon 1
+requir signif 1
+requir siml 1
+requir siz 1
+requir som addit 2
+requir som kind 1
+requir som knowledg 1
+requir som manufactur 1
+requir som number 1
+requir som overhead 1
+requir som simplif 1
+requir sometim becom 1
+requir sort 1
+requir spec 1
+requir spec hardwar 3
+requir spec purp 1
+requir specif 1
+requir stil prohibit 1
+requir subst 2
+requir subst modif 1
+requir subst smaller 1
+requir succ 1
+requir succ predict 1
+requir system 1
+requir task 1
+requir tcom 1
+requir ten 1
+requir ten hour 1
+requir test 2
+requir test hist 1
+requir test polynom 1
+requir th acquisit 1
+requir th algorithm 1
+requir th ar 1
+requir th consider 1
+requir th cost 1
+requir th dat 1
+requir th developm 3
+requir th div 1
+requir th dual 1
+requir th entir 1
+requir th evalu 1
+requir th execut 2
+requir th finit 1
+requir th greatest 1
+requir th inform 1
+requir th introduc 1
+requir th involut 1
+requir th lec 1
+requir th libr 1
+requir th lower 1
+requir th manipl 1
+requir th maxim 1
+requir th memor 1
+requir th merg 1
+requir th order 1
+requir th parallel 1
+requir th proc 1
+requir th programmer 2
+requir th reconstruc 1
+requir th smallest 1
+requir th specif 1
+requir th subject 1
+requir th submodl 1
+requir th substr 1
+requir th transit 1
+requir th typ 1
+requir th und 1
+requir th uniform 1
+requir th us 4
+requir than vct 1
+requir that ae 1
+requir that cr 1
+requir that error 1
+requir that flit 1
+requir that lock 1
+requir that parallel 1
+requir that spac 1
+requir that tetr. 1
+requir therefor 1
+requir therefor tool 1
+requir thr argum 1
+requir tim 3
+requir titl 1
+requir titl etc 1
+requir tn 1
+requir to achief 1
+requir to ad 1
+requir to ap 1
+requir to av 2
+requir to bring 1
+requir to build 2
+requir to chang 1
+requir to coar 1
+requir to commun 2
+requir to compar 1
+requir to compl 1
+requir to comput 3
+requir to connect 1
+requir to construc 2
+requir to conver 1
+requir to cover 1
+requir to deal 1
+requir to detect 1
+requir to ensur 2
+requir to establ 1
+requir to evalu 1
+requir to evolut 1
+requir to execut 1
+requir to explain 1
+requir to fetch 1
+requir to find 4
+requir to fit 1
+requir to follow 1
+requir to form 1
+requir to ge 1
+requir to giv 1
+requir to handl 2
+requir to impl 1
+requir to incr 1
+requir to ind 1
+requir to inv 1
+requir to issu 1
+requir to know 1
+requir to learn 1
+requir to lower 1
+requir to maintain 1
+requir to mak 2
+requir to me 1
+requir to model 1
+requir to mov 2
+requir to multip 1
+requir to obtain 1
+requir to perform 3
+requir to permut 1
+requir to proc 1
+requir to prov 1
+requir to re 1
+requir to reduc 2
+requir to regr 1
+requir to resolut 1
+requir to retest 1
+requir to run 1
+requir to satisf 2
+requir to se 1
+requir to select 1
+requir to sen 2
+requir to shift 1
+requir to ship 1
+requir to solut 3
+requir to sort 2
+requir to st 1
+requir to succ 1
+requir to support 2
+requir to tak 1
+requir to toler 1
+requir to transl 1
+requir to transm 1
+requir to transp 1
+requir to underpin 1
+requir trac 1
+requir transl 1
+requir ts 1
+requir tw comparison 2
+requir tw separ 1
+requir u parameter 1
+requir under asynchron 1
+requir under synchron 1
+requir underl 1
+requir underl isvl 1
+requir unpack 1
+requir unpack oper 1
+requir upd 1
+requir user 1
+requir user input 1
+requir using 2
+requir using cluster 1
+requir using gr 1
+requir ver exp 1
+requir wa therefor 1
+requir weight 1
+requir weight chang 1
+requir wer me 1
+requir when multipl 1
+requir when system 1
+requir which requir 1
+requir wider 1
+requir wider dat 1
+requir with claus 1
+requir with ec 1
+requir work 1
+requir worst 1
+requir worst ca 1
+requisit 2
+requisit se 1
+rer 1
+rer algorithmiqu 1
+rer algorithmiqu ce 1
+rer ce 1
+rer ce primitiv 1
+rer correct 1
+rer correct lerreur 1
+rer lincertitud 1
+rer lincertitud sur 1
+rer linform 1
+rer un 1
+rer un bon 1
+reran 1
+reran th program 1
+rerout 1
+rerout al inc 1
+rerun 2
+rerun al test 1
+rerun test 1
+rerun test exceed 1
+rerun th program 1
+resampl 1
+resampl to form 1
+resatisf 1
+resatisf th specif 1
+resc 2
+resc is compr 1
+resc ver 1
+reschedl 2
+reschedl for execut 1
+reschedl funct 1
+reschedl infinit 1
+reschedl oper 1
+reschedl oper dynam 1
+reschedl return 1
+reschedl th thread 1
+research 104
+research about user 1
+research act 4
+research act medl 1
+research act nr 1
+research al requir 1
+research and commerc 1
+research and den 1
+research and designer 1
+research and developm 4
+research and exper 1
+research and inform 1
+research and stud 1
+research and teach 1
+research and technolog 2
+research appl 2
+research appl color 1
+research ar 5
+research at georg 1
+research center 16
+research center dept 1
+research center washingt 1
+research center yorktown 1
+research centr 6
+research centr fund 1
+research collabor 1
+research collabor program 1
+research commun 4
+research concern tim 1
+research continu 1
+research corp 1
+research corpor 1
+research could consider 1
+research could investig 1
+research council 14
+research council canad 1
+research creat 1
+research creat fault 1
+research creat test 1
+research cur 1
+research cyberjourn 1
+research cyberjourn sit 1
+research demonstr 1
+research direct 5
+research div 3
+research div almad 1
+research div p.o 1
+research div t.j 1
+research en 1
+research ext 1
+research facil 1
+research fellowship 1
+research ffl rutger 1
+research foc 2
+research for graph 1
+research gmbh 1
+research grant 4
+research grant council 1
+research grant dcr 1
+research grant ogp0951 1
+research group 7
+research group program 1
+research group top 1
+research ha concentr 1
+research ha emph 2
+research ha foc 1
+research ha rev 1
+research ha start 1
+research hav addr 1
+research hav appl 1
+research hav ch 1
+research hav foc 1
+research hav investig 1
+research hav suggest 2
+research hav test 1
+research hav therefor 1
+research horizon 1
+research impl 1
+research in artif 1
+research in computer 1
+research in domain 1
+research in parallel 1
+research in parod 1
+research in secur 1
+research in softwar 1
+research inappl 1
+research inc 1
+research indep 1
+research indep attempt 1
+research init 2
+research init gener 1
+research institut 7
+research instr 1
+research int compiler 1
+research int network 1
+research int sv 1
+research interest 2
+research involut 2
+research involut dev 1
+research is addr 1
+research is demonstr 1
+research is direct 1
+research is failur 1
+research is fund 1
+research is giv 1
+research is support 6
+research issu 2
+research lab 2
+research labor 6
+research labor adelph 1
+research labor cooper 1
+research labor cooperativeagreementnumberdaah0495 1
+research letter 2
+research lim 1
+research liter 1
+research ma 1
+research ma parallel 1
+research mad 1
+research main 1
+research objectiv 1
+research off 2
+research off contract 1
+research off grant 1
+research on abstract 1
+research on csp 1
+research on deep 1
+research on nonmonot 1
+research on regr 1
+research on theor 1
+research on using 1
+research part 1
+research part support 1
+research problem 2
+research project 8
+research project ag 6
+research project underw 1
+research purp 1
+research quest 1
+research quest remain 1
+research rel 1
+research report 22
+research report cs 1
+research report ii 1
+research report litp 1
+research report no.1658 1
+research report r90005 1
+research report r95 1
+research report rc 2
+research report rc16431 1
+research report rc16606 1
+research report rc18139 1
+research report rj 1
+research report rj6649 1
+research report ser 2
+research report stat95 1
+research report tr 1
+research requir 1
+research result 1
+research shash 1
+research shash group 1
+research shashigroup 1
+research shashigroup paper 1
+research staff 1
+research step 1
+research stil seek 1
+research stud 1
+research suggest 2
+research support 3
+research t3d 1
+research team 1
+research techn 1
+research techn sum 1
+research therefor 2
+research therefor rel 2
+research to addr 1
+research to conduc 1
+research to design 1
+research to ext 1
+research to manufactur 1
+research to pract 1
+research try 1
+research under contract 1
+research using 1
+research wa design 1
+research wa nec 1
+research wa parameter 1
+research wa part 1
+research wa pr 1
+research wa spon 1
+research wa support 9
+research wil foc 1
+research wish 1
+research work 2
+research workshop 1
+research.panason.com 1
+research.panason.com andrewt 1
+research.panason.com andrewt cs.cmu.edu 1
+reseau 1
+reseau dinterconnec 1
+resembl 12
+resembl a mip 1
+resembl standard 2
+resembl standard algorithm 1
+resembl standard qu 1
+resembl th old 1
+resembl th order 1
+resembl th structur 1
+resembl tradit 1
+resembl tradit mult 1
+resembl verif 1
+resembl verif figur 1
+reserv 14
+reserv a sub 1
+reserv after t4 1
+reserv arriv 1
+reserv arriv pffq 1
+reserv by se 1
+reserv el 1
+reserv for us 1
+reserv half 1
+reserv identif 1
+reserv identif init 1
+reserv identif st 1
+reserv is distribut 1
+reserv is ec 1
+reserv is exhaust 1
+reserv of se 1
+reserv rat 1
+reserv result 1
+reserv system 1
+reserv th cur 1
+reserv th rest 1
+reserv th term 1
+reserv th unus 1
+reserv word 1
+reservedoutputportsrequestedoutputport 1
+reservoir 1
+reservoir siml 1
+reservoir siml program 1
+resid 13
+resid an organ 1
+resid in intern 1
+resid in pack 1
+resid on proc 1
+resid user 1
+resid user termin1 1
+residu 5
+residu as appl 1
+residu method 1
+residu origin 1
+residu overhead 1
+residu vect 1
+residu vect ri 1
+residualiz 1
+resign 1
+resil 1
+resil shar 1
+resolut 31
+resolut 3d 1
+resolut 3d surfac 1
+resolut al uniqu 1
+resolut algorithm 1
+resolut an 1
+resolut and assignm 1
+resolut and color 1
+resolut and simpl 1
+resolut and sld 1
+resolut and window 1
+resolut ba 1
+resolut by select 1
+resolut by transl 1
+resolut calculus 1
+resolut claus 1
+resolut conflict 1
+resolut continu 1
+resolut dat 1
+resolut for correct 1
+resolut for dent 1
+resolut form 1
+resolut imag 1
+resolut increm 1
+resolut increm retrief 1
+resolut involut 1
+resolut is appl 1
+resolut is ba 2
+resolut is defin 1
+resolut is unsatisf 1
+resolut me 1
+resolut obv 1
+resolut obv channel 1
+resolut oper 1
+resolut other equ 1
+resolut parameter 1
+resolut parameter compon 1
+resolut principl 1
+resolut procedur 1
+resolut produc 1
+resolut produc growth 1
+resolut remov 1
+resolut repr 1
+resolut rough 1
+resolut sign 1
+resolut sign decomposit 1
+resolut som conflict 1
+resolut step 1
+resolut th ambigu 1
+resolut th ant 1
+resolut th fr 1
+resolut th gap 1
+resolut th multipl 1
+resolut th result 1
+resolut to fx 1
+resolut to grav 1
+resolut typ 2
+resolut typ proof 2
+resolut valu 1
+resolut view 1
+resolut with operand 1
+resolut with search 1
+resolver 1
+resolver muit 1
+resolver muit tip 1
+reson 1
+reson mod 1
+resonec 1
+resonec inc 1
+resort 7
+resort to coroutin 1
+resort to empir 1
+resort to logk 1
+resort to microprogram 1
+resort to trick 1
+resourc 33
+resourc acc 1
+resourc alloc 2
+resourc and prev 1
+resourc ar effect 1
+resourc ar human 1
+resourc ar low 1
+resourc avail 4
+resourc avail displ 1
+resourc avail worldw 1
+resourc awar 1
+resourc awar mak 1
+resourc b tim 1
+resourc ba 1
+resourc becom 1
+resourc bound 2
+resourc bound be 1
+resourc bound mart 1
+resourc bound measur 1
+resourc cl 1
+resourc cl dp 1
+resourc commut 1
+resourc connect 1
+resourc consum 1
+resourc dep 1
+resourc dep dat 1
+resourc dep tok 1
+resourc discov 1
+resourc discov system 1
+resourc edit 1
+resourc fil 1
+resourc for input 1
+resourc for pack 1
+resourc for se 1
+resourc for unlim 1
+resourc in cur 1
+resourc is gener 1
+resourc item 1
+resourc knowledg 1
+resourc knowledg com 1
+resourc lim 1
+resourc loc 1
+resourc maintain 1
+resourc manag 2
+resourc manag pol 1
+resourc manag problem 1
+resourc manag strateg 1
+resourc manag techniqu 1
+resourc manager 1
+resourc may me 1
+resourc model 1
+resourc nam 1
+resourc or dev 1
+resourc r a1 1
+resourc r1 1
+resourc rav 1
+resourc reflect 1
+resourc reflect abstract 1
+resourc requir 2
+resourc rreq 1
+resourc rreq oe 1
+resourc se 1
+resourc shar 1
+resourc simultan 1
+resourc structur 1
+resourc to handl 1
+resourc to remain 1
+resourc to user 1
+resourc typ 1
+resourc us 1
+resourc us gap 1
+resourc usag 1
+resourc user 1
+resourc user group 1
+resourc when work 1
+resourc which belong 1
+resourc.h 1
+resourc.h inclus 1
+resourc.h inclus math.h 1
+resourcemanager 1
+resourcemanager managertransact 1
+resourcemanager se 1
+resourcemanager se resourcemanager 1
+resp 7
+respecif 1
+respecif th condit 1
+respect 103
+respect a polyhedr 1
+respect act 1
+respect act intent 1
+respect adv 1
+respect altern 1
+respect approach 1
+respect ba 1
+respect ba level 1
+respect boolean 1
+respect boolean variabl 1
+respect by using 1
+respect ca 1
+respect cluster 1
+respect cluster siz 1
+respect confid 1
+respect confid funct 1
+respect curv 1
+respect definit 1
+respect design 1
+respect design switch 1
+respect disk 1
+respect domain 1
+respect donc 1
+respect donc le 1
+respect ee 2
+respect ee dan 1
+respect eulisp 1
+respect eulisp differ 1
+respect evalu 1
+respect evalu valu 1
+respect is chang 1
+respect last nod 1
+respect laut 1
+respect le 1
+respect loc 1
+respect loc direct 1
+respect merit 1
+respect origin 1
+respect origin hid 1
+respect output 1
+respect output nod 1
+respect pair 1
+respect perform 1
+respect pr 1
+respect pr symbol 1
+respect privileg 1
+respect privileg se 1
+respect procedur 1
+respect qu 1
+respect quer 1
+respect rol 1
+respect run 1
+respect secon order 1
+respect sect 1
+respect shar 1
+respect speedup 1
+respect subsect 1
+respect substitut 1
+respect substitut fx 1
+respect subtr 1
+respect system 1
+respect system parameter 1
+respect technolog 2
+respect th commutat 1
+respect th domain 1
+respect th result 1
+respect th simil 1
+respect to adapt 1
+respect to appl 1
+respect to b1 1
+respect to c3 1
+respect to ci 1
+respect to cj 1
+respect to cl 1
+respect to complec 1
+respect to comput 1
+respect to constraint 1
+respect to contextu 1
+respect to eigenvalu 1
+respect to fault 1
+respect to feedback 1
+respect to garb 1
+respect to gi 1
+respect to gt 1
+respect to hard 1
+respect to implem 1
+respect to input 1
+respect to key 1
+respect to learn 1
+respect to level 1
+respect to lin 1
+respect to mach 1
+respect to me 1
+respect to nonb 1
+respect to output 1
+respect to p2 1
+respect to parameter 1
+respect to particl 1
+respect to perform 1
+respect to qu 1
+respect to quest 1
+respect to r1 1
+respect to recur 1
+respect to robust 1
+respect to se 1
+respect to softwar 1
+respect to subtyp 1
+respect to u0 1
+respect to u1 1
+respect with hid 1
+respect. 1
+respecter 1
+respecter ce 1
+respecter la 1
+respectif 3
+respectif de 2
+respectif de c1 1
+respectif de drapeaux 1
+respectif de larithm 1
+respectif de lenviron 1
+respectiv 4
+respectiv aux 1
+respectiv aux calcl 1
+respectiv dan 1
+respectiv dan la 1
+respectiv de 2
+respectiv de la 1
+respectiv de ma 1
+respectiv de propr 1
+respectiv du 1
+respectiv du cr 1
+respectiv dun 1
+respectiv la 2
+respectiv la born 1
+respectiv la largeur 1
+respectiv la pan 1
+respectiv le 2
+respectiv le nombr 1
+respectiv le op 1
+respectiv le valeur 1
+respectiv par 1
+respectiv par bloc 1
+respectiv plus grand 1
+respectivementntot 1
+respon 45
+respon an 1
+respon and attribut 1
+respon and system 1
+respon as quick 1
+respon by sen 1
+respon by turn 1
+respon categor 1
+respon correct 1
+respon de 1
+respon de la 1
+respon de lactiv 1
+respon each cl 1
+respon for ad 1
+respon for arbitr 1
+respon for break 1
+respon for broadcast 1
+respon for caus 1
+respon for ch 2
+respon for claus 1
+respon for comput 1
+respon for computer 1
+respon for consol 1
+respon for creat 1
+respon for dec 1
+respon for determin 1
+respon for evalu 2
+respon for extract 1
+respon for for 1
+respon for guar 1
+respon for init 1
+respon for mak 1
+respon for notif 1
+respon for proc 1
+respon for produc 1
+respon for propag 1
+respon for queu 1
+respon for sen 1
+respon from p1 1
+respon in rel 1
+respon is del 1
+respon is imp 1
+respon is sent 1
+respon is tc 1
+respon is unaccept 1
+respon mean 1
+respon must fal 1
+respon of increm 1
+respon of pa 1
+respon of rout 1
+respon of sen 1
+respon pair 1
+respon pair m0 1
+respon pattern 1
+respon perfect 1
+respon queu 1
+respon r0 1
+respon rapid 1
+respon rel 1
+respon than other 1
+respon tim 9
+respon tim becom 1
+respon tim constraint 1
+respon tim goal 1
+respon tim incr 1
+respon tim rt 1
+respon to client 1
+respon to commun 1
+respon to evalu 1
+respon to event 1
+respon to extran 1
+respon to failur 2
+respon to imag 1
+respon to libr 1
+respon to me 1
+respon to quer 1
+respon to subsequ 1
+respon to user 1
+responc 1
+responc tim 1
+responsabilit 2
+responsabilit e de 1
+responsabilit e du 1
+responsabl 1
+responsabl de 1
+responsabl de la 1
+responsabl dun 1
+responsabl dun echec 1
+responsepattern 1
+responsetim 1
+responsetim restrict 1
+responsibil 2
+responsibil and funct 1
+responsibil involut 1
+resson 1
+resson ain 1
+resson ain au 1
+resson ic 1
+resson ic au 1
+ressort 2
+ressort clair 1
+ressort clair de 1
+ressourc 3
+ressourc mi 1
+ressourc mi en 1
+ressourc physiqu 1
+ressourc prolog 1
+ressourc prolog de 1
+rest 65
+rest a accomplir 1
+rest a compl 1
+rest a cr 1
+rest a evaluer 1
+rest a exprimer 1
+rest a fournir 1
+rest a glob 1
+rest a lordr 1
+rest a montrer 1
+rest a prior 1
+rest a sint 1
+rest a tous 1
+rest a veiller 1
+rest actif 1
+rest actif jusqu 1
+rest alor 1
+rest apr 1
+rest apr es 1
+rest ar simil 2
+rest argum 1
+rest at currnod 1
+rest b colon 1
+rest by addit 1
+rest by cancel 1
+rest by pop 1
+rest chin 1
+rest chin notam 1
+rest chin perm 1
+rest coh 1
+rest coh rent 1
+rest con 2
+rest conditionnel6 1
+rest const 2
+rest const import 1
+rest constraint 1
+rest constraint involut 1
+rest dan 1
+rest dan de 1
+rest de 3
+rest de fa 1
+rest de la 1
+rest de lexpr 1
+rest de lincr 1
+rest de lop 1
+rest distribut 1
+rest distribut modif 1
+rest donc 2
+rest donc commun 1
+rest du 1
+rest du cod 1
+rest ee 1
+rest ee libr 1
+rest ee quun 1
+rest ee relativ 1
+rest encor 2
+rest et le 2
+rest everywh 1
+rest export 1
+rest export funct 1
+rest fal 1
+rest fic 1
+rest fic au 1
+rest fid 1
+rest fid el 1
+rest fin 1
+rest fin deux 1
+rest glob 1
+rest glob inchang 1
+rest go 1
+rest hor 1
+rest hor de 1
+rest if xb 1
+rest if xi 1
+rest int 1
+rest int er 1
+rest is du 1
+rest le 1
+rest le probl 1
+rest lec 1
+rest libr 1
+rest lim 1
+rest list 1
+rest list simpl 1
+rest loc 2
+rest loc aux 1
+rest loc register 1
+rest loin 1
+rest loin du 1
+rest maint 1
+rest mineur 1
+rest ne 1
+rest ne comport 1
+rest of contigu 1
+rest of domain1 1
+rest of domain2 1
+rest of sect 1
+rest old 1
+rest old prob 1
+rest ouver 1
+rest plus alor 1
+rest plus perform 1
+rest polynom 1
+rest polynom constraint 1
+rest pr 2
+rest pr ef 1
+rest pratiqu 1
+rest pratiqu inchang 1
+rest prob 1
+rest prob distribut 1
+rest probabil 1
+rest quand 1
+rest sav 1
+rest sav prob 1
+rest sensibil 1
+rest sensibil ee 1
+rest so deep 1
+rest som unsatisf 1
+rest sont 1
+rest th activ 1
+rest th comput 1
+rest th con 2
+rest th origin 1
+rest th sem 1
+rest toutef 1
+rest toutef inop 1
+rest tr 1
+rest tr es 1
+rest trigger 1
+rest un 2
+rest un dern 1
+rest un indirect 1
+rest un prem 1
+rest util 1
+rest val 1
+rest valabl 1
+rest valabl dan 1
+rest vr 1
+rest0 1
+rest0 init1 1
+rest0 init1 pasc 1
+rest0 init1 prior1 1
+rest0 init1 rest1 1
+rest0 organ 1
+rest0 pasc 1
+rest0 prior1 1
+rest0 prior1 organ 1
+rest0 prior1 pasc 1
+rest0 rest1 1
+rest0 rest1 organ 1
+rest1 1
+rest1 organ 1
+rest1 pasc 1
+rest2 1
+rest2 organ 1
+restait 1
+restait const 1
+restart 5
+restart th browser 1
+restart th program 1
+restat 1
+restat of theorem 1
+restaur 1
+restaur aussit 1
+restaur aussit ot 1
+restaur compl 1
+restaur compl es 1
+restaur de 1
+restaur de argum 1
+restaur de register 1
+restaur du 1
+restaur du point 1
+restaur du som 1
+restaur dun 1
+restaur dun etat 1
+restaur e au 1
+restaur e le 1
+restaur e paresseus 1
+restaur e ult 1
+restaur ee 1
+restaur ee ind 1
+restaur es 1
+restaur es en 1
+restaur es par 1
+restaur sappliqu 1
+restaurer 1
+restaurer argum 1
+restaurer au 1
+restaurer au retour 1
+restaurer en 1
+restaurer en ca 1
+restaurer est 1
+restaurer est alor 1
+restaurer etat 1
+restaurer la 1
+restaurer la valeur 1
+restaurer le 1
+restaurer le register 1
+restaurer linform 1
+restaurer linform de 1
+restaurer register 1
+restaurer tout 1
+rester 3
+rester const 1
+rester const dan 1
+rester dan 1
+rester dan de 1
+rester inchang 1
+rester inchang ee 1
+rester tr 1
+rester tr es 1
+rester un souc 1
+restk 1
+restk ar compl 1
+restrain 1
+restrain th stud 1
+restraint 1
+restraint viol 1
+restreign 2
+restreign au 1
+restreign au sel 1
+restreign aux 1
+restreign aux matr 1
+restreign le 1
+restreign le echang 1
+restreignon 2
+restreignon au 1
+restreignon au ca 1
+restreignon dan 1
+restreignon dan ce 1
+restreignon en 1
+restreignon en eff 1
+restreindr 2
+restreindr au 1
+restreindr au ca 1
+restreindr aux 1
+restreindr aux valeur 1
+restreindr la 1
+restreindr la port 1
+restreindr le 1
+restreindr le nombr 1
+restreindront 1
+restreindront la 1
+restreindront la par 1
+restreint 3
+restreint a lutilisat 1
+restreint au 1
+restreint au ca 1
+restreint de 1
+restreint de caract 1
+restreint donc 1
+restreint en 1
+restreint le 1
+restreint le variabl 1
+restreint pa 1
+restreint pa la 1
+restreint son 1
+restreint son champ 1
+restreint syntaxiqu 1
+restreint syntaxiqu sur 1
+restrict 81
+restrict acc 1
+restrict allow 2
+restrict allow cluster 2
+restrict and parallel 1
+restrict and rel 1
+restrict ar 1
+restrict ar imp 1
+restrict ar specif 1
+restrict by electr 2
+restrict by specif 1
+restrict ca 1
+restrict channel 2
+restrict channel width 2
+restrict cl 1
+restrict claus 1
+restrict cluster 2
+restrict cluster siz 2
+restrict common 1
+restrict common assoc 1
+restrict commun 1
+restrict commun network 1
+restrict de 1
+restrict de la 1
+restrict decomposit 1
+restrict each ad 1
+restrict ensur 1
+restrict et prop 1
+restrict flow 1
+restrict flow control 1
+restrict form 1
+restrict high level 1
+restrict i mac 1
+restrict imp 3
+restrict instead 1
+restrict is introduc 1
+restrict is lift 1
+restrict is observ 1
+restrict jaeckel 1
+restrict jaeckel design 1
+restrict li 1
+restrict li ee 1
+restrict low 1
+restrict low level 1
+restrict mach 1
+restrict mak 1
+restrict mean 1
+restrict multicast 1
+restrict n ecessit 1
+restrict nm 1
+restrict number 1
+restrict occur 1
+restrict of equ 1
+restrict of funct 1
+restrict of polygon 1
+restrict on actu 1
+restrict on mult 1
+restrict on parameter 1
+restrict on perform 1
+restrict on rel 1
+restrict our attent 6
+restrict over var 1
+restrict perm 1
+restrict perm inst 1
+restrict prev 1
+restrict program 1
+restrict program modif 1
+restrict se 2
+restrict starheight 1
+restrict structur 1
+restrict system 1
+restrict system begin 1
+restrict th ch 1
+restrict th disc 1
+restrict th domain 1
+restrict th elig 1
+restrict th instruc 1
+restrict th intersect 1
+restrict th iter 1
+restrict th kind 1
+restrict th number 3
+restrict th oracl 1
+restrict th particip 1
+restrict th scop 1
+restrict th se 1
+restrict th task 1
+restrict th vhdl 1
+restrict their autonom 1
+restrict them. 1
+restrict to ar 1
+restrict to compil 1
+restrict to conflu 1
+restrict to discr 1
+restrict to facil 1
+restrict to inser 1
+restrict to mult 1
+restrict to numer 1
+restrict to oper 1
+restrict to part 1
+restrict to proc 1
+restrict to prolog 1
+restrict to qualit 1
+restrict to sen 1
+restrict to strong 1
+restrict to subcl 1
+restrict to triangl 1
+restrict to typ 1
+restrict to unveil 1
+restrict to variabl 1
+restrict top 1
+restrict top level 1
+restrict tr 1
+restrict tr decomposit 1
+restrict typ 1
+restrict typ infer 1
+restrict unfold 1
+restrict user 1
+restrict user program 1
+restrict view 1
+restrict we imp 1
+restrict wil allow 1
+restrict world 1
+restructur 9
+restructur a propag 1
+restructur act 1
+restructur and nod 1
+restructur approach 1
+restructur begin 1
+restructur chang 1
+restructur chang quick 1
+restructur de 1
+restructur de don 1
+restructur de program 1
+restructur du 1
+restructur du program 1
+restructur for num 1
+restructur oper 2
+restructur ph 1
+restructur th csg 1
+restructur th model 1
+restructur th propag 1
+restructur tool 1
+restructur ver 1
+restx 1
+result 122
+result 2d 1
+result 2d tr 1
+result a high 1
+result about simpler 1
+result about subtyp 1
+result accord 1
+result adapt 1
+result adapt behavior 1
+result after appl 1
+result agr 1
+result aim 1
+result al follow 1
+result al prov 1
+result al show 1
+result algorithm 3
+result algorithm strong 1
+result and brief 1
+result and disc 3
+result and elim 1
+result and equiv 1
+result and evalu 1
+result and lead 1
+result and point 1
+result and pr 1
+result and proof 1
+result and reason 1
+result and rel 1
+result and show 1
+result and suggest 1
+result and val 1
+result ap 1
+result appear 1
+result approxim 1
+result approxim spanner 1
+result ar asynchron 1
+result ar automat 1
+result ar ba 1
+result ar compar 1
+result ar complem 1
+result ar con 2
+result ar depict 2
+result ar describ 1
+result ar disc 1
+result ar encour 1
+result ar equ 1
+result ar fd 1
+result ar fl 1
+result ar gather 1
+result ar giv 2
+result ar justif 1
+result ar mad 1
+result ar obtain 1
+result ar pr 1
+result ar prom 1
+result ar select 1
+result ar shown 6
+result ar sum 2
+result ar surpr 1
+result as aver 1
+result as evalu 1
+result as follow 1
+result asser 1
+result at regl 1
+result aver 1
+result aver supernod 1
+result b decomposit 1
+result ba 1
+result block 1
+result block prob 1
+result by appl 1
+result by contradict 1
+result by using 2
+result car 1
+result cl 4
+result cl dict 1
+result cl loop 1
+result cl rel 1
+result classif 1
+result clear 1
+result clear demonstr 1
+result cliqu 1
+result cliqu correspon 1
+result closur 1
+result cluster 1
+result cluster mean 1
+result cod 2
+result compar 1
+result comput 1
+result con 1
+result concern hamilt 1
+result concern mean 1
+result concern minim 1
+result configur 1
+result continu 1
+result continu method 1
+result correl 1
+result curv 1
+result decomposit 1
+result demonstr 1
+result deriv 3
+result deriv earl 1
+result deriv using 2
+result design 1
+result did show 1
+result differ 1
+result disconnect 1
+result disconnect subgraph 1
+result dist 1
+result docum 1
+result el 1
+result emph 1
+result en 1
+result error 1
+result error valu 1
+result es 1
+result execut 2
+result execut tim 2
+result experim 1
+result expr 2
+result fail 1
+result follow 1
+result for appl 1
+result for chronolog 1
+result for cor 1
+result for correct 1
+result for dpl 1
+result for dsj 1
+result for execut 1
+result for ext 1
+result for fragm 1
+result for gener 1
+result for individu 1
+result for larger 1
+result for lrc 1
+result for mb 1
+result for po 1
+result for program 1
+result for rectangl 1
+result for sen 1
+result for triangl 1
+result for unfold 1
+result forc 1
+result forml 1
+result from a00 1
+result from aver 1
+result from c00 1
+result from de 1
+result from dec 1
+result from intersect 1
+result from lesser 1
+result from prior 1
+result from pur 1
+result from sect 1
+result from select 1
+result from siml 2
+result from spar 1
+result from specl 1
+result from textur 1
+result from using 1
+result from var 1
+result funct 1
+result gener 3
+result gener funct 1
+result gener text 1
+result grammar 1
+result greater 1
+result hav shown 1
+result hierarch 1
+result hold 3
+result hybrid 1
+result hybrid tr 1
+result illustr 1
+result impact 1
+result improv 1
+result in 2m 1
+result in acc 1
+result in act 1
+result in activ 1
+result in approxim 1
+result in arbitr 1
+result in build 1
+result in cluster 1
+result in cod 1
+result in commun 2
+result in compl 1
+result in configur 1
+result in corol 1
+result in corrobor 1
+result in deadlock 1
+result in eff 1
+result in entir 1
+result in equ 1
+result in exc 1
+result in extran 1
+result in fewer 2
+result in figur 1
+result in greater 3
+result in id 1
+result in interfac 1
+result in irregl 1
+result in larg 1
+result in larger 1
+result in learn 1
+result in liter 1
+result in loc 2
+result in longer 1
+result in lower 1
+result in maxim 1
+result in modif 1
+result in near 1
+result in neg 1
+result in network 1
+result in non 1
+result in nonoptim 1
+result in numer 1
+result in obscur 1
+result in oe 1
+result in perfect 1
+result in po 1
+result in polyhedr 1
+result in poor 1
+result in poorer 1
+result in proc 1
+result in program 1
+result in reduc 1
+result in report 1
+result in rol 1
+result in saving 2
+result in sect 5
+result in shallow 1
+result in signif 2
+result in simpl 1
+result in situ 1
+result in slight 1
+result in smaller 2
+result in softwar 1
+result in spar 2
+result in specif 1
+result in speedup 1
+result in subst 1
+result in suff 1
+result in t1 1
+result in tabl 5
+result in theor 1
+result in wor 1
+result in zer 2
+result inclus 2
+result inclus queu 1
+result ind 7
+result inhabit 1
+result inhabit s2 1
+result int account 1
+result int pract 1
+result intern 1
+result intern nod 1
+result is ba 1
+result is con 1
+result is datum 1
+result is deriv 1
+result is entir 1
+result is establ 1
+result is expon 1
+result is gener 1
+result is guaranteed 1
+result is ignor 1
+result is plast 1
+result is pr 2
+result is return 1
+result is scal 1
+result is sent 2
+result is shown 1
+result is signif 1
+result is simp 1
+result is sought 1
+result is st 2
+result is thread 1
+result is us 1
+result joint 1
+result joint transform 1
+result langu 1
+result lead 1
+result link 1
+result link connect 1
+result list 2
+result list belong 1
+result lo 1
+result loc 1
+result loc cop 1
+result log 1
+result log program 1
+result maintain 1
+result maintain explicit 1
+result me 1
+result me object 1
+result ment 2
+result ment result 1
+result nam 1
+result nam clash 1
+result new configur 1
+result not 1
+result not satisf 1
+result now follow 1
+result number 3
+result object 2
+result observ 1
+result observ defin 1
+result obtain 11
+result obtain demonstr 1
+result obtain earl 1
+result obtain using 1
+result of adjust 1
+result of an 1
+result of appl 2
+result of arithm 1
+result of as 1
+result of boolean 1
+result of cal 1
+result of chapan 1
+result of cl 1
+result of classif 1
+result of combin 1
+result of comput 4
+result of contract 1
+result of conver 1
+result of del 1
+result of determin 1
+result of doberkat 1
+result of ehrlich 1
+result of empir 1
+result of eval 1
+result of evalu 1
+result of exc 1
+result of execut 1
+result of fl 1
+result of funct 1
+result of goal 1
+result of hpf 1
+result of invoc 1
+result of karger 1
+result of loc 1
+result of low 1
+result of me 1
+result of modif 1
+result of narrow 1
+result of numer 1
+result of optim 1
+result of parallel 1
+result of parameter 1
+result of part 1
+result of phy 1
+result of prescrib 1
+result of prev 2
+result of proc 2
+result of project 1
+result of prolog 1
+result of qu 1
+result of receiv 1
+result of replac 1
+result of sect 3
+result of simil 1
+result of simon 1
+result of sld 1
+result of softwar 1
+result of split 1
+result of stat 1
+result of substitut 1
+result of syntac 1
+result of system 1
+result of theorem 2
+result of tim 2
+result of tripl 1
+result of unif 1
+result of unpack 1
+result of unwind 1
+result of using 1
+result of yk 1
+result of ziezold 1
+result om 1
+result on ao 1
+result on benchmark 1
+result on expr 1
+result on funct 1
+result on grammat 1
+result on graph 1
+result on hard 1
+result on lin 1
+result on paragon 1
+result output 1
+result output vect 1
+result parallel 1
+result parallel implem 1
+result parameter 1
+result partit 1
+result plot 2
+result pr 10
+result produc 2
+result program 4
+result program recover 1
+result proper 1
+result protocol 1
+result prov 3
+result prov answer 1
+result prov gr 1
+result prov intuit 1
+result psnr 1
+result r tr 1
+result rec 1
+result rec report 1
+result receiv 1
+result reflect 1
+result regard 1
+result regard unfold 1
+result register 1
+result rel 3
+result report 3
+result return 1
+result rev 3
+result rol 1
+result rol graph 1
+result saving 1
+result schedl 3
+result schem 1
+result schem program 1
+result script 1
+result se 2
+result se giv 1
+result sem 1
+result sequ 2
+result sequ h2 1
+result show 12
+result show clp 1
+result show measur 1
+result shown 2
+result slrn 1
+result smaller 1
+result so obtain 1
+result solut 2
+result span 1
+result span tr 1
+result spanner 1
+result spanner sp 1
+result spec 1
+result spec program 1
+result speed 1
+result st 3
+result start 1
+result start st 1
+result stil hold 1
+result structur 1
+result subgraph 1
+result subsequ 1
+result substr 1
+result subtyp 1
+result subtyp algorithm 1
+result suggest 4
+result supergraph 1
+result support 1
+result system 2
+result t spanner 1
+result targ 1
+result targ subgroup 1
+result term 1
+result term rewrit 1
+result text 1
+result th chang 1
+result th scenar 1
+result that cod 1
+result that help 1
+result that hold 1
+result that imper 1
+result that show 1
+result that yield 1
+result then follow 1
+result thread 1
+result thus 1
+result thus giv 1
+result to com 1
+result to demonstr 1
+result to der 1
+result to ec 1
+result to form 1
+result to further 1
+result to inclus 1
+result to mlp 1
+result to practitioner 1
+result to ser 1
+result to val 1
+result tok 1
+result tot 1
+result tot number 1
+result tr 5
+result triangl 1
+result tt 1
+result tt rel 1
+result ttl 1
+result ttl rel 1
+result unfold 1
+result unfold program 1
+result using 5
+result using heur 1
+result using int 1
+result using mar 1
+result val 1
+result valu 5
+result var 3
+result var built 1
+result var liter 1
+result vect 3
+result vect o0 1
+result ver 1
+result wa known 1
+result wa obtain 1
+result wa prov 1
+result wa shown 1
+result walk 1
+result we obtain 1
+result wegener 1
+result weight 1
+result weight supergraph 1
+result wer confirm 1
+result wer consider 1
+result wer norm 1
+result wer observ 1
+result wer obtain 2
+result wer prov 1
+result wer somewhat 1
+result wer visu 1
+result when lin 1
+result when sud 1
+result which show 1
+result with altern 1
+result with car 1
+result with respect 1
+result with self 1
+result with var 1
+result without glob 1
+result without self 1
+result y0 1
+result y1 1
+result y2 1
+result y3 1
+resultg 1
+resultstim 1
+resultstim to sen 1
+resum 11
+resum at lin 1
+resum continu 1
+resum correct 1
+resum correct comput 1
+resum execut 2
+resum funct 1
+resum funct continu 1
+resum it consider 1
+resum or decl 1
+resum prev 1
+resum prev task 1
+resum proc 1
+resum tak 1
+resum tak plac 1
+resum th condit 1
+resum th execut 1
+resum th siml 1
+resum to cruisespeed 1
+resum to sign 1
+resum wh 1
+resynchron 1
+resynchron asynchron 1
+resynchron asynchron event 1
+retain 22
+retain a sub 1
+retain after tak 1
+retain al intern 1
+retain al structur 1
+retain border 1
+retain border point 1
+retain center 1
+retain center point 1
+retain compl 1
+retain eff 1
+retain enough glob 1
+retain in intern 1
+retain in memor 2
+retain intern 1
+retain intern point 1
+retain it accent 1
+retain it spec 1
+retain lock 1
+retain maxim 1
+retain maxim concur 1
+retain on aver 1
+retain onl accept 1
+retain or discard 1
+retain pair 1
+retain part 1
+retain part fil 1
+retain saf 1
+retain th benefit 1
+retain th concur 1
+retain th div 1
+retain th entir 1
+retain th indep 1
+retain th inform 1
+retain th lin 1
+retain th lock 1
+retain th mean 1
+retain th origin 1
+retain th privileg 1
+retain th rol 1
+retain th singl 1
+retain th spirit 1
+retain th tot 1
+retard 2
+retard a la 1
+retard de 1
+retard de acc 1
+retard du 1
+retard du calcl 1
+retard du net 1
+retard e agenc 1
+retard e aux 1
+retard e avec 1
+retard e connu 1
+retard e est 1
+retard e instruc 1
+retard e jusquau 1
+retard e se 1
+retard e sont 1
+retard e sug 1
+retard ee 2
+retard ee de 1
+retard ee du 1
+retard ee jusqu 1
+retard es 1
+retard es dan 1
+retard es est 1
+retard la 1
+retard la calcl 1
+retarder 2
+retarder cel 1
+retarder cel qu 1
+retarder l evalu 1
+retarder la 1
+retarder la cr 1
+retarder la mi 1
+retarder la sauvegard 1
+retarder le 1
+retarder le acc 1
+retarder le calcl 1
+retarder le mi 1
+retarder le point 1
+retenir 1
+retenir ce 1
+retenir ce valeur 1
+retent 1
+retent of lock 1
+retenu 1
+retenu com 1
+retenu com cadr 1
+retenu dan 1
+retenu dan le 1
+retenu est 1
+retenu est dutiliser 1
+retenu et de 1
+retenu princip 1
+retenu princip dan 1
+retenu sur 1
+retenu sur le 1
+retest 1
+retest a modif 1
+retest al approach 1
+retest al retest 1
+retest al techniqu 1
+retest developm 1
+retest incr 1
+retest modif 1
+retest modif program 1
+retest modif softwar 1
+retest select 1
+retest techniqu 1
+retest techniqu addr 1
+retest techniqu cit 1
+retest techniqu differ 1
+retest techniqu plac 1
+retest techniqu proceed 1
+retest techniqu promot 1
+retest techniqu reduc 1
+retest th modif 1
+retiendr 1
+retiendr qu 1
+retiendr qu la 1
+retir 2
+retir ag 1
+retir ag schem 1
+retir ee 1
+retir ee de 1
+retir plan 1
+retirer 1
+retirer lenregister 1
+retirer lenregister correspon 1
+retour 2
+retour ar 1
+retour compil 1
+retour dan 1
+retour dan la 1
+retour de 2
+retour de la 2
+retour de lappel 1
+retour dun 1
+retour dun fait 1
+retour est 1
+retour est don 1
+retour est profon 1
+retour est superficiel 1
+retour ne 1
+retour ne peut 1
+retour profon 1
+retour profon peut 1
+retour profon sappu 1
+retour profon vn 1
+retour superficiel 1
+retour superficiel au 1
+retour superficiel dan 1
+retour superficiel dun 1
+retour superficiel program 1
+retour sur 1
+retour sur la 1
+retour t es 1
+retourn 3
+retourn a la 1
+retourn direct 1
+retourn ee 2
+retourn ee deux 1
+retourn ee par 2
+retourn en 1
+retourn en tr 1
+retourn lattribut 1
+retourn lattribut cour 1
+retourn pa 1
+retourn pa un 1
+retourn pour 1
+retourn un 1
+retourn un cel 1
+retourn un valeur 1
+retourner 2
+retourner le 1
+retourner le deux 1
+retourner un echec 1
+retourner un singl 1
+retr 3
+retr adr 1
+retr adr claus 1
+retr arit 1
+retr c2 1
+retr c2 trust 1
+retr cl 1
+retr deep 1
+retr deep arit 1
+retr doit 1
+retr doit mettr 1
+retr et trust 1
+retr g en 1
+retr init 1
+retr init bp 1
+retr me 1
+retr me el 1
+retr me point 1
+retr ou 1
+retr ou trust 1
+retr peut 1
+retr peut etr 1
+retr se 1
+retr shallow 1
+retr shallow arit 1
+retr superficiel 1
+retr superficiel bp 1
+retr th acquisit 1
+retr transf 1
+retr transf erent 1
+retr trust 1
+retract 2
+retract oper 1
+retract remain 1
+retract remain hid 1
+retract upon backtrack 1
+retract using 1
+retract which motiv 1
+retrain 1
+retrain occur 1
+retrain th prun 1
+retransm 3
+retransm mechan 1
+retransm mechan2 1
+retransm mechan2 using 1
+retransm overhead 1
+retransm per nod 1
+retransm request 1
+retransm th pack 1
+retreiv 1
+retreiv of se 1
+retrief 27
+retrief a structur 1
+retrief an ident 1
+retrief an introspect 1
+retrief and ap 1
+retrief and brow 1
+retrief and reason 1
+retrief and repl 1
+retrief annot 1
+retrief ar distribut 1
+retrief ar perform 1
+retrief asynchron 1
+retrief asynchron using 1
+retrief ba 1
+retrief condit 1
+retrief dat 2
+retrief empl 1
+retrief eng 1
+retrief facil 1
+retrief failur 1
+retrief failur key 1
+retrief fault 1
+retrief fault tr 1
+retrief for docum 1
+retrief for tradit 1
+retrief funct 1
+retrief hierarch 1
+retrief in const 1
+retrief in order 1
+retrief in simil 1
+retrief instead 1
+retrief is ba 1
+retrief mechan 1
+retrief occur 1
+retrief of color 1
+retrief of fac 1
+retrief of fl 1
+retrief of match 1
+retrief of segm 1
+retrief on se 1
+retrief perform 1
+retrief proc 1
+retrief quer 1
+retrief research 1
+retrief sever disk 1
+retrief sinc smaller 1
+retrief skil 1
+retrief stat 2
+retrief system 1
+retrief th appropr 1
+retrief th candid 1
+retrief th cur 1
+retrief th elev 1
+retrief th froz 1
+retrief th geograph 1
+retrief th ident 1
+retrief th introspect 1
+retrief th knowledg 1
+retrief th patron 1
+retrief th spat 1
+retrief th transl 1
+retrief that docum 1
+retrief thr se 1
+retrief tim 1
+retrief tw se 1
+retrief typ 1
+retrief us 1
+retrief using 1
+retrief vi cal 1
+retrospect 2
+retrospect intermod 1
+retrospect intermod imag 1
+retrouv 3
+retrouv aus 1
+retrouv aus bien 1
+retrouv avec 1
+retrouv avec de 1
+retrouv dailleur 1
+retrouv dailleur dan 1
+retrouv dan 1
+retrouv dan un 1
+retrouv e enter 1
+retrouv es 1
+retrouv es en 1
+retrouv ic 1
+retrouv ic lapproxim 1
+retrouv le 1
+retrouver 1
+retrouver enter 1
+retrouver enter es 1
+retrouver l etat 1
+retrouver la 1
+retrouver la queu 1
+retrouver leur 1
+retrouver leur anc 1
+retrouver son 1
+retrouver son anc 1
+return 66
+return a bit 1
+return a confid 1
+return a direct 1
+return a discr 1
+return a disjoint 1
+return a fr 1
+return a funct 1
+return a list 1
+return a loc 1
+return a metacl 1
+return a non 1
+return a profit 1
+return a result 1
+return a se 1
+return a sort 1
+return a succ 1
+return a system 1
+return a timestamp 1
+return a valu 3
+return addr 1
+return al leg 1
+return al supertyp 1
+return alread locationentr 1
+return an ack 1
+return an acknowledg 1
+return an anonym 1
+return an answer 1
+return an appropr 2
+return an idempot 1
+return an incorrect 1
+return an integer 1
+return an unattach 1
+return any valu 1
+return bfather 1
+return bfather root 1
+return by comput 1
+return by loc 1
+return by n1 1
+return by report2b 1
+return by simpl 1
+return cent 1
+return confid 1
+return confid level 1
+return control 1
+return cur 1
+return cur env 1
+return dum 1
+return dum el 1
+return either fail 1
+return el 2
+return el le 1
+return el return 1
+return empt 1
+return empt substr 1
+return fal 1
+return for substr 1
+return fram 1
+return fram addr 1
+return from compar2 1
+return from identif 1
+return from macr 1
+return from rewrit 1
+return funct 2
+return funct control 1
+return funct valu 1
+return gf 1
+return imag 1
+return imag found 1
+return inform 1
+return integer 1
+return is execut 1
+return is govern 1
+return it schem 1
+return j spac 1
+return l listexhaust 1
+return loc 1
+return loc corrobor 1
+return loc turn 1
+return locationentr 1
+return locationentr le 1
+return mechan 1
+return multipl 1
+return multipl conflict 1
+return multipl loc 1
+return nl 1
+return non 2
+return non neg 1
+return non nl 1
+return obj 1
+return oe1 1
+return on investm 1
+return on loc 1
+return on pe 1
+return onl ft2g 1
+return onl ft3g 1
+return optim 1
+return pointer 1
+return prun 1
+return result 2
+return rl 1
+return rl expr 1
+return rl giv 1
+return rl simp 1
+return se 1
+return slowselect 1
+return som inform 2
+return ssn 1
+return succ 1
+return th cardin 1
+return th concat 1
+return th cont 1
+return th correspon 1
+return th cost 1
+return th cur 1
+return th dist 1
+return th entir 1
+return th funct 1
+return th head 1
+return th inform 1
+return th init 1
+return th item 1
+return th loc 1
+return th me 1
+return th number 1
+return th object 1
+return th old 1
+return th permut 2
+return th prob 1
+return th result 3
+return th se 3
+return th system 2
+return th tail 1
+return th test.7 1
+return th text 1
+return th triangl 1
+return th tupl 1
+return th valu 3
+return th ver 1
+return th weight 1
+return that valu 1
+return tim 1
+return to act 1
+return to manu 1
+return typ 2
+return typ void 1
+return until succ 1
+return valu 3
+return whatever alloc 1
+return whatever comput 1
+return without rest 1
+reus 23
+reus a st 1
+reus adr 1
+reus and interconnect 1
+reus and maint 1
+reus appl 1
+reus appl compon 1
+reus architectur 1
+reus bottleneck 1
+reus cl 1
+reus cl libr 1
+reus compon 3
+reus compon appl 1
+reus compon ba 1
+reus dat 2
+reus dat proct 1
+reus dat structur 1
+reus ec 1
+reus ec test 1
+reus el 1
+reus el ext 1
+reus is addr 1
+reus is harder 1
+reus it harder 1
+reus mechan 1
+reus memor 1
+reus of memor 2
+reus of softwar 1
+reus of specif 1
+reus of st 1
+reus onl subject 1
+reus or throw 1
+reus perman 1
+reus perman var 1
+reus pot. 1
+reus prom 1
+reus prom rapid 1
+reus remain 1
+reus remain larg 1
+reus repr 1
+reus situ 1
+reus softwar 1
+reus softwar fault 1
+reus solut 1
+reus technolog 1
+reus test 1
+reus th cach 1
+reus th nod 1
+reus th oper 1
+reus th prev 1
+reus to help 1
+reus with multipl 1
+reuseb 1
+reuseb softwar 1
+reuseb softwar developm 1
+reuter 2
+rev 42
+rev a cherch 1
+rev a great 1
+rev a la 1
+rev a libr 1
+rev a symmeter 1
+rev a ten 1
+rev and experim 1
+rev and ext 1
+rev ar mad 1
+rev arpanet 1
+rev arpanet rout 1
+rev attr 1
+rev ba 1
+rev capabil 1
+rev control 1
+rev control procedur 1
+rev decl 1
+rev distinct 1
+rev distinct runtim 1
+rev du 1
+rev edit 1
+rev et un 1
+rev fault 1
+rev for ie 1
+rev frequ 1
+rev frequ cont 1
+rev implem 1
+rev involut 1
+rev involut reassessm 1
+rev it tren 1
+rev janu 1
+rev jun 1
+rev measur 1
+rev modif 1
+rev modif program 1
+rev mor inform 1
+rev no signif 1
+rev november 1
+rev october 1
+rev of developm 1
+rev of old 1
+rev pa 1
+rev pa sur 1
+rev parallel 1
+rev ponctuel 1
+rev ponctuel soit 1
+rev prototyp 1
+rev prototyp environm 1
+rev return 1
+rev sec 1
+rev simp 1
+rev test 1
+rev th actu 1
+rev th anticip 1
+rev th cheapest 1
+rev th effect 1
+rev th extent 1
+rev th implem 1
+rev th relationship 1
+rev that recomb 1
+rev their comput 1
+rev to tak 1
+rev ver 5
+rev ver appear 1
+rev weight 1
+rev whether build 1
+rev3 1
+rev3 report 1
+rev4 1
+rev4 report 1
+revanch 1
+revanch le 1
+revanch le nombr 1
+revenir 3
+revenir dan 1
+revenir dan le 1
+revenir plus longu 1
+revenir sur 1
+revenir sur ce 1
+revenon 1
+revenon sur 1
+revenon sur la 1
+rever 34
+rever altern 1
+rever altern edg 1
+rever and find 1
+rever arboresc 1
+rever arboresc root 1
+rever cuthil 1
+rever cuthil mck 1
+rever direct 1
+rever engineer 1
+rever execut 1
+rever for gener 1
+rever individu 1
+rever not rever 1
+rever oe 1
+rever of coar 1
+rever oper 1
+rever order 7
+rever pag 1
+rever pag protect 1
+rever sequ 1
+rever sid 1
+rever situ 1
+rever th arrow 1
+rever th cont 1
+rever th cur 1
+rever th dep 1
+rever th direct 1
+rever th edg 1
+rever th order 1
+rever th sen 1
+rever to minl 1
+rever transl 1
+rever transl proc 1
+rever ver 1
+revesz 1
+revesz3 1
+reveszx 1
+reviendr 2
+reviendr sur 2
+reviendr sur ce 1
+reviendr sur limport 1
+review 34
+review an ec 1
+review and walk 1
+review earl 1
+review help 1
+review in ap 1
+review in computer 1
+review in sect 1
+review inc 1
+review learn 1
+review letter 1
+review ol 1
+review prev 1
+review prev work 1
+review proc 1
+review proc examin 1
+review proc search 1
+review rel 1
+review rel work 1
+review should spot 1
+review spot 1
+review strateg 1
+review th chain 1
+review th compon 1
+review th comput 1
+review th methodolog 1
+review th rel 1
+review th relationship 1
+review th standard 1
+review th understand 1
+review to check 1
+review to sort 1
+reviewer 2
+reviewer provid valu 1
+reviewer wh com 1
+revisit 5
+revisit a pair 1
+revit 1
+revit approach 1
+revoc 1
+revoc of author 1
+revoc of privileg 1
+revok 1
+revolut 2
+revolut and evolut 1
+revolut correspon 1
+revolut discov 1
+revolut occur 1
+revolut shift 1
+revu 3
+revu de 2
+revu de modulad 1
+revu de techniqu 1
+revu diff 1
+revu diff erent 1
+revu et etendu 1
+revu le 1
+revu le moy 1
+revu le principaux 1
+revu scientioqu 1
+reweight 1
+reweight least squar 1
+rewrit 20
+rewrit 8y9x 1
+rewrit a tdfg 1
+rewrit as correspon 1
+rewrit as produc 1
+rewrit as shown 1
+rewrit deriv 1
+rewrit ec 1
+rewrit ec algorithm 1
+rewrit ec imper 1
+rewrit follow 1
+rewrit for block 1
+rewrit funct 1
+rewrit funct cal 1
+rewrit in assoc 1
+rewrit it register 1
+rewrit log 1
+rewrit man tim 1
+rewrit not simp 1
+rewrit rl 6
+rewrit rl correspon 1
+rewrit se 1
+rewrit strateg 1
+rewrit system 2
+rewrit system r1 1
+rewrit techniqu 2
+rewrit th cur 1
+rewrit th forml 1
+rewrit th term 1
+rewrit th untim 1
+rewrit to expr 1
+rewrit to nl 1
+rewrit to us 1
+rewrit tru grandpar 1
+rewrot 1
+rewrot th register 1
+rexford 1
+rexp 1
+rey 2
+rey avil 1
+rey74 1
+reynold 4
+reynold ba 1
+rf 2
+rf learn 1
+rf learn succ 1
+rf retrief 1
+rf retrief failur 1
+rf rg 1
+rfc 2
+rfr 1
+rg 5
+rg hr 1
+rgb 1
+rgb color 1
+rgb color spac 1
+rgb spac 1
+rh 3
+rh correspon 1
+rh fi 1
+rh stack 1
+rh0 1
+rh83 1
+rheumatolog 1
+rheumatolog ar ba 1
+rheumatolog dec 1
+rheumatolog dec support 1
+rhn 1
+rhod 6
+rhod island 6
+ri 34
+ri 1ft 1
+ri 1g 1
+ri 2j 1
+ri ae 1
+ri and hi 1
+ri and pj 1
+ri and ri 1
+ri and rj 2
+ri and rk 1
+ri and wi 1
+ri aq 1
+ri ar 1
+ri ar infinit 1
+ri ar renam 1
+ri begin 1
+ri bit 1
+ri by definit 1
+ri by using 1
+ri colleg 1
+ri colleg district 1
+ri consider 1
+ri consider vel 1
+ri contain 2
+ri de 2
+ri de janeir 1
+ri de rec 1
+ri def 1
+ri def x0 1
+ri do ad 1
+ri e os 1
+ri em 1
+ri em boucl 1
+ri in oe 1
+ri in viv 1
+ri is defin 1
+ri is inv 1
+ri is propag 1
+ri is read 1
+ri is writ 1
+ri j hg 1
+ri maximiz 1
+ri minrol 1
+ri minrol rj 1
+ri po 1
+ri po le 1
+ri privileg 1
+ri ri 1
+ri rj 2
+ri rj fminroleg 1
+ri rj rj 1
+ri ru 1
+ri ru marqu 1
+ri se 1
+ri se ver 1
+ri to fal 1
+ri to maxrol 1
+ri to wid 1
+ri tous 1
+ri tous le 1
+ri uniform 1
+ri.br 1
+ri2p 1
+rib 1
+ric 5
+ric puer 1
+ric puer rican 1
+rican 1
+riccat 1
+riccat equ 1
+riccob 1
+ricep 1
+ricep benchmark 1
+ricep benchmark suit 1
+rich 17
+rich and comput 1
+rich and prec 1
+rich and subst 1
+rich collabor 1
+rich collabor context 1
+rich collabor environm 1
+rich dat 1
+rich dat model 1
+rich definit 1
+rich denseign 1
+rich denseign pour 1
+rich environm 1
+rich et tr 1
+rich event 1
+rich event interfac 1
+rich featur 1
+rich featur appl 1
+rich implem 1
+rich in observ 1
+rich inform 1
+rich integr 1
+rich land 1
+rich log 1
+rich pattern 1
+rich repr 1
+rich repr capabil 1
+rich se 1
+rich sourc 1
+rich structur 1
+rich to support 1
+rich tool 1
+rich tool integr 1
+richard 13
+richard benchmark 1
+richard chapman 1
+richard craig 1
+richard craig johnson 1
+richard gabriel 1
+richard johnson 1
+richard simon 1
+richard snodgr 2
+richard tobin 1
+richardson 3
+richmon 1
+richmon str 1
+richter 3
+rid 8
+rid and li 1
+rid field 1
+rid incr 1
+rid le 1
+rid le processeur 1
+rid lesser 1
+rid of dynam 1
+rid of firmwar 1
+rid of gener 1
+rid of redund 1
+rid of zer 1
+rid tp 1
+rid valu 1
+ridg 1
+ridg nat 1
+ridg nat labor 1
+ridoux 1
+ridoux et pasc 1
+riedl 1
+riel 2
+riel ducatif 1
+riel ducatif se 1
+riel interactif 1
+riel interactif sur 1
+rieman 1
+rieman center 1
+rieman compat 1
+rieman compat avec 1
+rieman et de 1
+rieman geometer 1
+rieman geometer ba 1
+rieman invar 1
+rieman invar sur 1
+rieman mi 1
+rieman mi en 1
+rieman structur 1
+rien 4
+rien a fair 1
+rien am eliorer 1
+rien dan 1
+rien dan ce 1
+rien dautr 1
+rien dautr quun 1
+rien la 1
+rien la perspicacit 1
+rien ne 2
+rien ne nous 1
+rien ne prouv 1
+rien nest 1
+rien nest dit 1
+riep 1
+rieur 2
+rieur de 2
+rieur de lyon 1
+rieur de r3 1
+rig 3
+rig ag 1
+rig ag sur 1
+rig at icl 1
+rig de 1
+rig de fa 1
+rig et de 1
+rig et projectif 1
+rig l voc 1
+right 4
+right administer 1
+right administer us 1
+right and oblig 1
+right ar avail 1
+right ar determin 1
+right avail 1
+right reserv 2
+right right 1
+right right administer 1
+right to en 1
+righthand 3
+righthand sid 3
+rightmost 5
+rightmost 2n 1
+rightmost 2n argum 1
+rightmost act 1
+rightmost act nod 1
+rightmost chain 1
+rightmost desc 1
+rightmost leaf 1
+rightmost point 1
+rigid 10
+rigid control 1
+rigid control strateg 1
+rigid form 1
+rigid in lower 2
+rigid match 1
+rigid mot 1
+rigid mot group 1
+rigid object 1
+rigid of variabl 1
+rigid or articl 1
+rigid pack 2
+rigid pack constraint 2
+rigid shap 1
+rigid shap appl 1
+rigid sol 1
+rigid structur 1
+rigid term 1
+rigid transform 1
+rigid transform act 1
+rigor 7
+rigor experim 1
+rigor langu 1
+rigor light 1
+rigor light constraint 1
+rigor long dist 1
+rigor test 1
+rigor th funct 1
+rigoureus 2
+rigoureus ce 1
+rigoureus ce deux 1
+rigoureus dun 1
+rigoureus dun popl 1
+rigoureus tait 1
+rigoureus tait le 1
+rigoureux 3
+rigoureux de 2
+rigoureux de ce 1
+rigoureux de la 1
+rigout 1
+rigueur 1
+rigueur dan 1
+rigueur dan la 1
+rigueur qu 1
+rigueur qu la 1
+rigueur scientifiqu 1
+rigueur scientifiqu qu 1
+rij 1
+rij rij 1
+ril 1
+rin 2
+rin kan 1
+rinehart 1
+rinehart and winst 1
+ring 14
+ring and circl 1
+ring and inform 1
+ring and return 1
+ring compound 1
+ring con 1
+ring contain 1
+ring contain exact 1
+ring cycl 1
+ring effect 1
+ring for ext 1
+ring induc 1
+ring instead 1
+ring may contain 1
+ring neighbor 1
+ring network 3
+ring of pad 1
+ring program 1
+ring program wh 1
+ring proper 1
+ring proper guar 1
+ring reach 1
+ring styl 1
+ring styl interconnect 1
+ring th lower 1
+ring th whit 1
+ring unidirect 1
+ring unidirect proper 1
+ring wh 1
+ring with un 1
+ringwood 1
+rioc 1
+rioc de 1
+rioc de lestim 1
+rioer 1
+rioer lor 1
+rioer lor de 1
+rioer par 1
+rioer par de 1
+rioer qu 1
+rioer qu ce 1
+rip 1
+ripl 2
+rippl 1
+rippl to propag 1
+riqu 1
+riqu ba 1
+riqu de 1
+riqu de haut 1
+riqu de primitiv 1
+riqu de recon 1
+riqu et le 1
+riqu pour 1
+riqu pour de 1
+riqu pour manipuler 1
+rirt 1
+rirt rt 1
+rirt rt wi 1
+risc 2
+risc and cisc 1
+risc architectur 1
+risc architectur ge 1
+risc ba 1
+risc ba design 1
+risc featur 1
+risc instruc 1
+risc proc 1
+riser 1
+riser de 1
+riser de man 1
+risk 4
+risk adapt 1
+risk adapt act 1
+risk of adapt 1
+risk of inv 1
+risk that allow 1
+riskman 1
+riskman for exampl 1
+risqu 4
+risqu d etr 2
+risqu de 3
+risqu de conflit 1
+risqu de cr 1
+risqu de faux 1
+risqu de fauxpart 1
+risqu de mener 1
+risqu de navoir 1
+risqu de part 1
+risqu de perdr 1
+risqu de perturber 1
+risqu de provoquer 1
+risqu de saturer 1
+risqu de voir 1
+risqu dengendrer 1
+risqu dimport 1
+risqu dimport fuit 1
+risqu dinduir 1
+risqu dintroduir 1
+risqu dintroduir ain 1
+risqu donc 1
+risqu donc de 1
+risqu dun 1
+risqu dun taux 1
+risqu n eanmoin 1
+risqu pa 1
+risqu pa de 1
+risqu qu 1
+risqu qu plusieur 1
+risquer 2
+risquer de 2
+risquer de cr 1
+risquerait 1
+risquerait de 1
+risquerait de fair 1
+risquerait dintroduir 1
+risquerait dintroduir de 1
+rissan 1
+ristiqu 1
+ristiqu dan 1
+ristiqu dan certain 1
+ristiqu et de 1
+ristiqu loc 1
+ristiqu loc es 1
+ristiqu qu 1
+ristiqu qu nous 1
+rit 1
+ritch 3
+rithm 1
+rithm requir 1
+ritter 1
+rittler 1
+riv 2
+riv de 1
+riv de matr 1
+riv de rot 1
+riv dun 1
+riv dun fonct 1
+riv dun scalair 1
+riv e cherch 1
+riv e discontinu 1
+riv e du 1
+riv e est 1
+riv e jff 1
+riv e ne 1
+riv e non 1
+riv e par 1
+riv en 1
+riv en est 1
+riv er 1
+riv es 1
+riv es aux 1
+riv es pr 1
+riv par 1
+riv par un 1
+riv sont 1
+riv sont util 1
+riv th 1
+riv th oriqu 1
+river 3
+river labor 1
+river par 1
+river par rapport 1
+river technolog 1
+river technolog center 1
+river veg 1
+rivest 5
+rivest and schapir 1
+rivest schapir 1
+riwt 1
+riwt hi 1
+riwt hi rt 1
+rizz 1
+rizz is cur 1
+rj 9
+rj a pa 1
+rj and rk 1
+rj ar indep 1
+rj ar junior 1
+rj ar senior 1
+rj auj 1
+rj by ri 1
+rj del 1
+rj ec 1
+rj fminroleg 1
+rj if 9rk 1
+rj maxrol 1
+rj nous 1
+rj nous avon 1
+rj privileg 1
+rj ri 1
+rj rj 1
+rj rj ri 1
+rj rk 1
+rj0 1
+rj5244 1
+rj6649 1
+rjnr 1
+rk 8
+rk a coupl 1
+rk and ri 1
+rk and rj 1
+rk minrol 1
+rk privileg 1
+rl 70
+rl 1b 1
+rl a0 1
+rl abov allow 1
+rl actu 1
+rl actu destr 1
+rl allow 1
+rl among demograph 1
+rl among evalu 1
+rl and appl 1
+rl and constraint 1
+rl and fact 1
+rl and henc 1
+rl and map 1
+rl and oper 1
+rl and pur 1
+rl and recom 1
+rl and solut 1
+rl appear 1
+rl appl 3
+rl ar deriv 1
+rl ar evalu 1
+rl ar exampl 1
+rl ar inst 1
+rl ar parameter 1
+rl ar simp 1
+rl ar simplif 1
+rl ar somewhat 1
+rl as cor 1
+rl as defin 1
+rl as explain 1
+rl as follow 1
+rl as heur 1
+rl as oe2 1
+rl assoc 1
+rl attribut 1
+rl attribut cand 1
+rl ba 2
+rl ba detect 1
+rl ba system 1
+rl bod 1
+rl bod expr 1
+rl bool 1
+rl bool gen 1
+rl by assign 1
+rl by chang 1
+rl by induc 1
+rl by restrict 1
+rl can ea 1
+rl chang 1
+rl check 1
+rl coinc 1
+rl combin 1
+rl combin result 1
+rl contain 2
+rl contain ph 1
+rl correspon 1
+rl def 1
+rl disc 1
+rl encod 1
+rl execut 1
+rl expr 1
+rl fir 1
+rl fir start 1
+rl follow 1
+rl for arrow 1
+rl for block 1
+rl for bool 1
+rl for bound 1
+rl for ch 1
+rl for chain 1
+rl for collect 1
+rl for con 1
+rl for condit 1
+rl for defun 1
+rl for evalu 1
+rl for execut 1
+rl for expect 1
+rl for funct 1
+rl for hardwar 1
+rl for le 1
+rl for map 1
+rl for melod 1
+rl for narrow 1
+rl for nonstrict 1
+rl for perform 1
+rl for reduc 1
+rl for return 1
+rl for rol 1
+rl for satisf 1
+rl for shift 1
+rl for subtyp 1
+rl for switch 1
+rl for syntact 1
+rl for top 1
+rl for transform 1
+rl for variabl 1
+rl form 1
+rl form allow 1
+rl from bottom 1
+rl from r0 1
+rl from r1 1
+rl from train 1
+rl g1 1
+rl g2 1
+rl g2rl 1
+rl g2rl g1 1
+rl ge 1
+rl ge visit 1
+rl giv 4
+rl giv earl 1
+rl giv oper 1
+rl govern 1
+rl hav nondeterm 1
+rl head 2
+rl hold 1
+rl if currexp 1
+rl if mod 1
+rl imp 1
+rl in a4 1
+rl in dynam 1
+rl in figur 1
+rl in form 1
+rl in log 1
+rl in order 2
+rl in quest 1
+rl in r1 2
+rl in r2 2
+rl in react 1
+rl in sect 1
+rl in stack 1
+rl in step 1
+rl ind 3
+rl ind implem 1
+rl induc 1
+rl instead 1
+rl interact 1
+rl invoc 1
+rl is appl 2
+rl is defin 1
+rl is going 1
+rl is known 1
+rl is liter 1
+rl is match 1
+rl is ob 1
+rl is replac 1
+rl is respon 1
+rl is satisf 1
+rl k tvar 1
+rl learn 1
+rl left hand 1
+rl list 1
+rl match 1
+rl must ec 1
+rl obtain 1
+rl of appl 1
+rl of cam 1
+rl of cl 1
+rl of conver 1
+rl of form 1
+rl of gener 1
+rl of infer 1
+rl of prolog 1
+rl of promot 1
+rl of pur 1
+rl of sl1 1
+rl of subsum 1
+rl of thumb 1
+rl of transform 1
+rl of transit 1
+rl of transl 1
+rl on computer 1
+rl on unrestrict 1
+rl oper 1
+rl or tok 1
+rl out act 1
+rl output 1
+rl over quant 1
+rl parent 1
+rl put 1
+rl put restrict 1
+rl r ap 1
+rl r promot 1
+rl r top 1
+rl r0 1
+rl respect 1
+rl right hand 1
+rl s ab 1
+rl s conv 1
+rl s top 1
+rl s tvar 1
+rl satisf 1
+rl say 2
+rl sel3 1
+rl sequ 1
+rl should ment 1
+rl simil 1
+rl simp 1
+rl specif 1
+rl specif targ 1
+rl st 1
+rl start 1
+rl subject 1
+rl system 1
+rl t subsum 1
+rl test 1
+rl th criter 1
+rl th subcomput 1
+rl th substitut 1
+rl th valu 1
+rl that allow 1
+rl that conver 1
+rl that def 1
+rl that describ 1
+rl that follow 1
+rl that guar 1
+rl that manipl 1
+rl that modif 1
+rl that rewrit 1
+rl that work 2
+rl then guar 1
+rl to allow 1
+rl to appl 1
+rl to comp 1
+rl to consider 1
+rl to contain 1
+rl to dec 1
+rl to der 1
+rl to fir 1
+rl to guar 1
+rl to handl 1
+rl to homonym 1
+rl transfer 1
+rl tru parent 1
+rl until classif 1
+rl using 2
+rl using b1 1
+rl using edit 1
+rl using idb 1
+rl wa run 1
+rl wa trigger 1
+rl we cr 1
+rl we ge 1
+rl we know 1
+rl when issu 1
+rl when shift 1
+rl which construc 1
+rl which correspon 1
+rl which introduc 1
+rl which match 1
+rl which specif 2
+rl wil appear 1
+rl wil giv 1
+rl wil thus 1
+rl would ad 1
+rl would crash 1
+rl writ 1
+rl7 1
+rl7 of cam 1
+rl85 1
+rloc 2
+rloc bus 1
+rloc cur 1
+rloc cur slav.loc 1
+rloc cur slav.nextloc 1
+rloc denot 1
+rloc denot succ 1
+rloc to rec 1
+rloc.conf 1
+rloc.loc 1
+rloc.vouch 1
+rlock 1
+rlu94 1
+rm 7
+rm and hem 1
+rm and investig 1
+rm b el 1
+rm becaus coar 1
+rm benefit 1
+rm defin 1
+rm hem 2
+rm hem hem 1
+rm is repr 1
+rm match 1
+rm match schem 1
+rm match vs 1
+rm onl slight 1
+rm or hem 1
+rm pb 1
+rm requir 1
+rm th manifold 1
+rm.099.02 1
+rmk 1
+rmsp 1
+rmsp achief 1
+rmsp achief flow 1
+rmsp ack 1
+rmsp and ack 1
+rmsp arrang 1
+rmsp assum 1
+rmsp can us 1
+rmsp can wait 1
+rmsp faster 1
+rmsp for nxn 1
+rmsp goal 1
+rmsp is compar 1
+rmsp is suit 1
+rmsp layer 1
+rmsp layer multiplec 1
+rmsp layer recogniz 1
+rmsp maintain 1
+rmsp multiplec 1
+rmsp multiplec se 1
+rmsp nak 1
+rmsp port 1
+rmsp proc 1
+rmsp proc tim 1
+rmsp protocol 1
+rmsp protocol arrang 1
+rmsp prov 1
+rmsp put 1
+rmsp receiv 1
+rmsp receiver 1
+rmsp receiver proc 1
+rmsp receiver spen 1
+rmsp result 1
+rmsp rmsp 1
+rmsp run 1
+rmsp se 1
+rmsp se layer 1
+rmsp se proc 1
+rmsp sen 1
+rmsp sender 1
+rmsp sender nod 1
+rmsp sender proc 1
+rmsp throughput 1
+rmsp throughput an 1
+rmsp throughput rat 1
+rmsp transport 1
+rmsp transport pack 1
+rmsp upd 1
+rmsp us 1
+rmsp var 1
+rmsp yield 1
+rmsp yield high 1
+rmtp 1
+rmtp throughput 1
+rn 19
+rn approach 1
+rn argn 1
+rn be correspon 1
+rn be gener 1
+rn ch 1
+rn ch ma 1
+rn contain 1
+rn defin 1
+rn espac 1
+rn espac vectoriel 1
+rn et rn 1
+rn hav rich 1
+rn in oe 1
+rn is modif 1
+rn learn 1
+rn learn multipl 1
+rn log 1
+rn m defin 1
+rn method 1
+rn model 1
+rn ont 1
+rn ont pour 1
+rn rn 1
+rn to gener 1
+rn to infer 1
+rn to learn 1
+rn to repr 1
+rn tout 1
+rn tout en 1
+rnam 1
+rnam uniqu 1
+rnam uniqu identif 1
+rng 1
+rng al maxim 1
+rnr 1
+ro 17
+ro and k.ramamohanar 1
+ro and oliv 1
+ro cannot support 1
+ro curd 1
+ro diku 1
+ro huit 1
+ro95 1
+road 5
+road and low 1
+road program 1
+road program incorpor 1
+road segm 1
+road with var 1
+roam 1
+rob 2
+rob78 1
+rob81 1
+rob91 1
+robbin 2
+rober 19
+rober alverson 1
+rober cooper 1
+rober cor 1
+rober div 1
+rober gruber 1
+rober harper 1
+rober leland 2
+rober paig 1
+rober sp 1
+rober tam 1
+rober trappl 1
+rober zeleznik 1
+rober zicar 2
+robertson 2
+robertson and card 1
+robertson and stuart 1
+robin 7
+robin and deficit 1
+robin and stop 1
+robin assignm 1
+robin cel 1
+robin cel multiplec 1
+robin edenfield 1
+robin fash 1
+robin milner 1
+robin schedl 1
+robin schedl discipl 1
+robin scheduler 1
+robin scheduler allow 1
+robinson 5
+robot 7
+robot and autom 2
+robot appl 1
+robot by multihierarch 1
+robot configur 1
+robot fac 1
+robot labor 1
+robot manipl 1
+robot manufactur 1
+robot mot 1
+robot mot plan 1
+robot navig 1
+robot pa 1
+robot report 1
+robot research 1
+robot research labor 1
+robot ster 1
+robot ster vi 1
+robot system 2
+robot vi 2
+robot wh 1
+robot wh prior 1
+robotiqu 3
+robson 1
+robust 26
+robust a ga 1
+robust acc 1
+robust acc method 1
+robust algorithm 2
+robust and con 1
+robust and eff 1
+robust and fast 1
+robust and fault 1
+robust and good 1
+robust as algorithm 1
+robust by mak 1
+robust cluster 1
+robust d av 1
+robust de 1
+robust de algorithm 1
+robust dent 1
+robust dent detect 1
+robust dynam 1
+robust dynam learn 1
+robust expon 1
+robust expon bound 1
+robust for high 1
+robust impl. 1
+robust of 3d 1
+robust of polymorph 1
+robust of recognit 1
+robust order 1
+robust progr 1
+robust progr learn 1
+robust prototyp 1
+robust reason 1
+robust reason method 1
+robust regr 1
+robust regr method 1
+robust simil 1
+robust simil invar 1
+robust st 1
+robust st understander 1
+robust stat 1
+robust th st 1
+robust than algorithm 1
+robust to chang 1
+robust to skew 1
+robust transact 1
+robust transact rout 1
+robust visu 1
+robust visu tool 1
+robust vs 1
+robust wa found 1
+robust when solut 1
+robust with respect 1
+rochester 3
+rocquencourt 4
+rocquencourt rapport 1
+rocquencourt rapport de 1
+roct 1
+roct abl 1
+roct abl lookup 1
+rodeheffer 1
+rodger 2
+rodr 2
+rodr iguez 2
+rodr iguez artalej 1
+rodrigu 1
+rodriguez 2
+roever 1
+rog 1
+rog er 1
+rog er drummon 1
+roger 6
+roger chamberl 1
+roger haskin 1
+roger92 1
+rogramstart 1
+rogramstart bottom 1
+rogramstart i maxg 1
+rogramstartg 1
+roguewav 1
+rohr 1
+roj 1
+rol 35
+rol a coupl 1
+rol acc 1
+rol acc control 1
+rol acc right 1
+rol accord 1
+rol act 1
+rol addit 1
+rol addit del 1
+rol addit proc 1
+rol addit procedur 1
+rol adequ 1
+rol administer 1
+rol affect 1
+rol allow 1
+rol among new 1
+rol an assoc 1
+rol an object 1
+rol and introduc 1
+rol and justif 1
+rol and obtain 1
+rol and path 1
+rol and privileg 1
+rol and specif 1
+rol and user 1
+rol appear 1
+rol ar 1
+rol ar coupl 1
+rol ar defin 1
+rol as nod 1
+rol author 1
+rol author rol 1
+rol ba 1
+rol ba appl 1
+rol ba protect 1
+rol ba secur 1
+rol ba system 1
+rol back interrupt 1
+rol back mlt 1
+rol back transact 1
+rol begin 1
+rol being partit 1
+rol between ri 1
+rol can do.2 1
+rol can execut 1
+rol can perform 1
+rol can prolifer 1
+rol common 1
+rol compl 1
+rol compl specif 1
+rol configur 1
+rol configur proc 1
+rol connect 1
+rol coupl 1
+rol defin 1
+rol definit 1
+rol del 1
+rol del funct 1
+rol determin 1
+rol differ 1
+rol direct 1
+rol direct privileg 1
+rol ec 1
+rol either horizont 1
+rol elim 1
+rol elim redund 1
+rol en 1
+rol envisag 1
+rol exerc 1
+rol for del 1
+rol for partit 1
+rol fx 1
+rol fx1 1
+rol giv 1
+rol grant 1
+rol graph 1
+rol graph forml 1
+rol graph inclus 1
+rol graph input 1
+rol graph maint 1
+rol graph model 1
+rol graph organ 1
+rol graph path 1
+rol graph privileg 1
+rol graph remain 1
+rol graph rg 1
+rol graph rol 1
+rol graph specif 1
+rol graph start 1
+rol graph structur 1
+rol graph theor 1
+rol graph wh 1
+rol hav acc 1
+rol holder 1
+rol horizont 1
+rol horizont input 1
+rol in allow 1
+rol in design 1
+rol in exampl 1
+rol in learn 1
+rol in quest 1
+rol in solut 1
+rol in system 1
+rol indep 1
+rol individu 1
+rol individu schem 1
+rol inter 1
+rol inter relationship 1
+rol is ad 1
+rol is author 1
+rol is constrain 1
+rol is defin 1
+rol is equip 1
+rol is indep 1
+rol is split 1
+rol is wh 1
+rol left intact 1
+rol maint 1
+rol maint tool 1
+rol manag 1
+rol manag pr 1
+rol manag tool 1
+rol nam 1
+rol nam direct 1
+rol nam rnam 1
+rol of clp 1
+rol of coh 1
+rol of compiler 1
+rol of developer 1
+rol of escap 1
+rol of geometer 1
+rol of inhibit 1
+rol of n0 1
+rol of natur 1
+rol of pag 1
+rol of ri 1
+rol of rol 1
+rol of sv 1
+rol of tag 1
+rol of td 1
+rol of typ 1
+rol of visu 1
+rol of vpm 1
+rol offer 1
+rol ofv 1
+rol order 1
+rol organ 1
+rol organ deriv 1
+rol organ framework 1
+rol organ model 1
+rol organ structur 1
+rol part 1
+rol part order 1
+rol particip 1
+rol partit 1
+rol path 1
+rol privileg 1
+rol privileg author 1
+rol privileg inclus 1
+rol privileg output 1
+rol privileg se 1
+rol r conform 1
+rol r1 1
+rol re 1
+rol re fact 1
+rol re forc 1
+rol rel 2
+rol relationship 1
+rol relationship compl 1
+rol relationship disc 1
+rol requir 1
+rol resourc 1
+rol resourc user 1
+rol result 1
+rol retain 1
+rol ri 1
+rol rol 1
+rol rol author 1
+rol rol fx 1
+rol se 1
+rol se fa 1
+rol so del 1
+rol specif 1
+rol specif captur 1
+rol structur 1
+rol that comp 1
+rol that ec 1
+rol that embod 1
+rol that replac 1
+rol that schem 1
+rol to compl 1
+rol to junior 1
+rol to pl 1
+rol to refer 1
+rol to reflect 1
+rol to rk 1
+rol to senior 1
+rol to system 1
+rol under consider 1
+rol var 1
+rol var rk 1
+rol ver 1
+rol ver input 1
+rol which encomp 1
+rol which mak 1
+rol whil construc 1
+rol wil becom 1
+rol with direct 1
+rol with indirect 1
+rol x1 1
+rol87 1
+roland 1
+roland karlsson 1
+roland sic.se 1
+rollback 4
+rollback concur 1
+rollback dur norm 1
+rollback execut 1
+rollback for incompl 1
+rollback for system 1
+rollback is henc 1
+rollback must succeed 1
+rollback nec 1
+rollback of comp 1
+rollback of incompl 1
+rollback oper 1
+rollback ordin 1
+rollback ordin requir 1
+rollback synchron 1
+rollback to proceed 1
+rollback using 2
+rollback using writ 2
+rollback work 1
+rollf 1
+rollf rollk 1
+rollf windf 1
+rollk 1
+rolst 2
+rolst and faustin 1
+rom 2
+rom de 1
+rom lab 1
+roman 1
+romp 1
+romp pa 1
+romp pa le 1
+ron 2
+ron barber 1
+ron kikin 1
+ron va 1
+ron va du 1
+ronald 1
+ronveaux 1
+roof 1
+room 8
+room 3room 1
+room arrang 1
+room computer 1
+room facil 1
+room facil layout 1
+room for inst 1
+room for signif 1
+room number 1
+room sw103 1
+room that hous 1
+room thought 1
+room to spar 1
+room wh 1
+room which captur 1
+room with ext 1
+room with telephon 1
+root 27
+root and cal 1
+root and currnod 1
+root and follow 1
+root and inclus 1
+root ar ap 1
+root ar fl 1
+root ar init 1
+root as currnod 1
+root at addr 1
+root at nod 1
+root at v2 1
+root cannot reach 1
+root cl 1
+root cl object 1
+root graph 1
+root highestdegreenod 1
+root hold 1
+root ident 1
+root in csl 1
+root in level 1
+root init 1
+root is ch 1
+root is creat 1
+root is fl 1
+root is se 1
+root is sup 1
+root leaf 1
+root leaf path 1
+root level 2
+root me 2
+root mean 1
+root mean squar 1
+root nod 5
+root nod correspon 1
+root nod cr 1
+root nod number 1
+root nod plur 1
+root nod sen 1
+root nod split 1
+root not bal 1
+root of subtr 2
+root or connect 1
+root pe 1
+root pick 1
+root proc 1
+root receiv 1
+root selectfirst 1
+root th candid 1
+root then act 1
+root then currnod 1
+root then exp4 1
+root then init 1
+root then pick 1
+root then po4 1
+root then solut 1
+root then stop 1
+root tr 3
+root upd 1
+root using 2
+root using report 1
+root valu 1
+root which sen 1
+root3 1
+root3 s0 1
+root4 1
+root4 sn 1
+root4 sn lastnod4 1
+root4 to lastnod4 1
+rootnod 1
+rootp4 1
+rootp4 p3 1
+rootp4 p3 p2 1
+roper 1
+rosc 1
+roseman 1
+rosenbl 2
+rosenbl and john 1
+rosenbl and ousterhout 1
+rosenfeld 2
+rosenzweig 1
+rosser 2
+rosser by mark 1
+rosser in sect 1
+rosser proper 1
+rosser theorem 1
+rossignac 1
+rossum 2
+rot 11
+rot act 1
+rot act sur 1
+rot al point 1
+rot and rigid 1
+rot and transl 1
+rot angl 1
+rot del 1
+rot del tok 1
+rot et le 1
+rot fr 1
+rot fr1 1
+rot group 1
+rot imag 1
+rot imag plan 1
+rot learn 1
+rot matr 1
+rot num 1
+rot num head 1
+rot of dn 1
+rot on 1
+rot on part 1
+rot regr 1
+rot regr algorithm 1
+rot rl 1
+rot select 1
+rot select nod 1
+rot sous 1
+rot sous form 1
+rot th figur 1
+rotem 1
+roth 3
+roth hay 1
+roth hay roth 1
+rothberg 4
+rothberg and bruc 1
+rothberg and hendrickson 1
+rothermel 2
+rothermel and m.j 1
+rothermel and mar 1
+rothstein 1
+rotor 1
+rotterdam 1
+rou 3
+rou bi 1
+rou bi ee 1
+rou de 2
+rou de la 1
+rou de loter 1
+rou proportionnel 1
+roucairol 1
+roug 1
+rough 23
+rough be classif 1
+rough con. 1
+rough divid 1
+rough equ 5
+rough equ part 1
+rough equ siz 1
+rough equiv 1
+rough illustr 1
+rough in proport 1
+rough jv0j 1
+rough speak 2
+rough surfac 1
+rough tag 1
+rough to me 1
+round 10
+round and maxim 1
+round error 1
+round incr 1
+round incr congest 1
+round of regl 1
+round of tok 1
+round procedur 1
+round requir 1
+round solut 1
+round valu 1
+round1 1
+round1 round2 1
+round1 round2 round3 1
+round2 1
+round2 round3 1
+round2 round3 round4 1
+round3 1
+round3 round4 1
+round3 round4 round5 1
+round4 1
+round4 round5 1
+round5 1
+roundtrip 1
+roundtrip del 1
+roundtrip tim 1
+roundtrip tim estim 1
+rousseeuw 2
+roussopoul 2
+rout 40
+rout a me 1
+rout a minim 1
+rout a multidest 1
+rout a thin 1
+rout a wir 1
+rout algorithm 5
+rout algorithm respon 1
+rout algorithm subject 1
+rout along interm 1
+rout and bit 1
+rout and commun 1
+rout and load 1
+rout and parallel 1
+rout and propag 1
+rout and us 1
+rout and workload 1
+rout ar calcl 1
+rout ar gener 1
+rout ar st 1
+rout as disc 1
+rout at tim 1
+rout avail 1
+rout by using 1
+rout calcl 1
+rout can help 1
+rout can schedl 1
+rout capabil 1
+rout chang 1
+rout compon 1
+rout compon build 1
+rout compon implem 1
+rout compon inst 1
+rout compon pa 1
+rout compon pf 1
+rout compon regl 1
+rout concern 1
+rout conform 1
+rout conform path 1
+rout connect 1
+rout contain 1
+rout contain init 1
+rout cop 1
+rout correspon 1
+rout cr 2
+rout cr connect 1
+rout dan 1
+rout dan le 1
+rout dat 1
+rout de 3
+rout de luciol 2
+rout de me 1
+rout deadlock 1
+rout describ 4
+rout describ prev 1
+rout design 1
+rout design exampl 1
+rout determin 1
+rout dfg 1
+rout dfg dep 1
+rout dstein 1
+rout du 1
+rout efluc 1
+rout es 1
+rout es par 1
+rout estim 1
+rout ev pe 1
+rout event 1
+rout event int 1
+rout exampl 1
+rout execut 1
+rout filter 1
+rout filter no 1
+rout for dat 1
+rout for distribut 1
+rout for receiv 1
+rout for spf 1
+rout from input 1
+rout funct 1
+rout gener 2
+rout gener loop 1
+rout grph 1
+rout grph object 1
+rout ha led 1
+rout hardwar 1
+rout in 2d 1
+rout in commun 1
+rout in distribut 1
+rout in figur 1
+rout in inter 1
+rout in irregl 1
+rout in mult 1
+rout in multicomputer 1
+rout in multiproc 1
+rout in random 1
+rout in uncontrol 1
+rout inform 2
+rout interconnect 1
+rout interconnect network 1
+rout is invok 1
+rout is schedl 1
+rout is smaller 1
+rout k ary 2
+rout load 1
+rout load vs 1
+rout ma 1
+rout ma parallel 1
+rout mak 1
+rout mak us 1
+rout me 3
+rout mechan 1
+rout meter 1
+rout mult 1
+rout mult network 1
+rout multitermin 1
+rout multitermin net 1
+rout must return 1
+rout net 1
+rout network 3
+rout of commun 1
+rout of dest 1
+rout of me 1
+rout of minim 1
+rout of unicast 1
+rout oper 2
+rout over hb 1
+rout over hc 1
+rout over link 1
+rout pack 1
+rout pack creat 1
+rout pack receiv 1
+rout perform 1
+rout pkt 1
+rout plur 1
+rout problem 1
+rout procedur 2
+rout proof 1
+rout protocol 1
+rout protocol me 1
+rout protocol using 1
+rout qu 1
+rout qu nous 1
+rout random 1
+rout random select 1
+rout refer 1
+rout requir 1
+rout schem 2
+rout sendwith 1
+rout siml 1
+rout sp 1
+rout sp ecifiqu 1
+rout specif 1
+rout string 1
+rout switch 2
+rout switch techniqu 1
+rout system 2
+rout tabl 2
+rout tabl lookup 1
+rout tak 2
+rout task 1
+rout task tak 1
+rout techniqu 1
+rout testb 1
+rout testb ba 1
+rout th cont 1
+rout th me 1
+rout th result 1
+rout th train 1
+rout that perform 1
+rout that proc 1
+rout tim 1
+rout to aid 1
+rout to output 1
+rout to proc 1
+rout to random 1
+rout unidirect 1
+rout unidirect mult 1
+rout wherein 1
+rout whil adapt 1
+rout with exact 1
+rout with polynom 1
+rout with prefer 1
+rout work 1
+router 9
+router and channel 1
+router and connect 1
+router and diver 1
+router and interconnect 1
+router and link 1
+router ar interconnect 1
+router as shown 1
+router construc 1
+router cost 1
+router cost becom 1
+router cost consider 1
+router crossbar 1
+router destinationrouter 1
+router destinationrouter communicationm 1
+router interconnect 1
+router is giv 1
+router is maintain 1
+router log 2
+router networkinterfac 1
+router networkinterfac networkinterfac 1
+router offer 1
+router r 22r8r 1
+router requir 1
+router support 1
+router support wider 1
+router to interconnect 1
+router wh 1
+routin 1
+routin scan 1
+rovan 1
+rover 1
+row 21
+row and column 6
+row ar assign 1
+row assign 1
+row at column 1
+row aver 1
+row broadcast 1
+row bus 1
+row by row 2
+row column 1
+row correspon 2
+row distribut 1
+row giv 1
+row ha width 1
+row in aw 1
+row is comput 1
+row is exact 1
+row is mov 1
+row is term 1
+row k st 1
+row k using 1
+row label 1
+row label scor 1
+row major 2
+row major order 2
+row of fig 1
+row of ri 1
+row of t1 1
+row of t2 1
+row or column 1
+row output 1
+row rc 1
+row se 1
+row sum 1
+row t00 1
+row tableau 1
+row tag 1
+row tal 1
+row tim 1
+row tim vect 1
+row to ensur 1
+row vect 1
+row wi 1
+row with ind 1
+row zer 1
+rowan.ukc.ac.uk 1
+rowan.ukc.ac.uk is situ 1
+rown 1
+rown fox 1
+rown foxj 1
+rown foxj ump 1
+roy 10
+roy a introduir 1
+roy de 1
+roy de sc 1
+roy et al 1
+roy fus 1
+roy fus ce 1
+roy institut 1
+roy la 1
+roy la supposer 1
+roy ment 1
+roy stat 3
+roy stat soc 2
+roy taylor 1
+roy want 1
+royalt 1
+royd 1
+roz 1
+rozenberg 1
+rozman 1
+rp 8
+rp and output 1
+rp and prp 1
+rp cl 1
+rp fl 1
+rp gp 1
+rp server 1
+rp3 1
+rp3 proc 1
+rp3 proc memor 1
+rpb 2
+rpb cr 1
+rpb disc.anu.edu.au 1
+rpc 2
+rpc remot 1
+rpc remot procedur 1
+rpc styl 1
+rpc styl me 1
+rpc styl sen 1
+rph 1
+rph pfn 1
+rph pfn phy 1
+rplac 1
+rplac and rplacd 1
+rplac j rplacd 1
+rplac rplacd 1
+rplac rplacd impl 1
+rplacd 1
+rplacd impl 1
+rplacd in tradit 1
+rplacd instruc 1
+rplacd instruc correspon 1
+rproc 1
+rproc that receiv 1
+rq 3
+rq branch 1
+rq branch eman 1
+rqtkd96.ps 1
+rr 12
+rr and wr 1
+rr ca 1
+rr ca rw 1
+rr fl 1
+rr rutcor.rutger.edu 1
+rr rw 1
+rr s1 1
+rr s1 s2 1
+rr stat 1
+rr stat rslack 1
+rr wr 1
+rr wr commun 1
+rreq 1
+rreq oe 1
+rreq rreq 1
+rrst 1
+rrst rslack 1
+rrst rslack piwpiwt 1
+rs 10
+rs childr 1
+rs del 1
+rs last mov 1
+rs oper 1
+rs oper con 1
+rs register 1
+rs se 1
+rs se valu 1
+rs6000 2
+rs6000 ba 1
+rs6000 ba mach 1
+rs85 1
+rs94 1
+rsd0c 1
+rslack 1
+rslack pi 1
+rslack pi wp 1
+rslack piwpiwt 1
+rst 2
+rst branch 1
+rst comput 1
+rst comput ba 1
+rst describ 1
+rst improv 1
+rst improv not 1
+rst is empt 1
+rst select 1
+rst select strateg 1
+rst sort 1
+rt 6
+rt 1ar 1
+rt 1ri 1
+rt aslan 1
+rt fl 1
+rt gi 1
+rt ri 1
+rt rt 1
+rt wi 1
+rt0 1
+rt0 r0 1
+rt1 1
+rt1 al remov 1
+rt1 or rt2 1
+rt1 proceed 1
+rt1 rt3 1
+rt1 with regard 1
+rt2 1
+rt2 al chang 1
+rt2 and rt3 1
+rt2 solut 1
+rt2 sort 1
+rt3 1
+rt3 is inappropr 1
+rt3 mak 1
+rt3 mak us 1
+rt3 requir 1
+rt3 therefor 1
+rt3 therefor us 1
+rt3 vs 1
+rt3 wer implem 1
+rth 1
+rth tim 1
+rtj 1
+rtl 1
+rtp 1
+rtp2 1
+rtrl 1
+rtrl algorithm 1
+rtserv 1
+ru 4
+ru du 2
+ru marqu 1
+ru saint 1
+ru saint martin 1
+rub 1
+rub n pr 1
+rubber 1
+rubber sh 1
+rubin 2
+rudim 2
+rudim knowledg 1
+rudim syntact 1
+rudolf 1
+rudolf berrendorf 1
+rudolph 3
+rudolph ton 1
+ruffin 1
+ruffin sor.inr.fr 1
+ruin 1
+ruin program 1
+ruin program understand 1
+ruiz 1
+ruiz de 1
+ruiz de angl 1
+ruler 1
+ruler and comp 1
+rum91 1
+rumbaugh 1
+rumelhart 4
+rumor 1
+rumor about exper 1
+run 72
+run a benchmark 1
+run a compl 1
+run a graph 1
+run a se 1
+run a thread 1
+run a1 1
+run a2 1
+run act 1
+run al test 1
+run an im 1
+run and step 1
+run and test 1
+run appl 1
+run appl proc 1
+run ar block 1
+run ar ident 1
+run ar indistingu 1
+run ar prefer 1
+run ar repeat 1
+run arbitr 1
+run arbitr learn 1
+run as eff 1
+run assoc 1
+run at 200mhz 1
+run ba 1
+run boolean 1
+run boolean eval 1
+run ca 1
+run cam 1
+run cam program 1
+run concur 1
+run counter 1
+run cour 1
+run dejavu1 1
+run each program 1
+run entir 1
+run exampl 2
+run f program 1
+run fl 1
+run fl recur 1
+run giv 1
+run heur 1
+run heur nt 1
+run heur uv 1
+run in approxim 1
+run in const 1
+run in coroutin 1
+run in lin 1
+run in parallel 3
+run in polylogarithm 1
+run in polynom 3
+run in stag 1
+run in tim 4
+run init 1
+run init look 1
+run is pack 1
+run jmp 1
+run last st 1
+run length 1
+run length algorithm 1
+run length smooth 1
+run mar 1
+run mb 1
+run multipl 1
+run multipl model 1
+run not result 1
+run oe 1
+run oe contain 1
+run oe1 1
+run oe3 1
+run oeab 1
+run oeab contain 1
+run oeb 1
+run oeb contain 1
+run of mar 1
+run of rm 1
+run on gener 1
+run on polyhedr 1
+run on random 1
+run on sent 1
+run on singl 1
+run on stand 1
+run on sun 1
+run on top 1
+run our dejavu 1
+run our model 1
+run our tool 1
+run patholog 1
+run patholog0 1
+run pr 1
+run program 1
+run quick 1
+run quit fast 1
+run remain 1
+run sampl 1
+run sampl quer 1
+run selecttest 1
+run sequ 1
+run sever var 1
+run sicstus 1
+run signif 1
+run signif faster 1
+run st 1
+run start 1
+run sun 1
+run test 1
+run th appl 1
+run th experim 1
+run th intraprocedur 1
+run th modif 1
+run th network 1
+run th parameter 1
+run th program 1
+run th quer 1
+run th record 1
+run th schem 1
+run th select 1
+run th server 1
+run th siml 1
+run th step 1
+run th sun 1
+run th system 1
+run th test 1
+run th univer 1
+run thread 1
+run through tm 1
+run tim 37
+run tim acc 1
+run tim accord 1
+run tim approach 1
+run tim ba 1
+run tim behavior 1
+run tim cal 1
+run tim catalog 1
+run tim complec 1
+run tim control 1
+run tim cost 1
+run tim dat 2
+run tim dep 2
+run tim descript 1
+run tim eff 1
+run tim environm 1
+run tim gener 1
+run tim incr 1
+run tim init 1
+run tim load 1
+run tim me 1
+run tim memor 1
+run tim overhead 2
+run tim profil 1
+run tim reduc 1
+run tim remain 1
+run tim repr 1
+run tim stack 1
+run tim system 3
+run tim typ 1
+run tim work 1
+run to compl 2
+run to fl 1
+run to upd 1
+run tw 1
+run under chem 1
+run under un 1
+run user 1
+run user cod 1
+run using 1
+run viol 1
+run viol pb2 1
+run wel compil 1
+run wer halt 1
+run wer mad 2
+run with low 1
+run100 1
+runm 1
+runtim 16
+runtim and qu 1
+runtim architectur 1
+runtim argum 1
+runtim bind 1
+runtim bound 1
+runtim dat 1
+runtim dat structur 1
+runtim datab 1
+runtim datab ba 1
+runtim debugger 1
+runtim differ 1
+runtim differ betw 1
+runtim divid 1
+runtim heap 1
+runtim in order 1
+runtim layer 1
+runtim libr 1
+runtim memor 1
+runtim memor organ 1
+runtim overhead 1
+runtim perform 1
+runtim sem 1
+runtim signif 1
+runtim signif incr 1
+runtim stack 1
+runtim structur 1
+runtim system 2
+runtim technolog 1
+runus 1
+rus 6
+rus epreuv 1
+rus et la 1
+rus rus 1
+rus self 1
+rushm 1
+rusinowitch 1
+rusk 1
+russel 2
+russel bradford 1
+russel reed 1
+rutcor 1
+rutcor ffl rutger 1
+rutcor research 1
+rutcor research report 1
+rutcor.rutger.edu 1
+rutger 2
+rutger center 1
+rutter 1
+ruu 1
+ruu cs 1
+rv 1
+rv rv 1
+rv rv rv 1
+rw 2
+rw and ww 1
+rw ca 1
+rw ca wr 1
+rw ww 1
+rw ww commun 1
+rwc 1
+rwc techn 1
+rwc techn report 1
+rwcp1 1
+rwcp1 neur 1
+rwcp1 neur sic2 1
+rwk88 1
+rwth 1
+rwth aach 1
+rx 3
+rx is cap 1
+rx oper 1
+rx oper strength 1
+rx perform 1
+rx perform compar 1
+rx remain 1
+rx remain const 1
+rx schem 1
+rx uniform 1
+rxf 1
+rxj0 1
+ryer 1
+ryer hav nam 1
+ryer93 1
+rzu 1
+rzv 1
+s 6
+s 9j 1
+s aek 1
+s at 1i 1
+s c1 1
+s c11 1
+s c11 est 1
+s el 1
+s el cont 1
+s exerc 1
+s exerc privileg 1
+s f s 1
+s i est 1
+s il 1
+s il cont 1
+s il ec 1
+s il est 1
+s il peut 1
+s im est 1
+s it est 1
+s jj 1
+s le 1
+s le vecteur 1
+s t est 1
+s.a 4
+s.b 5
+s.c 2
+s.e 2
+s.f 1
+s.g 2
+s.j 3
+s.k 4
+s.l 2
+s.m 3
+s.m.wat 1
+s.mallat 1
+s.n 1
+s.natkin 1
+s.p 3
+s.r 1
+s.s 3
+s.se 1
+s.t 3
+s.targ.se 1
+s.y 1
+s0 14
+s0 a0 1
+s0 a0 u1 1
+s0 ar sem 1
+s0 assoc 1
+s0 contain 1
+s0 gather 1
+s0 is satisf 1
+s0 obtain 1
+s0 root4 1
+s0 root4 sn 1
+s0 s0 1
+s0 that requir 1
+s0 wh 1
+s0 wil lo 1
+s00 2
+s00i 1
+s01 3
+s01 and s02 2
+s01 and s1 1
+s01 and s2 1
+s01 s02 2
+s02 4
+s02 s12 1
+s02 with s1 1
+s02ns 1
+s0432 1
+s0432 mean 1
+s0i 3
+s0n 1
+s0n with si 1
+s1 30
+s1 a t1 1
+s1 a u1 1
+s1 abcdef 1
+s1 and s10 1
+s1 and s2 5
+s1 and t1 1
+s1 at t1 1
+s1 can contain 1
+s1 compon 1
+s1 cs 1
+s1 cs t0 1
+s1 drawn 1
+s1 e1 1
+s1 fl 1
+s1 fun 1
+s1 in main 1
+s1 in sy 1
+s1 is encounter 1
+s1 jj 1
+s1 jj s2 1
+s1 le 1
+s1 le acc 1
+s1 may saf 1
+s1 n etant 1
+s1 on choisit 1
+s1 on s2 1
+s1 produc 1
+s1 s02 1
+s1 s1 2
+s1 s1 cs 1
+s1 s10 1
+s1 s2 6
+s1 s2 t1 2
+s1 s7 1
+s1 s7 repeat 1
+s1 sn 1
+s1 sn s1 1
+s1 system11 1
+s1 system11 sy 1
+s1 system21 1
+s1 t1 1
+s1 typedef 1
+s1 typedef r2 1
+s1 v erif 1
+s1 var 1
+s1 wa pack 1
+s1 wh 1
+s1 wh s0 1
+s1 wil read 1
+s1 xor 1
+s1.s2.p3.p4.s5.s6.s7 1
+s10 3
+s10 and s100 1
+s10 ar syntact 1
+s10 visit 1
+s10.return 1
+s100 2
+s11 1
+s11 and s12 1
+s12 2
+s1cal 1
+s1cal as2cal 1
+s1cal as2cal cs3cal 1
+s1e 1
+s1g 1
+s1i 2
+s1i and hg2 1
+s1n 1
+s1s2p3f 1
+s1s2p3f tp4 1
+s1s2p3f tp4 s7s8s9 1
+s1v1 1
+s2 27
+s2 and s20 1
+s2 and s4 1
+s2 and var 1
+s2 at t2 1
+s2 belong 1
+s2 cannot execut 1
+s2 cod 1
+s2 cod de 1
+s2 drawn 1
+s2 ff1 1
+s2 ff1 s2gg 1
+s2 fl 1
+s2 in p2 1
+s2 is arrow 1
+s2 is giv 1
+s2 is im 1
+s2 must begin 1
+s2 produc 1
+s2 qu 1
+s2 qu est 1
+s2 read 1
+s2 repr 1
+s2 repr job 1
+s2 retr 1
+s2 s1 1
+s2 s1 xor 1
+s2 s20 1
+s2 s20 visit 1
+s2 s3 1
+s2 s3 merg1 1
+s2 s3 wait1 1
+s2 s3s4 1
+s2 s3s4 p1 1
+s2 should contain 1
+s2 system12 1
+s2 system22 1
+s2 t1 2
+s2 t1 t2 2
+s2 t2 1
+s2 trust 1
+s2 typedef 1
+s2 typedef r2 1
+s2 typedef r3 1
+s2 u2 1
+s2 var 1
+s2 why 1
+s2 writ 1
+s2 x kxk3 1
+s20 2
+s20 is s50 1
+s20 visit 1
+s22 1
+s22 s32 1
+s22 s32 s42 1
+s25 1
+s2670 1
+s2gg 1
+s2gg wh 1
+s2gg wh ffsg 1
+s2i 1
+s2i ar distinct 1
+s2p3p4s5a 1
+s2p3p4s5a s6 1
+s2p3p4s5a s6 s5 1
+s2s 1
+s2s bs 1
+s2xt 1
+s3 9
+s3 and s2 1
+s3 and s30 1
+s3 and s50 1
+s3 asser 1
+s3 cod 1
+s3 cod de 1
+s3 entr 1
+s3 et est 1
+s3 exit4 1
+s3 merg1 1
+s3 s30 1
+s3 s30 visit 1
+s3 selecttest 1
+s3 trust 1
+s3 visit 1
+s3 wait1 1
+s3 with s1 1
+s30 2
+s30 visit 1
+s32 1
+s32 s42 1
+s38584.1 1
+s3s4 1
+s3s4 p1 1
+s3s4 p1 s4s5 1
+s4 5
+s4 and p40 1
+s4 and s40 1
+s4 caus 1
+s4 f tp1p2p3 1
+s4 no longer 1
+s4 produc 1
+s4 to s5 1
+s40 2
+s42 1
+s4s5 1
+s5 3
+s5 and s5a 1
+s5 in avg 1
+s5 in procedur 1
+s5 repr 1
+s5 s8s9 1
+s5.s6.s8 1
+s50 2
+s50 visit 1
+s52 1
+s52 s62 1
+s52 s62 s72 1
+s5a 1
+s5a and cal 1
+s6 3
+s6 and s5 1
+s6 and s60 1
+s6 and sl 1
+s6 can ea 1
+s6 s5 1
+s6 s5 s8s9 1
+s60 2
+s62 1
+s62 s72 1
+s62 s72 s82 1
+s6288 1
+s6288 forml 1
+s6600132 1
+s7 2
+s7 and s80 1
+s7 ha erron 1
+s7 repeat 1
+s72 1
+s72 s82 1
+s72 s82 s92 1
+s7552 1
+s7552 mean 1
+s7s8s9 1
+s7s8s9 fs6ts5 1
+s7s8s9 fs6ts5 s10 1
+s8 1
+s8 and s80 1
+s80 1
+s82 1
+s82 s92 1
+s84 1
+s89 1
+s8s9 1
+s9 1
+s9.s10 1
+s92 1
+sa 16
+sa addr 1
+sa addr spac 1
+sa algorithm 2
+sa and le 1
+sa and shar 1
+sa at tim 1
+sa can distingu 1
+sa cannot distingu 1
+sa cannot rec 1
+sa capacit 1
+sa concept 1
+sa cr 1
+sa cr eat 1
+sa crash 1
+sa d eriv 1
+sa descript 1
+sa descript de 1
+sa droit 1
+sa ea 1
+sa error 1
+sa error evalu 1
+sa experim 1
+sa for protein 1
+sa form 2
+sa form de 2
+sa form init 1
+sa form matriciel 1
+sa form norm 1
+sa gener 1
+sa grand 1
+sa grand diffus 1
+sa in oeab 1
+sa inclus 1
+sa inclus uniform 1
+sa int loc 1
+sa is lik 1
+sa is stat 1
+sa l egalit 1
+sa lib 1
+sa lib erat 1
+sa localit 1
+sa m emoir 2
+sa m ethod 1
+sa mach 1
+sa mach abstrait 1
+sa matr 1
+sa mi 2
+sa mi en 2
+sa moy 1
+sa must execut 1
+sa part 1
+sa partit 1
+sa port 1
+sa port ee 1
+sa prem 2
+sa propr 2
+sa propr unit 1
+sa r eal 1
+sa r esolut 1
+sa racin 1
+sa receiv 1
+sa rel 2
+sa rel bien 1
+sa rel etroit 1
+sa repr 2
+sa repr es 1
+sa repr sent 1
+sa sb 1
+sa sel 1
+sa structur 1
+sa structur stochastiqu 1
+sa t enacit 1
+sa th 2
+sa th es 2
+sa tr 1
+sa tr es 1
+sa transit 1
+sa transit matr 1
+sa using 1
+sa valeur 3
+sa valeur dadapt 1
+sa valeur de 1
+sa valeur est 2
+sa valeur minim 1
+sa valeur peut 1
+sa valeur pr 1
+sa var 1
+sa var de 1
+sa ver 3
+sa ver par 1
+sa ver transform 1
+sa vit 1
+sa3 1
+sa4 1
+sa77 1
+sa95 1
+sa97 1
+saad 1
+saak 1
+saaltink 1
+saarbr 2
+saarbr uck 2
+sab 1
+sab hubrig 1
+sab hubrig schaumburg 1
+sabat 1
+sabnan 1
+sabstrair 1
+sabstrair de 1
+sabstrair de probl 1
+sac 1
+sacc 1
+saccompagn 1
+saccompagn de 1
+saccompagn de distribut 1
+saccompagn de la 1
+saccompagn g en 1
+saccompagn pa 1
+saccompagn pa de 1
+saccompagner 1
+saccompagner dun 1
+saccr 1
+saccr t tr 1
+sach 1
+sach qu 1
+sach qu sicstus 1
+sacrif 4
+sacrif perform 1
+sacrif perform remain 1
+sacrif som concur 1
+sacrif th concur 1
+sacrif th del 1
+sadapter 1
+sadapter aux 1
+sadapter aux besoin 1
+saddl 1
+saddl hi hor 1
+sadm 1
+sadm regroup 1
+sadm regroup de 1
+sadourn 1
+sadr 1
+saenz 1
+saetz 1
+saf 30
+saf acc 1
+saf algorithm 1
+saf algorithm cur 1
+saf an 1
+saf and distribut 1
+saf and progr 1
+saf and regl 1
+saf appl 1
+saf arg 1
+saf be select 1
+saf be substitut 1
+saf beam 1
+saf ch 1
+saf cop 1
+saf cop act 1
+saf cop env2 1
+saf crit 3
+saf crit appl 3
+saf crit system 1
+saf cutout 1
+saf deliver 1
+saf for control 1
+saf forml 1
+saf guard 1
+saf in gener 1
+saf in situ 1
+saf is satisf 1
+saf manipl 2
+saf may om 1
+saf net 1
+saf of dynam 1
+saf of worker 1
+saf or progr 1
+saf pair 1
+saf predict 1
+saf problem 1
+saf quer 1
+saf regr 1
+saf regr test 1
+saf rel 1
+saf rel calculus 1
+saf rout 1
+saf rout procedur 1
+saf setarg 1
+saf substitut 1
+saf system 1
+saf techniqu 1
+saf techniqu dep 1
+saf techniqu select 1
+saf test 1
+saf test se 1
+saf test select 1
+saf to assum 3
+saf to remov 1
+saf typ 1
+saf typ check 1
+saf upd 1
+saf valu 1
+safecomp 1
+safeguard 2
+safeguard against incorrect 1
+safeguard each subject 1
+safem 1
+safer 1
+safer softwar 1
+safer softwar developm 1
+saffar 1
+saffranchir 1
+saffranchir de 1
+saffranchir de tout 1
+sag 6
+sag ar compat 1
+sag comp 1
+sag dun 1
+sag dun coupur 1
+sag publ 2
+sager 1
+sager gav 1
+sager mincycl 1
+sager mincycl algorithm 1
+sager work 1
+sagir 1
+sagir d eliminer 1
+sagirait 1
+sagirait donc 1
+sagirait donc de 1
+sagissait 1
+sagissait dun 1
+sagissait dun var 1
+sagit 5
+sagit alor 1
+sagit alor de 1
+sagit alor qu 1
+sagit bien 1
+sagit bien dun 1
+sagit cep 1
+sagit cep qu 1
+sagit d etendr 1
+sagit d tud 1
+sagit dan 1
+sagit de 4
+sagit de compl 1
+sagit de concevoir 1
+sagit de couper 1
+sagit de fair 1
+sagit de garder 1
+sagit de la 2
+sagit de op 1
+sagit de ranger 1
+sagit de structurer 1
+sagit de tirer 1
+sagit de trouver 1
+sagit dic 1
+sagit dic ecuter 1
+sagit donc 2
+sagit donc de 1
+sagit donc simpl 1
+sagit dun 3
+sagit dun boucl 1
+sagit dun coupur 1
+sagit dun inver 1
+sagit dun matr 1
+sagit dun optim 1
+sagit dun ver 1
+sagit en 1
+sagit en fait 1
+sagit il 1
+sagit il dun 1
+sagit maint 1
+sagit maint de 1
+sagit pa 1
+sagit pa dun 1
+sagit simpl 1
+sagit simpl daffecter 1
+sagit simpl de 1
+sagit soit 1
+sagit soit du 1
+sagiv 2
+sagon 1
+sah 1
+sahlin 1
+sahn 3
+said 23
+said being forc 1
+said th reject 1
+said th us 1
+said to ad 1
+said to introduc 1
+said to subsum 1
+saint 3
+saint john 1
+saint martin 1
+saint sky 1
+sait 6
+sait ain 1
+sait alor 1
+sait alor qu 1
+sait appr 1
+sait appr ec 1
+sait calculer 1
+sait calculer tel 1
+sait d eterminer 1
+sait dapr 1
+sait dapr es 1
+sait donc 1
+sait pa 2
+sait pa eliminer 1
+sait pa si 1
+sait par 2
+sait par an 1
+sait par hypoth 1
+sait qu 1
+sait qu dan 1
+sait qu la 1
+sait qu le 1
+sait quon 1
+sait quon peut 1
+sait r esoudr 1
+sait san erreur 1
+sait tr 1
+sait tr es 1
+saj 2
+saj da 1
+saj pj 1
+sajout 2
+sajout a ce 1
+sajout au 1
+sajout au pr 1
+sajout le 1
+sajout le contraint 1
+sajouter 1
+sajouter du 1
+sajouter du faux 1
+sak 14
+sak of brev 1
+sak of cl 3
+sak of conv 1
+sak of exampl 1
+sak of fair 1
+sak of illustr 2
+sak of simpl 3
+sak of understand 1
+sak of uniform 1
+sal 9
+sal 30k 1
+sal 60k 1
+sal and departm 1
+sal and manager 1
+sal attribut 1
+sal by estim 1
+sal dnam 1
+sal dnam skil 1
+sal dnamev 1
+sal each empl 1
+sal earn 1
+sal emp 1
+sal emp 50k 1
+sal featur 2
+sal featur exploit 1
+sal from emp 1
+sal from empttl 1
+sal giv 1
+sal hist 1
+sal is 60k 1
+sal is greater 1
+sal jan 1
+sal of empl 2
+sal of featur 1
+sal skil 1
+sal skil dnamev 1
+sal sum 1
+sal sum task 1
+sal tot 1
+sal tot var 1
+sal tripl 1
+sal valu 2
+sal var 1
+sal wa 60k 1
+salaryg 2
+salaryg ec 1
+salaryu 1
+salaryv 1
+salaryv dnamev 1
+salaryv dnamev skillsv 1
+salaryv from emp 1
+salaryv from empsl 1
+salaryv skil 1
+salaryv ssn 1
+salem 2
+salesman 2
+salesman problem 2
+salesperson 1
+salesperson problem 1
+salom 1
+salt 1
+salt lak 1
+salt lak cit 1
+saltz 1
+saltz and vij 1
+saltz et.al 1
+saluer 1
+saluer sa 1
+saluer sa tr 1
+salzberg 3
+sam 5
+sam steppel 1
+sam toueg 1
+sam touegz 1
+sam90 1
+samad 1
+samestr 1
+sampl 30
+sampl and hybrid 1
+sampl and worst 1
+sampl approach 1
+sampl ar ch 1
+sampl ar drawn 1
+sampl ar weight 1
+sampl as input 1
+sampl as splitter 1
+sampl aver 2
+sampl ba 1
+sampl ba approach 1
+sampl branch 1
+sampl branch result 1
+sampl branch tim 1
+sampl color 1
+sampl column 1
+sampl column standard 1
+sampl dat 1
+sampl dat system 1
+sampl distribut 1
+sampl el 1
+sampl est 1
+sampl expr 1
+sampl for stochast 1
+sampl from ffq0 1
+sampl from occam 1
+sampl from slb 1
+sampl ha en 1
+sampl hybrid 1
+sampl hybrid propag 1
+sampl in sj 1
+sampl in step 1
+sampl interact 1
+sampl interact sequ 1
+sampl is norm 1
+sampl is select 1
+sampl key 1
+sampl log 1
+sampl log configur 1
+sampl matr 1
+sampl maxscor 1
+sampl maxscor minl 1
+sampl mean 1
+sampl non 1
+sampl non pattern 1
+sampl of random 1
+sampl of siz 1
+sampl of tempor 1
+sampl of var 1
+sampl or using 1
+sampl parod 1
+sampl problem 1
+sampl procedur 1
+sampl prop 1
+sampl quer 1
+sampl quer inclus 1
+sampl quer list 1
+sampl rat 1
+sampl realm 1
+sampl se 1
+sampl self 1
+sampl self rout 1
+sampl sign 1
+sampl siz 3
+sampl sk 1
+sampl sort 1
+sampl sort algorithm 1
+sampl spac 1
+sampl standard 1
+sampl standard dev 1
+sampl strateg 1
+sampl string 1
+sampl string construc 1
+sampl system 1
+sampl tak 1
+sampl techniqu 1
+sampl text 1
+sampl text gener 1
+sampl th sort 1
+sampl that receiv 1
+sampl to construc 1
+sampl valu 1
+sampl var 1
+sampl wer drawn 1
+sampl wer tak 1
+sampl wh 1
+sampl which ge 1
+sampl which lead 1
+sampl without exploit 1
+sampl xiu 1
+sampler 1
+sampler and rel 1
+san 31
+san check 1
+san dieg 14
+san dieg la 1
+san francisc 15
+san fransisc 1
+san jo 3
+san mat 8
+san miniat 1
+sand 3
+sand nat 3
+sand nat labor 3
+sand88 1
+sand92 1
+sand93 2
+sandberg 1
+sandeep 1
+sander 1
+sander mp 1
+sander mp sb.mpg.de 1
+sander program 1
+sander program ppq 1
+sandew 2
+sang 1
+sang lyl 1
+sang lyl min 1
+sanj 3
+sanj ghemawat 1
+sanj mehrotr 1
+sanj.radiag 1
+sanj.radiag sun.com 1
+sanjeev 1
+sanjeev kulkarn 1
+sankar 1
+sankoff 1
+sankt 1
+sankt augustin 1
+sannel 2
+sannihil 1
+sannl 3
+sannl pa 1
+sannl si 2
+sansom 1
+sant 14
+sant barbar 3
+sant barbar sant 1
+sant cl 2
+sant cruz 4
+sant cruz sant 1
+sant fe 3
+sant fe competit 1
+sant fe institut 1
+sant fe tim 1
+sant margherit 3
+sant margherit ligur 1
+santamar 1
+santek 1
+santiag 1
+sanz 1
+sanz sern 1
+sap 1
+sap mullender 1
+sappar 1
+sappar convenabl 1
+sappliqu 3
+sappliqu a de 1
+sappliqu a la 1
+sappliqu a un 1
+sappliqu au 1
+sappliqu au compilateur 1
+sappliqu aus 1
+sappliqu aus aux 1
+sappliqu aus bien 1
+sappliqu la 1
+sappliqu la mi 1
+sappliqu pa 1
+sappliqu par 1
+sappliqu par la 1
+sappliquer 1
+sappliquer aux 1
+sappliquer aux var 1
+sappr 1
+sappr es 1
+sapproch 1
+sapproch de 1
+sapproch de la 1
+sappu 2
+sappu princip 1
+sappu princip sur 1
+sappu sur 2
+sappu sur de 1
+sappu sur la 1
+sappu sur laffect 1
+sappu sur lalgorithm 1
+sappu sur le 1
+sappu sur li 1
+sappu sur lintroduc 1
+sappu sur un 1
+sappuyer 1
+sappuyer sur 1
+sappuyer sur de 1
+sappuyer sur un 1
+sar 4
+sar ba 1
+sar ba atd 1
+sar es 1
+sar model 1
+sarah 1
+saraswat 4
+saraswat v.a 1
+sard 1
+sarit 1
+sark92a 1
+sark92b 1
+sarkar 2
+sarkar and brown 1
+sarkar and marc 1
+sarkar and re 1
+sarkar and stev 1
+sarlat 1
+sarrafzadeh 1
+sasak 2
+sasm 1
+sasm con 1
+sasm con en 1
+sasm sadm 1
+sassur 1
+sassur quil 1
+sassur quil ec 1
+sassurer 2
+sassurer qu 2
+sassurer qu le 1
+sassurer quaucun 1
+sassurer quaucun bloc 1
+sassurer quil 1
+sassurer quil po 1
+sassurer quun 1
+sassurer quun conflit 1
+sat 7
+sat a trouver 1
+sat algorithm 1
+sat dec 1
+sat in front 1
+sat min 1
+sat problem 1
+sat relac 1
+satel 4
+satel dat 1
+satel feed 1
+satel feed stat 1
+satel imag 1
+satel pictur 1
+satel pictur datab 1
+satel system 1
+satisf 76
+satisf a condit 3
+satisf a constraint 1
+satisf a del 1
+satisf a giv 1
+satisf a rel 1
+satisf a trac 1
+satisf ai 1
+satisf al argum 1
+satisf al constraint 1
+satisf algorithm 2
+satisf algorithm ba 1
+satisf algorithm prop 1
+satisf an equ 1
+satisf and theorem 1
+satisf and unsatisf 1
+satisf any protocol 1
+satisf approxim 1
+satisf approxim algorithm 1
+satisf ar glob 1
+satisf ar glob.6 1
+satisf ar gsm 1
+satisf ar us 1
+satisf assignm 1
+satisf ba 1
+satisf benchmark 1
+satisf benchmark result 1
+satisf by cal 1
+satisf by closer 2
+satisf by combin 1
+satisf by commun 1
+satisf by datalog 1
+satisf by e01 1
+satisf by execut 1
+satisf c1 1
+satisf c2 1
+satisf ca 1
+satisf cal glob 1
+satisf certain constraint 1
+satisf condit 2
+satisf consisterait 1
+satisf constraint 2
+satisf constraint hierarch 1
+satisf constraint problem 1
+satisf d sp 1
+satisf daut 1
+satisf e1 1
+satisf e2 1
+satisf exact 1
+satisf exclus 1
+satisf experim 1
+satisf explan 1
+satisf f ae 1
+satisf f fd 1
+satisf fi 2
+satisf fi 2f 1
+satisf fi fn 1
+satisf for handl 1
+satisf for tn 1
+satisf forml 1
+satisf gb 1
+satisf gd 1
+satisf gener 1
+satisf great 1
+satisf great contribut 1
+satisf hierarch 1
+satisf hierarch turn 1
+satisf iff 1
+satisf in log 3
+satisf in order 1
+satisf is glob 1
+satisf is loc 1
+satisf is0 1
+satisf it bandwidth 1
+satisf it specif 1
+satisf mand 1
+satisf mand constraint 1
+satisf mint 1
+satisf oer 1
+satisf of composit 1
+satisf of constraint 1
+satisf of hierarch 1
+satisf of proposit 1
+satisf of s0 1
+satisf on cnf 1
+satisf on equ 1
+satisf or exit 1
+satisf or proper 1
+satisf other act 1
+satisf our character 1
+satisf pb2 1
+satisf pb4 1
+satisf pb5 1
+satisf perform 1
+satisf perform goal 1
+satisf point 1
+satisf post 1
+satisf prm 1
+satisf prm.3 1
+satisf problem 7
+satisf problem using 1
+satisf progr 1
+satisf program 1
+satisf quest 1
+satisf rb 1
+satisf reason 1
+satisf reason condit 1
+satisf rel 1
+satisf respon 1
+satisf respon tim 1
+satisf result 1
+satisf return 1
+satisf s1 1
+satisf s1 s2 1
+satisf saf 1
+satisf som uniqu 1
+satisf spec1 1
+satisf spec2 1
+satisf subject 1
+satisf system 1
+satisf t1 1
+satisf techniqu 1
+satisf test 1
+satisf tester 1
+satisf th al 1
+satisf th axiom 1
+satisf th bal 1
+satisf th bar 1
+satisf th bisect 2
+satisf th ca 1
+satisf th character 1
+satisf th concur 1
+satisf th condit 9
+satisf th conjunct 1
+satisf th constraint 2
+satisf th contour 1
+satisf th correspon 2
+satisf th criter 1
+satisf th desir 1
+satisf th empt 1
+satisf th execut 1
+satisf th forml 1
+satisf th heap 1
+satisf th junct 1
+satisf th maxim 1
+satisf th minim 2
+satisf th origin 1
+satisf th partit 1
+satisf th polynom 1
+satisf th proper 4
+satisf th recur 2
+satisf th rel 3
+satisf th requir 2
+satisf th ser 1
+satisf th specif 3
+satisf th stronger 1
+satisf th strongest 1
+satisf th suff 1
+satisf th test 1
+satisf th triangl 1
+satisf that parameter 1
+satisf theorem 1
+satisf threshold 1
+satisf tighter 1
+satisf tighter deadl 1
+satisf to obtain 1
+satisf tr01 1
+satisf unsatisf 1
+satisf unsatisf claus 1
+satisf valu 1
+satisf vs 1
+satisf when compar 1
+satisf with respect 1
+satisf without construc 1
+satisf wwt 1
+satisf wwt kin 1
+satisf y 2i 1
+satisfact 12
+satisfact and produc 1
+satisfact coar 1
+satisfact for develop 1
+satisfact loc 1
+satisfact loc program 1
+satisfact result 1
+satisfair 1
+satisfair ce 1
+satisfair ce contraint 1
+satisfaisabilit 1
+satisfaisabilit e dun 1
+satisfait 2
+satisfait pa 1
+satisfait pa ce 1
+satisfiabilit 1
+satisfiabilit e dun 1
+satoh 1
+satosh 2
+satosh matsuok 2
+sattach 1
+sattach pa 1
+sattendr 1
+sattendr a observer 1
+satterthwait 1
+satur 4
+satur bandwidth 1
+satur bandwidth decr 1
+satur bandwidth incr 1
+satur dur siml 1
+satur earliest 1
+satur for appl 1
+satur for centr 1
+satur for mb 1
+satur load 1
+satur mor quick 1
+satur por 1
+satur por med 1
+satur system 1
+satur unsatur 1
+satur unsatur med 1
+satur with respect 1
+saturer 1
+saturer le 1
+sauer 2
+sauer et al 1
+sauf 3
+sauf bien 1
+sauf bien sur 1
+sauf cel 1
+sauf cel fin 1
+sauf ceux 1
+sauf ceux qu 1
+sauf dan 1
+sauf dan le 1
+sauf demand 1
+sauf demand explicit 1
+sauf ind 1
+sauf ind contrair 1
+sauf qu 1
+sauf qu le 1
+sauf qu ni 1
+sauf quil 1
+sauf quil li 1
+sauf sil 1
+sauf sil sagit 1
+sauf sur 1
+sauf sur la 1
+saunder 1
+saur 1
+saur g erer 1
+saurait 1
+saurait ignorer 1
+saurait ignorer le 1
+saurait le 1
+saurait le ignorer 1
+saut 2
+saut a la 1
+saut de 1
+saut de pr 1
+saut direct 1
+saut direct quun 1
+saut direct ver 1
+saut et de 1
+saut indirect 1
+saut indirect au 1
+saut indirect de 1
+sauter 1
+sauter la 1
+sauter la restaur 1
+sauter linstruc 1
+sauter linstruc suiv 1
+sautoriser 1
+sautoriser de 1
+sautoriser de chang 1
+sauv 1
+sauv ce 1
+sauv ce register 1
+sauv e claus 1
+sauv e dan 1
+sauv ee 1
+sauv ee dan 1
+sauv ee qu 1
+sauv es 1
+sauv es dan 1
+sauv es sur 1
+sauv le 1
+sauv le contenu 1
+sauv non 1
+sauv non pa 1
+sauvegard 1
+sauvegard dan 1
+sauvegard dan chaqu 1
+sauvegard de 1
+sauvegard de ce 1
+sauvegard de register 1
+sauvegard e afin 1
+sauvegard e dan 1
+sauvegard ee 1
+sauvegard ee dan 1
+sauvegard es 1
+sauvegard es com 1
+sauvegard es dan 1
+sauvegard es qu 1
+sauvegard et de 1
+sauvegard et la 1
+sauvegard l etat 1
+sauvegard la 1
+sauvegard la valeur 1
+sauvegard le 1
+sauvegard le point 1
+sauvegard le valeur 1
+sauvegard pour 1
+sauvegard pour remettr 1
+sauvegard remplac 1
+sauvegard remplac le 1
+sauvegard sur 1
+sauvegard sur la 1
+sauvegard un 1
+sauvegard un fo 1
+sauvegarder 1
+sauvegarder dan 1
+sauvegarder dan chaqu 1
+sauvegarder dan le 1
+sauvegarder et restaurer 1
+sauvegarder l etat 1
+sauvegarder le 1
+sauvegarder le point 1
+sauvegarder le register 1
+sauvegarder un point 1
+sauver 1
+sauver ce 1
+sauver ce argum 1
+sauver l etat 1
+sauver un bit 1
+sauxc 1
+sav 13
+sav a fact 1
+sav by introduc 1
+sav decod 1
+sav decod hardwar 1
+sav er assez 1
+sav er co 1
+sav er essentiel 1
+sav er etr 1
+sav er insuff 1
+sav er mal 1
+sav er ne 1
+sav er peu 1
+sav er qu 1
+sav er toutef 1
+sav er tr 1
+sav erent 1
+sav erent ne 1
+sav erer 3
+sav erer appr 1
+sav erer consommer 1
+sav erer de 1
+sav erer efficac 1
+sav erer tr 1
+sav erer trop 2
+sav erer util 1
+sav ererait 1
+sav ererait trop 1
+sav in view 1
+sav loc 1
+sav partit 1
+sav prob 1
+sav prob distribut 1
+sav unnec 1
+sav unnec unpack 1
+savannah 1
+savannah river 1
+savannah river labor 1
+savannah river technolog 1
+savepoint 2
+savepoint perm 1
+savepoint perm part 1
+saving 8
+saving and incom 1
+saving dur execut 1
+saving in cost 2
+saving in link 1
+saving in over 1
+saving in proc 1
+saving obtain 1
+saving pol 1
+saving pol matur 1
+saving rang 1
+saving than intraprocedur 1
+saving when appl 1
+saving would incr 1
+savoir 3
+savoir com 1
+savoir com cel 1
+savoir la 1
+savoir le 1
+savoir le attribut 1
+savoir le ca 1
+savoir le ch 1
+savoir le point 1
+savoir le som 1
+savoir pour 1
+savoir pour chaqu 1
+savoir qu 1
+savoir qu fair 1
+savoir qu la 1
+savoir quand 1
+savoir quand est 1
+savoir si 3
+savoir si ce 1
+savoir si la 1
+savoir si le 2
+savoir si lin 1
+savoir si un 1
+savoir sil 1
+savoir sil est 1
+savoir un 1
+savoir un complexit 1
+savon 1
+saw 8
+saw earl 3
+saw improv 1
+saw teeth 1
+sawdon 1
+sawtooth 1
+sawtooth shap 1
+sawtooth shap curv 1
+saxp 2
+say 57
+say a nod 1
+say a request 1
+say at tim 1
+say cel 1
+say dim 1
+say execut 1
+say f1 2
+say gi 1
+say how accur 1
+say link 1
+say m1 1
+say nod 2
+say p2 1
+say pattern 1
+say pi 1
+say proc 1
+say r0 1
+say r1 1
+say repeat 1
+say ri 1
+say ri privileg 1
+say s1 1
+say se 1
+say si 1
+say succ 1
+say th direct 1
+say th effect 1
+say th fam 1
+say th targ 1
+say that cl 1
+say that contextu 1
+say that displ 1
+say that giv 1
+say that init 1
+say that tp 1
+say upd 1
+say v0 1
+say vsourc 1
+say vsourc wish 1
+say with bipartit 1
+saying 7
+saying that lin 1
+sayl 1
+sb 7
+sb is decluster 1
+sb is shar 1
+sb lx 1
+sb show 1
+sb.de 2
+sb.de henz 1
+sb.de henz oz 1
+sb.mpg.de 1
+sb.mpg.de sander 1
+sb.mpg.de sander program 1
+sb83 1
+sbc 1
+sbc method 1
+sbrg 1
+sbrg dc.warwick.ac.uk 1
+sc 117
+sc an 2
+sc and artif 1
+sc and cultur 1
+sc and engineer 20
+sc and kkz 1
+sc and pract 1
+sc and structur 1
+sc and subst 1
+sc and system 1
+sc and technolog 3
+sc and zzk 1
+sc approach 1
+sc ar 1
+sc ar touch 1
+sc b.v 1
+sc brown 4
+sc bs 1
+sc bs ad 1
+sc carneg 1
+sc carneg mellon 1
+sc chang 1
+sc chang detect 1
+sc chang dissolut 1
+sc corpor 1
+sc dep 1
+sc depart 1
+sc departm brigham 2
+sc departm1 1
+sc dept 2
+sc div 1
+sc educ 1
+sc engineer 2
+sc engineer research 1
+sc exp 1
+sc exp nj0 1
+sc facult 1
+sc found 11
+sc found grant 3
+sc found presid 1
+sc fredrik 2
+sc fredrik bajer 2
+sc gener 1
+sc gener du 1
+sc georg 1
+sc grant 1
+sc ha es 1
+sc institut 1
+sc is assum 1
+sc is character 1
+sc is reflect 1
+sc is suff 1
+sc kkz 1
+sc kkz method 1
+sc lab 1
+sc labor 2
+sc labor research 1
+sc log 2
+sc macquar 1
+sc magaz 1
+sc mathemat 1
+sc method 1
+sc method gav 1
+sc multiconfer 1
+sc ne 1
+sc ne tr 1
+sc no.2 1
+sc not 1
+sc of algorithm 1
+sc of complec 1
+sc of computer 3
+sc of knowledg 1
+sc oh 2
+sc oh st 2
+sc perform 1
+sc pr 6
+sc pr ae 1
+sc princ 1
+sc publ 7
+sc publ b.v 4
+sc research 1
+sc research ar 1
+sc sequ 1
+sc sequ con 1
+sc ser 1
+sc sketch 1
+sc sketch model 1
+sc soc 3
+sc structur 1
+sc structur mechan 1
+sc stud 1
+sc sun 2
+sc techn 4
+sc techn report 4
+sc term 1
+sc term grow 1
+sc th 1
+sc th austr 1
+sc th hong 1
+sc th oh 3
+sc to lrc 1
+sc tr 1
+sc which deal 1
+sc which remind 1
+sc with bandwidth 1
+sc with simpl 1
+sc.kun.nl 1
+sc.leed.ac.uk 1
+sc2 1
+sc2 wg8 1
+sc2 wg8 n745 1
+sc23 1
+sc29 1
+sc29 wg11 1
+sc29 wg11 n0820 1
+sc2b 1
+sc81 1
+scaffold 1
+scaffold th stud 1
+scal 55
+scal a 4x4 1
+scal a ba 1
+scal a configur 1
+scal a giv 1
+scal a network 1
+scal absolut 1
+scal absolut differ 1
+scal adapt 1
+scal adapt threshold.12 1
+scal adv 1
+scal algorithm 1
+scal algorithm exploit 1
+scal and complec 1
+scal and compr 1
+scal and control 1
+scal and med 1
+scal and rel 1
+scal and robust 1
+scal and scop 1
+scal and tim 1
+scal approach 1
+scal approachus 1
+scal approachus larger 1
+scal ar combin 1
+scal architectur 2
+scal attribut 1
+scal attribut assign 1
+scal bad 1
+scal bandwidth 1
+scal bandwidth lin 1
+scal becaus incr 1
+scal behavior 1
+scal behaviour 1
+scal beyon nr 1
+scal by 1
+scal by boyer 1
+scal by ms 1
+scal ca 1
+scal comput 1
+scal computer 1
+scal computer configur 1
+scal configur 1
+scal configur offer 1
+scal context 1
+scal context dep 1
+scal counterpart 1
+scal cub 1
+scal cub ind 1
+scal dat 1
+scal dat mov 1
+scal decomposit 1
+scal developm 1
+scal difficult 3
+scal difficult unav 1
+scal docum 1
+scal docum pag 1
+scal each nod 1
+scal ec 1
+scal ec as 1
+scal ec compon 1
+scal ec softwar 1
+scal edg 1
+scal edg detect 1
+scal edg extract 1
+scal educ 1
+scal educ mater 1
+scal eff 1
+scal eff distribut 1
+scal encapsl 1
+scal fact 2
+scal featur 1
+scal featur spac 1
+scal featur vect 1
+scal four tim 1
+scal funct 1
+scal funct oe 1
+scal g tim 1
+scal graph 1
+scal graph inform 1
+scal high perform 1
+scal imag 1
+scal impl 1
+scal impl keep 1
+scal implem 2
+scal in channel 1
+scal in term 1
+scal input 1
+scal input repr 1
+scal inst 1
+scal integr 1
+scal inver 1
+scal is achief 2
+scal is effect 1
+scal is expect 1
+scal is giv 1
+scal is re 1
+scal issu 2
+scal k ary 2
+scal keep 1
+scal le 1
+scal lead 1
+scal lin 3
+scal man 1
+scal med 1
+scal med problem 1
+scal memor 1
+scal method 1
+scal might gener 1
+scal multiproc 4
+scal multiproc mach 1
+scal neur 1
+scal neur network 1
+scal nic 1
+scal nod 2
+scal nod dat 1
+scal nod rel 1
+scal o2 1
+scal of cl 1
+scal of funct 1
+scal of lrc 1
+scal of sort 1
+scal oj 1
+scal on 1
+scal oper 1
+scal oper system 1
+scal or ar 1
+scal parallel 7
+scal parallel algorithm 1
+scal parallel computer 1
+scal parallel forml 1
+scal parallel proc 1
+scal parallel system 2
+scal parameter 1
+scal problem 3
+scal problem siz 1
+scal produc 1
+scal project 1
+scal project undertak 1
+scal proper 1
+scal prospect 1
+scal quant 1
+scal rat 1
+scal rel 1
+scal renam 1
+scal repr 1
+scal resolut 1
+scal restrict 2
+scal reus 1
+scal reus compon 1
+scal reus remain 1
+scal reus technolog 1
+scal search 1
+scal shar 5
+scal shar memor 5
+scal siz 1
+scal softwar 1
+scal softwar libr 1
+scal sort 1
+scal spac 2
+scal spac approach 1
+scal speed 1
+scal structur 1
+scal structur chang 1
+scal synchron 1
+scal system 5
+scal system configur 1
+scal system requir 1
+scal system reus 1
+scal system siz 1
+scal system using 1
+scal th bal 1
+scal th result 1
+scal ti 1
+scal to handl 1
+scal to larger 1
+scal to support 2
+scal to zer 1
+scal transport 1
+scal uniproc 1
+scal uniproc system 1
+scal up network 2
+scal using 1
+scal using larger 1
+scal ver 2
+scal ver bad 1
+scal ver quick 1
+scal vol 1
+scal vol funct 1
+scal vot 1
+scal vot propag 1
+scal wavel 1
+scal wavel pack 1
+scal whil exploit 1
+scal with fic 1
+scal would visu 1
+scalair 2
+scalair du 1
+scalair du vecteur 1
+scalair en 1
+scalair en acc 1
+scalair et vectoriel 1
+scalair eucl 1
+scalair eucl de 1
+scalair ff 1
+scalair ff dun 1
+scalair ff par 1
+scalair ou 1
+scalair ou vectoriel 1
+scalair par 1
+scalair par un 1
+scalair partag 1
+scalair partag es 1
+scalair qu 1
+scalair qu ser 1
+scalair s crit 1
+scalair sont 1
+scalair sont classiqu 1
+scalair sont donc 1
+scan 18
+scan and attach 1
+scan and continu 1
+scan and ver 1
+scan back 1
+scan cluster 1
+scan cluster ind 1
+scan column 1
+scan dep 1
+scan design 1
+scan design con 1
+scan design figur 1
+scan each new 1
+scan for enumer 1
+scan imag 1
+scan is compar 1
+scan is mad 1
+scan it ind 1
+scan l 1
+scan light 1
+scan loc 1
+scan loc queu 1
+scan mult 1
+scan mult level 1
+scan oper 1
+scan parameter 1
+scan parameter polyhedr 1
+scan polyhedr 1
+scan row 1
+scan sequ 1
+scan sequ tok 1
+scan simil 1
+scan structur 1
+scan structur light 1
+scan th datab 1
+scan th dr 1
+scan th imag 1
+scan th input 1
+scan th integer 1
+scan th log 1
+scan th result 1
+scan thr dim 1
+scan tw 1
+scan uncluster 1
+scan uncluster ind 1
+scanlon 1
+scanner 2
+scanner dat 1
+scanner dat com 1
+scanner x ou 1
+scanposit 1
+scap 1
+scarabin 1
+scarc 1
+scatter 7
+scatter among rol 1
+scatter ar companion 1
+scatter brok 1
+scatter brok edg 1
+scatter dat 1
+scatter dat interpol 1
+scatter div 1
+scatter of point 1
+scatter vol 1
+scatter vol dat 1
+scdep 1
+scedrov 1
+scen 6
+scen ar describ 1
+scen of signif 1
+scen over tim 1
+scen with shadow 1
+scenar 23
+scenar and algorithm 1
+scenar for act 1
+scenar identif 1
+scenar illustr 1
+scenar involut 1
+scenar is prev 1
+scenar mdest 1
+scenar mdest worm1 1
+scenar occur 1
+scenar of tool 1
+scenar orient 1
+scenar orient engineer 1
+scenar outlin 1
+scenar wh 1
+scenar wh text 1
+scfj96 1
+scfq 1
+scfq algorithm 1
+scfq bandwidth 1
+scfq bandwidth rat 1
+scfq li 1
+scfq li lmac 1
+scfq multiplexer 1
+scfq server 1
+scfq simplif 1
+sch 10
+sch affer 1
+sch b tim 1
+sch em 4
+sch em avec 1
+sch em ayant 1
+sch em de 3
+sch em dic 3
+sch em dind 1
+sch em directeur 1
+sch em disjoint 1
+sch em dun 2
+sch em est 1
+sch em glob 1
+sch em ne 1
+sch em ont 1
+sch em peut 1
+sch em pren 1
+sch em qu 1
+sch em quil 1
+sch em rester 1
+sch em se 1
+sch em supposeront 1
+sch em trait 1
+sch emat 1
+sch ematiqu 1
+sch ematiqu par 1
+sch onfeld 1
+sch67 1
+sch73 1
+sch80 1
+sch93 2
+sch94 1
+schach 1
+schaefer 1
+schaffer 3
+schaffer and sedgewick 1
+schaffer voelker 1
+schank 2
+schanz 1
+schapir 1
+schatz 1
+schaumburg 1
+schaumburg for writ 1
+schauser 3
+schedl 27
+schedl a dag 1
+schedl a nod 1
+schedl a tr 1
+schedl algorithm 6
+schedl algorithm ba 1
+schedl algorithm belong 1
+schedl algorithm differ 1
+schedl algorithm involut 1
+schedl algorithm prop 1
+schedl algorithm prov 1
+schedl algorithm run 1
+schedl algorithm tak 1
+schedl an arbitr 1
+schedl an event 1
+schedl an intervalorder 1
+schedl an und 1
+schedl and block 1
+schedl and plac 1
+schedl and prun 1
+schedl and resourc 1
+schedl approach 1
+schedl approach construc 1
+schedl appropr 1
+schedl ar fic 1
+schedl ba 2
+schedl becom 1
+schedl becom nonaff 1
+schedl can tak 1
+schedl capabil 1
+schedl car 1
+schedl cod 1
+schedl construc 1
+schedl csmv 1
+schedl csmv pd 1
+schedl csvm 1
+schedl csvm pd 1
+schedl ct 1
+schedl dag 1
+schedl dec 2
+schedl discipl 2
+schedl do loop 1
+schedl each se 1
+schedl ec 1
+schedl eff 1
+schedl eff inl 1
+schedl en 1
+schedl en parallel 1
+schedl event 1
+schedl fil 1
+schedl fil transfer 1
+schedl for elimin 1
+schedl for exampl 1
+schedl for mic 1
+schedl for multiprogram 1
+schedl for problem 1
+schedl for siml 1
+schedl for transm 1
+schedl form 1
+schedl gener 1
+schedl hav tot 1
+schedl heur 2
+schedl heur empl 1
+schedl heur report 1
+schedl in mult 1
+schedl in multicl 1
+schedl in output 1
+schedl in parallel 1
+schedl in polynom 1
+schedl in synth 1
+schedl in tim 2
+schedl infinit 1
+schedl inform 1
+schedl instruc 1
+schedl is avail 1
+schedl is fair 1
+schedl is gener 1
+schedl is incorrect 1
+schedl is kept 1
+schedl is optim 1
+schedl is shown 1
+schedl is simpl 1
+schedl length 1
+schedl length produc 1
+schedl li 1
+schedl list 1
+schedl loop 1
+schedl loop iter 1
+schedl mach 1
+schedl mach instruc 1
+schedl method 1
+schedl new event 1
+schedl next block 1
+schedl no earl 1
+schedl of dag 1
+schedl of me 1
+schedl of nest 1
+schedl of oper 1
+schedl of parallel 1
+schedl of program 2
+schedl of task 1
+schedl on resourc 1
+schedl oper 1
+schedl or align 1
+schedl or dag 1
+schedl order 1
+schedl orient 1
+schedl orient model 1
+schedl our program 1
+schedl overhead 1
+schedl parallel 1
+schedl parallel task 1
+schedl prec 1
+schedl prec graph 1
+schedl priorit 1
+schedl priorit job 1
+schedl problem 3
+schedl problem con 1
+schedl proc 1
+schedl produc 1
+schedl quick 1
+schedl real tim 1
+schedl refin 1
+schedl refin ph 1
+schedl report 1
+schedl result 1
+schedl rout 1
+schedl rout event 1
+schedl schem 1
+schedl sd 1
+schedl spread 1
+schedl spread iter 1
+schedl step 1
+schedl strateg 4
+schedl task 1
+schedl task graph 1
+schedl th block 1
+schedl th multipl 1
+schedl th nod 1
+schedl th parallel 1
+schedl th red 1
+schedl theor 1
+schedl til 1
+schedl tim 1
+schedl to minim 1
+schedl to parallel 1
+schedl to polynom 1
+schedl to proc 1
+schedl tool 1
+schedl using 2
+schedl using loc 1
+schedl using tradit 1
+schedl vi tem. 1
+schedl wa deriv 1
+schedl wa parameter 1
+schedl wh 1
+schedl wh preempt 1
+schedl window 1
+schedl with finish 1
+schedl with for 1
+schedl with optim 1
+schedl with predefin 1
+schedl with tot 1
+schedl1 1
+schedl1main 1
+schedl1usl.128totinfousl.123replac 1
+schedl2 1
+schedl2 schedl1 1
+schedl2 schedl1usl.128totinfousl.123replac 1
+scheduler 10
+scheduler al keep 1
+scheduler allow 1
+scheduler and cal 1
+scheduler and obtain 1
+scheduler ar character 1
+scheduler ar work 1
+scheduler by se 1
+scheduler can keep 1
+scheduler can run 1
+scheduler for priorit 1
+scheduler form 1
+scheduler in figur 1
+scheduler inclus 1
+scheduler inclus gener 1
+scheduler is ba 1
+scheduler is consider 1
+scheduler is invok 1
+scheduler is work 1
+scheduler keep 1
+scheduler keep track 1
+scheduler may pen 1
+scheduler oe 1
+scheduler oe us 1
+scheduler perform 1
+scheduler proc 1
+scheduler proc oper 1
+scheduler prov 1
+scheduler prov id 1
+scheduler router 1
+scheduler schedl1 1
+scheduler tc 1
+scheduler that us 1
+scheduler then amount 1
+scheduler to achief 1
+scheduler to upd 1
+scheduler us 1
+scheduler we stud 1
+scheduler wer shown 1
+scheduler with low 1
+scheduler would gener 1
+schek 1
+schem 72
+schem adopt 1
+schem allow 4
+schem allow arbitr 2
+schem and dat 1
+schem and design 1
+schem ar compar 1
+schem ar describ 1
+schem ar determin 1
+schem ar effect 1
+schem ar implem 1
+schem ar pr 1
+schem ar pract 1
+schem ar receiv 1
+schem ar sampl 1
+schem ar sent 1
+schem ar tailor 1
+schem as describ 1
+schem as implem 1
+schem ba 4
+schem ba st 1
+schem by preproc 1
+schem cal xnet 1
+schem calculus 1
+schem calculus oper 1
+schem can adjust 1
+schem can perform 1
+schem cannot tak 1
+schem ch 1
+schem compar 1
+schem compiler 1
+schem compr 1
+schem con 1
+schem contain 1
+schem decl 1
+schem describ 4
+schem diagram 1
+schem differ 1
+schem disc 1
+schem eff 1
+schem evolut 1
+schem exhibit 1
+schem favor 1
+schem favor sequ 1
+schem for automat 1
+schem for broadband 1
+schem for ca 1
+schem for cach 1
+schem for ch 1
+schem for constraint 1
+schem for distribut 1
+schem for find 1
+schem for internet 1
+schem for lo 1
+schem for matr 1
+schem for mimd 1
+schem for multicast 1
+schem for multidest 1
+schem for nest 1
+schem for parallel 1
+schem for partit 2
+schem for prolog 1
+schem for rm 1
+schem for stabil 1
+schem for transl 1
+schem from s1 1
+schem gav 1
+schem gav slight 1
+schem ha prov 1
+schem implem 1
+schem implicit 1
+schem implicit inclus 1
+schem in distribut 1
+schem in figur 1
+schem in fl 1
+schem in order 1
+schem in particl 1
+schem in sl1 1
+schem in term 1
+schem inclus 1
+schem inclus ib2 1
+schem incr 1
+schem incr mark 1
+schem int composit 1
+schem integr 1
+schem involut 1
+schem involut comb 1
+schem is appl 1
+schem is ba 1
+schem is cl 1
+schem is compar 1
+schem is determin 1
+schem is distingu 1
+schem is es 1
+schem is extrem 1
+schem is faster 1
+schem is frequ 1
+schem is identif 1
+schem is illustr 1
+schem is indep 1
+schem is lik 1
+schem is near 1
+schem is norm 1
+schem is plot 1
+schem is prop 1
+schem is requir 1
+schem is shown 1
+schem langu 1
+schem lik sa 1
+schem lik siml 1
+schem mak 1
+schem mak environm 1
+schem manipl 1
+schem match 1
+schem modif 1
+schem must contain 1
+schem of low 1
+schem of ml 1
+schem of pa 1
+schem onl specif 1
+schem outperform 1
+schem part 1
+schem part evalu 1
+schem perform 2
+schem pl 1
+schem produc 2
+schem produc partit 1
+schem program 1
+schem prop 1
+schem repr 1
+schem requir 1
+schem rev 1
+schem slight 1
+schem stem 1
+schem support 1
+schem th matr 1
+schem than rm 1
+schem that enabl 1
+schem that motiv 1
+schem that produc 1
+schem that us 1
+schem that yield 1
+schem to achief 1
+schem to execut 1
+schem to impl 2
+schem to improv 1
+schem to incr 1
+schem to irregl 1
+schem to recover 1
+schem to repr 2
+schem to schem 1
+schem to simil 1
+schem to support 2
+schem transform 1
+schem typ 1
+schem typ requir 1
+schem upd 1
+schem us 4
+schem us direct 1
+schem us dynam 1
+schem us n2 1
+schem us point 1
+schem using 2
+schem using switch 1
+schem using unicast 1
+schem var 1
+schem variabl 1
+schem variabl decl 1
+schem we consider 1
+schem we investig 1
+schem we repr 1
+schem wer specif 1
+schem which requir 1
+schem which us 1
+schem wil benefit 1
+schem with explicit 1
+schem with fast 1
+schem with proposit 1
+schem with respect 1
+schem with writ 1
+schem work 2
+schem.th 1
+schem.th construc 1
+schem4 1
+schem4 implem 1
+schem4 implem technolog 1
+schem5 1
+schemat 2
+schemat equiv 1
+schemat syntac 1
+schendel 1
+scherl 1
+scherson 1
+schettin 1
+scheuerman 1
+scheurich 1
+schevel 1
+schevitz 1
+schiermeyer 1
+schiffman 1
+schimdt 1
+schimpf 2
+schimpf et evan 1
+schiper 1
+schl 2
+schl birlinghov 1
+schl dagstuhl 1
+schlicht 2
+schlicht and fr 2
+schlipf 1
+schlor 1
+schlumberger 1
+schlussfolgerungsverfahr 1
+schm 1
+schmidhu 1
+schmidhu informatik.tu 1
+schmidhu informatik.tu muench.de 1
+schmidhu.html 1
+schmidhuber 2
+schmidt 3
+schmidt modif 1
+schmidt qu 1
+schmidt qu nous 1
+schmitz 1
+schmuck 1
+schneid 1
+schneider 5
+schneider hufschmidt 1
+schneiderhufschmidt 1
+schnor 1
+schoenfield 1
+schoffst 1
+scholarship 1
+scholefield 1
+schout 1
+schr 1
+schr and baker 1
+schr and k.r 1
+schrader 1
+schreiber 2
+schreiber et al 1
+schreter 1
+schrijver 3
+schroeder 5
+schroeder et al 1
+schroeder heister 1
+schroeder point 1
+schroeder1 1
+schroeder1 st 1
+schueler 1
+schult 1
+schulzrin 1
+schumach 1
+schur 1
+schur decomposit 1
+schuster 1
+schw 1
+schwartz 4
+schwartz w.b 1
+schwarz 3
+schwefel 1
+schwetman 2
+scient 5
+scient iran 1
+scientif 24
+scientif algorithm 1
+scientif and engineer 1
+scientif and non 1
+scientif appl 3
+scientif cod 1
+scientif comput 7
+scientif comput appl 1
+scientif comput computer 1
+scientif comput inclus 1
+scientif computer 1
+scientif computer ipsc 1
+scientif dat 1
+scientif datab 2
+scientif datab system 1
+scientif engineer 1
+scientif engineer appl 1
+scientif method 1
+scientif pract 1
+scientif program 3
+scientif program writ 1
+scientif publ 1
+scientif publ compan 1
+scientif research 1
+scientif rout 1
+scientif theor 1
+scientifiqu 2
+scientifiqu et parc 1
+scientifiqu institut 1
+scientifiqu institut nat 1
+scientifiqu qu 1
+scientifiqu qu la 1
+scientioc 1
+scientioc appl 1
+scientioqu 1
+scind 1
+scind e en 1
+scind ee 1
+scind ee en 1
+scind le 1
+scind le nid 1
+scinder 1
+scinder la 1
+scinder la boucl 1
+sclr 1
+sclr tacc 1
+sclrg 1
+scm 1
+scofield 1
+scop 21
+scop an 1
+scop and extent 1
+scop and indefinit 1
+scop and vi 1
+scop bind 1
+scop by import 1
+scop for produc 1
+scop in modl 1
+scop of exper 1
+scop of nak 1
+scop of pr 1
+scop of pr1 1
+scop solut 1
+scop to program 1
+scop typ 1
+scop typ tok 1
+scop v1 1
+scor 6
+scor ar comput 1
+scor heav 1
+scor is ch 1
+scor is receiv 1
+scor is sum 1
+scor show 1
+scor th pandemon 1
+scot 8
+scot snib 2
+scot vitter 1
+scotland 2
+scram 1
+scram power 1
+scram power level 1
+scrambl 3
+scrambl buck 1
+scrambl buck random 1
+scrambl introduc 1
+scrambl th record 1
+scratch 3
+scratch would tak 1
+scratch your ear 1
+screen 8
+screen and confirm 1
+screen and input 1
+screen and report 1
+screen can act 1
+screen chang 1
+screen clear 1
+screen clear manager 1
+screen imag 1
+screen object 1
+screen proc 1
+screen spac 2
+screen st 1
+screen to obtain 1
+screen within tdsp 1
+script 13
+script ar liter 1
+script by claus 1
+script correspon 1
+script fo.y 1
+script from form 1
+script is automat 1
+script is remark 1
+script langu 2
+script letter 1
+script ofdefinit 1
+script ofdefinit stimulus 1
+script resembl 1
+script that conver 1
+script that cur 1
+script themselv correspon 1
+scripter 1
+scripter langu 1
+scrol 1
+scrutin 3
+scrutin in order 1
+sculpt 1
+sd 7
+sd and dm 1
+sd cl 1
+sd cl comput 1
+sd cl eff 1
+sd comput 1
+sd comput defin 1
+sd comput spec 1
+sd csdij 1
+sd csdij cij 1
+sd eff 1
+sd eff sd 1
+sd esdij 1
+sd for problem 1
+sd inh 1
+sd inh sd 1
+sd nowrit 1
+sd reader 1
+sd slot 1
+sd slot spec 1
+sd without cal 1
+sd writer 1
+sdm 2
+sdm 2b 1
+sdm 2b scm 1
+sdm fast 1
+sdm fast activ 1
+sdm implem 1
+sdm memor 1
+sdm memor assum 1
+sdm memor perform 1
+sdm scm 1
+sdot 1
+se 127
+se a built 1
+se a con 1
+se a del 1
+se a great 2
+se a lock 1
+se a seed 1
+se a simil 1
+se a start 1
+se a tim 1
+se a.3.2 1
+se a1 1
+se a1 shown 1
+se a2 1
+se abov paragraph 1
+se acc 1
+se acc es 1
+se accord 2
+se acknowledg 1
+se act 1
+se act period 1
+se activ 1
+se activ rat 1
+se adapt 1
+se aim 1
+se al adleman 1
+se al exampl 1
+se al figur 1
+se al le 1
+se al np 1
+se al ogur 1
+se al proc 1
+se al remark 1
+se al sect 4
+se allow 1
+se allow bil 1
+se alterman 1
+se an error 1
+se and appl 2
+se and ba 1
+se and belief 1
+se and classif 1
+se and compar 1
+se and deriv 1
+se and effect 1
+se and find 1
+se and good 1
+se and item 1
+se and junior 1
+se and link 1
+se and perform 1
+se and racl 1
+se and return 1
+se and run 1
+se and test 1
+se and train 2
+se and why 1
+se any chang 1
+se ap 3
+se ar account 1
+se ar accur 1
+se ar backlog 1
+se ar continu 1
+se ar disjoint 1
+se ar extract 1
+se ar gener 1
+se ar ident 1
+se ar mad 1
+se ar mic 1
+se ar obtain 1
+se ar rel 1
+se ar serv 1
+se ar simp 1
+se ar st 1
+se ar sub 1
+se ar subst 1
+se ar susp 1
+se ar transm 1
+se as 1
+se as adeg 1
+se as follow 1
+se as lmac 1
+se ask 1
+se ask quest 1
+se aspect 1
+se assoc 2
+se associat 1
+se at tim 1
+se at tol 1
+se averag 1
+se b becom 1
+se backlog 1
+se backlog period 1
+se be decomp 1
+se befor tim 1
+se behaviour 1
+se being serv 1
+se bi 2
+se bon 1
+se bon propr 1
+se born 1
+se borner 1
+se breakpoint 1
+se bu 1
+se bu system 1
+se bus 1
+se bus period 1
+se by cal 1
+se by control 1
+se by extern 1
+se by induc 1
+se by mi 1
+se by se 1
+se ca 1
+se cach 1
+se cach dern 1
+se can var 1
+se caract 1
+se caract er 1
+se chapter bibliograph 1
+se charg 2
+se charg du 1
+se charger 1
+se charger de 1
+se chevauch 1
+se chevauch pa 1
+se colon 1
+se color 1
+se com 1
+se com field 1
+se comp 1
+se comp mk 1
+se comport 2
+se comport alor 1
+se comport com 2
+se comport de 1
+se comport diff 1
+se comport exact 1
+se comport mieux 1
+se comport pa 1
+se computer 1
+se con 7
+se con sol 1
+se concentr 3
+se concentr alor 1
+se concentr sur 2
+se conseil 2
+se conseil sur 1
+se construc 2
+se cont 3
+se cont de 1
+se cont ic 1
+se contain 7
+se contain act 1
+se contain variabl 1
+se contenter 1
+se contenter de 1
+se contenter dun 1
+se control 1
+se control parameter 1
+se convaincr 1
+se convaincr facil 1
+se correspon 1
+se court 1
+se cover 3
+se d ebar 1
+se d ecrit 1
+se d edu 1
+se d egag 1
+se d eplacer 2
+se d eriv 1
+se d eroul 2
+se d etach 1
+se d evelopper 1
+se decr 1
+se defgener 1
+se defin 2
+se definit 1
+se del 1
+se demander 1
+se demander si 1
+se dep 1
+se deriv 1
+se describ 2
+se design 1
+se destin 1
+se deux 3
+se deux jacob 1
+se deux prem 1
+se deux voisin 1
+se develop 1
+se diff 1
+se diff erent 1
+se differ 1
+se disc 1
+se distingu 3
+se distingu essentiel 2
+se distingu par 2
+se distingu suiv 1
+se do ad 1
+se do connect 1
+se do remov 1
+se do transfer 1
+se don 1
+se don de 1
+se dram 1
+se dram perform 1
+se droit 1
+se droit sur 1
+se dur 1
+se dur se 1
+se e repr 1
+se ec 1
+se ecritur 1
+se eff 2
+se eff ne 1
+se eff positif 1
+se effort 1
+se effort sur 1
+se empl 1
+se encourag 1
+se eq 1
+se equ 6
+se equiv 1
+se es 1
+se est 1
+se est consacr 1
+se etat 1
+se etat ap 1
+se ev valu 1
+se evalu 1
+se everyth hundr 1
+se exampl 2
+se exclus 1
+se execut 1
+se execut cod 1
+se f correspon 1
+se f0 2
+se f1 2
+se fa 1
+se fa1 1
+se fac 1
+se fair 2
+se fair dan 1
+se fair en 1
+se fair par 1
+se fair quau 1
+se fair soit 1
+se fait 3
+se fait au 1
+se fait dan 1
+se fait de 1
+se fait par 1
+se fb8 1
+se feront 1
+se feront loc 1
+se fffl1 1
+se ffl nod 1
+se fh 1
+se fic 2
+se fic pour 1
+se fic un 1
+se fig 6
+se fig. 1
+se fig.1 1
+se figur 30
+se figur 11b 1
+se figur 11c 1
+se figur 1a 1
+se figur 1b 1
+se figur 3a 1
+se figur 3b 2
+se figur 5a 1
+se figur 7a 1
+se figur 8a 1
+se figur 8b 1
+se figur 8c 1
+se figur a.5 1
+se foc 2
+se foc la 1
+se foc sur 1
+se focaliser 1
+se focaliser sur 1
+se follow subsect 1
+se fonct 1
+se font 3
+se font ain 1
+se font en 1
+se font par 1
+se font sentir 1
+se for exampl 3
+se for np 1
+se for o1 1
+se for select 1
+se for serv 1
+se for singl 1
+se for subsystem 1
+se form 3
+se form top 1
+se formuler 1
+se formuler en 1
+se fp 1
+se fp1 1
+se fr0 1
+se from theorem 1
+se funct 2
+se funct junior 1
+se fx 1
+se fx1 1
+se fxjx 1
+se fxjx pi 1
+se fyj 1
+se g en 2
+se gener 1
+se giv 1
+se growth 1
+se gt 1
+se gt nj0c 1
+se h fx 1
+se ha lin 1
+se ha logarithm 1
+se ha measur 1
+se ha reach 1
+se ha siz 1
+se hav cr 1
+se header 1
+se heurt 3
+se heurt alor 1
+se heurt au 1
+se heurt donc 1
+se heurt souv 1
+se heurt toutef 1
+se hk 1
+se hort 1
+se how fast 1
+se how parallel 1
+se how selecttest 1
+se i act 1
+se i backlog 1
+se i becom 1
+se i bus 1
+se i finish 1
+se i pack 1
+se i receiv 1
+se i start 1
+se i traff 1
+se if defin 1
+se if remov 1
+se if simil 1
+se illustr 1
+se implem 1
+se in adeg 1
+se in expon 1
+se in gener 1
+se in lin 1
+se in mak 1
+se in memor 1
+se in parallel 1
+se in sect 1
+se inclus 4
+se inform 1
+se ingrid 1
+se init 1
+se int main 1
+se int round 1
+se invar 1
+se invar constraint 1
+se invar el 1
+se is allow 2
+se is automat 1
+se is ba 1
+se is bound 1
+se is btn 1
+se is ch 1
+se is cl 1
+se is compar 2
+se is consider 2
+se is empt 1
+se is equ 1
+se is giv 1
+se is ident 1
+se is implicit 1
+se is inclus 2
+se is involut 1
+se is label 1
+se is serv 1
+se is shown 1
+se is simp 1
+se is st 1
+se is zer 1
+se issn 1
+se it belong 1
+se it bit 1
+se it div 1
+se it ph 1
+se it pt 1
+se it result 1
+se it status 1
+se item 1
+se item principl 1
+se itself inact 1
+se j becom 1
+se j pack 1
+se j receiv 1
+se junior 1
+se justif 2
+se justif essentiel 1
+se justif par 2
+se keppel 1
+se lac 1
+se lambd 1
+se last track 1
+se lat 1
+se layer 1
+se layer demultiplec 1
+se layer libr 1
+se lem 2
+se length 1
+se length int 1
+se level 2
+se level me 1
+se level simil 1
+se levin 1
+se lib 1
+se lib erer 1
+se lier 1
+se lign 1
+se lign sont 1
+se lim 1
+se lim au 1
+se lim souv 1
+se limitait 1
+se limitait aux 1
+se limiter 1
+se lock 1
+se lp 1
+se m0 1
+se map 1
+se may rec 1
+se me 1
+se me allow 1
+se me dat 1
+se me eventu 1
+se me flow 1
+se me length 1
+se me multiplec 1
+se me rel 1
+se me sent 1
+se me seq 1
+se me succ 1
+se me travel 1
+se membership 1
+se membership oper 1
+se membr 1
+se mesur 1
+se mesur par 1
+se method 1
+se method sect 1
+se mettr 1
+se mettr sous 1
+se minim 1
+se minneapol 2
+se minrol 1
+se mint 1
+se montrer 1
+se montrer trop 1
+se multipl 2
+se multipl consid 1
+se multipl le 1
+se multiplec 1
+se multiplec fact 1
+se n srst 1
+se nest 1
+se next paragraph 1
+se next quest 1
+se next sect 1
+se no eleg 1
+se no stal 1
+se nod 1
+se not using 1
+se number 1
+se of 2i 1
+se of abstract 3
+se of acc 1
+se of act 3
+se of ad 1
+se of algorithm 2
+se of allow 1
+se of altern 1
+se of an 1
+se of annot 1
+se of appl 1
+se of ar 1
+se of arbitr 1
+se of argum 1
+se of assignm 1
+se of assoc 2
+se of atom 3
+se of av 1
+se of avail 2
+se of ba 2
+se of backlog 1
+se of bal 1
+se of belief 1
+se of benchmark 2
+se of bin 2
+se of boolean 1
+se of brodatz 1
+se of build 1
+se of bundl 1
+se of candid 2
+se of canon 2
+se of categor 1
+se of ch 1
+se of chain 1
+se of chang 1
+se of circuit 1
+se of cl 1
+se of claus 3
+se of client 1
+se of cliqu 2
+se of cluster 1
+se of coin 1
+se of collect 1
+se of color 1
+se of common 1
+se of commun 1
+se of compon 1
+se of comput 2
+se of conceptu 1
+se of concur 1
+se of condit 1
+se of confid 1
+se of configur 4
+se of connect 2
+se of consecut 2
+se of consider 1
+se of const 1
+se of constitu 1
+se of constraint 7
+se of construc 1
+se of context 1
+se of contextu 1
+se of contigu 1
+se of contour 1
+se of control 3
+se of conv 1
+se of correspon 2
+se of cr 1
+se of cur 2
+se of cycl 1
+se of d2 1
+se of dat 2
+se of ded 1
+se of default 1
+se of defin 1
+se of definit 6
+se of dep 1
+se of deriv 2
+se of design 2
+se of designf 2
+se of desir 1
+se of destin 2
+se of determin2 1
+se of direct 3
+se of disabl 1
+se of disjoint 1
+se of displ 1
+se of dist 2
+se of distinct 1
+se of disturb 1
+se of docum 2
+se of dyad 1
+se of ec 1
+se of edg 9
+se of educ 1
+se of effect 1
+se of el 7
+se of elect 1
+se of enabl 1
+se of ent 1
+se of equ 1
+se of event 1
+se of expan 1
+se of exper 1
+se of experim 4
+se of fact 2
+se of failur 1
+se of fe 3
+se of featur 1
+se of fic 1
+se of field 1
+se of fin 1
+se of finit 2
+se of fir 1
+se of fit 1
+se of forml 2
+se of funct 2
+se of fundam 1
+se of futur 1
+se of gblog 1
+se of gener 3
+se of goal 1
+se of good 2
+se of graph 2
+se of guard 1
+se of guidel 1
+se of half 1
+se of hamilt 1
+se of high 1
+se of host 1
+se of hyperplan 2
+se of ibn 1
+se of id 1
+se of ident 1
+se of identif 1
+se of imag 1
+se of ind 4
+se of inequ 2
+se of infer 1
+se of infinit 1
+se of inform 1
+se of init 2
+se of input 6
+se of inst 1
+se of instruc 3
+se of int 1
+se of integer 3
+se of interfac 1
+se of interpr 2
+se of interv 1
+se of iter 1
+se of junior 1
+se of keyboard 1
+se of label 1
+se of learn 1
+se of leav 1
+se of letter 1
+se of level 1
+se of li 1
+se of lin 2
+se of liter 1
+se of load 1
+se of loc 1
+se of lock 1
+se of log 2
+se of loop 2
+se of m2 1
+se of me 5
+se of mean 1
+se of measur 3
+se of memor 1
+se of min 1
+se of minim 1
+se of mod 1
+se of model 1
+se of modif 1
+se of molecl 1
+se of monot 1
+se of multipl 1
+se of multiport 1
+se of nam 1
+se of natur 1
+se of neighbor 1
+se of neighbour 1
+se of network 1
+se of ni 1
+se of nod 10
+se of non 3
+se of non. 1
+se of nonloc 1
+se of norm 1
+se of numer 1
+se of object 4
+se of observ 1
+se of op 1
+se of oper 4
+se of order 1
+se of origin 2
+se of orthogon 1
+se of output 5
+se of overlap 1
+se of pack 1
+se of pair 4
+se of parameter 3
+se of part 1
+se of particl 1
+se of path 1
+se of pattern 1
+se of phr 1
+se of phy 1
+se of point 5
+se of pointer 1
+se of polygon 2
+se of polyhedr 1
+se of polynom 2
+se of posit 2
+se of possibil 1
+se of predefin 1
+se of predetermin 1
+se of prim 2
+se of primitiv 1
+se of privileg 1
+se of problem 4
+se of proc 8
+se of procedur 1
+se of program 5
+se of prompt 1
+se of proof 1
+se of proper 1
+se of quer 1
+se of rat 1
+se of record 2
+se of rectangl 2
+se of register 2
+se of regl 1
+se of rel 2
+se of relationship 1
+se of remain 2
+se of repetit 1
+se of repr 1
+se of requir 1
+se of residu 1
+se of resourc 1
+se of result 1
+se of retain 1
+se of rigid 1
+se of rl 5
+se of rol 1
+se of rot 1
+se of rout 2
+se of row 2
+se of saf 1
+se of sampl 3
+se of satisf 1
+se of se 3
+se of seed 1
+se of self 1
+se of sem 1
+se of senior 1
+se of sent 1
+se of separ 1
+se of serv 1
+se of server 1
+se of shap 2
+se of shar 1
+se of shunt 1
+se of siml 2
+se of simpl 1
+se of sink 1
+se of siolut 1
+se of sit 1
+se of slot 1
+se of smooth 1
+se of softwar 1
+se of sol 1
+se of solut 4
+se of solver 1
+se of sourc 1
+se of specif 3
+se of st 5
+se of stack 1
+se of starheight 1
+se of stat 1
+se of stereotyp 1
+se of strateg 1
+se of strong 1
+se of sub 1
+se of submatr 1
+se of substitut 1
+se of subtransact 1
+se of superimp 1
+se of switch 2
+se of synth 1
+se of tag 1
+se of task 1
+se of td 1
+se of techniqu 1
+se of technolog 2
+se of tempor 1
+se of term 4
+se of termin 1
+se of test 2
+se of tetrahedr 1
+se of thread 1
+se of threat 1
+se of tim 3
+se of tin 1
+se of tomograph 1
+se of tool 1
+se of tor 1
+se of transform 2
+se of transl 1
+se of triangl 2
+se of trigonometer 1
+se of tripl 1
+se of tupl 1
+se of typ 2
+se of unmatch 1
+se of unrestrict 1
+se of upd 1
+se of valu 5
+se of var 2
+se of variabl 13
+se of ver 7
+se of vid 1
+se of weak 1
+se of weight 1
+se of word 1
+se of work 2
+se of xilinx 1
+se of ys 1
+se on adeg 1
+se on figur 1
+se on gt 1
+se on learn 1
+se on leav 1
+se oper 4
+se oper assoc 1
+se or fe 1
+se our algorithm 1
+se overhead 1
+se pa 2
+se pa pour 1
+se pa tr 1
+se pack 1
+se pair 1
+se par 1
+se par el 1
+se particl 1
+se partit 1
+se partit pb 1
+se passer 2
+se passer de 1
+se passer du 1
+se pattern 1
+se pb 1
+se per nod 1
+se perform 2
+se perform intrin 1
+se perform upd 1
+se peut 1
+se peut la 1
+se pffq 1
+se pffq scfq 1
+se po 2
+se po de 1
+se po le 1
+se poser 1
+se poser de 1
+se poser lorsqu 1
+se posit 1
+se posit com 1
+se post 1
+se poursuit 2
+se poursuit alor 1
+se poursuit au 1
+se poursuivr 1
+se poursuivr en 1
+se pq 1
+se pr 3
+se pr eoccuper 2
+se pr esent 3
+se pr esenter 1
+se pr etent 2
+se pr1 1
+se prab 1
+se prev 1
+se prev com 1
+se probabilit 1
+se probabilit es 1
+se problem 1
+se proc 1
+se proc tim 1
+se processeur 1
+se produir 3
+se produir pa 1
+se produir quau 1
+se produit 1
+se produit jam 1
+se progr 1
+se proof 1
+se prop 1
+se prop de 1
+se prop dillustrer 1
+se propag 1
+se propag avec 1
+se propag est 1
+se propr 2
+se propr avant 1
+se protocol 2
+se q contain 1
+se q0 2
+se qj 1
+se quest 1
+se r edu 1
+se r eduir 1
+se r eduit 1
+se r ep 1
+se r epart 1
+se r esum 2
+se r esumer 3
+se r ev 1
+se ramenait 1
+se ramener 2
+se rang 1
+se rapid 1
+se rapport 1
+se rapport aux 1
+se rapproch 1
+se rapproch aut 1
+se rapproch de 1
+se reach 1
+se receiv 1
+se recogn 1
+se recur 1
+se recur descript 1
+se reduc 1
+se reduc algorithm 1
+se reduc rl 1
+se refer 1
+se regrouper 1
+se regrouper dan 1
+se regrouper en 1
+se rejoign 1
+se rejoign au 1
+se rel 1
+se reporter 1
+se reporter pour 1
+se repr 1
+se reprodu 1
+se reproduir 1
+se requir 2
+se reserv 1
+se reserv arriv 1
+se resourcemanager 1
+se resourcemanager managertransact 1
+se respon 1
+se respon perfect 1
+se restreign 1
+se restreign au 1
+se restreign aux 1
+se restreindr 1
+se restreindr aux 1
+se restreint 1
+se restreint donc 1
+se result 1
+se retrouv 3
+se retrouv avec 1
+se retrouv dailleur 1
+se retrouv dan 1
+se retrouver 1
+se retrouver enter 1
+se s 2n 1
+se s pm 1
+se s receiv 1
+se s ss 1
+se sa 1
+se sb 1
+se sect 16
+se select 1
+se senior 1
+se ser 1
+se ser le 1
+se serait 1
+se serait trouv 1
+se shar 1
+se short 2
+se show 1
+se shown 1
+se shown shar 1
+se si 1
+se simpl 1
+se simpl en 1
+se simplif 1
+se simplif en 1
+se situ 3
+se situ autour 1
+se situ entr 1
+se situ le 1
+se siz 3
+se siz fact 1
+se siz jt 1
+se siz reduc 1
+se sn 2
+se sn fx 1
+se sont 4
+se sont concentr 1
+se sont constam 1
+se sont int 1
+se sont pench 1
+se sont produit 1
+se sont traduit 1
+se soulever 1
+se soulever so 1
+se sous 1
+se sous modl 1
+se sp 1
+se speed 1
+se st 2
+se st transit 1
+se stabil 1
+se stabil lorsqu 1
+se start 1
+se start incr 1
+se strateg 1
+se subsect 1
+se synth 1
+se synth etiser 1
+se system 1
+se system satisf 1
+se t con 1
+se t continu 1
+se t equ 1
+se t ft2 1
+se t instead 1
+se tabl 5
+se tdsp 1
+se tdsp minim 1
+se ten 1
+se termin 2
+se termin lorsqu 1
+se termin si 1
+se text 1
+se th acc 1
+se th assoc 1
+se th backtrack 1
+se th buffer 1
+se th cop 1
+se th disc 1
+se th effect 1
+se th ham 1
+se th handl 1
+se th impact 1
+se th import 1
+se th loc 1
+se th main 1
+se th old 1
+se th pandemon 1
+se th par 1
+se th pattern 1
+se th pg 1
+se th posit 1
+se th problem 2
+se th proof 1
+se th protect 1
+se th pt 1
+se th qu 1
+se th reason 1
+se th se 1
+se th simil 1
+se th stag 1
+se th status 1
+se th strong 1
+se th surv 2
+se th switch 1
+se th text 1
+se th tr 1
+se th typ 1
+se th us 1
+se th valu 1
+se th virtu 1
+se th wealth 1
+se that 2f 1
+se that bool 1
+se that contain 1
+se that es 1
+se that funct 1
+se that gsm 1
+se that invar 1
+se that mlkp 1
+se that p1 1
+se that proposit 1
+se that replac 1
+se that s3 1
+se that shar 1
+se their reject 1
+se their weight 1
+se themselv inact 1
+se then abort 1
+se theor 3
+se theor ba 1
+se theor lead 1
+se theor problem 1
+se theorem 2
+se therefor 1
+se thr major 1
+se thr methodolog 1
+se threshold 1
+se ti 1
+se tlb 1
+se tlb entr 1
+se to 1k 1
+se to aq 1
+se to blank 1
+se to cal 1
+se to cr 1
+se to exchang 1
+se to grow 1
+se to imp 1
+se to inclus 1
+se to ks 1
+se to perm 1
+se to point 1
+se to random 1
+se to read 1
+se to rec 2
+se to reflect 1
+se to select 1
+se to support 1
+se to zer 1
+se tradu 1
+se tradu par 1
+se traduit 4
+se traduit alor 1
+se traduit dan 1
+se traduit en 1
+se traduit par 2
+se trait 1
+se trait de 1
+se transform 2
+se transform en 2
+se transm 1
+se travaux 1
+se travaux dan 1
+se tripl 1
+se tripl attribut 1
+se tripl valu 1
+se trouv 4
+se trouv ain 1
+se trouv alor 1
+se trouv dan 1
+se trouv donc 1
+se trouv en 2
+se trouv lapproch 1
+se trouv le 1
+se trouv naturel 1
+se trouv transform 1
+se trouvait 1
+se trouvait init 1
+se trouver 2
+se trouver dan 2
+se trouveront 1
+se ublog 1
+se ublog tc 1
+se ui 1
+se under observ 1
+se union 2
+se union oper 1
+se union task 1
+se uniqu 1
+se unquot 1
+se unquot spl 1
+se up ar 1
+se up brief 1
+se up correct 1
+se up ga 1
+se up procedur 1
+se us prev 1
+se using 1
+se using constraint 1
+se v equ 1
+se v0n 1
+se valu 1
+se valu attribut 1
+se valu rel 1
+se var 1
+se var a2 1
+se var a22 1
+se var ai 1
+se var en 1
+se variabl 2
+se variabl perman 1
+se ver 2
+se ver attribuer 1
+se veut 1
+se veut pa 1
+se vi 2
+se vi equ 1
+se voir 1
+se voir priv 1
+se voisin 2
+se vouch 1
+se vouch cur 1
+se vouch vouch 1
+se w1 1
+se w1 v1 1
+se w2 1
+se w2 t2 1
+se w2 u2 1
+se wa accept 1
+se wa lower 1
+se wa obtain 1
+se wa peak 1
+se wa pr 1
+se wa scal 1
+se wa ss1.7 1
+se wait 1
+se we illustr 1
+se wer classif 1
+se wer idl 1
+se wer serv 1
+se wer view 1
+se wh 3
+se wh loc 1
+se wh pack 1
+se wh u0 1
+se what effect 1
+se what method 1
+se when creat 1
+se when deep 1
+se when rmsp 1
+se which con 1
+se which contain 1
+se why 5
+se why proc 1
+se with act 1
+se with eff 1
+se with handler 1
+se with lebesgu 1
+se with minim 1
+se with pot 1
+se without further 1
+se xi.4 1
+se xj 1
+se xp 1
+se xr 1
+se xv.3 1
+se xw 1
+se. 1
+se.1 1
+se.1 cook 1
+se.smu.edu 1
+se90 1
+seam 1
+sean 1
+sean o mal 1
+search 58
+search a complec 1
+search a datab 1
+search about design 1
+search al hypoth 1
+search algorithm 8
+search and branch 1
+search and heur 1
+search and me 1
+search and model 1
+search and optim 1
+search and retrief 2
+search at nod 1
+search ba 2
+search ba algorithm 1
+search ba schedl 1
+search begin 1
+search best path 1
+search between s6 1
+search bin 1
+search bin split 1
+search brief 1
+search brief ment 1
+search by prohibit 1
+search by project 1
+search can proceed 1
+search complec 1
+search debugger 1
+search degrad 1
+search direct 2
+search direct increm 1
+search find 1
+search first plac 1
+search fletch 1
+search for appropr 1
+search for approxim 1
+search for con 1
+search for deriv 1
+search for docum 1
+search for good 2
+search for inform 1
+search for inst 1
+search for object 1
+search for obtain 1
+search for parallel 1
+search for proof 1
+search for record 1
+search for red 1
+search for self 1
+search for solut 3
+search heur 1
+search in kdim 1
+search in rel 1
+search in tim 1
+search infer 1
+search infer rl 1
+search is compl 1
+search is ind 1
+search key 1
+search key order 1
+search lead 1
+search led 1
+search look 1
+search mak 1
+search mechan 1
+search method 1
+search must term 1
+search nec 1
+search of electron 1
+search on gener 1
+search on pict 1
+search on rel 1
+search oper 1
+search oper describ 1
+search oper start 1
+search path 1
+search perform 1
+search ph 1
+search problem 3
+search problem ba 1
+search proc 2
+search proc mechan 1
+search proc start 1
+search proc work 1
+search protocol 1
+search record 1
+search record identif 1
+search rel 1
+search rel datab 1
+search requir 1
+search return 1
+search rl 1
+search schem 1
+search spac 9
+search spac contain 1
+search spac structur 1
+search st 1
+search st var 1
+search start 1
+search stop 1
+search strateg 5
+search structur 3
+search structur ba 1
+search task 1
+search techniqu 2
+search th begin 1
+search th gh 1
+search th posit 1
+search th rot 1
+search th ver 1
+search through visu 1
+search tim 2
+search to def 1
+search to increm 1
+search tool 1
+search tr 9
+search tr algorithm 1
+search tr root 1
+search wa ea 1
+search wer modif 1
+search wil result 1
+search with conflict 1
+search1 1
+searchstep 1
+searchstep maxstep 1
+searh 1
+season 1
+season autoregr 1
+season autoregr model 1
+seat 1
+seattl 7
+seau 1
+seau dinterconnec 1
+seber 1
+seber and zhang 1
+sec 22
+sec and tc 1
+sec ar assum 1
+sec by 1
+sec by denot 1
+sec by link 1
+sec ecut 1
+sec ecut chacun 1
+sec ecuter 1
+sec ecuter ind 1
+sec equ 1
+sec ethernet 1
+sec me 1
+sec me cl 1
+sec or high 1
+sec project 1
+sec rang 1
+sec rang qu 1
+sec st1.dpu.dr 1
+sec st1.dpu.dr dputim.tv 1
+sec to determin 1
+sec wa assum 1
+sec7 1
+secon 41
+secon am elior 1
+secon an 1
+secon and standard 1
+secon boucl 1
+secon caus 1
+secon caus est 1
+secon cel 1
+secon claus 1
+secon claus dun 1
+secon claus est 1
+secon claus etant 1
+secon com 1
+secon com cost 1
+secon con 1
+secon condit 1
+secon condit est 1
+secon ecritur 1
+secon et le 1
+secon et speed 1
+secon etap 1
+secon etap con 1
+secon for spf 1
+secon for sun10 1
+secon hav elap 1
+secon ind 1
+secon ind support 1
+secon it erat 1
+secon key 2
+secon key retrief 1
+secon lorsqu 1
+secon lorsqu lun 1
+secon m ethod 1
+secon memor 3
+secon memor acc 1
+secon memor siz 1
+secon not 1
+secon observ 1
+secon observ sur 1
+secon of user 1
+secon of visu 1
+secon opt 1
+secon opt est 1
+secon or minut 1
+secon pa 1
+secon pa est 1
+secon pa peut 1
+secon part 2
+secon part de 1
+secon part ser 1
+secon per failur 1
+secon prepar 1
+secon prepar cost 1
+secon prior 1
+secon proposit 1
+secon proposit dholzbaur 1
+secon qu 1
+secon qu ne 1
+secon raison 1
+secon raison est 1
+secon selon 1
+secon selon qu 1
+secon solut 1
+secon st 7
+secon st datab 1
+secon st dev 1
+secon st subsystem 1
+secon st system 1
+secon st unit 1
+secon structur 1
+secon structur deriv 1
+secon th bind 1
+secon upd 1
+secon valeur 1
+secon valeur est 1
+secon ver 2
+secon ver con 1
+secondair 3
+secondair de 2
+secondair de garantir 1
+secondair de lop 1
+secondorder 1
+secondorder singl 1
+secondorder singl layer 1
+sect 117
+sect a coh 1
+sect a se 1
+sect a.13 1
+sect actu 1
+sect actu behav 1
+sect al compar 1
+sect al inclus 1
+sect allow 1
+sect and der 1
+sect and pag 1
+sect ar cop 1
+sect ar defin 1
+sect ar drawn 1
+sect ar giv 1
+sect ar known 1
+sect ar obtain 1
+sect ar strict 1
+sect aux 1
+sect aux mi 1
+sect b.2.6 1
+sect bandwdith 1
+sect bandwidth 1
+sect brief 1
+sect brief overview 1
+sect by pr 1
+sect captur 1
+sect con 1
+sect conclus 1
+sect construc 1
+sect contain 2
+sect contain inform 1
+sect contigu 1
+sect contigu sect 1
+sect contour 1
+sect contour point 1
+sect cover 1
+sect d efin 1
+sect dan 1
+sect dan le 1
+sect de 2
+sect de cod 1
+sect de la 1
+sect de montrer 1
+sect de program 1
+sect def 1
+sect demonstr 1
+sect describ 11
+sect detail 1
+sect disc 2
+sect dist 1
+sect du 2
+sect du cach 1
+sect encl 1
+sect esqu 1
+sect esqu le 1
+sect est 1
+sect est de 1
+sect et sect 1
+sect examin 1
+sect feed 1
+sect feed for 1
+sect finish 1
+sect for determin 1
+sect giv 2
+sect ha congest 1
+sect ha purp 1
+sect hav incr 1
+sect hav val 1
+sect i investig 1
+sect identif 1
+sect ii 2
+sect ii accord 1
+sect ii demonstr 1
+sect ii pr 1
+sect ii.c 1
+sect imag 1
+sect in term 1
+sect inclus 1
+sect ind 1
+sect ind epen 1
+sect is compr 1
+sect is devot 1
+sect is found 1
+sect is length 1
+sect is popl 1
+sect is preproc 1
+sect is shown 1
+sect is simil 1
+sect is work 1
+sect iv 2
+sect iv pr 1
+sect iv.b 1
+sect le 1
+sect le modif 1
+sect le propr 1
+sect length 1
+sect marker 1
+sect may help 1
+sect might turn 1
+sect monoprocesseur 1
+sect mor concr 1
+sect nonmaster 1
+sect nonmaster proc 1
+sect number 1
+sect of bound 1
+sect of cod 1
+sect of fig 1
+sect on est 1
+sect on lin 1
+sect on offer 2
+sect on p1 1
+sect ont se 1
+sect organ 1
+sect outl 3
+sect pa 1
+sect pa en 1
+sect pa rapid 1
+sect partag 1
+sect partag ee 1
+sect pr 7
+sect pr ec 1
+sect pr esent 2
+sect pr experim 1
+sect prov 2
+sect prov futur 1
+sect prov us 1
+sect purp 1
+sect r ecapitl 1
+sect rel 1
+sect repr 1
+sect repr la 1
+sect resembl 1
+sect resembl tradit 1
+sect review 1
+sect review prev 1
+sect s equentiel 1
+sect sect 1
+sect show 4
+sect sketch 1
+sect som definit 1
+sect sont 1
+sect sont tout 1
+sect suiv 2
+sect suiv pa 1
+sect techniqu 1
+sect th approxim 1
+sect th norm 1
+sect th problem 1
+sect that con 1
+sect that encl 1
+sect to def 1
+sect to extract 1
+sect to fil 1
+sect to obtain 1
+sect to protect 1
+sect u0 1
+sect using 1
+sect using siml 1
+sect v giv 1
+sect vi 1
+sect wa ba 1
+sect we an 1
+sect we assum 3
+sect we brief 1
+sect we compar 1
+sect we contrast 1
+sect we def 2
+sect we defin 1
+sect we demonstr 1
+sect we der 1
+sect we describ 10
+sect we develop 4
+sect we disc 8
+sect we examin 1
+sect we exploit 1
+sect we form 2
+sect we giv 5
+sect we highlight 1
+sect we illustr 2
+sect we introduc 1
+sect we investig 1
+sect we know 1
+sect we ment 1
+sect we prov 1
+sect we qualit 1
+sect we rec 1
+sect we ref 1
+sect we show 7
+sect we st 1
+sect we stud 1
+sect we sup 1
+sect we surv 1
+sect we turn 1
+sect we val 1
+sect wer ea 1
+sect wh 2
+sect whil other 1
+sect wil show 1
+sect with c1 1
+sect with zer 1
+sect would norm 1
+sect yield 1
+sect.1 1
+secur 6
+secur administer 1
+secur administer rol 1
+secur and eff 1
+secur and priv 1
+secur appl 1
+secur computer 1
+secur computer system 1
+secur constraint 1
+secur datab 1
+secur datab transact 1
+secur ii 1
+secur inform 1
+secur inform administer 1
+secur inform flow 1
+secur inform pertain 1
+secur is serv 1
+secur manag 1
+secur model 1
+secur officer 1
+secur pol 1
+secur proper 1
+secur protect 1
+secur research 1
+secur rol 1
+secur system 1
+secur vi 1
+sed 1
+sederberg 1
+sedgewick 1
+sedgewick show 1
+seed 9
+seed at 1
+seed can comprom 1
+seed conver 1
+seed fault 1
+seed iproc 1
+seed outfil 1
+seed output 1
+seed output fil 1
+seed to gener 1
+seed valu 3
+seed valu select 1
+seeger 1
+seeing 4
+seeing that s3 1
+seeing wh 1
+seek 20
+seek a fal 1
+seek a plac 1
+seek a span 1
+seek algorithm 1
+seek algorithm cap 1
+seek an arboresc 1
+seek del 1
+seek del tok 1
+seek improv 1
+seek simp 1
+seek th nod 1
+seek tim 1
+seek to av 1
+seek to character 1
+seek to cr 1
+seek to determin 1
+seek to find 1
+seek to guar 1
+seek to me 1
+seek to minim 1
+seek to overcom 1
+seek to pa 1
+seek to reduc 1
+seek to remov 1
+seek to reproduc 1
+seek to retain 1
+seek to rout 1
+seek to specif 1
+seek to support 1
+seek to us 1
+seem 50
+seem appl 1
+seem cleaner 1
+seem clear 1
+seem consider 1
+seem ea 2
+seem es 1
+seem espec 1
+seem exorbit 1
+seem fair 1
+seem gener 1
+seem lik 1
+seem lik optim 1
+seem log 1
+seem minor 1
+seem minor cultur 1
+seem mor natur 1
+seem mor robust 1
+seem natur 1
+seem no sever 1
+seem not ea 1
+seem quit plaus 1
+seem reason 1
+seem rigor 1
+seem sen 1
+seem strong 1
+seem strong rel 1
+seem th an 1
+seem to account 1
+seem to agr 1
+seem to ap 1
+seem to ar 1
+seem to av 1
+seem to chang 1
+seem to contradict 1
+seem to corrupt 1
+seem to fail 1
+seem to fal 1
+seem to giv 1
+seem to great 1
+seem to heav 1
+seem to implicit 1
+seem to lead 1
+seem to mi 1
+seem to offer 1
+seem to outperform 1
+seem to over 1
+seem to pl 1
+seem to span 1
+seem to suggest 1
+seem to viol 1
+seem triv 1
+seem triv knowledg 1
+seem unnatur 1
+seem us 2
+seem ver lik 1
+seem ver worthwhil 1
+seem wel suit 1
+seen 46
+seen a ca 1
+seen a simil 1
+seen an indefinit 1
+seen any determin 1
+seen as gener 1
+seen as oper 1
+seen as repr 1
+seen as separ 1
+seen as specif 1
+seen as system 1
+seen by compar 1
+seen by examin 1
+seen by quer 1
+seen by se 1
+seen from algorithm 1
+seen how ted 1
+seen in context 1
+seen in exampl 1
+seen in figur 3
+seen in isol 1
+seen in tabl 1
+seen in theorem 2
+seen short 1
+seen th old 1
+seen that atc 1
+seen that learn 1
+seen their definit 1
+seen to grow 1
+seffectu 3
+seffectu avant 1
+seffectu avant la 1
+seffectu ce 1
+seffectu ce chang 1
+seffectu com 1
+seffectu com suit 1
+seffectu dan 1
+seffectu dan le 1
+seffectu de 1
+seffectu de tel 1
+seffectu en 1
+seffectu en tr 1
+seffectu par 1
+seffectu par pag 1
+seffectuer 2
+seffectuer apr 1
+seffectuer apr es 1
+seffectuer au 1
+seffectuer au top 1
+seffectuer lorsqu 1
+seffectuer lorsqu lec 1
+seffectueront 1
+seffectueront a un 1
+seg 4
+seg and sequin 1
+seg is wor 1
+segev 1
+segev and himawan 1
+segm 21
+segm al el 1
+segm al li 1
+segm and arc 1
+segm and classif 1
+segm and edg 1
+segm and label 1
+segm and layout 1
+segm and shap 1
+segm and text 1
+segm ar actu 1
+segm ar creat 1
+segm ar defin 1
+segm ar detect 1
+segm ar reg 1
+segm ar sup 1
+segm as constraint 1
+segm assign 1
+segm ba 1
+segm bound 1
+segm broadcast 1
+segm by textur 1
+segm by whit 1
+segm cal epoch 1
+segm correspon 1
+segm creat 1
+segm de 1
+segm de ba 1
+segm de don 1
+segm de tr 1
+segm du 1
+segm du program 1
+segm ee 1
+segm en 2
+segm en part 1
+segm en som 1
+segm encl 1
+segm et chaqu 1
+segm et par 1
+segm etant 1
+segm experim 1
+segm finaux 1
+segm finaux de 1
+segm for fac 1
+segm for textur 1
+segm from neighbor 1
+segm imag 1
+segm in docum 1
+segm ind 2
+segm int text 1
+segm int textur 1
+segm involut 1
+segm is found 1
+segm is oe 1
+segm is perform 1
+segm is request 1
+segm is succ 1
+segm is suggest 1
+segm is typ 1
+segm link 2
+segm method 1
+segm ne 1
+segm ne cont 1
+segm oe 1
+segm oeab 1
+segm oeab li 1
+segm oeb 1
+segm oeb wh 1
+segm of cod 1
+segm of docum 1
+segm of text 1
+segm parallel 1
+segm parallel pref 1
+segm perform 1
+segm peut 1
+segm peut etr 1
+segm pr 1
+segm pr ec 1
+segm problem 1
+segm prov 1
+segm prov perfect 1
+segm requir 2
+segm result 2
+segm result ba 1
+segm schem 1
+segm separ 1
+segm siz 1
+segm sr 1
+segm st 1
+segm sur 1
+segm sur chaqu 1
+segm task 1
+segm techniqu 1
+segm then cr 1
+segm touch 1
+segm touch exterior 1
+segm using 2
+segm using gabor 2
+segm using soft 1
+segm using wavel 1
+segm wil partit 1
+segm with dec 1
+segm without dec 1
+segm without lo 1
+segrest 1
+seidel 1
+seidel ar 1
+seidl 1
+seif 2
+seif harid 2
+sein 2
+sein de 2
+sein de appel 1
+sein de ce 1
+sein de instruc 1
+sein de la 1
+sein de largum 1
+sein de lenviron 2
+sein de lop 1
+sein de sicstus 1
+sein du 1
+sein du bloc 1
+sein du prem 1
+sein du pseud 1
+sein du syst 1
+sein dun 1
+sein dun argum 1
+sein dun construc 1
+sein dun corp 1
+sein dun environ 1
+sein dun moteur 1
+sein m em 1
+sein ou 1
+sein ou just 1
+seiter 2
+seiter cc.neu.edu 1
+seiter suggest 1
+seitz 3
+sejnowsk 1
+sekiguch 1
+sel 8
+sel a acc 1
+sel a eviter 1
+sel acc 1
+sel acc es 1
+sel adr 1
+sel adr de 1
+sel algorithm 1
+sel algorithm pratiqu 1
+sel appel 1
+sel bloc 1
+sel ca 2
+sel ca de 1
+sel ca probl 1
+sel caract 1
+sel caract er 1
+sel cel 1
+sel cel provoqu 1
+sel champ 1
+sel chang 1
+sel charg 1
+sel charg du 1
+sel condit 1
+sel condit pour 1
+sel conflit 1
+sel conflit dan 1
+sel curiosit 1
+sel d efaut 1
+sel d epen 1
+sel dan 2
+sel dan ce 1
+sel dan le 1
+sel de 2
+sel de claus 1
+sel de le 1
+sel destimer 1
+sel destimer le 1
+sel deux 1
+sel deux diff 1
+sel diff 1
+sel diff er 1
+sel dim 1
+sel don 1
+sel don ee 1
+sel du 1
+sel du nombr 1
+sel ecritur 1
+sel elim 1
+sel elim de 1
+sel enregister 1
+sel enregister par 1
+sel etap 1
+sel etap correspon 1
+sel etr 1
+sel etr connu 1
+sel fluc 1
+sel fluc dinstruc 1
+sel fo 2
+sel group 1
+sel group dan 1
+sel group de 1
+sel homog 1
+sel homog ne 1
+sel inconnu 1
+sel individu 1
+sel la 3
+sel la boucl 1
+sel la prem 1
+sel la quantit 1
+sel la restaur 1
+sel la secon 1
+sel la var 1
+sel lappl 1
+sel lappl dun 1
+sel le 3
+sel le adr 1
+sel le cod 1
+sel le droit 1
+sel le mieux 1
+sel le modif 1
+sel le pag 1
+sel le ph 1
+sel le prem 2
+sel le rest 1
+sel lenviron 1
+sel lenviron correspon 1
+sel lim 1
+sel lim serait 1
+sel m emoir 1
+sel mach 1
+sel mach po 1
+sel migr 2
+sel migr de 1
+sel mot 1
+sel mot mach 1
+sel mvp 1
+sel mvp util 1
+sel niveau 1
+sel op 1
+sel op erat 1
+sel pag 1
+sel partiel 1
+sel partiel instanc 1
+sel pav 1
+sel perm 1
+sel perm de 1
+sel pic 1
+sel port 1
+sel port sur 1
+sel processeur 2
+sel processeur est 1
+sel produir 1
+sel profondeur 1
+sel profondeur de 1
+sel pseudosolut 1
+sel r ef 1
+sel r esolut 1
+sel register 1
+sel rl 1
+sel s equ 1
+sel sect 2
+sel sect de 1
+sel sect du 1
+sel si 4
+sel si cest 1
+sel si le 1
+sel sit 1
+sel sit de 1
+sel solut 1
+sel sont 1
+sel ten 1
+sel test 1
+sel trait 1
+sel trait de 1
+sel transfer 1
+sel transfer au 1
+sel transfer de 1
+sel un gain 1
+sel v erit 1
+sel valeur 1
+sel valeur possibl 1
+sel veiller 1
+sel vo 1
+sel vo pour 1
+sel3 1
+sel79 1
+sel82 1
+sel92 1
+seldom 3
+seldom an 1
+seldom justif 1
+select 79
+select a candid 1
+select a fair 1
+select a finit 1
+select a giv 1
+select a liter 1
+select a lower 1
+select a match 1
+select a nod 3
+select a oe 1
+select a parameter 1
+select a part 1
+select a particl 1
+select a proc 1
+select a project 1
+select a receiver 1
+select a reduc 1
+select a sampl 1
+select a sub 1
+select a test 1
+select a tupl 1
+select a ver 1
+select abstract 1
+select abstract tool 1
+select act 1
+select act match 1
+select activ 2
+select activ vs 1
+select adapt 1
+select adapt ba 1
+select addr 1
+select addr bit 1
+select adequ 1
+select adequ cl 1
+select al fault 1
+select al modif 1
+select al test 1
+select algorithm 5
+select algorithm ba 1
+select algorithm cur 1
+select algorithm reduc 1
+select an act 1
+select an arbitr 1
+select an instruc 1
+select and combin 1
+select and del 1
+select and equ 1
+select and execut 1
+select and inser 1
+select and match 1
+select and nal 1
+select and natur 1
+select and om 1
+select and project 1
+select and return 1
+select and sort 1
+select and test 1
+select and unif 1
+select answer 1
+select ap 1
+select ap select 1
+select appl 1
+select appl program 1
+select appropr 1
+select appropr appl 1
+select ar 6
+select ar ident 1
+select arbitr 1
+select arbitr reg 1
+select as actu 1
+select assignm 1
+select at decl 1
+select at former 1
+select at random 1
+select ba 1
+select benchmark 1
+select benchmark program 1
+select box 1
+select bring 1
+select bring host 1
+select budg 1
+select budg dnam 1
+select budgetv 1
+select budgetv dn 1
+select budgetv dnam 1
+select budgetv pn 1
+select by adapt 1
+select by cfg 1
+select by dejavu1 1
+select by dejavu2 1
+select by doubl 1
+select by encod 1
+select by prun 1
+select cal 1
+select cal select 1
+select chang 1
+select chart 1
+select consequ 1
+select contextu 1
+select contextu unit 1
+select control 1
+select coordin 1
+select coordin design 1
+select cor 1
+select criter 3
+select csg 1
+select dat 1
+select dat el 1
+select dep 1
+select dermorphin 1
+select determin 1
+select dn 1
+select dn budg 1
+select dn budgetv 1
+select dnam 1
+select dnamev 1
+select e sal 1
+select effect 1
+select ei 1
+select eigenvect 1
+select el 1
+select ev fault 1
+select ev test 1
+select eval 1
+select eval return 1
+select exact 1
+select exp 1
+select exp subexpr 1
+select fail 1
+select featur 1
+select fewer 1
+select fewer test 1
+select for gener 1
+select for handl 1
+select for migr 1
+select for multipl 1
+select for narrow 1
+select for reus 1
+select for schedl 1
+select for stud 1
+select for subject 1
+select for textur 1
+select for transfer 1
+select for transm 1
+select from menus 1
+select ft2 1
+select funct 1
+select high 1
+select high prob 1
+select import 1
+select in narx 1
+select in q1.7 1
+select in situ 1
+select inclus 1
+select int e2 1
+select inv 1
+select is analog 1
+select is high 1
+select is lik 1
+select issu 1
+select issu involut 1
+select join 1
+select join qu 1
+select learn 1
+select learn strateg 1
+select lp 1
+select lp matr 1
+select mak 1
+select match 1
+select match el 1
+select maxim 1
+select maxim match 1
+select may var 1
+select me 1
+select method 3
+select method rank 1
+select mod 1
+select mod cand 1
+select modif 1
+select modif traver 1
+select nearest 1
+select nearest neighbor 1
+select nn 1
+select nn rl 1
+select no test 1
+select nod 1
+select non 1
+select non modif 1
+select object 1
+select of appropr 1
+select of cur 1
+select of edg 1
+select of lin 1
+select of memor 1
+select of nod 1
+select of primitiv 1
+select of vocabl 1
+select offer 1
+select on attribut 1
+select on inst 1
+select on test 1
+select on tupl 1
+select onl test 1
+select oper 1
+select oper inclus 1
+select oper requir 1
+select oper select 1
+select optim 1
+select optim memor 1
+select paper 1
+select parameter 2
+select partit 1
+select pe 1
+select pe inser 1
+select phr 1
+select phr substructur 1
+select pn 1
+select pn budg 1
+select pn budgetv 1
+select popl 1
+select pr 1
+select prim 1
+select prim pj 1
+select primitiv 1
+select primitiv random 1
+select problem 2
+select proc 2
+select procedur 2
+select procedur number 1
+select procedur selecttest 1
+select prompt 1
+select prompt strateg 1
+select propag 1
+select propag etc 1
+select random 1
+select random def 1
+select random kc 1
+select ratingv 1
+select ratingv ssn 1
+select red 1
+select reduc 1
+select reduc test 1
+select regr 1
+select regr test 1
+select remov 1
+select remov key 1
+select research 1
+select result 2
+select retest 1
+select retest incr 1
+select retest techniqu 1
+select return 1
+select reus 1
+select reus test 1
+select rev 1
+select rev prototyp 1
+select rl 4
+select rl check 1
+select rout 1
+select run 1
+select saf 1
+select saf test 1
+select sal 1
+select sal dnam 1
+select sal dnamev 1
+select sal skil 1
+select salaryv 1
+select salaryv dnamev 1
+select salaryv skil 1
+select salaryv ssn 1
+select sampl 1
+select schem 1
+select se 2
+select select 1
+select select eval 1
+select select select 1
+select selectivityl 1
+select selectivityl select 1
+select skil 1
+select som el 1
+select som test 1
+select son 1
+select ssn 1
+select ssn dnamev 1
+select ssn pn 1
+select ssn ratingv 1
+select ssn sal 1
+select ssn salaryv 1
+select ssn skillsv 1
+select ssn typ 1
+select ssn typev 1
+select stat 1
+select strateg 1
+select sub 2
+select sub autoregr 1
+select such test 1
+select system 1
+select system parameter 1
+select techniqu 2
+select techniqu ch 1
+select techniqu dep 1
+select techniqu inclus 1
+select techniqu wh 1
+select techniqu1 1
+select tempor 2
+select tempor atom 1
+select tempor unit 1
+select test 1
+select test ba 1
+select test se 1
+select test suit 1
+select test.4 1
+select th act 1
+select th appropr 2
+select th center 1
+select th color 1
+select th configur 2
+select th criter 1
+select th cur 1
+select th desir 2
+select th edg 1
+select th init 1
+select th item 2
+select th lowest 1
+select th method 1
+select th modif 1
+select th nec 1
+select th nod 3
+select th pack 1
+select th point 1
+select th sal 1
+select th sourc 1
+select th sub 1
+select th test 1
+select th tupl 1
+select th typ 1
+select th us 1
+select th ver 2
+select that tr 1
+select thenif 1
+select thenif cand 1
+select thereb 1
+select thr traff 1
+select threshold 1
+select threshold fract 1
+select through prun 1
+select to cr 1
+select to ind 1
+select to offer 1
+select to tak 1
+select tok 1
+select tok varl 1
+select tool 1
+select tupl 1
+select turn 1
+select typ 1
+select typ inst 1
+select typev 1
+select typev ssn 1
+select uniqu 1
+select uniqu satisf 1
+select upd 1
+select upd facil 1
+select upd instruc 1
+select using 2
+select using separ 1
+select val 1
+select ver 1
+select vi 2
+select wa influ 1
+select when run 1
+select when selecttest 1
+select with prun 1
+select work 1
+select work distribut 1
+select writ 1
+selectfirst 1
+selectintertest 1
+selectintertest algorithm 1
+selectintertest cal 1
+selectintertest cal selecttest2 1
+selectintertest proc 1
+selectintertest proc pair 1
+selectintertest requir 1
+selectivityl 1
+selectivityl select 1
+selecttest 1
+selecttest algorithm 1
+selecttest and compar 1
+selecttest and selectintertest 1
+selecttest ch 1
+selecttest detect 1
+selecttest first initializ 1
+selecttest had simp 1
+selecttest handl 1
+selecttest handl chang 1
+selecttest initializ 1
+selecttest is bound 1
+selecttest is saf 1
+selecttest mark 1
+selecttest mark s2 1
+selecttest mark s3 1
+selecttest next invok 1
+selecttest proceed 1
+selecttest resum 1
+selecttest return 1
+selecttest run 1
+selecttest se 1
+selecttest select 1
+selecttest select exact 1
+selecttest select non 1
+selecttest select test 1
+selecttest tak 1
+selecttest termin 1
+selecttest to select 1
+selecttest work 1
+selecttest2 1
+selecttest2 ad 1
+selecttest2 ad main 1
+selecttest2 and compar2 1
+selecttest2 begin 1
+selecttest2 check 1
+selecttest2 on fo 1
+selecttest2 se 1
+selecttest2 tak 1
+selecttest2 with main 1
+selesnick 1
+self 38
+self abil 1
+self adapt 1
+self adapt solut 1
+self adjust 1
+self adjust dynam 1
+self appl 1
+self appl part 1
+self as 1
+self as confid 1
+self as natur 1
+self assessm 1
+self assessm abil 1
+self assessm proper 1
+self assessmentfeedback 1
+self assessmentfeedback inputtargetoutput 1
+self cl 1
+self clock 1
+self clock fair 1
+self cluster 1
+self cluster recur 1
+self commut 1
+self con 2
+self con du 1
+self configur 2
+self configur loc 2
+self connect 1
+self connect ec 1
+self connect part 1
+self contain 7
+self contain agent 1
+self contain approach 1
+self contain descript 1
+self contain ent 1
+self contain modl 1
+self contain prolog 1
+self contr 1
+self contr dual 1
+self crit 1
+self del 1
+self del comput 1
+self deletingpijd 1
+self delim 1
+self delim self 1
+self dual 1
+self dual boolean 1
+self dual func. 1
+self dual funct 1
+self dx 1
+self dx dy 1
+self exp 1
+self exp env 1
+self explan 3
+self explan augm 1
+self gener 3
+self gener reduc 1
+self improv 1
+self improv encour 1
+self improv keep 1
+self improv paradigm 1
+self inst 1
+self inst cl 1
+self intersect 1
+self is bound 1
+self langu 1
+self loop 2
+self me 1
+self me dum 1
+self me upd 1
+self method 1
+self method nam 1
+self modif 1
+self modif capabil 1
+self modif program 1
+self modif speed 1
+self modif us 1
+self new valu 1
+self observ 1
+self observ proper 1
+self organ 1
+self organ concur 1
+self output 1
+self output dep 1
+self pointer 1
+self pointer point 1
+self reconfigur 1
+self refer 3
+self refer aptitud 1
+self refer instruc 1
+self refer langu 1
+self refer learn 1
+self refer neur 1
+self refer primitiv 1
+self refer puzzl 1
+self refer quiz 1
+self refer quizz 1
+self refer repr 1
+self refer se 1
+self refer weight 1
+self rout 1
+self rout interconnect 1
+self rout switch 1
+self schedl 3
+self stabil 3
+self stabil algorithm 1
+self stabil leader 1
+self stabil system 2
+self suff 1
+self suff proper 1
+selfcon 1
+selfdu 1
+selfdu funct 1
+selfexplan 1
+selfimprov 1
+selfimprov paradigm 1
+selfimprov with low 1
+selfmodif 1
+selfmodif program 1
+selfmodif program consider 1
+selfmut 1
+selfobserv 1
+selfobserv writ 1
+selfrefer 1
+selfrefer instruc 1
+selfridg 1
+selfridg div 1
+selfridg div result 1
+selfridg pandemon 1
+selfridg shout 1
+selfridg shout demon 1
+selfridg wa grad 1
+sellinger 1
+selman 2
+selon 4
+selon ce 1
+selon ce mod 1
+selon la 2
+selon la multiplicit 1
+selon la terminolog 1
+selon laquel 2
+selon laquel de 1
+selon laquel la 1
+selon le 3
+selon le distribut 1
+selon le don 1
+selon le mod 1
+selon le nouvel 1
+selon le program 1
+selon le typ 1
+selon mo 1
+selon qu 1
+selon qu le 1
+selon qu lun 1
+selon quatr 1
+selon quatr ac 1
+selon quel 1
+selon quel perm 1
+selon un 1
+selon un pent 1
+seltzer 1
+selv 1
+selv to solut 1
+sem 52
+sem accord 1
+sem adequ 1
+sem adequ introduc 1
+sem aff 1
+sem aff variabl 1
+sem an 3
+sem and bottom 1
+sem and condit 1
+sem and gener 1
+sem and implem 2
+sem and refin 1
+sem and run 1
+sem and structur 1
+sem and therefor 1
+sem and us 1
+sem approach 1
+sem ar comput 1
+sem ar deriv 1
+sem ar preserv 1
+sem assoc 1
+sem autom 2
+sem autom stud 1
+sem autom tool 1
+sem autom upd 1
+sem automat 1
+sem automat upd 1
+sem ba 5
+sem ba framework 1
+sem ba program 1
+sem by balb 1
+sem by ch 1
+sem by defin 1
+sem by mean 1
+sem c.f 1
+sem ca 1
+sem chang 1
+sem check 1
+sem classiqu 1
+sem coh 1
+sem coinc 1
+sem compon 1
+sem con 1
+sem condit 1
+sem consequ 1
+sem consequ rel 1
+sem constraint 1
+sem cont 2
+sem cont ment 1
+sem correct 1
+sem correct compon 1
+sem datab 1
+sem defin 1
+sem definit 2
+sem definit satisf 1
+sem describ 1
+sem descript 2
+sem differ 1
+sem difficult 1
+sem distribut 1
+sem distribut repr 1
+sem domain 1
+sem equiv 3
+sem equiv forml 1
+sem et non 1
+sem for fl 1
+sem for gener 1
+sem for high 1
+sem for inst 1
+sem for langu 1
+sem for mlp 1
+sem for mod 1
+sem for nondetermin 1
+sem for part 1
+sem for proc 1
+sem for prolog 1
+sem for pur 1
+sem for tdfg 1
+sem for tim 1
+sem for tot 1
+sem for typ 1
+sem for unfold 1
+sem for vhdl 1
+sem form 1
+sem form concr 1
+sem form syntac 1
+sem fr 1
+sem framework 1
+sem from rel 1
+sem funct 4
+sem guid 1
+sem guid test 1
+sem in act 1
+sem in lisp 1
+sem in memor 1
+sem in order 1
+sem in sect 1
+sem indep 1
+sem indep modl 1
+sem induc 1
+sem inform 3
+sem is assoc 1
+sem is concern 1
+sem is coupl 1
+sem is describ 1
+sem is exact 1
+sem is val 1
+sem issu 1
+sem knowledg 1
+sem langu 1
+sem langu descript 1
+sem lat 1
+sem lat approach 1
+sem lat structur 1
+sem level 1
+sem level descript 1
+sem link 1
+sem logaritmiqu 1
+sem might imp 1
+sem model 2
+sem monot 1
+sem monot exhibit 1
+sem monot iff 1
+sem monot satisf 1
+sem nonequiv 1
+sem nonequiv.8 1
+sem not 1
+sem of assembl 1
+sem of block 1
+sem of bod 1
+sem of concur 1
+sem of constraint 2
+sem of dat 1
+sem of determin 1
+sem of el 1
+sem of eulisp 1
+sem of forml 1
+sem of funct 1
+sem of hardwar 1
+sem of hilog 1
+sem of ie 1
+sem of imper 1
+sem of log 3
+sem of mlp 1
+sem of mult 1
+sem of multipl 1
+sem of non 1
+sem of nonatom 1
+sem of nondetermin 1
+sem of object 1
+sem of oper 1
+sem of pr 1
+sem of primitiv 1
+sem of problem 1
+sem of program 2
+sem of prolog 1
+sem of schem 1
+sem of sequ 1
+sem of sld 1
+sem of syntac 1
+sem of tam 1
+sem of templog 1
+sem of term 1
+sem of typ 1
+sem of unfold 1
+sem of upd 1
+sem oper 1
+sem oper obtain 1
+sem orient 2
+sem orient techniqu 1
+sem os 1
+sem pr 1
+sem pragm 1
+sem pragm proc 1
+sem preserv 2
+sem preserv transform 1
+sem preserv unfold 1
+sem prim 1
+sem proper 2
+sem rel 1
+sem rel sect 1
+sem remain 1
+sem requir 1
+sem rl 1
+sem schem 1
+sem sem 1
+sem sem oper 1
+sem sen 2
+sem sort 1
+sem sound 2
+sem sound proper 1
+sem specif 1
+sem structur 3
+sem that tak 1
+sem thread 1
+sem to constraint 1
+sem unif 1
+sem us 1
+sem using 1
+sem ver 1
+sem wer ext 1
+sem wh 1
+sem williamson 1
+sem williamson typ 1
+semaphor 5
+semaphor guar 1
+semaphor guar atom 1
+semaphor or channel 1
+sembl 5
+sembl a cel 2
+sembl au 1
+sembl au pr 1
+sembl dioecil 1
+sembl dioecil de 1
+sembl donc 1
+sembl donc ne 1
+sembl donc qu 1
+sembl etr 2
+sembl etr arbitrair 1
+sembl etr devenu 1
+sembl etr la 1
+sembl insolubl 1
+sembl la 1
+sembl le 1
+sembl le mieux 1
+sembl lim 1
+sembl lim ee 1
+sembl pa 1
+sembl pa pr 1
+sembl pa qu 1
+sembl plus prometteur 1
+sembl po dutiliser 1
+sembl prometteur 1
+sembl prometteur concern 1
+sembl qu 1
+sembl qu linstruc 1
+sembl raison 1
+sembl raison de 1
+sembl simposer 1
+sembl simposer dan 1
+sembl tr 1
+sembl tr es 1
+sembl valoir 1
+sembl valoir la 1
+sembler 1
+sembler peu 1
+sembler peu int 1
+semicl 1
+semicl ca 1
+semicolon 1
+semidynam 1
+semidynam schedl 1
+semiinterv 1
+semiinterv qu 1
+semiinterv qu program 1
+semiinterv quer 1
+semimembership 1
+semimembership algorithm 1
+semin 1
+semin paper 1
+seminar 1
+seminar entitl 1
+seminar entitl art 1
+semirecur 1
+semirecur se 1
+sen 86
+sen a chang 1
+sen a connect 1
+sen a const 1
+sen a continu 1
+sen a cop 1
+sen a ded 1
+sen a finish 1
+sen a flit 1
+sen a la 1
+sen a log 1
+sen a me 10
+sen a nak 1
+sen a nod 1
+sen a pack 1
+sen a part 1
+sen a posit 1
+sen a reject 1
+sen a remot 1
+sen a rep 1
+sen a report 1
+sen a request 3
+sen a respon 1
+sen a se 1
+sen a sign 3
+sen a sum 1
+sen a test 1
+sen a tot 1
+sen a uniqu 1
+sen a valu 2
+sen accept 1
+sen accept cap 1
+sen acknowledg 1
+sen actu 1
+sen addit 1
+sen addit me 1
+sen adjust 1
+sen afin 1
+sen afin de 1
+sen al me 1
+sen al request 1
+sen altern 1
+sen an accept 1
+sen an init 1
+sen an init1 1
+sen an interrupt 1
+sen an upd 2
+sen and direct 1
+sen and rec 3
+sen and receiv 4
+sen another nod 1
+sen any request 1
+sen appropr 1
+sen appropr me 1
+sen au 1
+sen au part 1
+sen by proc 1
+sen candid 1
+sen chunk 1
+sen chunk request 1
+sen chunk requeststim 1
+sen classiqu 1
+sen coh 1
+sen coh request 1
+sen com 1
+sen com cost 1
+sen consider 1
+sen construc 1
+sen construc found 1
+sen cont 1
+sen cost 1
+sen cost tok 1
+sen dan 1
+sen dan le 1
+sen dat 1
+sen de 3
+sen de adr 1
+sen de banerj 1
+sen de do 1
+sen de fr 1
+sen de karch 1
+sen de la 1
+sen de linclus 1
+sen de pag 1
+sen de prem 1
+sen deposit 1
+sen deposit logact 1
+sen dev 1
+sen du 1
+sen du modl 1
+sen dum 1
+sen dum me 1
+sen dun 1
+sen each ei 1
+sen each member 1
+sen ei 1
+sen el 1
+sen el involut 1
+sen email 1
+sen ensur 1
+sen entrypoint 1
+sen entrypoint continu 1
+sen error 1
+sen et qu 1
+sen etabl 1
+sen ev 1
+sen ev cal 1
+sen event 1
+sen exact 1
+sen exact me 1
+sen expr 1
+sen fil 1
+sen for deliver 1
+sen g en 1
+sen grant 1
+sen grant rq 1
+sen host 1
+sen improv 1
+sen in log 1
+sen inform 1
+sen init1 1
+sen init1 me 1
+sen init2 1
+sen int asynchron 1
+sen integr 1
+sen inver 1
+sen is disc 1
+sen it del 1
+sen it div 1
+sen it finish 1
+sen it rel 1
+sen it report 1
+sen jt 1
+sen le 1
+sen link 2
+sen link cost 1
+sen link upd 1
+sen m2 1
+sen mail 1
+sen mb 1
+sen mb acq1 1
+sen mc 1
+sen mc actorc 1
+sen md 1
+sen md actord 1
+sen me 8
+sen me act 1
+sen mor commun 1
+sen mor neg 1
+sen mor posit 1
+sen multicast 1
+sen multicast se 1
+sen next instruc 1
+sen no request 1
+sen nod 1
+sen notif 1
+sen nous 1
+sen nous entendon 1
+sen of boudol 1
+sen of compl 1
+sen of donald 1
+sen of minim 1
+sen of sect 1
+sen of styl 1
+sen of un 1
+sen om 1
+sen om failur 1
+sen om protocol 1
+sen on se 1
+sen oper 1
+sen or receiv 2
+sen our model 1
+sen pack 1
+sen parameter 1
+sen pattern 1
+sen period 1
+sen period arp 1
+sen pr 1
+sen pr eoccup 1
+sen prepar 1
+sen prepar cost 1
+sen prim 1
+sen prim akin 1
+sen primitiv 1
+sen proc 2
+sen qu 1
+sen qu dan 1
+sen qu pour 1
+sen qu si 1
+sen quun 1
+sen quun unit 1
+sen r request 1
+sen rec 1
+sen remember 1
+sen request 1
+sen respon 1
+sen robot 1
+sen robot system 1
+sen se 1
+sen se me 1
+sen simil 1
+sen spec request 1
+sen technolog 1
+sen term 1
+sen th actu 1
+sen th buffer 1
+sen th common 1
+sen th contour 1
+sen th cur 1
+sen th dat 2
+sen th descript 1
+sen th header 1
+sen th inform 1
+sen th input 1
+sen th me 3
+sen th new 1
+sen th outg 1
+sen th part 1
+sen th possibil 1
+sen th pot 1
+sen th qu 2
+sen th respon 1
+sen th result 3
+sen th separ 1
+sen th smallest 1
+sen th transport 1
+sen th upd 1
+sen th var 1
+sen th vect 1
+sen that connect 1
+sen that se 1
+sen that us 1
+sen that user 1
+sen their cel 1
+sen then us 1
+sen to automat 1
+sen to compar 1
+sen to consider 1
+sen to design 2
+sen to ebd 1
+sen to elim 1
+sen to incr 1
+sen to introduc 1
+sen to lisp 1
+sen to mean 1
+sen to proc 1
+sen to ref 1
+sen to us 1
+sen transport 1
+sen transport pack 1
+sen trouv 1
+sen trouv simplif 1
+sen typographiqu 1
+sen upd 1
+sen upd request 1
+sen valu 1
+sen wer pr 1
+sen when plac 1
+sen window 1
+sen window flow 1
+sen xj 1
+sender 13
+sender act 1
+sender act definit 1
+sender and elimin 1
+sender and interpreter 1
+sender and receiver 3
+sender befor pa 1
+sender by reduc 1
+sender ca 1
+sender cannot sen 1
+sender continu 1
+sender continu subsequ 1
+sender eventu 1
+sender eventu reach 1
+sender from receiv 1
+sender init 1
+sender init protocol 1
+sender is awar 1
+sender is high 1
+sender maintain 1
+sender may se 1
+sender multicast 1
+sender multicast me 1
+sender multicast pack 1
+sender nod 1
+sender nod proc 1
+sender or receiver 1
+sender proc 2
+sender proc tim 1
+sender re multicast 1
+sender receiv 1
+sender self 1
+sender sen 1
+sender throughput 1
+sender to proceed 1
+sender to rec 1
+sender to reflect 1
+sender to succ 1
+sender transm 1
+sender using 1
+sender wait 1
+sendmor 1
+sendwith 1
+sendwithad32 1
+sengager 1
+senior 1
+senior and im 1
+senior en 1
+senior inser 1
+senior inser rol 1
+senior is requir 1
+senior manager 1
+senior most rol 1
+senior oper 1
+senior relationship 1
+senior relationship introduc 1
+senior rol 1
+senior rol exerc 1
+senior rol privileg 1
+senior se 1
+sensibil 1
+sensibil ee 1
+sensibilit 2
+sensibilit e de 1
+sensibl 2
+sensibl a la 1
+sensibl au 1
+sensibl au grain 1
+sensibl au part 1
+sensibl diff 1
+sensibl diff erent 1
+sensibl du 1
+sensibl du processeur 1
+sensibl et quun 1
+sensibl le 1
+sensibl moin 1
+sensibl moin perform 1
+sensibl sur 1
+sensibl sur ce 1
+sensit 22
+sensit calcl 1
+sensit featur 1
+sensit help 1
+sensit is ba 1
+sensit list 1
+sensit list delayboolean 1
+sensit list stat 1
+sensit measur 1
+sensit of geometer 1
+sensit of input 1
+sensit of retrief 1
+sensit pl 1
+sensit show 1
+sensit show tel 1
+sensit singl 1
+sensit singl neur 1
+sensit threshold 1
+sensit to character 1
+sensit to commun 1
+sensit to group 1
+sensit to il 1
+sensit to no 3
+sensit to receiver 1
+sensit to respon 1
+sensit to user 1
+sent 38
+sent a connect 1
+sent a finish 1
+sent a me 2
+sent a request 1
+sent a test 1
+sent aff 1
+sent after t1 1
+sent after tim 1
+sent after tm 1
+sent and dec 1
+sent and receiv 1
+sent and reorder 1
+sent answer 1
+sent as describ 1
+sent asynchron 1
+sent at tim 1
+sent be tr 1
+sent begin 1
+sent by p1 1
+sent by proc 1
+sent by rl 1
+sent by server 1
+sent ce 1
+sent ce motif 1
+sent coh 1
+sent coh fail 1
+sent complec 1
+sent de 1
+sent de ce 1
+sent de fx 1
+sent degener 1
+sent discr 1
+sent discr te 1
+sent e en 1
+sent e par 1
+sent exact 1
+sent exact oe 1
+sent form 1
+sent from connect 1
+sent from neighbour 1
+sent from pi 1
+sent in length 1
+sent in oeab 1
+sent indirect 1
+sent introduc 1
+sent is determin 1
+sent is enqueu 1
+sent is expr 1
+sent is tag 1
+sent it finish 1
+sent it me 1
+sent la 1
+sent la multipl 1
+sent length 1
+sent or receiv 1
+sent param 1
+sent param triqu 1
+sent per level 1
+sent receiv 1
+sent receiv se 1
+sent repr 1
+sent respon 1
+sent structur 1
+sent ten 1
+sent text 1
+sent th cowb 1
+sent th finish 1
+sent th mesh 1
+sent th report 1
+sent to act 1
+sent to inform 1
+sent to kcm 1
+sent to nod 1
+sent to p1 1
+sent to p2 1
+sent to proc 2
+sent to random 1
+sent to upd 1
+sent tout 1
+sent un 1
+sent whil ge 1
+senter 2
+senter de 1
+senter de singularit 1
+senter du 1
+senter du mat 1
+senter et estimer 1
+senter un produit 1
+sentir 1
+senyk 1
+senyk et al 1
+sep 7
+sep al inclus 1
+sep an ext 1
+sep and kcm 1
+sep et kcm 1
+sep hochreiter 1
+sep implem 1
+sep is concern 1
+sep kcm 1
+sep kcm sep 1
+sep run 1
+sep runtim 1
+sep runtim layer 1
+sep se 1
+sep se born 1
+sep team 1
+sep wh 1
+separ 65
+separ a singl 1
+separ acc 1
+separ acc path 1
+separ accept 1
+separ accept parser 1
+separ achief 1
+separ act 1
+separ addr 1
+separ al bound 1
+separ allow 1
+separ allow procedur 1
+separ altern 1
+separ an 1
+separ and cliqu 1
+separ and length 1
+separ and link 1
+separ and oe 1
+separ any pair 1
+separ appl 2
+separ approach 1
+separ ar high 1
+separ ar label 1
+separ ar refin 1
+separ atom 1
+separ atom attribut 1
+separ attribut 1
+separ ba 1
+separ ba tr 1
+separ ba wavel 1
+separ between ge 1
+separ block 1
+separ board 1
+separ branch 1
+separ by bar 2
+separ by calcl 1
+separ by condit 1
+separ by doubl 1
+separ by rectangl 1
+separ by refin 1
+separ by stbar 1
+separ ca 1
+separ chang 1
+separ cod 1
+separ cod schem 1
+separ column 1
+separ column becom 1
+separ column rec 1
+separ column result 1
+separ comp 1
+separ comp transact 1
+separ compon 1
+separ con 1
+separ concept 1
+separ contain 2
+separ coord 1
+separ correct 1
+separ criter 1
+separ defin 1
+separ definit 1
+separ dep 1
+separ develop 1
+separ develop compon 1
+separ diagon 1
+separ disk 1
+separ edg 1
+separ entr 1
+separ fif 1
+separ fif queu 1
+separ fil 1
+separ flit 1
+separ flit wid 1
+separ for refin 1
+separ for thousand 1
+separ for unsatisf 1
+separ fragm 1
+separ from actu 1
+separ from mic 1
+separ graph 1
+separ graph walk 1
+separ hav fewer 1
+separ hilber 1
+separ hilber spac 1
+separ hold 1
+separ hold exact 1
+separ id 1
+separ in developm 1
+separ in eulisp 1
+separ in subsect 1
+separ init 1
+separ init contain 1
+separ inst 1
+separ int disjoint 1
+separ is proport 1
+separ is refin 1
+separ issu 1
+separ item 1
+separ iter 1
+separ larger 1
+separ list 2
+separ loc 1
+separ margin 1
+separ margin exact 1
+separ me 1
+separ me support 1
+separ mean 1
+separ measur 2
+separ mor eff 1
+separ network 2
+separ network fil 1
+separ nod 1
+separ nod ge 1
+separ non 1
+separ non parameter 1
+separ object 1
+separ of concern 1
+separ of dut 1
+separ of maxim 1
+separ of requir 1
+separ of siz 1
+separ of st 1
+separ of typ 1
+separ of weight 2
+separ oid 1
+separ oid typ 1
+separ on cluster 1
+separ pack 1
+separ path 1
+separ phy 1
+separ phy dev 1
+separ pot 1
+separ pot chang 1
+separ preproc 1
+separ preproc further 1
+separ prior 1
+separ prior queu 1
+separ proc 3
+separ procedur 2
+separ procedur cal 1
+separ prov 1
+separ quest 1
+separ queu 1
+separ reduc 1
+separ rel 1
+separ result 2
+separ result hold 1
+separ room 1
+separ s assoc 1
+separ se 1
+separ secon 1
+separ secon st 1
+separ sect 1
+separ separ 1
+separ signif 1
+separ sit 1
+separ siz 1
+separ som sit 1
+separ specif 2
+separ specif stat 1
+separ ssm 1
+separ st 1
+separ st rel 1
+separ stack 1
+separ subgraph 1
+separ switch 1
+separ tabl 1
+separ technolog 1
+separ technolog dim 1
+separ text 1
+separ th cod 1
+separ th compon 1
+separ th funct 1
+separ th hclp 1
+separ th header 1
+separ th individu 1
+separ th interfac 1
+separ th multipl 1
+separ th part 1
+separ th pattern 1
+separ th problem 1
+separ th rot 1
+separ th sit 1
+separ th specif 1
+separ th top 1
+separ that bisect 1
+separ theorem 1
+separ through stbar 1
+separ tool 2
+separ tupl 1
+separ tw fac 1
+separ typ 1
+separ unit 1
+separ upd 1
+separ upd belong 1
+separ using 1
+separ usu ten 1
+separ wh remov 1
+separ wil partit 1
+separ window 1
+separ work 1
+sept 13
+september 37
+septembr 2
+seq 6
+seq by virtu 1
+seq construc 1
+seq correspon 1
+seq cst 1
+seq de 1
+seq de etiqu 1
+seq dp 1
+seq is termin 1
+seq item 1
+seq le 1
+seq le c1 1
+seq no tabl 1
+seq p pd 1
+seq p sp 1
+seq pd 1
+seq seq 1
+seq seq seq 1
+seq sh 1
+seq sh cp 1
+seq sp 1
+seq sp rl 1
+seq sp vl 1
+seq stc 1
+seq var 1
+sequ 98
+sequ a a1 1
+sequ a rever 1
+sequ a shift 1
+sequ acc 1
+sequ algorithm 7
+sequ algorithm depict 1
+sequ algorithm develop 1
+sequ algorithm giv 1
+sequ algorithm pr 1
+sequ alignm 1
+sequ an 1
+sequ an primer 1
+sequ and assemb 1
+sequ and block 1
+sequ and distribut 1
+sequ and le 1
+sequ and occur 1
+sequ and parallel 2
+sequ and schedl 1
+sequ ar gener 1
+sequ ar merg 1
+sequ ar requir 1
+sequ artifact 1
+sequ b rever 1
+sequ becaus parallel 1
+sequ befor construc 1
+sequ behavior 1
+sequ benchmark 1
+sequ best rst 1
+sequ branch 1
+sequ by concat 1
+sequ by hand 1
+sequ c0 1
+sequ calculus 1
+sequ circuit 1
+sequ circuit shel93 1
+sequ cluster 1
+sequ cod 1
+sequ cod preserv 1
+sequ comparison 2
+sequ comparison algorithm 1
+sequ compon 1
+sequ composit 2
+sequ compreh 1
+sequ computer 1
+sequ computer system 1
+sequ con 2
+sequ con allow 1
+sequ con mechan 1
+sequ con model 1
+sequ con using 1
+sequ construc 1
+sequ control 2
+sequ control flow 1
+sequ control purp 1
+sequ correspon 1
+sequ could contribut 1
+sequ counterpart 1
+sequ deliv 1
+sequ determin 1
+sequ determin simil 1
+sequ determiner 1
+sequ determiner adjectivenoun 1
+sequ do ec 1
+sequ dot 1
+sequ dot matr 1
+sequ each bi 1
+sequ evalu 1
+sequ evalu order 1
+sequ execut 4
+sequ execut mod 1
+sequ execut tim 1
+sequ f1 1
+sequ for handl 1
+sequ form 1
+sequ fqig 1
+sequ from t0 1
+sequ g0 1
+sequ h0 1
+sequ h2 1
+sequ har 1
+sequ i exact 1
+sequ in figur 1
+sequ in term 1
+sequ infer 1
+sequ infer mach 1
+sequ init 1
+sequ init algorithm 1
+sequ instruc 1
+sequ instruc count 1
+sequ interact 1
+sequ is expon 1
+sequ j condit 1
+sequ l1 2
+sequ langu 1
+sequ log 1
+sequ log program 1
+sequ loop 1
+sequ mach 6
+sequ mach model 1
+sequ mach structur 1
+sequ method 1
+sequ n1 1
+sequ need prun 1
+sequ num 1
+sequ number 4
+sequ object 1
+sequ object orient 1
+sequ oe2b 1
+sequ of 0s 1
+sequ of act 4
+sequ of addit 1
+sequ of altern 1
+sequ of amin 1
+sequ of argum 1
+sequ of assignm 1
+sequ of atom 1
+sequ of block 1
+sequ of categor 1
+sequ of cit 1
+sequ of commun 1
+sequ of compil 1
+sequ of cover 1
+sequ of decl 1
+sequ of defin 1
+sequ of definit 1
+sequ of deliver 1
+sequ of direct 1
+sequ of displac 1
+sequ of edg 3
+sequ of el 2
+sequ of event 2
+sequ of expr 1
+sequ of fac 1
+sequ of fibonacc 1
+sequ of form 1
+sequ of fragm 1
+sequ of funct 1
+sequ of hyperedg 1
+sequ of improv 1
+sequ of input 1
+sequ of inst 1
+sequ of instruc 2
+sequ of integer 2
+sequ of interconnect 1
+sequ of interv 1
+sequ of joint 1
+sequ of key 1
+sequ of keyword 1
+sequ of larger 1
+sequ of leg 1
+sequ of length 1
+sequ of lin 1
+sequ of loc 1
+sequ of lock 1
+sequ of maxim 1
+sequ of me 2
+sequ of modif 1
+sequ of modl 1
+sequ of mon 1
+sequ of mov 1
+sequ of mult 1
+sequ of nod 1
+sequ of nonneg 1
+sequ of number 1
+sequ of oe1 1
+sequ of oper 3
+sequ of opt 1
+sequ of pack 1
+sequ of part 1
+sequ of ph 1
+sequ of pointer 1
+sequ of polynom 1
+sequ of posit 2
+sequ of prob 1
+sequ of protect 1
+sequ of r0s 1
+sequ of r1 1
+sequ of reduc 2
+sequ of relationship 1
+sequ of rl 2
+sequ of robust 1
+sequ of selfimprov 1
+sequ of shift 1
+sequ of simpl 1
+sequ of siz 1
+sequ of slav 1
+sequ of smaller 1
+sequ of st 2
+sequ of stat 1
+sequ of step 1
+sequ of strateg 1
+sequ of symbol 2
+sequ of symmeter 1
+sequ of system 1
+sequ of test 1
+sequ of til 1
+sequ of tim 2
+sequ of timestamp 1
+sequ of tok 1
+sequ of typ 1
+sequ of us 1
+sequ of valu 1
+sequ of var 1
+sequ of zer 1
+sequ or concur 1
+sequ or proxim 1
+sequ part 1
+sequ part evalu 1
+sequ prior 1
+sequ prior queu 1
+sequ problem 3
+sequ proc 2
+sequ program 6
+sequ program langu 1
+sequ program reus 1
+sequ prolog 1
+sequ prolog implem 1
+sequ protein 1
+sequ quicksortlik 1
+sequ quicksortlik med 1
+sequ r1 1
+sequ r3 1
+sequ r4 1
+sequ receiv 1
+sequ reg 1
+sequ run 1
+sequ runtim 1
+sequ s assoc 1
+sequ s fs1 1
+sequ s neg 1
+sequ s rever 1
+sequ s1 1
+sequ s1 s7 1
+sequ scan 1
+sequ se 1
+sequ sect 1
+sequ sen 1
+sequ serv 1
+sequ siz 1
+sequ siz k0 1
+sequ sort 1
+sequ sort algorithm 1
+sequ sort integer 1
+sequ start 1
+sequ stat 1
+sequ symeter 1
+sequ symeter cr 1
+sequ system 1
+sequ t ap 1
+sequ t0 1
+sequ th spot 1
+sequ that con 1
+sequ that evalu 1
+sequ that form 1
+sequ that tak 1
+sequ thread 1
+sequ tim 1
+sequ tim complec 1
+sequ to turn 1
+sequ tok 1
+sequ trac 1
+sequ traver 1
+sequ using 1
+sequ v1 1
+sequ ver 1
+sequ vi 1
+sequ which contain 1
+sequ which lead 1
+sequ with rel 1
+sequ with respect 1
+sequ with zer 1
+sequ writ 1
+sequ x block 1
+sequ xi 1
+sequ y interleav 1
+sequ yield 1
+sequ yield unpredict 1
+sequel 3
+sequel we refer 1
+sequencer 1
+sequentializ 1
+sequentializ th execut 1
+sequin 1
+ser 66
+ser a nouveau 1
+ser about expan 1
+ser acc 1
+ser acc ed 1
+ser ain 1
+ser ain de 1
+ser algorithm 1
+ser alor 1
+ser alor bien 1
+ser alor de 1
+ser alor ex 1
+ser an 1
+ser and parallel 1
+ser and recover 1
+ser and unfortun 1
+ser appl 1
+ser approxim 1
+ser approxim string 1
+ser assignm 1
+ser assignm introduc 1
+ser automatiqu 1
+ser automatiqu pour 1
+ser beaucoup 1
+ser befor mak 1
+ser ch 1
+ser ch com 1
+ser competit 1
+ser complec 1
+ser con 1
+ser conjunct 1
+ser conserv 1
+ser conserv ee 1
+ser cr 1
+ser d epil 1
+ser d etermin 1
+ser de 2
+ser de la 1
+ser de tail 1
+ser def 1
+ser degrad 1
+ser destampil 1
+ser destampil evit 1
+ser difficil 1
+ser difficil dignorer 1
+ser difficult 1
+ser digit 1
+ser digit mach 1
+ser disadv 1
+ser disjunct 1
+ser distribu 1
+ser dit 1
+ser dit elag 1
+ser donc 1
+ser donc encor 1
+ser error 1
+ser etud 1
+ser etud ee 1
+ser expan 1
+ser grand 1
+ser grand facilit 1
+ser illustr 1
+ser illustr ee 1
+ser impl 1
+ser implem 1
+ser in appl 1
+ser in computer 4
+ser in discr 2
+ser in inform 1
+ser in prob 1
+ser inclus 1
+ser is publ 1
+ser is shown 1
+ser l equilibr 1
+ser la 2
+ser la con 1
+ser la fin 1
+ser le 2
+ser le programmeur 1
+ser le sel 1
+ser lim 2
+ser lim disc 1
+ser lo 1
+ser mach 1
+ser model 1
+ser mult 1
+ser mult level 1
+ser nh2 1
+ser non 1
+ser non nl 1
+ser number 1
+ser of abstract 1
+ser of algorithm 1
+ser of approxim 1
+ser of benchmark 1
+ser of definit 1
+ser of dynam 1
+ser of edg 1
+ser of empir 1
+ser of exampl 1
+ser of experim 1
+ser of indep 1
+ser of inst 1
+ser of intern 1
+ser of lem 1
+ser of loc 2
+ser of loop 1
+ser of model 1
+ser of modif 1
+ser of nest 1
+ser of ocean 1
+ser of parallel 1
+ser of pattern 1
+ser of pi 1
+ser of pilot 1
+ser of prim 1
+ser of program 1
+ser of prov 1
+ser of register 1
+ser of resolut 1
+ser of schedl 1
+ser of shuffl 1
+ser of siml 1
+ser of simpler 1
+ser of subsequ 1
+ser of succ 2
+ser of tim 1
+ser of transform 1
+ser of work 1
+ser order 2
+ser pa 1
+ser parallel 1
+ser parallel po 1
+ser plac 1
+ser pr 1
+ser pr com 1
+ser predict 1
+ser predict problem 1
+ser principl 1
+ser problem 2
+ser produit 1
+ser produit par 1
+ser r ecup 1
+ser rang 1
+ser rang ee 1
+ser report 1
+ser repr 1
+ser repr esent 1
+ser restaur 1
+ser restrict 1
+ser retenu 1
+ser retenu com 1
+ser st 1
+ser st par 1
+ser standard 1
+ser standard ga 1
+ser tak 1
+ser theor 1
+ser to compl 1
+ser toujour 1
+ser toujour ain 1
+ser toujour le 1
+ser toujour un 1
+ser tr 2
+ser tr es 2
+ser trait 1
+ser trait ee 1
+ser trop 1
+ser trop grand 1
+ser us 1
+ser us cut 1
+ser us mutu 1
+ser util 1
+ser util dan 1
+ser util ee 1
+ser workst 1
+ser.ps 1
+serait 3
+serait a jour 1
+serait alor 1
+serait alor pa 1
+serait ce 1
+serait ce quapproximativ 1
+serait conflictuel 1
+serait conflictuel si 1
+serait de 1
+serait donc 1
+serait donc indisp 1
+serait donc vain 1
+serait du 1
+serait du typ 1
+serait encor 1
+serait fait 1
+serait fait par 1
+serait fat 1
+serait fat pour 1
+serait gal 1
+serait gal int 1
+serait im 1
+serait im ediat 1
+serait int 1
+serait int er 1
+serait le 1
+serait le nombr 1
+serait le prem 1
+serait pa 2
+serait pa conflictuel 1
+serait pa interrompu 1
+serait pa judicieux 1
+serait pa notr 1
+serait perdu 1
+serait plut 2
+serait plut ot 1
+serait po dutiliser 1
+serait probabl 1
+serait probabl extr 1
+serait rest 1
+serait rest ee 1
+serait retourn 1
+serait retourn ee 1
+serait sauvegard 1
+serait toutef 1
+serait toutef tr 1
+serait trop 1
+serait trouv 1
+serait un tenseur 1
+serc 1
+serc under grant 1
+sergej 1
+sergej celikovsk 1
+sergot 1
+seriesparallel 1
+seriesparallel po 1
+seriesparallel po antimatr 1
+seriousp 1
+serivc 1
+serivc addr 1
+serivc addr non 1
+sern 1
+sernad 1
+sernad and hartman 1
+seron 1
+seron ain 1
+seron ain en 1
+seron en 1
+seron en mesur 1
+seront 3
+seront abord 1
+seront abord ee 1
+seront alor 2
+seront alor mieux 1
+seront alor util 1
+seront aus 1
+seront aus util 1
+seront bien 1
+seront bien cop 1
+seront cr 1
+seront cr avec 1
+seront d evelop 1
+seront de 1
+seront de pol 1
+seront disper 1
+seront disper es 1
+seront donc 1
+seront donc implicit 1
+seront donc pa 1
+seront effectu 1
+seront effectu ee 1
+seront equilibr 1
+seront equilibr ee 1
+seront ex 1
+seront ex ecut 1
+seront illustr 1
+seront illustr ee 1
+seront ind 1
+seront ind epen 1
+seront lim 1
+seront lim ee 1
+seront petit 1
+seront prospect 1
+seront prospect ee 1
+seront simpl 1
+seront simpl le 1
+seront simpl puisquil 1
+seront susceptibl 1
+seront susceptibl de 1
+seront util 1
+serp 1
+serrur 1
+serv 48
+serv a giv 1
+serv a illustrer 1
+serv a list 1
+serv a recop 1
+serv a se 1
+serv a stocker 1
+serv addr 1
+serv addr non 1
+serv addr remain 1
+serv addr unavail 1
+serv an ip 1
+serv and arbitr 1
+serv and featur 1
+serv and scal 1
+serv and us 1
+serv ar conv 1
+serv ar gener 1
+serv ar migr 1
+serv ar restrict 1
+serv architectur 1
+serv as benchmark 1
+serv as conduit 1
+serv as interconnect 1
+serv as run 1
+serv as stiml 1
+serv assoc 1
+serv at rat 1
+serv at tim 1
+serv aux 1
+serv aux exp 1
+serv avail 1
+serv ba 2
+serv becom 1
+serv becom unavail 1
+serv behav 1
+serv being monit 1
+serv by exact 1
+serv by lmac 1
+serv by using 1
+serv cal 1
+serv can compl 1
+serv can occur 1
+serv ch 1
+serv cl 1
+serv compar 1
+serv compl 1
+serv concur 1
+serv connect 1
+serv connect proport 1
+serv de 1
+serv de journ 1
+serv discipl 1
+serv disrupt 1
+serv doutil 1
+serv doutil de 1
+serv downtim 1
+serv each backlog 1
+serv earl 1
+serv equ 1
+serv fail 1
+serv for giv 1
+serv for log 1
+serv from connect 1
+serv from se 1
+serv further 1
+serv g en 1
+serv gener 1
+serv group 1
+serv group prov 1
+serv impl 1
+serv implem 1
+serv in adapt 1
+serv in incr 1
+serv in prp 1
+serv interfac 1
+serv interfac failur 1
+serv is bound 1
+serv is inclus 1
+serv is non 1
+serv is repl 1
+serv it fail 1
+serv it lost 1
+serv it mi 1
+serv it prov 1
+serv it receiv 1
+serv leav 1
+serv level 2
+serv level agr 1
+serv level log 1
+serv level manag 1
+serv me 1
+serv mechan 1
+serv mi 1
+serv monit 1
+serv monit algorithm 1
+serv monit framework 1
+serv monit monit 1
+serv most relev 1
+serv no us 1
+serv nod 1
+serv oe 1
+serv oe bit 1
+serv of connect 1
+serv offer 2
+serv onl connect 1
+serv order 1
+serv out 1
+serv par 1
+serv par le 1
+serv part 1
+serv peer 1
+serv peer group 1
+serv perform 1
+serv prev 1
+serv proport 1
+serv provider 1
+serv queu 1
+serv queu acc 1
+serv rat 2
+serv rat offer 1
+serv rat var 1
+serv receiv 1
+serv remain 1
+serv remain avail 1
+serv requir 2
+serv requir loc 1
+serv respon 1
+serv respon tim 1
+serv rout 1
+serv seen 1
+serv sever purp 1
+serv should cater 1
+serv should en 1
+serv sid 1
+serv simultan 1
+serv st 1
+serv start 1
+serv subscriber 1
+serv subscriber upd 1
+serv tempor 1
+serv th addit 1
+serv th backlog 1
+serv th mi 2
+serv th rec 1
+serv th remot 1
+serv th standard 1
+serv th visu 1
+serv that connect 1
+serv that impl 1
+serv that se 1
+serv thread 1
+serv tim 4
+serv to construc 1
+serv to elect 1
+serv to elim 1
+serv to enh 1
+serv to find 1
+serv to gener 1
+serv to introduc 1
+serv to maxim 1
+serv to se 1
+serv to writ 1
+serv until tim 1
+serv using 2
+serv which allow 1
+serv wi 1
+serv with exact 1
+serv with rat 1
+serv would allow 1
+serv writ 1
+servan 1
+servan schreiber 1
+server 21
+server 1server 1
+server 1server 2server 1
+server a pack 1
+server accord 1
+server activ 1
+server addr 1
+server addr spac 1
+server agent 1
+server agent support 1
+server agenthardwareemulatorsystem 1
+server agenthardwareemulatorsystem developmentand 1
+server alloc 1
+server allow 1
+server and an 1
+server and cc 1
+server and client 1
+server and commun 1
+server and disc 1
+server and estim 1
+server and fetch 1
+server and le 1
+server and link 1
+server and qu 1
+server and therefor 1
+server and viewer 1
+server anyw 1
+server ar bound 1
+server ar crash 1
+server ar defin 1
+server ar interconnect 1
+server ar nec 1
+server ar non 1
+server ar oper 1
+server ar requir 1
+server ar work 1
+server architectur 2
+server architectur using 1
+server as compar 1
+server at tim 1
+server avail 3
+server ba 3
+server ba an 1
+server ba architectur 1
+server becaus multipl 1
+server becom 1
+server befor pack 1
+server belong 1
+server buffer 1
+server buffer client 1
+server bus 1
+server bus period 1
+server can distingu 1
+server can sen 1
+server cap 1
+server client 1
+server client split 1
+server clock 1
+server commun 1
+server concept 1
+server configur 1
+server control 1
+server control server 1
+server could imperson 1
+server cr 1
+server crash 2
+server crash link 1
+server detect 1
+server ec 1
+server ensur 1
+server environm 1
+server event 1
+server event e1 1
+server except sa 1
+server fail 1
+server failur 1
+server fetch 2
+server for connect 1
+server for finit 1
+server from se 1
+server ha offer 1
+server hav crash 1
+server host 1
+server host path 1
+server ident 1
+server ident dest 1
+server identif 1
+server in exc 1
+server in oe 1
+server in oe2 1
+server inform 1
+server inform system 1
+server initializ 1
+server is bus 1
+server is equiv 1
+server is fair 1
+server is giv 1
+server is idl 1
+server is ignor 1
+server is nec 1
+server is siml 1
+server is wf 1
+server is work 1
+server is wp 1
+server it arriv 1
+server known 1
+server lat 1
+server lat fair 1
+server lik gp 1
+server livelock 1
+server mach 1
+server manag 1
+server may crash 1
+server may exhibit 1
+server may fail 1
+server may lag 1
+server may mak 1
+server may pa 1
+server may remain 1
+server me 1
+server me tak 1
+server model 1
+server nam 1
+server need dep 1
+server never lag 1
+server occur 1
+server of ip 1
+server on sit 1
+server or link 1
+server or simp 1
+server out 1
+server p1 1
+server p2 1
+server p2 connect 1
+server p2 upd 1
+server pack 1
+server parad 1
+server part 1
+server pe 1
+server pe lim 1
+server period 1
+server period sen 1
+server pi 1
+server pi fail 1
+server pointer 1
+server prim 1
+server proc 1
+server protocol 1
+server prov 2
+server prov opt 1
+server push 1
+server push techniqu4 1
+server receiv 2
+server reduc 1
+server request 1
+server requir 1
+server respon 1
+server s becom 1
+server s belong 1
+server s0 1
+server sa 1
+server sa crash 1
+server satisf 1
+server serv 1
+server should particip 1
+server sid 1
+server sid approach 1
+server sid comput 1
+server sid pattern 1
+server sid program 1
+server simultan 1
+server softwar 2
+server spen 1
+server st 1
+server st spac 1
+server structur 1
+server subsequ 1
+server subsequ crash 1
+server system 1
+server tak 1
+server that becom 1
+server that fail 1
+server that ge 1
+server that receiv 1
+server that requir 1
+server that sent 1
+server that tak 1
+server that transm 1
+server thread 1
+server thread spen 1
+server to activ 1
+server to catch 1
+server to comput 1
+server to execut 1
+server to find 1
+server to finish 1
+server to illustr 1
+server to loc 1
+server to minim 1
+server to proc 1
+server until tim 1
+server using 2
+server wh 1
+server which impl 1
+server which prov 1
+server wil contain 1
+server wil occur 1
+server with zer 1
+server2 1
+serverm 1
+serverm pa 1
+serverm pa server 1
+servernet 1
+servernet ba 1
+servernet ba fault 1
+serverserver 1
+serverserver 1server 1
+serverserver 1server 2server 1
+serverssystem 1
+serverssystem generationtoolshardwar 1
+serverssystem generationtoolshardwar managerkernel 1
+servicemonit 1
+servicemonit cl 1
+servicemonit determin 1
+servicemonit determin liv 1
+servicemonit is run 1
+servicemonit object 1
+servir 1
+servir damer 1
+servir damer pour 1
+serviront 1
+serviront de 1
+serviront de ba 1
+serviront de point 1
+sesam 1
+sest 3
+sest av 1
+sest av er 1
+sest ecoul 1
+sest ecoul ee 1
+sest effectu 1
+sest effectu ee 1
+sest port 1
+sest princip 1
+sest princip int 1
+sest r ev 1
+sest retrouv 1
+sestoft 2
+sestomp 1
+sestomp lorsqu 1
+sestomp lorsqu le 1
+setarg 1
+setat 1
+setat a tim 1
+setcar 1
+setcar e1 1
+setcar e1 e2 1
+setcdr 1
+setcdr e1 1
+setcdr e1 e2 1
+seth 3
+seth and a.k 1
+setof 1
+setq 1
+setq identif 1
+setq identif form 1
+setq spec form 1
+setter 1
+setter ar appl 1
+setter car 1
+setter converter 1
+setter environm 1
+setter environm condit 1
+setter execut 1
+setter execut condit 1
+setter funct 1
+setter funct nam 1
+setter identif 1
+setter mechan 1
+setter no setter 1
+setter prim 1
+setter prim cl 1
+setter prim ref 1
+setter return 1
+setter setter 1
+setter upd 1
+setter upd funct 1
+settl 5
+settl and relac 1
+settl by cit 1
+settl for occ 1
+setup 7
+setup con 1
+setup connect 1
+setup connect host 1
+setup to determin 1
+setup to evolut 1
+setup wich 1
+seuil 2
+seuil don 1
+seuil on pa 1
+seus 1
+seus usu 1
+seus usu ri 1
+sev 4
+sev ba 1
+sev ba program 1
+sev c program 1
+sev exper 1
+sev exper softwar 1
+sev neur 1
+sev neur network 1
+sev them 1
+sevcik 2
+seventeenth 3
+seventeenth annu 1
+seventeenth annu acm 1
+seventeenth intern 1
+seventh 7
+seventh acm 2
+seventh annu 2
+seventh annu acm 1
+seventh compon 1
+seventh intern 2
+sever 18
+sever and erik 1
+sever architectur 1
+sever architectur mismatch 1
+sever bottleneck 1
+sever condit 1
+sever contour 1
+sever contour effect 1
+sever degrad 1
+sever degrad perform 1
+sever failur 1
+sever for triangl 1
+sever lim 2
+sever perform 2
+sever perform penalt 2
+sever problem 2
+sever problem ar 1
+sever restrict 1
+sever unb 1
+sexpliqu 2
+sexpliqu de 1
+sexpliqu de la 1
+sexpliqu par 2
+sexpliqu par le 2
+sexpliquer 1
+sexpliquer soit 1
+sexprim 3
+sexprim com 1
+sexprim com suit 1
+sexprim com un 1
+sexprim en 1
+sexprim en fonct 1
+sexprim par 1
+sexprimer 1
+sexprimer en 1
+sexprimer en fonct 1
+sext 1
+sext qu 1
+sextupl 1
+seymour 1
+seznec 1
+seznec examinateur 1
+seznec qu 1
+seznec qu su 1
+sf 5
+sf ar respect 1
+sf stud 1
+sf tr 1
+sf1 1
+sf2 1
+sf2c 1
+sf2c dt 1
+sf2c dt im 1
+sfd 1
+sff91 1
+sft 1
+sg 9
+sg as nvt 1
+sg as vot 1
+sg challeng 2
+sg fb 1
+sg fbg 1
+sg is defin 1
+sg is st 1
+sg manuscript 1
+sg mg 1
+sg nvt 1
+sg of lin 1
+sgor 1
+sh 8
+sh 45k 1
+sh cp 1
+sh jan 1
+sh81 1
+sh93 1
+shaanan 1
+shachter 2
+shachter et al 1
+shackel 1
+shad 8
+shad 3d 1
+shad 3d imag 1
+shad ar 2
+shad ar collect 1
+shad field 1
+shad field ind 1
+shad of disabl 1
+shad perspect 1
+shad perspect view 1
+shad repr 1
+shad that preserv 1
+shad track 1
+shad track collect 1
+shad var 1
+shadbolt 2
+shadbolt and wiel 1
+shadbolt n.r 1
+shader 1
+shadow 6
+shadow and perspect 1
+shadow appear 1
+shadow displ 1
+shadow displ sol 1
+shadow dur checkpoint 1
+shadow map 1
+shadow might becom 1
+shadow or ad 1
+shadow part 1
+shadow part comp 1
+shadow prov 1
+shadow spac 1
+shadow th dynam 1
+shadow th inherit 1
+shadow th lec 1
+shadow wer label 1
+shafer 1
+shafer pearl 1
+shahram 1
+shahram ghandeharizadeh 1
+shak 1
+shak than digit 1
+shakespear 1
+shakespear and marlow 1
+shalit 1
+shallit 1
+shallow 3
+shallow alor 1
+shallow alor qu 1
+shallow and ch 1
+shallow arit 1
+shallow backtrack 1
+shallow cop 1
+shallow d etr 1
+shallow dun 1
+shallow dun claus 1
+shallow et fail 1
+shallow et un 1
+shallow fail 1
+shallow ou 1
+shallow ou fail 1
+shallow peut 1
+shallow peut etr 1
+shallow virtu 1
+shallow water 1
+shallow water equ 1
+shallow x unif 1
+shallow1 1
+sham 6
+sham triangl 1
+sham triangl algorithm 1
+shamk 1
+shan 3
+shang 1
+shang hu 1
+shang hu teng 1
+shank 1
+shankar 1
+shannon 2
+shannon decomposit 1
+shannon decomposit expan 1
+shantz 1
+shap 27
+shap addit 1
+shap an 1
+shap an identif 1
+shap and cl 1
+shap and connect 1
+shap and correspon 1
+shap and datab 1
+shap and mean 1
+shap and minim 1
+shap and pattern 1
+shap and sizing 1
+shap and textur 1
+shap appl 1
+shap ba 2
+shap by fact 1
+shap comput 1
+shap curv 1
+shap decomposit 1
+shap del 1
+shap distribut 1
+shap estim 1
+shap estim problem 1
+shap estim schem 1
+shap extract 1
+shap f xign 1
+shap featur 1
+shap graph 1
+shap hav mov 1
+shap in rm 1
+shap in vi 1
+shap inform 1
+shap is improv 1
+shap may remain 1
+shap model 1
+shap model ba 1
+shap object 2
+shap of fr 1
+shap of minim 1
+shap of tv2 1
+shap oper 1
+shap or bound 1
+shap or siz 1
+shap prec 1
+shap problem 1
+shap produc 1
+shap reconstruc 2
+shap repr 1
+shap respect 1
+shap should inclus 1
+shap simpl 1
+shap spac 1
+shap stud 1
+shap th flow 1
+shap var 1
+shap var techniqu 1
+shap wil lead 1
+shap would prompt 1
+shaper 1
+shaper for atm 1
+shapewar 1
+shapewar s vi 1
+shapir 5
+shapir and takeuch 1
+shar 60
+shar a common 5
+shar a point 1
+shar a se 1
+shar a trac 1
+shar a var 1
+shar aa 1
+shar aa shar 1
+shar aa sync 1
+shar ab 1
+shar acc 2
+shar acr cultur 1
+shar act 1
+shar addr 3
+shar addr spac 3
+shar among rol 1
+shar an edg 1
+shar and augm 1
+shar and commun 1
+shar and dat 1
+shar and distribut 1
+shar and integr 1
+shar and moreover 1
+shar and multiplec 1
+shar and parallel 1
+shar and priv 1
+shar and upd 1
+shar and writ 1
+shar any common 1
+shar approach 1
+shar between proc 1
+shar bind 1
+shar bind schem 1
+shar block 1
+shar block cl 1
+shar block object 1
+shar buffer 1
+shar by docum 1
+shar by ensur 1
+shar can effect 1
+shar centr 1
+shar centr buffer 1
+shar commun 1
+shar compon 1
+shar concur 1
+shar concur asynchron 1
+shar dat 14
+shar dat ar 1
+shar dat assoc 1
+shar dat ba 1
+shar dat bank 2
+shar dat object 1
+shar dat plac 1
+shar dat protect 1
+shar dat se 1
+shar dat structur 3
+shar datab 1
+shar datab chang 1
+shar decr 1
+shar decr hyperbol 1
+shar dev 1
+shar disk 2
+shar disk system 1
+shar draw 1
+shar draw docum 1
+shar el 1
+shar el result 1
+shar featur 1
+shar fonct 1
+shar fonct de 1
+shar for expr 1
+shar for multidimod 1
+shar funct 2
+shar half 1
+shar hypotenus 1
+shar hypotenus edg 1
+shar in parallel 1
+shar in structur 1
+shar incr 1
+shar inform 2
+shar interm 1
+shar interm memor 1
+shar is determin 1
+shar is int 1
+shar it key 1
+shar it loc 1
+shar list 1
+shar med 1
+shar med spac 1
+shar memor 17
+shar memor abstract 1
+shar memor acc 1
+shar memor addr 1
+shar memor architectur 3
+shar memor ba 2
+shar memor block 1
+shar memor computer 2
+shar memor hierarch 2
+shar memor libr 1
+shar memor loc 1
+shar memor mach 1
+shar memor multiproc 9
+shar memor parallel 2
+shar memor program 3
+shar memor requir 2
+shar memor spac 1
+shar memor styl 1
+shar memor system 5
+shar memor traff 1
+shar network 1
+shar network resourc 1
+shar no solut 1
+shar nod 1
+shar nod lower 1
+shar noth architectur 1
+shar noth mult 1
+shar object 2
+shar occur 1
+shar of bandwidth 1
+shar of dev 1
+shar of distribut 1
+shar of knowledg 1
+shar of subexpr 1
+shar or mirror 1
+shar or synchron 1
+shar pag 1
+shar pag status 1
+shar part 1
+shar pol 1
+shar pool 1
+shar privileg 1
+shar problem 1
+shar prov 1
+shar qu 1
+shar qu perm 1
+shar reg 1
+shar reg fr 1
+shar repr 1
+shar resourc 3
+shar segm 1
+shar serv 1
+shar serv subscriber 1
+shar slot 1
+shar som privileg 1
+shar st 1
+shar th ab 1
+shar th correspon 1
+shar th dat 1
+shar th funct 1
+shar th knowledg 1
+shar th link 2
+shar th log 1
+shar th memor 1
+shar th outg 1
+shar th output 1
+shar th server 1
+shar th vot 1
+shar that keyword 1
+shar their knowledg 1
+shar typ 1
+shar us 1
+shar us system 1
+shar using 1
+shar vanish 1
+shar var 3
+shar var lock 1
+shar var valu 1
+shar variabl 5
+shar virtu 4
+shar virtu memor 4
+shar word 1
+shar work 3
+shar work environm 1
+shar work spac 1
+shar workspac 2
+shar workspac facil 1
+shar workspac interact 1
+shar workspac problem 1
+shar workspac system 1
+sharedmemor 2
+sharedmemor multiproc 1
+sharedmemor system 1
+sharedworkspac 1
+sharedworkspac collabor 1
+sharedworkspac computer 1
+sharedworkspac computer support 1
+sharedworkspac problem 1
+sharedworkspac problem solut 1
+shareholder 1
+sharingrepl 1
+sharingrepl distribut 1
+sharp 5
+sharp and featur 1
+sharp cel 1
+sharp edg 1
+sharp edg regl 1
+sharp fac 1
+sharp featur 1
+sharp incr 1
+sharp nob 1
+sharp opt 1
+sharp sharp 1
+sharp sharp nob 1
+sharp sharp sharp 1
+sharp sharp yesc 1
+sharp te. 1
+sharp ver 1
+sharp ver regl 1
+sharp yesc 1
+shash 3
+shash and john 1
+shash group 1
+shash group paper 1
+shash shekhar 1
+shash shekhar sivakumar 1
+shashigroup 1
+shashigroup paper 1
+shashigroup paper ps 1
+shastr 1
+shavit 2
+shavlik 1
+shaw 2
+shawn 1
+shazeer 1
+shebanow 1
+sheffield 1
+sheffield hallam 1
+sheil 1
+sheil lind 1
+shekhar 1
+shekhar cs.umn.edu 1
+shekhar cs.umn.edu siv 1
+shekhar sivakumar 1
+shekhar sivakumar rav 1
+shekit 1
+shel 1
+shel antimatr 1
+shel sequ 1
+shel sequ form 1
+shel10b 1
+shel93 1
+shelah 1
+shelf 6
+shelf appl 1
+shelf computer 1
+shelf computer connect 1
+shelf ev week 1
+shelf lan 1
+shelf mach 1
+shelf mach connect 1
+shelf of book 1
+shelf produc 1
+shelf produc using 1
+shelf uniproc 1
+shen 4
+shen shafer 1
+sheng 1
+sheng yu 1
+shenker 1
+shepard 1
+shepard pi 1
+shepherd 1
+sherlund 1
+sherman 2
+sheth 1
+sheu 1
+shib 2
+shift 22
+shift and ad 1
+shift ap 1
+shift dat 1
+shift differ sequ 1
+shift equiv 1
+shift from aud 1
+shift invar 1
+shift invar dwt 1
+shift it induc 1
+shift nod 1
+shift of bi 1
+shift of incom 1
+shift of induc 1
+shift of operand 1
+shift oper 2
+shift out 1
+shift reduc 1
+shift reduc conflict 1
+shift reduc report 1
+shift rever 1
+shift rever sequ 1
+shift sign 1
+shift step 1
+shift suff 1
+shift th dat 1
+shift th privileg 1
+shift th requir 1
+shift th sequ 1
+shift to ind 1
+shift to larger 1
+shift to switch 1
+shift ver 1
+shift would prev 1
+shigeru 1
+shigeru chib 1
+shih 2
+shih fu 1
+shih fu chang 1
+shikan 1
+shimanouch 1
+shimon 1
+shin 1
+shin dr 1
+shin dr surfac 1
+shin surfac 1
+ship 4
+ship recv 1
+ship recv cost 1
+ship sen 1
+ship sen cost 1
+ship th qualif 1
+ship th result 1
+ship121 1
+shmem 1
+shmem ge 1
+shmem put 1
+shmuel 1
+shoot 1
+shop 2
+shop problem 1
+shop schedl 2
+shop schedl theor 1
+short 13
+short after 1
+short of breath 1
+short th tot 1
+short ver 1
+shortcom 9
+shortcom led 1
+shortcut 1
+shortcut trad 1
+shortcut trad faster 1
+shorter 16
+shorter an enabl 1
+shorter as evid 1
+shorter cycl 1
+shorter cycl length 1
+shorter deriv 1
+shorter e0 1
+shorter fundam 1
+shorter fundam cycl 1
+shorter hist 1
+shorter match 1
+shorter me 2
+shorter multipl 1
+shorter multipl appropr 1
+shorter on 1
+shorter path 1
+shorter sequ 1
+shorter tim 1
+shorter tr 1
+shorter way 1
+shorter weakl 1
+shortest 11
+shortest algorithm 1
+shortest algorithm comput 1
+shortest arboresc 1
+shortest claus 1
+shortest claus length 1
+shortest cycl 1
+shortest cycl ba 1
+shortest fundam 1
+shortest fundam cycl 1
+shortest multipl 1
+shortest path 4
+shortest path algorithm 2
+shortest path problem 1
+shortest path tr 1
+shortest prim 1
+shortest prim impl 1
+shortest queu 1
+shortest span 1
+shortest span tr 1
+shortest tot 1
+shortest tot path 1
+shortest tr 1
+shorthand 4
+shorthand for fa 1
+shorthand for forml 1
+shorthand for in1 1
+shorthand for manipl 1
+shostak 1
+shot 4
+shot learn 2
+shot soft 1
+shot soft dec 1
+shoulder 1
+shoulder forth 1
+shout 1
+shout and maxim 1
+shout ar indeed 1
+shout as loud 1
+shout assoc 1
+shout demon 1
+shout measur 1
+shout th loudest 1
+shout valu 1
+show 117
+show a bidirect 1
+show a bit 1
+show a breakdown 1
+show a comparison 1
+show a compl 2
+show a configur 1
+show a const 1
+show a cuml 1
+show a decr 1
+show a detail 1
+show a fal 1
+show a good 1
+show a lem 1
+show a map 1
+show a modl 1
+show a multicast 1
+show a narx 1
+show a nearlin 1
+show a nod 1
+show a parameter 1
+show a ph 1
+show a pictur 1
+show a polygon 1
+show a profit 1
+show a rev 1
+show a sampl 2
+show a se 1
+show a segm 1
+show a signif 2
+show a simil 1
+show a singl 1
+show a slow 1
+show a snapshot 1
+show a speed 1
+show a strik 1
+show a sum 1
+show a targ 1
+show a ten 1
+show a ver 1
+show a view 1
+show a worst 1
+show adeg 1
+show an approxim 1
+show an estim 1
+show an exampl 11
+show an exterior 1
+show an improv 1
+show an inh 1
+show an interior 1
+show an optim 1
+show an over 1
+show an sl1 1
+show any differ 1
+show avail 2
+show avail altern 2
+show aver 1
+show by prov 1
+show clp 1
+show conceptu 1
+show containm 1
+show correct 1
+show dat 1
+show dat acc 1
+show e01 1
+show empl 1
+show exampl 3
+show execut 2
+show execut detail 1
+show execut tim 1
+show explicit 1
+show four workload 1
+show good 2
+show good scal 1
+show good speedup 1
+show how event 1
+show how isvl 1
+show how quick 1
+show how split 1
+show how symmeter 1
+show how triangl 1
+show in sect 1
+show in theorem 1
+show induc 1
+show isosurfac 1
+show it ag 1
+show it appl 1
+show larg var 1
+show lat 1
+show littl differ 2
+show littl resembl 1
+show long term 1
+show mark 1
+show mark lo 1
+show measur 1
+show membership 1
+show mor advantag 1
+show much prom 1
+show network 1
+show network lat 1
+show no signif 1
+show nod 1
+show nod label 1
+show numer 1
+show numer dat 1
+show onl direct 1
+show onl margin 1
+show other situ 1
+show our main 1
+show our observ 1
+show outl 1
+show parallel 1
+show parallel result 1
+show part 1
+show perform 1
+show perform evalu 1
+show proc 1
+show proc tim 1
+show procedur 1
+show procedur avg 1
+show program 1
+show r01 1
+show result 2
+show show 1
+show signif 3
+show signif differ 1
+show signif improv 1
+show simil 2
+show simil result 2
+show softwar 1
+show softwar multicast 1
+show som comput 1
+show som lem 1
+show som minim 1
+show som result 1
+show som straightfor 1
+show som typ 2
+show specl 1
+show specl comput 1
+show speedup 1
+show strong 1
+show strong norm 1
+show tel 1
+show textur 1
+show textur key 1
+show th 2cl 1
+show th absolut 2
+show th addit 1
+show th adv 1
+show th algorithm 1
+show th amount 2
+show th ansawar 1
+show th aver 4
+show th ba 1
+show th backpropag 1
+show th behavior 1
+show th benefit 1
+show th calcl 1
+show th centr 1
+show th character 1
+show th cod 2
+show th col 1
+show th commun 1
+show th compl 1
+show th compon 1
+show th composit 1
+show th connect 1
+show th correct 2
+show th correspon 1
+show th dat 3
+show th delaun 1
+show th demand 2
+show th differ 1
+show th disposit 1
+show th ec 3
+show th edg 2
+show th effect 3
+show th elap 1
+show th empl 1
+show th equiv 3
+show th execut 4
+show th experim 1
+show th extent 1
+show th fe 2
+show th fil 1
+show th fin 1
+show th fit 1
+show th forml 2
+show th gener 1
+show th good 2
+show th growth 3
+show th horizont 1
+show th import 2
+show th indep 1
+show th influ 1
+show th input 1
+show th insignif 1
+show th inst 1
+show th interact 1
+show th largest 1
+show th lat 1
+show th link 1
+show th maxim 1
+show th me 1
+show th mean 1
+show th med3 1
+show th minim 1
+show th model 1
+show th modif 2
+show th network 2
+show th norm 1
+show th number 2
+show th order 1
+show th origin 1
+show th outl 2
+show th over 2
+show th overview 1
+show th perc 1
+show th perform 9
+show th proc 1
+show th procedur 1
+show th program 1
+show th proof 1
+show th prop 1
+show th proper 1
+show th rat 1
+show th raw 1
+show th redesign 1
+show th rel 2
+show th remark 1
+show th repr 1
+show th residu 1
+show th respect 1
+show th restrict 2
+show th result 6
+show th rol 1
+show th satisf 1
+show th scal 1
+show th search 1
+show th seed 1
+show th sem 1
+show th sequ 1
+show th shar 1
+show th siml 1
+show th situ 1
+show th solut 1
+show th spar 1
+show th speed 1
+show th speedup 1
+show th stat 1
+show th structur 1
+show th subcompon 1
+show th sum 1
+show th superior 1
+show th system 1
+show th term 1
+show th tim 2
+show th transform 1
+show th traver 1
+show th unminim 1
+show th user 1
+show th valu 1
+show th var 2
+show th vot 1
+show that adeg 1
+show that appl 1
+show that boolean 1
+show that canon 1
+show that cd 1
+show that charg 1
+show that condit 1
+show that crash 1
+show that dat 1
+show that de 1
+show that dec 1
+show that deliv 1
+show that dk 1
+show that e0i 1
+show that eff 1
+show that es 1
+show that eval 1
+show that fal 1
+show that fewer 1
+show that ffq 1
+show that giv 2
+show that glob 2
+show that hierarch 1
+show that i1 1
+show that indeed 1
+show that invar 1
+show that jv1 1
+show that know 1
+show that loc 1
+show that mac1 1
+show that maxim 1
+show that md 1
+show that mlp 1
+show that monot 1
+show that nat 1
+show that ndp 1
+show that nx 1
+show that pi 1
+show that piec 1
+show that pr 1
+show that proc 2
+show that proof 1
+show that protocol 1
+show that recur 1
+show that replac 1
+show that restrict 1
+show that rmsp 1
+show that spac 1
+show that specl 1
+show that substr 1
+show that system 1
+show that techniqu 1
+show that templog 1
+show that tl 1
+show that understand 1
+show that using 1
+show that uw 1
+show that wgp 1
+show thr cluster 1
+show thr main 1
+show thr se 1
+show transit 1
+show transit interv 1
+show tw adjac 1
+show tw exampl 1
+show tw reason 1
+show u0 1
+show var 1
+show which fac 1
+show.3 1
+shown 104
+shown a solut 1
+shown a strik 1
+shown abil 1
+shown after perform 1
+shown another docum 1
+shown ar straightfor 1
+shown as ellip 1
+shown as follow 1
+shown as part 1
+shown as squar 1
+shown as tupl 1
+shown as whit 1
+shown by adapt 1
+shown by benchmark 1
+shown by dark 2
+shown by dash 1
+shown by donoh 1
+shown by exhaust 1
+shown by induc 1
+shown by prov 1
+shown correspon 1
+shown dash 1
+shown earl 1
+shown experim 1
+shown for bpc 1
+shown for fft 1
+shown for specl 1
+shown for ts 1
+shown for var 1
+shown good 1
+shown good scal 1
+shown graph 2
+shown how signif 1
+shown how system 1
+shown in ap 1
+shown in dark 2
+shown in eclip 1
+shown in equ 1
+shown in exampl 1
+shown in fig 9
+shown in fig.2 1
+shown in fig.3 1
+shown in fig.4 1
+shown in fig.5 1
+shown in figur 50
+shown in figur2 1
+shown in hermel 1
+shown in hour 1
+shown in lem 2
+shown in list 1
+shown in minut 1
+shown in parenth 2
+shown in sect 3
+shown in sol 1
+shown in subsect 2
+shown in tabl 11
+shown interact 1
+shown interact sequ 1
+shown link 1
+shown log 1
+shown multilevel 1
+shown multilevel algorithm 1
+shown p2 1
+shown p2 compl 1
+shown shar 1
+shown th benef 1
+shown th ec 1
+shown th flec 1
+shown th sum 1
+shown that actu 1
+shown that broadcast 1
+shown that centr 1
+shown that comput 1
+shown that estim 1
+shown that fd2 1
+shown that funct 1
+shown that good 1
+shown that human 1
+shown that keep 1
+shown that kinitkk 1
+shown that mlp 1
+shown that multidest 1
+shown that neg 1
+shown that nw 1
+shown that refin 1
+shown that rel 1
+shown that softwar 1
+shown that standard 1
+shown that unfold 1
+shown that virtu 1
+shown thus 1
+shown to correct 1
+shown to ec 1
+shown to exhibit 1
+shown to lead 1
+shown to offer 1
+shown to perform 3
+shown to prov 1
+shown to remain 1
+shown underlin 1
+shown using 1
+shown using eqn 1
+shown with dark 1
+shown with dot 1
+shown with thick 1
+shrairman 1
+shreedhar 1
+shreek 1
+shreek thakkar 1
+shrink 5
+shrink or kil 1
+shrink rectangl 1
+shrink rectangl reg 1
+shrink rel 1
+shrink rel unimport 1
+shrink tetrahedr 1
+shrink th tr 1
+shrink to emph 1
+shrink with appl 1
+shriver 2
+shrunk 1
+shrunk consider 1
+shu 1
+shub 1
+shub smal 1
+shub smal model 1
+shuf 1
+shuffl 4
+shuffl algorithm 1
+shuffl appropr 1
+shuffl by 2cl 1
+shuffl exchang 2
+shuffl exchang network 1
+shuffl intern 1
+shuffl intern var 1
+shuffl merg 1
+shuffl merg con 1
+shuffl merg log 1
+shuffl merg prim 1
+shuffl of step 1
+shuffl procedur 1
+shuffl run 1
+shuffl run remain 1
+shuffl th order 1
+shuffl th var 1
+shuffl th variabl 1
+shuffl we observ 1
+shunt 2
+shunt acc 1
+shunt acc hold 1
+shunt and loc 1
+shunt ar own 1
+shunt ar pa 1
+shunt at tim 1
+shunt connect 1
+shunt connect topolog 1
+shunt deb 1
+shunt dur execut 1
+shunt is tim 1
+shunt is writ 1
+shunt mid 1
+shunt ob 1
+shunt of typ 1
+shunt or var 1
+shunt read 1
+shunt writ 1
+shut 1
+shutdown 2
+shutdown command 1
+shutdown pkt 1
+shy161 1
+si 26
+si 11x 1
+si 1xi 1
+si 7x 1
+si a est 1
+si a la 2
+si aij 1
+si aij 8i 1
+si aik 1
+si ak 1
+si akl 1
+si akl appar 1
+si and si 1
+si and ti 1
+si and yi 1
+si apr 1
+si apr es 1
+si au 3
+si au contrair 1
+si au moin 1
+si aucun 2
+si aucun de 1
+si aucun var 1
+si b est 1
+si bien 1
+si bien qu 1
+si bien quil 1
+si c est 1
+si c01 1
+si c1 1
+si c12 1
+si c12 est 1
+si c1i 1
+si c2 1
+si c2 est 1
+si cal 1
+si cart 1
+si cart sien 1
+si ce 4
+si ce alg 1
+si ce appel 1
+si ce bloc 1
+si ce coeff 1
+si ce ensembl 1
+si ce entr 1
+si ce fonct 1
+si ce foncteur 1
+si ce forml 1
+si ce nest 2
+si ce pag 1
+si ce syst 1
+si ce transform 1
+si ce transpar 1
+si cel 2
+si cel ci 1
+si cel est 1
+si certain 1
+si certain coupl 1
+si cest 2
+si cest dan 1
+si cest le 2
+si chaqu 1
+si chaqu processeur 1
+si com 1
+si com cest 1
+si d oeshar 1
+si dan 1
+si dan le 1
+si dautr 1
+si dautr ind 1
+si de 3
+si de claus 1
+si de nouvel 1
+si de synchron 1
+si de tel 1
+si def 1
+si def xi 1
+si denot 2
+si deux 3
+si deux etiqu 1
+si deux mouv 1
+si el 4
+si el aboutit 1
+si el es 1
+si el est 2
+si el impliqu 1
+si el ne 2
+si el nest 1
+si el perm 1
+si el peut 2
+si el se 1
+si en 1
+si en ex 1
+si et sel 4
+si gi2i 1
+si ij 1
+si ik 1
+si il 1
+si il desc 1
+si il ec 1
+si il nec 1
+si is map 1
+si is satisf 1
+si j hg 1
+si jc1j 1
+si jcj 1
+si jd 1
+si jsij 1
+si l echec 1
+si l elim 1
+si l equ 1
+si l etat 2
+si l2 1
+si l2 l1 1
+si la 4
+si la boucl 1
+si la ch 1
+si la claus 1
+si la colon 1
+si la condit 1
+si la dern 1
+si la dilat 1
+si la distribut 1
+si la div 1
+si la feuil 1
+si la liaison 1
+si la mi 1
+si la mvp 1
+si la pag 1
+si la par 1
+si la partit 1
+si la prem 3
+si la secon 1
+si la tail 2
+si la transform 1
+si la valeur 1
+si la var 2
+si la wam 1
+si lallong 1
+si lallong de 1
+si lappel 1
+si lappel termin 1
+si larbr 1
+si larbr de 1
+si largum 1
+si largum de 1
+si largum est 1
+si largum nest 1
+si largum sav 1
+si larit 1
+si lasser 1
+si lasser est 1
+si lattribut 1
+si lattribut est 1
+si laugm 1
+si laugm du 1
+si le 5
+si le bloc 1
+si le calcl 1
+si le champ 1
+si le compilateur 1
+si le conflit 1
+si le contenu 1
+si le contraint 1
+si le corp 1
+si le cou 1
+si le dern 1
+si le deux 2
+si le diff 1
+si le domain 1
+si le ind 1
+si le instruc 1
+si le interact 1
+si le nid 1
+si le nombr 1
+si le pa 1
+si le parcour 1
+si le pgcd 1
+si le plac 1
+si le point 1
+si le pointeur 1
+si le pr 1
+si le prem 1
+si le processeur 1
+si le program 1
+si le propr 1
+si le pu 1
+si le register 1
+si le som 1
+si le structur 1
+si le syst 1
+si le tableau 1
+si le taux 1
+si le temp 1
+si le term 1
+si le test 1
+si le variabl 1
+si lec 1
+si lec ecut 1
+si lenregister 1
+si lenregister dactiv 1
+si lestampil 1
+si lestampil de 1
+si leur 1
+si leur sp 1
+si li 1
+si li bi 1
+si lim 1
+si lim du 1
+si lin 1
+si lin egalit 1
+si lind 1
+si linform 1
+si linform de 1
+si linst 1
+si linst de 1
+si linstruc 1
+si linstruc ge 1
+si linterv 1
+si linterv de 1
+si lintroduc 1
+si lintroduc dun 1
+si linv 1
+si linv du 1
+si lit 1
+si lit erat 1
+si lon 4
+si lon ajout 1
+si lon appliqu 1
+si lon consid 2
+si lon effectu 1
+si lon fait 1
+si lon ne 2
+si lon not 1
+si lon peut 1
+si lon sint 1
+si lon sup 2
+si long 1
+si long mo 1
+si lop 1
+si lop erat 1
+si lun 1
+si lun de 1
+si lunif 1
+si lunif echou 1
+si lunif est 1
+si m1 1
+si maint 1
+si maint nous 1
+si malgr 1
+si me 1
+si mk 1
+si n ecessair 1
+si n est 1
+si n nest 1
+si nj2 1
+si nous 3
+si nous avon 1
+si nous comparon 1
+si nous consid 1
+si nous ne 1
+si nous not 1
+si on distribut 1
+si on effectu 1
+si on elimin 1
+si on modif 1
+si on ne 1
+si on not 1
+si on obt 1
+si on se 1
+si on util 1
+si p q1 1
+si pgcd 1
+si pm 1
+si repr 1
+si se 1
+si se droit 1
+si si 1
+si simpl 1
+si simpl dan 1
+si sj 1
+si son 1
+si son uniqu 1
+si sont 1
+si sont non 1
+si superficiel 1
+si superficiel vaut 1
+si t expir 1
+si t jc1j 1
+si t vaut 1
+si tent 1
+si tent de 1
+si ti 2
+si ti nest 1
+si tip 1
+si tous 2
+si tous le 2
+si tout 1
+si tout se 1
+si toutef 1
+si toutef el 1
+si trjn 1
+si trjn alor 1
+si un 3
+si un an 1
+si un disjonct 1
+si un enregister 1
+si un environ 1
+si un imag 1
+si un liaison 1
+si un ordr 1
+si un part 1
+si un point 1
+si un prem 1
+si un processeur 1
+si un processus 1
+si un valeur 1
+si un var 1
+si vi 1
+si xm 1
+si y est 1
+si1 1
+si10i 1
+siam 23
+siam review 2
+sib 1
+sib findsibl 1
+siber 1
+sibl 6
+sibl and mov 1
+sibl and proc 1
+sibl cannot occur 1
+sibl ge 1
+sibl is inser 1
+sibl is plac 1
+sibl is put 1
+sibl nod 1
+sibl pointer 1
+sibl pointer adjust 1
+sibl pointer le 1
+sibl pointer mak 1
+sibl proc 1
+sibl repr 1
+sibl tr 1
+siblingb 1
+sic 5
+sic research 2
+sic research report 2
+sic techn 1
+sic techn report 1
+sic tus 1
+sic tus prolog 1
+sic.se 1
+sic2 1
+sic2 labor 1
+sic2 labor box 1
+sicgom 1
+sicstus 1
+sicstus auror 1
+sicstus auror util 1
+sicstus ex 1
+sicstus ex ecut 1
+sicstus interdit 1
+sicstus interdit lutil 1
+sicstus prolog 1
+sicstus prolog rep 1
+sicstus prolog user 1
+sicstus show 1
+sicstusprolog 1
+sid 52
+sid and bound 1
+sid approach 1
+sid approach mak 1
+sid approach most 1
+sid ar parallel 1
+sid by tak 1
+sid chain 1
+sid comput 1
+sid condit 1
+sid condit guar 1
+sid d tot 1
+sid dan 1
+sid dan le 1
+sid effect 13
+sid effect fr 1
+sid effect pr 1
+sid effect rever 1
+sid experim 1
+sid experim theor 1
+sid great 1
+sid great flec 1
+sid is ch 1
+sid jeroslow 1
+sid jeroslow wang 1
+sid not 1
+sid of act 1
+sid of claim 1
+sid of figur 1
+sid of quantif 1
+sid of rol 1
+sid panel 1
+sid panel dimin 1
+sid panel rec 1
+sid pattern 1
+sid pattern match 1
+sid point 1
+sid problem 1
+sid proc 1
+sid program 1
+sid prov 1
+sid q qx 1
+sid qx 1
+sid qx qy 1
+sid repr 1
+sid show 1
+sid step 1
+sid step quest 1
+sid unif 1
+sid ver 1
+sid ver repr 1
+sid view 1
+sid without ext 1
+sid yield 1
+sidelength 1
+sidelength 2i 1
+sidelength 2l 1
+sider 1
+sider differ 1
+sider differ scal 1
+sidestep 2
+sidestep th problem 1
+sidestep th triangl 1
+sidiropoul 1
+sidn 1
+sieckenius 1
+sieckenius de 1
+sieckenius de souz 1
+sieg 1
+siegel 1
+siegel book 1
+siegelman 1
+siegler 1
+siem 5
+siem ag 1
+siem ba 1
+siem ba program 1
+siem corpor 1
+siem corpor research 1
+siem mx 1
+siem procedur 1
+siem program 1
+siem program.14 1
+siem research 1
+siem research creat 1
+siem research mad 1
+siem stud 1
+siem stud addr 1
+siem stud deliber 1
+siem subject 1
+siem test 1
+siem test suit 1
+siem took 1
+siem took part 1
+siem tsl 1
+sien 2
+siever 1
+sift 2
+siftdown 1
+siftdown algorithm 1
+siftdown algorithm follow 1
+siftdown algorithm tak 1
+siftdown build 1
+siftdown everywh 1
+siftdown resp 1
+siftdown ver 1
+siftdown ver resp 1
+sig 5
+sig mod 1
+sig not 1
+sig plan 2
+sig plan not 1
+sig writ2 1
+sig. 1
+sigact 5
+sigact new 1
+sigact sigmod 3
+sigact sigmod sigart 3
+sigarch 1
+sigarch and ie 1
+sigart 4
+sigart newsletter 1
+sigart pod 1
+sigch 2
+sigch symp 1
+sigcom 3
+sigcom88 1
+sigcom95 1
+siggraph 4
+siggraph and sigch 1
+sight 2
+sight tim 1
+sigm 4
+sigm funct 3
+sigm funct shown 1
+sigm nonlin 1
+sigm pip 1
+sigm pipel 1
+sigmeter 4
+sigmeter perform 1
+sigmicr 1
+sigmicr newsletter 1
+sigmicr newsletter vol.15 1
+sigmod 12
+sigmod annu 1
+sigmod intern 1
+sigmod record 4
+sigmod sigart 3
+sigmod sigart pod 1
+sign 35
+sign a condit 1
+sign after an 1
+sign an error 1
+sign and featur 1
+sign and imag 1
+sign and sect 1
+sign and therefor 1
+sign and thus 1
+sign approxim 1
+sign ar actu 1
+sign ar high 1
+sign assignm 1
+sign ba 1
+sign ba word 1
+sign band 1
+sign be disabl 1
+sign befor lock 1
+sign by cal 1
+sign by defgener 1
+sign by funct 1
+sign by setter 1
+sign by sign 1
+sign by thread 1
+sign cal 1
+sign cant 1
+sign cant bit 1
+sign cant chang 1
+sign cant speedup 1
+sign classif 1
+sign compr 2
+sign compr using 1
+sign condit 1
+sign contain 1
+sign continu 1
+sign de 1
+sign de c1 1
+sign decomposit 2
+sign deliv 1
+sign dep 1
+sign dist 1
+sign dist ind 1
+sign e au 1
+sign e par 1
+sign e sur 1
+sign es 1
+sign exhibit 1
+sign exhibit simil 1
+sign fe 1
+sign fe se 1
+sign featur 1
+sign for an 1
+sign from multisc 1
+sign from no 1
+sign funct 1
+sign handl 1
+sign handler 1
+sign handler deal 1
+sign if prim 1
+sign imag 1
+sign imag proc 1
+sign imp 1
+sign imp object 1
+sign inclus 1
+sign indep 1
+sign indep no 1
+sign int compon 1
+sign is check 1
+sign is specif 1
+sign me 1
+sign model 1
+sign nam 1
+sign noncontinu 1
+sign occur 1
+sign of babel 1
+sign of cand 1
+sign of output 1
+sign off 1
+sign on thread 1
+sign or sign 1
+sign other proc 1
+sign output 1
+sign output waveform 1
+sign plus addit 1
+sign proc 6
+sign proc magaz 1
+sign proc model 1
+sign proc schem 1
+sign proc using 1
+sign rank 1
+sign rank test 1
+sign read 1
+sign read nod 1
+sign read oper 1
+sign read1 1
+sign reflect 1
+sign register 1
+sign repr 1
+sign respect 2
+sign respectif 1
+sign respectif de 1
+sign segm 1
+sign segm task 1
+sign shap 1
+sign shap del 1
+sign sk 1
+sign spac 1
+sign spac suggest 1
+sign spec condit 1
+sign structur 1
+sign subsequ 1
+sign test 1
+sign th condit 1
+sign th correspon 1
+sign th en 1
+sign that currexp 1
+sign that shap 1
+sign thread 1
+sign to ind 1
+sign to no 1
+sign using 2
+sign valu 1
+sign waveform 1
+sign wer pa 1
+sign wer synchron 1
+signaler 3
+signaler bon 1
+signaler bon nombr 1
+signaler intent 1
+signaler loccur 1
+signaler loccur de 1
+signalinput 1
+signalinput neg 1
+signalinput neg signaloutput 1
+signalon 1
+signalon d ej 1
+signalon qu 1
+signalon qu nous 1
+signaloutput 1
+signam 1
+signatur 1
+signaux 1
+signif 72
+signif a non 1
+signif addit 1
+signif addit improv 1
+signif adv 3
+signif affect 1
+signif alor 1
+signif alor qu 1
+signif and specl 1
+signif at level 1
+signif attempt 1
+signif benefit 3
+signif bit 2
+signif bit ind 1
+signif by hid 1
+signif cach 1
+signif cach hit 1
+signif caus 1
+signif caus rel 1
+signif chang 4
+signif chang av 1
+signif cl 1
+signif commitm 1
+signif compon 1
+signif contribut 1
+signif cost 1
+signif cost adv 1
+signif de 1
+signif de diff 1
+signif decr 1
+signif def 1
+signif depart 1
+signif differ 9
+signif differ effect 1
+signif differ fair 1
+signif differ mean 1
+signif differ pattern 1
+signif differ textur 1
+signif difficult 1
+signif discrep 1
+signif drop 1
+signif eff 1
+signif eff gain 1
+signif effect 1
+signif effort 2
+signif effort requir 1
+signif error 1
+signif estim 1
+signif experim 1
+signif experim evalu 1
+signif fact 1
+signif faster 2
+signif fewer 2
+signif for larger 1
+signif four bit 1
+signif fract 1
+signif futur 1
+signif futur developm 1
+signif g eom 1
+signif gener 2
+signif greater 2
+signif greater number 1
+signif harder 1
+signif high 2
+signif high network 1
+signif high ts 1
+signif impact 5
+signif improv 10
+signif improv program 1
+signif in comparison 1
+signif in determin 1
+signif in figur 1
+signif incr 4
+signif influ 1
+signif inform 1
+signif instead 1
+signif issu 1
+signif larger 1
+signif le tim 1
+signif level 2
+signif li 2
+signif longer 1
+signif lower 1
+signif mean 1
+signif mean differ 1
+signif mor challeng 1
+signif mor compl 1
+signif mor complec 1
+signif mor eff 1
+signif mor suit 1
+signif mor tim 2
+signif mor work 1
+signif nod 1
+signif number 1
+signif observabl 1
+signif of lin 1
+signif of stimulus 1
+signif overhead 1
+signif parameter 1
+signif part 1
+signif perc 1
+signif perform 2
+signif perform benefit 1
+signif perform degrad 1
+signif perform improv 2
+signif port 1
+signif probabil 1
+signif problem 2
+signif progr 1
+signif protocol 1
+signif qu 2
+signif qu etant 1
+signif qu le 1
+signif qu si 1
+signif quaucun 1
+signif reduc 6
+signif reduc lat 1
+signif rel 1
+signif relationship 1
+signif restrict 1
+signif se 1
+signif simplif 1
+signif situ 1
+signif siz 1
+signif slower 1
+signif sourc 1
+signif speed 1
+signif speedup 1
+signif speedup learn 1
+signif st 1
+signif st reduc 1
+signif stat 1
+signif sub 1
+signif supernod 1
+signif system 1
+signif t el 1
+signif techn 1
+signif techn problem 1
+signif textur 1
+signif textur reg 1
+signif th edg 1
+signif th effect 1
+signif th proper 1
+signif theor 2
+signif theor lim 1
+signif thr bit 1
+signif to network 1
+signif upon contextu 1
+signif var 1
+signif wa ment 1
+signif wast 1
+signif wast network 1
+signif when confid 1
+signif wor 2
+significatif 2
+significatif sur 1
+significatif sur la 1
+significativ 1
+significativ am elior 1
+signioc 1
+signioc dun 1
+signioc dun conogur 1
+signioc suiv 1
+signitur 1
+sigop 2
+sigop oper 1
+sigop oper system 1
+sigop sigact 1
+sigplan 14
+sigplan not 8
+sigplan not vol.22 1
+sigplan not vol.30 1
+sigplan pld92 1
+sigplan workshop 1
+sigsac 1
+sigsac review 1
+sigsoft 3
+sigsoft softwar 1
+sigsoft softwar engineer 1
+sil 7
+sil acc 1
+sil acc ed 1
+sil ar 1
+sil ar qu 1
+sil correspon 1
+sil correspon effectiv 1
+sil dur 1
+sil ec 4
+sil ec de 1
+sil ec un 2
+sil en 1
+sil en ec 1
+sil est 2
+sil est empl 1
+sil est suiv 1
+sil existait 1
+sil ne 3
+sil ne serait 1
+sil ne sont 1
+sil ny 2
+sil ny pa 1
+sil sagissait 1
+sil sagissait dun 1
+sil sagit 1
+sil sagit de 1
+sil sagit dic 1
+sil sagit dun 1
+sil vous 1
+sil vous pl 1
+sil y en 1
+silberman 1
+silberschatz 1
+silc 1
+silicon 5
+silicon ar 1
+silicon crystal 1
+silicon graph 3
+silicon graph challeng 1
+silicon graph inc 1
+silicon produc 1
+silicon produc proc 1
+silv 1
+silv lep 1
+silver 2
+silver bl 1
+silver spher 1
+silverman 1
+sim 1
+sim llb 1
+sim llb ran 1
+sim. 3
+simaux 1
+simd 5
+simd candid 1
+simd comport 1
+simd comport plusieur 1
+simd computer 2
+simd et mimd 1
+simd hypercub 1
+simd implem 1
+simd mach 2
+simd offr 1
+simd offr la 1
+simd ou 1
+simd ou pip 1
+simd spmd 1
+simeon 1
+simil 111
+simil act 1
+simil act simultan 1
+simil algorithm 1
+simil algorithm known 1
+simil although slight 1
+simil an 1
+simil and ao 1
+simil and differ 2
+simil and prev 1
+simil approach 5
+simil argum 7
+simil argum hold 1
+simil as optim 1
+simil as term 1
+simil ba 1
+simil ba decluster 1
+simil between textur 1
+simil block 1
+simil branch 1
+simil branch strateg 1
+simil but retrief 1
+simil by om 1
+simil ca 1
+simil ca appl 1
+simil cal 1
+simil cal number 1
+simil character 2
+simil childr 1
+simil chunk 1
+simil classif 1
+simil claus 1
+simil commun 1
+simil configur 1
+simil connect 1
+simil dat 2
+simil dat rectangl 1
+simil definit 1
+simil degr 1
+simil deriv 1
+simil deriv ba 1
+simil descript 1
+simil dilem 1
+simil disc 1
+simil docum 1
+simil edg 1
+simil edg cut 1
+simil effect 2
+simil elim 1
+simil equ 1
+simil exper 1
+simil facil 1
+simil failur 1
+simil featur 2
+simil for a0i 1
+simil for goal 1
+simil for writer 1
+simil form 3
+simil format 1
+simil framework 1
+simil graph 1
+simil graph ba 1
+simil graph method 1
+simil hk 1
+simil id 1
+simil improv 1
+simil in natur 1
+simil in spirit 3
+simil in structur 1
+simil incr 2
+simil interm 1
+simil interm form 1
+simil invar 1
+simil invar match 1
+simil is us 1
+simil kind 1
+simil link 1
+simil link funct 1
+simil manner 2
+simil match 1
+simil matr 1
+simil me 2
+simil me dat 1
+simil me overhead 1
+simil memor 1
+simil memor lo 1
+simil mistak 1
+simil model 2
+simil model using 1
+simil motiv 1
+simil n bit 1
+simil nam 1
+simil nam unit 1
+simil object 1
+simil observ 1
+simil of var 1
+simil optim 1
+simil or ao 1
+simil or differ 1
+simil paper 1
+simil perform 4
+simil perform benefit 1
+simil perform pattern 1
+simil perform requir 1
+simil phenomenon 1
+simil phenomenon ineff 1
+simil posit 1
+simil problem 4
+simil program 1
+simil protein 1
+simil protein structur 1
+simil prun 1
+simil prun ba 1
+simil qu 1
+simil quest 1
+simil questionnair 1
+simil reason 2
+simil rel 1
+simil relationship 1
+simil relationship hold 1
+simil result 10
+simil result deriv 1
+simil rl 1
+simil scal 1
+simil scenar 1
+simil ser 1
+simil shap 1
+simil simp 1
+simil situ 4
+simil siz 1
+simil softwar 1
+simil softwar system 1
+simil stat 3
+simil stud 1
+simil styl 1
+simil syntac 2
+simil system 2
+simil tag 1
+simil tag row 1
+simil techniqu 4
+simil templ 1
+simil templ describ 1
+simil term 1
+simil textur 1
+simil throughput 1
+simil to adapt 1
+simil to affin 1
+simil to ar 1
+simil to asser 1
+simil to aver 1
+simil to ca 1
+simil to caus 1
+simil to commerc 1
+simil to compar 1
+simil to eiffel 1
+simil to en1 1
+simil to figur 2
+simil to funct 2
+simil to hyperbol 1
+simil to ib3 1
+simil to indirect 1
+simil to justif 1
+simil to log 1
+simil to netsim 1
+simil to norm 1
+simil to pcct 1
+simil to pcf 1
+simil to prev 1
+simil to proc 1
+simil to program 1
+simil to q2.0 1
+simil to qu 1
+simil to sect 1
+simil to sl 1
+simil to sld 1
+simil to step 1
+simil to tabl 1
+simil to templ 1
+simil to textur 1
+simil to theorem 3
+simil to tjad 1
+simil to vect 1
+simil to virtu 1
+simil to wal 1
+simil to wilson 1
+simil to work 1
+simil top 1
+simil transform 1
+simil tren 2
+simil trick 1
+simil trick appl 1
+simil val 1
+simil val using 1
+simil vein 1
+simil way forml 1
+simil we def 1
+simil wel behav 1
+simil work 1
+simil work using 1
+simil workload 1
+simil workload character 1
+similair 4
+similair a cel 1
+similair a celu 1
+similair a chacun 1
+similair a la 1
+similair a un 2
+similair au 2
+similair au cod 1
+similair au mod 1
+similair au nid 1
+similair au pr 1
+similair au probl 1
+similair aux 1
+similair aux condit 1
+similair avec 1
+similair avec le 1
+similair est 1
+similair est aus 1
+similair sur 1
+similair sur le 1
+similarit 2
+similarit e entr 1
+similarit es 2
+similarit es entr 2
+similitud 2
+similitud nous 1
+similitud ou 1
+similitud ou le 1
+siml 62
+siml a bus 1
+siml a chaqu 1
+siml a datab 1
+siml a ev 1
+siml a even 1
+siml a hierarch 1
+siml a network 1
+siml a se 1
+siml a tag 1
+siml algorithmiqu 1
+siml an 5
+siml an algorithm 2
+siml an appl 1
+siml an approach 1
+siml an ec 1
+siml an using 1
+siml and experim 1
+siml and learn 1
+siml and train 1
+siml any ptim 1
+siml appl 1
+siml ar appl 1
+siml ar distribut 1
+siml ar qualit 1
+siml architectur 1
+siml as describ 1
+siml ayant 1
+siml ayant le 1
+siml ba 2
+siml ba sem 1
+siml begin 1
+siml built 1
+siml built using 1
+siml by click 1
+siml by dynam 1
+siml by shar 1
+siml can run 1
+siml caus 1
+siml check 1
+siml classiqu 1
+siml classiqu de 1
+siml clock 1
+siml consider 1
+siml constraint 1
+siml constraint hierarch 1
+siml could execut 1
+siml dat 1
+siml dat ba 1
+siml de 2
+siml de ce 1
+siml de fonct 1
+siml de mont 1
+siml de syst 1
+siml determin 1
+siml determin exact 1
+siml differ rout 1
+siml driver 1
+siml du 1
+siml du mod 1
+siml dun 1
+siml dun grand 1
+siml e est 1
+siml e font 1
+siml e un 1
+siml ea 1
+siml each disk 1
+siml effect 1
+siml eng 2
+siml eng acc 1
+siml eng cod 1
+siml eng initializ 1
+siml eng inser 1
+siml eng man 1
+siml ensuit 1
+siml ensuit nous 1
+siml environm 1
+siml est 1
+siml est indep 1
+siml evolut 1
+siml exampl 1
+siml exampl pr 1
+siml exampl1 1
+siml execut 1
+siml experim 3
+siml experim attempt 1
+siml for distribut 1
+siml for random 1
+siml for raref 1
+siml funct 1
+siml guid 1
+siml guid ee 1
+siml ha progr 1
+siml hybr 1
+siml in order 1
+siml in parallel 1
+siml in warm 1
+siml input 1
+siml input dat 1
+siml is gener 1
+siml is start 1
+siml issu 1
+siml keep 1
+siml keep track 1
+siml kernel 1
+siml kernel keep 1
+siml la 1
+siml la siml 1
+siml labor 1
+siml larg network 1
+siml le 2
+siml le syst 1
+siml le temp 1
+siml loop 1
+siml mach 1
+siml mach failur 1
+siml makov 1
+siml makov model 1
+siml method 2
+siml method simil 1
+siml methodolog 1
+siml model 6
+siml model specif 1
+siml mor real 1
+siml na 1
+siml na ve 1
+siml nin 1
+siml nin ar 1
+siml of adapt 1
+siml of complec 1
+siml of computer 1
+siml of dep 1
+siml of evolut 1
+siml of handwrit 1
+siml of high 1
+siml of mot 1
+siml of nsfnet 1
+siml of pffq 1
+siml of trancact 1
+siml of transact 1
+siml of vhdl 1
+siml on fat 1
+siml organ 1
+siml organ structur 1
+siml other organ 1
+siml over proc 1
+siml p1s 1
+siml p1s retr 1
+siml pack 1
+siml par 1
+siml par echantillon 1
+siml parameter 1
+siml perform 1
+siml perform result 1
+siml perm 1
+siml perm de 1
+siml phy 1
+siml phy network 1
+siml plus rapid 1
+siml pour 1
+siml pour estimer 1
+siml pr 1
+siml pr ef 1
+siml prinzip 1
+siml prinzip und 1
+siml privileg 1
+siml privileg graph 1
+siml proceed 1
+siml program 1
+siml program boast 1
+siml proof 1
+siml qu 1
+siml qu perm 1
+siml random 1
+siml random bimod 1
+siml random traff 1
+siml rather extrem 1
+siml rel 1
+siml rel point 1
+siml remov 1
+siml rep 1
+siml rep sur 1
+siml rest 1
+siml rest apr 1
+siml result 5
+siml result show 2
+siml run 3
+siml scenar 1
+siml sem 1
+siml sem specif 1
+siml setup 1
+siml siml 1
+siml siml siml 1
+siml smalltalk 1
+siml soit 1
+siml sont 1
+siml sont fic 1
+siml sor 1
+siml sor hor 1
+siml standard 1
+siml standard lorsqu 1
+siml stat 1
+siml stat dataflow 1
+siml structur 1
+siml structur light 1
+siml stud 1
+siml support 1
+siml support libr 1
+siml system 2
+siml tak 1
+siml techniqu 2
+siml techniqu us 1
+siml testb 3
+siml testb clustersim 1
+siml th behavior 2
+siml th ca 1
+siml th desir 1
+siml th dynam 1
+siml th effect 1
+siml th electr 1
+siml th fluid 1
+siml th gfaat 1
+siml th instruc 1
+siml th pack 1
+siml th self 1
+siml th test 1
+siml th traject 1
+siml that comb 1
+siml that siml 1
+siml ti 1
+siml tim 3
+siml tim correspon 1
+siml tim equ 1
+siml to evalu 2
+siml to test 1
+siml tool 1
+siml tool identif 1
+siml tupl 1
+siml tupl timestamp 1
+siml using 3
+siml using grad 1
+siml using singl 1
+siml wa run 1
+siml we zer 1
+siml with 8k 1
+siml with qsim 1
+siml with specl 1
+siml with ts 1
+siml work 1
+simmod 1
+simon 13
+simon and schuster 1
+simon and shang 1
+simon and teng 1
+simon fraser 1
+simon martin 1
+simon phon 1
+simp 58
+simp a cut 1
+simp a dat 1
+simp a list 1
+simp a path 1
+simp a point 1
+simp a reorgan 1
+simp a retrief 1
+simp a solut 1
+simp a super 1
+simp a tap 1
+simp acc 1
+simp ad 2
+simp an encapsl 1
+simp an ident 1
+simp appl 1
+simp as oid 1
+simp assign 1
+simp attach 1
+simp be upd 1
+simp becom 2
+simp becom cleverer 1
+simp bundl 1
+simp by chang 1
+simp by import 1
+simp by pick 1
+simp by plug 1
+simp by predict 1
+simp by refer 1
+simp by replac 1
+simp by using 1
+simp ch 2
+simp ch daubech 1
+simp cl 1
+simp click 1
+simp consider 1
+simp cop 3
+simp def 1
+simp def variabl 1
+simp defer 1
+simp defer mak 1
+simp describ 1
+simp describ why 1
+simp dism 1
+simp dum 1
+simp ext 1
+simp find 1
+simp flip 1
+simp forgot 1
+simp giv 1
+simp implem 1
+simp implem detail 1
+simp init 1
+simp integer 1
+simp keep 1
+simp keep succ 1
+simp mak 3
+simp mak procedur 1
+simp mark 1
+simp mark s3 1
+simp mean 1
+simp measur 1
+simp mor verb 1
+simp mov 1
+simp mov upd 1
+simp mult 1
+simp mult union 1
+simp no learn 1
+simp no longer 1
+simp norm 1
+simp number 1
+simp number alloc 1
+simp obtain 1
+simp perform 3
+simp perform error 1
+simp pl 1
+simp plot 1
+simp plot lat 1
+simp plug 1
+simp post 1
+simp print 1
+simp proceed 1
+simp quant 1
+simp regener 1
+simp remov 3
+simp remov inst 1
+simp reorgan 1
+simp replac 2
+simp repr 1
+simp request 1
+simp run 1
+simp say 1
+simp schedl 1
+simp se 1
+simp se lock 1
+simp shown 1
+simp stat 1
+simp stat level 1
+simp switch 1
+simp term 1
+simp th cp 1
+simp th kth 1
+simp th parent 1
+simp th sampl 1
+simp th se 1
+simp thrown 1
+simp to find 1
+simp to gener 1
+simp transl 1
+simp transl text 1
+simp typ 1
+simp typ calculus 1
+simp uniform 1
+simp uniform distribut 1
+simp using 2
+simp using ec 1
+simp wait 1
+simp want 1
+simp want docum 1
+simpl 105
+simpl a impl 1
+simpl a jour 1
+simpl a la 1
+simpl a linstruc 1
+simpl a mettr 2
+simpl acc 3
+simpl acc es 1
+simpl acc mod 1
+simpl acc structur 1
+simpl adder 1
+simpl adder circuit 1
+simpl addit 1
+simpl adjac 1
+simpl adjac inform 1
+simpl adr 1
+simpl adr ind 1
+simpl algebr 1
+simpl algebr proper 1
+simpl algorithm 6
+simpl algorithm jt 1
+simpl algorithm techniqu 1
+simpl an 1
+simpl analyser 1
+simpl and an 1
+simpl and condit 1
+simpl and deadlock 1
+simpl and ea 1
+simpl and eff 8
+simpl and eleg 1
+simpl and fast 1
+simpl and mach 1
+simpl and natur 1
+simpl and robust 1
+simpl and straightfor 2
+simpl and thus 1
+simpl approach 3
+simpl as alloc 1
+simpl as de 1
+simpl as project 1
+simpl as shown 1
+simpl atom 1
+simpl atom comp 1
+simpl au 1
+simpl au quadrupl 1
+simpl b decomposit 1
+simpl back 1
+simpl back trac 1
+simpl bod 1
+simpl branch 1
+simpl branch conditionnel 1
+simpl branch ver 1
+simpl but na 1
+simpl but us 2
+simpl c program 1
+simpl ca 3
+simpl ca rec 1
+simpl camer 1
+simpl camer model1 1
+simpl ch 1
+simpl chang 2
+simpl character 1
+simpl cl 3
+simpl cl form 1
+simpl cl polygon 1
+simpl classif 1
+simpl cluster 1
+simpl cluster seek 1
+simpl cod 1
+simpl cod ee 1
+simpl cod improv 1
+simpl comparaison 1
+simpl comparaison dadr 1
+simpl compil 2
+simpl compil tim 1
+simpl compiler 1
+simpl complec 1
+simpl comput 1
+simpl comput unit 1
+simpl con 2
+simpl concept 1
+simpl concept predom 1
+simpl condit 2
+simpl consequ 1
+simpl contour 1
+simpl cop 1
+simpl cop de 1
+simpl cor 1
+simpl cor langu 1
+simpl counterexampl 1
+simpl curv 1
+simpl curv segm 1
+simpl cycl 1
+simpl d epil 1
+simpl d etendr 1
+simpl d etr 1
+simpl dacc 1
+simpl dacc eder 1
+simpl daffecter 1
+simpl dan 2
+simpl dan le 2
+simpl dat 3
+simpl dat parallel 1
+simpl dat structur 1
+simpl dat term 1
+simpl datab 1
+simpl datab fact 1
+simpl de 2
+simpl de co 1
+simpl de comparer 1
+simpl de coupur 1
+simpl de dupl 1
+simpl de la 2
+simpl de passer 1
+simpl de retirer 1
+simpl de term 1
+simpl decod 1
+simpl decod log 1
+simpl definit 1
+simpl descript 1
+simpl diagram 1
+simpl diagram ch 1
+simpl dim 1
+simpl dim an 1
+simpl diminut 1
+simpl diminut de 1
+simpl direct 1
+simpl direct map 1
+simpl distribut 1
+simpl distribut dat 1
+simpl docum 1
+simpl docum deliv 1
+simpl dpl 1
+simpl du 2
+simpl du retour 1
+simpl du typ 1
+simpl dun 1
+simpl dun coop 1
+simpl ec 1
+simpl ec axiom 1
+simpl ed 1
+simpl ed algorithm 1
+simpl edit 2
+simpl edit cut 1
+simpl edit dist 1
+simpl eigenvalu 1
+simpl eleg 1
+simpl elimin 1
+simpl en 2
+simpl en prolog 1
+simpl en re 1
+simpl encod 1
+simpl enhanc 1
+simpl es 1
+simpl est 1
+simpl est don 1
+simpl et du 1
+simpl et efficac 1
+simpl et el 1
+simpl et tr 1
+simpl etr 1
+simpl etr obtenu 1
+simpl etr pa 1
+simpl exampl 10
+simpl exampl consider 1
+simpl exampl tak 1
+simpl exampl wh 1
+simpl ext 2
+simpl fact 1
+simpl fait 1
+simpl fait de 1
+simpl fault 1
+simpl fault tr 1
+simpl featur 2
+simpl featur se 1
+simpl first norm 1
+simpl fonct 1
+simpl form 3
+simpl forml 1
+simpl four nod 1
+simpl funct 2
+simpl funct gener 1
+simpl funct langu 1
+simpl gain 1
+simpl gel 1
+simpl gel du 1
+simpl genet 1
+simpl genet algorithm 1
+simpl geometer 1
+simpl geometer fact 1
+simpl greed 1
+simpl greed algorithm 1
+simpl hypergraph 1
+simpl ignor 1
+simpl ignor es 1
+simpl imag 1
+simpl imag cut 1
+simpl imper 1
+simpl imper langu 1
+simpl impl 1
+simpl impl ement 1
+simpl implem 2
+simpl import 1
+simpl incr 1
+simpl incr em 1
+simpl ind 1
+simpl indirect 1
+simpl inequ 1
+simpl inform 1
+simpl inform theor 1
+simpl inst 1
+simpl int 1
+simpl int egr 1
+simpl integer 1
+simpl integer arithm 1
+simpl l ag 1
+simpl la 1
+simpl la valeur 1
+simpl langu 2
+simpl layout 1
+simpl le 1
+simpl le calcl 1
+simpl le pag 1
+simpl learn 1
+simpl learn unit 1
+simpl lectur 1
+simpl list 1
+simpl load 1
+simpl load st 1
+simpl loc 1
+simpl loc search 1
+simpl log 1
+simpl log funct 1
+simpl loop 1
+simpl loop fragm 1
+simpl lordr 1
+simpl lordr de 1
+simpl low 1
+simpl low level 1
+simpl maintenu 1
+simpl marqueur 1
+simpl marqueur syntaxiqu 1
+simpl match 1
+simpl match schem 1
+simpl mathemat 2
+simpl mathemat measur 1
+simpl mathemat model 1
+simpl matter 1
+simpl me 2
+simpl me diffus 1
+simpl me reduc 1
+simpl measur 3
+simpl menus 1
+simpl method 2
+simpl mettr 1
+simpl mi 1
+simpl model 1
+simpl modif 3
+simpl modif dun 1
+simpl modif ee 1
+simpl monit 1
+simpl monit algorithm 1
+simpl mous 1
+simpl mous control 1
+simpl ms 1
+simpl ms schem 1
+simpl multiproc 1
+simpl multiproc architectur 1
+simpl multiproc built 1
+simpl multiproc using 1
+simpl nam 1
+simpl nearest 1
+simpl nearest neighbour 1
+simpl neighbor 1
+simpl neighbor point 1
+simpl nest 1
+simpl nest pa 1
+simpl network 2
+simpl network manag 1
+simpl network topolog 1
+simpl non 3
+simpl non lin 1
+simpl non markov 1
+simpl non spur 1
+simpl object 2
+simpl object funct 1
+simpl observ 3
+simpl of disc 1
+simpl of exposit 1
+simpl of expr 1
+simpl of implem 1
+simpl of not 2
+simpl of pr 1
+simpl on hot 1
+simpl onl liter 1
+simpl oper 1
+simpl optim 1
+simpl optim dappel 1
+simpl or condit 1
+simpl overview 1
+simpl overview strateg 1
+simpl pa 1
+simpl pa vu 1
+simpl pag 1
+simpl pag layout 1
+simpl par 1
+simpl par linterm 1
+simpl parallel 1
+simpl parallel algorithm 1
+simpl part 1
+simpl part part 1
+simpl pattern 1
+simpl pattern match 1
+simpl perm 1
+simpl perm de 1
+simpl peuv 1
+simpl peuv eviter 1
+simpl pock 1
+simpl pock calcl 1
+simpl pointer 1
+simpl pointer sur 1
+simpl polygon 1
+simpl pr 1
+simpl pr ec 1
+simpl preconditioner 1
+simpl preproc 1
+simpl preproc step 1
+simpl prim 1
+simpl proc 1
+simpl procedur 2
+simpl program 2
+simpl project 1
+simpl proof 2
+simpl proper 1
+simpl protocol 1
+simpl protocol toler 1
+simpl puisquil 1
+simpl puisquil ny 1
+simpl puisquil sagit 1
+simpl qu 3
+simpl qu etant 1
+simpl qu langu 1
+simpl qualit 1
+simpl r ef 1
+simpl r esolu 1
+simpl r ol 2
+simpl random 1
+simpl random algorithm 1
+simpl rcc 1
+simpl rcc rel 1
+simpl read 1
+simpl reconnect 1
+simpl recur 1
+simpl recur network 1
+simpl reduc 3
+simpl reduc system 1
+simpl refin 1
+simpl refin algorithm 1
+simpl reg 1
+simpl register 1
+simpl register ca 1
+simpl register problem 1
+simpl rl 1
+simpl rl combin 1
+simpl rout 1
+simpl rout funct 1
+simpl schedl 1
+simpl schedl strateg 1
+simpl secur 1
+simpl secur proper 1
+simpl select 1
+simpl select oper 1
+simpl semaphor 1
+simpl sent 1
+simpl sent ten 1
+simpl sent text 1
+simpl sharedmemor 1
+simpl sharedmemor multiproc 1
+simpl siml 2
+simpl siml de 1
+simpl sink 1
+simpl situ 1
+simpl solut 3
+simpl soum 1
+simpl sourc 1
+simpl sp 1
+simpl sp ec 1
+simpl sp ecif 1
+simpl specif 1
+simpl squar 1
+simpl squar error 1
+simpl stat 3
+simpl stat grad 1
+simpl stat test 1
+simpl step 1
+simpl strateg 1
+simpl string 1
+simpl string comparison 1
+simpl structur 2
+simpl structur wh 1
+simpl sub 1
+simpl substitut 1
+simpl substitut ou 1
+simpl substitut perm 1
+simpl subsum 1
+simpl subsum remov 1
+simpl symbol 1
+simpl symbol tabl 1
+simpl syntact 1
+simpl syntact manipl 1
+simpl task 1
+simpl task5 1
+simpl techniqu 2
+simpl tel 1
+simpl tel qu 1
+simpl term 1
+simpl term order 1
+simpl test 2
+simpl test de 1
+simpl th cur 1
+simpl th exposit 1
+simpl theor 1
+simpl timestamp 1
+simpl timestamp comput 1
+simpl to assum 1
+simpl to se 1
+simpl to show 1
+simpl to test 1
+simpl to verif 1
+simpl tr 1
+simpl tr parser 1
+simpl traff 1
+simpl traff workload 1
+simpl transfer 1
+simpl transfer de 1
+simpl transform 3
+simpl transform de 1
+simpl transl 2
+simpl tw level 2
+simpl typ 4
+simpl typ es 1
+simpl typ system 2
+simpl typ test 1
+simpl typ theor 1
+simpl un 2
+simpl un cr 1
+simpl un sel 1
+simpl upd 1
+simpl upd oper 1
+simpl user 1
+simpl user computer 1
+simpl util 1
+simpl util dun 1
+simpl var 1
+simpl vect 1
+simpl vect typ 1
+simpl vecteur 1
+simpl ver 2
+simpl wavel 1
+simpl wavel domain 1
+simpl we assum 1
+simpl we consider 1
+simpl we om 1
+simpl weight 1
+simpl weight dec 1
+simpl work 1
+simpl work ver 1
+simpl x interfac 1
+simpl136 1
+simplec 5
+simplec est 1
+simplec est lordr 1
+simplec est qu 1
+simplec etant 1
+simplec etant un 1
+simplec method 3
+simplec method tak 1
+simplec quon 1
+simplec quon trouv 1
+simplepr 1
+simpler 31
+simpler algorithm 1
+simpler an 1
+simpler and cleaner 1
+simpler and therefor 1
+simpler approach 1
+simpler connect 1
+simpler connect manag 1
+simpler construc 2
+simpler construc algorithm 1
+simpler context 1
+simpler control 1
+simpler control structur 1
+simpler el 1
+simpler error 1
+simpler error handl 1
+simpler exampl 1
+simpler for upd 1
+simpler forml 1
+simpler i quest 1
+simpler instruc 1
+simpler instruc gener 1
+simpler on 1
+simpler problem 2
+simpler proof 2
+simpler structur 1
+simpler sub 1
+simpler sub part 1
+simpler to proc 1
+simpler to us 1
+simpler when clr 1
+simplest 12
+simplest exampl 1
+simplest form 2
+simplest gener 1
+simplest implem 1
+simplest is cach 1
+simplest method 1
+simplest mult 1
+simplest mult level 1
+simplest of appl 1
+simplest repr 1
+simplest switch 1
+simplest switch network 1
+simplicit 3
+simplicit e de 2
+simplif 63
+simplif a polynom 1
+simplif abstract 1
+simplif abstract mach 1
+simplif addr 1
+simplif al inclus 1
+simplif al problem 1
+simplif algorithm 1
+simplif allow 1
+simplif and improv 1
+simplif and pur 1
+simplif and speed 1
+simplif as follow 1
+simplif assum 3
+simplif aus 1
+simplif aus la 1
+simplif aut 1
+simplif aut qu 1
+simplif ba 1
+simplif ba prolog 1
+simplif by not 1
+simplif by observ 1
+simplif by using 1
+simplif conjunct 1
+simplif control 1
+simplif control structur 1
+simplif correspon 1
+simplif correspon de 1
+simplif datab 1
+simplif datab softwar 1
+simplif definit1 1
+simplif design 1
+simplif ee 1
+simplif en 1
+simplif et eventuel 1
+simplif exampl 1
+simplif exposit 1
+simplif form 1
+simplif further 1
+simplif further recov 1
+simplif great 1
+simplif hardwar 1
+simplif hardwar implem 1
+simplif intersect 1
+simplif intersect proc 1
+simplif is fin 1
+simplif is reduc 1
+simplif is restrict 1
+simplif is0 1
+simplif l ecritur 1
+simplif la 1
+simplif la gest 1
+simplif le 2
+simplif le calcl 1
+simplif le ch 1
+simplif le expr 1
+simplif le pa 1
+simplif le raison 1
+simplif le trait 1
+simplif measur 1
+simplif method 1
+simplif neur 2
+simplif neur network 2
+simplif occur 1
+simplif of compon 1
+simplif of natur 1
+simplif or elim 1
+simplif or restrict 1
+simplif our an 1
+simplif our descript 1
+simplif our task 1
+simplif our transl 1
+simplif over user 1
+simplif ph 1
+simplif polynom 1
+simplif polynom constraint 1
+simplif polynom problem 1
+simplif proc 1
+simplif produc 1
+simplif program 2
+simplif rest 1
+simplif rest polynom 1
+simplif rl 1
+simplif secur 1
+simplif secur manag 1
+simplif symbol 1
+simplif symbol tabl 1
+simplif th aff 1
+simplif th an 1
+simplif th appl 1
+simplif th build 1
+simplif th cod 1
+simplif th conjunct 1
+simplif th construc 1
+simplif th dat 2
+simplif th deriv 1
+simplif th design 2
+simplif th developm 1
+simplif th disc 1
+simplif th exposit 1
+simplif th funct 1
+simplif th implem 2
+simplif th intellectu 1
+simplif th intersect 1
+simplif th log 1
+simplif th not 4
+simplif th pr 3
+simplif th prepar 1
+simplif th proof 2
+simplif th result 1
+simplif th task 3
+simplif th timestamp 1
+simplif th tot 1
+simplif th tr 1
+simplif th transl 1
+simplif that improv 1
+simplif their id 1
+simplif them exact 1
+simplif thing 1
+simplif thing henc 1
+simplif tot 1
+simplif tot deliv 1
+simplif tot protocol 1
+simplif unif 1
+simplif using 1
+simplif using quadr 1
+simplif val 1
+simplif ver 5
+simplif ver suit 1
+simplif vi cl 1
+simplif vs 1
+simplif vs del 1
+simplif we ge 1
+simplif we obtain 1
+simplif wer mad 1
+simplif yield 1
+simplif your design 1
+simplifypolynom 1
+simplioc 1
+simplioc consid 1
+simplioc consid rabl 1
+simposer 1
+simposer dan 1
+simposer dan la 1
+simpson 2
+simulateur 2
+simulateur perm 1
+simulateur perm de 1
+simulateur ser 1
+simulateur ser la 1
+simulateur va 1
+simulationdriver 1
+simultan 50
+simultan a gener 1
+simultan a minim 1
+simultan a number 1
+simultan acc 3
+simultan acc dict 1
+simultan account 1
+simultan and induc 1
+simultan arriv 1
+simultan arriv bar 1
+simultan at tim 1
+simultan build 1
+simultan by gener 1
+simultan by induc 1
+simultan by innermost 1
+simultan by min 1
+simultan confer softwar 1
+simultan connect 1
+simultan constraint 1
+simultan constraint satisf 1
+simultan dat 1
+simultan dat transfer 1
+simultan decr 1
+simultan del 1
+simultan developm 1
+simultan disk 1
+simultan disk fault 1
+simultan div 1
+simultan dual 1
+simultan dual major 1
+simultan e de 2
+simultan ee 2
+simultan ee de 1
+simultan ee par 1
+simultan ee sur 1
+simultan ement 3
+simultan ement dan 1
+simultan ement le 1
+simultan es 1
+simultan exchang 1
+simultan execut 2
+simultan execut help 1
+simultan handl 1
+simultan handl tag 1
+simultan hold 1
+simultan host 1
+simultan host crash 1
+simultan in tim 2
+simultan induc 1
+simultan influ 1
+simultan init 1
+simultan no 1
+simultan no suppr 1
+simultan observ 1
+simultan occur 1
+simultan optim 1
+simultan perform 1
+simultan perform el 1
+simultan plac 1
+simultan plac algorithm 1
+simultan request 1
+simultan satisf 1
+simultan shar 1
+simultan show 1
+simultan solut 1
+simultan solut strong 1
+simultan speech 1
+simultan speech dur 1
+simultan speech involut 1
+simultan speech utter 1
+simultan sub 1
+simultan sub task 1
+simultan tr 1
+simultan tr traver 1
+simultan transfer 1
+simultan upd 1
+simultan weak 1
+simultan writ 1
+simultan. 1
+sin 5
+sin erent 1
+sin erent dan 1
+sinclair 1
+sing 2
+sing th pr 1
+singapor 2
+singh 10
+singh and don 1
+singl 99
+singl accept 1
+singl accept method 1
+singl adapt 1
+singl adapt compon 1
+singl addr 3
+singl addr bottleneck 1
+singl addr spac 1
+singl addr unavail 1
+singl adr 1
+singl adr spac 1
+singl agent 1
+singl algebr 1
+singl algebr expr 1
+singl and mult 1
+singl and multipl 2
+singl appl 2
+singl ar 2
+singl ar resid 1
+singl argum 1
+singl assignm 2
+singl assignm rl 1
+singl assignm sem 1
+singl assm 1
+singl attribut 1
+singl back 1
+singl back scan 1
+singl best be 1
+singl bin 1
+singl bit 1
+singl bit posit 1
+singl block 2
+singl block typ 1
+singl board 2
+singl bof 1
+singl bof server 1
+singl bound 1
+singl cel 1
+singl cel prob 1
+singl centr 1
+singl centr queu 1
+singl ch 1
+singl ch point 1
+singl chang 1
+singl character 2
+singl character ai 1
+singl chip 1
+singl chunk 1
+singl chunk wid 1
+singl cl 2
+singl cl hierarch 1
+singl clock 1
+singl coin 1
+singl coin mak 1
+singl color 1
+singl color approach 1
+singl color dat 1
+singl color ind 1
+singl color key 1
+singl color list 1
+singl color qu 1
+singl color reg 1
+singl color retrief 1
+singl column 1
+singl com 1
+singl com avec 1
+singl command 1
+singl common 1
+singl common queu 1
+singl commun 3
+singl commun network 1
+singl commun ph 1
+singl commun start 1
+singl commun step 1
+singl composit 1
+singl composit separ 1
+singl constraint 2
+singl contour 1
+singl control 2
+singl control dep 1
+singl control system 1
+singl cop 2
+singl cop repl 1
+singl cpu 1
+singl cycl 2
+singl dat 1
+singl dat stream 1
+singl datum 1
+singl dest 1
+singl direct 1
+singl disk 1
+singl disk algorithm 1
+singl docum 1
+singl edg 4
+singl el 3
+singl entr 1
+singl equ 1
+singl equ form 1
+singl equiv 1
+singl er 2
+singl er el 1
+singl er qu 1
+singl escap 1
+singl escap instruc 1
+singl event 1
+singl event learn 1
+singl exerc 1
+singl exper 1
+singl explicit 1
+singl explicit st 1
+singl f op 1
+singl fact 1
+singl fact algorithm 1
+singl featur 1
+singl fil 2
+singl flit 1
+singl fragm 1
+singl fragm remain 1
+singl fram 1
+singl framework 1
+singl header 1
+singl header chunk 1
+singl hid 1
+singl hid layer 1
+singl high 1
+singl high level 1
+singl inherit 2
+singl inherit assum 1
+singl inherit cl 1
+singl inherit encour 1
+singl inherit good 1
+singl init 1
+singl init st 1
+singl inst 2
+singl instruc 2
+singl instruc stream 2
+singl interconnect 1
+singl interconnect link 1
+singl interfac 2
+singl interv 1
+singl iter 1
+singl join 1
+singl langu 3
+singl layer 1
+singl layer recur 1
+singl layer rn 1
+singl lec 1
+singl lec group 1
+singl letter 1
+singl letter nam 1
+singl level 3
+singl level datab 1
+singl level model 1
+singl level system 1
+singl lin 5
+singl lin chang 1
+singl lin edg 1
+singl lin equ 1
+singl lin transform 1
+singl link 2
+singl link edg 1
+singl link failur 1
+singl list 1
+singl loc 1
+singl loc chang 1
+singl log 1
+singl log record 1
+singl loop 2
+singl loop transform 2
+singl manag 1
+singl manag pol 1
+singl map 1
+singl matr 1
+singl maxim 1
+singl me 3
+singl menu 1
+singl method 1
+singl method invoc 1
+singl mod 1
+singl model 1
+singl model modl 1
+singl most distinct 1
+singl most prob 1
+singl mp 1
+singl mp recv 1
+singl mult 1
+singl mult chip 1
+singl multicast 1
+singl multicast broadcast 1
+singl multipl 1
+singl n1nf 1
+singl n1nf tupl 1
+singl net 1
+singl net experim 1
+singl net giv 1
+singl net system 1
+singl net train 1
+singl network 1
+singl network find 1
+singl neur 1
+singl neur network 1
+singl nextpack 1
+singl nextpack pointer 1
+singl nod 8
+singl nod ca 1
+singl nod extern 1
+singl nod tr 1
+singl non 1
+singl non fault 1
+singl norm 2
+singl norm leaf 1
+singl norm step 1
+singl not 1
+singl numer 1
+singl object 2
+singl object method 1
+singl occur 1
+singl oper 1
+singl optim 1
+singl optim return 1
+singl or mult 1
+singl or multipl 3
+singl order 1
+singl other structur 1
+singl output 3
+singl output port 1
+singl output unit 1
+singl pa 2
+singl pack 2
+singl pair 1
+singl pandemon 1
+singl part 1
+singl partit 1
+singl pat 1
+singl pat ba 1
+singl path 1
+singl pattern 2
+singl ph 2
+singl ph ca 1
+singl ph implem 1
+singl phy 1
+singl phy log 1
+singl pi 1
+singl pivot 1
+singl point 5
+singl pointer 1
+singl polygon 1
+singl port 1
+singl port hypercub 1
+singl pr 1
+singl pr nod 1
+singl prec 1
+singl prec peak 1
+singl prim 1
+singl prim rel 1
+singl proc 9
+singl proc ba 1
+singl proc ca 1
+singl proc execut 1
+singl proc memor 1
+singl procedur 1
+singl program 3
+singl program multipl 3
+singl programmer 1
+singl programmultipl 1
+singl programmultipl dat 1
+singl prompt 1
+singl prototyp 1
+singl qualif 1
+singl qualif tupl 1
+singl queu 1
+singl queu acc 1
+singl reader 1
+singl record 2
+singl reduc 2
+singl reduc oper 1
+singl rel 1
+singl rel tak 1
+singl remot 1
+singl remot writ 1
+singl renam 1
+singl renam direct 1
+singl result 1
+singl rn 1
+singl rn learn 1
+singl rot 1
+singl rot rl 1
+singl se 4
+singl se valu 1
+singl sect 1
+singl sequ 1
+singl sequ proc 1
+singl serv 2
+singl serv addr 1
+singl serv level 1
+singl server 1
+singl shuffl 1
+singl shuffl run 1
+singl simpl 1
+singl simpl reg 1
+singl smal window 1
+singl sourc 2
+singl sourc shortest 1
+singl st 1
+singl st med 1
+singl stat 1
+singl step 7
+singl step bfg 1
+singl step bit 1
+singl step parallel 1
+singl step predict 1
+singl step reduc 1
+singl string 1
+singl strong 1
+singl strong activ 1
+singl structur 1
+singl supernod 1
+singl switch 1
+singl system 3
+singl task 2
+singl task system 1
+singl tdfg 1
+singl tempor 1
+singl tempor rel 1
+singl term 2
+singl test 2
+singl thread 2
+singl thread chain 1
+singl tim 1
+singl tim valu 1
+singl tok 1
+singl tok lookahead 1
+singl traver 1
+singl tupl 3
+singl tupl compon 1
+singl typ 1
+singl un 1
+singl un ch 1
+singl undiffer 1
+singl undiffer reg 1
+singl unit 1
+singl user 3
+singl valu 8
+singl valu decomposit 2
+singl valu rel 1
+singl valu repr 1
+singl var 7
+singl ver 1
+singl vid 1
+singl vid tap 1
+singl viol 1
+singl virtu 1
+singl virtu circuit 1
+singl walk 1
+singl worm 1
+singl worm using 1
+singl writer 1
+singl writer multipl 1
+singl writer register 1
+singl writer restrict 1
+singularit 1
+sinh 1
+siniolak 1
+sink 4
+sink compon 1
+sink compon inst 1
+sink nod 1
+sink pair 1
+sink pair go 1
+sink st 1
+sink workload 1
+sink workload pair 1
+sinon 4
+sinon el 1
+sinon el echou 1
+sinon il 1
+sinon imp 1
+sinon la 2
+sinon la nouvel 1
+sinon le 1
+sinon le point 1
+sinon lesp 1
+sinon lesp eranc 1
+sinon passer 1
+sinon s electionner 1
+sinon si 1
+sinon t est 1
+sinon xz 1
+sinon xz xc 1
+sinon xz xr 1
+sinscrit 1
+sinscrit pa 1
+sinscrit pa dan 1
+sinspir 2
+sinspir de 1
+sinspir de la 1
+sinspir direct 1
+sinspir direct de 1
+sint 4
+sint egr 2
+sint egr dan 1
+sint egr pa 1
+sint er 3
+sint er au 1
+sint er aux 1
+sint er enfin 1
+sint er maint 1
+sint er particl 1
+sint er plut 1
+sint eresser 1
+sint eresser qu 1
+sintercaler 1
+sintercaler entr 1
+sintercaler entr le 1
+sinterdir 1
+sinterdir le 1
+sinterdir le aut 1
+sinterdir lutil 1
+sinterdir lutil de 1
+sinterdit 1
+sinterdit donc 1
+sinterdit donc de 1
+sinver 1
+sinver lorsqu 1
+sinver lorsqu le 1
+siolut 1
+sion 2
+sion low 1
+sion low level 1
+siq 1
+siqu 1
+siqu compl 1
+siqu compl te 1
+siqu dan 1
+siqu pa 1
+siqu pa par 1
+siqu pour 1
+siqu pour le 1
+siqu rest 1
+siqu rest glob 1
+siqu san fair 1
+siqu sur 1
+siqu sur certain 1
+sir 2
+sir william 1
+sir william brag 1
+sir93 1
+sirent 1
+sirent cr 1
+sirent cr er 1
+sirkin 1
+sirkin and jeff 1
+sisctus 1
+sisd 1
+sisd est 1
+sisd est lordinateur 1
+sisd et mimd 1
+sisj 1
+sisj whenever fk 1
+sistem 1
+sistem inform 1
+sistem inform at 1
+sit 28
+sit a enabl 1
+sit a perm 1
+sit a server 1
+sit a sit 1
+sit actif 1
+sit actif ou 1
+sit al bridg 1
+sit and adapt 1
+sit and addr 1
+sit and disk 1
+sit and research 1
+sit and st 1
+sit and suggest 1
+sit ar ad 1
+sit ar bridg 1
+sit ar repr 1
+sit ar simpl 1
+sit as outlin 1
+sit as signif 1
+sit at http 1
+sit b sit 1
+sit biconnect 1
+sit by 100s 1
+sit by hand 1
+sit c sit 1
+sit classiqu 1
+sit classiqu sur 1
+sit de 1
+sit de c1 1
+sit de cr 1
+sit de mut 1
+sit destinatair 1
+sit es 1
+sit es server 1
+sit est 1
+sit est toujour 1
+sit failur 1
+sit failur occur 1
+sit ftp 1
+sit ftp.cs.umd.edu 1
+sit ftp.uw.fi 1
+sit ftp.uw.fi direct 1
+sit ha weight 1
+sit i dec 1
+sit i instruc 1
+sit i upd 1
+sit identif 1
+sit in g0 1
+sit in init 1
+sit ind 1
+sit inform 1
+sit input 1
+sit is allow 1
+sit is biconnect 1
+sit is bridg 1
+sit is ch 1
+sit is execut 1
+sit is np 1
+sit is repr 1
+sit j del 1
+sit j propag 1
+sit j receiv 1
+sit j sen 1
+sit j wait 1
+sit li 1
+sit master 1
+sit master loc 1
+sit nam 1
+sit of oeab 1
+sit or addr 1
+sit ou 1
+sit ou bien 1
+sit pi 1
+sit propag 1
+sit pushpl.html 1
+sit s fp 1
+sit start 1
+sit succ 1
+sit th monit 1
+sit that form 1
+sit that prov 1
+sit then upd 1
+sit tok 1
+sit tw edg 1
+sit un sit 1
+sit upd 1
+sit wait 1
+sit wh 1
+sit wh voron 1
+sit wh weight 1
+sit with perform 1
+sit with repl 1
+situ 62
+situ act 1
+situ al direct 1
+situ altern 1
+situ altern refut 1
+situ alternativerefut 1
+situ an ar 1
+situ an expect 1
+situ apr 1
+situ apr es 1
+situ ar 2
+situ ar error 1
+situ ar froz 1
+situ ar illustr 1
+situ ar shown 1
+situ assessm 1
+situ autour 1
+situ autour dun 1
+situ avant 1
+situ avant coupur 1
+situ becom 2
+situ by re 1
+situ calculus 1
+situ de 1
+situ de retour 1
+situ describ 1
+situ each hour 1
+situ ee 1
+situ ee entr 1
+situ ee sur 1
+situ encounter 1
+situ entr 1
+situ entr lestampil 1
+situ entr un 1
+situ est 2
+situ est bien 1
+situ est diff 1
+situ in markov 1
+situ in way 1
+situ involut 1
+situ involut group 1
+situ is aggrav 1
+situ is identif 1
+situ is rar 1
+situ is recogn 1
+situ is said 1
+situ is structur 1
+situ le 1
+situ le mach 1
+situ may occur 1
+situ occur 5
+situ of cl 1
+situ of figur 1
+situ or behaviour 1
+situ or el 1
+situ overlook 1
+situ particl 1
+situ particl er 1
+situ proper 1
+situ seem 1
+situ sem 1
+situ shown 1
+situ similair 1
+situ th cur 1
+situ that occur 1
+situ that requir 1
+situ that t0 1
+situ to mak 1
+situ under ii 1
+situ using 1
+situ using heap 1
+situ using ordin 1
+situ using triangl 1
+situ wh 9
+situ wh particip 1
+situ wherein 1
+situ which caus 1
+situ which requir 1
+situ which turn 1
+situ with expect 1
+situer 1
+situer ain 1
+situer ain le 1
+siv 2
+siv cs.umn.edu 1
+siv cs.umn.edu kumar 1
+siv en 1
+sivakumar 1
+sivakumar rav 1
+sivakumar rav vipin 1
+sivaram 1
+sivaram and dhabaleswar 1
+sivaram dhabaleswar 1
+sixt 2
+sixt funct 1
+sixt recur 1
+sixt recur cal 1
+sixteen 1
+sixteen se 1
+sixteenth 1
+sixteenth acm 1
+sixth 17
+sixth acm 1
+sixth acm symp 1
+sixth and seventh 1
+sixth annu 5
+sixth annu acm 2
+sixth annu pacif 1
+sixth annu workshop 1
+sixth claus 1
+sixth claus simp 1
+sixth great 1
+sixth great lak 1
+sixth ie 1
+sixth ie sypmp 1
+sixth intern 7
+sixth intern workshop 1
+sixth quest 1
+sixth siam 2
+siz 90
+siz 16x24 1
+siz 1mb 1
+siz 2k0 1
+siz 2n 1
+siz 2we 1
+siz a tion 1
+siz achief 1
+siz affect 1
+siz affect speedup 1
+siz agr 1
+siz alloc 1
+siz allow 2
+siz alw return 1
+siz and altern 2
+siz and channel 1
+siz and commun 1
+siz and complec 2
+siz and le 1
+siz and loc 1
+siz and me 1
+siz and non 1
+siz and oe 1
+siz and or 1
+siz and pack 1
+siz and perform 1
+siz and phy 1
+siz and posit 1
+siz and program 1
+siz and rang 1
+siz and relabel 1
+siz and shap 3
+siz and sl 1
+siz and spat 1
+siz and st 1
+siz and stud 1
+siz and text 1
+siz and topolog 2
+siz and typ 1
+siz and weight 1
+siz appear 1
+siz appl 1
+siz ar giv 1
+siz ar incr 2
+siz arbitr 1
+siz as describ 1
+siz as power 1
+siz attain 1
+siz av 1
+siz av stder 1
+siz b0 1
+siz b0 pb 1
+siz becom 2
+siz becom closer 1
+siz block 1
+siz bound 1
+siz buck 1
+siz c incr 2
+siz c no.ofcluster 2
+siz c pag 1
+siz c0 1
+siz calcl 1
+siz cannot grow 2
+siz cel 2
+siz cf 1
+siz chunk 2
+siz cl 1
+siz cl eff 1
+siz cod 1
+siz cod tr 1
+siz coh 1
+siz coh cach 1
+siz comput 1
+siz contribut 1
+siz copt 1
+siz correspon 1
+siz cr 1
+siz defin 1
+siz design 1
+siz determin 2
+siz equ 1
+siz etc 4
+siz expr 2
+siz f flit 1
+siz fact 1
+siz fit 1
+siz for ca 1
+siz for connect 1
+siz for flow 1
+siz for imag 1
+siz for maxim 1
+siz for pbm 1
+siz for pool 1
+siz for se 1
+siz for specl 1
+siz for test 1
+siz greater 2
+siz ha sw 1
+siz hav grown 2
+siz hold 1
+siz in by 1
+siz in exc 1
+siz in execut 1
+siz in pag 1
+siz in pract 1
+siz in sect 1
+siz in term 2
+siz incr 3
+siz int account 1
+siz is 1k 1
+siz is adequ 1
+siz is assoc 2
+siz is bound 1
+siz is favor 1
+siz is incr 1
+siz is kept 1
+siz is lim 1
+siz is prefer 1
+siz is rcmac 1
+siz is rcr 1
+siz is restrict 2
+siz is scal 1
+siz is simil 1
+siz is unb 1
+siz is var 1
+siz it receiv 1
+siz jaj 1
+siz jaj jbj 1
+siz jt 1
+siz k0 1
+siz larger 1
+siz layout 1
+siz lead 1
+siz lim 2
+siz lin 3
+siz lin program 1
+siz log 1
+siz maxboard 2
+siz maxboard sizeimprov 2
+siz method 1
+siz method return 1
+siz minimiz 1
+siz n built 1
+siz n con 1
+siz n domin 1
+siz n log 1
+siz n using 1
+siz n1 1
+siz nd 1
+siz network 1
+siz neur 1
+siz neur network 1
+siz nj 1
+siz np2 1
+siz nt 1
+siz of candid 1
+siz of cl 1
+siz of connect 1
+siz of correspon 1
+siz of cur 1
+siz of d0 1
+siz of datab 1
+siz of edg 1
+siz of extract 1
+siz of ffq0 1
+siz of g0 1
+siz of g1 1
+siz of input 1
+siz of level 2
+siz of marker 1
+siz of network 1
+siz of pack 1
+siz of polygon 1
+siz of postf 1
+siz of proc 2
+siz of q0 1
+siz of reg 1
+siz of request 1
+siz of se 1
+siz of select 1
+siz of sp 1
+siz of system 1
+siz of til 1
+siz of transact 1
+siz of ttl 1
+siz of uj 1
+siz of wj 1
+siz offer 1
+siz offer sw 1
+siz or complec 1
+siz pack 2
+siz parameter 3
+siz parameter mak 1
+siz parameter se 1
+siz per method 1
+siz perform 1
+siz perform impact 1
+siz pinout 2
+siz pinout den 2
+siz pn 1
+siz polylogarithm 1
+siz polynom 2
+siz problem 3
+siz problem comput 1
+siz produc 1
+siz produc com 1
+siz program 1
+siz ps 1
+siz q smallq 1
+siz qx 1
+siz qx qy 1
+siz r k1 1
+siz rang 1
+siz rang predomin 1
+siz reach 1
+siz reduc 3
+siz rel 1
+siz repr 1
+siz requir 1
+siz restrict 1
+siz segm 1
+siz select 1
+siz smaller 1
+siz specif 1
+siz sub 1
+siz support 1
+siz system 1
+siz tech 2
+siz ten 1
+siz th larger 1
+siz th network 1
+siz th se 1
+siz th surfac 2
+siz that minimiz 1
+siz that y1 1
+siz to larger 1
+siz to show 1
+siz to var 1
+siz tok 1
+siz under ts 1
+siz uniform 2
+siz uniform traff 2
+siz unit 1
+siz unoptim 1
+siz unoptim upd 1
+siz upt 3
+siz upt ten 2
+siz us 1
+siz us incr 1
+siz using 2
+siz using larger 1
+siz using pbm 1
+siz vect 1
+siz versus backlog 1
+siz vol 1
+siz vs 1
+siz vs responc 1
+siz wa ch 1
+siz wa deriv 1
+siz wa var 1
+siz wer inferior 1
+siz which return 1
+siz whil interconnect 1
+siz whil scal 1
+siz wil forc 1
+siz wil lim 1
+siz wil result 1
+siz with 3d 2
+siz with channel 1
+siz with chunk 1
+siz with fic 2
+siz with larger 1
+siz work 1
+siz work reason 1
+sizebig 1
+sizebig chunk 1
+sizebig chunk siz 1
+sizec 2
+sizec actualbisect 2
+sizec actualbisect bandwidth 2
+sizeimprov 2
+sizeimprov in board 2
+sizeof 1
+sizing 1
+sizing adm 1
+sizing ar correct 1
+sizing of o5 1
+sj 9
+sj con 1
+sj contain 1
+sj en 1
+sj fr 1
+sj int intern 1
+sj is assign 1
+sj is denot 1
+sj is empt 1
+sj is writ 1
+sj k2m 1
+sj odin 1
+sj oland 1
+sj origin 1
+sj produc 1
+sj read 1
+sj using 1
+sj whenever fk 1
+sj0 1
+sj0 dur writ 1
+sj0 in writ 1
+sj2 1
+sj2e 1
+sj2e tj 1
+sjr91 1
+sjx1j 1
+sjxj 1
+sk 9
+sk and smj 1
+sk c qk 1
+sk li 1
+sk li ae 1
+sk lj 1
+sk lj aej 1
+sk mac 1
+sk pi 1
+sk pk 1
+sk si 1
+sk si sj 1
+sk sisj 1
+sk sm 1
+sk smj 1
+sk with ind 1
+sk83 1
+skel 4
+skel ar good 1
+skel cr 1
+skel cut 1
+skel describ 1
+skel ev 1
+skel ev s2 1
+skel in fact 1
+skel li 1
+skel lying 1
+skel or extern 1
+skel repr 1
+skel st 1
+skel ten 1
+skel th edg 1
+skept 1
+sketch 13
+sketch a clever 1
+sketch an exampl 1
+sketch cr 1
+sketch hilog 1
+sketch id 1
+sketch in sect 1
+sketch model 1
+sketch of theorem 1
+sketch onl brief 1
+sketch th ba 1
+sketch th ec 1
+sketch th method 1
+sketch th proof 2
+sketch th syntac 1
+skew 9
+skew acc 1
+skew acc pattern 1
+skew and loop 1
+skew and text 1
+skew angl 1
+skew distribut 1
+skew herm 1
+skew herm solut 1
+skew is lower 1
+skew iter 1
+skew iter spac 1
+skew matr 1
+skew nest 1
+skew nest loop 1
+skew pag 1
+skew symmeter 1
+skew symmeter damp 1
+skew th nest 1
+skew transform 1
+skew weigh 1
+skew weigh matr 1
+skew workload 1
+skew workload refer 1
+skgk 1
+skgk 2i 1
+skil 7
+skil ar po 1
+skil dnamev 1
+skil emp 1
+skil emp s1 1
+skil from emp 1
+skil from empttl 1
+skil hist 1
+skil human 1
+skil human oper 1
+skil of empl 1
+skil of exper 1
+skil valu 1
+skillst 1
+skillsu 1
+skillsv 1
+skillsv from emp 1
+skillsv from empsk 1
+skim 1
+skin 1
+skinner 1
+skip 13
+skip equiv 1
+skip equiv configur 1
+skip j stop 1
+skip level 1
+skip may term 1
+skip sect 1
+skip step 1
+skip th rout 1
+skip to sect 1
+skl 1
+skl atl 1
+skl is indeed 1
+skov 1
+skov fon 1
+sky 1
+skyblu 1
+skyblu al realiz 1
+sl 15
+sl ar altern 1
+sl ar black 1
+sl ar compl 1
+sl ar join 1
+sl ar repr 1
+sl be distinct 1
+sl complec 1
+sl dist 1
+sl empl 1
+sl find 1
+sl find s5 1
+sl for 1
+sl for log 1
+sl is comput 1
+sl is greater 1
+sl is term 1
+sl lj 1
+sl n log 1
+sl of ar 1
+sl of tw 1
+sl of width 1
+sl oper 1
+sl oper trim 1
+sl repr 1
+sl t level 1
+sl tim 1
+sl tim unit 1
+sl valu 1
+sl1 1
+sl1 actu 1
+sl1 actu param 1
+sl1 al prov 1
+sl1 and disc 1
+sl1 by explicit 1
+sl1 construc 1
+sl1 decl 1
+sl1 faith 1
+sl1 form 1
+sl1 form param 1
+sl1 giv 1
+sl1 giv finer 1
+sl1 ha transit 1
+sl1 import 1
+sl1 import decl 1
+sl1 is abl 1
+sl1 mathemat 1
+sl1 mathemat toolkit 1
+sl1 modl 1
+sl1 modl cl 1
+sl1 modl concept 1
+sl1 modl correspon 1
+sl1 modl cylinder 1
+sl1 modl dec 1
+sl1 modl decl 1
+sl1 modl defin 1
+sl1 modl mechan 1
+sl1 modl renam 1
+sl1 modl structur 1
+sl1 parameter 1
+sl1 parameter modl 1
+sl1 perform 1
+sl1 prov 1
+sl1 prov construc 1
+sl1 prov explicit 1
+sl1 specif 1
+sl1 specif defin 1
+sl1 specif faith 1
+sl1 specif model 1
+sl1 specif modl 1
+sl1 th vi 1
+sl1 theor 1
+sl1 theor ba 1
+sl1 to ad 1
+sl1 to erg 1
+sl1s 1
+sl1s vi 1
+sl1s vi decl 1
+sl94 1
+slack 1
+slack var 1
+slack variabl 1
+slad 1
+slap 1
+slav 2
+slav corrobor 1
+slav in order 1
+slav is upd 1
+slav list 1
+slav loc 1
+slav loc agr 1
+slav loc del 1
+slav loc giv 1
+slav loc interfac 1
+slav loc pol.list.first 1
+slav loc pol.list.next 1
+slav loc request 1
+slav or master 1
+slav proc 1
+slav refer 1
+slav refer cur 1
+slav return 1
+slav to respon 1
+slav.loc 1
+slav.nextloc 1
+slb 2
+slb and ebd 1
+slb as describ 1
+slb coupl 1
+slb is for 1
+slb method 1
+slb n mc 1
+slb th me 1
+slb with system 1
+slc 1
+slc lj 1
+sld 5
+sld a lempil 1
+sld deriv 2
+sld deriv denot 1
+sld deriv sem 1
+sld deriv shown 1
+sld deriv st 1
+sld en 1
+sld est 1
+sld fin 1
+sld refut 1
+sld resolut 2
+sld sappliqu 1
+sld tr 2
+sleep 2
+sleep for period 1
+slider 1
+slider init 1
+slider init appropr 1
+slight 40
+slight addit 1
+slight addit decod 1
+slight bal 1
+slight better approach 1
+slight better order 1
+slight better result 2
+slight better schedl 1
+slight bi 1
+slight by incr 1
+slight by st 1
+slight concav 1
+slight concav appear 1
+slight degrad 1
+slight del 1
+slight differ alignm 1
+slight differ fash 1
+slight differ filter 1
+slight differ form 1
+slight differ manner 1
+slight differ se 1
+slight expan 1
+slight ext 2
+slight ext ver 1
+slight faster 1
+slight high 4
+slight high accur 1
+slight high speedup 1
+slight improv 1
+slight in rt3 1
+slight incr 3
+slight larger 2
+slight le eff 1
+slight lower 3
+slight lower aver 1
+slight lower satur 1
+slight modif 4
+slight mor complec 2
+slight mor cost 1
+slight mor expr 1
+slight mor gener 1
+slight mor liber 1
+slight outperform 2
+slight overhead 1
+slight problem 1
+slight reduc 1
+slight simpler 1
+slight slower 2
+slight slower rat 1
+slight to accommod 1
+slight to inclus 1
+slight to perform 1
+slight to us 1
+slight wast 1
+slight with tim 1
+slight wor 1
+slip 1
+slit 1
+sloan 2
+sloan fellowship 1
+slogan 1
+slogan that welltyp 1
+slop 6
+slop approach 1
+slop attribut 1
+slop attribut dat 1
+slop chang 1
+slop chang dep 1
+slop equ 1
+slop k mechan 1
+slop k undefin 1
+slot 7
+slot acc 1
+slot acc cl 1
+slot acc comput 1
+slot acc protocol 1
+slot acc tak 1
+slot accord 1
+slot and cl 1
+slot and me 1
+slot and method 1
+slot appear 1
+slot ar ignor 1
+slot ar init 1
+slot bound 1
+slot cal initarg 1
+slot defin 1
+slot describ 1
+slot descript 1
+slot descript assoc 1
+slot descript cl 1
+slot descript contain 1
+slot descript correspon 1
+slot descript default 1
+slot descript describ 1
+slot descript direct 1
+slot descript distingu 1
+slot descript inh 1
+slot descript initarg 1
+slot descript initfunct 1
+slot descript metaobject 1
+slot descript nam 1
+slot descript object 1
+slot descript sd 1
+slot descript slot 1
+slot filler 1
+slot for nod 1
+slot gender 1
+slot gender fem 1
+slot in direct 1
+slot in quest 1
+slot initarg 1
+slot is determin 1
+slot nam 1
+slot nam follow 1
+slot nam slot 1
+slot of direct 1
+slot of event 1
+slot opt 1
+slot or addit 1
+slot or cl 1
+slot or giv 1
+slot posit 1
+slot reader 1
+slot reader cl 1
+slot reader slot 1
+slot remain 1
+slot remain unbound 1
+slot singl 1
+slot singl reader 1
+slot spec 1
+slot spec inh 1
+slot specif 2
+slot specif gender 1
+slot specif slot 1
+slot that satisf 1
+slot valu 1
+slot valu found 1
+slot valu using 1
+slot within inst 1
+slot writer 1
+slot writer cl 1
+slot writer slot 1
+slotopt 1
+slotopt caus 1
+slov 1
+slov e mail 1
+slov under grant 1
+slow 26
+slow an 1
+slow an proc 1
+slow and cur 1
+slow and therefor 1
+slow begin 1
+slow chang 1
+slow chang tren 1
+slow commun 1
+slow commun channel 1
+slow compil 1
+slow congest 1
+slow congest network 1
+slow cpu 1
+slow decr 1
+slow down part 1
+slow execut 1
+slow execut speed 1
+slow fallback 1
+slow fallback implem 1
+slow mot 1
+slow network 1
+slow on tap 1
+slow perform 1
+slow perform knowledg 1
+slow rel 1
+slow var 1
+slow when using 1
+slowdown 1
+slowdown proport 1
+slower 17
+slower cpu 1
+slower decst 1
+slower derefer 1
+slower for object 1
+slower network 1
+slower on weaker 1
+slower rat 1
+slower respon 2
+slower respon tim 1
+slower solut 1
+slower than acc 1
+slower than aquarius 1
+slower than coar 1
+slower than compil 1
+slower than rm 1
+slower then tt 1
+slowest 3
+slowest grow 1
+slowest grow fragm 1
+slowest proc 2
+slowselect 1
+slp 1
+slp91 1
+slrn 1
+slrn a bi 1
+slrn actu 1
+slrn actu learn 1
+slrn actu us 1
+slrn ad 1
+slrn chang 1
+slrn giv 1
+slrn giv dat 1
+slrn ha indeed 1
+slrn is check 1
+slrn is shown 1
+slrn learn 1
+slrn might construc 1
+slrn network 1
+slrn repr 1
+slrn wa abl 1
+slrn wil actu 1
+slrn wil learn 1
+slrn wil tak 1
+slrn wil therefor 1
+slrn wil try 1
+slug 1
+sm 8
+sm84 1
+sm85 1
+sm93 1
+smacof 1
+smal 1
+smal model 1
+smallbur 1
+smallbur bal 1
+smallbur bal superior 1
+smaller 51
+smaller ar 1
+smaller ar dim 1
+smaller aver 1
+smaller aver degr 1
+smaller bandwidth 1
+smaller bandwidth result 1
+smaller becaus prompt 1
+smaller bi 1
+smaller can saf 1
+smaller canon 1
+smaller canon decomposit 1
+smaller cluster 3
+smaller cluster siz 3
+smaller cluster technolog 1
+smaller coar 1
+smaller coar nod 1
+smaller coarser 1
+smaller congest 1
+smaller constraint 1
+smaller constraint cel 1
+smaller cycl 1
+smaller cycl tim 1
+smaller diagram 1
+smaller dim 1
+smaller edg 1
+smaller edg cut 1
+smaller edg weight 1
+smaller el 1
+smaller execut 1
+smaller execut tim 1
+smaller expon 1
+smaller failover 1
+smaller failover tim 1
+smaller fragm 1
+smaller fragm grow 1
+smaller gain 1
+smaller graph 1
+smaller graph g1 1
+smaller graph gi 1
+smaller heap 1
+smaller imag 1
+smaller inter 1
+smaller inter cluster 1
+smaller lead 2
+smaller learn 1
+smaller learn rat 1
+smaller level 1
+smaller level number 1
+smaller me 1
+smaller me length 1
+smaller ms 1
+smaller network 2
+smaller network organ 1
+smaller nod 2
+smaller nod repr 1
+smaller nod separ 1
+smaller number 3
+smaller on 1
+smaller or equ 1
+smaller pandemon 1
+smaller pandemon system 1
+smaller popl 1
+smaller popl siz 1
+smaller posit 1
+smaller posit self 1
+smaller se 1
+smaller self 1
+smaller self dual 1
+smaller siz 1
+smaller subgraph 1
+smaller supernod 1
+smaller t level 1
+smaller td 1
+smaller th number 1
+smaller th valu 1
+smaller th window 1
+smaller than min 1
+smaller than pag 1
+smaller than reserv 1
+smaller than zer 1
+smaller tim 2
+smaller tim parameter 1
+smaller tlevel 1
+smaller unit 2
+smaller valu 2
+smallest 29
+smallest allow 1
+smallest allow chunk 1
+smallest edg 1
+smallest edg separ 1
+smallest eigenvalu 1
+smallest el 1
+smallest el e0 1
+smallest el en 1
+smallest el om 1
+smallest el tak 1
+smallest el using 1
+smallest ident 1
+smallest imag 1
+smallest imag unit 1
+smallest in f1 1
+smallest ind 1
+smallest integer 1
+smallest is ch 1
+smallest key 2
+smallest known 1
+smallest known worst 1
+smallest label 1
+smallest level 1
+smallest level number 1
+smallest n el 1
+smallest number 3
+smallest on 1
+smallest over 1
+smallest over run 1
+smallest part 1
+smallest po compar 1
+smallest po nod 1
+smallest posit 1
+smallest posit integer 1
+smallest problem 1
+smallest proper 1
+smallest proper supertyp 1
+smallest queu 1
+smallest queu el 1
+smallest rat 1
+smallest record 1
+smallest rel 2
+smallest rel mobil 1
+smallest remain 1
+smallest remain loc 1
+smallest sampl 1
+smallest se 1
+smallest se contain 1
+smallest start 1
+smallest start tim 1
+smallest strict 1
+smallest strict pref 1
+smallest sub 1
+smallest ten 1
+smallest ten problem 1
+smallest tot 1
+smallest tot number 1
+smallest valu 1
+smallest valu satisf 1
+smallq 1
+smalltalk 5
+smalltalk compiler 1
+smalltalk compiler sourc 1
+smalltalk requir 1
+smalltalk styl 1
+smalltalk styl object 1
+smalltalk th part 1
+smart 5
+smart init 1
+smart init strateg 1
+smart search 1
+smart search strateg 1
+smart stupid 1
+smart stupid oracl 1
+smart supersc 1
+smart supersc ye 1
+smart way 1
+smash 1
+smc 1
+smd 2
+smd d1 1
+smd d1 d2 1
+smd technolog 1
+smear 1
+smear or whit 1
+smear proc 1
+smeulder 1
+smid 1
+smiej 1
+smiej gmdz.uucp 1
+smiej smiej 1
+smiej smiej gmdz.uucp 1
+smirnov 1
+smith 20
+smith and ian 1
+smith and wit 1
+smith de 1
+smith for numer 1
+smith ne 1
+smith ne cont 1
+smith rober 1
+smith suggest 1
+smith wh help 1
+smj 1
+smj and fmj 1
+smj and pi 1
+smj f aj 1
+smj li 1
+smj li ae 1
+smj lj 1
+smj lj aej 1
+smj mac 1
+smj p ci 1
+smj pi 1
+smj pj 1
+smj saj 1
+sml 1
+sml garb 1
+sml garb collect 1
+smok 1
+smok habit 1
+smoker 1
+smol 1
+smolensk 1
+smolk 2
+smooth 15
+smooth and constrain 1
+smooth and detail 1
+smooth and match 1
+smooth anim 1
+smooth approxim 1
+smooth aspect 1
+smooth aspect describ 1
+smooth aver 1
+smooth aver oracl 1
+smooth aver specl 1
+smooth chang 1
+smooth compact 1
+smooth compact manifold 1
+smooth compon 1
+smooth compon prov 1
+smooth constraint 1
+smooth cylindr 1
+smooth cylindr surfac 1
+smooth ext 1
+smooth forml 1
+smooth funct 1
+smooth grad 1
+smooth grad approxim 1
+smooth integr 2
+smooth interpol 1
+smooth is defin 1
+smooth is measur 1
+smooth is most 1
+smooth lin 1
+smooth number 1
+smooth of parallel 1
+smooth of reconstruc 1
+smooth oper 1
+smooth profil 1
+smooth proper 1
+smooth proper cit 1
+smooth result 1
+smooth tempor 1
+smooth tempor profil 1
+smooth th dec 1
+smooth th result 1
+smooth th var 1
+smooth thin 1
+smooth thin lin 1
+smooth ver 1
+smooth wa measur 1
+smooth which quantif 1
+smoothabil 1
+smoother 2
+smoother dec 1
+smoother dec bound 1
+smoothest 1
+smp 1
+smuggl 1
+smuggl bust 1
+smuggl by terror 1
+smuggl ca 1
+smuggl drug 1
+smyth 1
+sn 14
+sn a t1 1
+sn a u1 1
+sn and snj 1
+sn do j1 1
+sn en 1
+sn fun 1
+sn fx 1
+sn lastnod4 1
+sn lastnod4 si 1
+sn pi 1
+sn ppb 1
+sn q 1e 1
+sn qe 1
+sn root3 1
+sn root3 s0 1
+sn s1 1
+sn s1 sn 1
+sn sn 1
+sn stat 1
+sn stat nod 1
+sn switch 1
+sn switch ofst 1
+sn variabl 1
+sn0 1
+sn0a 1
+sn0b 1
+sn0c 1
+sn0d 1
+sn0e 1
+sn0f 1
+sn1 1
+sn10 1
+sn11 1
+sn1a 1
+sn1b 1
+sn1c 1
+sn1d 1
+sn1e 1
+sn1f 1
+sn1i 1
+sn1n 1
+sn92 1
+snap 1
+snap button 1
+snap fil 1
+snapshot 7
+snapshot datab 1
+snapshot differ 1
+snapshot differ refresh 1
+snapshot st 1
+snb 1
+snc 1
+snd 1
+snf 2
+snf 501l 1
+snf 501l 635m 1
+sng 3
+sng currnod3 1
+sng currnod3 sn 1
+snib 2
+snib and andr 1
+snib and david 1
+snib and rober 1
+sniewsk 1
+sniewsk theor 1
+sniff 1
+sniff ar unif 1
+sniff event 1
+sniff event remain 1
+snir 4
+snj 1
+snmp 1
+snodgr 4
+snodgr and ahn 1
+snodgr car 1
+snodgr letter 1
+snodgr report 1
+snodgr surv 1
+snodgr surv ext 1
+snoop 1
+snoop approach 1
+snoop bus 1
+snoop bus ba 1
+snoop cach 1
+snoop cach approach 1
+snoop cach architectur 1
+snoop cach coh 1
+snoop cach implem 1
+snoop cach multiproc 1
+snoop cach protocol 1
+snoop cach schem 1
+snoop perform 1
+snoop schem 1
+snoop schem repr 1
+snoop th illin 1
+snoop var 1
+snoop var dep 1
+snoop.inr.fr 1
+snooplrclrc 1
+snooplrclrc 8kg100norm 1
+snooplrclrc 8kg100norm execut 1
+snooplrclrc 8kloc100norm 1
+snooplrclrc 8kloc100norm execut 1
+snooplrclrc 8kml100norm 1
+snooplrclrc 8kml100norm execut 1
+snooplrclrc 8kmp3d100norm 1
+snooplrclrc 8kmp3d100norm execut 1
+snooplrclrc 8kwater100norm 1
+snooplrclrc 8kwater100norm execut 1
+snoopnosclrcg100norm 1
+snoopnosclrcg100norm execut 1
+snoopnosclrcg100norm execut tim100.0 1
+snoopnosclrclocusrout100norm 1
+snoopnosclrclocusrout100norm execut 1
+snoopnosclrclocusrout100norm execut tim100.0 1
+snoopnosclrcml100norm 1
+snoopnosclrcml100norm execut 1
+snoopnosclrcml100norm execut tim100.0 1
+snoopnosclrcmp3d100norm 1
+snoopnosclrcmp3d100norm execut 1
+snoopnosclrcmp3d100norm execut tim100.0 1
+snoopnosclrcwater100norm 1
+snoopnosclrcwater100norm execut 1
+snoopnosclrcwater100norm execut tim100.0 1
+snoopycach 1
+snoopycach protocol 1
+snow 1
+snow of kilimanjar 1
+snow of kilimanjaroand 1
+snowbird 2
+snp 2
+snp compl 1
+snqj 1
+snr 1
+snrk 1
+snrm2 1
+snsj 1
+snsn 1
+snsn sn 1
+snsn sn stat 1
+sny86 1
+snyder 2
+so 5
+so and gu 1
+so m em 1
+so3 1
+so92 1
+soar 1
+sobolev 1
+sobolev inner 1
+sobolev inner produc 1
+sobolev spac 1
+sobolev typ 1
+sobolev typ orthogon 1
+sobolewsk 1
+sobr 1
+sobr os 1
+sobr os gener 1
+sobt 1
+sobt a partir 1
+sobt g en 1
+soc 37
+soc 34th 1
+soc 34th annu 1
+soc act 2
+soc act involut 1
+soc and acm 1
+soc and cultur 1
+soc bar 1
+soc context 1
+soc fact 1
+soc for industr 1
+soc influ 1
+soc inform 1
+soc inform sc 1
+soc interact 2
+soc interact emerg 1
+soc of amer 1
+soc of min 1
+soc of mind 1
+soc phenom 1
+soc pr 8
+soc psycholog 1
+soc structur 1
+soc tcc 1
+soc tcc newsletter 1
+soc techn 1
+soc techn com 1
+soccup 2
+soccup de 2
+soccup de centraliser 1
+soccup de choisir 1
+soccup essentiel 1
+soccup essentiel de 1
+sociaux 1
+sock 5
+sock connect 1
+sock libr 1
+socor 1
+soderland 1
+soderland lehner 1
+sof 1
+sof problem 1
+soff 1
+soft 10
+soft classif 1
+soft constraint 1
+soft cut 1
+soft cut vi 1
+soft dec 1
+soft dec ba 1
+soft dec integr 1
+soft dec mak 1
+soft dec propag 1
+soft dec vect 1
+soft designdoc 1
+soft lim 1
+soft loc 1
+soft loc classif 1
+soft loc dec 1
+soft non 1
+soft non bin 1
+soft overlap 1
+soft overlap reg 1
+soft real tim 1
+soft reg 1
+soft reg bound 1
+soft threshold 1
+soft threshold nonl 1
+soft weight 1
+soft weight shar 1
+soft87 1
+softthreshold 1
+softw 1
+softwar 61
+softwar acquir 1
+softwar algorithm 1
+softwar allow 1
+softwar altern 1
+softwar and appl 1
+softwar and hardwar 4
+softwar and technolog 1
+softwar and test 1
+softwar appl 1
+softwar appl using 1
+softwar approach 1
+softwar architectur 4
+softwar as 1
+softwar ba 2
+softwar ba approach 1
+softwar ba method 1
+softwar ba multicast 1
+softwar ba schem 1
+softwar ba unicast 1
+softwar behav 1
+softwar behav correct 1
+softwar budg 1
+softwar budg spent 1
+softwar cach 4
+softwar cach coh 2
+softwar cach manag 2
+softwar coh 3
+softwar coh schem 1
+softwar coh strateg 1
+softwar compon 1
+softwar con 1
+softwar construc 1
+softwar control 1
+softwar control coh 1
+softwar control prefetch 1
+softwar degrad 1
+softwar deliv 1
+softwar deliv vehicl 1
+softwar design 3
+softwar design team 1
+softwar designer 1
+softwar develop 1
+softwar develop. 1
+softwar developer 1
+softwar developm 11
+softwar developm addr 1
+softwar developm approach 1
+softwar developm framework 1
+softwar developm manu 1
+softwar developm method 2
+softwar developm model 1
+softwar developm proc 2
+softwar developm system 1
+softwar developm tim 1
+softwar developm using 1
+softwar distribut 2
+softwar distribut shar 1
+softwar eng 1
+softwar engineer 23
+softwar engineer commun 2
+softwar engineer environm 1
+softwar engineer institut 1
+softwar engineer model 1
+softwar engineer not 3
+softwar engineer research 2
+softwar engineer seek 1
+softwar engineer ser 1
+softwar engineer tool 1
+softwar engineer typ 1
+softwar enginner 1
+softwar environm 2
+softwar evolut 2
+softwar famil 1
+softwar fault 2
+softwar fault loc 1
+softwar fault toler 1
+softwar for 1
+softwar for client 1
+softwar for ea 1
+softwar for manipl 1
+softwar for us 1
+softwar found 1
+softwar framework 1
+softwar funct 1
+softwar gener 1
+softwar implem 3
+softwar improv 1
+softwar in context 1
+softwar in us 1
+softwar inc 2
+softwar int text 1
+softwar is produc 1
+softwar is writ 1
+softwar issu 1
+softwar lat 1
+softwar layout 1
+softwar layout edit 1
+softwar libr 2
+softwar libr prov 1
+softwar lif 1
+softwar lif cycl 1
+softwar lifetim 1
+softwar maint 5
+softwar maint act 1
+softwar maint compr 1
+softwar maint domin 1
+softwar maint engineer 1
+softwar maint modif 1
+softwar maint ph 1
+softwar maint proc 1
+softwar maintain 1
+softwar maintain coh 1
+softwar maintainer 1
+softwar manag 1
+softwar manag coh 1
+softwar mechan 1
+softwar method 1
+softwar multicast 1
+softwar multicast algorithm 1
+softwar multicast bo 1
+softwar multicast lat 1
+softwar multicast method 1
+softwar multicast outperform 1
+softwar multicast result 1
+softwar multicast schem 1
+softwar multicast shown 1
+softwar object 1
+softwar on multipl 1
+softwar onl requir 1
+softwar overhead 1
+softwar overhead assoc 1
+softwar pack 1
+softwar pipelin 1
+softwar pp 1
+softwar pract 1
+softwar produc 3
+softwar produc consort 1
+softwar project 1
+softwar qu 2
+softwar qu assur 1
+softwar reflec 1
+softwar reflec model 1
+softwar regr 1
+softwar rel 1
+softwar rel decr 1
+softwar requir 2
+softwar requir an 1
+softwar restructur 1
+softwar reus 3
+softwar reus prom 1
+softwar sc 1
+softwar schem 2
+softwar server 1
+softwar siz 1
+softwar specif 1
+softwar specif stud 1
+softwar structur 1
+softwar subsystem 1
+softwar support 1
+softwar system 8
+softwar system build 1
+softwar system design 1
+softwar system evolut 1
+softwar system gener 1
+softwar system model 1
+softwar system specif 1
+softwar system synth 1
+softwar technolog 5
+softwar test 2
+softwar test techniqu 1
+softwar testb 1
+softwar th un 1
+softwar than improv 1
+softwar that run 1
+softwar to interact 1
+softwar to keep 1
+softwar to manipl 1
+softwar to prov 1
+softwar to work 1
+softwar tool 5
+softwar track 1
+softwar und 1
+softwar und systemtechnik 1
+softwar using 1
+softwar using audit 1
+softwar vendor 2
+softwar verif 1
+softwar verif research 1
+softwar versus hardwar 1
+softwar vi www 1
+softwar visu 1
+softwar visu labor 1
+softwar visu labor1 1
+softwar visu system 1
+softwar wa writ 1
+softwar want 1
+softwar which treat 1
+softwar wil an 1
+softwar wil fail 1
+softwar wil maintain 1
+softwar work 1
+softwar work correct 1
+softwar would re 1
+softwareengineer 1
+softwareengineer tool 1
+soh 2
+sohwn 1
+sohwn in figur 1
+soient 4
+soient c1 1
+soient distinct 1
+soient dupliqu 1
+soient dupliqu ee 1
+soient empil 1
+soient empil es 1
+soient i1 1
+soient init 1
+soient init ee 1
+soient introduit 1
+soient le 1
+soient le suiv 1
+soient m1 1
+soient modif 1
+soient modif es 1
+soient n ecessair 1
+soient non 1
+soient non nl 1
+soient pa 1
+soient rencontr 1
+soient rencontr ee 1
+soient restaur 1
+soient restaur es 1
+soient tr 1
+soient tr es 1
+soient v erif 1
+soient vraim 1
+soient vraim util 1
+soient x un 1
+soin 2
+soin de 1
+soin de changer 1
+soin lu 1
+soin lu soit 1
+soit 6
+soit a la 1
+soit a lec 1
+soit a un 2
+soit am eliorer 1
+soit apport 1
+soit attach 1
+soit attach ee 1
+soit atteint 1
+soit aus 1
+soit aus remerc 1
+soit automatiqu 1
+soit avec 1
+soit avec un 1
+soit ax 1
+soit ce 2
+soit ce don 1
+soit ce nest 1
+soit ce tail 1
+soit com 1
+soit conflictuel 1
+soit conflictuel suiv 1
+soit congru 1
+soit convec 1
+soit correct 1
+soit correct calcl 1
+soit cr 1
+soit cr ee 1
+soit cycliqu 1
+soit cycliqu soit 1
+soit d ecrit 1
+soit d etablir 1
+soit d etruit 1
+soit d le 1
+soit d leur 1
+soit d pgcd 1
+soit dan 2
+soit dan le 2
+soit de 3
+soit de combiner 1
+soit de dupliquer 1
+soit de fair 1
+soit de instruc 1
+soit de primitiv 1
+soit de rendr 1
+soit deux 1
+soit deux saut 1
+soit dintroduir 1
+soit dintroduir le 1
+soit dt 1
+soit du 2
+soit du point 1
+soit el 1
+soit el sont 1
+soit eliminer 1
+soit eliminer tous 1
+soit en 2
+soit en fa 1
+soit en mod 1
+soit en not 1
+soit f un 1
+soit fait 1
+soit fait de 1
+soit ff 1
+soit ff aij 1
+soit ffl la 1
+soit fin 1
+soit ij 1
+soit il 1
+soit il ec 1
+soit instanc 1
+soit it jm 1
+soit j bc 1
+soit l egal 1
+soit la 3
+soit la boucl 1
+soit la dilat 1
+soit la form 1
+soit la mach 1
+soit la per 1
+soit la tail 2
+soit la valeur 1
+soit la ver 1
+soit le 5
+soit le param 1
+soit le point 1
+soit le prem 1
+soit le propr 1
+soit le pseud 1
+soit le sch 1
+soit le som 1
+soit le typ 1
+soit lec 2
+soit lec ecut 2
+soit leur 1
+soit leur longueur 1
+soit lexpr 1
+soit lib 1
+soit lib er 1
+soit limpl 1
+soit limpl em 1
+soit linterv 1
+soit linterv ent 1
+soit lunif 1
+soit lunif dun 1
+soit m lind 1
+soit m0 1
+soit m0 le 1
+soit m1 1
+soit mac 1
+soit maint 1
+soit me 1
+soit mi 2
+soit mi le 1
+soit modif 1
+soit modif le 1
+soit n ecessair 1
+soit non 1
+soit non nl 1
+soit optim 1
+soit optim pour 1
+soit p le 1
+soit p un 1
+soit pa 4
+soit pa appar 1
+soit pa compl 1
+soit pa partag 1
+soit pa trop 1
+soit par 2
+soit par affect 1
+soit par bloc 1
+soit par el 1
+soit par lalloc 1
+soit par le 1
+soit par lutil 1
+soit par substitut 1
+soit par un 1
+soit plus contr 1
+soit plut 1
+soit plut ot 1
+soit porteur 1
+soit porteur dun 1
+soit posit 1
+soit pour 1
+soit pour corriger 1
+soit pour refair 1
+soit pr 1
+soit pr ec 1
+soit pr eserv 1
+soit proch 1
+soit proch du 1
+soit qu 2
+soit qu ce 1
+soit qu de 1
+soit qu lunif 1
+soit qu pour 1
+soit quil 2
+soit quil ec 1
+soit quil en 1
+soit quil ne 1
+soit quil ny 1
+soit s 1
+soit signif 1
+soit son 1
+soit son typ 1
+soit st 1
+soit st soit 1
+soit suff 1
+soit suff pour 1
+soit sur 1
+soit tir 1
+soit tot 1
+soit tout 1
+soit tout bon 1
+soit tr 1
+soit tr saut 1
+soit trait 1
+soit un 2
+soit un agc 1
+soit un coupur 1
+soit un environ 1
+soit un etat 2
+soit un exempl 1
+soit un instruc 1
+soit un matr 1
+soit un nouvel 1
+soit un pol 1
+soit un protocol 1
+soit un simpl 1
+soit un syst 1
+soit un term 1
+soit un var 1
+soit unimodulair 1
+soit v erif 2
+soit vr 2
+soit vr jusqu 1
+soit x x1x2 1
+soixantain 1
+soixantain de 1
+soixantain de noeud 1
+sol 31
+sol an ind 1
+sol ancr 1
+sol and structur 1
+sol ba 1
+sol ba form 1
+sol by mean 1
+sol ca 1
+sol caus 1
+sol circl 1
+sol circl repr 1
+sol connect 1
+sol edg 1
+sol found 1
+sol geometer 1
+sol in order 1
+sol is defin 1
+sol lin 6
+sol lin assum 1
+sol lin ind 1
+sol lin repr 1
+sol mean 1
+sol mechan 1
+sol model 1
+sol object 3
+sol of non 1
+sol onl parent 1
+sol pattern 1
+sol pattern belong 1
+sol pour 1
+sol pour la 1
+sol prev 1
+sol sl 1
+sol to distingu 1
+sol to interconnect 1
+sol upon abstract 1
+sol visu 1
+sol visu tool 1
+sold 1
+solidor 1
+solit 1
+solit work 1
+solomonoff 1
+solut 101
+solut a cl 1
+solut a compreh 1
+solut a csp 1
+solut a cut 1
+solut a gcsp 1
+solut a goal 1
+solut a la 1
+solut a number 1
+solut a problem 3
+solut a random 1
+solut a se 1
+solut a singl 1
+solut a spac 1
+solut a specif 1
+solut a var 1
+solut adopt 1
+solut adopt ee 1
+solut aff 1
+solut aff constraint 1
+solut algorithm 1
+solut algorithm using 1
+solut allow 1
+solut almost determin 1
+solut altern 1
+solut altern con 1
+solut an atom 1
+solut an lp 1
+solut analytiqu 1
+solut analytiqu de 1
+solut and exper 1
+solut and henc 1
+solut and show 2
+solut and shown 1
+solut applicabl 1
+solut ar closest 1
+solut ar exp 1
+solut ar pr 1
+solut ar want 1
+solut as follow 1
+solut au 3
+solut au marqu 1
+solut au probl 1
+solut au syst 1
+solut av 1
+solut av stddev 1
+solut avec 1
+solut ba 2
+solut babel 1
+solut babel goal 1
+solut behavior 1
+solut both task 1
+solut by constraint 1
+solut by cop 1
+solut by lin 1
+solut by localsearch 1
+solut by look 1
+solut by recur 1
+solut by sen 1
+solut by succ 1
+solut by univer 1
+solut by using 1
+solut by weak 1
+solut can becom 1
+solut candid 2
+solut ch 1
+solut ch pour 1
+solut cl 2
+solut classiqu 2
+solut classiqu de 1
+solut combin 1
+solut combin unif 1
+solut compl 1
+solut complec 3
+solut complec optim 1
+solut complec problem 1
+solut complec schedl 1
+solut con 2
+solut con alor 1
+solut condit 1
+solut configur 1
+solut connect 1
+solut connect hyperedg 1
+solut consom 1
+solut constraint 1
+solut constraint hierarch 1
+solut d ecrit 1
+solut da 1
+solut da problem 1
+solut dan 2
+solut dan certain 1
+solut dan chacun 1
+solut dan le 1
+solut dan lespac 1
+solut de 4
+solut de ce 2
+solut de la 1
+solut de loptim 1
+solut dec 1
+solut dec problem 1
+solut dep 1
+solut describ 1
+solut design 1
+solut design system 1
+solut destampil 1
+solut destampil temporel 1
+solut discr 1
+solut discr constraint 1
+solut discr problem 1
+solut do exhibit 1
+solut doit 1
+solut doit tr 1
+solut domin 1
+solut drawback 1
+solut du 2
+solut du syst 2
+solut dun 1
+solut dun quest 1
+solut dun syst 1
+solut dur measur 1
+solut each block 1
+solut ec 2
+solut eff 2
+solut electr 1
+solut electr network 1
+solut emerg 1
+solut en 1
+solut en ajout 1
+solut en fonct 1
+solut en util 1
+solut ent 2
+solut ent er 1
+solut environm 1
+solut eoec 1
+solut equ 1
+solut equiv 1
+solut est 1
+solut est sb 1
+solut et est 1
+solut et le 1
+solut et satisfiabilit 1
+solut et sup 1
+solut exploit 1
+solut faster 1
+solut fi 1
+solut fi test 1
+solut fin 1
+solut finit 1
+solut finit el 1
+solut fof 1
+solut fof regl 1
+solut for a1 1
+solut for cal 1
+solut for cn 1
+solut for copt 1
+solut for deg 1
+solut for multiproc 1
+solut for purp 1
+solut for rout 1
+solut for sequ 1
+solut found 1
+solut from comput 1
+solut from natur 1
+solut gener 3
+solut gener mic 1
+solut giv 1
+solut glob 1
+solut glob est 1
+solut graph 1
+solut graph optim 1
+solut ha congest 1
+solut had multipl 1
+solut he mean 1
+solut hierarch 1
+solut high 1
+solut high combin 1
+solut high dim 1
+solut hybr 1
+solut hybr qu 1
+solut if ej 1
+solut iff 1
+solut iff 8y9x 1
+solut impl 1
+solut implem 1
+solut improv 1
+solut in clp 1
+solut in lin 2
+solut in oz 1
+solut in polynom 4
+solut in tim 2
+solut incr 2
+solut individu 1
+solut individu constraint 1
+solut init 1
+solut init evaluer 1
+solut int modl 1
+solut involut 3
+solut involut ch 1
+solut is ad 1
+solut is assoc 1
+solut is avail 1
+solut is ba 1
+solut is deon 1
+solut is form 1
+solut is found 1
+solut is giv 1
+solut is impract 1
+solut is inclus 1
+solut is modif 1
+solut is p2 1
+solut is po 1
+solut is simpl 1
+solut is therefor 1
+solut it eff 1
+solut it task 1
+solut la 1
+solut larg problem 1
+solut larg spar 1
+solut larger 1
+solut larger problem 1
+solut layout 1
+solut layout problem 1
+solut lead 1
+solut lin 5
+solut lin algebr 1
+solut lin equ 1
+solut lin program 1
+solut lin system 1
+solut list 1
+solut lower 1
+solut lp 2
+solut lp problem 2
+solut man kind 1
+solut man np 1
+solut mat 2
+solut mat eriel 2
+solut mediumt 1
+solut ment 1
+solut method 2
+solut minim 1
+solut minim con 1
+solut moin 1
+solut moin co 1
+solut mor eff 1
+solut must lead 1
+solut ne 1
+solut ne peut 1
+solut nod 1
+solut non 2
+solut non herm 1
+solut non vid 1
+solut np 1
+solut numaq 1
+solut numaq ind.html 1
+solut numer 1
+solut obtain 2
+solut obtenu 1
+solut of absolut 1
+solut of constraint 3
+solut of discr 1
+solut of lin 2
+solut of part 1
+solut of polynom 1
+solut of spar 1
+solut of xs 1
+solut on random 1
+solut on regl 1
+solut on tod 1
+solut onl part 1
+solut optim 4
+solut optim dun 1
+solut optim par 1
+solut optim problem 2
+solut or proper 1
+solut origin 1
+solut orst 1
+solut other system 1
+solut ou 1
+solut ou de 1
+solut our ehcmc 1
+solut par 2
+solut par el 1
+solut par la 1
+solut part 2
+solut part differ 2
+solut partiel 1
+solut peut 1
+solut peut etr 1
+solut ph 1
+solut plus satisf 1
+solut po est 1
+solut point 1
+solut polynom 1
+solut polynom constraint 1
+solut potentiel 1
+solut pour 1
+solut pour tout 1
+solut pour un 1
+solut pouv 1
+solut power 1
+solut pr 1
+solut pr ec 1
+solut prec 1
+solut problem 6
+solut proc 3
+solut produc 1
+solut prop 2
+solut prop ee 1
+solut proposit 1
+solut proposit satisf 1
+solut qu 4
+solut qu nous 2
+solut qu sav 1
+solut random 1
+solut random forml 1
+solut rationnel 1
+solut rationnel du 1
+solut real symmeter 1
+solut rel 3
+solut requir 3
+solut rest 1
+solut rest toutef 1
+solut s 1
+solut s c1 1
+solut s c11 1
+solut s equentiel 1
+solut sappu 1
+solut sappu sur 1
+solut satisf 2
+solut se 4
+solut se situ 1
+solut se trouv 1
+solut search 1
+solut sembl 1
+solut sembl etr 1
+solut sequ 1
+solut ser 1
+solut ser dit 1
+solut sever np 1
+solut show 1
+solut simpl 2
+solut simpl con 1
+solut simpl task5 1
+solut situ 2
+solut situ involut 1
+solut som problem 1
+solut sont 2
+solut sont alor 1
+solut sont an 1
+solut sont possibl 1
+solut sont rapid 1
+solut spac 3
+solut spac plan 1
+solut span 1
+solut standard 1
+solut standard pour 1
+solut strateg 2
+solut strong 1
+solut such constraint 1
+solut sur 1
+solut system 1
+solut tak 1
+solut tak unit 1
+solut tant 1
+solut tant qu 1
+solut task 1
+solut techniqu 1
+solut th branch 1
+solut th car 1
+solut th condit 1
+solut th constraint 1
+solut th contradict 1
+solut th ddpm 1
+solut th digit 1
+solut th dynam 1
+solut th forml 1
+solut th gener 2
+solut th leftmost 1
+solut th lp 1
+solut th map 1
+solut th mf 1
+solut th minim 1
+solut th multipl 1
+solut th non 1
+solut th over 1
+solut th par 1
+solut th pentomin 1
+solut th pot 1
+solut th problem 27
+solut th propag 1
+solut th recur 1
+solut th remainder 1
+solut th self 1
+solut th srq 1
+solut th system 2
+solut th task 1
+solut th using 1
+solut than heur 1
+solut that connect 1
+solut them individu 1
+solut tim 1
+solut tim incr 1
+solut to achief 1
+solut to bal 1
+solut to cach 1
+solut to coh 1
+solut to constraint 1
+solut to design 1
+solut to ec 1
+solut to eqn 1
+solut to srq 1
+solut tout 1
+solut tout en 1
+solut tr 1
+solut travel 1
+solut travel salesman 1
+solut tw problem 2
+solut tw signif 1
+solut uncommon 1
+solut uncommon problem 1
+solut under simplif 1
+solut uniqu 1
+solut uniqu ba 1
+solut us 2
+solut using 3
+solut using indomain 1
+solut using proc 1
+solut valu 1
+solut vect 1
+solut vect latest 1
+solut ver quick 1
+solut vi leftmost 1
+solut wa adopt 1
+solut wer lim 1
+solut wh congest 1
+solut which contain 1
+solut wil chang 1
+solut wil ec 1
+solut with cl 1
+solut with congest 1
+solut with good 1
+solut with low 1
+solut with object 1
+solut with smaller 1
+solut with valu 1
+solut without intern 1
+solut work 1
+solut x du 1
+solut x obtenu 1
+solut xn 1
+solut xn dan 1
+solut y ent 1
+solut. 1
+solver 7
+solver and fast 1
+solver appl 1
+solver appl oper 1
+solver ar consider 1
+solver ar describ 1
+solver ar parallel 1
+solver ar shown 1
+solver as model 1
+solver ba 1
+solver by preproc 1
+solver cod 1
+solver compar 1
+solver compar using 1
+solver determin 1
+solver eff 1
+solver expr 1
+solver for graph 1
+solver for spar 1
+solver for system 1
+solver for user 1
+solver implem 1
+solver improv 1
+solver in clp 1
+solver incr 1
+solver involut 1
+solver is abl 1
+solver is clear 1
+solver is domin 1
+solver onl perform 1
+solver pr 1
+solver scal 1
+solver should becom 1
+solver show 1
+solver tim 1
+solver us 1
+solver us me 1
+solver using 1
+solver when confront 1
+solver would mak 1
+solver writ 1
+som 6
+som a maint 1
+som cep 1
+som cep en 1
+som ch 1
+som ch al 1
+som concentr 1
+som concentr es 1
+som cont 2
+som cont es 1
+som dan 1
+som de 3
+som de co 1
+som de degr 1
+som de enf 1
+som de la 2
+som de lenviron 1
+som de parent 1
+som de pil 1
+som de tr 1
+som denviron 1
+som denviron entr 1
+som donc 1
+som donc pa 1
+som du 3
+som du bloc 1
+som du nuag 1
+som du point 1
+som du temp 1
+som dun 1
+som dun bloc 1
+som en 1
+som en mesur 1
+som maint 1
+som maint en 1
+som pa 1
+som pa es 1
+som pen 1
+som respectif 1
+som respectif de 1
+som rest 1
+som rest de 1
+som restreint 1
+som restreint au 1
+som sur 3
+som sur ce 1
+som sur le 2
+somehow 6
+somehow be elimin 1
+somehow remov 1
+somehow repr 1
+somehow requir 1
+somehow threat 1
+somer 1
+somer m.w.van 1
+somespac 1
+somespac boolean 1
+somespac boolean claus 1
+somespac quietblank 1
+somespac quietblank whitespac 1
+sometim 1
+sometyp 1
+somewh 8
+somewhat 24
+somewhat arbitr 1
+somewhat complec 1
+somewhat constrain 1
+somewhat differ natur 1
+somewhat differ proof 1
+somewhat greater 1
+somewhat greater spur 1
+somewhat high 1
+somewhat ineff 1
+somewhat ineff compar 1
+somewhat inhom 1
+somewhat inhom collect 1
+somewhat larger 2
+somewhat le flec 1
+somewhat mor benign 1
+somewhat mor involut 1
+somewhat narrow 1
+somewhat redund 1
+somewhat rel 1
+somewhat rel multicast 1
+somewhat shak 1
+somewhat simil 1
+somewhat simil branch 1
+somewhat slower 1
+somewhat smal port 1
+somewhat strict 1
+somewhat stronger 1
+somewhat stronger induc 1
+somewhat trick 1
+somewhat uneleg 1
+somewhat unr 1
+somewhat unrel 1
+sommair 1
+sommair la 1
+somog 1
+son 20
+son adapt 1
+son adr 1
+son adr virtuel 1
+son ag 1
+son aid 1
+son anc 1
+son anc contenu 1
+son anc estampil 1
+son anc valeur 1
+son appl 1
+son ar attach 1
+son argum 1
+son argum dentr 1
+son arit 1
+son attribut 1
+son attribut est 1
+son becom 1
+son but dan 1
+son ch 1
+son ch est 1
+son champ 1
+son champ dappl 1
+son comport 1
+son contr 1
+son contr ol 1
+son corp 1
+son corp est 1
+son degr 1
+son ecritur 1
+son ecritur dan 1
+son eff 1
+son eff sur 1
+son efficacit 1
+son elabor 1
+son energ 1
+son energ minim 1
+son ensembl 1
+son enthousiasm 1
+son estampil 1
+son estampil devront 1
+son etat 1
+son etat de 1
+son etud 1
+son etud ne 1
+son evolut 1
+son evolut pa 1
+son ex 1
+son ex ecut 1
+son exploit 1
+son exploit est 1
+son expr 1
+son extr 1
+son extr em 1
+son fonct 1
+son fonct de 1
+son from cand 1
+son group 1
+son handicap 1
+son handicap vi 1
+son histoir 1
+son imag 1
+son impl 2
+son impl em 1
+son impl informatiqu 1
+son inaptitud 1
+son incomp 1
+son incomp es 1
+son ind 1
+son int 1
+son int egralit 1
+son inver 2
+son inver po 1
+son is er 1
+son is simultan 1
+son journ logiqu 1
+son lim 1
+son livr 1
+son logiciel 1
+son nom 1
+son nom est 1
+son objectif 1
+son objectif se 1
+son of currnod 1
+son prem 1
+son prem argum 1
+son princip 2
+son princip dual 1
+son princip rest 1
+son program 1
+son propr 1
+son propr etair 1
+son pur 1
+son pur par 1
+son rang 1
+son syst 1
+son syst em 1
+son tour 2
+son tour par 1
+son typ 1
+son uniqu 1
+son uniqu argum 1
+son upon saint 1
+son util 2
+son util dan 1
+son util rar 1
+son utilisateur 1
+son.1990 1
+sonar 1
+sonar soybean 1
+sonderforschungsbereich 1
+sondergaard 1
+sonet 1
+sonet oc 1
+song 2
+song classif 1
+sonnenberg 1
+sonnenberg f.a 1
+sont 8
+sont a chev 1
+sont a consid 1
+sont a eviter 1
+sont a notr 1
+sont a nouveau 1
+sont abord 1
+sont abord es 1
+sont acc 1
+sont acc ed 1
+sont accessibl 1
+sont accessibl par 1
+sont activ 1
+sont activ ee 1
+sont affect 1
+sont affect ee 1
+sont ain 2
+sont ain direct 1
+sont ain propr 1
+sont align 1
+sont align ee 1
+sont allou 1
+sont allou ee 1
+sont alor 3
+sont alor ai 1
+sont alor allou 1
+sont alor cel 1
+sont alor don 1
+sont alor inv 1
+sont alor koan 1
+sont alor li 1
+sont alor pour 1
+sont alor repr 1
+sont alor synth 1
+sont alor util 1
+sont alor victim 1
+sont an 1
+sont an es 1
+sont appel 1
+sont appel es 1
+sont applicabl 1
+sont applicabl qu 1
+sont appliqu 1
+sont appliqu es 1
+sont apt 1
+sont assez 1
+sont assez import 1
+sont assoc 2
+sont assoc es 2
+sont atteint 2
+sont atteint respectiv 1
+sont au 1
+sont au moin 1
+sont aus 1
+sont aus abord 1
+sont aus collect 1
+sont aus etud 1
+sont aus restaur 1
+sont aut 1
+sont aut es 1
+sont automatiqu 1
+sont automatiqu pr 1
+sont bien 1
+sont bien moin 1
+sont calcl 1
+sont calcl es 1
+sont candid 1
+sont caract 2
+sont caract er 2
+sont caract eristiqu 1
+sont ce 1
+sont ce processeur 1
+sont cel 1
+sont cel qu 1
+sont cep 1
+sont cep encor 1
+sont ceux 1
+sont ceux qu 1
+sont ch 1
+sont ch ind 1
+sont clair 1
+sont classiqu 1
+sont classiqu ident 1
+sont colin 1
+sont colin air 1
+sont collect 1
+sont collect ee 1
+sont combin 1
+sont combin ee 1
+sont commun 1
+sont compar 2
+sont compar ee 1
+sont compar es 1
+sont compl 1
+sont compl ementair 1
+sont composabl 1
+sont composabl dan 1
+sont concentr 1
+sont concentr ee 1
+sont concern 1
+sont concern ee 1
+sont condamn 1
+sont condamn es 1
+sont conflictuel 1
+sont confondu 2
+sont confondu dan 1
+sont confondus 1
+sont connu 2
+sont connus 2
+sont connus avant 1
+sont connus qu 1
+sont conserv 1
+sont conserv ee 1
+sont consid 1
+sont consid er 1
+sont constam 1
+sont constam rejoint 1
+sont constitu 2
+sont constitu ee 2
+sont constitu es 1
+sont construit 3
+sont construit automatiqu 1
+sont construit de 2
+sont convec 1
+sont convec au 1
+sont cop 1
+sont cop es 1
+sont couver 1
+sont couver qu 1
+sont cycliqu 1
+sont cycliqu dordr 1
+sont d ecoup 1
+sont d efail 1
+sont d efavor 1
+sont d efin 2
+sont d el 1
+sont d epen 1
+sont d epil 1
+sont d eplac 1
+sont d etermin 2
+sont d on 1
+sont dan 2
+sont dan ce 1
+sont dan le 1
+sont dan lordr 1
+sont dapr 1
+sont dapr es 1
+sont daut 1
+sont de 5
+sont de acc 1
+sont de const 1
+sont de coupur 1
+sont de degr 1
+sont de fabr 1
+sont de fant 1
+sont de fonct 1
+sont de forml 1
+sont de inst 1
+sont de la 1
+sont de lign 1
+sont de lordr 1
+sont de matr 1
+sont de param 1
+sont de pay 1
+sont de probl 1
+sont de rang 1
+sont de register 1
+sont de simpl 1
+sont de techniqu 1
+sont de var 1
+sont de variabl 1
+sont deux 2
+sont deux colon 1
+sont deux individus 1
+sont diff 1
+sont diff erent 1
+sont difficil 1
+sont direct 2
+sont direct applicabl 1
+sont direct li 1
+sont disjoint 1
+sont distinct 1
+sont distingu 1
+sont distingu es 1
+sont distribu 3
+sont distribu ee 1
+sont distribu es 2
+sont dit 1
+sont dit temporair 1
+sont don 3
+sont don ee 2
+sont don es 3
+sont donc 2
+sont donc constitu 1
+sont donc de 1
+sont donc fin 1
+sont donc le 1
+sont donc marginaux 1
+sont donc qu 1
+sont donc scind 1
+sont donc simpl 1
+sont donc tr 1
+sont du 3
+sont du au 2
+sont du typ 1
+sont dun 2
+sont dun part 1
+sont dun pr 1
+sont dupliqu 1
+sont dupliqu ee 1
+sont echang 2
+sont echang ee 1
+sont echang es 1
+sont ecrit 1
+sont ecrit le 1
+sont ecrit lor 1
+sont ecrit sous 1
+sont effectu 2
+sont effectu ee 1
+sont effectu es 1
+sont egal 2
+sont egal aux 1
+sont egal faibl 1
+sont egaux 1
+sont el 1
+sont el qu 1
+sont empil 1
+sont empil ee 1
+sont empil es 1
+sont en 2
+sont en cour 1
+sont en fait 1
+sont en secon 1
+sont enregister 2
+sont enregister ee 1
+sont enregister es 1
+sont ensuit 4
+sont ensuit abord 1
+sont ensuit discut 1
+sont ensuit pa 1
+sont ensuit pr 1
+sont ensuit util 1
+sont envisageabl 1
+sont equilibr 1
+sont equilibr es 1
+sont equiv 1
+sont esqu 1
+sont esqu ee 1
+sont eux 1
+sont eux qu 1
+sont evit 1
+sont evit ee 1
+sont evit es 1
+sont ex 2
+sont ex ecut 2
+sont exclusiv 1
+sont exclusiv cr 1
+sont exploit 1
+sont exploit ee 1
+sont exprim 1
+sont exprim ee 1
+sont facil 1
+sont facil evit 1
+sont faibl 1
+sont faibl coupl 1
+sont fait 2
+sont fait avec 1
+sont fait en 1
+sont favorabl 1
+sont ferm 1
+sont ferm ee 1
+sont fic 1
+sont fic es 1
+sont fin 1
+sont fondam 1
+sont fondam par 1
+sont fort 1
+sont fort diversif 1
+sont fort influenc 1
+sont fr 1
+sont fus 1
+sont fus ee 1
+sont g en 2
+sont g er 1
+sont gard 2
+sont gard ee 2
+sont gr 1
+sont guid 1
+sont guid es 1
+sont habituel 1
+sont habituel compil 1
+sont identioabl 1
+sont identiqu 3
+sont illustr 1
+sont illustr ee 1
+sont implicit 1
+sont implicit universel 1
+sont import 1
+sont import puisquil 1
+sont impr 1
+sont impr ec 1
+sont incompatibl 1
+sont ind 1
+sont ind epen 1
+sont inspir 1
+sont inspir es 1
+sont instanc 1
+sont instanc es 1
+sont insuff 1
+sont insuff pour 1
+sont int 1
+sont int er 1
+sont intim 1
+sont intim li 1
+sont introduit 1
+sont issu 2
+sont issu de 1
+sont issu dun 1
+sont issus 1
+sont issus dexp 1
+sont la 1
+sont la diffus 1
+sont larg 1
+sont larg ind 1
+sont le 4
+sont le argum 1
+sont le born 1
+sont le cr 1
+sont le instruc 1
+sont le lign 1
+sont le multipl 1
+sont le obj 1
+sont le param 1
+sont le sel 1
+sont le self 1
+sont le som 1
+sont le suiv 2
+sont le variabl 1
+sont lexicopositif 1
+sont lib 1
+sont lib er 1
+sont libr 1
+sont lipsc 1
+sont lipsc dintel 1
+sont loc 1
+sont loc aux 1
+sont m elang 1
+sont m emor 1
+sont maint 3
+sont maint li 2
+sont maint partag 1
+sont maintenu 1
+sont maintenu coh 1
+sont maximaux 1
+sont mi 1
+sont mi en 1
+sont modif 1
+sont modif ee 1
+sont montr 1
+sont montr es 1
+sont n ecessair 2
+sont n variabl 1
+sont na 1
+sont nombreus 1
+sont non 1
+sont non nl 1
+sont obtenu 1
+sont obtenu par 1
+sont op 1
+sont op erationnel 1
+sont organ 1
+sont organ ee 1
+sont orient 1
+sont orient es 1
+sont ou 1
+sont ou non 1
+sont pa 4
+sont pa abord 1
+sont pa atteint 1
+sont pa clair 1
+sont pa compilabl 1
+sont pa connu 1
+sont pa convec 1
+sont pa dan 1
+sont pa direct 1
+sont pa ee 1
+sont pa elagu 1
+sont pa en 1
+sont pa equiv 1
+sont pa evalu 1
+sont pa fic 1
+sont pa forc 2
+sont pa init 1
+sont pa lim 1
+sont pa modif 1
+sont pa partag 1
+sont pa particl 1
+sont pa prem 1
+sont pa propag 1
+sont pa retard 1
+sont pa sauvegard 1
+sont pa si 1
+sont pa soum 1
+sont pa sp 1
+sont pa trait 1
+sont pa util 1
+sont par 2
+sont par el 1
+sont par natur 1
+sont parc 1
+sont parc quil 1
+sont parfait 1
+sont parfait adapt 1
+sont partag 1
+sont partag ee 1
+sont pench 1
+sont pench es 1
+sont petit 1
+sont peu 1
+sont peu sensibl 1
+sont plus complec 1
+sont plus facil 1
+sont plus grand 1
+sont plus ostabl 1
+sont plus parcourus 1
+sont plus suj 1
+sont plus util 1
+sont plus valabl 1
+sont possibl 1
+sont possibl qu 1
+sont pr 2
+sont pr ec 1
+sont pr esent 1
+sont prem 1
+sont prem entr 1
+sont presqu 1
+sont presqu aus 1
+sont princip 2
+sont princip de 1
+sont princip lim 1
+sont prison 1
+sont privil 1
+sont privil eg 1
+sont probabl 1
+sont probabl minim 1
+sont produit 1
+sont produit lor 1
+sont prop 1
+sont prop ee 1
+sont pur 1
+sont pur mat 1
+sont qu 2
+sont qu de 2
+sont qu ment 1
+sont quasim 1
+sont quasim ind 1
+sont r eduit 2
+sont r ef 1
+sont r epart 1
+sont r esolus 1
+sont r esum 2
+sont rang 1
+sont rang ee 1
+sont rapid 1
+sont rapid abord 1
+sont rar 1
+sont recharg 1
+sont recharg es 1
+sont regroup 2
+sont regroup ee 2
+sont rej 1
+sont rej ee 1
+sont rel 1
+sont rel es 1
+sont relativ 2
+sont relativ anc 1
+sont relativ dioecil 1
+sont relativ fr 1
+sont relativ rar 1
+sont remplac 1
+sont remplac ee 1
+sont remplac es 1
+sont repr 1
+sont repr esent 1
+sont reproduit 1
+sont reproduit figur 1
+sont respectiv 1
+sont respectiv le 1
+sont restaur 1
+sont restaur es 1
+sont rich 1
+sont rich denseign 1
+sont s epar 1
+sont s equ 1
+sont s equentiel 1
+sont s ur 1
+sont sauv 1
+sont sauv es 1
+sont sauvegard 1
+sont sauvegard ee 1
+sont sauvegard es 1
+sont sensibl 1
+sont sensibl le 1
+sont signioc 1
+sont signioc dun 1
+sont simpl 2
+sont simpl ignor 1
+sont souv 1
+sont souv ajout 1
+sont sp 2
+sont sp ec 2
+sont sp ecifiqu 1
+sont stabl 1
+sont stochastiqu 1
+sont stock 1
+sont stock es 1
+sont successiv 1
+sont successiv cr 1
+sont suffisam 2
+sont suffisam complec 1
+sont suffisam faibl 1
+sont sup 1
+sont sup ee 1
+sont sup es 1
+sont superv 1
+sont superv ee 1
+sont syst 1
+sont syst ematiqu 1
+sont tirabl 1
+sont tirabl en 1
+sont toujour 3
+sont toujour comparabl 1
+sont toujour concentr 1
+sont toujour requ 1
+sont toujour stock 1
+sont toujour vr 1
+sont tout 2
+sont tout continu 1
+sont tout dabord 1
+sont tout le 1
+sont tout ofaus 1
+sont toutef 1
+sont toutef mineur 1
+sont toutef qu 1
+sont tr 4
+sont tr es 3
+sont traduit 1
+sont traduit par 1
+sont trait 1
+sont trait es 1
+sont transform 1
+sont transform ee 1
+sont transpar 1
+sont transpar aux 1
+sont triv 1
+sont triv equiv 1
+sont trop 1
+sont trop incertain 1
+sont typiqu 1
+sont typiqu constitu 1
+sont typiqu le 1
+sont un ca 1
+sont unif 1
+sont unif ee 1
+sont util 3
+sont util ee 1
+sont util es 2
+sont util pour 1
+sont utilisabl 1
+sont utilisabl dan 1
+sont v erif 1
+sont victim 1
+sont victim de 1
+sont visit 1
+sont visit ee 1
+sont vr 1
+sont vr ou 1
+sont vraisemblabl 1
+sontag 1
+soon 1
+sooner 1
+sop 1
+soph 25
+soph an 2
+soph an compon 1
+soph antipol 4
+soph antipol b.p 1
+soph antipol ced 3
+soph antipol franc 1
+soph comput 1
+soph comput method 1
+soph dat 2
+soph dat structur 2
+soph fact 1
+soph fact techniqu 1
+soph imag 1
+soph imag quer 1
+soph implem 1
+soph master 1
+soph master loc 1
+soph mut 1
+soph mut select 1
+soph oper 1
+soph perform 1
+soph perform model 1
+soph reflect 1
+soph reflect neur 1
+soph repr 1
+soph softwar 1
+soph softwar engineer 1
+soph strateg 1
+soph system 1
+soph technolog 1
+soph technolog deliv 1
+soph test 1
+soph than requir 1
+soph tool 2
+soph us 1
+soph way 1
+soph xp 1
+soph xp ba 1
+soph.inr.fr 1
+soph.inr.fr geiger 1
+soph.inr.fr geiger soph.inr.fr 1
+sophiaantipol 3
+sophistiqu 1
+sophistiqu ee 1
+sophistiqu ee de 1
+sophistiqu ee du 1
+sophistiqu ee en 1
+sophistiqu es 1
+sophistiqu es qu 1
+sor 3
+sor hor 1
+sor hor de 1
+sor institut 1
+sor institut nat 1
+sor knew 1
+sor knew weatherbur 1
+sor.inr.fr 1
+sor90 1
+sorcerer 1
+sorcerer support 1
+sorcerer support tr 1
+sort 50
+sort 1st 1
+sort 1st order 1
+sort 8m 1
+sort 8m doubl 1
+sort 8m integer 1
+sort a larger 1
+sort a random 1
+sort a var 1
+sort accord 1
+sort algorithm 6
+sort algorithm ba 1
+sort algorithm recur 1
+sort algorithm us 1
+sort algorithm using 1
+sort algorithm work 1
+sort along contour 1
+sort an ar 1
+sort and merg 1
+sort and permut 1
+sort and rel 1
+sort and search 3
+sort and select 1
+sort ar 2
+sort ar q0 1
+sort ba 1
+sort beat 1
+sort benchmark 1
+sort bool 1
+sort both integer 1
+sort buck 1
+sort by ad 1
+sort by decr 1
+sort by dist 2
+sort by order 1
+sort by querybound 1
+sort by record 1
+sort by regl 1
+sort by timestamp 1
+sort cent 1
+sort cent pur 1
+sort common 1
+sort common avail 1
+sort dat 1
+sort de 1
+sort de la 1
+sort de ne 1
+sort donc 1
+sort donc de 1
+sort doubl 1
+sort doubl prec 1
+sort du 1
+sort du fuseau 1
+sort dun 1
+sort dun bloc 1
+sort each buck 1
+sort el 1
+sort el ba 1
+sort equ 1
+sort equ forml 1
+sort est 1
+sort est le 1
+sort est quun 1
+sort ffq0 1
+sort film 1
+sort float 1
+sort float point 1
+sort form 1
+sort from nearest 1
+sort in parallel 1
+sort in situ 1
+sort in step 1
+sort in theorem 1
+sort inform 1
+sort input 1
+sort input el 1
+sort input gener 1
+sort input valu 1
+sort integer 1
+sort integer using 1
+sort intern 1
+sort is bound 1
+sort is ea 1
+sort is empt 1
+sort is renam 1
+sort l accord 1
+sort larticl 1
+sort larticl entr 1
+sort list 5
+sort log 3
+sort method 2
+sort modl 1
+sort modl parameter 1
+sort n el 1
+sort n pmbp 1
+sort n record 1
+sort nat 1
+sort network 3
+sort non 1
+sort non decr 1
+sort of 8m 1
+sort of con 1
+sort of conceptu 1
+sort of consider 1
+sort of dep 1
+sort of funct 2
+sort of integer 1
+sort of modl 1
+sort of platform 1
+sort of refer 1
+sort of specl 1
+sort of support 1
+sort of var 1
+sort of whit 1
+sort oid 1
+sort on parallel 1
+sort on sp2 1
+sort on t3d 1
+sort oper 2
+sort order 3
+sort out sort 1
+sort pa 1
+sort pa requir 1
+sort particl 1
+sort particl pair 1
+sort peopl 1
+sort ph 1
+sort ph requir 1
+sort pr 1
+sort pr calculus 1
+sort prior 1
+sort prior algorithm 1
+sort prior scheduler 1
+sort problem 1
+sort problem inst 1
+sort proc 2
+sort program 1
+sort pur 1
+sort pur denot 1
+sort qu 3
+sort qu de 1
+sort qu la 2
+sort qu ladr 1
+sort qu le 1
+sort qu ni 1
+sort qu sa 1
+sort qu si 1
+sort qu tout 1
+sort quil 1
+sort quun 2
+sort quun processeur 1
+sort rel 1
+sort rel problem 1
+sort requir 1
+sort run 1
+sort run init 1
+sort se 1
+sort seem 1
+sort seem espec 1
+sort sequ 2
+sort sequ receiv 1
+sort solut 1
+sort solut requir 1
+sort step 1
+sort subsequ 1
+sort subsequ receiv 1
+sort techniqu 1
+sort th appl 1
+sort th ar 1
+sort th argum 1
+sort th dat 1
+sort th edg 1
+sort th event 1
+sort th fil 1
+sort th inst 1
+sort th leav 1
+sort th np 1
+sort th object 1
+sort th record 1
+sort theor 1
+sort thing 1
+sort to elim 1
+sort to permut 1
+sort typ 1
+sort using 2
+sort with multipl 1
+sortir 1
+sortir de 1
+sortir de la 1
+sortir du 1
+sortir du pr 1
+sortnat 1
+souc 4
+souc const 1
+souc de 1
+souc de conc 1
+souc de part 1
+souc de simplicit 1
+souc dexhaustivit 1
+souc es 1
+souc es de 1
+souc pragmatiqu 1
+soudr 1
+soudr de 1
+soudr de probl 1
+soudr explicit 1
+soudr explicit le 1
+souffr 1
+souffr n eanmoin 1
+sought 8
+sought a uniqu 1
+sought after confid 1
+sought rigid 1
+sought rigid mot 1
+sought to maxim 1
+sought to tackl 1
+souhait 3
+souhait a posterior 1
+souhait de 2
+souhait de modif 1
+souhait de ne 1
+souhait ee 1
+souhait ee pour 1
+souhait es 1
+souhait le 1
+souhait le transfer 1
+souhait obtenir 1
+souhait permettr 1
+souhait quun 1
+souhait quun mi 1
+souhait rendr 1
+souhait rendr le 1
+souhaitabl 1
+souhaitabl en 1
+souhaitabl en compl 1
+souhaiter 1
+souhaiter eviter 1
+souhaiter eviter de 1
+souhaiter laisser 1
+souhaiter laisser un 1
+soul 1
+soul ve 1
+soul ve beaucoup 1
+soul ve gal 1
+soulev 1
+soulev es 1
+soulev es par 1
+soulever 1
+soulever so 1
+soulign 3
+soulign e de 1
+soulign e le 2
+soulign e qu 1
+soulign ee 1
+soulign la 1
+soulign la validit 1
+soulign le 2
+soulign le avant 1
+souligner 1
+souligner la 1
+souligner la pr 1
+souligner le 1
+souligner le avant 1
+souligner le techniqu 1
+souligner leur 1
+souligner leur interact 1
+soulignon 1
+soulignon par 1
+soulignon par exempl 1
+soulignon qu 1
+soulignon quand 1
+soulignon quand cest 1
+soum 3
+soum a dautr 1
+soum a un 1
+soum aux 1
+soum aux homograph 1
+soum le 1
+soum le syst 1
+sound 13
+sound and compl 5
+sound ar handl 1
+sound criter 1
+sound direct 1
+sound form 1
+sound form ba 1
+sound proper 1
+sound proper disc 1
+sound qu 1
+sound qu uniform 1
+sound refin 1
+sound refin law 1
+sound sem 1
+sound syntact 1
+sound system 1
+sound wav 1
+sound wav em 1
+sound which draw 1
+soupl 3
+soupl avec 1
+soupl avec laccr 1
+soupl dan 1
+soupl dan lappl 1
+soupl de 2
+soupl de ag 1
+soupl de program 1
+soupl dinterv 1
+soupl dinterv suff 1
+soupl dutil 1
+soupl qu 1
+soupl qu la 1
+sourc 47
+sourc and dest 1
+sourc and destin 1
+sourc and simpl 1
+sourc and sink 1
+sourc and thus 1
+sourc ast 1
+sourc by comp 1
+sourc candid 1
+sourc candid me 1
+sourc chang 1
+sourc chang appl 1
+sourc chang rep 1
+sourc cl 1
+sourc cod 10
+sourc cod expr 1
+sourc cod incompatibil 1
+sourc cod interfac 1
+sourc cod level 1
+sourc cod list 1
+sourc cod modif 1
+sourc cod standard 1
+sourc cod upgrad 1
+sourc coder 1
+sourc coder system 1
+sourc compiler 1
+sourc compiler gener 1
+sourc compon 1
+sourc compon inst 1
+sourc compon produc 1
+sourc compr 1
+sourc compr imag 1
+sourc compr schem 1
+sourc dam 1
+sourc dam elior 1
+sourc de 2
+sourc de complexit 1
+sourc de la 1
+sourc de surc 1
+sourc dest 2
+sourc dest pair 2
+sourc dest switch 1
+sourc en 1
+sourc en syntac 1
+sourc env 1
+sourc env le 1
+sourc equiv 1
+sourc et le 1
+sourc fil 1
+sourc gener 1
+sourc gener tool 1
+sourc goal 1
+sourc header 1
+sourc header dest 1
+sourc in order 1
+sourc interm 1
+sourc interm ediair 1
+sourc is extract 1
+sourc is leak 1
+sourc is treat 1
+sourc level 1
+sourc level transform 1
+sourc me 1
+sourc me ge 1
+sourc me sg 1
+sourc model 1
+sourc model extract 1
+sourc must wait 1
+sourc new libr 1
+sourc nod 4
+sourc nod encod 1
+sourc nod inform 1
+sourc of al 1
+sourc of empir 1
+sourc of error 3
+sourc of ineff 3
+sourc of inform 1
+sourc of inspir 1
+sourc of int 1
+sourc of knowledg 1
+sourc of loc 1
+sourc of perform 1
+sourc of polynom 1
+sourc of sampl 1
+sourc of task 1
+sourc optim 1
+sourc optim transform 1
+sourc or bin 1
+sourc or caus 1
+sourc par 1
+sourc par linterm 1
+sourc par un 1
+sourc po de 1
+sourc princip 1
+sourc princip de 1
+sourc proc 2
+sourc proc def 1
+sourc proc p1 1
+sourc proc p2 1
+sourc proc p3 1
+sourc produc 1
+sourc produc pack 1
+sourc program 5
+sourc program descript 1
+sourc program execut 1
+sourc router 1
+sourc router networkinterfac 1
+sourc s0 1
+sourc shortest 1
+sourc shortest path 1
+sourc sink 1
+sourc sink pair 1
+sourc sink workload 1
+sourc soit 1
+sourc soit dan 1
+sourc string 1
+sourc syntac 1
+sourc syntac tr 1
+sourc th gener 1
+sourc to sourc 2
+sourc transform 1
+sourc ver 1
+sourc wh 1
+sourc when further 1
+sourc which receiv 1
+sourir 1
+sourir de 1
+sourir de mireil 1
+sourn 1
+sourn de 1
+sourn de ce 1
+sous 5
+sous appel 1
+sous arbr 1
+sous arbr de 1
+sous certain 2
+sous certain condit 1
+sous certain hypoth 1
+sous champ 1
+sous champ du 1
+sous d ev 1
+sous ensembl 4
+sous ensembl al 1
+sous ensembl de 3
+sous ensembl est 1
+sous ensembl par 1
+sous ensembl particl 1
+sous ensembl xij1 1
+sous espac 2
+sous espac aff 1
+sous espac de 1
+sous form 4
+sous form algorithmiqu 1
+sous form dappel 1
+sous form de 4
+sous form dun 3
+sous form encapsl 1
+sous form matriciel 1
+sous form spmd 1
+sous graph 1
+sous graph du 1
+sous group 1
+sous group de 1
+sous ibm 1
+sous jacent 3
+sous jacent est 1
+sous jacent sont 1
+sous la 5
+sous la deux 1
+sous la don 1
+sous la form 4
+sous lact 1
+sous lact du 1
+sous le 3
+sous le hypoth 1
+sous le nom 2
+sous le term 1
+sous leff 2
+sous leff de 1
+sous leff ping 1
+sous lenviron 1
+sous leur 1
+sous leur form 1
+sous modl 1
+sous modl de 1
+sous optimaux 1
+sous pein 1
+sous pein de 1
+sous popl 1
+sous popl de 1
+sous popl etant 1
+sous popl peuv 1
+sous popl qu 1
+sous popl se 1
+sous sa 2
+sous sa form 1
+sous sa ver 1
+sous structur 1
+sous structur qu 1
+sous t ach 1
+sous top 1
+sous top dun 1
+sous trait 1
+sous un 1
+sous un de 1
+sous votr 1
+sous votr toit 1
+sousespac 1
+sousespac d efin 1
+sousstructur 1
+sousstructur dan 1
+sousstructur dan le 1
+soustract 1
+soustract sont 1
+soustract sont le 1
+soutenu 2
+soutenu le 2
+south 4
+south american workshop 1
+south east 2
+south east quadr 1
+south west 1
+south west neighbor 1
+southeast 2
+southern 4
+southern californ 3
+southern method 1
+souv 5
+souv a de 1
+souv a la 1
+souv ajout 1
+souv ajout ee 1
+souv concentrer 1
+souv concentrer la 1
+souv d elicat 1
+souv de 2
+souv de conflit 1
+souv de ecart 1
+souv ignor 1
+souv int 1
+souv int er 1
+souv la 1
+souv la gest 1
+souv la meilleur 1
+souv le 1
+souv le nid 1
+souv planair 1
+souv planair dun 1
+souv pr 1
+souv pr entr 1
+souv raffin 1
+souv raffin ee 1
+souv sup 1
+souv sup erieur 1
+souv un environ 1
+souv util 2
+souv util ee 1
+souz 1
+souz92 1
+souz93 1
+soybean 1
+soybean larg vehicl 1
+sp 23
+sp analog 1
+sp analog circuit 1
+sp and apprel 1
+sp and mark 1
+sp and tic 1
+sp ec 2
+sp ec attr 1
+sp ec au 1
+sp ec de 1
+sp ec dinstruc 1
+sp ec du 1
+sp ec ee 2
+sp ec es 2
+sp ec est 1
+sp ec le 1
+sp ec sur 1
+sp ec syst 1
+sp ec util 1
+sp ecialiser 1
+sp ecialiser le 1
+sp ecif 4
+sp ecif afin 1
+sp ecif com 1
+sp ecif de 2
+sp ecif ee 1
+sp ecif es 2
+sp ecif la 1
+sp ecif le 1
+sp ecificit 3
+sp ecifiqu 3
+sp ecifiqu appel 1
+sp ecifiqu au 1
+sp ecifiqu aux 1
+sp ecifiqu de 1
+sp ecifiqu font 1
+sp ecifiqu nec 1
+sp ecifiqu pour 1
+sp ef 1
+sp ef rf 1
+sp et cl 1
+sp hav signif 1
+sp ibtp 1
+sp ibtp irp 1
+sp is giv 1
+sp is increm 1
+sp is st 1
+sp log 1
+sp math 1
+sp med 1
+sp med imag 1
+sp mobil 1
+sp mobil robot 1
+sp of ext 1
+sp phot 1
+sp phot east 1
+sp point 1
+sp rl 1
+sp sp 1
+sp succ 1
+sp succ predict 1
+sp switch 1
+sp system 1
+sp t1 1
+sp t1 tp 1
+sp th addr 1
+sp ux 1
+sp visu 1
+sp visu commun 1
+sp vl 1
+sp vl bp 1
+sp vol 1
+sp1 2
+sp1 high perform 1
+sp1 mpl 1
+sp1 sp2 1
+sp1000 1
+sp2 3
+sp2 and convec 1
+sp2 buffer 1
+sp2 buffer wormhol 1
+sp2 chunk 1
+sp2 high perform 1
+sp2 lik centr 1
+sp2 mp 1
+sp2 number 1
+sp2 switch 1
+sp2 wn 1
+sp90 1
+sp92 1
+sp93 1
+spac 86
+spac acc 1
+spac aff 1
+spac aff hyperplan 1
+spac afford 1
+spac alloc 2
+spac and caus 1
+spac and constrain 1
+spac and eff 1
+spac and indep 1
+spac and logarithm 1
+spac and nav 1
+spac and newl 1
+spac and proof 1
+spac and therefor 1
+spac and tim 2
+spac approach 1
+spac ar ea 1
+spac ar minim 1
+spac ar sensit 1
+spac architectur 1
+spac as mov 1
+spac assoc 1
+spac avail 1
+spac between print 1
+spac between wir 2
+spac by mak 1
+spac by search 1
+spac c1 1
+spac cel 1
+spac chang 1
+spac character 1
+spac complec 2
+spac compr 1
+spac compr sol 1
+spac con 1
+spac constraint 2
+spac consum 2
+spac contain 1
+spac count 1
+spac curv 1
+spac dat 1
+spac dat structur 1
+spac decomposit 1
+spac distribut 3
+spac distribut memor 1
+spac distribut mov 1
+spac distribut order 1
+spac dk 1
+spac dm 1
+spac drast 1
+spac dur execut 1
+spac eff 2
+spac eff dat 1
+spac emb 1
+spac eoec 1
+spac eoec po 1
+spac farther 1
+spac fil 1
+spac fil curv 1
+spac for buffer 1
+spac for build 1
+spac for landmark 1
+spac for parallel 1
+spac further 1
+spac fy 1
+spac graph 1
+spac graph framework 1
+spac ha plagu 1
+spac handl 1
+spac hi 1
+spac hyperplan 1
+spac i ae 1
+spac iff 1
+spac in incompl 1
+spac in non 1
+spac in quadr 1
+spac ind 1
+spac ind incr 1
+spac inform 1
+spac int block 1
+spac int til 1
+spac interact 1
+spac invit 1
+spac is acc 1
+spac is ba 1
+spac is character 1
+spac is contain 1
+spac is creat 1
+spac is defin 1
+spac is describ 1
+spac is destr 1
+spac is divid 1
+spac is dynam 1
+spac is eff 1
+spac is expon 1
+spac is implem 1
+spac is lin 1
+spac is proport 1
+spac is reclaim 1
+spac is straightfor 1
+spac is trapez 1
+spac j tab 1
+spac lbl 1
+spac level 1
+spac lik lu 1
+spac lim 3
+spac lin 1
+spac log 1
+spac map 1
+spac map improv 1
+spac map loc 1
+spac may contain 1
+spac memor 1
+spac memor requir 1
+spac mk 1
+spac model 1
+spac model allow 1
+spac multicomputer 1
+spac multiproc 1
+spac nam 1
+spac navig 1
+spac of configur 1
+spac of polynom 1
+spac of proc 1
+spac of proof 1
+spac of solut 1
+spac on sit 1
+spac on top 1
+spac oper 1
+spac optim 1
+spac or ind 1
+spac overhead 3
+spac overlap 1
+spac part 1
+spac partit 2
+spac partit problem 1
+spac partit tr 1
+spac per ind 1
+spac per nod 1
+spac per proc 1
+spac perform 1
+spac plan 1
+spac plan problem 1
+spac planner 1
+spac planner csp 1
+spac planner prototyp 1
+spac planner system 1
+spac planner using 1
+spac polyhedr 1
+spac reappear 1
+spac repl 1
+spac repl dat 1
+spac repr 1
+spac requir 6
+spac resourc 1
+spac restrict 1
+spac saving garb 1
+spac shar 1
+spac shar memor 1
+spac structur 1
+spac suggest 1
+spac tempor 1
+spac tempor repr 1
+spac th system 1
+spac than tim 1
+spac that contain 1
+spac tim 1
+spac tim tradeoff 1
+spac to allow 1
+spac to displ 1
+spac to featur 1
+spac to giv 1
+spac to man 1
+spac to rectangl 1
+spac to satisf 1
+spac to st 2
+spac to system 1
+spac to writ 1
+spac trad 1
+spac using 2
+spac using regl 1
+spac util 3
+spac util wh 1
+spac var 1
+spac var postproc 1
+spac ver 1
+spac wa norm 1
+spac wa recover 1
+spac which appear 1
+spac wil result 1
+spac with assoc 1
+spac with concur 1
+spac with dat 1
+spac with lock 1
+spac with proc 1
+spac with stretchtool 1
+spac with zer 1
+spac without lock 1
+spac without overlap 1
+spac xu 1
+spacepartit 1
+spacepartit proper 1
+spafford 1
+spain 6
+span 23
+span a wid 1
+span bridg 1
+span bridg connect 1
+span by integer 1
+span c pag 1
+span distribut 1
+span distribut comput 1
+span forest 1
+span multipl 2
+span multipl board 2
+span of lif 1
+span of system 1
+span strateg 1
+span th entir 1
+span th spectr 1
+span tr 9
+span tr construc 1
+span tr obtain 1
+span tr problem 3
+span tr produc 1
+span tr protocol 1
+span tr t1 1
+span tr void 1
+spanner 1
+spanner and path 1
+spanner concept 1
+spanner deliver 1
+spanner g0 1
+spanner gener 1
+spanner in term 1
+spanner in weight 1
+spanner is 2t 1
+spanner is an 1
+spanner is je1j 1
+spanner is judg 1
+spanner is tight 1
+spanner is us 1
+spanner of g1 1
+spanner of graph 1
+spanner of unweight 1
+spanner of weight 1
+spanner on weight 1
+spanner sp 1
+spanner with fact 1
+spanner with low 1
+spanner with siz 1
+spanner with wt 1
+spar 21
+spar and den 1
+spar b tr 1
+spar cholesk 1
+spar cholesk fact 1
+spar coeff 1
+spar coeff matr 1
+spar compl 1
+spar compl se 1
+spar connect 1
+spar connect architectur 1
+spar connect tap 1
+spar dag 1
+spar dat 1
+spar del 1
+spar del architectur 1
+spar distribut 1
+spar distribut memor 1
+spar eigenproblem 1
+spar eigenproblem pl 1
+spar euclidean 1
+spar euclidean spanner 1
+spar ev fi 1
+spar fact 1
+spar graph 2
+spar ind 1
+spar it advantag 1
+spar label 1
+spar label tr 1
+spar langu 1
+spar lin 1
+spar lin system 1
+spar matr 4
+spar matr ar 1
+spar matr comput 1
+spar matr dep 1
+spar matr fact 2
+spar matr order 2
+spar matr reorder 1
+spar matr technolog 1
+spar matr using 1
+spar matr vect 2
+spar matriz 1
+spar mi 1
+spar mi classif 1
+spar model 1
+spar network 1
+spar partit 1
+spar pattern 2
+spar pattern com 1
+spar popl 1
+spar popl background 1
+spar posit 1
+spar posit definit 1
+spar proper 1
+spar reg 1
+spar regl 1
+spar regl langu 1
+spar result 1
+spar spanner 1
+spar symmeter 1
+spar symmeter matr 1
+spar symmeter posit 1
+spar symmeter system 1
+spar system 5
+spar t spanner 1
+spar th ten 1
+spar uniform 1
+spar uniform exampl 1
+sparc 12
+sparc architectur 2
+sparc architectur manu 1
+sparc elc 1
+sparc elc workst 1
+sparc intern 1
+sparc intern inc 1
+sparc memor 1
+sparc memor model 1
+sparc proc 3
+sparc stat 3
+sparc stat ii 1
+sparc workst 2
+sparc workst connect 1
+sparc workst network 1
+sparc workst oper 1
+sparcst 8
+sparcst 330gx 1
+sparcst built 1
+sparcst ii 1
+sparcst ii run 1
+sparcst ipx 1
+sparcst2 1
+sparser 1
+sparser th farther 1
+sparsest 1
+sparsest spanner 1
+spat 24
+spat 2a 1
+spat 2a pentomin 1
+spat a pour 1
+spat a sur 1
+spat acc 2
+spat acc method 2
+spat adapt 1
+spat adapt reconstruc 1
+spat ain 1
+spat ain quun 1
+spat and tempor 3
+spat au 1
+spat au ca 1
+spat caract 1
+spat caract er 1
+spat concept 1
+spat concern 1
+spat concern le 1
+spat conform 1
+spat correl 2
+spat correspon 1
+spat correspon au 1
+spat dan 1
+spat dan le 1
+spat dat 4
+spat dat ar 1
+spat dat object 1
+spat dat se 1
+spat dat structur 3
+spat datab 2
+spat datab acc 1
+spat de 2
+spat de ce 1
+spat de lectur 1
+spat de point 1
+spat dec 1
+spat dec mak 1
+spat decomposit 1
+spat dep 1
+spat dim 1
+spat dist 1
+spat dist polygon 1
+spat distinct 1
+spat don 1
+spat don ee 1
+spat du 1
+spat du program 1
+spat dun 1
+spat dun nid 1
+spat equiv 1
+spat est 1
+spat est alor 1
+spat est en 1
+spat est souv 1
+spat et de 1
+spat et la 1
+spat et le 1
+spat etant 1
+spat etant automatiqu 1
+spat form 1
+spat inform 3
+spat inform system 1
+spat join 1
+spat join using 1
+spat knowledg 1
+spat loc 1
+spat loc becom 1
+spat log 1
+spat log ba 1
+spat object 3
+spat or geograph 1
+spat pa 1
+spat pa par 1
+spat pattern 1
+spat peut 1
+spat peut donc 1
+spat peut etr 1
+spat proper 1
+spat qu 2
+spat qu proc 1
+spat qu tr 1
+spat quant 1
+spat quant imag 1
+spat quer 1
+spat reason 1
+spat reason ba 1
+spat reg 1
+spat rel 4
+spat relationship 2
+spat resolut 2
+spat resourc 1
+spat rev 1
+spat s tel 1
+spat search 1
+spat separ 1
+spat sont 1
+spat sont rich 1
+spat structur 1
+spat sur 1
+spat techniqu 1
+spat tempor 3
+spat tempor algorithm 1
+spat tempor approach 1
+spat tempor dat 1
+spat tempor reason 1
+spat tempor sampl 1
+spat tessel 1
+spat theor 1
+spat tient 1
+spat tient un 1
+spat un vecteur 1
+spat uncertaint 1
+spat vect 1
+spat vect dat 1
+spawn 4
+spawn a proc 1
+spawn a recur 1
+spawn instruc 1
+spawn instruc proc 1
+spawn n cop 1
+spawn simultan 1
+spb 1
+spc 1
+speak 15
+speak about term 1
+speak fr 1
+speak in favor 1
+speak mal 1
+speak mark 1
+speak of oper 1
+speak their thought 1
+speaker 2
+spec 34
+spec 8.html 1
+spec 8.html sec7 1
+spec adapt 1
+spec agent 1
+spec agent work 1
+spec algorithm 2
+spec an 1
+spec an object 1
+spec an program 1
+spec and cl 1
+spec and fact 1
+spec and gener 1
+spec and inherit 1
+spec and jud 1
+spec and modl 1
+spec and new 1
+spec and worker 1
+spec argum 1
+spec attribut 1
+spec b fdsp 1
+spec b fdspl 1
+spec benchmark 1
+spec benchmark program 1
+spec by user 1
+spec c network 1
+spec ca 1
+spec can act 1
+spec ch 2
+spec ch threshold 1
+spec cl 3
+spec clientcl.tp 1
+spec clientcl.tp nod 1
+spec cod 1
+spec comput 1
+spec comput geometer 1
+spec constraint 1
+spec constraint log 1
+spec dat 1
+spec dat structur 1
+spec entr 1
+spec entr point 1
+spec espr 1
+spec espr boolean 1
+spec fault 1
+spec fault tr 1
+spec funct 1
+spec funct fc 1
+spec hardwar 2
+spec hardwar cal 1
+spec html 1
+spec html spec 1
+spec in particl 1
+spec ind 1
+spec inh 1
+spec inh sd 1
+spec inst 1
+spec int sub 1
+spec interfac 1
+spec interfac fil 1
+spec interpreter 1
+spec is funct 1
+spec it form 1
+spec it parent 1
+spec j pr 1
+spec knowledg 1
+spec lamb 1
+spec lamb list 1
+spec lambd 1
+spec lambd list 1
+spec langu 1
+spec mach 1
+spec mach learn 1
+spec may proceed 1
+spec measur 1
+spec method 1
+spec modif 1
+spec modl 1
+spec mor gener 1
+spec natur 1
+spec net 1
+spec neur 2
+spec neur hardwar 1
+spec neur network 1
+spec object 1
+spec of cl 1
+spec of ec 1
+spec of method 1
+spec of sub 1
+spec of synchron 1
+spec of theorem 1
+spec on argum 1
+spec on new 1
+spec on recogn 1
+spec on subcl 1
+spec oper 1
+spec parameter 1
+spec point 1
+spec point funct 1
+spec point mov 1
+spec problem 1
+spec problem solut 1
+spec program 3
+spec result 1
+spec risc 1
+spec slot 1
+spec slot descript 1
+spec softwar 1
+spec sol 1
+spec tak 1
+spec task 1
+spec techniqu 1
+spec technolog 1
+spec th dat 1
+spec th ind 1
+spec th me 1
+spec tim 1
+spec to ensur 1
+spec to perform 1
+spec to produc 1
+spec to restrict 1
+spec transform 1
+spec transform spec 1
+spec ver 2
+spec ver f3 1
+spec vf 1
+spec vf displ 1
+spec vl 1
+spec vl displ 1
+spec wil ment 1
+spec with respect 1
+spec.no 1
+spec.no good 1
+spec.no good tn.spec 1
+spec0 1
+spec1 1
+spec2 1
+specializ 2
+specializ th funct 1
+specializationpoint 1
+specializationpoint funct 1
+specializationpoint funct record 1
+specif 98
+specif a compl 1
+specif a complec 1
+specif a connect 1
+specif a distribut 1
+specif a fic 1
+specif a gener 1
+specif a modl 1
+specif a protocol 1
+specif a pur 1
+specif a react 1
+specif a replac 1
+specif a rol 1
+specif a ser 1
+specif a sub 1
+specif a switch 1
+specif a system 1
+specif a uniqu 1
+specif a valu 1
+specif abstract 1
+specif act 1
+specif adv 1
+specif allow 2
+specif an author 1
+specif an event 1
+specif an input 1
+specif an inv 1
+specif and adapt 2
+specif and administer 1
+specif and alter 1
+specif and car 1
+specif and construc 1
+specif and def 1
+specif and design 2
+specif and discard 1
+specif and dynam 1
+specif and evalu 1
+specif and execut 2
+specif and gener 2
+specif and keep 1
+specif and modif 1
+specif and program 1
+specif and proof 3
+specif and prototyp 1
+specif and refin 1
+specif and synth 1
+specif and typ 1
+specif and verif 4
+specif answer 1
+specif answer an 1
+specif any integer 1
+specif any number 1
+specif appl 3
+specif appl method 1
+specif ar decl 1
+specif ar disc 1
+specif ar found 1
+specif ar isol 1
+specif architectur 3
+specif architectur character 2
+specif as follow 1
+specif as requir 1
+specif as sit 1
+specif assum 1
+specif at level 1
+specif attribut 2
+specif ba 2
+specif ba select 1
+specif ba techniqu 1
+specif ba test 1
+specif been forml 1
+specif behavior 1
+specif behavior ba 1
+specif behaviour 1
+specif bi 1
+specif bind 1
+specif bit 1
+specif bod 1
+specif built 1
+specif bus 2
+specif bus ba 2
+specif by defin 1
+specif by deg 1
+specif by pr 1
+specif by sequ 1
+specif by spec 1
+specif by supercl 1
+specif ca 2
+specif captur 1
+specif caus 1
+specif caus ext 1
+specif certain spat 1
+specif ch 2
+specif chang 2
+specif chunk 1
+specif cl 2
+specif collect 1
+specif collect commun 1
+specif comb 2
+specif commun 1
+specif compiler 1
+specif complec 1
+specif complec requir 1
+specif concept 1
+specif concept offer 1
+specif conclus 1
+specif concr 1
+specif concr syntac 1
+specif condit 1
+specif configur 2
+specif constrain 1
+specif constrain appl 1
+specif constraint 4
+specif constraint propag 1
+specif constraint satisf 1
+specif contain 1
+specif contribut 1
+specif control 1
+specif correspon 1
+specif curricl 1
+specif curricl challeng 1
+specif dat 4
+specif dat se 2
+specif dat structur 1
+specif dbm 1
+specif dbm using 1
+specif default 1
+specif default constraint 1
+specif defin 1
+specif denot 1
+specif denot extr 1
+specif descript 1
+specif design 2
+specif develop 1
+specif di 1
+specif di descript 1
+specif differ 1
+specif disadv 1
+specif discr 1
+specif discr mesh 1
+specif distribut 2
+specif distribut architectur 1
+specif distribut directiv 1
+specif domain 3
+specif domain knowledg 1
+specif driv 1
+specif driv util 1
+specif drop 1
+specif dut 1
+specif dut requir 1
+specif ea 1
+specif eff 1
+specif el 3
+specif el mach 1
+specif empl 1
+specif encod 1
+specif ent 1
+specif es 1
+specif exampl 1
+specif exampl show 1
+specif explan 1
+specif explicit 1
+specif extract 1
+specif failur 1
+specif faith 1
+specif fe 1
+specif fe appl 1
+specif featur 3
+specif field 1
+specif field param 1
+specif fil 2
+specif follow 1
+specif for ap 1
+specif for cel 1
+specif for cobol 1
+specif for comput 1
+specif for eff 1
+specif for loc 1
+specif for object 1
+specif for structur 1
+specif form 4
+specif form condit 1
+specif frequ 1
+specif from conglomer 1
+specif funct 2
+specif gender 1
+specif gender mal 1
+specif gener 1
+specif giv 2
+specif group 2
+specif ha claus 1
+specif ha proc 1
+specif hardwar 1
+specif hardwar decod 1
+specif harmon 1
+specif harmon exampl 1
+specif how addit 1
+specif how deriv 1
+specif how perform 1
+specif how program 1
+specif how ss 1
+specif imag 1
+specif imag cont 1
+specif in figur 1
+specif in log 1
+specif in lower 1
+specif in msg 1
+specif in precc 1
+specif in prolog 1
+specif in rol 1
+specif in rtl 1
+specif in tabl 1
+specif inclus 1
+specif inform 1
+specif init 1
+specif initarg 1
+specif initform 1
+specif inst 2
+specif instruc 1
+specif int cod 1
+specif int concr 1
+specif int eff 1
+specif int text 1
+specif interfac 1
+specif interfac chang 1
+specif interv 2
+specif involut 1
+specif is cur 1
+specif is disc 1
+specif is du 1
+specif is rel 1
+specif is stat 1
+specif is writ 1
+specif it effect 1
+specif item 1
+specif j inform 1
+specif knowledg 2
+specif lambd 1
+specif lambd list 1
+specif langu 9
+specif langu ext 1
+specif langu interfac 1
+specif langu sl1 1
+specif langu ver 1
+specif learn 1
+specif learn algorithm 1
+specif liter 1
+specif loc 1
+specif look 1
+specif lookup 1
+specif lookup funct 1
+specif mach 1
+specif mach requir 1
+specif macr 1
+specif mechan 1
+specif memor 1
+specif memor coh 1
+specif method 3
+specif method ch 1
+specif methodolog 1
+specif model 1
+specif modif 2
+specif modl 3
+specif modl ad 1
+specif monit 1
+specif monit algorithm 1
+specif mor maintain 1
+specif mor prec 1
+specif nam 1
+specif non 1
+specif non block 1
+specif nonblock 1
+specif nonblock shar 1
+specif nor redund 1
+specif number 3
+specif obtain 2
+specif obtain result 2
+specif oe 1
+specif of bar 1
+specif of cl 1
+specif of collect 1
+specif of comp 1
+specif of complec 1
+specif of control 1
+specif of cooper 1
+specif of cor 1
+specif of domain 1
+specif of ec 1
+specif of infinit 1
+specif of inform 1
+specif of interrel 1
+specif of kb 1
+specif of loc 1
+specif of object 1
+specif of parlog 1
+specif of primarybackup 1
+specif of prolog 1
+specif of replac 1
+specif of rol 1
+specif of simplif 1
+specif of synchron 1
+specif of tempor 1
+specif optim 1
+specif optim cod 1
+specif order 2
+specif orient 1
+specif orient sem 1
+specif our typ 1
+specif output 1
+specif pair 1
+specif paradigm 1
+specif paradigm ba 1
+specif parallel 1
+specif parallel ba 1
+specif parameter 2
+specif parameter allow 1
+specif parent 1
+specif parent popl 1
+specif part 2
+specif path 1
+specif pattern 1
+specif person 1
+specif piec 1
+specif point 1
+specif polymorph 1
+specif polymorph typ 1
+specif prec 1
+specif prefer 2
+specif prim 1
+specif primitiv 1
+specif primitiv lead 1
+specif prior 1
+specif prior op 1
+specif problem 3
+specif proc 1
+specif program 2
+specif program langu 2
+specif prolog 1
+specif prolog hardwar 1
+specif proof 1
+specif proof theor 1
+specif prop 1
+specif prop earl 1
+specif propag 1
+specif propag graph 1
+specif proper 5
+specif proper noun 1
+specif protocol 1
+specif prov 1
+specif prov incorrect 1
+specif qu 1
+specif quest 1
+specif reg 1
+specif regl 1
+specif rel 1
+specif rel con 1
+specif report 1
+specif repr 2
+specif request 1
+specif resourc 1
+specif resourc manag 1
+specif rewrit 1
+specif rewrit rl 1
+specif rol 1
+specif rol retain 1
+specif room 1
+specif schem 1
+specif script 1
+specif script fo.y 1
+specif se 3
+specif secur 1
+specif secur pol 1
+specif seed 1
+specif serv 1
+specif serv assoc 1
+specif server 1
+specif shap 1
+specif shunt 1
+specif siml 1
+specif siml experim 1
+specif siz 2
+specif slot 1
+specif slot spec 1
+specif softwar 1
+specif softwar architectur 1
+specif spec 1
+specif st 1
+specif startup 1
+specif startup interv 1
+specif stat 1
+specif strateg 2
+specif strateg dep 1
+specif string 2
+specif string posit 1
+specif structur 3
+specif structur featur 1
+specif stud 1
+specif synchron 1
+specif synchron constraint 1
+specif syntac 1
+specif system 3
+specif system ba 1
+specif system ea 1
+specif system implem 1
+specif tailor 1
+specif tak 1
+specif targ 3
+specif targ ad 1
+specif targ level 1
+specif task 1
+specif techniqu 1
+specif techniqu allow 1
+specif text 1
+specif th abstract 1
+specif th act 1
+specif th adapt 1
+specif th assoc 1
+specif th behavior 1
+specif th chang 1
+specif th character 1
+specif th cl 1
+specif th cod 1
+specif th color 1
+specif th compon 2
+specif th connect 1
+specif th criter 1
+specif th dat 2
+specif th detail 1
+specif th dist 1
+specif th en 1
+specif th export 1
+specif th fact 1
+specif th fib 1
+specif th flow 1
+specif th form 1
+specif th import 1
+specif th init 1
+specif th interfac 1
+specif th job 1
+specif th kb 1
+specif th list 1
+specif th lock 1
+specif th map 1
+specif th maxim 1
+specif th method 1
+specif th minim 1
+specif th monit 1
+specif th natur 1
+specif th number 1
+specif th proper 1
+specif th rang 1
+specif th re 1
+specif th relationship 1
+specif th respon 1
+specif th se 3
+specif th sem 1
+specif th sequ 1
+specif th shap 1
+specif th st 1
+specif th start 1
+specif th syntac 1
+specif th targ 2
+specif th typ 1
+specif th valu 1
+specif th vot 1
+specif th work 1
+specif than cl 1
+specif than d1j 1
+specif than d2i 1
+specif that individu 1
+specif that method 1
+specif that valu 1
+specif then con 1
+specif thread 1
+specif threshold 1
+specif through enabl 1
+specif tim 2
+specif tim interv 1
+specif tim point 1
+specif to ad 1
+specif to captur 1
+specif to ch 1
+specif to concr 1
+specif to ensur 1
+specif to erg 1
+specif to in 1
+specif to inclus 1
+specif to individu 1
+specif to perm 1
+specif to prolog 1
+specif to sv 1
+specif to us 1
+specif tool 2
+specif traff 1
+specif traff pattern 1
+specif tw simpl 1
+specif tw string 1
+specif typ 3
+specif under lambd 1
+specif under rev 1
+specif us 2
+specif us evolut 1
+specif usag 1
+specif usag pattern 1
+specif using 5
+specif usu exclus 1
+specif var 1
+specif var kind 1
+specif ver 1
+specif virtu 1
+specif virtu memor 1
+specif wer expan 1
+specif wh 1
+specif what inform 1
+specif when detect 1
+specif when undetect 1
+specif which modl 1
+specif which part 1
+specif which reader 1
+specif wil inclus 1
+specif window 1
+specif with dynam 1
+specif with minim 1
+specif writ 2
+specif. 1
+specificationofrequir 1
+specificationofrequir initialmodel 1
+specificationofrequir initialmodel adm 1
+speckenmeyer 1
+speckl 1
+speckl no 1
+speckl no reduc 1
+speckl reduc 1
+specl 6
+specl a var 1
+specl accur 1
+specl and actu 1
+specl and check 1
+specl and comput 1
+specl and error 1
+specl and examin 1
+specl ba 1
+specl but mak 1
+specl ca 1
+specl check 1
+specl check tot 1
+specl comput 1
+specl comput appl 1
+specl comput inclus 1
+specl comput mak 1
+specl comput overcom 1
+specl comput overlap 1
+specl comput techniqu 1
+specl comput yield 1
+specl dat 1
+specl error 1
+specl execut 1
+specl for program 1
+specl funct 1
+specl funct mak 1
+specl fw 1
+specl good 1
+specl in forc 1
+specl multithr 1
+specl multithread 1
+specl multithread exhibit 1
+specl multithread mach 1
+specl multithread model 1
+specl multithread smart 1
+specl multithread ye 1
+specl not good 1
+specl on iter 1
+specl posit 1
+specl reflect 1
+specl reflect produc 1
+specl smooth 1
+specl smooth aver 1
+specl th cont 1
+specl th posit 1
+specl th remot 1
+specl th valu 1
+specl that und 1
+specl tim 1
+specl tim comput 1
+specl valu 1
+specl valu farther 1
+specl var 1
+specl var valu 1
+specl window 1
+specl yield 1
+specl yield perform 1
+spect 2
+spectr 15
+spectr adapt 1
+spectr adapt postfilter 1
+spectr ar program 1
+spectr bisect 1
+spectr de 2
+spectr de la 1
+spectr de param 1
+spectr from indirect 1
+spectr graph 1
+spectr graph partit 1
+spectr langu 1
+spectr method 1
+spectr nest 1
+spectr nest dissect 1
+spectr norm 1
+spectr of capabil 1
+spectr of design 1
+spectr of non 1
+spectr of opt 1
+spectr of thing 1
+spectr partit 1
+spectr partit method 1
+spectr partit schem 1
+spectr quadrisect 1
+spectr se 1
+spectr se trouv 1
+spectr structur 1
+spectroscop 1
+spectroscop ha becom 1
+speculationfw 1
+speculationfw 1fw 1
+speculationmaxim 1
+speculationmaxim speedup 1
+speculationwith 1
+speculationwith specl 1
+speculationwith speculationmaxim 1
+speculationwith speculationmaxim speedup 1
+speech 11
+speech and eqntot 1
+speech and natur 1
+speech and sign 2
+speech and visu 1
+speech appl 1
+speech cod 1
+speech cod ba 1
+speech dur 1
+speech dur involut 1
+speech input 1
+speech involut 1
+speech pattern 1
+speech produc 1
+speech recognit 3
+speech recognit mechan 1
+speech recognit program 1
+speech speech 1
+speech speech recognit 1
+speech synth 1
+speech system 1
+speech utter 1
+speech utter involut 1
+speed 44
+speed accel 1
+speed and correct 1
+speed and datab 1
+speed and dram 1
+speed and host 1
+speed and sum 2
+speed channel 1
+speed comput 2
+speed comput system 1
+speed continu 1
+speed cruisespeed 1
+speed e difficult 1
+speed gap 1
+speed in network 2
+speed in real 1
+speed incr 1
+speed incr faster 1
+speed increm 1
+speed increm port 1
+speed infer 1
+speed infer co 1
+speed inform 1
+speed inform retrief 1
+speed interconnect 2
+speed interconnect technolog 2
+speed is measur 1
+speed maint 1
+speed multiproc 1
+speed network 5
+speed network form 1
+speed of anim 1
+speed of compil 1
+speed of loc 1
+speed of mechan 1
+speed of proc 2
+speed proc 1
+speed quicker 1
+speed rac 1
+speed rac car 1
+speed rat 1
+speed th avail 1
+speed th transm 1
+speed transducer 1
+speed transducer affect 1
+speed transducer agent 1
+speed unaccept 1
+speed under var 1
+speed up 1
+speed up avec 1
+speed up classif 1
+speed up converg 1
+speed up cql 1
+speed up de 1
+speed up du 2
+speed up fact 1
+speed up further 1
+speed up learn 1
+speed up obtain 1
+speed up obtenu 1
+speed up obtenus 1
+speed up par 1
+speed up payoff 1
+speed up presqu 1
+speed up prolog 1
+speed up qualit 1
+speed up rat 1
+speed up superlin 1
+speed up theorem 1
+speed up tot 1
+speed up wrt 1
+speedometer 1
+speedometer etc 1
+speedup 19
+speedup achief 1
+speedup after achief 1
+speedup anom 1
+speedup ar rel 1
+speedup clp 1
+speedup curv 1
+speedup decr 1
+speedup fact 2
+speedup gain 1
+speedup go 1
+speedup in theor 1
+speedup incr 1
+speedup inferior 1
+speedup is sensit 1
+speedup learn 1
+speedup neglect 1
+speedup number 1
+speedup obtain 1
+speedup obtain using 1
+speedup polygon 1
+speedup pool 1
+speedup pool siz 1
+speedup prec 1
+speedup prec eclip 1
+speedup prec ind 1
+speedup presqu 1
+speedup presqu lin 1
+speedup reflect 1
+speedup reflect comput 1
+speedup run 1
+speedup show 1
+speedup speedup 1
+speedup speedup prec 1
+speedup th context 1
+speedup through parallel 1
+speedup valu 1
+speedup versus number 1
+speedup wa assum 1
+speedupmac 1
+speer 1
+speh 1
+speh.ps 1
+spektr 1
+spel 2
+spel ar requir 1
+spel of common 1
+spellbind 1
+spellbind approach 1
+spen 15
+spen an 1
+spen an program 1
+spen extr 1
+spen extr comput 1
+spen for synchron 1
+spen idl 1
+spen idl wait 1
+spen it tim 1
+spen le tim 1
+spen mor proc 1
+spen on exploit 1
+spen on explor 1
+spen on wait 1
+spen tim 1
+spen tim maintain 1
+spen wait 1
+spen82 1
+spencer 2
+spencer daniel 1
+spendl 1
+spent 11
+spent execut 1
+spent execut built 1
+spent for food 1
+spent in commun 1
+spent in proc 1
+spent in system 1
+spent in user 1
+spent on cach 1
+spent on fac 1
+spent on maint 1
+spent per iter 1
+spent perform 1
+spent perform triangl 1
+spent to execut 1
+spent wait 1
+sperdut 1
+sperl 1
+spf 1
+spf act 1
+spf act rout 1
+spf and exbf 1
+spf and ms 1
+spf brdcast 1
+spf brdcast period 1
+spf broadcast 1
+spf broadcast event 1
+spf compon 1
+spf compon us 1
+spf dat 1
+spf dat structur 1
+spf for good 1
+spf for spf 1
+spf glob 1
+spf glob topolog 1
+spf inst 1
+spf inst param 1
+spf inst unsign 1
+spf is ch 1
+spf is shown 1
+spf is specif 1
+spf loc 1
+spf loc topolog 1
+spf nod 1
+spf nod act 1
+spf pack 1
+spf rout 1
+spf rout compon 1
+spf rout protocol 1
+spf specif 1
+spf specif field 1
+spf start 1
+spf t spf 1
+spf us 1
+spf us sequ 1
+spher 6
+spher color 1
+spher of user 1
+spher or tor 1
+spher posit 1
+spher prim 1
+spher proper 1
+spher that compl 1
+spiegelhalter 2
+spiegelhalter gilk 1
+spik 2
+spik which spoil 1
+spin 5
+spin dynam 1
+spin lock 3
+spin lock altern 1
+spin lock using 1
+spinger 1
+spinger verlag 1
+spir 2
+spirit 8
+spirit of complec 1
+spirit of conv 1
+spirit of jackson 1
+spirit of nondetermin 1
+spirit to minsk 1
+spirit work 1
+spit 10
+spit of allow 1
+spit of distribut 2
+spit of numer 1
+spit of oz 1
+spivak 1
+spl 1
+spl expr 1
+spl form 1
+spl syntac 1
+spl th form 1
+splash 1
+splash appl 1
+splash parallel 1
+splash parallel appl 1
+splec 1
+split 36
+split a giv 1
+split a list 1
+split a loop 1
+split a project 1
+split a reg 1
+split act 1
+split ad 1
+split algorithm 1
+split and classif 1
+split and link 1
+split and transfer 1
+split approach 1
+split by creat 1
+split by sen 1
+split c implem 1
+split claus 1
+split cluster 1
+split cod 1
+split conjunct 1
+split each cl 1
+split each valu 1
+split fac 1
+split ha occur 1
+split if expr 1
+split in 2d 1
+split in fram 1
+split in indep 1
+split in isvl 1
+split in red 1
+split in smaller 1
+split in yellow 1
+split inner 1
+split int appl 1
+split int arbitr 1
+split int fram 1
+split int funct 1
+split int multipl 1
+split int pag 1
+split is postpon 1
+split lin 1
+split me 1
+split mov 1
+split mov up 1
+split never occur 1
+split object 1
+split occur 1
+split on contour 1
+split oper 1
+split oper compl 1
+split parameter 1
+split ph 1
+split ph algorithm 1
+split ph compar 1
+split ph proc 1
+split ph therefor 1
+split recur 1
+split stack 1
+split stack architectur 1
+split stack model 1
+split techniqu 1
+split th bus 1
+split th cluster 1
+split th dat 1
+split th developm 1
+split th fac 1
+split th funct 1
+split th graph 1
+split th iter 1
+split th list 1
+split th method 1
+split th pag 1
+split th sibl 1
+split th specif 1
+split th stack 1
+split th tim 2
+split th tradit 1
+split them further 1
+split transact 1
+split transact bus 1
+split which return 1
+split wil leav 1
+splitter 1
+splitter a subsequ 1
+splitter and est 1
+splitter to partit 1
+splittingph 1
+splittingph algorithm 1
+spmd 4
+spmd chain 1
+spmd chain ba 1
+spmd cod 2
+spmd correspon 1
+spmd engendr 1
+spmd et mimd 1
+spmd execut 2
+spmd execut model 2
+spmd indu 1
+spmd issu 1
+spmd issu de 1
+spmd lik cod 1
+spmd model 1
+spmd perm 1
+spmd perm de 1
+spmd pour 1
+spmd pour le 1
+spmd produit 1
+spmd produit est 1
+spoil 2
+spoil th rest 1
+spoil th smooth 1
+spok 5
+spok dialogu 1
+spok or writ 2
+spon 5
+spon in part 3
+spont 1
+spont allozym 1
+spont allozym mut 1
+spontan 1
+spontan susp 1
+spontan susp continu 1
+sporad 1
+sporad and period 1
+sport 1
+sport result 1
+spot 10
+spot cr 1
+spot dat 1
+spot distribut 1
+spot dog 1
+spot ind 1
+spot is pr 1
+spot may produc 1
+spot no 1
+spot of bright 1
+spot result 2
+spot ten 1
+spot th thing 1
+spot th var 1
+spot wil lo 1
+sppedup 1
+spread 10
+spread a task 1
+spread each ri 1
+spread iter 1
+spread method 1
+spread method funct 1
+spread of featur 1
+spread out ev 1
+spread over multipl 1
+spread over proc 1
+spread th funct 1
+spread th iter 1
+spread uniform 1
+spreadsh 3
+spreadsh and gener 1
+spreadsh ba 1
+spreadsh interfac 1
+spreadsh lik 2d 1
+spreadsh lik definit 1
+spreadsh model 1
+spreadsh principl 1
+spreadsh principl simil 1
+spreadsh program 1
+spreadsh program implem 1
+spreadsh that repr 1
+spreadsh with increm 1
+spring 6
+spring joint 1
+spring joint computer 1
+spring summer 1
+spring term 1
+springer 47
+springer lectur 1
+springer lectur not 1
+springer ser 1
+springer verl 1
+springer verlag 39
+springer verlag berlin 1
+springer verlag lectur 2
+springer verlag lnc 2
+springerverlag 6
+springfield 1
+springfield avenu 1
+sprit 1
+sproc 1
+sproul 2
+sprung 1
+spur 6
+spur dat 1
+spur dat entr 1
+spur eigenvalu 1
+spur match 1
+spur or uninterest 1
+spur oscil 1
+spur oscil introduc 1
+spur output 1
+sql 3
+sql for hist 1
+sqr 1
+sqr and sqrt 1
+sqr in squar 1
+sqr renam 1
+sqrt 3
+sqrt ar avail 1
+sqrt of squar 1
+squar 35
+squar and circl 1
+squar and output 1
+squar better wcb 1
+squar board 2
+squar board ar 2
+squar brack 2
+squar brack denot 1
+squar brack graph 1
+squar brack syntac 1
+squar criter 1
+squar design 1
+squar differ 1
+squar dist 1
+squar dist number 1
+squar dist result 1
+squar error 7
+squar error cost 2
+squar error defin 1
+squar error estim 1
+squar error measur 1
+squar estim 3
+squar fit 1
+squar is import 1
+squar is mad 1
+squar is transit 1
+squar level 1
+squar level compar 1
+squar matr 2
+squar method 1
+squar of dist 1
+squar of error 1
+squar of integer 1
+squar of sidelength 1
+squar on channel 1
+squar pattern 1
+squar puzzl 1
+squar research 5
+squar research corp 1
+squar research techn 1
+squar root 1
+squar solut 1
+squar solut giv 1
+squar to determin 1
+squar to produc 1
+squar x0 1
+squar y0 1
+squar.sqr 1
+squar.sqr refer 1
+squash 1
+squash horizont 1
+squel 1
+squel de 1
+squel de claus 1
+squel du 1
+squel du cod 1
+squel est 1
+squel est reproduit 1
+squil 1
+squil et e.d 1
+sr 9
+sr csl 2
+sr denot 1
+sr intern 6
+sr model 2
+sr st 1
+sr2 1
+srandom 1
+srat 1
+srat contain 1
+srat found 1
+srat hard 1
+srat hard du 1
+srat solut 1
+srat solut using 1
+srat using 1
+srat using indomain 1
+src 6
+src research 2
+src research report 2
+src tr 2
+srd 1
+srf87 1
+srihar 2
+srik 1
+srin 1
+srin and assm 1
+srin and reach 1
+srin and ssm 1
+srin any longer 1
+srin ar describ 1
+srin ar equiv 1
+srin ar smart 1
+srin by merg 1
+srin from exampl 1
+srin from figur 1
+srin in figur 1
+srin is es 1
+srin to perform 1
+srin us 1
+srin us self 1
+srin wa extract 1
+sriram 1
+sriram sankar 1
+srivastav 1
+srq 1
+srq and srat 1
+srq ar particl 1
+srq as satisf 1
+srq but requir 1
+srq claus 1
+srq claus forml 1
+srq forml 1
+srq forml shown 1
+srq implem 1
+srq in eclip 1
+srq in figur 1
+srq involut 1
+srq puzzl 1
+srq puzzl contain 1
+srq shown 1
+srq solut 1
+srq solut using 1
+srq solver 1
+srq solver tim 1
+srq using 1
+srst 1
+srst and po 1
+srtc 1
+srtc prototyp 1
+srtc prototyp con 1
+srvr 1
+ss 27
+ss and assoc 1
+ss and degr 1
+ss and oe 1
+ss can produc 1
+ss defin 1
+ss defin funct 1
+ss fh 1
+ss is uniqu 1
+ss lg 1
+ss model 1
+ss mz 1
+ss nw 1
+ss o np 1
+ss on gener 1
+ss on program 1
+ss on term 1
+ss ou 1
+ss ou aik 1
+ss p2 1
+ss p2 iff 1
+ss pm 1
+ss qnp 1
+ss ss 1
+ss sw 1
+ss sw obtain 1
+ss to denot 1
+ss ver 1
+ss ver number 1
+ss with den 1
+ss x1 1
+ss0 2
+ss0 and oe0 1
+ss0 and oe0r 1
+ss0 by rever 1
+ss0 x1 1
+ss0.3 1
+ss0.3 me 1
+ss0.3 me sec 1
+ss0p 1
+ss1 1
+ss1.7 1
+ss10 1
+ss2 1
+ss2 ff2 1
+ss88 1
+ss91 1
+ssc 1
+ssen 1
+ssen and bsen 1
+ssen giv 1
+ssen is implem 1
+ssh86 1
+ssik 1
+ssik la 1
+ssik la project 1
+ssin 1
+ssj 1
+sskt 1
+ssm 2
+ssm al correspon 1
+ssm and merg 1
+ssm and srin 1
+ssm ar equiv 1
+ssm ar thorough 1
+ssm extract 1
+ssm extract algorithm 1
+ssm from spar 1
+ssm giv 1
+ssm giv design 1
+ssm in tabl 1
+ssm infer 1
+ssm is equiv 1
+ssm is known 1
+ssm minim 1
+ssm minim techniqu 1
+ssm to mak 1
+ssm with init 1
+ssn 2
+ssn and cur 1
+ssn and hist 1
+ssn assign 1
+ssn avg 1
+ssn count 1
+ssn dnamev 1
+ssn emp 1
+ssn from assign 1
+ssn from emp 1
+ssn from empd 1
+ssn from empsl 1
+ssn from empttl 1
+ssn mac 1
+ssn of empl 1
+ssn pn 1
+ssn pn typ 1
+ssn pn typev 1
+ssn ratingv 1
+ssn sal 1
+ssn sal dnamev 1
+ssn salaryv 1
+ssn skillsv 1
+ssn typ 1
+ssn typ budg 1
+ssn typ budgetv 1
+ssn typev 1
+ssn typev budgetv 1
+ssp 1
+ssp is assign 1
+ssp nor ssr 1
+ssp oe1 1
+ssp oe1 becom 1
+ssr 2
+ssr belong 1
+ssr wh 1
+sst 1
+ssu1 1
+st 113
+st 1yi 1
+st a bi 1
+st a collect 1
+st a connect 1
+st a corol 1
+st a fl 1
+st a modl 1
+st a number 1
+st a prolog 1
+st a schedl 1
+st a se 1
+st a sourc 1
+st a st 1
+st a0 1
+st a0 monit 1
+st acc 1
+st accord 1
+st act 1
+st act env 1
+st actspeed 1
+st actu 1
+st actu repr 1
+st addit 1
+st addit requir 1
+st addr 2
+st addr mechan 1
+st al result 1
+st al sampl 1
+st al train 1
+st algorithm 1
+st alread look 1
+st an 1
+st an entir 1
+st anatom 1
+st anatom featur 1
+st and allow 1
+st and an 1
+st and comput 1
+st and condit 1
+st and correspon 1
+st and environm 1
+st and fast 1
+st and for 3
+st and incorpor 1
+st and inst 1
+st and loc 1
+st and ml 1
+st and non 1
+st and oper 1
+st and pr 1
+st and pseud 1
+st and reason 1
+st and rec 1
+st and retrief 1
+st and sketch 1
+st and st2 1
+st and transm 1
+st and wait 1
+st anom 1
+st appl 1
+st ar achief 1
+st ar chang 1
+st ar exchang 1
+st ar imp 1
+st ar order 1
+st ar perform 1
+st ar refin 1
+st ar sum 1
+st arbitr 1
+st arbitr dat 1
+st argum 1
+st as attribut 1
+st as disk 1
+st as dist 1
+st as el 1
+st as follow 2
+st as reflect 1
+st assoc 1
+st at tim 1
+st atom 1
+st augustin 1
+st autom 1
+st automat 1
+st avec 1
+st avec m1 1
+st ba 4
+st ba log 1
+st ba natur 1
+st ba specif 1
+st between me 1
+st bit 3
+st bit merg 1
+st broadcast 1
+st broadcast se 1
+st brok 1
+st brook 4
+st brook st 1
+st but satur 1
+st by act 1
+st by appropr 1
+st by build 1
+st by partit 1
+st by tying 1
+st by whitl 1
+st can occur 1
+st can perform 1
+st can serv 1
+st cap 1
+st cap determin 1
+st cel 1
+st cel indirect 1
+st chang 6
+st chang accord 1
+st chang agent 1
+st chang compon 1
+st chang dev 1
+st chang repr 1
+st character 1
+st charl 1
+st cl 2
+st cluster 1
+st cluster architectur 1
+st collect 1
+st compil 1
+st compil chronolog 1
+st compon 1
+st compon st 1
+st comput 1
+st computer 1
+st conc 1
+st cont 1
+st contigu 1
+st control 1
+st control subcomput 1
+st correspon 2
+st corrupt 1
+st corrupt chang 1
+st corrupt occur 1
+st corrupt view 1
+st creat 1
+st dat 2
+st dat structur 1
+st datab 3
+st db 1
+st db buffercpu 1
+st dead 1
+st decl 2
+st def 1
+st def io 1
+st defin 1
+st denot 1
+st descript 2
+st dev 2
+st diagram 1
+st du 1
+st dynam 1
+st e dep 1
+st ea 1
+st each buck 1
+st each configur 1
+st earl 1
+st ec 1
+st either dat 1
+st environm 3
+st equiv 1
+st ev inst 1
+st ev train 1
+st exampl 1
+st extrem 1
+st extrem point 1
+st f2 1
+st fact 1
+st featur 1
+st feedback 1
+st find 1
+st finit 1
+st finit memor 1
+st for accur 1
+st for backtrack 1
+st for further 1
+st for narrow 1
+st for object 1
+st for tempor 2
+st forever 1
+st forml 1
+st forml contain 1
+st found 1
+st found chang 1
+st four peer 1
+st fram 1
+st from compon 1
+st from wh 1
+st fs 1
+st fs1 1
+st funct 1
+st funct ae 1
+st funct allow 1
+st gener 1
+st giv 1
+st giv input 1
+st governm 1
+st ha acc 1
+st hav mad 1
+st hi reluc 1
+st hist 1
+st hous 1
+st how resourc 1
+st identif 1
+st identif seen 1
+st imag 1
+st implicit 1
+st in eqn 1
+st in individu 1
+st in level 1
+st in loc 1
+st in main 1
+st in ram 1
+st in row 1
+st in sect 3
+st in sort 1
+st in tabl 1
+st in term 1
+st in theorem 1
+st indirect 1
+st inform 6
+st inst 1
+st inst oper 1
+st instruc 1
+st int segm 1
+st interfac 1
+st interm 1
+st interm result 1
+st invar 1
+st irrespect 1
+st is avail 1
+st is ch 1
+st is con 1
+st is creat 1
+st is decl 1
+st is defin 1
+st is empt 1
+st is ensur 1
+st is explicit 1
+st is fed 1
+st is gener 1
+st is giv 1
+st is idempot 1
+st is incoh 1
+st is init 1
+st is known 1
+st is lik 1
+st is oc 1
+st is reach 1
+st is repr 1
+st is said 1
+st is shown 1
+st is upd 1
+st issu 1
+st it compl 1
+st it el 1
+st it repr 1
+st it simplif 1
+st john 1
+st k jqj 1
+st key 1
+st kn 1
+st kn el 1
+st l1 1
+st l1 oc 1
+st langu 1
+st langu using 1
+st lead 1
+st link 1
+st link cost 1
+st loc 2
+st loc mean 1
+st loc1 1
+st log 1
+st log track 1
+st m record 1
+st m1 1
+st m1 10q1 1
+st mac 1
+st mac lsn 1
+st mach 7
+st mach approach 1
+st mach con 1
+st mach defin 1
+st macr 1
+st manag 2
+st manager 2
+st margin 1
+st margin commun 1
+st me 2
+st measspeed 1
+st med 2
+st med flush 1
+st memor 1
+st merg 1
+st method 1
+st method evalu 1
+st model 1
+st modif 3
+st multipl 1
+st multipl inherit 1
+st neg 1
+st neg key 1
+st new instruc 1
+st nor environm 1
+st now se 1
+st numdisk 1
+st oc 1
+st oe 1
+st oe0 1
+st of affair 1
+st of air 1
+st of collect 1
+st of commun 1
+st of compon 1
+st of currnod 1
+st of distribut 1
+st of evolut 1
+st of further 1
+st of hypergraph 1
+st of import 1
+st of michigan 1
+st of object 1
+st of prob 1
+st of proc 1
+st of signif 1
+st of symtab 1
+st of thread 1
+st of typ 1
+st on block 1
+st on disk 1
+st on pal 1
+st on proc 2
+st on track 1
+st oper 1
+st optim 1
+st or accur 1
+st or recomput 1
+st or snapshot 1
+st or stat 1
+st order 2
+st organ 1
+st orient 1
+st our main 1
+st overhead 1
+st overload 1
+st pack 1
+st par 1
+st par transl 1
+st perform 2
+st perform measur 1
+st pertain 1
+st pkt 1
+st plan 1
+st plan dat 1
+st plot 1
+st pointer 1
+st posit 1
+st posit key 1
+st pr 1
+st pr detect 1
+st prec 1
+st precondit 1
+st prev 1
+st prev comput 1
+st proc 1
+st program 1
+st program electron 1
+st proper 1
+st qi 1
+st qi0 1
+st queu 1
+st r oscopiqu 1
+st r otaxiqu 1
+st reach 1
+st reclaim 1
+st reduc 1
+st reflect 1
+st reg 2
+st rel 2
+st rel oper 1
+st rel straightfor 1
+st remain 2
+st remain cur 1
+st remain unchang 1
+st repr 4
+st requir 2
+st respon 1
+st retrief 1
+st retrief dat 1
+st rl 1
+st rout 1
+st rout algorithm 1
+st row 2
+st row wi 1
+st satisf 2
+st satisf prm.3 1
+st schem 3
+st screen 1
+st screen proc 1
+st se 1
+st secon 1
+st seen 1
+st sem 2
+st sem ver 1
+st separ 1
+st sequ 1
+st server 1
+st server control 1
+st should therefor 1
+st si 2
+st si el 1
+st si tout 1
+st singl 1
+st singl inherit 1
+st sit 1
+st siz 1
+st siz etc 1
+st sleep 1
+st soit 1
+st soit conflictuel 1
+st som ba 1
+st som observ 1
+st spac 9
+st spac chang 1
+st st 5
+st st1 1
+st statemessagecondit 1
+st statetransact 1
+st structur 3
+st subsystem 1
+st synchron 1
+st system 6
+st system attach 1
+st system st 1
+st techniqu 1
+st ten 1
+st test 1
+st test inform 1
+st text 1
+st th activ 1
+st th condit 1
+st th cur 2
+st th dat 4
+st th definit 1
+st th dep 1
+st th edg 1
+st th entir 3
+st th environm 1
+st th fact 1
+st th ident 1
+st th inform 4
+st th key 1
+st th largest 1
+st th number 1
+st th pack 1
+st th pointer 1
+st th posit 1
+st th problem 1
+st th proper 1
+st th repl 1
+st th result 3
+st th saf 1
+st th sequ 1
+st th singl 1
+st th spat 1
+st th st 1
+st th tr 1
+st th valu 4
+st th ver 1
+st th vouch 1
+st that addit 1
+st that argum 1
+st that depth 1
+st that differ 1
+st that re 1
+st that realiz 1
+st that repeat 1
+st that satisf 1
+st then exit 1
+st theorem 1
+st to find 1
+st to found 1
+st to memor 1
+st to st 1
+st to start 1
+st tr 1
+st tr root 1
+st transit 7
+st transit diagram 2
+st transit funct 1
+st transit mach 1
+st transit sequ 1
+st tupl 1
+st tw vect 1
+st undefin 1
+st under dynam 1
+st understand 1
+st understand prov 1
+st understand sequ 1
+st understand system 1
+st understander 1
+st unit 2
+st unit ec 1
+st univer columbus 4
+st univer presid 1
+st univer yorktown 1
+st upd 2
+st upd channel0 1
+st upon receiv 1
+st valu 3
+st valu lock 1
+st valu method 1
+st var 6
+st var bind 1
+st var st 1
+st variabl 6
+st variabl chang 1
+st variabl st 1
+st vect 2
+st vect correspon 1
+st vect h8 1
+st vect repr 1
+st ver 1
+st ver simpl 1
+st ver xi 1
+st vi event 1
+st vi ind 1
+st w0 1
+st wast 1
+st wast autonom 1
+st we assum 1
+st wh 1
+st wh proc 1
+st wh sn 1
+st what rol 1
+st which becom 1
+st which control 1
+st wil occur 1
+st with parallel 1
+st with respect 2
+st with stop 1
+st without proof 1
+st ye 2
+st.2 1
+st.augustin 1
+st.edu 7
+st.edu april 1
+st.edu f kulkarn 1
+st.edu pan 1
+st.edu pan pac.html 1
+st.edu phon 1
+st.ps.z 1
+st.ps.z or pub 1
+st0 1
+st1 2
+st1.dpu.dr 1
+st1.dpu.dr dputim.tv 1
+st1.dpu.dr dputim.tv sec 1
+st1.dpu.dr dputim.tv usec 1
+st2 2
+st2.dpu.dr 1
+st2.dpu.dr dputim.tv 1
+st2.dpu.dr dputim.tv sec 1
+st2.dpu.dr dputim.tv usec 1
+st87 1
+staadt 1
+stab 1
+stab qu 1
+stabil 5
+stabil a se 1
+stabil algorithm 1
+stabil dan 1
+stabil design 1
+stabil design allow 1
+stabil inform 1
+stabil inform exchang 1
+stabil interv 1
+stabil interv impl 1
+stabil interv requir 1
+stabil leader 1
+stabil leader elect 1
+stabil lorsqu 1
+stabil ph 1
+stabil ph clock 1
+stabil proof 1
+stabil system 2
+stabilit 1
+stabiliz 1
+stabl 1
+stabl dur 1
+stabl dur lec 1
+stabl est 1
+stabl est donc 1
+stabl et le 1
+stabl seront 1
+stabl seront simpl 1
+stac 2
+stac93.ps.z 1
+stachowiak 1
+stack 15
+stack act 1
+stack act cl 1
+stack algebr 1
+stack alloc 1
+stack alloc dat 1
+stack and cal 1
+stack and funct 1
+stack ar init 1
+stack architectur 2
+stack by default 1
+stack cannot grow 1
+stack circl 1
+stack circl stack 1
+stack cl 1
+stack count 1
+stack el 2
+stack entr 1
+stack entr appear 1
+stack entr correspon 1
+stack entr incr 1
+stack entr rev 1
+stack exceed 1
+stack expan 1
+stack fram 2
+stack grow 1
+stack hold 1
+stack if cand 1
+stack in rest 1
+stack in sect 1
+stack is compl 1
+stack is empt 1
+stack layer 1
+stack mach 1
+stack manag 1
+stack model 2
+stack model mak 1
+stack most recent 1
+stack of 2d 1
+stack of 4kby 1
+stack of book 1
+stack on top 1
+stack oper 1
+stack or heap 1
+stack orient 2
+stack orient cpu 1
+stack orient form 1
+stack overflow 2
+stack perfect 1
+stack perfect perfect 1
+stack pointer 1
+stack refer 1
+stack refer model 1
+stack renam 1
+stack repr 1
+stack seq 1
+stack seq le 1
+stack st 1
+stack stack 1
+stack structur 1
+stack support 1
+stack th ar 1
+stack that overwrit 1
+stack top 1
+stack typ 1
+stack valu 1
+stack variabl 1
+stack wa follow 1
+stacksizeg 1
+stad 2
+stad on disp 1
+staff 2
+staff for mak 1
+stag 34
+stag and continu 1
+stag appropr 1
+stag appropr approach 1
+stag appropr view 1
+stag ar giv 1
+stag begin 1
+stag character 1
+stag dec 1
+stag dep 1
+stag for addit 1
+stag in lem 1
+stag interconnect 3
+stag interconnect network 3
+stag involut 1
+stag involut find 1
+stag is giv 1
+stag is simil 1
+stag it pr 1
+stag learn 1
+stag must tak 1
+stag number 1
+stag of classif 1
+stag of coar 1
+stag of design 1
+stag of fact 1
+stag of integr 1
+stag of learn 1
+stag of relac 1
+stag of uncoar 1
+stag pipel 1
+stag proc 1
+stag remain 1
+stag requir 1
+stag stil me 1
+stag tak 1
+stag th confirm 1
+stag th interv 1
+stag th maxim 1
+stag th recov 1
+stag to reach 1
+stag transl 1
+stag transl proc 1
+stag we design 1
+stag we us 1
+stag wh 2
+stag wil result 1
+stag wil therefor 1
+stagger 3
+stagger back 1
+stagger back und 1
+stagger with respect 1
+staightfor 1
+staightfor algorithm 1
+stairc 1
+stairc effect 1
+stal 5
+stal dat 1
+stal ip 1
+stal tim 1
+stal tim du 1
+stallman 1
+stallswait 1
+stallswait for memor 1
+stam 2
+stam and richard 1
+stamp 7
+stamp and valu 1
+stamp fn 1
+stamp repr 1
+stamp system 1
+stamp techniqu 1
+stamp to tupl 1
+stamp ts 1
+stamp ts assoc 1
+stan 1
+stan. 1
+stanc 1
+stanchev 1
+stand 22
+stand alon approach 1
+stand alon bin 1
+stand alon cbl 1
+stand alon computer 1
+stand alon mach 1
+stand alon person 1
+stand alon program 1
+stand any chanc 1
+stand firm 1
+stand for answer 1
+stand for bin 1
+stand for condit 1
+stand for liter 1
+stand for quer 1
+stand for rel 1
+stand for wrong 1
+stand tp 1
+standard 72
+standard abstract 1
+standard abstract interfac 1
+standard agenc 1
+standard agenc de 1
+standard al point 1
+standard algorithm 2
+standard and autom 1
+standard and found 1
+standard ar start 1
+standard argum 1
+standard arithm 1
+standard arithm oper 1
+standard assignm 1
+standard au 1
+standard au sein 1
+standard au traver 1
+standard ba 1
+standard ba ee 1
+standard backtrack 3
+standard backtrack evalu 1
+standard backtrack mechan 1
+standard benchmark 2
+standard benchmark program 2
+standard benchmark test 1
+standard bfg 1
+standard bfg method 1
+standard bnf 1
+standard bnf descript 1
+standard bp 1
+standard bp learn 1
+standard bp model 1
+standard bs 1
+standard bs model 1
+standard cal 1
+standard cal return 1
+standard cel 2
+standard cel avail 1
+standard cel router 1
+standard cl 1
+standard cl support 1
+standard cof 1
+standard com 1
+standard com le 1
+standard compon 2
+standard construc 1
+standard continu 1
+standard continu distribut 1
+standard control 1
+standard conv 1
+standard conver 1
+standard conver rel 1
+standard cut 1
+standard cut elim 1
+standard dan 1
+standard dan lun 1
+standard datab 1
+standard datab terminolog 1
+standard de 3
+standard de four 1
+standard de gest 1
+standard de la 1
+standard de prolog 1
+standard de univer 1
+standard dev 8
+standard dev ps2 1
+standard dispatch 1
+standard dispatch strateg 1
+standard distribut 1
+standard distribut format 1
+standard dont se 1
+standard du 1
+standard du retour 1
+standard dunif 1
+standard dunif me 1
+standard edit 1
+standard edit dist 1
+standard effort 1
+standard eml 1
+standard en 1
+standard en lab 1
+standard en term 1
+standard ensur 1
+standard ensur method 1
+standard error 1
+standard et enregister 1
+standard ethernet 1
+standard euclidean 1
+standard euclidean dist 1
+standard exampl 1
+standard fash 1
+standard first order 1
+standard for implem 1
+standard for inform 1
+standard for object 1
+standard format 1
+standard forml 1
+standard funct 2
+standard funct cap 1
+standard funct denot 1
+standard funct nam 1
+standard g en 1
+standard ga 1
+standard gener 1
+standard gener funct 1
+standard grammar 1
+standard grammar specif 1
+standard graph 1
+standard graph workst 1
+standard http 1
+standard http protocol3 1
+standard iconnectionpoint 1
+standard iconnectionpoint interfac 1
+standard implem 1
+standard implicit 1
+standard implicit invoc 1
+standard inclut 1
+standard inclut deux 1
+standard input 1
+standard input ca 1
+standard institut 2
+standard instruc 1
+standard int 1
+standard interconnect 1
+standard interfac 2
+standard interfac correspon 1
+standard introduit 1
+standard is 1
+standard kcm 1
+standard kcm standard 1
+standard le 1
+standard le coupur 1
+standard lim 1
+standard lim automatiqu 1
+standard lin 1
+standard lin optim 1
+standard log 3
+standard log program 1
+standard lorsqu 2
+standard lorsqu celu 1
+standard mach 2
+standard mach character 1
+standard mach on 1
+standard manner 1
+standard mathemat 1
+standard mathemat univer 1
+standard matr 1
+standard matr multipl 1
+standard me 2
+standard me propag 1
+standard memor 1
+standard memor modl 1
+standard ml 2
+standard ml except 1
+standard mod 1
+standard model 3
+standard model imp 1
+standard nait 1
+standard nait pa 1
+standard nam 1
+standard ne 1
+standard ne comport 1
+standard ne peut 1
+standard nest 1
+standard nest donc 1
+standard nonmonot 1
+standard nonmonot log 1
+standard norm 1
+standard norm distribut 1
+standard not 1
+standard ntp 1
+standard ntp axiom 1
+standard occam 1
+standard occam langu 1
+standard of digit 1
+standard of lisp 1
+standard of nam 1
+standard ol 1
+standard ol interfac 1
+standard oper 3
+standard oper system 1
+standard opt 1
+standard optim 1
+standard optim techniqu 1
+standard ou 1
+standard ou mod 1
+standard pandemon 1
+standard pandemon classif 1
+standard pandemon decomposit 1
+standard par 1
+standard par appl 1
+standard par le 1
+standard perform 1
+standard perform measur 1
+standard pipel 1
+standard pipel break 1
+standard polymorph 1
+standard polymorph typ 1
+standard pour 1
+standard pour ce 1
+standard pract 1
+standard problem 1
+standard problem solut 1
+standard proc 1
+standard proc util 1
+standard prolog 2
+standard prolog interpreter 1
+standard proof 1
+standard protocol 2
+standard put 1
+standard put valu 1
+standard qu 1
+standard qu newt 1
+standard real determ 1
+standard regr 1
+standard rel 1
+standard repr 1
+standard respon 1
+standard runtim 1
+standard runtim memor 1
+standard s equenc 1
+standard sauf 1
+standard sauf qu 1
+standard schem4 1
+standard schem4 implem 1
+standard se 3
+standard se describ 1
+standard se funct 1
+standard se oper 1
+standard sect 1
+standard siml 1
+standard siml tak 1
+standard singl 1
+standard singl step 1
+standard siz 2
+standard siz pack 1
+standard slot 1
+standard smooth 1
+standard smooth profil 1
+standard specif 3
+standard ssm 1
+standard ssm minim 1
+standard standard 1
+standard stat 1
+standard stat method 1
+standard string 1
+standard string edit 1
+standard sum 1
+standard sur 1
+standard sur la 1
+standard symbol 1
+standard symbol push 1
+standard system 1
+standard techniqu 1
+standard termin 1
+standard termin cl 1
+standard test 1
+standard textbook 1
+standard textu 1
+standard textu nod 1
+standard tr 1
+standard tr funct3 1
+standard transform 1
+standard transform specif 1
+standard treatm 1
+standard ttl 1
+standard un 1
+standard un mach 1
+standard un serv 1
+standard und 1
+standard und recov 1
+standard us 1
+standard vhdl 1
+standard vhdl langu 1
+standard wam 1
+standard web 1
+standard web technolog 1
+standard word 1
+standard word length 1
+standard xp 1
+standpoint 3
+stanfil 2
+stanfil waltz 1
+stanford 17
+stanford dash 5
+stanford dash multiproc 3
+stanford dash prototyp 1
+stanford mem 1
+stanford parallel 1
+stanford parallel appl 1
+stanford ph.d 1
+stanford univer stanford 1
+stanl 1
+stapl 1
+stapl and mark 1
+star 6
+star and dol 1
+star lik structur 1
+star shap 1
+star shap graph 1
+star structur 1
+starburst 1
+starheight 1
+starheight on langu 1
+starit 1
+starkweather 1
+start 88
+start 1ae 1
+start a collect 1
+start a diffus 1
+start a non 1
+start a tut 1
+start act 1
+start and en 4
+start and ev 1
+start and finish 1
+start and stop 1
+start and term 1
+start another cliqu 1
+start another ct 1
+start at birth 1
+start at ecrc 1
+start at nod 1
+start at tim 4
+start being serv 1
+start broadcast 1
+start button 1
+start by collect 1
+start by comput 1
+start by defin 2
+start by register 1
+start by review 1
+start by search 1
+start by stipl 1
+start by thread 1
+start by typ 1
+start by using 1
+start command 1
+start continu 1
+start continu stop 1
+start decr 1
+start earl 1
+start enter 1
+start enter dat 1
+start evalu 1
+start execut 5
+start field 1
+start fil 1
+start from ai 1
+start from dim 1
+start from oe2b 1
+start from pixel 1
+start from rel 1
+start from solut 1
+start funct 1
+start high level 1
+start in janu 1
+start in switch 1
+start incr 1
+start init 2
+start init valu 1
+start lat 1
+start li 1
+start low 1
+start low level 1
+start mac 1
+start mar 1
+start new peer 1
+start of recov 1
+start oper 1
+start point 12
+start posit 1
+start pot 1
+start pot sj 1
+start prov 1
+start prov proper 1
+start re execut 1
+start record 1
+start rl 1
+start run 1
+start run tim 1
+start serv 1
+start st 2
+start subtransact 1
+start subtransact part 1
+start subtransact record 1
+start th clock 1
+start th comput 1
+start th enumer 1
+start th execut 1
+start th me 1
+start th proc 1
+start th project 1
+start th protocol 1
+start th search 1
+start th serv 1
+start their execut 1
+start thread 1
+start thread condit 1
+start tim 4
+start to becom 1
+start to consider 1
+start to cr 1
+start to discover 1
+start to draw 1
+start to emerg 1
+start to goal 1
+start to model 1
+start to offer 1
+start to perform 1
+start to prov 1
+start to rec 1
+start to register 1
+start to suffer 1
+start transact 1
+start transact record 1
+start transm 1
+start up overhead 3
+start up tim 3
+start up us 1
+start using 1
+start vect 1
+start vect q1 1
+start vect r0 1
+start vect x0 1
+start ver 1
+start with algorithm 1
+start with c1 1
+start with comput 1
+start with isol 1
+start with nod 1
+start with relationship 1
+start with show 1
+start with string 1
+start work 2
+start writ 1
+start wrong 1
+start wrong thread 1
+start. 1
+startl 2
+startl man programmer 1
+startup 8
+startup cost 1
+startup del 1
+startup interv 1
+startup or reconfigur 1
+startup overhead 3
+startup overhead dep 1
+startup tim 1
+starv 3
+starv of request 1
+starv until other 1
+stask 1
+stat 88
+stat adr 1
+stat adr retour 1
+stat alloc 1
+stat alloc ar 1
+stat an 5
+stat an decr 1
+stat an increm 1
+stat an mak 1
+stat an rel 1
+stat an techniqu 1
+stat analyzer 1
+stat and belief 1
+stat and comput 2
+stat and dynam 3
+stat and ev 1
+stat and experim 1
+stat and for 1
+stat and henc 1
+stat and keep 1
+stat and parameter 1
+stat and pr 1
+stat and scientif 1
+stat and shap 1
+stat and structur 1
+stat and trigger 1
+stat approach 1
+stat ar lexicograph 1
+stat ar list 1
+stat ar render 1
+stat ar sem 1
+stat ar us 1
+stat ar writ 1
+stat as label 1
+stat aspect 1
+stat assign 1
+stat assoc 3
+stat autoregr 1
+stat b level 1
+stat being refin 1
+stat between proc 1
+stat bind 1
+stat but underg 1
+stat ca 1
+stat caddr 1
+stat can match 1
+stat check 1
+stat classif 1
+stat cluster 1
+stat cluster method 1
+stat cod 1
+stat cod siz 1
+stat collect 3
+stat compar 1
+stat compon 1
+stat con 1
+stat con test 1
+stat condit 1
+stat configur 2
+stat consider 1
+stat contradict 1
+stat criter 1
+stat dat 2
+stat datab 2
+stat datab manag 1
+stat dataflow 1
+stat dataflow mach 1
+stat de 1
+stat de travail 1
+stat decluster 1
+stat decluster method 1
+stat deriv 1
+stat determin 2
+stat determin se 1
+stat e docum 1
+stat each switch 1
+stat edg 1
+stat edg depict 1
+stat en 1
+stat en proc 1
+stat equiv 1
+stat error 1
+stat es 1
+stat estim 1
+stat estim problem 1
+stat evalu 1
+stat event 1
+stat event loop 1
+stat extern 1
+stat extern fil 1
+stat for evalu 1
+stat for stud 1
+stat for throughput 1
+stat for yacc 1
+stat fprintf 1
+stat gather 1
+stat gather stat 1
+stat goal 1
+stat grad 1
+stat guar 1
+stat hist 1
+stat hold 1
+stat ii 1
+stat impl 1
+stat in parallel 1
+stat in sect 1
+stat in theor 1
+stat infer 1
+stat inform 1
+stat inst 1
+stat inst s1 1
+stat inst s2 1
+stat interfac 1
+stat is acc 1
+stat is evalu 1
+stat is execut 1
+stat is ext 1
+stat is giv 1
+stat is transl 1
+stat j loop 1
+stat j nl 1
+stat j sequ 1
+stat j sign 1
+stat j wait 1
+stat knowledg 1
+stat lead 1
+stat level 1
+stat lexicograph 1
+stat list 1
+stat load 1
+stat load bal 1
+stat load imb 1
+stat maxscor 1
+stat maxscor minl 1
+stat may match 1
+stat may unnec 1
+stat measur 1
+stat menus 1
+stat method 3
+stat method handl 1
+stat model 3
+stat model build 1
+stat model identif 1
+stat monograph 1
+stat multiplec 1
+stat multiplec offer 1
+stat network 2
+stat nod 2
+stat nod appear 1
+stat nod attach 1
+stat nod attempt 1
+stat nod distribut 1
+stat nod ev 1
+stat nod input 1
+stat nod request 1
+stat nod switch 1
+stat nod switchm 1
+stat nod transm 1
+stat nonequiv 1
+stat nor dynam 1
+stat not 2
+stat number 1
+stat object 3
+stat object cod 1
+stat object recognit 1
+stat obtain 1
+stat on gu 1
+stat on tot 1
+stat oper 1
+stat or creat 1
+stat or path 1
+stat partit 1
+stat partit molecl 1
+stat pattern 1
+stat pattern recognit 1
+stat peut 1
+stat peut bien 1
+stat phy 1
+stat predict 1
+stat preserv 1
+stat proc 1
+stat proc alloc 1
+stat quarter 2
+stat quer 1
+stat reach 1
+stat refer 1
+stat remain 1
+stat report 1
+stat report system 1
+stat research 1
+stat research div 1
+stat review 1
+stat rslack 1
+stat rslack pi 1
+stat s1 1
+stat s5a 1
+stat s6 1
+stat s7 1
+stat sc 2
+stat schedl 2
+stat schedl heur 1
+stat schedl problem 1
+stat scop 1
+stat scop bind 1
+stat sem 1
+stat sem requir 1
+stat sen 1
+stat separ 1
+stat signif 4
+stat signif experim 1
+stat soc 2
+stat st 1
+stat st compil 1
+stat stat 1
+stat strateg 1
+stat styl 1
+stat styl attribut 1
+stat swap 1
+stat t1 1
+stat t1 t2 1
+stat techniqu 2
+stat test 6
+stat test classif 1
+stat test unfortun 1
+stat that contain 1
+stat that differ 1
+stat that giv 1
+stat that pertain 1
+stat that writ 1
+stat theor 1
+stat thing 1
+stat to establ 1
+stat to fortran 1
+stat to giv 1
+stat topolog 2
+stat trap 1
+stat typ 1
+stat typ fr 1
+stat typ object 1
+stat unrol 1
+stat upd 1
+stat upd zer 1
+stat val 2
+stat val method 1
+stat void 1
+stat void tabl 1
+stat war 1
+stat with variabl 1
+stat workshop 1
+stat world 1
+stat95 1
+statechart 1
+stateclock 1
+stateclock event 1
+stateclock event typ 1
+stateg 1
+stateg st1 1
+stateg st2 1
+statemessagecondit 1
+statenext 1
+statenext tidact 1
+statenext tidact transact 1
+stateoptim 1
+stateoptim st 1
+statetransact 1
+staticallytyp 1
+staticallytyp object 1
+staticallytyp object orient 1
+statik 1
+statik und 1
+statik und dynamik 1
+statiqu 2
+statiqu a la 1
+statiqu de 1
+statiqu de la 1
+statiqu et le 1
+statiqu et pa 1
+statiqu ne 1
+statiqu ne pourrait 1
+statiqu perm 1
+statiqu perm de 1
+statiqu pour 1
+statiqu pour permettr 1
+statiqu pr 1
+statiqu pr esent 1
+statiqu suiv 1
+statiqu suiv de 1
+statistiqu 2
+statistiqu adapt 1
+statistiqu concern 1
+statistiqu concern la 1
+statistiqu du 1
+statistiqu du probl 1
+statistiqu dun 1
+statistiqu dun point 1
+statistiqu entr 1
+statistiqu entr primitiv 1
+statistiqu pour 1
+statistiqu pour conormer 1
+statistiqu qu 1
+statistiqu qu lon 1
+statistiqu qu val 1
+statistiqu robust 1
+statistiqu sur 1
+statistiqu sur le 1
+statistiqu sur un 1
+statistiqu usuel 1
+statistiqu usuel ain 1
+status 21
+status ad 1
+status and futur 2
+status and prospect 1
+status and research 1
+status bit 1
+status contain 1
+status datab 1
+status field 1
+status flag 3
+status flag se 1
+status flag select 1
+status inform 1
+status is describ 1
+status is visit 1
+status monit 1
+status prospect 1
+status select 1
+status to visit 1
+status visit 1
+status wa log 1
+status word 2
+status would con 1
+staudt 1
+staudt lerner 1
+stbar 1
+stbar command 1
+stbar instruc 1
+stbar stat 1
+stc 2
+std 6
+std 1815a 2
+std dev 1
+std.h 1
+std.h inclus 1
+std.h inclus stdlib.h 1
+stddev 1
+stddev min 1
+stddev min med 1
+stder 1
+stder mean 1
+stder mean stder 1
+stder stddev 1
+stder stddev min 1
+stdlib.h 1
+stdlib.h inclus 1
+stdlib.h inclus string.h 1
+stead 9
+stead decr 1
+stead incr 1
+stead rat 1
+stead st 3
+stead st character 1
+stead st valu 1
+stearn 1
+steel 5
+steel jr 1
+steenk 2
+steenk thom 1
+steenk thom gr 1
+steep 1
+steep when switch 1
+steer 1
+steer com 1
+steev 1
+stefan 2
+stefan institut 1
+stefan novel 1
+stefanel 1
+steff 2
+steff and pierc 1
+steger 1
+stegun 1
+steiglitz 2
+stein 2
+steiner 3
+steiner augm 1
+steiner biconnect 1
+steiner biconnect subgraph 1
+steiner bridg 1
+steiner bridg connect 1
+steiner ca 1
+steiner problem 1
+steiner se 1
+steiner se wh 1
+steiner subgraph 1
+steiner subgraph problem 1
+steiner tr 2
+steiner tr connect 1
+steiner tr found 1
+steiner tr problem 2
+stel 1
+stel graph 1
+stel graph supercomputer 1
+stem 7
+stem from al 1
+stem from mod 1
+stem from prev 1
+sten 1
+sten ak 1
+step 88
+step a mathemat 1
+step ahead 1
+step ahead predict 1
+step algorithm 1
+step algorithm test 1
+step and ge 1
+step and job 1
+step and rest 1
+step and subject 1
+step approach 1
+step ar captur 1
+step ar number 1
+step ar perform 1
+step ar reflect 1
+step ar tak 1
+step becom 1
+step becom avail 1
+step beyon simpl 1
+step bfg 1
+step bfg method 1
+step bfg upd 1
+step bit 1
+step block 1
+step block repr 1
+step breakdown 1
+step by incr 1
+step by step 3
+step by using 1
+step cl 1
+step cl oper 1
+step closer 1
+step closer mov 1
+step col. 1
+step commitm 1
+step commitm protocol 1
+step comput 1
+step correspon 1
+step cr 2
+step cr step 1
+step dep 1
+step deriv 1
+step design 1
+step developm 1
+step domin 1
+step earl 1
+step east 1
+step enabl 1
+step enabl act 1
+step ensur 1
+step exampl 1
+step fash 1
+step follow 1
+step for diagn 1
+step for proc 1
+step funct 1
+step further 3
+step giv 2
+step ha cost 1
+step i1 1
+step i2 1
+step in figur 1
+step in interior 1
+step in term 1
+step incr 1
+step involut 1
+step involut estim 1
+step is accompl 1
+step is attempt 1
+step is cr 1
+step is describ 2
+step is exp 1
+step is fin 1
+step is half 1
+step is ident 1
+step is laid 1
+step is larger 1
+step is posit 1
+step is repeat 1
+step is rest 1
+step is therefor 1
+step is typ 1
+step is unnec 1
+step is wh 1
+step iter 2
+step iter algoritm 1
+step iter predict 1
+step le compar 1
+step match 1
+step match abstract 1
+step method 1
+step might tak 1
+step minim 1
+step minim curv 1
+step modus 1
+step modus pon 1
+step n var 1
+step nec 1
+step north 1
+step occur 1
+step of boolean 1
+step of coar 1
+step of irregl 1
+step of recur 1
+step of regl 1
+step of siz 1
+step of sort 1
+step of uncoar 1
+step on pool 1
+step or iter 1
+step or job 1
+step ordin 1
+step ordin reduc 1
+step parallel 1
+step parallel reduc 1
+step perform 3
+step predict 1
+step predict perform 1
+step predict qu 1
+step proc 1
+step procedur 1
+step prompt 1
+step qu 1
+step qu newt 1
+step quest 1
+step reduc 1
+step reduc rel 1
+step refin 1
+step requir 4
+step requir tcom 1
+step separ 1
+step should deal 1
+step should record 1
+step simil 1
+step siz 3
+step siz parameter 1
+step substr 1
+step suffer 1
+step sum 1
+step t1 1
+step tak 1
+step tak tim 1
+step th glob 1
+step th kb 1
+step th length 1
+step th nod 1
+step th tot 1
+step that conver 1
+step through macrocod 1
+step to autom 1
+step to classif 1
+step to ext 1
+step to form 1
+step to genet 1
+step to loc 1
+step to schedl 1
+step to self 1
+step transl 1
+step transl proc 1
+step using 1
+step usu reduc 1
+step verif 1
+step wa exceed 1
+step we ad 1
+step we comput 1
+step we detect 1
+step we determin 1
+step we expan 1
+step we know 1
+step we label 1
+step we typ 1
+step wer accept 1
+step wer ad 1
+step wer nec 1
+step west 1
+step wh 1
+step which exhibit 1
+step whil gener 1
+step whil preserv 1
+step whil repeat 1
+step wil tak 1
+step without self 1
+step zer 1
+steph 3
+stephan 2
+stephan me 1
+stephenson 2
+steppel 1
+stepsouth 1
+ster 1
+ster ba 1
+ster ba approach 1
+ster vi 1
+stereotyp 1
+stereotyp user 1
+stereotyp user model 1
+sterl 1
+sterl et shapir 1
+stev 6
+stev homer 1
+stev rus 1
+stevenson 1
+stewart 2
+sticht 1
+sticht mathematisch 1
+sticht mathematisch centr 1
+stick 3
+stickl 1
+stickl and chandrasekaran 1
+stickl et al 1
+stiefel 1
+stiefel develop 1
+stiff 1
+stiff matr 1
+stiff matr bbmat 1
+stiff matr bcsstk32 1
+stiff matr brack2 1
+stiff matr copter2 1
+stiff matr finan512 1
+stiff matr inpr1 1
+stiff matr ken 1
+stiff matr shy161 1
+stiff matr venkat25 1
+stigmerg 1
+stiliad 1
+stiml 2
+stiml for agent 1
+stimulus 3
+stimulus and respon 1
+stimulus ar comput 1
+stimulus is gener 1
+stimulus of st 1
+stimulus respon 1
+stimulus respon an 1
+stimulus respon pattern 1
+stimulus responsepattern 1
+stimulus sourc 1
+stinchcomb 1
+stinson 1
+stipl 6
+stipl that conver 1
+stipl therefor 1
+stitut 2
+stj 1
+stj msj 1
+stl 1
+stl ltd 1
+stoc 3
+stocfor3 1
+stochast 9
+stochast behavior 1
+stochast model 2
+stochast network 1
+stochast opt. 1
+stochast optim 1
+stochast optim techniqu 1
+stochast petr 1
+stochast petr net 1
+stochast proc 1
+stochast search 1
+stochast siml 2
+stochast system 1
+stochastiqu 2
+stochastiqu avec 1
+stochastiqu dan 1
+stochastiqu de 1
+stochastiqu de recuit 1
+stochastiqu don 1
+stochastiqu don un 1
+stochastiqu dont la 1
+stochastiqu du 1
+stochastiqu est 1
+stochastiqu est dit 1
+stochastiqu et tout 1
+stochastiqu fon 1
+stochastiqu fon es 1
+stochastiqu g en 1
+stochastiqu inspir 1
+stochastiqu inspir ee 1
+stochastiqu markov 1
+stochastiqu posit 1
+stochastiqu prim 1
+stochastiqu qu 2
+stochastiqu qu lon 1
+stochastiqu si 1
+stochastiqu st 1
+stochastiqu st avec 1
+stochastiqu sur 1
+stock 5
+stock at siem 1
+stock du 1
+stock du tableau 1
+stock e dan 2
+stock es 2
+stock es sur 1
+stock lin 1
+stock lin ear 1
+stock loc 1
+stock loc temporair 1
+stock mark 2
+stock mark center 1
+stock mark dat 1
+stock problem 1
+stocker 2
+stocker de 1
+stocker de etat 1
+stocker le 1
+stocker le pag 1
+stocker le tableau 1
+stockholm 1
+stockman 1
+stockt 1
+stockt pr 1
+stodghil 1
+stok 2
+stok tor 1
+stokholm 1
+stolboushkin 1
+stonebaker 1
+stonebraker 3
+stop 34
+stop adver 1
+stop and cop 1
+stop and go 1
+stop and perform 1
+stop and prun 1
+stop appl 1
+stop by stop 1
+stop criter 3
+stop dar 1
+stop evalu 1
+stop failur 2
+stop fault 1
+stop from enter 1
+stop ha valu 1
+stop j construc 1
+stop list 1
+stop list stat 1
+stop nor found 1
+stop proc 2
+stop rl 1
+stop rl chang 1
+stop th coar 2
+stop th construc 1
+stop th siml 1
+stop tim 1
+stop to prev 1
+stop to writ 1
+stop word 1
+stop work 1
+stop work proper 1
+storer 1
+stork 1
+storm 1
+storytel 1
+storytel to gam 1
+stosowanej 1
+stoyan 1
+stp 1
+str 15
+str and exerc 1
+str and int 1
+str assoc 1
+str beyon satur 1
+str cr 1
+str de 1
+str est 1
+str est donc 1
+str exam 1
+str hierarch 1
+str in mater 1
+str in order 1
+str of by 1
+str se 1
+str se minneapol 1
+str th assum 1
+str th import 1
+str th network 1
+str that tool 1
+str to cr 1
+str to prov 1
+str valu 1
+str valu iter 1
+straight 10
+straight c cod 1
+straight for 3
+straight for me 1
+straight for solut 1
+straight lin 5
+straight lin dual 1
+straight lin pa 1
+straight lin segm 1
+straight strip 1
+straightaw 1
+straightfor 35
+straightfor adapt 1
+straightfor algorithm 1
+straightfor and om 1
+straightfor composit 1
+straightfor defin 1
+straightfor design 1
+straightfor el 1
+straightfor el prob 1
+straightfor ext 2
+straightfor for deletemin 1
+straightfor implem 1
+straightfor in execut 1
+straightfor induc 1
+straightfor inst 1
+straightfor manner 1
+straightfor method 1
+straightfor proc 1
+straightfor proof 1
+straightfor proper 1
+straightfor rel 1
+straightfor stack 1
+straightfor stack repr 1
+straightfor suggest 1
+straightfor suggest separ 1
+straightfor to check 1
+straightfor to impl 1
+straightfor to loc 1
+straightfor to teach 1
+straightfor transl 1
+straightfor transl argum 1
+straightfor us 1
+straightfor when perform 1
+straightw 1
+strain 1
+strain optim 1
+strain optim problem 1
+straint 3
+strand 1
+strand of common 1
+strang 2
+strang attract 1
+strang effect 1
+strat 3
+strat eg 3
+strat eg al 1
+strat eg av 1
+strat eg dan 1
+strat eg de 3
+strat eg dexplor 1
+strat eg dhybrid 1
+strat eg dinv 1
+strat eg hybr 1
+strat eg paresseus 1
+strat eg perm 1
+strat eg peuv 1
+strat eg util 1
+strateg 58
+strateg a compiler 1
+strateg adopt 1
+strateg and point 1
+strateg and templ 1
+strateg appear 2
+strateg appear lik 1
+strateg ar adapt 1
+strateg ar automat 1
+strateg ar ba 1
+strateg ar describ 1
+strateg ar determin 1
+strateg ar good 1
+strateg ar irregl 1
+strateg ar most 1
+strateg ar part 1
+strateg ar respon 1
+strateg ar simpl 1
+strateg ar subsequ 1
+strateg as block 1
+strateg as describ 1
+strateg be learn 1
+strateg by nam 1
+strateg by prov 1
+strateg consider 1
+strateg consider act 1
+strateg dec 1
+strateg defin 2
+strateg defin appropr 1
+strateg dep 2
+strateg describ 1
+strateg design 2
+strateg develop 1
+strateg displ 1
+strateg ea 1
+strateg exclus 1
+strateg f w.r.t 1
+strateg follow 1
+strateg for an 1
+strateg for ar 1
+strateg for cach 1
+strateg for congest 1
+strateg for countermand 1
+strateg for dpl 1
+strateg for fft 1
+strateg for find 1
+strateg for gener 1
+strateg for hypoth 1
+strateg for implem 1
+strateg for optim 1
+strateg for pop 1
+strateg for prolog 1
+strateg for recov 1
+strateg for rel 1
+strateg for rest 1
+strateg for schem 1
+strateg for select 1
+strateg for si 1
+strateg for tempor 1
+strateg from countermand 1
+strateg from low 1
+strateg in detail 1
+strateg in form 1
+strateg in lin 1
+strateg in order 1
+strateg in svm 1
+strateg ind 1
+strateg is ba 1
+strateg is dec 1
+strateg is determin 1
+strateg is suggest 1
+strateg is tr 1
+strateg learn 1
+strateg learn approach 1
+strateg level 1
+strateg level asid 1
+strateg lik block 1
+strateg lik self 1
+strateg may produc 1
+strateg might us 1
+strateg mut 1
+strateg of 2cl 1
+strateg of ch 1
+strateg of prolog 1
+strateg offer 1
+strateg on circuit 1
+strateg on induc 1
+strateg on parallel 1
+strateg on random 1
+strateg outcom 1
+strateg outcom prompt 1
+strateg outperform 1
+strateg outperform other 1
+strateg over interv 1
+strateg random 1
+strateg random pick 1
+strateg rel 1
+strateg remain 1
+strateg rerun 1
+strateg respect 1
+strateg specif 1
+strateg st 1
+strateg support 1
+strateg system 1
+strateg ten 1
+strateg that led 1
+strateg that prov 1
+strateg that work 1
+strateg tim 1
+strateg to accompl 1
+strateg to achief 1
+strateg to comb 1
+strateg to comput 1
+strateg to demonstr 1
+strateg to design 1
+strateg to label 1
+strateg to match 1
+strateg to reduc 1
+strateg to support 1
+strateg to us 1
+strateg tot 1
+strateg tot unfold 1
+strateg us 1
+strateg us implicit 1
+strateg w.r.t 1
+strateg wa compar 1
+strateg wa defin 1
+strateg wer deem 1
+strateg wer run 1
+strateg wer shown 1
+strateg wer test 1
+strateg wh 1
+strateg when using 1
+strateg which us 1
+strateg wil help 1
+strateg with introspect 1
+strateg without wor 1
+strateg work 1
+strateg would tak 1
+strateg11 1
+strathclyd 1
+stratif 1
+stratif or infl 1
+straus 1
+straus for measur 1
+strcmp 1
+stream 12
+stream a.13 1
+stream a.13 string 1
+stream and pack 1
+stream ba 1
+stream ba concur 1
+stream by multipl 1
+stream cal channel 1
+stream cl 1
+stream condit 1
+stream condit syntac 1
+stream dat 1
+stream descript 1
+stream fil 1
+stream held 1
+stream input 1
+stream input output 1
+stream is bound 1
+stream is rever 1
+stream merg 1
+stream merg compon 1
+stream multipl 1
+stream multipl dat 1
+stream object 1
+stream object rel 1
+stream of bar 1
+stream of command 1
+stream of lock 1
+stream of object 1
+stream of oper 1
+stream oper 2
+stream output 1
+stream parallel 1
+stream singl 1
+stream singl dat 1
+stream string 1
+stream string structur 1
+stream string symbol 1
+stream wil satisf 1
+streaml 1
+streaml trip 1
+streamrest 1
+streamrest ge 1
+streamrest ge determin 1
+strenghth 1
+strenghth by replac 1
+strength 19
+strength and lim 1
+strength and weak 1
+strength by appl 1
+strength cap 1
+strength cap demonstr 1
+strength for algorithm 1
+strength med 1
+strength mult 1
+strength mult level 1
+strength of leibniz 1
+strength of lp 1
+strength of oo 1
+strength of prolog 1
+strength of propag 1
+strength of rol 1
+strength of shout 1
+strength or prefer 1
+strength requir 1
+strength specif 1
+strength th conclus 1
+strength th del 1
+strength th forml 1
+strength th specif 1
+strength to ensur 1
+strength to hamilt 1
+strength using 1
+strength using corol 1
+strength weak 1
+streseman 1
+streseman institut 1
+stretch 3
+stretch a rubber 1
+stretch form 1
+stretch or shrink 1
+stretch th length 1
+stretchtool 1
+strextract 1
+strict 27
+strict 1st 1
+strict 1st order 1
+strict au 1
+strict au mod 1
+strict better coar 1
+strict block 1
+strict cr 1
+strict cr tr 1
+strict definit 1
+strict follow 1
+strict greater 1
+strict hierarch 1
+strict hierarch decomposit 1
+strict implicit 1
+strict implicit inform 1
+strict incr 1
+strict inf 1
+strict inf erieur 1
+strict layer 1
+strict layer hierarch 1
+strict le norm 1
+strict lin 1
+strict lin inequ 1
+strict ma 1
+strict ma peut 1
+strict modif 1
+strict modif en 1
+strict n ecessair 1
+strict n egatif 1
+strict nec 1
+strict nonblock 1
+strict nonblock network 1
+strict or pur 1
+strict order 1
+strict posit 1
+strict posit amount 1
+strict positif 1
+strict pref 1
+strict protocol 1
+strict rc 1
+strict requir 1
+strict se 1
+strict se inclus 1
+strict sen 1
+strict sort 1
+strict speak 1
+strict suivr 1
+strict suivr leur 1
+strict sup 1
+strict sup erieur 1
+strict tw ph 1
+stricter 3
+stricter condit 1
+stricter isol 1
+stricter not 1
+strictest 1
+strik 4
+strik adv 1
+strik du 1
+strik high lim 1
+string 31
+string a repr 1
+string a.14 1
+string a.14 symbol 1
+string alphab 1
+string and icon 1
+string and identif 1
+string and replac 1
+string and show 1
+string and string 1
+string ar ar 1
+string ar construc 1
+string ar garner 1
+string ar polynom 1
+string argum 1
+string assoc 1
+string block 1
+string block edit 1
+string bt 1
+string bt heq 1
+string by coinc 1
+string by tak 1
+string by traver 1
+string by try 1
+string comparison 4
+string con 1
+string concat 1
+string construc 1
+string contain 1
+string contain relev 1
+string correct 1
+string correct problem 1
+string def 1
+string describ 1
+string edit 1
+string edit dist 1
+string el 1
+string encod 1
+string encod header 1
+string encod pr 1
+string encod schem 1
+string from length 1
+string gener 1
+string ha reach 1
+string handl 1
+string handl view 1
+string header 1
+string header impl 1
+string hel 1
+string hel world 1
+string hold 1
+string in ca 1
+string in f0 1
+string in quest 1
+string int block 1
+string is assoc 1
+string is denot 1
+string is determin 1
+string is gener 1
+string is match 1
+string is prefer 1
+string is select 1
+string longer 1
+string match 1
+string match algorithm 1
+string match appl 1
+string match techniqu 1
+string match view 1
+string obtain 1
+string of 1s 1
+string of 4n2 1
+string of bin 1
+string of categor 1
+string of contigu 1
+string of length 2
+string of pot 1
+string of symbol 1
+string of word 1
+string of zer 1
+string on appl 1
+string pattern 1
+string perform 1
+string posit 1
+string proc 1
+string random 1
+string random ch 1
+string random gener 1
+string read 1
+string requir 1
+string segm 1
+string segm requir 1
+string separ 1
+string structur 1
+string structur symbol 1
+string symbol 1
+string symbol syntac 1
+string th quick 1
+string to match 1
+string to string 1
+string together path 1
+string wer conduc 1
+string wer encod 1
+string wer select 1
+string wer test 1
+string wh substr 1
+string with jf 1
+string with simil 1
+string.h 1
+string.h inclus 1
+string.h inclus errn.h 1
+strip 6
+strip ar averag 1
+strip ar scan 1
+strip box 1
+strip box ind 1
+strip contrast 1
+strip is calcl 1
+strip is con 1
+strip is eff 1
+strip is project 1
+strip min 1
+strip min etc 1
+strip of imag 1
+strip over cylindr 1
+strip project 1
+strip prototyp 1
+strip result 1
+strip to good 1
+strip to progr 1
+strip unit 1
+striv 1
+strok 3
+strok emb 1
+strok for strok 1
+strok length 1
+strok recognit 1
+strok typ 1
+strong 33
+strong activ 1
+strong activ unit 1
+strong advoc 1
+strong advoc measur 1
+strong affect 1
+strong agr 1
+strong and weak 1
+strong as host 1
+strong assum 1
+strong back 1
+strong block 1
+strong block effect 1
+strong boolean 1
+strong boolean answer 1
+strong coh 1
+strong coh protocol 1
+strong compon 1
+strong compon an 1
+strong con 2
+strong con condit 1
+strong con oper 1
+strong con sem 1
+strong connect 2
+strong connect compon 1
+strong connect graph 1
+strong constraint 1
+strong correl 2
+strong dep 1
+strong deriv 1
+strong dev 1
+strong distinct 1
+strong empir 1
+strong empir evid 1
+strong evid 1
+strong filter 1
+strong form 1
+strong found 1
+strong guar 1
+strong heur 1
+strong impact 1
+strong in favor 1
+strong interact 1
+strong is tak 1
+strong norm 1
+strong norm argum 1
+strong on eff 1
+strong oper 1
+strong read 1
+strong read stat 1
+strong read writ 1
+strong recom 1
+strong recom proper 1
+strong rel 2
+strong resembl 1
+strong resembl standard 1
+strong restrict 1
+strong ring 1
+strong ring effect 1
+strong sen 1
+strong separ 1
+strong separ result 1
+strong simil 1
+strong that verb 1
+strong theor 1
+strong tool 1
+strong typ 2
+strong weak 1
+strong weakt 1
+strong writ 1
+strong writ stat 1
+stronger 15
+stronger a constraint 1
+stronger con. 1
+stronger constraint 1
+stronger effect 1
+stronger empir 1
+stronger empir evid 1
+stronger impact 1
+stronger induc 1
+stronger induc hypoth 1
+stronger lik 1
+stronger not 1
+stronger prim 1
+stronger proper 1
+stronger requir 1
+stronger restrict 1
+stronger strength 1
+stronger structur 1
+stronger than bof 1
+stronger than weak 1
+strongest 2
+strongest constraint 1
+strongest constraint requir 1
+strongest level 1
+strongest on strong 1
+strongest skept 1
+stroup 1
+stroustrup 4
+struc 6
+struc field 1
+struc mprus 1
+struc spf 1
+struc th blad 1
+structr 1
+structr system 1
+structur 99
+structur a sub 1
+structur acc 1
+structur act 1
+structur act object 1
+structur acycl 1
+structur agr 1
+structur aid 1
+structur algorithmiqu 1
+structur allow 1
+structur allow direct 1
+structur an 1
+structur anatomiqu 1
+structur anatomiqu dan 1
+structur and algorithm 3
+structur and author 1
+structur and behavior 2
+structur and behaviour 1
+structur and complec 1
+structur and control 1
+structur and design 1
+structur and dynam 1
+structur and evolut 1
+structur and featur 1
+structur and form 1
+structur and funct 2
+structur and heap 1
+structur and inherit 1
+structur and lock 1
+structur and oper 2
+structur and organ 1
+structur and procedur 1
+structur and relationship 2
+structur and strateg 1
+structur and theor 1
+structur and therefor 1
+structur and transform 1
+structur and un 1
+structur and unstructur 1
+structur and wait 1
+structur appl 1
+structur approach 1
+structur ar 1
+structur ar character 1
+structur ar drawn 1
+structur ar gather 1
+structur ar introduc 1
+structur ar mi 1
+structur ar repr 1
+structur ar slower 1
+structur ar us 1
+structur as augm 1
+structur as dynam 1
+structur as follow 1
+structur as netsim 1
+structur as pattern 1
+structur as shown 2
+structur aspect 2
+structur assoc 1
+structur atom 1
+structur atomiqu 1
+structur atomiqu tridimensionnel 1
+structur ba 4
+structur ba edit 1
+structur ba knowledg 1
+structur ba select 1
+structur becom 1
+structur biolog 1
+structur brain 1
+structur by biacin 1
+structur by observ 1
+structur by optim 1
+structur by simp 1
+structur byp 1
+structur cal hybrid 1
+structur cal list 1
+structur cal vtabl 1
+structur cel 1
+structur cel qu 1
+structur chang 4
+structur cl 2
+structur cl support 1
+structur cl1 1
+structur closer 1
+structur cod 2
+structur commun 1
+structur complec 1
+structur compon 1
+structur comput 1
+structur comput graph 1
+structur con 1
+structur concept 1
+structur contain 6
+structur contain field 1
+structur contain refer 1
+structur continu 1
+structur cop 1
+structur correspon 2
+structur correspon cl 1
+structur correspon est 1
+structur cover 1
+structur cover criter 1
+structur dag 1
+structur dat 3
+structur de 4
+structur de ce 1
+structur de contr 1
+structur de don 2
+structur de la 3
+structur de neumerkel 1
+structur de pag 1
+structur de program 1
+structur de prot 1
+structur de tel 1
+structur de term 1
+structur decl 1
+structur defin 3
+structur deriv 2
+structur descript 1
+structur design 1
+structur design paradigm 1
+structur design system 1
+structur determ 1
+structur differ 1
+structur direct 1
+structur distinct 1
+structur domain 2
+structur domain knowledg 1
+structur dordinateur 1
+structur dordinateur don 1
+structur du 4
+structur du cod 1
+structur du nouvel 1
+structur du program 1
+structur dun 2
+structur dun autr 1
+structur dun mach 1
+structur dur learn 1
+structur e com 1
+structur ec 1
+structur el 1
+structur eluc 1
+structur eluc problem 1
+structur empl 1
+structur en 1
+structur en avril 1
+structur environm 1
+structur erg 1
+structur erg theor 1
+structur est 1
+structur est aus 1
+structur est etiqu 1
+structur est incr 1
+structur est unif 1
+structur et de 1
+structur et etiqu 1
+structur et le 1
+structur evolut 1
+structur facil 2
+structur facil allow 1
+structur facil list 1
+structur featur 2
+structur fil 1
+structur fil system 1
+structur finit 1
+structur finit el 1
+structur fonct 1
+structur fonct selon 1
+structur for achief 1
+structur for adapt 1
+structur for bind 1
+structur for comput 1
+structur for distribut 1
+structur for implem 3
+structur for ind 1
+structur for knowledg 1
+structur for maintain 1
+structur for measur 1
+structur for multidim 1
+structur for parallel 1
+structur for prior 1
+structur for proc 1
+structur for reason 1
+structur for rol 1
+structur for spat 1
+structur for templ 1
+structur forml 1
+structur found 1
+structur freez 1
+structur freez relev 1
+structur from ct 1
+structur g slot 1
+structur gener 1
+structur grammar 1
+structur ha refer 1
+structur hd 1
+structur hierarch 1
+structur hold 1
+structur hold explicit 1
+structur in complec 1
+structur in computer 1
+structur in figur 2
+structur in memor 1
+structur in natur 1
+structur in nodewhich 1
+structur in proof 1
+structur in repr 1
+structur in sect 2
+structur in textur 1
+structur in tor 1
+structur induc 2
+structur inform 5
+structur input 1
+structur int modl 1
+structur integr 1
+structur interact 1
+structur interact graph 1
+structur interview 1
+structur interview find 1
+structur interview promot 1
+structur interview requir 1
+structur interview techniqu 1
+structur is ch 1
+structur is deriv 1
+structur is imp 2
+structur is low 1
+structur is monit 1
+structur is repl 1
+structur is said 1
+structur is se 1
+structur is symmeter 1
+structur is us 1
+structur it hold 1
+structur langu 1
+structur le 1
+structur le part 1
+structur light 1
+structur light system 1
+structur light system3 1
+structur lik ring 1
+structur lin 1
+structur lin system 1
+structur manipl 1
+structur matr 1
+structur may help 1
+structur mechan 2
+structur mechan decr 1
+structur mechan sampl 1
+structur method 1
+structur mimd 1
+structur mimd est 1
+structur motif 1
+structur natur 1
+structur nec 1
+structur network 1
+structur nous 1
+structur object 1
+structur object valu 1
+structur oblig 1
+structur of atom 1
+structur of babel 1
+structur of biomacromolecl 1
+structur of boolean 1
+structur of detail 1
+structur of docum 2
+structur of euclidean 1
+structur of fact 1
+structur of finit 1
+structur of forml 1
+structur of hierarch 1
+structur of hilog 1
+structur of human 1
+structur of interconnect 1
+structur of knowledg 1
+structur of langu 1
+structur of li 1
+structur of loc 1
+structur of mar 1
+structur of mean 1
+structur of med 1
+structur of method 1
+structur of natur 1
+structur of parafr 1
+structur of phag 1
+structur of program 1
+structur of protein 1
+structur of resourc 1
+structur of specif 1
+structur of spf 1
+structur of st 1
+structur of string 1
+structur of tdbm 1
+structur of typ 1
+structur of undirect 1
+structur oft requir 1
+structur on shar 1
+structur oper 1
+structur or learn 1
+structur or model 1
+structur orient 1
+structur our theor 1
+structur over typ 1
+structur par 1
+structur par un 1
+structur part 1
+structur particl 1
+structur pattern 1
+structur per bar 1
+structur piec 1
+structur plut 1
+structur plut ot 1
+structur pointer 1
+structur pour 2
+structur pour la 1
+structur pour pouvoir 1
+structur pr 1
+structur pr ec 1
+structur precompiler 1
+structur principl 1
+structur problem 4
+structur proc 1
+structur proct 1
+structur program 1
+structur prov 1
+structur prov support 1
+structur qu 2
+structur qu nous 1
+structur qu pour 1
+structur r tr 1
+structur reflect 1
+structur rel 1
+structur rel me 1
+structur relationship 1
+structur repr 4
+structur repr esent 1
+structur requir 1
+structur return 1
+structur rev 2
+structur rig 1
+structur rig de 1
+structur rl 2
+structur s sur 1
+structur seem 1
+structur segm 1
+structur shar 2
+structur shar repr 1
+structur signif 1
+structur simd 1
+structur simd offr 1
+structur sl1 1
+structur sl1 modl 1
+structur sont 1
+structur sont partag 1
+structur sont util 1
+structur spac 1
+structur specif 2
+structur st 2
+structur st proc 1
+structur st requir 1
+structur stochastiqu 1
+structur substitut 1
+structur subtyp 1
+structur suit 1
+structur superimp 1
+structur suppl 1
+structur suppl ementair 1
+structur support 2
+structur symbol 1
+structur symbol tabl 1
+structur system 4
+structur system approach 1
+structur system developm 1
+structur tak 1
+structur techniqu 1
+structur term 1
+structur term creat 1
+structur test 1
+structur th assoc 1
+structur th proof 1
+structur th reasoner 1
+structur th specif 1
+structur th theorem 1
+structur that captur 1
+structur that explain 1
+structur that help 1
+structur that interproc 1
+structur that repr 1
+structur that show 1
+structur that split 1
+structur theor 1
+structur theor allow 1
+structur through cascad 1
+structur to accompl 1
+structur to allow 1
+structur to bind 1
+structur to continu 1
+structur to deal 1
+structur to determin 1
+structur to encomp 1
+structur to fit 1
+structur to model 1
+structur to partit 1
+structur to reason 1
+structur to repr 1
+structur to repr. 1
+structur to st 1
+structur to support 1
+structur tr 2
+structur transl 1
+structur tridimensionnel 1
+structur tridimensionnel de 1
+structur unfold 1
+structur user 1
+structur using 1
+structur ver 1
+structur vol 1
+structur vs 1
+structur wavel 2
+structur wavel pack 1
+structur wavel transform 1
+structur wh 1
+structur when appl 1
+structur which adm 1
+structur which captur 1
+structur which impl 1
+structur which repr 1
+structur which simplif 1
+structur wid 1
+structur wil point 1
+structur wil result 1
+structur with appl 1
+structur with father 1
+structur with ident 1
+structur with logarithm 1
+structur with nil 1
+structur with shadow 1
+structur with targ 1
+structur without requir 1
+structur would po 1
+structur z specif 1
+structuraux 1
+structuraux en 1
+structuraux en biolog 1
+structuraux et de 1
+structurer 1
+structurer le 1
+structurer le compilateur 1
+strung 1
+strutur 1
+strutur at infin 1
+stuart 2
+stuart rober 1
+stuart rober div 1
+stub 1
+stub without dealloc 1
+stuck 2
+stud 87
+stud a method 1
+stud a ver 1
+stud act 1
+stud adapt 1
+stud addr 1
+stud addr error 1
+stud aim 2
+stud an experim 1
+stud and describ 1
+stud and emp 1
+stud and empl 1
+stud and tut 1
+stud and us 1
+stud approach 1
+stud ar interest 1
+stud ar investig 1
+stud ar ong 1
+stud ar repr 1
+stud ar stud 1
+stud at ecrc 1
+stud at microsoft 1
+stud at particl 1
+stud ba 1
+stud being requir 1
+stud bil 1
+stud bil hoad 1
+stud by allow 1
+stud by ch 1
+stud by dvorak 1
+stud by johnson 1
+stud by lesk 1
+stud can rar 1
+stud cl 1
+stud collabor 1
+stud com 1
+stud comb 1
+stud compl 1
+stud concern 1
+stud consider 1
+stud constraint 1
+stud constraint hierarch 1
+stud could investig 1
+stud debug 1
+stud deliber 1
+stud deliber restrict 1
+stud demonstr 1
+stud did empl 1
+stud digit 1
+stud digit nondetermin 1
+stud du 1
+stud effect 1
+stud empl 1
+stud empl fault 1
+stud explan 1
+stud ext 2
+stud flow 1
+stud flow control 1
+stud foc 1
+stud for act 1
+stud for decad 1
+stud for multipl 1
+stud frank 1
+stud got 1
+stud got modest 1
+stud gram 1
+stud gram vi 1
+stud hamilt 1
+stud hamilt proper 1
+stud hav foc 1
+stud hav seen 2
+stud hav shown 3
+stud how human 1
+stud how topolog 1
+stud how uniform 1
+stud illustr 1
+stud in computer 1
+stud in dat 2
+stud in deep 1
+stud in depth 1
+stud in detail 4
+stud in develop 1
+stud in gener 1
+stud in integr 1
+stud in log 2
+stud in modl 1
+stud in ontolog 1
+stud in prolog 1
+stud in sec 1
+stud incr 1
+stud ind 4
+stud instruc 1
+stud integr 1
+stud interconnect 1
+stud interconnect network 1
+stud investig 2
+stud investig var 1
+stud involut 1
+stud is avail 1
+stud is lim 1
+stud is mad 1
+stud is restrict 1
+stud is split 1
+stud it behavior 1
+stud it effect 1
+stud it proper 1
+stud jeffr 1
+stud jigsaw 1
+stud jigsaw puzzl 1
+stud john 1
+stud lack 1
+stud learn 1
+stud list 1
+stud loc 2
+stud loc ar 1
+stud loc propag 1
+stud model 1
+stud model theor 1
+stud mov 1
+stud mult 1
+stud mult interconnect 1
+stud multicast 1
+stud new cl 1
+stud new langu 1
+stud nr.143 1
+stud object 1
+stud occur 1
+stud of ao 1
+stud of constraint 1
+stud of digit 1
+stud of eff 1
+stud of fair 1
+stud of ga 1
+stud of geometer 1
+stud of imag 1
+stud of implem 1
+stud of instruc 1
+stud of integr 1
+stud of langu 2
+stud of method 1
+stud of multim 1
+stud of non 1
+stud of np 1
+stud of pattern 1
+stud of polynom 1
+stud of programmer 1
+stud of quantif 1
+stud of replac 1
+stud of schnor 1
+stud of soc 1
+stud of softwar 1
+stud of var 2
+stud offer 1
+stud offer insight 1
+stud on ar 1
+stud on ga 1
+stud on part 1
+stud on perform 1
+stud onl orient 1
+stud other cl 1
+stud our intraprocedur 1
+stud pag 1
+stud pair 1
+stud part 1
+stud part tim 1
+stud particip 1
+stud po character 1
+stud pr 1
+stud prev 1
+stud problem 1
+stud progr 1
+stud proper 1
+stud prov 1
+stud prov insight 1
+stud quit ext 1
+stud real mach 1
+stud report 2
+stud requir 2
+stud requir extr 1
+stud research 2
+stud research fellowship 1
+stud research report 1
+stud respon 1
+stud s us 1
+stud s work 1
+stud scal 1
+stud select 1
+stud separ 1
+stud sever problem 1
+stud show 3
+stud signif 1
+stud signif stat 1
+stud situ 1
+stud situ wh 1
+stud smal program 1
+stud smooth 1
+stud solut 1
+stud stat 1
+stud stud 1
+stud succ 1
+stud succ ap 1
+stud suggest 3
+stud support 1
+stud switch 1
+stud switch network 1
+stud system 1
+stud t test 1
+stud tak 1
+stud th adapt 1
+stud th approach 1
+stud th confid 1
+stud th decomposit 1
+stud th design 1
+stud th effect 3
+stud th fe 1
+stud th impact 2
+stud th implem 1
+stud th interv 1
+stud th key 1
+stud th load 1
+stud th muc 1
+stud th mult 1
+stud th oper 1
+stud th perform 3
+stud th problem 4
+stud th proper 1
+stud th rel 2
+stud th result 1
+stud th scal 1
+stud th shap 1
+stud th smooth 1
+stud th tot 1
+stud th upper 1
+stud th us 1
+stud th var 1
+stud that multipl 1
+stud therefor 1
+stud therefor requir 1
+stud to determin 1
+stud to mov 1
+stud to tak 1
+stud to think 1
+stud to view 1
+stud to writ 1
+stud typ 1
+stud upt 1
+stud using 4
+stud using sev 1
+stud verif 1
+stud wa int 1
+stud we emph 1
+stud wer car 1
+stud wh purp 1
+stud what character 1
+stud what effect 1
+stud what hap 1
+stud which compar 1
+stud which examin 1
+stud wish 1
+stud with larger 1
+stud with tool 1
+stud with uniform 1
+stud work 2
+stud work ar 1
+stud work part 1
+stud would try 1
+stud writ 1
+stud writ object 1
+stud writ sent 1
+stud yield 1
+stud1 1
+stuelpnagel 1
+stuhlsatzenhausweg 1
+stunk 1
+stunk rajeev 1
+stunk rajeev sivaram 1
+stunkel 1
+stunkel watson.ibm.com 1
+stunkel watson.ibm.com email 1
+stupid 1
+stupid model 1
+stupid oracl 1
+stupid oracl multithread 1
+stupid supersc 1
+stupid supersc model 1
+sturm 1
+sturm sequ 1
+sturman 1
+stuttgart 1
+styl 28
+styl and se 1
+styl attribut 1
+styl but synchron 1
+styl fin 1
+styl fin grain 1
+styl for object 2
+styl for prolog 1
+styl interconnect 1
+styl interconnect network 1
+styl is desir 1
+styl is discern 1
+styl issu 1
+styl me 1
+styl me sen 1
+styl object 1
+styl of arg 1
+styl of cod 2
+styl of conver 1
+styl of datab 1
+styl of design 1
+styl of evalu 1
+styl of execut 1
+styl of form 1
+styl of getp 1
+styl of interact 2
+styl of lin 1
+styl of natur 1
+styl of softwar 1
+styl of tradit 1
+styl parallel 1
+styl parallel program 1
+styl pr 1
+styl promot 1
+styl scal 1
+styl sem 1
+styl sem form 1
+styl sen 1
+styl sen prim 1
+styl sen primitiv 1
+styl simil 1
+styl synchron 1
+styl synchron command 1
+styl to determin 1
+styl trademark 1
+styl user 1
+styl user interfac 1
+styl variabl 1
+styl wa glean 1
+styl when concern 1
+stylus 1
+stylus tip 1
+styp 1
+styp sym 1
+stytz 1
+su 9
+su and t.j 1
+su barrer 1
+su barrer le 1
+su bomb 1
+su cr 1
+su cr unsaf 1
+su fair 1
+su farrel 1
+su int 1
+su int er 1
+su is comput 1
+su mexprimer 1
+su prim 1
+sub 75
+sub among rol 1
+sub ar 1
+sub ar elimin 1
+sub assembl 1
+sub au 1
+sub au niveau 1
+sub autoregr 1
+sub autoregr tim 1
+sub block 1
+sub c non 1
+sub ca 1
+sub cal block 1
+sub cl 1
+sub cl driv 1
+sub collect 1
+sub compon 1
+sub comput 1
+sub con 1
+sub cover 1
+sub defin 1
+sub fa1 1
+sub goal 1
+sub goal obtain 1
+sub grid 2
+sub is alloc 1
+sub is minim 1
+sub is transm 1
+sub k tupl 1
+sub le 1
+sub le eff 1
+sub lin 2
+sub lin manner 1
+sub log 1
+sub m1 1
+sub maxim 1
+sub maxim level 1
+sub model 1
+sub modl 1
+sub modl accompan 1
+sub modl funct 1
+sub modl number 1
+sub modl receiv 1
+sub modl reduc 1
+sub modl refer 1
+sub modl spec 1
+sub modl stabil 1
+sub modl system 1
+sub modl weight 1
+sub monit 1
+sub monit siz 1
+sub monit system 1
+sub nengendr 1
+sub nengendr qu 1
+sub network 2
+sub network arrang 1
+sub network interconnect 1
+sub network system 1
+sub nework 1
+sub of bp 1
+sub of branch 1
+sub of dat 1
+sub of design 2
+sub of docum 1
+sub of edg 1
+sub of f0 1
+sub of f1 3
+sub of hilog 1
+sub of inst 1
+sub of int 1
+sub of nod 1
+sub of non 1
+sub of occam 1
+sub of polygon 1
+sub of privileg 1
+sub of proc 1
+sub of r1 1
+sub of regr 1
+sub of request 1
+sub of rn 1
+sub of sampl 1
+sub of sep 1
+sub of server 1
+sub of spat 1
+sub of string 1
+sub of succ 1
+sub of test 1
+sub of uncolor 1
+sub of variabl 1
+sub of ver 2
+sub of vhdl 1
+sub optim 4
+sub optim configur 1
+sub optim fundam 1
+sub optim network 1
+sub optim non 1
+sub optim structur 1
+sub order 1
+sub part 1
+sub partit 1
+sub plusieur 1
+sub plusieur fo 1
+sub polygon 1
+sub polygon level 1
+sub problem 2
+sub reg 2
+sub reg adjac 1
+sub relationship 1
+sub satisf 1
+sub se 1
+sub sect 1
+sub select 1
+sub solut 1
+sub sourc 1
+sub sourc wh 1
+sub spac 2
+sub step 1
+sub step giv 1
+sub system 2
+sub task 1
+sub task complec 1
+sub transact 1
+sub typ 1
+sub v1 1
+sub v1 con 1
+sub wil contribut 1
+sub. 2
+subar 1
+subar at proc 1
+subband 3
+subband cod 1
+subband cod artifact 1
+subband cod compr 1
+subband cod imag 1
+subband cod system 1
+subband comput 1
+subband decomposit 1
+subband energ 1
+subband imag 1
+subband imag cod 1
+subband transform 1
+subblock 1
+subc 4
+subc of boolean 1
+subc to consider 2
+subcach 1
+subcc 1
+subcl 8
+subcl and automat 1
+subcl color 1
+subcl color point 1
+subcl could viol 1
+subcl from inherit 1
+subcl in term 1
+subcl inherit 2
+subcl is ad 1
+subcl may spec 1
+subcl of cl 1
+subcl of cl1 1
+subcl of cl2 1
+subcl of di 1
+subcl of funct 1
+subcl of gener 1
+subcl of list 1
+subcl of method 1
+subcl of number 1
+subcl of object 1
+subcl of recur 1
+subcl of regl 1
+subcl of stack 1
+subcl of structur 1
+subcl rel 1
+subcl relationship 1
+subcl wh us 1
+subcl which inherit 1
+subcompon 2
+subcomput 1
+subcomput result 1
+subcomput with loc 1
+subcontract 1
+subcontract th work 1
+subderiv 1
+subderiv and subject 1
+subderiv en 1
+subderiv is cut 1
+subderiv lem 1
+subdetermin 1
+subdirect 1
+subdiv 10
+subdiv adapt 1
+subdiv adapt de 1
+subdiv discr 1
+subdiv discr es 1
+subdiv each part 1
+subdiv in aw 1
+subdiv result 1
+subdiv th cluster 1
+subdiv th edg 1
+subdiv th planar 1
+subdiv th tr 1
+subdivid 3
+subdivid further 1
+subdivid int se 1
+subdivid vol 1
+subdomain 2
+subdomain utru 1
+subexpon 1
+subexpon cl 1
+subexpon tim 1
+subexpon tim cl 1
+subexpon tim measur 1
+subexpr 2
+subexpr can giv 1
+subexpr exp 1
+subexpr norm 1
+subexpr of giv 1
+subexpr th cur 1
+subfil 1
+subfil correspon 1
+subforml 1
+subforml fi 1
+subforml of oe 1
+subgraph 8
+subgraph and ver 1
+subgraph ar connect 1
+subgraph ar label 1
+subgraph becom 1
+subgraph can cr 1
+subgraph connect 1
+subgraph detail 1
+subgraph determin 1
+subgraph g0 2
+subgraph g0 connect 1
+subgraph hi 1
+subgraph induc 1
+subgraph of minim 1
+subgraph on connect 1
+subgraph order 1
+subgraph partit 1
+subgraph problem 1
+subgraph rang 1
+subgraph rec 1
+subgraph rec fil 1
+subgraph separ 1
+subgraph that biconnect 1
+subgraph that bridg 1
+subgraph using 1
+subgraph using minim 1
+subgraphsubgraph 1
+subgrid 1
+subgrid ar split 1
+subgrid of half 1
+subgrid of uniform 1
+subgroup 1
+subgroup init 1
+subgroup remain 1
+subinterv 1
+subir 2
+subir de 1
+subir de chang 1
+subir quun 1
+subir quun sel 1
+subiront 1
+subiront de 1
+subiront de mut 1
+subit 2
+subit de 1
+subit de chang 1
+subit linflu 1
+subit linflu de 1
+subit un eff 1
+subject 38
+subject a conclus 1
+subject a rel 1
+subject a remark 1
+subject a said 1
+subject a st 1
+subject ad 1
+subject agreed 1
+subject al mad 1
+subject al not 1
+subject allow 1
+subject allow gather 1
+subject and allow 1
+subject and object 2
+subject and prototyp 1
+subject and show 1
+subject and suff 1
+subject and test 1
+subject answer 1
+subject answer ye 1
+subject appear 1
+subject ar avail 1
+subject as exper 1
+subject assessm 1
+subject avail 1
+subject b st 1
+subject being interview 1
+subject between group 1
+subject c decl 1
+subject c reckon 1
+subject c said 1
+subject classif 3
+subject clear 1
+subject color 1
+subject color dist 1
+subject color percept 1
+subject com 1
+subject commun 1
+subject continu 1
+subject continu ment 1
+subject cs 1
+subject cs stat 1
+subject d said 1
+subject e agreed 1
+subject e ment 1
+subject expect 1
+subject f st 1
+subject felt 2
+subject for futur 2
+subject for test 1
+subject g qualif 1
+subject g st 1
+subject gav 1
+subject h ad 1
+subject h conclus 1
+subject h st 1
+subject ha ment 1
+subject had fin 1
+subject hav serv 1
+subject i reckon 1
+subject i st 1
+subject ind 3
+subject interview 1
+subject interview thought 1
+subject is assign 1
+subject is follow 1
+subject j com 1
+subject j mad 1
+subject j repeat 1
+subject k agreed 1
+subject k ment 1
+subject l felt 1
+subject l ment 1
+subject l qualif 1
+subject l reckon 1
+subject lin 1
+subject m said 1
+subject m support 1
+subject mad 1
+subject main 1
+subject main not 1
+subject may becom 1
+subject may giv 1
+subject measur 1
+subject ment 1
+subject observ 1
+subject of futur 1
+subject of liv 1
+subject of ong 1
+subject of optim 1
+subject of refin 1
+subject of research 1
+subject opin 1
+subject own word 1
+subject percept 1
+subject percept dist 1
+subject phr 1
+subject po 1
+subject popl 1
+subject posit 1
+subject procedur 1
+subject program 1
+subject qu 1
+subject rank 1
+subject reduc 1
+subject reduc proper 1
+subject rel 1
+subject remain 1
+subject remark 1
+subject respon 1
+subject respon mean 1
+subject sat 1
+subject saying 1
+subject tak 1
+subject tak part 1
+subject talk 1
+subject th graph 1
+subject think 1
+subject thought 1
+subject tim 1
+subject to assum 1
+subject to consider 1
+subject to cooper 1
+subject to dat 1
+subject to expon 1
+subject to failur 1
+subject to forc 1
+subject to further 2
+subject to giv 1
+subject to group 1
+subject to lim 1
+subject to me 1
+subject to minim 1
+subject to st 1
+subject to work 1
+subject typ 1
+subject typ repr 1
+subject under stud 1
+subject wa ask 1
+subject wa pr 1
+subject wa reduc 1
+subject wa talk 1
+subject wer abl 1
+subject wer ask 1
+subject wer assign 1
+subject wer drink 1
+subject wer giv 1
+subject wer industr 1
+subject wer interview 1
+subject wer introduc 1
+subject wer nat 1
+subject wer postgradu 1
+subject within group 1
+subject work 1
+subkind 1
+subkind rel 1
+subl 1
+sublangu 1
+sublat 1
+sublat is expr 1
+sublim 1
+sublin 4
+sublin expect 1
+sublin expect tim 1
+sublin tim 2
+subm 16
+subm cl1 1
+subm classb 1
+subm for publ 4
+subm r kd 1
+subm receiv 1
+subm requir 1
+subm to bulletin 1
+subm to discr 1
+subm to ie 2
+subm to inform 1
+subm to intern 1
+subm wc1 1
+subm wc2 1
+submatr 3
+submatr ar pack 1
+submatr c00 1
+submatr is st 1
+submatr recur 1
+submenus 1
+submesh 1
+submesh of smaller 1
+submesh ri 1
+submodel 1
+submodl 3
+submodl decr 1
+submodl ent 1
+submodl ent vi 1
+submodl is brought 1
+submodl reflect 1
+submodl system 1
+submodl system describ 1
+submodl vi 1
+submonit 1
+subnet 1
+subobject 1
+subobject a pointer 1
+subobject as compon 1
+suboptim 4
+suboptim heur 1
+suboptim map 1
+suboptim network 1
+suboptim season 1
+suboptim season autoregr 1
+suboptim solut 2
+suboptim structur 1
+subord 1
+subord text 1
+subord text reg 1
+subp 2
+subp is fair 1
+subp level 1
+subpart 1
+subproblem 5
+subproblem lik 1
+subproblem of identif 1
+subproblem subst 1
+subproblem that result 1
+subprogram 3
+subprogram a check 1
+subprogram and freed 1
+subprogram cal 1
+subprogram is handl 1
+subprogram nam 1
+subprogram pointer 1
+subproject 1
+subproof 2
+subproof ar spat 1
+subproof is car 1
+subproof of proposit 1
+subproof which exclus 1
+subprotocol 1
+subprotocol for comput 1
+subprotocol funct 1
+subquest 1
+subraman 1
+subraman avec 1
+subraman avec sml 1
+subreg 2
+subreg of simil 1
+subrel 1
+subrel of mult 1
+subrel of singl 1
+subrout 10
+subrout ar allow 1
+subrout cal 1
+subrout for check 1
+subrout for comput 1
+subrout for us 1
+subrout in sect 1
+subrout level 1
+subrout libr 1
+subrout of wgp 1
+subrout that impl 1
+subrout that replac 1
+subrout that us 1
+subrout to dev 1
+subrout to find 1
+subscrib 1
+subscriber 2
+subscriber upd 1
+subscript 6
+subscript and dat 1
+subscript f wh 1
+subscript found 1
+subscript funct 1
+subscript funct ar 1
+subscript funct lin 1
+subscript funct using 1
+subscript oe 1
+subscript of liter 1
+subsect 25
+subsect describ 1
+subsect disc 1
+subsect is devot 1
+subsect is show 1
+subsect motiv 1
+subsect of entr 1
+subsect to solut 1
+subsect we describ 1
+subsect we estim 1
+subsect we prov 1
+subsect we show 1
+subsect we stud 1
+subsect we us 1
+subsect wer introduc 1
+subsect with ts 1
+subsequ 50
+subsequ a record 1
+subsequ acc 1
+subsequ act 1
+subsequ act imp 1
+subsequ addit 1
+subsequ assoc 1
+subsequ back 1
+subsequ back pa 1
+subsequ bind 1
+subsequ built 1
+subsequ by defmethod 1
+subsequ cal 1
+subsequ cal lock 1
+subsequ cel 1
+subsequ chang 2
+subsequ coar 1
+subsequ coar level 1
+subsequ commun 1
+subsequ compr 1
+subsequ comput 2
+subsequ connect 1
+subsequ crash 1
+subsequ depr 1
+subsequ develop 1
+subsequ disc 2
+subsequ exampl 1
+subsequ execut 2
+subsequ extract 1
+subsequ extract proc 1
+subsequ ft 1
+subsequ goal 1
+subsequ identif 1
+subsequ influ 1
+subsequ input 1
+subsequ input vect 1
+subsequ invoc 1
+subsequ iter 1
+subsequ layer 1
+subsequ lead 1
+subsequ level 1
+subsequ list 1
+subsequ loc 1
+subsequ loc search 1
+subsequ me 2
+subsequ me destin 1
+subsequ me forml 1
+subsequ me guar 1
+subsequ oe 1
+subsequ of nod 1
+subsequ of primitiv 1
+subsequ of sampl 1
+subsequ oper 1
+subsequ pa 1
+subsequ paper 1
+subsequ re 1
+subsequ receiv 1
+subsequ reconstruc 1
+subsequ refer 1
+subsequ remov 1
+subsequ renam 1
+subsequ replac 1
+subsequ report 1
+subsequ report experim 1
+subsequ repr 1
+subsequ request 1
+subsequ request dep 1
+subsequ return 1
+subsequ rewrit 1
+subsequ se 1
+subsequ se sn 1
+subsequ sect 4
+subsequ select 1
+subsequ shar 1
+subsequ thr theorem 1
+subsequ tim 1
+subsequ tim step 1
+subsequ to as 1
+subsequ to cod 1
+subsequ to produc 1
+subsequ und 1
+subsequ und scan 1
+subsequ upd 1
+subsequ using 1
+subsequ with exit 1
+subsequ work 1
+subsequ writ 1
+subserv 1
+subserv rol 1
+subsid 1
+subsid thread 1
+subsistait 1
+subsistait n eanmoin 1
+subsol 1
+subsol et al 1
+subsolver 1
+subsolver using 1
+subsort 1
+subsort cent 1
+subsort cent nat 1
+subsort cent pur 1
+subsort object 1
+subsort object me 1
+subsourc 1
+subspac 4
+subspac imq 1
+subspac in kerh 1
+subspac ker 1
+subspac method 1
+subspac that contain 1
+subspac we refer 1
+subst 36
+subst adv 1
+subst amount 1
+subst appl 1
+subst arg 1
+subst as seen 1
+subst benefit 1
+subst bi 1
+subst by assign 1
+subst capabil 1
+subst conclus 1
+subst differ rang 1
+subst faster 1
+subst fewer 1
+subst fewer loc 1
+subst fewer memor 1
+subst gain 1
+subst gener 1
+subst high 3
+subst high parallel 1
+subst improv 2
+subst incr 2
+subst inst 1
+subst inst reduc 1
+subst larger 1
+subst le cost 1
+subst le gu 1
+subst lower 1
+subst modif 1
+subst mor exp 1
+subst number 1
+subst overcom 1
+subst overlap 1
+subst parallel 1
+subst parallel lo 1
+subst proof 1
+subst proof theor 1
+subst rev 1
+subst rev ver 1
+subst run 1
+subst run tim 1
+subst simplif 1
+subst simplif datab 1
+subst smaller 1
+subst smaller tim 1
+subst st 1
+subst st reduc 1
+subst susceptibl 1
+subst susceptibl dinteragir 1
+subst user 1
+subst user involut 1
+subst var 1
+subst weaker 1
+subst weaker lock 1
+substantiel 1
+substantiel de 1
+substantiel de la 1
+substitu 2
+substitu ee 2
+substitu es 1
+substitu es aux 1
+substitu est 1
+substitu introduit 1
+substitu introduit dan 1
+substitu le 1
+substitu le term 1
+substitu par 1
+substitu par tout 1
+substitu se 1
+substitu se comport 1
+substitu term 1
+substitu term par 1
+substitu un 1
+substitu un nouvel 1
+substituabl 1
+substituabl en 1
+substituabl en variabl 1
+substituabl est 1
+substituabl est acc 1
+substituabl peut 1
+substituabl peut etr 1
+substituer 1
+substituer de 1
+substituer de nouveaux 1
+substitut 29
+substitut a la 1
+substitut a lin 1
+substitut a placeholder 1
+substitut ae 1
+substitut affect 1
+substitut affect le 1
+substitut and cal 1
+substitut and modus 1
+substitut and replac 1
+substitut any precc 1
+substitut ar natur 1
+substitut as environm 1
+substitut avec 1
+substitut avec court 1
+substitut by term 1
+substitut cannot cr 1
+substitut com 1
+substitut commut 1
+substitut comput 1
+substitut conduit 1
+substitut cr 1
+substitut cr ee 1
+substitut cur 1
+substitut dan 1
+substitut dan la 1
+substitut de 1
+substitut de la 1
+substitut dun 1
+substitut dun var 1
+substitut e2 1
+substitut e2 ne1 1
+substitut est 1
+substitut est alor 1
+substitut est aus 1
+substitut est util 1
+substitut et affect 1
+substitut et compr 1
+substitut et un 1
+substitut evalu 1
+substitut evalu rl 1
+substitut ff 1
+substitut for a1 1
+substitut for form 1
+substitut for inst 1
+substitut for x2 1
+substitut fx 1
+substitut fx ag 1
+substitut gener 1
+substitut gener deriv 1
+substitut i1 1
+substitut in direct 1
+substitut in p1 1
+substitut in sequ 1
+substitut inst 1
+substitut int equ 1
+substitut ir 1
+substitut is built 1
+substitut is defin 1
+substitut is simp 1
+substitut jr 1
+substitut la 1
+substitut lem 1
+substitut lem saying 1
+substitut modif 1
+substitut ne 1
+substitut ne fait 1
+substitut norm 1
+substitut norm form 1
+substitut oe 2
+substitut of datab 1
+substitut of term 1
+substitut oper 1
+substitut ou 1
+substitut ou par 1
+substitut perm 1
+substitut peut 1
+substitut peut etr 1
+substitut pour 1
+substitut pour acc 1
+substitut preserv 1
+substitut preserv kind 1
+substitut preserv subtyp 1
+substitut rencontr 1
+substitut rencontr es 1
+substitut rl 1
+substitut soit 1
+substitut soit par 1
+substitut sont 1
+substitut sont confondu 1
+substitut ss 1
+substitut th bound 1
+substitut th compar 1
+substitut th constraint 1
+substitut th definit 1
+substitut th equ 1
+substitut th expr 1
+substitut th occur 1
+substitut th parameter 1
+substitut th ph 1
+substitut th requir 1
+substitut th rever 1
+substitut th valu 1
+substitut th variabl 1
+substitut that mak 1
+substitut try 1
+substitut valu 1
+substitut wh 1
+substitut wh rg 1
+substr 2
+substr and plac 1
+substr and therefor 1
+substr ar ident 1
+substr can fulfil 1
+substr fam 1
+substr fam ch 1
+substr famil 1
+substr for writ 1
+substr in ajt 1
+substr match 1
+substr of 4n2 1
+substr of genet 1
+substr pair 1
+substr s1 1
+substr s2 1
+substr th induc 1
+substr with dist 1
+substr.4 1
+substr.4 th correspon 1
+substructur 3
+substructur in accord 1
+substructur in protein 1
+substructur match 1
+substructur of noun 1
+subsubc 1
+subsum 4
+subsum by claus 1
+subsum captur 1
+subsum check 1
+subsum claus 1
+subsum in effect 1
+subsum remov 1
+subsum resolut 1
+subsum resolut remov 1
+subsum th origin 1
+subsum von 1
+subsum von neuman 1
+subsystem 13
+subsystem and compl 1
+subsystem architectur 1
+subsystem ax 1
+subsystem implem 1
+subsystem is unrel 1
+subsystem on benchmark 1
+subsystem or compon 1
+subsystem or program 1
+subtask 1
+subtask on parallel 1
+subterm 1
+subterm at posit 1
+subtil 1
+subtl 11
+subtl character 1
+subtl cultur 1
+subtl differ 1
+subtl difficult 1
+subtl error 1
+subtl involut 1
+subtl matter 1
+subtl mechan 1
+subtl mechan ba 1
+subtl of learn 1
+subtler 1
+subtr 14
+subtr and repl 1
+subtr and root 1
+subtr ar alloc 1
+subtr ar fl 1
+subtr ar heap 1
+subtr ar heapif 1
+subtr ar respon 1
+subtr b rep 1
+subtr is fl 1
+subtr of bound 1
+subtr of height 2
+subtr of tr 1
+subtr root 6
+subtr t1 1
+subtr ti 2
+subtr ti root 1
+subtr tv2 1
+subtr tv2 root 1
+subtr we def 1
+subtr we us 1
+subtract 9
+subtract and using 1
+subtract eq 1
+subtract it siz 1
+subtract th valu 1
+subtract thin 1
+subtract thin lin 1
+subtransact 2
+subtransact and clear 1
+subtransact at lj 1
+subtransact cap 1
+subtransact com 1
+subtransact com record 1
+subtransact compl 1
+subtransact contain 1
+subtransact execut 1
+subtransact guar 1
+subtransact ha com 1
+subtransact in order 1
+subtransact is act 1
+subtransact is link 1
+subtransact is rol 1
+subtransact occur 1
+subtransact occur entir 1
+subtransact or ct 1
+subtransact or oper 1
+subtransact part 1
+subtransact record 1
+subtransact start 1
+subtransact start record 1
+subtransact to guar 1
+subtransact using 1
+subtransact using op 1
+subtyp 4
+subtyp algorithm 1
+subtyp algorithm becom 1
+subtyp algorithm check 1
+subtyp and equ 1
+subtyp and object 1
+subtyp and supertyp 1
+subtyp and typ 1
+subtyp and typecheck 1
+subtyp arrow 1
+subtyp arrow typ 1
+subtyp as saf 1
+subtyp constraint 1
+subtyp deriv 1
+subtyp ext 1
+subtyp for k2 1
+subtyp for prolog 1
+subtyp hold 1
+subtyp inherit 1
+subtyp is preserv 1
+subtyp is prov 1
+subtyp judg 1
+subtyp of girard 1
+subtyp of number 1
+subtyp order 1
+subtyp point 1
+subtyp prem 1
+subtyp rel 1
+subtyp relationship 1
+subtyp rl 1
+subtyp rl allow 1
+subtyp s interfac 1
+subtyp specif 1
+subtyp stat 1
+subtyp stat deriv 1
+subtyp stat preserv 1
+subtyp system 1
+subtyp system pr 1
+subtyp under arbitr 1
+subtyp under substitut 1
+subword 1
+subword of bj 1
+suc 1
+succ 70
+succ a link 1
+succ act 1
+succ al co 1
+succ and compreh 1
+succ and failur 2
+succ and fin 1
+succ and ph 1
+succ ap 1
+succ ap part 1
+succ appl 7
+succ ar bound 1
+succ ar design 1
+succ ar inser 1
+succ as genet 1
+succ at learn 1
+succ by dynam 1
+succ by predec 1
+succ cal 1
+succ candid 1
+succ carv 1
+succ carv up 1
+succ ch 1
+succ ch link 1
+succ chunk 1
+succ classif 1
+succ client 1
+succ client request 1
+succ coarser 1
+succ coarser graph 1
+succ cod 1
+succ compl 2
+succ compl execut 1
+succ compl ph 1
+succ compon 1
+succ compon custom 1
+succ comput 1
+succ decomposit 1
+succ deriv 1
+succ developm 1
+succ digit 1
+succ digit recognit 1
+succ docum 1
+succ el 1
+succ elseif 1
+succ elseif cp 1
+succ empl 2
+succ en 1
+succ encod 1
+succ encod techniqu 1
+succ es 3
+succ es aur 1
+succ es dan 2
+succ es de 1
+succ es peut 1
+succ es soit 1
+succ execut 1
+succ execut ph 1
+succ fe 1
+succ fe se 1
+succ findk 1
+succ finer 1
+succ finer graph 1
+succ for luc 1
+succ for nb 1
+succ for pattern 1
+succ heur 1
+succ hist 1
+succ id 1
+succ id differ 1
+succ in establ 1
+succ in pract 1
+succ in reduc 2
+succ incarn 1
+succ inl 1
+succ integr 3
+succ integr loc 1
+succ is du 1
+succ is execut 1
+succ is report 1
+succ is wid 1
+succ issu 1
+succ iter 2
+succ iter produc 1
+succ k tim 1
+succ le detail 1
+succ level 1
+succ list 1
+succ loop 1
+succ loop iter 1
+succ ma 1
+succ ma elim 1
+succ method 2
+succ method design 1
+succ modif 1
+succ mor refin 1
+succ msld 1
+succ msld deriv 1
+succ multicast 1
+succ nec 1
+succ nec detect 1
+succ object 1
+succ object differ 1
+succ occur 1
+succ of adapt 1
+succ of ai 1
+succ of connect 1
+succ of entr 1
+succ of entr0 1
+succ of event 1
+succ of grammat 1
+succ of md 1
+succ of neur 1
+succ of p1 1
+succ of p4 1
+succ of p40 1
+succ of s2 1
+succ of s20 1
+succ of s8 1
+succ of sep 1
+succ of test 1
+succ of xi 1
+succ or error 1
+succ or failur 1
+succ or predec 1
+succ or proc 1
+succ p4 1
+succ pair 2
+succ part 1
+succ part evalu 1
+succ pattern 1
+succ pattern recognit 1
+succ perform 1
+succ pop 1
+succ predict 2
+succ predict produc 1
+succ prob 2
+succ prob 1n 1
+succ program 2
+succ program rar 1
+succ put 1
+succ rat 1
+succ rec 1
+succ receiv 1
+succ reduc 1
+succ refin 2
+succ refin method 1
+succ rel 1
+succ reserv 1
+succ se 1
+succ select 1
+succ select high 1
+succ sen 1
+succ sent 1
+succ sent receiv 1
+succ solut 1
+succ solut individu 1
+succ st 1
+succ subprogram 1
+succ swap 1
+succ swap stat 1
+succ tackl 1
+succ tak 1
+succ tak plac 1
+succ test 2
+succ th client 1
+succ that allow 1
+succ then cp 1
+succ to cg 1
+succ to load 1
+succ to read 1
+succ to reduc 1
+succ transact 1
+succ upd 1
+succ upd act 1
+succ ver 1
+succ w0 1
+succ when textur 1
+succ wil com 1
+succ world 1
+succ writ 1
+succeed 21
+succeed in build 1
+succeed in commun 1
+succeed in reduc 1
+succeed in solut 1
+succeed layer 1
+succeed lin 1
+succeed nod 1
+succeed oper 1
+succeed or fail 1
+succeed sect 1
+succeed solut 1
+succeed th dot 1
+succeed when oe 1
+successeur 1
+successeur de 1
+successeur de la 1
+successif 1
+successif du 1
+successif du register 1
+successiv 3
+successiv chacun 1
+successiv chacun de 1
+successiv cr 1
+successiv de 2
+successiv de la 1
+successiv le 1
+successiv obtenu 1
+successiv obtenu par 1
+successiv ont 1
+successiv ont au 1
+successiv partag 1
+successiv partag un 1
+successiv san qu 1
+successiv suiv 1
+succinct 2
+succinct and rigor 1
+succinct la 1
+succinct la th 1
+succinct le 1
+succinct le fonct 1
+succint 1
+suchman 1
+suchman87 1
+sud 5
+sud becom 1
+sud began 1
+sud being replac 1
+sud chang 1
+sud discover 1
+sud flur 1
+sud improv 1
+sud improv speed 1
+sudan 2
+suen 1
+suf 1
+suf ce 1
+suf ci 1
+suf ci rar 1
+suf cient 1
+suf cient hardwar 1
+suf cient parallel 1
+suff 75
+suff a classer 1
+suff acc 1
+suff acc right 1
+suff accur 1
+suff act 1
+suff act weight 1
+suff amount 1
+suff and nec 1
+suff approxim 1
+suff buffer 1
+suff buffer cap 1
+suff com 1
+suff com espac 1
+suff complec 1
+suff condit 8
+suff condit perm 1
+suff contextu 1
+suff contextu inform 1
+suff dan 1
+suff dan le 1
+suff de 2
+suff de fus 1
+suff de natur 1
+suff detail 1
+suff differ partit 1
+suff dop 1
+suff dop erateur 1
+suff emb 1
+suff et ain 1
+suff explor 1
+suff fast 2
+suff flec 1
+suff for na 1
+suff for numer 1
+suff for proc 1
+suff for satisfact 1
+suff funct 1
+suff gener 2
+suff gener test 1
+suff gener typ 1
+suff guar 1
+suff identif 1
+suff illus 1
+suff in order 1
+suff inform 3
+suff inst 1
+suff knowledg 1
+suff larg emb 1
+suff larg register 1
+suff larg valu 1
+suff maint 1
+suff mean 1
+suff memor 1
+suff number 1
+suff parod 1
+suff parod qu 1
+suff paus 1
+suff per fact 1
+suff perm 1
+suff perm de 1
+suff pour 4
+suff pour affirmer 1
+suff pour assurer 1
+suff pour garantir 1
+suff pour obtenir 1
+suff pour pouvoir 1
+suff pour qu 1
+suff pour tenter 1
+suff power 1
+suff power capabil 1
+suff privileg 1
+suff proper 1
+suff read 1
+suff resourc 2
+suff resourc avail 1
+suff rich 1
+suff robust 1
+suff robust prototyp 1
+suff simil 1
+suff simil textur 1
+suff st 1
+suff suiv 1
+suff tim 2
+suff to augm 1
+suff to captur 1
+suff to chang 1
+suff to check 1
+suff to clarif 1
+suff to color 1
+suff to comput 1
+suff to design 1
+suff to destr 1
+suff to determin 1
+suff to empl 2
+suff to find 1
+suff to giv 2
+suff to guar 3
+suff to impl 1
+suff to justif 1
+suff to mak 2
+suff to observ 1
+suff to perform 1
+suff to prov 2
+suff to put 1
+suff to reach 1
+suff to read 1
+suff to recogn 1
+suff to replac 1
+suff to show 5
+suff to test 1
+suff to yield 1
+suff tr 1
+suff tr es 1
+suff us 1
+suff wid 1
+suff with exact 1
+suffer 13
+suffer a signif 1
+suffer drawback 1
+suffer from lack 1
+suffer from short 1
+suffirait 1
+suffirait a sauvegarder 1
+suffisam 3
+suffisam complec 1
+suffisam complec pour 1
+suffisam de 1
+suffisam de don 1
+suffisam de localit 1
+suffisam de plac 1
+suffisam faibl 1
+suffisam faibl pour 1
+suffisam g en 1
+suffisam grand 1
+suffisam la 1
+suffisam la siml 1
+suffisam petit 1
+suffisam r ep 1
+suffisam rap 1
+suffisam rap pour 1
+suffisem 1
+suffisem fa 1
+suffisem fa avec 1
+suffit 3
+suffit a diviser 1
+suffit a prouver 1
+suffit de 3
+suffit de comparer 1
+suffit de comprendr 1
+suffit de con 1
+suffit de cr 1
+suffit de donner 1
+suffit de fair 2
+suffit de modif 1
+suffit de remplacer 1
+suffit de rendr 1
+suffit de renommer 1
+suffit de savoir 1
+suffit de sinterdir 1
+suffit deffectuer 1
+suffit deffectuer lallong 1
+suffit dimposer 1
+suffit dimposer qu 1
+suffit donc 2
+suffit donc de 2
+suffit dutiliser 1
+suffit dutiliser lexpan 1
+suffit en 1
+suffit en fait 1
+suffit pour 1
+suffit pour cel 1
+suffit pour quun 1
+suffolk 1
+sug 1
+sug er 1
+sug er de 1
+sug er ee 1
+sug er la 1
+sug er lutil 1
+sug er malencontreus 1
+sug er plut 1
+sug er toutef 1
+sug er turk 1
+suggest 55
+suggest a character 1
+suggest a further 1
+suggest a loc 1
+suggest a method 1
+suggest a modif 1
+suggest a random 1
+suggest a reflect 1
+suggest a straightfor 1
+suggest a system 1
+suggest a text 1
+suggest act 1
+suggest allow 1
+suggest an algorithm 1
+suggest an nc 1
+suggest and bug 1
+suggest and test 1
+suggest and us 2
+suggest another typ 1
+suggest ar ba 1
+suggest by hesser 1
+suggest by jain 1
+suggest by weib 1
+suggest comb 1
+suggest ext 1
+suggest for design 1
+suggest for futur 1
+suggest for improv 1
+suggest for resourc 1
+suggest futur 1
+suggest futur research 1
+suggest giv 1
+suggest guidel 2
+suggest guidel ba 2
+suggest icon 1
+suggest icon therefor 1
+suggest implem 1
+suggest import differ 1
+suggest it benefit 1
+suggest method 1
+suggest method prov 1
+suggest modif 1
+suggest on improv 1
+suggest on loc 1
+suggest or correct 1
+suggest schem 1
+suggest separ 1
+suggest separ path 1
+suggest sever techniqu 1
+suggest soft 1
+suggest soft dec 1
+suggest som direct 1
+suggest som gener 1
+suggest th latter 1
+suggest that comparison 1
+suggest that gp 1
+suggest that membership 1
+suggest that nov 1
+suggest that rt3 1
+suggest that tempor 2
+suggest that tran 1
+suggest that typ 1
+suggest thr way 1
+suggest to us 1
+suggest univer 1
+suggest univer quantif 1
+sugihar 1
+sugiyam 1
+suh 1
+suit 62
+suit a fournir 1
+suit a le 1
+suit a leur 1
+suit act 1
+suit algebr 1
+suit altern 1
+suit and 12we 1
+suit and test 1
+suit and traver 1
+suit ar enorm 1
+suit auxil 1
+suit auxil variabl 1
+suit avail 1
+suit can help 1
+suit ch 1
+suit comb 1
+suit commun 1
+suit commun schem 1
+suit compon 1
+suit compr 1
+suit contain 1
+suit contain test 1
+suit cr 1
+suit cr glob 1
+suit criter 1
+suit dat 1
+suit dat distribut 1
+suit de 3
+suit de ce 2
+suit de colmerauer 1
+suit de larticl 1
+suit de mu 1
+suit de processeur 1
+suit de transform 1
+suit de valeur 1
+suit de variabl 1
+suit dench 1
+suit dench nement 1
+suit design 3
+suit design parallel 1
+suit dim 1
+suit draft.tic 1
+suit du 2
+suit du calcl 1
+suit du chapitr 1
+suit du cod 1
+suit du program 1
+suit dun 1
+suit dun coupur 1
+suit dun instruc 1
+suit dun retour 1
+suit execut 1
+suit execut problem 1
+suit experim 1
+suit experim subject 1
+suit featur 1
+suit for appl 1
+suit for backlog 1
+suit for collabor 1
+suit for complec 1
+suit for concur 1
+suit for dat 1
+suit for design 1
+suit for distributedmemor 1
+suit for ext 1
+suit for featur 1
+suit for gi 1
+suit for hardwar 1
+suit for implem 3
+suit for log 1
+suit for me 1
+suit for model 2
+suit for part 1
+suit for reason 1
+suit for regl 1
+suit for render 1
+suit for shar 1
+suit for simd 1
+suit for softwar 1
+suit for synth 1
+suit for us 2
+suit framework 1
+suit inclus 1
+suit is concern 1
+suit is typ 1
+suit la 1
+suit la solut 1
+suit le 2
+suit le ch 1
+suit le not 1
+suit le plan 1
+suit maint 1
+suit maint problem 1
+suit manag 1
+suit may tak 1
+suit mean 1
+suit mechan 1
+suit metaphor 1
+suit modif 2
+suit nous 1
+suit nous proposon 1
+suit of algorithm 1
+suit of interrel 1
+suit of lp 1
+suit of non 1
+suit of problem 1
+suit of random 1
+suit of reus 1
+suit of tempor 1
+suit of test 2
+suit of tool 1
+suit oft contain 1
+suit organ 1
+suit organ framework 1
+suit organ requir 1
+suit output 1
+suit output repr 1
+suit parameter 1
+suit parameter modif 1
+suit popl 1
+suit popl siz 1
+suit pram 1
+suit pram algorithm 1
+suit precondit 1
+suit procedur 1
+suit procedur liter 1
+suit proper 1
+suit proper domain 1
+suit qu 1
+suit qu le 1
+suit react 1
+suit react system 1
+suit rout 1
+suit rout avail 1
+suit se 1
+suit siml 2
+suit speed 1
+suit strateg 1
+suit that execut 1
+suit ti.in 1
+suit tim 1
+suit to appl 1
+suit to handl 1
+suit to model 1
+suit to problem 1
+suit to quick 1
+suit to react 1
+suit to research 1
+suit typ 1
+suit un el 1
+suit wavel 1
+suit wavel pack 1
+suit weight 1
+suit x1 1
+suiv 5
+suiv a de 1
+suiv acc 1
+suiv acc edant 1
+suiv au 1
+suiv au retour 1
+suiv ce 1
+suiv ce acc 1
+suiv chaqu 1
+suiv chaqu ac 1
+suiv cl 1
+suiv cl es 1
+suiv com 1
+suiv com traiter 1
+suiv con 3
+suiv consister 1
+suiv dan 1
+suiv dan le 1
+suiv de 2
+suiv de fonct 1
+suiv de la 2
+suiv de propr 1
+suiv don 1
+suiv don la 1
+suiv dun 1
+suiv dun claus 1
+suiv dun coupur 1
+suiv dun echec 1
+suiv dun instruc 1
+suiv empil 1
+suiv empil un 1
+suiv en 2
+suiv en fonct 1
+suiv est 3
+suiv est de 1
+suiv est la 2
+suiv est xp 1
+suiv habituel 1
+suiv illustr 1
+suiv illustr ee 1
+suiv illustr lappl 1
+suiv ilp94 1
+suiv la 3
+suiv la mach 1
+suiv la posit 1
+suiv la prem 1
+suiv la terminolog 1
+suiv la topolog 1
+suiv la valeur 1
+suiv lac 1
+suiv lac de 1
+suiv laquel 1
+suiv laquel le 1
+suiv le 4
+suiv le ac 1
+suiv le acc 1
+suiv le avant 1
+suiv le besoin 1
+suiv le context 1
+suiv le cou 1
+suiv le direct 1
+suiv le ind 1
+suiv le lign 1
+suiv le mod 2
+suiv le nombr 1
+suiv le not 1
+suiv le point 1
+suiv le princip 1
+suiv le sen 1
+suiv le typ 2
+suiv leur 1
+suiv leur propr 1
+suiv lient 1
+suiv lient la 1
+suiv lind 1
+suiv lind ij 1
+suiv linstruc 1
+suiv linstruc trust 1
+suiv lop 1
+suiv lop erat 1
+suiv lorgan 1
+suiv lorgan physiqu 1
+suiv lun 1
+suiv lun de 1
+suiv montr 1
+suiv montr quel 1
+suiv ou 1
+suiv ou ver 1
+suiv p direct 1
+suiv pa 1
+suiv pa en 1
+suiv pa notr 1
+suiv par 3
+suiv par la 1
+suiv par lop 1
+suiv peuv 1
+suiv peuv etr 1
+suiv pour 2
+suiv pour atteindr 1
+suiv pour linst 1
+suiv pr 1
+suiv pr esent 1
+suiv qu 1
+suiv qu le 1
+suiv quel 1
+suiv quel est 1
+suiv quel rep 1
+suiv rest 1
+suiv rest valabl 1
+suiv se 1
+suiv se feront 1
+suiv ser 1
+suiv soient 1
+suiv sont 1
+suiv sont equiv 1
+suiv sont util 1
+suiv un 1
+suiv un born 1
+suiv un coeff 1
+suiv xe 1
+suiv xe xr 1
+suivon 1
+suivon la 1
+suivr 2
+suivr au 1
+suivr au ca 1
+suivr ce 1
+suivr ce vo 1
+suivr la 1
+suivr la ch 1
+suivr le 1
+suivr le ch 1
+suivr leur 1
+suivr leur ordonnanc 1
+suivr plus ai 1
+suivr pour 1
+suivr pour con 1
+suivront 1
+suivront nous 1
+suivront nous emploieron 1
+suj 3
+suj a de 1
+suj a lir 1
+suj du 1
+suj du taux 1
+suj m ethod 1
+suj n etait 1
+suj na 1
+suj na gu 1
+suj principaux 1
+suj principaux sont 1
+suj quel 1
+suj quel con 1
+sukavir 2
+sukavir and fol 1
+sukavir and luc 1
+sukavir and moran 1
+sullivan 2
+sullivan and john 1
+sullivan knight 1
+sullivan virgin.edu 1
+sult 2
+sult de 1
+sult de ce 1
+sultat 1
+sultat algorithmiqu 1
+sultat algorithmiqu implantabl 1
+sultat de 1
+sultat de ce 1
+sultat obtenu 1
+sultat qu 1
+sultat qu nous 1
+sultat rest 1
+sultat rest coh 1
+sultat sous 1
+sultat sous form 1
+sultat th 1
+sultat th oriqu 1
+sum 76
+sum and boolean 1
+sum and compl 1
+sum and conclus 2
+sum and differ 1
+sum and disc 1
+sum and futur 1
+sum and random 1
+sum ar perform 1
+sum as follow 4
+sum conclus 1
+sum definit 1
+sum definit guar 1
+sum each interview 1
+sum entail 1
+sum entail ext 1
+sum f1 1
+sum f1 f2 1
+sum for enumer 1
+sum giv 1
+sum giv ri 1
+sum in fig 1
+sum in figur 2
+sum in tabl 2
+sum in theorem 1
+sum input 1
+sum int ps 1
+sum is conver 1
+sum it adjustm 1
+sum mar 1
+sum me 1
+sum method 1
+sum method gener 1
+sum occur 1
+sum of antimatr 1
+sum of boolean 1
+sum of comput 1
+sum of eight 1
+sum of empir 1
+sum of extern 1
+sum of indep 1
+sum of inherit 1
+sum of occur 1
+sum of produc 1
+sum of reg 1
+sum of result 1
+sum of sequ 1
+sum of soft 1
+sum of squar 1
+sum of tail 1
+sum of vect 1
+sum of weight 1
+sum or fus 1
+sum our siml 1
+sum over level 1
+sum over logn 1
+sum propag 1
+sum reg 1
+sum reg follow 1
+sum request 1
+sum result 2
+sum rl 1
+sum row 1
+sum row output 1
+sum squar 2
+sum squar error 1
+sum squar pattern 1
+sum tabl 1
+sum task 1
+sum th inform 1
+sum th lat 1
+sum th major 1
+sum th modl 1
+sum th pract 1
+sum th result 2
+sum th sal 1
+sum to impl 1
+sum tot 2
+sum ts 1
+sum ts const 1
+sum ver 1
+sumer 1
+sumer le 1
+summand 1
+summar 4
+summar in tabl 1
+summar th result 1
+summar th rol 1
+summariz 19
+summariz our appl 1
+summariz our conclus 1
+summariz our find 1
+summariz our result 1
+summariz our work 1
+summariz th act 1
+summariz th disc 1
+summariz th featur 1
+summariz th main 1
+summariz th object 1
+summariz th paper 2
+summariz th possibil 1
+summariz th principl 1
+summariz th result 2
+summariz th var 1
+summariz tw way 1
+summer 8
+summer fal 1
+summer institut 1
+summer internship 1
+summerhil 1
+summerhil put 1
+summerhil93 1
+sumon 1
+sumon le 1
+sumon le principaux 1
+sumsquar 1
+sumsquar error 1
+sun 20
+sun and year 1
+sun at st 3
+sun equiv 1
+sun microsystem 6
+sun microsystem inc 2
+sun microsystem sparcst 1
+sun oper 1
+sun oper system 1
+sun os 1
+sun ra 1
+sun ra prov 1
+sun ra system 1
+sun ra us 1
+sun ra1 1
+sun sparc 5
+sun sparc stat 1
+sun sparc workst 1
+sun sparcst 5
+sun sparcst 330gx 1
+sun sparcst ii 1
+sun spot 1
+sun spot dat 1
+sun ss10 1
+sun ultr 1
+sun ultraenterpr 1
+sun ultrasparc 1
+sun workst 1
+sun.com 1
+sun1 1
+sun1 hwsw.ged.de 1
+sun10 1
+sun97 1
+sunderam 1
+sunm 1
+sunnyv 1
+sunnyv ca 1
+sunspot 1
+sunspot and exchang 1
+sunspot ar dark 1
+sunspot aver 1
+sunspot aver year 1
+sunspot dat 1
+sunt 1
+sunt multiplicand 1
+sunt multiplicand praeter 1
+suoec 1
+suoec number 1
+suoesam 1
+suoesam fa 1
+sup 61
+sup a confid 1
+sup a nod 1
+sup a se 2
+sup a self 1
+sup a1 1
+sup a1 requir 1
+sup ain 1
+sup ain quil 1
+sup any explicit 1
+sup as input 1
+sup b2 1
+sup b2 const2 1
+sup compl 1
+sup compon 1
+sup compon r1 1
+sup dan 1
+sup dan la 1
+sup de 1
+sup demand 2
+sup dep 1
+sup donc 2
+sup donc quil 1
+sup e ic 1
+sup e qu 1
+sup ee 3
+sup ee car 1
+sup ee cr 1
+sup ee etr 1
+sup erieur 5
+sup erieur alor 1
+sup erieur apr 1
+sup erieur au 1
+sup erieur com 1
+sup erieur de 2
+sup erieur don 1
+sup erieur du 1
+sup erieur en 2
+sup erieur ou 1
+sup erieur peuv 1
+sup erieur pour 1
+sup erieur pren 1
+sup eriorit 1
+sup es 2
+sup es avoir 1
+sup es compl 1
+sup for contradict 1
+sup g0 1
+sup i demarc 1
+sup induc 1
+sup inform 1
+sup jej 1
+sup lec 1
+sup lec dun 1
+sup of integer 1
+sup of pack 1
+sup our targ 1
+sup p contain 1
+sup p dat 1
+sup p1 2
+sup pi 1
+sup pour 2
+sup pour le 1
+sup pour un 1
+sup proc 1
+sup proc p1 1
+sup qu 3
+sup qu ce 1
+sup qu la 2
+sup qu largum 1
+sup qu le 3
+sup qu tous 1
+sup quil 1
+sup quil ny 1
+sup realm 1
+sup rieur 1
+sup rieur de 1
+sup selecttest 1
+sup sid 2
+sup ss 1
+sup ss2 1
+sup stat 1
+sup stat s1 1
+sup stat s6 1
+sup t1 1
+sup test 1
+sup test suit 1
+sup th fin 1
+sup th funct 1
+sup th path 1
+sup th privileg 1
+sup th sort 1
+sup th theorem 1
+sup th variabl 1
+sup that ca 1
+sup that e1 1
+sup that ffx 1
+sup that forml 1
+sup that frank 1
+sup that fu0 1
+sup that graph 1
+sup that proc 1
+sup that ti 1
+sup to belong 1
+sup to captur 1
+sup to know 1
+sup to preserv 1
+sup to prov 1
+sup to specif 1
+sup to tak 1
+sup to us 1
+sup tw disjoint 1
+sup un 2
+sup un algorithm 1
+sup un appel 1
+sup un distribut 1
+sup un repr 1
+sup v0 1
+sup we ad 1
+sup we chang 1
+sup we regard 1
+sup we replac 1
+sup we want 2
+sup we wish 1
+super 20
+super exponentiel 1
+super exponentiel dan 1
+super individu 1
+super lin 2
+super of an 1
+super ordinateur 1
+super ordinateur mimd 1
+super our prev 1
+super quadr 1
+super quadr etc 1
+super se 1
+super structur 1
+super structur requir 1
+super th peripher 2
+super without introduc 1
+superag 1
+superag to imp 1
+supercl 5
+supercl al hold 1
+supercl and addit 1
+supercl and return 1
+supercl bound 1
+supercl bound stack 1
+supercl but indefinit 1
+supercl by cal 1
+supercl direct 1
+supercl direct slot 1
+supercl is check 1
+supercl is tak 1
+supercl mailq 1
+supercl nam 1
+supercl nam init 1
+supercl of cl 1
+supercl of cl1 1
+supercl of cl2 1
+supercl of structur 1
+supercl p check 1
+supercl p cl 1
+supercl stack 1
+supercl wer contain 1
+supercluster 1
+supercompiler 2
+supercompiler for parallel 1
+supercompiler for supercomputer 1
+supercomput 14
+supercomput center 1
+supercomput perform 1
+supercomput perform evalu 1
+supercomput research 1
+supercomput system 2
+supercomput system div 1
+supercomputer 8
+supercomputer institut 1
+supercomputer is giv 1
+supercomputer model 1
+supercomputer model gs1000 1
+supercomputer perform 1
+supercomputer system 1
+supercomputer system div 1
+superf 1
+superf simil 1
+superficiel 1
+superficiel a ce 1
+superficiel a faux 1
+superficiel a vr 1
+superficiel au 1
+superficiel au point 1
+superficiel aux 1
+superficiel aux gard 1
+superficiel avec 1
+superficiel avec coupur 1
+superficiel avec cr 1
+superficiel bp 1
+superficiel claus 1
+superficiel claus dar 1
+superficiel com 1
+superficiel com un 1
+superficiel correspon 1
+superficiel d efinit 1
+superficiel dan 1
+superficiel dan la 1
+superficiel dan le 1
+superficiel dan tout 1
+superficiel de 1
+superficiel de la 1
+superficiel devrait 1
+superficiel devrait con 1
+superficiel dun 1
+superficiel dun instruc 1
+superficiel entr 1
+superficiel est 1
+superficiel est equiv 1
+superficiel est marqu 1
+superficiel est mi 1
+superficiel et acc 1
+superficiel et dacc 1
+superficiel et en 1
+superficiel et la 1
+superficiel et le 1
+superficiel et lectur 1
+superficiel et point 1
+superficiel et profon 1
+superficiel et trust 1
+superficiel fail 1
+superficiel fail shallow 1
+superficiel faux 1
+superficiel indiqu 1
+superficiel influ 1
+superficiel instruc 1
+superficiel lim 1
+superficiel ma 1
+superficiel ma ne 1
+superficiel ne 1
+superficiel ne demand 1
+superficiel ne modif 1
+superficiel ne peut 1
+superficiel nec 1
+superficiel nec ecut 1
+superficiel observ 1
+superficiel ou 1
+superficiel ou calculer 1
+superficiel ou de 1
+superficiel ou pa 1
+superficiel ou profon 1
+superficiel p bp 1
+superficiel point 1
+superficiel point de 1
+superficiel program 1
+superficiel program nb 1
+superficiel r esult 1
+superficiel requ 1
+superficiel requ la 1
+superficiel retr 1
+superficiel se 1
+superficiel se trouv 1
+superficiel trust 1
+superficiel vaut 1
+superficiel vaut faux 1
+superficiel vaut vr 1
+superficiel vr 1
+superficiel vr point 1
+superflu 2
+superflu appl 1
+supergener 1
+supergener funct 1
+supergraph 2
+supergraph after finish 1
+supergraph be ni 1
+supergraph ha siz 1
+supergraph hav ni 1
+superimp 3
+superimp an edg 1
+superimp edg 1
+superindividu 1
+superior 12
+superior and junior 1
+superior becom 1
+superior direct 1
+superior of centr 1
+superior of gp 1
+superior of heur 1
+superior of wgp 1
+superior perform 4
+superior qu 1
+superior rol 1
+superior se 1
+superior se funct 1
+superior to allow 1
+superior to network 1
+superior to optim 1
+superlin 2
+superlin converg 1
+superlin converg zer 1
+superlin eair 1
+supermethod 1
+supernod 5
+supernod connect 2
+supernod mean 1
+supernod partit 1
+supernod siz 1
+supernod than finiteel 1
+superobject 1
+superobject and cal 1
+superobject explicit 1
+superp 2
+superp act 1
+superp act t2 1
+superp program 1
+superp t2 1
+superp t2 act 1
+superp th refin 1
+superpipelin 1
+superpipelin mach 1
+superposit 1
+supersc 2
+supersc and superpipelin 1
+supersc could schedl 1
+supersc mach 1
+supersc mach impl 1
+supersc model 1
+supersc proc 1
+supersc supersc 1
+supersc ye 1
+superscript 2
+supertyp 3
+supertyp implem 1
+supertyp s interfac 1
+superv 8
+superv account 1
+superv account clerk 1
+superv and unsuperv 1
+superv control 1
+superv control system 1
+superv ee 1
+superv ee par 1
+superv learn 3
+superv learn algorithm 1
+superv learn problem 1
+superv neil 1
+superv neil jon 1
+superv receipt 1
+superv receipt clerk 1
+superv rol 1
+superv to po 1
+superver 1
+superver after finish 1
+superver in g1 1
+superver is d0 1
+superver is select 1
+superver of cur 1
+superver serv 1
+supnod 1
+supnod siz 1
+suppl 14
+suppl argum 1
+suppl argum tak 1
+suppl as argum 1
+suppl as parameter 1
+suppl email 1
+suppl ementair 2
+suppl ementair de 2
+suppl ementair doit 1
+suppl ementair don 1
+suppl ementair du 1
+suppl ementair dus 1
+suppl ementair en 1
+suppl ementair engendr 1
+suppl ementair est 2
+suppl ementair lor 1
+suppl ementair nest 2
+suppl ementair peut 1
+suppl ementair peuv 1
+suppl ementair qu 1
+suppl ementair sur 2
+suppl ementair vient 1
+suppl implem 1
+suppl initarg 1
+suppl mentair 1
+suppl numer 1
+suppl numer dat 1
+suppl parameter 1
+suppl quest 1
+suppl targ 1
+suppl targ ent 1
+suppl tool 1
+supplem 3
+supplem as describ 1
+supplem part 1
+support 98
+support 1xn 1
+support 1xn multicast 1
+support a 1xn 1
+support a broad 1
+support a compar 1
+support a conjectur 1
+support a glob 1
+support a hom 1
+support a loc 1
+support a maxim 1
+support a minim 1
+support a not 1
+support a record 1
+support a siml 1
+support a smooth 1
+support a spmd 1
+support a styl 1
+support a suit 1
+support a techniqu 1
+support a tot 1
+support a wid 1
+support acc 1
+support ad 1
+support ad equat 1
+support al form 2
+support an ef 1
+support an implem 1
+support an innov 1
+support and coordin 1
+support and dat 1
+support and encour 1
+support and using 1
+support any connect 1
+support appl 1
+support argum 1
+support argum parallel 1
+support ask 1
+support atom 2
+support atom read 1
+support attribut 1
+support attribut timestamp 1
+support autom 1
+support autom sc 1
+support ba 1
+support ba loop 1
+support bar arrang 1
+support block 1
+support block permut 1
+support both asynchron 1
+support both intraprocedur 1
+support both lan 1
+support both parameter 1
+support both propag 1
+support both sequ 1
+support both tupl 1
+support broadcast 1
+support by adeg 1
+support by architectur 1
+support by austr 1
+support by bl 1
+support by channel 1
+support by def 1
+support by esprit 1
+support by ibm 1
+support by increm 1
+support by ist 1
+support by lit 1
+support by minister 1
+support by na 1
+support by nsf 3
+support by simpl 1
+support by structur 1
+support by un 1
+support by visu 1
+support by wareh 1
+support cad 1
+support cad appl 1
+support can indeed 1
+support center 1
+support chang 2
+support chang kind 1
+support channel 2
+support channel width 2
+support cod 1
+support cod reus 1
+support collabor 2
+support collabor group 1
+support collabor noncomputer 1
+support collabor work 2
+support complec 1
+support complec sent 1
+support compon 1
+support compon encapsl 1
+support concur 1
+support concur acc 1
+support cont 2
+support cont ba 1
+support cont navig 1
+support contact 1
+support context 1
+support context parallel 1
+support cooper 1
+support cooper work 1
+support cruc 1
+support cruc featur 1
+support dat 3
+support dat abstract 2
+support de 2
+support de retour 1
+support debug 1
+support del 2
+support deliv 1
+support dexp 1
+support dexp erim 1
+support differ design 1
+support differ typ 1
+support direct 1
+support direct implem 1
+support du 1
+support du retour 1
+support dur 1
+support dur ce 1
+support dynam 1
+support dynam topolog 1
+support dynam var 1
+support eager 1
+support eager increm 1
+support eff 4
+support eff execut 1
+support eff hardwar 1
+support eff inv 1
+support effect 1
+support efficac 1
+support efficac du 1
+support encapsl 1
+support eulisp 1
+support evid 1
+support evolut 1
+support experim 1
+support experim manag 1
+support explicit 1
+support explicit invoc 1
+support ext 2
+support ext parallel 1
+support ext transact 1
+support fic 1
+support fic siz 1
+support fin 2
+support fin granl 2
+support for ad 1
+support for an 1
+support for compon 1
+support for concur 1
+support for derefer 1
+support for developer 1
+support for distribut 1
+support for dynam 2
+support for explicit 1
+support for fd 1
+support for genvoc 1
+support for inf 1
+support for intern 1
+support for loc 1
+support for log 1
+support for maintain 1
+support for me 2
+support for method 1
+support for multicast 1
+support for object 2
+support for perform 1
+support for performac 1
+support for program 7
+support for prolog 1
+support for reason 1
+support for refin 1
+support for runtim 1
+support for shar 2
+support for stack 1
+support for us 1
+support form 1
+support fram 1
+support from day 1
+support garb 1
+support garb collect 1
+support gener 1
+support gener cl 1
+support giv 1
+support group 1
+support group work 1
+support gt 1
+support hierarch 1
+support hierarch brow 1
+support high 2
+support high aggreg 1
+support high avail 1
+support high bandwidth 1
+support high order 1
+support imag 1
+support imag acc 1
+support implem 1
+support implem hierarch 1
+support implicit 1
+support implicit invoc 1
+support in inspect 1
+support in part 22
+support in prolog 1
+support in schem 1
+support in shar 1
+support increm 1
+support increm spec 1
+support inherit 1
+support init 1
+support integr 1
+support intern 1
+support intern concur 1
+support interoper 1
+support interrupt 1
+support introspect 1
+support introspect reason 1
+support inver 1
+support is compl 1
+support is nec 1
+support it loc 1
+support it non 1
+support krom 1
+support krom subsum 1
+support larg scal 1
+support larger 3
+support larger cluster 2
+support larger number 3
+support larger system 1
+support learn 1
+support libr 2
+support loc 1
+support loc slot 1
+support log 1
+support log log 1
+support look 1
+support low 1
+support low specif 1
+support map 1
+support mat 1
+support mat eriel 1
+support may simp 1
+support me 1
+support me level 1
+support mechan 1
+support mor gener 1
+support mor proc 1
+support mov 1
+support mult 1
+support mult cast 1
+support multidest 1
+support multidest me 1
+support multidest worm 1
+support multipl 4
+support multipl addr 1
+support multipl interfac 1
+support multipl ip 1
+support multipl level 1
+support multipl repr 1
+support neither inclus 1
+support nest 2
+support nest parallel 1
+support nest procedur 1
+support non 1
+support non hom 1
+support nonblock 1
+support nxn 1
+support nxn group 1
+support nxn multicast 1
+support of evolut 1
+support of inr 1
+support of matr 1
+support of parallel 1
+support of restrict 1
+support of shallow 1
+support ol 1
+support ol autom 1
+support onl bar 1
+support onl fic 1
+support onl introspect 1
+support onl unicast 1
+support oper 1
+support oper log 1
+support other aspect 1
+support our claim 1
+support our conjectur 1
+support our integr 1
+support parallel 1
+support parallel explicit 1
+support parameter 1
+support per proc 1
+support placeholder 1
+support pointer 1
+support pour 1
+support pour le 1
+support program 1
+support proxim 1
+support proxim quer 1
+support qu 1
+support quantit 1
+support quantit dat 1
+support re us 1
+support record 1
+support red 1
+support refin 1
+support regr 1
+support regr test 1
+support rel 1
+support rel bar 1
+support remot 1
+support remot sharedworkspac 1
+support repr 1
+support retrief 1
+support reus 1
+support run 1
+support run tim 1
+support sag 1
+support se 1
+support se valu 1
+support search 1
+support select 1
+support select writ 1
+support serv 1
+support sever kind 1
+support shar 2
+support shar memor 1
+support shar workspac 1
+support sharedworkspac 1
+support sharedworkspac collabor 1
+support singl 1
+support singl inherit 1
+support softwar 1
+support softwar gener 1
+support som hypoth 1
+support som sort 1
+support specif 2
+support specif conclus 1
+support st 1
+support st mach 1
+support standard 1
+support standard du 1
+support stat 1
+support stat topolog 1
+support stud 1
+support stud debug 1
+support sub 1
+support subprogram 1
+support subprogram pointer 1
+support sum 1
+support symbol 1
+support symbol debug 1
+support synchron 1
+support system 4
+support system design 1
+support system evolut 1
+support tag 1
+support tag dat 1
+support task 1
+support task orient 1
+support technolog 1
+support telephon 1
+support telephon network 1
+support templ 1
+support textur 1
+support textur ba 1
+support th abstract 1
+support th acc 1
+support th approach 1
+support th architectur 1
+support th asser 1
+support th bandwidth 2
+support th channel 2
+support th claim 1
+support th clear 1
+support th cogit 1
+support th construc 2
+support th continu 1
+support th cycl 1
+support th definit 1
+support th demeter 1
+support th design 1
+support th developm 1
+support th discipl 1
+support th dynam 1
+support th eulisp 1
+support th exclus 1
+support th expr 1
+support th featur 1
+support th form 1
+support th genvoc 1
+support th gi 1
+support th help 1
+support th hypoth 1
+support th implicit 1
+support th infer 1
+support th intern 1
+support th intuit 2
+support th largest 1
+support th laser 1
+support th maxim 1
+support th me 1
+support th memor 1
+support th method 1
+support th minim 1
+support th model 1
+support th mov 1
+support th network 1
+support th non 2
+support th oper 1
+support th pipel 1
+support th point 1
+support th prolog 1
+support th reason 1
+support th requir 1
+support th spec 1
+support th spmd 1
+support th stud 1
+support th tim 1
+support th trac 1
+support th traff 1
+support th us 1
+support th virtu 1
+support th wor 1
+support thr form 1
+support through metacl 1
+support through remot 1
+support tn 1
+support tn nonblock 1
+support to compon 1
+support to cr 1
+support to identif 1
+support to impl 1
+support to improv 1
+support to integr 1
+support to maintain 2
+support tool 2
+support tool using 1
+support tot 1
+support tr 1
+support transact 1
+support transact tim 1
+support transform 1
+support tru 1
+support tru synchron 1
+support tupl 1
+support tupl timestamp 1
+support tw 1
+support tw oper 1
+support tw person 1
+support typ 2
+support typ hierarch 1
+support typ test 1
+support und 1
+support under ts 1
+support unicast 1
+support unicast me 1
+support unif 1
+support user 1
+support var 1
+support var pack 1
+support vi method 1
+support wavel 1
+support wider 1
+support wider channel 1
+support without degrad 1
+support without lo 1
+support work 2
+support work involut 1
+supposer 3
+supposer dan 1
+supposer dan tout 1
+supposer donc 1
+supposer donc qu 1
+supposer me 1
+supposer qu 2
+supposer qu la 1
+supposer qu le 1
+supposeron 2
+supposeron aus 1
+supposeron aus qu 1
+supposeron dan 1
+supposeron dan la 1
+supposeron dan tout 1
+supposeron qu 2
+supposeron qu la 1
+supposeron qu lenviron 1
+supposeron qu tous 1
+supposeront 1
+supposeront un 1
+supposeront un cr 1
+supposez 1
+supposit 1
+supposit r esult 1
+supposon 4
+supposon en 1
+supposon en outr 1
+supposon la 1
+supposon la don 1
+supposon maint 1
+supposon maint qu 1
+supposon par 1
+supposon par exempl 1
+supposon qu 2
+supposon qu deux 1
+supposon qu la 1
+supposon qu le 2
+supposon qu lon 2
+supposon quaucun 1
+supposon quaucun point 1
+supposon quon 1
+supposon quon cherch 1
+supposon quun 1
+supposon quun nouveau 1
+supposon quun op 1
+supposon quunif 1
+supposon savoir 1
+supposon toujour 1
+supposon toujour quil 1
+suppr 5
+suppr and sign 1
+suppr de 1
+suppr de variabl 1
+suppr du 1
+suppr du point 1
+suppr nest 1
+suppr nest toutef 1
+suppr no 1
+suppr no induc 1
+suppr th extr 1
+suppr th oscil 1
+suppr th parameter 1
+suppr th reconstruc 1
+suppr.5 1
+supprim 2
+supprim ee 1
+supprim ee au 1
+supprim es 1
+supprim es du 1
+supprim la 2
+supprim la part 1
+supprim la rel 1
+supprim le 1
+supprim le instruc 1
+supprim le point 1
+supprim tout 1
+supprimer 1
+supprimer certain 1
+supprimer certain cop 1
+supprimer de 1
+supprimer de claus 1
+supprimer de op 1
+supprimer de point 1
+supprimer la 1
+supprimer la gest 1
+supprimer le 1
+supprimer le appel 1
+supprimer le probl 1
+supprimer sur 1
+supprimer sur le 1
+supprimer un ensembl 1
+supprimer12 1
+sur 15
+sur a en 1
+sur ce 3
+sur ce acc 1
+sur ce appel 1
+sur ce aspect 1
+sur ce ba 1
+sur ce cel 1
+sur ce claus 1
+sur ce concept 1
+sur ce cop 1
+sur ce courb 1
+sur ce dern 1
+sur ce deux 1
+sur ce espac 1
+sur ce exempl 1
+sur ce mach 1
+sur ce modif 1
+sur ce pag 1
+sur ce point 1
+sur ce program 1
+sur ce quil 1
+sur ce syst 1
+sur ce var 1
+sur cel 1
+sur cel ci 1
+sur certain 1
+sur certain ac 1
+sur chacun 1
+sur chacun de 1
+sur chaqu 2
+sur chaqu ac 1
+sur chaqu pil 1
+sur chaqu processeur 1
+sur chaqu program 1
+sur dautr 1
+sur dautr propr 1
+sur de 5
+sur de ba 1
+sur de boucl 1
+sur de cel 1
+sur de chromosom 1
+sur de conflit 1
+sur de cop 1
+sur de coupl 2
+sur de don 3
+sur de ex 1
+sur de exempl 1
+sur de fant 1
+sur de flot 1
+sur de fonct 1
+sur de inform 1
+sur de lim 1
+sur de ma 1
+sur de mach 2
+sur de point 1
+sur de primitiv 1
+sur de princip 1
+sur de processeur 1
+sur de program 1
+sur de syst 2
+sur de tableaux 1
+sur de toujour 1
+sur de valeur 2
+sur deux 2
+sur deux argum 1
+sur deux pag 1
+sur deux pil 1
+sur deux processeur 1
+sur di 1
+sur di rent 1
+sur diff 1
+sur diff erent 1
+sur domain 1
+sur domain fin 1
+sur ecritur 1
+sur ecritur sappu 1
+sur el 1
+sur fortran 1
+sur ik 1
+sur j ne 1
+sur k le 1
+sur kcm 1
+sur koan 1
+sur l ag 1
+sur l echantillon 1
+sur l ecritur 1
+sur l etiqu 1
+sur l etud 1
+sur l evolut 1
+sur la 6
+sur la boucl 1
+sur la capacit 1
+sur la cel 1
+sur la collabor 1
+sur la complexit 1
+sur la composit 1
+sur la consom 1
+sur la dern 1
+sur la diagon 1
+sur la direct 1
+sur la disc 1
+sur la dur 1
+sur la figur 1
+sur la gest 1
+sur la localit 1
+sur la longueur 1
+sur la mach 2
+sur la matr 1
+sur la mi 1
+sur la minim 1
+sur la moy 1
+sur la mvp 1
+sur la natur 2
+sur la not 1
+sur la nouvel 1
+sur la pag 1
+sur la par 1
+sur la percept 1
+sur la perform 1
+sur la pil 1
+sur la prem 1
+sur la prim 1
+sur la prochain 1
+sur la profondeur 1
+sur la program 1
+sur la queu 1
+sur la recherch 1
+sur la repr 1
+sur la sous 1
+sur la structur 1
+sur la substitut 1
+sur la tabl 1
+sur la tail 2
+sur la techniqu 1
+sur la th 1
+sur la tr 1
+sur la transform 2
+sur la transit 1
+sur la var 2
+sur la ver 1
+sur la vit 1
+sur la wam 1
+sur lac 1
+sur lac de 1
+sur lacc 1
+sur lacc es 1
+sur ladapt 1
+sur ladapt de 1
+sur laffect 1
+sur laffect destruc 1
+sur lalg 1
+sur lalg br 1
+sur lalgorithm 1
+sur lalgorithm de 1
+sur lalgorithm du 1
+sur lallur 1
+sur lallur de 1
+sur lalphab 1
+sur lalphab binair 1
+sur lampleur 1
+sur lampleur dun 1
+sur lan 1
+sur lan de 1
+sur lappel 1
+sur lappel du 1
+sur laquel 3
+sur laquel agit 1
+sur laquel est 1
+sur laquel il 1
+sur laquel rep 1
+sur laquel reposeront 1
+sur larchitectur 1
+sur larit 1
+sur laut 1
+sur laut stabil 1
+sur le 6
+sur le ac 1
+sur le acc 2
+sur le ag 1
+sur le algorithm 1
+sur le appar 1
+sur le appl 1
+sur le aspect 1
+sur le atom 1
+sur le autr 1
+sur le ba 1
+sur le barycentr 1
+sur le bbn 1
+sur le born 1
+sur le ca 1
+sur le cach 1
+sur le cardin 1
+sur le champ 1
+sur le co 2
+sur le cod 2
+sur le comport 3
+sur le congru 1
+sur le cop 1
+sur le coupl 1
+sur le cub 1
+sur le dern 1
+sur le deux 1
+sur le diff 1
+sur le dnt 1
+sur le domain 1
+sur le don 1
+sur le ecritur 1
+sur le fait 1
+sur le faux 1
+sur le figur 1
+sur le fon 1
+sur le foncteur 1
+sur le grad 1
+sur le graph 1
+sur le ind 3
+sur le lang 1
+sur le lieu 1
+sur le lign 1
+sur le mach 1
+sur le marg 1
+sur le mi 1
+sur le mod 1
+sur le modif 1
+sur le mvp 1
+sur le nid 1
+sur le nom 1
+sur le nombr 2
+sur le nombreus 1
+sur le nouvel 1
+sur le op 1
+sur le pa 1
+sur le pag 1
+sur le par 1
+sur le param 1
+sur le partit 1
+sur le patron 1
+sur le perform 1
+sur le ph 1
+sur le pil 1
+sur le plan 1
+sur le point 3
+sur le pol 1
+sur le ppcm 1
+sur le pr 1
+sur le prem 2
+sur le primitiv 2
+sur le probl 1
+sur le processeur 1
+sur le program 1
+sur le rec 1
+sur le register 1
+sur le rep 1
+sur le rest 1
+sur le sch 1
+sur le segm 1
+sur le sit 1
+sur le som 1
+sur le sous 1
+sur le sousespac 1
+sur le syst 3
+sur le tableau 1
+sur le tableaux 1
+sur le techniqu 1
+sur le temp 1
+sur le test 1
+sur le tournur 1
+sur le trait 1
+sur le trajectoir 1
+sur le transform 1
+sur le transit 1
+sur le valeur 1
+sur le var 1
+sur le variabl 2
+sur le web 1
+sur leff 1
+sur leff de 1
+sur lefficacit 1
+sur lensembl 3
+sur lensembl de 3
+sur lenviron 1
+sur lenviron cour 1
+sur lequel 4
+sur lequel agit 1
+sur lequel le 1
+sur lequel prolog 1
+sur lequel se 1
+sur lesp 1
+sur lesp ranc 1
+sur lespac 3
+sur lespac de 3
+sur lesquel 3
+sur lesquel il 1
+sur lesquel le 1
+sur lesquel nous 1
+sur lesquel ont 1
+sur lestim 1
+sur lestim de 1
+sur leur 2
+sur leur approch 1
+sur leur direct 1
+sur lexempl 2
+sur lexempl de 2
+sur lexempl du 1
+sur lexempl pr 1
+sur lexempl suiv 1
+sur lexp 1
+sur lexp erim 1
+sur lexploit 1
+sur lexploit dun 1
+sur lhypercub 1
+sur lhypercub ipsc 1
+sur li 2
+sur li ee 2
+sur limpact 1
+sur limpact de 1
+sur limpl 1
+sur limpl em 1
+sur limport 2
+sur limport de 2
+sur lindividu 1
+sur linstanc 1
+sur linstanc de 1
+sur linstruc 1
+sur linstruc suiv 1
+sur linterv 1
+sur lintroduc 1
+sur lintroduc dun 1
+sur lipsc 1
+sur lobserv 2
+sur lobserv qu 2
+sur loptim 1
+sur loptim de 1
+sur lu 1
+sur lutil 3
+sur lutil de 3
+sur lutil dun 1
+sur m 2z 1
+sur mach 1
+sur mach monoprocesseur 1
+sur mach par 1
+sur oper 1
+sur plusieur 1
+sur plusieur individus 1
+sur prolog 1
+sur prolog est 1
+sur quatr 1
+sur quatr variabl 1
+sur quel 1
+sur quel variabl 1
+sur sa 1
+sur sa form 1
+sur se 1
+sur se lac 1
+sur si 1
+sur sic program 1
+sur son 1
+sur son imag 1
+sur stop 1
+sur stop work 1
+sur tail 1
+sur tail mac 1
+sur tn 1
+sur tn peut 1
+sur tous 3
+sur tous le 3
+sur tout 2
+sur tout le 2
+sur tr 2
+sur tr appl 1
+sur un 5
+sur un analog 1
+sur un appl 1
+sur un architectur 2
+sur un argum 1
+sur un aut 1
+sur un born 1
+sur un cel 1
+sur un classif 1
+sur un courb 1
+sur un cub 1
+sur un de 1
+sur un descript 1
+sur un deux 1
+sur un don 1
+sur un drapeau 1
+sur un dur 1
+sur un ensembl 1
+sur un espac 1
+sur un etat 1
+sur un exempl 2
+sur un ext 1
+sur un fonct 1
+sur un gril 1
+sur un group 2
+sur un hypercub 1
+sur un instruc 1
+sur un ipsc 1
+sur un mach 2
+sur un matr 1
+sur un mesur 1
+sur un mod 1
+sur un modif 1
+sur un mvp 1
+sur un nid 1
+sur un ordinateur 1
+sur un pag 1
+sur un par 1
+sur un petit 1
+sur un popl 1
+sur un processeur 1
+sur un protocol 1
+sur un raffin 1
+sur un repr 1
+sur un simulateur 1
+sur un sous 1
+sur un suj 1
+sur un tableau 1
+sur un th 1
+sur un transform 1
+sur un var 1
+sur un vecteur 1
+sur un zon 1
+sur usenet 1
+sur usenet dan 1
+sur v ect 1
+sur xi 1
+sur xi de 1
+sur zn 1
+surc 4
+surc ut 4
+surc ut aux 1
+surc ut dan 1
+surc ut de 3
+surc ut dus 1
+surc ut ec 1
+surc ut entrain 1
+surc ut est 1
+surc ut li 1
+surc ut nest 1
+surc ut potentiel 1
+surc ut suppl 1
+surestimer 1
+surestimer leff 1
+surestimer leff de 1
+surf 1
+surfac 17
+surfac algorithm 1
+surfac align 1
+surfac and deep 1
+surfac and indirect 1
+surfac and object 1
+surfac and periph 2
+surfac and peripher 2
+surfac and volumeapproach 1
+surfac ar allow 1
+surfac as se 1
+surfac au 1
+surfac au lieu 1
+surfac by assign 1
+surfac by detect 1
+surfac by triangl 1
+surfac com 1
+surfac con 1
+surfac connect 2
+surfac construc 1
+surfac construc algorithm 1
+surfac definit 1
+surfac deform 1
+surfac diagnost 1
+surfac diagnost rl 1
+surfac ds 1
+surfac ds se 1
+surfac enon 1
+surfac featur 1
+surfac form 1
+surfac form reminisc 1
+surfac from contour 1
+surfac from vol 1
+surfac gener 1
+surfac gener transfer 1
+surfac giv 1
+surfac height 1
+surfac height occur 1
+surfac horizont 1
+surfac illumin 1
+surfac knowledg 2
+surfac level 1
+surfac look 1
+surfac look ver 1
+surfac mater 1
+surfac model 2
+surfac norm 1
+surfac or peripher 2
+surfac pinout 2
+surfac pinout technolog 2
+surfac produc 1
+surfac reconstruc 1
+surfac sect 1
+surfac sect contour 1
+surfac simplif 1
+surfac simplif using 1
+surfac structur 1
+surfac structur unfold 1
+surfac system 1
+surfac tech 2
+surfac tech periph 2
+surfac technolog 2
+surfac technolog periph 2
+surfac that go 1
+surfac to mak 1
+surfac triangl 1
+surfac using 1
+surfac ver 1
+surfac whil scan 1
+surfac word 1
+surfac.3 1
+surfac.4 1
+surg 1
+surg plan 1
+surgeon 1
+surmonter 1
+surmonter son 1
+surmonter son handicap 1
+surnam 1
+surnam alon account 1
+surnam ar insuff 1
+surpr 15
+surpr high parallel 1
+surpr littl backtrack 1
+surpr low 1
+surpr man commerc 1
+surpr neg 1
+surpr neg result 1
+surpr qu 1
+surpr qu le 1
+surpr sinc rm 1
+surpr th smaller 1
+surpr that constraint 1
+surprendr 1
+surprendr ma 1
+surprendr ma sexpliqu 1
+surprendr pa 1
+surprendr pa ceux 1
+surrog 1
+surrog refer 1
+surround 8
+surround ar 1
+surround by text 1
+surround cel 1
+surround compon 1
+surround loop 1
+surround pair 1
+surround reg 1
+surtout 2
+surtout int 1
+surtout int er 1
+surtout inutil 1
+surtout inutil dan 1
+surv 41
+surv a la 1
+surv and classif 1
+surv and critiqu 1
+surv attempt 1
+surv dat 2
+surv du 1
+surv du sch 1
+surv ecu 1
+surv ext 1
+surv of character 1
+surv of fish 1
+surv of imag 1
+surv of interconnect 1
+surv of log 1
+surv of low 1
+surv of method 1
+surv of oolp 1
+surv of prun 1
+surv of sen 1
+surv of techniqu 1
+surv of wormhol 1
+surv on reconstruc 1
+surv paper 1
+surv prev 2
+surv prev effort 1
+surv prev result 1
+surv refer 1
+surv rel 1
+surv rel work 1
+surv se 2
+surv th entir 1
+surv th st 1
+surv work 1
+survenir 1
+surviv 4
+surviv ar judg 1
+surviv au 1
+surviv au retour 1
+surviv et se 1
+survivr 1
+survivr a lec 1
+survivr au 1
+survivr au del 1
+survol 1
+survol de 1
+survol de kcm 1
+sus. 1
+susan 2
+susan novel 1
+susan novel posthum 1
+susan owick 1
+suscept 4
+suscept d echouer 1
+suscept de 3
+suscept de couper 1
+suscept de cr 1
+suscept de prendr 1
+suscept de provoquer 1
+suscept dengendrer 1
+suscept dengendrer de 1
+suscept dengendrer par 1
+suscept to deadlock 1
+susceptibl 4
+susceptibl d echouer 1
+susceptibl daggraver 1
+susceptibl daggraver lampleur 1
+susceptibl de 3
+susceptibl de conduir 1
+susceptibl de cop 1
+susceptibl de mener 1
+susceptibl de produir 1
+susceptibl de provoquer 1
+susceptibl dinteragir 1
+susceptibl dinteragir avec 1
+susm 1
+susp 10
+susp by acc 1
+susp continu 1
+susp don 1
+susp don ee 1
+susp failur 1
+susp goal 1
+susp task 1
+susp th cal 1
+susp th old 1
+susp until thread 1
+suspect 2
+suspect th skew 1
+sussec 1
+sussenguth 1
+sussenguth jr 1
+sustain 6
+sustain comput 2
+sustain equilater 1
+sustain equilater shap 1
+sustain me 1
+sustain me throughput 1
+sustain on unit 1
+sustain th highest 1
+sustain throughput 1
+sustem 1
+sutherland 1
+sutter 1
+sutton 1
+sutton origin 1
+sutton origin se 1
+suzuk 1
+sv 1
+sv and teach 1
+sv appropr 1
+sv ar abl 1
+sv designer 1
+sv displ 1
+sv evalu 1
+sv evalu stud 1
+sv for prolog 1
+sv in educ 1
+sv perm 1
+sv perm stud 1
+sv system 1
+sv system mean 1
+sv technolog 1
+sv wa inspir 1
+sv which show 1
+svarer 1
+svarer et al 1
+svd 2
+svd de 1
+svd de la 1
+sven 1
+sven frolund 1
+svm 2
+svm compiler 1
+svm dispatch 1
+svm dispatch recv 1
+svm dispatch sen 1
+svm ext 1
+svm fortran 1
+svm fortran compiler 1
+svm fortran distingu 1
+svm fortran execut 1
+svm fortran gener 1
+svm fortran hpf 1
+svm fortran program 1
+svm fortran prov 1
+svm fortran refer 1
+svm fortran templ 1
+svm fortran us 1
+svm fortran ver 1
+svm is split 1
+svm myproc.ne.0 1
+svm reg 1
+svm subsystem 1
+svrc 1
+svrc techn 1
+svrc techn report 1
+svrc techreport 1
+sw 14
+sw 1sb 1
+sw and richard 1
+sw and sb 1
+sw ar bal 1
+sw boon 1
+sw boon lim 1
+sw cq 1
+sw feder 2
+sw feder institut 2
+sw group 1
+sw institut 3
+sw is indep 1
+sw is obtain 1
+sw is simil 1
+sw is ss0.3 1
+sw lead 1
+sw lx 1
+sw may requir 1
+sw me 1
+sw me sec 1
+sw nw 1
+sw nw lead 1
+sw obtain 1
+sw on system 1
+sw perform 1
+sw remain 1
+sw remain fic 1
+sw ss 1
+sw ss nw 1
+sw univ 1
+sw103 1
+sw90 1
+sw91 1
+sw93 1
+swain 1
+swain et al 1
+swal 1
+swam 1
+swam ii 1
+swam ii ba 1
+swap 10
+swap a tr 1
+swap con 1
+swap faus 1
+swap faus compl 1
+swap instruc 1
+swap instruc shown 1
+swap is bound 1
+swap is somewhat 1
+swap le 1
+swap man tr 1
+swap may lead 1
+swap out 1
+swap problem 1
+swap requir 1
+swap spac 1
+swap stat 1
+swap stat swap 1
+swap th dat 1
+swap to sort 1
+swart 1
+sweep 2
+sweep and stop 1
+swept 1
+swept period 1
+swg91 1
+swift 1
+swing 1
+swing of network 1
+switch 40
+switch a network 1
+switch algorithm 1
+switch allow 2
+switch allow dat 1
+switch alread prov 1
+switch and finit 1
+switch and interconnect 1
+switch and merg 1
+switch ar 1
+switch ar commun 1
+switch ar ded 1
+switch ar disc 1
+switch ar expect 1
+switch ar interconnect 1
+switch ar shown 1
+switch architectur 2
+switch architectur prov 1
+switch architectur support 1
+switch as switch 1
+switch attempt 1
+switch avail 1
+switch avail modl 1
+switch ba 2
+switch ba architectur 1
+switch ba interconnect 1
+switch ba loc 1
+switch ba network 2
+switch ba parallel 1
+switch ba system 1
+switch becom 1
+switch becom domin 1
+switch beforehand 1
+switch besid vk 1
+switch between nod 1
+switch between protocol 1
+switch between respect 1
+switch between task 1
+switch bi 1
+switch bi direct 1
+switch buffer 1
+switch can act 1
+switch can buffer 1
+switch can for 1
+switch can guar 1
+switch chip 2
+switch command 1
+switch commin 1
+switch commun 1
+switch commun occur 1
+switch compar 1
+switch con 1
+switch configur 1
+switch connect 1
+switch contain 1
+switch contain direct 1
+switch context 1
+switch continu 1
+switch control 1
+switch crossbar 1
+switch decipher 1
+switch decod 1
+switch del 3
+switch down link 1
+switch el 2
+switch environm 1
+switch equip 1
+switch etc 1
+switch exchang 1
+switch flow 1
+switch flow control 1
+switch for proc 1
+switch for unicast 1
+switch funct 1
+switch ha direct 1
+switch ha sent 1
+switch ha zer 1
+switch hav connect 1
+switch hav direct 1
+switch impl 1
+switch in c0 1
+switch in c2i 1
+switch in column 1
+switch in common 1
+switch input 1
+switch input output 1
+switch instruc 1
+switch int 1
+switch interconnect 1
+switch interconnect network 1
+switch interconnect pattern 1
+switch interconnect problem 1
+switch interconnect stat 1
+switch is approxim 1
+switch is assoc 1
+switch is assum 1
+switch is equip 1
+switch is nec 1
+switch is q0 1
+switch is serv 1
+switch is shown 1
+switch j request 1
+switch lin 1
+switch lin connect 1
+switch link 1
+switch mad 1
+switch may contain 1
+switch may result 1
+switch multicast 1
+switch multicast chang 1
+switch must ded 1
+switch must devot 1
+switch must po 1
+switch must sen 1
+switch nec 1
+switch network 2
+switch network con 1
+switch network configur 1
+switch network differ 1
+switch network gener 1
+switch network vs 1
+switch neuron 1
+switch nod 1
+switch nod pair 1
+switch nod specif 1
+switch o4 1
+switch o4 kn 1
+switch of figur 1
+switch of mod 1
+switch off cru 1
+switch ofst 1
+switch ofst nod 1
+switch on cru 1
+switch on term 1
+switch or nod 1
+switch output 1
+switch output port 1
+switch overhead 2
+switch pair 1
+switch port 1
+switch pr 1
+switch q fq0 1
+switch q q0 1
+switch q0 1
+switch q1 1
+switch q1 oe 1
+switch q2 1
+switch q2 strip 1
+switch q3 1
+switch q3 oe 1
+switch q3 therefor 1
+switch q4 1
+switch q5 1
+switch qr 1
+switch qr mach 1
+switch reduc 1
+switch repl 1
+switch repl flit 1
+switch request 1
+switch request typ 1
+switch sen 1
+switch srin 1
+switch stag 1
+switch stat 2
+switch strip 1
+switch support 2
+switch support fic 1
+switch support tn 1
+switch support var 1
+switch system 2
+switch system exchang 1
+switch techniqu 1
+switch th connect 1
+switch th const 1
+switch th opt 1
+switch th partit 1
+switch th rol 1
+switch that perform 1
+switch tim 1
+switch to ar 1
+switch to den 1
+switch to edit 1
+switch to gener 1
+switch to impl 1
+switch to mod 1
+switch to parallel 1
+switch to prev 1
+switch to rout 1
+switch to switch 1
+switch to using 1
+switch traff 1
+switch traff pattern 1
+switch transit 1
+switch transit funct 1
+switch trunk 1
+switch us 2
+switch us schedl 1
+switch usag 1
+switch using 1
+switch v2 1
+switch vi 1
+switch vj 1
+switch vk 1
+switch wh 1
+switch which interconnect 1
+switch wil find 1
+switch wil request 1
+switch wish 1
+switch with direct 1
+switch with repl 1
+switch work 1
+switch01t 1
+switch1 1
+switch1 s2 1
+switch1 s2 s3 1
+switchm 1
+switzerland 7
+switzerland e mail 1
+switzerland email 1
+swmr 1
+swmr register 1
+swmr register ri 1
+swop 1
+swop beppu 1
+sx 2
+sx tool 1
+sx x3 1
+sx x3 x2 1
+sy 7
+sy and sy0 1
+sy attendr 1
+sy becom 1
+sy becom modif 1
+sy config 1
+sy config tok 1
+sy contain 1
+sy em 1
+sy em sont 1
+sy from nod 1
+sy is modif 1
+sy of figur 1
+sy that enter 1
+sy tim.h 1
+sy tim.h inclus 1
+sy0 1
+sy0 by ad 1
+syb 1
+sydn 3
+syllabus 1
+syllabus is outlin 1
+sylv 2
+sylv besc 1
+sylv osborn 1
+sylviag 1
+sylviag csd.uw.ca 1
+sym 6
+sym etr 1
+sym etriqu 1
+sym etriqu la 1
+sym tr 1
+sym tr simpl 1
+sym tr sur 1
+sym triqu 1
+sym triqu assoc 1
+sym triqu tel 1
+sym val 1
+symbol 46
+symbol a.15 1
+symbol a.15 syntac 1
+symbol a1 1
+symbol ai 1
+symbol allow 1
+symbol an 1
+symbol and const 1
+symbol and expr 1
+symbol and fl 1
+symbol and neur 1
+symbol and numer 1
+symbol and predefin 1
+symbol and rel 1
+symbol appear 1
+symbol appl 2
+symbol appl writ 1
+symbol ar arrang 1
+symbol ar distinct 1
+symbol ar rigid 1
+symbol ar user 1
+symbol as argum 1
+symbol as row 1
+symbol assemb 1
+symbol assemb langu 1
+symbol assoc 1
+symbol attribut 1
+symbol attribut system 1
+symbol bi 1
+symbol block 1
+symbol block exampl 1
+symbol block siz 1
+symbol boolean 1
+symbol boolean constraint 1
+symbol by el 1
+symbol c fc1 1
+symbol c1 1
+symbol ca 1
+symbol compl 1
+symbol compl uncheck 1
+symbol comput 11
+symbol const 1
+symbol const produc 1
+symbol de 2
+symbol de pr 1
+symbol de variabl 1
+symbol debug 1
+symbol del 1
+symbol denot 1
+symbol denot distinct 1
+symbol dep 1
+symbol dep an 1
+symbol descript 1
+symbol distinct 1
+symbol est 1
+symbol est don 1
+symbol et nom 1
+symbol evalu 1
+symbol explan 1
+symbol explan valu 1
+symbol extrem 1
+symbol fact 1
+symbol fact suff 1
+symbol fic 1
+symbol fonctionnel 1
+symbol form 1
+symbol gtop 1
+symbol in t1 1
+symbol ind 2
+symbol ind string 1
+symbol is appl 1
+symbol is introduc 1
+symbol is repr 1
+symbol is return 1
+symbol langu 1
+symbol lin 1
+symbol log 2
+symbol manipl 1
+symbol map 1
+symbol map hk 1
+symbol math 1
+symbol math ematiqu 1
+symbol method 1
+symbol might con 1
+symbol nam 3
+symbol nam arbitr 1
+symbol nil 1
+symbol occur 1
+symbol of ar 1
+symbol of oe1 1
+symbol of oe2 1
+symbol ou 1
+symbol ou de 1
+symbol proc 1
+symbol program 1
+symbol push 1
+symbol push method 1
+symbol r1 1
+symbol repr 1
+symbol ri 1
+symbol rl 1
+symbol server 1
+symbol server agent 1
+symbol structur 1
+symbol syntac 1
+symbol system 1
+symbol tabl 4
+symbol tabl fram 1
+symbol tabl modl 1
+symbol tabl thread 1
+symbol th gener 1
+symbol that appear 2
+symbol that occur 1
+symbol to acc 1
+symbol to mark 1
+symbol unfold 1
+symbol var 2
+symbol ver 1
+symbol whil creat 1
+symbol with ar 1
+symbol with distinct 1
+symboliqu 1
+symboliqu dan 1
+symboliqu dan un 1
+symeter 1
+symeter cr 1
+symmeter 29
+symmeter among job 1
+symmeter and bal 1
+symmeter and redund 1
+symmeter and reflec 1
+symmeter and repetit 1
+symmeter and skew 1
+symmeter argum 2
+symmeter by adapt 1
+symmeter cd 1
+symmeter cd cd 1
+symmeter closur 1
+symmeter coh 1
+symmeter coh pair 1
+symmeter damp 1
+symmeter damp algebr 1
+symmeter distribut 1
+symmeter eigenproblem 1
+symmeter eigenvalu 1
+symmeter eigenvalu comput 1
+symmeter eigenvalu problem 1
+symmeter funct 1
+symmeter funct fu0 1
+symmeter matr 2
+symmeter matr ad2at 1
+symmeter matr proceed 1
+symmeter multik 1
+symmeter multik fil 1
+symmeter multiproc 2
+symmeter multiproc system 1
+symmeter not 1
+symmeter not eff 1
+symmeter part 1
+symmeter posit 4
+symmeter posit definit 4
+symmeter rplac 1
+symmeter shap 1
+symmeter spar 2
+symmeter spar matr 2
+symmeter system 1
+symmeter tridiagon 1
+symmeter tridiagon matr 1
+symp 17
+symp in appl 1
+symp96 1
+symposioum 1
+symptom 3
+symptom oft seen 1
+symtab 1
+symtab and symtabref 1
+symtab but using 1
+symtabref 1
+synap 1
+sync 2
+synch 1
+synchr 2
+synchr est 1
+synchr qu 1
+synchr qu etablit 1
+synchron 38
+synchron acc 1
+synchron affect 1
+synchron algorithm 1
+synchron and asynchron 2
+synchron and atom 1
+synchron and coh 1
+synchron and commun 2
+synchron and futur 1
+synchron and proc 1
+synchron and reduc 1
+synchron atom 2
+synchron atom broadcast 2
+synchron behavior 1
+synchron best rst 1
+synchron car 1
+synchron car lop 1
+synchron clock 1
+synchron command 1
+synchron command traff 1
+synchron commun 3
+synchron computer 1
+synchron computer support 1
+synchron constraint 1
+synchron constraint prop 1
+synchron constraint using 1
+synchron conver 1
+synchron cost 3
+synchron cost etc 2
+synchron dan 1
+synchron dan le 1
+synchron dat 2
+synchron dat parallel 1
+synchron de 1
+synchron de processeur 1
+synchron design 1
+synchron ee 1
+synchron ee de 1
+synchron entr 1
+synchron entr ceux 1
+synchron entr nid 1
+synchron est 1
+synchron est alor 1
+synchron event 2
+synchron event outweigh 1
+synchron generaliz 1
+synchron giv 1
+synchron group 1
+synchron host 1
+synchron host clock 1
+synchron in distribut 1
+synchron in front 1
+synchron inutil 1
+synchron invoc 1
+synchron is accompl 1
+synchron is satisf 1
+synchron is subject 1
+synchron issu 2
+synchron issu cruc 1
+synchron iter 1
+synchron iter algorithm 1
+synchron iter proc 1
+synchron me 1
+synchron me pa 1
+synchron me sen 1
+synchron minim 1
+synchron n ecessair 1
+synchron nest 1
+synchron occur 1
+synchron occur tw 1
+synchron of acc 1
+synchron of act 1
+synchron of oper 1
+synchron of tr 1
+synchron on shar 1
+synchron oper 1
+synchron or coh 1
+synchron overhead 1
+synchron par 1
+synchron par exempl 1
+synchron parallel 1
+synchron parallel acc 1
+synchron parallel cal 1
+synchron parallel glob 1
+synchron parallel model 1
+synchron parallel prior 1
+synchron point 2
+synchron point du 1
+synchron pr 1
+synchron pr esent 1
+synchron prim 1
+synchron prim implem 1
+synchron primitiv 3
+synchron primitiv implem 1
+synchron problem 1
+synchron program 1
+synchron protocol 1
+synchron q0 1
+synchron repl 1
+synchron repl requir 1
+synchron requir 1
+synchron sequ 1
+synchron sequ mach 1
+synchron serait 1
+synchron serait donc 1
+synchron sever coordin 1
+synchron sont 1
+synchron specif 1
+synchron step 1
+synchron system 1
+synchron th ph 1
+synchron th underl 1
+synchron that toler 1
+synchron traver 1
+synchron traver cfg 1
+synchron var 1
+synchron variabl 1
+synchron variabl non 1
+synchron walk 1
+synchron with enabl 1
+synchron with me 1
+synchron with memor 1
+synchron work 1
+synchroniz 1
+synerg 2
+synerg optim 1
+synerg rel 1
+synerg relationship 1
+synonym 3
+synonym hypernym 1
+synonym is gener 1
+synop 1
+syntac 28
+syntac a syntac 1
+syntac abstrait 1
+syntac abstrait annot 1
+syntac ad 1
+syntac allow 1
+syntac allow addit 1
+syntac and extern 1
+syntac and featur 1
+syntac and parser 1
+syntac and sem 8
+syntac by autom 1
+syntac c syntac 1
+syntac check 1
+syntac cl 1
+syntac cl nam 1
+syntac concr 1
+syntac concr es 1
+syntac de 1
+syntac de structur 1
+syntac defin 1
+syntac defin modl 1
+syntac definit 1
+syntac direct 4
+syntac direct manner 1
+syntac direct proof 1
+syntac direct se 1
+syntac direct system 1
+syntac docum 1
+syntac docum pr 1
+syntac du 1
+syntac du lang 1
+syntac environm 1
+syntac environm compr 1
+syntac environm construc 1
+syntac error 2
+syntac error thread 1
+syntac expan 1
+syntac expan cr 1
+syntac ext 1
+syntac for blank 1
+syntac for collect 1
+syntac for expr 1
+syntac for identif 1
+syntac form 1
+syntac form unquot 1
+syntac guid 1
+syntac inclus 1
+syntac instead 1
+syntac is ba 1
+syntac is exact 1
+syntac is motiv 1
+syntac modl 1
+syntac modl form 1
+syntac of defgener 1
+syntac of defstruc 1
+syntac of gener 1
+syntac of lambd 1
+syntac of log 1
+syntac of mult 1
+syntac of natur 1
+syntac of pm 1
+syntac of sl1 1
+syntac oper 1
+syntac or sem 1
+syntac or stat 1
+syntac par 1
+syntac script 1
+syntac script correspon 1
+syntac specif 2
+syntac specif drop 1
+syntac sum 1
+syntac to simplif 1
+syntac tr 2
+syntac tr construc 1
+syntac tr transform 1
+syntac tr transformer 1
+syntac us 1
+syntac us cur 1
+syntac ver cl 1
+syntac with ext 1
+syntact 22
+syntact accept 1
+syntact acquisit 1
+syntact adequ 1
+syntact and model 1
+syntact and sem 3
+syntact approach 1
+syntact by piec 1
+syntact constraint 1
+syntact constraint allow 1
+syntact construc 1
+syntact context 1
+syntact correct 1
+syntact dev 1
+syntact differ 1
+syntact ent 1
+syntact equiv 2
+syntact equiv succ 1
+syntact expr 1
+syntact featur 1
+syntact form 1
+syntact funct 1
+syntact group 1
+syntact induc 1
+syntact induc infer 1
+syntact level 1
+syntact manipl 1
+syntact non 1
+syntact non empt 1
+syntact nonequiv 1
+syntact nonequiv succ 1
+syntact object 1
+syntact oper 1
+syntact or stat 1
+syntact origin 1
+syntact proper 1
+syntact restrict 3
+syntact segm 1
+syntact sem 1
+syntact sem domain 1
+syntact simil 1
+syntact sound 1
+syntact structur 3
+syntact tr 1
+syntact tr structur 1
+syntact unif 1
+syntact ver simil 1
+syntact wellform 1
+syntaxdirect 1
+syntaxdirect rl 1
+syntaxiqu 1
+syntaxiqu et ca 1
+syntaxiqu habituel 1
+syntaxiqu habituel avec 1
+syntaxiqu qu 1
+syntaxiqu qu calcl 1
+syntaxiqu sur 1
+syntaxiqu sur lensembl 1
+synth 20
+synth and evolut 1
+synth and gener 1
+synth and transform 1
+synth attribut 1
+synth attribut grammar 1
+synth dat 1
+synth dat show 1
+synth es 2
+synth es de 2
+synth es ee 1
+synth es susm 1
+synth etiqu 1
+synth etiqu direct 1
+synth etiser 1
+synth etiser com 1
+synth etiser le 1
+synth experim 1
+synth experim show 1
+synth from behavior 1
+synth from specif 1
+synth gener 1
+synth in bedroc 1
+synth is composit 1
+synth loop 1
+synth minim 1
+synth minim typ 1
+synth oper 1
+synth oper scenar 1
+synth parameter 1
+synth proc 1
+synth requir 1
+synth seem 1
+synth system 2
+synth system lo 1
+synth task 1
+synth tiqu 1
+synth tiqu de 1
+synth tool 2
+synth traff 2
+synth traff pattern 2
+synth univer qu 1
+synth utter 1
+synth workload 1
+synth workload tok 1
+synth workload wrkload 1
+sypmp 1
+sypmp on parallel 1
+syr 1
+syr deserv 1
+syr en 1
+sysconfigfil 1
+sysl 1
+sysplec 1
+sysplec overview 1
+sysplec overview introduc 1
+syst 10
+syst em 6
+syst em adm 1
+syst em ain 1
+syst em aquarius 1
+syst em atteindr 1
+syst em ax 1
+syst em ba 1
+syst em binprolog 1
+syst em cibl 1
+syst em classiqu 1
+syst em cognitif 1
+syst em complec 1
+syst em comport 1
+syst em construit 1
+syst em dam 1
+syst em de 3
+syst em dec 1
+syst em dexploit 2
+syst em dic 1
+syst em din 1
+syst em dioph 1
+syst em doit 1
+syst em doiv 1
+syst em dynamiqu 1
+syst em ecrc 1
+syst em ecrit 1
+syst em empl 1
+syst em en 2
+syst em est 2
+syst em etait 1
+syst em gard 1
+syst em incr 1
+syst em informatiqu 1
+syst em init 1
+syst em interm 1
+syst em intern 1
+syst em ivy 1
+syst em koan 1
+syst em markov 1
+syst em mod 1
+syst em ne 1
+syst em non 1
+syst em nous 1
+syst em ou 3
+syst em par 1
+syst em parm 1
+syst em pen 1
+syst em peut 1
+syst em peuv 1
+syst em pour 1
+syst em pr 1
+syst em prolog 1
+syst em qu 1
+syst em rest 1
+syst em retourner 1
+syst em sep 1
+syst em sous 1
+syst em sur 2
+syst em tout 1
+syst em util 1
+syst ematiqu 2
+syst ematiqu au 1
+syst ematiqu calcl 1
+syst ematiqu charg 1
+syst ematiqu construir 1
+syst ematiqu cop 1
+syst ematiqu de 2
+syst ematiqu inv 1
+syst ematiqu lattribut 1
+syst ematiqu le 1
+syst ematiqu peut 1
+syst ematiqu ranger 1
+syst ematiqu sauvegard 1
+syst ematiqu transf 1
+syst matiqu 1
+syst matiqu de 1
+syst me 1
+syst me al 1
+syst me dacquisit 1
+system 120
+system 1st 1
+system 1st ed 1
+system a bp 1
+system a difficult 2
+system a maxim 1
+system abil 2
+system achief 1
+system act 1
+system actu 1
+system adapt 2
+system addr 1
+system addr transl 1
+system administer 2
+system admon 1
+system after tim 1
+system al incr 1
+system al prov 1
+system al rol 1
+system allow 2
+system allow patron 1
+system alw ten 1
+system an 3
+system and algorithm 1
+system and an 1
+system and antimatr 1
+system and appl 2
+system and church 1
+system and computer 1
+system and cybernet 1
+system and def 1
+system and demonstr 1
+system and disc 1
+system and eigenproblem 1
+system and elim 1
+system and establ 1
+system and fujitsu 1
+system and gener 1
+system and graph 1
+system and hop 1
+system and ind 1
+system and integr 1
+system and modl 1
+system and perform 1
+system and program 1
+system and run 1
+system and softwar 3
+system and support 1
+system and tak 1
+system answer 1
+system answer offer 1
+system appear 2
+system appl 1
+system approach 3
+system approach impl 1
+system ar assum 2
+system ar avail 2
+system ar becom 1
+system ar cl 1
+system ar compar 1
+system ar compreh 1
+system ar concern 1
+system ar consider 1
+system ar construc 1
+system ar defin 1
+system ar describ 1
+system ar design 1
+system ar disc 2
+system ar equiv 1
+system ar expr 1
+system ar implicit 1
+system ar invit 1
+system ar lin 1
+system ar pag 1
+system ar pr 2
+system ar profit 1
+system ar recover 1
+system ar repr 1
+system ar rich 1
+system ar scal 1
+system ar shown 1
+system ar signif 1
+system ar specif 1
+system ar split 1
+system ar suff 1
+system ar suit 1
+system ar superf 1
+system ar treat 1
+system ar user 1
+system archictectur 1
+system archictectur comp 1
+system architect 1
+system architect design 1
+system architectur 8
+system architectur overview 4
+system architectur resembl 1
+system as conceiv 1
+system as fish 1
+system as frequ 1
+system aspect 1
+system assign 1
+system assoc 1
+system assum 2
+system assum no 1
+system at cp95 1
+system at tim 1
+system at work 1
+system attach 1
+system attempt 1
+system avail 4
+system avail rel 1
+system aver 1
+system aver payoff 1
+system ax 1
+system ba 10
+system backtrack 1
+system be construc 1
+system be fic 1
+system becom 3
+system becom commonplac 1
+system becom idl 1
+system becom oc 1
+system begin 1
+system behav 1
+system behavior 4
+system behaviour 1
+system behaviour abstract 1
+system being indeed 1
+system being model 1
+system belief 1
+system benchmark 1
+system birth 1
+system birth begin 1
+system build 1
+system build block 1
+system built 2
+system built using 1
+system bus 1
+system bus period 1
+system by comp 1
+system by compar 1
+system by execut 1
+system by introduc 1
+system by mak 1
+system by mark 1
+system by order 1
+system by show 1
+system bz 1
+system c appl 1
+system cach 1
+system cal 6
+system cal conceptu 1
+system cal glob 1
+system cal interfac 1
+system can accommod 1
+system can arbitr 1
+system can cop 1
+system can dec 1
+system can determin 1
+system can eleg 1
+system can explain 1
+system can exploit 1
+system can find 1
+system can handl 1
+system can lead 1
+system can natur 1
+system can repr 1
+system can toler 1
+system can us 1
+system can var 1
+system cannot cr 1
+system cannot execut 1
+system cannot know 1
+system cannot plac 1
+system cap 1
+system catalog 1
+system ch 2
+system character 2
+system character respon 1
+system chief 1
+system chief execut 1
+system cl 2
+system cl hierarch 1
+system closer 1
+system cod 1
+system cod qu 1
+system command 1
+system complec 1
+system compon 3
+system compon hierarch 1
+system compr 1
+system compr distribut 1
+system comput 1
+system con 13
+system concern 1
+system configur 6
+system configur becom 1
+system configur fal 1
+system configur using 1
+system consider 1
+system consider earl 1
+system construc 3
+system contain 1
+system continu 2
+system continu attempt 1
+system converg 2
+system correct 1
+system correspon 1
+system cr 1
+system cr t3d 1
+system crash 1
+system crash recov 1
+system dat 1
+system dat shar 1
+system deal 2
+system death 1
+system debug 1
+system decluster 1
+system decluster method 1
+system decluster techniqu 1
+system decomp 1
+system decomp problem 1
+system decomposit 2
+system decr 2
+system defin 4
+system defin cl 1
+system defin metacl 1
+system defin method 1
+system defin object 1
+system defin pr 1
+system defin protocol 1
+system definit 1
+system degrad 1
+system del 1
+system del capabil 1
+system deliver 1
+system deliver simil 1
+system dep 2
+system departm jamov 1
+system deriv 1
+system describ 4
+system design 9
+system design con 1
+system design techniqu 1
+system designer 3
+system determin 1
+system develop 3
+system develop using 1
+system developm 6
+system developm using 1
+system direct prov 1
+system disc 1
+system disc thus 1
+system discrimin 2
+system disper 1
+system disper oper 1
+system distingu 1
+system distingu knowledg 1
+system div 3
+system drop 1
+system drop not 1
+system du 1
+system dynam 1
+system ea 1
+system ec 2
+system either assum 1
+system el 1
+system eleg 1
+system embod 2
+system eml 1
+system eml task 1
+system eml workloadgeneratorrout 1
+system en 1
+system encounter 1
+system engineer 3
+system engineer technolog 1
+system environm 1
+system envisag 1
+system equiv 1
+system error 1
+system etc 1
+system eventu 1
+system eventu reach 1
+system evolut 3
+system exchang 1
+system execut 2
+system exhibit 2
+system exhibit high 1
+system expan 1
+system expect 2
+system experim 1
+system exploit 1
+system ext 1
+system f try 1
+system fail 2
+system failur 1
+system fal 2
+system fd 1
+system featur 1
+system fil 1
+system fil manager 1
+system follow 1
+system for adv 1
+system for algorithm 1
+system for common 1
+system for compact 1
+system for compar 1
+system for computer 1
+system for corpor 1
+system for deal 1
+system for deduc 1
+system for dent 1
+system for develop 1
+system for diagn 1
+system for equipm 1
+system for german 1
+system for hal 1
+system for high 1
+system for increm 1
+system for intellig 1
+system for intern 1
+system for ml 1
+system for network 1
+system for neur 1
+system for nrd 1
+system for object 1
+system for organ 1
+system for parallel 1
+system for prolog 1
+system for repr 1
+system for rheumatolog 1
+system for select 1
+system for siml 1
+system for sld 1
+system for support 1
+system for thom 1
+system fragil 1
+system framework 1
+system from environm 1
+system funct 3
+system gener 4
+system gener failur 1
+system gener me 1
+system gener offer 1
+system gener put 1
+system giv 2
+system goal 1
+system graph 1
+system graph part 1
+system group 2
+system guid 1
+system guid act 1
+system guid interact 1
+system ha ch 1
+system ha encounter 1
+system ha good 1
+system ha ind 1
+system ha meant 1
+system ha pot 1
+system handl 1
+system hav dealt 1
+system hav fic 1
+system hav mad 1
+system hav main 1
+system hav problem 1
+system hav ser 1
+system hav spec 1
+system hav sw 1
+system hav ts 1
+system hierarch 2
+system id 1
+system identif 2
+system identif failur 1
+system identif using 1
+system ii 2
+system illustr 1
+system illustr program 1
+system implem 2
+system implem mod 1
+system in compon 1
+system in detail 1
+system in ext 1
+system in figur 1
+system in gener 1
+system in learn 1
+system in log 1
+system in mar 1
+system in numer 1
+system in order 3
+system in pract 1
+system in procedur 1
+system in sect 2
+system in spit 2
+system inclus 2
+system inclus rel 1
+system incorpor 1
+system individu 1
+system inf 1
+system inf loc 1
+system infer 1
+system infer valu 1
+system inform 1
+system init 2
+system init abort 1
+system init bi 1
+system initializ 1
+system int cal 1
+system int distinct 1
+system int modl 1
+system integr 4
+system integr caus 1
+system integr inclus 1
+system intel 1
+system intel ipsc 1
+system intent 1
+system interfac 2
+system interfac manu 1
+system interpr 1
+system ipsc 1
+system is abl 2
+system is abstract 1
+system is allow 1
+system is an 1
+system is analog 1
+system is avail 1
+system is ba 1
+system is becom 1
+system is broadcast 1
+system is bus 1
+system is car 1
+system is clear 1
+system is comp 1
+system is compl 1
+system is concern 1
+system is constrain 1
+system is construc 1
+system is cur 1
+system is dec 1
+system is depict 1
+system is describ 2
+system is design 1
+system is determin 1
+system is divid 1
+system is dynam 1
+system is effect 1
+system is empt 1
+system is encourag 1
+system is equiv 1
+system is estim 1
+system is explicit 1
+system is extrem 1
+system is fic 1
+system is fl 1
+system is forc 1
+system is form 1
+system is giv 2
+system is going 1
+system is greater 1
+system is id 1
+system is ident 1
+system is illustr 1
+system is inclus 1
+system is int 1
+system is li 1
+system is model 1
+system is non 1
+system is nonconflu 1
+system is overload 1
+system is pot 1
+system is presum 1
+system is prop 2
+system is repr 1
+system is robust 1
+system is scal 1
+system is shown 1
+system is signif 1
+system is simil 1
+system is siml 1
+system is sound 1
+system is spar 1
+system is throttl 1
+system is tradit 1
+system is twofold 2
+system is upd 1
+system is zer 1
+system itself occ 1
+system iv look 1
+system keep 1
+system keep execut 1
+system keep track 1
+system kernel 1
+system kernel mod 1
+system know 2
+system knowledg 1
+system knowledg ba 1
+system labor 4
+system labor institut 1
+system learn 1
+system level 4
+system level cover 1
+system level multicast 1
+system level softwar 1
+system lif 1
+system lif begin 1
+system lif en 1
+system lik cr 1
+system lik sa 1
+system lim 1
+system liv 1
+system liv illustr 1
+system lo 1
+system load 2
+system load bal 1
+system login 1
+system login inform 1
+system mad 1
+system maintain 1
+system man 1
+system man cybernet 1
+system manner 1
+system manufacturer 1
+system matr 1
+system matur 1
+system may attempt 1
+system may ch 1
+system may involut 1
+system may learn 1
+system may perm 1
+system mc 1
+system me 1
+system mean 2
+system memor 1
+system memor acc 1
+system method 1
+system mic 1
+system mic increm 1
+system might us 1
+system mod 2
+system mod overhead 1
+system model 5
+system model seem 1
+system modif 1
+system mor eff 1
+system mor effect 1
+system mor fault 1
+system mov 1
+system mov ver 1
+system much longer 1
+system multicast 1
+system must ad 1
+system must commut 1
+system must oper 1
+system nach 1
+system nach prinzip 1
+system never fail 1
+system not mak 1
+system object 1
+system object funct 1
+system obtain 1
+system of aff 1
+system of agent 1
+system of arbab 1
+system of arbitr 1
+system of autonom 1
+system of definit 1
+system of equ 3
+system of great 1
+system of inequ 2
+system of lin 6
+system of medicin 1
+system of mil 1
+system of mishr 1
+system of modl 1
+system of mycroft 1
+system of mycroftokeef 1
+system of network 1
+system of neur 1
+system of object 1
+system of sect 1
+system of self 1
+system of sem 1
+system of tdfg 1
+system of transit 1
+system of var 1
+system of vhdl 1
+system of water 1
+system offer 3
+system on problem 1
+system on term 1
+system onl keep 1
+system op 1
+system op norm 1
+system oper 3
+system or dat 1
+system or deep 1
+system or dew 1
+system or eigenproblem 1
+system or langu 1
+system or libr 1
+system or parallel 1
+system organ 1
+system organ concept 1
+system outperform 1
+system outperform group 1
+system output 1
+system output possibil 1
+system over term 1
+system over tim 1
+system overflow 1
+system overview 2
+system overview manu 1
+system pag 1
+system parameter 4
+system part 1
+system part graph 1
+system perceiv 1
+system perceiv ea 1
+system perform 10
+system perform model 1
+system perform remain 1
+system perform signif 1
+system perspect 1
+system plac 1
+system po 1
+system point 1
+system post 1
+system pot 1
+system pot funct 1
+system pr 3
+system pract 1
+system predict 1
+system principl 2
+system privileg 1
+system privileg administer 1
+system privileg avail 1
+system privileg distribut 1
+system privileg espec 1
+system privileg manag 1
+system proc 1
+system proc draft 1
+system project 2
+system project esp 1
+system prop 1
+system propertieswh 1
+system prototyp 2
+system prov 4
+system qu 1
+system quit eff 1
+system r datab 2
+system r1 1
+system rapid 1
+system rapid overtak 1
+system re configur 1
+system reach 2
+system reach hor 1
+system react 1
+system realiz 1
+system rec 1
+system rec serv 1
+system receiv 1
+system record 1
+system recov 1
+system recov satisf 1
+system rel 2
+system requir 5
+system requir fast 1
+system requir fewer 1
+system research 8
+system research center 5
+system research institut 2
+system resembl 1
+system resourc 2
+system result 2
+system retrief 1
+system reus 1
+system reus prom 1
+system reus repr 1
+system review 4
+system rol 1
+system rol en 1
+system run 3
+system s organ 1
+system s0 1
+system s0 obtain 1
+system satisf 1
+system sc 9
+system scan 1
+system scheduler 1
+system se 2
+system search 1
+system secur 1
+system secur officer 1
+system serv 1
+system sg 1
+system should expect 1
+system should offer 1
+system should prov 1
+system should respon 1
+system shouldnt becom 1
+system shown 1
+system siml 3
+system simp 1
+system simp ad 1
+system siz 6
+system siz achief 1
+system siz attain 1
+system siz design 1
+system siz offer 1
+system siz support 1
+system siz using 1
+system softwar 4
+system softwar reus 1
+system solut 1
+system spac 1
+system specif 5
+system st 5
+system st chang 1
+system st me 1
+system st oc 1
+system st reflect 1
+system st seen 1
+system st undefin 1
+system start 2
+system startup 2
+system stateclock 1
+system stateclock event 1
+system structur 1
+system subject 1
+system succ 1
+system suggest 2
+system support 7
+system support autom 1
+system support multipl 1
+system support transact 1
+system synth 1
+system synth requir 1
+system t def 1
+system techn 5
+system technolog 1
+system ten 2
+system term 1
+system term reduc 1
+system test 1
+system th agent 1
+system th asymptot 1
+system th domain 1
+system th facil 1
+system th filter 1
+system th gigabit 1
+system th kind 1
+system th layout 1
+system th maxim 1
+system th memor 1
+system th network 1
+system th number 1
+system th object 1
+system th pandemon 1
+system th qu 1
+system th user 1
+system that adh 1
+system that allow 2
+system that cop 1
+system that cr 1
+system that ensur 1
+system that ext 2
+system that gener 1
+system that giv 1
+system that help 1
+system that input 1
+system that learn 3
+system that po 2
+system that rec 1
+system that simplif 1
+system that support 2
+system that transl 1
+system then infer 1
+system then maint 1
+system theor 1
+system through dat 1
+system through reus 1
+system through straightfor 1
+system to achief 1
+system to autom 1
+system to behav 1
+system to car 1
+system to co 1
+system to dec 1
+system to degrad 1
+system to del 1
+system to deliver 1
+system to detect 1
+system to enh 1
+system to ensur 1
+system to evolut 1
+system to examin 1
+system to export 1
+system to ge 1
+system to go 1
+system to improv 2
+system to infer 1
+system to learn 1
+system to mak 1
+system to oper 1
+system to perform 1
+system to perm 1
+system to po 1
+system to prov 3
+system to retrief 1
+system to siml 1
+system to solut 3
+system to support 3
+system to us 1
+system to work 1
+system topolog 3
+system ts 1
+system typ 2
+system typ con 1
+system typ involut 1
+system under complec 1
+system under pack 1
+system under peripher 2
+system under proc 2
+system under rapid 2
+system under surfac 2
+system understand 1
+system univer 1
+system univer incr 1
+system us 6
+system us inclus 1
+system us load 1
+system us low 1
+system user 2
+system user guid 1
+system using 12
+system using attribut 1
+system using comput 1
+system using direct 1
+system using knowledg 1
+system using larger 1
+system using lock 1
+system using multipl 1
+system using neur 1
+system using proc 2
+system using standard 1
+system using statechart 1
+system util 1
+system util valu 1
+system v stream 1
+system var 1
+system var effect 1
+system ver 1
+system ver difficult 1
+system vol 3
+system vol.13 1
+system vol.13 no.4 1
+system wa abl 1
+system wa appl 1
+system wa deriv 1
+system wa design 1
+system wa develop 1
+system wa empl 1
+system wa empt 1
+system wa influ 1
+system wa prop 1
+system wa publ 1
+system we assum 2
+system we built 1
+system we consider 1
+system we obtain 1
+system we want 1
+system wer configur 1
+system wer perform 1
+system wer siml 1
+system wh 4
+system wh audit 1
+system wh behaviour 1
+system wh dec 1
+system wh posit 1
+system wh transact 1
+system when me 1
+system which adopt 1
+system which allow 2
+system which automat 1
+system which def 1
+system which en 1
+system which prov 1
+system which run 1
+system which support 1
+system which treat 1
+system which us 2
+system whil deliver 1
+system whil maintain 1
+system wid 5
+system wid ba 1
+system wid coh 1
+system wid control 1
+system wid perform 1
+system wid uniqu 1
+system wil answer 1
+system wil fac 1
+system wil find 1
+system wil modif 1
+system wil posit 1
+system wil prefer 1
+system wil rep 1
+system wil requir 1
+system wil scal 1
+system wil wait 1
+system with arbitr 1
+system with ba 1
+system with cach 2
+system with centr 1
+system with cluster 1
+system with cur 1
+system with definit 1
+system with desir 1
+system with detail 1
+system with distribut 1
+system with filter 1
+system with giv 1
+system with inform 1
+system with interproc 1
+system with larger 1
+system with multipl 1
+system with non 1
+system with optim 1
+system with parallel 1
+system with proc 2
+system with random 1
+system with regard 1
+system with respect 1
+system with reus 1
+system with simil 1
+system with simpl 1
+system with subtyp 1
+system with synchron 1
+system with toler 1
+system with var 2
+system with wir 2
+system with writ 1
+system without incr 1
+system work 2
+system workshop 1
+system would actu 1
+system would allow 1
+system would split 1
+system wright 1
+system y using 1
+system11 1
+system11 sy 1
+system12 1
+system21 1
+system22 1
+system3 1
+system33 1
+systemat 5
+systemat allow 1
+systemat appl 1
+systemat appl fact 1
+systemat der 1
+systemat th posit 1
+systemat transform 1
+systembus 1
+systembus period 1
+systemconfigur 1
+systemconfigur componentdefinit 1
+systemconfigur dat 1
+systemconfigur dat distribut 1
+systemconfigur workloaddescriptionparameter 1
+systemconfigur workloaddescriptionparameter cost 1
+systemdynamicson 1
+systemdynamicson coupl 1
+systemdynamicson coupl architectur 1
+systemkernelkcmhost 1
+systempot 1
+systempot funct 1
+systemtechnik 1
+systemw 1
+systemw execut 1
+systemw execut hist 1
+systol 2
+systol algorithm 1
+systol ar 1
+systoliqu 2
+systoliqu a la 1
+syu 1
+syu csd.uw.ca 1
+sz 1
+sz91 1
+szal 1
+szeg 2
+szelag 1
+szer 2
+szermer 1
+szh94 1
+szilard 1
+szolovit 2
+szymansk 1
+t. 1
+t.1.1 1
+t.1.1 t.1.2 1
+t.1.1 t.1.2 d1 1
+t.1.2 1
+t.1.2 d1 1
+t.302 1
+t.306 1
+t.c 1
+t.e 1
+t.j 7
+t.j.r 1
+t.l 1
+t.m 1
+t.p 1
+t.q 1
+t.s 1
+t.v 1
+t0 16
+t0 adjac 1
+t0 and g0 1
+t0 and remain 1
+t0 as follow 1
+t0 as shown 1
+t0 cur 1
+t0 cur ts 1
+t0 follow 1
+t0 in oe 1
+t0 int v0 1
+t0 it hold 1
+t0 must en 1
+t0 o t1 1
+t0 plogn 1
+t0 t1 2
+t0 treil 1
+t0 treil t1 1
+t0 wh remov 1
+t00 3
+t00 and posit 1
+t00 at sa 1
+t00 int t0 2
+t00 pr 1
+t00 pr t0 1
+t00 t0 1
+t00 wh 1
+t00 wh oe 1
+t01 1
+t02 1
+t1 38
+t1 2ff 1
+t1 and a2 1
+t1 and compl 1
+t1 and t2 6
+t1 backbon 1
+t1 backbon illustr 1
+t1 backbon network 1
+t1 c2 1
+t1 cn 1
+t1 csvm 1
+t1 csvm distribut 1
+t1 del 1
+t1 e1 1
+t1 e1 e2 1
+t1 et t2 1
+t1 ha equiv 1
+t1 is enabl 1
+t1 is giv 1
+t1 is reduc 1
+t1 j1 1
+t1 j1 t2 1
+t1 or t2 1
+t1 r1 1
+t1 s1 1
+t1 s2 2
+t1 s2 t2 1
+t1 satisf 2
+t1 satisf c1 1
+t1 satisf t1 1
+t1 t t2 1
+t1 t1 1
+t1 t2 4
+t1 t2 becom 1
+t1 t2 intuit 1
+t1 t2 jt1 1
+t1 tak 1
+t1 tetrahedr 1
+t1 that satisf 1
+t1 tn 1
+t1 to rec 1
+t1 to u1 1
+t1 top 1
+t1 tp 1
+t1 treil 1
+t1 treil t2 1
+t1 u1 1
+t1 u2 1
+t1 v2 1
+t1 wh vocabl 1
+t1 which import 1
+t1 wil becom 1
+t11 1
+t12 1
+t12 tetrahedr 1
+t12 ver 1
+t1t0 1
+t1t2 2
+t1t2 d u1 1
+t1t2 u1 1
+t1t2t3a12ap1pwpwp2w2t3t3t2t1w1 1
+t1t2t3t4ai 1
+t1t2test 1
+t1t2test test 1
+t1t2test test t1t2 1
+t1v1 1
+t2 28
+t2 act 1
+t2 ar span 1
+t2 at proc 1
+t2 becom 1
+t2 begin 1
+t2 both traver 1
+t2 by fact 1
+t2 c1 1
+t2 c2ss2 1
+t2 denot 1
+t2 differ 1
+t2 f a1 1
+t2 in oe2 1
+t2 in oe3 1
+t2 int simil 1
+t2 intuit 1
+t2 is consider 1
+t2 is modif 1
+t2 j2 1
+t2 j2 i1 1
+t2 jt1 1
+t2 le 1
+t2 le treil 1
+t2 or t12 1
+t2 or t3 1
+t2 p t3 1
+t2 rreq 1
+t2 rreq rreq 1
+t2 se 1
+t2 se w1 1
+t2 shown 1
+t2 ss2 1
+t2 t1 3
+t2 t1 2ff 1
+t2 t2 1
+t2 tetrahedr 1
+t2 that satisf 1
+t2 that t2 1
+t2 that tk 1
+t2 that us 1
+t2 then check 1
+t2 ti 1
+t2 to produc 1
+t2 to t1 1
+t2 to v2 1
+t2 tor 1
+t2 u2 1
+t2 v2 1
+t2n 2
+t2n 1n4 1
+t2t0 1
+t2t3 2
+t2t3 measur 1
+t2t3 prov 1
+t2t3 u1 1
+t2t3 x4 1
+t2t4 1
+t2t4 x5 1
+t3 10
+t3 and t4 1
+t3 or t4 1
+t3 prov 1
+t3 tor 1
+t3d 8
+t3d and approxim 1
+t3d and intel 1
+t3d commun 1
+t3d dashflash 1
+t3d dashflash alewif 1
+t3d for configur 1
+t3d mach 1
+t3d number 1
+t3d show 1
+t3d support 1
+t3d system 4
+t3d system architectur 4
+t3d to val 1
+t3d using 1
+t3e 2
+t3e multiproc 2
+t3g 1
+t3t4 1
+t3t4 prov 1
+t4 5
+t4 and t5 1
+t4 ar replac 1
+t4 dnt 1
+t4 execut 1
+t4 tor 1
+t5 1
+t6g 2
+t6g 2h1 2
+t6g 2h1 email 1
+t91 1
+ta 8
+ta peut 1
+ta peut alor 1
+ta tb 1
+ta tb tc 1
+ta tel 1
+ta tel qu 1
+tab 3
+tab alphc 1
+tab j ver 1
+tabl 77
+tabl a.1 1
+tabl a.1 giv 1
+tabl a.1 softwar 1
+tabl a.16 1
+tabl a.16 thread 1
+tabl a.2 1
+tabl a.2 hardwar 1
+tabl a.2 summariz 1
+tabl a.3 1
+tabl a.3 compar 1
+tabl a.4 1
+tabl a.4 compar 1
+tabl a.4 show 1
+tabl al hold 1
+tabl al report 1
+tabl al show 1
+tabl and ap 1
+tabl and extract 1
+tabl and figur 1
+tabl and segm 1
+tabl and tlb 1
+tabl answer 1
+tabl ar order 1
+tabl ar repr 2
+tabl at run 1
+tabl avec 1
+tabl ba 1
+tabl ba view 1
+tabl below show 2
+tabl best valu 1
+tabl can becom 1
+tabl confirm 1
+tabl contain 1
+tabl correspon 1
+tabl dadr 1
+tabl dadr comp 1
+tabl dadr dev 1
+tabl dadr doiv 1
+tabl dadr instruc 1
+tabl dadr la 1
+tabl dadr pour 1
+tabl de 3
+tabl de atom 1
+tabl de figur 1
+tabl de mat 3
+tabl de pr 1
+tabl def 1
+tabl don 1
+tabl don aus 1
+tabl don la 1
+tabl entr 4
+tabl entr requir 1
+tabl equ 1
+tabl etc 1
+tabl for ca 1
+tabl for figur 1
+tabl fournit 1
+tabl fournit le 1
+tabl fram 1
+tabl gen 1
+tabl gener 1
+tabl hard loc 1
+tabl hash 1
+tabl ii 1
+tabl in acc 1
+tabl in figur 2
+tabl in ma 1
+tabl in term 1
+tabl ind 1
+tabl is gener 1
+tabl is learn 1
+tabl is modif 1
+tabl is shar 1
+tabl is st 1
+tabl iv 1
+tabl ix 1
+tabl ix explain 1
+tabl le 1
+tabl le inform 1
+tabl loc 1
+tabl lookup 4
+tabl lookup algorithm 1
+tabl lookup tim 1
+tabl modl 1
+tabl of cont 2
+tabl of dat 1
+tabl of link 1
+tabl of number 1
+tabl of privileg 1
+tabl of run 1
+tabl of siz 1
+tabl of sourc 1
+tabl of spf 1
+tabl of train 1
+tabl of uniform 1
+tabl record 1
+tabl report 1
+tabl repr 1
+tabl repr individu 1
+tabl show 4
+tabl shown 1
+tabl simultan 1
+tabl specif 1
+tabl start 1
+tabl sub 1
+tabl sub modl 1
+tabl subject 1
+tabl subject answer 1
+tabl summariz 1
+tabl tabl 1
+tabl tabl ye 1
+tabl th assoc 1
+tabl th result 1
+tabl that contain 1
+tabl that report 1
+tabl thread 1
+tabl thread vect 1
+tabl to se 1
+tabl to st 2
+tabl vi 1
+tabl we giv 1
+tabl we se 1
+tabl wer conduc 1
+tabl wh 1
+tabl which prov 1
+tabl would look 1
+tabl ye 1
+tableau 4
+tableau 2d 1
+tableau a acc 1
+tableau a appart 1
+tableau a dan 1
+tableau a de 1
+tableau a deux 1
+tableau a en 1
+tableau a est 1
+tableau a jusqu 1
+tableau a ne 1
+tableau a pag 1
+tableau a qu 1
+tableau a.1 1
+tableau a.2 1
+tableau a.2 illustr 1
+tableau a.3 1
+tableau a.3 don 1
+tableau a.3 quon 1
+tableau a.4 1
+tableau acc 1
+tableau acc ed 1
+tableau b caract 1
+tableau b est 1
+tableau compr 1
+tableau containm 1
+tableau dan 1
+tableau dan le 1
+tableau de 3
+tableau de dim 1
+tableau de don 1
+tableau de liaison 1
+tableau don 1
+tableau en 1
+tableau en sous 1
+tableau es 1
+tableau es align 1
+tableau est 1
+tableau est stock 1
+tableau multidimensionnel 1
+tableau ne 1
+tableau ne sont 1
+tableau norm 1
+tableau not 1
+tableau par 1
+tableau par de 1
+tableau par un 1
+tableau part 1
+tableau partag 1
+tableau pour 1
+tableau pour obtenir 1
+tableau qu 2
+tableau qu containm 1
+tableau qu naurait 1
+tableau qu program 1
+tableau r ef 1
+tableau sont 1
+tableau sont stock 1
+tableau suiv 1
+tableau sur 1
+tableau sur le 1
+tableau vierg 1
+tableau with bal 1
+tableau with constraint 1
+tableaux 4
+tableaux appart 1
+tableaux appart au 1
+tableaux ci 1
+tableaux ci de 1
+tableaux dan 1
+tableaux dan de 1
+tableaux de 2
+tableaux de dim 1
+tableaux de liaison 1
+tableaux diff 1
+tableaux diff erent 1
+tableaux en 1
+tableaux en ecritur 1
+tableaux est 1
+tableaux et de 1
+tableaux po 1
+tableaux po edant 1
+tableaux qu 1
+tableaux qu program 1
+tableaux quer 1
+tableaux sont 1
+tableaux sont par 1
+tableaux sur 1
+tableaux sur le 1
+tableaux susceptibl 1
+tableaux susceptibl de 1
+tableaux with inequ 1
+tableaux zu 1
+tablir 1
+tabu 2
+tabu search 2
+tac 3
+tac account 1
+tac account object 1
+tac deduc 1
+tac th resourc 1
+tacc 1
+tacc del 1
+tacc del acc 1
+tacit 1
+tacit assum 1
+tackl 9
+tackl optim 1
+tackl th problem 4
+tackl using 1
+tackl using extern 1
+tacpt 1
+tacpt is specif 1
+tacpt v1 1
+tact 1
+tad 1
+tad dt 1
+tad dt ad 1
+taflin 1
+tag 13
+tag and untag 1
+tag and valu 1
+tag approach 1
+tag approach typ 1
+tag architectur 1
+tag architectur av 1
+tag architectur st 1
+tag by gat 1
+tag dat 1
+tag dat word 1
+tag each boolean 1
+tag each el 1
+tag each item 1
+tag field 1
+tag field giv 1
+tag gener 1
+tag gener purp 1
+tag handl 1
+tag handl tag 1
+tag ind 2
+tag instead 1
+tag introduc 1
+tag is correct 1
+tag it neighbor 1
+tag lec 1
+tag lec item 1
+tag mach 1
+tag mak 1
+tag manipl 1
+tag mov 1
+tag nod 1
+tag on atom 1
+tag on dat 1
+tag on pointer 1
+tag part 1
+tag row 1
+tag schem 1
+tag text 1
+tag th me 1
+tag th oper 1
+tag that correct 1
+tag ti 1
+tag tok 1
+tag tok dat 1
+tag tok dataflow 1
+tag tok dynam 1
+tag untyp 1
+tag valu 1
+tag valu multiplexer 1
+tag var 1
+tag variabl 1
+tag with rel 1
+tag word 1
+tah 1
+taient 1
+taient pa 1
+taient pa concevabl 1
+tail 15
+tail 2r 1
+tail 2r min 1
+tail b1 1
+tail b1 b3 1
+tail c1 1
+tail c1 c2 1
+tail con 1
+tail condu 1
+tail connu 1
+tail d efaut 1
+tail d el 1
+tail d elag 1
+tail dan 1
+tail dan ce 1
+tail danneaux 1
+tail danneaux consid 1
+tail de 4
+tail de 2r 1
+tail de bloc 1
+tail de ce 1
+tail de colon 1
+tail de cop 1
+tail de dealloc 1
+tail de don 2
+tail de el 1
+tail de environ 1
+tail de environ. 1
+tail de la 3
+tail de larbr 1
+tail de lensembl 2
+tail de lentr 1
+tail de lenviron 1
+tail de lespac 1
+tail de lign 1
+tail de obj 1
+tail de pag 1
+tail de partit 1
+tail de patron 1
+tail de pav 1
+tail de point 1
+tail de probl 1
+tail de tableaux 1
+tail de vecteur 1
+tail denviron 1
+tail denviron explicit 1
+tail denviron var 1
+tail diff 1
+tail diff erent 1
+tail dilat 1
+tail dilat perform 1
+tail don 1
+tail don ee 1
+tail du 3
+tail du cod 1
+tail du cub 1
+tail du domain 1
+tail du patron 1
+tail du point 1
+tail du probl 1
+tail du vecteur 1
+tail du voxel 1
+tail dun 3
+tail dun chromosom 1
+tail dun emulateur 1
+tail dun pag 1
+tail en 1
+tail en oct 1
+tail env 1
+tail env correspon 1
+tail env est 1
+tail est 3
+tail est el 1
+tail est fic 1
+tail est nl 1
+tail exact 1
+tail exact du 1
+tail explicit 1
+tail exponentiel 1
+tail exponentiel avec 1
+tail fic 2
+tail fic allou 1
+tail fic appel 1
+tail fic restreint 1
+tail h1 1
+tail import 1
+tail import de 1
+tail init 1
+tail init du 1
+tail instruc 1
+tail insuff 1
+tail insuff pour 1
+tail inv 1
+tail inv sel 1
+tail is suff 1
+tail list 1
+tail m 2l 1
+tail m emoir 1
+tail ma 1
+tail ma est 1
+tail mac 1
+tail mac gain 1
+tail mac moy 1
+tail maxim 2
+tail maxim pour 1
+tail migr 1
+tail migr inv 1
+tail migr sel 1
+tail moy 1
+tail n soit 1
+tail ne 1
+tail ne cr 1
+tail nen 1
+tail nen vaut 1
+tail of distribut 1
+tail of queu 1
+tail optim 1
+tail optim de 1
+tail optim var 1
+tail peut 1
+tail peut etr 1
+tail propr 1
+tail propr etair 1
+tail recur 2
+tail recur elim 1
+tail recur optim 1
+tail should start 1
+tail signif 1
+tail siz 1
+tail sur 1
+tail t fic 1
+tail tail 1
+tail tot 1
+tail tot de 1
+tail var 1
+tail var don 1
+tail var entr 1
+tailler 1
+tailler le 1
+tailler le op 1
+tailor 10
+tailor explan 1
+tailor for sourc 1
+tailor it learn 1
+tailor of concur 1
+tailor to suit 1
+tailor to triangl 1
+tain 1
+tain th vol 1
+taip 1
+tair 1
+tair propr 1
+tair propr tair 1
+tait 2
+tait and martin 1
+tait le 1
+tait le meilleur 1
+taiwan 1
+tak 109
+tak a cl 1
+tak a closer 1
+tak a conserv 1
+tak a differ 1
+tak a distribut 1
+tak a funct 1
+tak a gener 1
+tak a great 1
+tak a label 1
+tak a lin 2
+tak a list 1
+tak a method 1
+tak a pair 1
+tak a port 1
+tak a proc 1
+tak a procedur 1
+tak a singl 1
+tak a slight 2
+tak a slot 1
+tak a tcp 1
+tak a top 1
+tak a tot 1
+tak a vect 2
+tak account 5
+tak act 1
+tak adv 17
+tak an algebr 1
+tak an altern 1
+tak an ec 1
+tak an exampl 2
+tak an imag 1
+tak an init 1
+tak an input 1
+tak an integer 1
+tak an object 1
+tak an over 1
+tak an unsort 1
+tak any act 1
+tak any row 1
+tak any sourc 1
+tak any xi 1
+tak appropr 1
+tak appropr act 1
+tak approxim 1
+tak argum 1
+tak as ec 1
+tak as evid 1
+tak as input 4
+tak as parameter 1
+tak at currnod 1
+tak ba 1
+tak ba sequ 1
+tak by ver 1
+tak car 5
+tak cl 1
+tak cod 1
+tak compon 1
+tak con 1
+tak con dec 1
+tak correct 1
+tak correct act 1
+tak d maxfd 1
+tak dec 1
+tak dep 1
+tak differ perspectiv 1
+tak discr 1
+tak discr co 1
+tak dramat 1
+tak dramat smaller 1
+tak effect 1
+tak equ 1
+tak equ amount 1
+tak fl 1
+tak fl adv 1
+tak for grant 1
+tak forml 1
+tak four sequ 1
+tak from appropr 1
+tak from neuron 1
+tak from tabl 2
+tak further 1
+tak further adv 1
+tak glob 1
+tak glob an 1
+tak hit 1
+tak hit rat 1
+tak hour 1
+tak imag 1
+tak in recent 1
+tak in rever 1
+tak infinit 1
+tak infinit comput 1
+tak int account 22
+tak int consider 5
+tak it valu 1
+tak key 1
+tak key fkm 1
+tak le comput 1
+tak le proc 1
+tak le tim 1
+tak lin 3
+tak lin tim 3
+tak longer 3
+tak month 1
+tak n input 1
+tak near 1
+tak nec 1
+tak nec act 1
+tak no argum 1
+tak no longer 1
+tak no tim 1
+tak nod 1
+tak nod siz 1
+tak on ad 1
+tak on cycl 1
+tak on neg 1
+tak on step 1
+tak onl tim 1
+tak our inform 1
+tak out targ 1
+tak pa 1
+tak pa ring 1
+tak parallel 1
+tak parallel profil 1
+tak part 1
+tak part2 1
+tak part2 learn 1
+tak path 1
+tak pen 1
+tak pen input 1
+tak plac 17
+tak point 1
+tak polynom 4
+tak polynom tim 4
+tak prec 1
+tak qu 1
+tak qu na 1
+tak respon 1
+tak rough 2
+tak run 1
+tak signif 2
+tak signif longer 1
+tak som strict 1
+tak som tim 1
+tak t arbitr 1
+tak t0 1
+tak t00 1
+tak targ 1
+tak targ valu 1
+tak th agent 1
+tak th aquarius 1
+tak th assoc 1
+tak th ba 1
+tak th boolean 1
+tak th bound 1
+tak th branch 1
+tak th cl 1
+tak th cr 1
+tak th de 1
+tak th delaun 1
+tak th ec 1
+tak th entir 1
+tak th equiv 1
+tak th exper 1
+tak th expon 1
+tak th fact 1
+tak th form 3
+tak th id 1
+tak th lack 1
+tak th logarithm 1
+tak th maxim 1
+tak th minim 1
+tak th modif 1
+tak th neg 1
+tak th oe 1
+tak th optim 1
+tak th parameter 1
+tak th path 1
+tak th period 1
+tak th plac 1
+tak th prev 1
+tak th reader 1
+tak th respon 2
+tak th result 2
+tak th se 1
+tak th sigm 1
+tak th squar 1
+tak th stream 1
+tak th string 1
+tak th structur 1
+tak th system 1
+tak th tim 1
+tak th tr 1
+tak th usu 1
+tak th valu 1
+tak that branch 1
+tak that collect 1
+tak then tim 1
+tak tim 8
+tak tim learn 1
+tak tim tx 1
+tak to allev 1
+tak to allow 1
+tak to av 1
+tak to ch 1
+tak to compl 1
+tak to detect 1
+tak to ensur 1
+tak to execut 1
+tak to extract 1
+tak to handl 1
+tak to ind 1
+tak to loc 1
+tak to perform 1
+tak to proc 1
+tak to produc 1
+tak to refer 1
+tak to respon 1
+tak to simil 1
+tak to solut 1
+tak to transfer 2
+tak to travel 1
+tak together appear 1
+tak tsep 1
+tak turn 1
+tak turn read 1
+tak tw 1
+tak tw argum 1
+tak tw ba 1
+tak tw cycl 1
+tak tw el 1
+tak tw minut 1
+tak tw pa 1
+tak tw procedur 1
+tak tw pur 1
+tak tw separ 1
+tak unit 1
+tak unit tim 1
+tak upt 1
+tak v step 1
+tak valu 1
+tak with respect 1
+tak with sl1 1
+tak year 1
+tak you closer 1
+takahash 1
+takan 2
+takan young 1
+takan young pi 1
+takash 1
+takash masud 1
+takefuj 1
+takefuj le 1
+takeover 1
+takeuch 3
+takeuch funct 1
+taku 1
+taku watanab 1
+tal 2
+tal of debug 1
+talk 13
+talk about build 1
+talk about clean 1
+talk about fic 1
+talk fr 1
+talk read 1
+talk with technolog 1
+tam 3
+tam as follow 1
+tam deal 1
+tam is giv 1
+tam langu 1
+tam log 1
+tam log langu 1
+tam model 1
+tam refin 1
+tam refin calculus 1
+tam specif 1
+tam syntac 1
+tam techn 1
+tam techn not 1
+tam to inclus 1
+tam wa giv 1
+tamer 1
+tamer ozsu 1
+tamir 1
+taml 1
+tampon 1
+tan 2
+tan76 1
+tanak 3
+tand 2
+tand qu 2
+tand qu cel 1
+tand qu h1 1
+tand qu la 1
+tand qu le 1
+tandem 2
+tandem offer 1
+tang 9
+tang correspon 1
+tang correspon dan 1
+tang en 1
+tang en un 1
+tang funct 1
+tang part 1
+tang proper 1
+tang proper part 1
+tangu 1
+tangu ri 1
+tangu ri po 1
+tank 1
+tansel 2
+tansel et al 1
+tansel is part 1
+tanselb 1
+tant 4
+tant au 1
+tant au niveau 1
+tant cl 1
+tant dan 1
+tant dan le 1
+tant dan un 1
+tant de 1
+tant de lordr 1
+tant du 1
+tant du point 1
+tant el 1
+tant en 2
+tant en ce 1
+tant en temp 1
+tant est 1
+tant est qu 1
+tant il 1
+tant il produit 1
+tant invar 1
+tant la 1
+tant la cel 1
+tant lenviron 1
+tant lenviron qu 1
+tant mat 1
+tant mat eriel 1
+tant pour 1
+tant pour la 1
+tant qu 3
+tant qu claus 1
+tant qu fant 1
+tant qu la 1
+tant qu mach 1
+tant qu param 1
+tant qu t2 1
+tant qu var 1
+tant quappl 1
+tant quappl lin 1
+tant quil 1
+tant quil ny 1
+tant quinstruc 1
+tant rig 1
+tap 10
+tap and cod 1
+tap de 1
+tap de neur 1
+tap del 1
+tap del lin 1
+tap del memor 1
+tap for an 1
+tap se 1
+tap soft87 1
+tap suiv 1
+tap suiv con 1
+tap suiv consister 1
+tap suiv est 1
+tap tur 1
+tap tur mach 1
+tap using 1
+tap wavel 1
+tap wavel filter 1
+tap which contain 1
+taper 1
+taper light 1
+taper light beam 1
+tapsoft91 1
+tarau 1
+tarau dan 1
+tarau dan son 1
+tarau et neumerkel 1
+tarau ment 1
+tarau ment tr 1
+tard 2
+targ 33
+targ act 1
+targ ad 2
+targ addr 2
+targ appl 2
+targ ar 1
+targ ar contain 1
+targ architectur 1
+targ at european 1
+targ cl 1
+targ commun 1
+targ compiler 1
+targ computer 1
+targ context 1
+targ del 1
+targ del var 1
+targ do temp 1
+targ domain 1
+targ dr 1
+targ ent 1
+targ ent specif 1
+targ fact 1
+targ for low 1
+targ for mimicr 1
+targ from system 1
+targ group 1
+targ hierarch 1
+targ horizont 1
+targ horizont partit 1
+targ im 1
+targ im subserv 1
+targ im superior 1
+targ imag 1
+targ individu 1
+targ input 1
+targ is giv 1
+targ junior 1
+targ langu 1
+targ level 1
+targ mach 1
+targ map 1
+targ must appear 1
+targ object 1
+targ of control 1
+targ output 2
+targ output label 1
+targ path 1
+targ pattern 1
+targ pe 1
+targ person 1
+targ proc 1
+targ recognit 1
+targ resid 1
+targ rol 1
+targ rol var 1
+targ simp 1
+targ simp run 1
+targ specif 1
+targ specif targ 1
+targ string 1
+targ subgroup 1
+targ subgroup init 1
+targ subgroup remain 1
+targ superior 1
+targ system 4
+targ system correspon 1
+targ system siml 1
+targ to standard 1
+targ to system 1
+targ user 1
+targ user popl 1
+targ v simultan 1
+targ v upd 1
+targ valu 3
+targ valu comput 1
+targ valu rough 1
+targ vect 1
+targ vect con 1
+targ ver 2
+targ ver partit 1
+targ wh 1
+targetk 1
+tarjan 6
+tarnlund 1
+tarsk 3
+tarsk dec 1
+tarsk dec procedur 1
+tarsk fixpoint 2
+tarsk fixpoint theorem 2
+tarsk procedur 1
+tarsk theor 1
+tarsk theorem 1
+task 74
+task a bit 1
+task act 1
+task act proc 1
+task adapt 1
+task adapt learn 1
+task alloc 1
+task and ap 1
+task and engineer 1
+task and me 1
+task and system 1
+task ap 1
+task appear 1
+task approach 1
+task ar conceptu 1
+task ar fr 1
+task ar phy 1
+task ar suit 1
+task ar us 1
+task architectur 1
+task as build 1
+task at hand 1
+task at stag 1
+task being implem 1
+task being proc 1
+task between n0 1
+task by exampl 1
+task can acc 1
+task can enter 1
+task can verif 1
+task categor 1
+task chang 1
+task character 1
+task character seem 1
+task classif 1
+task compl 1
+task complec 1
+task con 2
+task context 1
+task context approach 1
+task context definit 1
+task context determin 1
+task context edit 1
+task context inform 1
+task context seem 1
+task context task 1
+task cost 1
+task cost tok 1
+task def 1
+task dep 2
+task describ 1
+task descript 1
+task descript giv 1
+task differ 1
+task difficult 1
+task div 1
+task domain 2
+task driv 1
+task forc 1
+task from comput 1
+task from sect 1
+task graph 1
+task ha chang 1
+task hav arriv 1
+task in ar 1
+task in computer 1
+task in homework 1
+task in knowledg 1
+task in prob 1
+task in transact 1
+task involut 1
+task is defin 1
+task is demonstr 1
+task is execut 1
+task is fin 1
+task is non 1
+task is perform 1
+task is repeat 1
+task is resum 1
+task is seen 1
+task is shown 1
+task is solut 1
+task is succ 1
+task is susp 1
+task is unlik 1
+task knowledg 1
+task knowledg specif 1
+task level 2
+task lik diagn 1
+task model 1
+task model mechan 1
+task mor quick 1
+task must start 1
+task must wait 1
+task nod 2
+task of acc 1
+task of ascertain 1
+task of autom 1
+task of construc 1
+task of design 2
+task of detect 1
+task of eff 2
+task of enumer 1
+task of funct 1
+task of guar 1
+task of job 1
+task of know 1
+task of layout 1
+task of learn 2
+task of maintain 2
+task of natur 1
+task of parallel 1
+task of pin 1
+task of post 1
+task of prepar 1
+task of produc 1
+task of quest 1
+task of repr 1
+task of retrief 1
+task of search 1
+task of sort 1
+task of st 1
+task of system 1
+task of textur 1
+task of track 1
+task of transform 1
+task of writ 1
+task ont abstract 1
+task or group 1
+task orient 1
+task orient act 1
+task orient explan 1
+task perform 1
+task po 1
+task prov 1
+task prov inform 1
+task queu 1
+task receiv 1
+task redund 1
+task relev 1
+task relev inform 1
+task requir 1
+task respect 1
+task respon 1
+task return 1
+task schedl 1
+task shar 1
+task simpler 1
+task specif 2
+task specif regl 1
+task structur 1
+task system 1
+task tackl 1
+task tak 1
+task th exper 1
+task th reader 1
+task th user 1
+task that mcgrath 1
+task that requir 1
+task to predict 1
+task tpt 1
+task tr 1
+task typ 1
+task typ classif 1
+task usag 1
+task usag inform 1
+task user 1
+task user perform 1
+task ver eff 1
+task wa mad 1
+task we want 1
+task when confront 1
+task with exact 1
+task5 1
+taskspecif 1
+taskspecif input 1
+taskspecif input conv 1
+taskuser 1
+tasum 1
+tat 3
+tat and smith 1
+tat de 1
+tat de lart 1
+tatb 1
+tatb 2fic 1
+tatb 2fic overhead 1
+tatp 1
+taught 2
+taught prolog 1
+taught to stud 1
+taur 1
+taur and akinor 1
+taurus 1
+taurus boifn 1
+taurus boifn alph 1
+tautolog 1
+tautolog claus 1
+taux 3
+taux de 2
+taux de chang 1
+taux de cr 1
+taux de la 2
+taux de mut 1
+taux elev 1
+taux import de 1
+taux moy 1
+taux moy dutil 1
+taux respectif 1
+taxinom 1
+taxinom de 1
+taxinom de flyn 1
+taxonom 6
+taxonom of link 1
+taxonom of network 1
+taxonom of plant 1
+taxonom of problem 1
+taxonom of resourc 1
+taxonom of sem 1
+taxonom of tim 1
+taxonom rel 1
+taxonom solut 1
+taylor 9
+taylor and franc 1
+taylor dan 1
+taylor dan le 1
+taylor expan 1
+taylor na 1
+taylor na toutef 1
+taylor ser 1
+taylor ser expan 1
+tb 4
+tb correspon 1
+tb correspon au 1
+tb en 1
+tb en ce 1
+tb est 1
+tb est strict 1
+tb et bp 1
+tb et la 1
+tb for larger 1
+tb introduit 1
+tb introduit de 1
+tb rest 1
+tb rest const 1
+tb se 1
+tb se comport 1
+tb tc 1
+tbd1 1
+tbd2 1
+tblh1 1
+tblh2 1
+tbmac 1
+tbroadcast 1
+tc 12
+tc 10ns 2
+tc 10ns lead 2
+tc 1g 1
+tc 1j 1
+tc 1j 4n 1
+tc 1j 4nt 1
+tc 1t 1
+tc 1wi 1
+tc 50ns 2
+tc 5gb 2
+tc denot 1
+tc do step 1
+tc et de 1
+tc l te 1
+tc microsecon 1
+tc o 2ff 1
+tc o 3ff 1
+tc t3 1
+tc temp 1
+tc temp de 1
+tc var 1
+tc var entr 1
+tc waikat.ac.nz 1
+tc wil captur 2
+tc2000tm 1
+tc2000tm computer 1
+tcc 1
+tcc newsletter 1
+tccf 1
+tchu 1
+tcm 1
+tcoh 1
+tcoh t3t4 1
+tcoh t3t4 prov 1
+tcol 1
+tcol bound 1
+tcol log 1
+tcol log mn 1
+tcol logn 1
+tcom 4
+tcom incr 1
+tcom incr lin 1
+tcom involut 1
+tcom is se 1
+tcom simultan 1
+tcommun 1
+tcommun cc 1
+tcommun k cc 1
+tcommun tloc 1
+tcommun tloc tresult 1
+tcomp 1
+tcomp and tcom 1
+tcomp tcom 1
+tcomp tcom involut 1
+tconf 1
+tconf and tsclr 1
+tconf of enter 1
+tconf of leav 1
+tcost 1
+tcost tr 1
+tcp 3
+tcp do ec 1
+tcp from shorter 1
+tcp of length 1
+tcp sock 1
+tcp with minim 1
+tcp x2 1
+tcp xnew2 1
+tcw 1
+td 7
+td appear 1
+td as bin 1
+td in argum 1
+td infer 1
+td lh 1
+td say 1
+td show 1
+td td 1
+td1 1
+tdb 1
+tdbm 1
+tdbm support 1
+tdbm support non 1
+tdec 1
+tdec employeeunpack 1
+tdfg 1
+tdfg ar us 1
+tdfg ba 1
+tdfg dur synth 1
+tdfg for eff 1
+tdfg from vhdl 1
+tdfg nod 1
+tdfg synchron 1
+tdfg vi oper 1
+tdfg wa deriv 1
+tdfg wait 1
+tdfg wait nod 1
+tdfg we repr 1
+tdfg wel suit 1
+tdh92 1
+tdj 1
+tdj ir 1
+tdk 1
+tdmac 1
+tdn 2
+tdn impl 1
+tdn td 1
+tdn td td 1
+tdn to differ 1
+tdsp 1
+tdsp minim 1
+te 8
+te acc 1
+te b de 1
+te bien 1
+te cs.ucsb.edu 2
+te de 1
+te de la 1
+te du 1
+te en 1
+te en critur 1
+te en lectur 1
+te trol 1
+te. 1
+te90 1
+teach 6
+teach a novel 1
+teach a recur 1
+teach and train 1
+teach approach 1
+teach approach outlin 1
+teach as part 1
+teach computer 1
+teach computer computer 1
+teach environm 1
+teach forc 1
+teach goal 1
+teach is car 1
+teach may dec 1
+teach may prov 1
+teach object 1
+teach object orient 1
+teach of computer 1
+teach our method 1
+teach particip 1
+teach program 1
+teach project 1
+teach project using 1
+teach psycholog 1
+teach scenar 1
+teach sign 1
+teach th ba 1
+teach th demeter 1
+team 8
+team and affin 1
+team design 1
+team dur co 1
+team of collabor 1
+team of newstuff 1
+team of peopl 1
+team should work 1
+teatin 1
+tech 14
+tech from september 1
+tech mobil 1
+tech mobil robot 1
+tech periph 2
+tech periph tech 2
+tech pincount 2
+tech report 3
+tech report crl90 1
+techn 94
+techn and manager 1
+techn appl 2
+techn articl 1
+techn aspect 1
+techn bar 2
+techn capabil 1
+techn com 3
+techn com x3h5 1
+techn compl 1
+techn contribut 1
+techn conv 2
+techn definit 1
+techn detail 4
+techn dev 1
+techn developm 2
+techn diagn 1
+techn differ 1
+techn docum 1
+techn domain 1
+techn domain concentr 1
+techn field 1
+techn group 1
+techn implem 1
+techn issu 2
+techn journ 1
+techn lem 2
+techn mathemat 2
+techn mem 1
+techn model 1
+techn not 5
+techn paper 1
+techn problem 1
+techn progr 1
+techn proof 1
+techn proof tool 1
+techn proper 1
+techn quest 1
+techn quest remain 1
+techn reason 1
+techn refer 1
+techn reforml 1
+techn report 81
+techn report adag 1
+techn report anl 1
+techn report ca 1
+techn report cd 1
+techn report ceng 1
+techn report ci 1
+techn report coin 1
+techn report crcc 1
+techn report crpc 1
+techn report cs 11
+techn report cs94 1
+techn report csc 1
+techn report csd 2
+techn report csm 1
+techn report csr 1
+techn report cu 1
+techn report di 1
+techn report doc 1
+techn report dp 1
+techn report ec 2
+techn report fk 2
+techn report fn 1
+techn report gg24 1
+techn report git 2
+techn report informatik 1
+techn report jhu 1
+techn report kf 1
+techn report la 1
+techn report lp 1
+techn report mi 1
+techn report msu 1
+techn report mt 1
+techn report nr 1
+techn report nu 1
+techn report number 2
+techn report occ 1
+techn report osu 5
+techn report prg 1
+techn report qutnrc 1
+techn report r93 1
+techn report rc 1
+techn report ric 1
+techn report rj5244 1
+techn report rnr 1
+techn report rr 1
+techn report ruu 1
+techn report sand88 1
+techn report sand92 1
+techn report sand93 2
+techn report sc 1
+techn report ser 1
+techn report sf 1
+techn report sg 1
+techn report sr 2
+techn report src 2
+techn report t91 1
+techn report tcm 1
+techn report td 1
+techn report techn 2
+techn report tr 8
+techn report tr91 2
+techn report tr93 1
+techn report trc 1
+techn report ucsc 1
+techn report uiucdc 2
+techn report umiac 4
+techn report uuc 1
+techn report uw 1
+techn report yc 1
+techn review 1
+techn sum 4
+techn support 1
+techn support center 1
+techn th involut 1
+techn th mean 1
+techn tool 1
+techn univer braunschweig 1
+techn whit 1
+techn whit paper 1
+techn.report 1
+techn.report cs.anu.edu.au 1
+technik 1
+techniqu 92
+techniqu a du 1
+techniqu a pour 1
+techniqu a se 1
+techniqu actu 1
+techniqu actuel 1
+techniqu actuel util 1
+techniqu addr 1
+techniqu afin 1
+techniqu afin de 1
+techniqu al prov 1
+techniqu allow 2
+techniqu alread disc 1
+techniqu an 1
+techniqu an ca 1
+techniqu and appl 1
+techniqu and arithm 1
+techniqu and assoc 1
+techniqu and compar 1
+techniqu and garb 1
+techniqu and mach 1
+techniqu and system 1
+techniqu and tool 1
+techniqu and trap 1
+techniqu ap 1
+techniqu appl 1
+techniqu appliqu 1
+techniqu appliqu ee 1
+techniqu ar alik 1
+techniqu ar dep 1
+techniqu ar describ 1
+techniqu ar implem 1
+techniqu ar inadequ 1
+techniqu ar nec 1
+techniqu ar said 1
+techniqu ar shown 1
+techniqu as evolut 1
+techniqu au 1
+techniqu au sein 1
+techniqu aut 1
+techniqu aut de 1
+techniqu avail 2
+techniqu avail quick 1
+techniqu ba 6
+techniqu being develop 1
+techniqu bien 1
+techniqu bien connu 1
+techniqu by implem 1
+techniqu by reduc 1
+techniqu cal fault 1
+techniqu cal loc 1
+techniqu can achief 1
+techniqu can affin 1
+techniqu can bring 1
+techniqu can compl 1
+techniqu can exploit 1
+techniqu can form 1
+techniqu can reduc 1
+techniqu can signif 1
+techniqu cannot establ 1
+techniqu cannot prov 1
+techniqu ch 1
+techniqu cit 1
+techniqu classiqu 2
+techniqu classiqu dan 1
+techniqu classiqu de 1
+techniqu classiqu destampil 1
+techniqu classiqu doptim 1
+techniqu classiqu tel 1
+techniqu combin 1
+techniqu con 1
+techniqu cur 1
+techniqu d echantillon 1
+techniqu d elag 1
+techniqu d elim 1
+techniqu d evelop 2
+techniqu dacquisit 1
+techniqu dacquisit dim 1
+techniqu dacquisit relativ 1
+techniqu dam 1
+techniqu dam elior 1
+techniqu dan 1
+techniqu dan glob 1
+techniqu de 5
+techniqu de bloc 1
+techniqu de branch 1
+techniqu de calcl 1
+techniqu de compil 1
+techniqu de compr 1
+techniqu de gest 2
+techniqu de hach 1
+techniqu de la 1
+techniqu de mi 1
+techniqu de modif 1
+techniqu de par 1
+techniqu de part 1
+techniqu de partit 1
+techniqu de rec 1
+techniqu de regroup 1
+techniqu de restructur 1
+techniqu de subdiv 1
+techniqu de tr 1
+techniqu de transform 1
+techniqu de val 1
+techniqu dep 1
+techniqu describ 2
+techniqu destampil 1
+techniqu destampil na 1
+techniqu dexplor 2
+techniqu dexplor partiel 1
+techniqu dexplor stochastiqu 1
+techniqu dextract 1
+techniqu dextract de 1
+techniqu differ 1
+techniqu dind 1
+techniqu disc 3
+techniqu div 1
+techniqu dont le 1
+techniqu doptim 3
+techniqu doptim de 1
+techniqu doptim stochastiqu 1
+techniqu doptim sur 1
+techniqu du 3
+techniqu du bootstrap 1
+techniqu du pav 1
+techniqu du web 1
+techniqu ec 2
+techniqu ec cel 1
+techniqu ee 1
+techniqu ee ceg 1
+techniqu emph 1
+techniqu empl 1
+techniqu empl ee 1
+techniqu ensur 1
+techniqu entr 1
+techniqu entr ne 1
+techniqu est 4
+techniqu est appel 1
+techniqu est attr 1
+techniqu est erig 1
+techniqu est fon 1
+techniqu est illustr 1
+techniqu est le 2
+techniqu est util 1
+techniqu etant 1
+techniqu etant la 1
+techniqu evoqu 1
+techniqu evoqu ee 1
+techniqu fa 1
+techniqu fa intervenir 1
+techniqu fac 1
+techniqu for as 1
+techniqu for babel 1
+techniqu for cluster 1
+techniqu for combin 1
+techniqu for compil 1
+techniqu for concur 1
+techniqu for constraint 1
+techniqu for correl 1
+techniqu for dag 1
+techniqu for describ 1
+techniqu for detect 1
+techniqu for evolut 1
+techniqu for extract 2
+techniqu for gener 2
+techniqu for handl 1
+techniqu for implem 1
+techniqu for interior 1
+techniqu for lo 1
+techniqu for loc 1
+techniqu for log 1
+techniqu for main 1
+techniqu for me 1
+techniqu for measur 2
+techniqu for mlp 1
+techniqu for model 2
+techniqu for mult 1
+techniqu for np 1
+techniqu for overlap 1
+techniqu for parallel 1
+techniqu for prec 1
+techniqu for reason 1
+techniqu for reduc 1
+techniqu for regr 1
+techniqu for requir 1
+techniqu for select 1
+techniqu for sequ 1
+techniqu for simplif 1
+techniqu for spat 1
+techniqu for specif 1
+techniqu for test 1
+techniqu for textur 1
+techniqu for trim 1
+techniqu for unweight 1
+techniqu for us 1
+techniqu for visu 1
+techniqu for writ 1
+techniqu from log 1
+techniqu ge 1
+techniqu gener 1
+techniqu habituel 1
+techniqu habituel du 1
+techniqu handl 1
+techniqu hav prov 1
+techniqu hav receiv 1
+techniqu identif 1
+techniqu identif chang 1
+techniqu in conceptu 1
+techniqu in construc 1
+techniqu in direct 1
+techniqu in log 1
+techniqu in order 3
+techniqu in pract 1
+techniqu in sect 1
+techniqu in siml 1
+techniqu in tim 1
+techniqu inclus 1
+techniqu informatiqu 1
+techniqu informatiqu pour 1
+techniqu inspir 1
+techniqu instead 1
+techniqu int pract 1
+techniqu is contain 1
+techniqu is cruc 1
+techniqu is disc 1
+techniqu is eff 1
+techniqu is facilit 1
+techniqu is featur 1
+techniqu is help 1
+techniqu is known 1
+techniqu is lik 1
+techniqu is order 1
+techniqu is pr 1
+techniqu is prop 1
+techniqu is saf 1
+techniqu lik claus 1
+techniqu lik loc 1
+techniqu lik part 1
+techniqu lik polygon 1
+techniqu lik random 1
+techniqu lourd 1
+techniqu lourd dan 1
+techniqu math 1
+techniqu math ematiqu 1
+techniqu may turn 1
+techniqu moin 1
+techniqu moin rad 1
+techniqu motiv 1
+techniqu n ecessair 1
+techniqu na 1
+techniqu nam 1
+techniqu nam domain 1
+techniqu ne 2
+techniqu ne peuv 1
+techniqu ne sont 1
+techniqu non 1
+techniqu non exhaustiv 1
+techniqu nont 1
+techniqu nont pa 1
+techniqu of altern 1
+techniqu of combin 1
+techniqu of consol 1
+techniqu of constraint 1
+techniqu of disk 1
+techniqu of fredrickson 1
+techniqu of funct 1
+techniqu of gener 1
+techniqu of key 1
+techniqu of loc 1
+techniqu of loop 1
+techniqu of macr 1
+techniqu of me 1
+techniqu of parameter 1
+techniqu of reflect 1
+techniqu of sect 1
+techniqu of shap 1
+techniqu of solut 1
+techniqu of spec 1
+techniqu of strong 1
+techniqu of theorem 1
+techniqu of using 1
+techniqu oft retain 1
+techniqu om 1
+techniqu om test 1
+techniqu ont 1
+techniqu ont chacun 1
+techniqu originel 1
+techniqu originel de 1
+techniqu over finit 1
+techniqu plac 1
+techniqu plus complec 1
+techniqu pot 1
+techniqu pour 1
+techniqu pour traiter 1
+techniqu pr 2
+techniqu pr ec 1
+techniqu pr esent 1
+techniqu pract 1
+techniqu prev 1
+techniqu proceed 1
+techniqu proch 1
+techniqu proch de 1
+techniqu prom 1
+techniqu promot 1
+techniqu promot softwar 1
+techniqu prop 2
+techniqu prov 2
+techniqu qu 2
+techniqu qu ne 1
+techniqu qu pour 1
+techniqu qualit 1
+techniqu qualit de 1
+techniqu quantit 1
+techniqu quantit de 1
+techniqu quantit dit 1
+techniqu quantit qu 1
+techniqu r eal 1
+techniqu r edu 1
+techniqu r esid 1
+techniqu rc11506 1
+techniqu rc11552 1
+techniqu rec 1
+techniqu rec ee 1
+techniqu recur 1
+techniqu reduc 1
+techniqu rel 1
+techniqu requir 2
+techniqu rest 1
+techniqu rest int 1
+techniqu result 1
+techniqu sappu 1
+techniqu sappu princip 1
+techniqu seem 1
+techniqu sel 1
+techniqu select 1
+techniqu select exact 1
+techniqu select test 1
+techniqu ser 1
+techniqu ser illustr 1
+techniqu simil 4
+techniqu similair 1
+techniqu similair est 1
+techniqu simpl 2
+techniqu simpl de 1
+techniqu simpl perm 1
+techniqu simplif 1
+techniqu sont 2
+techniqu sont combin 1
+techniqu sont triv 1
+techniqu sp 1
+techniqu sp ecifiqu 1
+techniqu suffer 1
+techniqu sug 1
+techniqu sug er 1
+techniqu support 1
+techniqu sur 2
+techniqu sur le 1
+techniqu sur un 1
+techniqu tel 1
+techniqu tel qu 1
+techniqu th dub 1
+techniqu that mim 1
+techniqu that prov 1
+techniqu that reduc 1
+techniqu that requir 1
+techniqu that select 1
+techniqu to achief 1
+techniqu to ar 2
+techniqu to classif 1
+techniqu to cr 1
+techniqu to decluster 1
+techniqu to def 1
+techniqu to design 1
+techniqu to detect 1
+techniqu to determin 1
+techniqu to develop 1
+techniqu to dimin 1
+techniqu to ensur 1
+techniqu to evolut 1
+techniqu to funct 1
+techniqu to guid 1
+techniqu to help 1
+techniqu to init 1
+techniqu to keep 1
+techniqu to mak 1
+techniqu to mask 1
+techniqu to model 1
+techniqu to obtain 2
+techniqu to optim 1
+techniqu to overcom 1
+techniqu to prov 1
+techniqu to reduc 1
+techniqu to ref 1
+techniqu to select 1
+techniqu to solut 1
+techniqu to transform 1
+techniqu tr 1
+techniqu us 2
+techniqu us logarithm 1
+techniqu using 2
+techniqu using part 1
+techniqu util 1
+techniqu util ee 1
+techniqu vi 1
+techniqu vi metaterm 1
+techniqu wa implem 1
+techniqu we disc 1
+techniqu wh 1
+techniqu wh fault 1
+techniqu which signif 1
+techniqu which sought 1
+techniqu which us 1
+techniqu which work 2
+techniqu work 3
+techniqu yield 1
+techniqu yield order 1
+techniqu1 1
+techniqu2 1
+techniqu4 1
+technisch 9
+technisch anwendung 1
+technisch expertensystem 1
+technisch hochschl 1
+technisch system 1
+technisch system nach 1
+technisch universit 3
+technisch universitat 1
+technisch universitat munch 1
+technisch universiteit 2
+technisch universiteit delft 2
+technisch wiskund 2
+technisch wiskund en 2
+technol. 2
+technolog 62
+technolog advanc 1
+technolog alw super 2
+technolog an incr 2
+technolog and computer 1
+technolog and constraint 2
+technolog and theor 2
+technolog and uniform 2
+technolog ar becom 1
+technolog ar lead 1
+technolog ar offer 1
+technolog ar remark 1
+technolog ar shown 2
+technolog artif 1
+technolog artif intellig 1
+technolog as board 2
+technolog atl 1
+technolog being consider 2
+technolog by minim 1
+technolog can go 2
+technolog can pot 2
+technolog can us 2
+technolog cap 1
+technolog center 2
+technolog center personnel 1
+technolog ch 1
+technolog constraint 3
+technolog de 2
+technolog de ba 1
+technolog de compil 1
+technolog de processeur 1
+technolog deliv 1
+technolog deliv vehicl 1
+technolog develop 1
+technolog dim 1
+technolog direct 1
+technolog div 1
+technolog div u.s 1
+technolog etc 2
+technolog facult 1
+technolog faculteit 2
+technolog faculteit der 2
+technolog for achief 1
+technolog for adv 1
+technolog for design 1
+technolog for mp 1
+technolog for reason 1
+technolog for user 1
+technolog found 1
+technolog from unaccept 1
+technolog ge 2
+technolog ge adv 2
+technolog griffith 1
+technolog ha adv 2
+technolog hav incr 1
+technolog hav led 1
+technolog hav start 1
+technolog hi 1
+technolog hi av.html 1
+technolog in design 3
+technolog in redefin 1
+technolog innov 1
+technolog int tool 1
+technolog interfac 1
+technolog is captur 2
+technolog is grow 2
+technolog issu 1
+technolog issu de 1
+technolog labor 3
+technolog lim 1
+technolog ma 2
+technolog ma technolog 2
+technolog mak 2
+technolog matur 1
+technolog might beat 2
+technolog nat 1
+technolog nat research 1
+technolog of algorithm 1
+technolog of brain 1
+technolog of spat 1
+technolog offer 3
+technolog offer reason 1
+technolog parameter 2
+technolog periph 2
+technolog periph technolog 2
+technolog plan 1
+technolog plan div 1
+technolog repr 1
+technolog requir 1
+technolog respect 2
+technolog sometim langu 1
+technolog stil fal 1
+technolog such approach 1
+technolog technolog 2
+technolog technolog ma 2
+technolog th austr 1
+technolog th kcm 1
+technolog th pin 2
+technolog th surfac 2
+technolog th tot 2
+technolog threshold 1
+technolog to prov 2
+technolog to support 1
+technolog to us 1
+technolog to user 1
+technolog tool 1
+technolog totalsystempin 2
+technolog totalsystempin count 2
+technolog using 1
+technolog which allow 2
+technolog whil dec 2
+technolog wil allow 2
+technolog wil offer 2
+technolog work 1
+technolog zurich 1
+technologiqu 1
+technologiqu de 1
+technologyindep 1
+technologyindep optim 1
+techpaper 1
+techpaper gavin.low 1
+techpaper gavin.low casestudytr.ps.gz 1
+techreport 6
+techreport crl.dec.com 1
+techreport kifer 1
+techreport kifer flog.ps.z 1
+techreport tr93 1
+tect 1
+tect es 1
+tect es sont 1
+tect et la 1
+tecter 1
+tecter le 1
+tecter le point 1
+tecuc 1
+tecuc michalsk 1
+ted 6
+ted ci.ufl.edu 2
+ted ci.ufl.edu computer 1
+ted seiter 1
+ted task 1
+ted to test 1
+ted work 1
+teed 1
+teeth 1
+teitelman 1
+tel 32
+tel algorithm 1
+tel algorithm po 1
+tel appl 1
+tel asser 1
+tel asser peut 1
+tel aviv 1
+tel bil 1
+tel boucl 1
+tel boucl est 1
+tel ca 2
+tel ca de 1
+tel cel 1
+tel cel est 1
+tel combinaison 1
+tel combinaison imp 1
+tel compr 1
+tel condit 1
+tel condit condit 1
+tel configur 1
+tel configur perm 1
+tel conflit 1
+tel conflit quit 1
+tel disjonct 1
+tel elim 1
+tel etat 1
+tel etat de 1
+tel famil 1
+tel gard 1
+tel if fo 1
+tel if system 1
+tel impl 1
+tel impl em 1
+tel in egalit 1
+tel incorpor 1
+tel incorpor el 1
+tel instruc 1
+tel instruc evit 1
+tel it erat 1
+tel laboratoir 1
+tel level 1
+tel liaison 1
+tel list 1
+tel list circulair 1
+tel man 2
+tel matr 1
+tel matr ne 1
+tel minim 1
+tel minim etait 1
+tel net 1
+tel net sourc 1
+tel net workload 1
+tel not 1
+tel pag 1
+tel pag est 1
+tel probl 1
+tel probl em 1
+tel prov 1
+tel q1 1
+tel qu 5
+tel qu 8j 1
+tel qu analyseur 1
+tel qu ce 1
+tel qu chacun 1
+tel qu chaqu 1
+tel qu dan 1
+tel qu deux 1
+tel qu fortran 1
+tel qu hpf 1
+tel qu i1 1
+tel qu i2 1
+tel qu ia 1
+tel qu ji 1
+tel qu la 4
+tel qu lalign 1
+tel qu le 3
+tel qu lensembl 1
+tel qu linaptitud 1
+tel qu maxff 1
+tel qu mk 2
+tel qu neck 1
+tel qu nous 2
+tel qu qk 1
+tel quel 2
+tel quel est 2
+tel quel vient 1
+tel quil 2
+tel quil ec 1
+tel quil est 2
+tel quil ne 1
+tel quil ny 1
+tel quil ren 1
+tel quimpl 1
+tel quimpl ement 1
+tel r ef 1
+tel register 1
+tel register apport 1
+tel repr 1
+tel repr es 1
+tel reproduc 1
+tel reproduc peut 1
+tel s equ 1
+tel sect 1
+tel sect le 1
+tel solut 1
+tel solut sont 1
+tel sort 3
+tel sort qu 3
+tel techniqu 1
+tel th compiler 1
+tel th knowledg 1
+tel th system 1
+tel tr 1
+tel tr dan 1
+tel transform 1
+tel transform etant 1
+tel typ 1
+tel typ involut 1
+tel us prec 1
+tel whether cm 1
+tel worker 1
+telec 4
+telecom 2
+telecom cnet 1
+telecom research 1
+telecom research labor 1
+telecommun 8
+telecommun conferec 1
+telecommun research 1
+telecommun switch 1
+telecommun switch multicast 1
+telecommun system 1
+telecommun system labor 1
+teleconfer 1
+teleconfer wil rel 1
+telefac 1
+teleinformat 1
+telephon 7
+telephon contact 1
+telephon ext 1
+telephon network 1
+telephon network connect 1
+telephon number 2
+telephon or email 1
+telephon switch 1
+telephon switch exchang 1
+telephon switch system 1
+telephon system 1
+telephon traff 1
+teleport 1
+teleport mak 1
+teleport mak appl 1
+teleport user 1
+teleport user interac 1
+teller 2
+teller mach 1
+telmat 1
+telnet 1
+telnet connect 1
+telnet sink 1
+telnet traff 1
+tem. 2
+temam 1
+temp 12
+temp accept 1
+temp cuml 1
+temp d epen 1
+temp d evalu 1
+temp d faut 1
+temp dacc 1
+temp dacc es 1
+temp dan 2
+temp dan diff 1
+temp dan le 1
+temp de 5
+temp de calcl 4
+temp de commencer 1
+temp de commun 1
+temp de converg 1
+temp de diffus 1
+temp de fonct 1
+temp de mach 1
+temp de mettr 1
+temp de parcour 1
+temp de recherch 1
+temp de trait 1
+temp de transfer 1
+temp de transm 1
+temp deffectuer 1
+temp deffectuer plusieur 1
+temp deffectuer tous 1
+temp dic 3
+temp dic cut 1
+temp dic ecut 3
+temp dp 1
+temp dp temp 1
+temp en 1
+temp entr 1
+temp entr deux 1
+temp entr le 1
+temp er 1
+temp er init 1
+temp et en 1
+temp et le 1
+temp et ou 1
+temp et qu 1
+temp exorbit 1
+temp exorbit compt 1
+temp glob 1
+temp glob de 1
+temp iproc 1
+temp la 1
+temp le 1
+temp le nombr 1
+temp moy 1
+temp moy avant 1
+temp n ecessair 1
+temp nous 1
+temp nous allon 1
+temp on dil 1
+temp on effectu 1
+temp pa 2
+temp perdu 1
+temp pg 1
+temp pg en 1
+temp pr 1
+temp pr pr 1
+temp pr router 1
+temp qu 1
+temp qu le 1
+temp qu lestampil 1
+temp quel 1
+temp quel en 1
+temp quen 1
+temp quen espac 1
+temp s equentiel 1
+temp sont 1
+temp sont loc 1
+temp sont tr 1
+temp tot 1
+temp tot dic 1
+temp tr 1
+temp tr es 1
+temp un 1
+temp un transform 1
+temp voulu 1
+temp voulu aux 1
+tempcrit.txt 1
+temper 4
+temper forc 1
+temper is decr 1
+temper is lower 1
+temper is slow 1
+temper t repeat 1
+temper th algorithm 1
+temper wa decr 1
+templ 11
+templ and work 1
+templ ar st 1
+templ ar typ 1
+templ chang 1
+templ concept 1
+templ definit 1
+templ describ 1
+templ descript 1
+templ descript contain 1
+templ direct 1
+templ distribut 1
+templ el 1
+templ el assign 1
+templ el individu 1
+templ el specif 1
+templ facil 1
+templ ge 1
+templ guid 1
+templ in hpf 1
+templ ind 1
+templ inst 1
+templ nam 1
+templ of templ 1
+templ oper 1
+templ or not 1
+templ pattern 1
+templ pattern gener 1
+templ quest 1
+templ shown 1
+templ t1 1
+templ that impl 1
+templ to concentr 1
+templ to imp 1
+templ to proc 1
+templ to st 1
+templ wa compreh 1
+templ wa writ 1
+templog 2
+templog is indep 1
+templog program 1
+templog proof 1
+templog proof procedur 1
+tempor 34
+tempor agent 1
+tempor agent model 1
+tempor al 1
+tempor al eatoir 1
+tempor algebr 1
+tempor algebr expr 1
+tempor algorithm 1
+tempor and geograph 1
+tempor and mod 1
+tempor and spat 3
+tempor approach 1
+tempor aspect 1
+tempor atom 1
+tempor attribut 1
+tempor attribut requir 1
+tempor back propag 1
+tempor bind 1
+tempor bind environm 1
+tempor character 1
+tempor cl 1
+tempor credit 1
+tempor credit assignm 1
+tempor dat 4
+tempor dat belong 1
+tempor datab 5
+tempor datab incr 1
+tempor datab manag 1
+tempor datab quer 1
+tempor datab requir 1
+tempor datab ten 1
+tempor datab theor 1
+tempor datab using 1
+tempor dbm 1
+tempor deduc 2
+tempor deduc datab 2
+tempor dep 1
+tempor dim 2
+tempor domain 1
+tempor est 1
+tempor est cel 1
+tempor ext 1
+tempor fil 1
+tempor framework 1
+tempor goal 1
+tempor ind 2
+tempor interv 3
+tempor knowledg 1
+tempor langu 1
+tempor langu chronolog 1
+tempor log 4
+tempor log langu 1
+tempor log program 2
+tempor match 1
+tempor match involut 1
+tempor match program 1
+tempor measur 1
+tempor measur rel 1
+tempor model 1
+tempor neur 1
+tempor neur network 1
+tempor norm 1
+tempor norm form 1
+tempor oper 2
+tempor oper ad 1
+tempor or perman 1
+tempor order 2
+tempor orient 1
+tempor orient dat 1
+tempor part 1
+tempor pattern 1
+tempor plur 1
+tempor proc 1
+tempor profil 1
+tempor program 1
+tempor prolog 2
+tempor proof 2
+tempor proof system 1
+tempor proper 1
+tempor qu 1
+tempor qu langu 1
+tempor qu proc 1
+tempor quer 2
+tempor re definit 1
+tempor reason 4
+tempor refrain 1
+tempor rel 3
+tempor rel algebr 1
+tempor rel datab 2
+tempor rel model 1
+tempor repr 1
+tempor requir 1
+tempor reus 1
+tempor sampl 1
+tempor sequ 1
+tempor sid 1
+tempor speed 1
+tempor speed up 1
+tempor stochastiqu 1
+tempor stochastiqu du 1
+tempor struc 1
+tempor struc mprus 1
+tempor susp 1
+tempor switch 1
+tempor tupl 1
+tempor turn 2
+tempor un 1
+tempor unit 1
+tempor variabl 1
+temporair 2
+temporair appar 1
+temporair couvr 1
+temporair couvr donc 1
+temporair est 1
+temporair locaux 1
+temporair ne 1
+temporair ne sont 1
+temporair ou 1
+temporair ou perman 1
+temporair perman 1
+temporair perman rest 1
+temporair peut 1
+temporair peut etr 1
+temporair rang 1
+temporair rang ee 1
+temporair sont 1
+temporair sont en 1
+temporel 4
+temporel contenu 1
+temporel contenu dan 1
+temporel d efin 1
+temporel d efinit 1
+temporel de 1
+temporel de appl 1
+temporel de la 1
+temporel doiv 1
+temporel doiv rester 1
+temporel du 1
+temporel du syst 1
+temporel en 1
+temporel en provoqu 1
+temporel est 1
+temporel est ain 1
+temporel et de 1
+temporel et un 1
+temporel n ecessit 1
+temporel ou 1
+temporel ou charger 1
+temporel pour 1
+temporel pour lec 1
+temporel r eutil 1
+temporel rel 1
+temporel si 1
+temporel si il 1
+tempt 4
+tempt to compar 1
+tempt to simp 1
+tempt to st 1
+tempur 1
+ten 54
+ten a acc 1
+ten a atteindr 1
+ten a augmenter 1
+ten a croir 1
+ten a etr 1
+ten a le 1
+ten a montrer 1
+ten a se 1
+ten a utiliser 1
+ten actuel 1
+ten actuel tant 1
+ten and number 1
+ten appl 1
+ten best ca 1
+ten compt 2
+ten compt de 2
+ten day 1
+ten et al 1
+ten for object 1
+ten futur 1
+ten futur ch 1
+ten hour 1
+ten lectur 2
+ten log 2
+ten log ba 2
+ten log program 1
+ten maint 1
+ten maint ver 1
+ten microsecon 1
+ten minut 1
+ten modif 1
+ten modif ver 1
+ten most tim 1
+ten nod 1
+ten of lin 1
+ten of microsecon 2
+ten of system 1
+ten of thousand 2
+ten partit 1
+ten peopl 1
+ten peopl perform 1
+ten perc 1
+ten problem 1
+ten quest 1
+ten ra 1
+ten raster 1
+ten raster techniqu 1
+ten sinver 1
+ten sinver lorsqu 1
+ten smallest 1
+ten smallest problem 1
+ten subject 1
+ten terahertz 1
+ten thousand 1
+ten thousand lin 1
+ten to arch 1
+ten to becom 3
+ten to ben 1
+ten to caus 1
+ten to chang 1
+ten to concentr 1
+ten to cr 1
+ten to decr 2
+ten to degener 1
+ten to differ 1
+ten to disorder 1
+ten to fifteen 2
+ten to foc 2
+ten to forg 1
+ten to ge 1
+ten to gener 1
+ten to hundr 1
+ten to imp 1
+ten to improv 1
+ten to incr 1
+ten to keep 2
+ten to mak 1
+ten to produc 3
+ten to remain 1
+ten to remov 1
+ten to retain 1
+ten to scal 1
+ten to se 1
+ten to stud 1
+ten to suffer 1
+ten to us 1
+ten to util 1
+ten tr 1
+ten variabl 2
+ten ver 1
+ten ver ce 1
+ten verb 1
+ten with respect 1
+ten worst 1
+ten worst ca 1
+ten year 2
+tendr 1
+tendr le 1
+tendr le form 1
+tendu 1
+tendu aux 1
+tendu aux matr 1
+tenenberg 1
+tenet 3
+tenet of genvoc 1
+tenfold 1
+tenfold scal 1
+tenfold scal speed 1
+teng 2
+tenir 2
+tenir compt 2
+tenir compt de 2
+tenon 1
+tenon a remerc 1
+tenseur 1
+tenseur dordr 1
+tensoriel 1
+tensoriel di 1
+tensoriel di rent 1
+tent 7
+tent and prov 1
+tent dan 1
+tent dan du 1
+tent de 4
+tent de mesurer 1
+tent de ranger 1
+tent de se 1
+tent dunif 1
+tent dunif dun 1
+tent e dassouplir 1
+tenter 2
+tenter de 2
+tenter de guider 1
+tenter de minimiser 1
+tenter egal 1
+tenter egal le 1
+tenteron 1
+tenteron n eanmoin 1
+tenth 2
+tenth nat 1
+tenu 2
+tenu de 2
+tenu de ce 1
+tenu de la 2
+tenu de lefficacit 1
+tenu du 1
+tenu du caract 1
+teofil 2
+teor 1
+teoretycznej 1
+teoretycznej i stosowanej 1
+ter 11
+ter affect 1
+ter architectur 2
+ter cl 1
+ter cl model 1
+ter computer 1
+ter computer system 1
+ter smith 1
+ter stroup 1
+ter structur 1
+ter winograd 1
+terab 1
+teraflop 1
+terahertz 1
+term 104
+term 2tn 1
+term 2tn n2 1
+term a funct 1
+term a group 1
+term a un 1
+term a unif 1
+term abstract 2
+term abstract proc 1
+term accept 1
+term act 1
+term ad 1
+term again ad 1
+term aiguil 1
+term aiguil lec 1
+term akl 1
+term akl dan 1
+term among schedl 1
+term an overview 1
+term and atom 1
+term and distinct 1
+term and list 1
+term and reason 1
+term and symbol 1
+term and typ 1
+term ap 1
+term ap simil 1
+term appl 1
+term ar allow 1
+term ar built 1
+term ar defin 1
+term ar deriv 1
+term ar distribut 1
+term ar number 1
+term ar produc 1
+term ar st 2
+term ar transfer 1
+term argum 1
+term as argum 1
+term as consider 1
+term as follow 2
+term as zeroerror 1
+term aspect 1
+term at tim 1
+term aux 1
+term aux term 1
+term bear 1
+term belong 1
+term between symbol 1
+term built 1
+term by correspon 1
+term c1a 1
+term caus 1
+term chang 1
+term com 1
+term com de 1
+term common 1
+term common senior 1
+term comp 1
+term comp e3 1
+term comp es 1
+term comp la 1
+term comparison 1
+term compr 1
+term compr schem 1
+term compreh 1
+term compreh strateg 1
+term condit 1
+term connect 1
+term construc 1
+term contain 2
+term contain abstract 1
+term continu 1
+term control 2
+term control unit 1
+term cop 1
+term cop de 1
+term correspon 3
+term creat 1
+term criter 1
+term criter say 1
+term cycliqu 1
+term cycliqu du 1
+term dacc 1
+term dacc es 1
+term dan 1
+term dan la 1
+term de 4
+term de consom 1
+term de contr 1
+term de format 1
+term de laltern 1
+term de liaison 1
+term de mi 1
+term de pr 1
+term de prolog 1
+term de raccourc 1
+term de regrouper 1
+term de som 1
+term de term 1
+term de transform 1
+term de vit 1
+term deal 1
+term declin 1
+term deep 1
+term deep knowledg 1
+term defin 1
+term defin elsewh 1
+term dep 1
+term detect 1
+term detect problem 1
+term developm 1
+term dit 1
+term dit interpr 1
+term doiv 1
+term doiv etr 1
+term don 1
+term don le 1
+term dont le 1
+term du 2
+term du lang 1
+term du par 1
+term e0 1
+term effect 1
+term egaux 1
+term egaux par 1
+term en 1
+term en argum 1
+term en un 1
+term est 1
+term est appel 1
+term est comp 1
+term est interpr 1
+term est libr 1
+term est un 1
+term et calcl 1
+term et de 2
+term et la 1
+term et le 1
+term et lhabituel 1
+term et unif 1
+term etiqu 1
+term etiqu de 1
+term evalu 1
+term exact 1
+term exact refer 1
+term expon 1
+term fac 2
+term g en 1
+term gel 1
+term giv 1
+term grow 1
+term h con 1
+term hor 1
+term hor diagonaux 1
+term if8 1
+term in as 1
+term in equ 1
+term in finit 1
+term in norm 1
+term in prolog 1
+term in subscript 1
+term incorpor 1
+term infin 1
+term initiaux 1
+term initiaux de 1
+term initiaux nest 1
+term instanc 1
+term instanc es 1
+term interpr 1
+term is annot 1
+term is compl 1
+term is defin 2
+term is ensur 1
+term is simp 1
+term jt 1
+term jt jn0 1
+term kkz 1
+term link 1
+term memor 1
+term minim 1
+term minim typ 1
+term modif 1
+term modif de 1
+term modif fournit 1
+term modif peut 1
+term modifiabl 1
+term modifiabl unif 1
+term must denot 1
+term mutabl 1
+term ne 1
+term ne peut 1
+term ne soit 1
+term nest 1
+term nest pa 1
+term nj2 1
+term nj2 pgcd 1
+term nl 1
+term non 1
+term non exploit 1
+term nonblock 1
+term nsar 1
+term oe 1
+term of absolut 1
+term of acc 2
+term of algorithm 1
+term of altern 1
+term of argum 1
+term of atom 1
+term of bus 1
+term of cal 1
+term of cel 1
+term of celltransm 1
+term of claus 1
+term of complec 1
+term of composit 1
+term of connect 1
+term of cpu 1
+term of del 1
+term of determin 1
+term of diagnost 1
+term of dynam 1
+term of effect 1
+term of en 1
+term of equ 1
+term of euclidean 1
+term of execut 1
+term of expr 2
+term of fair 1
+term of fil 1
+term of gu 1
+term of hardwar 1
+term of implem 1
+term of inter 1
+term of intern 1
+term of lat 1
+term of level 1
+term of lin 1
+term of link 1
+term of maintain 1
+term of match 1
+term of maxim 1
+term of me 3
+term of method 1
+term of minim 1
+term of modl 1
+term of msld 1
+term of number 6
+term of object 1
+term of oper 1
+term of order 1
+term of ordin 1
+term of over 1
+term of p1 2
+term of perform 1
+term of phy 1
+term of point 1
+term of privileg 1
+term of proc 1
+term of program 1
+term of proper 1
+term of realm 1
+term of reduc 1
+term of regl 1
+term of rel 1
+term of relationship 1
+term of repr 1
+term of satur 1
+term of scal 1
+term of scen 1
+term of sen 1
+term of simpl 1
+term of smooth 1
+term of solut 1
+term of sort 1
+term of spac 1
+term of symbol 1
+term of theorem 1
+term of tim 2
+term of topolog 2
+term of tot 3
+term of tp 1
+term of train 1
+term of wam 1
+term of writ 1
+term onl contain 1
+term onl rel 1
+term order 1
+term ordinair 1
+term ordinair soit 1
+term origin 1
+term origin refer 1
+term over variabl 1
+term par 1
+term par cop 1
+term par un 1
+term peut 1
+term peut etr 1
+term pil 1
+term pil refl 1
+term plan 1
+term pr 1
+term pr eec 1
+term predict 1
+term predict behavior 1
+term predict cap 1
+term predict result 1
+term prolog 1
+term prolog standard 1
+term proper 2
+term proper dep 1
+term quelconqu 1
+term r esult 1
+term rationnel 1
+term rationnel est 1
+term recur 1
+term recur rel 1
+term reduc 1
+term reduc system 1
+term reflect 1
+term rel 1
+term remain 1
+term repr 1
+term repr esent 1
+term requ 1
+term resolut 1
+term result 1
+term result car 1
+term resum 1
+term rewrit 4
+term rewrit system 1
+term rewrit techniqu 1
+term rol 1
+term rol privileg 1
+term seq 1
+term seq var 1
+term simpl 1
+term simpl typ 1
+term sl1s 1
+term sl1s vi 1
+term soit 1
+term soit instanc 1
+term sont 1
+term sont repr 1
+term sont unif 1
+term spar 1
+term strip 1
+term strip unit 1
+term subcl 1
+term substitu 1
+term substitu est 1
+term substitu introduit 1
+term substitu par 1
+term substitu se 1
+term substitu term 1
+term substituabl 1
+term substituabl en 1
+term substituabl est 1
+term substituabl peut 1
+term substitut 1
+term succ 2
+term sur 1
+term sur un 1
+term switch 1
+term switch impl 1
+term t built 1
+term t hold 1
+term t qu 1
+term t00 1
+term t1 1
+term ta 1
+term ta peut 1
+term term 2
+term term soit 1
+term th acycl 1
+term th cur 1
+term th extent 1
+term th fit 1
+term th former 1
+term th loc 1
+term th main 1
+term th minim 1
+term th nam 1
+term th nod 1
+term th secon 1
+term that contain 1
+term that evalu 1
+term theorem 1
+term through overlap 1
+term ti 1
+term ti est 1
+term tim 1
+term to appear 1
+term to ch 1
+term to const 1
+term to denot 1
+term to term 1
+term transf 1
+term transform 1
+term transform refer 1
+term u0 1
+term under consider 1
+term unfair 1
+term unif 2
+term unrestrict 1
+term unrestrict rel 1
+term us 1
+term using 1
+term v0 1
+term var 2
+term var decl 1
+term vont 1
+term vont partager 1
+term voron 1
+term voron diagram 1
+term wer equ 1
+term which ad 1
+term which origin 1
+term wil becom 1
+term with explicit 1
+term xp 1
+term xp asser 1
+term zer 1
+term zer error 1
+term2 1
+termecomp 1
+termecomp par 1
+termecomp par nouvelarg 1
+termin 36
+termin a son 1
+termin acc 1
+termin algebr 1
+termin alor 1
+termin alor leur 1
+termin and nontermin 1
+termin and produc 1
+termin and transfer 1
+termin ar attach 1
+termin at maxft1 1
+termin at t1 1
+termin at t2 1
+termin aur 1
+termin aur lieu 1
+termin cal 1
+termin cal instruc 1
+termin cl 1
+termin cl encapsl 1
+termin comput 3
+termin connect 1
+termin correct 1
+termin correspon 1
+termin correspon un 1
+termin dan 1
+termin dan la 1
+termin dan lun 1
+termin de 2
+termin de la 2
+termin du 1
+termin du jacob 1
+termin dun 1
+termin dun grand 1
+termin en 3
+termin en cofacteur 1
+termin en elagu 1
+termin en un 1
+termin est 1
+termin est la 1
+termin est un 1
+termin et de 1
+termin execut 1
+termin execut en 1
+termin in exact 1
+termin inclus 1
+termin inclus workst 1
+termin input 1
+termin input output 1
+termin la 1
+termin le 1
+termin le mach 1
+termin lorsqu 1
+termin nam 1
+termin ne 1
+termin ne le 1
+termin ne veut 1
+termin nest 2
+termin nest pa 1
+termin nod 2
+termin other nod 1
+termin peut 1
+termin ph 1
+termin posit 1
+termin proc 1
+termin pur 1
+termin r eussit 1
+termin rr 1
+termin rr stat 1
+termin si 1
+termin sont 1
+termin sont en 1
+termin sont facil 1
+termin st 1
+termin subcomput 1
+termin subgraph 1
+termin subgraph rang 1
+termin th user 1
+termin un bloc 1
+termin un pav 1
+termin ver 1
+termin when minrol 1
+termin with fin 1
+termin1 1
+terminaux 1
+terminaux non 1
+terminer 3
+terminer eux 1
+terminer la 2
+terminer la cart 1
+terminer la structur 1
+terminer le 1
+terminer le fonctionnalit 1
+terminer lop 1
+terminer lop erat 1
+terminer parm 1
+terminer parm le 1
+termineron 1
+termineron ce 1
+termineron ce paragraph 1
+terminolog 13
+terminolog de 1
+terminolog de la 1
+terminolog dholzbaur 1
+terminolog emprunt 1
+terminolog hold 1
+terminolog is straightfor 1
+terminolog of datab 1
+terminolog se 1
+terminolog util 1
+terminolog util ee 1
+terminolog wam 1
+terminologiqu 1
+terminologiqu par 1
+terminologiqu par trop 1
+terminon 1
+terminon par 1
+terminon par la 1
+terminon par un 1
+tern 6
+tern addit 1
+tern addit pr 1
+tern compl 1
+tern compl pair 1
+tern compl sequ 1
+tern mic 1
+tern mic fic 1
+tern rel 2
+tern rel. 1
+tern sequ 1
+terrain 2
+terrain displ 1
+terrain visu 1
+terrain visu system 1
+terror 1
+terror act 1
+terror smuggl 1
+terror smuggl ca 1
+terror strik 1
+tesaur 1
+tessel 1
+test 75
+test 17refer 1
+test a condit 1
+test a dautr 1
+test a modif 1
+test a rang 1
+test adapt 1
+test adequ 2
+test adequ criter 1
+test afin 1
+test afin de 1
+test ai 1
+test al av 1
+test allow 1
+test an eff 1
+test and accept 1
+test and an 1
+test and arithm 1
+test and check 1
+test and compar 1
+test and debug 1
+test and demonstr 1
+test and depth 1
+test and design 1
+test and developm 1
+test and maint 1
+test and maintain 1
+test and neg 1
+test and real 1
+test and regr 1
+test and rever 1
+test and se 1
+test and softwar 1
+test and test 2
+test appl 1
+test appl scientif 1
+test ar configur 1
+test ar exp 1
+test ar fault 1
+test ar giv 1
+test ar modif 1
+test ar pr 1
+test ar requir 1
+test ar sum 1
+test arithm 1
+test arithm etiqu 1
+test asymptot 1
+test asymptot traver 1
+test at execut 1
+test at interv 1
+test at triumf 1
+test attach 1
+test avail 1
+test ba 2
+test begin 1
+test both satisf 1
+test budg 1
+test by reus 1
+test by sem 1
+test ca 2
+test ca gener 1
+test ca select 1
+test ca us 1
+test can pa 1
+test chat 1
+test chat parser 1
+test classif 1
+test classif detect 1
+test claus 1
+test claus var 1
+test compar 1
+test computer 2
+test computer softwar 2
+test con 1
+test conditionnel 1
+test conditionnel dus 1
+test conditionnel ni 1
+test constitut 1
+test containm 1
+test control 1
+test control parameter 1
+test convinc 1
+test correct 1
+test correspon 1
+test correspon aux 1
+test cover 1
+test cover using 1
+test criter 1
+test daquarius 1
+test dat 1
+test dat select 1
+test datab 1
+test datab eval 1
+test de 3
+test de cheng 1
+test de comparaison 1
+test de congru 1
+test de glob 1
+test de lag 1
+test de redon 1
+test de tr 1
+test de typ 1
+test de variabl 1
+test demonstr 1
+test demonstr smooth 1
+test descript 1
+test descript player 1
+test descript replac 1
+test design 1
+test dic 1
+test dic de 1
+test differ init 1
+test dist 1
+test doccur 1
+test doccur est 1
+test doduc 1
+test doduc hydrocod 1
+test domain 1
+test domain show 1
+test don 1
+test don es 1
+test donc 1
+test donc point 1
+test du 2
+test du o2 1
+test du syst 1
+test dur maint 1
+test e par 1
+test e pr 1
+test e sur 2
+test e un 1
+test ee 1
+test ee exp 1
+test ee sur 1
+test en 1
+test enter 1
+test environm 1
+test erron 1
+test erron parameter 1
+test es 1
+test est 1
+test est positif 1
+test et chang 1
+test ev tim 1
+test evalu 1
+test exceed 1
+test execut 1
+test experim 1
+test experim inclus 1
+test facil 1
+test fail 1
+test fault 1
+test fault rev 1
+test faultrev 1
+test fi 1
+test fi learn 1
+test find 1
+test for accur 1
+test for dec 1
+test for implicit 1
+test for intersect 1
+test for intraprocedur 1
+test for norm 1
+test for object 1
+test for problem 1
+test for program 1
+test for questionnair 1
+test for subsystem 1
+test for typ 1
+test forml 1
+test forml siz 1
+test framework 1
+test funct 1
+test funct empl 1
+test giv 1
+test glob 1
+test glob variabl 1
+test group 1
+test hist 1
+test hist inform 1
+test historytestsonedg 1
+test ht 1
+test hypoth 1
+test hypoth compar 1
+test imag 1
+test imag bp 1
+test in finit 1
+test in gener 1
+test in lin 1
+test in order 1
+test in rheumatolog 1
+test in sect 1
+test in signif 1
+test inform 1
+test inform test 1
+test infotbl 1
+test involut 2
+test involut ad 1
+test is answer 1
+test is appl 1
+test is consider 1
+test is deb 1
+test is exp 1
+test is funct 1
+test is giv 1
+test is incur 1
+test is nec 1
+test is perform 1
+test is pr 1
+test is pract 1
+test is sid 1
+test is st 1
+test is thus 1
+test is valu 1
+test is ye 1
+test iter 1
+test known 1
+test l etat 1
+test l1 1
+test labor 1
+test later self 1
+test level 1
+test ma 1
+test ma lauteur 1
+test manager 1
+test matr 1
+test me 1
+test me sent 1
+test minim 1
+test minim cp.in 1
+test modif 1
+test modif softwar 1
+test modif traver 1
+test montr 1
+test montr ic 1
+test mor form 1
+test ne 1
+test ne doiv 1
+test nec 1
+test nec select 1
+test nest 1
+test nest pa 1
+test num 1
+test num eriqu 1
+test object 2
+test obsol 1
+test oe 1
+test of assoc 1
+test of authorship 1
+test of boolean 1
+test of intern 1
+test of major 1
+test of non 1
+test of object 1
+test of replac 1
+test of sy 1
+test om 1
+test on cfg 1
+test on docum 1
+test on edg 1
+test on var 1
+test our algorithm 1
+test our approach 1
+test our cod 1
+test our prop 1
+test our schem 1
+test p output 1
+test pattern 2
+test pattern gener 1
+test perform 1
+test perm 1
+test perm de 1
+test peut 1
+test peut etr 1
+test ph 1
+test pl 1
+test plan 1
+test polynom 1
+test polynom constraint 1
+test pool 1
+test pool accord 1
+test pool siz 1
+test port 1
+test port sur 1
+test pr 2
+test pr eliminair 1
+test pract 1
+test problem 2
+test problem incr 1
+test proc 1
+test procedur 1
+test procedur loc 1
+test program 5
+test program isol 1
+test qu 2
+test qu de 1
+test qu sup 1
+test reach 1
+test refin 1
+test requir 1
+test result 4
+test result using 1
+test rl 1
+test sampl 1
+test satisf 1
+test script 1
+test se 8
+test se aim 1
+test se con 1
+test se es 1
+test se minim 1
+test se quest 1
+test se rang 1
+test se requir 1
+test se select 1
+test se siz 1
+test select 1
+test select algorithm 1
+test select effect 1
+test select issu 1
+test select offer 1
+test select problem 1
+test select procedur 1
+test select reduc 1
+test select result 1
+test select run 1
+test select stat 1
+test select techniqu 1
+test select techniqu1 1
+test select tool 1
+test should run 1
+test si 1
+test si lec 1
+test signif 1
+test signif probabil 1
+test situ 1
+test solut 1
+test solut candid 1
+test sont 1
+test span 1
+test specif 1
+test specif langu 1
+test st 1
+test st proper 1
+test standard 1
+test statistiqu 1
+test statistiqu adapt 1
+test statistiqu pour 1
+test stil rel 1
+test strateg 2
+test strateg rerun 1
+test string 1
+test succeed 1
+test successif 1
+test successif du 1
+test suit 3
+test suit avail 1
+test suit contain 1
+test suit design 1
+test suit execut 1
+test suit maint 1
+test suit manag 1
+test sur 1
+test sur le 1
+test t1 1
+test t1t2 1
+test t2 1
+test td 1
+test td appear 1
+test techniqu 1
+test techniqu fac 1
+test th adequ 1
+test th condit 1
+test th effect 1
+test th fac 1
+test th fast 1
+test th find 1
+test th hypoth 1
+test th id 1
+test th incom 1
+test th increm 1
+test th interfac 2
+test th nonperiod 1
+test th perform 2
+test th predict 2
+test th run 1
+test th scal 1
+test th system 1
+test th truth 1
+test th us 1
+test th user 1
+test th valu 1
+test that cover 1
+test that encounter 1
+test that enter 1
+test that exerc 1
+test that exp 1
+test that former 1
+test that reach 1
+test that rev 1
+test that tak 1
+test that techniqu 1
+test that took 1
+test that traver 1
+test through s3 1
+test tim 1
+test tim consider 1
+test to elim 1
+test to execut 1
+test to expr 1
+test to guar 1
+test to repetit 1
+test to retain 1
+test to run 1
+test to se 1
+test tool 1
+test traver 1
+test unfortun 1
+test using 2
+test using program 1
+test using saf 1
+test using sl 1
+test valu 1
+test var 3
+test var algorithm 1
+test var featur 1
+test var parameter 1
+test wa appl 1
+test wa deriv 1
+test we look 1
+test wer perform 2
+test whether solut 1
+test with algorithm 1
+test with respect 2
+test with scenar 1
+test with self 1
+test with var 1
+test without know 1
+test without lo 1
+test.4 1
+test.7 1
+test1 1
+test1 mi 1
+test2 1
+test2 var 1
+test2 var var 1
+test3 1
+test3 mi 1
+testb 8
+testb allow 1
+testb and experim 1
+testb ba 1
+testb clustersim 1
+testb develop 1
+testb develop using 1
+testb for atm 1
+testb for develop 1
+testb for wormhol 1
+testb is ba 1
+testb is es 1
+testb is int 1
+testb to accur 1
+testb to handl 1
+testb wa develop 1
+testb wa implem 1
+tester 6
+tester de 2
+tester de nouvel 1
+tester en 1
+tester en vr 1
+tester for non 1
+tester la 1
+tester la validit 1
+tester le 1
+tester le capacit 1
+tester le foncteur 1
+tester understand 1
+testif 1
+testsonedg 1
+testsonedg to identif 1
+testsonedg to select 1
+testtub 1
+tetr. 1
+tetrah. 1
+tetrahedr 2
+tetrahedr affect 1
+tetrahedr and non 1
+tetrahedr ar shrink 1
+tetrahedr as visit 1
+tetrahedr becom 1
+tetrahedr bound 1
+tetrahedr by link 1
+tetrahedr cel 1
+tetrahedr compr 1
+tetrahedr compr interpol 1
+tetrahedr fold 1
+tetrahedr fold occur 1
+tetrahedr gener 1
+tetrahedr inter. 1
+tetrahedr intersect 1
+tetrahedr is defin 1
+tetrahedr lying 1
+tetrahedr mesh 1
+tetrahedr mesh decim 1
+tetrahedr mesh wh 1
+tetrahedr result 1
+tetrahedr shar 1
+tetrahedr shar vanish 1
+tetrahedr structur 1
+tetrahedr. 1
+tetrahedralizat. 1
+teubner 2
+teukolsk 2
+text 30
+text and background 1
+text and graph 1
+text and imag 1
+text and monograph 1
+text and pictur 1
+text and remov 1
+text answer 1
+text answer an 1
+text ar 2
+text ar bind 1
+text ar respect 1
+text ar rewrit 1
+text assoc 1
+text ba 1
+text block 1
+text book 1
+text cluster 1
+text coder 1
+text coder graph 1
+text compr 1
+text compr techniqu 1
+text cr 1
+text datab 1
+text def 1
+text descript 1
+text docum 1
+text docum avail 1
+text edit 3
+text el 1
+text el ten 1
+text es 1
+text es sicstus 1
+text extract 2
+text extract proc 1
+text font 1
+text font siz 1
+text for rl 1
+text format 1
+text format man.tic 1
+text formatter 1
+text formatter recogn 1
+text from ec 1
+text gener 1
+text gener system 1
+text graph 1
+text graph imag 1
+text held 1
+text imag 1
+text imag docum 1
+text in not 1
+text in order 1
+text ind 1
+text ind structur 1
+text inform 1
+text inform system 1
+text input 1
+text input form 1
+text input widg 1
+text is an 1
+text is analog 1
+text is emb 1
+text is gener 1
+text length 1
+text libr 1
+text libr dan 1
+text lik reg 1
+text lin 1
+text lin com 1
+text lin or 1
+text match 1
+text match problem 1
+text me 1
+text me fil 1
+text meter 1
+text minus annec 1
+text non 1
+text non imag 1
+text o graph 1
+text occur 1
+text or cod 1
+text or imag 1
+text or non 1
+text output 1
+text overlap 1
+text proc 1
+text proc tool 1
+text produc 1
+text reg 1
+text repr 1
+text repr toggl 1
+text segm 1
+text segm using 1
+text specif 1
+text standard 1
+text standard com 1
+text string 2
+text string separ 1
+text suppl 1
+text symbol 1
+text transl 1
+text transm 1
+text us 1
+text which actu 1
+text wil explain 1
+text wil requir 1
+text window 1
+text with surfac 1
+text without alter 1
+textbook 4
+textbook on graph 1
+textil 1
+textu 11
+textu account 1
+textu and graph 1
+textu aspect 1
+textu attribut 1
+textu character 1
+textu commun 1
+textu form 3
+textu inform 1
+textu keyword 1
+textu nod 1
+textu nod nam 1
+textu or anim 1
+textu order 1
+textu repr 1
+textu respon 1
+textu search 1
+textuel 1
+textuel du 1
+textuel du program 1
+textur 3
+textur an 2
+textur an suggest 1
+textur and color 1
+textur and shap 1
+textur ar simil 1
+textur ba 2
+textur ba discrim 1
+textur ba imag 1
+textur ba ind 1
+textur ba qu 1
+textur ba segm 1
+textur by decomp 1
+textur character 1
+textur cl 2
+textur classif 2
+textur collect 1
+textur cont 1
+textur datab 1
+textur datab popl 1
+textur descript 1
+textur descript synth 1
+textur discrim 1
+textur discrim system 1
+textur discrim techniqu 1
+textur dist 1
+textur dist threshold 1
+textur featur 2
+textur featur extract 1
+textur featur se 1
+textur imag 2
+textur imag datab 1
+textur imag proc 1
+textur in train 1
+textur ind 1
+textur ind approach 1
+textur key 1
+textur map 1
+textur or comparison 1
+textur reg 1
+textur reg extract 1
+textur reg segm 1
+textur sampl 1
+textur sampl key 1
+textur segm 2
+textur segm problem 1
+textur segm task 1
+textur segm techniqu 1
+textur segm using 1
+textur separ 1
+textur structur 1
+textur synth 1
+textur synth tool 1
+textur using 1
+textur using correl 1
+tezuk 1
+tf 4
+tf p2ft 1
+tf p2ft p3p4t 1
+tf70 1
+tfal 1
+tfal t2t3 1
+tfal t2t3 prov 1
+tfk 1
+tfk lmac 1
+tfk tpm 1
+tform 1
+tform cr 1
+tform employeetdec 1
+tfw 1
+tfw 1tfw 1
+tg 10
+tg ar equ 1
+tg si 1
+tger 1
+th 60
+th argum 1
+th argum iff 1
+th as 1
+th as bin 1
+th bin 1
+th bisect 1
+th bit 2
+th block 1
+th bus 1
+th bus period 1
+th cluster 1
+th cluster count 1
+th column 1
+th contribut 1
+th coquand 1
+th del 1
+th del oper 1
+th develop 1
+th dim 2
+th dim var 1
+th el 1
+th entr 3
+th eor 6
+th eor algebriqu 1
+th eor asymptotiqu 1
+th eor darwin 1
+th eor de 3
+th eor du 1
+th eor em 2
+th eor markov 1
+th eor pren 1
+th eor standard 1
+th eoriqu 3
+th eoriqu de 1
+th eoriqu du 1
+th eoriqu etr 1
+th eoriqu issus 1
+th eoriqu perm 1
+th eoriqu pour 1
+th eoriqu qu 1
+th eoriqu rest 1
+th eoriqu sont 1
+th eoriqu vi 1
+th es 4
+th es au 1
+th es avec 1
+th es ayant 1
+th es de 4
+th es est 1
+th es etud 1
+th es nabord 1
+th es naurait 1
+th es peuv 1
+th es sint 1
+th es sont 2
+th ha start 1
+th int 1
+th iter 1
+th montaut 2
+th nod 1
+th or 1
+th or de 1
+th or em 1
+th or ne 1
+th or peut 1
+th order 1
+th order repr 1
+th oriqu 1
+th oriqu de 1
+th oriqu int 1
+th oriqu nous 1
+th oriqu pr 1
+th oriqu rest 1
+th oriqu rigoureus 1
+th oriqu sur 1
+th pack 1
+th posit 1
+th prim 1
+th priol 1
+th problem 1
+th problem specif 1
+th proc 1
+th record 1
+th row 2
+th se 1
+th se est 1
+th smallest 1
+th smallest el 1
+th smallest sampl 1
+th som techniqu 1
+th string 1
+th stud 1
+th valu 1
+th var 1
+th ver 1
+th. 1
+th.sit 1
+th.sit pub 1
+th.sit pub design 1
+th1 1
+th1 el2 1
+th1 el2 t1 1
+th91 1
+thacker 3
+thacker and dick 1
+thacker and lawr 1
+thagard 1
+thakkar 1
+thank 39
+thank al 1
+thank al badr 1
+thank an anonym 1
+thank ar du 2
+thank bertrand 1
+thank bertrand neveu 1
+thank bow 1
+thank bow alpern 1
+thank brun 1
+thank brun poizat 1
+thank csl 1
+thank den 1
+thank den shash 1
+thank el 1
+thank el koutsoup 1
+thank er 1
+thank er bl 1
+thank for tak 1
+thank gerth 1
+thank gerth brod 1
+thank go 2
+thank j org 1
+thank jean 2
+thank jean bolot 1
+thank jean lou 1
+thank jim 2
+thank jim mullin 1
+thank jim plank 1
+thank joel 1
+thank joel martin 1
+thank john 1
+thank john hugh 1
+thank kenjir 1
+thank kenjir taur 1
+thank kristoffer 1
+thank kristoffer ro 1
+thank lorenz 1
+thank lorenz alv 1
+thank lou 1
+thank lou wang 1
+thank mark 1
+thank mark greenstr 1
+thank mart 1
+thank mart sirkin 1
+thank mosh 1
+thank mosh vard 1
+thank my adv 1
+thank my ph.d 1
+thank other member 1
+thank patrick 1
+thank patrick van 1
+thank prof 1
+thank prof gultekin 1
+thank ted 1
+thank ted seiter 1
+thank th anonym 1
+thank th research 1
+thank to car 1
+thank to georg 1
+thank to sep 1
+thank yorkshir 1
+thank yorkshir water 1
+that2 1
+that2 de 1
+that2 de no 1
+thatch 2
+theater 1
+theater and dram 1
+theb 1
+theb rown 1
+theb rown fox 1
+thebaut 1
+thec 1
+thec cal 1
+thec cal stack 1
+thel 1
+thel azy 1
+thel azy dog.j 1
+them 5
+them of 2cl 1
+them of dpl 1
+them of reflect 1
+them that parn 1
+them. 1
+them.5 1
+them.6 1
+them.6 in addit 1
+themat 1
+themat uniform 1
+themat uniform nomin 1
+themself 1
+themself dat 1
+themself dat parallel 1
+themslev 1
+then7 1
+thenelif 1
+thenif 1
+thenif cand 1
+thenif lastnod 1
+thenif lastnod currnod 1
+thenif po 1
+thenif po act 1
+theobald 1
+theobald guang 1
+theodor 2
+theodor johnson 2
+theodor johnson pk 1
+theor 95
+theor a theor 1
+theor abl 1
+theor academ 1
+theor accord 1
+theor al contain 1
+theor al forml 1
+theor algorithm 1
+theor allow 4
+theor allow conflict 1
+theor allow model 1
+theor alread contain 1
+theor an 3
+theor and algorithm 1
+theor and appl 6
+theor and autom 1
+theor and comput 1
+theor and experim 2
+theor and method 1
+theor and perfect 1
+theor and pract 13
+theor and proc 1
+theor and proof 1
+theor and therefor 1
+theor approach 2
+theor approxim 1
+theor ar disc 1
+theor ar ident 1
+theor ar interpr 1
+theor argum 1
+theor art 1
+theor aspect 2
+theor assum 1
+theor ba 5
+theor ba evalu 1
+theor bandwidth 1
+theor bandwidth sec 1
+theor be handl 1
+theor build 1
+theor build system 1
+theor by ext 1
+theor categor 1
+theor center 1
+theor chang 1
+theor chang involut 1
+theor channel 1
+theor channel maxim 1
+theor clean 1
+theor commitm 1
+theor comparison 1
+theor compil 1
+theor compil grammar 1
+theor comput 2
+theor computer 17
+theor computer sc 17
+theor concept 1
+theor condit 1
+theor consider 1
+theor contain 1
+theor deal 1
+theor deriv 1
+theor design 1
+theor develop 3
+theor develop tak 1
+theor domain 1
+theor ensur 1
+theor error 1
+theor establ 1
+theor expect 1
+theor for mult 1
+theor for nest 1
+theor for reason 1
+theor for simpl 1
+theor form 1
+theor found 4
+theor framework 5
+theor framework claim 1
+theor gener 1
+theor goal 1
+theor hierarch 1
+theor in gener 1
+theor in lcf 1
+theor in order 1
+theor in sec 1
+theor ind 1
+theor ind exact 1
+theor is 1st 1
+theor is appl 1
+theor is categor 1
+theor is cur 1
+theor is somewhat 1
+theor is underw 1
+theor issu 3
+theor lead 2
+theor level 1
+theor lim 1
+theor method 1
+theor of addit 1
+theor of autom 1
+theor of commun 2
+theor of comput 11
+theor of con. 1
+theor of concur 1
+theor of connect 1
+theor of constraint 2
+theor of coter 1
+theor of cultur 1
+theor of datab 1
+theor of den 1
+theor of diagn 1
+theor of direct 1
+theor of discr 1
+theor of dynam 1
+theor of emb 1
+theor of equ 1
+theor of fl 1
+theor of gener 1
+theor of induc 1
+theor of int 1
+theor of leonard 1
+theor of lin 3
+theor of log 1
+theor of lr 1
+theor of me 1
+theor of me. 1
+theor of mereolog 1
+theor of minim 1
+theor of motiv 1
+theor of mycroft 1
+theor of neuron 1
+theor of np 5
+theor of number 1
+theor of object 1
+theor of observabl 1
+theor of orgun 1
+theor of parallel 1
+theor of plan 1
+theor of prim 1
+theor of quest 1
+theor of rat 1
+theor of reason 1
+theor of reconstruc 1
+theor of remind 1
+theor of shap 1
+theor of spac 1
+theor of spat 1
+theor of st 1
+theor of syntact 1
+theor of typ 2
+theor of volit 1
+theor onl refer 1
+theor optim 1
+theor popl 1
+theor pr 1
+theor problem 3
+theor problem specif 1
+theor proper 4
+theor quest 1
+theor reconstruc 1
+theor requir 1
+theor restrict 1
+theor restrict top 1
+theor result 3
+theor scal 2
+theor scal bandwidth 1
+theor scal proper 1
+theor se 1
+theor sect 1
+theor seem 1
+theor seem rigor 1
+theor separ 1
+theor standpoint 1
+theor structur 1
+theor structur deriv 1
+theor structur facil 1
+theor stud 2
+theor stud loc 1
+theor suff 1
+theor suff condit 1
+theor t conserv 1
+theor t1 1
+theor techniqu 1
+theor term 1
+theor th import 1
+theor th point 1
+theor to find 1
+theor to solut 1
+theor underpin 1
+theor using 1
+theor using uniform 1
+theor which import 1
+theor with appl 1
+theor with ident 1
+theor work 1
+theorem 46
+theorem a initk 1
+theorem allow 2
+theorem an 1
+theorem and kleen 1
+theorem and proof 1
+theorem and proper 1
+theorem appl 1
+theorem asser 1
+theorem assum 1
+theorem besid lem 1
+theorem by contradict 1
+theorem by implicit 1
+theorem character 1
+theorem character lower 1
+theorem demonstr 1
+theorem ea 1
+theorem ensur 1
+theorem expr 1
+theorem fail 1
+theorem follow 3
+theorem for approxim 1
+theorem for log 1
+theorem for planar 1
+theorem for regl 1
+theorem for tableau 1
+theorem formaliz 1
+theorem from sect 1
+theorem giv 2
+theorem hold 4
+theorem hold c.f 1
+theorem identif 1
+theorem is appl 1
+theorem is fal 1
+theorem is giv 1
+theorem is interpr 1
+theorem is signif 1
+theorem is st 1
+theorem lead 1
+theorem motiv 1
+theorem of ml 1
+theorem onl guar 1
+theorem perspectiv 1
+theorem pr 1
+theorem prov 6
+theorem prov proc 1
+theorem prover 3
+theorem prover v4.0 1
+theorem rel 1
+theorem say 2
+theorem show 3
+theorem st 1
+theorem stil hold 1
+theorem that selecttest 1
+theorem to der 1
+theorem to handl 1
+theorem to prov 1
+theorem wa further 1
+theorem wa shown 1
+theorem which show 1
+ther 2
+ther output 1
+ther output deliver 1
+ther test 1
+ther. 1
+therap 1
+therap plan 1
+thereafter 6
+thereafter form 1
+thereafter form gener 1
+thereb 17
+thereb enabl 1
+thereb enabl trem 1
+thereb facilit 1
+thereb facilit feder 1
+thereb favour 1
+thereb finish 1
+thereb forc 1
+thereb help 1
+thereb lead 1
+thereb mak 2
+thereb may prov 1
+thereb provid ground 1
+thereb reduc 2
+thereb reduc transact 1
+thereb retain 1
+thereb return 1
+thereb satisf 1
+thereb satisf ca 1
+thereb simplif 1
+thereb suggest 1
+thereb suggest act 1
+thereb th assoc 1
+thereb transl 1
+thereb traver 1
+therefor 96
+therefor a norm 1
+therefor a pandemon 1
+therefor a shorter 1
+therefor abl 2
+therefor achief 1
+therefor adopt 1
+therefor after finish 1
+therefor al denot 1
+therefor algorithm 1
+therefor an argum 1
+therefor an inh 1
+therefor appear 1
+therefor appl 2
+therefor appl theorem 1
+therefor ar refer 1
+therefor assum 2
+therefor aver 1
+therefor b tc 2
+therefor bal 1
+therefor be ahead 1
+therefor be ch 1
+therefor be classif 1
+therefor be difficult 1
+therefor be giv 1
+therefor be interpr 1
+therefor be prov 1
+therefor be us 1
+therefor both endpoint 1
+therefor build 1
+therefor by lem 1
+therefor can cover 1
+therefor can us 1
+therefor cannot ch 1
+therefor ch 2
+therefor charg 1
+therefor compar 1
+therefor comput 1
+therefor comput exp 1
+therefor concentr 1
+therefor conclus 1
+therefor cruc 1
+therefor deliver 1
+therefor dep 2
+therefor disc 1
+therefor disc futur 1
+therefor e0i 1
+therefor e0i e0j 1
+therefor e1 1
+therefor e2 1
+therefor either contain 1
+therefor encounter 1
+therefor es 1
+therefor ev augm 1
+therefor ev lin 1
+therefor ev norm 1
+therefor ev valu 1
+therefor exclus 1
+therefor exclus serv 1
+therefor faster 1
+therefor faster compiler 1
+therefor ffyxf 1
+therefor find 1
+therefor flush 1
+therefor flush cach 1
+therefor follow 2
+therefor g0 1
+therefor ge 1
+therefor ge closer 1
+therefor h2 1
+therefor id 1
+therefor id suit 1
+therefor in mc 1
+therefor in order 1
+therefor inappropr 1
+therefor inclus 1
+therefor interest 2
+therefor introduc 2
+therefor introduc agent 1
+therefor is gener 1
+therefor it fragm 1
+therefor it pay 1
+therefor it remain 1
+therefor it tak 1
+therefor iter 1
+therefor jv1 1
+therefor know 1
+therefor l1 1
+therefor larger 1
+therefor larger chunk 1
+therefor lik 1
+therefor lim 1
+therefor loc 1
+therefor mad 1
+therefor mak 2
+therefor me 1
+therefor me overhead 1
+therefor model 1
+therefor mor clear 1
+therefor mor interest 1
+therefor msld 1
+therefor msld resolut 1
+therefor natur 1
+therefor nec 1
+therefor no output 1
+therefor not adapt 1
+therefor not del 1
+therefor not going 1
+therefor obtain 1
+therefor obv 1
+therefor obv simd 1
+therefor oe 1
+therefor oe2b 1
+therefor offer 2
+therefor offer low 2
+therefor om 2
+therefor om further 1
+therefor onl examin 1
+therefor or parallel 1
+therefor outperform 1
+therefor over 1
+therefor over eight 1
+therefor p l2s2 1
+therefor p2s 1
+therefor p2s pt 1
+therefor perform 2
+therefor po 1
+therefor pot 1
+therefor prob norm 1
+therefor prop 1
+therefor prun 1
+therefor quit natur 1
+therefor quit simpl 1
+therefor re design 1
+therefor reach 1
+therefor reason 1
+therefor redef 1
+therefor rel 4
+therefor rel straightfor 1
+therefor remov 1
+therefor repr 1
+therefor requir 2
+therefor requir system 1
+therefor return 1
+therefor reus 1
+therefor s contain 1
+therefor sav developm 1
+therefor sdm 1
+therefor sdm 2b 1
+therefor se 1
+therefor spec consider 1
+therefor speed 1
+therefor st 3
+therefor start 1
+therefor suff 1
+therefor susp 1
+therefor t1 1
+therefor tackl 1
+therefor tackl optim 1
+therefor tak 2
+therefor tcom 1
+therefor th algorithm 1
+therefor th conjunct 1
+therefor th correct 1
+therefor th degr 1
+therefor th fin 1
+therefor th init 1
+therefor th input 1
+therefor th log 1
+therefor th maxim 1
+therefor th not 1
+therefor th number 3
+therefor th observ 1
+therefor th over 1
+therefor th pack 1
+therefor th parallel 1
+therefor th pr 1
+therefor th protocol 1
+therefor th rat 1
+therefor th restrict 1
+therefor th result 1
+therefor th sign 1
+therefor th siz 1
+therefor th thin 1
+therefor th tim 1
+therefor th var 1
+therefor their init 1
+therefor their pot 1
+therefor ther ec 1
+therefor to maintain 1
+therefor to reduc 1
+therefor tool 1
+therefor tw reader 1
+therefor u0 1
+therefor unsuit 1
+therefor us 3
+therefor us feedback 1
+therefor us timestamp 1
+therefor uw 1
+therefor uw encl 1
+therefor v0 1
+therefor v1 1
+therefor w ui 1
+therefor w w0 1
+therefor wa ea 1
+therefor we assum 1
+therefor we conjectur 1
+therefor we giv 1
+therefor we know 1
+therefor we look 1
+therefor we obtain 1
+therefor we prop 1
+therefor we replac 1
+therefor we restrict 1
+therefor we se 1
+therefor wel adapt 1
+therefor without lo 1
+therefor xy 1
+therein 2
+thereof 2
+thereof is ba 1
+thereoff 1
+thereupon 1
+thereupon th guidel 1
+therfor 1
+therm 2
+therm dam 1
+therm dissip 1
+therm expan 1
+thesaurus 1
+thesaurus and refer 1
+thesaurus to transl 1
+thesaurus word 1
+thesesus 1
+thesesus sv 1
+theseus 1
+theseus show 1
+theseus styl 1
+theseus styl fin 1
+theseus sv 1
+theshelf 3
+theshelf client 1
+theshelf compon 1
+theshelf uniproc 1
+thibault 2
+thibault and naylor 1
+thick 5
+thick arrow 2
+thick black 1
+thick black lin 1
+thick lin 2
+thick lin mean 1
+thicker 2
+thicker channel 2
+thicker channel bus 2
+thin 4
+thin by using 1
+thin ch 1
+thin in order 1
+thin lin 3
+thin lin descript 1
+thin lin edg 1
+thin lin join 1
+thin lin using 1
+thin lin.2 1
+thin oper 1
+thin task 1
+thin we therefor 1
+thin wil result 1
+thing 22
+thing and softwar 1
+thing difficult 1
+thing ea 1
+thing further 1
+thing hav gon 1
+thing henc 1
+thing i quest 1
+thing in sc 1
+thing lik learn 1
+thing obv 1
+thing obv mi 1
+thing real difficult 1
+thing that niggl 1
+thing that suffer 1
+thinglab 2
+thinglab ii 1
+think 26
+think about inherit 1
+think about wh 1
+think aloud 1
+think aloud observ 1
+think aloud protocol 1
+think aloud techniqu 1
+think as cl 1
+think differ 1
+think environm 1
+think for pract 1
+think in group 1
+think in structur 1
+think in term 2
+think inherit 1
+think inherit introduc 1
+think inherit prov 1
+think is appropr 1
+think it wonder 1
+think mach 5
+think mach cm 1
+think mach corpor 2
+think mach inc 1
+think mach techn 1
+think mor quick 1
+think of min 1
+think of ph 1
+think of tarsk 1
+think of unlabel 1
+think ser 1
+think should appear 1
+think tak 1
+think tak tim 1
+think th button 1
+think th interview 1
+think th interviewer 1
+think that dynam 1
+think that expan 1
+think that fl 1
+think that softwar 1
+think tim 1
+thinker 1
+thir 1
+third 65
+third ac 1
+third acm 1
+third ad 1
+third altern 1
+third altern con 1
+third and fourth 2
+third annu 1
+third annu acm 1
+third annu ie 1
+third answer 1
+third approach 1
+third approach involut 1
+third argum 5
+third argum determin 1
+third aspect 1
+third aspect refer 1
+third best answer 1
+third block 1
+third ca 4
+third ca say 1
+third ca shown 1
+third centr 1
+third centr moment 1
+third cl 1
+third claus 2
+third column 4
+third column giv 1
+third column repr 1
+third common 1
+third commun 1
+third commun schem 1
+third compon 1
+third dim 1
+third edit 1
+third equ 1
+third experim 1
+third form 1
+third gener 1
+third gener tp 1
+third group 1
+third haw 1
+third haw intern 1
+third iccv 1
+third ie 1
+third ie intern 1
+third import fact 1
+third inequ 1
+third inequ follow 1
+third intern 9
+third intern workshop 3
+third intern world 1
+third intl 1
+third kind 2
+third langu 1
+third langu paradigm 1
+third lin 1
+third lin serv 1
+third modl 1
+third nat 1
+third observ 1
+third observ concern 1
+third on shown 1
+third or fourth 1
+third parameter 1
+third parameter giv 1
+third parameter mean 1
+third part 3
+third part list 1
+third person 2
+third program 3
+third program claus 2
+third questionnair 1
+third saf 1
+third saf techniqu 1
+third scenar 1
+third schem 1
+third se 1
+third stag 1
+third stag involut 1
+third step 2
+third step comput 1
+third step ensur 1
+third task 1
+third techniqu 2
+third term 1
+third term correspon 1
+third test 1
+third transform 1
+third transform perform 1
+third var 1
+third var us 1
+third ver 1
+third workshop 4
+thirt 3
+thirt sa 1
+thirt sa experim 1
+thirt third 1
+thirt third annu 1
+thirt year 1
+thirteenth 1
+thirteenth acm 1
+thirtieth 1
+thirtieth annu 1
+thirtieth annu aller 1
+thod 2
+thod de 1
+thod de hach 1
+thod de val 1
+thod peut 1
+thod peut gal 1
+thod pour 1
+thod pour estimer 1
+thod qu 1
+thod qu perm 1
+thod statistiqu 1
+thod statistiqu qu 1
+thom 16
+thom brinkhoff 1
+thom christaller 1
+thom christaller phon 1
+thom gr 1
+thom hard 1
+thom hard novel 1
+thom hard using 1
+thom jeffr 1
+thom joseph 1
+thom k hm 1
+thom rodeheffer 1
+thom worsch 1
+thom.christaller 1
+thom.christaller gmd.de 1
+thomopoul 1
+thomopoul et al 1
+thompson 3
+thomson 1
+thornt 1
+thornt hal 1
+thornt hal charlottesvil 1
+thorough 8
+thorough an 1
+thorough conclus 1
+thorough defin 1
+thorough defin oper 1
+thorough describ 1
+thorough descript 1
+thorough disc 2
+thorough investig 1
+thorough model 1
+thorough understand 1
+thorst 1
+thorst von 1
+thorst von eik 1
+thought 21
+thought b syntac 1
+thought com 1
+thought lead 1
+thought of intuit 1
+thought proc 2
+thought provok 2
+thought provok crit 1
+thought provok quest 1
+thought rl 1
+thought that continu 1
+thought that polymorph 1
+thought whil perform 1
+thousand 16
+thousand a com 1
+thousand and decim 1
+thousand lin 1
+thousand nod 1
+thousand of acc 1
+thousand of appl 1
+thousand of cycl 1
+thousand of lin 2
+thousand of nod 1
+thousand of polygon 1
+thousand of proc 1
+thousand of st 2
+thousand of subm 1
+thousand or mil 1
+thousand stat 1
+thousand stat nod 1
+thousandsthousand 1
+thread 16
+thread abstract 1
+thread abstract mach 1
+thread acc 1
+thread alread start 1
+thread and iter 1
+thread and lock 1
+thread ar identif 1
+thread ar run 1
+thread becom 1
+thread becom determin 1
+thread belong 1
+thread cal 1
+thread cal sign 1
+thread cal thread 1
+thread chain 1
+thread cl 1
+thread cod 1
+thread condit 1
+thread condit condit 1
+thread condit queu 1
+thread condit thread 1
+thread continu 1
+thread continu thread 1
+thread continu wrong 1
+thread could run 1
+thread could start 1
+thread cur 1
+thread cur st 1
+thread dm 1
+thread dm buffer 1
+thread dm interfac 1
+thread exclus 1
+thread exclus control 1
+thread from client 1
+thread funct 1
+thread ge 1
+thread ge schedl 1
+thread hav sent 1
+thread in order 1
+thread ind 1
+thread is abort 1
+thread is alloc 1
+thread is chang 1
+thread is creat 1
+thread is determin 1
+thread is dispatch 1
+thread is fin 1
+thread is guaranteed 1
+thread is mad 1
+thread is reschedl 1
+thread is run 1
+thread is select 1
+thread is start 1
+thread is undefin 1
+thread is wait 1
+thread of control 3
+thread of execut 1
+thread of gener 1
+thread of reason 1
+thread oper 1
+thread parallel 1
+thread parallel program 1
+thread primitiv 1
+thread proc 1
+thread repr 1
+thread repr chang 1
+thread reschedl 1
+thread reschedl funct 1
+thread reschedl infinit 1
+thread reschedl return 1
+thread sen 2
+thread specif 1
+thread spen 1
+thread start 1
+thread start funct 1
+thread subsequ 1
+thread subsequ cal 1
+thread susp 1
+thread team 1
+thread thread 1
+thread to abort 1
+thread to execut 1
+thread to us 1
+thread valu 1
+thread valu funct 1
+thread valu susp 1
+thread vect 1
+thread wa execut 1
+thread wh fin 1
+thread wh result 1
+thread which cal 1
+thread which reschedl 1
+thread wil caus 1
+thread wil continu 1
+thread would perm 1
+threadedcod 1
+threadedcod eml 1
+threadp 1
+threadp funct 1
+threat 3
+threat by anim 1
+threat consequ 1
+threat pair 1
+threat situ 1
+threat th dog 1
+threshold 20
+threshold and thin 1
+threshold ar better.6 1
+threshold ar requir 1
+threshold ar se 1
+threshold as method 1
+threshold ba 1
+threshold ba de 1
+threshold confid 1
+threshold confid valu 1
+threshold defin 1
+threshold elit 1
+threshold estim 1
+threshold for de 1
+threshold for produc 1
+threshold for random 1
+threshold for var 1
+threshold fract 1
+threshold imag 1
+threshold is correl 1
+threshold is ignor 1
+threshold is requir 1
+threshold level 1
+threshold log 1
+threshold mechan 1
+threshold method 1
+threshold nonl 1
+threshold on figur 1
+threshold or bi 1
+threshold or rat 1
+threshold outperform 1
+threshold parameter 1
+threshold schedl 1
+threshold schedl strateg 1
+threshold schem 1
+threshold se 1
+threshold sometim exhibit 1
+threshold synth 1
+threshold t tn 1
+threshold to av 1
+threshold to discard 1
+threshold valu 2
+threshold wa design 1
+threshold wa se 1
+threshold wavel 1
+threshold wavel coeff 1
+threshold whil maintain 1
+threshold.12 1
+thriv 1
+thriv temper 1
+throttl 2
+throttl at sw 1
+throttl by me 1
+throttl manager 1
+through 2
+through perform 1
+throughinterm 1
+throughinterm partit 1
+throughinterm partit pm 1
+throughlik 1
+throughlik mechan 1
+throughput 10
+throughput an 1
+throughput and del 1
+throughput and minimiz 1
+throughput and receiv 1
+throughput and thus 1
+throughput ar sought 1
+throughput as expr 1
+throughput as me 1
+throughput character 1
+throughput correspon 1
+throughput demand 1
+throughput fal 1
+throughput for 1xn 1
+throughput for dynam 1
+throughput improv 1
+throughput improv attain 1
+throughput in ca 1
+throughput is high 1
+throughput is lim 1
+throughput is nonblock 1
+throughput is np 1
+throughput is throttl 1
+throughput is upd 1
+throughput match 1
+throughput match sw 1
+throughput nw 1
+throughput nxn 1
+throughput nxn connect 1
+throughput of 1xn 1
+throughput of gener 1
+throughput of protocol 1
+throughput of rmsp 1
+throughput of se 1
+throughput or resourc 1
+throughput per nod 1
+throughput per proc 1
+throughput per se 1
+throughput perform 1
+throughput plot 1
+throughput plot depict 1
+throughput protocol 1
+throughput rat 1
+throughput rat decr 1
+throughput rat multiplec 1
+throughput rat vs 1
+throughput result 2
+throughput result deriv 2
+throughput result plot 1
+throughput support 2
+throughput th rmsp 1
+throughput than desir 1
+throughput than n2 1
+throughput than protocol 1
+throughput than rmsp 1
+throughput under uniform 1
+throughput vs 1
+throughput vs tim 1
+throughput wa avail 1
+throughput wa shown 1
+throughput whil using 1
+throw 4
+throw aw forml 1
+throw aw old 1
+thrown 4
+thrown overboard 1
+thrun 1
+thumb 1
+thumb requir 1
+thurimel 1
+thurst 1
+thus 100
+thus a com 1
+thus a descript 1
+thus a hamilt 1
+thus a lin 1
+thus a quest 1
+thus a reason 2
+thus a strateg 1
+thus abl 1
+thus absolut 1
+thus absolut retrief 1
+thus act 1
+thus ad 2
+thus al pair 1
+thus allow 5
+thus alw incr 1
+thus an atm 1
+thus an interest 1
+thus any branch 1
+thus any client 1
+thus any nod 1
+thus any pair 1
+thus at column 1
+thus av 3
+thus av repeat 1
+thus av transl 1
+thus b oe1oe2 1
+thus be contain 1
+thus be determin 1
+thus be measur 1
+thus be tacit 1
+thus be writ 1
+thus being solut 1
+thus better support 1
+thus bo 1
+thus bo con 1
+thus c ui 1
+thus can afford 1
+thus can prov 1
+thus cannot guar 1
+thus caus 1
+thus charg 1
+thus clear 2
+thus compar 1
+thus compar look 1
+thus compl 1
+thus compound 1
+thus comprom 1
+thus confirm 1
+thus confront 1
+thus construc 1
+thus construc piecem 1
+thus continu 1
+thus contradict 2
+thus d 10mb 2
+thus deadlock 1
+thus decr 1
+thus def 1
+thus del 1
+thus denot 1
+thus deon 1
+thus describ 1
+thus design 1
+thus design dec 1
+thus develop 1
+thus ea 1
+thus ea tracc 1
+thus each cluster 1
+thus each nod 1
+thus each pair 1
+thus each sit 1
+thus each switch 1
+thus either switch 1
+thus enabl 1
+thus ensur 4
+thus ensur loc 2
+thus equ 1
+thus ev object 1
+thus exper 1
+thus exploit 1
+thus ext 1
+thus ext cam 1
+thus far us 1
+thus favor 1
+thus favor ver 1
+thus fic 1
+thus fir 1
+thus for giv 1
+thus form 1
+thus fr 1
+thus from read 1
+thus futur 1
+thus futur research 1
+thus g0 1
+thus g17t 1
+thus gather 1
+thus giv 3
+thus great 1
+thus great facilit 1
+thus guar 1
+thus guaranteed 1
+thus handl 2
+thus hav ham 1
+thus hav oeu 1
+thus hold 1
+thus identif 1
+thus if demand 2
+thus in se 1
+thus in sl1 1
+thus incompl 1
+thus incr 2
+thus inff 1
+thus influ 1
+thus inherit 1
+thus init 1
+thus inser 1
+thus inser 2d 1
+thus introduc 1
+thus intuit 1
+thus is compat 1
+thus is effect 1
+thus is wast 1
+thus it tak 1
+thus j bp 1
+thus jn 1
+thus k chang 1
+thus lat 1
+thus lead 1
+thus lim 1
+thus lin 1
+thus maintain 1
+thus mak 4
+thus mak us 1
+thus maxim 1
+thus mb 1
+thus mn 1
+thus model 1
+thus modif 1
+thus multipl 1
+thus no expan 1
+thus no synchron 1
+thus not achief 1
+thus not id 1
+thus obtain 2
+thus oe 1
+thus oper 1
+thus our an 1
+thus our implem 1
+thus our model 1
+thus our pandemon 1
+thus particip 1
+thus pav 1
+thus perform 1
+thus perform collect 1
+thus perm 1
+thus pi 1
+thus point 1
+thus pr 1
+thus pram 1
+thus pram algorithm 1
+thus preserv 1
+thus preserv compl 1
+thus produc 1
+thus program 1
+thus protect 1
+thus prov 1
+thus psw 1
+thus r0 1
+thus reach 1
+thus read 1
+thus real 1
+thus receiv 1
+thus receiv serv 1
+thus recogniz 1
+thus recogniz character 1
+thus record 1
+thus reduc 4
+thus reduc gener 1
+thus reduc proc 1
+thus reduc st 1
+thus reg 1
+thus reg ec 1
+thus replac 1
+thus repr 1
+thus requir 2
+thus requir further 1
+thus restrict 1
+thus return 1
+thus ri 1
+thus rl 1
+thus s 2n 1
+thus said 1
+thus satisf 1
+thus serv 1
+thus sid 1
+thus sid step 1
+thus sk 1
+thus speed 1
+thus st 1
+thus suff 1
+thus superimp 1
+thus support 1
+thus system 1
+thus tabl 1
+thus th act 1
+thus th algorithm 2
+thus th approxim 1
+thus th block 1
+thus th claim 1
+thus th comput 1
+thus th confid 1
+thus th correspon 1
+thus th cost 1
+thus th dec 1
+thus th denot 1
+thus th ec 1
+thus th edg 1
+thus th expon 1
+thus th funct 1
+thus th ghost 1
+thus th high 1
+thus th ind 1
+thus th init 1
+thus th insight 2
+thus th interconnect 1
+thus th kcm 1
+thus th list 1
+thus th loweralph 1
+thus th memor 1
+thus th no 1
+thus th norm 1
+thus th number 1
+thus th ontolog 1
+thus th output 2
+thus th paper 1
+thus th partit 1
+thus th problem 1
+thus th proof 1
+thus th puzzl 1
+thus th qu 1
+thus th quest 1
+thus th reg 1
+thus th repr 1
+thus th respon 1
+thus th robust 1
+thus th run 1
+thus th schem 1
+thus th se 1
+thus th sem 1
+thus th solver 1
+thus th st 1
+thus th tim 1
+thus th tot 2
+thus th triangl 1
+thus th wor 1
+thus theorem 1
+thus to perform 1
+thus to reus 1
+thus to summar 1
+thus took 1
+thus transform 1
+thus tw fold 1
+thus u0 1
+thus uj 1
+thus upd 1
+thus vot 1
+thus w0 1
+thus we abandon 1
+thus we assum 2
+thus we cal 1
+thus we obtain 1
+thus we repr 1
+thus ws 1
+thus yield 1
+thwart 1
+thwart user 1
+ti 34
+ti a valu 1
+ti and alexander 1
+ti and ti 1
+ti ar brok 3
+ti ar decoupl 1
+ti ar key 1
+ti ar span 1
+ti by lem 1
+ti by schedl 1
+ti ca 1
+ti cur 1
+ti cur ts 1
+ti doesnt exceed 1
+ti est 1
+ti est direct 1
+ti est distinct 1
+ti est la 1
+ti est substitu 1
+ti ha ti 1
+ti iff 1
+ti in design 1
+ti in norm 1
+ti is brok 1
+ti is indep 1
+ti me1 1
+ti medtim 1
+ti medtim e14 1
+ti nest 1
+ti nest pa 1
+ti nod 1
+ti rj 1
+ti root 1
+ti t l1 1
+ti t l2 1
+ti t0 1
+ti th isol 1
+ti th lancz 1
+ti th part 1
+ti ti 1
+ti to prolog 1
+ti turn 1
+ti with prob 1
+ti.in 1
+ti1 1
+tial 2
+tial.in 1
+tibl 1
+tic 13
+tic at austin 3
+tic show 1
+tic show parallel 1
+tic text 1
+tic text format 1
+tick 4
+tick and d.h.d 1
+tick and succ 1
+tick et d.h.d 1
+tick is ten 1
+tick mark 1
+tick mark drawn 1
+tick pour 1
+tick pour etud 1
+tick put 1
+tick put for 1
+tickl 1
+tid 3
+tid ar surrog 1
+tid arriv 1
+tid leav 1
+tid st 1
+tid st mac 1
+tid0 1
+tid0 ar surrog 1
+tidact 1
+tidact transact 1
+tidact transact tid 1
+tiefensuch 1
+tien 3
+tien compt 1
+tien qu 1
+tien qu si 1
+tiendr 1
+tiendr lieu 1
+tiendr lieu de 1
+tiendront 1
+tiendront lieu 1
+tiendront lieu dhypoth 1
+tient 2
+tient au 1
+tient au fait 1
+tient compt 1
+tient compt de 1
+tient pa 1
+tient pa compt 1
+tient pour 1
+tient un 1
+tient un plac 1
+tier 1
+tier with respect 1
+tietz 1
+tig 1
+tiger 1
+tiger datab 1
+tight 16
+tight bound 3
+tight coupl 2
+tight coupl multiproc 1
+tight for gener 1
+tight in big 1
+tight integr 2
+tight integr compon 1
+tight th resourc 1
+tight upper 2
+tight upper bound 2
+tighter 5
+tighter bound 3
+tighter deadl 1
+tighter encod 1
+tightest 1
+tightest fash 1
+tik 1
+tik of part 1
+til 5
+til and norm 1
+til and schedl 1
+til ar atom 1
+til ar incompl 1
+til as shown 1
+til connect 1
+til determin 1
+til is atom 1
+til is fin 1
+til is leg 1
+til iter 1
+til iter spac 1
+til pelv 1
+til shown 1
+til siz 1
+til spac 1
+til start 1
+til th interior 1
+til th iter 1
+til th transform 1
+til ver 1
+til with hyperplan 1
+til with ind 1
+til with k1 1
+til with symbol 1
+tim 119
+tim 10msec 1
+tim 21k 1
+tim 2d 1
+tim 2f 1
+tim a breakdown 1
+tim a bundl 1
+tim a client 1
+tim a garb 1
+tim a group 1
+tim a leaf 1
+tim a loc 1
+tim a me 1
+tim a min 1
+tim a model 1
+tim a nod 1
+tim a pack 1
+tim a pointer 1
+tim a proc 3
+tim a se 1
+tim a task 1
+tim a term 1
+tim ac 1
+tim acc 1
+tim accord 1
+tim after tl 1
+tim aim 1
+tim al speedup 1
+tim algorithm 14
+tim algorithm giv 2
+tim algorithm prop 1
+tim algorithm using 1
+tim an 1
+tim an attract 1
+tim and accur 1
+tim and branch 1
+tim and chip 1
+tim and commun 1
+tim and comput 1
+tim and concur 1
+tim and contextu 1
+tim and deadl 1
+tim and dep 1
+tim and disk 1
+tim and effort 1
+tim and energ 1
+tim and exper 1
+tim and expon 1
+tim and fil 1
+tim and finish 1
+tim and fit 1
+tim and form 2
+tim and found 1
+tim and glob 1
+tim and me 1
+tim and memor 1
+tim and np 1
+tim and observ 1
+tim and order 1
+tim and prov 1
+tim and qu 1
+tim and resourc 1
+tim and run 1
+tim and spac 4
+tim and throughput 1
+tim and thus 1
+tim appl 3
+tim appl requir 1
+tim approach 1
+tim approxim 1
+tim approxim algorithm 1
+tim approxim schem 1
+tim ar accept 1
+tim ar accur 1
+tim ar compar 1
+tim ar comput 1
+tim ar depict 1
+tim ar describ 1
+tim ar equ 1
+tim ar giv 2
+tim ar greater 1
+tim ar identif 1
+tim ar lik 1
+tim ar list 1
+tim ar near 1
+tim ar overlap 1
+tim ar pr 1
+tim ar reduc 1
+tim ar rel 1
+tim ar report 1
+tim ar shown 3
+tim ar us 1
+tim as multilevel 1
+tim as op 1
+tim as parameter 1
+tim as unit 1
+tim assoc 2
+tim assum 2
+tim at synchron 1
+tim attribut 4
+tim ba 2
+tim ba schem 1
+tim bar 1
+tim bar tim 1
+tim be tc 2
+tim becom 1
+tim becom insensit 1
+tim befor com 1
+tim befor upd 1
+tim behavior 1
+tim behaviour 1
+tim between proc 1
+tim between ti 1
+tim bigger 1
+tim bind 1
+tim bomb 1
+tim bound 8
+tim breakdown 1
+tim by ca 1
+tim by check 2
+tim by determin 1
+tim by using 3
+tim c.f 1
+tim ca 1
+tim cal 1
+tim calcl 1
+tim can exceed 1
+tim can var 1
+tim cannot entir 1
+tim catalog 1
+tim chang 1
+tim channel 1
+tim channel establishm 1
+tim character 2
+tim cl 2
+tim cl loop 1
+tim cluster 1
+tim cluster becom 1
+tim collect 1
+tim collect commun 1
+tim complec 15
+tim complec bound 2
+tim complec cl 1
+tim complec hierarch 1
+tim complec measur 1
+tim complec prov 1
+tim compon 1
+tim comput 2
+tim comput funct 1
+tim comput membership 1
+tim comput tim 1
+tim conflict 1
+tim consider 2
+tim constraint 4
+tim constraint becom 1
+tim construc 2
+tim construc funct 1
+tim consum 11
+tim consum comput 1
+tim consum part 1
+tim consum ph 1
+tim consum problem 1
+tim consum proc 1
+tim consum program 1
+tim consum repr 1
+tim consum task 1
+tim control 1
+tim correspon 2
+tim cost 5
+tim cost measur 1
+tim csg 2
+tim csg render 2
+tim csp 1
+tim cur 1
+tim cur slav 1
+tim d absolut 1
+tim d2 1
+tim dat 4
+tim dat dep 1
+tim dat extract 1
+tim dat model 1
+tim datab 3
+tim datab record 1
+tim datab system 2
+tim dav 1
+tim de. 1
+tim dec 2
+tim dec problem 1
+tim dec procedur 1
+tim dec se 1
+tim decr 3
+tim del 2
+tim del coord 1
+tim del dep 1
+tim del emb 1
+tim del neur 2
+tim deliv 1
+tim dep 6
+tim dep flow 1
+tim dep imp 1
+tim dep problem 1
+tim describ 1
+tim descript 1
+tim design 2
+tim design langu 1
+tim design work 1
+tim determin 2
+tim dfg 1
+tim differ 1
+tim dim 3
+tim direct turn 1
+tim displ 1
+tim distribut 2
+tim domain 1
+tim doubl 1
+tim doubl tim 1
+tim du 1
+tim dual 1
+tim dual algorithm 1
+tim dur 1
+tim dur interv 1
+tim e1 1
+tim ea 1
+tim eff 1
+tim elap 1
+tim en 1
+tim en secon 1
+tim environm 1
+tim environm init 1
+tim equ 3
+tim equiv 1
+tim er 1
+tim error 1
+tim estim 1
+tim event 1
+tim event occur 1
+tim exceed 1
+tim exploit 1
+tim exploit context 1
+tim expr 1
+tim fac 1
+tim fac tim 1
+tim fact 1
+tim fal 1
+tim faster 6
+tim first tim 1
+tim follow 1
+tim for bandwidth 1
+tim for client 1
+tim for coar 1
+tim for compl 1
+tim for comput 1
+tim for fft 1
+tim for fl 1
+tim for idl 1
+tim for inser 1
+tim for inst 1
+tim for logn 1
+tim for multicast 1
+tim for near 1
+tim for osl 1
+tim for pag 1
+tim for parallel 1
+tim for parameter 1
+tim for perform 1
+tim for random 1
+tim for rang 1
+tim for reason 1
+tim for schedl 1
+tim for search 1
+tim for select 1
+tim for sequ 1
+tim for singl 1
+tim for slav 1
+tim for solut 1
+tim for stud 1
+tim for ttlc 1
+tim for ttlh 1
+tim for upd 1
+tim for user 1
+tim for var 1
+tim for wgp 1
+tim for workload 1
+tim format 1
+tim fram 1
+tim frequ 1
+tim frequ an 1
+tim frequ dict 1
+tim from behavior 1
+tim funct 1
+tim garb 1
+tim garb collect 1
+tim ge 1
+tim ge farther 1
+tim gener 3
+tim gener algorithm 1
+tim giv 1
+tim go 1
+tim goal 2
+tim granl 2
+tim greater 1
+tim growth 1
+tim growth comparison 1
+tim hav grown 1
+tim heur 2
+tim hierarch 2
+tim hierarch concept 1
+tim hierarch wh 1
+tim high 1
+tim hist 1
+tim hopkin 1
+tim how templ 1
+tim hypercub 1
+tim hypercub algorithm 1
+tim i hit 1
+tim identif 1
+tim identif schem 1
+tim if appropr 1
+tim imp 1
+tim in datab 2
+tim in developm 1
+tim in fact 1
+tim in fram 1
+tim in inl 1
+tim in inst 1
+tim in interpr 1
+tim in microsecon 1
+tim in ms 1
+tim in object 1
+tim in oe 1
+tim in order 1
+tim in pe 1
+tim in sc 1
+tim in scientif 1
+tim in secon 2
+tim in theorem 1
+tim in weight 1
+tim inclus 2
+tim inclus cpu 1
+tim incr 5
+tim incr sharp 1
+tim ind 4
+tim ind respect 1
+tim inform 2
+tim init 1
+tim inner 1
+tim inner loop 1
+tim inst 3
+tim inst separ 1
+tim instead 2
+tim interv 7
+tim invar 1
+tim invar key 1
+tim invest 1
+tim investm 1
+tim is accur 1
+tim is achief 1
+tim is const 1
+tim is consum 1
+tim is control 1
+tim is determin 1
+tim is expect 1
+tim is fast 1
+tim is giv 1
+tim is glob 1
+tim is greater 1
+tim is high 2
+tim is impact 1
+tim is insensit 1
+tim is known 1
+tim is lim 1
+tim is maintain 1
+tim is measur 2
+tim is minim 2
+tim is multipl 1
+tim is neglig 1
+tim is polynom 1
+tim is reduc 1
+tim is requir 1
+tim is restrict 1
+tim is shown 1
+tim is signif 1
+tim is simp 1
+tim is smaller 1
+tim is specif 1
+tim is spen 1
+tim is spent 2
+tim is split 1
+tim is unambigu 1
+tim isomorph 1
+tim it tak 3
+tim it want 1
+tim iter 1
+tim iter predict 1
+tim jump 1
+tim lag 2
+tim larger 2
+tim larger system 1
+tim later bil 1
+tim le tim 1
+tim learn 1
+tim leav 1
+tim lim 3
+tim lim optim 1
+tim lim se 1
+tim lin 2
+tim load 1
+tim loc 2
+tim loc link 1
+tim loc search 1
+tim logarithm 1
+tim longer 1
+tim lost 1
+tim mac 1
+tim maintain 1
+tim mak 1
+tim may occur 1
+tim me 1
+tim me object 1
+tim measur 4
+tim membership 1
+tim membership compar 1
+tim membership proper 1
+tim memor 1
+tim memor disambigu 1
+tim methodolog 1
+tim minor 1
+tim minor test 1
+tim mop 1
+tim mor sensit 1
+tim mot 1
+tim mot requir 1
+tim much shorter 1
+tim multicast 1
+tim multicast me 1
+tim n chang 1
+tim nam 1
+tim nam run 1
+tim nec 2
+tim no chang 1
+tim no decr 1
+tim nonlin 1
+tim nonlin system 1
+tim o belong 1
+tim o log 1
+tim o se 1
+tim o tcol 1
+tim o0 1
+tim o0 belong 1
+tim o1 1
+tim o2 1
+tim o4 1
+tim obtain 2
+tim occur 1
+tim oe 1
+tim of 5ns 1
+tim of algorithm 2
+tim of arithm 1
+tim of atc 1
+tim of chac 1
+tim of cl 1
+tim of crash 1
+tim of departur 1
+tim of div 1
+tim of event 1
+tim of failur 1
+tim of fft 2
+tim of fsu 1
+tim of gaus 1
+tim of gr 1
+tim of kirchoff 1
+tim of laplac 1
+tim of lu 1
+tim of md 1
+tim of mmd 1
+tim of multilevel 1
+tim of order 1
+tim of partitiong 1
+tim of proc 1
+tim of quer 1
+tim of recur 1
+tim of rest 1
+tim of rout 1
+tim of se 1
+tim of search 1
+tim of selectintertest 1
+tim of selecttest 1
+tim of shar 1
+tim of spat 1
+tim of synchron 1
+tim of system 1
+tim of tempor 1
+tim of timesl 1
+tim of ttl 1
+tim of var 2
+tim of wgp 1
+tim of writ 2
+tim of xt 1
+tim ok 1
+tim ok tk 1
+tim on extrem 1
+tim on p1 1
+tim on parallel 1
+tim on po 1
+tim on proc 2
+tim on rang 1
+tim open fail 1
+tim openshop 1
+tim openshop problem 1
+tim oper 2
+tim oper model 1
+tim oper system 1
+tim opt 1
+tim optim 3
+tim optim leader 1
+tim optim multipl 1
+tim or laz 1
+tim or pa 1
+tim or remain 2
+tim or run 1
+tim or scal 1
+tim or schedl 1
+tim order 1
+tim orient 1
+tim orient algebr 1
+tim out period 1
+tim out valu 1
+tim over actu 1
+tim overhead 2
+tim pag 1
+tim pag fault 1
+tim pair 1
+tim parameter 3
+tim parameter tacpt 1
+tim parameter tdsp 1
+tim part 1
+tim per by 1
+tim per elimin 1
+tim per failur 1
+tim per gu 1
+tim per iter 3
+tim per me 1
+tim per multicast 1
+tim per se 1
+tim per step 1
+tim per word 1
+tim per workload 1
+tim perform 2
+tim perform intersect 1
+tim period 1
+tim period ri 1
+tim period wh 1
+tim ph 1
+tim point 2
+tim point loc 1
+tim point til 1
+tim polynom 1
+tim pr 1
+tim pressur 1
+tim pressur ec 1
+tim produc 1
+tim profil 1
+tim project 1
+tim proper 1
+tim proport 2
+tim qd 1
+tim qu 1
+tim qu proc 1
+tim quadr 1
+tim quest 1
+tim rang 1
+tim rang siz 1
+tim rat 1
+tim rec 1
+tim recurrenttrain 1
+tim reduc 3
+tim refer 1
+tim reflect 1
+tim rel 3
+tim rel con 1
+tim remain 2
+tim remain const 1
+tim report 2
+tim repr 2
+tim requir 21
+tim requir imp 1
+tim requir using 1
+tim result 2
+tim rt 1
+tim sampl 1
+tim sampl branch 1
+tim sauer 1
+tim sav 2
+tim saving 1.5d 1
+tim scal 3
+tim scal inver 1
+tim schedl 4
+tim schedl heur 1
+tim schedl using 1
+tim separ 1
+tim separ object 1
+tim sequ 2
+tim sequ algorithm 1
+tim sequ init 1
+tim ser 1
+tim ser an 1
+tim ser competit 1
+tim ser model 1
+tim ser predict 1
+tim ser problem 1
+tim shar 1
+tim shop 1
+tim shop problem 1
+tim show 1
+tim shown 1
+tim signif 1
+tim simplif 1
+tim sinc system 1
+tim slot 2
+tim slower 2
+tim smaller 1
+tim solut 4
+tim som border 1
+tim spac 3
+tim spac consum 1
+tim spac perform 1
+tim spac resourc 1
+tim specif 1
+tim speedup 1
+tim speedup fact 1
+tim spen 1
+tim spen wait 1
+tim spent 6
+tim spent execut 1
+tim spent perform 1
+tim stack 1
+tim stamp 7
+tim stamp fn 1
+tim stamp repr 1
+tim stamp system 1
+tim stamp techniqu 1
+tim stamp ts 1
+tim step 9
+tim step ahead 1
+tim step block 1
+tim step earl 1
+tim step i1 1
+tim step i2 1
+tim step requir 1
+tim step separ 1
+tim step substr 1
+tim step t1 1
+tim step zer 1
+tim string 1
+tim styl 1
+tim surfac 1
+tim surfac sect 1
+tim synchron 1
+tim system 8
+tim system an 1
+tim system pract 1
+tim system prov 1
+tim system support 1
+tim t iff 1
+tim t li 1
+tim t schedl 1
+tim t t0 1
+tim t t1 1
+tim t0 3
+tim t00 1
+tim t1 5
+tim t1 tak 1
+tim t2 4
+tim t2 t1 2
+tim t3 2
+tim t4 1
+tim tacpt 1
+tim tag 1
+tim tag ti 1
+tim tak 9
+tim tc 3
+tim tcom 1
+tim tcomp 1
+tim tempor 3
+tim tempor log 2
+tim ten 1
+tim terrain 1
+tim terrain visu 1
+tim test 1
+tim tf 1
+tim tfk 1
+tim th addr 1
+tim th algorithm 1
+tim th anchor 1
+tim th appl 1
+tim th aver 1
+tim th confid 1
+tim th congest 1
+tim th constraint 1
+tim th cur 1
+tim th designer 1
+tim th expr 1
+tim th host 1
+tim th incom 1
+tim th inform 1
+tim th leftmost 2
+tim th length 1
+tim th molecl 1
+tim th nod 1
+tim th number 1
+tim th optim 2
+tim th pointer 1
+tim th pot 1
+tim th proc 1
+tim th queu 1
+tim th requir 1
+tim th server 1
+tim th slrn 1
+tim th thread 1
+tim th tot 1
+tim th triangl 1
+tim th weight 1
+tim than fal 1
+tim than gr 1
+tim than softwar 1
+tim that greater 1
+tim that imag 1
+tim that job 1
+tim that mach 1
+tim that pa 1
+tim that rmsp 1
+tim that sa 1
+tim that tok 1
+tim through ineff 1
+tim ti 1
+tim tim 1
+tim tim tim 1
+tim tinter 1
+tim tk 1
+tim tl 1
+tim tl 2d 1
+tim tlogn 1
+tim tm 1
+tim to acc 1
+tim to acquir 1
+tim to attribut 1
+tim to backpropag 1
+tim to character 1
+tim to check 1
+tim to compl 1
+tim to comput 2
+tim to demultiplec 1
+tim to evalu 1
+tim to exchang 1
+tim to execut 2
+tim to explor 1
+tim to fetch 2
+tim to find 2
+tim to gener 1
+tim to improv 1
+tim to keep 1
+tim to load 1
+tim to look 1
+tim to mov 1
+tim to obtain 1
+tim to pa 1
+tim to perform 3
+tim to proc 1
+tim to produc 3
+tim to propag 1
+tim to read 1
+tim to rec 1
+tim to reduc 1
+tim to respon 1
+tim to retrain 1
+tim to sen 2
+tim to serv 2
+tim to settl 1
+tim to ship 1
+tim to specl 1
+tim to spen 1
+tim to succ 1
+tim to tim 2
+tim to transfer 1
+tim to transm 4
+tim to traver 1
+tim to tx 1
+tim to upd 1
+tim to us 1
+tim tp 1
+tim tp lmac 1
+tim tpk 1
+tim tpm 1
+tim tr 1
+tim tr client 1
+tim trad 1
+tim trad off 1
+tim tradeoff 1
+tim transact 1
+tim transposit 1
+tim transposit oracl 1
+tim tx 3
+tim tx0 1
+tim tx0 ptx 1
+tim typ 1
+tim typ check 1
+tim under var 1
+tim unit 5
+tim unit elap 1
+tim unoptim 1
+tim unoptim upd 1
+tim until user 1
+tim upd 2
+tim upd period 1
+tim user 1
+tim user input 1
+tim using 9
+tim using loc 1
+tim using spf 1
+tim valu 3
+tim valu assoc 1
+tim valu determin 1
+tim var 4
+tim var aspect 1
+tim var attribut 1
+tim var dat 1
+tim var extern 1
+tim var quer 1
+tim var util 1
+tim vect 1
+tim ver 1
+tim viol 1
+tim vs 2
+tim vs.group 1
+tim vs.group siz 1
+tim wa allow 1
+tim wa approxim 1
+tim wa assum 1
+tim wa giv 1
+tim wa introduc 1
+tim wa rip 1
+tim wa se 1
+tim wa spent 1
+tim wait 1
+tim warp 1
+tim wast 1
+tim we obtain 1
+tim we spen 1
+tim we wit 1
+tim when start 1
+tim whil comp 1
+tim window 1
+tim with osl 1
+tim with prev 1
+tim with respect 3
+tim with us 1
+tim without comprom 1
+tim work 1
+tim work transfer 1
+tim xf 1
+tim xp 1
+tim xs 1
+tim ya 1
+tim yp 1
+tim ys 1
+tim zer 1
+tim zon 1
+tim.16 1
+tim.2 1
+tim.4 1
+tim.4 refer 1
+tim.5 1
+tim.5 client 1
+tim.h 1
+tim.h inclus 1
+tim.h inclus maspar 1
+tim1 1
+tim100.0 1
+tim1234567a3a4a5a7a7b7b3b4b6b5b1b2b2pictur 1
+tim1234567a3a4a5a7a7b7b3b4b6b5b1b2b2pictur aa 1
+tim1234567a3a4a5a7a7b7b3b4b6b5b1b2b2pictur aa bstract 1
+tim1t2t3 1
+tim2 1
+tim3 1
+timec 1
+timedec 1
+timedec problem 1
+timedel 1
+timedel neur 1
+timedel neur network 1
+timef 1
+timej 1
+timel 4
+timel and context 1
+timel part 1
+timem 1
+timeout 4
+timeout and retransm 1
+timeout argum 1
+timeout object 1
+timeout occur 1
+timeout period 1
+timeout then retransm 1
+timeout tim 1
+timeout tim unit 1
+timeout wa reach 1
+timer 4
+timer acc 1
+timer assoc 1
+timer expir 1
+timer is se 1
+timer period 1
+timer period maxcountv 1
+timer specif 1
+timer that estim 1
+timer to control 1
+timer to detect 1
+timer valu 2
+timeserver 1
+timeserver 1server 1
+timeserver 1server 2server 1
+timeshar 1
+timeshar proc 1
+timesl 2
+timesl ar sav 1
+timesl as out 1
+timesl at tim 1
+timesl closest 1
+timesl comput 1
+timesl comput follow 1
+timesl for day 1
+timesl in adv 1
+timesl in transact 1
+timesl is comput 1
+timesl is shown 1
+timesl oper 1
+timesl qu 1
+timesl rel 1
+timesl tim 1
+timesl using 1
+timesl using differ 1
+timesl when using 1
+timestamp 11
+timestamp 1nf 1
+timestamp 1nf rel 1
+timestamp and attribut 1
+timestamp and prov 1
+timestamp and tupl 1
+timestamp approach 1
+timestamp ar gener 1
+timestamp ar increm 1
+timestamp ar inser 1
+timestamp assoc 1
+timestamp ba 2
+timestamp ba algorithm 1
+timestamp ba cach 1
+timestamp calcl 1
+timestamp calcl indep 1
+timestamp chang 1
+timestamp chang dep 1
+timestamp comput 1
+timestamp comput algorithm 1
+timestamp equ 1
+timestamp es 1
+timestamp es order 1
+timestamp event 1
+timestamp event involut 1
+timestamp flip 1
+timestamp grow 1
+timestamp grow tw 1
+timestamp in virtualclock 1
+timestamp is form 1
+timestamp lower 1
+timestamp occup 1
+timestamp of proc 1
+timestamp of t0 1
+timestamp or bound 1
+timestamp order 1
+timestamp pack 1
+timestamp shar 1
+timestamp shar dat 1
+timestamp sinc se 1
+timestamp system 1
+timestamp to order 1
+timestamp ts 2
+timestamp tsp 1
+timestamp ttl 1
+timestamp tx 1
+timestamp tx0 1
+timestamp valu 1
+timestamp wh 1
+timestamp wh fram 1
+timestamp wh rel 1
+timestep 1
+timestep comput 1
+timestep siz 1
+timetim 1
+timetim tosendfirstm 1
+timetim tosendfirstm loc 1
+timetimetim 1
+timetimetim to sen 1
+timoth 2
+timoth man 1
+tin 7
+tin chunk 1
+tin chunk siz 1
+tin lo 1
+tin port 1
+tin program 1
+tin using 1
+ting 4
+tinit 2
+tinit tx 1
+tinter 1
+tion 14
+tion a ref 1
+tion dep 1
+tion dun 1
+tion dun instruc 1
+tion it st 1
+tion network 1
+tion or degener 1
+tion technolog 1
+tip 3
+tip de 1
+tip de problem 1
+tiqu 2
+tiqu de 1
+tiqu de noter 1
+tiqu et sur 1
+tiqu se 1
+tir 4
+tir a partir 1
+tir au 1
+tir au sort 1
+tir avec 1
+tir avec rem 1
+tir de 2
+tir de la 1
+tir de tj 1
+tir de transit 1
+tir de variabl 1
+tir e al 1
+tir e au 1
+tir e aucun 1
+tir e avec 1
+tir e dan 1
+tir e de 1
+tir ee 3
+tir ee al 1
+tir ee de 2
+tir ee en 1
+tir part 2
+tir part de 1
+tir part du 2
+tir sur 1
+tir sur se 1
+tirabl 1
+tirabl a partir 1
+tirabl en 1
+tirabl en m0 1
+tirabl en xn 1
+tirer 3
+tirer de 2
+tirer de estimateur 1
+tirer de le 1
+tirer le 1
+tirer le conclus 1
+tirer le enseign 1
+tirer part 2
+tirer part de 1
+tirer part du 2
+tirer part dun 1
+tirer profit 1
+tirer profit de 1
+tirer tout 1
+tirer tout le 1
+tiser 1
+tiser ce 1
+tiser ce int 1
+tisharp 1
+tisld 1
+tisld resolut 1
+tissu 1
+tist 1
+tist gi 1
+titl 9
+titl a model 1
+titl and abstract 1
+titl etc 1
+titl object 1
+titl object orient 1
+titr 3
+titr com 1
+titr de 2
+tj 9
+tj a partir 1
+tj au 1
+tj au cour 1
+tj dan 1
+tj dan la 1
+tj ej 1
+tj est 1
+tj est tir 1
+tj est un 1
+tj forbid 1
+tj forbid color 1
+tj k2 1
+tj nx 1
+tj par 1
+tj s 1
+tj sont 1
+tj sont deux 1
+tj tirabl 1
+tj tirabl en 1
+tj tk 1
+tj v erif 1
+tj0 1
+tj1 1
+tjad 1
+tjad and flyn 1
+tjg 1
+tjn 1
+tjublog 1
+tjublog tc 1
+tjublog tc 1j 1
+tk 11
+tk ar classif 1
+tk ar span 1
+tk est 1
+tk est le 1
+tk is comput 1
+tk is defin 1
+tk log 1
+tk s ecrit 1
+tk t1 1
+tk targ 1
+tk targ valu 1
+tk tg 1
+tk th tim 1
+tk tk 1
+tk zk 1
+tk1 1
+tk1 k2 1
+tk1 k2 fun 1
+tk2 1
+tkac 1
+tkmin 1
+tl 7
+tl 2d 1
+tl 2d 2d 1
+tl 2d 3d 1
+tl and ex 1
+tl and tl 1
+tl at level 1
+tl de 1
+tl de oe 1
+tl is writ 1
+tl nil 1
+tl ri 1
+tl rl 1
+tl sen 1
+tl tabl 1
+tl th valu 1
+tl which return 1
+tl wil sen 1
+tlayout 1
+tlayout is shown 1
+tlayout t2t3 1
+tlayout t2t3 measur 1
+tlb 1
+tlb and cach 1
+tlb entr 1
+tlb reload 1
+tlevel 1
+tloc 1
+tloc per pag 1
+tloc tresult 1
+tlogn 1
+tlogn t0 1
+tlogn t0 plogn 1
+tlp 1
+tlp v iff 1
+tm 9
+tm 2ff 1
+tm by server 1
+tm c hold 1
+tm in oe1 1
+tm pm 1
+tmc 3
+tmc cm 2
+tmf 1
+tmg 1
+tmg of length 1
+tmj 1
+tmj 94a 1
+tmp 1
+tmp c0 1
+tmp c0 vy 1
+tmp en 1
+tmp vy 1
+tmprob 1
+tn 16
+tn 2i 1
+tn 2im 1
+tn and deg 1
+tn de 1
+tn de la 1
+tn deg 1
+tn entr 1
+tn entr rn 1
+tn giv 1
+tn inter 1
+tn inter switch 1
+tn io 1
+tn li 1
+tn li ee 1
+tn m stat 1
+tn m switch 1
+tn n deg 1
+tn n fl 1
+tn n interm 1
+tn n tn 1
+tn n unit 1
+tn n2 1
+tn nonblock 1
+tn nonblock stat 1
+tn oen 1
+tn oentn 1
+tn of maxim 1
+tn p2 1
+tn p2 log 1
+tn peut 1
+tn peut etr 1
+tn pn 1
+tn prg 1
+tn stat 1
+tn stat nod 1
+tn tn 1
+tn to match 1
+tn unit 1
+tn unit cap 1
+tn with upd 1
+tn.spec 1
+tn.spec tspec.good 1
+tn0 1
+tng 2
+tnvn 1
+to 1
+to msg 1
+to msg baseact 1
+to msg dest 1
+to shown 1
+to. 1
+to89 1
+toam 1
+tobin 1
+toc 1
+tod 9
+tod domin 1
+tod domin voxel 1
+tod graph 1
+tod graph workst 1
+tod mowr 1
+tod standard 1
+tod standard web 1
+tod workst 1
+tod workst cl 1
+tod.1 1
+tod.1 as shown 1
+toen 1
+toeplitz 1
+toeplitz system 1
+tofac 1
+tofac commun 1
+tofac commun mod 1
+tofac commun seem 1
+tofront 1
+tofront implem 1
+tofront record 1
+toft 1
+togeather 1
+toggl 2
+toit 1
+toit pen 1
+toit pen de 1
+tok 22
+tok and act 2
+tok and cp 1
+tok and valu 1
+tok appear 1
+tok arriv 1
+tok circl 1
+tok circl satisf 1
+tok dat 1
+tok dat driv 1
+tok datadistribut 1
+tok datadistribut workload 1
+tok dataflow 1
+tok dataflow mach 1
+tok definit 1
+tok dynam 1
+tok dynam dataflow 1
+tok empl 1
+tok flow 1
+tok iff 1
+tok iff sn 1
+tok is circl 1
+tok japan 1
+tok level 1
+tok level cod 1
+tok lookahead 1
+tok lookahead implem 1
+tok modl 1
+tok of cl 1
+tok pa 1
+tok pa execut 1
+tok pr 1
+tok reach 1
+tok realn 1
+tok revisit 1
+tok ring 3
+tok ring network 1
+tok ring program 1
+tok ring reach 1
+tok systemconfigur 1
+tok systemconfigur dat 1
+tok that ar 1
+tok tim 1
+tok to proc 1
+tok typ 1
+tok using 1
+tok varl 1
+tok varl wh 1
+tok with num 1
+tok with valu 1
+tok workloaddescript 1
+tok workloaddescript performancegoalspecificationl 1
+tok ydepartm 1
+tok.ac.jp 2
+tokor 1
+tokor orient84k 1
+tol 3
+tol er 1
+tol er ee 1
+told 3
+toler 19
+toler al st 1
+toler algorithm 1
+toler and avail 1
+toler and correct 1
+toler architectur 1
+toler both detect 1
+toler by intellig 1
+toler comput 5
+toler comput system 1
+toler correspon 1
+toler crash 1
+toler crash failur 1
+toler crash link 1
+toler dat 1
+toler dat lo 1
+toler detect 1
+toler detect fault 1
+toler f crash 1
+toler f failur 1
+toler f gener 1
+toler f rec 1
+toler f sen 1
+toler fflt 1
+toler for learn 1
+toler gener 1
+toler gener om 1
+toler in bar 1
+toler in concur 1
+toler in distribut 1
+toler in order 1
+toler individu 1
+toler individu compon 1
+toler lim 1
+toler longer 1
+toler longer respon 1
+toler of distribut 1
+toler on crash 1
+toler on failur 1
+toler partit 1
+toler protocol 2
+toler queu 1
+toler rec 1
+toler rec om 1
+toler receiveom 1
+toler receiveom failur 1
+toler requir 1
+toler schem 1
+toler sen 1
+toler sen om 1
+toler serv 1
+toler serv using 1
+toler system 1
+toler techniqu 1
+toler th laz 1
+toler to detect 1
+toler to undetect 1
+toler topolog 1
+toler undetect 1
+toler undetect fault 1
+toler wa se 1
+tom 6
+tom corm 1
+tom fsh 1
+tom jaakkol 1
+tom lov 1
+tom pr 1
+tom sh 1
+tom sh jan 1
+tom toy 1
+tom toy jan 1
+tomber 2
+tomber dan 2
+tomber dan certain 1
+tomcatv 1
+tomcatv and fp 1
+tomcatv mesh 1
+tomcatv program 1
+tomcatv program near 1
+tomcatv show 1
+tomcatv show var 1
+tomek 1
+tomkin 1
+tomlin 1
+tomlinson 1
+tomograph 3
+tomograph cr 1
+tomograph cr sect 1
+tomograph system 1
+tomorrow 1
+tomp 1
+ton 8
+ton chen 1
+ton cohn 1
+ton dod 1
+ton mus 1
+ton text 1
+ton text string 1
+ton87 1
+tong 1
+tong cp 1
+tongu 1
+tongu ti 1
+took 16
+took a random 1
+took a step 1
+took adv 1
+took le tim 1
+took part 1
+took plac 1
+took scot 1
+took scot snib 1
+took sever cpu 1
+took th approach 1
+took th author 1
+took th default 1
+took th edg 1
+took th system 1
+tool 51
+tool act 1
+tool al perform 1
+tool allow 2
+tool and conduc 1
+tool and context 1
+tool and explan 1
+tool and microsoft 1
+tool and pract 1
+tool and proceed 1
+tool and techniqu 1
+tool appl 1
+tool ar appl 1
+tool ar avail 1
+tool ar explain 1
+tool ar help 1
+tool ar langu 1
+tool ar tight 1
+tool ar us 1
+tool architectur 1
+tool as server 1
+tool ast 1
+tool ast extract 1
+tool avail 2
+tool ba 2
+tool becam 1
+tool becam avail 1
+tool by reappl 1
+tool c allow 1
+tool cal casch 1
+tool contain 1
+tool design 1
+tool develop 2
+tool developm 1
+tool developm project 1
+tool do allev 1
+tool ea 1
+tool ea wright 1
+tool effect 1
+tool effect yield 1
+tool either mak 1
+tool for acc 1
+tool for achief 1
+tool for artif 1
+tool for autom 1
+tool for break 1
+tool for cad 1
+tool for chang 1
+tool for construc 1
+tool for determin 1
+tool for find 1
+tool for form 1
+tool for graph 1
+tool for landmark 1
+tool for parallel 1
+tool for pol 1
+tool for support 1
+tool for vid 1
+tool for visu 1
+tool from ec 1
+tool funct 1
+tool gener 2
+tool ha subst 1
+tool help 1
+tool identif 1
+tool in complec 1
+tool in develop 1
+tool in distribut 1
+tool in investig 1
+tool in requir 1
+tool in typ 1
+tool in understand 1
+tool int 1
+tool integr 1
+tool issu 1
+tool lack 1
+tool lik lec 1
+tool lower 1
+tool mak 1
+tool mak us 1
+tool model 1
+tool orient 1
+tool prov 1
+tool prov mean 1
+tool ra 1
+tool ra futher 1
+tool rapid 1
+tool rapid using 1
+tool satisf 1
+tool se 1
+tool select 1
+tool sourc 1
+tool sourc gener 1
+tool support 3
+tool th con 1
+tool that allow 2
+tool that ap 1
+tool that automat 1
+tool that build 1
+tool that deal 1
+tool that me 1
+tool that support 2
+tool that us 1
+tool to an 1
+tool to automat 1
+tool to build 1
+tool to construc 1
+tool to control 1
+tool to def 1
+tool to demonstr 1
+tool to design 1
+tool to gener 1
+tool to prepar 1
+tool to preproc 1
+tool to show 1
+tool to siml 1
+tool to support 4
+tool to tackl 1
+tool to understand 1
+tool trigger 1
+tool us 1
+tool usag 1
+tool using 2
+tool wa ask 1
+tool wa built 1
+tool we us 1
+tool which great 1
+tool which guid 1
+tool which help 2
+tool which prom 1
+tool whil part 1
+tool with appl 1
+toolbox 1
+toolkit 2
+toolsremot 1
+toolsremot serverssystem 1
+toolsremot serverssystem generationtoolshardwar 1
+tooz 1
+top 56
+top and bottom 1
+top and reflec 1
+top as horn 1
+top best cl 1
+top block 1
+top confid 1
+top down approach 3
+top down definit 1
+top down denot 1
+top down growth 1
+top down program 1
+top down sld 1
+top down techniqu 1
+top dun 1
+top dun horlog 1
+top dynam 1
+top dynam bind 1
+top dynam environm 1
+top for further 1
+top half 1
+top hierarch 1
+top is ext 1
+top laser 1
+top laser strip 1
+top lec 1
+top lec bind 1
+top lec environm 1
+top left ca 1
+top level 10
+top level act 1
+top level algorithm 1
+top level architectur 1
+top level attempt 1
+top level constraint 1
+top level credit 1
+top level descript 2
+top level ensur 1
+top level evalu 1
+top level hard 1
+top level manag 1
+top level network 2
+top level strateg 1
+top level tak 1
+top level transact 1
+top level user 1
+top lin 1
+top m level 1
+top ma 1
+top ma qu 1
+top middl 1
+top middl ca 1
+top most investig 1
+top most nod 1
+top nest 1
+top nest quun 1
+top of ec 1
+top of eram 1
+top of fair 1
+top of heap 1
+top of s1 1
+top of s2 1
+top of sep 1
+top of trail 1
+top peopl 1
+top peopl evar.html 1
+top port 1
+top prolog 1
+top prolog mach 1
+top reduc 1
+top rl 1
+top rl actu 1
+top row 2
+top se 1
+top split 1
+top stud 1
+top thr curv 1
+top tw answer 1
+top tw curv 1
+top view 3
+top which help 1
+topl 1
+toplec 1
+toplec environm 1
+toplevel 1
+toplevel transact 1
+topmost 4
+topmost edg 1
+topmost entr 1
+topmost gat 1
+topmost gat gtop 1
+topmost stack 1
+topmost stack entr 1
+topoint 2
+topoint commun 1
+topoint commun oper 1
+topoint connect 1
+topol. 1
+topolog 25
+topolog 2d 1
+topolog adopt 1
+topolog adopt ee 1
+topolog allow 1
+topolog allow ad 1
+topolog and appl 1
+topolog and def 1
+topolog and larger 1
+topolog and meter 1
+topolog ba 1
+topolog broadcast 1
+topolog broadcast period 1
+topolog but larger 1
+topolog ch 2
+topolog chang 1
+topolog cl 1
+topolog cl yield 1
+topolog complec 1
+topolog con 1
+topolog consid 1
+topolog consid er 1
+topolog de 1
+topolog de leur 1
+topolog dep 1
+topolog distinct 1
+topolog distinct situ 1
+topolog du 1
+topolog dur learn 1
+topolog dynam 1
+topolog equiv 1
+topolog equiv diagram 1
+topolog fic 1
+topolog fil 1
+topolog for model 1
+topolog hav shown 1
+topolog hypercub 1
+topolog hypercub sur 1
+topolog in loc 1
+topolog in mind 1
+topolog in overcom 1
+topolog increm 1
+topolog is assum 1
+topolog is fic 1
+topolog is incr 1
+topolog is specif 1
+topolog lik debruijn 2
+topolog link 1
+topolog network 1
+topolog network wh 1
+topolog of comput 1
+topolog of fact 1
+topolog of figur 1
+topolog of molecl 1
+topolog oft suffer 1
+topolog param 1
+topolog param seq 1
+topolog proper 2
+topolog qu 1
+topolog qu peut 1
+topolog refer 1
+topolog rel 1
+topolog remain 1
+topolog remain fic 1
+topolog return 1
+topolog return succ 1
+topolog simpl 1
+topolog st 1
+topolog tabl 1
+topolog th topolog 1
+topolog that natur 1
+topolog that remain 1
+topolog typ 2
+topolog var 1
+topolog var de 1
+topolog wh 1
+topolog wh stat 1
+topolog which support 1
+topolog wil slight 2
+topolog with assoc 2
+topolog with rad 1
+topolog.instead 1
+topor 1
+tor 9
+tor and hypercub 1
+tor angl 1
+tor angl giv 1
+tor angl oe 1
+tor angl spac 1
+tor de 1
+tor2 1
+tor3 1
+tor4 1
+torbjorn 1
+torbjorn wiberg 1
+torel 2
+torel et al 1
+torenvl 1
+torgerson 1
+torgerson gower 1
+torgerson gower tr 1
+torgerson32 1
+torid 1
+torid void 1
+torid void hypercub 1
+torid void tor3 1
+torid void tor4 1
+toright 1
+toront 6
+toront techn 1
+toront techn report 1
+torp 1
+torp le 1
+torp le mark 1
+torp wa support 1
+torrel 1
+tort 1
+torus 3
+torus and shar 1
+torus network 1
+torus topolog 1
+tosendfirstm 1
+tosendfirstm loc 1
+tosendfirstm loc proc 1
+toshih 1
+toshih ibarak 1
+tosl 1
+tosl nnzwgp 1
+tosl nnzwgp nfwgp 1
+tosl twgp 1
+tosl twgp tosl 1
+tospeech 1
+tospeech system 1
+tot 80
+tot aa 1
+tot aa shar 1
+tot accord 1
+tot accord sur 1
+tot ad 1
+tot amount 4
+tot and gl 1
+tot angl 1
+tot angl traver 1
+tot ar 1
+tot ar straightfor 1
+tot asynchr 1
+tot asynchr offr 1
+tot backtrack 1
+tot backtrack father 1
+tot board 2
+tot board ar 2
+tot board spac 2
+tot boyer 1
+tot budg 1
+tot buffer 1
+tot buffer spac 1
+tot can deliv 1
+tot cap 1
+tot cardin 1
+tot centr 1
+tot centr buffer 1
+tot coh 1
+tot coh erent 1
+tot commun 2
+tot commun tim 2
+tot compar 1
+tot compar hierarch 1
+tot connect 2
+tot cont 1
+tot contribut 1
+tot correct 1
+tot cost 2
+tot cost var 1
+tot cpu 1
+tot cpu tim 1
+tot cputim 1
+tot cycl 1
+tot cycl length 1
+tot d etermin 1
+tot dat 1
+tot db 1
+tot db siz 1
+tot de 3
+tot de comparaison 1
+tot de conflit 1
+tot de la 1
+tot de lenviron 1
+tot de noeud 1
+tot de pag 1
+tot de retour 1
+tot deliv 1
+tot deliv rl 1
+tot determ 1
+tot determ correspon 1
+tot dic 2
+tot dic ecut 2
+tot differ voron 1
+tot dist 1
+tot du 1
+tot du faux 1
+tot dur 2
+tot ear deliv 1
+tot edg 1
+tot edg weight 1
+tot effort 1
+tot elap 1
+tot elap tim 1
+tot environm 1
+tot execut 6
+tot execut tim 6
+tot exploit 1
+tot fact 1
+tot fact tim 1
+tot failur 1
+tot failur prob 1
+tot flow 1
+tot funct 2
+tot fundam 1
+tot fundam cycl 1
+tot grid 1
+tot il 1
+tot implem 1
+tot incr 1
+tot inst 1
+tot inst funct 1
+tot instanc 1
+tot instanc es 1
+tot instruc 1
+tot instruc count 1
+tot inter 1
+tot inter cluster 1
+tot interconnect 2
+tot interconnect bandwidth 2
+tot internet 2
+tot internet link 2
+tot is invok 1
+tot knowledg 1
+tot lack 1
+tot lag 1
+tot lancz 1
+tot lancz method 1
+tot le 2
+tot le ch 1
+tot le faux 1
+tot le program 1
+tot length 2
+tot level 1
+tot level incr 1
+tot loc 1
+tot loc proc 1
+tot ma 1
+tot main 1
+tot main memor 1
+tot map 1
+tot monit 1
+tot n hyperplan 1
+tot network 1
+tot network throughput 1
+tot new heur 1
+tot new rol 1
+tot norm 1
+tot norm serv 1
+tot number 29
+tot number proc 1
+tot of 2nkn 1
+tot of 2tn 1
+tot of ar 2
+tot of largest 1
+tot of osl 1
+tot of qd 1
+tot of record 1
+tot of smallest 1
+tot of ti 1
+tot of wgp 1
+tot on chip 1
+tot order 6
+tot order algorithm 1
+tot order consensus 1
+tot order deliv 1
+tot order key 1
+tot order protocol 1
+tot order se 1
+tot path 1
+tot path length 1
+tot payoff 1
+tot payoff equ 1
+tot payoff tim 1
+tot perform 1
+tot period 1
+tot pi 1
+tot pinout 2
+tot protocol 1
+tot protocol reduc 1
+tot random 1
+tot random mut 1
+tot requir 1
+tot rest 1
+tot rest const 1
+tot router 1
+tot router cost 1
+tot row 1
+tot run 2
+tot run tim 2
+tot runtim 1
+tot sal 2
+tot sal var 1
+tot sampl 1
+tot sampl branch 1
+tot satisf 1
+tot se 1
+tot se siz 1
+tot serv 1
+tot serv offer 1
+tot serv perform 1
+tot serv rat 1
+tot siz 1
+tot softwar 1
+tot softwar budg 1
+tot solut 1
+tot solut tim 1
+tot spac 1
+tot speech 1
+tot speech dur 1
+tot speedup 1
+tot st 1
+tot st order 1
+tot sum 1
+tot sum squar 1
+tot surfac 1
+tot task 1
+tot task complec 1
+tot test 1
+tot test pool 1
+tot test se 1
+tot tim 9
+tot tim complec 1
+tot tim mac 1
+tot tim requir 1
+tot tim spent 1
+tot tot 1
+tot typ 1
+tot typ arith 1
+tot unfold 1
+tot unfold termin 1
+tot us 1
+tot user 1
+tot user interfac 1
+tot var 1
+tot vol 3
+tot vot 2
+tot weight 3
+tot with wid 1
+tot work 3
+tot work perform 1
+tot work requir 1
+totalsystempin 2
+totalsystempin count 2
+totalsystempin count 1d 2
+totaltimestat 1
+totinf 1
+tou 1
+touat 1
+touat et despain 1
+touch 10
+touch a giv 1
+touch a la 1
+touch a le 1
+touch an ec 1
+touch an exterior 1
+touch aux 1
+touch aux point 1
+touch dynam 1
+touch dynam dat 1
+touch exterior 1
+touch exterior edg 1
+touch form 1
+touch imag 1
+touch imag reg 1
+touch on tuesd 1
+touch oper 1
+touch st 1
+touch st upd 1
+touch th surfac 1
+touchst 1
+touchst delt 1
+touchst delt system 1
+toueg 1
+touegz 1
+tough 3
+tough to mak 2
+toujour 5
+toujour acc 1
+toujour acc ed 1
+toujour ain 1
+toujour appr 1
+toujour appr ec 1
+toujour au 1
+toujour au som 1
+toujour caus 1
+toujour caus dun 1
+toujour comparabl 1
+toujour compl 1
+toujour compl eter 1
+toujour compr 1
+toujour compr ehen 1
+toujour concentr 1
+toujour concentr ee 1
+toujour dacc 1
+toujour dacc eder 1
+toujour de 1
+toujour de solut 1
+toujour dispon 1
+toujour don 1
+toujour du 1
+toujour du part 1
+toujour egal 2
+toujour employer 1
+toujour employer ce 1
+toujour faus 1
+toujour im 1
+toujour im ediat 1
+toujour int 1
+toujour int er 1
+toujour l egal 1
+toujour l1 1
+toujour l1 min 1
+toujour la 1
+toujour le 1
+toujour le ca 1
+toujour le droit 1
+toujour par 1
+toujour par se 1
+toujour perform 1
+toujour po daugmenter 1
+toujour po de 2
+toujour po puisqu 1
+toujour po tel 1
+toujour quil 1
+toujour quil ny 1
+toujour r egl 1
+toujour recherch 1
+toujour repr 1
+toujour repr esent 1
+toujour requ 1
+toujour requ lor 1
+toujour se 1
+toujour se mettr 1
+toujour souhaitabl 1
+toujour souhaitabl en 1
+toujour stock 1
+toujour stock es 1
+toujour sur 1
+toujour sur le 1
+toujour termin 1
+toujour un 3
+toujour un individu 1
+toujour un part 1
+toujour un sel 1
+toujour utiliser 1
+toujour utiliser la 1
+toujour v erif 1
+toujour vr 1
+toul 1
+toul ii 1
+tour 4
+tour fair 1
+tour fair lobj 1
+tour par 1
+tour par le 1
+tourancheau 1
+touretzk 2
+tourn 2
+tourn a peu 1
+tourner 2
+tourner la 1
+tourner la rou 1
+tourner sur 1
+tourner sur de 1
+tournur 1
+tournur du 1
+tournur du par 1
+tous 5
+tous ce 3
+tous ce ca 1
+tous ce extr 1
+tous ce lang 1
+tous le 5
+tous le acc 1
+tous le argum 1
+tous le autr 3
+tous le bloc 1
+tous le ca 2
+tous le calcl 1
+tous le coeff 1
+tous le comp 1
+tous le conflit 1
+tous le coupl 1
+tous le deux 1
+tous le domain 1
+tous le echantillon 1
+tous le el 2
+tous le enregister 1
+tous le environ 1
+tous le exempl 1
+tous le incr 1
+tous le individus 1
+tous le mi 1
+tous le mouv 1
+tous le nid 1
+tous le niveaux 1
+tous le obj 1
+tous le op 1
+tous le point 1
+tous le pr 1
+tous le processeur 1
+tous le register 1
+tous le risqu 1
+tous le som 1
+tous le typ 1
+tous le vecteur 2
+tous le xi 1
+tous no 1
+tous no probl 1
+tous se 2
+tous se acc 1
+tous se etat 1
+tout 6
+tout a fait 1
+tout agc 1
+tout agc avec 1
+tout agc ne 1
+tout au 1
+tout aus 1
+tout aus bien 1
+tout aut 1
+tout autr 2
+tout autr etat 1
+tout autr repr 1
+tout autr term 1
+tout b en 1
+tout bon 1
+tout bon annl 1
+tout calcl 1
+tout ce 3
+tout ce cel 1
+tout ce claus 1
+tout ce paragraph 1
+tout ce part 1
+tout ce qu 2
+tout ce raison 1
+tout cel 2
+tout cel correspon 1
+tout cel qu 1
+tout ch 1
+tout ch not 1
+tout claus 1
+tout claus non 1
+tout com 1
+tout com eclip 1
+tout conjugu 1
+tout conjugu ee 1
+tout continu 1
+tout coupl 1
+tout coupl dit 1
+tout crin 1
+tout d ebut 1
+tout d epen 1
+tout dabord 4
+tout dabord de 1
+tout dabord distingu 1
+tout dabord etr 1
+tout dabord la 1
+tout dabord le 3
+tout dabord li 1
+tout dabord montr 1
+tout dabord qu 3
+tout dupl 1
+tout empil 1
+tout en 3
+tout en appliqu 1
+tout en conserv 1
+tout en diminu 1
+tout en en 1
+tout en etant 1
+tout en evit 2
+tout en ex 1
+tout en gard 1
+tout en lim 1
+tout en pren 1
+tout en profit 1
+tout en rest 1
+tout en soum 1
+tout en tir 1
+tout ent 3
+tout etat 1
+tout etat peut 1
+tout evalu 1
+tout evalu partiel3 1
+tout faux 1
+tout faux part 1
+tout fonct 2
+tout fonct com 1
+tout import 1
+tout indirect 1
+tout indirect est 1
+tout inst 1
+tout int 1
+tout int er 1
+tout l etat 1
+tout la 1
+tout la gest 1
+tout la pag 1
+tout la suit 1
+tout le 5
+tout le adr 1
+tout le appl 1
+tout le autr 1
+tout le born 1
+tout le cel 1
+tout le ch 1
+tout le claus 1
+tout le colon 1
+tout le con 1
+tout le contraint 1
+tout le cop 1
+tout le deux 1
+tout le don 2
+tout le ecritur 1
+tout le exp 1
+tout le fonct 2
+tout le grandeur 1
+tout le imag 1
+tout le inform 1
+tout le instruc 1
+tout le liaison 1
+tout le matr 1
+tout le mesur 1
+tout le modif 1
+tout le nid 1
+tout le norm 1
+tout le object 1
+tout le op 3
+tout le pag 1
+tout le pav 1
+tout le program 1
+tout le propr 1
+tout le structur 1
+tout le tail 1
+tout le tc 1
+tout le transform 1
+tout le transit 1
+tout le unif 1
+tout le unit 1
+tout le ut 1
+tout le util 1
+tout le valeur 1
+tout le var 1
+tout le variabl 2
+tout lec 1
+tout lec ecut 1
+tout lespac 1
+tout lespac dit 1
+tout leur 1
+tout leur inst 1
+tout liaison 1
+tout liaison est 1
+tout lib 1
+tout lib erat 1
+tout lint 1
+tout lint er 1
+tout machiner 1
+tout machiner sp 1
+tout marqu 1
+tout matr 1
+tout matr posit 1
+tout mi 1
+tout modif 1
+tout modif de 1
+tout moment 1
+tout moment moin 1
+tout nentr 1
+tout nentr donc 1
+tout nouvel 1
+tout nouvel proposit 1
+tout obj 1
+tout obj sur 1
+tout ofaus 1
+tout op 1
+tout op erateur 1
+tout par 1
+tout par elism 1
+tout part 1
+tout part de 1
+tout particl 1
+tout particl er 1
+tout pi 1
+tout point 1
+tout pr 1
+tout pr edicat 1
+tout prem 1
+tout prem ordr 1
+tout produit 1
+tout produit de 1
+tout r ef 1
+tout raison 1
+tout raison equationnel 1
+tout recalcl 1
+tout recalcl de 1
+tout risqu 1
+tout risqu de 1
+tout s ecurit 1
+tout se 3
+tout se fonct 1
+tout se lign 1
+tout se pa 1
+tout simpl 1
+tout simpl pa 1
+tout sous 1
+tout sous modl 1
+tout syst 1
+tout syst em 1
+tout transform 1
+tout transform homoth 1
+tout un 2
+tout un coupur 1
+tout un famil 1
+tout va 1
+tout va donc 1
+tout valeur 1
+tout valeur de 1
+tout var 1
+tout var de 1
+tout var perman 1
+toutef 4
+toutef a noter 1
+toutef a repr 1
+toutef a utiliser 1
+toutef accr 1
+toutef accr tr 1
+toutef appel 1
+toutef approxim 1
+toutef certain 1
+toutef certain disparit 1
+toutef de 1
+toutef de reloger 1
+toutef el 1
+toutef el aboutit 1
+toutef etr 1
+toutef etr evit 1
+toutef etr lim 1
+toutef etr mi 1
+toutef etr sup 1
+toutef il 1
+toutef il ec 1
+toutef influer 1
+toutef influer sur 1
+toutef inop 1
+toutef inop erant 1
+toutef int 1
+toutef int er 1
+toutef le 1
+toutef le ca 1
+toutef mineur 1
+toutef moin 1
+toutef moin strict 1
+toutef pa 1
+toutef pa appel 1
+toutef pa certain 1
+toutef pa clair 1
+toutef pa compat 1
+toutef pa explicit 1
+toutef pa la 1
+toutef pa tot 1
+toutef pa util 1
+toutef plus un 1
+toutef po de 1
+toutef qu 1
+toutef qu le 1
+toutef quil 1
+toutef quil est 1
+toutef tr 1
+toutef un 1
+toutef un autr 1
+toutef un ca 1
+toutef un classif 1
+toutef un point 1
+tower 2
+tower of sub 1
+towsl 1
+toy 3
+toy 20k 1
+toy 25k 1
+toy 32k 1
+toy 72k 1
+toy benchmark 1
+toy jan 1
+toy problem 1
+toy task 1
+toyoshim 1
+toysg 1
+tp 14
+tp al dep 1
+tp and ntp 1
+tp and tp 1
+tp determin 1
+tp for log 1
+tp for mlp 1
+tp from interpr 1
+tp hold 1
+tp is construc 1
+tp is continu 1
+tp is expr 1
+tp lmac 1
+tp monit 1
+tp n tp 1
+tp nod 1
+tp obtain 1
+tp oper 1
+tp sec 1
+tp sec by 1
+tp theor 1
+tp theor bandwidth 1
+tp tp 1
+tp transact 1
+tp transact proc 1
+tp v iff 1
+tp we concentr 1
+tp1p2p3 1
+tp4 1
+tp4 s7s8s9 1
+tp4 s7s8s9 fs6ts5 1
+tpar 1
+tpb 1
+tpc 1
+tpc benchmark 1
+tpk 1
+tpk tfk 1
+tpk tfk lmac 1
+tpk tpm 1
+tpl 1
+tpm 3
+tpm and start 1
+tpm and theseus 1
+tpm and tr 1
+tpm fin 1
+tpm fin grain 1
+tpm pr 1
+tpm pr program 1
+tpm prov 1
+tpm visu 1
+tpm with annot 1
+tpr 1
+tpsim 1
+tpsim fl 1
+tpsim siml 1
+tpsimindep 1
+tpsimindep repl 1
+tpt 1
+tpt mi 1
+tq 2
+tquel 1
+tr 96
+tr a label 1
+tr a separ 1
+tr abord 1
+tr acr server 1
+tr aff 1
+tr al appl 1
+tr al prev 1
+tr al prov 1
+tr algebr 1
+tr algorithm 3
+tr algorithm pour 1
+tr algorithm requir 1
+tr algorithmiqu 1
+tr algorithmiqu eoecac 1
+tr an 2
+tr an cod 1
+tr an compil 1
+tr an es 1
+tr an pack 1
+tr an technolog 1
+tr and augm 1
+tr and cl 1
+tr and decluster 1
+tr and decomp 1
+tr and en 1
+tr and equ 1
+tr and error 1
+tr and estim 1
+tr and explain 1
+tr and found 1
+tr and leader 1
+tr and maxim 1
+tr and nch 1
+tr and od 1
+tr and pack 1
+tr and parallel 1
+tr and perform 1
+tr and repr 1
+tr and show 1
+tr and st 1
+tr and yield 1
+tr another var 1
+tr appear 1
+tr appl 1
+tr appl ont 1
+tr appliqu 1
+tr approach 2
+tr approach lo 1
+tr ar connect 1
+tr ar cut 1
+tr ar deriv 1
+tr ar doubl 1
+tr ar ignor 1
+tr ar merg 1
+tr ar produc 1
+tr ar search 1
+tr arbitr 1
+tr arbitr impl 1
+tr as describ 1
+tr as se 1
+tr assum 1
+tr autom 1
+tr avec 2
+tr avec la 1
+tr ba 5
+tr ba algorithm 1
+tr ba approach 2
+tr ba color 1
+tr ba dat 1
+tr ba funct 1
+tr ba imag 1
+tr ba langu 1
+tr ba multicast 1
+tr ba reg 1
+tr ba segm 1
+tr ba techniqu 1
+tr ba textur 1
+tr backlog 1
+tr be denot 1
+tr being proc 1
+tr both pract 1
+tr boucl 1
+tr boucl de 1
+tr build 1
+tr build proc 1
+tr by alloc 1
+tr by assign 1
+tr by chang 1
+tr by distribut 1
+tr by examin 1
+tr by grow 1
+tr by mean 1
+tr by select 1
+tr ca 1
+tr ca possibl 1
+tr ca suiv 1
+tr can guar 1
+tr can incr 1
+tr cel 1
+tr cel de 1
+tr champ 1
+tr circuit 1
+tr client 1
+tr cod 1
+tr cod structur 1
+tr coeff 1
+tr coeff fic 1
+tr col 1
+tr colon 1
+tr colon du 1
+tr compar 1
+tr comput 1
+tr comput method 1
+tr concur 1
+tr concur method 1
+tr condit 2
+tr condit suiv 1
+tr connect 1
+tr consider 2
+tr construc 5
+tr construc ph 1
+tr construc tim 1
+tr contain 2
+tr contain transact 1
+tr continu 1
+tr continu de 1
+tr cop 1
+tr correspon 2
+tr cr 1
+tr cr eat 1
+tr cs 1
+tr d order 1
+tr dan 2
+tr dan le 1
+tr dan lensembl 1
+tr dan son 1
+tr dat 1
+tr dat structur 1
+tr de 3
+tr de aspect 1
+tr de caract 1
+tr de coupur 1
+tr de la 1
+tr de lenviron 1
+tr de tail 1
+tr de test 1
+tr decomposit 2
+tr decomposit concept 1
+tr decomposit defin 1
+tr definit 1
+tr degr 1
+tr degr sendwithad32 1
+tr design 1
+tr deux 1
+tr deux ca 1
+tr di 1
+tr di rent 1
+tr di rentiel 1
+tr diff 1
+tr diff erent 1
+tr difficil 1
+tr dim 1
+tr dim cont 1
+tr disc 1
+tr displ 1
+tr domain 1
+tr dr 1
+tr dr non 1
+tr dun 1
+tr dun list 1
+tr each tim 1
+tr edg 4
+tr edg inc 1
+tr edg induc 1
+tr edg nontr 1
+tr edg viol 1
+tr ee 1
+tr ee sort 1
+tr eff 1
+tr eff loc 1
+tr el 1
+tr el ement 1
+tr em 3
+tr em approch 1
+tr em argum 1
+tr em ca 1
+tr em claus 1
+tr em etap 1
+tr em exp 1
+tr em part 1
+tr em princip 1
+tr em vecteur 1
+tr en 1
+tr en pratiqu 1
+tr equ 1
+tr es 4
+tr es actif 1
+tr es bien 1
+tr es charg 1
+tr es complec 1
+tr es con 2
+tr es conc 1
+tr es diff 1
+tr es efficac 3
+tr es el 1
+tr es elev 1
+tr es encour 1
+tr es enrich 1
+tr es exact 2
+tr es fa 4
+tr es facil 1
+tr es fort 1
+tr es fr 2
+tr es grand 3
+tr es im 1
+tr es import 2
+tr es improb 1
+tr es inf 1
+tr es inform 1
+tr es int 1
+tr es ir 1
+tr es larg 1
+tr es lent 1
+tr es longu 1
+tr es lourd 1
+tr es mat 1
+tr es nombreux 1
+tr es partiel 1
+tr es pe 1
+tr es perform 1
+tr es peu 1
+tr es pr 2
+tr es probabl 2
+tr es proch 2
+tr es raisonnabl 1
+tr es rap 2
+tr es rar 1
+tr es satisf 2
+tr es sembl 1
+tr es sen 1
+tr es sensibl 2
+tr es similair 3
+tr es simpl 2
+tr es souv 2
+tr es sp 1
+tr es synth 1
+tr es util 2
+tr et daccr 1
+tr et qu 1
+tr etap 2
+tr etap princip 1
+tr etap qu 1
+tr etc 1
+tr even further 1
+tr ever occur 1
+tr exampl 1
+tr ext 1
+tr ext tm 1
+tr fact 1
+tr fact es 1
+tr fam 1
+tr flag 1
+tr for bridg 1
+tr for cub 1
+tr for deriv 1
+tr for eff 1
+tr for g0 1
+tr for gener 1
+tr for multidim 1
+tr for nt 1
+tr for pick 1
+tr for stat 1
+tr for uv 1
+tr form 4
+tr form prop 1
+tr form suiv 1
+tr formaliz 1
+tr found 1
+tr from graph 1
+tr from interfer 1
+tr from joan 1
+tr funct 1
+tr funct3 1
+tr g om 1
+tr g0 1
+tr giv 1
+tr grand 1
+tr grand approch 1
+tr grow 1
+tr ha exact 1
+tr ha grown 1
+tr ha87 1
+tr hav exact 1
+tr height 2
+tr height cycl 1
+tr hi cod 1
+tr hold 1
+tr ik 1
+tr illustr 1
+tr implem 1
+tr import 1
+tr in algebr 1
+tr in ar 1
+tr in babel 1
+tr in conjunct 1
+tr in dark 1
+tr in figur 3
+tr in log 1
+tr in main 1
+tr in number 1
+tr in oe1 1
+tr in oe2 1
+tr in parallel 1
+tr in pictur 1
+tr ind 3
+tr ind defin 1
+tr init 1
+tr init pr 1
+tr input 1
+tr inspir 1
+tr instruc 1
+tr instruc suiv 1
+tr int 1
+tr int mac 1
+tr int num 1
+tr is avail 1
+tr is bal 1
+tr is cheap 1
+tr is compl 1
+tr is defin 2
+tr is determin 1
+tr is equ 1
+tr is fl 1
+tr is giv 1
+tr is grown 1
+tr is incr 1
+tr is init 1
+tr is lin 1
+tr is mac 1
+tr is maintain 2
+tr is minim 1
+tr is np 1
+tr is offer 1
+tr is partit 1
+tr is prun 1
+tr is reflect 1
+tr is shown 1
+tr is signif 1
+tr is simil 1
+tr is specif 1
+tr is upd 1
+tr is zer 1
+tr known 1
+tr l ag 1
+tr l etat 1
+tr la 4
+tr la cl 1
+tr la fr 1
+tr la longueur 1
+tr la oabilit 1
+tr la qualit 1
+tr la satisfaisabilit 1
+tr la tail 1
+tr la valeur 2
+tr ladr 1
+tr ladr du 1
+tr layout 1
+tr le 1
+tr le nombr 1
+tr le valeur 1
+tr leaf 1
+tr leaf nod 1
+tr length 1
+tr level 1
+tr li 1
+tr lik hierarch 1
+tr lik ind 1
+tr lik inser 1
+tr lik sem 1
+tr lik structur 1
+tr link 1
+tr link algorithm 1
+tr list 1
+tr list succeed 1
+tr list.ap 1
+tr list.clear 1
+tr loc 1
+tr loc.contain 1
+tr lor 1
+tr lor de 1
+tr mak 2
+tr mak us 1
+tr man 1
+tr man er 1
+tr manager 1
+tr manipl 1
+tr manipl system 1
+tr matr 1
+tr matr stochastiqu 1
+tr may go 1
+tr may prov 1
+tr me part 1
+tr me point 1
+tr merg 1
+tr modl 1
+tr mun 1
+tr mun dun 1
+tr n ee 1
+tr n ee4 1
+tr nag 1
+tr nag avant 1
+tr nag aveugl 1
+tr nag dadr 1
+tr nag de 1
+tr nag dun 1
+tr nag en 1
+tr nag est 1
+tr nag etendu 1
+tr nag la 1
+tr nag ne 1
+tr nag nest 1
+tr nag par 1
+tr nag requ 1
+tr nag sont 1
+tr nag standard 1
+tr nag va 1
+tr nag1 1
+tr neighbor 1
+tr network 2
+tr nid 1
+tr nid de 1
+tr nod 6
+tr nod point 1
+tr nod suggest 1
+tr nod using 1
+tr norm 2
+tr not 1
+tr observ 1
+tr obtain 1
+tr obtenu 1
+tr obtenu dan 1
+tr of approxim 1
+tr of babel 1
+tr of cluster 1
+tr of de 1
+tr of g0 2
+tr of g1 1
+tr of height 2
+tr of lin 1
+tr of maxim 1
+tr of near 1
+tr of nod 1
+tr of order 2
+tr of orthogon 1
+tr of proc 1
+tr of reg 1
+tr of siz 1
+tr of specl 1
+tr of stack 1
+tr of usu 1
+tr of weight 1
+tr op 1
+tr op erat 1
+tr op erateur 1
+tr oper 4
+tr or 2dtr 1
+tr oracl 1
+tr oracl allow 1
+tr oracl ye 1
+tr p pointer 1
+tr pack 1
+tr pack st 1
+tr paper 1
+tr paper ment 1
+tr paragraph 1
+tr paragraph suiv 1
+tr parent 1
+tr parser 1
+tr parser gener 1
+tr parser transformer 1
+tr path 1
+tr pattern 1
+tr pattern ea 1
+tr pil 1
+tr pil de 1
+tr plur 1
+tr point 1
+tr point peuv 1
+tr prem 2
+tr prem aspect 1
+tr prem er 1
+tr problem 5
+tr problem remain 1
+tr problem wh 1
+tr proc 1
+tr processeur 1
+tr processeur sont 1
+tr produc 1
+tr prop 1
+tr propag 1
+tr propag method 1
+tr proper 3
+tr proper guar 1
+tr protocol 2
+tr qsort 1
+tr qsort est 1
+tr quicksort 1
+tr r epliqu 1
+tr reduc 1
+tr reducemac16 1
+tr repr 8
+tr requir 1
+tr restructur 1
+tr result 1
+tr rieman 1
+tr root 3
+tr rout 1
+tr s bien 1
+tr s complec 1
+tr s den 1
+tr s equ 1
+tr s peu 1
+tr s pr 1
+tr s prometteus 1
+tr s proot 1
+tr s rap 1
+tr s rapid 1
+tr s val 1
+tr satisf 1
+tr saut 1
+tr saut direct 1
+tr search 1
+tr search protocol 1
+tr sect 1
+tr seem 1
+tr segm 1
+tr shap 1
+tr shap decomposit 1
+tr show 2
+tr shown 1
+tr simil 1
+tr simpl 2
+tr simpl nest 1
+tr simplif 1
+tr siz 1
+tr solut 1
+tr sont 1
+tr sont relativ 1
+tr spat 1
+tr spat decomposit 1
+tr st 3
+tr structur 12
+tr structur ba 1
+tr structur chang 1
+tr structur dag 1
+tr structur dat 1
+tr structur ec 1
+tr structur repr 1
+tr structur superimp 1
+tr structur wavel 2
+tr subtr 1
+tr suit 1
+tr suj 1
+tr suj principaux 1
+tr support 1
+tr support del 1
+tr sur 1
+tr sur le 1
+tr t i1 1
+tr t i2 1
+tr t mean 1
+tr t using 1
+tr t0 1
+tr t1 2
+tr techniqu 1
+tr tendu 1
+tr tendu aux 1
+tr termin 1
+tr termin nod 1
+tr test 1
+tr th 1
+tr th algorithm 1
+tr th cur 1
+tr th eor 1
+tr th qu 1
+tr that repr 2
+tr that satisf 1
+tr theor 1
+tr theor scal 1
+tr through krusk 1
+tr tj 1
+tr tl 1
+tr to acquir 2
+tr to as 1
+tr to backtrack 1
+tr to bal 1
+tr to construc 1
+tr to dec 1
+tr to decr 1
+tr to defer 1
+tr to determin 1
+tr to equ 1
+tr to expan 1
+tr to exploit 1
+tr to expr 1
+tr to find 1
+tr to fool 1
+tr to form 1
+tr to impl 1
+tr to knlogn 1
+tr to minim 1
+tr to pack 1
+tr to print 1
+tr to put 1
+tr to re 1
+tr to rel 1
+tr to repr 1
+tr to retrief 1
+tr to se 1
+tr to tr 1
+tr to us 2
+tr topolog 1
+tr tp 1
+tr transform 1
+tr transform specif 1
+tr transformer 1
+tr transformer perform 1
+tr traver 2
+tr treil 1
+tr turn 1
+tr typ 3
+tr typ de 2
+tr typ principaux 1
+tr u1 1
+tr un 1
+tr un structur 1
+tr using 3
+tr using fract 1
+tr using mult 1
+tr util 1
+tr util pour 1
+tr valeur 1
+tr valeur de 1
+tr var 4
+tr var architectur 1
+tr var de 1
+tr variabl 1
+tr variabl perman 1
+tr ver 1
+tr ver de 1
+tr ver du 1
+tr ver orig 1
+tr void 1
+tr void printgraph 1
+tr void tor2 1
+tr wa good 1
+tr we implem 1
+tr we obtain 1
+tr we overl 1
+tr we us 1
+tr wer implem 1
+tr wh 1
+tr wh edg 1
+tr wh leav 1
+tr wh nod 1
+tr which becom 1
+tr which constrain 1
+tr which repr 1
+tr wil requir 1
+tr with cand 1
+tr with exact 1
+tr with fanout 1
+tr with jv1j 1
+tr with jv2j 1
+tr with maxim 1
+tr with overtak 1
+tr with rel 1
+tr with respect 1
+tr work 1
+tr yield 1
+tr01 2
+tr01 b del 1
+tr01 tr02 1
+tr01 tr02 tr03 1
+tr02 1
+tr02 b del 1
+tr02 tr03 1
+tr02 tr03 tr04 1
+tr03 1
+tr03 b del 1
+tr03 tr04 1
+tr04 1
+tr04 b del 1
+tr0acc 1
+tr0acc v accept 1
+tr1 1
+tr1 and tr2 1
+tr1 b del 1
+tr1 then introduc 1
+tr1 to tr4 1
+tr1 tr2 1
+tr1 tr2 tr3 1
+tr10 1
+tr15 1
+tr2 1
+tr2 b del 1
+tr2 tr3 1
+tr2 tr3 tr4 1
+tr21 1
+tr23 1
+tr3 1
+tr3 and tr4 1
+tr3 b del 1
+tr3 tr4 1
+tr35 1
+tr37 1
+tr4 1
+tr4 ar me 1
+tr4 b del 1
+tr41 1
+tr59 1
+tr91 2
+tr92214 1
+tr93 1
+tr94 1
+tr95 1
+trabalh 1
+trabalh discut 1
+trabalh discut quest 1
+trac 17
+trac a instruc 1
+trac a lin 1
+trac an 1
+trac an begin 1
+trac an rev 1
+trac an work 1
+trac analyzer 1
+trac and en 1
+trac and say 1
+trac ar ba 1
+trac as describ 1
+trac by compar 1
+trac c funct 1
+trac character 1
+trac collect 1
+trac compar 1
+trac con 1
+trac de 2
+trac de commun 1
+trac de lexp 1
+trac de modioc 1
+trac de program 1
+trac dep 1
+trac driv 2
+trac driv experim 1
+trac driv siml 1
+trac edg 1
+trac edg point 1
+trac entr 1
+trac et distingu 1
+trac fil 1
+trac flow 1
+trac for patholog 1
+trac for real 1
+trac for reason 1
+trac for t2 1
+trac for twovisit 1
+trac for twovisit0 1
+trac fourn 1
+trac fourn par 1
+trac gener 1
+trac giv 1
+trac hav length 1
+trac inform 1
+trac inform tel 1
+trac is execut 1
+trac is gener 1
+trac of dep 1
+trac of known 1
+trac of method 1
+trac of program 1
+trac of reason 1
+trac of rl 1
+trac opt 1
+trac pref 1
+trac rel 1
+trac requir 1
+trac requir therefor 1
+trac siml 1
+trac siml method 1
+trac siml methodolog 1
+trac siml techniqu 1
+trac stream 1
+trac stream fil 1
+trac th decomposit 1
+trac th evolut 1
+trac th flow 1
+trac th link 1
+trac that result 1
+trac that seem 1
+trac to handl 1
+trac to se 1
+trac to siml 1
+trac tr 1
+trac which method 1
+tracc 1
+tracc b del 1
+tracc tr01 1
+tracc tr01 tr02 1
+tracc tr02 1
+tracer 1
+tracer for prolog 1
+traceur 1
+tracf 1
+tracf brakf 1
+tracf brakf gradf 1
+tracf enginepower 1
+tracf enginepower actspeed 1
+track 29
+track a mov 1
+track and comput 1
+track and diagon 1
+track by track 1
+track by ver 1
+track chang 1
+track collect 1
+track collect repr 1
+track devot 1
+track disk 1
+track disk pointer 1
+track down problem 1
+track en 1
+track gaug 1
+track ge 1
+track ge fil 1
+track in pa 1
+track int intern 1
+track io 1
+track io rot 1
+track is acc 1
+track is compl 1
+track is defin 1
+track last trackk 1
+track loc 1
+track major 1
+track major whit 1
+track next trackk 1
+track number 1
+track of cach 1
+track of cluster 1
+track of disk 1
+track of dk 1
+track of keyword 1
+track of prob 1
+track of self 1
+track of system 1
+track of und 1
+track of us 1
+track of var 1
+track on ck 1
+track on dk 1
+track over tim 1
+track per disk 1
+track pointer 1
+track proper 1
+track subscriber 1
+track th cp 1
+track th distribut 1
+track th proc 1
+track their us 1
+track to track 1
+track writ 1
+trackk 1
+trackk and incr 1
+trackk repr 1
+tract 6
+tract forc 1
+tract forc brakf 1
+tract in theor 2
+tract run 1
+tract run tim 1
+tract task 1
+trad 11
+trad faster 1
+trad faster acc 1
+trad gener 1
+trad off 4
+trad off st 1
+trademark 5
+trademark of digit 1
+trademark of sun 2
+trademark to construc 1
+tradeoff 9
+tradeoff between accur 1
+tradeoff between tcomp 1
+tradeoff for map 1
+tradeoff involut 1
+tradit 44
+tradit abstract 1
+tradit algebr 1
+tradit algebr oper 1
+tradit algorithm 1
+tradit approach 5
+tradit authorship 1
+tradit authorship claim 1
+tradit benchmark 1
+tradit benchmark program 1
+tradit but revit 1
+tradit cluster 1
+tradit command 1
+tradit command lin 1
+tradit computer 1
+tradit computer dat 1
+tradit cycl 1
+tradit dat 1
+tradit dat partit 1
+tradit datab 2
+tradit datab qu 1
+tradit edit 1
+tradit edit dist 1
+tradit establ 1
+tradit fil 1
+tradit fil system 1
+tradit finit 1
+tradit finit domain 1
+tradit for recur 1
+tradit in describ 1
+tradit ind 1
+tradit interfac 1
+tradit interfac mod 1
+tradit libr 1
+tradit lisp 2
+tradit lisp implem 1
+tradit lisp me 1
+tradit list 1
+tradit list schedl 1
+tradit log 2
+tradit log program 1
+tradit log separ 1
+tradit lp 1
+tradit lp langu 1
+tradit minim 1
+tradit minim degr 1
+tradit model 1
+tradit modl 1
+tradit modl cal 1
+tradit mult 1
+tradit mult interconnect 1
+tradit mult network 1
+tradit mult stag 1
+tradit nest 1
+tradit nest transact 1
+tradit not 1
+tradit noun 1
+tradit noun phr 1
+tradit object 3
+tradit object model 1
+tradit object orient 2
+tradit onl achief 1
+tradit oop 1
+tradit oper 1
+tradit oper system 1
+tradit order 1
+tradit order heur 1
+tradit parallel 1
+tradit parallel system 1
+tradit problem 1
+tradit prolog 1
+tradit prolog styl 1
+tradit rang 1
+tradit rang qu 1
+tradit restrict 1
+tradit satisf 1
+tradit satisf algorithm 1
+tradit se 1
+tradit separ 1
+tradit sequ 1
+tradit sequ program 1
+tradit simplec 1
+tradit simplec method 1
+tradit singl 1
+tradit singl level 1
+tradit solut 1
+tradit stat 2
+tradit stat autoregr 1
+tradit stat test 1
+tradit string 1
+tradit string edit 1
+tradit stud 1
+tradit stud mult 1
+tradit technolog 2
+tradit text 1
+tradit text inform 1
+tradit tr 1
+tradit tr layout 1
+tradit typ 1
+tradit typ system 1
+tradit vm 1
+tradit vm transl 1
+tradit wid 1
+tradit wid ar 1
+traditionnel 1
+traditionnel d ecrit 1
+tradu 2
+tradu par 2
+tradu par de 1
+tradu par exempl 1
+traduc 2
+traduc de 1
+traduc de la 1
+traduc personnel 1
+traduir 2
+traduir ce 1
+traduir ce fait 1
+traduir le 1
+traduir le adr 1
+traduit 4
+traduit alor 1
+traduit alor en 1
+traduit dan 1
+traduit dan notr 1
+traduit en 2
+traduit en fonct 1
+traduit le 1
+traduit le fait 1
+traduit lexempl 1
+traduit lexempl ci 1
+traduit notr 1
+traduit notr exempl 1
+traduit par 3
+traduit par de 1
+traduit par la 1
+traduit par le 1
+traduit par lin 1
+traduit par un 1
+traf 2
+traf elev 1
+traf m emoir 1
+traff 21
+traff 4x4 1
+traff 8x8 1
+traff amount 1
+traff and flow 1
+traff and perform 1
+traff and proc 1
+traff ar tak 2
+traff arriv 1
+traff as disc 1
+traff assum 2
+traff at rat 1
+traff b nl 2
+traff both prec 1
+traff burst 1
+traff by attach 1
+traff chang 1
+traff character 1
+traff cl 1
+traff con 1
+traff control 2
+traff control algorithm 1
+traff control problem 1
+traff du 1
+traff environm 1
+traff environm wh 1
+traff evalu 1
+traff evalu ra 1
+traff flow 3
+traff flow leav 1
+traff from connect 1
+traff from se 1
+traff in distribut 1
+traff in fft 1
+traff in shar 1
+traff input 1
+traff is car 1
+traff is consider 1
+traff is du 1
+traff is flow 1
+traff is heav 1
+traff is leak 1
+traff is multicast 1
+traff is numpath 1
+traff is split 1
+traff le adver 1
+traff load 1
+traff load pr 1
+traff manag 1
+traff manag system 1
+traff model 3
+traff model ad 2
+traff of simil 1
+traff pattern 5
+traff pattern appl 1
+traff pattern dep 2
+traff pattern put 2
+traff pertain 1
+traff queu 1
+traff rat 1
+traff rat gener 1
+traff reach 2
+traff requir 1
+traff rout 1
+traff scenar 1
+traff schedl 1
+traff schedl algorithm 1
+traff separ 1
+traff support 1
+traff sur 1
+traff sur le 1
+traff th centr 1
+traff th se 1
+traff to determin 1
+traff wa low 1
+traff with me 1
+traff workload 1
+traiger 3
+trail 6
+trail dat 1
+trail maintain 1
+trail oper 1
+trail pack 1
+trail pack flit 1
+trail pointer 1
+trail stack 1
+trail th rol 1
+trail tid 1
+trail unit 1
+trailer 1
+trailer ind 1
+trailer is comp 1
+trailer is writ 1
+trailer structur 1
+train 16
+train a nsar 1
+train algorithm 2
+train and cluster 1
+train and prun 1
+train and test 1
+train and val 1
+train approach 1
+train artif 1
+train artif neur 1
+train ba 1
+train by gradientb 1
+train cost 1
+train cycl 2
+train cycl number 1
+train cycl requir 1
+train dat 2
+train dat point 1
+train dat se 1
+train discour 1
+train discour modl 1
+train event 1
+train event sud 1
+train exampl 3
+train inst 1
+train is compl 1
+train is succ 1
+train is susp 1
+train iter 1
+train list 1
+train method 1
+train modl 1
+train need involut 1
+train net 1
+train network 3
+train neur 3
+train neur network 3
+train occur 1
+train of me 1
+train of soft 1
+train of thought 1
+train on string 1
+train or train 1
+train pattern 2
+train proceed 1
+train proceed error 1
+train proper 1
+train recur 1
+train recur neur 1
+train se 6
+train se con 1
+train se map 1
+train se pattern 1
+train se reduc 1
+train se respon 1
+train se result 1
+train se siz 2
+train sequ 1
+train should occur 1
+train stag 1
+train th slrn 1
+train tim 3
+train tim incr 1
+train to becom 1
+train to describ 1
+train to produc 1
+train to reduc 1
+train using 2
+train using weight 1
+train wa stop 1
+train we extract 1
+train wil construc 1
+train workshop3 1
+trait 5
+trait a prior 1
+trait automatiqu 1
+trait automatiqu de 1
+trait compl 1
+trait compl de 1
+trait compl du 1
+trait compr 1
+trait compr le 1
+trait de 4
+trait de argum 1
+trait de ce 1
+trait de etiqu 1
+trait de except 1
+trait de except1 1
+trait de imag 1
+trait de la 2
+trait de lerreur 1
+trait de lext 1
+trait de lim 1
+trait de lop 1
+trait de migr 1
+trait de op 1
+trait de pr 1
+trait de syst 1
+trait de techniqu 1
+trait de variabl 1
+trait diff 1
+trait diff erent 1
+trait dim 1
+trait dim tridimensionnel 1
+trait doit 1
+trait doit lir 1
+trait du 2
+trait du deux 1
+trait du retour 1
+trait dun 2
+trait dun sous 1
+trait e au 1
+trait e com 1
+trait e en 1
+trait e la 1
+trait e le 1
+trait e par 1
+trait ee 3
+trait ee aux 1
+trait ee par 2
+trait ee simultan 1
+trait efficac 1
+trait efficac de 1
+trait efficac du 1
+trait en 1
+trait en perman 1
+trait es 3
+trait es beaucoup 1
+trait es de 1
+trait es est 1
+trait es ind 1
+trait es par 2
+trait est 1
+trait est tr 1
+trait haut 1
+trait haut niveau 1
+trait identiqu 1
+trait identiqu de 1
+trait l elag 1
+trait la 2
+trait la matr 1
+trait la possibilit 1
+trait le 1
+trait le probl 1
+trait pa 1
+trait pa conjoint 1
+trait par 1
+trait par el 1
+trait particl 1
+trait plein 1
+trait po 1
+trait po ed 1
+trait rigoureux 2
+trait rigoureux de 2
+trait s equentiel 2
+trait simpl 1
+trait simpl du 1
+trait uc 1
+trait un bloc 1
+trait un sel 1
+traiter 5
+traiter a la 1
+traiter a lec 1
+traiter au 1
+traiter au moin 1
+traiter ce 1
+traiter ce probl 1
+traiter conjoint 1
+traiter conjoint le 1
+traiter de 1
+traiter de mod 1
+traiter est 1
+traiter est de 1
+traiter est fa 1
+traiter le 2
+traiter le argum 1
+traiter le aut 1
+traiter le ca 1
+traiter le coupur 1
+traiter le faux 1
+traiter le nombreux 1
+traiter le syst 1
+traiter lensembl 1
+traiter lensembl du 1
+traiter lerreur 1
+traiter no 1
+traiter no probl 1
+traiter par 1
+traiter par siml 1
+traiter pour 1
+traiter pour le 1
+traiter prioritair 1
+traiter prioritair le 1
+traiter successiv 1
+traiter successiv chacun 1
+traiter un 1
+traiter un algorithm 1
+traiter un nombr 1
+traiter un tel 1
+traject 5
+traject after extract 1
+traject of fluid 1
+traject produc 1
+traject wa gener 1
+traject wer allow 1
+trajectoir 1
+trajectoir condu 1
+trajectoir dan 1
+trajectoir men 1
+trajectoir men aux 1
+trajectoir nous 1
+trajectoir nous int 1
+trajectoir pr 1
+trajectoir pr ef 1
+trajectoir r eal 1
+trajectoir suiv 1
+trajectoir suiv pour 1
+trajectoir visit 1
+trajectoir visit ee 1
+trajectoir y condu 1
+trakhtenbrot 1
+trakhtenbrot and barzdin 1
+trakhtenbrot barzdin 1
+tramsform 1
+tramsform from term 1
+tran 31
+tran an 1
+tran an using 1
+tran by arbitr 1
+tran character 1
+tran del 1
+tran dupl 1
+tran dupl addr 1
+tran effect 1
+tran effect du 1
+tran is in 1
+tran lack 1
+tran perform 1
+tran perform measur 1
+tran record 1
+tran sign 1
+tran sign classif 1
+tran system 1
+tran whil retain 1
+trancact 1
+trancact proc 1
+trancact proc system 1
+tranform 1
+tranform e com 1
+tranl 1
+tranl invar 1
+tranl invar de 1
+transact 62
+transact abov l0 1
+transact and mlt 1
+transact ar abort 1
+transact ar dur 1
+transact ar rol 1
+transact as gold 1
+transact at level 1
+transact at li 1
+transact built 1
+transact bus 1
+transact chain 1
+transact cl 1
+transact cl cl1 1
+transact cl pathlength 1
+transact cl tx 1
+transact com 3
+transact com protocol 2
+transact comp 1
+transact compl 2
+transact con 1
+transact concept 2
+transact contain 1
+transact ct 1
+transact ct execut 1
+transact datab 1
+transact dur crash 1
+transact dur explicit 1
+transact ec 1
+transact environm 1
+transact execut 1
+transact facil 1
+transact fail 1
+transact finish 1
+transact for un 1
+transact gener 1
+transact in softwar 1
+transact init 1
+transact init request 1
+transact instead 1
+transact int util 1
+transact interrupt 1
+transact is abort 1
+transact is compl 1
+transact is recover 1
+transact layer 1
+transact lock 1
+transact log 1
+transact log program 1
+transact manag 3
+transact manag primitiv 1
+transact manager 3
+transact model 1
+transact n ecessit 1
+transact nt 1
+transact nt nest 1
+transact on account 1
+transact on acoust 1
+transact on assp 1
+transact on biom 1
+transact on circuit 1
+transact on commun 3
+transact on computer 24
+transact on dat 1
+transact on datab 5
+transact on imag 1
+transact on inform 7
+transact on knowledg 6
+transact on mathemat 2
+transact on network 1
+transact on neur 4
+transact on pam 1
+transact on parallel 9
+transact on pattern 2
+transact on power 1
+transact on program 4
+transact on rel 1
+transact on softwar 12
+transact on system 2
+transact or orphan 1
+transact or recover 1
+transact orient 1
+transact orient datab 1
+transact per 1
+transact per proper 1
+transact point 1
+transact proc 5
+transact proc architectur 1
+transact proc council 1
+transact proc fam 1
+transact proc model 1
+transact proc monit 1
+transact proc nod 1
+transact proc power 1
+transact proc system 1
+transact proc tim 1
+transact proc. 1
+transact program 1
+transact program wh 1
+transact record 1
+transact recov 2
+transact recov method 2
+transact recov using 1
+transact retain 1
+transact retain lock 1
+transact rol 1
+transact rollback 1
+transact rout 1
+transact router 1
+transact rpc 1
+transact schedl 1
+transact sequ 1
+transact subrout 1
+transact succeed 1
+transact support 1
+transact system 3
+transact system workshop 1
+transact tabl 1
+transact that facilit 1
+transact that und 1
+transact tid 1
+transact tid st 1
+transact tim 1
+transact tim attribut 1
+transact tim dat 1
+transact tim datab 1
+transact tim interv 1
+transact tim order 1
+transact tim rel 1
+transact tim system 1
+transact tim tx 1
+transact timestamp 1
+transact timestamp occup 1
+transact timestamp order 1
+transact timestamp tx 1
+transact to group 1
+transact und 1
+transact und log 1
+transact val 1
+transact wer mad 1
+transact workflow 1
+transactiontim 1
+transactiontim datab 1
+transarc 1
+transc 1
+transc th found 1
+transceiver 1
+transcod 1
+transcrib 1
+transcrib vid 1
+transcrib vid tap 1
+transcript 1
+transcript and an 1
+transcript and sum 1
+transcript ont paper 1
+transcript wa avail 1
+transcript wer read 1
+transducer 1
+transducer affect 1
+transducer agent 1
+transducer agent presum 1
+transf 2
+transf er 2
+transf er ee 1
+transf er le 1
+transf erent 1
+transf erent le 1
+transfer 41
+transfer a bit 2
+transfer a block 3
+transfer a contigu 1
+transfer a hierarch 1
+transfer a nat 1
+transfer a nod 1
+transfer a singl 1
+transfer and dat 1
+transfer at runtim 1
+transfer au 1
+transfer au cour 1
+transfer ayant 1
+transfer ayant lieu 1
+transfer concur 1
+transfer correspon 1
+transfer dat 3
+transfer dat shar 1
+transfer de 2
+transfer de contr 1
+transfer de don 1
+transfer de pag 1
+transfer de register 1
+transfer de tout 1
+transfer del 1
+transfer du 1
+transfer du me 1
+transfer dun 1
+transfer dun me 1
+transfer dun mot 1
+transfer dun pag 1
+transfer dur run 1
+transfer etc 1
+transfer for complec 1
+transfer for tr 1
+transfer from pe 1
+transfer half 1
+transfer in distribut 1
+transfer in fl 1
+transfer in network 1
+transfer inter 1
+transfer inter processeur 1
+transfer involut 1
+transfer involut separ 1
+transfer is cost 1
+transfer is implicit 1
+transfer is minim 1
+transfer is refer 1
+transfer level 1
+transfer level design 1
+transfer lor 1
+transfer lor de 1
+transfer matr 1
+transfer mod 2
+transfer multipl 1
+transfer multipl record 1
+transfer nod 1
+transfer of control 1
+transfer of copyright 1
+transfer of flit 1
+transfer of technolog 1
+transfer on block 1
+transfer p phy 1
+transfer par 1
+transfer par pag 1
+transfer pour 1
+transfer pour multiprocesseur 1
+transfer privileg 1
+transfer problem 1
+transfer protocol 2
+transfer protocol facil 1
+transfer protocol http 1
+transfer rat 4
+transfer record 1
+transfer record pack 1
+transfer request 1
+transfer request arriv 1
+transfer schedl 1
+transfer schem 1
+transfer som spat 1
+transfer step 1
+transfer step tak 1
+transfer sup 1
+transfer sup erieur 1
+transfer th dat 1
+transfer th nod 1
+transfer th privileg 1
+transfer to achief 1
+transfer to pe 1
+transfer to saving 1
+transfer to situ 1
+transfer to wherever 1
+transfer vi inst 1
+transfer w bit 2
+transfor. 1
+transform 56
+transform a appliquer 1
+transform a bit 1
+transform a collect 1
+transform a gener 1
+transform a loc 1
+transform a nest 1
+transform a polynom 1
+transform a program 1
+transform abstract 1
+transform abstract specif 1
+transform achief 1
+transform act 1
+transform adapt 1
+transform adapt ee 1
+transform allow 2
+transform allow eff 1
+transform allow transl 1
+transform am el. 1
+transform am elior 1
+transform and cod 1
+transform and explain 1
+transform and part 1
+transform and quatern 1
+transform and render 1
+transform and resolut 1
+transform and separ 1
+transform and wavel 1
+transform aoen 1
+transform aoen puisqu 1
+transform appart 1
+transform appart au 1
+transform appl 1
+transform appliqu 2
+transform appliqu ee 2
+transform ar construc 1
+transform ar indep 1
+transform ar most 1
+transform ar probabil 1
+transform as common 1
+transform as st 1
+transform assoc 2
+transform assoc ee 1
+transform au 1
+transform au ca 1
+transform aux 2
+transform aux conjonct 1
+transform aux deux 1
+transform avec 2
+transform avec le 1
+transform avec part 1
+transform avec partit 1
+transform box 1
+transform box shown 1
+transform bp 1
+transform bp nod 1
+transform cal unimodl 1
+transform chang 1
+transform chaqu 1
+transform chaqu claus 1
+transform chaqu foncteur 1
+transform cod 1
+transform cod imag 1
+transform coeff 1
+transform compr 1
+transform compr imag 1
+transform con 3
+transform consid 1
+transform constitu 1
+transform constraint 1
+transform conver 1
+transform correspon 1
+transform d efin 1
+transform d termin 1
+transform dan 1
+transform dan le 1
+transform de 3
+transform de boucl 1
+transform de chaqu 1
+transform de disjonct 1
+transform de four 1
+transform de la 1
+transform de nid 1
+transform de pr. 1
+transform de program 2
+transform de term 1
+transform decomp 1
+transform decomposit 1
+transform dep 1
+transform dep vect 1
+transform doit 1
+transform doit permettr 1
+transform domain 2
+transform domain postproc 1
+transform don 1
+transform don ee 1
+transform du 2
+transform du chapitr 1
+transform du nid 1
+transform du program 1
+transform dun 1
+transform dun appel 1
+transform e correspon 1
+transform e dan 1
+transform e de 2
+transform e en 1
+transform e naur 1
+transform e ne 1
+transform e peut 1
+transform e po 1
+transform e se 1
+transform e ser 1
+transform e sont 1
+transform each dep 1
+transform each ind 1
+transform each non 1
+transform each term 1
+transform ec 1
+transform edg 1
+transform ee 2
+transform ee en 2
+transform ee nacc 1
+transform ee ne 1
+transform ee ou 1
+transform ee peut 1
+transform ee refl 1
+transform ee ser 1
+transform ee serait 1
+transform ee sont 1
+transform el 1
+transform el ementair 1
+transform en 3
+transform en evalu 1
+transform en term 1
+transform en un 1
+transform en util 1
+transform en vu 1
+transform equiv 1
+transform es 1
+transform es de 1
+transform est 3
+transform est direct 1
+transform est int 1
+transform est nl 1
+transform est toutef 1
+transform est tr 1
+transform estim 1
+transform et le 1
+transform et prim 1
+transform et primitiv 1
+transform et se 1
+transform et un 1
+transform etant 1
+transform expr 1
+transform f sur 1
+transform fait 1
+transform fait clair 1
+transform featur 1
+transform featur spac 1
+transform featur vect 1
+transform fffl1 1
+transform ffl repr 1
+transform fi 1
+transform figur 1
+transform fil 1
+transform filter 1
+transform filter bank 1
+transform font 1
+transform font lobj 1
+transform for asynchron 1
+transform for backpropag 1
+transform for chain 1
+transform for cod 1
+transform for distribut 2
+transform for eff 1
+transform for extract 1
+transform for implem 1
+transform for link 1
+transform for loop 1
+transform for ma 1
+transform for reduc 1
+transform for softwar 1
+transform framework 1
+transform framework ba 1
+transform from abstract 1
+transform from design 1
+transform giv 2
+transform grammar 1
+transform group 1
+transform guar 1
+transform he random 1
+transform homoth 1
+transform homoth etiqu 1
+transform imag 1
+transform imag cod 1
+transform imp 1
+transform in parallel 1
+transform in part 1
+transform int mi 1
+transform is appl 1
+transform iter 1
+transform iter spac 1
+transform k tupl 1
+transform known 1
+transform l egal 1
+transform la 1
+transform le 1
+transform le cod 1
+transform lim 1
+transform lim le 1
+transform lin 2
+transform lin air 1
+transform lin eair 1
+transform linterv 1
+transform linterv i1 1
+transform moin 1
+transform monot 1
+transform monot cr 1
+transform na 1
+transform na de 1
+transform ne 1
+transform ne conduit 1
+transform nest 2
+transform nest loop 1
+transform nest pa 1
+transform network 1
+transform network comput 1
+transform network show 1
+transform nod 1
+transform non 1
+transform non ent 1
+transform non unimodulair 1
+transform occur 1
+transform of client 1
+transform of doubl 2
+transform of gaus 1
+transform of nest 1
+transform of program 1
+transform of pur 1
+transform of rm 1
+transform of rpc 1
+transform on expr 1
+transform on rpc 1
+transform ont 1
+transform op 1
+transform op er 1
+transform origin 1
+transform pa 1
+transform pa par 1
+transform par 1
+transform par pa 1
+transform parameter 1
+transform perform 1
+transform perform cod 1
+transform perm 1
+transform perm de 1
+transform plan 1
+transform po 1
+transform po edant 1
+transform pr 2
+transform pr ec 1
+transform pr esent 1
+transform problem 1
+transform program 2
+transform program accord 1
+transform program shown 1
+transform prop 1
+transform prop ee 1
+transform qu 1
+transform qu mod 1
+transform r eduit 1
+transform r rt 1
+transform rectangl 1
+transform redesign 1
+transform reduc 1
+transform refer 1
+transform ren 1
+transform ren intern 1
+transform ren le 1
+transform repr 1
+transform respect 1
+transform respect laut 1
+transform rig 1
+transform rig ag 1
+transform rl 2
+transform s0 1
+transform sappliqu 1
+transform sappliqu aus 1
+transform script 1
+transform se 1
+transform se pr 1
+transform seront 1
+transform seront simpl 1
+transform sl1 1
+transform sl1 modl 1
+transform soit 1
+transform som algorithm 1
+transform sont 1
+transform sont souv 1
+transform sous 1
+transform sous sa 1
+transform spec 1
+transform spec adapt 1
+transform spec interfac 1
+transform spec modif 1
+transform specif 1
+transform specif fil 1
+transform specif modif 1
+transform subband 1
+transform subband cod 1
+transform subgraph 1
+transform such specif 1
+transform sur 1
+transform sur la 1
+transform sur le 1
+transform sur sa 1
+transform system 1
+transform t ent 1
+transform t respect 1
+transform ta 1
+transform ta tel 1
+transform tak 1
+transform tak plac 1
+transform td 1
+transform techniqu 1
+transform ten 1
+transform ten maint 1
+transform term 1
+transform term en 1
+transform th canon 1
+transform th constraint 1
+transform th dat 2
+transform th inequ 1
+transform th nest 1
+transform th problem 1
+transform th qu 1
+transform th sequ 1
+transform th shortest 1
+transform th subgraph 1
+transform th upd 1
+transform th user 1
+transform than unfold 1
+transform that graph 1
+transform that inclus 1
+transform that yield 1
+transform them accord 1
+transform theor 2
+transform to adapt 1
+transform to eventu 1
+transform to extract 1
+transform to gener 1
+transform to optim 1
+transform to upd 1
+transform tout 1
+transform transl 1
+transform transl rpc 1
+transform typ 1
+transform ult 1
+transform ult erieur 1
+transform un 1
+transform un var 1
+transform vi 1
+transform which adjust 1
+transform with fflq 1
+transform with method 1
+transform with po 1
+transform xi 1
+transform xi yi 1
+transform1 1
+transformer 4
+transformer builder 1
+transformer for qualit 1
+transformer is implem 1
+transformer le 1
+transformer le nid 1
+transformer perform 1
+transformer perform syntac 1
+transformer un 2
+transformer un acc 1
+transformer un boucl 1
+transformer un liaison 1
+transformer.sor 1
+transfrom 1
+transfrom for object 1
+transgr 1
+transit 39
+transit a modif 1
+transit adjac 1
+transit adjac cel 1
+transit ain 1
+transit al obtain 1
+transit and conver 1
+transit appart 1
+transit ar del 1
+transit ar direct 1
+transit ar log 1
+transit ar lost 1
+transit ar restrict 1
+transit ayant 1
+transit ayant conduit 1
+transit ba 1
+transit can tak 1
+transit cl 1
+transit cl graph 1
+transit closur 8
+transit closur rel 1
+transit counterpart 1
+transit d etermin 1
+transit de 1
+transit de lagc 1
+transit diagram 3
+transit disc 1
+transit dont il 1
+transit dont lind 1
+transit du 1
+transit du vecteur 1
+transit entr 1
+transit for program 1
+transit from detail 1
+transit from error 1
+transit from execut 1
+transit from inact 1
+transit from read 1
+transit from structur 1
+transit from succ 1
+transit from y3 1
+transit funct 2
+transit ge 1
+transit ge upd 1
+transit import 1
+transit import modl 1
+transit import theor 1
+transit interm 1
+transit interm ediair 1
+transit interv 1
+transit is actu 1
+transit is ext 1
+transit is observ 1
+transit mach 1
+transit matr 1
+transit matr de 1
+transit modl 1
+transit modl refer 1
+transit now tak 1
+transit occur 1
+transit of object 1
+transit of vi 1
+transit pan 1
+transit pan est 1
+transit pan par 1
+transit pl 1
+transit plac 1
+transit potentiel 1
+transit potentiel int 1
+transit probabil 1
+transit proper 1
+transit qu 1
+transit qu rest 1
+transit reduc 1
+transit reflec 1
+transit reflec closur 1
+transit rel 1
+transit repr 1
+transit repr esent 1
+transit research 1
+transit research corpor 1
+transit rl 2
+transit sequ 1
+transit sont 1
+transit sont stochastiqu 1
+transit susceptibl 1
+transit susceptibl de 1
+transit system 1
+transit th imag 1
+transit tir 1
+transit tir ee 1
+transit tirabl 1
+transit tj 1
+transit tj au 1
+transit tj dan 1
+transit tj est 1
+transit tj tirabl 1
+transit to high 1
+transit to read 1
+transit vi 1
+transit vi support 1
+transl 48
+transl a specif 1
+transl and dyad 1
+transl and maint 1
+transl and protect 1
+transl and resc 1
+transl and zon 1
+transl argum 1
+transl as follow 1
+transl as opposit 1
+transl assum 1
+transl becom 1
+transl becom unsynchron 1
+transl de 1
+transl de longueur 1
+transl de s1 1
+transl de s2 1
+transl dep.2 1
+transl detail 1
+transl detail design 1
+transl down 1
+transl down rel 1
+transl each commun 1
+transl error 1
+transl et le 1
+transl for proc 1
+transl fortran 1
+transl found 1
+transl from abcl 1
+transl from program 1
+transl from schem 1
+transl from specif 1
+transl funct 2
+transl hardwar 1
+transl in design 1
+transl in empt 1
+transl int abstract 1
+transl int con 1
+transl int datalog 1
+transl int norm 1
+transl int procedur 1
+transl int standard 1
+transl int wait 1
+transl invar 1
+transl invar approach 1
+transl is lik 1
+transl is mad 1
+transl log 1
+transl lookasid 1
+transl lookasid buffer 1
+transl me 1
+transl me object 1
+transl mtl 1
+transl mtl program 1
+transl of cod 1
+transl of eject 1
+transl of fortran 3
+transl of mod 1
+transl of program 1
+transl of rpc 1
+transl of screen 1
+transl of se 1
+transl of sl1 1
+transl of specif 1
+transl or project 1
+transl part 1
+transl ph 1
+transl prepar 1
+transl proc 2
+transl produc 1
+transl produc longer 1
+transl program 2
+transl refer 1
+transl rel 1
+transl rel inform 1
+transl rl 3
+transl rpc 1
+transl rpc styl 1
+transl sl1 1
+transl sl1 modl 1
+transl st 1
+transl st cont 1
+transl stag 1
+transl task 1
+transl techniqu 1
+transl text 1
+transl text repr 1
+transl th asc 1
+transl th bod 1
+transl th context 1
+transl th demon 1
+transl th hdl 1
+transl th me 1
+transl th parser 1
+transl th pattern 1
+transl th program 1
+transl th refer 1
+transl th result 2
+transl th rich 1
+transl th text 1
+transl th tot 1
+transl tl 1
+transl to ad 1
+transl to allow 1
+transl to cr 1
+transl to greater 2
+transl to high 1
+transl to minim 1
+transl us 1
+transl using 1
+transl using pcct 1
+transl vect 1
+transl ver 1
+transl wil prov 1
+transl word 1
+translat 1
+translat es 1
+translat es lun 1
+translock 1
+translock mod 1
+translock mod translockx 1
+translockx 1
+translockx mod 1
+transm 28
+transm a me 3
+transm a record 1
+transm at lpm 1
+transm aux 1
+transm aux op 1
+transm b unit 1
+transm ce 1
+transm ce requ 1
+transm channel 1
+transm de 2
+transm de don 1
+transm del 2
+transm drop 1
+transm drop rand5 1
+transm f atm 1
+transm f bit 1
+transm from connect 1
+transm in incr 1
+transm in infrequ 1
+transm in order 1
+transm in term 1
+transm inform 1
+transm interv 1
+transm le traff 1
+transm lin 1
+transm me 2
+transm modl 1
+transm modl dynam 1
+transm msg 1
+transm msg dest 1
+transm nonloc 1
+transm object 1
+transm object transm 1
+transm of docum 1
+transm of pack 1
+transm on cel 1
+transm on me 1
+transm on se 1
+transm or aging 1
+transm or recept 1
+transm overhead 1
+transm pack 2
+transm pack lo 1
+transm pack using 1
+transm period 1
+transm period me 1
+transm period pl 1
+transm rat 1
+transm schedl 1
+transm th inform 1
+transm th me 1
+transm th pack 1
+transm th period 1
+transm th se 1
+transm th status 1
+transm th sv 1
+transm their synchron 1
+transm tim 4
+transm to model 1
+transm to proc 1
+transm unidirect 1
+transm without interrupt 1
+transmettr 1
+transmettr a mapl 1
+transmettr un 1
+transmettr un requ 1
+transmitthread 1
+transp 6
+transp block 1
+transp block siz 1
+transp e de 1
+transp ee 1
+transp ee de 1
+transp es 1
+transp matr 1
+transp of step 1
+transp oper 1
+transp prim 1
+transpar 12
+transpar acc 1
+transpar aux 1
+transpar aux op 1
+transpar by ap 1
+transpar de 1
+transpar de acc 1
+transpar et peut 1
+transpar failover 1
+transpar inform 1
+transpar langu 1
+transpar par 1
+transpar par connec 1
+transpar pour 2
+transpar pour lunif 1
+transpar pour lutilisateur 1
+transpar prolog 1
+transpar prolog mach 1
+transpar scal 1
+transpar scal ver 1
+transport 9
+transport almost transpar 1
+transport and se 1
+transport buffer 1
+transport connect 1
+transport header 1
+transport in heter 1
+transport inf 1
+transport issu 1
+transport layer 1
+transport layer acknowledg 1
+transport layer flow 1
+transport layer overhead 1
+transport level 1
+transport level connect 1
+transport level flow 1
+transport level overhead 1
+transport level pack 1
+transport level proc 1
+transport me 1
+transport network 1
+transport of dat 1
+transport overhead 1
+transport pack 1
+transport pack car 1
+transport pack flow 1
+transport pack lo 1
+transport pack pack 1
+transport path 1
+transport pip 1
+transport protocol 2
+transport protocol pr 1
+transport receiver 1
+transport sender 1
+transport sourc 1
+transport traff 1
+transport traff flow 1
+transportlevel 1
+transportlevel connect 1
+transportlevel pack 1
+transposit 4
+transposit algorithm 1
+transposit algorithm con 1
+transposit algorithm describ 1
+transposit and weak 1
+transposit de 1
+transposit de tableau 1
+transposit oracl 1
+transposit problem 1
+transposit problem inst 1
+transputer 2
+transputer and occam 1
+transputer system 1
+transver 2
+transver aux 1
+transver aux pag 1
+trap 5
+trap and techniqu 1
+trap ar disc 1
+trap du 1
+trap funct 1
+trapez 2
+trapez instead 1
+trappl 1
+travail 4
+travail a la 1
+travail a tous 1
+travail aider 1
+travail aider le 1
+travail d equip 1
+travail de 1
+travail de recherch 1
+travail de th 1
+travail e sur 1
+travail est 2
+travail est de 1
+travail est qu 1
+travail fastidieux 1
+travail glob 1
+travail glob effectu 1
+travail import consisterait 1
+travail qu 1
+travail qu nous 1
+travail ser 1
+travail ser grand 1
+travail sur 2
+travail sur de 1
+travail sur le 1
+travail sur un 1
+travail th 1
+travail th eoriqu 1
+travailler 2
+travailler au 1
+travailler au niveau 1
+travailler au sein 1
+travailler dan 1
+travailler dan son 1
+travaux 5
+travaux actuel 1
+travaux actuel de 1
+travaux ant 1
+travaux ant erieur 1
+travaux appar 1
+travaux appar es 1
+travaux ax 1
+travaux ax es 1
+travaux concern 1
+travaux concern la 1
+travaux dan 1
+travaux dan le 1
+travaux dappel 1
+travaux de 3
+travaux de de 1
+travaux de debr 1
+travaux de holland 1
+travaux de i.c 1
+travaux de lacad 1
+travaux de recherch 1
+travaux de tick 1
+travaux effectu 1
+travaux effectu es 1
+travaux et expliqu 1
+travaux le 1
+travaux ont 1
+travaux ont alor 1
+travaux peuv 1
+travaux peuv trouver 1
+travaux sin 1
+travaux sin erent 1
+travaux sur 1
+travaux sur la 1
+travaux sur le 1
+travaux tent 1
+travaux tent de 1
+travel 8
+travel adapt 1
+travel adapt upt 1
+travel ininternet 2
+travel ininternet number 2
+travel salesman 2
+travel salesman problem 2
+travel salesperson 1
+travel salesperson problem 1
+traver 22
+traver 1t2 1
+traver al sharp 1
+traver al switch 1
+traver an expr 1
+traver an object 1
+traver and cod 1
+traver and select 1
+traver ar accept 1
+traver aus 1
+traver aus bien 1
+traver beyon cal 1
+traver by test 1
+traver ce 1
+traver ce reforml 1
+traver cfg 1
+traver cfg path 1
+traver de 1
+traver de bloc 1
+traver de ce 1
+traver de la 1
+traver de lunit 1
+traver du 2
+traver du ch 1
+traver du param 1
+traver du pr 1
+traver edg 1
+traver ee 1
+traver ee dun 1
+traver eventu 1
+traver eventu reach 1
+traver for sy 1
+traver funct 1
+traver funct id 1
+traver funct traver 1
+traver int 1
+traver int eoc 1
+traver is nec 1
+traver la 1
+traver la prem 1
+traver le 2
+traver le born 1
+traver le conjonct 1
+traver le tableau 1
+traver multipl 1
+traver multipl tim 1
+traver number 1
+traver of compar2 1
+traver of complec 1
+traver port 1
+traver right link 1
+traver test 1
+traver test nec 1
+traver th default 1
+traver th edg 1
+traver th graph 1
+traver th log 1
+traver th mesh 1
+traver th network 1
+traver th param 1
+traver th switch 1
+traver that begin 1
+traver that edg 1
+traver trac 1
+traver trac pref 1
+traver trac tr 1
+traver un ensembl 1
+traver void 1
+traynor 1
+traynor and li 1
+trc 2
+treat 36
+treat and cock 1
+treat as belong 1
+treat as member 1
+treat as slav 1
+treat as supernod 2
+treat c mer 1
+treat confid 1
+treat disjoint 1
+treat disjoint resourc 1
+treat dur recov 1
+treat each chunk 1
+treat each inst 1
+treat geometer 1
+treat geometer object 1
+treat in turn 1
+treat neg 1
+treat neg liter 1
+treat non 1
+treat non singl 1
+treat object 1
+treat pr 1
+treat pur 1
+treat pur syntact 1
+treat sem 1
+treat simil 2
+treat th ab 1
+treat th antimatr 1
+treat th dat 1
+treat th del 1
+treat th inform 1
+treat th om 1
+treat th proof 1
+treat upd 1
+treatm 10
+treatm al cover 1
+treatm of coinc 1
+treatm of init 1
+treatm of parallel 1
+treatm of parameter 1
+treatm of program 1
+treatm of project 1
+treatm of refin 1
+treatm of typ 1
+treatm of variabl 1
+treatm plant 1
+treduc 1
+treeheight 1
+treeheightstat 1
+treelin 1
+treelin scanposit 1
+treemap 1
+treemap visu 1
+treesort 1
+treetimestat 1
+treeviz 1
+treeviz treemap 1
+trehan 1
+treil 1
+treil aff 1
+treil assoc 1
+treil assoc es 1
+treil assur 1
+treil assur un 1
+treil aur 1
+treil aur alor 1
+treil aut 1
+treil aut lempl 1
+treil correspon 1
+treil correspon pour 1
+treil d ecrit 1
+treil d evelop 1
+treil de 1
+treil de trouver 1
+treil distinct 1
+treil engendr 1
+treil ent 1
+treil est 1
+treil est donc 1
+treil est tel 1
+treil et la 1
+treil on assoc 1
+treil ont 1
+treil ont de 1
+treil perm 1
+treil perm de 1
+treil peuv 1
+treil peuv etr 1
+treil pr 1
+treil pr esent 1
+treil qu 1
+treil qu form 1
+treil sont 1
+treil sont deux 1
+treil sur 1
+treil sur lequel 1
+treil t0 1
+treil t0 treil 1
+treil t1 1
+treil t1 treil 1
+treil t2 1
+treil tj 1
+treil tj par 1
+treil tj s 1
+treil tk 1
+treil tp 1
+treil vu 1
+trein 1
+treleav 1
+trem 5
+trem adv 1
+trem amount 1
+trem graph 1
+trem pot 1
+trem simplif 1
+trembl 1
+trembl th contrit 1
+tren 18
+tren al val 1
+tren and constraint 2
+tren and futur 1
+tren and predict 2
+tren ar simil 1
+tren in board 2
+tren in build 3
+tren in comput 1
+tren in datab 1
+tren in design 1
+tren in fil 1
+tren in growth 2
+tren in knowledg 1
+tren in parallel 1
+tren in q3.0 1
+tren in rout 1
+tren in system 1
+tren in theor 1
+tren in valu 2
+tren is expect 1
+tren observ 1
+tren of cr 2
+tren of design 1
+tren of imag 1
+tren of nw 1
+tren to support 1
+tren wer observ 1
+trent 1
+tresch 1
+tresult 1
+tresult cc 1
+triangl 17
+triangl algorithm 1
+triangl and giv 1
+triangl and henc 1
+triangl and multipl 1
+triangl and optim 1
+triangl ar construc 1
+triangl ar expr 1
+triangl ar guaranteed 1
+triangl as specif 1
+triangl automatiqu 1
+triangl automatiqu dun 1
+triangl becom 1
+triangl by lin 1
+triangl cel 1
+triangl cel fac 1
+triangl con 1
+triangl connect 1
+triangl connect graph 1
+triangl contain 1
+triangl de 1
+triangl de delaun 1
+triangl del 1
+triangl del exampl 1
+triangl each monot 1
+triangl edg 1
+triangl fac 1
+triangl fac caus 1
+triangl fac cr 1
+triangl fac produc 1
+triangl fact 1
+triangl fact result 1
+triangl form 1
+triangl gener 1
+triangl geometer 1
+triangl geometer object 1
+triangl graph 1
+triangl grid 1
+triangl hav non 1
+triangl heap 1
+triangl heap proper 1
+triangl heap requir 1
+triangl heap structur 1
+triangl heap using 1
+triangl heapsort 1
+triangl in 3d 1
+triangl indep 1
+triangl inequ 2
+triangl intersect 1
+triangl intersect test 1
+triangl is compl 1
+triangl is construc 1
+triangl is giv 1
+triangl is lin 1
+triangl is np 1
+triangl is observ 1
+triangl is perform 1
+triangl it belong 1
+triangl it produc 1
+triangl iter 1
+triangl iter spac 1
+triangl laser 1
+triangl laser scan 1
+triangl lin 1
+triangl lying 1
+triangl matr 2
+triangl matr contain 1
+triangl maximiz 1
+triangl ment 1
+triangl ment earl 1
+triangl mesh 1
+triangl mesh describ 1
+triangl network 1
+triangl of contour 1
+triangl of fac 1
+triangl of object 1
+triangl polygon 1
+triangl polyhedr 1
+triangl polyhedr con 1
+triangl polyhedr differ 1
+triangl polyhedr eff 1
+triangl polyhedr offer 1
+triangl polyhedr primitiv 1
+triangl primitiv 1
+triangl problem 2
+triangl proc 1
+triangl produc 1
+triangl produc fac 1
+triangl pyramid 1
+triangl pyramid ind 1
+triangl rel 1
+triangl repr 2
+triangl rout 1
+triangl schem 1
+triangl se 1
+triangl se fac 1
+triangl shap 1
+triangl shar 1
+triangl siftdown 1
+triangl siftdown algorithm 1
+triangl solut 1
+triangl solut dep 1
+triangl solut ph 1
+triangl system 1
+triangl system result 1
+triangl th graph 1
+triangl th polygon 1
+triangl th polyhedr 1
+triangl than arbitr 1
+triangl that belong 1
+triangl that comp 1
+triangl that def 1
+triangl to tetrahedr 1
+triangl triangl 1
+triangl triangl intersect 1
+triangl wh 1
+triangl wh contour 1
+triangl without obtus 1
+triangl yield 1
+triangu. 1
+triangulair 1
+triangulair du 1
+triangulair du produit 1
+triangulair prop 1
+triangularheapsort 1
+triangularheapsort sort 1
+triangularheapsort which sort 1
+triangularsiftdown 1
+triangulartrickledown 1
+tribbl 1
+tribu 1
+trick 9
+trick appl 1
+trick maneuver 1
+trick part 1
+trick when implem 1
+trickledown 1
+trickledown algorithm 1
+trickledown is common 1
+trickledown oper 1
+trickledown ver 1
+tricom 1
+tridiagon 1
+tridiagon and appl 1
+tridiagon ar compar 1
+tridiagon matr 1
+tridiagon matr approxim 1
+tridiagon matr obtain 1
+tridiagon matr ti 1
+tridiagon solver 1
+tridiagon solver determin 1
+tridiagon solver scal 1
+tridiagon suggest 1
+tridiagon th eigenvalu 1
+tridimensionnel 2
+tridimensionnel de 1
+tridimensionnel de la 1
+tridimensionnel de prot 1
+tridimensionnel dobj 1
+trigger 13
+trigger a fallback 1
+trigger and transact 1
+trigger ar avail 1
+trigger as describ 1
+trigger batch 1
+trigger batch integr 1
+trigger by lost 1
+trigger eal 1
+trigger ear deliv 1
+trigger for execut 1
+trigger garb 1
+trigger garb collect 1
+trigger it retrief 1
+trigger of garb 1
+trigger point 1
+trigger simultan 1
+trigger simultan execut 1
+trigger th dent 1
+trigonometer 1
+trigonometer funct 1
+trim 4
+trim allow 1
+trim at garb 1
+trim environm 1
+trim environm eager 1
+trim or writ 1
+trim th fat 1
+trim th tim 1
+trim trim 1
+tring 1
+tring a37 1
+tring a37 2154a3a8 1
+triol 2
+triol suggest 1
+trip 3
+trip dat 1
+trip dat assoc 1
+trip lat 1
+trip pack 1
+trip polyhedr 1
+trip polyhedr repr 1
+trip repr 1
+trip tim 1
+trip tim rt 1
+trip ver 1
+trip ver structur 1
+trip wast 1
+tripl 5
+tripl ar writ 1
+tripl as atom 1
+tripl as valu 1
+tripl attribut 1
+tripl decomposit 1
+tripl decomposit oper 1
+tripl form 1
+tripl in list 1
+tripl in se 1
+tripl int string 1
+tripl is cod 1
+tripl is concat 1
+tripl of distinct 1
+tripl repr 1
+tripl respect 1
+tripl valu 1
+tripl valu attribut 1
+tripletvalu 1
+tripletvalu and se 1
+tripletvalu or se 1
+triqu 1
+triqu assoc 1
+triqu automatiqu 1
+triqu dan 1
+triqu dan le 1
+triqu de 1
+triqu de la 1
+triqu de leur 1
+triqu de lincertitud 1
+triqu de motif 1
+triqu de sit 1
+triqu en 1
+triqu en vi 1
+triqu et dalign 1
+triqu habituel 1
+triqu habituel util 1
+triqu incertain 1
+triqu invar 1
+triqu invar par 1
+triqu li 1
+triqu nous 1
+triqu nous avon 1
+triqu peut 1
+triqu peut permettr 1
+triqu rieman 1
+triqu rieman compat 1
+triqu si 1
+triqu si cart 1
+triqu syst 1
+triqu syst matiqu 1
+triqu tel 1
+triqu tel qu 1
+triqu tr 1
+triqu usuel 1
+triqu usuel en 1
+tristan 1
+tristan richardson 1
+triumf 1
+triv 39
+triv ain 1
+triv ain qu 1
+triv assum 1
+triv bridgeconnect 1
+triv bridgeconnect compon 1
+triv ca 1
+triv ca occur 1
+triv comput 1
+triv comput demand 1
+triv condit 1
+triv differ 1
+triv equiv 1
+triv equiv en 1
+triv ext 2
+triv hold 1
+triv icon 1
+triv implem 1
+triv knowledg 1
+triv lower 1
+triv lower bound 1
+triv me 1
+triv me pa 1
+triv modif 1
+triv multipl 1
+triv mut 1
+triv oper 1
+triv path 1
+triv path ec 1
+triv problem 3
+triv program 1
+triv result 1
+triv result show 1
+triv solut 1
+triv task 3
+triv th system 1
+triv to se 2
+triv wel typ 1
+trjn 1
+trjn alor 1
+trjn de 1
+trjn de op 1
+trjn zj 1
+trn 1
+trojan 1
+trojan hor 1
+trol 3
+trol is unlik 1
+trol langu 1
+trompeus 1
+trompeus a ce 1
+trop 4
+trop co 1
+trop co uteus 1
+trop co uteux 1
+trop complec 2
+trop de 2
+trop de probl 2
+trop elev 1
+trop elev ee 1
+trop exub 1
+trop exub erant 1
+trop fa 1
+trop fa pour 1
+trop favor 1
+trop favor pour 1
+trop fr 1
+trop fr equent 1
+trop grand 1
+trop grand nombr 1
+trop grand pour 1
+trop h at 1
+trop import 1
+trop import de 1
+trop import pour 1
+trop incertain 1
+trop incertain pour 1
+trop longu 1
+trop massif 1
+trop massif pour 1
+trop p enal 1
+trop petit 1
+trop peu 1
+trop peu de 1
+trop rapid 1
+trop restrict 1
+trop souv 1
+trop souv ignor 1
+trop statiqu 1
+trop statiqu pour 1
+trotter 1
+trou 1
+trou dan 1
+trou dan la 1
+trou sur 1
+trou sur la 1
+troubl 3
+troubl by imprec 1
+troubl situ 1
+troubl with avail 1
+troubleshoot 2
+troud 1
+troud walter 1
+trout 1
+trouv 4
+trouv ain 1
+trouv alor 1
+trouv alor en 1
+trouv am elior 1
+trouv d efin 1
+trouv dan 2
+trouv dan le 1
+trouv de 1
+trouv de don 1
+trouv donc 1
+trouv donc etr 1
+trouv donc favor 1
+trouv e le 1
+trouv en 3
+trouv en posit 1
+trouv en program 1
+trouv en zon 1
+trouv es 2
+trouv es dan 1
+trouv es en 1
+trouv lapproch 1
+trouv lapproch omanuel 1
+trouv le 1
+trouv le environ 1
+trouv le mach 1
+trouv naturel 1
+trouv naturel exploit 1
+trouv qu 1
+trouv qu peu 1
+trouv simplif 1
+trouv transform 1
+trouvait 1
+trouvait init 1
+trouver 4
+trouver dan 2
+trouver dan la 1
+trouver dan le 1
+trouver dan newman 1
+trouver de 1
+trouver de compl 1
+trouver l etat 1
+trouver la 2
+trouver la cliqu 1
+trouver la valeur 1
+trouver le 3
+trouver le clef 1
+trouver le nouveaux 1
+trouver le nouvel 1
+trouver parm 1
+trouver plusieur 1
+trouver plusieur structur 1
+trouver un 2
+trouver un appl 1
+trouver un comprom 1
+trouver un matr 1
+trouver un moy 1
+trouver un syst 1
+trouveront 1
+trouveront s equ 1
+trp 1
+trp repr 1
+trpc 1
+tru 4
+tru empir 1
+tru empir proc 1
+tru frug 1
+tru frug oracl 1
+tru gener 1
+tru gener purp 1
+tru inh 1
+tru synchron 1
+tru synchron me 1
+tru us 1
+tru us selfmodif 1
+truck 1
+truck inherit 1
+truck inherit attribut 1
+truefail 1
+truefail fail 1
+truefail fail fail 1
+trueg 1
+trueg and fx 1
+truman 1
+truman jo 1
+trumbor 1
+trunc 2
+trunk 1
+trunk demand 1
+trunk demand serv 1
+trunk group 1
+trunk network 1
+trunk network administer 1
+trunk to support 1
+trust 2
+trust a aus 1
+trust a la 1
+trust acc 1
+trust acc ed 1
+trust adr 1
+trust adr claus 1
+trust ain 1
+trust ain qu 1
+trust arit 1
+trust c3 1
+trust c3 seq 1
+trust cl 1
+trust deep 1
+trust deep arit 1
+trust doit 1
+trust doit alor 1
+trust est 1
+trust est identiqu 1
+trust est sp 1
+trust et deep 1
+trust et neck 1
+trust fonct 1
+trust fonct soit 1
+trust me el 1
+trust ne 1
+trust ne sont 1
+trust par 1
+trust par un 1
+trust perm 1
+trust perm de 1
+trust peut 1
+trust peut etr 1
+trust peuv 1
+trust peuv etr 1
+trust pour 1
+trust pour con 1
+trust pour savoir 1
+trust rl 1
+trust shallow 1
+trust shallow arit 1
+trust si 1
+trust si la 1
+trust sont 1
+trust sont fus 1
+trust superficiel 1
+trust vl 1
+trustworth 1
+trustworth is relev 1
+trustworth system 1
+truth 14
+truth assignm 1
+truth dat 1
+truth hypoth 1
+truth in cl 1
+truth is defin 1
+truth maint 1
+truth maint system 1
+truth slot 1
+truth tabl 2
+truth tabl gen 1
+truth valu 7
+try 43
+try adr 1
+try adr claus 1
+try altern 1
+try altern rl 1
+try and look 1
+try arit 1
+try c1 1
+try c1 retr 1
+try c1 trust 1
+try c2 1
+try c2 trust 1
+try cr 1
+try cr ee 1
+try differ init 1
+try et retr 1
+try et trust 1
+try et try 1
+try ev conceiv 1
+try loc 1
+try me el 1
+try ou 1
+try ou retr 1
+try sauv 1
+try sauv ce 1
+try th altern 1
+try th badg 1
+try to acc 1
+try to achief 1
+try to adapt 1
+try to ar 1
+try to av 2
+try to caus 1
+try to def 1
+try to en 1
+try to explain 1
+try to expr 1
+try to ext 1
+try to fact 1
+try to find 5
+try to ge 1
+try to hid 1
+try to impl 1
+try to keep 2
+try to learn 1
+try to maintain 2
+try to mak 1
+try to merg 1
+try to minim 1
+try to partit 1
+try to reduc 1
+try to remain 1
+try to rephr 1
+try to retain 1
+try to simplif 1
+try to solut 2
+try to support 1
+try to transform 1
+try to understand 1
+try to us 2
+try to visu 1
+try to work 1
+ts 13
+ts accord 1
+ts acpt 1
+ts acpt ti 1
+ts and prev 1
+ts and ps 1
+ts and tp 1
+ts and ts0 1
+ts assoc 1
+ts ca 1
+ts clock 1
+ts clock cycl 1
+ts const 1
+ts correspon 2
+ts cur 1
+ts cur acc 1
+ts cur acpt 1
+ts ecrit 1
+ts en 1
+ts in fout 1
+ts loc 1
+ts model 1
+ts oe 1
+ts oe ts0 1
+ts on cur 1
+ts prev 1
+ts prev ts 1
+ts proper 1
+ts proper st 1
+ts sec 1
+ts sec me 1
+ts ti 1
+ts tot 1
+ts tot sum 1
+ts tp 1
+ts tpl 1
+ts ts0 1
+ts0 1
+ts0 oe 1
+ts0 oe tsp 1
+ts0 tsp 1
+ts87 1
+tsah 1
+tsang 1
+tsang and david 1
+tsclr 1
+tsclr and tkmin 1
+tsclr of enter 1
+tscur 1
+tscur denot 1
+tseng 1
+tsep 1
+tsep b tkmin 1
+tseq 2
+tseq tp 1
+tsg 1
+tsharp 1
+tsin 1
+tsitsikl 1
+tsiz 1
+tsiz reducead16 1
+tsk 1
+tsk mac 1
+tsl 1
+tsld 1
+tsld resolut 1
+tsouc 1
+tsp 1
+tsp tsq 1
+tsp tsq tsr 1
+tsp tsq yp 1
+tspanner 1
+tspanner with fact 1
+tspec 1
+tspec.good 1
+tsq 1
+tsq tsr 1
+tsq yp 1
+tsq yp xq 1
+tsql 1
+tsql a langu 1
+tsr 1
+tsuj 1
+tsuj cs.ucsc.edu 1
+tsungnan 1
+tsungnan lin 1
+tt 2
+tt and ttl 1
+tt dat 1
+tt datab 1
+tt datab contain 1
+tt datab decr 1
+tt datab du 1
+tt datab incr 1
+tt datab perform 1
+tt datab requir 1
+tt quer 1
+tt quer becom 1
+tt quer q1.0 1
+tt quer requir 1
+tt rel 1
+tt to ttl 1
+tt12354wwwwww 1
+tt12354wwwwww 1i 1
+tt12354wwwwww 1i 1i 1
+tt1t2t3a12ap1pwpwp2w2t3t3t2t1t4t4 1
+ttc 1
+ttc and tth 1
+ttc counterpart 1
+ttc quer 1
+ttc stand 1
+ttc tth 1
+ttc tth ttlc 1
+tth 2
+tth el 1
+tth qu 1
+tth quer 1
+tth ttlc 1
+tth ttlc ttlh 1
+tth ver 1
+ttim 1
+ttim a1 1
+ttl 4
+ttl and cm 1
+ttl and tt 1
+ttl as seen 1
+ttl ca 1
+ttl dat 1
+ttl datab 1
+ttl datab ca 1
+ttl datab degrad 1
+ttl datab perform 1
+ttl datab requir 1
+ttl ee 1
+ttl ee be 1
+ttl frequ 1
+ttl frequ rang 1
+ttl quer 1
+ttl quer q1.0 1
+ttl quer tak 1
+ttl rel 1
+ttl typ 1
+ttl typ datab 1
+ttlc 1
+ttlc and ttlh 1
+ttlc incr 1
+ttlc ttlh 1
+ttlh 1
+ttlh and tth 1
+ttlh qu 1
+ttot 1
+tty 1
+tty agent 1
+tty agent handl 1
+tu 2
+tu m unch 1
+tub 1
+tubercl 1
+tubercl or lung 1
+tuck 1
+tuck algorithm 1
+tud 2
+tud actuel 1
+tud actuel la 1
+tud de 1
+tud de ce 1
+tud de la 1
+tud donc 1
+tud donc le 1
+tud es 2
+tud es dan 1
+tud est 1
+tud est ba 1
+tud le 1
+tud le perform 1
+tud le techniqu 1
+tud rem 1
+tud rem en 1
+tud th 1
+tud th oriqu 1
+tuesd 1
+tumeur 1
+tun 7
+tun and perform 1
+tun collect 1
+tun collect commun 1
+tun const 1
+tun for complec 1
+tun implem 1
+tun of guid 1
+tun of search 1
+tun parameter 1
+tun point 1
+tun project 1
+tun search 1
+tun search spac 1
+tun th perform 1
+tun vi ind 1
+tupl 18
+tupl acc 1
+tupl and larger 1
+tupl and q1.7 1
+tupl and rigid 1
+tupl ar equiv 1
+tupl ar incompl 1
+tupl ar longer 1
+tupl ar perform 1
+tupl ar select 1
+tupl ar writ 1
+tupl as point 1
+tupl as vect 1
+tupl being select 1
+tupl but retrief 1
+tupl by infinit 1
+tupl c fo1 1
+tupl can thus 1
+tupl check 1
+tupl compon 1
+tupl correspon 1
+tupl describ 1
+tupl f1 1
+tupl fi 1
+tupl hd1 1
+tupl identif 2
+tupl impl 1
+tupl in lp 1
+tupl in xp 1
+tupl incr 2
+tupl indep 1
+tupl is creat 1
+tupl is cur 1
+tupl is greater 1
+tupl is unpack 1
+tupl length 1
+tupl length cardin 1
+tupl m repr 1
+tupl may caus 1
+tupl of ar 1
+tupl of attribut 1
+tupl of empl 1
+tupl of nonneg 1
+tupl of point 1
+tupl of string 1
+tupl particip 1
+tupl per pag 1
+tupl prov 1
+tupl repr 1
+tupl requir 1
+tupl requir multipl 1
+tupl select 1
+tupl sinc empl 1
+tupl t0 2
+tupl than tt 1
+tupl that satisf 1
+tupl timestamp 1
+tupl timestamp 1nf 1
+tupl timestamp approach 1
+tupl timestamp chang 1
+tupl timestamp ttl 1
+tupl timestamp wh 1
+tupl to denot 1
+tupl v constraint 1
+tupl we deon 1
+tupl wh 1
+tupl wh gener 1
+tupl wh register 1
+tupl wh remain 1
+tupl wil mean 1
+tupl with key 1
+tupl x1 1
+tupl xi 1
+tupl yi 1
+tuplesperp 1
+tur 6
+tur compl 1
+tur comput 1
+tur comput power 1
+tur mach 5
+tur mach equiv 1
+tur mach theor 1
+tur r eel 1
+tur test 1
+turb 1
+turb blad 1
+turb blad mesh 1
+turb blad using 1
+turbl 2
+turbl en 1
+turk 3
+turk a aus 1
+turk appliqu 1
+turk appliqu ce 1
+turk dan 1
+turk ment 1
+turk ment aus 1
+turk ne 1
+turk ne ment 1
+turn 65
+turn allow 2
+turn allow hem 1
+turn attent 1
+turn be conver 1
+turn can mak 1
+turn defin 1
+turn dep 1
+turn for intersect 1
+turn hel 1
+turn hel dn 1
+turn hel motif 1
+turn impl 1
+turn improv 1
+turn improv gener 1
+turn incr 1
+turn int phy 1
+turn interact 1
+turn is achief 1
+turn led 1
+turn may kil 1
+turn mean 1
+turn our attent 3
+turn out actu 1
+turn parenth 1
+turn point 1
+turn prev 1
+turn qu 1
+turn read 1
+turn result 1
+turn round tim 1
+turn smooth 1
+turn technolog 1
+turn th correspon 1
+turn to broadcast 1
+turn to fic 1
+turn to regr 1
+turn to select 1
+turnaround 1
+turnaround rout 1
+turner 5
+turner arm 1
+turner arm research 1
+turner help 1
+turner help deep 1
+turnstil 1
+turnstil symbol 1
+tus 1
+tus prolog 1
+tut 12
+tut and peer 1
+tut and refer 1
+tut and stud 1
+tut can commun 1
+tut can connect 1
+tut can quick 1
+tut contact 1
+tut doc 1
+tut doc doc.html 1
+tut establ 1
+tut gatew7 1
+tut ingrid 1
+tut ingrid johnson 1
+tut intellig 1
+tut introduc 1
+tut led 1
+tut led teach 1
+tut lovelac 1
+tut lovelac dwheeler.html 1
+tut lovelac userg.html 1
+tut not 2
+tut on ev 1
+tut reconstruc 2
+tut s rol 1
+tut se 1
+tut se ingrid 1
+tut to explor 1
+tutoriel 1
+tutoriel da 1
+tutoriel sur 1
+tutoriel sur la 1
+tuttl 1
+tux 1
+tux system 1
+tux system approach 1
+tv 1
+tv lin 1
+tv lin sensit 1
+tv2 1
+tv2 root 1
+tvar 1
+tvar and weak 1
+tvar is separ 1
+tvar plus tran 1
+tvar to establ 1
+tvar we us 1
+tvar0 1
+tversk 1
+tversk scot 1
+tversk tak 1
+tversk tak adv 1
+tvm 1
+tw 27
+tw as big 1
+tw as fast 4
+tw loop 1
+tw loop nest 1
+tw of optim 1
+tw publ 1
+tw publ overview.html 1
+tw slower 1
+tw smaller 1
+tw th amount 1
+tw th box 1
+tw th memor 1
+tw th number 3
+tw th optim 1
+tw th siz 1
+tw th speed 1
+tw th tim 1
+tw th valu 1
+tw th width 1
+tw tr 1
+tw. 1
+twain 1
+twelfth 3
+twelfth annu 2
+twelfth intern 1
+twelfth intern joint 1
+twelv 4
+twelv and twent 1
+twelv group 1
+twelv subject 1
+twelv triangl 1
+twelv triangl fac 1
+twent 9
+twent com 1
+twent eighth 1
+twent eighth annu 1
+twent fanc 1
+twent fanc why 1
+twent fifth 1
+twent fifth intern 1
+twent four hour 1
+twent fourth 1
+twent fourth design 1
+twent million 1
+twent million user 1
+twent secon annu 1
+twent third 1
+twent third haw 1
+twentieth 3
+twentieth acm 1
+twentieth annu 1
+twentieth annu acm 1
+twentyfirst 1
+twentyfirst annu 1
+twentyfirst annu acm 1
+twgp 1
+twgp tosl 1
+twgp tosl twgp 1
+twin 1
+twin cel 1
+twoconnect 1
+twoconnect th sit 1
+twodim 1
+twodim graph 1
+twodim graph repr 1
+twofold 4
+twofold incr 1
+twohighwaynetwork 1
+twolevel 2
+twolevel system 2
+twosym 1
+twosym inclus 1
+twovisit 1
+twovisit and twovisit0 1
+twovisit0 1
+tx 10
+tx assoc 1
+tx assoc es 1
+tx cl 1
+tx is ch 1
+tx is comput 1
+tx t2 1
+tx0 1
+tx0 ptx 1
+txchain 1
+txclassdistribut 1
+txclassdistribut txclassdistributionl 1
+txclassdistribut txclassdistributionl txclassdistribut 1
+txclassdistributionl 1
+txclassdistributionl txclassdistribut 1
+txlink 1
+txlink txlink 1
+txr 1
+ty96 1
+tying 1
+tying th piec 1
+typ 111
+typ 9ij 1
+typ 9ij congru 1
+typ a collect 1
+typ a keystrok 1
+typ a repl 1
+typ a s1 1
+typ a tim 1
+typ a workst 1
+typ abbrev 1
+typ abstract 1
+typ abstract match 1
+typ aik 1
+typ al involut 1
+typ algorithm 2
+typ alphab 1
+typ alw li 1
+typ an agent 1
+typ and allow 1
+typ and argum 1
+typ and ch 1
+typ and cl 1
+typ and complec 1
+typ and condit 1
+typ and const 1
+typ and context 1
+typ and frequ 1
+typ and gener 1
+typ and high 1
+typ and list 1
+typ and meter 1
+typ and order 1
+typ and polymorph 1
+typ and se 1
+typ and term 1
+typ and typ 2
+typ annot 1
+typ annot instead 1
+typ appl 2
+typ appl rl 1
+typ approach 2
+typ ar atyp 1
+typ ar defin 1
+typ ar deriv 1
+typ ar incompar 1
+typ ar incr 1
+typ ar introduc 1
+typ ar repr 1
+typ ar serv 1
+typ ar simil 1
+typ ar stat 1
+typ ar subject 1
+typ ar tim 1
+typ ar treat 1
+typ arith 1
+typ arith tot 1
+typ as requir 1
+typ as ss 1
+typ aspect 1
+typ assign 2
+typ assign w1 1
+typ assignm 1
+typ assum 2
+typ atom 1
+typ atom forml 1
+typ avail 1
+typ axiom 2
+typ ba 2
+typ ba an 1
+typ ba de 1
+typ bbn 1
+typ bbn dot 1
+typ becom 1
+typ becom vacu 1
+typ being compar 1
+typ bit 1
+typ bit exchang 1
+typ bool 1
+typ bound 1
+typ budg 1
+typ budgetv 1
+typ by show 1
+typ ca 4
+typ calculus 1
+typ cast 1
+typ ch 1
+typ ch opstatus 1
+typ check 5
+typ check purp 1
+typ check remain 1
+typ checker 1
+typ cisc 1
+typ cl 1
+typ classif 1
+typ color 1
+typ con 1
+typ confid 1
+typ confid funct 1
+typ connect 1
+typ consider 1
+typ constraint 1
+typ constraint specif 1
+typ construc 2
+typ construc t1 1
+typ contain 1
+typ conver 1
+typ conver rout 1
+typ correct 1
+typ cost 1
+typ cost ten 1
+typ crossover 1
+typ dacc 1
+typ dacc es 1
+typ dadm 1
+typ dadm sont 1
+typ darchitectur 3
+typ darchitectur la 1
+typ darchitectur sur 1
+typ dat 1
+typ dat int 1
+typ datab 1
+typ dautr 1
+typ dautr part 1
+typ de 5
+typ de argum 1
+typ de ba 1
+typ de cel 1
+typ de classif 1
+typ de cod 3
+typ de colon 1
+typ de const 1
+typ de contr 1
+typ de contraint 1
+typ de coupur 1
+typ de cr 1
+typ de don 1
+typ de la 1
+typ de lenregister 1
+typ de liaison 1
+typ de mach 1
+typ de mod 1
+typ de patron 1
+typ de ping 1
+typ de probl 2
+typ de program 1
+typ de protocol 1
+typ de rep 1
+typ de repr 1
+typ de reproduc 1
+typ de retour 1
+typ de syst 1
+typ de topolog 1
+typ de transform 2
+typ de var 1
+typ decl 2
+typ decl cal 1
+typ def 2
+typ def nod 1
+typ deff 1
+typ deff gr 1
+typ deff peut 1
+typ defin 1
+typ definit 2
+typ denregister 1
+typ denregister de 1
+typ dep 1
+typ deriv 1
+typ describ 1
+typ determin 1
+typ dexp 1
+typ dexp er 1
+typ dext 1
+typ dext serait 1
+typ dim 1
+typ discipl 1
+typ divid 1
+typ dordonnanc 1
+typ dordonnanc statiqu 1
+typ dorgan 1
+typ dorgan de 1
+typ du 1
+typ du prem 1
+typ dun 1
+typ dun term 1
+typ dynam 1
+typ dynam load 1
+typ e forml 1
+typ e hugin 1
+typ e0 1
+typ e0j 1
+typ each atom 1
+typ each bod 1
+typ ec 1
+typ ecrivain 1
+typ ecrivain ecrivain 1
+typ ecrivain lecteur 1
+typ el 1
+typ el dorad 1
+typ embod 1
+typ empl 1
+typ ent 2
+typ equip 1
+typ error 2
+typ es 1
+typ es de 1
+typ est 1
+typ est de 1
+typ et darithm 1
+typ et de 1
+typ ev atom 1
+typ event 1
+typ event gener 1
+typ exampl 3
+typ exampl wh 1
+typ exempl 1
+typ expr 4
+typ expr built 1
+typ expr lead 1
+typ ext 1
+typ field 1
+typ fin 1
+typ fit 1
+typ flight 1
+typ flight siml 1
+typ follow 1
+typ for int 1
+typ for log 1
+typ for pr 1
+typ for prolog 1
+typ for read 1
+typ for smalltalk 1
+typ fortran77 1
+typ found 1
+typ fr 1
+typ fr funct 1
+typ framework 1
+typ from assttl 1
+typ h list 1
+typ handl 1
+typ harvard 1
+typ hav assoc 1
+typ hi qu 1
+typ hierarch 2
+typ hierarch ensur 1
+typ high 1
+typ high skew 1
+typ hom 1
+typ hom list 1
+typ i860 1
+typ in addit 1
+typ in emerald 1
+typ in exampl 1
+typ in high 1
+typ in hilog 1
+typ in log 1
+typ in object 1
+typ in prolog 1
+typ inclus 3
+typ inclus numer 1
+typ inclus port 1
+typ incorrect 1
+typ incorrect reason 1
+typ industr 1
+typ industr expenditur 1
+typ infer 3
+typ infer system 1
+typ inform 2
+typ inst 1
+typ inst ba 1
+typ instead 1
+typ int 2
+typ int arg1 1
+typ int categor 1
+typ int separ 1
+typ integer 2
+typ interact 1
+typ interfac 1
+typ interpr 1
+typ interpr etatif 1
+typ involut 4
+typ is ba 1
+typ is bound 1
+typ is standard 1
+typ judg 1
+typ just defer 1
+typ keep 1
+typ key 1
+typ l0j 1
+typ lambd 1
+typ lambd calculus 1
+typ lan 1
+typ lan environm 1
+typ langu 2
+typ le comput 1
+typ lead 1
+typ lecteur 1
+typ lecteur lecteur 1
+typ left justif 1
+typ link 1
+typ link st 1
+typ list 4
+typ list sont 1
+typ loc 1
+typ loc ar 1
+typ log 1
+typ log program 1
+typ log variabl 1
+typ m strong 1
+typ map 1
+typ mar 1
+typ matr 1
+typ membership 1
+typ ment 1
+typ mesur 1
+typ mesur es 1
+typ mn 1
+typ model 1
+typ most recent 1
+typ much larger 1
+typ multilevel 1
+typ multilevel graph 1
+typ n int 1
+typ n mc 1
+typ nam 2
+typ need bar 1
+typ next recent 1
+typ no matter 1
+typ nod 1
+typ non 2
+typ non lin 1
+typ non rig 1
+typ norm 1
+typ not commut 1
+typ o1 1
+typ object 2
+typ object model 1
+typ object orient 2
+typ occup 1
+typ occur 1
+typ of ambigu 1
+typ of appl 2
+typ of architectur 2
+typ of argum 1
+typ of artifact 1
+typ of atom 1
+typ of attribut 1
+typ of bisect 1
+typ of bus 1
+typ of cach 1
+typ of calcl 1
+typ of carv 1
+typ of chang 2
+typ of cod 2
+typ of collabor 1
+typ of collect 1
+typ of command 1
+typ of commun 1
+typ of compon 1
+typ of compreh 1
+typ of comput 1
+typ of configur 1
+typ of connect 1
+typ of constraint 1
+typ of cooper 1
+typ of cover 1
+typ of crossover 1
+typ of dat 3
+typ of datab 1
+typ of decomposit 1
+typ of decompr 1
+typ of dep 2
+typ of dev 1
+typ of developm 1
+typ of disk 1
+typ of docum 1
+typ of el 1
+typ of empl 1
+typ of encod 1
+typ of ent 1
+typ of evalu 1
+typ of event 1
+typ of failur 2
+typ of fault 2
+typ of fil 1
+typ of filter 1
+typ of fram 1
+typ of fun 1
+typ of geometer 1
+typ of goal 1
+typ of graph 2
+typ of in 1
+typ of incorrect 1
+typ of ind 1
+typ of infer 1
+typ of inform 1
+typ of input 2
+typ of interconnect 1
+typ of interleav 1
+typ of intersect 1
+typ of introspect 1
+typ of item 1
+typ of junct 1
+typ of kind 1
+typ of knowledg 1
+typ of l1 1
+typ of learn 1
+typ of link 1
+typ of mach 1
+typ of me 2
+typ of method 2
+typ of mov 1
+typ of natur 1
+typ of neg 1
+typ of neur 1
+typ of no 1
+typ of nod 1
+typ of non 2
+typ of nonexecut 1
+typ of object 3
+typ of om 1
+typ of p0 1
+typ of parallel 1
+typ of parenth 1
+typ of parm 1
+typ of pi 1
+typ of pj 1
+typ of pot 1
+typ of pr 1
+typ of prim 1
+typ of problem 3
+typ of proc 2
+typ of program 1
+typ of qu 1
+typ of quer 3
+typ of reason 1
+typ of reduc 2
+typ of refer 1
+typ of repr 2
+typ of retrief 1
+typ of rl 1
+typ of schedl 2
+typ of sen 1
+typ of serv 1
+typ of sign 1
+typ of situ 1
+typ of spac 1
+typ of spar 1
+typ of st 1
+typ of synchron 1
+typ of system 2
+typ of t1 1
+typ of task 1
+typ of technolog 2
+typ of tempor 1
+typ of termin 1
+typ of textur 1
+typ of transform 2
+typ of univer 1
+typ of user 1
+typ of veg 1
+typ of vid 1
+typ of wait 1
+typ of wavel 1
+typ of work 1
+typ of worker 1
+typ of workload 1
+typ ofserv 1
+typ oi 1
+typ oj 1
+typ onl dep 1
+typ onl tw 1
+typ oper 1
+typ oper fun 1
+typ optim 1
+typ or cl 1
+typ orthogon 1
+typ orthogon polynom 1
+typ oself 1
+typ oself output 1
+typ output 1
+typ output port 1
+typ pa 1
+typ pa de 1
+typ pair 1
+typ parallel 1
+typ parallel appl 1
+typ param 1
+typ param structur 1
+typ parameter 1
+typ parameter ar 1
+typ parameter def 1
+typ parameter remov 1
+typ part 1
+typ particl 1
+typ particl trait 1
+typ perc 1
+typ perform 1
+typ perform empir 1
+typ pj 1
+typ pj com 1
+typ pjj 1
+typ point 3
+typ point de 1
+typ point mut 1
+typ polymorphiqu 1
+typ pop 1
+typ pr 2
+typ pr calculus 1
+typ pr ec 1
+typ pram 1
+typ pram oper 1
+typ preserv 1
+typ preserv part 1
+typ principaux 1
+typ principaux de 1
+typ prior 1
+typ producteur 1
+typ producteur consommateur 1
+typ profon 1
+typ program 1
+typ prolog 1
+typ prolog ii 1
+typ proof 2
+typ proof procedur 2
+typ proper 1
+typ proport 1
+typ protect 1
+typ prov 1
+typ prov algorithm 1
+typ quer 1
+typ quest 1
+typ r esolut 1
+typ ran 1
+typ rectangl 1
+typ refin 1
+typ refin calculus 1
+typ reflec 1
+typ reflect 1
+typ regl 1
+typ regl bin 1
+typ rel 2
+typ rel guar 1
+typ repr 3
+typ repr inclus 1
+typ requir 1
+typ requir dlog2 1
+typ restrict 1
+typ result 2
+typ rigid 1
+typ rigid structur 1
+typ risc 1
+typ risc instruc 1
+typ run 1
+typ s01 1
+typ s1 1
+typ s1 s2 1
+typ s3 1
+typ saf 1
+typ saf manipl 1
+typ sasm 1
+typ sasm con 1
+typ scenar 1
+typ se 2
+typ se distingu 1
+typ select 2
+typ select adapt 1
+typ select retest 1
+typ self 1
+typ self output 1
+typ separ 3
+typ ser 1
+typ ser digit 1
+typ server 1
+typ sever tim 1
+typ shorter 1
+typ should convinc 1
+typ shown 1
+typ sid 1
+typ sid effect 1
+typ sign 1
+typ simd 1
+typ simd ou 1
+typ siml 1
+typ situ 1
+typ smaller 1
+typ sort 1
+typ sort integer 1
+typ specif 2
+typ specif memor 1
+typ start 1
+typ stat 1
+typ stat estim 1
+typ straightfor 1
+typ strict 1
+typ strict greater 1
+typ string 1
+typ structur 2
+typ stud 1
+typ such graph 1
+typ superficiel 1
+typ superficiel avec 1
+typ support 1
+typ system 5
+typ system integr 1
+typ system support 1
+typ t chang 1
+typ t1 2
+typ t1 t2 1
+typ task 2
+typ technolog 1
+typ term 1
+typ test 1
+typ th ca 2
+typ th claus 1
+typ th empt 1
+typ th head 1
+typ th me 1
+typ th system 1
+typ th tool 1
+typ theor 2
+typ theor found 1
+typ theor framework 1
+typ thr group 1
+typ thr letter 1
+typ tim 1
+typ tk 1
+typ to captur 1
+typ to de 1
+typ to filter 1
+typ to ind 1
+typ tok 1
+typ toler 1
+typ toler requir 1
+typ topolog 1
+typ trancact 1
+typ trancact proc 1
+typ u appear 1
+typ um 1
+typ uniform 2
+typ uniform crossover 1
+typ unit 1
+typ us 1
+typ using 2
+typ using siz 1
+typ valu 2
+typ var 2
+typ var bind 1
+typ variabl 2
+typ variabl bound 1
+typ void 1
+typ wa giv 1
+typ wa specif 1
+typ wam 1
+typ wam avec 1
+typ wam est 1
+typ wam ou 1
+typ wh cont 1
+typ whil preserv 1
+typ wil ten 1
+typ with bool 1
+typ work 1
+typ workst 1
+typ xp 1
+typ xp incorrectworld 1
+typ you find 1
+typ.h 1
+typ.h inclus 1
+typ.h inclus quest.h 1
+typecheck 1
+typecheck algorithm 1
+typecheck in addit 1
+typechecker 1
+typechecker ar avail 1
+typecorrect 1
+typedef 3
+typedef link 1
+typedef link list 1
+typedef r1 1
+typedef r1 s1 1
+typedef r1 s2 1
+typedef r2 1
+typedef r2 s1 1
+typedef r2 s2 1
+typedef r3 1
+typedef r3 system33 1
+typedef real vec 1
+typedef struc 1
+typedef struc spf 1
+typefac 1
+typerddrdsrddrd63615647310radoffsetvalu6356473139635647393152522315r 1
+typerddrdsrddrd63615647310radoffsetvalu6356473139635647393152522315r as00 1
+typeu 1
+typev 1
+typev budgetv 1
+typev from asst 1
+typev ssn 1
+typev ssn pn 1
+typezon 1
+typezon typerddrdsrddrd63615647310radoffsetvalu6356473139635647393152522315r 1
+typezon typerddrdsrddrd63615647310radoffsetvalu6356473139635647393152522315r as00 1
+typif 1
+typiqu 3
+typiqu appl 1
+typiqu appl aux 1
+typiqu constitu 1
+typiqu constitu es 1
+typiqu de 1
+typiqu de pr 1
+typiqu dun 1
+typiqu la 1
+typiqu la majorit 1
+typiqu le 2
+typiqu le born 1
+typiqu le pr 1
+typiqu r eduit 1
+typograph 1
+typograph repr 1
+typographiqu 1
+tyr 1
+tyr dal 1
+tyr dal ph 1
+tyr dalaph 1
+tyr dalaph gly 1
+tyr pr 1
+tyr pr ser 1
+u.1 1
+u.ac.jp 1
+u.c 1
+u.k 2
+u.n 1
+u.s 6
+u.s.a 5
+u.s.a cong 1
+u.s.a cong ont 1
+u.s.a yug 1
+u.s.a yug yugoslav12 1
+u.sa 1
+u.sa u.s.a 1
+u.sa u.s.a yug 1
+u0 6
+u0 ae 1
+u0 ae u1 1
+u0 aeu1 1
+u0 and oeu 1
+u0 and u1 1
+u0 and v0 1
+u0 ar distinct 1
+u0 bu1 1
+u0 bu1 hold 1
+u0 bu1 reduc 1
+u0 c 1u1 1
+u0 c 2u1 1
+u0 giv 1
+u0 is cl 1
+u0 is intern 1
+u0 oe1oe2 1
+u0 oe1oe2 t1t2 1
+u0 oe1oe2 t2t3 1
+u0 xyc1s1 1
+u0n 1
+u0v0g 1
+u0w0 1
+u0w0 and v0 1
+u0w0 encl 1
+u0w0 must encl 1
+u0w0 y edg 1
+u0w0g 1
+u1 13
+u1 1u1 1
+u1 and t2 1
+u1 and u0 1
+u1 and u1 1
+u1 ar cl 1
+u1 ar qu 1
+u1 denot 1
+u1 denot qu 1
+u1 denot symmeter 1
+u1 in u2 1
+u1 is cl 1
+u1 is equ 1
+u1 oe1oe2 1
+u1 oe1oe2 t1t2 1
+u1 r1 1
+u1 s2 1
+u1 s2 t2 1
+u1 s2 u2 1
+u1 u2 2
+u1 u2 t2 1
+u1 w1 1
+u1 w1 u2 1
+u1b 1
+u1g 1
+u1g belong 1
+u1g correspon 1
+u1g denot 1
+u1g of qu 1
+u1g of symmeter 1
+u1i 1
+u1i l2i 1
+u1i l2i ai 1
+u1i u2i 1
+u1j 1
+u1w1 1
+u1w1 and e1 1
+u2 8
+u2 by assum 1
+u2 follow 1
+u2 t2 1
+u2 u2 1
+u2 w2 1
+u2ad 1
+u2g 1
+u2i 1
+u2i is simil 1
+u2j 1
+u2ublog 1
+u2ublog tc 1
+u2ublog tc 1t 1
+u2w2 1
+u3 3
+u4 1
+u5 1
+ua 1
+ua vm 1
+ua vt 1
+uaik 1
+uaik ub 1
+ub 1
+ubiqu 3
+ubiqu b tr 1
+ubiqu yacc 1
+ublog 1
+ublog tc 1
+ublog tc 1g 1
+uc 4
+uc reposit 1
+uc sant 1
+uc sant cruz 1
+uc ut 1
+uc.edu 1
+uc.edu url 1
+uc12 1
+uc12 v2k 1
+ucb 4
+ucb csd 2
+ucb erl 2
+ucb erl m86 2
+uch 1
+uchenhoff 1
+uck 2
+uclock 1
+ucod 1
+ucoderasrd 1
+ucsb 1
+ucsc 2
+ucsc crl 2
+ucsd 1
+ucsd under academ 1
+ud 3
+ud ar defin 1
+ud ld 1
+ud mac 1
+ud manber 1
+ud shank 1
+ue 1
+ueber 1
+ueber den 1
+ueber den deutsch 1
+ued 2
+uenc 1
+uenc th execut 1
+uff 1
+uff kjaerulff 1
+uff kjaerulff aalborg 1
+uff kjaerulff steff 1
+ug 4
+ug graph 1
+ug graph architectur 1
+ug graph system 1
+ug if jfv 1
+ug system 1
+ug system interpr 1
+ugj 1
+ugj n0 1
+uhlenbein 1
+uhlenbein muehl 1
+uhlenbein muehl gmdz.uucp 1
+uhwirth 2
+ui 8
+ui a maxim 1
+ui and ht 1
+ui clear 1
+ui et le 1
+ui impl 1
+ui in gd 1
+ui in patht 1
+ui is closest 1
+ui n uj 1
+ui s n0m0 1
+ui uj 1
+ui vi 1
+ui vk 1
+ui whenever li 1
+ui1 1
+uick 1
+uick string 1
+uickb 1
+uickb rown 1
+uickb rown foxj 1
+uid 2
+uid appl 1
+uid appl model 1
+uid model 1
+uid s built 1
+uid team 1
+uij 2
+uij or wjk 1
+uij peut 1
+uij peut etr 1
+uij real valu 1
+uin 1
+uist 1
+uist94 1
+uiuc.edu 1
+uiuc.edu yaddr 1
+uiucdc 2
+uiv 1
+uiw 1
+uj 7
+uj et lj 1
+uj in nod 1
+uj kx 1
+uj vect 1
+uj1 2
+uj1 do j2 1
+uj2 2
+uj2 r2 1
+uj2 r3 1
+uk 19
+uk bk 1
+uk day 1
+uk day month 1
+uk ied 1
+uk ied safem 1
+uk keyboard 1
+uk mk7 1
+uk mk7 6aa 1
+uk pk 1
+uk92 1
+ukc 1
+ukk85 1
+ukkon 1
+ulat 1
+ulat exampl 1
+uler 1
+uler tour 1
+ulf 1
+ulf becker 1
+ulich 2
+ulich gmbh 2
+ulich gmbh zentralinstitut 1
+ulich with spar 1
+uller 1
+uller st 1
+ullman 14
+ullman and van 1
+ulrik 1
+ulrik schroeder1 1
+ulrik schroeder1 st 1
+ulrik.html 1
+ult 2
+ult erieur 2
+ult erieur en 1
+ult erieur la 1
+ult erieur par 1
+ult erieur sur 1
+ultim 11
+ultim aim 1
+ultim be incorpor 1
+ultim en 1
+ultim goal 2
+ultim identif 1
+ultim lim 1
+ultim plac 1
+ultim plac test 1
+ultim problem 1
+ultim sem 1
+ultim sem inform 1
+ultim with ensur 1
+ultr 4
+ultr and hp 1
+ultr nl 1
+ultr nl extract 1
+ultr nl prov 1
+ultr os 1
+ultr os kernel 1
+ultr softwar 1
+ultr softwar developm 1
+ultracomputer 1
+ultracomputer approach 1
+ultraenterpr 1
+ultrasparc 2
+ultrasparc proc5 1
+um 6
+um architectur 1
+um architectur facilit 1
+um lacun 1
+um lacun quant 1
+um num 1
+um num cc 1
+um pretendid 1
+um pretendid me 1
+um proj 1
+um proj de 1
+um1 1
+um1 vm2 1
+um1c2 1
+um1c2 vm2c1 1
+umakishor 1
+umakishor ramachandran 1
+ument 1
+ument modif 1
+ument modif ee 1
+umer 1
+umeyam 1
+umg 1
+umg th se 1
+umiac 7
+umiac tr 7
+umiac.umd.edu 1
+ump 1
+ump over theb 1
+ump over thel 1
+un 39
+un ab 1
+un ab de 1
+un abstract 1
+un abstract de 1
+un acc 1
+un acc el 1
+un adapt 2
+un adapt au 1
+un adapt de 1
+un adapt tr 1
+un adr 1
+un adr de 1
+un affect 1
+un affect destruc 1
+un affinit 1
+un ag 1
+un an 4
+un an de 4
+un an fin 1
+un an glob 1
+un an statiqu 1
+un analog 1
+un analog avec 1
+un appl 3
+un appl aff 1
+un appl compl 1
+un appl dan 1
+un appl direct 2
+un appl don 2
+un appl inject 1
+un appl peut 1
+un approch 3
+un approch ba 1
+un approch dexplor 1
+un approch ensembl 1
+un approch qu 1
+un approxim 2
+un approxim de 1
+un architectur 3
+un architectur de 1
+un architectur don 1
+un architectur physiqu 1
+un architectur standard 1
+un asser 1
+un asser de 1
+un asser sur 1
+un attent 1
+un attent particl 1
+un augm 1
+un augm incontr 1
+un aut 2
+un autr 4
+un autr approch 2
+un autr born 1
+un autr chel 1
+un autr cl 1
+un autr claus 1
+un autr comp 1
+un autr con 1
+un autr diff 1
+un autr etud 1
+un autr fonct 1
+un autr impl 1
+un autr man 2
+un autr opt 1
+un autr possibilit 1
+un autr prim 1
+un autr quand 1
+un autr solut 1
+un autr techniqu 1
+un autr var 1
+un aventur 1
+un aventur formid 1
+un ba 2
+un ba de 2
+un ba du 1
+un ba en 1
+un ba sol 1
+un ba zn 1
+un bar 1
+un bibliograph 1
+un bibliograph relativ 1
+un biblioth 1
+un biblioth qu 1
+un biject 1
+un biject de 1
+un bon 3
+un bon approxim 1
+un bon con 1
+un bon efficacit 1
+un bon int 1
+un bon par 1
+un bon part 1
+un bon popl 1
+un bon propr 1
+un born 2
+un born de 1
+un born du 1
+un born inf 1
+un born sup 1
+un boucl 3
+un boucl extern 1
+un boucl non 1
+un boucl par 1
+un boucl vid 1
+un boul 1
+un boul de 1
+un boul hypercubiqu 1
+un cel 1
+un cel de 1
+un cel don 1
+un cel entr 1
+un cel etiqu 1
+un cel point 1
+un cel pren 1
+un cel suppl 1
+un cel sur 1
+un cel uniqu 1
+un cel var 1
+un centain 1
+un centain de 1
+un certain 3
+un certain born 1
+un certain fonct 1
+un certain localit 1
+un ch 2
+un ch in 1
+un ch ne 1
+un cl 2
+un cl de 1
+un cl dobj 1
+un classif 3
+un classif de 2
+un classif diff 1
+un claus 1
+un claus auxiliair 1
+un claus binair 1
+un claus de 1
+un claus du 1
+un claus est 1
+un claus interm 1
+un claus termin 1
+un claus uniqu 1
+un coh 1
+un coh er 1
+un collabor 1
+un collabor avec 1
+un collect 1
+un collect fort 1
+un colon 1
+un colon contenu 1
+un colon qu 1
+un color 1
+un color cod 1
+un combinaison 1
+un combinaison de 1
+un combinaison du 1
+un commun 1
+un commun par 1
+un comp 2
+un comp du 1
+un comp ee 1
+un comp etit 1
+un comparaison 3
+un comparaison de 1
+un comparaison du 1
+un comparaison entr 1
+un compil 1
+un compil en 1
+un compil ind 1
+un compl 1
+un compl est 1
+un complexit 1
+un compr 1
+un compr ehen 1
+un con 2
+un con distribu 1
+un con equ 2
+un conclus 1
+un conclus evoqu 1
+un condit 3
+un condit qu 1
+un condit suff 2
+un configur 1
+un configur al 1
+un configur direct 1
+un configur optim 1
+un confus 1
+un confus entr 1
+un congru 1
+un congru modl 1
+un conjonct 1
+un conjonct dexpr 1
+un consom 1
+un const 3
+un const ou 1
+un const posit 1
+un construc 1
+un construc conditionnel 1
+un construc explicit 1
+un contraint 2
+un contraint de 1
+un contraint similair 1
+un contribut 1
+un contribut nl 1
+un coop 1
+un coop erat 1
+un cop 2
+un cop de 2
+un cop du 1
+un cop dun 1
+un cop inv 1
+un cop loc 1
+un coupur 1
+un coupur avec 1
+un coupur est 1
+un coupur glob 1
+un coupur loc 1
+un coupur profon 1
+un coupur ren 1
+un coupur superficiel 1
+un coupur supprim 1
+un courb 1
+un cr 1
+un cr de 1
+un cr eat 1
+un d ecentr 1
+un d ecl 1
+un d ecomposit 1
+un d efail 1
+un d efinit 1
+un d egrad 1
+un d eliaison 1
+un d emonstr 1
+un d epen 1
+un d eriv 1
+un d riv 1
+un dat 1
+un dat dic 1
+un de 3
+un de autr 2
+un de claus 1
+un de con 1
+un de difficult 1
+un de don 1
+un de leur 1
+un de tr 1
+un de variabl 1
+un dern 1
+un descript 2
+un descript assez 1
+un descript pr 1
+un deux 1
+un deux em 1
+un diff 1
+un diff er 1
+un difficult 2
+un dilat 1
+un dilat correspon 1
+un dilat de 1
+un dilat maxim 1
+un dilat raison 1
+un dim 1
+un direct 1
+un direct de 1
+un direct don 1
+un direct privil 1
+un disjonct 1
+un disjonct de 1
+un disjonct ou 1
+un disjonct qu 1
+un dist 2
+un dist entr 1
+un dist fic 1
+un dist statistiqu 1
+un distribut 1
+un distribut cycliqu 1
+un distribut de 1
+un distribut init 1
+un distribut par 1
+un don 1
+un don ee 1
+un dur 2
+un dur ee 2
+un econom 1
+un econom drastiqu 1
+un ecritur 2
+un ecritur privil 1
+un ecritur tout 1
+un elim 1
+un elim de 1
+un elim du 1
+un elim entrelac 1
+un elim exact 1
+un en 1
+un en em 1
+un epoqu 1
+un erreur 1
+un erreur dinstanc 1
+un erreur doit 1
+un est 1
+un est ecrit 1
+un estampil 1
+un estampil commun 1
+un estampil sup 1
+un estampil val 1
+un estim 2
+un estim du 1
+un estim pr 1
+un et deux 1
+un etap 2
+un etap de 2
+un etap direct 1
+un etap dunif 1
+un etiqu 1
+un etiqu interm 1
+un etiqu primair 1
+un etiqu symboliqu 1
+un etud 3
+un etud approfon 1
+un etud arithm 1
+un etud compar 1
+un etud du 1
+un etud effectu 1
+un etud empiriqu 1
+un evalu 1
+un evalu de 1
+un eventuel 1
+un eventuel transform 1
+un evolut 1
+un evolut du 1
+un ex 3
+un ex ecut 3
+un except 1
+un except au 1
+un explor 2
+un explor al 1
+un explor en 1
+un expr 3
+un expr arithm 1
+un expr de 1
+un expr du 1
+un expr synth 1
+un ext 2
+un ext de 1
+un ext du 2
+un ext modest 1
+un ext naturel 1
+un extr 1
+un extr em 1
+un fa 1
+un fa var 1
+un fact 1
+un fact de 1
+un famil 2
+un famil assez 1
+un famil de 1
+un famil libr 1
+un feuil 1
+un figur 1
+un fil 1
+un fil hierarch 1
+un fil nam 1
+un fo 3
+un fo au 1
+un fo dan 1
+un fo effectu 1
+un fo enclench 1
+un fo lact 1
+un fo lappel 1
+un fo le 1
+un fo lin 1
+un fo par 1
+un fo qu 1
+un fo sauvegard 1
+un fo scind 1
+un fo ver 1
+un fonct 4
+un fonct aff 1
+un fonct al 1
+un fonct bool 1
+un fonct co 1
+un fonct dappart 1
+un fonct de 2
+un fonct ent 1
+un fonct lin 1
+un fonct plafon 1
+un fonct scalair 1
+un fonct sur 1
+un fonct vectoriel 1
+un form 2
+un form de 1
+un form doptim 1
+un form lim 1
+un form norm 1
+un form tout 1
+un fort 2
+un fort probabilit 1
+un fort synchron 1
+un fr 2
+un fr equ 2
+un futur 1
+un futur modif 1
+un g en 2
+un gard 1
+un gard sont 1
+un gentil 1
+un gentil qu 1
+un gest 2
+un gest centr 1
+un gest correct 1
+un gest dynamiqu 1
+un gest statiqu 1
+un glob 1
+un glob syst 1
+un grand 3
+un grand longueur 1
+un grand part 3
+un gril 1
+un gril discr 1
+un host 1
+un host kernel 1
+un icon 1
+un icon cod 1
+un id ee 3
+un identif 1
+un imag 3
+un imag de 1
+un imag du 1
+un imag par 1
+un imperfect 1
+un impl 4
+un impl de 1
+un impl em 2
+un impl en 1
+un import 1
+un import capit 1
+un import plac 1
+un in egalit 1
+un incarn 1
+un incarn compil 1
+un ind 2
+un ind etermin 1
+un ind sur 1
+un indirect 1
+un indirect qu 1
+un indirect suppl 1
+un inform 3
+un inform dincertitud 1
+un inform dispon 1
+un inform sur 1
+un inst 1
+un inst de 1
+un inst du 1
+un instruc 2
+un instruc alloc 1
+un instruc cal 1
+un instruc cut 1
+un instruc dappel 1
+un instruc de 1
+un instruc deep 1
+un instruc fail 1
+un instruc neck 1
+un instruc retr 1
+un instruc soft 1
+un instruc trust 1
+un instruc try 1
+un instruc unif 1
+un instruc uniqu 1
+un interfac 2
+un interfac fortran 1
+un intern 1
+un intern fil 1
+un interpol 1
+un interpol par 1
+un interpr 2
+un interpr etat 2
+un it erat 1
+un justif 1
+un justif de 1
+un larg cl 1
+un larg comp 1
+un larg famil 1
+un lectur 1
+un lectur paresseus 1
+un liaison 1
+un liaison conditionnel 1
+un liaison est 1
+un lib 1
+un lib erat 1
+un lign 1
+un lign de 1
+un lik oper 2
+un lim 2
+un lim de 1
+un lim du 1
+un lim en 1
+un lim moindr 1
+un lim non 1
+un list 3
+un list circulair 1
+un list de 3
+un list denviron 1
+un list dunif 1
+un list vid 1
+un loc 1
+un loc de 1
+un localit 1
+un m em 3
+un m emoir 2
+un m ethod 3
+un m thod 2
+un m triqu 1
+un mach 3
+un mach abstrait 1
+un mach cibl 1
+un mach interm 1
+un mach multiprocesseur 1
+un mach par 1
+un mach prolog 1
+un mach simd 1
+un man 1
+un matr 3
+un matr chap 1
+un matr de 3
+un matr diagon 2
+un matr non 1
+un matr posit 1
+un matr prim 1
+un matr solut 1
+un matr stochastiqu 1
+un matr sym 1
+un matr triangulair 1
+un mauv 1
+un mauv attribut 1
+un meilleur 1
+un meilleur localit 1
+un mesur 3
+un mesur de 2
+un mesur invar 1
+un mi 2
+un mi au 1
+un mi en 1
+un migr 1
+un migr par 1
+un migr pour 1
+un migr ver 1
+un minim 1
+un minim unidimensionel 1
+un mod 3
+un mod el 2
+un mod li 1
+un modif 1
+un modif de 1
+un modif du 1
+un multitud 1
+un multitud dimpl 1
+un mut 1
+un mut de 1
+un mut est 1
+un mvp 1
+un mvp peuv 1
+un mvp pour 1
+un non 1
+un non op 1
+un not 3
+un not de 1
+un not entr 1
+un not simpl 1
+un nouvel 5
+un nouvel approch 2
+un nouvel aut 1
+un nouvel ba 2
+un nouvel cel 1
+un nouvel cop 1
+un nouvel coupur 1
+un nouvel faibl 1
+un nouvel famil 1
+un nouvel indirect 1
+un nouvel instruc 1
+un nouvel mi 1
+un nouvel op 1
+un nouvel prim 1
+un nouvel structur 1
+un nouvel transform 1
+un nouvel unif 1
+un nouvel var 1
+un on 1
+un op 4
+un op erat 4
+un oper 1
+un oper system 1
+un opt 1
+un opt de 1
+un optiqu 1
+un optiqu orient 1
+un ou 2
+un ou deux 1
+un ou plusieur 2
+un pag 1
+un pag alor 1
+un pag au 1
+un pag conflictuel 1
+un pag cont 1
+un pag dan 1
+un pag don 1
+un pag en 1
+un pag est 1
+un pag fr 1
+un pag migr 1
+un pag ne 1
+un pag par 1
+un pag pi 1
+un pag propr 1
+un pag sont 1
+un pag suscept 1
+un pair 1
+un par 2
+un par el 1
+un par mod 1
+un par nid 1
+un part 2
+un part de 2
+un part du 1
+un part effectu 1
+un part int 1
+un part perm 1
+un part sel 1
+un partit 2
+un partit de 1
+un partit en 1
+un partit qu 1
+un pe 1
+un pe difficult 1
+un pent 1
+un per 2
+un per de 2
+un petit 1
+un petit nombr 1
+un ph 3
+un ph conflictuel 1
+un ph dacc 1
+un ph de 1
+un pil 1
+un pil de 1
+un pil doubl 1
+un pil logiqu 1
+un pil pour 1
+un pl 1
+un pl form 1
+un plac 1
+un plac de 1
+un platform 1
+un plus grand 1
+un po acc 1
+un pol 1
+un pol dassur 1
+un politiqu 1
+un politiqu vi 1
+un pon 1
+un pon rat 1
+un popl 1
+un popl constitu 1
+un popl de 1
+un popl dindividus 1
+un port 1
+un port de 1
+un port ee 1
+un possibilit 2
+un pour 2
+un pour lattribut 1
+un pour le 1
+un pour mettr 1
+un pr 4
+un pr ci 1
+un pr ec 1
+un pr en 1
+un pr eoccup 1
+un pr es 1
+un prem 4
+un preuv 2
+un preuv qu 1
+un prim 3
+un prim de 1
+un prim fork 1
+un prim join 1
+un probabilit 3
+un proc 1
+un proc edur 1
+un proc virtu 1
+un profondeur 2
+un profondeur de 1
+un profondeur maxim 1
+un program 2
+un program environm 1
+un program par 1
+un project 1
+un project convec 1
+un proposit 2
+un proposit de 1
+un proposit dhybrid 1
+un propr 1
+un pu 1
+un pu de 1
+un quest 1
+un quest de 1
+un quest est 1
+un quest ouver 1
+un queu 1
+un queu de 1
+un r ecup 1
+un r ecur 1
+un r educ 2
+un r ef 2
+un r egularit 1
+un r eorgan 1
+un r epartit 1
+un r epliqu 1
+un r epon 2
+un r esolut 2
+un r eutil 2
+un re. 1
+un recherch 3
+un recherch de 1
+un recherch en 1
+un recherch stochastiqu 1
+un rem 1
+un repr 3
+un repr es 2
+un repr sent 2
+un requ 1
+un requ es 1
+un restaur 1
+un restaur compl 1
+un restructur 1
+un restructur de 1
+un rou 1
+un rou de 1
+un s elect 1
+un s equ 4
+un s er 2
+un secon 2
+un secon cel 1
+un secon etap 1
+un secon pa 1
+un secon part 1
+un secon qu 1
+un secon ver 1
+un sect 1
+un sect de 1
+un sel 3
+un sel adr 1
+un sel condit 1
+un sel elim 1
+un sel fo 1
+un sel migr 2
+un sel pag 1
+un sel profondeur 1
+un sel pseudosolut 1
+un sel sect 1
+un self 1
+un self dual 1
+un serrur 1
+un serv 1
+un si 1
+un si lon 1
+un siml 2
+un siml ayant 1
+un siml classiqu 1
+un siml guid 1
+un siml hybr 1
+un siml na 1
+un simpl 3
+un simpl comparaison 1
+un simpl cop 1
+un simpl fonct 1
+un simpl incr 1
+un simpl int 1
+un simpl marqueur 1
+un simpl optim 1
+un simpl siml 1
+un simpl substitut 1
+un simpl transform 1
+un situ 1
+un situ de 1
+un situ similair 1
+un siz 1
+un siz cod 1
+un solut 7
+un solut analytiqu 1
+un solut au 2
+un solut ba 1
+un solut combin 1
+un solut dan 1
+un solut de 1
+un solut destampil 1
+un solut en 1
+un solut ent 2
+un solut est 1
+un solut mat 1
+un solut minim 1
+un solut moin 1
+un solut optim 1
+un solut origin 1
+un solut partiel 1
+un solut potentiel 1
+un solut qu 1
+un solut s 1
+un solut simpl 1
+un som 1
+un sourc 1
+un sourc dam 1
+un sourc de 1
+un sous 1
+un sous popl 1
+un sp 1
+un sp ec 1
+un sp ecif 1
+un stabilit 1
+un standard 1
+un strat 3
+un strat eg 3
+un structur 3
+un structur de 1
+un structur dordinateur 1
+un structur du 1
+un structur est 1
+un structur mimd 1
+un structur orient 1
+un structur tr 1
+un substitut 1
+un substitut est 1
+un suit 2
+un suit de 2
+un suit x1 1
+un synchron 1
+un synchron entr 1
+un synchron est 1
+un synth 1
+un synth es 1
+un system 1
+un t ach 1
+un t es 1
+un t etr 1
+un tabl 2
+un tabl avec 1
+un tabl dadr 1
+un tabl le 1
+un tail 2
+un tail de 2
+un techniqu 3
+un techniqu bien 1
+un techniqu de 3
+un techniqu destampil 1
+un techniqu moin 1
+un techniqu na 1
+un techniqu qualit 1
+un techniqu quantit 1
+un techniqu similair 1
+un techniqu simpl 2
+un technolog 1
+un technolog de 1
+un technolog issu 1
+un tel 4
+un tel asser 1
+un tel boucl 1
+un tel combinaison 1
+un tel configur 1
+un tel elim 1
+un tel famil 1
+un tel impl 1
+un tel instruc 1
+un tel pag 1
+un tel reproduc 1
+un tel techniqu 1
+un tel transform 1
+un tent 1
+un tent dan 1
+un th 4
+un th eor 3
+un th or 1
+un th theor 1
+un to alloc 1
+un to find 1
+un to gener 1
+un to mak 1
+un to mim 1
+un to produc 1
+un to prov 1
+un to rec 1
+un to recover 1
+un to sen 1
+un to us 1
+un tr 2
+un tr es 2
+un trajectoir 1
+un transform 2
+un transform de 2
+un transform du 2
+un transform en 1
+un transform equiv 1
+un transform moin 1
+un transform non 1
+un transform po 1
+un transform ren 1
+un transform tout 1
+un transform ult 1
+un transit 1
+un transit tj 1
+un transposit 1
+un transposit de 1
+un tud 1
+un tud th 1
+un unif 1
+un unit 1
+un util 2
+un util judicieus 1
+un util parcimonieus 1
+un v erit 1
+un valeur 4
+un valeur bool 1
+un valeur de 2
+un valeur don 1
+un valeur du 1
+un valeur optim 2
+un var 4
+un var al 1
+un var dan 1
+un var de 2
+un var en 1
+un var est 1
+un var gel 1
+un var int 1
+un var interm 1
+un var li 1
+un var libr 1
+un var ordinair 1
+un var partag 1
+un var perman 1
+un var qu 1
+un var repr 1
+un var standard 1
+un var temporair 1
+un ver 3
+un ver hybr 1
+un ver par 2
+un ver param 1
+un ver sp 1
+un ver util 1
+un vi 2
+un vi de 1
+un vieil 1
+un vieil proposit 1
+un view 1
+un vit 1
+un vit fin 1
+un volut 1
+un volut prochain 1
+un zon 1
+un zon tr 1
+un1 1
+un1 workst 1
+unacc 1
+unacc equiv 1
+unaccept 10
+unaccept configur 1
+unaccept for eff 1
+unaccept parser 1
+unaccept parser technolog 1
+unaccept perform 1
+unaccept situ 1
+unaccept to assum 1
+unaffect 3
+unaffect by crossover 1
+unaid 1
+unair 1
+unalter 1
+unambigu 3
+unambigu a resourc 1
+unambigu defin 1
+unambigu del 1
+unanswer 2
+unanswer quest 2
+unar 4
+unar dat 1
+unar dat manipl 1
+unar edb 1
+unar edb datab 1
+unar funct 1
+unar idb 1
+unar idb rel 1
+unar pr 2
+unattach 1
+unattach method 1
+unav 5
+unav catastroph 1
+unav catastroph unlearn 1
+unav lim 1
+unavail 4
+unavail du 1
+unavail for further 1
+unavail is restrict 1
+unavail per addr 1
+unavail st 1
+unawar 2
+unb 5
+unb coar 1
+unb coar graph 1
+unb dat 1
+unb.ca 1
+unblockproc 1
+unbound 10
+unbound futur 1
+unbound loc 1
+unbound loc memor 1
+unbound memor 1
+unbound number 2
+unbound oper 1
+unbound or bound 1
+unbound reg 1
+unbound sup 1
+unbound var 2
+unbound variabl 1
+uncertain 2
+uncertain reason 2
+uncertain spat 1
+uncertain spat relationship 1
+uncertaint 10
+uncertaint and val 1
+uncertaint assoc 2
+uncertaint com 1
+uncertaint form 1
+uncertaint form appear 1
+uncertaint in artif 3
+uncertaint in artioc 1
+uncertaint in recognit 1
+uncertaint induc 1
+uncertaint manipl 1
+uncertaint of dec 1
+uncertaint reflect 1
+uncertaint stil ec 1
+unch 4
+unch wien 1
+unchang 16
+unchang c cod 1
+unchang in mlr 1
+unchang or irrelev 1
+uncheck 2
+unclear 3
+uncluster 1
+uncluster ind 1
+uncluster ind tok 1
+uncoar 2
+uncoar and refin 1
+uncoar graph 1
+uncoar graph inherit 1
+uncoar ph 1
+uncoar step 1
+uncoar th graph 1
+uncoar th sav 1
+uncoar to obtain 1
+uncoar whil refin 1
+uncolor 2
+uncolor branch 1
+uncolor branch decr 1
+uncolor bundl 1
+uncom 1
+uncom output 1
+uncommon 4
+uncommon compar 1
+uncommon layout 1
+uncommon lisp 1
+uncommon problem 1
+uncommon to se 1
+uncompl 1
+uncomplem 1
+uncomplem liter 1
+uncompr 2
+uncompr form 1
+uncon. 1
+unconnect 1
+unconstrain 3
+unconstrain optim 1
+uncontract 1
+uncontract edg 1
+uncontrol 1
+uncontrol way 1
+uncooper 1
+uncorrel 2
+uncorrupt 2
+uncorrupt me 2
+uncover 3
+uncover a number 1
+uncover import structur 1
+uncover sever aspect 1
+und 11
+und a for 1
+und a op 1
+und a record 1
+und act 1
+und ai 1
+und and red 1
+und by level 1
+und by scan 1
+und compl 1
+und compl subtransact 1
+und datenverarbeitung 2
+und dynamik 1
+und dynamik der 1
+und field 1
+und for l0 1
+und it effect 1
+und length 1
+und level 1
+und level scan 1
+und log 1
+und model 1
+und oper 1
+und pa 1
+und past act 1
+und ph 1
+und pointer 1
+und pr 1
+und pr condit 1
+und prev 1
+und prev prob 1
+und problem 1
+und problem der 1
+und progr 1
+und raumfahrtkonstrukt 1
+und raumfahrtkonstrukt der 1
+und recov 1
+und recov attempt 1
+und recov level 1
+und recov oper 1
+und recov progr 1
+und red 1
+und requir 1
+und requir execut 1
+und scan 1
+und schlussfolgerungsverfahr 1
+und systemtechnik 1
+und technik 1
+und their effect 1
+und their for 1
+undamag 1
+undamag part 1
+undec 4
+undec not 1
+undecim 1
+undecim discr 1
+undecim discr wavel 1
+undecim dwt 1
+undecim dwt coeff 1
+undecim dwt threshold 1
+undef 1
+undefin 8
+undefin ar 1
+undefin in gener 1
+undefin transit 1
+undefin whenever ai 1
+undeliver 1
+undeliver me 1
+under. 1
+underconstrain 1
+underconstrain problem 1
+underestim 1
+underflow 1
+underflow overflow 1
+underg 6
+underg a chang 1
+underg a test 1
+underg a transit 1
+underg continu 1
+underg continu improv 1
+underg further 1
+underg further rel 1
+undergradu 2
+undergradu and gradu 1
+undergradu stud 1
+underl 46
+underl appl 1
+underl architectur 4
+underl architectur problem 1
+underl assm 1
+underl assum 3
+underl caus 1
+underl character 1
+underl character stand 1
+underl commun 3
+underl commun mechan 1
+underl commun subsystem 2
+underl compl 1
+underl compl bin 1
+underl comput 2
+underl comput platform 1
+underl concur 1
+underl concur lp 1
+underl context 1
+underl context model 1
+underl correl 1
+underl dat 2
+underl dat structur 1
+underl datab 1
+underl datab eng 1
+underl distribut 1
+underl edg 1
+underl edg point 1
+underl fact 1
+underl fl 1
+underl framework 2
+underl funct 2
+underl funct dist 1
+underl graph 1
+underl interconnect 2
+underl isvl 1
+underl it design 1
+underl learn 1
+underl learn rl 1
+underl log 2
+underl log sem 1
+underl model 2
+underl model design 1
+underl molecl 1
+underl molecl structur 1
+underl mult 1
+underl mult dim 1
+underl multitoler 1
+underl multitoler tok 1
+underl nam 1
+underl network 1
+underl oper 1
+underl oper model 1
+underl p determin 2
+underl parallel 1
+underl parallel algorithm 1
+underl partit 1
+underl pram 1
+underl pram algorithm 1
+underl principl 2
+underl proc 1
+underl program 2
+underl program langu 1
+underl program model 1
+underl prompt 1
+underl prompt strateg 1
+underl rel 1
+underl resolut 1
+underl resolut typ 1
+underl se 1
+underl se f1 1
+underl shar 1
+underl shar datab 1
+underl spat 1
+underl spat acc 1
+underl strateg 1
+underl structur 1
+underl system 3
+underl system cl 1
+underl th gener 1
+underl th langu 1
+underl th learn 1
+underl th percept 1
+underl th tur 1
+underl theor 1
+underl tok 1
+underl tok ring 1
+underl traff 2
+underl traff pattern 2
+underl valu 1
+underlin 2
+underlin expr 1
+underlin expr com 1
+underperform 1
+underperform signif 1
+underpin 2
+underscor 1
+undershoot 2
+undershoot and overshoot 2
+undershoot follow 1
+underst 1
+underst th an 1
+understand 45
+understand a docum 1
+understand a non 1
+understand a singl 1
+understand a solut 1
+understand about con 1
+understand algorithm 1
+understand algorithm con 1
+understand and av 1
+understand and comparison 1
+understand and control 1
+understand and evalu 1
+understand and maintain 1
+understand appl 1
+understand appl order 1
+understand atom 1
+understand atom memor 1
+understand began 1
+understand both why 1
+understand cod 1
+understand creat 1
+understand depict 1
+understand difficult 1
+understand ea 1
+understand for maintainer 1
+understand if design 1
+understand inherit 1
+understand involut 1
+understand involut build 1
+understand is difficult 1
+understand is requir 1
+understand law 1
+understand may break 1
+understand mechan 1
+understand mus 1
+understand non 1
+understand non atom 1
+understand of biolog 2
+understand of concur 1
+understand of educ 1
+understand of hil 1
+understand of mlr 1
+understand of pat 1
+understand of program 1
+understand of wh 1
+understand of yacc 1
+understand ok 1
+understand or sourc 1
+understand our pr 1
+understand our specif 1
+understand point 1
+understand problem 2
+understand proc 1
+understand proc outlin 1
+understand prov 1
+understand rl 1
+understand sequ 1
+understand smal segm 1
+understand specif 2
+understand specif piec 1
+understand system 2
+understand system using 1
+understand task 1
+understand text 1
+understand th ba 1
+understand th benefit 1
+understand th cod 1
+understand th complec 1
+understand th effect 1
+understand th interact 1
+understand th mean 1
+understand th problem 1
+understand th progr 1
+understand th rel 2
+understand th rest 1
+understand th result 1
+understand th sem 1
+understand th st 1
+understand th top 1
+understand th underl 1
+understand than compound 1
+understand than docum 1
+understand than form 1
+understand their collect 1
+understand their funct 1
+understand their perform 1
+understand typ 1
+understand what funct 1
+understand why 2
+understand with problem 1
+understand your partner 1
+understander 1
+understander attempt 1
+understander to ask 1
+understood 20
+understood and ea 1
+understood and promulg 1
+understood and prov 1
+understood and support 1
+understood as chang 1
+understood as compl 1
+understood as follow 1
+understood as transform 1
+understood by theorem 1
+understood higherorder 1
+understood higherorder model 1
+understood in order 1
+understood sem 1
+understood th mechan 1
+understood that stat 1
+understood without read 1
+undertak 9
+undertak a mult 1
+undertak by sum 1
+undertak by transcript 1
+undertak inclus 1
+undertak inclus vid 1
+undertak to remov 1
+undertak when solut 1
+undertook 1
+underw 3
+underw to streaml 1
+undesir 7
+undesir artifact 1
+undesir artifact assoc 1
+undesir dep 1
+undesir effect 2
+undesir gap 1
+undesir imag 1
+undesir imag dep 1
+undesir pattern 1
+undesir result 1
+undesir to keep 1
+undetect 2
+undetect fault 1
+undetect fault assign 1
+undetect fault occur 1
+undetect fault stop 1
+undetect manner 1
+undetect st 1
+undetect st corrupt 1
+undetermin 2
+undetermin thread 1
+undetermin thread becom 1
+undiffer 1
+undiffer reg 1
+undiffer univer 1
+undiffer univer reg 1
+undirect 13
+undirect ca 1
+undirect ca perform 1
+undirect cover 1
+undirect cover graph 1
+undirect edg 1
+undirect edg caus 1
+undirect graph 9
+undirect graph g0 1
+undirect graph gf 1
+undirect graph start 1
+undirect lin 1
+undirect lin graph 1
+undirect path 1
+undirect problem 1
+undisturb 1
+undon 5
+undon by comp 1
+undon by execut 1
+undon in subsequ 1
+undon on backtrack 1
+undoubt 1
+undoubt valu 1
+uneleg 1
+unen 1
+unequ 3
+unequ complec 1
+unequ comput 1
+unequ comput abil 1
+unequ partit 1
+unequ power 1
+unequ rad 1
+unequ spac 1
+unequ spac repr 1
+unequ spac tempor 1
+unequivoc 1
+unequivoc rout 1
+uner 1
+unev 1
+unexpect 5
+unexpect on 1
+unexpect sequ 1
+unexpect structur 1
+unexpect synerg 1
+unexpect tempor 1
+unexpect tempor speed 1
+unexpect want 1
+unexplor 2
+unexplor act 1
+unexplor ar 1
+unexplor edg 1
+unexplor ver 1
+unf 1
+unfair 1
+unfair in serv 1
+unfair is bound 1
+unfair is unav 1
+unfair schedl 1
+unfair schedl algorithm 1
+unfamil 2
+unfavour 1
+unfavour affect 1
+unfold 5
+unfold a cal 1
+unfold funct 1
+unfold funct definit 1
+unfold in part 1
+unfold in tim 1
+unfold is develop 1
+unfold nondetermin 1
+unfold nondetermin program 1
+unfold of determin 1
+unfold of funct 1
+unfold of program 1
+unfold of pur 1
+unfold of recur 1
+unfold preserv 1
+unfold program 1
+unfold term 1
+unfold termin 1
+unfold th project 1
+unfold th st 2
+unfold to program 1
+unfold transform 1
+unfold ver 1
+unfold wh 1
+unfold wh simplif 1
+unfold whil gener 1
+unfold wil typ 1
+unfold with determin 1
+unfortun 25
+unfortun mi 1
+unfortun mi alignm 1
+unfortun problem 1
+unfortun sequ 1
+unfortun th benefit 1
+unfortun th merg 1
+unfortun th produc 1
+unfruit 1
+unfruit andgrammar 1
+unfruit andgrammar deriv 1
+ungar 4
+ungar caut 1
+ungar rec 1
+ungar rec sum 1
+unhinder 1
+unicast 2
+unicast and multicast 1
+unicast ba 1
+unicast ba multicast 1
+unicast ba schem 1
+unicast ba softwar 1
+unicast me 1
+unicast me lat 1
+unicast me pa 1
+unicast problem 1
+unicast problem muc 1
+unicast siml 1
+unicast traff 1
+unicast worm 1
+unicit 1
+unidim 2
+unidim and gener 1
+unidim gaus 1
+unidim gaus kernel 1
+unidimensionel 1
+unidimensionel peut 1
+unidimensionel peut aus 1
+unidimensionnel 1
+unidimensionnel r1 1
+unidirect 5
+unidirect and bidirect 1
+unidirect constraint 1
+unidirect flow 1
+unidirect link 2
+unidirect min 1
+unidirect mult 1
+unidirect mult interconnect 1
+unidirect mult network 1
+unidirect natur 1
+unidirect proper 1
+unidirect proper comprom 1
+unidirect switch 1
+unif 25
+unif affect 1
+unif affect la 1
+unif affecteront 1
+unif affecteront aus 1
+unif after renam 1
+unif algorithm 4
+unif and backtrack 1
+unif and const 1
+unif and reduc 2
+unif and switch 1
+unif appel 1
+unif approach 2
+unif ar specif 1
+unif avec 1
+unif avec part 1
+unif ayant 1
+unif ayant pr 1
+unif ba 1
+unif ba system 1
+unif by metastructur 1
+unif can tak 1
+unif conduit 1
+unif de 1
+unif de deux 1
+unif de man 1
+unif de term 1
+unif deux 1
+unif deux term 1
+unif du 1
+unif e avec 1
+unif ee 1
+unif ee avec 1
+unif entr 1
+unif entr term 1
+unif environm 1
+unif es 1
+unif es avec 1
+unif et affect 1
+unif et part 1
+unif etendu 1
+unif etendu doit 1
+unif exposit 1
+unif exposit mult 1
+unif ext 1
+unif fail 1
+unif fash 1
+unif fil 1
+unif fil abstract 1
+unif framework 1
+unif funct 1
+unif funct mgu 1
+unif geometer 1
+unif geometer approach 1
+unif graph 1
+unif graph architectur 1
+unif impliqu 1
+unif impliqu lun 1
+unif in boolean 1
+unif in prec 1
+unif instead 1
+unif instruc 2
+unif instruc inclus 1
+unif instruc perform 1
+unif int prolog 1
+unif introduit 1
+unif introduit un 1
+unif is appl 2
+unif is inst 1
+unif is suff 1
+unif la 1
+unif la var 1
+unif leur 1
+unif leur valeur 1
+unif list 1
+unif loc 1
+unif loc valu 1
+unif manner 1
+unif may result 1
+unif me 1
+unif me me 1
+unif me term 1
+unif mod 1
+unif model 1
+unif of metaterm 1
+unif oper 1
+unif ou 1
+unif ou affect 1
+unif ou par 1
+unif perspect 1
+unif qu 2
+unif qu aurait 1
+unif qu tr 1
+unif rationnel 1
+unif reorder 1
+unif reorder transform 1
+unif repr 1
+unif repr platform 1
+unif result 1
+unif s emantiqu 1
+unif san part 1
+unif sequ 1
+unif son 1
+unif son argum 1
+unif sont 1
+unif sont de 1
+unif substitut 1
+unif succeed 1
+unif th funct 1
+unif theor 1
+unif typ 1
+unif typ theor 1
+unif valu 1
+unif valu a2 1
+unif valu a5 1
+unif valu x4 1
+unif var 1
+unif var a1 1
+unif var a2 1
+unif var a3 1
+unif var a5 1
+unif var a6 1
+unif var a7 1
+unif var ai 1
+unif var vn 1
+unif var x4 1
+unif var x5 1
+unif var xn 1
+unif var y1 1
+unif var y2 1
+unif view 1
+unif void 1
+unificateur 1
+unificateur le 1
+uniform 47
+uniform acc 2
+uniform acc shar 1
+uniform and contain 1
+uniform and indep 1
+uniform and loc 2
+uniform and skew 1
+uniform assum 1
+uniform assum giv 1
+uniform background 1
+uniform bound 1
+uniform chaqu 1
+uniform chaqu comp 1
+uniform color 1
+uniform color spac 1
+uniform colour 1
+uniform colour cub 1
+uniform condit 1
+uniform correspon 1
+uniform crossover 1
+uniform crossover prob 1
+uniform dat 1
+uniform dev 1
+uniform distribut 13
+uniform distribut dat 1
+uniform distribut hot 1
+uniform distribut init 1
+uniform distribut random 2
+uniform ement 1
+uniform ement de 1
+uniform empt 1
+uniform empt typ 1
+uniform exampl 1
+uniform fast 1
+uniform framework 2
+uniform loc 2
+uniform loc pack 2
+uniform loop 1
+uniform loop transform 1
+uniform me. 1
+uniform memor 3
+uniform memor acc 3
+uniform method 1
+uniform method loop 1
+uniform nam 1
+uniform nam schem 1
+uniform nomin 1
+uniform of level 1
+uniform of repr 1
+uniform proof 1
+uniform proof theor 1
+uniform qu 1
+uniform qu port 1
+uniform recur 1
+uniform resourc 1
+uniform resourc loc 1
+uniform scal 1
+uniform scal quant 1
+uniform sem 1
+uniform singl 1
+uniform singl level 1
+uniform subband 1
+uniform subject 1
+uniform subject color 1
+uniform sur 1
+uniform sur ce 1
+uniform textur 1
+uniform tr 1
+uniform tr topolog 1
+uniform traff 3
+uniform traff 4x4 1
+uniform traff 8x8 1
+uniform traff assum 2
+uniform traff model 2
+uniform traff pattern 2
+uniform treatm 1
+uniform tw phenom 1
+uniform vs 1
+unilever 1
+unimodl 2
+unimodl loop 2
+unimodl loop transform 2
+unimodl matr 1
+unimodl matr aj 1
+unimodl transform 2
+unimodl unimodl 1
+unimodl unimodl transform 1
+unimodulair 1
+unimodulair afin 1
+unimodulair afin de 1
+unimodulair ajout 1
+unimodulair ajout de 1
+unimodulair d efin 1
+unimodulair dan 1
+unimodulair dan le 1
+unimodulair en 1
+unimodulair en util 1
+unimodulair et la 1
+unimodulair ne 1
+unimodulair nest 1
+unimodulair nest pa 1
+unimodulair perm 1
+unimodulair perm de 1
+unimport 4
+unimport featur 1
+uning 1
+uninhibit 1
+uninhibit us 1
+uninit 2
+uninit cel 1
+uninit direct 1
+uninit direct inst 1
+uninit object 1
+uninit object creat 1
+uninst 1
+unint 4
+unint clash 1
+uninterest 1
+uninterest on 1
+uninterpr 1
+uninterpr calcl 1
+union 27
+union is tak 1
+union of aff 1
+union of block 1
+union of crystallograph 1
+union of po 1
+union of polyhedr 1
+union of privileg 1
+union of rectangl 1
+union of regl 1
+union of rel 1
+union of system 1
+union of ui 1
+union oper 4
+union st 1
+union str 1
+union str se 1
+union task 1
+union typ 1
+uniproc 5
+uniproc and cach 1
+uniproc and multiproc 1
+uniproc architectur 1
+uniproc cach 1
+uniproc cpus 1
+uniproc environm 1
+uniproc inter 1
+uniproc inter loop 1
+uniproc nod 1
+uniproc nod connect 1
+uniproc perform 1
+uniproc phy 1
+uniproc phy cach 1
+uniproc problem 1
+uniproc problem con 1
+uniproc schedl 1
+uniproc schedl problem 1
+uniproc system 1
+uniproc tw level 1
+uniqu 57
+uniqu accessibl 1
+uniqu accessibl par 1
+uniqu actu 1
+uniqu actu seed 1
+uniqu adv 1
+uniqu and tot 1
+uniqu argum 1
+uniqu argum est 1
+uniqu au 1
+uniqu au marqu 1
+uniqu avec 1
+uniqu avec compact 1
+uniqu ba 1
+uniqu ba ee 1
+uniqu bfather 1
+uniqu bfather path 1
+uniqu block 1
+uniqu comb 1
+uniqu comb en 1
+uniqu de 2
+uniqu de enf 1
+uniqu de la 1
+uniqu de sa 1
+uniqu defin 1
+uniqu demand 1
+uniqu determin 5
+uniqu determin pot 1
+uniqu determin ss 1
+uniqu diagon 1
+uniqu du 1
+uniqu du foncteur 1
+uniqu e configur 1
+uniqu ec 1
+uniqu ec quantif 1
+uniqu edg 1
+uniqu el 1
+uniqu en 1
+uniqu en ca 1
+uniqu entr 1
+uniqu entr nod 1
+uniqu et de 1
+uniqu et ind 1
+uniqu et pil 1
+uniqu exit 1
+uniqu exit nod 1
+uniqu featur 1
+uniqu follow 1
+uniqu fus 1
+uniqu fus point 1
+uniqu greatest 1
+uniqu greatest lower 1
+uniqu identif 7
+uniqu if rank 1
+uniqu in object 1
+uniqu inst 1
+uniqu interfac 1
+uniqu kind 1
+uniqu l mac 1
+uniqu le 1
+uniqu le co 1
+uniqu least fixpoint 1
+uniqu least model 1
+uniqu loc 1
+uniqu log 1
+uniqu log identif 1
+uniqu lor 1
+uniqu lor dun 1
+uniqu mail 1
+uniqu mail addr 1
+uniqu manner 1
+uniqu map 1
+uniqu maxim 1
+uniqu maxim posit 1
+uniqu method 1
+uniqu method nam 1
+uniqu minim 1
+uniqu minim disjunct 1
+uniqu mot 1
+uniqu mot de 1
+uniqu nam 1
+uniqu norm 1
+uniqu norm form 1
+uniqu number 2
+uniqu of kind 1
+uniqu of sum 1
+uniqu opportun 1
+uniqu order 1
+uniqu ou 1
+uniqu ou doubl 1
+uniqu ou si 1
+uniqu pair 1
+uniqu par 2
+uniqu par le 1
+uniqu par pl 1
+uniqu parameter 1
+uniqu parameter number 1
+uniqu part 1
+uniqu path 1
+uniqu path proper 1
+uniqu per pag 1
+uniqu percept 1
+uniqu perm 1
+uniqu perm de 1
+uniqu permut 1
+uniqu po 1
+uniqu po rel 1
+uniqu point 1
+uniqu point de 1
+uniqu pourrait 1
+uniqu pourrait passer 1
+uniqu prim 1
+uniqu prim impl 1
+uniqu proc 1
+uniqu processus 1
+uniqu processus est 1
+uniqu produc 1
+uniqu produc reg 1
+uniqu program 1
+uniqu program solut 1
+uniqu proper 1
+uniqu qu 1
+uniqu qu comb 1
+uniqu r configur 1
+uniqu reg 1
+uniqu repr 1
+uniqu san compact 1
+uniqu satisf 1
+uniqu satisf constraint 1
+uniqu sent 1
+uniqu sequ 1
+uniqu solut 3
+uniqu solut constraint 1
+uniqu specif 1
+uniqu st 1
+uniqu tabl 1
+uniqu tabl entr 1
+uniqu tok 1
+uniqu transact 1
+uniqu transact timestamp 1
+uniqu univer 1
+uniqu univer rel 1
+uniqu util 1
+uniqu util de 1
+uniqu utiliserait 1
+uniqu utiliserait un 1
+uniqu valu 4
+uniqu ver 1
+uniqu z modl 1
+unison 1
+unissu 1
+unissu pi 1
+unit 57
+unit after tim 1
+unit after tl 1
+unit al submonit 1
+unit and dat 1
+unit and sub 1
+unit and therefor 1
+unit ar 2
+unit ar avail 1
+unit ar gener 1
+unit ar interchang 1
+unit ar lin 1
+unit ar requir 1
+unit befor timeout 1
+unit between object 1
+unit board 2
+unit board ar 2
+unit broadcast 1
+unit cal method 1
+unit cap 1
+unit classif 1
+unit classif network 1
+unit claus 2
+unit claus impl 1
+unit claus rl 1
+unit claus simplif 1
+unit column 1
+unit con 1
+unit connect 1
+unit correct 1
+unit cost 1
+unit cost ram 1
+unit de 1
+unit de control 1
+unit de trait 1
+unit deal 1
+unit defin 1
+unit defin induc 1
+unit design 1
+unit driv 1
+unit e de 4
+unit each proc 1
+unit ec 1
+unit elap 1
+unit es 1
+unit es de 1
+unit es sont 1
+unit execut 1
+unit execut tim 1
+unit for maint 1
+unit for st 1
+unit for writ 1
+unit from g1 1
+unit hav sigm 1
+unit in bp 1
+unit in ca 1
+unit in g0 1
+unit in g2 1
+unit in g3 1
+unit is decl 1
+unit is wrong 1
+unit kingdom 3
+unit length 2
+unit number 1
+unit of acc 1
+unit of board 2
+unit of concur 1
+unit of cpu 1
+unit of dat 3
+unit of decluster 1
+unit of memor 1
+unit of ml 1
+unit of mlp 1
+unit of modl 1
+unit of p1 2
+unit of p2 2
+unit of program 1
+unit of recov 1
+unit of softwar 1
+unit of spec 1
+unit of system 1
+unit of tick 1
+unit of tim 3
+unit of transfer 1
+unit of work 2
+unit organ 1
+unit pandemon 1
+unit particip 1
+unit per net 1
+unit quatern 1
+unit receiv 1
+unit refer 1
+unit requir 1
+unit retrief 1
+unit sen 1
+unit squar 1
+unit st 2
+unit st governm 1
+unit system 1
+unit tak 1
+unit test 1
+unit th main 1
+unit th mmu 1
+unit than modl 1
+unit tim 4
+unit to assign 1
+unit to execut 1
+unit to find 1
+unit to reach 2
+unit to sen 1
+unit transfer 1
+unit transfer rat 1
+unit transform 1
+unit us 1
+unit var 1
+unit weight 1
+unit weight assign 1
+unitair 1
+unitair et de 1
+univ 7
+univar 1
+univar distribut 1
+univer 26
+univer and conjunct 1
+univer and me 1
+univer and measur 1
+univer and oper 1
+univer and rel 1
+univer approxim 1
+univer ar connect 1
+univer ar inst 1
+univer as measur 1
+univer as nod 1
+univer becom 1
+univer befor sen 1
+univer bound 1
+univer calcl 1
+univer can rec 1
+univer can sen 1
+univer cl 1
+univer closur 2
+univer cod 1
+univer dealt 1
+univer ebd 1
+univer empl 1
+univer etc 1
+univer ex 1
+univer ex sen 1
+univer ext 1
+univer fal 1
+univer for exper 1
+univer ha chang 1
+univer ha st 1
+univer hash 1
+univer hav becom 1
+univer impl 1
+univer in tim 1
+univer incr 1
+univer infinit 1
+univer is absolut 1
+univer is finit 2
+univer is infinit 1
+univer is simp 1
+univer is typ 1
+univer kind 1
+univer kind init 1
+univer langu 1
+univer langu dat 1
+univer law 1
+univer learn 1
+univer mach 1
+univer margin 1
+univer may chang 1
+univer natur 1
+univer nod 1
+univer of abstract 1
+univer of boolean 1
+univer of discr 1
+univer of electron 1
+univer of modif 1
+univer of object 1
+univer of softwar 1
+univer of typ 1
+univer p2 1
+univer p2 log 1
+univer person 1
+univer person telecommun 1
+univer pr 1
+univer program 2
+univer proper 1
+univer quantif 6
+univer quantif asser 1
+univer quantif stat 1
+univer quantif typ 1
+univer reg 1
+univer rel 1
+univer rel po 1
+univer resourc 1
+univer resourc loc 1
+univer se 2
+univer search 1
+univer search algorithm 1
+univer search ba 1
+univer search spac 1
+univer slb 1
+univer styl 1
+univer tak 1
+univer that mak 1
+univer tl 1
+univer tl sen 1
+univer to grow 1
+univer typ 1
+univer u fa 1
+univer val 1
+univer var 1
+univer wh 1
+univer wh comput 1
+univer with continu 1
+univer with for 1
+univer with po 1
+universel 1
+universel quantif 1
+universel quantif ee 1
+universidad 2
+universidad complut 1
+universidad de 1
+universit 17
+universit a di 3
+universit at chemnitz 1
+universit at erlang 2
+universit at stuttgart 1
+universit at wien 1
+universit de 1
+universit de par 1
+universit de ren 1
+universit di 1
+universit di pi 1
+universit dortmund 1
+universit e de 5
+universit e lav 1
+universit e par 3
+universit e paul 1
+universit e pier 2
+universit joseph 1
+universit joseph four 1
+universitair 3
+universitair de 1
+universitair de beaulieu 1
+universitair montr 1
+universitair montr qu 1
+universitair n.d 1
+universitat 5
+universitat dortmund 1
+universitat karlsruh 1
+universitat munch 1
+universitat polit 1
+universitat polit ecn 1
+universitat zu 1
+universitat zu kiel 1
+universiteit 2
+universiteit delft 2
+universiteit delft delft 2
+universitetspark 1
+universityof 1
+universityof tic 1
+universt 1
+universt of edinburg 1
+unj 1
+unjustif 1
+unjustif conclus 1
+unknown 13
+unknown act 1
+unknown and inestim 2
+unknown environm 1
+unknown environm lif 1
+unknown funct 1
+unknown grammar 1
+unknown input 1
+unknown input valu 1
+unknown interconnect 1
+unknown interconnect network 1
+unknown shar 1
+unknown shar typ 1
+unknown sign 1
+unknown srin 1
+unknown ssm 1
+unknown standard 1
+unknown standard construc 1
+unknown text 1
+unknown textur 1
+unlabel 1
+unlabel cfg 1
+unlabel cfg edg 1
+unlearn 1
+unlearn method 1
+unlearn system 1
+unlearn techniqu 1
+unlearn test 1
+unlearn to filter 1
+unlik 15
+unlik event 1
+unlik juxtaposit 1
+unlik to incur 1
+unlik to log 1
+unlik to prov 1
+unlik to stand 1
+unlik to tac 1
+unlim 4
+unlim acc 1
+unlim memor 1
+unlim memor register 1
+unlim memor renam 1
+unlim number 1
+unlim proc 1
+unload 1
+unload hp 1
+unlock 7
+unlock and bar 1
+unlock and sect 1
+unlock command 1
+unlock command respect 1
+unlock funct 1
+unlock lock 1
+unlock oper 1
+unlock oper unlock 1
+unlock procedur 1
+unlock th lock 1
+unlock th object 1
+unmaintain 1
+unmaintain ensu 1
+unmaintain wil ensu 1
+unman 1
+unmark 1
+unmark green 1
+unmark green nod 1
+unmark yellow 1
+unmark yellow nod 1
+unmask 1
+unmask no 1
+unmatch 2
+unmatch adjac 1
+unmatch adjac ver 1
+unmatch nod 1
+unmatch ver 1
+unmerg 1
+unmerg th sequ 1
+unminim 1
+unminim ssm 1
+unminim ssm giv 1
+unmodif 1
+unmodif top 1
+unmodif top level 1
+unnatur 2
+unnec 14
+unnec and inf 1
+unnec blow 1
+unnec comparison 2
+unnec comput 1
+unnec constraint 1
+unnec cont 1
+unnec cop 1
+unnec cost 1
+unnec evalu 2
+unnec expan 1
+unnec forc 1
+unnec forc select 1
+unnec funct 1
+unnec funct cal 1
+unnec incr 1
+unnec inv 1
+unnec lo 1
+unnec memor 1
+unnec memor structur 1
+unnec overhead 1
+unnec overload 1
+unnec third 1
+unnec third ver 1
+unnec unpack 1
+unnec work 1
+unneed 1
+unneed distinct 1
+unnot 2
+unobstrus 1
+unobstrus manner 1
+unobtrus 1
+unobtrus manner 1
+unoc 1
+unoptim 2
+unoptim upd 1
+unorder 4
+unorder batch 1
+unorder ver 1
+unpack 3
+unpack and pack 1
+unpack assign 1
+unpack dept 1
+unpack emp 1
+unpack empl 1
+unpack me 1
+unpack oper 1
+unpack oper cr 1
+unpack oper creat 1
+unpack oper degrad 1
+unpack oper requir 1
+unpack restructur 1
+unpack restructur oper 1
+unpack th empl 1
+unpack th rel 1
+unpack th se 1
+unpar 1
+unpin 1
+unpin pag 1
+unpl 1
+unpl conclus 1
+unprec 2
+unprec power 1
+unpredict 4
+unpredict in distribut 1
+unpredict tim 1
+unprincipl 1
+unprincipl descript 1
+unproduc 1
+unprun 1
+unprun merg 1
+unpubl 7
+unpubl manscript 1
+unpubl manuscript 3
+unpubl not 1
+unpubl report 1
+unpulb 1
+unpulb report 1
+unqualif 2
+unqualif nam 2
+unquantif 1
+unquantif singl 1
+unquantif singl equ 1
+unquot 1
+unquot and unquot 1
+unquot expr 1
+unquot form 1
+unquot spl 1
+unquot spl expr 1
+unquot spl form 1
+unquot spl syntac 1
+unquot syntac 1
+unr 6
+unr a prior 1
+unr comput 1
+unr comput model 1
+unr concept 1
+unr number 1
+unreason 5
+unreason assum 2
+unreason burd 1
+unreason giv 1
+unreason giv cur 1
+unreason restrict 1
+unrel 11
+unrel broadcast 1
+unrel broadcast domain 1
+unrel compon 1
+unrel datagram 1
+unrel docum 1
+unrel docum sol 1
+unrel multicast 1
+unrel multicast datagram 1
+unrel phy 1
+unrel phy object 1
+unrel program 1
+unresolut 2
+unresolut ca 1
+unrestrict 4
+unrestrict k ary 1
+unrestrict manner 1
+unrestrict rel 1
+unrestrict rel ae 1
+unrestrict rel ae0 1
+unrestrict rel ae1 1
+unrestrict rel datab 1
+unrestrict rel repr 1
+unrestrict situ 1
+unrestrict us 1
+unrol 2
+unrol a loop 1
+unrol multithread 1
+unrol multithread ye 1
+unrol nam 1
+unrol nam reg 1
+unrol network 1
+unrol omn 1
+unrol result 1
+unrol spec 1
+unrol ver 1
+unsaf 4
+unsaf program 1
+unsaf quer 1
+unsaf to remov 1
+unsaf valu 1
+unsaf valu de 1
+unsaf valu qu 1
+unsaf valu tel 1
+unsaf valu yn 1
+unsaf variabl 1
+unsat 1
+unsat med 1
+unsatisf 7
+unsatisf and satisf 1
+unsatisf claus 1
+unsatisf claus variabl 1
+unsatisf for pract 1
+unsatisf forml 1
+unsatisf random 1
+unsatisf random forml 1
+unsatisf random problem 1
+unsatisf result 1
+unsatisf s6288 1
+unsatisf s6288 forml 1
+unsatisf then return 1
+unsatisfact 3
+unsatur 1
+unsatur med 1
+unsc 1
+unsc algorithm 1
+unseen 2
+unseen me 1
+unseen me s0 1
+unseen pattern 1
+unseen vot 1
+unsharp 1
+unshift 1
+unshift th de 1
+unshift th sign 1
+unshuffl 1
+unshuffl al involut 1
+unshuffl in step 1
+unsign 2
+unsign int 1
+unsign int link 1
+unsign integer 1
+unsign tim 1
+unsort 1
+unsort list 1
+unspec 1
+unspecif 4
+unspecif dat 1
+unspecif mad 1
+unst 2
+unst libr 1
+unst libr interfac 1
+unst nod 1
+unst way 1
+unstretch 1
+unstretch form 1
+unstructur 9
+unstructur blackboard 1
+unstructur cod 1
+unstructur graph 2
+unstructur graph partit 2
+unstructur inform 1
+unstructur interview 1
+unstructur lp 1
+unstructur lp matr 1
+unstructur lp problem 1
+unstructur part 1
+unstructur problem 1
+unstructur se 1
+unstructur system 1
+unsubst 1
+unsubsum 1
+unsubsum bin 1
+unsubsum bin claus 1
+unsucc 3
+unsucc attempt 1
+unsuit 3
+unsuit as key 1
+unsuit for st 1
+unsuit of cl 1
+unsuperv 4
+unsuperv learn 3
+unsuperv textur 1
+unsuperv textur segm 1
+unsupport 1
+unsupport claim 1
+unsupport pract 1
+unsurpr 1
+unsynchron 1
+untag 1
+untag nod 1
+unter 2
+unter watzlawik 1
+untim 1
+untim requir 1
+untim requir r1 1
+untim specif 1
+untim system 1
+untrain 1
+untrain net 1
+untransp 1
+untransp matr 1
+untyp 3
+untyp framework 1
+untyp langu 1
+untyp var 1
+untyp var appear 1
+unus 7
+unus and continu 1
+unus and sen 1
+unus bit 1
+unus edg 1
+unus high order 1
+unus min 1
+unus modl 1
+unus pag 1
+unus phy 1
+unus phy addr 1
+unusu 9
+unusu approach 1
+unusu cap 1
+unusu featur 1
+unusu high dat 1
+unusu not 1
+unusu possibil 1
+unusu possibil allow 1
+unusu puzzl 1
+unusu puzzl incorpor 1
+unusu situ 1
+unutil 1
+unveil 2
+unveil th as 1
+unverif 1
+unw 1
+unw residu 1
+unweight 2
+unweight graph 1
+unwind 1
+unwind protect 1
+unwind protect cal 1
+unwind protect protect 1
+up 7
+up in term 1
+up mot 1
+up of perform 1
+up recur 1
+up start 1
+upcom 2
+upcom flec 1
+upd 67
+upd a cach 1
+upd a conv 1
+upd a cost 1
+upd a datab 1
+upd a decl 1
+upd a knowledg 1
+upd a repl 1
+upd a var 1
+upd accord 3
+upd acquaint 1
+upd acquaint nam 1
+upd act 5
+upd act nod 1
+upd act prompt 1
+upd al cop 1
+upd al edg 1
+upd al loc 1
+upd and argu 1
+upd and assum 1
+upd and event 1
+upd and inser 1
+upd and lookup 1
+upd and maintain 1
+upd and obtain 1
+upd and respon 1
+upd and search 1
+upd and st 1
+upd and test 1
+upd and transact 1
+upd any appl 1
+upd appl 1
+upd appropr 1
+upd ar ad 1
+upd ar coordin 1
+upd ar es 1
+upd ar eventu 1
+upd ar model 1
+upd ar renam 1
+upd as describ 2
+upd as destruc 1
+upd as follow 1
+upd as part 1
+upd bal 1
+upd becom 2
+upd becom prim 1
+upd belong 1
+upd bi 1
+upd by appl 1
+upd by integr 1
+upd by p1 1
+upd by proc 1
+upd by rl 1
+upd can appear 1
+upd can ea 1
+upd cel 1
+upd channel 1
+upd channel0 1
+upd comput 1
+upd count 1
+upd cp 1
+upd dat 1
+upd datab 2
+upd deg 1
+upd deriv 1
+upd deriv rel 1
+upd disk 1
+upd disk pag 1
+upd ea 1
+upd each tim 1
+upd endext 1
+upd epoch 1
+upd estim 1
+upd ev tim 1
+upd exact 1
+upd exp 1
+upd expr 1
+upd f1 1
+upd f2 1
+upd f3 1
+upd facil 2
+upd field 1
+upd field.2 1
+upd flag 1
+upd flag fal 1
+upd for exp 1
+upd for kind 1
+upd for lastnod 1
+upd for var 1
+upd for variabl 1
+upd fram 1
+upd from prev 1
+upd funct 1
+upd gener 1
+upd gener log 1
+upd graph 1
+upd if nec 1
+upd in bay 1
+upd in caus 2
+upd in datab 1
+upd in event 1
+upd in lp 1
+upd in plac 1
+upd in pur 1
+upd infrequ 1
+upd inst 2
+upd inst variabl 1
+upd instead 1
+upd instruc 1
+upd int transact 1
+upd int xw 1
+upd is giv 1
+upd is perform 1
+upd is tak 1
+upd it dat 1
+upd it fragm 1
+upd it level 1
+upd it loc 1
+upd it nam 1
+upd it ph 1
+upd it posit 1
+upd it pt 1
+upd it st 1
+upd it timestamp 1
+upd it view 1
+upd langu 2
+upd last disk 1
+upd libr 1
+upd libr simp 1
+upd link 1
+upd link me 1
+upd list 2
+upd loc 1
+upd log 1
+upd log datab 1
+upd manu 1
+upd mater 1
+upd mater view 1
+upd may tak 1
+upd me 2
+upd me contain 1
+upd me reach 1
+upd me receiv 1
+upd me sent 1
+upd mechan 1
+upd method 1
+upd most recent 1
+upd must occur 1
+upd must wait 1
+upd next hop 1
+upd next recent 1
+upd nod 1
+upd ob 1
+upd occur 1
+upd of appl 1
+upd of ba 1
+upd of belief 1
+upd of bfather 1
+upd of exp 1
+upd of form 1
+upd of item 1
+upd on var 1
+upd oper 4
+upd oper affect 1
+upd oper involut 1
+upd oper perform 1
+upd oper requir 1
+upd or el 1
+upd or read 1
+upd or s2 1
+upd pattern 1
+upd perform 3
+upd perform measur 1
+upd period 1
+upd ph 2
+upd ph requir 1
+upd pointer 1
+upd pointer loc 1
+upd pointer rel 1
+upd pop 1
+upd prim 1
+upd prim giv 1
+upd primitiv 1
+upd prior 1
+upd proc 1
+upd prov 1
+upd rat 1
+upd rat me 1
+upd rat oe 1
+upd reconsider 1
+upd record 1
+upd regl 1
+upd regl accord 1
+upd remot 1
+upd remot nod 1
+upd request 1
+upd request ec 1
+upd rl 1
+upd se 1
+upd se vouch 1
+upd self 1
+upd serv 1
+upd serv using 1
+upd setter 1
+upd setter execut 1
+upd shal occur 1
+upd sourc 1
+upd sourc cod 1
+upd st 1
+upd st valu 1
+upd stack 1
+upd structur 1
+upd structur el 1
+upd system 2
+upd system pot 1
+upd system st 1
+upd targ 1
+upd th acc 1
+upd th appl 1
+upd th car 1
+upd th configur 1
+upd th cop 1
+upd th correspon 1
+upd th dat 1
+upd th dg 1
+upd th dist 1
+upd th fram 1
+upd th graph 1
+upd th intern 1
+upd th inver 1
+upd th level 1
+upd th link 1
+upd th loc 2
+upd th lower 1
+upd th map 1
+upd th nod 2
+upd th pot 2
+upd th pref 1
+upd th prior 1
+upd th siml 1
+upd th st 2
+upd th system 1
+upd th transit 2
+upd th valu 2
+upd th variabl 1
+upd th veloc 1
+upd th weight 1
+upd that com 1
+upd their cop 1
+upd their level 1
+upd their register 1
+upd their sourc 1
+upd tim 1
+upd to cal 1
+upd to currnod 1
+upd to emb 1
+upd to lj 1
+upd to occur 1
+upd to p2 1
+upd to pag 1
+upd to proper 1
+upd to reflect 1
+upd to upd 1
+upd to work 1
+upd top 1
+upd ts 1
+upd ts accord 1
+upd tsharp 1
+upd upd 1
+upd us 1
+upd v cur 1
+upd v1 1
+upd v2 1
+upd v3 1
+upd valu 1
+upd variabl 2
+upd veloc 1
+upd ver 1
+upd vi 1
+upd we def 1
+upd weight 2
+upd when creat 1
+upd when nec 1
+upd which allow 1
+upd wil occur 1
+upd ws 1
+upd yield 1
+upd zer 1
+updater 1
+updater object 1
+updater object2 1
+upf 1
+upgrad 2
+upgrad by ad 1
+upgrad ec 1
+upgrad ec mach 1
+upgrad or maint 1
+upgrad procedur 1
+upgrad sourc 1
+upgrad sourc cod 1
+upgrad their sourc 1
+upgradepr 1
+upgradeprocesspr 1
+upheld 1
+uphil 1
+uphil mov 1
+upl 1
+upmail 1
+upper 39
+upper and digit 1
+upper and lower 4
+upper bod 1
+upper bod ar 1
+upper bod camer 1
+upper bound 23
+upper bound assign 1
+upper bound correspon 1
+upper bound follow 1
+upper bound inclus 1
+upper bound mak 1
+upper bound min 1
+upper bound recur 1
+upper bound tcol 1
+upper bound1 1
+upper boundn 1
+upper ca 4
+upper ca letter 2
+upper compon 1
+upper cr 1
+upper cr sect 1
+upper hierarch 1
+upper hierarch control 1
+upper j lower 1
+upper left corner 1
+upper level 3
+upper level inter 2
+upper level sem 1
+upper lim 1
+upper part 1
+upper pivot 1
+upper prolog 1
+upper prolog layer 1
+upper right corner 1
+upper runtim 1
+upper runtim bound 1
+upper triangl 1
+upper triangl system 1
+upper valu 1
+upper with upper 1
+upperbod 1
+upperbod ar 1
+uppermost 1
+upstream 1
+upstream neighbor 1
+upsurg 1
+upt 6
+upt banerj 1
+upt j proc 2
+upt ten 2
+upt th lc 1
+upt th maxim 1
+ur 14
+ur angewandt 2
+ur angewandt mathematik 2
+ur d eviter 1
+ur de 2
+ur de fonct 1
+ur de ne 1
+ur de setarg 1
+ur donner 1
+ur donner lieu 1
+ur expertensystem 1
+ur informatik 2
+ur informatik der 1
+ur mathematik 3
+ur mathematik und 2
+ur parallel 1
+ur parallel tiefensuch 1
+ur plus rap 1
+ur pour 1
+ur pour deux 1
+ur pour raccourcir 1
+ur qu 1
+ur qu dan 1
+ur quil 1
+ur quil ec 1
+ur softwar 1
+ur softwar und 1
+ur statik 1
+ur statik und 1
+urban 7
+urban champaign 5
+urban champaign urban 1
+urban il 1
+urban illin 1
+urbanachampaign 1
+urer 1
+urer and raghavachar 1
+urg 1
+urg best 1
+urg best phon 1
+urg kop 1
+urich 2
+url 6
+url ba 1
+url http 1
+url in hid 1
+url refer 1
+url to sen 1
+url univer 1
+url univer resourc 1
+urnberg 1
+ursch 2
+us 125
+us 2f 1
+us 3d 1
+us 3d interact 1
+us a bit 1
+us a broadcast 1
+us a centr 3
+us a cl 1
+us a comb 1
+us a competit 1
+us a const 1
+us a custom 1
+us a dict 1
+us a direct 1
+us a dist 1
+us a distingu 1
+us a distribut 1
+us a fic 1
+us a fl 1
+us a form 1
+us a fram 1
+us a gener 1
+us a giv 2
+us a lin 1
+us a link 1
+us a loc 3
+us a log 1
+us a multipl 1
+us a narx 1
+us a newer 1
+us a nil 1
+us a no 1
+us a number 1
+us a pack 1
+us a pag 1
+us a part 1
+us a particl 1
+us a partit 1
+us a pot 1
+us a prior 1
+us a proc 1
+us a protocol 1
+us a pseud 1
+us a rad 1
+us a random 1
+us a refer 1
+us a reflect 1
+us a reif 1
+us a rel 1
+us a resourc 1
+us a schedl 1
+us a se 2
+us a secondorder 1
+us a separ 1
+us a shar 1
+us a simil 2
+us a simpl 4
+us a singl 2
+us a slight 2
+us a slow 1
+us a smaller 1
+us a somewhat 2
+us a sort 1
+us a span 1
+us a specif 1
+us a st 1
+us a stat 1
+us a stop 1
+us a straightfor 1
+us a subprotocol 1
+us a symbol 1
+us a term 1
+us a timer 1
+us a top 1
+us a tot 1
+us a valu 1
+us a var 4
+us aalborg 1
+us about dog 1
+us act 1
+us aff 1
+us aff equ 1
+us al 1
+us al avail 1
+us al link 1
+us algebr 1
+us algorithm 1
+us an algorithm 1
+us an approach 1
+us an appropr 1
+us an approxim 2
+us an arbitr 1
+us an assoc 1
+us an attribut 1
+us an avail 1
+us an ec 1
+us an eff 1
+us an estim 1
+us an explicit 1
+us an ext 1
+us an extern 1
+us an implem 1
+us an increm 2
+us an inherit 1
+us an input 1
+us an obv 1
+us an octr 1
+us an onl 1
+us an oper 1
+us an optim 1
+us an outg 1
+us an output 1
+us an over 1
+us an unr 1
+us and comb 1
+us and implem 1
+us and lead 1
+us and mach 1
+us and reus 1
+us any act 1
+us any assum 1
+us any good 1
+us any particl 1
+us any prompt 1
+us appear 1
+us appl 2
+us appl system 1
+us approxim 1
+us approxim trigger 1
+us ar collect 1
+us as abbrev 1
+us as group 1
+us as interm 1
+us as program 1
+us at tim 1
+us atom 2
+us atom memor 1
+us atom variabl 1
+us attribut 1
+us attribut timestamp 1
+us augm 1
+us autom 1
+us b level 1
+us b multipl 1
+us b0 1
+us bar 1
+us becaus dat 1
+us behaviour 1
+us ben 1
+us ben network 1
+us benchmark 1
+us bin 2
+us bin search 1
+us bin spac 1
+us bool 1
+us bool lem 1
+us boolean 1
+us boolean constraint 1
+us boolean oper 1
+us both funct 1
+us both realm 1
+us bottom 1
+us bought 1
+us bought libr 1
+us bound 1
+us bsen 1
+us bus 1
+us by appl 1
+us by computer 1
+us by gener 1
+us by peopl 1
+us by se 1
+us c c0 1
+us c technolog 1
+us ca 1
+us ca driv 1
+us cal 2
+us caus 1
+us caus memor 1
+us center 1
+us check 1
+us chernoff 2
+us chernoff bound 2
+us chernoff typ 1
+us chr 1
+us cl 3
+us cl test 1
+us claus 1
+us claus requir 1
+us client 1
+us client sid 1
+us clp 1
+us cluster 3
+us cluster siz 2
+us color 2
+us color inform 1
+us com 4
+us com separ 1
+us commitm 1
+us commun 2
+us commun vol 1
+us compiler 1
+us compiler optim 1
+us comput 1
+us con 2
+us con condit 1
+us concept 1
+us conclus 1
+us condit 1
+us configur 1
+us configur specif 1
+us consequ 1
+us consider 1
+us cooper 1
+us cooper task 1
+us cor 1
+us cor program 1
+us cur 1
+us cur brack 1
+us cut 1
+us dash 1
+us dash variabl 1
+us dat 1
+us dat partit 1
+us daubech 1
+us definit 1
+us deg 1
+us degener 1
+us degener form 1
+us desouz 1
+us desouz csl.stanford.edu 1
+us differ 1
+us differ comput 1
+us differ dat 1
+us differ distribut 1
+us differ funct 1
+us differ kind 1
+us differ mean 1
+us differ typ 1
+us direct 1
+us direct entr 1
+us disc 5
+us dl 1
+us do 1
+us docum 1
+us dot 1
+us dot not 1
+us dynam 3
+us dynam dep 1
+us dynam reconfigur 1
+us dynam topolog 1
+us e configur 1
+us e1 1
+us e1 e2 1
+us ea 1
+us each project 1
+us ec 3
+us ec appl 1
+us ec technolog 1
+us ed 1
+us either snoop 1
+us either st1 1
+us either switch 1
+us email 1
+us ensur 1
+us environm 1
+us equ 2
+us equ constraint 1
+us equ unidirect 1
+us eval 1
+us evolut 1
+us evolut algebr 1
+us ew0 1
+us exampl 4
+us exper 1
+us explicit 2
+us explicit invoc 1
+us ext 1
+us fact 1
+us featur 1
+us feedback 1
+us fewer 2
+us fewer dat 1
+us fewer subject 1
+us first norm 1
+us fl 1
+us for allev 1
+us for appl 1
+us for decl 1
+us for demonstr 1
+us for establ 1
+us for further 1
+us for futur 1
+us for handl 1
+us for imag 1
+us for libr 1
+us for main 1
+us for maintain 1
+us for med 1
+us for parallel 1
+us for program 2
+us for purp 2
+us for qu 1
+us for schedl 1
+us for select 1
+us for solut 2
+us for sort 1
+us for stud 1
+us four standard 1
+us futur 1
+us gap 1
+us gener 1
+us gener rel 1
+us glob 1
+us glob st 1
+us go 1
+us got 1
+us grad 1
+us grad desc 1
+us gsm 1
+us gsm satisf 1
+us gurevich 1
+us gurevich not 1
+us h ye 1
+us half 1
+us hem 1
+us heter 1
+us heter dist 1
+us heur 1
+us high 2
+us high level 1
+us high resolut 1
+us hilber 1
+us hilber curv 1
+us hyperplan 1
+us hyperrectangl 1
+us id 1
+us if cluster 1
+us iff 1
+us iff step 1
+us implicit 1
+us implicit inform 1
+us in an 1
+us in anim 1
+us in appl 1
+us in augm 1
+us in ca 2
+us in comb 1
+us in datab 1
+us in describ 1
+us in design 4
+us in ext 1
+us in improv 1
+us in ind 1
+us in lin 1
+us in ma 1
+us in mak 1
+us in mlp 1
+us in optim 1
+us in parallel 1
+us in pract 3
+us in prov 1
+us in refin 1
+us in regr 1
+us in sect 1
+us in shar 1
+us in softwar 1
+us in understand 2
+us in untim 1
+us in var 1
+us increm 1
+us induc 1
+us ineffect 1
+us ineffect approach 1
+us inf 1
+us inf not 1
+us inform 5
+us inform explicit 1
+us inform visu 1
+us inherit 1
+us input 2
+us input valu 1
+us insight 1
+us inst 1
+us internet 1
+us internet resourc 1
+us interproc 1
+us interproc commun 1
+us introspect 1
+us introspect me 1
+us ip 1
+us ip multicast 1
+us is certain 1
+us is condit 1
+us is defin 1
+us is measur 1
+us is nxn 1
+us is restrict 1
+us issu 2
+us it outg 1
+us joint 1
+us joint transform 1
+us k.k 1
+us karp 1
+us knaster 1
+us knaster tarsk 1
+us l1 1
+us l2 1
+us lalr 1
+us le number 2
+us le swap 1
+us lem 1
+us level 1
+us lexer 1
+us lexer gener 1
+us lin 1
+us lin quadtr 1
+us link 2
+us link st 1
+us load 1
+us load bal 1
+us log 3
+us log server 1
+us logarithm 1
+us logarithm tim 1
+us low 1
+us low level 1
+us lr 1
+us mak 1
+us man ba 1
+us manufactur 1
+us manufactur fault 1
+us may caus 1
+us me 3
+us me constraint 1
+us me construc 1
+us me stream 1
+us measur 2
+us mechan 1
+us merg 1
+us merg oper 1
+us meter 1
+us method 2
+us method using 1
+us mod 2
+us mod infer 1
+us model 1
+us modif 1
+us mor conserv 1
+us mor principl 1
+us mor proc 1
+us mult 1
+us mult channel 1
+us multipl 2
+us multipl buffer 1
+us multipl inherit 1
+us multipl log 1
+us mutu 1
+us mutu exclus 1
+us n swmr 1
+us n1 1
+us n2 1
+us narx 1
+us narx network 1
+us near 1
+us nest 1
+us nest transact 1
+us network 1
+us neur 1
+us neur network 1
+us new equ 1
+us no dual 1
+us nod 1
+us nod mobil 1
+us non 2
+us non atom 1
+us nonmonot 1
+us norm 1
+us norm execut 1
+us not 2
+us not simil 1
+us object 1
+us object funct 1
+us of abstract 1
+us of addit 1
+us of an 1
+us of anim 1
+us of ar 1
+us of artif 1
+us of beggar 1
+us of block 1
+us of bool 1
+us of bsen 1
+us of cam 1
+us of capabil 1
+us of chip 1
+us of cl 2
+us of coinc 1
+us of color 1
+us of commerc 1
+us of compon 1
+us of comput 1
+us of constraint 1
+us of contextu 1
+us of contract 1
+us of ct 1
+us of cut 1
+us of dat 2
+us of dataflow 1
+us of datalog 1
+us of defgener 1
+us of definit 1
+us of deriv 1
+us of directiv 1
+us of disabl 1
+us of doubleind 1
+us of dynam 2
+us of ec 2
+us of exp 1
+us of explicit 1
+us of fault 1
+us of featur 1
+us of fr 1
+us of gener 1
+us of good 1
+us of graph 1
+us of hid 1
+us of high 1
+us of hybrid 1
+us of ie 1
+us of indent 1
+us of inform 1
+us of inherit 1
+us of int 1
+us of interact 1
+us of intersect 1
+us of introspect 2
+us of item 1
+us of joint 1
+us of le 1
+us of link 1
+us of mach 1
+us of macr 2
+us of mar 1
+us of me 1
+us of med 1
+us of memor 1
+us of method 1
+us of monit 1
+us of mp 1
+us of mult 1
+us of multipl 1
+us of narx 1
+us of natur 1
+us of netsim 1
+us of neur 1
+us of object 2
+us of oper 1
+us of ordin 1
+us of overlap 1
+us of parallel 2
+us of plaus 1
+us of principl 1
+us of program 1
+us of proper 1
+us of pur 1
+us of recur 2
+us of redund 1
+us of register 1
+us of resolut 2
+us of resourc 2
+us of rn 1
+us of rol 1
+us of se 1
+us of secon 1
+us of selectintertest 1
+us of shadow 1
+us of siml 1
+us of singl 1
+us of st 1
+us of standard 1
+us of structur 2
+us of su 1
+us of sv 1
+us of taper 1
+us of tdfg 1
+us of technolog 1
+us of templ 1
+us of tempor 1
+us of tpm 1
+us of traff 1
+us of transit 1
+us of unrestrict 1
+us of unwind 1
+us of upd 1
+us of virtu 2
+us of wgp 1
+us of whitespac 1
+us of www 2
+us ol 1
+us ol autom 1
+us old 1
+us on interpr 1
+us on pandemon 1
+us on pointer 1
+us on status 1
+us on symbol 1
+us onl ba 1
+us onl color 1
+us onl const 1
+us onl exterior 1
+us onl fault 1
+us onl featur 1
+us onl thread 1
+us oper 1
+us or def 1
+us ordin 1
+us ordin trip 1
+us orthogon 1
+us orthogon hyperplan 1
+us other relationship 1
+us our framework 1
+us our polynom 1
+us parallel 1
+us parallel program 1
+us part 1
+us patht 1
+us pattern 2
+us pattern match 1
+us pearson 1
+us ph 1
+us pipelin 1
+us pipelin ram 1
+us point 1
+us polynom 1
+us polynom tim 1
+us pr 1
+us precc 1
+us priopt 1
+us priorit 1
+us privileg 1
+us privileg graph 1
+us prob 1
+us prob modif 1
+us problem 1
+us problem breakdown 1
+us proc 2
+us proc tim 1
+us procedur 1
+us procedur selecttest2 1
+us project 1
+us project profil 1
+us proper 3
+us proper hold 1
+us proport 1
+us prun 1
+us ps 1
+us purp 1
+us qi 1
+us qi problem 1
+us quantif 1
+us quantif elim 1
+us quick 1
+us r tr 1
+us random 2
+us random match 1
+us re 1
+us real valu 1
+us recent 1
+us recent result 1
+us reconfigur 1
+us record 1
+us reduc 2
+us reduc system 1
+us regl 1
+us rel 1
+us relationship 1
+us relev 1
+us relev context 1
+us repl 1
+us resourc 1
+us resourc r1 1
+us restrict 1
+us restrict multicast 1
+us result 2
+us ri 1
+us rin 1
+us rn 1
+us run 2
+us s 2n 1
+us saf 1
+us schedl 1
+us schedl algorithm 1
+us script 1
+us script letter 1
+us secon 1
+us secon st 1
+us self 2
+us self modif 1
+us self rout 1
+us selfmodif 1
+us selfmodif program 1
+us sem 1
+us sem proper 1
+us sequ 1
+us sequ number 1
+us serv 1
+us sever recognit 1
+us sever techniqu 1
+us shift 1
+us si 1
+us sibl 1
+us sibl tr 1
+us signif 1
+us signif fewer 1
+us simpl 3
+us simpl stat 1
+us simpl string 1
+us sinc inst 1
+us smaller 2
+us smaller cluster 2
+us som form 1
+us som heur 1
+us som partit 1
+us sound 1
+us spat 1
+us spat vect 1
+us spec 1
+us spec dat 1
+us spec syntact 1
+us specl 1
+us specl comput 1
+us split 1
+us spreadsh 1
+us ss 1
+us standard 1
+us standard nonmonot 1
+us stat 3
+us stat method 1
+us stat number 1
+us stat topolog 1
+us strateg 1
+us structur 1
+us structur found 1
+us such inform 1
+us such strateg 1
+us such system 1
+us suggest 1
+us superior 1
+us superior se 1
+us sv 1
+us swap 1
+us system 1
+us t level 1
+us tak 1
+us tdfg 1
+us techniqu 3
+us techniqu simil 1
+us term 1
+us test 1
+us testsonedg 1
+us th act 1
+us th actu 1
+us th ae 1
+us th algorithm 2
+us th amd 1
+us th an 1
+us th annot 1
+us th appropr 1
+us th argum 1
+us th boolean 1
+us th bound 1
+us th built 1
+us th character 1
+us th chernoff 1
+us th church 1
+us th concept 1
+us th conv 1
+us th cool 1
+us th crossbar 1
+us th dec 1
+us th default 1
+us th definit 1
+us th del 1
+us th dem. 1
+us th dim 1
+us th direct 1
+us th dwarf 1
+us th edg 2
+us th empl 1
+us th environm 1
+us th eram 1
+us th euclidean 1
+us th expan 1
+us th ext 1
+us th extract 1
+us th fact 5
+us th fastest 1
+us th featur 1
+us th fic 1
+us th finish 1
+us th fish 1
+us th forml 1
+us th fract 1
+us th framework 1
+us th fun 1
+us th funct 2
+us th ge 1
+us th graph 1
+us th guar 1
+us th guard 1
+us th header 1
+us th help 1
+us th heter 1
+us th heur 1
+us th host 1
+us th icmp 1
+us th id 1
+us th inaccur 1
+us th induc 1
+us th inequ 1
+us th inf 1
+us th inform 1
+us th inherit 1
+us th inner 1
+us th instruc 1
+us th intel 1
+us th interfac 1
+us th key 1
+us th knowledg 1
+us th langu 1
+us th learn 1
+us th length 1
+us th lin 1
+us th list 1
+us th loc 1
+us th lock 1
+us th log 2
+us th maxim 1
+us th med 1
+us th memor 3
+us th merg 1
+us th method 1
+us th minim 1
+us th mov 1
+us th nod 1
+us th not 3
+us th novel 1
+us th ocean 1
+us th old 2
+us th optim 1
+us th order 1
+us th origin 1
+us th overl 1
+us th parameter 1
+us th parmac 1
+us th part 2
+us th partit 1
+us th path 1
+us th polynom 1
+us th popl 1
+us th pr 1
+us th prev 1
+us th problem 1
+us th program 1
+us th prompt 1
+us th proper 1
+us th put 1
+us th qu 1
+us th quant 1
+us th quick 1
+us th rad 1
+us th read 1
+us th realm 1
+us th register 1
+us th rel 1
+us th renam 1
+us th result 4
+us th saf 1
+us th secon 1
+us th sect 1
+us th self 1
+us th sem 1
+us th sequ 1
+us th simpl 2
+us th slrn 1
+us th sourc 1
+us th specl 1
+us th splitter 1
+us th squar 1
+us th st 1
+us th standard 1
+us th strateg 2
+us th stud 1
+us th sturm 1
+us th subderiv 1
+us th subject 1
+us th subtyp 1
+us th symbol 1
+us th syntac 1
+us th system 3
+us th techniqu 1
+us th term 6
+us th textu 1
+us th theorem 1
+us th thibault 1
+us th tool 1
+us th top 1
+us th trac 1
+us th train 1
+us th transform 1
+us th traver 1
+us th trick 1
+us th uid 1
+us th unit 1
+us th unpack 1
+us th upd 1
+us th valu 2
+us th variabl 1
+us th vendor 1
+us th visu 1
+us th wealth 1
+us th weight 1
+us th work 2
+us th zer 1
+us than prev 1
+us their favourit 1
+us their libr 1
+us their result 2
+us theorem 1
+us thr environm 1
+us thr kind 1
+us thr parameter 1
+us thread 1
+us thread cod 1
+us through langu 1
+us timestamp 1
+us to allow 1
+us to comb 1
+us to consider 1
+us to demonstr 1
+us to describ 3
+us to design 1
+us to develop 1
+us to ext 1
+us to find 1
+us to help 1
+us to illustr 1
+us to know 1
+us to mak 1
+us to partit 1
+us to prov 1
+us to repr 1
+us to skip 1
+us to solut 1
+us to trigger 1
+us tool 3
+us trac 1
+us trac driv 1
+us train 1
+us train dat 1
+us tupl 1
+us tupl timestamp 1
+us turn 1
+us tw heur 1
+us tw pandemon 1
+us tw siz 1
+us tw st 1
+us typ 1
+us typ dep 1
+us ui 1
+us uid 1
+us upd 1
+us upd libr 1
+us upper 1
+us upper ca 1
+us user 1
+us user requir 1
+us usu 1
+us usu not 1
+us v1n 1
+us v1s 1
+us valu 3
+us var 2
+us var assignm 1
+us vect 1
+us vect h8 1
+us vi 1
+us virtu 1
+us virtu memor 1
+us vm 1
+us vm system 1
+us vouch 1
+us vouch nl 1
+us vs 1
+us wa defin 1
+us wavel 1
+us wavel ba 1
+us wgp 1
+us when retrief 1
+us wil norm 1
+us with ol 1
+us with respect 1
+us with var 1
+us with window 1
+us word 1
+us word addr 1
+us wordnet 1
+us work 2
+us writ 1
+us.2 2
+us.2 we attribut 1
+us1 1
+usag 21
+usag and effect 1
+usag and stat 1
+usag improv 1
+usag improv perform 1
+usag inform 1
+usag is prog 1
+usag of commun 1
+usag of connect 1
+usag of inherit 1
+usag of lock 1
+usag of multipl 1
+usag of structur 1
+usag of switch 1
+usag pattern 1
+usag specif 1
+usag specif optim 1
+usag stat 1
+usag vi www 1
+usair 1
+usairorig 1
+usc 1
+usd2 1
+usdod 1
+usec 1
+usec st1.dpu.dr 1
+usec st1.dpu.dr dputim.tv 1
+usefl 1
+usefl for nest 1
+uselt 1
+usen 5
+usen c workshop 1
+usen symp 1
+usen winter 1
+usenet 2
+usenet comp.risk 1
+usenet dan 1
+usenet dan le 1
+user 65
+user acc 2
+user acc right 1
+user accept 2
+user actu 1
+user actu consider 1
+user actu select 1
+user ad 1
+user adapt 1
+user adapt strateg 1
+user analyst 1
+user analyst interact 1
+user and adapt 1
+user and analyst 1
+user and computer 1
+user and serv 1
+user ar allow 1
+user ar author 1
+user ar famil 1
+user ar fr 1
+user ar interview 1
+user ar organ 1
+user as 1
+user ask 2
+user asser 1
+user attitud 1
+user author 1
+user ba 1
+user bi 1
+user build 1
+user by execut 1
+user by suggest 1
+user can ch 1
+user can control 1
+user can def 1
+user can determin 1
+user can exerc 1
+user can ext 1
+user can fac 1
+user can interact 1
+user can mak 2
+user can modif 1
+user can obtain 1
+user can over 1
+user can rel 1
+user can replac 1
+user can switch 1
+user can tel 1
+user can thus 1
+user can us 2
+user cannot specif 1
+user center 1
+user center approach 1
+user centr 1
+user centr requir 1
+user ch 1
+user chang 1
+user click 1
+user cod 1
+user com 1
+user command 1
+user command.15 1
+user command.15 third 1
+user computer 1
+user computer system 1
+user control 2
+user control oper 1
+user control prompt 1
+user control visu 1
+user correspon 1
+user correspon prompt 1
+user cs.umd.edu1 1
+user custom 1
+user dec 1
+user decl 1
+user def 1
+user defin 7
+user defin amount 1
+user defin cl 1
+user defin comp 1
+user defin constraint 1
+user defin error 1
+user defin event 1
+user defin ext 1
+user defin funct 1
+user defin handler 1
+user defin memor 1
+user defin object 1
+user defin structur 1
+user defin writer 1
+user dialog 1
+user displ 1
+user do know 1
+user docum 1
+user draw 1
+user draw tool 1
+user driv 1
+user email 1
+user email addr 1
+user enter 1
+user enter field 1
+user expect 1
+user expect addit 1
+user exper 1
+user exper ind 1
+user experim 1
+user ext 1
+user ext oper 1
+user feel 1
+user felt 1
+user flag 1
+user follow 1
+user fr 2
+user fr syntac 1
+user friendl 1
+user from academ 1
+user from industr 1
+user from plug 1
+user funct 1
+user funct cod 1
+user funct writ 1
+user group 2
+user group nod 1
+user group rol 1
+user guid 7
+user habit 1
+user hold 1
+user id 1
+user identif 1
+user implementer 1
+user implementer interact 1
+user in act 1
+user in deal 1
+user in select 1
+user ind 1
+user influ 1
+user inform 1
+user inform requir 1
+user input 5
+user input appl 1
+user input form 1
+user input requir 1
+user int 1
+user interac 1
+user interac environm 1
+user interact 1
+user interfac 13
+user interfac ca 1
+user interfac command 1
+user interfac consider 1
+user interfac construc 2
+user interfac design 2
+user interfac environm 1
+user interfac ext 1
+user interfac inclus 1
+user interfac integr 1
+user interfac obv 1
+user interfac principl 1
+user interfac prov 1
+user interfac show 1
+user interfac softwar 1
+user interfac using 1
+user interv 2
+user involut 2
+user involut affect 1
+user involut allow 1
+user involut con 1
+user is allow 1
+user is ask 1
+user is author 1
+user is concern 1
+user is going 1
+user is log 1
+user is mov 1
+user is search 1
+user is thus 2
+user is wid 1
+user issu 1
+user know 1
+user know exact 1
+user knowledg 1
+user kumar 1
+user level 4
+user level proc 1
+user level program 1
+user lik vid 1
+user manipl 2
+user manu 5
+user may ch 1
+user may def 1
+user may ext 1
+user may rev 1
+user may search 1
+user may specif 1
+user me 1
+user might want 1
+user mod 2
+user mod overhead 1
+user model 2
+user model edit 1
+user model prov 1
+user mov 1
+user navig 2
+user nod 1
+user object 1
+user object orient 1
+user of loc 1
+user of mar 1
+user of object 1
+user of softwar 1
+user oper 1
+user opin 1
+user or connect 1
+user or ent 1
+user or system 1
+user perc 1
+user percept 3
+user perform 1
+user pl 1
+user point 1
+user popl 2
+user prior 1
+user prior knowledg 1
+user prob know 1
+user proc 2
+user proc act 1
+user profil 1
+user program 2
+user provid sem 1
+user refer 1
+user refer manu 1
+user remember 1
+user report 1
+user report ver 1
+user request 1
+user request cs.umd.edu 1
+user requir 2
+user rol 1
+user rol author 1
+user rol ba 1
+user s act 1
+user s cur 1
+user s definit 1
+user s disp 1
+user s exper 1
+user s foc 1
+user s interact 1
+user s knowledg 1
+user s over 1
+user s prefer 1
+user s select 1
+user s styl 1
+user select 1
+user should tak 1
+user simp 1
+user simp ch 1
+user simp click 1
+user spac 1
+user specif 4
+user specif distribut 1
+user specif number 1
+user specif seed 1
+user specif usag 1
+user st 1
+user stimulus 1
+user suppl 2
+user suppl numer 1
+user suppl parameter 1
+user support 1
+user tailor 1
+user tailor explan 1
+user termin 1
+user termin inclus 1
+user termin1 1
+user test 1
+user th ch 1
+user that cl 1
+user then dec 1
+user tim 2
+user to achief 1
+user to adjust 1
+user to control 1
+user to def 2
+user to explicit 1
+user to explor 1
+user to forg 1
+user to ge 1
+user to interact 1
+user to issu 1
+user to load 1
+user to modif 1
+user to navig 2
+user to search 1
+user to select 1
+user to specif 1
+user to think 1
+user to understand 1
+user to view 1
+user traff 1
+user trigger 1
+user trigger batch 1
+user typ 1
+user typ mar 1
+user unexpect 1
+user unexpect want 1
+user using 1
+user usu remain 1
+user vi fact 1
+user view 1
+user viewpoint 1
+user viewport 1
+user visu 1
+user visu ment 1
+user walk 1
+user want 1
+user wh ext 1
+user wh know 1
+user wh switch 1
+user when solut 1
+user wil find 1
+user wil look 1
+user wil writ 1
+user with intuit 1
+user with respect 1
+user with tim 1
+user work 1
+user workshop 2
+user would find 1
+user would id 1
+user would know 1
+user. 1
+userg.html 1
+userinterfac 1
+userinterfac prov 1
+usertask 1
+usertask task 1
+userview 1
+usesort 1
+using 125
+using 8k 1
+using 8k by 1
+using a bar 1
+using a bin 1
+using a boolean 1
+using a builtin 1
+using a cal 1
+using a canon 1
+using a caus 1
+using a cl 1
+using a collect 2
+using a compl 1
+using a comput 1
+using a computer 1
+using a constraint 1
+using a context 1
+using a conv 1
+using a custom 1
+using a debug 1
+using a dec 1
+using a del 1
+using a depth 1
+using a destruc 1
+using a direct 1
+using a distribut 1
+using a dual 1
+using a fl 1
+using a fluid 1
+using a framework 1
+using a gener 2
+using a genet 1
+using a glob 1
+using a greed 1
+using a guard 1
+using a hand 1
+using a hash 2
+using a heart 1
+using a libr 1
+using a loc 1
+using a lock 1
+using a log 1
+using a look 1
+using a me 2
+using a med 1
+using a meter 1
+using a minidescript 1
+using a minim 2
+using a model 1
+using a modif 2
+using a na 1
+using a nov 1
+using a number 1
+using a parallel 1
+using a pen 1
+using a per 1
+using a perspect 1
+using a point 1
+using a pr 1
+using a program 1
+using a proof 1
+using a protocol 1
+using a pseud 1
+using a psw 1
+using a publ 1
+using a qualit 2
+using a random 1
+using a rang 1
+using a rat 1
+using a reduc 1
+using a reflect 2
+using a regl 1
+using a repertoir 1
+using a resolut 1
+using a rl 1
+using a scenar 1
+using a se 3
+using a self 1
+using a separ 2
+using a sequ 3
+using a ser 1
+using a shar 1
+using a simil 3
+using a simpl 4
+using a simpler 1
+using a singl 4
+using a slight 1
+using a st 2
+using a standard 1
+using a stat 1
+using a styl 1
+using a system 2
+using a techniqu 1
+using a textur 1
+using a tot 1
+using a tr 1
+using a triangl 1
+using a tur 1
+using a var 3
+using a wareh 1
+using a weight 1
+using a wid 1
+using abstract 2
+using abstract interpr 1
+using abstract proper 1
+using acc 1
+using adapt 2
+using adapt dist 1
+using adapt sub 1
+using addit 1
+using addit synchron 1
+using adv 1
+using adv interconnect 1
+using al avail 1
+using algorithm 4
+using algorithm kind 1
+using alignm 1
+using altern 1
+using altern relationship 1
+using an actu 1
+using an adapt 1
+using an approach 1
+using an appropr 1
+using an argum 1
+using an auxil 1
+using an exampl 1
+using an exp 1
+using an expan 1
+using an input 1
+using an intellig 1
+using an interpr 1
+using an optim 1
+using an overview 1
+using and port 1
+using ansawar 1
+using any caus 1
+using any edg 1
+using any me 1
+using any nod 1
+using any run 1
+using apostroph 1
+using apostroph graph 1
+using appl 1
+using appl specif 1
+using appropr 1
+using approxim 2
+using approxim preserv 1
+using approxim string 1
+using attribut 2
+using attribut symbol 1
+using attribut timestamp 1
+using audit 1
+using audit trail 1
+using autom 1
+using avail 1
+using avail mechan 1
+using aver 1
+using b1 1
+using ba 1
+using ba synchron 1
+using back propag 1
+using bal 1
+using bal configur 1
+using bar 1
+using bar method 1
+using bdeg 1
+using better encod 1
+using bi 1
+using bin 4
+using bin dec 1
+using bin search 1
+using bin spac 1
+using bin variabl 1
+using bit 1
+using bit string 1
+using bool 1
+using bool lem 1
+using boolean 1
+using boolean satisf 1
+using both distribut 1
+using both softwar 1
+using both techniqu 1
+using bound 2
+using bound point 1
+using brodatz 1
+using brodatz textur 1
+using buffer 1
+using buffer accompan 1
+using built 2
+using c cn 1
+using center 1
+using center point 1
+using centr 1
+using centr buffer 1
+using certain funct 1
+using chernoff 1
+using chernoff bound 1
+using cl 5
+using cl cl 1
+using cl forml 1
+using cl loop 1
+using cl method 1
+using cl stat 1
+using cl test 1
+using cluster 1
+using cluster siz 1
+using coarser 1
+using coarser grain 1
+using color 1
+using color histogram 1
+using com 1
+using commod 1
+using commod hardwar 1
+using comp 1
+using comp compon 1
+using compl 1
+using compl dispar 1
+using comput 1
+using comput nod 1
+using condit 1
+using conflict 1
+using conflict typ 1
+using connect 1
+using connectiv 1
+using constraint 2
+using constraint satisf 1
+using constraint technolog 1
+using context 1
+using context inform 1
+using control 1
+using control dep 1
+using conv 2
+using conv comput 1
+using conv softwar 1
+using corol 1
+using correl 1
+using csim 1
+using cut 1
+using dat 3
+using dat partit 1
+using dat structur 1
+using dataflow 3
+using dataflow an 1
+using dataflow comput 2
+using dec 1
+using dec integr 1
+using decluster 1
+using decluster method 1
+using defcondit 1
+using deficit 1
+using definit 2
+using dejavu2 1
+using dejavu2 sav 1
+using dep 1
+using dep flow 1
+using differ 1
+using differ comput 1
+using differ configur 1
+using differ empir 1
+using differ number 1
+using differ primitiv 1
+using differ sen 1
+using differ techniqu 1
+using differ traff 1
+using dijkstr 1
+using dijkstr shortest 1
+using direct 2
+using direct csg 1
+using direct method 1
+using dk 1
+using dot 1
+using dot plotter 1
+using dual 1
+using dual number 1
+using dynam 1
+using dynam load 1
+using dynam loadb 1
+using each reduc 1
+using ec 5
+using ec capabil 1
+using ec cl 1
+using ec log 1
+using ec test 1
+using ec typ 1
+using edb 1
+using edb pr 1
+using edg 2
+using edit 1
+using edit dat 1
+using eff 1
+using eff me 1
+using either shar 1
+using elabor 1
+using elabor stat 1
+using elastomer 2
+using elastomer connect 2
+using eqn 1
+using equ 5
+using equ dynam 1
+using error 1
+using error correct 1
+using evolut 1
+using evolut program 1
+using exp 2
+using experim 1
+using expr 1
+using expr link 1
+using extern 1
+using fe 1
+using fe edg 1
+using fin 1
+using fin grain 1
+using finit 1
+using finit boolean 1
+using first fail 1
+using fl 1
+using fl parallel 1
+using flood 1
+using forml 1
+using four 1
+using four motzkin 1
+using four sequ 1
+using fr 1
+using fr variabl 1
+using fract 1
+using funct 2
+using funct decomposit 1
+using funct design 1
+using fundam 1
+using fundam featur 1
+using gabor 2
+using gabor filer 1
+using gabor filter 1
+using genet 1
+using genet algorithm 1
+using geograph 1
+using geograph inform 1
+using gib 1
+using gib sampl 1
+using gklr 1
+using glob 1
+using glob level 1
+using gr 1
+using grad 1
+using grad optim 1
+using graph 1
+using graph theor 1
+using graylevel 1
+using graylevel grad 1
+using hardwar 2
+using hardwar register 1
+using heap 1
+using heap con 1
+using hem 1
+using heur 2
+using heur techniqu 1
+using high 2
+using high bandwidth 1
+using high order 1
+using hint 1
+using horizont 1
+using horizont laser 1
+using idb 1
+using idb pr 1
+using ident 1
+using im 1
+using im addr 1
+using in verif 1
+using incp 1
+using indomain 1
+using indomain label 1
+using inform 1
+using inform extract 1
+using inherit 2
+using inherit hierarch 1
+using int 1
+using integr 1
+using integr patternmatch 1
+using intellig 1
+using intellig memor 1
+using interchang 1
+using interchang color 1
+using intr 1
+using intr cluster 1
+using intrin 1
+using intrin proper 1
+using introspect 1
+using introspect me 1
+using introspect reason 1
+using intuit 1
+using intuit not 1
+using ip 2
+using ip method 1
+using ip multicast 1
+using isvl 1
+using isvl compar 1
+using it integr 1
+using it qualif 1
+using it worker 1
+using k chang 1
+using k jffl 1
+using k lot 1
+using k separ 1
+using knowledg 2
+using knowledg ba 1
+using knowledg engineer 1
+using krusk 1
+using krusk algorithm 1
+using larg batch 1
+using larg cluster 1
+using larg window 1
+using larger 1
+using larger cluster 1
+using larger proc 1
+using larger processorcluster 1
+using lat 1
+using law 1
+using law b.1 1
+using law b.4 1
+using law b.5 1
+using le 1
+using le cc 1
+using le number 1
+using le string 1
+using least squar 1
+using lem 3
+using lin 3
+using lin featur 1
+using lin scan 1
+using link 1
+using link distribut 1
+using list 1
+using liv 1
+using liv contact 1
+using loc 5
+using loc commun 1
+using loc direct 1
+using loc inform 1
+using loc neighbor 1
+using loc propag 1
+using loc satisf 1
+using lock 1
+using lock perm 1
+using log 1
+using long term 1
+using lower 1
+using lower level 1
+using loworder 1
+using loworder walsh 1
+using mar 1
+using march 1
+using march tetrahedr 1
+using match 1
+using mathem 1
+using matr 1
+using me 3
+using me constraint 1
+using me pa 1
+using me xp 1
+using memor 1
+using memor renam 1
+using merg 2
+using merg sort 1
+using method 1
+using metropol 1
+using metropol test 1
+using minim 2
+using minim degr 1
+using minim span 1
+using modl 1
+using modl specif 1
+using mor concr 1
+using motif 1
+using mp 1
+using mp demonstr 1
+using mp waitsom 1
+using mult 5
+using mult dim. 1
+using mult mod 1
+using mult rat 1
+using mult ver 1
+using multidest 1
+using multidest me 1
+using multipl 3
+using multipl inherit 1
+using multipl red 1
+using multipl server 1
+using multiport 1
+using multiport encod 1
+using multisect 1
+using n indep 1
+using n poc 1
+using narrow 3
+using narrow channel 2
+using neg 1
+using neg acknowledg 1
+using neur 2
+using neur network 2
+using nit 1
+using nit st 1
+using no 1
+using no reduc 1
+using non 1
+using non atom 1
+using norm 1
+using norm liter 1
+using novel 1
+using novel abstract 1
+using object 2
+using object orient 2
+using observ 1
+using oe 1
+using off theshelf 1
+using ol 1
+using ol autom 1
+using old 1
+using old inform 1
+using on extr 1
+using on network 1
+using on se 1
+using on tim 1
+using onl const 1
+using onl construc 1
+using onl inform 1
+using onl triangl 1
+using op 1
+using op 1s 1
+using open quest 1
+using oper 1
+using opt 1
+using opt fiber 1
+using order 1
+using order partit 1
+using ordin 1
+using ordin heap 1
+using ordin heapsort 1
+using origin 1
+using orthonorm 1
+using orthonorm matr 1
+using other langu 1
+using other visu 1
+using our algorithm 1
+using our approach 1
+using our forml 1
+using our fpg 1
+using our method 1
+using our min 1
+using our multigraph 1
+using our multilevel 1
+using our program 1
+using our result 1
+using overlap 1
+using overlap hierarch 1
+using pack 1
+using pair 1
+using parallel 2
+using parallel count 1
+using parallel siml 1
+using parameter 1
+using part 3
+using part equiv 1
+using part evalu 1
+using part evaul 1
+using part match 1
+using pattern 1
+using pattern match 1
+using pbm 1
+using pcct 1
+using peripher 2
+using peripher pinout 2
+using platform 1
+using platform indep 1
+using plaus 1
+using plaus explan 1
+using point 2
+using pp 1
+using pp bin 1
+using pr 1
+using pr cach 1
+using precc 1
+using prev 1
+using prev comput 1
+using proc 5
+using proc cach 1
+using proc cluster 1
+using proc enh 1
+using proc tim 1
+using procedur 1
+using program 2
+using program dep 1
+using proport 1
+using proport wider 1
+using prov 1
+using prov correct 1
+using quadr 1
+using quadr error 1
+using queu 2
+using r tr 1
+using rad 1
+using rad sort 1
+using random 3
+using random decluster 1
+using random match 1
+using random number 1
+using reader 2
+using real appl 1
+using real polynom 1
+using real program 1
+using real workload 1
+using recur 3
+using recur network 1
+using recur neur 2
+using recur procedur 1
+using reducead 1
+using reduceand 1
+using refer 1
+using refer vect 1
+using regl 1
+using regl spac 1
+using rel 1
+using repeat 1
+using repeat bool 1
+using report 1
+using report me 1
+using result 1
+using return 1
+using rl 1
+using rm 1
+using rm match 1
+using rmsp 1
+using roundtrip 1
+using roundtrip tim 1
+using rt3 1
+using s tran 1
+using sa 1
+using saf 1
+using saf test 1
+using scan 1
+using scan light 1
+using se 1
+using se protocol 1
+using search 1
+using search techniqu 1
+using secon order 1
+using sem 3
+using sem differ 1
+using sem distribut 1
+using sem knowledg 1
+using separ 1
+using separ measur 1
+using setter 1
+using setter upd 1
+using sev 1
+using sev exper 1
+using shadow 1
+using shadow part 1
+using simil 1
+using simil techniqu 1
+using siml 2
+using siml experim 1
+using simpl 1
+using simpl featur 1
+using simpler 1
+using simpler el 1
+using singl 4
+using singl inherit 1
+using singl proc 1
+using singl writer 1
+using siz 1
+using sl 1
+using slot 1
+using slot descript 1
+using smaller 1
+using smaller cluster 1
+using smd 1
+using smd technolog 1
+using smith 1
+using soft 1
+using soft dec 1
+using som dist 1
+using som exampl 1
+using som fic 1
+using som number 1
+using sorcerer 1
+using spat 1
+using spat rel 1
+using spec ver 1
+using specl 1
+using specl comput 1
+using spf 1
+using spf brdcast 1
+using split 1
+using standard 3
+using standard prolog 1
+using standard protocol 1
+using standard techniqu 1
+using standard ttl 1
+using statechart 1
+using stil larger 1
+using structur 1
+using subject 1
+using subject reduc 1
+using suboptim 1
+using suboptim solut 1
+using substitut 1
+using such featur 1
+using such unrestrict 1
+using such worm 1
+using surfac 2
+using surfac pinout 2
+using sv 1
+using sv appropr 1
+using swap 1
+using swap instruc 1
+using switch 1
+using system 3
+using system decluster 1
+using system gener 1
+using tag 1
+using tag schem 1
+using tcp 1
+using tcp sock 1
+using tdfg 1
+using techniqu 3
+using tel 1
+using tel typ 1
+using text 1
+using text descript 1
+using textur 1
+using textur an 1
+using th 16x 1
+using th 3d 1
+using th abbrev 1
+using th abstract 1
+using th act 1
+using th algorithm 6
+using th altern 1
+using th appl 1
+using th approach 1
+using th appropr 2
+using th arithm 1
+using th assoc 1
+using th assum 2
+using th avail 1
+using th ba 1
+using th background 1
+using th bitstr 1
+using th boolean 1
+using th branch 1
+using th button 1
+using th cancel 1
+using th categor 1
+using th caus 1
+using th centr 1
+using th character 1
+using th chernoff 1
+using th cl 2
+using th clp 1
+using th cod 1
+using th comp 1
+using th compl 1
+using th compon 1
+using th composit 1
+using th concept 2
+using th condit 1
+using th conjug 1
+using th connect 1
+using th connectiv 1
+using th conver 1
+using th cost 1
+using th cpn 1
+using th criter 1
+using th cur 1
+using th dat 1
+using th decluster 1
+using th defgener 1
+using th definit 3
+using th defmethod 1
+using th defstruc 1
+using th demeter 1
+using th diphthong 1
+using th direct 1
+using th dist 1
+using th dither 1
+using th divideand 1
+using th dsj 1
+using th earl 2
+using th edb 1
+using th educ 1
+using th empl 1
+using th encod 1
+using th erg 1
+using th ev 1
+using th experim 1
+using th fact 3
+using th fast 1
+using th featur 1
+using th fil 1
+using th finit 1
+using th fish 2
+using th fluid 1
+using th fortran 1
+using th framework 1
+using th funct 3
+using th gener 2
+using th giv 1
+using th gklr 1
+using th glyph 1
+using th graph 1
+using th grid. 2
+using th gt 1
+using th hash 1
+using th he 1
+using th heur 1
+using th hewl 1
+using th hierarch 1
+using th hist 1
+using th hvdm 1
+using th hyperplan 1
+using th idb 1
+using th ident 1
+using th imag 1
+using th inform 2
+using th init 1
+using th initarg 1
+using th initform 1
+using th input 1
+using th instruc 1
+using th int 1
+using th interfac 1
+using th internet 1
+using th ip 1
+using th iter 1
+using th kar 1
+using th keyword 1
+using th kitlog 1
+using th langu 1
+using th lapack 1
+using th lat 1
+using th laz 1
+using th left 1
+using th lem 1
+using th libr 1
+using th lin 1
+using th list 2
+using th load 1
+using th loc 2
+using th log 2
+using th map 1
+using th maspar 1
+using th matr 1
+using th maxim 1
+using th me 1
+using th method 2
+using th min 1
+using th mlr 1
+using th model 2
+using th modif 2
+using th mous 1
+using th mov 2
+using th n1 1
+using th n2 1
+using th nearest 1
+using th network 2
+using th nin 1
+using th nod 1
+using th non 1
+using th nonpair 1
+using th not 2
+using th observ 1
+using th old 1
+using th omeg 1
+using th oper 3
+using th optim 1
+using th order 1
+using th orl 1
+using th orthonorm 1
+using th os 1
+using th output 1
+using th pandemon 1
+using th parameter 1
+using th particl 1
+using th pattern 3
+using th phr 1
+using th pip 1
+using th prev 2
+using th prim 1
+using th principl 1
+using th problem 1
+using th produc 1
+using th program 3
+using th prompter 1
+using th proof 1
+using th prop 1
+using th proper 2
+using th proposit 1
+using th prototyp 1
+using th pvm 1
+using th qu 1
+using th rayshad 1
+using th reach 1
+using th reader 1
+using th receiv 1
+using th refin 1
+using th regl 1
+using th replac 1
+using th result 3
+using th rl 2
+using th rm 1
+using th rout 2
+using th router 1
+using th ruler 1
+using th scal 1
+using th schem 1
+using th se 3
+using th serv 1
+using th setter 1
+using th siftdown 1
+using th sign 1
+using th singl 1
+using th slot 1
+using th smalltalk 1
+using th sock 1
+using th soft 1
+using th sort 1
+using th span 1
+using th spat 1
+using th specif 1
+using th specl 1
+using th split 1
+using th srtc 1
+using th st 1
+using th staightfor 1
+using th standard 4
+using th stat 1
+using th strateg 1
+using th subject 1
+using th sun 2
+using th synchron 1
+using th system 2
+using th tag 1
+using th techniqu 5
+using th tempor 1
+using th theor 1
+using th thesaurus 1
+using th third 1
+using th timesl 1
+using th tool 1
+using th top 1
+using th transform 1
+using th transit 1
+using th trickledown 1
+using th undecim 1
+using th uniform 2
+using th valu 3
+using th visu 1
+using th wavefront 1
+using th web 1
+using th weight 1
+using th worst 1
+using that grammar 1
+using that ind 1
+using their reserv 1
+using theorem 4
+using thr probabil 1
+using thread 1
+using thread valu 1
+using tim 1
+using tim del 1
+using tool 2
+using tor 1
+using tor angl 1
+using tpm 1
+using tr 2
+using tr norm 2
+using tradit 2
+using tradit nest 1
+using tradit oper 1
+using transit 1
+using triangl 1
+using triangl heap 1
+using tupl 1
+using tupl timestamp 1
+using tw approach 1
+using tw inst 1
+using tw redirect 1
+using uid 1
+using unicast 1
+using unicast me 1
+using unidirect 1
+using unidirect mult 1
+using unif 1
+using unif instead 1
+using uniform 1
+using uniform traff 1
+using uniproc 1
+using uniproc cpus 1
+using unit 1
+using unit quatern 1
+using upd 2
+using upd me 1
+using var 1
+using var quer 1
+using vdm 1
+using vect 2
+using vect me 1
+using vect quant 1
+using ver 1
+using ver laser 1
+using virtu 2
+using virtu cl 1
+using virtu funct 1
+using visu 1
+using visu ba 1
+using wavel 2
+using wavel decomposit 1
+using wavel pack 1
+using wavel threshold 1
+using wavel transform 1
+using weight 1
+using weight dec 1
+using wel kind 1
+using wgp 1
+using what petr 1
+using wid 1
+using wider 3
+using wider channel 3
+using width 1
+using work 1
+using work transfer 1
+using writ 2
+using writ ahead 2
+usl 1
+usl and dsl 1
+usl oper 1
+usl oper form 1
+usl.123 1
+usl.123 usl.128totinf 1
+usl.123 usl.128totinf schedl2 1
+usl.128 1
+usl.128totinf 1
+usl.128totinf schedl2 1
+usl.128totinf schedl2 schedl1 1
+uspecif 1
+uspecif annot 1
+ussr 1
+ussr acad 1
+usu 30
+usu and parallel 1
+usu and reduc 1
+usu axiom 1
+usu b tr 1
+usu constraint 1
+usu constraint domain 1
+usu definit 1
+usu fac 1
+usu form 1
+usu funct 1
+usu funct requir 1
+usu geometer 1
+usu geometer featur 1
+usu heap 1
+usu heap algorithm 1
+usu if funct 1
+usu in distribut 1
+usu in pr 1
+usu log 2
+usu log connectiv 1
+usu log proper 1
+usu me 1
+usu me schedl 1
+usu mod 1
+usu mod oper 1
+usu not 3
+usu on cycl 1
+usu postf 1
+usu postf not 1
+usu proper 2
+usu reduc 1
+usu repr 1
+usu ri 1
+usu ri consider 1
+usu schem 1
+usu schem con 1
+usu situ 1
+usu softwar 1
+usu softwar implem 1
+usu stat 1
+usu stat not 1
+usu structur 1
+usu structur rl 1
+usu transl 1
+usu transl lookasid 1
+usu typ 1
+usu vect 1
+usu vect si 1
+usu vi 1
+usu vi mechan 1
+usu we assum 1
+usu workload 1
+usuel 2
+usuel ain 1
+usuel ain qu 1
+usuel en 1
+usuel en trait 1
+usv 1
+usvusv 1
+ut 9
+ut a la 1
+ut a lec 1
+ut a prior 1
+ut additionnel 1
+ut additionnel de 1
+ut adopt 1
+ut adopt ee 1
+ut aux 1
+ut aux appl 1
+ut comput 1
+ut comput labor 1
+ut d epen 1
+ut dacc 1
+ut dacc es 1
+ut dan 1
+ut de 4
+ut de ce 1
+ut de commun 2
+ut de fabr 1
+ut de fonct 1
+ut de gest 2
+ut de instruc 1
+ut de inv 1
+ut de la 2
+ut de lappel 1
+ut de lat 1
+ut de lop 1
+ut de mi 1
+ut de rev 1
+ut de syst 1
+ut de trait 1
+ut de typ 1
+ut de variabl 1
+ut denv 1
+ut denv dun 1
+ut dic 1
+ut dic ecut 1
+ut dont la 1
+ut dordonnanc 1
+ut dun 2
+ut dun conflit 1
+ut dun mi 1
+ut dus 2
+ut dus au 1
+ut dus aux 1
+ut dutil 1
+ut dutil de 1
+ut ec 2
+ut ec dan 1
+ut ec ma 1
+ut en 1
+ut en temp 1
+ut engendr 1
+ut entrain 1
+ut est 1
+ut est de 1
+ut et de 1
+ut et la 1
+ut et le 1
+ut li 1
+ut loc 1
+ut loc correspon 1
+ut m emoir 1
+ut maxim 1
+ut maxim de 1
+ut maxim du 1
+ut maximaux 1
+ut maximaux dan 1
+ut maximaux de 1
+ut maximaux diff 1
+ut maximaux sur 1
+ut mesur 1
+ut mesur es 1
+ut moindr 1
+ut moindr gr 1
+ut nest 1
+ut nest pa 1
+ut nl 1
+ut nl pour 1
+ut par 1
+ut par el 1
+ut posit 1
+ut potentiel 1
+ut potentiel de 1
+ut qu 2
+ut qu minimiser 1
+ut qu op 1
+ut r eduit 2
+ut r eel 1
+ut raison 1
+ut relatif 1
+ut rien 1
+ut sont 1
+ut sont assez 1
+ut suppl 2
+ut suppl ementair 2
+ut torgerson 1
+ut torgerson gower 1
+ut ut 1
+ut ut ut 1
+ut ut.ca.cz 1
+ut utut 1
+ut.ca.cz 1
+utah 5
+utant 1
+utant dan 1
+utant dan le 1
+utent 1
+utent maint 1
+utent maint soit 1
+uter 1
+uter deux 1
+uter deux conflit 1
+uteus 3
+uteus dan 1
+uteus dan un 1
+uteus en 2
+uteus en comparaison 1
+uteus est 1
+uteus est util 1
+uteus si 1
+uteus si el 1
+uteux 2
+uteux en 1
+uteux en temp 1
+uteux et suscept 1
+uteux pour 1
+uteux pour etr 1
+utgoff 1
+util 45
+util a chaqu 1
+util a computerb 1
+util a fair 1
+util a funct 1
+util a la 1
+util a network 1
+util al avail 1
+util alor 1
+util alor un 1
+util and remain 1
+util and robust 1
+util au 2
+util au besoin 1
+util au moin 1
+util bandwidth 1
+util ce 1
+util ce mod 1
+util ce vecteur 1
+util cheap 1
+util cheap writeonc 1
+util cl 1
+util com 1
+util com boucl 1
+util com compl 1
+util compar 1
+util compl 1
+util context 1
+util context inform 1
+util curv 1
+util curv correspon 1
+util dan 2
+util dan kcm 1
+util dan la 1
+util dan le 1
+util dan un 1
+util de 5
+util de algorithm 1
+util de ce 1
+util de cop 1
+util de dir 1
+util de disjonct 1
+util de div 1
+util de donner 1
+util de facilit 1
+util de grain 1
+util de la 1
+util de lenviron 1
+util de mot 1
+util de param 1
+util de register 1
+util de techniqu 3
+util de test 1
+util de variabl 1
+util detail 1
+util detail anatom 1
+util deux 2
+util deux techniqu 1
+util difficil 1
+util difficil compat 1
+util dun 2
+util dun dilat 1
+util dun drapeau 1
+util dun prim 1
+util dynam 1
+util dynam log 1
+util e ce 1
+util e com 1
+util e dan 3
+util e de 1
+util e du 1
+util e jusquau 1
+util e la 1
+util e le 1
+util e par 1
+util e pour 3
+util ee 4
+util ee au 1
+util ee aux 1
+util ee avec 1
+util ee car 1
+util ee com 2
+util ee con 1
+util ee couram 1
+util ee dan 4
+util ee de 1
+util ee en 2
+util ee ic 1
+util ee lor 2
+util ee par 2
+util ee peut 1
+util ee pour 3
+util ee prochain 1
+util ee quand 1
+util ee suiv 1
+util effect 1
+util en 2
+util en dehor 1
+util en tant 1
+util es 5
+util es avec 1
+util es car 1
+util es chap 1
+util es ci 1
+util es com 1
+util es dan 3
+util es en 1
+util es facil 1
+util es lor 1
+util es ont 1
+util es pour 4
+util es sont 1
+util es sur 1
+util essentiel 1
+util essentiel lalphab 1
+util est 1
+util est influenc 1
+util et cr 1
+util et est 1
+util et inutil 1
+util et qu 1
+util for extern 2
+util fuzz 1
+util fuzz dec 1
+util high level 1
+util hybrid 1
+util hybrid search 1
+util in determin 1
+util in fl 1
+util in order 1
+util incr 1
+util is obtain 1
+util judicieus 1
+util judicieus de 1
+util la 4
+util la bin 1
+util la connec 1
+util la fonct 1
+util la pag 1
+util la prem 1
+util la prim 1
+util la proposit 1
+util la sp 1
+util la substitut 1
+util la syntac 1
+util la techniqu 1
+util la th 1
+util la triangl 1
+util lalgorithm 1
+util lalgorithm de 1
+util lalgorithm standard 1
+util le 4
+util le adr 1
+util le algorithm 1
+util le corollair 1
+util le deux 1
+util le diff 1
+util le fait 1
+util le fonct 1
+util le instruc 1
+util le not 2
+util le nouveau 1
+util le optim 1
+util le program 1
+util le protocol 1
+util le regroup 1
+util le techniqu 1
+util le test 1
+util le th 1
+util lead 1
+util lidentit 1
+util lop 1
+util lop erateur 1
+util mor effect 1
+util network 1
+util network bandwidth 1
+util network bisect 1
+util network resourc 1
+util norm 1
+util norm le 1
+util of glp 1
+util of memor 1
+util of network 1
+util par 1
+util par contr 1
+util parcimonieus 1
+util parcimonieus avec 1
+util pour 3
+util pour cel 1
+util pour estimer 2
+util pour guider 1
+util pour la 1
+util pour le 1
+util pour point 1
+util problem 1
+util profil 1
+util rar 1
+util rar dan 1
+util regl 1
+util regl commun 1
+util s cliniqu 1
+util s ur 1
+util sont 1
+util sont le 1
+util such incr 1
+util tak 1
+util th algorithm 1
+util th knowledg 1
+util th link 1
+util th part 1
+util th theor 1
+util un 2
+util un architectur 1
+util un bloc 1
+util un classif 1
+util un cod 1
+util un coh 1
+util un con 1
+util un cop 1
+util un dilat 1
+util un etiqu 1
+util un interpr 1
+util un mod 1
+util un modif 1
+util un nouveau 1
+util un partit 1
+util un prim 1
+util un processus 1
+util un protocol 1
+util un regroup 1
+util un tabl 1
+util un technolog 1
+util un unit 1
+util valu 1
+util valu exceed 1
+util wh 1
+utilidad 1
+utilidad do 1
+utilidad do iten 1
+utilidad observ 1
+utilidad observ na 1
+utilisabl 2
+utilisabl dan 1
+utilisabl dan un 1
+utilisabl par 1
+utilisabl par de 1
+utilisateur 1
+utilisateur de 1
+utilisateur de distribut 1
+utilisateur et le 1
+utiliser 5
+utiliser avec 1
+utiliser avec discern 1
+utiliser ce 1
+utiliser ce sauvegard 1
+utiliser dan 1
+utiliser dan tout 1
+utiliser direct 2
+utiliser direct la 1
+utiliser direct le 1
+utiliser la 2
+utiliser la localit 1
+utiliser le 2
+utiliser le diff 1
+utiliser le possibilit 1
+utiliser le potentiel 1
+utiliser pen 1
+utiliser pen la 1
+utiliser plusieur 1
+utiliser plusieur fo 1
+utiliser pour 2
+utiliser pour estimer 1
+utiliser pour etud 1
+utiliser pour la 1
+utiliser pour voir 1
+utiliser quand 1
+utiliser quelqu 1
+utiliser un 2
+utiliser un pour 1
+utiliser un techniqu 1
+utiliserait 1
+utiliserait un 1
+utiliserait un sel 1
+utiliseron 3
+utiliseron dan 1
+utiliseron dan ce 1
+utiliseron de 1
+utiliseron de pr 1
+utiliseron egal 2
+utiliseron egal dan 1
+utiliseron egal le 1
+utiliseron ic 1
+utiliseron ic un 1
+utilison 3
+utilison ce 1
+utilison dan 2
+utilison dan ce 1
+utilison dan lintroduc 1
+utilison ic 1
+utilison ic la 1
+utilison le 1
+utilison le th 1
+utilison pour 1
+utilison pour cel 1
+utilison un 2
+utilison un adapt 1
+utilison un distribut 1
+utilison un siml 1
+utilit 2
+utilit mathem 1
+utiliz 2
+utiliz hierarch 1
+utiliz hierarch order 1
+utiliz spectr 1
+utiliz spectr partit 1
+utk 1
+utk paper 1
+utk paper latbw 1
+utmost 1
+utmost import 1
+utrecht 2
+utru 1
+utter 3
+utter involut 1
+utut 1
+uuc 1
+uuc tr 1
+uucp 1
+uustalu 1
+uv 4
+uv and nt 1
+uv ar shorter 1
+uv ch 1
+uv explor 1
+uv found 1
+uv is faster 1
+uv never explor 1
+uv nt 1
+uv nt ne 1
+uv nt uv 1
+uv on extrem 1
+uv on regl 1
+uv treetimestat 1
+uv wx 1
+uv0g 1
+uvg 1
+uvu0 1
+uw 4
+uw cs 1
+uw encl 1
+uw encl exact 1
+uw encl v01 1
+uw is forc 1
+uw is yellow 1
+uw malinowsk 1
+uw must encl 1
+uw u0w0 1
+uw would encl 1
+uw y edg 1
+uw94 1
+uwg 1
+uwirth 1
+ux 3
+ux mac 1
+ux nl 1
+ux nl environm 1
+uy 1
+uy mac 1
+uz 1
+uz tansel 1
+uztb 1
+uztb cunyvm.bitnet 1
+uztb cunyvm.bitnet fac 1
+v.1 2
+v.1 input 1
+v.1 input repr 1
+v.1 st 1
+v.1 st organ 1
+v.2 2
+v.2 block 1
+v.2 block interfac 1
+v.2 network 1
+v.2 network descript 1
+v.3 1
+v.3 find 1
+v.4 1
+v.4 find 1
+v.4 find record 1
+v.5 1
+v.5 compact 1
+v.a 5
+v.e 1
+v0 11
+v0 al hold 1
+v0 and oev 1
+v0 and t0 1
+v0 and v00 1
+v0 ar adjac 1
+v0 ar distinct 1
+v0 in ti 1
+v0 to st 1
+v0 v13 1
+v0 v13 v12 1
+v0 wa correct 1
+v00 2
+v00 and oev 1
+v00 and sequ 1
+v00 ar distinct 1
+v00 in ti 1
+v00 mr 1
+v00 mr v0 1
+v00 v0 1
+v00 with oev 1
+v002 1
+v002 is leaf 1
+v00w 1
+v01 1
+v01 and v02 1
+v02 1
+v06 1
+v0c 1
+v0c strong 1
+v0c strong weak 1
+v0i 1
+v0j 1
+v0n 1
+v0uvu0 1
+v1 25
+v1 8t01 1
+v1 8t01 t1 1
+v1 and t2 1
+v1 and v01 1
+v1 and v2 4
+v1 and w1 1
+v1 ar select 1
+v1 b fal 1
+v1 b nil 1
+v1 con 1
+v1 e strong 1
+v1 e00 1
+v1 e00 strong 1
+v1 e1 1
+v1 en 1
+v1 individu 1
+v1 individu ou 1
+v1 is black 1
+v1 kw 1
+v1 kw v2 1
+v1 nor v2 1
+v1 or v01 1
+v1 or v2 1
+v1 t1 1
+v1 th se 1
+v1 to yield 1
+v1 v1 1
+v1 v1 v2 1
+v1 v14 1
+v1 v2 8
+v1 v2 v1 1
+v1 v2 v2 1
+v1 v2 v3 2
+v1 x v3 1
+v11 1
+v11u1itlm 1
+v12 1
+v13 1
+v13 v12 1
+v14 1
+v15 1
+v16 1
+v17 1
+v1gg 1
+v1i 1
+v1i nor vi2 1
+v1i v2i 1
+v1in 1
+v1in v2in 1
+v1in v2in vout 1
+v1n 1
+v1s 1
+v1v01 1
+v1v01 is darkgreen 1
+v1v2 1
+v1v2v1ii 1
+v1v2v1v2ii 1
+v2 21
+v2 8t02 1
+v2 8t02 t1 1
+v2 and w2 1
+v2 ar leav 1
+v2 at level 1
+v2 b fal 1
+v2 belong 1
+v2 by contract 1
+v2 con 1
+v2 e2 1
+v2 is gr 1
+v2 kr 1
+v2 must ded 1
+v2 or v01 1
+v2 popl 1
+v2 t2 1
+v2 then se 1
+v2 v1 1
+v2 v1 v2 1
+v2 v2 1
+v2 v3 2
+v2 v3 f1 1
+v2 v3 v4 1
+v2 wh 1
+v2 whit 1
+v29 1
+v2axv 1
+v2e 1
+v2g 1
+v2i 2
+v2in 1
+v2in vout 1
+v2in vout din 1
+v2k 1
+v2l 1
+v2n 1
+v2uxv 1
+v2v002 1
+v2v02 1
+v2v02 is green 1
+v2w2 1
+v3 8
+v3 and v4 1
+v3 environ 1
+v3 f1 1
+v3 f1 f2 1
+v3 v4 1
+v3 v4 v5 1
+v3g 1
+v4 4
+v4 and v5 1
+v4 fit 1
+v4 fit ou 1
+v4 in g17t 1
+v4 v5 1
+v4.0 1
+v4.1 1
+v5 2
+v6 1
+v8w 1
+v8w 2y2 1
+v9 1
+va 14
+va avoir 1
+va avoir pour 1
+va changer 1
+va changer de 1
+va choisir 1
+va choisir entr 1
+va clair 1
+va clair etr 1
+va conduir 1
+va cop 1
+va cop la 1
+va correspondr 1
+va correspondr au 1
+va cr 1
+va cr eer 1
+va d efinir 1
+va de 1
+va dir 1
+va dir qu 1
+va donc 2
+va donc appliquer 1
+va donc cherch 1
+va donc etr 1
+va donc pouvoir 1
+va donc sagir 1
+va donc utiliser 1
+va du 1
+va du rec 1
+va etr 1
+va etr empil 1
+va etr util 1
+va femployeeg 1
+va femployeeg vt 1
+va g en 1
+va hadzilac 1
+va heart.mor 1
+va heart.mor heart.sw 1
+va ic 1
+va ic distinguer 1
+va inaeuencer 1
+va inaeuencer le 1
+va juger 1
+va juger de 1
+va orienter 1
+va orienter la 1
+va pa 1
+va pa modif 1
+va pa sortir 1
+va plus loin 1
+va recevoir 1
+va recevoir le 1
+va sagir 1
+va se 1
+va simpl 1
+va simpl pointer 1
+va suivr 1
+va suivr au 1
+va tr 1
+va tr es 1
+va v5 1
+va va 1
+va va vb 1
+va vb 1
+vac 2
+vac posit 1
+vac workst 1
+vacu 1
+vadik 1
+vadik cs.umd.edu 1
+vadik cs.umd.edu pugh 1
+vadim 1
+vadim maslov 1
+vadim maslov william 1
+vag 1
+vag of geograph 1
+vagu 1
+vagu id 1
+vaid 2
+vain 2
+vain de 1
+vain de cherch 1
+vain pour 1
+vain pour aut 1
+val 61
+val a compon 1
+val accord 1
+val algorithm 1
+val allow 1
+val and appropr 1
+val and reason 1
+val and understood 1
+val answer 1
+val ar pr 1
+val as op 1
+val as parameter 1
+val assum 1
+val breazu 1
+val breazu tan 1
+val c expr 1
+val cap 1
+val cliniqu 1
+val color 1
+val color endfor 1
+val convainc 1
+val convainc dun 1
+val correct 1
+val correct de 1
+val dat 1
+val datab 1
+val datab st 1
+val de 3
+val de ce 1
+val de la 1
+val de syst 1
+val dent 1
+val digit 1
+val doit 1
+val doit permettr 1
+val du 2
+val du prem 1
+val du rec 1
+val e ce 1
+val eqn 1
+val er 1
+val er gour 1
+val es 2
+val et intervenir 1
+val exact 1
+val exact qu 1
+val exact tent 1
+val exp 1
+val exp erim 1
+val for height 1
+val for int 1
+val for prob 1
+val for subexpon 1
+val forml 1
+val front 1
+val front en 1
+val gener 1
+val gener accur 1
+val if i2 1
+val iff 1
+val in 3d 1
+val inc 1
+val inc edg 1
+val incr 1
+val incr marker 1
+val is explain 1
+val is model 1
+val key 1
+val key pr 1
+val last chunk 1
+val marker 1
+val marker contain 1
+val match 1
+val method 2
+val mod 1
+val modif 1
+val modif softwar 1
+val nous 1
+val nous perm 1
+val of 3d 1
+val of commun 1
+val of dep 1
+val of high 1
+val of input 1
+val of result 1
+val of softwar 1
+val of subtyp 1
+val of templ 1
+val of test 1
+val on 1
+val our prev 1
+val our result 1
+val over 1
+val over design 1
+val pair 1
+val pattern 1
+val perm 1
+val perm egal 1
+val plein 1
+val plein no 1
+val pointer 1
+val pointer field 1
+val pour 1
+val pour de 1
+val pr 1
+val prob 1
+val prob modif 1
+val probabil 1
+val probabil de 1
+val probabil la 1
+val probabil par 1
+val probabil peut 1
+val probabil qu 1
+val r esid 1
+val rang 1
+val rang halt 1
+val relog 1
+val relog es 1
+val result 1
+val se 1
+val se decr 1
+val se start 1
+val sl1 1
+val sl1 modl 1
+val st 1
+val statistiqu 1
+val statistiqu pour 1
+val step 1
+val substr 1
+val th claim 1
+val th exampl 1
+val th forml 1
+val th model 1
+val th result 1
+val th theor 1
+val through siml 1
+val tim 2
+val tim rel 1
+val trailer 1
+val triangl 1
+val typ 1
+val upd 1
+val upd tim 1
+val user 1
+val using 1
+val using experim 1
+val val 1
+val valu 2
+val with respect 1
+valabl 2
+valabl dan 2
+valabl dan le 1
+valacich 1
+valacich et al 1
+valbon 1
+valbon ced 1
+valbon ced franc 1
+valduriez 1
+valent 1
+valent respectiv 1
+valeur 5
+valeur 2i 1
+valeur 2i entr 1
+valeur a laquel 1
+valeur a tester 1
+valeur absolu 2
+valeur absolu de 1
+valeur absolu du 1
+valeur attr 1
+valeur avec 1
+valeur avec estampil 1
+valeur bool 1
+valeur bool een 1
+valeur bp 1
+valeur classiqu 1
+valeur classiqu sont 1
+valeur com 1
+valeur compteur 1
+valeur correspon 2
+valeur cour 1
+valeur cour du 1
+valeur cp 1
+valeur d er 1
+valeur d etruit 1
+valeur d evalu 1
+valeur dadapt 1
+valeur dan 3
+valeur dan ir 1
+valeur de 5
+valeur de argum 1
+valeur de born 1
+valeur de bp 1
+valeur de ce 1
+valeur de ci 1
+valeur de cof 1
+valeur de congru 1
+valeur de cut 1
+valeur de dan 1
+valeur de i1 1
+valeur de ik 1
+valeur de j0 1
+valeur de l1 1
+valeur de la 3
+valeur de lanc 1
+valeur de largum 1
+valeur de lb 1
+valeur de liaison 1
+valeur de linform 1
+valeur de pgcd 1
+valeur de register 1
+valeur de som 1
+valeur de tb 1
+valeur devrait 1
+valeur devrait etr 1
+valeur diagon 1
+valeur diagon de 1
+valeur don 2
+valeur don ee 1
+valeur don ladr 1
+valeur du 3
+valeur du co 1
+valeur du compteur 1
+valeur du drapeau 1
+valeur du fit 1
+valeur du param 1
+valeur du point 1
+valeur du register 1
+valeur du som 1
+valeur du vecteur 1
+valeur dun 2
+valeur dun aut 1
+valeur dun comp 1
+valeur dun foncteur 1
+valeur dun tel 1
+valeur est 4
+valeur est ch 1
+valeur est critiqu 1
+valeur est don 1
+valeur est effectu 1
+valeur est tr 1
+valeur et le 1
+valeur et qu 1
+valeur et son 1
+valeur excessiv 1
+valeur excessiv elev 1
+valeur exp 1
+valeur exp erim 1
+valeur ff 1
+valeur init 1
+valeur init de 1
+valeur le 2
+valeur le avant 1
+valeur le point 1
+valeur logiqu 1
+valeur logiqu ou 1
+valeur mesur 1
+valeur mesur ee 1
+valeur minim 1
+valeur n eglig 1
+valeur na 1
+valeur num 2
+valeur num eriqu 2
+valeur on se 1
+valeur optim 2
+valeur optim de 1
+valeur optim par 1
+valeur ou 1
+valeur perm 1
+valeur perm de 1
+valeur peut 1
+valeur peut cr 1
+valeur peut etr 1
+valeur positiv 1
+valeur positiv dan 1
+valeur possibl 1
+valeur possibl de 1
+valeur possibl pour 1
+valeur pour 1
+valeur pour i0 1
+valeur pr 3
+valeur pr ec 1
+valeur pr econ 1
+valeur pr par 1
+valeur propr 1
+valeur propr non 1
+valeur qu 1
+valeur quil 1
+valeur quil av 1
+valeur r eel 1
+valeur r esout 1
+valeur respectiv 1
+valeur respectiv de 1
+valeur retourn 1
+valeur retourn ee 1
+valeur singl 1
+valeur singl er 1
+valeur sup 1
+valeur sup erieur 1
+valeur th 1
+valeur th eoriqu 1
+valeur tout 1
+valeur tout lint 1
+valeur un 1
+valeur un aut 1
+valeus 1
+valider 4
+valider ce 1
+valider ce mod 1
+valider est 1
+valider est mod 1
+valider le 1
+valider notr 1
+valider notr mod 1
+valider sexprim 1
+valider sexprim com 1
+valider sur 1
+valider sur de 1
+validit 4
+validit e de 2
+validit e dun 1
+valiv 1
+vallu 1
+valoir 1
+valoir la 1
+valoir la pein 1
+valpar 1
+valu 110
+valu a2 1
+valu a2 va 1
+valu a5 1
+valu a6 1
+valu a7 1
+valu ae 1
+valu ae def 1
+valu after quant 1
+valu ai 1
+valu allow 1
+valu and attribut 1
+valu and chang 1
+valu and covar 1
+valu and ebd 1
+valu and fal 1
+valu and funct 1
+valu and go 1
+valu and integer 1
+valu and nest 1
+valu and number 1
+valu and pol 1
+valu and prev 1
+valu and prob 1
+valu and produc 1
+valu and re. 1
+valu and request 1
+valu and retrief 1
+valu and se 1
+valu and solut 1
+valu and tim 1
+valu and tripl 1
+valu appl 1
+valu ar accept 1
+valu ar artifact 1
+valu ar assign 1
+valu ar avail 1
+valu ar ch 3
+valu ar chang 1
+valu ar compar 2
+valu ar comput 1
+valu ar consider 2
+valu ar defin 1
+valu ar distinct 1
+valu ar equ 1
+valu ar examin 1
+valu ar found 1
+valu ar going 1
+valu ar init 1
+valu ar main 1
+valu ar mark 1
+valu ar order 1
+valu ar pa 1
+valu ar push 1
+valu ar real 1
+valu ar repr 1
+valu ar sent 2
+valu ar shown 1
+valu ar sort 1
+valu ar specif 1
+valu ar st 2
+valu ar tak 2
+valu ar undefin 1
+valu ar uniqu 2
+valu ar writ 1
+valu as follow 1
+valu as op 1
+valu as splitter 1
+valu assoc 4
+valu at addr 1
+valu at loc 1
+valu at system 1
+valu at tim 1
+valu atom 1
+valu attribut 1
+valu attribut becom 1
+valu attribut contain 1
+valu attribut wh 1
+valu attribut x2 1
+valu avail 1
+valu ba 1
+valu ba ar 1
+valu be expr 1
+valu becam 1
+valu becam val 1
+valu becom 2
+valu becom zer 1
+valu being retrief 1
+valu below minp 1
+valu between procedur 1
+valu bj 1
+valu by assign 1
+valu by execut 1
+valu by funct 1
+valu by spec 1
+valu cal smooth 1
+valu chang 1
+valu ci 1
+valu com 3
+valu com disc 1
+valu compon 2
+valu comput 3
+valu connect 1
+valu connect weight 1
+valu correspon 4
+valu de 2
+valu de kcm 1
+valu decomposit 2
+valu denot 2
+valu dep 1
+valu describ 2
+valu determin 1
+valu differ 2
+valu differ meter 1
+valu direct affect 1
+valu dispar 1
+valu displ 1
+valu dk 1
+valu domain 1
+valu ec 1
+valu encod 1
+valu entr 1
+valu entr con 1
+valu equ 1
+valu error 2
+valu error evalu 1
+valu error valu 1
+valu et dealloc 1
+valu et unif 1
+valu exceed 1
+valu exp 1
+valu experim 1
+valu experim tool 1
+valu extract 2
+valu extract valu 1
+valu fal 1
+valu farther 1
+valu field 2
+valu field replac 1
+valu fij 1
+valu for ct 1
+valu for fact 1
+valu for input 1
+valu for n0 1
+valu for numer 1
+valu for oe1 1
+valu for oe2 1
+valu for ok 1
+valu for qsm 1
+valu for respon 1
+valu for t1 1
+valu for tdsp 1
+valu for tim 1
+valu for uj 1
+valu for univer 1
+valu for var 1
+valu for zk 1
+valu found 3
+valu from b0 1
+valu from domain 1
+valu from lp 1
+valu from proc 1
+valu from uniform 1
+valu funct 2
+valu ga 1
+valu gener 3
+valu giv 2
+valu gopt 1
+valu gopt tr 1
+valu greater 1
+valu guar 1
+valu held 1
+valu hypoth 1
+valu imag 1
+valu imag wh 1
+valu in attribut 1
+valu in constraint 1
+valu in f0 1
+valu in order 1
+valu in prev 1
+valu in register 1
+valu in rel 1
+valu in st 1
+valu in tabl 2
+valu in xw 1
+valu incr 1
+valu inform 1
+valu input 1
+valu inser 1
+valu insight 2
+valu int work 1
+valu is accept 1
+valu is ad 1
+valu is adjust 1
+valu is assign 1
+valu is assoc 1
+valu is calcl 1
+valu is ch 1
+valu is consider 1
+valu is determin 1
+valu is du 1
+valu is equ 2
+valu is fic 1
+valu is good 1
+valu is greater 1
+valu is implem 1
+valu is incr 1
+valu is inser 1
+valu is kept 1
+valu is known 1
+valu is l2 1
+valu is list 1
+valu is ox 1
+valu is read 1
+valu is repeat 1
+valu is return 3
+valu is search 1
+valu is sum 1
+valu is sup 1
+valu is susp 1
+valu is unimport 1
+valu is val 1
+valu is writ 1
+valu iter 1
+valu iter init 1
+valu ith 1
+valu ith compon 1
+valu jth 1
+valu jth compon 1
+valu key 1
+valu key st 1
+valu kopt 1
+valu kth 1
+valu kth compon 1
+valu l li 1
+valu lambd 1
+valu lambd calculus 1
+valu learn 1
+valu learn const 1
+valu loc 1
+valu loc queu.inser 1
+valu lock 1
+valu lock dx 1
+valu lock evalu 1
+valu m2 1
+valu map 1
+valu map simil 1
+valu may appear 1
+valu me 1
+valu mean 1
+valu measur 1
+valu method 1
+valu method evalu 1
+valu mid 1
+valu mink2 1
+valu multiplexer 1
+valu n dp 1
+valu n number 1
+valu new st0 1
+valu nil 1
+valu number 1
+valu o0 1
+valu o1 1
+valu obj1 1
+valu obtain 2
+valu occur 1
+valu of 0s 1
+valu of a1 1
+valu of acc 1
+valu of anc 1
+valu of antec 1
+valu of attribut 1
+valu of bal 1
+valu of bfather 1
+valu of cand 1
+valu of canon 1
+valu of chunk 1
+valu of cn 1
+valu of consequ 1
+valu of const 1
+valu of correspon 1
+valu of cr 1
+valu of cur 1
+valu of currexp 1
+valu of currnod 1
+valu of d1 1
+valu of d7 1
+valu of dat 1
+valu of design 1
+valu of dl 1
+valu of drop 1
+valu of el 1
+valu of empl 1
+valu of expr 2
+valu of fewer 1
+valu of ff 1
+valu of figur 1
+valu of fl 1
+valu of form 1
+valu of funct 1
+valu of hist 1
+valu of ib 1
+valu of in 1
+valu of individu 1
+valu of input 1
+valu of inst 1
+valu of ip 1
+valu of j1 1
+valu of jl 1
+valu of lm 1
+valu of lock 1
+valu of marker 1
+valu of maxstep 1
+valu of me 1
+valu of mod 1
+valu of neuron 1
+valu of nil 1
+valu of nod 1
+valu of nr 1
+valu of nt 1
+valu of nw 1
+valu of o1 1
+valu of observabl 1
+valu of oe 2
+valu of output 1
+valu of overlap 1
+valu of p1 2
+valu of pasc 1
+valu of proc 1
+valu of protect 1
+valu of ps 1
+valu of qsm 1
+valu of qu 1
+valu of record 1
+valu of regp 1
+valu of rel 1
+valu of run 1
+valu of select 1
+valu of siml 1
+valu of sin 1
+valu of sl 1
+valu of stat 1
+valu of stop 1
+valu of sw 1
+valu of system 1
+valu of think 1
+valu of tim 2
+valu of tp 1
+valu of ts 1
+valu of un 1
+valu of variabl 2
+valu of ver 1
+valu of xj 1
+valu of xt 1
+valu of y0i 1
+valu of y1 1
+valu of ys 1
+valu of zer 1
+valu on me 1
+valu or discontinu 1
+valu or result 1
+valu or se 1
+valu or sign 1
+valu pa 2
+valu pair 5
+valu parameter 1
+valu parameter mechan 1
+valu part 1
+valu per fact 1
+valu period 1
+valu pi 1
+valu pij 1
+valu po 1
+valu pr 1
+valu produc 1
+valu qj 1
+valu qu 1
+valu qu dan 1
+valu random 2
+valu random var 1
+valu rang 1
+valu rang tim 1
+valu read 2
+valu receiv 1
+valu refer 1
+valu rel 3
+valu repr 2
+valu repr st 1
+valu repr vect 1
+valu resourc 1
+valu return 2
+valu rol 1
+valu rough 1
+valu satisf 1
+valu scan 1
+valu select 2
+valu separ 1
+valu ser 1
+valu shown 1
+valu shown log 1
+valu simil 1
+valu smaller 1
+valu st 3
+valu st vect 1
+valu subject 1
+valu subject gav 1
+valu such test 1
+valu sum 1
+valu susp 1
+valu tel 1
+valu tel quel 1
+valu th object 1
+valu th program 1
+valu th rec 1
+valu th return 1
+valu than singl 1
+valu that origin 1
+valu that result 1
+valu tinit 1
+valu to comp 1
+valu to def 1
+valu to drop 1
+valu to giv 1
+valu to init 1
+valu to inst 1
+valu to precc 1
+valu to proc 1
+valu to variabl 1
+valu tol 1
+valu tool 1
+valu trail 1
+valu under norm 1
+valu uniform 1
+valu uniform distribut 1
+valu using 3
+valu using cl 1
+valu var 1
+valu var fail 1
+valu vect 2
+valu vi 1
+valu visit 1
+valu vj 1
+valu w2 1
+valu wa assign 1
+valu wa log 1
+valu wa rat 1
+valu wa regard 1
+valu wa tr 1
+valu wa writ 1
+valu weight 1
+valu weight mut 1
+valu wer acc 1
+valu wer correct 1
+valu wer ind 1
+valu wh 1
+valu wh cuml 1
+valu when creat 1
+valu when seek 1
+valu when track 1
+valu which describ 1
+valu which ind 1
+valu wil control 1
+valu wil li 2
+valu wil sign 1
+valu writ 3
+valu writ prev 1
+valu x4 1
+valu x4 est 1
+valu x5 1
+valu y0ti 1
+valu y1 1
+valu y2 1
+valu y3 1
+valu y4 1
+valu yn 1
+valu.1 1
+valu.1 therefor 1
+valu0 1
+valuegcopcodeopcodezon 1
+valuegcopcodeopcodezon typezon 1
+valuegcopcodeopcodezon typezon typerddrdsrddrd63615647310radoffsetvalu6356473139635647393152522315r 1
+vam 1
+vam1p 1
+vam1p ba 1
+vam1p ba prolog 1
+van 26
+van caneghem 1
+van dam 2
+van de 2
+van de geijn 1
+van de veld 1
+van den 1
+van den el 1
+van der 5
+van der laag 1
+van der lind 1
+van der meyd 1
+van der poel 1
+van der woud 1
+van deus 1
+van emd 2
+van emd bo 1
+van gelder 3
+van gelder yum 1
+van gucht 1
+van harmel 1
+van hentenryck 3
+van jacobson 1
+van kamp 1
+van leeuw 6
+van leeuw edit 1
+van nostrand 3
+van nostrand reinhold 2
+van rossum 2
+van roy 1
+van roy fus 1
+van roy la 1
+van roy ment 1
+van wijngaard 1
+van wijngaard grammar 1
+van zuyl 1
+vancouver 3
+vanil 1
+vanil con 1
+vanil con tr 1
+vanil xerox 1
+vanil xerox tr 1
+vanish 3
+vanish funct 1
+vanish halt 1
+vanish halt prob 1
+vanish tetrahedr 1
+vanish tetrahedr affect 1
+vannesch 1
+var 119
+var a attribut 1
+var a ecritur 1
+var a eliminer 1
+var a est 1
+var a non 1
+var a number 1
+var a pour 1
+var a un 1
+var a1 1
+var a1 l1 1
+var a2 1
+var a2 cr 1
+var a2 ge 1
+var a2 rang 1
+var a2 se 1
+var a22 1
+var a3 1
+var a3 l3 1
+var a5 1
+var a6 2
+var a7 1
+var a7 l3 1
+var abstract 1
+var abstrait 1
+var academ 1
+var academ sit 1
+var acc 4
+var acc cost 1
+var acc method 1
+var acc tim 1
+var accord 1
+var acr scheduler 1
+var adv 1
+var affaibl 1
+var affaibl de 1
+var ai 2
+var ai na 1
+var ain 1
+var ain qu 1
+var al 2
+var al atoir 1
+var al eatoir 1
+var algorithm 3
+var algorithm describ 1
+var algorithm disc 1
+var algorithm inclus 1
+var altern 1
+var altern offer 1
+var an 1
+var an criter 1
+var an explicit 1
+var and const 1
+var and futur 1
+var and optim 1
+var and reduc 1
+var and symbol 1
+var and typ 1
+var anticip 1
+var anticip answer 1
+var appar 1
+var appar dan 1
+var appear 2
+var appl 1
+var ar 3
+var ar cop 1
+var ar inclus 1
+var ar kept 1
+var ar np 1
+var ar review 1
+var architectur 2
+var architectur model 1
+var arg 1
+var argum 1
+var artif 1
+var artif nonlin 1
+var artifact 1
+var as dynam 1
+var as human 1
+var aspect 4
+var assignm 4
+var assum 1
+var attempt 1
+var attribu 1
+var attribu ee 1
+var attribut 1
+var attribut valu 1
+var avanc 1
+var avanc ee 1
+var b ne 1
+var b tr 1
+var ba 1
+var ba program 1
+var bandwidth 1
+var bandwidth beam 1
+var bcd 1
+var becom 2
+var becom bound 1
+var becom empt 1
+var befor 1
+var beforeq4 1
+var behavior 1
+var being promot 1
+var belong 1
+var between snapshot 1
+var bind 3
+var bind inst 1
+var bind produc 1
+var bind receiv 1
+var bind schem 1
+var bit 1
+var bit rat 1
+var boolean 1
+var boolean domain 1
+var breakdown 1
+var breakdown situ 1
+var built 1
+var c impliqu 1
+var ca 2
+var cal ps 1
+var cancel 1
+var categor 1
+var cel 1
+var character 3
+var chunk 1
+var chunk siz 1
+var ci 1
+var ci dessus 1
+var cl 2
+var claus 1
+var claus var 1
+var cluster 3
+var cluster siz 3
+var cod 1
+var cod artifact 1
+var cod schem 1
+var com 2
+var com dev 1
+var com param 1
+var combin 2
+var commun 1
+var commun mod 1
+var complec 3
+var complec cl 1
+var complec upper 1
+var compr 1
+var compr schem 1
+var computer 2
+var computer avail 1
+var condit 1
+var connu 1
+var connu de 1
+var consider 1
+var constraint 1
+var cont 1
+var contain 1
+var contain implicit 1
+var correspon 2
+var cost 1
+var cost assoc 1
+var cp 1
+var criter 1
+var csp 1
+var cur 1
+var cur acc 1
+var cur deb 1
+var cur kybd 1
+var cut 1
+var cut est 1
+var d valu 1
+var d6 1
+var dan 2
+var dan la 1
+var dan linterv 1
+var dan un 1
+var dat 3
+var dat mov 1
+var dat se 1
+var de 4
+var de ba 1
+var de ce 2
+var de champ 1
+var de fa 1
+var de instruc 1
+var de ir 1
+var de la 3
+var de lestimateur 1
+var de linstruc 1
+var de param 1
+var de substitut 1
+var decl 1
+var degr 4
+var del 1
+var del tap 1
+var demand 3
+var dep 3
+var describ 1
+var differ way 1
+var difficult 1
+var disadv 1
+var disc 1
+var domain 2
+var domain inclus 1
+var don 2
+var don de 1
+var don ee 1
+var donc 1
+var donc entr 1
+var du 3
+var du nombr 1
+var du simpl 1
+var dun 1
+var dun claus 1
+var dun environ 1
+var dynamiqu 1
+var dynamiqu de 1
+var ee 1
+var ee de 1
+var effect 1
+var effect parameter 1
+var el 1
+var eleg 1
+var eleg algorithm 1
+var elim 1
+var en 2
+var en fonct 1
+var en pseud 1
+var en term 1
+var en un 1
+var enorm 2
+var enorm ement 2
+var entr 2
+var entr le 1
+var entr un 1
+var environm 1
+var es 1
+var es qu 1
+var est 1
+var est annot 1
+var est assoc 1
+var est connu 1
+var est donc 1
+var est li 1
+var est libr 1
+var est loc 1
+var est qu 1
+var est surtout 1
+var est toujour 1
+var et de 1
+var et dutiliser 1
+var et le 1
+var et qu 1
+var et sa 1
+var et subst 1
+var event 1
+var exper 1
+var experim 2
+var experim architectur 1
+var extern 1
+var extern load 1
+var fail 1
+var failur 1
+var failur model 1
+var fcheck 1
+var featur 3
+var featur ad 1
+var featur extract 1
+var field 3
+var fit 1
+var for repr 1
+var forbid 1
+var form 4
+var forml 1
+var fragm 1
+var fram 1
+var fram ind 1
+var from 1x 1
+var from countr 1
+var from design 1
+var from gener 1
+var from inst 1
+var from red 1
+var from surpr 1
+var fspec 1
+var gain 1
+var ge 2
+var ge assign 1
+var ge inherit 1
+var gel 1
+var gel gel 1
+var giv 1
+var glob 1
+var good 1
+var gr 1
+var gr rement 1
+var grad 1
+var great 1
+var ha dep 1
+var ha implicit 1
+var heur 1
+var hid 1
+var hid unit 1
+var high record 1
+var hyperbol 1
+var i1 1
+var i1 est 1
+var i2 1
+var ib 1
+var ij 1
+var ik 1
+var ik dan 1
+var ik de 1
+var ik dun 1
+var ik interv 1
+var imp 1
+var implem 2
+var implem ch 1
+var improv 2
+var improv connect 1
+var in character 1
+var in chem 1
+var in comput 1
+var in context 1
+var in del 1
+var in dom 1
+var in group 1
+var in log 1
+var in mic 1
+var in perform 1
+var in serv 1
+var in u2 1
+var incl 1
+var incr 1
+var incr signif 1
+var indiqu 1
+var indiqu quel 1
+var indirect 1
+var indirect addr 1
+var infrequ 1
+var init 1
+var init stat 1
+var input 2
+var input field 1
+var input gener 1
+var inst 2
+var inst measur 1
+var inst pair 1
+var instructionpointer 1
+var int 1
+var int er 1
+var interm 1
+var interm ediair 1
+var internet 3
+var internet serv 1
+var internet show 2
+var is alloc 1
+var is assoc 1
+var is bound 3
+var is clear 1
+var is compl 1
+var is comput 1
+var is defin 1
+var is denot 1
+var is dep 1
+var is el 1
+var is identif 1
+var is init 1
+var is monot 1
+var is older 1
+var is re 1
+var is s2 1
+var is shown 1
+var is sign 1
+var is unif 1
+var is upd 1
+var issu 1
+var issu rel 1
+var it reserv 1
+var j fun 1
+var kind 5
+var known 2
+var la 2
+var la ph 1
+var la valeur 1
+var le 1
+var le nombr 1
+var lead 1
+var length 4
+var length prolog 1
+var level 3
+var li 1
+var li ee 1
+var libr 1
+var libr dan 1
+var lifetim 1
+var lin 2
+var lin correspon 1
+var lit 1
+var lit av 1
+var liter 1
+var liter siz 1
+var load 1
+var load condit 1
+var lock 2
+var log 1
+var log program 1
+var m em 1
+var ma 1
+var ma le 1
+var matr 1
+var may car 1
+var may repr 1
+var me 1
+var me del 1
+var med 1
+var med dat 1
+var mesh 1
+var mesh simplif 1
+var method 2
+var mi 1
+var model 2
+var model select 1
+var modl 1
+var mor direct 1
+var mov 1
+var mov var 1
+var multim 1
+var multim orient 1
+var multithread 1
+var multithread schedl 1
+var na 1
+var na qu 1
+var nam 6
+var nam for 1
+var ne 1
+var ne peut 1
+var nest 1
+var nest correct 1
+var nest pa 1
+var newarg 1
+var nip 1
+var nod 1
+var non 2
+var non es 1
+var non funct 1
+var nonmonot 1
+var nonmonot system 1
+var number 4
+var number dep 1
+var object 1
+var object orient 1
+var observ 1
+var observabl 1
+var occur 3
+var oe 1
+var of algorithm 1
+var of an 1
+var of anderson 1
+var of appl 2
+var of ar 1
+var of architectur 1
+var of benchmark 1
+var of block 1
+var of bus 1
+var of ca 1
+var of compl 1
+var of comput 2
+var of computer 1
+var of concur 1
+var of constraint 1
+var of control 1
+var of dat 1
+var of difficult 1
+var of doubl 1
+var of error 1
+var of fault 1
+var of freez 1
+var of graph 1
+var of group 1
+var of header 1
+var of heap 1
+var of heapsort 1
+var of high 1
+var of inform 1
+var of input 1
+var of integer 1
+var of langu 1
+var of learn 1
+var of load 1
+var of mach 2
+var of minim 1
+var of non 1
+var of np 1
+var of nvvar 1
+var of object 1
+var of ol 1
+var of other 1
+var of parameter 1
+var of platform 1
+var of pot 1
+var of privileg 1
+var of problem 2
+var of proc 1
+var of prolog 1
+var of purp 1
+var of resourc 1
+var of rmsp 1
+var of sampl 1
+var of sen 1
+var of st 1
+var of stat 1
+var of synchron 1
+var of system 1
+var of targ 1
+var of textur 1
+var of top 1
+var of topolog 1
+var of typ 1
+var of univer 1
+var of user 1
+var of valu 1
+var of var 1
+var of variabl 2
+var of way 3
+var of wormhol 1
+var on indep 1
+var optim 1
+var optim method 1
+var or const 1
+var or typ 1
+var order 1
+var ordinair 1
+var other modl 1
+var other quest 1
+var ou 1
+var ou non 1
+var p keep 1
+var p1 1
+var p1 p2 1
+var pa 1
+var pa de 1
+var pack 1
+var pack siz 1
+var paper 1
+var parameter 3
+var parameter mean 1
+var partag 1
+var partag ee 1
+var pattern 1
+var peopl 1
+var perform 2
+var perman 1
+var perman avant 1
+var perman avec 1
+var perman dan 1
+var perman de 1
+var perman est 1
+var perman ordinair 1
+var perman qu 1
+var perman x1 1
+var perman y3 1
+var peut 1
+var peut alor 1
+var peut etr 1
+var ph 2
+var ph.j 1
+var plus compliqu 1
+var posit 1
+var possibil 2
+var postproc 1
+var pour 1
+var pour lu 1
+var pr 1
+var pr ec 1
+var pr eec 1
+var pract 1
+var pract issu 1
+var prec 2
+var prec solut 1
+var prem 1
+var pren 1
+var pren pour 1
+var prior 1
+var prior queu 1
+var prob 1
+var prob distribut 1
+var problem 1
+var proc 1
+var prop 1
+var proper 1
+var pu 1
+var pu recevoir 1
+var pv 1
+var q froot 1
+var q0 1
+var q1 1
+var q6 1
+var qi 1
+var qu 4
+var qu aurait 1
+var qu con 1
+var qu dan 1
+var qu langu 1
+var qu perm 1
+var quer 2
+var quer using 1
+var queu 1
+var rapid 1
+var rat 1
+var recognit 1
+var recognit system 1
+var recov 1
+var recov mechan 1
+var recur 1
+var recur form 1
+var redefinit 1
+var reduc 1
+var reduc techniqu 1
+var regard 1
+var rel 1
+var rel allow 1
+var remain 1
+var ren 1
+var renam 1
+var renam ind 1
+var reorder 1
+var repl 1
+var repl cl 1
+var repr 2
+var repr esent 1
+var requir 1
+var research 1
+var research ar 1
+var resourc 1
+var resourc maintain 1
+var restrict 1
+var rg 1
+var rk 1
+var rloc 1
+var rol 1
+var s equentiel 1
+var s.se 1
+var s2 1
+var saf 1
+var saf problem 1
+var satur 1
+var satur por 1
+var sav 1
+var schedl 1
+var schedl algorithm 1
+var scrambl 1
+var se 1
+var se comport 1
+var sect 1
+var select 1
+var select system 1
+var sem 1
+var sem oper 1
+var sen 1
+var sen technolog 1
+var sequ 1
+var serv 1
+var show 1
+var shuffl 1
+var shuffl algorithm 1
+var shunt 1
+var sid 1
+var sign 1
+var sign featur 1
+var signif 2
+var siz 3
+var siz pack 1
+var slight 3
+var slot 1
+var smd 1
+var soit 1
+var solut 1
+var solut configur 1
+var sont 1
+var sont possibl 1
+var sont remplac 1
+var sort 1
+var sp 1
+var sp point 1
+var spac 1
+var spec 1
+var spec character 1
+var spec comput 1
+var st 1
+var st valu 1
+var stag 3
+var standard 1
+var standard par 1
+var step 1
+var sub 1
+var sub compon 1
+var subsystem 1
+var subtyp 1
+var subtyp rl 1
+var succ 1
+var sum 1
+var symbol 2
+var symbol appear 1
+var syntact 1
+var syntact oper 1
+var system 4
+var system configur 3
+var system parameter 1
+var tabl 2
+var tcom 1
+var techniqu 1
+var temp 2
+var tempor 1
+var tempor character 1
+var temporair 1
+var temporair est 1
+var term 2
+var test 2
+var test2 1
+var test2 var 1
+var text 1
+var th chunk 1
+var th degr 1
+var th docum 1
+var th feedback 1
+var th init 1
+var th int 1
+var th interconnect 1
+var th learn 1
+var th lim 1
+var th rol 1
+var th topolog 2
+var that appear 1
+var that occur 1
+var that repr 1
+var theor 1
+var tight 1
+var to branch 1
+var to perform 1
+var tool 2
+var topolog 2
+var tot 1
+var tr 1
+var tr es 1
+var trad 1
+var trad off 1
+var tradeoff 1
+var tradeoff involut 1
+var typ 7
+var uniform 1
+var upd 1
+var us 2
+var us log 1
+var us restrict 1
+var usu refer 1
+var util 1
+var util valu 1
+var v appear 1
+var v chang 1
+var v1 2
+var v1 v2 1
+var valeur 1
+var valu 5
+var valu giv 1
+var valu vect 1
+var var 2
+var var mi 1
+var var test2 1
+var var var 1
+var varl 1
+var ver 1
+var ver involut 1
+var vi 1
+var vl 1
+var vl bam 1
+var vn 1
+var wa norm 1
+var way 8
+var we mean 1
+var we us 1
+var weight 1
+var weight init 1
+var wer allow 1
+var wh typ 1
+var when chang 1
+var when precc 1
+var whil keep 1
+var wid 2
+var with implicit 1
+var would work 1
+var x chang 1
+var x com 1
+var x contain 1
+var x de 1
+var x en 1
+var x est 1
+var x pren 1
+var x quun 1
+var x remain 1
+var x repr 1
+var x x6 1
+var x y1 1
+var x1 1
+var x1 de 1
+var x4 1
+var x5 1
+var x5 l1 1
+var xi 4
+var xi.2 1
+var xj 2
+var xj connect 1
+var xk 1
+var xk est 1
+var xk produit 1
+var xn 1
+var xn en 1
+var xp 1
+var y conduit 1
+var y en 1
+var y par 1
+var y1 1
+var y2 1
+var y2 l3 1
+var y3 1
+var yi 1
+var z nappar 1
+var1 2
+var1 form1 1
+var1 var2 1
+var2 2
+var2 form2 1
+var3 1
+varadarajan 1
+varadarajan and navath 1
+vard 3
+vard and al 1
+vard and kuper 1
+vargh 1
+variabil 1
+variabl 65
+variabl a attribut 1
+variabl a attribut137 1
+variabl a attribut139 1
+variabl a attribut141 1
+variabl a attribut143 1
+variabl a la 1
+variabl a lec 1
+variabl affecter 1
+variabl affecter aus 1
+variabl afin 1
+variabl afin dobtenir 1
+variabl ai 2
+variabl al 1
+variabl al eatoir 1
+variabl alloc 1
+variabl allou 1
+variabl allou ee 1
+variabl and ad 1
+variabl and affin 1
+variabl and ax 1
+variabl and caus 1
+variabl and common 1
+variabl and constraint 2
+variabl and describ 1
+variabl and dim 1
+variabl and event 1
+variabl and froz 1
+variabl and funct 2
+variabl and hyper 1
+variabl and ib 1
+variabl and inser 1
+variabl and latin 1
+variabl and liter 1
+variabl and modif 1
+variabl and modl 1
+variabl and refer 1
+variabl and result 2
+variabl and return 1
+variabl and shunt 1
+variabl and simplif 1
+variabl and thus 1
+variabl and var 1
+variabl and wak 1
+variabl appar 1
+variabl appar dan 1
+variabl appear 3
+variabl approach 1
+variabl approach improv 1
+variabl appropr 1
+variabl appropr renam 1
+variabl ar alloc 2
+variabl ar assum 1
+variabl ar bound 3
+variabl ar ch 1
+variabl ar decl 1
+variabl ar defin 1
+variabl ar dep 1
+variabl ar discr 1
+variabl ar distinct 1
+variabl ar distribut 1
+variabl ar du 1
+variabl ar elig 1
+variabl ar expr 1
+variabl ar gener 1
+variabl ar giv 1
+variabl ar indep 1
+variabl ar init 2
+variabl ar interdep 1
+variabl ar intern 1
+variabl ar introduc 1
+variabl ar jw 1
+variabl ar kept 1
+variabl ar kw 1
+variabl ar maintain 1
+variabl ar memor 1
+variabl ar mut 1
+variabl ar regard 1
+variabl ar relev 1
+variabl ar repr 2
+variabl ar requir 1
+variabl ar st 1
+variabl ar tabl 1
+variabl ar thus 1
+variabl ar un 1
+variabl ar unidim 1
+variabl ar upd 1
+variabl ar v1 1
+variabl as dynam 1
+variabl as modif 1
+variabl as nod 1
+variabl as non 1
+variabl at level 1
+variabl attach 1
+variabl attach ee 1
+variabl begin 1
+variabl being member 1
+variabl belong 1
+variabl between consecut 1
+variabl bound 1
+variabl by introduc 1
+variabl can speed 1
+variabl ce 1
+variabl ce qu 1
+variabl chang 1
+variabl common 1
+variabl commun 2
+variabl commun par 1
+variabl constrain 1
+variabl cr 1
+variabl cur 1
+variabl cur ts 1
+variabl d etat 1
+variabl d evelop 1
+variabl dan 1
+variabl dan la 1
+variabl de 2
+variabl de cel 1
+variabl de environ 1
+variabl de la 2
+variabl de man 1
+variabl decl 1
+variabl denot 1
+variabl devait 1
+variabl devait porter 1
+variabl dind 1
+variabl dind inf 1
+variabl dind sup 1
+variabl distinct 1
+variabl domain 1
+variabl domain du 1
+variabl domain pu 1
+variabl domain sont 1
+variabl domin 1
+variabl du 1
+variabl du syst 1
+variabl dun 1
+variabl dun ch 1
+variabl dur 1
+variabl dur ee 1
+variabl each fact 1
+variabl eclip 1
+variabl est 2
+variabl est li 1
+variabl est un 1
+variabl ev iter 1
+variabl except ib 1
+variabl fin 1
+variabl fin scor 1
+variabl for prev 1
+variabl for program 1
+variabl for subsequ 1
+variabl forml 1
+variabl fx1 1
+variabl g0 1
+variabl ge 1
+variabl ge assign 1
+variabl gel 1
+variabl gel gel 1
+variabl gener 1
+variabl gener follow 1
+variabl giv 1
+variabl globalisabl 1
+variabl globalisabl aux 1
+variabl globalisabl dan 1
+variabl globalisabl en 1
+variabl globalisabl introduit 1
+variabl globalisabl na 1
+variabl globalisabl peuv 1
+variabl hav st 1
+variabl high 1
+variabl i1 1
+variabl ib 1
+variabl ik 1
+variabl illustr 1
+variabl improv 1
+variabl improv diagnost 1
+variabl in augm 1
+variabl in dom 1
+variabl in oe 1
+variabl in order 1
+variabl in polymorph 1
+variabl in proc 1
+variabl in stat 1
+variabl in term 1
+variabl inst 2
+variabl inst order 1
+variabl int 1
+variabl int aff 1
+variabl int root 1
+variabl inutil 1
+variabl involut 1
+variabl is brok 1
+variabl is equ 1
+variabl is giv 1
+variabl is lim 1
+variabl is measur 1
+variabl is rough 1
+variabl lead 1
+variabl libr 1
+variabl libr au 1
+variabl libr par 1
+variabl lij 1
+variabl liter 1
+variabl liter dpl 1
+variabl liter mean 1
+variabl loc 1
+variabl maintain 1
+variabl mean 1
+variabl measur 1
+variabl nam 1
+variabl ne 1
+variabl ne se 1
+variabl nec 1
+variabl ni 1
+variabl non 1
+variabl non cach 1
+variabl not alloc 1
+variabl ob 1
+variabl ob ei 1
+variabl obtain 1
+variabl occur 2
+variabl of ba 1
+variabl of import 1
+variabl of med 1
+variabl of o2 1
+variabl of oe 1
+variabl of pn 1
+variabl of st1 1
+variabl of t1 1
+variabl of twosym 1
+variabl of unknown 1
+variabl of x0 1
+variabl of z0 1
+variabl older 1
+variabl on pag 1
+variabl or const 2
+variabl or term 1
+variabl or variabl 1
+variabl origin 1
+variabl oz 1
+variabl oz solut 1
+variabl partag 2
+variabl partag ee 2
+variabl partag la 1
+variabl perman 1
+variabl perman activ 1
+variabl perman appar 1
+variabl perman argum 1
+variabl perman au 1
+variabl perman avec 1
+variabl perman dan 1
+variabl perman dapr 1
+variabl perman de 1
+variabl perman doiv 1
+variabl perman en 1
+variabl perman est 1
+variabl perman inutil 1
+variabl perman lor 1
+variabl perman nappar 1
+variabl perman ne 1
+variabl perman nouvel 1
+variabl perman prendr 1
+variabl perman qu 1
+variabl perman sen 1
+variabl perman sont 1
+variabl perman util 1
+variabl plur 1
+variabl plus anc 1
+variabl pour 2
+variabl pour le 1
+variabl pour permettr 1
+variabl prev 1
+variabl prev kybd 1
+variabl qu 1
+variabl qu doiv 1
+variabl qu ne 1
+variabl qu notr 1
+variabl qu vont 1
+variabl rang 3
+variabl rat 1
+variabl rav 1
+variabl rel 1
+variabl repr 3
+variabl repr analogu 1
+variabl repr apath 1
+variabl respect 1
+variabl sampl 1
+variabl sampl branch 1
+variabl se 1
+variabl se lambd 1
+variabl simultan 1
+variabl sn 1
+variabl solut 1
+variabl solut describ 1
+variabl solut improv 1
+variabl solut show 1
+variabl solut us 1
+variabl solver 1
+variabl solver cod 1
+variabl solver eff 1
+variabl solver implem 1
+variabl solver show 1
+variabl solver us 1
+variabl solver using 1
+variabl solver writ 1
+variabl sont 1
+variabl sont implicit 1
+variabl st 1
+variabl st valu 1
+variabl st1 1
+variabl standard 1
+variabl successiv 1
+variabl suiv 1
+variabl temporair 1
+variabl temporair appar 1
+variabl th number 1
+variabl th wam 1
+variabl than origin 1
+variabl that appear 2
+variabl that becom 1
+variabl that occur 2
+variabl that satisf 1
+variabl that stand 1
+variabl to ensur 1
+variabl to produc 1
+variabl to repr 2
+variabl to term 1
+variabl to typ 1
+variabl to wit 1
+variabl to writ 1
+variabl upd 1
+variabl using 4
+variabl using indomain 1
+variabl using lem 1
+variabl v0 1
+variabl v1 1
+variabl v3 1
+variabl var 1
+variabl vectoriel 1
+variabl vi 1
+variabl visit 1
+variabl wer affect 1
+variabl wer norm 1
+variabl wer scor 1
+variabl wer solut 1
+variabl wer writ 1
+variabl wh 1
+variabl wh decl 1
+variabl wh valu 1
+variabl which expr 1
+variabl wil dom 1
+variabl with el 1
+variabl with finit 1
+variabl writ 1
+variabl x1 2
+variabl x3 1
+variabl xi 1
+variabl xi du 1
+variabl.1 1
+variabl.1 a structur 1
+variabl.2 1
+variabl.2 tw rl 1
+variationnel 1
+variedad 1
+variedad e vol 1
+varl 1
+varl wh 1
+varl wh tok 1
+varm 2
+varshn 1
+vast 7
+vast amount 1
+vast bod 1
+vast major 1
+vast mor complec 1
+vast mor eff 1
+vasu 1
+vasu wuccrc.wustl.edu 1
+vasu wuccrc.wustl.edu jbf 1
+vasudh 1
+vasudh govindan 1
+vasudh govindan mark 1
+vaswan 1
+vauch 1
+vaudrait 1
+vaut 2
+vaut alor 1
+vaut bp 1
+vaut d ej 1
+vaut e env 1
+vaut en 1
+vaut en dehor 1
+vaut faux 1
+vaut la 1
+vaut la pein 1
+vaut mieux 1
+vaut mieux laisser 1
+vaut pa 1
+vaut pa la 1
+vaut vr 1
+vav 1
+vb 3
+vb funct 1
+vb va 1
+vbr 1
+vc 3
+vc and ci 1
+vc fcompan 1
+vc repr 1
+vct 1
+vct design 1
+vct design perform 1
+vd 3
+vd fl 1
+vd rslack 1
+vd rslack pi 1
+vd verlag 1
+vdest 1
+vdm 2
+vdm def 1
+ve 6
+ve beaucoup 1
+ve beaucoup de 1
+ve consisterait 1
+ve de 1
+ve de syst 1
+ve donc 1
+ve donc akl 1
+ve du 1
+ve du retour 1
+ve et impl 1
+ve et le 1
+ve gal 1
+ve gal le 1
+ve method 1
+ve n ecessit 1
+ve86 1
+vec 1
+vect 47
+vect a.17 1
+vect a1 1
+vect and dep 1
+vect and parallel 1
+vect and produc 1
+vect ar 1
+vect ar advantag 1
+vect ar comput 1
+vect ar correspon 1
+vect ar ment 1
+vect ar nec 1
+vect ar nonneg 1
+vect ar quant 1
+vect ar shown 1
+vect ar suit 1
+vect ba 1
+vect becom 1
+vect becom e1 1
+vect compiler 1
+vect compon 3
+vect compon comput 1
+vect comput 2
+vect computer 1
+vect con 2
+vect correspon 2
+vect counter 1
+vect counter tsp 1
+vect d i0 1
+vect d1 1
+vect dat 1
+vect defin 1
+vect dw 1
+vect el 1
+vect for cl 1
+vect for equiv 1
+vect for gouraud 1
+vect form 4
+vect funct 1
+vect g0 1
+vect h3 1
+vect h4 1
+vect h8 1
+vect impl 1
+vect in mint 1
+vect in tabl 1
+vect is accompl 1
+vect is denot 1
+vect is determin 1
+vect is se 1
+vect is simp 1
+vect is sought 1
+vect is split 1
+vect latest 1
+vect me 1
+vect me fit 1
+vect multipl 1
+vect multipl using 1
+vect o0 1
+vect object 1
+vect object st 1
+vect of const 1
+vect of dim 2
+vect of error 1
+vect of ind 1
+vect of input 1
+vect of inst 1
+vect of integer 1
+vect of interm 2
+vect of iter 1
+vect of length 2
+vect of network 1
+vect of nop 1
+vect of output 1
+vect of prev 1
+vect of proc 1
+vect of targ 1
+vect of til 1
+vect of upd 1
+vect of variabl 1
+vect of weight 1
+vect oj 1
+vect oper 4
+vect oper comput 1
+vect or output 1
+vect pi 1
+vect proc 2
+vect produc 2
+vect produc ad 1
+vect produc aq 1
+vect produc dep 1
+vect produc hard 1
+vect produc requir 2
+vect q1 1
+vect qi 1
+vect quant 2
+vect quant codebook 1
+vect quant design 1
+vect quant techniqu 1
+vect r0 1
+vect ra 1
+vect ref 1
+vect ref valu0 1
+vect rel 1
+vect repr 1
+vect restrict 1
+vect ri 2
+vect rout 1
+vect rout algorithm 1
+vect select 1
+vect sequ 1
+vect sequ fqig 1
+vect shader 1
+vect si 1
+vect solut 1
+vect spac 3
+vect stat 1
+vect sum 2
+vect that repr 1
+vect tim 1
+vect tim stamp 1
+vect timestamp 1
+vect timestamp ts 1
+vect to ind 1
+vect to repr 1
+vect to upd 1
+vect typ 1
+vect v correspon 1
+vect vect 1
+vect vect oper 1
+vect versus link 1
+vect we say 1
+vect wh ith 1
+vect with equ 1
+vect wj 1
+vect x defin 1
+vect x0 1
+vect xi 1
+vect y cv 1
+vecteur 5
+vecteur a traiter 1
+vecteur ak 1
+vecteur al 1
+vecteur al atoir 1
+vecteur auxilliair 1
+vecteur auxilliair de 1
+vecteur auxilliair suff 1
+vecteur b de 1
+vecteur c1 1
+vecteur caract 1
+vecteur caract eristiqu 1
+vecteur co 1
+vecteur co ut 1
+vecteur colon 1
+vecteur colon mk 1
+vecteur d elt 1
+vecteur d1 1
+vecteur d2 1
+vecteur da 1
+vecteur de 5
+vecteur de ba 1
+vecteur de diff 1
+vecteur de dist 1
+vecteur de dur 1
+vecteur de la 1
+vecteur de localit 1
+vecteur de qp 1
+vecteur de rn 1
+vecteur de tail 1
+vecteur de term 1
+vecteur de valeur 1
+vecteur de zn 1
+vecteur de zp 1
+vecteur derreur 1
+vecteur di 1
+vecteur dic 1
+vecteur dic ec 1
+vecteur diminu 1
+vecteur diminu le 1
+vecteur dispar 1
+vecteur dispar de 1
+vecteur dist 1
+vecteur dist de 1
+vecteur dit 1
+vecteur dit erat 1
+vecteur dont la 1
+vecteur est 2
+vecteur est egal 1
+vecteur est maint 1
+vecteur est tir 1
+vecteur et lalgorithm 1
+vecteur et prim 1
+vecteur etant 1
+vecteur etant lexicopositif 1
+vecteur ik1 1
+vecteur le 1
+vecteur le dilat 1
+vecteur loc 1
+vecteur loc util 1
+vecteur locaux 1
+vecteur locaux de 1
+vecteur luim 1
+vecteur luim em 1
+vecteur minim 1
+vecteur minim hi 1
+vecteur napport 1
+vecteur napport pa 1
+vecteur nest 1
+vecteur nest pa 1
+vecteur norm 1
+vecteur not es 1
+vecteur ou 1
+vecteur peuv 1
+vecteur peuv etr 1
+vecteur pour 1
+vecteur pour dern 1
+vecteur propr 1
+vecteur propr orthonorm 1
+vecteur r eel 1
+vecteur repr 1
+vecteur repr esent 1
+vecteur rot 1
+vecteur rot act 1
+vecteur s nappart 1
+vecteur s tel 1
+vecteur s1 1
+vecteur sont 1
+vecteur sont colin 1
+vecteur souhait 1
+vecteur souhait es 1
+vecteur tang 1
+vecteur tang correspon 1
+vecteur tang en 1
+vecteur td 1
+vecteur temporair 1
+vecteur temporair peut 1
+vecteur v erif 1
+vecteur x solut 1
+vectinf 1
+vectinf mac 1
+vectoriel 3
+vectoriel chap 1
+vectoriel dan 1
+vectoriel dan r3 1
+vectoriel de 1
+vectoriel de deux 1
+vectoriel de dim 1
+vectoriel du 1
+vectoriel du typ 1
+vectoriel et jff1 1
+vectoriel et sur 1
+vectoriel eucl 1
+vectoriel eucl de 1
+vectoriel ou 1
+vectoriel tang 1
+vectoriel tr 1
+vectoriel unidimensionnel 1
+vectoriel unidimensionnel r1 1
+vectsup 1
+vectsup min 1
+veg 2
+veg typ 1
+vehicl 6
+vehicl agent 1
+vehicl agent descript 1
+vehicl and tim 1
+vehicl ar repr 1
+vehicl cru 1
+vehicl cru control 1
+vehicl cru controller 1
+vehicl dynam 1
+vehicl is conver 1
+vehicl shap 1
+vehicl vowel 1
+vehicl vowel win 1
+veidenbaum 2
+veidenbaum pr 1
+veiller 2
+veiller a conserver 1
+veiller a eliminer 1
+veiller a la 1
+veiller a ne 1
+veiller aux 1
+veilleron 1
+veillon 1
+veillon a transformer 1
+vein 1
+vej 3
+vej 7e 2
+vej 7e dk 2
+vektorrechern 1
+vel 1
+vel variedad 1
+veld 1
+vellin 1
+veloc 3
+veloc and posit 2
+veloc ba 1
+veloc by va 1
+veloc ind 1
+veloc inform 1
+veloc remain 1
+veloc remain const 1
+velop 1
+velop dalgorithm 1
+velop de 1
+velop de la 1
+velop doutil 1
+velop doutil math 1
+velop es 1
+velop es dan 1
+velop import 1
+velop lim 1
+velop s en 1
+velop statistiqu 1
+velop statistiqu qu 1
+velop th 1
+velop th oriqu 1
+velopper 2
+velopper de 1
+velopper de estimateur 1
+velopper le 1
+velopper un 2
+velopper un th 1
+velopper un vi 1
+veloppon 1
+veloppon de 1
+veloppon de algorithm 1
+veloppon le 1
+veloppon le calcl 1
+veloppon un 1
+veloppon un not 1
+vement 2
+vement rec 1
+vement rec ee 1
+ven 3
+ven and recogn 1
+ven diagram 2
+vendor 5
+vendor hav addr 1
+vendor of bim 1
+vendor specif 1
+vendor suppl 1
+vendor suppl implem 1
+venir 1
+venir travailler 1
+venir travailler dan 1
+venkat25 1
+venkataraman 1
+venkatasubram 1
+venkateswarlu 1
+venon 3
+venon d evoquer 1
+venon de 3
+venon de la 1
+ventuel 1
+ventuel mun 1
+ventuel mun dun 1
+ver 95
+ver a utiliser 1
+ver ac 2
+ver accord 1
+ver actuel 1
+ver actuel du 1
+ver ad 1
+ver ad introspect 1
+ver adjac 1
+ver adjoin 1
+ver aftd 1
+ver al dot 1
+ver altern 2
+ver altern pour 1
+ver and block 1
+ver and configur 1
+ver and edg 4
+ver and horizont 1
+ver and perform 1
+ver and proc 1
+ver and test 1
+ver and ver 1
+ver appear 5
+ver ar ad 1
+ver ar adjac 1
+ver ar check 1
+ver ar color 1
+ver ar mov 1
+ver ar non 1
+ver ar scan 1
+ver ar sharp 1
+ver ar simp 1
+ver ar sort 1
+ver ar visit 1
+ver arbor 1
+ver arrow 1
+ver attribuer 1
+ver attribuer lec 1
+ver avail 2
+ver bar separ 1
+ver becom 1
+ver being match 1
+ver belong 2
+ver bj 1
+ver by oren 1
+ver by upgrad 1
+ver cal cluster 1
+ver can mov 1
+ver can sen 1
+ver ce 2
+ver ce maxim 1
+ver ce point 1
+ver ci 1
+ver clip 2
+ver clip lin 2
+ver closest 1
+ver cluster 1
+ver compil 1
+ver con 1
+ver connect 2
+ver contain 2
+ver cor 1
+ver cor cam 1
+ver cover 2
+ver cover hi 1
+ver creat 1
+ver d epl 1
+ver dan 1
+ver dan le 1
+ver dautr 1
+ver dautr horizon 1
+ver de 2
+ver de ce 1
+ver de deux 1
+ver de disj 1
+ver de four 1
+ver de instruc 1
+ver de lalgorithm 1
+ver de program 1
+ver dep 2
+ver direct 1
+ver du 3
+ver du cod 1
+ver du compilateur 1
+ver du program 1
+ver dun 1
+ver dun claus 1
+ver empl 1
+ver empl ee 1
+ver en 1
+ver en mod 1
+ver est 1
+ver est quel 1
+ver exterior 1
+ver exterior featur 1
+ver f3 1
+ver find 1
+ver first incr 1
+ver flag 1
+ver for atm 1
+ver fragm 1
+ver fs 1
+ver fs opt 1
+ver funct 1
+ver funct modif 1
+ver futur 1
+ver futur du 1
+ver fv1 1
+ver graph 1
+ver ha degr 1
+ver hi 1
+ver horizont 1
+ver horizont rol 1
+ver hybr 1
+ver hybr de 1
+ver in acm 1
+ver in cad 1
+ver in gd 1
+ver in hi 1
+ver in hyperedg 1
+ver in inform 1
+ver in p1 1
+ver in p2 1
+ver in tim 1
+ver in ublog 1
+ver in v1 1
+ver in v2 1
+ver in vb 1
+ver in vc 1
+ver individu 1
+ver input 1
+ver inser 1
+ver int rol 1
+ver involut 2
+ver involut modif 1
+ver is collap 1
+ver is construc 1
+ver is creat 2
+ver is defin 1
+ver is deriv 1
+ver is divid 1
+ver is equid 1
+ver is exact 1
+ver is form 1
+ver is handl 1
+ver is mov 1
+ver is re 1
+ver is rel 1
+ver is replac 1
+ver is se 1
+ver is specif 1
+ver is standard 1
+ver is straightfor 1
+ver is touch 1
+ver is undec 1
+ver it tak 1
+ver la 2
+ver la fin 1
+ver la pil 1
+ver la tr 1
+ver la var 1
+ver la wam 1
+ver label 1
+ver laser 1
+ver laser strip 1
+ver le 3
+ver le ba 1
+ver le etat 1
+ver le instruc 1
+ver le petit 1
+ver le som 1
+ver level 1
+ver level number 1
+ver li 2
+ver lin 3
+ver lin ear 1
+ver loptim 1
+ver loptim glob 1
+ver mak 1
+ver malgr 1
+ver manner 1
+ver match 1
+ver maxj 1
+ver may belong 1
+ver may result 1
+ver memor 1
+ver might look 1
+ver mov 2
+ver must contribut 1
+ver must go 1
+ver ne 1
+ver ne perm 1
+ver next pa 1
+ver norm 1
+ver norm vect 1
+ver number 4
+ver number attach 1
+ver number chang 1
+ver of abcl 1
+ver of algorithm 2
+ver of aqu 1
+ver of arithm 1
+ver of ask 1
+ver of ba 1
+ver of banerj 1
+ver of cam 1
+ver of ci 1
+ver of clp 1
+ver of corecam 1
+ver of cur 1
+ver of degr 1
+ver of distribut 1
+ver of equiv 1
+ver of erg 1
+ver of fac 1
+ver of fram 1
+ver of g0 3
+ver of gf 1
+ver of gi 1
+ver of gic1 1
+ver of hal 1
+ver of ibm 1
+ver of infer 1
+ver of kleen 1
+ver of kowalsk 1
+ver of lansp 1
+ver of le 1
+ver of lem 1
+ver of link 1
+ver of lotus 1
+ver of macpaint 1
+ver of mp3d 1
+ver of natur 1
+ver of netsim 1
+ver of pandemon 1
+ver of patholog 1
+ver of player 1
+ver of procedur 1
+ver of prolog 1
+ver of q1.10 1
+ver of q1.13 1
+ver of q1.7 1
+ver of rec 1
+ver of regl 1
+ver of replac 1
+ver of s1 1
+ver of sar 1
+ver of schedl2 1
+ver of selecttest 1
+ver of sep 1
+ver of siem 1
+ver of siftdown 1
+ver of sy 1
+ver of system 1
+ver of tak 1
+ver of tc 1
+ver of triangularsiftdown 1
+ver of univer 1
+ver of var 1
+ver on contour 1
+ver on demand 1
+ver op 1
+ver op erationnel 1
+ver optim 1
+ver optim ee 1
+ver or edg 1
+ver or horizont 3
+ver or test 1
+ver orig 1
+ver orig sur 1
+ver origin 2
+ver origin con 1
+ver origin de 1
+ver origin du 1
+ver origin sur 1
+ver oth 1
+ver oth eoriqu 1
+ver p creat 1
+ver pair 1
+ver par 3
+ver par el 2
+ver par part 1
+ver param 1
+ver param etr 1
+ver part 1
+ver part de 1
+ver partit 1
+ver partit leav 1
+ver pi1 1
+ver plusieur 1
+ver plusieur unit 1
+ver point 1
+ver point de 1
+ver pp 1
+ver pp opt 1
+ver pr 2
+ver pr ec 1
+ver pr eliminair 1
+ver produc 1
+ver produc ident 1
+ver prolog 1
+ver prolog init 1
+ver put 1
+ver put unnec 1
+ver q exemplif 1
+ver r2 1
+ver r3 1
+ver regl 1
+ver regl ver 1
+ver remov 1
+ver report 1
+ver repr 3
+ver repr avail 1
+ver requir 2
+ver resp 1
+ver revu 1
+ver rol 1
+ver rol partit 1
+ver run 1
+ver s equentiel 2
+ver s specif 1
+ver s ur 1
+ver sa 1
+ver san param 1
+ver scan 1
+ver scan design 1
+ver scan structur 1
+ver se 4
+ver se con 1
+ver se ublog 1
+ver seront 1
+ver seront alor 1
+ver sicstus 1
+ver sicstus prolog 1
+ver simp 1
+ver simpl 1
+ver sp 1
+ver sp ec 1
+ver spac 1
+ver specif 1
+ver split 1
+ver step 1
+ver straight 1
+ver straight strip 1
+ver strip 2
+ver structur 1
+ver suit 1
+ver tab 1
+ver tab alphc 1
+ver test 1
+ver test descript 1
+ver test infotbl 1
+ver test procedur 1
+ver th argum 1
+ver th lower 1
+ver th multim 1
+ver to achief 1
+ver to appear 1
+ver to av 1
+ver to cover 1
+ver to cr 1
+ver to develop 1
+ver to eventu 1
+ver to explor 1
+ver to satisf 1
+ver took 1
+ver took scot 1
+ver tr 1
+ver transform 1
+ver transform ee 1
+ver triangulair 1
+ver triangulair du 1
+ver u remain 1
+ver un 4
+ver un autr 1
+ver un champ 1
+ver un est 1
+ver un impl 1
+ver un instruc 1
+ver un lim 1
+ver un matr 1
+ver un optim 1
+ver un secon 1
+ver un sel 1
+ver un solut 1
+ver us 1
+ver using 1
+ver using match 1
+ver util 1
+ver util ee 1
+ver util un 1
+ver v belong 1
+ver v con 1
+ver v ec 1
+ver v li 1
+ver v vi 1
+ver v0 2
+ver va 1
+ver vr 1
+ver vt 1
+ver w contain 1
+ver w0 1
+ver wa exerc 1
+ver wa larg 1
+ver we run 1
+ver we solut 1
+ver weight 1
+ver wer avail 1
+ver wer run 1
+ver wh dist 1
+ver wh remov 1
+ver which ba 1
+ver which contradict 1
+ver wil appear 2
+ver wil serv 1
+ver wil suff 1
+ver with fun 1
+ver with level 1
+ver with od 1
+ver xi 2
+ver y ind 1
+ver. 1
+verb 5
+verb and rel 1
+verb commun 1
+verb commun dat 1
+verb dat 1
+verb dat se 1
+verb form 1
+verb lik thought 1
+verb phr 1
+verb phr construc 1
+verb protocol 1
+verb protocol an 1
+verb that expr 1
+verb to form 1
+verbatim 1
+verd 1
+verdict 1
+verdict a targ 1
+verdict confid 1
+verdict sit 1
+verdict sit inform 1
+verdict verdict 1
+verdonk 1
+vereeck 1
+verfahr 1
+verfahr der 1
+verfahr der konjug 1
+verif 41
+verif a hypoth 1
+verif a solut 1
+verif an user 1
+verif and an 1
+verif attribut 1
+verif by an 1
+verif by mean 1
+verif by using 1
+verif compil 1
+verif compil specif 1
+verif concentr 1
+verif fail 2
+verif fail saf 1
+verif fi 1
+verif fi learn 1
+verif figur 1
+verif form 1
+verif high level 1
+verif hypoth 1
+verif in sec 1
+verif inclus 1
+verif inclus dev 1
+verif methodolog 1
+verif of concur 1
+verif of distribut 1
+verif of parallel 1
+verif of result 1
+verif ph 1
+verif research 1
+verif research centr 1
+verif result 1
+verif stag 1
+verif strateg 1
+verif subsystem 1
+verif task 1
+verif th compat 1
+verif th condit 1
+verif th cont 1
+verif th excel 1
+verif th interpl 1
+verif th magnitud 1
+verif th pr 1
+verif th refin 1
+verif th result 1
+verif th siml 1
+verif that condit 1
+verif that e01 1
+verif that e0k 1
+verif that leaf 1
+verif that pi 1
+verif that system 1
+verif with uniform 1
+verioc 1
+verioc of hypoth 1
+verit 1
+verit softwar 1
+verit softwar inc 1
+verl 1
+verlag 40
+verlag and waterl 1
+verlag berlin 1
+verlag berlin heidelberg 1
+verlag lectur 2
+verlag lectur not 2
+verlag lnc 2
+verlagsgesellschaft 1
+verlagsgesellschaft geest 1
+verlagsgesellschaft geest portig 1
+verm 1
+vermeir 1
+vernacl 1
+vernon 1
+veron 1
+veron falc 1
+verron 3
+verron au 1
+verron au chapitr 1
+verron au paragraph 1
+verron ci 1
+verron ci de 1
+verron dan 1
+verron dan ce 1
+verron dan la 1
+verron de 1
+verron n eanmoin 1
+verron plus loin 1
+verron qu 1
+verron qu dan 1
+versail 2
+versail franc 1
+versail ir 1
+versatil 4
+versatil schem 1
+versatil than yacc 1
+versatil tool 1
+verstoep 1
+verticalfragmentdefinit 1
+vetterl 3
+veut 3
+veut am eliorer 1
+veut calculer 1
+veut calculer la 1
+veut con 1
+veut con tr 1
+veut dir 1
+veut dir qu 1
+veut donc 1
+veut donc qu 1
+veut l eliminer 1
+veut pa 2
+veut pa dir 1
+veut pa effectuer 1
+veut provoquer 1
+veut provoquer de 1
+veut qu 1
+veut qu le 1
+veut traiter 1
+veut traiter par 1
+vf 1
+vf a0 1
+vf displ 1
+vf displ manager 1
+vfij 1
+vfin 1
+vg 2
+vg of nod 1
+vg prfx 1
+vg prfx gprfx 1
+vg88 1
+vh 2
+vh and st 1
+vhdl 1
+vhdl descript 1
+vhdl ent 1
+vhdl ent con 1
+vhdl langu 1
+vhdl langu refer 1
+vhdl proc 1
+vhdl proc contain 1
+vhdl proc stat 1
+vhdl program 1
+vhdl programmer 1
+vhdl siml 1
+vhdl siml ba 1
+vhdl specif 1
+vhdl wait 1
+vhdl wait stat 1
+vhw1 1
+vi 57
+vi 1g 1
+vi a compiler 1
+vi a eviter 1
+vi a limiter 1
+vi a map 1
+vi a optimiser 1
+vi a rendr 1
+vi a un 1
+vi a vi 2
+vi and acc 1
+vi and appl 1
+vi and chang 1
+vi and ea 1
+vi and hv 1
+vi and imag 1
+vi and med 1
+vi and mult 1
+vi and pattern 1
+vi and priv 1
+vi and robot 2
+vi and switch 1
+vi and vi 1
+vi and vj 1
+vi announc 1
+vi appl 2
+vi ar chang 1
+vi architectur 1
+vi architectur support 1
+vi artifact 1
+vi as deform 1
+vi assign 1
+vi ba 1
+vi ba techniqu 1
+vi barrel 1
+vi barrel inspect 1
+vi but sqrt 1
+vi c0 1
+vi circl 1
+vi circl import 1
+vi circl mean 1
+vi classiqu 1
+vi classiqu de 1
+vi collap 1
+vi commun 1
+vi comput 1
+vi conclus 2
+vi context 1
+vi dan 1
+vi dan ce 1
+vi de 4
+vi de ce 1
+vi de la 2
+vi de possibilit 1
+vi de syst 1
+vi de term 1
+vi de variabl 1
+vi decl 1
+vi decl correspon 1
+vi definit 1
+vi design 1
+vi displ 1
+vi draw 1
+vi draw tool 1
+vi ent 1
+vi equ 1
+vi est 2
+vi est dit 1
+vi est un 1
+vi event 1
+vi everywh 1
+vi for mobil 1
+vi glob 1
+vi glob par 1
+vi haut 1
+vi haut niveau 1
+vi in ad 1
+vi in ca 1
+vi in cylinder0 1
+vi in gd 1
+vi in textur 1
+vi ind 1
+vi interfac 1
+vi is ch 1
+vi is imag 1
+vi la 1
+vi lack 1
+vi mak 1
+vi mechan 1
+vi na 1
+vi na del 1
+vi ne 1
+vi ne se 1
+vi object 1
+vi of ent 1
+vi of import 1
+vi of sl1 1
+vi of variabl 1
+vi on pe 1
+vi or indep 1
+vi par 1
+vi par ordinateur 1
+vi part 1
+vi pictur 1
+vi port 1
+vi prescript 1
+vi prescript de 1
+vi prior 1
+vi prior queu 1
+vi problem 1
+vi proc 1
+vi proc simil 1
+vi refer 1
+vi request 1
+vi request connect 1
+vi requir 1
+vi requir eff 1
+vi result 1
+vi rl 1
+vi s decl 1
+vi s equentiel 1
+vi shap 1
+vi shap object 1
+vi squar 1
+vi st 1
+vi sub 1
+vi suiv 1
+vi sup 1
+vi sup erieur 1
+vi support 1
+vi sur 1
+vi sur la 1
+vi symtab 1
+vi system 1
+vi system discrimin 1
+vi technolog 1
+vi th scop 1
+vi then fl 1
+vi to p2 1
+vi to visu 1
+vi tool 1
+vi tr 1
+vi tr es 1
+vi un 1
+vi un etud 1
+vi va 1
+vi va etr 1
+vi vi 1
+vi vj 3
+vi we def 1
+vi wh 1
+vi wh uv 1
+vi whenever vi 1
+vi window 1
+vi would determin 1
+vi. 1
+vi2 1
+vi2 is equ 1
+viabilit 1
+viabilit e de 1
+vianu 2
+vibr 1
+vibr ar determin 1
+vic1 1
+vicent 1
+vichnevetsk 1
+vicin 3
+vicin of discontinu 1
+vicissitud 1
+vicissitud of mistim 1
+vict 1
+victim 3
+victim cel 1
+victim cel e0 1
+victim de 1
+victim de faux 1
+victim de ping 1
+victim deff 1
+victim deff ping 1
+victim of fal 1
+victimiz 1
+victimiz gold 1
+victimiz gold transact 1
+vid 11
+vid ad 1
+vid ad valu 1
+vid and aud 2
+vid and fac 1
+vid anim 1
+vid appl 1
+vid avec 1
+vid ba 1
+vid ba commun 1
+vid camer 2
+vid camer network 1
+vid camer plac 1
+vid car 1
+vid car el 1
+vid cod 1
+vid cod standard 1
+vid commun 1
+vid commun mod 1
+vid compr 1
+vid confer 1
+vid dan 1
+vid dan la 1
+vid dan le 1
+vid dat 1
+vid datab 1
+vid datab system 1
+vid de 1
+vid de solut 1
+vid en 1
+vid en posit 1
+vid environm 1
+vid ind 1
+vid ind system 1
+vid link 1
+vid manipl 1
+vid mixer 1
+vid multicast 1
+vid ne 1
+vid ne ser 1
+vid on demand 1
+vid over aud 1
+vid pa 1
+vid pa de 1
+vid pour 1
+vid pour certain 1
+vid record 1
+vid s 1
+vid sc 1
+vid sc chang 1
+vid search 1
+vid sequ 2
+vid server 1
+vid sign 1
+vid support 1
+vid sur 1
+vid tap 2
+vid tap se 1
+vid tap using 1
+vid tech 1
+vid would com 1
+videotap 2
+videotap th subject 1
+vidu 1
+vidu cost 1
+vidu cost funct 1
+vieil 1
+vieil proposit 1
+vieil proposit de 1
+vien 5
+vien fortran 1
+vien sintercaler 1
+vien sintercaler entr 1
+viendr 1
+viendr lir 1
+viendr lir dan 1
+vient 3
+vient d etr 1
+vient davoir 1
+vient davoir lieu 1
+vient de 2
+vient de mentionner 1
+vient de voir 1
+vient doubler 1
+vient doubler le 1
+vient du 2
+vient du fait 2
+vient just 1
+vient remplacer 1
+vient remplacer lec 1
+vierg 1
+vierg a la 1
+view 77
+view a mult 1
+view a parallel 1
+view a ser 1
+view and an 1
+view and conclus 1
+view and dep 1
+view and map 1
+view ar repr 1
+view ar squash 1
+view ar st 1
+view as composit 1
+view as context 1
+view as decrem 1
+view as expr 1
+view as fenc 1
+view as indep 1
+view as interv 1
+view as load 1
+view as manipl 1
+view as part 1
+view as perform 1
+view as posit 1
+view as program 1
+view as simpl 1
+view as singl 1
+view as snapshot 1
+view as univer 1
+view belong 1
+view by select 1
+view by using 1
+view can identif 1
+view con 1
+view control 1
+view control structur 1
+view differ 1
+view edit 1
+view ev succ 1
+view explicit 1
+view feed 1
+view glp 1
+view in babel 1
+view interfac 1
+view interfac oper 1
+view is influ 1
+view it inferior 1
+view led 1
+view maintain 1
+view map 1
+view may turn 1
+view menu 1
+view object 1
+view of comput 1
+view of docum 1
+view of elig 1
+view of eulisp 1
+view of funct 1
+view of graph 1
+view of inform 1
+view of knowledg 1
+view of lit 1
+view of object 1
+view of program 1
+view of sign 1
+view of understand 1
+view on person 1
+view part 1
+view point 2
+view pointer 1
+view pointer cach 1
+view pr 1
+view prescript 1
+view program 1
+view succ 1
+view suggest 1
+view sv 1
+view tel 1
+view tel bil 1
+view th effect 2
+view th evolut 1
+view th item 1
+view th list 1
+view th mesh 1
+view th origin 1
+view th path 1
+view th privileg 1
+view th program 1
+view th simpl 1
+view th teach 1
+view th web 1
+view transfer 1
+view transfer record 1
+view upd 1
+view with alarm 1
+viewcach 1
+viewer 1
+viewer as virtu 1
+viewer can displ 1
+viewer if nec 1
+viewer softwar 1
+viewer to handl 1
+viewpoint 9
+viewpoint adopt 1
+viewpoint concern 1
+viewpoint concur 1
+viewpoint of eff 1
+viewpoint of loc 1
+viewpoint of med 2
+viewpoint of part 1
+viewpoint of reason 1
+viewpoint of user 1
+viewport 1
+viewstamp 1
+viewstamp repl 1
+vif 1
+vigneron 1
+vij 3
+vij naik 1
+vikram 1
+villeneuv 2
+villeneuv d.h 1
+vim.ec.sot.ac.uk 1
+vim.ec.sot.ac.uk workshop 1
+vim.ec.sot.ac.uk workshop h.html 1
+vin 2
+vin hav challeng 1
+vin to output 1
+vinc 1
+vinc rus 1
+vint 1
+vint hil 1
+vint hil farm 1
+viol 20
+viol act 1
+viol acycl 1
+viol acycl el 1
+viol by p1 1
+viol cach 1
+viol cach coh 1
+viol dist 1
+viol encapsl 1
+viol occur 1
+viol of progr 1
+viol p3viol 1
+viol p3viol p2 1
+viol pb1 1
+viol pb2 1
+viol rl 1
+viol saf 1
+viol th assum 1
+viol th con 1
+viol th dat 1
+viol th fact 1
+viol th lower 1
+viol th prec 1
+viol th principl 1
+viol th proper 1
+viol th rl 1
+viol th suff 1
+viol th typ 1
+viol vol 1
+viol vol preserv 1
+vipin 3
+vipin kumar 3
+virgin 2
+virgin charlottesvil 1
+virgin thornt 1
+virgin thornt hal 1
+virgin.edu 1
+virgl 1
+virgl flot 1
+virgl flot par 1
+virtu 44
+virtu addr 2
+virtu addr spac 1
+virtu addr transl 1
+virtu and lim 2
+virtu art 1
+virtu art museum 1
+virtu automat 1
+virtu cach 1
+virtu ch 1
+virtu ch point 1
+virtu channel 1
+virtu circuit 1
+virtu cl 1
+virtu classroom 1
+virtu clock 1
+virtu connect 1
+virtu connect orient 1
+virtu cut 2
+virtu cut throughlik 1
+virtu d etr 1
+virtu deadl 1
+virtu deriv 1
+virtu docum 1
+virtu docum contain 1
+virtu environm 1
+virtu ev polymorph 1
+virtu ev proof 1
+virtu fail 1
+virtu funct 1
+virtu gi 1
+virtu gi project 1
+virtu html 1
+virtu html docum 1
+virtu instruc 1
+virtu instruc contain 1
+virtu instruc serv 1
+virtu la 1
+virtu la secon 1
+virtu level 1
+virtu mach 4
+virtu mach instruc 1
+virtu member 1
+virtu member funct 1
+virtu memor 6
+virtu memor abstract 1
+virtu memor addr 1
+virtu memor architectur 2
+virtu memor environm 1
+virtu memor ext 1
+virtu memor implem 1
+virtu memor manag 1
+virtu memor pag 1
+virtu memor parallel 1
+virtu memor reg 1
+virtu memor sustem 1
+virtu memor system 3
+virtu memor transl 1
+virtu memor.13 1
+virtu method 1
+virtu no cost 1
+virtu no overhead 2
+virtu of observ 1
+virtu of theorem 1
+virtu pag 2
+virtu pag transl 1
+virtu pipelin 1
+virtu pipelin chain 1
+virtu plac 1
+virtu re 2
+virtu re system 1
+virtu ring 1
+virtu ring instead 1
+virtu ring wh 1
+virtu se 1
+virtu shar 2
+virtu shar memor 2
+virtu spac 1
+virtu spac alloc 1
+virtu st 1
+virtu st computer 1
+virtu summer 1
+virtu synchron 2
+virtu synchron giv 1
+virtu synchron group 1
+virtu synchron requir 1
+virtu tabl 1
+virtu tabl lookup 1
+virtu teach 1
+virtu teach environm 1
+virtu tim 2
+virtu tim assoc 1
+virtu tim funct 1
+virtu to phy 1
+virtu trim 1
+virtualclock 1
+virtualclock al attempt 1
+virtualclock algorithm 1
+virtualclock and deficit 1
+virtualclock ar rat 1
+virtualclock grow 1
+virtualclock li 1
+virtualclock li lmac 1
+virtualclock schedl 1
+virtualclock schedl algorithm 1
+virtualclock scheduler 1
+virtualclock server 1
+virtualit 1
+virtualit e de 1
+virtuel 2
+virtuel a la 1
+virtuel conduit 1
+virtuel conduit aux 1
+virtuel dan 2
+virtuel dan le 1
+virtuel dan lordr 1
+virtuel de 2
+virtuel de la 1
+virtuel dec 1
+virtuel en 1
+virtuel en adr 1
+virtuel en fonct 1
+virtuel est 1
+virtuel est dan 1
+virtuel et physiqu 1
+virtuel etant 1
+virtuel etant fic 1
+virtuel goth 1
+virtuel nest 1
+virtuel nest pa 1
+virtuel par 1
+virtuel par colon 1
+virtuel partag 1
+virtuel partag ee 1
+virtuel sont 1
+virtuel sont alor 1
+virtuel sur 1
+virtuel sur mach 1
+virtuel vn 1
+visait 1
+vishkin 2
+visibl 1
+visibl de 1
+visibl de lutilisateur 1
+visiblel 1
+visit 17
+visit al point 1
+visit and consider 1
+visit and proceed 1
+visit ar classif 1
+visit declin 1
+visit e par 1
+visit ee 3
+visit ee apr 1
+visit ee en 1
+visit ee originel 1
+visit exact 1
+visit in random 2
+visit kyot 1
+visit neighbor 1
+visit nod 1
+visit nod condit 1
+visit or select 1
+visit research 1
+visit s3 1
+visit s3 selecttest 1
+visit th succ 1
+visit th ver 1
+visit to as 1
+visit ver 1
+visitednod 1
+visitednod condit 1
+visitednod condit hold 1
+visiter 2
+visiter ce 1
+visiter ce trajectoir 1
+visiter dan 1
+visiter le 2
+visiter le segm 1
+visiter le trajectoir 1
+visu 27
+visu an 1
+visu and teach 1
+visu appear 1
+visu appl 1
+visu ar return 1
+visu art 1
+visu artifact 1
+visu as transit 1
+visu ba 1
+visu ba custom 1
+visu ba encapsl 1
+visu ba langu 1
+visu ba med 1
+visu ba program 1
+visu ba prov 1
+visu ba reflect 1
+visu ba rest 1
+visu ba using 1
+visu bil 1
+visu bil fail 1
+visu cal cat 1
+visu channel 1
+visu channel avail 1
+visu clutter 1
+visu collap 1
+visu commun 3
+visu complec 1
+visu complec interfac 1
+visu cont 1
+visu cu 1
+visu dat 1
+visu datab 1
+visu datab system 1
+visu dent 1
+visu dent detect 1
+visu describ 1
+visu e en 1
+visu featur 1
+visu featur ba 1
+visu featur cont 1
+visu for interest 1
+visu form 2
+visu framework 1
+visu from becom 1
+visu hierarch 1
+visu hierarch dat 1
+visu hierarch inform 1
+visu inform 2
+visu inform manag 1
+visu inform system 1
+visu interfac 2
+visu labor 1
+visu labor pag 1
+visu labor1 1
+visu langu 1
+visu langu workshop 1
+visu larg dat 1
+visu larg structur 1
+visu lin 1
+visu lin inform 1
+visu med 1
+visu ment 1
+visu ment map 1
+visu method 1
+visu of hierarch 1
+visu off 1
+visu off inform 1
+visu paradigm 1
+visu qu 2
+visu qu rest 1
+visu recognit 1
+visu recognit system 1
+visu repr 1
+visu scan 1
+visu sem 1
+visu sem cont 1
+visu shap 1
+visu sign 1
+visu sign featur 1
+visu sign proc 1
+visu system 2
+visu techniqu 1
+visu th mmc 1
+visu th search 1
+visu thing 1
+visu tool 1
+visu which ingrid 1
+visu with box 1
+visualiser 1
+visualiser la 1
+viswanathan 1
+vit 7
+vit any 1
+vit d ecoul 1
+vit d epen 1
+vit de 2
+vit de con 1
+vit de processeur 1
+vit dic 1
+vit dic ecut 1
+vit fin 1
+vit qu 1
+vit qu dan 1
+vit that common 1
+vit tr 1
+vit tr es 1
+vitan 1
+vitter 1
+vitter and ph 1
+vitter hav subsequ 1
+viv 3
+viv et de 1
+viv lorsqu 1
+viv lorsqu nous 1
+vivek 1
+vivek singh 1
+vivj 1
+vivj vjv 1
+viz 4
+vj 9
+vj splitter 1
+vj vj 1
+vj0 1
+vj0 et vj0 1
+vjv 1
+vjvig 1
+vjvig is isomorph 1
+vk 3
+vk init 1
+vk is equ 1
+vk is found 1
+vk wil init 1
+vl 20
+vl a0 1
+vl a0 iff 1
+vl and neur 1
+vl and pack 1
+vl ar 1
+vl bam 1
+vl bp 1
+vl bp deep 1
+vl chip 2
+vl circuit 1
+vl commun 1
+vl commun switch 1
+vl design 3
+vl displ 1
+vl displ manager 1
+vl implem 3
+vl layout 1
+vl layout system 1
+vl og 1
+vl sign 1
+vl sign proc 1
+vl standard 1
+vl standard cel 1
+vl system 1
+vl technolog 1
+vl96 1
+vladimir 1
+vladimir alexief 1
+vladimir cs.ualber.ca 1
+vldb 3
+vlib 1
+vlib provider 1
+vlib provider form.html 1
+vlissid 1
+vm 8
+vm b km 1
+vm ba 1
+vm ba approach 1
+vm ba cach 1
+vm ba coh 1
+vm ba implem 1
+vm ba laz 1
+vm ba lrc 1
+vm ba method 1
+vm ba sc 1
+vm ba schem 1
+vm ba softwar 1
+vm cur 1
+vm cur kybd 1
+vm et plac 1
+vm kybd 1
+vm kybd ti 1
+vm pag 1
+vm pag fault 1
+vm repr 1
+vm repr esent 1
+vm softwar 1
+vm system 1
+vm system level 1
+vm transl 1
+vm transl hardwar 1
+vm2 1
+vm2c1 1
+vn 7
+vn 1g 1
+vn d epen 1
+vn et unif 1
+vn neck 1
+vn neck cut 1
+vn pour 1
+vn pour cut 1
+vn r eussit 1
+vn tng 1
+vng 1
+vnh 1
+vnh h w1 1
+vo 9
+vo auront 1
+vo auront lieu 1
+vo of sort 1
+vo onl commun 1
+vo onl environm 1
+vo onl fac 1
+vo onl me 1
+vo onl mod 1
+vo pour 1
+vo pour atteindr 1
+vo pour rendr 1
+vo quelqu 1
+vo quelqu remarqu 1
+vo un 1
+vo un list 1
+voc 1
+voc de 1
+voc de similitud 1
+vocabl 5
+vocabl and assoc 1
+vocabl and phr 1
+vocabl and relac 1
+vocabl ar 1
+vocabl ar inc 1
+vocabl imp 1
+vocabl imp restrict 1
+vocabl is entir 1
+vocabl item 1
+vocabl method 1
+vocabl method describ 1
+vocabl of lec 1
+vocabl siz 1
+vocabl speech 1
+vocabl speech recognit 1
+vocabl that con 1
+vod 2
+vod arenskou 1
+vod testb 1
+voelker 1
+voelker and muk 1
+voelker et al 1
+void 6
+void compan 1
+void departm list 1
+void empl 1
+void empl list 1
+void generaterandomgraph 1
+void hypercub 1
+void init 1
+void init menu 1
+void inser 1
+void pm 1
+void printgraph 1
+void printtr 1
+void remov 1
+void sum 1
+void tabl 1
+void tor2 1
+void tor3 1
+void tor4 1
+voient 1
+voient le 1
+voient le jour 1
+voir 6
+voir annec 1
+voir antogon 1
+voir appar 1
+voir appar tr 1
+voir aus 2
+voir aus cart 1
+voir aus esp 1
+voir aus form 1
+voir aus la 1
+voir aus lieu 1
+voir aus lo 1
+voir aus mesur 1
+voir aus moy 1
+voir aus quatern 1
+voir aus rep 1
+voir aus transform 1
+voir aus var 1
+voir certain 2
+voir certain som 1
+voir certain travaux 1
+voir chapitr 2
+voir ci 1
+voir ci apr 1
+voir com 2
+voir com lever 1
+voir com seffectu 1
+voir compteur 1
+voir compteur ordin 1
+voir coupur 1
+voir coupur coupur 1
+voir court 1
+voir court circuit 1
+voir d eliaison 1
+voir dan 1
+voir dan le 1
+voir de 2
+voir de fa 1
+voir de linec 1
+voir de rendr 1
+voir disc 1
+voir disc pr 1
+voir disc sect 1
+voir dist 1
+voir dist matr 1
+voir elag 1
+voir elag tr 1
+voir environ 1
+voir environ cour 1
+voir etiqu 1
+voir etiqu de 1
+voir exempl 1
+voir exempl de 1
+voir exempl figur 1
+voir fi. 1
+voir figur 2
+voir fus 1
+voir fus propag 1
+voir gaus 1
+voir gaus uniform 1
+voir group 1
+voir group de 1
+voir inec 1
+voir inform 1
+voir inform esp 1
+voir l etud 1
+voir la 2
+voir la figur 2
+voir la sect 1
+voir la synth 1
+voir la ver 1
+voir lagenc 1
+voir lagenc de 1
+voir lallur 1
+voir lallur de 1
+voir lan 1
+voir lan de 1
+voir lannec 1
+voir larticl 1
+voir larticl de 1
+voir le 2
+voir le chapitr 1
+voir le cod 1
+voir le figur 1
+voir le livr 1
+voir le nid 1
+voir le paragraph 1
+voir le prem 1
+voir le rapport 1
+voir le travaux 1
+voir le tutoriel 1
+voir lexempl 2
+voir lexempl du 2
+voir lexp 1
+voir lexp er 1
+voir mesur 1
+voir mesur invar 1
+voir net 1
+voir net de 1
+voir par 1
+voir par exempl 1
+voir pil 1
+voir pil glob 1
+voir point 1
+voir point de 1
+voir pointeur 1
+voir pointeur de 1
+voir priv 1
+voir priv es 1
+voir r ef 1
+voir recon 1
+voir recon arbr 1
+voir recon identit 1
+voir recon mod 1
+voir recouvr 1
+voir recouvr du 1
+voir se 1
+voir sect 2
+voir som 1
+voir som de 1
+voir sup 1
+voir sup erieur 1
+voir sur 1
+voir sur la 1
+voir tabl 1
+voir tabl a.2 1
+voir tableau 1
+voir tableau a.1 1
+voir tr 1
+voir var 1
+voir var al 1
+voisin 5
+voisin ci 1
+voisin dan 1
+voisin dan le 1
+voisin de 2
+voisin de ce 1
+voisin de chaqu 1
+voisin de tc 1
+voisin de xc 1
+voisin dev 1
+voisin dev alor 1
+voisin dun 1
+voisin dun don 1
+voisin entr 1
+voisin entr chromosom 1
+voisin fa 1
+voisin fa autour 1
+voisin pour 1
+voisin pour la 1
+voisin sur 1
+voisin sur un 1
+voit 2
+voit donc 1
+voit donc qu 1
+voit pa 1
+voit pa le 1
+voit qu 1
+voit qu le 1
+voit quon 1
+voit quon se 1
+vol 81
+vol ac 1
+vol ac align 1
+vol adm 1
+vol and var 1
+vol approach 1
+vol chang 1
+vol could transl 2
+vol d ei 1
+vol dat 2
+vol dat se 1
+vol de 4
+vol de commun 1
+vol de equ 1
+vol de lan 1
+vol de recur 1
+vol deequ 1
+vol el 2
+vol funct 1
+vol ii 4
+vol intersect 1
+vol lying 1
+vol of commun 1
+vol of computer 1
+vol of dat 3
+vol of imag 1
+vol of inform 1
+vol of liter 1
+vol of qualif 1
+vol of siz 1
+vol of spat 1
+vol of wir 2
+vol on qualit 1
+vol pr 1
+vol pr appl 1
+vol preserv 1
+vol reconstruc 1
+vol ten 1
+vol threshold 1
+vol v9 1
+vol warp 1
+vol. 1
+vol.1 2
+vol.11 1
+vol.12 1
+vol.13 1
+vol.13 no.4 1
+vol.13 no.6 1
+vol.15 2
+vol.15 nb.6 1
+vol.19 1
+vol.2 1
+vol.20 1
+vol.22 1
+vol.22 nb.7 1
+vol.23 1
+vol.30 1
+vol.34 1
+vol.39 1
+vol.4 1
+vol.49 1
+vol.5 1
+vol.se 1
+volatil 2
+volit 1
+volit explan 1
+volit rol 1
+volit rol rel 1
+volont 3
+volont e de 2
+volter 1
+volumeapproach 1
+volumeapproach and disc 1
+volumeter 1
+volumeter measur 1
+volumineus 1
+volumineus perm 1
+volumineus perm en 1
+volunt 1
+volunteer 1
+volunteer to particip 1
+volut 1
+volut de 1
+volut de la 1
+volut de notr 1
+volut dun 1
+volut dun tumeur 1
+volut e par 1
+volut prochain 1
+volut prochain ver 1
+von 7
+von computer 1
+von computer model 1
+von eick 1
+von eik 1
+von humboldt 1
+von humboldt found 1
+von karger 1
+von mayrhauser 1
+von neuman 2
+von neuman comput 1
+vont 4
+vont ain 2
+vont ain coexister 1
+vont ain remplacer 1
+vont dan 1
+vont dan le 1
+vont dispar 1
+vont dispar tr 1
+vont etr 2
+vont etr trait 1
+vont etr util 1
+vont partager 1
+vont partager un 1
+vont permettr 1
+vont y mener 1
+voqu 1
+voron 3
+voron cel 1
+voron cel assoc 1
+voron cel shar 1
+voron diagram 3
+voron diagram delaun 1
+voron diagram wh 1
+voron edg 1
+voron edg correspon 1
+voron fac 1
+voron skel 1
+voron skel cr 1
+voron skel cut 1
+voron skel ev 1
+voron skel li 1
+voron skel lying 1
+voron skel repr 1
+voron skel st 1
+voron skel ten 1
+voron ver 1
+voron ver li 1
+voronkov 1
+vot 6
+vot al prov 1
+vot ar accuml 1
+vot ar gather 1
+vot be gather 1
+vot bi 1
+vot confid 1
+vot confid estim 1
+vot each correspon 1
+vot for m1 1
+vot funct 1
+vot giv 1
+vot imag 1
+vot imag major 1
+vot in favor 1
+vot integr 1
+vot matr 1
+vot matr vtot 1
+vot may block 1
+vot method 1
+vot nvt 1
+vot obtain 1
+vot obtain indep 1
+vot of author 1
+vot of neighbor 1
+vot or dec 1
+vot propag 1
+vot propag matr 1
+vot result 1
+vot schem 2
+vot scor 1
+vot th rec 1
+vot that proc 1
+vot to becom 1
+vot vect 2
+votr 1
+votr toit 1
+votr toit pen 1
+vou 2
+vou ee 2
+vouch 1
+vouch cur 1
+vouch cur slav 1
+vouch loc 1
+vouch nl 1
+vouch rloc.vouch 1
+vouch to nextloc 1
+vouch vouch 1
+voudr 2
+voudr aus 1
+voudr aus particl 1
+voudr dabord 1
+voudr dabord remerc 1
+voudr egal 1
+voudr egal saluer 1
+voudr en 1
+voudr remerc 2
+voudr remerc le 1
+voudr remerc mon 1
+voul 1
+voul r aliser 1
+vouloir 1
+vouloir imposer 1
+vouloir imposer un 1
+voulu 3
+voulu apporter 1
+voulu aux 1
+voulu aux don 1
+voulu diriger 1
+voulu diriger ce 1
+voulu pour 1
+voulu pour le 1
+vous 2
+vous de 1
+vous de bien 1
+vous pl 1
+vout 1
+vout car 1
+vout din 1
+vout din vout 1
+vout dout 1
+vout dout din 1
+vowel 2
+vowel dat 1
+vowel win 1
+vowel win aver 1
+voxel 2
+voxel lik connect 1
+voxel method 1
+voxel peut 1
+voxel peut tr 1
+voxel reconstruc 1
+voxel siz 1
+voxel techniqu 1
+voyageur 1
+voyageur de 1
+voyageur de commerc 1
+voyon 3
+voyon com 1
+voyon dan 1
+voyon maint 1
+voyon maint com 1
+vp 1
+vpm 1
+vpm and csvpm 1
+vr 6
+vr a la 1
+vr and jo 1
+vr apr 1
+vr apr es 1
+vr en 1
+vr en entr 1
+vr et le 1
+vr et nimp 1
+vr et qu 1
+vr fdepartmentl 1
+vr grandeur 1
+vr grandeur un 1
+vr init 1
+vr isol 1
+vr isol ee 1
+vr jusqu 1
+vr ou 3
+vr ou faus 2
+vr ou faux 1
+vr par 1
+vr par linstruc 1
+vr point 1
+vr point de 1
+vr pour 3
+vr pour le 1
+vr pour tout 1
+vr s 1
+vr s il 1
+vr si 1
+vraim 2
+vraim dunif 1
+vraim justif 1
+vraim justif ee 1
+vraim n ecessair 1
+vraim s etendr 1
+vraim util 1
+vraisembl 2
+vraisembl assoc 1
+vraisembl de 1
+vraisembl de trajectoir 1
+vraisembl du 1
+vraisembl du pa 1
+vraisembl dun 1
+vraisembl dun trajectoir 1
+vraisemblabl 1
+vraisemblabl a mettr 1
+vram 1
+vram kouramaij 1
+vrij 1
+vs 21
+vs chac 1
+vs chac multilevel 1
+vs chunk 1
+vs chunk siz 1
+vs del 1
+vs eclip 1
+vs eclip sparcst2 1
+vs ext 1
+vs ext recov 1
+vs fast 1
+vs fast path 1
+vs gklr 1
+vs gklr refin 1
+vs hardwar 1
+vs hem 1
+vs multilevel 1
+vs multilevel recur 1
+vs responc 1
+vs responc tim 1
+vs th bam 1
+vs tim 1
+vs vc 1
+vs.group 1
+vs.group siz 1
+vsourc 1
+vsourc wish 1
+vsplit 1
+vsplit m mn 1
+vsplit nc 1
+vsplit paradigm 1
+vsplit vsplit1 1
+vsplit1 1
+vsplitn 1
+vt 4
+vt deg 1
+vt fident 1
+vtabl 1
+vtot 1
+vtot contain 1
+vu 6
+vu a la 1
+vu applicatif 1
+vu au 1
+vu au chapitr 1
+vu au paragraph 1
+vu au th 1
+vu aus 1
+vu aus qu 1
+vu com 3
+vu com le 1
+vu com lensembl 1
+vu com un 1
+vu dacc 1
+vu dacc el 1
+vu dam 1
+vu dam eliorer 1
+vu dan 1
+vu dan ce 1
+vu de 2
+vu de la 1
+vu de lesprit 1
+vu de lunit 1
+vu de son 1
+vu dun 2
+vu dun coop 1
+vu dun eventuel 1
+vu dun ex 1
+vu dun mi 1
+vu dun val 1
+vu dunif 1
+vu dunif le 1
+vu economiqu 1
+vu economiqu quarchitectur 1
+vu en 1
+vu en eo 1
+vu informatiqu 1
+vu la 2
+vu la sourc 1
+vu la strat 1
+vu le 1
+vu le jour 1
+vu lefficacit 1
+vu lor 1
+vu lor du 1
+vu possibl 1
+vu possibl de 1
+vu pr 1
+vu pr ec 1
+vu qu 2
+vu qu 8j 1
+vu qu la 1
+vu qu le 2
+vu quil 2
+vu quil est 1
+vu quil etait 1
+vu quil pouvait 1
+vu th 2
+vu th eoriqu 1
+vu th oriqu 1
+vual 1
+vual in scientif 1
+vuillemin 2
+vulcan 1
+vulcan and a0um 1
+vuruvrvtur 1
+vus 1
+vus com 1
+vus com le 1
+vv0 1
+vv00 1
+vv00g 1
+vw 3
+vw ged 1
+vw ged pascalstr 1
+vwg 1
+vx 1
+vx1 1
+vy 1
+vyn 1
+w.a 1
+w.b 1
+w.c 2
+w.d 1
+w.e 1
+w.h 2
+w.j 3
+w.k 1
+w.l.o.g 3
+w.m 2
+w.r 1
+w.r.t 5
+w.s 1
+w.t 1
+w.v 1
+w.v wmac 1
+w.v wmin 1
+w0 6
+w0 ae 1
+w0 ae w1 1
+w0 and u0 1
+w0 is succ 1
+w0 j oe 1
+w0 w0w1 1
+w0 y nod 1
+w01m 1
+w0v1v2 1
+w0w1 1
+w1 17
+w1 ae 1
+w1 and w2 1
+w1 bal 1
+w1 bb 1
+w1 cbaln 1
+w1 cbalr 1
+w1 fun 1
+w1 ha high 1
+w1 mod 1
+w1 mod p1 1
+w1 u wn 1
+w1 u2 1
+w1 u2 w2 1
+w1 v1 1
+w1 w10 1
+w1 w2 1
+w1 w2 wmac 1
+w1 weak 1
+w10 1
+w1vn1 1
+w1xi 1
+w2 9
+w2 bal 1
+w2 bal cn 1
+w2 bb 1
+w2 cbalr 1
+w2 ha cluster 1
+w2 is giv 1
+w2 is shown 1
+w2 t2 1
+w2 u2 1
+w2 w1 1
+w2 weak 1
+w2 wmac 1
+w2 wmac cbaln 1
+w2 wmac w1 1
+w2f0 1
+w2jk 1
+w2jk 2e 1
+w2jk 2e a2k 1
+w2jm 1
+w2jm 2e 1
+w2jm 2e apj 1
+w2jn 1
+w2jn 2e 1
+w2jn 2e apj 1
+w2l 1
+w2l ed 1
+w2n 1
+w2s 1
+w2xi 1
+wa 5
+wa approach 1
+wa approach handl 1
+waart 1
+wad 1
+wad88 1
+wadg 2
+wadg adopt 1
+wadler 1
+wadsworth 2
+wag 1
+wag75 1
+wagner 2
+wahl 1
+waibel 2
+waikat 2
+waikat.ac.nz 1
+wait 36
+wait an interv 1
+wait befor sen 1
+wait befor upd 1
+wait condit 1
+wait condit allow 1
+wait for acknowledg 2
+wait for acknowledgm 1
+wait for connect 1
+wait for del 1
+wait for me 1
+wait for memor 1
+wait for receipt 1
+wait for result 1
+wait for serv 1
+wait for shar 1
+wait for transact 1
+wait form 1
+wait fr 1
+wait fr comput 1
+wait fr variabl 1
+wait funct 1
+wait gener 1
+wait gener funct 1
+wait is bound 1
+wait method 1
+wait nod 1
+wait nod del 1
+wait nod pa 1
+wait on sensit 1
+wait on signam 1
+wait prov 1
+wait return 1
+wait stat 1
+wait threshold 1
+wait tim 3
+wait to ge 1
+wait to rec 2
+wait to remov 1
+wait until h8x0 1
+wait until lp 1
+wait v1in 1
+wait v1in v2in 1
+wait wh help 1
+wait with addit 1
+wait1 1
+wait1 s2 1
+wait1 s2 s3 1
+wait2 1
+wait2 ns 1
+waiter 1
+waiter and thought 1
+waiterschain 1
+waiterschain lockschain 1
+waitsom 1
+waitsom for ef 1
+wak 3
+wak up cost 1
+wakeup 1
+wakeup pkt 1
+wakit 1
+wakit help 1
+wal 9
+wal and rand 1
+wal but say 1
+wal describ 1
+wal model 1
+wal mostaf 1
+wal mostaf mukesh 1
+wal non 1
+wal non parameter 1
+wal schwartz 1
+wal stupid 1
+wal stupid model 1
+wal75 1
+wal91 1
+walk 6
+walk a pair 1
+walk al traver 1
+walk cfg 1
+walk for 1
+walk of traver 1
+walk requir 1
+walk through 1
+walk through perform 1
+walkabout 1
+walkabout strength 1
+walkabout strength med 1
+walkabout strength requir 1
+walkabout strength weak 1
+walker 4
+walkthrough 1
+wallac 3
+wallac prop 1
+wallac prop part 1
+wallach 2
+walsh 2
+walsh coeff 1
+walsh indirect 1
+walsh indirect appl 1
+walsh schem 1
+walsh schem transform 1
+walt 1
+walt hal 1
+walt hal milt 1
+walter 7
+walter de 1
+walter de gruyter 1
+walter h ursch 1
+walter hil 1
+walter olthoff 1
+walter woborschil 1
+walth 1
+walth dun 1
+waltham 3
+walther 1
+waltz 2
+walworth 1
+walz 1
+wam 4
+wam afin 1
+wam agenc 1
+wam agenc de 1
+wam agenc dun 1
+wam allou 1
+wam ar put 1
+wam assimil 1
+wam assimil es 1
+wam assum 1
+wam assum tag 1
+wam avec 1
+wam avec pointeur 1
+wam avec som 1
+wam ba 1
+wam ba co 1
+wam ba prolog 1
+wam by record 1
+wam can ba 1
+wam conduit 1
+wam consid 1
+wam consid erent 1
+wam d efinit 1
+wam de 1
+wam de man 1
+wam de partit 1
+wam de qsort 1
+wam dintroduir 1
+wam dintroduir un 1
+wam doit 1
+wam doit restaurer 1
+wam el 1
+wam en 1
+wam est 1
+wam est abstrait 1
+wam est dit 1
+wam est rest 1
+wam est sp 1
+wam et conv 1
+wam et cr 1
+wam et de 1
+wam et pr 1
+wam et se 1
+wam et tail 1
+wam etant 1
+wam etant la 1
+wam fait 1
+wam fait appel 1
+wam fonct 1
+wam fonct mal 1
+wam for clp 1
+wam gest 1
+wam gest du 1
+wam impl 1
+wam impl ement 1
+wam instruc 1
+wam instruc de 1
+wam lik instruc 1
+wam ma 1
+wam ma dextrair 1
+wam model 1
+wam n ecessair 1
+wam na 1
+wam na pa 1
+wam ne 1
+wam ne fait 1
+wam ninterv 1
+wam ninterv pa 1
+wam ont 1
+wam ont aus 1
+wam ou 1
+wam ou pa 1
+wam par 1
+wam par le 1
+wam perm 1
+wam peut 1
+wam peut etr 1
+wam peut requ 1
+wam pour 1
+wam pour compiler 1
+wam pour proposer 1
+wam prim 1
+wam prov 1
+wam qu 1
+wam qu perm 1
+wam rajout 1
+wam refin 1
+wam rep 1
+wam rep sur 1
+wam restaur 1
+wam restaur aussit 1
+wam san aut 1
+wam sappu 1
+wam sappu sur 1
+wam se 1
+wam se caract 1
+wam sinterdit 1
+wam sinterdit donc 1
+wam soit 1
+wam sont 1
+wam sont atteint 1
+wam sont nombreus 1
+wam standard 1
+wam standard inclut 1
+wam suff 1
+wam suiv 1
+wam sur 1
+wam sur de 1
+wam var 1
+wam with typ 1
+wan 4
+wan environm 1
+wan fl 1
+wan87 1
+wan88 1
+wan89 1
+wan92 1
+wand 1
+wang 13
+wang and horac 1
+wang and s.n 1
+wang and weihl 1
+wang rl 1
+want 52
+want a nod 1
+want a univer 1
+want docum 1
+want docum relev 1
+want infinit 1
+want our network 1
+want our program 1
+want our system 1
+want particl 1
+want siml 1
+want th level 1
+want th prob 1
+want th system 2
+want think 1
+want to achief 1
+want to assoc 1
+want to av 1
+want to belief 1
+want to bisect 1
+want to bound 1
+want to build 2
+want to carv 1
+want to claim 1
+want to compar 1
+want to comput 2
+want to concentr 1
+want to construc 1
+want to def 2
+want to design 1
+want to determin 2
+want to distribut 1
+want to download 1
+want to emph 1
+want to en 1
+want to exclus 1
+want to find 4
+want to form 1
+want to gather 1
+want to ge 1
+want to giv 1
+want to guar 1
+want to inclus 3
+want to know 2
+want to lim 1
+want to link 1
+want to look 1
+want to maintain 1
+want to maxim 1
+want to minim 1
+want to model 1
+want to nd 1
+want to pay 1
+want to point 1
+want to proceed 1
+want to prov 1
+want to reap 1
+want to reason 1
+want to ref 1
+want to relac 1
+want to remov 1
+want to repr 1
+want to say 1
+want to select 1
+want to show 2
+want to sort 1
+want to specif 2
+want to spen 1
+want to switch 1
+want to systemat 1
+want to tak 1
+want to tel 1
+want to us 1
+want to writ 1
+war 9
+war a ch 1
+war abstract 3
+war abstract mach 3
+war com 1
+war com exempl 1
+war dan 1
+war dan sa 1
+war further 1
+war la 1
+war lim 1
+war prolog 1
+war prolog eng 1
+war83 2
+war87 1
+wareh 1
+wareh and caus 1
+wareh ar 1
+wareh ar st 1
+wareh implem 1
+wareh is swept 1
+wareh maintain 1
+wareh maintain comput 1
+wareh manag 1
+wareh manag schem 1
+wareh to st 1
+warfar 1
+warfar system 1
+warfar system command 1
+warm 2
+warm start 1
+warm up period 1
+warmuth 1
+warn 5
+warn or except 1
+warp 3
+warwick 1
+warwick coventr 1
+warwick coventr cv4 1
+wash 1
+washabaugh 1
+washbrook 1
+washbrook and keravnou 1
+washingt 11
+washingt box 1
+washingt d.c 2
+washingt st 1
+washingt univer campus 1
+wasserman 2
+wast 16
+wast a great 1
+wast autonom 1
+wast autonom mobil 1
+wast dr 1
+wast in attempt 1
+wast in prec 2
+wast in worst 1
+wast network 1
+wast network bandwidth 1
+wast of spac 2
+wast on further 1
+wast tim 1
+wast to wait 1
+wast valu 1
+wast valu resourc 1
+wast water 1
+wast water treatm 1
+wat 1
+wat 203ex 1
+wat 203ex len 1
+watanab 4
+watanab and akinor 1
+watch 1
+watch th counter 1
+watec 1
+water 6
+water and ml 1
+water equ 1
+water flow 1
+water for mak 1
+water hydr 1
+water hydr dat 1
+water mark 1
+water molecl 1
+water st 1
+water treatm 1
+water treatm plant 1
+waterl 2
+waterl mapl 1
+waterl mapl publ 1
+waterl waterl 1
+watkin 1
+watr 2
+watr kuhn 1
+watson 7
+watson graph 1
+watson graph partit 1
+watson research 4
+watson research center 4
+watson.ibm.com 2
+watson.ibm.com email 1
+watzlawik 1
+watzlawik et brun 1
+wav 5
+wav em 1
+wav length 1
+wav of pdp 1
+wav tank 1
+waveform 3
+waveform fw 1
+waveform is shar 1
+waveform produc 1
+wavefront 3
+wavefront method 3
+wavefront method revisit 2
+waveguid 1
+waveguid in gener 1
+wavel 3
+wavel and appl 1
+wavel and sign 1
+wavel and stat 1
+wavel appl 1
+wavel ba 2
+wavel ba decomposit 1
+wavel ba method 1
+wavel ba.2 1
+wavel coeff 1
+wavel correspon 1
+wavel decomposit 3
+wavel decomposit level 1
+wavel decoposit 1
+wavel domain 2
+wavel domain edg 1
+wavel domain threshold 1
+wavel filter 1
+wavel for de 1
+wavel funct 2
+wavel in geoph 1
+wavel method 1
+wavel model 1
+wavel pack 1
+wavel pack ba 1
+wavel pack decomposit 1
+wavel pack expan 1
+wavel pack repr 1
+wavel pack tr 1
+wavel pack using 1
+wavel regl 1
+wavel regl method 1
+wavel repr 1
+wavel shrink 1
+wavel threshold 1
+wavel threshold estim 1
+wavel threshold method 1
+wavel threshold schem 1
+wavel transform 3
+wavel transform achief 1
+wavel transform domain 1
+wavel transform filter 1
+wavel transform repr 1
+wavel transform subband 1
+wavel.3 1
+wawrzynek 1
+way 55
+way at high 1
+way dep 1
+way inclus 1
+way inclus scatter 1
+way of approxim 1
+way of carv 1
+way of circumv 1
+way of deal 1
+way of deriv 1
+way of eff 1
+way of fir 1
+way of identif 1
+way of implem 1
+way of reason 1
+way of remov 1
+way of simplif 1
+way of think 1
+way quit simil 1
+way th id 1
+way that g0 1
+way that mak 1
+way to achief 3
+way to carv 1
+way to continu 1
+way to div 1
+way to en 1
+way to estim 1
+way to explain 1
+way to exploit 1
+way to fact 1
+way to identif 1
+way to impl 2
+way to improv 1
+way to incr 1
+way to mak 1
+way to pack 1
+way to perform 1
+way to reduc 1
+way to restructur 1
+way to reus 1
+way to search 1
+way to yield 1
+way transact 1
+wayn 3
+wayn kel 1
+wayn niblack 1
+wayn sawdon 1
+wbaln 1
+wbm 1
+wc1 1
+wc1 fl 1
+wc1 wc2 1
+wc1 wc2 over 1
+wc1 with prob 1
+wc1.goal 1
+wc2 1
+wc2 def 1
+wc2 def workflow 1
+wc2 fl 1
+wc2 over 1
+wc2 over wc1 1
+wc2 with prob 1
+wc2.goal 1
+wcb 1
+wcb lsb 1
+wcc 1
+wcc icn 1
+wch 1
+wch se.smu.edu 1
+wcon 1
+wconfec 1
+wcp 1
+wcp maxfrp 1
+wcp maxfrp gp 1
+wdu 1
+wdu unb.ca 1
+we 12
+we et al 2
+we la 1
+we ling 1
+we s.m 1
+we76 1
+we90 1
+weak 32
+weak amplif 1
+weak and strong 1
+weak assum 1
+weak bs 1
+weak bs model 1
+weak but suff 1
+weak coh 1
+weak con 2
+weak con condit 1
+weak con giv 1
+weak con protocol 1
+weak con requir 1
+weak constraint 1
+weak d e0 1
+weak diamon 1
+weak diamon proper 1
+weak ext 1
+weak fair 2
+weak fair guar 1
+weak for kind 1
+weak form 1
+weak head 2
+weak head norm 2
+weak if fault 1
+weak it classif 1
+weak logarithm 1
+weak logarithm tim 1
+weak membership 1
+weak membership proper 1
+weak memor 1
+weak memor defin 1
+weak non 1
+weak non determ 1
+weak non determin 1
+weak nondeterm 1
+weak of cur 1
+weak of exact 1
+weak of minl 1
+weak oper 1
+weak or rel 1
+weak order 1
+weak preserv 1
+weak problem 1
+weak read 1
+weak read stat 1
+weak read writ 1
+weak saf 1
+weak spar 1
+weak spar langu 1
+weak strong 1
+weak strong form 1
+weak th abil 1
+weak th suff 1
+weak theor 1
+weak theor domain 1
+weak to accommod 1
+weak v v0c 1
+weak v v1 1
+weak ver 1
+weak weak 1
+weak writ 1
+weak writ stat 1
+weaker 12
+weaker abstract 1
+weaker cl 1
+weaker condit 1
+weaker constraint 1
+weaker form 1
+weaker kind 1
+weaker level 1
+weaker level succ 1
+weaker lock 1
+weaker membership 1
+weaker membership proper 1
+weaker model 1
+weaker on 1
+weaker oper 1
+weaker oper reportk 1
+weaker polynom 1
+weaker polynom tim 1
+weaker proper 1
+weaker pseud 1
+weaker pseud gib 1
+weaker requir 2
+weaker suff 1
+weaker suff condit 1
+weaker th strength 1
+weaker than monot 1
+weaker than virtu 1
+weaker var 1
+weakest 4
+weakest constraint 1
+weakest constraint weak 1
+weakest membership 1
+weakest precondit 1
+weakest precondit sem 1
+weakest result 1
+weakl 1
+weakl a coh 1
+weakl nl 1
+weakt 1
+wealth 4
+wealth of evid 1
+wealth of funct 1
+wealth of inform 2
+wealth of resourc 1
+weapon 1
+weapon smuggl 1
+wear 1
+wear a badg 1
+wear hi act 1
+wear on regl 1
+weather 1
+weather report 1
+weatherbur 1
+web 9
+web at http 1
+web ba 2
+web ba algorithm 1
+web ba mater 1
+web ba program 1
+web ba remot 1
+web browser 2
+web cal yah 1
+web confer4 1
+web docum 1
+web est 1
+web ha op 1
+web is grow 1
+web prox 1
+web qu 1
+web qu se 1
+web search 1
+web server 2
+web server ba 1
+web techn 1
+web techn capabil 1
+web technolog 1
+weber 5
+weber and anoop 1
+weber wulff 1
+wec91 1
+wechler 2
+wedgel 1
+wednesd 1
+week 5
+week and hand 1
+week by integr 1
+week of effort 1
+week to compl 1
+week to run 1
+week with propag 1
+wegener 2
+wegener result 1
+wegman 1
+wegner 5
+wegner qualif 1
+weib 1
+weib wu 1
+weichang 1
+weichang du 1
+weidner 1
+weidong 1
+weidong chen 1
+weif 1
+weif liang 1
+weif liang richard 1
+weig 1
+weig and n.a 1
+weig et al 1
+weigh 1
+weigh matr 1
+weigh matr conjectur 1
+weight 34
+weight 2t 1
+weight 2w 1
+weight 4n 1
+weight 5w 1
+weight accord 1
+weight addit 1
+weight altern 1
+weight and concern 1
+weight and discard 1
+weight and input 1
+weight and visit 1
+weight appropr 1
+weight ar ad 1
+weight ar assoc 1
+weight ar obtain 1
+weight ar upd 1
+weight arboresc 1
+weight arboresc root 1
+weight assign 1
+weight assoc 2
+weight augm 1
+weight automat 1
+weight aver 3
+weight aver schem 1
+weight bridg 1
+weight bridg connect 1
+weight by ad 1
+weight by switch 1
+weight calcl 1
+weight chang 2
+weight chang algorithm 1
+weight chang momentum 1
+weight collect 1
+weight comb 1
+weight compar 1
+weight comput 1
+weight connect 3
+weight connect graph 1
+weight criter 1
+weight criter yield 1
+weight dec 1
+weight dec techniqu 1
+weight del 1
+weight determin 1
+weight direct 2
+weight direct acycl 1
+weight direct graph 1
+weight dynam 1
+weight edg 3
+weight edg inc 1
+weight elim 1
+weight equ 1
+weight ew 1
+weight ew0 1
+weight fact 2
+weight fair 1
+weight fair queu 1
+weight from hid 1
+weight from input 1
+weight from nod 1
+weight funct 2
+weight fw 1
+weight gener 1
+weight graph 4
+weight graph g0 1
+weight id 1
+weight in uj 1
+weight in wj 1
+weight individu 1
+weight init 1
+weight inver 1
+weight is del 1
+weight is high 1
+weight is w.v 1
+weight layer 1
+weight lec 1
+weight lec approach 1
+weight match 1
+weight matr 2
+weight method 1
+weight mut 1
+weight mut const 1
+weight not introduc 1
+weight not produc 1
+weight nw 1
+weight object 1
+weight object identif 1
+weight obtain 1
+weight of aug 1
+weight of built 1
+weight of edg 1
+weight of feedfor 1
+weight of firmwar 1
+weight of g0 1
+weight of graph 1
+weight of interfer 1
+weight of point 1
+weight of prun 1
+weight of ver 1
+weight on input 1
+weight on output 1
+weight outg 1
+weight outg edg 1
+weight path 1
+weight pattern 1
+weight pattern ba 1
+weight proc 1
+weight propag 1
+weight propag matr 1
+weight remain 1
+weight round robin 1
+weight row 1
+weight row aver 1
+weight se 1
+weight self 1
+weight self del 1
+weight shar 1
+weight smaller 1
+weight sobolev 1
+weight sobolev spac 1
+weight span 3
+weight span bridg 1
+weight span tr 3
+weight steiner 1
+weight steiner tr 1
+weight subgraph 1
+weight sum 5
+weight sum input 1
+weight supergraph 1
+weight techniqu 1
+weight th strength 1
+weight that bridg 1
+weight that connect 1
+weight that contribut 1
+weight to inspect 1
+weight to zer 1
+weight tw connect 1
+weight uij 1
+weight undirect 1
+weight undirect graph 1
+weight using 1
+weight valu 1
+weight vect 2
+weight vect wj 1
+weight vot 1
+weight vot giv 1
+weight w1 2
+weight wa del 1
+weight wer random 1
+weight wer se 1
+weight which tak 1
+weight wi 2
+weight wi calcl 1
+weight wil self 1
+weight wjk 1
+weight zer 1
+weight zer assign 1
+weigth 1
+weigth of built 1
+weihl 1
+weikum 3
+weinsh 1
+wel 3
+welch 1
+welch jr 1
+welcom 2
+welcom suggest 1
+welkowitz 1
+wellconnect 1
+welldefin 1
+wellform 1
+wellform expr 1
+wellkind 1
+wellkind of subderiv 1
+wellkind typ 1
+wellknown 1
+wellknown open problem 1
+wellman 1
+welltyp 1
+welltyp program 1
+welltyp term 1
+wellunderstood 1
+wellunderstood ca 1
+welsch 1
+welt 1
+wen 3
+wen ch 1
+wenban 1
+weng 1
+went 3
+went further 1
+wentzel 1
+wentzel de 1
+wentzel de petit 1
+wenzl 1
+wequ 1
+werb 1
+werner 3
+werner ai.univ.ac.at 1
+werner horn 2
+wesl 36
+wesl publ 11
+wesl publ co 1
+wesl publ compan 10
+wesl ser 1
+wesolowsk 1
+west 4
+west neighbor 1
+western 5
+western gregor 1
+western gregor calendar 1
+western ontar 2
+western ontar london 1
+western research 1
+western research labor 1
+western reserv 1
+westingh 1
+westingh savannah 1
+westingh savannah river 1
+westview 1
+westview pr 1
+wettschereck 1
+wettschereck dietterich 1
+weyuker 1
+weyuker conclus 1
+weyuker st 1
+wf 2
+wf74 1
+wfw 1
+wfwc 1
+wg11 1
+wg11 n0820 1
+wg16 1
+wg16 docum 1
+wg16 docum n24 1
+wg8 1
+wg8 n745 1
+wg83 1
+wg89 2
+wggp 1
+wggp produc 1
+wgp 1
+wgp achief 1
+wgp and osl 1
+wgp ar ba 1
+wgp attempt 1
+wgp befor order 1
+wgp contain 1
+wgp contain subrout 1
+wgp cut 1
+wgp for graph 1
+wgp incr 1
+wgp is high 1
+wgp is indep 1
+wgp libr 1
+wgp match 1
+wgp match algorithm 1
+wgp offer 1
+wgp offer signif 1
+wgp oper 1
+wgp oper count 1
+wgp opt 1
+wgp order 1
+wgp order ba 1
+wgp order nnzosl 1
+wgp order reduc 1
+wgp produc 1
+wgp produc order 1
+wgp reduc 1
+wgp regard 1
+wgp rel 1
+wgp result 1
+wgp return 1
+wgp switch 1
+wgp us 1
+wgp us ew0 1
+wgrad 1
+wgrad sa 1
+wgrad sa sb 1
+wh 118
+wh 2k2 1
+wh 2pb 1
+wh a appear 1
+wh a backlog 1
+wh a block 1
+wh a character 1
+wh a compon 2
+wh a condit 1
+wh a conform 1
+wh a constraint 1
+wh a cycl 1
+wh a deeper 1
+wh a definit 1
+wh a demand 1
+wh a direct 1
+wh a flat 1
+wh a funct 1
+wh a method 1
+wh a non 1
+wh a path 1
+wh a piec 1
+wh a prec 1
+wh a record 1
+wh a rol 1
+wh a se 2
+wh a singl 2
+wh a slow 1
+wh a subcl 1
+wh a user 1
+wh a0 1
+wh a00 1
+wh a00j 1
+wh a00j result 1
+wh ack 1
+wh act 1
+wh act po4 1
+wh addit 1
+wh addit test 1
+wh ae 3
+wh ai 3
+wh ajj 1
+wh al agent 1
+wh al block 1
+wh al log 1
+wh al nod 1
+wh al pack 1
+wh al proc 2
+wh al red 1
+wh ambigu 1
+wh an 1
+wh an act 1
+wh an appl 1
+wh an except 1
+wh an idl 1
+wh appropr 2
+wh aspect 1
+wh atom 1
+wh audit 1
+wh audit trail 1
+wh aug 1
+wh autom 1
+wh autom spec 1
+wh ax 1
+wh b intersect 1
+wh b stand 1
+wh b0 1
+wh b2 1
+wh benchmark 1
+wh bl 1
+wh bm 1
+wh bool 1
+wh bool gen 1
+wh budg 1
+wh budgetu 1
+wh c 2ff 1
+wh c0 1
+wh c00 1
+wh c00j 1
+wh c00j result 1
+wh car 1
+wh card 1
+wh cc 1
+wh cc tloc 1
+wh chtnil 1
+wh chtnil cdr 1
+wh cifnil 1
+wh cifnil cdr 1
+wh clock 1
+wh closur 1
+wh cn 1
+wh cnextmac 1
+wh cod 1
+wh color 1
+wh color l1 1
+wh color lr 1
+wh commun 1
+wh commun del 1
+wh comput 2
+wh comput involut 1
+wh condit 2
+wh condit deg 1
+wh connect 2
+wh connect start 1
+wh contour 1
+wh contour segm 1
+wh control 1
+wh control regr 1
+wh conv 1
+wh count 2
+wh cp 1
+wh cr 1
+wh d denot 1
+wh d maxfwt 1
+wh d1 1
+wh dat 2
+wh dat partit 1
+wh dd 1
+wh degr 1
+wh denot 1
+wh denot transp 1
+wh departmentv 1
+wh departmentv toy 1
+wh design 1
+wh design nod 1
+wh dg 1
+wh di 1
+wh differ cl 1
+wh discontinu 1
+wh discontinu lin 1
+wh discr 1
+wh discr lead 1
+wh diversif 1
+wh dk 1
+wh dk be 1
+wh dnam 1
+wh dnam d7 1
+wh dnameu 1
+wh dnamev 1
+wh dnamev d7 1
+wh dom 1
+wh dsj 1
+wh e fxg 1
+wh e nd 1
+wh e1 3
+wh each ai 1
+wh each bi 1
+wh each cl 1
+wh each claus 1
+wh each client 1
+wh each domain 1
+wh each edg 1
+wh each el 1
+wh each gpk 1
+wh each integer 1
+wh each interv 1
+wh each leaf 1
+wh each level 1
+wh each li 1
+wh each member 1
+wh each nod 2
+wh each object 1
+wh each output 1
+wh each particl 1
+wh each pi 1
+wh each proc 1
+wh each procedur 1
+wh each rol 1
+wh each sub 1
+wh each vi 1
+wh each word 1
+wh each xk 1
+wh ei 1
+wh ei iid 1
+wh eij 1
+wh eij denot 1
+wh ej 1
+wh ek 1
+wh el 1
+wh en 1
+wh enam 1
+wh enam e144 1
+wh enam e190 1
+wh equ 1
+wh error 1
+wh error lim 1
+wh ev comput 1
+wh ev switch 1
+wh ev ver 1
+wh exact 2
+wh execut 1
+wh execut start 1
+wh expr 1
+wh f f1 1
+wh f0 1
+wh f1 2
+wh fault 1
+wh fault detect 1
+wh few detail 1
+wh ff1 1
+wh ffdg 1
+wh ffl 1
+wh ffsg 1
+wh ffyxf 1
+wh fi 1
+wh fj 1
+wh fl 1
+wh fo 1
+wh for exampl 1
+wh fr 1
+wh further 1
+wh further research 1
+wh fx 1
+wh fxjg 1
+wh g0 1
+wh g1 1
+wh g1i 1
+wh g1i f1i 1
+wh gener 1
+wh gener recur 1
+wh gi 1
+wh gi fi 1
+wh h1 2
+wh hb 1
+wh he analog 1
+wh hi 1
+wh i stand 1
+wh id 2
+wh id load 1
+wh ik 1
+wh imag 1
+wh in creat 1
+wh ind 1
+wh input 1
+wh instead 1
+wh instruc 1
+wh intern 1
+wh intern memor 1
+wh io 1
+wh is intersect 1
+wh is user 1
+wh it appropr 1
+wh it hap 1
+wh it level 1
+wh it remain 2
+wh item 1
+wh ix 1
+wh ix rc 1
+wh j oper 1
+wh jaj 1
+wh jej 1
+wh jej je0j 1
+wh jf 1
+wh jnpj 1
+wh jsj 1
+wh jsj denot 1
+wh jv 1
+wh k start 1
+wh key 1
+wh keyboard 1
+wh kopt 1
+wh ks 1
+wh l 2n 1
+wh l rang 1
+wh l0 1
+wh leaf 1
+wh leaf nod 1
+wh lh 1
+wh li 4
+wh lij 1
+wh liv 1
+wh lj 1
+wh lm 1
+wh load 1
+wh loc 1
+wh loc inform 1
+wh log 1
+wh logit 1
+wh loop 1
+wh m jaj 1
+wh m0 1
+wh mac 1
+wh mac1 1
+wh mac2 1
+wh manageru 1
+wh member 1
+wh mi 1
+wh mi edg 1
+wh min 2
+wh mk 1
+wh mk cand 1
+wh mod 1
+wh most interpr 1
+wh msg 1
+wh msg expr 1
+wh mst1 1
+wh multipl 2
+wh multipl proc 1
+wh multipl virtu 1
+wh n 2k 1
+wh n f1 1
+wh n0 1
+wh n0 bn 1
+wh n1 1
+wh na 2
+wh nc 1
+wh ndp 1
+wh ndp denot 1
+wh ne 1
+wh ne denot 1
+wh nec 2
+wh ni 1
+wh nj 1
+wh nm 1
+wh no memor 1
+wh no oper 1
+wh no pol 1
+wh nod 3
+wh nod correspon 1
+wh non 1
+wh non master 1
+wh nonstrict 1
+wh np 1
+wh np repr 1
+wh ns 1
+wh o1 1
+wh o2 1
+wh obj 1
+wh oe 4
+wh oe1 1
+wh oeab 1
+wh on loc 1
+wh onl pr 1
+wh op 1
+wh optim 1
+wh our contribut 1
+wh p fx 1
+wh p pointfx 1
+wh p sk 1
+wh p stand 1
+wh pack 1
+wh particip 1
+wh path 1
+wh pc 1
+wh perform 1
+wh ph 1
+wh pk 1
+wh pn 1
+wh pnam 1
+wh pnam p7 1
+wh posit 1
+wh preempt 1
+wh preempt occur 1
+wh prev 1
+wh prev exper 1
+wh prev tr 1
+wh prim 1
+wh prim denot 1
+wh prior 1
+wh prior knowledg 1
+wh probabil 1
+wh proc 1
+wh proof 1
+wh ps 1
+wh ps2xh 1
+wh ps2xh xht 1
+wh ptr 1
+wh q tloc 1
+wh qf 1
+wh qfp 1
+wh qi0 1
+wh qi0 q0 1
+wh qn 1
+wh qr 1
+wh r dn 1
+wh r0 1
+wh random 1
+wh ratingt 1
+wh ratingu 1
+wh recur 1
+wh register 1
+wh rel 3
+wh rel perform 2
+wh requir 1
+wh rev 1
+wh rg 1
+wh ri 2
+wh rl 1
+wh rnam 1
+wh s ps 1
+wh s0 2
+wh s1 1
+wh sal 1
+wh salaryu 1
+wh salaryv 1
+wh se 1
+wh select 1
+wh selfridg 1
+wh selfridg div 1
+wh simplif 1
+wh sit 1
+wh skillsu 1
+wh sn 1
+wh softwar 1
+wh softwar system 1
+wh som rol 1
+wh som switch 1
+wh sometyp 1
+wh sort 2
+wh spec 1
+wh sqr 1
+wh ssn 1
+wh stand 1
+wh stat 1
+wh stat nod 1
+wh strong 1
+wh subsequ 1
+wh subsequ execut 1
+wh subst 1
+wh succ 1
+wh succ refin 1
+wh such error 1
+wh such refin 1
+wh suff 1
+wh suff gener 1
+wh sw 1
+wh t denot 1
+wh t tim 1
+wh t0 2
+wh tc 1
+wh tcol 1
+wh tcol bound 1
+wh teach 1
+wh termin 1
+wh text 1
+wh text lin 1
+wh th acceler 1
+wh th ai 1
+wh th ba 1
+wh th behaviour 1
+wh th belong 1
+wh th birth 1
+wh th block 1
+wh th bound 1
+wh th bth 1
+wh th cal 1
+wh th ceil 1
+wh th chang 2
+wh th character 1
+wh th cl 2
+wh th commun 1
+wh th complec 1
+wh th compon 1
+wh th comput 2
+wh th conclus 1
+wh th concr 1
+wh th condit 3
+wh th confirm 1
+wh th conflu 1
+wh th constraint 2
+wh th control 1
+wh th cost 1
+wh th cur 1
+wh th cycl 1
+wh th dash 1
+wh th dat 1
+wh th day 1
+wh th debugger 1
+wh th dec 2
+wh th differ 2
+wh th direct 1
+wh th discipl 1
+wh th edg 1
+wh th entr 1
+wh th fact 1
+wh th featur 1
+wh th fil 1
+wh th format 1
+wh th funct 1
+wh th goal 1
+wh th gr 1
+wh th graph 1
+wh th harmon 1
+wh th header 1
+wh th host 1
+wh th inequ 1
+wh th inst 2
+wh th integer 1
+wh th interpr 2
+wh th issu 1
+wh th js 1
+wh th kcm 1
+wh th keyword 1
+wh th langu 1
+wh th laser 1
+wh th latter 1
+wh th learner 1
+wh th li 1
+wh th link 1
+wh th load 1
+wh th log 1
+wh th lower 1
+wh th major 1
+wh th margin 1
+wh th meter 1
+wh th modif 1
+wh th modl 1
+wh th multicast 1
+wh th multip 1
+wh th network 1
+wh th nod 1
+wh th non 1
+wh th number 2
+wh th object 1
+wh th oi 1
+wh th oper 1
+wh th order 1
+wh th pack 1
+wh th parallel 1
+wh th part 2
+wh th particip 1
+wh th perc 1
+wh th perform 1
+wh th pi 1
+wh th plan 1
+wh th prob 1
+wh th problem 1
+wh th program 1
+wh th programmer 1
+wh th promot 1
+wh th prompter 1
+wh th proper 1
+wh th prototyp 1
+wh th ps 1
+wh th qs 1
+wh th qu 1
+wh th receiver 1
+wh th replac 1
+wh th repr 1
+wh th requir 1
+wh th respon 1
+wh th restrict 1
+wh th result 1
+wh th return 1
+wh th ri 1
+wh th ring 2
+wh th root 1
+wh th run 1
+wh th runtim 1
+wh th segm 1
+wh th sequ 2
+wh th server 1
+wh th sidelength 1
+wh th sit 1
+wh th siz 1
+wh th slot 1
+wh th sourc 1
+wh th specif 1
+wh th squar 1
+wh th st 2
+wh th start 1
+wh th stronger 1
+wh th structur 1
+wh th substr 1
+wh th system 2
+wh th test 1
+wh th tim 2
+wh th transport 1
+wh th triangl 1
+wh th union 1
+wh th user 1
+wh th var 2
+wh th variabl 1
+wh th vect 1
+wh th work 2
+wh th zs 1
+wh that condit 1
+wh their assoc 1
+wh their habit 1
+wh tim 2
+wh tim var 1
+wh timel 1
+wh tn 1
+wh tn 2im 1
+wh to download 1
+wh to draw 1
+wh to find 1
+wh to prov 1
+wh to put 1
+wh to return 1
+wh to start 1
+wh tok 1
+wh tok pr 1
+wh tp 1
+wh track 1
+wh transact 2
+wh tw proc 1
+wh tw string 1
+wh tw ver 1
+wh tx 1
+wh typ 2
+wh typeu 1
+wh u0 1
+wh ui 1
+wh unfold 1
+wh upd 1
+wh us 1
+wh us macr 1
+wh user 1
+wh user st 1
+wh uv 1
+wh v con 1
+wh v f1 1
+wh v fa 1
+wh v fv0 1
+wh v fv1 1
+wh v v1 1
+wh valu 2
+wh var 1
+wh var appear 1
+wh vdm 1
+wh vi 2
+wh vw 1
+wh w1 1
+wh we allow 1
+wh we an 1
+wh we assum 3
+wh we constrain 1
+wh we cruc 1
+wh we multip 1
+wh we relac 1
+wh we seek 2
+wh we show 1
+wh we us 3
+wh wf 1
+wh wi 2
+wh without selfobserv 1
+wh wmac 1
+wh wmac maxfwt 1
+wh writeloc 1
+wh wt 1
+wh x refer 1
+wh x y1 1
+wh x0 1
+wh x01 1
+wh x0i 1
+wh x1 1
+wh x2 1
+wh x2 y2 1
+wh xfl 1
+wh xi 3
+wh xinit 1
+wh xt 1
+wh y nod 1
+wh y repr 1
+wh y0 1
+wh yk 1
+wh you know 1
+wh ys 1
+wh81 1
+whatismor 1
+whatismor th rel 1
+whatsoever 1
+wheel 2
+wheel circumfer 1
+wheel diameter 1
+wheel em 1
+wheel pl 1
+wheel rev 1
+wheel rev sec 1
+wheelcirc 1
+wheelcirc integer 1
+wheelcirc integer div 1
+wheeldiam 1
+wheeldiam wheel 1
+wheeldiam wheel circumfer 1
+wheeler4 1
+wheeler4 mklesson5 1
+wheeler4 mklesson5 download 1
+whereb 6
+whereb a rang 1
+whereb id 1
+whereb id ent 1
+whereb individu 1
+whereb th order 1
+whereb th runtim 1
+wherein 4
+wherein ev switch 1
+wherein th queu 1
+wherein th smaller 1
+whererec 1
+wherever 2
+wherever specif 1
+whfg92 1
+whisker 1
+whisker plot 1
+whistl 1
+whistl wa implem 1
+whit 15
+whit 2d 1
+whit and center 1
+whit and h.k.n 1
+whit and v2 1
+whit border 1
+whit border reg 1
+whit box 1
+whit gaus 1
+whit gaus no 1
+whit no 2
+whit no innov 1
+whit no uniform 1
+whit nod 1
+whit nod compl 1
+whit nor indep 1
+whit paper 2
+whit pixel 1
+whit rat 1
+whit spac 5
+whit spac character 1
+whit stream 1
+whit subgrid 1
+whit transit 1
+whiteboard 1
+whiteboard for network 1
+whitehead 2
+whitehead rel 1
+whitespac 2
+whitespac and com 1
+whitespac character 1
+whitespac quietblank 1
+whitespac separ 1
+whith 2
+whith actu 1
+whith actu argum 1
+whith reason 1
+whith reason accur 1
+whitl 2
+whitmor 1
+whittaker 1
+whitwel 1
+whmz93a 1
+whmz93b 1
+whol 1
+whp 1
+why 41
+why a bomber 1
+why a person 1
+why a reasoner 1
+why an act 1
+why an agent 1
+why an unfold 1
+why certain design 1
+why certain primitiv 1
+why do ec 1
+why do user 1
+why eclip 1
+why eclip prov 1
+why enabl 1
+why enabl act 1
+why exper 1
+why exper pl 1
+why fl 1
+why handl 1
+why handl chang 1
+why heur 1
+why heur nt 1
+why hypoth 1
+why is www 1
+why lin 2
+why lin log 1
+why med 1
+why med appl 1
+why merg 1
+why merg sort 1
+why not neg 1
+why peopl 1
+why peopl look 1
+why proc 1
+why reason 1
+why self 1
+why self delim 1
+why th detail 1
+why th dog 1
+why th earl 1
+why th gener 1
+why th interpr 1
+why th kind 1
+why th qu 1
+why th restrict 1
+why th techniqu 1
+why th tim 1
+why th typ 1
+why th work 1
+why we belief 1
+why we ch 1
+wi 19
+wi bal 1
+wi bal denot 1
+wi bridg 1
+wi bridg crx 1
+wi calcl 1
+wi continu 1
+wi continu funct 1
+wi def 1
+wi def g0 1
+wi direct 1
+wi exclus 1
+wi ext 1
+wi fl 1
+wi match 1
+wi optim 1
+wi with incr 1
+wi.leidenuniv.nl 1
+wiberg 1
+wich 1
+wickerhauser 1
+wid 48
+wid abstract 1
+wid abstract level 1
+wid accept 1
+wid algorithm 1
+wid algorithm anim 1
+wid appl 2
+wid appl model 1
+wid apprec 1
+wid ar 5
+wid ar computer 2
+wid ar inform 1
+wid ar network 2
+wid ar st 1
+wid ar telephon 1
+wid avail 1
+wid ba 1
+wid belief 1
+wid caus 1
+wid caus dag 1
+wid caus graph 1
+wid cl 1
+wid coh 1
+wid computer 1
+wid computer network 1
+wid control 1
+wid crossbar 1
+wid differ benchmark 1
+wid differ del 1
+wid differ serv 1
+wid du 1
+wid en 1
+wid inform 1
+wid known 2
+wid lead 1
+wid most stud 1
+wid nod 1
+wid perform 1
+wid perform measur 1
+wid port 1
+wid ram 1
+wid ram instead 1
+wid rang 12
+wid rang reperc 1
+wid rapid 1
+wid sen 1
+wid sen ensur 1
+wid separ 1
+wid separ loc 1
+wid spac 1
+wid spectr 2
+wid spectr langu 1
+wid spread 1
+wid stud 1
+wid support 1
+wid th domain 1
+wid uniqu 1
+wid uniqu valu 1
+wid us cluster 1
+wid us techniqu 1
+wid var 10
+wid web 7
+wid web confer4 1
+wid web est 1
+widear 1
+widear telephon 1
+widear telephon network 1
+widener 1
+wider 11
+wider and faster 1
+wider ch 1
+wider channel 3
+wider channel push 1
+wider channel requir 1
+wider channel width 1
+wider dat 1
+wider dat path 1
+wider learn 1
+wider learn exper 1
+wider mark 1
+wider network 1
+wider network channel 1
+wider path 1
+wider rang 2
+wider se 2
+wider user 1
+wider user group 1
+wider var 1
+widespread 3
+widespread accept 1
+widespread appl 2
+widespread internet 1
+widespread internet protocol 1
+widespread us kb 1
+widespread viewer 1
+widest 3
+widest claus 1
+widest rang 1
+widest scop 1
+widg 2
+widg boast 1
+widmer 1
+width 14
+width allow 2
+width allow larger 2
+width along dim 1
+width and bisect 2
+width and channel 2
+width and height 1
+width as depict 1
+width as disc 1
+width can grow 1
+width commmun 2
+width commmun link 2
+width constraint 3
+width constraint lead 2
+width etc 2
+width for further 1
+width in internet 2
+width in parenth 2
+width insid router 2
+width lim 2
+width model 1
+width need router 1
+width on router 1
+width technolog 3
+width to maintain 1
+width w by 1
+width wi 1
+width with incr 1
+width with larger 1
+width wmac 1
+wiel 1
+wiel b.j 1
+wielemaker 1
+wien 2
+wier 1
+wif 1
+wij 2
+wij in check 1
+wij wil self 1
+wijk 1
+wijngaard 1
+wijngaard grammar 1
+wijshoff 2
+wijxj 1
+wil 27
+wil and son 6
+wil intersc 3
+wil ser 1
+wil son 7
+wil son lim 1
+wil son.1990 1
+wil soon 1
+wil teubner 1
+wil to accept 1
+wil to rec 1
+wil zwaenepoel 1
+wilcoxon 1
+wilcoxon sign 1
+wilcoxon sign rank 1
+wild 3
+wild and huit 1
+wild and ro 1
+wild et al 1
+wildeman 1
+wilf 1
+wilhelm 1
+wilkinson 1
+willamson 1
+willem 2
+willem van 1
+willem van der 1
+william 23
+william and floyd 1
+william and zipser 1
+william b.c 1
+william brag 1
+william clinger 1
+william cook 1
+william equitz 1
+william frak 1
+william gaver 1
+william griswold 1
+william jalb 2
+william jalb examinateur 1
+william kaufman 1
+william occam 1
+william ograd 1
+william pugh 1
+william zipser 1
+williampugh 1
+williamsburg 1
+williamson 1
+williamson typ 1
+williamson typ matr 1
+willoughb 1
+willsk 1
+wilm 1
+wilson 8
+wilson and born 1
+wilson and lam 1
+wilson martinez 1
+wilson model 1
+wilson s algorithm 1
+wilson s rl 1
+wilson ton 1
+win 7
+win aver 1
+win interv 1
+win merit 1
+win over candid 1
+win over mi 1
+wind 3
+wind instruc 1
+wind re 1
+wind re fact 1
+wind re forc 1
+wind veloc 1
+windf 1
+windf windk 1
+windheiser 2
+windk 1
+window 15
+window acr neighbor 1
+window and pack 1
+window and produc 1
+window approach 1
+window aver 1
+window aver oper 1
+window aver rout 1
+window aver thin 1
+window ba 1
+window ba mechan 1
+window center 3
+window com 1
+window consider 1
+window contain 1
+window cr 1
+window dep 1
+window displ 1
+window flow 1
+window flow control 1
+window intern 1
+window intern support 1
+window is defin 1
+window label 1
+window length 1
+window length lim 1
+window lim 1
+window of 2k 1
+window of sign 1
+window of siz 1
+window open 1
+window oper 1
+window oracl 1
+window pan 1
+window prov 1
+window shift 1
+window shift step 1
+window sign 1
+window siz 4
+window siz produc 1
+window start 1
+window step 1
+window system 1
+window system environm 1
+window unrol 1
+window unrol nam 1
+window up flag 1
+window w center 1
+window wh maxim 1
+windowstm 1
+wingerath 1
+winheiser 1
+winkler 2
+winklhofer 1
+winner 1
+winograd 2
+winograd92 1
+winsl 1
+winst 1
+winter 3
+winter siml 2
+winter usen 1
+wir 9
+wir at upper 2
+wir can transfer 2
+wir complec 1
+wir connect 2
+wir constraint 3
+wir cost 1
+wir in internet 2
+wir on vl 2
+wir requir 1
+wir rout 1
+wir run 1
+wir spac 2
+wir that car 2
+wir through cel 1
+wir usu ge 2
+wir wid 1
+wisconsin 3
+wisconsin madison 2
+wisconsinmadison 1
+wisdom 2
+wisdom say 1
+wish 28
+wish adver 1
+wish particl 1
+wish to ap 2
+wish to commun 2
+wish to compar 2
+wish to conclus 1
+wish to der 1
+wish to disc 1
+wish to download 1
+wish to establ 1
+wish to exp 1
+wish to experim 1
+wish to find 1
+wish to hear 1
+wish to identif 1
+wish to incorpor 1
+wish to join 1
+wish to know 1
+wish to learn 1
+wish to mak 2
+wish to model 1
+wish to multip 1
+wish to plac 1
+wish to prov 1
+wish to reach 1
+wish to recover 1
+wish to restrict 1
+wish to support 1
+wish to thank 1
+wish to treat 1
+wish to us 2
+wisk 1
+wiskund 2
+wiskund en 2
+wiskund en inform 2
+wissensrepr 1
+wissensrepr und 1
+wissensrepr und schlussfolgerungsverfahr 1
+wit 4
+wit a signif 1
+wit et.al 1
+wit th fact 1
+wit th over 1
+withdraw 1
+withdrawn 1
+withdrawn dynam 1
+withp1 2
+wivenh 1
+wivenh park 1
+wj 5
+wj ar mut 1
+wj each correspon 1
+wj is multipl 1
+wj vect 1
+wj1 1
+wj2 1
+wjk 2
+wjk e ak 1
+wjk is multipl 1
+wjk real valu 1
+wjkd1 1
+wjkd2 1
+wjkd2 mwjkp 1
+wjkf 1
+wjkp 1
+wjp 1
+wk 2
+wliang 1
+wliang cs.anu.edu.au 1
+wlok 2
+wm 1
+wmac 3
+wmac b bound 1
+wmac bal 1
+wmac can lim 1
+wmac cbaln 1
+wmac maxfwt 1
+wmac w1 1
+wmac w1 w2 1
+wmac wmin 1
+wmaxc 1
+wmaxc baln 1
+wmaxc balr 1
+wmin 2
+wmin minfwt 1
+wn 7
+wn fun 1
+wn q mod 1
+wny 1
+wo 1
+wo inadequ 1
+woborschil 1
+woelk 1
+wolberger 1
+wolf 8
+wolf and mon 1
+wolf dietrich 2
+wolf dietrich weber 2
+wolf et m.s 1
+wolfgang 2
+wolfgang dittrich 1
+wolfgang heinz 1
+wolfram 1
+wolfson 2
+wolfson build 1
+wolfvil 1
+wollongong 1
+wolper 2
+wolson 1
+wolter 1
+woman 1
+wombl 1
+wonder 4
+wonder everd 1
+wonder mach 1
+wonder mach lying 1
+wonder year 1
+wong 5
+wong and r.g 1
+wonham 1
+wonnacot 1
+wood 3
+woodger 1
+woodruff 1
+woolf 1
+wooyoung 1
+wooyoung kim 1
+wor 26
+wor ca 1
+wor ca connect 1
+wor ca occur 1
+wor ca scenar 1
+wor ca us 1
+wor del 1
+wor del behavior 1
+wor in lin 1
+wor in term 1
+wor partit 1
+wor th etf 1
+wor than mlb 1
+wor than sc 1
+wor than softwar 1
+wor92 1
+word 54
+word addr 1
+word appl 1
+word ar adjac 1
+word ar bin 1
+word architectur 1
+word as proxim 1
+word car 1
+word chr 1
+word chr mean 1
+word cowb 1
+word differ 1
+word ff 1
+word ff ind 1
+word for rad 1
+word for tag 1
+word format 1
+word graph 1
+word hel 1
+word help 1
+word in length 1
+word in natur 1
+word indomain 1
+word indomain mean 1
+word is brok 1
+word is restrict 1
+word is simpl 1
+word jwj 1
+word jwj jqj 1
+word length 1
+word mor prob 1
+word of antimatr 1
+word of docum 1
+word of length 1
+word perfect 1
+word perfect corp 1
+word proc 1
+word recognit 1
+word refer 1
+word refer word 1
+word repr 1
+word retrief 1
+word sequ 1
+word sequ har 1
+word simp 1
+word so common 1
+word tag 1
+word th sum 2
+word that appear 1
+word that describ 1
+word that occur 1
+word u xyc1s1 1
+word w a1 1
+word w xyc1t1 1
+word we look 1
+wordnet 1
+wordsworth 1
+work 119
+work a prototyp 1
+work abcl 1
+work abcl r2 1
+work al prov 2
+work alloc 1
+work allow 1
+work an intern 1
+work and appl 1
+work and develop 1
+work and human 1
+work and softwar 1
+work and suggest 1
+work appear 1
+work ar 2
+work ar addr 1
+work ar decl 1
+work ar pr 4
+work ar rel 1
+work ar sum 1
+work as expect 1
+work as follow 5
+work assoc 1
+work attribut 1
+work back 1
+work bal 1
+work brief 1
+work build 1
+work by assoc 1
+work by debart 1
+work by ghandeharizadeh 1
+work by jungclaus 1
+work by olson 1
+work by other 1
+work by plac 1
+work by split 1
+work can incr 1
+work can rev 1
+work car 1
+work cel 1
+work cel fa 1
+work cel indirect 1
+work clear 1
+work clear point 1
+work conserv 1
+work conserv algorithm 1
+work conserv natur 1
+work conserv scheduler 1
+work conserv server 1
+work consider 1
+work correct 3
+work day 1
+work deal 1
+work denot 1
+work dep 1
+work describ 4
+work disc 2
+work disc us 1
+work distribut 1
+work distribut assign 1
+work distribut directiv 1
+work distribut strateg 1
+work distribut templ 1
+work don intern 1
+work du 1
+work dur fact 1
+work effect 1
+work environm 3
+work equ 1
+work estim 1
+work exampl 1
+work exclus 1
+work exper 1
+work ext 1
+work fin 1
+work for arbitr 1
+work for bivalu 1
+work for citicorp 1
+work for direct 1
+work for incorpor 1
+work for interv 1
+work for multimod 1
+work for prolog 1
+work for system 1
+work for triangl 1
+work gener 1
+work gener fal 1
+work group 2
+work ha appl 1
+work ha establ 1
+work ha foc 2
+work ha shown 1
+work hav center 2
+work he ext 1
+work hybrid 1
+work hybrid system 1
+work imb 1
+work imb du 1
+work implem 1
+work in build 1
+work in compr 1
+work in db 1
+work in derefer 1
+work in fact 1
+work in fl 1
+work in gener 1
+work in parallel 1
+work in program 1
+work in project 1
+work in reduc 1
+work inclus 2
+work instead 1
+work int chunk 1
+work interact 1
+work involut 2
+work involut group 1
+work is character 1
+work is compar 1
+work is compl 1
+work is demand 1
+work is difficult 1
+work is distribut 1
+work is divid 1
+work is inspir 1
+work is ong 1
+work is parallel 1
+work is perform 1
+work is pr 1
+work is rel 1
+work is review 1
+work is spon 1
+work is support 5
+work is underw 1
+work knowledg 1
+work load 2
+work ment 1
+work nec 1
+work not 1
+work of abdullah 1
+work of adapt 1
+work of bruynoogh 1
+work of ch 1
+work of har 1
+work of harl 1
+work of iqb 1
+work of mehm 1
+work of merg 1
+work of meyer 1
+work of mult 1
+work of weichang 1
+work of winsl 1
+work on ac 1
+work on bsp 1
+work on concur 1
+work on configur 1
+work on dag 1
+work on deduc 1
+work on dep 1
+work on design 1
+work on develop 1
+work on domain 1
+work on find 1
+work on hal 1
+work on ind 1
+work on integr 1
+work on intersect 1
+work on measur 1
+work on multilevel 1
+work on oper 1
+work on polynom 1
+work on procedur 1
+work on shar 1
+work on specl 1
+work on tool 1
+work on upd 1
+work on var 1
+work onl foc 1
+work ont proc 1
+work paper 3
+work paper ser 1
+work part 1
+work part tim 1
+work perform 1
+work pool 1
+work pr 3
+work proc 1
+work proc rec 1
+work procedur 1
+work program 1
+work proper 3
+work reason 2
+work regard 1
+work rel 1
+work remain 1
+work requir 3
+work result 1
+work schedl 1
+work se 3
+work shar 1
+work should consider 1
+work simil 1
+work spac 1
+work spac interact 1
+work st 1
+work st cl 1
+work start 1
+work styl 1
+work suggest 4
+work suggest guidel 2
+work super 1
+work support 2
+work system 1
+work tap 1
+work than perform 1
+work that consider 1
+work that describ 1
+work therefor 1
+work therefor concentr 1
+work to examin 1
+work to incorpor 1
+work to prev 1
+work together synchron 1
+work transfer 1
+work until nw 1
+work us 1
+work us uid 1
+work using 1
+work using mult 1
+work var 1
+work var attempt 1
+work ver 1
+work wa ext 1
+work wa fund 2
+work wa part 5
+work wa perform 2
+work wa report 1
+work wa spon 1
+work wa support 7
+work we plan 1
+work wel using 1
+work which found 1
+work which stand 1
+work wil begin 1
+work wil inclus 2
+work with aver 1
+work with bl 1
+work with integer 1
+work with joseph 1
+work with no 1
+work with object 1
+work with overwhelm 1
+work with pcct 1
+work with real 1
+work within pur 1
+workaround 1
+workbook 1
+worker 3
+worker alw giv 1
+worker and monit 1
+worker by monit 1
+worker ha learn 1
+worker just separ 1
+worker level 1
+worker monit 1
+worker monit conflict 1
+worker net 1
+worker network 1
+worker network ch 1
+worker nod 1
+worker or monit 1
+worker output 1
+worker that es 1
+worker through gradu 1
+workernet 1
+workernet monitornet 1
+workflow 1
+workflow autom 1
+workflow autom infrastructur 1
+workflow cl 1
+workflow cl def 1
+workflow cl wc1 1
+workflow cl wc2 1
+workflow fi 1
+workflow fl 1
+workflow in distribut 1
+workflow manag 1
+workflow manag coalit 1
+workflowmodel.1 1
+workload 6
+workload alloc 1
+workload and failur 1
+workload and perform 1
+workload and rout 1
+workload character 1
+workload cl 1
+workload compon 1
+workload compon model 1
+workload dep 1
+workload dep measur 1
+workload descript 1
+workload descript tok 1
+workload disc 1
+workload distribut 1
+workload gener 1
+workload incr 1
+workload indep 1
+workload indep measur 1
+workload input 1
+workload input parameter 1
+workload model 1
+workload model wh 1
+workload or topolog 1
+workload pack 1
+workload pack equ 1
+workload pair 1
+workload refer 1
+workload respon 1
+workload respon tim 1
+workload sink 1
+workload sink compon 1
+workload sourc 1
+workload sourc sink 1
+workload specif 1
+workload specif langu 1
+workload tok 1
+workload unit 1
+workload with parameter 1
+workload wrkload 1
+workloadclassdefinit 1
+workloadclassdefinit workloadclassl 1
+workloadclassdefinit workloadclassl workloadclassdefinit 1
+workloadclassl 1
+workloadclassl clientclassl 1
+workloadclassl clientclassl workloadloc 1
+workloadclassl workloadclassdefinit 1
+workloaddescript 1
+workloaddescript performancegoalspecificationl 1
+workloaddescriptionparameter 1
+workloaddescriptionparameter cost 1
+workloadgeneratorrout 1
+workloadloc 1
+workplac 1
+workshop 58
+workshop autom 1
+workshop autom reason 1
+workshop h ulrik.html 1
+workshop h.html 1
+workshop in comput 3
+workshop jan 1
+workshop on adapt 1
+workshop on algorithm 2
+workshop on appl 1
+workshop on ca 2
+workshop on challeng 1
+workshop on cod 1
+workshop on compiler 1
+workshop on comput 1
+workshop on computer 1
+workshop on constraint 1
+workshop on dat 1
+workshop on datab 1
+workshop on distribut 3
+workshop on domain 1
+workshop on ext 2
+workshop on field 1
+workshop on found 1
+workshop on fram 1
+workshop on front 1
+workshop on graph 2
+workshop on implem 1
+workshop on intellig 1
+workshop on langu 3
+workshop on log 1
+workshop on mach 2
+workshop on me 1
+workshop on memor 1
+workshop on methodolog 1
+workshop on ml 1
+workshop on mobil 1
+workshop on model 1
+workshop on multistrateg 1
+workshop on object 1
+workshop on oolp 1
+workshop on oz 1
+workshop on parallel 3
+workshop on per 1
+workshop on principl 2
+workshop on program 3
+workshop on scal 3
+workshop on sem 1
+workshop on shap 1
+workshop on softwar 3
+workshop on spat 1
+workshop on stat 1
+workshop on string 1
+workshop on visu 2
+workshop pdk91 1
+workshop vol 1
+workshop3 1
+workspac 4
+workspac facil 1
+workspac interact 1
+workspac is suff 1
+workspac problem 1
+workspac problem solut 1
+workspac system 1
+workst 23
+workst ar typ 1
+workst aud 1
+workst aud hardwar 1
+workst ba 1
+workst ba network 1
+workst can transform 1
+workst cl 1
+workst cl computer 1
+workst connect 3
+workst consol 1
+workst environm 2
+workst interconnect 1
+workst may correspon 1
+workst monit 1
+workst network 1
+workst network environm 1
+workst network using 1
+workst network wh 1
+workst oper 1
+workst softwar 1
+workst to estim 1
+workst to parallel 1
+workst to run 1
+workst to supercomputer 1
+world 38
+world and event 1
+world and world 1
+world appl 3
+world approach 1
+world behaviour 1
+world by control 1
+world comput 1
+world comput partnership 1
+world computer 4
+world computer congr 4
+world conclus 1
+world congr 2
+world context 1
+world dat 1
+world describ 1
+world determin 1
+world differ 1
+world discr 1
+world discr problem 1
+world ent 1
+world environm 2
+world exper 1
+world hel 1
+world imag 1
+world is es 1
+world is run 1
+world knowledg 1
+world l quick 1
+world laser 1
+world laser strip 1
+world model 1
+world model direct 1
+world object 2
+world of inform 1
+world of possibil 1
+world phenom 2
+world prev 1
+world prev learn 1
+world problem 3
+world render 1
+world scientif 3
+world scientif publ 1
+world sem 1
+world system 2
+world system dep 1
+world task 1
+world we consider 1
+world wid 7
+world wid algorithm 1
+world wid web 7
+worldw 2
+worldw us 1
+worm 1
+worm adapt 1
+worm adapt travel 1
+worm ar assembl 1
+worm ar pr 1
+worm ar requir 1
+worm arriv 1
+worm ba 1
+worm begin 1
+worm can eventu 1
+worm can thus 1
+worm car 1
+worm enqueu 1
+worm for 1
+worm for fast 1
+worm for multicast 1
+worm for path 1
+worm ge 1
+worm ge rout 1
+worm header 1
+worm header encod 1
+worm in switch 1
+worm is block 1
+worm is indep 1
+worm mak 1
+worm mak progr 1
+worm may car 1
+worm on centr 1
+worm on switch 1
+worm proceed 1
+worm prov 1
+worm prov flec 1
+worm repl 1
+worm reserv 1
+worm succ 1
+worm succ reserv 1
+worm that us 1
+worm to ge 1
+worm travel 1
+worm travel adapt 1
+worm using 1
+worm using multiport 1
+worm with asynchron 1
+worm1 1
+worm1 mdest 1
+worm1 mdest worm2 1
+worm2 1
+worm2 reservedoutputportsrequestedoutputport 1
+wormhol 4
+wormhol cut 1
+wormhol dsm 1
+wormhol dsm using 1
+wormhol flow 1
+wormhol flow control 1
+wormhol implem 1
+wormhol k ary 1
+wormhol me 1
+wormhol me pa 1
+wormhol mult 1
+wormhol mult network 1
+wormhol rout 4
+wormhol rout deadlock 1
+wormhol rout ma 1
+wormhol rout mult 1
+wormhol rout network 3
+wormhol rout schem 1
+wormhol rout switch 1
+wormhol rout system 1
+wormhol rout techniqu 1
+wormhol rout unidirect 1
+wormhol rout wherein 1
+wormhol strateg 1
+wormhol switch 1
+worsch 1
+worser 1
+worshop 1
+worshop on parallel 1
+worst 35
+worst ca 22
+worst ca an 2
+worst ca approxim 1
+worst ca assum 1
+worst ca behavior 1
+worst ca block 1
+worst ca bound 1
+worst ca cost 1
+worst ca del 1
+worst ca execut 1
+worst ca expon 1
+worst ca involut 1
+worst ca lower 1
+worst ca number 2
+worst ca perform 3
+worst ca respon 1
+worst ca run 1
+worst ca scenar 2
+worst ca situ 1
+worst ca solut 1
+worst ca tim 2
+worst event 1
+worst event driv 1
+worst exampl 1
+worst load 1
+worst load regl 1
+worst perform 2
+worst perform compar 1
+worst perform rat 1
+worst po load 1
+worst po perform 1
+worst po situ 1
+worst result 1
+worst schedl 1
+worst shift 1
+worst st 1
+worst uniform 1
+worst uniform distribut 1
+worth 14
+worth consult 1
+worth emph 1
+worth integr 1
+worth introduc 1
+worth learn 1
+worth not 1
+worth of further 1
+worth of pursu 1
+worth point 2
+worth th extr 1
+worthwhil 3
+worthwhil thing 1
+worthwhil to put 1
+woud 1
+woz95 1
+wp 3
+wp fl 1
+wp wt 1
+wp wt wc1 1
+wp.html 1
+wp1 1
+wp1 t.1.1 1
+wp1 t.1.1 t.1.2 1
+wph 1
+wph pfn 1
+wph pfn phy 1
+wpiwt 1
+wr 2
+wr ca 1
+wr ca ww 1
+wr commun 1
+wr commun typ 1
+wr or rw 1
+wr wr 1
+wrap 6
+wrap th edg 1
+wrap th method 1
+wrapper 1
+wrapper that kil 1
+wright 4
+wright atl 1
+wright atl chip 1
+writ 81
+writ 8c 1
+writ a chunk 1
+writ a comp 1
+writ a del 1
+writ a disk 1
+writ a french 1
+writ a log 1
+writ a multidest 1
+writ a not 1
+writ a np 1
+writ a pair 1
+writ a part 1
+writ a program 1
+writ a record 1
+writ a s1 1
+writ a simpl 1
+writ a sort 1
+writ a st 2
+writ a start 1
+writ a transform 1
+writ a var 1
+writ about item 1
+writ acc 6
+writ acc ap 1
+writ acc dep 1
+writ ahead 2
+writ ahead log 2
+writ ajt 1
+writ ajt fa 1
+writ alloc 1
+writ analog 1
+writ and combin 1
+writ and debug 1
+writ and design 1
+writ and difficult 1
+writ and execut 1
+writ and i0 1
+writ and prototyp 1
+writ and read 5
+writ and restart 1
+writ and st 1
+writ and understand 1
+writ another agent 1
+writ any comput 1
+writ ar buffer 1
+writ ar execut 1
+writ ar inclus 1
+writ ar replac 1
+writ as ct 1
+writ as follow 2
+writ as method 1
+writ as singl 1
+writ b x2b2 1
+writ back cach 1
+writ bad 1
+writ bad object 1
+writ buffer 3
+writ buffer drain 1
+writ buffer request 1
+writ by don 1
+writ by hand 1
+writ by input 1
+writ by member 1
+writ by oper 1
+writ by tim 1
+writ c cod 1
+writ c instead 1
+writ c program 1
+writ ca 1
+writ cd 1
+writ cd cd 1
+writ cel 1
+writ cel cont 1
+writ chang 1
+writ chang specif 1
+writ chunk 1
+writ cod 1
+writ col 1
+writ comp 1
+writ comp log 1
+writ compact 1
+writ compact record 1
+writ compon 1
+writ constraint 1
+writ constraint involut 1
+writ cur 1
+writ cur nod 1
+writ cycl 1
+writ cycl wt 1
+writ d inherit 1
+writ dom 1
+writ each chunk 1
+writ each var 1
+writ eff 1
+writ entir 1
+writ entir hist 1
+writ entr 1
+writ error 1
+writ error correct 1
+writ event 2
+writ explicit 1
+writ explicit cod 1
+writ expr 1
+writ f0 1
+writ fault 1
+writ flit 1
+writ for snoop 1
+writ from intern 1
+writ gener 2
+writ gener purp 1
+writ ha com 1
+writ head 1
+writ in an 1
+writ in assembler 1
+writ in behavior 1
+writ in c.12 1
+writ in charm 1
+writ in chr 1
+writ in cobol 1
+writ in eulisp 1
+writ in fortran 1
+writ in hal 1
+writ in inf 1
+writ in interpr 1
+writ in ital 2
+writ in jav 1
+writ in matr 1
+writ in modl2 1
+writ in pa 1
+writ in pattern 1
+writ in prolog 1
+writ in rad 1
+writ in register 1
+writ in self 1
+writ in svm 1
+writ in term 2
+writ in tradit 1
+writ in visu 1
+writ in wt 1
+writ input 1
+writ int 1
+writ int pag 1
+writ int rel 1
+writ intern 2
+writ intern nod 1
+writ intern program 1
+writ is allow 1
+writ is destruc 1
+writ is perform 1
+writ kind 1
+writ ks 1
+writ ks cop 1
+writ lj 1
+writ loc 1
+writ m0i 1
+writ m0i en 1
+writ me 1
+writ me pa 1
+writ method 1
+writ mi 2
+writ mj 1
+writ ml 1
+writ mor compact 1
+writ mor simp 1
+writ much larger 1
+writ natur 1
+writ natur langu 1
+writ new nod 1
+writ new record 1
+writ object 2
+writ object graph 1
+writ object orient 1
+writ occur 1
+writ of by 1
+writ of dat 1
+writ old 1
+writ old root 1
+writ on block 1
+writ on shunt 1
+writ on st 1
+writ on symbol 1
+writ on top 1
+writ onc ne 1
+writ onc st 1
+writ onl 1
+writ onl docum 1
+writ onl output 1
+writ oper 8
+writ oper inser 1
+writ or read 1
+writ or writ 1
+writ our compl 1
+writ pag 1
+writ pointer 1
+writ pol 1
+writ port 1
+writ port requir 1
+writ prev 1
+writ prfx 1
+writ primitiv 1
+writ priork 1
+writ prob 1
+writ program 4
+writ program using 1
+writ protect 1
+writ r1 1
+writ rat 1
+writ re 1
+writ read 1
+writ record 1
+writ request 1
+writ scal 1
+writ scal ver 1
+writ sent 1
+writ sequ 1
+writ shunt 1
+writ simp 1
+writ simpl 1
+writ solver 1
+writ specif 1
+writ ss 1
+writ st 1
+writ stat 2
+writ stat fprintf 1
+writ styl 1
+writ suff 1
+writ surfac 1
+writ synchron 1
+writ t0 1
+writ t00 1
+writ t00 pr 1
+writ th block 1
+writ th boolean 1
+writ th buffer 1
+writ th ch 2
+writ th cl 1
+writ th cod 1
+writ th concr 1
+writ th constraint 1
+writ th construc 1
+writ th cont 1
+writ th correspon 1
+writ th cur 1
+writ th dat 1
+writ th equ 2
+writ th eulisp 1
+writ th fil 1
+writ th fl 1
+writ th forml 1
+writ th group 1
+writ th header 1
+writ th invar 1
+writ th log 1
+writ th memoryload 1
+writ th nearestneighbour 1
+writ th paper 1
+writ th record 1
+writ th st 1
+writ th triv 1
+writ th valu 2
+writ that sk 1
+writ then libr 1
+writ then ok 1
+writ through 1
+writ through cach 1
+writ tim 1
+writ tim specif 1
+writ to bridg 1
+writ to cluster 1
+writ to disk 2
+writ to impl 2
+writ to memor 1
+writ to nil 1
+writ to shunt 1
+writ to sometim 1
+writ to st 1
+writ to tempor 1
+writ took 1
+writ took plac 1
+writ transl 1
+writ transl rl 1
+writ triv 1
+writ triv me 1
+writ tw 1
+writ tw tr 1
+writ typ 1
+writ using 3
+writ using me 1
+writ using tel 1
+writ var 1
+writ var sequ 1
+writ visu 1
+writ visu ba 1
+writ w w0v1v2 1
+writ wa mad 1
+writ wt 1
+writ x hx0 1
+writ x k12 1
+writ zer 1
+writ. 1
+writ2 1
+writedesign 1
+writedesign work 1
+writedesign.hqx 1
+writeloc 1
+writeonc 1
+writeonc st 1
+writeonc st med 1
+writeprob 1
+writeprob of inst 1
+writer 9
+writer ar acc 1
+writer cap 1
+writer cl 1
+writer cl sd 1
+writer comput 1
+writer correspon 1
+writer dep 1
+writer fal 1
+writer fal shar 1
+writer funct 1
+writer identif 1
+writer initarg 1
+writer is analog 1
+writer method 1
+writer method cel 1
+writer method execut 1
+writer multipl 1
+writer multipl reader 1
+writer of text 1
+writer per dat 1
+writer register 1
+writer restrict 1
+writer slot 1
+writer slot descript 1
+writer using 1
+writer using cl 1
+writer using slot 1
+writersbecomerichard 1
+writter 1
+wrkload 1
+wrl 1
+wrl research 1
+wrl research report 1
+wrong 13
+wrong addr 1
+wrong answer 1
+wrong assum 1
+wrong ch 1
+wrong condit 1
+wrong condit cl 1
+wrong knowledg 1
+wrong plac 2
+wrong siz 1
+wrong thread 1
+wrong thread continu 1
+wrong underestim 1
+wrot 2
+wrot a grammar 1
+wrot an interpreter 1
+wrot interfac 1
+wrot interfac chang 1
+wrt 2
+wrt quintus 1
+wrt quintus prolog 1
+wrt tim 1
+wrt weight 1
+wrt weigth 1
+ws 1
+wsb 1
+wsb wsb 1
+wt 5
+wt do begin 1
+wt fl 1
+wt hiw 1
+wt hiw rt 1
+wt wc1 1
+wt wc1 wc2 1
+wt2 1
+wu 6
+wu and d.d 1
+wuccrc.wustl.edu 1
+wuccrc.wustl.edu jbf 1
+wuccrc.wustl.edu jbf random.wustl.edu 1
+wuf 1
+wulff 1
+wuu 1
+wv 2
+wvol 1
+wvol vol 1
+wvr 1
+ww 2
+ww commun 1
+ww commun typ 1
+wwt 1
+wwt kin 1
+www 10
+www acc 1
+www acc fil5 1
+www at url 2
+www ba 1
+www ba mater 1
+www bertrand.html 2
+www browser 1
+www cbl.paper 1
+www cbl.paper cbl.group.intr.e.html 1
+www client 2
+www client viewer 1
+www docum 1
+www europ.sg.com 1
+www europ.sg.com technolog 1
+www freetext 1
+www freetext answer.html 1
+www freetext developerform.html 1
+www freetext developerform2.html 1
+www freetext inf.html 1
+www freetext inf2.html 1
+www freetext tempcrit.txt 1
+www giv 1
+www ha incr 1
+www hav most 1
+www is grow 1
+www mak 1
+www markup 1
+www markup html 1
+www protocol 1
+www protocol http 1
+www server 2
+www server softwar 1
+www so succ 1
+www url 1
+www viewer 1
+www www94 1
+www www94 paper.html 1
+www.ci.oh 2
+www.ci.oh st.edu 2
+www.ci.oh st.edu pan 1
+www.ci.ohiost.edu 1
+www.ci.ohiost.edu pan 1
+www.ci.ohiost.edu pan paper.html 1
+www.civeng.carl.ca 1
+www.civeng.carl.ca nholtz 1
+www.civeng.carl.ca nholtz tut 1
+www.civeng.carl.ca peopl 1
+www.civeng.carl.ca peopl facult 1
+www.cs.umn.edu 2
+www.cs.umn.edu karyp 1
+www.cs.umn.edu karyp me 1
+www.cs.umn.edu karyp paper 1
+www.cs.umn.edu research 1
+www.cs.umn.edu research shash 1
+www.cs.umn.edu research shashigroup 1
+www.dfk.un 1
+www.dfk.un sb.de 1
+www.dfk.un sb.de henz 1
+www.diku.dk 1
+www.diku.dk research 1
+www.diku.dk research group 1
+www.ic.uc.edu 1
+www.ic.uc.edu mlearn 1
+www.ic.uc.edu mlearn mlreposit.html 1
+www.igd.fhg.de 1
+www.igd.fhg.de www95.html 1
+www.inf.ethz.ch 1
+www.inm.com 1
+www.inm.com jav.html 1
+www.is.informatik.th 1
+www.is.informatik.th darmstadt.de 1
+www.is.informatik.th darmstadt.de l 1
+www.mp 1
+www.mp sb.mpg.de 1
+www.mp sb.mpg.de sander 1
+www.netlib.org 1
+www.netlib.org utk 1
+www.netlib.org utk paper 1
+www.oac.uc.edu 1
+www.oac.uc.edu indiv 1
+www.oac.uc.edu indiv franklin 1
+www.openvm.digit.com 1
+www.openvm.digit.com openvm 1
+www.openvm.digit.com openvm period 1
+www.research.ibm.com 1
+www.sequ.com 1
+www.sequ.com publ solut 1
+www.star.com 1
+www.star.com vlib 1
+www.star.com vlib provider 1
+www.sun.com 1
+www.tw.tudelft.nl 1
+www.tw.tudelft.nl tw 1
+www.tw.tudelft.nl tw publ 1
+www.uc.edu 1
+www.unig.ch 2
+www.unig.ch ea 1
+www.unig.ch ea www 1
+www.verit.com 1
+www.verit.com ha 1
+www.verit.com ha fw22 1
+www.w3.org 1
+www.w3.org hypertext 1
+www.w3.org hypertext www 1
+www.yah.com 1
+www.yah.com soc 1
+www1.cern.ch 1
+www1.cern.ch paperswww94 1
+www1.cern.ch paperswww94 ddimitr.ps 1
+www1.cern.ch paperswww94 speh.ps 1
+www94 1
+www94 paper.html 1
+www95.html 1
+wx 2
+wx y wh 1
+wy88 1
+wyd87 1
+wysiwyg 1
+wysiwyg transl 1
+wz91 1
+x.9 1
+x.9 detail 1
+x.9 detail solut 1
+x0 16
+x0 and xabcd 1
+x0 bi 1
+x0 bi bj 1
+x0 c c0 1
+x0 dx 1
+x0 ei 1
+x0 et xr 1
+x0 for algorithm 1
+x0 form 1
+x0 is mark 1
+x0 is x00 1
+x0 x1 1
+x0 x1x2 1
+x0 xip 1
+x00 5
+x00 x0 1
+x000 1
+x000g 1
+x00g 1
+x00j 1
+x00j de 1
+x01 2
+x01 and y01 1
+x01 tir 1
+x01 u 1y 1
+x02 1
+x02 as prev 1
+x04 1
+x04 ar user 1
+x0g 1
+x0i 1
+x0iy0i 1
+x0y0 1
+x0y0 c0 1
+x1 29
+x1 a1q1b1 1
+x1 and x2 1
+x1 de 1
+x1 de la 1
+x1 et x2 1
+x1 is mark 1
+x1 oe 1
+x1 oe x2 1
+x1 on x2 1
+x1 provoqu 1
+x1 provoqu de 1
+x1 sinon 1
+x1 t1 1
+x1 x x0 1
+x1 x0 1
+x1 x1 1
+x1 x1 x1 1
+x1 x2 3
+x1 x21 1
+x1 xn 1
+x1 y1 1
+x1 y1 z1 1
+x1000 1
+x11 1
+x11 x1k 1
+x12 1
+x1i 1
+x1i par 1
+x1i par exempl 1
+x1i x2i 1
+x1ix1 1
+x1k 1
+x1ng 1
+x1nk 1
+x1x2 4
+x1x2 x2x3 1
+x1x2 x2x3 x3x1 1
+x1x2x3x4x5o1o2o3o4o5cspgcspnon 1
+x1x2x3x4x5o1o2o3o4o5cspgcspnon overlap 1
+x1x2x3x4x5o1o2o3o4o5cspgcspnon overlap constraint 1
+x1x3 1
+x2 22
+x2 and y2 1
+x2 ar examin 1
+x2 ar retrief 1
+x2 dx 1
+x2 f hg 1
+x2 le 1
+x2 le cr 1
+x2 oe 1
+x2 x1 1
+x2 x2 2
+x2 x3 2
+x2 x3 x1 1
+x2 y2 3
+x2 y2 fyg 1
+x2 y2 z2 1
+x2.4 1
+x21 2
+x22 2
+x2b2 1
+x2dx 1
+x2dxg 1
+x2f0 1
+x2g 2
+x2i 1
+x2i est 1
+x2i est substitu 1
+x2ix2 1
+x2n 2
+x2n ar zer 1
+x2n we conclus 1
+x2ng 1
+x2nk 1
+x2s 1
+x2s x3 1
+x2w 1
+x2x3 1
+x2x3 x3x1 1
+x2y 1
+x3 11
+x3 and x4 1
+x3 x1 1
+x3 x2 1
+x3 x2 x3 1
+x3 x4 2
+x3 x4 x6 1
+x3 y3 1
+x3 y3 z3 1
+x3.159 1
+x3.6 1
+x3.7 1
+x31 1
+x32 1
+x3ad 1
+x3h5 1
+x3h5 techn 1
+x3h5 techn com 1
+x3x1 1
+x3x1 is repr 1
+x4 8
+x4 and x5 1
+x4 est 1
+x4 est la 1
+x4 x unif 1
+x4 x6 1
+x41 1
+x42 1
+x5 8
+x5 et cop 1
+x5 is correct 1
+x5 l1 1
+x51 1
+x52 2
+x6 4
+x61 1
+x62 1
+x62l 1
+x6g 1
+x7 3
+x71 1
+x78 1
+x7g 1
+x7s 1
+x7s x8 1
+x8 2
+x8g 1
+xa 3
+xa v2axv 1
+xa1 1
+xa2 1
+xabcd 1
+xav 1
+xav pennec 1
+xav pennec inr 1
+xb 3
+xb x x1 1
+xb x xe 1
+xb1 1
+xb2 1
+xbrown 1
+xc 3
+xc dx 1
+xc r ep 1
+xc si 1
+xc solut 1
+xc solut init 1
+xc xh 1
+xc xn 1
+xc xn fsinon 1
+xc xn sinon 1
+xc1 1
+xc2 1
+xcal 1
+xd 2
+xd1 1
+xd2 1
+xdu1 1
+xdu1 ffu1 1
+xdx 1
+xdx mf 1
+xdxg 1
+xe 4
+xe bxc 1
+xe xr 1
+xe1 2
+xe2 2
+xenolog 1
+xerox 5
+xerox corpor 1
+xerox franc 1
+xerox pal 1
+xerox pal alt 1
+xerox parc 1
+xerox parc con 1
+xerox rav 1
+xerox tr 1
+xf 2
+xf xs 1
+xf1 1
+xf2 1
+xfl 1
+xg 9
+xg dx 1
+xg1 1
+xg8 1
+xh 2
+xh par 1
+xh par xz 1
+xh tq 1
+xht 1
+xi 40
+xi 1gg 1
+xi and fi 1
+xi and xi 1
+xi and xj 1
+xi and yi 2
+xi approxim 1
+xi bi 1
+xi c0 1
+xi calculer 1
+xi can pot 1
+xi clogn 1
+xi de 1
+xi de contraint 1
+xi denot 1
+xi do direct 1
+xi du 1
+xi du point 1
+xi ei 1
+xi ei son 1
+xi en 1
+xi en div 1
+xi fcig 1
+xi fpour 1
+xi fpour pour 1
+xi id 1
+xi is defin 1
+xi is equ 1
+xi is treat 1
+xi ith 1
+xi li 1
+xi m jfj 1
+xi m jg 1
+xi mi 1
+xi mk2 1
+xi mk2 kfj 1
+xi oe 1
+xi or yi 1
+xi ou 1
+xi ou xi 1
+xi par 2
+xi par si 1
+xi refer 1
+xi si 1
+xi suiv 1
+xi suiv le 1
+xi sur 1
+xi sur linterv 1
+xi th bar. 1
+xi ti 1
+xi ui 1
+xi un 1
+xi un etud 1
+xi under grant 1
+xi v1i 1
+xi v2i 1
+xi vi 1
+xi we cr 1
+xi wj 1
+xi x xi 1
+xi xj 2
+xi xj iff 1
+xi xl 1
+xi yi 2
+xi.2 2
+xi.4 1
+xi11 1
+xi1k 1
+xi1xi2 1
+xi21 1
+xi2k 1
+xiac 1
+xiaop 1
+xiaop and sergej 1
+xic 1
+xiff 1
+xiff yiffl 1
+xig 2
+xign 1
+xij 1
+xij1 1
+xijk 1
+xijk correspon 1
+xijk correspon aux 1
+xik 1
+xik if vij 1
+xilinx 1
+xilinx field 1
+xilinx field program 1
+xilj 1
+xilj sont 1
+xilj sont de 1
+xin1 1
+xinit 1
+xink 1
+xioez 1
+xip 1
+xiu 1
+xiu is giv 1
+xiy 1
+xj 16
+xj and xi 1
+xj ar disjoint 1
+xj ar inclus 1
+xj connect 1
+xj en 1
+xj en en 1
+xj iff 1
+xj iff fi 1
+xj kp2 1
+xj mk2 1
+xj refer 1
+xj repr 1
+xj se 1
+xj th valu 1
+xj using 1
+xj using equ 1
+xj xi 1
+xj xi wj 1
+xj xk 1
+xj yj 1
+xj0 2
+xj0 bj 1
+xj0 bj ajj 1
+xj1xj2 1
+xjap 1
+xjaxj 1
+xjfj 1
+xjk 1
+xjk2 1
+xjodr 1
+xjr 1
+xjx 2
+xjxj 1
+xjy 1
+xjy xt 1
+xk 11
+xk est 1
+xk est elimin 1
+xk etxk 1
+xk generaliz 1
+xk num 1
+xk num recvd 1
+xk produit 1
+xk produit le 1
+xk0 1
+xl 4
+xl tl 1
+xl tq 1
+xlf 1
+xm 4
+xm using 1
+xmg 1
+xmixm 1
+xmng 1
+xn 21
+xn 1i 1
+xn and y1 1
+xn ar term 1
+xn ar variabl 1
+xn bp 1
+xn dan 1
+xn dan le 1
+xn en 2
+xn en mod 1
+xn exampl 1
+xn fsinon 1
+xn fsinon fs 1
+xn funct 1
+xn pour 2
+xn pour activer 1
+xn sinon 1
+xn that mak 1
+xn un 1
+xn wjp 1
+xn x2n 1
+xn xn 1
+xn xn en 1
+xn1 1
+xn1 xnk 1
+xnet 1
+xnet configur 1
+xnew 1
+xnew xy 1
+xnew xy pa 1
+xnew2 1
+xng 5
+xng do assign 1
+xng do begin 1
+xng th se 1
+xng that correspon 1
+xng wh 1
+xnk 1
+xnorm 1
+xnug 1
+xny1y2 1
+xo 2
+xor 3
+xor bit 1
+xor bitmap 1
+xor ed 1
+xor gat 1
+xor gat 2ns 1
+xor mask 1
+xor sign 1
+xor sign read1 1
+xor tabl 1
+xor th input 1
+xoutput 1
+xoutput port 1
+xp 11
+xp allow 1
+xp and assign 1
+xp appl 1
+xp appl algorithm 1
+xp ar ba 1
+xp asser 1
+xp asser nod 1
+xp ba 1
+xp ba approach 1
+xp comb 1
+xp con 2
+xp d efin 1
+xp de 1
+xp de point 1
+xp direct 1
+xp ec 1
+xp et le 1
+xp explain 1
+xp fg 1
+xp for novel 1
+xp forever 1
+xp in reason 1
+xp incorrect 1
+xp incorrect world 1
+xp incorrectworld 1
+xp incorrectworld model 1
+xp is es 1
+xp is execut 1
+xp is retrief 1
+xp is simil 1
+xp is spec 1
+xp mak 1
+xp mi 1
+xp mi indexedstructur 1
+xp misind 1
+xp misind structur 1
+xp nod 1
+xp novel 1
+xp novel situ 1
+xp novelsitu 1
+xp novelsitu direct 1
+xp perform 1
+xp record 1
+xp s i860 1
+xp s ipsc 1
+xp s produc 3
+xp s support 1
+xp structur 1
+xp structur aid 1
+xp structur allow 1
+xp to ap 1
+xp to decl 1
+xp to examin 1
+xp trac 1
+xp wil direct 1
+xp x0 1
+xp xp 1
+xp xp novel 1
+xp yp 1
+xp yp xq 1
+xp1 1
+xp2n 1
+xpag 1
+xpag x 1pag 1
+xpasser 1
+xpasser nod 1
+xpasser nod remain 1
+xq 2
+xq fg 1
+xq od 1
+xq od od 1
+xq yq 1
+xq yq tsp 1
+xqg 1
+xr 5
+xr contain 1
+xr is init 1
+xr m m0 1
+xr or i860 1
+xr that st 1
+xr xf 1
+xr xf xs 1
+xr yr 2
+xr yr fg 1
+xr1 1
+xr2 1
+xrf 1
+xs 10
+xs and pa 1
+xs2 1
+xsb 2
+xsb deduc 1
+xsb deduc datab 1
+xsb programmer 1
+xsb programmer manu 1
+xt 6
+xt and xp 1
+xt maxff 1
+xt xp 1
+xtk 1
+xtl 1
+xtl ee 1
+xtl ee bed 1
+xtx 1
+xu 6
+xu and d.s 1
+xu et al 1
+xu v2uxv 1
+xun 1
+xun qu 1
+xunrang 1
+xunrang and yuzhang 1
+xuong 1
+xv.2 1
+xv.3 1
+xv.4 1
+xv.5 1
+xw 1
+xw and xr 1
+xw h8m0 1
+xw is init 1
+xw is liv 1
+xw yw 1
+xx 4
+xx matr 1
+xx matr de 1
+xx pa 1
+xx pa fs 1
+xx t assoc 1
+xxqqqqqqqqqqq 1
+xxv 3
+xxv em 1
+xxv em journ 1
+xxx 1
+xxxx 1
+xxxxxxxx 1
+xxxxxxxx xxxx 1
+xxxxxxxxxx 1
+xy 5
+xy 1z1 1
+xy c describ 1
+xy denot 1
+xy is equiv 1
+xy on fa 1
+xy pa 1
+xy yx 1
+xy z wh 1
+xy1 1
+xyc1s1 1
+xyc1t1 1
+xyd11 1
+xyd11 z1 1
+xyn1 1
+xz 2
+xz xc 1
+xz xe 1
+xz xr 1
+y.c 1
+y.d 1
+y.f 1
+y.k 1
+y.n 2
+y.p 2
+y.y 1
+y0 9
+y0 dy 1
+y0 u 1y 1
+y0 y01 1
+y0 y01 y02 1
+y01 1
+y01 ar vect 1
+y01 u 1y 1
+y01 x01 1
+y01 y02 1
+y02 1
+y0i 2
+y0s 1
+y0s fragm 1
+y0ti 1
+y1 19
+y1 a1p1b1 1
+y1 cp 1
+y1 depict 1
+y1 is 1
+y1 is ad 1
+y1 is proc 1
+y1 oe 1
+y1 oe y2 1
+y1 vx1 1
+y1 x1 1
+y1 y2 1
+y1 y2 y3 1
+y1 yx 1
+y1 z1 1
+y1 z1 x2 1
+y1i 1
+y1i and hx2 1
+y1i to hx2 1
+y2 13
+y2 cut 1
+y2 fyg 1
+y2 hav zer 1
+y2 l3 1
+y2 med 1
+y2 oe 1
+y2 sav cut 1
+y2 x3 1
+y2 y1 1
+y2 y1 cp 1
+y2 y3 2
+y2 y3 y1 1
+y2 y3 y4 1
+y2 z2 1
+y2 z2 x3 1
+y2f0 1
+y2g 1
+y2i 1
+y3 7
+y3 and y4 1
+y3 opt 1
+y3 to y4 1
+y3 x1 1
+y3 y1 1
+y3 y1 is 1
+y3 y4 1
+y3 z3 1
+y4 4
+y4 med 1
+y4 using 1
+y4 using larger 1
+y4 y2 1
+y4 y2 y3 1
+y62l 1
+y62l sinc x62l 1
+ya 2
+ya and yp 1
+ya ar transport 1
+ya s.b 1
+yacc 3
+yacc and lec 1
+yacc ar wor 1
+yacc attach 1
+yacc attach act 1
+yacc compat 1
+yacc compat lexer 1
+yacc could handl 1
+yacc do prov 1
+yacc error 1
+yacc error report 1
+yacc gener 1
+yacc mak 1
+yacc on tok 1
+yacc script 1
+yacc sem 1
+yacc specif 1
+yacc technolog 1
+yacc tool 1
+yacc tool becam 1
+yacc typ 1
+yacc typ technolog 1
+yacc us 1
+yacc us lalr 1
+yaddr 2
+yadolah 1
+yadolah dodg 1
+yagit 1
+yagit lakshman 1
+yah 1
+yah direct 1
+yah organ 1
+yal 7
+yal with institut 1
+yal workshop 1
+yaleu 1
+yaleu dc 1
+yaleu dc rr 1
+yamad 1
+yamaguch 1
+yamaguch and tok 1
+yan 2
+yang 5
+yang and gerasoul 1
+yang for creat 1
+yanker 1
+yannakak 3
+yannakak and c.h 1
+yap 2
+yap87 1
+yard 1
+yard et al 1
+yaron 1
+yasukaw 1
+yasunobu 1
+yat 2
+yau 2
+yavatkar 1
+yb 1
+ybl88 1
+ybrown 1
+ybx 1
+ybx yc 1
+yc 3
+ycd86 1
+ycksk 1
+ycksk k zk 1
+ycktk 1
+ycktk k zk 1
+yd 1
+yd91a 1
+yd91b 1
+ydepartm 2
+ydepartm of computer 1
+ydepartm of inform 1
+ydkk 1
+ydkk zk 1
+ydr 1
+ye 18
+ye a nec 1
+ye absolut 1
+ye aim 1
+ye al perfect 1
+ye al tabl 1
+ye answer 1
+ye answer ou 1
+ye answer ye 1
+ye bf0432 1
+ye but dep 1
+ye but proc 1
+ye but rel 1
+ye disambig 1
+ye f800 1
+ye f800 dnr 1
+ye heap 1
+ye heap perfect 1
+ye i think 1
+ye if output 1
+ye iff 1
+ye ii32c3 1
+ye ii32d3 1
+ye is p2 1
+ye multithread 1
+ye multithread ye 1
+ye myop 1
+ye myop oracl 1
+ye no answer 1
+ye no dec 1
+ye no output 2
+ye no qu 1
+ye no ye 1
+ye of cour 1
+ye par16 1
+ye par32 1
+ye par8 1
+ye particl 1
+ye pr150 1
+ye s7552 1
+ye smart 1
+ye smart supersc 1
+ye stack 1
+ye stack perfect 1
+ye string 1
+ye string def 1
+ye without fl 1
+ye ye 2
+ye ye ye 1
+ye yep 1
+ye yep ok 1
+ye1 1
+year 30
+year ag mayb 1
+year aver 1
+year for compiler 1
+year forecast 1
+year month 1
+year month day 1
+year object 1
+year object exper 1
+year of effort 1
+year of log 1
+year of prelimin 1
+year of research 1
+year of satel 1
+year of sequ 1
+year order 1
+year sunspot 1
+year sunspot aver 1
+year th genet 1
+year to becom 1
+year to com 1
+year to identif 1
+year undergradu 1
+year undergradu stud 1
+year wa ment 1
+year wh 1
+year wil render 1
+yeh 1
+yellow 2
+yellow and unmark 1
+yellow cr 1
+yellow cr connect 1
+yellow endpoint 1
+yellow nod 1
+yellow norm 1
+yellow norm connect 1
+yellow secon connect 1
+yen 2
+yen chu 1
+yep 1
+yep ok 1
+yesc 1
+yesn 1
+yew 5
+yf 1
+yf ys 1
+yg 2
+yg induc 1
+yg induc direct 1
+yg95 1
+yi 17
+yi 1xi 1
+yi 1xi 2x2i 1
+yi ar equ 1
+yi ar giv 1
+yi bi 1
+yi def 1
+yi ei 1
+yi ei nx 1
+yi instead 1
+yi k yield 1
+yi proc 1
+yi proc lin 1
+yi replac 1
+yi vect 1
+yi we cr 1
+yi xi 1
+yi xi oe 1
+yi xt 1
+yi.b.m 1
+yield 58
+yield a bal 1
+yield a cel 1
+yield a common 1
+yield a confid 1
+yield a datab 1
+yield a dram 1
+yield a ec 1
+yield a fin 1
+yield a framework 1
+yield a good 1
+yield a heur 1
+yield a parameter 1
+yield a path 1
+yield a prior 1
+yield a se 2
+yield a smaller 1
+yield a smooth 1
+yield a softwar 1
+yield a solut 2
+yield a spac 1
+yield a speedup 1
+yield a st 1
+yield a test 1
+yield a tr 1
+yield a zer 1
+yield addit 1
+yield addit perform 1
+yield al prim 1
+yield al simil 1
+yield al solut 1
+yield an altern 1
+yield an improv 1
+yield an incorrect 1
+yield another word 1
+yield better estim 1
+yield both posit 1
+yield cheaper 2
+yield cheaper system 2
+yield commut 1
+yield constraint 1
+yield correct 1
+yield correct condit 1
+yield differ se 1
+yield ec 1
+yield ec axiom 1
+yield f1 1
+yield good 2
+yield good perform 2
+yield greater 1
+yield greater saving 1
+yield high 1
+yield high throughput 1
+yield in gener 1
+yield inform 1
+yield le cod 1
+yield mean 2
+yield mean detect 1
+yield mean valu 1
+yield mislead 1
+yield mislead result 1
+yield mor eng 1
+yield mor insight 1
+yield mor prec 1
+yield multipl 1
+yield multipl ver 1
+yield optim 1
+yield optim triangl 1
+yield order 1
+yield perform 1
+yield perform gain 1
+yield r00 1
+yield raw 1
+yield raw perform 1
+yield repr 1
+yield result 1
+yield sever addit 1
+yield shar 1
+yield shorter 1
+yield shorter fundam 1
+yield signif 1
+yield signif perform 1
+yield simil 2
+yield simil perform 1
+yield simil result 1
+yield som sum 1
+yield th bound 1
+yield th conclus 1
+yield th desir 3
+yield th list 1
+yield th minim 1
+yield th smaller 1
+yield th solut 1
+yield th subexpr 1
+yield th tr 1
+yield tim 1
+yield tw kind 1
+yield tw main 1
+yield tw submatr 1
+yield unaccept 1
+yield unaccept perform 1
+yield unpredict 1
+yield ver good 1
+yiffl 1
+yig 1
+yig fa 1
+yij 1
+yij qi 1
+yin 1
+yin wong 1
+yin yin 1
+yin yin wong 1
+yingqun 1
+yinstitut 1
+yinstitut nat 1
+yinstitut nat de 1
+yj 8
+yj fv 1
+yj of tk 1
+yk 5
+yk akd 1
+yk is sent 1
+yk real valu 1
+yk2 1
+yk2 kxk2kyk2 1
+ykj 1
+ykj denot 1
+yl 1
+yl91 1
+ylg 1
+ym 3
+ymplem 1
+ymplem cau.gmd.isst.vw 1
+yn 8
+yn ar fr 1
+yn e pil 1
+ynew 1
+ynew2 1
+ynew2 by appl 1
+ynt 1
+ynt zt 1
+yokot 1
+yon 1
+yon malach 1
+yon90 1
+yonezaw 4
+yonezaw is.s.u 1
+yonezaw is.s.u tok.ac.jp 1
+yonezaw is.sg.u 1
+yonezaw is.sg.u tok.ac.jp 1
+yonezaw1 1
+york 42
+york at st 1
+york london 1
+york ny 1
+yorkshir 1
+yorkshir water 1
+yorktown 4
+yorktown and ibm 1
+yorktown height 3
+yoshid 1
+yoshihik 1
+yoshihik futamur 1
+yoshihir 1
+yoshihir oyam 1
+yougoslav 1
+yougoslav qu 1
+yougoslav qu sont 1
+young 8
+young investig 3
+young investig award 3
+young pi 1
+young univer prov 2
+yourdon 1
+yourdon pr 1
+yow 1
+yow chan 1
+yow chan lin 1
+yp 4
+yp and ya 1
+yp xq 1
+yp xq fg 1
+yp xq yq 1
+yp ya 1
+yp ys 1
+ypag 1
+ypag y 1pag 1
+ypg 2
+ypg th se 1
+yq 3
+yq tsp 1
+yq tsp tsq 1
+yr 3
+yr contain 1
+yr fg 1
+yresearch 1
+yresearch support 1
+ys 7
+ys ar nonempt 1
+ys being empt 1
+ys being nonempt 1
+ys83 1
+yschool 1
+yschool of computer 1
+ysubst 1
+ysubst contribut 1
+ysun 1
+ysupport 2
+ysupport in part 1
+yt 3
+yth 5
+yth paper 1
+yth support 1
+yth work 3
+yth work describ 1
+ytj91 1
+yu 6
+yu and fisch 1
+yu and yow 1
+yu kwong 1
+yu kwong kwok 1
+yuand.dan 1
+yuen 1
+yug 1
+yug yugoslav12 1
+yugoslav12 1
+yum 1
+yung 2
+yung fu 1
+yung fu cheng 1
+yutak 1
+yutak ishikaw 1
+yuzhang 1
+yuzhang heapsort 1
+yuzhang heapsort var 1
+yv 3
+yv bekker 1
+yv bekker examinateur 1
+yv girard 2
+yv lafont 1
+yvinec 1
+yw 1
+ywork 1
+ywork support 1
+yx 4
+yx pa 1
+yx pa fs 1
+yy 2
+yybuffer 1
+yybuffer addr 1
+yylv 1
+yylv valu 1
+yylv valu scan 1
+yylv var 1
+yyy 1
+yyy x1 1
+yyy x1 x1 1
+z.m 1
+z0 2
+z0 and z1 1
+z0 form 1
+z0 mean 1
+z0 mean z0 1
+z00 1
+z00j 1
+z00j de 1
+z01 1
+z1 6
+z1 mean 1
+z1 to zn 1
+z1 x2 1
+z1 x2 y2 1
+z1 z2 1
+z2 6
+z2 en 1
+z2 en deux 1
+z2 ensembl 1
+z2 ensembl de 1
+z2 interv 1
+z2 interv ent 1
+z2 sur 1
+z2 tel 1
+z2 tel qu 1
+z2 x3 1
+z2 x3 y3 1
+z2g 1
+z3 3
+z3 weak 1
+z7 1
+z7 mediumg 1
+z8w 1
+za 2
+za11 1
+za11 za22 1
+za22 1
+za93 1
+zabback 2
+zach 1
+zagh 1
+zagreb 1
+zaharoglou 1
+zahorjan 1
+zakhor 1
+zam 2
+zam ib 2
+zan 1
+zaniol 1
+zar 1
+zarmer 1
+zarndt 1
+zaroliag 1
+zastosow 1
+zastosow matem 1
+zat 1
+zb 1
+zd 1
+zd efin 1
+zd efin par 1
+ze 2
+ze pa 1
+ze pa dan 1
+zealand 2
+zealand m.apperl 1
+zealand m.apperl cs.waikat.ac.nz 1
+zealand masood 1
+zealand masood cs.waikat.ac.nz 1
+zebr 1
+zebr and constraint 1
+zedan 1
+zef 1
+zef stefan 1
+zef stefan institut 1
+zel 1
+zeleznik 1
+zeller 1
+zemach 1
+zen 2
+zeng 1
+zeng et al 1
+zentralinstitut 2
+zentralinstitut f ur 2
+zer 51
+zer and le 1
+zer and on 1
+zer and plot 1
+zer and proc 1
+zer ap 1
+zer as ff2 1
+zer assign 2
+zer autocorrel 1
+zer bi 1
+zer bit 1
+zer by cancel 1
+zer compl 1
+zer confid 1
+zer const 1
+zer const oen 1
+zer conver 1
+zer conver condit 1
+zer cost 1
+zer cost block 1
+zer cost condit 1
+zer cost disjoint 1
+zer cost match 1
+zer cr 2
+zer cr point 2
+zer denot 2
+zer detect 1
+zer detect algorithm 1
+zer detect imag 1
+zer diagon 1
+zer du 1
+zer each compon 1
+zer eff 1
+zer el 1
+zer elsewh 1
+zer entr 2
+zer entrop 1
+zer entrop input 1
+zer error 2
+zer error parallel 1
+zer error rat 1
+zer finder 1
+zer funct 2
+zer funct return 1
+zer in common 1
+zer init 2
+zer init vot 1
+zer input 1
+zer input port 1
+zer integer 1
+zer integer result 1
+zer lat 1
+zer lat server 1
+zer length 1
+zer length deriv 1
+zer matr 1
+zer matr el 1
+zer mean 1
+zer nonperiod 1
+zer nonperiod autocorrel 1
+zer nonzer 1
+zer nonzer structur 1
+zer of matr 1
+zer of orthogon 1
+zer of sobolev 1
+zer par 1
+zer par differ 1
+zer per row 1
+zer polynom 1
+zer respect 1
+zer result 1
+zer return 1
+zer row 1
+zer sect 1
+zer step 1
+zer step deriv 1
+zer th 1
+zer th order 1
+zer th overhead 1
+zer to ch 1
+zer tok 1
+zer vot 1
+zer vot matr 1
+zer weight 1
+zer weight edg 1
+zer with ni 1
+zeroerror 1
+zeroerror algorithm 1
+zeroth 2
+zeroth character 1
+zeroth stack 1
+zeroth stack entr 1
+zeus 1
+zf.siem.de 1
+zfc 1
+zfc se 1
+zfc se theor 1
+zg 1
+zh92 1
+zh93 1
+zhang 15
+zhang and pool 1
+zhang and thom 1
+zhang approach 1
+zhang mehm 1
+zhang parallel 1
+zhang parallel branch 1
+zhiyu 1
+zhiyuaun 1
+zhiyuaun li 1
+zhong 1
+zhou 2
+zhou a appliqu 1
+zhou a pous 1
+zhou compar 1
+zhou compar un 1
+zhou dan 1
+zhou dan le 1
+zhou est 1
+zhou est de 1
+zhuang 1
+zi 6
+zi d zi 1
+zi g zi 1
+zi gi 1
+zi o zi 1
+zi zi 1
+zibm 1
+zibm t.j 1
+zicar 2
+ziec 1
+zieger 1
+ziegler 2
+zienzsteigerung 1
+zienzsteigerung durch 1
+zienzsteigerung durch parallelisierung 1
+ziezold 1
+zim 2
+zimand 1
+zimand cs.rochester.edu 1
+zink 1
+zinr 1
+zinr b.p.93 1
+zip 2
+zip cod 2
+zip cod recognit 1
+zipser 1
+zisserman 1
+zj 1
+zj assoc 1
+zj assoc ee 1
+zj de 1
+zj de fa 1
+zj est 1
+zj est un 1
+zj w jn 1
+zk 4
+zk and tk 1
+zk ar distinct 1
+zk is comput 1
+zk real valu 1
+zk0 1
+zk0 xk 1
+zkj 1
+zkj tc 1
+zn 4
+zn ae 1
+zn dan 1
+zn dan zp 1
+zn de 1
+zn de la 1
+zn en 1
+zn en treil 1
+zn et le 1
+zn et un 1
+zn par 1
+zn par un 1
+zn sj2e 1
+zn sj2e tj 1
+zn sur 1
+zn sur lu 1
+zn sur zn 1
+zn tel 1
+zn tel qu 1
+zn tout 1
+zn tout ent 1
+znatur 1
+znatur sc 1
+znatur sc div 1
+zobel 1
+zon 8
+zon a la 1
+zon a lieu 1
+zon and valu 1
+zon ar automat 1
+zon ar se 1
+zon ba 1
+zon by zon 1
+zon check 1
+zon comport 1
+zon de 2
+zon de retour 1
+zon derreur 1
+zon en 1
+zon exhaust 1
+zon field 1
+zon growth 1
+zon illeg 1
+zon lim 1
+zon lor 1
+zon lor de 1
+zon m emoir 1
+zon mechan 1
+zon mechan mak 1
+zon modif 1
+zon pair 1
+zon par 1
+zon par linterm 1
+zon peu 1
+zon peu profon 1
+zon prov 1
+zon quil 1
+zon quil sont 1
+zon solut 1
+zon tabl 1
+zon tabl entr 1
+zon th addr 1
+zon tr 1
+zon tr es 1
+zon with zon 1
+zoom 1
+zorn 1
+zorn dan 1
+zorn dan le 1
+zp 1
+zq 1
+zr 1
+zrg 1
+zrg th se 1
+zs 4
+zs ar order 1
+zs of length 1
+zs of theorem 1
+zs privileg 1
+zs1 1
+zstep 1
+zstep for lisp 1
+zsupport 1
+zsupport in part 1
+zt 1
+zt wh 1
+zt.q 1
+zt91a 1
+zt91b 1
+ztel 1
+ztel qu 1
+zth 1
+zth work 1
+ztj 1
+ztop 1
+ztop bm 1
+ztq 1
+ztq i ij 1
+ztq lj 1
+zu 2
+zu et zv 1
+zu kiel 1
+zur 1
+zur method 1
+zur method der 1
+zur publik 1
+zur publik eingereicht 1
+zurich 3
+zurig 1
+zuyl 1
+zv 1
+zv util 1
+zv util la 1
+zwaenepoel 2
+zwickau 1
+zwickau fakult 1
+zwisch 1
+zwisch kunst 1
+zwisch kunst und 1
+zyd 1
+zz 1
+zzk 1
+zzk method 1
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.kf
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.kf	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.kf	(revision 21083)
@@ -0,0 +1,4056 @@
+1300
+16s and 23s rrn	1
+2	1
+2 d graph	1
+2 satisf	1
+2d and 3d match	1
+2d match	1
+3 d measur	2
+3 d model	1
+3 d model construc	1
+3 d point correspon	1
+3 d rigid bod mot	1
+3 d sen	1
+3d model ba ind	1
+3d mot	1
+3d object recognit	1
+3d object repr	1
+3d reconstruc	1
+3d textur map	1
+3d widg	1
+3sumhard problem	1
+8 point algorithm	1
+aal	1
+abduc	2
+abr	1
+absolut or	1
+abstract	1
+abstract dat typ	2
+abstract domain	1
+abstract interpr	15
+abstract sem	1
+acc	1
+acc control	4
+acc list	1
+acc method	3
+acc to on lin inform	1
+accept and gener rewrit system	1
+accommod	1
+account	1
+accur	2
+accur interv	1
+acoust interfac	1
+acp	1
+acpdrt	1
+act	3
+act badg	1
+act datab	3
+act learn	1
+act log	1
+act me	1
+act sen	1
+act support	1
+act system	1
+act vi	1
+activ funct	1
+ad 95	1
+ad task	1
+adapt	5
+adapt control	1
+adapt gain	1
+adapt inform disper algorithm	2
+adapt langu model	1
+adapt mesh	1
+adapt pr	1
+adapt protocol	1
+adapt refin	1
+adapt reson theor	3
+adapt rout	5
+adapt softwar	1
+adapt softwar developm	1
+adapt sort	2
+adapt system	1
+adapt trad strateg	1
+adapt user interfac	1
+addr trac	1
+addr trac an	1
+adequ	2
+adifor	1
+adjoint	1
+adm control	2
+adm control and rout of mult cl guaranteed flow	1
+aerosol opt depth	1
+aesth evalu	1
+agent	1
+agent accur	1
+agent architectur	3
+agent orient model	1
+agent orient program	1
+aggreg	1
+agr	1
+agricultur	1
+ai	1
+aircraft perform	1
+al	2
+al ken	1
+al to al exchang	2
+algebr	4
+algebr riccat equ	2
+algebr specif	2
+algebr specif observ behaviour theorem prov	1
+algebr structur	1
+algebr topolog	1
+algebr var	1
+algorithm	14
+algorithm anim	4
+algorithm complec	2
+algorithm design	2
+algorithm developm	1
+algorithm map	2
+alignm	2
+alloc	1
+alph be	1
+altern discr tim oper	2
+ambigu	1
+an	3
+an and	2
+an of algorithm	5
+an of random algorithm	1
+an of var	1
+an solut	1
+analog and digit vid	1
+analog comput	1
+analog reason	1
+angiograph	1
+anim	4
+anim and skin model	1
+animat	1
+annot	1
+anonym	1
+anonym revoc	2
+answer an	1
+ant dep	2
+ant heb learn	2
+antimatr	1
+appl	2
+appl character	1
+appl design	1
+appl model	1
+appl of cryptograph	1
+appl program interfac	1
+appl shar	1
+appl specif architectur	1
+appl to telecommun	1
+approxim	7
+approxim algorithm	19
+approxim ink match	1
+approxim plan	1
+approxim rat	1
+approxim reason	2
+approxim spanner	1
+approxim string match	2
+approxim synchron	1
+apx compl problem	1
+ar	1
+ar comput	1
+ar expan	1
+ar proc	1
+ar redistribut	1
+ar renam	1
+arbiter	1
+arbitr	1
+arbitr pol	1
+arbitr prec arithm big number arithm rat arithm real arithm comput real number continu fract caml	1
+arbor	1
+archaeolog interpr	1
+architectur	2
+architectur styl	1
+architectur with larg var	1
+argum constraint	2
+arithm cod	1
+arithm hierarch	1
+arrang	1
+arrang comput in d dim	1
+art design	1
+art gal theorem	1
+artif intellig	9
+artif lif	3
+artif neur network	1
+artmap	1
+arx model	1
+as	1
+assemb plan	1
+asser check	1
+assessm	1
+assignm of pol valu	2
+assoc memor	2
+assoc rl	2
+asymptot proper	1
+asynchron	2
+asynchron buch autom	1
+asynchron circuit	1
+asynchron design	1
+asynchron distribut comput	1
+asynchron gvt comput	1
+asynchron hardwar	1
+asynchron iter algorithm	1
+asynchron iter method	1
+asynchron parallel algorithm	1
+asynchron sequ circuit	1
+asynchron softwar evolut	1
+asynchron softwar maint	1
+asynchron system	2
+asynchron transfer mod	5
+atl	1
+atm	11
+atm adapt layer	1
+atm ba network of workst	1
+atm multicast	1
+atm network	3
+atm shortcut	1
+atm switch schedl	5
+atmospher correct	2
+atom	1
+atom broadcast	2
+atom com protocol	1
+atom se constraint	1
+attribut	1
+attribut grammar	3
+attribut timestamp	2
+attribut valu repr	1
+auc	1
+aud hardwar	1
+augm	1
+augm transit network	1
+aut regr	3
+auth cod	1
+auth protocol	1
+author	1
+author system	1
+autocorrel funct	1
+autoepistem log	2
+autom	5
+autom aver ca an	1
+autom deduc	1
+autom defint of sub neur network	1
+autom differ	1
+autom discov	1
+autom gener	1
+autom layout gener	1
+autom parallel	4
+autom program synth	1
+autom reason	2
+autom targ recognit	1
+autom test gener	1
+autom theorem prov	4
+autom verif	1
+autom vid dat structur	1
+autonom lock	1
+autonom robot	2
+avail	5
+avail bit rat	1
+aver me lat	1
+axiomat	1
+b amn	2
+b ba	1
+b fact	1
+b link tr	1
+b method	1
+b spl	1
+b tr	2
+ba parallel proc	1
+ba word graph	1
+backpressur flow control	1
+backpropag	4
+backpropag net	1
+backtrack	1
+backup system	1
+bag	1
+bal cor	1
+bal search tr	1
+baldwin effect	1
+bandwidth alloc	2
+bandwidth manag	1
+bandwidth reserv in atm switch	1
+bandwidth schedl	1
+bankruptc predict	1
+bar synchron	7
+barb bisiml	1
+batch learn	1
+batch proc	1
+batch queu system	1
+baum welch reestim	1
+bay belief network	4
+bay classif	1
+bay estim	1
+bay learn	1
+bay network	5
+bay risk	1
+bay stat	2
+be number	1
+bececil langu	4
+behavior	1
+behaviour compat	1
+belief	1
+belief funct	1
+belief network	2
+belief upd	1
+bessel funct	1
+best first search algorithm	1
+bez	1
+bgp	2
+bi	2
+biconnect	1
+biconnect compon	1
+bin compl pair	1
+bin dec diagram	1
+bin imag	1
+bind	1
+binocl ster	1
+bioinformat	1
+bioph proper	1
+biosequ	1
+bipart graph	3
+bisiml	4
+bit vect algorithm	1
+black and schol opt pr theor	1
+blackboard	1
+block algorithm	1
+block cod	1
+block edit dist	1
+block encod	1
+block probabilt	1
+block recur algorithm	1
+block recur model	1
+block structur	4
+blood typ	1
+blu no	1
+bon graph	1
+book cipher	1
+boolean algebr	2
+boolean forml	1
+boolean se oper	1
+bottleneck problem	1
+bottom up evalu	2
+bottom up test	1
+bound	2
+bound for approxim fact	1
+bound length estim	1
+bound quantif	1
+box whisker	1
+boyer moor log	1
+bpadrt	1
+bpadrtid	1
+branch and	1
+branch and bound	3
+branch and prun	1
+branch correl	1
+branch predict	1
+branch stream character	1
+brdf	1
+brent principl	1
+bridg connect	1
+broadband network	1
+broadcast	23
+broadcast disk	2
+broadcast ring interconnect	1
+brow	1
+browser	1
+bsd 4	1
+buck	1
+bud system	1
+buffer	1
+buffer inser	1
+buffer manag	2
+build block hypoth	1
+build geograph	1
+built in self test	1
+bulk channel transfer	1
+burst	1
+burst funct	1
+bus proc redesign	1
+but need to be assoc with a term from th relev thesaurus	1
+by agr	1
+c	3
+c program langu	1
+ca ba reason	7
+ca retrief	1
+ca stud	1
+ca tool	1
+cac	1
+cach	6
+cach architectur	1
+cach coh	17
+cach coh protocol	1
+cach design	1
+cach gener	1
+cach interfer or conflict	1
+cach memor	1
+cach memor design	1
+cach mi	1
+cach onl memor architectur	1
+cach siml	2
+cach visu	1
+cad	2
+cagd	1
+cal adm control	2
+cal by nam	1
+cal by valu	2
+cal pattern	1
+calc bind	1
+calcl	3
+calculus	4
+calculus of construc	1
+calibr	1
+callb nam	1
+camer break detect	1
+camer model	1
+canon	1
+cap augm view	1
+capabil	1
+car sen multipl acc	1
+cartograph metaphor	1
+catamorph	1
+categor	1
+categor grammar	2
+categor theor	1
+caus	4
+caus broadcast	1
+caus graph	1
+caus indep	1
+caus input list	1
+caus model	1
+caus probabil network	3
+caus sequ	1
+cc	1
+ccm2	1
+cel encod	1
+cel segm	1
+cel track	1
+certioc	1
+cfc 113	1
+cfd pack	1
+ch	2
+ch point	1
+ch se	1
+chain ba schedl	1
+chang control	1
+chang of ba	2
+changel	1
+channel alloc	1
+channel cont	1
+character	1
+character composit	1
+charg	1
+chebyshev polynom	1
+checkpoint	3
+chem metaphor	2
+chin font	1
+chin room experim	1
+cholesk fact	1
+chrom ind	1
+chronolog	1
+circuit partit	2
+circuit reduc	1
+circuit switch	1
+circuit synth	1
+cl	4
+cl abstract algorithm	1
+cl evolut	1
+cl hierarch	1
+cl hierarch optim	1
+cl libr	1
+cl libr organ	2
+cl of prior	1
+cl of util	1
+cl screen	1
+classif	14
+classif tr	1
+client server architectur	1
+client server distribut datab	1
+client server model	3
+clim model	1
+clin diagn and dec mak	1
+cliqu tr propag	1
+clock granl	1
+clock synchron	1
+closur oper	1
+cluster	11
+cluster an	1
+cluster architectur	5
+cluster init	1
+cluster system	2
+cm driver model	1
+co evolut	1
+co oper	1
+coar grain parallel	1
+cod construc	1
+cod gener	2
+cod mot	1
+cod optim	1
+cod schedl	1
+cognit diagn	1
+cognit model	1
+cognit sc	1
+cognit system	1
+coh pair	1
+cohabit	1
+coinc theorem	2
+collabor	2
+collabor commun	1
+collabor environm	1
+collabor work	2
+collap	1
+collect commun	22
+collect knowledg	1
+collect trash	1
+colloc	1
+color	2
+color ind	1
+column gener	1
+column part pivot	1
+com	3
+com proc	1
+comb	2
+combin algorithm	1
+combin design	1
+combin empir and an learn	1
+combin gr cod	1
+combin optim	9
+combin problem	4
+combin structur	1
+common reason	1
+commonlisp	1
+commun	4
+commun algorithm	2
+commun benchmark	1
+commun bus	1
+commun fr petr net	1
+commun graph	2
+commun lat mask	1
+commun loc	1
+commun mod	1
+commun model	1
+commun network design	1
+commun perform	1
+commun port model	1
+commun primitiv	3
+commun proper	1
+commun protocol	2
+commun schedl	4
+commun schem	2
+commun siml	1
+commun system	1
+comp	1
+comp mask	1
+comp proc	1
+compact	2
+compact repr	1
+compar and swap	2
+comparison	1
+comparison siml an	1
+competit an	1
+compil	7
+compil method	1
+compil run tim system	1
+compil techniqu	1
+compil tim schedl	1
+compiler	3
+compiler ba cach coh	1
+compiler compiler	1
+compiler optim	4
+compiler technolog	1
+compl	1
+compl algorithm	1
+compl exchang	1
+compl mot plan	1
+compl proc recov	1
+compl theor	2
+complec	9
+complec an	1
+complec root	1
+complec system	1
+complec unit of work	1
+compon	2
+compon indep	1
+compon merg	1
+componentwar	1
+composit	5
+composit program	1
+composit sem	1
+compr	2
+compr domain imag manipl and ind	1
+compreh	1
+compreh model	1
+comput biolog	3
+comput complec	12
+comput geometer	12
+comput learn theor	1
+comput lingu	4
+comput log	1
+comput model	3
+comput redund	1
+comput tr log	1
+computer aid design	2
+computer aid instruc	1
+computer algebr	1
+computer anim	1
+computer architectur model	2
+computer ba tut	1
+computer ch	1
+computer confer	2
+computer graph	8
+computer graph anim	1
+computer model	1
+computer network	2
+computer program	1
+computer secur	1
+computer support collabor learn	2
+computer support collabor work	3
+computer support cooper work	5
+computer vi	10
+computersupport cooper work	1
+con	3
+con check	1
+con constraint	1
+con glob checkpoint	1
+con glob st	1
+con model	3
+con reason	1
+con sect funct network	1
+con tr	1
+concept an	1
+concept learn	1
+conceptu graph	1
+conceptu model	3
+conceptu model in interfac	1
+conceptu neighbour	1
+conceptu structur	1
+concr dat structur	1
+concur	28
+concur control	6
+concur design	1
+concur dict dat structur	1
+concur engineer	1
+concur log program	1
+concur object orient langu	1
+concur program	7
+concur program ver	1
+concur program ver cat	1
+concur queu	1
+concur softwar engineer	2
+concur specif	2
+concur system	2
+condit	1
+condit indep	3
+confid	3
+configur	2
+configur manag	2
+conflu divid differ	1
+conform	1
+conform assessm	1
+conform flec	1
+congest control	4
+congru transform	1
+conjug grad method	2
+conjug imag	1
+conjunct answer	1
+connect	3
+connect compon	1
+connect mach	1
+connect manag	1
+connect orient switch	1
+conquer	1
+consensus sequ	1
+consensus sequ vot	1
+conserv algorithm	1
+conserv ext	2
+constrain dat plac	1
+constrain markov dec problem	2
+constraint	8
+constraint and object orient datab	1
+constraint ba langu	2
+constraint ba reason	2
+constraint hierarch	4
+constraint log program	3
+constraint program	4
+constraint propag	2
+constraint satisf	2
+constraint satisf problem	1
+constraint solut	1
+constraint system	2
+construc induc	1
+construc network	1
+construc sol geometer	1
+consum channel	3
+cont ba imag qu	1
+cont ba retrief	4
+cont tabl	2
+context	6
+context ba simil	1
+context dep classif	1
+context fr grammar	1
+context model	1
+contextu pr calculus	1
+continu	2
+continu displ	2
+continu lat	1
+continu med	4
+continu med player	1
+continu med toolkit	1
+continu med traff	1
+continu pa styl transform	1
+continu po	1
+continu st spac	1
+continu variabl	1
+contour integr	1
+contrast	1
+control	1
+control dep	3
+control flow	3
+control flow parallel	1
+control flow test	1
+control of execut	1
+convec	1
+convec optim	1
+converg	3
+converg estim	1
+converg funct	1
+cooper	1
+cooper act	1
+cooper control	1
+cooper gam	1
+cooper interfac	1
+cooper work	1
+corb	2
+corner	1
+correl matr	1
+correspon comput	1
+cost alloc	1
+cost sensit classif	1
+coter	2
+count st spac	2
+coupl	1
+coupl transm lin	1
+coursewar	1
+cover	5
+cover cod	2
+cover design	1
+cover radius	2
+cp	1
+cr sect shap	1
+cr t3d	1
+cr val	1
+crew pram	1
+crew schedl	1
+crit car	1
+crit tim	1
+crossbar	1
+crossover	1
+cryptan	1
+cryptograph	6
+cryptograph digest	1
+cryptograph log	1
+cscl	2
+cscw	5
+csp	3
+ctl	1
+cub connect cycl	1
+cub smooth spl	1
+cur of dim	1
+cur sourc model	1
+curv surfac	1
+custom	1
+custom dynam load bal	1
+custom oper system	1
+cut	1
+cut elim	4
+cut plan	1
+cut through rout	4
+cutan circl	1
+cyc	1
+cycl	1
+cycl cover	1
+cycl tr	1
+dac	1
+dad theorem	1
+damp feedback	1
+damp system dynam	1
+dart	1
+dat alloc	1
+dat an	3
+dat assimil	1
+dat avail	1
+dat bal	1
+dat cach	1
+dat commun	1
+dat complec	2
+dat compr	3
+dat dep	3
+dat dep triangl	1
+dat distribut	4
+dat driv	1
+dat driv ar	1
+dat engineer	2
+dat flow	3
+dat flow an	10
+dat flow an gener	1
+dat flow anom	1
+dat flow diagram	1
+dat flow mach	1
+dat flow test	4
+dat integr	1
+dat layout	1
+dat loc	1
+dat loc optim	1
+dat min	8
+dat model	1
+dat parallel	1
+dat parallel algorithm	1
+dat parallel langu	7
+dat plac	1
+dat preproc	2
+dat qu	1
+dat redistribut	1
+dat redund	1
+dat refin	1
+dat repr	1
+dat resil	1
+dat secur	1
+dat skew	1
+dat strip	1
+dat structur	12
+dat visu	1
+dat wareh	2
+datab	5
+datab buffer manag	2
+datab cach manag	1
+datab correct criter	1
+datab design	1
+datab driv autom layout gener	1
+datab integr	1
+datab langu	1
+datab perform	1
+datab quer	1
+datab recov	3
+datab recov schem	1
+datab schem evolut	1
+datab search	1
+datab secur	1
+datab st organ	1
+datab system	2
+datab visu environm	1
+datadriv model	1
+dataflow	1
+dataflow an	1
+datalog	4
+datamodel	1
+dataparallel pr gram	1
+daubech	1
+db tr	1
+dcg grammar	1
+de	1
+de bruijn digraph	1
+deadlock	1
+deadlock fr	1
+deadlock freedom	2
+deadlock prev	1
+debug	7
+dec	3
+dec alph	1
+dec an	1
+dec con	1
+dec mak	1
+dec support system	1
+dec task	1
+dec theor	2
+dec theor plan	2
+dec tr	5
+dec tr induc	1
+dec tr prun	1
+decept	1
+decl sem	2
+decluster	1
+decompil	1
+decomposit of self dual funct	1
+deduc datab	6
+deduc dbm and complec object	1
+deep model	1
+default log	1
+definit	1
+definit ba	1
+deflect	1
+deflect rout	1
+deform	1
+deform templ	1
+degener	1
+degr constrain multicast	3
+degr structur	1
+del and taylor ser	1
+del bound	3
+del jitter	1
+del sensit traff	1
+delaun diagram	1
+delaun triangl	4
+deleg	1
+deleg network	1
+dempster shafer theor	1
+den funct	1
+den structur	1
+denot model	1
+denot sem	6
+dent detect	1
+dep	3
+dep an	2
+dep graph	3
+dep specl	1
+dep system	1
+depth first search	2
+derandom	2
+deriv analog	1
+deriv rel	1
+derout	1
+descript and norm model	1
+design	2
+design an	1
+design and an of algorithm	1
+design ca	2
+design correct	1
+design langu	1
+design lin classif	1
+design of algorithm	1
+design pattern	2
+design problem solut	1
+design rat	1
+design recov	1
+design styl	1
+design theor	1
+design transform	1
+design variabl	1
+design verif	1
+desk	2
+desktop	2
+detect and undetect fault	3
+determin finit st autom	2
+determin pur langaug	1
+determin re execut	1
+determin rout	3
+diagn	1
+differ	2
+differ list	1
+differ oper	1
+differ topolog	1
+digit aud	1
+digit bound	1
+digit geometer	2
+digit halft	1
+digit on lin comput	1
+digit paym system	2
+digit sign proc	1
+digit signatur	1
+digit vid	1
+dim	1
+dim inspect	1
+dioeer measur	1
+dioph equ	1
+direct	3
+direct ba protocol	10
+direct edg filter	1
+direct exchang	1
+direct freeform surfac render	1
+direct manipl	3
+direct protocol	2
+direct rel	2
+direct typ	1
+direct vol render	2
+dirichl distribut	1
+dirichl mixtur prior	3
+dirichl prior	2
+discard and acc driv red techniqu schem	1
+disconnect oper	2
+discontinu	1
+discour	2
+discov in dat	1
+discov in datab	2
+discr acc control	1
+discr event siml	1
+discr med	1
+discr orthogon wavel	1
+discr tim	1
+discr tim ser	1
+discr wavel transform	1
+discreteev siml	1
+discrimin funct	1
+disjoint	2
+disjunct inform	1
+disk	1
+disk ar	2
+disk schedl	1
+disk upd	1
+disorder system	1
+disper	1
+displ	2
+dissem	1
+dist funct	3
+dist learn	1
+dist teach	1
+distribut	1
+distribut algorithm	12
+distribut and heter system	1
+distribut ar	1
+distribut checkpoint	4
+distribut comput	13
+distribut comput environm	1
+distribut computer system	2
+distribut dat structur	1
+distribut datab	4
+distribut datab system	1
+distribut debug	2
+distribut disk strip	2
+distribut execut	2
+distribut fil system	3
+distribut graph algorithm	1
+distribut interact siml	1
+distribut knowledg	1
+distribut memor	3
+distribut memor computer	4
+distribut memor parallel comput	1
+distribut memor system	1
+distribut multim system	1
+distribut network algorithm	1
+distribut network comput	1
+distribut non coh shar memor	1
+distribut object comput	1
+distribut oper system	1
+distribut parallel comput	2
+distribut proc	2
+distribut proc recov	1
+distribut program	2
+distribut program langu	2
+distribut protocol	1
+distribut queu	2
+distribut real tim system	2
+distribut register	1
+distribut search structur	2
+distribut shar memor	6
+distribut shar memor system	8
+distribut sort	2
+distribut system	21
+distribut system distribut control	1
+distribut transact	1
+distribut transact proc	1
+distribut typ	1
+distribut vr environm	1
+disturb decoupl	2
+disulf bridg	1
+dither	1
+div and	1
+dn	2
+dn backbon conform	1
+dn classif	1
+doacr execut	1
+doacr loop	1
+docum an	2
+docum format standard	1
+docum layout an	1
+docum proc	1
+docum recognit	1
+docum understand	1
+domain	1
+domain an	1
+domain knowledg	2
+domain model	3
+domain theor	1
+domin graph	1
+doppler radar	1
+doubl pag anom	1
+doubl pag system	1
+dp replac anom	1
+draw softwar	1
+drop toler	1
+dsm protocol	1
+du	2
+du law	1
+dual minor funct	1
+dut	1
+dynam	2
+dynam algorithm	4
+dynam alloc	1
+dynam an	1
+dynam configur	1
+dynam interv manag	1
+dynam load bal	1
+dynam memor disambigu	1
+dynam multipl pvsplit	1
+dynam network	3
+dynam object cluster	1
+dynam program	7
+dynam program sl	1
+dynam reclassif	1
+dynam sc segm	1
+dynam siml	1
+dynam system	3
+dynam topolog	1
+dynam traff control	1
+dynam upd	1
+dynam variabl	1
+e	1
+e cub rout	1
+ea approxim se	1
+ea count se	1
+ear deliv	1
+ear vi	1
+earth	1
+ec	2
+echocardiogram	1
+ecolog and socioeconom fact	1
+edg separ	1
+edit	1
+edit dist	3
+educ	1
+educ and train	1
+eeg	1
+eff	3
+eff algorithm	1
+eff cod gener	1
+eff inform retrief	1
+eff reason	1
+effect bandwidth	2
+egl milner order	1
+eiag	1
+eig decomposit	1
+eigenvalu	1
+eigenvalu problem	2
+elast object	1
+elast tim algorithm	1
+electr charg den distribut	1
+electr circuit	1
+electron commerc	2
+electron ink	1
+electron mon	2
+electron perform me	1
+elev	1
+elim algorithm	1
+elit	1
+ellip	1
+elmor del	1
+em	2
+emb	2
+emb cod	1
+emb plan	1
+emb sql	1
+emb system	1
+emb system program	1
+emb theor	3
+emerald	1
+empir	1
+empir comparison	2
+empir evalu	2
+empt proc	1
+en to en del bound	1
+enabl	1
+encapsl	6
+encod	2
+enh job shop schedl	1
+ensembl	1
+ent relationship model	1
+entailm	2
+enterpr integr	1
+entrop	1
+entrop estim	1
+envisionm	1
+eoeect tac funct	1
+epipol geometer	1
+ergod	1
+error	2
+error an	1
+error correct cod	2
+error diagn	1
+error diffus	2
+es hazard	1
+esterel	1
+estim	1
+ethernet	1
+euclidean spac	1
+euler cycl	1
+evalu	4
+evalu framework	1
+evalu funct	2
+event ba sem	1
+event calculus	1
+event interact graph	1
+evid propag	1
+evolut	1
+evolut algebr	1
+evolut algorithm	3
+evolut comput	2
+evolut design	1
+evolut fit forml	1
+evolut mathemat forml	1
+evolut robot	1
+evolut system	1
+evolut tr	1
+evolut train	1
+exampl	1
+except handl	1
+exchang variabl	1
+execut asser	2
+execut model	1
+execut of funct	1
+expan button	1
+expect ba reason	1
+expect maxim	2
+exper opin	1
+exper system	7
+exper with atm network	2
+experim	1
+experim an	2
+experim construc	1
+experim evalu	2
+experim manag	1
+explan augm	1
+explan ba error report	1
+explan ba learn	1
+explan ba method	1
+explan pattern	1
+explor	2
+expon bound	1
+expon model	1
+expr	1
+ext	2
+ext bay an	1
+ext datab	1
+ext low hierarch	1
+ext object orient techniqu	1
+ext oper system	1
+ext theor	2
+ext to log program	1
+ext transact	1
+ext transact model	2
+extern clock synchron	1
+extern dynam k dim rang search	1
+extract	1
+extrem se	3
+extrem se qu	1
+f bound polymorph	1
+fac	1
+facil	1
+facil loc	1
+fact	2
+fact an	1
+fact experim	1
+failur	1
+failur recov	4
+fair	5
+fair queu	4
+faith subconstitu	1
+fal shar	1
+fam competit	1
+fast four transform	1
+fast matr search	1
+fast retract of evid	1
+fast select inv	1
+fault	1
+fault ba test	1
+fault cover	1
+fault detect	1
+fault diagn	1
+fault edg	1
+fault loc	1
+fault recov	1
+fault toler	27
+fault toler architectur	1
+fault toler distribut realtim system	1
+fault toler map	1
+faulttoler	2
+fd	2
+fe subsystem	2
+featur ba model	1
+featur ba repr	1
+featur comparison	1
+featur constraint	1
+featur extract	2
+featur interv	1
+featur partit	1
+featur project	1
+featur recognit	2
+featur select	1
+feder datab	1
+feedfor network	1
+feedfor neur network	2
+fem mesh	1
+fft	2
+fgmr	1
+fibr	1
+fibr channel	1
+fic point iter	2
+fic point sem	1
+fictit domain method	1
+field program gat ar	3
+fil acc pattern	1
+fil integr	1
+fil memor map	1
+fil reduc order	3
+fil system	2
+filter	1
+fin grain parallel	1
+fin ind	1
+finac trad strateg	1
+fingerprint an	1
+finit approxim	2
+finit differ method	1
+finit domain	1
+finit el	3
+finit el grid	1
+finit el method	2
+finit horizon	1
+finit problem	1
+finit resolut	2
+finit st autom	1
+finit st mach	2
+finit wordlength	2
+fir	1
+fir rl	1
+first order learn	1
+first order sem	1
+fish view	1
+fixpoint sem	1
+fl abstract	2
+fl indep	1
+fl repl	1
+fl text inform retrief system	1
+flat spot elim	1
+flatl	1
+flec restructur	1
+flec shar	1
+floatingpoint arithm	1
+flock	1
+floorplan	1
+flow an	1
+flow control	2
+flow field an	1
+flow shop	1
+flow tabl	1
+fluid flow problem	1
+fluid flow queu	1
+flush lock	1
+flush rl	2
+fm format	1
+footb pool problem	2
+for	2
+for and prefetch	1
+for error correct	2
+for model	2
+for recov	1
+forecast	1
+forg	1
+fork algebr	1
+form	1
+form design	1
+form design repr	1
+form developm environm	1
+form fact	1
+form langu	3
+form method	17
+form model	1
+form model of distribut trust manag	1
+form sem	6
+form softwar engineer techniqu	2
+form specif	7
+form specif langu	1
+form techn review	1
+form techniqu for verif	1
+form verif	4
+forml as typ	2
+fortran loop parallel	1
+fortran s	1
+fourth moment	1
+fpg	1
+fract	3
+fract cod	1
+fract se cover	1
+fragm problem	1
+framework	1
+frequ alloc	1
+funct approxim	1
+funct equ	1
+funct graph	1
+funct langu	4
+funct learn	1
+funct log langu	1
+funct par	1
+funct program	6
+funct repr	1
+funct spac	1
+funct unif grammar	2
+fundam cycl	1
+fuzz art	1
+fuzz artmap	2
+fuzz constraint satisf problem	1
+fuzz multipl criter optim	1
+fuzz neur network	1
+fuzz scenar	1
+fuzz schedl	1
+fuzz se	1
+fuzz system	1
+ga hard	1
+gabriel graph	1
+gain	1
+gal connect	2
+gam	2
+gam oper	2
+gam theor	1
+gam tr search	1
+gap bridg	1
+garb collect	2
+garb collect mark and sweep	1
+garm manufactur	1
+gather	1
+gaug field	1
+gaus distribut	2
+gaus elim	3
+gaus markov random field	2
+gaus newt method	1
+gaus proc	2
+gener	5
+gener appl	1
+gener architectur	1
+gener compon	1
+gener convec	1
+gener fibonacc number	2
+gener funct	7
+gener grad	1
+gener kolmogorov complec	1
+gener log program	1
+gener order sort algebr	1
+gener perform	2
+gener rat monot schedl	1
+gener rel	1
+gener serv	1
+gener sort	3
+gener spar	1
+gener task	2
+genet algorithm	12
+genet network	1
+genvoc	2
+geograph inform system	2
+geometer	2
+geometer con	1
+geometer constraint	2
+geometer hash	1
+geometer invar	1
+geometer mean	1
+geometer model	2
+geometer modeler	1
+geometer optim	3
+geometer parameter	1
+geometer reason	1
+geometer repr	1
+geometer shap	1
+geon	1
+gi	1
+gib sampl	1
+gib sampler	1
+glob addr spac	1
+glob checkpoint	1
+glob commun	1
+glob il	1
+glob optim	2
+glob reduc	2
+glob snapshot collect	1
+glob st	1
+glob tun	3
+glob zer search	1
+globin	1
+glyph	1
+glyph gener	1
+gmr	1
+gmresr	1
+godel	1
+gol sequ	1
+gossip	2
+got usag	1
+gr cod	1
+grad	1
+grad desc	1
+grad desc train	3
+grad train	1
+grammar	3
+grammar classif	1
+grammar theor	1
+grammat infer	5
+granl	2
+granl of control	1
+graph	5
+graph algorithm	5
+graph assoc model	1
+graph bisect	1
+graph browser	1
+graph chain model	1
+graph color	2
+graph datab	1
+graph interfac	3
+graph model	2
+graph partit	5
+graph problem	1
+graph qu langu	1
+graph rewrit	1
+graph theor	4
+graph user interfac	1
+graph user interfac for model specif	1
+graph visu	1
+graphlog visu qu langu	1
+graphpartit	1
+great delug algorithm	1
+greed	2
+greed algorithm	3
+greed inser	1
+grid	2
+grid point	1
+gridcel acceler	1
+ground an	1
+group commun	2
+group membership	1
+group orient cryptograph	1
+group siz	1
+group support system	1
+group work	1
+groupwar	1
+grow autom	1
+growth	1
+guaranteed perform	2
+guid siml	1
+haar	1
+hadamard matr	2
+hal method	2
+half and half cach	2
+half norm plot	1
+halft	1
+hamilt	1
+hamilt path	1
+hamilt system	1
+handoff	1
+handshak	1
+handwrit text recognit	1
+hard funct	2
+hard mach	1
+hardwar descript langu	1
+hardwar mechan	1
+hardwar perform monit	1
+hardwar support	1
+hardwar verif	2
+hash	3
+hazard fr synth	1
+hc	1
+he	1
+heap	1
+heapsort	1
+heart	1
+heart rat var	1
+heat transfer	1
+heb learn	2
+heldkarp bound	1
+hemodynam	1
+heter cod	1
+heter computer system	2
+heter datab	1
+heter network of workst	2
+heter parallel system	2
+heter proc	2
+heter system	2
+heur	4
+heur algorithm	1
+heur search	4
+hid markov model	7
+hierarch architectur	5
+hierarch bus	2
+hierarch cluster	2
+hierarch interconnect	1
+hierarch model	1
+hierarch nbod method	1
+hierarch network	2
+hierarch organ	1
+hierarch rel multicast	1
+hierarch ring ba network	1
+hierarch system	4
+high avail	1
+high dat rat i o	1
+high level design tool design verif	1
+high level net	2
+high level petr net	2
+high level synth	1
+high order	1
+high order featur	1
+high order log	1
+high order proc calcl	1
+high order program	1
+high order unif	1
+high perform	1
+high perform comput	3
+high perform fortran	1
+high perform parallel interfac	1
+high perform st system	2
+high speed i o	1
+high speed interconnect	1
+high speed loc ar network	1
+high speed network	2
+high speed sampl	2
+hil climb heur	1
+hilber curv	1
+hip	1
+hippocampus	1
+hist datab	1
+hlpn	1
+hm	1
+hnow	2
+hoar log	4
+homolog	1
+host interfac	1
+host parasit co evolut	1
+hot lock	1
+hot potat	1
+hot potat worm hol rout	1
+hot spot	1
+hot spot traff	3
+hough transform	1
+hpf	1
+human computer interfac	2
+hy system	1
+hybrid	2
+hybrid acc cach	1
+hybrid acc cach framework	1
+hybrid an techniqu	1
+hybrid architectur	1
+hybrid fault model	1
+hybrid log	1
+hybrid system	3
+hyper markov	1
+hypercub	8
+hypercub multiproc	1
+hyperdoctr	1
+hypergraph	1
+hypergraph and appl	1
+hyperlink	1
+hyperm	2
+hyperm system	1
+hypertext	3
+hypertext constraint	1
+hypertext hyperm	1
+i o	1
+i o perform optim	1
+i o subsystem	1
+i18n	1
+icon	1
+id	1
+identif	1
+identif in th lim	2
+idl workst	1
+il grad	1
+imag an	1
+imag compr	3
+imag dat compr	1
+imag datab	2
+imag datab and st	1
+imag distort	1
+imag enhanc	1
+imag ind	1
+imag print	1
+imag proc	9
+imag segm	1
+imag sequ an	3
+imag sign	1
+imag threshold	1
+imag til	1
+imp result	1
+impact	1
+imper program	3
+impl	1
+implem	8
+implem design	1
+implem issu	1
+implem of log program langu	1
+implem techniqu	1
+implicit repr	1
+import sampl	2
+import scal	1
+imprec and uncertain inform	1
+in constraint	1
+inc	1
+incent compat	1
+inclus and parameter polymorph	2
+incompl dat model	1
+incompl dat structur	1
+incompl inform	3
+increm comput	1
+increm learn	2
+increm par	1
+increm scal	1
+increm schedl	1
+increm upd	1
+increm view maint	2
+ind	5
+ind cod	1
+ind computer sc	1
+ind learn	2
+ind rl	1
+ind strateg	1
+indefinit dat	1
+indep of caus influ	1
+induc	2
+induc bi	1
+induc definit	1
+induc infer	2
+induc learn	6
+induc log program	2
+industr pract	1
+inequ	1
+infer	2
+infer algorithm	1
+infer network	1
+infer rl	1
+infer structur	1
+infinit horizon	1
+infinit list	1
+infinit lookahead	1
+influ diagram	2
+inform	1
+inform compr	1
+inform disper algorithm	1
+inform flow	1
+inform hid	4
+inform model	1
+inform retrief	5
+inform st and retrief	1
+inform system	1
+inform technolog	1
+inform theor	5
+inform theor entrop	1
+inform visu	2
+inherit	9
+inherit network	1
+inhibit interneuron	1
+init	1
+init weight	1
+inner produc spac	1
+input buffer	1
+input constrain channel	1
+input dev	2
+input output	1
+input output architectur	1
+input output rel	1
+inscript	1
+inspect execut	1
+inst	1
+inst ba learn	1
+inst reduc	1
+inst var	1
+instruc cach direct map	1
+instruc level parallel	3
+instruc principl	1
+int car unit	1
+integer program	1
+integer sequ	1
+integer sort	4
+integr	1
+integr architectur	1
+integr circuit	1
+integr constraint	1
+integr design and developmentsystem	1
+integr serv network	2
+integr with pat dat manag system	1
+intel paragon supercomputer	1
+intellig	1
+intellig agent	2
+intellig monit and control	1
+intellig softwar agent	1
+intellig tut system	2
+intellig user interfac	1
+inter domain rout	2
+inter nterpr network	1
+inter organ system	1
+inter proc commun	2
+inter qu parallel	1
+inter stream and intr stream synchron	1
+inter task level tempor loc	1
+interact	2
+interact con	1
+interact docum	1
+interact graph	1
+interact techniqu	3
+interchang	1
+interconnect network	20
+interest	1
+interfac	1
+interfac builder	2
+interfac extract	1
+interfac metaphor	1
+interfer	3
+interior point algorithm	1
+interior point method	4
+intern	1
+intern sc	1
+intern scan	1
+internet	5
+internet appl	1
+internet ba serv	1
+internet protocol	1
+internetwork	1
+interoper petr net	3
+interpol	4
+interpol markov model	1
+interproc commun	7
+interprocedur	2
+interv algebr	1
+interv infer	1
+interv method	1
+interv order	1
+intract problem	1
+intranet appl	1
+introduc	1
+introspect	1
+introspect learn	1
+intuit log	4
+invar	4
+invar of evolut	1
+inver fil	1
+inver model	2
+inver problem	1
+inver scatter	1
+ip atm network	1
+ip masquerad	1
+ipn	3
+iq	1
+ir imag	1
+irregl network	2
+irregl parallel	1
+is	2
+is protocol level 1	1
+isosurfac	1
+isotop	1
+iter funct	1
+iter method	1
+iter solver	1
+jankowitz algorithm	1
+jitter control	1
+job migr	1
+job shop	1
+job shop schedl	1
+join	2
+join graph	1
+join proc	1
+join siz	1
+join tr	1
+joindistribut lat	1
+joint photograph exper group	1
+jonsson tarsk du	1
+jpeg	2
+junct detect	1
+junct tr	5
+k ary n cub	15
+k ary n cub interconnect	1
+k center problem	1
+k closur	1
+k mean algorithm	1
+k regl	1
+k wi indep	1
+kalman filter	1
+kautz digraph	1
+ke system	1
+kernighan lin heur	2
+kernighanlin heur	1
+key distribut protocol	1
+key escrow	1
+key fram select	1
+kheper	1
+kinem autom	1
+kitlog	1
+knowledg acquisit	3
+knowledg ba percept	1
+knowledg ba system	5
+knowledg discov	1
+knowledg engineer methodolog	1
+knowledg extract	1
+knowledg int learn	1
+knowledg repr	7
+knowledg shar	1
+knowledgeb schedl	1
+kolmogorov complec	1
+kolmogorovsmirnov test	1
+kripk sem	1
+krylov subspac method	1
+l ba	1
+l system and visu program langu	1
+label deduc system	1
+label strateg	1
+label transit	2
+lagrang	1
+lamark	1
+lambd calculus	4
+lambek calculus	1
+lamber reflect map	1
+lamport hap befor rel	1
+lancz algorithm	1
+land cover chang siml	1
+langu	1
+langu construc and featur	1
+langu design	1
+langu grammar	1
+langu model	1
+laplac of gaus	1
+larch	1
+larg dev principl	1
+larg rn model	1
+larg scal encapsl	1
+larg scal parallel system	1
+laser printer	1
+lat bind	2
+lat theor	1
+latch	3
+latent variabl	1
+law govern architectur	1
+laz compil	1
+laz evalu	1
+laz induc	1
+laz langu	1
+laz learn	5
+ldlf	2
+leader elect	1
+leak buck	1
+lean produc of inform	1
+leap secon	1
+learn	3
+learn from exampl	1
+learn rat	1
+learner model	2
+least commitm learn	5
+least privileg	2
+least squar estim	1
+least squar problem	1
+lec ambigu	1
+lec funct grammar	1
+lec tag	1
+left ventricl	1
+leg	1
+legendr	1
+level of detail	2
+levenshtein dist	1
+lexicograph order	1
+lexicon	1
+li algebr	1
+libr	1
+lif span strateg	1
+light wavefront	1
+lim an	1
+lim optim	1
+lim resourc	1
+lin	4
+lin complec	1
+lin discrim	1
+lin graph	1
+lin imag	1
+lin log	5
+lin matr inequ for robust st	1
+lin ph filter	1
+lin program	11
+lin program approach	1
+lin quadr control	1
+lin quadr regl	2
+lin recur	1
+lin rel	2
+lin schedl	1
+lin subscript	1
+lin sum symmeter scal	1
+lin system	1
+lin tim algorithm	1
+lin transform	2
+lind	1
+lindenbaum algebr	2
+link	1
+link cont	3
+lisp	3
+list	1
+list compreh	1
+list proc	1
+list schedl	2
+liter program	1
+liv and tim proper	1
+liv vid	2
+lm	1
+lo	5
+lo coupl system	2
+lo network	1
+lo transm lin	1
+load	1
+load bal	17
+load imb	1
+load ind	1
+load profil	1
+load profil versus load bal	1
+load shar	3
+loc	4
+loc an	1
+loc ar network	3
+loc comput	2
+loc control	1
+loc dec algorithm	1
+loc manag	1
+loc minim	1
+loc optim	1
+loc preempt	1
+loc propag	4
+loc random	1
+loc search	4
+loc system	1
+loc tun	3
+loc weight regr	5
+lock	2
+lock fr	2
+lock granl	1
+locomot	1
+log	2
+log and mathemat model for ai	1
+log defin	1
+log framework	1
+log manag	1
+log modl	1
+log of program	1
+log program	24
+log rel	1
+log siml	1
+log structur	1
+log synth	1
+log test	1
+log variabl	1
+long rang dep	2
+long tail distribut	1
+long term dep	3
+long term proc	1
+lookahead	2
+loop nest	1
+loop transform	3
+loop unrol	1
+lot	1
+lotus not	1
+low diameter	1
+low energ	1
+low power	1
+low sensit	2
+lower bound	5
+lqr	2
+lu	2
+lu decomposit	1
+lwr	5
+lyapunov funct	1
+m g 1 queu	1
+ma parallel	1
+ma parallel architectur	1
+ma parallel mach	2
+ma parallel proc	2
+ma parallel program methodolog	1
+ma parallel system	1
+ma st system	2
+mac	1
+mac character	1
+mac cliqu	1
+mac flow min cut problem	1
+mac ind sethard problem	1
+mach learn	17
+mach oper system	1
+mach organ	1
+mach transl	1
+mack gl	1
+macr dataflow	1
+macr expan	1
+macromodel	3
+macromolecl	1
+macromolecl shap	1
+main memor datab	2
+makespan	3
+makespan minim	1
+man sort log	2
+man to man commun	1
+man valu log	1
+manag inform datab	1
+manag object	1
+manchester format	1
+mand acc control	1
+manufactur dat	1
+manufactur datab	1
+manufactur plan	1
+map	4
+map optm	2
+margin indep graph	1
+markov chain	3
+markov dec problem	1
+markov dec proc	2
+markov model	2
+markov modl proc	1
+markov network	1
+markov proc	1
+markup	1
+marquardt method	1
+martin l of test	1
+marzl funct	1
+mask	1
+master equ	1
+masterslav	1
+match	6
+match track	1
+match track anom	1
+match under aff transform	1
+mathemat	1
+mathemat found	2
+mathemat program	1
+mathemat specif	1
+matr an	1
+matr bal	1
+matr multipl	2
+matr pr condit	1
+maxim a posterior	1
+maxim eigenvalu	1
+maxim entrop	1
+maxim fic point solut	2
+maxim flow	1
+maxim lik	1
+maxmim aggreg network throughput	1
+mceliec cryptosystem	1
+mdl	1
+me combin	1
+me environm	1
+me learn	1
+me log	1
+me object	1
+me over al path solut	2
+me overhead	2
+me pa	6
+me pa libr	1
+me pa multicomputer	1
+me pa multiproc system	1
+me pa parallel program	1
+me parallel	3
+me prior	1
+me reason	1
+me sequ chart	1
+mean valu dur calculus	1
+measur	1
+measur feedback	2
+measur system	1
+med	2
+med ac	1
+med acc protocol	1
+med diagn	1
+med filter	1
+med find	1
+med imag	3
+med recov	1
+med select	1
+med spac	1
+meixner polynom	1
+melod rec	1
+membership funct	1
+memor	3
+memor alloc	1
+memor ba learn	4
+memor bank	1
+memor coh protocol	2
+memor con condit	1
+memor design	1
+memor disambigu	1
+memor hierarch	2
+memor lat hid	1
+memor manag	3
+memor manag unit	3
+memor map	1
+memor map fil	1
+memor perform	1
+memor system	2
+memor system perform	1
+memoryb learn	3
+memorymap datab	1
+memoryver	1
+merg	2
+mesh	17
+mesh architectur	2
+mesh connect	1
+mesh connect architectur	2
+mesh connect proc ar	1
+mesh interconnect	1
+mesh simplif	1
+mesh with multipl broadcast	1
+mesh with row broadcast	1
+metad manag	1
+metalevel theor	2
+metaphor	1
+metaphor compreh	1
+metaprogram	1
+metareason	1
+metatheor reason	1
+meter	2
+meter learn	1
+meter spac	1
+method	3
+method integr	1
+method schem	1
+methodolog	1
+mi dat	1
+mic cod	2
+mic expon funct	1
+micr kernel	1
+micr kernel init port	1
+microcommun	1
+microenvironm	1
+microproc	1
+migr path to technolog adv	1
+min domin se hard problem	1
+minim achief util	1
+minim congest	1
+minim degr order	1
+minim degr span tr	1
+minim degr span tr problem	1
+minim descript length	3
+minim i map	1
+minim length encod	1
+minim span tr	4
+minim weight codeword	1
+minim weight tw connect steiner subgraph	1
+minimac problem	1
+minimac search	1
+minkowsk sum	1
+mirror	1
+ml	2
+mlp	2
+mm5	1
+mob heur	1
+mobil agent	1
+mobil commun	1
+mobil comput	7
+mobil comput system	1
+mobil network	1
+mobil phon	1
+mobil robot	1
+mobil system	1
+mod	2
+mod an	2
+mod dep	2
+mod log	3
+mod theorem prov	1
+model	8
+model agent	1
+model ba design	1
+model ba eason	1
+model ba learn	1
+model check	4
+model elim	1
+model methodolog	1
+model methodolog parallel and distribut siml	1
+model of motiv	1
+model of prefer	1
+model of problem solut	1
+model phy	1
+model search	2
+model select	3
+model theor	1
+modelb learn	1
+modif floyd steinberg algorithm	1
+modl	8
+modl interconnect	1
+modl interconnect langu	1
+modl program	1
+modl system	1
+molecl biolog	1
+molecl graph	1
+molecl model	1
+momentum	1
+monit	1
+monocl vi	1
+mont carl	2
+mont carl siml	2
+mor funct	1
+most prob configur	1
+most vit edg problem	2
+mot	1
+mot an and multifram ster	1
+mot detect	1
+mot plan	2
+mot understand	1
+motor schem ba navig	1
+mov compr	1
+mov object	1
+mov pictur exper group	1
+mp	1
+mpeg	6
+mpegvbr vid transm	1
+mst tr	1
+mt	1
+mtd	1
+mu calculus	1
+mud	1
+mult	1
+mult agent system	1
+mult dim log	1
+mult dim schedl	1
+mult dim search	1
+mult interconnect network	3
+mult layer flow	1
+mult level transact	3
+mult lingu	1
+mult med	1
+mult method	1
+mult network	1
+mult resolut model and match	1
+mult rewrit	1
+mult scal an	1
+mult step compact	1
+mult step method	1
+mult temper an	1
+mult thread environm	1
+mult view integr	1
+mult way constraint	3
+multicast	22
+multicast algorithm	2
+multicast switch design	1
+multicommod flow	1
+multicomputer	2
+multidest me pa	2
+multidest mechan	6
+multidim 2d	1
+multidim bin pack	1
+multidim scal	1
+multidim search	1
+multigranl lock	1
+multigrid	1
+multihop lightwav network	1
+multilayer neur network	2
+multilayer perceptron	1
+multilayer perceptron train	1
+multilevel cach	2
+multilevel memor	1
+multilevel partit method	5
+multilevel secur	1
+multim	16
+multim appl	2
+multim author	1
+multim commun	1
+multim comput	1
+multim datab	1
+multim datab system	1
+multim integr	1
+multim multicast	3
+multimethod	4
+multimod interact	1
+multimod interfac	2
+multipl alignm	4
+multipl bus system	1
+multipl classif	1
+multipl model	1
+multipl pattern	1
+multipl reader multipl writer protocol	1
+multipl sequ alignm	1
+multipl view	1
+multipol algorithm	1
+multiport compon	1
+multiport interconnect nod	1
+multiproc	14
+multiproc cach	1
+multiproc fil system	1
+multiproc memor sytem	1
+multiproc oper system	1
+multiproc sol model	1
+multiproc system design	1
+multiprogram	1
+multiresolut	1
+multiresolut model	1
+multisc	1
+multisc model	1
+multistrateg learn	2
+multistrateg reason	1
+multitask	1
+multithread	1
+multithread architectur	2
+multithread comput	1
+multithread proc	1
+multitoler	2
+multityp condit	1
+multiuser detect	1
+multivar	1
+multivar lin problem	1
+multivar norm prior	1
+multivar prob distribut	2
+multiver dat	1
+mus retrief	1
+mut an	1
+mut object st	2
+mut test	1
+mutu exclus	3
+mutu inform	1
+myocard perfus	1
+n bod siml	1
+nam overload	1
+nam system	1
+narx network	3
+natur deduc	2
+natur langu gener	2
+natur langu interfac	1
+natur langu proc	8
+navig	1
+navig plan	1
+nbod siml	1
+near near test se	1
+near test se	1
+nearest neighbor	3
+nearest neighbor classif	1
+necklac	1
+nectar	1
+neg	4
+neg inform	2
+neighbor fram sem	1
+neon	1
+nest loop	1
+nest transact	1
+net theor	2
+network	3
+network acc protocol	1
+network algorithm	1
+network block prob	1
+network ccount	1
+network clock synchron	1
+network cont	1
+network design	1
+network dim	1
+network flow algorithm	1
+network gam	1
+network interfac	2
+network interfac support	2
+network manag	2
+network multiplexer	1
+network of workst	10
+network optim	2
+network perform comparison	1
+network protocol	2
+network reduc	1
+network resourc discov system	1
+network siz	1
+network tim protocol	1
+neur architectur	1
+neur comput	2
+neur multigrid	1
+neur network	21
+neur network init	1
+neurocomput	1
+newborn inf	1
+newt	1
+newt method	2
+no	4
+no reduc	2
+nod cont	1
+nod split	2
+nogood record	1
+non block	2
+non cramer typ condit	1
+non determ	2
+non determin sem	1
+non herbrand model	1
+non horn log program	1
+non increm learn	1
+non iter log	1
+non lin least squar fit	1
+non monot reason	3
+non norm mod log	1
+non st glob pr	1
+non standard qu answer	1
+non symmeter lin system	1
+non uniform complec	1
+non volatil ram	1
+nonblock network	1
+noncoh shar memor	1
+nondeterm	3
+nondetermin finit autom	1
+noninteract control	2
+nonlin control system	2
+nonlin driver	1
+nonlin dynam system	1
+nonlin least squar estim	1
+nonlin perform	1
+nonlin princip compon an	1
+nonlin system	2
+nonmask	1
+nonmask fault toler	1
+nonmonot	3
+nonmonot log	2
+nonmonot mod log	1
+nonmonot reason	4
+nonneg matr	1
+nonsingl transform	2
+nonsmooth optim	1
+nonuniform markov model	1
+norm of residu	1
+norm program	1
+notif	1
+novel appl	1
+now	2
+np	1
+np compl	7
+np compl problem	2
+np pb compl problem	2
+number partit	2
+numer cod	2
+numer lin algebr	2
+numer robust	2
+nv	1
+object	6
+object ba program	1
+object calculus	2
+object composit	1
+object descript	1
+object ident	1
+object lif cycl	1
+object model	2
+object model interfac	1
+object or	5
+object orient	6
+object orient appl framework	1
+object orient datab	9
+object orient design	2
+object orient design and program	1
+object orient framework	1
+object orient implem	1
+object orient langu	1
+object orient log program	2
+object orient method	1
+object orient model	1
+object orient model specif	1
+object orient oper system	1
+object orient program	7
+object orient program and design	3
+object orient program langu	4
+object orient softwar developm	2
+object orient softwar engineer	2
+object orient system	2
+object orient view	1
+object program	1
+object program langu	1
+object recognit	4
+object server	1
+object sl paradigm	1
+object spac partit	1
+object structur	1
+object z	3
+observ	2
+observ equiv	1
+obstacl	1
+occam	1
+occam razor	2
+occlus contour	1
+occur check	1
+ocr	1
+ocr error correct	1
+octr	2
+oj rl	2
+omnidirect multibasel ster	1
+on chip cach	1
+on lin	1
+on lin algorithm	3
+on lin audit of fin system	1
+on lin learn	1
+on lin steiner problem	1
+on way constraint system	1
+on way funct	2
+onl algorithm	1
+ontolog	3
+open distribut proc	1
+open ed	1
+open en act	1
+open shop	1
+open system	2
+oper sem	7
+oper system	5
+oper system recov support	1
+oper system support	1
+oper system support for datab system	1
+opt character recognit	1
+opt implem	1
+opt interconnect	2
+opt network	1
+opt ring interconnect	1
+opt wdm network	1
+optim	11
+optim algorithm	2
+optim alloc	1
+optim and robust mot estim	1
+optim control	1
+optim filter	1
+optim gener	1
+optim protocol	3
+optim recov	1
+optim techniqu	1
+optim util	1
+or parallel	1
+or sommerfeld equ	1
+order	2
+order abstract hierarch	1
+order dither	1
+order sort log	1
+organ comput	1
+orient particl	1
+orthogon polynom	1
+ortholat	1
+osf motif	1
+output	1
+output dep	2
+output sensit algorithm	1
+overfit av	1
+overlap scan	1
+ownership right	1
+oxyg clean	1
+p bi immun se	1
+p multiselect se	1
+p select se	2
+pac learn	3
+pack	6
+pack constraint	3
+pack rout	1
+pack schedl	3
+pack switch internetwork	1
+pack vid	1
+pad approxim	1
+padrt	1
+pag acc schedl	1
+pag acc sequ	1
+pag flush hint	1
+pag flush rl	1
+pag perform model	1
+paleontolog	1
+pandemon	2
+paper mak	1
+par	4
+paracon log	1
+parallel	8
+parallel algorithm	28
+parallel and distribut dat min	1
+parallel and distribut siml	1
+parallel and distribut system	1
+parallel and regl rewrit	1
+parallel architectur	15
+parallel combin optim algorithm	1
+parallel compiler	5
+parallel comput	11
+parallel computer	1
+parallel computer architectur	5
+parallel dat ba	2
+parallel dat min	1
+parallel datab	1
+parallel ga	1
+parallel genet algorithm	1
+parallel graph algorithm	1
+parallel graph partit	2
+parallel hardwar	1
+parallel i o	3
+parallel implem	2
+parallel iter method	3
+parallel langu	1
+parallel lisp	1
+parallel measur	1
+parallel merg sort	1
+parallel model of comput	1
+parallel network	2
+parallel perform	6
+parallel prior queu	1
+parallel proc	29
+parallel progr rad	1
+parallel program	7
+parallel program langu	1
+parallel program meter	1
+parallel program perform	1
+parallel program perform evalu	1
+parallel program tool	1
+parallel qu execut plan	1
+parallel qu optim	1
+parallel render	1
+parallel rewrit	1
+parallel schedl	2
+parallel schedl algorithm	1
+parallel search	1
+parallel siml	1
+parallel siml an	1
+parallel siml langu	1
+parallel spar matr algorithm	3
+parallel task execut	1
+parallel test	1
+parallel tr split	1
+parallel virtu mach	1
+parameter	3
+parameter an	1
+parameter arbitr	2
+parameter constraint	2
+parameter estim	1
+parameter greed	2
+parameter model	1
+parameter spac	1
+parameter theorem	1
+parenter nutrit	1
+parser gener	1
+parsimon cover	1
+part	1
+part answer	1
+part ba descript	1
+part dat model	1
+part deduc	1
+part evalu	2
+part feeder	1
+part funct	1
+part inform	1
+part lin digraph	1
+part observ markov dec proc	2
+part order	2
+part order reduc	1
+part order sem	1
+part order tempor log	1
+part order with equ	2
+part orient	1
+part se cover	1
+part transl	1
+particip constraint	1
+particl system	1
+partit	4
+partit capabil	1
+path ba rout	17
+path ba schem	1
+path condit	1
+path del fault test	1
+path find	1
+path quer	1
+path repl	1
+pattern	3
+pattern an	1
+pattern classif	1
+pattern discov	1
+pattern extract	1
+pattern match	1
+pattern recognit	3
+pcf	1
+pcn	1
+pd protocol	1
+pebbl	1
+pedigr an	1
+pen comput	1
+pen least squar	1
+per	3
+per st	1
+percept act cycl	1
+percept task	1
+perceptu group	1
+perceptu infer	1
+percol theor	1
+perfect model	1
+perfect secrec	1
+perform	5
+perform an	7
+perform bound	1
+perform evalu	28
+perform goal	1
+perform improv	1
+perform measur	2
+perform model	6
+perform model techniqu	1
+perform rat	1
+perform tun	1
+period riccat equ	1
+period schur decomposit	1
+period task	1
+permut	2
+permut cod	1
+permut group	1
+permut warp	1
+person commun	3
+person commun serv	1
+petr net	6
+petr net compon	1
+petr system	1
+pfair schedl	1
+ph cod	1
+phantom	1
+philosoph	1
+philosoph found	1
+philosoph of sc	1
+phonem cl	1
+phy ba model	2
+phy ba siml	2
+phy ba vi	1
+phy structur	1
+pick theorem	1
+pinout constraint	2
+pinout technolog	1
+pinwheel schedl	1
+pip lin	1
+pipel proc	1
+plac	3
+plac cel	1
+plag	1
+plan	3
+plan and reason about act	2
+plan and reason about act and chang	1
+plan recognit	1
+plan sweep	1
+plan under uncertaint	3
+plan us	2
+planar graph	1
+planar subgraph	1
+plast	1
+plast surg	1
+platform	1
+playback debug	1
+pnp problem	1
+point algebr	1
+point charg conogur	1
+point loc algorithm	1
+point separ	1
+point to point commun	1
+pol tr	1
+polygon cover	1
+polyhedr	4
+polyhedr reduc dep graph	1
+polymorph	4
+polymorph lambd calculus	1
+polymorph typ	2
+polymorph typ system	1
+polynom	1
+polynom constraint	1
+polynom den	1
+polynom tim approxim algorithm	1
+polynom tim solut	1
+polyvar	1
+popl funct of langu	1
+popl siz	1
+popl vect	1
+port commun	1
+port softwar	1
+portfol	1
+posit boolean funct	1
+posterior em algorithm	1
+postoptim an	1
+pot energ minim	1
+pot flow	1
+power dissip an	1
+pr transformer	2
+pram	5
+prec an	1
+prec constraint	4
+precondit	1
+predict	1
+preempt schedl	1
+prefer	2
+prefetch	1
+prem	1
+preproc	1
+preproc dat	1
+prescript an	1
+presegm handwrit digit recognit	1
+presupposit	1
+prim backup	3
+prim dual method	1
+prim subconstitu	1
+princip compon an	2
+princip curv	1
+princip surfac	1
+principl of equ sacrioc	1
+principl of parallel proc	1
+prior	4
+prior assignm	1
+prior inform	1
+prior knowledg	1
+prior queu	1
+priv	3
+priv amplif	1
+priv lock	1
+privat	1
+privileg graph	1
+proact vs	1
+prob	6
+prob asymptot	1
+prob distribut	1
+prob propag	2
+probabil	1
+probabil comput	1
+probabil exper system	3
+probabil iter match	1
+probabil loop	1
+probabil network	1
+probabil retrief	1
+probabil val	1
+problem character	2
+problem complec	1
+problem hierarch	1
+problem of develop countr	1
+problem solut	4
+proc algebr	6
+proc alloc	2
+proc and channel failur and repair	1
+proc ar	1
+proc assignm of irregl object	1
+proc control system	1
+proc descript	1
+proc farm	2
+proc mesh	1
+proc migr	1
+proc model	2
+proc monit	1
+proc orient siml	1
+proc repl	1
+proc support	1
+procedur	1
+procedur cal	1
+procedur interfac	1
+produc form	1
+produc rl	1
+produc system	1
+profil	5
+progr refin	1
+progr transm	1
+program	2
+program an	3
+program an and optim	2
+program composit	1
+program compreh	1
+program correct	4
+program dep graph	3
+program deriv	2
+program design and verif	1
+program developm	4
+program environm	4
+program equiv	1
+program evolut	1
+program famil	1
+program langu	9
+program langu sem	1
+program log	1
+program model	1
+program parallel	1
+program partit	2
+program profil	1
+program re engineer	1
+program refin	1
+program restructur	2
+program schem	3
+program sl	3
+program smooth	1
+program specif	1
+program styl	2
+program synth	2
+program tool	1
+program transform	6
+program understand	1
+program verif	2
+program visu	5
+project	4
+project invar	1
+project reconstruc	1
+prolog	4
+prolog mach	1
+pronunc recognit	1
+proof checker	1
+proof methodolog	1
+proof net	2
+proof number search	1
+proof of ident	1
+proof of term	1
+proof procedur	1
+proof system	4
+proof theor	3
+proof tool	1
+propag algorithm and their implem	1
+propag constraint	2
+proper cover	1
+proper inherit	2
+proposit forml	1
+protect	1
+protect specif	1
+protein conform	1
+protein crystallograph	1
+protein structur an	1
+protein structur predict	1
+protocol	3
+protocol secur	1
+protocol verif	2
+prototyp	1
+prov secur	2
+prun	4
+pseud random gener	2
+pseud random number gener	1
+pseud triangl	1
+pseudocount method	3
+pseudotriangl	1
+publ pol	1
+publ random	1
+pur langu	1
+push	1
+pvm	2
+pyramid	1
+qmf	1
+qu answer	1
+qu by imag cont	1
+qu compil	1
+qu definit lin funct	1
+qu langu	1
+qu newt method	1
+qu of serv	1
+qu of serv guar	1
+qu optim	4
+qu proc	3
+qu tim tradeoff	1
+quadr	1
+quadr assignm problem	1
+quadr matr inequ	2
+qualit spat reason	1
+qualit tempor constraint	1
+qualit vi	1
+quant	1
+quantif elim	2
+quantit an	1
+quantum log	1
+queu	2
+queu theor	1
+queu theor an	1
+quor	1
+quor multicast	1
+quor system	2
+quot	1
+qz algorithm	1
+rad	1
+rad ba funct network	1
+rad mont carl ray trac transport theor turbid med nest model plant canop	1
+rad sort	1
+railw control system	1
+random algorithm	3
+random competit	1
+random encrypt	1
+random number gener	1
+random search	2
+random var	1
+rang lock	1
+rang qu	1
+rang quer	1
+rapid prototyp	1
+raster imag	1
+rat	1
+rat control	1
+rat monot schedl	1
+ray cast	1
+ray trac	5
+rbf neur network	1
+re	2
+re funct	1
+reach an	1
+react control	4
+react system	3
+real	2
+real mach	1
+real tim	8
+real tim commun	4
+real tim commun system	1
+real tim computer system	1
+real tim constraint	1
+real tim datab	3
+real tim datab and inform retrief system	1
+real tim datab system	3
+real tim distribut system	1
+real tim on lin resourc alloc	1
+real tim proper	1
+real tim schedl	1
+real tim serv	1
+real tim specif	1
+real tim system	9
+real tim train	1
+real tim var bit rat traff	1
+realm	2
+realtim siml	1
+realtim system	1
+rearrang multicast algorithm	1
+reason	1
+reason under uncertaint	1
+reason with disjunct	1
+recognit	1
+reconcil	1
+reconfigur	2
+reconfigur architectur	1
+recongur	2
+reconstruc	1
+reconstruc of discontinu	1
+record to record travel	1
+recov	6
+recover per	2
+recover per upd model	1
+recover per virtu memor	2
+recover virtu memor	1
+rectangl	1
+recur	2
+recur algorithm	1
+recur bisect	1
+recur convolut	1
+recur dat structur	1
+recur equ	2
+recur expon model	1
+recur funct definit	1
+recur graph model	1
+recur memor	1
+recur network	1
+recur neur network	9
+recur program	1
+recur program schem	1
+recur quer	1
+recur structur in term typ	1
+redesign	1
+reduc	2
+reduc network	1
+reduc system	1
+reduc uncertaint	1
+redund disk ar	1
+redund synchron elim	1
+reed muller cod	1
+refact	1
+refer architectur	1
+refer count	1
+refin	5
+refin algebr	1
+refin and transform of specif	1
+refin calculus	2
+reflec typ system	2
+reflect	5
+reflect architectur	2
+reflect theor	2
+reg an	1
+reg find	1
+reg grow	1
+register	1
+register renam	1
+regl	2
+regl approxim	1
+regl langu	4
+regl rewrit	1
+regl tr typ	2
+regr test	3
+regr test select	2
+reinforc	1
+reinforc learn	8
+reject	1
+rel	10
+rel algebr	2
+rel calculus	1
+rel datab	2
+rel debug	1
+rel guar specif	1
+rel multicast	1
+rel or	1
+rel specif	1
+rel tim	2
+rel transport	1
+relac	4
+relac oscil	1
+relev assessm	1
+relev featur minim	1
+relev rank	1
+remot execut	2
+remot procedur cal	1
+remot resourc acc	1
+remot sen	2
+render	1
+reorder	1
+repair algorithm	1
+repeat sampl	1
+repl	3
+repl coh	1
+repl control	1
+repl dat	1
+reposit	1
+repr	3
+repr chang	1
+repr langu	1
+repr problem	1
+requir engineer	1
+requir model	1
+requir specif	1
+research and developm	1
+resil	1
+resolut	3
+resolut theorem prov	1
+resourc alloc	3
+resourc bound measur	1
+resourc constrain schedl	1
+resourc constraint	1
+resourc manag	1
+resourc reserv	1
+resourc schedl	1
+resourc shar	1
+resourc us	1
+restrict multicast	1
+restrict or	2
+result	1
+retrief	1
+reus	8
+reus infrastructur	1
+rever engineer	5
+rever execut	1
+rewrit	1
+rh oper	2
+ridg regr	1
+rieman manifold	1
+rigid bod system	1
+ring	2
+ring architectur	1
+risk	1
+rl ba	1
+rl ba specif	1
+rl discov	2
+rl extract	2
+rl induc	2
+rl inser	1
+rl model	1
+rn	1
+rn secon structur	1
+ro	2
+robot	2
+robot control	1
+robot navig	5
+robot project	1
+robust	3
+rol	3
+rol ba protect	3
+rol graph	1
+rollback	1
+rollback recov	1
+root	2
+round	2
+round robin dn	1
+rout	4
+rout algorithm	1
+rout h rel	1
+rout protocol	1
+rout st	2
+router design complec	1
+row proper matr	1
+row reduc matr	1
+rpu	1
+rpvm	1
+rsp	1
+run tim alloc	2
+run tim monit	1
+run tim parallel	1
+run tim support	1
+run tim test	1
+s parameter ba siml	1
+saf	2
+saf and liv proper	1
+saf crit softwar	1
+sampl	1
+sampl sort	1
+sast	1
+sat	1
+satisf	1
+sc dynam	1
+sc interpr	1
+sc understand	1
+scal	6
+scal an	1
+scal parallel proc	3
+scal shar memor multiproc	1
+scal spac	1
+scal synchron primitiv	1
+scal system	2
+scal web server	1
+scatter	3
+scatter parameter	3
+scenar	2
+schedl	19
+schedl graph	1
+schedl theor	1
+schem	2
+schem deriv	3
+schem evolut	3
+schem guid program synth	1
+schem integr	1
+schem transform	1
+schur compl	1
+scientif comput	1
+scientif datab	1
+scientif method	1
+scientif visu	5
+scot continu model	1
+scot domain	1
+scout	1
+sdm	5
+se cover	1
+se del	1
+se inclus	3
+se inser	1
+se multiplec	1
+se partit	1
+search	2
+search algorithm	1
+search eng	1
+secon cr	1
+secon gener exper system	1
+secon memor	1
+secon order sign	1
+secr key agr	2
+secr shar	1
+secur	1
+secur pol	1
+secur specif	1
+segm	2
+segm flec	1
+select	2
+select coord design	1
+select coordin design	1
+select criter	2
+select percept	1
+select retest	3
+select strateg	2
+select upd	1
+self dual funct	1
+self improv	1
+self organ	5
+self refer	1
+self reflect system	1
+self reproduc	1
+self sizing program	1
+self tim design	1
+selfcheck circuit	1
+sem	7
+sem an tableaux	1
+sem and syntact adequ of typ system	2
+sem fe se	1
+sem of program langu	4
+sem qu optim	2
+semaphor	1
+semiconduc manufactur	1
+semiot engeneer	1
+sen ba control	1
+sen fus	1
+sensit an	2
+separ	1
+separ brdf	1
+separ compil	1
+separ of dat	1
+separ of dut	1
+sequ	1
+sequ an	1
+sequ and parallel algorithm	1
+sequ comparison	2
+sequ mach	1
+sequ of vect	1
+sequ pattern	1
+ser parallel graph	1
+ser prot	1
+serp raster	1
+serv manag	1
+server proc	1
+seth	1
+sgml	1
+shadow	1
+shadow pr	1
+shap and object repr	1
+shap featur extract	1
+shap in pictur	1
+shap optim	1
+shap reconstruc	1
+shap transform	1
+shar addr spac architectur	1
+shar an	1
+shar dat	1
+shar disk datab system	1
+shar graph	2
+shar memor	5
+shar memor datab system	2
+shar memor model	1
+shar memor multiproc	10
+shar memor parallel architectur	1
+shar noth architectur	2
+shar noth system	1
+shar virtu memor	3
+shar workspac	1
+sharedmemor multiproc	1
+shift oper	2
+shift setpoint algorithm	2
+shortest path	3
+sigm	1
+sign fil	1
+sign match	2
+sign proc	1
+signalt symbol transform	1
+silhou	1
+simd	2
+simd implem	1
+simd mimd eml	1
+simd program	1
+simil	3
+siml	17
+siml an	6
+siml embod evalu	1
+siml of natur evolut	1
+siml rl	1
+simp typ	1
+simpl complec	1
+simpl inv	1
+simpl polygon	1
+singl level	1
+singl mach	1
+singl mach schedl	2
+singl of perspect project	1
+singl proc perform	1
+singl stat assignm	1
+singl system	2
+singl theor	1
+singl valu decomposit	1
+situ autonom agent	1
+situ calculus	1
+situ sem	1
+situ theor and situ sem	1
+siz complec	1
+sld deriv	2
+sld resolut	1
+sldnf	1
+sleep	1
+slop	1
+smalltalk	2
+smooth	4
+smooth parameter	3
+snapshot	2
+soar	2
+soft dec integr	1
+soft mach	1
+softwar	3
+softwar an	1
+softwar architectur	6
+softwar build block	1
+softwar compon	1
+softwar compon retrief	3
+softwar design	2
+softwar developm experim	1
+softwar developm pr fetch	1
+softwar developm proc	1
+softwar engineer	7
+softwar engineer educ accredit	1
+softwar engineer environm	3
+softwar engineer principl	1
+softwar evolut	2
+softwar inform system	1
+softwar inspect	2
+softwar integr	1
+softwar libr	1
+softwar maint	6
+softwar maint and reus	1
+softwar migr	1
+softwar mobil	1
+softwar qu	2
+softwar qu assur	2
+softwar rel	1
+softwar restructur	1
+softwar reus	5
+softwar spec	1
+softwar standard	1
+softwar system gener	2
+softwar system synth	1
+softwar test	6
+softwar test and val	1
+softwar tool	2
+softwar val	1
+softwar vid	1
+softwar visu	2
+sol model	1
+solomonoff levin distribut	1
+solut	1
+solut tr	1
+sort	2
+sort by regl sampl	2
+sort log	1
+sourc cod qu	1
+sp1000	1
+spac	2
+spac plan	2
+span tr	3
+span tr algorithm	1
+spanner	2
+spar	1
+spar capabil	1
+spar distribut memor	5
+spar graph	1
+spar lin system	3
+spar lu fact	1
+spar matr	6
+sparslinc	1
+spat	1
+spat acc method	2
+spat dat model	1
+spat dat structur	1
+spat dat typ	2
+spat datab	2
+spat loc	1
+spat navig	1
+spat repr	1
+spat scal	1
+spec	1
+specif	9
+specif and verif and reason about program	4
+specif langu	1
+specif match	3
+specl comput	1
+specmark	1
+spectr acc	1
+spectr an	1
+spectr encoder	1
+spectr nl cod	2
+spectr partit method	3
+spectr radius	1
+speech recognit	3
+speed up	2
+speedup	2
+spel correct	1
+spher circl pack	1
+spher cod	1
+spin lock	1
+split transact bus	2
+spmd	1
+spread activ	1
+spreadsh	2
+spt tr	1
+ss	1
+ss calculus	1
+st	3
+st minim	1
+st model	2
+st model sem	3
+st of interconnect dissip system	1
+st spac character of dissip lt system	1
+st spac expl	1
+st transit graph	1
+stabil	2
+stabil toler	1
+standard dev	1
+standard ml	3
+standard tim distribut	1
+starheight on langu	1
+startup lat	1
+stat	1
+stat an	2
+stat classif	1
+stat langu model	2
+stat map	1
+stat method	1
+stat multiplec	2
+stat prior schedl	1
+stat program an	1
+stat re order	1
+stat typ check	1
+stat typecheck	4
+stat vs	1
+steam boiler control	1
+steep	2
+steiner problem in network	5
+steiner tr	1
+steiner tr problem	2
+step design	2
+ster	1
+stereov	1
+stochast	2
+stochast an of squar zer var proc	1
+stochast cfg	1
+stochast context fr grammar	2
+stochast grammar	1
+stochast langu	1
+stochast model	1
+stochast neurodynam	1
+stochast optim	3
+stochast order	1
+stochast par	1
+stochast schedl	2
+stochast transduc	1
+strateg assum surfac and test	1
+stratif	2
+stratif deduc datab	1
+stream fil system	1
+string	1
+string correct	1
+string edit dist	2
+string match	1
+string simil	1
+strong compl	1
+strong tract	1
+structur an	2
+structur behavior funct model	2
+structur complec theor	1
+structur cover	1
+structur docum	1
+structur engineer	1
+structur equiv	2
+structur from mot	2
+structur ind	2
+structur interview	1
+structur light system	1
+structur matr	1
+structur oper sem	1
+structur recognit	1
+structur system	2
+structur uncertaint	1
+structur vid	1
+stub gener	1
+stuck at fault test	1
+stud model	1
+stud rat	1
+subcub compact	1
+subexpon dep	1
+subexpon distribut	1
+subgraph isomorph	1
+subject expect util model	1
+subpixel contour	1
+substitut matr	3
+subsystem	1
+subtyp	6
+supercon	1
+superquadr	1
+superv	1
+superv control	1
+superv learn	4
+surfac	2
+surfac approxim	1
+surfac character	1
+surfac fit	1
+surfac interpol	1
+surfac simplif	1
+surfac triangl	1
+surv	3
+swift architectur	1
+switch cost	1
+switch del	1
+switch router design	1
+switchboard corpus	1
+symbol an	1
+symbol block	1
+symbol evalu	1
+symbol expan and shar memor multiproc	1
+symbol fact	1
+symbol fil	1
+symbol ground	1
+symbol model check	1
+symmeter matr	1
+symmeter maxim pool system	1
+symmeter neighbor filter	1
+synchron	12
+synchron constraint	1
+synchron iter algorithm	1
+synchron primitiv	1
+synchron system	1
+syntac	1
+syntact control of interfer	1
+synth	1
+synth apertur radar	1
+system an	1
+system and appl	2
+system architectur	1
+system evolut	1
+system funct grammar	2
+system manag	2
+system of uniform recur equ	1
+system siml	1
+system siz expan	1
+system specif	1
+system tun	1
+system v	1
+system verif	1
+systol co proc	2
+t junct	1
+tab search	1
+tabl	1
+tabu list	1
+tabu search	3
+tac	1
+tact	1
+tag	1
+tag capabil	1
+tail distribut	1
+tam	1
+tang lin model	1
+tap del lin	3
+taql	1
+tariff	1
+task decomposit	2
+task graph	7
+task manag	1
+task parallel model	1
+task schedl	8
+task specif	1
+task tim an	1
+tasktyp	1
+taylor	1
+taylor theorem	2
+tcp	1
+tcp ip	6
+tcp router	1
+tdn	2
+teach as	1
+teach object orient design and program	2
+team	1
+tel teach	1
+telecommun	1
+teleorchestr	2
+telephon interfac	1
+telepr	1
+temper	1
+temper fact	2
+temper monit	1
+templ	2
+tempor	1
+tempor algebr	2
+tempor compl	1
+tempor continu	1
+tempor datab	7
+tempor differ learn	1
+tempor indetermin	2
+tempor loc	1
+tempor log	8
+tempor log program	1
+tempor organ	1
+tempor quer	2
+tempor reason	4
+tempor rel	2
+tempor sequ	3
+tempor specif	1
+tempor track	1
+ten produc	1
+tenet protocol	1
+term	1
+term an	1
+term assignm	2
+term detect	1
+term proof	1
+term rewrit	1
+tern compl pair	1
+terrain imag	1
+terrain model	1
+test	2
+test ca	1
+test criter	1
+test gener	1
+test tool	2
+text gener	1
+text search tool	1
+textur	2
+textur compr	1
+textur segm	1
+textur synth	1
+th can be fr ch	1
+th categor abstract mach	1
+thal scintigraph	1
+theor of comput	4
+theor of parallel and distribut comput	1
+theorem prov	4
+thesaurus	1
+thr	1
+thr dim	2
+thr dim dn structur	1
+thr dim vi	1
+thr valu knowledg repr	1
+thread	1
+thread migr	1
+thread saf	1
+threshold	2
+threshold schem	1
+throughput	2
+til complec	1
+til problem	1
+til puzzl	1
+tim	3
+tim an	3
+tim complec	2
+tim constrain me	1
+tim constraint	1
+tim dec se	1
+tim del neur network	2
+tim div multiplec	2
+tim of flight	1
+tim optim algorithm	1
+tim rel datab	1
+tim ser	3
+tim ser predict	1
+tim stamp approach	1
+tim var rel	1
+tim warp	2
+timeb model	1
+timesc coord	1
+timesl	1
+tin	1
+tool	1
+tool and techniqu	1
+tool for plan and maintain object orient appl	1
+toolkit	2
+top down approach	1
+topolog	5
+topolog constraint	1
+topolog correct	1
+topolog evalu	1
+torus	1
+tot flow tim	1
+tot wir length	1
+tr order	1
+trac	1
+trac schedl	1
+trac siml	1
+trac system	1
+track	1
+tract	1
+tradeoff	1
+traff	2
+traff character	1
+traff manag	1
+traff scen	1
+traff schedl	1
+traff smooth	1
+train exampl parallel	1
+train perceptron	2
+tran an	2
+tran model	1
+transact	3
+transact manag	3
+transact model	1
+transact proc	4
+transact respon tim	1
+transact schedl	1
+transact tim	1
+transduc	1
+transducer	1
+transfer matr	1
+transfer of learn	1
+transfer pot	1
+transfer rn	1
+transfer window	1
+transform	1
+transform group	1
+transform schem	1
+transform subband cod	1
+transit system	2
+transl	1
+transl invar	1
+transl qu	1
+transm control protocol	1
+transm lin	1
+transport protocol	2
+transposit	3
+trapez reg	1
+travel salesman	1
+travel salesman problem	3
+treewidth	2
+triangl	3
+triangl irregl network	1
+trichlorotrifluoroethan	1
+trigger	2
+troubleshoot	1
+trust author	1
+tsp	1
+tun filter	2
+tupl timestamp	2
+tur mach	1
+tur test	1
+turbl	1
+turk	1
+turk syntac	1
+tw connect graph	1
+tw ph com	1
+typ	9
+typ construc	1
+typ dep	2
+typ infer	4
+typ lambd calculus	3
+typ system	5
+typ theor	2
+typ union	1
+typecheck	1
+ubiqu comput	1
+udp	1
+ui compon	1
+ui design tool	1
+ui model	1
+ui repr	1
+uim	1
+un	3
+un network program	1
+un program	1
+uncalibr ster vi	1
+uncertain system	1
+uncertaint	5
+uncertaint and covar matr	1
+uncertaint manag	1
+uncondit secrec	1
+uncondit secur	1
+unconstrain handwrit digit recognit	1
+unconstrain optim	1
+und skip red	1
+undec	1
+underdetermin problem	1
+underspecif	1
+unfold	1
+unif	4
+uniform grid	1
+uniform mach	1
+uniform prior	1
+uniform pur langaug	1
+unimod load throughput funct	1
+unimodl loop transform	1
+univer funct	1
+univer search	1
+univer term	3
+univer tim coordin	1
+unrel proc	1
+unsuperv learn	2
+up separ	1
+urn model	1
+us	1
+user datagram protocol	1
+user interfac	4
+user interfac design	1
+user interfac developm environm	1
+user interfac manag system	2
+user interfac softwar	1
+user interfac specif	1
+user interfac tool	1
+user interfac toolkit	1
+user model	1
+user recov	1
+utc	1
+val	1
+val of transform	1
+valu ba system	1
+valu iter	1
+var	1
+var elim	1
+var of run tim	1
+var reduc	1
+vbr vid	1
+vdm	2
+vect proc	1
+vect tim	1
+ver control	1
+ver partit sign fil	1
+ver visu	1
+verif	12
+verif and reason about program	1
+vi	3
+vi graph	1
+vi proc	1
+vid	2
+vid compr	1
+vid datab	1
+vid datab vid segm vid ind vid edit proc	1
+vid edit and classif	1
+vid microscop	1
+vid on demand	3
+vid server	2
+vid transm	3
+videoon demand	1
+view	1
+view ba repr	1
+view mater	1
+view se	1
+view upd	1
+view updat	1
+viewpoint	3
+virtu channel	5
+virtu circuit	2
+virtu circuit rout	1
+virtu cut through	2
+virtu cutthrough	2
+virtu lin	1
+virtu mach	1
+virtu mechan	1
+virtu memor	4
+virtu memor datab	1
+virtu memor datab system	2
+virtu memor manag	3
+virtu memor til	1
+virtu path	1
+virtu path ba network	1
+virtu proc	1
+virtu re	1
+virtu shar memor	2
+visu	4
+visu dat entr	1
+visu datab system	1
+visu debugger	1
+visu langu	1
+visu object recognit	1
+visu serv	1
+visu shap recognit	1
+vit arc	1
+vl design	2
+vmdb	1
+vod	1
+vol render	1
+volumeter model	1
+volumeter primitiv	1
+voron diagram	1
+vot	3
+vot algorithm	1
+vrml	1
+w network	1
+w switch	1
+w3	1
+wait fr algorithm	1
+wam	2
+war abstract mach	1
+warp	1
+wavefront	1
+wavel	1
+wavel an	1
+wavel pack	1
+wavel threshold	1
+wavel transform	1
+wavelength div multiplec	3
+waybelow rel	1
+weak coh	1
+weak con	1
+weak con proc group	1
+weak subsum	1
+weakest liber precondit	1
+weakest precondit	6
+web browser	1
+web min	1
+weigh matr	1
+weight bipart match	1
+weight discr	1
+weight funct	3
+weight ten produc	1
+wel found order	2
+wel found sem	2
+wel mod program	1
+wel typ	1
+wellmod program	1
+wid ar load shar	1
+wid ar network fil loc	1
+widrow hoff algorithm	1
+wiener hopf ind	1
+wind barb	1
+wind profiler	1
+wir network	1
+wit	1
+word spot	1
+workflow	2
+workflow interoper	2
+workload character	1
+workload model	1
+workst	2
+workst appl softwar	1
+world wid web	7
+world wid web search eng	1
+wormhol	1
+wormhol rout	36
+worst ca an	3
+worst ca execut tim	1
+worst event driv siml	1
+writ	1
+writ cach	1
+www	4
+x protocol	1
+x tr	1
+x window system	2
+xunet	1
+z	1
+zigzag path	1
+zip cod	1
+zo datab	3
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.stopwords
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.stopwords	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/cstr.stopwords	(revision 21083)
@@ -0,0 +1,468 @@
+addison
+called
+chapter
+conf
+conference
+department
+e.g
+et
+ffi
+ffl
+i.e
+journal
+proc
+proceedings
+school
+symposium
+university
+a
+abaft
+aboard
+about
+above
+across
+afore
+aforesaid
+after
+again
+against
+agin
+ago
+aint
+albeit
+all
+almost
+alone
+along
+alongside
+already
+also
+although
+always
+am
+american
+amid
+amidst
+among
+amongst
+an
+and
+anent
+another
+any
+anybody
+anyone
+anything
+are
+arent
+around
+as
+aslant
+astride
+at
+athwart
+away
+b
+back
+bar
+barring
+be
+because
+been
+before
+behind
+being
+below
+beneath
+beside
+besides
+best
+better
+between
+betwixt
+beyond
+both
+but
+by
+c
+can
+cannot
+cant
+certain
+circa
+close
+concerning
+considering
+cos
+could
+couldnt
+couldst
+d
+dare
+dared
+darent
+dares
+daring
+despite
+did
+didnt
+different
+directly
+do
+does
+doesnt
+doing
+done
+dont
+dost
+doth
+down
+during
+durst
+e
+each
+early
+either
+em
+english
+enough
+ere
+even
+ever
+every
+everybody
+everyone
+everything
+except
+excepting
+f
+failing
+far
+few
+first
+five
+following
+for
+four
+from
+g
+gonna
+gotta
+h
+had
+hadnt
+hard
+has
+hasnt
+hast
+hath
+have
+havent
+having
+he
+hed
+hell
+her
+here
+heres
+hers
+herself
+hes
+high
+him
+himself
+his
+home
+how
+howbeit
+however
+hows
+i
+id
+if
+ill
+im
+immediately
+important
+in
+inside
+instantly
+into
+is
+isnt
+it
+itll
+its
+itself
+ive
+j
+just
+k
+l
+large
+last
+later
+least
+left
+less
+lest
+lets
+like
+likewise
+little
+living
+long
+m
+many
+may
+maynt
+me
+mid
+midst
+might
+mightnt
+mine
+minus
+more
+most
+much
+must
+mustnt
+my
+myself
+n
+near
+neath
+need
+needed
+needing
+neednt
+needs
+neither
+never
+nevertheless
+new
+next
+nigh
+nigher
+nighest
+nisi
+no
+no-one
+nobody
+none
+nor
+not
+nothing
+notwithstanding
+now
+o
+oer
+of
+off
+often
+on
+once
+one
+oneself
+only
+onto
+open
+or
+other
+otherwise
+ought
+oughtnt
+our
+ours
+ourselves
+out
+outside
+over
+own
+p
+past
+pending
+per
+perhaps
+plus
+possible
+present
+probably
+provided
+providing
+public
+q
+qua
+quite
+r
+rather
+re
+real
+really
+respecting
+right
+round
+s
+same
+sans
+save
+saving
+second
+several
+shall
+shalt
+shant
+she
+shed
+shell
+shes
+short
+should
+shouldnt
+since
+six
+small
+so
+some
+somebody
+someone
+something
+sometimes
+soon
+special
+still
+such
+summat
+supposing
+sure
+t
+than
+that
+thatd
+thatll
+thats
+the
+thee
+their
+theirs
+them
+themselves
+then
+there
+theres
+these
+they
+theyd
+theyll
+theyre
+theyve
+thine
+this
+tho
+those
+thou
+though
+three
+thro
+through
+throughout
+thru
+thyself
+till
+to
+today
+together
+too
+touching
+toward
+towards
+true
+twas
+tween
+twere
+twill
+twixt
+two
+twould
+u
+un
+under
+underneath
+unless
+unlike
+until
+unto
+up
+upon
+us
+used
+usually
+v
+versus
+very
+via
+vice
+vis-`a-vis
+w
+wanna
+wanting
+was
+wasnt
+way
+we
+wed
+well
+were
+werent
+wert
+weve
+what
+whatever
+whatll
+whats
+when
+whencesoever
+whenever
+whens
+whereas
+wheres
+whether
+which
+whichever
+whichsoever
+while
+whilst
+who
+whod
+whoever
+whole
+wholl
+whom
+whore
+whos
+whose
+whoso
+whosoever
+will
+with
+within
+without
+wont
+would
+wouldnt
+wouldst
+x
+y
+ye
+yet
+you
+youd
+youll
+your
+youre
+yours
+yourself
+yourselves
+youve
+z
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/k4.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/k4.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/k4.pl	(revision 21083)
@@ -0,0 +1,814 @@
+#!/usr/bin/perl -w
+
+#    k4.pl 
+#    Version 1.1   
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0    Ready to rebuild all the data for Witten et. al. 1998
+# 1.0.1  bug: empty @attribute enumerations cause java crashes.
+# 1.0.2  output number of documents found
+# 1.0.3  bug: if -F and !defined($df{phrase}) then divide by zero crash.
+# 1.0.4  Default attributes reduced to phrase, document, tfidf, first, class 
+# 1.0.5  Add keyphrase-frequency file option and attribute
+# 1.0.6  keyphrase-frequency file corrects for covering input
+# 1.0.7  use kea-tidy-key-file.pl | stemmer to clean up key files
+# 1.0.8  -t toggle uses .tagged instead of .clauses files
+# 1.0.9  Cleaned up output so it goes to STDERR not STDOUT
+# 1.0.10 Use $perl_command for system-independence
+# 1.0.11 List command line parameters if no arguments are given.
+# 1.1    First Distribution.  GPL added.  Documentation improved.
+# 1.1.1  Tweaked output a little; no changes to function
+
+print STDERR "\nk4.pl: the arff file builder for Kea\n";
+
+$gsdlhome = $ENV{'GSDLHOME'};
+
+# Command line options
+#   k4.pl [options] <input-directory> <output-arff-file>
+#   options are:
+#         -abciFs 
+#         -L max length 
+#         -f <df file>
+#         -S <stopword file>
+
+require("getopts.pl"); 
+&Getopts("abciL:f:FsS:kK:t");
+
+# What files shall we use?
+if (!$ARGV[0] || !$ARGV[1]) { 
+    print STDERR "usage: k4.pl [options] <input-directory> <output-arff-file>\n"; 
+    print STDERR "       options: -a    stopword mode (default)\n";
+    print STDERR "                -b    brill-phrase mode (requires -t)\n";
+    print STDERR "                -c    carl-phrase mode (requires -t)\n";
+    print STDERR "                -f [global frequency file]\n";
+    print STDERR "                -F    global frequency file includes input files\n";
+    print STDERR "                -i    ignore stopwords in word counts\n";
+    print STDERR "                -K [keyword frequency file]\n";
+    print STDERR "                -k    keyword frequency file includes input files\n";
+    print STDERR "                -L [maximum phrase length] in words (default = 3)\n";
+    print STDERR "                -S [stopword file]\n";
+    print STDERR "                -s    keep singleton phrases\n";
+    print STDERR "                -t    input files are *.tagged (default is *.clauses)\n";
+    die "\n";
+}
+$directory = $ARGV[0];
+$directory =~ s/\/$//;
+$arfffile = $ARGV[1];
+print STDERR "Input directory: $directory\n";
+print STDERR "Output Arff file: $arfffile\n";
+
+
+# Set the maximum phrase length
+if (($opt_L) && ($opt_L =~ /^\d$/) && ($opt_L > 0)) {
+    $max_phrase_length = $opt_L;
+} else {
+    $max_phrase_length = 3;
+}
+print STDERR "Maximum phrase length: $max_phrase_length\n";
+
+
+# Are we in Stopword mode, Brill mode, or Carl mode?
+if ($opt_b && $opt_c) {
+    print STDERR "Warning: Brill phrase option overriding Carl phrase option.\n";
+
+} elsif ($opt_b) {
+    # Brill phrases
+    print STDERR "Brill phrase mode\n";
+    $brill_mode = 1;
+
+    $brill_n  = "/(NN|NNS|NNP|NNPS|VBG)\$";
+    $brill_nj = "/(NN|NNS|NNP|NNPS|JJ)\$";
+
+} elsif ($opt_c) {
+    # Carl phrases
+    print STDERR "Carl phrase mode\n";
+    $carl_mode = 1;
+
+    # regular expressions used to determine brillity
+    $WORD = "[a-zA-Z0-9]+(\-?)[a-zA-Z0-9]+";
+    $NOUN = "($WORD\/NN[A-Z]*)";
+    $ADJ = "($WORD\/JJ[A-Z]*)";
+    $VBG = "($WORD\ing\/VBG)";
+    $VBN = "($WORD\ed\/VBN)";
+
+    $VB = "($WORD\/VB)";
+    $VBP = "($WORD\/VBP)";
+    $VERB = "$VBN|$VB|$VBG|$VBP";
+
+    # The OEDs conjunctions -- Carl's stuff
+    $OED_CONJ = "((after|albeit|although|an|and|as|because|before|but|cos|directly|either|except|for|howbeit|if|immediately|instantly|lest|like|likewise|neither|nevertheless|nisi|nor|notwithstanding|now|only|or|otherwise|provided|providing|qua|since|so|supposing|than|that|tho|though|till|unless|until|when|whencesoever|whenever|whereas|whether|while|whilst|yet)\/CC)";
+
+    # The OED's list of prepositions -- Carl's stuff
+    $OED_PREP = "((abaft aboard about above across afore after against agin along alongside amid amidst among amongst anent around aslant astride at athwart bar barring before behind below beneath beside besides between betwixt beyond but by circa concerning considering despite down during ere except excepting failing for from in inside into less like mid midst minus near neath next nigh nigher nighest notwithstanding oer of off on onto outside over past pending per plus qua re respecting round sans save saving since thro through throughout thru till to touching toward towards tween twixt under underneath unlike until unto up upon versus via vice wanting with within without)\/IN)";
+
+    # The OED based Carl-phrase wordlist
+    $INCC = "$OED_CONJ|$OED_PREP";
+
+
+
+} else {
+    # stopword mode
+    #print STDERR "Stopword mode\n";
+    $stopword_mode = 1;
+
+    $stopword_file = "stopwords";
+    if ($opt_S) {
+	if (-e "$opt_S") {
+	    $stopword_file = $opt_S;
+	} else {
+	    print STDERR "Can't find stopword file: $opt_S\n";
+	}
+    }
+    print STDERR "Using stopword file: $stopword_file\n";
+
+    # read the stopwords
+    open(S, "<$stopword_file");
+    while (<S>) {
+	chomp;
+	$stopword{lc($_)} = 1;
+    }
+    close(S);
+}
+
+
+# Should we ignore stopwords in word counts?
+if ($opt_i && $opt_i) {
+    print STDERR "Ignoring stopwords in word counts.\n";
+    $use_all_words_in_word_count = 0;
+} else {
+    #print STDERR "Using all words (including stopwords) in word count (default).\n";
+    $use_all_words_in_word_count = 1;
+}
+
+
+# Which global-frequency file are we using
+if ($opt_f) {
+    $document_frequency_file = $opt_f;
+} else {
+    $document_frequency_file = "document-frequencies";
+}
+print STDERR "Document frequency file: $document_frequency_file\n";
+
+
+# How is the global-frequency file created?
+#   Note: $testfile is added to the df figure for each phrase.
+#   If the current document is not part of the document frequencies
+#   file then the df figure needs to be increased by 1 to allow
+#   for the fact that the phrase also occurs in the the current file.
+
+if ($opt_F && (-e "$document_frequency_file")) {
+    print STDERR "Text files are covered by specified document frequency file\n";
+    $testfile = 0;
+} elsif ($opt_F) {
+    die "Document frequency file doesn't exist, -F option impossible\n";
+} elsif (-e "$document_frequency_file") {
+    print STDERR "Text files are not covered by document frequency file\n";
+    $testfile = 1;
+} else {
+    print STDERR "Document frequency file does not exist: create from training data\n";
+    $testfile = 0;
+}
+
+# Which keyword-frequency file are we using
+if ($opt_K && (-e $opt_K)) {
+    $keyword_frequency_file = $opt_K;
+    print STDERR "Keyword frequency file: $keyword_frequency_file\n";
+    if ($opt_k && $opt_k) {
+	print STDERR "Keyword frequency file covers input files\n";
+	$kf_covers_input = 1;
+    } else {
+	print STDERR "Keyword frequency is independent of input\n";
+	$kf_covers_input = 0;
+    }
+} elsif ($opt_K) {
+    die "Keyword frequency file doesn't exist, -K option impossible\n";
+} else {
+    $keyword_frequency_file = "";
+    print STDERR "No keyword frequency file\n";
+}
+
+
+# Should we show singleton phrases?
+if ($opt_s && $opt_s) {
+    $suppress_singleton_phrases = 0;
+    print STDERR "Including singleton phrases.\n"
+} else {
+    $suppress_singleton_phrases = 1;
+    print STDERR "Ignoring singleton phrases (default).\n"
+}
+
+
+# Do we look for *.tagged or *.clauses?
+$suffix = "clauses";
+if ($opt_t && $opt_t) {
+    $suffix = "tagged";
+}
+print STDERR "Input file suffix: $suffix\n";
+
+# How to run scripts etc
+$perl_command = "perl -w";
+
+# Are we using Turney's data
+$Turney = 0;
+
+
+
+
+# Start keyphrase extraction
+
+# find the documents
+@documents = split(/\s+/, `find $directory/ -name "*.$suffix"`);
+if (!$documents[0]) {
+    die "\nk4.pl error: no documents found.";
+} else {
+    print STDERR "\nProducing keyphrases for ", $#documents + 1, " documents\n";
+}
+
+print STDERR "Finding candidate phrases...\n";
+$document_number = 1;
+
+foreach $document (@documents) {
+    print STDERR "  document $document_number: $document\r";
+    $document_number++;
+
+    # if we've already produced this file, skip it.
+    next if (-e "$document.stemmed"); 
+
+    open(F, "<$document");
+
+    #open(S, "| ./stemmer > $document.stemmed");
+    open(S, "| $gsdlhome/perllib/Kea-1.1.4/stemmer > $document.stemmed");
+    open(U, ">$document.unstemmed");
+    open(D, ">$document.distance");
+
+    $distance = 0;
+
+    while (<F>) {
+	chomp;
+
+	# if we're in stopword mode, throw away the tags
+	if ($stopword_mode) {
+	    s/\/\S+//g;
+	}
+
+        #work through each line
+	@words = split(/ +/, $_);
+	
+	foreach $i (0..$#words) {
+	    $finalword = $words[$i];
+
+	    # calculate diatance from start (-i not set)
+	    if ($use_all_words_in_word_count) {
+		$distance ++;
+	    }
+
+	    # make sure the last word in the phrase is okay
+	    if ($stopword_mode) {
+		# the last word must not be a stopword
+		next if $stopword{lc($finalword)};
+	    } elsif ($brill_mode) {
+		# the last word must match ?
+		next unless ($finalword =~ /$brill_n/);
+	    } elsif ($carl_mode) {
+		# the last word must be either a noun or a vbg
+		next unless (($finalword =~ /^$VBG$/) || 
+			     ($finalword =~ /^$NOUN$/));
+	    }
+
+	    # calculate distance from start in -i mode
+	    # (this is still flawed for phrases containing stopwords)
+	    if (!$use_all_words_in_word_count) {
+		$distance ++;
+	    }
+
+	    # print $finalword as a phrase of length 1
+	    if ($stopword_mode) {
+		print U "$finalword\n";
+		print S "$finalword\n";
+	    } else {
+		$untag = $finalword;
+		$untag =~ s/\/\S+$//;
+		print U "$untag\n";
+		print S "$untag\n";
+	    }
+	    print D $distance, "\n";
+	    
+	    # construct each longer phrase that ends on this word.
+	    $phrase = $finalword;
+	    $counter = 1;
+
+	    foreach $j (1..$max_phrase_length) {
+		
+		# make sure we don't try to get a word from "before" the line
+		last if ($j > $i);
+
+		# find the first word of the next phrase
+		$firstword = $words[$i - $j];
+		$phrase = "$firstword $phrase";
+		
+		# make sure the phrase is valid
+		if ($stopword_mode) {
+		    # the first word may not be a stopword
+		    next if $stopword{lc($firstword)};
+		    $counter++;
+		} elsif ($brill_mode) {
+		    # all words other than the last must match $brill_nj
+		    last unless ($firstword =~ /$brill_nj/);
+		    $counter++;
+		} elsif ($carl_mode) {
+		    # the carl-reg-exp applies
+		    if (($firstword =~ /^$VBG$/) || ($firstword =~ /^$NOUN$/)) {
+			$counter++;
+		    }
+		    next unless (isValidCarlPhrase());
+		}
+
+		# print the phrase
+		if ($stopword_mode) {
+		    print U "$phrase\n";
+		    print S "$phrase\n";
+		} else {
+		    $untag = $phrase;
+		    $untag =~ s/\/\S+//g;
+		    print U "$untag\n";
+		    print S "$untag\n";
+		}
+
+		# print the distance
+		if ($use_all_words_in_word_count) {
+		    print D ($distance - $j), "\n";
+		} else {
+		    print D ($distance - $counter), "\n";
+		}
+	    }
+
+	}
+    }
+
+    close(S);
+    close(U);
+    close(D);
+    close(F);
+
+    $document_size{$document} = $distance; #WILL CHANGE THIS BACK
+    `$perl_command /home/jmt14/gsdl/perllib/Kea-1.1.4/kea-choose-best-phrase.pl $document`;
+}
+
+#print STDERR "\nMake sure we know document sizes...\n";
+
+foreach $document (@documents) {
+    if (!defined($document_size{$document})) {
+	$max = 0;
+	open(D, "<$document.distance");
+	while (<D>) {
+	    chomp;
+	    if ($_ > $max) { $max = $_; }
+	}
+	close(D);
+	$document_size{$document} = $max;
+	print STDERR "$document has size $document_size{$document}\n";
+    }
+}
+
+
+
+# Calculate document frequencies
+
+print STDERR "Gathering document frequencies...\n";
+
+if (-e "$document_frequency_file") {
+    
+    print STDERR "Found document frequencies -- reading them!\n";
+    
+    open(F, "<$document_frequency_file");
+
+    $numdocs_in_global_corpus = <F>;
+    chomp($numdocs_in_global_corpus);
+    print STDERR "$numdocs_in_global_corpus documents in frequency file.\n";
+
+    while (<F>) {
+	@data = split(/ +/, $_);
+	$phrase = join(' ', @data[0..$#data - 1]);
+	$df{$phrase} = $data[$#data];
+    }
+    close(F);
+    
+} else {
+    
+    print STDERR "Document frequency file not found... creating\n";
+    
+    foreach $document (@documents) {
+	undef %seen;
+	foreach $phrase (split(/\n/, `cat $document.stemmed`)) {
+	    $df{$phrase} ++ if (!defined($seen{$phrase}));
+	    $seen{$phrase} = 1;
+	}
+    } 
+    $numdocs_in_global_corpus = $#documents + 1;
+    
+    print STDERR "Writing document frequencies to file...\n";
+    open(F, ">$document_frequency_file");
+    print F "$numdocs_in_global_corpus\n";
+    foreach $phrase (keys %df) { 
+	@data = split(/ +/, $phrase);
+	# note we keep phrases 1 longer then we need to just in
+	# case we ever want to calculate entropy statistic
+	if ($#data < $max_phrase_length) {
+	    print F "$phrase $df{$phrase}\n"; 
+	}
+    }
+    close(F);
+}
+	
+
+# Read the keyword frequency file
+if ($keyword_frequency_file) {
+    print STDERR "Reading keyword frequency file\n";
+    
+    open(KF, "<$keyword_frequency_file");
+
+    $size_of_keyword_frequency_file = <KF>;
+    chomp($size_of_keyword_frequency_file);
+    print STDERR "$size_of_keyword_frequency_file documents used to generate kf file.\n";
+
+    while (<KF>) {
+	@data = split(/\s+/, $_);
+	$phrase = join(' ', @data[0..$#data - 1]);
+	$kf{$phrase} = $data[$#data];
+    }
+    close(KF);
+}    
+
+
+
+# What journals are we using?
+if ($Turney) {
+    $journals{"unknown"} = 1;
+    foreach $document (@documents) {
+	($docnum) = $document =~ /(\d+)\.$suffix/;
+	if ($docnum < 7) {
+	    $journals{"JAIHR"} = 1;	
+	} elsif ($docnum < 27) {
+	    $journals{"Psycoloquy"} = 1;
+	} elsif ($docnum < 29) {
+	    $journals{"Neuroscientist"} = 1;
+	} elsif ($docnum < 43) {
+	    $journals{"JCAMD"} = 1;
+	} else {
+	    $journals{"BBS"} = 1;
+	} 
+    }
+}
+ 
+
+# Write the arff files
+
+print STDERR "Writing ARFF file\n";
+
+open (ARFF, ">$arfffile");
+
+print ARFF "\@relation keyphrase\n\n";
+print ARFF "\@attribute phrase string\n";
+print ARFF "\@attribute document {", join(', ', @documents), "}\n";
+
+if ($Turney) {
+    print ARFF "\@attribute journal {", join(', ', keys(%journals)), "}\n";
+}
+if ($keyword_frequency_file) {
+    print ARFF "\@attribute keyword_freq real\n";
+}
+
+print ARFF "\@attribute tfidf real\n";
+print ARFF "\@attribute first_occurrence real\n";
+
+
+# print ARFF "\@attribute entropy real\n";
+# print ARFF "\@attribute in_first_5_percent real\n";
+# print ARFF "\@attribute last real\n";
+# print ARFF "\@attribute interval_deviation real\n";
+# print ARFF "\@attribute max_cluster_of_$offset_clumping_cutoff real\n";
+# print ARFF "\@attribute term_frequency real\n";
+# print ARFF "\@attribute document_frequency real\n"; 
+print ARFF "\@attribute class {yes,no}\n";
+
+print ARFF "\n\@data\n";
+
+
+# the number of keyphrases not covered by the arff file
+print STDERR "Writing instances...\n";
+$not_included = 0;
+$document_number = 1;
+
+foreach $document (@documents) {
+    print STDERR "  document $document_number: $document\r";
+    $document_number++;
+
+    # load the keyphrases
+    undef %keyphrase;
+
+    $keyphrases = $document;
+    $keyphrases =~ s/$suffix$/key/;
+
+    if (-e $keyphrases) {
+	foreach (split(/\n/, `cat $keyphrases | $perl_command kea-tidy-key-file.pl | stemmer`)) {
+	    $keyphrase{$_} = 1;
+	}
+    }
+
+    # Calculate document agregates from stemmed file
+
+    # total frequency in the document
+    undef %tf;
+    # the length of the document
+    $document_size = $document_size{$document};
+
+    # number of occurances in the first 5% of the document
+    #  undef %first_5;
+    # last occurance
+    #  undef %last;
+    # for standard deviation of distance between occurances 
+    #  undef %interval_sd;
+    #  undef %sumsquare;
+    #  undef %sum;
+    # for entropy and Carl (disabled) measures
+    #  undef %entropy;
+    #  undef %f;
+    #  undef %ff;
+    #  $total_entropy{$document} = 0;
+    #  $total_instances{$document} = 0;
+    # for calculating "offsets" sizes
+    #  undef %offsets;
+    #  undef %biggest_offsets;
+
+    open(S, "<$document.stemmed");
+    open(D, "<$document.distance");
+
+    while (<S>) {
+	chop($phrase = $_);
+	$tf{$phrase}++;
+
+	#@p = split(/ +/, $phrase);
+	#$left = join(' ', @p[0..$#p - 1]);
+	#$right = join(' ', @p[1..$#p]);
+	#$f{$left}{$phrase} ++;
+	#$f{$right}{$phrase} ++;
+	#$ff{$left} ++;
+	#$ff{$right} ++;
+
+	chop($distance = <D>);
+
+	# $first_5{$phrase} ++ if ($distance / $document_size < 0.05);
+
+	#if (!defined($sum{$phrase})) {
+	#    $sum{$phrase} = 0;
+	#    $sumsquare{$phrase} = 0;
+	#} else {
+	#    $difference = $distance - $last{$phrase};
+	#    $sum{$phrase} += $difference;
+	#    $sumsquare{$phrase} += ($difference * $difference);
+	#}
+
+	# $last{$phrase} = $distance;
+
+	#if (!defined($biggest_offsets{$phrase})) {
+	#    @{$offsets{$phrase}} = ($distance);
+	#    $biggest_offsets{$phrase} = 1;
+	#} else {
+	#    $cutoff = $distance - $offset_clumping_cutoff;
+	#    #print "-- \n$phrase \noffsets: @{$offsets{$phrase}}\n";
+	#    push( @{$offsets{$phrase}}, $distance );
+	#    while (@{$offsets{$phrase}}[0] < $cutoff) {
+	#	shift( @{$offsets{$phrase}} );
+	#    }
+	#    # print "offsets: @{$offsets{$phrase}}\n";
+	#    if ($#{$offsets{$phrase}} >= $biggest_offsets{$phrase}) {
+	#	$biggest_offsets{$phrase} = $#{$offsets{$phrase}} + 1;
+	#    }
+	#}
+    }
+    
+    close(S);
+    close(D);
+    # undef %offsets;
+
+
+    # Calculate complex attribute values
+
+    foreach $phrase (keys(%tf)) {
+
+	# Calculate standard deviation of distance between occurances
+	#$interval_sd{$phrase} = 
+	#    sqrt( ($sumsquare{$phrase} -
+	#	   ($sum{$phrase} * $sum{$phrase} / $tf{$phrase})) 
+	#	 / $tf{$phrase} );
+	#undef $sum{$phrase};
+	#undef $sumsquare{$phrase};
+
+
+        # Calculate Entropy
+	#$t = 0;
+	#$entropy = 0;
+	#$entropy = -1 if (!defined($f{$phrase}));
+	#
+	#foreach $superphrase (keys(%{$f{$phrase}})) {
+	#    $t += $f{$phrase}{$superphrase};
+	#}
+	#
+	#foreach $superphrase (keys(%{$f{$phrase}})) {
+	#    $p = $f{$phrase}{$superphrase} / $t;
+	#    $entropy -= $p * log($p) / log(2);
+	#}
+	#
+	#$entropy{$phrase} = $entropy;
+
+	# Calculate Carl statistic
+	#$left = join(' ', @words[0..$#words - 1]);
+	#$right = join(' ', @words[1..$#words]);
+
+	#$carl1 = $f{$left}{$phrase} / $ff{$left};
+	#$carl2 = $f{$right}{$phrase} / $ff{$right};
+	#$carlmin = ($carl1 < $carl2) ? $carl1 : $carl2;
+	#if ($#words == 0) { $carlmin = 1; }
+
+
+	#undef $f{$phrase};
+	#undef $ff{$phrase};
+
+    }
+
+
+
+    # Write the arff file.
+    open(S, "<$document.stemmed");
+    open(U, "<$document.unstemmed");
+    open(D, "<$document.distance");
+
+    undef %seen;
+
+    while (<S>) {
+	chop($phrase = $_);
+	chop($unstemmed = <U>);
+	chop($distance = <D>);
+
+	# only output each phrase once
+	next if (defined($seen{$phrase}));
+	$seen{$phrase} = 1;
+
+	# ignore phrases of more than N words
+	@words = split(/ +/, $phrase);
+	next if ($#words >= $max_phrase_length);
+
+	# ignore likely proper-nouns
+	next if ($unstemmed =~ /^PN\-/);
+
+	# ignore singleton phrases
+	next if (($tf{$phrase} == 1) && $suppress_singleton_phrases);
+
+	# Calculate TFIDF
+	if (!defined($df{$phrase})) {
+	    if ($testfile) { $df{$phrase} = 0 } 
+	    else { $df{$phrase} = 1; }
+	}
+	$tfidf = ($tf{$phrase} / $document_size) * 
+	    (log(($numdocs_in_global_corpus + $testfile) / ($df{$phrase} + $testfile)) / log(2));
+	
+	# Initialise number of words in first 5%
+	# $first_5{$phrase} = 0 if (!defined($first_5{$phrase}));
+
+	# Calculate class
+	$class = defined($keyphrase{$phrase}) ? "yes" : "no";
+
+	# For the Turney corpus, identify the journal 
+	($docnum) = $document =~ /(\d+)\.$suffix/;
+	if (!$Turney || !$docnum) {
+	    $journal = "?";
+	} elsif ($docnum < 7) {
+	    $journal = "JAIHR";	
+	} elsif ($docnum < 27) {
+	    $journal = "Psycoloquy";
+	} elsif ($docnum < 29) {
+	    $journal = "Neuroscientist";
+	} elsif ($docnum < 43) {
+	    $journal = "JCAMD";
+	} else {
+	    $journal = "BBS";
+	} 
+
+
+	# Write an instance to the arff file
+	print ARFF "'$phrase ($unstemmed)',$document,";
+	if ($Turney) { print ARFF "$journal,"; }
+	if ($keyword_frequency_file) {
+	    if ($kf{$phrase}) { 
+		if (defined($keyphrase{$phrase}) && $kf_covers_input) {
+		    print ARFF ($kf{$phrase} - 1), ","; 
+		} else {
+		    print ARFF "$kf{$phrase},"; 
+		}
+	    } else { 
+		print ARFF "0,"; 
+	    }
+	}
+	printf(ARFF "%.3g,%.3g,%s\n", 
+	       $tfidf, 
+	       $distance / $document_size,
+	       # $entropy{$phrase}, 
+	       # $first_5{$phrase} / $tf{$phrase},
+	       # $last{$phrase} / $document_size,
+	       # $interval_sd{$phrase},
+	       # $biggest_offsets{$phrase},
+               # $tf{$phrase} / $document_size,
+	       # $df{$phrase} + $testfile,
+	       $class
+	       );
+
+	$keyphrase{$phrase} = 0 if (defined($keyphrase{$phrase}));
+
+    }
+
+    print ARFF "% Begin missing phrases for $document\n";
+    foreach $keyphrase (keys(%keyphrase)) {
+	next if ($keyphrase{$keyphrase} == 0);
+	$not_included ++;
+	print ARFF "'$keyphrase', $document, ";
+	if ($Turney) { print ARFF " ?, "; }
+	if ($keyword_frequency_file) { print ARFF " ?, "; }
+	print ARFF "?, ?, ?\n";
+    }
+    print ARFF "% Finish missing phrases for $document\n";
+
+    close(S);
+    close(U);
+    close(D);
+}
+
+# finish off arff file
+print ARFF "% $not_included key phrases not included\n";
+print "% $not_included key phrases not included\n";
+
+
+print STDERR "k4.pl: $arfffile complete\n\n";
+
+
+
+
+
+# Is the current phrase a valid Carl phrase?
+# The phrase is storedin $phrase.
+
+
+sub isValidCarlPhrase () {
+    @wds = split(/ +/, $phrase);
+    $index = 0;
+    $wd = $wds[$index];
+
+    while ($index < $#wds) {
+	# current word must be a noun, adj, or verb
+	if (($wd =~ /^$NOUN$/) || ($wd =~ /^$ADJ$/) || ($wd =~ /^$VERB$/)) {
+	    $index++;
+	    $wd = $wds[$index];
+	} else {
+	    return 0;
+	}
+
+	# next is an optional incc
+	if ($wd =~ /^$INCC$/) {
+	    # it is an incc, so advance one word
+	    $index++;
+	    $wd = $wds[$index];
+	}
+    }
+
+    # since we can advance two in the loop, it's possible to have
+    # run out of input. If this is the case, then the phrase is
+    # not brill, as there's no room for a final NN or VBG
+    if ($index > $#wds) {
+	return 0;
+    }
+
+    # the last word must be either a noun or a vbg
+    if (($wd =~ /^$VBG$/) || ($wd =~ /^$NOUN$/)) {
+	return 1;
+    } else {
+	return 0;
+    }
+}
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-choose-best-phrase.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-choose-best-phrase.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-choose-best-phrase.pl	(revision 21083)
@@ -0,0 +1,122 @@
+#!/usr/bin/perl -w
+
+#    kea-choose-best-phrase.pl
+#    Version 1.1
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0   Witten et.al.
+# 1.1   First Distribution.  GPL added.
+# 1.1.1 Don;t use STDERR.
+
+# Usage : kea-choose-best-phrase.pl <filestem>
+# The script assumes filestem.stemmed and filestem.unstemmed exist and
+# chooses the most frequent form of each phrase in filestem.unstemmed.
+
+# If a phrase of length 1 appears in initial capitals all the time,
+# then prefix it with "PN-" to show it is (probably) a proper-noun.
+
+# If a phrase of length 1 appears in initial capitals *most of* the time,
+# and if $mark_common_capitals = 1,
+# then prefix it with "PN-" to show it is (probably) a proper-noun.
+$mark_common_capitals = 0;
+
+# Get command-line arguments
+if (!$ARGV[0]) { 
+    die "choose-best-phrase.pl <filestem>\n";
+}
+$stemmed = "$ARGV[0].stemmed";
+$unstemmed = "$ARGV[0].unstemmed";
+print "kea-choose-best-keyphrase.pl: $unstemmed\n";
+
+# catalog the unstemmed forms each stemmed phrase is derived from
+open(S, "<$stemmed");
+open(U, "<$unstemmed");
+
+while (<S>) {
+    chop($s = $_);
+    chop($u = <U>);
+    $f{$s}{$u}++;
+}
+close(S);
+close(U);
+
+# move the old ustemmed file out of the way
+`mv $unstemmed $unstemmed.old`;
+
+# make a new unstemmed file
+open(S, "<$stemmed");
+open(U, ">$unstemmed");
+
+while (<S>) {
+
+    chop($s = $_);
+    @variations = keys(%{$f{$s}});
+    # print "$s: ", join( ", ", @variations), "\n";
+
+    # print the best variation on the phrase
+
+    # if we have seen the phrase before, use the same form
+    if (defined($canon{$s})) {
+	# print "  CANON: $canon{$s}";
+
+    # if there is only one form of this phrase, use it
+    } elsif ($#variations == 0) {
+	# if it is in Initial Caps mark it as a proper-noun
+       
+	if ($variations[0] =~ /^[A-Z][^A-Z ]+$/) {
+	    # this is a proper-noun (one word, initial capitals)
+	    # print "  PROPERNOUN ($f{$s}{$variations[0]}): PN-$variations[0]";
+	    $canon{$s} = "PN-$variations[0]";
+	} else {
+	    # use lowercase
+	    # print "  SOLO ($f{$s}{$variations[0]}): ", $variations[0];
+	    $canon{$s} = $variations[0];
+	}
+    
+    # make sure we print some form of each phrase
+    } else {
+	$most = 0;
+	$best = (); 
+	foreach $v (@variations) {
+	    if ($f{$s}{$v} > $most) {
+		$most = $f{$s}{$v};
+		$best = $v;
+	    }
+	    # print "    $v\t$f{$s}{$v}\n";
+	}
+	# print "  FIRST: $variations[0]\n";
+	# print "  MOST ($most): $best";
+
+	# if the phrase is a single word and $mark_common_capitals = 1
+	# then we may want to mark this as a proper-noun.
+	if ($mark_common_capitals && ($best =~ /^[A-Z][^A-Z ]+$/)) {
+	    # this is a proper-noun (one word, initial capitals)
+	    $best = "PN-$best";
+	    # print "$best\n";
+	}
+
+	$canon{$s} = $best;
+    }
+    # print "\n";
+    print U "$canon{$s}\n";
+}
+close(U);
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-tidy-key-file.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-tidy-key-file.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/kea-tidy-key-file.pl	(revision 21083)
@@ -0,0 +1,46 @@
+#!/usr/bin/perl -w
+
+#    kea-tidy-key-file.pl
+#    Version 1.1
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0   Witten et.al.
+# 1.1   First Distribution.  GPL added.
+
+# kea-tidy-key-file.pl reads a list of keyphrases (one per line 
+# from STDIN) and tidies them up and writes them to STDOUT.
+# Intended for use with .key and .kea files.
+
+while (<>) {
+
+    # delete apostrophy
+    s/\'//g;
+    # remove non-alphanumeric characters
+    s/[^A-Za-z0-9\. ]/ /g;
+    # squash and trim whitespace
+    s/^\s+//g;
+    s/\s+$//g;
+    s/\s+/ /g;
+    if ($_ ne "") {
+	print lc($_), "\n";
+    }
+}
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses-all-txt-files.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses-all-txt-files.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses-all-txt-files.pl	(revision 21083)
@@ -0,0 +1,47 @@
+#!/usr/bin/perl -w
+
+#    prepare-clauses-all-text-files.pl
+#    Version 1.1
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0   Witten et.al.
+# 1.0.1 Check parameters
+# 1.0.2 Use "perl -w' to run prepare-clauses.pl
+# 1.1   First Distribution.  GPL added.
+
+if (!$ARGV[0]) {
+    die "Usage: prepare-clauses-all-text-files.pl <directory>\n";
+}
+
+$directory = $ARGV[0];
+$directory =~ s/\/$//;
+
+$documents = `find $directory/ -name "*.txt"`;
+@documents = split(/\s+/, $documents);
+
+foreach $in (@documents) {
+    ($out) = $in =~ /(.+).txt/;
+    $out .= ".clauses";
+
+    `perl -w prepare-clauses.pl $in $out`;
+}
+
Index: /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses.pl
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea-1.1.4/prepare-clauses.pl	(revision 21083)
@@ -0,0 +1,125 @@
+#!/usr/bin/perl -w
+
+#    prepare-clauses.pl
+#    Version 1.1
+
+#    Kea -- Automatic Keyphrase Extraction
+#    Copyright 1998-1999 by Gordon Paynter and Eibe Frank
+#    Contact gwp@cs.waikato.ac.nz or eibe@cs.waikato.ac.nz
+#
+#    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.
+
+# Version history
+#
+# 1.0   Witten et.al.
+# 1.0.1 Bug: Sentences ending in ".)" 
+# 1.0.2 Bug: Sentences ending in ".'" and so on have the same problem.
+# 1.0.3 All "." chanracters removed from the start of tokens.
+# 1.1   First Distribution.  GPL added.
+
+if (!$ARGV[0] || !$ARGV[1]) {
+    die "usage: gf-prepare-text.pl <input-text> <output-tagged>\n";
+}
+
+$infile = $ARGV[0];
+$outfile = $ARGV[1];
+
+print "prepare-clauses.pl\n";
+print "Input text: $infile\n";
+print "Output clauses: $outfile\n";
+
+open(IN, "<$infile");
+open(OUT, ">$infile.1");
+
+
+# step 1: put every sentence on a new line.
+
+while (<IN>) {
+
+    # remove hyphens at end of line
+    s/\-\s+$//;
+
+    # replace \n and other whitespace with space
+    s/\s+/ /g;
+    # one sentence per line
+    s/[\.\!\?][^A-Za-z0-9]+/. /g; 
+    s/[\.\!\?] +/\ \n/g;
+
+    # space out the punctuation
+    # double-hyphens (equivilent to an M-dash) replaced with a clause breaker
+    s/\-\-/ : /g;
+    # delete apostrophe marks
+    s/\'//g;
+    # remove all "." charactersfrom the start of a token
+    s/ \./ /g;
+
+    # space out any other character that is not something we are interested in
+    s/([^\w\.\n])/ $1 /g;
+    # allow for underscore, which perl considers a "word" character
+    s/_/ _ /g;
+
+    # squeeze spaces
+    s/\ +/ /g;
+    s/^\ //g;
+    
+    # put a fullstop at the end of each line/sentence
+    s/\n/.\n/g;
+
+    # print
+    if ($_ =~ /./) {
+	print OUT "$_";
+    } else {
+	print OUT ".\n";
+    }
+
+}
+close(IN);
+close(OUT);
+
+# step 2: the tagger
+# `tag $infile.lines > $infile.tagged`;
+
+# step 3: put a clause on each line and get rid of punctuation
+
+open(IN, "<$infile.1");
+open(OUT, ">$infile.2");
+
+while (<IN>) {
+
+    @words = split(/\s+/, $_);
+    foreach $w (@words) {
+	if ($w =~ /^[\:\;\,\[\]\{\}\(\)]$/) {
+	    # print new line for clause breakers (. and ? and ! done above)
+	    print OUT "\n";
+	} elsif (($w =~ /^\d+$/) || ($w =~ /^\d+\.\d+$/)) {
+	    # "pure" numbers are clause breakers
+	    print OUT "\n";
+	} elsif ($w =~ /[A-Za-z]/) {
+	    # print anything that contains at least one letter
+	    print OUT " $w";
+	} else {
+	    # simply ignore whatever is left over
+	}
+    }
+    print OUT "\n";
+}
+close(IN);
+close(OUT); 
+
+# step 4: pretty things up a tad
+
+`cat $infile.2 | perl -ne "s/^ +//g; print;" | tr -s '\n' > $outfile`;
+
+`rm $infile.1 $infile.2`;
Index: /main/tags/2.38/gsdl/perllib/Kea.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/Kea.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/Kea.pm	(revision 21083)
@@ -0,0 +1,84 @@
+package Kea;
+
+# This function is called by BasPlug.pm when a flag in a collection
+# configuration document specifies that keyphrase metadata must be gathered for
+# that collection.
+# It is passed as arguments, the documents text and possibly some options for
+# how the keyphrase data is to be collected if the keyphrase option flag was
+# set in the collection configuration file.  This module then writes the
+# documents text to a file because the stand-alone program Kea which will be
+# called to do the actual extraction of the keyphrases expects a file argument.
+# Once Kea has been called upon, the file containing the keyphrase data
+# gathered by Kea should be stored in gsdl/tmp and this file is read, the data
+# we are interested in is extracted and passed back to BasPlug.pm in an
+# appropriate format.
+
+sub extract_KeyPhrases {
+
+    my $gsdlhome = $ENV{'GSDLHOME'}; 
+    my $doc = shift(@_); #documents text  
+    my $args = shift(@_); #any options
+    my @optionlist = split(/ +/, $args) if (defined($args)); #list of options
+    my $suffix = 'kea'; #default file will be called .kea
+    my $command = ""; 
+    my @keylist; 
+    my @stemlist;
+
+    print STDERR "optionlist: @optionlist\n";
+       
+    foreach $element (@optionlist){ #for each option
+	my ($option, $file) = split(/,/, $element); #split option letter and file (if file exist)
+
+	$option  = "-".$option; #place dash in front of option
+	$file = "" if(!defined($file)); #no file options specified
+	$suffix = $file if($option eq '-E'); #if option is extension (suffix) option
+	$command .= " $option $file "; #add to list of commands
+    }
+
+    print STDERR "Using output suffix: $suffix\n"; 
+
+    # remove all HTML tags
+    $doc =~ s/<P[^>]*>/\n/sgi;
+    $doc =~ s/<H[^>]*>/\n/sgi;
+    $doc =~ s/<[^>]*>//sgi;
+    $doc =~ tr/\n/\n/s;
+
+    #write text to a file eg doc.txt 
+    open(OUT, ">$gsdlhome/tmp/doc.txt") or die "In Kea.pm doc.txt could not be created\n";  
+    print OUT $doc;
+    close(OUT);
+
+    #call Kea with specifed options
+    `$gsdlhome/perllib/Kea-1.1.4/Kea $command $gsdlhome/tmp/doc.txt`; 
+
+    #read doc.kea with keywords
+    open(IN, "<$gsdlhome/tmp/doc.$suffix") or return @emptykeylist;
+                                          #this means doc.kea does not exist
+                                          #either because an option was wrongly specified
+	                                  #or no keyphrases were found
+    while(<IN>){
+	chomp;
+	@key = split(/\t/); #split into array separated by a tab
+	push(@keylist, $key[0]); #add to list of keywords
+	push(@stemlist, $key[1]); #add to list of stems  
+    }
+    close(IN);
+
+    #put data into appropriate format 
+    $keylist = join(", ", @keylist);
+    $stemlist = join(", ", @stemlist);	
+ 
+    #delete doc.extension so that in future it will not be opened and read
+    `rm $gsdlhome/tmp/doc.$suffix`;
+
+    #return keywords + stems to basplug
+    my @keystemlist = ($keylist, $stemlist);
+    return @keystemlist;
+
+}
+
+
+
+1;
+
+
Index: /main/tags/2.38/gsdl/perllib/acronym.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/acronym.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/acronym.pm	(revision 21083)
@@ -0,0 +1,697 @@
+##########################################################################
+#
+# acronym.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+#    class to handle acronyms
+###########################################################################
+
+use diagnostics;
+
+package acronym;
+
+###########################################################################
+#    global variables
+###########################################################################
+# valiables to control the recall/precision tradeoff
+
+#the maximum range to look for acronyms 
+my $max_offset = 30;
+#acronyms must be upper case
+my $upper_case = 1;
+#acronym case must match
+my $case_match = 1;
+#minimum acronym length
+my $min_def_length = 3;
+#minimum acronym length
+my $min_acro_length = 3;
+#minimum acronym length saving
+my $min_length_saving = 4;
+#allow recusive acronyms
+my $allow_recursive = 0;
+#let definitions be all capitals
+my $allow_all_caps = 0;
+
+my @stop_words = split / /, "OF AT THE IN TO AND";
+
+#the text split into an array, one word per element
+my @split_text = ();
+my @acronym_list = ();
+
+#the file to collate acronyms into
+my $acronym_accumulate_file = $ENV{'GSDLCOLLECTDIR'} . "/etc/acronym_definitions.pm";
+my $acronym_options_file = $ENV{'GSDLCOLLECTDIR'} . "/etc/acronym_options.pm";
+
+my %acronyms_found_in_collection = ();
+my %acronyms_banned_from_collection = ();
+
+my $writing_acronyms = 1;
+my $accumulate_acronyms = 1;
+my $markup_accumulate_acronyms = 1;
+my $markup_local_acronyms = 1;
+
+
+
+###########################################################################
+#   file saving / loading stuff
+###########################################################################
+
+sub initialise_acronyms {
+
+    my $local_max_offset = $max_offset;
+    my $local_upper_case = $upper_case;
+    my $local_case_match = $case_match ;
+    my $local_min_def_length = $min_def_length;
+    my $local_min_acro_length = $min_acro_length;
+    my $local_min_length_saving = $min_length_saving;
+    my $local_allow_recursive = $allow_recursive;
+    my $local_allow_all_caps = $allow_all_caps;
+    my @local_stop_words = @stop_words;
+    my $local_acronym_accumulate_file = $acronym_accumulate_file;
+    
+    
+    my $file_text = "";
+    if (open ACRONYM_HANDLE, "<$acronym_options_file")
+    {
+	$file_text = do { local $/; <ACRONYM_HANDLE> };  
+    }
+    if ($file_text eq "")
+    {
+	print STDERR "failed to open $acronym_options_file\n";
+	open ACRONYM_HANDLE, ">$acronym_options_file\n";
+	print ACRONYM_HANDLE "#Config file for acronym extraction. EDIT THIS FILE, it should\n";
+	print ACRONYM_HANDLE "#not be overridden by the software. It's read by GSDL using perl's\n";
+	print ACRONYM_HANDLE "#'eval' function, so pretty much anything that's valid in perl is \n";
+	print ACRONYM_HANDLE "#valid here.\n\n";
+	print ACRONYM_HANDLE "#Quite a few things here are defined in terms of recall and precision\n";
+	print ACRONYM_HANDLE "#which are the key measures from Information Retreval (IR). If you\n";
+	print ACRONYM_HANDLE "#don't understand recall and precision, any good IR textbook should\n";
+	print ACRONYM_HANDLE "#explain them fully \n\n";
+	print ACRONYM_HANDLE "#the maximum range to look for acronyms (raise to raise precision)\n"; 
+	print ACRONYM_HANDLE "\$local_max_offset = $max_offset;\n\n"; 
+	print ACRONYM_HANDLE "#acronyms must be upper case (0 = false, 1 = true (high precision))\n";
+	print ACRONYM_HANDLE "\$local_upper_case = $upper_case;\n\n";
+	print ACRONYM_HANDLE "#acronym case must match (0 = false, 1 = true (high precision))\n";
+	print ACRONYM_HANDLE "\$local_case_match = $case_match;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_def_length = $min_def_length;\n\n";
+	print ACRONYM_HANDLE "#let definitions be all capitals\n";
+	print ACRONYM_HANDLE "\$local_allow_all_caps = $allow_all_caps;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_acro_length = 3;\n\n";
+	print ACRONYM_HANDLE "#minimum acronym length saving (raise to raise precision)\n";
+	print ACRONYM_HANDLE "\$local_min_length_saving = 4;\n\n";
+	print ACRONYM_HANDLE "#allow recusive acronyms (0 = false (high precision), 1 = true)\n";
+	print ACRONYM_HANDLE "\$local_allow_recursive = 0;\n\n";
+	print ACRONYM_HANDLE "#stop words-words allowed in acronyms (the multi-lingual version\n";
+	print ACRONYM_HANDLE "#slows down acronym extraction slightly so is not the default)\n";
+	print ACRONYM_HANDLE "#\@local_stop_words = split / /, \"A OF AT THE IN TO AND VON BEI DER DIE DAS DEM DEN DES UND DE DU A LA LE LES L DANS ET S\";\n";
+	print ACRONYM_HANDLE "\@local_stop_words = split / /, \"OF AT THE IN TO AND\";\n"; 
+	print ACRONYM_HANDLE "\n"; 
+	print ACRONYM_HANDLE "#the file to collate acronyms into\n";
+	print ACRONYM_HANDLE "\$local_acronym_accumulate_file = \$ENV{'GSDLCOLLECTDIR'} . \"/etc/acronym_definitions.pm\";\n";
+	print ACRONYM_HANDLE "\n";
+	print ACRONYM_HANDLE "# any acronym definitions which should always be marked up can be copied here\n";
+	print ACRONYM_HANDLE "# from the acronym_accumulate_file file ...\n";
+	print ACRONYM_HANDLE "# \n";
+	print ACRONYM_HANDLE "# \n";
+	print ACRONYM_HANDLE "# \n";
+	print STDERR "written new options file to $acronym_options_file...\n";
+    } else {
+	print STDERR "read file $acronym_options_file...\n";
+	eval $file_text ;
+	warn $@ if $@;
+	print STDERR "evaluated file $acronym_options_file...\n";
+    }
+
+    $max_offset = $local_max_offset;
+    $upper_case = $local_upper_case;
+    $case_match = $local_case_match ;
+    $min_def_length = $local_min_def_length;
+    $min_acro_length = $local_min_acro_length;
+    $min_length_saving = $local_min_length_saving;
+    $allow_recursive = $local_allow_recursive;
+    $allow_all_caps = $local_allow_all_caps;
+    @stop_words = @local_stop_words;
+    
+    $local_acronym_accumulate_file = $local_acronym_accumulate_file;
+    
+
+    &read_all_acronyms_from_file();
+#    rename $acronym_file, $acronym_file . "." . int(rand (2<<7)). 
+#	int(rand (2<<7)). int(rand (2<<7)). int(rand (2<<7));
+    if ($writing_acronyms && open ACRONYM_HANDLE, ">$acronym_accumulate_file")
+    {
+	print ACRONYM_HANDLE "#This is an automatically generated file.\n";
+	print ACRONYM_HANDLE "#\n";
+	print ACRONYM_HANDLE "#If you edit this file and it will be overwritten the next\n";
+	print ACRONYM_HANDLE "#time the acronym code runs unless you set the file to \n";
+	print ACRONYM_HANDLE "#read-only. \n";
+	print ACRONYM_HANDLE "#\n";
+	print ACRONYM_HANDLE "#start of acronyms...\n";
+	$writing_acronyms = 1;
+    } else {
+	warn "failed to open $acronym_accumulate_file for writing\n";
+	$writing_acronyms = 0;
+    }
+}
+
+#close the list of accumulated acronyms
+sub finalise_acronyms {
+    if ($writing_acronyms)
+    {
+	print ACRONYM_HANDLE "#end of acronyms.\n";  
+	close ACRONYM_HANDLE;
+    }
+}
+
+#eval a file of accumulated acronyms
+sub read_all_acronyms_from_file {
+    
+    my $file_text = " ";
+    if (open ACRONYM_HANDLE, "<$acronym_accumulate_file")
+    {
+	$file_text = do { local $/; <ACRONYM_HANDLE> };  
+    } else {
+	print STDERR "failed to open $acronym_accumulate_file for reading (this is the first pass?).\n";
+    }
+    eval $file_text;
+    #promotes warnings/errors from evaluated file to current context 
+    warn $@ if $@;
+}
+
+#called from within the file of accumulated acronyms to indicate a good acronym
+sub add {
+    my $self = shift (@_);
+    if (defined ($acronyms_found_in_collection{$self->[0]}))
+    {
+	my $def = $self->to_def_string();
+	if ($acronyms_found_in_collection{$self->[0]} =~ m/(^|\|)$def(\||$)/)
+	{
+	    return;
+	}
+	$acronyms_found_in_collection{$self->[0]} = 
+	    $acronyms_found_in_collection{$self->[0]} . "|" . $self->to_def_string();
+    } else {
+	$acronyms_found_in_collection{$self->[0]} = $self->to_def_string();
+    }
+}
+
+#called from within the file of accumulated acronyms to indicate a bad acronym
+sub ban {
+    my $self = shift (@_);
+    
+    if (!defined $acronyms_banned_from_collection{$self->[0]})
+    {
+	$acronyms_banned_from_collection{$self->[0]} = $self->to_def_string();
+    } else {
+	$acronyms_banned_from_collection{$self->[0]} = $acronyms_banned_from_collection{$self->[0]} . "|" . $self->to_def_string();
+    }
+}
+
+
+#write a good acronym to the accumulated acronyms file
+sub write_to_file {
+    my $self = shift (@_);
+    if ($writing_acronyms)
+    {
+	print ACRONYM_HANDLE "new acronym(\"$self->[0]\",\"" . 
+	    $self->to_def_string() . 
+		"\")->add();\n";
+    }
+}
+
+
+###########################################################################
+# mark functionality    
+###########################################################################
+
+#small routine to sort by length 
+sub sort_by_length {
+    length($b) <=> length($a) or $a cmp $b
+}
+
+sub markup_acronyms {
+    my  $text = shift (@_);
+    my  $verbosity_obj = shift (@_);
+    if (defined $text)
+    {
+	for my $acro (sort sort_by_length keys %acronyms_found_in_collection)
+	{
+	    $text  =~ s/^((?:[^\<\n]|(?:\<[^\>\n]*\>))*)$acro([^\<A-Z])/$1$acro\<img src=\"\" width=8 height=8 alt=\"$acronyms_found_in_collection{$acro}\"\>$2/gm;
+	    printf STDERR " " .  $acro . ","
+		if ($verbosity_obj->{'verbosity'} >= 2);
+	}
+    }
+    return $text;
+}
+
+
+
+###########################################################################
+#    member functions 
+###########################################################################
+
+
+sub new {
+    my $trash = shift (@_); 
+    my $acro = shift (@_); 
+    my $def  = shift (@_); 
+    
+    my $self = [
+		"", # 0 acronym
+		[], # 1 definition
+               ];
+    
+    $self->[0] = $acro                    if defined $acro;
+    push @{$self->[1]},  split / /, $def  if defined $def;
+    
+    bless $self;
+}
+
+sub clone  {
+    my $self = shift (@_);
+
+    my $copy = new acronym;
+
+    $copy->[0] = $self->[0];
+    push @{$copy->[1]}, @{$self->[1]};
+    bless $copy;
+
+    return $copy;
+}
+
+#return the acronym
+sub to_acronym {
+    my $self = shift (@_);
+    my @array = @{$self->[1]};
+
+    return $self->[0];
+}
+
+#return the number of words in the acronym definition
+sub words_in_acronym_definition {
+    my $self = shift (@_);
+    my @array = @{$self->[1]};
+
+    return $#array + 1;
+}
+
+#return the number of letters in the acronym definition
+sub letters_in_acronym_definition {
+    my $self = shift (@_);
+
+    return length($self->to_def_string());
+}
+
+#return the number of letters in the acronym definition
+sub letters_in_acronym {
+    my $self = shift (@_);
+
+    return length($self->to_acronym());
+}
+
+#return the acronym definition
+sub to_def_string {
+    my $self = shift (@_);
+
+    my $result = "";
+
+    # do the definition
+    my @array = @{$self->[1]};
+    my $i = 0;
+    while ($i <= $#array)
+    {
+	$result = $result . $array[$i];
+
+	if ($i+1 <= $#array)
+	{
+	    $result = $result . " ";
+	}
+	$i++;
+    }
+    return $result;
+}
+
+
+#print out the kwic for the acronym
+sub to_string_kwic {
+    my $self = shift (@_);
+
+    # the list of all possible combinations
+    my @list = ();
+
+    my $result = "";
+
+    my $j = 0;
+    my @array = @{$self->[1]};
+    while ($j <= $#array)
+    {
+
+	# do the definition
+	my $i = 0;
+
+	#add the key word
+	$result = "<td halign=left>"  . $array[$j] . "</td><td halign=right>";
+
+	#add the proceeding words
+	while ($i < $j)
+	{
+	    $result = $result .  $array[$i] . " ";
+	    $i++;
+	}
+	#add the key word
+	$result = $result . "</td><td halign=left>"  . $array[$j] . 
+	    "</td><td halign=left>";
+
+	#add the trailing words
+	$i++;
+	while ($i <= $#array )
+	{
+	    $result = $result .  $array[$i] . " ";
+	    $i++;
+	}
+
+	#add the actual acronym
+
+	$result = $result . "</td><td halign=left>" . $self->[0] . "</td>";
+
+	push @list, $result;
+	$j++;
+    }
+    return @list;
+}
+
+#this is the one used when building the collection ...
+sub to_string {
+    my $self = shift (@_);
+
+    my $result = $self->[0] . " ";
+
+    # do the definition
+    my @array = @{$self->[1]};
+    my $i = 0;
+    while ($i <= $#array)
+    {
+	$result = $result . $array[$i];
+	if ($i+1 <= $#array)
+	{
+	    $result = $result . " ";
+	}
+	$i++;
+    }
+    return $result;
+}
+
+sub check {
+    my $self = shift (@_);
+
+    if (length($self->to_acronym()) < $min_acro_length) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short I)\n";
+	return 0;
+    }
+    if ($self->words_in_acronym_definition() < $min_def_length) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short II)\n";
+	return 0;
+    }
+    if ($min_length_saving * $self->letters_in_acronym() > 
+	$self->letters_in_acronym_definition()) 
+    {
+#	print "acronym " . $self->to_string() . " rejected (too short III)\n";
+#	print "" . $min_length_saving .
+#	    "|" . $self->letters_in_acronym() .
+#	    "|" . $self->letters_in_acronym_definition() . "\n";
+	return 0;
+    }
+    if (!$allow_all_caps && 
+	$self->to_def_string() eq uc($self->to_def_string()))
+    {
+#	print "acronym " . $self->to_string() . " rejected (all upper)\n";
+	return 0;
+    }
+    if (!$allow_all_caps)
+    {
+	my $upper_count = 0;
+	my $lower_count = 0;
+	my @letters = $self->to_def_string();
+	for my $letter (split //, $self->to_def_string())
+	{
+	    if ($letter eq uc($letter))
+	    { 
+		$upper_count++;
+	    } else {
+		$lower_count++;
+	    }		
+	}
+	return 0 if ($upper_count > $lower_count);
+    }
+    if (!$allow_recursive && $self->to_def_string() =~ /$self->to_acronym()/i )
+    {
+	return 0;
+    }
+#    print "acronym " . $self->to_string() . " not rejected\n";
+    return 1;
+}
+
+###########################################################################
+#    static functions 
+###########################################################################
+
+sub recurse {
+    my ($acro_offset,       #offset of word we're finding acronyms for
+	$text_offset,       
+	$letter_offset, 
+	@def_so_far) = @_;
+
+    my $word = $split_text[$text_offset];
+    my $acro = $split_text[$acro_offset];
+    $word = "" if !defined $word;
+    $acro = "" if !defined $acro;
+    
+#    print "recurse(" . $acro_offset . ", " . $text_offset . ", " . 
+#	$letter_offset  . ", " . @def_so_far . ")\n";
+
+    #check for termination ...
+    if ($letter_offset >= length($acro))
+    {	
+	my $acronym = new acronym();
+	$acronym->[0] = $acro;
+	push @{$acronym->[1]}, @def_so_far;
+	if ($acronym->check())
+	{
+	    push @acronym_list, ( $acronym );
+	}
+#	print "acronym created\n";
+	return;
+    }
+    #check for recursion
+    if (!$allow_recursive)
+    {
+	if ($word eq $acro)
+	{
+#	    print "recursion detected\n";
+	    return;
+	}
+    }
+    
+    #skip a stop-word
+    my $i = 0;
+    if ($letter_offset != 0)
+    {
+	while ($i <= $#stop_words)
+	{
+	    if ($stop_words[$i] eq uc($word))
+	    {
+#	    print "::found stop word::" . $stop_words[$i] . "\n";
+		&recurse($acro_offset,
+			 $text_offset+1,
+			 $letter_offset,
+			 @def_so_far, $word);
+	    }
+	    $i++;
+	}
+    }
+    $i = 1;
+    #using the first $i letters ...
+    while ($letter_offset+$i <= length($acro) )
+    {
+#	print "". ((substr $word, 0, $i) . " " . 
+#	    (substr $acro, $letter_offset, $i) . "\n");
+	if (((!$case_match) &&
+	     (uc(substr $word, 0, $i) eq
+	      uc(substr $acro, $letter_offset, $i)))
+	    ||
+	    (($case_match) &&
+	     ((substr $word, 0, $i) eq
+	      (substr $acro, $letter_offset, $i))))
+	{
+#	    print "::match::\n";
+#	    print "" . ((substr $word, 0, $i) . " " . 
+#		   (substr $acro, $letter_offset, $i) . "\n");
+	    &recurse($acro_offset,
+		     $text_offset+1,
+		     $letter_offset+$i,
+		     @def_so_far, $word);
+	} else {
+	    return;
+	}	    
+	$i++;
+    }
+    return;
+}
+
+#the main
+sub acronyms {
+    #clean up the text
+    my $processed_text =  shift @_;
+    $$processed_text =~ s/<[^>]*>/ /g;
+    $$processed_text =~ s/\W/ /g;
+    $$processed_text =~ s/[0-9_]/ /g;
+    $$processed_text =~ s/\s+/ /g;
+    $$processed_text =~ s/(\n|\>)References.*/ /i;
+    $$processed_text =~ s/(\n|\>)Bibliography.*/ /i;
+    $$processed_text =~ s/(\n|\>)(Cited Works?).*/ /i;
+    $$processed_text =~ s/(\n|\>)(Works? Cited).*/ /i;
+
+    #clear some global variables
+    @split_text = ();
+    @acronym_list = ();
+
+    return &acronyms_from_clean_text($processed_text);
+}
+
+sub acronyms_from_clean_text {
+    my ($processed_text) = @_;
+
+    @split_text = split / /, $$processed_text;
+
+#    my $i = 0;
+#    while ($i <= $#split_text)
+#    {
+#	print $split_text[$i] . "\n";
+#	$i++;
+#    }
+
+    my $first = 0;
+    my $last = $#split_text +1;
+    my $acro_counter = $first;
+    
+    while ($acro_counter < $last)
+    {
+	my $word = $split_text[$acro_counter];
+
+	if ((!$upper_case) ||
+	    (uc($word) eq $word))
+	{
+	    
+	    if (length $word >= $min_acro_length)
+	    {
+		my $def_counter = 0;
+		if ($acro_counter - $max_offset > 0)
+		{
+		    $def_counter = $acro_counter - $max_offset;
+		}
+		my $local_last = $acro_counter  + $max_offset;
+		if ($local_last > $last)
+		{
+		    $local_last = $last;
+		}
+		while ($def_counter <= $local_last)
+		{
+		    &recurse($acro_counter,$def_counter,0,());
+		    $def_counter++;
+		}
+	    }
+	}
+	$acro_counter++;
+    }
+
+    return \@acronym_list;
+}
+
+
+
+sub test {
+
+#    my $blarg = new acronym();
+#    my $simple;
+#    $simple = 10;
+#    $blarg->initialise($simple, $simple, $simple);
+#    my $blarg2 = $blarg->clone();
+#    print $blarg->to_string();
+#    print $blarg2;
+#    print "\n";
+#    
+    my $tla = new acronym();
+    $tla->[0] = "TLA";
+
+    my @array = ("Three", "Letter", "Acronym");
+#    my $i = 0;
+#    while ($i <= $#array)
+#    {
+#	print @array[$i] . "\n";
+#	$i++;
+#    }
+
+    print "\n";
+    push @{$tla->[1]}, ("Three" );
+    push @{$tla->[1]}, ("Letter" );
+    push @{$tla->[1]}, ("Acronym" );
+    print $tla->to_string(). "\n";
+    print "\n";
+    print "\n";
+    my $tla2 = $tla->clone();
+    push @{$tla2->[1]}, ("One");
+    push @{$tla2->[1]}, ("Two");
+    $tla2->[0] = "ALT";
+    print $tla->to_string(). "\n";
+    print $tla2->to_string(). "\n";
+
+    print "\n";
+    print "\n";
+
+    print "Testing recursion ...\n";
+    my $acros = &acronyms("TLA Three Letter Acronym in tla TlA");
+    
+    foreach my $acro (@$acros)
+    {
+	if ($acro->check)
+        {
+           print "accepted: " .$acro->to_string() . "\n";
+#           print "|" .  $acro->to_acronym() . "|" .  $acro->to_def_string() .
+#              "|" .  $acro->words_in_acronym_definition() .
+#              "|" .  $acro->letters_in_acronym_definition() . 
+#              "|" .  $acro->letters_in_acronym() . "|\n";
+        } else {
+#          print "found but rejected: " .$acro->to_string() . "\n";
+        }
+    }
+}
+
+#uncomment this line to test this package
+#&test();
+
+1;
+
+
Index: /main/tags/2.38/gsdl/perllib/arcinfo.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/arcinfo.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/arcinfo.pm	(revision 21083)
@@ -0,0 +1,164 @@
+###########################################################################
+#
+# arcinfo.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 module stores information about the archives. At the moment
+# this information just consists of the file name (relative to the
+# directory the archives information file is in) and its OID.
+
+# This module assumes there is a one to one correspondance between
+# a file in the archives directory and an OID.
+
+
+package arcinfo;
+
+sub new {
+    my ($class) = @_;
+    my $self = {'info'=>{},
+		'order'=>[]};
+
+    return bless $self, $class;
+}
+
+sub load_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    $self->{'info'} = {};
+
+    if (-e $filename) {
+	open (INFILE, $filename) || 
+	    die "arcinfo::load_info couldn't read $filename\n";
+
+	my ($line, @line);
+	while (defined ($line = <INFILE>)) {
+	    $line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	    @line = split ("\t", $line); # filename, 
+	    if (scalar(@line) >= 2) {
+		$self->add_info (@line);
+	    }
+	}
+
+	close (INFILE);
+    }
+}
+
+sub save_info {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($OID, $info);
+
+    open (OUTFILE, ">$filename") || 
+	die "arcinfo::save_info couldn't write $filename\n";
+
+    foreach $info (@{$self->get_OID_list()}) {
+	if (defined $info) {
+	    print OUTFILE join("\t", @$info), "\n";
+	}
+    }
+    
+    close (OUTFILE);
+}
+
+sub delete_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	delete $self->{'info'}->{$OID};
+	
+	my $i = 0;
+	while ($i < scalar (@{$self->{'order'}})) {
+	    if ($self->{'order'}->[$i]->[0] eq $OID) {
+		splice (@{$self->{'order'}}, $i, 1);
+		last;
+	    }
+	    
+	    $i ++;
+	}
+    }
+}
+
+sub add_info {
+    my $self = shift (@_);
+    my ($OID, $doc_file, $sortmeta) = @_;
+    $sortmeta = "" unless defined $sortmeta;
+
+    $self->delete_info ($OID);
+    $self->{'info'}->{$OID} = [$doc_file];
+    push (@{$self->{'order'}}, [$OID, $sortmeta]);
+}
+
+# returns a list of the form [[OID, doc_file], ...]
+sub get_OID_list {
+    my $self = shift (@_);
+
+    my ($OID);
+    my @list = ();
+
+    foreach $OID (sort {$a->[1] cmp $b->[1]} @{$self->{'order'}}) {
+	push (@list, [$OID->[0], $self->{'info'}->{$OID->[0]}->[0]]);
+    }
+
+    return \@list;
+}
+
+# returns a list of the form [[doc_file, OID], ...]
+sub get_file_list {
+    my $self = shift (@_);
+
+    my ($OID);
+    my @list = ();
+
+    foreach $OID (sort {$a->[1] cmp $b->[1]} @{$self->{'order'}}) {
+	push (@list, [$self->{'info'}->{$OID->[0]}->[0], $OID->[0]]);
+    }
+
+    return \@list;
+}
+
+
+# returns a list of the form [doc_file]
+sub get_info {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    if (defined $self->{'info'}->{$OID}) {
+	return $self->{'info'}->{$OID};
+    }
+
+    return undef;
+}
+
+
+# returns the number of documents so far
+sub size {
+    my $self = shift (@_);
+    return (scalar(@{$self->{'order'}}));
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/cfgread.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/cfgread.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/cfgread.pm	(revision 21083)
@@ -0,0 +1,165 @@
+###########################################################################
+#
+# cfgread.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# reads in configuration files
+
+package cfgread;
+
+
+sub read_cfg_line {
+    my ($handle) = @_;
+    my $line = "";
+    my @line = ();
+    my $linecontinues = 0;
+
+    while (defined($line = <$handle>)) {
+	$line =~ s/^\#.*$//;   # remove comments
+	$line =~ s/\cM|\cJ//g; # remove end-of-line characters
+	$line =~ s/^\s+//;     # remove initial white space
+	$linecontinues = $line =~ s/\\$//;
+	while ($line =~ s/\s*(\"[^\"]*\"|\'[^\']*\'|\S+)\s*//) {
+	    if (defined $1) {
+		# remove any enclosing quotes
+		my $entry = $1;
+		$entry =~ s/^([\"\'])(.*)\1$/$2/;
+
+		# substitute an environment variables
+		$entry =~ s/\$(\w+)/$ENV{$1}/g;
+		$entry =~ s/\$\{(\w+)\}/$ENV{$1}/g;
+
+		push (@line, $entry);
+	    } else {
+		push (@line, "");
+	    }
+	}
+
+	if (scalar(@line) > 0 && !$linecontinues) {
+#	    print STDERR "line: \"" . join ("\" \"", @line) . "\"\n";
+	    return \@line;
+	}
+    }
+
+    return undef;
+}
+
+sub write_cfg_line {
+    my ($handle, $line) = @_;
+    print $handle join ("\t", @$line), "\n";
+}
+
+
+# stringexp, arrayexp, hashexp,arrayarrayexp and hashhashexp
+# should be something like '^(this|that)$'
+sub read_cfg_file {
+    my ($filename, $stringexp, $arrayexp, $hashexp, $arrayarrayexp,
+	$hashhashexp) = @_;
+    my ($line);
+    my $data = {};
+
+    if (open (COLCFG, $filename)) {
+	while (defined ($line = &read_cfg_line('COLCFG'))) {
+	    if (scalar(@$line) >= 2) {
+		my $key = shift (@$line);
+		if (defined $stringexp && $key =~ /$stringexp/) {
+		    $data->{$key} = shift (@$line);
+
+		} elsif (defined $arrayexp && $key =~ /$arrayexp/) {
+		    push (@{$data->{$key}}, @$line);
+
+		} elsif (defined $hashexp && $key =~ /$hashexp/) {
+		    my $k = shift @$line;
+		    my $v = shift @$line;
+		    $data->{$key}->{$k} = $v;
+		} elsif (defined $arrayarrayexp && $key =~ /$arrayarrayexp/) {
+		    if (!defined $data->{$key}) {
+			$data->{$key} = [];
+		    }
+		    push (@{$data->{$key}}, $line);
+		}
+		elsif (defined $hashhashexp && $key =~ /$hashhashexp/) {
+		    my $k = shift @$line;
+		    my $p = shift @$line;
+		    my $v = shift @$line;
+		    if (!defined $v) {
+			$v = $p;
+			$p = 'default';
+		    }
+		    $data->{$key}->{$k}->{$p} = $v;
+		}
+	    }
+	}
+	close (COLCFG);
+
+    } else {
+	print STDERR "cfgread::read_cfg_file couldn't read the cfg file $filename\n";
+    }
+
+    return $data;
+}
+
+
+# stringexp, arrayexp, hashexp and arrayarrayexp 
+# should be something like '^(this|that)$'
+sub write_cfg_file {
+    my ($filename, $data, $stringexp, $arrayexp, $hashexp, $arrayarrayexp,
+	$hashhashexp) = @_;
+    
+    if (open (COLCFG, ">$filename")) {
+	foreach $key (sort(keys(%$data))) {
+	    if ($key =~ /$stringexp/) {
+		&write_cfg_line ('COLCFG', [$key, $data->{$key}]);
+	    } elsif ($key =~ /$arrayexp/) {
+		&write_cfg_line ('COLCFG', [$key, @{$data->{$key}}]);
+	    } elsif ($key =~ /$hashexp/) {
+		foreach $k (keys (%{$data->{$key}})) {
+		    &write_cfg_line ('COLCFG', [$key, $k, $data->{$key}->{$k}]);
+		}
+	    } elsif ($key =~ /$arrayarrayexp/) {
+		foreach $k (@{$data->{$key}}) {
+		    &write_cfg_line ('COLCFG', [$key, @$k]);
+		}
+	    } elsif ($key =~ /$hashhashexp/) {
+		foreach $k (keys (%{$data->{$key}})) {
+		    foreach $p (keys (%{$data->{$key}->{$k}})) {
+			if ($p =~ /default/) {
+			    &write_cfg_line ('COLCFG', 
+					     [$key, $k, $data->{$key}->{$k}]);
+			}
+			else {
+			    &write_cfg_line ('COLCFG', 
+			       [$key, $k, $p, $data->{$key}->{$k}->{$p}]);
+			}
+		    }
+		}
+	    }
+	}
+	close (COLCFG);
+    } else {
+	print STDERR "cfgread::write_cfg_file couldn't write the cfg file $filename\n";
+    }
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify.pm	(revision 21083)
@@ -0,0 +1,220 @@
+###########################################################################
+#
+# classify.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# functions to handle classifiers
+
+package classify;
+
+require util;
+
+
+$next_classify_num = 1;
+
+sub load_classifiers {
+    my ($classify_list, $build_dir, $outhandle) = @_;
+    my @classify_objects = ();
+    
+    foreach $classifyoption (@$classify_list) {
+
+	# get the classifier name
+	my $classname = shift @$classifyoption;
+	next unless defined $classname;
+
+	# find the classifier
+	my $colclassname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"perllib/classify", 
+					       "${classname}.pm");
+	my $mainclassname = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify", 
+						"${classname}.pm");
+
+	if (-e $colclassname) { require $colclassname; }
+	elsif (-e $mainclassname) { require $mainclassname; }
+	else { die "ERROR - couldn't find classifier \"$classname\"\n"; }
+
+	# create the classify object
+	my ($classobj);
+
+	# backwards compatability hack: if the classifier options are 
+	# in "x=y" format, convert them to parsearg ("-x y") format.
+	my ($opt, $key, $value);
+	my @newoptions;
+	foreach $opt (@$classifyoption) {
+	    if ($opt =~ /^(\w+)=(.*)$/) {
+		push @newoptions, "-$1", $2;
+	    } else {
+		push @newoptions, $opt;
+	    }
+	}
+	push @newoptions, "-builddir", "$build_dir" if ($build_dir);
+	push @newoptions, "-outhandle", "$outhandle" if ($outhandle);
+	push @newoptions, "-verbosity", "2";
+
+	map { $_ = "\"$_\""; } @newoptions;
+	my $options .= join (",", @newoptions);
+
+	eval ("\$classobj = new \$classname($options)");
+	die "$@" if $@;
+
+       	# add this object to the list
+	push (@classify_objects, $classobj);
+    }
+
+    return \@classify_objects;
+}
+
+# init_classifiers resets all the classifiers and readys them to process
+# the documents.
+sub init_classifiers {
+    my ($classifiers) = @_;
+    
+    foreach $classobj (@$classifiers) {
+	$classobj->init();
+    }
+}
+
+# classify_doc lets each of the classifiers classify a document
+sub classify_doc {
+    my ($classifiers, $doc_obj) = @_;
+    
+    foreach $classobj (@$classifiers) {
+	$classobj->classify($doc_obj);
+    }
+}
+
+# output_classify_info outputs all the info needed for the classification
+# to the gdbm
+sub output_classify_info {
+    my ($classifiers, $handle, $allclassifications) = @_;
+#    $handle = "main::STDOUT";
+
+    # create a classification containing all the info
+    my $classifyinfo = {'classifyOID'=>'browse',
+			'contains'=>[]};
+
+    # get each of the classifications
+    foreach $classobj (@$classifiers) {
+	my $tempinfo = $classobj->get_classify_info();
+	$tempinfo->{'classifyOID'} = "CL$next_classify_num";
+	$next_classify_num++;
+	push (@{$classifyinfo->{'contains'}}, $tempinfo);
+    }
+
+    &print_classify_info ($handle, $classifyinfo, "", $allclassifications);
+}
+
+sub print_classify_info {
+    my ($handle, $classifyinfo, $OID, $allclassifications) = @_;
+
+    $OID =~ s/^\.+//; # just for good luck
+
+    # book information is printed elsewhere
+    return if (defined ($classifyinfo->{'OID'}));
+ 
+    # don't want empty classifications
+    if ($allclassifications || &check_contents ($classifyinfo) > 0) {
+   
+	$OID = $classifyinfo->{'classifyOID'} if defined ($classifyinfo->{'classifyOID'});
+	
+	my $outputtext = "[$OID]\n";
+	$outputtext .= "<doctype>classify\n";
+	$outputtext .= "<hastxt>0\n";
+	$outputtext .= "<childtype>$classifyinfo->{'childtype'}\n" 
+	    if defined $classifyinfo->{'childtype'};
+	$outputtext .= "<Title>$classifyinfo->{'Title'}\n" 
+	    if defined $classifyinfo->{'Title'};
+	$outputtext .= "<numleafdocs>$classifyinfo->{'numleafdocs'}\n" 
+	    if defined $classifyinfo->{'numleafdocs'};
+	$outputtext .= "<thistype>$classifyinfo->{'thistype'}\n" 
+	    if defined $classifyinfo->{'thistype'};
+	$outputtext .= "<parameters>$classifyinfo->{'parameters'}\n" 
+	    if defined $classifyinfo->{'parameters'};
+	
+	my $contains_text = "<contains>";
+	my $mdoffset_text = "<mdoffset>";
+	
+	my $next_subOID = 1;
+	my $first = 1;
+	foreach $tempinfo (@{$classifyinfo->{'contains'}}) {
+	    # empty contents were made undefined by clean_contents()
+	    next unless defined $tempinfo;
+	    
+	    $contains_text .= ";" unless $first;
+	    $mdoffset_text .= ";" unless $first;
+	    $first = 0;
+	    
+	    if (defined ($tempinfo->{'classifyOID'})) {
+		$contains_text .= $tempinfo->{'classifyOID'};
+		&print_classify_info ($handle, $tempinfo, $tempinfo->{'classifyOID'},
+				      $allclassifications);
+	    } elsif (defined ($tempinfo->{'OID'})) {
+		$contains_text .= $tempinfo->{'OID'};
+		$mdoffset_text .= $tempinfo->{'offset'}
+		  if (defined ($tempinfo->{'offset'}))
+		# note: we don't want to print the contents of the books
+	    } else {
+		$contains_text .= "\".$next_subOID";
+		&print_classify_info ($handle, $tempinfo, "$OID.$next_subOID",
+				      $allclassifications);
+		$next_subOID++;
+	    }
+	}
+	
+	$outputtext .= "$contains_text\n";
+	$outputtext .= "<mdtype>$classifyinfo->{'mdtype'}\n" 
+	    if defined $classifyinfo->{'mdtype'};
+	$outputtext .= "$mdoffset_text\n"
+	    if ($mdoffset_text !~ m/^<mdoffset>;+$/);
+	
+	$outputtext .= '-' x 70 . "\n";
+	
+	print $handle $outputtext;
+    }
+}
+
+sub check_contents {
+    my ($classifyinfo) = @_;
+    my $num_leaf_docs = 0;
+    my $sub_num_leaf_docs = 0;
+
+    return $classifyinfo->{'numleafdocs'} if (defined $classifyinfo->{'numleafdocs'});
+
+    foreach $content (@{$classifyinfo->{'contains'}}) {
+	if (defined $content->{'OID'}) {
+	    # found a book
+	    $num_leaf_docs ++;
+	} elsif (($sub_num_leaf_docs = &check_contents ($content)) > 0) {
+	    # there's a book somewhere below
+	    $num_leaf_docs += $sub_num_leaf_docs;
+	} else {
+	    # section contains no books so we want to remove 
+	    # it from its parents contents
+	    $content = undef;
+	}
+    }
+
+    $classifyinfo->{'numleafdocs'} = $num_leaf_docs;
+    return $num_leaf_docs;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/AZCompactList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/AZCompactList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/AZCompactList.pm	(revision 21083)
@@ -0,0 +1,695 @@
+###########################################################################
+#
+# AZCompactList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# classifier plugin for sorting alphabetically
+# options are:
+#
+# metadata=Metaname -- all documents with Metaname metadata
+#                      will be included in list, list will be sorted
+#                      by this element.
+# buttonname=Title  -- (optional) the title field for this classification.
+#                      if not included title field will be Metaname. 
+# mingroup=Num      -- (optional) the smallest value that will cause
+#                      a group in the hierarchy to form.
+# minnesting=Num    -- (optional) the smallest value that will cause a 
+#		       list to converted into nested list
+# mincompact=Num    -- (optional) used in compact list
+# maxcompact=Num    -- (optional) used in compact list
+# doclevel=top|section -- (optional) level to process document at.
+# onlyfirst         -- (optional) control whether all or only first
+#                      metadata value used from array of metadata
+package AZCompactList;
+
+use BasClas;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify AZCompactList -metadata X [options]
+  options:
+   -metadata X            (required) Metadata field used for classification
+   -buttonname X          Title to use on web pages (defaults to metadata)
+   -removeprefix regex    pattern to remove from metadata before sorting
+   -doclevel top|section  (Defaults to top)
+   -mingroup N            Minimum num of documents required to form a new group
+   -minnesting N          Minimum list size to become a nested list
+   -mincompact N          Used in compact list
+   -maxcompact N          Used in compact list
+   -onlyfirst             Only use the first value if metadata is repeated.
+   -recopt
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+
+    my ($metaname, $title, $removeprefix);
+    my $mingroup = 2;
+    my $minnesting = 20;
+    my $mincompact = 10;
+    my $maxcompact = 30;
+    my $doclevel = "top";
+    my $onlyfirst = 0;
+    my $recopt   = undef;
+
+     if (!parsargv::parse(\@_, 
+			 q^metadata/.*/^, \$metaname,
+			 q^buttonname/.*/^, \$title,
+			 q^removeprefix/.*/^, \$removeprefix,
+			 q^mingroup/.*/2^, \$mingroup,
+			 q^minnesting/.*/20^, \$minnesting,
+			 q^mincompact/.*/10^, \$mincompact,
+			 q^maxcompact/.*/30^, \$maxcompact,
+			 q^doclevel/.*/top^, \$doclevel,
+			 q^onlyfirst/.*/0^, \$onlyfirst,
+			 q^recopt/.*/-1^, \$recopt,
+
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (!defined $metaname) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "AZCompactList used with no metadata name to classify by\n";
+	die "\n";
+    }
+
+    $title = $metaname unless ($title);
+
+    $self->{'list'} = {};
+    $self->{'listmetavalue'} = {};
+    $self->{'reclassify'} = {};
+    $self->{'reclassifylist'} = {};
+    $self->{'metaname'} = $metaname;
+    $self->{'title'} = "$title";     # title for the titlebar.
+    if (defined($removeprefix) && $removeprefix) {
+	$self->{'removeprefix'} = $removeprefix;
+    }
+    $self->{'mingroup'} = $mingroup;
+    $self->{'minnesting'} = $minnesting;
+    $self->{'mincompact'} = $mincompact;
+    $self->{'maxcompact'} = $maxcompact;
+    $self->{'doclevel'} = $doclevel;
+
+    if ($onlyfirst != 0) {
+	$onlyfirst = 1;
+    }
+    $self->{'onlyfirst'} = $onlyfirst;
+  
+    if ($recopt == -1) {
+	$recopt = undef; 
+    } else {
+	$recopt = "on";
+    }
+    $self->{'recopt'} = $recopt;
+
+    return bless $self, $class;
+}
+
+sub init 
+{
+    my $self = shift (@_);
+    
+    $self->{'list'} = {};
+    $self->{'listmetavalue'} = {};
+    $self->{'reclassify'} = {};
+    $self->{'reclassifylist'} = {};
+}
+
+$tmp = 0;
+
+sub classify 
+{
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    my @sectionlist = ();
+    my $topsection = $doc_obj->get_top_section();
+
+    my $metaname = $self->{'metaname'};
+    my $outhandle = $self->{'outhandle'};
+
+    $metaname =~ s/(\/.*)//; # grab first name in n1/n2/n3 list
+
+    if ($self->{'doclevel'} =~ /^top(level)?/i)
+    {
+	push(@sectionlist,$topsection);
+    }
+    else
+    {
+	my $thissection = $doc_obj->get_next_section($topsection);
+	while (defined $thissection) 
+	{
+	    push(@sectionlist,$thissection);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+
+    my $thissection;
+    foreach $thissection (@sectionlist)
+    {
+	my $full_doc_OID 
+	    = ($thissection ne "") ? "$doc_OID.$thissection" : $doc_OID;
+
+	if (defined $self->{'list'}->{$full_doc_OID}) 
+	{
+	    print $outhandle "WARNING: AZCompactList::classify called multiple times for $full_doc_OID\n";
+	} 
+	$self->{'list'}->{$full_doc_OID} = [];	
+	$self->{'listmetavalue'}->{$full_doc_OID} = [];
+
+	my $metavalues = $doc_obj->get_metadata($thissection,$metaname);
+	my $metavalue;
+	foreach $metavalue (@$metavalues) 
+	{
+	    # if this document doesn't contain the metadata element we're
+	    # sorting by we won't include it in this classification
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		if ($self->{'removeprefix'}) {
+		    $metavalue =~ s/^$self->{'removeprefix'}//;
+		}
+
+		my $formatted_metavalue = $metavalue;
+
+		if ($self->{'metaname'} =~ m/^Creator(:.*)?$/)
+		{
+		    &sorttools::format_string_name_english (\$formatted_metavalue);
+		} 
+		else 
+		{
+		    &sorttools::format_string_english (\$formatted_metavalue);
+		}
+		
+		#### prefix-str
+		if (! defined($formatted_metavalue)) {
+		    print $outhandle "Warning: AZCompactList: metavalue is ";
+		    print $outhandle "empty\n";
+		    $formatted_metavalue="";
+		}
+
+		push(@{$self->{'list'}->{$full_doc_OID}},$formatted_metavalue);
+		push(@{$self->{'listmetavalue'}->{$full_doc_OID}} ,$metavalue);
+
+		last if ($self->{'onlyfirst'});
+	    }
+	}
+	my $date = $doc_obj->get_metadata_element($thissection,"Date");
+	$self->{'reclassify'}->{$full_doc_OID} = [$doc_obj,$date];
+    }
+}
+
+sub reinit 
+{
+    my ($self,$classlist_ref) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    my %mtfreq = ();
+    my @single_classlist = ();
+    my @multiple_classlist = ();
+
+    # find out how often each metavalue occurs
+    map 
+    { 
+	my $mv;
+	foreach $mv (@{$self->{'listmetavalue'}->{$_}} )
+	{
+	    $mtfreq{$mv}++; 
+	}
+    } @$classlist_ref;
+
+    # use this information to split the list: single metavalue/repeated value
+    map
+    { 
+	my $i = 1;
+	my $metavalue;
+	foreach $metavalue (@{$self->{'listmetavalue'}->{$_}})
+	{
+	    if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	    {
+		push(@multiple_classlist,[$_,$i,$metavalue]); 
+	    } 
+	    else
+	    {
+		push(@single_classlist,[$_,$metavalue]); 
+		$metavalue =~ tr/[A-Z]/[a-z]/;
+		$self->{'reclassifylist'}->{"Metavalue_$i.$_"} = $metavalue;
+	    }
+	    $i++;
+	}
+    } @$classlist_ref;
+    
+    
+    # Setup sub-classifiers for multiple list
+
+    $self->{'classifiers'} = {};
+
+    my $pm;
+    foreach $pm ("List", "SectionList")
+    {
+	my $listname 
+	    = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify/$pm.pm");
+	if (-e $listname) { require $listname; }
+	else 
+	{ 
+	    print $outhandle "AZCompactList ERROR - couldn't find classifier \"$listname\"\n"; 
+	    die "\n";
+	}
+    }
+
+    # Create classifiers objects for each entry >= mingroup
+    my $metavalue;
+    foreach $metavalue (keys %mtfreq)
+    {
+	if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	{
+	    my $listclassobj;
+	    my $doclevel = $self->{'doclevel'};
+	    my $metaname  = $self->{'metaname'};
+	    my @metaname_list = split('/',$metaname);
+	    $metaname = shift(@metaname_list);
+	    if (@metaname_list==0)
+	    {
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-sort", "Date");
+
+		if ($doclevel =~ m/^top(level)?/i)
+		{
+		    eval ("\$listclassobj = new List(\@args)"); warn $@ if $@;
+		}
+		else
+		{
+		    eval ("\$listclassobj = new SectionList(\@args)");
+		}
+	    }
+	    else
+	    {
+		$metaname = join('/',@metaname_list);
+		
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-doclevel", "$doclevel");
+		push @args, "-recopt";
+
+		eval ("\$listclassobj = new AZCompactList(\@args)");
+	    }
+	    if ($@) {
+		print $outhandle "$@";
+		die "\n";
+	    }
+	    
+	    $listclassobj->init();
+
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		my $formatted_node = $metavalue;
+
+		if ($self->{'removeprefix'}) {
+		    $formatted_node =~ s/^$self->{'removeprefix'}//;
+		}
+
+		if ($self->{'metaname'} =~ m/^Creator(:.*)?$/)
+		{
+		    &sorttools::format_string_name_english(\$formatted_node);
+		} 
+		else 
+		{
+		    &sorttools::format_string_english(\$formatted_node);
+		}
+
+		# In case our formatted string is empty...
+		if (! defined($formatted_node)) {
+		    print $outhandle "Warning: AZCompactList: metavalue is ";
+		    print $outhandle "empty\n";
+		    $formatted_node="";
+		}
+
+		$self->{'classifiers'}->{$metavalue} 
+		= { 'classifyobj'   => $listclassobj,
+		    'formattednode' => $formatted_node };
+	    }
+	}
+    }
+
+
+    return (\@single_classlist,\@multiple_classlist);
+}
+
+
+sub reclassify 
+{
+    my ($self,$multiple_cl_ref) = @_;
+
+    # Entries in the current classify list that are "book nodes"
+    # should be recursively classified.
+    #--
+    foreach $dm_pair (@$multiple_cl_ref) 
+    {
+	my ($doc_OID,$mdoffset,$metavalue) = @$dm_pair;
+        my $listclassobj;
+
+	# find metavalue in list of sub-classifiers
+	my $found = 0;
+	my $node_name;
+	foreach $node_name (keys %{$self->{'classifiers'}}) 
+	{
+	    $resafe_node_name = $node_name;
+	    $resafe_node_name =~ s/(\(|\)|\[|\]|\{|\}|\^|\$|\.|\+|\*|\?|\|)/\\$1/g;
+	    if ($metavalue =~ m/^$resafe_node_name$/i) 
+	    {
+		my ($doc_obj,$date) = @{$self->{'reclassify'}->{$doc_OID}};
+
+		## date appears to not be used in classifier call ####
+
+		if ($doc_OID =~ m/^[^\.]*\.([\d\.]+)$/)
+		{
+		    my $section=$1;
+		    if ($self->{'doclevel'} =~ m/^top/i) { # toplevel
+			$self->{'classifiers'}->{$node_name}->{'classifyobj'}
+			->classify($doc_obj, "Section=$section");
+		    } else { # section level
+			# Thanks to Don Gourley for this...
+			# classify can't handle multi-level section
+			$self->{'classifiers'}->{$node_name}->{'classifyobj'}
+			->classify_section($section, $doc_obj, $date);
+		    }
+		}
+		else
+		{
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    ->classify($doc_obj); 
+		}
+		
+		$found = 1;
+		last;
+	    }
+	}
+	
+	if (!$found)
+	{
+	    my $outhandle=$self->{outhandle};
+	    print $outhandle "Warning: AZCompactList::reclassify ";
+	    print $outhandle "could not find sub-node for metadata=`$metavalue' with doc_OID $doc_OID\n";
+	}
+    }
+}
+
+
+
+sub get_reclassify_info 
+{
+    my $self = shift (@_);
+    
+    my $node_name;
+    foreach $node_name (keys %{$self->{'classifiers'}}) 
+    {
+        my $classifyinfo 
+	    = $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+	        ->get_classify_info();
+        $self->{'classifiers'}->{$node_name}->{'classifyinfo'} 
+	    = $classifyinfo;
+        $self->{'reclassifylist'}->{"CLASSIFY.$node_name"} 
+	    = $self->{'classifiers'}->{$node_name}->{'formattednode'};
+    }
+}
+
+
+sub alpha_numeric_cmp
+{
+    my ($self,$a,$b) = @_;
+
+    my $title_a = $self->{'reclassifylist'}->{$a};
+    my $title_b = $self->{'reclassifylist'}->{$b};
+
+    if ($title_a =~ m/^(\d+(\.\d+)?)/)
+    {
+	my $val_a = $1;
+	if ($title_b =~ m/^(\d+(\.\d+)?)/)
+	{
+	    my $val_b = $1;
+	    if ($val_a != $val_b)
+	    {
+		return ($val_a <=> $val_b);
+	    }
+	}
+    }
+    
+    return ($title_a cmp $title_b);
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist =keys %{$self->{'list'}}; # list all doc oids
+
+    my ($single_cl_ref,$multiple_cl_ref) = $self->reinit(\@classlist);
+    $self->reclassify($multiple_cl_ref);
+    $self->get_reclassify_info();
+
+
+#    my @reclassified_classlist 
+#	= sort {$self->{'reclassifylist'}->{$a} cmp $self->{'reclassifylist'}->{$b};} keys %{$self->{'reclassifylist'}};
+
+    # alpha_numeric_cmp is slower but handles numbers better ...
+    my @reclassified_classlist 
+	= sort { $self->alpha_numeric_cmp($a,$b) } keys %{$self->{'reclassifylist'}};
+
+
+    return $self->splitlist (\@reclassified_classlist);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $metaname, $thistype) = @_;
+
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+                        'Title'=>$title,
+                        'contains'=>[],
+			'mdtype'=>$metaname);
+
+    $classifyinfo{'thistype'} = $thistype
+        if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+
+
+# splitlist takes an ordered list of classifications (@$classlistref) and 
+# splits it up into alphabetical sub-sections.
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my @metanames = split("/",$self->{'metaname'});
+    my $metaname = shift(@metanames);
+
+    my $childtype = "HList";
+    $childtype = "VList" if (scalar (@$classlistref) <= $self->{'minnesting'});
+
+    my $classifyinfo;
+    if (!defined($self->{'recopt'}))
+    {
+	my $title = $self->{'title'}; # should always be defined by now....
+	$title = $metaname unless defined $title; 
+	$classifyinfo 
+	    = $self->get_entry ($title, $childtype, $metaname, "Invisible");
+    }
+    else
+    {
+	my $title = $self->{'title'};
+	$classifyinfo 
+	    = $self->get_entry ($title, $childtype, $metaname, "VList");
+    }
+
+    # don't need to do any splitting if there are less than 'minnesting' classifications
+    if ((scalar @$classlistref) <= $self->{'minnesting'}) {
+	foreach $subOID (@$classlistref) {
+            if ($subOID =~ /^CLASSIFY\.(.*)$/ 
+		&& defined $self->{'classifiers'}->{$1}) 
+	    {
+###		print STDERR "*** subOID = $subOID\n";
+
+                push (@{$classifyinfo->{'contains'}}, 
+		      $self->{'classifiers'}->{$1}->{'classifyinfo'});
+            } 
+	    else 
+	    {
+		$subOID =~ s/^Metavalue_(\d+)\.//;
+		my $metaname_offset = $1 -1;
+		my $oid_rec = {'OID'=>$subOID, 'offset'=>$metaname_offset};
+		push (@{$classifyinfo->{'contains'}}, $oid_rec);
+	    }
+	}
+	return $classifyinfo;
+    }
+	
+    # first split up the list into separate A-Z and 0-9 classifications
+    foreach $classification (@$classlistref) {
+	my $title = $self->{'reclassifylist'}->{$classification};
+	$title =~ s/&(.){2,4};//g; # remove any HTML special chars
+###	$title =~ s/^\s+//g; # remove a leading spaces
+###	$title =~ s/^_+//g; # remove a leading underscores
+	$title =~ s/^\W+//g;
+###	$title =~ s/^(\'|\`|\"|\:|\()//g; # remove any opening punctutation
+
+# only want first character for classification
+	$title =~ m/^(.)/; $title=$1;
+	$title =~ tr/[a-z]/[A-Z]/;
+
+	if ($title =~ /^[0-9]$/) {$title = '0-9';}
+	elsif ($title !~ /^[A-Z]$/) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZCompactList: WARNING $classification has badly formatted title ($title)\n";
+	}
+	$classhash->{$title} = [] unless defined $classhash->{$title};
+	push (@{$classhash->{$title}}, $classification);
+    }
+    $classhash = $self->compactlist ($classhash);
+
+    my @tmparr = ();
+    foreach $subsection (sort keys (%$classhash)) {
+	push (@tmparr, $subsection);
+    }
+    
+    # if there's a 0-9 section it will have been sorted to the beginning
+    # but we want it at the end
+    if ($tmparr[0] eq '0-9') {
+	shift @tmparr;
+	push (@tmparr, '0-9');
+    }
+
+    foreach $subclass (@tmparr) 
+    {
+	my $tempclassify = $self->get_entry($subclass, "VList", $metaname);
+	foreach $subsubOID (@{$classhash->{$subclass}}) 
+	{
+            if ($subsubOID =~ /^CLASSIFY\.(.*)$/ 
+		&& defined $self->{'classifiers'}->{$1}) 
+	    {
+                push (@{$tempclassify->{'contains'}}, 
+		      $self->{'classifiers'}->{$1}->{'classifyinfo'});
+	    }
+	    else
+	    {
+		$subsubOID =~ s/^Metavalue_(\d+)\.//;
+		my $metaname_offset = $1 -1;
+		my $oid_rec = {'OID'=>$subsubOID, 'offset'=>$metaname_offset};
+		push (@{$tempclassify->{'contains'}}, $oid_rec);
+	    }
+	}
+	push (@{$classifyinfo->{'contains'}}, $tempclassify);
+    }
+
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstletter = "";
+    my $currentlastletter = "";
+    my $lastkey = "";
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = $self->{'mincompact'}; 
+    my $max = $self->{'maxcompact'};
+
+    foreach $subsection (sort keys %$classhashref) {
+	if ($subsection eq '0-9') {
+	    @{$compactedhash->{$subsection}} = @{$classhashref->{$subsection}};
+	    next;
+	}
+	$currentfirstletter = $subsection if $currentfirstletter eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastletter = $subsection;
+	} else {
+
+	    if ($currentfirstletter eq $currentlastletter) {
+		@{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+		$lastkey = $currentfirstletter;
+	    } else {
+		@{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+		$lastkey = "$currentfirstletter-$currentlastletter";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstletter = "";
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstletter = $subsection;
+		$currentlastletter = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+    if (scalar (@currentOIDs) < $min) {
+	my ($newkey) = $lastkey =~ /^(.)/;
+	@currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	delete $compactedhash->{$lastkey};
+	@{$compactedhash->{"$newkey-$currentlastletter"}} = @currentOIDs;
+    } else {
+	if ($currentfirstletter eq $currentlastletter) {
+	    @{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+	} else {
+	    @{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+	} 
+    }
+
+    return $compactedhash;
+}
+
+1;
+
+
Index: /main/tags/2.38/gsdl/perllib/classify/AZCompactSectionList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/AZCompactSectionList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/AZCompactSectionList.pm	(revision 21083)
@@ -0,0 +1,209 @@
+###########################################################################
+#
+# AZCompactSectionList.pm --
+#
+# Experimental AZCompactList with fixes to handle section-level metadata
+#
+###########################################################################
+
+package AZCompactSectionList;
+
+use AZCompactList;
+
+sub BEGIN {
+    @ISA = ('AZCompactList');
+}
+
+#
+# override reinit() & reclassify() to demonstrate possible bug fixes
+# (search for SECTIONFIX? to see lines changed from AZCompactList.pm)
+#
+sub reinit 
+{
+    my ($self,$classlist_ref) = @_;
+    
+    my %mtfreq = ();
+    my @single_classlist = ();
+    my @multiple_classlist = ();
+
+    # find out how often each metavalue occurs
+    map 
+    { 
+	my $mv;
+	foreach $mv (@{$self->{'listmetavalue'}->{$_}} )
+	{
+	    $mtfreq{$mv}++; 
+	}
+    } @$classlist_ref;
+
+    # use this information to split the list: single metavalue/repeated value
+    map
+    { 
+	my $i = 1;
+	my $metavalue;
+	foreach $metavalue (@{$self->{'listmetavalue'}->{$_}})
+	{
+	    if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	    {
+		push(@multiple_classlist,[$_,$i,$metavalue]); 
+	    } 
+	    else
+	    {
+		push(@single_classlist,[$_,$metavalue]); 
+		$metavalue =~ tr/[A-Z]/[a-z]/;
+		$self->{'reclassifylist'}->{"Metavalue_$i.$_"} = $metavalue;
+	    }
+	    $i++;
+	}
+    } @$classlist_ref;
+    
+    
+    # Setup sub-classifiers for multiple list
+
+    $self->{'classifiers'} = {};
+
+    my $pm;
+    foreach $pm ("List", "SectionList")
+    {
+	my $listname 
+	    = &util::filename_cat($ENV{'GSDLHOME'},"perllib/classify/$pm.pm");
+	if (-e $listname) { require $listname; }
+	else 
+	{ 
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZCompactList ERROR - couldn't find classifier \"$listname\"\n"; 
+	    die "\n";
+	}
+    }
+
+    # Create classifiers objects for each entry >= mingroup
+    my $metavalue;
+    foreach $metavalue (keys %mtfreq)
+    {
+	if ($mtfreq{$metavalue} >= $self->{'mingroup'})
+	{
+	    my $listclassobj;
+	    my $doclevel = $self->{'doclevel'};
+	    my $metaname  = $self->{'metaname'};
+	    my @metaname_list = split('/',$metaname);
+	    $metaname = shift(@metaname_list);
+	    if (@metaname_list==0)
+	    {
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-sort", "Date");
+
+		if ($doclevel =~ m/^top(level)?/i)
+		{
+		    eval ("\$listclassobj = new List(\@args)"); warn $@ if $@;
+		}
+		else
+		{
+		    # SECTIONFIX?
+		    #eval ("\$listclassobj = new SectionList($args)");
+		    eval ("\$listclassobj = new SectionList(\@args)");
+		}
+	    }
+	    else
+	    {
+		$metaname = join('/',@metaname_list);
+		
+		my @args;
+		push @args, ("-metadata", "$metaname");
+# buttonname is also used for the node's title
+		push @args, ("-buttonname", "$metavalue");
+		push @args, ("-doclevel", "$doclevel");
+		push @args, "-recopt";
+
+		# SECTIONFIX?
+		#eval ("\$listclassobj = new AZCompactList($args)");
+		eval ("\$listclassobj = new AZCompactList(\@args)");
+	    }
+	    if ($@) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "$@";
+		die "\n";
+	    }
+	    
+	    $listclassobj->init();
+
+	    if (defined $metavalue && $metavalue =~ /\w/) 
+	    {
+		my $formatted_node = $metavalue;
+		if ($self->{'metaname'} =~ m/^Creator(:.*)?$/)
+		{
+		    &sorttools::format_string_name_english(\$formatted_node);
+		} 
+		else 
+		{
+		    &sorttools::format_string_english(\$formatted_node);
+		}
+		
+		$self->{'classifiers'}->{$metavalue} 
+		= { 'classifyobj'   => $listclassobj,
+		    'formattednode' => $formatted_node };
+	    }
+	}
+    }
+
+
+    return (\@single_classlist,\@multiple_classlist);
+}
+
+
+sub reclassify 
+{
+    my ($self,$multiple_cl_ref) = @_;
+
+    # Entries in the current classify list that are "book nodes"
+    # should be recursively classified.
+    #--
+    foreach $dm_pair (@$multiple_cl_ref) 
+    {
+	my ($doc_OID,$mdoffset,$metavalue) = @$dm_pair;
+        my $listclassobj;
+
+	# find metavalue in list of sub-classifiers
+	my $found = 0;
+	my $node_name;
+	foreach $node_name (keys %{$self->{'classifiers'}}) 
+	{
+	    $resafe_node_name = $node_name;
+	    $resafe_node_name =~ s/(\(|\)|\[|\]|\{|\}|\^|\$|\.|\+|\*|\?|\|)/\\$1/g;
+	    if ($metavalue =~ m/^$resafe_node_name$/i) 
+	    {
+		my ($doc_obj,$date) = @{$self->{'reclassify'}->{$doc_OID}};
+
+		## date appears to not be used in classifier call ####
+
+		# SECTIONFIX?  section must include multiple levels, e.g. '1.12'
+		#if ($doc_OID =~ m/^.*\.(\d+)$/)
+		if ($doc_OID =~ m/^[^\.]*\.([\d\.]+)$/)
+		{
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    # SECTIONFIX? classify can't handle multi-level section
+		    #->classify($doc_obj, "Section=$1"); 
+		    ->classify_section($1, $doc_obj, $date);
+		}
+		else
+		{
+		    $self->{'classifiers'}->{$node_name}->{'classifyobj'}
+		    ->classify($doc_obj); 
+		}
+		
+		$found = 1;
+		last;
+	    }
+	}
+	
+	if (!$found)
+	{
+	    print $outhandle "Warning: AZCompactList::reclassify ";
+	    print $outhandle "could not find sub-node for $metavalue with doc_OID $doc_OID\n";
+	}
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/AZList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/AZList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/AZList.pm	(revision 21083)
@@ -0,0 +1,299 @@
+###########################################################################
+#
+# AZList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# classifier plugin for sorting alphabetically
+
+package AZList;
+
+use BasClas;
+use sorttools;
+use iso639;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify AZList [options]
+  options:
+ 
+  -metadata X           (required) Metadata field used for classification.
+                        List will be sorted by this element.
+
+  -buttonname X         (optional) Button name for this classification.
+                        defaults to metadata name. 
+
+  -removeprefix regex   (optional) A prefix to ignore in the Metadata values
+                        for the field when sorting.
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+    
+    my ($metaname, $title, $removeprefix);
+    
+    if (!parsargv::parse(\@_, 
+			 q^metadata/.*/^, \$metaname,
+			 q^buttonname/.*/^, \$title,
+			 q^removeprefix/.*/^, \$removeprefix,
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (!defined $metaname) {
+	&print_usage;
+	print STDERR "AZList used with no metadata name\n";
+	die "\n";
+    }
+    
+    $title = $metaname unless ($title);
+    
+    $self->{'list'} = {};
+    $self->{'metaname'} = $metaname;
+    $self->{'title'} = $title;
+    if (defined($removeprefix) && $removeprefix) {
+	$self->{'removeprefix'} = $removeprefix;
+    }
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'list'} = {};
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $metavalue = $doc_obj->get_metadata_element ($doc_obj->get_top_section(),
+						    $self->{'metaname'});
+
+    # if this document doesn't contain the metadata element we're
+    # sorting by we won't include it in this classification
+    if (defined $metavalue && $metavalue ne "") {
+	if ($self->{'removeprefix'}) {
+	    $metavalue =~ s/^$self->{'removeprefix'}//;
+	}
+
+	if ($self->{'metaname'} eq 'Language') {
+	    $metavalue = $iso639::fromiso639{$metavalue};
+	} elsif ($self->{'metaname'} eq 'Creator') {
+	    &sorttools::format_string_name_english (\$metavalue);
+	} else {
+	    &sorttools::format_string_english (\$metavalue);
+	}
+	if (defined $self->{'list'}->{$doc_OID}) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "WARNING: AZList::classify called multiple times for $doc_OID\n";
+	} 
+	$self->{'list'}->{$doc_OID} = $metavalue;
+    }
+}
+
+sub alpha_numeric_cmp
+{
+    my ($self,$a,$b) = @_;
+
+    my $title_a = $self->{'list'}->{$a};
+    my $title_b = $self->{'list'}->{$b};
+
+    if ($title_a =~ m/^(\d+(\.\d+)?)/)
+    {
+	my $val_a = $1;
+	if ($title_b =~ m/^(\d+(\.\d+)?)/)
+	{
+	    my $val_b = $1;
+	    if ($val_a != $val_b)
+	    {
+		return ($val_a <=> $val_b);
+	    }
+	}
+    }
+    
+    return ($title_a cmp $title_b);
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist 
+	= sort { $self->alpha_numeric_cmp($a,$b) } keys %{$self->{'list'}};
+
+    return $self->splitlist (\@classlist);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+# splitlist takes an ordered list of classifications (@$classlistref) and splits it
+# up into alphabetical sub-sections.
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my $childtype = "HList";
+    if (scalar (@$classlistref) <= 39) {$childtype = "VList";}
+    my $classifyinfo = $self->get_entry ($self->{'title'}, $childtype, "Invisible");
+
+    # don't need to do any splitting if there are less than 39 (max + min -1) classifications
+    if ((scalar @$classlistref) <= 39) {
+	foreach $subOID (@$classlistref) {
+	    push (@{$classifyinfo->{'contains'}}, {'OID'=>$subOID});
+	}
+	return $classifyinfo;
+    }
+	
+    # first split up the list into separate A-Z and 0-9 classifications
+    foreach $classification (@$classlistref) {
+	my $title = $self->{'list'}->{$classification};
+
+	$title =~ s/^(&.{1,6};|<[^>]>|[^a-zA-Z0-9])//g; # remove any unwanted stuff
+	# only need first char for classification
+	$title =~ m/^(.)/; $title=$1;
+	$title =~ tr/[a-z]/[A-Z]/;
+	if ($title =~ /^[0-9]$/) {$title = '0-9';}
+	elsif ($title !~ /^[A-Z]$/) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "AZList: WARNING $classification has badly formatted title ($title)\n";
+	}
+	$classhash->{$title} = [] unless defined $classhash->{$title};
+	push (@{$classhash->{$title}}, $classification);
+    }
+    $classhash = $self->compactlist ($classhash);
+
+    my @tmparr = ();
+    foreach $subsection (sort keys (%$classhash)) {
+	push (@tmparr, $subsection);
+    }
+    
+    # if there's a 0-9 section it will have been sorted to the beginning
+    # but we want it at the end
+    if ($tmparr[0] eq '0-9') {
+	shift @tmparr;
+	push (@tmparr, '0-9');
+    }
+
+    foreach $subclass (@tmparr) {
+	my $tempclassify = $self->get_entry($subclass, "VList");
+	foreach $subsubOID (@{$classhash->{$subclass}}) {
+	    push (@{$tempclassify->{'contains'}}, {'OID'=>$subsubOID});
+	}
+	push (@{$classifyinfo->{'contains'}}, $tempclassify);
+    }
+
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstletter = "";
+    my $currentlastletter = "";
+    my $lastkey = "";
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = 10; 
+    my $max = 30;
+
+    foreach $subsection (sort keys %$classhashref) {
+	if ($subsection eq '0-9') {
+	    @{$compactedhash->{$subsection}} = @{$classhashref->{$subsection}};
+	    next;
+	}
+	$currentfirstletter = $subsection if $currentfirstletter eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastletter = $subsection;
+	} else {
+
+	    if ($currentfirstletter eq $currentlastletter) {
+		@{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+		$lastkey = $currentfirstletter;
+	    } else {
+		@{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+		$lastkey = "$currentfirstletter-$currentlastletter";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstletter = "";
+		$lastkey = $subsection;
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstletter = $subsection;
+		$currentlastletter = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+    if (scalar (@currentOIDs) < $min) {
+	my ($newkey) = $lastkey =~ /^(.)/;
+	@currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	delete $compactedhash->{$lastkey};
+	@{$compactedhash->{"$newkey-$currentlastletter"}} = @currentOIDs;	
+    } else {
+	if ($currentfirstletter eq $currentlastletter) {
+	    @{$compactedhash->{$currentfirstletter}} = @currentOIDs;
+	} else {
+	    @{$compactedhash->{"$currentfirstletter-$currentlastletter"}} = @currentOIDs;
+	} 
+    }
+
+    return $compactedhash;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/AZSectionList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/AZSectionList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/AZSectionList.pm	(revision 21083)
@@ -0,0 +1,113 @@
+###########################################################################
+#
+# AZSectionList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# classifier plugin for sorting sections alphabetically
+
+# this is very similar to AZList except it sorts by
+# section level metadata (excluding the top level)
+# instead of just top level metadata
+
+# the only change is to the classify() subroutine which 
+# must now iterate through each section, adding each
+# to the classification
+
+package AZSectionList;
+
+use AZList;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('AZList');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify AZSectionList -metadata X [options]
+  options:
+
+  -metadata X		(required) Metadata field used for classification.
+			List will be sorted by this element.
+
+  -buttonname X		Button name for this classification.
+			defaults to metadata name. 
+
+  -removeprefix regex	A prefix to ignore in the Metadata values
+			for the field when sorting.
+
+This is very similar to AZList except it sorts by section level metadata
+(excluding the top level) instead of just top level metadata.
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new AZList($class, @_);
+
+    return bless $self, $class;
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $thissection = $doc_obj->get_next_section ($doc_obj->get_top_section());
+
+    while (defined $thissection) {
+	$self->classify_section ($thissection, $doc_obj);
+	$thissection = $doc_obj->get_next_section ($thissection);
+    }
+}
+
+sub classify_section {
+    my $self = shift (@_);
+    my ($section, $doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $metavalue = $doc_obj->get_metadata_element ($section, $self->{'metaname'});
+
+    # if this section doesn't contain the metadata element we're
+    # sorting by we won't include it in this classification
+    if (defined $metavalue && $metavalue ne "") {
+	if ($self->{'removeprefix'}) {
+	    $metavalue =~ s/^$self->{'removeprefix'}//;
+	}
+
+	if ($self->{'metaname'} eq 'Creator') {
+	    &sorttools::format_string_name_english (\$metavalue);
+	} else {
+	    &sorttools::format_string_english (\$metavalue);
+	}
+	if (defined $self->{'list'}->{"$doc_OID.$section"}) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "WARNING: AZSectionList::classify called multiple times " .
+		"for $doc_OID.$section\n";
+	} 
+	$self->{'list'}->{"$doc_OID.$section"} = $metavalue;
+    }
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/BasClas.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/BasClas.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/BasClas.pm	(revision 21083)
@@ -0,0 +1,119 @@
+###########################################################################
+#
+# BasClas.pm -- base class for all classifiers
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package BasClas;
+
+# How a classifier works.  
+#
+# For each classifier requested in the collect.cfg file, buildcol.pl creates
+# a new classifier object (a subclass of BasClas).  Later, it passes each 
+# document object to each classifier in turn for classification.
+#
+# Four primary functions are used:
+#
+# 1. "new" is called before the documents are processed to set up the
+#    classifier.
+#
+# 2. "init" is called after buildcol.pl has created the indexes etc but
+#    before the documents are classified in order that the classifier might
+#    set any variables it requires, etc.
+#
+# 3. "classify" is called once for each document object.  The classifier
+#    "classifies" each document and updates its local data accordingly.
+#
+# 4. "get_classify_info" is called after every document has been
+#    classified.  It collates the information about the documents and
+#    stores a reference to the classifier so that Greenstone can later
+#    display it.
+
+use parsargv;
+
+sub print_general_usage {
+    my ($plugin_name) = @_;
+    print STDERR "
+   -verbosity N    Controls the quantity of output.  
+                   Defaults to verbosity of buildcol.pl, which is usually 2.
+
+   (Most general classifier options are set internally by buildcol.)
+
+";
+}
+
+# print_usage should be overridden for any sub-classes
+sub print_usage {
+    print STDERR "
+This classifier has no classifier-specific options
+
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $name = shift (@_);
+
+    my $self = {};
+
+    $self->{'outhandle'} = STDERR;
+    
+    # general options available to all classifiers
+    if (!parsargv::parse(\@_,
+			 q^builddir/.*/^, \$self->{'builddir'},
+			 q^outhandle/.*/STDERR^, \$self->{'outhandle'},
+			 q^verbosity/\d/2^, \$self->{'verbosity'},
+			 "allow_extra_options")) {
+	
+	print STDERR "\nThe $name classifier uses an incorrect general option\n";
+	print STDERR "(general options are those available to all classifiers).\n";
+	print STDERR "Check your collect.cfg configuration file.\n";
+    	&print_general_usage($plugin_name);
+	die "\n";
+    }
+
+
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "BasClas::classify function must be implemented in sub-class\n";
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "BasClas::classify function must be implemented in sub-class\n";
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/Browse.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/Browse.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/Browse.pm	(revision 21083)
@@ -0,0 +1,86 @@
+###########################################################################
+#
+# List.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+use BasClas;
+package Browse;
+
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify Browse
+  This classifier has no options (yet).
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+    
+    
+    # classifier information
+    $self->{'collection'} = $ENV{'GSDLCOLLECTION'};
+
+    $self->{'title'} = "Browse";
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    
+}
+
+sub classify {
+    my $self = shift (@_);
+   
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+  
+
+    # Return the information about the classifier that we'll later want to
+    # use to create macros when the Phind classifier document is displayed.
+    my %classifyinfo = ('thistype'=>'Invisible', 
+                        'Title'=>$self->{'title'},
+			'contains'=>[]);
+    
+    my $collection = $self->{'collection'};
+    my $url = "library?a=br&c=collection";
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$url});
+   
+    return \%classifyinfo;
+
+ 
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/DateList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/DateList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/DateList.pm	(revision 21083)
@@ -0,0 +1,237 @@
+###########################################################################
+#
+# DateList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# classifier plugin for sorting by date
+
+# always sorts by 'Date' metadata
+
+# date is assumed to be in the form yyyymmdd
+
+# at present dates are split by year - this should change
+# jrm21 - added option "bymonth", which splits by year and month.
+
+package DateList;
+
+use BasClas;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify DateList [options]
+  options:
+	-bymonth  [or bymonth=1]	Classify by year and month
+
+  Classifier plugin for sorting by date, and assumes that 'Date' metadata
+  exists. Date is assumed to be in the form yyyymmdd (all digits).
+  By default dates are classified by year.
+
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+
+    $self->{'list'} = {};
+    if (!parsargv::parse(\@_, 
+                         q^bymonth^, \$self->{'bymonth'},
+                         "allow_extra_options")) {
+        &print_usage();
+        die "\n";
+    }
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    $self->{'list'} = {};
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    my $date = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), 'Date');
+
+    # if this document doesn't contain Date element we won't 
+    # include it in this classification
+    if (defined $date && $date =~ /\d/) {
+	if (defined $self->{'list'}->{$doc_OID}) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "WARNING: DateList::classify called multiple times for $doc_OID\n";
+	} 
+	$self->{'list'}->{$doc_OID} = $date;
+    }
+}
+
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my @classlist = sort {$self->{'list'}->{$a} cmp $self->{'list'}->{$b};} keys %{$self->{'list'}};
+
+    return $self->splitlist (\@classlist);
+}
+
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+    
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+# splitlist takes an ordered list of classifications (@$classlistref) and
+# splits it up into sub-sections by date
+sub splitlist {
+    my $self = shift (@_);
+    my ($classlistref) = @_;
+    my $classhash = {};
+
+    # top level
+    my $childtype = "HList";
+    if (scalar (@$classlistref) <= 39) {$childtype = "DateList";}
+    my $classifyinfo = $self->get_entry ("Date", $childtype, "Invisible");
+
+    # don't need to do any splitting if there are less than 39 (max + min -1) classifications
+    if ((scalar @$classlistref) <= 39) {
+	foreach $subOID (@$classlistref) {
+	    push (@{$classifyinfo->{'contains'}}, {'OID'=>$subOID});
+	}
+	return $classifyinfo;
+    }
+
+
+    if ($self->{'bymonth'}) {
+	# first split up the list into separate year+month classifications
+	foreach $classification (@$classlistref) {
+	    my $date = $self->{'list'}->{$classification};
+	    $date =~ s/^(\d\d\d\d)(\d\d).*$/$1&nbsp;_textmonth$2_/;
+	    # sanity check if month is zero
+	    if ($date =~ /00_$/) {
+		$date =~ s/^(\d\d\d\d).*$/$1/g;
+	    }
+	    $classhash->{$date} = [] unless defined $classhash->{$date};
+	    push (@{$classhash->{$date}}, $classification);
+	}
+    } else {
+	# first split up the list into separate year classifications
+	foreach $classification (@$classlistref) {
+	    my $date = $self->{'list'}->{$classification};
+	    $date =~ s/^(\d\d\d\d).*$/$1/;
+	    $classhash->{$date} = [] unless defined $classhash->{$date};
+	    push (@{$classhash->{$date}}, $classification);
+	}
+    }
+    $classhash = $self->compactlist ($classhash);
+
+    foreach $subclass (sort keys %$classhash) {
+	my $tempclassify = $self->get_entry($subclass, "DateList");
+	foreach $subsubOID (@{$classhash->{$subclass}}) {
+	    push (@{$tempclassify->{'contains'}}, {'OID'=>$subsubOID});
+	}
+	push (@{$classifyinfo->{'contains'}}, $tempclassify);
+    }
+
+    return $classifyinfo;
+}
+
+sub compactlist {
+    my $self = shift (@_);
+    my ($classhashref) = @_;
+    my $compactedhash = {};
+    my @currentOIDs = ();
+    my $currentfirstdate = "";
+    my $currentlastdate = "";
+    my $lastkey = "";
+
+    # minimum and maximum documents to be displayed per page.
+    # the actual maximum will be max + (min-1).
+    # the smallest sub-section is a single letter at present
+    # so in this case there may be many times max documents
+    # displayed on a page.
+    my $min = 10; 
+    my $max = 30;
+    foreach my $subsection (sort keys %$classhashref) {
+	$currentfirstdate = $subsection if $currentfirstdate eq "";
+	if ((scalar (@currentOIDs) < $min) ||
+	    ((scalar (@currentOIDs) + scalar (@{$classhashref->{$subsection}})) <= $max)) {
+	    push (@currentOIDs, @{$classhashref->{$subsection}});
+	    $currentlastdate = $subsection;
+	} else {
+
+	    if ($currentfirstdate eq $currentlastdate) {
+		@{$compactedhash->{$currentfirstdate}} = @currentOIDs;
+		$lastkey = $currentfirstdate;
+	    } else {
+		@{$compactedhash->{"$currentfirstdate-$currentlastdate"}} = @currentOIDs;
+		$lastkey = "$currentfirstdate-$currentlastdate";
+	    } 
+	    if (scalar (@{$classhashref->{$subsection}}) >= $max) {
+		$compactedhash->{$subsection} = $classhashref->{$subsection};
+		@currentOIDs = ();
+		$currentfirstdate = "";
+		$lastkey = $subsection;
+	    } else {
+		@currentOIDs = @{$classhashref->{$subsection}};
+		$currentfirstdate = $subsection;
+		$currentlastdate = $subsection;
+	    }
+	}
+    }
+
+    # add final OIDs to last sub-classification if there aren't many otherwise
+    # add final sub-classification
+    if ((scalar (@currentOIDs) < $min) && (scalar (@currentOIDs) > 0)) {
+	# want every thing in previous up to the dash
+	my ($newkey) = $lastkey =~ /^([^\-]+)/;
+	@currentOIDs = (@{$compactedhash->{$lastkey}}, @currentOIDs);
+	delete $compactedhash->{$lastkey};
+	@{$compactedhash->{"$newkey-$currentlastdate"}} = @currentOIDs;	
+    } else {
+	if ($currentfirstdate eq $currentlastdate) {
+	    @{$compactedhash->{$currentfirstdate}} = @currentOIDs;
+	} else {
+	    @{$compactedhash->{"$currentfirstdate-$currentlastdate"}} = @currentOIDs;
+	} 
+    }
+
+    return $compactedhash;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/HTML.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/HTML.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/HTML.pm	(revision 21083)
@@ -0,0 +1,107 @@
+###########################################################################
+#
+# HTML.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# html classifier plugin - creates an empty classification
+# that's simply a link to a web page
+# options are:
+# buttonname=Title  -- (optional) the title field for this classification.
+#                      if not included title field 'Browse'
+# url=url           -- the url of the web page to link to
+
+package HTML;
+
+use BasClas;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify AZList [options]
+  options:
+   -url X         The url of the web page to link to.
+   -buttonname X  (optional) the title field for this classification.
+                  The default is 'Browse'
+
+HTML classifier plugin - creates classifier that is a link to a web page
+
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+    
+    my ($title, $url);
+    
+    if (!parsargv::parse(\@_, 
+			 q^url/.*/^, \$url,
+			 q^buttonname/.*/Browse^, \$title,
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (!defined $url) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Error: HTML classifier contains no 'url' option\n";
+	die "\n";
+    }
+
+    $self->{'url'} = $url;
+    $self->{'title'} = $title;
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    # we don't do anything for individual documents
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    my %classifyinfo = ('thistype'=>'Invisible',
+			'childtype'=>'HTML',
+			'Title'=>$self->{'title'},
+			'contains'=>[]);
+
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$self->{'url'}});
+
+    return \%classifyinfo;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/Hierarchy.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/Hierarchy.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/Hierarchy.pm	(revision 21083)
@@ -0,0 +1,265 @@
+###########################################################################
+#
+# Hierarchy.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# classifier plugin for generating hierarchical classifications
+
+# options for this classifier are:
+# -hfile file.txt    - classification file
+# -metadata Metaname - metadata field to test against file.txt
+# -sort Meta         - this option is optional (genious;-). by default this 
+#                     classifier will sort documents within each section 
+#                     alphabetically by Title. sort=nosort prevents sorting 
+#                     (i.e. documents will end up in build order), sort=Meta 
+#                     will sort each field alphabetically by Meta (Meta may 
+#                     also be 'Filename' to sort by the original filename).
+# -buttonname Title  - another optional field. this is what will end up in the
+#                     Title field for this classification. if not present it
+#                     defaults to Metaname
+# -hlist_at_top      - use a horizontal list for the top level (i.e. display it
+#                     like an AZList classification)
+
+package Hierarchy;
+
+use BasClas;
+use util;
+use cfgread;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify Hierarchy [options]
+  options:
+
+   -buttonname X  Title field for this classification.
+                  Defaults to metadata name. 
+
+   -metadata X    Metadata field used for classification,
+                  list will be sorted by this element.
+
+   -hfile X       The classification structure file
+
+   -sort X        Metadata field to sort by (defaults to none)
+
+   -hlist_at_top  Display the first level of the classification
+                  horizontally.
+";
+}
+
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+    
+    my $sortname = "Title";
+    my ($hfile, $metadata, $title, $hlist_at_top);
+
+    if (!parsargv::parse(\@_, 
+			 q^buttonname/.*/^, \$title,
+			 q^sort/.*/nosort^, \$sortname,
+			 q^hfile/.*/^, \$hfile,
+			 q^metadata/.*/^, \$metadata,
+			 q^hlist_at_top^, \$hlist_at_top,
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (!$metadata) {
+	&print_usage;
+	print STDERR "\nHierarchy error: no metadata supplied\n";
+	die "\n";
+    }
+
+    $title = $metadata unless ($title);
+
+    $sortname = undef if $sortname =~ /^nosort$/;
+
+    if (!$hfile) {
+	&print_usage;
+	print STDERR "\nHierarchy error: No -hfile supplied\n";
+	die "\n";
+    }
+    
+    my $subjectfile = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"etc", $hfile);
+    if (!-e $subjectfile) {
+	my $collfile = $subjectfile;
+	$subjectfile = &util::filename_cat($ENV{'GSDLHOME'},"etc", $hfile);
+	if (!-e $subjectfile) {
+	    my $outhandle = $self->{'outhandle'};
+	    &print_usage;
+	    print STDERR "\nHierarchy Error: Can't locate subject file $hfile\n";
+	    print STDERR "This file should be in $collfile or $subjectfile\n";
+	    die "\n";
+	}
+    }
+
+    $self->{'descriptorlist'} = {}; # first field in subject file
+    $self->{'locatorlist'} = {}; # second field in subject file
+    $self->{'subjectfile'} = $subjectfile;
+    $self->{'metaname'} = $metadata;
+    $self->{'sortname'} = $sortname;
+    $self->{'title'} = $title;
+    $self->{'hlist_at_top'} = $hlist_at_top;
+    
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    # read in the subject file
+    my $list = &cfgread::read_cfg_file ($self->{'subjectfile'}, undef, '^[^#]?\w');
+    
+    # $list is a hash that is indexed by the descriptor. The contents of this
+    # hash is a list of two items. The first item is the OID and the second item
+    # is the title
+    foreach $descriptor (keys (%$list)) {
+	$self->{'descriptorlist'}->{$descriptor} = $list->{$descriptor}->[0];
+	unless (defined $self->{'locatorlist'}->{$list->{$descriptor}->[0]}) {
+	    $self->{'locatorlist'}->{$list->{$descriptor}->[0]}->{'title'} = $list->{$descriptor}->[1];
+	    $self->{'locatorlist'}->{$list->{$descriptor}->[0]}->{'contents'} = [];
+	}
+    }
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    my $metadata = $doc_obj->get_metadata ($doc_obj->get_top_section(),
+					   $self->{'metaname'});
+
+    my $sortmeta = "";
+    if (defined $self->{'sortname'}) {
+	if ($self->{'sortname'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(),
+						       $self->{'sortname'});
+	    if (defined $sortmeta) {
+		if ($self->{'sortname'} eq "Creator") {
+		    &sorttools::format_string_name_english (\$sortmeta);
+		} else {
+		    &sorttools::format_string_english (\$sortmeta);
+		}
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+    }
+
+    foreach $metaelement (@$metadata) {
+	if ((defined $self->{'descriptorlist'}->{$metaelement}) &&
+	    (defined $self->{'locatorlist'}->{$self->{'descriptorlist'}->{$metaelement}})) {
+	    push (@{$self->{'locatorlist'}->{$self->{'descriptorlist'}->{$metaelement}}->{'contents'}}, 
+		  [$doc_OID, $sortmeta]);
+	}
+    }
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+    
+    my $list = $self->{'locatorlist'};
+
+    my ($classifyinfo);
+    if ($self->{'hlist_at_top'}) {
+	$classifyinfo = $self->get_entry ($self->{'title'}, "HList", "Invisible");
+    } else {
+	$classifyinfo = $self->get_entry ($self->{'title'}, "VList", "Invisible");
+    }
+
+    foreach $OID (keys (%$list)) {
+
+	my $tempinfo = $self->get_OID_entry ($OID, $classifyinfo, $list->{$OID}->{'title'}, "VList");
+
+	if (defined $self->{'sortname'}) {
+	    foreach $subOID (sort {$a->[1] cmp $b->[1];} @{$list->{$OID}->{'contents'}}) {
+		push (@{$tempinfo->{'contains'}}, {'OID'=>$subOID->[0]});
+	    }
+	} else {
+	    foreach $subOID (@{$list->{$OID}->{'contents'}}) {
+		push (@{$tempinfo->{'contains'}}, {'OID'=>$subOID->[0]});
+	    }
+	}
+    }
+    
+    return $classifyinfo;
+}
+
+sub get_OID_entry {
+    my $self = shift (@_);
+    my ($OID, $classifyinfo, $title, $classifytype) = @_;
+
+    $OID = "" unless defined $OID;
+    $OID =~ s/^\.+//;
+
+    my ($headOID, $tailOID) = $OID =~ /^(\d+)(.*)$/;
+    $tailOID = "" unless defined $tailOID;
+
+    if (!defined $headOID) {
+	$classifyinfo->{'Title'} = $title;
+	$classifyinfo->{'classifytype'} = $classifytype;
+
+	return $classifyinfo;
+    }
+
+    $classifyinfo->{'contains'} = [] unless defined $classifyinfo->{'contains'};
+
+    my $offset = 0;
+    foreach $thing (@{$classifyinfo->{'contains'}}) {
+	$offset ++ if defined $thing->{'OID'};
+    }
+    
+    while (scalar(@{$classifyinfo->{'contains'}}) < ($headOID+$offset)) {
+	push (@{$classifyinfo->{'contains'}}, $self->get_entry("", $classifytype));
+    }
+
+    return $self->get_OID_entry ($tailOID, $classifyinfo->{'contains'}->[($headOID+$offset-1)], $title, $classifytype);
+}
+
+sub get_entry {
+    my $self = shift (@_);
+    my ($title, $childtype, $thistype) = @_;
+
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>$childtype,
+			'Title'=>$title,
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = $thistype 
+	if defined $thistype && $thistype =~ /\w/;
+
+    return \%classifyinfo;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/List.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/List.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/List.pm	(revision 21083)
@@ -0,0 +1,206 @@
+###########################################################################
+#
+# List.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# simple list classifier plugin 
+# options are:
+# metadata=Metaname -- (optional) all documents with Metaname metadata
+#                      will be included in list. if not included all documents
+#                      will be included in list.
+# sort=Meta         -- (optional) sort documents in list alphabetically by
+#                      Meta. by default it will sort by Metaname, if neither
+#                      are set documents will be in build (random) order.
+#                      Meta may be Filename to sort by original filename or
+#                      nosort to force not to sort
+# buttonname=Title  -- (optional) the title field for this classification.
+#                      if not included title field will be Metaname. 
+#                      if metadata is also not included title will be 'List'
+
+use BasClas;
+package List;
+
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify List [options]
+  options:
+
+   -metadata X    Metadata field used for classification,
+                  list will be sorted by this element.
+
+   -buttonname X  (optional) Title field for this classification.
+                  if not included title field will be Metaname. 
+
+   -sort X        (optional) Sort documents in list by this metadata field.
+                  By default it will sort by Metaname, or (if this is not
+                  set) in build (random) order.
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+    
+    my ($metaname, $title, $sortname, $list);
+
+    if (!parsargv::parse(\@_, 
+			 q^metadata/.*/^, \$metaname,
+			 q^buttonname/.*/^, \$title,
+			 q^sort/.*/^, \$sortname,
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    if (!$title) {
+	if ($metaname) {
+	    $title = $metaname;
+	} else {
+	    $title = 'List';
+	}
+    }
+
+    if (!$sortname) {
+	if ($metaname) {
+	    $sortname = $metaname;
+	} else {
+	    $sortname = undef;
+	}
+    }
+
+    if ($metaname) {
+	$list = {};
+    } else {
+	$list = [];
+	$metaname = undef;
+    }
+
+    $self->{'list'} = $list;
+    $self->{'metaname'} = $metaname;
+    $self->{'title'} = $title;
+    $self->{'sortname'} = $sortname;
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    if (defined $self->{'sortname'}) {
+	$self->{'list'} = {};
+    } else {
+	$self->{'list'} = [];
+    }
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+
+    my $sortmeta = "";
+    if (defined $self->{'sortname'}) {
+	if ($self->{'sortname'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(),
+						       $self->{'sortname'});
+	    if (defined $sortmeta) {
+		if ($self->{'sortname'} eq "Creator") {
+		    &sorttools::format_string_name_english (\$sortmeta);
+		} else {
+		    &sorttools::format_string_english (\$sortmeta);
+		}
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+
+	if (defined $self->{'metaname'}) {
+	    my $metavalue = $doc_obj->get_metadata_element ($doc_obj->get_top_section(),
+							    $self->{'metaname'});
+	    if (defined $metavalue) {
+		if (defined $self->{'list'}->{$doc_OID}) {
+		    my $outhandle = $self->{'outhandle'};
+		    print $outhandle "WARNING: List::classify called multiple times for $doc_OID\n";
+		} 
+		$self->{'list'}->{$doc_OID} = $sortmeta;
+	    }
+	} else {
+	    if (defined $self->{'list'}->{$doc_OID}) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "WARNING: List::classify called multiple times for $doc_OID\n";
+	    } 
+	    $self->{'list'}->{$doc_OID} = $sortmeta;
+	}
+    } else {
+	if (defined $self->{'metaname'}) {
+	    my $metavalue = $doc_obj->get_metadata_element ($doc_obj->get_top_section(),
+							    $self->{'metaname'});
+	    if (defined $metavalue) {
+		push (@{$self->{'list'}}, $doc_OID);
+	    }
+	} else {
+	    push (@{$self->{'list'}}, $doc_OID);
+	}	    	    
+    }
+}
+
+sub get_classify_info {
+    my $self = shift (@_);
+    my ($no_thistype) = @_;
+    $no_thistype = 0 unless defined $no_thistype;
+
+    my @list = ();
+    if (defined $self->{'sortname'}) {
+	if (keys %{$self->{'list'}}) {
+	    @list = sort {$self->{'list'}->{$a} 
+			  cmp $self->{'list'}->{$b};} keys %{$self->{'list'}};
+	}
+    } else {
+	@list = @{$self->{'list'}};
+    }
+
+    # organise into classification structure
+    my %classifyinfo = ('childtype'=>'VList',
+			'Title'=>$self->{'title'},
+			'contains'=>[]);
+    $classifyinfo{'thistype'} = 'Invisible' unless $no_thistype;
+
+    foreach $OID (@list) {
+	push (@{$classifyinfo{'contains'}}, {'OID'=>$OID});
+    }
+
+    return \%classifyinfo;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/SectionList.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/SectionList.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/SectionList.pm	(revision 21083)
@@ -0,0 +1,150 @@
+###########################################################################
+#
+# SectionList.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Same as List classifier but includes all sections of document
+# (excluding top level) rather than just top level document 
+# itself
+
+package SectionList;
+
+use List;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('List');
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify SectionList [options]
+  options:
+
+   -metadata X    Metadata field used for classification,
+                  list will be sorted by this element.
+
+   -buttonname X  (optional) Title field for this classification.
+                  if not included title field will be Metaname. 
+
+   -sort X        (optional) Sort documents in list by this metadata field.
+                  By default it will sort by Metaname, or (if this is not
+                  set) in build (random) order.
+
+Same as List classifier but includes all sections of document
+(excluding top level) rather than just top level document.
+";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new List($class, @_);
+ 
+    return bless $self, $class;
+}
+
+sub classify {
+    my $self = shift (@_);
+    my ($doc_obj, @options) = @_;
+    
+    my $thissection = undef;
+
+    my $option;
+    foreach $option (@options)
+    {
+	if ($option =~ m/^section=(\d+)$/i) 
+	{
+	    $thissection = $1;
+	}
+    }
+
+    my $sortmeta = "";
+    if (defined $self->{'sortname'}) {
+	if ($self->{'sortname'} =~ /^filename$/i) {
+	    $sortmeta = $doc_obj->get_source_filename();
+	} else {
+	    $sortmeta = $doc_obj->get_metadata_element($doc_obj->get_top_section(),
+						       $self->{'sortname'});
+	    if ($self->{'sortname'} eq "Creator") {
+		&sorttools::format_string_name_english (\$sortmeta);
+	    } else {
+		&sorttools::format_string_english (\$sortmeta);
+	    }
+	}
+	$sortmeta = "" unless defined $sortmeta;
+    }
+
+    if (!defined $thissection)
+    {
+	$thissection = $doc_obj->get_next_section ($doc_obj->get_top_section());
+	while (defined $thissection) {
+	    $self->classify_section($thissection, $doc_obj, $sortmeta);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+    else
+    {
+	$self->classify_section($thissection, $doc_obj, $sortmeta);
+    }
+}
+
+sub classify_section {
+    my $self = shift (@_);
+    my ($section, $doc_obj, $sortmeta) = @_;
+
+    my $doc_OID = $doc_obj->get_OID();
+    $sortmeta = "" unless defined $sortmeta;
+
+    if (defined $self->{'sortname'}) {
+	if (defined $self->{'metaname'}) {
+
+	    my $metavalue = $doc_obj->get_metadata_element ($section, $self->{'metaname'});
+	    if (defined $metavalue) {
+		if (defined $self->{'list'}->{"$doc_OID.$section"}) {
+		    my $outhandle = $self->{'outhandle'};
+		    print $outhandle "WARNING: SectionList::classify called multiple times for $doc_OID.$section\n";
+		} 
+		$self->{'list'}->{"$doc_OID.$section"} = $sortmeta;
+	    }
+	} else {
+	    if (defined $self->{'list'}->{"$doc_OID.$section"}) {
+		my $outhandle = $self->{'outhandle'};
+		print $outhandle "WARNING: SectionList::classify called multiple times for $doc_OID.$section\n";
+	    } 
+	    $self->{'list'}->{"$doc_OID.$section"} = $sortmeta;
+	}
+
+    } else {
+	if (defined $self->{'metaname'}) {
+
+	    my $metavalue = $doc_obj->get_metadata_element ($section, $self->{'metaname'});
+	    if (defined $metavalue) {
+		push (@{$self->{'list'}}, "$doc_OID.$section");
+	    }
+	} else {
+	    push (@{$self->{'list'}}, "$doc_OID.$section");
+	}
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/classify/phind.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/classify/phind.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/classify/phind.pm	(revision 21083)
@@ -0,0 +1,1429 @@
+###########################################################################
+#
+# phind.pm -- the Phind classifier
+#
+# Copyright (C) 2000 Gordon W. Paynter
+# Copyright (C) 2000 New Zealand Digital Library Project
+#
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# 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.
+#
+###########################################################################
+
+# The phind clasifier plugin. 
+# Options are dexcribed in the print_usage function.
+# Type "classinfo.pl phind" at the command line for a summary.
+
+package phind;
+
+use BasClas;
+use util;
+use ghtml;
+use unicode;
+
+my @removedirs = ();
+
+my %wanted_index_files = ('td'=>1,
+			  't'=>1,
+			  'ti'=>1,
+			  'tl'=>1,
+			  'tsd'=>1,
+			  'idb'=>1,
+			  'ib1'=>1,
+			  'ib2'=>1,
+			  'ib3'=>1,
+			  'i'=>1,
+			  'il'=>1,
+			  'w'=>1,
+			  'wa'=>1);
+
+sub BEGIN {
+    @ISA = ('BasClas');
+}
+
+sub END {
+    
+    # Tidy up stray files - we do this here as there's some weird problem
+    # preventing us from doing it in the get_classify_info() function (on
+    # windows at least) where the close() appears to fail on txthandle and
+    # dochandle, thus preventing us from deleting those files
+
+    foreach my $dir (@removedirs) {
+	if (-d $dir && opendir (DIR, $dir)) {
+	    my @files = readdir DIR;
+	    closedir DIR;
+	
+	    foreach $file (@files) {
+		next if $file =~ /^\.\.?$/;
+		my ($suffix) = $file =~ /\.([^\.]+)$/;
+		if (!defined $suffix || !defined $wanted_index_files{$suffix}) {
+		    # delete it!
+		    &util::rm (&util::filename_cat ($dir, $file));
+		}
+	    }
+	}
+    }
+}
+
+sub print_usage {
+    print STDERR "
+  usage: classify phind [options]
+
+  options:
+   -text Fields    The text used to build the phrase hierarchy.
+                   (default: 'section:Title,section:text')
+
+   -title Title    The metadata field used to describe each document.
+                   (default: 'Title')
+
+   -button Name    The label for the classifier screen and button in
+                   navigation bar. 
+                   (default: 'Phrase')
+
+   -language Regex Language or languages to use building hierarchy.
+                   Languages are identified by two-letter country codes
+                   like en (English), es (Spanish), and fr (French).
+                   Language is a regular expression, so 'en|fr' (English or
+                   French) and '..' (match any language) are valid.
+                   (default: 'en'.)
+
+   -savephrases File If set, the phrase infomation will be stored in 
+                     the given file as text. It is probably a good idea 
+                     to use an absolute path. 
+                     (default: not set)
+
+   -suffixmode N   The smode parameter to the phrase extraction program.  A
+                   value of 0 means that stopwords are ignored, and of 1
+                   means that stopwords are used.
+                   (default: 1)
+
+   -thesaurus Name Name of a thesaurus stored in phind format in the
+                   collection's etc directory.
+                   (default: not set)
+
+   -untidy         Don't remove working files.
+
+"; }
+
+# Phrase delimiter symbols - these should be abstracted out someplace
+
+my $colstart = "COLLECTIONSTART";
+my $colend   = "COLLECTIONEND";
+my $doclimit = "DOCUMENTLIMIT";
+my $senlimit = "SENTENCELIMIT";
+my @delimiters = ($colstart, $colend, $doclimit, $senlimit);
+
+
+# Create a new phind browser based on collect.cfg
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasClas($class, @_);
+
+    my $out = $self->{'outhandle'};
+
+    # Ensure the Phind generate scripts are in place
+    my $file1 = &util::filename_cat($ENV{'GSDLHOME'}, "bin", $ENV{'GSDLOS'}, "suffix");
+    $file1 .= ".exe" if $ENV{'GSDLOS'} =~ /^windows$/;
+    my $src = &util::filename_cat($ENV{'GSDLHOME'}, "src", "phind", "generate");
+
+    if (!(-e $file1)) {
+	print STDERR "phind.pm: ERROR: The phind \"suffix\" program is not installed.\n\n";
+	exit(1);
+    }
+
+    # Parse classifier arguments
+    my $builddir = "";
+    if (!parsargv::parse(\@_, 
+			 q^text/.*/section:Title,section:text^, \$self->{'indexes'},
+			 q^title/.*/Title^, \$self->{'titlefield'},
+			 q^button/.*/Phrase^, \$self->{'buttonname'},
+			 q^language/.*/en^, \$language,
+			 q^builddir/.*/^, \$builddir,
+			 q^savephrases/.*/^, \$self->{'savephrases'},
+			 q^suffixmode/\d/1^, \$self->{'suffixmode'},
+			 q^thesaurus/.*/^, \$self->{'thesaurus'},
+			 q^untidy^, \$self->{'untidy'},
+			 "allow_extra_options")) {
+	
+	print STDERR "\nIncorrect options passed to $class, check your collect.cfg file\n";
+	&print_usage();
+	die "\n";
+    }
+    
+    # classifier information
+    $self->{'collection'} = $ENV{'GSDLCOLLECTION'};
+
+    # limit languages
+    $self->{'language_exp'} = $language;
+    
+    # collection directories
+    $self->{'collectiondir'} = $ENV{'GSDLCOLLECTDIR'};
+    if (!$builddir) {
+	$builddir = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "building");
+    }
+    $self->{'builddir'} = $builddir;
+
+    $self->{'total'} = 0;
+   
+    return bless $self, $class;
+}
+
+
+# Initialise the phind classifier
+
+sub init {
+    my $self = shift (@_);
+
+    # ensure we have a build directory
+    my $builddir = $self->{'builddir'};
+    die unless (-e "$builddir");
+
+    # create phind directory
+    my $phnumber = 1;
+    my $phinddir = &util::filename_cat($builddir, "phind1");
+    while (-e "$phinddir") {
+	$phnumber++;
+	$phinddir = &util::filename_cat($builddir, "phind$phnumber");
+    }
+    &util::mk_dir("$phinddir");
+    $self->{'phinddir'} = $phinddir;
+    $self->{'phindnumber'} = $phnumber;
+
+    push(@removedirs, $phinddir) unless $self->{'untidy'};
+
+    # open filehandles for documents and text
+    my $clausefile =  &util::filename_cat("$phinddir", "clauses");
+    &util::rm($clausefile) if (-e $clausefile);
+
+    my $txthandle = 'TEXT' . $phnumber;
+    open($txthandle, ">$clausefile") || die "Cannot open $clausefile: $!";
+    $self->{'txthandle'} = $txthandle;
+
+    my $docfile = &util::filename_cat("$phinddir", "docs.txt");
+    &util::rm($docfile) if (-e $docfile);
+
+    my $dochandle = 'DOC' . $phnumber;
+    open($dochandle, ">$docfile") || die "Cannot open $docfile: $!";
+    $self->{'dochandle'} = $dochandle;
+    
+}
+
+
+# Classify each document.
+#
+# Each document is passed here in turn.  The classifier extracts the 
+# text of each and stores it in the clauses file.  Document details are
+# stored in the docs.txt file. 
+
+sub classify {
+    my $self = shift (@_);
+    my $doc_obj = shift @_;
+
+    my $verbosity = $self->{'verbosity'};
+    my $top_section = $doc_obj->get_top_section();
+
+    my $titlefield = $self->{'titlefield'};
+    
+    my $title = $doc_obj->get_metadata_element ($top_section, $titlefield);
+    print "process: $title\n" if ($verbosity > 2);
+
+    # Only consider the file if it is in the correct language
+    my $doclanguage = $doc_obj->get_metadata_element ($top_section, "Language");
+    my $phrlanguage = $self->{'language_exp'};
+    return if ($doclanguage && ($doclanguage !~ /$phrlanguage/i));
+    
+    # record this file
+    $self->{'total'} ++;
+    print "file $self->{'total'}: $file\n" if ($self->{'$verbosity'});
+    
+
+    # Store document details
+    my $OID = $doc_obj->get_OID();
+    $OID = "NULL" unless defined $OID;
+    my $dochandle = $self->{'dochandle'};
+    print $dochandle "<Document>\t$OID\t$title\n";
+    
+    # Store the text occuring in this object
+
+    # output the document delimiter
+    my $txthandle = $self->{'txthandle'};
+    print $txthandle "$doclimit\n";
+
+    # iterarate over the required indexes and store their text
+    my $indexes = $self->{'indexes'};
+    my $text = "";
+    my ($part, $level, $field, $section, $data, $dataref);
+
+    foreach $part (split(/,/, $indexes)) {
+
+	# Each field has a level and a data element ((e.g. document:Title)
+	($level, $field) = split(/:/, $part);
+	die unless ($level && $field);
+	
+	# Extract the text from every section
+	# (In phind, document:text and section:text are equivalent)
+	if ($field eq "text") {
+	    $data = "";
+	    $section = $doc_obj->get_top_section();
+	    while (defined($section)) {
+		$data .= $doc_obj->get_text($section) . "\n";
+		$section = $doc_obj->get_next_section($section);
+	    }
+	    $text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	}
+	
+	# Extract a metadata field from a document
+	# (If there is more than one element of the given type, get them all.)
+	elsif ($level eq "document") {
+	    $dataref = $doc_obj->get_metadata($doc_obj->get_top_section(), $field);
+	    foreach $data (@$dataref) {
+		$text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	    } 
+	}
+
+	# Extract metadata from every section in a document
+	elsif ($level eq "section") {
+	    $data = "";
+	    $section = $doc_obj->get_top_section();
+	    while (defined($section)) {
+		$dataref = $doc_obj->get_metadata($section, $field);
+		$data .= join("\n", @$dataref) . "\n";
+		$section = $doc_obj->get_next_section($section);
+	    }
+	    $text .= convert_gml_to_tokens($phrlanguage, $data) . "\n";
+	} 
+	
+	# Some sort of specification which I don't understand
+	else {
+	    die "Unknown level ($level) in phind index ($part)\n";
+	}
+	
+    }
+
+    # output the text
+    $text =~ tr/\n//s;
+    print $txthandle "$text";
+}
+
+
+# Construct the classifier from the information already gathered
+#
+# When get_classify_info is called, the clauses and docs.txt files have
+# already been constructed in the phind directory.  This function will
+# translate them into compressed, indexed MGPP files that can be read by
+# the phindcgi script.  It will also register our classifier so that it
+# shows up in the navigation bar.
+
+sub get_classify_info {
+    my $self = shift (@_);
+
+    close $self->{'dochandle'};
+    close $self->{'txthandle'};
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+    my $phinddir = $self->{'phinddir'};
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} !~ /^windows$/i) {
+	$osextra = " -d /";
+    }
+
+    if ($verbosity) {
+	print $out "\n*** phind.pm generating indexes for ", $self->{'indexes'}, "\n";
+	print $out "***          in ", $self->{'phinddir'}, "\n";
+    }
+
+    # Construct phind indexes
+    my $suffixmode = $self->{'suffixmode'};
+    my ($command, $status);
+    
+    # Generate the vocabulary, symbol statistics, and numbers file
+    # from the clauses file
+    print $out "\nExtracting vocabulary and statistics\n" if $verbosity;
+    &extract_vocabulary($self);
+
+    # Use the suffix program to generate the phind/phrases file
+    print $out "\nExtracting phrases from processed text (with suffix)\n" if $verbosity;
+    &execute("suffix \"$phinddir\" $suffixmode $verbosity", $verbosity, $out);
+
+    # Create the phrase file and put phrase numbers in phind/phrases
+    print $out "\nSorting and renumbering phrases for input to mgpp\n" if $verbosity;
+    &renumber_phrases($self);
+
+    print $out "\nCreating phrase databases\n";
+    my $mg_input = &util::filename_cat($phinddir, "pdata.txt");
+    my $mg_stem = &util::filename_cat($phinddir, "pdata");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 \"$mg_input\"", $verbosity, $out);
+
+    # create the mg index of words
+    print $out "\nCreating word-level search indexes\n";
+    $mg_input = &util::filename_cat($phinddir, "pword.txt");
+    $mg_stem = &util::filename_cat($phinddir, "pword");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 -I1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_perf_hash_build $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 -I2 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_weights_build $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_invf_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 1", $verbosity, $out);
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 2", $verbosity, $out);
+    &execute("mgpp_stem_idx $osextra -f \"$mg_stem\" -s 3", $verbosity, $out);
+
+    # create the mg document information database
+    print $out "\nCreating document information databases\n";
+    $mg_input = &util::filename_cat($phinddir, "docs.txt");
+    $mg_stem = &util::filename_cat($phinddir, "docs");
+
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T1 \"$mg_input\"", $verbosity, $out);
+    &execute("mgpp_compression_dict $osextra -f \"$mg_stem\"", $verbosity, $out);
+    &execute("mgpp_passes $osextra -f \"$mg_stem\" -T2 \"$mg_input\"", $verbosity, $out);
+
+    # Return the information about the classifier that we'll later want to
+    # use to create macros when the Phind classifier document is displayed.
+    my %classifyinfo = ('thistype'=>'Invisible',
+                        'childtype'=>'Phind', 
+                        'Title'=>$self->{'buttonname'},
+                        'parameters'=>"phindnumber=$self->{'phindnumber'}",
+			'contains'=>[]);
+    
+    my $collection = $self->{'collection'};
+    my $url = "library?a=p&p=phind&c=$collection";
+    push (@{$classifyinfo{'contains'}}, {'OID'=>$url});
+   
+    return \%classifyinfo;
+}
+
+
+
+sub convert_gml_to_tokens {
+    
+    my ($language_exp, $text) = @_;
+
+    # escape any magic words... - jrm21
+    foreach my $delim (@delimiters) {
+	my $replacement=lc($delim);
+	my $num= $text=~ s/$delim/$replacement/g;
+	if (!$num) {$num=0;}
+    }
+
+    if ($language_exp =~ /en/) {
+	return &convert_gml_to_tokens_EN($text);
+    }
+
+    $_ = $text;
+
+    # 1. remove GML tags
+
+    # Remove everything that is in a tag
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isgo;
+    s/\s*<br>\s*/ LINEBREAK /isgo;
+    s/<[^>]*>/ /sgo;
+
+    # Now we have the text, but it may contain HTML 
+    # elements coded as &gt; etc.  Remove these tags. 
+    s/&amp;/&/sgo;
+    s/&lt;/</sgo;
+    s/&gt;/>/sgo;
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isgo;
+    s/\s*<br>\s*/ LINEBREAK /isgo;
+    s/<[^>]*>/ /sgo;
+
+    # replace<p> and <br> placeholders with clause break symbol (\n)
+    s/\s+/ /gso;
+    s/PARAGRAPHBREAK/\n/sgo;
+    s/LINEBREAK/\n/sgo;
+
+    
+
+
+    # 2. Split the remaining text into space-delimited tokens
+
+    # Convert any HTML special characters (like &quot;) to their UTF8 equivalent
+    s/&([^;]+);/&unicode::ascii2utf8(\&ghtml::getcharequiv($1,1))/gse;
+
+    # Split text at word boundaries
+    s/\b/ /go;
+
+    # 3. Convert the remaining text to "clause format"
+
+    # Insert newline if the end of a sentence is detected
+    # (delimter is:  "[\.\?\!]\s")
+    # s/\s*[\.\?\!]\s+/\n/go; 
+
+    # remove unnecessary punctuation and replace with clause break symbol (\n)
+    s/[^\w ]/\n/go;
+
+    # remove extraneous whitespace
+    s/ +/ /sgo;
+    s/^\s+//mgo;
+    s/\s*$/\n/mgo;
+
+    # remove lines that contain one word or less
+    s/^\S*$//mgo;
+    s/^\s*$//mgo;
+    tr/\n//s;
+
+    return $_;
+}
+
+# A version of convert_gml_to_tokens that is fine-tuned to the English language.
+
+sub convert_gml_to_tokens_EN {
+    $_ = shift @_;
+
+    # FIRST, remove GML tags
+
+    # Replace all whitespace with a simple space
+    s/\s+/ /gs;
+
+    # Remove everything that is in a tag
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # Now we have the text, but it may contain HTML 
+    # elements coded as &gt; etc.  Remove these tags. 
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+
+    s/\s+/ /sg;
+    s/\s*<p>\s*/ PARAGRAPHBREAK /isg;
+    s/\s*<br>\s*/ LINEBREAK /isg;
+    s/<[^>]*>/ /sg;
+
+    # remove &amp; and other miscellaneous markup tags
+    s/&amp;/&/sg;
+    s/&lt;/</sg;
+    s/&gt;/>/sg;
+    s/&amp;/&/sg;
+
+    # replace<p> and <br> placeholders with carriage returns
+    s/PARAGRAPHBREAK/\n/sg;
+    s/LINEBREAK/\n/sg;
+
+
+    # Exceptional punctuation
+    # 
+    # We make special cases of some punctuation
+
+    # remove any apostrophe that indicates omitted letters 
+    s/(\w+)\'(\w*\s)/ $1$2 /g;
+
+    # remove period that appears in a person's initals
+    s/\s([A-Z])\./ $1 /g;
+
+    # replace hyphens in hypheanted words and names with a space
+    s/([A-Za-z])-\s*([A-Za-z])/$1 $2/g;
+
+    # Convert the remaining text to "clause format",
+    # This means removing all excess punctuation and garbage text,
+    # normalising valid punctuation to fullstops and commas,
+    # then putting one cluse on each line.
+
+    # Insert newline when the end of a sentence is detected
+    # (delimter is:  "[\.\?\!]\s")
+    s/\s*[\.\?\!]\s+/\n/g; 
+
+    # split numbers after four digits
+    s/(\d\d\d\d)/$1 /g;
+
+    # split words after 32 characters
+
+    # squash repeated punctuation 
+    tr/A-Za-z0-9 //cs;
+
+    # save email addresses
+    # s/\w+@\w+\.[\w\.]+/EMAIL/g;
+
+    # normalise clause breaks (mostly punctuation symbols) to commas
+    s/[^A-Za-z0-9 \n]+/ , /g;
+
+    # Remove repeated commas, and replace with newline
+    s/\s*,[, ]+/\n/g;
+
+    # remove extra whitespace
+    s/ +/ /sg;
+    s/^\s+//mg;
+    s/\s*$/\n/mg;
+
+    # remove lines that contain one word or less
+    s/^\w*$//mg;
+    s/^\s*$//mg;
+    tr/\n//s;
+
+    return $_;
+
+}
+
+
+
+# Execute a system command
+
+sub execute {
+    my ($command, $verbosity, $outhandle) = @_;
+    print $outhandle "Executing: $command\n"  if ($verbosity > 2);
+    $! = 0;
+    my $status = system($command);
+    if ($status != 0) {
+	print STDERR "phind - Error executing '$command': $!\n";
+	exit($status);
+    }
+}
+
+
+# Generate the vocabulary, symbol statistics, and numbers file from the
+# clauses file.  This is legacy code, so is a bit messy and probably wont
+# run under windows.
+
+sub extract_vocabulary {
+    my ($self) = @_;
+    
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+
+    my $collectiondir = $self->{'collectiondir'};
+    my $phinddir = $self->{'phinddir'};
+
+    my $language_exp = $self->{'language_exp'};
+
+    my ($w, $l, $line, $word);
+    
+    my ($first_delimiter, $last_delimiter,
+	$first_stopword, $last_stopword,
+	$first_extractword, $last_extractword,
+	$first_contentword, $last_contentword,
+	$phrasedelimiter);
+    
+    my $thesaurus = $self->{'thesaurus'};
+    my ($thesaurus_links, $thesaurus_terms, 
+	%thesaurus, $first_thesaurusword, $last_thesaurusword);
+
+    my %symbol;
+    my (%freq);
+
+    print $out "Calculating vocabulary\n" if ($verbosity > 1);
+
+    # Read and store the stopwords
+    my $stopdir = &util::filename_cat($ENV{'GSDLHOME'}, "etc", "packages", "phind", "stopword");
+    my $stopword_files = ();
+    my ($language, $language_dir, $file, $file_name);
+    my %stopwords;
+
+    # Examine each directory in the stopword directory
+    opendir(STOPDIR, $stopdir);
+    foreach $language (readdir STOPDIR) {
+
+	# Ignore entries that do not match the classifier's language
+	next unless ($language =~ /$language_exp/);
+	$language_dir = &util::filename_cat($stopdir, $language);
+	next unless (-d "$language_dir");
+
+	opendir(LANGDIR, $language_dir);
+	foreach $file (readdir LANGDIR) {
+
+	    # Ignore entries that are not stopword files
+	    next unless ($file =~ /sw$/);
+	    $file_name = &util::filename_cat($language_dir, $file);
+	    next unless (-f "$file_name");
+
+	    # Read the stopwords
+	    open(STOPFILE, "<$file_name");
+	    while (<STOPFILE>) {
+		s/^\s+//;
+		s/\s.*//;
+		$word = $_;
+		$l = lc($word);
+		$stopwords{$l} = $word;
+	    }
+	    close STOPFILE;
+
+	}
+	closedir LANGDIR;
+    }
+    closedir STOPDIR;
+
+    # Read thesaurus information
+    if ($thesaurus) {
+
+	# link file exists
+	$thesaurus_links = &util::filename_cat($collectiondir, "etc", "$thesaurus.lnk");
+	die "Cannot find thesaurus link file" unless (-e "$thesaurus_links");
+
+	# ensure term file exists in the correct language
+	if ($language_exp =~ /^([a-z][a-z])/) {
+	    $language = $1;
+	} else {
+	    $language = 'en';
+	}
+	$thesaurus_terms = &util::filename_cat($collectiondir, "etc", "$thesaurus.$language");
+	die "Cannot find thesaurus term file" unless (-e "$thesaurus_terms");
+	
+
+	# Read the thesaurus terms
+	open(TH, "<$thesaurus_terms");
+	while(<TH>) {
+	    s/^\d+ //;
+	    s/\(.*\)//;
+	    foreach $w (split(/\s+/, $_)) {
+		$thesaurus{lc($w)} = $w;
+	    }
+	}
+	close TH;
+    }
+
+    # Read words in the text and count occurences
+    open(TXT, "<$phinddir/clauses");
+
+    my @words;
+    while(<TXT>) {
+	$line = $_;
+	next unless ($line =~ /./);
+	
+	@words = split(/\s+/, $line);
+	foreach $w (@words) {
+	    $l = lc($w);
+	    $w = $l if ((defined $stopwords{$l}) || (defined $thesaurus{$l}));
+	    $freq{$w}++;
+	}
+	$freq{$senlimit}++;
+    }
+    
+    close TXT;
+
+    # Calculate the "best" form of each word
+    my (%bestform, %totalfreq, %bestfreq);
+
+    foreach $w (sort (keys %freq)) {
+	$l = lc($w);
+	
+	# totalfreq is the number of times a term appears in any form
+	$totalfreq{$l} += $freq{$w};
+	
+	if (defined $stopwords{$l}) {
+	    $bestform{$l} = $stopwords{$l};
+	    
+	} elsif (defined $thesaurus{$l}) {
+	    $bestform{$l} = $thesaurus{$l};
+	    
+	} elsif (!$bestform{$l} || ($freq{$w} > $bestfreq{$l})) {
+	    $bestfreq{$l} = $freq{$w};
+	    $bestform{$l} = $w;
+	}
+    }
+    undef %freq;
+    undef %bestfreq;
+    
+
+    # Assign symbol numbers to tokens
+    my $nextsymbol = 1;
+    my (@vocab);
+    
+    # Delimiters
+    $first_delimiter = 1;
+    
+    foreach $word (@delimiters) {
+
+#	$word = lc($word); # jrm21
+	$word = uc($word);
+	$bestform{$word} = $word;
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_delimiter = $nextsymbol - 1;
+    # Stopwords
+    $first_stopword = $nextsymbol;
+    
+    foreach my $word (sort keys %stopwords) {
+	# don't include stopword unless it occurs in the text
+	$word = lc($word);
+	next unless ($totalfreq{$word});
+	next if ($symbol{$word});
+	
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_stopword = $nextsymbol - 1;
+    $first_contentword = $nextsymbol;
+    
+    # Thesaurus terms
+    if ($thesaurus) {
+	$first_thesaurusword = $nextsymbol;
+    
+	foreach my $word (sort keys %thesaurus) {
+	    
+	    $word = lc($word);
+	    next if ($symbol{$word});
+	    $bestform{$word} = $thesaurus{$word};
+	    
+	    $vocab[$nextsymbol] = $word;
+	    $symbol{$word} = $nextsymbol;
+	    $nextsymbol++;
+	    
+	}
+	$last_thesaurusword = $nextsymbol - 1;
+    }
+
+    # Other content words
+    $first_extractword = $nextsymbol;
+    
+    foreach my $word (sort (keys %bestform)) {
+	
+	next if ($symbol{$word});
+	
+	$vocab[$nextsymbol] = $word;
+	$symbol{$word} = $nextsymbol;
+	$nextsymbol++;
+    }
+    $last_extractword = $nextsymbol - 1;
+    $last_contentword = $nextsymbol - 1;
+    
+    # Outut the words
+    print $out "Saving vocabulary in $phinddir/clauses.vocab\n" if ($verbosity > 1);
+    open(VOC, ">$phinddir/clauses.vocab");
+
+    for (my $i = 1; $i < $nextsymbol; $i++) {
+	$w = $vocab[$i];
+
+	print VOC "$bestform{$w}\n";
+	$totalfreq{$w} = 0 unless ($totalfreq{$w});
+    }
+    close VOC;
+
+
+    # Create statistics file
+    # Output statistics about the vocablary
+    print $out "Saving statistics in $phinddir/clauses.stats\n" if ($verbosity > 1);
+    &util::rm("$phinddir/clauses.stats") if (-e "$phinddir/clauses.stats");
+
+    open(STAT, ">$phinddir/clauses.stats")
+	|| die "Cannot open $phinddir/clauses.stats: $!";
+
+    print STAT "first_delimiter $first_delimiter\n";
+    print STAT "last_delimiter $last_delimiter\n";
+    print STAT "first_stopword $first_stopword\n";
+    print STAT "last_stopword $last_stopword\n";
+    if ($thesaurus) {
+	print STAT "first_thesaurusword $first_thesaurusword\n";
+	print STAT "last_thesaurusword $last_thesaurusword\n";
+    }
+    print STAT "first_extractword $first_extractword\n";
+    print STAT "last_extractword $last_extractword\n";
+    print STAT "first_contentword $first_contentword\n";
+    print STAT "last_contentword $last_contentword\n";
+    print STAT "first_symbol $first_delimiter\n";
+    print STAT "last_symbol $last_contentword\n";
+    print STAT "first_word $first_stopword\n";
+    print STAT "last_word $last_contentword\n";
+    close STAT;
+
+    undef @vocab;
+
+
+    # Create numbers file
+    # Save text as symbol numbers
+    print $out "Saving text as numbers in $phinddir/clauses.numbers\n" if ($verbosity > 1);
+    
+    open(TXT, "<$phinddir/clauses");
+    open(NUM, ">$phinddir/clauses.numbers");
+    
+##    $phrasedelimiter = $symbol{lc($senlimit)}; # jrm21
+##    print NUM "$symbol{lc($colstart)}\n"; # jrm21
+    $phrasedelimiter = $symbol{$senlimit};
+    print NUM "$symbol{$colstart}\n";
+    
+    # set up the special symbols that delimit documents and sentences
+    while(<TXT>) {
+	
+	# split sentence into a list of tokens
+	$line = $_;
+	next unless ($line =~ /./);
+	@words = split(/\s+/, $line);
+	
+	# output one token at a time
+	foreach $word (@words) {
+# don't lower-case special delimiters - jrm21
+	    if (!map {if ($word eq $_) {1} else {()}} @delimiters) {
+		$word = lc($word);
+	    }
+	    print NUM "$symbol{$word}\n";
+	}
+	
+	# output phrase delimiter
+	print NUM "$phrasedelimiter\n";
+    }
+    
+    close TXT;
+#    print NUM "$symbol{lc($colend)}\n";# jrm21
+    print NUM "$symbol{$colend}\n";
+    close NUM;
+
+    # Save thesaurus  data in one convienient file
+    if ($thesaurus) {
+
+	my $thesaurusfile = &util::filename_cat($phinddir, "$thesaurus.numbers");
+
+
+	print $out "Saving thesaurus as numbers in $thesaurusfile\n" 
+	    if ($verbosity > 1);
+
+	# Read the thesaurus terms
+	my ($num, $text, %thes_symbols);
+	
+	open(TH, "<$thesaurus_terms");
+	while(<TH>) {
+	    chomp;
+	    @words = split(/\s+/, $_);
+	    $num = shift @words;
+	    $text = "";
+
+	    # translate words into symbol numbers
+	    foreach $word (@words) {
+		$word = lc($word);
+		if ($symbol{$word}) {
+		    $text .= "s$symbol{$word} ";
+		} elsif ($verbosity) {
+		    print $out "phind: No thesaurus symbol, ignoring \"$word\"\n";
+		}
+	    }
+	    $text =~ s/ $//;
+	    $thes_symbols{$num} = $text;
+	}
+	close TH;
+
+	# Read the thesaurus links and write the corresponding data
+	open(TH, "<$thesaurus_links");
+	open(THOUT, ">$thesaurusfile");
+
+	while(<TH>) {
+	    chomp;
+	    ($num, $text) = split(/:/, $_);
+
+	    if (defined($thes_symbols{$num})) {
+		print THOUT "$num:$thes_symbols{$num}:$text\n";
+	    } else {
+		print THOUT "$num:untranslated:$text\n";
+	    }
+	}
+	close TH;    
+	close THOUT;
+    }
+
+
+
+
+}
+
+
+# renumber_phrases
+#
+# Prepare the phrases file to be input to mgpp.  The biggest problem is
+# reconciling the phrase identifiers used by the suffix program (which
+# we'll call suffix-id numbers) with the numbers used in the thesaurus
+# (theesaurus-id) to create a ciommon set of phind id numbers (phind-id).
+# Phind-id numbers must be sorted by frequency of occurance.
+#
+# Start creating a set of phind-id numbers from the sorted suffix-id
+# numbers and (if required) the thesaurus-id numbers.  Then add any other
+# phrases occuring in the thesaurus.
+#
+# The last thing we have to do is restore the vocabulary information to the
+# phrase file so that the phrases are stored as words, not as symbol
+# numbers.
+
+# The original phrases file looks something like this:
+#   159396-1:s5175:4:1:116149-2:3:d2240,2;d2253;d2254
+#   159409-1:s5263:6:1:159410-2:6:d2122;d2128;d2129;d2130;d2215;d2380
+#   159415-1:s5267:9:1:159418-2:8:d3,2;d632;d633;d668;d1934;d2010;d2281;d2374
+#   159426-1:s5273:5:2:159429-2,115168-17:5:d252;d815;d938;d939;d2361
+
+
+sub renumber_phrases {
+    my ($self) = @_;
+
+    renumber_suffix_data($self);
+    renumber_thesaurus_data($self);
+    restore_vocabulary_data($self);
+
+}
+
+
+
+# renumber_suffix_data
+#
+# Translate phrases file to phrases.2 using phind keys instead
+# of suffix keys and sorting the expansion data.
+
+sub renumber_suffix_data {
+    my ($self) = @_;
+    
+    my $verbosity = $self->{'verbosity'};
+    my $out = $self->{'outhandle'};
+    print $out "Translate phrases: suffix-ids become phind-id's\n" 
+	if ($verbosity);
+    
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, 'phrases');
+    my $outfile = &util::filename_cat($phinddir, 'phrases.2');
+
+    # Read the phrase file.  Calculate initial set of phind-id
+    # numbers and store (suffixid -> frequency) relation.
+
+    my %suffixtophind;
+    my @phindfrequency;
+    my (@fields, $suffixid);
+    my $nextphind = 1;
+    
+    open(IN, "<$infile");
+    while(<IN>) {
+
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get next suffixid and phindid
+	$suffixid = shift @fields;
+	$suffixtophind{$suffixid} = $nextphind;
+
+	# store total frequency
+	shift @fields;
+	$totalfrequency[$nextphind] = shift @fields;
+
+	$nextphind++;
+    }
+    close IN;
+
+
+    # Translate phrases file to phrases.2.  Use phind keys (not suffix
+    # keys), sort expansion and document occurance data in order of
+    # descending frequency..
+    open(IN, "<$infile");
+    open(OUT, ">$outfile");
+    
+    my ($phindid, $text, $tf, $countexp, $expansions, $countdocs, $documents);
+    my (@documwents, @newexp, $k, $n);
+    my $linenumber = 0;
+
+    while(<IN>) {
+	
+	# read the line
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get a phrase number for this line
+	$suffixid = shift @fields;
+	die unless (defined($suffixtophind{$suffixid}));
+	$phindid = $suffixtophind{$suffixid};
+	
+	# get the symbols in the phrase
+	$text = shift @fields;
+
+	# output status information
+	$linenumber++;
+	if ($verbosity > 2) {
+	    if ($linenumber % 1000 == 0) {
+		print $out "line $linenumber:\t$phindid\t$suffixid\t($text)\n";
+	    } 
+	    print $out "$num: $key\t($text)\n" if ($verbosity > 3);
+	}
+
+	# get the phrase frequency
+	$tf = shift @fields;
+	
+	# get the number of expansions
+	$countexp = shift @fields;
+	
+	# get the expansions, convert them into phind-id numbers, and sort them
+	$expansions = shift @fields;
+	@newexp = ();
+	foreach $k (split(/,/, $expansions)) {
+	    die "ERROR - no phindid for: $k" unless (defined($suffixtophind{$k}));
+	    $n = $suffixtophind{$k};
+	    push @newexp, $n;
+	}
+	@newexp = sort {$totalfrequency[$b] <=> $totalfrequency[$a]} @newexp;
+
+	# get the number of documents
+	$countdocs = shift @fields;
+	
+	# get the documents and sort them
+	$documents = shift @fields;
+	$documents =~ s/d//g;
+	@documents = split(/;/, $documents);
+	@documents = sort by_doc_frequency @documents;
+
+	# output the phrase data
+ 	print OUT "$phindid:$text:$tf:$countexp:$countdocs:";
+	print OUT join(",", @newexp), ",:", join(";", @documents), ";\n";
+	
+    }
+
+    close IN;
+    close OUT;
+}
+
+
+# renumber_thesaurus_data
+#
+# Translate phrases.2 to phrases.3, adding thesaurus data if available.
+
+sub renumber_thesaurus_data {
+    my ($self) = @_;
+  
+    my $out = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    my $thesaurus = $self->{'thesaurus'};
+
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, "phrases.2");
+    my $outfile = &util::filename_cat($phinddir, "phrases.3");
+
+
+    # If no thesaurus is defined, simply move the phrases file.
+    if (!$thesaurus) {
+	print $out "Translate phrases.2: no thesaurus data\n" 
+	    if ($verbosity);
+	&util::mv($infile, $outfile);
+	return;
+    }
+
+    print $out "Translate phrases.2: add thesaurus data\n" 
+	if ($verbosity);
+
+    # 1.
+    # Read thesaurus file and store (symbols->thesaurusid) mapping
+    my $thesaurusfile = &util::filename_cat($phinddir, "$thesaurus.numbers");
+    my %symbolstothesid;
+    my (@fields, $thesid, $symbols);
+    
+    open(TH, "<$thesaurusfile");
+
+    while (<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# get id and text
+	$thesid = shift @fields;
+	$symbols = shift @fields;
+	$symbolstothesid{$symbols} = $thesid;
+    }
+    close TH;    
+
+    # 2. 
+    # Read phrases file to find thesaurus entries that already
+    # have a phindid.  Store their phind-ids for later translation,
+    # and store their frequency for later sorting.
+    my %thesaurustophindid;
+    my %phindidtofrequency;
+    my ($phindid, $freq);
+
+    open(IN, "<$infile");
+    
+    while(<IN>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# phindid and symbols for this line
+	$phindid = shift @fields;
+	$symbols = shift @fields;
+	$freq = shift @fields;
+
+	# do we have a thesaurus id corresponding to this phrase?
+	if (defined($symbolstothesid{$symbols})) {
+	    $thesid = $symbolstothesid{$symbols};
+	    $thesaurustophindid{$thesid} = $phindid;
+	    $phindidtofrequency{$phindid} = $freq;
+	}
+    }
+    close IN;
+  
+    undef %symbolstothesid;
+
+    # 3.
+    # Create phind-id numbers for remaining thesaurus entries,
+    # and note that their frequency is 0 for later sorting.
+    my $nextphindid = $phindid + 1;
+
+    open(TH, "<$thesaurusfile");
+    while(<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# read thesaurus-id and ensure it has a corresponding phind-id
+	$thesid = shift @fields;
+	if (!defined($thesaurustophindid{$thesid})) {
+	    $thesaurustophindid{$thesid} = $nextphindid;
+	    $phindidtofrequency{$nextphindid} = 0;
+	    $nextphindid++;
+	}
+    }
+    close TH;
+
+    # 4.
+    # Translate thesaurus file, replacing thesaurus-id numbers with 
+    # phind-id numbers.
+    my $newthesaurusfile = &util::filename_cat($phinddir, "$thesaurus.phindid");
+    my ($relations, $linkcounter, $linktext, $linktype, @linkdata);
+    my (@links, $linkid, %linkidtotype, $newrelation);
+
+    open(TH, "<$thesaurusfile");
+    open(TO, ">$newthesaurusfile");
+    while(<TH>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+	
+	# phindid and symbols for this line
+	($thesid, $symbols, $relations) = @fields;
+	
+	die unless ($thesid && $symbols);
+	die unless $thesaurustophindid{$thesid};
+	$phindid = $thesaurustophindid{$thesid};
+
+	# convert each part of the relation string to use phind-id numbers
+	# at the same time, we want to sort the list by frequency.
+	undef %linkidtotype;
+	
+	foreach $linktext (split(/;/, $relations)) {
+	    @linkdata = split(/,/, $linktext);
+	    
+	    # remember the linktype (e.g. BT, NT)
+	    $linktype = shift @linkdata;
+	    
+	    # store the type of each link
+	    foreach $thesid (@linkdata) {
+		die unless (defined($thesaurustophindid{$thesid}));
+		$linkidtotype{$thesaurustophindid{$thesid}} = $linktype;
+	    }
+	}
+
+	# sort the list of links, first by frequency, then by type.
+	@links = sort { ($phindidtofrequency{$b} <=> $phindidtofrequency{$a}) 
+                        or ($linkidtotype{$a} cmp $linkidtotype{$b}) } (keys %linkidtotype);
+	$linkcounter = (scalar @links);
+
+	# create a string describing the link information
+	$linktype = $linkidtotype{$links[0]};
+	$newrelation = $linktype;
+	foreach $linkid (@links) {
+	    if ($linkidtotype{$linkid} ne $linktype) {
+		$linktype = $linkidtotype{$linkid};
+		$newrelation .= ";" . $linktype;
+	    }
+	    $newrelation .= "," . $linkid;
+	}
+	$newrelation .= ";";
+	
+
+	# output the new line
+	print TO "$phindid:$symbols:$linkcounter:$newrelation:\n";
+    }
+    close TH;
+    close TO;
+
+    undef %thesaurustophindid;
+    undef %linkidtotype;
+    undef %phindidtofrequency;
+
+    # 5.
+    # Read thesaurus data (in phind-id format) into memory
+    my %thesaurusdata;
+
+    open(TH, "<$newthesaurusfile");
+    while(<TH>) {
+	chomp;
+	($phindid, $symbols, $linkcounter, $relations) = split(/:/, $_);
+	die unless ($phindid && $symbols);
+	$thesaurusdata{$phindid} = "$symbols:$linkcounter:$relations";
+    }
+    close TH;
+
+    # 6. 
+    # Add thesaurus data to phrases file
+    my ($text, $tf, $countexp, $expansions, $countdocs, $documents);
+    my (@documwents, @newexp, $k, $n);
+    my $linenumber = 0;
+
+    open(IN, "<$infile");
+    open(OUT, ">$outfile");
+
+    # Update existing phrases
+    while(<IN>) {
+	
+	chomp;
+	@fields = split(/:/, $_);
+		
+	# get data for this line
+	$phindid = shift @fields;
+	
+	# output the phrase data, with thesaurus information
+ 	print OUT "$phindid:", join(":", @fields);
+
+	# add thesaurus data
+	if (defined($thesaurusdata{$phindid})) {
+	    @fields = split(/:/, $thesaurusdata{$phindid});
+	    shift @fields;
+	    $linkcounter = shift @fields;
+	    $relations = shift @fields;
+
+	    print OUT ":$linkcounter:$relations";
+	    $thesaurusdata{$phindid} = "";
+	}
+	print OUT "\n";
+    }
+    close IN;
+
+    # Add phrases that aren't already in the file
+    foreach $phindid (sort numerically keys %thesaurusdata) {
+	next unless ($thesaurusdata{$phindid});
+
+	@fields = split(/:/, $thesaurusdata{$phindid});
+	$symbols = shift @fields;
+	$linkcounter = shift @fields;
+	$relations = shift @fields;
+
+	print OUT "$phindid:$symbols:0:0:0:::$linkcounter:$relations\n";
+    }
+    close OUT;
+
+}
+
+# restore_vocabulary_data
+#
+# Read phrases.3 and restore vocabulary information. Then write 
+# this data to the MGPP input files (pwrod.txt and pdata.txt) and
+# (if requested) to the saved phrases file.
+
+sub restore_vocabulary_data {
+    my ($self) = @_;
+ 
+    my $out = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    print $out "Translate phrases.3: restore vocabulary\n" if ($verbosity);
+
+    my $phinddir = $self->{'phinddir'};
+    my $infile = &util::filename_cat($phinddir, 'phrases.3');
+    my $vocabfile = &util::filename_cat($phinddir, 'clauses.vocab');
+    my $datafile = &util::filename_cat($phinddir, 'pdata.txt');
+    my $wordfile = &util::filename_cat($phinddir, 'pword.txt');
+
+    my $savephrases = $self->{'savephrases'};
+
+    # 1.
+    # Read the vocabulary file
+    open(V, "<$vocabfile")
+	|| die "Cannot open $vocabfile: $!";
+    my @symbol;
+    my $i = 1;
+    while(<V>) {
+	chomp;
+	$symbol[$i++] = $_;
+    }
+    close V;
+
+    # 2. 
+    # Translate phrases.3 to MGPP input files
+    my ($key, $text, $word, $isThesaurus);
+    my @fields;
+    my $linenumber = 0;
+
+    open(IN, "<$infile");
+    open(DATA, ">$datafile");
+    open(WORD, ">$wordfile");
+
+    # Save the phrases in a separate text file
+    if ($savephrases) {
+	print $out "Saving phrases in $savephrases\n" if ($verbosity);
+	open(SAVE, ">$savephrases");
+    }
+
+    while(<IN>) {
+	
+	# read the line
+	chomp;
+	$line = $_;
+	@fields = split(/:/, $line);
+	
+	# get a phrase number for this line
+	$key = shift @fields;
+	
+	# restore the text of the phrase
+	$text = shift @fields;
+	$text =~ s/s(\d+)/$symbol[$1]/g;
+	if ($text =~ / /) {
+	    $word = "";
+	} elsif ($text ne 'untranslated') {
+	    $word = $text;
+	}
+
+	# output the phrase data
+	print DATA "<Document>";
+ 	print DATA "$key:$text:", join(":", @fields), ":\n";
+	
+	# output the word index search data
+	print WORD "<Document>$word\n";
+
+	# output the phrases to a text file
+	if ($savephrases) {
+	    if ((scalar @fields) == 7) {
+		$isThesaurus = 1;
+	    } else {
+		$isThesaurus = 0;
+	    }
+	    print SAVE $fields[0], "\t", $fields[2], "\t$isThesaurus\t$text\n";
+	}
+    }
+    close IN;
+    close WORD;
+    close DATA;
+    close SAVE if ($savephrases);
+
+}
+
+
+
+# sort routines used to renumber phrases
+
+sub numerically { $a <=> $b }
+
+sub by_doc_frequency { 
+    my $fa = 1;
+    if ($a =~ /,/) {
+	$fa = $a;
+	$fa =~ s/\d+,//;
+    }
+    my $fb = 1;
+    if ($b =~ /,/) {
+	$fb = $b;
+	$fb =~ s/\d+,//;
+    }
+
+    return ($fb <=> $fa);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/cnseg.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/cnseg.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/cnseg.pm	(revision 21083)
@@ -0,0 +1,74 @@
+###########################################################################
+#
+# cnseg.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 package segments a chinese UTF-8 encoded Unicode
+# string into words.
+
+package cnseg;
+
+use unicode;
+
+
+# 'segment' takes a UTF-8 encoded Unicode Chinese-language
+# string and places U-200B between words -- the ZERO
+# WIDTH SPACE. Each line is treated as a separate 
+# paragraph, so lines in one paragraph should
+# be joined before using this method (normally a single
+# word might span more than one line within a paragraph).
+#
+# 'segment' is currently written in Perl, however, I (Rodger)
+# plan to use C++ (via pipes) once a more complex (and useful!)
+# algorithm is being used. Currently, each Chinese character
+# is treated as a seperate word.
+
+sub segment {
+    my ($in) = @_;
+    my ($c);
+
+    my $uniin = &unicode::utf82unicode($in);
+    my $out = [];
+
+    my $space = 1; # start doesn't need a space
+    foreach $c (@$uniin) {
+	if (($c >= 0x4e00 && $c <= 0x9fa5) ||
+	    ($c >= 0xf900 && $c <= 0xfa2d)) {
+	    # Chinese character
+	    push (@$out, 0x200b) unless $space;
+	    push (@$out, $c);
+	    push (@$out, 0x200b);
+	    $space = 1;
+
+	} else {
+	    # non-Chinese character
+	    push (@$out, $c);
+	    $space = 0;
+	}
+    }
+
+    return &unicode::unicode2utf8($out);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/colcfg.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/colcfg.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/colcfg.pm	(revision 21083)
@@ -0,0 +1,128 @@
+###########################################################################
+#
+# colcfg.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# reads in a collection configuration file
+
+package colcfg;
+
+use cfgread;
+
+
+# the collection configuration file data is stored in the form
+#
+# {'creator'}->string
+# {'public'}->string
+# {'defaultindex'}->string
+# {'importdir'}->string
+# {'archivedir'}->string
+# {'cachedir'}->string
+# {'builddir'}->string
+# {'removeold'}->string
+# {'textcompress'}->string
+# {'buildtype'}->string
+
+# {'maintainer'}->array of strings
+# {'languages'}->array of strings
+# {'indexsubcollections'}->array of strings
+# {'indexes'}->array of strings
+# {'dontbuild'}->array of strings
+# {'dontgdbm'}->array of strings
+# {'mirror'}->array of strings
+# {'phind'}->array of strings
+# {'levels'}->array of strings (for mgpp eg Section, Paragraph)
+
+# {'subcollection'}->hash of key-value pairs
+
+# {'plugin'}->array of arrays of strings
+# {'classify'}->array of arrays of strings
+
+# {'collectionmeta'}->hash of key->hash of param-value -used 
+# for language specification
+#    for example, collectionmeta->collectionname->default->demo
+#                                               ->mi->maori demo
+
+sub read_collect_cfg {
+    my ($filename) = @_;
+
+    return &cfgread::read_cfg_file ($filename, 
+				    q/^(creator|public|defaultindex|importdir|/ .
+					q/archivedir|cachedir|builddir|removeold|/ .
+					q/textcompress|buildtype|no_text|keepold|gzip/ .
+					q/verbosity|allclassifications|OIDtype|maxdocs|/ .
+					q/groupsize|sortmeta|debug|mode|create_images)$/,
+				    q/(maintainer|languages|indexsubcollections|/ .
+				       q/indexes|dontbuild|dontgdbm|mirror|phind|levels)$/,
+				    q/^(subcollection)$/,
+				    q/^(plugin|classify)$/,
+				    q/^(collectionmeta)$/);
+}
+
+sub write_collect_cfg {
+    my ($filename, $data) = @_;
+
+    &cfgread::write_cfg_file($filename, $data,
+			     q/^(creator|public|defaultindex|importdir|/ .
+				 q/archivedir|cachedir|builddir|removeold|/ .
+				 q/textcompress|buildtype|collectdir|no_text|allclassifications)$/,
+			     q/^(maintainer|languages|indexsubcollections|/ .
+				 q/indexes|dontbuild|dontgdbm|levels)$/,
+			     q/^(subcollection)$/,
+			     q/^(plugin|classify)$/,
+			     q/^(collectionmeta)$/);
+}
+
+
+# the build configuration file data is stored in the form
+#
+# {'builddate'}->string
+# {'buildtype'}->string
+# {'metadata'}->array of strings
+# {'languages'}->array of strings
+# {'numdocs'}->string
+# {'numwords'}->string
+# {'numbytes'}->string
+# {'indexfields'}->array of strings
+# {'indexfieldmap'}->array of strings in the form "field->FI"
+# {'indexmap'} -> array of strings
+ 
+sub read_build_cfg {
+    my ($filename) = @_;
+
+    return &cfgread::read_cfg_file ($filename, 
+				    q/^(builddate|buildtype|numdocs|numwords|numbytes)$/, 
+				    q/^(metadata|languages|indexfields|indexfieldmap|indexmap)$/);
+}
+
+sub write_build_cfg {
+    my ($filename, $data) = @_;
+
+    &cfgread::write_cfg_file($filename, $data,
+	       q/^(builddate|buildtype|numdocs|numwords|numbytes)$/, 
+	       q/^(metadata|languages|indexfieldsindexfieldmap|indexmap)$/);
+}
+
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/cpan/Mail/Sendmail.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/cpan/Mail/Sendmail.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/cpan/Mail/Sendmail.pm	(revision 21083)
@@ -0,0 +1,753 @@
+package Mail::Sendmail;
+# Mail::Sendmail by Milivoj Ivkovic <mi@alma.ch>
+# see embedded POD documentation after __END__
+# or http://alma.ch/perl/mail.htm
+
+=head1 NAME
+
+Mail::Sendmail v. 0.78 - Simple platform independent mailer
+
+=cut
+
+$VERSION = '0.78';
+
+# *************** Configuration you may want to change *******************
+# You probably want to set your SMTP server here (unless you specify it in
+# every script), and leave the rest as is. See pod documentation for details
+
+%mailcfg = (
+    # List of SMTP servers:
+    'smtp'    => [],
+
+    'from'    => '', # default sender e-mail, used when no From header in mail
+
+    'mime'    => 1, # use MIME encoding by default
+
+    'retries' => 1, # number of retries on smtp connect failure
+    'delay'   => 1, # delay in seconds between retries
+
+    'tz'      => '', # only to override automatic detection
+    'port'    => 25, # change it if you always use a non-standard port
+    'debug'   => 0 # prints stuff to STDERR
+);
+
+# *******************************************************************
+
+require Exporter;
+use strict;
+use vars qw(
+            $VERSION
+            @ISA
+            @EXPORT
+            @EXPORT_OK
+            %mailcfg
+            $default_smtp_server
+            $default_smtp_port
+            $default_sender
+            $TZ
+            $use_MIME
+            $address_rx
+            $debug
+            $log
+            $error
+            $retry_delay
+            $connect_retries
+           );
+
+use Socket;
+use Time::Local; # for automatic time zone detection
+
+# use MIME::QuotedPrint if available and configured in %mailcfg
+eval("use MIME::QuotedPrint");
+$mailcfg{'mime'} &&= (!$@);
+
+@ISA        = qw(Exporter);
+@EXPORT     = qw(&sendmail);
+@EXPORT_OK  = qw(
+                 %mailcfg
+                 time_to_date
+                 $default_smtp_server
+                 $default_smtp_port
+                 $default_sender
+                 $TZ
+                 $address_rx
+                 $debug
+                 $log
+                 $error
+                );
+
+# regex for e-mail addresses where full=$1, user=$2, domain=$3
+# see pod documentation about this regex
+
+my $word_rx = '[\x21\x23-\x27\x2A-\x2B\x2D\w\x3D\x3F]+';
+my $user_rx = $word_rx         # valid chars
+             .'(?:\.' . $word_rx . ')*' # possibly more words preceded by a dot
+             ;
+my $dom_rx = '\w[-\w]*(?:\.\w[-\w]*)*'; # less valid chars in domain names
+my $ip_rx = '\[\d{1,3}(?:\.\d{1,3}){3}\]';
+
+$address_rx = '((' . $user_rx . ')\@(' . $dom_rx . '|' . $ip_rx . '))';
+; # v. 0.6
+
+sub time_to_date {
+    # convert a time() value to a date-time string according to RFC 822
+
+    my $time = $_[0] || time(); # default to now if no argument
+
+    my @months = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    my @wdays  = qw(Sun Mon Tue Wed Thu Fri Sat);
+
+    my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)
+        = localtime($time);
+
+    $TZ ||= $mailcfg{'tz'};
+
+    if ( $TZ eq "" ) {
+        # offset in hours
+        my $offset  = sprintf "%.1f", (timegm(localtime) - time) / 3600;
+        my $minutes = sprintf "%02d", ( $offset - int($offset) ) * 60;
+        $TZ  = sprintf("%+03d", int($offset)) . $minutes;
+    }
+    return join(" ",
+                    ($wdays[$wday] . ','),
+                     $mday,
+                     $months[$mon],
+                     $year+1900,
+                     sprintf("%02d", $hour) . ":" . sprintf("%02d", $min),
+                     $TZ
+               );
+} # end sub time_to_date
+
+sub sendmail {
+    # original sendmail 1.21 by Christian Mallwitz.
+    # Modified and 'modulized' by mi@alma.ch
+
+    $error = '';
+    $log = "Mail::Sendmail v. $VERSION - "    . scalar(localtime()) . "\n";
+
+    local $_;
+    local $/ = "\015\012";
+
+    my (%mail, $k,
+        $smtp, $server, $port, $connected, $localhost,
+        $message, $fromaddr, $recip, @recipients, $to, $header,
+       );
+
+    sub fail {
+        # things to do before returning a sendmail failure
+        print STDERR @_ if $^W;
+        $error .= join(" ", @_) . "\n";
+        close S;
+        return 0;
+    }
+
+    # all config keys to lowercase, to prevent typo errors
+    foreach $k (keys %mailcfg) {
+        if ($k =~ /[A-Z]/) {
+            $mailcfg{lc($k)} = $mailcfg{$k};
+        }
+    }
+
+    # redo hash, arranging keys case etc...
+    while (@_) {
+        # arrange keys case
+        $k = ucfirst lc(shift @_);
+
+        if (!$k and $^W) {
+            warn "Received false mail hash key: \'$k\'. Did you forget to put it in quotes?\n";
+        }
+
+        $k =~ s/\s*:\s*$//o; # kill colon (and possible spaces) at end, we add it later.
+        $mail{$k} = shift @_;
+    }
+
+    $smtp = $mail{'Smtp'} || $mail{'Server'} || $default_smtp_server;
+#    unshift @{$mailcfg{'smtp'}}, $smtp if ($smtp and $mailcfg{'smtp'}->[0] ne $smtp);
+    unshift @{$mailcfg{'smtp'}}, $smtp if $smtp; # Change here to avoid undefined value
+                                                 # with our empty mailcfg{'smtp'} - Stefan
+
+    # delete non-header keys, so we don't send them later as mail headers
+    # I like this syntax, but it doesn't seem to work with AS port 5.003_07:
+    # delete @mail{'Smtp', 'Server'};
+    # so instead:
+    delete $mail{'Smtp'}; delete $mail{'Server'};
+
+    $mailcfg{'port'} = $mail{'Port'} || $default_smtp_port || $mailcfg{'port'} || 25;
+    delete $mail{'Port'};
+
+    # for backward compatibility only
+    $mailcfg{'retries'} = $connect_retries if defined($connect_retries);
+    $mailcfg{'delay'} = $retry_delay if defined($retry_delay);
+
+    {    # don't warn for undefined values below
+        local $^W = 0;
+        $message = join("", $mail{'Message'}, $mail{'Body'}, $mail{'Text'});
+    }
+
+    # delete @mail{'Message', 'Body', 'Text'};
+    delete $mail{'Message'}; delete $mail{'Body'}; delete $mail{'Text'};
+
+    # Extract 'From:' e-mail address
+
+    $fromaddr = $mail{'From'} || $default_sender || $mailcfg{'from'};
+    unless ($fromaddr =~ /$address_rx/) {
+        return fail("Bad or missing From address: \'$fromaddr\'");
+    }
+    $fromaddr = $1;
+
+    # add Date header if needed
+    $mail{Date} ||= time_to_date() ;
+    $log .= "Date: $mail{Date}\n";
+
+    # cleanup message, and encode if needed
+    $message =~ s/^\./\.\./gom;     # handle . as first character
+    $message =~ s/\r\n/\n/go;     # normalize line endings, step 1 of 2 (next step after MIME encoding)
+
+    $mail{'Mime-version'} ||= '1.0';
+    $mail{'Content-type'} ||= 'text/plain; charset="iso-8859-1"';
+
+    unless ( $mail{'Content-transfer-encoding'}
+          || $mail{'Content-type'} =~ /multipart/io )
+    {
+        if ($mailcfg{'mime'}) {
+            $mail{'Content-transfer-encoding'} = 'quoted-printable';
+            $message = encode_qp($message);
+        }
+        else {
+            $mail{'Content-transfer-encoding'} = '8bit';
+            if ($message =~ /[\x80-\xFF]/o) {
+                $error .= "MIME::QuotedPrint not present!\nSending 8bit characters, hoping it will come across OK.\n";
+                warn "MIME::QuotedPrint not present!\n",
+                     "Sending 8bit characters, hoping it will come across OK.\n"
+                     if $^W;
+            }
+        }
+    }
+
+    $message =~ s/\n/\015\012/go; # normalize line endings, step 2.
+
+    # Get recipients
+    {    # don't warn for undefined values below
+        local $^W = 0;
+        $recip = join(", ", $mail{To}, $mail{Cc}, $mail{Bcc});
+    }
+
+    delete $mail{'Bcc'};
+
+    @recipients = ();
+    while ($recip =~ /$address_rx/go) {
+        push @recipients, $1;
+    }
+    unless (@recipients) {
+        return fail("No recipient!")
+    }
+
+    # get local hostname for polite HELO
+    $localhost = (gethostbyname('localhost'))[0] || 'localhost';
+
+    foreach $server ( @{$mailcfg{'smtp'}} ) {
+        # open socket needs to be inside this foreach loop on Linux,
+        # otherwise all servers fail if 1st one fails !??! why?
+        unless ( socket S, AF_INET, SOCK_STREAM, (getprotobyname 'tcp')[2] ) {
+            return fail("socket failed ($!)")
+        }
+
+        print "- trying $server\n" if $mailcfg{'debug'} > 1;
+
+        $server =~ s/\s+//go; # remove spaces just in case of a typo
+        # extract port if server name like "mail.domain.com:2525"
+        ($server =~ s/:(.+)$//o) ? $port = $1    : $port = $mailcfg{'port'};
+        $smtp = $server; # save $server for use outside foreach loop
+
+        my $smtpaddr = inet_aton $server;
+        unless ($smtpaddr) {
+            $error .= "$server not found\n";
+            next; # next server
+        }
+
+        my $retried = 0; # reset retries for each server
+        while ( ( not $connected = connect S, pack_sockaddr_in($port, $smtpaddr) )
+            and ( $retried < $mailcfg{'retries'} )
+              ) {
+            $retried++;
+            $error .= "connect to $server failed ($!)\n";
+            print "- connect to $server failed ($!)\n" if $mailcfg{'debug'} > 1;
+            print "retrying in $mailcfg{'delay'} seconds...\n";
+            sleep $mailcfg{'delay'};
+        }
+
+        if ( $connected ) {
+            print "- connected to $server\n" if $mailcfg{'debug'} > 3;
+            last;
+        }
+        else {
+            $error .= "connect to $server failed\n";
+            print "- connect to $server failed, next server...\n" if $mailcfg{'debug'} > 1;
+            next; # next server
+        }
+    }
+
+    unless ( $connected ) {
+        return fail("connect to $smtp failed ($!) no (more) retries!")
+    };
+
+    {
+        local $^W = 0; # don't warn on undefined variables
+        # Add info to log variable
+        $log .= "Server: $smtp Port: $port\n"
+              . "From: $fromaddr\n"
+              . "Subject: $mail{Subject}\n"
+              . "To: ";
+    }
+
+    my($oldfh) = select(S); $| = 1; select($oldfh);
+
+    chomp($_ = <S>);
+    if (/^[45]/ or !$_) {
+        return fail("Connection error from $smtp on port $port ($_)")
+    }
+
+    print S "HELO $localhost\015\012";
+    chomp($_ = <S>);
+    if (/^[45]/ or !$_) {
+        return fail("HELO error ($_)")
+    }
+    
+    print S "mail from: <$fromaddr>\015\012";
+    chomp($_ = <S>);
+    if (/^[45]/ or !$_) {
+        return fail("mail From: error ($_)")
+    }
+
+    foreach $to (@recipients) {
+        if ($debug) { print STDERR "sending to: <$to>\n"; }
+        print S "rcpt to: <$to>\015\012";
+        chomp($_ = <S>);
+        if (/^[45]/ or !$_) {
+            $log .= "!Failed: $to\n    ";
+            return fail("Error sending to <$to> ($_)\n");
+        }
+        else {
+            $log .= "$to\n    ";
+        }
+    }
+
+    # start data part
+    print S "data\015\012";
+    chomp($_ = <S>);
+    if (/^[45]/ or !$_) {
+           return fail("Cannot send data ($_)");
+    }
+
+    # print headers
+    foreach $header (keys %mail) {
+        $mail{$header} =~ s/\s+$//o; # kill possible trailing garbage
+        print S "$header: ", $mail{$header}, "\015\012";
+    };
+
+    #- test diconnecting from network here, to see what happens
+    #- print STDERR "DISCONNECT NOW!\n";
+    #- sleep 4;
+    #- print STDERR "trying to continue, expecting an error... \n";
+
+    # send message body
+    print S "\015\012",
+            $message,
+            "\015\012.\015\012";
+
+    chomp($_ = <S>);
+    if (/^[45]/ or !$_) {
+           return fail("message transmission failed ($_)");
+    }
+
+    # finish
+    print S "quit\015\012";
+    $_ = <S>;
+    close S;
+
+    return 1;
+} # end sub sendmail
+
+1;
+__END__
+
+=head1 SYNOPSIS
+
+  use Mail::Sendmail;
+
+  %mail = ( To      => 'you@there.com',
+            From    => 'me@here.com',
+            Message => "This is a very short message"
+           );
+
+  sendmail(%mail) or die $Mail::Sendmail::error;
+
+  print "OK. Log says:\n", $Mail::Sendmail::log;
+
+=head1 DESCRIPTION
+
+Simple platform independent e-mail from your perl script. Only requires
+Perl 5 and a network connection.
+
+After struggling for some time with various command-line mailing programs
+which never did exactly what I wanted, I put together this Perl only
+solution.
+
+Mail::Sendmail contains mainly &sendmail, which takes a hash with the
+message to send and sends it. It is intended to be very easy to setup and
+use.
+
+=head1 INSTALLATION
+
+=over 4
+
+=item Best
+
+perl -MCPAN -e "install Mail::Sendmail"
+
+=item Traditional
+
+    perl Makefile.PL
+    make
+    make test
+    make install
+
+=item Manual
+
+Copy Sendmail.pm to Mail/ in your Perl lib directory.
+
+    (eg. c:\Perl\lib\Mail\, c:\Perl\site\lib\Mail\,
+     /usr/lib/perl5/site_perl/Mail/, ... or whatever it
+     is on your system)
+
+=item ActivePerl's PPM
+
+ppm install --location=http://alma.ch/perl/ppm Mail-Sendmail
+
+But this way you don't get a chance to have a look at other files (Changes, 
+Todo, test.pl, ...) and PPM doesn't run the test script (test.pl).
+
+=back
+
+At the top of Sendmail.pm, set your default SMTP server, unless you specify
+it with each message, or want to use the default.
+
+Install MIME::QuotedPrint. This is not required but strongly recommended.
+
+=head1 FEATURES
+
+Automatic time zone detection, Date: header, MIME quoted-printable encoding 
+(if MIME::QuotedPrint installed), all of which can be overridden.
+
+Internal Bcc: and Cc: support (even on broken servers)
+
+Allows real names in From: and To: fields
+
+Doesn't send unwanted headers, and allows you to send any header(s) you
+want
+
+Configurable retries and use of alternate servers if your mail server is
+down
+
+Good plain text error reporting
+
+=head1 LIMITATIONS
+
+Doesn't work on OpenVMS.
+
+Headers are not encoded, even if they have accented characters.
+
+Since the whole message is in memory (twice!), it's not suitable for 
+sending very big attached files.
+
+The SMTP server has to be set manually in Sendmail.pm or in your script,
+unless you have a mail server on localhost.
+
+=head1 CONFIGURATION
+
+=over 4
+
+=item Default SMTP server(s)
+
+This is probably all you want to configure. It is usually done through
+I<$mailcfg{smtp}>, which you can edit at the top of the Sendmail.pm file.
+This is a reference to a list of SMTP servers. You can also set it from
+your script:
+
+C<unshift @{$Mail::Sendmail::mailcfg{'smtp'}} , 'my.mail.server';>
+
+Alternatively, you can specify the server in the I<%mail> hash you send
+from your script, which will do the same thing:
+
+C<$mail{smtp} = 'my.mail.server';>
+
+A future version will try to set useful defaults for you during the
+Makefile.PL.
+
+=item Other configuration settings
+
+See I<%mailcfg> under L<"DETAILS"> below for other configuration options.
+
+=back
+
+=head1 DETAILS
+
+=head2 sendmail()
+
+sendmail is the only thing exported to your namespace by default
+
+C<sendmail(%mail) || print "Error sending mail: $Mail::Sendmail::error\n";>
+
+It takes a hash containing the full message, with keys for all headers,
+body, and optionally for another non-default SMTP server and/or port.
+
+It returns 1 on success or 0 on error, and rewrites
+C<$Mail::Sendmail::error> and C<$Mail::Sendmail::log>.
+
+Keys are NOT case-sensitive.
+
+The colon after headers is not necessary.
+
+The Body part key can be called 'Body', 'Message' or 'Text'. The SMTP
+server key can be called 'Smtp' or 'Server'.
+
+The following headers are added unless you specify them yourself:
+
+    Mime-version: 1.0
+    Content-type: 'text/plain; charset="iso-8859-1"'
+
+    Content-transfer-encoding: quoted-printable
+    or (if MIME::QuotedPrint not installed)
+    Content-transfer-encoding: 8bit
+
+    Date: [string returned by time_to_date()]
+
+The following are not exported by default, but you can still access them
+with their full name, or request their export on the use line like in:
+C<use Mail::Sendmail qw($address_rx time_to_date);>
+
+=head2 Mail::Sendmail::time_to_date()
+
+convert time ( as from C<time()> ) to an RFC 822 compliant string for the
+Date header. See also L<"%Mail::Sendmail::mailcfg">.
+
+=head2 $Mail::Sendmail::error
+
+When you don't run with the B<-w> flag, the module sends no errors to
+STDERR, but puts anything it has to complain about in here. You should
+probably always check if it says something.
+
+=head2 $Mail::Sendmail::log
+
+A summary that you could write to a log file after each send
+
+=head2 $Mail::Sendmail::address_rx
+
+A handy regex to recognize e-mail addresses.
+
+A correct regex for valid e-mail addresses was written by one of the judges
+in the obfuscated Perl contest... :-) It is quite big. This one is an
+attempt to a reasonable compromise, and should accept all real-world
+internet style addresses. The domain part is required and comments or
+characters that would need to be quoted are not supported.
+
+  Example:
+    $rx = $Mail::Sendmail::address_rx;
+    if (/$rx/) {
+      $address=$1;
+      $user=$2;
+      $domain=$3;
+    }
+
+=head2 %Mail::Sendmail::mailcfg
+
+This hash contains all configuration options. You normally edit it once (if
+ever) in Sendmail.pm and forget about it, but you could also access it from
+your scripts. For readability, I'll assume you have imported it.
+
+The keys are not case-sensitive: they are all converted to lowercase before
+use. Writing C<$mailcfg{Port} = 2525;> is OK: the default $mailcfg{port}
+(25) will be deleted and replaced with your new value of 2525.
+
+=over 4
+
+=item $mailcfg{smtp}
+
+C<$mailcfg{smtp} = [qw(localhost my.other.mail.server)];>
+
+This is a reference to a list of smtp servers, so if your main server is
+down, the module tries the next one. If one of your servers uses a special
+port, add it to the server name with a colon in front, to override the
+default port (like in my.special.server:2525).
+
+Default: localhost. (the previous version also had smtp.site1.csi.com which
+was an open relay, but it isn't anymore)
+
+=item $mailcfg{from}
+
+C<$mailcfg{from} = 'Mailing script me@mydomain.com';>
+
+From address used if you don't supply one in your script. Should not be of
+type 'user@localhost' since that may not be valid on the recipient's
+host.
+
+Default: undefined.
+
+=item $mailcfg{mime}
+
+C<$mailcfg{mime} = 1;>
+
+Set this to 0 if you don't want any automatic MIME encoding. You normally
+don't need this, the module should 'Do the right thing' anyway.
+
+Default: 1;
+
+=item $mailcfg{retries}
+
+C<$mailcfg{retries} = 1;>
+
+How many times should the connection to the same SMTP server be retried in
+case of a failure.
+
+Default: 1;
+
+=item $mailcfg{delay}
+
+C<$mailcfg{delay} = 1;>
+
+Number of seconds to wait between retries. This delay also happens before
+trying the next server in the list, if the retries for the current server
+have been exhausted. For CGI scripts, you want few retries and short delays
+to return with a results page before the http connection times out. For
+unattended scripts, you may want to use many retries and long delays to
+have a good chance of your mail being sent even with temporary failures on
+your network.
+
+Default: 1 (second);
+
+=item $mailcfg{tz}
+
+C<$mailcfg{tz} = '+0800';>
+
+Normally, your time zone is set automatically, from the difference between
+C<time()> and C<gmtime()>. This allows you to override automatic detection
+in cases where your system is confused (such as some Win32 systems in zones
+which do not use daylight savings time: see Microsoft KB article Q148681)
+
+Default: undefined (automatic detection at run-time).
+
+=item $mailcfg{port}
+
+C<$mailcfg{port} = 25;>
+
+Port used when none is specified in the server name.
+
+Default: 25.
+
+=item $mailcfg{debug}
+
+C<$mailcfg{debug} => 0;>
+
+Prints stuff to STDERR. Not used much, and what is printed may change
+without notice. Don't count on it.
+
+Default: 0;
+
+=back
+
+=head2 $Mail::Sendmail::VERSION
+
+The package version number (you can not import this one)
+
+=head2 Configuration variables from previous versions
+
+The following global variables were used in version 0.74 for configuration. 
+They should still work, but will not in a future version (unless you 
+complain loudly). Please use I<%mailcfg> if you need to access the 
+configuration from your scripts.
+
+=over 4
+
+=item $Mail::Sendmail::default_smtp_server
+
+=item $Mail::Sendmail::default_smtp_port
+
+=item $Mail::Sendmail::default_sender
+
+=item $Mail::Sendmail::TZ
+
+=item $Mail::Sendmail::connect_retries
+
+=item $Mail::Sendmail::retry_delay
+
+=item $Mail::Sendmail::use_MIME
+
+This one couldn't really be used in the previous version, so I just dropped it.
+It is replaced by I<$mailcfg{mime}> which works.
+
+=back
+
+=head1 ANOTHER EXAMPLE
+
+  use Mail::Sendmail;
+
+  print "Testing Mail::Sendmail version $Mail::Sendmail::VERSION\n";
+  print "Default server: $Mail::Sendmail::mailcfg{smtp}->[0]\n";
+  print "Default sender: $Mail::Sendmail::mailcfg{from}\n";
+
+  %mail = (
+      #To      => 'No to field this time, only Bcc and Cc',
+      #From    => 'not needed, use default',
+      Bcc     => 'Someone <him@there.com>, Someone else her@there.com',
+      # only addresses are extracted from Bcc, real names disregarded
+      Cc      => 'Yet someone else <xz@whatever.com>',
+      # Cc will appear in the header. (Bcc will not)
+      Subject => 'Test message',
+      'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
+  );
+
+
+  $mail{Smtp} = 'special_server.for-this-message-only.domain.com';
+  $mail{'X-custom'} = 'My custom additionnal header';
+  $mail{'mESSaGE : '} = "The message key looks terrible, but works.";
+  # cheat on the date:
+  $mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 ),
+
+  if (sendmail %mail) { print "Mail sent OK.\n" }
+  else { print "Error sending mail: $Mail::Sendmail::error \n" }
+
+  print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;
+
+=head1 CHANGES
+
+Single-letter host names bug fixed since version 0.77. See the F<Changes> file for
+the full history.
+
+=head1 AUTHOR
+
+Milivoj Ivkovic mi@alma.ch or ivkovic@bluewin.ch
+
+=head1 NOTES
+
+MIME::QuotedPrint is used by default on every message if available. It 
+allows reliable sending of accented characters, and also takes care of 
+too long lines (which can happen in HTML mails). It is available in the 
+MIME-Base64 package at http://www.perl.com/CPAN/modules/by-module/MIME/ or 
+through PPM.
+
+Look at http://alma.ch/perl/Mail-Sendmail-FAQ.htm for additional info 
+(CGI, examples of sending attachments, HTML mail etc...)
+
+You can use it freely. (Someone complained this is too vague. So, more
+precisely: do whatever you want with it, but be warned that terrible things
+will happen to you if you use it badly, like for sending spam, claiming you
+wrote it alone, or ...?)
+
+I would appreciate a short (or long) e-mail note if you use this (and even
+if you don't, especially if you care to say why). And of course,
+bug-reports and/or suggestions are welcome.
+
+Last revision: 25.09.2000. Latest version should be available at
+http://alma.ch/perl/mail.htm , and a few days later on CPAN.
+
+=cut
Index: /main/tags/2.38/gsdl/perllib/doc.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/doc.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/doc.pm	(revision 21083)
@@ -0,0 +1,897 @@
+###########################################################################
+#
+# doc.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# base class to hold documents
+
+package doc;
+
+BEGIN {
+    die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/dynamic/lib/site_perl/5.005/i686-linux");
+}
+
+use unicode;
+use util;
+use ghtml;
+##use hashdoc;
+
+# the document type may be indexed_doc, nonindexed_doc, or
+# classification
+
+my $OIDcount = 0;
+
+sub new {
+    my $class = shift (@_);
+    my ($source_filename, $doc_type) = @_;
+
+    my $self = bless {'associated_files'=>[],
+		      'subsection_order'=>[],
+		      'next_subsection'=>1,
+		      'subsections'=>{},
+		      'metadata'=>[],
+		      'text'=>"",
+		      'OIDtype'=>"hash"}, $class;
+
+    $self->set_source_filename ($source_filename) if defined $source_filename;
+    $self->set_doc_type ($doc_type) if defined $doc_type;
+
+    return $self;
+}
+
+# clone the $self object
+sub duplicate {
+    my $self = shift (@_);
+
+    my $newobj = {};
+    
+    foreach $k (keys %$self) {
+	$newobj->{$k} = &clone ($self->{$k});
+    }
+
+    bless $newobj, ref($self);
+    return $newobj;
+}
+
+sub clone {
+    my ($from) = @_;
+    my $type = ref ($from);
+
+    if ($type eq "HASH") {
+	my $to = {};
+	foreach $key (keys %$from) {
+	    $to->{$key} = &clone ($from->{$key});
+	}
+	return $to;
+    } elsif ($type eq "ARRAY") {
+	my $to = [];
+	foreach $v (@$from) {
+	    push (@$to, &clone ($v));
+	}
+	return $to;
+    } else {
+	return $from;
+    }
+}
+
+sub set_OIDtype {
+    my $self = shift (@_);
+    my ($type) = @_;
+
+    if ($type eq "incremental") {
+	$self->{'OIDtype'} = $type;
+    } else {
+	$self->{'OIDtype'} = "hash";
+    }
+}
+
+sub set_source_filename {
+    my $self = shift (@_);
+    my ($source_filename) = @_;
+
+    $self->set_metadata_element ($self->get_top_section(), 
+				 "gsdlsourcefilename", 
+				 $source_filename);
+}
+
+# returns the source_filename as it was provided
+sub get_source_filename {
+    my $self = shift (@_);
+
+    return $self->get_metadata_element ($self->get_top_section(), "gsdlsourcefilename");
+}
+
+sub set_doc_type {
+    my $self = shift (@_);
+    my ($doc_type) = @_;
+
+    $self->set_metadata_element ($self->get_top_section(), 
+				 "gsdldoctype", 
+				 $doc_type);
+}
+
+# returns the source_filename as it was provided
+# the default of "indexed_doc" is used if no document
+# type was provided
+sub get_doc_type {
+    my $self = shift (@_);
+
+    my $doc_type = $self->get_metadata_element ($self->get_top_section(), "gsdldoctype");
+    return $doc_type if (defined $doc_type);
+    return "indexed_doc";
+}
+
+sub _escape_text {
+    my ($text) = @_;
+
+    # special characters in the gml encoding
+    $text =~ s/&/&amp;/g; # this has to be first...
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+
+    return $text;
+}
+
+sub buffer_section_xml {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section ($section);
+    return "" unless defined $section_ptr;
+
+    my $all_text = "<Section>\n";
+    $all_text .= "  <Description>\n";
+    
+    # output metadata
+    foreach my $data (@{$section_ptr->{'metadata'}}) {
+	my $escaped_value = &_escape_text($data->[1]);
+	$all_text .= '    <Metadata name="' . $data->[0] . '">' . $escaped_value . "</Metadata>\n";
+    }
+
+    $all_text .= "  </Description>\n";
+
+    # output the text
+    $all_text .= "  <Content>";
+    $all_text .= &_escape_text($section_ptr->{'text'});
+    $all_text .= "</Content>\n";
+    
+    # output all the subsections
+    foreach my $subsection (@{$section_ptr->{'subsection_order'}}) {
+	$all_text .= $self->buffer_section_xml("$section.$subsection");
+    }
+    
+    $all_text .=  "</Section>\n";
+
+    # make sure no nasty control characters have snuck through
+    # (XML::Parser will barf on anything it doesn't consider to be
+    # valid UTF-8 text, including things like \c@, \cC etc.)
+    $all_text =~ s/[\x00-\x09\x0B\x0C\x0E-\x1F]//g;
+
+    return $all_text;
+}
+
+sub output_section {
+    my $self = shift (@_);
+    my ($handle, $section) = @_;
+
+    print $handle $self->buffer_section_xml($section);
+}
+
+# look up the reference to the a particular section
+sub _lookup_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my ($num);
+    my $sectionref = $self;
+
+    while (defined $section && $section ne "") {
+	($num, $section) = $section =~ /^\.?(\d+)(.*)$/;
+	$num =~ s/^0+(\d)/$1/; # remove leading 0s
+	$section = "" unless defined $section;
+	
+	if (defined $num && defined $sectionref->{'subsections'}->{$num}) {
+	    $sectionref = $sectionref->{'subsections'}->{$num};
+	} else {
+	    return undef;
+	}
+    }
+    
+    return $sectionref;
+}
+
+# calculate OID by hashing the contents of the document
+sub _calc_OID {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my $osexe = &util::get_os_exe();
+
+    my $hashfile_exe = &util::filename_cat($ENV{'GSDLHOME'},"bin",
+					   $ENV{'GSDLOS'},"hashfile$osexe");
+    my $result = "NULL";
+    
+    if (-e "$hashfile_exe") {
+#	$result = `\"$hashfile_exe\" \"$filename\"`;
+	$result = `hashfile$osexe \"$filename\"`;
+	($result) = $result =~ /:\s*([0-9a-f]+)/i;
+
+    } else {
+	print STDERR "doc::_calc_OID $hashfile_exe could not be found\n";
+    }
+
+    return "HASH$result";
+}
+
+# methods dealing with OID, not groups of them.
+
+# if $OID is not provided one is calculated
+sub set_OID {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    # if an OID wasn't provided claculate one
+    if (!defined $OID) {
+	$OID = "NULL";
+
+	if ($self->{'OIDtype'} eq "incremental") {
+	    $OID = "D" . $OIDcount;
+	    $OIDcount ++;
+	    
+	} else {
+	    # "hash" OID - feed file to hashfile.exe
+	    my $filename = $self->get_source_filename();
+	    if (defined($filename) && -e $filename) {
+
+		$OID = $self->_calc_OID ($filename);
+
+	    } else {
+		$filename = &util::get_tmp_filename();
+		if (!open (OUTFILE, ">$filename")) {
+		    print STDERR "doc::set_OID could not write to $filename\n";
+		} else {
+		    $self->output_section('OUTFILE', $self->get_top_section(), 
+					  undef, 1);
+		    close (OUTFILE);
+		}
+	    
+		$OID = $self->_calc_OID ($filename);
+		&util::rm ($filename);
+	    }
+	}
+    }
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", $OID);
+}
+
+# this uses hashdoc (embedded c thingy) which is faster but still 
+# needs a little work to be suffiently stable
+sub ___set_OID {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    # if an OID wasn't provided then calculate hash value based on document
+    if (!defined $OID) 
+    {
+	my $hash_text = $self->buffer_section_gml($self->get_top_section(),
+						  undef, 1);
+	my $hash_len = length($hash_text);
+
+        $OID = &hashdoc::buffer($hash_text,$hash_len);
+    }
+
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", $OID);
+}
+
+# returns the OID for this document
+sub get_OID {
+    my $self = shift (@_);
+    my $OID = $self->get_metadata_element ($self->get_top_section(), "Identifier");
+    return $OID if (defined $OID);
+    return "NULL";
+}
+
+sub delete_OID {
+    my $self = shift (@_);
+    
+    $self->set_metadata_element ($self->get_top_section(), "Identifier", "NULL");
+}
+
+
+# methods for manipulating section names
+
+# returns the name of the top-most section (the top
+# level of the document
+sub get_top_section {
+    my $self = shift (@_);
+    
+    return "";
+}
+
+# returns a section
+sub get_parent_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    $section =~ s/(^|\.)\d+$//;
+
+    return $section;
+}
+
+# returns the first child section (or the end child 
+# if there isn't any)
+sub get_begin_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return "" unless defined $section_ptr;
+
+    if (defined $section_ptr->{'subsection_order'}->[0]) {
+	return "$section.$section_ptr->{'subsection_order'}->[0]";
+    }
+
+    return $self->get_end_child ($section);
+}
+
+# returns the next child of a parent section
+sub get_next_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+    
+    my $parent_section = $self->get_parent_section($section);
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    return undef unless defined $parent_section_ptr;
+
+    my ($section_num) = $section =~ /(\d+)$/;
+    return undef unless defined $section_num;
+
+    my $i = 0;
+    my $section_order = $parent_section_ptr->{'subsection_order'};
+    while ($i < scalar(@$section_order)) {
+	last if $section_order->[$i] eq $section_num;
+	$i++;
+    }
+
+    $i++; # the next child
+    if ($i < scalar(@$section_order)) {
+	return $section_order->[$i] if $parent_section eq "";
+	return "$parent_section.$section_order->[$i]";
+    }
+
+    # no more sections in this level
+    return undef;
+}
+
+# returns a reference to a list of children
+sub get_children {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return [] unless defined $section_ptr;
+
+    my @children = @{$section_ptr->{'subsection_order'}};
+
+    map {$_ = "$section.$_"; $_ =~ s/^\.+//;} @children;
+    return \@children;
+}
+
+# returns the child section one past the last one (which
+# is coded as "0")
+sub get_end_child {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    return $section . ".0" unless $section eq "";
+    return "0";
+}
+
+# returns the next section in book order
+sub get_next_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    return undef unless defined $section;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return undef unless defined $section_ptr;
+
+    # first try to find first child
+    if (defined $section_ptr->{'subsection_order'}->[0]) {
+	return $section_ptr->{'subsection_order'}->[0] if ($section eq "");
+	return "$section.$section_ptr->{'subsection_order'}->[0]";
+    }
+
+    do {
+	# try to find sibling
+	my $next_child = $self->get_next_child ($section);
+	return $next_child if (defined $next_child);
+
+	# move up one level
+	$section = $self->get_parent_section ($section);
+    } while $section =~ /\d/;
+
+    return undef;
+}
+
+sub is_leaf_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    return 1 unless defined $section_ptr;
+
+    return (scalar (@{$section_ptr->{'subsection_order'}}) == 0);
+}
+
+# methods for dealing with sections
+
+# returns the name of the inserted section
+sub insert_section {
+    my $self = shift (@_);
+    my ($before_section) = @_;
+
+    # get the child to insert before and its parent section
+    my $parent_section = "";
+    my $before_child = "0";
+    my @before_section = split (/\./, $before_section);
+    if (scalar(@before_section) > 0) {
+	$before_child = pop (@before_section);
+	$parent_section = join (".", @before_section);
+    }
+
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    if (!defined $parent_section_ptr) {
+	print STDERR "doc::insert_section couldn't find parent section " .
+	    "$parent_section\n";
+	return;
+    }
+
+    # get the next section number
+    my $section_num = $parent_section_ptr->{'next_subsection'}++;
+
+    my $i = 0;
+    while ($i < scalar(@{$parent_section_ptr->{'subsection_order'}}) &&
+	   $parent_section_ptr->{'subsection_order'}->[$i] ne $before_child) {
+	$i++;
+    }
+    
+    # insert the section number into the order list
+    splice (@{$parent_section_ptr->{'subsection_order'}}, $i, 0, $section_num);
+
+    # add this section to the parent section
+    my $section_ptr = {'subsection_order'=>[],
+		       'next_subsection'=>1,
+		       'subsections'=>{},
+		       'metadata'=>[],
+		       'text'=>""};
+    $parent_section_ptr->{'subsections'}->{$section_num} = $section_ptr;
+
+    # work out the full section number
+    my $section = $parent_section;
+    $section .= "." unless $section eq "";
+    $section .= $section_num;
+    
+    return $section;
+}
+
+# creates a pre-named section
+sub create_named_section {
+    my $self = shift (@_);
+    my ($mastersection) = @_;
+
+    my ($num);
+    my $section = $mastersection;
+    my $sectionref = $self;
+
+    while ($section ne "") {
+	($num, $section) = $section =~ /^\.?(\d+)(.*)$/;
+	$num =~ s/^0+(\d)/$1/; # remove leading 0s
+	$section = "" unless defined $section;
+	
+	if (defined $num) {
+	    if (!defined $sectionref->{'subsections'}->{$num}) {
+		push (@{$sectionref->{'subsection_order'}}, $num);
+		$sectionref->{'subsections'}->{$num} = {'subsection_order'=>[],
+							'next_subsection'=>1,
+							'subsections'=>{},
+							'metadata'=>[],
+							'text'=>""};
+		if ($num >= $sectionref->{'next_subsection'}) {
+		    $sectionref->{'next_subsection'} = $num + 1;
+		}
+	    }
+	    $sectionref = $sectionref->{'subsections'}->{$num};
+
+	} else {
+	    print STDERR "doc::create_named_section couldn't create section ";
+	    print STDERR "$mastersection\n";
+	    last;
+	}
+    }
+}
+
+# returns a reference to a list of subsections
+sub list_subsections {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section ($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::list_subsections couldn't find section $section\n";
+	return [];
+    }
+
+    return [@{$section_ptr->{'subsection_order'}}];
+}
+
+sub delete_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+#    my $section_ptr = {'subsection_order'=>[],
+#		       'next_subsection'=>1,
+#		       'subsections'=>{},
+#		       'metadata'=>[],
+#		       'text'=>""};
+
+    # if this is the top section reset everything
+    if ($section eq "") {
+	$self->{'subsection_order'} = [];
+	$self->{'subsections'} = {};
+	$self->{'metadata'} = [];
+	$self->{'text'} = "";
+	return;
+    }
+
+    # find the parent of the section to delete
+    my $parent_section = "";
+    my $child = "0";
+    my @section = split (/\./, $section);
+    if (scalar(@section) > 0) {
+	$child = pop (@section);
+	$parent_section = join (".", @section);
+    }
+
+    my $parent_section_ptr = $self->_lookup_section($parent_section);
+    if (!defined $parent_section_ptr) {
+	print STDERR "doc::delete_section couldn't find parent section " .
+	    "$parent_section\n";
+	return;
+    }
+
+    # remove this section from the subsection_order list
+    my $i = 0;
+    while ($i < scalar (@{$parent_section_ptr->{'subsection_order'}})) {
+	if ($parent_section_ptr->{'subsection_order'}->[$i] eq $child) {
+	    splice (@{$parent_section_ptr->{'subsection_order'}}, $i, 1);
+	    last;
+	}
+	$i++;
+    }
+
+    # remove this section from the subsection hash
+    if (defined ($parent_section_ptr->{'subsections'}->{$child})) {
+	undef $parent_section_ptr->{'subsections'}->{$child};
+    }
+}
+
+#--
+# methods for dealing with metadata
+
+# set_metadata_element and get_metadata_element are for metadata
+# which should only have one value. add_meta_data and get_metadata
+# are for metadata which can have more than one value.
+
+# returns the first metadata value which matches field
+sub get_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field) = @_;
+    my ($data);
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_metadata_element couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    foreach $data (@{$section_ptr->{'metadata'}}) {
+	return $data->[1] if (scalar(@$data) >= 2 && $data->[0] eq $field);
+    }
+	
+    return undef; # was not found
+}
+
+
+# returns a list of the form [value1, value2, ...]
+sub get_metadata {
+    my $self = shift (@_);
+    my ($section, $field) = @_;
+    my ($data);
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+        print STDERR "doc::get_metadata couldn't find section " .
+            "$section\n";
+        return;
+    }
+
+    my @metadata = ();
+    foreach $data (@{$section_ptr->{'metadata'}}) {
+        push (@metadata, $data->[1]) if ($data->[0] eq $field);
+    }
+        
+    return \@metadata;
+}
+
+# returns a list of the form [[field,value],[field,value],...]
+sub get_all_metadata {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_all_metadata couldn't find section " .
+	    "$section\n";
+	return;
+    }
+    
+    return $section_ptr->{'metadata'};
+}
+
+# $value is optional
+sub delete_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_metadata couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    my $i = 0;
+    while ($i < scalar (@{$section_ptr->{'metadata'}})) {
+	if (($section_ptr->{'metadata'}->[$i]->[0] eq $field) &&
+	    (!defined $value || $section_ptr->{'metadata'}->[$i]->[1] eq $value)) {
+	    splice (@{$section_ptr->{'metadata'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub delete_all_metadata {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_all_metadata couldn't find section " .
+	    "$section\n";
+	return;
+    }
+    
+    $section_ptr->{'metadata'} = [];
+}
+
+sub set_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->set_utf8_metadata_element ($section, $field, 
+				      &unicode::ascii2utf8(\$value));
+}
+
+# set_utf8_metadata_element assumes the text has already been
+# converted to the UTF-8 encoding.
+sub set_utf8_metadata_element {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->delete_metadata ($section, $field);
+    $self->add_utf8_metadata ($section, $field, $value);
+}
+
+
+# add_metadata assumes the text is in (extended) ascii form. For
+# text which hash been already converted to the UTF-8 format use
+# add_utf8_metadata.
+sub add_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    $self->add_utf8_metadata ($section, $field,
+			      &unicode::ascii2utf8(\$value));
+}
+
+# add_utf8_metadata assumes the text has already been converted
+# to the UTF-8 encoding.
+sub add_utf8_metadata {
+    my $self = shift (@_);
+    my ($section, $field, $value) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::add_utf8_metadata couldn't find section " .
+	    "$section\n";
+	return;
+    }
+    if (!defined $value) {
+	print STDERR "doc::add_utf8_metadata undefined value for $field\n";
+	return;
+    }
+    if (!defined $field) {
+	print STDERR "doc::add_utf8_metadata undefined metadata type \n";
+	return;
+    }
+    
+    push (@{$section_ptr->{'metadata'}}, [$field, $value]);
+}
+
+
+# methods for dealing with text
+
+# returns the text for a section
+sub get_text {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_text couldn't find section " .
+	    "$section\n";
+	return "";
+    }
+
+    return $section_ptr->{'text'};
+}
+
+# returns the (utf-8 encoded) length of the text for a section
+sub get_text_length {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::get_text_length couldn't find section " .
+	    "$section\n";
+	return 0;
+    }
+
+    return length ($section_ptr->{'text'});
+}
+
+sub delete_text {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::delete_text couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    $section_ptr->{'text'} = "";
+}
+
+# add_text assumes the text is in (extended) ascii form. For
+# text which has been already converted to the UTF-8 format
+# use add_utf8_text.
+sub add_text {
+    my $self = shift (@_);
+    my ($section, $text) = @_;
+
+    # convert the text to UTF-8 encoded unicode characters
+    # and add the text
+    $self->add_utf8_text($section, &unicode::ascii2utf8(\$text));
+}
+
+
+# add_utf8_text assumes the text to be added has already
+# been converted to the UTF-8 encoding. For ascii text use
+# add_text
+sub add_utf8_text {
+    my $self = shift (@_);
+    my ($section, $text) = @_;
+
+    my $section_ptr = $self->_lookup_section($section);
+    if (!defined $section_ptr) {
+	print STDERR "doc::add_utf8_text couldn't find section " .
+	    "$section\n";
+	return;
+    }
+
+    $section_ptr->{'text'} .= $text;
+}
+
+
+# methods for dealing with associated files
+
+# a file is associated with a document, NOT a section.
+# if section is defined it is noted in the data structure
+# only so that files associated from a particular section
+# may be removed later (using delete_section_assoc_files)
+sub associate_file {
+    my $self = shift (@_);
+    my ($real_filename, $assoc_filename, $mime_type, $section) = @_;
+    $mime_type = &ghtml::guess_mime_type ($real_filename) unless defined $mime_type;
+
+    # remove all associated files with the same name
+    $self->delete_assoc_file ($assoc_filename);
+
+    push (@{$self->{'associated_files'}}, 
+	  [$real_filename, $assoc_filename, $mime_type, $section]);
+}
+
+# returns a list of associated files in the form
+#   [[real_filename, assoc_filename, mimetype], ...]
+sub get_assoc_files {
+    my $self = shift (@_);
+
+    return $self->{'associated_files'};
+}
+
+sub delete_section_assoc_files {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    my $i=0;
+    while ($i < scalar (@{$self->{'associated_files'}})) {
+	if (defined $self->{'associated_files'}->[$i]->[3] &&
+	    $self->{'associated_files'}->[$i]->[3] eq $section) {
+	    splice (@{$self->{'associated_files'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub delete_assoc_file {
+    my $self = shift (@_);
+    my ($assoc_filename) = @_;
+
+    my $i=0;
+    while ($i < scalar (@{$self->{'associated_files'}})) {
+	if ($self->{'associated_files'}->[$i]->[1] eq $assoc_filename) {
+	    splice (@{$self->{'associated_files'}}, $i, 1);
+	} else {
+	    $i++;
+	}
+    }
+}
+
+sub reset_nextsection_ptr {
+    my $self = shift (@_);
+    my ($section) = @_;
+    
+    my $section_ptr = $self->_lookup_section($section);
+    $section_ptr->{'next_subsection'} = 1;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/docprint.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/docprint.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/docprint.pm	(revision 21083)
@@ -0,0 +1,67 @@
+###########################################################################
+#
+# docprint.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 document processor prints a document out to STDOUT
+
+
+package docprint;
+
+use arcinfo;
+use docproc;
+use util;
+
+
+sub BEGIN {
+    @ISA = ('docproc');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new docproc ();
+
+    return bless $self, $class;
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    # add associated files as metadata to the document
+    my @assoc_files = ();
+    foreach $assoc_file (@{$doc_obj->get_assoc_files()}) {
+	if (-e $assoc_file->[0]) {
+	    $doc_obj->add_metadata ($doc_obj->get_top_section(), 
+				    "gsdlassocfile", 
+				    "$assoc_file->[1]:$assoc_file->[2]");
+	}
+    }
+    
+    # output document
+    $doc_obj->output_section(STDOUT, $doc_obj->get_top_section(),
+			     undef, undef, 0);
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/docproc.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/docproc.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/docproc.pm	(revision 21083)
@@ -0,0 +1,61 @@
+###########################################################################
+#
+# docproc.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# document processors are used by the document reader plugins
+# to do some processing on some documents
+
+package docproc;
+
+sub new {
+    my ($class) = @_;
+    my $self = {};
+
+    $self->{'OIDtype'} = "hash";
+
+    return bless $self, $class;
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    die "docproc::process function must be implemented in sub classes\n";
+}
+
+# OIDtype may be "hash" or "incremental"
+sub set_OIDtype {
+    my $self = shift (@_);
+    my ($type) = @_;
+
+    if ($type eq "incremental") {
+	$self->{'OIDtype'} = $type;
+    } else {
+	$self->{'OIDtype'} = "hash";
+    }
+}
+
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/docsave.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/docsave.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/docsave.pm	(revision 21083)
@@ -0,0 +1,300 @@
+###########################################################################
+#
+# docsave.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 document processor saves a document in the 
+# archives directory of a collection (as xml)
+
+
+package docsave;
+
+use arcinfo;
+use docproc;
+use util;
+
+
+sub BEGIN {
+    @ISA = ('docproc');
+}
+
+sub new {
+    my ($class, $collection, $archive_info, $verbosity, 
+	$gzip, $groupsize, $outhandle) = @_;
+    my $self = new docproc ();
+    
+    
+    $groupsize=1 unless defined $groupsize;
+    $self->{'collection'} = $collection;
+    $self->{'archive_info'} = $archive_info;
+    $self->{'verbosity'} = $verbosity;
+    $self->{'gzip'} = $gzip;
+    
+    $self->{'groupsize'} = $groupsize;
+    $self->{'gs_count'} = 0;
+
+    $self->{'outhandle'} = STDERR;
+    $self->{'outhandle'} = $outhandle if defined $outhandle;
+    # set a default for the archive directory
+    $self->{'archive_dir'} = &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, "archives");
+    
+    $self->{'sortmeta'} = undef;
+    
+    return bless $self, $class;
+}
+
+sub setarchivedir {
+    my $self = shift (@_);
+    my ($archive_dir) = @_;
+    
+    &util::mk_all_dir ($archive_dir) unless -e $archive_dir;
+    $self->{'archive_dir'} = $archive_dir;
+}
+
+sub set_sortmeta {
+    my $self = shift (@_);
+    my ($sortmeta) = @_;
+    
+    $self->{'sortmeta'} = $sortmeta;
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+ 
+    my $outhandle = $self->{'outhandle'};
+   
+    if ($self->{'groupsize'} > 1) {
+	$self->group_process ($doc_obj);
+	
+    } else {
+	# groupsize is 1 (i.e. one document per XML file) so sortmeta 
+	# may be used
+	
+	my $OID = $doc_obj->get_OID();
+	$OID = "NULL" unless defined $OID;
+	
+	# get document's directory
+	my $doc_dir = $self->get_doc_dir ($OID);
+	
+	# copy all the associated files, add this information as metadata
+	# to the document
+	$self->process_assoc_files ($doc_obj, $doc_dir);
+	
+	my $doc_file 
+	    = &util::filename_cat ($self->{'archive_dir'}, $doc_dir, "doc.xml");
+	my $short_doc_file = &util::filename_cat ($doc_dir, "doc.xml");
+	
+	if (!open (OUTDOC, ">$doc_file")) {
+	    print $outhandle "docsave::process could not write to file $doc_file\n";
+	    return;
+	}
+
+	# save this document
+	$self->output_xml_header('docsave::OUTDOC');
+	$doc_obj->output_section('docsave::OUTDOC', $doc_obj->get_top_section());
+	$self->output_xml_footer('docsave::OUTDOC');
+	close OUTDOC;
+
+	if ($self->{'gzip'}) {
+	    my $doc_file = $self->{'gs_filename'};
+	    `gzip $doc_file`;
+	    $doc_file .= ".gz";
+	    $short_doc_file .= ".gz";
+	    if (!-e $doc_file) {
+		print $outhandle "error while gzipping: $doc_file doesn't exist\n";
+		return 0;
+	    }
+	}
+
+	# do the sortmeta thing
+	my ($metadata);
+	if (defined ($self->{'sortmeta'})) {
+	    $metadata = $doc_obj->get_metadata_element ($doc_obj->get_top_section(), $self->{'sortmeta'});
+	}
+
+	# store reference in the archive_info
+	$self->{'archive_info'}->add_info($OID, $short_doc_file, $metadata);
+    }
+}
+
+sub group_process {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+
+    my $OID = $doc_obj->get_OID();
+    $OID = "NULL" unless defined $OID;
+
+    my $groupsize = $self->{'groupsize'};
+    my $gs_count = $self->{'gs_count'};
+    my $open_new_file = (($gs_count % $groupsize)==0);
+
+    # opening a new file, or document has assoicated files => directory needed
+    if (($open_new_file) || (scalar(@{$doc_obj->get_assoc_files()})>0)) {
+
+	# get document's directory
+	my $doc_dir = $self->get_doc_dir ($OID);
+
+	# copy all the associated files, add this information as metadata
+	# to the document
+	$self->process_assoc_files ($doc_obj, $doc_dir);
+
+
+	if ($open_new_file) {
+	    # only if opening new file
+	    my $doc_file 
+		= &util::filename_cat ($self->{'archive_dir'}, $doc_dir, "doc.xml");
+	    my $short_doc_file = &util::filename_cat ($doc_dir, "doc.xml");
+	    
+	    if ($gs_count>0)
+	    {
+		return if (!$self->close_file_output());
+	    }
+	    
+	    if (!open (OUTDOC, ">$doc_file")) {
+		print $outhandle "docsave::group_process could not write to file $doc_file\n";
+		return;
+	    }
+	    $self->{'gs_filename'} = $doc_file;
+	    $self->{'gs_short_filename'} = $short_doc_file;
+	    $self->{'gs_OID'} = $OID;
+
+	    $self->output_xml_header('docsave::OUTDOC');
+	}
+    }
+
+    # save this document
+    $doc_obj->output_section('docsave::OUTDOC', $doc_obj->get_top_section());
+
+    $self->{'gs_count'}++;
+}
+
+
+sub get_doc_dir {
+    my $self = shift (@_);
+    my ($OID) = @_;
+
+    my $doc_info = $self->{'archive_info'}->get_info($OID);
+    my $doc_dir = "";
+    if (defined $doc_info && scalar(@$doc_info) >= 1) {
+	# this OID already has an assigned directory, use the
+	# same one.
+	$doc_dir = $doc_info->[0];
+	$doc_dir =~ s/\/?doc\.xml(\.gz)?$//;
+    } else {
+	# have to get a new document directory
+	my $doc_dir_rest = $OID;
+	my $doc_dir_num = 0;
+	do {
+	    $doc_dir .= "/" if $doc_dir_num > 0;
+	    if ($doc_dir_rest =~ s/^(.{1,8})//) {
+		$doc_dir .= $1;
+		$doc_dir_num++;
+	    }
+	} while ($doc_dir_rest ne "" && 
+		 ((-d &util::filename_cat ($self->{'archive_dir'}, "$doc_dir.dir")) || 
+		  ($self->{'archive_info'}->size() >= 1024 && $doc_dir_num < 2)));
+	$doc_dir .= ".dir";
+	
+    }
+	
+    &util::mk_all_dir (&util::filename_cat ($self->{'archive_dir'}, $doc_dir));
+
+    return $doc_dir;
+}
+
+
+sub process_assoc_files {
+    my $self = shift (@_);
+    my ($doc_obj, $doc_dir) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my @assoc_files = ();
+    foreach $assoc_file (@{$doc_obj->get_assoc_files()}) {
+	my ($dir, $afile) = $assoc_file->[1] =~ /^(.*?)([^\/\\]+)$/;
+	$dir = "" unless defined $dir;
+	if (-e $assoc_file->[0]) {
+	    my $filepath = &util::filename_cat($self->{'archive_dir'}, $doc_dir, $afile);
+	    &util::hard_link ($assoc_file->[0], $filepath);
+	    $doc_obj->add_utf8_metadata ($doc_obj->get_top_section(),
+					 "gsdlassocfile",
+					 "$afile:$assoc_file->[2]:$dir");
+	    $doc_obj->set_utf8_metadata_element ($doc_obj->get_top_section(),
+						 "assocfilepath",
+						 "$doc_dir");
+	} elsif ($self->{'verbosity'} > 2) {
+	    print $outhandle "docsave::process couldn't copy the associated file " .
+		"$assoc_file->[0] to $afile\n";
+	}
+    }
+}
+    
+
+sub close_file_output
+{
+    my ($self) = @_;
+
+    $self->output_xml_footer('docsave::OUTDOC');    
+    close OUTDOC;
+
+    my $OID = $self->{'gs_OID'};
+    my $short_doc_file = $self->{'gs_short_filename'};
+
+    if ($self->{'gzip'}) {
+	my $doc_file = $self->{'gs_filename'};
+	`gzip $doc_file`;
+	$doc_file .= ".gz";
+	$short_doc_file .= ".gz";
+	if (!-e $doc_file) {
+	    my $outhandle = $self->{'outhandle'};
+	    print $outhandle "error while gzipping: $doc_file doesn't exist\n";
+	    return 0;
+	}
+    }
+
+    # store reference in the archive_info
+    $self->{'archive_info'}->add_info($OID, $short_doc_file);
+
+    return 1;
+}
+
+sub output_xml_header {
+    my $self = shift (@_);
+    my ($handle) = @_;
+
+    print $handle '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . "\n";
+    print $handle '<!DOCTYPE Archive SYSTEM "http://greenstone.org/dtd/Archive/1.0/Archive.dtd">' . "\n";
+    print $handle "<Archive>\n";
+}
+
+sub output_xml_footer {
+    my $self = shift (@_);
+    my ($handle) = @_;
+
+    print $handle "</Archive>\n";
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/encodings.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/encodings.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/encodings.pm	(revision 21083)
@@ -0,0 +1,107 @@
+###########################################################################
+#
+# encodings.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Each encoding supported by the Greenstone build-time software should be
+# specified in the following hash table ($encodings).
+
+package encodings;
+
+# $encodings takes the form:
+# --> identifier --> name      --> The full display name of the encoding.
+#                --> mapfile   --> The ump file associated with the encoding
+#                --> double    --> 1 if it's a double byte encoding
+#                --> converter --> If the encoding needs a specialized conversion
+#                                  routine this is the name of that routine.
+
+$encodings = {
+    'iso_8859_1' => {'name' => 'Latin1 (western languages)', 'mapfile' => '8859_1.ump'},
+
+    'iso_8859_2' => {'name' => 'Latin2 (central and eastern european languages)',
+		     'mapfile' => '8859_2.ump'},
+
+    'iso_8859_3' => {'name' => 'Latin3', 'mapfile' => '8859_3.ump'},
+
+    'iso_8859_4' => {'name' => 'Latin4', 'mapfile' => '8859_4.ump'},
+
+    'iso_8859_5' => {'name' => 'Cyrillic', 'mapfile' => '8859_5.ump'},
+
+    'iso_8859_6' => {'name' => 'Arabic', 'mapfile' => '8859_6.ump'},
+
+    'iso_8859_7' => {'name' => 'Greek', 'mapfile' => '8859_7.ump'},
+
+    'iso_8859_8' => {'name' => 'Hebrew', 'mapfile' => '8859_8.ump'},
+
+    'iso_8859_9' => {'name' => 'Turkish', 'mapfile' => '8859_9.ump'},
+
+    'windows_1250' => {'name' => 'Windows codepage 1250 (WinLatin2)',
+		       'mapfile' => 'win1250.ump'},
+
+    'windows_1251' => {'name' => 'Windows codepage 1251 (WinCyrillic)',
+		       'mapfile' => 'win1251.ump'},
+
+    'windows_1252' => {'name' => 'Windows codepage 1252 (WinLatin1)',
+		       'mapfile' => 'win1252.ump'},
+
+    'windows_1253' => {'name' => 'Windows codepage 1253 (WinGreek)', 
+		       'mapfile' => 'win1253.ump'},
+
+    'windows_1254' => {'name' => 'Windows codepage 1254 (WinTurkish)',
+		       'mapfile' => 'win1254.ump'},
+
+    'windows_1255' => {'name' => 'Windows codepage 1255 (WinHebrew)', 
+		       'mapfile' => 'win1255.ump'},
+
+    'windows_1256' => {'name' => 'Windows codepage 1256 (WinArabic)', 
+		       'mapfile' => 'win1256.ump'},
+
+    'windows_1257' => {'name' => 'Windows codepage 1257 (WinBaltic)',
+		       'mapfile' => 'win1257.ump'},
+
+    'windows_1258' => {'name' => 'Windows codepage 1258 (Vietnamese)',
+		       'mapfile' => 'win1258.ump'},
+
+    'windows_874' => {'name' => 'Windows codepage 874 (Thai)', 'mapfile' => 'win874.ump'},
+
+    'dos_866' => {'name' => 'DOS codepage 866 (Cyrillic)', 'mapfile' => 'dos866.ump'},
+
+    'koi8_r' => {'name' => 'Cyrillic', 'mapfile' => 'koi8_r.ump'},
+
+    'koi8_u' => {'name' => 'Cyrillic (Ukrainian)', 'mapfile' => 'koi8_u.ump'},
+
+    'iscii_de' => {'name' => 'ISCII Devanagari', 'mapfile' => 'iscii_de.ump'},
+
+    'shift_jis' => {'name' => 'Japanese (Shift-JIS)', 'mapfile' => 'shiftjis.ump',
+		    'converter' => 'shiftjis2unicode'},
+
+    'euc_jp' => {'name' => 'Japanese (EUC)', 'mapfile' => 'euc_jp.ump'},
+
+    'korean' => {'name' => 'Korean (Unified Hangul Code - i.e. a superset of EUC-KR)',
+		 'mapfile' => 'uhc.ump'},
+
+    'gb' => {'name' => 'Chinese Simplified (GB)', 'mapfile' => 'gbk.ump'},
+
+    'big5' => {'name' => 'Chinese Traditional (Big5)', 'mapfile' => 'big5.ump'}
+
+};
Index: /main/tags/2.38/gsdl/perllib/gflock.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/gflock.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/gflock.pm	(revision 21083)
@@ -0,0 +1,54 @@
+###########################################################################
+#
+# gflock.pm - an attempt to use flock only on those platforms
+# on which it's supported (i.e. everything but Windows 95/98)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package gflock;
+
+use Fcntl ':flock';
+
+# returns true if successful (or if OS is a form of windows other than NT)
+sub lock {
+    my ($handle) = @_;
+
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	return 1;
+    } else {
+	return flock($handle, LOCK_EX);
+    }
+}
+
+# returns true if successful (or if OS is a form of windows other than NT)
+sub unlock {
+    my ($handle) = @_;
+
+    if ($ENV{'GSDLOS'} eq "windows" && !Win32::IsWinNT()) {
+	return 1;
+    } else {
+	return flock($handle, LOCK_UN);
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/ghtml.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/ghtml.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/ghtml.pm	(revision 21083)
@@ -0,0 +1,281 @@
+###########################################################################
+#
+# ghtml.pm -- this used to be called html.pm but it clashed
+# with the existing html module under windows
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package ghtml;
+
+# htmlsafe(TEXT)
+# 
+# Converts SGML meta characters in TEXT to entity references.
+# 
+sub htmlsafe
+{
+    $_[0] =~ s/&/&amp;/osg;
+    $_[0] =~ s/</&lt;/osg;
+    $_[0] =~ s/>/&gt;/osg;
+    $_[0] =~ s/\"/&quot;/osg;
+}
+
+# urlsafe(TEXT)
+# 
+# Converts characters not allowed in a URL to their hex representation.
+# 
+sub urlsafe
+{
+    $_[0] =~ s/[\x09\x20\x22\x3c\x3e\x5b\x5c\x5d\x5e\x60\x7b\x7c\x7d\x7e\?\=\&\+_\/]/sprintf("%%%2x", ord($&))/gse;
+}
+
+# dmsafe
+#
+# Converts characters which could make display.pl or html crack to their entity references.
+# Don't use this on dm macros as they will no longer be recognisable by dm (which
+# by the way, is the whole idea).
+# -- Rodger 12/1/98
+sub dmsafe {
+    my ($s) = $_[0];
+    $s =~ s/&/&amp;/osg; # for html
+    $s =~ s/</&lt;/osg;  # for html
+    $s =~ s/>/&gt;/osg;  # for html
+    $s =~ s/\_/&#095;/osg; # for dm (we have a convention of starting macros with _
+    $s =~ s/\"/&quot;/osg; # for html (don't want to be interpreted as a quote)
+    $s =~ s/\{/&#123;/osg; # for dm blocks
+    $s =~ s/\}/&#125;/osg; # for dm blocks
+    $s =~ s/\\/&#092;/osg; # for dm (dm removes naturally occurring backquotes)
+    return $s;
+}
+
+
+# named entry to the standard html font
+%charnetosf = ("Agrave"=> "192",  "Aacute"=> "193",  "Acirc" => "194",  "Atilde"=> "195",
+	       "Auml"  => "196",  "Aring" => "197",  "AElig" => "198",  "Ccedil"=> "199",
+	       "Egrave"=> "200",  "Eacute"=> "201",  "Ecirc" => "202",  "Euml"  => "203",
+	       "Igrave"=> "204",  "Iacute"=> "205",  "Icirc" => "206",  "Iuml"  => "207",
+	       "ETH"   => "208",  "Ntilde"=> "209",  "Ograve"=> "210",  "Oacute"=> "211",
+	       "Ocirc" => "212",  "Otilde"=> "213",  "Ouml"  => "214",  
+	       "Oslash"=> "216",  "Ugrave"=> "217",  "Uacute"=> "218",  "Ucirc" => "219",
+	       "Uuml"  => "220",  "Yacute"=> "221",  "THORN" => "222",  "szlig" => "223",
+	       "agrave"=> "224",  "aacute"=> "225",  "acirc" => "226",  "atilde"=> "227",
+	       "auml"  => "228",  "aring" => "229",  "aelig" => "230",  "ccedil"=> "231",
+	       "egrave"=> "232",  "eacute"=> "233",  "ecirc" => "234",  "euml"  => "235",
+	       "igrave"=> "236",  "iacute"=> "237",  "icirc" => "238",  "iuml"  => "239",
+	       "eth"   => "240",  "ntidle"=> "241",  "ograve"=> "242",  "oacute"=> "243",
+	       "ocirc" => "244",  "otilde"=> "245",  "ouml"  => "246",  
+	       "oslash"=> "248",  "ugrave"=> "249",  "uacute"=> "250",  "ucirc" => "251",
+	       "uuml"  => "252",  "yacute"=> "253",  "thorn" => "254",  "yuml"  => "255");
+
+%symnetosf = ("quot"  => "34",   "amp"   => "38",   "lt"    => "60",   "gt"    => "62",
+	      "nbsp"  => "160",  "iexcl" => "161",  "cent"  => "162",  "pound" => "163",
+	      "curren"=> "164",  "yen"   => "165",  "brvbar"=> "166",  "sect"  => "167",
+	      "uml"   => "168",  "copy"  => "169",  "ordf"  => "170",  "laquo" => "171",
+	      "not"   => "172",  "shy"   => "173",  "reg"   => "174",  "macr"  => "175",
+	      "deg"   => "176",  "plusmn"=> "177",  "sup2"  => "178",  "sup3"  => "179",
+	      "acute" => "180",  "micro" => "181",  "para"  => "182",  "middot"=> "183",
+	      "cedil" => "184",  "sup1"  => "185",  "ordm"  => "186",  "raquo" => "187",
+	      "frac14"=> "188",  "frac12"=> "189",  "frac34"=> "190",  "iquest"=> "191",
+	      "times" => "215",  "divide"=> "247");
+
+
+
+# standard font to plain text
+%sftotxt = ("32"  => " ",  "33"  => "!",  "34"  => "\"",  "35"  => "\#",  "36"  => "\$",
+	    "37"  => "\%", "38"  => "&",  "39"  => "'",   "40"  => "(",   "41"  => ")",
+	    "42"  => "*",  "43"  => "+",  "44"  => ",",   "45"  => "-",   "46"  => ".",
+	    "47"  => "/",  "48"  => "0",  "49"  => "1",   "50"  => "2",   "51"  => "3",
+	    "52"  => "4",  "53"  => "5",  "54"  => "6",   "55"  => "7",   "56"  => "8",
+	    "57"  => "9",  "58"  => ":",  "59"  => ";",   "60"  => "<",   "61"  => "=",
+	    "62"  => ">",  "63"  => "?",  "64"  => "\@",  "65"  => "A",   "66"  => "B",
+	    "57"  => "9",  "58"  => ":",  "59"  => ";",   "61"  => "=",
+	    "63"  => "?",  "64"  => "\@", "65"  => "A",  "66"  => "B",
+	    "67"  => "C",  "68"  => "D",  "69"  => "E",   "70"  => "F",   "71"  => "G",
+	    "72"  => "H",  "73"  => "I",  "74"  => "J",   "75"  => "K",   "76"  => "L",
+	    "77"  => "M",  "78"  => "N",  "79"  => "O",   "80"  => "P",   "81"  => "Q",
+	    "82"  => "R",  "83"  => "S",  "84"  => "T",   "85"  => "U",   "86"  => "V",
+	    "87"  => "W",  "88"  => "X",  "89"  => "Y",   "90"  => "Z",   "91"  => "[",
+	    "92"  => "\\", "93"  => "]",  "94"  => "^",   "95"  => "_",   "96"  => "`",
+	    "97"  => "a",  "98"  => "b",  "99"  => "c",   "100" => "d",   "101" => "e",
+	    "102" => "f",  "103" => "g",  "104" => "h",   "105" => "i",   "106" => "j",
+	    "107" => "k",  "108" => "l",  "109" => "m",   "110" => "n",   "111" => "o",
+	    "112" => "p",  "113" => "q",  "114" => "r",   "115" => "s",   "116" => "t",
+	    "117" => "u",  "118" => "v",  "119" => "w",   "120" => "x",   "121" => "y",
+	    "122" => "z",  "123" => "{",  "124" => "|",   "125" => "}",   "126" => "~",
+	    "130" => ",",  "131" => "f",  "132" => "\"",   "133" => "...", "139" => "<",
+	    "140" => "OE", "145" => "'",  "146" => "'",   "147" => "\"",   "148" => "\"",
+	    "149" => "o",  "150" => "--", "151" => "-",   "152" => "~",   "153" => "TM",
+	    "155" => ">",  "156" => "oe", "159" => "Y",   "160" => " ",   "178" => "2",
+	    "179" => "3",  "185" => "1",  "188" => "1/4", "189" => "1/2", "190" => "3/4",
+	    "192" => "A",  "193" => "A",  "194" => "A",   "195" => "A",   "196" => "A",
+	    "197" => "A",  "198" => "AE", "199" => "C",   "200" => "E",   "201" => "E",
+	    "202" => "E",  "203" => "E",  "204" => "I",   "205" => "I",   "206" => "I",
+	    "207" => "I",  "208" => "D",  "209" => "N",   "210" => "O",   "211" => "O",
+	    "212" => "O",  "213" => "O",  "214" => "O",   "215" => "*",   "216" => "O",
+	    "217" => "U",  "218" => "U",  "219" => "U",   "220" => "U",   "221" => "Y",
+	    "223" => "ss", "224" => "a",  "225" => "a",   "226" => "a",   "227" => "a",
+	    "228" => "a",  "229" => "a",  "230" => "ae",  "231" => "c",   "232" => "e",
+	    "233" => "e",  "234" => "e",  "235" => "e",   "236" => "i",   "237" => "i",
+	    "238" => "i",  "239" => "i",  "241" => "n",   "242" => "o",   "243" => "o",
+	    "244" => "o",  "245" => "o",  "246" => "o",   "247" => "/",   "248" => "o",
+	    "249" => "u",  "250" => "u",  "251" => "u",   "252" => "u",   "253" => "y",
+	    "255" => "y",  "8218" => ",");
+
+
+# returns the character in the standard html font. It assumes that the
+# & and ; have been stripped off the string.
+sub getcharequiv {
+    my ($entity, $convertsymbols) = @_;
+
+    # replace &#8218 with comma (",")
+    $entity =~ s/8218/044/;
+
+    # a numeric entity
+    if ($entity =~ /^\#0*(\d+)/) {
+	return pack("c", $1);
+    }
+    
+    # a named character entity
+    if (defined $charnetosf{$entity}) {
+	return pack("c", $charnetosf{$entity});
+    }
+
+    # a named symbol entity
+    if ($convertsymbols && defined $symnetosf{$entity}) {
+	return pack("c", $symnetosf{$entity});
+    }
+
+    return "&$entity;"; # unknown character
+}
+
+# convert character entities from named equivalents to html font
+sub convertcharentities {
+    # args: the text that you want to convert
+
+    $_[0] =~ s/&([^;]+);/&getcharequiv($1,0)/gse;
+}
+
+# convert any entities from named equivalents to html font
+sub convertallentities {
+    # args: the text that you want to convert
+
+    $_[0] =~ s/&([^;]+);/&getcharequiv($1,1)/gse;
+}
+
+sub html2txt {
+    # args: the text that you want converted to ascii, 
+    # and whether to strip out sgml tags
+
+    # strip out sgml tags if needed
+    $_[0] =~ s/<[^>]>//g if $_[1];
+
+    # convert the char entities to the standard html font
+    &convertcharentities($_[0]); 
+    
+    # convert the html character set to a plain ascii character set
+    my $pos = 0;
+    while ($pos < length($_[0])) {
+	my $charnum = ord(substr($_[0], $pos, 1));
+	if ($charnum >= 32) { # only convert characters above #32
+	    my $replacechars = " ";
+	    $replacechars = $sftotxt{$charnum} if defined $sftotxt{$charnum};
+	    substr($_[0], $pos, 1) = $replacechars;
+	    $pos += length ($replacechars);
+
+	} else {
+	    $pos ++;
+	}
+    }
+}  
+
+
+# look for mime.types (eg in /etc, or apache/conf directories), or have a look
+# at <ftp://ftp.iana.org/in-notes/iana/assignments/media-types/> for defaults.
+sub guess_mime_type {
+    my ($filename) = @_;
+
+    my ($fileext) = $filename =~ /\.(\w+)$/;
+    return "unknown" unless defined $fileext;
+
+    my %mime_type = ("ai"=>"application/postscript", "aif"=>"audio/x-aiff", 
+		     "aifc"=>"audio/x-aiff", "aiff"=>"audio/x-aiff", 
+		     "au"=>"audio/basic", "avi"=>"video/x-msvideo",
+		     "bcpio"=>"application/x-bcpio", "bin"=>"application/octet-stream", 
+		     "cdf"=>"application/x-netcdf", "class"=>"application/octet-stream", 
+		     "cpio"=>"application/x-cpio", "cpt"=>"application/mac-compactpro",
+		     "csh"=>"application/x-csh", "dcr"=>"application/x-director", 
+		     "dir"=>"application/x-director", "dms"=>"application/octet-stream", 
+		     "doc"=>"application/msword", "dvi"=>"application/x-dvi",
+		     "dxr"=>"application/x-director", "eps"=>"application/postscript", 
+		     "etx"=>"text/x-setext",
+		     "exe"=>"application/octet-stream", "gif"=>"image/gif",
+		     "gtar"=>"application/x-gtar", "hdf"=>"application/x-hdf",
+		     "hqx"=>"application/mac-binhex40", "htm"=>"text/html",
+		     "html"=>"text/html", "ice"=>"x-conference/x-cooltalk",
+		     "ief"=>"image/ief", "jpe"=>"image/jpeg",
+		     "jpeg"=>"image/jpeg", "jpg"=>"image/jpeg",
+		     "kar"=>"audio/midi", "latex"=>"application/x-latex",
+		     "lha"=>"application/octet-stream", "lzh"=>"application/octet-stream",
+		     "man"=>"application/x-troff-man", "mcf"=>"image/vasa",
+		     "me"=>"application/x-troff-me", "mid"=>"audio/midi",
+		     "midi"=>"audio/midi", "mif"=>"application/x-mif",
+		     "mov"=>"video/quicktime", "movie"=>"video/x-sgi-movie",
+		     "mp2"=>"audio/mpeg", "mpe"=>"video/mpeg",
+		     "mpeg"=>"video/mpeg", "mpg"=>"video/mpeg",
+		     "mpga"=>"audio/mpeg", "ms"=>"application/x-troff-ms",
+		     "nc"=>"application/x-netcdf", "oda"=>"application/oda",
+		     "pbm"=>"image/x-portable-bitmap", "pdb"=>"chemical/x-pdb",
+		     "pdf"=>"application/pdf", "pgm"=>"image/x-portable-graymap",
+		     "png"=>"image/png", "pnm"=>"image/x-portable-anymap",
+		     "ppm"=>"image/x-portable-pixmap",
+		     "ppt"=>"application/vnd.ms-powerpoint",
+		     "ps"=>"application/postscript", "qt"=>"video/quicktime",
+		     "ra"=>"audio/x-realaudio", "ram"=>"audio/x-pn-realaudio",
+		     "ras"=>"image/x-cmu-raster", "rgb"=>"image/x-rgb",
+		     "roff"=>"application/x-troff", "rpm"=>"audio/x-pn-realaudio-plugin",
+		     "rtf"=>"application/rtf", "rtx"=>"text/richtext",
+		     "sgm"=>"text/x-sgml", "sgml"=>"text/x-sgml",
+		     "sh"=>"application/x-sh", "shar"=>"application/x-shar",
+		     "sit"=>"application/x-stuffit", "skd"=>"application/x-koan",
+		     "skm"=>"application/x-koan", "skp"=>"application/x-koan",
+		     "skt"=>"application/x-koan", "snd"=>"audio/basic",
+		     "src"=>"application/x-wais-source", "sv4cpio"=>"application/x-sv4cpio",
+		     "sv4crc"=>"application/x-sv4crc", "t"=>"application/x-troff",
+		     "tar"=>"application/x-tar", "tcl"=>"application/x-tcl",
+		     "tex"=>"application/x-tex", "texi"=>"application/x-texinfo",
+		     "texinfo"=>"application/x-texinfo", "tif"=>"image/tiff",
+		     "tiff"=>"image/tiff", "tr"=>"application/x-troff",
+		     "tsv"=>"text/tab-separated-values", "txt"=>"text/plain",
+		     "ustar"=>"application/x-ustar", "vcd"=>"application/x-cdlink",
+		     "vrml"=>"x-world/x-vrml", "wav"=>"audio/x-wav",
+		     "wrl"=>"x-world/x-vrml", "xbm"=>"image/x-xbitmap",
+		     "xls"=>"application/vnd.ms-excel",
+		     "xpm"=>"image/x-xpixmap", "xwd"=>"image/x-xwindowdump",
+		     "xyz"=>"chemical/x-pdb", "zip"=>"application/zip");
+
+    return $mime_type{$fileext} if (defined $mime_type{$fileext});
+
+    return "unknown";
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/iso639.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/iso639.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/iso639.pm	(revision 21083)
@@ -0,0 +1,333 @@
+# mapping to and from iso 639 two letter language symbols
+
+package iso639;
+
+%fromiso639 = (
+	       'aa' => 'Afar',
+	       'ab' => 'Abkhazian',
+	       'af' => 'Afrikaans',
+	       'am' => 'Amharic',
+	       'ar' => 'Arabic',
+	       'as' => 'Assamese',
+	       'ay' => 'Aymara',
+	       'az' => 'Azerbaijani',
+
+	       'ba' => 'Bashkir',
+	       'be' => 'Byelorussian',
+	       'bg' => 'Bulgarian',
+	       'bh' => 'Bihari',
+	       'bi' => 'Bislama',
+	       'bn' => 'Bengali; Bangla',
+	       'bo' => 'Tibetan',
+	       'br' => 'Breton',
+
+	       'ca' => 'Catalan',
+	       'co' => 'Corsican',
+	       'cs' => 'Czech',
+	       'cy' => 'Welsh',
+
+	       'da' => 'Danish',
+	       'de' => 'German',
+	       'dz' => 'Bhutani',
+
+	       'el' => 'Greek',
+	       'en' => 'English',
+	       'eo' => 'Esperanto',
+	       'es' => 'Spanish',
+	       'et' => 'Estonian',
+	       'eu' => 'Basque',
+
+	       'fa' => 'Persian',
+	       'fi' => 'Finnish',
+	       'fj' => 'Fiji',
+	       'fo' => 'Faroese',
+	       'fr' => 'French',
+	       'fy' => 'Frisian',
+
+	       'ga' => 'Irish',
+	       'gd' => 'Scots Gaelic',
+	       'gl' => 'Galician',
+	       'gn' => 'Guarani',
+	       'gu' => 'Gujarati',
+
+	       'ha' => 'Hausa',
+	       'hi' => 'Hindi',
+	       'hr' => 'Croatian',
+	       'hu' => 'Hungarian',
+	       'hy' => 'Armenian',
+
+	       'ia' => 'Interlingua',
+	       'ie' => 'Interlingue',
+	       'ik' => 'Inupiak',
+	       'in' => 'Indonesian',
+	       'is' => 'Icelandic',
+	       'it' => 'Italian',
+	       'iw' => 'Hebrew',
+
+	       'ja' => 'Japanese',
+	       'ji' => 'Yiddish',
+	       'jw' => 'Javanese',
+
+	       'ka' => 'Georgian',
+	       'kk' => 'Kazakh',
+	       'kl' => 'Greenlandic',
+	       'km' => 'Cambodian',
+	       'kn' => 'Kannada',
+	       'ko' => 'Korean',
+	       'ks' => 'Kashmiri',
+	       'ku' => 'Kurdish',
+	       'ky' => 'Kirghiz',
+
+	       'la' => 'Latin',
+	       'ln' => 'Lingala',
+	       'lo' => 'Laothian',
+	       'lt' => 'Lithuanian',
+	       'lv' => 'Latvian, Lettish',
+
+	       'mg' => 'Malagasy',
+	       'mi' => 'Maori',
+	       'mk' => 'Macedonian',
+	       'ml' => 'Malayalam',
+	       'mn' => 'Mongolian',
+	       'mo' => 'Moldavian',
+	       'mr' => 'Marathi',
+	       'ms' => 'Malay',
+	       'mt' => 'Maltese',
+	       'my' => 'Burmese',
+
+	       'na' => 'Nauru',
+	       'ne' => 'Nepali',
+	       'nl' => 'Dutch',
+	       'no' => 'Norwegian',
+
+	       'oc' => 'Occitan',
+	       'om' => '(Afan) Oromo',
+	       'or' => 'Oriya',
+
+	       'pa' => 'Punjabi',
+	       'pl' => 'Polish',
+	       'ps' => 'Pashto, Pushto',
+	       'pt' => 'Portuguese',
+
+	       'qu' => 'Quechua',
+	       'rm' => 'Rhaeto-Romance',
+	       'rn' => 'Kirundi',
+	       'ro' => 'Romanian',
+	       'ru' => 'Russian',
+	       'rw' => 'Kinyarwanda',
+
+	       'sa' => 'Sanskrit',
+	       'sd' => 'Sindhi',
+	       'sg' => 'Sangro',
+	       'sh' => 'Serbo-Croatian',
+	       'si' => 'Singhalese',
+	       'sk' => 'Slovak',
+	       'sl' => 'Slovenian',
+	       'sm' => 'Samoan',
+	       'sn' => 'Shona',
+	       'so' => 'Somali',
+	       'sq' => 'Albanian',
+	       'sr' => 'Serbian',
+	       'ss' => 'Siswati',
+	       'st' => 'Sesotho',
+	       'su' => 'Sudanese',
+	       'sv' => 'Swedish',
+	       'sw' => 'Swahili',
+
+	       'ta' => 'Tamil',
+	       'te' => 'Tegulu',
+	       'tg' => 'Tajik',
+	       'th' => 'Thai',
+	       'ti' => 'Tigrinya',
+	       'tk' => 'Turkmen',
+	       'tl' => 'Tagalog',
+	       'tn' => 'Setswana',
+	       'to' => 'Tonga',
+	       'tr' => 'Turkish',
+	       'ts' => 'Tsonga',
+	       'tt' => 'Tatar',
+	       'tw' => 'Twi',
+
+	       'uk' => 'Ukrainian',
+	       'ur' => 'Urdu',
+	       'uz' => 'Uzbek',
+
+	       'vi' => 'Vietnamese',
+	       'vo' => 'Volapuk',
+
+	       'wo' => 'Wolof',
+
+	       'xh' => 'Xhosa',
+
+	       'yo' => 'Yoruba',
+
+	       'zh' => 'Chinese',
+	       'zu' => 'Zulu'
+	       );
+
+%toiso639 = (
+	     'afar' => 'aa',
+	     'abkhazian' => 'ab',
+	     'afrikaans' => 'af',
+	     'amharic' => 'am',
+	     'arabic' => 'ar',
+	     'assamese' => 'as',
+	     'aymara' => 'ay',
+	     'azerbaijani' => 'az',
+
+	     'bashkir' => 'ba',
+	     'byelorussian' => 'be',
+	     'bulgarian' => 'bg',
+	     'bihari' => 'bh',
+	     'bislama' => 'bi',
+	     'bengali' => 'bn',
+	     'bangla' => 'bn',
+	     'tibetan' => 'bo',
+	     'breton' => 'br',
+
+	     'catalan' => 'ca',
+	     'corsican' => 'co',
+	     'czech' => 'cs',
+	     'welsh' => 'cy',
+
+	     'danish' => 'da',
+	     'german' => 'de',
+	     'bhutani' => 'dz',
+
+	     'greek' => 'el',
+	     'english' => 'en',
+	     'esperanto' => 'eo',
+	     'spanish' => 'es',
+	     'estonian' => 'et',
+	     'basque' => 'eu',
+
+	     'persian' => 'fa',
+	     'finnish' => 'fi',
+	     'fiji' => 'fj',
+	     'faroese' => 'fo',
+	     'french' => 'fr',
+	     'frisian' => 'fy',
+
+	     'irish' => 'ga',
+	     'scots_gaelic' => 'gd',
+	     'galician' => 'gl',
+	     'guarani' => 'gn',
+	     'gujarati' => 'gu',
+
+	     'hausa' => 'ha',
+	     'hindi' => 'hi',
+	     'croatian' => 'hr',
+	     'hungarian' => 'hu',
+	     'armenian' => 'hy',
+
+	     'interlingua' => 'ia',
+	     'interlingue' => 'ie',
+	     'inupiak' => 'ik',
+	     'indonesian' => 'in',
+	     'icelandic' => 'is',
+	     'italian' => 'it',
+	     'hebrew' => 'iw',
+
+	     'japanese' => 'ja',
+	     'yiddish' => 'ji',
+	     'javanese' => 'jw',
+
+	     'georgian' => 'ka',
+	     'kazakh' => 'kk',
+	     'greenlandic' => 'kl',
+	     'cambodian' => 'km',
+	     'kannada' => 'kn',
+	     'korean' => 'ko',
+	     'kashmiri' => 'ks',
+	     'kurdish' => 'ku',
+	     'kirghiz' => 'ky',
+
+	     'latin' => 'la',
+	     'lingala' => 'ln',
+	     'laothian' => 'lo',
+	     'lithuanian' => 'lt',
+	     'latvian' => 'lv',
+	     'lettish' => 'lv',
+
+	     'malagasy' => 'mg',
+	     'maori' => 'mi',
+	     'macedonian' => 'mk',
+	     'malayalam' => 'ml',
+	     'mongolian' => 'mn',
+	     'moldavian' => 'mo',
+	     'marathi' => 'mr',
+	     'malay' => 'ms',
+	     'maltese' => 'mt',
+	     'burmese' => 'my',
+
+	     'nauru' => 'na',
+	     'nepali' => 'ne',
+	     'dutch' => 'nl',
+	     'norwegian' => 'no',
+
+	     'occitan' => 'oc',
+	     '(afan)_oromo' => 'om',
+	     'oriya' => 'or',
+
+	     'punjabi' => 'pa',
+	     'polish' => 'pl',
+	     'pashto' => 'ps',
+	     'pushto' => 'ps',
+	     'portuguese' => 'pt',
+
+	     'quechua' => 'qu',
+
+	     'rhaeto-romance' => 'rm',
+	     'kirundi' => 'rn',
+	     'romanian' => 'ro',
+	     'russian' => 'ru',
+	     'kinyarwanda' => 'rw',
+	     
+	     'sanskrit' => 'sa',
+	     'sindhi' => 'sd',
+	     'sangro' => 'sg',
+	     'serbo-croatian' => 'sh',
+	     'singhalese' => 'si',
+	     'slovak' => 'sk',
+	     'slovenian' => 'sl',
+	     'samoan' => 'sm',
+	     'shona' => 'sn',
+	     'somali' => 'so',
+	     'albanian' => 'sq',
+	     'serbian' => 'sr',
+	     'siswati' => 'ss',
+	     'sesotho' => 'st',
+	     'sudanese' => 'su',
+	     'swedish' => 'sv',
+	     'swahili' => 'sw',
+
+	     'tamil' => 'ta',
+	     'tegulu' => 'te',
+	     'tajik' => 'tg',
+	     'thai' => 'th',
+	     'tigrinya' => 'ti',
+	     'turkmen' => 'tk',
+	     'tagalog' => 'tl',
+	     'setswana' => 'tn',
+	     'tonga' => 'to',
+	     'turkish' => 'tr',
+	     'tsonga' => 'ts',
+	     'tatar' => 'tt',
+	     'twi' => 'tw',
+
+	     'ukrainian' => 'uk',
+	     'urdu' => 'ur',
+	     'uzbek' => 'uz',
+
+	     'vietnamese' => 'vi',
+	     'volapuk' => 'vo',
+
+	     'wolof' => 'wo',
+	     
+	     'xhosa' => 'xh',
+
+	     'yoruba' => 'yo',
+
+	     'chinese' => 'zh',
+	     'zul' => 'zu',
+	     );
Index: /main/tags/2.38/gsdl/perllib/lang.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/lang.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/lang.pm	(revision 21083)
@@ -0,0 +1,201 @@
+###########################################################################
+#
+# lang.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 module translates language descriptions to and from
+# the ISO 639 standard
+
+package lang;
+
+@trans = (["ab", "Abkhazian"],      ["om", "Afan Oromo"],
+	  ["om", "Oromo"],          ["aa", "Afar"],
+	  ["af", "Afrikaans"],      ["sq", "Albanian"],
+	  ["am", "Amharic"],        ["ar", "Arabic"],
+	  ["hy", "Armenian"],       ["as", "Assamese"],
+	  ["ay", "Aymara"],         ["az", "Azerbaijani"],
+
+	  ["ba", "Bashkir"],        ["eu", "Basque"],
+	  ["bn", "Bengali"],        ["bn", "Bangla"],
+	  ["dz", "Bhutani"],        ["bh", "Bihari"],
+	  ["bi", "Bislama"],        ["br", "Breton"],
+	  ["bg", "Bulgarian"],      ["my", "Burmese"],
+	  ["be", "Byelorussian"],
+
+	  ["km", "Cambodian"],      ["ca", "Catalan"],
+	  ["zh", "Chinese"],        ["co", "Corsican"],
+	  ["hr", "Croatian"],       ["cs", "Czech"],
+
+	  ["da", "Danish"],         ["nl", "Dutch"],
+
+	  ["en", "English"],        ["eo", "Esperanto"],
+	  ["et", "Estonian"],       ["fo", "Faroese"],
+	  ["fj", "Fijian"],         ["fi", "Finnish"],
+	  ["fr", "French"],         ["fy", "Frisian"],
+
+	  ["gl", "Galician"],       ["ka", "Georgian"],
+	  ["de", "German"],         ["el", "Greek"],
+	  ["kl", "Greenlandic"],    ["gn", "Guarani"],
+	  ["gu", "Gujarati"],
+
+	  ["ha", "Hausa"],          ["iw", "Hebrew"],
+	  ["hi", "Hindi"],          ["hu", "Hungarian"],
+
+	  ["is", "Icelandic"],      ["in", "Indonesian"],
+	  ["ia", "Interlingua"],    ["ie", "Interlingue"],
+	  ["ik", "Inupiak"],        ["ga", "Irish"],
+	  ["it", "Italian"],
+
+	  ["ja", "Japanese"],       ["jv", "Javanese"],
+
+	  ["kn", "Kannada"],        ["ks", "Kashmiri"],
+	  ["kk", "Kazakh"],         ["rw", "Kinyarwanda"],
+	  ["ky", "Kirghiz"],        ["rn", "Kirundi"],
+	  ["ko", "Korean"],         ["ku", "Kurdish"],
+
+	  ["lo", "Laothian"],       ["la", "Latin"],
+	  ["lv", "Latvian"],        ["lv", "Lettish"],
+	  ["ln", "Lingala"],        ["lt", "Lithuanian"],
+
+	  ["mk", "Macedonian"],     ["mg", "Malagasy"],
+	  ["ms", "Malay"],          ["ml", "Malayalam"],
+	  ["mt", "Maltese"],        ["mi", "Maori"],
+	  ["mr", "Marathi"],        ["mo", "Moldavian"],
+	  ["mn", "Mongolian"],
+
+	  ["na", "Nauru"],          ["ne", "Nepali"],
+	  ["no", "Norwegian"],
+
+	  ["oc", "Occitan"],        ["or", "Oriya"],
+
+	  ["ps", "Pashto"],         ["ps", "Pushto"],
+	  ["fa", "Persian"],        ["pl", "Polish"],
+	  ["pt", "Portuguese"],     ["pa", "Punjabi"],
+
+	  ["qu", "Quechua"],
+
+	  ["rm", "Rhaeto-Romance"], ["ro", "Romanian"],
+	  ["ru", "Russian"],
+
+	  ["sm", "Samoan"],         ["sg", "Sangho"],
+	  ["sa", "Sanskrit"],       ["gd", "Scots Gaelic"],
+	  ["sr", "Serbian"],        ["sh", "Serbo-Croatian"],
+	  ["st", "Sesotho"],        ["tn", "Setswana"],
+	  ["sn", "Shona"],          ["sd", "Sindhi"],
+	  ["si", "Singhalese"],     ["ss", "Siswati"],
+	  ["sk", "Slovak"],         ["sl", "Slovenian"],
+	  ["so", "Somali"],         ["es", "Spanish"],
+	  ["su", "Sundanese"],      ["sw", "Swahili"],
+	  ["sv", "Swedish"],
+
+	  ["tl", "Tagalog"],        ["tg", "Tajik"],
+	  ["ta", "Tamil"],          ["tt", "Tatar"],
+	  ["te", "Telugu"],         ["th", "Thai"],
+	  ["bo", "Tibetan"],        ["ti", "Tigrinya"],
+	  ["to", "Tonga"],          ["ts", "Tsonga"],
+	  ["tr", "Turkish"],        ["tk", "Turkmen"],
+	  ["tw", "Twi"],
+
+	  ["uk", "Ukrainian"],      ["ur", "Urdu"],
+	  ["uz", "Uzbek"],
+
+	  ["vi", "Vietnamese"],     ["vo", "Volapuk"],
+
+	  ["cy", "Welsh"],          ["wo", "Wolof"],
+
+	  ["xh", "Xhosa"],
+
+	  ["ji", "Yiddish"],        ["yo", "Yoruba"],
+
+	  ["zu", "Zulu"]);
+
+
+sub one_english_to_iso639 {
+    my ($english) = @_;
+    my $iso639 = "";
+
+    foreach $lang (@trans) {
+	my $code = $lang->[0];
+	my $enname = $lang->[1];
+	if ($english =~ /\s*($code|$enname)\s*$/i) {
+	    # found the language
+	    $iso639 = $code;
+	    last;
+
+	}
+    }
+
+    return $iso639;
+}
+
+
+sub english_to_iso639 {
+    my ($englishlist) = @_;
+    my ($english);
+
+    my @englishlist = split (",", $englishlist);
+    my @iso639list = ();
+
+    foreach $english (@englishlist) {
+	push (@iso639list, &one_english_to_iso639($english));
+    }
+
+    return join (",", @iso639list);
+}
+
+
+sub one_iso639_to_english {
+    my ($iso639) = @_;
+    my $english = "";
+
+    foreach $lang (@trans) {
+	my $code = $lang->[0];
+	my $enname = $lang->[1];
+	if ($iso639 =~ /\s*($code|$enname)\s*$/i) {
+	    # found the language
+	    $english = $enname;
+	    last;
+
+	}
+    }
+
+    return $enname;
+}
+
+
+sub iso639_to_english {
+    my ($iso639list) = @_;
+    my ($iso639);
+
+    my @iso639list = split (",", $iso639list);
+    my @englishlist = ();
+
+    foreach $iso639 (@iso639list) {
+	push (@englishlist, &one_iso639_to_english($iso639));
+    }
+
+    return join (",", @englishlist);
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/mgbuilder.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/mgbuilder.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/mgbuilder.pm	(revision 21083)
@@ -0,0 +1,864 @@
+###########################################################################
+#
+# mgbuilder.pm -- MGBuilder object
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package mgbuilder;
+
+use classify;
+use cfgread;
+use colcfg;
+use plugin;
+use util;
+use FileHandle;
+
+BEGIN {
+    # set autoflush on for STDERR and STDOUT so that mg
+    # doesn't get out of sync with plugins
+    STDOUT->autoflush(1);
+    STDERR->autoflush(1);
+}
+
+END {
+    STDOUT->autoflush(0);
+    STDERR->autoflush(0);
+}
+
+$maxdocsize = 12000;
+
+%wanted_index_files = ('td'=>1,
+		       't'=>1,
+		       'idb'=>1,
+		       'ib1'=>1,
+		       'ib2'=>1,
+		       'ib3'=>1,
+		       'i'=>1,
+		       'ip'=>1,
+		       'tiw'=>1,
+		       'wa'=>1);
+
+
+sub new {
+    my ($class, $collection, $source_dir, $build_dir, $verbosity, 
+	$maxdocs, $debug, $keepold, $allclassifications, 
+	$outhandle, $no_text, $failhandle) = @_;
+
+    $outhandle = STDERR unless defined $outhandle;
+    $no_text = 0 unless defined $no_text;
+    $failhandle = STDERR unless defined $failhandle;
+
+    # create an mgbuilder object
+    my $self = bless {'collection'=>$collection,
+		      'source_dir'=>$source_dir,
+		      'build_dir'=>$build_dir,
+		      'verbosity'=>$verbosity,
+		      'maxdocs'=>$maxdocs,
+		      'debug'=>$debug,
+		      'keepold'=>$keepold,
+		      'allclassifications'=>$allclassifications,
+		      'outhandle'=>$outhandle,
+		      'no_text'=>$no_text,
+		      'failhandle'=>$failhandle,
+		      'notbuilt'=>[]    # indexes not built
+		      }, $class;
+
+
+    # read in the collection configuration file
+    my $colcfgname = "$ENV{'GSDLCOLLECTDIR'}/etc/collect.cfg";
+    if (!-e $colcfgname) {
+	die "mgbuilder::new - couldn't find collect.cfg for collection $collection\n";
+    }
+    $self->{'collect_cfg'} = &colcfg::read_collect_cfg ($colcfgname);
+
+    # sort out subcollection indexes
+    if (defined $self->{'collect_cfg'}->{'indexsubcollections'}) {
+	my $indexes = $self->{'collect_cfg'}->{'indexes'};
+	$self->{'collect_cfg'}->{'indexes'} = [];
+	foreach $subcollection (@{$self->{'collect_cfg'}->{'indexsubcollections'}}) {
+	    foreach $index (@$indexes) {
+		push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$subcollection");
+	    }
+	}
+    }
+
+    # sort out language subindexes
+    if (defined $self->{'collect_cfg'}->{'languages'}) {
+	my $indexes = $self->{'collect_cfg'}->{'indexes'};
+	$self->{'collect_cfg'}->{'indexes'} = [];
+	foreach $language (@{$self->{'collect_cfg'}->{'languages'}}) {
+	    foreach $index (@$indexes) {
+		if (defined ($self->{'collect_cfg'}->{'indexsubcollections'})) {
+		    push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$language");
+		}
+		else { # add in an empty subcollection field
+		    push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index\:\:$language");
+		}
+	    }
+	}
+    }
+
+    # make sure that the same index isn't specified more than once
+    my %tmphash = ();
+    my @tmparray = @{$self->{'collect_cfg'}->{'indexes'}};
+    $self->{'collect_cfg'}->{'indexes'} = [];
+    foreach my $i (@tmparray) {
+	if (!defined ($tmphash{$i})) {
+	    push (@{$self->{'collect_cfg'}->{'indexes'}}, $i);
+	    $tmphash{$i} = 1;
+	}
+    }
+
+    # get the list of plugins for this collection
+    my $plugins = [];
+    if (defined $self->{'collect_cfg'}->{'plugin'}) {
+	$plugins = $self->{'collect_cfg'}->{'plugin'};
+    }
+    
+    # load all the plugins
+    $self->{'pluginfo'} = &plugin::load_plugins ($plugins, $verbosity, $outhandle, $failhandle);
+    if (scalar(@{$self->{'pluginfo'}}) == 0) {
+	print $outhandle "No plugins were loaded.\n";
+	die "\n";
+    }
+
+    # get the list of classifiers for this collection
+    my $classifiers = [];
+    if (defined $self->{'collect_cfg'}->{'classify'}) {
+	$classifiers = $self->{'collect_cfg'}->{'classify'};
+    }
+    
+    # load all the classifiers
+    $self->{'classifiers'} = &classify::load_classifiers ($classifiers, $build_dir, $outhandle);
+
+    # load up any dontgdbm fields
+    $self->{'dontgdbm'} = {};
+    if (defined ($self->{'collect_cfg'}->{'dontgdbm'})) {
+	foreach $dg (@{$self->{'collect_cfg'}->{'dontgdbm'}}) {
+	    $self->{'dontgdbm'}->{$dg} = 1;
+	}
+    }
+
+    # load up the document processor for building
+    # if a buildproc class has been created for this collection, use it
+    # otherwise, use the mg buildproc
+    my ($buildprocdir, $buildproctype);
+    if (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/${collection}buildproc.pm") {
+	$buildprocdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildproctype = "${collection}buildproc";
+    } else {
+	$buildprocdir = "$ENV{'GSDLHOME'}/perllib";
+	$buildproctype = "mgbuildproc";
+    }
+    require "$buildprocdir/$buildproctype.pm";
+
+    eval("\$self->{'buildproc'} = new $buildproctype(\$collection, " .
+	 "\$source_dir, \$build_dir, \$verbosity, \$outhandle)");
+    die "$@" if $@;
+
+    return $self;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    if (!$self->{'debug'} && !$self->{'keepold'}) {
+	# remove any old builds
+	&util::rm_r($self->{'build_dir'});
+	&util::mk_all_dir($self->{'build_dir'});
+        
+	# make the text directory
+	my $textdir = "$self->{'build_dir'}/text";
+	&util::mk_all_dir($textdir);
+    }
+}
+
+sub compress_text {
+    my $self = shift (@_);
+    my ($textindex) = @_;
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mg_passes_exe = &util::filename_cat($exedir, "mg_passes$exe");
+    my $mg_compression_dict_exe = &util::filename_cat($exedir, "mg_compression_dict$exe");
+    my $outhandle = $self->{'outhandle'};
+
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, "text"));
+    my $basefilename = "text/$self->{'collection'}";
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, $basefilename);
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fulltextprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+    }
+
+    print $outhandle "\n*** creating the compressed text\n" if ($self->{'verbosity'} >= 1);
+
+    # collect the statistics for the text
+    # -b $maxdocsize sets the maximum document size to be 12 meg
+    print $outhandle "\n    collecting text statistics\n"  if ($self->{'verbosity'} >= 1);
+
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$mg_passes_exe" || 
+	    !open (PIPEOUT, "| mg_passes$exe -f \"$fulltextprefix\" -b $maxdocsize -T1 $osextra")) {
+	    die "mgbuilder::compress_text - couldn't run $mg_passes_exe\n";
+	}
+	$handle = mgbuilder::PIPEOUT;
+    }
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($textindex);
+    $self->{'buildproc'}->set_indexing_text (0);
+    if ($self->{'no_text'}) {
+	$self->{'buildproc'}->set_store_text(0);
+    } else {
+	$self->{'buildproc'}->set_store_text(1);
+    }
+    $self->{'buildproc'}->reset();
+    &plugin::begin($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::end($self->{'pluginfo'});
+
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # create the compression dictionary
+    # the compression dictionary is built by assuming the stats are from a seed
+    # dictionary (-S), if a novel word is encountered it is spelled out (-H),
+    # and the resulting dictionary must be less than 5 meg with the most frequent
+    # words being put into the dictionary first (-2 -k 5120)
+    if (!$self->{'debug'}) {
+	print $outhandle "\n    creating the compression dictionary\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mg_compression_dict_exe") {
+	    die "mgbuilder::compress_text - couldn't run $mg_compression_dict_exe\n";
+	}
+	system ("mg_compression_dict$exe -f \"$fulltextprefix\" -S -H -2 -k 5120 $osextra");
+
+	# -b $maxdocsize sets the maximum document size to be 12 meg
+	if (!-e "$mg_passes_exe" || 
+	    !open ($handle, "| mg_passes$exe -f \"$fulltextprefix\" -b $maxdocsize -T2 $osextra")) {
+	    die "mgbuilder::compress_text - couldn't run $mg_passes_exe\n";
+	}
+    }
+
+    $self->{'buildproc'}->reset();
+    # compress the text
+    print $outhandle "\n    compressing the text\n"  if ($self->{'verbosity'} >= 1);
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+}
+
+sub want_built {
+    my $self = shift (@_);
+    my ($index) = @_;
+
+    if (defined ($self->{'collect_cfg'}->{'dontbuild'})) {
+	foreach $checkstr (@{$self->{'collect_cfg'}->{'dontbuild'}}) {
+	    if ($index =~ /^$checkstr$/) {
+		push (@{$self->{'notbuilt'}}, $self->{'index_mapping'}->{$index});
+		return 0;
+	    }
+	}
+    }
+
+    return 1;
+}
+
+sub build_indexes {
+    my $self = shift (@_);
+    my ($indexname) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $indexes = [];
+    if (defined $indexname && $indexname =~ /\w/) {
+	push @$indexes, $indexname;
+    } else {
+	$indexes = $self->{'collect_cfg'}->{'indexes'};
+    }
+
+    # create the mapping between the index descriptions 
+    # and their directory names
+    $self->{'index_mapping'} = $self->create_index_mapping ($indexes);
+
+    # build each of the indexes
+    foreach $index (@$indexes) {
+	if ($self->want_built($index)) {
+	    print $outhandle "\n*** building index $index in subdirectory " . 
+		"$self->{'index_mapping'}->{$index}\n" if ($self->{'verbosity'} >= 1);
+	    $self->build_index($index);
+	} else {
+	    print $outhandle "\n*** ignoring index $index\n" if ($self->{'verbosity'} >= 1);
+	}
+    }
+}
+
+# creates directory names for each of the index descriptions
+sub create_index_mapping {
+    my $self = shift (@_);
+    my ($indexes) = @_;
+
+    my %mapping = ();
+    $mapping{'indexmaporder'} = [];
+    $mapping{'subcollectionmaporder'} = [];
+    $mapping{'languagemaporder'} = [];
+    
+    # dirnames is used to check for collisions. Start this off
+    # with the manditory directory names
+    my %dirnames = ('text'=>'text',
+		    'extra'=>'extra');
+    my %pnames = ('index' => '', 'subcollection' => '', 'languages' => '');
+
+    foreach $index (@$indexes) {
+	my ($level, $gran, $subcollection, $languages) = split (":", $index);
+
+	# the directory name starts with the first character of the index level
+	my ($pindex) = $level =~ /^(.)/;
+
+	# next comes a processed version of the index
+	$pindex .= $self->process_field ($gran); 
+	$pindex = lc ($pindex);
+
+	# next comes a processed version of the subcollection if there is one.
+	my $psub = $self->process_field ($subcollection);
+	$psub = lc ($psub);
+
+	# next comes a processed version of the language if there is one.
+	my $plang = $self->process_field ($languages);
+	$plang = lc ($plang);
+
+	my $dirname = $pindex . $psub . $plang;
+
+	# check to be sure all index names are unique
+	while (defined ($dirnames{$dirname})) {
+	    $dirname = $self->make_unique (\%pnames, $index, \$pindex, \$psub, \$plang);
+	}
+	$mapping{$index} = $dirname;
+
+	# store the mapping orders as well as the maps
+	# also put index, subcollection and language fields into the mapping thing - 
+	# (the full index name (eg document:text:subcol:lang) is not used on
+	# the query page) -these are used for collectionmeta later on
+	if (!defined $mapping{'indexmap'}{"$level:$gran"}) {
+	    $mapping{'indexmap'}{"$level:$gran"} = $pindex;
+	    push (@{$mapping{'indexmaporder'}}, "$level:$gran");
+	    if (!defined $mapping{"$level:$gran"}) {
+		$mapping{"$level:$gran"} = $pindex;
+	    }
+	}
+	if ($psub =~ /\w/ && !defined ($mapping{'subcollectionmap'}{$subcollection})) {
+	    $mapping{'subcollectionmap'}{$subcollection} = $psub;
+	    push (@{$mapping{'subcollectionmaporder'}}, $subcollection);
+	    $mapping{$subcollection} = $psub;
+	}
+	if ($plang =~ /\w/ && !defined ($mapping{'languagemap'}{$languages})) {
+	    $mapping{'languagemap'}{$languages} = $plang;
+	    push (@{$mapping{'languagemaporder'}}, $languages);
+	    $mapping{$languages} = $plang;
+	}
+	$dirnames{$dirname} = $index;
+	$pnames{'index'}{$pindex} = "$level:$gran";
+	$pnames{'subcollection'}{$psub} = $subcollection;
+	$pnames{'languages'}{$plang} = $languages;
+    }
+
+    return \%mapping;
+}
+
+# returns a processed version of a field.
+# if the field has only one component the processed
+# version will contain the first character and next consonant
+# of that componant - otherwise it will contain the first 
+# character of the first two components 
+sub process_field {
+    my $self = shift (@_);
+    my ($field) = @_;
+ 
+    return "" unless (defined ($field) && $field =~ /\w/);
+
+    my @components = split /,/, $field;
+    if (scalar @components >= 2) {
+	splice (@components, 2);
+	map {s/^(.).*$/$1/;} @components;
+	return join("", @components);
+    } else {
+	my ($a, $b) = $field =~ /^(.).*?([bcdfghjklmnpqrstvwxyz])/i;
+	($a, $b) = $field =~ /^(.)(.)/ unless defined $a && defined $b;
+	return "$a$b";
+    }
+}
+
+sub make_unique {
+    my $self = shift (@_);
+    my ($namehash, $index, $indexref, $subref, $langref) = @_;
+    my ($level, $gran, $subcollection, $languages) = split (":", $index);
+
+    if ($namehash->{'index'}->{$$indexref} ne "$level:$gran") {
+	$self->get_next_version ($indexref);
+    } elsif ($namehash->{'subcollection'}->{$$subref} ne $subcollection) {
+	$self->get_next_version ($subref);
+    } elsif ($namehash->{'languages'}->{$$langref} ne $languages) {
+	$self->get_next_version ($langref);
+    }
+    return "$$indexref$$subref$$langref";
+}	
+
+sub get_next_version {
+    my $self = shift (@_);
+    my ($nameref) = @_;
+
+    if ($$nameref =~ /(\d\d)$/) {
+	my $num = $1; $num ++;
+	$$nameref =~ s/\d\d$/$num/;
+    } elsif ($$nameref =~ /(\d)$/) {
+	my $num = $1;
+	if ($num == 9) {$$nameref =~ s/\d\d$/10/;}
+	else {$num ++; $$nameref =~ s/\d$/$num/;}
+    } else {
+	$$nameref =~ s/.$/0/;
+    }
+}
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the full index directory path and make sure it exists
+    my $indexdir = $self->{'index_mapping'}->{$index};
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, $indexdir));
+    my $fullindexprefix = &util::filename_cat ($self->{'build_dir'}, $indexdir, 
+					       $self->{'collection'});
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, "text", 
+					       $self->{'collection'});
+
+    # get any os specific stuff
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mg_passes_exe = &util::filename_cat($exedir, "mg_passes$exe");
+    my $mg_perf_hash_build_exe = 
+	&util::filename_cat($exedir, "mg_perf_hash_build$exe");
+    my $mg_weights_build_exe = 
+	&util::filename_cat ($exedir, "mg_weights_build$exe");
+    my $mg_invf_dict_exe = 
+	&util::filename_cat ($exedir, "mg_invf_dict$exe");
+    my $mg_stem_idx_exe =
+	&util::filename_cat ($exedir, "mg_stem_idx$exe");
+
+    my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fullindexprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+	if ($outhandle ne "STDERR") {
+	    # so mg_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+
+    # get the index level from the index description
+    # the index will be level 2 unless we are building a
+    # paragraph level index
+    my $index_level = 2;
+    $index_level = 3 if $index =~ /^paragraph/i;
+
+    # get the index expression if this index belongs
+    # to a subcollection
+    my $indexexparr = [];
+
+    # there may be subcollection info, and language info. 
+    my ($level, $fields, $subcollection, $language) = split (":", $index);
+    my @subcollections = ();
+    @subcollections = split /,/, $subcollection if (defined $subcollection);
+
+    foreach $subcollection (@subcollections) {
+	if (defined ($self->{'collect_cfg'}->{'subcollection'}->{$subcollection})) {
+	    push (@$indexexparr, $self->{'collect_cfg'}->{'subcollection'}->{$subcollection});
+	} 
+    }
+    
+    # add expressions for languages if this index belongs to
+    # a language subcollection - only put languages expressions for the 
+    # ones we want in the index
+
+    my @languages = ();
+    @languages = split /,/, $language if (defined $language);
+    foreach $language (@languages) {
+	my $not=0;
+	if ($language =~ s/^\!//) {
+	    $not = 1;
+	}
+	foreach $lang (@{$self->{'collect_cfg'}->{'languages'}}) {
+	    if ($lang eq $language) {
+		if($not) {
+		    push (@$indexexparr, "!Language/$language/");
+		} else {
+		    push (@$indexexparr, "Language/$language/");
+		}
+		last;
+	    }
+	}
+    }
+
+    # Build index dictionary. Uses verbatim stem method
+    print $outhandle "\n    creating index dictionary\n"  if ($self->{'verbosity'} >= 1);
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$mg_passes_exe" || 
+	    !open (PIPEOUT, "| mg_passes$exe -f \"$fullindexprefix\" -b $maxdocsize " .
+		   "-$index_level -m 32 -s 0 -G -t 10 -N1 $osextra")) {
+	    die "mgbuilder::build_index - couldn't run $mg_passes_exe\n";
+	}
+	$handle = mgbuilder::PIPEOUT;
+    }
+	
+    # set up the document processor
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($index, $indexexparr);
+    $self->{'buildproc'}->set_indexing_text (1);
+    $self->{'buildproc'}->set_store_text(1);
+
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    if (!$self->{'debug'}) {
+	# create the perfect hash function
+	if (!-e "$mg_perf_hash_build_exe") {
+	    die "mgbuilder::build_index - couldn't run $mg_perf_hash_build_exe\n";
+	}
+	system ("mg_perf_hash_build$exe -f \"$fullindexprefix\" $osextra");
+
+	if (!-e "$mg_passes_exe" || 
+	    !open ($handle, "| mg_passes$exe -f \"$fullindexprefix\" -b $maxdocsize " .
+		   "-$index_level -c 3 -G -t 10 -N2 $osextra")) {
+	    die "mgbuilder::build_index - couldn't run $mg_passes_exe\n";
+	}
+    }
+    
+    # invert the text
+    print $outhandle "\n    inverting the text\n"  if ($self->{'verbosity'} >= 1);
+
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+
+    $self->print_stats ();
+
+    if (!$self->{'debug'}) {
+
+	close ($handle);
+	
+	# create the weights file
+	print $outhandle "\n    create the weights file\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mg_weights_build_exe") {
+	    die "mgbuilder::build_index - couldn't run $mg_weights_build_exe\n";
+	}
+	system ("mg_weights_build$exe -f \"$fullindexprefix\" -t \"$fulltextprefix\" $osextra");
+
+	# create 'on-disk' stemmed dictionary
+	print $outhandle "\n    creating 'on-disk' stemmed dictionary\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mg_invf_dict_exe") {
+	    die "mgbuilder::build_index - couldn't run $mg_invf_dict_exe\n";
+	}
+	system ("mg_invf_dict$exe -f \"$fullindexprefix\" $osextra");
+
+
+	# creates stem index files for the various stemming methods
+	print $outhandle "\n    creating stem indexes\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mg_stem_idx_exe") {
+	    die "mgbuilder::build_index - couldn't run $mg_stem_idx_exe\n";
+	}
+	system ("mg_stem_idx$exe -b 4096 -s1 -f \"$fullindexprefix\" $osextra");
+	system ("mg_stem_idx$exe -b 4096 -s2 -f \"$fullindexprefix\" $osextra");
+	system ("mg_stem_idx$exe -b 4096 -s3 -f \"$fullindexprefix\" $osextra");
+    
+	# remove unwanted files
+	my $tmpdir = &util::filename_cat ($self->{'build_dir'}, $indexdir);
+	opendir (DIR, $tmpdir) || die
+	    "mgbuilder::build_index - couldn't read directory $tmpdir\n";
+	foreach $file (readdir(DIR)) {
+	    next if $file =~ /^\./;
+	    my ($suffix) = $file =~ /\.([^\.]+)$/;
+	    if (defined $suffix && !defined $wanted_index_files{$suffix}) {
+		# delete it!
+		print $outhandle "deleting $file\n" if $self->{'verbosity'} > 2;
+		&util::rm (&util::filename_cat ($tmpdir, $file));
+	    }
+	}
+	closedir (DIR);
+    }
+}
+
+sub make_infodatabase {
+    my $self = shift (@_);
+    my $outhandle = $self->{'outhandle'};
+
+    my $textdir = &util::filename_cat($self->{'build_dir'}, "text");
+    my $assocdir = &util::filename_cat($self->{'build_dir'}, "assoc");
+    &util::mk_all_dir ($textdir);
+    &util::mk_all_dir ($assocdir);
+
+    # get db name
+    my $dbext = ".bdb";
+    $dbext = ".ldb" if &util::is_little_endian();
+    my $fulldbname = &util::filename_cat ($textdir, "$self->{'collection'}$dbext");
+    $fulldbname =~ s/\//\\/g if ($ENV{'GSDLOS'} =~ /^windows$/i);
+
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $txt2db_exe = &util::filename_cat($exedir, "txt2db$exe");
+
+    print $outhandle "\n*** creating the info database and processing associated files\n" 
+	if ($self->{'verbosity'} >= 1);
+
+    # init all the classifiers
+    &classify::init_classifiers ($self->{'classifiers'});
+    
+
+    # set up the document processor
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$txt2db_exe" || !open (PIPEOUT, "| txt2db$exe \"$fulldbname\"")) {
+	    die "mgbuilder::make_infodatabase - couldn't run $txt2db_exe\n";
+	}
+	$handle = mgbuilder::PIPEOUT;
+    }
+    
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('infodb');
+    $self->{'buildproc'}->set_assocdir ($assocdir);
+    $self->{'buildproc'}->set_dontgdbm ($self->{'dontgdbm'});
+    $self->{'buildproc'}->set_classifiers ($self->{'classifiers'});
+    $self->{'buildproc'}->set_indexing_text (0);
+    $self->{'buildproc'}->set_store_text(1);
+    $self->{'buildproc'}->reset();
+   
+    if (defined $self->{'collect_cfg'}->{'collectionmeta'}) {
+	
+        if (!defined $self->{'index_mapping'}) {
+	    $self->{'index_mapping'} = 
+		$self->create_index_mapping ($self->{'collect_cfg'}->{'indexes'});
+	}
+	
+	print $handle "[collection]\n";
+     
+	foreach $cmeta (keys (%{$self->{'collect_cfg'}->{'collectionmeta'}})) {
+	    my $defaultfound=0;
+	    my $first=1;
+	    my $metadata_entry = "";
+	    my $default="";
+	    my $cmetamap = "";
+	    if ($cmeta =~ s/^\.//) {
+    		if (defined $self->{'index_mapping'}->{$cmeta}) {
+		    $cmetamap = $self->{'index_mapping'}->{$cmeta};
+		    $cmeta = ".$cmeta";
+		}
+		else {
+		    print $outhandle "mgbuilder: warning bad collectionmeta option '$cmeta' - ignored\n";
+		    next; #ignore this one
+		}
+	    }
+	    else {
+		$cmetamap = $cmeta; # just using the same name
+	    }
+	    #iterate through the languages
+	    foreach $lang (keys (%{$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}})) {
+		if ($first) {
+		    $first=0;
+		    #set the default default to the first entry
+		    $default=$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{$lang};
+		}
+		if ($lang =~ /default/) {
+		    $defaultfound=1;
+		    #the default entry goes first
+		    $metadata_entry = "<$cmetamap>" .
+			$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{'default'} . "\n" . $metadata_entry;
+		}
+		else {
+		    my ($l) = $lang =~ /^\[l=(\w*)\]$/;
+		    if ($l) {	      
+			$metadata_entry .= "<$cmetamap:$l>" . 
+			    $self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{$lang} . "\n";
+		    }
+		}
+	    }
+	    #if we haven't found a default, put one in
+	    if (!$defaultfound) {
+		$metadata_entry = "<$cmetamap>$default\n" . $metadata_entry;
+	    }
+	#write the entry to the file
+	print $handle $metadata_entry;
+
+	}
+	
+	print $handle "\n" . ('-' x 70) . "\n";
+	
+    }
+
+    
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    
+    # output classification information
+    &classify::output_classify_info ($self->{'classifiers'}, $handle,
+				     $self->{'allclassifications'});
+
+
+
+    #output doclist
+    my @doclist = $self->{'buildproc'}->get_doc_list();
+    my $docs = join (";",@doclist);
+    print $handle "[browselist]\n";
+    print $handle "<hastxt>0\n";
+    print $handle "<childtype>VList\n";
+    print $handle "<numleafdocs>" . ($#doclist+1) . "\n";
+    print $handle "<thistype>Invisible\n";
+    print $handle "<contains>$docs";
+    print $handle "\n" . ('-' x 70) . "\n";
+
+    close ($handle) if !$self->{'debug'};
+}
+
+sub collect_specific {
+    my $self = shift (@_);
+}
+
+sub make_auxiliary_files {
+    my $self = shift (@_);
+    my ($index);
+    my %build_cfg = ();
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "\n*** creating auxiliary files \n" if ($self->{'verbosity'} >= 1);
+
+    # get the text directory
+    &util::mk_all_dir ($self->{'build_dir'});
+
+    # store the build date
+    $build_cfg->{'builddate'} = time;
+
+    # store the number of documents and number of bytes
+    $build_cfg->{'numdocs'} = $self->{'buildproc'}->get_num_docs();
+    $build_cfg->{'numbytes'} = $self->{'buildproc'}->get_num_bytes();
+
+    # get additional stats from mg
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mgstat_exe = &util::filename_cat($exedir, "mgstat$exe");
+    my $input_file = &util::filename_cat ("text", $self->{'collection'});
+    if (!-e "$mgstat_exe" || !open (PIPEIN, "mgstat$exe -d \"$self->{'build_dir'}\" -f \"$input_file\" |")) {
+	print $outhandle "Warning: Couldn't open pipe to $mgstat_exe to get additional stats\n";
+    } else {
+	my $line = "";
+	while (defined ($line = <PIPEIN>)) {
+	    if ($line =~ /^Words in collection \[dict\]\s+:\s+(\d+)/) {
+		($build_cfg->{'numwords'}) = $1;
+	    } elsif ($line =~ /^Documents\s+:\s+(\d+)/) {
+		($build_cfg->{'numsections'}) = $1;
+	    }
+	}
+	close PIPEIN;
+    }
+
+    # store the mapping between the index names and the directory names
+    my @indexmap = ();
+    foreach $index (@{$self->{'index_mapping'}->{'indexmaporder'}}) {
+	push (@indexmap, "$index\-\>$self->{'index_mapping'}->{'indexmap'}->{$index}");
+    }
+    $build_cfg->{'indexmap'} = \@indexmap;
+
+    my @subcollectionmap = ();
+    foreach $subcollection (@{$self->{'index_mapping'}->{'subcollectionmaporder'}}) {
+	push (@subcollectionmap, "$subcollection\-\>" .
+	      $self->{'index_mapping'}->{'subcollectionmap'}->{$subcollection});
+    }
+    $build_cfg->{'subcollectionmap'} = \@subcollectionmap if scalar (@subcollectionmap);
+
+    my @languagemap = ();
+    foreach $language (@{$self->{'index_mapping'}->{'languagemaporder'}}) {
+	push (@languagemap, "$language\-\>" .
+	      $self->{'index_mapping'}->{'languagemap'}->{$language});
+    }
+    $build_cfg->{'languagemap'} = \@languagemap if scalar (@languagemap);
+
+    $build_cfg->{'notbuilt'} = $self->{'notbuilt'} if scalar @{$self->{'notbuilt'}};
+
+    # write out the build information
+    &cfgread::write_cfg_file("$self->{'build_dir'}/build.cfg", $build_cfg,
+			     '^(builddate|numdocs|numbytes|numwords|numsections)$', 
+                             '^(indexmap|subcollectionmap|languagemap|notbuilt)$');
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+}
+
+sub print_stats {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    my $indexing_text = $self->{'buildproc'}->get_indexing_text();
+    my $index = $self->{'buildproc'}->get_index();
+    my $num_bytes = $self->{'buildproc'}->get_num_bytes();
+    my $num_processed_bytes = $self->{'buildproc'}->get_num_processed_bytes();
+
+    if ($indexing_text) {
+	print $outhandle "Stats (Creating index $index)\n";
+    } else {
+	print $outhandle "Stats (Compressing text from $index)\n";
+    }
+    print $outhandle "Total bytes in collection: $num_bytes\n";
+    print $outhandle "Total bytes in $index: $num_processed_bytes\n";
+
+    if ($num_processed_bytes < 50 && ($indexing_text || !$self->{'no_text'})) {
+	print $outhandle "***************\n";
+	if ($indexing_text) {
+	    print $outhandle "WARNING: There is very little or no text to process for $index\n";
+	} elsif (!$self->{'no_text'}) {
+	    print $outhandle "WARNING: There is very little or no text to compress\n";
+	}
+	print $outhandle "         Was this your intention?\n";
+	print $outhandle "***************\n";
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/mgbuildproc.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/mgbuildproc.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/mgbuildproc.pm	(revision 21083)
@@ -0,0 +1,504 @@
+###########################################################################
+#
+# mgbuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 document processor outputs a document
+# for mg to process
+
+
+package mgbuildproc;
+
+use classify;
+use doc;
+use docproc;
+use util;
+
+BEGIN {
+    @ISA = ('docproc');
+}
+
+
+sub new {
+    my ($class, $collection, $source_dir, $build_dir,
+	$verbosity, $outhandle) = @_;
+    my $self = new docproc ();
+
+    # outhandle is where all the debugging info goes
+    # output_handle is where the output of the plugins is piped
+    # to (i.e. mg, gdbm etc.)
+    $outhandle = STDERR unless defined $outhandle;
+
+    $self->{'collection'} = $collection;
+    $self->{'source_dir'} = $source_dir;
+    $self->{'build_dir'} = $build_dir;
+    $self->{'verbosity'} = $verbosity;
+    $self->{'classifiers'} = [];
+    $self->{'mode'} = "text";
+    $self->{'assocdir'} = $build_dir;
+    $self->{'dontgdbm'} = {};
+    $self->{'index'} = "section:text";
+    $self->{'indexexparr'} = [];
+    $self->{'output_handle'} = "STDOUT";
+    $self->{'num_docs'} = 0;
+    $self->{'num_sections'} = 0;
+    $self->{'num_bytes'} = 0;
+    $self->{'num_processed_bytes'} = 0;
+    $self->{'store_text'} = 1;
+    $self->{'outhandle'} = $outhandle;
+    
+    #used by browse interface
+    $self->{'doclist'} = [];
+    
+    $self->{'indexing_text'} = 0;
+
+    return bless $self, $class;
+}
+
+sub reset {
+    my $self = shift (@_);
+    
+    $self->{'num_docs'} = 0;
+    $self->{'num_sections'} = 0;
+    $self->{'num_processed_bytes'} = 0;
+    $self->{'num_bytes'} = 0;
+}
+
+sub get_num_docs {
+    my $self = shift (@_);
+
+    return $self->{'num_docs'};
+}
+
+sub get_num_sections {
+    my $self = shift (@_);
+
+    return $self->{'num_sections'};
+}
+
+# num_bytes is the actual number of bytes in the collection
+# this is normally the same as what's processed during text compression
+sub get_num_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_bytes'};
+}
+
+# num_processed_bytes is the number of bytes actually passed
+# to mg for the current index
+sub get_num_processed_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_processed_bytes'};
+}
+
+sub set_output_handle {
+    my $self = shift (@_);
+    my ($handle) = @_;
+
+    $self->{'output_handle'} = $handle;
+}
+
+sub set_mode {
+    my $self = shift (@_);
+    my ($mode) = @_;
+
+    $self->{'mode'} = $mode;
+}
+
+sub set_assocdir {
+    my $self = shift (@_);
+    my ($assocdir) = @_;
+
+    $self->{'assocdir'} = $assocdir;
+}
+
+sub set_dontgdbm {
+    my $self = shift (@_);
+    my ($dontgdbm) = @_;
+
+    $self->{'dontgdbm'} = $dontgdbm;
+}
+
+sub set_index {
+    my $self = shift (@_);
+    my ($index, $indexexparr) = @_;
+
+    $self->{'index'} = $index;
+    $self->{'indexexparr'} = $indexexparr if defined $indexexparr;
+}
+
+sub get_index {
+    my $self = shift (@_);
+
+    return $self->{'index'};
+}
+
+sub set_classifiers {
+    my $self = shift (@_);
+    my ($classifiers) = @_;
+
+    $self->{'classifiers'} = $classifiers;
+}
+
+sub set_indexing_text {
+    my $self = shift (@_);
+    my ($indexing_text) = @_;
+
+    $self->{'indexing_text'} = $indexing_text;
+}
+
+sub get_indexing_text {
+    my $self = shift (@_);
+
+    return $self->{'indexing_text'};
+}
+
+sub set_store_text {
+    my $self = shift (@_);
+    my ($store_text) = @_;
+
+    $self->{'store_text'} = $store_text;
+}
+
+sub get_doc_list {
+    my $self = shift(@_);
+    
+    return @{$self->{'doclist'}};
+}
+
+
+sub process {
+    my $self = shift (@_);
+    my $method = $self->{'mode'};
+
+    $self->$method(@_);
+}
+
+# use 'Paged' if document has no more than 2 levels
+# and each section at second level has a number for
+# Title metadata
+sub get_document_type {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $thistype = "VList";
+    my $childtype = "VList";
+    my $title;
+    my @tmp = ();
+    
+    my $section = $doc_obj->get_top_section ();
+    my $first = 1;
+    while (defined $section) {
+	@tmp = split /\./, $section;
+	if (scalar(@tmp) > 1) {
+	    return ($thistype, $childtype);
+	}
+	if (!$first) {
+	    $title = $doc_obj->get_metadata_element ($section, "Title");
+	    if (!defined $title || $title !~ /^\d+$/) {
+		return ($thistype, $childtype);
+	    }
+	}
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+    }
+    if ($doc_obj->get_text_length ($doc_obj->get_top_section())) {
+	$thistype = "Paged";
+    } else {
+	$thistype = "Invisible";
+    }
+    $childtype = "Paged";
+    return ($thistype, $childtype);
+}
+
+sub assoc_files {
+    my $self = shift (@_);
+    my ($doc_obj, $archivedir) = @_;
+    my ($afile);
+    
+    foreach my $assoc_file (@{$doc_obj->get_assoc_files()}) {
+	# if assoc file contains directory structure of
+	# its own use it, otherwise use HASH... directory
+	if ($assoc_file->[1] =~ /[\/\\]/) {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $assoc_file->[1]);
+	} else {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $archivedir, $assoc_file->[1]);
+	}
+	&util::hard_link ($assoc_file->[0], $afile);
+    }
+}
+
+sub infodb {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+    my $handle = $self->{'output_handle'};
+#    $handle = "main::STDOUT";
+
+    my $doctype = $doc_obj->get_doc_type();
+
+    # only output this document if it is one to be indexed
+    return if ($doctype ne "indexed_doc");
+
+    my ($archivedir) = $filename =~ /^(.*?)(?:\/|\\)[^\/\\]*$/;
+    $archivedir = "" unless defined $archivedir;
+    $archivedir =~ s/\\/\//g;
+    $archivedir =~ s/^\/+//;
+    $archivedir =~ s/\/+$//;
+
+    $self->assoc_files ($doc_obj, $archivedir);
+
+    # this is another document
+    $self->{'num_docs'} += 1 unless ($doctype eq "classification");
+
+    # is this a paged or a hierarchical document
+    my ($thistype, $childtype) = $self->get_document_type ($doc_obj);
+
+    my $section = $doc_obj->get_top_section ();
+    my $doc_OID = $doc_obj->get_OID();
+    my $first = 1;
+    my $url = "";
+    while (defined $section) {
+	# update a few statistics
+	$self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	$self->{'num_sections'} += 1 unless ($doctype eq "classification");
+
+	# output the section name
+	if ($section eq "") { print $handle "[$doc_OID]\n"; }
+	else { print $handle "[$doc_OID.$section]\n"; }
+
+	# output the fact that this document is a document (unless doctype
+	# has been set to something else from within a plugin
+	my $dtype = $doc_obj->get_metadata_element ($section, "doctype");
+	if (!defined $dtype || $dtype !~ /\w/) {
+	    print $handle "<doctype>doc\n";
+	}
+
+	# output whether this node contains text
+	if ($doc_obj->get_text_length($section) > 0) {
+	    print $handle "<hastxt>1\n";
+	} else {
+	    print $handle "<hastxt>0\n";
+	}
+
+	# output all the section metadata
+	my $metadata = $doc_obj->get_all_metadata ($section);
+	foreach my $pair (@$metadata) {
+	    my ($field, $value) = (@$pair);
+
+	    if ($field ne "Identifier" && $field !~ /^gsdl/ && 
+		defined $value && $value ne "") {
+
+		# escape problematic stuff
+		$value =~ s/\\/\\\\/g;
+		$value =~ s/\n/\\n/g;
+		$value =~ s/\r/\\r/g;
+
+		# special case for URL metadata
+		if ($field =~ /^URL$/i) {
+                    $url .= "[$value]\n";
+                    if ($section eq "") {$url .= "<section>$doc_OID\n";}
+                    else {$url .= "<section>$doc_OID.$section\n";}
+                    $url .= '-' x 70 . "\n";
+		}
+
+		if (!defined $self->{'dontgdbm'}->{$field}) {
+		    print $handle "<$field>$value\n";
+		}
+	    }
+	}
+	
+	# output archivedir if at top level
+	if ($section eq $doc_obj->get_top_section()) {
+	    print $handle "<archivedir>$archivedir\n";
+	}
+	
+	# output document display type
+	if ($first) {
+	    print $handle "<thistype>$thistype\n";
+	}
+
+	# output a list of children
+	my $children = $doc_obj->get_children ($section);
+	if (scalar(@$children) > 0) {
+	    print $handle "<childtype>$childtype\n";
+	    print $handle "<contains>";
+	    my $firstchild = 1;
+	    foreach my $child (@$children) {
+		print $handle ";" unless $firstchild;
+		$firstchild = 0;
+		if ($child =~ /^.*?\.(\d+)$/) {
+		    print $handle "\".$1";
+		} else {
+		    print $handle "\".$child";
+		}
+#		if ($child eq "") { print $handle "$doc_OID"; }
+#		elsif ($section eq "") { print $handle "$doc_OID.$child"; }
+#		else { print $handle "$doc_OID.$section.$child"; }
+	    }
+	    print $handle "\n";
+	}
+
+	# output the matching document number
+	print $handle "<docnum>$self->{'num_sections'}\n";
+
+	print $handle '-' x 70, "\n";
+
+	
+	# output a database entry for the document number
+	print $handle "[$self->{'num_sections'}]\n";
+	if ($section eq "") { print $handle "<section>$doc_OID\n"; }
+	else { print $handle "<section>$doc_OID.$section\n"; }
+	print $handle '-' x 70, "\n";
+	
+        # output entry for url
+        if ($url ne "") {
+            print $handle $url;
+        }
+
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+    }
+
+    #add this document to the browse structure
+    push(@{$self->{'doclist'}},$doc_obj->get_OID()) 
+	unless ($doctype eq "classification");
+
+    # classify this document
+    &classify::classify_doc ($self->{'classifiers'}, $doc_obj);
+
+}
+
+sub find_paragraphs {
+    $_[1] =~ s/(<p\b)/\cC$1/gi;
+}
+
+sub filter_text {
+    # $self->filter_text ($field, $new_text);
+    # don't want to do anything for this version, however,
+    # in a particular collection you might want to override
+    # this method to post-process certain fields depending on
+    # the field, or whether we are outputting it for indexing
+}
+
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    my $handle = $self->{'output_handle'};
+    my $indexed_doc = 1;
+
+    # only output this document if it is one to be indexed
+    return if ($doc_obj->get_doc_type() ne "indexed_doc");
+
+    # see if this document belongs to this subcollection
+    foreach my $indexexp (@{$self->{'indexexparr'}}) {
+	$indexed_doc = 0;
+	my ($field, $exp, $options) = split /\//, $indexexp;
+	if (defined ($field) && defined ($exp)) {
+	    my ($bool) = $field =~ /^(.)/;
+	    $field =~ s/^.// if $bool eq '!';
+	    if ($field =~ /^filename$/i) {
+		$field = $doc_obj->get_source_filename();
+	    } else {
+		$field = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $field);
+	    }
+	    next unless defined $field;
+	    if ($bool eq '!') {
+		if ($options =~ /^i$/i) {
+		    if ($field !~ /$exp/i) {$indexed_doc = 1; last;}
+		} else {
+		    if ($field !~ /$exp/) {$indexed_doc = 1; last;}
+		}
+	    } else {
+		if ($options =~ /^i$/i) {
+		    if ($field =~ /$exp/i) {$indexed_doc = 1; last;}
+		} else {
+		    if ($field =~ /$exp/) {$indexed_doc = 1; last;}
+		}
+	    }
+	}
+    }
+
+    # this is another document
+    $self->{'num_docs'} += 1;
+
+    # get the parameters for the output
+    my ($level, $fields) = split (/:/, $self->{'index'});
+    $fields =~ s/\ball\b/Title,Creator,text/;
+    $fields =~ s/\btopall\b/topTitle,topCreator,toptext/;
+
+    my $doc_section = 0; # just for this document
+    my $text = "";
+    my $text_extra = "";
+
+    # get the text for this document
+    my $section = $doc_obj->get_top_section();
+    while (defined $section) {
+	# update a few statistics
+	$doc_section++;
+	$self->{'num_sections'} += 1;
+
+	if ($indexed_doc) {
+	    $self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	    foreach my $field (split (/,/, $fields)) {
+		# only deal with this field if it doesn't start with top or
+		# this is the first section
+		my $real_field = $field;
+		if (!($real_field =~ s/^top//) || ($doc_section == 1)) {
+		    my $new_text = "";
+		    if ($real_field eq "text") {
+			$new_text = $doc_obj->get_text ($section) if $self->{'store_text'};
+			$self->{'num_processed_bytes'} += length ($new_text);
+			$new_text =~ s/[\cB\cC]//g;
+			$self->find_paragraphs($new_text);
+			
+		    } else {
+			my $first = 1;
+			foreach $meta (@{$doc_obj->get_metadata ($section, $real_field)}) {
+			    $meta =~ s/[\cB\cC]//g;
+			    $self->{'num_processed_bytes'} += length ($meta);
+			    $new_text .= "\cC" unless $first;
+			    $new_text .= $meta if $self->{'store_text'};
+			    $first = 0;
+			}
+		    }
+		    
+		    # filter the text
+		    $self->filter_text ($field, $new_text);
+
+		    $text .= "$new_text\cC";
+		}
+	    }
+	}
+	
+	if ($level eq "document") { $text_extra .= "\cB"; }
+	else { $text .= "\cB"; }
+	
+	$section = $doc_obj->get_next_section($section);
+    }
+
+    print $handle "$text$text_extra";
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/mgppbuilder.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/mgppbuilder.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/mgppbuilder.pm	(revision 21083)
@@ -0,0 +1,945 @@
+###########################################################################
+#
+# mgppbuilder.pm -- MGBuilder object
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package mgppbuilder;
+
+use classify;
+use cfgread;
+use colcfg;
+use plugin;
+use util;
+use FileHandle;
+
+
+BEGIN {
+    # set autoflush on for STDERR and STDOUT so that mg
+    # doesn't get out of sync with plugins
+    STDOUT->autoflush(1);
+    STDERR->autoflush(1);
+}
+
+END {
+    STDOUT->autoflush(0);
+    STDERR->autoflush(0);
+}
+
+$maxdocsize = 12000;
+
+
+%wanted_index_files = ('td'=>1,
+		       't'=>1,
+		       'tl'=>1,
+		       'ti'=>1,
+		       'idb'=>1,
+		       'ib1'=>1,
+		       'ib2'=>1,
+		       'ib3'=>1,
+		       'i'=>1,
+		       'il'=>1,
+		       'w'=>1,
+		       'wa'=>1);
+
+# change this so a user can add their own ones in via a file or cfg
+%static_indexfield_map = ('Title'=>'TI',
+			  'TI'=>1,
+			  'Subject'=>'SU',
+			  'SU'=>1,
+			  'Creator'=>'CR',
+			  'CR'=>1,
+			  'Organization'=>'OR',
+			  'OR'=>1,
+			  'Source'=>'SO',
+			  'SO'=>1,
+			  'Howto'=>'HT',
+			  'HT'=>1,
+			  'ItemTitle'=>'IT',
+			  'IT'=>1,
+			  'ProgNumber'=>'PN',
+			  'PN'=>1,
+			  'People'=>'PE',
+			  'PE'=>1,
+			  'TextOnly'=>'TX',
+			  'TX'=>1);
+
+sub new {
+    my ($class, $collection, $source_dir, $build_dir, $verbosity, 
+	$maxdocs, $debug, $keepold, $allclassifications, 
+	$outhandle, $no_text) = @_;
+
+    $outhandle = STDERR unless defined $outhandle;
+    $no_text = 0 unless defined $no_text;
+    
+    # create an mgppbuilder object
+    my $self = bless {'collection'=>$collection,
+		      'source_dir'=>$source_dir,
+		      'build_dir'=>$build_dir,
+		      'verbosity'=>$verbosity,
+		      'maxdocs'=>$maxdocs,
+		      'debug'=>$debug,
+		      'keepold'=>$keepold,
+		      'allclassifications'=>$allclassifications,
+		      'outhandle'=>$outhandle,
+		      'no_text'=>$no_text,
+		      'notbuilt'=>[],    # indexes not built
+		      'indexfieldmap'=>\%static_indexfield_map
+		  }, $class;
+    
+
+    # read in the collection configuration file
+    my $colcfgname = "$ENV{'GSDLCOLLECTDIR'}/etc/collect.cfg";
+    if (!-e $colcfgname) {
+	die "mgppbuilder::new - couldn't find collect.cfg for collection $collection\n";
+    }
+    $self->{'collect_cfg'} = &colcfg::read_collect_cfg ($colcfgname);
+
+    # sort out subcollection indexes
+    if (defined $self->{'collect_cfg'}->{'indexsubcollections'}) {
+	my $indexes = $self->{'collect_cfg'}->{'indexes'};
+	$self->{'collect_cfg'}->{'indexes'} = [];
+	foreach $subcollection (@{$self->{'collect_cfg'}->{'indexsubcollections'}}) {
+	    foreach $index (@$indexes) {
+		push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$subcollection");
+	    }
+	}
+    }
+
+    # sort out language subindexes
+    if (defined $self->{'collect_cfg'}->{'languages'}) {
+	my $indexes = $self->{'collect_cfg'}->{'indexes'};
+	$self->{'collect_cfg'}->{'indexes'} = [];
+	foreach $language (@{$self->{'collect_cfg'}->{'languages'}}) {
+	    foreach $index (@$indexes) {
+		if (defined ($self->{'collect_cfg'}->{'indexsubcollections'})) {
+		    push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index:$language");
+		}
+		else { # add in an empty subcollection field
+		    push (@{$self->{'collect_cfg'}->{'indexes'}}, "$index\:\:$language");
+		}		
+	    }
+	}
+    }
+
+    # make sure that the same index isn't specified more than once
+    my %tmphash = ();
+    my @tmparray = @{$self->{'collect_cfg'}->{'indexes'}};
+    $self->{'collect_cfg'}->{'indexes'} = [];
+    foreach my $i (@tmparray) {
+	if (!defined ($tmphash{$i})) {
+	    push (@{$self->{'collect_cfg'}->{'indexes'}}, $i);
+	    $tmphash{$i} = 1;
+	}
+    }
+
+
+    # get the levels (Section, Paragraph) for indexing and compression
+    $self->{'levels'} = {};
+    if (defined $self->{'collect_cfg'}->{'levels'}) {
+        foreach $level ( @{$self->{'collect_cfg'}->{'levels'}} ){
+            $self->{'levels'}->{$level} = 1;
+        }
+    }  
+
+    # get the list of plugins for this collection
+    my $plugins = [];
+    if (defined $self->{'collect_cfg'}->{'plugin'}) {
+	$plugins = $self->{'collect_cfg'}->{'plugin'};
+    }
+    
+    # load all the plugins
+    $self->{'pluginfo'} = &plugin::load_plugins ($plugins, $verbosity, $outhandle);
+    if (scalar(@{$self->{'pluginfo'}}) == 0) {
+	print $outhandle "No plugins were loaded.\n";
+	die "\n";
+    }
+
+    # get the list of classifiers for this collection
+    my $classifiers = [];
+    if (defined $self->{'collect_cfg'}->{'classify'}) {
+	$classifiers = $self->{'collect_cfg'}->{'classify'};
+    }
+    
+    # load all the classifiers
+    $self->{'classifiers'} = &classify::load_classifiers ($classifiers, $build_dir, $outhandle);
+
+    # load up any dontgdbm fields
+    $self->{'dontgdbm'} = {};
+    if (defined ($self->{'collect_cfg'}->{'dontgdbm'})) {
+	foreach $dg (@{$self->{'collect_cfg'}->{'dontgdbm'}}) {
+	    $self->{'dontgdbm'}->{$dg} = 1;
+	}
+    }
+
+    # load up the document processor for building
+    # if a buildproc class has been created for this collection, use it
+    # otherwise, use the mgpp buildproc
+    my ($buildprocdir, $buildproctype);
+    if (-e "$ENV{'GSDLCOLLECTDIR'}/perllib/${collection}buildproc.pm") {
+	$buildprocdir = "$ENV{'GSDLCOLLECTDIR'}/perllib";
+	$buildproctype = "${collection}buildproc";
+    } else {
+	$buildprocdir = "$ENV{'GSDLHOME'}/perllib";
+	$buildproctype = "mgppbuildproc";
+    }
+    require "$buildprocdir/$buildproctype.pm";
+
+    eval("\$self->{'buildproc'} = new $buildproctype(\$collection, " .
+	 "\$source_dir, \$build_dir, \$verbosity, \$outhandle)");
+    die "$@" if $@;
+
+
+    return $self;
+}
+
+sub init {
+    my $self = shift (@_);
+
+    if (!$self->{'debug'} && !$self->{'keepold'}) {
+	# remove any old builds
+	&util::rm_r($self->{'build_dir'});
+	&util::mk_all_dir($self->{'build_dir'});
+        
+	# make the text directory
+	my $textdir = "$self->{'build_dir'}/text";
+	&util::mk_all_dir($textdir);
+    }
+}
+
+sub set_strip_html {
+    my $self = shift (@_);
+    my ($strip) = @_;
+    
+    $self->{'strip_html'} = $strip;
+    $self->{'buildproc'}->set_strip_html($strip);
+}
+
+sub compress_text {
+
+    my $self = shift (@_);
+    my ($textindex) = @_;
+
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $mgpp_passes_exe = &util::filename_cat($exedir, "mgpp_passes$exe");
+    my $mgpp_compression_dict_exe = &util::filename_cat($exedir, "mgpp_compression_dict$exe");
+    my $outhandle = $self->{'outhandle'};
+
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, "text"));
+
+    my $basefilename = "text/$self->{'collection'}";
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, $basefilename);
+
+   my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fulltextprefix =~ s@/@\\@g;
+    } 
+    else {
+	$osextra = " -d /";
+    }
+
+
+    # define the section names for mgpasses
+    # the compressor doesn't need to know about paragraphs - never want to 
+    # retrieve them
+    my $mgpp_passes_sections = "";
+    if ($self->{'levels'}->{'Section'}) {
+	$mgpp_passes_sections .= "-K Section ";
+    }
+	
+    print $outhandle "\n*** creating the compressed text\n" if ($self->{'verbosity'} >= 1);
+
+    # collect the statistics for the text
+    # -b $maxdocsize sets the maximum document size to be 12 meg
+    print $outhandle "\n    collecting text statistics (mgpp_passes -T1)\n"  if ($self->{'verbosity'} >= 1);
+
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$mgpp_passes_exe" || 
+	    !open (PIPEOUT, "| mgpp_passes$exe $mgpp_passes_sections -f \"$fulltextprefix\" -T1 $osextra")) {
+	    die "mgppbuilder::compress_text - couldn't run $mgpp_passes_exe\n";
+	}
+	$handle = mgppbuilder::PIPEOUT;
+    }
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($textindex);
+    $self->{'buildproc'}->set_indexing_text (0);
+    if ($self->{'no_text'}) {
+	$self->{'buildproc'}->set_store_text(0);
+    } else {
+	$self->{'buildproc'}->set_store_text(1);
+    }
+    $self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($self->{'levels'});                      
+    $self->{'buildproc'}->reset();
+    &plugin::begin($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    &plugin::end($self->{'pluginfo'});
+    close (PIPEOUT);
+
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    # create the compression dictionary
+    # the compression dictionary is built by assuming the stats are from a seed
+    # dictionary (-S), if a novel word is encountered it is spelled out (-H),
+    # and the resulting dictionary must be less than 5 meg with the most 
+    # frequent words being put into the dictionary first (-2 -k 5120)
+    # note: these options are left over from mg version
+    if (!$self->{'debug'}) {
+	print $outhandle "\n    creating the compression dictionary\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mgpp_compression_dict_exe") {
+	    die "mgppbuilder::compress_text - couldn't run $mgpp_compression_dict_exe\n";
+	}
+	system ("mgpp_compression_dict$exe -f \"$fulltextprefix\" -S -H -2 -k 5120 $osextra");
+
+	if (!$self->{'debug'}) {
+	    if (!-e "$mgpp_passes_exe" || 
+		!open ($handle, "| mgpp_passes$exe $mgpp_passes_sections -f \"$fulltextprefix\" -T2 $osextra")) {
+		die "mgppbuilder::compress_text - couldn't run $mgpp_passes_exe\n";
+	    }
+	}
+    }
+
+    $self->{'buildproc'}->reset();
+    # compress the text
+    print $outhandle "\n    compressing the text (mgpp_passes -T2)\n"  if ($self->{'verbosity'} >= 1);
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+}
+
+sub want_built {
+    my $self = shift (@_);
+    my ($index) = @_;
+
+    if (defined ($self->{'collect_cfg'}->{'dontbuild'})) {
+	foreach $checkstr (@{$self->{'collect_cfg'}->{'dontbuild'}}) {
+	    if ($index =~ /^$checkstr$/) {
+		push (@{$self->{'notbuilt'}}, $self->{'index_mapping'}->{$index});
+		return 0;
+	    }
+	}
+    }
+
+    return 1;
+}
+
+sub build_indexes {
+    my $self = shift (@_);
+    my ($indexname) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $indexes = [];
+    if (defined $indexname && $indexname =~ /\w/) {
+	push @$indexes, $indexname;
+    } else {
+	$indexes = $self->{'collect_cfg'}->{'indexes'};
+    }
+
+    # create the mapping between the index descriptions 
+    # and their directory names
+    $self->{'index_mapping'} = $self->create_index_mapping ($indexes);
+
+    # build each of the indexes
+    foreach $index (@$indexes) {
+	if ($self->want_built($index)) {
+	    print $outhandle "\n*** building index $index in subdirectory " . 
+		"$self->{'index_mapping'}->{$index}\n" if ($self->{'verbosity'} >= 1);
+	    $self->build_index($index);
+	} else {
+	    print $outhandle "\n*** ignoring index $index\n" if ($self->{'verbosity'} >= 1);
+	}
+    }
+}
+
+# creates directory names for each of the index descriptions
+sub create_index_mapping {
+    my $self = shift (@_);
+    my ($indexes) = @_;
+
+    my %mapping = ();
+    $mapping{'indexmaporder'} = [];
+    $mapping{'subcollectionmaporder'} = [];
+    $mapping{'languagemaporder'} = [];
+    
+    # dirnames is used to check for collisions. Start this off
+    # with the manditory directory names
+    my %dirnames = ('text'=>'text',
+		    'extra'=>'extra');
+    my %pnames = ('index' => '', 'subcollection' => '', 'languages' => '');
+
+    foreach $index (@$indexes) {
+	my ($fields, $subcollection, $languages) = split (":", $index);
+
+	# the directory name starts with a processed version of index fields
+	my ($pindex) = $self->process_field($fields);
+	# next comes a processed version of the index
+	$pindex = lc ($pindex);
+
+	# next comes a processed version of the subcollection if there is one.
+	my $psub = $self->process_field ($subcollection);
+	$psub = lc ($psub);
+
+	# next comes a processed version of the language if there is one.
+	my $plang = $self->process_field ($languages);
+	$plang = lc ($plang);
+
+	my $dirname = $pindex . $psub . $plang;
+
+	# check to be sure all index names are unique
+	while (defined ($dirnames{$dirname})) {
+	    $dirname = $self->make_unique (\%pnames, $index, \$pindex, \$psub, \$plang);
+	}
+
+	$mapping{$index} = $dirname;
+
+	# store the mapping orders as well as the maps
+	# also put index, subcollection and language fields into the mapping thing - 
+	# (the full index name (eg document:text:subcol:lang) is not used on
+	# the query page) -these are used for collectionmeta later on
+	if (!defined $mapping{'indexmap'}{"$fields"}) {
+	    $mapping{'indexmap'}{"$fields"} = $pindex;
+	    push (@{$mapping{'indexmaporder'}}, "$fields");
+	    if (!defined $mapping{"$fields"}) {
+		$mapping{"$fields"} = $pindex;
+	    }	
+	}
+	if ($psub =~ /\w/ && !defined ($mapping{'subcollectionmap'}{$subcollection})) {
+	    $mapping{'subcollectionmap'}{$subcollection} = $psub;
+	    push (@{$mapping{'subcollectionmaporder'}}, $subcollection);
+	    $mapping{$subcollection} = $psub;
+	}
+	if ($plang =~ /\w/ && !defined ($mapping{'languagemap'}{$languages})) {
+	    $mapping{'languagemap'}{$languages} = $plang;
+	    push (@{$mapping{'languagemaporder'}}, $language);
+	    $mapping{$languages} = $plang;
+	}
+	$dirnames{$dirname} = $index;
+	$pnames{'index'}{$pindex} = "$fields";
+	$pnames{'subcollection'}{$psub} = $subcollection;
+	$pnames{'languages'}{$plang} = $languages;
+    }
+
+    return \%mapping;
+}
+
+# returns a processed version of a field.
+# if the field has only one component the processed
+# version will contain the first character and next consonant
+# of that componant - otherwise it will contain the first 
+# character of the first two components 
+sub process_field {
+    my $self = shift (@_);
+    my ($field) = @_;
+ 
+    return "" unless (defined ($field) && $field =~ /\w/);
+
+    my @components = split /,/, $field;
+    if (scalar @components >= 2) {
+	splice (@components, 2);
+	map {s/^(.).*$/$1/;} @components;
+	return join("", @components);
+    } else {
+	my ($a, $b) = $field =~ /^(.).*?([bcdfghjklmnpqrstvwxyz])/i;
+	($a, $b) = $field =~ /^(.)(.)/ unless defined $a && defined $b;
+	return "$a$b";
+    }
+}
+
+sub make_unique {
+    my $self = shift (@_);
+    my ($namehash, $index, $indexref, $subref, $langref) = @_;
+    my ($fields, $subcollection, $languages) = split (":", $index);
+
+    if ($namehash->{'index'}->{$$indexref} ne "$fields") {
+	$self->get_next_version ($indexref);
+    } elsif ($namehash->{'subcollection'}->{$$subref} ne $subcollection) {
+	$self->get_next_version ($subref);
+    } elsif ($namehash->{'languages'}->{$$langref} ne $languages) {
+	$self->get_next_version ($langref);
+    }
+    return "$$indexref$$subref$$langref";
+}	
+
+sub get_next_version {
+    my $self = shift (@_);
+    my ($nameref) = @_;
+
+    if ($$nameref =~ /(\d\d)$/) {
+	my $num = $1; $num ++;
+	$$nameref =~ s/\d\d$/$num/;
+    } elsif ($$nameref =~ /(\d)$/) {
+	my $num = $1;
+	if ($num == 9) {$$nameref =~ s/\d\d$/10/;}
+	else {$num ++; $$nameref =~ s/\d$/$num/;}
+    } else {
+	$$nameref =~ s/.$/0/;
+    }
+}
+
+sub build_index {
+    my $self = shift (@_);
+    my ($index) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the full index directory path and make sure it exists
+    my $indexdir = $self->{'index_mapping'}->{$index};
+    &util::mk_all_dir (&util::filename_cat($self->{'build_dir'}, $indexdir));
+    my $fullindexprefix = &util::filename_cat ($self->{'build_dir'}, 
+					       $indexdir, 
+					       $self->{'collection'});
+    my $fulltextprefix = &util::filename_cat ($self->{'build_dir'}, "text", 
+					       $self->{'collection'});
+
+    # get any os specific stuff
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+
+    my $exe = &util::get_os_exe ();
+    my $mgpp_passes_exe = &util::filename_cat($exedir, "mgpp_passes$exe");
+
+    # define the section names for mgpasses
+    my $mgpp_passes_sections = "";
+    foreach $level (keys (%{$self->{'levels'}})) {
+	if ($level eq "Section" || $level eq "Paragraph") {
+	    $mgpp_passes_sections .= "-K $level ";
+	}
+    }
+
+    my $mgpp_perf_hash_build_exe = 
+	&util::filename_cat($exedir, "mgpp_perf_hash_build$exe");
+    my $mgpp_weights_build_exe = 
+	&util::filename_cat ($exedir, "mgpp_weights_build$exe");
+    my $mgpp_invf_dict_exe = 
+	&util::filename_cat ($exedir, "mgpp_invf_dict$exe");
+    my $mgpp_stem_idx_exe =
+	&util::filename_cat ($exedir, "mgpp_stem_idx$exe");
+
+     my $osextra = "";
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$fullindexprefix =~ s@/@\\@g;
+    } else {
+	$osextra = " -d /";
+	if ($outhandle ne "STDERR") {
+	    # so mgpp_passes doesn't print to stderr if we redirect output
+	    $osextra .= " 2>/dev/null";
+	}
+    }
+ 
+    # get the index expression if this index belongs
+    # to a subcollection
+    my $indexexparr = [];
+
+    # there may be subcollection info, and language info. 
+    my ($fields, $subcollection, $language) = split (":", $index);
+    my @subcollections = ();
+    @subcollections = split /,/, $subcollection if (defined $subcollection);
+
+    foreach $subcollection (@subcollections) {
+	if (defined ($self->{'collect_cfg'}->{'subcollection'}->{$subcollection})) {
+	    push (@$indexexparr, $self->{'collect_cfg'}->{'subcollection'}->{$subcollection});
+	} 
+    }
+    
+    # add expressions for languages if this index belongs to
+    # a language subcollection - only put languages expressions for the 
+    # ones we want in the index
+
+    my @languages = ();
+    @languages = split /,/, $language if (defined $language);
+    foreach $language (@languages) {
+	my $not=0;
+	if ($language =~ s/^\!//) {
+	    $not = 1;
+	}
+	foreach $lang (@{$self->{'collect_cfg'}->{'languages'}}) {
+	    if ($lang eq $language) {
+		if ($not) {
+		    push (@$indexexparr, "!Language/$language/");
+		} else {
+		    push (@$indexexparr, "Language/$language/");
+		}
+		last;
+	    }
+	}
+    }
+
+    # Build index dictionary. Uses verbatim stem method
+    print $outhandle "\n    creating index dictionary (mgpp_passes -I1)\n"  if ($self->{'verbosity'} >= 1);
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$mgpp_passes_exe" || 
+	    !open (PIPEOUT, "| mgpp_passes$exe $mgpp_passes_sections -f \"$fullindexprefix\" -I1 $osextra")) {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_passes_exe\n";
+	}
+	$handle = mgppbuilder::PIPEOUT;
+    }
+	
+    # set up the document processor
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('text');
+    $self->{'buildproc'}->set_index ($index, $indexexparr);
+    $self->{'buildproc'}->set_indexing_text (1);
+    $self->{'buildproc'}->set_store_text(1);
+    $self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+    $self->{'buildproc'}->set_levels ($self->{'levels'});                       
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+    close ($handle) unless $self->{'debug'};
+
+    $self->print_stats();
+
+    if (!$self->{'debug'}) {
+	# create the perfect hash function
+	if (!-e "$mgpp_perf_hash_build_exe") {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_perf_hash_build_exe\n";
+	}
+	system ("mgpp_perf_hash_build$exe -f \"$fullindexprefix\" $osextra");
+
+	if (!-e "$mgpp_passes_exe" || 
+	    !open ($handle, "| mgpp_passes$exe $mgpp_passes_sections -f \"$fullindexprefix\" -I2 $osextra")) {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_passes_exe\n";
+	}
+    }
+    
+    # invert the text
+    print $outhandle "\n    inverting the text (mgpp_passes -I2)\n"  if ($self->{'verbosity'} >= 1);
+
+    $self->{'buildproc'}->reset();
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+
+    $self->print_stats ();
+    
+    if (!$self->{'debug'}) {
+
+	close ($handle);
+	
+	# create the weights file
+	print $outhandle "\n    create the weights file\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mgpp_weights_build_exe") {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_weights_build_exe\n";
+	}
+	system ("mgpp_weights_build$exe -f \"$fullindexprefix\" $osextra");
+
+	# create 'on-disk' stemmed dictionary
+	print $outhandle "\n    creating 'on-disk' stemmed dictionary\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mgpp_invf_dict_exe") {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_invf_dict_exe\n";
+	}
+	system ("mgpp_invf_dict$exe -f \"$fullindexprefix\" $osextra" );
+
+
+	# creates stem index files for the various stemming methods
+	print $outhandle "\n    creating stem indexes\n"  if ($self->{'verbosity'} >= 1);
+	if (!-e "$mgpp_stem_idx_exe") {
+	    die "mgppbuilder::build_index - couldn't run $mgpp_stem_idx_exe\n";
+	}
+	system ("mgpp_stem_idx$exe -b 4096 -s1 -f \"$fullindexprefix\" $osextra");
+	system ("mgpp_stem_idx$exe -b 4096 -s2 -f \"$fullindexprefix\" $osextra");
+	system ("mgpp_stem_idx$exe -b 4096 -s3 -f \"$fullindexprefix\" $osextra");
+
+    
+	# remove unwanted files
+	my $tmpdir = &util::filename_cat ($self->{'build_dir'}, $indexdir);
+	opendir (DIR, $tmpdir) || die
+	    "mgppbuilder::build_index - couldn't read directory $tmpdir\n";
+	foreach $file (readdir(DIR)) {
+	    next if $file =~ /^\./;
+	    my ($suffix) = $file =~ /\.([^\.]+)$/;
+	    if (defined $suffix && !defined $wanted_index_files{$suffix}) {
+		# delete it!
+		print $outhandle "deleting $file\n" if $self->{'verbosity'} > 2;
+		#&util::rm (&util::filename_cat ($tmpdir, $file));
+	    }
+	}
+	closedir (DIR);
+  }
+}   
+
+sub make_infodatabase {
+    my $self = shift (@_);
+    my $outhandle = $self->{'outhandle'};
+
+
+    my $textdir = &util::filename_cat($self->{'build_dir'}, "text");
+    my $assocdir = &util::filename_cat($self->{'build_dir'}, "assoc");
+    &util::mk_all_dir ($textdir);
+    &util::mk_all_dir ($assocdir);
+
+    # get db name
+    my $dbext = ".bdb";
+    $dbext = ".ldb" if &util::is_little_endian();
+    my $fulldbname = &util::filename_cat ($textdir, "$self->{'collection'}$dbext");
+    $fulldbname =~ s/\//\\/g if ($ENV{'GSDLOS'} =~ /^windows$/i);
+
+    my $exedir = "$ENV{'GSDLHOME'}/bin/$ENV{'GSDLOS'}";
+    my $exe = &util::get_os_exe ();
+    my $txt2db_exe = &util::filename_cat($exedir, "txt2db$exe");
+
+    # define the indexed field mapping if not already done so (ie if infodb called separately from build_index)
+    if (scalar(keys %{$self->{'buildproc'}->{'indexfieldmap'}}) == 0) {
+	#check build.cfg to see if indexfields have been filled in
+	$buildconfigfile = &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "building/build.cfg");
+	if (-e $buildconfigfile) {
+	    $buildcfg = &colcfg::read_build_cfg( $buildconfigfile);
+	    if (defined $buildcfg->{'indexfields'}) {
+		foreach $field (@{$buildcfg->{'indexfields'}}) {
+		    $self->{'buildproc'}->{'indexfields'}->{$field} = 1;
+		}
+	    }
+	    if (defined $buildcfg->{'indexfieldmap'}) {
+		foreach $field (@{$buildcfg->{'indexfieldmap'}}) {
+		    ($f, $v) = $field =~ /^(.*)\-\>(.*)$/;
+		    $self->{'buildproc'}->{'indexfieldmap'}->{$f} = $v;
+		}
+	    }	    
+	}
+    }
+    
+    print $outhandle "\n*** creating the info database and processing associated files\n" 
+	if ($self->{'verbosity'} >= 1);
+
+    # init all the classifiers
+    &classify::init_classifiers ($self->{'classifiers'});
+
+    # set up the document processor
+    my ($handle);
+    if ($self->{'debug'}) {
+	$handle = STDOUT;
+    } else {
+	if (!-e "$txt2db_exe" || !open (PIPEOUT, "| $txt2db_exe $fulldbname")) {
+	    die "mgppbuilder::make_infodatabase - couldn't run $txt2db_exe\n";
+	}
+	$handle = mgppbuilder::PIPEOUT;
+    }
+
+    $self->{'buildproc'}->set_output_handle ($handle);
+    $self->{'buildproc'}->set_mode ('infodb');
+    $self->{'buildproc'}->set_assocdir ($assocdir);
+    $self->{'buildproc'}->set_dontgdbm ($self->{'dontgdbm'});
+    $self->{'buildproc'}->set_classifiers ($self->{'classifiers'});
+    $self->{'buildproc'}->set_indexing_text (0);
+    $self->{'buildproc'}->set_store_text(1);
+    #$self->{'buildproc'}->set_indexfieldmap ($self->{'indexfieldmap'});
+
+    $self->{'buildproc'}->reset();
+
+    if (defined $self->{'collect_cfg'}->{'collectionmeta'}) {
+	
+	if (!defined $self->{'index_mapping'}) {
+	    $self->{'index_mapping'} = 
+		$self->create_index_mapping ($self->{'collect_cfg'}->{'indexes'});
+	}
+	
+	print $handle "[collection]\n";
+
+	foreach $cmeta (keys (%{$self->{'collect_cfg'}->{'collectionmeta'}})) {
+	    my $defaultfound=0;
+	    my $first=1;
+	    my $metadata_entry = "";
+	    my $default="";
+	    my $cmetamap = "";
+	    if ($cmeta =~ s/^\.//) {
+		if (defined $self->{'index_mapping'}->{$cmeta}) {
+		    $cmetamap = $self->{'index_mapping'}->{$cmeta};
+		    $cmeta = ".$cmeta";
+		}
+		else {
+		    print $outhandle "mgbuilder: warning bad collectionmeta option '$cmeta' - ignored\n";
+		    next; #ignore this one
+		}
+	    }
+	    else {
+		$cmetamap = $cmeta; # just using the same name
+	    }
+	    #iterate through the languages
+	    foreach $lang (keys (%{$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}})) {
+		if ($first) {
+		    $first=0;
+		    #set the default default to the first entry
+		    $default=$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{$lang};
+		}
+		if ($lang =~ /default/) {
+		    $defaultfound=1;
+		    #the default entry goes first
+		    $metadata_entry = "<$cmetamap>" .
+			$self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{'default'} . "\n" . $metadata_entry;
+		}
+		else {
+		    my ($l) = $lang =~ /^\[l=(\w*)\]$/;
+		    if ($l) {	      
+			$metadata_entry .= "<$cmetamap:$l>" . 
+			    $self->{'collect_cfg'}->{'collectionmeta'}->{$cmeta}->{$lang} . "\n";
+		    }
+		}
+	    }
+	    #if we haven't found a default, put one in
+	    if (!$defaultfound) {
+		$metadata_entry = "<$cmetamap>$default\n" . $metadata_entry;
+	    }
+	    #write the entry to the file
+	    print $handle $metadata_entry;
+	    
+	}
+	
+	print $handle "\n" . ('-' x 70) . "\n";
+	
+    }
+    
+    &plugin::read ($self->{'pluginfo'}, $self->{'source_dir'}, 
+		   "", {}, $self->{'buildproc'}, $self->{'maxdocs'});
+
+    # output classification information
+    &classify::output_classify_info ($self->{'classifiers'}, $handle,
+				     $self->{'allclassifications'});
+
+    #output doclist
+    my @doclist = $self->{'buildproc'}->get_doc_list();
+    my $docs = join (";",@doclist);
+    print $handle "[browselist]\n";
+    print $handle "<hastxt>0\n";
+    print $handle "<childtype>VList\n";
+    print $handle "<numleafdocs>" . ($#doclist+1) . "\n";
+    print $handle "<thistype>Invisible\n";
+    print $handle "<contains>$docs";
+    print $handle "\n" . ('-' x 70) . "\n";
+    close ($handle) if !$self->{'debug'};
+
+}
+
+sub collect_specific {
+    my $self = shift (@_);
+}
+
+sub make_auxiliary_files {
+    my $self = shift (@_);
+    my ($index);
+    my %build_cfg = ();
+
+    my $outhandle =  $self->{'outhandle'};
+    print $outhandle "\n*** creating auxiliary files \n" if ($self->{'verbosity'} >= 1);
+
+    # get the text directory
+    &util::mk_all_dir ($self->{'build_dir'});
+
+    # store the build date
+    $build_cfg->{'builddate'} = time;
+    $build_cfg->{'buildtype'} = "mgpp";
+
+    # store the number of documents and number of bytes
+    $build_cfg->{'numdocs'} = $self->{'buildproc'}->get_num_docs();
+    $build_cfg->{'numbytes'} = $self->{'buildproc'}->get_num_bytes();
+
+    # store the mapping between the index names and the directory names
+    my @indexmap = ();
+    foreach $index (@{$self->{'index_mapping'}->{'indexmaporder'}}) {
+	push (@indexmap, "$index\-\>$self->{'index_mapping'}->{'indexmap'}->{$index}");
+    }
+    $build_cfg->{'indexmap'} = \@indexmap;
+
+    my @subcollectionmap = ();
+    foreach $subcollection (@{$self->{'index_mapping'}->{'subcollectionmaporder'}}) {
+	push (@subcollectionmap, "$subcollection\-\>" .
+	      $self->{'index_mapping'}->{'subcollectionmap'}->{$subcollection});
+    }
+    $build_cfg->{'subcollectionmap'} = \@subcollectionmap if scalar (@subcollectionmap);
+
+    my @languagemap = ();
+    foreach $language (@{$self->{'index_mapping'}->{'languagemaporder'}}) {
+	push (@languagemap, "$language\-\>" .
+	      $self->{'index_mapping'}->{'languagemap'}->{$language});
+    }
+    $build_cfg->{'languagemap'} = \@languagemap if scalar (@languagemap);
+
+    $build_cfg->{'notbuilt'} = $self->{'notbuilt'};
+
+    # store the indexfieldmap information
+    my @indexfieldmap = ();
+    #add all fields bit
+    foreach $field (keys %{$self->{'buildproc'}->{'indexfields'}}) {
+	push (@indexfieldmap, "$field\-\>$self->{'buildproc'}->{'indexfieldmap'}->{$field}");
+    }
+
+    $build_cfg->{'indexfieldmap'} = \@indexfieldmap;
+
+    #store the indexed field information
+    foreach $field (sort keys %{$self->{'buildproc'}->{'indexfields'}}) {
+	
+	push (@{$build_cfg->{'indexfields'}}, $field);
+    }
+    # write out the build information
+    &cfgread::write_cfg_file("$self->{'build_dir'}/build.cfg", $build_cfg,
+			     '^(builddate|buildtype|numdocs|numbytes)$', 
+                             '^(indexmap|subcollectionmap|languagemap|indexfieldmap|notbuilt|indexfields)$');
+
+}
+
+sub deinit {
+    my $self = shift (@_);
+}
+
+sub print_stats {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    my $indexing_text = $self->{'buildproc'}->get_indexing_text();
+    my $index = $self->{'buildproc'}->get_index();
+    my $num_bytes = $self->{'buildproc'}->get_num_bytes();
+    my $num_processed_bytes = $self->{'buildproc'}->get_num_processed_bytes();
+
+    if ($indexing_text) {
+	print $outhandle "Stats (Creating index $index)\n";
+    } else {
+	print $outhandle "Stats (Compressing text from $index)\n";
+    }
+    print $outhandle "Total bytes in collection: $num_bytes\n";
+    print $outhandle "Total bytes in $index: $num_processed_bytes\n";
+
+    if ($num_processed_bytes < 50 && ($indexing_text || !$self->{'no_text'})) {
+	print $outhandle "***************\n";
+	if ($indexing_text) {
+	    print $outhandle "WARNING: There is very little or no text to process for $index\n";
+	} elsif (!$self->{'no_text'}) {
+	    print $outhandle "WARNING: There is very little or no text to compress\n";
+	}	   
+	print $outhandle "         Was this your intention?\n";
+	print $outhandle "***************\n";
+    }
+
+}
+
+1;
+
+
Index: /main/tags/2.38/gsdl/perllib/mgppbuildproc.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/mgppbuildproc.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/mgppbuildproc.pm	(revision 21083)
@@ -0,0 +1,674 @@
+###########################################################################
+#
+# mgppbuildproc.pm -- 
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 document processor outputs a document
+# for mgpp to process
+
+
+package mgppbuildproc;
+
+use classify;
+use doc;
+use docproc;
+use util;
+
+
+BEGIN {
+    @ISA = ('docproc');
+}
+
+
+sub new {
+    my ($class, $collection, $source_dir, $build_dir, 
+	$verbosity, $outhandle) = @_;
+    my $self = new docproc ();
+
+    # outhandle is where all the debugging info goes
+    # output_handle is where the output of the plugins is piped
+    # to (i.e. mg, gdbm etc.)
+    $outhandle = STDERR unless defined $outhandle;
+
+    $self->{'collection'} = $collection;
+    $self->{'source_dir'} = $source_dir;
+    $self->{'build_dir'} = $build_dir;
+    $self->{'verbosity'} = $verbosity;
+    $self->{'classifiers'} = [];
+    $self->{'mode'} = "text";
+    $self->{'assocdir'} = $build_dir;
+    $self->{'dontgdbm'} = {};
+    $self->{'index'} = "text";
+    $self->{'indexexparr'} = [];
+    $self->{'output_handle'} = "STDOUT";
+    $self->{'num_docs'} = 0;
+    $self->{'num_sections'} = 0;
+    $self->{'num_bytes'} = 0;
+    $self->{'num_processed_bytes'} = 0;
+    $self->{'store_text'} = 1;
+    $self->{'outhandle'} = $outhandle;
+
+    #used by browse interface
+    $self->{'doclist'} = [];
+
+    $self->{'indexing_text'} = 0;
+
+    #new ones for mgpp
+    $self->{'dontindex'} = {};
+    $self->{'indexfieldmap'} = {};
+    $self->{'indexfields'} = {};
+    $self->{'strip_html'}=1;
+
+
+    return bless $self, $class;
+}
+
+sub reset {
+    my $self = shift (@_);
+    
+    $self->{'num_docs'} = 0;
+    $self->{'num_sections'} = 0;
+    $self->{'num_processed_bytes'} = 0;
+    $self->{'num_bytes'} = 0;
+}
+
+sub get_num_docs {
+    my $self = shift (@_);
+
+    return $self->{'num_docs'};
+}
+
+sub get_num_sections {
+    my $self = shift (@_);
+
+    return $self->{'num_sections'};
+}
+
+# num_bytes is the actual number of bytes in the collection
+# this is normally the same as what's processed during text compression
+sub get_num_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_bytes'};
+}
+
+# num_processed_bytes is the number of bytes actually passed
+# to mgpp for the current index
+sub get_num_processed_bytes {
+    my $self = shift (@_);
+
+    return $self->{'num_processed_bytes'};
+}
+
+sub set_output_handle {
+    my $self = shift (@_);
+    my ($handle) = @_;
+
+    $self->{'output_handle'} = $handle;
+}
+
+sub set_mode {
+    my $self = shift (@_);
+    my ($mode) = @_;
+
+    $self->{'mode'} = $mode;
+}
+
+sub set_assocdir {
+    my $self = shift (@_);
+    my ($assocdir) = @_;
+
+    $self->{'assocdir'} = $assocdir;
+}
+
+sub set_dontgdbm {
+    my $self = shift (@_);
+    my ($dontgdbm) = @_;
+
+    $self->{'dontgdbm'} = $dontgdbm;
+}
+
+sub set_index {
+    my $self = shift (@_);
+    my ($index, $indexexparr) = @_;
+
+    $self->{'index'} = $index;
+    $self->{'indexexparr'} = $indexexparr if defined $indexexparr;
+}
+
+sub get_index {
+    my $self = shift (@_);
+
+    return $self->{'index'};
+}
+
+sub set_classifiers {
+    my $self = shift (@_);
+    my ($classifiers) = @_;
+
+    $self->{'classifiers'} = $classifiers;
+}
+
+sub set_indexing_text {
+    my $self = shift (@_);
+    my ($indexing_text) = @_;
+
+    $self->{'indexing_text'} = $indexing_text;
+}
+
+sub get_indexing_text {
+    my $self = shift (@_);
+
+    return $self->{'indexing_text'};
+}
+
+sub set_store_text {
+    my $self = shift (@_);
+    my ($store_text) = @_;
+
+    $self->{'store_text'} = $store_text;
+}
+
+sub get_doc_list {
+    my $self = shift(@_);
+    
+    return @{$self->{'doclist'}};
+}
+
+sub set_indexfieldmap {
+    my $self = shift (@_);
+    my ($indexmap) = @_;
+
+    $self->{'indexfieldmap'} = $indexmap;
+}
+
+sub get_indexfieldmap {
+    my $self = shift (@_);
+
+    return $self->{'indexfieldmap'};
+}
+
+sub set_levels {
+    my $self = shift (@_);
+    my ($levels) = @_;
+
+    $self->{'levels'} = $levels;
+}
+
+sub set_strip_html {
+    my $self = shift (@_);
+    my ($strip) = @_;
+    $self->{'strip_html'}=$strip;
+}
+
+sub process {
+    my $self = shift (@_);
+    my $method = $self->{'mode'};
+
+    $self->$method(@_);
+}
+
+# use 'Paged' if document has no more than 2 levels
+# and each section at second level has a number for
+# Title metadata
+sub get_document_type {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+
+    my $thistype = "VList";
+    my $childtype = "VList";
+    my $title;
+    my @tmp = ();
+    
+    my $section = $doc_obj->get_top_section ();
+    my $first = 1;
+    while (defined $section) {
+	@tmp = split /\./, $section;
+	if (scalar(@tmp) > 1) {
+	    return ($thistype, $childtype);
+	}
+	if (!$first) {
+	    $title = $doc_obj->get_metadata_element ($section, "Title");
+	    if (!defined $title || $title !~ /^\d+$/) {
+		return ($thistype, $childtype);
+	    }
+	}
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+    }
+    if ($doc_obj->get_text_length ($doc_obj->get_top_section())) {
+	$thistype = "Paged";
+    } else {
+	$thistype = "Invisible";
+    }
+    $childtype = "Paged";
+    return ($thistype, $childtype);
+}
+
+sub assoc_files {
+   my $self = shift (@_);
+    my ($doc_obj, $archivedir) = @_;
+    my ($afile);
+    
+    foreach my $assoc_file (@{$doc_obj->get_assoc_files()}) {
+	# if assoc file contains directory structure of
+	# its own use it, otherwise use HASH... directory
+	if ($assoc_file->[1] =~ /[\/\\]/) {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $assoc_file->[1]);
+	} else {
+	    $afile = &util::filename_cat($self->{'assocdir'}, $archivedir, $assoc_file->[1]);
+	}
+	&util::hard_link ($assoc_file->[0], $afile);
+    }
+}
+
+sub infodb {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+    my $handle = $self->{'output_handle'};
+
+    my $doctype = $doc_obj->get_doc_type();
+
+    # only output this document if it is one to be indexed
+    return if ($doctype ne "indexed_doc");
+
+    #if a Section level index is not built, the gdbm file should be at doc 
+    #level not Section
+    my $docs_only = 1;
+    if ($self->{'levels'}->{'Section'}) {
+	$docs_only = 0;
+    }
+
+    my ($archivedir) = $filename =~ /^(.*?)(?:\/|\\)[^\/\\]*$/;
+    $archivedir = "" unless defined $archivedir;
+    $archivedir =~ s/\\/\//g;
+    $archivedir =~ s/^\/+//;
+    $archivedir =~ s/\/+$//;
+
+    $self->assoc_files ($doc_obj, $archivedir);
+
+    # this is another document
+    $self->{'num_docs'} += 1 unless ($doctype eq "classification");
+
+    # is this a paged or a hierarchical document
+    my ($thistype, $childtype) = $self->get_document_type ($doc_obj);
+
+    my $section = $doc_obj->get_top_section ();
+    my $doc_OID = $doc_obj->get_OID();
+    my $first = 1;
+    my $url = "";
+    while (defined $section) {
+	# update a few statistics
+	$self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	$self->{'num_sections'} += 1 unless ($doctype eq "classification");
+
+	# output the section name
+	if ($section eq "") { print $handle "[$doc_OID]\n"; }
+	else { print $handle "[$doc_OID.$section]\n"; }
+
+	# output the fact that this document is a document (unless doctype
+	# has been set to something else from within a plugin
+	my $dtype = $doc_obj->get_metadata_element ($section, "doctype");
+	if (!defined $dtype || $dtype !~ /\w/) {
+	    print $handle "<doctype>doc\n";
+	}
+
+	# output whether this node contains text
+	if ($doc_obj->get_text_length($section) > 0) {
+	    print $handle "<hastxt>1\n";
+	} else {
+	    print $handle "<hastxt>0\n";
+	}
+
+	# output all the section metadata
+	my $metadata = $doc_obj->get_all_metadata ($section);
+	foreach my $pair (@$metadata) {
+	    my ($field, $value) = (@$pair);
+
+	    if ($field ne "Identifier" && $field !~ /^gsdl/ && 
+		defined $value && $value ne "") {
+
+		# escape problematic stuff
+		$value =~ s/\\/\\\\/g;
+		$value =~ s/\n/\\n/g;
+		$value =~ s/\r/\\r/g;
+
+		# special case for URL metadata
+		if ($field =~ /^URL$/i) {
+                    $url .= "[$value]\n";
+                    if ($section eq "") {$url .= "<section>$doc_OID\n";}
+                    else {$url .= "<section>$doc_OID.$section\n";}
+                    $url .= '-' x 70 . "\n";
+		}
+
+		if (!defined $self->{'dontgdbm'}->{$field}) {
+		    print $handle "<$field>$value\n";
+		}
+	    }
+	}
+
+	# output archivedir if at top level
+	if ($section eq $doc_obj->get_top_section()) {
+	    print $handle "<archivedir>$archivedir\n";
+	}
+
+	# output document display type
+	if ($first) {
+	    print $handle "<thistype>$thistype\n";
+	}
+
+	if (!$docs_only) {
+	    # output a list of children
+	    my $children = $doc_obj->get_children ($section);
+	    if (scalar(@$children) > 0) {
+		print $handle "<childtype>$childtype\n";
+		print $handle "<contains>";
+		my $firstchild = 1;
+		foreach $child (@$children) {
+		    print $handle ";" unless $firstchild;
+		    $firstchild = 0;
+		    if ($child =~ /^.*?\.(\d+)$/) {
+			print $handle "\".$1";
+		    } else {
+			print $handle "\".$child";
+		    }
+#		if ($child eq "") { print $handle "$doc_OID"; }
+#		elsif ($section eq "") { print $handle "$doc_OID.$child"; }
+#		else { print $handle "$doc_OID.$section.$child"; }
+		}
+		print $handle "\n";
+	    }
+	    #output the matching doc number
+	    print $handle "<docnum>$self->{'num_sections'}\n";
+	    
+	} # if (!$docs_only)
+	else { #docs only, doc num is num_docs not num_sections
+	    # output the matching document number
+	    print $handle "<docnum>$self->{'num_docs'}\n";
+	}
+	
+	print $handle '-' x 70, "\n";
+
+	
+	# output a database entry for the document number
+	if ($docs_only) {
+	    print $handle "[$self->{'num_docs'}]\n";
+	    print $handle "<section>$doc_OID\n";
+	}
+	else {
+	    print $handle "[$self->{'num_sections'}]\n";
+	    if ($section eq "") { print $handle "<section>$doc_OID\n"; }
+	    else { print $handle "<section>$doc_OID.$section\n"; }
+	}
+	print $handle '-' x 70, "\n";
+	
+        # output entry for url
+        if ($url ne "") {
+            print $handle $url;
+        }
+
+	$first = 0;
+	$section = $doc_obj->get_next_section($section);
+	last if ($docs_only); # if no sections wanted, only gdbm the docs
+    }
+
+    #add this document to the browse structure
+    push(@{$self->{'doclist'}},$doc_obj->get_OID()) 
+	unless ($doctype eq "classification");
+
+    # classify this document
+    &classify::classify_doc ($self->{'classifiers'}, $doc_obj);
+
+}
+
+sub find_paragraphs {
+    $_[1] =~ s/(<p\b)/<Paragraph>$1/gi;
+}
+
+#this function strips the html tags from the doc if ($strip_html) and
+# if ($para) replaces <p> with <Paragraph> tags.
+# if both are false, the original text is returned
+#assumes that <pre> and </pre> have no spaces, and removes all < and > inside
+#these tags
+sub preprocess_text {
+    my $self = shift (@_);
+    my ($text, $strip_html, $para) = @_;
+
+    my ($outtext) = "";
+    if ($strip_html) { 
+	while ($text =~ /<([^>]*)>/ && $text ne "") {
+	    
+	    $tag = $1;
+	    $outtext .= $`." "; #add everything before the matched tag
+	    $text = $'; #everything after the matched tag
+	    if ($para && $tag =~ /^\s*p\s/) {
+		$outtext .= "<Paragraph> ";
+	    }
+	    elsif ($tag =~ /^pre$/) { # a pre tag
+		$text =~ /<\/pre>/; # find the closing pre tag
+		my $tmp_text = $`; #everything before the closing pre tag
+		$text = $'; #everything after the </pre>
+		$tmp_text =~ s/[<>]//g; # remove all < and >
+		$outtext.= $tmp_text . " ";
+	    }
+	}
+    
+	$outtext .= $text; # add any remaining text
+	return $outtext;
+    } #if strip_html
+
+    if ($para) {
+	$text =~ s/(<p\b)/<Paragraph>$1/gi;
+	return $text;
+    }
+    return $text;
+}
+	
+    
+
+sub filter_text {
+    # $self->filter_text ($field, $new_text);
+    # don't want to do anything for this version, however,
+    # in a particular collection you might want to override
+    # this method to post-process certain fields depending on
+    # the field, or whether we are outputting it for indexing
+}
+
+sub text {
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    my $handle = $self->{'output_handle'};
+    my $indexed_doc = 1;
+
+    # only output this document if it is one to be indexed
+    return if ($doc_obj->get_doc_type() ne "indexed_doc");
+
+    # see if this document belongs to this subcollection
+    foreach my $indexexp (@{$self->{'indexexparr'}}) {
+	$indexed_doc = 0;
+	my ($field, $exp, $options) = split /\//, $indexexp;
+	if (defined ($field) && defined ($exp)) {
+	    my ($bool) = $field =~ /^(.)/;
+	    $field =~ s/^.// if $bool eq '!';
+	    if ($field =~ /^filename$/i) {
+		$field = $doc_obj->get_source_filename();
+	    } else {
+		$field = $doc_obj->get_metadata_element($doc_obj->get_top_section(), $field);
+	    }
+	    next unless defined $field;
+	    if ($bool eq '!') {
+		if ($options =~ /^i$/i) {
+		    if ($field !~ /$exp/i) {$indexed_doc = 1; last;}
+		} else {
+		    if ($field !~ /$exp/) {$indexed_doc = 1; last;}
+		}
+	    } else {
+		if ($options =~ /^i$/i) {
+		    if ($field =~ /$exp/i) {$indexed_doc = 1; last;}
+		} else {
+		    if ($field =~ /$exp/) {$indexed_doc = 1; last;}
+		}
+	    }
+	}
+    }
+
+    # this is another document
+    $self->{'num_docs'} += 1;
+
+    # get the parameters for the output
+    my ($fields) = $self->{'index'};
+
+    my ($sectiontag) = "";
+    if ($self->{'levels'}->{'Section'}) {
+	$sectiontag = "\n<Section>\n";
+    }
+    my ($paratag) = "";
+    if ($self->{'levels'}->{'Paragraph'}) {
+	$paratag = "<Paragraph>";
+    }
+    my $doc_section = 0; # just for this document
+    my $text = "<Document>\n";
+   
+    # get the text for this document
+    my $section = $doc_obj->get_top_section();
+    while (defined $section) {
+	# update a few statistics
+	$doc_section++;
+	$self->{'num_sections'} += 1;
+	$text .= $sectiontag;
+
+	if ($indexed_doc) {
+	    $self->{'num_bytes'} += $doc_obj->get_text_length ($section);
+	    foreach my $field (split (/,/, $fields)) {
+		# only deal with this field if it doesn't start with top or
+		# this is the first section
+		my $real_field = $field;
+		if (!($real_field =~ s/^top//) || ($doc_section == 1)) {
+		    my $new_text = ""; 
+		    my $tmp_text = "";
+		    if ($real_field eq "text") {
+			if ($self->{'indexing_text'}) { #tag the text with <Text>...</Text>, add the <Paragraph> tags and strip out html if needed
+			    $new_text .= "<TX>\n";
+			    $tmp_text .= $doc_obj->get_text ($section) if $self->{'store_text'};
+			    $tmp_text = $self->preprocess_text($tmp_text, $self->{'strip_html'}, $self->{'levels'}->{'Paragraph'});
+
+			    $new_text .= "$tmp_text</TX>\n";
+			    if (!defined $self->{'indexfields'}->{'TextOnly'}) {
+				$self->{'indexfields'}->{'TextOnly'} = 1;   
+			    }
+			}
+			else { # leave html stuff in, and dont add Paragraph tags - never retrieve paras at the moment
+			    $new_text .= $doc_obj->get_text ($section) if $self->{'store_text'};
+                            #if ($self->{'levels'}->{'Paragraph'}) {
+			    #$self->find_paragraphs($new_text);
+			    #}                
+			}
+		    } else { # metadata field
+			if ($real_field eq "metadata") { # insert all metadata 
+			    #except gsdl stuff
+			    my $shortname = "";
+			    my $metadata = $doc_obj->get_all_metadata ($section);
+			    foreach $pair (@$metadata) {
+				my ($mfield, $mvalue) = (@$pair);
+				# check fields here, maybe others dont want - change to use dontindex!!
+				if ($mfield ne "Identifier" && $mfield ne "classifytype" && $mfield ne "assocfilepath" && 
+				    $mfield !~ /^gsdl/ && defined $mvalue && $mvalue ne "") {
+				    
+				    if (defined $self->{'indexfieldmap'}->{$mfield}) {
+					$shortname = $self->{'indexfieldmap'}->{$mfield};
+				    }
+				    else {
+					$shortname = $self->create_shortname($mfield);
+					$self->{'indexfieldmap'}->{$mfield} = $shortname;
+					$self->{'indexfieldmap'}->{$shortname} = 1;
+				    }	   
+				    $new_text .= "$paratag<$shortname>$mvalue</$shortname>\n";
+				    if (!defined $self->{'indexfields'}->{$mfield}) {
+					$self->{'indexfields'}->{$mfield} = 1;
+				    }				    
+				}
+			    }
+			    
+			}
+			else { #individual metadata specified
+			    my $shortname="";
+			    if (!defined $self->{'indexfields'}->{$real_field}) {
+				$self->{'indexfields'}->{$real_field} = 1;
+			    }
+			    if (defined $self->{'indexfieldmap'}->{$real_field}) {
+				$shortname = $self->{'indexfieldmap'}->{$real_field};
+			    }
+			    else {
+				$shortname = $self->create_shortname($real_field);
+				$self->{'indexfieldmap'}->{$real_field} = $shortname;
+				$self->{'indexfieldmap'}->{$shortname} = 1;
+			    }
+			    foreach $item (@{$doc_obj->get_metadata ($section, $real_field)}) {
+				$new_text .= "$paratag<$shortname>$item</$shortname>\n";
+			    }
+			}
+
+		    }
+		    
+		    # filter the text
+		    $self->filter_text ($field, $new_text);
+
+		    $self->{'num_processed_bytes'} += length ($new_text);
+		    $text .= "$new_text";
+		}
+	    }
+	} # if (indexed_doc)
+	
+	$section = $doc_obj->get_next_section($section);
+    } #while defined section
+    print $handle "$text\n</Document>\n"; 
+}
+
+sub create_shortname {
+    $self = shift(@_);
+    
+    my ($realname) = @_;
+    #take the first two chars
+    my ($shortname) = $realname =~ /^(\w\w)/;
+    $shortname =~ tr/a-z/A-Z/;
+
+    #if already used, take the first and third letters and so on
+    $count = 1;
+    while (defined $self->{'indexfieldmap'}->{$shortname}) {
+	if ($realname =~ /^(\w).{$count}(\w)/) {
+	    $shortname = "$1$2";
+	$count++;
+	$shortname =~ tr/a-z/A-Z/;
+	
+	}
+	else {
+	    $realname =~ s/^.//;
+	    $count = 0;
+	}
+    }
+
+    return $shortname;
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/multiread.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/multiread.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/multiread.pm	(revision 21083)
@@ -0,0 +1,270 @@
+###########################################################################
+#
+# multiread.pm --
+#
+# Copyright (C) 1999 DigiLib Systems Limited, NZ
+#
+# 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.
+#
+###########################################################################
+
+# the multiread object will read in a number of encodings,
+# the results are always returned in the utf-8 format
+
+# encodings currently supported are
+#
+# utf8             - either utf8 or unicode (automatically detected)
+# unicode          - just unicode (doesn't currently do endian detection)
+#
+# plus all encodings in the "encodings" package
+
+package multiread;
+
+use unicode;
+
+sub new {
+    my ($class) = @_;
+
+    my $self = {'handle'    => "",
+		'first'     => 1,
+		'encoding'  => "utf8",
+		'bigendian' => 1};
+
+    return bless $self, $class;
+}
+
+# set_handle expects the file to be already open but
+# not read yet
+sub set_handle {
+    my $self = shift (@_);
+    ($self->{'handle'}) = @_;
+    $self->{'first'} = 1;
+    $self->{'encoding'} = "utf8";
+    $self->{'bigendian'} = 1;
+}
+
+# set_encoding should be called after set_handle
+sub set_encoding {
+    my $self = shift (@_);
+    ($self->{'encoding'}) = @_;
+}
+
+sub get_encoding {
+    my $self = shift (@_);
+    return $self->{'encoding'};
+}
+
+# undef will be returned if the eof has been reached
+# the result will always be returned in utf-8
+# if automatic detection between utf8 and unicode is desired
+# then the encoding should be initially set to utf8
+sub read_unicode_char {
+    my $self = shift (@_);
+
+    # make sure we have a file handle
+    return undef if ($self->{'handle'} eq "");
+    my $handle = $self->{'handle'};
+    binmode ($handle);
+
+    if ($self->{'encoding'} eq "utf8") {
+	# utf-8 text, how many characters we get depends 
+	# on what we find
+	my $c1 = "";
+	my $c2 = "";
+	my $c3 = "";
+
+	while (!eof ($handle)) {
+	    $c1 = ord (getc ($handle));
+	    if ($self->{'first'}) {
+		$self->{'first'} = 0;
+
+		if ($c1 == 0xfe || $c1 == 0xff) {
+		    $c2 = ord (getc ($handle)) if (!eof ($handle));
+		    
+		    # if unicode fall through to the unicode reading code
+		    if ($c1 == 0xff && $c2 == 0xfe) {
+			$self->{'encoding'} = "unicode";
+			$self->{'bigendian'} = 0;
+			last;
+
+		    } elsif ($c1 == 0xfe && $c2 == 0xff) {
+			$self->{'encoding'} = "unicode";
+			$self->{'bigendian'} = 1;
+			last;
+		    }
+
+		    # an error, but we might be able to recover
+		    # from it
+		    $c1 = $c2;
+		}
+	    }
+
+	    if ($c1 <= 0x7f) {
+		# one byte character
+		return chr ($c1);
+
+	    } elsif ($c1 >= 0xc0 && $c1 <= 0xdf) {
+		# two byte character
+		$c2 = getc ($handle) if (!eof ($handle));
+		return chr ($c1) . $c2;
+
+	    } elsif ($c1 >= 0xe0 && $c1 <= 0xef) {
+		# three byte character
+		$c2 = getc ($handle) if (!eof ($handle));
+		$c3 = getc ($handle) if (!eof ($handle));
+		return chr ($c1) . $c2 . $c3;
+	    }
+
+	    # if we get here there was an error in the file, we should
+	    # be able to recover from it however, maybe the file is in
+	    # another encoding
+	}
+
+	return undef if (eof ($handle));
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	# unicode text, get the next two characters
+	return undef if (eof ($handle));
+	my $c1 = ord (getc ($handle));
+	return undef if (eof ($handle));
+	my $c2 = ord (getc ($handle));
+
+	return &unicode::unicode2utf8 ([(($self->{'bigendian'}) ? ($c1*256+$c2) : ($c2*256+$c1))]);
+    }
+
+    return undef;
+}
+
+
+# undef will be returned if the eof has been reached
+# the result will always be returned in utf-8
+sub read_line {
+    my $self = shift (@_);
+
+    # make sure we have a file handle
+    return undef if ($self->{'handle'} eq "");
+
+    my $handle = $self->{'handle'};
+
+    if ($self->{'first'} && $self->{'encoding'} eq "utf8") {
+	# special case for the first line of utf8 text to detect whether
+	# the file is in utf8 or unicode
+	my $out = "";
+	my $thisc = "";
+	while (defined ($thisc = $self->read_unicode_char())) {
+	    $out .= $thisc;
+	    last if ($thisc eq "\n");
+	}
+	
+	return $out if (length ($out) > 0);
+	return undef;
+    }
+
+    if ($self->{'encoding'} eq "utf8") {
+	# utf-8 line
+	return <$handle>;
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	# unicode line
+	my $c = "";
+	my ($c1, $c2) = ("", "");
+	my $out = "";
+	while (read ($handle, $c, 2) == 2) {
+	    $c1 = ord (substr ($c, 0, 1));
+	    $c2 = ord (substr ($c, 1, 1));
+	    $c = &unicode::unicode2utf8([(($self->{'bigendian'}) ? ($c1*256+$c2) : ($c2*256+$c1))]);
+	    $out .= $c;
+	    last if ($c eq "\n");
+	}
+
+	return $out if (length ($out) > 0);
+	return undef;
+    }
+
+    if ($self->{'encoding'} eq "iso_8859_1") {
+	# we'll use ascii2utf8() for this as it's faster than going
+	# through convert2unicode()
+	my $line = "";
+	if (defined ($line = <$handle>)) {
+	    return &unicode::ascii2utf8 (\$line);
+	}
+    }
+
+    # everything else uses unicode::convert2unicode
+    my $line = "";
+    if (defined ($line = <$handle>)) {
+	return &unicode::unicode2utf8 (&unicode::convert2unicode ($self->{'encoding'}, \$line));
+    }
+
+    return undef;
+}
+
+
+# will convert entire contents of file to utf8 and append result to $outputref
+# this may be a slightly faster way to get the contents of a file than by 
+# recursively calling read_line()
+sub read_file {
+    my $self = shift (@_);
+    my ($outputref) = @_;
+
+    # make sure we have a file handle
+    return if ($self->{'handle'} eq "");
+
+    my $handle = $self->{'handle'};
+
+    if ($self->{'first'} && $self->{'encoding'} eq "utf8") {
+	# special case for the first line of utf8 text to detect whether
+	# the file is in utf8 or unicode
+	
+	# possible to have no text here...
+	my $read_text = $self->read_line ();
+	$$text .= $read_text if (defined($read_text));
+    }
+
+    if ($self->{'encoding'} eq "utf8") {
+	undef $/;
+	$$outputref .=  <$handle>;
+	$/ = "\n";
+	return;
+    }
+
+    if ($self->{'encoding'} eq "unicode") {
+	my $line = "";
+	while (defined ($line = $self->read_line())) {
+	    $$outputref .= $line;
+	}
+	return;
+    }
+
+    if ($self->{'encoding'} eq "iso_8859_1") {
+	# we'll use ascii2utf8() for this as it's faster than going
+	# through convert2unicode()
+	undef $/;
+	my $text = <$handle>;
+	$/ = "\n";
+	$$outputref .= &unicode::ascii2utf8 (\$text);
+	return;
+    }
+
+    # everything else uses unicode::convert2unicode
+    undef $/;
+    my $text = <$handle>;
+    $/ = "\n";
+    $$outputref .= &unicode::unicode2utf8 (&unicode::convert2unicode ($self->{'encoding'}, \$text));
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/muread.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/muread.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/muread.pm	(revision 21083)
@@ -0,0 +1,151 @@
+###########################################################################
+#
+# muread.pm -- read a marked-up file
+#
+# Copyright (C) 1999 DigiLib Systems Limited, NZ
+#
+# 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.
+#
+###########################################################################
+
+
+package muread;
+
+use unicode;
+use multiread;
+
+sub new {
+    my ($class) = @_;
+
+    my $self = {'filename'=>"",
+		'encoding'=>"",
+		'handle'=>"",
+		'reader'=>"",
+		'buffer'=>""};
+
+    return bless $self, $class;
+}
+
+# returns a new tag with a tag name and any options
+sub parse_tag {
+    my $self = shift (@_);
+    my ($orgtagtext) = @_;
+    my $tagtext = $orgtagtext;
+    my $newtag = {};
+    my $misformed = 0;
+
+#    print STDERR "parsing \"$tagtext\"\n";
+
+    # get tag name (if there is one)
+    if ($tagtext =~ /^(\w+)/) {
+	$newtag->{'_tagname'} = $1;
+	$tagtext =~ s/^(\w+)//;
+    } else {
+	print STDERR "muread::parse_tag error - no tag name found\n";
+    }
+
+    # get the tag arguments
+    while ($tagtext =~ /\S/) {
+	$tagtext =~ s/^\s+//s;
+	if ($tagtext =~ /^(\w+)\s*=\s*\"([^\"]*)\"/s) {
+	    $newtag->{$1} = (defined $2) ? $2 : "";
+	    $tagtext =~ s/^\w+\s*=\s*\"[^\"]*\"//s;
+
+	} else {
+	    if (!$misformed) {
+		print STDERR "muread::parse_tag error - miss-formed tag <$orgtagtext>\n";
+		$misformed = 1;
+	    }
+	    $tagtext =~ s/^\S+//s;
+	}
+    }
+
+    return $newtag;
+}
+
+sub read_tag_content {
+    my $self = shift (@_);
+    my ($tag) = @_;
+
+    # all tags contain a _tagname except the tag for the document
+
+    my $line = "";
+    while (1) {
+	# deal with preceeding text
+	if ($self->{'buffer'} =~ /^([^<]+)</s) {
+	    # add preceeding text
+	    $tag->{'_contains'} = [] unless defined $tag->{'_contains'};
+	    push (@{$tag->{'_contains'}}, {'_text'=>$1});
+
+	    $self->{'buffer'} =~ s/^[^<]+</</s;
+	}
+
+	if ($self->{'buffer'} =~ /^<([^>\/]+)>/s) {
+	    # add info from this tag
+	    my $tagtext = $1;
+	    my $newtag = $self->parse_tag ($tagtext);
+	    push (@{$tag->{'_contains'}}, $newtag);
+	    $self->{'buffer'} =~ s/^<[^>\/]+>//s;
+	    
+	    # deal with the contents of this tag
+	    $self->read_tag_content ($newtag);
+
+	} elsif ($self->{'buffer'} =~ /^<\/([^>\/]+)>/s) {
+	    my $tagname = $1;
+	    $self->{'buffer'} =~ s/^<\/[^>\/]+>//s;
+
+	    # check that this tag is the right tag
+	    if (!defined $tag->{'_tagname'} || $tag->{'_tagname'} ne $tagname) {
+		print STDERR "muread::read_tag_content error - mismatched tag </$tagname>, " .
+		    "expected </$tag->{'_tagname'}>\n";
+	    } else {
+		return;
+	    }
+	} elsif (defined ($line = $self->{'reader'}->read_line())) {
+	    $self->{'buffer'} .= $line;
+	} else {
+	    if ($self->{'buffer'} =~ /\S/) {
+		print STDERR "muread::read_tag_content error - can't parse text \"$self->{'buffer'}\"\n";
+	    }
+	    last;
+	}
+    }
+    
+    if (defined $tag->{'_tagname'}) {
+	print STDERR "muread::read_tag_content error - eof reached before closing " .
+	    "tag \"$tag->{'_tagname'}\" found\n";
+    }
+}
+
+sub read_file {
+    my $self = shift (@_);
+    ($self->{'handle'}, $self->{'filename'}, $self->{'encoding'}) = @_;
+    $self->{'encoding'} = "utf8" unless defined $self->{'encoding'};
+
+    my $doc = {};
+
+    # get reader set up
+    $self->{'reader'} = new multiread ();
+    $self->{'reader'}->set_handle ($self->{'handle'});
+    $self->{'reader'}->set_encoding ($self->{'encoding'});
+
+    # read in the file
+    $self->read_tag_content ($doc);
+
+    $self->{'handle'} = "";
+    return $doc;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/parsargv.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/parsargv.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/parsargv.pm	(revision 21083)
@@ -0,0 +1,237 @@
+###########################################################################
+#
+# parseargv.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package parsargv;
+# 
+# parse(ARGVREF, [SPEC, VARREF] ...)
+# 
+# Parse command line arguments.
+# 
+# ARGVREF is an array reference, usually to @ARGV.  The remaining
+# arguments are paired (SPEC, VARREF).  SPEC is a specification string
+# for a particular argument; VARREF is a variable reference that will
+# receive the argument.
+# 
+# SPEC is in one of the following forms:
+# 
+# ARG/REGEX/DEFAULT ARG is the name of command line argument.  REGEX is
+#     a regular expression that gives legal values for the argument.
+#     DEFAULT is the default value assigned to VARREF if the option does
+#     not appear on the command line.  Example
+# 
+# 
+# ARG/REGEX ARG and REGEX are as above.  Since no default is given, ARG
+#     must appear on the command line; if it doesn't, parse() returns 0.
+# 
+# ARG ARG is as above.  ARG is a boolean option.  VARREF is assigned 0 if ARG
+#     is not on the command line; 1 otherwise.
+# 
+# SPEC may start with a punctuation character, in which case this
+# character will be used instead of '/' as a delimiter.  Useful when '/'
+# is needed in the REGEX part.
+# 
+# VARREF is a reference to a scalar or an array.  If VARREF is an array
+# reference, then multiple command line options are allowed an append.  Example:
+# 
+# 	Command line: -day mon -day fri
+# 
+# 	parse(\@ARGV, "day/(mon|tue|wed|thu|fri)", \@days)
+# 
+# 	days => ('mon', 'fri')
+# 
+# Returns 0 if there was an error, nonzero otherwise.
+# 
+
+ 
+ sub parse
+{
+    my $arglist = shift;
+    my ($spec, $var);
+    my %option;
+
+    my @rest = @_;
+
+
+    # if the last argument is the string "allow_extra_options" then options
+    # in \@rest without a corresponding SPEC will be ignored (i.e. the "$arg is
+    # not a valid option" error won't occur)\n";
+    my $allow_extra_options = pop @rest;
+    if (defined ($allow_extra_options)) {
+	if ($allow_extra_options eq "allow_extra_options") {
+	    $allow_extra_options = 1;
+	} else {
+	    # put it back where we got it
+	    push (@rest, $allow_extra_options);
+	    $allow_extra_options = 0;
+	}
+    } else {
+	$allow_extra_options = 0;
+    }
+
+    while (($spec, $var) = splice(@rest, 0, 2))
+        {
+	  
+	die "Variable for $spec is not a valid type."
+	    unless ref($var) eq 'SCALAR' || ref($var) eq 'ARRAY';
+
+	my $delimiter;
+	if ($spec !~ /^\w/)
+	{
+	    $delimiter = substr($spec, 0, 1);
+	    $spec = substr($spec, 1);
+	}
+	else
+	{
+	    $delimiter = '/';
+	}
+	my ($name, $regex, $default) = split(/$delimiter/, $spec, 3);
+	
+	
+	if ($name)
+	{   
+	    if ($default && $default !~ /$regex/)
+	    {
+		die "Default value for $name doesn't match regex ($spec).";
+	    }
+	    $option{$name} = {'name' => $name,
+			      'regex' => $regex,
+			      'default' => $default,
+			      'varref' => $var,
+			      'set' => 0};
+	}
+	else
+	{
+	    die "Invalid argument ($spec) for parsargv.";
+	}
+    }
+
+    my @argv;
+    my $arg;
+    my $parse_options = 1;
+    my $errors = 0;
+
+    while ($arg = shift(@$arglist))
+    {
+	if ($parse_options && $arg eq '--')
+	{
+	    $parse_options = 0;
+	    next;
+	}
+
+	if ($parse_options && $arg =~ /^-+\w/)
+	{
+	    $arg =~ s/^-+//;
+
+	    if (defined $option{$arg})
+	    {
+		&process_arg($option{$arg}, $arglist, \$errors);
+	    }
+	    elsif (!$allow_extra_options)
+	    {
+		print STDOUT "$arg is not a valid option.\n";
+		$errors++;
+	    }
+	}
+	else
+	{
+	    push(@argv, $arg);
+	}
+    }
+    @$arglist = @argv;
+
+    foreach $arg (keys %option)
+    {
+	if ($option{$arg}->{'set'} == 0)
+	{
+	    if (defined $option{$arg}->{'default'})
+	    {
+		&set_var($option{$arg}, $option{$arg}->{'default'});
+	    }
+	    elsif (!$option{$arg}->{'regex'})
+	    {
+		&set_var($option{$arg}, 0)
+	    }
+	    elsif (ref($option{$arg}->{'varref'}) ne 'ARRAY')
+	    {
+		print STDOUT "Missing command line argument -$arg.\n";
+		$errors++;
+	    }
+	}
+    }
+    return $errors == 0;
+}
+
+sub process_arg
+{
+    my ($option, $arglist, $errors) = @_;
+
+    if ($option->{'regex'} && @$arglist > 0 && $arglist->[0] !~ /^-+\w/)
+    {
+	if ($arglist->[0] =~ /$option->{'regex'}/)
+	{
+	    &set_var($option, shift(@$arglist));
+	}
+	else
+	{
+	    print STDOUT  "Bad value for -$option->{'name'} argument.\n";
+	    $$errors++;
+	}
+    }
+    elsif (!$option->{'regex'})
+    {
+	&set_var($option, 1);
+    }
+    else
+    {
+	print STDOUT "No value given for -$option->{'name'}.\n";
+	$$errors++;
+    }
+}
+
+sub set_var
+{
+    my ($option, $value) = @_;
+    my $type = ref($option->{'varref'});
+
+    if ($type eq 'SCALAR')
+    {
+	${$option->{'varref'}} = $value;
+    }
+    elsif ($type eq 'ARRAY')
+    {
+	push(@{$option->{'varref'}}, $value);
+    }
+    $option->{'set'} = 1;
+}
+
+1;
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/perllib/plugin.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugin.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugin.pm	(revision 21083)
@@ -0,0 +1,159 @@
+###########################################################################
+#
+# plugin.pm -- functions to handle using plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package plugin;
+
+require util;
+
+my $stats = {'num_processed' => 0,
+	     'num_blocked' => 0,
+	     'num_not_processed' => 0,
+	     'num_archives' => 0
+	     };
+
+sub load_plugins {
+    my ($plugin_list) = shift @_;
+    ($verbosity, $outhandle, $failhandle) = @_; # globals
+    my @plugin_objects = ();
+
+    $verbosity = 2 unless defined $verbosity;
+    $outhandle = STDERR unless defined $outhandle;
+    $failhandle = STDERR unless defined $failhandle;
+
+    foreach $pluginoptions (@$plugin_list) {
+	my $pluginname = shift @$pluginoptions;
+	next unless defined $pluginname;
+
+	# find the plugin
+	my $colplugname = &util::filename_cat($ENV{'GSDLCOLLECTDIR'},"perllib/plugins", 
+					      "${pluginname}.pm");
+	my $mainplugname = &util::filename_cat($ENV{'GSDLHOME'},"perllib/plugins", 
+					       "${pluginname}.pm");
+	if (-e $colplugname) { require $colplugname; }
+	elsif (-e $mainplugname) { require $mainplugname; }
+	else { die "ERROR - couldn't find plugin \"$pluginname\"\n"; }
+
+	# create a plugin object
+	my ($plugobj);
+	map { $_ = "\"$_\""; } @$pluginoptions;
+	my $options = join (",", @$pluginoptions);
+	$options =~ s/\$/\\\$/g;
+	eval ("\$plugobj = new \$pluginname($options)");
+	die "$@" if $@;
+	
+	# initialize plugin
+	$plugobj->init($verbosity, $outhandle, $failhandle);
+
+	# add this object to the list
+	push (@plugin_objects, $plugobj);
+    }
+
+    return \@plugin_objects;
+}
+
+
+sub begin {
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+
+    map { $_->begin($pluginfo, $base_dir, $processor, $maxdocs); } @$pluginfo;
+}
+
+sub read {
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs, $aux) = @_;
+
+    $maxdocs = -1 unless defined $maxdocs && $maxdocs =~ /\d/;
+    my $rv = 0;
+
+    # the .kill file is a handy (if not very elegant) way of aborting 
+    # an import.pl or buildcol.pl process
+    if (-e &util::filename_cat ($ENV{'GSDLCOLLECTDIR'}, ".kill")) {
+	print $outhandle "Process killed by .kill file\n";
+	die "\n";
+    }
+    
+    # pass this file by each of the plugins in turn until one
+    # is found which will process it
+    foreach $plugobj (@$pluginfo) {
+	$rv = $plugobj->read($pluginfo, $base_dir, $file, 
+			     $metadata, $processor, $maxdocs, $aux);
+	return $rv if defined $rv;
+    }
+
+    if ($verbosity >= 2) {
+	print $outhandle "WARNING - no plugin could process $file\n";
+    }
+    
+    $file =~ s/.*?([^\\\/]+)$/$1/;
+    print $failhandle "$file: no plugin could process this file\n";
+    $stats->{'num_not_processed'} ++;
+
+    return 0;
+}
+
+# write out some general stats that the plugins have compiled - note that
+# the buildcol.pl process doesn't currently call this process so the stats
+# are only output after import.pl -
+sub write_stats {
+    my ($pluginfo, $statshandle) = @_;
+
+    foreach $plugobj (@$pluginfo) {
+	$plugobj->compile_stats($stats);
+    }
+
+    my $total = $stats->{'num_processed'} + $stats->{'num_blocked'} + 
+	$stats->{'num_not_processed'};
+
+    if ($total == 1) {
+	print $statshandle "* 1 document was considered for processing\n";
+    } else {
+	print $statshandle "* $total documents were considered for processing\n";
+    }
+    if ($stats->{'num_archives'}) {
+	print $statshandle "   (including the contents of " . $stats->{'num_archives'} .
+	    " ZIP/TAR archive";
+	if ($stats->{'num_archives'} == 1) {print $statshandle ")\n";}
+	else {print $statshandle "s)\n";}
+    }
+    if ($stats->{'num_processed'} == 1) {
+	print $statshandle "* 1 was processed and included in the collection\n";
+    } else {
+	print $statshandle "* " . $stats->{'num_processed'} . " were processed and included in the collection\n";
+    }
+    if ($stats->{'num_not_processed'}) {
+	if ($stats->{'num_not_processed'} == 1) {
+	    print $statshandle "* 1 was rejected.";
+	} else {
+	    print $statshandle "* " . $stats->{'num_not_processed'} . " were rejected.";
+	} 
+	print $statshandle " See the fail log for a list of rejected documents\n";
+    }
+}
+
+sub end {
+    my ($pluginfo, $processor) = @_;
+    map { $_->end($processor); } @$pluginfo;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/ArcPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ArcPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ArcPlug.pm	(revision 21083)
@@ -0,0 +1,96 @@
+###########################################################################
+#
+# ArcPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# plugin which recurses through an archives.inf file
+# (i.e. the file generated in the archives directory
+# when an import is done), processing each file it finds 
+
+package ArcPlug;
+
+use util;
+use BasPlug;
+use plugin;
+use arcinfo;
+
+BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("ArcPlug", @_);
+
+    return bless $self, $class;
+}
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 1;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $count = 0;
+
+    # see if this has a archives information file within it
+    my $archive_info_filename = &util::filename_cat($base_dir,$file,"archives.inf");
+
+    if (-e $archive_info_filename) {
+
+	# found an archives.inf file
+	print $outhandle "ArcPlug: processing $archive_info_filename\n";
+
+	# read in the archives information file
+	my $archive_info = new arcinfo ();
+	$archive_info->load_info ($archive_info_filename);
+	
+	my $file_list = $archive_info->get_file_list();
+
+	# process each file
+	foreach my $subfile (@$file_list) {
+	    last if ($maxdocs != -1 && $count >= $maxdocs);
+
+	    my $tmp = &util::filename_cat ($file, $subfile->[0]);
+	    next if $tmp eq $file;
+	    # note: metadata is not carried on to the next level
+	    $count += &plugin::read ($pluginfo, $base_dir, $tmp, {}, $processor, $maxdocs);
+	}
+
+	return $count;
+    }
+
+    # wasn't an archives directory, someone else will have to process it
+    return undef;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/BasPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/BasPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/BasPlug.pm	(revision 21083)
@@ -0,0 +1,735 @@
+###########################################################################
+#
+# BasPlug.pm -- base class for all the import plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package BasPlug;
+
+# suppress the annoying "subroutine redefined" warning that various
+# plugins cause under perl 5.6
+$SIG{__WARN__} = sub {warn($_[0]) unless ($_[0] =~ /Subroutine\s+\S+\sredefined/)};
+
+use Kea;
+use parsargv;
+use multiread;
+use encodings;
+use cnseg;
+use acronym;
+use textcat;
+use doc;
+use diagnostics;
+use DateExtract;
+use ghtml;
+
+sub print_general_usage {
+    my ($plugin_name) = @_;
+
+    print STDERR "\n  usage: plugin $plugin_name [options]\n\n";
+
+    print STDERR "   -process_exp      A perl regular expression to match against filenames.\n";
+    print STDERR "                     Matching filenames will be processed by this plugin.\n";
+    print STDERR "                     Each plugin has its own default process_exp. e.g HTMLPlug\n";
+    print STDERR "                     defaults to '(?i)\.html?\$' i.e. all documents ending in\n";
+    print STDERR "                     .htm or .html (case-insensitive).\n\n";
+
+    print STDERR "   -block_exp        Files matching this regular expression will be blocked from\n";
+    print STDERR "                     being passed to any later plugins in the list. This has no\n";
+    print STDERR "                     real effect other than to prevent lots of warning messages\n";
+    print STDERR "                     about input files you don't care about. Each plugin might\n";
+    print STDERR "                     have a default block_exp. e.g. by default HTMLPlug blocks\n";
+    print STDERR "                     any files with .gif, .jpg, .jpeg, .png or .css\n";
+    print STDERR "                     file extensions.\n\n";
+
+
+    print STDERR "   -input_encoding   The encoding of the source documents. Documents will be\n";
+    print STDERR "                     converted from these encodings and stored internally as\n";
+    print STDERR "                     utf8. The default input_encoding is 'auto'. Accepted values\n";
+    print STDERR "                     are:\n";
+
+    print STDERR "                       auto: Use text categorization algorithm to automatically\n";
+    print STDERR "                         identify the encoding of each source document. This\n";
+    print STDERR "                         will be slower than explicitly setting the encoding\n";
+    print STDERR "                         but will work where more than one encoding is used\n";
+    print STDERR "                         within the same collection.\n";
+
+    print STDERR "                       ascii: Plain 7 bit ascii. This may be a bit faster than\n";
+    print STDERR "                         using iso_8859_1. Beware of using this on a collection\n";
+    print STDERR "                         of documents that may contain characters outside the\n";
+    print STDERR "                         plain 7 bit ascii set though (e.g. German or French\n";
+    print STDERR "                         documents containing accents), use iso_8859_1 instead.\n";
+
+    print STDERR "                       utf8: either utf8 or unicode -- automatically detected\n";
+    print STDERR "                       unicode: just unicode\n";
+
+    my $e = $encodings::encodings;
+    foreach my $enc (sort {$e->{$a}->{'name'} cmp $e->{$b}->{'name'}} keys (%$e)) {
+	print STDERR "                       $enc: $e->{$enc}->{'name'}\n";
+    }
+    print STDERR "\n";
+    print STDERR "   -default_encoding Use this encoding if -input_encoding is set to 'auto' and\n";
+    print STDERR "                     the text categorization algorithm fails to extract the\n";
+    print STDERR "                     encoding or extracts an encoding unsupported by Greenstone.\n";
+    print STDERR "                     The default is iso_8859_1.\n\n";
+
+    print STDERR "   -extract_language Identify the language of each document and set 'Language'\n";
+    print STDERR "                      metadata. Note that this will be done automatically if\n";
+    print STDERR "                     -input_encoding is 'auto'.\n\n";
+    print STDERR "   -default_language If Greenstone fails to work out what language a document is\n";
+    print STDERR "                     the 'Language' metadata element will be set to this value.\n";
+    print STDERR "                     The default is 'en' (ISO 639 language symbols are used:\n";
+    print STDERR "                     en = English). Note that if -input_encoding is not set to\n";
+    print STDERR "                     'auto' and -extract_language is not set, all documents will\n";
+    print STDERR "                     have their 'Language' metadata set to this value.\n\n";
+
+    print STDERR "   -extract_acronyms Extract acronyms from within text and set as metadata\n";
+
+    print STDERR "   -markup_acronyms  Add acronym metadata into document text\n\n";
+
+    print STDERR "   -first            Comma separated list of first sizes to extract from the\n";
+    print STDERR "                     text into a metadata field. The field is called 'FirstNNN'.\n\n";
+
+    print STDERR "   -extract_email    Extract email addresses as metadata\n\n";
+
+    print STDERR "   -extract_historical_years Extract time-period information from historical\n";
+    print STDERR "                     documents.  This is stored as metadata with the document.\n";
+    print STDERR "                     There is a search interface for this metadata, which you \n";
+    print STDERR "                     can include in your collection by adding the statement:\n";
+    print STDERR "                           format QueryInterface DateSearch\n";
+    print STDERR "                     to your collection configuration file\n";
+    print STDERR "   -maximum_year     The maximum historical date to be used as metadata (in a\n";
+    print STDERR "                     Common Era date, such as 1950)\n";
+    print STDERR "   -maximum_century  The maximum named century to be extracted as historical\n";
+    print STDERR "                     metadata (e.g. 14 will extract all references up to the\n";
+    print STDERR "                     14th century)\n";
+    print STDERR "   -no_bibliography  Do not try and block bibliographic dates when extracting\n";
+    print STDERR "                     historical dates.\n";
+    print STDERR "   -cover_image      Will look for a prefix.jpg file (where prefix is the same\n";
+    print STDERR "                     prefix as the file being processed) and associate it as a\n";
+    print STDERR "                     cover image\n\n";
+}
+
+# print_usage should be overridden for any sub-classes having 
+# their own plugin specific options
+sub print_usage {
+    print STDERR "\nThis plugin has no plugin specific options\n\n";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $plugin_name = shift (@_);
+    my $self = {};
+    
+    my $enc = "^(";
+    map {$enc .= "$_|";} keys %$encodings::encodings;
+    my $denc = $enc . "ascii|utf8|unicode)\$";
+    $enc .= "ascii|utf8|unicode|auto)\$";
+    
+    $self->{'outhandle'} = STDERR;
+    my $year = (localtime)[5]+1900;
+
+    $self->{'textcat'} = new textcat();
+
+    $self->{'num_processed'} = 0;
+    $self->{'num_not_processed'} = 0;
+    $self->{'num_blocked'} = 0;
+    $self->{'num_archives'} = 0;
+    
+    # general options available to all plugins
+    if (!parsargv::parse(\@_,
+			 q^process_exp/.*/^, \$self->{'process_exp'},
+			 q^block_exp/.*/^, \$self->{'block_exp'},
+			 q^extract_acronyms^, \$self->{'extract_acronyms'}, 
+			 q^extract_keyphrases^, \$self->{'kea'}, #with extra options 
+			 q^extract_keyphrase_options/.*/^, \$self->{'kea_options'}, #no extra options
+			 qq^input_encoding/$enc/auto^, \$self->{'input_encoding'},
+			 qq^default_encoding/$denc/iso_8859_1^, \$self->{'default_encoding'},
+			 q^extract_email^, \$self->{'extract_email'},
+			 q^markup_acronyms^, \$self->{'markup_acronyms'},
+			 q^default_language/.{2}/en^, \$self->{'default_language'},
+			 q^first/.*/^, \$self->{'first'},
+			 q^extract_historical_years^, \$self->{'date_extract'},
+			 qq^maximum_year/\\d{4}/$year^, \$self->{'max_year'},
+			 q^no_bibliography^, \$self->{'no_biblio'},
+			 qq^maximum_century/-?\\d{1,2}( ?B\\.C\\.E\\.)?/-1^, \$self->{'max_century'},
+			 q^cover_image^, \$self->{'cover_image'},
+			 "allow_extra_options")) {
+	
+	print STDERR "\nThe $plugin_name plugin uses an incorrect general option (general options are those\n";
+	print STDERR "available to all plugins). Check your collect.cfg configuration file.\n";
+    	&print_general_usage($plugin_name);
+	die "\n";
+    }
+
+    return bless $self, $class;
+}
+
+# initialize BasPlug options
+# if init() is overridden in a sub-class, remember to call BasPlug::init()
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    # verbosity is passed through from the processor
+    $self->{'verbosity'} = $verbosity;
+
+    # as are the outhandle and failhandle
+    $self->{'outhandle'} = $outhandle if defined $outhandle;
+    $self->{'failhandle'} = $failhandle;
+
+    # set process_exp and block_exp to defaults unless they were
+    # explicitly set
+
+    if ((!$self->is_recursive()) and 
+	(!defined $self->{'process_exp'}) || ($self->{'process_exp'} eq "")) {
+
+	$self->{'process_exp'} = $self->get_default_process_exp ();
+	if ($self->{'process_exp'} eq "") {
+	    warn ref($self) . " Warning: Non-recursive plugin has no process_exp\n";
+	}
+    }
+
+    if ((!defined $self->{'block_exp'}) || ($self->{'block_exp'} eq "")) {
+	$self->{'block_exp'} = $self->get_default_block_exp ();
+    }
+}
+
+sub begin {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $processor, $maxdocs) = @_;
+    $self->initialise_extractors();
+}
+
+sub end {
+    my ($self) = @_;
+    $self->finalise_extractors();
+}
+
+# this function should be overridden to return 1
+# in recursive plugins
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 0; 
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return "";
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return "";
+}
+
+# The BasPlug read() function. This function does all the right things
+# to make general options work for a given plugin. It calls the process()
+# function which does all the work specific to a plugin (like the old
+# read functions used to do). Most plugins should define their own 
+# process() function and let this read() function keep control.
+#
+# recursive plugins (e.g. RecPlug) and specialized plugins like those
+# capable of processing many documents within a single file (e.g.
+# GMLPlug) should normally implement their own version of read()
+#
+# Return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+
+sub read {
+    my $self = shift (@_);  
+  
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+
+    if ($self->is_recursive()) {
+	die "BasPlug::read function must be implemented in sub-class for recursive plugins\n";
+    }
+
+    my $outhandle = $self->{'outhandle'};
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    if ($self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/) {
+	$self->{'num_blocked'} ++;
+	return 0;
+    }
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    # Do encoding stuff
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($filename);
+
+    # create a new document
+    my $doc_obj = new doc ($filename, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Language", $language);
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Encoding", $encoding);
+    my ($filemeta) = $file =~ /([^\\\/]+)$/;
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Source", &ghtml::dmsafe($filemeta));
+    if ($self->{'cover_image'}) {
+	$self->associate_cover_image($doc_obj, $filename);
+    }
+    
+    # read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($filename, $encoding, $language, \$text);
+
+    if (!length ($text)) {
+	my $plugin_name = ref ($self);
+	print $outhandle "$plugin_name: ERROR: $file contains no text\n" if $self->{'verbosity'};
+
+	my $failhandle = $self->{'failhandle'};
+	print $failhandle "$file: " . ref($self) . ": file contains no text\n";
+	$self->{'num_not_processed'} ++;
+
+	return 0;
+    }
+   
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+
+    # do plugin specific processing of doc_obj
+    return undef unless defined ($self->process (\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj));
+   
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+   
+    # add an OID
+    $doc_obj->set_OID();
+
+    # process the document
+    $processor->process($doc_obj);
+
+    $self->{'num_processed'} ++;
+
+    return 1; # processed the file
+}
+
+# returns undef if file is rejected by the plugin
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+
+    die "Basplug::process function must be implemented in sub-class\n";
+
+    return undef; # never gets here
+}
+
+# uses the multiread package to read in the entire file pointed to
+# by filename and loads the resulting text into $$textref. Input text
+# may be in any of the encodings handled by multiread, output text
+# will be in utf8
+sub read_file {
+    my $self = shift (@_);
+    my ($filename, $encoding, $language, $textref) = @_;
+
+    if (!-r $filename)
+    {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "Read permission denied for $filename\n" if $self->{'verbosity'};
+	return;
+    }
+
+    $$textref = "";
+
+    open (FILE, $filename) || die "BasPlug::read_file could not open $filename for reading ($!)\n";
+
+    if ($encoding eq "ascii") {
+	undef $/;
+	$$textref = <FILE>;
+	$/ = "\n";
+    } else {
+	my $reader = new multiread();
+	$reader->set_handle ('BasPlug::FILE');
+	$reader->set_encoding ($encoding);
+	$reader->read_file ($textref);
+
+	if ($language eq "zh") {
+	    # segment the Chinese words
+	    $$textref = &cnseg::segment($$textref);
+	}
+    }
+
+    close FILE;
+}
+
+sub textcat_get_language_encoding {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my ($language, $encoding, $extracted_encoding);
+    if ($self->{'input_encoding'} eq "auto") {
+        # use textcat to automatically work out the input encoding and language
+        ($language, $encoding) = $self->get_language_encoding ($filename);
+    } elsif ($self->{'extract_language'}) {
+        # use textcat to get language metadata
+        ($language, $extracted_encoding) = $self->get_language_encoding ($filename);
+        $encoding = $self->{'input_encoding'};
+        if ($extracted_encoding ne $encoding && $self->{'verbosity'}) {
+	    my $plugin_name = ref ($self);
+	    my $outhandle = $self->{'outhandle'};
+            print $outhandle "$plugin_name: WARNING: $filename was read using $encoding encoding but ";
+            print $outhandle "appears to be encoded as $extracted_encoding.\n";
+        }
+    } else {
+        $language = $self->{'default_language'};
+        $encoding = $self->{'input_encoding'};
+    }
+    return ($language, $encoding);
+}
+
+# Uses textcat to work out the encoding and language of the text in 
+# $filename. All html tags are removed before processing.
+# returns an array containing "language" and "encoding"
+sub get_language_encoding {
+    my $self = shift (@_);
+    my ($filename) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # read in file
+    open (FILE, $filename) || die "BasPlug::get_language_encoding could not open $filename for reading ($!)\n";
+    undef $/;
+    my $text = <FILE>;
+    $/ = "\n";
+    close FILE;
+
+    # remove <title>stuff</title> -- as titles tend often to be in English
+    # for foreign language documents
+    $text =~ s/<title>.*?<\/title>//i;
+
+    # remove all HTML tags
+    $text =~ s/<[^>]*>//sg;
+
+    # get the language/encoding
+    my $results = $self->{'textcat'}->classify(\$text);
+
+    # if textcat returns 3 or less possibilities we'll use the 
+    # first one in the list - otherwise use the defaults
+    if (scalar @$results > 3) {
+	
+	if ($self->{'input_encoding'} ne 'auto') {
+	    if ($self->{'extract_language'} && $self->{'verbosity'}) {
+		print $outhandle "BasPlug: WARNING: language could not be extracted from $filename - ";
+		print $outhandle "defaulting to $self->{'default_language'}\n";
+	    }		
+	    return ($self->{'default_language'}, $self->{'input_encoding'});
+
+	} else {
+	    if ($self->{'verbosity'}) {
+		print $outhandle "BASPlug: WARNING: language/encoding could not be extracted from $filename - ";
+		print $outhandle "defaulting to $self->{'default_language'}/$self->{'default_encoding'}\n";
+	    }
+	    return ($self->{'default_language'}, $self->{'default_encoding'});
+	}
+    }
+
+    # format language/encoding
+    my ($language, $encoding) = $results->[0] =~ /^([^-]*)(?:-(.*))?$/;
+    if (!defined $language) {
+	if ($self->{'verbosity'}) {
+	    print $outhandle "BasPlug: WARNING: language could not be extracted from $filename - ";
+	    print $outhandle "defaulting to $self->{'default_language'}\n";
+	}
+	$language = $self->{'default_language'};
+    }
+    if (!defined $encoding) {
+	if ($self->{'verbosity'}) {
+	    print $outhandle "BasPlug: WARNING: encoding could not be extracted from $filename - ";
+	    print $outhandle "defaulting to $self->{'default_encoding'}\n";
+	}
+	$encoding = $self->{'default_encoding'};
+    }
+
+    if ($encoding !~ /^(ascii|utf8|unicode)$/ &&
+	!defined $encodings::encodings->{$encoding}) {
+	if ($self->{'verbosity'}) {
+	    print $outhandle "BasPlug: WARNING: $filename appears to be encoded in an unsupported encoding ($encoding) - ";
+	    print $outhandle "using $self->{'default_encoding'}\n";
+	}
+	$encoding = $self->{'default_encoding'};
+    }
+
+    return ($language, $encoding);
+}
+
+# add any extra metadata that's been passed around from one
+# plugin to another.
+# extra_metadata uses add_utf8_metadata so it expects metadata values
+# to already be in utf8
+sub extra_metadata {
+    my $self = shift (@_);
+    my ($doc_obj, $cursection, $metadata) = @_;
+
+    foreach my $field (keys(%$metadata)) {
+	# $metadata->{$field} may be an array reference
+	if (ref ($metadata->{$field}) eq "ARRAY") {
+	    map { 
+		$doc_obj->add_utf8_metadata ($cursection, $field, $_); 
+	    } @{$metadata->{$field}};
+	} else {
+	    $doc_obj->add_utf8_metadata ($cursection, $field, $metadata->{$field}); 
+	}
+    }
+}
+
+# initialise metadata extractors
+sub initialise_extractors {
+    my $self = shift (@_);
+
+    if ($self->{'extract_acronyms'} || $self->{'markup_acronyms'}) {
+	&acronym::initialise_acronyms();
+    }
+}
+
+# finalise metadata extractors
+sub finalise_extractors {
+    my $self = shift (@_);
+
+    if ($self->{'extract_acronyms'} || $self->{'markup_acronyms'}) {
+	&acronym::finalise_acronyms();
+    }
+}
+
+# FIRSTNNN: extract the first NNN characters as metadata
+sub extract_first_NNNN_characters {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    
+    foreach my $size (split /,/, $self->{'first'}) {
+	my $tmptext =  $$textref;
+	$tmptext =~ s/^\s+//;
+	$tmptext =~ s/\s+$//;
+	$tmptext =~ s/\s+/ /gs;
+	$tmptext = substr ($tmptext, 0, $size);
+	$tmptext =~ s/\s\S*$/&#8230;/;
+	$doc_obj->add_utf8_metadata ($thissection, "First$size", $tmptext);
+    }
+}
+
+sub extract_email {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle " extracting email addresses ...\n" 
+	if ($self->{'verbosity'} > 2);
+    
+    my @email = ($$textref =~ m/([-a-z0-9\.@+_=]+@(?:[-a-z0-9]+\.)+(?:com|org|edu|mil|int|net|[a-z][a-z]))/g);
+    @email = sort @email;
+    
+    my @email2 = ();
+    foreach my $address (@email) {
+	if (!(join(" ",@email2) =~ m/$address/ )) {
+	    push @email2, $address;
+	    $doc_obj->add_utf8_metadata ($thissection, "emailAddress", $address);
+	    print $outhandle "  extracting $address\n" 
+		if ($self->{'verbosity'} > 3);
+	}
+    }
+    print $outhandle " done extracting email addresses.\n" 
+	if ($self->{'verbosity'} > 2);
+
+}
+
+# extract metadata
+sub auto_extract_metadata { 
+ 
+
+    my $self = shift (@_);
+    my ($doc_obj) = @_;
+    
+    if ($self->{'extract_email'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_email (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    } 
+
+
+#adding kea keyphrases
+    if ($self->{'kea'}) {  
+	
+	my $thissection = $doc_obj->get_top_section();
+	my $text = "";
+	my @list;
+
+	while (defined $thissection) { #loop through sections to gather whole doc
+	    my $sectiontext = $doc_obj->get_text($thissection);   
+	    $text = $text.$sectiontext;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	} 
+       
+	if($self->{'kea_options'}) { #if kea options flag is set, call Kea with specified options 
+	    @list = &Kea::extract_KeyPhrases ($text, $self->{'kea_options'}); 
+	} else { #otherwise call Kea with no options
+	    @list = &Kea::extract_KeyPhrases ($text); 
+	}
+	 
+	if(@list){ #if a list of kea keyphrases was returned (ie not empty)
+	    my $keyphrases = $list[0]; #first arg is keyphrase list
+	    my $stems = $list[1]; #second  arg is stemmed keyphrase list
+	    print STDERR "keyphrases: $keyphrases\n"; 
+	    print STDERR "stems: $stems\n";
+	    $thissection = $doc_obj->get_top_section(); #add metadata to top section
+	    $doc_obj->add_metadata($thissection, "kea", $keyphrases);
+	    $doc_obj->add_metadata($thissection, "stems", $stems); 
+	}
+    } #end of kea 
+
+    if ($self->{'first'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_first_NNNN_characters (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }   
+    
+    if ($self->{'extract_acronyms'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $self->extract_acronyms (\$text, $doc_obj, $thissection) if $text =~ /./;
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+    
+    if ($self->{'markup_acronyms'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    my $text = $doc_obj->get_text($thissection);
+	    $text = $self->markup_acronyms ($text, $doc_obj, $thissection);
+	    $doc_obj->delete_text($thissection);
+	    $doc_obj->add_text($thissection, $text);
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+
+    if($self->{'date_extract'}) {
+	my $thissection = $doc_obj->get_top_section();
+	while (defined $thissection) {
+	    
+	    my $text = $doc_obj->get_text($thissection);
+	    &DateExtract::get_date_metadata($text, $doc_obj, 
+					    $thissection, 
+					    $self->{'no_biblio'}, 
+					    $self->{'max_year'}, 
+					    $self->{'max_century'});
+	    $thissection = $doc_obj->get_next_section ($thissection);
+	}
+    }
+}
+
+# extract acronyms from a section in a document. progress is 
+# reported to outhandle based on the verbosity. both the Acronym
+# and the AcronymKWIC metadata items are created. 
+
+sub extract_acronyms {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle " extracting acronyms ...\n" 
+	if ($self->{'verbosity'} > 2);
+
+    my $acro_array =  &acronym::acronyms($textref);
+    
+    foreach my $acro (@$acro_array) {
+
+	#check that this is the first time ...
+	my $seen_before = "false";
+	my $previous_data = $doc_obj->get_metadata($thissection, "Acronym");
+	foreach my $thisAcro (@$previous_data) {
+	    if ($thisAcro eq $acro->to_string()) {
+		$seen_before = "true";
+		print $outhandle "  already seen ". $acro->to_string() . "\n" 
+		    if ($self->{'verbosity'} >= 4);
+	    } 	    
+	}
+
+	if ($seen_before eq "false") {
+	    #write it to the file ...
+	    $acro->write_to_file();
+
+	    #do the normal acronym
+	    $doc_obj->add_utf8_metadata($thissection, "Acronym",  $acro->to_string());
+	    print $outhandle "  adding ". $acro->to_string() . "\n" 
+		if ($self->{'verbosity'} > 3);
+	    
+	}
+    }
+    print $outhandle " done extracting acronyms. \n" 
+	if ($self->{'verbosity'} > 2);
+}
+
+sub markup_acronyms {
+    my $self = shift (@_);
+    my ($text, $doc_obj, $thissection) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle " marking up acronyms ...\n" 
+	if ($self->{'verbosity'} > 2);
+
+    #self is passed in to check for verbosity ...
+    $text = &acronym::markup_acronyms($text, $self);
+
+    print $outhandle " done marking up acronyms. \n" 
+	if ($self->{'verbosity'} > 2);
+
+    return $text;
+}
+
+sub compile_stats {
+    my $self = shift(@_);
+    my ($stats) = @_;
+
+    $stats->{'num_processed'} += $self->{'num_processed'};
+    $stats->{'num_not_processed'} += $self->{'num_not_processed'};
+    $stats->{'num_archives'} += $self->{'num_archives'};
+
+}
+
+sub associate_cover_image {
+    my $self = shift(@_);
+    my ($doc_obj, $filename) = @_;
+
+    $filename =~ s/\.[^\\\/\.]+$/\.jpg/;
+    if (-e $filename) {
+	$doc_obj->associate_file($filename, "cover.jpg", "image/jpeg");
+    } else {
+	$filename =~ s/jpg$/JPG/;
+	if (-e $filename) {
+	    $doc_obj->associate_file($filename, "cover.jpg", "image/jpeg");
+	}
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/BibTexPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/BibTexPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/BibTexPlug.pm	(revision 21083)
@@ -0,0 +1,556 @@
+###########################################################################
+#
+# BibTexPlug.pm - a plugin for bibliography records in BibTex format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2000 Gordon W. Paynter
+# Copyright 1999-2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+# BibTexPlug reads bibliography files in BibTex format.
+#
+# by Gordon W. Paynter (gwp@cs.waikato.ac.nz), November 2000
+# Based on ReferPlug.  See ReferPlug for geneology.
+#
+# BibTexPlug creates a document object for every reference a the file.
+# It is a subclass of SplitPlug, so if there are multiple records, all
+# are read.
+#
+# Modified Dec 2001 by John McPherson:
+#  *  some modifications submitted by Sergey Yevtushenko
+#                      <sergey@intellektik.informatik.tu-darmstadt.de>
+#  *  some non-ascii char support (ie mostly Latin)
+#  *  The raw ascii bibtex entry is stored as "BibTex" metadata.
+
+package BibTexPlug;
+
+use SplitPlug;
+
+# BibTexPlug is a sub-class of BasPlug.
+sub BEGIN {
+    @ISA = ('SplitPlug');
+}
+
+# This plugin processes files with the suffix ".bib"
+sub get_default_process_exp {
+    return q^(?i)\.bib$^;
+}
+
+# This plugin splits the input text at blank lines
+sub get_default_split_exp {
+    return q^\n+(?=@)^;
+}
+
+
+
+# The process function reads a single bibliographic record and stores
+# it as a new document.
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    $self->{'key'} = "default";
+
+    # Check that we're dealing with a valid BibTex record
+    return undef unless ($$textref =~ /^@\w+\{.*\}/s);
+
+    # Ignore things we can't use
+    return 0 if ($$textref =~ /^\@String/);
+
+    # Report that we're processing the file
+    print $outhandle "BibTexPlug: processing $file\n"
+	if ($self->{'verbosity'}) > 1;
+
+
+    # This hash translates BibTex field names into metadata names.  The
+    # BibTex names are taken from the "Local Guide to Latex" Graeme
+    # McKinstry.  Metadata names are consistent with ReferPlug.
+
+    my %field = (
+		 'address', 'PublisherAddress',
+		 'author', 'Creator',
+		  
+		 'booktitle', 'Booktitle',
+		 'chapter', 'Chapter',
+		 'edition', 'Edition',
+		 'editor', 'Editor', 
+		 'institution', 'Publisher',
+		 'journal', 'Journal',
+		 'month', 'Month',
+		 'number', 'Number',
+		 'pages', 'Pages',
+		 'publisher', 'Publisher',
+		 'school', 'Publisher',
+		 'title', 'Title',
+		 'volume', 'Volume',
+		 'year', 'Date',
+
+		 'keywords', 'Keywords',
+		 'abstract', 'Abstract',
+		 'copyright', 'Copyright'
+);
+
+    # Metadata fields 
+    my %metadata;
+    my ($EntryType, $EntryID, $Creator, $Keywords, $text);
+
+    my $verbosity = $self->{'verbosity'};
+    $verbosity = 0 unless $verbosity;
+
+    my $lines=$$textref;
+
+    # Make sure the text has exactly one entry per line
+
+    $lines  =~ s/^\s*(\@[^,]+,)\s*\n/$1=====/; #splitting key in entry
+    $lines =~ s/([\"\}]\s*,)\s*\n/$1=====/g; #splitting by comma, followed by \n (assuming end of lines are " or })
+    $lines =~ s/(\d+\s*\,)\s*\n/$1=====/g; #for the case, when we have number entry without closing "
+    $lines =~ s/\n\s*\n/%%%%%/g; #this was simply added in order to allow to process newline inside  quoted strings, 
+                                 #that continues for several lines
+    $lines =~ s/\s+/ /g;
+    $lines =~ s/\s*=====\s*/\n/g;
+
+    my @all_lines = split(/\n+/, $lines);
+
+    # Read and process each line in the bib file.
+    my ($entryname, $name, $value, $line);
+    foreach $line (@all_lines) {
+
+	# Add each line.  Most lines consist of a field identifer and
+	# then data, and we simply store them, though we treat some
+	# of the fields a bit differently.
+
+	$line =~ s/\s+/ /g;
+	$text .= "$line\n";
+
+	print "Processing line = $line \n" if $verbosity>=4;
+
+	# The first line is special, it contains the reference type and OID
+	if ($line =~ /\@(\w+)\W*\{\W*([\*\.\w\d:-]+)\W*$/) {
+	    $EntryType = $1;
+	    $EntryID = $2;
+	    print "** $EntryType - \"$EntryID\" \n"
+		if ($verbosity >= 4);
+	    $self->{'key'} = $EntryID;
+	    next;
+	}
+	if ($line =~ /\@/) {
+	    print $outhandle "bibtexplug: suspect line in bibtex file: $line\n"
+		if ($verbosity >= 2);
+	    print $outhandle "bibtexplug: if that's the start of a new bibtex record ammend regexp in bibtexplug::process()\n"
+		if ($verbosity >= 2);
+	}
+	
+	# otherwise, parse the metadata out of this line
+	next unless ($line =~ /^\s*(\w+)\s+=\s+(.*)/);
+	$entryname = lc($1);
+	$value = $2;
+	$value =~ s/,?\s*$//; # remove trailing comma and space
+	if ($value =~ /^"/ && $value =~ /"$/) {
+	    # remove surrounding " marks
+	    $value =~ s/^"//; $value =~ s/"$//;
+	}
+	$value = &process_latex($value);
+
+	# Add this line of metadata
+	$metadata{$entryname} .= "$value\n";
+	   
+    }
+
+    # Add the Entry type as metadata
+    $doc_obj->add_utf8_metadata ($cursection, "EntryType", $EntryType);
+
+    # Add the various field as metadata
+    foreach my $entryname (keys %metadata) {
+	next unless (defined $field{$entryname});
+	next unless (defined $metadata{$entryname});	
+	
+	$name = $field{$entryname};
+	$value = $metadata{$entryname};
+
+	# Add the various fields as metadata	
+ 	my $html_value = &text_into_html($value);
+	$doc_obj->add_utf8_metadata ($cursection, $name, $html_value); 
+
+	# Several special operatons on metadata follow
+	
+	# Add individual keywords.
+	# The full set of keywords will be added, in due course, as "Keywords".
+	# However, we also want to add them as individual "Keyword" metadata elements.
+	if ($entryname eq "keywords") {
+	    my @keywordlist = split(/,/, $value);
+	    foreach my $k (@keywordlist) {
+		$k = lc($k); 
+		$k =~ s/\s*$//; 
+		$k =~ s/^\s*//; 
+		if ($k =~ /\w/) {
+		    $k = &text_into_html($k);
+		    $doc_obj->add_utf8_metadata ($cursection, "Keyword", $k);
+		}
+	    } 
+	}
+	
+	# Add individual authors
+	# The author metadata will be stored as one "Creator" entry, but we
+	# also want to split it into several individual "Author" fields in
+	# "Lastname, Firstnames" format so we can browse it.
+	if ($entryname eq "author") { #added also comparison with editor
+	   
+	    # und here for german language...
+	    # don't use brackets in pattern, else the matched bit becomes
+	    # an element in the list!
+	    my @authorlist = split(/,|\s+and\s+|\s+und\s+/, $value); 
+	    foreach $a (@authorlist) {
+		$a =~ s/\s*$//; 
+		$a =~ s/^\s*//; 
+		# Reformat and add author name
+		next if $a=~ /^\s*$/;
+		my @words = split(/ /, $a);
+		my $lastname = pop @words;
+		my $firstname = join(" ",  @words);
+
+		my $fullname = $lastname . ", " . $firstname;
+
+		# Add each name to set of Authors
+		# force utf8 pragma so that \w matches in this scope
+		use utf8;
+		if ($fullname =~ /\w+, \w+/) {
+		   $doc_obj->add_utf8_metadata ($cursection, "Author", $fullname);
+		}
+	    }
+	}
+
+	# Books and Journals are additionally marked for display purposes
+	if ($entryname eq "booktitle") {
+	    $doc_obj->add_utf8_metadata($cursection, "BookConfOnly", 1);
+	} elsif ($entryname eq "journal") {
+	    $doc_obj->add_utf8_metadata($cursection, "JournalsOnly", 1); 
+	}
+
+    }
+
+    # Add the text in BibTex format (all fields)
+    if ($text =~ /\w/) {
+	$text = &text_into_html($text);
+	$doc_obj->add_utf8_text ($cursection, $text);
+	$doc_obj->add_utf8_metadata($cursection, "BibTex", $text);
+    }
+
+    return 1;
+}
+
+
+
+
+# convert email addresses and URLs into links
+sub convert_urls_into_links{
+   my ($text) = @_;
+ 
+   $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+   $text =~ s/(http:\/\/[\w\d\.\-]+[\/\w\d\.\-]*)/<a href=\"$1">$1<\/a>/g;
+
+   return $text;
+}
+
+# Clean up whitespace and convert \n charaters to <BR> or <P>
+sub clean_up_whitespaces{
+   my ($text) = @_;
+
+   $text =~ s/%%%%%/<BR> <BR>/g;
+   $text =~ s/ +/ /g;
+   $text =~ s/\s*$//; 
+   $text =~ s/^\s*//; 
+   $text =~ s/\n/\n<BR>/g;
+   $text =~ s/<BR>\s*<BR>/<P>/g;
+
+   return $text;
+}
+
+
+sub convert_problem_characters_without_ampersand{
+    my ($text) = @_;
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    
+    $text =~ s/\'\'/\"/g; #Latex -specific conversion
+    $text =~ s/\`\`/\"/g; #Latex -specific conversion
+
+
+    $text =~ s/\"/&quot;/g;
+    $text =~ s/\'/&#8217;/g;
+    $text =~ s/\`/&#8216;/g;
+    $text =~ s/\+/ /g;
+    $text =~ s/\(/ /g;
+    $text =~ s/\)/ /g;
+
+    $text =~ s/\\/\\\\/g;
+
+    $text =~ s/\./\\\./g;
+
+    return $text;
+}
+
+# Convert a text string into HTML.
+
+# The HTML is going to be inserted into a GML file, so we have to be
+# careful not to use symbols like ">", which occurs frequently in email
+# messages (and use &gt instead.
+
+# This function also turns URLs and email addresses into links, and
+# replaces carriage returns with <BR> tags (and multiple carriage returns
+# with <P> tags).
+
+sub text_into_html {
+    my ($text) = @_;
+
+    # Convert problem characters into HTML symbols
+    $text =~ s/&/&amp;/g;
+
+    $text = &convert_problem_characters_without_ampersand( $text );
+
+    # convert email addresses and URLs into links
+    $text = &convert_urls_into_links( $text );
+
+    $text = &clean_up_whitespaces( $text );
+
+    return $text;
+}
+
+
+
+
+# Convert accented characters, remove { }, interprete some commands....
+# Note!! This is not comprehensive! Also assumes Latin -> Unicode!
+sub process_latex {
+    my ($text) = @_;
+      
+    # note - this is really ugly, but it works. There may be a prettier way
+    # of mapping latex accented chars to utf8, but we just brute force it here.
+    # Also, this isn't complete - not every single possible accented letter
+    # is in here yet, but most of the common ones are.
+
+    my %utf8_chars =
+	(
+	 # acutes
+	 '\'a' => chr(0xc3).chr(0xa1),
+	 '\'c' => chr(0xc4).chr(0x87),
+	 '\'e' => chr(0xc3).chr(0xa9),
+	 '\'i' => chr(0xc3).chr(0xad),
+	 '\'l' => chr(0xc3).chr(0xba),
+	 '\'n' => chr(0xc3).chr(0x84),
+	 '\'o' => chr(0xc3).chr(0xb3),
+	 '\'r' => chr(0xc5).chr(0x95),
+	 '\'s' => chr(0xc5).chr(0x9b),
+	 '\'u' => chr(0xc3).chr(0xba),
+	 '\'y' => chr(0xc3).chr(0xbd),
+	 '\'z' => chr(0xc5).chr(0xba),
+	 # graves
+	 '`a' => chr(0xc3).chr(0xa0),
+	 '`A' => chr(0xc3).chr(0x80),
+	 '`e' => chr(0xc3).chr(0xa8),
+	 '`E' => chr(0xc3).chr(0x88),
+	 '`i' => chr(0xc3).chr(0xac),
+	 '`I' => chr(0xc3).chr(0x8c),
+	 '`o' => chr(0xc3).chr(0xb2),
+	 '`O' => chr(0xc3).chr(0x92),
+	 '`u' => chr(0xc3).chr(0xb9),
+	 '`U' => chr(0xc3).chr(0x99),
+	 # circumflex
+	 '^a' => chr(0xc3).chr(0xa2),
+	 '^A' => chr(0xc3).chr(0x82),
+	 '^c' => chr(0xc4).chr(0x89),
+	 '^C' => chr(0xc4).chr(0x88),
+	 '^e' => chr(0xc3).chr(0xaa),
+	 '^E' => chr(0xc3).chr(0x8a),
+	 '^g' => chr(0xc4).chr(0x9d),
+	 '^G' => chr(0xc4).chr(0x9c),
+	 '^h' => chr(0xc4).chr(0xa5),
+	 '^H' => chr(0xc4).chr(0xa4),
+	 '^i' => chr(0xc3).chr(0xae),
+	 '^I' => chr(0xc3).chr(0x8e),
+	 '^j' => chr(0xc4).chr(0xb5),
+	 '^J' => chr(0xc4).chr(0xb4),
+	 '^o' => chr(0xc3).chr(0xb4),
+	 '^O' => chr(0xc3).chr(0x94),
+	 '^s' => chr(0xc5).chr(0x9d),
+	 '^S' => chr(0xc5).chr(0x9c),
+	 '^u' => chr(0xc3).chr(0xa2),
+	 '^U' => chr(0xc3).chr(0xbb),
+	 '^w' => chr(0xc5).chr(0xb5),
+	 '^W' => chr(0xc5).chr(0xb4),
+	 '^y' => chr(0xc5).chr(0xb7),
+	 '^Y' => chr(0xc5).chr(0xb6),
+	 
+	 # diaeresis
+	 '"a' => chr(0xc3).chr(0xa4),
+	 '"A' => chr(0xc3).chr(0x84),
+	 '"e' => chr(0xc3).chr(0xab),
+	 '"E' => chr(0xc3).chr(0x8b),
+	 '"\\\\i' => chr(0xc3).chr(0xaf),
+	 '"\\\\I' => chr(0xc3).chr(0x8f),
+	 '"o' => chr(0xc3).chr(0xb6),
+	 '"O' => chr(0xc3).chr(0x96),
+	 '"u' => chr(0xc3).chr(0xbc),
+	 '"U' => chr(0xc3).chr(0x9c),
+	 '"y' => chr(0xc3).chr(0xbf),
+	 '"Y' => chr(0xc3).chr(0xb8),
+	 # tilde
+	 # caron - handled specially
+#	   ',s' => chr(0xc5).chr(0xa1),
+#	   ',S' => chr(0xc5).chr(0xa5),
+	 # breve
+	 # double acute
+	 # ring
+	 # dot
+	 '\.c' => chr(0xc4).chr(0x8b),
+	 '\.C' => chr(0xc4).chr(0x8a),
+	 '\.e' => chr(0xc4).chr(0x97),
+	 '\.E' => chr(0xc4).chr(0x96),
+	 '\.g' => chr(0xc4).chr(0xa1),
+	 '\.G' => chr(0xc4).chr(0xa0),
+	 '\.I' => chr(0xc4).chr(0xb0),
+	 '\.z' => chr(0xc5).chr(0xbc),
+	 '\.Z' => chr(0xc5).chr(0xbb),
+	 # macron
+	 '=a' => chr(0xc4).chr(0x81),
+	 '=A' => chr(0xc4).chr(0x80),
+	 '=e' => chr(0xc4).chr(0x93),
+	 '=E' => chr(0xc4).chr(0x92),
+	 '=i' => chr(0xc4).chr(0xab),
+	 '=I' => chr(0xc4).chr(0xaa),
+	 '=o' => chr(0xc4).chr(0x8d),
+	 '=O' => chr(0xc4).chr(0x8c),
+	 '=u' => chr(0xc4).chr(0xab),
+	 '=U' => chr(0xc4).chr(0xaa),
+	 
+	 # stroke - handled specially - see below
+	 
+	 # cedilla - handled specially
+	 
+	 );
+    
+# these are one letter latex commands - we make sure they're not a longer
+# command name. eg {\d} is d+stroke, so careful of \d
+    my %special_utf8_chars = 
+	(
+	 # caron
+	 'v n' => chr(0xc5).chr(0x88),
+	 'v N' => chr(0xc5).chr(0x87),
+	 'v s' => chr(0xc5).chr(0xa1),
+	 'v S' => chr(0xc5).chr(0xa5),
+	 # cedilla
+	 'c c' => chr(0xc3).chr(0xa7),
+	 'c C' => chr(0xc3).chr(0x87),
+	 'c g' => chr(0xc4).chr(0xa3),
+	 'c G' => chr(0xc4).chr(0xa2),
+	 'c k' => chr(0xc4).chr(0xb7),
+	 'c K' => chr(0xc4).chr(0xb6),
+	 'c l' => chr(0xc4).chr(0xbc),
+	 'c L' => chr(0xc4).chr(0xbb),
+	 'c n' => chr(0xc5).chr(0x86),
+	 'c N' => chr(0xc5).chr(0x85),
+	 'c r' => chr(0xc5).chr(0x97),
+	 'c R' => chr(0xc5).chr(0x96),
+	 'c s' => chr(0xc5).chr(0x9f),
+	 'c S' => chr(0xc5).chr(0x9e),
+	 'c t' => chr(0xc5).chr(0xa3),
+	 'c T' => chr(0xc5).chr(0xa2),
+	 # double acute / Hungarian accent
+	 'H O' => chr(0xc5).chr(0x90),
+	 'H o' => chr(0xc5).chr(0x91),
+	 'H U' => chr(0xc5).chr(0xb0),
+	 'H u' => chr(0xc5).chr(0xb1),
+	 
+	 # stroke 
+	 'd' => chr(0xc4).chr(0x91),
+	 'D' => chr(0xc4).chr(0x90),
+	 'h' => chr(0xc4).chr(0xa7),
+#	 'H' => chr(0xc4).chr(0xa6), # !! this normally(!!?) means Hung. umlaut
+	 'i' => chr(0xc4).chr(0xb1), # dotless lowercase i
+	 'l' => chr(0xc5).chr(0x82),
+	 'L' => chr(0xc5).chr(0x81),
+	 'o' => chr(0xc3).chr(0xb8),
+	 'O' => chr(0xc3).chr(0x98),
+	 't' => chr(0xc5).chr(0xa7),
+	 'T' => chr(0xc5).chr(0xa6),
+	 # german ss/szlig/sharp s
+	 'ss' => chr(0xc3).chr(0x9f),
+	 );
+    
+    # convert latex-style accented characters.
+    # remove space (if any) between \ and letter to accent (eg {\' a})
+
+    $text =~ s@(\\[`'="])\s(\w)@$1$2@g;
+
+    # remove {} around a single character (eg \'{e})
+    $text =~ s@(\\[`'="\.]){(\w)}@$1$2@g;
+
+    # remove {} around a single character for special 1 letter commands -
+    # need to insert a space. Eg \v{s}  ->  {\v s}
+    $text =~ s@(\\[vcH]){(\w)}@{$1 $2}@;
+
+    # this is slow (go through whole hash for each substitution!) so
+    # only do if the text contains a '\' character. 
+    if ($text =~ m|\\|) {
+      for $latex_code (keys %utf8_chars) {
+	  $text =~ s/\\$latex_code/$utf8_chars{$latex_code}/g;
+      }
+
+      # where the following letter matters (eg "sm\o rrebr\o d", \ss{})
+      # only do the change if immediately followed by a space, }, {, or \
+      for $latex_code (keys %special_utf8_chars) {
+	  $text =~ s/\\${latex_code}([\\\s\{\}])/$special_utf8_chars{$latex_code}$1/g;
+      }
+    }
+
+    # remove latex commands
+    $text =~ s@\\\w+{([^}]*)}@$1@g;
+
+    # remove latex groupings { } (but not \{ or \} )
+    $text =~ s/([^\\])\{/$1/g;
+    $text =~ s/([^\\])\}/$1/g;
+    $text =~ s/^{//; # remove { if first char
+
+    # maths mode $...$ - this is not interpreted in any way at the moment...
+    $text =~ s@\$(.*)\$@$1@g;
+
+    # quoted { } chars
+    $text =~ s@\\{@{@g;
+    $text =~ s@\\}@}@g;
+
+    return $text;
+}
+
+
+sub set_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $segment_number) = @_;
+    
+    if ( $self->{'key'} eq "default") {
+	$doc_obj->set_OID();
+    } else {
+	$doc_obj->set_OID($self->{'key'});
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/BookPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/BookPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/BookPlug.pm	(revision 21083)
@@ -0,0 +1,215 @@
+###########################################################################
+#
+# BookPlug.pm (formally called HBSPlug) -- plugin for processing simple
+# html (or text) books
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# creates multi-level document from document containing 
+# <<TOC>> level tags. Metadata for each section is taken from any
+# other tags on the same line as the <<TOC>>. e.g. <<Title>>xxxx<</Title>>
+# sets Title metadata.
+
+# Everything else between TOC tags is treated as simple html (i.e. no 
+# processing of html links or any other HTMLPlug type stuff is done).
+
+# expects input files to have a .hb file extension by default (this can be 
+# changed by adding a -process_exp option
+
+# a file with the same name as the hb file but a .jpg extension is
+# taken as the cover image (jpg files are blocked by this plugin)
+
+# BookPlug is a simplification (and extension) of the HBPlug used
+# by the Humanity Library collections. BookPlug is faster as it expects
+# the input files to be cleaner (The input to the HDL collections
+# contains lots of excess html tags around <<TOC>> tags, uses <<I>>
+# tags to specify images, and simply takes all text between <<TOC>>
+# tags and start of text to be Title metadata). If you're marking up
+# documents to be displayed in the same way as the HDL collections,
+# use this plugin instead of HBPlug.
+
+package BookPlug;
+
+use BasPlug;
+use util;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("BookPlug", @_);
+
+    return bless $self, $class;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^\.jpg$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.hb$^;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "BookPlug: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+    
+    my $cursection = $doc_obj->get_top_section();
+
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $absdir = $filename;
+    $absdir =~ s/[^\/\\]*$//;
+
+    # add the cover image
+    my $coverimage = $filename;
+    $coverimage =~ s/\.[^\.]*$/\.jpg/i;
+    $doc_obj->associate_file($coverimage, "cover.jpg", "image/jpeg");
+
+    my $title = "";
+
+    # remove any leading rubbish
+    $$textref =~ s/^.*?(<<TOC)/$1/ios;
+    
+    my $curtoclevel = 1;
+    my $firstsection = 1;
+    my $toccount = 0;
+    while ($$textref =~ /\w/) {
+	$$textref =~ s/^<<TOC(\d+)>>([^\n]*)\n(.*?)(<<TOC|\Z)/$4/ios;
+	my $toclevel = $1;
+	my $metadata = $2;
+	my $sectiontext = $3;
+
+	if ($toclevel == 2) {
+	    $toccount ++;
+	}
+	
+	# close any sections below the current level and
+	# create a new section (special case for the firstsection)
+	while (($curtoclevel > $toclevel) ||
+	       (!$firstsection && $curtoclevel == $toclevel)) {
+	    $cursection = $doc_obj->get_parent_section ($cursection);
+	    $curtoclevel--;
+	}
+	if ($curtoclevel+1 < $toclevel) {
+	    print $outhandle "WARNING - jump in toc levels in $filename " . 
+		"from $curtoclevel to $toclevel\n";
+	}
+	while ($curtoclevel < $toclevel) {
+	    $curtoclevel++;
+	    $cursection = 
+		$doc_obj->insert_section($doc_obj->get_end_child($cursection));
+	}
+
+	# sort out metadata
+	while ($metadata =~ s/^.*?<<([^>]*)>>(.*?)<<[^>]*>>//) {
+	    my $metakey = $1;
+	    my $metavalue = $2;
+
+	    if ($metavalue ne "" && $metakey ne "") {
+		# make sure key fits in with gsdl naming scheme 
+		$metakey =~ tr/[A-Z]/[a-z]/;
+		$metakey = ucfirst ($metakey);
+		$doc_obj->add_utf8_metadata ($cursection, $metakey, $metavalue);
+	    }
+	}
+
+	# remove header rubbish
+	$sectiontext =~ s/^.*?<body[^>]*>//ios;
+
+	# and any other unwanted tags
+	$sectiontext =~ s/<(\/p|\/html|\/body)>//isg;
+
+	# fix up the image links
+	$sectiontext =~ s/(<img[^>]*?src\s*=\s*\"?)([^\">]+)(\"?[^>]*>)/
+	    &replace_image_links($absdir, $doc_obj, $1, $2, $3)/isge;
+
+	# add the text
+	$doc_obj->add_utf8_text($cursection, $sectiontext);
+
+	$firstsection = 0;
+
+	$$textref =~ s/^\s+//s;
+    }
+
+    return 1;
+}
+
+sub replace_image_links {
+    my ($dir, $doc_obj, $front, $link, $back) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my ($filename, $error);
+    my $foundimage = 0;
+    
+    $link =~ s/\/\///;
+    my ($imagetype) = $link =~ /([^\.]*)$/;
+    $imagetype =~ tr/[A-Z]/[a-z]/;
+    if ($imagetype eq "jpg") {$imagetype = "jpeg";}
+    if ($imagetype !~ /^(jpeg|gif|png)$/) {
+	print $outhandle "BookPlug: Warning - unknown image type ($imagetype)\n";
+    }
+    my ($imagefile) = $link =~ /([^\/]*)$/;
+    my ($imagepath) = $link =~ /^[^\/]*(.*)$/;
+
+    if (defined $imagepath && $imagepath =~ /\w/) {
+	# relative link
+	$filename = &util::filename_cat ($dir, $imagepath);
+	if (-e $filename) {
+	    $doc_obj->associate_file ($filename, $imagefile, "image/$imagetype");
+	    $foundimage = 1;
+	} else {
+	    $error = "BookPlug: Warning - couldn't find image file $imagefile in either $filename or";
+	}
+    }
+
+    if (!$foundimage) {
+	$filename = &util::filename_cat ($dir, $imagefile);
+	if (-e $filename) {
+	    $doc_obj->associate_file ($filename, $imagefile, "image/$imagetype");    
+	    $foundimage = 1;
+	} elsif (defined $error) {
+	    print $outhandle "$error $filename\n";
+	} else {
+	    print $outhandle "BookPlug: Warning - couldn't find image file $imagefile in $filename\n";
+	}
+    }
+
+    if ($foundimage) {
+	return "${front}_httpdocimg_/${imagefile}${back}";
+    } else {
+	return "";
+    }
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/ConvertToPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ConvertToPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ConvertToPlug.pm	(revision 21083)
@@ -0,0 +1,342 @@
+###########################################################################
+#
+# ConvertToPlug.pm -- plugin that inherits from HTML or TEXT Plug, depending
+#                     on plugin argument convert_to
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# The plugin is inherited by such plugins as WordPlug and PDFPlug.
+# It facilitates the conversion of these document types to either HTML
+# or TEXT by setting up variable that instruct ConvertToBasPlug
+# how to work.
+
+# It works by dynamically inheriting HTMLPlug or TEXTPlug based on
+# the plugin argument 'convert_to'.  If the argument is not present,
+# the default is to inherit HTMLPlug.
+
+
+package ConvertToPlug;
+
+use BasPlug;
+use HTMLPlug;
+use TEXTPlug;
+use ghtml;
+
+sub BEGIN {
+    @ISA = ('HTMLPlug');
+#    @ISA = ('HTMLPlug', 'TEXTPlug');
+#    @ISA = ('BasPlug'); #, 'HTMLPlug', 'TEXTPlug');
+}
+
+sub print_usage {
+    my ($plugin_name) = @_;
+    
+    # for when this function is called directly by pluginfo.pl
+    if (ref ($plugin_name)) {
+	$plugin_name = ref ($plugin_name);
+    }
+
+    print STDERR "\n  usage: plugin $plugin_name [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -convert_to (html|text) plugin converts to TEXT or HTML\n";
+    print STDERR "                           (default html)\n";
+}
+
+sub parse_args
+{
+    my $class = shift (@_);
+    my ($args) = @_;
+
+    my $plugin_name = $class;
+    $plugin_name =~ s/\.pm$//;
+
+    my $generate_format;
+    my $kea_arg;
+
+    if (!parsargv::parse($args,  
+			 q^extract_keyphrases^, \$kea_arg->{'kea'}, #with extra options 
+			 q^extract_keyphrase_options/.*/^, \$kea_arg->{'kea_options'}, #no extra options
+			 q^convert_to/(html|text)/html^, \$generate_format,
+			 "allow_extra_options")) {
+
+	print STDERR "\nIncorrect options passed to $plugin_name, ";
+	print STDERR "check your collect.cfg configuration file\n";
+	&print_usage($plugin_name);
+	die "\n";
+    }
+   
+    return ($plugin_name,$generate_format, $kea_arg);
+}
+
+sub new {
+    my $class = shift (@_);
+    if ($class eq "ConvertToPlug") {$class = shift (@_);}
+    my $self;
+    # parsargv::parse might modify the list, so we do this by creating a copy
+    # of the argument list.
+    my @arglist = @_;
+    my ($plugin_name, $generate_format, $kea_arg) = $class->parse_args(\@_);
+
+    if ($class eq "PDFPlug" && $generate_format eq "text" && 
+	$ENV{'GSDLOS'} =~ /^windows$/i) {
+	print STDERR "Windows does not support pdf to text. PDFs will be converted to HTML instead\n";
+	$generate_format = "html";
+    }
+
+    if ($generate_format eq "text")
+    {
+	$self = new TEXTPlug ($class, @arglist);
+	$self->{'convert_to'} = "TEXT";
+	$self->{'convert_to_ext'} = "txt";
+    }
+    else
+    {
+	$self = new HTMLPlug ($class, @arglist);
+	$self->{'convert_to'} = "HTML";
+	$self->{'convert_to_ext'} = "html";
+
+	$self->{'rename_assoc_files'} = 1;
+	$self->{'metadata_fields'} .= ",GENERATOR";
+    }
+
+    #if kea data to be extracted...
+    $self->{'kea'} = 1 if($kea_arg->{'kea'});
+    $self->{'kea_options'} = 1 if($kea_arg->{'kea_options'});
+ 
+    return bless $self, $class;
+}
+
+
+
+# Run conversion utility on the input file.  
+#
+# The conversion takes place in a collection specific 'tmp' directory so 
+# that we don't accidentally damage the input.
+#
+# The desired output type is indicated by $output_ext.  This is usually
+# something like "html" or "word", but can be "best" (or the empty string)
+# to indicate that the conversion utility should do the best it can.
+
+sub tmp_area_convert_file {
+    my $self = shift (@_);
+    my ($output_ext, $input_filename, $textref) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    my $convert_to = $self->{'convert_to'};
+    my $failhandle = $self->{'failhandle'};
+
+    # softlink to collection tmp dir
+    my $tmp_dirname 
+	= &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+    &util::mk_dir($tmp_dirname) if (!-e $tmp_dirname);
+
+    # derive tmp filename from input filename
+    my ($tailname, $dirname, $suffix)
+	= &File::Basename::fileparse($input_filename, "\\.[^\\.]+\$");
+
+    # Remove any white space from filename -- no risk of name collision, and
+    # makes later conversion by utils simpler. Leave spaces in path...
+    $tailname =~ s/\s+//g; 
+
+    my $tmp_filename = &util::filename_cat($tmp_dirname, "$tailname$suffix");
+
+    &util::soft_link($input_filename, $tmp_filename);
+
+    my $verbosity = $self->{'verbosity'};
+    if ($verbosity > 0) {
+	print $outhandle "Converting $tailname$suffix to $convert_to format\n";
+    }
+
+    my $errlog = &util::filename_cat($tmp_dirname, "err.log");
+    
+    # Execute the conversion command and get the type of the result,
+    # making sure the converter gives us the appropriate output type
+    my $output_type = lc($convert_to);
+    my $cmd = "perl -S gsConvert.pl -verbose $verbosity -errlog \"$errlog\" -output $output_type \"$tmp_filename\"";
+    $output_type = `$cmd`;
+
+    # remove symbolic link to original file
+    &util::rm($tmp_filename);
+
+    # Check STDERR here
+    chomp $output_type;
+    if ($output_type eq "fail") {
+	print $outhandle "Could not convert $tailname$suffix to $convert_to format\n";
+	print $failhandle "$tailname$suffix: " . ref($self) . " failed to convert to $convert_to\n";
+	$self->{'num_not_processed'} ++;
+	if (-s "$errlog") {
+	    open(ERRLOG, "$errlog");
+	    while (<ERRLOG>) {
+		print $outhandle "$_";
+	    }
+	    print $outhandle "\n";
+	    close ERRLOG;
+	}
+	&util::rm("$errlog") if (-e "$errlog");
+	return "";
+    }
+
+    # store the *actual* output type and return the output filename
+    # it's possible we requested conversion to html, but only to text succeeded
+
+    $self->{'convert_to_ext'} = $output_type;
+    if ($output_type =~ /html/i) {
+	$self->{'converted_to'} = "HTML";
+    } elsif ($output_type =~ /te?xt/i) {
+	$self->{'converted_to'} = "TEXT";
+    }
+    my $output_filename = $tmp_filename;
+
+    $output_filename =~ s/$suffix$/.$output_type/;
+
+    return $output_filename;
+}
+
+
+# Remove collection specific tmp directory and all its contents.
+
+sub cleanup_tmp_area {
+    my $self = shift (@_);
+
+    my $tmp_dirname 
+	= &util::filename_cat($ENV{'GSDLCOLLECTDIR'}, "tmp");
+    &util::rm_r($tmp_dirname);
+    &util::mk_dir($tmp_dirname);
+}
+
+
+
+
+# Override BasPlug read
+# We don't want to get language encoding stuff until after we've converted
+# our file to either TEXT or HTML.
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+#    if ($self->is_recursive()) {
+#        die "BasPlug::read function must be implemented in sub-class for recursive plugins\n";
+#    }
+
+    my $outhandle = $self->{'outhandle'};
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    if ($self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/) {
+	$self->{'num_blocked'} ++;
+	return 0;
+    }
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+        return undef;
+    }
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    # read in file ($text will be in utf8)
+    my $text = "";
+
+    my $output_ext = $self->{'convert_to_ext'};
+    my $conv_filename = $self->tmp_area_convert_file($output_ext, $filename);
+
+    if ("$conv_filename" eq "") {return 0;} # allows continue on errors
+    if (! -e "$conv_filename") {return 0;} # allows continue on errors
+    $self->{'conv_filename'} = $conv_filename;
+
+    # Do encoding stuff
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($conv_filename);
+
+    &BasPlug::read_file($self, $conv_filename, $encoding, $language, \$text);
+    if (!length ($text)) {
+	my $plugin_name = ref ($self);
+        print $outhandle "$plugin_name: ERROR: $file contains no text\n" if $self->{'verbosity'};
+        return 0;
+    }
+
+    # create a new document
+    my $doc_obj = new doc ($conv_filename, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Language", $language);
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Encoding", $encoding);
+    my ($filemeta) = $file =~ /([^\\\/]+)$/;
+    $doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Source", &ghtml::dmsafe($filemeta));
+    if ($self->{'cover_image'}) {
+	$self->associate_cover_image($doc_obj, $filename);
+    }
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+    # do plugin specific processing of doc_obj
+    return undef unless defined ($self->process (\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj));
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+    # add an OID
+    $doc_obj->set_OID();
+    # process the document
+    $processor->process($doc_obj);
+    $self->cleanup_tmp_area();
+
+    $self->{'num_processed'} ++;
+
+    return 1;
+}
+
+
+# do plugin specific processing of doc_obj for HTML type
+sub process_type {
+    my $self = shift (@_);
+    my ($doc_ext, $textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    
+    my $conv_filename = $self->{'conv_filename'};
+    my $tmp_dirname = File::Basename::dirname($conv_filename);
+    my $tmp_tailname = File::Basename::basename($conv_filename);
+    
+    my $converted_to = $self->{'converted_to'};
+    my $ret_val;    
+
+    if ($converted_to eq "TEXT")
+    {
+
+	$ret_val = &TEXTPlug::process($self, $textref, $pluginfo,
+				      $tmp_dirname, $tmp_tailname,
+				      $metadata, $doc_obj);
+    }
+    else
+    {
+	$ret_val = &HTMLPlug::process($self, $textref, $pluginfo,
+				      $tmp_dirname, $tmp_tailname,
+				      $metadata, $doc_obj);
+    }
+
+    # associate original file with doc object
+    my $cursection = $doc_obj->get_top_section();
+    my $filename = &util::filename_cat($base_dir, $file);
+    $doc_obj->associate_file($filename, "doc.$doc_ext", undef, $cursection);
+
+    my $doclink = "<a href=\"_httpcollection_/index/assoc/[archivedir]/doc.$doc_ext\">";
+    $doc_obj->add_utf8_metadata ($cursection, "srclink",  $doclink); 
+    $doc_obj->add_utf8_metadata ($cursection, "srcicon",  "_icon".$doc_ext."_"); 
+    $doc_obj->add_utf8_metadata ($cursection, "/srclink", "</a>"); 
+    return $ret_val;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/EMAILPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/EMAILPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/EMAILPlug.pm	(revision 21083)
@@ -0,0 +1,796 @@
+###########################################################################
+#
+# EMAILPlug.pm - a plugin for parsing email files
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+
+# EMAILPlug
+#
+# by Gordon Paynter (gwp@cs.waikato.ac.nz)
+#
+# Email plug reads email files.  These are named with a simple
+# number (i.e. as they appear in maildir folders) or with the 
+# extension .mbx (for mbox mail file format)
+#
+# Document text:
+#   The document text consists of all the text 
+#   after the first blank line in the document.
+#
+# Metadata (not Dublin Core!):
+#   $Headers      All the header content
+#   $Subject      Subject: header
+#   $To           To: header
+#   $From         From: header
+#   $FromName     Name of sender (where available)
+#   $FromAddr     E-mail address of sender
+#   $DateText     Date: header
+#   $Date         Date: header in GSDL format (eg: 19990924)
+#
+#   $Title	  made up of Subject, Date and Sender (for default formatting)
+#
+#
+# John McPherson - June/July 2001
+# added (basic) MIME support and quoted-printable and base64 decodings.
+# Minor fixes for names that are actually email addresses (ie <...> was lost)
+#
+# See:  * RFC 822  - ARPA Internet Text Messages
+#       * RFC 2045 - Multipurpose Internet Mail Extensions (MIME) -part1
+#       * RFC 2046 - MIME (part 2)  Media Types (and multipart messages)
+#       * RFC 2047 - MIME (part 3)  Message Header Extensions
+#       * RFC 1806 - Content Dispositions (ie inline/attachment)
+package EMAILPlug;
+
+use SplitPlug;
+
+use unicode;
+
+use sorttools;
+use util;
+
+
+# EMAILPlug is a sub-class of SplitPlug.
+
+sub BEGIN { 
+    @ISA = ('SplitPlug');
+}
+
+# Create a new EMAILPlug object with which to parse a file.
+# Accomplished by creating a new BasPlug and using bless to 
+# turn it into an EMAILPlug.
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("EMAILPlug", @_);
+    # this might not actually be true at read-time, but after processing
+    # it should all be utf8.
+    $self->{'input_encoding'}="utf8";
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    # mbx/email for mailbox file format, \d+ for maildir (each message is
+    # in a separate file, with a unique number for filename)
+    # mozilla and IE will save individual mbx format files with a ".eml" ext.
+    return q@([\\/]\d+|\.(mbx|email|eml))$@;
+}
+
+# This plugin splits the mbox mail files at lines starting with From<sp>
+# It is supposed to be "\n\nFrom ", but this isn't always used.
+sub get_default_split_exp {
+    return q^\nFrom .*\n^;
+}
+
+
+# do plugin specific processing of doc_obj
+sub process {
+
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Check that we're dealing with a valid mail file
+    # mbox message files start with "From "
+    # maildir messages usually start with Return-Path and Delivered-To
+    # mh is very similar to maildir
+    my $startoffile=substr($$textref,0,256);
+    if (($startoffile !~ /^(From )/) &&
+	($startoffile !~ /^(From|To|Envelope.*|Received|Return-Path|Date|Subject|Content\-.*|MIME-Version|Forwarded):/im)) {
+	return undef;
+    }
+
+
+    print $outhandle "EMAILPlug: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+
+    my $cursection = $doc_obj->get_top_section();
+
+    #
+    # Parse the document's text and extract metadata
+    #
+
+    # Protect backslashes
+    $$textref =~ s@\\@\\\\@g;
+
+    # Separate header from body of message
+    my $Headers = $$textref;
+    $Headers =~ s/\r?\n\r?\n(.*)$//s;
+    $$textref = $1;
+    
+    # See if headers include non-ascii - RFC says whole header should be ascii.
+# not yet implemented, as we don't know what character set is the
+# user's default... We can do textcat to guess, or we can just choose
+# one of the charset fields later in the document (if there are any...)
+#    if ($Headers =~ /([[:^ascii:]])/) {
+#    }
+
+    # Unfold headers - see rfc822
+    $Headers =~ s/\r?\n[\t\ ]+/ /gs;
+    # Extract basic metadata from header
+    my @headers = ("From", "To", "Subject", "Date");
+    my %raw;
+    foreach my $name (@headers) {
+	$raw{$name} = "No $name value";
+    }
+
+    # Examine each line of the headers
+    my ($line, $name, $value);
+    my @parts;
+    foreach $line (split(/\n/, $Headers)) {
+	
+	# Ignore lines with no content or which begin with whitespace
+	next unless ($line =~ /:/);
+	next if ($line =~ /^\s/);
+
+	# Find out what metadata is on this line
+	@parts = split(/:/, $line);
+	$name = shift @parts;
+# uppercase the first character according to the current locale
+	$name=~s/(.+)/\u$1/;
+	next unless $name;
+	next unless ($raw{$name});
+
+	# Find the value of that metadata
+	$value = join(":", @parts);
+	$value =~ s/^\s+//;
+	$value =~ s/\s+$//;
+
+	# decode headers if stored using =?<charset>?[BQ]?<data>?= (rfc2047)
+	if ($value =~ /=\?/) {
+	    my $original_value=$value;
+	    my $encoded=$value;
+	    $value="";
+	    # this isn't quite right yet regarding spaces between encoded-texts
+	    # (see examples, section 8. of rfc).
+	    while ($encoded =~ s/(.*?)=\?([^\?]*)\?([bq])\?([^\?]+)\?=\s*//i) {
+		my ($charset, $encoding, $data)=($2,$3,$4);
+		my ($decoded_data);
+		$value.="$1"; # any leading chars
+		$data=~s/^\s*//; $data=~s/\s*$//; # strip whitespace from ends
+		chomp $data;
+		$encoding =~ tr/BQ/bq/;
+		if ($encoding eq "q") { # quoted printable
+		    $data =~ s/_/\ /g;  # from rfc2047 (sec 4.2.2)
+		    $decoded_data=qp_decode($data);
+		} else { # base 64
+		    $decoded_data=base64_decode($data);
+		}
+		$self->convert2unicode($charset, \$decoded_data);
+		$value .= $decoded_data;
+	      } # end of while loop
+
+	    # get any trailing characters
+	    $self->convert2unicode("iso_8859_1", \$encoded);
+	    $value.=$encoded;
+
+	    if ($value =~ /^\s*$/) { # we couldn't extract anything...
+	      $self->convert2unicode("iso_8859_1", \$original_value);
+	      $value=original_value;
+	    }
+	} # end of if =?...?=
+	
+	# Store the metadata
+	$raw{$name} = $value;
+    }
+
+    # Extract the name and e-mail address from the From metadata
+    $frommeta = $raw{"From"};
+    my $fromnamemeta;
+    my $fromaddrmeta;
+
+    $frommeta =~ s/\s*$//;  # Remove trailing space, if any
+
+    if ($frommeta =~ m/(.+)\s*<(.+)>/) {
+	$fromnamemeta=$1;
+	$fromaddrmeta=$2;
+    } elsif ($frommeta =~ m/(.+@.+)\s+\((.*)\)/) {
+	$fromnamemeta=$2;
+	$fromaddrmeta=$1;
+    } 
+    if (!defined($fromaddrmeta)) {
+	$fromaddrmeta=$frommeta;
+    }
+    $fromaddrmeta=~s/<//; $fromaddrmeta=~s/>//;
+    # minor attempt to prevent spam-bots from harvesting addresses...
+    $fromaddrmeta=~s/@/&#64;/;
+    $doc_obj->add_utf8_metadata ($cursection, "FromAddr", $fromaddrmeta);
+
+    if (defined($fromnamemeta)) {
+	$fromnamemeta =~ s/\"//g;
+    }
+    else {
+	$fromnamemeta = $fromaddrmeta;
+    }
+    # if name is an address
+    $fromnamemeta =~ s/<//g; $fromnamemeta =~ s/>//g;
+    $fromnamemeta=~s/@/&#64\;/;
+    $doc_obj->add_utf8_metadata ($cursection, "FromName", $fromnamemeta);
+
+    $raw{"From"}=$frommeta;
+
+    # Process Date information
+    if ($raw{"Date"} !~ /No Date/) {
+	$raw{"DateText"} = $raw{"Date"};
+	
+	# Convert the date text to internal date format
+	$value = $raw{"Date"};
+	my ($day, $month, $year) = $value =~ /(\d?\d)\s([A-Z][a-z][a-z])\s(\d\d\d?\d?)/;
+	if ($year < 100) { $year += 1900; }
+	$raw{"Date"} = &sorttools::format_date($day, $month, $year);
+	
+    } else {
+	# We have not extracted a date
+	$raw{"DateText"} = "Unknown.";
+	$raw{"Date"} = "19000000";
+    }
+
+    # Add extracted metadata to document object
+    foreach my $name (keys %raw) {
+	$value = $raw{$name};
+	if ($value) {
+	    # assume subject, etc headers have no special HTML meaning.
+	    $value = &text_into_html($value);
+	    # escape [] so it isn't re-interpreted as metadata
+	    $value =~ s/\[/&#91;/g; $value =~ s/\]/&#93;/g;
+	} else {
+	    $value = "No $name field";
+	}
+	$doc_obj->add_utf8_metadata ($cursection, $name, $value);
+    }
+
+    my $mimetype="text/plain";
+    my $mimeinfo="";
+    my $charset = "iso_8859_1";
+    # Do MIME and encoding stuff. Allow \s in mimeinfo in case there is
+    # more than one parameter given to Content-type.
+    # eg: Content-type: text/plain; charset="us-ascii"; format="flowed"
+    if ($Headers =~ /^content\-type:\s*([\w\/\-]+)\s*(\;\s*.*)\s*$/mi)
+	{
+	    $mimetype=$1;
+	    $mimetype =~ tr/[A-Z]/[a-z]/;
+
+	    if ($mimetype eq "text") { # for pre-RFC2045 messages (c. 1996)
+		$mimetype = "text/plain";
+	    }
+
+	    $mimeinfo=$2;
+	    if (!defined $mimeinfo) {
+		$mimeinfo="";
+	    } else { # strip leading and trailing stuff
+		$mimeinfo =~ s/^\;\s*//;
+		$mimeinfo =~ s/\s*$//;
+	    }
+	    if ($mimeinfo =~ /charset=\"([^\"]+)\"/i) {
+	      $charset = $1;
+	    }
+	}
+
+    my $transfer_encoding="7bit";
+    if ($Headers =~ /^content-transfer-encoding:\s*([^\s]+)\s*$/mi) {
+	$transfer_encoding=$1;
+    }
+    if ($mimetype eq "text/html") {
+	$$textref= $self->text_from_part("$Headers\n$$textref");
+    } elsif ($mimetype ne "text/plain") {
+	$$textref= $self->text_from_mime_message($mimetype,$mimeinfo,$$textref,
+						 $outhandle);
+    } elsif ($transfer_encoding =~ /quoted\-printable/) {
+	$$textref=qp_decode($$textref);
+	$self->convert2unicode($charset, $textref);
+    } elsif ($transfer_encoding =~ /base64/) {
+	$$textref=base64_decode($$textref);
+	$self->convert2unicode($charset, $textref);
+    } else {
+	$self->convert2unicode($charset, $textref);
+    }
+    
+
+    # Add "All headers" metadata
+    $Headers = &text_into_html($Headers);
+
+    $Headers = "No headers" unless ($Headers =~ /\w/);
+    $Headers =~ s/@/&#64\;/g;
+    # escape [] so it isn't re-interpreted as metadata
+    $Headers =~ s/\[/&#91;/g; $Headers =~ s/\]/&#93;/g;
+
+    $doc_obj->add_utf8_metadata ($cursection, "Headers", $Headers);
+
+
+    # Add Title metadata
+    my $Title = text_into_html($raw{'Subject'});
+    $Title .= "<br>From: " . text_into_html($raw{'From'});
+    $Title .= "<br>Date: " . text_into_html($raw{'DateText'});
+    $Title =~ s/\[/&#91;/g; $Title =~ s/\]/&#93;/g;
+
+    $doc_obj->add_utf8_metadata ($cursection, "Title", $Title);
+	
+
+    # Add text to document object
+    if ($mimetype eq "text/plain") {
+	$$textref = &text_into_html($$textref);
+    }
+    $$textref = "No message" unless ($$textref =~ /\w/);
+    $doc_obj->add_utf8_text($cursection, $$textref);
+
+    return 1;
+}
+
+
+# Convert a text string into HTML.
+#
+# The HTML is going to be inserted into a GML file, so 
+# we have to be careful not to use symbols like ">",
+# which ocurs frequently in email messages (and use
+# &gt instead.
+#
+# This function also turns links and email addresses into hyperlinks,
+# and replaces carriage returns with <BR> tags (and multiple carriage
+# returns with <P> tags).
+
+
+sub text_into_html {
+    my ($text) = @_;
+
+    # Convert problem characters into HTML symbols
+    $text =~ s/&/&amp;/go;
+    $text =~ s/</&lt;/go;
+    $text =~ s/>/&gt;/go;
+    $text =~ s/\"/&quot;/go;
+
+    # convert email addresses and URIs into links
+# don't markup email addresses for now
+#    $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+
+    # try to munge email addresses a little bit...
+    $text =~ s/@/&#64;/;
+    # assume hostnames are \.\w\- only, then might have a trailing '/.*'
+    # assume URI doesn't finish with a '.'
+    $text =~ s@((http|ftp|https)://[\w\-]+(\.[\w\-]+)*/?((&amp;|\.)?[\w\?\=\-_/~]+)*)@<a href=\"$1\">$1<\/a>@g;
+
+
+    # Clean up whitespace and convert \n charaters to <BR> or <P>
+    $text =~ s/ +/ /go;
+    $text =~ s/\s*$//o; 
+    $text =~ s/^\s*//o; 
+    $text =~ s/\n/\n<BR>/go;
+    $text =~ s/<BR>\s*<BR>/<P>/go;
+
+    return $text;
+}
+
+
+
+
+#Process a MIME message.
+# the textref we are given DOES NOT include the header.
+sub text_from_mime_message {
+    my $self = shift(@_);
+    my ($mimetype,$mimeinfo,$text,$outhandle)=(@_);
+
+    # Check for multiparts - $mimeinfo will be a boundary
+    if ($mimetype =~ /multipart/) {
+	$boundary="";
+	if ($mimeinfo =~ m@boundary=(\"[^\"]+\"|[^\s]+)\s*$@im) {
+	    $boundary=$1;
+	    if ($boundary =~ m@^\"@) {
+		$boundary =~ s@^\"@@; $boundary =~ s@\"$@@;
+	    }
+	} else {
+	    print $outhandle "EMAILPlug: (warning) couldn't parse MIME boundary\n";
+	}
+	# parts start with "--$boundary"
+	# message ends with "--$boundary--"
+	# RFC says boundary is <70 chars, [A-Za-z'()+_,-./:=?], so escape any
+	# that perl might want to interpolate. Also allows spaces...
+	$boundary=~s/\\/\\\\/g;
+	$boundary=~s/([\?\+\.\(\)\:\/\'])/\\$1/g;
+	my @message_parts = split("\r?\n\-\-$boundary", "\n$text");
+	# remove first "part" and last "part" (final --)
+	shift @message_parts;
+	my $last=pop @message_parts;
+	# if our boundaries are a bit dodgy and we only found 1 part...
+	if (!defined($last)) {$last="";}
+	# make sure it is only -- and whitespace
+	if ($last !~ /^\-\-\s*$/ms) {
+	    print $outhandle "EMAILPlug: (warning) last part of MIME message isn't empty\n";
+	}
+	foreach my $message_part (@message_parts) {
+	    # remove the leading newline left from split.
+	    $message_part=~s/^\r?\n//;
+	}
+	if ($mimetype eq "multipart/alternative") {
+	    # check for an HTML version first, then TEXT, otherwise use first.
+	    my $part_text="";
+	    foreach my $message_part (@message_parts) {
+		if ($message_part =~ m@\s*content\-type:\s*text/html@mis)
+		{
+		    # Use the HTML version
+		    $part_text= $self->text_from_part($message_part);
+		    $mimetype="text/html";
+		    last;
+		}
+	    }
+	    if ($part_text eq "") { # try getting a text part instead
+		foreach my $message_part (@message_parts) {
+		    if ($message_part =~ m@^content\-type:\s*text/plain@mis)
+		    {
+			# Use the plain version
+			$part_text= $self->text_from_part($message_part);
+			if ($part_text =~/[^\s]/) {
+			    $part_text="<pre>".$part_text."</pre>";
+			}
+			$mimetype="text/plain";
+			last;
+		    }
+		}
+	    }
+	    if ($part_text eq "") { # use first part
+		$part_text= $self->text_from_part(shift @message_parts);
+	    }
+	    if ($part_text eq "") { # we couldn't get anything!!!
+		# or it was an empty message...
+		# do nothing...
+		print $outhandle "EMAILPlug: no text - empty body?\n";
+	    } else {
+		$text=$part_text;
+	    }
+	} elsif ($mimetype =~ m@multipart/(mixed|digest|related)@) {
+	    $text="";
+	    foreach my $message_part (@message_parts) {
+		my $part_header=$message_part;
+		my $part_body;
+		if ($message_part=~ /^\s*\n/) {
+		    # no header... use defaults
+		    $part_body=$message_part;
+		    $part_header="Content-type: text/plain; charset=us-ascii";
+		} elsif ($part_header=~s/\r?\n\r?\n(.*)$//sg) {
+		    $part_body=$1;
+		} else {
+		    # something's gone wrong...
+		    $part_header="";
+		    $part_body=$message_part;
+		}
+		
+		$part_header =~ s/\r?\n[\t\ ]+/ /gs; #unfold
+		my $part_content_type="";
+		my $part_content_info="";
+		if ($mimetype eq "multipart/digest") {
+		    # default type - RTFRFC!!
+		    $part_content_type="message/rfc822";
+		}
+		if ($part_header =~ m@^content\-type:\s*([\w+/\-]+)\s*\;?\s*(.*?)\s*$@mi) {
+		    $part_content_type=$1; $part_content_type =~ tr/A-Z/a-z/;
+		    $part_content_info=$2;
+		}
+		my $filename="";
+		if ($part_header =~ m@name=\"?([\w\.\-\\/]+)\"?@mis) {
+		    $filename=$1;
+		}
+
+		# disposition - either inline or attachment.
+		# NOT CURRENTLY USED - we display all text types instead...
+		# $part_header =~ /^content\-disposition:\s*([\w+])/mis;
+
+		# add <<attachment>> to each part except the first...
+		if ($text ne "") {
+		    $text.="\n<p><hr><strong>&lt;&lt;attachment&gt;&gt;</>";
+		    # add part info header
+		    $text.="<br>Type: $part_content_type<br>\n";
+		    if ($filename ne "") {
+			$text.="Filename: $filename\n";
+		    }
+		    $text.="</strong></p>\n";
+		}
+
+		if ($part_content_type =~ m@text/@)
+		{
+		    my $part_text= $self->text_from_part($message_part);
+		    if ($part_content_type !~ m@text/(ht|x)ml@) {
+			$part_text=text_into_html($part_text);
+		    }
+		    if ($part_text eq "") {
+			$part_text='&lt;&lt;empty message&gt;&gt;';
+		    }
+		    $text.=$part_text;
+		} elsif ($part_content_type =~ m@message/rfc822@) {
+		    # This is a forwarded message
+		    my $message_part_headers=$part_body;
+		    $message_part_headers =~ s/\r?\n[\t\ ]+/ /gs; #unfold
+		    $message_part_headers=~s/\r?\n\r?\n(.*)$//s;
+		    my $message_part_body=$1;
+
+		    my $rfc822_formatted_body=""; # put result in here
+		    if ($message_part_headers =~
+			/^content\-type:\s*([\w\/\-]+)\s*\;?\s*(.*?)\s*$/ims)
+		    {
+			# The message header uses MIME flags
+			my $message_content_type=$1;
+			my $message_content_info=$2;
+			if (!defined($message_content_info)) {
+			    $message_content_info="";
+			}
+			$message_content_type =~ tr/A-Z/a-z/;
+			if ($message_content_type =~ /multipart/) {
+			    $rfc822_formatted_body=
+			      $self->text_from_mime_message($message_content_type,
+							    $message_content_info,
+							    $message_part_body,
+							    $outhandle);
+			} else {
+			    $message_part_body= $self->text_from_part($part_body);
+			    $rfc822_formatted_body=text_into_html($message_part_body);
+			}
+		    } else {
+			# message doesn't use MIME flags
+			$rfc822_formatted_body=text_into_html($message_part_body);
+		    }
+		    # Add the returned text to the output
+		    # don't put all the headers...
+		    $message_part_headers =~ s/^(X\-.*|received|message\-id|return\-path):.*\n//img;
+		    $text.=text_into_html($message_part_headers);
+		    $text.="<p>\n";
+		    $text.=$rfc822_formatted_body;
+		    # end of message/rfc822
+		} elsif ($part_content_type =~ /multipart/) { 
+		    # recurse again
+
+		    $tmptext= $self->text_from_mime_message($part_content_type,
+							    $part_content_info,
+							    $part_body,
+							    $outhandle);
+		    $text.=$tmptext;
+		} elsif ($text eq "") {
+		    # we can't do anything with this part, but if it's the first
+		    # part then make sure it is mentioned..
+		    
+		    $text.="\n<p><hr><strong>&lt;&lt;attachment&gt;&gt;</>";
+		    # add part info header
+		    $text.="<br>Type: $part_content_type<br>\n";
+		    if ($filename ne "") {
+			$text.="Filename: $filename\n";
+		    }
+		    $text.="</strong></p>\n";
+		}
+	    } # foreach message part.
+	} else {
+	    # we can't handle this multipart type (not mixed or alternative)
+	    # the RFC also mentions "parallel".
+	}
+    } # end of ($mimetype !~ multipart)
+    elsif ($mimetype =~ m@message/rfc822@) {
+	my $msg_header = $text;
+	$msg_header =~ s/\r?\n\r?\n(.*)$//s;
+	$text = $1;
+
+	if ($msg_header =~ /^content\-type:\s*([\w\/\-]+)\s*\;?\s*(.+?)\s*$/mi)
+	{
+	    $mimetype=$1;
+	    $mimetype =~ tr/[A-Z]/[a-z]/;
+	    $mimeinfo=$2;
+	    if ($mimeinfo =~ /charset=\"([^\"]+)\"/) {
+		$charset = $1;
+	    }
+	    my $msg_text;
+	    if ($mimetype =~ m@multipart/@) {
+		$msg_text = text_from_mime_message($self, $mimetype, $mimeinfo,
+						   $text, $outhandle);
+	    } else {$msg_text=$text;}
+
+	    my $brief_header="";
+	    if ($msg_header =~ /^(From:.*)$/im) {$brief_header.="$1<br>";}
+	    if ($msg_header =~ /^(To:.*)$/im) {$brief_header.="$1<br>";}
+	    if ($msg_header =~ /^(Cc:.*)$/im) {$brief_header.="$1<br>";}
+	    if ($msg_header =~ /^(Subject:.*)$/im) {$brief_header.="$1<br>";}
+	    if ($msg_header =~ /^(Date:.*)$/im) {$brief_header.="$1<br>";}
+	    $text= "\n<b>&lt;&lt;attached message&gt;&gt;</b><br>";
+	    $text.= "<table><tr><td width=\"5%\"> </td>\n";
+	    $text.="<td>" . $brief_header . "\n</p>" . $msg_text 
+		. "</td></tr></table>";
+	}
+    } else {
+	# we don't do any processing of the content.
+    }
+
+    return $text;
+}
+
+
+
+
+
+
+# Process a MIME part. Return "" if we can't decode it.
+sub text_from_part {
+    my $self = shift(@_);
+    my $text=shift;
+    my $part_header=$text;
+    # check for empty part header (leading blank line)
+    if ($text =~ /^\s*\r?\n/) {
+	$part_header="Content-type: text/plain; charset=us-ascii";
+    } else {
+	$part_header =~ s/\r?\n\r?\n(.*)$//s;
+	$text=$1; if (!defined($text)) {$text="";}
+    }
+    $part_header =~ s/\r?\n[\t ]+/ /gs; #unfold
+    $part_header =~ /content\-type:\s*([\w\/]+).*?charset=\"?([^\;\"\s]+)\"?/is;
+    my $type=$1;
+    my $charset=$2;
+    if (!defined($type)) {$type="";}
+    if (!defined($charset)) {$charset="ascii";}
+    my $encoding="";
+    if ($part_header =~ /^content\-transfer\-encoding:\s*([^\s]+)/mis) {
+	$encoding=$1; $encoding=~tr/A-Z/a-z/;
+    }
+    # Content-Transfer-Encoding is per-part
+    if ($encoding ne "") {
+	if ($encoding =~ /quoted\-printable/) {
+	    $text=qp_decode($text);
+	} elsif ($encoding =~ /base64/) {
+	    $text=base64_decode($text);
+	} elsif ($encoding !~ /[78]bit/) { # leave 7/8 bit as is.
+	    # rfc2045 also allows binary, which we ignore (for now).
+	    # maybe this shouldn't go to stderr, but anyway...
+	    print STDERR "EMAILPlug: unknown encoding: $encoding\n";
+	    return "";
+	}
+    }
+    if ($type eq "text/html") {
+	# only get stuff between <body> tags, or <html> tags.
+	$text =~ s@^.*<html[^>]*>@@is;
+	$text =~ s@</html>.*$@@is;
+	$text =~ s/^.*?<body[^>]*>//si;
+	$text =~ s/<\/body>.*$//si;
+    }
+    elsif ($type eq "text/xml") {
+	$text=~s/</&lt;/g;$text=~s/>/&gt;/g;
+	$text="<pre>\n$text\n</pre>\n";
+    }
+    # convert to unicode
+    $self->convert2unicode($charset, \$text);
+    return $text;
+}
+
+
+# decode quoted-printable text
+sub qp_decode {
+    my $text=shift;
+
+    my @lines=split('\n', $text);
+
+    # if a line ends with "=\s*", it is a soft line break, otherwise
+    # keep in any newline characters.
+    foreach my $line (@lines) {
+	if ($line !~ s/=\s*$//) {$line.="\n";}
+
+	if ($line =~ /=[0-9A-Fa-f]{2}/) { # it contains an escaped char
+	    my @hexcode_segments=split('=',$line);
+	    shift @hexcode_segments;
+	    my @hexcodes;
+	    foreach my $hexcode (@hexcode_segments) {
+		$hexcode =~ s/^(..).*$/$1/;  # only need first 2 chars
+		chomp($hexcode); # just in case...
+		my $char=chr (hex "0x$hexcode");
+		$line =~ s/=$hexcode/$char/g;
+	    }
+	}
+    }
+    $text= join('', @lines);
+    return $text;
+}
+
+# decode base64 text. This is fairly slow (since it's interpreted perl rather
+# than compiled XS stuff like in the ::MIME modules, but this is more portable
+# for us at least).
+# see rfc2045 for description, but basically, bits 7 and 8 are set to zero;
+# 4 bytes of encoded text become 3 bytes of binary - remove 2 highest bits
+# from each encoded byte.
+
+
+sub base64_decode {
+    my $enc_text = shift;
+# A=>0, B=>1, ..., '+'=>62, '/'=>63
+# also '=' is used for padding at the end, but we remove it anyway.
+    my $mimechars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+# map each MIME char into it's value, for more efficient lookup.
+    my %index;
+    map { $index{$_} = index ($mimechars, $_) } (split ('', $mimechars));
+# remove all non-base64 chars. eval to get variable in transliteration...
+# also remove '=' - we'll assume (!!) that there are no errors in the encoding
+    eval "\$enc_text =~ tr|$mimechars||cd";
+    my $decoded="";
+    while (length ($enc_text)>3)
+    { 
+	my $fourchars=substr($enc_text,0,4,"");
+	my @chars=(split '',$fourchars);
+	$decoded.=chr( $index{$chars[0]}        << 2 | $index{$chars[1]} >> 4);
+	$decoded.=chr( ($index{$chars[1]} & 15) << 4 | $index{$chars[2]} >> 2);
+	$decoded.=chr( ($index{$chars[2]} & 3 ) << 6 |  $index{$chars[3]});
+    } 
+# if there are any input chars left, there are either
+# 2 encoded bytes (-> 1 raw byte) left or 3 encoded (-> 2 raw) bytes left.
+    my @chars=(split '',$enc_text);
+    if (length($enc_text)) {
+	$decoded.=chr($index{$chars[0]} << 2 | (int $index{$chars[1]} >> 4));
+    } 
+    if (length($enc_text)==3) {
+	$decoded.=chr( ($index{$chars[1]} & 15) << 4 | $index{$chars[2]} >> 2);
+    }
+    return $decoded;
+}
+
+sub convert2unicode {
+  my $self = shift(@_);
+  my ($charset, $textref) = @_;
+
+  # first get our character encoding name in the right form.
+  $charset = "iso_8859_1" unless defined $charset;
+  $charset=~tr/A-Z/a-z/;
+  $charset=~s/\-/_/g;
+  $charset=~s/gb2312/gb/;
+  # assumes EUC-KR, not ISO-2022 !?
+  $charset=~s/ks_c_5601_1987/korean/;
+
+  # It appears that we can't always trust ascii text so we'll treat it
+  # as iso-8859-1 (letting characters above 0x80 through without
+  # converting them to utf-8 will result in invalid XML documents
+  # which can't be parsed at build time).
+  $charset = "iso_8859_1" if ($charset eq "us_ascii" || $charset eq "ascii");
+
+  if ($charset eq "iso_8859_1") {
+      # test if the mailer lied, and it has win1252 chars in it...
+      # 1252 has characters between 0x80 and 0x9f, 8859-1 doesn't
+      if ($$textref =~ m/[\x80-\x9f]/) {
+	  my $outhandle = $self->{'outhandle'};
+	  print $outhandle "EMAILPlug: Headers claim ISO charset but MS ";
+	  print $outhandle "codepage 1252 detected.\n";
+	  $charset = "windows_1252";
+      }
+  }
+  $$textref=&unicode::unicode2utf8(&unicode::convert2unicode($charset,$textref));
+}
+
+
+# Perl packages have to return true if they are run.
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/ExcelPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ExcelPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ExcelPlug.pm	(revision 21083)
@@ -0,0 +1,66 @@
+###########################################################################
+#
+# ExcelPlug.pm -- plugin for importing Microsoft Excel files.
+#  (currently only versions 95 and 97)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2002 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package ExcelPlug;
+
+use ConvertToPlug;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+
+    my $self = new ConvertToPlug ($class, @_);
+
+# I'm not sure what encoding xlhtml produces - I think it puts it
+# into the Content-Type meta tag in the header of the HTML file.
+
+#    if ($self->{'input_encoding'} eq "auto") {
+#	$self->{'input_encoding'} = "utf8";
+#    }
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    return q^(?i)\.xls$^;
+}
+    
+sub process {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "ExcelPlug: passing $_[3] on to $self->{'converted_to'}Plug\n"
+	if $self->{'verbosity'} > 1;
+
+    return ConvertToPlug::process_type($self,"xls",@_);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/FOXPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/FOXPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/FOXPlug.pm	(revision 21083)
@@ -0,0 +1,258 @@
+###########################################################################
+#
+# FOXPlug.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# plugin to process a Foxbase dbt file. This plugin provides the basic
+# functionality to read in the dbt and dbf files and process each record.
+# This general plugin should be overridden for a particular database to process
+# the appropriate fields in the file.
+
+package FOXPlug;
+
+use BasPlug;
+use util;
+use doc;
+use unicode;
+use cnseg;
+use gb;
+
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    $self = new BasPlug ();
+
+    return bless $self, $class;
+}
+
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 0; # this is not a recursive plugin
+}
+
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor) = @_;
+    my $fullname = &util::filename_cat ($base_dir, $file);
+
+    # dbt files are processed at the same time as dbf files
+    return 0 if ($fullname =~ /\.dbt$/i);
+
+    # see if this is a foxbase database
+    return undef unless (-f $fullname && $fullname =~ /\.dbf$/i);
+
+    my ($parent_dir) = $fullname =~ /^(.*)\/[^\/]+\.dbf$/i;
+
+    # open the file
+    if (!open (FOXBASEIN, $fullname)) {
+	print STDERR "FOXPlug::read - couldn't read $fullname\n";
+	return undef;
+    }
+    
+    print STDERR "FOXPlug: processing $file\n";
+
+    # read in the database header
+    my ($temp, %dbf);
+    
+    # read in information about dbt file
+    if (read (FOXBASEIN, $temp, 32) < 32) {
+	print STDERR "FOXPlug::read - eof while reading database header";
+	close (FOXBASEIN);
+	return undef;
+    }
+    
+    # unpack the header
+    ($dbf{'hasdbt'},
+     $dbf{'modyear'}, $dbf{'modmonth'}, $dbf{'modday'},
+     $dbf{'numrecords'}, $dbf{'headerlen'}, 
+     $dbf{'recordlen'}) = unpack ("CCCCVvv", $temp);
+    
+    # process hasdbt
+    if ($dbf{'hasdbt'} == 131) {
+	$dbf{'hasdbt'} = 1;
+    } elsif ($dbf{'hasdbt'} == 3) {
+	$dbf{'hasdbt'} = 0;
+    } else {
+	print STDERR "FOXPlug:read $fullname doesn't seem to be a Foxbase file\n";
+	return undef;
+    }
+
+    # read in the field description
+    $dbf{'numfields'} = 0;
+    $dbf{'fieldinfo'} = [];
+    while (read (FOXBASEIN, $temp, 1) > 0) {
+	last if ($temp eq "\x0d");
+	last if (read (FOXBASEIN, $temp, 31, 1) < 31);
+
+	my %field = ();
+	$field{'name'} = $self->extracttext($temp, 11);
+	($field{'type'}, $field{'pos'}, $field{'len'}, $field{'dp'}) 
+	    = unpack ("x11a1VCC", $temp);
+
+	push (@{$dbf{'fieldinfo'}}, \%field);
+
+	$dbf{'numfields'} ++;
+    }
+
+    # open the dbt file if we need to
+    $dbtfullname = $fullname;
+    if ($fullname =~ /f$/) {
+	$dbtfullname =~ s/f$/t/;
+    } else {
+	$dbtfullname =~ s/F$/T/;
+    }
+    if ($dbf{'hasdbt'} && !open (DBTIN, $dbtfullname)) {
+	print STDERR "FOXPlug::read - couldn't read $dbtfullname\n";
+	close (FOXBASEIN);
+	return undef;
+    }
+
+    # read in and process each record in the database
+    my $numrecords = 0;
+    while (($numrecords < $dbf{'numrecords'}) && 
+	   (read (FOXBASEIN, $temp, $dbf{'recordlen'}) == $dbf{'recordlen'})) {
+
+	# create a new record
+	my $record = [];
+	
+	foreach $field (@{$dbf{'fieldinfo'}}) {
+	    my $fieldvalue = "";
+	    
+	    if ($field->{'type'} eq "M" && $dbf{'hasdbt'}) {
+		# a memo field, look up this field in the dbt file
+		my $seekpos = substr ($temp, $field->{'pos'}, $field->{'len'});
+
+		$seekpos =~ s/^\s*//;
+		$seekpos = 0 unless $seekpos =~ /^\d+$/;
+		
+		$seekpos = $seekpos * 512;
+
+		if ($seekpos == 0) {
+		    # there is no memo field
+
+		} elsif (seek (DBTIN, $seekpos, 0)) {
+		    while (read (DBTIN, $fieldvalue, 512, length($fieldvalue)) > 0) {
+			last if ($fieldvalue =~ /\cZ/);
+		    }
+
+		    # remove everything after the control-Z
+		    substr($fieldvalue, index($fieldvalue, "\cZ")) = "";
+
+		} else {
+		    print STDERR "\nERROR - seek (to $seekpos) failed\n";
+		}
+
+	    } else {
+		# a normal field
+		$fieldvalue = substr ($temp, $field->{'pos'}, $field->{'len'});
+	    }
+
+	    push (@$record, {%$field, 'value'=>$fieldvalue});
+	}
+
+	# process this record
+	$self->process_record ($pluginfo, $base_dir, $file, $metadata, $processor, 
+			       $numrecords, $record);
+	
+	# finished another record...
+	$numrecords++;
+    }
+
+    # close the dbt file if we need to
+    if ($dbf{'hasdbt'}) {
+	close (DBTIN);
+    }
+
+    # close the dbf file
+    close (FOXBASEIN);
+
+    # finished processing
+    return 1;
+}
+
+
+# will extract a string from some larger string, making it
+# conform to a number of constraints
+sub extracttext {
+    my $self = shift (@_);
+    my ($text, $maxlen, $offset, $stopstr) = @_;
+    $offset = 0 unless defined $offset;
+    $stopstr = "\x00" unless defined $stopstr;
+    
+    # decide where the string finishes
+    my $end = index ($text, $stopstr, $offset);
+    $end = length ($text) if $end < 0;
+    $end = $offset+$maxlen if (defined $maxlen) && ($end-$offset > $maxlen);
+    
+    return "" if ($end <= $offset);
+    return substr ($text, $offset, $end-$offset);
+}
+
+
+# process_record should be overriden for a particular type
+# of database. This default version outputs an html document
+# containing all the fields in the record as a table.
+# It also assumes that the text is in utf-8.
+sub process_record {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $numrecords, $record) = @_;
+
+    # create a new document
+    my $doc_obj = new doc ($file, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});
+    my $section = $doc_obj->get_top_section();
+
+    # start of document
+    $doc_obj->add_utf8_text($section, "<table>\n");
+
+    # add each field
+    foreach $field (@$record) {
+	if (defined ($field->{'name'}) && defined ($field->{'value'})) {
+	    $doc_obj->add_utf8_text($section, "  <tr>\n");
+	    $doc_obj->add_utf8_text($section, "    <td>$field->{'name'}</td>\n");
+	    $doc_obj->add_utf8_text($section, "    <td>$field->{'value'}</td>\n");
+	    $doc_obj->add_utf8_text($section, "  </tr>\n");
+	}
+    }
+
+    # end of document
+    $doc_obj->add_utf8_text($section, "</table>\n");
+
+    # add an object id
+    $doc_obj->set_OID();
+
+    # process the document
+    $processor->process($doc_obj);
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/GAPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/GAPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/GAPlug.pm	(revision 21083)
@@ -0,0 +1,157 @@
+###########################################################################
+#
+# GAPlug.pm
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# Processes Greenstone Archive XML documents. Note that this plugin does no
+# syntax checking (though the XML::Parser module tests for well-formedness).
+# It's assumed that the Archive files conform to their DTD.
+
+package GAPlug;
+
+use XMLPlug;
+
+sub BEGIN {
+    @ISA = ('XMLPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new XMLPlug ($class, @_);
+
+    $self->{'section'} = "";
+    $self->{'section_level'} = 0;
+    $self->{'metadata_name'} = "";
+    $self->{'metadata_value'} = "";
+    $self->{'content'} = "";
+
+    return bless $self, $class;
+}
+
+sub xml_start_document {
+}
+
+sub xml_end_document {
+}
+
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    # allow the short-lived and badly named "GreenstoneArchive" files to be processed
+    # as well as the "Archive" files which should now be created by import.pl
+    die "" if ($name !~ /^(Greenstone)?Archive$/);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "GAPLug: processing $self->{'file'}\n";
+}
+
+
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    $self->{'element'} = $element;
+    if ($element eq "Section") {
+	if ($self->{'section_level'} == 0) {
+	    $self->open_document();
+	} else {
+	    my $doc_obj = $self->{'doc_obj'};
+	    $self->{'section'} = 
+		$doc_obj->insert_section($doc_obj->get_end_child($self->{'section'}));
+	}
+	$self->{'section_level'} ++;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = $_{'name'};
+    }
+}
+
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+
+    if ($element eq "Section") {
+	$self->{'section_level'} --;
+	$self->{'section'} = $self->{'doc_obj'}->get_parent_section ($self->{'section'});
+	$self->close_document() if $self->{'section_level'} == 0;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'doc_obj'}->add_utf8_metadata($self->{'section'}, $self->{'metadata_name'},
+					      $self->{'metadata_value'});
+	$self->{'metadata_name'} = "";
+	$self->{'metadata_value'} = "";
+    }
+    elsif ($element eq "Content" && $self->{'content'} ne "") {
+	$self->{'doc_obj'}->add_utf8_text($self->{'section'}, $self->{'content'});
+	$self->{'content'} = "";
+    }
+    
+    $self->{'element'} = "";
+}
+
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    if ($self->{'element'} eq "Metadata") {
+	$self->{'metadata_value'} .= $_;
+    }
+    elsif ($self->{'element'} eq "Content") {
+	$self->{'content'} .= $_;
+    }
+}
+
+sub open_document {
+    my $self = shift(@_);
+
+    # create a new document
+    $self->{'doc_obj'} = new doc ();
+    $self->{'section'} = "";
+}
+
+sub close_document {
+    my $self = shift(@_);
+    
+    # add the associated files
+    my $assoc_files = 
+	$self->{'doc_obj'}->get_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    my $parent_dir = $self->{'filename'};
+    $parent_dir =~ s/[^\\\/]*$//;
+
+    foreach my $assoc_file_info (@$assoc_files) {
+	my ($assoc_file, $mime_type, $dir) = split (":", $assoc_file_info);
+	my $real_dir = &util::filename_cat($parent_dir, $assoc_file),
+	my $assoc_dir = (defined $dir && $dir ne "") 
+	    ? &util::filename_cat($dir, $assoc_file) : $assoc_file;
+	$self->{'doc_obj'}->associate_file($real_dir, $assoc_dir, $mime_type);
+    }
+    $self->{'doc_obj'}->delete_metadata($self->{'doc_obj'}->get_top_section(), "gsdlassocfile");
+
+    # process the document
+    $self->{'processor'}->process($self->{'doc_obj'}, $self->{'file'});
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/GMLPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/GMLPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/GMLPlug.pm	(revision 21083)
@@ -0,0 +1,222 @@
+###########################################################################
+#
+# GMLPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# plugin which processes a GML format document
+# assumes that gml tags are all in lower-case.
+
+package GMLPlug;
+
+use BasPlug;
+use util;
+use doc;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("GMLPlug", @_);
+
+    return bless $self, $class;}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.gml?$^;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    print $outhandle "GMLPlug: processing $file\n";
+
+    my $parent_dir = $file;
+    $parent_dir =~ s/[^\\\/]*$//;
+    $parent_dir = &util::filename_cat ($base_dir, $parent_dir);
+
+    if (!open (INFILE, $filename)) {
+	print $outhandle "GMLPlug::read - couldn't read $filename\n";
+	return 0;
+    }
+
+    undef $/;
+    my $gml = <INFILE>;
+    $/ = "\n";
+    close (INFILE);
+    
+    my @gml_sections = split("</gsdlsection>",$gml);
+    $gml = shift(@gml_sections);
+
+    my $no_docs = 0;
+
+    while (1) {
+	# create a new document
+	my $doc_obj = new doc ();
+	my $section = $doc_obj->get_top_section();
+
+	# process the document
+	my $firstsection = 1;
+	while (1) {
+	    my ($tags, $text) = ("", "");
+
+	    my @indenting_sections = split("<gsdlsection", $gml);
+	    shift(@indenting_sections); # skips over xml header if present
+
+	    foreach $gml (@indenting_sections) {
+
+		if ($gml =~ /^\s*([^>]*)>(.*)$/so) {
+		    $tags = $1 if defined $1;
+		    $text = &GMLPlug::_unescape_text($2);
+
+		} else {
+		    print $outhandle "GMLPlug::read - error in file $filename\n";
+		    print $outhandle "text: \"$gml\"\n";
+		    last;
+		}
+
+		# create the section (unless this is the first section)
+		if ($firstsection) {
+ 		    $firstsection = 0;
+#		    $tags =~ /gsdlsourcefilename\s*=\s*(?:\"([^\"]*)\")/o;
+#		    $src_filename = $2 || $3;
+
+		} else {
+
+		    $tags =~ s/gsdlnum\s*=\s*\"?(\d+)\"?//o;
+		    if (defined $1) {
+			$section .= ".$1";
+			$doc_obj->create_named_section($section);
+		    } else {
+			$section = $doc_obj->insert_section($doc_obj->get_end_child($section));
+		    }
+		}
+	    
+		# add the metadata
+		# could be stored as either attributes or ....
+		while ((defined $tags) && ($tags =~ s/^\s*(\S+)=\"([^\"]*)\"//o)) {
+		    $doc_obj->add_utf8_metadata($section, $1, &GMLPlug::_unescape_text($2)) 
+			if (defined $1 and defined $2);
+
+		}
+		
+		# ... or tags (xml compliant)
+		if ($text =~ m/^\s*<metadata>/)
+		{
+		    my ($metadata, $tagname, $tagvalue);
+		    ($metadata,$text) 
+			= ($text =~ m/\s*<metadata>\s*(<.*)\s*<\/metadata>(.*)$/s);
+
+		    # note: \1 refers to 1st match within regexp, so we can
+		    # handle the unescaped text here...
+		    while ((defined $metadata) 
+			   && ($metadata =~ s/<(.*?)>(.*?)<\/\1>//s))
+		    {
+			if (defined $1 && defined $2) 
+			{
+			    $tagname = $1;
+			    $tagvalue = $2;
+			    
+			    # if tagname begins with '/' it will be escaped
+			    $tagname =~ s/^&\#47;/\//;
+			    
+			    $doc_obj->add_utf8_metadata($section, $tagname, &GMLPlug::_unescape_text($tagvalue)); 
+			}
+		    }
+		}
+
+		# add the text
+
+		$doc_obj->add_utf8_text($section, $text) 
+		    if ((defined $text) && ($text ne ""));		
+	    }
+
+	    $gml = shift(@gml_sections); # get next bit of data
+	    last unless defined $gml;
+ 	    last if $section eq ""; # back to top level again (more than one document in gml file)
+	    $section = $doc_obj->get_parent_section ($section);
+	} # while (1) section level
+
+	# add the associated files
+	my $assoc_files = $doc_obj->get_metadata($doc_obj->get_top_section(), "gsdlassocfile");
+	my ($assoc_file_info);
+
+	foreach $assoc_file_info (@$assoc_files) 
+	{
+	    my ($assoc_file, $mime_type, $dir) = split (":", $assoc_file_info);
+	    my $real_dir = &util::filename_cat($parent_dir, $assoc_file),
+	    my $assoc_dir = (defined $dir && $dir ne "") 
+		? &util::filename_cat($dir, $assoc_file) : $assoc_file;
+	    $doc_obj->associate_file($real_dir, $assoc_dir, $mime_type);
+	    
+	}
+	$doc_obj->delete_metadata($doc_obj->get_top_section(), "gsdlassocfile");
+
+	# add metadata passed in from elsewhere
+	$self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+	
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+
+	# assume the document has an OID already
+
+	# process the document
+	$processor->process($doc_obj, $file);
+	
+	$no_docs++;
+	last if ($maxdocs > -1 && $no_docs >= $maxdocs);
+	last unless defined $gml && $gml =~ /\w/;
+    } # while(1) document level
+    
+    return $no_docs; # no of docs processed
+}
+
+sub _unescape_text {
+    my ($text) = @_;
+
+    # special characters in the gml encoding
+    $text =~ s/&lt;/</g;
+    $text =~ s/&gt;/>/g;
+    $text =~ s/&quot;/\"/g;
+    $text =~ s/&amp;/&/g; # this has to be last...
+
+    return $text;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/HBPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/HBPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/HBPlug.pm	(revision 21083)
@@ -0,0 +1,320 @@
+###########################################################################
+#
+# HBPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# plugin which processes an HTML book directory
+
+# This plugin is used by the Humanity Library collections and does not handle
+# input encodings other than ascii or extended ascii
+
+# this code is kind of ugly and could no doubt be made to run faster, by leaving
+# it in this state I hope to encourage people to make their collections use
+# HBSPlug instead ;-)
+
+# Use HBSPlug if creating a new collection and marking up files like the
+# Humanity Library collections. HBSPlug accepts all input encodings but
+# expects the marked up files to be cleaner than those used by the
+# Humanity Library collections
+
+package HBPlug;
+
+use ghtml;
+use BasPlug;
+use util;
+use doc;
+
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("HBPlug", @_);
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle) = @_;
+
+    $self->BasPlug::init($verbosity, $outhandle);
+
+    # this plugin only handles ascii encodings
+    if ($self->{'input_encoding'} !~ /^(iso_8859_1|ascii)$/) {
+	die "ERROR: HBPlug can handle only iso_8859_1 or ascii encodings.\n" .
+	    $self->{'input_encoding'} . " is not an acceptable input_encoding value\n";
+    }
+}
+
+# this is included only to prevent warnings being printed out 
+# from BasPlug::init. The process_exp is not used by this plugin
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return "This plugin does not use a process_exp\n";
+}
+
+
+sub HB_read_html_file {
+    my $self = shift (@_);
+    my ($htmlfile, $text) = @_;
+
+    # load in the file
+    if (!open (FILE, $htmlfile)) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "ERROR - could not open $htmlfile\n";
+	return;
+    }
+
+    my $foundbody = 0;
+    $self->HB_gettext (\$foundbody, $text, "FILE");
+    close FILE;
+
+    # just in case there was no <body> tag
+    if (!$foundbody) {
+	$foundbody = 1;
+	open (FILE, $htmlfile) || return;
+	$self->HB_gettext (\$foundbody, $text, "FILE");	
+	close FILE;
+    }
+}
+
+sub HB_gettext {
+    my $self = shift (@_);
+    my ($foundbody, $text, $handle) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $line = "";
+    while (defined ($line = <$handle>)) {
+	# look for body tag
+	if (!$$foundbody) {
+	    if ($line =~ s/^.*<body[^>]*>//i) {
+		$$foundbody = 1;
+	    } else {
+		next;
+	    }
+	}
+	
+	# check for symbol fonts
+	if ($line =~ /<font [^>]*?face\s*=\s*\"?(\w+)\"?/i) {
+	    my $font = $1;
+	    print $outhandle "HBPlug::HB_gettext - warning removed font $font\n" 
+		if ($font !~ /^arial$/i);
+	}
+
+	$line =~ s/<\/p>//ig;   # remove </p> tags
+	$line =~ s/<\/?(body|html|font)\b[^>]*>//ig; # remove any unwanted tags
+
+	# convert any alphanumeric character entities to their extended
+	# ascii equivalent for indexing purposes
+	&ghtml::convertcharentities ($line);
+
+	$$text .= $line;
+    }
+    $$text =~ s/\s+/ /g; # remove \n's
+}
+
+sub HB_clean_section {
+    my $self = shift (@_);
+    my ($section) = @_;
+
+    # remove tags without a starting tag from the section
+    my ($tag, $tagstart);
+    while ($section =~ /<\/([^>]{1,10})>/) {
+	$tag = $1;
+	$tagstart = index($section, "<$tag");
+	last if (($tagstart >= 0) && ($tagstart < index($section, "<\/$tag")));
+	$section =~ s/<\/$tag>//;
+    }
+    
+    # remove extra paragraph tags
+    while ($section =~ s/<p\b[^>]*>\s*<p\b/<p/ig) {}
+    
+    # remove extra stuff at the end of the section
+    while ($section =~ s/(<u>|<i>|<b>|<p\b[^>]*>|&nbsp;|\s)$//i) {}
+    
+    # add a newline at the beginning of each paragraph
+    $section =~ s/(.)\s*<p\b/$1\n\n<p/gi;
+    
+    # add a newline every 80 characters at a word boundary
+    # Note: this regular expression puts a line feed before
+    # the last word in each section, even when it is not
+    # needed.
+    $section =~ s/(.{1,80})\s/$1\n/g;
+    
+    # fix up the image links
+    $section =~ s/<img[^>]*?src=\"?([^\">]+)\"?[^>]*>/
+	<center><img src=\"_httpdocimg_\/$1\"><\/center><br>/ig;
+    $section =~ s/&lt;&lt;I&gt;&gt;\s*([^\.]+\.(png|jpg|gif))/
+	<center><img src=\"_httpdocimg_\/$1\"><\/center><br>/ig;
+
+    return $section;
+}
+
+
+sub shorten {
+    my $self = shift (@_);
+    my ($text) = @_;
+
+    return "\"$text\"" if (length($text) < 100);
+
+    return "\"" . substr ($text, 0, 50) . "\" ... \"" . 
+	substr ($text, length($text)-50) . "\"";
+}
+
+# if input_encoding is ascii we can call add_utf8_metadata
+# directly but if it's iso_8859_1 (the default) we need to call
+# add_metadata so that the ascii2utf8 conversion is done first
+# this should speed things up a little if processing an ascii only
+# document with input_encoding set to ascii
+sub HB_add_metadata {
+    my $self = shift (@_);
+    my ($doc_obj, $cursection, $field, $value) = @_;
+
+    if ($self->{'input_encoding'} eq "ascii") {
+	$doc_obj->add_utf8_metadata ($cursection, $field, $value);
+    } else {
+	$doc_obj->add_metadata ($cursection, $field, $value);
+    }
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # get the html filename and see if this is an HTML Book...
+    my $jobnumber = $file;
+    if ($file =~ /[\\\/]/) {
+	($jobnumber) = $file =~ /[\\\/]([^\\\/]+)$/;
+    }
+    return undef unless defined $jobnumber;
+    my $htmlfile = &util::filename_cat($base_dir, $file, "$jobnumber.htm");
+    return undef unless -e $htmlfile;
+
+    print $outhandle "HBPlug: processing $file\n";
+
+    # read in the file and do basic html cleaning (removing header etc)
+    my $html = "";
+    $self->HB_read_html_file ($htmlfile, \$html);
+
+    # create a new document
+    my $doc_obj = new doc ($file, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});
+
+    # copy the book cover if it exists
+    my $bookcover = &util::filename_cat($base_dir, $file, "$jobnumber.jpg");
+    $doc_obj->associate_file($bookcover, "cover.jpg", "image/jpeg");
+
+    my $cursection = $doc_obj->get_top_section();
+
+    # add metadata for top level of document
+    foreach my $field (keys(%$metadata)) {
+	# $metadata->{$field} may be an array reference
+	if (ref ($metadata->{$field}) eq "ARRAY") {
+	    map { 
+		$self->HB_add_metadata ($doc_obj, $cursection, $field, $_); 
+	    } @{$metadata->{$field}};
+	} else {
+	    $self->HB_add_metadata ($doc_obj, $cursection, $field, $metadata->{$field}); 
+	}
+    }
+
+    # process the file one section at a time
+    my $curtoclevel = 1;
+    my $firstsection = 1;
+    while (length ($html) > 0) {
+	if ($html =~ s/^.*?(?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC(\d+)&gt;&gt;\s*(.*?)<p\b/<p/i) {
+	    my $toclevel = $3;
+	    my $title = $4;
+	    my $sectiontext = "";
+	    if ($html =~ s/^(.*?)((?:<p\b[^>]*>)?((<b>|<i>|<u>|\s)*)&lt;&lt;TOC\d+&gt;&gt;)/$2/i) {
+		$sectiontext = $1;
+	    } else {
+		$sectiontext = $html;
+		$html = "";
+	    }
+
+	    # remove tags and extra spaces from the title
+	    $title =~ s/<\/?[^>]+>//g;
+	    $title =~ s/^\s+|\s+$//g;
+
+	    # close any sections below the current level and
+	    # create a new section (special case for the firstsection)
+	    while (($curtoclevel > $toclevel) ||
+		   (!$firstsection && $curtoclevel == $toclevel)) {
+		$cursection = $doc_obj->get_parent_section ($cursection);
+		$curtoclevel--;
+	    }
+	    if ($curtoclevel+1 < $toclevel) {
+		print $outhandle "WARNING - jump in toc levels in $htmlfile " . 
+		    "from $curtoclevel to $toclevel\n";
+	    }
+	    while ($curtoclevel < $toclevel) {
+		$curtoclevel++;
+		$cursection = 
+		    $doc_obj->insert_section($doc_obj->get_end_child($cursection));
+	    }
+
+	    # add the metadata to this section
+	    $self->HB_add_metadata ($doc_obj, $cursection, "Title", $title);
+
+	    # clean up the section html
+	    $sectiontext = $self->HB_clean_section($sectiontext);
+
+	    # associate any files
+	    map { $doc_obj->associate_file(&util::filename_cat ($base_dir, $file, $1), $1)
+		      if /_httpdocimg_\/([^\"]+)\"/; 0; }
+	         split (/(_httpdocimg_\/[^\"]+\")/, $sectiontext);
+
+	    # add the text for this section
+	    if ($self->{'input_encoding'} eq "ascii") {
+		$doc_obj->add_utf8_text ($cursection, $sectiontext);
+	    } else {
+		$doc_obj->add_text ($cursection, $sectiontext);
+	    }
+	} else {
+	    print $outhandle "WARNING - leftover text\n" , $self->shorten($html), 
+	    "\nin $htmlfile\n";
+	    last;
+	}
+	$firstsection = 0;
+    }
+
+    # add a OID
+    $doc_obj->set_OID ();
+
+    # process the document
+    $processor->process($doc_obj, &util::filename_cat($file, "$jobnumber.htm"));
+        
+    return 1; # processed the file
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/HTMLPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/HTMLPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/HTMLPlug.pm	(revision 21083)
@@ -0,0 +1,679 @@
+###########################################################################
+#
+# HTMLPlug.pm -- basic html plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# 
+# Note that this plugin handles frames only in a very simple way
+# i.e. each frame is treated as a separate document. This means
+# search results will contain links to individual frames rather
+# than linking to the top level frameset.
+# There may also be some problems caused by the _parent target
+# (it's removed by this plugin)
+# To use frames properly you'll need to use the WebPlug plugin.
+#
+
+
+package HTMLPlug;
+
+use BasPlug;
+use ghtml;
+use unicode;
+use util;
+use parsargv;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub print_usage {
+    print STDERR "\n  usage: plugin HTMLPlug [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -nolinks               Don't make any attempt to trap links (setting this\n";
+    print STDERR "                          flag may improve speed of building/importing but\n";
+    print STDERR "                          any relative links within documents will be broken).\n";
+    print STDERR "   -keep_head             Don't remove headers from html files.\n";
+    print STDERR "   -no_metadata           Don't attempt to extract any metadata from files.\n";
+    print STDERR "   -metadata_fields       Comma separated list of metadata fields to attempt to
+                          extract. Defaults to 'Title'.
+                          Use 'tag<tagname>' to have the contents of the first
+                          <tagname> pair put in a metadata element called
+                          'tagname'. Capitalise this as you want the metadata
+                          capitalised in Greenstone, since the tag extraction
+                          is case insensitive.\n";
+    print STDERR "   -hunt_creator_metadata Find as much metadata as possible on authorship and
+                          place it in the 'Creator' field. Requires the
+                          -metadata_fields flag.\n";
+    print STDERR "   -file_is_url           Set if input filenames make up url of original source
+                          documents e.g. if a web mirroring tool was used to
+                          create the import directory structure\n";
+    print STDERR "   -assoc_files           Perl regular expression of file extensions to
+                          associate with html documents.
+                          Defaults to '(?i)\.(jpe?g|gif|png|css)\$'\n";
+    print STDERR "   -rename_assoc_files    Renames files associated with documents (e.g. images).
+                          Also creates much shallower directory structure
+                          (useful when creating collections to go on cd-rom).\n";
+    print STDERR "   -title_sub             Substitution expression to modify string stored as
+                          Title. Used by, for example, PDFPlug to remove
+                          \"Page 1\", etc from text used as the title.\n";
+    print STDERR "   -description_tags      Split document into sub-sections where <Section> tags
+                          occur. Note that by setting this option you
+                          implicitly set -no_metadata, as all metadata should
+                          be included within the <Section> tags. Also,
+                          '-keep_head' will have no effect when this option
+                          is set.\n";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new BasPlug ($class, @_);
+
+    if (!parsargv::parse(\@_, 
+			 q^nolinks^, \$self->{'nolinks'},
+			 q^keep_head^, \$self->{'keep_head'},
+			 q^no_metadata^, \$self->{'no_metadata'},
+			 q^metadata_fields/.*/Title^, \$self->{'metadata_fields'},
+			 q^hunt_creator_metadata^, \$self->{'hunt_creator_metadata'},
+			 q^w3mir^, \$self->{'w3mir'},
+			 q^file_is_url^, \$self->{'file_is_url'},
+			 q^assoc_files/.*/(?i)\.(jpe?g|gif|png|css)$^, \$self->{'assoc_files'},
+			 q^rename_assoc_files^, \$self->{'rename_assoc_files'},
+			 q^title_sub/.*/^, \$self->{'title_sub'},
+			 q^description_tags^, \$self->{'description_tags'},
+			 "allow_extra_options")) {
+
+	print STDERR "\nIncorrect options passed to HTMLPlug, check your collect.cfg configuration file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    # retain this for backward compatibility (w3mir option was replaced by
+    # file_is_url)
+    if ($self->{'w3mir'}) {
+	$self->{'file_is_url'} = 1;
+    }
+    
+    $self->{'aux_files'} = {};
+    $self->{'dir_num'} = 0;
+    $self->{'file_num'} = 0;
+    return bless $self, $class;
+}
+
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(gif|jpe?g|png|css)$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    # the last option is an attempt to encode the concept of an html query ...
+    return q^(?i)(\.html?|\.shtml|\.shm|\.asp|\.php|\.cgi|.+\?.+=.*)$^;
+}
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "HTMLPlug: processing $file\n"
+	if $self->{'verbosity'} > 1;
+
+    if ($ENV{'GSDLOS'} =~ /^windows/i) {
+      # this makes life so much easier... perl can cope with unix-style '/'s.
+      $base_dir =~ s@(\\)+@/@g;
+      $file =~ s@(\\)+@/@g; 
+    }
+    my $cursection = $doc_obj->get_top_section();
+
+    $self->extract_metadata ($textref, $metadata, $doc_obj, $cursection) 
+	unless $self->{'no_metadata'} || $self->{'description_tags'};
+
+    # Store URL for page as metadata - this can be used for an
+    # altavista style search interface. The URL won't be valid
+    # unless the file structure contains the domain name (i.e.
+    # like when w3mir is used to download a website).
+    my $web_url = "http://$file";
+    $doc_obj->add_utf8_metadata($cursection, "URL", $web_url);
+
+    if ($self->{'description_tags'}) {
+
+	# remove the html header - note that doing this here means any
+	# sections defined within the header will be lost (so all <Section>
+	# tags must appear within the body of the HTML)
+	$$textref =~ s/^.*?<body[^>]*>//is;
+	$$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+
+	my $opencom = '(?:<!--|&lt;!(?:&mdash;|&#151;|--))';
+	my $closecom = '(?:-->|(?:&mdash;|&#151;|--)&gt;)';
+	my $lt = '(?:<|&lt;)';
+	my $gt = '(?:>|&gt;)';
+	my $quot = '(?:"|&quot;|&rdquo;|&ldquo;)';
+
+	my $found_something = 0; my $top = 1;
+	while ($$textref =~ s/^(.*?)$opencom(.*?)$closecom//s) {
+	    my $text = $1;
+	    my $comment = $2;
+	    if (defined $text) {
+		$self->process_section(\$text, $base_dir, $file, $doc_obj, $cursection);
+	    }
+	    while ($comment =~ s/$lt(.*?)$gt//s) {
+		
+		my $tag = $1;
+		if ($tag eq "Section") {
+		    $found_something = 1;
+		    $cursection = $doc_obj->insert_section($doc_obj->get_end_child($cursection)) unless $top;
+		    $top = 0;
+		} elsif ($tag eq "/Section") {
+		    $found_something = 1;
+		    $cursection = $doc_obj->get_parent_section ($cursection);
+		} elsif ($tag =~ /^Metadata name=$quot(.*?)$quot/s) {
+		    my $metaname = $1;
+		    $comment =~ s/^(.*?)$lt\/Metadata$gt//s;
+		    my $metavalue = $1;
+		    $metavalue =~ s/^\s+//;
+		    $metavalue =~ s/\s+$//;
+                    # assume that no metadata value intentionally includes
+                    # carriage returns or HTML tags (if they're there they
+                    # were probably introduced when converting to HTML from
+                    # some other format).
+		    $metavalue =~ s/[\cJ\cM]/ /sg;
+		    $metavalue =~ s/<[^>]+>//sg;
+		    $metavalue =~ s/\s+/ /sg;
+		    $doc_obj->set_utf8_metadata_element($cursection, $metaname, $metavalue);
+		} elsif ($tag eq "Description" || $tag eq "/Description") {
+		    # do nothing with containing Description tags
+		} else {
+		    # simple HTML tag (probably created by the conversion
+		    # to HTML from some other format) - we'll ignore it and
+		    # hope for the best ;-)
+		}
+	    }
+	}
+	if ($cursection ne "") {
+	    print $outhandle "HTMLPlug: WARNING: $file contains unmatched <Section></Section> tags\n";
+	}
+
+	$$textref =~ s/^.*?<body[^>]*>//is;
+	$$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+	if ($$textref =~ /\S/) {
+	    if (!$found_something) {
+		print $outhandle "HTMLPlug: WARNING: $file appears to contain no Section tags so\n";
+		print $outhandle "          will be processed as a single section document\n";
+		$self->process_section($$textref, $base_dir, $file, $doc_obj, $cursection);
+	    } else {
+		print $outhandle "HTMLPlug: WARNING: $file contains the following text outside\n";
+		print $outhandle "          of the final closing </Section> tag. This text will\n";
+		print $outhandle "          be ignored.";
+		my ($text);
+		if (length($$textref) > 30) {
+		    $text = substr($$textref, 0, 30) . "...";
+		} else {
+		    $text = $$textref;
+		}
+		$text =~ s/\n/ /isg;
+		print $outhandle " ($text)\n";
+	    }
+	}
+	
+    } else {
+
+	# remove header and footer
+	if (!$self->{'keep_head'} || $self->{'description_tags'}) {
+	    $$textref =~ s/^.*?<body[^>]*>//is;
+	    $$textref =~ s/(<\/body[^>]*>|<\/html[^>]*>)//isg;
+	}
+
+	# single section document
+	$self->process_section($textref, $base_dir, $file, $doc_obj, $cursection);
+    }
+    return 1;
+}
+
+# note that process_section may be called multiple times for a single
+# section (relying on the fact that add_utf8_text appends the text to any
+# that may exist already).
+sub process_section {
+    my $self = shift (@_);
+    my ($textref, $base_dir, $file, $doc_obj, $cursection) = @_;
+    # trap links
+    if (!$self->{'nolinks'}) {
+
+	# usemap="./#index" not handled correctly => change to "#index"
+	$$textref =~ s/(<img[^>]*?usemap\s*=\s*\"?)([^\">\s]+)(\"?[^>]*>)/
+	    $self->replace_usemap_links($1, $2, $3)/isge;
+
+	$$textref =~ s/(<(?:a|area|frame|link)\s+[^>]*?\s*(?:href|src)\s*=\s*\"?)([^\">\s]+)(\"?[^>]*>)/
+	    $self->replace_href_links ($1, $2, $3, $base_dir, $file, $doc_obj, $cursection)/isge;
+    }
+
+    # trap images
+
+    # allow spaces if inside quotes - jrm21
+    $$textref =~ s/(<img[^>]*?src\s*=\s*)(\"[^\"]+\"|[^\s>]+)([^>]*>)/
+	$self->replace_images ($1, $2, $3, $base_dir, $file, $doc_obj, $cursection)/isge;
+
+    # add text to document object
+    # turn \ into \\ so that the rest of greenstone doesn't think there
+    # is an escape code following. (Macro parsing loses them...)
+    $$textref =~ s/\\/\\\\/go;
+    $doc_obj->add_utf8_text($cursection, $$textref);
+}
+
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+    # remove quotes from link at start and end if necessary
+    if ($link=~/^\"/) {
+	$link=~s/^\"//;$link=~s/\"$//;
+	$front.='"';
+	$back="\"$back";
+    }
+
+    $link =~ s/\n/ /g;
+    my ($href, $hash_part, $rl) = $self->format_link ($link, $base_dir, $file);
+    return $front . $self->add_file ($href, $rl, $hash_part, $base_dir, $doc_obj, $section) . $back;
+}
+
+sub replace_href_links {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, $file, $doc_obj, $section) = @_;
+
+    # attempt to sort out targets - frames are not handled 
+    # well in this plugin and some cases will screw things
+    # up - e.g. the _parent target (so we'll just remove 
+    # them all ;-)
+    $front =~ s/(target=\"?)_top(\"?)/$1_gsdltop_$2/is;
+    $back =~ s/(target=\"?)_top(\"?)/$1_gsdltop_$2/is;
+    $front =~ s/target=\"?_parent\"?//is;
+    $back =~ s/target=\"?_parent\"?//is;
+
+    return $front . $link . $back if $link =~ /^\#/s;
+    $link =~ s/\n/ /g;
+
+    my ($href, $hash_part, $rl) = $self->format_link ($link, $base_dir, $file);
+    # href may use '\'s where '/'s should be on Windows
+    $href =~ s/\\/\//g;
+
+    my ($filename) = $href =~ /^(?:.*?):(?:\/\/)?(.*)/;
+
+    ##### leave all these links alone (they won't be picked up by intermediate 
+    ##### pages). I think that's safest when dealing with frames, targets etc.
+    ##### (at least until I think of a better way to do it). Problems occur with
+    ##### mailto links from within small frames, the intermediate page is displayed
+    ##### within that frame and can't be seen. There is still potential for this to
+    ##### happen even with html pages - the solution seems to be to somehow tell
+    ##### the browser from the server side to display the page being sent (i.e. 
+    ##### the intermediate page) in the top level window - I'm not sure if that's 
+    ##### possible - the following line should probably be deleted if that can be done
+    return $front . $link . $back if $href =~ /^(mailto|news|gopher|nntp|telnet|javascript):/is;
+
+
+    if (($rl == 0) || ($filename =~ /$self->{'process_exp'}/) || 
+	($href =~ /\/$/) || ($href =~ /^(mailto|news|gopher|nntp|telnet|javascript):/i)) {
+	&ghtml::urlsafe ($href);
+	return $front . "_httpextlink_&rl=" . $rl . "&href=" . $href . $hash_part . $back;
+	
+    } else {
+	# link is to some other type of file (eg image) so we'll
+	# need to associate that file
+	return $front . $self->add_file ($href, $rl, $hash_part, $base_dir, $doc_obj, $section) . $back;
+    }
+}
+
+sub add_file {
+    my $self = shift (@_);
+    my ($href, $rl, $hash_part, $base_dir, $doc_obj, $section) = @_;
+    my ($newname);
+
+    my $filename = $href;
+    $filename =~ s/^[^:]*:\/\///;
+    $filename = &util::filename_cat($base_dir, $filename);
+   
+    my ($ext) = $filename =~ /(\.[^\.]*)$/;
+
+    if ((!defined $ext) || ($ext !~ /$self->{'assoc_files'}/)) {
+	return "_httpextlink_&rl=" . $rl . "&href=" . $href . $hash_part;
+    }
+
+    if ($self->{'rename_assoc_files'}) {
+	if (defined $self->{'aux_files'}->{$href}) {
+	    $newname = $self->{'aux_files'}->{$href}->{'dir_num'} . "/" .
+		$self->{'aux_files'}->{$href}->{'file_num'} . $ext;
+	} else {
+	    $newname = $self->{'dir_num'} . "/" . $self->{'file_num'} . $ext;
+	    $self->{'aux_files'}->{$href} = {'dir_num' => $self->{'dir_num'}, 'file_num' => $self->{'file_num'}};
+	    $self->inc_filecount ();
+	}
+	$doc_obj->associate_file($filename, $newname, undef, $section);
+	return "_httpcollimg_/$newname";
+
+    } else {
+	($newname) = $filename =~ /([^\/\\]*)$/;
+	$doc_obj->associate_file($filename, $newname, undef, $section);
+	return "_httpdocimg_/$newname";
+    }
+}
+
+
+sub format_link {
+    my $self = shift (@_);
+    my ($link, $base_dir, $file) = @_;
+
+    my ($before_hash, $hash_part) = $link =~ /^([^\#]*)(\#?.*)$/;
+
+    $hash_part = "" if !defined $hash_part;
+    if (!defined $before_hash || $before_hash !~ /[\w\.\/]/) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "HTMLPlug: ERROR - badly formatted tag ignored ($link)\n"
+	    if $self->{'verbosity'};
+	return ($link, "", 0);
+    }
+    
+    if ($before_hash =~ s@^((?:http|ftp|file)://)@@i) {
+	my $type = $1;
+
+	if ($link =~ /^(http|ftp):/i) {
+	    # Turn url (using /) into file name (possibly using \ on windows)
+	    my @http_dir_split = split('/', $before_hash);
+	    $before_hash = &util::filename_cat(@http_dir_split);
+	}
+
+	$before_hash = $self->eval_dir_dots($before_hash);
+					 
+	my $linkfilename = &util::filename_cat ($base_dir, $before_hash);
+
+	my $rl = 0;
+	$rl = 1 if (-e $linkfilename);
+
+	# make sure there's a slash on the end if it's a directory
+	if ($before_hash !~ /\/$/) {
+	    $before_hash .= "/" if (-d $linkfilename);
+	}
+
+	return ($type . $before_hash, $hash_part, $rl);
+    
+    } elsif ($link !~ /^(mailto|news|gopher|nntp|telnet|javascript):/i) {
+	if ($before_hash =~ s@^/@@ || $before_hash =~ /\\/) {
+
+	    # the first directory will be the domain name if file_is_url
+	    # to generate archives, otherwise we'll assume all files are
+	    # from the same site and base_dir is the root
+
+	    if ($self->{'file_is_url'}) {
+		my @dirs = split /[\/\\]/, $file;
+		my $domname = shift (@dirs);
+		$before_hash = &util::filename_cat($domname, $before_hash);
+		$before_hash =~ s@\\@/@g; # for windows
+	    }
+	    else
+	    {
+		# see if link shares directory with source document
+		# => turn into relative link if this is so!
+		
+		if ($ENV{'GSDLOS'} =~ /^windows/i) {
+		    # too difficult doing a pattern match with embedded '\'s...
+		    my $win_before_hash=$before_hash;
+		    $win_before_hash =~ s@(\\)+@/@g;
+		    # $base_dir is already similarly "converted" on windows.
+		    if ($win_before_hash =~ s@^$base_dir/@@o) {
+		      # if this is true, we removed a prefix
+		      $before_hash=$win_before_hash;
+		    }
+
+		}
+		else {
+		    $before_hash = &util::filename_cat("",$before_hash);
+		    $before_hash =~ s@^$base_dir/@@;
+		}
+
+	    }
+
+	} else {
+	    # Turn relative file path into full path
+	    my $dirname = &File::Basename::dirname($file);
+	    $before_hash = &util::filename_cat($dirname, $before_hash);
+	    $before_hash = $self->eval_dir_dots($before_hash);
+	}
+
+	my $linkfilename = &util::filename_cat ($base_dir, $before_hash); 
+
+	# make sure there's a slash on the end if it's a directory
+	if ($before_hash !~ /\/$/) {
+	    $before_hash .= "/" if (-d $linkfilename);
+	}
+	
+	return ("http://" . $before_hash, $hash_part, 1);
+
+    } else {
+	# mailto, news, nntp, telnet, javascript or gopher link
+	return ($before_hash, "", 0);
+    }
+}
+
+sub extract_first_NNNN_characters {
+    my $self = shift (@_);
+    my ($textref, $doc_obj, $thissection) = @_;
+    
+    foreach my $size (split /,/, $self->{'first'}) {
+	my $tmptext =  $$textref;
+	$tmptext =~ s/.*<body[^>]*>//i;
+	$tmptext =~ s/$self->{'title_sub'}// if ($self->{'title_sub'});
+	$tmptext =~ s/<[^>]*>/ /g;
+	$tmptext =~ s/&nbsp;/ /g;
+	$tmptext =~ s/^\s+//;
+	$tmptext =~ s/\s+$//;
+	$tmptext =~ s/\s+/ /gs;
+	$tmptext = substr ($tmptext, 0, $size);
+	$tmptext =~ s/\s\S*$/&#8230;/;
+	$doc_obj->add_utf8_metadata ($thissection, "First$size", $tmptext);
+    }
+}
+
+sub extract_metadata {
+    my $self = shift (@_);
+    my ($textref, $metadata, $doc_obj, $section) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # if we don't want metadata, we may as well not be here ...
+    return if (!defined $self->{'metadata_fields'});
+
+    # hunt for an author look in the metadata elements:
+    if (defined $self->{'hunt_creator_metadata'}) {
+	for my $name (split /,/, "AUTHOR,AUTHOR.EMAIL,CREATOR,DC.CREATOR,DC.CREATOR.CORPORATENAME") {
+	    if ($$textref =~ /<meta(\s*?)(?:name|http-equiv)\s*=\s*\"?$name\"?([^>]*)/is) {
+		my $content = $1 . $2;
+		if ($content =~ /content\s*=\s*\"?(.*)\"?/is) {
+		    if (defined $1) {
+			my $value = $1;
+			$value =~ s/\"$//;
+			$value =~ s/\s+/ /gs;
+			$doc_obj->add_utf8_metadata($section, "Creator", $value);
+			print $outhandle " extracted Creator metadata \"$value\"\n" 
+			    if ($self->{'verbosity'} > 2);
+			next;
+		    }
+		}
+	    }
+	}
+    }
+
+    foreach my $field (split /,/, $self->{'metadata_fields'}) {
+
+	# don't need to extract field if it was passed in from a previous 
+	# (recursive) plugin
+	next if defined $metadata->{$field};
+
+	# see if there's a <meta> tag for this field
+	if ($$textref =~ /<meta(\s*?)(?:name|http-equiv)\s*=\s*\"?$field\"?([^>]*)/is) {
+	    my $content = $1 . $2;
+	    if ($content =~ /content\s*=\s*\"?(.*)\"?/is) {
+		if (defined $1) {
+		    my $value = $1;
+		    $value =~ s/\"$//;
+		    $value =~ s/\s+/ /gs;
+		    $value =~ s/\".*//gs;
+		    $doc_obj->add_utf8_metadata($section, $field, $value);
+		    print $outhandle " extracted \"$field\" metadata \"$value\"\n" 
+			if ($self->{'verbosity'} > 2);
+		    next;
+		}
+	    }
+	}
+	
+	# TITLE: extract the document title
+	
+	if ($field =~ /^title$/i) {
+
+	    # see if there's a <title> tag
+	    if ($$textref =~ /<title[^>]*>([^<]*)<\/title[^>]*>/is) {
+		if (defined $1) {
+		    my $title = $1;
+		    if ($title =~ /\w/) {
+			$title =~ s/<[^>]*>/ /g;
+			$title =~ s/&nbsp;/ /g;
+			$title =~ s/\s+/ /gs;
+			$title =~ s/^\s+//;
+			$title =~ s/\s+$//;
+			$doc_obj->add_utf8_metadata ($section, $field, $title);
+			print $outhandle " extracted \"$field\" metadata \"$title\"\n" 
+			    if ($self->{'verbosity'} > 2);
+			next;
+		    }
+		}
+	    }
+	    
+	    # if no title use first 100 characters
+	    my $tmptext = $$textref;
+	    $tmptext =~ s/<\/([^>]+)><\1>//g; # (eg) </b><b> - no space
+	    $tmptext =~ s/<[^>]*>/ /g;
+	    $tmptext =~ s/&nbsp;/ /g;
+	    $tmptext =~ s/^\s+//s;
+	    $tmptext =~ s/\s+$//;
+	    $tmptext =~ s/\s+/ /gs;
+	    $tmptext =~ s/$self->{'title_sub'}// if ($self->{'title_sub'});
+	    $tmptext = substr ($tmptext, 0, 100);
+	    $tmptext =~ s/\s\S*$/.../;
+	    $doc_obj->add_utf8_metadata ($section, $field, $tmptext);
+	    print $outhandle " extracted \"$field\" metadata \"$tmptext\"\n" 
+		if ($self->{'verbosity'} > 2);
+	    next;
+	}
+
+
+        # tag: extract the text between the first <H1> and </H1> tags
+        if ($field =~ /^tag[a-z0-9]+$/i) {
+	    
+	    my $tag = $field;
+	    $tag =~ s/^tag//i;
+            my $tmptext = $$textref;
+            $tmptext =~ s/\s+/ /gs;
+            if ($tmptext =~ /<$tag[^>]*>/i) {		
+		foreach my $word ($tmptext =~ m/<$tag[^>]*>(.*?)<\/$tag[^>]*>/g) {
+		    $word =~ s/&nbsp;/ /g;
+		    $word =~ s/<[^>]*>/ /g;
+		    $word =~ s/^\s+//;
+		    $word =~ s/\s+$//;
+		    $word =~ s/\s+/ /gs;
+		    if ($word ne "") {
+			$doc_obj->add_utf8_metadata ($section, $tag, $word);
+			print $outhandle " extracted \"$tag\" metadata \"$word\"\n" 
+			    if ($self->{'verbosity'} > 2);
+		    }
+		}
+            }
+            next;
+        }
+    }
+}
+
+
+# evaluate any "../" to next directory up
+# evaluate any "./" as here
+sub eval_dir_dots {
+    my $self = shift (@_);
+    my ($filename) = @_;
+
+    my $dirsep_os = &util::get_os_dirsep();
+    my @dirsep = split(/$dirsep_os/,$filename);
+
+    my @eval_dirs = ();
+    foreach my $d (@dirsep) {
+	if ($d eq "..") {
+	    pop(@eval_dirs);
+
+	} elsif ($d eq ".") {
+	    # do nothing!
+
+	} else {
+	    push(@eval_dirs,$d);
+	}
+    }
+
+    return &util::filename_cat(@eval_dirs);
+}
+
+sub replace_usemap_links {
+    my $self = shift (@_);
+    my ($front, $link, $back) = @_;
+
+    $link =~ s/^\.\///;
+    return $front . $link . $back;
+}
+
+sub inc_filecount {
+    my $self = shift (@_);
+
+    if ($self->{'file_num'} == 1000) {
+	$self->{'dir_num'} ++;
+	$self->{'file_num'} = 0;
+    } else {
+	$self->{'file_num'} ++;
+    }
+}
+
+
+# Extend the BasPlug read_file so that strings like &eacute; are
+# converted to UTF8 internally.  
+#
+# We don't convert &lt; or &gt; or &amp; or &quot; in case
+# they interfere with the GML files
+
+sub read_file {
+    my ($self, $filename, $encoding, $language, $textref) = @_;
+
+    &BasPlug::read_file($self, $filename, $encoding, $language, $textref);
+
+
+    # Convert things like &eacute; to their UTF8 equivalents
+    $$textref =~ s/&(lt|gt|amp|quot);/&z$1;/go;
+    $$textref =~ s/&([^;]+);/&unicode::ascii2utf8(\&ghtml::getcharequiv($1,1))/gseo;
+    $$textref =~ s/&z(lt|gt|amp|quot);/&$1;/go;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/ImagePlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ImagePlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ImagePlug.pm	(revision 21083)
@@ -0,0 +1,346 @@
+###########################################################################
+#
+# ImagePlug.pm -- simple text plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package ImagePlug;
+
+use BasPlug;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+
+sub print_usage {
+    my ($plugin_name) = @_;
+
+    print STDERR "
+  usage: plugin ImagePlug [options]
+
+   -noscaleup         Don't scale up small images when making thumbnails
+
+   -thumbnailsize n   Make thumbnails of size nxn
+
+   -thumbnailtype s   Make thumbnails in format 's'
+
+   -screenviewsize n  If set, makes an image of size n for screen display
+                      and sets Screen, ScreenSize, ScrrenWidth and Screeneight
+                      metadata.  By default it is not set.
+
+   -screenviewtype s  If -screenviewsize is set, this sets the screen display
+                      image type.  Defaults to jpg.
+
+   -convertto s       Convert main inage to (gif|png|jpg)
+
+   -minimumsize n     Ignore images smaller than n bytes
+
+"
+}
+
+sub new {
+    my ($class) = @_;
+    my $plugin_name = shift (@_);
+    my $self = new BasPlug ("ImagePlug", @_);
+
+    if (!parsargv::parse(\@_,
+			 q^noscaleup^, \$self->{'noscaleup'},
+			 q^converttotype/.*/^, \$self->{'converttotype'},
+			 q^minimumsize/[0-9]*/100^, \$self->{'minimumsize'},
+
+			 q^thumbnailsize/[0-9]*/100^, \$self->{'thumbnailsize'},
+			 q^thumbnailtype/.*/gif^, \$self->{'thumbnailtype'},
+			 q^screenviewsize/[0-9]*/0^, \$self->{'screenviewsize'},
+			 q^screenviewtype/.*/jpg^, \$self->{'screenviewtype'},
+			 "allow_extra_options")) {
+	
+	print STDERR "\nImagePlug uses an incorrect option.\n";
+	print STDERR "Check your collect.cfg configuration file.\n";
+    	&print_usage($plugin_name);
+	die "\n";
+    }
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)(\.jpe?g|\.gif|\.png|\.bmp|\.xbm|\.tif?f)$^; 
+}
+
+
+# Create the thumbnail and screenview images, and discover the Image's
+# size, width, and height using the convert utility.
+
+sub run_convert {
+    my $self = shift (@_);
+    my $filename = shift (@_);   # filename with full path
+    my $file = shift (@_);       # filename without path
+    my $doc_obj = shift (@_);
+    my $section = $doc_obj->get_top_section();
+    
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the filename is okay
+    return 0 if ($file eq "" || $filename eq "");
+
+    if ($filename =~ m/ /) {
+	print $outhandle "ImagePlug: \"$filename\" contains a space. choking.\n";
+	return undef;
+    }
+
+    my $minimumsize = $self->{'minimumsize'};
+    if (defined $minimumsize && (-s $filename < $minimumsize)) {
+        print $outhandle "ImagePlug: \"$filename\" too small, skipping\n"
+	    if ($verbosity > 1);
+    }
+
+
+    # Convert the image to a new type (if required).
+    my $converttotype = $self->{'converttotype'};
+    my $originalfilename = "";  # only set if we do a conversion
+    my $type = "unknown";
+
+    if ($converttotype ne "" && $filename =~ m/$converttotype$/) {
+
+	$originalfilename = $filename;
+	$filename = &util::get_tmp_filename() . ".$converttotype";
+	$self->{'tmp_filename'} = $filename;
+
+	my $command = "convert -verbose $originalfilename $filename";
+	print $outhandle "$command\n" if ($verbosity > 2);
+	my $result = '';
+	$result = `$command`;
+	print $outhandle "$result\n" if ($verbosity > 3);
+
+	$type = $converttotype;
+    }
+    
+
+    # Make the thumbnail image
+    my $thumbnailsize = $self->{'thumbnailsize'}  || 100;
+    my $thumbnailtype = $self->{'thumbnailtype'} || 'gif';
+	
+    my $thumbnailfilename = &util::get_tmp_filename() . ".$thumbnailtype";
+    $self->{'tmp_filename2'} = $thumbnailfilename;
+
+    # Generate the thumbnail with convert
+    my $command = "convert -verbose -geometry $thumbnailsize" 
+	. "x$thumbnailsize $filename $thumbnailfilename";
+    print $outhandle "$command\n" if ($verbosity > 2);
+    my $result = '';
+    $result = `$command 2>&1` ;
+    print $outhandle "$result\n" if ($verbosity > 3);
+
+    # Add the thumbnail as an associated file ...
+    if (-e "$thumbnailfilename") { 
+	$doc_obj->associate_file("$thumbnailfilename", "thumbnail.$thumbnailtype", 
+				 "image/$thumbnailtype",$section);
+	$doc_obj->add_metadata ($section, "ThumbType", $thumbnailtype);
+	$doc_obj->add_metadata ($section, "Thumb", "thumbnail.$thumbnailtype");
+    }
+
+
+    # Extract Image metadata from convert output
+    if ($result =~ m/([0-9]+)x([0-9]+)=>([0-9]+)x([0-9]+)/) {
+	$doc_obj->add_metadata ($section, "ImageWidth", $1);
+	$doc_obj->add_metadata ($section, "ImageHeight", $2);
+	$doc_obj->add_metadata ($section, "ThumbWidth", $3);
+	$doc_obj->add_metadata ($section, "ThumbHeight", $4);
+    }
+    
+    my $size = "unknown";
+    if ($result =~ m/^[^\n]* ([0-9]+)b/) {
+	$size = $1;
+    } elsif ($result =~ m/^[^\n]* ([0-9]+)kb/) {
+	$size = 1024 * $1;
+    }
+    
+    if ($result =~ m/^[^\n]*JPE?G/i) {
+	$type = "jpeg";
+    } elsif ($result =~ m/^[^\n]*GIF/i) {
+	$type = "gif";
+    } elsif ($result =~ m/^[^\n]*PNG/i) {
+	$type = "png";
+    } elsif ($result =~ m/^[^\n]*TIF?F/i) {
+	$type = "tiff";
+    } elsif ($result =~ m/^[^\n]*BMP/i) {
+	$type = "bmp";
+    } elsif ($result =~ m/^[^\n]*XBM?F/i) {
+	$type = "xbm";
+    }
+
+    $doc_obj->add_metadata ($section, "ImageType", $type);
+    $doc_obj->add_metadata ($section, "Image", "$file");
+    $doc_obj->add_metadata ($section, "ImageSize", $size);
+    
+    # Add the image as an associated file ...
+    $doc_obj->associate_file($filename,$file,"image/$type",$section);
+        
+
+    # Make a screen-sized version of the picture if requested
+    if ($self->{'screenviewsize'}) {
+
+	my $screenviewsize = $self->{'screenviewsize'};
+	my $screenviewtype = $self->{'screenviewtype'} || 'jpeg';
+	my $screenviewfilename = &util::get_tmp_filename() . ".$screenviewtype";
+	$self->{'tmp_filename3'} = $screenviewfilename;
+
+	# make the screenview image
+	my $command = "convert -verbose -geometry $screenviewsize" 
+	    . "x$screenviewsize $filename $screenviewfilename";
+	print $outhandle "$command\n" if ($verbosity > 2);
+	my $result = "";
+	$result = `$command  2>&1` ;
+	print $outhandle "$result\n" if ($verbosity > 3);
+
+	# get screenview dimensions, size and type
+        if ($result =~ m/[0-9]+x[0-9]+=>([0-9]+)x([0-9]+)/) {
+	    $doc_obj->add_metadata ($section, "ScreenWidth", $1);
+	    $doc_obj->add_metadata ($section, "ScreenHeight", $2);
+	}
+    
+	#add the screenview as an associated file ...
+	if (-e "$screenviewfilename") { 
+	    $doc_obj->associate_file("$screenviewfilename", "screenview.$screenviewtype",
+				     "image/$screenviewtype",$section);
+	    $doc_obj->add_metadata ($section, "ScreenType", $screenviewtype);
+	    $doc_obj->add_metadata ($section, "Screen", "screenview.$screenviewtype");
+	} else {
+	    print $outhandle "ImagePlug: couldn't find \"$screenviewfilename\"\n";
+	}
+    }
+
+    return $type;
+
+
+}
+
+
+# The ImagePlug read() function. This function does all the right things
+# to make general options work for a given plugin. It calls the process()
+# function which does all the work specific to a plugin (like the old
+# read functions used to do). Most plugins should define their own 
+# process() function and let this read() function keep control.
+#
+# ImagePlug overrides read() because there is no need to read the actual 
+# text of the file in, because the contents of the file is not text...
+#
+# Return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    my $filename = &util::filename_cat($base_dir, $file);
+    return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    print $outhandle "ImagePlug processing \"$filename\"\n"
+	    if $self->{'verbosity'} > 1;
+
+    #if there's a leading directory name, eat it...
+    $file =~ s/^.*[\/\\]//;
+    
+    # create a new document
+    my $doc_obj = new doc ($filename, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});    
+
+    #run convert to get the thumbnail and extract size and type info
+    my $result = run_convert($self, $filename, $file, $doc_obj);
+    
+    if (!defined $result)
+    {
+	print "ImagePlug: couldn't process \"$filename\"\n";
+	return 0;
+    }
+
+    #create an empty text string so we don't break downstream plugins 
+    my $text = "Dummy text to sidestep display bug.";
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    my $section = $doc_obj->get_top_section();
+    $self->extra_metadata ($doc_obj, $section, $metadata);
+
+    # do plugin specific processing of doc_obj
+    return undef unless defined ($self->process (\$text, $pluginfo, $base_dir, 
+						 $file, $metadata, $doc_obj));
+
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+
+    # add an OID
+    $doc_obj->set_OID();
+    $doc_obj->add_text($section, $text);
+
+    # process the document
+    $processor->process($doc_obj);
+
+    # clean up temporary files - we do this here instead of in  
+    # run_convert becuase associated files aren't actually copied 
+    # until after process has been run.
+    if (defined $self->{'tmp_filename'} && 
+	-e $self->{'tmp_filename'}) {
+      &util::rm($self->{'tmp_filename'})
+    }
+    if (defined $self->{'tmp_filename2'} && 
+	-e $self->{'tmp_filename2'}) {
+      &util::rm($self->{'tmp_filename2'})
+    }
+    if (defined $self->{'tmp_filename3'} && 
+	-e $self->{'tmp_filename3'}) {
+      &util::rm($self->{'tmp_filename3'})
+    }
+
+    return 1;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    return 1;
+}
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/perllib/plugins/IndexPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/IndexPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/IndexPlug.pm	(revision 21083)
@@ -0,0 +1,140 @@
+###########################################################################
+#
+# IndexPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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 recursive plugin processes an index.txt file. 
+# The index.txt file should contain the list of files to be
+# included in the collection followed by any extra metadata to
+# be associated with each file.
+
+# The index.txt file should be formatted as follows:
+# The first line may be a key (beginning with key:)
+# to name the metadata fields
+# (e.g. key: Subject Organization Date) 
+# The following lines will contain a filename followed 
+# by the value that metadata entry is to be set to.
+# (e.g. 'irma/iw097e 3.2 unesco 1993' will associate the
+# metadata Subject=3.2, Organization=unesco, and Date=1993
+# with the file irma/iw097e if the above key line was used)
+
+# Note that if any of the metadata fields use the Hierarchy
+# classifier plugin then the value they're set to should
+# correspond to the first field (the descriptor) in the
+# appropriate classification file.
+
+# Metadata values may be named separately using a tag 
+# (e.g. <Subject>3.2) and this will override any name 
+# given to them by the key line.
+# If there's no key line any unnamed metadata value will be
+# named 'Subject'.
+
+package IndexPlug;
+
+use plugin;
+use BasPlug;
+use doc;
+use util;
+use cfgread;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("IndexPlug", @_);
+
+    return bless $self, $class;
+}
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+    
+    return 1;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    my $indexfile = &util::filename_cat($base_dir, $file, "index.txt");
+    if (!-f $indexfile) {
+	# not a directory containing an index file
+	return undef;
+    }
+
+    # found an index.txt file
+    print $outhandle "IndexPlug: processing $indexfile\n";
+
+    # read in the index.txt
+    my $list = &cfgread::read_cfg_file ($indexfile, undef, '^[^#]\w');
+    my @fields = ();
+    # see if there's a 'key:' line
+    if (defined $list->{'key:'}) {
+	@fields = @{$list->{'key:'}};
+    }
+
+    my $index_base_dir = &util::filename_cat($base_dir, $file);
+
+    # process each document
+    my $count = 0;
+    foreach my $docfile (keys (%$list)) {
+	last if ($maxdocs != -1 && $count >= $maxdocs);
+	$metadata = {}; # at present we can do this as metadata
+	                # will always be empty when it arrives
+	                # at this plugin - this might cause 
+	                # problems if things change though
+
+	# note that $list->{$docfile} is an array reference
+	if ($docfile !~ /key:/i) {
+	    my $i = 0;
+	    for ($i = 0; $i < scalar (@{$list->{$docfile}}); $i ++) {
+		if ($list->{$docfile}->[$i] =~ /^<([^>]+)>(.+)$/) {
+		    unless (defined ($metadata->{$1})) {
+			$metadata->{$1} = [];
+		    } 
+		    push (@{$metadata->{$1}}, $2);
+		} elsif (scalar @fields >= $i) {
+		    unless (defined ($metadata->{$fields[$i]})) {
+			$metadata->{$fields[$i]} = [];
+		    } 
+		    push (@{$metadata->{$fields[$i]}}, $list->{$docfile}->[$i]);
+		} else {
+		    $metadata->{'Subject'} = $list->{$docfile};
+		}
+	    }
+	    $count += &plugin::read ($pluginfo, $index_base_dir, $docfile, $metadata, $processor, $maxdocs);
+	}
+    }
+
+    return $count; # was processed
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/PDFPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/PDFPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/PDFPlug.pm	(revision 21083)
@@ -0,0 +1,71 @@
+###########################################################################
+#
+# PDFPlug.pm -- reasonably with-it pdf plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999-2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package PDFPlug;
+
+use ConvertToPlug;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+
+    # following title_sub removes "Page 1" added by pdftohtml, and a leading
+    # "1", which is often the page number at the top of the page. Bad Luck
+    # if your document title actually starts with "1 " - is there a better way?
+
+    my $self = new ConvertToPlug ($class, @_, "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+    
+    return bless $self, $class;
+}
+
+
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.pdf$^;
+}
+
+# so we don't inherit HTMLPlug's block exp...
+sub get_default_block_exp {
+    return "";
+}
+    
+
+# do plugin specific processing of doc_obj for HTML type
+sub process {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "PDFPlug: passing $_[3] on to $self->{'converted_to'}Plug\n"
+	if $self->{'verbosity'} > 1;
+    
+    return ConvertToPlug::process_type($self,"pdf",@_);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/PPTPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/PPTPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/PPTPlug.pm	(revision 21083)
@@ -0,0 +1,64 @@
+###########################################################################
+#
+# PPTPlug.pm -- plugin for importing Microsoft PowerPoint files.
+#  (currently only versions 95 and 97)
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2002 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package PPTPlug;
+
+use ConvertToPlug;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+
+    my $self = new ConvertToPlug ($class, @_);
+
+    # ppthtml outputs utf-8 already.
+    if ($self->{'input_encoding'} eq "auto") {
+	$self->{'input_encoding'} = "utf8";
+    }
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    return q^(?i)\.ppt$^;
+}
+    
+sub process {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "PPTPlug: passing $_[3] on to $self->{'converted_to'}Plug\n"
+	if $self->{'verbosity'} > 1;
+
+    return ConvertToPlug::process_type($self,"ppt",@_);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/PSPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/PSPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/PSPlug.pm	(revision 21083)
@@ -0,0 +1,161 @@
+###########################################################################
+#
+# PSPlug.pm -- this might look VERY similar to the PDF plugin...
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package PSPlug;
+
+use ConvertToPlug;
+use sorttools;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+
+    # title_sub removes leading "Page 1" or "1 " from auto-extracted title.
+
+    my $self = new ConvertToPlug ($class, "-convert_to", "text", @_ , "-title_sub", '^(Page\s+\d+)?(\s*1\s+)?');
+    
+    if (!parsargv::parse(\@_, 
+			 q^extract_date^, \$self->{'extract_date'},
+			 q^extract_pages^, \$self->{'extract_pages'},
+			 q^extract_title^, \$self->{'extract_title'},
+			 "allow_extra_options")) {
+	print STDERR "\nIncorrect options passed to HTMLPlug, check your collect.cfg configuration file\n";
+	&print_usage();
+	die "\n";
+    }
+
+    return bless $self, $class;
+}
+
+sub print_usage {
+    print STDERR "\n  usage: plugin PSPlug [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -extract_date               Extract date from PS header\n";
+    print STDERR "   -extract_pages              Extract pages from PS header\n";
+    print STDERR "   -extract_title              Extract title from PS header\n";
+    print STDERR "\n\nNote! This is a \"poor man's\" ps to text converter. If you are serious, consider\n";
+    print STDERR "using the PRESCRIPT package, which is available for download at\n   http://www.nzdl.org/html/software.html\n\n";
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(eps)$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.ps$^;
+}
+
+sub extract_metadata_from_postscript {
+    my $self = shift (@_);
+    my $filename = shift (@_);
+    my $doc = shift (@_);
+    my $section = $doc->get_top_section();
+
+    my $title_found = 0;
+    my $pages_found = 0;
+    my $date_found = 0;
+
+    print STDERR "PSPlug: extracting PostScript metadata from \"$filename\"\n" 
+	if $self->{'verbosity'} > 1;
+
+    open(INPUT, "<$filename");
+    my $date;
+
+    while(my $line =<INPUT>) {
+	if ($self->{'extract_title'} && !$title_found) {
+	    foreach my $word ($line =~ m|Title: ([-A-Za-z0-9@/\/\(\):,. ]*)|g) {
+		my $new_word = $word; 
+		$new_word =~ s/\(Untitled\)//i;
+		$new_word =~ s/\(Microsoft Word\)//i;
+		$new_word =~ s/Microsoft Word//i;
+		$new_word =~ s/^\(//i;
+		$new_word =~ s/\)$//i;
+		$new_word =~ s/^ - //i;
+		if ($new_word ne "") {
+		    $doc->add_utf8_metadata($section, "Title", $new_word );
+		    $title_found = 1;
+		}
+	    }
+	}
+	if ($self->{'extract_date'} && !$date_found) {
+            foreach my $word ($line =~ m/(Creation[-A-Za-z0-9@\/\(\):,. ]*)/g) {
+                if ($word =~ m/ ([A-Za-z][A-Za-z][A-Za-z]) ([0-9 ][0-9])  ?[0-9: ]+ ([0-9]{4})/) {
+                    $date = &sorttools::format_date($2,$1,$3);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+                if ($word =~ m/D:([0-9]{4})([0-9]{2})([0-9]{2})[0-9]{6}\)/) {
+                    $date = &sorttools::format_date($3,$2,$1);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+                if ($word =~ m/CreationDate: ([0-9]{4}) ([A-Za-z][A-Za-z][A-Za-z]) ([0-9 ][0-9]) [0-9:]*/) {
+                    $date = &sorttools::format_date($3,$2,$1);
+		    if (defined $date) {
+			$doc->add_utf8_metadata($section, "Date", $date );
+		    }
+                }
+		$date_found = 1;
+            }
+	}
+	if ($self->{'extract_pages'} && !$pages_found) {
+	    foreach my $word ($line =~ m/(Pages: [0-9]*)/g) {
+                my $digits = $word;
+                $digits =~ s/[^0-9]//g;
+		if ($digits ne "" && $digits ne "0") {
+		    $doc->add_utf8_metadata($section, "Pages", $digits );
+		    $pages_found = 1;
+		}
+            }
+	}
+    }
+}
+
+# do plugin specific processing of doc_obj for HTML type
+sub process {
+    my $self = shift (@_);
+    my ($trash, $trash2, $path, $file, $trash3, $doc) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "PSPlug: passing $_[3] on to $self->{'converted_to'}Plug\n" 
+	if $self->{'verbosity'} > 1;
+    
+    &extract_metadata_from_postscript($self,"$path/$file", $doc);
+
+    return ConvertToPlug::process_type($self,"ps",@_);
+}
+
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/plugins/RTFPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/RTFPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/RTFPlug.pm	(revision 21083)
@@ -0,0 +1,50 @@
+###########################################################################
+#
+# RTFPlug.pm -- plugin for importing Rich Text Format files.
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package RTFPlug;
+
+use ConvertToPlug;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+    return q^(?i)\.rtf$^;
+}
+    
+sub process {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};
+    print $outhandle "RTFPlug: passing $_[3] on to $self->{'converted_to'}Plug\n"
+	if $self->{'verbosity'} > 1;
+
+    return ConvertToPlug::process_type($self,"rtf",@_);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/RecPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/RecPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/RecPlug.pm	(revision 21083)
@@ -0,0 +1,484 @@
+###########################################################################
+#
+# RecPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# RecPlug is a plugin which recurses through directories processing
+# each file it finds.
+
+# RecPlug has one option: use_metadata_files.  When this is set, it will
+# check each directory for an XML file called "metadata.xml" that specifies
+# metadata for the files (and subdirectories) in the directory.
+#
+# Here's an example of a metadata file that uses three FileSet structures
+# (ignore the # characters):
+
+#<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+#<!DOCTYPE DirectoryMetadata SYSTEM "http://greenstone.org/dtd/DirectoryMetadata/1.0/DirectoryMetadata.dtd">
+#<DirectoryMetadata>
+#  <FileSet>
+#    <FileName>nugget.*</FileName>
+#    <Description>
+#      <Metadata name="Title">Nugget Point, The Catlins</Metadata>
+#      <Metadata name="Place" mode="accumulate">Nugget Point</Metadata>
+#    </Description>
+#  </FileSet>
+#  <FileSet>
+#    <FileName>nugget-point-1.jpg</FileName>
+#    <Description>
+#      <Metadata name="Title">Nugget Point Lighthouse, The Catlins</Metadata>
+#      <Metadata name="Subject">Lighthouse</Metadata>
+#    </Description>
+#  </FileSet>
+#  <FileSet>
+#    <FileName>kaka-point-dir</FileName>
+#    <Description>
+#      <Metadata name="Title">Kaka Point, The Catlins</Metadata>
+#    </Description>
+#  </FileSet>
+#</DirectoryMetadata>
+
+# Metadata elements are read and applied to files in the order they appear
+# in the file.
+#
+# The FileName element describes the subfiles in the directory that the
+# metadata applies to as a perl regular expression (a FileSet group may
+# contain multiple FileName elements). So, <FileName>nugget.*</FileName>
+# indicates that the metadata records in the following Description block
+# apply to every subfile that starts with "nugget".  For these files, a
+# Title metadata element is set, overriding any old value that the Title
+# might have had.
+#
+# Occasionally, we want to have multiple metadata values applied to a
+# document; in this case we use the "mode=accumulate" attribute of the
+# particular Metadata element.  In the second metadata element of the first
+# FileSet above, the "Place" metadata is accumulating, and may therefore be
+# given several values.  If we wanted to override these values and use a
+# single metadata element again, we could set the mode attribute to
+# "override" instead.  Remember: every element is assumed to be in override
+# mode unless you specify otherwise, so if you want to accumulate metadata
+# for some field, every occurance must have "mode=accumulate" specified.
+#
+# The second FileSet element above applies to a specific file, called
+# nugget-point-1.jpg.  This element overrides the Title metadata set in the
+# first FileSet, and adds a "Subject" metadata field.
+#
+# The third and final FileSet sets metadata for a subdirectory rather than
+# a file.  The metadata specified (a Title) will be passed into the
+# subdirectory and applied to every file that occurs in the subdirectory
+# (and to every subsubdirectory and its contents, and so on) unless the
+# metadata is explictly overridden later in the import.
+
+
+
+package RecPlug;
+
+use BasPlug;
+use plugin;
+use util;
+
+
+BEGIN {
+    @ISA = ('BasPlug');
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use XML::Parser;
+
+sub print_usage {
+    my ($plugin_name) = @_;
+
+    print STDERR "
+  usage: plugin RecPlug [options]
+
+   -use_metadata_files  Read metadata from metadata XML files.
+
+"
+}
+
+my ($self);
+sub new {
+    my $class = shift (@_);
+    
+    # $self is global for use within subroutines called by XML::Parser
+    $self = new BasPlug ($class, @_);
+    
+    if (!parsargv::parse(\@_,
+			 q^use_metadata_files^, \$self->{'use_metadata_files'},
+			 "allow_extra_options")) {
+	print STDERR "\nRecPlug uses an incorrect option.\n";
+	print STDERR "Check your collect.cfg configuration file.\n\n";
+    	&print_usage("RecPlug");
+	die "\n";
+    }
+    
+    if ($self->{'use_metadata_files'}) {
+	# create XML::Parser object for parsing metadata.xml files
+	my $parser = new XML::Parser('Style' => 'Stream',
+				     'Handlers' => {'Char' => \&Char,
+						    'Doctype' => \&Doctype
+						    });
+	$self->{'parser'} = $parser;
+	$self->{'in_filename'} = 0;
+	
+    }
+    
+    return bless $self, $class;
+}
+
+# return 1 if this class might recurse using $pluginfo
+sub is_recursive {
+    my $self = shift (@_);
+    
+    return 1;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+    
+    return 'CVS';
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+
+# This function passes around metadata hash structures.  Metadata hash
+# structures are hashes that map from a (scalar) key (the metadata element
+# name) to either a scalar metadata value or a reference to an array of
+# such values.
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $in_metadata, $processor, $maxdocs) = @_;
+    
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+    my $read_metadata_files = $self->{'use_metadata_files'};
+    
+    # Calculate the directory name and ensure it is a directory and
+    # that it is not explicitly blocked.
+    my $dirname = $file;
+    $dirname = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+    return undef unless (-d $dirname);
+    return 0 if ($self->{'block_exp'} ne "" && $dirname =~ /$self->{'block_exp'}/);
+    
+    # check to make sure we're not reading the archives or index directory
+    my $gsdlhome = quotemeta($ENV{'GSDLHOME'});
+    if ($dirname =~ m/^$gsdlhome\/.*?\/import.*?\/(archives|index)$/) {
+	print $outhandle "RecPlug: $dirname appears to be a reference to a Greenstone collection, skipping.\n";
+        return 0;
+    }
+    
+    # check to see we haven't got a cyclic path...
+    if ($dirname =~ m%(/.*){,41}%) {
+	print $outhandle "RecPlug: $dirname is 40 directories deep, is this a recursive path? if not increase constant in RecPlug.pm.\n";
+	return 0;
+    }
+    
+    # check to see we haven't got a cyclic path...
+    if ($dirname =~ m%.*?import/(.+?)/import/\1.*%) {
+	print $outhandle "RecPlug: $dirname appears to be in a recursive loop...\n";
+	return 0;
+    }
+    
+    if (($verbosity > 2) && ((scalar keys %$in_metadata) > 0)) {
+        print $outhandle "RecPlug: metadata passed in: ", 
+	join(", ", keys %$in_metadata), "\n";
+    }
+    
+    # Recur over directory contents.
+    my (@dir, $subfile);
+    my $count = 0;
+    print $outhandle "RecPlug: getting directory $dirname\n" if ($verbosity);
+    
+    # find all the files in the directory
+    if (!opendir (DIR, $dirname)) {
+	print $outhandle "RecPlug: WARNING - couldn't read directory $dirname\n";
+	return undef;
+    }
+    @dir = readdir (DIR);
+    closedir (DIR);
+    
+    # read XML metadata files (if supplied)
+    my $additionalmetadata = 0;      # is there extra metadata available?
+    my %extrametadata;               # maps from filespec to extra metadata keys
+    my @extrametakeys;               # keys of %extrametadata in order read
+    
+    if ($read_metadata_files) {
+
+	# read the directory "metadata.xml" file
+	my $metadatafile = &util::filename_cat ($dirname, 'metadata.xml');
+	if (-e $metadatafile) {
+	    print $outhandle "RecPlug: found metadata in $metadatafile\n" 
+		if ($verbosity);
+	    $self->read_metadata_xml_file($metadatafile, \%extrametadata, \@extrametakeys);
+	    $additionalmetadata = 1;
+	}
+    }
+
+    # import each of the files in the directory
+    my $out_metadata; 
+    foreach $subfile (@dir) {
+	    
+	last if ($maxdocs != -1 && $count >= $maxdocs);
+	next if ($subfile =~ /^\.\.?$/);
+	next if ($read_metadata_files && $subfile =~ /metadata\.xml$/);
+
+	# check for a symlink pointing back to a leading directory
+	if (-d "$dirname/$subfile" && -l "$dirname/$subfile") {
+	    # readlink gives a "fatal error" on systems that don't implement
+	    # symlinks. This assumes the the -l test above would fail on those.
+	    my $linkdest=readlink "$dirname/$subfile";
+	    if (!defined ($linkdest)) {
+		# system error - file not found?
+		warn "RecPlug: symlink problem - $!";
+	    } else {
+		# see if link points to current or a parent directory
+		if ($linkdest =~ m@^[\./\\]+$@ ||
+		    index($dirname, $linkdest) != -1) {
+		    warn "RecPlug: Ignoring recursive symlink ($dirname/$subfile -> $linkdest)\n";
+		    next;
+		    ;
+		}
+	    }
+	}
+
+	print $outhandle "RecPlug: preparing metadata for $subfile\n" if ($verbosity > 2);
+
+	# Make a copy of $in_metadata to pass to $subfile
+	$out_metadata = {};
+	&combine_metadata_structures($out_metadata, $in_metadata);
+
+	# Next add metadata read in XML files (if it is supplied)
+	if ($additionalmetadata == 1) {
+
+	    my ($filespec, $mdref);
+	    foreach $filespec (@extrametakeys) {
+		if ($subfile =~ /^$filespec$/) {
+		    print $outhandle "File \"$subfile\" matches filespec \"$filespec\"\n" 
+			if ($verbosity > 2);
+		    $mdref = $extrametadata{$filespec};
+		    &combine_metadata_structures($out_metadata, $mdref);
+		}
+	    }
+	}
+	
+	# Recursively read each $subfile
+	print $outhandle "RecPlug recurring: $subfile\n" if ($verbosity > 2);
+	$count += &plugin::read ($pluginfo, $base_dir, 
+				 &util::filename_cat($file, $subfile),
+				 $out_metadata, $processor, $maxdocs);
+    }
+    return $count;
+    
+}
+
+
+
+# Read a manually-constructed metadata file and store the data
+# it contains in the $metadataref structure.
+#
+# (metadataref is a reference to a hash whose keys are filenames
+# and whose values are metadata hash structures.)  
+
+sub read_metadata_xml_file {
+    my $self = shift(@_);
+    my ($filename, $metadataref, $metakeysref) = @_;
+    $self->{'metadataref'} = $metadataref;
+    $self->{'metakeysref'} = $metakeysref;
+    
+    eval {
+	$self->{'parser'}->parsefile($filename);
+    };
+    if ($@) {
+	die "RecPlug: ERROR $filename is not a well formed metadata.xml file ($@)\n";
+    }
+}
+
+sub Doctype {
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+
+    # allow the short-lived and badly named "GreenstoneDirectoryMetadata" files 
+    # to be processed as well as the "DirectoryMetadata" files which should now
+    # be created by import.pl
+    die if ($name !~ /^(Greenstone)?DirectoryMetadata$/);
+}
+
+sub StartTag {
+    my ($expat, $element) = @_;
+    
+    if ($element eq "FileSet") {
+	$self->{'saved_targets'} = [];
+	$self->{'saved_metadata'} = {};
+    }
+    elsif ($element eq "FileName") {
+	$self->{'in_filename'} = 1;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = $_{'name'};
+	if ((defined $_{'mode'}) && ($_{'mode'} eq "accumulate")) {
+	    $self->{'metadata_accumulate'} = 1;
+	} else {
+	    $self->{'metadata_accumulate'} = 0;
+	}
+    }
+}
+
+sub EndTag {
+    my ($expat, $element) = @_;
+
+    if ($element eq "FileSet") {
+	push (@{$self->{'metakeysref'}}, @{$self->{'saved_targets'}});
+	foreach my $target (@{$self->{'saved_targets'}}) {
+	    $self->{'metadataref'}->{$target} = $self->{'saved_metadata'};
+	}
+    }
+    elsif ($element eq "FileName") {
+	$self->{'in_filename'} = 0;
+    }
+    elsif ($element eq "Metadata") {
+	$self->{'metadata_name'} = "";
+    }
+
+}
+
+sub Text {
+
+    if ($self->{'in_filename'}) {
+	# $_ == FileName content
+	push (@{$self->{'saved_targets'}}, $_);
+    }
+    elsif (defined ($self->{'metadata_name'}) && $self->{'metadata_name'} ne "") {
+	# $_ == Metadata content
+	my $mname = $self->{'metadata_name'};
+	if (defined $self->{'saved_metadata'}->{$mname}) {
+	    if ($self->{'metadata_accumulate'}) {
+		# accumulate mode - add value to existing value(s)
+		if (ref ($self->{'saved_metadata'}->{$mname}) eq "ARRAY") {
+		    push (@{$self->{'saved_metadata'}->{$mname}}, $_);
+		} else {
+		    $self->{'saved_metadata'}->{$mname} = 
+			[$self->{'saved_metadata'}->{$mname}, $_];
+		}
+	    } else {
+		# override mode
+		$self->{'saved_metadata'}->{$mname} = $_;
+	    }
+	} else {
+	    if ($self->{'metadata_accumulate'}) {
+		# accumulate mode - add value into (currently empty) array
+		$self->{'saved_metadata'}->{$mname} = [$_];
+	    } else {
+		# override mode
+		$self->{'saved_metadata'}->{$mname} = $_;
+	    }
+	}
+    }
+}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+  $_[0]->{'Text'} .= $_[1];
+  return undef;
+}
+
+# Combine two metadata structures.  Given two references to metadata
+# element structures, add every field of the second ($mdref2) to the first
+# ($mdref1).  
+#
+# Afterwards $mdref1 will be updated, and $mdref2 will be unchanged.
+#
+# We have to be acreful about the way we merge metadata when one metadata
+# structure is in "override" mode and one is in "merge" mode.  In fact, we
+# use the mode from the second structure, $mdref2, because it is generally
+# defined later (lower in the directory structure) and is therefore more
+# "local" to the document concerned.
+#
+# Another issue is the use of references to pass metadata around.  If we
+# simply copy one metadata structure reference to another, then we're
+# effectively justr copyinga pointer, and changes to the new referene
+# will affect the old (copied) one also.  This also applies to ARRAY
+# references used as metadata element values (hence the "clonedata"
+# function below).
+
+sub combine_metadata_structures { 
+    my ($mdref1, $mdref2) = @_;
+    my ($key, $value1, $value2);
+
+    foreach $key (keys %$mdref2) {
+
+	$value1 = $mdref1->{$key};
+	$value2 = $mdref2->{$key};
+	
+	# If there is no existing value for this metadata field in 
+	# $mdref1, so we simply copy the value from $mdref2 over.
+	if (!defined $value1) {
+	    $mdref1->{$key} = &clonedata($value2);
+	} 
+	# Otherwise we have to add the new values to the existing ones.
+	# If the second structure is accumulated, then acculate all the
+	# values into the first structure
+	elsif ((ref $value2) eq "ARRAY") {
+	    # If the first metadata element is a scalar we have to 
+	    # convert it into an array before we add anything more.
+	    if ((ref $value1) ne 'ARRAY') {
+		$mdref1->{$key} = [$value1];
+		$value1 = $mdref1->{$key};
+	    }
+	    # Now add the value(s) from the second array to the first
+	    $value2 = &clonedata($value2);
+	    push @$value1, @$value2;
+	} 
+	# Finally, If the second structure is not an array erference, we
+	# know it is in override mode, so override the first structure.
+	else {
+	    $mdref1->{$key} = &clonedata($value2);
+	}
+    }
+}
+
+
+# Make a "cloned" copy of a metadata value.  
+# This is trivial for a simple scalar value,
+# but not for an array reference.
+
+sub clonedata {
+    my ($value) = @_;
+    my $result;
+
+    if ((ref $value) eq 'ARRAY') {
+	$result = [];
+	foreach my $item (@$value) {
+	    push @$result, $item;
+	}
+    } else {
+	$result = $value;
+    }
+    return $result;
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/ReferPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ReferPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ReferPlug.pm	(revision 21083)
@@ -0,0 +1,277 @@
+###########################################################################
+#
+# ReferPlug.pm - a plugin for bibliography records in Refer format
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright 2000 Gordon W. Paynter
+# Copyright 1999-2000 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+
+# ReferPlug reads bibliography files in Refer format.
+#
+# by Gordon W. Paynter (gwp@cs.waikato.ac.nz), November 2000
+#
+# Loosely based on hcibib2Plug by Steve Jones (stevej@cs.waikato.ac.nz).
+# Which was based on EMAILPlug by Gordon Paynter (gwp@cs.waikato.ac.nz).
+# Which was based on old versions of HTMLplug and HCIBIBPlugby by Stefan
+# Boddie and others -- it's hard to tell what came from where, now.
+#
+#
+# ReferPlug creates a document object for every reference in the file.
+# It is a subclass of SplitPlug, so if there are multiple records, all
+# are read.
+#
+# Document text:
+#   The document text consists of the reference in Refer format
+#
+# Metadata:
+#	$Creator	%A	Author name
+#	$Title		%T	Title of article of book
+#	$Journal	%J	Title of Journal
+#	$Booktitle	%B	Title of book containing the publication
+#	$Report		%R	Type of Report, paper or thesis
+#	$Volume		%V	Volume Number of Journal
+#	$Number		%N	Number of Journal within Volume
+#	$Editor		%E	Editor name
+#	$Pages		%P	Page Number of article
+#	$Publisher	%I	Name of Publisher
+#	$Publisheraddr	%C	Publisher's address
+#	$Date		%D	Date of publication
+#	$Keywords	%K	Keywords associated with publication 
+#	$Abstract	%X	Abstract of publication
+#	$Copyright	%*	Copyright information for the article
+#
+
+
+package ReferPlug;
+
+use SplitPlug;
+
+
+# ReferPlug is a sub-class of BasPlug.
+sub BEGIN {
+    @ISA = ('SplitPlug');
+}
+
+# This plugin processes files with the suffix ".bib"
+sub get_default_process_exp {
+    return q^(?i)\.bib$^;
+}
+
+# This plugin splits the input text at blank lines
+sub get_default_split_exp {
+    return q^\n\s*\n^;
+}
+
+
+# The process function reads a single bibliogrphic record and stores
+# it as a new document.
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    # Check that we're dealing with a valid Refer file
+    return undef unless ($$textref =~ /^\s*%/);
+
+    # Report that we're processing the file
+    print $outhandle "ReferPlug: processing $file\n"
+	if ($self->{'verbosity'}) > 1;
+
+    my %field = ('H', 'Header',
+		 'A', 'Creator',
+		 'T', 'Title',
+		 'J', 'Journal',
+		 'B', 'Booktitle',
+		 'R', 'Report',
+		 'V', 'Volume',
+		 'N', 'Number',
+		 'E', 'Editor',
+		 'P', 'Pages',
+		 'I', 'Publisher',
+		 'C', 'PublisherAddress',
+		 'D', 'Date',
+		 'O', 'OtherInformation',
+		 'K', 'Keywords',
+		 'X', 'Abstract',
+		 '*', 'Copyright');
+
+    # Metadata fields 
+    my %metadata;
+    my ($id, $Creator, $Keywords, $text);
+    my @lines = split(/\n+/, $$textref);
+
+    
+    # Read and process each line in the bib file.
+    # Each file consists of a set of metadata items, one to each line
+    # with the Refer key followed by a space then the associated data
+    foreach my $line (@lines) {
+	
+	# Add each line.  Most lines consist of a field identifer and
+	# then data, and we simply store them, though we treat some
+	# of the fields a bit differently.
+
+	$line =~ s/\s+/ /g;
+	$text .= "$line\n";
+	$ReferFormat .= "$line\n";
+	
+	next unless ($line =~ /^%[A-Z\*]/);
+	$id = substr($line,1,1);
+	$line =~ s/^%. //;
+   	
+	# Add individual authors in "Lastname, Firstname" format.
+	# (The full set of authors will be added below as "Creator".)
+	if ($id eq "A") {
+
+	    # Reformat and add author name
+	    my @words = split(/ /, $line);
+	    my $lastname = pop @words;
+	    my $firstname = join(" ",  @words);
+	    my $fullname = $lastname . ", " . $firstname;
+	    
+	    # Add each name to set of Authors
+	    if ($fullname =~ /\w/) {
+		$fullname = &text_into_html($fullname);
+		$doc_obj->add_metadata ($cursection, "Author", $fullname);
+	    }
+	}
+
+	# Add individual keywords.
+	# (The full set of authors will be added below as "Keywords".)
+	if ($id eq "K") {
+	    my @keywordlist = split(/,/, $line);
+	    foreach my $k (@keywordlist) {
+		$k = lc($k);
+		$k =~ s/\s*$//; 
+		$k =~ s/^\s*//; 
+		if ($k =~ /\w/) {
+		    $k = &text_into_html($k);
+		    $doc_obj->add_metadata ($cursection, "Keyword", $k);
+		}
+	    } 
+	}
+	
+	# Add this line of metadata
+	$metadata{$id} .= "$line\n";
+    }
+
+
+
+    # Add the various field as metadata
+    my ($f, $name, $value);
+    foreach $f (keys %metadata) {
+	
+	next unless (defined $field{$f});
+	next unless (defined $metadata{$f});	
+
+	$name = $field{$f};
+	$value = $metadata{$f};
+
+	# Add the various field as metadata	
+	
+	# The Creator metadata is found by concatenating authors.
+	if ($f eq "A") {
+
+	    my @authorlist = split(/\n/, $value);
+	    my $lastauthor = pop @authorlist;
+	    my $Creator = "";
+	    if (scalar @authorlist) {
+		$Creator = join(", ", @authorlist) . "and $lastauthor";
+	    } else {
+		$Creator = $lastauthor;
+	    }
+
+	    if ($Creator =~ /\w/) {
+		$Creator = &text_into_html($Creator);
+		$doc_obj->add_metadata ($cursection, "Creator", $Creator);
+	    }
+	}
+
+	# The rest are added in a standard way
+	else {
+	    $value = &text_into_html($value);
+	    $doc_obj->add_metadata ($cursection, $name, $value);
+	}
+
+	# Books and Journals are additionally marked for display purposes
+	if ($f eq "B") {
+	    $doc_obj->add_metadata($cursection, "BookConfOnly", 1);
+	} elsif ($f eq "J") {
+	    $doc_obj->add_metadata($cursection, "JournalsOnly", 1); 
+	}
+
+
+    }
+
+    # Add the text in refer format(all fields)
+    if ($text =~ /\w/) {
+	$text = &text_into_html($text);
+	$doc_obj->add_text ($cursection, $text);
+    }
+
+    return 1; # processed the file
+}
+
+1;
+#
+# Convert a text string into HTML.
+#
+# The HTML is going to be inserted into a GML file, so 
+# we have to be careful not to use symbols like ">",
+# which ocurs frequently in email messages (and use
+# &gt instead.
+#
+# This function also turns links and email addresses into hyperlinks,
+# and replaces carriage returns with <BR> tags (and multiple carriage
+# returns with <P> tags).
+#
+
+sub text_into_html {
+    my ($text) = @_;
+
+
+    # Convert problem charaters into HTML symbols
+    $text =~ s/&/&amp;/g;
+    $text =~ s/</&lt;/g;
+    $text =~ s/>/&gt;/g;
+    $text =~ s/\"/&quot;/g;
+    $text =~ s/\'/ /g;
+    $text =~ s/\+/ /g;
+    $text =~ s/\(/ /g;
+    $text =~ s/\)/ /g;
+
+    # convert email addresses and URLs into links
+    $text =~ s/([\w\d\.\-]+@[\w\d\.\-]+)/<a href=\"mailto:$1\">$1<\/a>/g;
+    $text =~ s/(http:\/\/[\w\d\.\-]+[\/\w\d\.\-]*)/<a href=\"$1">$1<\/a>/g;
+
+    # Clean up whitespace and convert \n charaters to <BR> or <P>
+    $text =~ s/ +/ /g;
+    $text =~ s/\s*$//; 
+    $text =~ s/^\s*//; 
+    $text =~ s/\n/\n<BR>/g;
+    $text =~ s/<BR>\s*<BR>/<P>/g;
+
+    return $text;
+}
+
+
Index: /main/tags/2.38/gsdl/perllib/plugins/SRCPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/SRCPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/SRCPlug.pm	(revision 21083)
@@ -0,0 +1,243 @@
+###########################################################################
+#
+# SRCPlug.pm -- source code plugin
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+# John McPherson Nov 2000
+# originally based on TEXTPlug
+
+# filename is currently used for Title ( optionally minus some prefix )
+
+# Current languages:
+#   text: READMEs/Makefiles
+#   C/C++   (currently extracts #include statements and C++ class decls)
+#   Perl    (currently only done as text)
+#   Shell   (currently only done as text)
+
+
+package SRCPlug;
+
+use BasPlug;
+use parsargv;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+
+sub print_usage {
+    print STDERR "\n  usage: plugin SRCPlug [options]\n";
+    print STDERR "Try to import C and C++ source code. Adds \"class\"";
+    print STDERR " metadata.\n\n";
+    print STDERR "  options:\n";
+    print STDERR "  -remove_prefix <pattern>   Remove this leading pattern from the filename\n";
+    print STDERR "                             (eg -remove_prefix /tmp/XX/src/). The default is to\n";
+    print STDERR "                             remove the whole path from the filename.\n";
+    print STDERR "\n";
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ($class, @_);
+
+    if (!parsargv::parse(\@_,
+			 q^remove_prefix/(\S+)/^, \$self->{'remove_prefix'},
+			 "allow_extra_options"
+			 )
+	) {
+        print STDERR "\nIncorrect options passed to SRCPlug, ";
+        print STDERR "check your collect.cfg configuration file\n";
+        &print_usage();
+        die "\n";
+    }
+    return bless $self, $class;
+}
+
+sub get_default_block_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.(o|obj|a|so|dll)$^;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+#    return q^(?i)\.te?xt$^;
+    return q^(Makefile.*|README.*|(?i)\.(c|cc|cpp|C|h|hpp|pl|pm|sh))$^;
+}
+
+
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    print $outhandle "SRCPlug: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+    
+    my $cursection = $doc_obj->get_top_section();
+
+    my $filetype="text";  # Makefiles, READMEs, ...
+    if ($file =~ /\.(cc|h|cpp|C)$/) {$filetype="C++";} # assume all .h files...
+    elsif ($file =~ /\.c$/)         {$filetype="C";}
+    elsif ($file =~ /\.p(l|m)$/)    {$filetype="perl";}
+    elsif ($file =~ /\.sh$/)        {$filetype="sh";}
+
+    # modify '<' and '>' for GML... (even though inside <pre> tags!!)
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+    $$textref =~ s/_/&#95;/g;
+    # try _escape_text($text) from doc.pm....
+
+    # don't want mg to turn escape chars into actual values
+    $$textref =~ s/\\/\\\\/g;
+
+    # use filename (minus any prefix) as the title.
+    my $title;
+    if ($self->{'remove_prefix' ne ""}) {
+	($title = $file) =~ s/^$self->{'remove_prefix'}//;
+    } else {
+	($title = $file) =~ s@^.*[/\\]@@; # remove pathname by default
+    }
+    $doc_obj->add_utf8_metadata ($cursection, "Title", $title);
+    # remove the gsdl prefix from the filename
+    my $relative_filename=$file;
+    $relative_filename =~ s@^.*?gsdl[/\\]@@;
+    $doc_obj->add_utf8_metadata ($cursection, "filename", $relative_filename);
+
+    # class information from .h and .cc and .C and .cpp files
+    if ($filetype eq "C++") 
+    {
+	process_c_plus_plus($textref,$pluginfo, $base_dir, 
+				   $file, $metadata, $doc_obj);
+    } elsif ($filetype eq "C")
+    {
+	get_includes_metadata($textref, $doc_obj);
+    }
+
+
+     # default operation...
+     # insert preformat tags and add text to document object
+    $doc_obj->add_utf8_text($cursection, "<pre>\n$$textref\n</pre>");
+    
+    return 1;
+}
+
+
+
+
+sub get_includes_metadata {
+    my ($textref, $doc_obj) = @_;
+    
+    my $topsection = $doc_obj->get_top_section();
+
+    # Get '#include' directives for metadata
+    if ($$textref =~ /\#\W?include\b/) {
+	my $includes=$$textref;
+
+	# remove commented lines
+	$includes =~ s@/\*.*?\*/@@sg; # treat string as single line
+	# ? means match smallest instead of longest !!!
+	$includes =~ s@//.*$@@mg; # treat string as multiple lines
+
+	# remove non- include lines (well, lines without a '#')
+	$includes =~ s/^[^\#]*$//mg;
+
+	# lines don't always start '#include "'.... we have to allow (eg)
+	# '#  include ...'
+	# '  #include ...'
+	# also make sure it contains an actual filename, as we don't
+	# do pre-processing (eg #including a macro).
+	while ($includes =~ /\#\s*include.*(\"|&lt;)/) {
+	    $includes =~ s/^.*?include.*?(\"|&lt;)(.*)(\"|&gt;).*$//m;
+	    my $include=$2;
+	    # remove leading pathname
+	    $include =~ s@^.*(/|\\)@@;
+
+	    my $incs_done=$doc_obj->get_metadata($section, "includes");
+	    foreach my $elem (@$incs_done) {
+		if ("$elem" eq "$include") {goto header_done;}
+	    }
+	    $doc_obj->add_utf8_metadata($topsection, "includes", $include);
+	  header_done:
+	}
+    }
+}
+
+
+
+sub process_c_plus_plus {
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+
+    my $topsection = $doc_obj->get_top_section();
+
+
+    # Check for include metadata
+    get_includes_metadata($textref, $doc_obj);
+
+
+
+    # Get class declarations (but not forward declarations...) as metadata
+    if ($$textref =~ /\bclass\b/ ) {
+	my $classnames=$$textref;
+	
+	# remove commented lines
+	$classnames =~ s@/\*.*?\*/@@sg;
+	$classnames =~ s@//.*$@@mg;
+	while ($classnames =~ /\bclass\b/) {
+
+	    # delete all lines up to the next "class"
+	    while ($classnames !~ /^[^\n]*\bclass\b[^\n]*\n/)
+	    {$classnames =~ s/.*\n//;}
+	    
+#	    $classnames =~ s/^([^c][^l])*(.)?$//mg; # delete unneccessary lines
+
+	    # get the line including the next "class" and remove it from
+	    # our tmp text.
+	    $classnames =~ s/^(.*\bclass\b.*)$//m;
+
+	    # don't index if merely a reference/fwd decl. of another class
+	    if ($1 !~ /(friend\Wclass)|(class\W\w+\W?\;)|(\/\/.*class)/) {
+		# $1 is still the whole line - eg:
+		# "class StaffSystem: public BaseStaffSystem"
+		my $wholeline=$1;
+		my $classname=$1;
+		$classname =~ s/.*class\W(\w+).*/$1/;
+		my $classes=$doc_obj->get_metadata($section, "class");
+		foreach my $elem (@$classes) {
+		    if ("$elem" eq "$classname") {goto class_done;}
+		}
+		$doc_obj->add_utf8_metadata($topsection, "class", $classname);
+	      class_done:
+		$doc_obj->add_utf8_metadata($topsection, "classdecl", $wholeline);
+	    }
+	}
+    } # end of "class"
+
+    return 1;
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/plugins/SplitPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/SplitPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/SplitPlug.pm	(revision 21083)
@@ -0,0 +1,207 @@
+###########################################################################
+#
+# SplitPlug.pm - a plugin for splitting input files into segments that
+#                will then be individually processed.
+#
+#
+# Copyright 2000 Gordon W. Paynter (gwp@cs.waikato.ac.nz)
+# Copyright 2000 The New Zealand Digital Library Project
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# 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.
+#
+###########################################################################
+
+
+# SplitPlug is a plugin for splitting input files into segments that will
+# then be individually processed.  
+
+# This plugin should not be called directly.  Instead, if you need to
+# process input files that contain several documents, you should write a
+# plugin with a process function that will handle one of those documents
+# and have it inherit from SplitPlug.  See ReferPlug for an example.
+
+
+package SplitPlug;
+
+use BasPlug;
+use util;
+
+
+# SplitPlug is a sub-class of BasPlug.
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    $self = new BasPlug($class, @_);
+
+    if (!parsargv::parse(\@_, 
+			 q^split_exp/.*/^, \$self->{'split_exp'},
+			 "allow_extra_options")) {
+	print STDERR "\nIncorrect options passed to $class.";
+	print STDERR "\nCheck your collect.cfg configuration file\n";
+	die "\n";
+    }
+
+    return bless $self, $class;
+}
+
+sub init {
+    my $self = shift (@_);
+    my ($verbosity, $outhandle, $failhandle) = @_;
+
+    $self->BasPlug::init($verbosity, $outhandle, $failhandle);
+
+    if ((!defined $self->{'process_exp'}) || ($self->{'process_exp'} eq "")) {
+
+	$self->{'process_exp'} = $self->get_default_process_exp ();
+	if ($self->{'process_exp'} eq "") {
+	    warn ref($self) . " Warning: Non-recursive plugin has no process_exp\n";
+	}
+    }
+
+
+    # set split_exp to default unless explicitly set
+    if (!$self->{'split_exp'}) {
+	$self->{'split_exp'} = $self->get_default_split_exp ();
+    }
+
+}
+
+# This plugin recurs over the segments it finds
+sub is_recursive {
+    return 1;
+}
+
+# By default, we split the input text at blank lines
+sub get_default_split_exp {
+    return q^\n\s*\n^;
+}
+
+
+# The read function opens a file and splits it into parts. 
+# Each part is sent to the process function
+#
+# Returns: Number of document objects created (or undef if it fails)
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+    my $outhandle = $self->{'outhandle'};
+    my $verbosity = $self->{'verbosity'};
+
+    # Figure out the exact filename of this file (and maybe block it)
+    my $filename = &util::filename_cat($base_dir, $file);
+    my $block_exp = $self->{'block_exp'};
+    return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    my $plugin_name = ref ($self);
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+
+    # Do encoding stuff
+    my ($language, $encoding) = $self->textcat_get_language_encoding ($filename);
+
+    # Read in file ($text will be in utf8)
+    my $text = "";
+    $self->read_file ($filename, $encoding, $language, \$text);
+
+    if ($text !~ /\w/) {
+	my $outhandle = $self->{'outhandle'};
+	print $outhandle "$plugin_name: ERROR: $file contains no text\n" 
+	    if $self->{'verbosity'};
+
+	my $failhandle = $self->{'failhandle'};
+	print $failhandle "$file: " . ref($self) . ": file contains no text\n";
+	$self->{'num_not_processed'} ++;
+
+	return 0;
+    }
+    
+    
+    # Split the text into several smaller segments
+    my $split_exp = $self->{'split_exp'};
+    my @segments = split(/$split_exp/, $text);
+    print $outhandle "SplitPlug found " . (scalar @segments) . " documents in $filename\n" 
+	if $self->{'verbosity'};
+
+    # Process each segment in turn
+    my ($count, $segment, $segtext, $status, $id);
+    $segment = 0;
+    $count = 0;
+    foreach $segtext (@segments) {
+	$segment++;
+
+	# create a new document
+	my $doc_obj = new doc ($filename, "indexed_doc");
+	$doc_obj->set_OIDtype ($processor->{'OIDtype'});
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Language", $language);
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Encoding", $encoding);
+	my ($filemeta) = $file =~ /([^\\\/]+)$/;
+	$doc_obj->add_utf8_metadata($doc_obj->get_top_section(), "Source", &ghtml::dmsafe($filemeta));
+	if ($self->{'cover_image'}) {
+	  $self->associate_cover_image($doc_obj, $filename);
+	}
+
+	# Calculate a "base" document ID.
+	if (!defined $id) {
+	    $doc_obj->set_OID();
+	    $id = $doc_obj->get_OID();
+	}
+    
+	# include any metadata passed in from previous plugins 
+	# note that this metadata is associated with the top level section
+	$self->extra_metadata ($doc_obj, $doc_obj->get_top_section(), $metadata);
+
+	# do plugin specific processing of doc_obj
+	print $outhandle "segment $segment - " if ($self->{'verbosity'});
+	$status = $self->process (\$segtext, $pluginfo, $base_dir, $file, $metadata, $doc_obj);
+	if (!defined $status) {
+	    print $outhandle "WARNING - no plugin could process segment $segment of $file\n" 
+		if ($verbosity >= 2);
+	    next;
+	}
+	$count += $status;
+
+	# do any automatic metadata extraction
+	$self->auto_extract_metadata ($doc_obj);
+
+	# add an OID
+	$self->set_OID($doc_obj, $id, $segment);
+
+	# process the document
+	$processor->process($doc_obj);
+
+	$self->{'num_processed'} ++;
+    }
+
+    # Return number of document objects produced
+    return $count; 
+}
+
+sub set_OID {
+    my $self = shift (@_);
+    my ($doc_obj, $id, $segment_number) = @_;
+    
+    $doc_obj->set_OID($id . "s" . $segment_number);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/TEXTPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/TEXTPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/TEXTPlug.pm	(revision 21083)
@@ -0,0 +1,120 @@
+###########################################################################
+#
+# TEXTPlug.pm -- simple text plugin
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# creates simple single-level document. Adds Title metadata 
+# of first line of text (up to 100 characters long).
+
+package TEXTPlug;
+
+use BasPlug;
+use parsargv;
+
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub print_usage {
+    print STDERR "\n  usage: plugin TEXTPlug [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -title_sub\t     Substitution expression to modify string stored as Title.\n";
+    print STDERR "\t\t     Used by, for example, PSPlug to remove \"Page 1\" etc from\n";
+    print STDERR "\t\t     text used as the title.\n";
+
+    print STDERR "\n";
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ($class, @_);
+
+    if (!parsargv::parse(\@_, 
+			 q^title_sub/.*/^, \$self->{'title_sub'},
+			 "allow_extra_options")) {
+	print STDERR "\nIncorrect options passed to TEXTPlug, check your collect.cfg configuration file\n";
+	&print_usage();
+        die "\n";
+    }
+
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.te?xt$^;
+}
+
+# do plugin specific processing of doc_obj
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    print $outhandle "TEXTPlug: processing $file\n" 
+	if $self->{'verbosity'} > 1;
+    
+    my $cursection = $doc_obj->get_top_section();
+    
+    # get title metadata
+    # (don't need to get title if it has been passed
+    # in from another plugin)
+    if (!defined $metadata->{'Title'}) {
+	my ($title) = $$textref;
+	$title =~ /^\s+/s;
+	if (defined $self->{'title_sub'} &&
+	    $self->{'title_sub'}) {$title =~ s/$self->{'title_sub'}//;}
+	$title =~ /^\s*([^\n]*)/s; $title=$1;
+	if (length($title) > 100) {
+	    $title = substr ($title, 0, 100) . "...";
+	}
+	$doc_obj->add_utf8_metadata ($cursection, "Title", $title);
+    }
+
+    # we need to escape the escape character, or else mg will convert into
+    # eg literal newlines, instead of leaving the text as '\n'
+    $$textref =~ s/\\/\\\\/g;
+    $$textref =~ s/</&lt;/g;
+    $$textref =~ s/>/&gt;/g;
+
+    # insert preformat tags and add text to document object
+    $doc_obj->add_utf8_text($cursection, "<pre>\n$$textref\n</pre>");
+
+    return 1;
+}
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/perllib/plugins/UnknownPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/UnknownPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/UnknownPlug.pm	(revision 21083)
@@ -0,0 +1,217 @@
+###########################################################################
+#
+# UnknownPlug.pm -- Plugin for files you know about but Greenstone doesn't
+#
+# A component of the Greenstone digital library software from the New
+# Zealand Digital Library Project at the University of Waikato, New
+# Zealand.
+#
+# Copyright (C) 2001 Gordon W. Paynter
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# UnknownPlug - a plugin for unknown files
+
+# This is a simple Plugin for importing files in formats that
+# Greenstone doesn't know anything about.  A fictional document will
+# be created for every such file, and the file itself will be passed
+# to Greenstone as the "associated file" of the document.
+
+# Here's an example where it is useful: I have a collection of
+# pictures that include a couple of quicktime movie files with names
+# like DCP_0163.MOV.  Rather than write a new plugin for quicktime
+# movies, I add this line to the collection configuration file:
+
+# plugin UnknownPlug -process_exp "*.MOV" -assoc_field "movie"
+
+# A document is created for each movie, with the associated movie
+# file's name in the "movie" metadata field.  In the collection's
+# format strings, I use the {If} macro to output different text for
+# each type of file, like this:
+
+# {If}{[movie],<HTML for displaying movie>}{If}{[Image],<HTML for displaying image>}
+
+# You can also add extra metadata, such as the Title, Subject, and
+# Duration, with metadata.xml files and RecPlug.  (If you want to use
+# UnknownPlug with more than one type of file, you will have to add
+# some sort of distinguishing metadata in this way.)
+
+
+
+package UnknownPlug;
+
+use BasPlug;
+use parsargv;
+
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub print_usage {
+    print STDERR "\n  usage: plugin UnknownPlug [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -assoc_field\t     Name of the metadata field that will hold\n";
+    print STDERR "\t\t     the associated file's name.\n";
+    print STDERR "\n";
+    print STDERR "   -file_type\t     Mime type of the file (e.g. image/gif)\n";
+    print STDERR "\n";
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ($class, @_);
+
+    if (!parsargv::parse(\@_, 
+			 q^assoc_field/.*/^, \$self->{'assoc_field'},
+			 q^file_type/.*/^, \$self->{'file_type'},
+			 "allow_extra_options")) {
+	print STDERR "\nIncorrect options passed to UnknownPlug, check your collect.cfg configuration file\n";
+	&print_usage();
+        die "\n";
+    }
+
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    return '';
+}
+
+
+# Associate the unknown file with the new document
+
+sub associate_unknown_file {
+    my $self = shift (@_);
+    my $filename = shift (@_);   # filename with full path
+    my $file = shift (@_);       # filename without path
+    my $doc_obj = shift (@_);
+    
+    my $verbosity = $self->{'verbosity'};
+    my $outhandle = $self->{'outhandle'};
+
+    # check the filename is okay
+    return 0 if ($file eq "" || $filename eq "");
+
+    if ($filename =~ m/ /) {
+	print $outhandle "UnknownPlug: \"$filename\" contains a space. choking.\n";
+	return undef;
+    }
+
+    # Add the file as an associated file ...
+    my $section = $doc_obj->get_top_section();
+    my $file_type = $self->{'file_type'} || "unknown/unknown";
+    my $assoc_field = $self->{'assoc_field'} || "unknown_file";
+
+    $doc_obj->associate_file($filename, $file, $mime_type, $section);
+    $doc_obj->add_metadata ($section, $assoc_field, $file);
+    
+    return 1;
+}
+
+
+
+# The UnknownPlug read() function. This function does all the right
+# things to make general options work for a given plugin.  UnknownPlug
+# overrides read() because there is no need to read the actual text of
+# the file in, because the contents of the file is not text...
+#
+#
+# Return number of files processed, undef if can't process 
+#
+# Note that $base_dir might be "" and that $file might include directories
+
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+
+    my $outhandle = $self->{'outhandle'};
+
+    # Make sure we're processing the correct file
+    my $filename = &util::filename_cat($base_dir, $file);
+    return 0 if $self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/;
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    print $outhandle "UnknownPlug processing \"$filename\"\n"
+	    if $self->{'verbosity'} > 1;
+
+    #if there's a leading directory name, eat it...
+    $file =~ s/^.*[\/\\]//;
+    
+    # create a new document
+    my $doc_obj = new doc ($filename, "indexed_doc");
+    $doc_obj->set_OIDtype ($processor->{'OIDtype'});    
+
+    # associate the file with the document
+    if (associate_unknown_file($self, $filename, $file, $doc_obj) != 1)
+    {
+	print "UnknownPlug: couldn't process \"$filename\"\n";
+	return 0;
+    }
+
+    #create an empty text string so we don't break downstream plugins 
+    my $text = "Dummy text inserted by UnknownPlug...";
+
+    # include any metadata passed in from previous plugins 
+    my $section = $doc_obj->get_top_section();
+    $self->extra_metadata ($doc_obj, $section, $metadata);
+
+    # do plugin specific processing of doc_obj
+    return undef unless defined ($self->process (\$text, $pluginfo, $base_dir, 
+						 $file, $metadata, $doc_obj));
+
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($doc_obj);
+
+    # add an OID
+    $doc_obj->set_OID();
+    $doc_obj->add_text($section, $text);
+
+    # process the document
+    $processor->process($doc_obj);
+
+    return 1;
+}
+
+
+# UnknownPlug processing of doc_obj.  In practice we don't need to do
+# anything here because the read function takes care of everything.
+
+sub process {
+    my $self = shift (@_);
+    my ($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    my $outhandle = $self->{'outhandle'};
+    
+    return 1;
+}
+
+
+1;
+
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/perllib/plugins/W3ImgPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/W3ImgPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/W3ImgPlug.pm	(revision 21083)
@@ -0,0 +1,1031 @@
+###########################################################################
+#
+# W3ImgPlug.pm -- Context-based image indexing plugin for HTML documents
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# DESCRIPTION:
+#
+#  Extracts images and associated text and metadata from
+#  web pages as individual documents for indexing. Thumbnails
+#  are created from each image for browsing purposes.
+#
+#  Options are available for configuring the aggressiveness of the
+#  associated text extraction mechanisms. A higher level of
+#  aggressiveness will extract more text and consequently
+#  may mean lower accuracy (precision); however, it may also 
+#  retrieve more of the relevant images from the collection (recall). 
+#  Lower levels of aggressiveness maybe result in slightly faster
+#  collection builds at the import stage.
+#
+#  W3ImgPlug is a subclass of HTMLPlug (i.e. it will index pages also 
+#  if required). It can be used in place of HTMLPlug to index both
+#  pages and their images.
+#
+# REQUIREMENTS:
+#   
+#  The ImageMagick image manipulation is used to create
+#  thumbnails and extract some image metadata. (Available 
+#  from http://www.imagemagick.org/)
+#
+#  Unix:
+#    Many Linux distributions contain ImageMagick.
+#
+#  Windows:
+#    ImageMagick can be downloaded from the website above.
+#    Make sure the system path includes the ImageMagick binaries
+#    before using W3ImgPlug.
+#
+#    NOTE: NT/2000/XP contain a filesystem utility 'convert.exe' 
+#    with the same name as the image conversion utility. The
+#    ImageMagick FAQ recommends renaming the filesystem
+#    utility (e.g. to 'fsconvert.exe') to avoid this clash.
+#
+# USAGE:  
+#
+#  An image document consists of metadata elements:
+#
+#   OriginalFilename, FilePath, Filename, FileExt, FileSize,
+#   Width, Height, URL, PageURL, ThumbURL, CacheURL, CachePageURL
+#   ImageText, PageTitle
+#
+#  Most of these are only useful in format strings (e.g. ThumbURL, 
+#  Filename, URL, PageURL, CachePageURL). 
+#
+#  ImageText, as the name suggests contains the indexable text.
+#  (unless using the -document_text plugin option)
+#
+#  Since image documents are made up of metadata elements 
+#  alone, format strings are needed to display them properly. 
+#  NOTE: The receptionist will only display results (e.g. thumbnails)
+#  in 4 columns if the format string begins with "<td><table>".
+#
+#  The example below takes the user to the image within the
+#  source HTML document rather than using a format string
+#  on DocumentText to display the image document itself.
+#
+#  Example collect.cfg:
+#
+#   ...
+#
+#   indexes document:ImageText document:text
+#   defaultindex document:ImageText
+#  
+#   collectionmeta .document:ImageText "images"
+#   collectionmeta .document:text "documents"
+#
+#   ...
+#
+#   plugin W3ImgPlug -index_pages -aggressiveness 6
+#
+#   ...
+#  
+#   format SearchVList '<td>{If}{[Title],[link][icon]&nbsp;[Title][[/link],
+#    <table><tr><td align="center"><a href="[CachePageURL]">
+#    <img src="[ThumbURL]"></a></td></tr><tr><td align="center">
+#    <a href="[CachePageURL]"><font size="-1">[OriginalFilename]</font></a>
+#    <br>[Width]x[Height]</td></tr></table>}</td>'
+#
+#   ...
+#
+ 
+package W3ImgPlug;
+
+use HTMLPlug;
+use ghtml;
+use unicode;
+use util;
+use parsargv;
+use strict 'subs';
+
+sub BEGIN {
+    @ISA = qw( HTMLPlug );
+}
+
+sub print_usage {
+    print STDERR "\nUsage: plugin W3ImgPlug [options]\n\n";
+    print STDERR "  options:\n";
+    print STDERR "   -aggressiveness     Range of related text extraction techniques to use [4]\n";
+    print STDERR "                        1: Filename, path, ALT text only\n";
+    print STDERR "                        2: All of 1, plus caption where available\n";
+    print STDERR "                        3: All of 2, plus near paragraphs where available\n";
+    print STDERR "                        4: All of 3, plus previous headers (<h1>, <h2>...)\n";
+    print STDERR "                           where available\n";
+    print STDERR "                        5: All of 4, plus textual references where available\n";
+    print STDERR "                        6: All of 4, plus page metatags (title, keywords, etc)\n";
+    print STDERR "                        7: All of 6, 5 and 4 combined\n";
+    print STDERR "                        8: All of 7, plus repeat caption, filename, etc (raise \n";
+    print STDERR "                           ranking of more relevant results)\n";
+    print STDERR "                        10: All of 1, plus full text of source page\n";
+    print STDERR "\n";
+    print STDERR "   -no_cache_images    Don't cache images (point to URL of original)\n";
+    print STDERR "   -index_pages        Index the pages along with the images.\n";
+    print STDERR "                       Otherwise reference the pages at the source URL\n";
+    print STDERR "   -min_size           Bytes. Skip images smaller than this [2000]\n";
+    print STDERR "   -min_width          Pixels. Skip images narrower than this [50 pixels]\n";
+    print STDERR "   -min_height         Pixels. Skip images shorter than this [50 pixels]\n";
+    print STDERR "   -thumb_size         Max thumbnail size. Both width and height [100 pixels]\n";
+    print STDERR "   -convert_params     Additional parameters for ImageMagicK convert on\n";
+    print STDERR "                       thumbnail creation. For example, '-raise' will give\n";
+    print STDERR "                       a three dimensional effect to thumbnail images.\n";
+    print STDERR "   -document_text      Add image text as document:text (otherwise IndexedText\n";
+    print STDERR "                       metadata field)\n";
+    print STDERR "\n";
+    print STDERR " Advanced Options (applicability depends on aggressiveness level)\n";
+    print STDERR "   -smallpage_threshold Images on pages smaller than this (bytes) will have\n";
+    print STDERR "                        the page (title, keywords, etc) meta-data added [2048]\n";
+    print STDERR "   -textrefs_threshold  Threshold for textual references. Lower values mean\n";
+    print STDERR "                        the algorithm is less strict [2]\n";
+    print STDERR "   -caption_length      Maximum length of captions (in characters) [100]\n";
+    print STDERR "   -neartext_length     Target length of near text (in characters) [300]\n";
+    print STDERR "   -max_near_text       Maximum characters near images to extract [400]\n";
+    print STDERR "   -min_near_text       Minimum characters of near text or caption to extract [10]\n";
+    print STDERR "\n";
+    print STDERR " Tag set configuration file (XML format):\n";
+    print STDERR "   <collectionpath>/etc/W3ImgPlug.cfg \n";
+    print STDERR "\n";
+    print STDERR "\n";
+    print STDERR "W3ImgPlug inherits all of HTMLPlug's functionality and options:\n";
+    HTMLPlug::print_usage();
+    print STDERR "\n";
+}
+
+sub new {
+    my $class = shift (@_);
+    my $self = new HTMLPlug ($class, @_);
+
+    if (!parsargv::parse(\@_,
+			 q^aggressiveness/\d/3^, \$self->{'aggressiveness'},
+			 q^index_pages^, \$self->{'index_pages'},
+			 q^no_cache_images^, \$self->{'no_cache_images'},
+			 q^min_size/\d*/2000^, \$self->{'min_img_filesize'},
+			 q^min_width/\d*/50^, \$self->{'min_img_width'},
+			 q^min_height/\d*/50^, \$self->{'min_img_height'},
+			 q^thumb_size/\d*/100^, \$self->{'thumbnail_size'},
+			 q^convert_params/.*/ ^, \$self->{'img_convert_param'},
+			 q^max_near_text/\d*/400^, \$self->{'maxtext'},
+			 q^min_near_text/\d*/10^, \$self->{'mintext'},
+			 q^smallpage_threshold/\d*/2048^, \$self->{'smallpage_threshold'},
+			 q^textrefs_threshold/\d*/2^, \$self->{'textref_threshold'},
+			 q^caption_length/\d*/80^, \$self->{'caption_len'},
+			 q^neartext_length/\d*/300^, \$self->{'neartext_len'},
+			 q^document_text^, \$self->{'document_text'},
+			 "allow_extra_options"
+			 )) { 
+
+	print STDERR "\nIncorrect options passed to W3ImgPlug, check your collect.cfg configuration file\n";
+	&print_usage();
+	die "\n";
+    }
+    
+    # init class variables
+    $self->{'textref'} = undef; # init by read_file fn
+    $self->{'htdoc_obj'} = undef; # init by process fn
+    $self->{'htpath'} = undef; # init by process fn
+    $self->{'hturl'} = undef; # init by process fn
+    $self->{'plaintext'} = undef; # HTML stripped version - only init if needed by raw_neartext sub
+    $self->{'smallpage'} = 0; # set by process fn
+    $self->{'images_indexed'} = undef; # num of images indexed - if 1 or 2 then we know page is small
+    $self->{'initialised'} = undef; # flag (see set_extraction_options())
+
+    return bless $self, $class;
+}
+
+# if indexing pages, let HTMLPlug do it's stuff
+# image extraction done through read()
+sub process {
+    my ($self, $textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj) = @_;
+    $self->{'imglist'} = ();
+    if ( $self->{'index_pages'} ) {
+	my $ok = $self->SUPER::process($textref, $pluginfo, $base_dir, $file, $metadata, $doc_obj);
+	if ( ! $ok ) { return $ok }
+	$self->{'htdoc_obj'} = $doc_obj;
+    }
+    # else use URL for referencing
+    #if ( $file =~ /(.*)[\/\\]/ ) { $self->{'htpath'} = $1; } else { $self->{'htpath'} = $file; }
+
+    $self->{'htpath'} = $base_dir if (-d $base_dir);
+    if ( $file =~ /(.*)[\/\\]/ ) { $self->{'htpath'} .= "/$1"; }
+    $self->{'htpath'} =~ s/\\/\//g;  # replace \ with /
+
+    $self->{'hturl'} = "http://$file";
+    $self->{'hturl'} =~ s/\\/\//g; # for windows
+    ($self->{'filename'}) = $file =~ /.*[\/\\](.*)/;
+    ($self->{'base_path'}) = $file =~ /(.*)[\/\\]/i;
+    if ( ( -s "$base_dir/$file") <= $self->{'smallpage_threshold'} ) {
+	$self->{'smallpage'} = 1;
+    } else { $self->{'smallpage'} = 0; }
+
+    if ( defined($self->{'initialised'}) ) { return 1; }
+    else {
+	$self->{'initialised'} = $self->set_extraction_options($base_dir =~ /^(.*?)\/import/i);
+	return $self->{'initialised'};
+    }
+}
+
+# get complex configuration options from configuration files
+# -- $GSDLCOLLECTION/etc/W3ImgPlug.cfg (tag sets for aggr 2+)
+# -- $GSDLHOME/etc/packages/phind/stopword/en/brown.sw (stopwords for aggr 5+)
+
+# If there's no W3ImgPlug.cfg file we'll use the following default values
+my $defaultcfg = '
+<delimitertagset>
+  <setname>Caption</setname>
+  <taggroup>font</taggroup>
+  <taggroup>tt</taggroup>
+  <taggroup>small</taggroup>
+  <taggroup>b</taggroup>
+  <taggroup>i</taggroup>
+  <taggroup>u</taggroup>
+  <taggroup>em</taggroup>
+  <taggroup>td</taggroup>
+  <taggroup>li</taggroup>
+  <taggroup>a</taggroup>
+  <taggroup>p</taggroup>
+  <taggroup>tr</taggroup>
+  <taggroup>center</taggroup>
+  <taggroup>div</taggroup>
+  <taggroup>caption</taggroup>
+  <taggroup>br</taggroup>
+  <taggroup>ul</taggroup>
+  <taggroup>ol</taggroup>
+  <taggroup>table</taggroup>
+  <taggroup>hr</taggroup>
+</delimitertagset>
+
+<delimitertagset>
+  <setname>Neartext</setname>
+  <taggroup>tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>td|tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>p|br|td|tr|hr|table|h\d|img|body</taggroup>
+  <taggroup>font|p|i|b|em|img</taggroup>
+</delimitertagset>
+';
+
+sub set_extraction_options() {
+    my ($self, $collpath) = @_;
+    my ($filepath);
+
+    print {$self->{'outhandle'}} "W3ImgPlug: Initialising\n"
+	if $self->{'verbosity'} > 1;
+    # etc/W3ImgPlug.cfg (XML)
+    # tag sets for captions and neartext
+    if ( $self->{'aggressiveness'} > 1 && $self->{'aggressiveness'} != 10 ) {
+	$self->{'delims'} = [];
+	$self->{'cdelims'} = [];
+	my ($cfg, @tagsets, $tagset, $type, @delims);
+
+	$filepath = "$collpath/etc/W3ImgPlug.cfg";
+	if ( open CFG, "<$filepath" ) {
+	    while (<CFG>) { $cfg .= $_ }
+	    close CFG;
+	} else {
+	    $cfg = $defaultcfg;
+	}
+
+	(@tagsets) = 
+	    $cfg =~ /<delimitertagset>(.*?)<\/delimitertagset>/igs;
+	foreach $tagset ( @tagsets ) {
+	    ($type) = $tagset =~ /<setname>(.*?)<\/setname>/i;
+	    if ( lc($type) eq "caption" ) {
+		(@{$self->{'cdelims'}}) = $tagset =~ /<taggroup>(.*?)<\/taggroup>/igs;
+	    }
+	    elsif ( lc($type) eq "neartext" ) {
+		(@{$self->{'delims'}}) = $tagset =~ /<taggroup>(.*?)<\/taggroup>/igs;
+	    }
+	}
+
+	# output a warning if there seem to be no delimiters
+	if ( scalar(@{$self->{'cdelims'}} == 0)) {
+	    print {$self->{'outhandle'}} "W3ImgPlug: Warning: no caption delimiters found in $filepath\n";
+	}
+	if ( scalar(@{$self->{'delims'}} == 0)) {
+	    print {$self->{'outhandle'}} "W3ImgPlug: Warning: no neartext delimiters found in $filepath\n";
+	}
+    }
+    
+    # get stop words for textual reference extraction
+    # TODO: warnings scroll off. Would be best to output them again at end of import
+    if ( $self->{'aggressiveness'} >=5 && $self->{'aggressiveness'} != 10 ) {
+	$self->{'stopwords'} = ();
+	$filepath = &util::filename_cat($ENV{'GSDLHOME'}, "etc", "packages", "phind", "stopword", "en", "brown.sw");
+	if ( open STOPWORDS, "<$filepath" ) {
+	    while ( <STOPWORDS> ) {
+		chomp;
+		$self->{'stopwords'}{$_} = 1;
+	    }
+	    close STOPWORDS;
+	} else {
+	    print {$self->{'outhandle'}} "W3ImgPlug: Warning: couldn't open stopwords file at $filepath ($!)\n";
+	}
+	
+    }
+
+    if ( $self->{'neartext_len'} > $self->{'maxtext'} ) {
+	$self->{'maxtext'} = $self->{'neartext_len'} * 1.33;
+	print {$self->{'outhandle'}} "W3ImgPlug: Warning: adjusted max_text to $self->{'maxtext'}\n";
+    } 
+    if ( $self->{'caption_len'} > $self->{'maxtext'} ) {
+	$self->{'maxtext'} = $self->{'caption_len'} * 1.33;
+	print {$self->{'outhandle'}} "W3ImgPlug: Warning: adjusted max_text to $self->{'maxtext'}\n";
+    }
+
+    return 1;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my ($self, $pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = (@_);
+    my ($doc_obj, $section, $filepath, $imgtag, $pos, $context, $numdocs, $tndir, $imgs);
+    # forward normal read (runs HTMLPlug if index_pages T)
+    my $ok =  $self->SUPER::read($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs); 
+    if ( ! $ok ) { return $ok }
+
+    my $outhandle = $self->{'outhandle'};
+    my $textref = $self->{'textref'};
+    my $htdoc_obj = $self->{'htdoc_obj'};
+    $numdocs = 0;
+    $base_dir =~ /(.*)\/.*/;
+    $tndir = "$1/archives/thumbnails"; # TODO: this path shouldn't be hardcoded?
+    &util::mk_all_dir($tndir) unless -e "$tndir"; 
+
+    $imgs = \%{$self->{'imglist'}};
+    my $nimgs = $self->get_img_list($textref);
+    $self->{'images_indexed'} = $nimgs;
+    if ( $nimgs > 0 ) {
+	my @fplist = (sort { $imgs->{$a}{'pos'} <=> $imgs->{$b}{'pos'} } keys %{$imgs});
+	my $i = 0;
+	foreach $filepath ( @fplist ) {
+	    $pos = $imgs->{$filepath}{'pos'}; 
+	    $context = substr ($$textref, $pos - 50, $pos + 50); # grab context (quicker)
+	    ($imgtag) = ($context =~ /(<(?:img|a|body)\s[^>]*$filepath[^>]*>)/is );
+	    if (! defined($imgtag)) { $imgtag = $filepath }
+	    print $outhandle "W3ImgPlug: extracting $filepath\n"
+		if ( $self->{'verbosity'} > 1 );
+	    $doc_obj = new doc ("", "indexed_doc");
+	    $section = $doc_obj->get_top_section();
+	    $prevpos = ( $i == 0 ? 0 : $imgs->{$fplist[$i - 1]}{'pos'});
+	    $nextpos = ( $i >= ($nimgs -1) ? -1 : $imgs->{$fplist[$i + 1]}{'pos'} );
+
+	    $self->extract_image_info($imgtag, $filepath, $textref, $doc_obj, $section, $tndir, $prevpos, $nextpos);
+            $processor->process($doc_obj);
+	    $numdocs++;
+	    $i++;
+	}
+	return $numdocs;
+    } else {
+	print $outhandle "W3ImgPlug: No images from $file indexed\n"
+	    if ( $self->{'verbosity'} > 2 );
+	return 1;
+    }
+    
+}
+
+# for every valid image tag
+# 1. extract related text and image metadata
+# 2. add this as document meta-data
+# 3. add assoc image(s) as files
+#
+sub extract_image_info {
+    my $self = shift (@_);
+    my ($tag, $id, $textref, $doc_obj, $section, $tndir, $prevpos, $nextpos) = (@_);
+    my ($filename, $orig_fp, $fn, $ext, $reltext, $relreltext, $crcid, $imgs,
+	$thumbfp, $pagetitle, $alttext,	$filepath, $aggr);
+    $aggr = $self->{'aggressiveness'};
+    $imgs = \%{$self->{'imglist'}};
+    $filepath = $imgs->{$id}{'relpath'}; 
+    ($filename) = $filepath =~ /([^\/\\]+)$/s;
+    ($orig_fp) = "$self->{'base_path'}/$filepath"; 
+    $orig_fp =~ tr/+/ /;
+    $orig_fp =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # translate %2E to space, etc
+    $orig_fp =~ s/\\/\//g;
+    $filepath = "$self->{'htpath'}/$filepath";
+    ($onlyfn) = $filename =~ /([^\\\/]*)$/;
+    ($fn, $ext) = $onlyfn =~ /(.*)\.(.*)/;
+    $fn = lc $fn; $ext = lc $ext;
+    ($reltext) = "<tr><td>GifComment</td><td>" . `identify $filepath -ping -format "%c"` . "</td></tr>\n"
+        if ($ext eq "gif");
+    $reltext .= "<tr><td>FilePath</td><td>$orig_fp</td></tr>\n";
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$crcid = "$fn.$ext." . $self->{'next_crcid'}++;
+    } else { ($crcid) = `cksum $filepath` =~ /^(\d+)/; }
+    $thumbfp = "$tndir/tn_$crcid.jpg";
+    `convert -flatten -filter Hanning $self->{'img_convert_param'} -geometry "$self->{'thumbnail_size'}x$self->{'thumbnail_size'}>" $filepath $thumbfp` unless -e $thumbfp;
+    if ( ! (-e $thumbfp) ) {
+	print STDERR "W3ImgPlug: 'convert' failed. Check ImageMagicK binaries are installed and working correctly\n"; return 0; 
+    }
+    
+    # shove in full text (tag stripped or unstripped) if settings require it
+    if ( $aggr == 10) {
+	$reltext = "<tr><td>AllPage</td><td>" . $$textref . "</td><tr>\n";   # level 10 (all text, verbatim)
+    } else {
+	$pagetitle = $self->get_meta_value("title", $textref);
+	($alttext) = $tag =~ /\salt\s*=\s*(?:\"|\')(.+?)(?:\"|\')/is;
+	if ( defined($alttext) && length($alttext) > 1) {
+	    $reltext .= "<tr><td>ALTtext</td><td>$alttext</td></tr>\n"; }
+	$reltext .= "<tr><td>SplitCapitalisation</td><td>" . 
+	    $self->split_filepath($orig_fp) . "</td></tr>\n";
+
+	# get caption/tag based near text (if appropriate)
+	if ( $aggr > 1 ) {
+	    if ( $aggr >= 2 ) {
+		$reltext .= 
+		    $self->extract_caption_text($tag, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos);
+		$relreltext = $reltext;
+	    } 
+	    # repeat the filepath, alt-text, caption, etc
+	    if ( $aggr == 8 ) {
+		$reltext .= $relreltext; 
+	    }
+	    if ( $aggr >= 3 ) {
+		$reltext .= 
+		    $self->extract_near_text($tag, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos);
+	    }
+	
+	    # get page metadata (if appropriate)
+	    if ( $aggr >= 6 || ( $aggr >= 2 && 
+						     ( $self->{'images_indexed'} < 2 || 
+						       ($self->{'smallpage'} == 1 && $self->{'images_indexed'} < 6 )))) {	
+		$reltext .= $self->get_page_metadata($textref);
+	    }
+	    # textual references
+	    if ( $aggr  == 5 || $aggr >= 7) {
+		if ( length($relreltext) > ($self->{'caption_len'} * 2) )  {
+		    $reltext .= $self->get_textrefs($relreltext, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos); }
+		else {
+		    $reltext .= $self->get_textrefs($reltext, $textref, $prevpos, $imgs->{$id}{'pos'}, $nextpos); 
+		}
+	    }
+	} # aggr > 1
+    } # aggr != 10
+    
+    $doc_obj->set_OID($crcid); 
+    $doc_obj->associate_file($thumbfp, "$fn.thumb.jpg", undef, $section);
+    $doc_obj->add_metadata($section, "OriginalFilename", $filename);
+    $doc_obj->add_metadata($section, "FilePath", $orig_fp);
+    $doc_obj->add_metadata($section, "Filename", $fn);
+    $doc_obj->add_metadata($section, "FileExt", $ext);
+    $doc_obj->add_metadata($section, "FileSize", $imgs->{$id}{'filesize'});
+    $doc_obj->add_metadata($section, "Width", $imgs->{$id}{'width'});
+    $doc_obj->add_metadata($section, "Height", $imgs->{$id}{'height'});
+    $doc_obj->add_metadata($section, "URL", "http://$orig_fp");
+    $doc_obj->add_metadata($section, "PageURL", $self->{'hturl'});
+    $doc_obj->add_metadata($section, "PageTitle", $pagetitle);
+    $doc_obj->add_metadata($section, "ThumbURL", 
+			   "_httpcollection_/index/assoc/[archivedir]/$fn.thumb.jpg");
+
+    if ( $self->{'document_text'} ) {
+	$doc_obj->add_utf8_text($section, "<table border=1>\n$reltext</table>");
+    } else {
+	$doc_obj->add_metadata($section, "ImageText", "<table border=1>\n$reltext</table>\n");
+    }
+    
+    if ( $self->{'index_pages'} ) {
+	my ($cache_url) = "_httpdoc_&d=" . $self->{'htdoc_obj'}->get_OID();
+	if ( $imgs->{$id}{'anchored'} ) {
+	    my $a_name = $id;
+	    $a_name =~ s/[\/\\\:\&]/_/g;
+	    $cache_url .=  "#gsdl_$a_name" ;
+	}
+	$doc_obj->add_utf8_metadata($section, "CachePageURL", $cache_url);
+    }
+    if ( ! $self->{'no_cache_images'} ) {
+	$onlyfn = lc $onlyfn;
+	$doc_obj->associate_file($filepath, $onlyfn, undef, $section);
+	$doc_obj->add_utf8_metadata($section, "CacheURL", 
+			       "_httpcollection_/index/assoc/[archivedir]/$onlyfn");
+    }
+    return 1;
+}
+
+sub get_page_metadata {
+    my ($self, $textref) = (@_);
+    my (@rval);
+    $rval[0] = $self->get_meta_value("title", $textref);
+    $rval[1] = $self->get_meta_value("keywords", $textref);
+    $rval[2] = $self->get_meta_value("description", $textref);
+    $rval[3] = $self->{'filename'};
+
+    return wantarray ? @rval : "<tr><td>PageMeta</td><td>@rval</td></tr>\n" ;
+}
+
+# turns LargeCatFish into Large,Cat,Fish so MG sees the separate words
+sub split_filepath {
+    my ($self, $filepath) = (@_);
+    my (@words) = $filepath =~ /([A-Z][a-z]+)/g; 
+    return join(',', @words);
+}
+
+# finds and extracts sentences
+# that seem to be on the same topic
+# as other related text (correlations)
+# and textual references (e.g. in figure 3 ...)
+sub get_textrefs {
+    my ($self, $reltext, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my ($maxtext, $mintext, $startpos, $context_size, $context);
+
+    my (@relwords, @refwords, %sentences, @pagemeta);
+
+    # extract larger context
+    $maxtext = $self->{'maxtext'};
+    $startpos = $pos - ($maxtext * 4);
+    $context_size = $maxtext*10;
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) { $context_size = ($nextpos - $startpos) }
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<.*?>//gs;
+    $context =~ s/^.*>(.*)/$1/gs;
+    $context =~ s/(.*)<.*$/$1/gs;
+
+    # get page meta-data (if not already included)
+    if ( $self->{'aggressiveness'} == 5 && ! $self->{'smallpage'} ) {
+	@pagemeta = $self->get_page_metadata($textref);
+	foreach $value ( @pagemeta ) {
+	    $context .= "$value."; # make each into psuedo-sentence
+	}
+    }
+
+    # TODO: this list is not exhaustive
+    @refwords = ( '(?:is|are)? ?(?:show(?:s|n)|demonstrate(?:d|s)|explains|features) (?:in|by|below|above|here)', 
+		  '(?:see)? (?:figure|table)? (?:below|above)');    
+
+    # extract general references
+    foreach $rw ( @refwords ) {
+	while ( $context =~ /[\.\?\!\,](.*?$rw\W.*?[\.\?\!\,])/ig ) {
+	    $sentence = $1;
+	    $sentence =~ s/\s+/ /g;
+	    $sentences{$sentence}+=2;
+	}
+    }
+    # extract specific (figure, table) references by number
+    my ($fignum) = $context =~ /[\.\?\!].*?(?:figure|table)s?[\-\_\ \.](\d+\w*)\W.*?[\.\?\!]/ig;
+    if ( $fignum ) {
+	foreach $rw ( @refwords ) {
+	    while ( $context =~ /[\.\?\!](.*?(figure|table)[\-\_\ \.]$fignum\W.*?[\.\?\!])/ig ) {
+		$sentence = $1;
+		$sentence =~ s/\s+/ /g;
+		$sentences{$sentence}+=4;
+	    }
+	}
+    }
+
+    # sentences with occurances of important words
+    @relwords = $reltext =~ /([a-zA-Z]{4,})/g; # take out small words
+    foreach $word ( @relwords ) {
+	if ( $self->{'stopwords'}{$word} ) { next } # skip stop words
+	while ( $context =~ /([^\.\?\!]*?$word\W.*?[\.\?\!])/ig ) {
+	    $sentence = $1;
+	    $sentence =~ s/\s+/ /g;
+	    $sentences{$sentence}++;
+	}
+    }
+    foreach $sentence ( keys %sentences ) {
+	if ($sentences{$sentence} < $self->{'textref_threshold'}) {
+	    delete $sentences{$sentence};
+	}
+    }
+    my ($rval) = join "<br>\n", (keys %sentences);
+    if ( $rval && length($rval) > 5 ) {
+	return ( "<tr><td>TextualReferences</td><td>" . $rval . "</td></tr>\n") }
+    else { return "" }
+}
+
+# handles caption extraction
+# calling the extractor with different
+# tags and choosing the best candidate caption
+sub extract_caption_text {
+    my ($self, $tag, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my (@neartext, $len, $hdelim, $goodlen,
+	$startpos, $context, $context_size);
+    
+    $mintext = $self->{'mintext'};
+    $goodlen = $self->{'caption_len'};
+
+    # extract a context to extract near text from (faster)
+    $context_size = $self->{'maxtext'}*3;
+    $startpos = $pos - ($context_size / 2);
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) 
+    { $context_size = ($nextpos - $startpos) }
+
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<!--.*?-->//gs;
+    $context =~ s/^.*-->(.*)/$1/gs;
+    $context =~ s/(.*)<!--.*$/$1/gs;
+
+    # try stepping through markup delimiter sets
+    # and selecting the best one
+    foreach $hdelim ( @{ $self->{'cdelims'} } ) {
+	@neartext = $self->extract_caption($tag, $hdelim, \$context);
+	$len = length(join("", @neartext));
+	last if ($len >= $mintext && $len <= $goodlen);
+    }
+    # reject if well over reasonable length
+    if ( $len > $goodlen ) {
+	@neartext = [];
+    }
+    $neartext[0] = " " if (! defined $neartext[0]);
+    $neartext[1] = " " if (! defined $neartext[1]);
+    return "<tr><td>Caption</td><td>" . (join ",",  @neartext) . "</td></tr>\n"; # TODO: the | is for testing purposes
+} # end extract_caption_text
+
+# the previous section header often gives a bit
+# of context to the section that the image is
+# in (invariably the header is before/above the image)
+# so extract the text of the closest header above the image
+#
+# this fn just gets all the headers above the image, within the context window
+sub get_prev_header {
+    my ($self, $pos, $textref) = (@_);
+    my ($rhtext);
+    while ( $$textref =~ /<h\d>(.*?)<\/h\d>/sig ) {
+	# only headers before image
+	if ((pos $$textref) < $pos) {
+	    $rhtext .= "$1, ";
+	}
+    } 
+    if ( $rhtext ) { return "Header($rhtext)" }
+    else { return "" }
+}
+
+# not the most robust tag stripping 
+# regexps (see perl.com FAQ) but good enough
+#
+# used by caption & tag-based near text algorithms
+sub strip_tags {
+    my ( $self, $value ) = @_;
+    if ( ! defined($value) ) { $value = "" } # handle nulls
+    else {
+	$value =~ s/<.*?>//gs; # strip all html tags
+	$value =~ s/\s+/\ /g; # remove extra whitespace
+	$value =~ s/\&\w+\;//g; # remove &nbsp; etc
+    }
+    return $value;
+}
+
+# uses the given tag(s) to identify
+# the caption near to the image
+# (below, above or both below and above)
+sub extract_caption {
+    my ($self, $tag, $bound_tag, $contextref) = (@_);
+    my (@nt, $n, $etag, $gotcap);
+    return ("", "") if ( ! ($$contextref =~ /\Q$tag/) );
+
+    $nt[0] = $`;
+    $nt[1] = $';
+    $gotcap = 0;
+
+    # look before the image for a boundary tag
+    ($etag, $nt[0]) = $nt[0] =~ /<($bound_tag)[\s]?.*?>(.*?)$/is;
+    # if bound_tag too far from the image, then prob not caption
+    # (note: have to allow for tags, so multiply by 3
+    if ( $etag && length($nt[0]) < ($self->{'caption_len'} * 3) ) { 
+	if ( $nt[0] =~ /<\/$etag>/si ) {
+	    # the whole caption is above the image: <tag>text</tag><img>
+	    ($nt[0]) =~ /<(?:$etag)[\s]?.*?>(.*?)<\/$etag>/is;
+	    $nt[0] = $self->strip_tags($nt[0]);
+	    if ( length($nt[0]) > $self->{'mintext'} ) { 
+		$gotcap = 1;
+		$nt[1] = ""; 
+	    }
+
+	} elsif ( $nt[1] =~ /<\/$etag>/si) {
+	    # the caption tag covers image: <tag>text?<img>text?</tag>
+	    ($nt[1]) = $nt[1] =~ /(.*?)<\/$etag>/si;
+	    $nt[0] = $self->strip_tags($nt[0] . $nt[1]);
+	    if ( length($nt[0]) > $self->{'mintext'} ) { 
+		$gotcap = 2;
+		$nt[1] = "";
+	    }
+	}
+    }
+    # else try below the image
+    if ( ! $gotcap ) { 
+	# the caption is after the image: <img><tag>text</tag>
+	($etag, $nt[1]) = $nt[1] =~ /^.*?<($bound_tag)[\s]?.*?>(.*)/is;
+	if ( $etag && $nt[1] =~ /<\/$etag>/s) {
+	    ($nt[1]) = $nt[1] =~ /(.*?)<\/$etag>/si;
+	    $gotcap = 3;
+	    $nt[0] = "";
+	    $nt[1] = $self->strip_tags($nt[1]);
+	} 
+    }
+    if ( ! $gotcap ) { $nt[0] = $nt[1] = "" }
+    else {
+	# strip part-tags
+	$nt[0] =~ s/^.*>//s;
+	$nt[1] =~ s/<.*$//s;
+    }
+    my ($type);
+    if ( $gotcap == 0 ) { return ("nocaption", "") }
+    elsif ( $gotcap == 1 ) { $type = "captionabove:" }
+    elsif ( $gotcap == 2 ) { $type = "captioncovering:" }
+    elsif ( $gotcap == 3 ) { $type = "captionbelow:" }
+    return ($type, $nt[0], $nt[1]);
+}
+
+# tag-based near text
+# 
+# tries different tag sets
+# and chooses the best one
+sub extract_near_text {
+    my ($self, $tag, $textref, $prevpos, $pos, $nextpos) = (@_);
+    my (@neartext, $len, $hdelim, $maxtext, $mintext, $goodlen,
+	@bestlen, @best, $startpos, $context, $context_size,
+	$dist, $bdist, $best1, $i, $nt);
+    $bestlen[0] = $bestlen[1] = 0; $bestlen[2] = $bdist = 999999;
+    $best[0] = $best[1] = $best[2] = "";
+    $maxtext = $self->{'maxtext'};
+    $mintext = $self->{'mintext'};
+    $goodlen = $self->{'neartext_len'}; 
+
+    # extract a context to extract near text from (faster)
+    $context_size = $maxtext*4;
+    $startpos = $pos - ($context_size / 2);
+    if ($startpos < $prevpos ) { $startpos = $prevpos }
+    if ($nextpos != -1 && $context_size > ( $nextpos - $startpos )) 
+    { $context_size = ($nextpos - $startpos) }
+    $context = substr ( $$textref, $startpos, $context_size );
+    $context =~ s/<!--.*?-->//gs;
+    $context =~ s/^.*-->(.*)/$1/gs;
+    $context =~ s/(.*)<!--.*$/$1/gs;
+
+    # try stepping through markup delimiter sets
+    # and selecting the best one
+    foreach $hdelim ( @{ $self->{'delims'} } ) {
+	@neartext = $self->extract_tagged_neartext($tag, $hdelim, \$context);
+	$nt = join("", @neartext);
+	$len = length($nt);
+	# Priorities:
+	# 1. Greater than mintext 
+	# 2. Less than maxtext 
+	# 3. Closest to goodlen
+	if ( $len <= $goodlen && $len > $bestlen[0] ) {
+	    $bestlen[0] = $len;
+	    $best[0] = $hdelim;
+	} elsif ( $len >= $maxtext && $len < $bestlen[2] ) {
+	    $bestlen[2] = $len;
+	    $best[2] = $hdelim;
+	} elsif ( $len >= $bestlen[0] && $len <= $bestlen[2] ) {
+	    $dist = abs($goodlen - $len);
+	    if ( $dist < $bdist ) {
+		$bestlen[1] = $len;
+		$best[1] = $hdelim;
+		$bdist = $dist;
+	    }
+	}
+    }
+    $best1 = 2;
+    foreach $i ( 0..2 ) {
+	if ( $bestlen[$i] == 999999 ) { $bestlen[$i] = 0 }
+	$dist = abs($goodlen - $bestlen[$i]);
+	if ( $bestlen[$i] > $mintext && $dist <= $bdist ) {
+	    $best1 = $i;
+	    $bdist = $dist;
+	}
+    }
+    @neartext = $self->extract_tagged_neartext($tag, $best[$best1], \$context);
+    if ( $bestlen[$best1] > $maxtext ) {
+	# truncate on word boundary if too much text
+	my $hmax = $maxtext / 2;
+	($neartext[0]) = $neartext[0] =~ /([^\s]*.{1,$hmax})$/s;
+	($neartext[1]) = $neartext[1] =~ /^(.{1,$hmax}[^\s]*)/s;
+    } elsif ( $bestlen[$best1] < $mintext ) {
+	# use plain text extraction if tags failed (e.g. usable tag outside context)
+	print {$self->{'outhandle'}} "W3ImgPlug: Fallback to plain-text extraction for $tag\n" 
+	    if $self->{'verbosity'} > 2;
+	$neartext[0] = "<tr><td>RawNeartext</td><td>" . $self->extract_raw_neartext($tag, $textref) . "</td></tr>";
+	$neartext[1] = "";
+    }
+    # get previous header if available
+    $neartext[0] .= "<br>\n" . 
+	$self->get_prev_header($pos, \$context) if ( $self->{'aggressiveness'} >= 4 );
+    $neartext[0] = " " if (! defined $neartext[0]);
+    $neartext[1] = " " if (! defined $neartext[1]);
+
+    return "<tr><td>NearText</td><td>" . (join "|",  @neartext) . "</td></tr>\n"; # TODO: the | is for testing purposes
+} # end extract_near_text
+
+# actually captures tag-based
+# near-text given a tag set
+sub extract_tagged_neartext {
+    my ($self, $tag, $bound_tag, $textref) = (@_);
+    return "" if ( ! ($$textref =~ /\Q$tag/) );
+    my (@nt, $delim, $pre_tag, $n);
+    $nt[0] = $`;
+    $nt[1] = $';
+
+    # get text after previous image tag
+    $nt[0] =~ s/.*<($bound_tag)[^>]*>(.*)/$2/is; # get rid of preceding text
+    if (defined($1)) { $delim = $1 }    
+    $pre_tag = $bound_tag;
+
+    if (defined($delim)) {
+	# we want to try and use the end tag of the previous delimiter
+	# (put it on the front of the list)
+	$pre_tag =~ s/(^|\|)($delim)($|\|)//i; # take it out
+	$pre_tag =~ s/\|\|/\|/i; # replace || with |
+	$pre_tag = $delim . "|" . $pre_tag; # put it on the front
+    }
+    
+    # get text before next image tag
+    $nt[1] =~ s/<\/?(?:$pre_tag)[^>]*>.*//is; # get rid of stuff after first delimiter
+
+    # process related text
+    for $n (0..1) {
+	if ( defined($nt[$n]) ) {
+	    $nt[$n] =~ s/<.*?>//gs; # strip all html tags
+	    $nt[$n] =~ s/\s+/\ /gs; # remove extra whitespace
+	    $nt[$n] =~ s/\&\w+\;//sg; # remove &nbsp; etc
+	    # strip part-tags
+	    if ( $n == 0 ) { $nt[0] =~ s/^.*>//s }
+	    if ( $n == 1 ) { $nt[1] =~ s/<.*$//s }
+	} else { $nt[$n] = ""; } # handle nulls
+    }
+    return @nt;
+}
+
+# this function is fall-back
+# if tags aren't suitable.
+#
+# extracts a fixed length of characters
+# either side of image tag (on word boundary)
+sub extract_raw_neartext {
+    my ($self, $tag, $textref) = (@_);
+    my ($rawtext, $startpos, $fp);
+    my $imgs = \%{$self->{'imglist'}};
+    ($fp) = $tag =~ /([\w\\\/]+\.(?:gif|jpe?g|png))/is;
+    if (! $fp) { return " " };
+    # if the cached, plain-text version isn't there, then create it
+    $self->init_plaintext($textref) unless defined($self->{'plaintext'});
+
+    # take the closest maxtext/2 characters 
+    # either side of the tag (by word boundary)
+    return "" if ( ! exists $imgs->{$fp}{'rawpos'} );
+    $startpos = $imgs->{$fp}{'rawpos'} - (($self->{'maxtext'} / 2) + 20);
+    if ( $startpos < 0 ) { $startpos = 0 }
+    $rawtext = substr $self->{'plaintext'}, $startpos, $self->{'maxtext'} + 20;
+    $rawtext =~ s/\s\s/ /g;
+
+    return $rawtext;
+}
+
+# init plaintext variable for HTML-stripped version 
+# (for full text index/raw assoc text extraction)
+sub init_plaintext {
+    my ($self, $textref) = (@_);
+    my ($page, $fp);
+    my $imgs = \%{$self->{'imglist'}};
+    $page = $$textref; # make a copy of original
+
+    # strip tags around image filenames so they don't get zapped
+    $page =~ s/<\w+\s+.*?([\w\/\\]+\.(?:gif|jpe?g|png))[^>]*>/\"$1\"/gsi;
+    $page =~ s/<.*?>//gs;
+    $page =~ s/&nbsp;/ /gs;
+    $page =~ s/&amp;/&/gs; #TODO: more &zzz; replacements (except &lt;, $gt;)
+
+    # get positions and strip images
+    while ( $page =~ /([^\s\'\"]+\.(jpe?g|gif|png))/ig ) {
+	$fp = $1;
+	if ( $imgs->{$fp}{'exists'} ) {
+	    $imgs->{$fp}{'rawpos'} = pos $page;
+	}
+	$page =~ s/\"$fp\"//gs;
+    }
+    $self->{'plaintext'} = $page;
+}
+
+# finds and filters images based on size 
+# (dimensions, height, filesize) and existence
+#
+# looks for image filenames (.jpg, .gif, etc)
+# and checks for existence on disk 
+# (hence supports most JavaScript images)
+sub get_img_list {
+    my $self = shift (@_);
+    my ($textref) = (@_);
+    my ($filepath, $relpath, $abspath, $pos, $num, $width, $height, $filesize);
+    my $imgs = \%{$self->{'imglist'}};
+    while ( $$textref =~ /([^\s\'\"]+\.(jpe?g|gif|png))/ig ) {
+	$filepath = $1;
+	$pos = pos $$textref;
+	next if ( $imgs->{$filepath}{'relpath'} );
+        $relpath = $filepath;
+	$relpath =~ s/^http\:\/\///; # remove http:// in case we have mirrored it
+	$relpath =~ s/\\/\//g;  # replace \ with /
+	$relpath =~ s/^\.\///s; # make "./filepath" into "filepath"
+	$imgs->{$filepath}{'relpath'} = $relpath;
+	$abspath = "$self->{'htpath'}/$relpath";
+
+	if (! -e $abspath) { next }
+
+	# can't modify real filepath var because it
+	# then can't be located in the page for tag recognition later
+	($width, $height) = 
+	    `identify $abspath -ping -format "%wx%h"` =~ /^(\d*)x(\d*)$/m;
+	if (! ($width && $height)) { 
+	    print STDERR "W3ImgPlug: ($abspath) 'identify' failed. Check ImageMagicK binaries are installed and working correctly\n"; next;
+	}
+	$filesize = (-s $abspath);
+	if ( $filesize >= $self->{'min_img_filesize'} 
+	    && ( $width >= $self->{'min_img_width'} ) 
+	    && ( $height >= $self->{'min_img_height'} ) ) {
+	    
+	   $imgs->{$filepath}{'exists'} = 1;
+	   $imgs->{$filepath}{'pos'} = $pos;
+	   $imgs->{$filepath}{'width'} = $width;
+	   $imgs->{$filepath}{'height'} = $height;
+	   $imgs->{$filepath}{'filesize'} = $filesize;
+       } else {
+	   print {$self->{'outhandle'}} "W3ImgPlug: skipping $self->{'base_path'}/$relpath: $filesize, $width x $height\n" 
+	       if $self->{'verbosity'} > 2;
+       }
+    }
+    $num = 0;
+    foreach $i ( keys %{$imgs} ) {
+	if ( $imgs->{$i}{'pos'} ) {
+	    $num++;
+	} else { delete $imgs->{$i} }
+    }
+    return $num;
+}
+
+# make the text available to the read function
+# by making it an object variable
+sub read_file {
+    my ($self, $filename, $encoding, $language, $textref) = @_;
+    $self->SUPER::read_file($filename, $encoding, $language, $textref);
+
+    # if HTMLplug has run through, then it will
+    # have replaced references so we have to 
+    # make a copy of the text before processing
+    if ( $self->{'index_pages'} ) {
+	$self->{'text'} = $$textref;
+	$self->{'textref'} = \($self->{'text'});
+    } else {
+	$self->{'textref'} = $textref;
+    }
+    $self->{'plaintext'} = undef;
+}
+
+# HTMLPlug only extracts meta-data if it is specified in plugin options
+# hence a special function to do it here
+sub get_meta_value {
+    my ($self, $name, $textref) = @_;
+    my ($value);
+    $name = lc $name;
+    if ($name eq "title") {
+	($value) = $$textref =~ /<title>(.*?)<\/title>/is
+    } else {
+	my $qm = "(?:\"|\')";
+	($value) = $$textref =~ /<meta name\s*=\s*$qm?$name$qm?\s+content\s*=\s*$qm?(.*?)$qm?\s*>/is
+    }
+    $value = "" unless $value;
+    return $value;
+}
+
+# make filename an anchor reference
+# so we can go straight to the image
+# within the cached version of the source page
+# (augment's HTMLPlug sub)
+sub replace_images {
+    my $self = shift (@_);
+    my ($front, $link, $back, $base_dir, 
+	$file, $doc_obj, $section) = @_;
+    $link =~ s/\"//g;
+    my ($a_name) = $link;
+    $a_name =~ s/[\/\\\:\&]/_/g;
+    # keep a list so we don't repeat the same anchor
+    if ( ! $self->{'imglist'}{$link}{'anchored'} ) {
+	$front = "<a name=\"gsdl_$a_name\">$front";
+	$back = "$back</a>";
+	$self->{'imglist'}{$link}{'anchored'} = 1;
+    }
+    return $self->SUPER::replace_images($front, $link, $back, $base_dir, 
+				     $file, $doc_obj, $section);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/WordPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/WordPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/WordPlug.pm	(revision 21083)
@@ -0,0 +1,65 @@
+###########################################################################
+#
+# WordPlug.pm -- plugin for importing Microsoft Word documents
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package WordPlug;
+
+use ConvertToPlug;
+
+sub BEGIN {
+    @ISA = ('ConvertToPlug');
+}
+
+sub new {
+    my $class = shift (@_);
+
+    my $self = new ConvertToPlug ($class, @_);
+
+    # wvWare will always produce html files encoded as utf-8
+    if ($self->{'input_encoding'} eq "auto") {
+	$self->{'input_encoding'} = "utf8";
+	$self->{'extract_language'} = 1;
+    }
+
+    return bless $self, $class;
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.doc$^;
+}
+
+# do plugin specific processing of doc_obj for HTML type
+sub process {
+    my $self = shift (@_);
+
+    my $outhandle = $self->{'outhandle'};    
+    print $outhandle "WordPlug: passing $_[3] on to $self->{'converted_to'}Plug\n"
+	if $self->{'verbosity'} > 1;
+    
+    return ConvertToPlug::process_type($self,"doc",@_);
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/plugins/XMLPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/XMLPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/XMLPlug.pm	(revision 21083)
@@ -0,0 +1,231 @@
+###########################################################################
+#
+# XMLPlug.pm -- base class for XML plugins
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package XMLPlug;
+
+use BasPlug;
+use doc;
+
+sub BEGIN {
+    @ISA = ('BasPlug');
+    unshift (@INC, "$ENV{'GSDLHOME'}/perllib/cpan");
+}
+
+use XML::Parser;
+
+my ($self);
+sub new {
+    my $class = shift (@_);
+
+    # $self is global for use within subroutines called by XML::Parser
+    $self = new BasPlug ($class, @_);
+
+    my $parser = new XML::Parser('Style' => 'Stream',
+				 'Handlers' => {'Char' => \&Char,
+						'XMLDecl' => \&XMLDecl,
+						'Entity' => \&Entity,
+						'Doctype' => \&Doctype,
+						'Default' => \&Default
+						}
+				 );
+    $self->{'parser'} = $parser;
+
+    return bless $self, $class;
+}
+
+
+sub read {
+    # this must be global!
+    $self = shift (@_);  
+  
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+
+    my $filename = $file;
+    $filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+
+    if ($self->{'block_exp'} ne "" && $filename =~ /$self->{'block_exp'}/) {
+	$self->{'num_blocked'} ++;
+	return 0;
+    }
+    if ($filename !~ /$self->{'process_exp'}/ || !-f $filename) {
+	return undef;
+    }
+    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
+    $self->{'file'} = $file;
+    $self->{'filename'} = $filename;
+    $self->{'processor'} = $processor;
+    $self->{'metadata'} = $metadata;
+
+    eval {
+	$self->{'parser'}->parsefile($filename);
+    };
+    if ($@) {
+
+	# parsefile may either croak somewhere in XML::Parser (e.g. because
+	# the document is not well formed) or die somewhere in XMLPlug or a
+	# derived plugin (e.g. because we're attempting to process a
+	# document whose DOCTYPE is not meant for this plugin). For the
+	# first case we'll print a warning and continue, for the second
+	# we'll just continue quietly
+
+	my ($msg) = $@ =~ /Carp::croak\(\'(.*?)\'\)/;
+	if (defined $msg) {	
+	    my $outhandle = $self->{'outhandle'};
+	    my $plugin_name = ref ($self);
+	    print $outhandle "$plugin_name failed to process $file ($msg)\n";
+	}
+	# reset ourself for the next document
+	$self->{'section_level'}=0;
+	return undef;
+    }
+
+    return 1; # processed the file
+}
+
+sub get_default_process_exp {
+    my $self = shift (@_);
+
+    return q^(?i)\.xml$^;
+}
+
+sub StartDocument {$self->xml_start_document(@_);}
+sub XMLDecl {$self->xml_xmldecl(@_);}
+sub Entity {$self->xml_entity(@_);}
+sub Doctype {$self->xml_doctype(@_);}
+sub StartTag {$self->xml_start_tag(@_);}
+sub EndTag {$self->xml_end_tag(@_);}
+sub Text {$self->xml_text(@_);}
+sub PI {$self->xml_pi(@_);}
+sub EndDocument {$self->xml_end_document(@_);}
+sub Default {$self->xml_default(@_);}
+
+# This Char function overrides the one in XML::Parser::Stream to overcome a
+# problem where $expat->{Text} is treated as the return value, slowing
+# things down significantly in some cases.
+sub Char {
+  $_[0]->{'Text'} .= $_[1];
+  return undef;
+}
+
+# Called at the beginning of the XML document.
+sub xml_start_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->open_document();
+}
+
+# Called for XML declarations
+sub xml_xmldecl {
+    my $self = shift(@_);
+    my ($expat, $version, $encoding, $standalone) = @_;
+}
+
+# Called for XML entities
+sub xml_entity {
+  my $self = shift(@_);
+  my ($expat, $name, $val, $sysid, $pubid, $ndata) = @_;
+}
+
+# Called for DOCTYPE declarations - use die to bail out if this doctype
+# is not meant for this plugin
+sub xml_doctype {
+    my $self = shift(@_);
+    my ($expat, $name, $sysid, $pubid, $internal) = @_;
+    die "XMLPlug Cannot process XML document with DOCTYPE of $name";
+}
+
+# Called for every start tag. The $_ variable will contain a copy of the
+# tag and the %_ variable will contain the element's attributes.
+sub xml_start_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+}
+
+# Called for every end tag. The $_ variable will contain a copy of the tag.
+sub xml_end_tag {
+    my $self = shift(@_);
+    my ($expat, $element) = @_;
+}
+
+# Called just before start or end tags with accumulated non-markup text in
+# the $_ variable.
+sub xml_text {
+    my $self = shift(@_);
+    my ($expat) = @_;
+}
+
+# Called for processing instructions. The $_ variable will contain a copy
+# of the pi.
+sub xml_pi {
+    my $self = shift(@_);
+    my ($expat, $target, $data) = @_;
+}
+
+# Called at the end of the XML document.
+sub xml_end_document {
+    my $self = shift(@_);
+    my ($expat) = @_;
+
+    $self->close_document();
+}
+
+# Called for any characters not handled by the above functions.
+sub xml_default {
+    my $self = shift(@_);
+    my ($expat, $text) = @_;
+}
+
+sub open_document {
+    my $self = shift(@_);
+
+    # create a new document
+    $self->{'doc_obj'} = new doc ($self->{'filename'}, "indexed_doc");
+    $self->{'doc_obj'}->set_OIDtype ($self->{'processor'}->{'OIDtype'});
+}
+
+sub close_document {
+    my $self = shift(@_);
+
+    # include any metadata passed in from previous plugins 
+    # note that this metadata is associated with the top level section
+    $self->extra_metadata ($self->{'doc_obj'}, 
+			   $self->{'doc_obj'}->get_top_section(), 
+			   $self->{'metadata'});
+   
+    # do any automatic metadata extraction
+    $self->auto_extract_metadata ($self->{'doc_obj'});
+   
+    # add an OID
+    $self->{'doc_obj'}->set_OID();
+    
+    # process the document
+    $self->{'processor'}->process($self->{'doc_obj'});
+    
+    $self->{'num_processed'} ++;
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/plugins/ZIPPlug.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/plugins/ZIPPlug.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/plugins/ZIPPlug.pm	(revision 21083)
@@ -0,0 +1,171 @@
+###########################################################################
+#
+# ZIPPlug.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# plugin which handles compressed and/or archived input formats
+#
+# currently handled formats and file extensions are:
+# 
+# gzip (.gz, .z, .tgz, .taz)
+# bzip (.bz)
+# bzip2 (.bz2)
+# zip (.zip .jar)
+# tar (.tar)
+#
+# this plugin relies on the following utilities being present 
+# (if trying to process the corresponding formats)
+#
+# gunzip (for gzip)
+# bunzip (for bzip)
+# bunzip2 
+# unzip (for zip)
+# tar (for tar) 
+
+package ZIPPlug;
+
+use BasPlug;
+use plugin;
+use util;
+use Cwd;
+
+
+BEGIN {
+    @ISA = ('BasPlug');
+}
+
+sub new {
+    my ($class) = @_;
+    my $self = new BasPlug ("ZIPPlug", @_);
+
+    return bless $self, $class;
+}
+
+# this is a recursive plugin
+sub is_recursive {
+    my $self = shift (@_);
+
+    return 1;
+}
+
+# return number of files processed, undef if can't process
+# Note that $base_dir might be "" and that $file might 
+# include directories
+sub read {
+    my $self = shift (@_);
+    my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs) = @_;
+    my $outhandle = $self->{'outhandle'};
+
+    if ($file =~ /\.(gz|tgz|z|taz|bz|bz2|zip|jar|tar)$/i) {
+
+	my $filename = $file;
+	$filename = &util::filename_cat ($base_dir, $file) if $base_dir =~ /\w/;
+	if (!-e $filename) {
+	    print $outhandle "ZIPPLug: WARNING: $filename does not exist\n";
+	    return undef;
+	}
+	
+	my ($file_only) = $file =~ /([^\\\/]*)$/;
+	my $tmpdir = &util::get_tmp_filename ();
+	&util::mk_all_dir ($tmpdir);
+
+	print $outhandle "ZIPPlug: extracting $file_only to $tmpdir\n";
+
+	# save current working directory
+	my $cwd = cwd();
+	chdir ($tmpdir) || die "Unable to change to $tmpdir";
+	&util::cp ($filename, $tmpdir);
+	
+	if ($file =~ /\.bz$/i) {
+	    $self->bunzip ($file_only);
+	} elsif ($file =~ /\.bz2$/i) {
+	    $self->bunzip2 ($file_only);
+	} elsif ($file =~ /\.(zip|jar)$/i) {
+	    $self->unzip ($file_only);
+	} elsif ($file =~ /\.tar$/i) {
+	    $self->untar ($file_only);
+	} else {
+	    $self->gunzip ($file_only);
+	}
+
+	chdir ($cwd) || die "Unable to change back to $cwd";
+
+	my $numdocs = &plugin::read ($pluginfo, "", $tmpdir, $metadata, $processor, $maxdocs);
+	&util::rm_r ($tmpdir);
+
+	$self->{'num_archives'} ++;
+
+	return $numdocs;
+
+    } else {
+	return undef;
+    }
+}
+
+sub bunzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("bunzip $file")!=0)
+    {
+	&util::rm ($file);
+    }
+}
+
+sub bunzip2 {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("bunzip2 $file")!=0)
+    {
+	&util::rm ($file);
+    }
+}
+
+sub unzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    system ("unzip $file");
+    &util::rm ($file) if -e $file;
+}
+
+sub untar {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    system ("tar xf $file");
+    &util::rm ($file) if -e $file;
+}
+
+sub gunzip {
+    my $self = shift (@_);
+    my ($file) = @_;
+
+    if (system ("gunzip $file")!=0)
+    {
+	&util::rm ($file);
+    };
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/remproc.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/remproc.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/remproc.pm	(revision 21083)
@@ -0,0 +1,59 @@
+###########################################################################
+#
+# remproc.pm -- document processor used to cache all documents in memory
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package remproc;
+
+use classify;
+use doc;
+use docproc;
+
+BEGIN {
+    @ISA = ('docproc');
+}
+
+
+sub new {
+    my ($class) = @_;
+    my $self = {'docs'=>[]};
+
+    return bless $self, $class;
+}
+
+sub process {
+    my $self = shift (@_);
+    my ($doc_obj, $filename) = @_;
+
+    push (@{$self->{'docs'}}, {'doc_obj'=>$doc_obj,
+			       'filename'=>$filename});
+}
+
+sub get_doc_list {
+    my $self = shift (@_);
+
+    return $self->{'docs'};
+}
+
+1;
+
Index: /main/tags/2.38/gsdl/perllib/sorttools.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/sorttools.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/sorttools.pm	(revision 21083)
@@ -0,0 +1,123 @@
+###########################################################################
+#
+# sorttools.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# various subroutines to format strings
+# for sorting
+
+package sorttools;
+
+
+# format an english string for sorting
+# i.e. convert to lowercase, remove the, a or an
+# from beginning of string etc.
+sub format_string_english {
+    my ($stringref) = @_;
+
+    $$stringref =~ tr/A-Z/a-z/;
+    $$stringref =~ s/&\S+;//g;
+    $$stringref =~ s/[^a-z0-9 ]//g;
+    $$stringref =~ s/^\s*(the|a|an)\b//;
+    $$stringref =~ s/^\s+//;
+}
+
+# format an english name for sorting
+# i.e. convert to lowercase, put surname before
+# first names etc.    
+sub format_string_name_english {
+    my ($stringref) = @_;
+
+    $$stringref =~ tr/A-Z/a-z/;
+    $$stringref =~ s/&\S+;//g;
+    $$stringref =~ s/[^a-z0-9 ]//g;
+    $$stringref =~ s/\s+/ /g;
+    $$stringref =~ s/^\s+//;
+    my @names = split / /, $$stringref;
+    my $surname = pop @names;
+    while (scalar @names && $surname =~ /^(jnr|snr)$/i) {
+	$surname = pop @names;
+    }
+    $$stringref = $surname . " " . $$stringref;
+}
+
+# takes arguments of day, month, year and converts to
+# date of form yyyymmdd. month may be full (e.g. "January"),
+# abbreviated (e.g. "Jan"), or a number (1-12). Years like "86" 
+# will be assumed to be "1986".
+sub format_date {
+    my ($day, $month, $year) = @_;
+
+    my %months = ('january' => '01', 'jan' => '01', 'february' => '02', 'feb' => '02',
+		  'march' => '03', 'mar' => '03', 'april' => '04', 'apr' => '04',
+		  'may' => '05', 'june' => '06', 'jun' => '06', 'july' => '07', 
+		  'jul' => '07', 'august' => '08', 'aug' => '08', 'september' => '09', 
+		  'sep' => '09', 'october' => '10', 'oct' => '10', 'november' => '11', 
+		  'nov' => '11', 'december' => '12', 'dec' => '12');
+
+    $month =~ tr/A-Z/a-z/;
+    
+    if ($day < 1) { 
+	print STDERR "sorttools::format_date WARNING day $day out of range\n";
+	$day = "01";
+    } elsif ($day > 31) {
+	print STDERR "sorttools::format_date WARNING day $day out of range\n";
+	$day = "31";
+    }
+
+    $day = "0$day" if (length($day) == 1);
+
+    if ($month =~ /^\d\d?$/) {
+	if ($month < 1) {
+	    print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	    $month = "01";
+	} elsif ($month > 12) {
+	    print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	    $month = "12";
+	}
+	if ($month =~ /^\d$/) {
+	    $month = "0" . $month;
+	}
+    } elsif (!defined $months{$month}) {
+	print STDERR "sorttools::format_date WARNING month $month out of range\n";
+	$month = "01";
+    } else {
+	$month = $months{$month};
+    }
+    
+    if ($year !~ /^\d\d\d\d$/) {
+	if ($year !~ /^\d\d$/) {
+	    my $newyear = 1900 + $year;
+	    print STDERR "sorttools::format_date WARNING year $year assumed to be $newyear\n";
+	    $year=$newyear;
+	} else {
+	    print STDERR "sorttools::format_date WARNING year $year out of range - reset to 1900\n";
+	    $year = "1900";
+	}
+    }
+
+    return "$year$month$day";
+}
+
+
+1;
Index: /main/tags/2.38/gsdl/perllib/textcat.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/textcat.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/textcat.pm	(revision 21083)
@@ -0,0 +1,149 @@
+###########################################################################
+#
+# textcat.pm -- Identify the language of a piece of text
+#
+#
+# This file is based on TextCat version 1.08 by Gertjan van Noord
+# Copyright (C) 1997 Gertjan van Noord (vannoord@let.rug.nl)
+# TextCat is available from: http://odur.let.rug.nl/~vannoord/TextCat 
+#
+# It was modified by Gordon Paynter (gwp@cs.waikato.ac.nz) and turned
+# into a package for use in Greenstone digital library system.  Most of
+# the modifications consist of commenting out or deleting functionality
+# I don't need.  
+#
+#
+# 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.
+#
+###########################################################################
+
+package textcat;
+
+# OPTIONS
+my $model_dir = $ENV{'GSDLHOME'} . "/perllib/textcat";
+
+my $opt_f = 1;                # Ngrams which occur <= this number of times are removed
+my $opt_t = 400;              # topmost number of ngrams that should be used
+my $opt_u = 1.05;             # how much worse result must be before it is ignored
+
+my $non_word_characters = '0-9\s';
+
+sub new {
+    my $class = shift (@_);
+    my $self = {};
+
+    # open directory to find which languages are supported
+    opendir DIR, "$model_dir" or die "directory $model_dir: $!\n";
+    my @languages = sort(grep { s/\.lm// && -r "$model_dir/$_.lm" } readdir(DIR));
+    closedir DIR;
+    @languages or die "sorry, can't read any language models from $model_dir\n" .
+	"language models must reside in files with .lm ending\n";
+
+    # load model and count for each language.
+    foreach my $language (@languages) {
+	my %ngram=();
+	my $rang=1;
+	open(LM, "$model_dir/$language.lm") || die "cannot open $language.lm: $!\n";
+	while (<LM>) {
+	    chomp;
+	    # only use lines starting with appropriate character. Others are ignored.
+	    if (/^[^$non_word_characters]+/o) {
+		$self->{'ngrams'}->{$language}->{$&} = $rang++;
+	    } 
+	}
+	close(LM);
+    }
+
+    $self->{'languages'} = \@languages;
+    return bless $self, $class;
+}
+
+
+
+# CLASSIFICATION
+#
+# What language is a text string?
+#   Input:  text string
+#   Output: array of language names
+
+sub classify {
+    my ($self, $inputref)=@_;
+    my %results = ();
+    my $maxp = $opt_t;
+
+    # create ngrams for input.
+    my $unknown = $self->create_lm($inputref);
+
+    foreach my $language (@{$self->{'languages'}}) {
+    
+	# compare language model with input ngrams list
+	my ($i,$p)=(0,0);
+	while ($i < scalar (@$unknown)) {
+	    if (defined ($self->{'ngrams'}->{$language}->{$unknown->[$i]})) {
+		$p=$p+abs($self->{'ngrams'}->{$language}->{$unknown->[$i]}-$i);
+	    } else { 
+		$p=$p+$maxp; 
+	    }
+	    ++$i;
+	}
+	$results{$language} = $p;
+    }
+
+    my @results = sort { $results{$a} <=> $results{$b} } keys %results;
+    my $a = $results{$results[0]};
+  
+    my @answers=(shift(@results));
+    while (@results && $results{$results[0]} < ($opt_u *$a)) {
+	@answers=(@answers,shift(@results));
+    }
+
+    return \@answers;
+}
+
+sub create_lm {
+    # $ngram contains reference to the hash we build
+    # then add the ngrams found in each word in the hash
+    my ($self, $textref) = @_;  
+    
+    my $ngram = {};
+
+    foreach my $word (split(/[$non_word_characters]+/, $$textref)) {
+	$word = "_" . $word . "_";
+	my $len = length($word);
+	my $flen=$len;
+	my $i;
+
+	for ($i=0; $i<$flen; $i++) {
+	    $ngram->{substr($word,$i,5)}++ if $len > 4;
+	    $ngram->{substr($word,$i,4)}++ if $len > 3;
+	    $ngram->{substr($word,$i,3)}++ if $len > 2;
+	    $ngram->{substr($word,$i,2)}++ if $len > 1;
+	    $ngram->{substr($word,$i,1)}++;
+	    $len--;
+	}
+    }
+
+    map { if ($ngram->{$_} <= $opt_f) { delete $ngram->{$_}; }
+      } keys %$ngram;
+  
+    # sort the ngrams, and spit out the $opt_t frequent ones.
+    # adding  `or $a cmp $b' in the sort block makes sorting five
+    # times slower..., although it would be somewhat nicer (unique result)
+    my @sorted = sort { $ngram->{$b} <=> $ngram->{$a} } keys %$ngram;
+    splice(@sorted,$opt_t) if (@sorted > $opt_t); 
+    return \@sorted;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/textcat/in-iso_8859_1.lm
===================================================================
--- /main/tags/2.38/gsdl/perllib/textcat/in-iso_8859_1.lm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/textcat/in-iso_8859_1.lm	(revision 21083)
@@ -0,0 +1,400 @@
+_	 19406
+a	 10666
+n	 5455
+e	 4535
+i	 4387
+r	 2936
+t	 2902
+an	 2853
+u	 2841
+k	 2761
+s	 2311
+m	 2178
+d	 2134
+g	 2105
+l	 1780
+a_	 1506
+n_	 1476
+ng	 1449
+p	 1397
+b	 1275
+an_	 1270
+o	 1246
+h	 1130
+i_	 1108
+er	 1038
+ka	 1032
+_d	 1006
+y	 997
+,	 951
+en	 941
+ar	 914
+,_	 900
+_m	 880
+ya	 842
+ta	 838
+ang	 797
+di	 787
+da	 773
+.	 754
+la	 742
+._	 738
+me	 732
+ak	 728
+_s	 718
+at	 690
+ra	 688
+ga	 683
+_k	 671
+_me	 650
+in	 628
+ah	 601
+_t	 583
+_p	 570
+g_	 551
+_b	 551
+_di	 548
+ng_	 544
+ma	 536
+se	 526
+tu	 511
+na	 506
+al	 500
+ri	 490
+as	 483
+k_	 482
+j	 480
+si	 470
+ny	 467
+h_	 457
+sa	 452
+ang_	 439
+it	 424
+kan	 423
+ti	 418
+_se	 417
+pe	 412
+S	 409
+ba	 407
+ke	 407
+em	 405
+men	 405
+be	 403
+un	 401
+te	 401
+am	 396
+pa	 395
+nya	 390
+_men	 374
+el	 374
+t_	 371
+_a	 360
+_i	 356
+u_	 355
+kan_	 345
+_ke	 339
+is	 335
+ah_	 324
+_S	 324
+eng	 321
+nga	 320
+ia	 318
+_pe	 316
+ha	 313
+ap	 311
+r_	 308
+w	 305
+li	 301
+_da	 300
+s_	 299
+P	 296
+nd	 290
+_be	 287
+ik	 283
+ja	 281
+yan	 281
+ad	 275
+ek	 273
+uk	 272
+di_	 270
+bu	 269
+ya_	 268
+yang	 268
+ak_	 266
+ber	 265
+_y	 265
+_ya	 264
+_P	 263
+ru	 260
+K	 259
+yang_	 256
+_yang	 256
+_yan	 256
+nt	 255
+de	 253
+_te	 250
+wa	 249
+et	 247
+at_	 246
+ara	 245
+gan	 243
+A	 237
+ari	 235
+ala	 230
+itu	 229
+c	 225
+ol	 225
+ni	 225
+us	 225
+dan	 224
+_K	 224
+M	 224
+B	 223
+ata	 222
+ai	 221
+ur	 219
+nya_	 217
+ua	 215
+_ka	 214
+_ber	 210
+eb	 209
+ran	 206
+D	 206
+ela	 206
+_di_	 205
+_l	 204
+ngan	 204
+ter	 203
+re	 201
+-	 199
+aka	 198
+l_	 194
+_A	 191
+era	 191
+a,	 191
+e_	 190
+ir	 187
+I	 186
+tan	 185
+_B	 184
+ut	 184
+ku	 183
+a,_	 183
+il	 182
+J	 181
+um	 180
+_it	 180
+_itu	 180
+_ta	 179
+su	 179
+dan_	 177
+es	 177
+on	 177
+or	 177
+_dan	 176
+lu	 174
+_M	 172
+tu_	 172
+_dan_	 172
+enga	 171
+mb	 169
+R	 169
+si_	 168
+per	 168
+gan_	 168
+ngan_	 165
+"	 162
+_ter	 162
+a.	 161
+man	 161
+gk	 160
+a._	 160
+asi	 160
+ngk	 160
+ep	 160
+ag	 159
+ul	 158
+da_	 157
+m_	 155
+du	 155
+ada	 153
+ki	 153
+rt	 150
+mp	 150
+T	 150
+ama	 148
+ing	 148
+na_	 147
+_J	 147
+_D	 145
+ung	 145
+ana	 145
+n,	 144
+ju	 144
+ud	 144
+rin	 143
+gi	 143
+aw	 141
+lah	 138
+lan	 138
+_sa	 136
+ri_	 136
+meng	 136
+_meng	 135
+_ma	 134
+n,_	 134
+awa	 134
+st	 134
+eka	 133
+mi	 133
+mu	 132
+_T	 132
+po	 131
+ge	 131
+ar_	 130
+id	 129
+ko	 129
+le	 128
+_h	 128
+ena	 127
+_j	 126
+emb	 126
+ina	 125
+_r	 124
+itu_	 124
+ay	 123
+ngg	 123
+gg	 123
+rang	 123
+pi	 120
+nan	 120
+_ba	 119
+_la	 119
+apa	 119
+_I	 118
+p_	 118
+bi	 117
+ai_	 117
+ta_	 116
+san	 116
+Ke	 116
+ro	 115
+eri	 114
+kar	 113
+lah_	 113
+_itu_	 112
+aya	 111
+i,	 110
+an,	 110
+ra_	 110
+_per	 110
+im	 110
+ika	 109
+isi	 109
+mem	 109
+tah	 108
+_Ke	 108
+ian	 108
+_mem	 108
+akan	 108
+Se	 108
+to	 107
+ab	 107
+ngka	 106
+rs	 106
+gka	 106
+uk_	 105
+seb	 104
+_de	 104
+pu	 104
+i,_	 104
+ita	 104
+nda	 103
+_ti	 103
+ni_	 103
+ca	 103
+_Se	 103
+ers	 103
+pen	 103
+ini	 102
+an,_	 102
+angk	 101
+uh	 101
+han	 101
+nta	 100
+_in	 99
+f	 99
+nj	 99
+ok	 99
+aga	 99
+_R	 98
+as_	 98
+tr	 98
+mer	 97
+lam	 97
+and	 97
+end	 96
+anga	 96
+ne	 96
+Sa	 96
+ka_	 96
+arin	 95
+gu	 95
+_ha	 94
+Z	 94
+al_	 94
+ga_	 94
+_Z	 93
+_pen	 93
+dar	 93
+Ad	 93
+i._	 93
+ada_	 93
+atan	 93
+tak	 93
+i.	 93
+ia_	 92
+asa	 92
+ap_	 92
+ari_	 92
+kat	 92
+_seb	 92
+_Za	 91
+Za	 91
+den	 91
+n.	 90
+_u	 90
+_Ad	 90
+engan	 89
+ib	 89
+any	 89
+n._	 89
+o_	 89
+Zar	 88
+Zari	 88
+rina	 88
+_Zar	 88
+_Zari	 88
+Zarin	 88
+arina	 88
+ks	 88
+angka	 87
+oli	 87
+eg	 87
+kt	 86
+_Sa	 86
+hu	 85
+ih	 85
+us_	 85
+adi	 85
+om	 85
+eba	 85
+anya	 85
+_bu	 84
+denga	 83
+L	 83
+ed	 83
+dak	 83
+deng	 83
+ma_	 82
+asi_	 82
Index: /main/tags/2.38/gsdl/perllib/unicode.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/unicode.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/unicode.pm	(revision 21083)
@@ -0,0 +1,460 @@
+###########################################################################
+#
+# unicode.pm --
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+# useful functions for dealing with Unicode
+
+# Unicode strings are stored as arrays of scalars as perl 
+# lacks characters are 8-bit (currently)
+
+package unicode;
+use encodings;
+use util;
+
+# ascii2unicode takes an (extended) ascii string (ISO-8859-1)
+# and returns a unicode array.
+sub ascii2unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my $len = length($in);
+    while ($i < $len) {
+	push (@$out, ord(substr ($in, $i, 1)));	
+	$i++;
+    }
+
+    return $out;
+}
+
+# ascii2utf8 takes a reference to an (extended) ascii string and returns a
+# UTF-8 encoded string. This is just a faster version of
+# "&unicode2utf8(&ascii2unicode($str));"
+sub ascii2utf8 {
+    my ($in) = @_;
+    my $out = "";
+
+    if (!defined($in)|| !defined($$in)) {
+	return $out;
+    }
+
+    my ($c);
+    my $i = 0;
+    my $len = length($$in);
+    while ($i < $len) {
+	$c = ord (substr ($$in, $i, 1));
+	if ($c < 0x80) {
+	    # ascii character
+	    $out .= chr ($c);
+
+	} else {
+	    # extended ascii character
+	    $out .= chr (0xc0 + (($c >> 6) & 0x1f));
+	    $out .= chr (0x80 + ($c & 0x3f));
+	}
+	$i++;
+    }
+
+    return $out;
+}
+
+# unicode2utf8 takes a unicode array as input and encodes it
+# using utf-8
+sub unicode2utf8 {
+    my ($in) = @_;
+    my $out = "";
+    
+    foreach $num (@$in) {
+	next unless defined $num;
+	if ($num < 0x80) {
+	    $out .= chr ($num);
+
+	} elsif ($num < 0x800) {
+	    $out .= chr (0xc0 + (($num >> 6) & 0x1f));
+	    $out .= chr (0x80 + ($num & 0x3f));
+
+	} elsif ($num < 0xFFFF) {
+	    $out .= chr (0xe0 + (($num >> 12) & 0xf));
+	    $out .= chr (0x80 + (($num >> 6) & 0x3f));
+	    $out .= chr (0x80 + ($num & 0x3f));
+
+	} else {
+	    # error, don't encode anything
+	    die;
+	}
+    }
+    return $out;
+}
+
+# utf82unicode takes a utf-8 string and produces a unicode
+# array
+sub utf82unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my ($c1, $c2, $c3);
+    $len = length($in);
+    while ($i < $len) {
+	if (($c1 = ord(substr ($in, $i, 1))) < 0x80) {
+	    # normal ascii character
+	    push (@$out, $c1);
+
+	} elsif ($c1 < 0xc0) {
+	    # error, was expecting the first byte of an
+	    # encoded character. Do nothing.
+
+	} elsif ($c1 < 0xe0 && $i+1 < $len) {
+	    # an encoded character with two bytes
+	    $c2 = ord (substr ($in, $i+1, 1));
+	    if ($c2 >= 0x80 && $c2 < 0xc0) {
+		# everything looks ok
+		push (@$out, ((($c1 & 0x1f) << 6) +
+		      ($c2 & 0x3f)));
+		$i++; # gobbled an extra byte
+	    }
+
+	} elsif ($c1 < 0xf0 && $i+2 < $len) {
+	    # an encoded character with three bytes
+	    $c2 = ord (substr ($in, $i+1, 1));
+	    $c3 = ord (substr ($in, $i+2, 1));
+	    if ($c2 >= 0x80 && $c2 < 0xc0 &&
+		$c3 >= 0x80 && $c3 < 0xc0) {
+		# everything looks ok
+		push (@$out, ((($c1 & 0xf) << 12) +
+		      (($c2 & 0x3f) << 6) +
+		      ($c3 & 0x3f)));
+
+		$i += 2; # gobbled an extra two bytes
+	    }
+
+	} else {
+	    # error, only decode Unicode characters not full UCS.
+	    # Do nothing.
+	}
+
+	$i++;
+    }
+
+    return $out;
+}
+
+# unicode2ucs2 takes a unicode array and produces a UCS-2
+# unicode string (every two bytes forms a unicode character)
+sub unicode2ucs2 {
+    my ($in) = @_;
+    my $out = "";
+
+    foreach $num (@$in) {
+	$out .= chr (($num & 0xff00) >> 8);
+	$out .= chr ($num & 0xff);
+    }
+
+    return $out;
+}
+
+# ucs22unicode takes a UCS-2 string and produces a unicode array
+sub ucs22unicode {
+    my ($in) = @_;
+    my $out = [];
+
+    my $i = 0;
+    my $len = length ($in);
+    while ($i+1 < $len) {
+	push (@$out, ord (substr($in, $i, 1)) << 8 +
+	      ord (substr($in, $i+1, 1)));
+
+	$i ++;
+    }
+
+    return $out;
+}
+
+# takes a reference to a string and returns a reference to a unicode array
+sub convert2unicode {
+    my ($encoding, $textref) = @_;
+
+    if (!defined $encodings::encodings->{$encoding}) {
+	print STDERR "unicode::convert2unicode: ERROR: Unsupported encoding ($encoding)\n";
+	return [];
+    }
+
+    my $encodename = "$encoding-unicode";
+    my $enc_info = $encodings::encodings->{$encoding};
+    my $mapfile = &util::filename_cat($ENV{'GSDLHOME'}, "mappings",
+				      "to_uc", $enc_info->{'mapfile'});
+    if (!&loadmapencoding ($encodename, $mapfile)) {
+	print STDERR "unicode: ERROR - could not load encoding $encodename\n";
+	return [];
+    }
+    
+    if (defined $enc_info->{'converter'}) {
+	my $converter = $enc_info->{'converter'};
+	return &$converter ($encodename, $textref);
+    }
+
+    if ($translations{$encodename}->{'count'} == 1) {
+	return &singlebyte2unicode ($encodename, $textref);
+    } else {
+	return &doublebyte2unicode ($encodename, $textref);
+    }
+}
+
+# singlebyte2unicode converts simple 8 bit encodings where characters below
+# 0x80 are normal ascii characters and the rest are decoded using the
+# appropriate mapping files.
+#
+# Examples of encodings that may be converted using singlebyte2unicode are
+# the iso-8859 and windows-125* series).
+sub singlebyte2unicode {
+    my ($encodename, $textref) = @_;
+
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c);
+    my $i = 0;
+
+    while ($i < $len) {
+	if (($c = ord(substr($$textref, $i, 1))) < 0x80) {
+	    # normal ascii character
+	    push (@outtext, $c);
+	} else {
+	    $c = &transchar ($encodename, $c);
+	    # put a black square if cannot translate
+	    $c = 0x25A1 if $c == 0;
+	    push (@outtext, $c);
+	}
+	$i ++;
+    }
+    return \@outtext;
+}
+
+# doublebyte2unicode converts simple two byte encodings where characters
+# below code point 0x80 are single-byte characters and the rest are
+# double-byte characters.
+#
+# Examples of encodings that may be converted using doublebyte2unicode are
+# CJK encodings like GB encoded Chinese and UHC Korean.
+#
+# Note that no error checking is performed to make sure that the input text
+# is valid for the given encoding.
+#
+# Also, encodings that may contain characters of more than two bytes are
+# not supported (any EUC encoded text may in theory contain 3-byte
+# characters but in practice only one and two byte characters are used).
+sub doublebyte2unicode {
+    my ($encodename, $textref) = @_;    
+    
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c1, $c2);
+    my $i = 0;
+
+    while ($i < $len) {
+	if (($c1 = ord(substr($$textref, $i, 1))) >= 0x80) {
+	    if ($i+1 < $len) {
+		# double-byte character
+		$c2 = ord(substr($$textref, $i+1, 1));
+		my $c = &transchar ($encodename, ($c1 << 8) | $c2);
+		# put a black square if cannot translate
+		$c = 0x25A1 if $c == 0;
+		push (@outtext, $c);
+		$i += 2;
+		
+	    } else {
+		# error
+		print STDERR "unicode: ERROR missing second half of double-byte character\n";
+		$i++;
+	    }
+	    
+	} else {
+	    # single-byte character
+	    push (@outtext, $c1);
+	    $i++;
+	}
+    }
+    return \@outtext;
+}
+
+# Shift-JIS to unicode
+# We can't use doublebyte2unicode for Shift-JIS because it uses some
+# single-byte characters above code point 0x80 (i.e. half-width katakana
+# characters in the range 0xA1-0xDF)
+sub shiftjis2unicode {
+    my ($encodename, $textref) = @_;
+    
+    my @outtext = ();
+    my $len = length($$textref);
+    my ($c1, $c2);
+    my $i = 0;
+
+    while ($i < $len) {
+	$c1 = ord(substr($$textref, $i, 1));
+
+	if (($c1 >= 0xA1 && $c1 <= 0xDF) || $c1 == 0x5c || $c1 == 0x7E) {
+	    # Single-byte half-width katakana character or
+	    # JIS Roman yen or overline characters
+	    my $c = &transchar ($encodename, $c1);
+	    # - put a black square if cannot translate
+	    $c = 0x25A1 if $c == 0;
+	    push (@outtext, $c);
+	    $i++;
+
+	} elsif ($c1 < 0x80) {
+	    # ASCII
+	    push (@outtext, $c1);
+	    $i ++;
+
+	} elsif ($c1 < 0xEF) {
+	    if ($i+1 < $len) {
+		$c2 = ord(substr($$textref, $i+1, 1));
+		if (($c2 >= 0x40 && $c2 <= 0x7E) || ($c2 >= 0x80 && $c2 <= 0xFC)) {
+		    # Double-byte shift-jis character
+		    my $c = &transchar ($encodename, ($c1 << 8) | $c2);
+		    # put a black square if cannot translate
+		    $c = 0x25A1 if $c == 0;
+		    push (@outtext, $c);
+		} else {
+		    # error
+		    print STDERR "unicode: ERROR Invalid Shift-JIS character\n";
+		}
+		$i += 2;
+	    } else {
+		# error
+		print STDERR "unicode: ERROR missing second half of Shift-JIS character\n";
+		$i ++;
+	    }
+	} else {
+	    # error
+	    print STDERR "unicode: ERROR Invalid Shift-JIS character\n";
+	    $i ++;
+	}
+    }
+    return \@outtext;
+}
+
+sub transchar {
+    my ($encoding, $from) = @_;
+    my $high = ($from / 256) % 256;
+    my $low = $from % 256;
+
+    return 0 unless defined $translations{$encoding};
+
+    my $block = $translations{$encoding}->{'map'};
+
+    if (ref ($block->[$high]) ne "ARRAY") {
+	return 0;
+    }
+    return $block->[$high]->[$low];
+}
+
+# %translations is of the form:
+#
+# encodings{encodingname-encodingname}->{'map'}->blocktranslation
+# blocktranslation->[[0-255],[256-511], ..., [65280-65535]]
+#
+# Any of the top translation blocks can point to an undefined
+# value. This data structure aims to allow fast translation and 
+# efficient storage.
+%translations = ();
+
+# @array256 is used for initialisation, there must be
+# a better way...
+@array256 = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+	     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
+
+# returns 1 if successful, 0 if unsuccessful
+sub loadmapencoding {
+    my ($encoding, $mapfile) = @_;
+    
+    # check to see if the encoding has already been loaded
+    return 1 if (defined $translations{$encoding});
+
+    return 0 unless open (MAPFILE, $mapfile);
+    binmode (MAPFILE);
+
+    $translations{$encoding} = {'map' => [@array256], 'count' => 0};
+    my $block = $translations{$encoding};
+
+    my ($in,$i,$j);
+    while (read(MAPFILE, $in, 1) == 1) {
+	$i = unpack ("C", $in);
+	$block->{'map'}->[$i] = [@array256];
+	for ($j=0; $j<256 && read(MAPFILE, $in, 2)==2; $j++) {
+	    my ($n1, $n2) = unpack ("CC", $in);
+	    $block->{'map'}->[$i]->[$j] = ($n1*256) + $n2;
+	}
+	$block->{'count'} ++;
+    }
+
+    close (MAPFILE);
+}
+
+sub unicode2koi8r {
+    my ($uniref) = @_;
+    
+    my $outtext = "";
+    my $encodename = "unicode-koi8_r";
+    my $enc_info = $encodings::encodings->{"koi8_r"};
+    my $mapfile = &util::filename_cat($ENV{'GSDLHOME'}, "mappings",
+				      "from_uc", $enc_info->{'mapfile'});
+    if (!&loadmapencoding ($encodename, $mapfile)) {
+	print STDERR "unicode: ERROR - could not load encoding $encodename\n";
+	return "";
+    }
+    
+    foreach my $c (@$uniref) {
+	if ($c < 0x80) {
+	    # normal ascii character
+	    $outtext .= chr($c);
+	} else {
+	    # extended ascii character
+	    $c = &transchar ($encodename, $c);
+
+	    # put a question mark if cannot translate
+	    if ($c == 0) {
+		$outtext .= "?";
+	    } else {
+		$outtext .= chr($c);
+	    }
+	}
+    }
+    return $outtext;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/util.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/util.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/util.pm	(revision 21083)
@@ -0,0 +1,593 @@
+###########################################################################
+#
+# util.pm -- various useful utilities
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+package util;
+
+use File::Copy;
+use File::Basename;
+
+
+# removes files (but not directories)
+sub rm {
+    my (@files) = @_;
+    my @filefiles = ();
+
+    # make sure the files we want to delete exist 
+    # and are regular files
+    foreach $file (@files) {
+	if (!-e $file) {
+	    print STDERR "util::rm $file does not exist\n";
+	} elsif ((!-f $file) && (!-l $file)) {
+	    print STDERR "util::rm $file is not a regular (or symbolic) file\n";
+	} else {
+	    push (@filefiles, $file);
+	}
+    }
+    
+    # remove the files
+    my $numremoved = unlink @filefiles;
+
+    # check to make sure all of them were removed
+    if ($numremoved != scalar(@filefiles)) {
+	print STDERR "util::rm Not all files were removed\n";
+    }
+}
+
+
+# recursive removal
+sub rm_r {
+    my (@files) = @_;
+
+    # recursively remove the files
+    foreach $file (@files) {
+	$file =~ s/[\/\\]+$//; # remove trailing slashes
+	
+	if (!-e $file) {
+	    print STDERR "util::rm_r $file does not exist\n";
+
+	} elsif ((-d $file) && (!-l $file)) { # don't recurse down symbolic link
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::rm_r could not open directory $file\n";
+	    } else {
+		my @filedir = grep (!/^\.\.?$/, readdir (INDIR));
+		closedir (INDIR);
+
+		# remove all the files in this directory
+		&rm_r (map {$_="$file/$_";} @filedir);
+
+		# remove this directory
+		if (!rmdir $file) {
+		    print STDERR "util::rm_r couldn't remove directory $file\n";
+		}
+	    }
+
+	} else {
+	    # remove this file
+	    &rm ($file);
+	}
+    }
+}
+
+# moves a file or a group of files
+sub mv {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # remove trailing slashes from source and destination files
+    $dest =~ s/[\\\/]+$//;
+    map {$_ =~ s/[\\\/]+$//;} @srcfiles;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::mv no destination directory given\n";
+	return;
+    } elsif ((scalar (@srcfiles) > 1) && (!-d $dest)) {
+	print STDERR "util::mv if multiple source files are given the ".
+	    "destination must be a directory\n";
+	return;
+    }
+
+    # move the files
+    foreach $file (@srcfiles) {
+	my $tempdest = $dest;
+	if (-d $tempdest) {
+	    my ($filename) = $file =~ /([^\\\/]+)$/;
+	    $tempdest .= "/$filename";
+	}
+	if (!-e $file) {
+	    print STDERR "util::mv $file does not exist\n";
+	} else {
+	    rename ($file, $tempdest);
+	}
+    }
+}
+
+
+# copies a file or a group of files
+sub cp {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # remove trailing slashes from source and destination files
+    $dest =~ s/[\\\/]+$//;
+    map {$_ =~ s/[\\\/]+$//;} @srcfiles;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp no destination directory given\n";
+	return;
+    } elsif ((scalar (@srcfiles) > 1) && (!-d $dest)) {
+	print STDERR "util::cp if multiple source files are given the ".
+	    "destination must be a directory\n";
+	return;
+    }
+
+    # copy the files
+    foreach $file (@srcfiles) {
+	my $tempdest = $dest;
+	if (-d $tempdest) {
+	    my ($filename) = $file =~ /([^\\\/]+)$/;
+	    $tempdest .= "/$filename";
+	}
+	if (!-e $file) {
+	    print STDERR "util::cp $file does not exist\n";
+	} elsif (!-f $file) {
+	    print STDERR "util::cp $file is not a plain file\n";
+	} else {
+	    &File::Copy::copy ($file, $tempdest);
+	}
+    }
+}
+
+
+
+# recursively copies a file or group of files
+# syntax: cp_r (sourcefiles, destination directory)
+# destination must be a directory - to copy one file to
+# another use cp instead
+sub cp_r {
+    my $dest = pop (@_);
+    my (@srcfiles) = @_;
+
+    # a few sanity checks
+    if (scalar (@srcfiles) == 0) {
+	print STDERR "util::cp_r no destination directory given\n";
+	return;
+    } elsif (-f $dest) {
+	print STDERR "util::cp_r destination must be a directory\n";
+	return;
+    }
+    
+    # create destination directory if it doesn't exist already
+    if (! -d $dest) {
+	my $store_umask = umask(0002);
+	mkdir ($dest, 0777);
+	umask($store_umask);
+    } 
+
+    # copy the files
+    foreach $file (@srcfiles) {
+
+	if (!-e $file) {
+	    print STDERR "util::cp_r $file does not exist\n";
+
+	} elsif (-d $file) {
+	    # make the new directory
+	    my ($filename) = $file =~ /([^\\\/]*)$/;
+	    $dest = &util::filename_cat ($dest, $filename);
+	    my $store_umask = umask(0002);
+	    mkdir ($dest, 0777);
+	    umask($store_umask);
+
+	    # get the contents of this directory
+	    if (!opendir (INDIR, $file)) {
+		print STDERR "util::cp_r could not open directory $file\n";
+	    } else {
+		my @filedir = readdir (INDIR);
+		closedir (INDIR);
+		foreach $f (@filedir) {
+		    next if $f =~ /^\.\.?$/;
+		    # copy all the files in this directory
+		    my $ff = &util::filename_cat ($file, $f); 
+		    &cp_r ($ff, $dest);
+		}
+	    }
+
+	} else {
+	    &cp($file, $dest);
+	}
+    }
+}
+
+
+sub mk_dir {
+    my ($dir) = @_;
+
+    my $store_umask = umask(0002);
+    my $mkdir_ok = mkdir ($dir, 0777);
+    umask($store_umask);
+    
+    if (!$mkdir_ok) 
+    {
+	print STDERR "util::mk_dir could not create directory $dir\n";
+	return;
+    }
+}
+
+# in case anyone cares - I did some testing (using perls Benchmark module)
+# on this subroutine against File::Path::mkpath (). mk_all_dir() is apparently
+# slightly faster (surprisingly) - Stefan.
+sub mk_all_dir {
+    my ($dir) = @_;
+
+    # use / for the directory separator, remove duplicate and
+    # trailing slashes
+    $dir=~s/[\\\/]+/\//g; 
+    $dir=~s/[\\\/]+$//;
+
+    # make sure the cache directory exists
+    my $dirsofar = "";
+    my $first = 1;
+    foreach $dirname (split ("/", $dir)) {
+	$dirsofar .= "/" unless $first;
+	$first = 0;
+
+	$dirsofar .= $dirname;
+
+	next if $dirname =~ /^(|[a-z]:)$/i;
+	if (!-e $dirsofar)
+	    {
+		my $store_umask = umask(0002);
+		my $mkdir_ok = mkdir ($dirsofar, 0777);
+		umask($store_umask);
+		if (!$mkdir_ok)
+		{
+		    print STDERR "util::mk_all_dir could not create directory $dirsofar\n";
+		    return;
+		}
+	    }
+    }
+}
+
+# make hard link to file if supported by OS, otherwise copy the file
+sub hard_link {
+    my ($src, $dest) = @_;
+
+    # remove trailing slashes from source and destination files
+    $src =~ s/[\\\/]+$//;
+    $dest =~ s/[\\\/]+$//;
+
+    # a few sanity checks
+    if (-e $dest) {
+	# destination file already exists
+	return;
+    }
+    elsif (!-e $src) {
+	print STDERR "util::hard_link source file $src does not exist\n";
+	return;
+    }
+    elsif (-d $src) {
+	print STDERR "util::hard_link source $src is a directory\n";
+	return;
+    }
+
+    my $dest_dir = &File::Basename::dirname($dest);
+    mk_all_dir($dest_dir) if (!-e $dest_dir);
+
+    # link not supported on windows
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	&File::Copy::copy ($src, $dest);
+
+    } elsif (!link($src, $dest)) {
+	print STDERR "util::hard_link: unable to create hard link. ";
+	print STDERR " Attempting to copy file: $src -> $dest\n";
+	&File::Copy::copy ($src, $dest);
+    }
+}
+
+# make soft link to file if supported by OS, otherwise copy file
+sub soft_link {
+    my ($src, $dest) = @_;
+
+    # remove trailing slashes from source and destination files
+    $src =~ s/[\\\/]+$//;
+    $dest =~ s/[\\\/]+$//;
+
+    # a few sanity checks
+    if (!-e $src) {
+	print STDERR "util::soft_link source file $src does not exist\n";
+	return 0;
+    }
+
+    my $dest_dir = &File::Basename::dirname($dest);
+    mk_all_dir($dest_dir) if (!-e $dest_dir);
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	# symlink not supported on windows
+	&File::Copy::copy ($src, $dest);
+
+    } elsif (!eval {symlink($src, $dest)}) {
+	print STDERR "util::soft_link: unable to create soft link.\n";
+	return 0;
+    }
+
+    return 1;
+}
+
+
+
+
+# updates a copy of a directory in some other part of the filesystem
+# verbosity settings are: 0=low, 1=normal, 2=high
+# both $fromdir and $todir should be absolute paths
+sub cachedir {
+    my ($fromdir, $todir, $verbosity) = @_;
+    $verbosity = 1 unless defined $verbosity;
+
+    # use / for the directory separator, remove duplicate and
+    # trailing slashes
+    $fromdir=~s/[\\\/]+/\//g; 
+    $fromdir=~s/[\\\/]+$//;
+    $todir=~s/[\\\/]+/\//g; 
+    $todir=~s/[\\\/]+$//;
+
+    &mk_all_dir ($todir);
+
+    # get the directories in ascending order
+    if (!opendir (FROMDIR, $fromdir)) {
+	print STDERR "util::cachedir could not read directory $fromdir\n";
+	return;
+    }
+    my @fromdir = grep (!/^\.\.?$/, sort(readdir (FROMDIR)));
+    closedir (FROMDIR);
+
+    if (!opendir (TODIR, $todir)) {
+	print STDERR "util::cacedir could not read directory $todir\n";
+	return;
+    }
+    my @todir = grep (!/^\.\.?$/, sort(readdir (TODIR)));
+    closedir (TODIR);
+
+    my $fromi = 0;
+    my $toi = 0;
+		    
+    while ($fromi < scalar(@fromdir) || $toi < scalar(@todir)) {
+#	print "fromi: $fromi toi: $toi\n";
+
+	# see if we should delete a file/directory
+	# this should happen if the file/directory
+	# is not in the from list or if its a different
+	# size, or has an older timestamp
+	if ($toi < scalar(@todir)) {
+	    if (($fromi >= scalar(@fromdir)) ||
+		($todir[$toi] lt $fromdir[$fromi] || 
+		 ($todir[$toi] eq $fromdir[$fromi] && 
+		  &differentfiles("$fromdir/$fromdir[$fromi]","$todir/$todir[$toi]",
+				  $verbosity)))) {
+
+		# the files are different
+		&rm_r("$todir/$todir[$toi]");
+		splice(@todir, $toi, 1); # $toi stays the same
+
+	    } elsif ($todir[$toi] eq $fromdir[$fromi]) {
+		# the files are the same
+		# if it is a directory, check its contents
+		if (-d "$todir/$todir[$toi]") {
+		    &cachedir ("$fromdir/$fromdir[$fromi]",
+			       "$todir/$todir[$toi]", $verbosity);
+		}
+
+		$toi++;
+		$fromi++;
+		next;
+	    }
+	}
+  
+	# see if we should insert a file/directory
+	# we should insert a file/directory if there
+	# is no tofiles left or if the tofile does not exist
+	if ($fromi < scalar(@fromdir) && ($toi >= scalar(@todir) || 
+					  $todir[$toi] gt $fromdir[$fromi])) {
+	    &cp_r ("$fromdir/$fromdir[$fromi]", "$todir/$fromdir[$fromi]");
+	    splice (@todir, $toi, 0, $fromdir[$fromi]);
+
+	    $toi++;
+	    $fromi++;
+	}
+    }
+}
+
+# this function returns -1 if either file is not found
+# assumes that $file1 and $file2 are absolute file names or
+# in the current directory
+# $file2 is allowed to be newer than $file1
+sub differentfiles {
+    my ($file1, $file2, $verbosity) = @_;
+    $verbosity = 1 unless defined $verbosity;
+
+    $file1 =~ s/\/+$//;
+    $file2 =~ s/\/+$//;
+    
+    my ($file1name) = $file1 =~ /\/([^\/]*)$/;
+    my ($file2name) = $file2 =~ /\/([^\/]*)$/;
+
+    return -1 unless (-e $file1 && -e $file2);
+    if ($file1name ne $file2name) {
+	print STDERR "filenames are not the same\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    @file1stat = stat ($file1);
+    @file2stat = stat ($file2);
+
+    if (-d $file1) {
+	if (! -d $file2) {
+	    print STDERR "one file is a directory\n" if ($verbosity >= 2);
+	    return 1;
+	}
+	return 0;
+    }
+
+    # both must be regular files
+    unless (-f $file1 && -f $file2) {
+	print STDERR "one file is not a regular file\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    # the size of the files must be the same
+    if ($file1stat[7] != $file2stat[7]) {
+	print STDERR "different sized files\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    # the second file cannot be older than the first
+    if ($file1stat[9] > $file2stat[9]) {
+	print STDERR "file is older\n" if ($verbosity >= 2);
+	return 1;
+    }
+
+    return 0;
+}
+
+
+sub get_tmp_filename {
+    my $tmpdir = filename_cat($ENV{'GSDLHOME'}, "tmp");
+    &mk_all_dir ($tmpdir) unless -e $tmpdir;
+
+    my $count = 1000;
+    my $rand = int(rand $count);
+    while (-e &filename_cat($tmpdir, "F$rand")) {
+	$rand = int(rand $count);
+	$count++;
+    }
+
+    return filename_cat($tmpdir, "F$rand");
+}
+
+
+sub filename_cat {
+    my (@filenames) = @_;
+    my $filename = join("/", @filenames);
+
+    # remove duplicate slashes and remove the last slash
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename =~ s/[\\\/]+/\\/g;
+    } else {
+	$filename =~ s/[\/]+/\//g; 
+	# DB: want a filename abc\de.html to remain like this
+    }
+    $filename =~ s/[\\\/]$//;
+
+    return $filename;
+}
+
+# returns 1 if filename1 and filename2 point to the same
+# file or directory
+sub filenames_equal {
+    my ($filename1, $filename2) = @_;
+
+    # use filename_cat to clean up trailing slashes and 
+    # multiple slashes
+    $filename1 = filename_cat ($filename1);
+    $filename2 = filename_cat ($filename2);
+
+    # filenames not case sensitive on windows
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	$filename1 =~ tr/[A-Z]/[a-z]/;
+	$filename2 =~ tr/[A-Z]/[a-z]/;
+    }
+    return 1 if $filename1 eq $filename2;
+    return 0;
+}
+
+sub get_os_dirsep {
+
+    if ($ENV{'GSDLOS'} =~ /^windows$/i) {
+	return "\\\\";
+    } else {
+	return "\\\/";
+    }
+}
+
+sub get_re_dirsep {
+
+    return "\\\\|\\\/";
+}
+
+
+# if this is running on windows we want binaries to end in
+# .exe, otherwise they don't have to end in any extension
+sub get_os_exe {
+    return ".exe" if $ENV{'GSDLOS'} =~ /^windows$/i;
+    return "";
+}
+
+
+# test to see whether this is a big or little endian machine
+sub is_little_endian {
+    return (ord(substr(pack("s",1), 0, 1)) == 1);
+}
+
+
+# will return the collection name if successful, "" otherwise
+sub use_collection {
+    my ($collection, $collectdir) = @_;
+
+    if (!defined $collectdir || $collectdir eq "") {
+	$collectdir = &filename_cat ($ENV{'GSDLHOME'}, "collect");
+    }
+
+    # get and check the collection
+    if (!defined($collection) || $collection eq "") {
+	if (defined $ENV{'GSDLCOLLECTION'}) {
+	    $collection = $ENV{'GSDLCOLLECTION'};
+	} else {
+	    print STDOUT "No collection specified\n";
+	    return "";
+	}
+    }
+    
+    if ($collection eq "modelcol") {
+	print STDOUT "You can't use modelcol.\n";
+	return "";
+    }
+
+    # make sure the environment variables GSDLCOLLECTION and GSDLCOLLECTDIR
+    # are defined
+    $ENV{'GSDLCOLLECTION'} = $collection unless defined $ENV{'GSDLCOLLECTION'};
+    $ENV{'GSDLCOLLECTDIR'} = &filename_cat ($collectdir, $collection);
+
+    # make sure this collection exists
+    if (!-e $ENV{'GSDLCOLLECTDIR'}) {
+	print STDOUT "Invalid collection ($collection).\n";
+	return "";
+    }
+
+    # everything is ready to go
+    return $collection;
+}
+
+1;
Index: /main/tags/2.38/gsdl/perllib/webpageutil.pm
===================================================================
--- /main/tags/2.38/gsdl/perllib/webpageutil.pm	(revision 21083)
+++ /main/tags/2.38/gsdl/perllib/webpageutil.pm	(revision 21083)
@@ -0,0 +1,24 @@
+package webpageutil;
+
+use ghtml;
+
+sub error_location
+{
+    my ($args,$text) = @_;
+
+    &ghtml::urlsafe($text);
+    my $mess_url = "$args->{'httpbuild'}&bca=mess&head=_headerror_";
+    print "Location: $mess_url&mess=$text\n\n";
+}
+
+sub status_location
+{
+    my ($args,$text,$tmpname,$bc1finished) = @_;
+
+    &ghtml::urlsafe($text);    
+    my $mess_url = "$args->{'httpbuild'}&bca=buildstatus";
+    $mess_url .= "&bc1tmpfilename=$tmpname&bc1finished=$bc1finished";
+    print "Location: $mess_url&mess=$text\n\n";
+}
+
+1;
Index: /main/tags/2.38/gsdl/setup.bash
===================================================================
--- /main/tags/2.38/gsdl/setup.bash	(revision 21083)
+++ /main/tags/2.38/gsdl/setup.bash	(revision 21083)
@@ -0,0 +1,43 @@
+# if this file is executed, /bin/sh is used, as we don't start with #!
+# this should work under ash, bash, zsh, ksh, sh style shells.
+
+# make sure we are sourced, and not run
+
+if test "$0" != "`echo $0 | sed s/setup\.bash//`" ; then
+# if $0 contains "setup.bash" we've been run... $0 is shellname if sourced.
+# One exception is zsh has an option to set it temporarily to the script name
+  if test -z "$ZSH_NAME" ; then
+  # we aren't using zsh
+  gsdl_not_sourced=true
+  fi
+fi
+
+if test -n "$gsdl_not_sourced" ; then
+  echo "	Error: Make sure you source this script, not execute it. Eg:"
+  echo "		$ source setup.bash"
+  echo "	or"
+  echo "		$ . ./setup.bash"
+  echo "	not"
+  echo "		$ ./setup.bash"
+elif test -n "$GSDLHOME" ; then
+  echo "Your environment is already set up for Greenstone!"
+elif test ! -f setup.bash ; then
+  echo "You must source the script from within the Greenstone home directory"
+else
+  GSDLHOME=`pwd`
+  export GSDLHOME
+  GSDLOS=`uname -s | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+  # check for running bash under cygwin
+  if test "`echo $GSDLOS | sed 's/cygwin//'`" != "$GSDLOS" ;
+  then
+    GSDLOS=windows
+  fi
+  export GSDLOS
+
+  PATH=$PATH:$GSDLHOME/bin/script:$GSDLHOME/bin/$GSDLOS
+  export PATH
+  MANPATH=$MANPATH:$GSDLHOME/packages/mg/man
+  export MANPATH
+  echo "Your environment has successfully been set up to run Greenstone"
+fi
+unset gsdl_not_sourced
Index: /main/tags/2.38/gsdl/setup.csh
===================================================================
--- /main/tags/2.38/gsdl/setup.csh	(revision 21083)
+++ /main/tags/2.38/gsdl/setup.csh	(revision 21083)
@@ -0,0 +1,5 @@
+setenv GSDLHOME `pwd`
+setenv GSDLOS `uname -s | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+setenv PATH $PATH\:$GSDLHOME/bin/script\:$GSDLHOME/bin/$GSDLOS
+setenv MANPATH $MANPATH\:$GSDLHOME/packages/mg/man
+echo "Your environment has successfully been set up to run Greenstone"
Index: /main/tags/2.38/gsdl/src/checkis/checkis.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/checkis/checkis.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/checkis/checkis.cpp	(revision 21083)
@@ -0,0 +1,68 @@
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+
+int __stdcall WinMain(HINSTANCE Instance, HINSTANCE /*PrevInstance*/, LPSTR CmdLineStr, int /*CmdShow*/) {
+  HKEY hk1, hk2, hk3, hk4, hk5, lk;
+  char command[2048];
+  command[0] = '\0';
+  
+  // try to find the command to start the library
+  if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE", &hk1) == ERROR_SUCCESS) {
+    if (RegOpenKey(hk1, "Waikato University", &hk2) == ERROR_SUCCESS) {
+      if (RegOpenKey(hk2, "sjnew", &hk3) == ERROR_SUCCESS) {
+	if (RegOpenKey(hk3, "1", &hk4) == ERROR_SUCCESS) {
+	  if (RegOpenKey(hk4, "2.26.000", &hk5) == ERROR_SUCCESS) {
+
+	    if (RegOpenKey(hk3, "2.26.000", &lk) == ERROR_SUCCESS) {
+	    
+	      // look for the command to start the browser
+	      DWORD dwIndex = 0;
+	      char key[256];
+	      key[0] = '\0';
+	      DWORD keysize = 256;
+	      DWORD type;
+	      DWORD comsize = 2048;
+	      while (RegEnumValue(lk, dwIndex, key, &keysize, NULL, &type, 
+				  (unsigned char *)command, &comsize) == ERROR_SUCCESS) {
+		// see if this is the right key (yes, this should always be library, NOT
+		// the name of the executable
+		if (strcmp (key, "library") == 0) break;
+		else command[0] = '\0';
+	      
+		// prepare for next iteration
+		dwIndex++;
+		keysize = 256;
+		comsize = 2048;
+	      }
+	      RegCloseKey(lk);
+	    }
+	    RegCloseKey(hk5);
+	  }	   
+ 	  RegCloseKey(hk4);
+	}
+	RegCloseKey(hk3);
+      }
+      RegCloseKey(hk2);
+    }
+    RegCloseKey(hk1);
+  }
+  
+  if (strlen (command) == 0) { 
+    // not installed, try to run the setup program
+    WinExec ("setup.exe", SW_SHOW);
+  } else { 
+    // installed ask the user whether they want to run the library now
+    if (MessageBox (NULL, 
+		    "Would you like to view the School Journal Collection?",
+		    "Greenstone Digital Library",
+		    MB_YESNO) == IDYES) {
+      WinExec (command, SW_SHOW);
+    }
+  }
+  
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/checkis/checkis_cd.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/checkis/checkis_cd.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/checkis/checkis_cd.cpp	(revision 21083)
@@ -0,0 +1,32 @@
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+
+int __stdcall WinMain(HINSTANCE Instance, HINSTANCE /*PrevInstance*/, LPSTR CmdLineStr, int /*CmdShow*/) {
+  HKEY hk1, hk2, hk3, hk4;
+  BOOL found = FALSE;
+  
+  // try to find the command to start the library
+  if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE", &hk1) == ERROR_SUCCESS) {
+    if (RegOpenKey(hk1, "New Zealand Digital Library Project", &hk2) == ERROR_SUCCESS) {
+      if (RegOpenKey(hk2, "Greenstone Digital Library Software", &hk3) == ERROR_SUCCESS) {
+	if (RegOpenKey(hk3, "2.37.000", &hk4) == ERROR_SUCCESS) {
+	  found = TRUE;
+ 	  RegCloseKey(hk4);
+	}
+	RegCloseKey(hk3);
+      }
+      RegCloseKey(hk2);
+    }
+    RegCloseKey(hk1);
+  }
+  
+  if (!found) { 
+    // not installed, try to run the setup program
+    WinExec ("setup.exe", SW_SHOW);
+  }
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/colservr/GCC.mak
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/GCC.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/GCC.mak	(revision 21083)
@@ -0,0 +1,73 @@
+###########################################################################
+#
+# gcc win32 makefile -- src/colservr
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+
+AR = ar
+RANLIB = ranlib
+CC = g++
+DELETE = del
+
+o = .o
+/ = \\
+
+CPPFLAGS = -g -Wall
+DEFS = -D__WIN32__ -DGSDL_USE_IOS_H -DHAVE_CONFIG_H
+
+INCLUDES = -I"..$/..$/lib" -I"..$/recpt" -I"..$/..$/packages$/mg" \
+	   -I"..$/..$/packages$/mg$/lib" -I"..$/..$/packages$/mg$/src$/text" \
+           -I"..$/..$/packages$/wingdbm"
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c $o
+.c$o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp $o
+.cpp$o:
+	$(COMPILE) $< 
+
+HEADERS = mgq.h mgsearch.h querycache.h queryinfo.h collectserver.h \
+          colservrconfig.h maptools.h filter.h source.h browsefilter.h \
+          queryfilter.h mggdbmsource.h phrasesearch.h phrasequeryfilter.h
+
+SOURCES = mgq.c mgsearch.cpp querycache.cpp queryinfo.cpp collectserver.cpp \
+          colservrconfig.cpp maptools.cpp filter.cpp source.cpp \
+          browsefilter.cpp queryfilter.cpp mggdbmsource.cpp phrasesearch.cpp \
+          phrasequeryfilter.cpp
+
+OBJECTS = mgq$o mgsearch$o querycache$o queryinfo$o collectserver$o \
+          colservrconfig$o maptools$o filter$o source$o browsefilter$o \
+          queryfilter$o mggdbmsource$o phrasesearch$o phrasequeryfilter$o
+
+all : $(OBJECTS)
+
+clean:
+	$(DELETE) *$o
+
+install:
Index: /main/tags/2.38/gsdl/src/colservr/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/Makefile.in	(revision 21083)
@@ -0,0 +1,164 @@
+###########################################################################
+#
+# Makefile -- src/colservr
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+
+AR = ar
+CC = @CC@
+CXX = @CXX@
+CFLAGS = @CFLAGS@
+CXXFLAGS = @CXXFLAGS@
+MCFLAGS = @CFLAGS@ -Wall -Wunused
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM -DGSDLSERVER @DEFS@
+
+USE_FASTCGI = @USE_FASTCGI@
+USE_MGPP = @USE_MGPP@
+ifneq ($(USE_FASTCGI), 1)
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM @DEFS@
+
+CGI_INCLUDES = 
+else
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM -DUSE_FASTCGI @DEFS@
+
+CGI_INCLUDES = -I../../packages/fcgi/include 
+endif
+
+ifneq ($(USE_MGPP), 1)
+MG_INCLUDES = -I../../packages/mg  -I../../packages/mg/lib \
+		-I../../packages/mg/src/text
+MG_HEADERS = mgq.h mgsearch.h mgqueryfilter.h 
+
+MG_SOURCES = mgq.c mgsearch.cpp mgqueryfilter.cpp 
+
+MG_OBJECTS = mgq.o mgsearch.o mgqueryfilter.o 
+MGPP_OBJECTS = mgppsearch.o mgppqueryfilter.o
+
+else
+MG_INCLUDES = -I../mgpp/text -I../mgpp/lib 
+
+MG_HEADERS = mgppsearch.h mgppqueryfilter.h
+
+MG_SOURCES = mgppsearch.cpp mgppqueryfilter.cpp
+
+MG_OBJECTS = mgppsearch.o mgppqueryfilter.o
+
+endif
+
+INCLUDES = -I. -I../.. -I../../lib -I../recpt \
+		$(CGI_INCLUDES) $(MG_INCLUDES) @GDBM_INCLUDE@
+MICO_DIR = @MICO_DIR@
+ifeq ($(MICO_DIR), default)
+MICO_INC = -I../../packages/mico/include
+MICO_PATH = ../../bin/linux/
+else
+ifeq ($(MICO_DIR), yes)
+MICO_INC =
+MICO_PATH =
+else
+MICO_INC = -I$(MICO_DIR)
+MICO_PATH =
+endif
+endif
+MINCLUDES = -I. -I../../lib -I../recpt  -I../mgpp/text $(MICO_INC)
+
+USE_CORBA = @USE_CORBA@
+
+RANLIB = @RANLIB@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@
+
+GSDLOS = @gsdlos@
+
+
+COMPILE = $(CC) -c $(CFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CXX) $(LDFLAGS) -o $@
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+MCOMPILE = $(MICO_PATH)mico-c++ -x c++ $(MCFLAGS) $(DEFS) $(MINCLUDES) -c
+MLINK = $(MICO_PATH)mico-ld $(LDFLAGS) -lmico2.2.7 -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+.SUFFIXES: .mpp .o
+.mpp.o:
+	$(MCOMPILE) $<
+
+ifneq ($(USE_CORBA), 0)
+CORBAHEADERS = \
+  corbaServer.h
+CORBASOURCES = \
+  corbaServer.mpp
+CORBAOBJECTS = \
+  corbaServer.o ../../lib/corbaiface_skel.o
+else
+CORBAHEADERS = 
+CORBASOURCES = 
+CORBAOBJECTS = 
+endif
+
+# following objects need both mg and mgpp stuff - jrm21
+MG_MGPP_OBJECTS=collectset.o
+
+HEADERS = search.h querycache.h queryinfo.h collectserver.h collectset.h \
+          colservrconfig.h maptools.h filter.h source.h browsefilter.h \
+          queryfilter.h mggdbmsource.h phrasesearch.h phrasequeryfilter.h \
+	  $(MG_HEADERS) $(CORBAHEADERS)
+
+SOURCES = search.cpp querycache.cpp queryinfo.cpp collectserver.cpp \
+          colservrconfig.cpp maptools.cpp filter.cpp source.cpp \
+          browsefilter.cpp queryfilter.cpp mggdbmsource.cpp phrasesearch.cpp \
+          phrasequeryfilter.cpp collectset.cpp \
+	  $(MG_SOURCES) $(CORBASOURCES)
+
+OBJECTS = search.o querycache.o queryinfo.o collectserver.o \
+          colservrconfig.o maptools.o filter.o source.o browsefilter.o \
+          queryfilter.o mggdbmsource.o phrasesearch.o phrasequeryfilter.o \
+	  $(MG_MGPP_OBJECTS) $(MG_OBJECTS) $(CORBAOBJECTS)
+
+all : $(OBJECTS)
+	$(MAKE) USE_MGPP=1 $(MGPP_OBJECTS)
+
+distclean:
+	rm -f $(OBJECTS) Makefile mgppsearch.o mgppqueryfilter.o
+clean:
+	rm -f $(OBJECTS) mgppsearch.o mgppqueryfilter.o
+
+install:
+
+# needs IndexData.h from mgpp...
+$(MG_MGPP_OBJECTS): %.o : %.cpp
+	$(CXXCOMPILE) -I../mgpp/text -I../mgpp/lib -o $@ $<
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
Index: /main/tags/2.38/gsdl/src/colservr/browsefilter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/browsefilter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/browsefilter.cpp	(revision 21083)
@@ -0,0 +1,298 @@
+/**********************************************************************
+ *
+ * browsefilter.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "browsefilter.h"
+#include "fileutil.h"
+#include "gsdltools.h"
+
+
+browsefilterclass::browsefilterclass () {
+  gdbmptr = NULL;
+
+  // -- onePerQuery StartResults   integer
+  FilterOption_t filtopt;
+  filtopt.name = "StartResults";
+  filtopt.type = FilterOption_t::integert;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "1";
+  filtopt.validValues.push_back("1");
+  filtopt.validValues.push_back("10000");
+  filterOptions["StartResults"] = filtopt;
+
+  // -- onePerQuery EndResults     integer
+  filtopt.clear();
+  filtopt.name = "EndResults";
+  filtopt.type = FilterOption_t::integert;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "-1";
+  filtopt.validValues.push_back("-1");
+  filtopt.validValues.push_back("10000");
+  filterOptions["EndResults"] = filtopt;
+
+  // -- onePerQuery ParentNode     string ("" will return the browsing available)
+  filtopt.clear();
+  filtopt.name = "ParentNode";
+  filtopt.type = FilterOption_t::stringt;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "";
+  filterOptions["ParentNode"] = filtopt;
+}
+
+browsefilterclass::~browsefilterclass () {
+}
+
+bool browsefilterclass::init (ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  if (!filterclass::init(logout)) return false;
+
+  // get the filename for the database and make sure it exists
+  gdbm_filename = filename_cat(gdbmhome, "collect", collection, "index", "text", collection);
+
+  if (littleEndian()) gdbm_filename += ".ldb";
+  else gdbm_filename += ".bdb";
+
+  if (!file_exists(gdbm_filename)) {
+    logout << text_t2ascii
+	   << "warning: gdbm database \"" //****
+	   << gdbm_filename << "\" does not exist\n\n";
+    //    return false; //****
+  }
+
+  return true;
+}
+
+void browsefilterclass::filter (const FilterRequest_t &request,
+				FilterResponse_t &response,
+				comerror_t &err, ostream &logout) {
+  int numDocs = 0;
+  outconvertclass text_t2ascii;
+
+  response.clear ();
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: browsefilter contains a null gdbmclass\n\n";
+    err = configurationError;
+    return;
+  }
+
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return;
+  }
+
+  // get the browse parameters
+  int startresults = filterOptions["StartResults"].defaultValue.getint();
+  int endresults = filterOptions["EndResults"].defaultValue.getint();
+  text_t parentnode = filterOptions["ParentNode"].defaultValue;
+  OptionValue_tarray::const_iterator options_here = request.filterOptions.begin();
+  OptionValue_tarray::const_iterator options_end = request.filterOptions.end();
+  while (options_here != options_end) {
+    if ((*options_here).name == "StartResults") 
+      startresults = (*options_here).value.getint();
+    else if ((*options_here).name == "EndResults")
+      endresults = (*options_here).value.getint();
+    else if ((*options_here).name == "ParentNode")
+      parentnode = (*options_here).value;
+    else {
+      logout << text_t2ascii
+	     << "warning: unknown browsefilter option \""
+	     << (*options_here).name
+	     << "\" ignored.\n\n";
+    }
+
+    options_here++;
+  }
+
+  infodbclass info;
+
+  // translate any ".fc", ".pr" etc. stuff in the parentnode
+  parentnode = gdbmptr->translate_OID (parentnode, info);
+
+  // adjust topmost browsing node
+  if (parentnode.empty()) parentnode = "browse";
+
+  // get the node
+  if ((request.filterResultOptions & FROID) ||
+      (request.filterResultOptions & FRmetadata)) {
+    if (!gdbmptr->getinfo(parentnode, info)) {
+      // didn't find the node
+      logout << text_t2ascii
+	     << "warning: lookup for node \"" << parentnode 
+	     << "\" failed for browsefilter.\n\n";
+    } else {
+      // found the node
+
+      // replace " with the parent node name and split the contains string
+      // into the result set
+      text_tarray resultset;
+      text_t tmptext;
+      text_t &contains = info["contains"];
+      text_t::iterator contains_here = contains.begin();
+      text_t::iterator contains_end = contains.end();
+      while (contains_here != contains_end) {
+	if (*contains_here == '"') tmptext += parentnode;
+	else if (*contains_here == ';') {
+	  if (!tmptext.empty()) resultset.push_back (tmptext);
+	  tmptext.clear();
+	} else tmptext.push_back(*contains_here);
+	
+	contains_here++;
+      }
+      // insert the last result in the set
+      if (!tmptext.empty()) resultset.push_back (tmptext);
+
+      text_tarray offset_resultset;
+      text_t &md_type = info["mdtype"];
+      if (!md_type.empty())
+	{
+	  text_t &md_offset = info["mdoffset"];
+	  if (!md_offset.empty())
+	    {
+	      text_t offsettext;
+
+	      text_t::iterator offset_here = md_offset.begin();
+	      text_t::iterator offset_end = md_offset.end();
+	      while (offset_here != offset_end) 
+		{
+		  if (*offset_here == ';')
+		    {
+		      if (offsettext.empty())
+			{
+			  offset_resultset.push_back ("0");
+			}
+		      else
+			{
+			  offset_resultset.push_back (offsettext);
+			}
+		      offsettext.clear();
+		    } 
+		  else 
+		    {
+		      offsettext.push_back(*offset_here);
+		    }
+		  
+		  offset_here++;
+		}
+	      // insert the last result in the set
+	      if (offsettext.empty())
+		{
+		  offset_resultset.push_back ("0");
+		}
+	      else
+		{
+		  offset_resultset.push_back (offsettext);
+		}
+	    }
+	  else
+	    {
+	      // add 0 offset for each 'contains' entry
+	      text_tarray::iterator result_here = resultset.begin();
+	      text_tarray::iterator result_end = resultset.end();
+	      while (result_here != result_end) {
+		offset_resultset.push_back("0");
+		result_here++;
+	      }
+	    }
+
+	  // do an intersection with the input set
+	  if (!request.docSet.empty()) {
+
+	    text_tarray intersect_resultset;
+	    text_tarray intersect_offset_resultset;
+	    
+	    text_tarray::const_iterator resultset_here = resultset.begin();
+	    text_tarray::const_iterator resultset_end = resultset.end();
+	    text_tarray::const_iterator offset_resultset_here = offset_resultset.begin();
+	    
+	    while (resultset_here != resultset_end) {
+	      if (in_set (request.docSet, *resultset_here))
+		{
+		  intersect_resultset.push_back (*resultset_here);
+		  intersect_offset_resultset.push_back (*offset_resultset_here);
+		}
+	      resultset_here ++;
+	      offset_resultset_here ++;
+	    }
+	    resultset = intersect_resultset;
+	    offset_resultset = intersect_offset_resultset;
+	  }
+	}
+      else
+	{
+	  // do an intersection with the input set
+	  if (!request.docSet.empty()) {
+	    intersect (resultset, request.docSet);
+	  }
+
+	  // add 0 offset for each 'contains' entry
+	  text_tarray::iterator result_here = resultset.begin();
+	  text_tarray::iterator result_end = resultset.end();
+	  while (result_here != result_end) {
+	    offset_resultset.push_back("0");
+	    result_here++;
+	  }
+	}
+
+      // create the response
+      numDocs = resultset.size();
+      int resultnum = 1;
+      ResultDocInfo_t resultdoc;
+      text_tarray::iterator result_here = resultset.begin();
+      text_tarray::iterator result_end = resultset.end();
+      text_tarray::iterator offset_result_here = offset_resultset.begin();
+
+      while (result_here != result_end) {
+	// if endresults is -1 get all results
+	if ((endresults != -1) && (resultnum > endresults)) break;
+	if (resultnum >= startresults) {
+	  resultdoc.OID = (*result_here);
+	  if (!md_type.empty())
+	    {
+	      resultdoc.classifier_metadata_type = md_type;
+	      resultdoc.classifier_metadata_offset = offset_result_here->getint();
+	    }
+	  response.docInfo.push_back(resultdoc);
+	}
+
+	resultnum++;
+	result_here++;
+	if (!md_type.empty()) offset_result_here++;
+      }
+    }
+  }
+
+  response.numDocs = numDocs;
+  response.isApprox = Exact;
+}
Index: /main/tags/2.38/gsdl/src/colservr/browsefilter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/browsefilter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/browsefilter.h	(revision 21083)
@@ -0,0 +1,59 @@
+/**********************************************************************
+ *
+ * browsefilter.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef BROWSEFILTER_H
+#define BROWSEFILTER_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+#include "filter.h"
+#include "infodbclass.h"
+
+
+class browsefilterclass : public filterclass {
+protected:
+  text_t gdbm_filename;
+  gdbmclass *gdbmptr;
+
+public:
+  browsefilterclass ();
+  virtual ~browsefilterclass ();
+
+  // the gdbmptr remains the responsability of the calling code and
+  // should be destroyed after this browsefilter is destroyed
+  void set_gdbmptr (gdbmclass *thegdbmptr) {gdbmptr = thegdbmptr;}
+
+  bool init (ostream &logout);
+  text_t get_filter_name () {return "BrowseFilter";}
+  void filter (const FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/collectserver.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/collectserver.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/collectserver.cpp	(revision 21083)
@@ -0,0 +1,343 @@
+
+/**********************************************************************
+ *
+ * collectserver.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "collectserver.h"
+#include "infodbclass.h"
+#include "OIDtools.h"
+#include <assert.h>
+
+
+collectserver::collectserver () {
+  configinfo.collection = "null";
+}
+
+collectserver::~collectserver () {
+
+  // clean up the sources
+  sourcelistclass::iterator source_here = sources.begin();
+  sourcelistclass::iterator source_end = sources.end();
+  while (source_here != source_end) {
+    if ((*source_here).s != NULL)
+      delete (*source_here).s;
+    source_here++;
+  }
+  sources.clear();
+
+  // clean up the filters
+  filtermapclass::iterator filter_here = filters.begin();
+  filtermapclass::iterator filter_end = filters.end();
+  while (filter_here != filter_end) {
+    if ((*filter_here).second.f != NULL) 
+      delete (*filter_here).second.f;
+    filter_here++;
+  }
+  filters.clear();
+}
+
+// configure should be called for each line in the
+// configuration files to configure the collection server and everything
+// it contains. The configuration should take place just before initialisation.
+void collectserver::configure (const text_t &key, const text_tarray &cfgline) {
+  if (cfgline.size() >= 1) {
+    const text_t &value = cfgline[0];
+    if (key == "gsdlhome") configinfo.gsdlhome = value;
+    else if (key == "gdbmhome") configinfo.gdbmhome = value;
+    else if (key == "collection") {
+      configinfo.collection = value;
+      collectinfo.shortInfo.name = value;
+    } else if (key == "collectdir") configinfo.collectdir = value;
+    else if (key == "host") collectinfo.shortInfo.host = value;
+    else if (key == "port") collectinfo.shortInfo.port = value.getint();
+    else if (key == "public") {
+      if (value == "true") collectinfo.isPublic = true;
+      else collectinfo.isPublic = false;
+    } else if (key == "beta") {
+      if (value == "true") collectinfo.isBeta = true;
+      else collectinfo.isBeta = false;
+    } else if ((key == "ccscols") || (key == "supercollection")) collectinfo.ccsCols = cfgline;
+    else if (key == "builddate") collectinfo.buildDate = value.getint();
+    else if (key == "languages") collectinfo.languages = cfgline;
+    else if (key == "numdocs") collectinfo.numDocs = value.getint();
+    else if (key == "numsections") collectinfo.numSections = value.getint();
+    else if (key == "numwords") collectinfo.numWords = value.getint();
+    else if (key == "numbytes") collectinfo.numBytes = value.getint();
+    else if (key == "collectionmeta" && cfgline.size() == 2)
+      collectinfo.collectionmeta[cfgline[0]] = cfgline[1];
+    else if (key == "format" && cfgline.size() == 2)
+      collectinfo.format[cfgline[0]] = cfgline[1];
+    else if (key == "building" && cfgline.size() == 2)
+      collectinfo.building[cfgline[0]] = cfgline[1];
+    else if (key == "httpdomain") collectinfo.httpdomain = value;
+    else if (key == "httpprefix") collectinfo.httpprefix = value;
+    else if (key == "receptionist") collectinfo.receptionist = value;
+    else if (key == "buildtype") collectinfo.buildType = value;
+  }
+
+  // configure the filters
+  filtermapclass::iterator filter_here = filters.begin();
+  filtermapclass::iterator filter_end = filters.end();
+  while (filter_here != filter_end) {
+    assert ((*filter_here).second.f != NULL);
+    if ((*filter_here).second.f != NULL) 
+      (*filter_here).second.f->configure(key, cfgline);
+
+    filter_here++;
+  }
+
+  // configure the sources
+  sourcelistclass::iterator source_here = sources.begin();
+  sourcelistclass::iterator source_end = sources.end();
+  while (source_here != source_end) {
+    assert ((*source_here).s != NULL);
+    if ((*source_here).s != NULL)
+      (*source_here).s->configure(key, cfgline);
+    
+    source_here++;
+  }
+}
+
+void collectserver::configure (const text_t &key, const text_t &value) {
+  text_tarray cfgline;
+  cfgline.push_back (value);
+  configure(key, cfgline);
+}
+
+void collectserver::ping (bool &wasSuccess, comerror_t &error, ostream &logout) {
+  // if we've not been properly configured, then it is a foregone
+  // conclusion that we cannot be active
+  if (this->configinfo.collection == "null")
+    {
+      wasSuccess = false;
+    }
+  // if no build date exists, then the collection was probably not built;
+  // ditto if the number of documents is zero, then something is pretty
+  // wrong
+  else if (this->collectinfo.buildDate == 0 ||
+      this->collectinfo.numDocs == 0)
+    {
+      wasSuccess =  false;
+    }
+  // it is probably okay
+  else
+    wasSuccess = true;
+}
+
+
+bool collectserver::init (ostream &logout) {
+  // init the filters
+  filtermapclass::iterator filter_here = filters.begin();
+  filtermapclass::iterator filter_end = filters.end();
+  while (filter_here != filter_end) {
+    assert ((*filter_here).second.f != NULL);
+    if (((*filter_here).second.f != NULL) &&
+	!(*filter_here).second.f->init(logout)) return false;
+    
+    filter_here++;
+  }
+
+  // init the sources
+  sourcelistclass::iterator source_here = sources.begin();
+  sourcelistclass::iterator source_end = sources.end();
+  while (source_here != source_end) {
+    assert ((*source_here).s != NULL);
+    if (((*source_here).s != NULL) &&
+	!(*source_here).s->init(logout)) return false;
+    
+    source_here++;
+  }
+
+  return true;
+}
+
+
+void collectserver::get_collectinfo (ColInfoResponse_t &reponse,
+		      comerror_t &err, ostream &/*logout*/) {
+  reponse = collectinfo; 
+  err = noError;
+}
+
+void collectserver::get_filterinfo (InfoFiltersResponse_t &response,
+				    comerror_t &err, ostream &/*logout*/) {
+  response.clear ();
+
+  // get a list of filter names
+  filtermapclass::iterator filter_here = filters.begin();
+  filtermapclass::iterator filter_end = filters.end();
+  while (filter_here != filter_end) {
+    response.filterNames.insert ((*filter_here).first);
+    filter_here++;
+  }
+
+  err = noError;
+}
+
+void collectserver::get_filteroptions (const InfoFilterOptionsRequest_t &request,
+				       InfoFilterOptionsResponse_t &response, 
+				       comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  filterclass *thisfilter = filters.getfilter(request.filterName);
+  if (thisfilter != NULL) {
+    thisfilter->get_filteroptions (response, err, logout);
+  } else {
+    response.clear ();
+    err = protocolError;
+    logout << text_t2ascii << "Protocol Error: filter options requested for non-existent\n"
+	   << "filter \"" << request.filterName << "\".\n\n";
+  }
+}
+
+void collectserver::filter (FilterRequest_t &request,
+			    FilterResponse_t &response,
+			    comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  // translate any ".fc", ".pr" etc. stuff in the docSet
+  text_t translatedOID;
+  text_tarray translatedOIDs;
+  text_tarray::iterator doc_here = request.docSet.begin();
+  text_tarray::iterator doc_end = request.docSet.end();
+  while (doc_here != doc_end) {
+    if (needs_translating (*doc_here)) {
+      sourcelistclass::iterator source_here = sources.begin();
+      sourcelistclass::iterator source_end = sources.end();
+      while (source_here != source_end) {
+	assert ((*source_here).s != NULL);
+	if (((*source_here).s != NULL) &&
+	    ((*source_here).s->translate_OID (*doc_here, translatedOID, err, logout))) {
+	  if (err != noError) return;
+	  break;
+	}
+	source_here++;
+      }
+      translatedOIDs.push_back (translatedOID);
+    } else {
+      translatedOIDs.push_back (*doc_here);
+    }
+    doc_here ++;
+  }
+  request.docSet = translatedOIDs;
+
+  response.clear();
+
+  filterclass *thisfilter = filters.getfilter(request.filterName);
+  if (thisfilter != NULL) {
+    // filter the data
+    thisfilter->filter (request, response, err, logout);
+
+    // fill in the metadata for each of the OIDs (if it is requested)
+    if (request.filterResultOptions & FRmetadata) {
+      bool processed = false;
+      ResultDocInfo_tarray::iterator resultdoc_here = response.docInfo.begin();
+      ResultDocInfo_tarray::iterator resultdoc_end = response.docInfo.end();
+      while (resultdoc_here != resultdoc_end) {
+	// try each of the sources in turn
+	sourcelistclass::iterator source_here = sources.begin();
+	sourcelistclass::iterator source_end = sources.end();
+	while (source_here != source_end) {
+	  assert ((*source_here).s != NULL);
+	  if (((*source_here).s != NULL) &&
+	      ((*source_here).s->get_metadata(request.requestParams, request.refParams,
+					      request.getParents, request.fields, 
+					      (*resultdoc_here).OID, (*resultdoc_here).metadata, 
+					      err, logout))) {
+	    if (err != noError) return;
+	    processed = true;
+	    break;
+	  }
+	  source_here++;
+	}
+	if (!processed) {
+	  err = protocolError;
+	  return;
+	}
+	resultdoc_here++;
+      }
+    }
+    
+  } else {
+    response.clear ();
+    err = protocolError;
+    logout << text_t2ascii << "Protocol Error: filter options requested for non-existent\n"
+	   << "filter \"" << request.filterName << "\".\n\n";
+  }
+  
+  err = noError;
+}
+
+void collectserver::get_document (const DocumentRequest_t &request,
+				  DocumentResponse_t &response,
+				  comerror_t &err, ostream &logout) {
+
+  sourcelistclass::iterator source_here = sources.begin();
+  sourcelistclass::iterator source_end = sources.end();
+  while (source_here != source_end) {
+    assert ((*source_here).s != NULL);
+    if (((*source_here).s != NULL) &&
+	((*source_here).s->get_document (request.OID, response.doc, err, logout))) {
+      if (err != noError) return;
+      break;
+    }
+    source_here++;
+  }
+}
+
+
+bool operator==(const collectserverptr &x, const collectserverptr &y) {
+  return (x.c == y.c);
+}
+
+bool operator<(const collectserverptr &x, const collectserverptr &y) {
+  return (x.c < y.c);
+}
+
+
+// thecollectserver remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void collectservermapclass::addcollectserver (collectserver *thecollectserver) {
+  // can't add a null collection server
+  assert (thecollectserver != NULL);
+  if (thecollectserver == NULL) return;
+  
+  // can't add an collection server with no collection name
+  assert (!(thecollectserver->get_collection_name()).empty());
+  if ((thecollectserver->get_collection_name()).empty()) return;
+
+  collectserverptr cptr;
+  cptr.c = thecollectserver;
+  collectserverptrs[thecollectserver->get_collection_name()] = cptr;
+}
+
+// getcollectserver will return NULL if the collectserver could not be found
+collectserver *collectservermapclass::getcollectserver (const text_t &collection) {
+  // can't find a collection with no name
+  if (collection.empty()) return NULL;
+
+  iterator here = collectserverptrs.find (collection);
+  if (here == collectserverptrs.end()) return NULL;
+  
+  return (*here).second.c;
+}
Index: /main/tags/2.38/gsdl/src/colservr/collectserver.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/collectserver.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/collectserver.h	(revision 21083)
@@ -0,0 +1,191 @@
+/**********************************************************************
+ *
+ * collectserver.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef COLLECTSERVER_H
+#define COLLECTSERVER_H
+
+// Library header files
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+#include "filter.h"
+#include "source.h"
+#include "cfgread.h"
+#include "cnfgable.h" 
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+
+struct colservrconf {
+  text_t gsdlhome;
+  text_t gdbmhome;
+  text_t collection;
+  text_t collectdir;
+};
+
+
+class collectserver : public configurable {
+protected:
+  colservrconf configinfo;
+  ColInfoResponse_t collectinfo;
+
+  filtermapclass filters;
+  sourcelistclass sources;
+
+public:
+  collectserver ();
+  virtual ~collectserver ();
+
+  // add_filter makes another filter available to the collection server
+  // the filter remains the property of the calling code and that
+  // code should destroy the filter after the collection server has been
+  // destroyed.
+  void add_filter (filterclass *thefilter) {filters.addfilter(thefilter);}
+  filtermapclass *get_filtermap_ptr () {return &filters;}
+
+  // add_source makes another source available to the collection server
+  // the source remains the property of the calling code and that
+  // code should destroy the source after the collection server has been
+  // destroyed.
+  void add_source (sourceclass *thesource) {sources.addsource(thesource);}
+  sourcelistclass *get_sourcelist_ptr () {return &sources;}
+
+  // configure should be called for each line in the
+  // configuration files to configure the collection server and everything
+  // it contains. The configuration should take place just before initialisation.
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+  void configure (const text_t &key, const text_t &value);
+  const colservrconf &get_configinfo () {return configinfo;}
+  text_t get_collection_name () {return configinfo.collection;}
+
+  // ping indicates whether the collection has appropriate data structures
+  // to be active or not
+  void ping(bool &wasSuccess, comerror_t &err, ostream &logout);
+
+  // init should be called after the collection name has been set and
+  // all initialisation is done. init returns true if the initialisation
+  // was successful, if false is returned then no other functions
+  // should be called (without producing meaningless output).
+  virtual bool init (ostream &logout);
+
+  void get_collectinfo (ColInfoResponse_t &reponse,
+			comerror_t &err, ostream &logout);
+
+  virtual void get_filterinfo (InfoFiltersResponse_t &response,
+			       comerror_t &err, ostream &logout);
+
+  virtual void get_filteroptions (const InfoFilterOptionsRequest_t &request,
+				  InfoFilterOptionsResponse_t &response, 
+				  comerror_t &err, ostream &logout);
+
+  virtual void filter (FilterRequest_t &request,
+		       FilterResponse_t &response,
+		       comerror_t &err, ostream &logout);
+
+
+  virtual void get_document (const DocumentRequest_t &request,
+			     DocumentResponse_t &response,
+			     comerror_t &err, ostream &logout);
+
+};
+
+
+// The collectserverptr function does not 'own' the collectserver. The
+// collectserver should be deleted by the code which created it.
+class collectserverptr {
+public:
+  collectserver *c;
+
+  collectserverptr () {c=NULL;}
+  ~collectserverptr () {}
+};
+
+bool operator==(const collectserverptr &x, const collectserverptr &y);
+bool operator<(const collectserverptr &x, const collectserverptr &y);
+
+typedef map<text_t, collectserverptr, lttext_t> collectserverptrmap;
+
+// contains a list of collectservers indexed by their name
+class collectservermapclass {
+protected:
+  collectserverptrmap collectserverptrs;
+
+public:
+  // type support for collectserverptrmap
+  typedef collectserverptrmap::iterator iterator;
+  typedef collectserverptrmap::const_iterator const_iterator;
+  typedef collectserverptrmap::reference reference;
+  typedef collectserverptrmap::const_reference const_reference;
+  typedef collectserverptrmap::size_type size_type;
+
+  typedef collectserverptrmap::difference_type difference_type;
+  typedef collectserverptrmap::const_reverse_iterator const_reverse_iterator;
+  typedef collectserverptrmap::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return collectserverptrs.begin();}
+  const_iterator begin () const {return collectserverptrs.begin();}
+  iterator end () {return collectserverptrs.end();}
+  const_iterator end () const {return collectserverptrs.end();}
+
+  void erase(iterator pos) {collectserverptrs.erase(pos);}
+  void erase(iterator first, iterator last) {collectserverptrs.erase(first, last);}
+  collectservermapclass &operator=(const collectservermapclass &x) 
+    {collectserverptrs=x.collectserverptrs;return *this;}
+
+  bool empty () const {return collectserverptrs.empty();}
+  size_type size() const {return collectserverptrs.size();}
+
+
+  // added functionality
+  void clear () {collectserverptrs.erase(collectserverptrs.begin(),collectserverptrs.end());}
+
+  // thecollectserver remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addcollectserver (collectserver *thecollectserver);
+
+  // getcollectserver will return NULL if the collectserver could not be found
+  collectserver *getcollectserver (const text_t &collection);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/collectset.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/collectset.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/collectset.cpp	(revision 21083)
@@ -0,0 +1,393 @@
+/**********************************************************************
+ *
+ * collectset.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#include "collectserver.h"
+#include "filter.h"
+#include "browsefilter.h"
+#include "queryfilter.h"
+#include "infodbclass.h"
+#include "mgqueryfilter.h"
+#include "mgppqueryfilter.h"
+#include "mggdbmsource.h"
+#include "fileutil.h"
+#include <assert.h>
+
+#include "colservrconfig.h"
+#include "recptconfig.h"
+#include "fileutil.h"
+#include "collectset.h"
+
+collectset::collectset (text_t &gsdlhome) {
+
+  text_tarray collections;
+  text_t      collectdir;
+
+  // get gsdlhome (if we fail the error will be picked up later -- in
+  // cgiwrapper)
+  if (site_cfg_read (gsdlhome, httpdomain, httpprefix)) {
+    if (directory_exists(gsdlhome)) {
+      collectdir = filename_cat (gsdlhome, "collect");
+      if (read_dir (collectdir, collections)) {
+    
+	text_tarray::const_iterator thiscol = collections.begin();
+	text_tarray::const_iterator endcol = collections.end();
+
+	while (thiscol != endcol) {
+	  // ignore the modelcol
+	  if (*thiscol == "modelcol") {
+	    thiscol ++;
+	    continue;
+	  }
+
+	  // read config file to see if built with mg or mgpp
+	  text_t buildtype = "mg"; // mg is default
+	  text_tarray cfgline;
+	  text_t key;
+	  text_t filename = filename_cat(collectdir, *thiscol, "index" , "build.cfg");
+	  ifstream confin(filename.getcstr());
+
+	  if (confin) {
+	    while (read_cfg_line(confin, cfgline) >= 0) {
+	      if (cfgline.size() ==2 ) {
+		key = cfgline[0];
+		cfgline.erase(cfgline.begin());
+		if (key =="buildtype") {
+		  buildtype = cfgline[0];
+		  break;
+		}
+	      }
+	    }
+	  }
+	  
+	  confin.close();
+    
+	  // this memory is created but never destroyed
+	  // we're also not doing any error checking to make sure we didn't
+	  // run out of memory
+	  collectserver *cserver = new collectserver();
+	  gdbmclass *gdbmhandler = new gdbmclass();
+    
+	  // add a null filter
+	  filterclass *filter = new filterclass ();
+	  cserver->add_filter (filter);
+	  
+	  // add a browse filter
+	  browsefilterclass *browsefilter = new browsefilterclass();
+	  browsefilter->set_gdbmptr (gdbmhandler);
+	  cserver->add_filter (browsefilter);
+	  
+	  if (buildtype == "mg") {
+	    mgsearch = new mgsearchclass();
+	    
+	    // add a query filter
+	    mgqueryfilterclass *queryfilter = new mgqueryfilterclass();
+	    queryfilter->set_gdbmptr (gdbmhandler);
+	    queryfilter->set_mgsearchptr (mgsearch);
+	    cserver->add_filter (queryfilter);
+	    
+	    // add a mg and gdbm source
+	    mggdbmsourceclass *mggdbmsource = new mggdbmsourceclass ();
+	    mggdbmsource->set_gdbmptr (gdbmhandler);
+	    mggdbmsource->set_mgsearchptr (mgsearch);
+	    cserver->add_source (mggdbmsource);
+
+	  } else if (buildtype == "mgpp") {
+	    
+	    mgppsearch = new mgppsearchclass();
+	    
+	    // add a query filter
+	    mgppqueryfilterclass *queryfilter = new mgppqueryfilterclass();
+	    queryfilter->set_gdbmptr (gdbmhandler);
+	    queryfilter->set_mgsearchptr (mgppsearch);
+	    cserver->add_filter (queryfilter);
+	    
+	    // add a mg and gdbm source
+	    mggdbmsourceclass *mggdbmsource = new mggdbmsourceclass ();
+	    mggdbmsource->set_gdbmptr (gdbmhandler);
+	    mggdbmsource->set_mgsearchptr (mgppsearch);
+	    cserver->add_source (mggdbmsource);   
+	  }
+	  
+	  // inform collection server and everything it contains about its
+	  // collection name
+	  cserver->configure ("collection", *thiscol);
+	  // AZIZ: added on 10/10/00
+	  //       the cserver object does not have a reference to gsdlhome
+	  cserver->configure ("gsdlhome", gsdlhome);
+    
+	  // GRB: removed    proto.add_collectserver (cserver);
+	  // GRB: added to build our own cservers list
+	  cservers.addcollectserver (cserver);
+
+	  thiscol ++;
+	}
+      }
+    }
+  }
+}
+
+collectset::~collectset () {
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+
+  while (here != end) {
+    if ((*here).second.c != NULL) {
+      delete (*here).second.c;
+    }
+    here ++;
+  }
+  cservers.clear();
+}
+
+bool collectset::init (ostream &logout) {
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+
+  while (here != end) {
+    assert ((*here).second.c != NULL);
+    if ((*here).second.c != NULL) {
+      const colservrconf &configinfo = (*here).second.c->get_configinfo ();
+
+      // configure this collection server
+
+      // note that we read build.cfg before collect.cfg so that the indexmaps
+      // are available to decode defaultindex, defaultsubcollection, and
+      // defaultlanguage
+      if (!build_cfg_read (*((*here).second.c), configinfo.gsdlhome,
+			   configinfo.collection)) {
+	outconvertclass text_t2ascii;
+	logout << text_t2ascii 
+	       << "Warning: couldn't read build.cfg file for collection \"" //****
+	       << configinfo.collection << "\", gsdlhome=\""
+	       << configinfo.gsdlhome << "\"\n";
+	here ++;
+	continue;
+      }
+
+      if (!collect_cfg_read (*((*here).second.c), configinfo.gsdlhome,
+			     configinfo.collection)) {
+	outconvertclass text_t2ascii;
+	logout << text_t2ascii 
+	       << "Warning: couldn't read collect.cfg file for collection \""
+	       << configinfo.collection << "\", gsdlhome=\"" 
+	       << configinfo.gsdlhome << "\"\n";
+	here ++;
+	continue;
+      }
+
+      if (!(*here).second.c->init (logout)) return false;
+
+      (*here).second.c->configure("httpdomain",httpdomain);
+      (*here).second.c->configure("httpprefix",httpprefix);
+    }
+    here++;
+  }
+
+  return true;
+}
+
+collectservermapclass collectset::servers()
+{ return cservers;
+}
+
+// add_collection sets up the collectionserver and calls
+// add_collectserver
+void collectset::add_collection (const text_t &collection, void *recpt, 
+				 const text_t &gsdlhome, const text_t &gdbmhome) {
+      
+  // read config file to see if built with mg or mgpp
+  // -- we can rely on the collection (and therefore the build.cfg)
+  // being here since this is the null protocol - a nicer way to 
+  // do this would be preferable though - Stefan.
+  text_t buildtype = "mg"; // mg is default
+
+  text_tarray cfgline;
+  text_t key;
+  text_t build_cfg = filename_cat(gsdlhome, "collect", collection, "index", "build.cfg");
+  char *build_cfgc = build_cfg.getcstr();
+  ifstream confin(build_cfgc);
+
+  if (confin) {
+    while (read_cfg_line(confin, cfgline) >= 0) {
+      if (cfgline.size() == 2) {
+	key = cfgline[0];
+	cfgline.erase(cfgline.begin());
+	if (key == "buildtype") {
+	  buildtype = cfgline[0];
+	  break;
+	}
+      }
+    }
+    confin.close();
+  }
+  delete build_cfgc;
+
+  collectserver *cserver = new collectserver();
+  gdbmclass *gdbmhandler = new gdbmclass();
+
+  // add a null filter
+  filterclass *filter = new filterclass ();
+  cserver->add_filter (filter);
+      
+  // add a browse filter
+  browsefilterclass *browsefilter = new browsefilterclass();
+  browsefilter->set_gdbmptr (gdbmhandler);
+
+  cserver->add_filter (browsefilter);  
+ 
+  if (buildtype == "mg") {
+    mgsearch = new mgsearchclass();
+ 
+    // add a query filter
+    mgqueryfilterclass *queryfilter = new mgqueryfilterclass();
+    queryfilter->set_gdbmptr (gdbmhandler);
+    queryfilter->set_mgsearchptr (mgsearch);
+    cserver->add_filter (queryfilter);
+    
+    // add a mg and gdbm source
+    mggdbmsourceclass *mggdbmsource = new mggdbmsourceclass ();
+    mggdbmsource->set_gdbmptr (gdbmhandler);
+    mggdbmsource->set_mgsearchptr (mgsearch);
+    cserver->add_source (mggdbmsource);
+
+  } else if (buildtype == "mgpp") {
+      
+    mgppsearch = new mgppsearchclass();
+
+    // add a query filter
+    mgppqueryfilterclass *queryfilter = new mgppqueryfilterclass();
+    queryfilter->set_gdbmptr (gdbmhandler);
+    queryfilter->set_mgsearchptr (mgppsearch);
+    cserver->add_filter (queryfilter);
+      
+    // add a mg and gdbm source
+    mggdbmsourceclass *mggdbmsource = new mggdbmsourceclass ();
+    mggdbmsource->set_gdbmptr (gdbmhandler);
+    mggdbmsource->set_mgsearchptr (mgppsearch);
+    cserver->add_source (mggdbmsource);
+    
+  }
+
+  // inform collection server and everything it contains about its
+  // collection name
+  cserver->configure ("collection", collection);
+
+  /* Removed from add_collection 24/11/2000; already done elsewhere in collectset.  
+  // configure receptionist's collectinfo structure 
+  text_tarray colinfo;
+  colinfo.push_back (collection);
+  colinfo.push_back (gsdlhome);
+  colinfo.push_back (gdbmhome);
+  */
+  cservers.addcollectserver (cserver);
+}
+
+// remove_collection deletes the collection server of collection.
+// This only needs to be called if a collectionserver is to be
+// removed while the library is running. The destructor function
+// cleans up all collectservers when the program exits.
+void collectset::remove_collection (const text_t &collection, ostream &logout) {
+
+  // first unload any cached mg databases - we may need to do something
+  // similar to this for mgpp too
+  if (mgsearch != NULL) {
+    mgsearch->unload_database();
+  }
+
+  // now delete the collection server object
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+
+  while (here != end) {
+    if ((*here).second.c != NULL && (*here).first == collection) {
+      delete (*here).second.c;
+      cservers.erase (here);
+      return;
+    }
+    here ++;
+  }
+  outconvertclass text_t2ascii;
+  logout << text_t2ascii << "nullproto::remove_collection: failed to remove collectserver for "
+	 << collection << "\n";
+}
+
+void collectset::configure(const text_t &key, const text_tarray &cfgline)
+{
+  if (key == "collection" || key == "collectdir") return;
+
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+
+  while (here != end) {
+    assert ((*here).second.c != NULL);
+    if ((*here).second.c != NULL) {
+      if (key == "collectinfo") {
+	if ((*here).first == cfgline[0]) {
+	  (*here).second.c->configure ("gsdlhome", cfgline[1]);
+	  (*here).second.c->configure ("gdbmhome", cfgline[2]);
+	}
+      } else {
+	(*here).second.c->configure (key, cfgline);
+      }
+    }
+
+    here++;
+  }
+}
+
+void collectset::getCollectionList (text_tarray &collist) 
+{
+  collist.erase(collist.begin(),collist.end());
+
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+  while (here != end) {
+    assert ((*here).second.c != NULL);
+    if ((*here).second.c != NULL) {
+      collist.push_back ((*here).second.c->get_collection_name());
+    }
+    here++;
+  }
+}
+
+void collectset::setReceptionistServers(receptionist &recpt, text_t &gsdlhome)
+{ 
+  collectservermapclass::iterator here = cservers.begin();
+  collectservermapclass::iterator end = cservers.end();
+  while (here != end) {
+    assert ((*here).second.c != NULL);
+
+    text_tarray colinfo;
+    colinfo.push_back((*here).second.c->get_collection_name());
+    colinfo.push_back(gsdlhome);
+    colinfo.push_back(gsdlhome);
+    recpt.configure("collectinfo", colinfo);
+
+    here++;
+  }
+}
Index: /main/tags/2.38/gsdl/src/colservr/collectset.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/collectset.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/collectset.h	(revision 21083)
@@ -0,0 +1,62 @@
+/************************************************************
+ * 
+ * Collection set
+ *
+ ************************************************************/
+
+#ifndef COLLECTSET_H
+#define COLLECTSET_H
+
+#include "collectserver.h"
+#include "cnfgable.h"
+#include "receptionist.h"
+#include "mgsearch.h"
+#include "mgppsearch.h"
+
+class collectset : public configurable
+{
+ protected:
+  collectservermapclass cservers;
+  mgsearchclass         *mgsearch;
+  mgppsearchclass       *mgppsearch;
+  int                   noofservers;
+  text_t                httpdomain;
+  text_t                httpprefix;
+
+ public:
+  collectset(text_t &gsdlhome);
+  // this constructor is used by the local library
+  collectset() {}
+
+  ~collectset();
+
+  // initialise the collections
+  bool init(ostream &logout);
+
+  // configure all the servers as supplied
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  // Add/remove collections
+  void remove_collection (const text_t &collection, ostream &logout);
+  void add_collection (const text_t &collection, void *recpt, 
+				  const text_t &gsdlhome, const text_t &gdbmhome);
+
+  // return the total number of servers in the set
+  int size();
+
+  void getCollectionList(text_tarray &collist);
+
+  // return the component map
+  collectservermapclass servers();
+
+  // configure a receptionist with the list of servers
+  void setReceptionistServers(receptionist &recpt, text_t &gsdlhome);
+
+  // return an individual collection server
+  collectserver *getCollectServer(const text_t &collection)
+    {
+      return cservers.getcollectserver(collection);
+    }
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/colservrconfig.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/colservrconfig.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/colservrconfig.cpp	(revision 21083)
@@ -0,0 +1,141 @@
+/**********************************************************************
+ *
+ * colservrconfig.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+/*
+   $Log$
+   Revision 1.4  2001/01/25 18:26:44  cs025
+   Included CORBA branch for first time
+
+   Revision 1.2.2.1  2000/04/04 15:02:31  cs025
+   Corba first commit
+
+   Revision 1.2  1999/09/07 04:57:20  sjboddie
+   added gpl notice
+
+   Revision 1.1  1999/02/21 22:32:55  rjmcnab
+
+   Initial revision.
+
+ */
+
+
+#include "colservrconfig.h"
+#include "fileutil.h"
+#include "cfgread.h"
+
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/iostream>
+#  include <ospace/std/fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+// collect_cfg_read reads collect.cfg returning true on success.
+bool collect_cfg_read (collectserver &cserver, const text_t &gsdlhome,
+		       const text_t &collection) {
+  text_t filename = filename_cat (gsdlhome, "collect");
+  filename = filename_cat (filename, collection);
+  filename = filename_cat (filename, "etc");
+  filename = filename_cat (filename, "collect.cfg");
+  if (!file_exists (filename)) {
+    filename = filename_cat (gsdlhome, "etc");
+    filename = filename_cat (filename, "collect.cfg");
+    if (!file_exists (filename)) return false;
+  }
+
+  return cserver.read_configfile(filename);
+  /*
+  // read in the collection configuration file
+  text_t key;
+  text_tarray cfgline;
+  char *cstr = filename.getcstr();
+  ifstream confin (cstr);
+  delete cstr;
+
+  if (confin) {
+    while (read_cfg_line(confin, cfgline) >= 0) {
+      if (cfgline.size () >= 2) {
+	key = cfgline[0];
+	cfgline.erase(cfgline.begin());
+
+	// configure the collection server
+	cserver.configure (key, cfgline);
+      }
+    }
+    confin.close ();
+    return true;
+  }
+  return false;
+  */
+}
+
+
+// build_cfg_read reads build.cfg and returns true on success.
+bool build_cfg_read (collectserver &cserver, const text_t &gsdlhome,
+		     const text_t &collection) {
+  text_t filename = filename_cat (gsdlhome, "collect");
+  filename = filename_cat (filename, collection);
+  filename = filename_cat (filename, "index");
+
+  filename = filename_cat (filename, "build.cfg");
+  if (!file_exists (filename)) {
+    filename = filename_cat (gsdlhome, "index");
+    filename = filename_cat (filename, "build.cfg");
+    if (!file_exists (filename)) return false;
+  }
+
+  return cserver.read_configfile(filename);
+
+  /*
+  // read in the build configuration file
+  text_t key;
+  text_tarray cfgline;
+  char *cstr = filename.getcstr();
+  ifstream confin (cstr);
+  delete cstr;
+
+  if (confin) {
+    while (read_cfg_line(confin, cfgline) >= 0) {
+      if (cfgline.size () >= 2) {
+	key = cfgline[0];
+	cfgline.erase(cfgline.begin());
+
+	// configure the collection server
+	cserver.configure (key, cfgline);
+      }
+    }
+    confin.close ();
+    return true;
+  }
+  return false;
+  */
+}
Index: /main/tags/2.38/gsdl/src/colservr/colservrconfig.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/colservrconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/colservrconfig.h	(revision 21083)
@@ -0,0 +1,45 @@
+/**********************************************************************
+ *
+ * colservrconfig.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef COLSERVRCONFIG_H
+#define COLSERVRCONFIG_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "collectserver.h"
+
+
+// collect_cfg_read reads collect.cfg returning true on success.
+bool collect_cfg_read (collectserver &cserver, const text_t &gsdlhome,
+		       const text_t &collection);
+
+// build_cfg_read reads build.cfg and returns true on success.
+bool build_cfg_read (collectserver &cserver, const text_t &gsdlhome,
+		     const text_t &collection);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/corbaServer.mpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/corbaServer.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/corbaServer.mpp	(revision 21083)
@@ -0,0 +1,486 @@
+// Standard headers
+#include <iostream.h>
+#include <fstream.h>
+
+// protocol headers
+#include "corbaiface.h"
+using namespace gsdlInterface;
+
+#include "corbaconv_text_t.h"
+
+// library headers
+#include "fileutil.h"
+//#include "gsdlhome.h"
+
+// greenstone headers
+#include "comtypes.h"
+#include "recptproto.h"
+#include "nullproto.h"
+
+// local headers
+#include "corbatext_t.h"
+
+void corbatext_setToCorbaArray(text_tset set, corbatext_tset *cset);
+void corbatext_corbaArrayToSet(corbatext_tset cset, text_tset *set);
+void corbatext_mapToCorbaMap(text_tmap map, corbatext_tmap *tm);
+void corbaresponse_resultDocInfoToCorba(ResultDocInfo_tarray docinfo, corbaResultDocInfo_array &corbainfo);
+
+void corbaresponse_termInfoToCorba(TermInfo_tarray terminfo, corbaTermInfo_array &corbainfo) {
+  TermInfo_tarray::iterator here = terminfo.begin();
+  TermInfo_tarray::iterator end  = terminfo.end();
+  unsigned int i;
+	
+  i = 0;
+
+  while (here != end) 
+    {
+      corbainfo.length(i+1);
+      
+      corbainfo[i].frequency = here->freq;
+      corbaconv_text_t::getCorbatext(here->term,corbainfo[i].term);
+      corbatext_arrayToCorbaArray(here->matchTerms, &corbainfo[i].matchTerms);
+
+      i ++;
+      here ++;
+    }
+  cout << "Terminfo " << i << endl;
+}
+
+void corbatext_optionValueArrayToC(corbaOptionValue_array corba, OptionValue_tarray &array)
+{
+  unsigned int i = 0;
+  OptionValue_t option;
+
+  for (i = 0; i < corba.length(); i ++)
+    {
+      corbaconv_text_t::setCorbatext(option.name,corba[i].name);
+      corbaconv_text_t::setCorbatext(option.value,corba[i].value);
+
+      // cout << corbatext_string(corba[i].name) << "?" << option
+
+      array.push_back(option);
+    }
+}
+
+class corbaServer : virtual public corbaiface_skel
+{
+private:
+  text_tarray collections;
+  recptproto *protocol;
+  text_t      gsdlhome;
+
+  void openLogfile(text_t extension, ofstream &out)
+  {
+    char *cfilename;
+    text_t filename;
+
+    filename = filename_cat(gsdlhome, extension);
+    cfilename = filename.getcstr();
+
+    out.open(cfilename);
+    delete cfilename;
+  }
+
+public:
+  corbaServer(recptproto *protocol, text_t home)
+  { 
+    text_t dirname;
+    char * cdirname;
+
+    cout << "CorbaServer: gsdlhome = " << home << endl;
+
+    this->gsdlhome = home;
+    cout << gsdlhome.getcstr() << endl;
+    dirname = filename_cat(gsdlhome, "/collect");
+    cdirname = dirname.getcstr();
+    if (!read_dir (cdirname, collections)) exit (1);
+    delete cdirname;
+
+    cout << "Constructing set list server" << endl;
+    this->protocol = protocol;
+
+  }
+  
+  CORBA::Boolean initialise(corbaComError &err) 
+  {
+      ofstream      logout;
+      int           reply;
+      comerror_t    error = noError;
+
+      this->openLogfile("/etc/corbaout.txt", logout);
+      reply = protocol->init(error, logout);
+      logout.close();
+      return (reply != 0 ? 1 : 0);
+    }
+
+  void configure(const corbatext_t &corbaKey, const corbatext_tarray &corbaCfgline,corbaComError &err)
+    {
+      text_t        key;
+      text_tarray   cfgline;
+      comerror_t    error = noError;
+
+      corbaconv_text_t::setCorbatext(key,corbaKey);
+      corbatext_corbaArrayToArray(corbaCfgline, &cfgline);
+
+
+      // ****
+      cout << "Recieved " << key << " = ";
+      for (int unsigned i=0; i<cfgline.size(); i++)
+	{
+	  cout << cfgline[i] << " ";
+	}
+      cout << endl;
+
+      // DB // ****
+      if (key=="gsdlhome")
+	{  
+	  text_tarray cfgline;
+	  cfgline.push_back (gsdlhome);
+	  cout << "Changing gsdlhome to " << gsdlhome << endl;
+	  protocol->configure(key, cfgline, error);
+	}
+      else if (key=="httpdomain")
+	{
+	  // Only let gsdlhome through !!!! // ****
+	  cout << "Supressing httpdomain" << endl;
+	}
+      else if (key=="httpprefix")
+	{
+	  cout << "Supressing httpprefix" << endl;
+	}
+      else
+	{ 
+	  protocol->configure(key, cfgline,error);
+	}
+    }
+
+  void hasCollection(const corbatext_t &corbaCollect, CORBA::Boolean &has,
+                     corbaComError &error) {
+    // do nowt!
+    corbaconv_text_t *cct;
+    bool    _has;
+    comerror_t err = noError;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    cct = new corbaconv_text_t(corbaCollect);
+
+    cout << "Collection: " << cct->getcstr() << endl;
+
+    protocol->has_collection(*cct, _has, err, logout); // 'cct' typecast to text_t
+    if (_has)
+      { 
+	has = 1;
+      }
+    else
+      {
+	has = 0;
+      }
+
+    // cout << "  " << has << endl;
+
+    delete cct;
+
+    error = corbaNoError;
+    logout.close();
+  }
+
+  void ping(const struct corbatext_t &corbaCollect, CORBA::Boolean &wasSuccess, corbaComError &corbaError)
+  { 
+    text_t collection;
+    bool   success;
+    comerror_t error = noError;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    corbaconv_text_t::setCorbatext(collection,corbaCollect);
+    protocol->ping(collection, success, error, logout);
+
+    corbaError = (corbaComError) error;
+    wasSuccess = (CORBA::Boolean) success;
+    logout.close();
+  }
+
+  void filter(const struct corbatext_t &corbaCollect,
+	      const struct corbaFilterRequest &corbaRequest,
+	      struct corbaFilterResponse &corbaResponse,
+	      corbaComError &corbaError)
+  {
+    // variables for action
+    FilterRequest_t request;
+    FilterResponse_t response;
+    comerror_t       error = noError;
+    text_t           collection;
+    ofstream         logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    // copy collection id
+    corbaconv_text_t::setCorbatext(collection,corbaCollect);
+
+    // copy request values
+    corbaconv_text_t::setCorbatext(request.filterName,corbaRequest.filter);
+    corbatext_optionValueArrayToC(corbaRequest.filterOptions, request.filterOptions);
+    corbatext_corbaArrayToArray(corbaRequest.docSet, &request.docSet);
+    request.filterResultOptions = corbaRequest.filterResultOptions;
+    corbaconv_text_t::setCorbatext(request.requestParams,corbaRequest.requestParams);
+    corbaconv_text_t::setCorbatext(request.refParams,corbaRequest.refParams);
+    corbatext_corbaArrayToSet(corbaRequest.fields, &request.fields);
+    request.getParents = corbaRequest.getParents;
+
+    protocol->filter(collection, request, response, error, logout);
+
+    // copy response values
+    corbaResponse.numDocs = response.numDocs;
+    corbaResponse.isApprox = (::gsdlInterface::corbaIsApprox) response.isApprox;
+    corbaresponse_termInfoToCorba(response.termInfo, corbaResponse.termInfo);
+    corbaresponse_resultDocInfoToCorba(response.docInfo, corbaResponse.docInfo);
+
+    // tidy up variables
+    logout.close();
+    corbaError = (corbaComError) error;
+    cout << "Filter prepared" << corbaResponse.docInfo.length() << "," << corbaResponse.numDocs << endl;
+  }
+
+  void getCollectInfo(const struct corbatext_t &corbaCollect,
+                      corbaColInfoResponse &corbaResponse,
+                      corbaComError &corbaError)
+  {
+    ColInfoResponse_t response;
+    comerror_t       error = noError;
+    text_t           collection;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    corbaconv_text_t::setCorbatext(collection,corbaCollect);
+    protocol->get_collectinfo(collection, response, error, logout);
+
+    cout << "IsPublic  = " << ((response.isPublic)?"True":"False") << endl;
+    cout << "IsBeta    = " << ((response.isBeta)  ?"True":"False") << endl;
+    cout << "BuildDate = " << response.buildDate << endl;
+    cout << "NumDocs   = " << response.numDocs << endl;
+    cout << "NumBytes  = " << response.numBytes << endl;
+    cout << "NumWords  = " << response.numWords << endl;
+
+    corbaResponse.isPublic  = response.isPublic;
+    corbaResponse.isBeta    = response.isBeta;
+    corbaResponse.buildDate = response.buildDate;
+    corbatext_arrayToCorbaArray(response.languages, &corbaResponse.languages);
+    corbatext_arrayToCorbaArray(response.ccsCols, &corbaResponse.ccsCols);
+    corbaResponse.numDocs   = response.numDocs;
+    corbaResponse.numBytes  = response.numBytes;
+    corbaResponse.numWords  = response.numWords;
+
+    corbatext_mapToCorbaMap(response.collectionmeta, &corbaResponse.collectionMeta);
+    corbatext_mapToCorbaMap(response.format, &corbaResponse.format);
+    corbatext_mapToCorbaMap(response.building, &corbaResponse.building);
+    corbaconv_text_t::getCorbatext(response.httpdomain,corbaResponse.httpdomain);
+
+    corbaconv_text_t::getCorbatext(response.httpprefix,corbaResponse.httpprefix);
+    corbaconv_text_t::getCorbatext(response.receptionist,corbaResponse.receptionist);
+
+    /* text_tmap::iterator f_here = response.format.begin();
+    text_tmap::iterator f_end = response.format.end();
+    while (f_here!=f_end)
+    {
+      cout << "**** format: " << f_here->first << " = " << f_here->second << endl;
+      f_here++;
+    } 
+    */ // ****
+
+    logout.close();
+    corbaError = (corbaComError) error;
+  }
+
+  void getFilterOptions(const struct corbatext_t &corbaCollect,
+			const struct corbatext_t &corbaFilterName,
+			struct corbaFilterOptionsResponse &corbaResponse,
+			enum corbaComError &corbaError)
+  {   
+    text_t collection;
+    InfoFilterOptionsRequest_t request;
+    InfoFilterOptionsResponse_t response;
+    comerror_t error = noError;
+    unsigned int i;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    corbaconv_text_t::setCorbatext(collection,corbaCollect);
+    corbaconv_text_t::setCorbatext(request.filterName,corbaFilterName);
+    protocol->get_filteroptions(collection, request, response, error, logout);
+
+    // decode filters back into corba format
+    FilterOption_tmap::iterator here = response.filterOptions.begin();
+    FilterOption_tmap::iterator end = response.filterOptions.end();
+    i = 0;
+    while (here != end)
+      {
+	// set array for name/options to be one bigger
+	corbaResponse.names.length(i+1);
+	corbaResponse.options.length(i+1);
+
+	// get left-hand side of map
+	corbaconv_text_t::getCorbatext((*here).first,corbaResponse.names[i]);
+	
+	// get right-hand side of map
+	corbaconv_text_t::getCorbatext((*here).second.name,corbaResponse.options[i].name);
+	corbaResponse.options[i].type = 
+	  (::gsdlInterface::corbaFilterType)(*here).second.type;
+	corbaResponse.options[i].repeatable = 
+	  (::gsdlInterface::corbaFilterRepeatable)(*here).second.repeatable;
+	corbaconv_text_t::getCorbatext((*here).second.defaultValue,corbaResponse.options[i].defaultValue);
+	corbatext_arrayToCorbaArray((*here).second.validValues, &corbaResponse.options[i].validValues);
+
+	// take next iterators
+	i++;
+	here ++;
+      }
+
+    logout.close();
+    corbaError = (corbaComError) error;
+  }
+
+  void getFilterInfo(const struct corbatext_t &corbaCollect, 
+		     corbatext_tarray &filterNames, 
+		     enum corbaComError &corbaError)
+  { text_tarray ta;
+    comerror_t error = noError;
+    text_t collection;    
+    InfoFiltersResponse_t response;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    corbaconv_text_t::setCorbatext(collection,corbaCollect);
+    cout << collection.getcstr() << endl;
+			    
+    protocol->get_filterinfo(collection, response, error, logout);
+    corbatext_setToCorbaArray(response.filterNames, &filterNames);
+
+    corbaError = (corbaComError) error;
+    logout.close();
+  }
+  
+  void getDocument(const struct corbatext_t &corbaCollection, struct corbaDocRequest &corbaRequest, 
+		   struct corbaDocResponse &corbaResponse,  enum corbaComError &corbaError)
+  { DocumentRequest_t request;
+    DocumentResponse_t response;
+    comerror_t         error = noError;
+    text_t             collection;
+    ofstream logout;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    // set up request
+    corbaconv_text_t::setCorbatext(collection,corbaCollection);
+    corbaconv_text_t::setCorbatext(request.OID,corbaRequest.OID);
+    corbaconv_text_t::setCorbatext(request.docType,corbaRequest.docType);
+    corbaconv_text_t::setCorbatext(request.docFormat,corbaRequest.docFormat);
+
+    // do actual get document
+    protocol->get_document(collection, request, response, error, logout);
+    corbaconv_text_t::getCorbatext(response.doc,corbaResponse.doc);
+
+    // decode response
+    corbaError = (corbaComError) error;
+
+    logout.close();
+  }
+
+  void collectionList(corbatext_tarray &corbalist, corbaComError &error)
+  {
+    /* stringSeq *reply;
+    unsigned int i;
+    char *istring; */
+
+    text_tarray collist;
+    comerror_t  err;
+    ofstream logout;
+
+    cout << "Received collection list request" << endl;
+
+    this->openLogfile("/etc/corbaout.txt", logout);
+
+    protocol->get_collection_list(collist, err, logout);
+
+    /*    reply = new stringSeq(collections.size());
+    
+    (*reply).length(collections.size());
+    for (i = 0; i < collections.size(); i ++)
+      {
+	istring = collections[i].getcstr();
+	(*reply)[i] = CORBA::string_dup(istring);
+	delete istring;
+      }
+    
+    return reply;
+    */
+
+    corbatext_arrayToCorbaArray(collist, &corbalist);
+    cout << "Replying " << collist.size() << ": " << endl;
+
+    for (int unsigned i = 0; i < collist.size(); i ++)
+      {
+	cout << collist[i];
+	if (i<collist.size()-1) cout << ", ";
+      }
+    cout << endl;
+
+    logout.close();
+    // CORBA::string_dup(_listString);
+  }
+};
+
+int main (int argc, char *argv[])
+{
+  nullproto protocol;
+  collectset *cservers;
+  text_t     gsdlhome;
+
+  cservers = new collectset(gsdlhome);
+  protocol.set_collectset(cservers);
+
+  cout << "Started Corba ..." << endl;
+
+  // ORB initialization
+  CORBA::ORB_var orb = CORBA::ORB_init( argc, argv, "mico-local-orb" );
+  CORBA::BOA_var boa = orb->BOA_init( argc, argv, "mico-local-boa" );
+
+  cout << "Initialised ORB and BOA" << endl;
+
+  corbaServer* server = new corbaServer(&protocol, gsdlhome);
+
+  cout << "Initialised server" << endl;
+
+  CORBA::String_var ref = orb->object_to_string( server );
+
+  cout << "Mapped Corba object to string" << endl;
+
+  // write id to "naming service"
+  ofstream out ("/tmp/localcorba.objid");
+	if (out.is_open()) {
+		out << ref << endl;
+		if (out.fail() || out.bad()) {
+			cout << "Failed " << endl;
+		}
+		out.close ();
+	}
+	else {
+		cout << "Unable to write string to file /tmp/localcorba.objid" << endl;
+		cout << "Please check the file permissions/ownership" << endl;
+		return 0;
+	}
+  cout << "Corba string is " << ref << endl;
+
+  // indicate readiness and run
+  boa->impl_is_ready( CORBA::ImplementationDef::_nil() );
+  orb->run ();
+  CORBA::release( server );
+  return 0;
+}
+
+
Index: /main/tags/2.38/gsdl/src/colservr/filter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/filter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/filter.cpp	(revision 21083)
@@ -0,0 +1,311 @@
+/**********************************************************************
+ *
+ * filter.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "filter.h"
+#include "fileutil.h"
+#include <assert.h>
+
+
+// default constructor does nothing
+filterclass::filterclass () {
+}
+
+// default destructor does nothing
+filterclass::~filterclass () {
+}
+
+// configure should be called once for each configuration line
+// default configures the default filter options
+void filterclass::configure (const text_t &key, const text_tarray &cfgline) {
+  if (cfgline.size() >= 1) {
+    const text_t &value = cfgline[0];
+
+    if (key == "collection") collection = value;
+    else if (key == "collectdir") collectdir = value;
+    else if (key == "gsdlhome") gsdlhome = value;
+    else if (key == "gdbmhome") gdbmhome = value;
+    else if ((key == "filteroptdefault") && (cfgline.size() == 2)) {
+      // see if this filter has an option with this name
+      FilterOption_tmap::iterator thisfilteroption = 
+	filterOptions.find(cfgline[0]);
+      if (thisfilteroption != filterOptions.end())
+	(*thisfilteroption).second.defaultValue = cfgline[1];
+    }
+  }
+}
+
+// init should be called after all the configuration is done but
+// before any other methods are called
+// default checks all the filter option defaults
+bool filterclass::init (ostream &/*logout*/) {
+  // check all the filter defaults
+  FilterOption_tmap::iterator filteroption_here = filterOptions.begin();
+  FilterOption_tmap::iterator filteroption_end = filterOptions.end();
+  while (filteroption_here != filteroption_end) {
+    (*filteroption_here).second.check_defaultValue ();
+    
+    filteroption_here++;
+  }
+
+  if (gdbmhome.empty()) gdbmhome = gsdlhome;
+  
+  // get the collection directory name
+  if (collectdir.empty()) {
+    collectdir = filename_cat (gsdlhome, "collect", collection);
+  }
+  
+  return true;
+}
+
+// returns the name of this filter
+// default returns "NullFilter"
+text_t filterclass::get_filter_name () {
+  return "NullFilter";
+}
+
+// returns the current filter options
+void filterclass::get_filteroptions (InfoFilterOptionsResponse_t &response,
+				     comerror_t &err, ostream &/*logout*/) {
+  response.clear();
+  response.filterOptions = filterOptions;
+  err = noError;
+}
+
+// default returns nothing
+void filterclass::filter (const FilterRequest_t &request,
+			  FilterResponse_t &response,
+			  comerror_t &err, ostream &/*logout*/) {
+  ResultDocInfo_t resultdoc;
+
+  response.clear();
+
+  if ((request.filterResultOptions & FROID) ||
+      (request.filterResultOptions & FRmetadata)) {
+    // copy the OIDs from the request to the response
+    text_tarray::const_iterator here = request.docSet.begin();
+    text_tarray::const_iterator end = request.docSet.end();
+    while (here != end) {
+      resultdoc.OID = (*here);
+      response.docInfo.push_back(resultdoc);
+
+      here++;
+    }
+  }
+
+  response.numDocs = response.docInfo.size();
+  response.isApprox = Exact;
+  err = noError;
+}
+
+
+bool operator==(const filterptr &x, const filterptr &y) {
+  return (x.f == y.f);
+}
+
+bool operator<(const filterptr &x, const filterptr &y) {
+  return (x.f < y.f);
+}
+
+
+// thefilter remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void filtermapclass::addfilter (filterclass *thefilter) {
+  // can't add a null filter
+  assert (thefilter != NULL);
+  if (thefilter == NULL) return;
+  
+  // can't add an filter with no name
+  assert (!(thefilter->get_filter_name()).empty());
+  if ((thefilter->get_filter_name()).empty()) return;
+
+  filterptr fptr;
+  fptr.f = thefilter;
+  filterptrs[thefilter->get_filter_name()] = fptr;
+}
+
+// getfilter will return NULL if the filter could not be found
+filterclass *filtermapclass::getfilter (const text_t &key) {
+  // can't find an filter with no name
+  assert (!key.empty());
+  if (key.empty()) return NULL;
+
+  iterator here = filterptrs.find (key);
+  if (here == filterptrs.end()) return NULL;
+  
+  return (*here).second.f;
+}
+
+
+
+
+// some useful functions for dealing with document sets
+
+// returns -1 if t1 is a child of t2
+// returns 0  if t1 and t2 are not parent-child related
+// returns 1  if t1 is a parent of t2
+int child_compare (const text_t &t1, const text_t &t2) {
+  text_t::const_iterator t1_here = t1.begin();
+  text_t::const_iterator t1_end = t1.end();
+  text_t::const_iterator t2_here = t2.begin();
+  text_t::const_iterator t2_end = t2.end();
+
+  while ((t1_here != t1_end) && (t2_here != t2_end)) {
+    if (*t1_here != *t2_here) return 0; // unrelated
+    t1_here++;
+    t2_here++;
+  }
+
+  if ((t1_here == t1_end) && (t2_here == t2_end)) return 0; // equal
+  if (t1_here != t1_end) {
+    if (*t1_here == '.') return -1; // t1 is child
+    else return 0; // unrelated
+  }
+
+  if (t2_here != t2_end) {
+    if (*t2_here == '.') return 1; // t2 is child
+    else return 0; // unrelated
+  }
+
+  return 0; // shouldn't get here...
+}
+
+// intersect places the result in set1
+void intersect (text_tset &set1, const text_tset &set2) {
+  text_tset resultset;
+  int childcomp = 0;
+
+  text_tset::const_iterator set1_here = set1.begin();
+  text_tset::const_iterator set1_end = set1.end();
+  text_tset::const_iterator set2_here = set2.begin();
+  text_tset::const_iterator set2_end = set2.end();
+  while ((set1_here != set1_end) && (set2_here != set2_end)) {
+    if (*set1_here == *set2_here) {
+      // equal
+      resultset.insert (*set1_here);
+      set1_here++;
+      set2_here++;
+
+    } else if ((childcomp=child_compare(*set1_here, *set2_here)) != 0) {
+      if (childcomp < 0) {
+	// set1_here is child
+	resultset.insert (*set1_here);
+	set1_here++;
+      } else {
+	// set2_here is child
+	resultset.insert (*set2_here);
+	set2_here++;
+      }
+
+    } else if (*set1_here < *set2_here) {
+      // set1 is less
+      set1_here++;
+
+    } else {
+      // set2 is less
+      set2_here++;
+    }
+  }
+
+  set1 = resultset;
+}
+
+void intersect (text_tarray &set1, const text_tset &set2) {
+  text_tarray resultset;
+
+  text_tarray::const_iterator set1_here = set1.begin();
+  text_tarray::const_iterator set1_end = set1.end();
+
+  while (set1_here != set1_end) {
+    if (in_set (set2, *set1_here))
+      resultset.push_back (*set1_here);
+    set1_here ++;
+  }
+  set1 = resultset;
+}
+
+void intersect (text_tarray &set1, const text_tarray &set2) {
+  text_tarray resultset;
+
+  text_tarray::const_iterator set1_here = set1.begin();
+  text_tarray::const_iterator set1_end = set1.end();
+
+  while (set1_here != set1_end) {
+    if (in_set (set2, *set1_here))
+      resultset.push_back (*set1_here);
+    set1_here ++;
+  }
+  set1 = resultset;
+}
+
+// tests to see if el is in set
+bool in_set (const text_tset &set1, const text_t &el) {
+  text_t::const_iterator here = el.begin();
+  text_t::const_iterator end = el.begin();
+  text_t tryel, tryel_add;
+  bool first = true;
+
+  // the element is in the set if any of its parents are
+  // in the set
+  do {
+    // get next possible element to try
+    here = getdelimitstr (here, end, '.', tryel_add);
+    if (!first) tryel += ".";
+    first = false;
+    tryel += tryel_add;
+
+    // see if this element is in the set
+    if (set1.find(tryel) != set1.end()) return true;
+  } while (here != end);
+
+  return false;
+}
+
+bool in_set (const text_tarray &set1, const text_t &el) {
+  text_t::const_iterator here = el.begin();
+  text_t::const_iterator end = el.begin();
+  text_t tryel, tryel_add;
+  bool first = true;
+
+  // the element is in the set if any of its parents are
+  // in the set
+  do {
+    // get next possible element to try
+    here = getdelimitstr (here, end, '.', tryel_add);
+    if (!first) tryel += ".";
+    first = false;
+    tryel += tryel_add;
+
+    // see if this element is in the set
+    text_tarray::const_iterator here = set1.begin();
+    text_tarray::const_iterator end = set1.end();
+    while (here != end) {
+      if (*here == tryel) break;
+      here ++;
+    }
+    if (here != end) return true;
+  } while (here != end);
+
+  return false;
+}
Index: /main/tags/2.38/gsdl/src/colservr/filter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/filter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/filter.h	(revision 21083)
@@ -0,0 +1,141 @@
+/**********************************************************************
+ *
+ * filter.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef FILTER_H
+#define FILTER_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+
+
+class filterclass {
+protected:
+  text_t gsdlhome;
+  text_t gdbmhome;
+  text_t collection;
+  text_t collectdir;
+
+  FilterOption_tmap filterOptions;
+
+public:
+  filterclass ();
+  virtual ~filterclass ();
+
+  // configure should be called once for each configuration line
+  // default configures the default filter options
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+
+  // init should be called after all the configuration is done but
+  // before any other methods are called
+  // default checks all the filter option defaults
+  virtual bool init (ostream &logout);
+
+  // returns the name of this filter
+  virtual text_t get_filter_name ();
+
+  // returns the current filter options
+  virtual void get_filteroptions (InfoFilterOptionsResponse_t &response,
+				  comerror_t &err, ostream &logout);
+
+  virtual void filter (const FilterRequest_t &request,
+		       FilterResponse_t &response,
+		       comerror_t &err, ostream &logout);
+};
+
+
+// The filterptr class does not 'own' the filter. The 
+// filter should be deleted by the code which created it.
+class filterptr {
+public:
+  filterclass *f;
+
+  filterptr () {f=NULL;}
+  ~filterptr () {}
+};
+
+bool operator==(const filterptr &x, const filterptr &y);
+bool operator<(const filterptr &x, const filterptr &y);
+
+
+typedef map<text_t, filterptr, lttext_t> filterptrmap;
+
+// contains a list of filters indexed by their name
+class filtermapclass {
+protected:
+  filterptrmap filterptrs;
+
+public:
+  // type support for filterptrmap
+  typedef filterptrmap::iterator iterator;
+  typedef filterptrmap::const_iterator const_iterator;
+  typedef filterptrmap::reference reference;
+  typedef filterptrmap::const_reference const_reference;
+  typedef filterptrmap::size_type size_type;
+
+  typedef filterptrmap::difference_type difference_type;
+  typedef filterptrmap::const_reverse_iterator const_reverse_iterator;
+  typedef filterptrmap::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return filterptrs.begin();}
+  const_iterator begin () const {return filterptrs.begin();}
+  iterator end () {return filterptrs.end();}
+  const_iterator end () const {return filterptrs.end();}
+
+  void erase(iterator pos) {filterptrs.erase(pos);}
+  void erase(iterator first, iterator last) {filterptrs.erase(first, last);}
+  filtermapclass &operator=(const filtermapclass &x) {filterptrs=x.filterptrs;return *this;}
+
+  bool empty () const {return filterptrs.empty();}
+  size_type size() const {return filterptrs.size();}
+
+
+  // added functionality
+  void clear () {filterptrs.erase(filterptrs.begin(),filterptrs.end());}
+
+  // thefilter remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addfilter (filterclass *thefilter);
+
+  // getfilter will return NULL if the filter could not be found
+  filterclass *getfilter (const text_t &key);
+};
+
+
+
+// some useful functions for dealing with document sets
+
+// intersect places the result in set1
+void intersect (text_tset &set1, const text_tset &set2);
+void intersect (text_tarray &set1, const text_tset &set2);
+void intersect (text_tarray &set1, const text_tarray &set2);
+
+// tests to see if el is in set
+bool in_set (const text_tset &set1, const text_t &el);
+bool in_set (const text_tarray &set1, const text_t &el);
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/maptools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/maptools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/maptools.cpp	(revision 21083)
@@ -0,0 +1,177 @@
+/**********************************************************************
+ *
+ * maptools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "maptools.h"
+
+
+
+void stringmap::clear () {
+  fromorder.erase (fromorder.begin(), fromorder.end());
+  mapfrom.erase (mapfrom.begin(), mapfrom.end());
+}
+
+void stringmap::importmap (const text_tarray &maparray) {
+  clear ();
+  
+  text_tarray::const_iterator here = maparray.begin();
+  text_tarray::const_iterator end = maparray.end();
+  text_t from;
+  text_t to;
+
+  while (here != end) {
+    splitmapentry (*here, from, to);
+    fromorder.push_back (from);
+    mapfrom[from] = to;
+    here++;
+  }
+}
+
+void stringmap::exportmap (text_tarray &maparray) const {
+  maparray.erase (maparray.begin(), maparray.end());
+
+  text_tarray::const_iterator here = fromorder.begin();
+  text_tarray::const_iterator end = fromorder.end();
+  text_tmap::const_iterator toptr;
+  text_t tempmap;
+
+  while (here != end) {
+    toptr = mapfrom.find (*here);
+    if (toptr != mapfrom.end()) {
+      joinmapentry ((*toptr).first, (*toptr).second, tempmap);
+      maparray.push_back (tempmap);
+    }
+
+    here++;
+  }
+}
+
+void stringmap::getfromarray (text_tarray &fromarray) const {
+  fromarray = fromorder;
+}
+
+void stringmap::gettoarray (text_tarray &toarray) const {
+  toarray.erase(toarray.begin(), toarray.end());
+
+  text_tarray::const_iterator here = fromorder.begin();
+  text_tarray::const_iterator end = fromorder.end();
+  text_tmap::const_iterator toptr;
+
+  while (here != end) {
+    toptr = mapfrom.find (*here);
+    if (toptr != mapfrom.end()) {
+      toarray.push_back((*toptr).second);
+    }
+    here++;
+  }
+}
+
+bool stringmap::fromexists (const text_t &from) const {
+  return (mapfrom.find (from) != mapfrom.end ());
+}
+
+bool stringmap::toexists (const text_t &to) const {
+  text_tarray::const_iterator here = fromorder.begin();
+  text_tarray::const_iterator end = fromorder.end();
+  text_tmap::const_iterator toptr;
+
+  while (here != end) {
+    toptr = mapfrom.find (*here);
+    if (toptr != mapfrom.end() && (*toptr).second == to) return true;
+    here++;
+  }
+  
+  // it was not found
+  return false;
+}
+
+bool stringmap::from2to (const text_t &from, text_t &to) const {
+  text_tmap::const_iterator toptr = mapfrom.find (from);
+  if (toptr == mapfrom.end()) {
+    to.clear();
+    return false;
+  }
+
+  to = (*toptr).second;
+  return true;
+}
+
+bool stringmap::to2from (const text_t &to, text_t &from) const {
+  text_tarray::const_iterator here = fromorder.begin();
+  text_tarray::const_iterator end = fromorder.end();
+  text_tmap::const_iterator toptr;
+
+  while (here != end) {
+    toptr = mapfrom.find (*here);
+    if (toptr != mapfrom.end() && (*toptr).second == to) {
+      from = (*toptr).first;
+      return true;
+    }
+    here++;
+  }
+  
+  // it was not found
+  from.clear();
+  return false;
+}
+
+
+
+void splitmapentry (const text_t &mapentry, text_t &from, text_t &to) {
+  from.clear ();
+  to.clear();
+
+  text_t::const_iterator here = mapentry.begin();
+  text_t::const_iterator end = mapentry.end();
+
+  // get the "from" part of the map
+  while (here != end) {
+    if (*here == '-') {
+      here++;
+      if (here != end && *here == '>') {
+	here++;
+	break; // found "->"
+      }
+
+      // didn't find "->"
+      from.push_back('-');
+
+    } else {
+      from.push_back(*here);
+      here++;
+    }
+  }
+
+  // get the "to" part of the map
+  while (here != end) {
+    to.push_back(*here);
+    here++;
+  }
+}
+
+void joinmapentry (const text_t &from, const text_t &to, text_t &mapentry) {
+  mapentry = from;
+  mapentry += "->";
+  mapentry += to;
+}
Index: /main/tags/2.38/gsdl/src/colservr/maptools.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/maptools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/maptools.h	(revision 21083)
@@ -0,0 +1,65 @@
+/**********************************************************************
+ *
+ * maptools.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef MAPTOOLS_H
+#define MAPTOOLS_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+// stringmap is a mapping which remembers the original order 
+// of the map, but is very fast to look up.
+class stringmap {
+protected:
+  text_tarray fromorder;
+  text_tmap mapfrom;
+
+public:
+  void clear ();
+
+  void importmap (const text_tarray &maparray);
+  void exportmap (text_tarray &maparray) const;
+
+  void getfromarray (text_tarray &fromarray) const;
+  void gettoarray (text_tarray &toarray) const;
+  
+  bool fromexists (const text_t &from) const;
+  bool toexists (const text_t &to) const;
+
+  // from2to and to2from return false if the key (the "from"
+  // field or the "to" field) cannot be found
+  bool from2to (const text_t &from, text_t &to) const;
+  bool to2from (const text_t &to, text_t &from) const;
+};
+
+
+// a few useful functions used by stringmap
+void splitmapentry (const text_t &mapentry, text_t &from, text_t &to);
+void joinmapentry (const text_t &from, const text_t &to, text_t &mapentry);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/mggdbmsource.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mggdbmsource.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mggdbmsource.cpp	(revision 21083)
@@ -0,0 +1,327 @@
+/**********************************************************************
+ *
+ * mggdbmsource.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "mggdbmsource.h"
+#include "fileutil.h"
+#include "OIDtools.h"
+#include "gsdltools.h"
+
+
+mggdbmsourceclass::mggdbmsourceclass () {
+  gdbmptr = NULL;
+  mgsearchptr = NULL;
+}
+
+mggdbmsourceclass::~mggdbmsourceclass () {
+  if (gdbmptr != NULL) delete gdbmptr;
+  if (mgsearchptr != NULL) delete mgsearchptr;
+}
+
+void mggdbmsourceclass::configure (const text_t &key, const text_tarray &cfgline) {
+  if (cfgline.size() >= 1) {
+    const text_t &value = cfgline[0];
+
+    if (key == "collection") collection = value;
+    else if (key == "collectdir") collectdir = value;
+    else if (key == "gsdlhome") gsdlhome = value;
+    else if (key == "gdbmhome") gdbmhome = value;
+  }
+
+  if (key == "indexmap") {
+    indexmap.importmap (cfgline);
+
+  } else if (key == "defaultindex") {
+    indexmap.from2to (cfgline[0], defaultindex);
+
+  } else if (key == "subcollectionmap") {
+    subcollectionmap.importmap (cfgline);
+
+  } else if (key == "defaultsubcollection") {
+    subcollectionmap.from2to (cfgline[0], defaultsubcollection);
+
+  } else if (key == "languagemap") {
+    languagemap.importmap (cfgline);
+
+  } else if (key == "defaultlanguage") 
+    languagemap.from2to (cfgline[0], defaultlanguage);
+}
+
+bool mggdbmsourceclass::init (ostream &logout) {
+  outconvertclass text_t2ascii;
+  
+  if (gdbmhome.empty()) gdbmhome = gsdlhome;
+
+  if (!sourceclass::init (logout)) return false;
+  
+  // get the collection directory name
+  if (collectdir.empty()) {
+    collectdir = filename_cat (gsdlhome, "collect", collection);
+  }
+  
+  // get the filename for the database and make sure it exists
+  gdbm_filename = filename_cat(gdbmhome, "collect", collection, "index", "text", collection);
+  if (littleEndian()) gdbm_filename += ".ldb";
+  else gdbm_filename += ".bdb";
+
+  if (!file_exists(gdbm_filename)) {
+    logout << text_t2ascii
+	   << "warning: gdbm database \"" //****
+	   << gdbm_filename << "\" does not exist\n\n";
+    // return false; //****
+  }
+  
+  return true;
+}
+
+bool mggdbmsourceclass::translate_OID (const text_t &OIDin, text_t &OIDout, 
+				       comerror_t &err, ostream &logout) {
+
+  outconvertclass text_t2ascii;
+
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: mggdbmsource contains a null gdbmclass\n\n";
+    err = configurationError;
+    return true;
+  }
+
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return true;
+  }
+
+  infodbclass info;
+  OIDout = gdbmptr->translate_OID (OIDin, info);
+  return true;
+}
+
+bool mggdbmsourceclass::get_metadata (const text_t &/*requestParams*/, const text_t &/*refParams*/, 
+				      bool getParents, const text_tset &fields, 
+				      const text_t &OID, MetadataInfo_tmap &metadata, 
+				      comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  metadata.erase(metadata.begin(), metadata.end());
+
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: mggdbmsource contains a null gdbmclass\n\n";
+    err = configurationError;
+    return true;
+  }
+
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return true;
+  }
+
+  // get the metadata - if getParents is set we need to get 
+  // info for all parents of OID as well as OID
+  vector<infodbclass> info_array;
+  text_tarray OIDs;
+  if (getParents) get_parents_array (OID, OIDs);
+  OIDs.push_back (OID);
+
+  text_tarray::const_iterator this_OID = OIDs.begin();
+  text_tarray::const_iterator end_OID = OIDs.end();
+
+  while (this_OID != end_OID) {
+    infodbclass info;
+    if (!gdbmptr->getinfo(*this_OID, info)) return false;
+
+    // adjust the metadata
+    text_t &contains = info["contains"];
+    if (contains.empty()) info["haschildren"] = 0;
+    else info["haschildren"] = 1;
+    contains.clear();
+
+    info_array.push_back(info);
+    this_OID ++;
+  }
+
+  // if fields set is empty we want to get all available metadata
+  text_tset tfields = fields;
+  if (tfields.empty() && !info_array.empty()) {
+    infodbclass::iterator t_info = info_array[0].begin(); 
+    infodbclass::iterator e_info = info_array[0].end(); 
+    while (t_info != e_info) {
+      if ((*t_info).first != "contains")
+	tfields.insert ((*t_info).first);
+      t_info ++;
+    }
+    tfields.insert ("hasnext");
+    tfields.insert ("hasprevious");
+  }
+    
+  // collect together the metadata
+  bool donenextprevtest = false;
+  bool hasnext=false, hasprevious=false;
+  MetadataInfo_t this_metadata;
+  text_tarray *pos_metadata;
+  text_tset::const_iterator fields_here = tfields.begin();
+  text_tset::const_iterator fields_end = tfields.end();
+
+  while (fields_here != fields_end) {
+    this_metadata.clear();
+    this_metadata.isRef = false;
+
+    vector<infodbclass>::reverse_iterator this_info = info_array.rbegin(); 
+    vector<infodbclass>::reverse_iterator end_info = info_array.rend(); 
+    MetadataInfo_t *tmetaptr = &this_metadata;
+    while (this_info != end_info) {
+
+      pos_metadata = (*this_info).getmultinfo(*fields_here);
+      if ((*fields_here == "hasnext" || *fields_here == "hasprevious")) {
+	
+	// collect metadata
+	if (!donenextprevtest) {
+	  donenextprevtest = true;
+	  
+	  // cache parent contents array
+	  text_t thisparent = get_parent (OID);
+	  if (!thisparent.empty()) {
+	    if (thisparent != parentOID) {
+	      parentOID = thisparent;
+	      parentcontents.erase(parentcontents.begin(), parentcontents.end());
+	      if (gdbmptr->getinfo(parentOID, parentinfo)) {
+		text_t &parentinfocontains = parentinfo["contains"];
+		if (!parentinfocontains.empty())
+		  splitchar (parentinfocontains.begin(), parentinfocontains.end(), 
+			     ';', parentcontents);
+	      }
+	    }
+	    
+	    // do tests
+	    text_tarray::const_iterator parentcontents_here = parentcontents.begin();
+	    text_tarray::const_iterator parentcontents_end = parentcontents.end();
+	    text_t shrunk_OID = OID;
+	    shrink_parent (shrunk_OID);
+	    while (parentcontents_here != parentcontents_end) {
+	      if (*parentcontents_here == shrunk_OID) {
+		if (parentcontents_here == parentcontents.begin()) hasprevious = false;
+		else hasprevious = true;
+		
+		parentcontents_here++;
+		
+		if (parentcontents_here == parentcontents.end()) hasnext = false;
+		else hasnext = true;
+		
+		break;
+	      }  
+	      
+	      parentcontents_here ++;
+	    }
+	 
+	    // fill in metadata
+	    if ((*fields_here == "hasnext" && hasnext) ||
+		(*fields_here == "hasprevious" && hasprevious))
+	      tmetaptr->values.push_back("1");
+	    else
+	      tmetaptr->values.push_back("0");
+	  } else
+	    tmetaptr->values.push_back("0");
+	}
+      }
+      else if (pos_metadata != NULL && *fields_here != "contains") {
+	tmetaptr->values = *pos_metadata;
+      }
+      else
+	tmetaptr->values.push_back("");
+
+      this_info ++;
+      if (this_info != end_info) {
+	tmetaptr->parent = new MetadataInfo_t();
+	tmetaptr = tmetaptr->parent;
+      }
+    }
+    metadata[*fields_here] = this_metadata;
+    fields_here++;
+  }
+  return true;
+}
+
+
+bool mggdbmsourceclass::get_document (const text_t &OID, text_t &doc, 
+				      comerror_t &err, ostream &logout) {
+
+  outconvertclass text_t2ascii;
+
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: mggdbmsource contains a null gdbmclass\n\n";
+    err = configurationError;
+    return true;
+  }
+
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return true;
+  }
+
+  text_t tOID = OID;
+  if (needs_translating (OID)) 
+    translate_OID (OID, tOID, err, logout);
+  infodbclass info;
+  if (!gdbmptr->getinfo(tOID, info)) return false;
+  
+  if (info["hastxt"].getint() == 1) {
+    int docnum = info["docnum"].getint();
+    
+    // set the collection directory
+    mgsearchptr->setcollectdir (collectdir);
+    
+    // get the text
+    mgsearchptr->docTargetDocument(defaultindex, defaultsubcollection,
+				   defaultlanguage, collection, docnum, doc);
+  }
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/colservr/mggdbmsource.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mggdbmsource.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mggdbmsource.h	(revision 21083)
@@ -0,0 +1,88 @@
+/**********************************************************************
+ *
+ * mggdbmsource.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef MGGDBMSOURCE_H
+#define MGGDBMSOURCE_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+#include "infodbclass.h"
+#include "maptools.h"
+#include "search.h"
+#include "source.h"
+
+
+class mggdbmsourceclass : public sourceclass {
+protected:
+  text_t gsdlhome;
+  text_t gdbmhome;
+  text_t collection;
+  text_t collectdir;
+
+  // these maps are only needed to convert the default indexes
+  stringmap indexmap;
+  stringmap subcollectionmap;
+  stringmap languagemap;
+
+  text_t defaultindex;
+  text_t defaultsubcollection;
+  text_t defaultlanguage;
+
+  text_t parentOID;
+  infodbclass parentinfo;
+  text_tarray parentcontents;
+
+  text_t gdbm_filename;
+  gdbmclass *gdbmptr;
+  
+  searchclass *mgsearchptr;
+
+public:
+  mggdbmsourceclass ();
+  virtual ~mggdbmsourceclass ();
+
+  // the gdbmptr remains the responsability of the calling code
+  void set_gdbmptr (gdbmclass *thegdbmptr) {gdbmptr=thegdbmptr;}
+
+  // the mgsearchptr remains the responsability of the calling code
+  void set_mgsearchptr (searchclass *themgsearchptr) {mgsearchptr=themgsearchptr;}
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+  bool init (ostream &logout);
+  bool translate_OID (const text_t &OIDin, text_t &OIDout, 
+		      comerror_t &err, ostream &logout);
+  bool get_metadata (const text_t &requestParams, const text_t &refParams, 
+		     bool getParents, const text_tset &fields, 
+		     const text_t &OID, MetadataInfo_tmap &metadata, 
+		     comerror_t &err, ostream &logout);
+  bool get_document (const text_t &OID, text_t &doc, 
+		     comerror_t &err, ostream &logout);
+};
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.cpp	(revision 21083)
@@ -0,0 +1,372 @@
+/**********************************************************************
+ *
+ * queryfilter.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+
+#include "mgppqueryfilter.h"
+#include "fileutil.h"
+#include <assert.h>
+#include "mgppsearch.h"
+
+/////////////////////////////////
+// functions for queryfilterclass
+/////////////////////////////////
+
+
+mgppqueryfilterclass::mgppqueryfilterclass () 
+  : queryfilterclass() {
+
+  
+  FilterOption_t filtopt;
+  
+  // -- onePerTerm  Level          enumerated
+  // Document, Section, Paragraph
+  filtopt.clear();
+  filtopt.name = "Level";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.validValues.push_back("Document");
+  filtopt.defaultValue = "Document";
+  filterOptions["Level"] = filtopt;
+
+  // --  IndexField, enumerated, used to list available fields
+  // ZZ used to represent "AllFields"
+  filtopt.clear();
+  filtopt.name = "IndexField";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.validValues.push_back("ZZ");
+  filtopt.defaultValue = "ZZ";
+  filterOptions["IndexField"] = filtopt;
+
+}
+
+mgppqueryfilterclass::~mgppqueryfilterclass () {
+}
+
+
+//whether a query is a full text browse
+bool mgppqueryfilterclass::full_text_browse (int filterRequestOptions) {
+  return (filterRequestOptions & FRfullTextBrowse);
+}
+
+void mgppqueryfilterclass::configure (const text_t &key, const text_tarray &cfgline) {
+  queryfilterclass::configure(key, cfgline);
+
+  if (key == "indexfieldmap") {
+    indexfieldmap.importmap (cfgline);
+    
+    // update the list of indexes in the filter information
+    text_tarray options;
+    indexfieldmap.gettoarray (options);
+
+    text_tarray::const_iterator here = options.begin();
+    text_tarray::const_iterator end = options.end();
+    
+    while (here !=end) {
+      if (!(*here).empty())
+	filterOptions["IndexField"].validValues.push_back(*here);
+      here++;
+    }
+  }
+
+  if (key == "levels") {
+    text_tarray::const_iterator here = cfgline.begin();
+    text_tarray::const_iterator end = cfgline.end();
+
+    while (here != end) {
+      if (!(*here).empty()) {
+	filterOptions["Level"].validValues.push_back(*here);
+	if ((*here) == "Section") {
+	  text_t sect = "Section";
+	  ((mgppsearchclass *)mgsearchptr)->set_gdbm_level(sect);
+	}
+
+      }
+      here++;
+    }
+    
+  }
+}
+
+
+void mgppqueryfilterclass::filter(const FilterRequest_t &request,
+				  FilterResponse_t &response,
+				  comerror_t &err, ostream &logout) {  
+
+
+  outconvertclass text_t2ascii;
+
+  response.clear ();
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: queryfilter contains a null gdbmclass\n\n";
+    err = configurationError;
+    return;
+  }
+  if (mgsearchptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: queryfilter contains a null mgppsearchclass\n\n";
+    err = configurationError;
+    return;
+  }
+  if (full_text_browse(request.filterResultOptions)) {
+    browsefilter(request, response, err, logout);
+    return;
+  }
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return;
+  }
+
+
+  // get the query parameters
+  int startresults, endresults;
+  text_t phrasematch; // not used here any more
+  vector<queryparamclass> queryfilterparams;
+  parse_query_params (request, queryfilterparams, startresults, 
+		      endresults, phrasematch, logout);  
+ 
+   
+  // do query
+  queryresultsclass queryresults;
+  do_multi_query (request, queryfilterparams, queryresults, err, logout);
+  if (err != noError) return;
+  
+  // assemble document results
+  if (need_matching_docs (request.filterResultOptions)) {
+    
+    int resultnum = 1;
+    ResultDocInfo_t resultdoc;
+    text_t trans_OID;
+    vector<int>::iterator docorder_here = queryresults.docs.docorder.begin();
+    vector<int>::iterator docorder_end = queryresults.docs.docorder.end();
+
+    if (endresults == -1) endresults = MAXNUMDOCS;
+    while (docorder_here != docorder_end) {
+      if (resultnum > endresults) break;
+      
+      // translate the document number
+      if (!translate(gdbmptr, *docorder_here, trans_OID)) {
+	logout << text_t2ascii
+	       << "warning: could not translate mgpp document number \""
+	       << *docorder_here << "\"to OID.\n\n";
+	
+      } else {
+	docresultmap::iterator docset_here = queryresults.docs.docset.find (*docorder_here);
+
+	// see if there is a result for this number,
+	// if it is in the request set (or the request set is empty)
+	if (docset_here != queryresults.docs.docset.end() &&
+	    (request.docSet.empty() || in_set(request.docSet, trans_OID))) {
+	  if (resultnum >= startresults) {
+	    // add this document
+	    resultdoc.OID = trans_OID;
+	    resultdoc.result_num = resultnum;
+	    resultdoc.ranking = (int)((*docset_here).second.docweight * 10000.0 + 0.5);
+
+	    response.docInfo.push_back (resultdoc);
+	  }
+	  
+	  resultnum++;
+	}
+      } // else
+      
+      docorder_here++;
+    }
+  } // if need matching docs
+
+  // assemble the term results
+  if (need_term_info(request.filterResultOptions)) {
+    // note: the terms have already been sorted and uniqued - ?? have they??
+
+    TermInfo_t terminfo;
+    bool terms_first = true;
+
+    termfreqclassarray::iterator terms_here = queryresults.terms.begin();
+    termfreqclassarray::iterator terms_end = queryresults.terms.end();
+
+    while (terms_here != terms_end) {
+      terminfo.clear();
+      terminfo.term = (*terms_here).termstr;
+      terminfo.freq = (*terms_here).termfreq;
+
+      // this bit gets the matchTerms ie the equivalent (stem/casefold) terms
+      if (terms_first) {
+	text_tset::iterator termvariants_here = queryresults.termvariants.begin();
+	text_tset::iterator termvariants_end = queryresults.termvariants.end();
+	while (termvariants_here != termvariants_end) {
+	  terminfo.matchTerms.push_back (*termvariants_here);
+	  termvariants_here++;
+	}
+      }
+      terms_first = false;
+      
+      response.termInfo.push_back (terminfo);
+
+      terms_here++;
+    }
+  }
+
+  response.numDocs = queryresults.docs_matched;
+  response.isApprox = queryresults.is_approx;
+}
+
+void mgppqueryfilterclass::browsefilter(const FilterRequest_t &request,
+					FilterResponse_t &response,
+					comerror_t &err, ostream &logout) {  
+
+  outconvertclass text_t2ascii;
+
+  // get the query parameters
+  int startresults, endresults;
+  text_t phrasematch; // not used here any more, just have it so can use
+                      // parse_query_params function
+  
+  vector<queryparamclass> queryfilterparams;
+  parse_query_params (request, queryfilterparams, startresults, 
+		      endresults, phrasematch, logout);  
+
+    vector<queryparamclass>::const_iterator query_here = queryfilterparams.begin();
+   
+  // do query
+  queryresultsclass queryresults;
+  queryresults.clear();
+  
+  int numDocs = endresults-startresults;
+  mgsearchptr->setcollectdir (collectdir);
+
+  if (!((mgppsearchclass*)mgsearchptr)->browse_search((*query_here), startresults, numDocs, queryresults)) {
+    // most likely a system problem
+    logout << text_t2ascii
+	   << "system problem: could not do full text browse with mgpp for index \""
+	   << (*query_here).index << (*query_here).subcollection
+	   << (*query_here).language << "\".\n\n";
+    err = systemProblem;
+    return;
+  }
+
+  // assemble the term results
+  TermInfo_t terminfo;
+  
+  termfreqclassarray::iterator terms_here = queryresults.terms.begin();
+  termfreqclassarray::iterator terms_end = queryresults.terms.end();
+
+  while (terms_here != terms_end) {
+    terminfo.clear();
+    terminfo.term = (*terms_here).termstr;
+    terminfo.freq = (*terms_here).termfreq;
+    
+    response.termInfo.push_back (terminfo);
+
+    terms_here++;
+  }
+  
+
+}
+
+// mgppsearchptr and gdbmptr are assumed to be valid
+void mgppqueryfilterclass::do_multi_query (const FilterRequest_t &request,
+					   const vector<queryparamclass> &query_params,
+					   queryresultsclass &multiresults,
+					   comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  err = noError;
+  mgsearchptr->setcollectdir (collectdir);
+  multiresults.clear();
+  
+  vector<queryparamclass>::const_iterator query_here = query_params.begin();
+  vector<queryparamclass>::const_iterator query_end = query_params.end();
+  while (query_here != query_end) {
+    queryresultsclass thisqueryresults;
+    text_t indx((*query_here).index);
+    if (!mgsearchptr->search((*query_here), thisqueryresults)) {
+      // most likely a system problem
+      logout << text_t2ascii
+	     << "system problem: could not do search with mgpp for index \""
+	     << (*query_here).index << (*query_here).subcollection
+	     << (*query_here).language << "\".\n\n";
+      err = systemProblem;
+      return;
+    }
+
+    // combine the results
+    if (need_matching_docs (request.filterResultOptions)) {
+            
+      if (query_params.size() == 1) {
+	multiresults.docs = thisqueryresults.docs; // just one set of results
+	multiresults.docs_matched = thisqueryresults.docs_matched;
+	multiresults.is_approx = thisqueryresults.is_approx;
+	
+      } else {
+	if ((*query_here).combinequery == "and") {
+	  multiresults.docs.combine_and (thisqueryresults.docs);
+	} else if ((*query_here).combinequery == "or") {
+	  multiresults.docs.combine_or (thisqueryresults.docs);
+	} else if ((*query_here).combinequery == "not") {
+	  multiresults.docs.combine_not (thisqueryresults.docs);
+	}
+	multiresults.docs_matched = multiresults.docs.docset.size();
+	multiresults.is_approx = Exact;
+      }
+    }
+
+    // combine the term information 
+    if (need_term_info (request.filterResultOptions)) {
+      // append the terms
+      multiresults.orgterms.insert(multiresults.orgterms.end(),
+				   thisqueryresults.orgterms.begin(),
+				   thisqueryresults.orgterms.end());
+
+      
+      // add the term variants - 
+      text_tset::iterator termvar_here = thisqueryresults.termvariants.begin();
+      text_tset::iterator termvar_end = thisqueryresults.termvariants.end();
+      while (termvar_here != termvar_end) {
+	multiresults.termvariants.insert(*termvar_here);
+	termvar_here++;
+      }
+    }
+   
+    query_here++;
+  }
+
+  // sort and unique the query terms
+  multiresults.sortuniqqueryterms ();
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgppqueryfilter.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**********************************************************************
+ *
+ * mgppqueryfilter.h -- new queryfilter to use mgpp 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef MGPPQUERYFILTER_H
+#define MGPPQUERYFILTER_H
+
+#include "queryfilter.h"
+
+class mgppqueryfilterclass : public queryfilterclass {
+protected:
+
+  stringmap indexfieldmap;
+  bool full_text_browse (int filterRequestOptions);
+
+  // mgsearchptr and gdbmptr are assumed to be valid
+  void do_multi_query (const FilterRequest_t &request,
+		       const vector<queryparamclass> &query_params,
+		       queryresultsclass &multiresults,
+		       comerror_t &err, ostream &logout);
+
+
+public:
+  mgppqueryfilterclass ();
+  virtual ~mgppqueryfilterclass ();
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  void filter (const FilterRequest_t &request,
+		       FilterResponse_t &response,
+		       comerror_t &err, ostream &logout);
+  
+  void browsefilter(const FilterRequest_t &request,
+		    FilterResponse_t &response,
+		    comerror_t &err, ostream &logout);  
+
+
+};
+
+#endif
+
+
+
Index: /main/tags/2.38/gsdl/src/colservr/mgppsearch.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgppsearch.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgppsearch.cpp	(revision 21083)
@@ -0,0 +1,308 @@
+/**********************************************************************
+ *
+ * mgppsearch.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#include "gsdlconf.h"
+#include "mgppsearch.h"
+#include "fileutil.h"
+#include "GSDLQueryParser.h"
+#include "MGQuery.h"
+#include "TextGet.h"
+#include "queryinfo.h"
+
+
+
+static text_t getindexsuffix(const queryparamclass &qp) {
+  text_t indexsuffix = "index";
+  text_t ind = qp.index;
+  text_t sub = qp.subcollection;
+  text_t lang = qp.language;
+   
+  indexsuffix = filename_cat(indexsuffix, ind + sub + lang, qp.collection);
+  return indexsuffix;
+
+}
+
+////////////////////
+// mgppsearch class //
+////////////////////
+
+mgppsearchclass::mgppsearchclass ()
+  : searchclass() {
+
+  gdbm_level = "Document";
+}
+
+mgppsearchclass::~mgppsearchclass () 
+{
+  if (cache != NULL) 
+    {
+      delete cache;
+      cache = NULL;
+    }
+
+  if (indexData !=NULL) {
+    indexData->UnloadData();
+    delete indexData;
+    indexData = NULL;
+  }
+  
+}
+
+void mgppsearchclass::set_gdbm_level(text_t &level) {
+  gdbm_level = level;
+  
+}
+
+bool mgppsearchclass::search(const queryparamclass &queryparams, 
+			     queryresultsclass &queryresult) {
+ 
+#ifdef __WIN32__
+  char basepath[]="";
+#else
+  char basepath[] = "/";
+#endif
+ 
+  char *indexname = (filename_cat(collectdir, getindexsuffix(queryparams))).getcstr(); 
+
+ // load index data
+  if (indexData == NULL) {
+    indexData = new IndexData();
+  }
+  if (!indexData->LoadData (basepath, indexname)) {
+    cerr<<"couldn't load index data\n"<<endl;
+    return false;
+  }
+
+  // set default stem method from values originally set on prefs page
+  int defaultStemMethod = 0;
+  if (queryparams.casefolding) {
+    defaultStemMethod |= 1;
+  }
+  if (queryparams.stemming) {
+    defaultStemMethod |= 2;
+  }
+  
+  // set default Boolean combiner from all/some setting
+  // if match_mode == 1, ie all, default=1 ie AND
+  // if match_mode == 0, ie some, default=0, ie OR
+  int defaultBoolCombine = 0;
+  if (queryparams.match_mode){
+    defaultBoolCombine = 1;
+  }
+
+  // use default query info settings - change to reflect user preferences??
+  QueryInfo queryInfo;
+  SetCStr (queryInfo.docLevel, (queryparams.level.getcstr())); 
+  queryInfo.maxDocs = (unsigned long)queryparams.maxdocs;
+  queryInfo.sortByRank = (queryparams.search_type == 1);
+  queryInfo.exactWeights = false;
+  queryInfo.needRankInfo = true; // used for overall term freq as well as ranking
+  queryInfo.needTermFreqs = true;
+  
+  ExtQueryResult queryResult;
+  
+  UCArray queryArray;
+  SetCStr(queryArray, (queryparams.querystring.getcstr()));
+  
+  // create the mgpp query tree
+  QueryNode *queryTree = NULL;
+  queryTree = ParseQuery(queryArray, defaultBoolCombine, defaultStemMethod);
+    
+  UCArray level;
+  UCArrayClear(level);
+  
+  //set the level for results
+  SetCStr(level, gdbm_level.getcstr());
+
+  
+  // do the query
+  MGQuery(*indexData, queryInfo, queryTree, queryResult, level);
+  
+ 
+  // convert ExtQueryResult to queryresultclass
+  
+  queryresult.docs_matched = (int)queryResult.docs.size();
+
+  if (queryresult.docs_matched == (int)queryResult.actualNumDocs) {
+    queryresult.is_approx = Exact; 
+  }
+  else if (queryresult.docs_matched < (int)queryResult.actualNumDocs) {
+    queryresult.is_approx = MoreThan;
+  }
+  else {
+    queryresult.is_approx = Approximate;
+  }
+
+  docresultclass doc;
+  for (int i=0; i<(int)queryResult.docs.size(); i++) {
+    doc.clear();
+    doc.docnum = (int)queryResult.levels[i];
+    doc.docweight = queryResult.ranks[i];
+    queryresult.docs.docset[doc.docnum] = doc;
+    queryresult.docs.docorder.push_back(doc.docnum);
+
+  }
+
+  // term info
+  termfreqclass term;
+  for (int k=0; k<(int)queryResult.termFreqs.size(); k++) {
+    term.clear();
+    term.termstr = GetCStr(queryResult.termFreqs[k].term);
+    term.termstemstr = term.termstr;
+    term.termfreq = queryResult.termFreqs[k].termFreq;
+    queryresult.terms.push_back(term);
+    queryresult.orgterms.push_back(term); // should this change??
+    
+    for (int j=0; j<(int)queryResult.termFreqs[k].equivTerms.size(); j++) {
+      queryresult.termvariants.insert(GetCStr(queryResult.termFreqs[k].equivTerms[j]));
+    }
+
+  }
+  // clean up
+  delete indexname;
+  return true;
+
+}
+
+
+bool mgppsearchclass::browse_search(const queryparamclass &queryparams, int start, int numDocs,
+				    queryresultsclass &queryresult) {
+
+#ifdef __WIN32__
+  char basepath[]="";
+#else
+  char basepath[] = "/";
+#endif
+
+  char *indexname = (filename_cat(collectdir, getindexsuffix(queryparams))).getcstr();
+ 
+  if (indexData == NULL) {
+    indexData = new IndexData();
+  }
+  if (!indexData->LoadData (basepath, indexname)) {
+    cerr<<"couldn't load index data\n"<<endl;
+    return false;
+  }
+
+  UCArray level;
+  UCArrayClear(level);
+  
+  //browse always at top level
+  SetCStr(level, "Document");
+  
+
+  BrowseQueryNode browseNode;
+  browseNode.startPosition = start;
+  browseNode.numTerms = numDocs;
+
+  BrowseQueryResult browseResult;
+
+  UCArrayClear(browseNode.term);
+  SetCStr(browseNode.term, (queryparams.querystring.getcstr()));
+
+  // do the actual query
+  MGBrowseQuery(*indexData, level, browseNode, browseResult);
+
+  // load results into term info
+  termfreqclass term;
+  for (int i=0; i<(int)browseResult.termFreqs.size(); i++) {
+    term.clear();
+    term.termstr = GetCStr(browseResult.termFreqs[i].term);
+    term.termstemstr = term.termstr;
+    term.termfreq = browseResult.termFreqs[i].termFreq;
+    queryresult.terms.push_back(term);
+    queryresult.orgterms.push_back(term);
+
+  }
+  // clean up
+  delete indexname;
+
+  return true;
+}
+
+// the document text for 'docnum' is placed in 'output'
+// docTargetDocument returns 'true' if it was able to
+// try to get a document
+// collection is needed to see if an index from the 
+// collection is loaded. THe default index bits are just there cos
+// the mg version needs them
+
+bool mgppsearchclass::docTargetDocument(const text_t &/*defaultindex*/,
+					const text_t &/*defaultsubcollection*/,
+					const text_t &/*defaultlanguage*/,
+					const text_t &collection,
+					int docnum,
+					text_t &output) {
+  
+#ifdef __WIN32__
+  char basepath[]="";
+#else
+  char basepath[] = "/";
+#endif
+   char *textname = (filename_cat(collectdir, "index", "text", collection)).getcstr();;
+ 
+  TextData textdata;
+  if(!textdata.LoadData(basepath, textname)) {
+    cout<<"couldn't load text data\n"<<endl;
+    return false;
+  }
+  UCArray doctext;
+  UCArray level;
+  SetCStr(level, gdbm_level.getcstr());
+  if (!GetDocText(textdata, level, (unsigned long)docnum, doctext)) {
+    cout<<"couldn't retrieve document text\n";
+    return false;
+  }
+
+  // convert UCArray to text_t
+  output.clear();
+  output = GetCStr(doctext);
+
+  // here need to remove the <Document>, <Section>, <Paragraph> tags
+
+  // mg converts to unicode, this may need to be added here???
+
+  //clean up
+  textdata.UnloadData ();
+  delete textname;
+
+  return true;
+
+}
+
+// used to clear any cached databases for persistent versions of 
+// Greenstone like the Windows local library
+void mgppsearchclass::unload_database () {
+
+  if (indexData !=NULL) {
+    indexData->UnloadData();
+  }
+}
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/colservr/mgppsearch.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgppsearch.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgppsearch.h	(revision 21083)
@@ -0,0 +1,93 @@
+/**********************************************************************
+ *
+ * mgppsearch.h -- implementation of search class for mgpp
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * 
+ *
+ *********************************************************************/
+
+
+#ifndef MGPPSEARCH_H
+#define MGPPSEARCH_H
+
+#include "search.h"
+#include "IndexData.h"
+
+class mgppsearchclass : public searchclass {
+public:
+  mgppsearchclass ();
+  virtual ~mgppsearchclass ();
+
+  virtual text_t get_mg_type() {return "mgpp";}
+
+  // the search results are returned in queryresults
+  // search returns 'true' if it was able to do a search
+  virtual bool search(const queryparamclass &queryparams, 
+	      queryresultsclass &queryresults);
+  
+  // this returns a list of terms in queryresults - no document info is returned
+  // returns a list of numTerms terms, starting from the query string term (in queryparams)
+  // + start. used for full text browsing
+  virtual bool browse_search(const queryparamclass &queryparams, int start, int numTerms,
+			     queryresultsclass &queryresults);
+
+  // the document text for 'docnum' is placed in 'output'
+  // docTargetDocument returns 'true' if it was able to
+  // try to get a document
+  // collection is needed to see if an index from the 
+  // collection is loaded. If no index has been loaded
+  // defaultindex is needed to load one
+  virtual bool docTargetDocument(const text_t &defaultindex,
+			 const text_t &defaultsubcollection,
+			 const text_t &defaultlanguage,
+			 const text_t &collection,
+			 int docnum,
+			 text_t &output);
+
+  /*  // same as docTargetDocument except the document is returned
+  // in its raw form. UDoc remains the property of mg and may
+  // be destroyed on the next call to mg.
+  // not implemented for mgpp
+  virtual bool mgdocument (const text_t &defaultindex,
+		   const text_t &defaultsubcollection,
+		   const text_t &defaultlanguage,
+		   const text_t &collection,
+		   int docnum,
+		   char *&UDoc, int &ULen);
+  */
+  void set_gdbm_level(text_t &level);
+
+  // used to clear any cached databases for persistent versions of 
+  // Greenstone like the Windows local library
+  void unload_database ();
+ protected:
+  text_t gdbm_level; // the level used in gdbm file (usu. Section, but may be 
+                     // Document)
+
+  IndexData *indexData; // the index data structure needed for MGQuery - keep
+  // as a cache
+
+};
+
+
+#endif
+
Index: /main/tags/2.38/gsdl/src/colservr/mgq.c
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgq.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgq.c	(revision 21083)
@@ -0,0 +1,731 @@
+/**********************************************************************
+ *
+ * mgq.c -- cut-dowm version of mgquery
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "mgq.h"
+
+
+#include <stdio.h>
+#include <string.h>
+/* #include <io.h> */
+#include <fcntl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+#include "sysfuncs.h"
+  
+#include "messages.h"
+#include "memlib.h"
+  
+#include "invf.h"
+#include "text.h"
+#include "lists.h"
+#include "backend.h"
+#include "environment.h"
+#include "globals.h"
+#include "mg_errors.h"
+#include "commands.h"
+#include "text_get.h"
+#include "term_lists.h"
+#include "local_strings.h"
+
+#include "words.h"
+#include "stemmer.h"
+#include "stem_search.h"
+  
+#ifdef __cplusplus
+}
+#endif
+
+
+#include "mgq.h"
+
+/* get a reasonable database cache size */
+#ifndef MAXNUMDATABASEINFO
+#  ifdef GSDLSERVER
+#    define MAXNUMDATABASEINFO 10
+#  else
+#    define MAXNUMDATABASEINFO 2
+#  endif
+#endif
+
+#define MAXCOLLECTIONLEN  16
+#define MAXMGDIRLEN       256
+#define MAXGENSUFFIXLEN   256
+#define MAXTEXTSUFFIXLEN  256
+
+typedef struct DatabaseInfo {
+  int accessnum; /* -1 = invalid record */
+  char collection[MAXCOLLECTIONLEN];
+  char mgdir[MAXMGDIRLEN];
+  char gensuffix[MAXGENSUFFIXLEN];
+  char textsuffix[MAXTEXTSUFFIXLEN];
+  query_data *qd;
+} DatabaseInfo;
+
+
+/* globals needed by some vague part of mg... */
+FILE *OutFile = NULL, *InFile = NULL;
+int OutPipe = 0, InPipe = 0;
+int Quitting = 0;
+
+/* globals needed to handle loading of databases */
+static int cur_cachenum = -1;
+
+/* globals needed by the database cache */
+static DatabaseInfo dbcache[MAXNUMDATABASEINFO];
+static int cache_nextaccessnum = 0;
+static int cache_numloaded = 0;
+
+
+
+#if defined(PARADOCNUM) ||  defined(NZDL)
+static int GetDocNumFromParaNum(query_data *qd, int paranum) {
+  int Documents = qd->td->cth.num_of_docs;
+  int *Paragraph = qd->paragraph;
+  int low = 1, high = Documents;
+  int mid = (low+high)/2;
+
+  while ((mid = (low+high)/2) >=1 && mid <= Documents)
+    {
+      if (paranum > Paragraph[mid])
+        low = mid+1;
+      else if (paranum <= Paragraph[mid-1])
+        high = mid-1;
+      else
+        return mid;
+    }
+  FatalError(1, "Bad paragraph number.\n");
+  return 0;
+}
+
+static int GetParaNumFromDocNum(query_data *qd, int docnum) {
+  int Documents = qd->td->cth.num_of_docs;
+  int *Paragraph = qd->paragraph;
+
+  if (docnum > 0 && docnum <= Documents)
+    return Paragraph[docnum-1]+1;
+  return 0;
+}
+#endif
+
+
+/*****************************************************************************/
+
+static void MGQError(char *emsg)
+{
+  fprintf(stderr,"Fatal error: %s\n", emsg);
+  exit(1);
+}
+
+static int ProcessDocs (query_data * qd, int skip, int howmany, 
+			enum result_kinds kind, 
+			int (*sender)(char *,int,int,float,void *), void *ptr) {
+  int max_buf = 0, output_failure = 0;
+  int DocCount = 0;
+  int need_text = (kind == result_docs);
+
+  /* skip the requested number of documents */
+  while (skip > 0) {
+    if (!NextDoc(qd)) return 0;
+    skip--;
+  }
+
+  /* find out the maximum size for the text buffer */
+  if (need_text) max_buf = atoi (GetDefEnv ("buffer", "1048576"));
+
+  /* process each document */
+  do {
+    u_char *UDoc = NULL;
+    unsigned long ULen=0;
+
+#if defined(PARADOCNUM) ||  defined(NZDL)
+    /* adjust the document number for paragraph level result_docs */
+    /* this is a bit of a hack ... */
+    if (kind==result_docs && qd->id->ifh.InvfLevel == 3 &&
+	qd->DL != NULL && (int)qd->doc_pos < (int)qd->DL->num)
+      qd->DL->DE[qd->doc_pos].DocNum = GetParaNumFromDocNum(qd, qd->DL->DE[qd->doc_pos].DocNum);
+#endif
+    
+    if (need_text) {
+      /* load the compressed text */
+      if (LoadCompressedText (qd, max_buf))
+	MGQError("Unable to load compressed text(memory?).");
+
+      /* uncompress the loaded text */
+      UDoc = GetDocText (qd, &ULen);
+      if (UDoc == NULL) MGQError("UDoc is unexpectedly NULL");
+    }
+      
+    if (UDoc != NULL  ||  kind == result_docnums) {
+      int docnum = GetDocNum(qd);
+#if defined(PARADOCNUM) ||  defined(NZDL)
+      if (qd->id->ifh.InvfLevel == 3) docnum = GetDocNumFromParaNum(qd, docnum);
+#endif
+      switch (kind) {
+      case result_docnums:
+	if (sender != NULL)
+	  output_failure = (*sender)("",0,docnum,GetDocWeight(qd),ptr);
+	break;
+      case result_docs:
+	if (sender != NULL)
+	  output_failure = (*sender)((char *)UDoc,ULen,docnum,GetDocWeight(qd),ptr);
+	break;
+      default:
+	break;
+      }
+    }
+    DocCount++;
+      
+  } while (NextDoc (qd) && output_failure == 0 && --howmany > 0);
+  
+  /*  if (need_text) FreeTextBuffer (qd);*/
+  
+  return (DocCount);
+}
+
+
+static void send_query_term_freqs(QueryTermList *qtl,
+				  int (*sender)(char *,int,int,float,void *), void *ptr)
+{
+  int i = 0;
+  for (i = 0; i < qtl->num; i++)
+    if (sender != NULL) {
+      /*      word = word2str(qtl->QTE[i].Term); 
+	      (* sender)(word, strlen(word), qtl->QTE[i].Count, (float)0.0, ptr); */
+      (* sender)((char *)(qtl->QTE[i].Term+1), qtl->QTE[i].Term[0], 
+		 qtl->QTE[i].Count, (float)0.0, ptr);
+    }
+}
+
+
+static void send_terms (TermList * qtl, 
+			int (*sender)(char *,int,int,float,void *), void *ptr)
+{
+  int i = 0;
+  if (sender == NULL) return;
+  for (i = 0; i < qtl->num; i++)
+    {
+      /*      word = word2str(qtl->TE[i].Word);
+	      (* sender)(word, strlen(word), qtl->TE[i].Count, (float)0.0, ptr);*/
+      (* sender)((char *)(qtl->TE[i].Word+1), qtl->TE[i].Word[0], 
+		 qtl->TE[i].Count, (float)0.0, ptr);
+    }
+}
+
+
+/* MoreDocs () */
+/* Displays all documents in list  DocList. */
+/* Documents are fetched, then decompressed and displayed according to the */
+/* format implied in  FormString(). */
+
+static void
+MoreDocs (query_data * qd, enum result_kinds kind, 
+	  int skip, int howmany,
+	  int (*sender)(char *,int,int,float,void *), void *ptr)
+{
+  qd->num_of_ans = qd->DL->num;
+  switch (kind) {
+  case result_docs:
+  case result_docnums:
+    if (qd->num_of_ans > 0)
+      ProcessDocs (qd, skip, howmany, kind, sender, ptr);
+    break;
+  case result_termfreqs:
+    send_query_term_freqs(qd->QTL, sender, ptr);
+    break;
+  case result_terms:
+    send_terms(qd->TL, sender, ptr);
+    break;
+  }
+}
+
+
+
+
+
+
+/******************************************
+ * functions to handle the database cache *
+ ******************************************/
+
+/* init_dbcache should be called at the start of each */
+/* function which deals with the database cache */
+static void init_dbcache (void) {
+  static int dbcacheinited = 0;
+  int i = 0;
+
+  if (dbcacheinited) return;
+
+  cache_numloaded = 0;
+
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    dbcache[i].accessnum = -1;
+    dbcache[i].collection[0] = '\0';
+    dbcache[i].mgdir[0] = '\0';
+    dbcache[i].gensuffix[0] = '\0';
+    dbcache[i].textsuffix[0] = '\0';
+    dbcache[i].qd = NULL;
+  }
+
+  dbcacheinited = 1;
+}
+
+/* returns the next cache access number and increments it */
+static int get_next_accessnum (void) {
+  return cache_nextaccessnum++;
+}
+
+/* get_free_dbcache returns the cache number which */
+/* was used the longest time ago */
+/* init_dbcache should be called before this function */
+static int get_free_dbcache (void) {
+  int i = 0;
+  int minaccessnum = cache_nextaccessnum; /* the current max */
+  int minpos = 0;
+
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    if (dbcache[i].accessnum < minaccessnum) {
+      minaccessnum = dbcache[i].accessnum;
+      minpos = i;
+    }
+  }
+  
+  return minpos;
+}
+
+/* search_collect will search for an index which */
+/* belongs to a certain collection It returns -1 if none could be found. */
+/* init_dbcache should be called before this function */
+static int search_collect (char *collection) {
+  int i = 0;
+
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    if ((dbcache[i].accessnum >= 0) &&
+	(dbcache[i].qd != NULL) &&
+	(strcmp (collection, dbcache[i].collection) == 0)
+	/* && (dbcache[i].qd->id->ifh.InvfLevel == 2)*/
+	) {
+      dbcache[i].accessnum = get_next_accessnum ();
+      return i;
+    }
+  }
+
+  return -1;
+}
+
+/* search_gensuffix will search for an index which */
+/* has a certain gensuffix. It returns -1 if none could be found. */
+/* init_dbcache should be called before this function */
+static int search_gensuffix (char *gensuffix) {
+  int i = 0;
+
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    if ((dbcache[i].accessnum >= 0) &&
+	(dbcache[i].qd != NULL) &&
+	(strcmp (gensuffix, dbcache[i].gensuffix) == 0)) {
+      dbcache[i].accessnum = get_next_accessnum ();
+      return i;
+    }
+  }
+
+  return -1;
+}
+
+/* unload_database will unload a certain entry within */
+/* the database cache, clearing it for furture use. */
+static void unload_database (int i) {
+  /* check to see if it contains anything */
+  if (dbcache[i].accessnum < 0 || dbcache[i].qd == NULL) 
+    return;
+
+  /* unload all the query information  */
+  FinishQuerySystem(dbcache[i].qd);
+  
+  /* reset all the db info */
+  dbcache[i].accessnum = -1;
+  dbcache[i].collection[0] = '\0';
+  dbcache[i].mgdir[0] = '\0';
+  dbcache[i].gensuffix[0] = '\0';
+  dbcache[i].textsuffix[0] = '\0';
+  dbcache[i].qd = NULL;
+
+  cache_numloaded--;
+  if (cache_numloaded < 0) cache_numloaded = 0;
+}
+
+/* cache_database will store the information about */
+/* a database in the database cache. */
+static void cache_database (int i, char *collection, char *mgdir, char *gensuffix,
+			    char *textsuffix, query_data *qd) {
+  /* make sure this entry has been unloaded first */
+  if (dbcache[i].accessnum >= 0 && dbcache[i].qd != NULL) 
+    unload_database (i);
+
+  /* store the db info */
+  dbcache[i].accessnum = get_next_accessnum ();
+  strcpy (dbcache[i].collection, collection);
+  strcpy (dbcache[i].mgdir, mgdir);
+  strcpy (dbcache[i].gensuffix, gensuffix);
+  strcpy (dbcache[i].textsuffix, textsuffix);
+  dbcache[i].qd = qd;
+
+  cache_numloaded++;
+}
+
+static void make_current (int i) {
+  /* see if it is the current index */
+  if (i == cur_cachenum) return;
+ 
+  /* unload the old index */
+  if (cur_cachenum >= 0) UninitEnv ();
+  cur_cachenum = -1;
+
+  /* make sure the new one is ok */
+  if (i < 0 || dbcache[i].accessnum < 0 || dbcache[i].qd == NULL)
+    return;
+
+  /* load the new one */
+
+  /* Initialise the environment with default values */
+  InitEnv ();
+  
+  SetEnv("mgdir",dbcache[i].mgdir,NULL);
+  SetEnv("mgname",dbcache[i].gensuffix,NULL);
+  SetEnv("textname",dbcache[i].textsuffix,NULL);
+  
+  PushEnv ();
+  
+  cur_cachenum = i;
+}
+
+
+
+/********************
+ * public functions *
+ ********************/
+
+int mgq_ask(char *line)
+{
+  query_data *qd = (query_data *)NULL;
+  char QueryType = QUERY_BOOLEAN;
+  char OutputType = QUERY_DOCNUMS;
+  char *LinePtr = (char *)NULL;
+
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL) return 0;
+  
+  ResetFileStats (qd);
+  qd->max_mem_in_use = qd->mem_in_use = 0;
+  qd->tot_hops_taken += qd->hops_taken;
+  qd->tot_num_of_ptrs += qd->num_of_ptrs;
+  qd->tot_num_of_accum += qd->num_of_accum;
+  qd->tot_num_of_terms += qd->num_of_terms;
+  qd->tot_num_of_ans += qd->num_of_ans;
+  qd->tot_text_idx_lookups += qd->text_idx_lookups;
+  qd->hops_taken = qd->num_of_ptrs = 0;
+  qd->num_of_accum = qd->num_of_ans = qd->num_of_terms = 0;
+  qd->text_idx_lookups = 0;
+  
+  LinePtr = ProcessCommands (line, qd);
+  if (CommandsErrorStr) {
+    fprintf (stderr, "%s\n", CommandsErrorStr);
+    return 0;
+  }
+  if (*LinePtr == '\0') return 1;
+  
+  FreeQueryDocs (qd);
+  
+  QueryType = get_query_type ();
+  OutputType = get_output_type ();
+  /* No point in hiliting words on a docnum query */
+  if (OutputType == OUTPUT_HILITE && QueryType == QUERY_DOCNUMS)
+    OutputType = OUTPUT_TEXT;
+  
+  switch (QueryType)
+    {
+    case QUERY_BOOLEAN:
+      {
+	char *maxdocs = (char *)NULL;
+	BooleanQueryInfo bqi;
+	maxdocs = GetDefEnv ("maxdocs", "all");
+	bqi.MaxDocsToRetrieve = strcmp (maxdocs, "all") ? atoi (maxdocs) : -1;
+        if (qd->sd->sdh.indexed)
+	  BooleanQuery (qd, line, &bqi, (BooleanEnv (GetEnv ("casefold"), 0) |
+					 (BooleanEnv (GetEnv ("stem"), 0) << 1)));
+	else
+	  BooleanQuery (qd, line, &bqi, qd->sd->sdh.stem_method);
+	/*	if (qd->sd->sdh.indexed) BooleanQuery (qd, line, &bqi, 3);
+	else BooleanQuery (qd, line, &bqi, qd->sd->sdh.stem_method); */
+	break;
+      }
+    case QUERY_APPROX:
+    case QUERY_RANKED:
+      {
+	char *maxdocs = (char *)NULL;
+	char *maxterms = (char *)NULL;
+	char *maxaccum = (char *)NULL;
+	RankedQueryInfo rqi;
+	maxdocs = GetDefEnv ("maxdocs", "all");
+	maxterms = GetDefEnv ("max_terms", "all");
+	maxaccum = GetDefEnv ("max_accumulators", "all");
+	rqi.Sort = BooleanEnv (GetEnv ("sorted_terms"), 0);
+	rqi.QueryFreqs = BooleanEnv (GetEnv ("qfreq"), 1);
+	rqi.Exact = QueryType == QUERY_RANKED;
+	rqi.MaxDocsToRetrieve = strcmp (maxdocs, "all") ? atoi (maxdocs) : -1;
+	rqi.MaxTerms = strcmp (maxterms, "all") ? atoi (maxterms) : -1;
+	rqi.MaxParasToRetrieve = rqi.MaxDocsToRetrieve;
+	if (qd->id->ifh.InvfLevel == 3 && GetEnv ("maxparas"))
+	  rqi.MaxParasToRetrieve = atoi (GetEnv ("maxparas"));
+	rqi.AccumMethod = toupper (*GetDefEnv ("accumulator_method", "A"));
+	rqi.MaxAccums = strcmp (maxaccum, "all") ? atoi (maxaccum) : -1;
+	rqi.HashTblSize = IntEnv (GetEnv ("hash_tbl_size"), 1000);
+	rqi.StopAtMaxAccum = BooleanEnv (GetEnv ("stop_at_max_accum"), 0);
+	rqi.skip_dump = GetEnv ("skip_dump");
+	RankedQuery (qd, line, &rqi);
+	break;
+      }
+    case QUERY_DOCNUMS:
+      {
+	DocnumsQuery (qd, line);
+	break;
+      }
+    }
+
+  return 1;
+}
+
+int mgq_numdocs(void)
+{
+  query_data *qd = NULL;
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL) return 0;
+
+  if (qd->DL) return qd->DL->num;
+  else return 0;
+}
+
+int mgq_numterms(void)
+{
+  query_data *qd = NULL;
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL) return 0;
+
+  if (qd->QTL) return qd->QTL->num;
+  else return 0;
+}
+
+int mgq_results(enum result_kinds kind,int skip,int howmany, int (*sender)(char *, int, int, float, void *), void *ptr)
+{
+  query_data *qd = NULL;
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL) return 0;
+
+  if (qd->DL) {
+    qd->doc_pos = 0;
+    MoreDocs(qd, kind, skip, howmany, sender, ptr);
+  }
+  return 0;
+}
+
+/* get all the terms that match wordstem using the current stemmer and */
+/* stemming method. The callback is the same style used by mgq_results */
+int mgq_equivterms (unsigned char *wordstem, int (*sender)(char *, int, int, float, void *),
+		    void *ptr) {
+  int stem_method = 0;
+  query_data *qd = NULL;
+  TermList *equivterms = NULL;  /* used for equivalent terms */
+
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL || wordstem == NULL || sender == NULL) return 0;
+
+  if (qd->sd->sdh.indexed) {
+    stem_method = BooleanEnv(GetEnv("casefold"),0) | (BooleanEnv(GetEnv("stem"),0) << 1);
+  } else {
+    stem_method = qd->sd->sdh.stem_method;
+  }
+
+  /* make the term list */
+  equivterms = MakeTermList (0);
+  
+  /* expand out this word */
+  if (FindWords (qd->sd, wordstem, stem_method, &equivterms) > 0) {
+    int i;
+    for (i=0; i < equivterms->num; i++) {
+      (* sender)((char *)(equivterms->TE[i].Word+1), equivterms->TE[i].Word[0], 
+		 equivterms->TE[i].Count, (float)0.0, ptr);
+    }
+  }
+
+  /* free the term list */
+  if (equivterms != NULL) FreeTermList (&equivterms);
+
+  return 0;
+}
+
+/* gets the total number of documents retrieved. If this is not available */
+/* it will set total_retrieved to 0 (even when it obviously isn't) */
+int mgq_docsretrieved (int *total_retrieved, int *is_approx) {
+  query_data *qd = NULL;
+
+  if (cur_cachenum == -1) return 0;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL || total_retrieved == NULL || is_approx == NULL) return 0;
+
+  /* set default values */
+  *total_retrieved = 0;
+  *is_approx = 0;
+
+  if (qd->DL == NULL) return 0;
+
+  *total_retrieved = qd->DL->total_retrieved;
+  *is_approx = qd->DL->is_approx;
+
+  return 0;
+}
+
+
+/* use mgq_getmaxstemlen to determine the length of the word stems to pass */
+/* to mgq_stemword */
+int mgq_getmaxstemlen () {
+  return MAXSTEMLEN;
+}
+
+/* note: the stemming method and the stemmer come from the last query */
+/* "word" should be at least maxstemlen+1 long and it is a string that */
+/* starts with the string length */
+void mgq_stemword (unsigned char *word) {
+  int stem_method = 0;
+  query_data *qd = NULL;
+
+  if (cur_cachenum == -1) return;
+  qd = dbcache[cur_cachenum].qd;
+  if (qd == NULL || word == NULL) return;
+
+  if (qd->sd->sdh.indexed) {
+    stem_method = BooleanEnv(GetEnv("casefold"),0) | (BooleanEnv(GetEnv("stem"),0) << 1);
+  } else {
+    stem_method = qd->sd->sdh.stem_method;
+  }
+
+  stemmer (stem_method, qd->sd->sdh.stemmer_num, word);
+}
+
+
+
+int is_dbcache_full (void) {
+  init_dbcache ();
+  if (cache_numloaded >= MAXNUMDATABASEINFO) return 1;
+  return 0;
+}
+
+int load_database (char *collection, char *mgdir, 
+		   char *gensuffix, char *textsuffix) {
+  int i = 0;
+  query_data *qd = NULL;
+  /*  FILE *deb = NULL; */
+  init_dbcache ();
+
+  /* print out some debug information */
+/*  deb = fopen ("/home/rjmcnab/gsdl/etc/deb.txt", "a");
+  fprintf (deb, "\ncache_nextaccessnum: %i\n", cache_nextaccessnum);
+  fprintf (deb, "cache_numloaded: %i\n", cache_numloaded);
+  fprintf (deb, "cur_cachenum: %i\n", cur_cachenum);
+  fprintf (deb, "MAXNUMDATABASEINFO: %i\n\n", MAXNUMDATABASEINFO);
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    fprintf (deb, "Entry %i\n", i);
+    fprintf (deb, "  accessnum: %i\n", dbcache[i].accessnum);
+    fprintf (deb, "  collection: %s\n", dbcache[i].collection);
+    fprintf (deb, "  mgdir: %s\n", dbcache[i].mgdir);
+    fprintf (deb, "  gensuffix: %s\n", dbcache[i].gensuffix);
+    fprintf (deb, "  textsuffix: %s\n", dbcache[i].textsuffix);
+    fprintf (deb, "  qd: %x\n", (int)(dbcache[i].qd));
+  }
+  fclose (deb); */
+
+  /* search for the index */
+  i = search_gensuffix (gensuffix);
+  if (i >= 0) {
+    make_current (i);
+    return 1;
+  }
+
+  /* if there was a current database then the */
+  /* environment needs uninitialising */
+  make_current (-1);
+
+  /* get a free cache number */
+  i = get_free_dbcache ();
+  unload_database (i);
+
+  /* load the index */
+  qd = InitQuerySystem (mgdir, gensuffix, textsuffix, NULL);
+  if (qd == NULL) return 0;
+
+  /* cache this index */
+  cache_database (i, collection, mgdir, gensuffix, textsuffix, qd);
+
+  /* make this index current */
+  make_current (i);
+
+  return 1;
+}
+
+/* load_text_database tries to make an index of the */
+/* specified collection current */
+int load_text_database (char *collection) {
+  int i = 0;
+  init_dbcache ();
+
+  /* search for the index */
+  i = search_collect (collection);
+
+  /* return if none were found */
+  if (i < 0) return 0;
+  
+  /* make this index current */
+  make_current (i);
+  return 1;
+}
+
+void close_all_databases (void) {
+  int i = 0;
+  init_dbcache ();
+  
+  /* unload all active databases */
+  for (i=0; i<MAXNUMDATABASEINFO; i++) {
+    unload_database (i);
+  }
+
+  /* if there was a current database then the */
+  /* environment needs uninitialising */
+  make_current (-1);
+}
Index: /main/tags/2.38/gsdl/src/colservr/mgq.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgq.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgq.h	(revision 21083)
@@ -0,0 +1,78 @@
+/**********************************************************************
+ *
+ * mgq.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef MGQ_H
+#define MGQ_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  
+enum result_kinds {
+  result_docs,      /* Return the documents found in last search */
+  result_docnums,   /* Return document id numbers and weights */
+  result_termfreqs, /* Return terms and frequencies */
+  result_terms      /* Return matching query terms */
+};
+
+int mgq_ask(char *line);
+int mgq_results(enum result_kinds kind, int skip, int howmany,
+		int (*sender)(char *, int, int, float, void *), void *ptr);
+int mgq_numdocs(void);
+int mgq_numterms(void);
+
+/* get all the terms that match wordstem using the current stemmer and */
+/* stemming method. The callback is the same style used by mgq_results */
+int mgq_equivterms (unsigned char *wordstem, int (*sender)(char *, int, int, float, void *),
+		    void *ptr);
+
+/* gets the total number of documents retrieved. If this is not available */
+/* it will set total_retrieved to 0 (even when it obviously isn't) */
+int mgq_docsretrieved (int *total_retrieved, int *is_approx);
+  
+/* use mgq_getmaxstemlen to determine the length of the word stems to pass */
+/* to mgq_stemword */
+int mgq_getmaxstemlen ();
+
+/* note: the stemming method and the stemmer come from the last query */
+/* "word" should be at least maxstemlen+1 long and it is a string that */
+/* starts with the string length */
+void mgq_stemword (unsigned char *word);
+
+  
+int is_dbcache_full (void);
+int load_database (char *collection, char *mgdir, char *gensuffix, char *textsuffix);
+int load_text_database (char *collection);
+void close_all_databases (void);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.cpp	(revision 21083)
@@ -0,0 +1,517 @@
+/**********************************************************************
+ *
+ * mgqueryfilter.cpp -- implementation of queryfilter for old mg 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "mgqueryfilter.h"
+#include "fileutil.h"
+#include "phrasesearch.h"
+#include <assert.h>
+#include "mgsearch.h"
+
+///////////////////////////////
+// methods for resultsorderer_t
+///////////////////////////////
+
+resultsorderer_t::resultsorderer_t() {
+  clear ();
+}
+
+void resultsorderer_t::clear() {
+  compare_phrase_match = false;
+  compare_terms_match = false;
+  compare_doc_weight = true;
+
+  docset = NULL;
+}
+
+bool resultsorderer_t::operator()(const int &t1, const int &t2) const {
+  if (docset == NULL) return t1>t2;
+
+  docresultmap::iterator t1_here = docset->find(t1);
+  docresultmap::iterator t2_here = docset->find(t2);
+  docresultmap::iterator end = docset->end();
+
+  // sort all the document numbers not in the document set to
+  // the end of the list
+  if (t1_here == end) {
+    if (t2_here == end) return t1>t2;
+    else return true;
+  } else if (t2_here == end) return false;
+  
+  if (compare_phrase_match) {
+    if ((*t1_here).second.num_phrase_match > (*t2_here).second.num_phrase_match) return true;
+    if ((*t1_here).second.num_phrase_match < (*t2_here).second.num_phrase_match) return false;
+  }
+
+  if (compare_terms_match) {
+    if ((*t1_here).second.num_query_terms_matched > (*t2_here).second.num_query_terms_matched) return true;
+    if ((*t1_here).second.num_query_terms_matched < (*t2_here).second.num_query_terms_matched) return false;
+  }
+
+  if (compare_doc_weight) {
+    if ((*t1_here).second.docweight > (*t2_here).second.docweight) return true;
+    if ((*t1_here).second.docweight < (*t2_here).second.docweight) return false;
+  }
+
+  return t1>t2;
+}
+
+
+
+
+/////////////////////////////////
+// functions for mgqueryfilterclass
+/////////////////////////////////
+
+// loads up phrases data structure with any phrases (that's the quoted bits)
+// occuring in the querystring
+void mgqueryfilterclass::get_phrase_terms (const text_t &querystring, 
+					 const termfreqclassarray &orgterms,
+					 vector<termfreqclassarray> &phrases) {
+
+  text_t::const_iterator here = querystring.begin();
+  text_t::const_iterator end = querystring.end();
+
+  termfreqclassarray tmpterms;
+
+  int termcount = 0;
+  bool foundquote = false;
+  bool foundbreak = false;
+  bool start = true;
+  while (here != end) {
+    if (*here == '\"') {
+      if (foundquote) {
+	if (!foundbreak && !start) {
+	  tmpterms.push_back (orgterms[termcount]);
+	  termcount ++;
+	}
+	if (tmpterms.size() > 1) {
+	  phrases.push_back (tmpterms);
+	  tmpterms.erase (tmpterms.begin(), tmpterms.end());
+	}
+	foundquote = false;
+	foundbreak = true;
+      } else foundquote = true;
+    } else if (!is_unicode_letdig(*here)) {
+      // found a break between terms
+      if (!foundbreak && !start) {
+	if (foundquote)
+	  tmpterms.push_back (orgterms[termcount]);
+	termcount ++;
+      }
+      foundbreak = true;
+    } else {
+      start = false;
+      foundbreak = false;
+    }      
+    here++;
+  }
+}
+
+// do aditional query processing
+void mgqueryfilterclass::post_process (const queryparamclass &queryparams, 
+				     queryresultsclass &queryresults) {
+
+  // post-process the results if needed
+  if (queryresults.orgterms.size() > 1 && !queryresults.docs.docset.empty()) {
+
+    // get the terms between quotes (if any)
+    vector<termfreqclassarray> phrases;
+    get_phrase_terms (queryparams.querystring, queryresults.orgterms, phrases);
+
+    num_phrases = phrases.size();
+    if (num_phrases > 0) {
+
+      // get the long version of the index
+      text_t longindex;
+      indexmap.to2from (queryparams.index, longindex);
+      
+      vector<termfreqclassarray>::const_iterator this_phrase = phrases.begin();
+      vector<termfreqclassarray>::const_iterator end_phrase = phrases.end();
+
+      while (this_phrase != end_phrase) {
+
+	// process each of the matched documents
+	docresultmap::iterator docs_here = queryresults.docs.docset.begin();
+	docresultmap::iterator docs_end = queryresults.docs.docset.end();
+	while (docs_here != docs_end) {
+	  if (OID_phrase_search (*((mgsearchclass*)mgsearchptr), *gdbmptr, queryparams.index,
+				 queryparams.subcollection, queryparams.language, 
+				 longindex, queryparams.collection, *this_phrase,
+				 (*docs_here).second.docnum)) {
+	    (*docs_here).second.num_phrase_match++;
+	  }
+	
+	  docs_here++;
+	}
+	this_phrase++;
+      }
+    }
+  }
+}
+
+
+// do query that might involve multiple sub queries
+// mgsearchptr and gdbmptr are assumed to be valid
+void mgqueryfilterclass::do_multi_query (const FilterRequest_t &request,
+				       const vector<queryparamclass> &query_params,
+				       queryresultsclass &multiresults,
+				       comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  err = noError;
+  mgsearchptr->setcollectdir (collectdir);
+  multiresults.clear();
+  
+  vector<queryparamclass>::const_iterator query_here = query_params.begin();
+  vector<queryparamclass>::const_iterator query_end = query_params.end();
+  while (query_here != query_end) {
+    queryresultsclass thisqueryresults;
+
+    if (!mgsearchptr->search(*query_here, thisqueryresults)) {
+      // most likely a system problem
+      logout << text_t2ascii
+	     << "system problem: could not do search with mg for index \""
+	     << (*query_here).index << (*query_here).subcollection
+	     << (*query_here).language << "\".\n\n";
+      err = systemProblem;
+      return;
+    }
+
+    // combine the results
+    if (need_matching_docs (request.filterResultOptions)) {
+      // post-process the results if needed
+      if (!thisqueryresults.postprocessed && thisqueryresults.orgterms.size() > 1 &&
+	  !thisqueryresults.docs.docset.empty()) {
+	post_process (*query_here, thisqueryresults);
+	thisqueryresults.postprocessed = true;
+	multiresults.postprocessed = true;
+      } else {
+	num_phrases = 0;
+      }
+      
+      if (query_params.size() == 1) {
+	multiresults.docs = thisqueryresults.docs; // just one set of results
+	multiresults.docs_matched = thisqueryresults.docs_matched;
+	multiresults.is_approx = thisqueryresults.is_approx;
+	
+      } else {
+	if ((*query_here).combinequery == "and") {
+	  multiresults.docs.combine_and (thisqueryresults.docs);
+	} else if ((*query_here).combinequery == "or") {
+	  multiresults.docs.combine_or (thisqueryresults.docs);
+	} else if ((*query_here).combinequery == "not") {
+	  multiresults.docs.combine_not (thisqueryresults.docs);
+	}
+	multiresults.docs_matched = multiresults.docs.docset.size();
+	multiresults.is_approx = Exact;
+      }
+    }
+
+    // combine the term information 
+    if (need_term_info (request.filterResultOptions)) {
+      // append the terms
+      multiresults.orgterms.insert(multiresults.orgterms.end(),
+				   thisqueryresults.orgterms.begin(),
+				   thisqueryresults.orgterms.end());
+
+      // add the term variants
+      text_tset::iterator termvar_here = thisqueryresults.termvariants.begin();
+      text_tset::iterator termvar_end = thisqueryresults.termvariants.end();
+      while (termvar_here != termvar_end) {
+	multiresults.termvariants.insert(*termvar_here);
+	termvar_here++;
+      }
+    }
+   
+    query_here++;
+  }
+
+  // sort and unique the query terms
+  multiresults.sortuniqqueryterms ();
+}
+
+
+void mgqueryfilterclass::sort_doc_results (const FilterRequest_t &/*request*/,
+					 docresultsclass &docs) {
+  resultsorderer_t resultsorderer;
+  resultsorderer.compare_phrase_match = true;
+  resultsorderer.docset = &(docs.docset);
+
+  // first get a list of document numbers
+  docs.docnum_order();
+
+  sort (docs.docorder.begin(), docs.docorder.end(), resultsorderer);
+}
+
+
+
+mgqueryfilterclass::mgqueryfilterclass () 
+  :queryfilterclass() {
+
+  num_phrases = 0;
+
+}
+
+mgqueryfilterclass::~mgqueryfilterclass () {
+}
+
+void mgqueryfilterclass::filter (const FilterRequest_t &request,
+			       FilterResponse_t &response,
+			       comerror_t &err, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  response.clear ();
+  err = noError;
+  if (gdbmptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: mgqueryfilter contains a null gdbmclass\n\n";
+    err = configurationError;
+    return;
+  }
+  if (mgsearchptr == NULL) {
+    // most likely a configuration problem
+    logout << text_t2ascii 
+	   << "configuration error: mgqueryfilter contains a null mgsearchclass\n\n";
+    err = configurationError;
+    return;
+  }
+
+  // open the database
+  gdbmptr->setlogout(&logout);
+  if (!gdbmptr->opendatabase (gdbm_filename, GDBM_READER, 100, false)) {
+    // most likely a system problem (we have already checked that the
+    // gdbm database exists)
+    logout << text_t2ascii
+	   << "system problem: open on gdbm database \""
+	   << gdbm_filename << "\" failed\n\n";
+    err = systemProblem;
+    return;
+  }
+
+  // get the query parameters
+  int startresults = filterOptions["StartResults"].defaultValue.getint();
+  int endresults = filterOptions["EndResults"].defaultValue.getint();
+  text_t phrasematch = filterOptions["PhraseMatch"].defaultValue;
+
+  vector<queryparamclass> queryfilterparams;
+  parse_query_params (request, queryfilterparams, startresults, 
+		      endresults, phrasematch, logout);
+  // do any mg specific diddling with query parameters that may be required
+  mg_parse_query_params (request, queryfilterparams, startresults, 
+			 endresults, phrasematch, logout);
+
+
+  // do query
+  queryresultsclass queryresults;
+  do_multi_query (request, queryfilterparams, queryresults, err, logout);
+  if (err != noError) return;
+  
+  // assemble document results
+  if (need_matching_docs (request.filterResultOptions)) {
+    // sort the query results
+    sort_doc_results (request, queryresults.docs);
+    
+    int resultnum = 1;
+    ResultDocInfo_t resultdoc;
+    text_t trans_OID;
+    vector<int>::iterator docorder_here = queryresults.docs.docorder.begin();
+    vector<int>::iterator docorder_end = queryresults.docs.docorder.end();
+
+    // documents containing matching phrases will be sorted to the top so
+    // we can break out once we're past those that match the PhraseMatch
+    // option -- "all_phrases" = return only those documents containing all
+    //	                     phrases in query string
+    //           "some_phrases" = return only those documents containing 
+    //                            at least 1 of the phrases in the document
+    //           "all_docs" = return all documents regardless
+    if (num_phrases > 0) {
+      int numdocs = 0;
+      while (docorder_here != docorder_end) {
+	docresultmap::iterator docset_here = queryresults.docs.docset.find (*docorder_here);
+	
+	if (((phrasematch == "all_phrases") && ((*docset_here).second.num_phrase_match < num_phrases)) ||
+	    ((phrasematch == "some_phrases") && ((*docset_here).second.num_phrase_match < 1))) {
+	  queryresults.docs_matched = numdocs;
+	  break;
+	}
+	numdocs ++;
+	docorder_here ++;
+      }
+    }
+
+    if (endresults == -1) endresults = MAXNUMDOCS;
+    docorder_here = queryresults.docs.docorder.begin();
+    while (docorder_here != docorder_end) {
+      if (resultnum > endresults || resultnum > queryresults.docs_matched) break;
+      
+      // translate the document number
+      if (!translate(gdbmptr, *docorder_here, trans_OID)) {
+	logout << text_t2ascii
+	       << "warning: could not translate mg document number \""
+	       << *docorder_here << "\"to OID.\n\n";
+	
+      } else {
+	docresultmap::iterator docset_here = queryresults.docs.docset.find (*docorder_here);
+
+	// see if there is a result for this number,
+	// if it is in the request set (or the request set is empty)
+	if (docset_here != queryresults.docs.docset.end() &&
+	    (request.docSet.empty() || in_set(request.docSet, trans_OID))) {
+	  if (resultnum >= startresults) {
+	    // add this document
+	    resultdoc.OID = trans_OID;
+	    resultdoc.result_num = resultnum;
+	    resultdoc.ranking = (int)((*docset_here).second.docweight * 10000.0 + 0.5);
+
+	    // these next two are not available on all versions of mg
+	    resultdoc.num_terms_matched = (*docset_here).second.num_query_terms_matched; 
+	    resultdoc.num_phrase_match = (*docset_here).second.num_phrase_match;
+	    
+	    response.docInfo.push_back (resultdoc);
+	  }
+	  
+	  resultnum++;
+	}
+      }
+      
+      docorder_here++;
+    }
+  }
+
+  // assemble the term results
+  if (need_term_info(request.filterResultOptions)) {
+    // note: the terms have already been sorted and uniqued
+
+    TermInfo_t terminfo;
+    bool terms_first = true;
+    termfreqclassarray::iterator terms_here = queryresults.terms.begin();
+    termfreqclassarray::iterator terms_end = queryresults.terms.end();
+
+    while (terms_here != terms_end) {
+      terminfo.clear();
+      terminfo.term = (*terms_here).termstr;
+      terminfo.freq = (*terms_here).termfreq;
+      if (terms_first) {
+	text_tset::iterator termvariants_here = queryresults.termvariants.begin();
+	text_tset::iterator termvariants_end = queryresults.termvariants.end();
+	while (termvariants_here != termvariants_end) {
+	  terminfo.matchTerms.push_back (*termvariants_here);
+	  termvariants_here++;
+	}
+      }
+      terms_first = false;
+
+      response.termInfo.push_back (terminfo);
+
+      terms_here++;
+    }
+  }
+
+  response.numDocs = queryresults.docs_matched;
+  response.isApprox = queryresults.is_approx;
+}
+
+void mgqueryfilterclass::mg_parse_query_params (const FilterRequest_t &/*request*/,
+						vector<queryparamclass> &query_params,
+						int &/*startresults*/, int &/*endresults*/,
+						text_t &/*phrasematch*/, ostream &/*logout*/) {
+
+  //  outconvertclass text_t2ascii;
+  
+  vector<queryparamclass>::iterator query_here = query_params.begin();
+  vector<queryparamclass>::iterator query_end = query_params.end();
+  while (query_here != query_end) {
+
+    // if we're doing a phrase search we want to maximise hits by making it
+    // a boolean search on the index with the finest granularity - we'll
+    // also set maxdocs to "all" (realizing that this will cause searches
+    // like "and the" on a large collection to take a very very long time).
+
+    // we're deciding it's a phrase search based on if the querystring 
+    // contains at least 2 double quotes (not very scientific but 
+    // then neither is the rest of the mg phrase searching functionality :-)
+    if (countchar ((*query_here).querystring.begin(), (*query_here).querystring.end(), '"') > 1) {
+      (*query_here).search_type = 0;
+
+      // set maxdocs to "all"
+      (*query_here).maxdocs = -1;
+
+      // Get the long version of the index and test to see if any indexes with
+      // finer granularity exist. Indexes must be the same type (i.e. same metadata
+      // or "text").
+      text_t longindex; text_tarray splitindex;
+      indexmap.to2from ((*query_here).index, longindex);
+      splitchar (longindex.begin(), longindex.end(), ':', splitindex);
+      text_t &granularity = splitindex[0];
+      text_t &indextype = splitindex[1];
+      bool found = false;
+      // currently supported granularity options are "document", "section" and "paragraph"
+      if (granularity == "document" || granularity == "section") {
+	text_t shortindex;
+	if (indexmap.fromexists ("paragraph:" + indextype)) {
+	  indexmap.from2to ("paragraph:" + indextype, shortindex);
+	  (*query_here).index = shortindex;
+	  found = true;
+	}
+	if (!found && granularity == "document" && indexmap.fromexists ("section:" + indextype)) {
+	  indexmap.from2to ("section:" + indextype, shortindex);
+	  (*query_here).index = shortindex;
+	}
+      }
+    }
+
+#ifdef GSDL_BBC_COLLECTION
+    // This is a special hack for the BBC collection's ProgNumber index
+
+    // if we're searching a ProgNumber index we want to:
+    // 1. Remove all non-alphanumeric characters from the query string
+    // 2. Make it a boolean search
+    // 3. Turn off case-folding
+    text_t longindex; text_tarray splitindex;
+    indexmap.to2from ((*query_here).index, longindex);
+    splitchar (longindex.begin(), longindex.end(), ':', splitindex);
+    text_t &indextype = splitindex[1];
+    if (indextype == "ProgNumber") {
+      (*query_here).search_type = 0;
+      (*query_here).casefolding = 0;
+      text_t new_querystring;
+      text_t::const_iterator here = (*query_here).querystring.begin();
+      text_t::const_iterator end = (*query_here).querystring.end();
+      while (here != end) {
+        if ((*here >= 'a' && *here <= 'z') || (*here >= 'A' && *here <= 'Z') ||
+            (*here >= '0' && *here <= '9')) {
+          new_querystring.push_back (*here);
+        }
+        here ++;
+      }
+      (*query_here).querystring = new_querystring;
+    }
+#endif
+
+    query_here ++;
+  }
+}
+    
Index: /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgqueryfilter.h	(revision 21083)
@@ -0,0 +1,88 @@
+/**********************************************************************
+ *
+ * mgqueryfilter.h -- queryfilter for old mg
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef MGQUERYFILTER_H
+#define MGQUERYFILTER_H
+
+#include "queryfilter.h"
+
+// resultsorderer_t is used to sort the query results
+struct resultsorderer_t {
+  bool compare_phrase_match;
+  bool compare_terms_match;
+  bool compare_doc_weight;
+  docresultmap *docset;
+
+  resultsorderer_t();
+  void clear();
+  bool operator()(const int &t1, const int &t2) const;
+};
+
+
+
+class mgqueryfilterclass : public queryfilterclass {
+protected:
+  
+  int num_phrases;
+
+  void get_phrase_terms (const text_t &querystring, 
+			 const termfreqclassarray &orgterms,
+			 vector<termfreqclassarray> &phrases);
+
+  // do aditional query processing
+  virtual void post_process (const queryparamclass &queryparams,
+			     queryresultsclass &queryresults);
+
+  // do query that might involve multiple sub queries
+  // mgsearchptr and gdbmptr are assumed to be valid
+  void do_multi_query (const FilterRequest_t &request,
+		       const vector<queryparamclass> &query_params,
+		       queryresultsclass &multiresults,
+		       comerror_t &err, ostream &logout);
+
+  virtual void sort_doc_results (const FilterRequest_t &request,
+				 docresultsclass &docs);
+
+  virtual void mg_parse_query_params (const FilterRequest_t &request,
+				      vector<queryparamclass> &query_params,
+				      int &startresults, int &endresults,
+				      text_t &phrasematch, ostream &logout);
+
+  
+public:
+  mgqueryfilterclass ();
+  virtual ~mgqueryfilterclass ();
+
+  void filter (const FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout);
+};
+
+
+#endif
+
Index: /main/tags/2.38/gsdl/src/colservr/mgsearch.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgsearch.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgsearch.cpp	(revision 21083)
@@ -0,0 +1,558 @@
+/**********************************************************************
+ *
+ * mgsearch.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdlconf.h"
+#include "mgsearch.h"
+#include "fileutil.h"
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#if defined(__WIN32__)
+// gdbm stuff
+#  include "autoconf.h"
+#  include "systems.h"
+#  include "gdbmconst.h"
+#  include "gdbm.h"
+#else
+#  include <gdbm.h>
+#endif
+
+  
+#include <assert.h>
+
+#include "mgq.h"
+// #include "locateinfo.h"
+#include "gsdlunicode.h"
+#include "unitool.h"
+
+
+/////////////
+// globals //
+/////////////
+
+static char *tempdoc = NULL;
+static int templen = 0;
+
+
+//////////////////////
+// useful functions //
+//////////////////////
+
+
+// input and output are in utf8
+text_t mgsearch_stemword (const text_t &word) {
+  // allocate working stem space
+  int maxstemlen = mgq_getmaxstemlen ();
+  unsigned char *word_stem = new unsigned char [maxstemlen + 2];
+  if (word_stem == NULL) return "";
+
+  // copy word to word_stem
+  int len = 0;
+  text_t::const_iterator here = word.begin();
+  text_t::const_iterator end = word.end();
+  while (len < maxstemlen && here != end) {
+    word_stem[len+1] = (unsigned char)(*here);
+    len++; here++;
+  }
+  word_stem[len+1] = '\0';
+  word_stem[0] = len;
+
+  mgq_stemword (word_stem);
+
+  // copy word_stem back to tempstr
+  text_t tempstr;
+  tempstr.setcarr((char *)(&word_stem[1]), word_stem[0]);
+
+  delete [] word_stem;
+  
+  return tempstr;
+}
+
+
+
+////////////////////////
+// callback functions //
+////////////////////////
+
+// This routine is called for each document found in a search
+// it assumes that cache_num is set up correctly to point to
+// a suitable result cache
+int ourquerycallback(char * /*UDoc*/, int /*ULen*/, int DocNum, 
+		     float Weight, void *info) {
+
+  
+  queryresultsclass *queryresults = (queryresultsclass * )info;
+
+  // append this entry to the document results
+  docresultclass docresult;
+  docresult.docnum = DocNum;
+  docresult.num_query_terms_matched = (int)(Weight/100.0); // will always be 0 on some versions of mg...
+  docresult.docweight = Weight - docresult.num_query_terms_matched*100;
+  
+  queryresults->docs.docset[DocNum] = docresult;
+  queryresults->docs.docorder.push_back(DocNum);
+  
+  return 0;
+}
+
+int termequivcallback(char *Word, int ULen,  int /*Freq*/, 
+		      float /*Weight*/,  void *info) {
+  text_tset *equivterms = (text_tset *)info;
+  if (equivterms == NULL) return 0;
+
+  text_t thisterm;
+  thisterm.setcarr(Word, ULen);
+
+  equivterms->insert(thisterm);
+  
+  return 0;
+}
+
+
+void mgsearch_equivterms (const text_t &word, text_tset &equivterms) {
+  // allocate working stem space
+  int maxstemlen = mgq_getmaxstemlen ();
+  unsigned char *word_stem = new unsigned char [maxstemlen + 2];
+  if (word_stem == NULL) return;
+
+  // copy word to word_stem
+  int len = 0;
+  text_t::const_iterator here = word.begin();
+  text_t::const_iterator end = word.end();
+  while (len < maxstemlen && here != end) {
+    word_stem[len+1] = (unsigned char)(*here);
+    len++; here++;
+  }
+  word_stem[len+1] = '\0';
+  word_stem[0] = len;
+
+  // get the equivalent terms
+  mgq_equivterms (word_stem, termequivcallback, (void *)(&equivterms));
+  
+  delete [] word_stem;
+
+  return;
+}
+
+  text_tset utf8equivterms; // kept as utf8 string for fast matching
+
+
+// This callback is called once for each term in the query
+int termfreqcallback(char *Word, int ULen,  int Freq, 
+		     float /*Weight*/,  void *info) {
+  queryresultsclass *queryresults = (queryresultsclass *)info;
+  if (queryresults == NULL) return 0;
+
+  text_t term;
+  term.setcarr(Word, ULen);
+  termfreqclass termfreq;
+
+  termfreq.termstr = to_uni(term);
+  text_t utf8termstem = mgsearch_stemword (term);
+  termfreq.termstemstr = to_uni (utf8termstem);
+
+  mgsearch_equivterms (utf8termstem, termfreq.utf8equivterms);
+  
+  termfreq.termfreq = Freq;
+  queryresults->orgterms.push_back(termfreq);
+  
+  return 0;
+}
+
+// this callback is called once for each variation of each term
+int termvariantscallback(char *Word, int ULen, int /*Freq*/,
+			 float /*Weight*/, void *info) {
+
+  text_t term;
+  term.setcarr(Word, ULen);
+  queryresultsclass *queryresults = (queryresultsclass *)info;
+  queryresults->termvariants.insert(to_uni(term));
+
+  return 0;
+}
+
+// This callback is for getting document text
+int doctextcallback(char *Doc, int ULen,  int /*Freq*/, 
+		    float /*Weight*/,  void * /*info*/) {
+  tempdoc = Doc;
+  templen = ULen;
+  
+  return 0;
+}
+
+
+static text_t getindexsuffix (const text_t &collection, 
+			      const text_t &index) {
+
+  text_t indexsuffix = "index";  
+  indexsuffix = filename_cat (indexsuffix, index);
+  indexsuffix = filename_cat (indexsuffix, collection);
+  return indexsuffix;
+}
+
+
+
+
+////////////////////
+// mgsearch class //
+////////////////////
+
+mgsearchclass::mgsearchclass ()
+  : searchclass() {
+ 
+}
+
+mgsearchclass::~mgsearchclass () 
+{
+  if (cache != NULL) 
+    {
+      delete cache;
+      cache = NULL;
+    }
+}
+
+// you only need to use this function before doing any stemming
+// casefolding and stemming will be set if values for them are
+// provided (0 or 1).
+// makeindexcurrent returns true if it was able to load the database
+bool mgsearchclass::makeindexcurrent (const text_t &index,
+				      const text_t &subcollection,
+				      const text_t &language,
+				      const text_t &collection,
+				      int casefolding,
+				      int stemming) {
+  bool databaseloaded = true;
+
+  // get the names of the collection, index and text suffixes
+  char *ccollection = collection.getcstr();
+  assert (ccollection != NULL);
+  char *idxsuffix = (getindexsuffix (collection, (index+subcollection+language))).getcstr();
+  assert (idxsuffix != NULL);
+  char *txtsuffix = (getindexsuffix (collection, "text")).getcstr();
+  assert (txtsuffix != NULL);
+
+#ifdef __WIN32__
+  char *ccollectdir = (collectdir+"\\").getcstr(); assert (ccollectdir != NULL);
+#else
+  char *ccollectdir = collectdir.getcstr(); assert (ccollectdir != NULL);
+#endif
+
+  if (load_database(ccollection, ccollectdir, idxsuffix, txtsuffix)) {
+    if (casefolding == 0) mgq_ask(".set casefold off");
+    else if (casefolding > 0) mgq_ask(".set casefold on");
+    if (stemming == 0) mgq_ask(".set stem off");
+    else if (stemming > 0) mgq_ask(".set stem on");
+    
+  } else databaseloaded = false;
+
+  // free up the c strings
+  delete ccollection;
+  delete idxsuffix;
+  delete txtsuffix;
+  delete ccollectdir;
+
+  return databaseloaded;
+}
+
+
+// stem word uses the values set in the last call to makeindexcurrent
+// to stem the word. It is assumed that word is in unicode
+text_t mgsearchclass::stemword (const text_t &word) {
+  return to_uni (mgsearch_stemword (to_utf8 (word)));
+}
+
+text_t mgsearchclass::stemword (text_t::const_iterator here, text_t::const_iterator end) {
+  return to_uni (mgsearch_stemword (to_utf8 (here, end)));
+}
+
+/**
+ * search directs the whole execution of the search; a number of other
+ * functions in this class are called as a result, and precondition
+ * checks are also made
+ */
+bool mgsearchclass::search(const queryparamclass &queryparams, 
+			   queryresultsclass &queryresults) {
+  //  assert (cache != NULL);
+
+  // clear any previous results
+  queryresults.clear();
+  // first check the cache
+  if (cache != NULL) {
+    if (cache->find(queryparams, queryresults)) return true;
+  }
+  // make sure there is a query to be processed
+  if (!has_unicode_letdig(queryparams.querystring)) return true;
+
+  if (makeindexcurrent (queryparams.index, queryparams.subcollection,
+			queryparams.language, queryparams.collection)) {
+    // initialise the form of results
+    setsearchmode (queryparams);
+
+    // execute the query
+    submitquery (queryparams);
+
+    // retrieve the results
+    getresults (queryparams, queryresults);
+    return true;
+  }
+
+  return false;
+}
+
+/* accumulator_method has been changed to use array rather than list.
+list appears to be broken somewhat - for some ranked queries, it returned 
+fewer results than it should have (eg 45 instead of 50). The three other
+methods (array, splay_tree, hash_table) all return the same number of 
+documents, in the same order, with the same ranks. list returns what 
+appears to be the same documents (but less of them), but with different ranks,
+and in a different order. Minimal time tests dont show any speed improvement
+of list over array (maybe because its broken??).  [02/2001, kjm18]
+
+... [sjboddie, also 02/2001] turns out that changing the accumulator_method
+introduced a more serious bug than it fixed (i.e. occasionally when doing a
+ranked search for a very common word you get no results at all). I've
+changed it back to list for now, one day we should play with other
+accumulator_methods but for now I don't have time and don't want to risk
+introducing bugs (better the devil you know ;)
+*/
+void mgsearchclass::setsearchmode (const queryparamclass &queryparams)
+{
+  mgq_ask(".set expert true");
+  mgq_ask(".set sorted_terms true");
+  mgq_ask(".set accumulator_method list");
+  mgq_ask(".set max_accumulators 500000");
+  mgq_ask(".set maxparas 500000");
+  mgq_ask(".set verbatim true");
+  mgq_ask(".unset skip_dump");
+  mgq_ask(".set mode docnums");
+
+  switch (queryparams.search_type) 
+    {
+    case 0: mgq_ask(".set query boolean");  break;
+    case 1:  mgq_ask(".set query ranked"); break;
+    }
+  switch (queryparams.casefolding) 
+    {
+    case 1: mgq_ask(".set casefold on");  break;
+    case 0: mgq_ask(".set casefold off"); break;
+    }
+  switch (queryparams.stemming) 
+    {
+    case 1: mgq_ask(".set stem on");  break;
+    case 0: mgq_ask(".set stem off"); break;
+    }
+  mgq_ask(".set heads_length 150");
+  
+  if (queryparams.maxdocs == -1) {
+    mgq_ask(".set maxdocs all");
+  } else {
+    char maxdocstr[32];
+    sprintf(maxdocstr, ".set maxdocs %i", queryparams.maxdocs);
+    mgq_ask(maxdocstr);
+  }
+}
+
+/**
+ * submitquery constructs the query string (into UTF8 encoding)
+ * and submits it using mgq_ask to the mg search engine.  Most
+ * of the processing will be done inside Greenstone
+ */
+void mgsearchclass::submitquery (const queryparamclass &queryparams)
+{
+  // sort out the query string; copy it, remove all special characters
+  // and then convert it to a string in UTF8 format
+  text_t ttquerystring = queryparams.querystring;
+  filterquery (ttquerystring);
+  char *querystring = to_utf8(ttquerystring).getcstr();
+
+  // submit the query
+  mgq_ask(querystring);
+
+  // destroy the temporary character array
+  delete querystring;
+}
+
+/**
+ * getrults is called to retrieve the required data on the docs
+ * which responded to the query submitted in submitquery above.
+ *
+ * It calls the local mgquery (mgq) interface to MG several times,
+ * to obtain the document numbers, term frequencies, term variants
+ * etc.  All processing of the query will be done by Greenstone
+ * thereafter
+ */
+void mgsearchclass::getresults (const queryparamclass &queryparams,
+				queryresultsclass &queryresults) {
+  // get the configuration for the maximum number of documents to
+  // retrieve
+  int howmany = queryparams.maxdocs;
+  if (howmany == -1) howmany = MAXNUMDOCS;
+  mgq_results(result_docnums, 0, howmany, 
+	      ourquerycallback, (void *)(&queryresults));
+  
+  // get the term frequencies
+  mgq_results(result_termfreqs, 0, MAXNUMTERMS, 
+	      termfreqcallback, (void *)(&queryresults));
+  queryresults.sortuniqqueryterms();
+
+  // get term variants 
+  mgq_results(result_terms, 0, MAXNUMTERMS,
+              termvariantscallback, (void *)(&queryresults));
+
+  // get the number of documents retrieved
+  int total_retrieved = 0, is_approx = 0;
+  mgq_docsretrieved (&total_retrieved, &is_approx);
+
+  if (total_retrieved == 0) {
+    // not available (or really was zero)
+    queryresults.docs_matched = queryresults.docs.docset.size();
+    if ((queryparams.maxdocs == -1) ||
+	(queryresults.docs_matched < queryparams.maxdocs))
+      queryresults.is_approx = Exact;
+    else
+      queryresults.is_approx = MoreThan;
+  } else {
+    queryresults.docs_matched = total_retrieved;
+    if (is_approx) queryresults.is_approx = Approximate;
+    else queryresults.is_approx = Exact;
+  }
+}
+
+/**
+ * Tidies the given querystring, removing special characters
+ */
+void mgsearchclass::filterquery (text_t &ttquerystring) {
+  text_t::iterator ithere = ttquerystring.begin ();
+  text_t::iterator itend = ttquerystring.end ();
+  
+  // remove all non alphanumeric characters (except
+  // boolean operators
+  while (ithere != itend) {
+    if ((!is_unicode_letdig(*ithere)) && (*ithere != '!') &&
+	(*ithere != '&') && (*ithere != '|') && (*ithere != '(') &&
+	(*ithere != ')')) (*ithere) = ' ';
+    ithere++;
+  }
+}
+
+
+// the document text for 'docnum' is placed in 'output'
+// docTargetDocument returns 'true' if it was able to
+// try to get a document
+// collection is needed to see if an index from the 
+// collection is loaded. If no index has been loaded
+// defaultindex is needed to load one
+bool mgsearchclass::docTargetDocument(const text_t &defaultindex,
+				      const text_t &defaultsubcollection,
+				      const text_t &defaultlanguage,
+				      const text_t &collection,
+				      int docnum,
+				      text_t &output) {
+  output.clear();
+
+  // get the mg version of the document
+  char *mgdoc = NULL;
+  int doclen = 0;
+  if (!mgdocument (defaultindex, defaultsubcollection, defaultlanguage,
+		   collection, docnum, mgdoc, doclen)) return false;
+  if (mgdoc == NULL) return false;
+
+  // replace all control-Cs with spaces
+  char *mgdoc_here = mgdoc;
+  char *mgdoc_end = mgdoc + doclen;
+  while (mgdoc_here < mgdoc_end) {
+    if (*mgdoc_here == '\x3') *mgdoc_here = ' ';
+    mgdoc_here++;
+  }
+
+  // convert this document to unicode
+  utf8inconvertclass inconvert;
+  convertclass::status_t status;
+  inconvert.reset ();
+  inconvert.setinput (mgdoc, doclen);
+  inconvert.convert (output, status);
+
+  return true;
+}
+
+
+bool mgsearchclass::mgdocument (const text_t &defaultindex, 
+				const text_t &defaultsubcollection,
+				const text_t &defaultlanguage,
+				const text_t &collection,
+				int docnum,
+				char *&UDoc, int &ULen) {
+  int databaseloaded = 0;
+
+  UDoc = NULL; ULen = 0;
+  
+  // see if we can make an appropriate database current
+//    char *ccollection = collection.getcstr();
+//    assert (ccollection != NULL);
+//    databaseloaded = load_text_database (ccollection);
+//    delete ccollection;
+  
+  // try and load the database
+//    if (!databaseloaded)
+  databaseloaded = makeindexcurrent (defaultindex, defaultsubcollection,
+				     defaultlanguage, collection);
+  
+  if (databaseloaded) {
+    // retrieve the document from mg
+    char docstr[32];
+    sprintf(docstr, "%i", docnum);
+    
+    mgq_ask(".set mode text");
+    mgq_ask(".set query docnums");
+    mgq_ask(docstr);
+
+    tempdoc = NULL;
+    templen = 0;
+    mgq_results (result_docs, 0, 1, doctextcallback, (void *)NULL);
+    UDoc = tempdoc;
+    ULen = templen;
+  }
+
+  return (bool)databaseloaded;
+}
+
+// unload_database simply calls mgq's close_all_databases function to clear
+// any cached databases - this is useful when attempting to completely
+// remove all trace of a collectionserver at runtime (when using a
+// persistent version of Greenstone like the windows local library)
+void mgsearchclass::unload_database () {
+  close_all_databases();
+}
Index: /main/tags/2.38/gsdl/src/colservr/mgsearch.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/mgsearch.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/mgsearch.h	(revision 21083)
@@ -0,0 +1,99 @@
+/**********************************************************************
+ *
+ * mgsearch.h --  implementation of search for old versions of mg
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef MGSEARCH_H
+#define MGSEARCH_H
+
+
+#include "search.h"
+
+class mgsearchclass : public searchclass {
+public:
+  mgsearchclass ();
+  virtual ~mgsearchclass ();
+
+  virtual text_t get_mg_type() {return "mg";}
+
+  // you only need to use this function before doing any stemming
+  // casefolding and stemming will be set if values for them are
+  // provided (0 or 1).
+  // makeindexcurrent returns true if it was able to load the database
+  bool makeindexcurrent (const text_t &index, const text_t &subcollection,
+			 const text_t &language, const text_t &collection,
+			 int casefolding = -1, int stemming = -1);
+
+  // stem word uses the values set in the last call to makeindexcurrent
+  // to stem the word. It is assumed that word is in unicode
+  text_t stemword (const text_t &word);
+  text_t stemword (text_t::const_iterator here, text_t::const_iterator end);
+  
+  // the search results are returned in queryresults
+  // search returns 'true' if it was able to do a search
+  bool search(const queryparamclass &queryparams, 
+	      queryresultsclass &queryresults);
+  
+  // the document text for 'docnum' is placed in 'output'
+  // docTargetDocument returns 'true' if it was able to
+  // try to get a document
+  // collection is needed to see if an index from the 
+  // collection is loaded. If no index has been loaded
+  // defaultindex is needed to load one
+  bool docTargetDocument(const text_t &defaultindex,
+			 const text_t &defaultsubcollection,
+			 const text_t &defaultlanguage,
+			 const text_t &collection,
+			 int docnum,
+			 text_t &output);
+
+  // same as docTargetDocument except the document is returned
+  // in its raw form. UDoc remains the property of mg and may
+  // be destroyed on the next call to mg.
+  bool mgdocument (const text_t &defaultindex,
+		   const text_t &defaultsubcollection,
+		   const text_t &defaultlanguage,
+		   const text_t &collection,
+		   int docnum,
+		   char *&UDoc, int &ULen);
+
+  // unload_database simply calls mgq's close_all_databases function to
+  // clear any cached databases - this is useful when attempting to
+  // completely remove all trace of a collectionserver at runtime (when
+  // using a persistent version of Greenstone like the windows local
+  // library)
+  void unload_database ();
+
+
+protected:
+
+  void setsearchmode (const queryparamclass &queryparams);
+  void submitquery (const queryparamclass &queryparams);
+  void getresults (const queryparamclass &queryparams, queryresultsclass &queryresults);
+
+  virtual void filterquery (text_t &ttquerystring);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.cpp	(revision 21083)
@@ -0,0 +1,84 @@
+/**********************************************************************
+ *
+ * phrasequeryfilter.cpp -- 
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "phrasequeryfilter.h"
+#include "queryinfo.h"
+
+#include "phrasesearch.h"
+
+
+
+// do aditional query processing
+void phrasequeryfilterclass::post_process (const queryparamclass &queryparams,
+					   queryresultsclass &queryresults) {
+  bool results_shrunk = false;
+
+  // post-process the results if needed
+  if (queryresults.orgterms.size() > 1 && !queryresults.docs.docset.empty()) {
+    // get the long version of the index
+    text_t longindex;
+    indexmap.to2from (queryparams.index, longindex);
+      
+    // process each of the matched documents
+    docresultmap::iterator docs_here = queryresults.docs.docset.begin();
+    docresultmap::iterator docs_end = queryresults.docs.docset.end();
+    while (docs_here != docs_end) {
+      if ((*docs_here).second.num_query_terms_matched == queryresults.orgterms.size() &&
+	  OID_phrase_search (*(mgsearchclass *)mgsearchptr, *gdbmptr, queryparams.index,
+			     queryparams.subcollection, queryparams.language, 
+			     longindex, queryparams.collection, queryresults.orgterms,
+			     (*docs_here).second.docnum)) {
+	(*docs_here).second.num_phrase_match++;
+	docs_here++;
+
+      } else {
+	docresultmap::iterator this_doc_here = docs_here;
+	docs_here++;
+	if (queryparams.match_mode == 1) {
+	  // need to delete this element, there was no exact match
+	  queryresults.docs.docset.erase(this_doc_here);
+	  results_shrunk = true;
+	}
+      }
+    }
+  }
+
+  if (results_shrunk) queryresults.docs_matched = queryresults.docs.docset.size();
+}
+
+
+void phrasequeryfilterclass::sort_doc_results (const FilterRequest_t &/*request*/,
+					 docresultsclass &docs) {
+  resultsorderer_t resultsorderer;
+  resultsorderer.compare_phrase_match = true;
+  resultsorderer.compare_terms_match = true;
+  resultsorderer.compare_doc_weight = true;
+  resultsorderer.docset = &(docs.docset);
+
+  // first get a list of document numbers
+  docs.docnum_order();
+
+  sort (docs.docorder.begin(), docs.docorder.end(), resultsorderer);
+}
Index: /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/phrasequeryfilter.h	(revision 21083)
@@ -0,0 +1,43 @@
+/**********************************************************************
+ *
+ * phrasequeryfilter.h -- 
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef PHRASEQUERYFILTER_H
+#define PHRASEQUERYFILTER_H
+
+#include "mgqueryfilter.h"
+
+
+class phrasequeryfilterclass : public mgqueryfilterclass {
+protected:
+  void post_process (const queryparamclass &queryparams,
+		     queryresultsclass &queryresults);
+  void sort_doc_results (const FilterRequest_t &request,
+			 docresultsclass &docs);
+public:
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/phrasesearch.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/phrasesearch.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/phrasesearch.cpp	(revision 21083)
@@ -0,0 +1,250 @@
+/**********************************************************************
+ *
+ * phrasesearch.cpp -- tools to search for a phrase in a larger text
+ * Copyright (C) 1999  DigiLib Systems Limited
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "phrasesearch.h"
+#include "gsdlunicode.h"
+
+inline unsigned char *parse_nonword_word (unsigned char *here, unsigned char *end,
+					  text_t &word) {
+  int c_len = 0;
+  unsigned short c = 0;
+
+  word.clear();
+
+  // parse non word
+  while (here <= end) {
+    c_len = parse_utf8_char (here, end, &c);
+    if (c == '(') {
+      // found a note, look for '}'
+      while (here <= end && c != ')') {
+	c_len = parse_utf8_char (here, end, &c);
+	here += c_len;
+      }
+    }
+    if (c == '{') {
+      // found a composite character, look for '}'
+      while (here <= end && c != '}') {
+	c_len = parse_utf8_char (here, end, &c);
+	here += c_len;
+      }
+    }
+    if (is_unicode_letdig(c)) {
+      while (c_len > 0) {
+	// this is in a word
+	word.push_back(*here);
+	here++; c_len--;
+      }
+      break;
+    }
+    here += c_len;
+  }
+
+  // parse word
+  while (here <= end) {
+    c_len = parse_utf8_char (here, end, &c);
+    if (!is_unicode_letdig(c)) {
+      here += c_len;  // it is ok to skip a nonword character
+      break;
+    }
+    while (c_len > 0) {
+      word.push_back(*here);
+      here++; c_len--;
+    }
+  }
+
+  return here;
+}
+
+static void get_all_docnums (gdbmclass &gdbm, text_t OID, vector<int> &docnum_list) {
+
+  infodbclass OID_info;
+  
+  // get OID
+  if (!gdbm.getinfo (OID, OID_info)) return;
+  if (OID_info["hastxt"] == "1" && !OID_info["docnum"].empty()) {
+    docnum_list.push_back (OID_info["docnum"].getint());
+  }
+
+  // get contents set
+  if (OID_info["contains"].empty()) return;
+  text_tarray contains; text_t tmptext;
+  text_t::iterator contains_here = OID_info["contains"].begin();
+  text_t::iterator contains_end = OID_info["contains"].end();
+  while (contains_here != contains_end) {
+    if (*contains_here == '"') tmptext += OID;
+    else if (*contains_here == ';') {
+      if (!tmptext.empty()) contains.push_back (tmptext);
+      tmptext.clear();
+    } else tmptext.push_back(*contains_here);
+    contains_here++;
+  }
+  if (!tmptext.empty()) contains.push_back (tmptext);
+
+  text_tarray::const_iterator here = contains.begin();
+  text_tarray::const_iterator end = contains.end();
+  while (here != end) {
+    get_all_docnums (gdbm, *here, docnum_list);
+    here ++;
+  }
+}
+
+bool doc_phrase_search (unsigned char *doc, int doclen,
+			const termfreqclassarray &phrase) {
+  // note: this uses the most braindead search routine :-)
+  // however its not so bad as there shouldn't be many partial
+  // matches
+
+  // a null phrase matches anything
+  if (phrase.empty()) return true;
+
+  // if there is nothing then there can't be a match
+  if (doc == NULL || doclen == 0) return false;
+  
+  text_t doc_word;
+  doc_word.reserve (16);
+
+  bool first = true;
+
+  unsigned char *doc_here = doc;
+  unsigned char *doc_herefirstword = doc;
+  unsigned char *doc_end = doc+doclen-1; // unitool conventions :-/
+
+  while (doc_here <= doc_end) {
+    first = true;
+
+    // there will be at least one member of phrase (see above)
+    termfreqclassarray::const_iterator phrase_here = phrase.begin();
+    termfreqclassarray::const_iterator phrase_end = phrase.end();
+    do {
+      // get the next non-word ... and ignore it, then get the next word
+      doc_here = parse_nonword_word (doc_here, doc_end, doc_word);
+      if (first) {doc_herefirstword = doc_here; first = false;}
+
+      // break if this word is not the next in the phrase
+      if ((*phrase_here).utf8equivterms.find (doc_word) ==
+	  (*phrase_here).utf8equivterms.end()) break;
+
+      phrase_here++;
+    } while (doc_here <= doc_end && phrase_here != phrase_end);
+
+    // see if we found a phrase
+    if (phrase_here == phrase_end) return true;
+    
+    doc_here = doc_herefirstword; // set the counter back
+  }
+
+  return false;
+}
+
+// looks for the stemmed phrase in the metadata or text associated with
+// an OID. This function has not been coded with all situations in mind
+bool OID_phrase_search (mgsearchclass &mgsearch,
+			gdbmclass &gdbm,
+			const text_t &index,
+			const text_t &subcollection,
+			const text_t &language,
+			const text_t &longindex,
+			const text_t &collection,
+			const termfreqclassarray &phrase,
+			int docnum) {
+
+  // get OID
+  infodbclass docnum_info;
+  if (!gdbm.getinfo (docnum, docnum_info)) return false;
+  text_t &OID = docnum_info["section"];
+  if (OID.empty()) return false;
+
+  // disect the long index to find out where the text should come from
+  text_t gran, type;
+  text_t::const_iterator longindex_here = longindex.begin();
+  text_t::const_iterator longindex_end = longindex.end();
+  longindex_here = getdelimitstr (longindex_here, longindex_end, ':', gran);
+  longindex_here = getdelimitstr (longindex_here, longindex_end, ':', type);
+
+  if (gran.empty()) return false;
+  
+  // note that we're treating indexes of type 'all' (i.e. text,Title,Creator)
+  // or other composite indexes that contain "text" as if they were simply 'text' indexes
+  if ((type == "text") || (type == "all") || (findword(type.begin(),type.end(),"text") != type.end())) {
+    char *doc = NULL;
+    int doclen = 0;
+  
+    // get text from mg.
+    if (gran == "document") {
+
+      // if this is a document level index (which should only happen if
+      // there are no matching indexes with a finer granularity -- see
+      // mgqueryfilterclass::mg_parse_query_params) then we must do the
+      // phrase search on the entire document (i.e. all the sections)
+      // -- this is going to make a slow process even slower
+      vector<int> docnum_list; text_t fulldoc;
+      get_all_docnums (gdbm, OID, docnum_list);
+      vector<int>::const_iterator this_docnum = docnum_list.begin();
+      vector<int>::const_iterator end_docnum = docnum_list.end();
+      while (this_docnum != end_docnum) {
+	if (mgsearch.mgdocument (index, subcollection, language, collection,
+				 *this_docnum, doc, doclen)) {
+	  fulldoc.appendcstr (doc);
+	}
+	this_docnum ++;
+      }
+      doc = fulldoc.getcstr();
+      doclen = fulldoc.size();
+      bool rv = doc_phrase_search ((unsigned char *)doc, doclen, phrase);
+      delete doc;
+      return rv;
+
+    } else {
+
+      if (!mgsearch.mgdocument (index, subcollection, language, collection,
+				docnum, doc, doclen)) return false;
+      return doc_phrase_search ((unsigned char *)doc, doclen, phrase);
+    } 
+  }
+
+  char *metadata = NULL;
+  text_t::size_type metadata_len = 0;
+  infodbclass OID_info;
+  
+  // get field
+  if (!gdbm.getinfo (OID, OID_info)) return false;
+
+  bool result = false;
+  text_tarray *tarr_ptr = OID_info.getmultinfo (type);
+  if (tarr_ptr != NULL ) {
+    text_tarray::const_iterator subvalue_here = (*tarr_ptr).begin();
+    text_tarray::const_iterator subvalue_end = (*tarr_ptr).end();
+    while (subvalue_here != subvalue_end) {
+      metadata = (to_utf8(*subvalue_here)).getcarr(metadata_len);
+      result = doc_phrase_search ((unsigned char *)metadata, metadata_len, phrase);
+      delete [] metadata;
+
+      if (result) return true;
+      subvalue_here++;
+    }
+  }
+
+  return result;
+}
Index: /main/tags/2.38/gsdl/src/colservr/phrasesearch.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/phrasesearch.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/phrasesearch.h	(revision 21083)
@@ -0,0 +1,50 @@
+/**********************************************************************
+ *
+ * phrasesearch.h -- tools to search for a phrase in a larger text
+ * Copyright (C) 1999  DigiLib Systems Limited
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef PHRASESEARCH_H
+#define PHRASESEARCH_H
+
+
+#include "text_t.h"
+#include "unitool.h"
+#include "mgsearch.h"
+#include "infodbclass.h"
+
+
+// looks for the phrase in the metadata or text associated with
+// a document number. This function has not been coded with all
+// situations in mind and expects mgsearch and gdbm set up ready to go
+bool OID_phrase_search (mgsearchclass &mgsearch,
+			gdbmclass &gdbm,
+			const text_t &index,
+			const text_t &subcollection,
+			const text_t &language,
+			const text_t &longindex,
+			const text_t &collection,
+			const termfreqclassarray &phrase,
+			int docnum);
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/querycache.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/querycache.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/querycache.cpp	(revision 21083)
@@ -0,0 +1,104 @@
+/**********************************************************************
+ *
+ * querycache.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "querycache.h"
+
+
+
+
+resultcacheel::resultcacheel () 
+{
+  accessnum = -1;
+}
+
+
+
+querycache::querycache (int themaxcachesize)
+{
+  if (themaxcachesize < 1) themaxcachesize = 1;
+  
+  resultcache = new resultcacheel[themaxcachesize];
+
+  maxcachesize = themaxcachesize;
+  nextaccessnum = 1;
+}
+
+querycache::~querycache ()
+{
+  delete [] resultcache;
+}
+
+// returns true if the query was found in the cache
+// if the query was found then queryresults contains
+// the results
+bool querycache::find (const queryparamclass &queryparams, 
+		       queryresultsclass &queryresults)
+{
+  int i;
+
+  for (i=0; i < maxcachesize; i++)
+    {
+      if (resultcache[i].queryparameters == queryparams)
+	{
+	  queryresults = resultcache[i].queryresults;
+	  resultcache[i].accessnum = getnextaccessnum ();
+	  return true;
+	}
+    }
+
+  return false;
+}
+
+
+void querycache::cache (const queryparamclass &queryparams,
+	  const queryresultsclass &queryresults)
+{
+  int i = getfreecachenum();
+  resultcache[i].queryparameters = queryparams;
+  resultcache[i].queryresults = queryresults;
+  resultcache[i].accessnum = getnextaccessnum ();
+}
+
+int querycache::getnextaccessnum ()
+{
+  return nextaccessnum++;
+}
+
+int querycache::getfreecachenum ()
+{
+  int i;
+  int minaccessnum = 0;
+  int minaccessi = 0;
+  
+  for (i=0; i < maxcachesize; i++)
+    {
+      if (resultcache[i].accessnum < minaccessnum) {
+	minaccessnum = resultcache[i].accessnum;
+	minaccessi = i;
+      }
+    }
+
+  return minaccessi;
+}
Index: /main/tags/2.38/gsdl/src/colservr/querycache.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/querycache.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/querycache.h	(revision 21083)
@@ -0,0 +1,70 @@
+/**********************************************************************
+ *
+ * querycache.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef QUERYCACHE_H
+#define QUERYCACHE_H
+
+
+#include "text_t.h"
+#include "queryinfo.h"
+
+class resultcacheel
+{
+public:
+  resultcacheel ();
+
+  int accessnum;
+  queryparamclass queryparameters;
+  queryresultsclass queryresults;
+};
+
+
+class querycache {
+public:
+  querycache (int themaxcachesize);
+  ~querycache ();
+
+  // returns true if the query was found in the cache
+  // if the query was found then queryresults contains
+  // the results
+  bool find (const queryparamclass &queryparams, 
+	     queryresultsclass &queryresults);
+
+  void cache (const queryparamclass &queryparams,
+	    const queryresultsclass &queryresults);
+
+protected:
+  resultcacheel *resultcache;
+
+  int maxcachesize;
+  int nextaccessnum;
+  
+  int getnextaccessnum ();
+  int getfreecachenum ();
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/queryfilter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/queryfilter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/queryfilter.cpp	(revision 21083)
@@ -0,0 +1,355 @@
+/**********************************************************************
+ *
+ * queryfilter.cpp -- base class for queryfilters
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "queryfilter.h"
+#include "fileutil.h"
+#include "gsdltools.h"
+#include <assert.h>
+
+
+// translate will return true if successful
+bool queryfilterclass::translate (gdbmclass *gdbmptr, int docnum, text_t &trans_OID) {
+  infodbclass info;
+
+  trans_OID.clear();
+
+  // get the info
+  if (gdbmptr == NULL) return false;
+  if (!gdbmptr->getinfo(docnum, info)) return false;
+
+  // translate
+  if (info["section"].empty()) return false;
+
+  trans_OID = info["section"];
+  return true;
+}
+
+
+// whether document results are needed
+bool queryfilterclass::need_matching_docs (int filterResultOptions) {
+  return ((filterResultOptions & FROID) || (filterResultOptions & FRranking) ||
+	  (filterResultOptions & FRmetadata));
+}
+
+// whether term information is needed
+bool queryfilterclass::need_term_info (int filterResultOptions) {
+  return ((filterResultOptions & FRtermFreq) || (filterResultOptions & FRmatchTerms));
+}
+
+/////////////////////////////////
+// functions for queryfilterclass
+/////////////////////////////////
+
+// get the query parameters
+void queryfilterclass::parse_query_params (const FilterRequest_t &request,
+					   vector<queryparamclass> &query_params,
+					   int &startresults, int &endresults,
+					   text_t &phrasematch, ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  // set defaults for the return parameters
+  query_params.erase(query_params.begin(), query_params.end());
+  startresults = filterOptions["StartResults"].defaultValue.getint();
+  endresults = filterOptions["EndResults"].defaultValue.getint();
+  phrasematch = filterOptions["PhraseMatch"].defaultValue;
+
+  // set defaults for query parameters
+  queryparamclass query;
+  query.combinequery = "or"; // first one must be "or"
+  query.collection = collection;
+  query.index = filterOptions["Index"].defaultValue;
+  query.subcollection = filterOptions["Subcollection"].defaultValue;
+  query.language = filterOptions["Language"].defaultValue;
+  query.querystring.clear();
+  query.search_type = (filterOptions["QueryType"].defaultValue == "ranked");
+  query.match_mode = (filterOptions["MatchMode"].defaultValue == "all");
+  query.casefolding = (filterOptions["Casefold"].defaultValue == "true");
+  query.stemming = (filterOptions["Stem"].defaultValue == "true");
+  query.maxdocs = filterOptions["Maxdocs"].defaultValue.getint();
+  query.level = "";
+  OptionValue_tarray::const_iterator options_here = request.filterOptions.begin();
+  OptionValue_tarray::const_iterator options_end = request.filterOptions.end();
+  while (options_here != options_end) {
+    if ((*options_here).name == "CombineQuery") {
+      // add this query
+      
+      // "all", needed when combining queries where the document results are needed
+      if (need_matching_docs (request.filterResultOptions)) query.maxdocs = -1; 
+      query_params.push_back (query);
+
+      // start on next query
+      query.clear();
+      query.combinequery = (*options_here).value;
+
+      // set defaults for query parameters
+      query.collection = collection;
+      query.index = filterOptions["Index"].defaultValue;
+      query.subcollection = filterOptions["Subcollection"].defaultValue;
+      query.language = filterOptions["Language"].defaultValue;
+      query.querystring.clear();
+      query.search_type = (filterOptions["QueryType"].defaultValue == "ranked");
+      query.match_mode = (filterOptions["MatchMode"].defaultValue == "all");
+      query.casefolding = (filterOptions["Casefold"].defaultValue == "true");
+      query.stemming = (filterOptions["Stem"].defaultValue == "true");
+      query.level = "";
+      // "all", needed when combining queries where the document results are needed
+      if (need_matching_docs (request.filterResultOptions)) query.maxdocs = -1; 
+      else query.maxdocs = filterOptions["Maxdocs"].defaultValue.getint();
+      
+    } else if ((*options_here).name == "StartResults") {
+      startresults = (*options_here).value.getint();
+    } else if ((*options_here).name == "EndResults") {
+      endresults = (*options_here).value.getint();
+    } else if ((*options_here).name == "QueryType") {
+      query.search_type = ((*options_here).value == "ranked");
+    } else if ((*options_here).name == "MatchMode") {
+      query.match_mode = ((*options_here).value == "all");
+      if (query.match_mode == 1) query.maxdocs = -1;
+    } else if ((*options_here).name == "Term") {
+      query.querystring = (*options_here).value;
+    } else if ((*options_here).name == "Casefold") {
+      query.casefolding = ((*options_here).value == "true");
+    } else if ((*options_here).name == "Stem") {
+      query.stemming = ((*options_here).value == "true");
+    } else if ((*options_here).name == "Index"&& (*options_here).value !="") {
+      query.index = (*options_here).value;
+    } else if ((*options_here).name == "Subcollection") {
+      query.subcollection = (*options_here).value;
+    } else if ((*options_here).name == "Language") {
+      query.language = (*options_here).value;
+    } else if ((*options_here).name == "Maxdocs") {
+      query.maxdocs = (*options_here).value.getint();
+    } else if ((*options_here).name == "PhraseMatch") {
+      phrasematch = (*options_here).value;
+    } else if ((*options_here).name == "Level") {
+      query.level = (*options_here).value;
+    } else {
+      logout << text_t2ascii
+	     << "warning: unknown queryfilter option \""
+	     << (*options_here).name
+	     << "\" ignored.\n\n";
+    }
+
+    options_here++;
+  }
+
+  // add the last query
+  query_params.push_back (query);
+}
+
+
+
+
+queryfilterclass::queryfilterclass () {
+  gdbmptr = NULL;
+  mgsearchptr = NULL;
+
+  FilterOption_t filtopt;
+  filtopt.name = "CombineQuery";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "and";
+  filtopt.validValues.push_back("and");
+  filtopt.validValues.push_back("or");
+  filtopt.validValues.push_back("not");
+  filterOptions["CombineQuery"] = filtopt;
+
+  // -- onePerQuery StartResults   integer
+  filtopt.clear();
+  filtopt.name = "StartResults";
+  filtopt.type = FilterOption_t::integert;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "1";
+  filtopt.validValues.push_back("1");
+  filtopt.validValues.push_back("1000");
+  filterOptions["StartResults"] = filtopt;
+
+  // -- onePerQuery EndResults     integer
+  filtopt.clear();
+  filtopt.name = "EndResults";
+  filtopt.type = FilterOption_t::integert;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "10";
+  filtopt.validValues.push_back("-1");
+  filtopt.validValues.push_back("1000");
+  filterOptions["EndResults"] = filtopt;
+
+  // -- onePerQuery QueryType      enumerated (boolean, ranked)
+  filtopt.clear();
+  filtopt.name = "QueryType";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "ranked";
+  filtopt.validValues.push_back("boolean");
+  filtopt.validValues.push_back("ranked");
+  filterOptions["QueryType"] = filtopt;
+
+  // -- onePerQuery MatchMode      enumerated (some, all)
+  filtopt.clear();
+  filtopt.name = "MatchMode";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "some";
+  filtopt.validValues.push_back("some");
+  filtopt.validValues.push_back("all");
+  filterOptions["MatchMode"] = filtopt;
+
+  // -- onePerTerm  Term           string ???
+  filtopt.clear();
+  filtopt.name = "Term";
+  filtopt.type = FilterOption_t::stringt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "";
+  filterOptions["Term"] = filtopt;
+
+  // -- onePerTerm  Casefold       boolean
+  filtopt.clear();
+  filtopt.name = "Casefold";
+  filtopt.type = FilterOption_t::booleant;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "true";
+  filtopt.validValues.push_back("false");
+  filtopt.validValues.push_back("true");
+  filterOptions["Casefold"] = filtopt;
+
+  // -- onePerTerm  Stem           boolean
+  filtopt.clear();
+  filtopt.name = "Stem";
+  filtopt.type = FilterOption_t::booleant;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "false";
+  filtopt.validValues.push_back("false");
+  filtopt.validValues.push_back("true");
+  filterOptions["Stem"] = filtopt;
+
+  // -- onePerTerm  Index          enumerated
+  filtopt.clear();
+  filtopt.name = "Index";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "";
+  filterOptions["Index"] = filtopt;
+
+  // -- onePerTerm  Subcollection  enumerated
+  filtopt.clear();
+  filtopt.name = "Subcollection";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "";
+  filterOptions["Subcollection"] = filtopt;
+
+  // -- onePerTerm  Language  enumerated
+  filtopt.clear();
+  filtopt.name = "Language";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerTerm;
+  filtopt.defaultValue = "";
+  filterOptions["Language"] = filtopt;
+
+  // -- onePerQuery  Maxdocs  integer
+  filtopt.clear();
+  filtopt.name = "Maxdocs";
+  filtopt.type = FilterOption_t::integert;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "200";
+  filtopt.validValues.push_back("-1");
+  filtopt.validValues.push_back("1000");
+  filterOptions["Maxdocs"] = filtopt;
+
+  // -- onePerQuery  PhraseMatch  enumerated
+  filtopt.clear();
+  filtopt.name = "PhraseMatch";
+  filtopt.type = FilterOption_t::enumeratedt;
+  filtopt.repeatable = FilterOption_t::onePerQuery;
+  filtopt.defaultValue = "some_phrases";
+  filtopt.validValues.push_back ("all_phrases");
+  filtopt.validValues.push_back ("some_phrases");
+  filtopt.validValues.push_back ("all_docs");
+  filterOptions["PhraseMatch"] = filtopt;
+}
+
+queryfilterclass::~queryfilterclass () {
+  // don't delete gdbmptr or mgsearchptr here, they'll 
+  // be cleaned up by mggdbmsource
+}
+
+void queryfilterclass::configure (const text_t &key, const text_tarray &cfgline) {
+  filterclass::configure (key, cfgline);
+
+  if (key == "indexmap") {
+    indexmap.importmap (cfgline);
+    
+    // update the list of indexes in the filter information
+    text_tarray options;
+    indexmap.gettoarray (options);
+    filterOptions["Index"].validValues = options;
+
+  } else if (key == "defaultindex") {
+    indexmap.from2to (cfgline[0], filterOptions["Index"].defaultValue);
+
+  } else if (key == "subcollectionmap") {
+    subcollectionmap.importmap (cfgline);
+
+    // update the list of subcollections in the filter information
+    text_tarray options;
+    subcollectionmap.gettoarray (options);
+    filterOptions["Subcollection"].validValues = options;
+
+  } else if (key == "defaultsubcollection") {
+    subcollectionmap.from2to (cfgline[0], filterOptions["Subcollection"].defaultValue);
+
+  } else if (key == "languagemap") {
+    languagemap.importmap (cfgline);
+
+    // update the list of languages in the filter information
+    text_tarray options;
+    languagemap.gettoarray (options);
+    filterOptions["Language"].validValues = options;
+
+  } else if (key == "defaultlanguage") 
+    languagemap.from2to (cfgline[0], filterOptions["Language"].defaultValue);
+}
+
+bool queryfilterclass::init (ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  if (!filterclass::init(logout)) return false;
+
+  // get the filename for the database and make sure it exists
+  gdbm_filename = filename_cat(gdbmhome, "collect", collection, "index", "text", collection);
+
+  if (littleEndian()) gdbm_filename += ".ldb";
+  else gdbm_filename += ".bdb";
+
+  if (!file_exists(gdbm_filename)) {
+    logout << text_t2ascii
+	   << "warning: gdbm database \"" //****
+	   << gdbm_filename << "\" does not exist\n\n";
+    //return false; //****
+  }
+
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/colservr/queryfilter.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/queryfilter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/queryfilter.h	(revision 21083)
@@ -0,0 +1,96 @@
+/**********************************************************************
+ *
+ * queryfilter.h -- abstract base class for queryfilters
+ *          mgqueryfilter and mgppqueryfilter implement this
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef QUERYFILTER_H
+#define QUERYFILTER_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+#include "filter.h"
+#include "infodbclass.h"
+#include "maptools.h"
+#include "search.h"
+#include "queryinfo.h"
+
+
+class queryfilterclass : public filterclass {
+protected:
+
+  stringmap indexmap;
+  stringmap subcollectionmap;
+  stringmap languagemap;
+
+  text_t gdbm_filename;
+  gdbmclass *gdbmptr;
+  
+  searchclass *mgsearchptr;
+  
+   // get the query parameters
+  void parse_query_params (const FilterRequest_t &request,
+			   vector<queryparamclass> &query_params,
+			   int &startresults, int &endresults,
+			   text_t &phrasematch, ostream &logout);
+
+  // do query that might involve multiple sub queries
+  // mgsearchptr and gdbmptr are assumed to be valid
+  virtual void do_multi_query (const FilterRequest_t &request,
+		       const vector<queryparamclass> &query_params,
+		       queryresultsclass &multiresults,
+		       comerror_t &err, ostream &logout)=0;
+
+public:
+  queryfilterclass ();
+  virtual ~queryfilterclass ();
+
+  // the gdbmptr remains the responsability of the calling code
+  void set_gdbmptr (gdbmclass *thegdbmptr) {gdbmptr=thegdbmptr;}
+
+  // the mgsearchptr remains the responsability of the calling code
+  void set_mgsearchptr (searchclass *themgsearchptr) {mgsearchptr=themgsearchptr;}
+
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+  bool init (ostream &logout);
+
+  text_t get_filter_name () {return "QueryFilter";}
+  bool translate(gdbmclass *gdbmptr, int docnum, text_t &trans_OID);
+  bool need_matching_docs (int filterResultOptions);
+  bool need_term_info (int filterResultOptions);
+
+
+  virtual void filter (const FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout)=0;
+
+
+
+};
+
+
+#endif
+
Index: /main/tags/2.38/gsdl/src/colservr/queryinfo.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/queryinfo.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/queryinfo.cpp	(revision 21083)
@@ -0,0 +1,398 @@
+/**********************************************************************
+ *
+ * queryinfo.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "queryinfo.h"
+
+
+// query parameters
+
+queryparamclass::queryparamclass () {
+  clear ();
+}
+
+void queryparamclass::clear () {
+  combinequery.clear();
+  collection.clear();
+  index.clear();
+  subcollection.clear();
+  language.clear();
+  level.clear();
+  querystring.clear();
+  search_type = 0; // 0 = boolean, 1 = ranked
+  match_mode = 0; // 0 = some, 1 = all
+  casefolding = 0;
+  stemming = 0;
+  maxdocs = -1;    // all
+}
+
+
+queryparamclass &queryparamclass::operator=(const queryparamclass &q) {
+  combinequery = q.combinequery;
+  collection = q.collection;
+  index = q.index;
+  subcollection = q.subcollection;
+  language = q.language;
+  level = q.level;
+  querystring = q.querystring;
+  search_type = q.search_type;
+  match_mode = q.match_mode;
+  casefolding = q.casefolding;
+  stemming = q.stemming;
+  maxdocs = q.maxdocs;
+
+  return *this;
+}
+
+
+bool operator==(const queryparamclass &x, const queryparamclass &y) {
+  return ((x.combinequery == y.combinequery) &&
+	  (x.collection == y.collection) &&
+	  (x.index == y.index) &&
+	  (x.subcollection == y.subcollection) &&
+	  (x.language == y.language) &&
+	  (x.level == y.level) &&
+	  (x.querystring == y.querystring) &&
+	  (x.search_type == y.search_type) &&
+	  (x.match_mode == y.match_mode) &&
+	  (x.casefolding == y.casefolding) &&
+	  (x.stemming == y.stemming) &&
+	  (x.maxdocs == y.maxdocs));
+}
+
+bool operator!=(const queryparamclass &x, const queryparamclass &y) {
+  return !(x == y);
+}
+
+
+ostream &operator<< (ostream &outs, queryparamclass &q) {
+  outconvertclass text_t2ascii;
+
+  outs << "*** queryparamclass\n";
+  outs << text_t2ascii << " combinequery = \"" << q.combinequery << "\"\n";
+  outs << text_t2ascii << " collection = \"" << q.collection << "\"\n";
+  outs << text_t2ascii << " index = \"" << q.index << "\"\n";
+  outs << text_t2ascii << " level = \"" << q.level << "\"\n";
+  outs << text_t2ascii << " subcollection = \"" << q.subcollection << "\"\n";
+  outs << text_t2ascii << " language = \"" << q.language << "\"\n";
+  outs << text_t2ascii << " querystring = \"" << q.querystring << "\"\n";
+  outs << " search_type = \"" << q.search_type << "\"\n";
+  outs << " match_mode = \"" << q.match_mode << "\"\n";
+  outs << " casefolding = \"" << q.casefolding << "\"\n";
+  outs << " stemming = \"" << q.stemming << "\"\n";
+  outs << " maxdocs = \"" << q.maxdocs << "\"\n";
+  outs << "\n";
+
+  return outs;
+}
+
+
+
+
+// term frequencies
+
+termfreqclass::termfreqclass () {
+  clear();
+}
+
+void termfreqclass::clear() {
+  termstr.clear();
+  termstemstr.clear();
+  utf8equivterms.erase(utf8equivterms.begin(), utf8equivterms.end());
+  termfreq = 0;
+}
+
+termfreqclass &termfreqclass::operator=(const termfreqclass &t)  {
+  termstr = t.termstr;
+  termstemstr = t.termstemstr;
+  utf8equivterms = t.utf8equivterms;
+  termfreq = t.termfreq;
+
+  return *this;
+}
+	
+bool operator==(const termfreqclass &x, const termfreqclass &y) {
+  return ((x.termstr == y.termstr) &&
+	  (x.termstemstr == y.termstemstr) &&
+	  (x.termfreq == y.termfreq));
+}
+
+bool operator!=(const termfreqclass &x, const termfreqclass &y) {
+  return !(x == y);
+}
+
+// ordered by termfreq and then by termstr
+bool operator<(const termfreqclass &x, const termfreqclass &y) {
+  return ((x.termfreq < y.termfreq) ||
+	  ((x.termfreq == y.termfreq) && (x.termstemstr < y.termstemstr)) ||
+	  ((x.termfreq == y.termfreq) && (x.termstemstr == y.termstemstr) && (x.termstr < y.termstr)));
+}
+
+bool operator>(const termfreqclass &x, const termfreqclass &y) {
+  return ((x.termfreq > y.termfreq) ||
+	  ((x.termfreq == y.termfreq) && (x.termstemstr > y.termstemstr)) ||
+	  ((x.termfreq == y.termfreq) && (x.termstemstr == y.termstemstr) && (x.termstr > y.termstr)));
+}
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, termfreqclass &t) {
+  outconvertclass text_t2ascii;
+
+  outs << text_t2ascii << " t:\"" << t.termstr << "\"";
+  outs << text_t2ascii << " s:\"" << t.termstemstr << "\"";
+  outs << " f:" << t.termfreq << "\n";
+
+  return outs;
+}
+
+
+
+// one query result
+
+docresultclass::docresultclass() {
+  clear ();
+}
+
+void docresultclass::clear () {
+  docnum=-1;
+  docweight=0.0;
+  num_query_terms_matched=0;
+  num_phrase_match=0;
+}
+
+// merges two result classes relating to a single docnum
+docresultclass &docresultclass::combine(const docresultclass &d) {
+  docweight += d.docweight; // budget!
+  num_query_terms_matched += d.num_query_terms_matched;
+  num_phrase_match += d.num_phrase_match;
+
+  return *this;
+}
+
+docresultclass &docresultclass::operator=(const docresultclass &d) {
+  docnum = d.docnum;
+  docweight = d.docweight;
+  num_query_terms_matched = d.num_query_terms_matched;
+  num_phrase_match = d.num_phrase_match;
+
+  return *this;
+}
+
+
+bool operator==(const docresultclass &x, const docresultclass &y) {
+  return ((x.docnum == y.docnum) && (x.docweight == y.docweight) &&
+	  (x.num_query_terms_matched == y.num_query_terms_matched) &&
+	  (x.num_phrase_match == y.num_phrase_match));
+}
+
+bool operator<(const docresultclass &x, const docresultclass &y) {
+  return ((x.docnum < y.docnum) ||
+	  ((x.docnum == y.docnum) &&
+	   ((x.docweight < y.docweight) ||
+	    ((x.docweight == y.docweight) &&
+	     ((x.num_query_terms_matched < y.num_query_terms_matched) ||
+	      ((x.num_query_terms_matched == y.num_query_terms_matched) &&
+	       ((x.num_phrase_match < y.num_phrase_match))))))));
+}
+
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, docresultclass &a) {
+  outs << " d:" << a.docnum << " w:" << a.docweight << "\n";
+  return outs;
+}
+
+
+
+// many document results
+
+docresultsclass::docresultsclass () {
+  clear ();
+}
+
+void docresultsclass::clear () {
+  docset.erase(docset.begin(), docset.end());
+  docorder.erase(docorder.begin(), docorder.end());
+}
+
+void docresultsclass::docnum_order() {
+  docorder.erase(docorder.begin(), docorder.end());
+  
+  docresultmap::iterator here = docset.begin();
+  docresultmap::iterator end = docset.end();
+  while (here != end) {
+    docorder.push_back ((*here).first);
+    here++;
+  }
+}
+
+void docresultsclass::combine_and (const docresultsclass &d) {
+  docorder.erase(docorder.begin(), docorder.end());
+
+  // put the resulting set in tempresults
+  docresultmap tempresults;
+  
+  docresultmap::const_iterator d_here = d.docset.begin();
+  docresultmap::const_iterator d_end = d.docset.end();
+  docresultmap::iterator found = docset.end();
+  while (d_here != d_end) {
+    found = docset.find((*d_here).first);
+    if (found != docset.end()) {
+      (*found).second.combine ((*d_here).second);
+      tempresults[(*found).first] = (*found).second;
+    }
+    d_here++;
+  }
+
+  // then copy it back to docset
+  docset = tempresults;
+}
+
+void docresultsclass::combine_or (const docresultsclass &d) {
+  docorder.erase(docorder.begin(), docorder.end());
+    
+  docresultmap::const_iterator d_here = d.docset.begin();
+  docresultmap::const_iterator d_end = d.docset.end();
+  docresultmap::iterator found = docset.end();
+  while (d_here != d_end) {
+    found = docset.find((*d_here).first);
+    if (found != docset.end()) {
+      (*found).second.combine ((*d_here).second);
+    } else {
+      docset[(*d_here).first] = (*d_here).second;
+    }
+    d_here++;
+  }
+}
+
+void docresultsclass::combine_not (const docresultsclass &d) {
+  docorder.erase(docorder.begin(), docorder.end());
+
+ docresultmap::const_iterator d_here = d.docset.begin();
+ docresultmap::const_iterator d_end = d.docset.end();
+ docresultmap::iterator found = docset.end();
+ while (d_here != d_end) {
+   found = docset.find((*d_here).first);
+   if (found != docset.end()) docset.erase (found);
+   d_here++;
+ }
+}
+
+docresultsclass &docresultsclass::operator=(const docresultsclass &d) {
+  docset = d.docset;
+  docorder = d.docorder;
+
+  return *this;
+}
+
+
+
+
+// query results
+
+void queryresultsclass::clear () {
+  docs_matched = 0;
+  is_approx = Exact;
+
+  postprocessed = false;
+
+  docs.clear();
+  orgterms.erase(orgterms.begin(),orgterms.end());
+  terms.erase(terms.begin(),terms.end());
+}
+
+queryresultsclass &queryresultsclass::operator=(const queryresultsclass &q) {
+  docs_matched = q.docs_matched;
+  is_approx = q.is_approx;
+
+  postprocessed = q.postprocessed;
+  
+  docs = q.docs;
+  terms = q.terms;
+  termvariants = q.termvariants;
+
+  return *this;
+}
+
+void queryresultsclass::sortuniqqueryterms() {
+  termfreqclassarray tempterms = orgterms;
+  text_tset seenterms;
+  terms.erase(terms.begin(), terms.end());
+
+  // sort the terms to get the frequencies in ascending order
+  sort (tempterms.begin(), tempterms.end());
+
+  // insert first occurance of each term (maximum)
+  termfreqclassarray::reverse_iterator here = tempterms.rbegin();
+  termfreqclassarray::reverse_iterator end = tempterms.rend();
+  while (here != end) {
+    if (seenterms.find((*here).termstr) == seenterms.end()) {
+      // the termstemstr and utf8equivterms might be different for
+      // different occurances of the term
+      (*here).termstemstr.clear();
+      (*here).utf8equivterms.erase((*here).utf8equivterms.begin(),
+				   (*here).utf8equivterms.end());
+      terms.push_back(*here);
+      seenterms.insert((*here).termstr);
+    }
+    here++;
+  }
+
+  // now re-sort in ascending order
+  sort (terms.begin(), terms.end());
+}
+
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, queryresultsclass &q) {
+  outs << "*** queryresultsclass\n";
+  outs << "docs\n";
+
+  docresultmap::iterator docshere = q.docs.docset.begin();
+  docresultmap::iterator docsend = q.docs.docset.end();
+  while (docshere != docsend) {
+    outs << (*docshere).second;
+    docshere++;
+  }
+
+  outs << "orgterms\n";
+  termfreqclassarray::iterator orgtermshere = q.orgterms.begin();
+  termfreqclassarray::iterator orgtermsend = q.orgterms.end();
+  while (orgtermshere != orgtermsend) {
+    outs << (*orgtermshere);
+    orgtermshere++;
+  }
+
+  outs << "terms\n";
+  termfreqclassarray::iterator termshere = q.terms.begin();
+  termfreqclassarray::iterator termsend = q.terms.end();
+  while (termshere != termsend) {
+    outs << (*termshere);
+    termshere++;
+  }
+
+  outs << "\n";
+
+  return outs;
+}
Index: /main/tags/2.38/gsdl/src/colservr/queryinfo.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/queryinfo.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/queryinfo.h	(revision 21083)
@@ -0,0 +1,187 @@
+/**********************************************************************
+ *
+ * queryinfo.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef QUERYINFO_H
+#define QUERYINFO_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#  include <ospace\std\algorithm>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#  if defined(GSDL_USE_ALGO_H)
+#    include <algo.h>
+#  else
+#    include <algorithm.h>
+#  endif
+#else
+#  include <vector>
+#  include <algorithm>
+#endif
+
+// query parameters
+
+struct queryparamclass {
+  text_t combinequery;
+  text_t collection;
+
+  // search_index = index+subcollection+language
+  text_t index;
+  text_t subcollection;
+  text_t language;
+  text_t level; // for new mg stuff
+  text_t querystring;
+  int search_type; // 0 = boolean, 1 = ranked
+  int match_mode; // 0 = some, 1 = all
+  int casefolding;
+  int stemming;
+  int maxdocs;
+
+  queryparamclass ();
+  void clear ();
+  queryparamclass &operator=(const queryparamclass &q);
+};
+
+bool operator==(const queryparamclass &x, const queryparamclass &y);
+bool operator!=(const queryparamclass &x, const queryparamclass &y);
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, queryparamclass &q);
+
+
+
+// term frequencies
+
+struct termfreqclass {
+  text_t termstr;
+  text_t termstemstr;
+  text_tset utf8equivterms; // kept as utf8 string for fast matching
+  unsigned int termfreq;
+
+  termfreqclass ();
+  void clear();
+  termfreqclass &operator=(const termfreqclass &t);
+};
+
+typedef vector<termfreqclass> termfreqclassarray;
+
+bool operator==(const termfreqclass &x, const termfreqclass &y);
+bool operator!=(const termfreqclass &x, const termfreqclass &y);
+bool operator<(const termfreqclass &x, const termfreqclass &y);
+bool operator>(const termfreqclass &x, const termfreqclass &y);
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, termfreqclass &q);
+
+
+
+// one query result
+
+struct docresultclass {
+  int docnum;
+  float docweight;
+  unsigned int num_query_terms_matched;  // not available on all versions of mg
+  int num_phrase_match;                  // not available on all versions of mg
+
+  docresultclass();
+  ~docresultclass() {}
+  void clear ();
+  
+  // merges two result classes relating to a single docnum
+  docresultclass &combine(const docresultclass &d);
+
+  docresultclass &operator=(const docresultclass &d);
+};
+
+bool operator==(const docresultclass &x, const docresultclass &y);
+bool operator<(const docresultclass &x, const docresultclass &y);
+
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, docresultclass &a);
+
+
+struct ltint {
+  bool operator()(const int &t1, const int &t2) const
+  { return t1 < t2; }
+};
+
+typedef map<int, docresultclass, ltint> docresultmap;
+
+
+
+// many document results
+
+struct docresultsclass {
+  docresultmap docset;
+  vector<int> docorder;
+
+  docresultsclass ();
+  void clear ();
+  void docnum_order();
+
+  void combine_and (const docresultsclass &d);
+  void combine_or (const docresultsclass &d);
+  void combine_not (const docresultsclass &d);
+  
+  docresultsclass &operator=(const docresultsclass &d);
+};
+
+
+
+
+// query results
+
+struct queryresultsclass {
+  queryresultsclass () {clear();}
+
+  int docs_matched; // not available on all versions of mg
+  isapprox is_approx;
+  //  bool is_approx;   // not available on all versions of mg
+
+  bool postprocessed; // whether this record has been post-processed
+  
+  docresultsclass docs;
+  termfreqclassarray orgterms; // terms before they are sorted and uniqued
+  termfreqclassarray terms;
+  text_tset termvariants;
+  
+  void clear ();
+  queryresultsclass &operator=(const queryresultsclass &q);
+  
+  void sortuniqqueryterms();
+};
+
+// stream output for debugging purposes
+ostream &operator<< (ostream &outs, queryresultsclass &q);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/search.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/search.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/search.cpp	(revision 21083)
@@ -0,0 +1,53 @@
+/**********************************************************************
+ *
+ * search.cpp -- abstract search class for mg
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "search.h"
+
+////////////////////
+// search class //
+////////////////////
+
+searchclass::searchclass ()
+{
+  cache = new querycache (RESULTCACHESIZE);
+ 
+}
+
+searchclass::~searchclass () 
+{
+  if (cache != NULL) 
+    {
+      delete cache;
+      cache = NULL;
+    }
+}
+
+
+void searchclass::setcollectdir (const text_t &thecollectdir)
+{
+  collectdir = thecollectdir;
+}
+
+
Index: /main/tags/2.38/gsdl/src/colservr/search.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/search.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/search.h	(revision 21083)
@@ -0,0 +1,80 @@
+/**********************************************************************
+ *
+ * search.h -- abstract search class for mg systems
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef SEARCH_H
+#define SEARCH_H
+
+#include "text_t.h"
+#include "querycache.h"
+
+#define RESULTCACHESIZE 10
+#define MAXNUMDOCS      1000000
+#define MAXNUMTERMS     100
+
+class searchclass {
+public:
+  searchclass ();
+  virtual ~searchclass ();
+
+  // in subclass, should be over-rided to return "mg" or "mgpp"
+  virtual text_t get_mg_type()=0;
+  // the index directory must be set before any searching
+  // is done
+  virtual void setcollectdir (const text_t &thecollectdir);
+  
+  // the search results are returned in queryresults
+  // search returns 'true' if it was able to do a search
+   virtual bool search(const queryparamclass &queryparams, 
+	      queryresultsclass &queryresults)=0;
+  
+  // the document text for 'docnum' is placed in 'output'
+  // docTargetDocument returns 'true' if it was able to
+  // try to get a document
+  // collection is needed to see if an index from the 
+  // collection is loaded. If no index has been loaded
+  // defaultindex is needed to load one
+  virtual bool docTargetDocument(const text_t &defaultindex,
+			 const text_t &defaultsubcollection,
+			 const text_t &defaultlanguage,
+			 const text_t &collection,
+			 int docnum,
+			 text_t &output)=0;
+
+  // unload_database clears any cached databases - 
+  // this is useful when attempting to
+  // completely remove all trace of a collectionserver at runtime (when
+  // using a persistent version of Greenstone like the windows local
+  // library)
+  virtual void unload_database ()=0;
+
+protected:
+  querycache *cache;
+  text_t collectdir; // the collection directory
+
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/source.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/source.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/source.cpp	(revision 21083)
@@ -0,0 +1,100 @@
+/**********************************************************************
+ *
+ * source.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "source.h"
+#include <assert.h>
+
+
+// default constructor does nothing
+sourceclass::sourceclass () {
+}
+
+// default destructor does nothing
+sourceclass::~sourceclass () {
+}
+
+// configure should be called once for each configuration line
+// default does nothing
+void sourceclass::configure (const text_t &/*key*/, const text_tarray &/*cfgline*/) {
+}
+
+// init should be called after all the configuration is done but
+// before any other methods are called
+// default does nothing
+bool sourceclass::init (ostream &/*logout*/) {
+  return true;
+}
+
+
+// translate_OID translates OIDs using ".pr", ."fc" etc.
+bool sourceclass::translate_OID (const text_t &/*OIDin*/, text_t &/*OIDout*/, 
+				 comerror_t &err, ostream &/*logout*/) {
+  err = noError;
+
+  return false;
+}
+
+
+// get_metadata fills out the metadata if possible, if it is not responsable
+// for the given OID then it will return false.
+bool sourceclass::get_metadata (const text_t &/*requestParams*/, const text_t &/*refParams*/, 
+				bool /*getParents*/, const text_tset &/*fields*/, 
+				const text_t &/*OID*/, MetadataInfo_tmap &metadata, 
+				comerror_t &err, ostream &/*logout*/) {
+  metadata.erase(metadata.begin(), metadata.end());
+  err = noError;
+
+  return false;
+}
+
+bool sourceclass::get_document (const text_t &/*OID*/, text_t &/*doc*/, 
+				comerror_t &err, ostream &/*logout*/) {
+  err = noError;
+
+  return false;
+}
+
+
+bool operator==(const sourceptr &x, const sourceptr &y) {
+  return (x.s == y.s);
+}
+
+bool operator<(const sourceptr &x, const sourceptr &y) {
+  return (x.s < y.s);
+}
+
+
+// thesource remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void sourcelistclass::addsource (sourceclass *thesource) {
+  // can't add a source that doesn't exist
+  assert (thesource != NULL);
+  if (thesource == NULL) return;
+
+  sourceptr sp;
+  sp.s = thesource;
+
+  sourceptrs.push_back(sp);
+}
Index: /main/tags/2.38/gsdl/src/colservr/source.h
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/source.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/source.h	(revision 21083)
@@ -0,0 +1,120 @@
+/**********************************************************************
+ *
+ * source.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef SOURCE_H
+#define SOURCE_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+
+
+class sourceclass {
+public:
+  sourceclass ();
+  virtual ~sourceclass ();
+
+  // configure should be called once for each configuration line
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+
+  // init should be called after all the configuration is done but
+  // before any other methods are called
+  virtual bool init (ostream &logout);
+
+  // translate_OID translates OIDs using ".pr", ."fc" etc.
+  virtual bool translate_OID (const text_t &OIDin, text_t &OIDout, 
+			      comerror_t &err, ostream &logout);
+
+  // get_metadata fills out the metadata if possible, if it is not responsable
+  // for the given OID then it will return false.
+  virtual bool get_metadata (const text_t &requestParams, const text_t &refParams, 
+			     bool getParents, const text_tset &fields,
+			     const text_t &OID, MetadataInfo_tmap &metadata, 
+			     comerror_t &err, ostream &logout);
+
+  virtual bool get_document (const text_t &OID, text_t &doc, 
+			     comerror_t &err, ostream &logout);
+};
+
+
+// The sourceptr class does not 'own' the source. The 
+// source should be deleted by the code which created it.
+class sourceptr {
+public:
+  sourceclass *s;
+
+  sourceptr () {s=NULL;}
+  ~sourceptr () {}
+};
+
+bool operator==(const sourceptr &x, const sourceptr &y);
+bool operator<(const sourceptr &x, const sourceptr &y);
+
+typedef vector<sourceptr> sourceptrlist;
+
+// contains a list of sources
+class sourcelistclass {
+protected:
+  sourceptrlist sourceptrs;
+
+public:
+  // type support for sourcelistclass
+  typedef sourceptrlist::iterator iterator;
+  typedef sourceptrlist::const_iterator const_iterator;
+  typedef sourceptrlist::reference reference;
+  typedef sourceptrlist::const_reference const_reference;
+  typedef sourceptrlist::size_type size_type;
+
+  typedef sourceptrlist::difference_type difference_type;
+  typedef sourceptrlist::const_reverse_iterator const_reverse_iterator;
+  typedef sourceptrlist::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return sourceptrs.begin();}
+  const_iterator begin () const {return sourceptrs.begin();}
+  iterator end () {return sourceptrs.end();}
+  const_iterator end () const {return sourceptrs.end();}
+
+  void erase(iterator pos) {sourceptrs.erase(pos);}
+  void erase(iterator first, iterator last) {sourceptrs.erase(first, last);}
+  sourcelistclass &operator=(const sourcelistclass &x) 
+    {sourceptrs=x.sourceptrs;return *this;}
+
+  bool empty () const {return sourceptrs.empty();}
+  size_type size() const {return sourceptrs.size();}
+
+
+  // added functionality
+  void clear () {sourceptrs.erase(sourceptrs.begin(),sourceptrs.end());}
+
+  // thesource remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addsource (sourceclass *thesource);
+};
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/colservr/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/colservr/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/colservr/win32.mak	(revision 21083)
@@ -0,0 +1,88 @@
+###########################################################################
+#
+# win32 makefile -- src/colservr
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..
+USE_STLPORT = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = -GX
+LDFLAGS =
+DEFS = -D__WIN32__ -DHAVE_CONFIG_H -DPARADOCNUM -D_LITTLE_ENDIAN -DSHORT_SUFFIX
+INCLUDES = -I"$(GSDLHOME)" -I"$(GSDLHOME)\lib" -I"$(GSDLHOME)\src\colservr" \
+	   -I"$(GSDLHOME)\src\recpt" -I"$(GSDLHOME)\packages\mg" \
+	   -I"$(GSDLHOME)\packages\mg\lib" -I"$(GSDLHOME)\packages\mg\src\text" \
+	   -I"$(GSDLHOME)\packages\windows\gdbm\gdbm" \
+	   -I"$(GSDLHOME)\src\mgpp\lib" -I"$(GSDLHOME)\src\mgpp\text"
+
+!IF $(USE_STLPORT)
+DEFS=$(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LIBS =
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $< 
+
+HEADERS = mgq.h search.h mgsearch.h querycache.h queryinfo.h collectserver.h \
+          colservrconfig.h maptools.h filter.h source.h browsefilter.h \
+          queryfilter.h mgqueryfilter.h mggdbmsource.h phrasesearch.h \
+	  phrasequeryfilter.h collectset.h mgppsearch.h mgppqueryfilter.h
+
+SOURCES = mgq.c search.cpp mgsearch.cpp querycache.cpp queryinfo.cpp \
+	  collectserver.cpp colservrconfig.cpp maptools.cpp filter.cpp \
+	  source.cpp browsefilter.cpp queryfilter.cpp mgqueryfilter.cpp \
+	  mggdbmsource.cpp phrasesearch.cpp phrasequeryfilter.cpp \
+	  collectset.cpp mgppsearch.cpp mgppqueryfilter.cpp
+
+OBJECTS = mgq.obj search.obj mgsearch.obj querycache.obj queryinfo.obj \
+	  collectserver.obj colservrconfig.obj maptools.obj filter.obj \
+	  source.obj browsefilter.obj queryfilter.obj mgqueryfilter.obj \
+	  mggdbmsource.obj phrasesearch.obj phrasequeryfilter.obj \
+	  collectset.obj mgppsearch.obj mgppqueryfilter.obj
+
+all : gsdlcolservr.lib
+
+gsdlcolservr.lib : $(OBJECTS)
+	if EXIST gsdlcolservr.lib del gsdlcolservr.lib
+	$(AR) /out:gsdlcolservr.lib $(OBJECTS)
+
+clean:
+	del *.obj
+	del gsdlcolservr.lib
+
+install:
Index: /main/tags/2.38/gsdl/src/db2txt/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/db2txt/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/db2txt/Makefile.in	(revision 21083)
@@ -0,0 +1,87 @@
+###########################################################################
+#
+# Makefile -- Makefile for db2txt
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 Rodger McNab, Stefan Boddie
+#
+#
+# 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.
+#
+#       @(#)Makefile.in	1.3 16 Mar 1994
+#
+###########################################################################
+
+ 
+AR = ar
+CC = @CC@
+CPP = @CXX@
+CCFLAGS = -Wall @CFLAGS@ 
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INCLUDES = -I../../lib @GDBM_INCLUDE@
+LDFLAGS = @LDFLAGS@
+DPLIBS = 
+LIBS = @GDBM_LIBPATH@ -lgdbm @LIBS@
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CCFLAGS)
+CPPCOMPILE = $(CPP) -c $(DEFS) $(INCLUDES) $(CCFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+CPPLINK = $(CPP) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CPPCOMPILE) $< 
+ 
+
+HEADERS = 
+
+SOURCES = db2txt.cpp
+
+OBJECTS = db2txt.o
+
+EXEC    = db2txt
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	$(INSTALL) -d ../../bin/$(GSDLOS)
+	$(INSTALL) -m 755 -s $(EXEC) ../../bin/$(GSDLOS)
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC)
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CCFLAGS) -- $(SOURCES)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+DB2TXT_OBJS = db2txt.o
+
+db2txt: $(DB2TXT_OBJS) $(DPLIBS)
+	$(LINK) $(DB2TXT_OBJS) $(LIBS) 
Index: /main/tags/2.38/gsdl/src/db2txt/db2txt.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/db2txt/db2txt.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/db2txt/db2txt.cpp	(revision 21083)
@@ -0,0 +1,99 @@
+/**********************************************************************
+ *
+ * db2txt.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifdef __WIN32__
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+
+#else
+#include <gdbm.h>
+#endif
+
+#include "gsdlconf.h"
+#include <stdlib.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#include <iostream.h>
+#else
+#include <iostream>
+#endif
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+void print_usage (char *program_name) {
+  cerr << "usage: " << program_name << " database-name\n\n";
+}
+
+
+int main (int argc, char *argv[]) {
+  int block_size = 0, i;
+  GDBM_FILE dbf;
+  datum key, value;
+      
+  // sanity check
+  if (argc != 2) {
+    print_usage (argv[0]);
+    exit (0);
+  }
+  
+  // open the database
+#ifdef __WIN32__
+  dbf = gdbm_open (argv[1], block_size, GDBM_READER, 00664, NULL, 0);
+#else
+  dbf = gdbm_open  (argv[1], block_size, GDBM_READER, 00664, NULL);
+#endif
+  if (dbf == NULL) {
+    cerr << "couldn't create " << argv[1] << "\n";
+    exit (0);
+  }
+
+  key = gdbm_firstkey (dbf);
+  while (key.dptr != NULL) {
+    cout << "[";
+    for (i = 0; i < key.dsize; i++)
+      cout << key.dptr[i];
+    cout << "]\n";
+    value = gdbm_fetch (dbf, key);
+    for (i = 0; i < value.dsize; i++)
+      cout << value.dptr[i];
+    cout << "\n----------------------------------------------------------------------\n";
+    key = gdbm_nextkey (dbf, key);
+    delete value.dptr;
+  }
+  
+  gdbm_close (dbf);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/db2txt/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/db2txt/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/db2txt/win32.mak	(revision 21083)
@@ -0,0 +1,78 @@
+###########################################################################
+#
+# win32 makefile -- db2txt
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..
+USE_STLPORT = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = 
+LDFLAGS =
+
+DEFS = -D__WIN32__ -DHAVE_CONFIG_H
+INCLUDES = -I"$(GSDLHOME)\src\db2txt" -I"$(GSDLHOME)\lib" -I"$(GSDLHOME)\packages\mg\lib" \
+	   -I"$(GSDLHOME)\packages\windows\gdbm\gdbm"
+!IF $(USE_STLPORT)
+DEFS=$(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LIBS = "$(GSDLHOME)\packages\mg\lib\unitool.obj" "$(GSDLHOME)\lib\gsdllib.lib" \
+       "$(GSDLHOME)\packages\windows\gdbm\gdbm\gdbm.lib"
+
+COMPILE = $(CC) -c -GX $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $<
+
+ANSI2KNR = 
+o = .obj
+e = .exe
+
+HEADERS = 
+
+SOURCES = db2txt.cpp
+
+OBJECTS = db2txt$o
+
+EXEC = db2txt$e
+
+all : $(EXEC)
+
+install: $(EXEC)
+	if NOT EXIST "$(GSDLHOME)\bin\windows" mkdir "$(GSDLHOME)\bin\windows"
+	copy $(EXEC) "$(GSDLHOME)\bin\windows"
+
+clean:
+	del *$o
+	del $(EXEC)
+
+db2txt$e: $(OBJECTS) $(LIBS)
+	  $(LINK) $(OBJECTS) $(LIBS)
Index: /main/tags/2.38/gsdl/src/getpw/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/getpw/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/getpw/Makefile.in	(revision 21083)
@@ -0,0 +1,83 @@
+###########################################################################
+#
+# Makefile -- Makefile for getpw
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+# 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.
+#
+###########################################################################
+
+ 
+AR = ar
+CC = @CC@
+CFLAGS = @CFLAGS@
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@ 
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+# need to include config.h
+INCLUDES = -I../.. -I../../lib
+LDFLAGS = @LDFLAGS@
+DPLIBS = 
+LIBS = @LIBS@
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+ 
+LINK = $(CXX) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXX) -c $(DEFS) $(INCLUDES) $(CXXFLAGS) $< 
+
+HEADERS = 
+
+SOURCES = getpw.cpp
+
+OBJECTS = getpw.o
+
+EXEC    = getpw
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	$(INSTALL) -d ../../bin/$(GSDLOS)
+	$(INSTALL) -m 755 -s $(EXEC) ../../bin/$(GSDLOS)
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC)
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CCFLAGS) -- $(SOURCES)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+GETPW_OBJS = getpw.o
+
+getpw: $(GETPW_OBJS) $(DPLIBS)
+	$(LINK) $(GETPW_OBJS) $(LIBS) 
+
Index: /main/tags/2.38/gsdl/src/getpw/getpw.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/getpw/getpw.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/getpw/getpw.cpp	(revision 21083)
@@ -0,0 +1,93 @@
+/**********************************************************************
+ *
+ * getpw.cpp -- 
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the 
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ * 
+ * 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.
+ *
+ **********************************************************************/
+
+#define _XOPEN_SOURCE 1
+/* following is for solaris */
+#define _XOPEN_SOURCE_EXTENDED 1
+
+#include "gsdlconf.h"
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+
+// include crypt
+#if defined(__WIN32__)
+#include "crypt.h"
+#else
+
+#include "config.h"
+#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#endif
+
+#if defined(HAVE_UNISTD_H)
+#include <unistd.h>
+#endif
+/* we are probably in trouble if we have neither crypt.h or unistd.h,
+   but for now we'll do nothing about it... */
+
+#endif  /* not WIN32 */
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#include <string.h>
+#include <pwd.h>
+
+int main (int argc, char *argv[]) {
+
+  char c[10];
+  while (1) {
+    char *a = getpass("Enter password:");
+    int len = strlen (a);
+    if (len < 3 || len > 8) {
+      cerr << "Password must be between 3 and 8 characters long. Try again\n";
+      continue;
+    }
+    strcpy (c, a);
+    char *b = getpass("Re-enter password:");  
+    if ((strcmp (c, b)) == 0) break;
+    else cerr << "Passwords didn't match. Try again.\n";
+  }
+
+  char *salt = "Tp";
+  char *pw = crypt (c, salt);
+
+  cout << pw << "\n";
+  
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/hashfile/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/hashfile/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/hashfile/Makefile.in	(revision 21083)
@@ -0,0 +1,83 @@
+###########################################################################
+#
+# Makefile -- Makefile for hashfile
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 Rodger McNab, Stefan Boddie
+#
+#
+# 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.
+#
+#       @(#)Makefile.in	1.3 16 Mar 1994
+#
+###########################################################################
+
+ 
+AR = ar
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INCLUDES = -I../../lib
+LDFLAGS = @LDFLAGS@
+LIBS = ../../lib/gsdllib.a
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+ 
+COMPILE = $(CXX) -c $(DEFS) $(INCLUDES) $(CCFLAGS)
+LINK = $(CXX) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(COMPILE) $< 
+ 
+
+HEADERS = 
+
+SOURCES = hashfile.cpp
+
+OBJECTS = hashfile.o
+
+EXEC    = hashfile
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	$(INSTALL) -d ../../bin/$(GSDLOS)
+	$(INSTALL) -m 755 -s $(EXEC) ../../bin/$(GSDLOS)
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC)
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CCFLAGS) -- $(SOURCES)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+HASHFILE_OBJS = hashfile.o
+
+hashfile: $(HASHFILE_OBJS) $(LIBS)
+	$(LINK) $(HASHFILE_OBJS) $(LIBS) 
Index: /main/tags/2.38/gsdl/src/hashfile/hashfile.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/hashfile/hashfile.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/hashfile/hashfile.cpp	(revision 21083)
@@ -0,0 +1,263 @@
+/**********************************************************************
+ *
+ * hashfile.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <stdio.h>
+
+#define MAXNUMLEN  100   // bytes
+
+
+// The number class is used to store very long unsigned integers.
+// The least significant of each number is stored first. Numbers can 
+// be no longer than MAXNUMLEN bytes long. A number with length=0
+// is considered to be equal to 0. There should be no extra zeros
+// at the front of the number.
+
+struct number {
+  unsigned int len;
+  unsigned char num[MAXNUMLEN];
+
+  number () {len = 0;}
+};
+
+
+// evaluates a = a + b
+// a and b can be the same number
+void my_inc (number &a, number &b) {
+  unsigned int carry = 0;
+  unsigned int num = 0;
+  unsigned int i = 0;
+
+  while ((carry || (i < a.len) || (i < b.len)) && (i < MAXNUMLEN)) {
+    num = carry;
+    if (i < a.len) num += a.num[i];
+    if (i < b.len) num += b.num[i];
+
+    if (num >= 256) {
+      num -= 256; // assumes that each number in the list < 256
+      carry = 1;
+    } else {
+      carry = 0;
+    }
+    a.num[i] = (unsigned char)num;
+
+    i++;
+  }
+
+  a.len = i;
+}
+
+
+// evaluates a = a - b if a >= b
+// returns true if the subtraction was possible
+int my_ifpos_dec (number &a, number &b) {
+  int carry = 0;
+  int num = 0;
+  int i = 0;
+  unsigned int len = 0; // the last non-zero digit
+
+  // make sure a >= b
+  if (b.len > a.len) return 0;
+  if (b.len == a.len) {
+    i = a.len - 1;
+    while (i >= 0) {
+      if (a.num[i] > b.num[i]) break;
+      if (a.num[i] < b.num[i]) return 0;
+      i--;
+    }
+  }
+
+  unsigned int j = 0;
+  len = 0;
+  while ((j < a.len) || (j < b.len)) {
+    num = -carry;
+    if (j < a.len) num += a.num[j];
+    if (j < b.len) num -= b.num[j];
+
+    if (num < 0) {
+      num += 256; // assumes each number in the list < 256
+      carry = 1;
+    } else {
+      carry = 0;
+    }
+
+    a.num[j] = (unsigned char) num;
+    
+    j++;
+    if (num != 0) len = j;
+  }
+
+  a.len = len;
+
+  if (carry) {
+    // panic, this should NOT happen
+    fprintf (stderr, "panic: error in my_ifpos_dec\n");
+  }
+
+  return 1;
+}
+
+
+char *my_convert_num (number &a) {
+  char *result = new char[(a.len*2)+1];
+  int i,len;
+  char convert[16] = {'0','1','2','3','4','5','6','7',
+		      '8','9','a','b','c','d','e','f'};
+
+  // zero might be a special case
+  if (a.len == 0) {
+    result[0] = '0';
+    result[1] = '\0';
+    return result;
+  }
+
+  for (i=a.len-1, len=0; i >= 0; i--) {
+    result[len++] = convert[a.num[i]/16];
+    result[len++] = convert[a.num[i]%16];
+  }
+  result[len] = '\0';
+
+  return result;
+}
+
+
+
+// create a hash string from the contents of a file.
+//
+// The file is treated as a large base 256 number (each char is a digit),
+// and the hash value is the remainder when this number is divided by a
+// very large prime.
+//
+// PROBLEM: This is a flawed hash function because the rightmost (highest)
+// value in remainder is more likely to be a "1" than it is to be any other
+// number.  
+//
+// EVIDENCE: About 50% of the files in any GSDL directory have a hash code
+// that starts with 01* which implies (based on the my_convert_num function)
+// that the rightmost "digit" of the remainder = z such that (z % 16 = 0)
+// and (z / 16 = 1) which means (z = 1).
+//
+// MAJOR REASON: suppose our prime number was 19.  Then, if we have a 
+// reasonably random distribution of numbers for which we are going to 
+// calculate (N % 19), we expect to get a roughly uniform distribution
+// of remainders where the possible values are 0, 1, 2, 3... 18.  The
+// problem is that 9 out of the 19 possible values (10,11... 18) start
+// with the digit 1.  Thus our hascode will start with "01".
+//
+// ANOTHER PROBLEM: Characters in the file are read one at a time; after each 
+// one is read it is prepended to the remainder, then the remainder is
+// recalculated on the string thus far seen.  I am sure the math here 
+// is wrong - if I try calculating (111 mod 7) by the same algorithm, it
+// simply does nor work.
+//
+// ANOTHER POSSIBLE PROLEM: Each character from the file is read into 
+// remainder at the most significant end, and when that character
+// is a zero you get a number like "01" which would be considered 
+// larger than a number like "8" because it is longer (two  digits
+// instead of 1).  
+//
+// These comments added by Gordon Paynter (gwp@cs.waikato.ac.nz) in
+// June 2000.  I didn't write any code, however.
+
+char *hashfile (char *filename) {
+  FILE *infile = (FILE *)NULL;
+  int i;
+
+  number primepow[8];
+  number pow;
+  number remainder;
+  unsigned char c;
+
+  // our prime number (618970019642690137449562111)
+  pow.num[0] = 255;  pow.num[1] = 255;
+  pow.num[2] = 255;  pow.num[3] = 255;
+  pow.num[4] = 255;  pow.num[5] = 255;
+  pow.num[6] = 255;  pow.num[7] = 255;
+  pow.num[8] = 255;  pow.num[9] = 255;
+  pow.num[10] = 255; pow.num[11] = 1;
+  pow.len = 12;
+
+  // calculate 8 multiples of the prime number.
+  // These are used to find the remainder using only subtraction operations
+  for (i=0; i<8; i++) {
+    primepow[i] = pow;
+    my_inc (pow, pow);
+  }
+
+  // The "remainder" after division by the prime.  Our result.
+  remainder.len = 0;
+
+  // open the file
+  infile = fopen (filename, "rb");
+  if (infile == NULL) {
+    return (char *)NULL;
+  }
+  c = (unsigned char)fgetc(infile);
+  
+  while (!feof (infile)) {
+
+    // make sure the remainder has not grown too large
+    if (remainder.len == MAXNUMLEN-1) {
+      fprintf (stderr, "ERROR - number overflow\n");
+      return (char *)NULL;
+    }
+
+    // remainder = remainder * 256 + c
+    for (i=remainder.len; i>0; i--) {
+      remainder.num[i] = remainder.num[i-1];
+    }
+    remainder.num[0] = c;
+    if (remainder.len > 0 || c != 0) remainder.len = remainder.len+1;
+    
+    // remainder = (remainder % large-prime-number)
+    for (i=7; i>=0; i--) {
+      my_ifpos_dec (remainder, primepow[i]);
+    }
+
+    // read a new character from the file
+    c = (unsigned char)fgetc(infile);
+  }
+
+  fclose (infile);
+
+  return my_convert_num (remainder);
+}
+
+
+int main (int argc, char *argv[]) {
+  int i;
+  char *result;
+
+  for (i = 1; i < argc; i++) {
+    result = hashfile (argv[i]);
+    if (result == NULL) {
+      printf ("ERROR - could not process %s\n", argv[i]);
+    } else {
+      printf ("%s: %s\n", argv[i], result);
+      delete [] result;
+    }
+  }
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/hashfile/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/hashfile/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/hashfile/win32.mak	(revision 21083)
@@ -0,0 +1,69 @@
+###########################################################################
+#
+# win32 makefile -- hashfile
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+ 
+GSDLHOME = ..\..
+
+AR = lib
+CC = cl
+CPPFLAGS = 
+DEFS = -DHAVE_CONFIG_H -D__WIN32__
+INCLUDES = -I"$(GSDLHOME)\src\hashfile"
+LIBS =
+
+COMPILE = $(CC) -c -GX $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $<
+
+ANSI2KNR = 
+o = .obj
+e = .exe
+ 
+HEADERS = 
+
+SOURCES = hashfile.cpp
+
+OBJECTS = hashfile$o
+
+EXEC = hashfile$e
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	if NOT EXIST "$(GSDLHOME)\bin\windows" mkdir "$(GSDLHOME)\bin\windows"
+	copy $(EXEC) "$(GSDLHOME)\bin\windows"
+
+clean:
+	del *$o
+	del $(EXEC)
+
+HASHFILE_OBJS = hashfile$o
+
+hashfile$e: $(HASHFILE_OBJS) $(LIBS)
+	    $(LINK) $(HASHFILE_OBJS) $(LIBS)
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Makefile
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Makefile	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Makefile	(revision 21083)
@@ -0,0 +1,18 @@
+
+
+
+CLASSES = Phind.class ResultCanvas.class ResultItemDocument.class \
+          ResultTitle.class PhindTitle.class ResultDisplay.class \
+          ResultItemLink.class ResultBox.class ResultItem.class \
+          ResultItemPhrase.class PhindTitle.class URLUTF8Encoder.class
+
+all: Phind.jar
+
+clean:
+	rm -f $(CLASSES) Phind.jar
+
+Phind.jar: $(CLASSES)
+	jar cf Phind.jar org
+
+%.class : %.java
+	javac -d . -classpath ../../../.. $<
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Phind.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Phind.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/Phind.java	(revision 21083)
@@ -0,0 +1,907 @@
+/**********************************************************************
+ *
+ * Phind.java -- the Phind java applet
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+/*********************************************************************
+
+To use the applet, you'll need to embed it in a web page like this:
+
+<APPLET CODE="Phind.class" WIDTH=500 HEIGHT=500>
+
+  <PARAM NAME=collection  VALUE="fao.org">
+  <PARAM NAME=classifier  VALUE="1">
+  <PARAM NAME=phindcgi    VALUE="http://kowhai/cgi-bin/phindcgi">
+  <PARAM NAME=library     VALUE="http://kowhai/cgi-bin/library">
+  <PARAM NAME=backdrop    VALUE="http://kowhai/~paynter/transfer/phindtest/green1.jpg">
+  The Phind java applet.
+</APPLET>
+
+There are a bunch of other parameters; these are described in the 
+getParameters method below.  It is all done for you in Greenstone
+in the document.dm macro file (the _phindapplet_ macro).
+
+You may have problems with Java applet security.  Java applet's can only
+open socket connections (including the HTTP connections the applet uses 
+to get data) to the same server the applet was loaded from.  This means
+that your phindcgi, library, and (optional) backdrop URLs must be on the
+same machine that your web page was loaded from.
+
+**********************************************************************
+
+The applet comprises several classes:
+
+1. Phind (this file) is the applet class, loaded by the browser.
+   It also handles network connections.
+2. ResultDisplay is a Panel that sits in the applet and displays 
+   things; displays are connected in a doubly-linked list.
+3. ResultBox holds the results of a query.  Result boxes are shown
+   to the user through ResultDisplays.  Another doubly-linked list.
+4. ResultTitle acts as a caption to a ResultBox describing its contents.
+5. ResultCanvas is what the ResultBox data is drawn on.  It draws the
+   words on the screen, and handles user input from the mouse.
+6. ResultItem represents a single result object (a phrase or document).
+7. PhindTitle is for drawing backdrops in ResultDisplays.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.awt.BorderLayout;
+import java.awt.Button;
+import java.awt.Choice;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.Event;
+import java.awt.FlowLayout;
+import java.awt.Font;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.Label;
+import java.awt.Panel;
+import java.awt.TextField;
+
+import java.net.URL;
+import java.io.DataInputStream;
+
+import java.net.Socket;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.io.IOException;
+
+import java.util.Vector;
+import java.util.Date;
+
+import org.nzdl.gsdl.Phind.URLUTF8Encoder;
+
+public class Phind extends java.applet.Applet {
+    
+    // What is the collection called?
+    public String collection;
+
+    // Which phind classifier are we using? (There may be more than one.)
+    public String classifier;
+
+    // Internet address of phind resources
+    public String library_address, phindcgi_address;
+
+    // Initial serach term
+    public String initialSearch;
+
+    // Number of phrases to retrieve at any one time
+    public int phraseBlockSize;
+
+    // Appearance parameters
+    public boolean vertical;
+    public int depth;
+
+    // Font
+    public int fontSize;
+    public String fontName;
+    public Font plainFont, boldFont;
+
+    // Do we want a background image in the applet?
+    public boolean showImage;
+    public String backdrop_address;
+    public Image backgroundImage;
+    public boolean showBorder;
+
+    // Colours
+    public Color panel_fg, panel_bg,
+	column_1_fg, column_1_bg, 
+	column_2_fg, column_2_bg,
+	highlight_fg, highlight_bg,
+	thesaurus_fg, thesaurus_bg, thesaurus_bar_fg, thesaurus_bar_bg,
+	expansion_fg, expansion_bg, expansion_bar_fg, expansion_bar_bg,
+	document_fg, document_bg, document_bar_fg, document_bar_bg,
+	message_fg, message_bg;
+    
+    // Column dimensions
+    int column_1_width, column_2_width;
+
+    // Where do we open new windows
+    String searchWindowName, documentWindowName;
+
+    // the mode of operation
+    int mode;
+    final int initMode = 0;
+    final int idleMode = 1;
+    final int searchMode = 2;
+
+    // Elements of the control panel
+    boolean showControlPanel;
+    Label titleLabel;
+    TextField wordField;
+    Button searchButton, prevButton, nextButton;
+
+    // Holders for the downloaded data
+    Panel resultPanel;
+    ResultDisplay firstDisplay, lastDisplay;
+
+    // The time at which the last query finished
+    Date lastQueryEndTime;
+
+    // lastQueryEndTime is stored to ensure a 1 second gap between a query
+    // returning and a new one beginning.  It is needed because the FAO
+    // folks in Rome have a huge lag, and frquently click several times
+    // while they wait; these clicks are turned into new queries, which
+    // they await again.  It is no elegant solution, but it seems like the
+    // easiest, given that I don't know threads.
+    // 1. The search button is easy to disable, and is disabled when a
+    //    socket connection is in progress.
+    // 2. ResutCanvas widgets can'r be similarly disabled because the
+    //    browser hides or wipes them, which looks very bad.
+    // 3. I cannot just ignore clicks on canvasses because the browser
+    //    caches the clicks while the socket connection is going on, and then
+    //    sends them through afterwards, when the canvas is accepting clicks
+    //    again.
+    // 4. Current sequence of events is to record the time the last query
+    //    ends, then whenever a click happens make sure a second has past.  if
+    //    you double-click the the first query is sent, returns, end-tie is
+    //    set, and the second (and any others made during query time) is
+    //    *immediately* processed, but since 1 second hasn't past it is
+    //    ignored.
+
+  
+    public String getAppletInfo() {
+	return "Phind by Gordon Paynter (paynter@cs.waikato.ac.nz). Copyright 1997-2000.";
+    }
+
+
+    public void init() {
+
+	mode = initMode;
+	
+	// Read applet parameters
+	getParameters();
+
+	// Initialise the user interface
+	setBackground(panel_bg);
+	lastQueryEndTime = new Date();
+
+	// fonts used to output text
+	plainFont = new Font(fontName, Font.PLAIN, fontSize);
+	boldFont  = new Font(fontName, Font.BOLD, fontSize);
+
+	// The phind applet layout manager
+	setLayout(new BorderLayout());
+
+	// Panel containing the displays is in the center of the display
+	resultPanel = new Panel();
+	if (vertical) {
+	    resultPanel.setLayout(new GridLayout(depth,1,0,2));
+	} else {
+	    System.out.println("horizontal");
+	    resultPanel.setLayout(new GridLayout(1,depth,2,0));
+	}
+	add("Center", resultPanel);
+
+	// Create ResultDisplays and place into the interface
+	ResultDisplay d1, d2 = null;
+	firstDisplay = new ResultDisplay(this, null);
+	resultPanel.add(firstDisplay);
+
+	if (depth == 1) {
+	    lastDisplay = firstDisplay;
+	} else {
+	    d1 = firstDisplay;
+	    for (int i = 2; i <= depth; i++) {
+		d2 = new ResultDisplay(this, d1);
+		resultPanel.add(d2);
+		d1 = d2;
+	    }
+	    lastDisplay = d2;
+	}
+
+	// The control panel
+	initialiseControlPanel();
+
+	// lets get started then
+	setStatus("Welcome to Phind.");
+	mode = idleMode;
+
+	// Perform initial search, if requested
+	if (initialSearch.length() > 0) {
+	    searchForWord(initialSearch);
+	}
+    }
+
+
+    // Display a message in the status bar
+    void setStatus(String status) {
+	showStatus(status);
+    }
+
+    // The user performs an action in the interface
+    public boolean action(Event evt, Object arg) {
+
+	if (evt.target == searchButton) {
+	    searchForWord(getSearchTerm());
+	} else if (evt.target == wordField) {
+	    searchForWord(getSearchTerm());
+	} else if (evt.target == prevButton) {
+	    shiftPrevious();
+	} else if (evt.target == nextButton) {
+	    shiftNext();
+	} else {
+	    System.out.println("unknown action: " + evt.toString() 
+			       + ", object: " + arg.toString());
+	}
+	return true;
+    }
+
+
+    // Search for a word 
+    //
+    // Called on two occasions:
+    //   when the "Search" Button is pressed, or
+    //   to perform an "initial search"
+    void searchForWord(String searchWord) {
+
+	if (mode == idleMode) {
+	    
+	    setSearchTerm(searchWord);
+
+	    // Convert the String from UTF8 charaters into 
+	    // an encoding that is okay for a URL.
+	    searchWord = URLUTF8Encoder.encode(searchWord);
+
+	    // Look up the word
+	    if (searchWord.length() > 1) {
+		setStatus("searching for \"" + searchWord + "\""); 
+		firstDisplay.emptyContents();
+		ResultBox result = lookupPhraseOnServer(null, false, searchWord, searchWord, 2);
+
+		// if there is an error, return
+		if (result == null) {
+		    setStatus("No results for \"" + searchWord + "\""); 
+		    return;
+		}
+
+		// display the result
+		result.display = firstDisplay.display(result);
+		result.resize(result.display.size());
+		result.paintAll(result.getGraphics());
+	    }
+
+	    enablePreviousAndNext();
+	}
+    }
+  
+
+    // Search for a phrase
+    //
+    // If querymode is 2, the user has clicked on a phrase.
+    // If querymode is 3, the user has requested more phrases.
+    // If querymode is 4, the user has requested more documents.
+    void searchForPhrase(ResultBox source, String key, String phrase, int queryMode) {
+
+	// System.out.println("searchForPhrase: " + key + " " + phrase + " " + queryMode);
+
+	if (mode == idleMode) {
+
+	    // If we are going to replace the first ResultDisplay, then empty it
+	    if (queryMode <= 2) {
+		if (source.display.next != null) source.display.next.emptyContents();
+	    }
+
+	    // look up the word
+	    setStatus("Searching for \"" + phrase + "\""); 
+	    ResultBox result = lookupPhraseOnServer(source, true, key, phrase, queryMode);
+	    if (result == null) {
+		setStatus("No result for \"" + phrase + "\""); 
+		return;
+	    }
+
+	    // If this is not already displayed, display it in the last free spot
+	    if (queryMode <= 2) {
+		result.display = lastDisplay.display(result);
+		result.resize(result.display.size());
+		result.paintAll(result.getGraphics());
+	    }
+
+	    enablePreviousAndNext();
+	}
+    }
+
+
+    // Look up a phrase (or symbol) on the server
+    //
+    // Arguments are the source of the query (a ResultBox, or null if the
+    // query comes from hitting the search button), the key to search for
+    // (the text of a phrase or a symbol number), the phrase as a string, 
+    // and the query mode.
+    // Query modes are: 
+    //   0 = obsolete
+    //   1 = obsolete
+    //   2 = get first N phrases and URLs,
+    //   3 = get another N phrases into same window
+    //   4 = get another N documents into same window
+    //   5 = get another N thesaurus links into same window
+
+    ResultBox lookupPhraseOnServer(ResultBox source, 
+				   boolean keyKnown, String key, String phrase, 
+				   int queryMode) { 
+    	disableSearchButton();
+	mode = searchMode;
+	ResultBox r = null;
+
+	if (queryMode <= 2) {
+	    r = new ResultBox(this, collection, key, phrase, source);
+	} else if ((queryMode == 3) || (queryMode == 4) || (queryMode == 5)) {
+	    r = source;
+	}
+
+	try { 
+	    queryServer(keyKnown, key, queryMode, r);
+	} catch (Exception e) { 
+	    System.out.println("Phind query error: " + e.toString());
+	    setStatus("Query error: " + e.toString());
+	    mode = idleMode;
+	    enableSearchButton();
+	    return null;
+	}
+      
+	// The query is finished
+	setStatus(r.c.numberOfItems + " results for \"" + phrase + "\""); 
+	mode = idleMode;
+	enableSearchButton();
+	lastQueryEndTime = new Date();
+
+	return r;
+    }
+
+
+    // Query the phindcgi program
+    //
+    // Send a query (a word or symbol number) to the server
+    // and pass the response to a ResultBox.
+
+    void queryServer(boolean keyKnown, String word, int queryMode, ResultBox area) 
+	throws IOException {
+
+	// Build the query
+	String query = phindcgi_address + "pxml=1&c=" + collection + "&pc=" + classifier;
+
+	if (keyKnown) {
+	  query = query + "&ppnum=" + word;
+	} else {
+	  query = query + "&pptext=" + word;
+	}
+
+	
+	// Specify the set of results to return 
+	int first_e = 0;
+	int last_e = 0;
+	int first_d = 0;
+	int last_d = 0;
+	int first_l = 0;
+	int last_l = 0;
+
+	// the initial query
+	if (queryMode <= 2) {
+	  last_e = phraseBlockSize;
+	  last_d = phraseBlockSize;
+	  last_l = phraseBlockSize;
+	}
+
+	// add phrases to an existing result set
+	else if (queryMode == 3) {
+	  first_e = area.nextPhraseBlock * phraseBlockSize;
+	  area.nextPhraseBlock++;
+	  last_e = area.nextPhraseBlock * phraseBlockSize;
+	} 
+	
+	// add documents to existing result set
+	else if (queryMode == 4) {
+	  first_d = area.nextDocumentBlock * phraseBlockSize;
+	  area.nextDocumentBlock++;
+	  last_d = area.nextDocumentBlock * phraseBlockSize;
+	}
+
+	// add thesaurus links to existing result set
+	else if (queryMode == 5) {
+	  first_l = area.nextThesaurusLinkBlock * phraseBlockSize;
+	  area.nextThesaurusLinkBlock++;
+	  last_l = area.nextThesaurusLinkBlock * phraseBlockSize;
+	}
+
+	query = query + "&pfe=" + first_e + "&ple=" + last_e
+                      + "&pfd=" + first_d + "&pld=" + last_d
+                      + "&pfl=" + first_l + "&pll=" + last_l;
+
+	// Send the query to the phindcgi program 
+	System.out.println("sending query: " + query);
+	try {
+	    URL phindcgi = new URL(query);
+	    DataInputStream in = new DataInputStream(phindcgi.openStream());
+	    byte[] buffer;
+	    int availableBytes = 0;
+
+	    while (!area.finished) {
+		availableBytes = in.available();
+		if (availableBytes == 0) {
+		    // if i had threads i'd do a wait here for 1 second
+		} else {
+		    buffer = new byte[availableBytes];
+		    in.read(buffer);
+		    area.parseBytes(buffer);
+		}
+	    }
+	    
+	    in.close();
+	} catch (Exception e) {
+	    System.err.println( "Error sending query to phindcgi: " + e);
+	}
+	area.repaint();
+    }
+    
+
+    // Tidy up URLs
+    //
+    // Ensure a URL address (as string) has a protocol, host, and file.
+    //
+    // If the URL is a CGI script URL, it should be tidied up so that it is
+    // appropriate to tage attrib=value pairs on the end.  This means it
+    // must either end with a "?" or (if it contains a question-mark
+    // internally) end with a "&".
+    String tidy_URL(String address, boolean isCGI) {
+
+	// System.out.println("tidy URL: " + address);
+	
+	// make sure the URL has protocol, host, and file
+	if (address.startsWith("http")) {
+	    // the address has all the necessary components
+	} else if (address.startsWith("/")) {
+	    // there is not protocol and host
+	    URL document = getDocumentBase();
+	    address = "http://" + document.getHost() + ":" + document.getPort() + address;
+	} else {
+	    // this URL is relative to the directory the document is in
+	    URL document = getDocumentBase();
+	    String directory = document.getFile();
+	    int end = directory.lastIndexOf('/');
+	    directory = directory.substring(0,end + 1);
+	    address = "http://" + document.getHost() + ":" + document.getPort() + directory + address;
+
+	}
+
+	// if the URL is a cgi script, make sure it has a "?" in ti,
+	// and that it ends with a "?" or "&"
+	if (isCGI) {
+	    if (address.indexOf((int) '?') == -1) { 
+		address = address + "?";
+	    } else if (!address.endsWith("?")) {
+		address = address + "&";
+	    }
+	}
+
+	return address;
+    }
+
+
+
+    // Open an arbitrary web page
+    void displayWebPage(String address, String window) {
+	try { 
+	    URL url= new URL(address);
+	    if (window.length() > 0) {
+		getAppletContext().showDocument(url, window);
+	    } else {
+		getAppletContext().showDocument(url);
+	    }
+	} catch (Exception e) { 
+	    System.out.println("Cannot open web page: " + e.toString());
+	}
+    }
+
+
+    // Get the applet parameters
+    void getParameters() {
+
+	// What is this collection called?
+	collection = parameterValue("collection");
+	System.out.println("Phind collection: " + collection);
+
+	// Which of the collection's classifiers are we using?
+	classifier = parameterValue("classifier", "1");
+	System.out.println("Phind classifier: " + classifier);
+
+	// Where is the phind CGI script
+	phindcgi_address = parameterValue("phindcgi");
+	phindcgi_address = tidy_URL(phindcgi_address, true);
+	System.out.println("Phind phindcgi: " + phindcgi_address);
+
+	// Where is the Greenstone library
+	library_address = parameterValue("library");
+	library_address = tidy_URL(library_address, true);
+	System.out.println("Phind library: " + library_address);
+	
+	// Is there a default search term?
+	initialSearch = parameterValue("initial_search", "");
+
+	// Should we display the control panel
+	showControlPanel = true;
+	if (parameterValue("control_panel", "show").toLowerCase().equals("hide")) {
+	    showControlPanel = false;
+	}
+	
+	// Should we show a background image?
+	backdrop_address = parameterValue("backdrop", "");
+	if (backdrop_address.length() > 0) {
+	    backdrop_address = tidy_URL(backdrop_address, false);
+	    System.out.println("Phind backdrop URL: " + backdrop_address);
+
+	    try {
+		URL backdrop_url = new URL(backdrop_address);
+		backgroundImage = getImage(backdrop_url);
+		showImage = true;
+	    } catch (Exception e) { 
+		System.out.println("Phind could not load " + backdrop_address);
+		showImage = false;
+	    }
+	}
+
+	// Should we draw a border?
+	showBorder = parameterValue("border", "on").equals("off");
+
+	// Are the windows arranged vertically or horizontally
+	if (parameterValue("orientation", "vertical").toLowerCase().startsWith("hori")) {
+	    vertical = false;
+	} else {
+	    vertical = true;
+	}
+	
+	// How many phind windows are there?
+	depth = parameterValue("depth", 3);
+
+	// Result sort order
+	// Standard is "LlEeDd", expansion-first is "EeLlDd"
+	String order = parameterValue("resultorder", "standard");
+	if (!order.equals("standard")) {
+	    int next = 20;
+	    ResultItem.sortMessage = next;
+	    for (int x = 0; x < order.length(); x++) {
+		if (order.charAt(x) == ',') {
+		    next--;
+		} else if (order.charAt(x) == 'L') {
+		    ResultItem.sortLinkItem = next;
+		} else if (order.charAt(x) == 'l') {
+		    ResultItem.sortMoreLinks = next;
+		} else if (order.charAt(x) == 'E') {
+		    ResultItem.sortPhraseItem = next;
+		} else if (order.charAt(x) == 'e') {
+		    ResultItem.sortMorePhrases = next;
+		} else if (order.charAt(x) == 'D') {
+		    ResultItem.sortDocumentItem = next;
+		} else if (order.charAt(x) == 'd') {
+		    ResultItem.sortMoreDocuments = next;
+		}
+	    }
+	    System.out.println("link: " + ResultItem.sortLinkItem);
+	    System.out.println("exps: " + ResultItem.sortPhraseItem);
+	    System.out.println("docs: " + ResultItem.sortDocumentItem);
+
+	}
+
+	// How many phrases should we fetch at any given time?
+	phraseBlockSize = parameterValue("blocksize", 10);
+
+	// What font should we use?
+	fontSize = parameterValue("fontsize", 10);
+	fontName = parameterValue("fontname", "Helvetica");
+
+	// Column dimensions
+	column_1_width = parameterValue("first_column_width", 6);
+	column_2_width = parameterValue("second_column_width", column_1_width);
+	
+	// Where do we open new windows
+	searchWindowName = parameterValue("search_window", "phindsearch");
+	documentWindowName = parameterValue("document_window", "phinddoc");
+
+	// Colours
+	panel_fg = parameterValue("panel_fg", Color.black);
+	panel_bg = parameterValue("panel_bg", Color.white);
+
+	highlight_bg = parameterValue("highlight_bg", Color.yellow);
+
+	expansion_fg = parameterValue("expansion_fg", Color.black);
+	thesaurus_fg = parameterValue("thesaurus_fg", new Color(0, 100, 0));
+	document_fg = parameterValue("document_fg", Color.blue);
+
+	thesaurus_bar_fg = parameterValue("thesaurus_bar_fg", Color.black);
+	expansion_bar_fg = parameterValue("expansion_bar_fg", Color.black);
+	document_bar_fg = parameterValue("document_bar_fg", Color.black);
+
+	thesaurus_bar_bg = parameterValue("thesaurus_bar_bg", new Color(160, 160, 190));
+	expansion_bar_bg = parameterValue("expansion_bar_bg", new Color(255, 200, 200));
+	document_bar_bg = parameterValue("document_bar_bg", new Color(150, 193, 156));
+
+	column_1_fg = parameterValue("first_column_fg", Color.black);
+	column_1_bg = parameterValue("first_column_bg", new Color(235, 245, 235));
+	column_2_fg = parameterValue("second_column_fg", Color.black);
+	column_2_bg = parameterValue("second_column_bg", new Color(200, 220, 200));
+
+	message_fg = parameterValue("message_fg", Color.black);
+	message_bg = parameterValue("message_bg", Color.white);
+
+	// Colours I don't use, yet
+	// thesaurus_bg = parameterValue("thesaurus_bg", Color.white);
+	// expansion_bg = parameterValue("expansion_bg", Color.white);
+	// document_bg = parameterValue("document_bg", Color.white);
+    }
+
+    // Get the value of a parameter given its name.
+    // There are many types of parameters, hence the variety of functions.
+
+    // Get a REQUIRED string.  Stop the applet if we cannot.
+    String parameterValue(String name) {
+	try { 
+	    return getParameter(name);
+	} catch (Exception e) {
+	    System.err.println("Phind: you must give a parameter for \"" 
+			       + name + "\".  Stopping.");
+	    stop();
+	}
+	return "";
+    }
+
+    // Get an optional parameter.  Return a default if we cannot.
+    String parameterValue(String name, String defaultValue) {
+	String text = getParameter(name);
+	if (text == null) {
+	    return defaultValue;
+	}
+	System.out.println("Phind " + name + ": " + text);
+	return text;
+    }
+
+    int parameterValue(String name, int defaultValue) {
+	int value;
+	try { 
+	    value = Integer.parseInt(getParameter(name));
+	} catch (Exception e) {
+	    return defaultValue;
+	}
+	System.out.println("Phind " + name + ": " + value);
+	return value;
+    }
+
+    Color parameterValue(String name, Color defaultValue) {
+
+	String text = getParameter(name);
+	if (text == null) {
+	    return defaultValue;
+	}
+	text = text.toLowerCase();
+
+	// a number of the form "#ddffee" 
+	if (text.startsWith("#") && (text.length() == 7)) {
+	    text = text.substring(1);
+	    int r, g, b;
+	    try {
+		r = Integer.parseInt(text.substring(0,2), 16);
+		g = Integer.parseInt(text.substring(2,4), 16);
+		b = Integer.parseInt(text.substring(4), 16);
+		return new Color(r, g, b);
+	    }  catch (Exception e) {
+		return defaultValue;
+	    }
+	}
+
+	// a known Java colour string
+	else if (text.equals("black")) { return Color.black; }
+	else if (text.equals("blue")) { return Color.blue; }
+	else if (text.equals("cyan")) { return Color.cyan; }
+	else if (text.equals("darkgray")) { return Color.darkGray; }
+	else if (text.equals("gray")) { return Color.gray; }
+	else if (text.equals("green")) { return Color.green; }
+	else if (text.equals("lightgray")) { return Color.lightGray; }
+	else if (text.equals("magenta")) { return Color.magenta; }
+	else if (text.equals("orange")) { return Color.orange; }
+	else if (text.equals("pink")) { return Color.pink; }
+	else if (text.equals("red")) { return Color.red; }
+	else if (text.equals("white")) { return Color.white; }
+	else if (text.equals("yellow")) { return Color.yellow; }
+
+	return defaultValue;
+    }
+
+
+    // Control panel operations
+
+    // Initialise the control panel
+    void initialiseControlPanel() {
+	
+	if (showControlPanel) {
+	    Panel p1 = new Panel();
+	    add("North", p1);
+	    p1.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
+	    
+	    searchButton = new Button("Search");
+	    searchButton.setFont(boldFont);
+	    p1.add(searchButton);
+	    
+	    Label tempLabel = new Label("  for");
+	    tempLabel.setFont(boldFont);
+	    p1.add(tempLabel);
+	    
+	    wordField = new TextField(12);
+	    wordField.setFont(boldFont);
+	    p1.add(wordField);
+	    
+	    Label temp2 = new Label("          ");
+	    p1.add(temp2);
+	    
+	    prevButton = new Button("Previous");
+	    prevButton.setFont(boldFont);
+	    prevButton.disable();
+	    
+	    p1.add(prevButton);
+	    
+	    nextButton = new Button("  Next  ");
+	    nextButton.setFont(boldFont);
+	    nextButton.disable();
+	    p1.add(nextButton);
+	    
+	}
+    }
+    
+    // Button and field functionality
+    
+    // Enable and disable the word field
+    void enableSearchButton() {
+	if (showControlPanel) {
+	    searchButton.enable();
+	}
+    }
+    void disableSearchButton() {
+	if (showControlPanel) {
+	    searchButton.disable();
+	}
+    }
+
+    // Get and set the search text in the wordField
+    String getSearchTerm() {
+	if (showControlPanel) {
+	    return wordField.getText();
+	} else {
+	    return initialSearch;
+	}
+    }
+    void setSearchTerm(String word) {
+	if (showControlPanel) {
+	    wordField.setText(word);
+	} 
+    }
+
+    // Enable or disable the "Previous" and "Next" buttons
+    void enablePreviousAndNext() {
+	if (showControlPanel) {
+	    Component c = firstDisplay.current;
+	    if (c.getClass().getName().endsWith("ResultBox")) {
+		if (((ResultBox) c).prevBoxExists()) {
+		    prevButton.enable();
+		} else {
+		    prevButton.disable();
+		}
+	    }
+	    
+	    c = lastDisplay.current;
+	    if (c.getClass().getName().endsWith("ResultBox")) {
+		if (((ResultBox) c).nextBoxExists()) {
+		    nextButton.enable();
+		} else {
+		    nextButton.disable();
+		}
+	    }
+	}
+    }
+
+    // Shift to previous box
+    //
+    // If the user clicks "Previous" then scroll up.
+    void shiftPrevious() {
+
+	Component c = firstDisplay.current;
+	if (c.getClass().getName().endsWith("ResultBox")) {
+
+	    ResultBox b = (ResultBox) c;
+	    if (b.prevBoxExists()) {
+		b = b.prev;
+
+		// empty all the displays
+		firstDisplay.emptyContents();
+
+		// add as many result boxes as there are displays
+		for (int i = 1 ; ((i <= depth) && (b != null)); i++) {
+		    lastDisplay.display(b);
+		    b.resize(b.display.size());
+		    b.paintAll(b.getGraphics());
+		    b = b.next;
+		}
+	    }
+	}
+	enablePreviousAndNext();
+    }
+
+    // Shift to next box
+    //
+    // If the user clicks "Next" then scroll down if possible
+    void shiftNext() {
+
+	Component c = lastDisplay.current;
+	if (c.getClass().getName().endsWith("ResultBox")) {
+
+	    ResultBox b = (ResultBox) c;
+	    if (b.nextBoxExists()) {
+
+		// find the new "first" displayed box
+		c = firstDisplay.current;
+		b = (ResultBox) c;
+		b = b.next;
+
+		// empty all the displays
+		firstDisplay.emptyContents();
+
+		// add as many result boxes as there are displays
+		for (int i = 1 ; ((i <= depth) && (b != null)); i++) {
+		    lastDisplay.display(b);
+		    b.resize(b.display.size());
+		    b.paintAll(b.getGraphics());
+		    b = b.next;
+		}
+	    }
+	}
+	enablePreviousAndNext();
+    }
+
+
+
+
+
+}
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/PhindTitle.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/PhindTitle.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/PhindTitle.java	(revision 21083)
@@ -0,0 +1,84 @@
+/**********************************************************************
+ *
+ * PhindTitle.java -- backdrops to empty ResultDisplay panels.
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+/*********************************************************************
+
+PhindTitle is for drawing backdrops in empty ResultDisplay panels.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.applet.Applet;
+import java.awt.Canvas;
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.awt.Image;
+
+public class PhindTitle extends Canvas {
+
+    Phind phind;
+    static Image backgroundImage;
+    boolean displayInfo;
+    
+    PhindTitle(Phind p) {
+	phind = p;
+    }
+
+    public void update(Graphics g) {
+	paint(g);
+    }
+
+    public void paint(Graphics g) {
+	Dimension canvasSize = size();
+
+	Color fore = phind.panel_fg;
+	Color back = phind.panel_bg;
+
+	// set the screen background
+	if (phind.showImage)
+	    try {
+		g.drawImage(phind.backgroundImage, 
+			    0, 0, canvasSize.width, canvasSize.height, back, null);
+	    } catch (Exception e) {
+		System.err.println("PhindTitle paint: "  + e);
+	    }
+	else {
+	    g.setColor(back);
+	    g.fillRect(0,0, canvasSize.width, canvasSize.height);
+	}
+    }
+}
+
+ 
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultBox.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultBox.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultBox.java	(revision 21083)
@@ -0,0 +1,774 @@
+/**********************************************************************
+ *
+ * ResultBox.java -- a list of phrases in the Phind java interface
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+A ResultBox holds the results of a query to phindcgi.  They deal mostly
+with the information content of the query, and have methods for parsing the
+input into phrase and document items.  They have little do with display:
+ResultBoxes are shown to the user through "ResultDisplay" panels, and are
+drawn using "ResultCanvas" objects.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.awt.Panel;
+import java.awt.BorderLayout;
+import java.awt.Scrollbar;
+
+import java.awt.Label;
+import java.awt.Event;
+
+import java.net.*;
+import java.applet.*;
+
+import java.util.Vector;
+
+
+public class ResultBox extends Panel {
+    
+    // Objects at a "higher" level than this one
+    Phind phind;
+    ResultDisplay display;
+
+    // Surroundig objects
+    ResultBox prev, next;
+
+    // The components contained by this one.
+    ResultCanvas c;
+    ResultTitle t;
+    Scrollbar s;
+    Panel label;
+
+    // The key identifying the phrase displayed, with its text and the
+    // collection from which it is drawn
+    String searchKey, searchPhrase, searchCollection;
+    
+    // The total frequency, expansion frequency, and document frequency
+    // of the phrase
+    int numberOfOccurances;
+    int numberOfExpansions;
+    int numberOfDocuments;
+    int numberOfThesaurusLinks;
+
+    // The number of phrases and documents retrieved, and the number of
+    // times the user has requested more phrases or documents.
+    int expansionsRetrieved;
+    int documentsRetrieved;
+    int thesaurusLinksRetrieved;
+    int nextPhraseBlock;
+    int nextDocumentBlock;
+    int nextThesaurusLinkBlock;
+    
+    int mode;
+    final int initMode = 0;
+    public final int emptyMode = 1;
+    final int loadingMode = 2;
+    final int finishedMode = 3;
+
+    String buffer;
+    boolean finished;
+
+
+    // Create a ResultBox
+    // given details of the search that generated it.
+    ResultBox(Phind p, String collect, String key, String phrase, ResultBox rb) {
+
+	super();
+	mode = initMode;
+
+	phind = p;
+	display = null;
+	next = null;
+	prev = rb;
+	if (prev != null) prev.next = this;
+
+	searchKey = key;
+	searchPhrase = phrase;
+	searchCollection = collect;
+
+	numberOfOccurances = -1;
+	numberOfExpansions = -1;
+	numberOfDocuments = -1;
+	numberOfThesaurusLinks = -1;
+
+	expansionsRetrieved = 0;
+	documentsRetrieved = 0;
+	thesaurusLinksRetrieved = 0;
+
+	nextPhraseBlock = 1;
+	nextDocumentBlock = 1;
+	nextThesaurusLinkBlock = 1;
+
+
+	setLayout(new BorderLayout());
+
+	s = new Scrollbar(Scrollbar.VERTICAL);
+	disableScrollbar();
+	add("East", s);
+
+	c = new ResultCanvas(this);
+	add("Center", c);
+
+	t = new ResultTitle(this);
+	add("North", t);
+
+	buffer = "";
+	finished = false;
+	mode = emptyMode;
+    }
+
+    static String describeContents(String phrase, String c) {
+	return( "\"" + phrase + "\" in " + c + ".");
+    }
+
+    String describeContents() {
+	return( describeContents(searchPhrase, searchCollection) );
+    }
+
+
+    // Reset the contents of the box
+    void resetBox( ) {
+	buffer = "";
+	finished = false;
+	c.resetCanvas();
+	disableScrollbar();
+	mode = emptyMode;
+    
+	numberOfExpansions = -1;
+	numberOfDocuments = -1;
+	numberOfThesaurusLinks = -1;
+
+	expansionsRetrieved = 0;
+	documentsRetrieved = 0;
+	thesaurusLinksRetrieved = 0;
+    }
+
+    void setStatus( String status ) {
+	phind.setStatus(status);
+    }
+
+    void disableScrollbar() {
+	if (s.isEnabled()) {
+	    s.setValues(0, 1, 0, 1);
+	    s.setLineIncrement(1);
+	    s.setPageIncrement(1);
+	    s.disable();
+	}
+    }
+
+    // Are there displays previous to and after this?
+    public boolean prevBoxExists () {
+	return (prev != null);
+    }
+    public boolean nextBoxExists () {
+	return (next != null);
+    }
+
+    
+    // Look up a phrase
+    // Phrase lookups are passed on to the Phind applet itself.
+    void lookupPhrase(String key, String phrase, int queryMode) {
+	buffer = "";
+	finished = false;
+	phind.searchForPhrase(this, key, phrase, queryMode);
+	t.repaint();
+    }
+
+    public boolean handleEvent(Event event) {
+	//    System.out.println("event: " + event.toString());
+	if ( (event.target == s) && 
+	     ( (event.id == Event.SCROLL_ABSOLUTE) ||
+	       (event.id == Event.SCROLL_LINE_DOWN) ||
+	       (event.id == Event.SCROLL_LINE_UP) ||
+	       (event.id == Event.SCROLL_PAGE_DOWN) ||
+	       (event.id == Event.SCROLL_PAGE_UP) ) ) {
+	    c.repaint();
+	    return true;
+	} else {
+	    return super.handleEvent(event);
+	}
+    }    
+
+
+    // a new section of the byte stream is read
+    void parseBytes(byte[] bytes) {
+	mode = loadingMode;
+
+	// update the buffer that holds the bytes read
+	String input;
+	try {
+	    input = new String(bytes, new String("UTF8"));
+	} catch (Exception e) {
+	    System.err.println(e);
+	    input = "";
+	}
+	buffer = buffer.concat(input);
+
+	// Parse each line until there are no more lines to parse
+	while(parseLine());
+
+	if (finished) {
+	    c.updateMarkers();
+	    buffer = "";
+	} else {
+	    // We haven't finished, give some feedback about progress
+	    setStatus("Connected to host, " + c.numberOfItems + " results read");
+	}
+    }
+
+    // Parse a line of XML
+    //
+    // This isn't necessarily real XML.  We assume every tag begins and
+    // ends on one line.  We read one line out of the buffer at a time,
+    // then "add" them to the box with the addLine method.
+    //
+    // Return true if there is a another line here to parse, otherwise false.
+
+    boolean parseLine() {
+
+        // System.out.print("parseLine " + "(length " + buffer.length() + ")");
+	String item;
+	int eol = buffer.indexOf((int) '\n');
+
+	// If there are no carriage returns, the line is incomplete
+	if (eol == -1) {
+	    return false;
+	}
+
+	// The </phinddata> tag concludes the dataset
+	else if (buffer.startsWith("</phinddata>")) {
+	    mode = finishedMode;
+	    finished = true;
+	    return false;
+	}
+	
+	// The <expansion> tag
+	else if (buffer.startsWith("<expansion ")) {
+	    item = buffer.substring(0, eol);
+	    buffer = buffer.substring(eol + 1);
+	    addExpansionTag(item);
+	    return true;
+	}
+ 
+	// The <document> tag
+	else if (buffer.startsWith("<document ")) {
+	    item = buffer.substring(0, eol);
+	    buffer = buffer.substring(eol + 1);
+	    addDocumentTag(item);
+	    return true;
+	}
+ 
+	// The <thesaurus> tag
+	else if (buffer.startsWith("<thesaurus ")) {
+	    item = buffer.substring(0, eol);
+	    buffer = buffer.substring(eol + 1);
+	    addThesaurusTag(item);
+	    return true;
+	}
+ 
+	// The <phinddata> tag introduces the dataset
+	else if (buffer.startsWith("<phinddata ")) {
+	    item = buffer.substring(0, eol);
+	    buffer = buffer.substring(eol + 1);
+	    addPhinddataTag(item);
+	    return true;
+	}
+
+	// The <phinderror> tag contains an error message
+	else if (buffer.startsWith("<phinderror")) {
+	    item = buffer.substring(0, eol);
+	    System.out.println("phind reported an error: " + item);
+	    buffer = buffer.substring(eol + 1);
+	    return true;
+	}
+ 
+	// Ignore the piece we've read
+	item = buffer.substring(0, eol);
+	// System.out.println("discarding: " + item);
+	buffer = buffer.substring(eol + 1);
+	return true;
+    }
+    
+
+
+    // Add a phinddata tag
+    //
+    // Given a string containing an XML phinddata tag of the form:
+    //   <phinddata id="35" text="FOREST" df="797" ef="134">
+    // Read the expansion information from the tag
+    //
+    // Return true if successful, otherwise false.
+
+    boolean addPhinddataTag( String line ) {
+
+	// System.out.println( "addExpansionListTag: " + line);
+
+	String idStr = "", text = "", tfStr = "", efStr = "", dfStr = "", lfStr = "";
+	int tf = 0, ef = 0, df = 0, lf = 0;
+
+	// Break the tag down into its component parts
+	int nextSplit;
+       	while (line.length() > 0) {
+	    line = line.trim();
+
+	    // Read the phrase identifier
+	    if (line.startsWith("id")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    idStr = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+	    
+	    // Read the total frequency
+	    else if (line.startsWith("tf")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    tfStr = line.substring(0, nextSplit);
+		    tf = Integer.valueOf(tfStr).intValue();
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the text of the phrase
+	    else if (line.startsWith("text")) {
+		line = line.substring(6);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    text = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the expansion frequency
+	    else if (line.startsWith("ef")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    efStr = line.substring(0, nextSplit);
+		    ef = Integer.valueOf(efStr).intValue();
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the document frequency
+	    else if (line.startsWith("df")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    dfStr = line.substring(0, nextSplit);
+		    df = Integer.valueOf(dfStr).intValue();
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the thesaurus link frequency
+	    else if (line.startsWith("lf")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    lfStr = line.substring(0, nextSplit);
+		    lf = Integer.valueOf(lfStr).intValue();
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("addExpansionListTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read and ignore some other tag
+	    else {
+		nextSplit = line.indexOf((int) ' ');
+		if (nextSplit >= 1) {
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    line = "";
+		}
+	    }
+	}
+
+	// Add the data to the ResultBox
+	searchKey = idStr;
+	searchPhrase = text;
+	numberOfOccurances = tf;
+	numberOfExpansions = ef;
+	numberOfDocuments = df;
+	numberOfThesaurusLinks = lf;
+	return true;
+    }
+
+
+    // Add an expansion tag
+    //
+    // Given a string containing an XML expansin tag of the form:
+    //   <expansion num="3" id="8421" prefix="PEOPLE and" suffix="" tf="3" df="3"/>
+    //   <expansion num="4" id="8696" prefix="" suffix="products" tf="3" df="3"/>
+    // Create a new ResultItemPhrase for display
+    //
+    // Return true if successful, otherwise false.
+
+    boolean addExpansionTag( String line ) {
+
+	// System.out.println( "addExpansionTag: " + line + " (" + expansionsRetrieved + ")");
+
+	String numStr = "", idStr = "", tfStr = "", dfStr = "", 
+	    prefix = "", body = "", suffix = "";
+
+	body = searchPhrase;
+
+	// Break the tag down into its component parts
+	line = line.substring(11);
+	int nextSplit;
+       	while (line.length() > 0) {
+	    line = line.trim();
+
+	    // Read the expansion number
+	    if (line.startsWith("num")) {
+		line = line.substring(5);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    numStr = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the phrase ID
+	    else if (line.startsWith("id")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    idStr = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the prefix of the phrase
+	    else if (line.startsWith("prefix")) {
+		line = line.substring(8);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 0) {
+		    prefix = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the suffix of the phrase
+	    else if (line.startsWith("suffix")) {
+		line = line.substring(8);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 0) {
+		    suffix = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the frequency
+	    else if (line.startsWith("tf")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    tfStr = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the document frequency
+	    else if (line.startsWith("df")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    dfStr = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read some other tag
+	    else {
+		nextSplit = line.indexOf((int) ' ');
+		if (nextSplit >= 1) {
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    line = "";
+		}
+	    }
+	}
+	
+	// Create a new ResultItem and add it to the display
+	ResultItemPhrase ri = new ResultItemPhrase(idStr, tfStr, dfStr, prefix, body, suffix);
+	
+	if (c.addResultItem(ri)) {
+	    expansionsRetrieved++;
+	    return true;
+	}
+	
+	return false;
+    }
+
+
+    // Add an document tag
+    //
+    // Given a string containing an XML document tag of the form:
+    //   <document num="2" hash="HASH424e64b811fdad933be69c" freq="1" title="CONTENTS"/>
+    //   <document num="3" hash="HASH01f08efd8752ad54ca0a99cf" freq="1" title="Tree mixtures"/>
+    //
+    // Create a new ResultItemDocument for display
+    //
+    // Return true if successful, otherwise false.
+
+    boolean addDocumentTag( String line ) {
+
+	// System.out.println( "addDocumentTag: " + line + " (" + documentsRetrieved + ")");
+	
+	String num = "", hash = "", freq = "", title = "";
+	line = line.substring(9);
+	
+	// Break the tag down into its component parts
+	int nextSplit;
+       	while (line.length() > 0) {
+	    line = line.trim();
+
+	    // Read the expansion number
+	    if (line.startsWith("num")) {
+		line = line.substring(5);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    num = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addDocumentTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the document OID hash
+	    else if (line.startsWith("hash")) {
+		line = line.substring(6);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    hash = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addDocumentTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the document frequency
+	    else if (line.startsWith("freq")) {
+		line = line.substring(6);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    freq = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addDocumentTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the title
+	    else if (line.startsWith("title")) {
+		line = line.substring(7);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    title = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addDocumentTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read some other tag or close the string off
+	    else {
+		nextSplit = line.indexOf((int) ' ');
+		if (nextSplit >= 1) {
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    line = "";
+		}
+	    }
+	}
+	
+	// Create a new ResultItem and add it to the display
+	ResultItemDocument ri = new ResultItemDocument(hash, title, freq);
+	
+	if (c.addResultItem(ri)) {
+	    documentsRetrieved++;
+	    return true;
+	}
+	
+	return false;
+    }
+
+
+    // Add a thesaurus tag
+    //
+    // Given a string containing an XML document tag of the form:
+    //
+    // <thesaurus num="3" id="36506" tf="0" df="0" type="RT" text="ANGLOPHONE AFRICA"/>
+    // <thesaurus num="4" id="28724" tf="0" df="0" type="RT" text="FRANCOPHONE AFRICA"/>
+    //
+    // Create a new ResultItemLink for display
+    //
+    // Return true if successful, otherwise false.
+
+    boolean addThesaurusTag( String line ) {
+    
+	// System.out.println( "addThesaurusTag: " + line + " (" + thesaurusLinksRetrieved + ")");
+
+	String num = "", id = "", tf = "", df = "", type = "", text = "";
+	line = line.substring(10);
+
+	// Break the tag down into its component parts
+	int nextSplit;
+       	while (line.length() > 0) {
+	    line = line.trim();
+
+	    // Read the expansion number
+	    if (line.startsWith("num")) {
+		line = line.substring(5);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    num = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addThesaurusTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the phrase ID
+	    else if (line.startsWith("id")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    id = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addThesaurusTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the phrase link type
+	    else if (line.startsWith("type")) {
+		line = line.substring(6);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    type = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addThesaurusTag: error parsing: " + line);
+ 		}
+	    } 
+
+
+	    // Read the phrase text
+	    else if (line.startsWith("text")) {
+		line = line.substring(6);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    text = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addThesaurusTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the frequency
+	    else if (line.startsWith("tf")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    tf = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+	    // Read the document frequency
+	    else if (line.startsWith("df")) {
+		line = line.substring(4);
+		nextSplit = line.indexOf((int) '"');
+		if (nextSplit >= 1) {
+		    df = line.substring(0, nextSplit);
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    System.err.println("ResultBox addExpansionTag: error parsing: " + line);
+ 		}
+	    } 
+
+
+	    // Read some other tag or close the string off
+	    else {
+		nextSplit = line.indexOf((int) ' ');
+		if (nextSplit >= 1) {
+		    line = line.substring(nextSplit + 1);
+		} else {
+		    line = "";
+		}
+	    }
+	}
+	
+	// Create a new ResultItem and add it to the display
+	ResultItemLink ri = new ResultItemLink(id, text, type, tf, df);
+
+	if (c.addResultItem(ri)) {
+	    thesaurusLinksRetrieved++;
+	    return true;
+	}
+	
+	return false;
+    }
+}
+
+
+
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultCanvas.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultCanvas.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultCanvas.java	(revision 21083)
@@ -0,0 +1,557 @@
+/**********************************************************************
+ *
+ * ResultCanvas.java -- a Canvas onto which a phrase list is drawn
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+The results of a query are displayed on a ResultCanvas object.  Each 
+entry in the result list is stored in a ResultItem, and the ResultCanvas 
+contains a Vector of ResultItems.
+
+Each ResultCanvas is embedded in a ResultBox alongside a Scrollbar.  
+When the ResultCanvas is drawn, it looks at the scrollbar, calculates 
+which ResultItems are visible, then draws them on the screen.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.awt.Canvas;
+import java.awt.Scrollbar;
+import java.awt.Graphics;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Dimension;
+import java.awt.Color;
+import java.util.Vector;
+import java.awt.Image;
+import java.awt.Event;
+
+import java.net.URL;
+import java.applet.Applet;
+import java.util.Date;
+
+public class ResultCanvas extends Canvas {
+
+    // Other objects associated with this 
+    Phind phind;
+    ResultBox parent;
+    Scrollbar scrollbar;
+    
+    // fonts and font spacings to use
+    Font areaPlain, areaBold;
+    int lineSpacing;
+    
+    // The items to display on this canvas
+    int numberOfItems;
+    int firstItemDisplayed;
+    int itemSelected;
+    Vector items;
+    
+    // the background image
+    public static Image backgroundImage;
+    
+    
+    // Create a ResultCanvas from the ResultBox which is its parent.
+    ResultCanvas(ResultBox p) {
+	
+	parent = p;
+	phind = p.phind;
+	scrollbar = p.s;
+	parent.disableScrollbar();
+
+	areaPlain = phind.plainFont;
+	areaBold  = phind.boldFont;
+
+	lineSpacing = phind.fontSize + 2;
+
+	items = new Vector();
+	numberOfItems = 0;
+	firstItemDisplayed = 0;
+	itemSelected = -1;
+    
+	if (backgroundImage == null) {
+	    backgroundImage = p.phind.backgroundImage;
+	}
+
+    }
+
+    void resetCanvas( ) {
+	items.removeAllElements();
+	numberOfItems = 0;
+	repaint();
+    }
+
+
+    // Add a new search result.
+    // Return true if successful, otherwise false.
+    boolean addResultItem( ResultItem item ) {
+ 
+	// Add a new result, in sorted order.
+	// First sort key is item kind (lowest first),
+	// second is frequency (highest first).
+	// This is not efficient, but I don't care right now.
+	int index = 0;
+	while ((index < numberOfItems) &&
+	       ((item.sort < ((ResultItem) items.elementAt(index)).sort) ||
+		((item.sort == ((ResultItem) items.elementAt(index)).sort) &&
+		 (item.frequency <= ((ResultItem) items.elementAt(index)).frequency)))) {
+	    index++;
+	}
+	items.insertElementAt(item,index);
+	numberOfItems++;
+	return true;
+    }
+
+
+    // Update more phrases/documents/links markers
+    void updateMarkers() {
+	updateMorePhrasesMarker();
+	updateMoreDocumentsMarker();
+	updateMoreLinksMarker();
+    }
+
+    // Make sure the more Phrases item only appears in the list
+    // if it is meant to.
+    void updateMorePhrasesMarker() {
+    
+	// System.out.println("updateMorePhrasesMarker() ");
+
+	// look for a marker
+	boolean found = false;
+	int index = 0;
+	while (!found && (index < numberOfItems)) {
+	    if (((ResultItem) items.elementAt(index)).isMorePhrases()) {
+		found = true;
+	    } else {
+		index++;
+	    }
+	}
+
+	if (parent.expansionsRetrieved == parent.numberOfExpansions) {
+	    // there should be no marker
+	    if (found) {
+		items.removeElementAt(index);
+		numberOfItems--;
+	    }
+
+	} else if (parent.expansionsRetrieved < parent.numberOfExpansions) {
+	    if (!found) {
+		ResultItem ri = new ResultItem(ResultItem.morePhrases);
+		addResultItem(ri);
+	    }
+	}
+    }
+
+
+    // Make sure the more documents marker appears when required
+    void updateMoreDocumentsMarker() {
+    
+	// System.out.println("updateMoreDocumentsMarker() ");
+
+	// look for a marker
+	boolean found = false;
+	int index = 0;
+	while (!found && (index < numberOfItems)) {
+	    if (((ResultItem) items.elementAt(index)).isMoreDocuments()) {
+		found = true;
+	    } else {
+		index++;
+	    }
+	}
+
+	if (parent.documentsRetrieved == parent.numberOfDocuments) {
+	    // there should be no marker
+	    if (found) {
+		items.removeElementAt(index);
+		numberOfItems--;
+	    }
+
+	} else if (parent.documentsRetrieved < parent.numberOfDocuments) {
+	    // there should be a marker
+	    if (!found) {
+		ResultItem ri = new ResultItem(ResultItem.moreDocuments);
+		addResultItem(ri);
+	    }
+	}
+    }
+
+      
+    // Make sure the more links marker appears when required
+    void updateMoreLinksMarker() {
+    
+	// System.out.println("updateMoreLinksMarker() ");
+
+	// look for a marker
+	boolean found = false;
+	int index = 0;
+	while (!found && (index < numberOfItems)) {
+	    if (((ResultItem) items.elementAt(index)).isMoreLinks()) {
+		found = true;
+	    } else {
+		index++;
+	    }
+	}
+
+	if (parent.thesaurusLinksRetrieved == parent.numberOfThesaurusLinks) {
+	    // there should be no marker
+	    if (found) {
+		items.removeElementAt(index);
+		numberOfItems--;
+	    }
+
+	} else if (parent.thesaurusLinksRetrieved < parent.numberOfThesaurusLinks) {
+	    // there should be a marker
+	    if (!found) {
+		ResultItem ri = new ResultItem(ResultItem.moreLinks);
+		addResultItem(ri);
+	    }
+	}
+    }
+
+      
+
+ 
+
+
+    public void update(Graphics g) {
+	paint(g);
+    }
+
+    public void paint(Graphics g) {
+
+	// calculate the canvas size, margins, and spacing
+	
+	// Note: the size() method is deprecated, but getSize fails in NetScape 4
+	// Dimension canvasSize = getSize();
+	Dimension canvasSize = size();
+
+	g.setFont(areaPlain);
+	int space = g.getFontMetrics().stringWidth(" ");
+	int nought = g.getFontMetrics().stringWidth("0");
+
+	int firstColumnWidth = phind.column_1_width * nought;
+	int secondColumnWidth = phind.column_2_width * nought;
+	int columnWidth = firstColumnWidth + secondColumnWidth;
+
+	int firstColumnLeft = canvasSize.width - columnWidth;
+	int secondColumnLeft = firstColumnLeft + firstColumnWidth;
+
+	int mainLeftMargin = 0;
+	int mainRightMargin = firstColumnLeft;
+
+	// the number of items that will fit on the canvas
+	int visible = canvasSize.height / lineSpacing;
+
+	// calculate the first item to output
+	int scrollValue = scrollbar.getValue();
+	if (numberOfItems <= visible) {
+	    scrollValue = 0;
+	} else if (scrollValue > (numberOfItems - visible)) {
+	    scrollValue = numberOfItems - visible;
+	} 
+	firstItemDisplayed = scrollValue;
+
+	// Draw the phrase area
+	Color fore = phind.panel_fg;
+	Color back = phind.panel_bg;
+
+
+	// draw the background
+	if (phind.showImage) {
+	    try {
+		g.drawImage(backgroundImage, 
+			    mainLeftMargin, 0, mainRightMargin, canvasSize.height, 
+			    back, null);
+	    } catch (Exception e) {
+		phind.showImage = false;
+		System.err.println("ResultCanvas paint error: " + e); 
+		g.setColor(back);
+		g.fillRect(0, 0, canvasSize.width, canvasSize.height);
+	    }
+	} else {
+	    g.setColor(back);
+	    g.fillRect(0, 0, canvasSize.width, canvasSize.height);
+	}
+    
+	// If there are no phrases, output a brief explanation.
+	if (numberOfItems == 0) {
+	    g.drawString("No phrases match this query.", mainLeftMargin + 10, lineSpacing);
+	}
+
+	// Output each of the visible ResultItems
+	ResultItem result;
+	int tab, i, y = 0;
+	int center = mainLeftMargin 
+	    + ((mainRightMargin - mainLeftMargin 
+		- g.getFontMetrics().stringWidth(parent.searchPhrase)) / 2);
+	int thesColumn = mainLeftMargin + firstColumnWidth 
+	    + g.getFontMetrics().stringWidth("Narrower term");
+
+	String body, prefix, suffix;
+	
+	for (i = scrollValue; 
+	     (i < numberOfItems) && (y + lineSpacing < canvasSize.height); i++) {
+
+	    // Get the resultItem to output
+	    result = (ResultItem) items.elementAt(i);
+	    
+	    // Graphics settings for drawing this line
+	    y += lineSpacing;
+	    g.setFont(areaPlain);
+
+	    // Highlight the selected phrase.
+	    if (i == itemSelected) {
+		g.setColor(phind.highlight_bg);
+		g.fillRect(mainLeftMargin, y-lineSpacing+2, mainRightMargin, lineSpacing);
+	    }
+
+	    // Draw the item
+
+	    // Draw a phrase item
+	    if (result.isPhrase()) {
+		prefix = result.prefixText();
+		body = result.mainText();
+		suffix = result.suffixText();
+		
+		g.setColor(phind.expansion_fg);
+		g.setFont(areaPlain);
+		tab = center - g.getFontMetrics().stringWidth(prefix) - space;
+		g.drawString(prefix, tab, y);
+		
+		g.setFont(areaBold);
+		g.drawString(body, center, y);
+		
+		tab = center + space + g.getFontMetrics().stringWidth(body);
+		g.setFont(areaPlain);
+		g.drawString(suffix, tab, y);
+	
+	    } 
+
+	    // Draw a document item
+	    else if (result.isDocument()){
+		body = result.mainText();
+
+		g.setColor(phind.document_fg);
+		g.setFont(areaPlain);
+		tab = (mainRightMargin - g.getFontMetrics().stringWidth(body)) / 2;
+		g.drawString(body, tab, y);
+      
+	    } 
+	
+	    // Draw a thesaurus link item
+	    else if (result.isLink()){
+		prefix = result.prefixText() + ":";
+		body = result.mainText();
+		tab = thesColumn - g.getFontMetrics().stringWidth(prefix) - space;
+
+		g.setColor(phind.thesaurus_fg);
+		g.setFont(areaPlain);
+		g.drawString(prefix, tab, y);
+		g.setFont(areaBold);
+		g.drawString(body, thesColumn, y);
+	    } 
+	    
+	    // Draw a "more phrases/documents/links" marker
+	    else if (result.isMorePhrases() 
+		     || result.isMoreDocuments() 
+		     || result.isMoreLinks()){
+		body = result.mainText();
+		
+		if (result.isMorePhrases()) {
+		    g.setColor(phind.expansion_bar_bg);
+		} else if (result.isMoreDocuments()) {
+		    g.setColor(phind.document_bar_bg);
+		} else {
+		    g.setColor(phind.thesaurus_bar_bg);		    
+		}
+		g.fillRect(mainLeftMargin, y-lineSpacing+2, mainRightMargin, lineSpacing);
+
+		if (result.isMorePhrases()) {
+		    g.setColor(phind.expansion_bar_fg);
+		} else if (result.isMoreDocuments()) {
+		    g.setColor(phind.document_bar_fg);
+		} else {
+		    g.setColor(phind.thesaurus_bar_fg);		    
+		}
+		g.setFont(areaPlain);
+		tab = (mainRightMargin - g.getFontMetrics().stringWidth(body)) / 2;
+		g.drawString(body, tab, y);
+	    } 
+	}
+
+	// Draw the frequecy columns
+
+	// column backgrounds
+	g.setColor(phind.column_1_bg);
+	g.fillRect(firstColumnLeft, 0, firstColumnWidth, canvasSize.height);
+	g.setColor(phind.column_2_bg);
+	g.fillRect(secondColumnLeft, 0, secondColumnWidth, canvasSize.height);
+
+	// fill in the numbers
+	g.setColor(phind.column_1_fg);
+	g.setFont(areaPlain);
+	y = 0;
+	String docsText, freqText;
+
+	for (i = scrollValue; 
+	     (i < numberOfItems) && (y + lineSpacing < canvasSize.height); i++) {
+	    
+	    // Get the resultItem to output
+	    result = (ResultItem) items.elementAt(i);
+	    docsText = result.docsText();
+	    freqText = result.freqText();
+	    
+	    // Graphics settings for drawing this line
+	    y += lineSpacing;
+
+	    // Write the document frequency
+	    if (docsText.length() > 0) {
+		tab = secondColumnLeft - space - g.getFontMetrics().stringWidth(docsText);
+		g.drawString(docsText, tab, y);
+	    }
+
+	    // Write the term frequency
+	    if (freqText.length() > 0) {
+		tab = secondColumnLeft + secondColumnWidth 
+		    - space - g.getFontMetrics().stringWidth(freqText);
+		g.drawString(freqText, tab, y);
+	    }
+	}
+
+	// Adjust the scrollbar
+	if (visible >= numberOfItems) {
+	    parent.disableScrollbar();
+	} else {
+	    scrollbar.setValues(scrollValue, visible, 0, numberOfItems);
+	    // Deprecated - setPageIncrement() has been replaced by
+	    // setBlockIncrement(), but the latter doesn't work on some
+	    // browsers.  Damn.
+	    // scrollbar.setBlockIncrement(visible - 1);
+	    scrollbar.setPageIncrement(visible - 1);
+	    // Deprecated - more nonsense: enable() has been replaced by
+	    // setEnabled(true), but this doesn't work on some browsers.
+	    //scrollbar.setEnabled(true);
+	    scrollbar.enable();
+	}
+
+	
+	// draw the border
+	if (phind.showBorder) {
+	    g.setColor(phind.panel_fg);
+	    g.drawRect(0,0, canvasSize.width - 1, canvasSize.height - 1);
+	}
+    }
+
+    // User interaction
+    //
+    // All interaction with the ResultCanvas is therough mouse clicks, and
+    // is handles in this method.  Note we ignore clicks that follow
+    // another too closely to avoid problems with slow connections.
+    public boolean handleEvent(Event event) {
+    
+	if (event.id == Event.MOUSE_UP) {
+
+	    // ignore actions that occur within 1 second of the last
+	    Date now = new Date();
+	    // System.out.println("Click time: " + now.toString());
+	    if (now.getTime() < (phind.lastQueryEndTime.getTime() + 1000)) {
+		System.out.println("Ignoring click - too close to last query.");
+		return true;
+	    }
+
+	    // which Item is selected?
+	    int rowSelected = event.y / lineSpacing;
+	    itemSelected = rowSelected + firstItemDisplayed;
+	    ResultItem item = (ResultItem) items.elementAt(itemSelected);
+
+	    if (itemSelected <= numberOfItems) {
+	
+		//User clicks on a phrase
+		if (item.isPhrase()) {
+		    itemSelected = itemSelected;
+		    update(getGraphics());
+		    parent.lookupPhrase(item.hiddenText(), item.toString(), 2);
+
+		    // If meta key is held down, send query to search engine
+		    if (event.metaDown() && !phind.library_address.equals("")) {
+			String address = phind.library_address  
+			    + "a=q&c=" + phind.collection
+			    + "&q=%22" + item.toString().replace(' ', '+') + "%22";
+			phind.displayWebPage(address, phind.searchWindowName);
+		    }
+		} 
+
+		// Click on a thesaurus link
+		else if (item.isLink()) {
+		    itemSelected = itemSelected;
+		    update(getGraphics());
+		    parent.lookupPhrase(item.hiddenText(), item.toString(), 2);
+
+		    // If meta key is held down, send query to search engine
+		    if (event.metaDown() && !phind.library_address.equals("")) {
+			String address = phind.library_address  
+			    + "a=q&c=" + phind.collection
+			    + "&q=%22" + item.toString().replace(' ', '+') + "%22";
+			phind.displayWebPage(address, phind.searchWindowName);
+		    }
+		} 
+
+		// The user clicks on a URL; display it.
+		else if (item.isDocument()) {
+		    itemSelected = itemSelected;
+		    update(getGraphics());
+
+		    String address = phind.library_address 
+			+ "a=d&c=" + phind.collection 
+			+ "&d=" + item.hiddenText()
+			+ "&q=" + parent.searchPhrase.replace(' ', '+');
+		    phind.displayWebPage(address, phind.documentWindowName);
+		}
+		 
+		// When the user clicks on "get more phrases" or other marker,
+		// we have to send a new query to the host
+		else if (item.isMorePhrases()){
+		    parent.lookupPhrase(parent.searchKey, parent.searchPhrase, 3);
+		} else if (item.isMoreDocuments()){
+		    parent.lookupPhrase(parent.searchKey, parent.searchPhrase, 4);
+		} else if (item.isMoreLinks()){
+		    parent.lookupPhrase(parent.searchKey, parent.searchPhrase, 5);
+
+
+		}
+		repaint();
+	    }
+	}
+	return true;
+    }    
+  
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultDisplay.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultDisplay.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultDisplay.java	(revision 21083)
@@ -0,0 +1,126 @@
+/**********************************************************************
+ *
+ * ResultDisplay.java -- Phrase list holder for Phind java applet
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+A ResultDisplay is a Panel that can display a single Component, which will
+be a ResultBox or PhindTitle object.
+
+ResultBoxes can be "chained" together with their "prev" and "next" fields,
+allowing us to have an arbitrary number of "displays" in which to show
+phrase lists.
+
+Main methods:
+* emptyContents will remove the component and emptyAll the "next" display
+* display will add an item to the first (ie: most "prev") available box
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.awt.Panel;
+import java.awt.BorderLayout;
+import java.awt.Component;
+
+class ResultDisplay extends Panel {
+
+  Phind phind;
+  ResultDisplay prev, next;
+  Component current;
+  boolean empty;
+
+  // Create a new Display
+  ResultDisplay(Phind ph, ResultDisplay pr) {
+    phind = ph;
+    prev = pr;
+    next = null;
+    if (prev != null) prev.next = this;
+    setLayout(new BorderLayout());
+
+    empty = true;
+    current = new PhindTitle(ph);
+    add(current);
+  }
+
+  // Empty the contents of the display,
+  // and all the next displays
+  void emptyContents() {
+    if (empty == false) {
+      empty = true;
+      current = new PhindTitle(phind);
+      removeAll();
+      add(current);
+    }
+    if (next != null) next.emptyContents();
+  }
+
+  // Set the contents of this display
+  Component setContents( Component r ) {
+    removeAll();
+    add("Center", r);
+    current = r;
+    empty = false;
+    if (r.getClass().getName().equals("ResultBox")) {
+      ((ResultBox) r).display = this;
+    }
+    return r;
+  }
+
+
+  
+  // Display a component in the "most previous" display
+  ResultDisplay display( Component r ) {
+
+    if (prev == null) {
+      // if there is no previous box, add the component here
+      setContents(r);
+      return this;
+
+    } else if (prev.empty == true) {
+      // if the previous box is empty, add the component to it instead
+      return prev.display(r);
+
+    } else if (empty == true) {
+      // if this box is empty, add the compnent to it
+      setContents(r);
+      return this;
+
+    } else {
+      // if this box is occupied,
+      // shift it's contents prev-wards and add here.
+      prev.display(current);
+      setContents(r);
+      return this;
+    }
+  }
+
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItem.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItem.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItem.java	(revision 21083)
@@ -0,0 +1,128 @@
+/**********************************************************************
+ *
+ * ResultItemDocument.java -- a result in the Phind applet
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+A result item holds the data describing a single line returned from a phind
+query.  The complex functionality of phrase and URL items is implemented in
+subclasses; the base class handles simpler cases like the "get more phrases" 
+marker.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+public class ResultItem {
+
+    // A text string describing the item
+    String text = "Generic ResultItem";
+
+    // There are several kinds of ResultItem, identified by their
+    // "kind" field, which has an integer value from the list below.
+    final static int message = 8;
+    final static int linkItem = 7;
+    final static int moreLinks = 6;
+    final static int phraseItem = 5;
+    final static int morePhrases = 4;
+    final static int documentItem = 3;
+    final static int moreDocuments = 2;
+    final static int unknownResultItem = 1;
+
+    // The kind of the item
+    int kind = unknownResultItem;
+
+    // When results are displayed, they are loosely sorted by their
+    // kind.  The user can change the sort order numbers with the 
+    // ResultOrder parameter in Phind.java.
+    static int sortMessage = 8;
+    static int sortLinkItem = 7;
+    static int sortMoreLinks = 6;
+    static int sortPhraseItem = 5;
+    static int sortMorePhrases = 4;
+    static int sortDocumentItem = 3;
+    static int sortMoreDocuments = 2;
+    static int sortUnknownResultItem = 1;
+
+    // the primary sort key
+    int sort = 0;
+    
+    // The frequency of the item (secondary sort key)
+    int frequency = 0;
+
+
+    // Create a blank ResultItem
+    ResultItem() {
+	text = "Unknown result type";
+	kind = unknownResultItem;
+	frequency = 0;
+    }
+
+    // Create a new ResultItem of some given kind
+    ResultItem(int newKind) {
+	kind = newKind;
+	frequency = 0;
+
+	if (kind == moreLinks) {
+	    text = "get more thesaurus links";
+	    sort = sortMoreLinks;
+	} else if (kind == morePhrases) {
+	    text = "get more phrases";
+	    sort = sortMorePhrases;
+	} else if (kind == moreDocuments) {
+	    text = "get more documents";
+	    sort = sortMoreDocuments;
+	} else {
+	    text = "Unknown result type";
+	    sort = sortUnknownResultItem;
+	}
+    }
+
+    // Test the type of a ResultItem
+    public boolean isLink() { return false; }
+    public boolean isMoreLinks() { return (kind == moreLinks); }
+    public boolean isPhrase() { return false; }
+    public boolean isMorePhrases() { return (kind == morePhrases); }
+    public boolean isDocument() { return false; }
+    public boolean isMoreDocuments() { return (kind == moreDocuments); }
+
+    // Return the bare text of the item
+    public String toString() { return(text.trim()); }
+
+    // Return the text of the item components
+    public String mainText() { return text; }
+    public String freqText() { 
+	if (frequency > 0) { return Integer.toString(frequency); } 
+	else { return ""; }
+    }
+    public String docsText() { return ""; }
+    public String prefixText() { return ""; }
+    public String suffixText() { return ""; }
+    public String hiddenText() { return ""; }
+}
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemDocument.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemDocument.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemDocument.java	(revision 21083)
@@ -0,0 +1,70 @@
+/**********************************************************************
+ *
+ * ResultItemDocument.java -- a document result in the Phind applet
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+It contains information describing a document in which a search term 
+occurs.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+public class ResultItemDocument extends ResultItem {
+
+    // The document's title is stored in the superclasses 
+    // text variable, and the number of times the phrase occurs
+    // in the frequency variable. 
+
+    // The document's unique object identifier (hash value).
+    String hash;
+
+    // Create a ResultItem for a document
+    ResultItemDocument(String newHash, String newTitle, String newFrequency) {
+	
+	kind = documentItem;
+	text = newTitle;
+
+	sort = sortDocumentItem;
+	frequency = Integer.valueOf(newFrequency).intValue();
+	hash = newHash;
+    }
+
+    // Is this item a document?
+    public boolean isDocument() { return true; }
+
+    // Return the bare text of the item
+    public String toString() { return(text); }
+
+    // Return the text of the item components
+    public String hiddenText() { return hash; }
+ 
+
+}
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemLink.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemLink.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemLink.java	(revision 21083)
@@ -0,0 +1,86 @@
+/**********************************************************************
+ *
+ * ResultItemLink.java -- a thesaurus link in the Phind applet
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+It contains information describing a thesaurus link.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+public class ResultItemLink extends ResultItem {
+
+    // The phrase number, stored as a string and as a number
+    String id;
+    int symbol;
+
+    // The text of the link is stored in the inherited text field.
+
+    // The type of thesaurus link
+    String linkType;
+
+    // The total frequency is stored in the inherited frequency field.
+
+    // The document frequency of the thesaurus item
+    int documentFrequency;
+
+    // Create a ResultItem for a thesaurus link
+    ResultItemLink(String newId, String newText, String newLinkType, 
+		   String tf, String df) { 
+
+	kind = linkItem;
+	id = newId;
+	symbol = Integer.valueOf(newId).intValue();
+	text = newText.trim();
+	sort = sortLinkItem;
+	linkType = newLinkType;
+	frequency = Integer.valueOf(tf).intValue();
+	documentFrequency = Integer.valueOf(df).intValue();
+    }
+
+    // Is this item a phrase?
+    public boolean isLink() { return true; }
+
+    // Return the text of the item components
+    public String hiddenText() { return id; }
+    public String docsText() { 
+	if (documentFrequency <= 0) { return ""; }
+	else { return Integer.toString(documentFrequency); }
+    }
+    public String prefixText() { 
+	if (linkType.equals("RT")) { return "Related term"; }
+	else if (linkType.equals("BT")) { return "Broader term"; }
+	else if (linkType.equals("NT")) { return "Narrower term"; }
+	else if (linkType.equals("USE")) { return "Use"; }
+	else if (linkType.startsWith("UF")) { return "Used for"; }
+	else { return linkType; }
+    }
+}
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemPhrase.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemPhrase.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultItemPhrase.java	(revision 21083)
@@ -0,0 +1,85 @@
+/**********************************************************************
+ *
+ * ResultItemPhrase.java -- a phrase result in the Phind applet
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+It contains information describing a phrase.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+public class ResultItemPhrase extends ResultItem {
+
+    // The phrase number, stored as a string and as a number
+    String id;
+    int symbol;
+
+    // The text of the phrase is split into a prefix, body, and suffix.
+    // The body is the same as the parent phrase (or search term) and 
+    // the prefix and suffix are the surrounding text.
+    String prefix;
+    String body;
+    String suffix;
+
+    // The document frequency of the phrase
+    int documentFrequency;
+
+    // Create a ResultItem for a phrase
+    ResultItemPhrase(String newId, String tf, String df, 
+		     String p, String b, String s) {
+
+	kind = phraseItem;
+
+	id = newId;
+	symbol = Integer.valueOf(newId).intValue();
+
+	sort = sortPhraseItem;
+	frequency = Integer.valueOf(tf).intValue();
+	documentFrequency = Integer.valueOf(df).intValue();
+
+	prefix = p;
+	body = b;
+	suffix = s;
+	text = (prefix + " " + body + " " + suffix);
+
+    }
+
+    // Is this item a phrase?
+    public boolean isPhrase() { return true; }
+
+    // Return the text of the item components
+    public String mainText() { return body; }
+    public String docsText() { return Integer.toString(documentFrequency); }
+    public String prefixText() { return prefix; }
+    public String suffixText() { return suffix; }
+    public String hiddenText() { return id; }
+
+}
+
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultTitle.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultTitle.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/ResultTitle.java	(revision 21083)
@@ -0,0 +1,163 @@
+/**********************************************************************
+ *
+ * ResultTitle.java -- describe the contents of a ResultBox
+ *
+ * Copyright 1997-2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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 class is used in the Phind java applet (Phind.java).
+
+ResultTitle is part of the result list displayed to the user.  It lists the
+phrase in the Result box, the number of expansions it occurs in, and the
+number of documents it occurs in.
+
+**********************************************************************/
+
+package org.nzdl.gsdl.Phind;
+
+import java.awt.Canvas;
+import java.awt.Graphics;
+import java.awt.Font;
+import java.awt.FontMetrics;
+import java.awt.Dimension;
+import java.awt.Color;
+
+
+public class ResultTitle extends Canvas {
+
+  // Other objects associated with this 
+  Phind phind;
+  ResultBox parent;
+  ResultCanvas canvas;
+
+  // fonts and font spacings to use
+  Font plain, bold;
+  Graphics g;
+
+  // Create a ResultTitle from the ResultBox which is its parent.
+  ResultTitle(ResultBox p) {
+
+    parent = p;
+    phind = p.phind;
+    canvas = p.c;
+    g = getGraphics();
+
+    plain = phind.plainFont;
+    bold  = phind.boldFont;
+    
+    // Note: the size() and resize() methods are deprecated, but the newer
+    // getSize() and setSize() methods fail in NetScape 4
+    //Dimension d = getSize();
+    Dimension d = size();
+    d.height = phind.fontSize + 10;
+    //setSize(d);
+    resize(d);
+    
+  }
+
+  public void update(Graphics g) {
+    paint(g);
+  }
+
+  public void paint(Graphics g) {
+
+    // calculate the canvas size, margins, and spacing
+    Dimension canvasSize = size();
+    
+    g.setFont(plain);
+    int margin = g.getFontMetrics().stringWidth(" 8888 ");
+    int y = phind.fontSize + 5;
+
+    int rightMargin = canvas.size().width;
+    int secondColumn = rightMargin - margin;
+    int firstColumn = secondColumn - margin;
+
+    g.setColor(Color.white);
+    g.fillRect(0, 0, canvasSize.width, canvasSize.height);
+    g.setColor(Color.black);
+
+
+    // What is the phrase we are searching for?
+    String phrase = parent.searchPhrase.replace('+', ' ');
+ 
+    // Construct the description phrase
+    String links = "";
+    if (parent.numberOfThesaurusLinks <= 0) {
+	links = "";
+    } else if (parent.numberOfThesaurusLinks == 1) { 
+	links = "1 link";
+    } else if (parent.thesaurusLinksRetrieved == parent.numberOfThesaurusLinks) {
+	links = parent.numberOfThesaurusLinks + " links";
+    } else {
+	links = parent.thesaurusLinksRetrieved + " of " 
+	    + parent.numberOfThesaurusLinks + " links";
+    }
+
+    String expansions = "";
+    if (parent.numberOfExpansions <= 0) {
+	expansions = "no phrases";
+    } else if (parent.numberOfExpansions == 1) { 
+	expansions = "1 phrase";
+    } else if (parent.expansionsRetrieved == parent.numberOfExpansions) {
+	expansions = parent.numberOfExpansions + " phrases";
+    } else {
+	expansions = parent.expansionsRetrieved + " of " 
+	    + parent.numberOfExpansions + " phrases";
+    }
+
+    String documents = "";
+    if (parent.numberOfDocuments <= 0) { 
+	documents = "no documents";
+    } else if (parent.documentsRetrieved == 1) {
+	documents = "1 document";
+    } else if (parent.documentsRetrieved == parent.numberOfDocuments) {
+	documents = parent.numberOfDocuments + " documents";
+    } else {
+	documents = parent.documentsRetrieved + " of " 
+	    + parent.numberOfDocuments + " documents";
+    }
+
+    String status = "(";
+    if (parent.numberOfThesaurusLinks > 0) {
+	status = status + links + ", ";
+    } 
+    status = status + expansions + ", " + documents + ")";
+
+
+    // Draw the text 
+    g.setFont(bold);
+    g.drawString(phrase, 0, y);
+    int tab = g.getFontMetrics().stringWidth(phrase + "  ");
+
+    g.setFont(plain);
+    g.drawString(status, tab, y);
+    tab = tab + g.getFontMetrics().stringWidth(status);
+    
+    if (tab < firstColumn) {
+      g.drawString("docs", firstColumn, y);
+      g.drawString("freq", secondColumn, y);
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/URLUTF8Encoder.java
===================================================================
--- /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/URLUTF8Encoder.java	(revision 21083)
+++ /main/tags/2.38/gsdl/src/java/org/nzdl/gsdl/Phind/URLUTF8Encoder.java	(revision 21083)
@@ -0,0 +1,159 @@
+/**********************************************************************
+ *
+ *
+ * URLUTF8Encoder.java -- encode UTF8 String into a URL form
+ *
+ * W3C® SOFTWARE NOTICE AND LICENSE
+ *
+ * Copyright © 1994-2000 World Wide Web Consortium, 
+ * (Massachusetts Institute of Technology, Institut National de 
+ * Recherche en Informatique et en Automatique, Keio University). 
+ * All Rights Reserved.  http://www.w3.org/Consortium/Legal/
+ * 
+ * This W3C work (including software, documents, or other related items) is
+ * being provided by the copyright holders under the following license. By
+ * obtaining, using and/or copying this work, you (the licensee) agree that
+ * you have read, understood, and will comply with the following terms and
+ * conditions:
+ * 
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation, with or without modification, for any purpose and without
+ * fee or royalty is hereby granted, provided that you include the following
+ * on ALL copies of the software and documentation or portions thereof,
+ * including modifications, that you make:
+ * 
+ *   1. The full text of this NOTICE in a location viewable to users of the
+ *      redistributed or derivative work.
+ * 
+ *   2. Any pre-existing intellectual property disclaimers, notices, or terms
+ *      and conditions. If none exist, a short notice of the following form
+ *      (hypertext is preferred, text is permitted) should be used within the
+ *      body of any redistributed or derivative code: "Copyright ©
+ *      [$date-of-software] World Wide Web Consortium, (Massachusetts
+ *      Institute of Technology, Institut National de Recherche en
+ *      Informatique et en Automatique, Keio University). All Rights
+ *      Reserved. http://www.w3.org/Consortium/Legal/"
+ * 
+ *   3. Notice of any changes or modifications to the W3C files, including the
+ *      date changes were made. (We recommend you provide URIs to the location
+ *      from which the code is derived.)
+ * 
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS
+ * MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT
+ * NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR
+ * PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE
+ * ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.
+ * 
+ * COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR
+ * CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR
+ * DOCUMENTATION.
+ * 
+ * The name and trademarks of copyright holders may NOT be used in advertising
+ * or publicity pertaining to the software without specific, written prior
+ * permission. Title to copyright in this software and any associated
+ * documentation will at all times remain with copyright holders.
+ *
+ *********************************************************************/
+
+/**
+ * Provides a method to encode any string into a URL-safe
+ * form, the so-called "x-www-form-urlencoded" form.
+ * Non-ASCII characters are first encoded as sequences of
+ * two or three bytes, using the UTF-8 algorithm, before being
+ * encoded in "x-www-form-urlencoded".
+ */
+
+package org.nzdl.gsdl.Phind;
+
+public class URLUTF8Encoder
+{
+
+  final static String[] hex = {
+    "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
+    "%08", "%09", "%0a", "%0b", "%0c", "%0d", "%0e", "%0f",
+    "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
+    "%18", "%19", "%1a", "%1b", "%1c", "%1d", "%1e", "%1f",
+    "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
+    "%28", "%29", "%2a", "%2b", "%2c", "%2d", "%2e", "%2f",
+    "%30", "%31", "%32", "%33", "%34", "%35", "%36", "%37",
+    "%38", "%39", "%3a", "%3b", "%3c", "%3d", "%3e", "%3f",
+    "%40", "%41", "%42", "%43", "%44", "%45", "%46", "%47",
+    "%48", "%49", "%4a", "%4b", "%4c", "%4d", "%4e", "%4f",
+    "%50", "%51", "%52", "%53", "%54", "%55", "%56", "%57",
+    "%58", "%59", "%5a", "%5b", "%5c", "%5d", "%5e", "%5f",
+    "%60", "%61", "%62", "%63", "%64", "%65", "%66", "%67",
+    "%68", "%69", "%6a", "%6b", "%6c", "%6d", "%6e", "%6f",
+    "%70", "%71", "%72", "%73", "%74", "%75", "%76", "%77",
+    "%78", "%79", "%7a", "%7b", "%7c", "%7d", "%7e", "%7f",
+    "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
+    "%88", "%89", "%8a", "%8b", "%8c", "%8d", "%8e", "%8f",
+    "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
+    "%98", "%99", "%9a", "%9b", "%9c", "%9d", "%9e", "%9f",
+    "%a0", "%a1", "%a2", "%a3", "%a4", "%a5", "%a6", "%a7",
+    "%a8", "%a9", "%aa", "%ab", "%ac", "%ad", "%ae", "%af",
+    "%b0", "%b1", "%b2", "%b3", "%b4", "%b5", "%b6", "%b7",
+    "%b8", "%b9", "%ba", "%bb", "%bc", "%bd", "%be", "%bf",
+    "%c0", "%c1", "%c2", "%c3", "%c4", "%c5", "%c6", "%c7",
+    "%c8", "%c9", "%ca", "%cb", "%cc", "%cd", "%ce", "%cf",
+    "%d0", "%d1", "%d2", "%d3", "%d4", "%d5", "%d6", "%d7",
+    "%d8", "%d9", "%da", "%db", "%dc", "%dd", "%de", "%df",
+    "%e0", "%e1", "%e2", "%e3", "%e4", "%e5", "%e6", "%e7",
+    "%e8", "%e9", "%ea", "%eb", "%ec", "%ed", "%ee", "%ef",
+    "%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7",
+    "%f8", "%f9", "%fa", "%fb", "%fc", "%fd", "%fe", "%ff"
+  };
+
+  /**
+   * Encode a string to the "x-www-form-urlencoded" form, enhanced
+   * with the UTF-8-in-URL proposal. This is what happens:
+   *
+   * <ul>
+   * <li><p>The ASCII characters 'a' through 'z', 'A' through 'Z',
+   *        and '0' through '9' remain the same.
+   *
+   * <li><p>The space character ' ' is converted into a plus sign '+'.
+   *
+   * <li><p>All other ASCII characters are converted into the
+   *        3-character string "%xy", where xy is
+   *        the two-digit hexadecimal representation of the character
+   *        code
+   *
+   * <li><p>All non-ASCII characters are encoded in two steps: first
+   *        to a sequence of 2 or 3 bytes, using the UTF-8 algorithm;
+   *        secondly each of these bytes is encoded as "%xx".
+   * </ul>
+   *
+   * @param s The string to be encoded
+   * @return The encoded string
+   */
+  public static String encode(String s)
+  {
+    StringBuffer sbuf = new StringBuffer();
+    int len = s.length();
+    for (int i = 0; i < len; i++) {
+      int ch = s.charAt(i);
+      if ('A' <= ch && ch <= 'Z') {		// 'A'..'Z'
+	sbuf.append((char)ch);
+      } else if ('a' <= ch && ch <= 'z') {	// 'a'..'z'
+	sbuf.append((char)ch);
+      } else if ('0' <= ch && ch <= '9') {	// '0'..'9'
+	sbuf.append((char)ch);
+      } else if (ch == ' ') {			// space
+	sbuf.append('+');
+      } else if (ch <= 0x007f) {		// other ASCII
+	sbuf.append(hex[ch]);
+      } else if (ch <= 0x07FF) {		// non-ASCII <= 0x7FF
+	sbuf.append(hex[0xc0 | (ch >> 6)]);
+	sbuf.append(hex[0x80 | (ch & 0x3F)]);
+      } else {					// 0x7FF < ch <= 0xFFFF
+	sbuf.append(hex[0xe0 | (ch >> 12)]);
+	sbuf.append(hex[0x80 | ((ch >> 6) & 0x3F)]);
+	sbuf.append(hex[0x80 | (ch & 0x3F)]);
+      }
+    }
+    return sbuf.toString();
+  }
+
+}
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/COPYING
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/COPYING	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/COPYING	(revision 21083)
@@ -0,0 +1,344 @@
+		    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
+
+
+	    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.
Index: /main/tags/2.38/gsdl/src/mgpp/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/Makefile.in	(revision 21083)
@@ -0,0 +1,113 @@
+# Main Makefile for GNU tar.
+# Copyright (C) 1994, 1995 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ 
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+@SET_MAKE@
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+ 
+
+CC = @CC@
+CPP = @CXX@
+CFLAGS = @CFLAGS@ -ansi
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBS = @LIBS@  
+TOUCH = echo timestamp >
+ 
+bindir = $(exec_prefix)/bin
+infodir = $(prefix)/info
+libexecdir = $(exec_prefix)/libexec
+ 
+MDEFINES = 
+#CC='$(CC)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \
+#prefix='$(prefix)' exec_prefix='$(exec_prefix)' \
+#bindir='$(bindir)' libexecdir='$(libexecdir)' \
+#infodir='$(infodir)' infodir='$(infodir)' libexecdir='$(libexecdir)'
+
+SUBDIRS = lib text
+
+
+.SUFFIXES:
+
+all install uninstall execinstall execuninstall maninstall manuninstall:
+#config.h
+	for subdir in $(SUBDIRS); do \
+	  echo making $@ in $$subdir; \
+	  (cd $$subdir && $(MAKE) $(MDEFINES) $@) || exit 1; \
+	done
+
+# Have not written any texinfo files for the documentation yet
+#info dvi:
+#	cd doc && $(MAKE) $@
+
+mostlyclean: mostlyclean-recursive mostlyclean-local
+
+clean: clean-recursive clean-local
+
+# toplevel Makefile does our subdirs already (jrm21)
+#distclean: distclean-recursive distclean-local
+#	rm config.status
+distclean:
+
+maintainer-clean: maintainer-clean-recursive maintainer-clean-local
+	rm config.status
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+	for subdir in $(SUBDIRS); do \
+	  target=`echo $@ | sed 's/-recursive//'`; \
+	  echo making $$target in $$subdir; \
+	  (cd $$subdir && $(MAKE) $$target) || exit 1; \
+	done
+
+mostlyclean-local:
+
+clean-local: mostlyclean-local
+
+distclean-local: clean-local
+	rm -f Makefile config.cache config.h config.log stamp-h
+
+maintainer-clean-local: distclean-local
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+distdir = $(PACKAGE)-$(VERSION)
+
+distname = $(distdir)
+
+DISTFILES = \
+INSTALL.mg INSTALL README README.port COPYING MODIFICATIONS about_mg.html \
+Makefile.in acconfig.h aclocal.m4 configure.in install-sh mkinstalldirs \
+config.guess config.sub \
+config.h.in configure stamp-h.in
+
+#-----------------------------------------------------------------
+
+# 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:
+
Index: /main/tags/2.38/gsdl/src/mgpp/acconfig.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/acconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/acconfig.h	(revision 21083)
@@ -0,0 +1,41 @@
+/* Special definitions for mg, processed by autoheader.
+   Created by [TS:Aug/95] 
+   by grepping for AC_DEFINE on configure.in and using the appropriate defs 
+   of acconfig.h used by GNU tar.
+*/
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define if `union wait' is the type of the first arg to wait functions.  */
+#undef HAVE_UNION_WAIT
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Define to 1 if GNU readline should be used. */
+#undef WITH_GNU_READLINE
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
+
+/* Define to 1 to override the automatic selection of "long long" */
+#undef DISABLE_LONG_LONG
Index: /main/tags/2.38/gsdl/src/mgpp/aclocal.m4
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/aclocal.m4	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/aclocal.m4	(revision 21083)
@@ -0,0 +1,225 @@
+# Local additions to Autoconf macros.
+# Copyright (C) 1992, 1994, 1995 Free Software Foundation, Inc.
+# François Pinard <pinard@iro.umontreal.ca>, 1992.
+
+# [TS:Aug/95] - chopped out the NLS stuff which I don't support
+
+## ------------------------------- ##
+## Check for function prototypes.  ##
+## ------------------------------- ##
+
+AC_DEFUN(fp_C_PROTOTYPES,
+[AC_REQUIRE([fp_PROG_CC_STDC])
+AC_MSG_CHECKING([for function prototypes])
+if test "$ac_cv_prog_cc_stdc" != no; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(PROTOTYPES)
+  U= ANSI2KNR=
+else
+  AC_MSG_RESULT(no)
+  U=_ ANSI2KNR=ansi2knr
+fi
+AC_SUBST(U)dnl
+AC_SUBST(ANSI2KNR)dnl
+])
+
+## ----------------------------------------- ##
+## ANSIfy the C compiler whenever possible.  ##
+## ----------------------------------------- ##
+
+# @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 defines @code{__STDC__} to 1 and
+# 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{ac_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(fp_PROG_CC_STDC,
+[AC_MSG_CHECKING(for ${CC-cc} option to accept ANSI C)
+AC_CACHE_VAL(ac_cv_prog_cc_stdc,
+[ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  AC_TRY_COMPILE(
+[#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+], [int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};],
+[ac_cv_prog_cc_stdc="$ac_arg"; break])
+done
+CFLAGS="$ac_save_CFLAGS"
+])
+AC_MSG_RESULT($ac_cv_prog_cc_stdc)
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+])
+
+## --------------------------------------------------------- ##
+## Use AC_PROG_INSTALL, supplementing it with INSTALL_SCRIPT ##
+## substitution.					     ##
+## --------------------------------------------------------- ##
+
+AC_DEFUN(fp_PROG_INSTALL,
+[AC_PROG_INSTALL
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL} -m 755'
+AC_SUBST(INSTALL_SCRIPT)dnl
+])
+
+## ----------------------------------- ##
+## Check if --with-dmalloc was given.  ##
+## ----------------------------------- ##
+
+# I just checked, and GNU rx seems to work fine with a slightly
+# modified GNU m4.  So, I put out the test below in my aclocal.m4,
+# and will try to use it in my things.  The idea is to distribute
+# rx.[hc] and regex.[hc] together, for a while.  The WITH_REGEX symbol
+# (which should also be documented in acconfig.h) is used to decide
+# which of regex.h or rx.h should be included in the application.
+#
+# If `./configure --with-regex' is given, the package will use
+# the older regex.  Else, a check is made to see if rx is already
+# installed, as with newer Linux'es.  If not found, the package will
+# use the rx from the distribution.  If found, the package will use
+# the system's rx which, on Linux at least, will result in a smaller
+# executable file.
+
+AC_DEFUN(fp_WITH_DMALLOC,
+[AC_MSG_CHECKING(if malloc debugging is wanted)
+AC_ARG_WITH(dmalloc,
+[  --with-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz],
+[if test "$withval" = yes; then
+  AC_MSG_RESULT(yes)
+  AC_DEFINE(WITH_DMALLOC)
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  AC_MSG_RESULT(no)
+fi], [AC_MSG_RESULT(no)])
+])
+
+## --------------------------------- ##
+## Check if --with-regex was given.  ##
+## --------------------------------- ##
+
+AC_DEFUN(fp_WITH_REGEX,
+[AC_MSG_CHECKING(which of rx or regex is wanted)
+AC_ARG_WITH(regex,
+[  --with-regex            use older regex in lieu of GNU rx for matching],
+[if test "$withval" = yes; then
+  ac_with_regex=1
+  AC_MSG_RESULT(regex)
+  AC_DEFINE(WITH_REGEX)
+  LIBOBJS="$LIBOBJS regex.o"
+fi])
+if test -z "$ac_with_regex"; then
+  AC_MSG_RESULT(rx)
+  AC_CHECK_FUNC(re_rx_search, , 
+   [AC_CHECK_SIZEOF(unsigned char *, unsigned char *)  
+    if test "$ac_cv_sizeof_unsigned_char_p" = 8
+    then
+      AC_MSG_WARN(I'm forcing you to use regex because I can't 
+        find a local rx library and the one included with this 
+        distribution doesn't work on 64-bit machines like yours)
+      [LIBOBJS="$LIBOBJS regex.o"]
+    else
+      [LIBOBJS="$LIBOBJS rx.o"]
+    fi]
+  )
+fi
+AC_SUBST(LIBOBJS)dnl
+])
+
+
+## --------------------------------------- ##
+## Check if --with-gnu-readline was given. ##
+## --------------------------------------- ##
+
+AC_DEFUN(fp_WITH_GNU_READLINE,
+[AC_MSG_CHECKING(whether GNU readline requested)
+  AC_ARG_WITH(gnu_readline,
+    [  --with-gnu-readline     compile with GNU readline support],
+    [if test "$withval" = yes; then
+      AC_MSG_RESULT(yes)
+      ac_with_gnu_readline=1
+    else
+      AC_MSG_RESULT(no)
+    fi],
+    AC_MSG_RESULT(no))
+
+  if test -n "$ac_with_gnu_readline"; then
+    AC_CHECK_HEADER(readline/readline.h, ac_mg_readline_header_found=1,
+	AC_MSG_WARN(Can't find GNU readline headers; configuring without \
+GNU readline support))
+    if test -n "$ac_mg_readline_header_found"; then
+      # first check whether we can find the readline library itself
+      AC_CHECK_LIB(readline, main, 
+        [ac_mg_readline_lib_found=1
+         AC_DEFINE(WITH_GNU_READLINE)
+         LIBS="$LIBS -lreadline"],
+        AC_MSG_WARN(Can't find GNU readline library; configuring without \
+GNU readline support))
+      if test -n "$ac_mg_readline_lib_found"; then
+        # on some systems, readline needs curses.  It is difficult to 
+        #  determine whether this is necessary on the current system,
+        #  since other undefined symbols can be turned up by an
+        #  AC_CHECK_LIB(readline, readline) test that are actually defined
+	#  by mg itself (e.g. xmalloc, xrealloc).  So, if we find libcurses,
+	#  we just bung it on and hope for the best.
+	AC_CHECK_LIB(curses, main,
+	  LIBS="$LIBS -lcurses")
+      fi
+    fi
+  fi
+])	
+
+
+
+#AC_DEFUN(fp_WITH_GNU_READLINE,
+#[AC_MSG_CHECKING(whether GNU readline requested)
+#  AC_ARG_WITH(gnu-readline,
+#    [  --with-gnu-readline   compile with GNU readline support],
+#    [if test "$withval" = yes; then
+#      AC_MSG_RESULT(yes)
+#      ac_with_gnu_readline=1
+#    else
+#      AC_MSG_RESULT(no)
+#    fi],
+#    AC_MSG_RESULT(no))
+#  if test -n "$ac_with_gnu_readline"; then
+#    AC_CHECK_LIB(readline, main, 
+#      AC_CHECK_HEADER(readline/readline.h,
+#	[AC_DEFINE(WITH_GNU_READLINE)
+## curses required on some systems (DEC OSF/1), but not on others (GNU/Linux,
+##  Solaris 2.6).  Forcing its inclusion is unsophisticated; if it causes 
+##  any actual problems on any UNIX platforms, let the maintainer know.
+#	LIBS="$LIBS -lreadline -lcurses"],
+#        AC_MSG_WARN(Can't find GNU readline headers: configuring \
+#without GNU readline support)
+#      ),
+#      AC_MSG_WARN(Can't find GNU readline library: configuring \
+#without GNU readline support)
+#    )
+#  fi 
+#])
Index: /main/tags/2.38/gsdl/src/mgpp/config.guess
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/config.guess	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/config.guess	(revision 21083)
@@ -0,0 +1,470 @@
+#!/bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# 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).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@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
+
+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:V*:*)
+	# After 1.2, OSF1 uses "V1.3" for uname -r.
+	echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^V//'`
+	exit 0 ;;
+    alpha:OSF1:*:*)
+	# 1.2 uses "1.2" for uname -r.
+	echo alpha-dec-osf${UNAME_RELEASE}
+        exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit 0;;
+    Pyramid*:OSx*:*:*)
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit 0 ;;
+    sun4*:SunOS:5.*:*)
+	echo sparc-sun-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:*:*)
+	# 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 ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit 0 ;;
+    mips:*:5*:RISCos)
+	echo mips-mips-riscos${UNAME_RELEASE}
+	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:*:*)
+	if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+	     -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	else
+		echo m88k-dg-dguxbcs${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${UNAME_RELEASE}
+	exit 0 ;;
+    i[34]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-cc} 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)
+	if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if grep bos410 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1
+	elif grep bos411 /usr/include/stdio.h >/dev/null 2>&1; then
+		IBM_REV=4.1.1
+	else
+		IBM_REV=4.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit 0 ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit 0 ;;
+    *: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/[3478]??:HP-UX:*:*)
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/7?? | 9000/8?7 ) HP_ARCH=hppa1.1 ;;
+	    9000/8?? )            HP_ARCH=hppa1.0 ;;
+	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-cc} 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?7:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit 0 ;;
+    hp7??:OSF1:*:* | hp8?7:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit 0 ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	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:UNICOS:*:*)
+	echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:UNICOS:*:*)
+	echo ymp-cray-unicos
+        exit 0 ;;
+    CRAY-2:UNICOS:*:*)
+	echo cray2-cray-unicos
+        exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+	echo m68k-hp-netbsd${UNAME_RELEASE}
+	exit 0 ;;
+    i[34]86:BSD/386:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit 0 ;;
+    *:FreeBSD:*:*)
+	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 ;;
+    *:GNU:*:*)
+	echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit 0 ;;
+    *:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux
+	exit 0 ;;
+# 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[34]86:DYNIX/ptx:4*:*)
+	echo i386-sequent-sysv4
+	exit 0 ;;
+    i[34]86:*:4.*:* | i[34]86:SYSTEM_V:4.*:*)
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit 0 ;;
+    i[34]86:*:3.2:*)
+	if /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
+		echo ${UNAME_MACHINE}-unknown-sco$UNAME_REL
+	elif test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-unknown-isc$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-unknown-sysv32
+	fi
+	exit 0 ;;
+    Intel:Mach:3*:*)
+	echo i386-unknown-mach3
+	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 ;;
+    M680[234]0:*:R3V[567]*:*)
+	test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4.3 && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m680[234]0:LynxOS:2.2*:*)
+	echo m68k-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit 0 ;;
+    i[34]86:LynxOS:2.2*:*)
+	echo i386-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    TSUNAMI:LynxOS:2.2*:*)
+	echo sparc-lynx-lynxos${UNAME_RELEASE}
+	exit 0 ;;
+    rs6000:LynxOS:2.2*:*)
+	echo rs6000-lynx-lynxos${UNAME_RELEASE}
+	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 ;;
+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
+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
+  printf ("m68k-sony-newsos\n"); 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`;
+  printf ("%s-next-nextstep%s\n", __ARCHITECTURE__,  version==2 ? "2" : "3");
+  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-unknown-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_)
+  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-cc} 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
Index: /main/tags/2.38/gsdl/src/mgpp/config.h.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/config.h.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/config.h.in	(revision 21083)
@@ -0,0 +1,183 @@
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if on AIX 3.
+   System headers sometimes define this.
+   We just want to avoid a redefinition error message.  */
+#ifndef _ALL_SOURCE
+#undef _ALL_SOURCE
+#endif
+
+/* 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 don't have vprintf but do have _doprnt.  */
+#undef HAVE_DOPRNT
+
+/* Define if you have the vprintf function.  */
+#undef HAVE_VPRINTF
+
+/* Define if on MINIX.  */
+#undef _MINIX
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+#undef off_t
+
+/* Define if the system does not provide POSIX.1 features except
+   with this defined.  */
+#undef _POSIX_1_SOURCE
+
+/* Define if you need to in order for stat and other things to work.  */
+#undef _POSIX_SOURCE
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* 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 you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if your <sys/time.h> declares struct tm.  */
+#undef TM_IN_SYS_TIME
+
+/* Define to the name of the distribution.  */
+#undef PACKAGE
+
+/* Define to the version of the distribution.  */
+#undef VERSION
+
+/* Define to 1 if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define to 1 if ANSI function prototypes are usable.  */
+#undef PROTOTYPES
+
+ 
+/* Define to 1 for better use of the debugging malloc library.  See
+   site ftp.antaire.com in antaire/src, file dmalloc/dmalloc.tar.gz.  */
+#undef WITH_DMALLOC
+
+ 
+/* Define to 1 if GNU regex should be used instead of GNU rx.  */
+#undef WITH_REGEX
+
+/* Define to 1 if GNU readline should be used. */
+#undef WITH_GNU_READLINE
+
+/* Some braindead header files do not have the requ'd function declarations */
+#undef HAVE_FGETC_DECL
+#undef HAVE_FREAD_DECL
+
+/* See if have this field in the prstatus_t structure */
+/* It stores the size of the process heap */
+#undef HAVE_PR_BRKSIZE
+
+/* Define to 1 to override the automatic selection of "long long" */
+#undef DISABLE_LONG_LONG
+
+/* The number of bytes in a unsigned char *.  */
+#undef SIZEOF_UNSIGNED_CHAR_P
+
+/* Define if you have the ftime function.  */
+#undef HAVE_FTIME
+
+/* Define if you have the ftruncate function.  */
+#undef HAVE_FTRUNCATE
+
+/* Define if you have the getpagesize function.  */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the getrusage function.  */
+#undef HAVE_GETRUSAGE
+
+/* Define if you have the mallinfo function.  */
+#undef HAVE_MALLINFO
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the setbuffer function.  */
+#undef HAVE_SETBUFFER
+
+/* Define if you have the strcasecmp function.  */
+#undef HAVE_STRCASECMP
+
+/* Define if you have the strerror function.  */
+#undef HAVE_STRERROR
+
+/* Define if you have the strftime function.  */
+#undef HAVE_STRFTIME
+
+/* Define if you have the strstr function.  */
+#undef HAVE_STRSTR
+
+/* Define if you have the strtol function.  */
+#undef HAVE_STRTOL
+
+/* Define if you have the times function.  */
+#undef HAVE_TIMES
+
+/* Define if you have the valloc function.  */
+#undef HAVE_VALLOC
+
+/* Define if you have the <dirent.h> header file.  */
+#undef HAVE_DIRENT_H
+
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <limits.h> header file.  */
+#undef HAVE_LIMITS_H
+
+/* Define if you have the <memory.h> header file.  */
+#undef HAVE_MEMORY_H
+
+/* Define if you have the <ndir.h> header file.  */
+#undef HAVE_NDIR_H
+
+/* Define if you have the <string.h> header file.  */
+#undef HAVE_STRING_H
+
+/* Define if you have the <sys/dir.h> header file.  */
+#undef HAVE_SYS_DIR_H
+
+/* Define if you have the <sys/ndir.h> header file.  */
+#undef HAVE_SYS_NDIR_H
+
+/* Define if you have the <sys/procfs.h> header file.  */
+#undef HAVE_SYS_PROCFS_H
+
+/* Define if you have the <sys/time.h> header file.  */
+#undef HAVE_SYS_TIME_H
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the m library (-lm).  */
+#undef HAVE_LIBM
Index: /main/tags/2.38/gsdl/src/mgpp/config.sub
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/config.sub	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/config.sub	(revision 21083)
@@ -0,0 +1,793 @@
+#!/bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 1992, 1993, 1994 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., 675 Mass Ave, Cambridge, MA 02139, 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
+# It is wrong to echo any other type of specification.
+
+# 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 (if any).
+basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+if [ $basic_machine != $1 ]
+then os=`echo $1 | sed 's/.*-/-/'`
+else os=; fi
+
+### 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 )
+		os=
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-unknown/'`
+		;;
+	-lynx)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+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 | i[345]86 | i860 | m68k | m68000 | m88k | ns32k | arm | pyramid \
+		| tron | a29k | 580 | i960 | h8300 | hppa1.0 | hppa1.1 \
+		| alpha | we32k | ns16k | clipper | sparclite | i370 | sh \
+		| powerpc | sparc64 | 1750a | dsp16xx | mips64 | mipsel \
+		| pdp11 | mips64el | mips64orion | mips64orionel )
+		basic_machine=$basic_machine-unknown
+		;;
+	# 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.
+	vax-* | tahoe-* | i[345]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+	      | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+	      | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+	      | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+	      | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+	      | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+	      | pdp11-* | sh-* | powerpc-* | sparc64-* | mips64-* | mipsel-* \
+	      | mips64el-* | mips64orion-* | mips64orionel-* )
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	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
+		;;
+	amigados)
+		basic_machine=m68k-cbm
+		os=-amigados
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-cbm
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	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
+		;;
+	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
+		;;
+	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
+		;;
+	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
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+	i[345]86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv32
+		;;
+	i[345]86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv4
+		;;
+	i[345]86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-sysv
+		;;
+	i[345]86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-unknown/'`
+		os=-solaris2
+		;;
+	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
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	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
+		;;
+	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
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	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-*)
+		# We will change tis to say i586 once there has been
+		# time for various packages to start to recognize that.
+		basic_machine=i486-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	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
+		;;
+	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
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	xmp)
+		basic_machine=xmp-cray
+		os=-unicos
+		;;
+        xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	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.
+	mips)
+		basic_machine=mips-mips
+		;;
+	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)
+		basic_machine=sparc-sun
+		;;
+        cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	*)
+		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
+	# -solaris* is a basic system type, with this one exception.
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux|'`
+		;;
+	# 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[345]* \
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+	      | -amigados* | -msdos* | -newsos* | -unicos* | -aos* \
+	      | -nindy* | -vxworks* | -ebmon* | -hms* | -mvs* | -clix* \
+	      | -riscos* | -linux* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -netbsd* | -freebsd* | -riscix* \
+	      | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+	      | -ptx* | -coff* | -winnt*)
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-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
+		;;
+        pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		# This also exists in the configure program, but was not the
+		# default.
+		# os=-sunos4
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigados
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-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
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	*)
+		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
+				;;
+			-lynxos*)
+				vendor=lynx
+				;;
+			-aix*)
+				vendor=ibm
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
Index: /main/tags/2.38/gsdl/src/mgpp/configure
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/configure	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/configure	(revision 21083)
@@ -0,0 +1,3380 @@
+#! /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-dmalloc          use dmalloc, as in
+                          ftp://ftp.letters.com/src/dmalloc/dmalloc.tar.gz"
+ac_help="$ac_help
+  --with-regex            use older regex in lieu of GNU rx for matching"
+ac_help="$ac_help
+  --with-gnu-readline     compile with GNU readline support"
+ac_help="$ac_help
+  --enable-override-longlong
+                          overide use of long long with GCC"
+
+# 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=text/MGQuery.cpp
+
+# 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@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
+
+
+
+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,"
+
+
+PACKAGE=mgpp
+VERSION=1.3
+
+cat >> confdefs.h <<EOF
+#define PACKAGE "$PACKAGE"
+EOF
+
+cat >> confdefs.h <<EOF
+#define VERSION "$VERSION"
+EOF
+
+
+
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
+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:575: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+  echo "$ac_t""$CXX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:607: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 618 "configure"
+#include "confdefs.h"
+
+int main(){return(0);}
+EOF
+if { (eval echo configure:623: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cxx_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_cxx_cross=no
+  else
+    ac_cv_prog_cxx_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cxx_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_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_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 ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:649: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:654: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.C <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gxx=yes
+else
+  ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+
+ac_test_CXXFLAGS="${CXXFLAGS+set}"
+ac_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS=
+echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:682: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+  ac_cv_prog_cxx_g=yes
+else
+  ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS="$ac_save_CXXFLAGS"
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  fi
+fi
+
+for ac_prog in mawk gawk nawk awk
+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:718: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$AWK"; then
+  ac_cv_prog_AWK="$AWK" # 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_AWK="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+AWK="$ac_cv_prog_AWK"
+if test -n "$AWK"; then
+  echo "$ac_t""$AWK" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$AWK" && break
+done
+
+for ac_prog in 'bison -y' byacc
+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:752: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$YACC"; then
+  ac_cv_prog_YACC="$YACC" # 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_YACC="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+YACC="$ac_cv_prog_YACC"
+if test -n "$YACC"; then
+  echo "$ac_t""$YACC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$YACC" && break
+done
+test -n "$YACC" || YACC="yacc"
+
+# 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:785: 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:815: 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:866: 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:898: 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 909 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:914: \"$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:940: 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:945: 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:954: \"$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:973: 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
+
+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:1035: 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 ln -s works""... $ac_c" 1>&6
+echo "configure:1088: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+  rm -f conftestdata
+  ac_cv_prog_LN_S="ln -s"
+else
+  ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1109: 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
+
+# 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:1138: 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 how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1167: 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 1182 "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:1188: \"$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 1199 "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:1205: \"$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 1216 "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:1222: \"$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 AIX""... $ac_c" 1>&6
+echo "configure:1247: checking for AIX" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1249 "configure"
+#include "confdefs.h"
+#ifdef _AIX
+  yes
+#endif
+
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "yes" >/dev/null 2>&1; then
+  rm -rf conftest*
+  echo "$ac_t""yes" 1>&6; cat >> confdefs.h <<\EOF
+#define _ALL_SOURCE 1
+EOF
+
+else
+  rm -rf conftest*
+  echo "$ac_t""no" 1>&6
+fi
+rm -f conftest*
+
+
+echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
+echo "configure:1271: 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
+
+ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6
+echo "configure:1293: checking for minix/config.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 1298 "configure"
+#include "confdefs.h"
+#include <minix/config.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1303: \"$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
+  MINIX=yes
+else
+  echo "$ac_t""no" 1>&6
+MINIX=
+fi
+
+if test "$MINIX" = yes; then
+  cat >> confdefs.h <<\EOF
+#define _POSIX_SOURCE 1
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _POSIX_1_SOURCE 2
+EOF
+
+  cat >> confdefs.h <<\EOF
+#define _MINIX 1
+EOF
+
+fi
+
+echo $ac_n "checking for ${CC-cc} option to accept ANSI C""... $ac_c" 1>&6
+echo "configure:1341: checking for ${CC-cc} option to accept ANSI C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CFLAGS="$CFLAGS"
+# 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
+for ac_arg in "" -qlanglvl=ansi -std1 "-Aa -D_HPUX_SOURCE" -Xc
+do
+  CFLAGS="$ac_save_CFLAGS $ac_arg"
+  cat > conftest.$ac_ext <<EOF
+#line 1357 "configure"
+#include "confdefs.h"
+#if !defined(__STDC__) || __STDC__ != 1
+choke me
+#endif	
+
+int main() {
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+; return 0; }
+EOF
+if { (eval echo configure:1369: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_prog_cc_stdc="$ac_arg"; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+CFLAGS="$ac_save_CFLAGS"
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_stdc" 1>&6
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno) ;;
+  *) CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+
+echo $ac_n "checking for function prototypes""... $ac_c" 1>&6
+echo "configure:1390: checking for function prototypes" >&5
+if test "$ac_cv_prog_cc_stdc" != no; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define PROTOTYPES 1
+EOF
+
+  U= ANSI2KNR=
+else
+  echo "$ac_t""no" 1>&6
+  U=_ ANSI2KNR=ansi2knr
+fi
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1404: 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 1409 "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:1458: \"$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 ANSI C header files""... $ac_c" 1>&6
+echo "configure:1479: 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 1484 "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:1492: \"$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 1509 "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 1527 "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 1548 "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:1559: \"$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
+
+echo $ac_n "checking for off_t""... $ac_c" 1>&6
+echo "configure:1583: 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 1588 "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:1616: 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 1621 "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
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:1649: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1654 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:1663: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_time=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+echo $ac_n "checking whether struct tm is in sys/time.h or time.h""... $ac_c" 1>&6
+echo "configure:1684: checking whether struct tm is in sys/time.h or time.h" >&5
+if eval "test \"`echo '$''{'ac_cv_struct_tm'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1689 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <time.h>
+int main() {
+struct tm *tp; tp->tm_sec;
+; return 0; }
+EOF
+if { (eval echo configure:1697: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_struct_tm=time.h
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_struct_tm" 1>&6
+if test $ac_cv_struct_tm = sys/time.h; then
+  cat >> confdefs.h <<\EOF
+#define TM_IN_SYS_TIME 1
+EOF
+
+fi
+
+
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+cat > conftest.$ac_ext <<EOF
+#line 1720 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+
+int main() {
+ FILE *rubbish = popen("yes", "r"); 
+; return 0; }
+EOF
+if { (eval echo configure:1728: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'
+fi
+rm -f conftest*
+fi
+
+
+echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
+echo "configure:1741: checking for main in -lm" >&5
+ac_lib_var=`echo m'_'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="-lm  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1749 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:1756: \"$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
+
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1789: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1794 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1802: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$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
+ ac_header_dirent=$ac_hdr; break
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1827: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | 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="-ldir  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1835 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1846: \"$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 -ldir"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1868: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | 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="-lx  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1876 "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 opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1887: \"$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 -lx"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1910: 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 1915 "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:1923: \"$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 1940 "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 1958 "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 1979 "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:1990: \"$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
+
+for ac_hdr in fcntl.h limits.h sys/time.h unistd.h string.h memory.h sys/procfs.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2017: 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 2022 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2027: \"$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
+
+cat > conftest.$ac_ext <<EOF
+#line 2054 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fread" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FREAD_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2069 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "fgetc" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_FGETC_DECL 1
+EOF
+
+fi
+rm -f conftest*
+
+cat > conftest.$ac_ext <<EOF
+#line 2084 "configure"
+#include "confdefs.h"
+#include <sys/procfs.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "pr_brksize" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_PR_BRKSIZE 1
+EOF
+
+fi
+rm -f conftest*
+
+
+# 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:2102: 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 2107 "configure"
+#include "confdefs.h"
+#include <alloca.h>
+int main() {
+char *p = alloca(2 * sizeof(int));
+; return 0; }
+EOF
+if { (eval echo configure:2114: \"$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:2135: 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 2140 "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:2168: \"$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:2200: 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 2205 "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:2230: 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 2235 "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:2258: \"$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:2285: 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 2293 "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:2312: \"$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
+
+if test $ac_cv_prog_gcc = yes; then
+    echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
+echo "configure:2335: checking whether ${CC-cc} needs -traditional" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    ac_pattern="Autoconf.*'x'"
+  cat > conftest.$ac_ext <<EOF
+#line 2341 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+else
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+
+  if test $ac_cv_prog_gcc_traditional = no; then
+    cat > conftest.$ac_ext <<EOF
+#line 2359 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "$ac_pattern" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+  fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
+  if test $ac_cv_prog_gcc_traditional = yes; then
+    CC="$CC -traditional"
+  fi
+fi
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:2381: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2386 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:2403: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+echo $ac_n "checking for vprintf""... $ac_c" 1>&6
+echo "configure:2422: checking for vprintf" >&5
+if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2427 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char vprintf(); 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 vprintf();
+
+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_vprintf) || defined (__stub___vprintf)
+choke me
+#else
+vprintf();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_vprintf=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_VPRINTF 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test "$ac_cv_func_vprintf" != yes; then
+echo $ac_n "checking for _doprnt""... $ac_c" 1>&6
+echo "configure:2474: checking for _doprnt" >&5
+if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2479 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char _doprnt(); 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 _doprnt();
+
+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__doprnt) || defined (__stub____doprnt)
+choke me
+#else
+_doprnt();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2502: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func__doprnt=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_DOPRNT 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+for ac_func in ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize strerror
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2529: 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 2534 "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:2557: \"$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 ftruncate strstr strcasecmp
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2584: 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 2589 "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:2612: \"$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
+
+
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+echo $ac_n "checking for HP-UX needing gmalloc""... $ac_c" 1>&6
+echo "configure:2643: checking for HP-UX needing gmalloc" >&5
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  echo "$ac_t""yes" 1>&6
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  cat >> confdefs.h <<\EOF
+#define HAVE_VALLOC 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+  for ac_func in valloc
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2656: 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 2661 "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:2684: \"$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
+
+echo $ac_n "checking if malloc debugging is wanted""... $ac_c" 1>&6
+echo "configure:2711: checking if malloc debugging is wanted" >&5
+# Check whether --with-dmalloc or --without-dmalloc was given.
+if test "${with_dmalloc+set}" = set; then
+  withval="$with_dmalloc"
+  if test "$withval" = yes; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_DMALLOC 1
+EOF
+
+  LIBS="$LIBS -ldmalloc"
+  LDFLAGS="$LDFLAGS -g"
+else
+  echo "$ac_t""no" 1>&6
+fi
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking which of rx or regex is wanted""... $ac_c" 1>&6
+echo "configure:2732: checking which of rx or regex is wanted" >&5
+# Check whether --with-regex or --without-regex was given.
+if test "${with_regex+set}" = set; then
+  withval="$with_regex"
+  if test "$withval" = yes; then
+  ac_with_regex=1
+  echo "$ac_t""regex" 1>&6
+  cat >> confdefs.h <<\EOF
+#define WITH_REGEX 1
+EOF
+
+  LIBOBJS="$LIBOBJS regex.o"
+fi
+fi
+
+if test -z "$ac_with_regex"; then
+  echo "$ac_t""rx" 1>&6
+  echo $ac_n "checking for re_rx_search""... $ac_c" 1>&6
+echo "configure:2750: checking for re_rx_search" >&5
+if eval "test \"`echo '$''{'ac_cv_func_re_rx_search'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2755 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char re_rx_search(); 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 re_rx_search();
+
+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_re_rx_search) || defined (__stub___re_rx_search)
+choke me
+#else
+re_rx_search();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2778: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_re_rx_search=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'re_rx_search`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking size of unsigned char *""... $ac_c" 1>&6
+echo "configure:2796: checking size of unsigned char *" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_unsigned_char_p'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_unsigned_char_p=unsigned char *
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2804 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(unsigned char *));
+  exit(0);
+}
+EOF
+if { (eval echo configure:2815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_unsigned_char_p=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_unsigned_char_p=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_unsigned_char_p" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_UNSIGNED_CHAR_P $ac_cv_sizeof_unsigned_char_p
+EOF
+
+  
+    if test "$ac_cv_sizeof_unsigned_char_p" = 8
+    then
+      echo "configure: warning: I'm forcing you to use regex because I can't 
+        find a local rx library and the one included with this 
+        distribution doesn't work on 64-bit machines like yours" 1>&2
+      LIBOBJS="$LIBOBJS regex.o"
+    else
+      LIBOBJS="$LIBOBJS rx.o"
+    fi
+  
+fi
+
+fi
+
+echo $ac_n "checking whether GNU readline requested""... $ac_c" 1>&6
+echo "configure:2849: checking whether GNU readline requested" >&5
+  # Check whether --with-gnu_readline or --without-gnu_readline was given.
+if test "${with_gnu_readline+set}" = set; then
+  withval="$with_gnu_readline"
+  if test "$withval" = yes; then
+      echo "$ac_t""yes" 1>&6
+      ac_with_gnu_readline=1
+    else
+      echo "$ac_t""no" 1>&6
+    fi
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+  if test -n "$ac_with_gnu_readline"; then
+    ac_safe=`echo "readline/readline.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for readline/readline.h""... $ac_c" 1>&6
+echo "configure:2867: checking for readline/readline.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 2872 "configure"
+#include "confdefs.h"
+#include <readline/readline.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2877: \"$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_mg_readline_header_found=1
+else
+  echo "$ac_t""no" 1>&6
+echo "configure: warning: Can't find GNU readline headers; configuring without \
+GNU readline support" 1>&2
+fi
+
+    if test -n "$ac_mg_readline_header_found"; then
+      # first check whether we can find the readline library itself
+      echo $ac_n "checking for main in -lreadline""... $ac_c" 1>&6
+echo "configure:2903: checking for main in -lreadline" >&5
+ac_lib_var=`echo readline'_'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="-lreadline  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2911 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2918: \"$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_mg_readline_lib_found=1
+         cat >> confdefs.h <<\EOF
+#define WITH_GNU_READLINE 1
+EOF
+
+         LIBS="$LIBS -lreadline"
+else
+  echo "$ac_t""no" 1>&6
+echo "configure: warning: Can't find GNU readline library; configuring without \
+GNU readline support" 1>&2
+fi
+
+      if test -n "$ac_mg_readline_lib_found"; then
+        # on some systems, readline needs curses.  It is difficult to 
+        #  determine whether this is necessary on the current system,
+        #  since other undefined symbols can be turned up by an
+        #  AC_CHECK_LIB(readline, readline) test that are actually defined
+	#  by mg itself (e.g. xmalloc, xrealloc).  So, if we find libcurses,
+	#  we just bung it on and hope for the best.
+	echo $ac_n "checking for main in -lcurses""... $ac_c" 1>&6
+echo "configure:2953: checking for main in -lcurses" >&5
+ac_lib_var=`echo curses'_'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="-lcurses  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2961 "configure"
+#include "confdefs.h"
+
+int main() {
+main()
+; return 0; }
+EOF
+if { (eval echo configure:2968: \"$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 -lcurses"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+      fi
+    fi
+  fi
+
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+
+# ---------------------------------------------------------------------------
+# see if the user wants to override use of long long
+# Check whether --enable-override-longlong or --disable-override-longlong was given.
+if test "${enable_override_longlong+set}" = set; then
+  enableval="$enable_override_longlong"
+  cat >> confdefs.h <<\EOF
+#define DISABLE_LONG_LONG 1
+EOF
+
+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 text/Makefile lib/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%@PACKAGE@%$PACKAGE%g
+s%@VERSION@%$VERSION%g
+s%@CXX@%$CXX%g
+s%@AWK@%$AWK%g
+s%@YACC@%$YACC%g
+s%@CC@%$CC%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@LN_S@%$LN_S%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@RANLIB@%$RANLIB%g
+s%@CPP@%$CPP%g
+s%@U@%$U%g
+s%@ANSI2KNR@%$ANSI2KNR%g
+s%@ALLOCA@%$ALLOCA%g
+s%@LIBOBJS@%$LIBOBJS%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 text/Makefile lib/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
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h
+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
+
Index: /main/tags/2.38/gsdl/src/mgpp/configure.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/configure.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/configure.in	(revision 21083)
@@ -0,0 +1,105 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(text/MGQuery.cpp)
+AC_CONFIG_HEADER(config.h)
+AC_ARG_PROGRAM
+
+dnl
+PACKAGE=mgpp
+VERSION=1.3
+
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+dnl Checks for programs.
+AC_PROG_CXX
+AC_PROG_AWK
+AC_PROG_YACC
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_AIX
+AC_ISC_POSIX
+AC_MINIX
+fp_C_PROTOTYPES
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_HEADER_TIME
+AC_STRUCT_TM
+
+dnl --- This should be in the stdc checking -----------------
+if test "$ac_cv_prog_cc_stdc" = '-Xc'; then
+dnl The Pyramids running SMP_DC.OSx on MIPS r3000 chips with
+dnl /usr/opt/cc3.11/bin/cc treat -Xc as full ANSI mode - no POSIX or
+dnl XOPEN extensions (like popen).
+dnl Unfortunately -D_{XOPEN,POSIX}_SOURCE can't provide all that mg
+dnl needs. So drop back to -Xa
+AC_TRY_COMPILE(
+[#include <stdio.h>
+], [ FILE *rubbish = popen("yes", "r"); ],,
+[CC="`echo $CC | sed 's/-Xc/-Xa/'`"    ac_cv_prog_cc_stdc='-Xa'])
+fi
+dnl ----------------------
+
+
+dnl Checks for libraries.
+dnl Replace `main' with a function in -lm:
+AC_CHECK_LIB(m, main)
+
+dnl Checks for header files.
+AC_HEADER_DIRENT
+AC_HEADER_STDC
+AC_CHECK_HEADERS(fcntl.h limits.h sys/time.h unistd.h string.h memory.h sys/procfs.h)
+AC_EGREP_HEADER(fread, stdio.h, AC_DEFINE(HAVE_FREAD_DECL))
+AC_EGREP_HEADER(fgetc, stdio.h, AC_DEFINE(HAVE_FGETC_DECL))
+AC_EGREP_HEADER(pr_brksize, sys/procfs.h, AC_DEFINE(HAVE_PR_BRKSIZE))
+
+dnl Checks for library functions.
+AC_FUNC_ALLOCA
+AC_PROG_GCC_TRADITIONAL
+AC_TYPE_SIGNAL
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS(ftime select strftime strtol getrusage times mallinfo setbuffer getpagesize strerror)
+AC_REPLACE_FUNCS(ftruncate strstr strcasecmp)
+
+
+# *** Custom checking (based on GNU tar configure.in) ***
+# ---------------------------------------------------------------------------
+AC_MSG_CHECKING(for HP-UX needing gmalloc)
+if test "`(uname -s) 2> /dev/null`" = 'HP-UX'; then
+  AC_MSG_RESULT(yes)
+  LIBOBJS="$LIBOBJS gmalloc.o"
+  AC_DEFINE(HAVE_VALLOC)
+else
+  AC_MSG_RESULT(no)
+  AC_CHECK_FUNCS(valloc)
+fi
+
+fp_WITH_DMALLOC
+fp_WITH_REGEX
+fp_WITH_GNU_READLINE
+
+# ---------------------------------------------------------------------------
+if test "$ac_cv_func_alloca" = 'no'; then
+dnl    support functions for alloca.c
+  LIBOBJS="$LIBOBJS xmalloc.o error.o"
+fi
+
+
+# ---------------------------------------------------------------------------
+# see if the user wants to override use of long long
+AC_ARG_ENABLE(override-longlong,
+[  --enable-override-longlong
+                          overide use of long long with GCC],
+  AC_DEFINE(DISABLE_LONG_LONG))
+
+# ---------------------------------------------------------------------------
+
+AC_OUTPUT([Makefile text/Makefile lib/Makefile ], 
+[test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h])
Index: /main/tags/2.38/gsdl/src/mgpp/install-sh
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/install-sh	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/install-sh	(revision 21083)
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# 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.
+#
+
+
+# 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}"
+
+tranformbasename=""
+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
Index: /main/tags/2.38/gsdl/src/mgpp/lib/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/Makefile.in	(revision 21083)
@@ -0,0 +1,155 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the general purpose library
+# Copyright (C) 1994  Neil Sharman; (C) 1995 Tim Shimmin
+#
+# 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.
+#
+#       @(#)Makefile.in	1.3 16 Mar 1994
+#
+###########################################################################
+
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+ 
+SHELL = /bin/sh
+srcdir = @srcdir@
+subdir = lib
+VPATH = @srcdir@
+ 
+AR = ar
+CC = @CC@
+CXX = @CXX@
+ifneq ($(NZDL), 1)
+CFLAGS = @CFLAGS@ -ansi
+else 
+CFLAGS = @CFLAGS@ -ansi -DSILENT
+endif
+CXXFLAGS = @CXXFLAGS@
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+
+prefix = @prefix@
+datadir = $(prefix)/share
+localedir = $(datadir)/locale
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES)  $(CFLAGS)
+CXXCOMPILE = $(CXX) -c $(DEFS) $(INCLUDES) $(CXXFLAGS)
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(COMPILE) -D__cplusplus $<
+
+ANSI2KNR = @ANSI2KNR@
+o = .@U@o
+ 
+.SUFFIXES: ._c ._o
+.c._c:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $@
+._c._o:
+	@echo $(COMPILE) $<
+	@rm -f _$*.c
+	@ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $*._c
+	@echo $(COMPILE) $*._c
+	@rm -f _$*.c
+	@ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+
+# want toplevel config.h, not local one
+INCLUDES = -I../../.. -I$(srcdir)
+ 
+HEADERS = \
+    bitio_m_random.h   local_strings.h    lovinstem.h \
+    bitio_m_stdio.h    memlib.h           netorder.h \
+    bitio_gen.h        mgheap.h           messages.h \
+    bitio_m.h          huffman.h  \
+    bitio_m_mem.h      perf_hash.h \
+    bitio_m_mems.h      \
+    pathmax.h          getpagesize.h      sysfuncs.h         bitio_m_abstract.h  \
+    random.h           simplefrenchstem.h unitool.h	     longlong.h \
+    non_ansi.h
+
+
+SOURCES = \
+    mgheap.cpp         \
+    huffman.cpp       messages.cpp \
+    bitio_gen.cpp     perf_hash.cpp \
+    local_strings.cpp lovinstem.cpp \
+    bitio_m_mem.cpp   bitio_m_stdio.cpp bitio_m_mems.cpp \
+    alloca.c          xmalloc.c         strstr.cpp \
+    ftruncate.cpp     strcasecmp.cpp    random.cpp \
+    simplefrenchstem.cpp                unitool.cpp       bitio_m_random.cpp \
+    bitio_m_abstract.cpp
+# memlib.cpp removed
+
+OBJECTS =  mgheap$o   \
+    huffman$o         messages$o \
+    bitio_gen$o       perf_hash$o \
+     local_strings$o   lovinstem$o \
+    bitio_m_mem$o     bitio_m_stdio$o   bitio_m_mems$o \
+    xmalloc$o         bitio_m_random$o  bitio_m_abstract$o \
+     random$o          simplefrenchstem$o \
+    unitool$o
+
+DISTFILES = Makefile.in $(HEADERS) $(SOURCES)
+
+all : libmg.a
+
+libmg.a : $(OBJECTS)
+	rm -f libmg.a
+	$(AR) cru libmg.a $(OBJECTS)
+	$(RANLIB) libmg.a
+
+install: 
+installdirs:
+uninstall:
+execinstall:
+execuninstall:
+maninstall:
+manuninstall:
+ 
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $$file $(distdir) 2> /dev/null \
+	  || cp -p $$file $(distdir); \
+	done
+
+mostlyclean:
+	rm -f *.o *_.o
+ 
+clean: mostlyclean
+	rm -f libmg.a
+ 
+distclean: clean
+	rm -f Makefile
+ 
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+
+# breaks make distclean (jrm21)
+#Makefile: Makefile.in ../../../config.status
+#	cd ../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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:
Index: /main/tags/2.38/gsdl/src/mgpp/lib/WIN32.MAK
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/WIN32.MAK	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/WIN32.MAK	(revision 21083)
@@ -0,0 +1,98 @@
+###########################################################################
+#
+# win32 makefile -- mgpp\text
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..\..
+USE_STLPORT = 0
+
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+CC = cl
+CPPFLAGS =
+DEFS = -DSHORT_SUFFIX -DSILENT -DHAVE_CONFIG_H -D__WIN32__
+INCLUDES = -I"$(GSDLHOME)"
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LDFLAGS =
+
+LIBS = 
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .c .obj .cpp
+.c.obj:
+	$(COMPILE) $<
+.cpp.obj:
+	$(COMPILE) $<
+
+o = .obj
+
+HEADERS = \
+    bitio_m_random.h   local_strings.h    lovinstem.h \
+    bitio_m_stdio.h    memlib.h           netorder.h \
+    bitio_gen.h        mgheap.h           messages.h \
+    bitio_m.h          huffman.h  \
+    bitio_m_mem.h      perf_hash.h \
+    bitio_m_mems.h     getopt_old.h \
+    pathmax.h          getpagesize.h      sysfuncs.h         bitio_m_abstract.h  \
+    random.h           simplefrenchstem.h unitool.h	     longlong.h \
+    non_ansi.h
+
+SOURCES = \
+    mgheap.cpp         \
+    huffman.cpp       messages.cpp \
+    bitio_gen.cpp     perf_hash.cpp \
+    local_strings.cpp lovinstem.cpp \
+    bitio_m_mem.cpp   bitio_m_stdio.cpp bitio_m_mems.cpp \
+    alloca.c          xmalloc.c         strstr.cpp \
+    ftruncate.cpp     strcasecmp.cpp    random.cpp \
+    simplefrenchstem.cpp                unitool.cpp       bitio_m_random.cpp \
+    bitio_m_abstract.cpp getopt_old.c
+
+OBJECTS =  mgheap$o   \
+    huffman$o         messages$o \
+    bitio_gen$o       perf_hash$o \
+     local_strings$o   lovinstem$o \
+    bitio_m_mem$o     bitio_m_stdio$o   bitio_m_mems$o \
+    xmalloc$o         bitio_m_random$o  bitio_m_abstract$o \
+     random$o          simplefrenchstem$o \
+    unitool$o  win32in$o getopt_old$o
+
+all : libmg.lib
+
+libmg.lib: $(OBJECTS)
+	if EXIST libmg.lib del libmg.lib
+	lib /out:libmg.lib $(OBJECTS)
+
+clean:
+	del *$o 
+	del libmg.lib
+
+install:
Index: /main/tags/2.38/gsdl/src/mgpp/lib/alloca.c
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/alloca.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/alloca.c	(revision 21083)
@@ -0,0 +1,496 @@
+/* alloca.c -- allocate automatically reclaimed memory
+   (Mostly) portable public-domain implementation -- D A Gwyn
+
+   This implementation of the PWB library alloca function,
+   which is used to allocate space off the run-time stack so
+   that it is automatically reclaimed upon procedure exit,
+   was inspired by discussions with J. Q. Johnson of Cornell.
+   J.Otto Tennant <jot@cray.com> contributed the Cray support.
+
+   There are some preprocessor constants that can
+   be defined when compiling for your specific system, for
+   improved efficiency; however, the defaults should be okay.
+
+   The general concept of this implementation is to keep
+   track of all alloca-allocated blocks, and reclaim any
+   that are found to be deeper in the stack than the current
+   invocation.  This heuristic does not reclaim storage as
+   soon as it becomes invalid, but it will do so eventually.
+
+   As a special case, alloca(0) reclaims storage without
+   allocating any.  It is a good idea to use alloca(0) in
+   your main control loop, etc. to force garbage collection.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#ifdef emacs
+#include "blockinput.h"
+#endif
+
+/* If compiling with GCC 2, this file's not needed.  */
+#if !defined (__GNUC__) || __GNUC__ < 2
+
+/* If someone has defined alloca as a macro,
+   there must be some other way alloca is supposed to work.  */
+#ifndef alloca
+
+#ifdef emacs
+#ifdef static
+/* actually, only want this if static is defined as ""
+   -- this is for usg, in which emacs must undefine static
+   in order to make unexec workable
+   */
+#ifndef STACK_DIRECTION
+you
+lose
+-- must know STACK_DIRECTION at compile-time
+#endif /* STACK_DIRECTION undefined */
+#endif /* static */
+#endif /* emacs */
+
+/* If your stack is a linked list of frames, you have to
+   provide an "address metric" ADDRESS_FUNCTION macro.  */
+
+#if defined (CRAY) && defined (CRAY_STACKSEG_END)
+long i00afunc ();
+#define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg))
+#else
+#define ADDRESS_FUNCTION(arg) &(arg)
+#endif
+
+#if __STDC__
+typedef void *pointer;
+#else
+typedef char *pointer;
+#endif
+
+#define	NULL	0
+
+/* Different portions of Emacs need to call different versions of
+   malloc.  The Emacs executable needs alloca to call xmalloc, because
+   ordinary malloc isn't protected from input signals.  On the other
+   hand, the utilities in lib-src need alloca to call malloc; some of
+   them are very simple, and don't have an xmalloc routine.
+
+   Non-Emacs programs expect this to call use xmalloc.
+
+   Callers below should use malloc.  */
+
+#ifndef emacs
+#define malloc xmalloc
+#endif
+extern pointer malloc ();
+
+/* Define STACK_DIRECTION 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  */
+
+#ifndef STACK_DIRECTION
+#define	STACK_DIRECTION	0	/* Direction unknown.  */
+#endif
+
+#if STACK_DIRECTION != 0
+
+#define	STACK_DIR	STACK_DIRECTION	/* Known at compile-time.  */
+
+#else /* STACK_DIRECTION == 0; need run-time code.  */
+
+static int stack_dir;		/* 1 or -1 once known.  */
+#define	STACK_DIR	stack_dir
+
+static void
+find_stack_direction ()
+{
+  static char *addr = NULL;	/* Address of first `dummy', once known.  */
+  auto char dummy;		/* To get stack address.  */
+
+  if (addr == NULL)
+    {				/* Initial entry.  */
+      addr = ADDRESS_FUNCTION (dummy);
+
+      find_stack_direction ();	/* Recurse once.  */
+    }
+  else
+    {
+      /* Second entry.  */
+      if (ADDRESS_FUNCTION (dummy) > addr)
+	stack_dir = 1;		/* Stack grew upward.  */
+      else
+	stack_dir = -1;		/* Stack grew downward.  */
+    }
+}
+
+#endif /* STACK_DIRECTION == 0 */
+
+/* An "alloca header" is used to:
+   (a) chain together all alloca'ed blocks;
+   (b) keep track of stack depth.
+
+   It is very important that sizeof(header) agree with malloc
+   alignment chunk size.  The following default should work okay.  */
+
+#ifndef	ALIGN_SIZE
+#define	ALIGN_SIZE	sizeof(double)
+#endif
+
+typedef union hdr
+{
+  char align[ALIGN_SIZE];	/* To force sizeof(header).  */
+  struct
+    {
+      union hdr *next;		/* For chaining headers.  */
+      char *deep;		/* For stack depth measure.  */
+    } h;
+} header;
+
+static header *last_alloca_header = NULL;	/* -> last alloca header.  */
+
+/* Return a pointer to at least SIZE bytes of storage,
+   which will be automatically reclaimed upon exit from
+   the procedure that called alloca.  Originally, this space
+   was supposed to be taken from the current stack frame of the
+   caller, but that method cannot be made to work for some
+   implementations of C, for example under Gould's UTX/32.  */
+
+pointer
+alloca (size)
+     unsigned size;
+{
+  auto char probe;		/* Probes stack depth: */
+  register char *depth = ADDRESS_FUNCTION (probe);
+
+#if STACK_DIRECTION == 0
+  if (STACK_DIR == 0)		/* Unknown growth direction.  */
+    find_stack_direction ();
+#endif
+
+  /* Reclaim garbage, defined as all alloca'd storage that
+     was allocated from deeper in the stack than currently. */
+
+  {
+    register header *hp;	/* Traverses linked list.  */
+
+#ifdef emacs
+    BLOCK_INPUT;
+#endif
+
+    for (hp = last_alloca_header; hp != NULL;)
+      if ((STACK_DIR > 0 && hp->h.deep > depth)
+	  || (STACK_DIR < 0 && hp->h.deep < depth))
+	{
+	  register header *np = hp->h.next;
+
+	  free ((pointer) hp);	/* Collect garbage.  */
+
+	  hp = np;		/* -> next header.  */
+	}
+      else
+	break;			/* Rest are not deeper.  */
+
+    last_alloca_header = hp;	/* -> last valid storage.  */
+
+#ifdef emacs
+    UNBLOCK_INPUT;
+#endif
+  }
+
+  if (size == 0)
+    return NULL;		/* No allocation required.  */
+
+  /* Allocate combined header + user data storage.  */
+
+  {
+    register pointer new = malloc (sizeof (header) + size);
+    /* Address of header.  */
+
+    ((header *) new)->h.next = last_alloca_header;
+    ((header *) new)->h.deep = depth;
+
+    last_alloca_header = (header *) new;
+
+    /* User storage begins just after header.  */
+
+    return (pointer) ((char *) new + sizeof (header));
+  }
+}
+
+#if defined (CRAY) && defined (CRAY_STACKSEG_END)
+
+#ifdef DEBUG_I00AFUNC
+#include <stdio.h>
+#endif
+
+#ifndef CRAY_STACK
+#define CRAY_STACK
+#ifndef CRAY2
+/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */
+struct stack_control_header
+  {
+    long shgrow:32;		/* Number of times stack has grown.  */
+    long shaseg:32;		/* Size of increments to stack.  */
+    long shhwm:32;		/* High water mark of stack.  */
+    long shsize:32;		/* Current size of stack (all segments).  */
+  };
+
+/* The stack segment linkage control information occurs at
+   the high-address end of a stack segment.  (The stack
+   grows from low addresses to high addresses.)  The initial
+   part of the stack segment linkage control information is
+   0200 (octal) words.  This provides for register storage
+   for the routine which overflows the stack.  */
+
+struct stack_segment_linkage
+  {
+    long ss[0200];		/* 0200 overflow words.  */
+    long sssize:32;		/* Number of words in this segment.  */
+    long ssbase:32;		/* Offset to stack base.  */
+    long:32;
+    long sspseg:32;		/* Offset to linkage control of previous
+				   segment of stack.  */
+    long:32;
+    long sstcpt:32;		/* Pointer to task common address block.  */
+    long sscsnm;		/* Private control structure number for
+				   microtasking.  */
+    long ssusr1;		/* Reserved for user.  */
+    long ssusr2;		/* Reserved for user.  */
+    long sstpid;		/* Process ID for pid based multi-tasking.  */
+    long ssgvup;		/* Pointer to multitasking thread giveup.  */
+    long sscray[7];		/* Reserved for Cray Research.  */
+    long ssa0;
+    long ssa1;
+    long ssa2;
+    long ssa3;
+    long ssa4;
+    long ssa5;
+    long ssa6;
+    long ssa7;
+    long sss0;
+    long sss1;
+    long sss2;
+    long sss3;
+    long sss4;
+    long sss5;
+    long sss6;
+    long sss7;
+  };
+
+#else /* CRAY2 */
+/* The following structure defines the vector of words
+   returned by the STKSTAT library routine.  */
+struct stk_stat
+  {
+    long now;			/* Current total stack size.  */
+    long maxc;			/* Amount of contiguous space which would
+				   be required to satisfy the maximum
+				   stack demand to date.  */
+    long high_water;		/* Stack high-water mark.  */
+    long overflows;		/* Number of stack overflow ($STKOFEN) calls.  */
+    long hits;			/* Number of internal buffer hits.  */
+    long extends;		/* Number of block extensions.  */
+    long stko_mallocs;		/* Block allocations by $STKOFEN.  */
+    long underflows;		/* Number of stack underflow calls ($STKRETN).  */
+    long stko_free;		/* Number of deallocations by $STKRETN.  */
+    long stkm_free;		/* Number of deallocations by $STKMRET.  */
+    long segments;		/* Current number of stack segments.  */
+    long maxs;			/* Maximum number of stack segments so far.  */
+    long pad_size;		/* Stack pad size.  */
+    long current_address;	/* Current stack segment address.  */
+    long current_size;		/* Current stack segment size.  This
+				   number is actually corrupted by STKSTAT to
+				   include the fifteen word trailer area.  */
+    long initial_address;	/* Address of initial segment.  */
+    long initial_size;		/* Size of initial segment.  */
+  };
+
+/* The following structure describes the data structure which trails
+   any stack segment.  I think that the description in 'asdef' is
+   out of date.  I only describe the parts that I am sure about.  */
+
+struct stk_trailer
+  {
+    long this_address;		/* Address of this block.  */
+    long this_size;		/* Size of this block (does not include
+				   this trailer).  */
+    long unknown2;
+    long unknown3;
+    long link;			/* Address of trailer block of previous
+				   segment.  */
+    long unknown5;
+    long unknown6;
+    long unknown7;
+    long unknown8;
+    long unknown9;
+    long unknown10;
+    long unknown11;
+    long unknown12;
+    long unknown13;
+    long unknown14;
+  };
+
+#endif /* CRAY2 */
+#endif /* not CRAY_STACK */
+
+#ifdef CRAY2
+/* Determine a "stack measure" for an arbitrary ADDRESS.
+   I doubt that "lint" will like this much. */
+
+static long
+i00afunc (long *address)
+{
+  struct stk_stat status;
+  struct stk_trailer *trailer;
+  long *block, size;
+  long result = 0;
+
+  /* We want to iterate through all of the segments.  The first
+     step is to get the stack status structure.  We could do this
+     more quickly and more directly, perhaps, by referencing the
+     $LM00 common block, but I know that this works.  */
+
+  STKSTAT (&status);
+
+  /* Set up the iteration.  */
+
+  trailer = (struct stk_trailer *) (status.current_address
+				    + status.current_size
+				    - 15);
+
+  /* There must be at least one stack segment.  Therefore it is
+     a fatal error if "trailer" is null.  */
+
+  if (trailer == 0)
+    abort ();
+
+  /* Discard segments that do not contain our argument address.  */
+
+  while (trailer != 0)
+    {
+      block = (long *) trailer->this_address;
+      size = trailer->this_size;
+      if (block == 0 || size == 0)
+	abort ();
+      trailer = (struct stk_trailer *) trailer->link;
+      if ((block <= address) && (address < (block + size)))
+	break;
+    }
+
+  /* Set the result to the offset in this segment and add the sizes
+     of all predecessor segments.  */
+
+  result = address - block;
+
+  if (trailer == 0)
+    {
+      return result;
+    }
+
+  do
+    {
+      if (trailer->this_size <= 0)
+	abort ();
+      result += trailer->this_size;
+      trailer = (struct stk_trailer *) trailer->link;
+    }
+  while (trailer != 0);
+
+  /* We are done.  Note that if you present a bogus address (one
+     not in any segment), you will get a different number back, formed
+     from subtracting the address of the first block.  This is probably
+     not what you want.  */
+
+  return (result);
+}
+
+#else /* not CRAY2 */
+/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP.
+   Determine the number of the cell within the stack,
+   given the address of the cell.  The purpose of this
+   routine is to linearize, in some sense, stack addresses
+   for alloca.  */
+
+static long
+i00afunc (long address)
+{
+  long stkl = 0;
+
+  long size, pseg, this_segment, stack;
+  long result = 0;
+
+  struct stack_segment_linkage *ssptr;
+
+  /* Register B67 contains the address of the end of the
+     current stack segment.  If you (as a subprogram) store
+     your registers on the stack and find that you are past
+     the contents of B67, you have overflowed the segment.
+
+     B67 also points to the stack segment linkage control
+     area, which is what we are really interested in.  */
+
+  stkl = CRAY_STACKSEG_END ();
+  ssptr = (struct stack_segment_linkage *) stkl;
+
+  /* If one subtracts 'size' from the end of the segment,
+     one has the address of the first word of the segment.
+
+     If this is not the first segment, 'pseg' will be
+     nonzero.  */
+
+  pseg = ssptr->sspseg;
+  size = ssptr->sssize;
+
+  this_segment = stkl - size;
+
+  /* It is possible that calling this routine itself caused
+     a stack overflow.  Discard stack segments which do not
+     contain the target address.  */
+
+  while (!(this_segment <= address && address <= stkl))
+    {
+#ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl);
+#endif
+      if (pseg == 0)
+	break;
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      this_segment = stkl - size;
+    }
+
+  result = address - this_segment;
+
+  /* If you subtract pseg from the current end of the stack,
+     you get the address of the previous stack segment's end.
+     This seems a little convoluted to me, but I'll bet you save
+     a cycle somewhere.  */
+
+  while (pseg != 0)
+    {
+#ifdef DEBUG_I00AFUNC
+      fprintf (stderr, "%011o %011o\n", pseg, size);
+#endif
+      stkl = stkl - pseg;
+      ssptr = (struct stack_segment_linkage *) stkl;
+      size = ssptr->sssize;
+      pseg = ssptr->sspseg;
+      result += size;
+    }
+  return (result);
+}
+
+#endif /* not CRAY2 */
+#endif /* CRAY */
+
+#endif /* no alloca */
+#endif /* not GCC version 2 */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.cpp	(revision 21083)
@@ -0,0 +1,134 @@
+/**************************************************************************
+ *
+ * bitio_gen.c -- General supoport routines for bitio
+ * Copyright (C) 1994  Neil Sharman and Alistair Moffat
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "bitio_m_abstract.h"
+
+int fprintf (FILE *, const char *,...);
+
+unsigned long 
+BIO_Unary_Length (unsigned long val)
+{
+  register unsigned long num;
+  num = bitio_buffer::unary_length(val);
+  //  UNARY_LENGTH (val, num);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Binary_Length (unsigned long val, unsigned long b)
+{
+  register unsigned long num;
+  num = bitio_buffer::binary_length (val, b);
+  return (num);
+}
+
+
+unsigned long BIO_Gamma_Length (unsigned long val) {
+  register unsigned long num;
+  num = bitio_buffer::gamma_length(val);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Delta_Length (unsigned long val)
+{
+  register unsigned long num;
+  num = bitio_buffer::delta_length(val);
+  return (num);
+}
+
+
+unsigned long 
+BIO_Elias_Length (unsigned long val, unsigned long b, double s)
+{
+  register unsigned long num;
+  num = bitio_buffer::elias_length(val, b, s);
+  return (num);
+}
+
+unsigned long 
+BIO_Bblock_Length (unsigned long val, unsigned long b)
+{
+  register unsigned long num;
+  num = bitio_buffer::bblock_length (val, b);
+  return (num);
+}
+
+
+int 
+BIO_Bblock_Init (int N, int p)
+{
+  int b;
+  b = (int) (0.5 + 0.6931471 * N / p);
+  return (b ? b : 1);
+}
+
+
+int 
+BIO_Bblock_Init_W (int N, int p)
+{
+  int logb;
+  logb = bitio_buffer::floor_log2 ((N - p) / p);
+  return (logb < 0 ? 1 : (1 << logb));
+}
+
+int 
+BIO_Bblock_Bound_b (int N, int p, int b)
+{
+  int clogb;
+  clogb = bitio_buffer::ceil_log2 (b);
+  return (p * (1 + clogb) + (N - p * ((1 << clogb) - b + 1)) / b);
+}
+
+int 
+BIO_Bblock_Bound (int N, int p)
+{
+  int b;
+  b = BIO_Bblock_Init_W (N, p);
+  return (BIO_Bblock_Bound_b (N, p, b));
+}
+
+/* adjustment is a hack to overcome inaccuracies in floating point,
+   where (int)(ln4/ln2) can equal 1, not 2. */
+int 
+BIO_Gamma_Bound (int N, int p)
+{
+  return ((int) (p * (2 * log2 (((double) N * 1.0001) / p) + 1)));
+}
+
+int 
+floorlog_2 (int b)
+{
+  int logb;
+  logb = bitio_buffer::floor_log2 (b);
+  return logb;
+}
+
+int 
+ceillog_2 (int b)
+{
+  int logb;
+  logb = bitio_buffer::ceil_log2 (b);
+  return logb;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_gen.h	(revision 21083)
@@ -0,0 +1,61 @@
+/**************************************************************************
+ *
+ * bitio_gen.h -- General supoport routines for bitio
+ * Copyright (C) 1994  Neil Sharman and Alistair Moffat
+ *
+ * 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 file contains function definitions for doing general bitio operations.
+ *
+ *  This file defines functions for calculation the length in bits of a number
+ *  coded unary, binary, delta, gamma, elias, and  bblock coding. It defines 
+ *  routines for calculating the parameter and bounds for bblock coding. 
+ *  Routines for calculating ceil and floor lg are also defined.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_GEN
+#define H_BITIO_GEN
+
+unsigned long BIO_Unary_Length (unsigned long val);
+
+unsigned long BIO_Binary_Length (unsigned long val, unsigned long b);
+
+unsigned long BIO_Gamma_Length (unsigned long val);
+
+unsigned long BIO_Delta_Length (unsigned long val);
+
+unsigned long BIO_Elias_Length (unsigned long val, unsigned long b, double s);
+
+unsigned long BIO_Bblock_Length (unsigned long val, unsigned long b);
+
+int BIO_Bblock_Init (int N, int p);
+
+int BIO_Bblock_Init_W (int N, int p);
+
+int BIO_Bblock_Bound_b (int N, int p, int b);
+
+int BIO_Bblock_Bound (int N, int p);
+
+int BIO_Gamma_Bound (int N, int p);
+
+int floorlog_2 (int b);
+
+int ceillog_2 (int b);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.cpp	(revision 21083)
@@ -0,0 +1,9 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bitio_m_abstract.h"
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_abstract.h	(revision 21083)
@@ -0,0 +1,340 @@
+#ifndef H_BITIO_ABSTRACT
+#define H_BITIO_ABSTRACT
+
+class bitio_buffer {
+public:
+  virtual int bit() = 0;
+  virtual void encodeBit(int bit) = 0;
+  virtual void seek(unsigned long topos) = 0;
+  
+  static inline void check_positive(char *type, unsigned long x) {
+    if (x <= 0) {
+      fprintf(stderr, "Error: Cannot %s encode %lu\n", type, x);
+      exit(1);
+    }
+  }
+
+  static inline int floor_log2(unsigned long x) {
+    unsigned long  _B_x = x;
+    int reply;
+    
+    reply = -1;
+    while (_B_x != 0) {
+      _B_x >>= 1;
+      reply ++;
+    }
+    return reply;
+  }
+  
+  static inline int ceil_log2(unsigned long x) {
+    register int _B_x;
+    unsigned long reply;
+    
+    _B_x = x - 1;
+    reply = 0;
+    while (_B_x != 0) {
+      _B_x >>= 1;
+      reply ++;
+    }
+    return reply;
+  }
+
+  inline unsigned long unary_decode(unsigned long *count) {
+    unsigned long x;
+    
+    x = 1;
+    while (!this->bit()) x++;
+    if (count != NULL) {
+      *count += x;
+    }
+    return x;
+  }
+
+  inline void unary_encode(unsigned long x, unsigned long *count) {
+    register unsigned long _B_x = x;
+    check_positive("unary", _B_x);
+    if (count != NULL) {
+      *count += _B_x;
+    }
+    while(--_B_x) 
+      encodeBit(0);
+    encodeBit(1);
+  }
+
+
+  inline unsigned long binary_decode(unsigned long b, unsigned long *count) {
+    register unsigned long _B_x = 0;
+    register unsigned long _B_b = b;
+    register int _B_i, _B_logofb, _B_thresh;
+    register unsigned long reply;
+    
+    if (_B_b != 1) {					
+      _B_logofb = ceil_log2(_B_b);
+      _B_thresh = (1<<_B_logofb) - _B_b;
+      _B_logofb--;
+      
+      if (count != NULL) {
+	*count += _B_logofb;
+      }
+      
+      for (_B_i=0; _B_i < _B_logofb; _B_i++) {
+	_B_x += _B_x + this->bit();
+      }
+
+      if ((int)_B_x >= _B_thresh) {
+	_B_x += _B_x + this->bit();
+	_B_x -= _B_thresh;
+	if (count != NULL) {
+	  *count = *count + 1;
+	}
+      }
+      reply = _B_x+1;
+      
+    } else reply = 1;
+    
+    return reply;
+  }
+
+  inline void binary_encode(unsigned long x, unsigned long b, unsigned long *count) {
+    register unsigned long _B_x = (x);
+    register unsigned long _B_b = (b);
+    register int _B_nbits, _B_logofb, _B_thresh;
+    
+    check_positive("binary", _B_x);
+    _B_logofb = ceil_log2(_B_b);
+    
+    _B_thresh = (1<<_B_logofb) - _B_b;
+    if ((int)(--_B_x) < _B_thresh) _B_nbits = _B_logofb-1;
+    else {
+      _B_nbits = _B_logofb;
+      _B_x += _B_thresh;
+    }
+    if (count != NULL) {
+      *count += _B_nbits;
+    }
+    while (--_B_nbits>=0)
+      encodeBit((_B_x>>_B_nbits) & 0x1);
+  }
+
+  inline unsigned long bblock_decode(unsigned long b, unsigned long *count) {
+    register unsigned long _B_x1, _B_xx = 0;
+    register unsigned long _B_bb = (b);
+    register int _B_xdivb;
+    
+    _B_xdivb = this->unary_decode(count);
+    _B_xdivb--;				       
+    while (_B_xdivb--) {
+      _B_xx += _B_bb;
+    }
+    _B_x1 = this->binary_decode(_B_bb, count);
+    return (_B_xx + _B_x1);
+  }
+  
+  inline void bblock_encode(unsigned long x, unsigned long b, unsigned long *count) {
+    register unsigned long _B_xx = (x);
+    register unsigned long _B_bb = (b);
+    register int _B_xdivb = 0;
+    check_positive("bblock", _B_xx);
+    _B_xx--;
+    while (_B_xx >= _B_bb) {
+      _B_xdivb++;
+      _B_xx -= _B_bb;
+    }
+    unary_encode(_B_xdivb+1, count);
+    binary_encode(_B_xx+1, _B_bb, count);
+  }
+
+  inline unsigned long elias_decode(unsigned long b, double s, unsigned long *count) {
+    register unsigned long _B_xx;
+    register unsigned long _B_b = b;
+    register double _B_s = s;
+    register int _B_lower=1, _B_upper=1;
+    register int _B_k;
+    register double _B_pow=1.0;
+    
+    _B_k = this->unary_decode(count);
+    _B_k--;
+    while (_B_k--) {
+      _B_lower = _B_upper+1;
+      _B_pow *= _B_s;
+      _B_upper += (int) (_B_b*_B_pow);
+    }
+    _B_xx = this->binary_decode(_B_upper-_B_lower+1, count);
+    _B_xx--;
+    check_positive("gamma", _B_xx+_B_lower);
+    return _B_xx+_B_lower;
+  }
+  
+  inline void elias_encode(unsigned long x, unsigned long b, double s, unsigned long *count) {
+    register unsigned long _B_xx = x;
+    register unsigned long _B_b = b;
+    register double _B_s = s;
+    register int _B_lower=1, _B_upper=1;
+    register int _B_k=0;
+    register double _B_pow=1.0;
+    
+    check_positive("elias", _B_xx);
+    
+    while ((int)_B_xx>_B_upper) {
+      _B_k++;
+      _B_lower = _B_upper+1;
+      _B_pow *= _B_s;
+      _B_upper += (int) (_B_b*_B_pow);
+    }
+    unary_encode(_B_k+1, count);
+    binary_encode(_B_xx-_B_lower+1, _B_upper-_B_lower+1, count);
+  }
+  
+  inline unsigned long gamma_decode(unsigned long *count) {
+    register unsigned long _B_xx = 1;
+    register int _B_nbits = 0;
+    
+    while(!this->bit()) _B_nbits++;
+    if (count != NULL) {
+      *count += _B_nbits*2+1;
+    }
+    while (_B_nbits-- > 0)
+      _B_xx += _B_xx + this->bit();
+    return _B_xx;
+  }
+
+  inline void gamma_encode(unsigned long x, unsigned long *count) {
+    register unsigned long _B_xx = x;
+    register int _B_logofb;
+    register int _B_nbits;
+    
+    check_positive("gamma", _B_xx);
+    _B_logofb = floor_log2(_B_xx);
+    _B_nbits = _B_logofb+1;
+    
+    if (count != NULL) { 
+      *count += _B_logofb*2+1;
+    }
+    while(_B_logofb--) encodeBit(0);
+    while (--_B_nbits>=0) encodeBit((_B_xx>>_B_nbits) & 0x1);
+  }
+  
+  inline unsigned long delta_decode(unsigned long *count) {
+    register unsigned long _B_xxx;
+    register int _B_logx;
+    _B_logx = gamma_decode(count);
+    _B_logx--;
+    _B_xxx = binary_decode(1<<_B_logx, count); 
+    _B_xxx--;
+    return (_B_xxx + (1<<_B_logx));
+  }
+
+  inline void delta_encode(unsigned long x, unsigned long *count) {
+    register unsigned long _B_xxx = x;
+    register int _B_logx;
+    _B_logx = floor_log2(_B_xxx);
+    gamma_encode(_B_logx+1, count);
+    binary_encode(_B_xxx+1, 1<<_B_logx, count);
+  }
+
+  inline unsigned long huff_decode(unsigned long *mcodes, unsigned long **values,
+				   unsigned long *count = NULL) {
+    register unsigned long *__min_code = mcodes;
+    register unsigned long *__mclen    = mcodes;
+    register unsigned long **__values  = values;
+    register unsigned long __code = 0;
+    do {
+      __code += __code + bit();
+      if (count != NULL) (*count) ++;
+    } while (__code < *++__mclen);
+    
+    return __values[__mclen - __min_code][__code - *__mclen];
+  }
+
+  inline void huff_encode(unsigned long x, unsigned long *codes, char *lens,
+			  unsigned long *count = NULL) {
+    register int __i;
+    register int __clen = lens[x];
+    register unsigned long __code = codes[x];
+    for (__i=__clen-1; __i>=0; __i--) {
+      encodeBit((__code >> __i) & 1);
+    }
+    if (count != NULL) {
+      *count += lens[x];
+    }
+  }
+
+  static inline unsigned long unary_length(unsigned long x) {
+    check_positive("unary", x);
+    return x;
+  }
+
+  static inline int binary_length(unsigned long x, unsigned long b) {
+    register unsigned long _B_x = (x);
+    register unsigned long _B_b = (b);
+    register int _B_nbits, _B_logofb, _B_thresh;
+    
+    check_positive("binary", _B_x);
+    _B_logofb = ceil_log2(_B_b);
+    _B_thresh = (1<<_B_logofb) - _B_b;
+    if ((int)(--_B_x) < _B_thresh) _B_nbits = _B_logofb-1;
+    else _B_nbits = _B_logofb;
+    return _B_nbits;
+  }
+
+  static inline unsigned long bblock_length(unsigned long x, unsigned long b) {
+    register unsigned long _B_bcount, count, _B_xx = (x);
+    register unsigned long _B_bb = (b);
+    register int _B_xdivb = 0;
+    
+    check_positive("bblock", _B_xx);
+    _B_xx--;
+    while (_B_xx >= _B_bb) {
+      _B_xdivb++;
+      _B_xx -= _B_bb;
+    }
+    count = unary_length(_B_xdivb+1);
+    _B_bcount = binary_length(_B_xx+1, _B_bb);
+    count += _B_bcount;
+    return count;
+  }
+  
+  static inline unsigned long elias_length(unsigned long x, unsigned long b, 
+					   double s) {
+    register unsigned long _B_xx = x;
+    register unsigned long _B_b = b;
+    register double _B_s = s;
+    register int _B_lower=1, _B_upper=1;
+    register int _B_k=0, _B_ecount;
+    register double _B_pow=1.0;
+    register unsigned long count;
+    check_positive("gamma", _B_xx);
+    
+    while ((int)(_B_xx)>_B_upper) {
+      _B_k++;
+      _B_lower = _B_upper+1;
+      _B_pow *= _B_s;
+      _B_upper += (int) (_B_b*_B_pow);
+    }
+    count = unary_length(_B_k+1);
+    _B_ecount = binary_length(_B_xx-_B_lower+1, _B_upper-_B_lower+1);
+    count += _B_ecount;
+    return count;
+  }
+  
+  static inline unsigned long gamma_length(unsigned long x) {
+    register unsigned long _B_xx = x;
+    register int _B_logofb;
+    check_positive("gamma", _B_xx);
+    _B_logofb = floor_log2(_B_xx);
+    return _B_logofb*2+1;
+  }
+
+  static inline unsigned long delta_length(unsigned long x) {
+    register unsigned long _B_xxx = x;
+    register int _B_logx, _B_dcount;
+    register unsigned long count;
+    _B_logx = floor_log2 (_B_xxx);
+    count = gamma_length(_B_logx+1);
+    _B_dcount = binary_length (_B_xxx+1, 1<<_B_logx);
+    count += _B_dcount;
+    return count;
+  }
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.cpp	(revision 21083)
@@ -0,0 +1,128 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bitio_m_abstract.h"
+#include "bitio_m_mem.h"
+
+mem_bitio_buffer::mem_bitio_buffer() {
+}
+
+mem_bitio_buffer::mem_bitio_buffer(unsigned char *readbuffer, int size) { 
+  pos       = readbuffer;
+  base      = readbuffer;
+  remaining = size;
+  buffer    = 0;
+  btg       = 0;
+}
+
+
+void mem_bitio_buffer::error() {
+  fprintf (stderr, "Unexpected EOF in \"%s\" on line %d\n", __FILE__, __LINE__);
+  exit(1);
+}
+
+void mem_bitio_buffer::encodeStart() {
+  btg = sizeof(buffer) * 8;
+}
+
+
+void mem_bitio_buffer::seek(unsigned long toPos) { 
+  register long _newPos;
+  do {
+    _newPos = toPos;
+    
+    pos    = base + (_newPos >> 3);
+    buffer = *pos++;
+    btg    = 8 - (_newPos & 0x07);
+  } while (0);
+}
+
+long mem_bitio_buffer::addff(long b) {
+  do {
+    if (btg == 0) {
+      if (remaining != 0) {
+	buffer = *pos++;
+	remaining --;
+      } else {
+	buffer = 0xff;
+      }
+      btg = sizeof(buffer) * 8;
+    }
+    b = b + b + ((buffer >> --btg) & 1);
+  } while(0);
+
+  return b;
+}
+
+long mem_bitio_buffer::add00(long b) {
+  do {
+    if (btg == 0) {
+      if (remaining != 0) {
+	buffer = *pos++;
+	remaining --;
+      } else {
+	buffer = 0x00;
+      }
+      btg = sizeof(buffer) * 8;
+    }
+    b = b + b + ((buffer >> --btg) & 1);
+  } while(0);
+  
+  return b;
+}
+
+int mem_bitio_buffer::bit() {
+  if (btg == 0) {
+
+    if (remaining == 0) { 
+      this->error();
+      return 0;
+
+    } else {
+      buffer = *pos++;
+      remaining--;
+      btg = sizeof(buffer) * 8;
+    }
+    
+  }
+  return ((buffer >> --btg) & 0x01);
+}
+
+void mem_bitio_buffer::encodeBit(int b) {
+  btg--;
+  if (b) buffer |= (1 << btg);
+  
+  if (btg == 0) {
+    if (remaining) {
+      *pos++ = buffer;
+      remaining--;
+    }
+    buffer = 0;
+    btg = sizeof(buffer)*8;
+  }
+}
+
+void mem_bitio_buffer::flush() {
+  if (btg != sizeof(buffer)*8) {
+    if (remaining) {
+      *pos++ = buffer;
+      remaining--;
+    }
+  }
+  btg = sizeof(buffer)*8;
+}
+
+void mem_bitio_buffer::done() {
+  // do nothing
+}
+
+int mem_bitio_buffer::encodeLength() {
+  return pos - base;
+}
+
+int mem_bitio_buffer::encodeVerify() {
+  return (remaining != 0);
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mem.h	(revision 21083)
@@ -0,0 +1,104 @@
+/**************************************************************************
+ *
+ * bitio_m_mem.h -- Macros for bitio to memory
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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 file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are faster than the ones in "mems" files. But 
+ *  with these routines you cannot mix reads and writes on the array of chars,
+ *  or multiple write, at the same time and guarantee them to work, also you 
+ *  cannot seek to a point and do a write. The decode routine can detect when
+ *  you run off the end of the array and will produce an approate error 
+ *  message, and the encode routine will stop when it gets to the end of the 
+ *  character array. 
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_MEM
+#define H_BITIO_M_MEM
+
+#include "bitio_m_abstract.h"
+
+
+class mem_bitio_buffer : public bitio_buffer {
+protected:
+  unsigned char *pos;
+  unsigned char *base;
+  int            remaining;
+  unsigned char  buffer;
+  unsigned char  btg;
+  
+public:
+  mem_bitio_buffer ();
+  mem_bitio_buffer (unsigned char *buffer, int size);
+  void seek (unsigned long topos);
+  void error ();
+  long add00 (long b);
+  long addff (long b);
+  int  bit ();
+  void done ();
+
+  void encodeStart ();
+  void encodeBit (int bit);
+  void encodeDone () { flush(); }
+  int  encodeVerify ();
+  int  encodeLength ();
+  void flush ();
+};
+
+
+/*
+#define ENCODE_START(p,r)						\
+  {									\
+    mem_bitio_buffer buffer(p, r);                                     \
+    buffer.encodeStart();
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    mem_bitio_buffer buffer;                                           \
+    buffer.unpause(b);
+
+#define ENCODE_PAUSE(b)	buffer.pause(&b);}
+
+#define ENCODE_FLUSH buffer.flush()
+
+#define ENCODE_DONE buffer.flush();}
+
+
+#define DECODE_START(p,r)						\
+  {	                                                                \
+    mem_bitio_buffer buffer(p,r);
+
+#define DECODE_CONTINUE(b)						\
+  {	                                                                \
+    mem_bitio_buffer buffer;                                           \
+    buffer.unpause(b);
+
+#define DECODE_ADD_FF(b) b = buffer.addff(b)
+
+#define DECODE_ADD_00(b) b = buffer.add00(b)
+
+#define DECODE_BIT buffer.bit()
+
+#define DECODE_DONE buffer.done();}
+
+#define DECODE_PAUSE(b) buffer.pause(&b);}
+*/
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.cpp	(revision 21083)
@@ -0,0 +1,89 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bitio_m_abstract.h"
+#include "bitio_m_mems.h"
+
+/**
+ * Create decoding "stream"/"file"
+ */
+mems_bitio_buffer::mems_bitio_buffer()
+{
+}
+
+mems_bitio_buffer::mems_bitio_buffer(unsigned char *readbuffer, long _pos)
+{ 
+  base = readbuffer;
+  pos  = _pos;
+}
+
+void mems_bitio_buffer::encodeStart()
+{
+  // Do nothing
+}
+
+
+void mems_bitio_buffer::error()
+{
+  fprintf(stderr, "Unexpected EOF in \"%s\" on line %d\n", __FILE__, __LINE__);
+  exit(1);
+}
+
+
+void mems_bitio_buffer::seek(unsigned long toPos)
+{ 
+  pos = toPos;
+}
+
+unsigned long mems_bitio_buffer::position()
+{
+  return pos;
+}
+
+long mems_bitio_buffer::addff(long b)
+{
+  do
+    {
+      b = b + b + (base[pos>>3] & (0x80 >> (pos & 0x07)) != 0);
+      pos ++;
+    }
+  while(0);
+
+  return b;
+}
+
+long mems_bitio_buffer::add00(long b)
+{
+  return addff(b);
+}
+
+int mems_bitio_buffer::bit()
+{
+  pos ++;
+  return ((base[(pos-1)>>3] & (0x80 >> ((pos-1) & 0x07))) != 0);
+}
+
+void mems_bitio_buffer::encodeBit(int bit)
+{
+  if (bit)
+    base[pos>>3] |= 0x80 >> (pos & 0x07);
+  else
+    base[pos>>3] &= 0xff7f >> (pos & 0x07);
+  pos++;
+}
+
+void mems_bitio_buffer::flush()
+{
+  // do nothing
+}
+
+void mems_bitio_buffer::done()
+{
+  // do nothing
+}
+
+void mems_bitio_buffer::encodeDone()
+{
+  flush();
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_mems.h	(revision 21083)
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * bitio_m_mems.h -- Macros for bitio to memory (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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 file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are slower than the ones in "mem" files. but 
+ *  with these routines you can mix reads and writes, or multiple writes,  on
+ *  the array of chars at the same time and guarantee them to work, also you 
+ *  can seek to a point and do a write. The decode and encode macros cannot 
+ *  detect when the end off the character is reached and just continue 
+ *  processing.
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_MEMS
+#define H_BITIO_M_MEMS
+
+#include "bitio_m_abstract.h"
+
+
+class mems_bitio_buffer : public bitio_buffer {
+protected:
+  unsigned char *base;
+  unsigned long  pos;
+  
+public:
+  mems_bitio_buffer();
+  mems_bitio_buffer(unsigned char *readbuffer, long _pos);
+  void seek(unsigned long topos);
+  void error();
+  long add00(long b);
+  long addff(long b);
+  int  bit();
+  //  int  bitOffset();
+  void done();
+
+  unsigned long position();
+
+  void encodeStart();
+  void encodeBit(int b);
+  void encodeDone();
+  void flush();
+};
+
+
+/*#define ENCODE_START(b,p)						\
+  {									\
+    mems_bitio_buffer buffer(b, p);
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    mems_bitio_buffer buffer;                                          \
+    buffer.unpause(b);
+
+#define ENCODE_PAUSE(b)	buffer.pause(&b);}
+
+#define ENCODE_FLUSH buffer.flush();
+
+
+#define ENCODE_DONE buffer.encodeDone();}
+
+
+#define DECODE_START(b,p)						\
+  {		                                                        \
+    mems_bitio_buffer buffer(b, p);
+
+#define DECODE_CONTINUE(b)						\
+  {									\
+    mems_bitio_buffer buffer;                                          \
+    buffer.unpause(b);
+
+#define DECODE_ADD_FF(b) b = buffer.addff(b);
+
+#define DECODE_ADD_00(b) b = buffer.add00(b);
+
+#define DECODE_BIT buffer.bit()
+
+#define DECODE_DONE buffer.done();}
+
+#define DECODE_PAUSE(b) buffer.pause(&b);}
+*/
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.cpp	(revision 21083)
@@ -0,0 +1,218 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "longlong.h"
+#include "sysfuncs.h"
+#include "memlib.h"
+
+#include "bitio_m_abstract.h"
+#include "bitio_m_random.h"
+
+random_bitio_buffer::random_bitio_buffer(FILE *f, unsigned long length)
+{
+  buffer = NULL;
+  attachFile (f, length);
+}
+
+random_bitio_buffer::~random_bitio_buffer() {
+  if (buffer != NULL) delete buffer;
+}
+
+void random_bitio_buffer::attachFile (FILE *f, unsigned long length) {
+  // delete the old buffer
+  if (buffer != NULL) {
+    delete buffer;
+    buffer = NULL;
+  }
+
+  // reset all the values
+  file   = f;
+  pos    = 0;
+  base   = 0;
+  used   = 0;
+  len    = length - 1;
+  shift  = 0;
+
+  // make sure the length is a power of 2
+  while (len != 0) {
+    shift ++;
+    len = len >> 1;
+  }
+  len = 1 << shift;
+
+  // allocate a new buffer
+  buffer = new u_char[len];
+
+  // fill up the buffer
+  if (file != NULL) {
+    fseek(file, 0, 0);
+    fread(buffer, 1, len, file);
+  }
+}
+
+random_bitio_buffer &random_bitio_buffer::operator= (const random_bitio_buffer &_rbb) {
+  // delete the old buffer
+  if (buffer != NULL) {
+    delete buffer;
+    buffer = NULL;
+  }
+
+  file = _rbb.file;
+
+  base = _rbb.base;
+  used = _rbb.used;
+  pos = _rbb.pos;
+  len = _rbb.len;
+  shift = _rbb.shift;
+
+  // copy the buffer
+  buffer = new u_char [len];
+  //  memcpy (buffer, _rbb.buffer, len);
+memcpy (buffer, _rbb.buffer, len);
+  
+  return (*this);
+}
+
+void random_bitio_buffer::error() {
+}
+
+void random_bitio_buffer::writeRead()
+{
+  if (used)
+    {
+      fseek(file, base, 0);
+      fwrite(buffer, 1, len, file);
+    }
+  //  else
+  //    {
+      base += len;
+      fseek(file, base, 0);
+      fread(buffer, 1, len, file);
+      pos = 0;
+      used = 0;
+  //    }
+}
+
+void random_bitio_buffer::encodeBit(int bit)
+{
+  do
+    {
+      if (bit != 0)
+	{
+	  buffer[pos >> 3] |= 0x80 >> (pos & 0x07);
+	}
+      else
+	{
+	  buffer[pos >> 3] &= 0xff7f >> (pos & 0x07);
+	}
+      used = 1;
+      pos ++;
+
+      if ((pos >> 3) >= len)
+	{
+	  writeRead();
+	}
+    }
+  while (0);
+}
+
+void random_bitio_buffer::flush()
+{
+  if (used != 0)
+    {
+      fseek(file, base, 0);
+      fwrite(buffer, 1, len, file);
+      used = 0;
+    }
+}
+
+void random_bitio_buffer::encodeDone()
+{
+  flush();
+  if (buffer != NULL) {
+    delete buffer;
+    buffer = NULL;
+  }
+}
+
+unsigned long random_bitio_buffer::tell()
+{
+  return ((base << 3) + pos);
+}
+
+void random_bitio_buffer::seek(unsigned long toPos)
+{
+  if (((toPos >> 3) >= base) && (((toPos+7) >> 3) < (base + len)))
+    {
+      pos = toPos - (base << 3);
+    }
+  else
+    {
+      flush();
+      base = toPos >> 3;
+      base = (toPos >> (shift + 3)) << shift;
+      fseek(file, base, 0);
+      fread(buffer, 1, len, file);
+      pos = toPos & 0x07;
+      pos = toPos & ((8 << shift) - 1);
+    }
+}
+
+int random_bitio_buffer::bit()
+{
+  //  fprintf(stderr, "Bit in");
+  pos ++;
+  if (((pos - 1) >> 3) >= len)
+    {
+      writeRead();
+      pos = 1;
+    }
+  return (buffer[(pos - 1) >> 3] & (0x80 >> ((pos - 1) & 0x07))) != 0;
+}
+
+long random_bitio_buffer::addff(long b)
+{
+  return b + b + bit();
+}
+
+long random_bitio_buffer::add00(long b)
+{
+  return addff(b);
+}
+
+int random_bitio_buffer::bitOffset()
+{
+  return 0;
+}
+
+void random_bitio_buffer::done()
+{
+  encodeDone();
+}
+
+
+#ifdef USE_LONG_LONG
+void random_bitio_buffer::seek_LL(mg_ullong toPos)
+{
+  if (((toPos >> 3) >= (mg_ullong) base) &&
+      (((toPos + 7) >> 3) < (mg_ullong) (base + len)))
+    {
+      pos = (long) (toPos - (mg_ullong) (base << 3));
+    }
+  else
+    {
+      flush();
+      base = (long) ((toPos >> (shift + 3)) << shift);
+
+      fseek(file, base, 0);
+      fread(buffer, 1, len, file);
+      pos = (long) (toPos & ((8 << shift) - 1));
+    }
+}
+
+mg_ullong random_bitio_buffer::tell_LL()
+{
+  return (((mg_ullong) base) << 3ull) + pos;
+}
+#endif
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_random.h	(revision 21083)
@@ -0,0 +1,127 @@
+/**************************************************************************
+ *
+ * bitio_m_random.h -- Macros for bitio to a file (random access)
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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 file contains macros for doing bitwise input and output on an array 
+ *  of chars. These routines are slower than the ones in "mem" files. but 
+ *  with these routines you can mix reads and writes, or multiple writes,  on
+ *  the array of chars at the same time and guarantee them to work, also you 
+ *  can seek to a point and do a write. The decode and encode macros cannot 
+ *  detect when the end off the character is reached and just continue 
+ *  processing.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_RANDOM
+#define H_BITIO_M_RANDOM
+
+#include "longlong.h"
+#include "bitio_m_abstract.h"
+
+
+class random_bitio_buffer : public bitio_buffer { 
+public:
+  FILE *file;
+  unsigned char *buffer;
+  unsigned long  base;
+  unsigned long  used;
+  unsigned long  pos;
+  unsigned long  len;
+  unsigned long  shift;
+  void writeRead();
+
+  random_bitio_buffer(FILE *f = 0,
+		      unsigned long length = 8*1024);
+  virtual ~random_bitio_buffer();
+  
+  void attachFile (FILE *f, unsigned long length);
+
+  random_bitio_buffer &operator= (const random_bitio_buffer &_rbb);
+  
+  void encodeDone();
+  void encodeBit(int b);
+  void flush();
+  unsigned long tell();
+
+  void seek(unsigned long topos);
+  void error();
+  long add00(long b);
+  long addff(long b);
+  int  bit();
+  int  bitOffset();
+  void done();
+
+#ifdef USE_LONG_LONG
+  // extras for longlong.h
+  void seek_LL(mg_ullong pos);
+  mg_ullong tell_LL();
+#endif
+};
+
+
+/*#define ENCODE_START(f,l)						\
+  {									\
+    random_bitio_buffer buffer(f, l);
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    random_bitio_buffer buffer;                                               \
+    buffer.unpause(b);
+
+#define SEEK fprintf(stderr, "Seek to %d\n",buffer.base)
+#define READ fprintf(stderr, "Read of %d\n",buffer.len)
+#define WRITE fprintf(stderr, "Write of %d\n",buffer.used)
+
+#define WRITE_READ buffer.writeRead()
+
+#define ENCODE_PAUSE(b)	buffer.pause(&b);}
+
+#define ENCODE_FLUSH buffer.flush();
+
+#define ENCODE_DONE buffer.done();}							
+
+#define DECODE_START(f,l) \
+  {									\
+    random_bitio_buffer buffer(f, l);
+
+#define DECODE_CONTINUE(b) \
+  {									\
+    random_bitio_buffer buffer;                                               \
+    buffer.unpause(b);
+
+#define DECODE_BIT buffer.bit()
+
+#define DECODE_ADD_FF(b) b = buffer.addff(b)
+
+#define DECODE_ADD_00(b) b = buffer.add00(b)
+
+#define DECODE_DONE buffer.done();}
+
+#define DECODE_PAUSE(b)	buffer.pause(&b);}
+
+#define ENCODE_TELL buffer.tell()
+
+#define DECODE_TELL buffer.tell()
+*/
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.cpp	(revision 21083)
@@ -0,0 +1,125 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "bitio_m_stdio.h"
+
+stdio_bitio_buffer::stdio_bitio_buffer(FILE *f) {
+  attachFile (f);
+}
+
+void stdio_bitio_buffer::attachFile (FILE *f) {
+  file = f;
+  buffer = 0;
+  btg = 0;
+  bytesWritten = 0;
+}
+
+void stdio_bitio_buffer::encodeStart() {
+  btg = sizeof(buffer) * 8;
+}
+
+void stdio_bitio_buffer::error() {
+  fprintf(stderr, "Unexpected EOF in \"%s\" on line %d", __FILE__, __LINE__);
+  exit(1);
+}
+
+void stdio_bitio_buffer::seek (unsigned long byte, unsigned char bit) {
+  if (fseek (file, byte, SEEK_SET) != 0) return;
+  buffer = getc(file);
+  btg = bit;
+  bytesWritten = 0;
+}
+
+void stdio_bitio_buffer::seek(unsigned long topos) {
+  if (fseek(file, topos >> 3, SEEK_SET) != 0) return;
+  buffer = getc(file);
+  btg = 8 - (topos & 0x07);
+  bytesWritten = 0;
+}
+
+long stdio_bitio_buffer::addff(long b)
+{
+  if (!btg)
+    {
+      register int val;
+      val = getc(file);
+      if (val == EOF)
+	{
+	  buffer = 0x0ff;
+	}
+      else
+	{
+	  buffer = val;
+	}
+      btg = sizeof(buffer) * 8;
+    }
+  b = b + b + ((buffer >> --btg) & 0x01);
+
+  return b;
+}
+
+long stdio_bitio_buffer::add00(long b)
+{
+  if (!btg)
+    {
+      register int val;
+      val = getc(file);
+      if (val == EOF)
+	{
+	  buffer = 0xff;
+	}
+      else
+	{
+	  buffer = val;
+	}
+      btg = sizeof(buffer) * 8;
+    }
+  b = b + b + ((buffer >> --btg) & 0x01);
+  
+  return b;
+}
+
+void stdio_bitio_buffer::encodeBit(int b)
+{
+  btg--;
+  if (b != 0)
+    buffer |= (1 << btg);
+
+  if (btg == 0)
+    {
+      putc(buffer, file);
+      bytesWritten += sizeof (buffer);
+      buffer = 0;
+      btg = sizeof(buffer)*8;
+    }
+}
+
+int stdio_bitio_buffer::bit()
+{
+  if (btg == 0)
+    {
+      buffer = getc(file);
+      if (feof(file))
+	{
+	  error();
+	  return 0;
+	}
+      else
+	{
+	  btg = sizeof(buffer) * 8;
+	}
+    }
+  return ((buffer >> --btg) & 0x01);
+}
+
+void stdio_bitio_buffer::done() {
+  // no tidying required
+}
+
+void stdio_bitio_buffer::encodeDone() {
+  if (btg != sizeof(buffer) * 8) {
+    putc(buffer, file);
+    bytesWritten += sizeof (buffer);
+  }
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/bitio_m_stdio.h	(revision 21083)
@@ -0,0 +1,101 @@
+/**************************************************************************
+ *
+ * bitio_m_stdio.h -- Macros for bitio to a file
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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 file contains macros for doing bitwise input and output on a FILE*.
+ *  With these routines you cannot mix reads and writes on the FILE,
+ *  or multiple writes, at the same time and guarantee them to work, also you 
+ *  cannot seek to a point and do a write. The decode routine can detect when
+ *  you run off the end of the file and will produce an approate error message.
+ *
+ *
+ **************************************************************************/
+
+#ifndef H_BITIO_M_STDIO
+#define H_BITIO_M_STDIO
+
+#include "bitio_m_abstract.h"
+
+
+class stdio_bitio_buffer : public bitio_buffer {
+protected:
+  FILE *file;
+  unsigned char buffer;
+  unsigned char btg;
+  unsigned long bytesWritten;
+  
+public:
+  stdio_bitio_buffer (FILE *f = NULL);
+
+  void attachFile (FILE *f);
+
+  unsigned char GetBtg () { return btg; }
+  unsigned long GetBytesWritten () { return bytesWritten; }
+  
+  void seek (unsigned long byte, unsigned char bit);
+  void seek (unsigned long topos);
+  void error();
+  long add00(long b);
+  long addff(long b);
+  int  bit();
+  int  bitOffset() { return btg; }
+  void done();
+
+  void encodeStart();
+  void encodeBit(int bit);
+  void encodeDone();
+};
+
+
+/*#define ENCODE_START(f)							\
+  {									\
+    stdio_bitio_buffer buffer(f);                                       \
+    buffer.encodeStart();
+
+#define ENCODE_CONTINUE(b)						\
+  {									\
+    stdio_bitio_buffer buffer;                                          \
+    buffer.unpause(b);
+
+#define ENCODE_PAUSE(b) buffer.pause(&b);}
+
+#define ENCODE_DONE buffer.encodeDone();}
+
+#define DECODE_START(f)							\
+  {		                                                        \
+    stdio_bitio_buffer buffer(f);
+
+#define DECODE_CONTINUE(b)						\
+  {									\
+    stdio_bitio_buffer buffer;                                          \
+     buffer.unpause(b);
+
+#define DECODE_ADD_FF(b) b = buffer.addff(b)
+
+#define DECODE_ADD_00(b) b = buffer.add00(b)
+
+#define DECODE_BIT buffer.bit()
+
+#define DECODE_DONE buffer.done();}
+
+#define DECODE_PAUSE(b) buffer.pause(&b);}
+*/
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/ftruncate.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/ftruncate.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/ftruncate.cpp	(revision 21083)
@@ -0,0 +1,99 @@
+/* ftruncate emulations that work on some System V's.
+   This file is in the public domain.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#include <sys/types.h>
+#include <fcntl.h>
+
+#ifdef F_CHSIZE
+
+int
+ftruncate (int fd, off_t length)
+{
+  return fcntl (fd, F_CHSIZE, length);
+}
+
+#else /* not F_CHSIZE */
+#ifdef F_FREESP
+
+/* By William Kucharski <kucharsk@netcom.com>.  */
+
+#include <sys/stat.h>
+#include <errno.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+int
+ftruncate (int fd, off_t length)
+{
+  struct flock fl;
+  struct stat filebuf;
+
+  if (fstat (fd, &filebuf) < 0)
+    return -1;
+
+  if (filebuf.st_size < length)
+    {
+      /* Extend file length. */
+      if (lseek (fd, (length - 1), SEEK_SET) < 0)
+	return -1;
+
+      /* Write a "0" byte. */
+      if (write (fd, "", 1) != 1)
+	return -1;
+    }
+  else
+    {
+
+      /* Truncate length. */
+
+      fl.l_whence = 0;
+      fl.l_len = 0;
+      fl.l_start = length;
+      fl.l_type = F_WRLCK;	/* write lock on file space */
+
+      /* This relies on the *undocumented* F_FREESP argument to fcntl,
+	 which truncates the file so that it ends at the position
+	 indicated by fl.l_start.  Will minor miracles never cease?  */
+
+      if (fcntl (fd, F_FREESP, &fl) < 0)
+	return -1;
+    }
+
+  return 0;
+}
+
+#else /* not F_CHSIZE nor F_FREESP */
+#ifdef HAVE_CHSIZE
+
+int
+ftruncate (int fd, off_t length)
+{
+  return chsize (fd, length);
+}
+
+#else /* not F_CHSIZE nor F_FREESP nor HAVE_CHSIZE */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+int
+ftruncate (int fd, off_t length)
+{
+  errno = EIO;
+  return -1;
+}
+
+#endif /* not HAVE_CHSIZE */
+#endif /* not F_FREESP */
+#endif /* not F_CHSIZE */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.c
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.c	(revision 21083)
@@ -0,0 +1,748 @@
+/* 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@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.  */
+
+
+
+#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__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+   contain conflicting prototypes for getopt.  */
+#include <stdlib.h>
+#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.  */
+
+/* jrm21 - GSDL: getopt.h -> getopt_old.h */
+#include "getopt_old.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
+#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;
+}
+
+/* If using GCC, we can safely declare strlen this way.
+   If not using GCC, it is ok not to declare it.  */
+#ifdef __GNUC__
+#ifdef IN_GCC
+#include "gstddef.h"
+#else
+#include <stddef.h>
+#endif
+extern size_t strlen (const char *);
+#endif
+
+#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 bottom = first_nonopt;
+  int middle = last_nonopt;
+  int top = optind;
+  char *tem;
+
+  /* Exchange the shorter segment with the far end of the longer segment.
+     That puts the shorter segment into the right place.
+     It leaves the longer segment in the right place overall,
+     but it consists of two parts that need to be swapped next.  */
+
+  while (top > middle && middle > bottom)
+    {
+      if (top - middle > middle - bottom)
+	{
+	  /* Bottom segment is the short one.  */
+	  int len = middle - bottom;
+	  register int i;
+
+	  /* Swap it with the top part of the top segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[top - (middle - bottom) + i];
+	      argv[top - (middle - bottom) + i] = tem;
+	    }
+	  /* Exclude the moved bottom segment from further swapping.  */
+	  top -= len;
+	}
+      else
+	{
+	  /* Top segment is the short one.  */
+	  int len = top - middle;
+	  register int i;
+
+	  /* Swap it with the bottom part of the bottom segment.  */
+	  for (i = 0; i < len; i++)
+	    {
+	      tem = argv[bottom + i];
+	      argv[bottom + i] = argv[middle + i];
+	      argv[middle + i] = tem;
+	    }
+	  /* Exclude the moved top segment from further swapping.  */
+	  bottom += len;
+	}
+    }
+
+  /* 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 */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/getopt_old.h	(revision 21083)
@@ -0,0 +1,130 @@
+/* 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 */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/getpagesize.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/getpagesize.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/getpagesize.h	(revision 21083)
@@ -0,0 +1,38 @@
+/* Emulate getpagesize on systems that lack it.  */
+
+#ifndef HAVE_GETPAGESIZE
+
+#ifdef VMS
+#define getpagesize() 512
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef _SC_PAGESIZE
+#define getpagesize() sysconf(_SC_PAGESIZE)
+#else
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifndef __WIN32__
+#include <sys/param.h>
+#endif
+
+#ifdef EXEC_PAGESIZE
+#define getpagesize() EXEC_PAGESIZE
+#else
+#ifdef NBPG
+#define getpagesize() NBPG * CLSIZE
+#ifndef CLSIZE
+#define CLSIZE 1
+#endif /* no CLSIZE */
+#else /* no NBPG */
+#ifdef NBPC
+#define getpagesize() NBPC
+#endif /* NBPC */
+#endif /* no NBPG */
+#endif /* no EXEC_PAGESIZE */
+#endif /* no _SC_PAGESIZE */
+
+#endif /* not HAVE_GETPAGESIZE */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/gmalloc.c
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/gmalloc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/gmalloc.c	(revision 21083)
@@ -0,0 +1,1318 @@
+/* DO NOT EDIT THIS FILE -- it is automagically generated.  -*- C -*- */
+
+#define _MALLOC_INTERNAL
+
+/* The malloc headers and source files from the C library follow here.  */
+
+/* Declarations for `malloc' and friends.
+   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef _MALLOC_H
+
+#define _MALLOC_H	1
+
+#ifdef _MALLOC_INTERNAL
+
+#ifdef	HAVE_CONFIG_H
+#include <sysfuncs.h>
+#endif
+
+#if	defined(_LIBC) || defined(STDC_HEADERS) || defined(USG)
+#include <string.h>
+#else
+#ifndef memset
+#define	memset(s, zero, n)	bzero ((s), (n))
+#endif
+#ifndef memcpy
+#define	memcpy(d, s, n)		bcopy ((s), (d), (n))
+#endif
+#endif
+
+#if	defined(__GNU_LIBRARY__) || __STDC__
+#include <limits.h>
+#else
+#define	CHAR_BIT	8
+#endif
+
+#ifdef	HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#endif	/* _MALLOC_INTERNAL.  */
+
+
+#ifdef	__cplusplus
+extern "C"
+{
+#endif
+
+#if defined (__cplusplus) || __STDC__
+#undef	__P
+#define	__P(args)	args
+#undef	__ptr_t
+#define	__ptr_t		void *
+#else /* Not C++ or ANSI C.  */
+#undef	__P
+#define	__P(args)	()
+#undef	const
+#define	const
+#undef	__ptr_t
+#define	__ptr_t		char *
+#endif /* C++ or ANSI C.  */
+
+#if	__STDC__
+#include <stddef.h>
+#else
+#undef	size_t
+#define	size_t		unsigned int
+#undef	ptrdiff_t
+#define	ptrdiff_t	int
+#endif
+
+#ifndef	NULL
+#define	NULL	0
+#endif
+
+
+/* Allocate SIZE bytes of memory.  */
+extern __ptr_t malloc __P ((size_t __size));
+/* Re-allocate the previously allocated block
+   in __ptr_t, making the new block SIZE bytes long.  */
+extern __ptr_t realloc __P ((__ptr_t __ptr, size_t __size));
+/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0.  */
+extern __ptr_t calloc __P ((size_t __nmemb, size_t __size));
+/* Free a block allocated by `malloc', `realloc' or `calloc'.  */
+extern void free __P ((__ptr_t __ptr));
+
+/* Allocate SIZE bytes allocated to ALIGNMENT bytes.  */
+extern __ptr_t memalign __P ((size_t __alignment, size_t __size));
+
+/* Allocate SIZE bytes on a page boundary.  */
+extern __ptr_t valloc __P ((size_t __size));
+
+
+#ifdef _MALLOC_INTERNAL
+
+/* The allocator divides the heap into blocks of fixed size; large
+   requests receive one or more whole blocks, and small requests
+   receive a fragment of a block.  Fragment sizes are powers of two,
+   and all fragments of a block are the same size.  When all the
+   fragments in a block have been freed, the block itself is freed.  */
+#define INT_BIT		(CHAR_BIT * sizeof(int))
+#define BLOCKLOG	(INT_BIT > 16 ? 12 : 9)
+#define BLOCKSIZE	(1 << BLOCKLOG)
+#define BLOCKIFY(SIZE)	(((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
+
+/* Determine the amount of memory spanned by the initial heap table
+   (not an absolute limit).  */
+#define HEAP		(INT_BIT > 16 ? 4194304 : 65536)
+
+/* Number of contiguous free blocks allowed to build up at the end of
+   memory before they will be returned to the system.  */
+#define FINAL_FREE_BLOCKS	8
+
+/* Data structure giving per-block information.  */
+typedef union
+  {
+    /* Heap information for a busy block.  */
+    struct
+      {
+	/* Zero for a large block, or positive giving the
+	   logarithm to the base two of the fragment size.  */
+	int type;
+	union
+	  {
+	    struct
+	      {
+		size_t nfree;	/* Free fragments in a fragmented block.  */
+		size_t first;	/* First free fragment of the block.  */
+	      } frag;
+	    /* Size (in blocks) of a large cluster.  */
+	    size_t size;
+	  } info;
+      } busy;
+    /* Heap information for a free block
+       (that may be the first of a free cluster).  */
+    struct
+      {
+	size_t size;		/* Size (in blocks) of a free cluster.  */
+	size_t next;		/* Index of next free cluster.  */
+	size_t prev;		/* Index of previous free cluster.  */
+      } free;
+  } malloc_info;
+
+/* Pointer to first block of the heap.  */
+extern char *_heapbase;
+
+/* Table indexed by block number giving per-block information.  */
+extern malloc_info *_heapinfo;
+
+/* Address to block number and vice versa.  */
+#define BLOCK(A)	(((char *) (A) - _heapbase) / BLOCKSIZE + 1)
+#define ADDRESS(B)	((__ptr_t) (((B) - 1) * BLOCKSIZE + _heapbase))
+
+/* Current search index for the heap table.  */
+extern size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+extern size_t _heaplimit;
+
+/* Doubly linked lists of free fragments.  */
+struct list
+  {
+    struct list *next;
+    struct list *prev;
+  };
+
+/* Free list headers for each fragment size.  */
+extern struct list _fraghead[];
+
+/* List of blocks allocated with `memalign' (or `valloc').  */
+struct alignlist
+  {
+    struct alignlist *next;
+    __ptr_t aligned;		/* The address that memaligned returned.  */
+    __ptr_t exact;		/* The address that malloc returned.  */
+  };
+extern struct alignlist *_aligned_blocks;
+
+/* Instrumentation.  */
+extern size_t _chunks_used;
+extern size_t _bytes_used;
+extern size_t _chunks_free;
+extern size_t _bytes_free;
+
+/* Internal version of `free' used in `morecore' (malloc.c). */
+extern void _free_internal __P ((__ptr_t __ptr));
+
+#endif /* _MALLOC_INTERNAL.  */
+
+/* Underlying allocation function; successive calls should
+   return contiguous pieces of memory.  */
+extern __ptr_t (*__morecore) __P ((ptrdiff_t __size));
+
+/* Default value of `__morecore'.  */
+extern __ptr_t __default_morecore __P ((ptrdiff_t __size));
+
+/* If not NULL, this function is called after each time
+   `__morecore' is called to increase the data size.  */
+extern void (*__after_morecore_hook) __P ((void));
+
+/* Nonzero if `malloc' has been called and done its initialization.  */
+extern int __malloc_initialized;
+
+/* Hooks for debugging versions.  */
+extern void (*__free_hook) __P ((__ptr_t __ptr));
+extern __ptr_t (*__malloc_hook) __P ((size_t __size));
+extern __ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
+
+/* Return values for `mprobe': these are the kinds of inconsistencies that
+   `mcheck' enables detection of.  */
+enum mcheck_status
+  {
+    MCHECK_DISABLED = -1,	/* Consistency checking is not turned on.  */
+    MCHECK_OK,			/* Block is fine.  */
+    MCHECK_FREE,		/* Block freed twice.  */
+    MCHECK_HEAD,		/* Memory before the block was clobbered.  */
+    MCHECK_TAIL			/* Memory after the block was clobbered.  */
+  };
+
+/* Activate a standard collection of debugging hooks.  This must be called
+   before `malloc' is ever called.  ABORTFUNC is called with an error code
+   (see enum above) when an inconsistency is detected.  If ABORTFUNC is
+   null, the standard function prints on stderr and then calls `abort'.  */
+extern int mcheck __P ((void (*__abortfunc) __P ((enum mcheck_status))));
+
+/* Check for aberrations in a particular malloc'd block.  You must have
+   called `mcheck' already.  These are the same checks that `mcheck' does
+   when you free or reallocate a block.  */
+extern enum mcheck_status mprobe __P ((__ptr_t __ptr));
+
+/* Activate a standard collection of tracing hooks.  */
+extern void mtrace __P ((void));
+
+/* Statistics available to the user.  */
+struct mstats
+  {
+    size_t bytes_total;		/* Total size of the heap. */
+    size_t chunks_used;		/* Chunks allocated by the user. */
+    size_t bytes_used;		/* Byte total of user-allocated chunks. */
+    size_t chunks_free;		/* Chunks in the free list. */
+    size_t bytes_free;		/* Byte total of chunks in the free list. */
+  };
+
+/* Pick up the current statistics. */
+extern struct mstats mstats __P ((void));
+
+/* Call WARNFUN with a warning message when memory usage is high.  */
+extern void memory_warnings __P ((__ptr_t __start,
+				  void (*__warnfun) __P ((const char *))));
+
+
+/* Relocating allocator.  */
+
+/* Allocate SIZE bytes, and store the address in *HANDLEPTR.  */
+extern __ptr_t r_alloc __P ((__ptr_t *__handleptr, size_t __size));
+
+/* Free the storage allocated in HANDLEPTR.  */
+extern void r_alloc_free __P ((__ptr_t *__handleptr));
+
+/* Adjust the block at HANDLEPTR to be SIZE bytes long.  */
+extern __ptr_t r_re_alloc __P ((__ptr_t *__handleptr, size_t __size));
+
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* malloc.h  */
+/* Allocate memory on a page boundary.
+   Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#if defined (__GNU_LIBRARY__) || defined (_LIBC)
+#include <stddef.h>
+#include <sys/cdefs.h>
+extern size_t __getpagesize __P ((void));
+#else
+#include "getpagesize.h"
+#define	 __getpagesize()	getpagesize()
+#endif
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+static size_t pagesize;
+
+__ptr_t
+valloc (size)
+     size_t size;
+{
+  if (pagesize == 0)
+    pagesize = __getpagesize ();
+
+  return memalign (pagesize, size);
+}
+/* Memory allocator `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* How to really get more memory.  */
+__ptr_t (*__morecore) __P ((ptrdiff_t __size)) = __default_morecore;
+
+/* Debugging hook for `malloc'.  */
+__ptr_t (*__malloc_hook) __P ((size_t __size));
+
+/* Pointer to the base of the first block.  */
+char *_heapbase;
+
+/* Block information table.  Allocated with align/__free (not malloc/free).  */
+malloc_info *_heapinfo;
+
+/* Number of info entries.  */
+static size_t heapsize;
+
+/* Search index in the info table.  */
+size_t _heapindex;
+
+/* Limit of valid info table indices.  */
+size_t _heaplimit;
+
+/* Free lists for each fragment size.  */
+struct list _fraghead[BLOCKLOG];
+
+/* Instrumentation.  */
+size_t _chunks_used;
+size_t _bytes_used;
+size_t _chunks_free;
+size_t _bytes_free;
+
+/* Are you experienced?  */
+int __malloc_initialized;
+
+void (*__after_morecore_hook) __P ((void));
+
+/* Aligned allocation.  */
+static __ptr_t align __P ((size_t));
+static __ptr_t
+align (size)
+     size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj;
+
+  result = (*__morecore) (size);
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+						  (char *) NULL)) % BLOCKSIZE;
+  if (adj != 0)
+    {
+      adj = BLOCKSIZE - adj;
+      (void) (*__morecore) (adj);
+      result = (char *) result + adj;
+    }
+
+  if (__after_morecore_hook)
+    (*__after_morecore_hook) ();
+
+  return result;
+}
+
+/* Set everything up and remember that we have.  */
+static int initialize __P ((void));
+static int
+initialize ()
+{
+  heapsize = HEAP / BLOCKSIZE;
+  _heapinfo = (malloc_info *) align (heapsize * sizeof (malloc_info));
+  if (_heapinfo == NULL)
+    return 0;
+  memset (_heapinfo, 0, heapsize * sizeof (malloc_info));
+  _heapinfo[0].free.size = 0;
+  _heapinfo[0].free.next = _heapinfo[0].free.prev = 0;
+  _heapindex = 0;
+  _heapbase = (char *) _heapinfo;
+
+  /* Account for the _heapinfo block itself in the statistics.  */
+  _bytes_used = heapsize * sizeof (malloc_info);
+  _chunks_used = 1;
+
+  __malloc_initialized = 1;
+  return 1;
+}
+
+/* Get neatly aligned memory, initializing or
+   growing the heap info table as necessary. */
+static __ptr_t morecore __P ((size_t));
+static __ptr_t
+morecore (size)
+     size_t size;
+{
+  __ptr_t result;
+  malloc_info *newinfo, *oldinfo;
+  size_t newsize;
+
+  result = align (size);
+  if (result == NULL)
+    return NULL;
+
+  /* Check if we need to grow the info table.  */
+  if ((size_t) BLOCK ((char *) result + size) > heapsize)
+    {
+      newsize = heapsize;
+      while ((size_t) BLOCK ((char *) result + size) > newsize)
+	newsize *= 2;
+      newinfo = (malloc_info *) align (newsize * sizeof (malloc_info));
+      if (newinfo == NULL)
+	{
+	  (*__morecore) (-size);
+	  return NULL;
+	}
+      memcpy (newinfo, _heapinfo, heapsize * sizeof (malloc_info));
+      memset (&newinfo[heapsize], 0,
+	      (newsize - heapsize) * sizeof (malloc_info));
+      oldinfo = _heapinfo;
+      newinfo[BLOCK (oldinfo)].busy.type = 0;
+      newinfo[BLOCK (oldinfo)].busy.info.size
+	= BLOCKIFY (heapsize * sizeof (malloc_info));
+      _heapinfo = newinfo;
+      /* Account for the _heapinfo block itself in the statistics.  */
+      _bytes_used += newsize * sizeof (malloc_info);
+      ++_chunks_used;
+      _free_internal (oldinfo);
+      heapsize = newsize;
+    }
+
+  _heaplimit = BLOCK ((char *) result + size);
+  return result;
+}
+
+/* Allocate memory from the heap.  */
+__ptr_t
+malloc (size)
+     size_t size;
+{
+  __ptr_t result;
+  size_t block, blocks, lastblocks, start;
+  register size_t i;
+  struct list *next;
+
+  /* ANSI C allows `malloc (0)' to either return NULL, or to return a
+     valid address you can realloc and free (though not dereference).
+
+     It turns out that some extant code (sunrpc, at least Ultrix's version)
+     expects `malloc (0)' to return non-NULL and breaks otherwise.
+     Be compatible.  */
+
+#if	0
+  if (size == 0)
+    return NULL;
+#endif
+
+  if (__malloc_hook != NULL)
+    return (*__malloc_hook) (size);
+
+  if (!__malloc_initialized)
+    if (!initialize ())
+      return NULL;
+
+  if (size < sizeof (struct list))
+      size = sizeof (struct list);
+
+#ifdef SUNOS_LOCALTIME_BUG
+  if (size < 16)
+    size = 16;
+#endif
+
+  /* Determine the allocation policy based on the request size.  */
+  if (size <= BLOCKSIZE / 2)
+    {
+      /* Small allocation to receive a fragment of a block.
+	 Determine the logarithm to base two of the fragment size. */
+      register size_t log = 1;
+      --size;
+      while ((size /= 2) != 0)
+	++log;
+
+      /* Look in the fragment lists for a
+	 free fragment of the desired size. */
+      next = _fraghead[log].next;
+      if (next != NULL)
+	{
+	  /* There are free fragments of this size.
+	     Pop a fragment out of the fragment list and return it.
+	     Update the block's nfree and first counters. */
+	  result = (__ptr_t) next;
+	  next->prev->next = next->next;
+	  if (next->next != NULL)
+	    next->next->prev = next->prev;
+	  block = BLOCK (result);
+	  if (--_heapinfo[block].busy.info.frag.nfree != 0)
+	    _heapinfo[block].busy.info.frag.first = (unsigned long int)
+	      ((unsigned long int) ((char *) next->next - (char *) NULL)
+	       % BLOCKSIZE) >> log;
+
+	  /* Update the statistics.  */
+	  ++_chunks_used;
+	  _bytes_used += 1 << log;
+	  --_chunks_free;
+	  _bytes_free -= 1 << log;
+	}
+      else
+	{
+	  /* No free fragments of the desired size, so get a new block
+	     and break it into fragments, returning the first.  */
+	  result = malloc (BLOCKSIZE);
+	  if (result == NULL)
+	    return NULL;
+
+	  /* Link all fragments but the first into the free list.  */
+	  for (i = 1; i < (size_t) (BLOCKSIZE >> log); ++i)
+	    {
+	      next = (struct list *) ((char *) result + (i << log));
+	      next->next = _fraghead[log].next;
+	      next->prev = &_fraghead[log];
+	      next->prev->next = next;
+	      if (next->next != NULL)
+		next->next->prev = next;
+	    }
+
+	  /* Initialize the nfree and first counters for this block.  */
+	  block = BLOCK (result);
+	  _heapinfo[block].busy.type = log;
+	  _heapinfo[block].busy.info.frag.nfree = i - 1;
+	  _heapinfo[block].busy.info.frag.first = i - 1;
+
+	  _chunks_free += (BLOCKSIZE >> log) - 1;
+	  _bytes_free += BLOCKSIZE - (1 << log);
+	  _bytes_used -= BLOCKSIZE - (1 << log);
+	}
+    }
+  else
+    {
+      /* Large allocation to receive one or more blocks.
+	 Search the free list in a circle starting at the last place visited.
+	 If we loop completely around without finding a large enough
+	 space we will have to get more memory from the system.  */
+      blocks = BLOCKIFY (size);
+      start = block = _heapindex;
+      while (_heapinfo[block].free.size < blocks)
+	{
+	  block = _heapinfo[block].free.next;
+	  if (block == start)
+	    {
+	      /* Need to get more from the system.  Check to see if
+		 the new core will be contiguous with the final free
+		 block; if so we don't need to get as much.  */
+	      block = _heapinfo[0].free.prev;
+	      lastblocks = _heapinfo[block].free.size;
+	      if (_heaplimit != 0 && block + lastblocks == _heaplimit &&
+		  (*__morecore) (0) == ADDRESS (block + lastblocks) &&
+		  (morecore ((blocks - lastblocks) * BLOCKSIZE)) != NULL)
+		{
+ 		  /* Which block we are extending (the `final free
+ 		     block' referred to above) might have changed, if
+ 		     it got combined with a freed info table.  */
+ 		  block = _heapinfo[0].free.prev;
+  		  _heapinfo[block].free.size += (blocks - lastblocks);
+		  _bytes_free += (blocks - lastblocks) * BLOCKSIZE;
+		  continue;
+		}
+	      result = morecore (blocks * BLOCKSIZE);
+	      if (result == NULL)
+		return NULL;
+	      block = BLOCK (result);
+	      _heapinfo[block].busy.type = 0;
+	      _heapinfo[block].busy.info.size = blocks;
+	      ++_chunks_used;
+	      _bytes_used += blocks * BLOCKSIZE;
+	      return result;
+	    }
+	}
+
+      /* At this point we have found a suitable free list entry.
+	 Figure out how to remove what we need from the list. */
+      result = ADDRESS (block);
+      if (_heapinfo[block].free.size > blocks)
+	{
+	  /* The block we found has a bit left over,
+	     so relink the tail end back into the free list. */
+	  _heapinfo[block + blocks].free.size
+	    = _heapinfo[block].free.size - blocks;
+	  _heapinfo[block + blocks].free.next
+	    = _heapinfo[block].free.next;
+	  _heapinfo[block + blocks].free.prev
+	    = _heapinfo[block].free.prev;
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapindex = block + blocks;
+	}
+      else
+	{
+	  /* The block exactly matches our requirements,
+	     so just remove it from the list. */
+	  _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapinfo[block].free.prev;
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapindex = _heapinfo[block].free.next;
+	  --_chunks_free;
+	}
+
+      _heapinfo[block].busy.type = 0;
+      _heapinfo[block].busy.info.size = blocks;
+      ++_chunks_used;
+      _bytes_used += blocks * BLOCKSIZE;
+      _bytes_free -= blocks * BLOCKSIZE;
+    }
+
+  return result;
+}
+
+
+#ifndef _LIBC
+
+/* On some ANSI C systems, some libc functions call _malloc, _free
+   and _realloc.  Make them use the GNU functions.  */
+
+__ptr_t
+_malloc (size)
+     size_t size;
+{
+  return malloc (size);
+}
+
+void
+_free (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+
+__ptr_t
+_realloc (ptr, size)
+     __ptr_t ptr;
+     size_t size;
+{
+  return realloc (ptr, size);
+}
+
+#endif
+/* Free a block of memory allocated by `malloc'.
+   Copyright 1990, 1991, 1992 Free Software Foundation
+		  Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* Debugging hook for free.  */
+void (*__free_hook) __P ((__ptr_t __ptr));
+
+/* List of blocks allocated by memalign.  */
+struct alignlist *_aligned_blocks = NULL;
+
+/* Return memory to the heap.
+   Like `free' but don't call a __free_hook if there is one.  */
+void
+_free_internal (ptr)
+     __ptr_t ptr;
+{
+  int type;
+  size_t block, blocks;
+  register size_t i;
+  struct list *prev, *next;
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Get as many statistics as early as we can.  */
+      --_chunks_used;
+      _bytes_used -= _heapinfo[block].busy.info.size * BLOCKSIZE;
+      _bytes_free += _heapinfo[block].busy.info.size * BLOCKSIZE;
+
+      /* Find the free cluster previous to this one in the free list.
+	 Start searching at the last block referenced; this may benefit
+	 programs with locality of allocation.  */
+      i = _heapindex;
+      if (i > block)
+	while (i > block)
+	  i = _heapinfo[i].free.prev;
+      else
+	{
+	  do
+	    i = _heapinfo[i].free.next;
+	  while (i > 0 && i < block);
+	  i = _heapinfo[i].free.prev;
+	}
+
+      /* Determine how to link this block into the free list.  */
+      if (block == i + _heapinfo[i].free.size)
+	{
+	  /* Coalesce this block with its predecessor.  */
+	  _heapinfo[i].free.size += _heapinfo[block].busy.info.size;
+	  block = i;
+	}
+      else
+	{
+	  /* Really link this block back into the free list.  */
+	  _heapinfo[block].free.size = _heapinfo[block].busy.info.size;
+	  _heapinfo[block].free.next = _heapinfo[i].free.next;
+	  _heapinfo[block].free.prev = i;
+	  _heapinfo[i].free.next = block;
+	  _heapinfo[_heapinfo[block].free.next].free.prev = block;
+	  ++_chunks_free;
+	}
+
+      /* Now that the block is linked in, see if we can coalesce it
+	 with its successor (by deleting its successor from the list
+	 and adding in its size).  */
+      if (block + _heapinfo[block].free.size == _heapinfo[block].free.next)
+	{
+	  _heapinfo[block].free.size
+	    += _heapinfo[_heapinfo[block].free.next].free.size;
+	  _heapinfo[block].free.next
+	    = _heapinfo[_heapinfo[block].free.next].free.next;
+	  _heapinfo[_heapinfo[block].free.next].free.prev = block;
+	  --_chunks_free;
+	}
+
+      /* Now see if we can return stuff to the system.  */
+      blocks = _heapinfo[block].free.size;
+      if (blocks >= FINAL_FREE_BLOCKS && block + blocks == _heaplimit
+	  && (*__morecore) (0) == ADDRESS (block + blocks))
+	{
+	  register size_t bytes = blocks * BLOCKSIZE;
+	  _heaplimit -= blocks;
+	  (*__morecore) (-bytes);
+	  _heapinfo[_heapinfo[block].free.prev].free.next
+	    = _heapinfo[block].free.next;
+	  _heapinfo[_heapinfo[block].free.next].free.prev
+	    = _heapinfo[block].free.prev;
+	  block = _heapinfo[block].free.prev;
+	  --_chunks_free;
+	  _bytes_free -= bytes;
+	}
+
+      /* Set the next search to begin at this block.  */
+      _heapindex = block;
+      break;
+
+    default:
+      /* Do some of the statistics.  */
+      --_chunks_used;
+      _bytes_used -= 1 << type;
+      ++_chunks_free;
+      _bytes_free += 1 << type;
+
+      /* Get the address of the first free fragment in this block.  */
+      prev = (struct list *) ((char *) ADDRESS (block) +
+			   (_heapinfo[block].busy.info.frag.first << type));
+
+      if (_heapinfo[block].busy.info.frag.nfree == (BLOCKSIZE >> type) - 1)
+	{
+	  /* If all fragments of this block are free, remove them
+	     from the fragment list and free the whole block.  */
+	  next = prev;
+	  for (i = 1; i < (size_t) (BLOCKSIZE >> type); ++i)
+	    next = next->next;
+	  prev->prev->next = next;
+	  if (next != NULL)
+	    next->prev = prev->prev;
+	  _heapinfo[block].busy.type = 0;
+	  _heapinfo[block].busy.info.size = 1;
+
+	  /* Keep the statistics accurate.  */
+	  ++_chunks_used;
+	  _bytes_used += BLOCKSIZE;
+	  _chunks_free -= BLOCKSIZE >> type;
+	  _bytes_free -= BLOCKSIZE;
+
+	  free (ADDRESS (block));
+	}
+      else if (_heapinfo[block].busy.info.frag.nfree != 0)
+	{
+	  /* If some fragments of this block are free, link this
+	     fragment into the fragment list after the first free
+	     fragment of this block. */
+	  next = (struct list *) ptr;
+	  next->next = prev->next;
+	  next->prev = prev;
+	  prev->next = next;
+	  if (next->next != NULL)
+	    next->next->prev = next;
+	  ++_heapinfo[block].busy.info.frag.nfree;
+	}
+      else
+	{
+	  /* No fragments of this block are free, so link this
+	     fragment into the fragment list and announce that
+	     it is the first free fragment of this block. */
+	  prev = (struct list *) ptr;
+	  _heapinfo[block].busy.info.frag.nfree = 1;
+	  _heapinfo[block].busy.info.frag.first = (unsigned long int)
+	    ((unsigned long int) ((char *) ptr - (char *) NULL)
+	     % BLOCKSIZE >> type);
+	  prev->next = _fraghead[type].next;
+	  prev->prev = &_fraghead[type];
+	  prev->prev->next = prev;
+	  if (prev->next != NULL)
+	    prev->next->prev = prev;
+	}
+      break;
+    }
+}
+
+/* Return memory to the heap.  */
+void
+free (ptr)
+     __ptr_t ptr;
+{
+  register struct alignlist *l;
+
+  if (ptr == NULL)
+    return;
+
+  for (l = _aligned_blocks; l != NULL; l = l->next)
+    if (l->aligned == ptr)
+      {
+	l->aligned = NULL;	/* Mark the slot in the list as free.  */
+	ptr = l->exact;
+	break;
+      }
+
+  if (__free_hook != NULL)
+    (*__free_hook) (ptr);
+  else
+    _free_internal (ptr);
+}
+/* Copyright (C) 1991, 1993, 1994 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C 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.
+
+The GNU C 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 the GNU C Library; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#ifdef _LIBC
+
+#include <ansidecl.h>
+#include <gnu-stabs.h>
+
+#undef	cfree
+
+function_alias(cfree, free, void, (ptr),
+	       DEFUN(cfree, (ptr), PTR ptr))
+
+#else
+
+void
+cfree (ptr)
+     __ptr_t ptr;
+{
+  free (ptr);
+}
+
+#endif
+/* Change the size of a block allocated by `malloc'.
+   Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+		     Written May 1989 by Mike Haertel.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#if  (defined (MEMMOVE_MISSING) || \
+      !defined(_LIBC) && !defined(STDC_HEADERS) && !defined(USG))
+
+/* Snarfed directly from Emacs src/dispnew.c:
+   XXX Should use system bcopy if it handles overlap.  */
+#ifndef emacs
+
+/* Like bcopy except never gets confused by overlap.  */
+
+static void
+safe_bcopy (from, to, size)
+     char *from, *to;
+     int size;
+{
+  if (size <= 0 || from == to)
+    return;
+
+  /* If the source and destination don't overlap, then bcopy can
+     handle it.  If they do overlap, but the destination is lower in
+     memory than the source, we'll assume bcopy can handle that.  */
+  if (to < from || from + size <= to)
+    bcopy (from, to, size);
+
+  /* Otherwise, we'll copy from the end.  */
+  else
+    {
+      register char *endf = from + size;
+      register char *endt = to + size;
+
+      /* If TO - FROM is large, then we should break the copy into
+	 nonoverlapping chunks of TO - FROM bytes each.  However, if
+	 TO - FROM is small, then the bcopy function call overhead
+	 makes this not worth it.  The crossover point could be about
+	 anywhere.  Since I don't think the obvious copy loop is too
+	 bad, I'm trying to err in its favor.  */
+      if (to - from < 64)
+	{
+	  do
+	    *--endt = *--endf;
+	  while (endf != from);
+	}
+      else
+	{
+	  for (;;)
+	    {
+	      endt -= (to - from);
+	      endf -= (to - from);
+
+	      if (endt < to)
+		break;
+
+	      bcopy (endf, endt, to - from);
+	    }
+
+	  /* If SIZE wasn't a multiple of TO - FROM, there will be a
+	     little left over.  The amount left over is
+	     (endt + (to - from)) - to, which is endt - from.  */
+	  bcopy (from, to, endt - from);
+	}
+    }
+}     
+#endif	/* Not emacs.  */
+
+#define memmove(to, from, size) safe_bcopy ((from), (to), (size))
+
+#endif
+
+
+#define min(A, B) ((A) < (B) ? (A) : (B))
+
+/* Debugging hook for realloc.  */
+__ptr_t (*__realloc_hook) __P ((__ptr_t __ptr, size_t __size));
+
+/* Resize the given region to the new size, returning a pointer
+   to the (possibly moved) region.  This is optimized for speed;
+   some benchmarks seem to indicate that greater compactness is
+   achieved by unconditionally allocating and copying to a
+   new region.  This module has incestuous knowledge of the
+   internals of both free and malloc. */
+__ptr_t
+realloc (ptr, size)
+     __ptr_t ptr;
+     size_t size;
+{
+  __ptr_t result;
+  int type;
+  size_t block, blocks, oldlimit;
+
+  if (size == 0)
+    {
+      free (ptr);
+      return malloc (0);
+    }
+  else if (ptr == NULL)
+    return malloc (size);
+
+  if (__realloc_hook != NULL)
+    return (*__realloc_hook) (ptr, size);
+
+  block = BLOCK (ptr);
+
+  type = _heapinfo[block].busy.type;
+  switch (type)
+    {
+    case 0:
+      /* Maybe reallocate a large block to a small fragment.  */
+      if (size <= BLOCKSIZE / 2)
+	{
+	  result = malloc (size);
+	  if (result != NULL)
+	    {
+	      memcpy (result, ptr, size);
+	      _free_internal (ptr);
+	      return result;
+	    }
+	}
+
+      /* The new size is a large allocation as well;
+	 see if we can hold it in place. */
+      blocks = BLOCKIFY (size);
+      if (blocks < _heapinfo[block].busy.info.size)
+	{
+	  /* The new size is smaller; return
+	     excess memory to the free list. */
+	  _heapinfo[block + blocks].busy.type = 0;
+	  _heapinfo[block + blocks].busy.info.size
+	    = _heapinfo[block].busy.info.size - blocks;
+	  _heapinfo[block].busy.info.size = blocks;
+	  /* We have just created a new chunk by splitting a chunk in two.
+	     Now we will free this chunk; increment the statistics counter
+	     so it doesn't become wrong when _free_internal decrements it.  */
+	  ++_chunks_used;
+	  _free_internal (ADDRESS (block + blocks));
+	  result = ptr;
+	}
+      else if (blocks == _heapinfo[block].busy.info.size)
+	/* No size change necessary.  */
+	result = ptr;
+      else
+	{
+	  /* Won't fit, so allocate a new region that will.
+	     Free the old region first in case there is sufficient
+	     adjacent free space to grow without moving. */
+	  blocks = _heapinfo[block].busy.info.size;
+	  /* Prevent free from actually returning memory to the system.  */
+	  oldlimit = _heaplimit;
+	  _heaplimit = 0;
+	  _free_internal (ptr);
+	  _heaplimit = oldlimit;
+	  result = malloc (size);
+	  if (result == NULL)
+	    {
+	      /* Now we're really in trouble.  We have to unfree
+		 the thing we just freed.  Unfortunately it might
+		 have been coalesced with its neighbors.  */
+	      if (_heapindex == block)
+	        (void) malloc (blocks * BLOCKSIZE);
+	      else
+		{
+		  __ptr_t previous = malloc ((block - _heapindex) * BLOCKSIZE);
+		  (void) malloc (blocks * BLOCKSIZE);
+		  _free_internal (previous);
+		}
+	      return NULL;
+	    }
+	  if (ptr != result)
+	    memmove (result, ptr, blocks * BLOCKSIZE);
+	}
+      break;
+
+    default:
+      /* Old size is a fragment; type is logarithm
+	 to base two of the fragment size.  */
+      if (size > (size_t) (1 << (type - 1)) && size <= (size_t) (1 << type))
+	/* The new size is the same kind of fragment.  */
+	result = ptr;
+      else
+	{
+	  /* The new size is different; allocate a new space,
+	     and copy the lesser of the new size and the old. */
+	  result = malloc (size);
+	  if (result == NULL)
+	    return NULL;
+	  memcpy (result, ptr, min (size, (size_t) 1 << type));
+	  free (ptr);
+	}
+      break;
+    }
+
+  return result;
+}
+/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.
+
+   The author may be reached (Email) at the address mike@ai.mit.edu,
+   or (US mail) as Mike Haertel c/o Free Software Foundation.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+/* Allocate an array of NMEMB elements each SIZE bytes long.
+   The entire array is initialized to zeros.  */
+__ptr_t
+calloc (nmemb, size)
+     register size_t nmemb;
+     register size_t size;
+{
+  register __ptr_t result = malloc (nmemb * size);
+
+  if (result != NULL)
+    (void) memset (result, 0, nmemb * size);
+
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+This file is part of the GNU C Library.
+
+The GNU C Library 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.
+
+The GNU C 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 General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with the GNU C Library; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define	_MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+#ifndef	__GNU_LIBRARY__
+#define	__sbrk	sbrk
+#endif
+
+#ifdef __GNU_LIBRARY__
+/* It is best not to declare this and cast its result on foreign operating
+   systems with potentially hostile include files.  */
+extern __ptr_t __sbrk __P ((int increment));
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* Allocate INCREMENT more bytes of data space,
+   and return the start of data space, or NULL on errors.
+   If INCREMENT is negative, shrink data space.  */
+__ptr_t
+__default_morecore (increment)
+     ptrdiff_t increment;
+{
+  __ptr_t result = (__ptr_t) __sbrk ((int) increment);
+  if (result == (__ptr_t) -1)
+    return NULL;
+  return result;
+}
+/* Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
+
+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; see the file COPYING.LIB.  If
+not, write to the Free Software Foundation, Inc., 675 Mass Ave,
+Cambridge, MA 02139, USA.  */
+
+#ifndef	_MALLOC_INTERNAL
+#define _MALLOC_INTERNAL
+#include <malloc.h>
+#endif
+
+__ptr_t
+memalign (alignment, size)
+     size_t alignment;
+     size_t size;
+{
+  __ptr_t result;
+  unsigned long int adj;
+
+  size = ((size + alignment - 1) / alignment) * alignment;
+
+  result = malloc (size);
+  if (result == NULL)
+    return NULL;
+  adj = (unsigned long int) ((unsigned long int) ((char *) result -
+						  (char *) NULL)) % alignment;
+  if (adj != 0)
+    {
+      struct alignlist *l;
+      for (l = _aligned_blocks; l != NULL; l = l->next)
+	if (l->aligned == NULL)
+	  /* This slot is free.  Use it.  */
+	  break;
+      if (l == NULL)
+	{
+	  l = (struct alignlist *) malloc (sizeof (struct alignlist));
+	  if (l == NULL)
+	    {
+	      free (result);
+	      return NULL;
+	    }
+	  l->next = _aligned_blocks;
+	  _aligned_blocks = l;
+	}
+      l->exact = result;
+      result = l->aligned = (char *) result + alignment - adj;
+    }
+
+  return result;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/huffman.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/huffman.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/huffman.cpp	(revision 21083)
@@ -0,0 +1,385 @@
+/**************************************************************************
+ *
+ * huffman.c -- Huffman coding functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "huffman.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+/* ->data on success,  
+   NULL on error 
+ */
+huff_data *
+Generate_Huffman_Data (int num, long *freqs, huff_data * data,
+		       u_long * mem)
+{
+  int HNum, i, count;
+  unsigned long *heap;
+  huff_data *hd = data;
+  if (!hd)
+    {
+      if (!(hd = new huff_data))
+	goto error0;
+    }
+  if (!(heap = new unsigned long[num * 2]))
+    goto error1;
+  if (!(hd->clens = new char[num]))
+      goto error2;
+  hd->num_codes = num;
+  if (mem)
+    {
+      if (hd != data)
+	*mem += sizeof (huff_data);
+      *mem += num * sizeof (char);
+    }
+  memcpy (&heap[num], freqs, num * sizeof (*heap));
+  memset (heap, '\0', num * sizeof (*heap));
+
+  /* Initialise the pointers to the leaves */
+  for (count = i = 0; i < num; i++)
+    if (heap[num + i])
+      heap[count++] = num + i;
+
+  /* Reorganise the pointers so that it is a heap */
+  HNum = count;
+  for (i = HNum / 2; i > 0; i--)
+    {
+      register int curr, child;
+      curr = i;
+      child = curr * 2;
+      while (child <= HNum)
+	{
+	  if (child < HNum && heap[heap[child]] < heap[heap[child - 1]])
+	    child++;
+	  if (heap[heap[curr - 1]] > heap[heap[child - 1]])
+	    {
+	      register u_long temp;
+	      temp = heap[child - 1];
+	      heap[child - 1] = heap[curr - 1];
+	      heap[curr - 1] = temp;
+	      curr = child;
+	      child = 2 * curr;
+	    }
+	  else
+	    break;
+	}
+    }
+
+
+  /* Form the huffman tree */
+  while (HNum > 1)
+    {
+      int pos[2];
+
+      for (i = 0; i < 2; i++)
+	{
+	  register int curr, child;
+	  pos[i] = heap[0];
+	  heap[0] = heap[--HNum];
+	  curr = 1;
+	  child = 2;
+	  while (child <= HNum)
+	    {
+	      if (child < HNum &&
+		  heap[heap[child]] < heap[heap[child - 1]])
+		child++;
+	      if (heap[heap[curr - 1]] > heap[heap[child - 1]])
+		{
+		  register int temp;
+		  temp = heap[child - 1];
+		  heap[child - 1] = heap[curr - 1];
+		  heap[curr - 1] = temp;
+		  curr = child;
+		  child = 2 * curr;
+		}
+	      else
+		break;
+	    }
+	}
+
+      heap[HNum + 1] = heap[pos[0]] + heap[pos[1]];
+      heap[pos[0]] = heap[pos[1]] = HNum + 1;
+
+      heap[HNum] = HNum + 1;
+
+      {
+	register int parent, curr;
+	HNum++;
+	curr = HNum;
+	parent = curr >> 1;
+	while (parent && heap[heap[parent - 1]] > heap[heap[curr - 1]])
+	  {
+	    register int temp;
+	    temp = heap[parent - 1];
+	    heap[parent - 1] = heap[curr - 1];
+	    heap[curr - 1] = temp;
+	    curr = parent;
+	    parent = curr >> 1;
+	  }
+      }
+    }
+
+
+  /* Calculate the code lens */
+  heap[0] = -1UL;
+  heap[1] = 0;
+  for (i = 2; i < num * 2; i++)
+    heap[i] = heap[heap[i]] + 1;
+
+  /* zero the lencount's array */
+  memset (hd->lencount, '\0', sizeof (hd->lencount));
+  hd->maxcodelen = 0;
+  hd->mincodelen = 100;
+
+  /* Set the code length of each leaf in the huffman tree */
+  for (i = 0; i < num; i++)
+    {
+      register u_long codelen = heap[i + num];
+      hd->clens[i] = (char) codelen;
+      if (!codelen)
+	continue;
+      if (codelen > hd->maxcodelen)
+	hd->maxcodelen = codelen;
+      if (codelen < hd->mincodelen)
+	hd->mincodelen = codelen;
+      hd->lencount[codelen]++;
+    }
+
+
+  if (hd->maxcodelen == 0 && hd->mincodelen == 100)
+    {
+      hd->num_codes = 0;
+    }
+  else
+    {
+      /* Calculate the current codes for each different code length */
+      hd->min_code[hd->maxcodelen] = 0;
+      for (i = hd->maxcodelen - 1; i>=0; i--)
+	hd->min_code[i] = (hd->min_code[i + 1] + hd->lencount[i + 1]) >> 1;
+    }
+  delete heap;
+  return (hd);
+
+error2:
+  delete heap;
+error1:
+  if (!data)
+    delete hd;
+error0:
+  return (NULL);
+
+}
+
+unsigned long *
+Generate_Huffman_Codes (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *codes;
+  unsigned long mc[MAX_HUFFCODE_LEN + 1];
+
+  if (!data)
+    return (NULL);
+  if (!(codes = new unsigned long[data->num_codes]))
+    return (NULL);
+  if (mem)
+    *mem += data->num_codes * sizeof (*codes);
+  memcpy (mc, data->min_code, sizeof (mc));
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      codes[i] = mc[(int) (data->clens[i])]++;
+
+  return (codes);
+}
+
+
+unsigned long **
+Generate_Huffman_Vals (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *fcode[MAX_HUFFCODE_LEN + 1];
+  unsigned long **values;
+  unsigned long *vals;
+
+  if (!data)
+    return (NULL);
+  if (!(vals = new unsigned long[data->num_codes]))
+    return (NULL);
+  if (!(values = new unsigned long *[MAX_HUFFCODE_LEN + 1]))
+    {
+      delete vals;
+      return (NULL);
+    }
+
+  memset (values, '\0', (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *));
+
+  if (mem)
+    *mem += data->num_codes * sizeof (*vals) +
+      (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+  fcode[0] = values[0] = &vals[0];
+  for (i = 1; i <= data->maxcodelen; i++)
+    fcode[i] = values[i] = &vals[(values[i - 1] - vals) + data->lencount[i - 1]];
+
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      *fcode[(int) (data->clens[i])]++ = i;
+  return (values);
+}
+
+
+
+double 
+Calculate_Huffman_Size (int num, long *freqs, long *counts)
+{
+  double size = 0;
+  huff_data hd;
+  int i;
+  if (!Generate_Huffman_Data (num, freqs, &hd, NULL))
+    return -1;
+  for (i = 0; i < num; i++)
+    size += counts[i] * hd.clens[i];
+  delete hd.clens;
+  return size;
+}
+
+
+
+int 
+Write_Huffman_Data (FILE * f, huff_data * hd)
+{
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONSI(hd->num_codes);
+  HTONSI(hd->mincodelen);
+  HTONSI(hd->maxcodelen);
+
+  if (fwrite (&hd->num_codes, sizeof (hd->num_codes), 1, f) != 1)
+    return -1;
+
+  if (fwrite (&hd->mincodelen, sizeof (hd->mincodelen), 1, f) != 1)
+    return -1;
+
+  if (fwrite (&hd->maxcodelen, sizeof (hd->maxcodelen), 1, f) != 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(hd->num_codes);
+  NTOHSI(hd->mincodelen);
+  NTOHSI(hd->maxcodelen);
+
+  if (hd->num_codes)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int i;
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	HTONSI(hd->lencount[i]);
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	HTONUL(hd->min_code[i]);
+
+      if (fwrite (hd->lencount + hd->mincodelen, sizeof (*hd->lencount),
+		  hd->maxcodelen - hd->mincodelen + 1, f) !=
+	  hd->maxcodelen - hd->mincodelen + 1)
+	return -1;
+
+      if (fwrite (hd->min_code, sizeof (*hd->min_code), hd->maxcodelen + 1, f) !=
+	  hd->maxcodelen + 1)
+	return -1;
+
+      if (fwrite (hd->clens, sizeof (*hd->clens), hd->num_codes, f) != hd->num_codes)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	NTOHSI(hd->lencount[i]);
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	NTOHUL(hd->min_code[i]);
+    }
+  return 0;
+}
+
+
+
+int Read_Huffman_Data (FILE * f, huff_data * hd, u_long * mem, u_long * disk) {
+  if (fread (&hd->num_codes, sizeof (hd->num_codes), 1, f) != 1)
+    return -1;
+
+  if (fread (&hd->mincodelen, sizeof (hd->mincodelen), 1, f) != 1)
+    return -1;
+
+  if (fread (&hd->maxcodelen, sizeof (hd->maxcodelen), 1, f) != 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(hd->num_codes);
+  NTOHSI(hd->mincodelen);
+  NTOHSI(hd->maxcodelen);
+
+  if (disk)
+    (*disk) += sizeof (hd->num_codes) + sizeof (hd->mincodelen) +
+      sizeof (hd->maxcodelen);
+
+  hd->clens = NULL;
+
+  if (hd->num_codes)
+    {
+      int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+      memset (hd->lencount, '\0', sizeof (hd->lencount));
+      if (fread (hd->lencount + hd->mincodelen, sizeof (*hd->lencount),
+	      hd->maxcodelen - hd->mincodelen + 1, f) !=
+	  hd->maxcodelen - hd->mincodelen + 1)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+	NTOHSI(hd->lencount[i]);
+
+      if (disk)
+	(*disk) += sizeof (*hd->lencount) * (hd->maxcodelen - hd->mincodelen + 1);
+
+      memset (hd->min_code, '\0', sizeof (hd->min_code));
+
+      if (fread (hd->min_code, sizeof (*hd->min_code), hd->maxcodelen + 1, f) !=
+	  hd->maxcodelen + 1)
+	return -1;
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (i = 0; i < hd->maxcodelen + 1; i++)
+	NTOHUL(hd->min_code[i]);
+
+      if (disk)
+	(*disk) += sizeof (*hd->min_code) * (hd->maxcodelen + 1);
+
+      if (!(hd->clens = new char[hd->num_codes]))
+	return -1;
+
+
+      if (fread (hd->clens, sizeof (*hd->clens), hd->num_codes, f) != hd->num_codes)
+	return -1;
+
+      if (disk)
+	(*disk) += sizeof (*hd->clens) * hd->num_codes;
+    }
+
+  if (mem)
+    *mem += sizeof (*hd->clens) * hd->num_codes;
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/huffman.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/huffman.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/huffman.h	(revision 21083)
@@ -0,0 +1,57 @@
+/**************************************************************************
+ *
+ * huffman.h -- Huffman coding functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_HUFFMAN
+#define H_HUFFMAN
+
+#include "sysfuncs.h"
+#include "bitio_m_abstract.h"
+
+#define MAX_HUFFCODE_LEN 31
+
+struct huff_data {
+  int num_codes;
+  int mincodelen;
+  int maxcodelen;
+  int lencount[MAX_HUFFCODE_LEN + 1];
+  unsigned long min_code[MAX_HUFFCODE_LEN + 1];
+  char *clens;
+};
+
+
+huff_data *Generate_Huffman_Data (int num, long *freqs, huff_data * data,
+				  u_long * mem);
+
+unsigned long *Generate_Huffman_Codes (huff_data * data, u_long * mem);
+
+unsigned long **Generate_Huffman_Vals (huff_data * data, u_long * mem);
+
+int Write_Huffman_Data (FILE * f, huff_data * hd);
+
+int Read_Huffman_Data (FILE * f, huff_data * hd, u_long * mem, u_long * disk);
+
+/* Calculate the number of bits required to code the data with the
+   specified frequencies. Normally freqs and counts should point to
+   the same array. */
+double Calculate_Huffman_Size (int num, long *freqs, long *counts);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.cpp	(revision 21083)
@@ -0,0 +1,411 @@
+/**************************************************************************
+ *
+ * local_strings -- provides some extra string routines
+ * Copyright (C) 1994  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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "local_strings.h"
+#include "memlib.h"
+
+/* =========================================================================
+ * Function: arg_atoi
+ * Description: 
+ *      Converts an ascii string to an integer
+ *      but allows a scale string immediately following.
+ *      i.e. "10Mb" or "20Kb" or "40Megabytes"
+ *      There must be no gap between the last digit and the scale.
+ *      Only the fist letter is significant.
+ *      K = Kilo
+ *      M = Mega
+ *      G = Giga
+ * Input: 
+ *      string of form: xxxxxxK or xxxxxxxM or xxxxxxxG
+ *      where x is a digit
+ * Output: 
+ *      a scaled integer
+ * ========================================================================= */
+
+#define KILO 	1024
+#define MEGA	1024*1024
+#define GIGA	1024*1024*1024
+
+int 
+arg_atoi (char *str)
+{
+  char *str_ptr = str;
+  char ch = '\0';
+  long scale = 1;
+
+  /* find any scale letter immediately after digits */
+  ch = *str_ptr;
+  while (!isalpha (ch) && (ch != '\0'))
+    ch = *str_ptr++;
+
+  /* replace scale letter by end-of-string character */
+  *str_ptr = '\0';
+
+  /* set scale appropriately */
+  switch (ch)
+    {
+    case 'K':
+      scale = KILO;
+      break;
+    case 'M':
+      scale = MEGA;
+      break;
+    case 'G':
+      scale = GIGA;
+      break;
+    default:
+      scale = 1;
+      break;
+    }
+
+  return (atoi (str) * scale);
+
+}
+
+/* ===============================================================================
+ * Function: compare
+ * Description: Compare two strings. 
+ * Input: Two binary strings, first byte of string indicates length. 
+ * Output: Like standard strcmp.
+ *      = 0 if s1 = s2
+ *      < 0 if s1 < s2
+ *      > 0 if s1 > s2
+ * =============================================================================== */
+int 
+compare (u_char * s1, u_char * s2)
+{
+  int l1 = *s1, l2 = *s2;
+  int l = (l1 < l2) ? l1 : l2;
+
+  while (l--)
+    if (*++s1 != *++s2)
+      return (*s1 - *s2);
+  return (l1 - l2);
+
+}
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char casecharmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+/* ===============================================================================
+ * Function: casecompare   [RPAP - Jan 97: Stem Index Change]
+ * Description: Compare two strings in dictionary order
+ * Input: Two binary strings, first byte of string indicates length. 
+ * Output:
+ *      = 0 if s1 = s2
+ *      < 0 if s1 < s2
+ *      > 0 if s1 > s2
+ * =============================================================================== */
+int 
+casecompare (u_char * s1, u_char * s2)
+{
+  int l1 = *s1, l2 = *s2;
+  int l = (l1 < l2) ? l1 : l2;
+  int pos = 0;
+  register int diff = 0;
+
+  while (l--)
+    if ((diff = casecharmap[*++s1] - casecharmap[*++s2]) != 0)
+      return (diff);
+    else if ((diff = *s1 - *s2) != 0)
+      if (!pos)
+	pos = diff;
+
+  return ((l1 - l2) ? (l1 - l2) : (pos));
+
+}
+
+/* =========================================================================
+ * Function: copy_string
+ * Description: 
+ *      Copies a string with the len in 1st byte
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+u_char *
+copy_string (u_char * src_str)
+{
+  u_char *copy = new u_char(src_str[0] + 1);
+
+  if (!copy)
+    return NULL;
+
+  memcpy (copy, src_str, src_str[0] + 1);
+  return copy;
+
+}
+
+
+/* ===============================================================================
+ * Function: prefixlen
+ * Description: Returns length of common prefix string between s1 and s2.
+ * Input: two binary strings
+ * Output: prefix length
+ * =============================================================================== */
+int 
+prefixlen (u_char * s1, u_char * s2)
+{
+  int l = (*s1 < *s2) ? *s1 : *s2;
+  int i = 0;
+
+  while (i < l && *++s1 == *++s2)
+    i++;
+  return (i);
+}
+
+
+/* ===============================================================================
+ * Function: char2str
+ * Description: 
+ *      Ensures that non-printable characters are converted to a string
+ *      which is printable i.e. it indentifies the character.
+ *      e.g. carriage-return = "\n".
+ * Input: character (may be non-printable)
+ * Output: pointer to static string
+ * =============================================================================== */
+
+char *
+char2str (u_char c)
+{
+  static char buf[10];
+  switch (c)
+    {
+    case '\n':
+      sprintf (buf, "\\n");
+      break;
+    case '\b':
+      sprintf (buf, "\\b");
+      break;
+    case '\f':
+      sprintf (buf, "\\f");
+      break;
+    case '\t':
+      sprintf (buf, "\\t");
+      break;
+    default:
+	if (c >= ' ' && c <= 126)
+	switch (c)
+	  {
+	  case '\\':
+	    sprintf (buf, "\\\\");
+	    break;
+	  case '\"':
+	    sprintf (buf, "\\\"");
+	    break;
+	  case '\'':
+	    sprintf (buf, "\\\'");
+	    break;
+	  default:
+	    buf[0] = c;
+	    buf[1] = '\0';
+	    break;
+	  }
+      else
+	sprintf (buf, "\\x%02x", c);
+      break;
+    }
+  return buf;
+}
+
+/* ===============================================================================
+ * Function: word2str
+ * Description: 
+ *      Converts a string with possible non-printable characters into a string
+ *      consisting entirely of printable characters.
+ * Input: string, length stored in first byte
+ * Output: pointer to static string
+ * =============================================================================== */
+
+char *
+word2str (u_char * s)
+{
+  static char buf[1024];
+  char *p = buf;
+  int i, len = (int) *s++;
+
+  memset (buf, '\0', sizeof(buf));
+  for (i = 0; i < len; i++)
+    {
+      strcpy (p, char2str (s[i]));
+      p = strchr (p, '\0');
+    }
+  return buf;
+}
+
+
+/* =========================================================================
+ * Function: de_escape_string
+ * Description: 
+ *      Turn a string containing \ escapes into real characters
+ *      Note this destroys the string s in the process
+ * Input: string to de-escape 
+ * Output: the de-escaped string
+ * ========================================================================= */
+char *
+de_escape_string (char *s)
+{
+  char *org = s;
+  char *d = s;
+  while (*s)
+    {
+      if (*s == '\\')
+	{
+	  s++;
+	  switch (*s++)
+	    {
+	    case '\0':
+	      *d++ = '\\';
+	      s--;
+	      break;
+	    case '\\':
+	      *d++ = '\\';
+	      break;
+	    case 'b':
+	      *d++ = '\b';
+	      break;
+	    case 'f':
+	      *d++ = '\f';
+	      break;
+	    case 'n':
+	      *d++ = '\n';
+	      break;
+	    case 'r':
+	      *d++ = '\r';
+	      break;
+	    case 't':
+	      *d++ = '\r';
+	      break;
+	    case '\"':
+	      *d++ = '\"';
+	      break;
+	    case '\'':
+	      *d++ = '\'';
+	      break;
+	    case 'x':
+	      {
+		int num = 0;
+		if (isxdigit (*s))
+		  {
+		    char ch = toupper (*s++);
+		    num = ch <= '9' ? ch - '0' : ch - 'A' + 10;
+		  }
+		if (isxdigit (*s))
+		  {
+		    char ch = toupper (*s++);
+		    num = (num << 4) + (ch <= '9' ? ch - '0' : ch - 'A' + 10);
+		  }
+		*d++ = num;
+		break;
+	      }
+	    case '0':
+	    case '1':
+	    case '2':
+	    case '3':
+	    case '4':
+	    case '5':
+	    case '6':
+	    case '7':
+	      {
+		int num = *(s - 1) - '0';
+		if (*s >= '0' && *s <= '7')
+		  num = (num << 3) + *s++ - '0';
+		if (*s >= '0' && *s <= '7')
+		  num = (num << 3) + *s++ - '0';
+		*d++ = num;
+		break;
+	      }
+	    }
+	}
+      else
+	*d++ = *s++;
+    }
+  *d = '\0';
+  return (org);
+}
+
+/* =========================================================================
+ * Function: str255_to_string 
+ * Description: 
+ * Input: 
+ * Output: 
+ * ========================================================================= */
+
+char *
+str255_to_string (u_char * str255, char *str)
+{
+  static char buf[256];
+  char *str_base = NULL;
+  int len = *str255++;
+  int i = 0;
+
+  /* if haven't been given a str to write to then use local buffer */
+  if (!str)
+    str = &(buf[0]);
+
+  str_base = str;
+  for (i = 0; i < len; i++)
+    {
+      *str++ = *str255++;
+    }
+  *str = '\0';
+
+  return str_base;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/local_strings.h	(revision 21083)
@@ -0,0 +1,79 @@
+/**************************************************************************
+ *
+ * local_strings.h -- string routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef LOCAL_STRINGS_H
+#define LOCAL_STRINGS_H
+
+#include "sysfuncs.h"
+
+class mgString
+{
+  u_char *data;
+ public:
+  inline int length()
+    {
+      return data[0];
+    }
+  inline u_char *rawdata()
+    {
+      return data;
+    }
+  inline void read(u_char **base)
+    {
+      unsigned int copy, suff;
+      
+      copy  = **base;
+      *base = *base + 1;
+      suff  = **base;
+      *base = *base + 1;
+      memcpy( (data + copy + 1), *base, suff);
+      *data = copy + suff;
+      *base += suff;
+    }
+  inline void read(FILE *dict)
+    {
+      unsigned int copy, suff;
+      copy = fgetc(dict);
+      suff = fgetc(dict);
+      fread(data + copy + 1, sizeof(u_char), suff, dict);
+      *data = copy + suff;
+    }
+  inline static void readString(u_char **base, u_char *prev)
+    {
+      ((mgString *) &prev)->read(base);
+    }
+  inline static void readString(FILE *dict, u_char *prev)
+    { 
+      ((mgString *) &prev)->read(dict);
+    }
+};
+
+int arg_atoi (char *str);
+int compare (u_char * s1, u_char * s2);
+int casecompare (u_char * s1, u_char * s2);   /* [RPAP - Jan 97: Stem Index Change] */
+u_char *copy_string (u_char * src_str);
+char *str255_to_string (u_char * str255, char *str);
+int prefixlen (u_char * s1, u_char * s2);
+char *char2str (u_char c);
+char *word2str (u_char * s);
+char *de_escape_string (char *s);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/longlong.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/longlong.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/longlong.h	(revision 21083)
@@ -0,0 +1,85 @@
+/**************************************************************************
+ *
+ * longlong.h -- Use of GCC's long long integer types
+ * Copyright (C) 1999 Tim A.H. Bell
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_LONGLONG
+#define H_LONGLONG
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include <WIN32cfg.h>
+# else
+#  include <config.h>
+# endif
+#endif
+
+/*
+  Use GCC's "long long" integer types for certain variables, to avoid
+  overflowing 32 bit integers.
+
+  Other files affected:
+  
+    lib:
+        bitio_random.c
+        bitio_random.h
+	
+    src/text:
+        ivf.pass1.c
+        ivf.pass2.c
+        build.h
+        mg_passes.c
+        text.h
+    
+*/
+
+/*#define TESTING_OVERFLOW*/
+
+#ifdef TESTING_OVERFLOW
+
+/* Test the overflow detection by using tiny (16-bit) types */
+typedef unsigned short int mg_ullong;
+typedef short int mg_llong;
+
+#define ULL_FS "u"
+#define LL_FS "d"
+
+#elif defined __GNUC__ && ! defined DISABLE_LONG_LONG
+
+/* We're using GCC, so it's okay to use "long long" (64-bit) types */
+#define USE_LONG_LONG
+
+typedef unsigned long long int mg_ullong;
+typedef long long int mg_llong;
+
+#define ULL_FS "llu"
+#define LL_FS "lld"
+
+#else
+
+/* Not using GCC, so fall back on plain "long" (32-bit) types */
+typedef unsigned long int mg_ullong;
+typedef long int mg_llong;
+
+#define ULL_FS "lu"
+#define LL_FS "ld"
+
+#endif /* __GNUC__ */
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.cpp	(revision 21083)
@@ -0,0 +1,1172 @@
+/**************************************************************************
+ *
+ * lovinstem.c -- Stemming code
+ * Copyright (C) 1994  Linh Huynh (linh@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+
+/*****************************************************************************
+ *
+ *   Transformational Rules used in Recoding Stem Terminations
+ *
+ *   Parameter in functions:
+ *       ch : the second last character of the old ending
+ *            (after removing one of double consonants) 
+ *
+ ****************************************************************************/
+
+
+/************ Conditional rules associated with transformations **************/
+
+/*static int aio ();
+static int s ();
+static int pt ();
+static int m ();
+static int n ();*/
+
+static int 
+aio (char ch)			/* Rule number 9     */
+{
+  return ((ch != 'a') && (ch != 'i') && (ch != 'o'));
+}
+
+static int 
+s (char ch)				/* Rule Number 24    */
+{
+  return (ch != 's');
+}
+
+static int 
+pt (char ch)				/* Rule number 28    */
+{
+  return ((ch != 'p') && (ch != 't'));
+}
+
+static int 
+m (char ch)				/* Rule number 30    */
+{
+  return (ch != 'm');
+}
+
+static int 
+n (char ch)				/* Rule number 32    */
+{
+  return (ch != 'n');
+}
+
+
+/**************************************************************************
+ *
+ *  Context-sensitive rules associated with certain endings.
+ *
+ *  The notations of the rules are the same as in Lovins' paper
+ *  except that rule A is replaced by a NULL in the data structure.
+ *
+ *  Function parameters:
+ *      - stem_length: possible stem length
+ *      - end        : pointer points to the end of the possible stem.
+ *
+ *************************************************************************/
+
+
+/********* Context-sensitive rule function declarations ******************/
+
+/*static int B ();
+static int C ();
+static int D ();
+static int E ();
+static int F ();
+static int G ();
+static int H ();
+static int I ();
+static int J ();
+static int K ();
+static int L ();
+static int M ();
+static int N ();
+static int O ();
+static int P ();
+static int Q ();
+static int R ();
+static int S ();
+static int T ();
+static int U ();
+static int V ();
+static int W ();
+static int X ();
+static int Y ();
+static int Z ();
+static int AA ();
+static int BB ();
+static int CC ();
+*/
+static int 
+B (int stem_length, char *end)
+{
+  return (stem_length >= 3);
+}
+
+static int 
+C (int stem_length, char *end)
+{
+  return (stem_length >= 4);
+}
+
+static int 
+D (int stem_length, char *end)
+{
+  return (stem_length >= 5);
+}
+
+static int 
+E (int stem_length, char *end)
+
+     
+{
+  return (*end != 'e');
+}
+
+static int 
+F (int stem_length, char *end)
+     
+     
+{
+  return ((stem_length >= 3) && (*end != 'e'));
+}
+
+static int 
+G (int stem_length, char *end)
+     
+     
+{
+  return ((stem_length >= 3) && (*end == 'f'));
+}
+
+static int 
+H (int stem_length, char *end)
+     
+     
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  return ((p1 == 't') || ((p1 == 'l') && (p2 == 'l')));
+}
+
+static int 
+I (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'o') && (p1 != 'e'));
+}
+
+static int 
+J (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'e'));
+}
+
+static int 
+K (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((stem_length >= 3) &&
+	  ((p1 == 'l') || (p1 == 'i') ||
+	   ((p1 == 'e') && (*(end - 2) == 'u'))));
+}
+
+static int 
+L (int stem_length, char *end)
+     
+     
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+  if (p1 == 's')
+    return (p2 == 'o');
+  else
+    return ((p1 != 'u') && (p1 != 'x'));
+}
+
+static int 
+M (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((p1 != 'a') && (p1 != 'c') &&
+	  (p1 != 'e') && (p1 != 'm'));
+}
+
+static int 
+N (int stem_length, char *end)
+     
+     
+{
+  if (stem_length >= 3)
+    {
+      if (*(end - 2) == 's')
+	return (stem_length >= 4);
+      else
+	return 1;
+    }
+  else
+    return 0;
+}
+
+static int 
+O (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+P (int stem_length, char *end)
+     
+     
+{
+  return (*end != 'c');
+}
+
+static int 
+Q (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+
+  return ((stem_length >= 3) && (p1 != 'l') && (p1 != 'n'));
+}
+
+static int 
+R (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+  return ((p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+S (int stem_length, char *end)
+     
+     
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 't');
+  else
+    return ((p1 == 'r') && (p2 == 'd'));
+}
+
+static int 
+T (int stem_length, char *end)
+     
+     
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 't')
+    return (p2 != 'o');
+  else
+    return (p1 == 's');
+}
+
+static int 
+U (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 == 'l') || (p1 == 'm') ||
+	  (p1 == 'n') || (p1 == 'r'));
+}
+
+static int 
+V (int stem_length, char *end)
+     
+     
+{
+  return (*end == 'c');
+}
+
+static int 
+W (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+
+  return ((p1 != 's') && (p1 != 'u'));
+}
+
+static int 
+X (int stem_length, char *end)
+     
+     
+{
+  char p1;
+  p1 = *end;
+
+  if (p1 == 'e')
+    return ((stem_length >= 3) && (*(end - 2) == 'u'));
+  else
+    return ((p1 == 'l') || (p1 == 'i'));
+}
+
+static int 
+Y (int stem_length, char *end)
+     
+     
+{
+  return ((*end == 'n') && (*(end - 1) == 'i'));
+}
+
+static int 
+Z (int stem_length, char *end)
+     
+     
+{
+  return (*end != 'f');
+}
+
+static int 
+AA (int stem_length, char *end)
+     
+     
+{
+  char p1, p2;
+  p1 = *end;
+  p2 = *(end - 1);
+
+  if (p1 == 'h')
+    return ((p2 == 'p') || (p2 == 't'));
+  else if (p1 == 'r')
+    return ((p2 == 'e') || (p2 == 'o'));
+  else if (p1 == 's')
+    return (p2 == 'e');
+  else
+    return ((p1 == 'd') || (p1 == 'f') ||
+	    (p1 == 'l') || (p1 == 't'));
+}
+
+static int 
+BB (int stem_length, char *end)
+     
+     
+{
+  if (stem_length >= 3)
+    {
+      if (stem_length >= 4)
+	return (strncmp (end - 3, "ryst", 4) != 0);
+      else
+	return (strncmp (end - 2, "met", 3) != 0);
+    }
+  else
+    return 0;
+}
+
+static int 
+CC (int stem_length, char *end)
+     
+     
+{
+  return (*end == 'l');
+}
+
+/**************************************************************************/
+
+#define MIN_STEM_LENGTH 2
+#define MAX_ENDING_SIZE 11
+#define PREDEFINED_SIZE (MAX_ENDING_SIZE + MIN_STEM_LENGTH)
+#define EOS     '\0'
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAX_STEM_LENGTH 255
+
+static char *remove_ending (char *word, int w_len);
+static void recode_stem (char *stem_end);
+
+/* =========================================================================
+ * Function: stem
+ * Description: 
+ *      Implemetation of the Lovins' stemming algorithm described in
+ *      J.B. Lovins, "Development of a Stemming Algorithm",
+ *      Mechanical Translation and Computational Linguistics, Vol 11,1968.
+ * Input: a word string with the length in the first byte
+ * Output: the stemmed word
+ * ========================================================================= */
+
+void
+lovinstem (u_char * word)
+{
+  char *word_start;		/* points to first letter of word */
+  char *stem_end;		/* points to last character of stem portion */
+  int old_length;		/* length of word */
+  int new_length;		/* length after stemming */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  u_char copy[MAX_STEM_LENGTH + 2];
+  memcpy (copy, word, *word + 1);
+
+  old_length = *copy; /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* The word must be at least MIN_STEM_LENGTH characters long. */
+  if (old_length <= MIN_STEM_LENGTH)
+    return;
+
+  word_start = (char *) copy + 1;	/* jump over length byte */ /* [RPAP - Jan 97: Stem Index Change] */
+  copy[old_length + 1] = '\0';	/* null terminate string */ /* [RPAP - Jan 97: Stem Index Change] */
+
+  stem_end = remove_ending (word_start, old_length);
+  recode_stem (stem_end);
+
+  /* fix up new length */
+  /* have to use strlen because have no other way of telling length */
+  new_length = strlen (word_start);
+  *copy = new_length;  /* [RPAP - Jan 97: Stem Index Change] */
+
+  /* [RPAP - Jan 97: Stem Index Change] */
+  memcpy (word, copy, *copy + 1);
+
+}				/*stem_complex */
+
+/* =========================================================================
+
+ *   Data structure for recoding and the method for recoding the stem. 
+ *
+ * ========================================================================= */
+
+typedef struct
+{
+  char *old_end;		/* old ending */
+  char *new_end;		/* new ending */
+  char old_offset;		/* length of the old ending - 1 */
+  int (*cond) (char);	        /* condition rule */
+  char end_group;		/* signal the end of the group */
+}
+Recode_Rules;
+
+/*  
+   Stem terminations are divided into groups having the same last
+   character
+ */
+
+static Recode_Rules Rules[] =
+{
+  "uad", "uas", 2, NULL, 0,
+  "vad", "vas", 2, NULL, 0,
+  "cid", "cis", 2, NULL, 0,
+  "lid", "lis", 2, NULL, 0,
+  "erid", "eris", 3, NULL, 0,
+  "pand", "pans", 3, NULL, 0,
+  "end", "ens", 2, s, 0,
+  "end", "ens", 2, m, 0,
+  "ond", "ons", 2, NULL, 0,
+  "lud", "lus", 2, NULL, 0,
+  "rud", "rus", 2, NULL, 1,
+
+  "ul", "l", 1, aio, 1,
+
+  "istr", "ister", 3, NULL, 0,
+  "metr", "meter", 3, NULL, 0,
+  "her", "hes", 2, pt, 1,
+
+  "urs", "ur", 2, NULL, 1,
+
+  "uct", "uc", 2, NULL, 0,
+  "umpt", "um", 3, NULL, 0,
+  "rpt", "rb", 2, NULL, 0,
+  "mit", "mis", 2, NULL, 0,
+  "ert", "ers", 2, NULL, 0,
+  "et", "es", 1, n, 0,
+  "yt", "ys", 1, NULL, 1,
+
+  "iev", "ief", 2, NULL, 0,
+  "olv", "olut", 2, NULL, 1,
+
+  "bex", "bic", 2, NULL, 0,
+  "dex", "dic", 2, NULL, 0,
+  "pex", "pic", 2, NULL, 0,
+  "tex", "tic", 2, NULL, 0,
+  "ax", "ac", 1, NULL, 0,
+  "ex", "ec", 1, NULL, 0,
+  "ix", "ic", 1, NULL, 0,
+  "lux", "luc", 2, NULL, 1,
+
+  "yz", "ys", 1, NULL, 1
+};
+
+typedef struct last
+  {
+    char c;			/* The last character */
+    struct last *left;		/* used in balanced   */
+    struct last *right;		/* binary tree        */
+    Recode_Rules *pt;		/* location of approriate group */
+  }
+Last_Char_Node;
+
+/*------------
+       s
+     /   \
+    l     x
+   / \   / \
+  d   r t   z
+         \
+          v
+---------------*/
+static Last_Char_Node pr[] =
+{
+  'd', NULL, NULL, Rules,
+  'l', pr, pr + 2, Rules + 11,
+  'r', NULL, NULL, Rules + 12,
+  's', pr + 1, pr + 6, Rules + 15,
+  't', NULL, pr + 5, Rules + 16,
+  'v', NULL, NULL, Rules + 23,
+  'x', pr + 4, pr + 7, Rules + 25,
+  'z', NULL, NULL, Rules + 33,
+};
+
+
+/*****************************************************************************
+ *
+ *  Recode the stem according to the transformation rules.
+ *
+ *****************************************************************************/
+
+static void
+recode_stem (char *stem_end)
+{
+  static Last_Char_Node *root = pr + 3;
+  Last_Char_Node *p_last = root;
+  Recode_Rules *rule;		/* points to the transformation list */
+  char *h,			/* points to start of possible ending */
+    ch,				/* last character of the old ending  */
+    ch2;
+
+  h = stem_end - 1;
+  ch = *stem_end;
+  if (*h == ch)			/* Check for double consonant        */
+    {
+      if (strchr ("bdglmnprst", ch) != NULL)
+	{
+	  *stem_end = EOS;
+	  stem_end = h;
+	}
+    }
+
+  do				/* Check for the last character       */
+    {
+      ch2 = p_last->c;
+      if (ch == ch2)
+	break;
+      else if (ch > ch2)
+	p_last = p_last->right;
+      else
+	p_last = p_last->left;
+    }
+  while (p_last != NULL);
+
+  if (p_last != NULL)		/* Check for the rest of suffix list */
+    {
+      rule = p_last->pt;
+      for (;;)
+	{
+	  h = stem_end - rule->old_offset;
+	  if (strcmp (h, rule->old_end) == 0)
+	    {
+	      if (!rule->cond || (*rule->cond) (*(h - 1)))
+		{
+		  (void) strcpy (h, rule->new_end);
+		  break;
+		}
+	    }
+	  if (rule->end_group)
+	    break;
+	  rule++;
+	}
+    }
+}
+
+/* ======================================================================
+
+ *    List of endings and the method to remove the ending 
+ *
+ * ======================================================================*/
+
+/************ Data structures for list of endings  ********************/
+
+typedef struct
+{
+  char *ending;			/* old ending                */
+  int (*cond) (int length, char *end);		/* conditional rule          */
+  signed char left_offset;	/* used to find the siblings */
+  signed char right_offset;	/* in balanced binary tree   */
+}
+Ending_List;
+
+/*
+   The original list of endings is re-organised into groups having
+   the same length and the same first character.
+ */
+
+static Ending_List List[] =
+{
+  "a", NULL, 0, 0,
+
+  "ae", NULL, 0, 0,
+  "al", BB, -1, 2,
+  "ar", X, 0, 0,
+  "as", B, -1, 0,
+
+  "acy", NULL, 0, 1,
+  "age", B, 0, 0,
+  "aic", NULL, -2, 1,
+  "als", BB, 0, 0,
+  "ant", B, -2, 2,
+  "ars", O, 0, 0,
+  "ary", F, -1, 2,
+  "ata", NULL, 0, 0,
+  "ate", NULL, -1, 0,
+
+  "able", NULL, 0, 1,
+  "ably", NULL, 0, 0,
+  "ages", B, -2, 2,
+  "ally", B, 0, 0,
+  "ance", B, -1, 1,
+  "ancy", B, 0, 0,
+  "ants", B, -4, 4,
+  "aric", NULL, 0, 0,
+  "arly", K, -1, 1,
+  "ated", I, 0, 0,
+  "ates", NULL, -2, 2,
+  "atic", B, 0, 0,
+  "ator", NULL, -1, 0,
+
+  "acies", NULL, 0, 0,
+  "acity", NULL, -1, 1,
+  "aging", B, 0, 0,
+  "aical", NULL, -2, 2,
+  "alist", NULL, 0, 0,
+  "alism", B, -1, 0,
+  "ality", NULL, -3, 3,
+  "alize", NULL, 0, 1,
+  "allic", BB, 0, 0,
+  "anced", B, -2, 2,
+  "ances", B, 0, 0,
+  "antic", C, -1, 0,
+  "arial", NULL, -6, 6,
+  "aries", NULL, 0, 1,
+  "arily", NULL, 0, 0,
+  "arity", B, -2, 2,
+  "arize", NULL, 0, 0,
+  "aroid", NULL, -1, 0,
+  "ately", NULL, -3, 3,
+  "ating", I, 0, 1,
+  "ation", B, 0, 0,
+  "ative", NULL, -2, 2,
+  "ators", NULL, 0, 0,
+  "atory", NULL, -1, 1,
+  "ature", E, 0, 0,
+
+  "aceous", NULL, 0, 1,
+  "acious", B, 0, 0,
+  "action", G, -2, 2,
+  "alness", NULL, 0, 0,
+  "ancial", NULL, -1, 1,
+  "ancies", NULL, 0, 0,
+  "ancing", B, -4, 4,
+  "ariser", NULL, 0, 0,
+  "arized", NULL, -1, 1,
+  "arizer", NULL, 0, 0,
+  "atable", NULL, -2, 2,
+  "ations", B, 0, 0,
+  "atives", NULL, -1, 0,
+
+  "ability", NULL, 0, 1,
+  "aically", NULL, 0, 0,
+  "alistic", B, -2, 2,
+  "alities", NULL, 0, 0,
+  "ariness", E, -1, 0,
+  "aristic", NULL, -3, 3,
+  "arizing", NULL, 0, 1,
+  "ateness", NULL, 0, 0,
+  "atingly", NULL, -2, 2,
+  "ational", B, 0, 0,
+  "atively", NULL, -1, 1,
+  "ativism", NULL, 0, 0,
+
+  "ableness", NULL, 0, 1,
+  "arizable", NULL, 0, 0,
+
+  "allically", C, 0, 0,
+  "antaneous", NULL, -1, 1,
+  "antiality", NULL, 0, 0,
+  "arisation", NULL, -2, 2,
+  "arization", NULL, 0, 0,
+  "ationally", B, -1, 1,
+  "ativeness", NULL, 0, 0,
+
+  "antialness", NULL, 0, 0,
+  "arisations", NULL, -1, 1,
+  "arizations", NULL, 0, 0,
+
+  "alistically", B, 0, 1,
+  "arizability", NULL, 0, 0,
+
+  "e", NULL, 0, 0,
+
+  "ed", E, 0, 0,
+  "en", F, -1, 1,
+  "es", E, 0, 0,
+
+  "eal", Y, 0, 0,
+  "ear", Y, -1, 1,
+  "ely", E, 0, 0,
+  "ene", E, -2, 2,
+  "ent", C, 0, 0,
+  "ery", E, -1, 1,
+  "ese", NULL, 0, 0,
+
+  "ealy", Y, 0, 1,
+  "edly", E, 0, 0,
+  "eful", NULL, -2, 1,
+  "eity", NULL, 0, 0,
+  "ence", NULL, -2, 2,
+  "ency", NULL, 0, 0,
+  "ened", E, -1, 2,
+  "enly", E, 0, 0,
+  "eous", NULL, -1, 0,
+
+  "early", Y, 0, 1,
+  "ehood", NULL, 0, 0,
+  "eless", NULL, -2, 2,
+  "elity", NULL, 0, 0,
+  "ement", NULL, -1, 0,
+  "enced", NULL, -3, 3,
+  "ences", NULL, 0, 1,
+  "eness", E, 0, 0,
+  "ening", E, -2, 2,
+  "ental", NULL, 0, 0,
+  "ented", C, -1, 1,
+  "ently", NULL, 0, 0,
+
+  "eature", Z, 0, 0,
+  "efully", NULL, -1, 1,
+  "encies", NULL, 0, 0,
+  "encing", NULL, -2, 2,
+  "ential", NULL, 0, 0,
+  "enting", C, -1, 1,
+  "entist", NULL, 0, 1,
+  "eously", NULL, 0, 0,
+
+  "elihood", E, 0, 1,
+  "encible", NULL, 0, 0,
+  "entally", NULL, -2, 2,
+  "entials", NULL, 0, 0,
+  "entiate", NULL, -1, 1,
+  "entness", NULL, 0, 0,
+
+  "entation", NULL, 0, 0,
+  "entially", NULL, -1, 1,
+  "eousness", NULL, 0, 0,
+
+  "eableness", E, 0, 1,
+  "entations", NULL, 0, 0,
+  "entiality", NULL, -2, 2,
+  "entialize", NULL, 0, 0,
+  "entiation", NULL, -1, 0,
+
+  "entialness", NULL, 0, 0,
+
+  "ful", NULL, 0, 0,
+
+  "fully", NULL, 0, 0,
+
+  "fulness", NULL, 0, 0,
+
+  "hood", NULL, 0, 0,
+
+  "i", NULL, 0, 0,
+
+  "ia", NULL, 0, 0,
+  "ic", NULL, -1, 1,
+  "is", NULL, 0, 0,
+
+  "ial", NULL, 0, 0,
+  "ian", NULL, -1, 1,
+  "ics", NULL, 0, 1,
+  "ide", L, 0, 0,
+  "ied", NULL, -3, 3,
+  "ier", NULL, 0, 0,
+  "ies", P, -1, 0,
+  "ily", NULL, -1, 1,
+  "ine", M, 0, 0,
+  "ing", N, -5, 5,
+  "ion", Q, 0, 0,
+  "ish", C, -1, 1,
+  "ism", B, 0, 1,
+  "ist", NULL, 0, 0,
+  "ite", AA, -3, 3,
+  "ity", NULL, 0, 0,
+  "ium", NULL, -1, 0,
+  "ive", NULL, -1, 1,
+  "ize", F, 0, 0,
+
+  "ials", NULL, 0, 0,
+  "ians", NULL, -1, 0,
+  "ible", NULL, -1, 1,
+  "ibly", NULL, 0, 0,
+  "ical", NULL, -2, 2,
+  "ides", L, 0, 0,
+  "iers", NULL, -1, 1,
+  "iful", NULL, 0, 0,
+  "ines", M, -4, 4,
+  "ings", N, 0, 0,
+  "ions", B, -1, 1,
+  "ious", NULL, 0, 0,
+  "isms", B, -2, 2,
+  "ists", NULL, 0, 0,
+  "itic", H, -1, 1,
+  "ized", F, 0, 1,
+  "izer", F, 0, 0,
+
+  "ially", NULL, 0, 0,
+  "icant", NULL, -1, 1,
+  "ician", NULL, 0, 0,
+  "icide", NULL, -2, 2,
+  "icism", NULL, 0, 0,
+  "icist", NULL, -1, 0,
+  "icity", NULL, -3, 3,
+  "idine", I, 0, 1,
+  "iedly", NULL, 0, 0,
+  "ihood", NULL, -2, 2,
+  "inate", NULL, 0, 0,
+  "iness", NULL, -1, 0,
+  "ingly", B, -6, 6,
+  "inism", J, 0, 1,
+  "inity", CC, 0, 0,
+  "ional", NULL, -2, 2,
+  "ioned", NULL, 0, 0,
+  "ished", NULL, -1, 0,
+  "istic", NULL, -3, 3,
+  "ities", NULL, 0, 1,
+  "itous", NULL, 0, 0,
+  "ively", NULL, -2, 2,
+  "ivity", NULL, 0, 0,
+  "izers", F, -1, 1,
+  "izing", F, 0, 0,
+
+  "ialist", NULL, 0, 0,
+  "iality", NULL, -1, 1,
+  "ialize", NULL, 0, 0,
+  "ically", NULL, -2, 2,
+  "icance", NULL, 0, 0,
+  "icians", NULL, -1, 1,
+  "icists", NULL, 0, 0,
+  "ifully", NULL, -4, 4,
+  "ionals", NULL, 0, 0,
+  "ionate", D, -1, 1,
+  "ioning", NULL, 0, 0,
+  "ionist", NULL, -2, 2,
+  "iously", NULL, 0, 0,
+  "istics", NULL, -1, 1,
+  "izable", E, 0, 0,
+
+  "ibility", NULL, 0, 0,
+  "icalism", NULL, -1, 1,
+  "icalist", NULL, 0, 1,
+  "icality", NULL, 0, 0,
+  "icalize", NULL, -3, 3,
+  "ication", G, 0, 0,
+  "icianry", NULL, -1, 0,
+  "ination", NULL, -1, 1,
+  "ingness", NULL, 0, 0,
+  "ionally", NULL, -5, 5,
+  "isation", NULL, 0, 0,
+  "ishness", NULL, -1, 1,
+  "istical", NULL, 0, 1,
+  "iteness", NULL, 0, 0,
+  "iveness", NULL, -3, 3,
+  "ivistic", NULL, 0, 0,
+  "ivities", NULL, -1, 0,
+  "ization", F, -1, 1,
+  "izement", NULL, 0, 0,
+
+  "ibleness", NULL, 0, 0,
+  "icalness", NULL, -1, 1,
+  "ionalism", NULL, 0, 0,
+  "ionality", NULL, -2, 2,
+  "ionalize", NULL, 0, 0,
+  "iousness", NULL, -1, 1,
+  "izations", NULL, 0, 0,
+
+  "ionalness", NULL, 0, 1,
+  "istically", NULL, 0, 0,
+  "itousness", NULL, -2, 2,
+  "izability", NULL, 0, 0,
+  "izational", NULL, -1, 0,
+
+  "izationally", B, 0, 0,
+
+  "ly", B, 0, 0,
+
+  "less", NULL, 0, 1,
+  "lily", NULL, 0, 0,
+
+  "lessly", NULL, 0, 0,
+
+  "lessness", NULL, 0, 0,
+
+  "ness", NULL, 0, 0,
+
+  "nesses", NULL, 0, 0,
+
+  "o", NULL, 0, 0,
+
+  "on", S, 0, 1,
+  "or", T, 0, 0,
+
+  "oid", NULL, 0, 0,
+  "one", R, -1, 1,
+  "ous", NULL, 0, 0,
+
+  "ogen", NULL, 0, 0,
+
+  "oidal", NULL, 0, 0,
+  "oides", NULL, -1, 2,
+  "otide", NULL, 0, 0,
+  "ously", NULL, -1, 0,
+
+  "oidism", NULL, 0, 0,
+
+  "oidally", NULL, 0, 1,
+  "ousness", NULL, 0, 0,
+
+  "s", W, 0, 0,
+
+  "s'", NULL, 0, 0,
+
+  "um", U, 0, 1,
+  "us", V, 0, 0,
+
+  "ward", NULL, 0, 1,
+  "wise", NULL, 0, 0,
+
+  "y", B, 0, 0,
+
+  "yl", R, 0, 0,
+
+  "ying", B, 0, 1,
+  "yish", NULL, 0, 0,
+
+  "'s", NULL, 0, 0,
+};
+
+typedef struct node
+  {
+    char c;			/* First character  */
+    struct node *left;		/* used in balanced */
+    struct node *right;		/* binary tree      */
+    Ending_List *ptr[11];	/* the approriate location */
+  }
+First_Char_Node;
+
+static First_Char_Node First[] =
+{
+  '\'', NULL, NULL,
+  {NULL,
+   List + 293, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'a', First, NULL,
+  {List,
+   List + 2, List + 9, List + 20, List + 39, List + 58,
+   List + 70, List + 77, List + 82, List + 87, List + 89},
+
+  'e', First + 1, First + 4,
+  {List + 91,
+   List + 93, List + 98, List + 106, List + 116, List + 126,
+   List + 133, List + 138, List + 142, List + 145, NULL},
+
+  'f', NULL, NULL,
+  {NULL,
+   NULL, List + 146, NULL, List + 147, NULL,
+   List + 148, NULL, NULL, NULL, NULL},
+
+  'h', First + 3, First + 5,
+  {NULL,
+   NULL, NULL, List + 149, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'i', NULL, NULL,
+  {List + 150,
+   List + 152, List + 163, List + 181, List + 202, List + 222,
+   List + 239, List + 252, List + 258, NULL, List + 261},
+
+  'l', First + 2, First + 10,
+  {NULL,
+   List + 262, NULL, List + 263, NULL, List + 265,
+   NULL, List + 266, NULL, NULL, NULL},
+
+  'n', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 267, NULL, List + 268,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'o', First + 7, First + 9,
+  {List + 269,
+   List + 270, List + 273, List + 275, List + 277, List + 280,
+   List + 281, NULL, NULL, NULL, NULL},
+
+  's', NULL, NULL,
+  {List + 283,
+   List + 284, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'u', First + 8, First + 12,
+  {NULL,
+   List + 285, NULL, NULL, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'w', NULL, NULL,
+  {NULL,
+   NULL, NULL, List + 287, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+
+  'y', First + 11, NULL,
+  {List + 289,
+   List + 290, NULL, List + 291, NULL, NULL,
+   NULL, NULL, NULL, NULL, NULL},
+};
+
+
+/******************************************************************************
+ *
+ *  Look for a match in the suffix list.
+ *  Return the pointer to the end of the new stem if there is a match.
+ *  Otherwise, return the pointer to the end of the original word.
+ *
+ *  Method:
+ *      * Search for the first character in the suffix list.
+ *      * If there is match, search for the rest of the suffix list.
+ *         
+ *****************************************************************************/
+
+static char *
+remove_ending (char *word, int w_len)
+{
+  static First_Char_Node *root = First + 6;	/* the root of binary tree is 'l' */
+  First_Char_Node *p_first;	/* Points to the first character      */
+  /* of the possible suffix             */
+  Ending_List *p_list;		/* Points to the List of Endings      */
+  char *suffix_start,		/* Points to start of possible suffix */
+   *stem_end,			/* Points to the end of possible stem */
+    ch1, ch2;
+  int s_len,			/* Possible stem length               */
+    e_offset,			/* Offset from the end to the start of */
+  /* possible suffix                    */
+    not_done = 1, cmp;
+
+  stem_end = word + w_len - 1;
+  if (w_len > PREDEFINED_SIZE)	/* find the start of suffix   */
+    suffix_start = word + w_len - MAX_ENDING_SIZE;
+  else
+    suffix_start = word + MIN_STEM_LENGTH;
+
+  ch1 = *suffix_start;
+  do				/* Search for the first character     */
+    {
+      p_first = root;
+      do
+	{
+	  ch2 = p_first->c;
+	  if (ch1 == ch2)
+	    break;
+	  else if (ch1 > ch2)
+	    p_first = p_first->right;
+	  else
+	    p_first = p_first->left;
+	}
+      while (p_first != NULL);
+
+      if (p_first != NULL)	/* Search for the rest */
+	{
+	  e_offset = stem_end - suffix_start;
+	  if ((p_list = p_first->ptr[e_offset]) != NULL)
+	    {
+	      for (;;)		/* no need to compare the first char  */
+		{
+		  cmp = strcmp (suffix_start + 1, p_list->ending + 1);
+		  if (cmp > 0)
+		    if (p_list->right_offset)
+		      p_list += p_list->right_offset;
+		    else
+		      break;
+		  else if (cmp < 0)
+		    if (p_list->left_offset)
+		      p_list += p_list->left_offset;
+		    else
+		      break;
+		  else
+		    {
+		      s_len = suffix_start - word;
+		      if (!p_list->cond ||
+			  (*p_list->cond) (s_len, suffix_start - 1))
+			{
+			  *suffix_start = EOS;
+			  stem_end = suffix_start - 1;
+			  not_done = 0;
+			}
+		      break;
+		    }
+		}
+	    }
+	}
+      suffix_start++;
+    }
+  while (not_done && ((ch1 = *suffix_start) != EOS));
+  return (stem_end);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/lovinstem.h	(revision 21083)
@@ -0,0 +1,28 @@
+/**************************************************************************
+ *
+ * lovinstem.h -- Lovins' stemmer header
+ * Copyright (C) 1994  Linh Huynh, 
+ *                     (glued into library by tes@kbs.citri.edu.au)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef LOVINSTEM_H
+#define LOVINSTEM_H
+
+void lovinstem (unsigned char *word);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/memlib.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/memlib.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/memlib.cpp	(revision 21083)
@@ -0,0 +1,41 @@
+/**************************************************************************
+ *
+ * memlib.c -- Malloc wrappers
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+/* Defined as strdup is not an ANSI function */
+char *
+my_strdup(const char *str)
+{
+  char *ret_str = new char[strlen(str)+1];
+  if (ret_str) return strcpy(ret_str, str);
+  else return (char*) 0;
+}
+
+
+Malloc_func Xmalloc = malloc;
+
+Realloc_func Xrealloc = realloc;
+
+Free_func Xfree = free;
+
+Strdup_func Xstrdup = my_strdup;
Index: /main/tags/2.38/gsdl/src/mgpp/lib/memlib.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/memlib.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/memlib.h	(revision 21083)
@@ -0,0 +1,55 @@
+/**************************************************************************
+ *
+ * memlib.h -- Malloc wrappers
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_MEMLIB
+#define H_MEMLIB
+
+/* changed default behaviour - we now assume std memory. - john mcp. */
+/* #ifdef STD_MEM */
+#if !defined(NOT_STD_MEM)
+#include <string.h>
+#define Xmalloc malloc
+#define Xrealloc realloc
+#define Xfree free
+
+#if defined (__WIN32__)
+# define Xstrdup _strdup
+#else
+# define Xstrdup strdup
+#endif
+
+#else
+
+
+#include "sysfuncs.h"
+
+typedef void *(*Malloc_func) (size_t);
+typedef void *(*Realloc_func) (void *, size_t);
+typedef void (*Free_func) (void *);
+typedef char *(*Strdup_func) (const char *);
+
+extern Malloc_func Xmalloc;
+extern Realloc_func Xrealloc;
+extern Free_func Xfree;
+extern Strdup_func Xstrdup;
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/messages.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/messages.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/messages.cpp	(revision 21083)
@@ -0,0 +1,75 @@
+/**************************************************************************
+ *
+ * messages.c -- Message and error functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include <stdarg.h>
+#include "messages.h"
+
+char *msg_prefix = "";
+
+
+void VOLATILE 
+FatalError (int ExitCode, const char *fmt,...)
+{
+  char buf[1024];
+  char *s, *pfx;
+  va_list args;
+  va_start (args, fmt);
+  vsprintf (buf, fmt, args);
+  s = strrchr (buf, '\n');
+  if (!s || *(s + 1) != '\0')
+    strcat (buf, "\n");
+  pfx = strrchr (msg_prefix, '/');
+  pfx = pfx ? pfx + 1 : msg_prefix;
+  fprintf (stderr, "%s%s%s", pfx, *pfx ? " : " : "", buf);
+  exit (ExitCode);
+}
+
+
+
+/*
+ * This function writes messages to stderr. Due to the fact that I can't 
+ * guarantee that the fprintf call is monatomic I have to implement a 
+ * semaphore system.
+ */
+void 
+Message (const char *fmt,...)
+{
+  char buf[1024];
+  char *s, *pfx;
+  va_list args;
+
+#ifdef SILENT
+  return; /* stop those messages!!!! */
+#endif  
+
+  va_start (args, fmt);
+  vsprintf (buf, fmt, args);
+  s = strrchr (buf, '\n');
+  if (!s || *(s + 1) != '\0')
+    strcat (buf, "\n");
+
+  pfx = strrchr (msg_prefix, '/');
+  pfx = pfx ? pfx + 1 : msg_prefix;
+  fprintf (stderr, "%s%s%s", pfx, *pfx ? " : " : "", buf);
+
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/messages.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/messages.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/messages.h	(revision 21083)
@@ -0,0 +1,49 @@
+/**************************************************************************
+ *
+ * messages.h -- Message and error functions
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_MESSAGES
+#define H_MESSAGES
+
+#ifdef __GNUC__
+#define VOLATILE volatile
+#else
+#define VOLATILE
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+extern char *msg_prefix;
+
+void VOLATILE FatalError (int ExitCode, const char *fmt,...);
+void Message (const char *fmt,...);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
+
+
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.cpp	(revision 21083)
@@ -0,0 +1,148 @@
+/**************************************************************************
+ *
+ * mgheap.c -- Heap routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "mgheap.h"
+
+#define SWAP(s, a, b) 						\
+do {								\
+     register int __i;						\
+     register char *__a = (a), *__b = (b);			\
+     for (__i = (s); __i; __i--)				\
+       {							\
+         register char __t = *__a;				\
+	 *__a++ = *__b; *__b++ = __t;				\
+       }							\
+} while(0)
+
+
+
+#define COPY(s, dst, src) 					\
+do {								\
+     register int __i;						\
+     register char *__dst = (dst), *__src = (src);		\
+     for (__i = (s); __i; __i--)				\
+       *__dst++ = *__src++;					\
+} while(0)
+
+
+
+static void 
+heap_heapify (void *heap, int size, int num, int curr, heap_comp hc)
+{
+  register int child = curr * 2;
+  while (child <= num)
+    {
+      if (child < num && hc ((char *) heap + child * size,
+			     (char *) heap + child * size - size) < 0)
+	child++;
+      if (hc ((char *) heap + (curr - 1) * size, (char *) heap + (child - 1) * size) > 0)
+	{
+	  SWAP (size, (char *) heap + (curr - 1) * size,
+		(char *) heap + (child - 1) * size);
+	  curr = child;
+	  child = child * 2;
+	}
+      else
+	break;
+    }
+}
+
+static void 
+heap_pullup (void *heap, int size, int num, heap_comp hc)
+{
+  register int curr = num;
+  register int parent = curr >> 1;
+  while (parent &&
+	 hc ((char *) heap + (curr - 1) * size, (char *) heap + (parent - 1) * size) < 0)
+    {
+      SWAP (size, (char *) heap + (curr - 1) * size,
+	    (char *) heap + (parent - 1) * size);
+      curr = parent;
+      parent = curr >> 1;
+    }
+}
+
+/************************************************************************
+ *
+ * NOTE: If you choose to change the comparison function the first thing 
+ *       you do after changing the function is call heap_build.
+ *
+ */
+void 
+heap_build (void *heap, int size, int num, heap_comp hc)
+{
+  register int i;
+  for (i = num / 2; i > 0; i--)
+    heap_heapify (heap, size, num, i, hc);
+}
+
+
+
+/****************************************************
+ *
+ * NOTE : The heap must be built before heap_sort is called. 
+ *        This has the effect of reversing the order of the array.
+ *		e.g. if your comparison function is designed to pull the
+ *                   biggest thing off the heap first then the result of
+ *		     sorting with this function will be to put the bigest
+ *                   thing at the end of the array.
+ *
+ */
+void 
+heap_sort (void *heap, int size, int num, heap_comp hc)
+{
+  register int i;
+  for (i = num; i > 1; i--)
+    {
+      SWAP (size, (char *) heap, (char *) heap + (i - 1) * size);
+      heap_heapify (heap, size, i - 1, 1, hc);
+    }
+}
+
+
+void 
+heap_deletehead (void *heap, int size, int *num, heap_comp hc)
+{
+  (*num)--;
+  SWAP (size, (char *) heap, (char *) heap + *num * size);
+  heap_heapify (heap, size, *num, 1, hc);
+}
+
+
+void 
+heap_changedhead (void *heap, int size, int num, heap_comp hc)
+{
+  heap_heapify (heap, size, num, 1, hc);
+}
+
+
+/***********************************************************************
+ *
+ * This assumes that the item has been added to the end of the
+ * array that is the heap. But that num has not been changed. 
+ *
+ */
+void 
+heap_additem (void *heap, int size, int *num, heap_comp hc)
+{
+  (*num)++;
+  heap_pullup (heap, size, *num, hc);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/mgheap.h	(revision 21083)
@@ -0,0 +1,82 @@
+/**************************************************************************
+ *
+ * mgheap.h -- Heap routines
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+/* Care should be taken when using these routines as NO error checking is
+ * done.
+ */
+
+
+
+/* The heap comparison routine should return 
+ * <0 : If a should be before b
+ *  0 : If a and b are equal
+ * >0 : If a should be after b
+ */
+typedef int (*heap_comp) (void *a, void *b);
+
+
+/************************************************************************
+ *
+ * NOTE: If you choose to change the comparison function the first thing 
+ *       you do after changing the function is call heap_build.
+ *
+ */
+void heap_build (void *heap, int size, int num, heap_comp hc);
+
+
+
+/************************************************************************
+ *
+ * NOTE : The heap must be built before heap_sort is called.
+ *        This has the effect of reversing the order of the array.
+ *		e.g. if your comparison function is designed to pull the
+ *                   biggest thing off the heap first then the result of
+ *		     sorting with this function will be to put the bigest
+ *                   thing at the end of the array.
+ *
+ */
+void heap_sort (void *heap, int size, int num, heap_comp hc);
+
+/***********************************************************************
+ *
+ * NOTE: After deleting the head the heap will be one item shorter.
+ *       The deleted item will be placed at the end of the heap.
+ *
+ */
+void heap_deletehead (void *heap, int size, int *num, heap_comp hc);
+
+
+/***********************************************************************
+ *
+ * If you change the "value" of the root node of the heap then you
+ * should call this to re-pritorize the heap.
+ *
+ */
+void heap_changedhead (void *heap, int size, int num, heap_comp hc);
+
+
+/***********************************************************************
+ *
+ * This assumes that the item has been added to the end of the
+ * array that is the heap. But that num has not been changed. 
+ *
+ */
+void heap_additem (void *heap, int size, int *num, heap_comp hc);
Index: /main/tags/2.38/gsdl/src/mgpp/lib/netorder.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/netorder.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/netorder.h	(revision 21083)
@@ -0,0 +1,189 @@
+#ifndef NETORDER_H
+#define NETORDER_H
+
+#include "sysfuncs.h"
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+#include "win32in.h"
+#else
+# include <netinet/in.h>
+#endif
+
+#if defined (_BIG_ENDIAN) || (defined (BYTE_ORDER) && BYTE_ORDER == BIG_ENDIAN) || (defined (__BYTE_ORDER) && __BYTE_ORDER == __BIG_ENDIAN)
+# ifndef _BIG_ENDIAN
+#  define _BIG_ENDIAN
+# endif
+#endif
+
+#if defined (_LITTLE_ENDIAN) || (defined (BYTE_ORDER) && BYTE_ORDER == LITTLE_ENDIAN) || (defined (__BYTE_ORDER) && __BYTE_ORDER == __LITTLE_ENDIAN)
+# ifndef _LITTLE_ENDIAN
+#  define _LITTLE_ENDIAN
+# endif
+#endif
+
+#ifdef _LITTLE_ENDIAN
+
+/* double */
+#define HTOND(d)                                                              \
+        do {                                                                  \
+             unsigned long tmph, tmpl;                                        \
+	     memcpy ((void *) &tmph, (const void *) &d, sizeof(double) >> 1); \
+	     memcpy ((void *) &tmpl, (const void *) ((unsigned int) &d + (sizeof(double) >> 1)), sizeof (double) >> 1);   \
+	     tmph = htonl (tmph);                                             \
+	     tmpl = htonl (tmpl);                                             \
+	     memcpy ( (void *) &d, (const void *) &tmpl, sizeof (double) >> 1);                           \
+	     memcpy ((void *) ((unsigned int) &d + (sizeof(double) >> 1)), (const void *) &tmph, sizeof (double) >> 1);   \
+	}while(0)
+#define NTOHD(d)                                                              \
+        do {                                                                  \
+             unsigned long tmph, tmpl;                                        \
+	     memcpy ((void *) &tmph, (const void *) &d, sizeof(double) >> 1); \
+	     memcpy ((void *) &tmpl, (const void *) ((int) &d + (sizeof(double) >> 1)), sizeof (double) >> 1);   \
+	     tmph = ntohl (tmph);                                             \
+	     tmpl = ntohl (tmpl);                                             \
+	     memcpy((void *) &d, (const void *) &tmpl, sizeof (double) >> 1); \
+	     memcpy ((void *) ((int) &d + (sizeof(double) >> 1)), (const void *) &tmph, sizeof (double) >> 1);   \
+        }while(0)
+#define HTOND2(hd, nd)                                                        \
+        do {                                                                  \
+             unsigned long tmph, tmpl;                                        \
+	     memcpy ((void *) &tmph, (const void *) &hd, sizeof(double) >> 1);\
+	     memcpy ((void *) &tmpl, (const void *) ((unsigned int) &hd + (sizeof(double) >> 1)), sizeof (double) >> 1);  \
+	     tmph = htonl (tmph);                                             \
+	     tmpl = htonl (tmpl);                                             \
+	     memcpy((void *) &nd, (const void *) &tmpl, sizeof (double) >> 1);\
+	     memcpy ((void *) ((unsigned int) &nd + (sizeof(double) >> 1)), (void *) &tmph, sizeof (double) >> 1);  \
+	}while(0)
+#define NTOHD2(nd, hd)                                                        \
+        do {                                                                  \
+             unsigned long tmph, tmpl;                                        \
+	     memcpy ((void *) &nd, (void *) &tmph, sizeof(double) >> 1);      \
+	     memcpy ((void *) &tmpl, (const void *) &nd + (sizeof(double) >> 1), sizeof (double) >> 1);  \
+	     tmph = ntohl (tmph);                                             \
+	     tmpl = ntohl (tmpl);                                             \
+	     memcpy((void *) &hd, (const void *) &tmpl, sizeof (double) >> 1);\
+	     memcpy ((void *) &hd + (sizeof(double) >> 1), (const void *) &tmph, sizeof (double) >> 1);  \
+        }while(0)
+
+/* float */
+#define HTONF(f)                                                              \
+        do {                                                                  \
+             unsigned long tmp;                                               \
+             memcpy ((void *) &tmp, (const void *) &(f), sizeof (float));     \
+             HTONUL (tmp);                                                    \
+	     memcpy ((void *) &(f), (const void *) &tmp, sizeof (float));     \
+	}while(0)
+#define NTOHF(f)                                                              \
+        do {                                                                  \
+             unsigned long tmp;                                               \
+             memcpy ((void *) &tmp, (const void *) &(f), sizeof (float));     \
+	     NTOHUL (tmp);                                                    \
+	     memcpy ((void *) &(f), (const void *) &tmp, sizeof (float));     \
+	}while(0)
+#define HTONF2(hf, nf)                                                        \
+        do {                                                                  \
+             unsigned long tmp;                                               \
+             memcpy ((void *) &tmp, (const void *) &(hf), sizeof (float));    \
+             HTONUL (tmp);                                                    \
+	     memcpy ((void *) &(nf), (const void *) &tmp, sizeof (float));    \
+	}while(0)
+#define NTOHF2(nf, hf)                                                        \
+        do {                                                                  \
+             unsigned long tmp;                                               \
+             memcpy ((void *) &tmp, (const void *) &(nf), sizeof (float));    \
+	     NTOHUL (tmp);                                                    \
+	     memcpy ((void *) &(hf), (const void *) &tmp, sizeof (float));    \
+	}while(0)
+
+/* pointers */
+#define HTONP(p)          ((p) = (void *) htonl ((unsigned long) p))
+#define NTOHP(p)          ((p) = (void *) ntohl ((unsigned long) p))
+#define HTONP2(hp, np)    ((np) = (void *) htonl ((unsigned long) hp))
+#define NTOHP2(np, hp)    ((hp) = (void *) ntohl ((unsigned long) np))
+
+/* unsigned long */
+#define HTONUL(l)         ((l) = htonl((l)))
+#define NTOHUL(l)         ((l) = ntohl((l)))
+#define HTONUL2(hl, nl)   ((nl) = htonl ((hl)))
+#define NTOHUL2(nl, hl)   ((hl) = ntohl ((nl)))
+
+/* signed long */
+#define HTONSL(l)         ((l) = (long) htonl ((unsigned long) (l)))
+#define NTOHSL(l)         ((l) = (long) ntohl ((unsigned long) (l)))
+#define HTONSL2(hl, nl)   ((nl) = (long) htonl ((unsigned long) (hl)))
+#define NTOHSL2(nl, hl)   ((hl) = (long) ntohl ((unsigned long) (nl)))
+
+/* unsigned int */
+#define HTONUI(i)         ((i) = (unsigned int) htonl ((unsigned long) (i)))
+#define NTOHUI(i)         ((i) = (unsigned int) ntohl ((unsigned long) (i)))
+#define HTONUI2(hi, ni)   ((ni) = (unsigned int) htonl ((unsigned long) (hi)))
+#define NTOHUI2(ni, hi)   ((hi) = (unsigned int) ntohl ((unsigned long) (ni)))
+
+/* signed int */
+#define HTONSI(i)         ((i) = (int) htonl ((unsigned long) (i)))
+#define NTOHSI(i)         ((i) = (int) ntohl ((unsigned long) (i)))
+#define HTONSI2(hi, ni)   ((ni) = (int) htonl ((unsigned long) (hi)))
+#define NTOHSI2(ni, hi)   ((hi) = (int) ntohl ((unsigned long) (ni)))
+
+/* unsigned short */
+#define HTONUS(s)         ((s) = htons((s)))
+#define NTOHUS(s)         ((s) = ntohs((s)))
+#define HTONUS2(hs, ns)   ((ns) = htons((hs)))
+#define NTOHUS2(ns, hs)   ((hs) = ntohs((ns)))
+
+#else   /* _BIG_ENDIAN */
+
+/* double */
+#define HTOND(d)          (d)
+#define NTOHD(d)          (d)
+#define HTOND2(hd, nd)    ((hd) = (nd))
+#define NTOHD2(nd, hd)    ((nd) = (hd))
+
+/* float */
+#define HTONF(f)          (f)
+#define NTOHF(f)          (f)
+#define HTONF2(hf, nf)    ((nf) = (hf))
+#define NTOHF2(nf, hf)    ((hf) = (nf))
+
+/* pointers */
+#define HTONP(p)          (p)
+#define NTOHP(p)          (p)
+#define HTONP2(hp, np)    ((np) = (hp))
+#define NTOHP2(np, hp)    ((hp) = (np))
+
+/* unsigned long */
+#define HTONUL(l)         (l)
+#define NTOHUL(l)         (l)
+#define HTONUL2(hl, nl)   ((nl) = (hl))
+#define NTOHUL2(nl, hl)   ((hl) = (nl))
+
+/* signed long */
+#define HTONSL(l)         (l)
+#define NTOHSL(l)         (l)
+#define HTONSL2(hl, nl)   ((nl) = (hl))
+#define NTOHSL2(nl, hl)   ((hl) = (nl))
+
+/* unsigned int */
+#define HTONUI(i)         (i)
+#define NTOHUI(i)         (i)
+#define HTONUI2(hi, ni)   ((ni) = (hi))
+#define NTOHUI2(ni, hi)   ((hi) = (ni))
+
+/* signed int */
+#define HTONSI(i)         (i)
+#define NTOHSI(i)         (i)
+#define HTONSI2(hi, ni)   ((ni) = (hi))
+#define NTOHSI2(ni, hi)   ((hi) = (ni))
+
+/* unsigned short */
+#define HTONUS(s)         (s)
+#define NTOHUS(s)         (s)
+#define HTONUS2(hs, ns)   ((ns) = (hs))
+#define NTOHUS2(ns, hs)   ((hs) = (ns))
+
+
+
+#endif
+
+#endif /* netorder.h */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/non_ansi.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/non_ansi.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/non_ansi.h	(revision 21083)
@@ -0,0 +1,24 @@
+#if !defined(_NON_ANSI_H)
+#define _NON_ANSI_H 1
+
+#include "config.h" 
+# if !defined(__STDC__)
+
+#include <stdlib.h>  /* for FILE def */
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+int fileno(FILE *);
+int ftruncate(int, long);
+int pclose(FILE *);
+FILE *popen(const char *command, const char *type);
+int getpagesize();
+int strcasecmp(const char *, const char *);
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif /* !defined STDC, ... */
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/pathmax.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/pathmax.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/pathmax.h	(revision 21083)
@@ -0,0 +1,53 @@
+/* Define PATH_MAX somehow.  Requires sys/types.h.
+   Copyright (C) 1992 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef _PATHMAX_H
+#define _PATHMAX_H
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/* 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
+
+#endif /* _PATHMAX_H */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.cpp	(revision 21083)
@@ -0,0 +1,1074 @@
+/**************************************************************************
+ *
+ * perf_hash.c -- Perfect hashing functions
+ * Copyright (C) 1992  Bohdan S. Majewski
+ *
+ * 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.
+ *
+ **************************************************************************
+ *
+ * 1994 Neil Sharman
+ *      Small modifications were made to the interface so that it fitted in
+ *      with mg.
+ *
+ **************************************************************************/
+
+#define STRUCT
+
+#include <time.h>  /* for call to time () in SEED_RANDOM() */
+#include "sysfuncs.h"
+
+#include "local_strings.h"
+#include "memlib.h"
+#include "messages.h"
+#include "perf_hash.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#define FALSE 0
+#define TRUE  1
+
+#define STATIC 0
+
+/* Random Number stuff */
+
+long irandm (long is[2]);  /* from random.c */
+
+static long seed[] = {0, 0};
+#define RANDOM() irandm(seed)
+#define SEED_RANDOM(the_seed) do{ seed[0] = the_seed; }while(0)
+
+/* Max number of keys - must be a power of 2 minus 1 */
+static int MAX_M;
+
+
+static int MAX_CH;
+
+
+/* the width of the mapping tables  */
+static int MAX_L;
+
+
+
+#define c     1.23
+static int MAX_N;
+
+
+
+
+static u_char *translate;
+
+#define MEMBER 0
+#define ERASED 1
+
+
+
+/* direction constants for the edge oriented 3-graph representation */
+#define A              0
+#define B        (MAX_M)
+#define C          (2*B)
+
+/* NODEa, NODEb, NODEc, FIRST and NEXT are used to represent a 3-graph */
+static int *NODEa, *NODEb, *NODEc;
+static int *FIRST;
+static int *NEXT;
+
+
+#define norm(e) ((e) % MAX_M)
+/* in general should be ((e) % MAX_M) but MAX_M = 2^k - 1 */
+
+
+static char *mk;		/* for marking edges/vertices as removed */
+static int *g;			/* array g defines a minimal perfect hash function */
+
+
+
+/* stack of edges, created during the independency */
+/* test, used in the assignment step               */
+static struct
+  {
+    int sp;
+    int *st;
+  }
+S;
+#define push(s, e) s.st[s.sp++] = (e)
+#define pop(s, e)  e = s.st[--s.sp]
+
+#ifndef STRUCT
+static long **tb0, **tb1, **tb2;
+#else
+struct tb_entry **tb;
+#endif
+
+
+static int 
+unique (int v)
+{				/* checks if vertex v belongs to only one edge */
+  return (FIRST[v] != 0 && NEXT[FIRST[v]] == 0) ? FIRST[v] : 0;
+}				/*unique */
+
+
+
+
+
+
+
+
+static void 
+_delete (int v, int e)
+{				/* deletes edge e from list of v */
+
+  int b;
+
+  b = FIRST[v];
+  assert (norm (b) != 0);
+  if (norm (b) == e)
+    FIRST[v] = NEXT[FIRST[v]];
+  else
+    {
+      while (norm (NEXT[b]) != e)
+	{
+	  b = NEXT[b];
+	  assert (norm (b) != 0);
+	}
+      NEXT[b] = NEXT[NEXT[b]];
+    }
+}				/*delete */
+
+
+
+
+
+
+#if 0
+/* recursively removes the edges of a 3-graph which have at least */
+/* one unique vertex. The removed edges are placed on stack S     */
+static void 
+ph_remove (int e, int v)
+{
+  int b;
+  mk[e] = ERASED;
+  push (S, e);
+
+  if (NODEa[e] != v)
+    _delete (NODEa[e], e);
+  if (NODEb[e] != v)
+    _delete (NODEb[e], e);
+  if (NODEc[e] != v)
+    _delete (NODEc[e], e);
+
+  if (NODEa[e] != v && mk[b = norm (unique (NODEa[e]))] == MEMBER)
+    ph_remove (b, NODEa[e]);
+  if (NODEb[e] != v && mk[b = norm (unique (NODEb[e]))] == MEMBER)
+    ph_remove (b, NODEb[e]);
+  if (NODEc[e] != v && mk[b = norm (unique (NODEc[e]))] == MEMBER)
+    ph_remove (b, NODEc[e]);
+}
+#else
+
+
+static int StackPos, StackMax;
+static struct Stack
+  {
+    int e, v, m;
+  }
+ *Stack = NULL;
+
+#define StackAdd(_e, _v, _m)						\
+  do {									\
+    if (StackPos == StackMax)						\
+      {									\
+        StackMax <<= 1;							\
+	if (!(Stack = (struct Stack *)Xrealloc(Stack, sizeof(*Stack) * StackMax)))	\
+	  return(-1);							\
+      }									\
+    Stack[StackPos].e = (_e);						\
+    Stack[StackPos].v = (_v);						\
+    Stack[StackPos++].m = (_m);						\
+  } while(0)
+
+
+static int 
+ph_remove (int e, int v)
+{
+  if (!Stack)
+    {
+      StackMax = 256;
+      if (!(Stack = (struct Stack *) Xmalloc (sizeof (*Stack) * StackMax)))
+	return (-1);
+      StackPos = 0;
+    }
+  Stack[StackPos].e = e;
+  Stack[StackPos].v = v;
+  Stack[StackPos].m = 0;
+  StackPos++;
+  while (StackPos)
+    {
+      int m, b;
+      StackPos--;
+      e = Stack[StackPos].e;
+      v = Stack[StackPos].v;
+      m = Stack[StackPos].m;
+
+
+      switch (m)
+	{
+	case 0:
+	  {
+	    mk[e] = ERASED;
+	    push (S, e);
+
+	    if (NODEa[e] != v)
+	      _delete (NODEa[e], e);
+	    if (NODEb[e] != v)
+	      _delete (NODEb[e], e);
+	    if (NODEc[e] != v)
+	      _delete (NODEc[e], e);
+
+	    if (NODEa[e] != v && mk[b = norm (unique (NODEa[e]))] == MEMBER)
+	      {
+		Stack[StackPos++].m = 1;
+		StackAdd (b, NODEa[e], 0);
+		break;
+	      }
+	  }
+	case 1:
+	  {
+	    if (NODEb[e] != v && mk[b = norm (unique (NODEb[e]))] == MEMBER)
+	      {
+		Stack[StackPos++].m = 2;
+		StackAdd (b, NODEb[e], 0);
+		break;
+	      }
+	  }
+	case 2:
+	  if (NODEc[e] != v && mk[b = norm (unique (NODEc[e]))] == MEMBER)
+	    StackAdd (b, NODEc[e], 0);
+	}
+    }
+  return (0);
+}
+#endif
+
+
+
+
+
+/* returns TRUE if and only if set of edges created in the tree_builder */
+/* procedure form a 3-graph with independent edges. Edges of a 3-graph  */
+/* are independent iff repeated deletion of edges containing vertices   */
+/* of degree 1 results in a graph with no edges in it.                  */
+static int 
+acyclic (int m, int n)
+{
+
+  int v, e;
+  /* build list of edges for each node */
+  for (v = 1; v <= n; FIRST[v++] = 0);
+  for (e = 1; e <= m; e++)
+    {
+      NEXT[A + e] = FIRST[NODEa[e]];
+      FIRST[NODEa[e]] = A + e;
+      NEXT[B + e] = FIRST[NODEb[e]];
+      FIRST[NODEb[e]] = B + e;
+      NEXT[C + e] = FIRST[NODEc[e]];
+      FIRST[NODEc[e]] = C + e;
+
+      /* mark edge e as belonging to the hypergraph */
+      mk[e] = MEMBER;
+    }
+
+
+  S.sp = 0;			/* empty the stack */
+  mk[0] = ERASED;		/* a sentinel for the test below */
+  for (v = 1; v <= n; v++)
+    {
+      if (mk[e = norm (unique (v))] == MEMBER)
+	ph_remove (e, v);
+    }
+
+  /* check if any edges were left in the graph */
+  return S.sp == m;
+}				/*acyclic */
+
+
+
+
+
+
+
+
+/* repeatedly maps words into edges of a 3-graph until the edges */
+/* are independent.                                              */
+static int 
+tree_builder (int num, u_char ** keys, int *n)
+{
+
+  int e, k = 0;
+  int i, j;
+  u_char *w;
+
+  do
+    {
+      *n = (int) (num * c + 1);
+      /* initialize tables of random integers */
+      for (i = 0; i < MAX_CH; i++)
+	for (j = 0; j < MAX_L; j++)
+	  {
+#ifndef STRUCT
+	    tb0[i][j] = RANDOM () % *n;
+	    tb1[i][j] = RANDOM () % *n;
+	    tb2[i][j] = RANDOM () % *n;
+#else
+	    struct tb_entry *tbp = &tb[i][j];
+	    tbp->tb0 = RANDOM () % *n;
+	    tbp->tb1 = RANDOM () % *n;
+	    tbp->tb2 = RANDOM () % *n;
+#endif
+	  }
+
+      /* compute an edge (NODEa[e], NODEb[e], NODEc[e]) for each word */
+      for (e = 1; e <= num; e++)
+	{
+	  /*generate an edge corresponding to the ith word */
+	  int x = 0, y = 0, z = 0, l;
+	  w = keys[e - 1];
+
+	  l = *w++;
+	  j = (l - 1) % MAX_L;
+
+	  do
+	    {
+#ifndef STRUCT
+	      x += tb0[translate[*w]][j];
+	      y += tb1[translate[*w]][j];
+	      z += tb2[translate[*w]][j];
+#else
+	      struct tb_entry *tbp = &tb[translate[*w]][j];
+	      x += tbp->tb0;
+	      y += tbp->tb1;
+	      z += tbp->tb2;
+#endif
+	      if (++j >= MAX_L)
+		j = 0;
+	      w++;
+	    }
+	  while (--l);
+	  x = (x % *n) + 1;
+	  y = (y % *n) + 1;
+	  z = (z % *n) + 1;
+	  if (y == x && ++y > *n)
+	    y = 1;
+	  if (z == x && ++z > *n)
+	    z = 1;
+	  if (z == y)
+	    {
+	      if (++z > *n)
+		z = 1;
+	      if (z == x && ++z > *n)
+		z = 1;
+	    }
+
+	  NODEa[e] = x;
+	  NODEb[e] = y;
+	  NODEc[e] = z;
+	}
+      if (++k > 50)		/* make sure we will not wait for ever */
+	FatalError (1, "Unable to generate the perfect hash function. "
+		    "This is probably because there aren't enough words");
+    }
+  while (!acyclic (num, *n));
+  return k;
+}				/*tree_builder */
+
+
+
+
+
+
+
+
+
+/* calculates values of the g function/array so that i-th word is */
+/* placed at the (i-1)st position of a hash table.                */
+static void 
+assign (int n)
+{
+
+  int v, w = 0, e;
+
+  /* mark all the vertices of the 3-graph as unassigned */
+  for (v = 1; v <= n; mk[v++] = FALSE);
+
+  while (S.sp > 0)
+    {
+      int _xor = 0;
+      pop (S, e);
+      v = NODEa[e];
+      if (mk[v])
+	_xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      v = NODEb[e];
+      if (mk[v])
+	_xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      v = NODEc[e];
+      if (mk[v])
+	_xor ^= g[v];
+      else
+	{
+	  g[w = v] = 0;
+	  mk[v] = TRUE;
+	}
+      g[w] = (e - 1) ^ _xor;
+    }
+}				/*assign */
+
+
+
+
+
+
+
+
+
+/*check returns 0 if no error in mphf is detected, else returns error code */
+static int 
+check (int m)
+{
+
+  int e, err_code = 0;
+
+  /*for each word compute its place in hash table and check if correct */
+  for (e = 1; e <= m; e++)
+    {
+      if ((e - 1) != (g[NODEa[e]] ^ g[NODEb[e]] ^ g[NODEc[e]]))
+	{
+	  (void) fprintf (stderr, "Error for %dth word detected.\n", e);
+	  err_code = e;
+	}
+    }
+  return err_code;
+}				/*check */
+
+
+
+
+
+
+
+#if 0
+void 
+outputh (int m, int n)
+{
+
+  int i, j, w = (int) ceil (log10 ((double) n + 1.0)) + 1;
+
+#if 0
+  char *PRG =
+  "int h(char *s)\n"
+  "{\n"
+  "  int u, v, w, i;\n"
+  "i = (strlen(s) - 1) % _HXL;\n"
+  "  u = v = w = 0;\n"
+  "  while(*s)\n"
+  "    {\n"
+  "      u += mt1[(*s) - _HFC][i];\n"
+  "      v += mt2[(*s) - _HFC][i];\n"
+  "      w += mt3[(*s++) - _HFC][i];\n"
+  "      if(++i >= _HXL) i = 0;\n"
+  "    }\n"
+  "  u %= _HFN; v %= _HFN; w %= _HFN;\n"
+  "  if(u == v && ++v >= _HFN) v = 0;\n"
+  "  if(w == u && ++w >= _HFN) w = 0;\n"
+  "  if(w == v && ++w >= _HFN) w = 0;\n"
+  "  if(w == u && ++w >= _HFN) w = 0;\n"
+  "  return (g[u] ^ g[v] ^ g[w]) % _HFM;\n"
+  "};\n\n";
+#endif
+
+  char *PRG =
+  "int h(char *s)\n"
+  "{\n"
+  "  int u, v, w, i;\n"
+  "  i = (strlen(s) - 1) % _HXL;\n"
+  "  u = v = w = 0;\n"
+  "  while(*s)\n"
+  "    {\n"
+  "      if((u += mt1[(*s) - _HFC][i]) >= _HFN) u -= _HFN;\n"
+  "      if((v += mt2[(*s) - _HFC][i]) >= _HFN) v -= _HFN;\n"
+  "      if((w += mt3[(*s++) - _HFC][i]) >= _HFN) w -= _HFN;\n"
+  "      if(++i >= _HXL) i = 0;\n"
+  "    }\n"
+  "  if(u == v && ++v >= _HFN) v = 0;\n"
+  "  if(w == v) \n"
+  "    {\n"
+  "      if(++w >= _HFN) w = 0;\n"
+  "      if(w == u && ++w >= _HFN) w = 0;\n"
+  "    }\n"
+  "  else\n"
+  "    if(w == u)\n"
+  "      {\n"
+  "	     if(++w >= _HFN) w = 0;\n"
+  "	     if(w == v && ++w >= _HFN) w = 0;\n"
+  "      }\n"
+  "  return ((g[u] ^ g[v] ^ g[w]) > _HFM)? 0 : (g[u] ^ g[v] ^ g[w]);\n"
+  "}\n\n";
+
+  printf ("#define _HFN %d\n#define _HFC %d\n", n, fc);
+  printf ("#define _HFM %d\n#define _HXL %d\n", m, MAX_L);
+  printf ("#define _HFA %d\n\nstatic int g[_HFN] = {\n", lc - fc + 1);
+  for (i = 1; i < n; i++)
+    {
+      if (i % 8 == 0)
+	putchar ('\n');
+      printf ("%5d, ", g[i]);
+    }
+  printf ("%5d};\n\n", g[n]);
+
+  printf ("static int mt1[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb0[j][i]);
+      printf ("%*d},\n", w, tb0[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb0[lc][i]);
+  printf ("%*d}\n", w, tb0[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("static int mt2[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb1[j][i]);
+      printf ("%*d},\n", w, tb1[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb1[lc][i]);
+  printf ("%*d}\n", w, tb1[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("static int mt3[_HFA][_HXL] = {\n");
+  for (j = fc; j < lc; j++)
+    {
+      printf ("{");
+      for (i = 0; i < MAX_L - 1; i++)
+	printf ("%*d,", w, tb2[j][i]);
+      printf ("%*d},\n", w, tb2[j][MAX_L - 1]);
+    }
+  printf ("{");
+  for (i = 0; i < MAX_L - 1; i++)
+    printf ("%*d,", w, tb2[lc][i]);
+  printf ("%*d}\n", w, tb2[lc][MAX_L - 1]);
+  printf ("};\n\n");
+
+  printf ("%s", PRG);
+}				/*outputh */
+#endif
+
+
+
+
+
+
+
+static void 
+make_trans_func (int num, u_char ** keys)
+{
+  int i, j;
+
+  memset (translate, '\0', sizeof (translate));
+
+  MAX_L = 1;
+  for (i = 0; i < num; i++)
+    {
+      unsigned len = keys[i][0];
+      u_char *s = keys[i] + 1;
+      for (; len; len--, s++)
+	translate[*s] = 1;
+      if (i)
+	{
+	  int l;
+	  l = prefixlen (keys[i - 1], keys[i]);
+	  if (l + 1 > MAX_L)
+	    MAX_L = l + 1;
+	}
+    }
+  j = 0;
+  for (i = 0; i < 256; i++)
+    if (translate[i])
+      translate[i] = j++;
+  MAX_CH = j;
+}
+
+
+static void 
+temp_free (void)
+{
+  if (NODEa)
+    Xfree (NODEa);
+  if (NODEb)
+    Xfree (NODEb);
+  if (NODEc)
+    Xfree (NODEc);
+  if (FIRST)
+    Xfree (FIRST);
+  if (NEXT)
+    Xfree (NEXT);
+  if (S.st)
+    Xfree (S.st);
+  if (mk)
+    Xfree (mk);
+}
+
+static void 
+all_free (void)
+{
+  int i;
+  temp_free ();
+  if (translate)
+    Xfree (translate);
+  if (g)
+    Xfree (g);
+#ifndef STRUCT
+  for (i = 0; i < MAX_CH; i++)
+    {
+      if (tb0 && tb0[i])
+	Xfree (tb0[i]);
+      if (tb1 && tb1[i])
+	Xfree (tb1[i]);
+      if (tb2 && tb2[i])
+	Xfree (tb2[i]);
+    }
+  if (tb0)
+    Xfree (tb0);
+  if (tb1)
+    Xfree (tb1);
+  if (tb2)
+    Xfree (tb2);
+#else
+  for (i = 0; i < MAX_CH; i++)
+    if (tb && tb[i])
+      Xfree (tb[i]);
+  if (tb)
+    Xfree (tb);
+#endif
+}
+
+static int 
+allocate_memory (void)
+{
+  int i, ok = 1;
+  NODEa = (int *) Xmalloc (sizeof (int) * (MAX_M + 1));
+  NODEb = (int *)Xmalloc (sizeof (int) * (MAX_M + 1));
+  NODEc = (int *)Xmalloc (sizeof (int) * (MAX_M + 1));
+  FIRST = (int *)Xmalloc (sizeof (int) * (MAX_N + 1));
+  NEXT = (int *)Xmalloc (sizeof (int) * (MAX_M + 1) * 3);
+  S.st = (int *)Xmalloc (sizeof (int) * MAX_M);
+  mk = (char *)Xmalloc (sizeof (char) * (MAX_N + 1));
+  g = (int *)Xmalloc (sizeof (int) * (MAX_N + 1));
+#ifndef STRUCT
+  tb0 = Xmalloc (sizeof (int *) * MAX_CH);
+  tb1 = Xmalloc (sizeof (int *) * MAX_CH);
+  tb2 = Xmalloc (sizeof (int *) * MAX_CH);
+  for (i = 0; i < MAX_CH; i++)
+    {
+      if (tb0)
+	if (!(tb0[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+      if (tb1)
+	if (!(tb1[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+      if (tb2)
+	if (!(tb2[i] = Xmalloc (sizeof (long) * MAX_L)))
+	    ok = 0;
+    }
+
+  if (!(NODEa && NODEb && NODEc && FIRST && NEXT && S.st && mk && g &&
+	tb0 && tb1 && tb2 && ok))
+    {
+      all_free ();
+      return (-1);
+    }
+#else
+  tb = (tb_entry **)Xmalloc (sizeof (struct tb_entry *) * MAX_CH);
+  for (i = 0; i < MAX_CH; i++)
+    if (tb)
+      if (!(tb[i] = (tb_entry *)Xmalloc (sizeof (struct tb_entry) * MAX_L)))
+	  ok = 0;
+
+  if (!(NODEa && NODEb && NODEc && FIRST && NEXT && S.st && mk && g &&
+	tb && ok))
+    {
+      all_free ();
+      return (-1);
+    }
+#endif
+  return (0);
+}
+
+
+perf_hash_data *
+gen_hash_func (int num, u_char ** keys, int r)
+{
+  int n;
+  perf_hash_data *phd;
+  translate = (u_char *)Xmalloc (sizeof (u_char) * 256);
+  memset(translate, '\0', sizeof (u_char) * 256);  /* [RPAP - Feb 97: WIN32 Port] */
+  make_trans_func (num, keys);
+
+  if (r <= 0)
+    SEED_RANDOM ((long) time ((time_t *) NULL));
+  else
+    SEED_RANDOM (r);
+
+  MAX_M = num + 1;
+
+  MAX_N = MAX_M + MAX_M / 4;
+
+  if (allocate_memory () == -1)
+    return (NULL);
+
+  /* construct an "acyclic" hypergraph */
+  tree_builder (num, keys, &n);
+  /* compute function g */
+  assign (n);
+
+  if (check (num) != 0)
+    FatalError (1, "An error has been detected in the mphf.");
+  temp_free ();
+
+  if (!(phd = (perf_hash_data *)Xmalloc (sizeof (perf_hash_data))))
+    return (NULL);
+
+  memcpy ((void *) g, (const void *) &g[1], n * sizeof (int));
+
+  phd->MAX_L = MAX_L;
+  phd->MAX_N = n;
+  phd->MAX_M = num;
+  phd->MAX_CH = MAX_CH;
+  phd->translate = translate;
+  phd->g = g;
+#ifndef STRUCT
+  phd->tb0 = tb0;
+  phd->tb1 = tb1;
+  phd->tb2 = tb2;
+#else
+  phd->tb = tb;
+#endif
+  return (phd);
+}
+
+int 
+write_perf_hash_data (FILE * f, perf_hash_data * phd)
+{
+  int tot, i;
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONSI(phd->MAX_L);
+  HTONSI(phd->MAX_N);
+  HTONSI(phd->MAX_M);
+  HTONSI(phd->MAX_CH);
+
+  tot = fwrite ((char *) &phd->MAX_L, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_N, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_M, sizeof (int), 1, f) * sizeof (int);
+  tot += fwrite ((char *) &phd->MAX_CH, sizeof (int), 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(phd->MAX_L);
+  NTOHSI(phd->MAX_N);
+  NTOHSI(phd->MAX_M);
+  NTOHSI(phd->MAX_CH);
+
+  tot += fwrite ((char *) phd->translate, sizeof (u_char), 256, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    HTONSI(phd->g[i]);
+
+  tot += fwrite ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+#ifndef STRUCT
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int j;
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  HTONSI(phd->tb0[i][j]);
+	  HTONSI(phd->tb1[i][j]);
+	  HTONSI(phd->tb2[i][j]);
+	}
+
+      tot += fwrite ((char *) phd->tb0[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fwrite ((char *) phd->tb1[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fwrite ((char *) phd->tb2[i], sizeof (int), phd->MAX_L, f) *
+        sizeof (int);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSI(phd->tb0[i][j]);
+	  NTOHSI(phd->tb1[i][j]);
+	  NTOHSI(phd->tb2[i][j]);
+	}
+    }
+#else
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      /* [RPAP - Jan 97: Endian Ordering] */
+      int j;
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  HTONSL(phd->tb[i][j].tb0);
+	  HTONSL(phd->tb[i][j].tb1);
+	  HTONSL(phd->tb[i][j].tb2);
+	}
+
+      tot += fwrite ((char *) phd->tb[i], sizeof (struct tb_entry), phd->MAX_L, f) *
+	sizeof (struct tb_entry);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSL(phd->tb[i][j].tb0);
+	  NTOHSL(phd->tb[i][j].tb1);
+	  NTOHSL(phd->tb[i][j].tb2);
+	}
+    }
+#endif
+  return (tot);
+}
+
+
+perf_hash_data *
+read_perf_hash_data (FILE * f)
+{
+  perf_hash_data *phd;
+  int i, tot, ok = 1;
+  if (!(phd = (perf_hash_data *)Xmalloc (sizeof (perf_hash_data))))
+    return (NULL);
+  tot = fread ((char *) &phd->MAX_L, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_N, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_M, sizeof (int), 1, f) * sizeof (int);
+  tot += fread ((char *) &phd->MAX_CH, sizeof (int), 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHSI(phd->MAX_L);
+  NTOHSI(phd->MAX_N);
+  NTOHSI(phd->MAX_M);
+  NTOHSI(phd->MAX_CH);
+
+  if (tot != 4 * sizeof (int))
+      return (NULL);
+  phd->translate = (u_char *)Xmalloc (sizeof (u_char) * 256);
+  phd->g = (int *)Xmalloc (sizeof (int) * (phd->MAX_N + 1));
+#ifndef STRUCT
+  phd->tb0 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  phd->tb1 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  phd->tb2 = Xmalloc (sizeof (int *) * phd->MAX_CH);
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      if (phd->tb0)
+	if (!(phd->tb0[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+      if (phd->tb1)
+	if (!(phd->tb1[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+      if (phd->tb2)
+	if (!(phd->tb2[i] = Xmalloc (sizeof (long) * phd->MAX_L)))
+	    ok = 0;
+    }
+  if (!(phd->translate && phd->g && phd->tb0 && phd->tb1 && phd->tb2 && ok))
+    {
+      if (phd->translate)
+	Xfree (phd->translate);
+      if (phd->g)
+	Xfree (phd->g);
+      for (i = 0; i < MAX_CH; i++)
+	{
+	  if (phd->tb0 && phd->tb0[i])
+	    Xfree (phd->tb0[i]);
+	  if (phd->tb1 && phd->tb1[i])
+	    Xfree (phd->tb1[i]);
+	  if (phd->tb2 && phd->tb2[i])
+	    Xfree (phd->tb2[i]);
+	}
+      if (phd->tb0)
+	Xfree (phd->tb0);
+      if (phd->tb1)
+	Xfree (phd->tb1);
+      if (phd->tb2)
+	Xfree (phd->tb2);
+      Xfree (phd);
+      return (NULL);
+    }
+  tot += fread ((char *) phd->translate, sizeof (u_char), 256, f);
+  tot += fread ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      int j;
+
+      tot += fread ((char *) phd->tb0[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fread ((char *) phd->tb1[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+      tot += fread ((char *) phd->tb2[i], sizeof (long), phd->MAX_L, f) *
+        sizeof (int);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSI(phd->tb0[i][j]);
+	  NTOHSI(phd->tb1[i][j]);
+	  NTOHSI(phd->tb2[i][j]);
+	}
+    }
+#else
+  phd->tb = (struct tb_entry **)Xmalloc (sizeof (struct tb_entry *) * phd->MAX_CH);
+  for (i = 0; i < phd->MAX_CH; i++)
+    if (phd->tb)
+      if (!(phd->tb[i] = (struct tb_entry *)Xmalloc (sizeof (struct tb_entry) * phd->MAX_L)))
+	  ok = 0;
+  if (!(phd->translate && phd->g && phd->tb && ok))
+    {
+      if (phd->translate)
+	Xfree (phd->translate);
+      if (phd->g)
+	Xfree (phd->g);
+      for (i = 0; i < MAX_CH; i++)
+	if (phd->tb && phd->tb[i])
+	  Xfree (phd->tb[i]);
+      if (phd->tb)
+	Xfree (phd->tb);
+      Xfree (phd);
+      return (NULL);
+    }
+  tot += fread ((char *) phd->translate, sizeof (u_char), 256, f);
+  tot += fread ((char *) phd->g, sizeof (int), phd->MAX_N + 1, f) * sizeof (int);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = 0; i < phd->MAX_N + 1; i++)
+    NTOHSI(phd->g[i]);
+
+  for (i = 0; i < phd->MAX_CH; i++)
+    {
+      int j;
+
+      tot += fread ((char *) phd->tb[i], sizeof (struct tb_entry), phd->MAX_L, f) *
+	sizeof (struct tb_entry);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      for (j = 0; j < phd->MAX_L; j++)
+	{
+	  NTOHSL(phd->tb[i][j].tb0);
+	  NTOHSL(phd->tb[i][j].tb1);
+	  NTOHSL(phd->tb[i][j].tb2);
+	}
+    }
+#endif
+  return (phd);
+}
+
+void 
+free_perf_hash (perf_hash_data * phd)
+{
+  int i;
+  if (phd->translate)
+    Xfree (phd->translate);
+  if (phd->g)
+    Xfree (phd->g);
+  for (i = 0; i < phd->MAX_CH; i++)
+    if (phd->tb && phd->tb[i])
+      Xfree (phd->tb[i]);
+  if (phd->tb)
+    Xfree (phd->tb);
+  Xfree (phd);
+}
+
+
+int 
+perf_hash (perf_hash_data * phd, u_char * s)
+{
+  int u, v, w, i, l;
+  l = *s++;
+  i = (l - 1) % phd->MAX_L;
+  u = v = w = 0;
+  while (l)
+    {
+#ifndef STRUCT
+      if ((u += phd->tb0[phd->translate[*s]][i]) >= phd->MAX_N)
+	u -= phd->MAX_N;
+      if ((v += phd->tb1[phd->translate[*s]][i]) >= phd->MAX_N)
+	v -= phd->MAX_N;
+      if ((w += phd->tb2[phd->translate[*s]][i]) >= phd->MAX_N)
+	w -= phd->MAX_N;
+#else
+      struct tb_entry *tbp = &phd->tb[phd->translate[*s]][i];
+      if ((u += tbp->tb0) >= phd->MAX_N)
+	u -= phd->MAX_N;
+      if ((v += tbp->tb1) >= phd->MAX_N)
+	v -= phd->MAX_N;
+      if ((w += tbp->tb2) >= phd->MAX_N)
+	w -= phd->MAX_N;
+#endif
+      if (++i >= phd->MAX_L)
+	i = 0;
+      l--;
+      s++;
+    }
+  if (u == v && ++v >= phd->MAX_N)
+    v = 0;
+  if (w == v)
+    {
+      if (++w >= phd->MAX_N)
+	w = 0;
+      if (w == u && ++w >= phd->MAX_N)
+	w = 0;
+    }
+  else if (w == u)
+    {
+      if (++w >= phd->MAX_N)
+	w = 0;
+      if (w == v && ++w >= phd->MAX_N)
+	w = 0;
+    }
+  return ((phd->g[u] ^ phd->g[v] ^ phd->g[w]) > phd->MAX_M) ? 0 :
+    (phd->g[u] ^ phd->g[v] ^ phd->g[w]);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/perf_hash.h	(revision 21083)
@@ -0,0 +1,52 @@
+/**************************************************************************
+ *
+ * perf_hash.h -- Perfect hashing functions
+ * Copyright (C) 1994  Bohdan S. Majewski and Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_PERF_HASH
+#define H_PERF_HASH
+
+struct tb_entry
+  {
+    long tb0, tb1, tb2;
+  };
+
+typedef struct
+  {
+    int MAX_L;
+    int MAX_N;
+    int MAX_M;
+    int MAX_CH;
+    u_char *translate;
+    int *g;
+    struct tb_entry **tb;
+  }
+perf_hash_data;
+
+perf_hash_data *gen_hash_func (int num, u_char ** keys, int r);
+
+int perf_hash (perf_hash_data * phd, u_char * s);
+
+int write_perf_hash_data (FILE * f, perf_hash_data * phd);
+
+void free_perf_hash (perf_hash_data * phd);
+
+perf_hash_data *read_perf_hash_data (FILE * f);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/random.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/random.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/random.cpp	(revision 21083)
@@ -0,0 +1,211 @@
+/**************************************************************************
+ *
+ * random.c -- pseudo random number generator
+ * Copyright (C) 1994  Chris Wallace (csw@bruce.cs.monash.edu.au)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+/*
+ *	A random number generator called as a function by
+ *	random (iseed)	or	irandm (iseed)
+ *	The parameter should be a pointer to a 2-element long vector.
+ *	The first function returns a double uniform in 0 .. 1.
+ *	The second returns a long integer uniform in 0 .. 2**31-1
+ *	Both update iseed[] in exactly the same way.
+ *	iseed[] must be a 2-element integer vector.
+ *	The initial value of the second element may be anything.
+ *
+ *	The period of the random sequence is 2**32 * (2**32-1)
+ *	The table mt[0:127] is defined by mt[i] = 69069 ** (128-i)
+ */
+
+#define MASK ((long) 593970775)
+/*	or in hex, 23674657	*/
+
+#define SCALE ((double) 1.0 / (1024.0 * 1024.0 * 1024.0 * 2.0))
+/*	i.e. 2 to power -31	*/
+
+static long mt [128] =   {
+      902906369,
+     2030498053,
+     -473499623,
+     1640834941,
+      723406961,
+     1993558325,
+     -257162999,
+    -1627724755,
+      913952737,
+      278845029,
+     1327502073,
+    -1261253155,
+      981676113,
+    -1785280363,
+     1700077033,
+      366908557,
+    -1514479167,
+     -682799163,
+      141955545,
+     -830150595,
+      317871153,
+     1542036469,
+     -946413879,
+    -1950779155,
+      985397153,
+      626515237,
+      530871481,
+      783087261,
+    -1512358895,
+     1031357269,
+    -2007710807,
+    -1652747955,
+    -1867214463,
+      928251525,
+     1243003801,
+    -2132510467,
+     1874683889,
+     -717013323,
+      218254473,
+    -1628774995,
+    -2064896159,
+       69678053,
+      281568889,
+    -2104168611,
+     -165128239,
+     1536495125,
+      -39650967,
+      546594317,
+     -725987007,
+     1392966981,
+     1044706649,
+      687331773,
+    -2051306575,
+     1544302965,
+     -758494647,
+    -1243934099,
+      -75073759,
+      293132965,
+    -1935153095,
+      118929437,
+      807830417,
+    -1416222507,
+    -1550074071,
+      -84903219,
+     1355292929,
+     -380482555,
+    -1818444007,
+     -204797315,
+      170442609,
+    -1636797387,
+      868931593,
+     -623503571,
+     1711722209,
+      381210981,
+     -161547783,
+     -272740131,
+    -1450066095,
+     2116588437,
+     1100682473,
+      358442893,
+    -1529216831,
+     2116152005,
+     -776333095,
+     1265240893,
+     -482278607,
+     1067190005,
+      333444553,
+       86502381,
+      753481377,
+       39000101,
+     1779014585,
+      219658653,
+     -920253679,
+     2029538901,
+     1207761577,
+    -1515772851,
+     -236195711,
+      442620293,
+      423166617,
+    -1763648515,
+     -398436623,
+    -1749358155,
+     -538598519,
+     -652439379,
+      430550625,
+    -1481396507,
+     2093206905,
+    -1934691747,
+     -962631983,
+     1454463253,
+    -1877118871,
+     -291917555,
+    -1711673279,
+      201201733,
+     -474645415,
+      -96764739,
+    -1587365199,
+     1945705589,
+     1303896393,
+     1744831853,
+      381957665,
+     2135332261,
+      -55996615,
+    -1190135011,
+     1790562961,
+    -1493191723,
+      475559465,
+          69069
+		};
+
+double 
+random (long is [2])
+{
+	long it, leh, nit;
+
+	it = is [0];
+	leh = is [1];
+	if (it <= 0)	
+		it = (it + it) ^ MASK;
+	else
+		it = it + it;
+	nit = it - 1;
+/*	to ensure all-ones pattern omitted    */
+	leh = leh * mt[nit & 127] + nit;
+	is [0] = it;    is [1] = leh;
+	if (leh < 0) leh = ~leh;
+	return (SCALE * ((long) (leh | 1)));
+}
+
+
+
+long 
+irandm (long is [2])
+{
+	long it, leh, nit;
+
+	it = is [0];
+	leh = is [1];
+	if (it <= 0)	
+		it = (it + it) ^ MASK;
+	else
+		it = it + it;
+	nit = it - 1;
+/*	to ensure all-ones pattern omitted    */
+	leh = leh * mt[nit & 127] + nit;
+	is [0] = it;    is [1] = leh;
+	if (leh < 0) leh = ~leh;
+	return (leh);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/random.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/random.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/random.h	(revision 21083)
@@ -0,0 +1,42 @@
+/**************************************************************************
+ *
+ * random.h -- pseudo random number generator
+ * Copyright (C) 1994  Chris Wallace (csw@bruce.cs.monash.edu.au)
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef RANDOM_H
+#define RANDOM_H
+
+/*
+ *	A random number generator called as a function by
+ *	random (iseed)	or	irandm (iseed)
+ *	The parameter should be a pointer to a 2-element long vector.
+ *	The first function returns a double uniform in 0 .. 1.
+ *	The second returns a long integer uniform in 0 .. 2**31-1
+ *	Both update iseed[] in exactly the same way.
+ *	iseed[] must be a 2-element integer vector.
+ *	The initial value of the second element may be anything.
+ *
+ *	The period of the random sequence is 2**32 * (2**32-1)
+ *	The table mt[0:127] is defined by mt[i] = 69069 ** (128-i)
+ */
+
+double random (long is [2]);
+long irandm (long is [2]);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.cpp	(revision 21083)
@@ -0,0 +1,70 @@
+/**************************************************************************
+ *
+ * simplefrenchstem.c -- a simple french stemmer
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "simplefrenchstem.h"
+#include "unitool.h"
+
+
+/* =========================================================================
+ * Function: simplefrenchstem
+ * Description: a simple french stemmer
+ * Input: a word string with the length in the first byte
+ * Output: the stemmed word
+ * ========================================================================= */
+
+void simplefrenchstem (unsigned char *word) {      
+  unsigned short out[256]; /* temp space */
+  unsigned short *wordstart; /* points to first letter of word */
+  int last;                  /* last points to the last character */
+
+  /* decode */
+  utf8_word_to_unicode (word, out, 255);
+  wordstart = out + 1;
+  last = out[0]-1;
+  
+
+  if (last > 4) {
+    if (wordstart[last]=='x') {
+      if (wordstart[last-1]=='u' && wordstart[last-2]=='a') {
+	wordstart[last-1]='l';
+      }
+      last--;
+
+    } else {
+      if (last>=0 && wordstart[last]=='s') last--;
+      if (last>=0 && wordstart[last]=='r') last--;
+      if (last>=0 && wordstart[last]=='e') last--;
+
+      /* letter with accent e + ' -- there are two possible encodings  */
+      if (last>=0 && wordstart[last]==0xe9) { 
+	last--;
+      } else if (last>=1 && wordstart[last-1]=='e' && wordstart[last]==0x301) {
+	last -= 2; 
+      }
+
+      if (last >= 1 && wordstart[last]==wordstart[last-1]) last--;
+    }  /* end else */
+
+    out[0] = (unsigned char)(last+1);
+  } /* end if (len > 4) */
+
+  /* re-code, make sure the result is not longer than the input */
+  unicode_to_utf8_word (out, word, word[0]+1);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/simplefrenchstem.h	(revision 21083)
@@ -0,0 +1,26 @@
+/**************************************************************************
+ *
+ * simplefrenchstem.h -- a simple french stemmer
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef SIMPLEFRENCHSTEM_H
+#define SIMPLEFRENCHSTEM_H
+
+void simplefrenchstem (unsigned char *word);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/strcasecmp.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/strcasecmp.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/strcasecmp.cpp	(revision 21083)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific written prior permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)strcasecmp.c	5.5 (Berkeley) 11/24/87";
+#endif /* LIBC_SCCS and not lint */
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char charmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+int
+strcasecmp(char *s1, char *s2)
+{
+    register unsigned char u1, u2;
+
+    for (;;) {
+	u1 = (unsigned char) *s1++;
+	u2 = (unsigned char) *s2++;
+	if (charmap[u1] != charmap[u2]) {
+	    return charmap[u1] - charmap[u2];
+	}
+	if (u1 == '\0') {
+	    return 0;
+	}
+    }
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/strstr.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/strstr.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/strstr.cpp	(revision 21083)
@@ -0,0 +1,42 @@
+/* strstr.c -- return the offset of one string within another
+   Copyright (C) 1989, 1990 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by Mike Rendell <michael@cs.mun.ca>.  */
+
+/* Return the starting address of string S2 in S1;
+   return 0 if it is not found. */
+
+char *
+strstr (char *s1, char *s2)
+{
+  int i;
+  char *p1;
+  char *p2;
+  char *s = s1;
+
+  for (p2 = s2, i = 0; *s; p2 = s2, i++, s++)
+    {
+      for (p1 = s; *p1 && *p2 && *p1 == *p2; p1++, p2++)
+	;
+      if (!*p2)
+	break;
+    }
+  if (!*p2)
+    return s1 + i;
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.cpp	(revision 21083)
@@ -0,0 +1,6 @@
+#include <stdlib.h>
+
+void *bcopy(void *s, void *d, int n)
+{ return memcpy(d, s, n);
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/sysfuncs.h	(revision 21083)
@@ -0,0 +1,388 @@
+/* System dependent definitions for GNU tar.
+   Copyright (C) 1994 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ * [TS:Aug/95]
+ * Based on code from system.h file in GNU's tar package 
+ *
+ */
+
+#ifndef SYSFUNCS_H
+#define SYSFUNCS_H
+
+#include <sys/stat.h>
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__
+#  include <WIN32cfg.h>
+# else
+#  include <config.h>
+# endif
+#endif
+
+/* Declare alloca.  AIX requires this to be the first thing in the file.  */
+
+#ifdef __GNUC__
+#ifndef alloca
+#define alloca __builtin_alloca
+#endif
+#else
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else
+#ifdef _AIX
+#pragma alloca
+#else
+#ifndef alloca
+char *alloca ();
+#endif
+#endif
+#endif
+#endif
+
+#include <sys/types.h>
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95]
+ * Some extra include files that mg needs
+ */
+#include <stdlib.h>
+#include <math.h>
+
+#ifndef log2
+# ifndef M_LN2
+#  define M_LN2 0.69314718055994530942
+# endif
+# define log2(x) (log(x)/M_LN2)
+#endif
+
+
+#ifndef HAVE_SETBUFFER
+#ifdef __CYGWIN__ 
+/* Cygwin has setbuffer in stdio.h, but can't link against it!! */
+#include <stdio.h>
+#endif
+# define setbuffer(f, b, s)  setvbuf(f, b, _IOFBF, s)
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if defined(__MSDOS__)  && !defined(__WIN32__)
+# define SHORT_SUFFIX 1
+#endif
+
+
+
+#include <assert.h>
+
+/* ------------------------------------------------- */
+
+/* Declare a generic pointer type.  */
+#if __STDC__ || defined(__TURBOC__)
+#define voidstar void *
+#else
+#define voidstar char *
+#endif
+
+/* Declare ISASCII.  */
+
+#include <ctype.h>
+
+#if STDC_HEADERS
+#define ISASCII(Char) 1
+#else
+#ifdef isascii
+#define ISASCII(Char) isascii (Char)
+#else
+#if HAVE_ISASCII
+#define ISASCII(Char) isascii (Char)
+#else
+#define ISASCII(Char) 1
+#endif
+#endif
+#endif
+
+
+/* ------------------------------------------------- */
+/* [TS:Aug/95] 
+ * The following is copied from GNU Autoconf.Info (1.1)   
+ * It sets up the approriate string and memory functions.
+ */
+
+#if STDC_HEADERS || HAVE_STRING_H
+#include <string.h>
+   /* An ANSI string.h and pre-ANSI memory.h might conflict */
+#if !STDC_HEADERS && HAVE_MEMORY_H
+#include <memory.h>
+#endif /* not STDC_HEADERS and HAVE_MEMORY_H */
+#ifndef index
+/*#define index strchr 
+ *
+ * this is stuffing up our code so its commented out */
+#endif
+#ifndef rindex
+#define rindex strrchr
+#endif
+
+#ifdef __cplusplus /* compiling for C++ */
+#include <stdlib.h>
+#ifndef __bcopy
+inline void *bcopy(void *s, void *d, int n)
+{ return memcpy(d, s, n);
+}
+#define __bcopy 1
+#endif
+#ifndef __bcmp
+inline int bcmp(void *s1, void *s2, int n)
+{ return memcmp(s1, s2, n);
+}
+#define __bcmp 1
+#endif
+#ifndef __bzero
+inline void bzero(void *m, int n)
+{ memset(m, 0, n);
+}
+#define __bzero 1
+#endif
+#else              /* compiling for C */
+#ifndef bcopy
+#define bcopy(s, d, n) memcpy((d), (s), (n))
+#endif
+#ifndef bcmp
+#define bcmp(s1, s2, n) memcmp((s1), (s2), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n) memset((s), 0, (n))
+#endif
+#endif
+
+#else /* not STDC_HEADERS and not HAVE_STRING_H */
+#include <strings.h>
+   /* memory.h and strings.h conflict on some systems */
+#endif
+/* ------------------------------------------------- */
+
+
+/* Declare errno.  */
+
+#include <errno.h>
+#ifndef errno
+extern int errno;
+#endif
+
+/* Declare open parameters.  */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#else
+#include <sys/file.h>
+#endif
+
+#ifndef	O_BINARY
+#define O_BINARY 0
+#endif
+#ifndef O_CREAT
+#define O_CREAT 0
+#endif
+#ifndef	O_NDELAY
+#define O_NDELAY 0
+#endif
+#ifndef	O_RDONLY
+#define O_RDONLY 0
+#endif
+#ifndef O_RDWR
+#define O_RDWR 2
+#endif
+
+/* Declare file status routines and bits.  */
+
+#ifdef STAT_MACROS_BROKEN
+#undef S_ISBLK
+#undef S_ISCHR
+#undef S_ISDIR
+#undef S_ISFIFO
+#undef S_ISLNK
+#undef S_ISMPB
+#undef S_ISMPC
+#undef S_ISNWK
+#undef S_ISREG
+#undef S_ISSOCK
+#endif
+
+/* On MSDOS, there are missing things from <sys/stat.h>.  */
+#ifdef __MSDOS__
+#define S_ISUID 0
+#define S_ISGID 0
+#define S_ISVTX 0
+#endif
+
+#ifndef S_ISREG			/* POSIX.1 stat stuff missing */
+#define mode_t unsigned short
+#endif
+#if !defined(S_ISBLK) && defined(S_IFBLK)
+#define S_ISBLK(Mode) (((Mode) & S_IFMT) == S_IFBLK)
+#endif
+#if !defined(S_ISCHR) && defined(S_IFCHR)
+#define S_ISCHR(Mode) (((Mode) & S_IFMT) == S_IFCHR)
+#endif
+#if !defined(S_ISDIR) && defined(S_IFDIR)
+#define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
+#endif
+#if !defined(S_ISREG) && defined(S_IFREG)
+#define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
+#endif
+#if !defined(S_ISFIFO) && defined(S_IFIFO)
+#define S_ISFIFO(Mode) (((Mode) & S_IFMT) == S_IFIFO)
+#endif
+#if !defined(S_ISLNK) && defined(S_IFLNK)
+#define S_ISLNK(Mode) (((Mode) & S_IFMT) == S_IFLNK)
+#endif
+#if !defined(S_ISSOCK) && defined(S_IFSOCK)
+#define S_ISSOCK(Mode) (((Mode) & S_IFMT) == S_IFSOCK)
+#endif
+#if !defined(S_ISMPB) && defined(S_IFMPB)	/* V7 */
+#define S_ISMPB(Mode) (((Mode) & S_IFMT) == S_IFMPB)
+#define S_ISMPC(Mode) (((Mode) & S_IFMT) == S_IFMPC)
+#endif
+#if !defined(S_ISNWK) && defined(S_IFNWK)	/* HP/UX */
+#define S_ISNWK(Mode) (((Mode) & S_IFMT) == S_IFNWK)
+#endif
+
+#if !defined(S_ISCTG) && defined(S_IFCTG)	/* contiguous file */
+#define S_ISCTG(Mode) (((Mode) & S_IFMT) == S_IFCTG)
+#endif
+#if !defined(S_ISVTX)
+#define S_ISVTX 0001000
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#if !defined(_POSIX_SOURCE) && !defined(__WIN32__)
+#include <sys/param.h>
+#endif
+
+/* Include <unistd.h> before any preprocessor test of _POSIX_VERSION.  */
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+
+/* Declare standard functions.  */
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+voidstar malloc ();
+voidstar realloc ();
+char *getenv ();
+#endif
+
+#include <stdio.h>
+
+#ifndef _POSIX_VERSION
+#ifdef __MSDOS__
+#include <io.h>
+#else
+off_t lseek ();
+#endif
+#endif
+
+#ifndef __WIN32__
+#include <pathmax.h>
+#endif
+
+/* Until getoptold function is declared in getopt.h, we need this here for
+   struct option.  */
+/*#include <getopt.h>*/
+
+#ifdef WITH_DMALLOC
+#undef HAVE_VALLOC
+#define DMALLOC_FUNC_CHECK
+#include <dmalloc.h>
+#endif
+
+/* Prototypes for external functions.  */
+
+#ifndef __P
+#if PROTOTYPES
+#define __P(Args) Args
+#else
+#define __P(Args) ()
+#endif
+#endif
+
+#if HAVE_LOCALE_H
+#include <locale.h>
+#endif
+/*** setlocale is ansi and posix...(jrm21)
+#if !HAVE_SETLOCALE
+#define setlocale(Category, Locale)
+#endif
+***/
+
+#if ENABLE_NLS
+#include <libintl.h>
+#define _(Text) gettext (Text)
+#else
+#define textdomain(Domain)
+#define _(Text) Text
+#endif
+
+/* Library modules.  */
+
+#ifdef HAVE_VPRINTF
+void error __P ((int, int, const char *,...));
+#else
+void error ();
+#endif
+
+#ifndef HAVE_STRSTR
+char *strstr __P ((const char *, const char *));
+#endif
+
+/* [RB/TS:Oct/95] commented out. Used by lib/gmalloc.c - but it defines it anyway ???
+ *#ifndef HAVE_VALLOC
+ *#define valloc(Size) malloc (Size)
+ *#endif
+ */
+
+voidstar xmalloc __P ((size_t));
+voidstar xrealloc __P ((voidstar, size_t));
+char *xstrdup __P ((const char *));
+
+/* [TS:Aug/95] 
+ * These were required by files which referred 
+ * to these as function pointers. 
+ * e.g. huffman.c - fread,  mgfelics.c - fgetc
+ */
+#ifndef HAVE_FREAD_DECL
+extern size_t   fread __P ((void *, size_t, size_t, FILE *));
+#endif
+#ifndef HAVE_FGETC_DECL
+extern int      fgetc __P ((FILE *));
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifndef u_long
+# define u_long unsigned long
+#endif
+#ifndef u_char
+# define u_char unsigned char
+#endif
+
+
+#endif /* SYSFUNCS_H */
Index: /main/tags/2.38/gsdl/src/mgpp/lib/unitool.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/unitool.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/unitool.cpp	(revision 21083)
@@ -0,0 +1,1756 @@
+#include "unitool.h"
+#include "sysfuncs.h"
+
+
+/* unicode_cat_data is a combination of the letter, digit, and
+ * space information in a form that is quick to look up.
+ * The information about each byte is stored in two bits
+ *
+ * 00 - neither letter, digit or space
+ * 01 - letter
+ * 10 - space
+ * 11 - digit
+ *
+ * You can test for letter | space by looking at the right
+ * column
+ */
+unsigned long *unicode_cat_data=NULL;
+
+
+typedef struct unidecompose {
+  unsigned short ch;
+  unsigned short str[3];
+} unidecompose;
+
+typedef struct unirelate {
+  unsigned short ch1;
+  unsigned short ch2;
+} unirelate;
+
+typedef struct unirange {
+  unsigned short first;
+  unsigned short last;
+} unirange;
+
+
+
+/* This decomposition data only includes canonical decompositional
+ * characters.  Any unused bytes are set to 0x0. */
+
+#define NUM_DECOMPOSE_INFO 1269
+static const unidecompose decompose_info[NUM_DECOMPOSE_INFO] = {
+  {0xC0,0x41,0x300,0x0}, {0xC1,0x41,0x301,0x0}, {0xC2,0x41,0x302,0x0}, 
+  {0xC3,0x41,0x303,0x0}, {0xC4,0x41,0x308,0x0}, {0xC5,0x41,0x30A,0x0}, 
+  {0xC7,0x43,0x327,0x0}, {0xC8,0x45,0x300,0x0}, {0xC9,0x45,0x301,0x0}, 
+  {0xCA,0x45,0x302,0x0}, {0xCB,0x45,0x308,0x0}, {0xCC,0x49,0x300,0x0}, 
+  {0xCD,0x49,0x301,0x0}, {0xCE,0x49,0x302,0x0}, {0xCF,0x49,0x308,0x0}, 
+  {0xD1,0x4E,0x303,0x0}, {0xD2,0x4F,0x300,0x0}, {0xD3,0x4F,0x301,0x0}, 
+  {0xD4,0x4F,0x302,0x0}, {0xD5,0x4F,0x303,0x0}, {0xD6,0x4F,0x308,0x0}, 
+  {0xD9,0x55,0x300,0x0}, {0xDA,0x55,0x301,0x0}, {0xDB,0x55,0x302,0x0}, 
+  {0xDC,0x55,0x308,0x0}, {0xDD,0x59,0x301,0x0}, {0xE0,0x61,0x300,0x0}, 
+  {0xE1,0x61,0x301,0x0}, {0xE2,0x61,0x302,0x0}, {0xE3,0x61,0x303,0x0}, 
+  {0xE4,0x61,0x308,0x0}, {0xE5,0x61,0x30A,0x0}, {0xE7,0x63,0x327,0x0}, 
+  {0xE8,0x65,0x300,0x0}, {0xE9,0x65,0x301,0x0}, {0xEA,0x65,0x302,0x0}, 
+  {0xEB,0x65,0x308,0x0}, {0xEC,0x69,0x300,0x0}, {0xED,0x69,0x301,0x0}, 
+  {0xEE,0x69,0x302,0x0}, {0xEF,0x69,0x308,0x0}, {0xF1,0x6E,0x303,0x0}, 
+  {0xF2,0x6F,0x300,0x0}, {0xF3,0x6F,0x301,0x0}, {0xF4,0x6F,0x302,0x0}, 
+  {0xF5,0x6F,0x303,0x0}, {0xF6,0x6F,0x308,0x0}, {0xF9,0x75,0x300,0x0}, 
+  {0xFA,0x75,0x301,0x0}, {0xFB,0x75,0x302,0x0}, {0xFC,0x75,0x308,0x0}, 
+  {0xFD,0x79,0x301,0x0}, {0xFF,0x79,0x308,0x0}, {0x100,0x41,0x304,0x0}, 
+  {0x101,0x61,0x304,0x0}, {0x102,0x41,0x306,0x0}, {0x103,0x61,0x306,0x0}, 
+  {0x104,0x41,0x328,0x0}, {0x105,0x61,0x328,0x0}, {0x106,0x43,0x301,0x0}, 
+  {0x107,0x63,0x301,0x0}, {0x108,0x43,0x302,0x0}, {0x109,0x63,0x302,0x0}, 
+  {0x10A,0x43,0x307,0x0}, {0x10B,0x63,0x307,0x0}, {0x10C,0x43,0x30C,0x0}, 
+  {0x10D,0x63,0x30C,0x0}, {0x10E,0x44,0x30C,0x0}, {0x10F,0x64,0x30C,0x0}, 
+  {0x112,0x45,0x304,0x0}, {0x113,0x65,0x304,0x0}, {0x114,0x45,0x306,0x0}, 
+  {0x115,0x65,0x306,0x0}, {0x116,0x45,0x307,0x0}, {0x117,0x65,0x307,0x0}, 
+  {0x118,0x45,0x328,0x0}, {0x119,0x65,0x328,0x0}, {0x11A,0x45,0x30C,0x0}, 
+  {0x11B,0x65,0x30C,0x0}, {0x11C,0x47,0x302,0x0}, {0x11D,0x67,0x302,0x0}, 
+  {0x11E,0x47,0x306,0x0}, {0x11F,0x67,0x306,0x0}, {0x120,0x47,0x307,0x0}, 
+  {0x121,0x67,0x307,0x0}, {0x122,0x47,0x327,0x0}, {0x123,0x67,0x327,0x0}, 
+  {0x124,0x48,0x302,0x0}, {0x125,0x68,0x302,0x0}, {0x128,0x49,0x303,0x0}, 
+  {0x129,0x69,0x303,0x0}, {0x12A,0x49,0x304,0x0}, {0x12B,0x69,0x304,0x0}, 
+  {0x12C,0x49,0x306,0x0}, {0x12D,0x69,0x306,0x0}, {0x12E,0x49,0x328,0x0}, 
+  {0x12F,0x69,0x328,0x0}, {0x130,0x49,0x307,0x0}, {0x134,0x4A,0x302,0x0}, 
+  {0x135,0x6A,0x302,0x0}, {0x136,0x4B,0x327,0x0}, {0x137,0x6B,0x327,0x0}, 
+  {0x139,0x4C,0x301,0x0}, {0x13A,0x6C,0x301,0x0}, {0x13B,0x4C,0x327,0x0}, 
+  {0x13C,0x6C,0x327,0x0}, {0x13D,0x4C,0x30C,0x0}, {0x13E,0x6C,0x30C,0x0}, 
+  {0x143,0x4E,0x301,0x0}, {0x144,0x6E,0x301,0x0}, {0x145,0x4E,0x327,0x0}, 
+  {0x146,0x6E,0x327,0x0}, {0x147,0x4E,0x30C,0x0}, {0x148,0x6E,0x30C,0x0}, 
+  {0x14C,0x4F,0x304,0x0}, {0x14D,0x6F,0x304,0x0}, {0x14E,0x4F,0x306,0x0}, 
+  {0x14F,0x6F,0x306,0x0}, {0x150,0x4F,0x30B,0x0}, {0x151,0x6F,0x30B,0x0}, 
+  {0x154,0x52,0x301,0x0}, {0x155,0x72,0x301,0x0}, {0x156,0x52,0x327,0x0}, 
+  {0x157,0x72,0x327,0x0}, {0x158,0x52,0x30C,0x0}, {0x159,0x72,0x30C,0x0}, 
+  {0x15A,0x53,0x301,0x0}, {0x15B,0x73,0x301,0x0}, {0x15C,0x53,0x302,0x0}, 
+  {0x15D,0x73,0x302,0x0}, {0x15E,0x53,0x327,0x0}, {0x15F,0x73,0x327,0x0}, 
+  {0x160,0x53,0x30C,0x0}, {0x161,0x73,0x30C,0x0}, {0x162,0x54,0x327,0x0}, 
+  {0x163,0x74,0x327,0x0}, {0x164,0x54,0x30C,0x0}, {0x165,0x74,0x30C,0x0}, 
+  {0x168,0x55,0x303,0x0}, {0x169,0x75,0x303,0x0}, {0x16A,0x55,0x304,0x0}, 
+  {0x16B,0x75,0x304,0x0}, {0x16C,0x55,0x306,0x0}, {0x16D,0x75,0x306,0x0}, 
+  {0x16E,0x55,0x30A,0x0}, {0x16F,0x75,0x30A,0x0}, {0x170,0x55,0x30B,0x0}, 
+  {0x171,0x75,0x30B,0x0}, {0x172,0x55,0x328,0x0}, {0x173,0x75,0x328,0x0}, 
+  {0x174,0x57,0x302,0x0}, {0x175,0x77,0x302,0x0}, {0x176,0x59,0x302,0x0}, 
+  {0x177,0x79,0x302,0x0}, {0x178,0x59,0x308,0x0}, {0x179,0x5A,0x301,0x0}, 
+  {0x17A,0x7A,0x301,0x0}, {0x17B,0x5A,0x307,0x0}, {0x17C,0x7A,0x307,0x0}, 
+  {0x17D,0x5A,0x30C,0x0}, {0x17E,0x7A,0x30C,0x0}, {0x1A0,0x4F,0x31B,0x0}, 
+  {0x1A1,0x6F,0x31B,0x0}, {0x1AF,0x55,0x31B,0x0}, {0x1B0,0x75,0x31B,0x0}, 
+  {0x1CD,0x41,0x30C,0x0}, {0x1CE,0x61,0x30C,0x0}, {0x1CF,0x49,0x30C,0x0}, 
+  {0x1D0,0x69,0x30C,0x0}, {0x1D1,0x4F,0x30C,0x0}, {0x1D2,0x6F,0x30C,0x0}, 
+  {0x1D3,0x55,0x30C,0x0}, {0x1D4,0x75,0x30C,0x0}, {0x1D5,0xDC,0x304,0x0}, 
+  {0x1D6,0xFC,0x304,0x0}, {0x1D7,0xDC,0x301,0x0}, {0x1D8,0xFC,0x301,0x0}, 
+  {0x1D9,0xDC,0x30C,0x0}, {0x1DA,0xFC,0x30C,0x0}, {0x1DB,0xDC,0x300,0x0}, 
+  {0x1DC,0xFC,0x300,0x0}, {0x1DE,0xC4,0x304,0x0}, {0x1DF,0xE4,0x304,0x0}, 
+  {0x1E0,0x41,0x307,0x304}, {0x1E1,0x61,0x307,0x304}, {0x1E2,0xC6,0x304,0x0}, 
+  {0x1E3,0xE6,0x304,0x0}, {0x1E6,0x47,0x30C,0x0}, {0x1E7,0x67,0x30C,0x0}, 
+  {0x1E8,0x4B,0x30C,0x0}, {0x1E9,0x6B,0x30C,0x0}, {0x1EA,0x4F,0x328,0x0}, 
+  {0x1EB,0x6F,0x328,0x0}, {0x1EC,0x1EA,0x304,0x0}, {0x1ED,0x1EB,0x304,0x0}, 
+  {0x1EE,0x1B7,0x30C,0x0}, {0x1EF,0x292,0x30C,0x0}, {0x1F0,0x6A,0x30C,0x0}, 
+  {0x1F4,0x47,0x301,0x0}, {0x1F5,0x67,0x301,0x0}, {0x1FA,0xC5,0x301,0x0}, 
+  {0x1FB,0xE5,0x301,0x0}, {0x1FC,0xC6,0x301,0x0}, {0x1FD,0xE6,0x301,0x0}, 
+  {0x1FE,0xD8,0x301,0x0}, {0x1FF,0xF8,0x301,0x0}, {0x200,0x41,0x30F,0x0}, 
+  {0x201,0x61,0x30F,0x0}, {0x202,0x41,0x311,0x0}, {0x203,0x61,0x311,0x0}, 
+  {0x204,0x45,0x30F,0x0}, {0x205,0x65,0x30F,0x0}, {0x206,0x45,0x311,0x0}, 
+  {0x207,0x65,0x311,0x0}, {0x208,0x49,0x30F,0x0}, {0x209,0x69,0x30F,0x0}, 
+  {0x20A,0x49,0x311,0x0}, {0x20B,0x69,0x311,0x0}, {0x20C,0x4F,0x30F,0x0}, 
+  {0x20D,0x6F,0x30F,0x0}, {0x20E,0x4F,0x311,0x0}, {0x20F,0x6F,0x311,0x0}, 
+  {0x210,0x52,0x30F,0x0}, {0x211,0x72,0x30F,0x0}, {0x212,0x52,0x311,0x0}, 
+  {0x213,0x72,0x311,0x0}, {0x214,0x55,0x30F,0x0}, {0x215,0x75,0x30F,0x0}, 
+  {0x216,0x55,0x311,0x0}, {0x217,0x75,0x311,0x0}, {0x310,0x306,0x307,0x0}, 
+  {0x340,0x300,0x0,0x0}, {0x341,0x301,0x0,0x0}, {0x343,0x313,0x0,0x0}, 
+  {0x344,0x308,0x30D,0x0}, {0x374,0x2B9,0x0,0x0}, {0x37E,0x3B,0x0,0x0}, 
+  {0x385,0xA8,0x30D,0x0}, {0x386,0x391,0x30D,0x0}, {0x387,0xB7,0x0,0x0}, 
+  {0x388,0x395,0x30D,0x0}, {0x389,0x397,0x30D,0x0}, {0x38A,0x399,0x30D,0x0}, 
+  {0x38C,0x39F,0x30D,0x0}, {0x38E,0x3A5,0x30D,0x0}, {0x38F,0x3A9,0x30D,0x0}, 
+  {0x390,0x3B9,0x344,0x0}, {0x3AA,0x399,0x308,0x0}, {0x3AB,0x3A5,0x308,0x0}, 
+  {0x3AC,0x3B1,0x30D,0x0}, {0x3AD,0x3B5,0x30D,0x0}, {0x3AE,0x3B7,0x30D,0x0}, 
+  {0x3AF,0x3B9,0x30D,0x0}, {0x3B0,0x3C5,0x344,0x0}, {0x3CA,0x3B9,0x308,0x0}, 
+  {0x3CB,0x3C5,0x308,0x0}, {0x3CC,0x3BF,0x30D,0x0}, {0x3CD,0x3C5,0x30D,0x0}, 
+  {0x3CE,0x3C9,0x30D,0x0}, {0x3D3,0x3D2,0x30D,0x0}, {0x3D4,0x3D2,0x308,0x0}, 
+  {0x401,0x415,0x308,0x0}, {0x403,0x413,0x301,0x0}, {0x407,0x406,0x308,0x0}, 
+  {0x40C,0x41A,0x301,0x0}, {0x40E,0x423,0x306,0x0}, {0x419,0x418,0x306,0x0}, 
+  {0x439,0x438,0x306,0x0}, {0x451,0x435,0x308,0x0}, {0x453,0x433,0x301,0x0}, 
+  {0x457,0x456,0x308,0x0}, {0x45C,0x43A,0x301,0x0}, {0x45E,0x443,0x306,0x0}, 
+  {0x476,0x474,0x30F,0x0}, {0x477,0x475,0x30F,0x0}, {0x4C1,0x416,0x306,0x0}, 
+  {0x4C2,0x436,0x306,0x0}, {0x4D0,0x410,0x306,0x0}, {0x4D1,0x430,0x306,0x0}, 
+  {0x4D2,0x410,0x308,0x0}, {0x4D3,0x430,0x308,0x0}, {0x4D6,0x415,0x306,0x0}, 
+  {0x4D7,0x435,0x306,0x0}, {0x4DA,0x4D8,0x308,0x0}, {0x4DB,0x4D9,0x308,0x0}, 
+  {0x4DC,0x416,0x308,0x0}, {0x4DD,0x436,0x308,0x0}, {0x4DE,0x417,0x308,0x0}, 
+  {0x4DF,0x437,0x308,0x0}, {0x4E2,0x418,0x304,0x0}, {0x4E3,0x438,0x304,0x0}, 
+  {0x4E4,0x418,0x308,0x0}, {0x4E5,0x438,0x308,0x0}, {0x4E6,0x41E,0x308,0x0}, 
+  {0x4E7,0x43E,0x308,0x0}, {0x4EA,0x4E8,0x308,0x0}, {0x4EB,0x4E9,0x308,0x0}, 
+  {0x4EE,0x423,0x304,0x0}, {0x4EF,0x443,0x304,0x0}, {0x4F0,0x423,0x308,0x0}, 
+  {0x4F1,0x443,0x308,0x0}, {0x4F2,0x423,0x30B,0x0}, {0x4F3,0x443,0x30B,0x0}, 
+  {0x4F4,0x427,0x308,0x0}, {0x4F5,0x447,0x308,0x0}, {0x4F8,0x42B,0x308,0x0}, 
+  {0x4F9,0x44B,0x308,0x0}, {0x929,0x928,0x93C,0x0}, {0x931,0x930,0x93C,0x0}, 
+  {0x934,0x933,0x93C,0x0}, {0x958,0x915,0x93C,0x0}, {0x959,0x916,0x93C,0x0}, 
+  {0x95A,0x917,0x93C,0x0}, {0x95B,0x91C,0x93C,0x0}, {0x95C,0x921,0x93C,0x0}, 
+  {0x95D,0x922,0x93C,0x0}, {0x95E,0x92B,0x93C,0x0}, {0x95F,0x92F,0x93C,0x0}, 
+  {0x9B0,0x9AC,0x9BC,0x0}, {0x9CB,0x9C7,0x9BE,0x0}, {0x9CC,0x9C7,0x9D7,0x0}, 
+  {0x9DC,0x9A1,0x9BC,0x0}, {0x9DD,0x9A2,0x9BC,0x0}, {0x9DF,0x9AF,0x9BC,0x0}, 
+  {0xA59,0xA16,0xA3C,0x0}, {0xA5A,0xA17,0xA3C,0x0}, {0xA5B,0xA1C,0xA3C,0x0}, 
+  {0xA5C,0xA21,0xA3C,0x0}, {0xA5E,0xA2B,0xA3C,0x0}, {0xB48,0xB47,0xB56,0x0}, 
+  {0xB4B,0xB47,0xB3E,0x0}, {0xB4C,0xB47,0xB57,0x0}, {0xB5C,0xB21,0xB3C,0x0}, 
+  {0xB5D,0xB22,0xB3C,0x0}, {0xB5F,0xB2F,0xB3C,0x0}, {0xB94,0xB92,0xBD7,0x0}, 
+  {0xBCA,0xBC6,0xBBE,0x0}, {0xBCB,0xBC7,0xBBE,0x0}, {0xBCC,0xBC6,0xBD7,0x0}, 
+  {0xC48,0xC46,0xC56,0x0}, {0xCC0,0xCBF,0xCD5,0x0}, {0xCC7,0xCC6,0xCD5,0x0}, 
+  {0xCC8,0xCC6,0xCD6,0x0}, {0xCCA,0xCC6,0xCC2,0x0}, {0xCCB,0xCC6,0xCC2,0xCD5}, 
+  {0xD4A,0xD46,0xD3E,0x0}, {0xD4B,0xD47,0xD3E,0x0}, {0xD4C,0xD46,0xD57,0x0}, 
+  {0xE33,0xE4D,0xE32,0x0}, {0xEB3,0xECD,0xEB2,0x0}, {0xF43,0xF42,0xFB7,0x0}, 
+  {0xF4D,0xF4C,0xFB7,0x0}, {0xF52,0xF51,0xFB7,0x0}, {0xF57,0xF56,0xFB7,0x0}, 
+  {0xF5C,0xF5B,0xFB7,0x0}, {0xF69,0xF40,0xFB5,0x0}, {0xF73,0xF72,0xF71,0x0}, 
+  {0xF75,0xF71,0xF74,0x0}, {0xF76,0xFB2,0xF80,0x0}, {0xF77,0xF76,0xF71,0x0}, 
+  {0xF78,0xFB3,0xF80,0x0}, {0xF79,0xF78,0xF71,0x0}, {0xF81,0xF80,0xF71,0x0}, 
+  {0xF93,0xF92,0xFB7,0x0}, {0xF9D,0xF9C,0xFB7,0x0}, {0xFA2,0xFA1,0xFB7,0x0}, 
+  {0xFA7,0xFA6,0xFB7,0x0}, {0xFAC,0xFAB,0xFB7,0x0}, {0xFB9,0xF90,0xFB5,0x0}, 
+  {0x1E00,0x41,0x325,0x0}, {0x1E01,0x61,0x325,0x0}, {0x1E02,0x42,0x307,0x0}, 
+  {0x1E03,0x62,0x307,0x0}, {0x1E04,0x42,0x323,0x0}, {0x1E05,0x62,0x323,0x0}, 
+  {0x1E06,0x42,0x331,0x0}, {0x1E07,0x62,0x331,0x0}, {0x1E08,0xC7,0x301,0x0}, 
+  {0x1E09,0xE7,0x301,0x0}, {0x1E0A,0x44,0x307,0x0}, {0x1E0B,0x64,0x307,0x0}, 
+  {0x1E0C,0x44,0x323,0x0}, {0x1E0D,0x64,0x323,0x0}, {0x1E0E,0x44,0x331,0x0}, 
+  {0x1E0F,0x64,0x331,0x0}, {0x1E10,0x44,0x327,0x0}, {0x1E11,0x64,0x327,0x0}, 
+  {0x1E12,0x44,0x32D,0x0}, {0x1E13,0x64,0x32D,0x0}, {0x1E14,0x112,0x300,0x0}, 
+  {0x1E15,0x113,0x300,0x0}, {0x1E16,0x112,0x301,0x0}, {0x1E17,0x113,0x301,0x0}, 
+  {0x1E18,0x45,0x32D,0x0}, {0x1E19,0x65,0x32D,0x0}, {0x1E1A,0x45,0x330,0x0}, 
+  {0x1E1B,0x65,0x330,0x0}, {0x1E1C,0x114,0x327,0x0}, {0x1E1D,0x115,0x327,0x0}, 
+  {0x1E1E,0x46,0x307,0x0}, {0x1E1F,0x66,0x307,0x0}, {0x1E20,0x47,0x304,0x0}, 
+  {0x1E21,0x67,0x304,0x0}, {0x1E22,0x48,0x307,0x0}, {0x1E23,0x68,0x307,0x0}, 
+  {0x1E24,0x48,0x323,0x0}, {0x1E25,0x68,0x323,0x0}, {0x1E26,0x48,0x308,0x0}, 
+  {0x1E27,0x68,0x308,0x0}, {0x1E28,0x48,0x327,0x0}, {0x1E29,0x68,0x327,0x0}, 
+  {0x1E2A,0x48,0x32E,0x0}, {0x1E2B,0x68,0x32E,0x0}, {0x1E2C,0x49,0x330,0x0}, 
+  {0x1E2D,0x69,0x330,0x0}, {0x1E2E,0xCF,0x301,0x0}, {0x1E2F,0xEF,0x301,0x0}, 
+  {0x1E30,0x4B,0x301,0x0}, {0x1E31,0x6B,0x301,0x0}, {0x1E32,0x4B,0x323,0x0}, 
+  {0x1E33,0x6B,0x323,0x0}, {0x1E34,0x4B,0x331,0x0}, {0x1E35,0x6B,0x331,0x0}, 
+  {0x1E36,0x4C,0x323,0x0}, {0x1E37,0x6C,0x323,0x0}, {0x1E38,0x1E36,0x304,0x0}, 
+  {0x1E39,0x1E37,0x304,0x0}, {0x1E3A,0x4C,0x331,0x0}, {0x1E3B,0x6C,0x331,0x0}, 
+  {0x1E3C,0x4C,0x32D,0x0}, {0x1E3D,0x6C,0x32D,0x0}, {0x1E3E,0x4D,0x301,0x0}, 
+  {0x1E3F,0x6D,0x301,0x0}, {0x1E40,0x4D,0x307,0x0}, {0x1E41,0x6D,0x307,0x0}, 
+  {0x1E42,0x4D,0x323,0x0}, {0x1E43,0x6D,0x323,0x0}, {0x1E44,0x4E,0x307,0x0}, 
+  {0x1E45,0x6E,0x307,0x0}, {0x1E46,0x4E,0x323,0x0}, {0x1E47,0x6E,0x323,0x0}, 
+  {0x1E48,0x4E,0x331,0x0}, {0x1E49,0x6E,0x331,0x0}, {0x1E4A,0x4E,0x32D,0x0}, 
+  {0x1E4B,0x6E,0x32D,0x0}, {0x1E4C,0xD5,0x301,0x0}, {0x1E4D,0xF5,0x301,0x0}, 
+  {0x1E4E,0xD5,0x308,0x0}, {0x1E4F,0xF5,0x308,0x0}, {0x1E50,0x14C,0x300,0x0}, 
+  {0x1E51,0x14D,0x300,0x0}, {0x1E52,0x14C,0x301,0x0}, {0x1E53,0x14D,0x301,0x0}, 
+  {0x1E54,0x50,0x301,0x0}, {0x1E55,0x70,0x301,0x0}, {0x1E56,0x50,0x307,0x0}, 
+  {0x1E57,0x70,0x307,0x0}, {0x1E58,0x52,0x307,0x0}, {0x1E59,0x72,0x307,0x0}, 
+  {0x1E5A,0x52,0x323,0x0}, {0x1E5B,0x72,0x323,0x0}, {0x1E5C,0x1E5A,0x304,0x0}, 
+  {0x1E5D,0x1E5B,0x304,0x0}, {0x1E5E,0x52,0x331,0x0}, {0x1E5F,0x72,0x331,0x0}, 
+  {0x1E60,0x53,0x307,0x0}, {0x1E61,0x73,0x307,0x0}, {0x1E62,0x53,0x323,0x0}, 
+  {0x1E63,0x73,0x323,0x0}, {0x1E64,0x15A,0x307,0x0}, {0x1E65,0x15B,0x307,0x0}, 
+  {0x1E66,0x160,0x307,0x0}, {0x1E67,0x161,0x307,0x0}, {0x1E68,0x1E62,0x307,0x0}, 
+  {0x1E69,0x1E63,0x307,0x0}, {0x1E6A,0x54,0x307,0x0}, {0x1E6B,0x74,0x307,0x0}, 
+  {0x1E6C,0x54,0x323,0x0}, {0x1E6D,0x74,0x323,0x0}, {0x1E6E,0x54,0x331,0x0}, 
+  {0x1E6F,0x74,0x331,0x0}, {0x1E70,0x54,0x32D,0x0}, {0x1E71,0x74,0x32D,0x0}, 
+  {0x1E72,0x55,0x324,0x0}, {0x1E73,0x75,0x324,0x0}, {0x1E74,0x55,0x330,0x0}, 
+  {0x1E75,0x75,0x330,0x0}, {0x1E76,0x55,0x32D,0x0}, {0x1E77,0x75,0x32D,0x0}, 
+  {0x1E78,0x168,0x301,0x0}, {0x1E79,0x169,0x301,0x0}, {0x1E7A,0x16A,0x308,0x0}, 
+  {0x1E7B,0x16B,0x308,0x0}, {0x1E7C,0x56,0x303,0x0}, {0x1E7D,0x76,0x303,0x0}, 
+  {0x1E7E,0x56,0x323,0x0}, {0x1E7F,0x76,0x323,0x0}, {0x1E80,0x57,0x300,0x0}, 
+  {0x1E81,0x77,0x300,0x0}, {0x1E82,0x57,0x301,0x0}, {0x1E83,0x77,0x301,0x0}, 
+  {0x1E84,0x57,0x308,0x0}, {0x1E85,0x77,0x308,0x0}, {0x1E86,0x57,0x307,0x0}, 
+  {0x1E87,0x77,0x307,0x0}, {0x1E88,0x57,0x323,0x0}, {0x1E89,0x77,0x323,0x0}, 
+  {0x1E8A,0x58,0x307,0x0}, {0x1E8B,0x78,0x307,0x0}, {0x1E8C,0x58,0x308,0x0}, 
+  {0x1E8D,0x78,0x308,0x0}, {0x1E8E,0x59,0x307,0x0}, {0x1E8F,0x79,0x307,0x0}, 
+  {0x1E90,0x5A,0x302,0x0}, {0x1E91,0x7A,0x302,0x0}, {0x1E92,0x5A,0x323,0x0}, 
+  {0x1E93,0x7A,0x323,0x0}, {0x1E94,0x5A,0x331,0x0}, {0x1E95,0x7A,0x331,0x0}, 
+  {0x1E96,0x68,0x331,0x0}, {0x1E97,0x74,0x308,0x0}, {0x1E98,0x77,0x30A,0x0}, 
+  {0x1E99,0x79,0x30A,0x0}, {0x1E9B,0x17F,0x307,0x0}, {0x1EA0,0x41,0x323,0x0}, 
+  {0x1EA1,0x61,0x323,0x0}, {0x1EA2,0x41,0x309,0x0}, {0x1EA3,0x61,0x309,0x0}, 
+  {0x1EA4,0xC2,0x301,0x0}, {0x1EA5,0xE2,0x301,0x0}, {0x1EA6,0xC2,0x300,0x0}, 
+  {0x1EA7,0xE2,0x300,0x0}, {0x1EA8,0xC2,0x309,0x0}, {0x1EA9,0xE2,0x309,0x0}, 
+  {0x1EAA,0xC2,0x303,0x0}, {0x1EAB,0xE2,0x303,0x0}, {0x1EAC,0xC2,0x323,0x0}, 
+  {0x1EAD,0xE2,0x323,0x0}, {0x1EAE,0x102,0x301,0x0}, {0x1EAF,0x103,0x301,0x0}, 
+  {0x1EB0,0x102,0x300,0x0}, {0x1EB1,0x103,0x300,0x0}, {0x1EB2,0x102,0x309,0x0}, 
+  {0x1EB3,0x103,0x309,0x0}, {0x1EB4,0x102,0x303,0x0}, {0x1EB5,0x103,0x303,0x0}, 
+  {0x1EB6,0x102,0x323,0x0}, {0x1EB7,0x103,0x323,0x0}, {0x1EB8,0x45,0x323,0x0}, 
+  {0x1EB9,0x65,0x323,0x0}, {0x1EBA,0x45,0x309,0x0}, {0x1EBB,0x65,0x309,0x0}, 
+  {0x1EBC,0x45,0x303,0x0}, {0x1EBD,0x65,0x303,0x0}, {0x1EBE,0xCA,0x301,0x0}, 
+  {0x1EBF,0xEA,0x301,0x0}, {0x1EC0,0xCA,0x300,0x0}, {0x1EC1,0xEA,0x300,0x0}, 
+  {0x1EC2,0xCA,0x309,0x0}, {0x1EC3,0xEA,0x309,0x0}, {0x1EC4,0xCA,0x303,0x0}, 
+  {0x1EC5,0xEA,0x303,0x0}, {0x1EC6,0xCA,0x323,0x0}, {0x1EC7,0xEA,0x323,0x0}, 
+  {0x1EC8,0x49,0x309,0x0}, {0x1EC9,0x69,0x309,0x0}, {0x1ECA,0x49,0x323,0x0}, 
+  {0x1ECB,0x69,0x323,0x0}, {0x1ECC,0x4F,0x323,0x0}, {0x1ECD,0x6F,0x323,0x0}, 
+  {0x1ECE,0x4F,0x309,0x0}, {0x1ECF,0x6F,0x309,0x0}, {0x1ED0,0xD4,0x301,0x0}, 
+  {0x1ED1,0xF4,0x301,0x0}, {0x1ED2,0xD4,0x300,0x0}, {0x1ED3,0xF4,0x300,0x0}, 
+  {0x1ED4,0xD4,0x309,0x0}, {0x1ED5,0xF4,0x309,0x0}, {0x1ED6,0xD4,0x303,0x0}, 
+  {0x1ED7,0xF4,0x303,0x0}, {0x1ED8,0xD4,0x323,0x0}, {0x1ED9,0xF4,0x323,0x0}, 
+  {0x1EDA,0x1A0,0x301,0x0}, {0x1EDB,0x1A1,0x301,0x0}, {0x1EDC,0x1A0,0x300,0x0}, 
+  {0x1EDD,0x1A1,0x300,0x0}, {0x1EDE,0x1A0,0x309,0x0}, {0x1EDF,0x1A1,0x309,0x0}, 
+  {0x1EE0,0x1A0,0x303,0x0}, {0x1EE1,0x1A1,0x303,0x0}, {0x1EE2,0x1A0,0x323,0x0}, 
+  {0x1EE3,0x1A1,0x323,0x0}, {0x1EE4,0x55,0x323,0x0}, {0x1EE5,0x75,0x323,0x0}, 
+  {0x1EE6,0x55,0x309,0x0}, {0x1EE7,0x75,0x309,0x0}, {0x1EE8,0x1AF,0x301,0x0}, 
+  {0x1EE9,0x1B0,0x301,0x0}, {0x1EEA,0x1AF,0x300,0x0}, {0x1EEB,0x1B0,0x300,0x0}, 
+  {0x1EEC,0x1AF,0x309,0x0}, {0x1EED,0x1B0,0x309,0x0}, {0x1EEE,0x1AF,0x303,0x0}, 
+  {0x1EEF,0x1B0,0x303,0x0}, {0x1EF0,0x1AF,0x323,0x0}, {0x1EF1,0x1B0,0x323,0x0}, 
+  {0x1EF2,0x59,0x300,0x0}, {0x1EF3,0x79,0x300,0x0}, {0x1EF4,0x59,0x323,0x0}, 
+  {0x1EF5,0x79,0x323,0x0}, {0x1EF6,0x59,0x309,0x0}, {0x1EF7,0x79,0x309,0x0}, 
+  {0x1EF8,0x59,0x303,0x0}, {0x1EF9,0x79,0x303,0x0}, {0x1F00,0x3B1,0x313,0x0}, 
+  {0x1F01,0x3B1,0x314,0x0}, {0x1F02,0x1F00,0x300,0x0}, {0x1F03,0x1F01,0x300,0x0}, 
+  {0x1F04,0x1F00,0x301,0x0}, {0x1F05,0x1F01,0x301,0x0}, {0x1F06,0x1F00,0x342,0x0}, 
+  {0x1F07,0x1F01,0x342,0x0}, {0x1F08,0x391,0x313,0x0}, {0x1F09,0x391,0x314,0x0}, 
+  {0x1F0A,0x1F08,0x300,0x0}, {0x1F0B,0x1F09,0x300,0x0}, {0x1F0C,0x1F08,0x301,0x0}, 
+  {0x1F0D,0x1F09,0x301,0x0}, {0x1F0E,0x1F08,0x342,0x0}, {0x1F0F,0x1F09,0x342,0x0}, 
+  {0x1F10,0x3B5,0x313,0x0}, {0x1F11,0x3B5,0x314,0x0}, {0x1F12,0x1F10,0x300,0x0}, 
+  {0x1F13,0x1F11,0x300,0x0}, {0x1F14,0x1F10,0x301,0x0}, {0x1F15,0x1F11,0x301,0x0}, 
+  {0x1F18,0x395,0x313,0x0}, {0x1F19,0x395,0x314,0x0}, {0x1F1A,0x1F18,0x300,0x0}, 
+  {0x1F1B,0x1F19,0x300,0x0}, {0x1F1C,0x1F18,0x301,0x0}, {0x1F1D,0x1F19,0x301,0x0}, 
+  {0x1F20,0x3B7,0x313,0x0}, {0x1F21,0x3B7,0x314,0x0}, {0x1F22,0x1F20,0x300,0x0}, 
+  {0x1F23,0x1F21,0x300,0x0}, {0x1F24,0x1F20,0x301,0x0}, {0x1F25,0x1F21,0x301,0x0}, 
+  {0x1F26,0x1F20,0x342,0x0}, {0x1F27,0x1F21,0x342,0x0}, {0x1F28,0x397,0x313,0x0}, 
+  {0x1F29,0x397,0x314,0x0}, {0x1F2A,0x1F28,0x300,0x0}, {0x1F2B,0x1F29,0x300,0x0}, 
+  {0x1F2C,0x1F28,0x301,0x0}, {0x1F2D,0x1F29,0x301,0x0}, {0x1F2E,0x1F28,0x342,0x0}, 
+  {0x1F2F,0x1F29,0x342,0x0}, {0x1F30,0x3B9,0x313,0x0}, {0x1F31,0x3B9,0x314,0x0}, 
+  {0x1F32,0x1F30,0x300,0x0}, {0x1F33,0x1F31,0x300,0x0}, {0x1F34,0x1F30,0x301,0x0}, 
+  {0x1F35,0x1F31,0x301,0x0}, {0x1F36,0x1F30,0x342,0x0}, {0x1F37,0x1F31,0x342,0x0}, 
+  {0x1F38,0x399,0x313,0x0}, {0x1F39,0x399,0x314,0x0}, {0x1F3A,0x1F38,0x300,0x0}, 
+  {0x1F3B,0x1F39,0x300,0x0}, {0x1F3C,0x1F38,0x301,0x0}, {0x1F3D,0x1F39,0x301,0x0}, 
+  {0x1F3E,0x1F38,0x342,0x0}, {0x1F3F,0x1F39,0x342,0x0}, {0x1F40,0x3BF,0x313,0x0}, 
+  {0x1F41,0x3BF,0x314,0x0}, {0x1F42,0x1F40,0x300,0x0}, {0x1F43,0x1F41,0x300,0x0}, 
+  {0x1F44,0x1F40,0x301,0x0}, {0x1F45,0x1F41,0x301,0x0}, {0x1F48,0x39F,0x313,0x0}, 
+  {0x1F49,0x39F,0x314,0x0}, {0x1F4A,0x1F48,0x300,0x0}, {0x1F4B,0x1F49,0x300,0x0}, 
+  {0x1F4C,0x1F48,0x301,0x0}, {0x1F4D,0x1F49,0x301,0x0}, {0x1F50,0x3C5,0x313,0x0}, 
+  {0x1F51,0x3C5,0x314,0x0}, {0x1F52,0x1F50,0x300,0x0}, {0x1F53,0x1F51,0x300,0x0}, 
+  {0x1F54,0x1F50,0x301,0x0}, {0x1F55,0x1F51,0x301,0x0}, {0x1F56,0x1F50,0x342,0x0}, 
+  {0x1F57,0x1F51,0x342,0x0}, {0x1F59,0x3A5,0x314,0x0}, {0x1F5B,0x1F59,0x300,0x0}, 
+  {0x1F5D,0x1F59,0x301,0x0}, {0x1F5F,0x1F59,0x342,0x0}, {0x1F60,0x3C9,0x313,0x0}, 
+  {0x1F61,0x3C9,0x314,0x0}, {0x1F62,0x1F60,0x300,0x0}, {0x1F63,0x1F61,0x300,0x0}, 
+  {0x1F64,0x1F60,0x301,0x0}, {0x1F65,0x1F61,0x301,0x0}, {0x1F66,0x1F60,0x342,0x0}, 
+  {0x1F67,0x1F61,0x342,0x0}, {0x1F68,0x3A9,0x313,0x0}, {0x1F69,0x3A9,0x314,0x0}, 
+  {0x1F6A,0x1F68,0x300,0x0}, {0x1F6B,0x1F69,0x300,0x0}, {0x1F6C,0x1F68,0x301,0x0}, 
+  {0x1F6D,0x1F69,0x301,0x0}, {0x1F6E,0x1F68,0x342,0x0}, {0x1F6F,0x1F69,0x342,0x0}, 
+  {0x1F70,0x3B1,0x300,0x0}, {0x1F71,0x3B1,0x301,0x0}, {0x1F72,0x3B5,0x300,0x0}, 
+  {0x1F73,0x3B5,0x301,0x0}, {0x1F74,0x3B7,0x300,0x0}, {0x1F75,0x3B7,0x301,0x0}, 
+  {0x1F76,0x3B9,0x300,0x0}, {0x1F77,0x3B9,0x301,0x0}, {0x1F78,0x3BF,0x300,0x0}, 
+  {0x1F79,0x3BF,0x301,0x0}, {0x1F7A,0x3C5,0x300,0x0}, {0x1F7B,0x3C5,0x301,0x0}, 
+  {0x1F7C,0x3C9,0x300,0x0}, {0x1F7D,0x3C9,0x301,0x0}, {0x1F80,0x1F00,0x345,0x0}, 
+  {0x1F81,0x1F01,0x345,0x0}, {0x1F82,0x1F02,0x345,0x0}, {0x1F83,0x1F03,0x345,0x0}, 
+  {0x1F84,0x1F04,0x345,0x0}, {0x1F85,0x1F05,0x345,0x0}, {0x1F86,0x1F06,0x345,0x0}, 
+  {0x1F87,0x1F07,0x345,0x0}, {0x1F88,0x1F08,0x345,0x0}, {0x1F89,0x1F09,0x345,0x0}, 
+  {0x1F8A,0x1F0A,0x345,0x0}, {0x1F8B,0x1F0B,0x345,0x0}, {0x1F8C,0x1F0C,0x345,0x0}, 
+  {0x1F8D,0x1F0D,0x345,0x0}, {0x1F8E,0x1F0E,0x345,0x0}, {0x1F8F,0x1F0F,0x345,0x0}, 
+  {0x1F90,0x1F20,0x345,0x0}, {0x1F91,0x1F21,0x345,0x0}, {0x1F92,0x1F22,0x345,0x0}, 
+  {0x1F93,0x1F23,0x345,0x0}, {0x1F94,0x1F24,0x345,0x0}, {0x1F95,0x1F25,0x345,0x0}, 
+  {0x1F96,0x1F26,0x345,0x0}, {0x1F97,0x1F27,0x345,0x0}, {0x1F98,0x1F28,0x345,0x0}, 
+  {0x1F99,0x1F29,0x345,0x0}, {0x1F9A,0x1F2A,0x345,0x0}, {0x1F9B,0x1F2B,0x345,0x0}, 
+  {0x1F9C,0x1F2C,0x345,0x0}, {0x1F9D,0x1F2D,0x345,0x0}, {0x1F9E,0x1F2E,0x345,0x0}, 
+  {0x1F9F,0x1F2F,0x345,0x0}, {0x1FA0,0x1F60,0x345,0x0}, {0x1FA1,0x1F61,0x345,0x0}, 
+  {0x1FA2,0x1F62,0x345,0x0}, {0x1FA3,0x1F63,0x345,0x0}, {0x1FA4,0x1F64,0x345,0x0}, 
+  {0x1FA5,0x1F65,0x345,0x0}, {0x1FA6,0x1F66,0x345,0x0}, {0x1FA7,0x1F67,0x345,0x0}, 
+  {0x1FA8,0x1F68,0x345,0x0}, {0x1FA9,0x1F69,0x345,0x0}, {0x1FAA,0x1F6A,0x345,0x0}, 
+  {0x1FAB,0x1F6B,0x345,0x0}, {0x1FAC,0x1F6C,0x345,0x0}, {0x1FAD,0x1F6D,0x345,0x0}, 
+  {0x1FAE,0x1F6E,0x345,0x0}, {0x1FAF,0x1F6F,0x345,0x0}, {0x1FB0,0x3B1,0x306,0x0}, 
+  {0x1FB1,0x3B1,0x304,0x0}, {0x1FB2,0x1F70,0x345,0x0}, {0x1FB3,0x3B1,0x345,0x0}, 
+  {0x1FB4,0x1F71,0x345,0x0}, {0x1FB6,0x3B1,0x342,0x0}, {0x1FB7,0x1FB6,0x345,0x0}, 
+  {0x1FB8,0x391,0x306,0x0}, {0x1FB9,0x391,0x304,0x0}, {0x1FBA,0x391,0x300,0x0}, 
+  {0x1FBB,0x391,0x301,0x0}, {0x1FBC,0x391,0x345,0x0}, {0x1FBE,0x3B9,0x0,0x0}, 
+  {0x1FC1,0xA8,0x342,0x0}, {0x1FC2,0x1F74,0x345,0x0}, {0x1FC3,0x3B7,0x345,0x0}, 
+  {0x1FC4,0x1F75,0x345,0x0}, {0x1FC6,0x3B7,0x342,0x0}, {0x1FC7,0x1FC6,0x345,0x0}, 
+  {0x1FC8,0x395,0x300,0x0}, {0x1FC9,0x395,0x301,0x0}, {0x1FCA,0x397,0x300,0x0}, 
+  {0x1FCB,0x397,0x301,0x0}, {0x1FCC,0x397,0x345,0x0}, {0x1FCD,0x1FBF,0x300,0x0}, 
+  {0x1FCE,0x1FBF,0x301,0x0}, {0x1FCF,0x1FBF,0x342,0x0}, {0x1FD0,0x3B9,0x306,0x0}, 
+  {0x1FD1,0x3B9,0x304,0x0}, {0x1FD2,0x3CA,0x300,0x0}, {0x1FD3,0x3CA,0x301,0x0}, 
+  {0x1FD6,0x3B9,0x342,0x0}, {0x1FD7,0x3CA,0x342,0x0}, {0x1FD8,0x399,0x306,0x0}, 
+  {0x1FD9,0x399,0x304,0x0}, {0x1FDA,0x399,0x300,0x0}, {0x1FDB,0x399,0x301,0x0}, 
+  {0x1FDD,0x1FFE,0x300,0x0}, {0x1FDE,0x1FFE,0x301,0x0}, {0x1FDF,0x1FFE,0x342,0x0}, 
+  {0x1FE0,0x3C5,0x306,0x0}, {0x1FE1,0x3C5,0x304,0x0}, {0x1FE2,0x3CB,0x300,0x0}, 
+  {0x1FE3,0x3CB,0x301,0x0}, {0x1FE4,0x3C1,0x313,0x0}, {0x1FE5,0x3C1,0x314,0x0}, 
+  {0x1FE6,0x3C5,0x342,0x0}, {0x1FE7,0x3CB,0x342,0x0}, {0x1FE8,0x3A5,0x306,0x0}, 
+  {0x1FE9,0x3A5,0x304,0x0}, {0x1FEA,0x3A5,0x300,0x0}, {0x1FEB,0x3A5,0x301,0x0}, 
+  {0x1FEC,0x3A1,0x314,0x0}, {0x1FED,0xA8,0x300,0x0}, {0x1FEE,0xA8,0x301,0x0}, 
+  {0x1FEF,0x60,0x0,0x0}, {0x1FF2,0x1F7C,0x345,0x0}, {0x1FF3,0x3C9,0x345,0x0}, 
+  {0x1FF4,0x1F79,0x345,0x0}, {0x1FF6,0x3C9,0x342,0x0}, {0x1FF7,0x1FF6,0x345,0x0}, 
+  {0x1FF8,0x39F,0x300,0x0}, {0x1FF9,0x39F,0x301,0x0}, {0x1FFA,0x3A9,0x300,0x0}, 
+  {0x1FFB,0x3A9,0x301,0x0}, {0x1FFC,0x3A9,0x345,0x0}, {0x1FFD,0xB4,0x0,0x0}, 
+  {0x2000,0x2002,0x0,0x0}, {0x2001,0x2003,0x0,0x0}, {0x2126,0x3A9,0x0,0x0}, 
+  {0x212A,0x4B,0x0,0x0}, {0x212B,0xC5,0x0,0x0}, {0x2204,0x2203,0x338,0x0}, 
+  {0x2209,0x2208,0x338,0x0}, {0x220C,0x220B,0x338,0x0}, {0x2224,0x2223,0x338,0x0}, 
+  {0x2226,0x2225,0x338,0x0}, {0x2241,0x7E,0x338,0x0}, {0x2244,0x2243,0x338,0x0}, 
+  {0x2247,0x2245,0x338,0x0}, {0x2249,0x2248,0x338,0x0}, {0x2260,0x3D,0x338,0x0}, 
+  {0x2262,0x2261,0x338,0x0}, {0x226D,0x224D,0x338,0x0}, {0x226E,0x3C,0x338,0x0}, 
+  {0x226F,0x3E,0x338,0x0}, {0x2270,0x2264,0x338,0x0}, {0x2271,0x2265,0x338,0x0}, 
+  {0x2274,0x2272,0x338,0x0}, {0x2275,0x2273,0x338,0x0}, {0x2278,0x2276,0x338,0x0}, 
+  {0x2279,0x2277,0x338,0x0}, {0x2280,0x227A,0x338,0x0}, {0x2281,0x227B,0x338,0x0}, 
+  {0x2284,0x2282,0x338,0x0}, {0x2285,0x2283,0x338,0x0}, {0x2288,0x2286,0x338,0x0}, 
+  {0x2289,0x2287,0x338,0x0}, {0x22AC,0x22A2,0x338,0x0}, {0x22AD,0x22A8,0x338,0x0}, 
+  {0x22AE,0x22A9,0x338,0x0}, {0x22AF,0x22AB,0x338,0x0}, {0x22E0,0x227C,0x338,0x0}, 
+  {0x22E1,0x227D,0x338,0x0}, {0x22E2,0x2291,0x338,0x0}, {0x22E3,0x2292,0x338,0x0}, 
+  {0x22EA,0x22B2,0x338,0x0}, {0x22EB,0x22B3,0x338,0x0}, {0x22EC,0x22B4,0x338,0x0}, 
+  {0x22ED,0x22B5,0x338,0x0}, {0x2329,0x3008,0x0,0x0}, {0x232A,0x3009,0x0,0x0}, 
+  {0x304C,0x304B,0x3099,0x0}, {0x304E,0x304D,0x3099,0x0}, {0x3050,0x304F,0x3099,0x0}, 
+  {0x3052,0x3051,0x3099,0x0}, {0x3054,0x3053,0x3099,0x0}, {0x3056,0x3055,0x3099,0x0}, 
+  {0x3058,0x3057,0x3099,0x0}, {0x305A,0x3059,0x3099,0x0}, {0x305C,0x305B,0x3099,0x0}, 
+  {0x305E,0x305D,0x3099,0x0}, {0x3060,0x305F,0x3099,0x0}, {0x3062,0x3061,0x3099,0x0}, 
+  {0x3065,0x3064,0x3099,0x0}, {0x3067,0x3066,0x3099,0x0}, {0x3069,0x3068,0x3099,0x0}, 
+  {0x3070,0x306F,0x3099,0x0}, {0x3071,0x306F,0x309A,0x0}, {0x3073,0x3072,0x3099,0x0}, 
+  {0x3074,0x3072,0x309A,0x0}, {0x3076,0x3075,0x3099,0x0}, {0x3077,0x3075,0x309A,0x0}, 
+  {0x3079,0x3078,0x3099,0x0}, {0x307A,0x3078,0x309A,0x0}, {0x307C,0x307B,0x3099,0x0}, 
+  {0x307D,0x307B,0x309A,0x0}, {0x3094,0x3046,0x3099,0x0}, {0x309E,0x309D,0x3099,0x0}, 
+  {0x30AC,0x30AB,0x3099,0x0}, {0x30AE,0x30AD,0x3099,0x0}, {0x30B0,0x30AF,0x3099,0x0}, 
+  {0x30B2,0x30B1,0x3099,0x0}, {0x30B4,0x30B3,0x3099,0x0}, {0x30B6,0x30B5,0x3099,0x0}, 
+  {0x30B8,0x30B7,0x3099,0x0}, {0x30BA,0x30B9,0x3099,0x0}, {0x30BC,0x30BB,0x3099,0x0}, 
+  {0x30BE,0x30BD,0x3099,0x0}, {0x30C0,0x30BF,0x3099,0x0}, {0x30C2,0x30C1,0x3099,0x0}, 
+  {0x30C5,0x30C4,0x3099,0x0}, {0x30C7,0x30C6,0x3099,0x0}, {0x30C9,0x30C8,0x3099,0x0}, 
+  {0x30D0,0x30CF,0x3099,0x0}, {0x30D1,0x30CF,0x309A,0x0}, {0x30D3,0x30D2,0x3099,0x0}, 
+  {0x30D4,0x30D2,0x309A,0x0}, {0x30D6,0x30D5,0x3099,0x0}, {0x30D7,0x30D5,0x309A,0x0}, 
+  {0x30D9,0x30D8,0x3099,0x0}, {0x30DA,0x30D8,0x309A,0x0}, {0x30DC,0x30DB,0x3099,0x0}, 
+  {0x30DD,0x30DB,0x309A,0x0}, {0x30F4,0x30A6,0x3099,0x0}, {0x30F7,0x30EF,0x3099,0x0}, 
+  {0x30F8,0x30F0,0x3099,0x0}, {0x30F9,0x30F1,0x3099,0x0}, {0x30FA,0x30F2,0x3099,0x0}, 
+  {0x30FE,0x30FD,0x3099,0x0}, {0xF900,0x8C48,0x0,0x0}, {0xF901,0x66F4,0x0,0x0}, 
+  {0xF902,0x8ECA,0x0,0x0}, {0xF903,0x8CC8,0x0,0x0}, {0xF904,0x6ED1,0x0,0x0}, 
+  {0xF905,0x4E32,0x0,0x0}, {0xF906,0x53E5,0x0,0x0}, {0xF907,0x9F9C,0x0,0x0}, 
+  {0xF908,0x9F9C,0x0,0x0}, {0xF909,0x5951,0x0,0x0}, {0xF90A,0x91D1,0x0,0x0}, 
+  {0xF90B,0x5587,0x0,0x0}, {0xF90C,0x5948,0x0,0x0}, {0xF90D,0x61F6,0x0,0x0}, 
+  {0xF90E,0x7669,0x0,0x0}, {0xF90F,0x7F85,0x0,0x0}, {0xF910,0x863F,0x0,0x0}, 
+  {0xF911,0x87BA,0x0,0x0}, {0xF912,0x88F8,0x0,0x0}, {0xF913,0x908F,0x0,0x0}, 
+  {0xF914,0x6A02,0x0,0x0}, {0xF915,0x6D1B,0x0,0x0}, {0xF916,0x70D9,0x0,0x0}, 
+  {0xF917,0x73DE,0x0,0x0}, {0xF918,0x843D,0x0,0x0}, {0xF919,0x916A,0x0,0x0}, 
+  {0xF91A,0x99F1,0x0,0x0}, {0xF91B,0x4E82,0x0,0x0}, {0xF91C,0x5375,0x0,0x0}, 
+  {0xF91D,0x6B04,0x0,0x0}, {0xF91E,0x721B,0x0,0x0}, {0xF91F,0x862D,0x0,0x0}, 
+  {0xF920,0x9E1E,0x0,0x0}, {0xF921,0x5D50,0x0,0x0}, {0xF922,0x6FEB,0x0,0x0}, 
+  {0xF923,0x85CD,0x0,0x0}, {0xF924,0x8964,0x0,0x0}, {0xF925,0x62C9,0x0,0x0}, 
+  {0xF926,0x81D8,0x0,0x0}, {0xF927,0x881F,0x0,0x0}, {0xF928,0x5ECA,0x0,0x0}, 
+  {0xF929,0x6717,0x0,0x0}, {0xF92A,0x6D6A,0x0,0x0}, {0xF92B,0x72FC,0x0,0x0}, 
+  {0xF92C,0x90CE,0x0,0x0}, {0xF92D,0x4F86,0x0,0x0}, {0xF92E,0x51B7,0x0,0x0}, 
+  {0xF92F,0x52DE,0x0,0x0}, {0xF930,0x64C4,0x0,0x0}, {0xF931,0x6AD3,0x0,0x0}, 
+  {0xF932,0x7210,0x0,0x0}, {0xF933,0x76E7,0x0,0x0}, {0xF934,0x8001,0x0,0x0}, 
+  {0xF935,0x8606,0x0,0x0}, {0xF936,0x865C,0x0,0x0}, {0xF937,0x8DEF,0x0,0x0}, 
+  {0xF938,0x9732,0x0,0x0}, {0xF939,0x9B6F,0x0,0x0}, {0xF93A,0x9DFA,0x0,0x0}, 
+  {0xF93B,0x788C,0x0,0x0}, {0xF93C,0x797F,0x0,0x0}, {0xF93D,0x7DA0,0x0,0x0}, 
+  {0xF93E,0x83C9,0x0,0x0}, {0xF93F,0x9304,0x0,0x0}, {0xF940,0x9E7F,0x0,0x0}, 
+  {0xF941,0x8AD6,0x0,0x0}, {0xF942,0x58DF,0x0,0x0}, {0xF943,0x5F04,0x0,0x0}, 
+  {0xF944,0x7C60,0x0,0x0}, {0xF945,0x807E,0x0,0x0}, {0xF946,0x7262,0x0,0x0}, 
+  {0xF947,0x78CA,0x0,0x0}, {0xF948,0x8CC2,0x0,0x0}, {0xF949,0x96F7,0x0,0x0}, 
+  {0xF94A,0x58D8,0x0,0x0}, {0xF94B,0x5C62,0x0,0x0}, {0xF94C,0x6A13,0x0,0x0}, 
+  {0xF94D,0x6DDA,0x0,0x0}, {0xF94E,0x6F0F,0x0,0x0}, {0xF94F,0x7D2F,0x0,0x0}, 
+  {0xF950,0x7E37,0x0,0x0}, {0xF951,0x96FB,0x0,0x0}, {0xF952,0x52D2,0x0,0x0}, 
+  {0xF953,0x808B,0x0,0x0}, {0xF954,0x51DC,0x0,0x0}, {0xF955,0x51CC,0x0,0x0}, 
+  {0xF956,0x7A1C,0x0,0x0}, {0xF957,0x7DBE,0x0,0x0}, {0xF958,0x83F1,0x0,0x0}, 
+  {0xF959,0x9675,0x0,0x0}, {0xF95A,0x8B80,0x0,0x0}, {0xF95B,0x62CF,0x0,0x0}, 
+  {0xF95C,0x6A02,0x0,0x0}, {0xF95D,0x8AFE,0x0,0x0}, {0xF95E,0x4E39,0x0,0x0}, 
+  {0xF95F,0x5BE7,0x0,0x0}, {0xF960,0x6012,0x0,0x0}, {0xF961,0x7387,0x0,0x0}, 
+  {0xF962,0x7570,0x0,0x0}, {0xF963,0x5317,0x0,0x0}, {0xF964,0x78FB,0x0,0x0}, 
+  {0xF965,0x4FBF,0x0,0x0}, {0xF966,0x5FA9,0x0,0x0}, {0xF967,0x4E0D,0x0,0x0}, 
+  {0xF968,0x6CCC,0x0,0x0}, {0xF969,0x6578,0x0,0x0}, {0xF96A,0x7D22,0x0,0x0}, 
+  {0xF96B,0x53C3,0x0,0x0}, {0xF96C,0x585E,0x0,0x0}, {0xF96D,0x7701,0x0,0x0}, 
+  {0xF96E,0x8449,0x0,0x0}, {0xF96F,0x8AAA,0x0,0x0}, {0xF970,0x6BBA,0x0,0x0}, 
+  {0xF971,0x8FB0,0x0,0x0}, {0xF972,0x6C88,0x0,0x0}, {0xF973,0x62FE,0x0,0x0}, 
+  {0xF974,0x82E5,0x0,0x0}, {0xF975,0x63A0,0x0,0x0}, {0xF976,0x7565,0x0,0x0}, 
+  {0xF977,0x4EAE,0x0,0x0}, {0xF978,0x5169,0x0,0x0}, {0xF979,0x51C9,0x0,0x0}, 
+  {0xF97A,0x6881,0x0,0x0}, {0xF97B,0x7CE7,0x0,0x0}, {0xF97C,0x826F,0x0,0x0}, 
+  {0xF97D,0x8AD2,0x0,0x0}, {0xF97E,0x91CF,0x0,0x0}, {0xF97F,0x52F5,0x0,0x0}, 
+  {0xF980,0x5442,0x0,0x0}, {0xF981,0x5973,0x0,0x0}, {0xF982,0x5EEC,0x0,0x0}, 
+  {0xF983,0x65C5,0x0,0x0}, {0xF984,0x6FFE,0x0,0x0}, {0xF985,0x792A,0x0,0x0}, 
+  {0xF986,0x95AD,0x0,0x0}, {0xF987,0x9A6A,0x0,0x0}, {0xF988,0x9E97,0x0,0x0}, 
+  {0xF989,0x9ECE,0x0,0x0}, {0xF98A,0x529B,0x0,0x0}, {0xF98B,0x66C6,0x0,0x0}, 
+  {0xF98C,0x6B77,0x0,0x0}, {0xF98D,0x8F62,0x0,0x0}, {0xF98E,0x5E74,0x0,0x0}, 
+  {0xF98F,0x6190,0x0,0x0}, {0xF990,0x6200,0x0,0x0}, {0xF991,0x649A,0x0,0x0}, 
+  {0xF992,0x6F23,0x0,0x0}, {0xF993,0x7149,0x0,0x0}, {0xF994,0x7489,0x0,0x0}, 
+  {0xF995,0x79CA,0x0,0x0}, {0xF996,0x7DF4,0x0,0x0}, {0xF997,0x806F,0x0,0x0}, 
+  {0xF998,0x8F26,0x0,0x0}, {0xF999,0x84EE,0x0,0x0}, {0xF99A,0x9023,0x0,0x0}, 
+  {0xF99B,0x934A,0x0,0x0}, {0xF99C,0x5217,0x0,0x0}, {0xF99D,0x52A3,0x0,0x0}, 
+  {0xF99E,0x54BD,0x0,0x0}, {0xF99F,0x70C8,0x0,0x0}, {0xF9A0,0x88C2,0x0,0x0}, 
+  {0xF9A1,0x8AAA,0x0,0x0}, {0xF9A2,0x5EC9,0x0,0x0}, {0xF9A3,0x5FF5,0x0,0x0}, 
+  {0xF9A4,0x637B,0x0,0x0}, {0xF9A5,0x6BAE,0x0,0x0}, {0xF9A6,0x7C3E,0x0,0x0}, 
+  {0xF9A7,0x7375,0x0,0x0}, {0xF9A8,0x4EE4,0x0,0x0}, {0xF9A9,0x56F9,0x0,0x0}, 
+  {0xF9AA,0x5BE7,0x0,0x0}, {0xF9AB,0x5DBA,0x0,0x0}, {0xF9AC,0x601C,0x0,0x0}, 
+  {0xF9AD,0x73B2,0x0,0x0}, {0xF9AE,0x7469,0x0,0x0}, {0xF9AF,0x7F9A,0x0,0x0}, 
+  {0xF9B0,0x8046,0x0,0x0}, {0xF9B1,0x9234,0x0,0x0}, {0xF9B2,0x96F6,0x0,0x0}, 
+  {0xF9B3,0x9748,0x0,0x0}, {0xF9B4,0x9818,0x0,0x0}, {0xF9B5,0x4F8B,0x0,0x0}, 
+  {0xF9B6,0x79AE,0x0,0x0}, {0xF9B7,0x91B4,0x0,0x0}, {0xF9B8,0x96B8,0x0,0x0}, 
+  {0xF9B9,0x60E1,0x0,0x0}, {0xF9BA,0x4E86,0x0,0x0}, {0xF9BB,0x50DA,0x0,0x0}, 
+  {0xF9BC,0x5BEE,0x0,0x0}, {0xF9BD,0x5C3F,0x0,0x0}, {0xF9BE,0x6599,0x0,0x0}, 
+  {0xF9BF,0x6A02,0x0,0x0}, {0xF9C0,0x71CE,0x0,0x0}, {0xF9C1,0x7642,0x0,0x0}, 
+  {0xF9C2,0x84FC,0x0,0x0}, {0xF9C3,0x907C,0x0,0x0}, {0xF9C4,0x9F8D,0x0,0x0}, 
+  {0xF9C5,0x6688,0x0,0x0}, {0xF9C6,0x962E,0x0,0x0}, {0xF9C7,0x5289,0x0,0x0}, 
+  {0xF9C8,0x677B,0x0,0x0}, {0xF9C9,0x67F3,0x0,0x0}, {0xF9CA,0x6D41,0x0,0x0}, 
+  {0xF9CB,0x6E9C,0x0,0x0}, {0xF9CC,0x7409,0x0,0x0}, {0xF9CD,0x7559,0x0,0x0}, 
+  {0xF9CE,0x786B,0x0,0x0}, {0xF9CF,0x7D10,0x0,0x0}, {0xF9D0,0x985E,0x0,0x0}, 
+  {0xF9D1,0x516D,0x0,0x0}, {0xF9D2,0x622E,0x0,0x0}, {0xF9D3,0x9678,0x0,0x0}, 
+  {0xF9D4,0x502B,0x0,0x0}, {0xF9D5,0x5D19,0x0,0x0}, {0xF9D6,0x6DEA,0x0,0x0}, 
+  {0xF9D7,0x8F2A,0x0,0x0}, {0xF9D8,0x5F8B,0x0,0x0}, {0xF9D9,0x6144,0x0,0x0}, 
+  {0xF9DA,0x6817,0x0,0x0}, {0xF9DB,0x7387,0x0,0x0}, {0xF9DC,0x9686,0x0,0x0}, 
+  {0xF9DD,0x5229,0x0,0x0}, {0xF9DE,0x540F,0x0,0x0}, {0xF9DF,0x5C65,0x0,0x0}, 
+  {0xF9E0,0x6613,0x0,0x0}, {0xF9E1,0x674E,0x0,0x0}, {0xF9E2,0x68A8,0x0,0x0}, 
+  {0xF9E3,0x6CE5,0x0,0x0}, {0xF9E4,0x7406,0x0,0x0}, {0xF9E5,0x75E2,0x0,0x0}, 
+  {0xF9E6,0x7F79,0x0,0x0}, {0xF9E7,0x88CF,0x0,0x0}, {0xF9E8,0x88E1,0x0,0x0}, 
+  {0xF9E9,0x91CC,0x0,0x0}, {0xF9EA,0x96E2,0x0,0x0}, {0xF9EB,0x533F,0x0,0x0}, 
+  {0xF9EC,0x6EBA,0x0,0x0}, {0xF9ED,0x541D,0x0,0x0}, {0xF9EE,0x71D0,0x0,0x0}, 
+  {0xF9EF,0x7498,0x0,0x0}, {0xF9F0,0x85FA,0x0,0x0}, {0xF9F1,0x96A3,0x0,0x0}, 
+  {0xF9F2,0x9C57,0x0,0x0}, {0xF9F3,0x9E9F,0x0,0x0}, {0xF9F4,0x6797,0x0,0x0}, 
+  {0xF9F5,0x6DCB,0x0,0x0}, {0xF9F6,0x81E8,0x0,0x0}, {0xF9F7,0x7ACB,0x0,0x0}, 
+  {0xF9F8,0x7B20,0x0,0x0}, {0xF9F9,0x7C92,0x0,0x0}, {0xF9FA,0x72C0,0x0,0x0}, 
+  {0xF9FB,0x7099,0x0,0x0}, {0xF9FC,0x8B58,0x0,0x0}, {0xF9FD,0x4EC0,0x0,0x0}, 
+  {0xF9FE,0x8336,0x0,0x0}, {0xF9FF,0x523A,0x0,0x0}, {0xFA00,0x5207,0x0,0x0}, 
+  {0xFA01,0x5EA6,0x0,0x0}, {0xFA02,0x62D3,0x0,0x0}, {0xFA03,0x7CD6,0x0,0x0}, 
+  {0xFA04,0x5B85,0x0,0x0}, {0xFA05,0x6D1E,0x0,0x0}, {0xFA06,0x66B4,0x0,0x0}, 
+  {0xFA07,0x8F3B,0x0,0x0}, {0xFA08,0x884C,0x0,0x0}, {0xFA09,0x964D,0x0,0x0}, 
+  {0xFA0A,0x898B,0x0,0x0}, {0xFA0B,0x5ED3,0x0,0x0}, {0xFA0C,0x5140,0x0,0x0}, 
+  {0xFA0D,0x55C0,0x0,0x0}, {0xFA10,0x585A,0x0,0x0}, {0xFA12,0x6674,0x0,0x0}, 
+  {0xFA15,0x51DE,0x0,0x0}, {0xFA16,0x732A,0x0,0x0}, {0xFA17,0x76CA,0x0,0x0}, 
+  {0xFA18,0x793C,0x0,0x0}, {0xFA19,0x795E,0x0,0x0}, {0xFA1A,0x7965,0x0,0x0}, 
+  {0xFA1B,0x798F,0x0,0x0}, {0xFA1C,0x9756,0x0,0x0}, {0xFA1D,0x7CBE,0x0,0x0}, 
+  {0xFA1E,0x7FBD,0x0,0x0}, {0xFA20,0x8612,0x0,0x0}, {0xFA22,0x8AF8,0x0,0x0}, 
+  {0xFA25,0x9038,0x0,0x0}, {0xFA26,0x90FD,0x0,0x0}, {0xFA2A,0x98EF,0x0,0x0}, 
+  {0xFA2B,0x98FC,0x0,0x0}, {0xFA2C,0x9928,0x0,0x0}, {0xFA2D,0x9DB4,0x0,0x0}, 
+  {0xFB1F,0x5F2,0x5B7,0x0}, {0xFB2A,0x5E9,0x5C1,0x0}, {0xFB2B,0x5E9,0x5C2,0x0}, 
+  {0xFB2C,0x5E9,0x5BC,0x5C1}, {0xFB2D,0x5E9,0x5BC,0x5C2}, {0xFB2E,0x5D0,0x5B7,0x0}, 
+  {0xFB2F,0x5D0,0x5B8,0x0}, {0xFB30,0x5D0,0x5BC,0x0}, {0xFB31,0x5D1,0x5BC,0x0}, 
+  {0xFB32,0x5D2,0x5BC,0x0}, {0xFB33,0x5D3,0x5BC,0x0}, {0xFB34,0x5D4,0x5BC,0x0}, 
+  {0xFB35,0x5D5,0x5BC,0x0}, {0xFB36,0x5D6,0x5BC,0x0}, {0xFB38,0x5D8,0x5BC,0x0}, 
+  {0xFB39,0x5D9,0x5BC,0x0}, {0xFB3A,0x5DA,0x5BC,0x0}, {0xFB3B,0x5DB,0x5BC,0x0}, 
+  {0xFB3C,0x5DC,0x5BC,0x0}, {0xFB3E,0x5DE,0x5BC,0x0}, {0xFB40,0x5E0,0x5BC,0x0}, 
+  {0xFB41,0x5E1,0x5BC,0x0}, {0xFB43,0x5E3,0x5BC,0x0}, {0xFB44,0x5E4,0x5BC,0x0}, 
+  {0xFB46,0x5E6,0x5BC,0x0}, {0xFB47,0x5E7,0x5BC,0x0}, {0xFB48,0x5E8,0x5BC,0x0}, 
+  {0xFB49,0x5E9,0x5BC,0x0}, {0xFB4A,0x5EA,0x5BC,0x0}, {0xFB4B,0x5D5,0x5B9,0x0}, 
+  {0xFB4C,0x5D1,0x5BF,0x0}, {0xFB4D,0x5DB,0x5BF,0x0}, {0xFB4E,0x5E4,0x5BF,0x0} 
+};
+
+
+/* All upper-case translations are included here */
+
+#define NUM_TOUPPER_INFO 677
+static const unirelate toupper_info[NUM_TOUPPER_INFO] = {
+  {0x61,0x41}, {0x62,0x42}, {0x63,0x43}, {0x64,0x44}, {0x65,0x45}, 
+  {0x66,0x46}, {0x67,0x47}, {0x68,0x48}, {0x69,0x49}, {0x6A,0x4A}, 
+  {0x6B,0x4B}, {0x6C,0x4C}, {0x6D,0x4D}, {0x6E,0x4E}, {0x6F,0x4F}, 
+  {0x70,0x50}, {0x71,0x51}, {0x72,0x52}, {0x73,0x53}, {0x74,0x54}, 
+  {0x75,0x55}, {0x76,0x56}, {0x77,0x57}, {0x78,0x58}, {0x79,0x59}, 
+  {0x7A,0x5A}, {0xE0,0xC0}, {0xE1,0xC1}, {0xE2,0xC2}, {0xE3,0xC3}, 
+  {0xE4,0xC4}, {0xE5,0xC5}, {0xE6,0xC6}, {0xE7,0xC7}, {0xE8,0xC8}, 
+  {0xE9,0xC9}, {0xEA,0xCA}, {0xEB,0xCB}, {0xEC,0xCC}, {0xED,0xCD}, 
+  {0xEE,0xCE}, {0xEF,0xCF}, {0xF0,0xD0}, {0xF1,0xD1}, {0xF2,0xD2}, 
+  {0xF3,0xD3}, {0xF4,0xD4}, {0xF5,0xD5}, {0xF6,0xD6}, {0xF8,0xD8}, 
+  {0xF9,0xD9}, {0xFA,0xDA}, {0xFB,0xDB}, {0xFC,0xDC}, {0xFD,0xDD}, 
+  {0xFE,0xDE}, {0xFF,0x178}, {0x101,0x100}, {0x103,0x102}, {0x105,0x104}, 
+  {0x107,0x106}, {0x109,0x108}, {0x10B,0x10A}, {0x10D,0x10C}, {0x10F,0x10E}, 
+  {0x111,0x110}, {0x113,0x112}, {0x115,0x114}, {0x117,0x116}, {0x119,0x118}, 
+  {0x11B,0x11A}, {0x11D,0x11C}, {0x11F,0x11E}, {0x121,0x120}, {0x123,0x122}, 
+  {0x125,0x124}, {0x127,0x126}, {0x129,0x128}, {0x12B,0x12A}, {0x12D,0x12C}, 
+  {0x12F,0x12E}, {0x131,0x49}, {0x133,0x132}, {0x135,0x134}, {0x137,0x136}, 
+  {0x13A,0x139}, {0x13C,0x13B}, {0x13E,0x13D}, {0x140,0x13F}, {0x142,0x141}, 
+  {0x144,0x143}, {0x146,0x145}, {0x148,0x147}, {0x14B,0x14A}, {0x14D,0x14C}, 
+  {0x14F,0x14E}, {0x151,0x150}, {0x153,0x152}, {0x155,0x154}, {0x157,0x156}, 
+  {0x159,0x158}, {0x15B,0x15A}, {0x15D,0x15C}, {0x15F,0x15E}, {0x161,0x160}, 
+  {0x163,0x162}, {0x165,0x164}, {0x167,0x166}, {0x169,0x168}, {0x16B,0x16A}, 
+  {0x16D,0x16C}, {0x16F,0x16E}, {0x171,0x170}, {0x173,0x172}, {0x175,0x174}, 
+  {0x177,0x176}, {0x17A,0x179}, {0x17C,0x17B}, {0x17E,0x17D}, {0x17F,0x53}, 
+  {0x183,0x182}, {0x185,0x184}, {0x188,0x187}, {0x18C,0x18B}, {0x192,0x191}, 
+  {0x199,0x198}, {0x1A1,0x1A0}, {0x1A3,0x1A2}, {0x1A5,0x1A4}, {0x1A8,0x1A7}, 
+  {0x1AD,0x1AC}, {0x1B0,0x1AF}, {0x1B4,0x1B3}, {0x1B6,0x1B5}, {0x1B9,0x1B8}, 
+  {0x1BD,0x1BC}, {0x1C5,0x1C4}, {0x1C6,0x1C4}, {0x1C8,0x1C7}, {0x1C9,0x1C7}, 
+  {0x1CB,0x1CA}, {0x1CC,0x1CA}, {0x1CE,0x1CD}, {0x1D0,0x1CF}, {0x1D2,0x1D1}, 
+  {0x1D4,0x1D3}, {0x1D6,0x1D5}, {0x1D8,0x1D7}, {0x1DA,0x1D9}, {0x1DC,0x1DB}, 
+  {0x1DD,0x18E}, {0x1DF,0x1DE}, {0x1E1,0x1E0}, {0x1E3,0x1E2}, {0x1E5,0x1E4}, 
+  {0x1E7,0x1E6}, {0x1E9,0x1E8}, {0x1EB,0x1EA}, {0x1ED,0x1EC}, {0x1EF,0x1EE}, 
+  {0x1F2,0x1F1}, {0x1F3,0x1F1}, {0x1F5,0x1F4}, {0x1FB,0x1FA}, {0x1FD,0x1FC}, 
+  {0x1FF,0x1FE}, {0x201,0x200}, {0x203,0x202}, {0x205,0x204}, {0x207,0x206}, 
+  {0x209,0x208}, {0x20B,0x20A}, {0x20D,0x20C}, {0x20F,0x20E}, {0x211,0x210}, 
+  {0x213,0x212}, {0x215,0x214}, {0x217,0x216}, {0x253,0x181}, {0x254,0x186}, 
+  {0x256,0x189}, {0x257,0x18A}, {0x259,0x18F}, {0x25B,0x190}, {0x260,0x193}, 
+  {0x263,0x194}, {0x268,0x197}, {0x269,0x196}, {0x26F,0x19C}, {0x272,0x19D}, 
+  {0x275,0x19F}, {0x283,0x1A9}, {0x288,0x1AE}, {0x28A,0x1B1}, {0x28B,0x1B2}, 
+  {0x292,0x1B7}, {0x3AC,0x386}, {0x3AD,0x388}, {0x3AE,0x389}, {0x3AF,0x38A}, 
+  {0x3B1,0x391}, {0x3B2,0x392}, {0x3B3,0x393}, {0x3B4,0x394}, {0x3B5,0x395}, 
+  {0x3B6,0x396}, {0x3B7,0x397}, {0x3B8,0x398}, {0x3B9,0x399}, {0x3BA,0x39A}, 
+  {0x3BB,0x39B}, {0x3BC,0x39C}, {0x3BD,0x39D}, {0x3BE,0x39E}, {0x3BF,0x39F}, 
+  {0x3C0,0x3A0}, {0x3C1,0x3A1}, {0x3C2,0x3A3}, {0x3C3,0x3A3}, {0x3C4,0x3A4}, 
+  {0x3C5,0x3A5}, {0x3C6,0x3A6}, {0x3C7,0x3A7}, {0x3C8,0x3A8}, {0x3C9,0x3A9}, 
+  {0x3CA,0x3AA}, {0x3CB,0x3AB}, {0x3CC,0x38C}, {0x3CD,0x38E}, {0x3CE,0x38F}, 
+  {0x3D0,0x392}, {0x3D1,0x398}, {0x3D5,0x3A6}, {0x3D6,0x3A0}, {0x3E3,0x3E2}, 
+  {0x3E5,0x3E4}, {0x3E7,0x3E6}, {0x3E9,0x3E8}, {0x3EB,0x3EA}, {0x3ED,0x3EC}, 
+  {0x3EF,0x3EE}, {0x3F0,0x39A}, {0x3F1,0x3A1}, {0x3F2,0x3A3}, {0x430,0x410}, 
+  {0x431,0x411}, {0x432,0x412}, {0x433,0x413}, {0x434,0x414}, {0x435,0x415}, 
+  {0x436,0x416}, {0x437,0x417}, {0x438,0x418}, {0x439,0x419}, {0x43A,0x41A}, 
+  {0x43B,0x41B}, {0x43C,0x41C}, {0x43D,0x41D}, {0x43E,0x41E}, {0x43F,0x41F}, 
+  {0x440,0x420}, {0x441,0x421}, {0x442,0x422}, {0x443,0x423}, {0x444,0x424}, 
+  {0x445,0x425}, {0x446,0x426}, {0x447,0x427}, {0x448,0x428}, {0x449,0x429}, 
+  {0x44A,0x42A}, {0x44B,0x42B}, {0x44C,0x42C}, {0x44D,0x42D}, {0x44E,0x42E}, 
+  {0x44F,0x42F}, {0x451,0x401}, {0x452,0x402}, {0x453,0x403}, {0x454,0x404}, 
+  {0x455,0x405}, {0x456,0x406}, {0x457,0x407}, {0x458,0x408}, {0x459,0x409}, 
+  {0x45A,0x40A}, {0x45B,0x40B}, {0x45C,0x40C}, {0x45E,0x40E}, {0x45F,0x40F}, 
+  {0x461,0x460}, {0x463,0x462}, {0x465,0x464}, {0x467,0x466}, {0x469,0x468}, 
+  {0x46B,0x46A}, {0x46D,0x46C}, {0x46F,0x46E}, {0x471,0x470}, {0x473,0x472}, 
+  {0x475,0x474}, {0x477,0x476}, {0x479,0x478}, {0x47B,0x47A}, {0x47D,0x47C}, 
+  {0x47F,0x47E}, {0x481,0x480}, {0x491,0x490}, {0x493,0x492}, {0x495,0x494}, 
+  {0x497,0x496}, {0x499,0x498}, {0x49B,0x49A}, {0x49D,0x49C}, {0x49F,0x49E}, 
+  {0x4A1,0x4A0}, {0x4A3,0x4A2}, {0x4A5,0x4A4}, {0x4A7,0x4A6}, {0x4A9,0x4A8}, 
+  {0x4AB,0x4AA}, {0x4AD,0x4AC}, {0x4AF,0x4AE}, {0x4B1,0x4B0}, {0x4B3,0x4B2}, 
+  {0x4B5,0x4B4}, {0x4B7,0x4B6}, {0x4B9,0x4B8}, {0x4BB,0x4BA}, {0x4BD,0x4BC}, 
+  {0x4BF,0x4BE}, {0x4C2,0x4C1}, {0x4C4,0x4C3}, {0x4C8,0x4C7}, {0x4CC,0x4CB}, 
+  {0x4D1,0x4D0}, {0x4D3,0x4D2}, {0x4D5,0x4D4}, {0x4D7,0x4D6}, {0x4D9,0x4D8}, 
+  {0x4DB,0x4DA}, {0x4DD,0x4DC}, {0x4DF,0x4DE}, {0x4E1,0x4E0}, {0x4E3,0x4E2}, 
+  {0x4E5,0x4E4}, {0x4E7,0x4E6}, {0x4E9,0x4E8}, {0x4EB,0x4EA}, {0x4EF,0x4EE}, 
+  {0x4F1,0x4F0}, {0x4F3,0x4F2}, {0x4F5,0x4F4}, {0x4F9,0x4F8}, {0x561,0x531}, 
+  {0x562,0x532}, {0x563,0x533}, {0x564,0x534}, {0x565,0x535}, {0x566,0x536}, 
+  {0x567,0x537}, {0x568,0x538}, {0x569,0x539}, {0x56A,0x53A}, {0x56B,0x53B}, 
+  {0x56C,0x53C}, {0x56D,0x53D}, {0x56E,0x53E}, {0x56F,0x53F}, {0x570,0x540}, 
+  {0x571,0x541}, {0x572,0x542}, {0x573,0x543}, {0x574,0x544}, {0x575,0x545}, 
+  {0x576,0x546}, {0x577,0x547}, {0x578,0x548}, {0x579,0x549}, {0x57A,0x54A}, 
+  {0x57B,0x54B}, {0x57C,0x54C}, {0x57D,0x54D}, {0x57E,0x54E}, {0x57F,0x54F}, 
+  {0x580,0x550}, {0x581,0x551}, {0x582,0x552}, {0x583,0x553}, {0x584,0x554}, 
+  {0x585,0x555}, {0x586,0x556}, {0x1E01,0x1E00}, {0x1E03,0x1E02}, {0x1E05,0x1E04}, 
+  {0x1E07,0x1E06}, {0x1E09,0x1E08}, {0x1E0B,0x1E0A}, {0x1E0D,0x1E0C}, {0x1E0F,0x1E0E}, 
+  {0x1E11,0x1E10}, {0x1E13,0x1E12}, {0x1E15,0x1E14}, {0x1E17,0x1E16}, {0x1E19,0x1E18}, 
+  {0x1E1B,0x1E1A}, {0x1E1D,0x1E1C}, {0x1E1F,0x1E1E}, {0x1E21,0x1E20}, {0x1E23,0x1E22}, 
+  {0x1E25,0x1E24}, {0x1E27,0x1E26}, {0x1E29,0x1E28}, {0x1E2B,0x1E2A}, {0x1E2D,0x1E2C}, 
+  {0x1E2F,0x1E2E}, {0x1E31,0x1E30}, {0x1E33,0x1E32}, {0x1E35,0x1E34}, {0x1E37,0x1E36}, 
+  {0x1E39,0x1E38}, {0x1E3B,0x1E3A}, {0x1E3D,0x1E3C}, {0x1E3F,0x1E3E}, {0x1E41,0x1E40}, 
+  {0x1E43,0x1E42}, {0x1E45,0x1E44}, {0x1E47,0x1E46}, {0x1E49,0x1E48}, {0x1E4B,0x1E4A}, 
+  {0x1E4D,0x1E4C}, {0x1E4F,0x1E4E}, {0x1E51,0x1E50}, {0x1E53,0x1E52}, {0x1E55,0x1E54}, 
+  {0x1E57,0x1E56}, {0x1E59,0x1E58}, {0x1E5B,0x1E5A}, {0x1E5D,0x1E5C}, {0x1E5F,0x1E5E}, 
+  {0x1E61,0x1E60}, {0x1E63,0x1E62}, {0x1E65,0x1E64}, {0x1E67,0x1E66}, {0x1E69,0x1E68}, 
+  {0x1E6B,0x1E6A}, {0x1E6D,0x1E6C}, {0x1E6F,0x1E6E}, {0x1E71,0x1E70}, {0x1E73,0x1E72}, 
+  {0x1E75,0x1E74}, {0x1E77,0x1E76}, {0x1E79,0x1E78}, {0x1E7B,0x1E7A}, {0x1E7D,0x1E7C}, 
+  {0x1E7F,0x1E7E}, {0x1E81,0x1E80}, {0x1E83,0x1E82}, {0x1E85,0x1E84}, {0x1E87,0x1E86}, 
+  {0x1E89,0x1E88}, {0x1E8B,0x1E8A}, {0x1E8D,0x1E8C}, {0x1E8F,0x1E8E}, {0x1E91,0x1E90}, 
+  {0x1E93,0x1E92}, {0x1E95,0x1E94}, {0x1E9B,0x1E60}, {0x1EA1,0x1EA0}, {0x1EA3,0x1EA2}, 
+  {0x1EA5,0x1EA4}, {0x1EA7,0x1EA6}, {0x1EA9,0x1EA8}, {0x1EAB,0x1EAA}, {0x1EAD,0x1EAC}, 
+  {0x1EAF,0x1EAE}, {0x1EB1,0x1EB0}, {0x1EB3,0x1EB2}, {0x1EB5,0x1EB4}, {0x1EB7,0x1EB6}, 
+  {0x1EB9,0x1EB8}, {0x1EBB,0x1EBA}, {0x1EBD,0x1EBC}, {0x1EBF,0x1EBE}, {0x1EC1,0x1EC0}, 
+  {0x1EC3,0x1EC2}, {0x1EC5,0x1EC4}, {0x1EC7,0x1EC6}, {0x1EC9,0x1EC8}, {0x1ECB,0x1ECA}, 
+  {0x1ECD,0x1ECC}, {0x1ECF,0x1ECE}, {0x1ED1,0x1ED0}, {0x1ED3,0x1ED2}, {0x1ED5,0x1ED4}, 
+  {0x1ED7,0x1ED6}, {0x1ED9,0x1ED8}, {0x1EDB,0x1EDA}, {0x1EDD,0x1EDC}, {0x1EDF,0x1EDE}, 
+  {0x1EE1,0x1EE0}, {0x1EE3,0x1EE2}, {0x1EE5,0x1EE4}, {0x1EE7,0x1EE6}, {0x1EE9,0x1EE8}, 
+  {0x1EEB,0x1EEA}, {0x1EED,0x1EEC}, {0x1EEF,0x1EEE}, {0x1EF1,0x1EF0}, {0x1EF3,0x1EF2}, 
+  {0x1EF5,0x1EF4}, {0x1EF7,0x1EF6}, {0x1EF9,0x1EF8}, {0x1F00,0x1F08}, {0x1F01,0x1F09}, 
+  {0x1F02,0x1F0A}, {0x1F03,0x1F0B}, {0x1F04,0x1F0C}, {0x1F05,0x1F0D}, {0x1F06,0x1F0E}, 
+  {0x1F07,0x1F0F}, {0x1F10,0x1F18}, {0x1F11,0x1F19}, {0x1F12,0x1F1A}, {0x1F13,0x1F1B}, 
+  {0x1F14,0x1F1C}, {0x1F15,0x1F1D}, {0x1F20,0x1F28}, {0x1F21,0x1F29}, {0x1F22,0x1F2A}, 
+  {0x1F23,0x1F2B}, {0x1F24,0x1F2C}, {0x1F25,0x1F2D}, {0x1F26,0x1F2E}, {0x1F27,0x1F2F}, 
+  {0x1F30,0x1F38}, {0x1F31,0x1F39}, {0x1F32,0x1F3A}, {0x1F33,0x1F3B}, {0x1F34,0x1F3C}, 
+  {0x1F35,0x1F3D}, {0x1F36,0x1F3E}, {0x1F37,0x1F3F}, {0x1F40,0x1F48}, {0x1F41,0x1F49}, 
+  {0x1F42,0x1F4A}, {0x1F43,0x1F4B}, {0x1F44,0x1F4C}, {0x1F45,0x1F4D}, {0x1F51,0x1F59}, 
+  {0x1F53,0x1F5B}, {0x1F55,0x1F5D}, {0x1F57,0x1F5F}, {0x1F60,0x1F68}, {0x1F61,0x1F69}, 
+  {0x1F62,0x1F6A}, {0x1F63,0x1F6B}, {0x1F64,0x1F6C}, {0x1F65,0x1F6D}, {0x1F66,0x1F6E}, 
+  {0x1F67,0x1F6F}, {0x1F70,0x1FBA}, {0x1F71,0x1FBB}, {0x1F72,0x1FC8}, {0x1F73,0x1FC9}, 
+  {0x1F74,0x1FCA}, {0x1F75,0x1FCB}, {0x1F76,0x1FDA}, {0x1F77,0x1FDB}, {0x1F78,0x1FF8}, 
+  {0x1F79,0x1FF9}, {0x1F7A,0x1FEA}, {0x1F7B,0x1FEB}, {0x1F7C,0x1FFA}, {0x1F7D,0x1FFB}, 
+  {0x1F80,0x1F88}, {0x1F81,0x1F89}, {0x1F82,0x1F8A}, {0x1F83,0x1F8B}, {0x1F84,0x1F8C}, 
+  {0x1F85,0x1F8D}, {0x1F86,0x1F8E}, {0x1F87,0x1F8F}, {0x1F90,0x1F98}, {0x1F91,0x1F99}, 
+  {0x1F92,0x1F9A}, {0x1F93,0x1F9B}, {0x1F94,0x1F9C}, {0x1F95,0x1F9D}, {0x1F96,0x1F9E}, 
+  {0x1F97,0x1F9F}, {0x1FA0,0x1FA8}, {0x1FA1,0x1FA9}, {0x1FA2,0x1FAA}, {0x1FA3,0x1FAB}, 
+  {0x1FA4,0x1FAC}, {0x1FA5,0x1FAD}, {0x1FA6,0x1FAE}, {0x1FA7,0x1FAF}, {0x1FB0,0x1FB8}, 
+  {0x1FB1,0x1FB9}, {0x1FB3,0x1FBC}, {0x1FC3,0x1FCC}, {0x1FD0,0x1FD8}, {0x1FD1,0x1FD9}, 
+  {0x1FE0,0x1FE8}, {0x1FE1,0x1FE9}, {0x1FE5,0x1FEC}, {0x1FF3,0x1FFC}, {0x2170,0x2160}, 
+  {0x2171,0x2161}, {0x2172,0x2162}, {0x2173,0x2163}, {0x2174,0x2164}, {0x2175,0x2165}, 
+  {0x2176,0x2166}, {0x2177,0x2167}, {0x2178,0x2168}, {0x2179,0x2169}, {0x217A,0x216A}, 
+  {0x217B,0x216B}, {0x217C,0x216C}, {0x217D,0x216D}, {0x217E,0x216E}, {0x217F,0x216F}, 
+  {0x24D0,0x24B6}, {0x24D1,0x24B7}, {0x24D2,0x24B8}, {0x24D3,0x24B9}, {0x24D4,0x24BA}, 
+  {0x24D5,0x24BB}, {0x24D6,0x24BC}, {0x24D7,0x24BD}, {0x24D8,0x24BE}, {0x24D9,0x24BF}, 
+  {0x24DA,0x24C0}, {0x24DB,0x24C1}, {0x24DC,0x24C2}, {0x24DD,0x24C3}, {0x24DE,0x24C4}, 
+  {0x24DF,0x24C5}, {0x24E0,0x24C6}, {0x24E1,0x24C7}, {0x24E2,0x24C8}, {0x24E3,0x24C9}, 
+  {0x24E4,0x24CA}, {0x24E5,0x24CB}, {0x24E6,0x24CC}, {0x24E7,0x24CD}, {0x24E8,0x24CE}, 
+  {0x24E9,0x24CF}, {0xFF41,0xFF21}, {0xFF42,0xFF22}, {0xFF43,0xFF23}, {0xFF44,0xFF24}, 
+  {0xFF45,0xFF25}, {0xFF46,0xFF26}, {0xFF47,0xFF27}, {0xFF48,0xFF28}, {0xFF49,0xFF29}, 
+  {0xFF4A,0xFF2A}, {0xFF4B,0xFF2B}, {0xFF4C,0xFF2C}, {0xFF4D,0xFF2D}, {0xFF4E,0xFF2E}, 
+  {0xFF4F,0xFF2F}, {0xFF50,0xFF30}, {0xFF51,0xFF31}, {0xFF52,0xFF32}, {0xFF53,0xFF33}, 
+  {0xFF54,0xFF34}, {0xFF55,0xFF35}, {0xFF56,0xFF36}, {0xFF57,0xFF37}, {0xFF58,0xFF38}, 
+  {0xFF59,0xFF39}, {0xFF5A,0xFF3A} 
+};
+
+
+
+/* All lower-case translations are included here */
+
+#define NUM_TOLOWER_INFO 705
+static const unirelate tolower_info[NUM_TOLOWER_INFO] = {
+  {0x41,0x61}, {0x42,0x62}, {0x43,0x63}, {0x44,0x64}, {0x45,0x65}, 
+  {0x46,0x66}, {0x47,0x67}, {0x48,0x68}, {0x49,0x69}, {0x4A,0x6A}, 
+  {0x4B,0x6B}, {0x4C,0x6C}, {0x4D,0x6D}, {0x4E,0x6E}, {0x4F,0x6F}, 
+  {0x50,0x70}, {0x51,0x71}, {0x52,0x72}, {0x53,0x73}, {0x54,0x74}, 
+  {0x55,0x75}, {0x56,0x76}, {0x57,0x77}, {0x58,0x78}, {0x59,0x79}, 
+  {0x5A,0x7A}, {0xC0,0xE0}, {0xC1,0xE1}, {0xC2,0xE2}, {0xC3,0xE3}, 
+  {0xC4,0xE4}, {0xC5,0xE5}, {0xC6,0xE6}, {0xC7,0xE7}, {0xC8,0xE8}, 
+  {0xC9,0xE9}, {0xCA,0xEA}, {0xCB,0xEB}, {0xCC,0xEC}, {0xCD,0xED}, 
+  {0xCE,0xEE}, {0xCF,0xEF}, {0xD0,0xF0}, {0xD1,0xF1}, {0xD2,0xF2}, 
+  {0xD3,0xF3}, {0xD4,0xF4}, {0xD5,0xF5}, {0xD6,0xF6}, {0xD8,0xF8}, 
+  {0xD9,0xF9}, {0xDA,0xFA}, {0xDB,0xFB}, {0xDC,0xFC}, {0xDD,0xFD}, 
+  {0xDE,0xFE}, {0x100,0x101}, {0x102,0x103}, {0x104,0x105}, {0x106,0x107}, 
+  {0x108,0x109}, {0x10A,0x10B}, {0x10C,0x10D}, {0x10E,0x10F}, {0x110,0x111}, 
+  {0x112,0x113}, {0x114,0x115}, {0x116,0x117}, {0x118,0x119}, {0x11A,0x11B}, 
+  {0x11C,0x11D}, {0x11E,0x11F}, {0x120,0x121}, {0x122,0x123}, {0x124,0x125}, 
+  {0x126,0x127}, {0x128,0x129}, {0x12A,0x12B}, {0x12C,0x12D}, {0x12E,0x12F}, 
+  {0x130,0x69}, {0x132,0x133}, {0x134,0x135}, {0x136,0x137}, {0x139,0x13A}, 
+  {0x13B,0x13C}, {0x13D,0x13E}, {0x13F,0x140}, {0x141,0x142}, {0x143,0x144}, 
+  {0x145,0x146}, {0x147,0x148}, {0x14A,0x14B}, {0x14C,0x14D}, {0x14E,0x14F}, 
+  {0x150,0x151}, {0x152,0x153}, {0x154,0x155}, {0x156,0x157}, {0x158,0x159}, 
+  {0x15A,0x15B}, {0x15C,0x15D}, {0x15E,0x15F}, {0x160,0x161}, {0x162,0x163}, 
+  {0x164,0x165}, {0x166,0x167}, {0x168,0x169}, {0x16A,0x16B}, {0x16C,0x16D}, 
+  {0x16E,0x16F}, {0x170,0x171}, {0x172,0x173}, {0x174,0x175}, {0x176,0x177}, 
+  {0x178,0xFF}, {0x179,0x17A}, {0x17B,0x17C}, {0x17D,0x17E}, {0x181,0x253}, 
+  {0x182,0x183}, {0x184,0x185}, {0x186,0x254}, {0x187,0x188}, {0x189,0x256}, 
+  {0x18A,0x257}, {0x18B,0x18C}, {0x18E,0x1DD}, {0x18F,0x259}, {0x190,0x25B}, 
+  {0x191,0x192}, {0x193,0x260}, {0x194,0x263}, {0x196,0x269}, {0x197,0x268}, 
+  {0x198,0x199}, {0x19C,0x26F}, {0x19D,0x272}, {0x19F,0x275}, {0x1A0,0x1A1}, 
+  {0x1A2,0x1A3}, {0x1A4,0x1A5}, {0x1A7,0x1A8}, {0x1A9,0x283}, {0x1AC,0x1AD}, 
+  {0x1AE,0x288}, {0x1AF,0x1B0}, {0x1B1,0x28A}, {0x1B2,0x28B}, {0x1B3,0x1B4}, 
+  {0x1B5,0x1B6}, {0x1B7,0x292}, {0x1B8,0x1B9}, {0x1BC,0x1BD}, {0x1C4,0x1C6}, 
+  {0x1C5,0x1C6}, {0x1C7,0x1C9}, {0x1C8,0x1C9}, {0x1CA,0x1CC}, {0x1CB,0x1CC}, 
+  {0x1CD,0x1CE}, {0x1CF,0x1D0}, {0x1D1,0x1D2}, {0x1D3,0x1D4}, {0x1D5,0x1D6}, 
+  {0x1D7,0x1D8}, {0x1D9,0x1DA}, {0x1DB,0x1DC}, {0x1DE,0x1DF}, {0x1E0,0x1E1}, 
+  {0x1E2,0x1E3}, {0x1E4,0x1E5}, {0x1E6,0x1E7}, {0x1E8,0x1E9}, {0x1EA,0x1EB}, 
+  {0x1EC,0x1ED}, {0x1EE,0x1EF}, {0x1F1,0x1F3}, {0x1F2,0x1F3}, {0x1F4,0x1F5}, 
+  {0x1FA,0x1FB}, {0x1FC,0x1FD}, {0x1FE,0x1FF}, {0x200,0x201}, {0x202,0x203}, 
+  {0x204,0x205}, {0x206,0x207}, {0x208,0x209}, {0x20A,0x20B}, {0x20C,0x20D}, 
+  {0x20E,0x20F}, {0x210,0x211}, {0x212,0x213}, {0x214,0x215}, {0x216,0x217}, 
+  {0x386,0x3AC}, {0x388,0x3AD}, {0x389,0x3AE}, {0x38A,0x3AF}, {0x38C,0x3CC}, 
+  {0x38E,0x3CD}, {0x38F,0x3CE}, {0x391,0x3B1}, {0x392,0x3B2}, {0x393,0x3B3}, 
+  {0x394,0x3B4}, {0x395,0x3B5}, {0x396,0x3B6}, {0x397,0x3B7}, {0x398,0x3B8}, 
+  {0x399,0x3B9}, {0x39A,0x3BA}, {0x39B,0x3BB}, {0x39C,0x3BC}, {0x39D,0x3BD}, 
+  {0x39E,0x3BE}, {0x39F,0x3BF}, {0x3A0,0x3C0}, {0x3A1,0x3C1}, {0x3A3,0x3C3}, 
+  {0x3A4,0x3C4}, {0x3A5,0x3C5}, {0x3A6,0x3C6}, {0x3A7,0x3C7}, {0x3A8,0x3C8}, 
+  {0x3A9,0x3C9}, {0x3AA,0x3CA}, {0x3AB,0x3CB}, {0x3E2,0x3E3}, {0x3E4,0x3E5}, 
+  {0x3E6,0x3E7}, {0x3E8,0x3E9}, {0x3EA,0x3EB}, {0x3EC,0x3ED}, {0x3EE,0x3EF}, 
+  {0x401,0x451}, {0x402,0x452}, {0x403,0x453}, {0x404,0x454}, {0x405,0x455}, 
+  {0x406,0x456}, {0x407,0x457}, {0x408,0x458}, {0x409,0x459}, {0x40A,0x45A}, 
+  {0x40B,0x45B}, {0x40C,0x45C}, {0x40E,0x45E}, {0x40F,0x45F}, {0x410,0x430}, 
+  {0x411,0x431}, {0x412,0x432}, {0x413,0x433}, {0x414,0x434}, {0x415,0x435}, 
+  {0x416,0x436}, {0x417,0x437}, {0x418,0x438}, {0x419,0x439}, {0x41A,0x43A}, 
+  {0x41B,0x43B}, {0x41C,0x43C}, {0x41D,0x43D}, {0x41E,0x43E}, {0x41F,0x43F}, 
+  {0x420,0x440}, {0x421,0x441}, {0x422,0x442}, {0x423,0x443}, {0x424,0x444}, 
+  {0x425,0x445}, {0x426,0x446}, {0x427,0x447}, {0x428,0x448}, {0x429,0x449}, 
+  {0x42A,0x44A}, {0x42B,0x44B}, {0x42C,0x44C}, {0x42D,0x44D}, {0x42E,0x44E}, 
+  {0x42F,0x44F}, {0x460,0x461}, {0x462,0x463}, {0x464,0x465}, {0x466,0x467}, 
+  {0x468,0x469}, {0x46A,0x46B}, {0x46C,0x46D}, {0x46E,0x46F}, {0x470,0x471}, 
+  {0x472,0x473}, {0x474,0x475}, {0x476,0x477}, {0x478,0x479}, {0x47A,0x47B}, 
+  {0x47C,0x47D}, {0x47E,0x47F}, {0x480,0x481}, {0x490,0x491}, {0x492,0x493}, 
+  {0x494,0x495}, {0x496,0x497}, {0x498,0x499}, {0x49A,0x49B}, {0x49C,0x49D}, 
+  {0x49E,0x49F}, {0x4A0,0x4A1}, {0x4A2,0x4A3}, {0x4A4,0x4A5}, {0x4A6,0x4A7}, 
+  {0x4A8,0x4A9}, {0x4AA,0x4AB}, {0x4AC,0x4AD}, {0x4AE,0x4AF}, {0x4B0,0x4B1}, 
+  {0x4B2,0x4B3}, {0x4B4,0x4B5}, {0x4B6,0x4B7}, {0x4B8,0x4B9}, {0x4BA,0x4BB}, 
+  {0x4BC,0x4BD}, {0x4BE,0x4BF}, {0x4C1,0x4C2}, {0x4C3,0x4C4}, {0x4C7,0x4C8}, 
+  {0x4CB,0x4CC}, {0x4D0,0x4D1}, {0x4D2,0x4D3}, {0x4D4,0x4D5}, {0x4D6,0x4D7}, 
+  {0x4D8,0x4D9}, {0x4DA,0x4DB}, {0x4DC,0x4DD}, {0x4DE,0x4DF}, {0x4E0,0x4E1}, 
+  {0x4E2,0x4E3}, {0x4E4,0x4E5}, {0x4E6,0x4E7}, {0x4E8,0x4E9}, {0x4EA,0x4EB}, 
+  {0x4EE,0x4EF}, {0x4F0,0x4F1}, {0x4F2,0x4F3}, {0x4F4,0x4F5}, {0x4F8,0x4F9}, 
+  {0x531,0x561}, {0x532,0x562}, {0x533,0x563}, {0x534,0x564}, {0x535,0x565}, 
+  {0x536,0x566}, {0x537,0x567}, {0x538,0x568}, {0x539,0x569}, {0x53A,0x56A}, 
+  {0x53B,0x56B}, {0x53C,0x56C}, {0x53D,0x56D}, {0x53E,0x56E}, {0x53F,0x56F}, 
+  {0x540,0x570}, {0x541,0x571}, {0x542,0x572}, {0x543,0x573}, {0x544,0x574}, 
+  {0x545,0x575}, {0x546,0x576}, {0x547,0x577}, {0x548,0x578}, {0x549,0x579}, 
+  {0x54A,0x57A}, {0x54B,0x57B}, {0x54C,0x57C}, {0x54D,0x57D}, {0x54E,0x57E}, 
+  {0x54F,0x57F}, {0x550,0x580}, {0x551,0x581}, {0x552,0x582}, {0x553,0x583}, 
+  {0x554,0x584}, {0x555,0x585}, {0x556,0x586}, {0x10A0,0x10D0}, {0x10A1,0x10D1}, 
+  {0x10A2,0x10D2}, {0x10A3,0x10D3}, {0x10A4,0x10D4}, {0x10A5,0x10D5}, {0x10A6,0x10D6}, 
+  {0x10A7,0x10D7}, {0x10A8,0x10D8}, {0x10A9,0x10D9}, {0x10AA,0x10DA}, {0x10AB,0x10DB}, 
+  {0x10AC,0x10DC}, {0x10AD,0x10DD}, {0x10AE,0x10DE}, {0x10AF,0x10DF}, {0x10B0,0x10E0}, 
+  {0x10B1,0x10E1}, {0x10B2,0x10E2}, {0x10B3,0x10E3}, {0x10B4,0x10E4}, {0x10B5,0x10E5}, 
+  {0x10B6,0x10E6}, {0x10B7,0x10E7}, {0x10B8,0x10E8}, {0x10B9,0x10E9}, {0x10BA,0x10EA}, 
+  {0x10BB,0x10EB}, {0x10BC,0x10EC}, {0x10BD,0x10ED}, {0x10BE,0x10EE}, {0x10BF,0x10EF}, 
+  {0x10C0,0x10F0}, {0x10C1,0x10F1}, {0x10C2,0x10F2}, {0x10C3,0x10F3}, {0x10C4,0x10F4}, 
+  {0x10C5,0x10F5}, {0x1E00,0x1E01}, {0x1E02,0x1E03}, {0x1E04,0x1E05}, {0x1E06,0x1E07}, 
+  {0x1E08,0x1E09}, {0x1E0A,0x1E0B}, {0x1E0C,0x1E0D}, {0x1E0E,0x1E0F}, {0x1E10,0x1E11}, 
+  {0x1E12,0x1E13}, {0x1E14,0x1E15}, {0x1E16,0x1E17}, {0x1E18,0x1E19}, {0x1E1A,0x1E1B}, 
+  {0x1E1C,0x1E1D}, {0x1E1E,0x1E1F}, {0x1E20,0x1E21}, {0x1E22,0x1E23}, {0x1E24,0x1E25}, 
+  {0x1E26,0x1E27}, {0x1E28,0x1E29}, {0x1E2A,0x1E2B}, {0x1E2C,0x1E2D}, {0x1E2E,0x1E2F}, 
+  {0x1E30,0x1E31}, {0x1E32,0x1E33}, {0x1E34,0x1E35}, {0x1E36,0x1E37}, {0x1E38,0x1E39}, 
+  {0x1E3A,0x1E3B}, {0x1E3C,0x1E3D}, {0x1E3E,0x1E3F}, {0x1E40,0x1E41}, {0x1E42,0x1E43}, 
+  {0x1E44,0x1E45}, {0x1E46,0x1E47}, {0x1E48,0x1E49}, {0x1E4A,0x1E4B}, {0x1E4C,0x1E4D}, 
+  {0x1E4E,0x1E4F}, {0x1E50,0x1E51}, {0x1E52,0x1E53}, {0x1E54,0x1E55}, {0x1E56,0x1E57}, 
+  {0x1E58,0x1E59}, {0x1E5A,0x1E5B}, {0x1E5C,0x1E5D}, {0x1E5E,0x1E5F}, {0x1E60,0x1E61}, 
+  {0x1E62,0x1E63}, {0x1E64,0x1E65}, {0x1E66,0x1E67}, {0x1E68,0x1E69}, {0x1E6A,0x1E6B}, 
+  {0x1E6C,0x1E6D}, {0x1E6E,0x1E6F}, {0x1E70,0x1E71}, {0x1E72,0x1E73}, {0x1E74,0x1E75}, 
+  {0x1E76,0x1E77}, {0x1E78,0x1E79}, {0x1E7A,0x1E7B}, {0x1E7C,0x1E7D}, {0x1E7E,0x1E7F}, 
+  {0x1E80,0x1E81}, {0x1E82,0x1E83}, {0x1E84,0x1E85}, {0x1E86,0x1E87}, {0x1E88,0x1E89}, 
+  {0x1E8A,0x1E8B}, {0x1E8C,0x1E8D}, {0x1E8E,0x1E8F}, {0x1E90,0x1E91}, {0x1E92,0x1E93}, 
+  {0x1E94,0x1E95}, {0x1EA0,0x1EA1}, {0x1EA2,0x1EA3}, {0x1EA4,0x1EA5}, {0x1EA6,0x1EA7}, 
+  {0x1EA8,0x1EA9}, {0x1EAA,0x1EAB}, {0x1EAC,0x1EAD}, {0x1EAE,0x1EAF}, {0x1EB0,0x1EB1}, 
+  {0x1EB2,0x1EB3}, {0x1EB4,0x1EB5}, {0x1EB6,0x1EB7}, {0x1EB8,0x1EB9}, {0x1EBA,0x1EBB}, 
+  {0x1EBC,0x1EBD}, {0x1EBE,0x1EBF}, {0x1EC0,0x1EC1}, {0x1EC2,0x1EC3}, {0x1EC4,0x1EC5}, 
+  {0x1EC6,0x1EC7}, {0x1EC8,0x1EC9}, {0x1ECA,0x1ECB}, {0x1ECC,0x1ECD}, {0x1ECE,0x1ECF}, 
+  {0x1ED0,0x1ED1}, {0x1ED2,0x1ED3}, {0x1ED4,0x1ED5}, {0x1ED6,0x1ED7}, {0x1ED8,0x1ED9}, 
+  {0x1EDA,0x1EDB}, {0x1EDC,0x1EDD}, {0x1EDE,0x1EDF}, {0x1EE0,0x1EE1}, {0x1EE2,0x1EE3}, 
+  {0x1EE4,0x1EE5}, {0x1EE6,0x1EE7}, {0x1EE8,0x1EE9}, {0x1EEA,0x1EEB}, {0x1EEC,0x1EED}, 
+  {0x1EEE,0x1EEF}, {0x1EF0,0x1EF1}, {0x1EF2,0x1EF3}, {0x1EF4,0x1EF5}, {0x1EF6,0x1EF7}, 
+  {0x1EF8,0x1EF9}, {0x1F08,0x1F00}, {0x1F09,0x1F01}, {0x1F0A,0x1F02}, {0x1F0B,0x1F03}, 
+  {0x1F0C,0x1F04}, {0x1F0D,0x1F05}, {0x1F0E,0x1F06}, {0x1F0F,0x1F07}, {0x1F18,0x1F10}, 
+  {0x1F19,0x1F11}, {0x1F1A,0x1F12}, {0x1F1B,0x1F13}, {0x1F1C,0x1F14}, {0x1F1D,0x1F15}, 
+  {0x1F28,0x1F20}, {0x1F29,0x1F21}, {0x1F2A,0x1F22}, {0x1F2B,0x1F23}, {0x1F2C,0x1F24}, 
+  {0x1F2D,0x1F25}, {0x1F2E,0x1F26}, {0x1F2F,0x1F27}, {0x1F38,0x1F30}, {0x1F39,0x1F31}, 
+  {0x1F3A,0x1F32}, {0x1F3B,0x1F33}, {0x1F3C,0x1F34}, {0x1F3D,0x1F35}, {0x1F3E,0x1F36}, 
+  {0x1F3F,0x1F37}, {0x1F48,0x1F40}, {0x1F49,0x1F41}, {0x1F4A,0x1F42}, {0x1F4B,0x1F43}, 
+  {0x1F4C,0x1F44}, {0x1F4D,0x1F45}, {0x1F59,0x1F51}, {0x1F5B,0x1F53}, {0x1F5D,0x1F55}, 
+  {0x1F5F,0x1F57}, {0x1F68,0x1F60}, {0x1F69,0x1F61}, {0x1F6A,0x1F62}, {0x1F6B,0x1F63}, 
+  {0x1F6C,0x1F64}, {0x1F6D,0x1F65}, {0x1F6E,0x1F66}, {0x1F6F,0x1F67}, {0x1F88,0x1F80}, 
+  {0x1F89,0x1F81}, {0x1F8A,0x1F82}, {0x1F8B,0x1F83}, {0x1F8C,0x1F84}, {0x1F8D,0x1F85}, 
+  {0x1F8E,0x1F86}, {0x1F8F,0x1F87}, {0x1F98,0x1F90}, {0x1F99,0x1F91}, {0x1F9A,0x1F92}, 
+  {0x1F9B,0x1F93}, {0x1F9C,0x1F94}, {0x1F9D,0x1F95}, {0x1F9E,0x1F96}, {0x1F9F,0x1F97}, 
+  {0x1FA8,0x1FA0}, {0x1FA9,0x1FA1}, {0x1FAA,0x1FA2}, {0x1FAB,0x1FA3}, {0x1FAC,0x1FA4}, 
+  {0x1FAD,0x1FA5}, {0x1FAE,0x1FA6}, {0x1FAF,0x1FA7}, {0x1FB8,0x1FB0}, {0x1FB9,0x1FB1}, 
+  {0x1FBA,0x1F70}, {0x1FBB,0x1F71}, {0x1FBC,0x1FB3}, {0x1FC8,0x1F72}, {0x1FC9,0x1F73}, 
+  {0x1FCA,0x1F74}, {0x1FCB,0x1F75}, {0x1FCC,0x1FC3}, {0x1FD8,0x1FD0}, {0x1FD9,0x1FD1}, 
+  {0x1FDA,0x1F76}, {0x1FDB,0x1F77}, {0x1FE8,0x1FE0}, {0x1FE9,0x1FE1}, {0x1FEA,0x1F7A}, 
+  {0x1FEB,0x1F7B}, {0x1FEC,0x1FE5}, {0x1FF8,0x1F78}, {0x1FF9,0x1F79}, {0x1FFA,0x1F7C}, 
+  {0x1FFB,0x1F7D}, {0x1FFC,0x1FF3}, {0x2160,0x2170}, {0x2161,0x2171}, {0x2162,0x2172}, 
+  {0x2163,0x2173}, {0x2164,0x2174}, {0x2165,0x2175}, {0x2166,0x2176}, {0x2167,0x2177}, 
+  {0x2168,0x2178}, {0x2169,0x2179}, {0x216A,0x217A}, {0x216B,0x217B}, {0x216C,0x217C}, 
+  {0x216D,0x217D}, {0x216E,0x217E}, {0x216F,0x217F}, {0x24B6,0x24D0}, {0x24B7,0x24D1}, 
+  {0x24B8,0x24D2}, {0x24B9,0x24D3}, {0x24BA,0x24D4}, {0x24BB,0x24D5}, {0x24BC,0x24D6}, 
+  {0x24BD,0x24D7}, {0x24BE,0x24D8}, {0x24BF,0x24D9}, {0x24C0,0x24DA}, {0x24C1,0x24DB}, 
+  {0x24C2,0x24DC}, {0x24C3,0x24DD}, {0x24C4,0x24DE}, {0x24C5,0x24DF}, {0x24C6,0x24E0}, 
+  {0x24C7,0x24E1}, {0x24C8,0x24E2}, {0x24C9,0x24E3}, {0x24CA,0x24E4}, {0x24CB,0x24E5}, 
+  {0x24CC,0x24E6}, {0x24CD,0x24E7}, {0x24CE,0x24E8}, {0x24CF,0x24E9}, {0xFF21,0xFF41}, 
+  {0xFF22,0xFF42}, {0xFF23,0xFF43}, {0xFF24,0xFF44}, {0xFF25,0xFF45}, {0xFF26,0xFF46}, 
+  {0xFF27,0xFF47}, {0xFF28,0xFF48}, {0xFF29,0xFF49}, {0xFF2A,0xFF4A}, {0xFF2B,0xFF4B}, 
+  {0xFF2C,0xFF4C}, {0xFF2D,0xFF4D}, {0xFF2E,0xFF4E}, {0xFF2F,0xFF4F}, {0xFF30,0xFF50}, 
+  {0xFF31,0xFF51}, {0xFF32,0xFF52}, {0xFF33,0xFF53}, {0xFF34,0xFF54}, {0xFF35,0xFF55}, 
+  {0xFF36,0xFF56}, {0xFF37,0xFF57}, {0xFF38,0xFF58}, {0xFF39,0xFF59}, {0xFF3A,0xFF5A}
+};
+
+
+
+#define NUM_TOSIMPLIFIED_INFO 2145
+static const unirelate tosimplified_info[NUM_TOSIMPLIFIED_INFO] = {
+  {0x4E48,0x9EBD}, {0x4E82,0x4E71}, {0x4E9E,0x4E9A}, {0x4F47,0x4F2B}, {0x4F59,0x9980}, 
+  {0x4F86,0x6765}, {0x4F96,0x4ED1}, {0x4FE0,0x4FA0}, {0x5000,0x4F25}, {0x5006,0x4FE9}, 
+  {0x5009,0x4ED3}, {0x500B,0x4E2A}, {0x5011,0x4EEC}, {0x502B,0x4F26}, {0x5049,0x4F1F}, 
+  {0x5074,0x4FA7}, {0x5075,0x4FA6}, {0x5096,0x4F27}, {0x5098,0x4F1E}, {0x5099,0x5907}, 
+  {0x50AD,0x4F63}, {0x50B3,0x4F20}, {0x50B4,0x4F1B}, {0x50B5,0x503A}, {0x50B7,0x4F24}, 
+  {0x50BE,0x503E}, {0x50C2,0x507B}, {0x50C5,0x4EC5}, {0x50C9,0x4F65}, {0x50D1,0x4FA8}, 
+  {0x50D5,0x4EC6}, {0x50DE,0x4F2A}, {0x50E5,0x4FA5}, {0x50E8,0x507E}, {0x50F9,0x4EF7}, 
+  {0x5100,0x4EEA}, {0x5102,0x4FAC}, {0x5104,0x4EBF}, {0x5108,0x4FA9}, {0x5109,0x4FED}, 
+  {0x5110,0x50A7}, {0x5114,0x4FE6}, {0x5115,0x4FAA}, {0x511F,0x507F}, {0x512A,0x4F18}, 
+  {0x5132,0x50A8}, {0x5137,0x4FEA}, {0x513A,0x50A9}, {0x513B,0x50A5}, {0x513C,0x4FE8}, 
+  {0x5152,0x513F}, {0x5169,0x4E24}, {0x51C8,0x51C0}, {0x51CD,0x51BB}, {0x51F1,0x51EF}, 
+  {0x5244,0x522D}, {0x5247,0x5219}, {0x525B,0x521A}, {0x526E,0x5250}, {0x5274,0x5240}, 
+  {0x5275,0x521B}, {0x5283,0x5212}, {0x5287,0x5267}, {0x5289,0x5218}, {0x528A,0x523D}, 
+  {0x528C,0x523F}, {0x528D,0x5251}, {0x5291,0x5242}, {0x52C1,0x52B2}, {0x52D5,0x52A8}, 
+  {0x52D9,0x52A1}, {0x52DB,0x52CB}, {0x52DD,0x80DC}, {0x52DE,0x52B3}, {0x52E2,0x52BF}, 
+  {0x52F1,0x52A2}, {0x52F5,0x52B1}, {0x52F8,0x529D}, {0x532D,0x5326}, {0x532F,0x6C47}, 
+  {0x5331,0x532E}, {0x5340,0x533A}, {0x5354,0x534F}, {0x5399,0x538D}, {0x53A0,0x5395}, 
+  {0x53AD,0x538C}, {0x53B2,0x5389}, {0x53B4,0x53A3}, {0x53C3,0x53C2}, {0x53E2,0x4E1B}, 
+  {0x540E,0x5F8C}, {0x54BC,0x5459}, {0x54E1,0x5458}, {0x5504,0x5457}, {0x554F,0x95EE}, 
+  {0x5553,0x542F}, {0x555E,0x54D1}, {0x559A,0x5524}, {0x55AA,0x4E27}, {0x55AC,0x4E54}, 
+  {0x55AE,0x5355}, {0x55B2,0x54DF}, {0x55C6,0x545B}, {0x55C7,0x556C}, {0x55CE,0x5417}, 
+  {0x55DA,0x545C}, {0x55E9,0x5522}, {0x55F6,0x54D4}, {0x5606,0x53F9}, {0x560D,0x55BD}, 
+  {0x5614,0x5455}, {0x5616,0x5567}, {0x5617,0x5C1D}, {0x561C,0x551B}, {0x5629,0x54D7}, 
+  {0x562E,0x5520}, {0x562F,0x5578}, {0x5630,0x53FD}, {0x5635,0x54D3}, {0x5638,0x5452}, 
+  {0x565D,0x549D}, {0x5660,0x54D2}, {0x5665,0x54DD}, {0x5666,0x54D5}, {0x566F,0x55F3}, 
+  {0x5672,0x54D9}, {0x5674,0x55B7}, {0x5678,0x5428}, {0x5680,0x549B}, {0x5687,0x5413}, 
+  {0x568C,0x54DC}, {0x5695,0x565C}, {0x5699,0x556E}, {0x56A6,0x5456}, {0x56A8,0x5499}, 
+  {0x56B3,0x55BE}, {0x56B4,0x4E25}, {0x56B6,0x5624}, {0x56C0,0x556D}, {0x56C1,0x55EB}, 
+  {0x56C2,0x56A3}, {0x56C5,0x5181}, {0x56C8,0x5453}, {0x56D1,0x5631}, {0x5707,0x56F5}, 
+  {0x570B,0x56FD}, {0x570D,0x56F4}, {0x5712,0x56ED}, {0x5713,0x5706}, {0x5716,0x56FE}, 
+  {0x5718,0x56E2}, {0x57E1,0x57AD}, {0x57F7,0x6267}, {0x5805,0x575A}, {0x580A,0x57A9}, 
+  {0x5816,0x57B4}, {0x581D,0x57DA}, {0x582F,0x5C27}, {0x5831,0x62A5}, {0x5834,0x573A}, 
+  {0x584A,0x5757}, {0x584B,0x8314}, {0x584F,0x57B2}, {0x5852,0x57D8}, {0x5857,0x6D82}, 
+  {0x5862,0x575E}, {0x5864,0x57D9}, {0x5875,0x5C18}, {0x5879,0x5811}, {0x588A,0x57AB}, 
+  {0x589C,0x5760}, {0x58AE,0x5815}, {0x58B3,0x575F}, {0x58BB,0x5899}, {0x58BE,0x57A6}, 
+  {0x58C7,0x575B}, {0x58D3,0x538B}, {0x58D8,0x5792}, {0x58D9,0x5739}, {0x58DA,0x5786}, 
+  {0x58DE,0x574F}, {0x58DF,0x5784}, {0x58E0,0x5785}, {0x58E2,0x575C}, {0x58E9,0x575D}, 
+  {0x58EF,0x58EE}, {0x58FA,0x58F6}, {0x58FD,0x5BFF}, {0x5922,0x68A6}, {0x593E,0x5939}, 
+  {0x5950,0x5942}, {0x5969,0x5941}, {0x596A,0x593A}, {0x596C,0x5956}, {0x596E,0x594B}, 
+  {0x599D,0x5986}, {0x5A41,0x5A04}, {0x5A66,0x5987}, {0x5A6D,0x5A05}, {0x5AA7,0x5A32}, 
+  {0x5ABD,0x5988}, {0x5AD7,0x59AA}, {0x5AF5,0x59A9}, {0x5AFB,0x5A34}, {0x5B00,0x59AB}, 
+  {0x5B08,0x5A06}, {0x5B0B,0x5A75}, {0x5B0C,0x5A07}, {0x5B19,0x5AF1}, {0x5B21,0x5AD2}, 
+  {0x5B2A,0x5AD4}, {0x5B30,0x5A74}, {0x5B38,0x5A76}, {0x5B4C,0x5A08}, {0x5B6B,0x5B59}, 
+  {0x5B78,0x5B66}, {0x5B7F,0x5B6A}, {0x5BE2,0x5BDD}, {0x5BE6,0x5B9E}, {0x5BE7,0x5B81}, 
+  {0x5BE9,0x5BA1}, {0x5BEB,0x5199}, {0x5BEC,0x5BBD}, {0x5BF5,0x5BA0}, {0x5BF6,0x5B9D}, 
+  {0x5C07,0x5C06}, {0x5C08,0x4E13}, {0x5C0B,0x5BFB}, {0x5C0D,0x5BF9}, {0x5C0E,0x5BFC}, 
+  {0x5C37,0x5C34}, {0x5C62,0x5C61}, {0x5C64,0x5C42}, {0x5C68,0x5C66}, {0x5C6C,0x5C5E}, 
+  {0x5CA1,0x5188}, {0x5CF4,0x5C98}, {0x5CF6,0x5C9B}, {0x5CFD,0x5CE1}, {0x5D0D,0x5D03}, 
+  {0x5D17,0x5C97}, {0x5D22,0x5CE5}, {0x5D2C,0x5CBD}, {0x5D50,0x5C9A}, {0x5D81,0x5D5D}, 
+  {0x5D84,0x5D2D}, {0x5D87,0x5C96}, {0x5D97,0x5D02}, {0x5DA0,0x5CE4}, {0x5DA7,0x5CC4}, 
+  {0x5DB8,0x5D58}, {0x5DBA,0x5CAD}, {0x5DBC,0x5C7F}, {0x5DCB,0x5CBF}, {0x5DD2,0x5CE6}, 
+  {0x5DD4,0x5DC5}, {0x5DF0,0x5DEF}, {0x5E25,0x5E05}, {0x5E2B,0x5E08}, {0x5E33,0x5E10}, 
+  {0x5E36,0x5E26}, {0x5E40,0x5E27}, {0x5E43,0x5E0F}, {0x5E57,0x5E3C}, {0x5E58,0x5E3B}, 
+  {0x5E5F,0x5E1C}, {0x5E63,0x5E01}, {0x5E6B,0x5E2E}, {0x5E6C,0x5E31}, {0x5E79,0x5E72}, 
+  {0x5E7E,0x51E0}, {0x5EAB,0x5E93}, {0x5EDF,0x5E99}, {0x5EE0,0x5382}, {0x5EE1,0x5E91}, 
+  {0x5EE2,0x5E9F}, {0x5EE3,0x5E7F}, {0x5EEC,0x5E90}, {0x5EF3,0x5385}, {0x5F33,0x5F2A}, 
+  {0x5F35,0x5F20}, {0x5F48,0x5F39}, {0x5F4C,0x5F25}, {0x5F4E,0x5F2F}, {0x5F8C,0x540E}, 
+  {0x5F91,0x5F84}, {0x5F9E,0x4ECE}, {0x5FA0,0x5F95}, {0x5FA9,0x590D}, {0x5FB9,0x5F7B}, 
+  {0x60B5,0x6005}, {0x60B6,0x95F7}, {0x60E1,0x6076}, {0x60F1,0x607C}, {0x60F2,0x607D}, 
+  {0x60FB,0x607B}, {0x611B,0x7231}, {0x611C,0x60EC}, {0x6134,0x6006}, {0x6137,0x607A}, 
+  {0x613E,0x5FFE}, {0x614B,0x6001}, {0x6158,0x60E8}, {0x615A,0x60ED}, {0x615F,0x6078}, 
+  {0x6163,0x60EF}, {0x6164,0x60AB}, {0x616A,0x6004}, {0x616B,0x6002}, {0x616E,0x8651}, 
+  {0x6173,0x60AD}, {0x6176,0x5E86}, {0x6182,0x5FE7}, {0x618A,0x60EB}, {0x6190,0x601C}, 
+  {0x6191,0x51ED}, {0x6192,0x6126}, {0x619A,0x60EE}, {0x61A4,0x6124}, {0x61AB,0x60AF}, 
+  {0x61AE,0x6003}, {0x61B2,0x5BAA}, {0x61B6,0x5FC6}, {0x61C7,0x6073}, {0x61C9,0x5E94}, 
+  {0x61CC,0x603F}, {0x61DF,0x603C}, {0x61E3,0x61D1}, {0x61E8,0x6079}, {0x61F2,0x60E9}, 
+  {0x61F6,0x61D2}, {0x61F7,0x6000}, {0x61F8,0x60AC}, {0x61FA,0x5FCF}, {0x61FC,0x60E7}, 
+  {0x61FE,0x6151}, {0x6200,0x604B}, {0x6207,0x6206}, {0x6214,0x620B}, {0x6227,0x6217}, 
+  {0x6229,0x622C}, {0x6230,0x6218}, {0x6232,0x620F}, {0x633E,0x631F}, {0x6368,0x820D}, 
+  {0x636B,0x626A}, {0x6383,0x626B}, {0x6384,0x62A1}, {0x6399,0x6323}, {0x63C0,0x62E3}, 
+  {0x63DA,0x626C}, {0x63DB,0x6362}, {0x63EE,0x6325}, {0x640D,0x635F}, {0x6417,0x6363}, 
+  {0x6436,0x62A2}, {0x6451,0x63B4}, {0x645C,0x63BC}, {0x645F,0x6402}, {0x646F,0x631A}, 
+  {0x6473,0x62A0}, {0x6476,0x629F}, {0x647B,0x63BA}, {0x6488,0x635E}, {0x6493,0x6320}, 
+  {0x649F,0x6322}, {0x64A3,0x63B8}, {0x64A5,0x62E8}, {0x64AB,0x629A}, {0x64B2,0x6251}, 
+  {0x64B3,0x63FF}, {0x64BB,0x631E}, {0x64BE,0x631D}, {0x64BF,0x6361}, {0x64C1,0x62E5}, 
+  {0x64C4,0x63B3}, {0x64C7,0x62E9}, {0x64CA,0x51FB}, {0x64CB,0x6321}, {0x64D4,0x62C5}, 
+  {0x64DA,0x636E}, {0x64E0,0x6324}, {0x64EC,0x62DF}, {0x64EF,0x6448}, {0x64F0,0x62E7}, 
+  {0x64F1,0x6401}, {0x64F2,0x63B7}, {0x64F4,0x6269}, {0x64F7,0x64B7}, {0x64FA,0x6446}, 
+  {0x64FB,0x64DE}, {0x64FC,0x64B8}, {0x64FE,0x6270}, {0x6504,0x6445}, {0x6506,0x64B5}, 
+  {0x650F,0x62E2}, {0x6514,0x62E6}, {0x6516,0x6484}, {0x6519,0x6400}, {0x651B,0x64BA}, 
+  {0x651D,0x6444}, {0x6522,0x6512}, {0x6523,0x631B}, {0x6524,0x644A}, {0x652A,0x6405}, 
+  {0x652C,0x63FD}, {0x6557,0x8D25}, {0x6575,0x654C}, {0x6578,0x6570}, {0x6582,0x655B}, 
+  {0x6583,0x6BD9}, {0x6595,0x6593}, {0x65AC,0x65A9}, {0x65B7,0x65AD}, {0x6642,0x65F6}, 
+  {0x6649,0x664B}, {0x665D,0x663C}, {0x6688,0x6655}, {0x6689,0x6656}, {0x66A2,0x7545}, 
+  {0x66AB,0x6682}, {0x66C4,0x6654}, {0x66C7,0x6619}, {0x66C9,0x6653}, {0x66D6,0x66A7}, 
+  {0x66E0,0x65F7}, {0x66EC,0x6652}, {0x66F8,0x4E66}, {0x6703,0x4F1A}, {0x6727,0x80E7}, 
+  {0x6771,0x4E1C}, {0x6898,0x67A7}, {0x689D,0x6761}, {0x689F,0x67AD}, {0x68C4,0x5F03}, 
+  {0x68D6,0x67A8}, {0x68D7,0x67A3}, {0x68DF,0x680B}, {0x68E7,0x6808}, {0x68F2,0x6816}, 
+  {0x690F,0x6860}, {0x694A,0x6768}, {0x6953,0x67AB}, {0x6968,0x6862}, {0x696D,0x4E1A}, 
+  {0x6975,0x6781}, {0x69AA,0x6769}, {0x69AE,0x8363}, {0x69BF,0x6864}, {0x69CB,0x6784}, 
+  {0x69CD,0x67AA}, {0x69E7,0x6920}, {0x69F3,0x6868}, {0x6A01,0x6869}, {0x6A02,0x4E50}, 
+  {0x6A05,0x679E}, {0x6A13,0x697C}, {0x6A19,0x6807}, {0x6A1E,0x67A2}, {0x6A23,0x6837}, 
+  {0x6A38,0x6734}, {0x6A39,0x6811}, {0x6A3A,0x6866}, {0x6A48,0x6861}, {0x6A4B,0x6865}, 
+  {0x6A5F,0x673A}, {0x6A62,0x692D}, {0x6A89,0x67FD}, {0x6A94,0x6863}, {0x6A9C,0x6867}, 
+  {0x6AA2,0x68C0}, {0x6AA3,0x6A2F}, {0x6AB3,0x69DF}, {0x6AB8,0x67E0}, {0x6ABB,0x69DB}, 
+  {0x6AC3,0x67DC}, {0x6AD3,0x6A79}, {0x6ADA,0x6988}, {0x6ADB,0x6809}, {0x6ADD,0x691F}, 
+  {0x6ADE,0x6A7C}, {0x6ADF,0x680E}, {0x6AE7,0x69E0}, {0x6AE8,0x680C}, {0x6AEA,0x67A5}, 
+  {0x6AEC,0x6987}, {0x6AF3,0x680A}, {0x6AF8,0x6989}, {0x6AFB,0x6A31}, {0x6B04,0x680F}, 
+  {0x6B0A,0x6743}, {0x6B0F,0x6924}, {0x6B12,0x683E}, {0x6B16,0x6984}, {0x6B1E,0x68C2}, 
+  {0x6B3D,0x94A6}, {0x6B50,0x6B27}, {0x6B5F,0x6B24}, {0x6B61,0x6B22}, {0x6B72,0x5C81}, 
+  {0x6B77,0x5386}, {0x6B78,0x5F52}, {0x6B98,0x6B8B}, {0x6B9E,0x6B92}, {0x6BA4,0x6B87}, 
+  {0x6BAB,0x6B9A}, {0x6BAE,0x6B93}, {0x6BAF,0x6BA1}, {0x6BB2,0x6B7C}, {0x6BBA,0x6740}, 
+  {0x6BBB,0x58F3}, {0x6BC6,0x6BB4}, {0x6BFF,0x6BF5}, {0x6C08,0x6BE1}, {0x6C0C,0x6C07}, 
+  {0x6C23,0x6C14}, {0x6C2B,0x6C22}, {0x6C2C,0x6C29}, {0x6D79,0x6D43}, {0x6D87,0x6CFE}, 
+  {0x6DEA,0x6CA6}, {0x6DF5,0x6E0A}, {0x6DF6,0x6D9E}, {0x6DFA,0x6D45}, {0x6E19,0x6DA3}, 
+  {0x6E26,0x6DA1}, {0x6E2C,0x6D4B}, {0x6E3E,0x6D51}, {0x6E5E,0x6D48}, {0x6E6F,0x6C64}, 
+  {0x6E96,0x51C6}, {0x6E9D,0x6C9F}, {0x6EC4,0x6CA7}, {0x6EC5,0x706D}, {0x6ECC,0x6DA4}, 
+  {0x6ECE,0x8365}, {0x6EEC,0x6CAA}, {0x6EEF,0x6EDE}, {0x6EF2,0x6E17}, {0x6EF7,0x5364}, 
+  {0x6EF8,0x6D52}, {0x6EFF,0x6EE1}, {0x6F01,0x6E14}, {0x6F1A,0x6CA4}, {0x6F22,0x6C49}, 
+  {0x6F23,0x6D9F}, {0x6F2C,0x6E0D}, {0x6F32,0x6DA8}, {0x6F38,0x6E10}, {0x6F3F,0x6D46}, 
+  {0x6F41,0x988D}, {0x6F51,0x6CFC}, {0x6F54,0x6D01}, {0x6F59,0x6CA9}, {0x6F5B,0x6F5C}, 
+  {0x6F64,0x6DA6}, {0x6F6F,0x6D54}, {0x6F70,0x6E83}, {0x6F77,0x6ED7}, {0x6F7F,0x6DA0}, 
+  {0x6F80,0x6DA9}, {0x6F86,0x6D47}, {0x6F87,0x6D9D}, {0x6F97,0x6DA7}, {0x6FA0,0x6E11}, 
+  {0x6FA4,0x6CFD}, {0x6FA9,0x6CF6}, {0x6FAE,0x6D4D}, {0x6FB1,0x6DC0}, {0x6FC1,0x6D4A}, 
+  {0x6FC3,0x6D53}, {0x6FD5,0x6E7F}, {0x6FD8,0x6CDE}, {0x6FDF,0x6D4E}, {0x6FE4,0x6D9B}, 
+  {0x6FEB,0x6EE5}, {0x6FF0,0x6F4D}, {0x6FF1,0x6EE8}, {0x6FFA,0x6E85}, {0x6FFC,0x6CFA}, 
+  {0x6FFE,0x6EE4}, {0x7005,0x6EE2}, {0x7006,0x6E0E}, {0x7009,0x6CFB}, {0x700B,0x6E16}, 
+  {0x700F,0x6D4F}, {0x7015,0x6FD2}, {0x7018,0x6CF8}, {0x701D,0x6CA5}, {0x701F,0x6F47}, 
+  {0x7020,0x6F46}, {0x7027,0x6CF7}, {0x7028,0x6FD1}, {0x7032,0x6F4B}, {0x703E,0x6F9C}, 
+  {0x7043,0x6CA3}, {0x7044,0x6EE0}, {0x7051,0x6D12}, {0x7055,0x6F13}, {0x7058,0x6EE9}, 
+  {0x705D,0x704F}, {0x7063,0x6E7E}, {0x7064,0x6EE6}, {0x7067,0x6EDF}, {0x70CF,0x4E4C}, 
+  {0x70F4,0x70C3}, {0x7121,0x65E0}, {0x7149,0x70BC}, {0x7152,0x709C}, {0x7162,0x8315}, 
+  {0x7165,0x7115}, {0x7169,0x70E6}, {0x716C,0x7080}, {0x7192,0x8367}, {0x7197,0x709D}, 
+  {0x71B1,0x70ED}, {0x71BE,0x70BD}, {0x71C1,0x70E8}, {0x71C8,0x706F}, {0x71D2,0x70E7}, 
+  {0x71D9,0x70EB}, {0x71DC,0x7116}, {0x71DF,0x8425}, {0x71E6,0x707F}, {0x71ED,0x70DB}, 
+  {0x71F4,0x70E9}, {0x71FC,0x70EC}, {0x71FE,0x7118}, {0x720D,0x70C1}, {0x7210,0x7089}, 
+  {0x721B,0x70C2}, {0x722D,0x4E89}, {0x7232,0x4E3A}, {0x723A,0x7237}, {0x723E,0x5C14}, 
+  {0x7258,0x724D}, {0x727D,0x7275}, {0x7296,0x8366}, {0x72A2,0x728A}, {0x72A7,0x727A}, 
+  {0x72C0,0x72B6}, {0x72F9,0x72ED}, {0x72FD,0x72C8}, {0x7319,0x72F0}, {0x7336,0x72B9}, 
+  {0x733B,0x72F2}, {0x7341,0x72B8}, {0x7344,0x72F1}, {0x7345,0x72EE}, {0x7368,0x72EC}, 
+  {0x736A,0x72EF}, {0x736B,0x7303}, {0x7370,0x72DE}, {0x7372,0x83B7}, {0x7375,0x730E}, 
+  {0x7377,0x72B7}, {0x7378,0x517D}, {0x737A,0x736D}, {0x737B,0x732E}, {0x737C,0x7315}, 
+  {0x7380,0x7321}, {0x73FE,0x73B0}, {0x743F,0x73F2}, {0x744B,0x73AE}, {0x7463,0x7410}, 
+  {0x7469,0x83B9}, {0x746A,0x739B}, {0x7489,0x740F}, {0x74A3,0x7391}, {0x74A6,0x7477}, 
+  {0x74B0,0x73AF}, {0x74BD,0x73BA}, {0x74CA,0x743C}, {0x74CF,0x73D1}, {0x74D4,0x748E}, 
+  {0x74DA,0x74D2}, {0x750C,0x74EF}, {0x7523,0x4EA7}, {0x755D,0x4EA9}, {0x7562,0x6BD5}, 
+  {0x756B,0x753B}, {0x7576,0x5F53}, {0x7587,0x7574}, {0x758A,0x53E0}, {0x75D9,0x75C9}, 
+  {0x7602,0x75D6}, {0x760B,0x75AF}, {0x760D,0x75A1}, {0x7613,0x75EA}, {0x761E,0x7617}, 
+  {0x7621,0x75AE}, {0x7627,0x759F}, {0x763B,0x7618}, {0x7642,0x7597}, {0x7646,0x75E8}, 
+  {0x7647,0x75EB}, {0x7649,0x7605}, {0x7658,0x75A0}, {0x765F,0x762A}, {0x7662,0x75D2}, 
+  {0x7664,0x7596}, {0x7665,0x75C7}, {0x7667,0x75AC}, {0x7669,0x765E}, {0x766C,0x7663}, 
+  {0x766D,0x763F}, {0x766E,0x763E}, {0x7670,0x75C8}, {0x7671,0x762B}, {0x7672,0x766B}, 
+  {0x767C,0x53D1}, {0x769A,0x7691}, {0x76B8,0x76B2}, {0x76BA,0x76B1}, {0x76DE,0x76CF}, 
+  {0x76E1,0x5C3D}, {0x76E3,0x76D1}, {0x76E4,0x76D8}, {0x76E7,0x5362}, {0x775C,0x7741}, 
+  {0x775E,0x7750}, {0x7798,0x770D}, {0x779E,0x7792}, {0x77BC,0x7751}, {0x77DA,0x77A9}, 
+  {0x77EF,0x77EB}, {0x7864,0x7856}, {0x7868,0x7817}, {0x786F,0x781A}, {0x78A9,0x7855}, 
+  {0x78AD,0x7800}, {0x78B8,0x781C}, {0x78BA,0x786E}, {0x78BC,0x7801}, {0x78DA,0x7816}, 
+  {0x78E3,0x789C}, {0x78E7,0x789B}, {0x78EF,0x77F6}, {0x78FD,0x7857}, {0x790E,0x7840}, 
+  {0x7919,0x788D}, {0x7926,0x77FF}, {0x792A,0x783A}, {0x792B,0x783E}, {0x792C,0x77FE}, 
+  {0x7931,0x783B}, {0x798D,0x7978}, {0x798E,0x796F}, {0x79AA,0x7985}, {0x79AE,0x793C}, 
+  {0x79B0,0x7962}, {0x79B1,0x7977}, {0x7A2E,0x79CD}, {0x7A31,0x79F0}, {0x7A4C,0x7A23}, 
+  {0x7A4D,0x79EF}, {0x7A4E,0x9896}, {0x7A61,0x7A51}, {0x7A62,0x79FD}, {0x7A69,0x7A33}, 
+  {0x7AA9,0x7A9D}, {0x7AAA,0x6D3C}, {0x7AAE,0x7A77}, {0x7AB6,0x7AAD}, {0x7ABA,0x7AA5}, 
+  {0x7AC4,0x7A9C}, {0x7AC5,0x7A8D}, {0x7AC7,0x7AA6}, {0x7AC8,0x7076}, {0x7ACA,0x7A83}, 
+  {0x7AEA,0x7AD6}, {0x7AF6,0x7ADE}, {0x7B46,0x7B14}, {0x7B67,0x7B15}, {0x7B8B,0x7B3A}, 
+  {0x7B8F,0x7B5D}, {0x7BC0,0x8282}, {0x7BC4,0x8303}, {0x7BC9,0x7B51}, {0x7BCB,0x7BA7}, 
+  {0x7BE4,0x7B03}, {0x7BE9,0x7B5B}, {0x7BF3,0x7B5A}, {0x7C00,0x7BA6}, {0x7C0D,0x7BD3}, 
+  {0x7C1E,0x7BAA}, {0x7C21,0x7B80}, {0x7C23,0x7BD1}, {0x7C2B,0x7BAB}, {0x7C3D,0x7B7E}, 
+  {0x7C3E,0x5E18}, {0x7C43,0x7BEE}, {0x7C4C,0x7B79}, {0x7C5C,0x7BA8}, {0x7C5F,0x7C41}, 
+  {0x7C60,0x7B3C}, {0x7C69,0x7B3E}, {0x7C6A,0x7C16}, {0x7C6C,0x7BF1}, {0x7C6E,0x7BA9}, 
+  {0x7CDD,0x7CC1}, {0x7CDE,0x7CAA}, {0x7CE7,0x7CAE}, {0x7CF2,0x7C9D}, {0x7CF4,0x7C74}, 
+  {0x7CF6,0x7C9C}, {0x7CF9,0x7E9F}, {0x7CFE,0x7EA0}, {0x7D00,0x7EAA}, {0x7D02,0x7EA3}, 
+  {0x7D04,0x7EA6}, {0x7D05,0x7EA2}, {0x7D06,0x7EA1}, {0x7D07,0x7EA5}, {0x7D08,0x7EA8}, 
+  {0x7D09,0x7EAB}, {0x7D0B,0x7EB9}, {0x7D0D,0x7EB3}, {0x7D10,0x7EBD}, {0x7D13,0x7EBE}, 
+  {0x7D14,0x7EAF}, {0x7D15,0x7EB0}, {0x7D17,0x7EB1}, {0x7D19,0x7EB8}, {0x7D1A,0x7EA7}, 
+  {0x7D1B,0x7EB7}, {0x7D1C,0x7EAD}, {0x7D21,0x7EBA}, {0x7D30,0x7EC6}, {0x7D31,0x7EC2}, 
+  {0x7D32,0x7EC1}, {0x7D33,0x7EC5}, {0x7D39,0x7ECD}, {0x7D3A,0x7EC0}, {0x7D3C,0x7ECB}, 
+  {0x7D3F,0x7ED0}, {0x7D40,0x7ECC}, {0x7D42,0x7EC8}, {0x7D44,0x7EC4}, {0x7D46,0x7ECA}, 
+  {0x7D4E,0x7ED7}, {0x7D50,0x7ED3}, {0x7D5D,0x7ED4}, {0x7D5E,0x7EDE}, {0x7D61,0x7EDC}, 
+  {0x7D62,0x7EDA}, {0x7D66,0x7ED9}, {0x7D68,0x7ED2}, {0x7D71,0x7EDF}, {0x7D72,0x4E1D}, 
+  {0x7D73,0x7EDB}, {0x7D76,0x7EDD}, {0x7D79,0x7EE2}, {0x7D81,0x7ED1}, {0x7D83,0x7EE1}, 
+  {0x7D86,0x7EE0}, {0x7D88,0x7EE8}, {0x7D89,0x7EE3}, {0x7D8F,0x7EE5}, {0x7D93,0x7ECF}, 
+  {0x7D9C,0x7EFC}, {0x7D9E,0x7F0D}, {0x7DA2,0x7EF8}, {0x7DA3,0x7EFB}, {0x7DAB,0x7EBF}, 
+  {0x7DAC,0x7EF6}, {0x7DAD,0x7EF4}, {0x7DB0,0x7EFE}, {0x7DB1,0x7EB2}, {0x7DB2,0x7F51}, 
+  {0x7DB3,0x7EF7}, {0x7DB4,0x7F00}, {0x7DB8,0x7EB6}, {0x7DB9,0x7EFA}, {0x7DBA,0x7EEE}, 
+  {0x7DBB,0x7EFD}, {0x7DBD,0x7EF0}, {0x7DBE,0x7EEB}, {0x7DBF,0x7EF5}, {0x7DC4,0x7EF2}, 
+  {0x7DC7,0x7F01}, {0x7DCA,0x7D27}, {0x7DCB,0x7EEF}, {0x7DD1,0x7EFF}, {0x7DD2,0x7EEA}, 
+  {0x7DD4,0x7EF1}, {0x7DD7,0x7F03}, {0x7DD8,0x7F04}, {0x7DD9,0x7F02}, {0x7DDD,0x7F09}, 
+  {0x7DDE,0x7F0E}, {0x7DE0,0x7F14}, {0x7DE1,0x7F17}, {0x7DE3,0x7F18}, {0x7DE6,0x7F0C}, 
+  {0x7DE8,0x7F16}, {0x7DE9,0x7F13}, {0x7DEC,0x7F05}, {0x7DEF,0x7EAC}, {0x7DF1,0x7F11}, 
+  {0x7DF2,0x7F08}, {0x7DF4,0x7EC3}, {0x7DF6,0x7F0F}, {0x7DF9,0x7F07}, {0x7E08,0x8426}, 
+  {0x7E09,0x7F19}, {0x7E0A,0x7F22}, {0x7E0B,0x7F12}, {0x7E10,0x7EC9}, {0x7E11,0x7F23}, 
+  {0x7E1B,0x7F1A}, {0x7E1D,0x7F1C}, {0x7E1E,0x7F1F}, {0x7E1F,0x7F1B}, {0x7E23,0x53BF}, 
+  {0x7E27,0x7EE6}, {0x7E2B,0x7F1D}, {0x7E2D,0x7F21}, {0x7E2E,0x7F29}, {0x7E31,0x7EB5}, 
+  {0x7E32,0x7F27}, {0x7E35,0x7F26}, {0x7E36,0x7D77}, {0x7E37,0x7F15}, {0x7E39,0x7F25}, 
+  {0x7E3D,0x603B}, {0x7E3E,0x7EE9}, {0x7E45,0x7F2B}, {0x7E46,0x7F2A}, {0x7E52,0x7F2F}, 
+  {0x7E54,0x7EC7}, {0x7E55,0x7F2E}, {0x7E5A,0x7F2D}, {0x7E5E,0x7ED5}, {0x7E62,0x7F0B}, 
+  {0x7E69,0x7EF3}, {0x7E6A,0x7ED8}, {0x7E6D,0x8327}, {0x7E6E,0x7F30}, {0x7E6F,0x7F33}, 
+  {0x7E70,0x7F32}, {0x7E73,0x7F34}, {0x7E79,0x7ECE}, {0x7E7C,0x7EE7}, {0x7E7D,0x7F24}, 
+  {0x7E7E,0x7F31}, {0x7E88,0x7F2C}, {0x7E8A,0x7EA9}, {0x7E8C,0x7EED}, {0x7E8F,0x7F20}, 
+  {0x7E93,0x7F28}, {0x7E96,0x7EA4}, {0x7E98,0x7F35}, {0x7E9C,0x7F06}, {0x7F4C,0x7F42}, 
+  {0x7F70,0x7F5A}, {0x7F77,0x7F62}, {0x7F85,0x7F57}, {0x7F86,0x7F74}, {0x7F88,0x7F81}, 
+  {0x7FA5,0x7F9F}, {0x7FA9,0x4E49}, {0x7FD2,0x4E60}, {0x7FF9,0x7FD8}, {0x802C,0x8027}, 
+  {0x802E,0x8022}, {0x8056,0x5723}, {0x805E,0x95FB}, {0x806F,0x8054}, {0x8070,0x806A}, 
+  {0x8072,0x58F0}, {0x8073,0x8038}, {0x8075,0x8069}, {0x8076,0x8042}, {0x8077,0x804C}, 
+  {0x8079,0x804D}, {0x807D,0x542C}, {0x807E,0x804B}, {0x8085,0x8083}, {0x8105,0x80C1}, 
+  {0x811B,0x80EB}, {0x8139,0x80C0}, {0x814E,0x80BE}, {0x8156,0x80E8}, {0x8161,0x8136}, 
+  {0x8166,0x8111}, {0x816B,0x80BF}, {0x8178,0x80A0}, {0x819A,0x80A4}, {0x81A0,0x80F6}, 
+  {0x81A9,0x817B}, {0x81BD,0x80C6}, {0x81BE,0x810D}, {0x81BF,0x8113}, {0x81C9,0x8138}, 
+  {0x81CD,0x8110}, {0x81CF,0x8191}, {0x81D8,0x814A}, {0x81DA,0x80EA}, {0x81DF,0x810F}, 
+  {0x81E0,0x8114}, {0x81E8,0x4E34}, {0x81FA,0x53F0}, {0x8207,0x4E0E}, {0x8208,0x5174}, 
+  {0x8209,0x4E3E}, {0x820A,0x65E7}, {0x8259,0x8231}, {0x8264,0x8223}, {0x8266,0x8230}, 
+  {0x826B,0x823B}, {0x8271,0x8270}, {0x8277,0x8273}, {0x82BB,0x520D}, {0x82E7,0x82CE}, 
+  {0x838A,0x5E84}, {0x8396,0x830E}, {0x83A2,0x835A}, {0x83A7,0x82CB}, {0x83EF,0x534E}, 
+  {0x8407,0x82CC}, {0x840A,0x83B1}, {0x842C,0x4E07}, {0x8435,0x83B4}, {0x8449,0x53F6}, 
+  {0x8452,0x836D}, {0x8464,0x836E}, {0x8466,0x82C7}, {0x8477,0x8364}, {0x8493,0x83BC}, 
+  {0x8494,0x83B3}, {0x84BC,0x82CD}, {0x84C0,0x836A}, {0x84CB,0x76D6}, {0x84EE,0x83B2}, 
+  {0x84EF,0x82C1}, {0x84FD,0x835C}, {0x851E,0x848C}, {0x8523,0x848B}, {0x8526,0x8311}, 
+  {0x852D,0x836B}, {0x8541,0x8368}, {0x8546,0x8487}, {0x854E,0x835E}, {0x8552,0x836C}, 
+  {0x8553,0x82B8}, {0x8555,0x83B8}, {0x8558,0x835B}, {0x8562,0x8489}, {0x8569,0x8361}, 
+  {0x856A,0x829C}, {0x856D,0x8427}, {0x8577,0x84E3}, {0x8588,0x835F}, {0x858A,0x84DF}, 
+  {0x858C,0x8297}, {0x8594,0x8537}, {0x859F,0x83B6}, {0x85A6,0x8350}, {0x85A9,0x8428}, 
+  {0x85BA,0x8360}, {0x85CD,0x84DD}, {0x85CE,0x8369}, {0x85DD,0x827A}, {0x85E5,0x836F}, 
+  {0x85EA,0x85AE}, {0x85F4,0x8574}, {0x85F6,0x82C8}, {0x85F9,0x853C}, {0x85FA,0x853A}, 
+  {0x8604,0x8572}, {0x8606,0x82A6}, {0x8607,0x82CF}, {0x860B,0x82F9}, {0x861A,0x85D3}, 
+  {0x861E,0x8539}, {0x8622,0x830F}, {0x862D,0x5170}, {0x863A,0x84E0}, {0x863F,0x841D}, 
+  {0x8655,0x5904}, {0x865C,0x864F}, {0x865F,0x53F7}, {0x8667,0x4E8F}, {0x86FA,0x86F1}, 
+  {0x8706,0x86AC}, {0x8755,0x8680}, {0x8766,0x867E}, {0x8778,0x8717}, {0x8784,0x86F3}, 
+  {0x879E,0x8682}, {0x87A2,0x8424}, {0x87BB,0x877C}, {0x87C4,0x86F0}, {0x87C8,0x8748}, 
+  {0x87CE,0x87A8}, {0x87E3,0x866E}, {0x87EC,0x8749}, {0x87EF,0x86F2}, {0x87F2,0x866B}, 
+  {0x87F6,0x86CF}, {0x87FB,0x8681}, {0x8805,0x8747}, {0x8806,0x867F}, {0x8810,0x86F4}, 
+  {0x8811,0x877E}, {0x881F,0x8721}, {0x8823,0x86CE}, {0x8831,0x86CA}, {0x8836,0x8695}, 
+  {0x883B,0x86EE}, {0x8846,0x4F17}, {0x8853,0x672F}, {0x885B,0x536B}, {0x885D,0x51B2}, 
+  {0x8879,0x53EA}, {0x88CA,0x8885}, {0x88CF,0x91CC}, {0x88DC,0x8865}, {0x88DD,0x88C5}, 
+  {0x8932,0x88E4}, {0x8933,0x88E2}, {0x8938,0x891B}, {0x893B,0x4EB5}, {0x8947,0x88E5}, 
+  {0x8956,0x8884}, {0x895D,0x88E3}, {0x8960,0x88C6}, {0x8964,0x8934}, {0x896A,0x889C}, 
+  {0x896F,0x886C}, {0x8972,0x88AD}, {0x898B,0x89C1}, {0x898F,0x89C4}, {0x8993,0x89C5}, 
+  {0x8996,0x89C6}, {0x8998,0x89C7}, {0x89A1,0x89CB}, {0x89A6,0x89CE}, {0x89AA,0x4EB2}, 
+  {0x89AC,0x89CA}, {0x89AF,0x89CF}, {0x89B2,0x89D0}, {0x89B7,0x89D1}, {0x89BA,0x89C9}, 
+  {0x89BD,0x89C8}, {0x89BF,0x89CC}, {0x89C0,0x89C2}, {0x89F4,0x89DE}, {0x89F6,0x89EF}, 
+  {0x89F8,0x89E6}, {0x8A01,0x8BA0}, {0x8A02,0x8BA2}, {0x8A03,0x8BA3}, {0x8A08,0x8BA1}, 
+  {0x8A0A,0x8BAF}, {0x8A0C,0x8BA7}, {0x8A0E,0x8BA8}, {0x8A10,0x8BA6}, {0x8A13,0x8BAD}, 
+  {0x8A15,0x8BAA}, {0x8A16,0x8BAB}, {0x8A18,0x8BB0}, {0x8A1B,0x8BB9}, {0x8A1D,0x8BB6}, 
+  {0x8A1F,0x8BBC}, {0x8A23,0x8BC0}, {0x8A25,0x8BB7}, {0x8A2A,0x8BBF}, {0x8A2D,0x8BBE}, 
+  {0x8A31,0x8BB8}, {0x8A34,0x8BC9}, {0x8A36,0x8BC3}, {0x8A3A,0x8BCA}, {0x8A41,0x8BC2}, 
+  {0x8A46,0x8BCB}, {0x8A4E,0x8BB5}, {0x8A50,0x8BC8}, {0x8A52,0x8BD2}, {0x8A54,0x8BCF}, 
+  {0x8A55,0x8BC4}, {0x8A58,0x8BCE}, {0x8A5B,0x8BC5}, {0x8A5E,0x8BCD}, {0x8A61,0x8BE9}, 
+  {0x8A62,0x8BE2}, {0x8A63,0x8BE3}, {0x8A66,0x8BD5}, {0x8A69,0x8BD7}, {0x8A6B,0x8BE7}, 
+  {0x8A6C,0x8BDF}, {0x8A6D,0x8BE1}, {0x8A6E,0x8BE0}, {0x8A70,0x8BD8}, {0x8A71,0x8BDD}, 
+  {0x8A72,0x8BE5}, {0x8A73,0x8BE6}, {0x8A75,0x8BDC}, {0x8A7C,0x8BD9}, {0x8A7F,0x8BD6}, 
+  {0x8A84,0x8BD4}, {0x8A85,0x8BDB}, {0x8A86,0x8BD3}, {0x8A87,0x5938}, {0x8A8D,0x8BA4}, 
+  {0x8A91,0x8BF3}, {0x8A92,0x8BF6}, {0x8A95,0x8BDE}, {0x8A98,0x8BF1}, {0x8A9A,0x8BEE}, 
+  {0x8A9E,0x8BED}, {0x8AA0,0x8BDA}, {0x8AA1,0x8BEB}, {0x8AA3,0x8BEC}, {0x8AA4,0x8BEF}, 
+  {0x8AA5,0x8BF0}, {0x8AA6,0x8BF5}, {0x8AA8,0x8BF2}, {0x8AAC,0x8BF4}, {0x8AB0,0x8C01}, 
+  {0x8AB2,0x8BFE}, {0x8AB6,0x8C07}, {0x8AB9,0x8BFD}, {0x8ABC,0x8C0A}, {0x8ABF,0x8C03}, 
+  {0x8AC2,0x8C04}, {0x8AC4,0x8C06}, {0x8AC7,0x8C08}, {0x8AC9,0x8BFF}, {0x8ACB,0x8BF7}, 
+  {0x8ACD,0x8BE4}, {0x8ACF,0x8BF9}, {0x8AD1,0x8BFC}, {0x8AD2,0x8C05}, {0x8AD6,0x8BBA}, 
+  {0x8AD7,0x8C02}, {0x8ADB,0x8C00}, {0x8ADC,0x8C0D}, {0x8ADE,0x8C1D}, {0x8AE2,0x8BE8}, 
+  {0x8AE4,0x8C14}, {0x8AE6,0x8C1B}, {0x8AE7,0x8C10}, {0x8AEB,0x8C0F}, {0x8AED,0x8C15}, 
+  {0x8AEE,0x8C18}, {0x8AF1,0x8BB3}, {0x8AF3,0x8C19}, {0x8AF6,0x8C0C}, {0x8AF7,0x8BBD}, 
+  {0x8AF8,0x8BF8}, {0x8AFA,0x8C1A}, {0x8AFC,0x8C16}, {0x8AFE,0x8BFA}, {0x8B00,0x8C0B}, 
+  {0x8B01,0x8C12}, {0x8B02,0x8C13}, {0x8B04,0x8A8A}, {0x8B05,0x8BCC}, {0x8B0A,0x8C0E}, 
+  {0x8B0E,0x8C1C}, {0x8B10,0x8C27}, {0x8B14,0x8C11}, {0x8B16,0x8C21}, {0x8B17,0x8C24}, 
+  {0x8B19,0x8C26}, {0x8B1A,0x8C25}, {0x8B1B,0x8BB2}, {0x8B1D,0x8C22}, {0x8B21,0x8C23}, 
+  {0x8B28,0x8C1F}, {0x8B2B,0x8C2A}, {0x8B2C,0x8C2C}, {0x8B2D,0x8C2B}, {0x8B33,0x8BB4}, 
+  {0x8B39,0x8C28}, {0x8B3E,0x8C29}, {0x8B49,0x8BC1}, {0x8B4E,0x8C32}, {0x8B4F,0x8BA5}, 
+  {0x8B56,0x8C2E}, {0x8B58,0x8BC6}, {0x8B59,0x8C2F}, {0x8B5A,0x8C2D}, {0x8B5C,0x8C31}, 
+  {0x8B6B,0x8C35}, {0x8B6F,0x8BD1}, {0x8B70,0x8BAE}, {0x8B74,0x8C34}, {0x8B77,0x62A4}, 
+  {0x8B7D,0x8A89}, {0x8B80,0x8BFB}, {0x8B8A,0x53D8}, {0x8B8E,0x96E0}, {0x8B92,0x8C17}, 
+  {0x8B93,0x8BA9}, {0x8B95,0x8C30}, {0x8B96,0x8C36}, {0x8B9C,0x8C20}, {0x8B9E,0x8C33}, 
+  {0x8C48,0x5C82}, {0x8C50,0x4E30}, {0x8C9D,0x8D1D}, {0x8C9E,0x8D1E}, {0x8CA0,0x8D1F}, 
+  {0x8CA1,0x8D22}, {0x8CA2,0x8D21}, {0x8CA7,0x8D2B}, {0x8CA8,0x8D27}, {0x8CA9,0x8D29}, 
+  {0x8CAA,0x8D2A}, {0x8CAB,0x8D2F}, {0x8CAC,0x8D23}, {0x8CAF,0x8D2E}, {0x8CB0,0x8D33}, 
+  {0x8CB2,0x8D40}, {0x8CB3,0x8D30}, {0x8CB4,0x8D35}, {0x8CB6,0x8D2C}, {0x8CB7,0x4E70}, 
+  {0x8CB8,0x8D37}, {0x8CBA,0x8D36}, {0x8CBB,0x8D39}, {0x8CBC,0x8D34}, {0x8CBD,0x8D3B}, 
+  {0x8CBF,0x8D38}, {0x8CC0,0x8D3A}, {0x8CC1,0x8D32}, {0x8CC2,0x8D42}, {0x8CC3,0x8D41}, 
+  {0x8CC4,0x8D3F}, {0x8CC5,0x8D45}, {0x8CC7,0x8D44}, {0x8CC8,0x8D3E}, {0x8CCA,0x8D3C}, 
+  {0x8CD1,0x8D48}, {0x8CD2,0x8D4A}, {0x8CD3,0x5BBE}, {0x8CD5,0x8D47}, {0x8CDA,0x8D49}, 
+  {0x8CDC,0x8D50}, {0x8CDE,0x8D4F}, {0x8CE0,0x8D54}, {0x8CE1,0x8D53}, {0x8CE2,0x8D24}, 
+  {0x8CE3,0x5356}, {0x8CE4,0x8D31}, {0x8CE6,0x8D4B}, {0x8CE7,0x8D55}, {0x8CEA,0x8D28}, 
+  {0x8CEB,0x8D4D}, {0x8CEC,0x8D26}, {0x8CED,0x8D4C}, {0x8CF4,0x8D56}, {0x8CFA,0x8D5A}, 
+  {0x8CFB,0x8D59}, {0x8CFC,0x8D2D}, {0x8CFD,0x8D5B}, {0x8CFE,0x8D5C}, {0x8D04,0x8D3D}, 
+  {0x8D05,0x8D58}, {0x8D08,0x8D60}, {0x8D0A,0x8D5E}, {0x8D0B,0x8D5D}, {0x8D0D,0x8D61}, 
+  {0x8D0F,0x8D62}, {0x8D10,0x8D46}, {0x8D16,0x8D4E}, {0x8D1B,0x8D63}, {0x8D1C,0x8D43}, 
+  {0x8D95,0x8D76}, {0x8D99,0x8D75}, {0x8DA8,0x8D8B}, {0x8DB2,0x8DB1}, {0x8E10,0x8DF5}, 
+  {0x8E34,0x8E0A}, {0x8E4C,0x8DC4}, {0x8E55,0x8DF8}, {0x8E63,0x8E52}, {0x8E7A,0x8DF7}, 
+  {0x8E89,0x8DB8}, {0x8E8A,0x8E0C}, {0x8E8B,0x8DFB}, {0x8E8D,0x8DC3}, {0x8E91,0x8E2F}, 
+  {0x8E92,0x8DDE}, {0x8E93,0x8E2C}, {0x8E9A,0x8DF9}, {0x8EA1,0x8E51}, {0x8EA5,0x8E7F}, 
+  {0x8EA6,0x8E9C}, {0x8EAA,0x8E8F}, {0x8EC0,0x8EAF}, {0x8ECA,0x8F66}, {0x8ECB,0x8F67}, 
+  {0x8ECC,0x8F68}, {0x8ECD,0x519B}, {0x8ED2,0x8F69}, {0x8ED4,0x8F6B}, {0x8EDB,0x8F6D}, 
+  {0x8EDF,0x8F6F}, {0x8EE4,0x8F77}, {0x8EEB,0x8F78}, {0x8EF2,0x8F71}, {0x8EF8,0x8F74}, 
+  {0x8EF9,0x8F75}, {0x8EFA,0x8F7A}, {0x8EFB,0x8F72}, {0x8EFC,0x8F76}, {0x8EFE,0x8F7C}, 
+  {0x8F03,0x8F83}, {0x8F05,0x8F82}, {0x8F07,0x8F81}, {0x8F09,0x8F7D}, {0x8F0A,0x8F7E}, 
+  {0x8F12,0x8F84}, {0x8F14,0x8F85}, {0x8F15,0x8F7B}, {0x8F1B,0x8F86}, {0x8F1C,0x8F8E}, 
+  {0x8F1D,0x8F89}, {0x8F1E,0x8F8B}, {0x8F1F,0x8F8D}, {0x8F25,0x8F8A}, {0x8F26,0x8F87}, 
+  {0x8F29,0x8F88}, {0x8F2A,0x8F6E}, {0x8F2F,0x8F91}, {0x8F33,0x8F8F}, {0x8F38,0x8F93}, 
+  {0x8F3B,0x8F90}, {0x8F3E,0x8F97}, {0x8F3F,0x8206}, {0x8F42,0x6BC2}, {0x8F44,0x8F96}, 
+  {0x8F45,0x8F95}, {0x8F46,0x8F98}, {0x8F49,0x8F6C}, {0x8F4D,0x8F99}, {0x8F4E,0x8F7F}, 
+  {0x8F54,0x8F9A}, {0x8F5F,0x8F70}, {0x8F61,0x8F94}, {0x8F62,0x8F79}, {0x8F64,0x8F73}, 
+  {0x8FA6,0x529E}, {0x8FAD,0x8F9E}, {0x8FAE,0x8FAB}, {0x8FAF,0x8FA9}, {0x8FB2,0x519C}, 
+  {0x9015,0x8FF3}, {0x9019,0x8FD9}, {0x9023,0x8FDE}, {0x9032,0x8FDB}, {0x904B,0x8FD0}, 
+  {0x904E,0x8FC7}, {0x9054,0x8FBE}, {0x9055,0x8FDD}, {0x905C,0x900A}, {0x905E,0x9012}, 
+  {0x9060,0x8FDC}, {0x9069,0x9002}, {0x9072,0x8FDF}, {0x9077,0x8FC1}, {0x9078,0x9009}, 
+  {0x907A,0x9057}, {0x907C,0x8FBD}, {0x9081,0x8FC8}, {0x9084,0x8FD8}, {0x9087,0x8FE9}, 
+  {0x908A,0x8FB9}, {0x908F,0x903B}, {0x9090,0x9026}, {0x90DF,0x90CF}, {0x90F5,0x90AE}, 
+  {0x9106,0x90D3}, {0x9109,0x4E61}, {0x9112,0x90B9}, {0x9114,0x90AC}, {0x9116,0x90E7}, 
+  {0x9127,0x9093}, {0x912D,0x90D1}, {0x9130,0x90BB}, {0x9132,0x90F8}, {0x9134,0x90BA}, 
+  {0x9136,0x90D0}, {0x913A,0x909D}, {0x9148,0x90E6}, {0x9196,0x915D}, {0x919C,0x4E11}, 
+  {0x91AB,0x533B}, {0x91AC,0x9171}, {0x91C0,0x917F}, {0x91C1,0x8845}, {0x91C3,0x917E}, 
+  {0x91C5,0x917D}, {0x91CB,0x91CA}, {0x91D2,0x9485}, {0x91D3,0x9486}, {0x91D4,0x9487}, 
+  {0x91D5,0x948C}, {0x91D7,0x948A}, {0x91D8,0x9489}, {0x91D9,0x948B}, {0x91DD,0x9488}, 
+  {0x91E3,0x9493}, {0x91E4,0x9490}, {0x91E7,0x948F}, {0x91E9,0x9492}, {0x91F5,0x9497}, 
+  {0x91F7,0x948D}, {0x91F9,0x9495}, {0x91FA,0x948E}, {0x9200,0x94AF}, {0x9201,0x94AB}, 
+  {0x9204,0x94AD}, {0x9208,0x949A}, {0x9209,0x94A0}, {0x920D,0x949D}, {0x920E,0x94A9}, 
+  {0x9210,0x94A4}, {0x9211,0x94A3}, {0x9214,0x949E}, {0x9215,0x94AE}, {0x921E,0x94A7}, 
+  {0x9223,0x9499}, {0x9225,0x94AC}, {0x9226,0x949B}, {0x9227,0x94AA}, {0x922E,0x94CC}, 
+  {0x9230,0x94C8}, {0x9233,0x94B6}, {0x9234,0x94C3}, {0x9237,0x94B4}, {0x9238,0x94B9}, 
+  {0x9239,0x94CD}, {0x923A,0x94B0}, {0x923D,0x94B8}, {0x923E,0x94C0}, {0x923F,0x94BF}, 
+  {0x9240,0x94BE}, {0x9245,0x949C}, {0x9248,0x94CA}, {0x9249,0x94C9}, {0x924D,0x94CB}, 
+  {0x9251,0x94C2}, {0x9255,0x94B7}, {0x9257,0x94B3}, {0x925A,0x94C6}, {0x925B,0x94C5}, 
+  {0x925E,0x94BA}, {0x9262,0x94B5}, {0x9266,0x94B2}, {0x926C,0x94BC}, {0x926D,0x94BD}, 
+  {0x9278,0x94F0}, {0x927A,0x94D2}, {0x927B,0x94EC}, {0x927F,0x94EA}, {0x9280,0x94F6}, 
+  {0x9283,0x94F3}, {0x9285,0x94DC}, {0x9291,0x94E3}, {0x9293,0x94E8}, {0x9296,0x94E2}, 
+  {0x9298,0x94ED}, {0x929A,0x94EB}, {0x929C,0x8854}, {0x92A0,0x94D1}, {0x92A3,0x94F7}, 
+  {0x92A5,0x94F1}, {0x92A6,0x94DF}, {0x92A8,0x94F5}, {0x92A9,0x94E5}, {0x92AA,0x94D5}, 
+  {0x92AB,0x94EF}, {0x92AC,0x94D0}, {0x92B1,0x94DE}, {0x92B7,0x9500}, {0x92B9,0x9508}, 
+  {0x92BB,0x9511}, {0x92BC,0x9509}, {0x92C1,0x94DD}, {0x92C3,0x9512}, {0x92C5,0x950C}, 
+  {0x92C7,0x94A1}, {0x92CC,0x94E4}, {0x92CF,0x94D7}, {0x92D2,0x950B}, {0x92DD,0x950A}, 
+  {0x92DF,0x9513}, {0x92E3,0x94D8}, {0x92E4,0x9504}, {0x92E5,0x9503}, {0x92E6,0x9514}, 
+  {0x92E8,0x9507}, {0x92EA,0x94FA}, {0x92ED,0x9510}, {0x92EE,0x94D6}, {0x92EF,0x9506}, 
+  {0x92F0,0x9502}, {0x92F1,0x94FD}, {0x92F6,0x950D}, {0x92F8,0x952F}, {0x92FC,0x94A2}, 
+  {0x9301,0x951E}, {0x9306,0x9516}, {0x9307,0x952B}, {0x9308,0x9529}, {0x9310,0x9525}, 
+  {0x9312,0x9515}, {0x9315,0x951F}, {0x9318,0x9524}, {0x9319,0x9531}, {0x931A,0x94EE}, 
+  {0x931B,0x951B}, {0x931F,0x952C}, {0x9320,0x952D}, {0x9322,0x94B1}, {0x9326,0x9526}, 
+  {0x9328,0x951A}, {0x932B,0x9521}, {0x932E,0x9522}, {0x932F,0x9519}, {0x9332,0x5F55}, 
+  {0x9333,0x9530}, {0x9338,0x94FC}, {0x9340,0x951D}, {0x9341,0x9528}, {0x9343,0x952A}, 
+  {0x9346,0x9494}, {0x9347,0x9534}, {0x934B,0x9505}, {0x934D,0x9540}, {0x9354,0x9537}, 
+  {0x9358,0x94E1}, {0x935B,0x953B}, {0x9364,0x9538}, {0x9365,0x9532}, {0x9369,0x9518}, 
+  {0x936C,0x9539}, {0x9370,0x953E}, {0x9375,0x952E}, {0x9376,0x9536}, {0x937A,0x9517}, 
+  {0x937E,0x953A}, {0x9382,0x9541}, {0x9384,0x953F}, {0x9387,0x9545}, {0x938A,0x9551}, 
+  {0x9396,0x9501}, {0x9398,0x9549}, {0x93A2,0x94A8}, {0x93A3,0x84E5}, {0x93A6,0x954F}, 
+  {0x93A7,0x94E0}, {0x93A9,0x94E9}, {0x93AA,0x953C}, {0x93AC,0x9550}, {0x93AE,0x9547}, 
+  {0x93B0,0x9552}, {0x93B3,0x954D}, {0x93B5,0x9553}, {0x93B8,0x954C}, {0x93BF,0x954E}, 
+  {0x93C3,0x955E}, {0x93C7,0x955F}, {0x93C8,0x94FE}, {0x93CC,0x9546}, {0x93CD,0x9559}, 
+  {0x93D1,0x955D}, {0x93D7,0x94FF}, {0x93D8,0x9535}, {0x93DC,0x9557}, {0x93DD,0x9558}, 
+  {0x93DE,0x955B}, {0x93DF,0x94F2}, {0x93E1,0x955C}, {0x93E2,0x9556}, {0x93E4,0x9542}, 
+  {0x93E8,0x933E}, {0x93F5,0x94E7}, {0x93F7,0x9564}, {0x93F9,0x956A}, {0x9403,0x94D9}, 
+  {0x940B,0x94F4}, {0x9410,0x9563}, {0x9412,0x94F9}, {0x9413,0x9566}, {0x9414,0x9561}, 
+  {0x9418,0x949F}, {0x9419,0x956B}, {0x941D,0x9562}, {0x9420,0x9568}, {0x9426,0x950E}, 
+  {0x9427,0x950F}, {0x9428,0x9544}, {0x942E,0x9570}, {0x9432,0x956F}, {0x9433,0x956D}, 
+  {0x9435,0x94C1}, {0x9438,0x94CE}, {0x943A,0x94DB}, {0x943F,0x9571}, {0x9444,0x94F8}, 
+  {0x944A,0x956C}, {0x944C,0x9554}, {0x9452,0x9274}, {0x9454,0x9572}, {0x9460,0x94C4}, 
+  {0x9463,0x9573}, {0x9465,0x9565}, {0x946D,0x9567}, {0x9470,0x94A5}, {0x9472,0x9576}, 
+  {0x9477,0x954A}, {0x9479,0x9569}, {0x947C,0x9523}, {0x947D,0x94BB}, {0x947E,0x92AE}, 
+  {0x947F,0x51FF}, {0x9577,0x957F}, {0x9580,0x95E8}, {0x9582,0x95E9}, {0x9583,0x95EA}, 
+  {0x9586,0x95EB}, {0x9589,0x95ED}, {0x958B,0x5F00}, {0x958C,0x95F6}, {0x958E,0x95F3}, 
+  {0x958F,0x95F0}, {0x9591,0x95F2}, {0x9593,0x95F4}, {0x9594,0x95F5}, {0x9598,0x95F8}, 
+  {0x95A1,0x9602}, {0x95A3,0x9601}, {0x95A5,0x9600}, {0x95A8,0x95FA}, {0x95A9,0x95FD}, 
+  {0x95AB,0x9603}, {0x95AC,0x9606}, {0x95AD,0x95FE}, {0x95B2,0x9605}, {0x95B6,0x960A}, 
+  {0x95B9,0x9609}, {0x95BB,0x960E}, {0x95BC,0x960F}, {0x95BD,0x960D}, {0x95BE,0x9608}, 
+  {0x95BF,0x960C}, {0x95C3,0x9612}, {0x95C8,0x95F1}, {0x95CA,0x9614}, {0x95CB,0x9615}, 
+  {0x95CC,0x9611}, {0x95D0,0x9617}, {0x95D4,0x9616}, {0x95D5,0x9619}, {0x95D6,0x95EF}, 
+  {0x95DC,0x5173}, {0x95DE,0x961A}, {0x95E1,0x9610}, {0x95E5,0x95FC}, {0x9658,0x9649}, 
+  {0x965D,0x9655}, {0x9663,0x9635}, {0x9670,0x9634}, {0x9673,0x9648}, {0x9678,0x9646}, 
+  {0x967D,0x9633}, {0x9689,0x9667}, {0x968A,0x961F}, {0x968E,0x9636}, {0x9695,0x9668}, 
+  {0x969B,0x9645}, {0x96A8,0x968F}, {0x96AA,0x9669}, {0x96B1,0x9690}, {0x96B4,0x9647}, 
+  {0x96B8,0x96B6}, {0x96D6,0x867D}, {0x96D9,0x53CC}, {0x96DB,0x96CF}, {0x96DC,0x6742}, 
+  {0x96E2,0x79BB}, {0x96E3,0x96BE}, {0x96F2,0x4E91}, {0x96FB,0x7535}, {0x9727,0x96FE}, 
+  {0x973D,0x9701}, {0x9742,0x96F3}, {0x9744,0x972D}, {0x9748,0x7075}, {0x975A,0x9753}, 
+  {0x975C,0x9759}, {0x9768,0x9765}, {0x978F,0x5DE9}, {0x97BD,0x9792}, {0x97C3,0x9791}, 
+  {0x97C9,0x97AF}, {0x97CB,0x97E6}, {0x97CC,0x97E7}, {0x97D3,0x97E9}, {0x97D9,0x97EA}, 
+  {0x97DC,0x97EC}, {0x97DE,0x97EB}, {0x97FF,0x54CD}, {0x9801,0x9875}, {0x9802,0x9876}, 
+  {0x9803,0x9877}, {0x9805,0x9879}, {0x9806,0x987A}, {0x9807,0x9878}, {0x9808,0x987B}, 
+  {0x980A,0x987C}, {0x980C,0x9882}, {0x980E,0x9880}, {0x980F,0x9883}, {0x9810,0x9884}, 
+  {0x9811,0x987D}, {0x9812,0x9881}, {0x9813,0x987F}, {0x9817,0x9887}, {0x9818,0x9886}, 
+  {0x981C,0x988C}, {0x9821,0x9889}, {0x9824,0x9890}, {0x9826,0x988F}, {0x982D,0x5934}, 
+  {0x9830,0x988A}, {0x9837,0x9894}, {0x9838,0x9888}, {0x983B,0x9891}, {0x983D,0x9893}, 
+  {0x9846,0x9897}, {0x984C,0x9898}, {0x984D,0x989D}, {0x984E,0x989A}, {0x9853,0x989B}, 
+  {0x9854,0x989C}, {0x9858,0x613F}, {0x9859,0x98A1}, {0x985B,0x98A0}, {0x985E,0x7C7B}, 
+  {0x9862,0x989F}, {0x9865,0x98A2}, {0x9867,0x987E}, {0x986B,0x98A4}, {0x986C,0x98A5}, 
+  {0x986F,0x663E}, {0x9870,0x98A6}, {0x9871,0x9885}, {0x9873,0x989E}, {0x9874,0x98A7}, 
+  {0x98A8,0x98CE}, {0x98AE,0x98D1}, {0x98AF,0x98D2}, {0x98B6,0x98D3}, {0x98BC,0x98D5}, 
+  {0x98C4,0x98D8}, {0x98C6,0x98D9}, {0x98C8,0x98DA}, {0x98DB,0x98DE}, {0x98E0,0x9963}, 
+  {0x98E9,0x9968}, {0x98EA,0x996A}, {0x98EB,0x996B}, {0x98ED,0x996C}, {0x98EF,0x996D}, 
+  {0x98F2,0x996E}, {0x98F4,0x9974}, {0x98FC,0x9972}, {0x98FD,0x9971}, {0x98FE,0x9970}, 
+  {0x9903,0x997A}, {0x9905,0x997C}, {0x9909,0x9977}, {0x990A,0x517B}, {0x990C,0x9975}, 
+  {0x9911,0x997D}, {0x9912,0x9981}, {0x9913,0x997F}, {0x9918,0x4F59}, {0x991B,0x9984}, 
+  {0x991E,0x996F}, {0x9921,0x9985}, {0x9928,0x9986}, {0x9933,0x9967}, {0x9937,0x9987}, 
+  {0x993C,0x9969}, {0x993E,0x998F}, {0x993F,0x998A}, {0x9943,0x998D}, {0x9945,0x9992}, 
+  {0x9948,0x9990}, {0x9949,0x9991}, {0x994A,0x9993}, {0x994B,0x9988}, {0x994C,0x9994}, 
+  {0x9951,0x9965}, {0x9952,0x9976}, {0x9957,0x98E8}, {0x995C,0x990D}, {0x995E,0x998B}, 
+  {0x9962,0x9995}, {0x99AC,0x9A6C}, {0x99AD,0x9A6D}, {0x99AE,0x51AF}, {0x99B1,0x9A6E}, 
+  {0x99B3,0x9A70}, {0x99B4,0x9A6F}, {0x99C1,0x9A73}, {0x99D0,0x9A7B}, {0x99D1,0x9A7D}, 
+  {0x99D2,0x9A79}, {0x99D4,0x9A75}, {0x99D5,0x9A7E}, {0x99D8,0x9A80}, {0x99D9,0x9A78}, 
+  {0x99DB,0x9A76}, {0x99DD,0x9A7C}, {0x99DF,0x9A77}, {0x99E1,0x9A82}, {0x99E2,0x9A88}, 
+  {0x99ED,0x9A87}, {0x99F1,0x9A86}, {0x99FF,0x9A8F}, {0x9A01,0x9A8B}, {0x9A05,0x9A93}, 
+  {0x9A0D,0x9A92}, {0x9A0E,0x9A91}, {0x9A0F,0x9A90}, {0x9A16,0x9A9B}, {0x9A19,0x9A97}, 
+  {0x9A2B,0x9A9E}, {0x9A2D,0x9A98}, {0x9A2E,0x9A9D}, {0x9A30,0x817E}, {0x9A36,0x9A7A}, 
+  {0x9A37,0x9A9A}, {0x9A38,0x9A9F}, {0x9A3E,0x9AA1}, {0x9A40,0x84E6}, {0x9A41,0x9A9C}, 
+  {0x9A42,0x9A96}, {0x9A43,0x9AA0}, {0x9A44,0x9AA2}, {0x9A45,0x9A71}, {0x9A4A,0x9A85}, 
+  {0x9A4D,0x9A81}, {0x9A4F,0x9AA3}, {0x9A55,0x9A84}, {0x9A57,0x9A8C}, {0x9A5A,0x60CA}, 
+  {0x9A5B,0x9A7F}, {0x9A5F,0x9AA4}, {0x9A62,0x9A74}, {0x9A64,0x9AA7}, {0x9A65,0x9AA5}, 
+  {0x9A6A,0x9A8A}, {0x9AAF,0x80AE}, {0x9ACF,0x9AC5}, {0x9AD4,0x4F53}, {0x9AD5,0x9ACC}, 
+  {0x9AD6,0x9ACB}, {0x9B06,0x677E}, {0x9B22,0x9B13}, {0x9B25,0x6597}, {0x9B27,0x95F9}, 
+  {0x9B29,0x960B}, {0x9B2E,0x9604}, {0x9B31,0x90C1}, {0x9B4E,0x9B49}, {0x9B58,0x9B47}, 
+  {0x9B5A,0x9C7C}, {0x9B6F,0x9C81}, {0x9B74,0x9C82}, {0x9B77,0x9C7F}, {0x9B81,0x9C85}, 
+  {0x9B83,0x9C86}, {0x9B8E,0x9C87}, {0x9B90,0x9C90}, {0x9B91,0x9C8D}, {0x9B92,0x9C8B}, 
+  {0x9B9A,0x9C92}, {0x9B9D,0x9C9E}, {0x9B9E,0x9C95}, {0x9BAA,0x9C94}, {0x9BAB,0x9C9B}, 
+  {0x9BAD,0x9C91}, {0x9BAE,0x9C9C}, {0x9BC0,0x9CA7}, {0x9BC1,0x9CA0}, {0x9BC7,0x9CA9}, 
+  {0x9BC9,0x9CA4}, {0x9BCA,0x9CA8}, {0x9BD4,0x9CBB}, {0x9BD6,0x9CAD}, {0x9BDB,0x9CB7}, 
+  {0x9BDD,0x9CB4}, {0x9BE1,0x9CB1}, {0x9BE2,0x9CB5}, {0x9BE4,0x9CB2}, {0x9BE7,0x9CB3}, 
+  {0x9BE8,0x9CB8}, {0x9BEA,0x9CAE}, {0x9BEB,0x9CB0}, {0x9BF0,0x9CB6}, {0x9BF4,0x9CBA}, 
+  {0x9BFD,0x9CAB}, {0x9BFF,0x9CCA}, {0x9C08,0x9CBD}, {0x9C09,0x9CC7}, {0x9C0D,0x9CC5}, 
+  {0x9C10,0x9CC4}, {0x9C12,0x9CC6}, {0x9C13,0x9CC3}, {0x9C20,0x9CCB}, {0x9C23,0x9CA5}, 
+  {0x9C25,0x9CCF}, {0x9C28,0x9CCE}, {0x9C29,0x9CD0}, {0x9C2D,0x9CCD}, {0x9C31,0x9CA2}, 
+  {0x9C32,0x9CCC}, {0x9C33,0x9CD3}, {0x9C35,0x9CD8}, {0x9C37,0x9CA6}, {0x9C39,0x9CA3}, 
+  {0x9C3B,0x9CD7}, {0x9C3E,0x9CD4}, {0x9C45,0x9CD9}, {0x9C48,0x9CD5}, {0x9C49,0x9CD6}, 
+  {0x9C52,0x9CDF}, {0x9C54,0x9CDD}, {0x9C56,0x9CDC}, {0x9C57,0x9CDE}, {0x9C58,0x9C9F}, 
+  {0x9C5D,0x9CBC}, {0x9C5F,0x9C8E}, {0x9C67,0x9CE2}, {0x9C6D,0x9C9A}, {0x9C78,0x9C88}, 
+  {0x9C7A,0x9CA1}, {0x9CE5,0x9E1F}, {0x9CE9,0x9E20}, {0x9CEC,0x51EB}, {0x9CF3,0x51E4}, 
+  {0x9CF4,0x9E23}, {0x9CF6,0x9E22}, {0x9D06,0x9E29}, {0x9D07,0x9E28}, {0x9D09,0x9E26}, 
+  {0x9D15,0x9E35}, {0x9D1B,0x9E33}, {0x9D1D,0x9E32}, {0x9D1F,0x9E31}, {0x9D23,0x9E2A}, 
+  {0x9D26,0x9E2F}, {0x9D28,0x9E2D}, {0x9D2F,0x9E38}, {0x9D30,0x9E39}, {0x9D3B,0x9E3F}, 
+  {0x9D3F,0x9E3D}, {0x9D42,0x9E3A}, {0x9D51,0x9E43}, {0x9D52,0x9E46}, {0x9D53,0x9E41}, 
+  {0x9D5C,0x9E48}, {0x9D5D,0x9E45}, {0x9D60,0x9E44}, {0x9D61,0x9E49}, {0x9D6A,0x9E4C}, 
+  {0x9D6C,0x9E4F}, {0x9D6F,0x9E4E}, {0x9D72,0x9E4A}, {0x9D87,0x9E2B}, {0x9D89,0x9E51}, 
+  {0x9D93,0x9E4B}, {0x9D98,0x9E55}, {0x9D9A,0x9E57}, {0x9DA5,0x9E5B}, {0x9DA9,0x9E5C}, 
+  {0x9DAF,0x83BA}, {0x9DB4,0x9E64}, {0x9DBB,0x9E58}, {0x9DBC,0x9E63}, {0x9DC0,0x9E5A}, 
+  {0x9DC2,0x9E5E}, {0x9DC4,0x9E21}, {0x9DD3,0x9E67}, {0x9DD7,0x9E25}, {0x9DD9,0x9E37}, 
+  {0x9DDA,0x9E68}, {0x9DE5,0x9E36}, {0x9DE6,0x9E6A}, {0x9DEF,0x9E69}, {0x9DF2,0x9E6B}, 
+  {0x9DF3,0x9E47}, {0x9DF8,0x9E6C}, {0x9DF9,0x9E70}, {0x9DFA,0x9E6D}, {0x9E0C,0x9E71}, 
+  {0x9E15,0x9E2C}, {0x9E1A,0x9E66}, {0x9E1B,0x9E73}, {0x9E1D,0x9E42}, {0x9E1E,0x9E3E}, 
+  {0x9E7A,0x9E7E}, {0x9E7C,0x7877}, {0x9E7D,0x76D0}, {0x9E97,0x4E3D}, {0x9EA5,0x9EA6}, 
+  {0x9EA9,0x9EB8}, {0x9EBD,0x4E48}, {0x9ECC,0x9EC9}, {0x9EDE,0x70B9}, {0x9EE8,0x515A}, 
+  {0x9EF2,0x9EEA}, {0x9EF7,0x9EE9}, {0x9EFD,0x9EFE}, {0x9EFF,0x9F0B}, {0x9F09,0x9F0D}, 
+  {0x9F4A,0x9F50}, {0x9F4B,0x658B}, {0x9F4F,0x9F51}, {0x9F52,0x9F7F}, {0x9F54,0x9F80}, 
+  {0x9F59,0x9F85}, {0x9F5C,0x9F87}, {0x9F5F,0x9F83}, {0x9F60,0x9F86}, {0x9F61,0x9F84}, 
+  {0x9F66,0x9F88}, {0x9F6A,0x9F8A}, {0x9F6C,0x9F89}, {0x9F72,0x9F8B}, {0x9F77,0x9F8C}, 
+  {0x9F8D,0x9F99}, {0x9F90,0x5E9E}, {0x9F94,0x9F9A}, {0x9F95,0x9F9B}, {0x9F9C,0x9F9F}
+};
+
+
+
+/* the letters correspond to unicode characters which
+ * have Lu, Ll, Lt, Lm, Lo, Mn, Mc, or Me in their
+ * GENERAL CATEGORY */
+
+#define NUM_LETTER_INFO 274
+static const unirange letter_info[NUM_LETTER_INFO] = {
+  {0x41,0x5a}, {0x61,0x7a}, {0xaa,0xaa}, {0xb5,0xb5}, 
+  {0xba,0xba}, {0xc0,0xd6}, {0xd8,0xf6}, {0xf8,0x1f5}, 
+  {0x1fa,0x217}, {0x250,0x2a8}, {0x2b0,0x2b8}, {0x2bb,0x2c1}, 
+  {0x2d0,0x2d1}, {0x2e0,0x2e4}, {0x300,0x345}, {0x360,0x361}, 
+  {0x37a,0x37a}, {0x386,0x386}, {0x388,0x38a}, {0x38c,0x38c}, 
+  {0x38e,0x3a1}, {0x3a3,0x3ce}, {0x3d0,0x3d6}, {0x3da,0x3da}, 
+  {0x3dc,0x3dc}, {0x3de,0x3de}, {0x3e0,0x3e0}, {0x3e2,0x3f3}, 
+  {0x401,0x40c}, {0x40e,0x44f}, {0x451,0x45c}, {0x45e,0x481}, 
+  {0x483,0x486}, {0x490,0x4c4}, {0x4c7,0x4c8}, {0x4cb,0x4cc}, 
+  {0x4d0,0x4eb}, {0x4ee,0x4f5}, {0x4f8,0x4f9}, {0x531,0x556}, 
+  {0x559,0x559}, {0x561,0x587}, {0x591,0x5a1}, {0x5a3,0x5b9}, 
+  {0x5bb,0x5bd}, {0x5bf,0x5bf}, {0x5c1,0x5c2}, {0x5c4,0x5c4}, 
+  {0x5d0,0x5ea}, {0x5f0,0x5f2}, {0x621,0x63a}, {0x640,0x652}, 
+  {0x670,0x6b7}, {0x6ba,0x6be}, {0x6c0,0x6ce}, {0x6d0,0x6d3}, 
+  {0x6d5,0x6e8}, {0x6ea,0x6ed}, {0x901,0x903}, {0x905,0x939}, 
+  {0x93c,0x94d}, {0x951,0x954}, {0x958,0x963}, {0x981,0x983}, 
+  {0x985,0x98c}, {0x98f,0x990}, {0x993,0x9a8}, {0x9aa,0x9b0}, 
+  {0x9b2,0x9b2}, {0x9b6,0x9b9}, {0x9bc,0x9bc}, {0x9be,0x9c4}, 
+  {0x9c7,0x9c8}, {0x9cb,0x9cd}, {0x9d7,0x9d7}, {0x9dc,0x9dd}, 
+  {0x9df,0x9e3}, {0x9f0,0x9f1}, {0xa02,0xa02}, {0xa05,0xa0a}, 
+  {0xa0f,0xa10}, {0xa13,0xa28}, {0xa2a,0xa30}, {0xa32,0xa33}, 
+  {0xa35,0xa36}, {0xa38,0xa39}, {0xa3c,0xa3c}, {0xa3e,0xa42}, 
+  {0xa47,0xa48}, {0xa4b,0xa4d}, {0xa59,0xa5c}, {0xa5e,0xa5e}, 
+  {0xa70,0xa74}, {0xa81,0xa83}, {0xa85,0xa8b}, {0xa8d,0xa8d}, 
+  {0xa8f,0xa91}, {0xa93,0xaa8}, {0xaaa,0xab0}, {0xab2,0xab3}, 
+  {0xab5,0xab9}, {0xabc,0xac5}, {0xac7,0xac9}, {0xacb,0xacd}, 
+  {0xae0,0xae0}, {0xb01,0xb03}, {0xb05,0xb0c}, {0xb0f,0xb10}, 
+  {0xb13,0xb28}, {0xb2a,0xb30}, {0xb32,0xb33}, {0xb36,0xb39}, 
+  {0xb3c,0xb43}, {0xb47,0xb48}, {0xb4b,0xb4d}, {0xb56,0xb57}, 
+  {0xb5c,0xb5d}, {0xb5f,0xb61}, {0xb82,0xb83}, {0xb85,0xb8a}, 
+  {0xb8e,0xb90}, {0xb92,0xb95}, {0xb99,0xb9a}, {0xb9c,0xb9c}, 
+  {0xb9e,0xb9f}, {0xba3,0xba4}, {0xba8,0xbaa}, {0xbae,0xbb5}, 
+  {0xbb7,0xbb9}, {0xbbe,0xbc2}, {0xbc6,0xbc8}, {0xbca,0xbcd}, 
+  {0xbd7,0xbd7}, {0xc01,0xc03}, {0xc05,0xc0c}, {0xc0e,0xc10}, 
+  {0xc12,0xc28}, {0xc2a,0xc33}, {0xc35,0xc39}, {0xc3e,0xc44}, 
+  {0xc46,0xc48}, {0xc4a,0xc4d}, {0xc55,0xc56}, {0xc60,0xc61}, 
+  {0xc82,0xc83}, {0xc85,0xc8c}, {0xc8e,0xc90}, {0xc92,0xca8}, 
+  {0xcaa,0xcb3}, {0xcb5,0xcb9}, {0xcbe,0xcc4}, {0xcc6,0xcc8}, 
+  {0xcca,0xccd}, {0xcd5,0xcd6}, {0xcde,0xcde}, {0xce0,0xce1}, 
+  {0xd02,0xd03}, {0xd05,0xd0c}, {0xd0e,0xd10}, {0xd12,0xd28}, 
+  {0xd2a,0xd39}, {0xd3e,0xd43}, {0xd46,0xd48}, {0xd4a,0xd4d}, 
+  {0xd57,0xd57}, {0xd60,0xd61}, {0xe01,0xe2e}, {0xe30,0xe3a}, 
+  {0xe40,0xe4e}, {0xe81,0xe82}, {0xe84,0xe84}, {0xe87,0xe88}, 
+  {0xe8a,0xe8a}, {0xe8d,0xe8d}, {0xe94,0xe97}, {0xe99,0xe9f}, 
+  {0xea1,0xea3}, {0xea5,0xea5}, {0xea7,0xea7}, {0xeaa,0xeab}, 
+  {0xead,0xeae}, {0xeb0,0xeb9}, {0xebb,0xebd}, {0xec0,0xec4}, 
+  {0xec6,0xec6}, {0xec8,0xecd}, {0xedc,0xedd}, {0xf18,0xf19}, 
+  {0xf35,0xf35}, {0xf37,0xf37}, {0xf39,0xf39}, {0xf40,0xf47}, 
+  {0xf49,0xf69}, {0xf71,0xf84}, {0xf86,0xf87}, {0xf90,0xf95}, 
+  {0xf97,0xf97}, {0xf99,0xfad}, {0xfb1,0xfb7}, {0xfb9,0xfb9}, 
+  {0x10a0,0x10c5}, {0x10d0,0x10f6}, {0x1100,0x1159}, {0x115f,0x11a2}, 
+  {0x11a8,0x11f9}, {0x1e00,0x1e9b}, {0x1ea0,0x1ef9}, {0x1f00,0x1f15}, 
+  {0x1f18,0x1f1d}, {0x1f20,0x1f45}, {0x1f48,0x1f4d}, {0x1f50,0x1f57}, 
+  {0x1f59,0x1f59}, {0x1f5b,0x1f5b}, {0x1f5d,0x1f5d}, {0x1f5f,0x1f7d}, 
+  {0x1f80,0x1fb4}, {0x1fb6,0x1fbc}, {0x1fbe,0x1fbe}, {0x1fc2,0x1fc4}, 
+  {0x1fc6,0x1fcc}, {0x1fd0,0x1fd3}, {0x1fd6,0x1fdb}, {0x1fe0,0x1fec}, 
+  {0x1ff2,0x1ff4}, {0x1ff6,0x1ffc}, {0x207f,0x207f}, {0x20d0,0x20e1}, 
+  {0x2102,0x2102}, {0x2107,0x2107}, {0x210a,0x2113}, {0x2115,0x2115}, 
+  {0x2118,0x211d}, {0x2124,0x2124}, {0x2126,0x2126}, {0x2128,0x2128}, 
+  {0x212a,0x2131}, {0x2133,0x2138}, {0x3005,0x3005}, {0x302a,0x302f}, 
+  {0x3031,0x3035}, {0x3041,0x3094}, {0x3099,0x309e}, {0x30a1,0x30fa}, 
+  {0x30fc,0x30fe}, {0x3105,0x312c}, {0x3131,0x318e}, {0x4e00,0x9fa5}, 
+  {0xac00,0xd7a3}, {0xf900,0xfa2d}, {0xfb00,0xfb06}, {0xfb13,0xfb17}, 
+  {0xfb1e,0xfb28}, {0xfb2a,0xfb36}, {0xfb38,0xfb3c}, {0xfb3e,0xfb3e}, 
+  {0xfb40,0xfb41}, {0xfb43,0xfb44}, {0xfb46,0xfbb1}, {0xfbd3,0xfd3d}, 
+  {0xfd50,0xfd8f}, {0xfd92,0xfdc7}, {0xfdf0,0xfdfb}, {0xfe20,0xfe23}, 
+  {0xfe70,0xfe72}, {0xfe74,0xfe74}, {0xfe76,0xfefc}, {0xff21,0xff3a}, 
+  {0xff41,0xff5a}, {0xff66,0xffbe}, {0xffc2,0xffc7}, {0xffca,0xffcf}, 
+  {0xffd2,0xffd7}, {0xffda,0xffdc}
+};
+
+
+/* the digits correspond to unicode characters which
+ * have Nd in their GENERAL CATEGORY */
+
+#define NUM_DIGIT_INFO 16
+static const unirange digit_info[NUM_DIGIT_INFO] = {
+  {0x30,0x39}, {0x660,0x669}, {0x6f0,0x6f9}, {0x966,0x96f}, 
+  {0x9e6,0x9ef}, {0xa66,0xa6f}, {0xae6,0xaef}, {0xb66,0xb6f}, 
+  {0xbe7,0xbef}, {0xc66,0xc6f}, {0xce6,0xcef}, {0xd66,0xd6f}, 
+  {0xe50,0xe59}, {0xed0,0xed9}, {0xf20,0xf29}, {0xff10,0xff19}
+};
+
+
+/* the spaces correspond to unicode characters which
+ * have Zs, Zl, or Zp in their GENERAL CATEGORY */
+
+#define NUM_SPACE_INFO 5
+static const unirange space_info[NUM_SPACE_INFO] = {
+  {0x20,0x20}, {0xa0,0xa0}, {0x2000,0x200b}, {0x2028,0x2029}, 
+  {0x3000,0x3000}
+};
+
+
+
+/* parse_utf8_char parses the next utf-8 character, placing its
+ * unicode equivalent in *value. The length of the utf-8 character
+ * is returned */
+int parse_utf8_char(const unsigned char *here,
+		    const unsigned char *end,
+		    unsigned short *value) {
+  unsigned short c1;
+  unsigned short c2;
+  unsigned short c3;
+  
+  *value = 0; /* will be the value for illegal characters */
+  
+  if (here <= end) {
+    c1 = (unsigned short)(*here);
+    
+    if (c1 <= 0x7f) {
+      /* found a one-byte character */
+      *value = c1;
+      return 1;
+      
+    } else if (c1 >= 0xc0 && c1 <= 0xdf && here+1 <= end &&
+	       (c2=(unsigned short)(*(here+1))) >= 0x80) {
+      /* found a two-byte character */
+      *value = ((c1 & 0x1f) << 6) + (c2 & 0x3f);
+      return 2;
+      
+    } else if (c1 >= 0xe0 && c1 <= 0xef && here+2 <= end &&
+	       (c2=(unsigned int)(*(here+1))) >= 0x80 &&
+	       (c3=(unsigned int)(*(here+2))) >= 0x80) {
+      /* found a three-byte character */
+      *value = ((c1 & 0xf) << 12) + ((c2 & 0x3f) << 6) +
+	(c3 & 0x3f);
+      return 3;
+      
+    } else {
+      /* error in encoding, return the length as 1 */
+      return 1;
+    }
+  }
+
+  /* end of string */
+  return 0;
+}
+
+
+/* output_utf8_char encodes a unicode character as a UTF-8 character.
+ * The length of the encoding is returned. If the string was not
+ * long enough to encode the character 0 is returned. */
+int output_utf8_char (unsigned short value,
+		      unsigned char *here,
+		      unsigned char *end) {
+  int len = (int)(end - here + 1); /* end is the last character */
+  if (value < 0x80) {
+    /* will be encoded in one byte */
+    if (len >= 1) {
+      *here = (unsigned char)value;
+      return 1;
+    }
+
+  } else if (value < 0x800) {
+    /* will be encoded in two bytes */
+    if (len >= 2) {
+      *here++ = 0xc0 | (unsigned char)((value >> 6) & 0x1f);
+      *here = 0x80 | (unsigned char)(value & 0x3f);
+
+      return 2;
+    }
+
+  } else {
+    /* will be encoded in three bytes */
+    if (len >= 3) {
+      *here++ = 0xe0 | (unsigned char)((value >> 12) & 0xf);
+      *here++ = 0x80 | (unsigned char)((value >> 6) & 0x3f);
+      *here = 0x80 | (unsigned char)(value & 0x3f);
+      return 3;
+    }
+  }
+
+  return 0;
+}
+
+
+static int lookup_decompose_table (unsigned short value) {
+  int first = 0;
+  int last = NUM_DECOMPOSE_INFO;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < decompose_info[here].ch) {
+      last = here;
+    } else if (value > decompose_info[here].ch) {
+      first = here+1;
+    } else {
+      return here;
+    }
+  }
+
+  return -1;
+}
+
+/* decompose_str will decompose a unicode string into its canonical
+ * equivalents. NULL is returned if the input array was not 
+ * large enough to contain the fully decomposed string (the array
+ * will be in a correct, but partially decomposed state). The input 
+ * must be null-terminated. */
+unsigned short *decompose_str (unsigned short *input,
+			       int max_output_len) {
+  int curpos = 0;
+  int curlen = unicode_strlen (input);
+  int tablepos = 0;
+  int leninc;
+  int i;
+
+  while (input[curpos] != 0) {
+    tablepos = lookup_decompose_table (input[curpos]);
+    if (tablepos >= 0) {
+      /* found a decomposition */
+      leninc = unicode_strnlen (decompose_info[tablepos].str, 3)-1;
+      if (curlen+leninc < max_output_len) {
+	/* enough space for this decomposition */
+
+	if (leninc > 1) {
+	  /* we have to shift the array along */
+	  for (i=curlen-1; i>=curpos; i--) {
+	    input[i+leninc] = input[i];
+	  }
+	  input[curlen+leninc] = 0;
+	  curlen += leninc;
+	}
+
+	/* decompose the character */
+	for (i=0; i<=leninc; i++) {
+	  input[curpos+i] = decompose_info[tablepos].str[i];
+	}
+
+	/* note: curpos is not incremented because the decomposed */
+	/*       characters might need decomposing */
+
+      } else {
+	/* no space left in string */
+	return NULL;
+      }
+
+    } else {
+      /* the character cannot be decomposed */
+      curpos++;
+    }
+  }
+
+  return input;
+}
+
+
+
+/* unicode_cat_data is a combination of the letter, digit, and
+ * space information in a form that is quick to look up.
+ * The information about each byte is stored in two bits
+ *
+ * 00 - neither letter, digit or space
+ * 01 - letter
+ * 10 - space
+ * 11 - digit
+ *
+ * You can test for letter | space by looking at the right
+ * column
+ */
+/*unsigned long *unicode_cat_data;*/
+
+void create_unicat_data () {
+  int i=0;
+  int min_start=0;
+  int min_end=0;
+  register unsigned long min_value=0; /* filling the whole byte */
+  
+  const unirange *letter_here = letter_info;
+  const unirange *letter_end = letter_info+NUM_LETTER_INFO;
+  const unirange *digit_here = digit_info;
+  const unirange *digit_end = digit_info+NUM_DIGIT_INFO;
+  const unirange *space_here = space_info;
+  const unirange *space_end = space_info+NUM_SPACE_INFO;
+
+  if (unicode_cat_data != NULL) return;
+  unicode_cat_data = (unsigned long *) malloc (0x10000/4);
+  if (unicode_cat_data == NULL) return;
+  
+  while (i <= 0xffff) {
+    /* decide what to fill with next */
+    min_start = i;
+    min_end = 0xffff;
+    min_value = 0; /* 00 */
+    
+    while (letter_here < letter_end && letter_here->last < i) letter_here++;
+    if (letter_here < letter_end && letter_here->last <= min_end) {
+      min_start = letter_here->first;
+      min_end = letter_here->last;
+      min_value = 0x55555555; /* 01 */
+    }
+    
+    while (digit_here < digit_end && digit_here->last < i) digit_here++;
+    if (digit_here < digit_end && digit_here->last <= min_end) {
+      min_start = digit_here->first;
+      min_end = digit_here->last;
+      min_value = 0xffffffff; /* 11 */
+    }
+    
+    while (space_here < space_end && space_here->last < i) space_here++;
+    if (space_here < space_end && space_here->last <= min_end) {
+      min_start = space_here->first;
+      min_end = space_here->last;
+      min_value = 0xaaaaaaaa; /* 10 */
+    }
+
+    if (min_start < i) min_start = i;
+    else if (min_start > i) {
+      min_end = min_start-1;
+      min_start = i;
+      min_value = 0; /* 00 */
+    }
+
+    /* fill the entries from min_start to min_end with min_value */
+    while (i <= min_end) {
+      /* special version for common case */
+      if (i % 16 == 0) {
+	unicode_cat_data[i/16] = min_value; /* doesn't matter if too long */
+	i += 16;
+	if (i > min_end) {
+	  i = min_end+1;
+	  break;
+	}
+	
+      } else {
+	register unsigned long mask = 3 << ((i % 16) * 2);
+	unicode_cat_data[i/16] = (unicode_cat_data[i/16] & (~mask)) |
+				  (min_value & mask);
+	i++;
+      }
+    }
+  }
+}
+
+/* does a binary search on a range table */
+static int in_unirange (const unirange *info, int num_info,
+			unsigned short value) {
+  int first = 0;
+  int last = num_info;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < info[here].first) {
+      last = here;
+    } else if (value > info[here].last) {
+      first = here+1;
+    } else {
+      return 1;
+    }
+  }
+
+  return 0;
+}
+
+
+
+/* tests to see whether 'value' is a valid Unicode letter */
+int is_unicode_letter (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(letter_info, NUM_LETTER_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x1);
+}
+
+/* tests to see whether 'value' is a valid Unicode digit */
+int is_unicode_digit (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(digit_info, NUM_DIGIT_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x3);
+}
+
+/* tests to see whether 'value' is a valid Unicode letter or 
+ * digit */
+int is_unicode_letdig (unsigned short value) {
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return (in_unirange(letter_info, NUM_LETTER_INFO, value) ||
+	    in_unirange(digit_info, NUM_DIGIT_INFO, value));
+    
+  }
+
+  return ((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x1);
+}
+
+/* tests to see whether 'value' is a valid space
+ * The test includes both "C" spaces and "Unicode" spaces, i.e. 
+ * form-feed, newline, carriage return, horizontal tab,
+ * vertical tab, and the Zs, Zl, and Zp Unicode categorizations */
+int is_unicode_space (unsigned short value) {
+  if (value < 0x80) return isspace (value);
+  if (unicode_cat_data == NULL) create_unicat_data ();
+  if (unicode_cat_data == NULL) {
+    /* use old method */
+    return in_unirange(space_info, NUM_SPACE_INFO, value);
+  }
+
+  return (((unicode_cat_data[value/16] >> ((value%16)*2)) & 0x3) == 0x2);
+}
+
+/* returns the length of the unicode string */
+int unicode_strlen (const unsigned short *str) {
+  int len = 0;
+
+  /* keep going till you find the null-terminator */
+  while (*str != 0) {
+    len++;
+    str++;
+  }
+
+  return len;
+}
+
+/* returns the length of the unicode string, up to a maximum */
+int unicode_strnlen (const unsigned short *str, int max_length) {
+  int len = 0;
+
+  /* keep going till you find the null-terminator */
+  while (*str != 0 && len < max_length ) {
+    len++;
+    str++;
+  }
+
+  return len;
+}
+
+
+/* Does a binary search on a relate table, returns -1 if it is not
+ * found. */
+static int search_unirelate (const unirelate *info, int num_info,
+			     unsigned short value) {
+  int first = 0;
+  int last = num_info;
+  int here;
+
+  while (first < last) {
+    here = (last-first)/2 + first;
+    if (value < info[here].ch1) {
+      last = here;
+    } else if (value > info[here].ch1) {
+      first = here+1;
+    } else {
+      return here;
+    }
+  }
+
+  return -1;
+}
+
+
+/* returns the upper-case equivalent of value */
+unsigned short unicode_toupper (unsigned short value) {
+  int related = search_unirelate (toupper_info, NUM_TOUPPER_INFO, value);
+  if (related >= 0) {
+    value = toupper_info[related].ch2;
+  }
+  return value;
+}
+
+/* returns the lower-case equivalent of value */
+unsigned short unicode_tolower (unsigned short value) {
+  int related = search_unirelate (tolower_info, NUM_TOLOWER_INFO, value);
+  if (related >= 0) {
+    value = tolower_info[related].ch2;
+  }
+  return value;
+}
+
+/* returns the simplified Chinese character equivalent of 
+ * another Chinese character */
+unsigned short unicode_tosimplified (unsigned short value) {
+  int related = search_unirelate (tosimplified_info, NUM_TOSIMPLIFIED_INFO, value);
+  if (related >= 0) {
+    value = tosimplified_info[related].ch2;
+  }
+  return value;
+}
+
+
+/* converts a utf-8 word (string with length stored in the first byte
+ * to a Unicode array. To handle all situations the output buffer should
+ * be 256 unsigned shorts long. The output will also have the length as
+ * the first entry. */
+unsigned short *utf8_word_to_unicode (const unsigned char *input,
+				      unsigned short *output,
+				      int max_output_length) {
+  int inlen = *input;
+  const unsigned char *inhere = input+1;
+  const unsigned char *inend = &inhere[inlen-1];
+  unsigned short c;
+  int clen;
+  
+  int outlen = 0;
+  unsigned short *outhere = output+1;
+  
+  while (inhere <= inend && inlen < max_output_length-1) {
+    /* decode the character */
+    clen = parse_utf8_char (inhere, inend, &c);
+    inhere += clen;
+
+    if (clen > 0) {
+      /* store the character */
+      *outhere = c;
+      outhere++;
+      outlen++;
+    }
+  }
+
+  output[0] = outlen;
+  return output;
+}
+
+
+/* converts a unicode word buffer (with the length stored in the
+ * entry) to a utf8 encoded word output (with the length stored in
+ * the first byte. Only 255 bytes (not characters) can be stored 
+ * in the output. */
+unsigned char *unicode_to_utf8_word (const unsigned short *input,
+				     unsigned char *output,
+				     int max_output_length) {
+  int inlen = *input;
+  const unsigned short *word = input + 1;
+  int in_i = 0;
+  int clen;
+
+  int outlen = 0;
+  unsigned char *outhere = output+1;
+  unsigned char *outend = output+max_output_length;
+
+  while (in_i < inlen) {
+    if ((clen=output_utf8_char(word[in_i], outhere, outend)) == 0) {
+      /* ran out of space to encode the character */
+      break;
+    }
+
+    outhere += clen;
+    outlen += clen;
+    in_i++;
+  }
+
+  output[0] = outlen;
+
+  return output;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/lib/unitool.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/unitool.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/unitool.h	(revision 21083)
@@ -0,0 +1,88 @@
+#ifndef UNITOOL_H
+#define UNITOOL_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* This module is based on Unicode 2.1 */
+
+
+/* parse_utf8_char parses the next utf-8 character, placing its
+ * unicode equivalent in *value. The length of the utf-8 character
+ * is returned. end is the address of the last character. */
+int parse_utf8_char (const unsigned char *here,
+		     const unsigned char *end,
+		     unsigned short *value);
+
+/* output_utf8_char encodes a unicode character as a UTF-8 character.
+ * The length of the encoding is returned. If the string was not
+ * long enough to encode the character 0 is returned. end is the
+ * address of the last character */
+int output_utf8_char (unsigned short value,
+		      unsigned char *here,
+		      unsigned char *end);
+
+/* decompose_str will decompose a unicode string into its canonical
+ * equivalents. NULL is returned if the input array was not 
+ * large enough to contain the fully decomposed string (the array
+ * will be in a correct, but partially decomposed state). The input 
+ * must be null-terminated. */
+unsigned short *decompose_str (unsigned short *input,
+			       int max_output_len);
+
+/* tests to see whether 'value' is a valid Unicode letter */
+int is_unicode_letter (unsigned short value);
+
+/* tests to see whether 'value' is a valid Unicode digit */
+int is_unicode_digit (unsigned short value);
+
+/* tests to see whether 'value' is a valid Unicode letter or 
+ * digit */
+int is_unicode_letdig (unsigned short value);
+
+/* tests to see whether 'value' is a valid space
+ * The test includes both "C" spaces and "Unicode" spaces, i.e. 
+ * form-feed, newline, carriage return, horizontal tab,
+ * vertical tab, and the Zs, Zl, and Zp Unicode categorizations */
+int is_unicode_space (unsigned short value);
+
+/* returns the length of the unicode string */
+int unicode_strlen (const unsigned short *str);
+
+/* returns the length of the unicode string, up to a maximum */
+int unicode_strnlen (const unsigned short *str, int max_length);
+
+/* returns the upper-case equivalent of value */
+unsigned short unicode_toupper (unsigned short value);
+
+/* returns the lower-case equivalent of value */
+unsigned short unicode_tolower (unsigned short value);
+
+/* returns the simplified Chinese character equivalent of 
+ * another Chinese character */
+unsigned short unicode_tosimplified (unsigned short value);
+
+
+/* converts a utf-8 word (string with length stored in the first byte
+ * to a Unicode array. To handle all situations the output buffer should
+ * be 256 unsigned shorts long. The output will also have the length as
+ * the first entry. */
+unsigned short *utf8_word_to_unicode (const unsigned char *input,
+				      unsigned short *output,
+				      int max_output_length);
+
+/* converts a unicode word buffer (with the length stored in the
+ * entry) to a utf8 encoded word output (with the length stored in
+ * the first byte. Only 255 bytes (not characters) can be stored 
+ * in the output. */
+unsigned char *unicode_to_utf8_word (const unsigned short *input,
+				     unsigned char *output,
+				     int max_output_length);
+
+#ifdef __cplusplus
+	   }
+#endif
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/win32in.c
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/win32in.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/win32in.c	(revision 21083)
@@ -0,0 +1,85 @@
+/* This module provides an equivalent of <netinet/in.h> on  */
+/* unix systems. */
+#include "win32in.h"
+
+unsigned long htonl(unsigned long x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 24) & 0x000000FF) | ((x >> 8) & 0x0000FF00) |
+		((x << 8) & 0x00FF0000) | ((x << 24) & 0xFF000000);
+#endif
+
+	return x;
+}
+
+mg_ullong ntohll(mg_ullong x)
+{
+#if defined (LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = 
+	  ((x >> 56) & 0x00000000000000FF) | ((x >> 40) & 0x000000000000FF00) |
+	  ((x >> 24) & 0x0000000000FF0000) | ((x >> 8)  & 0x00000000FF000000) |
+	  ((x << 8)  & 0x000000FF00000000) | ((x << 24) & 0x0000FF0000000000) |
+		((x << 40) & 0x00FF000000000000) | ((x << 56) & 0xFF00000000000000);
+#endif
+  return x;
+}
+
+unsigned long ntohl(unsigned long x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 24) & 0x000000FF) | ((x >> 8) & 0x0000FF00) |
+		((x << 8) & 0x00FF0000) | ((x << 24) & 0xFF000000);
+#endif
+	return x;
+}
+
+unsigned short htons(unsigned short x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 8) & 0x00FF) | ((x << 8) & 0xFF00);
+#endif
+	return x;
+}
+
+unsigned short ntohs(unsigned short x) {
+#if defined (LITTLE_ENDIAN) || defined (_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN)
+	x = ((x >> 8) & 0x00FF) | ((x << 8) & 0xFF00);
+#endif
+	return x;
+}
+
+/* just to test stuff
+#include <stdio.h>
+
+main () {
+	long x;
+	short sx;
+
+	x = 0x000000FF;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0x0000FF00;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0x00FF0000;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n",(int)x);
+
+	x = 0xFF000000;
+	printf ("before %i, ",(int)x);
+	x = htonl (x);
+	printf ("after %i\n\n",(int)x);
+
+	sx = 0x00FF;
+	printf ("before %i, ",(int)sx);
+	sx = htons (sx);
+	printf ("after %i\n",(int)sx);
+
+	sx = 0xFF00;
+	printf ("before %i, ",(int)sx);
+	sx = htons (sx);
+	printf ("after %i\n",(int)sx);
+}
+*/
Index: /main/tags/2.38/gsdl/src/mgpp/lib/win32in.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/win32in.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/win32in.h	(revision 21083)
@@ -0,0 +1,20 @@
+/* This module provides an equivalent of <netinet/in.h> on  */
+/* unix systems. */
+#ifdef __WIN32__
+#define _LITTLE_ENDIAN
+#endif
+
+#include "longlong.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned long htonl(unsigned long x);
+unsigned long ntohl(unsigned long x);
+mg_ullong ntohll(mg_ullong x);
+unsigned short htons(unsigned short x);
+unsigned short ntohs(unsigned short x);
+
+#ifdef __cplusplus
+}
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/lib/xmalloc.c
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/lib/xmalloc.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/lib/xmalloc.c	(revision 21083)
@@ -0,0 +1,111 @@
+/* xmalloc.c -- malloc with out of memory checking
+   Copyright (C) 1990, 91, 92, 93, 94 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# ifdef __WIN32__  /* [RPAP - Feb 97: WIN32 Port] */
+#  include <win32cfg.h>
+# else
+#  include <sysfuncs.h>
+# endif
+#endif
+
+#if __STDC__
+#define VOID void
+#else
+#define VOID char
+#endif
+
+#include <sys/types.h>
+
+#if STDC_HEADERS
+#include <stdlib.h>
+#else
+VOID *malloc ();
+VOID *realloc ();
+void free ();
+#endif
+
+/* This is for other GNU distributions with internationalized messages.
+   The GNU C Library itself does not yet support such messages.  */
+#if HAVE_LIBINTL_H
+# include <libintl.h>
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+/* Exit value when the requested amount of memory is not available.
+   The caller may set it to some other value.  */
+int xmalloc_exit_failure = EXIT_FAILURE;
+
+#if defined(__WIN32__)
+void error (int, int, const char *, ...);
+#else
+#if __STDC__ && (HAVE_VPRINTF || HAVE_DOPRNT)
+void error (int, int, const char *, ...);
+#else
+void error (int, int, char *, char *, char *, char *, char *, char *, char *, char *, char *);
+#endif
+#endif
+
+static VOID *
+fixup_null_alloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = 0;
+  if (n == 0)
+    p = malloc ((size_t) 1);
+  if (p == 0)
+    error (xmalloc_exit_failure, 0, gettext ("Memory exhausted"));
+  return p;
+}
+
+/* Allocate N bytes of memory dynamically, with error checking.  */
+
+VOID *
+xmalloc (n)
+     size_t n;
+{
+  VOID *p;
+
+  p = malloc (n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
+
+/* Change the size of an allocated block of memory P to N bytes,
+   with error checking.
+   If P is NULL, run xmalloc.  */
+
+VOID *
+xrealloc (p, n)
+     VOID *p;
+     size_t n;
+{
+  if (p == 0)
+    return xmalloc (n);
+  p = realloc (p, n);
+  if (p == 0)
+    p = fixup_null_alloc (n);
+  return p;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/mkinstalldirs
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/mkinstalldirs	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/mkinstalldirs	(revision 21083)
@@ -0,0 +1,32 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1994-03-25
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do 
+   set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+   shift
+
+   pathcomp=
+   for d in ${1+"$@"} ; do
+     pathcomp="$pathcomp$d"
+     case "$pathcomp" in
+       -* ) pathcomp=./$pathcomp ;;
+     esac
+
+     if test ! -d "$pathcomp"; then
+        echo "mkdir $pathcomp" 1>&2
+        mkdir "$pathcomp" || errstatus=$?
+     fi
+
+     pathcomp="$pathcomp/"
+   done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
Index: /main/tags/2.38/gsdl/src/mgpp/stamp-h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/stamp-h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/stamp-h	(revision 21083)
@@ -0,0 +1,1 @@
+timestamp
Index: /main/tags/2.38/gsdl/src/mgpp/stamp-h.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/stamp-h.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/stamp-h.in	(revision 21083)
@@ -0,0 +1,1 @@
+timestamp
Index: /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.cpp	(revision 21083)
@@ -0,0 +1,129 @@
+/**************************************************************************
+ *
+ * FIvfLevelInfo.cpp -- File functions for document levels
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "FIvfLevelInfo.h"
+
+
+IvfLevelInfo::IvfLevelInfo () {
+  Clear();
+}
+
+void IvfLevelInfo::Clear () {
+  levelTag.erase (levelTag.begin(), levelTag.end());
+  numEntries = 0;
+  approxWeightsDiskPtr = 0;
+  exactWeightsDiskPtr = 0;
+  workInLevel = false;
+}
+
+bool IvfLevelInfo::Read (FILE *f) {
+  workInLevel = false;
+  return (ReadUCArray (f, levelTag) &&
+	  ReadUL (f, numEntries) &&
+	  ReadUL (f, approxWeightsDiskPtr) &&
+	  ReadUL (f, exactWeightsDiskPtr));
+}
+
+bool IvfLevelInfo::Write (FILE *f) const {
+  return (WriteUCArray (f, levelTag) &&
+	  WriteUL (f, numEntries) &&
+	  WriteUL (f, approxWeightsDiskPtr) &&
+	  WriteUL (f, exactWeightsDiskPtr));
+}
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const IvfLevelInfo &l) {
+  s << "  Tag: \"" << l.levelTag << "\"\n"
+    << "  numEntries: " << l.numEntries << "\n"
+    << "  approxWeightsDiskPtr: " << l.approxWeightsDiskPtr << "\n"
+    << "  exactWeightsDiskPtr: " << l.exactWeightsDiskPtr << "\n"
+    << "  workInLevel: " << ((l.workInLevel) ? "true" : "false") << "\n\n";
+  
+  return s;
+}
+
+
+
+FIvfLevel::FIvfLevel () {
+  Clear ();
+}
+
+void FIvfLevel::Clear () {
+  docTag.erase (docTag.begin(), docTag.end());
+  indexLevel.erase (indexLevel.begin(), indexLevel.end());
+  levelInfo.erase (levelInfo.begin(), levelInfo.end());
+}
+
+bool FIvfLevel::Read (FILE *f) {
+  if (!ReadUCArray (f, docTag) ||
+      !ReadUCArray (f, indexLevel))
+    return false;
+  
+  // read in the array size
+  unsigned long arrSize = 0;
+  if (!ReadVarLenUL (f, arrSize)) return false;
+  
+  IvfLevelInfo thisLevel;
+  while (arrSize > 0) {
+    // read and insert the next level information
+    if (!thisLevel.Read (f)) return false;
+    levelInfo[thisLevel.levelTag] = thisLevel;
+    
+    arrSize--;
+  }
+
+  return true;
+}
+
+bool FIvfLevel::Write (FILE *f) const {
+  if (!WriteUCArray (f, docTag) ||
+      !WriteUCArray (f, indexLevel))
+    return false;
+  
+  // write out the array size
+  if (!WriteVarLenUL (f, levelInfo.size())) return false;
+
+  // write out each level info
+  IvfLevelInfoMap::const_iterator here = levelInfo.begin();
+  IvfLevelInfoMap::const_iterator end = levelInfo.end();
+  while (here != end) {
+    if (!(*here).second.Write (f)) return false;
+    
+    here++;
+  }
+
+  return true;
+}
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const FIvfLevel &l) {
+  s << "docTag: \"" << l.docTag << "\"\n"
+    << "indexLevel: \"" << l.indexLevel << "\"\n";
+  
+  IvfLevelInfoMap::const_iterator here = l.levelInfo.begin ();
+  IvfLevelInfoMap::const_iterator end = l.levelInfo.end ();
+  while (here != end) {
+    s << (*here).second;
+    here++;
+  }
+  
+  return s;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FIvfLevelInfo.h	(revision 21083)
@@ -0,0 +1,77 @@
+/**************************************************************************
+ *
+ * FIvfLevelInfo.h -- File functions for document levels
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef FIVFLEVELINFO_H
+#define FIVFLEVELINFO_H
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+#include <stdio.h>
+#include "UCArray.h"
+
+
+class IvfLevelInfo {
+public:
+  UCArray levelTag;
+  unsigned long numEntries; // N for level
+  unsigned long approxWeightsDiskPtr;
+  unsigned long exactWeightsDiskPtr;
+  bool workInLevel;  // this is just a working variable,
+                     // it is not saved or read from the file
+  
+  IvfLevelInfo ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const IvfLevelInfo &l);
+
+
+typedef map<UCArray, IvfLevelInfo, LTUCArray> IvfLevelInfoMap;
+
+
+class FIvfLevel {
+public:
+  UCArray docTag;
+  UCArray indexLevel;    // empty for word level index
+  IvfLevelInfoMap levelInfo;
+  
+  FIvfLevel ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const FIvfLevel &l);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/FText.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FText.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FText.cpp	(revision 21083)
@@ -0,0 +1,249 @@
+/**************************************************************************
+ *
+ * FText.cpp -- File structures for text compression
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "FText.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+BitAddr::BitAddr () {
+  Clear ();  
+}
+
+void BitAddr::Clear () {
+  byte = 0;
+  bit = 0;
+}
+
+bool BitAddr::Read (FILE *f) {
+  return (ReadUL (f, byte) && ReadUC (f, bit));
+}
+
+bool BitAddr::Write (FILE *f) const {
+  return (WriteUL (f, byte) && WriteUC (f, bit));
+}
+
+#define BITADDRLEN (sizeof(unsigned long) + sizeof(unsigned char))
+
+  
+TextLevelInfo::TextLevelInfo () {
+  Clear();
+}
+
+void TextLevelInfo::Clear () {
+  levelTag.erase (levelTag.begin(), levelTag.end());
+  textIdxPtr = 0;
+  numEntries = 0;
+}
+
+bool TextLevelInfo::Read (FILE *f) {
+  return (ReadUCArray (f, levelTag) &&
+	  ReadUL (f, textIdxPtr) &&
+	  ReadUL (f, numEntries));
+}
+
+bool TextLevelInfo::Write (FILE *f) const {
+  return (WriteUCArray (f, levelTag) &&
+	  WriteUL (f, textIdxPtr) &&
+	  WriteUL (f, numEntries));
+}
+
+ostream &operator<<(ostream &s, const TextLevelInfo &l) {
+  s << "  Tag: \"" << l.levelTag << "\"\n"
+    << "  textIdxPtr: " << l.textIdxPtr << "\n"
+    << "  numEntries: " << l.numEntries << "\n\n";
+  
+  return s;
+}
+
+
+FTextLevel::FTextLevel () {
+  Clear();
+}
+
+void FTextLevel::Clear () {
+  levelInfo.erase (levelInfo.begin(), levelInfo.end());
+}
+
+bool FTextLevel::Read (FILE *f) {
+  // read in the array size
+  unsigned long arrSize = 0;
+  if (!ReadVarLenUL (f, arrSize)) return false;
+
+  TextLevelInfo thisLevel;
+  while (arrSize > 0) {
+    // read and insert the next level information
+    if (!thisLevel.Read (f)) return false;
+    levelInfo[thisLevel.levelTag] = thisLevel;
+    
+    arrSize--;
+  }
+
+  return true;
+}
+
+bool FTextLevel::Write (FILE *f) const {
+  // write out the array size
+  if (!WriteVarLenUL (f, levelInfo.size())) return false;
+
+  // write out each level info
+  TextLevelInfoMap::const_iterator here = levelInfo.begin();
+  TextLevelInfoMap::const_iterator end = levelInfo.end();
+  while (here != end) {
+    if (!(*here).second.Write (f)) return false;
+    
+    here++;
+  }
+
+  return true;
+}
+
+ostream &operator<<(ostream &s, const FTextLevel &l) {
+  TextLevelInfoMap::const_iterator here = l.levelInfo.begin ();
+  TextLevelInfoMap::const_iterator end = l.levelInfo.end ();
+  while (here != end) {
+    s << (*here).second;
+    here++;
+  }
+  
+  return s;
+}
+
+
+TextIdx::TextIdx () {
+  Clear ();
+}
+
+void TextIdx::Clear () {
+  start.Clear();
+  end.Clear();
+  which = 0;
+}
+
+#define TEXTIDXLEN (BITADDRLEN*2 + sizeof(char))
+
+bool TextIdx::Read (FILE *f, const TextLevelInfo &levelInfo,
+		    unsigned long docNum) {
+  if (!SeekTextIdx (f, levelInfo, docNum)) return false;
+  return Read (f);
+}
+
+bool TextIdx::Read (FILE *f) {
+  return (start.Read (f) && end.Read (f) && ReadUC (f, which));
+}
+
+bool TextIdx::Write (FILE *f) const {
+  return (start.Write (f) && end.Write (f) && WriteUC (f, which));
+}
+
+ostream &operator<<(ostream &s, const TextIdx &t) {
+  s << "start byte: " << t.start.byte << "\n";
+  s << "start bit:  " << (int)t.start.bit << "\n";
+  s << "end byte:   " << t.end.byte << "\n";
+  s << "end bit:    " << (int)t.end.bit << "\n";
+  s << "which:      " << (int)t.which << "\n\n";
+  
+  return s;
+}
+
+
+bool SeekTextIdx (FILE *f, const TextLevelInfo &levelInfo,
+		  unsigned long docNum) {
+  if (docNum == 0 || docNum > levelInfo.numEntries) return false;
+  
+  unsigned long seekPos = levelInfo.textIdxPtr + (docNum-1) * TEXTIDXLEN;
+  if (fseek (f, seekPos, SEEK_SET) != 0) return false;
+  
+  return true;
+}
+
+
+bool ReadTextIdxArray (FILE *f, TextIdxArray &a, unsigned long arrSize) {
+  // clear the array
+  a.erase (a.begin(), a.end());
+
+  // read in each element
+  TextIdx idx;
+  while (arrSize > 0) {
+    if (!idx.Read(f)) return false;
+    a.push_back (idx);
+    arrSize --;
+  }
+
+  return true;
+}
+
+bool WriteTextIdxArray (FILE *f, const TextIdxArray &a) {
+  TextIdxArray::const_iterator here = a.begin();
+  TextIdxArray::const_iterator end = a.end();
+  while (here != end) {
+    if (!(*here).Write(f)) return false;
+    here++;
+  }
+  
+  return true;
+}
+
+
+CompressTextInfo::CompressTextInfo () {
+  Clear();
+}
+
+void CompressTextInfo::Clear () {
+  ResetStart();
+  docPtrs.erase (docPtrs.begin(), docPtrs.end());
+}
+
+void CompressTextInfo::ResetStart () {
+  inDoc = false;
+  start.Clear();
+  which = 0;
+}
+  
+void CompressTextInfo::SetStart (unsigned long startPos,
+				 unsigned char startBit,
+				 unsigned char startWhich) {
+  // place an imaginary end tag if needed
+  // note: the document tag always needs a closing tag
+  if (inDoc) SetEnd (startPos, startBit);
+
+  // remember start of level
+  inDoc = true;
+  start.byte = startPos;
+  start.bit = startBit;
+  which = startWhich;
+}
+
+void CompressTextInfo::SetEnd (unsigned long endPos,
+			       unsigned char endBit) {
+  if (inDoc) {
+    // add completed entry to list of ptrs
+    TextIdx textIdx;
+    textIdx.start = start;
+    textIdx.end.byte = endPos;
+    textIdx.end.bit = endBit;
+    textIdx.which = which;
+    docPtrs.push_back (textIdx);
+    
+    // reset this entry
+    ResetStart();
+  }
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/FText.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FText.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FText.h	(revision 21083)
@@ -0,0 +1,150 @@
+/**************************************************************************
+ *
+ * FText.h -- File structures for text compression
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef FTEXT_H
+#define FTEXT_H
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+#include <stdio.h>
+#include "UCArray.h"
+
+
+// holds a bit address
+class BitAddr {
+public:
+  unsigned long byte;
+  unsigned char bit;
+
+  BitAddr ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+
+class TextLevelInfo {
+public:
+  UCArray levelTag;
+  unsigned long textIdxPtr;
+  unsigned long numEntries;
+
+  TextLevelInfo ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const TextLevelInfo &l);
+
+
+typedef map<UCArray, TextLevelInfo, LTUCArray> TextLevelInfoMap;
+
+
+class FTextLevel {
+public:
+  TextLevelInfoMap levelInfo;
+  
+  FTextLevel ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const FTextLevel &l);
+
+
+// the text.idx file points into the compressed text
+class TextIdx {
+public:
+  BitAddr start;       // the first bit of the compressed text
+  BitAddr end;         // the first bit past the end of the text
+  unsigned char which; // 0 = non-word, 1 = word
+  
+  TextIdx ();
+  void Clear ();
+
+  // does a seek and reads the appropriate record
+  bool Read (FILE *f, const TextLevelInfo &levelInfo,
+	     unsigned long docNum);
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// stream output for debugging purposes
+ostream &operator<<(ostream &s, const TextIdx &t);
+
+
+// note: document numbers start at 1
+
+bool SeekTextIdx (FILE *f, const TextLevelInfo &levelInfo,
+		  unsigned long docNum);
+
+
+// used to store the pointers while compressing the text
+typedef vector<TextIdx> TextIdxArray;
+
+bool ReadTextIdxArray (FILE *f, TextIdxArray &a, unsigned long arrSize);
+bool WriteTextIdxArray (FILE *f, const TextIdxArray &a);
+
+
+// used to store information about a level while compressing the text
+class CompressTextInfo {
+public:
+  bool inDoc;
+  BitAddr start;
+  unsigned char which;
+  TextIdxArray docPtrs;
+
+  CompressTextInfo ();
+  void Clear ();
+
+  // clears inDoc, start, and which (not the docPtrs)
+  void ResetStart ();
+  
+  // set the start of a level (closing off the last opening
+  // tag if needed)
+  void SetStart (unsigned long startPos,
+		 unsigned char startBit,
+		 unsigned char startWhich);
+
+  // if in a document, it will set the end, add the document to the
+  // list of document ptrs, and then call ResetStart
+  void SetEnd (unsigned long endPos,
+	       unsigned char endBit);
+};
+
+typedef map<UCArray, CompressTextInfo, LTUCArray> CompressTextInfoMap;
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.cpp	(revision 21083)
@@ -0,0 +1,50 @@
+/**************************************************************************
+ *
+ * FileBuf.cpp -- File buffer
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "FileBuf.h"
+#include "sysfuncs.h"
+
+#ifdef __WIN32__
+# include <io.h>
+# define read _read
+#endif
+
+bool FileBuf::NextBuf () {
+  if (fd < 0) return false;
+  int numbytes = read (fd, buf, FILEBUFSIZE);
+  if (numbytes < 0) numbytes = 0;
+  
+  here = buf;
+  end = here + numbytes;
+
+  return (numbytes > 0);
+}
+
+FileBuf::FileBuf () {
+  here = end = buf;
+  fd = -1;
+}
+
+void FileBuf::SetFD (int _fd) {
+  here = end = buf;
+  fd = _fd;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FileBuf.h	(revision 21083)
@@ -0,0 +1,73 @@
+/**************************************************************************
+ *
+ * FileBuf.h -- File buffer
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef FILEBUF_H
+#define FILEBUF_H
+
+#define FILEBUFSIZE 65536
+
+// some elderly windows compilers need to include <vector> (or something
+// similar) here so that they know what a "bool" is
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#else
+#  include <vector>
+#endif
+
+
+class FileBuf {
+protected:
+  unsigned char buf[FILEBUFSIZE];
+  unsigned char *here;
+  unsigned char *end;
+
+  int fd;
+
+  // gets a new buffer if need be, returns true if
+  // more could be got. if true is returned the caller
+  // can assume that here != end
+  bool NextBuf ();
+  
+public:
+  FileBuf ();
+
+  void SetFD (int _fd);
+
+  inline bool Get (unsigned char &c) {
+    if (here != end || NextBuf()) { c = *here++; return true; }
+    return false;
+  }
+  
+  inline bool Peek (unsigned char &c) {
+    if (here != end || NextBuf()) { c = *here; return true; }
+    return false;
+  }
+
+  inline bool Next () {
+    if (here != end || NextBuf()) { here++; return true; }
+    return false;
+  }
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.cpp	(revision 21083)
@@ -0,0 +1,102 @@
+/**************************************************************************
+ *
+ * FragLevelConvert.cpp -- converting between fragment and document numbers
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "FragLevelConvert.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+
+
+FragLevelConvert::FragLevelConvert () {
+  numFrags = 0;
+  numLevelDocs = 0;
+}
+
+bool FragLevelConvert::Read (FILE *invfFile,
+			     unsigned long levelPtr,
+			     unsigned long _numFrags,
+			     unsigned long _numLevelDocs) {
+  levelStarts.erase (levelStarts.begin(), levelStarts.end());
+  numFrags = _numFrags;
+  numLevelDocs = _numLevelDocs;
+
+  // seek to the appropriate place in the inverted file
+  fseek (invfFile, levelPtr, SEEK_SET);
+
+  stdio_bitio_buffer buffer(invfFile);
+  
+  unsigned long pTag = numLevelDocs*2;
+  unsigned long B = BIO_Bblock_Init (numFrags+pTag, pTag);
+  unsigned long fragNum = 0;
+  unsigned long i;
+  for (i=0; i<numLevelDocs; i++) {
+    unsigned long delta = buffer.bblock_decode (B, NULL)-1;
+    fragNum += delta;
+
+    levelStarts.push_back (fragNum);
+
+    // ignore end, assume every fragment is in a level
+    delta = buffer.bblock_decode (B, NULL)-1;
+    fragNum += delta;
+  }
+
+  // fragNum would be the starting fragment of the next document
+  // if there was one
+  levelStarts.push_back (fragNum);
+  
+  buffer.done();
+
+  return true;
+}
+
+bool FragLevelConvert::FragToLevel (unsigned long fragNum,
+				    unsigned long &levelDocNum) const {
+  // do binary search for something containing this fragment number
+  unsigned long low = 1, high = numLevelDocs;
+  unsigned long mid;
+
+  while ((mid = (low+high)/2) >= 1 && low <= high) {
+    if (fragNum > levelStarts[mid]) low = mid+1;
+    else if (fragNum <= levelStarts[mid-1]) high = mid-1;
+    else {
+      levelDocNum = mid;
+      return true;
+    }
+  }
+  return false;
+}
+
+
+bool FragLevelConvert::LevelToLevel (FragLevelConvert sectionLevelConvert,
+		 unsigned long levelNum, unsigned long &DocNum) {
+  
+  if (levelNum==1) {
+    DocNum=1;
+    return true;
+  }
+  unsigned long levelfragnum = sectionLevelConvert.levelStarts[levelNum-1]+1;
+
+  if (FragToLevel(levelfragnum, DocNum)) {
+    return true;
+  } 
+  return false;
+  
+
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/FragLevelConvert.h	(revision 21083)
@@ -0,0 +1,70 @@
+/**************************************************************************
+ *
+ * FragLevelConvert.h -- converting between fragment and document numbers
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef FRAGLEVELCONVERT_H
+#define FRAGLEVELCONVERT_H
+
+#include <stdio.h>
+#include "UCArray.h"
+
+
+/*Notes about levelStarts (kjm18) - this is my interpretation of
+whats going on, feel free to correct this if its wrong.
+
+say you have 5 docs, consisting of fragments:
+1:  1-55
+2: 56-83
+3: 84-106
+4: 107-152
+5: 153-211
+
+then levelStarts would have the values
+0  1  2   3   4   5 
+0  55 83 106 152 211
+
+*/
+class FragLevelConvert {
+protected:
+  // note fragment start is one before before real start
+  vector<unsigned long> levelStarts;
+  unsigned long numFrags;
+  unsigned long numLevelDocs;
+  
+public:
+  FragLevelConvert ();
+
+  bool Read (FILE *invfFile, unsigned long levelPtr,
+	     unsigned long _numFrags, unsigned long _numLevelDocs);
+
+  bool FragToLevel (unsigned long fragNum, unsigned long &levelDocNum) const;
+
+  // this function converts from one level number to another
+  // the FragLevelConvert thats calling the method should be loaded with
+  // the level that you want to convert to, while the sectionLevelConvert
+  // should be loaded with the level converting from.
+  // level Num has the old level, DocNum will be returned with the new
+  // coresponding level
+  bool LevelToLevel (FragLevelConvert sectionLevelConvert,
+		   unsigned long levelNum, unsigned long &DocNum);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.cpp	(revision 21083)
@@ -0,0 +1,251 @@
+/**************************************************************************
+ *
+ * GSDLQueryLex.cpp -- Lexical analyser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "GSDLQueryLex.h"
+#include "unitool.h"
+#include "words.h"
+
+inline void AddNChar (UCArray::const_iterator &here,
+		      UCArray &text,
+		      int len) {
+  while (len > 0) {
+    text.push_back (*here++);
+    len--;
+  }
+}
+
+static bool ParseInteger (UCArray::const_iterator &here,
+			  UCArray::const_iterator end,
+			  LexEl &el) {
+  el.Clear();
+
+  // this version of end is used in unitool
+  //  UCArray::const_iterator endMinus1 = end-1;
+  const unsigned char* endMinus1 = &(*end)-1;
+
+  int charLen;
+  unsigned short c; // one character lookahead
+  charLen = parse_utf8_char (&*here, endMinus1, &c);
+
+  // check for positive or negative
+  bool neg = false;
+  if (c == '+') {
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  } else if (c == '-') {
+    neg = true;
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  }
+
+  // read in number part
+  int numeric=0;
+  el.num = 0;
+  el.lexType = IntegerE;
+  /* stop integers at 4 digits */
+  while (c >= '0' && c <= '9'&& ++numeric<=MAXNUMERIC) {
+    el.num = el.num*10 + c - '0';
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  }
+
+  if (neg) el.num *= -1;
+
+  return (!el.text.empty());
+}
+
+static bool ParsePotentialInteger(UCArray::const_iterator &here,
+				  UCArray::const_iterator end,
+				  LexEl &el) {
+  el.Clear();
+
+  // this version of end is used in unitool
+  //UCArray::const_iterator endMinus1 = end-1;
+  const unsigned char* endMinus1 = &(*end)-1;
+
+  int charLen=0;
+  int length=0;
+  unsigned short c; // one character lookahead
+  charLen = parse_utf8_char (&*here, endMinus1, &c);
+
+  // read in number part
+  int numeric=0;
+  el.num = 0;
+  el.lexType = IntegerE;
+  /* stop integers at 4 digits */
+  while (c >= '0' && c <= '9'&& ++numeric<=MAXNUMERIC) {
+    el.num = el.num*10 + c - '0';
+    AddNChar (here, el.text, charLen);
+    length += charLen;
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  }
+  // check the next character -if it is a letter, then have a term, not an integer
+  if (!is_unicode_letter(c)) {
+    // this was just an integer
+    return (!el.text.empty());
+  }
+  // else its a term
+  el.lexType = TermE;
+  el.num = 0;
+  /* this bit taken from ParseIndexWord in words.h*/
+  while (length+charLen<=MAXSTEMLEN && charLen > 0 &&
+	 (is_unicode_letter(c) || (is_unicode_digit(c) &&
+				   ++numeric <= MAXNUMERIC))) {
+    AddNChar (here, el.text, charLen);
+    length += charLen;
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  }
+
+  return (!el.text.empty());
+}
+static bool ParseTerm (UCArray::const_iterator &here,
+		       UCArray::const_iterator end,
+		       UCArray &text) {
+  //UCArray::const_iterator endMinus1 = end-1;
+  const unsigned char* endMinus1 = &(*end)-1;
+  const unsigned char* new_here = ParseIndexWord (&*here, endMinus1, text);
+  here += (new_here - &*here); // advance iterator by number of chars advanced
+  return !text.empty();
+}
+
+
+bool ParseLexEl (UCArray::const_iterator &here,
+		 UCArray::const_iterator end,
+		 LexEl &el) {
+  el.Clear();
+
+  // strange things can happen if here == end == 0
+  if (here == end) return false;
+  
+  // this version of end is used in unitool
+  //UCArray::const_iterator endMinus1 = end-1;
+  const unsigned char* endMinus1 = &(*end)-1;
+
+  // ignore all white space
+  int charLen;
+  unsigned short c; // one character lookahead
+  charLen = parse_utf8_char (&*here, endMinus1, &c);
+  while (here != end && is_unicode_space (c)) {
+    here += charLen;
+    charLen = parse_utf8_char (&*here, endMinus1, &c);
+  }
+  if (here == end) return false;
+
+  if (c == '(') {
+    el.lexType = OpenBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == ')') {
+    el.lexType = CloseBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+
+  } else if (c =='[') {
+    el.lexType = OpenSquareBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+  
+  } else if (c ==']') {
+    el.lexType = CloseSquareBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+  
+  } else if (c == '\"') {
+    el.lexType = QuoteE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '/') {
+    el.lexType = TermWeightE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '#') {
+    el.lexType = StemMethodE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '^') {
+    el.lexType = RangeE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '@') {
+    el.lexType = AtE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == ':') {
+    el.lexType = TagE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c=='&') {
+    el.lexType = AndOpE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '|') {
+    el.lexType = OrOpE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '!') {
+    el.lexType = NotOpE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '+' || c == '-' ) {
+    return  ParseInteger (here, end, el);
+  }
+
+  else if (c >= '0' && c <= '9') {
+    return ParsePotentialInteger (here, end, el);
+  }
+
+  // assume it is a term of some sort
+  if (!ParseTerm (here, end, el.text)) return false;
+
+  UCArray AND; SetCStr (AND, "AND");
+  if (el.text == AND) {
+    el.lexType = AndOpE;
+    return true;
+  }
+  UCArray OR; SetCStr (OR, "OR");
+  if (el.text == OR) {
+    el.lexType = OrOpE;
+    return true;
+  }
+  UCArray NOT; SetCStr (NOT, "NOT");
+  if (el.text == NOT) {
+    el.lexType = NotOpE;
+    return true;
+  }
+  UCArray NEAR; SetCStr (NEAR, "NEAR");
+  if (PrefixLen(el.text, NEAR)==4) {
+    el.lexType = NearOpE;
+    return true;
+  }
+  el.lexType = TermE;
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryLex.h	(revision 21083)
@@ -0,0 +1,63 @@
+/**************************************************************************
+ *
+ * GSDLQueryLex.h -- Lexical analyser for a simple query language, for GSDL
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef GSDLQUERYLEX_H
+#define GSDLQUERYLEX_H
+
+#include "UCArray.h"
+
+
+// note: white space is ignored
+enum LexType {NoTypeE, OpenBracketE, CloseBracketE, TermE, AndOpE, OrOpE,
+	      NotOpE, NearOpE, QuoteE, IntegerE, TermWeightE, StemMethodE,
+	      RangeE, AtE, TagE, OpenSquareBracketE, CloseSquareBracketE};
+
+struct LexEl {
+  LexType lexType;
+  UCArray text;
+  int num; // for IntegerE
+
+  void Clear () {
+    lexType = NoTypeE;
+    UCArrayClear (text);
+    num = 0;
+  }
+  LexEl () { Clear (); }
+};
+
+
+// returns true if another lexical element could be parsed.
+bool ParseLexEl (UCArray::const_iterator &here,
+		 UCArray::const_iterator end,
+		 LexEl &el);
+
+
+#endif
+
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.cpp	(revision 21083)
@@ -0,0 +1,393 @@
+/**************************************************************************
+ *
+ * QueryParser.cpp -- Query parser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "GSDLQueryParser.h"
+#include "GSDLQueryLex.h"
+
+
+static QueryNode *ParseExpression (UCArray::const_iterator &here,
+				   UCArray::const_iterator end, 
+				   int defaultBoolCOmbine,
+				   int defaultStemMethod);
+
+static QueryNode *AndAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  AndQueryNode *andNode = new AndQueryNode;
+  andNode->leftNode = t1;
+  andNode->rightNode = t2;
+  return andNode;
+}
+
+static QueryNode *OrAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  OrQueryNode *orNode = new OrQueryNode;
+  orNode->leftNode = t1;
+  orNode->rightNode = t2;
+  return orNode;
+}
+
+static QueryNode *NotAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  NotQueryNode *notNode = new NotQueryNode;
+  notNode->queryNode = t1;
+  notNode->notNode = t2;
+  return notNode;
+}
+
+// expects the opening bracket to have already been parsed
+// and discarded
+static QueryNode *ParseBracketExpression (UCArray::const_iterator &here,
+					  UCArray::const_iterator end, 
+					  int defaultBoolCombine,
+					  int defaultStemMethod) {
+  // get everything in the expression
+  QueryNode *curTree = ParseExpression (here, end, defaultBoolCombine,
+					defaultStemMethod);
+  
+  // gobble up tokens until a closing bracket is found
+  // or the end of the string
+  LexEl el;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == CloseBracketE) break;
+  }
+
+  return curTree;
+}
+
+static int ParseInt (UCArray::const_iterator &here,
+		     UCArray::const_iterator end) {
+  LexEl el;
+  UCArray::const_iterator oldHere = here;
+  if (ParseLexEl (here, end, el) && el.lexType == IntegerE)
+    return el.num;
+  
+  here = oldHere; // not an integer
+  return 0;
+}
+
+// default is within 20 words
+static void SetRangeValues (TermNode &termNode,
+			    UCArray &nearby) {
+  UCArray NEARBY; SetCStr(NEARBY, "NEAR");
+  if (nearby == NEARBY) { // no modifier
+    termNode.startRange = -21;
+    termNode.endRange = 20;
+  }
+  else { // extract number
+    UCArray::const_iterator here = nearby.begin()+4;
+    UCArray::const_iterator end = nearby.end();
+    int size=0;
+    while (here != end) {
+      size = size*10 + (*here-'0');
+      here++;
+    }
+    cerr <<"size= "<<size<<endl;
+    termNode.startRange = -1 * (size+1);
+    termNode.endRange = size;
+  }
+}
+
+static unsigned long GetStemMethod(LexEl &el, int defaultStemMethod) {
+  // here expect el to contain some of c,s,i,u
+  // stem method 0 = c,u  00
+  // stem method 1 = i,u  01  - default for DL
+  // stem method 2 = c, s  10
+  // stem method 3 = i,s  11
+
+  unsigned long stem = (unsigned long)defaultStemMethod;
+      
+  UCArray::const_iterator here = el.text.begin();
+  UCArray::const_iterator end = el.text.end();
+
+  unsigned char c1 = *here; 
+  if (!(c1 == 'c'| c1 == 'i' | c1 == 'u' | c1 == 's')) 
+    return 4; // incorrect format
+  
+  here++;
+  unsigned char c2 = 'a';
+  if (here !=end) {
+    c2 = *here;
+    if (!(c2 == 'c'| c2 == 'i' | c2 == 'u' | c2 == 's')) 
+      return 4; // incorrect format
+  }
+  
+  if (c1 == 'i'|| c2=='i') stem |= 1; // set bit 0 to 1
+  if (c1 == 'c' || c2 == 'c') stem &=0xe; //set bit 0 to 0
+  if (c1 == 's'|| c2 == 's') stem |= 2; // set bit 1 to 1
+  if (c1 == 'u' || c2 =='u') stem &=0xd; // set bit 1 to 0
+  cerr << "stem is "<<stem<<endl;
+  return stem;
+}
+  
+
+static void ParseTermModifiers (UCArray::const_iterator &here,
+				UCArray::const_iterator end,
+				TermNode &termNode,
+				int defaultStemMethod) {
+ 
+  termNode.stemMethod = defaultStemMethod;
+
+  LexEl el;
+  UCArray::const_iterator oldHere = here;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TermWeightE) {
+      termNode.termWeight = ParseInt (here, end);
+      
+    } else if (el.lexType == StemMethodE) {
+      oldHere = here;
+      LexEl stem;
+      if (ParseLexEl (here, end, stem) && stem.lexType == TermE) {
+	termNode.stemMethod = GetStemMethod(stem, defaultStemMethod);
+	if (termNode.stemMethod == 4) { // error so backtrack
+	  here = oldHere;
+	  termNode.stemMethod = (unsigned long)defaultStemMethod;
+	} 
+      }else here = oldHere; //ignore - wrong syntax
+
+    } else if (el.lexType == RangeE) {
+      termNode.startRange = ParseInt (here, end);
+      termNode.endRange = ParseInt (here, end);
+      
+    } else if (el.lexType == AtE) {
+      termNode.startRange = termNode.endRange = ParseInt (here, end);
+      
+    } else {
+      // no term modifiers
+      here = oldHere;
+      break;
+    }
+    
+    oldHere = here;
+  }  
+}
+
+static void ParseProxModifiers (UCArray::const_iterator &here,
+				UCArray::const_iterator end,
+				ProxMatchQueryNode *proxNode) {
+  // so far only have one - the tag stuff
+  LexEl el;
+  UCArray::const_iterator oldHere = here;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TagE) {
+      oldHere = here; // don't backtrack past here
+      if (ParseLexEl (here, end, el) && el.lexType == TermE) {
+	proxNode->tagNodePtr = new TagNode;
+	proxNode->tagNodePtr->tagName = el.text;
+	
+      }
+      else { // error in tag
+	here = oldHere;
+      }
+    } // TagE
+    // add in other cases here
+    else {
+      // no modifiers
+      here = oldHere;
+      break;
+    }
+    oldHere = here;
+  }//while
+
+
+}
+
+// expects starting brackets to have been parsed
+static void ParseSquareBrackets(UCArray::const_iterator &here,
+				UCArray::const_iterator end,
+				ProxMatchQueryNode *proxNode,
+				int defaultStemMethod) {
+
+  LexEl el;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TermE || el.lexType == IntegerE) {
+      TermNode termNode;
+      termNode.term = el.text;
+      ParseTermModifiers (here, end, termNode, defaultStemMethod);
+      proxNode->terms.push_back(termNode);
+    }
+    else if (el.lexType == CloseSquareBracketE) {
+      break;
+    }
+    else if (el.lexType == AndOpE) {
+      // ignore, the words are AND'ed anyway
+      cerr << "and inside []\n";
+    }
+    else if (el.lexType == OrOpE) {
+      cerr << "or inside []\n";
+    }
+    else {
+      //error
+      // just ignore for now
+      cerr <<"bad syntax inside []\n";
+    }
+  } // while
+
+}
+// expects the starting quote to have been parsed
+// and discarded
+// now phrases use the case and stem preference options
+// ie can search for a phrase ignoring case
+static void ParsePhrase (UCArray::const_iterator &here,
+			 UCArray::const_iterator end,
+			 ProxMatchQueryNode &proxNode, 
+			 int defaultStemMethod) {
+  LexEl el;
+  bool first = true;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TermE || el.lexType == IntegerE) {
+      TermNode termNode;
+      termNode.term = el.text;
+      termNode.stemMethod = defaultStemMethod;
+      //ParseTermModifiers (here, end, termNode, defaultStemMethod);
+      if (first) {
+	first = false;
+      }
+      else {
+	termNode.startRange = -2;
+	termNode.endRange = -1;
+      }
+      proxNode.terms.push_back (termNode);
+      
+    } else if (el.lexType == QuoteE) {
+      break;
+      
+    } else {
+      // error
+      break;
+    }
+  }
+}
+
+static QueryNode *ParseTerm (UCArray::const_iterator &here,
+			     UCArray::const_iterator end,
+			     int defaultBoolCombine,
+			     int defaultStemMethod) {
+  LexEl el;
+
+  UCArray::const_iterator oldHere = here;
+  if (!ParseLexEl (here, end, el)) return NULL;
+
+  if (el.lexType == OpenBracketE)
+    return ParseBracketExpression (here, end, defaultBoolCombine,
+				   defaultStemMethod);
+
+  ProxMatchQueryNode *proxNode = new ProxMatchQueryNode;
+
+  if (el.lexType == TermE || el.lexType == IntegerE) {
+    TermNode termNode;
+    termNode.term = el.text;
+    ParseTermModifiers (here, end, termNode, defaultStemMethod);
+    oldHere = here;  // dont backtrack past here
+    if (ParseLexEl(here, end, el) && el.lexType == NearOpE) {
+      delete proxNode;
+      proxNode = (ProxMatchQueryNode *)ParseTerm(here, end, defaultBoolCombine,
+						 defaultStemMethod);
+      SetRangeValues(termNode, el.text);
+      proxNode->terms.push_back (termNode);
+      return proxNode;
+    }
+    else {
+      here = oldHere; // backtrack
+      proxNode->terms.push_back (termNode);
+      ParseProxModifiers(here, end, proxNode);
+      return proxNode;
+    }
+  } else if (el.lexType == QuoteE) {
+    ParsePhrase (here, end, *proxNode, defaultStemMethod);
+    return proxNode;
+  }
+  else if (el.lexType == OpenSquareBracketE) {
+    ParseSquareBrackets (here, end, proxNode, defaultStemMethod);
+    ParseProxModifiers (here, end, proxNode);
+    return proxNode;
+  }
+
+  // not a term
+  here = oldHere;
+  delete proxNode;
+  return NULL;
+}
+
+
+static QueryNode *ParseExpression (UCArray::const_iterator &here,
+				   UCArray::const_iterator end,
+				   int defaultBoolCombine,
+				   int defaultStemMethod) {
+  LexEl el;
+  QueryNode *curTree = NULL;
+
+  UCArray::const_iterator oldHere = here;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == OpenSquareBracketE ||
+	el.lexType == OpenBracketE ||
+	el.lexType == TermE ||
+	el.lexType == QuoteE ||
+	el.lexType == IntegerE ) {
+	//	el.lexType == TagE) { //tag at end of term now
+      // some type of term, back track and parse it
+      here = oldHere;
+      // if default==1, AND, else if==0, OR
+      if (defaultBoolCombine) {
+	curTree = AndAdd (curTree, ParseTerm (here, end, defaultBoolCombine, 
+					      defaultStemMethod));
+      }
+      else {
+	curTree = OrAdd (curTree, ParseTerm (here, end, defaultBoolCombine,
+					     defaultStemMethod));
+      }
+
+    } else if (el.lexType == AndOpE) {
+      curTree = AndAdd (curTree, ParseTerm (here, end, defaultBoolCombine,
+					    defaultStemMethod));
+      
+    } else if (el.lexType == OrOpE) {
+      curTree = OrAdd (curTree, ParseTerm (here, end, defaultBoolCombine,
+					   defaultStemMethod));
+      
+    } else if (el.lexType == NotOpE) {
+      curTree = NotAdd (curTree, ParseTerm (here, end, defaultBoolCombine,
+					    defaultStemMethod));
+      
+    } else if (el.lexType == CloseBracketE) {
+      // parsebracketexpression is waiting for the last bracket, so put it back
+      here = oldHere;
+      break;
+    
+    } else break;
+    
+    oldHere = here;
+  }
+
+  return curTree;
+}
+
+QueryNode *ParseQuery (const UCArray &queryStr, int defaultBoolCombine,
+		       int defaultStemMethod) {
+  UCArray::const_iterator here = queryStr.begin();
+  UCArray::const_iterator end = queryStr.end();
+  return ParseExpression (here, end, defaultBoolCombine, defaultStemMethod);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/GSDLQueryParser.h	(revision 21083)
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * QueryParser.h -- Query parser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef GSDLQUERYPARSER_H
+#define GSDLQUERYPARSER_H
+
+#include "UCArray.h"
+#include "MGQuery.h"
+
+// returns NULL if the query could not be parsed
+// defaultBoolCOmbine determines if individual terms are combined using
+// AND or OR in the absence of specified operators.
+// defaultStemMethod used to set stemming and casefolding for terms where
+// its not set explicitly in the query string. THe defaultStemMethod value
+// should be set using the values from the preferences page
+QueryNode *ParseQuery (const UCArray &queryStr, int defaultBoolCombine,
+		       int defaultStemMethod);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/IndexData.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/IndexData.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/IndexData.cpp	(revision 21083)
@@ -0,0 +1,207 @@
+/**************************************************************************
+ *
+ * IndexData.cpp -- Information needed for querying
+ * Copyright (C) 1999 Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "IndexData.h"
+#include "string.h"
+#include "mg_files.h"
+
+IndexData::IndexData () {
+  basePath[0] = '\0';
+  filename[0] = '\0';
+
+  dictFile = NULL;
+
+  stem1File = NULL;
+  stem2File = NULL;
+  stem3File = NULL;
+
+  invfFile = NULL;
+
+  approxWeightsFile = NULL;
+  exactWeightsFile = NULL;
+
+  curLevelNum = 0;
+}
+
+IndexData::~IndexData () {
+  UnloadData ();
+}
+
+bool IndexData::LoadData (const char *_basePath, const char *_filename) {
+  if (_filename[0] == '\0') return false;
+  
+  // make sure this data has not already been loaded
+  if (strcmp (_basePath, basePath) == 0 &&
+      strcmp (_filename, filename) == 0) return true;
+  
+  // make sure there is nothing else loaded
+  UnloadData ();
+
+  strcpy (basePath, _basePath);
+  strcpy (filename, _filename);
+
+  set_basepath (basePath);
+
+  // load in the level information
+  FILE *ivfLevelFile;
+  ivfLevelFile = open_file (filename, INVF_LEVEL_SUFFIX, "rb",
+			    MAGIC_INVF_LEVELS, MG_ABORT);
+  levels.Read (ivfLevelFile);
+  fclose (ivfLevelFile);
+
+  // blocked dictionary
+  dictFile = open_file (filename, INVF_DICT_BLOCKED_SUFFIX, "rb",
+			MAGIC_STEM, MG_ABORT);
+  if (!bdh.Read (dictFile)) { UnloadData (); return false; }
+
+  fseek (dictFile, bdh.wblk_idx_start, SEEK_SET);
+  if (!ReadBlockIdx (dictFile, biWords)) { UnloadData (); return false; }
+
+  fseek (dictFile, bdh.tblk_idx_start, SEEK_SET);
+  if (!ReadBlockIdx (dictFile, biTags)) { UnloadData (); return false; }
+
+  // blocked stem index 1
+  stem1File = open_file (filename, INVF_DICT_BLOCKED_1_SUFFIX,
+			 "rb", MAGIC_STEM_1, MG_ABORT);
+  if (!sih1.Read (stem1File)) { UnloadData (); return false; }
+
+  fseek (stem1File, sih1.block_idx_start, SEEK_SET);
+  if (!ReadBlockIdx (stem1File, sii1)) { UnloadData (); return false; }
+  
+  // blocked stem index 2
+  stem2File = open_file (filename, INVF_DICT_BLOCKED_2_SUFFIX,
+			 "rb", MAGIC_STEM_2, MG_ABORT);
+  if (!sih2.Read (stem2File)) { UnloadData (); return false; }
+
+  fseek (stem2File, sih2.block_idx_start, SEEK_SET);
+  if (!ReadBlockIdx (stem2File, sii2)) { UnloadData (); return false; }
+  
+  // blocked stem index 3
+  stem3File = open_file (filename, INVF_DICT_BLOCKED_3_SUFFIX,
+			 "rb", MAGIC_STEM_3, MG_ABORT);
+  if (!sih3.Read (stem3File)) { UnloadData (); return false; }
+
+  fseek (stem3File, sih3.block_idx_start, SEEK_SET);
+  if (!ReadBlockIdx (stem3File, sii3)) { UnloadData (); return false; }
+
+  // inverted file
+  invfFile = open_file (filename, INVF_SUFFIX, "rb",
+			MAGIC_INVF, MG_ABORT);
+  ifh.Read (invfFile);
+
+  // weights
+  approxWeightsFile = open_file (filename, APPROX_WEIGHTS_SUFFIX, "rb",
+				 MAGIC_WGHT_APPROX, MG_ABORT);
+  exactWeightsFile = open_file (filename, WEIGHTS_SUFFIX, "rb",
+				MAGIC_WGHT, MG_ABORT);
+
+  return true;
+}
+
+bool IndexData::UnloadData () {
+  basePath[0] = '\0';
+  filename[0] = '\0';
+
+  if (dictFile != NULL) {
+    fclose (dictFile); dictFile = NULL;
+  }
+
+  if (stem1File != NULL) {
+    fclose (stem1File); stem1File = NULL;
+  }
+  if (stem2File != NULL) {
+    fclose (stem2File); stem2File = NULL;
+  }
+  if (stem3File != NULL) {
+    fclose (stem3File); stem3File = NULL;
+  }
+
+  if (invfFile != NULL) {
+    fclose (invfFile); invfFile = NULL;
+  }
+
+  if (approxWeightsFile != NULL) {
+    fclose (approxWeightsFile); approxWeightsFile = NULL;
+  }
+  if (exactWeightsFile != NULL) {
+    fclose (exactWeightsFile); exactWeightsFile = NULL;
+  }
+
+  UnloadLevel();
+  
+  return true;
+}
+
+
+bool IndexData::LoadLevel (const UCArray &level) {
+  // make sure this level is not already loaded
+  if (level == curLevel) return true;
+
+  // unload any levels currently loaded
+  UnloadLevel();
+
+  // make sure the required files are open
+  if (dictFile == NULL || invfFile == NULL ||
+      approxWeightsFile == NULL || exactWeightsFile == NULL)
+    return false;
+  
+  // read in the information from the dictionary
+  block_dict_el tagEl;
+  unsigned long tagElNum;
+  if (!SearchBlockDictEl (dictFile, biTags, bdh.entries_per_tblk,
+			  bdh.tag_dict_size, level, tagEl, tagElNum))
+    return false;
+
+  // read in the level conversion information
+  if (!levelConverter.Read (invfFile, tagEl.invf_ptr,
+			    bdh.num_frags, tagEl.frag_occur))
+    return false;
+
+  // read in the approximate weights
+  if (!weightData.Read (approxWeightsFile,
+			levels.levelInfo[level].approxWeightsDiskPtr,
+			levels.levelInfo[level].numEntries))
+    return false;
+  
+  // find the level number
+  curLevelNum = 0;
+  IvfLevelInfoMap::const_iterator levelHere, levelEnd;
+  for (levelHere=levels.levelInfo.begin(), levelEnd=levels.levelInfo.end();
+       levelHere!=levelEnd && (*levelHere).first != level; levelHere++)
+    curLevelNum++;
+
+  // make sure we found the level
+  if (levelHere == levelEnd) return false;
+
+  curLevel = level;
+
+  return true;
+}
+
+bool IndexData::UnloadLevel () {
+  curLevel.erase (curLevel.begin(), curLevel.end());
+  curLevelNum = 0;
+  
+  weightData.Free ();
+    
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/IndexData.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/IndexData.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/IndexData.h	(revision 21083)
@@ -0,0 +1,82 @@
+/**************************************************************************
+ *
+ * IndexData.h -- Information needed for querying
+ * Copyright (C) 1999 Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef INDEXDATA_H
+#define INDEXDATA_H
+
+#include <stdio.h>
+#include "invf.h"
+#include "FIvfLevelInfo.h"
+#include "FragLevelConvert.h"
+#include "Weights.h"
+
+
+class IndexData {
+public:
+  // general information
+  char basePath[512];
+  char filename[512];
+  FIvfLevel levels;
+  
+  // blocked dictionary
+  FILE *dictFile;
+  block_dict_header bdh;
+  block_idx biWords;
+  block_idx biTags;
+
+  // stem indexes
+  FILE *stem1File;
+  FILE *stem2File;
+  FILE *stem3File;
+  stem_idx_header sih1;
+  stem_idx_header sih2;
+  stem_idx_header sih3;
+  block_idx sii1;
+  block_idx sii2;
+  block_idx sii3;
+
+  // inverted file
+  FILE *invfFile;
+  invf_file_header ifh;
+
+  // weights
+  FILE *approxWeightsFile;
+  FILE *exactWeightsFile;
+
+  // level specific information
+  UCArray curLevel; // last level that was loaded
+  unsigned long curLevelNum;
+  FragLevelConvert levelConverter;
+  ApproxWeightsData weightData;
+  
+  IndexData ();
+  ~IndexData ();
+
+  // LoadData will only load the data if it has not been loaded before
+  bool LoadData (const char *_basePath, const char *_filename);
+  bool UnloadData ();
+
+  bool LoadLevel (const UCArray &level);
+  bool UnloadLevel ();
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.cpp	(revision 21083)
@@ -0,0 +1,760 @@
+/**************************************************************************
+ *
+ * MGQuery.cpp -- Query related functions
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "MGQuery.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include "Terms.h"
+#include "QueryResultsSort.h"
+#include <assert.h>
+
+
+void PrintIndent (ostream &s, int indent) {
+  while (indent-- > 0) s << " ";
+}
+
+
+void PrintIndentText (ostream &s, char *text, int indent) {
+  PrintIndent (s, indent);
+  s << text;
+}
+
+void PrintNode (ostream &s, QueryNode *node, int indent) {
+  if (node == NULL) {
+    PrintIndentText (s, "NULL\n", indent);
+  } else {
+    node->Print (s, indent+2);
+  }
+}
+
+  
+
+QueryNode::QueryNode () {
+}
+
+QueryNode::~QueryNode () {
+}
+
+void QueryNode::Calculate (IndexData &/*indexData*/,
+			   const QueryInfo &/*queryInfo*/,
+			   QueryResult &result) const {
+  result.Clear();
+}
+
+void QueryNode::Free () {
+}
+
+void QueryNode::Print (ostream &/*s*/, int /*indent*/) const {
+}
+
+
+
+AndQueryNode::AndQueryNode () {
+  leftNode = NULL;
+  rightNode = NULL;
+}
+
+AndQueryNode::~AndQueryNode () {
+  Free ();
+}
+
+void AndQueryNode::Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+			      QueryResult &result) const {
+  result.Clear();
+
+  // an And between nothing and something is nothing...
+  if (leftNode == NULL || rightNode == NULL) return;
+  
+  // calculate the result from the left tree and the result
+  // from the right tree
+  QueryResult rightResult;
+  leftNode->Calculate (indexData, queryInfo, result);
+  rightNode->Calculate (indexData, queryInfo, rightResult);
+
+  // merge the results, this can be done in place as the results
+  // will always shrink with an And
+
+  bool haveAccum = (queryInfo.sortByRank || queryInfo.needRankInfo);
+  if (haveAccum && (result.ranks.size() != result.docs.size() ||
+		    rightResult.ranks.size() != rightResult.docs.size())) {
+    // shouldn't ever get here
+    haveAccum = false;
+    assert (0);
+  }
+
+  // combine document numbers and corresponding ranks
+  unsigned long leftI = 0;
+  unsigned long rightI = 0;
+  unsigned long outI = 0;
+  while (leftI < result.docs.size() &&
+	 rightI < rightResult.docs.size()) {
+    if (result.docs[leftI] < rightResult.docs[rightI]) {
+      leftI++;
+    } else if (result.docs[leftI] > rightResult.docs[rightI]) {
+      rightI++;
+    } else {
+      // the documents are equal
+      result.docs[outI] = result.docs[leftI];
+      if (haveAccum)
+	result.ranks[outI] = result.ranks[leftI] + rightResult.ranks[rightI];
+      leftI++;
+      rightI++;
+      outI++;
+    }
+  }
+
+  // erase unused document numbers and ranks
+  result.docs.erase(result.docs.begin()+outI, result.docs.end());
+  if (haveAccum)
+    result.ranks.erase(result.ranks.begin()+outI, result.ranks.end());
+    
+  // combine term frequency information
+  if (queryInfo.needTermFreqs)
+    result.termFreqs.insert (result.termFreqs.end(),
+			     rightResult.termFreqs.begin(),
+			     rightResult.termFreqs.end());
+}
+
+void AndQueryNode::Free () {
+  if (leftNode != NULL) {
+    delete leftNode;
+    leftNode = NULL;
+  }
+  if (rightNode != NULL) {
+    delete rightNode;
+    rightNode = NULL;
+  }
+}
+
+void AndQueryNode::Print (ostream &s, int indent) const {
+  PrintIndentText (s, "leftNode:\n", indent);
+  PrintNode (s, leftNode, indent+2);
+  PrintIndentText (s, "AND\n", indent);
+  PrintIndentText (s, "rightNode:\n", indent);
+  PrintNode (s, rightNode, indent+2);
+}
+
+
+OrQueryNode::OrQueryNode () {
+  leftNode = NULL;
+  rightNode = NULL;
+}
+
+OrQueryNode::~OrQueryNode () {
+  Free ();
+}
+
+void OrQueryNode::Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+			      QueryResult &result) const {
+  result.Clear();
+  
+  // calculate the result from the left tree and the result
+  // from the right tree
+  QueryResult leftResult;
+  QueryResult rightResult;
+  if (leftNode != NULL)
+    leftNode->Calculate (indexData, queryInfo, leftResult);
+  if (rightNode != NULL)
+    rightNode->Calculate (indexData, queryInfo, rightResult);
+
+  // merge the results
+  
+  bool haveAccum = (queryInfo.sortByRank || queryInfo.needRankInfo);
+  if (haveAccum && (leftResult.ranks.size() != leftResult.docs.size() ||
+		    rightResult.ranks.size() != rightResult.docs.size())) {
+    // shouldn't ever get here
+    haveAccum = false;
+    assert (0);
+  }
+
+  // combine document numbers and corresponding ranks
+  unsigned long leftSize = leftResult.docs.size();
+  unsigned long rightSize = rightResult.docs.size();
+  unsigned long leftI = 0;
+  unsigned long rightI = 0;
+  unsigned long leftDocNum = 0;
+  unsigned long rightDocNum = 0;
+  while (leftI < leftSize || rightI < rightSize) {
+    // check leftI
+    if (leftI < leftResult.docs.size())
+      leftDocNum = leftResult.docs[leftI];
+    else leftDocNum = ULONG_MAX;
+    
+    // check rightI
+    if (rightI < rightResult.docs.size())
+      rightDocNum = rightResult.docs[rightI];
+    else rightDocNum = ULONG_MAX;
+    
+    // combine
+    if (leftDocNum < rightDocNum) {
+      result.docs.push_back (leftDocNum);
+      if (haveAccum)
+	result.ranks.push_back (leftResult.ranks[leftI]);
+      leftI++;
+      
+    } else if (leftDocNum > rightDocNum) {
+      result.docs.push_back (rightDocNum);
+      if (haveAccum)
+	result.ranks.push_back (rightResult.ranks[rightI]);
+      rightI++;
+      
+    } else { // equal
+      result.docs.push_back (leftDocNum);
+      if (haveAccum)
+	result.ranks.push_back (leftResult.ranks[leftI] +
+				rightResult.ranks[rightI]);
+      leftI++;
+      rightI++;
+    }
+  }
+
+  // combine term frequency information
+  if (queryInfo.needTermFreqs) {
+    result.termFreqs.insert (result.termFreqs.end(),
+			     leftResult.termFreqs.begin(),
+			     leftResult.termFreqs.end());
+    result.termFreqs.insert (result.termFreqs.end(),
+			     rightResult.termFreqs.begin(),
+			     rightResult.termFreqs.end());
+  }
+}
+
+void OrQueryNode::Free () {
+  if (leftNode != NULL) {
+    delete leftNode;
+    leftNode = NULL;
+  }
+  if (rightNode != NULL) {
+    delete rightNode;
+    rightNode = NULL;
+  }
+}
+
+void OrQueryNode::Print (ostream &s, int indent) const {
+  PrintIndentText (s, "leftNode:\n", indent);
+  PrintNode (s, leftNode, indent+2);
+  PrintIndentText (s, "OR\n", indent);
+  PrintIndentText (s, "rightNode:\n", indent);
+  PrintNode (s, rightNode, indent+2);
+}
+
+
+
+NotQueryNode::NotQueryNode () {
+  queryNode = NULL;
+  notNode = NULL;
+}
+
+NotQueryNode::~NotQueryNode () {
+  Free ();
+}
+
+void NotQueryNode::Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+			      QueryResult &result) const {
+  result.Clear();
+
+  // check for nothing
+  if (queryNode == NULL) return;
+  if (notNode == NULL) {
+    queryNode->Calculate (indexData, queryInfo, result);
+    return;
+  }
+  
+  // calculate the result from the query tree and the result
+  // from the not tree
+  QueryResult notResult;
+  queryNode->Calculate (indexData, queryInfo, result);
+  notNode->Calculate (indexData, queryInfo, notResult);
+
+  // merge the results, this can be done in place as the results
+  // will always shrink with a Not
+
+  bool haveAccum = (queryInfo.sortByRank || queryInfo.needRankInfo);
+  if (haveAccum && (result.ranks.size() != result.docs.size() ||
+		    notResult.ranks.size() != notResult.docs.size())) {
+    // shouldn't ever get here
+    haveAccum = false;
+    assert (0);
+  }
+
+  // combine document numbers and corresponding ranks
+  unsigned long queryI = 0;
+  unsigned long notI = 0;
+  unsigned long outI = 0;
+  while (queryI < result.docs.size() &&
+	 notI < notResult.docs.size()) {
+    if (result.docs[queryI] < notResult.docs[notI]) {
+      // found a document not in the notResults
+      result.docs[outI] = result.docs[queryI];
+      if (haveAccum)
+	result.ranks[outI] = result.ranks[queryI];
+      queryI++;
+      outI++;
+    } else if (result.docs[queryI] > notResult.docs[notI]) {
+      notI++;
+    } else {
+      // the documents are equal, ignore both
+      queryI++;
+      notI++;
+    }
+  }
+
+  // erase unused document numbers and ranks
+  result.docs.erase(result.docs.begin()+outI, result.docs.end());
+  if (haveAccum)
+    result.ranks.erase(result.ranks.begin()+outI, result.ranks.end());
+  
+  // combine term frequency information
+  if (queryInfo.needTermFreqs)
+    result.termFreqs.insert (result.termFreqs.end(),
+			     notResult.termFreqs.begin(),
+			     notResult.termFreqs.end());
+}
+
+void NotQueryNode::Free () {
+  if (queryNode != NULL) {
+    delete queryNode;
+    queryNode = NULL;
+  }
+  if (notNode != NULL) {
+    delete notNode;
+    notNode = NULL;
+  }
+}
+
+void NotQueryNode::Print (ostream &s, int indent) const {
+  PrintIndentText (s, "queryNode:\n", indent);
+  PrintNode (s, queryNode, indent+2);
+  PrintIndentText (s, "NOT\n", indent);
+  PrintIndentText (s, "notNode:\n", indent);
+  PrintNode (s, notNode, indent+2);
+}
+
+
+void TagNode::Clear () {
+  UCArrayClear (tagName);
+}
+
+void TagNode::Calculate (IndexData &indexData,
+			 FragRangeArray &fragRange) const {
+  fragRange.erase (fragRange.begin(), fragRange.end());
+  if (tagName.empty()) return;
+
+  // get information about this tag
+  block_dict_el tagEl;
+  unsigned long tagElNum;
+  if (!SearchBlockDictEl (indexData.dictFile, indexData.biTags,
+			  indexData.bdh.entries_per_tblk,
+			  indexData.bdh.tag_dict_size,
+			  tagName, tagEl, tagElNum))
+    return;
+
+  // seek to the appropriate place in the inverted file
+  fseek (indexData.invfFile, tagEl.invf_ptr, SEEK_SET);
+
+  stdio_bitio_buffer buffer(indexData.invfFile);
+  
+  unsigned long pTag = tagEl.frag_occur*2;
+  unsigned long B = BIO_Bblock_Init (indexData.bdh.num_frags+pTag, pTag);
+  unsigned long fragNum = 0;
+  unsigned long i;
+  FragRange thisFrag;
+  for (i=0; i<tagEl.frag_occur; i++) {
+    // get start
+    unsigned long delta = buffer.bblock_decode (B, NULL)-1;
+    fragNum += delta;
+
+    thisFrag.rangeStart = fragNum;
+
+    // get end
+    delta = buffer.bblock_decode (B, NULL)-1;
+    fragNum += delta;
+
+    thisFrag.rangeEnd = fragNum;
+    fragRange.push_back (thisFrag);
+  }
+
+  buffer.done();
+}
+
+void TagNode::Free () {
+  Clear ();
+}
+
+void TagNode::Print (ostream &s, int indent) const {
+  PrintIndent (s, indent);
+  s << "TAG: \"" << tagName << "\"\n";
+}
+
+
+void TermNode::Clear () {
+  UCArrayClear (term);
+  termWeight = 1;
+  stemMethod = 0;
+  startRange = NO_TERM_RANGE_START;
+  endRange = NO_TERM_RANGE_END;
+}
+
+TermNode::TermNode () {
+  Clear ();
+}
+
+void TermNode::Calculate (IndexData &indexData,
+			  bool needFragFreqs,
+			  FragRangeArray *fragLimits,
+			  FragData &fragData,
+			  UCArrayVector &equivTerms) const {
+  fragData.Clear ();
+  equivTerms.erase(equivTerms.begin(), equivTerms.end());
+
+  // get a list of term numbers
+  vector<unsigned long> equivNums;
+  FindWordNumbers (indexData, term, stemMethod, equivNums);
+
+  // get the information for each word and merge it with
+  // previous results
+  FragData tempFragData1;
+  FragData tempFragData2;
+  UCArray equivWord;
+  vector<unsigned long>::iterator here = equivNums.begin();
+  vector<unsigned long>::iterator end = equivNums.end();
+  while (here != end) {
+    // get the information for this word
+    ReadTermFragData (indexData, needFragFreqs, *here,
+		      tempFragData1, fragLimits, equivWord);
+    equivTerms.push_back(equivWord);
+    // combine with last results
+    tempFragData2 = fragData;
+    CombineFragData (needFragFreqs, tempFragData1, tempFragData2, fragData);
+    
+    here++;
+  }
+}
+
+void TermNode::Free () {
+  Clear ();
+}
+
+void TermNode::Print (ostream &s, int indent) const {
+  PrintIndent (s, indent);
+  s << "TERM: \"" << term << "\"\n";
+  PrintIndent (s, indent+2);
+  s << "termWeight: " << termWeight << "\n";
+  PrintIndent (s, indent+2);
+  s << "stemMethod: " << stemMethod << "\n";
+  PrintIndent (s, indent+2);
+  s << "startRange: " << startRange << "\n";
+  PrintIndent (s, indent+2);
+  s << "endRange: " << endRange << "\n";
+}
+
+
+ProxMatchQueryNode::ProxMatchQueryNode () {
+  tagNodePtr = NULL;
+}
+
+ProxMatchQueryNode::~ProxMatchQueryNode () {
+  Free ();
+}
+
+void ProxMatchQueryNode::Calculate (IndexData &indexData,
+				    const QueryInfo &queryInfo,
+				    QueryResult &result) const {
+  result.Clear ();
+
+  bool needFragFreqs = (queryInfo.sortByRank || queryInfo.needRankInfo);
+
+  // read in the tag if needed
+  FragRangeArray fragLimits;
+  FragRangeArray *fragLimitsPtr = NULL;
+  if (tagNodePtr == NULL && terms.size() > 1) {
+    // multiple terms must be compared relative to some tag
+    // otherwise phrase matches could span documents
+    TagNode tempTagNode;
+    tempTagNode.tagName = indexData.curLevel;
+    tempTagNode.Calculate (indexData, fragLimits);
+    fragLimitsPtr = &fragLimits;
+    
+  } else if (tagNodePtr != NULL) {
+    (*tagNodePtr).Calculate (indexData, fragLimits);
+    fragLimitsPtr = &fragLimits;
+  }
+
+  UCArray tagOrLevel = indexData.curLevel;
+  if (tagNodePtr != NULL) tagOrLevel = (*tagNodePtr).tagName;
+
+  // read in the first term
+  FragData termData;
+  UCArrayVector equivTerms;
+  TermNodeArray::const_iterator termHere=terms.begin(), termEnd = terms.end();
+  if (termHere != termEnd) {
+    (*termHere).Calculate (indexData, needFragFreqs, fragLimitsPtr, 
+			   termData, equivTerms);
+
+    // convert initial fragment information
+    FragsToQueryResult (indexData,
+			queryInfo,
+			termData,
+			tagOrLevel,
+			(*termHere).term,
+			(*termHere).stemMethod,
+			(*termHere).termWeight,
+			equivTerms,
+			result);
+  
+    termHere++;
+
+    if (termHere == termEnd) return; // nothing more to do
+  }
+
+  // read and combine the rest of the terms
+  FragData comTermData;
+  while (termHere != termEnd) {
+    (*termHere).Calculate (indexData, needFragFreqs,
+			   fragLimitsPtr, comTermData, equivTerms);
+
+    AndFragsToQueryResult (indexData,
+			   queryInfo,
+			   comTermData,
+			   tagOrLevel,
+			   (*termHere).term,
+			   (*termHere).stemMethod,
+			   (*termHere).termWeight,
+			   equivTerms,
+			   result);
+    
+    AndCombineFragData (needFragFreqs, termData, comTermData,
+			(*termHere).startRange,
+			(*termHere).endRange,
+			fragLimitsPtr);
+    termHere++;
+  }
+
+  // remove unwanted document numbers
+  RemoveUnwantedResults (indexData,
+			 queryInfo,
+			 termData,
+			 result);
+}
+
+void ProxMatchQueryNode::Free () {
+  if (tagNodePtr != NULL) {
+    delete tagNodePtr;
+    tagNodePtr = NULL;
+  }
+  terms.erase (terms.begin(), terms.end());
+}
+
+void ProxMatchQueryNode::Print (ostream &s, int indent) const {
+  PrintIndentText (s, "PROXMATCH\n", indent);
+  if (tagNodePtr != NULL) tagNodePtr->Print (s, indent+2);
+  
+  TermNodeArray::const_iterator here = terms.begin();
+  TermNodeArray::const_iterator end = terms.end();
+  while (here != end) {
+    (*here).Print (s, indent+2);
+    here++;
+  }
+}
+
+
+void BrowseQueryNode::Clear () {
+  UCArrayClear(term);
+}
+
+void BrowseQueryNode::Calculate (IndexData &indexData, BrowseQueryResult &result) const {
+
+  unsigned long number=0;
+  FindNearestWordNumber(indexData, term, number);
+  if (number + startPosition > 0 ) {
+    number = number+startPosition;
+  }
+  else {
+    number = 1;
+  }
+
+  GetTermList (indexData, number, numTerms, result.termFreqs);
+
+}
+
+
+
+void BrowseQueryNode::Free () {
+  Clear();
+}
+
+
+void BrowseQueryNode::Print (ostream &s, int indent) const {
+  PrintIndentText(s, "BROWSEQUERYNODE\n", indent);
+  PrintIndent (s, indent+2);
+  s << "TERM:"<<term<<"\n";
+  PrintIndent (s, indent+2);
+  s << "Start position: "<< startPosition<<", Num terms: "<< numTerms<<"\n";
+
+
+}
+
+
+
+void MGQuery (IndexData &indexData,
+	      const QueryInfo &queryInfo,
+	      const QueryNode *queryTree,
+	      QueryResult &result) {
+  result.Clear ();
+
+  // make sure level is current
+  if (!indexData.LoadLevel (queryInfo.docLevel)) {
+    return;
+  }
+  // do query
+  if (queryTree == NULL) return;
+  
+  (*queryTree).Calculate (indexData, queryInfo, result);
+
+  // make weights into ranks if needed
+  unsigned long i;
+  if (queryInfo.sortByRank || queryInfo.needRankInfo) {
+    for (i=0; i<result.ranks.size(); i++) {
+      result.ranks[i] /=
+	indexData.weightData.GetLowerApproxDocWeight (result.docs[i]);
+    }
+  }
+  
+  unsigned long resultsSize = queryInfo.maxDocs;
+  if (resultsSize == 0 || resultsSize > result.docs.size())
+    resultsSize = result.docs.size();
+
+  result.actualNumDocs = result.docs.size(); // the total number of docs 
+                                   //returned, before pruning based on maxDocs
+
+  // sort results by rank if needed
+  GTRank gtRank;
+  if (queryInfo.sortByRank) {
+    // need in ascending order for SelectAddHeap
+    MakeHeap (result.docs.begin(), result.ranks.begin(),
+	      resultsSize, gtRank);
+    SelectAddHeap (result.docs.begin(), result.ranks.begin(), resultsSize,
+		   result.docs.begin()+resultsSize,
+		   result.ranks.begin()+resultsSize,
+		   (unsigned long) result.ranks.size()-resultsSize,
+		   gtRank);
+
+    // sort into descending order
+    SortHeap (result.docs.begin(), result.ranks.begin(), resultsSize, gtRank);
+  }
+  
+  // get exact weights if needed
+  if (queryInfo.exactWeights &&
+      (queryInfo.sortByRank || queryInfo.needRankInfo)) {
+    unsigned long exactDiskPtr =
+      indexData.levels.levelInfo[indexData.curLevel].exactWeightsDiskPtr;
+    
+    for (i=0; i<resultsSize; i++) {
+      result.ranks[i] =  result.ranks[i] *
+	indexData.weightData.GetLowerApproxDocWeight (result.docs[i]) /
+	GetExactDocWeight (indexData.exactWeightsFile, exactDiskPtr,
+			   result.docs[i]);
+    }
+
+    // re-sort top candidates based on exact weights
+    if (queryInfo.sortByRank) {
+      MakeHeap (result.docs.begin(), result.ranks.begin(),
+		resultsSize, gtRank);
+      SortHeap (result.docs.begin(), result.ranks.begin(),
+		resultsSize, gtRank);
+    }
+  }
+
+  // get rid of unwanted ranking results
+  if (result.ranks.empty()) {
+    // do nothing
+  } else if (!queryInfo.needRankInfo) {
+    result.ranks.erase(result.ranks.begin(), result.ranks.end());
+  } else {
+    result.ranks.erase(result.ranks.begin()+resultsSize, result.ranks.end());
+  }
+
+  // remove extra docs that are unwanted
+  result.docs.erase(result.docs.begin()+resultsSize, result.docs.end());
+}
+
+// new MGQuery to retrieve doc and section nums
+// this will return doc nums for the level queried at (set in queryInfo)
+// in QueryResult.docs and if a second level is specified, 
+// it will return corresponding docnums for that level in QueryResult.levels
+// If there is no level specified, or that level is invalid, the query
+// level is used
+void MGQuery (IndexData &indexData,
+	      const QueryInfo &queryInfo,
+	      const QueryNode *queryTree,
+	      ExtQueryResult &realresult, UCArray &level) {
+  realresult.Clear ();
+  QueryResult result; // temp result
+
+  // do the normal query
+  MGQuery (indexData, queryInfo, queryTree, result);
+
+  // now that have the final result stuff, convert to ExtQueryResult,
+  // add in level nums if needed
+
+  realresult.docs = result.docs;
+  realresult.ranks = result.ranks;
+  realresult.termFreqs = result.termFreqs;
+  realresult.actualNumDocs = result.actualNumDocs;
+
+  if (queryInfo.docLevel == level || level.empty()) {
+    realresult.levels = result.docs;
+    return;
+  }
+
+  // else need to convert from queryInfo.docLevel to level
+
+  // the original level info
+  FragLevelConvert sectionLevelConverter = indexData.levelConverter;
+
+  // the new level info
+  if (!indexData.LoadLevel(level)) {
+    realresult.levels = result.docs;
+    return;
+  }
+  
+  unsigned long DocNum = 0;
+  
+  for (unsigned long i=0; i<realresult.docs.size(); i++) {
+
+    // do an if ! here????
+    indexData.levelConverter.LevelToLevel(sectionLevelConverter, realresult.docs[i], DocNum);
+    realresult.levels.push_back(DocNum);
+  }
+  
+}
+
+
+
+// new function for full text browsing, 
+void MGBrowseQuery (IndexData &indexData, UCArray &level,
+		  const BrowseQueryNode &node,
+		  BrowseQueryResult &result) {
+
+  indexData.LoadLevel(level);
+  node.Calculate(indexData, result); 
+
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/MGQuery.h	(revision 21083)
@@ -0,0 +1,197 @@
+/**************************************************************************
+ *
+ * MGQuery.h -- Query related functions
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef MGQUERY_H
+#define MGQUERY_H
+
+#include "IndexData.h"
+#include <limits.h>
+#include "Terms.h"
+
+// forms base for defining and calculating the boolean
+// part of a query
+class QueryNode {
+public:
+  QueryNode ();
+  virtual ~QueryNode ();
+
+  virtual void Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+			  QueryResult &result) const;
+  virtual void Free ();
+  virtual void Print (ostream &s, int indent=0) const;
+};
+
+
+
+void PrintIndent (ostream &s, int indent);
+void PrintIndentText (ostream &s, char *text, int indent);
+void PrintNode (ostream &s, QueryNode *node, int indent=0);
+
+
+
+// basic boolean nodes
+
+class AndQueryNode : public QueryNode {
+public:
+  QueryNode *leftNode;
+  QueryNode *rightNode;
+  
+  AndQueryNode ();
+  ~AndQueryNode ();
+
+  void Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+		  QueryResult &result) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+class OrQueryNode : public QueryNode {
+public:
+  QueryNode *leftNode;
+  QueryNode *rightNode;
+  
+  OrQueryNode ();
+  ~OrQueryNode ();
+
+  void Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+		  QueryResult &result) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+class NotQueryNode : public QueryNode {
+public:
+  QueryNode *queryNode;
+  QueryNode *notNode;
+  
+  NotQueryNode ();
+  ~NotQueryNode ();
+
+  void Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+		  QueryResult &result) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+
+
+class TagNode {
+public:
+  UCArray tagName;
+
+  void Clear ();
+  TagNode () { Clear (); }
+
+  void Calculate (IndexData &indexData, FragRangeArray &fragRange) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+
+#define NO_TERM_RANGE_START (LONG_MIN/2)
+#define NO_TERM_RANGE_END   (LONG_MAX/2)
+
+/* NOTE: range stuff - the range values are for the previous term relative
+to the current term. So if searching for the phrase "the cat", 'the' doesn't 
+need range limits, but 'cat' has a range of -2 to -1. ie, if have found 'cat'
+then 'the' has to be at position between -2 and -1 relative to 'cat'.
+"the cat" could also be searched for by 'cat' with no range limits, then 'the' with range 0 to 1.
+range values are relative to the gaps between words:
+   x   y   z   X   a   b   c
+    -3   -2  -1  0   1   2   3
+
+ */
+class TermNode {
+public:
+  UCArray term;
+  unsigned long termWeight;
+  unsigned long stemMethod;
+  signed long startRange; // range relative to last term
+  signed long endRange;
+  
+  void Clear ();
+  TermNode ();
+
+  // fragLimits can be NULL if not neede
+  void Calculate (IndexData &indexData,
+		  bool needFragFreqs,
+		  FragRangeArray *fragLimits,
+		  FragData &fragData,
+		  UCArrayVector &equivTerms) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+typedef vector<TermNode> TermNodeArray;
+
+
+class ProxMatchQueryNode : public QueryNode {
+public:
+  TagNode *tagNodePtr; // optional field
+  TermNodeArray terms;
+  
+  ProxMatchQueryNode ();
+  ~ProxMatchQueryNode ();
+
+  void Calculate (IndexData &indexData, const QueryInfo &queryInfo,
+		  QueryResult &result) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+};
+
+class BrowseQueryNode :public QueryNode {
+ public:
+  UCArray term;
+  signed long startPosition;
+  unsigned long numTerms;
+
+  void Clear();
+  BrowseQueryNode () { Clear(); }
+  //  ~BrowseQueryNode ();
+
+  void Calculate (IndexData &indexData, BrowseQueryResult &result) const;
+  void Free ();
+  void Print (ostream &s, int indent=0) const;
+
+
+
+
+};
+
+void MGQuery (IndexData &indexData,
+	      const QueryInfo &queryInfo,
+	      const QueryNode *queryTree,
+	      QueryResult &result);
+
+// this function for retrieving results with both section doc nums
+// and Document docnums
+void MGQuery (IndexData &indexData,
+	      const QueryInfo &queryInfo,
+	      const QueryNode *queryTree,
+	      ExtQueryResult &result, UCArray &level);
+
+
+// new function for full text browsing, 
+void MGBrowseQuery (IndexData &indexData, UCArray &level,
+		  const BrowseQueryNode &node,
+		  BrowseQueryResult &result);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Makefile.in	(revision 21083)
@@ -0,0 +1,317 @@
+###########################################################################
+#
+# Makefile.in -- Makefile for the MG system
+# Copyright (C) 1994  Neil Sharman;  1995 Tim Shimmin
+#
+# 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.
+#
+#       @(#)Makefile.in	1.10 22 Mar 1994
+#
+###########################################################################
+
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+
+SHELL = /bin/sh
+VPATH = @srcdir@
+exec_prefix = @exec_prefix@
+prefix = @prefix@
+srcdir = @srcdir@
+subdir = text
+top_srcdir = @top_srcdir@
+transform = @program_transform_name@
+
+AR = ar
+CC = @CC@
+CXX = @CXX@
+CFLAGS = @CFLAGS@ -ansi -DSILENT -DSHORT_SUFFIX
+CXXFLAGS = @CXXFLAGS@ -DSILENT -DSHORT_SUFFIX
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBS = ../lib/libmg.a -lstdc++ @LIBS@
+TOUCH = echo timestamp >
+AWK = @AWK@
+
+##########################################
+# George Buchanan - August 1999
+# 
+# compiling with make NZDL=1 to ensure that 
+# the NZDL compile mode is used - this has been changed to the default - kjm18
+#
+##########################################
+GSDLOS = @gsdlos@
+
+bindir = $(top_srcdir)/bin/$(GSDLOS)
+datadir = $(prefix)/share
+libexecdir = $(exec_prefix)/libexec
+localedir = $(datadir)/locale
+mandir = $(prefix)/man/man1
+
+COMPILE = $(CC) -c $(DEFS) $(TREC_MODE) $(READLINE) $(INCLUDES) $(CFLAGS)
+CXXCOMPILE = $(CXX) -c $(DEFS) $(TREC_MODE) $(READLINE) $(INCLUDES) $(CXXFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $<
+
+
+ANSI2KNR = @ANSI2KNR@
+o = .@U@o
+
+.SUFFIXES: ._c ._o
+.c._c:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $@
+._c._o:
+	@echo $(COMPILE) $<
+	@rm -f _$*.c
+	@ln $< _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+.c._o:
+	./ansi2knr $< > $*.tmp && mv $*.tmp $*._c
+	@echo $(COMPILE) $*._c
+	@rm -f _$*.c
+	@ln $*._c _$*.c && $(COMPILE) _$*.c && mv _$*.o $@ && rm _$*.c
+
+# want toplevel config.h, not local mg one
+INCLUDES = -I../../.. -I../lib -I.
+
+#############################################################################
+#
+# Uncomment (and possibly edit) the following lines if you wish
+# to use the GNU readline library for the input in mgquery
+# 
+#READLINE = -DGNU_READLINE -I/opt/gnu/include/readline -L/opt/gnu/lib
+#READLINE_LIBS = -lreadline -ltermcap
+#
+#
+#############################################################################
+
+SOURCES = \
+  FIvfLevelInfo.cpp        ivf.pass1.cpp            mgpp_invf_dump.cpp       \
+  FText.cpp                ivf.pass2.cpp            mgpp_passes.cpp          \
+  FileBuf.cpp              locallib.cpp             mgpp_perf_hash_build.cpp \
+  FragLevelConvert.cpp     mg.special.cpp           mgpp_stem_idx.cpp        \
+  IndexData.cpp            mgpp_compression_dict.cpp  mgpp_weights_build.cpp   \
+  TagInfo.cpp              mgpp_decompress_text.cpp   stemmer.cpp            \
+  TextEl.cpp               mg_errors.cpp            text.cpp               \
+  TextGet.cpp              mgpp_fast_comp_dict.cpp    text.pass1.cpp         \
+  UCArray.cpp              mg_files.cpp             text.pass2.cpp         \
+  comp_dict.cpp            mgpp_invf_dict.cpp         words.cpp              \
+  invf.cpp                 mgpp_invf_dict_dump.cpp    Weights.cpp            \
+  MGQuery.cpp              Terms.cpp                QueryTester.cpp        \
+  QueryLex.cpp             QueryParser.cpp         \
+  GSDLQueryLex.cpp	   GSDLQueryParser.cpp      Queryer.cpp
+
+
+HEADERS = \
+  FIvfLevelInfo.h     TextEl.h            hash.h              stemmer.h  \
+  FText.h             TextGet.h           invf.h              text.h     \
+  FileBuf.h           UCArray.h           locallib.h          words.h    \
+  FragLevelConvert.h  WordData.h          mg.h                           \
+  IndexData.h         build.h             mg_errors.h                    \
+  TagInfo.h           comp_dict.h         mg_files.h          Weights.h  \
+  MGQuery.h           Terms.h             QueryLex.h          QueryParser.h \
+  GSDLQueryLex.h	GSDLQueryParser.h
+
+
+MISC          = Makefile.in 
+
+ALLFILES      =	$(SOURCES) $(HEADERS) $(MISC) $(MAN)
+
+DISTFILES     = $(ALLFILES) 
+
+EXEC          = mgpp_passes mgpp_decompress_text mgpp_perf_hash_build \
+                mgpp_invf_dump mgpp_weights_build mgpp_invf_dict mgpp_stem_idx \
+                mgpp_invf_dict_dump mgpp_compression_dict mgpp_fast_comp_dict \
+                QueryTester Queryer
+
+MAN           =  mgpp_weights_build.1  mgpp_invf_dict.1 \
+                 mgpp_passes.1 mgpp_perf_hash_build.1 \
+                 mgpp_compression_dict.1  mgpp_fast_comp_dict.1 \
+                 mgpp_stem_idx.1
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+all:	$(EXEC) libtextin.a
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) $(CFLAGS) -- $(SOURCES)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+
+PASSES_OBJS = \
+	mgpp_passes$o text.pass1$o comp_dict$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o \
+	words$o invf$o FileBuf$o TextEl$o UCArray$o TagInfo$o \
+        FText$o text$o FIvfLevelInfo$o
+
+mgpp_passes: $(PASSES_OBJS)
+	$(LINK) $(PASSES_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+QUERYER_OBJS = Queryer$o mg_files$o mg_errors$o locallib$o invf$o UCArray$o \
+               FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+               IndexData$o stemmer$o Weights$o TextGet$o text$o FText$o \
+               GSDLQueryParser$o GSDLQueryLex$o words$o
+
+Queryer: $(QUERYER_OBJS)
+	$(LINK) $(QUERYER_OBJS) $(LIBS)
+
+QUERY_TESTER_OBJS = QueryTester$o mg_files$o invf$o UCArray$o \
+                    FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+                    IndexData$o stemmer$o Weights$o
+
+QueryTester: $(QUERY_TESTER_OBJS)
+	$(LINK) $(QUERY_TESTER_OBJS) $(LIBS)
+
+WEIGHTS_BUILD_OBJS = mgpp_weights_build$o mg_files$o invf$o UCArray$o \
+                     FIvfLevelInfo$o FragLevelConvert$o
+
+mgpp_weights_build: $(WEIGHTS_BUILD_OBJS)
+	$(LINK) $(WEIGHTS_BUILD_OBJS) $(LIBS)
+
+COMP_DICT_OBJS = mgpp_compression_dict$o mg_files$o locallib$o
+
+mgpp_compression_dict: $(COMP_DICT_OBJS)
+	$(LINK) $(COMP_DICT_OBJS) $(LIBS)
+
+FAST_COMP_OBJS = mgpp_fast_comp_dict$o mg_files$o locallib$o
+
+mgpp_fast_comp_dict: $(FAST_COMP_OBJS)
+	$(LINK) $(FAST_COMP_OBJS) $(LIBS)
+
+INVF_DUMP_OBJS = mgpp_invf_dump$o locallib$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dump: $(INVF_DUMP_OBJS)
+	$(LINK) $(INVF_DUMP_OBJS) $(LIBS)
+
+INVF_DICT_OBJS = mgpp_invf_dict$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dict: $(INVF_DICT_OBJS)
+	$(LINK) $(INVF_DICT_OBJS) $(LIBS)
+
+INVF_DICT_DUMP_OBJS = mgpp_invf_dict_dump$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dict_dump: $(INVF_DICT_DUMP_OBJS)
+	$(LINK) $(INVF_DICT_DUMP_OBJS) $(LIBS)
+
+PERF_HASH_OBJS = mgpp_perf_hash_build$o mg_files$o invf$o UCArray$o
+
+mgpp_perf_hash_build: $(PERF_HASH_OBJS)
+	$(LINK) $(PERF_HASH_OBJS) $(LIBS)
+
+STEM_IDX_OBJS = mgpp_stem_idx$o mg_files$o stemmer$o \
+                invf$o UCArray$o
+
+mgpp_stem_idx: $(STEM_IDX_OBJS)
+	$(LINK) $(STEM_IDX_OBJS) $(LIBS)
+
+DECOMPRESS_TEXT_OBJS = \
+                mgpp_decompress_text$o mg_files$o mg_errors$o \
+                locallib$o text$o UCArray$o TextGet$o FText$o
+
+mgpp_decompress_text: $(DECOMPRESS_TEXT_OBJS)
+	$(LINK) $(DECOMPRESS_TEXT_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+ansi2knr: ansi2knr.o
+	$(LINK) ansi2knr.o $(LIBS)
+
+install: execinstall
+uninstall: execuninstall
+
+execinstall: $(EXEC)
+	../mkinstalldirs $(bindir); \
+	for name in $(EXEC); do \
+	  $(INSTALL_PROGRAM) $$name \
+	  $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+execuninstall:
+	for name in $(EXEC); do \
+	 rm -f $(bindir)/`echo $$name | sed '$(transform)'`; \
+	done
+
+maninstall: $(MAN)
+	$(top_srcdir)/mkinstalldirs $(mandir); \
+	for f in $(MAN); do \
+	  $(INSTALL_DATA) $$f $(mandir)/$$f ;\
+	done
+
+manuninstall: $(MAN)
+	for f in $(MAN); do \
+	  rm -f $(mandir)/$$f ;\
+	done
+
+#mg_errors$o removed from LIB_OBJS to avoid conflict with mg's libtextin.a
+LIB_OBJS = mg_files$o  mg_errors$o locallib$o invf$o UCArray$o \
+           FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+           IndexData$o stemmer$o Weights$o TextGet$o text$o FText$o \
+           GSDLQueryParser$o GSDLQueryLex$o words$o
+
+libtextin.a: $(LIB_OBJS)
+	rm -f libtextin.a
+	$(AR) cru libtextin.a $(LIB_OBJS)
+	$(RANLIB) libtextin.a
+
+
+mostlyclean:
+	rm -f *$o _*.c _*.o *._c *._o core core.*
+
+clean: mostlyclean
+	rm -f $(EXEC) libtextin.a
+
+distclean: clean
+	rm -f ansi2knr
+	rm -f Makefile
+
+maintainer-clean: distclean
+	@echo "This command is intended only for maintainers to use;"
+	@echo "rebuilding the deleted files may require special tools."
+
+dist: $(DISTFILES)
+	for file in $(DISTFILES); do \
+	  ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+	  || cp -p $(srcdir)/$$file $(distdir); \
+	done
+
+movclean:
+	for file in $(SOURCES); do \
+          test = $$file; \
+          echo $("test.c"##*.c); \
+        done 
+
+# jrm21
+#Makefile: Makefile.in ../../../config.status
+#	cd ../../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./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 exc
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.cpp	(revision 21083)
@@ -0,0 +1,169 @@
+/**************************************************************************
+ *
+ * QueryLex.cpp -- Lexical analyser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "QueryLex.h"
+#include "unitool.h"
+#include "words.h"
+
+inline void AddNChar (UCArray::const_iterator &here,
+		      UCArray &text,
+		      int len) {
+  while (len > 0) {
+    text.push_back (*here++);
+    len--;
+  }
+}
+
+static bool ParseInteger (UCArray::const_iterator &here,
+			  UCArray::const_iterator end,
+			  LexEl &el) {
+  el.Clear();
+
+  // this version of end is used in unitool
+  UCArray::const_iterator endMinus1 = end-1;
+
+  int charLen;
+  unsigned short c; // one character lookahead
+  charLen = parse_utf8_char (here, endMinus1, &c);
+
+  // check for positive or negative
+  bool neg = false;
+  if (c == '+') {
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (here, endMinus1, &c);
+  } else if (c == '-') {
+    neg = true;
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (here, endMinus1, &c);
+  }
+
+  // read in number part
+  el.num = 0;
+  el.lexType = IntegerE;
+  while (c >= '0' && c <= '9') {
+    el.num = el.num*10 + c - '0';
+    AddNChar (here, el.text, charLen);
+    charLen = parse_utf8_char (here, endMinus1, &c);
+  }
+
+  if (neg) el.num *= -1;
+
+  return (!el.text.empty());
+}
+
+static bool ParseTerm (UCArray::const_iterator &here,
+		       UCArray::const_iterator end,
+		       UCArray &text) {
+  UCArray::const_iterator endMinus1 = end-1;
+  here = ParseIndexWord (here, endMinus1, text);
+  return !text.empty();
+}
+
+
+bool ParseLexEl (UCArray::const_iterator &here,
+		 UCArray::const_iterator end,
+		 LexEl &el) {
+  el.Clear();
+
+  // strange things can happen if here == end == 0
+  if (here == end) return false;
+  
+  // this version of end is used in unitool
+  UCArray::const_iterator endMinus1 = end-1;
+  
+  // ignore all white space
+  int charLen;
+  unsigned short c; // one character lookahead
+  charLen = parse_utf8_char (here, endMinus1, &c);
+  while (here != end && is_unicode_space (c)) {
+    here += charLen;
+    charLen = parse_utf8_char (here, endMinus1, &c);
+  }
+  if (here == end) return false;
+
+  if (c == '(') {
+    el.lexType = OpenBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == ')') {
+    el.lexType = CloseBracketE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '\"') {
+    el.lexType = QuoteE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '#') {
+    el.lexType = TermWeightE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '$') {
+    el.lexType = StemMethodE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '^') {
+    el.lexType = RangeE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '@') {
+    el.lexType = AtE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == ':') {
+    el.lexType = TagE;
+    AddNChar (here, el.text, charLen);
+    return true;
+    
+  } else if (c == '+' || c == '-' ||
+	     (c >= '0' && c <= '9')) {
+    return ParseInteger (here, end, el);
+  }
+
+  // assume it is a term of some sort
+  if (!ParseTerm (here, end, el.text)) return false;
+
+  UCArray AND; SetCStr (AND, "AND");
+  if (el.text == AND) {
+    el.lexType = AndOpE;
+    return true;
+  }
+  UCArray OR; SetCStr (OR, "OR");
+  if (el.text == OR) {
+    el.lexType = OrOpE;
+    return true;
+  }
+  UCArray NOT; SetCStr (NOT, "NOT");
+  if (el.text == NOT) {
+    el.lexType = NotOpE;
+    return true;
+  }
+
+  el.lexType = TermE;
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryLex.h	(revision 21083)
@@ -0,0 +1,53 @@
+/**************************************************************************
+ *
+ * QueryLex.h -- Lexical analyser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef QUERYLEX_H
+#define QUERYLEX_H
+
+#include "UCArray.h"
+
+
+// note: white space is ignored
+enum LexType {NoTypeE, OpenBracketE, CloseBracketE, TermE, AndOpE, OrOpE,
+	      NotOpE, QuoteE, IntegerE, TermWeightE, StemMethodE,
+	      RangeE, AtE, TagE};
+
+struct LexEl {
+  LexType lexType;
+  UCArray text;
+  int num; // for IntegerE
+
+  void Clear () {
+    lexType = NoTypeE;
+    UCArrayClear (text);
+    num = 0;
+  }
+  LexEl () { Clear (); }
+};
+
+
+// returns true if another lexical element could be parsed.
+bool ParseLexEl (UCArray::const_iterator &here,
+		 UCArray::const_iterator end,
+		 LexEl &el);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.cpp	(revision 21083)
@@ -0,0 +1,219 @@
+/**************************************************************************
+ *
+ * QueryParser.cpp -- Query parser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "QueryParser.h"
+#include "QueryLex.h"
+
+
+static QueryNode *ParseExpression (UCArray::const_iterator &here,
+				   UCArray::const_iterator end);
+
+static QueryNode *AndAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  AndQueryNode *andNode = new AndQueryNode;
+  andNode->leftNode = t1;
+  andNode->rightNode = t2;
+  return andNode;
+}
+
+static QueryNode *OrAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  OrQueryNode *orNode = new OrQueryNode;
+  orNode->leftNode = t1;
+  orNode->rightNode = t2;
+  return orNode;
+}
+
+static QueryNode *NotAdd (QueryNode *t1, QueryNode *t2) {
+  if (t1 == NULL) return t2;
+  if (t2 == NULL) return t1;
+
+  NotQueryNode *notNode = new NotQueryNode;
+  notNode->queryNode = t1;
+  notNode->notNode = t2;
+  return notNode;
+}
+
+// expects the opening bracket to have already been parsed
+// and discarded
+static QueryNode *ParseBracketExpression (UCArray::const_iterator &here,
+					  UCArray::const_iterator end) {
+  // get everything in the expression
+  QueryNode *curTree = ParseExpression (here, end);
+  
+  // gobble up tokens until a closing bracket is found
+  // or the end of the string
+  LexEl el;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == CloseBracketE) break;
+  }
+
+  return curTree;
+}
+
+static int ParseInt (UCArray::const_iterator &here,
+		     UCArray::const_iterator end) {
+  LexEl el;
+  UCArray::const_iterator oldHere = here;
+  if (ParseLexEl (here, end, el) && el.lexType == IntegerE)
+    return el.num;
+  
+  here = oldHere; // not an integer
+  return 0;
+}
+
+
+static void ParseTermModifiers (UCArray::const_iterator &here,
+				UCArray::const_iterator end,
+				TermNode &termNode) {
+  LexEl el;
+  UCArray::const_iterator oldHere = here;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TermWeightE) {
+      termNode.termWeight = ParseInt (here, end);
+      
+    } else if (el.lexType == StemMethodE) {
+      termNode.stemMethod = ParseInt (here, end);
+      
+    } else if (el.lexType == RangeE) {
+      termNode.startRange = ParseInt (here, end);
+      termNode.endRange = ParseInt (here, end);
+      
+    } else if (el.lexType == AtE) {
+      termNode.startRange = termNode.endRange = ParseInt (here, end);
+      
+    } else {
+      // no term modifiers
+      here = oldHere;
+      break;
+    }
+    
+    oldHere = here;
+  }  
+}
+
+// expects the starting quote to have been parsed
+// and discarded
+static void ParsePhrase (UCArray::const_iterator &here,
+			 UCArray::const_iterator end,
+			 ProxMatchQueryNode &proxNode) {
+  LexEl el;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == TermE || el.lexType == IntegerE) {
+      TermNode termNode;
+      termNode.term = el.text;
+      ParseTermModifiers (here, end, termNode);
+      proxNode.terms.push_back (termNode);
+      
+    } else if (el.lexType == QuoteE) {
+      break;
+      
+    } else {
+      // error
+      break;
+    }
+  }
+}
+
+static QueryNode *ParseTerm (UCArray::const_iterator &here,
+			     UCArray::const_iterator end) {
+  LexEl el;
+
+  UCArray::const_iterator oldHere = here;
+  if (!ParseLexEl (here, end, el)) return NULL;
+
+  if (el.lexType == OpenBracketE)
+    return ParseBracketExpression (here, end);
+
+  ProxMatchQueryNode *proxNode = new ProxMatchQueryNode;
+
+  // check for a tag
+  if (el.lexType == TagE) {
+    oldHere = here; // don't backtrack past here
+    if (!ParseLexEl (here, end, el)) return NULL;
+    if (el.lexType == TermE) {
+      proxNode->tagNodePtr = new TagNode;
+      proxNode->tagNodePtr->tagName = el.text;
+      if (!ParseLexEl (here, end, el)) return NULL;
+    }
+  }
+  
+  if (el.lexType == TermE || el.lexType == IntegerE) {
+    TermNode termNode;
+    termNode.term = el.text;
+    ParseTermModifiers (here, end, termNode);
+    proxNode->terms.push_back (termNode);
+    return proxNode;
+    
+  } else if (el.lexType == QuoteE) {
+    ParsePhrase (here, end, *proxNode);
+    return proxNode;
+  }
+
+  // not a term
+  here = oldHere;
+  delete proxNode;
+  return NULL;
+}
+
+
+static QueryNode *ParseExpression (UCArray::const_iterator &here,
+				   UCArray::const_iterator end) {
+  LexEl el;
+  QueryNode *curTree = NULL;
+
+  UCArray::const_iterator oldHere = here;
+  while (ParseLexEl (here, end, el)) {
+    if (el.lexType == OpenBracketE ||
+	el.lexType == TermE ||
+	el.lexType == QuoteE ||
+	el.lexType == IntegerE ||
+	el.lexType == TagE) {
+      // some type of term, back track and parse it
+      here = oldHere;
+      curTree = OrAdd (curTree, ParseTerm (here, end));
+      
+    } else if (el.lexType == AndOpE) {
+      curTree = AndAdd (curTree, ParseTerm (here, end));
+      
+    } else if (el.lexType == OrOpE) {
+      curTree = OrAdd (curTree, ParseTerm (here, end));
+      
+    } else if (el.lexType == NotOpE) {
+      curTree = NotAdd (curTree, ParseTerm (here, end));
+      
+    } else break;
+    
+    oldHere = here;
+  }
+
+  return curTree;
+}
+
+QueryNode *ParseQuery (const UCArray &queryStr) {
+  UCArray::const_iterator here = queryStr.begin();
+  UCArray::const_iterator end = queryStr.end();
+  return ParseExpression (here, end);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryParser.h	(revision 21083)
@@ -0,0 +1,31 @@
+/**************************************************************************
+ *
+ * QueryParser.h -- Query parser for a simple query language
+ * Copyright (C) 2000  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef QUERYPARSER_H
+#define QUERYPARSER_H
+
+#include "UCArray.h"
+#include "MGQuery.h"
+
+// returns NULL if the query could not be parsed
+QueryNode *ParseQuery (const UCArray &queryStr);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryResultsSort.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryResultsSort.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryResultsSort.h	(revision 21083)
@@ -0,0 +1,140 @@
+/**************************************************************************
+ *
+ * QueryResultsSort.h -- Functions to sort query results and parallel data
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef QUERYRESULTSSORT_H
+#define QUERYRESULTSSORT_H
+
+#include "Terms.h"
+
+
+struct LTRank {
+  bool operator()(const float &f1, const float &f2) const
+    { return (f1 < f2); }
+};
+
+struct GTRank {
+  bool operator()(const float &f1, const float &f2) const
+    { return (f1 > f2); }
+};
+
+
+
+// assumes the rank vector is the same size as the document
+// number vector. assumes the value to be pushed is in
+// docNumHeap + heapSize - 1 and rankHeap + heapSize - 1
+// topIndex can be set
+template <class RandomAccessIterator, class Compare>
+void PushHeap (DocNumArray::iterator docNumHeap,
+	       RandomAccessIterator parallelHeap,
+	       unsigned long heapSize,
+	       const Compare &comp) {
+  unsigned long holeIndex = heapSize-1;
+  unsigned long parent = (holeIndex - 1) / 2;
+  while (holeIndex > 0 && comp (*(parallelHeap+parent),
+				*(parallelHeap+holeIndex))) {
+    swap (*(parallelHeap+holeIndex), *(parallelHeap+parent));
+    swap (*(docNumHeap+holeIndex), *(docNumHeap+parent));
+    holeIndex = parent;
+    parent = (holeIndex - 1) / 2;
+  }
+}
+
+// AdjustHeap is used to add a element to a heap after one
+// element in the heap has been replaced with a new one
+template <class RandomAccessIterator, class Compare>
+void AdjustHeap (DocNumArray::iterator docNumHeap,
+		     RandomAccessIterator parallelHeap,
+		     unsigned long holeIndex,
+		     unsigned long heapSize,
+		     const Compare &comp) {
+  unsigned long secondChild = 2 * holeIndex + 2;
+  while (secondChild < heapSize) {
+    if (comp(*(parallelHeap + secondChild),
+	     *(parallelHeap + (secondChild - 1))))
+      secondChild--;
+    swap (*(parallelHeap+holeIndex), *(parallelHeap+secondChild));
+    swap (*(docNumHeap+holeIndex), *(docNumHeap+secondChild));
+    holeIndex = secondChild;
+    secondChild = 2 * secondChild + 2;
+  }
+  if (secondChild == heapSize) {
+    swap (*(parallelHeap+holeIndex), *(parallelHeap+(secondChild-1)));
+    swap (*(docNumHeap+holeIndex), *(docNumHeap+(secondChild-1)));
+    holeIndex = secondChild - 1;
+  }
+  PushHeap (docNumHeap, parallelHeap, holeIndex+1, comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+void PopHeap (DocNumArray::iterator docNumHeap,
+	      RandomAccessIterator parallelHeap,
+	      unsigned long heapSize,
+	      const Compare &comp) {
+  swap (*(parallelHeap), *(parallelHeap+heapSize-1));
+  swap (*(docNumHeap), *(docNumHeap+heapSize-1));
+  AdjustHeap (docNumHeap, parallelHeap, (unsigned long)0, heapSize-1, comp);
+}
+
+template <class RandomAccessIterator, class Compare>
+void MakeHeap (DocNumArray::iterator docNumHeap,
+	       RandomAccessIterator parallelHeap,
+	       unsigned long size,
+	       const Compare &comp) {
+  if (size < 2) return;
+  
+  unsigned long i = 0;
+  for (i=1; i<=size; i++)
+    PushHeap (docNumHeap, parallelHeap, i, comp);
+}
+
+ 
+template <class RandomAccessIterator, class Compare>
+void SortHeap (DocNumArray::iterator docNumHeap,
+	       RandomAccessIterator parallelHeap,
+	       unsigned long size,
+	       const Compare &comp) {
+  if (size < 2) return;
+
+  unsigned long i;
+  for (i=size; i>1; i--)
+    PopHeap (docNumHeap, parallelHeap, i, comp);
+}
+
+// uses the heap to get the top "size" elements
+template <class RandomAccessIterator, class Compare>
+void SelectAddHeap (DocNumArray::iterator docNumHeap,
+		    RandomAccessIterator parallelHeap,
+		    unsigned long heapSize,
+		    DocNumArray::iterator docNumAdd,
+		    RandomAccessIterator parallelAdd,
+		    unsigned long addSize,
+		    const Compare &comp) {
+  unsigned long i;
+  for (i=0; i<addSize; i++) {
+    if (comp(*(parallelAdd+i), *(parallelHeap))) {
+      swap (*(docNumHeap), *(docNumAdd+i));
+      swap (*(parallelHeap), *(parallelAdd+i));
+      AdjustHeap (docNumHeap, parallelHeap, (unsigned long)0, heapSize, comp);
+    }
+  }
+}
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/QueryTester.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/QueryTester.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/QueryTester.cpp	(revision 21083)
@@ -0,0 +1,447 @@
+/**************************************************************************
+ *
+ * QueryTester.cpp -- 
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "MGQuery.h"
+
+
+class SetQueryNode : public QueryNode {
+public:
+  QueryResult queryResult;
+  
+  SetQueryNode () {}
+  ~SetQueryNode () {}
+
+  void Calculate (IndexData &/*indexData*/, const QueryInfo &queryInfo,
+		  QueryResult &result) const {
+    result = queryResult;
+    if (!queryInfo.sortByRank && !queryInfo.needRankInfo)
+      result.ranks.erase (result.ranks.begin(), result.ranks.end());
+    if (!queryInfo.needTermFreqs)
+      result.termFreqs.erase (result.termFreqs.begin(),
+			      result.termFreqs.end());
+  }
+  void Free () { queryResult.Clear(); }
+};
+
+
+bool Test1 () {
+  AndQueryNode andNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  RankArray &rankSet1 = setNode1->queryResult.ranks;
+  docSet1.push_back (1);  rankSet1.push_back (0.1);
+  docSet1.push_back (10); rankSet1.push_back (0.2);
+  docSet1.push_back (15); rankSet1.push_back (0.2);
+  docSet1.push_back (18); rankSet1.push_back (0.4);
+  docSet1.push_back (19); rankSet1.push_back (0.5);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  RankArray &rankSet2 = setNode2->queryResult.ranks;
+  docSet2.push_back (2);  rankSet2.push_back (0.1);
+  docSet2.push_back (11); rankSet2.push_back (0.2);
+  docSet2.push_back (12); rankSet2.push_back (0.3);
+  docSet2.push_back (13); rankSet2.push_back (0.4);
+  docSet2.push_back (14); rankSet2.push_back (0.5);
+  docSet2.push_back (15); rankSet2.push_back (0.6);
+  docSet2.push_back (16); rankSet2.push_back (0.7);
+  docSet2.push_back (17); rankSet2.push_back (0.8);
+  docSet2.push_back (19); rankSet2.push_back (0.9);
+  docSet2.push_back (20); rankSet2.push_back (0.1);
+  docSet2.push_back (21); rankSet2.push_back (0.2);
+
+  cout << "\n" << setNode1->queryResult << "AND\n\n"
+       << setNode2->queryResult;
+  
+
+  andNode.leftNode = setNode1;
+  andNode.rightNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = true;
+  queryInfo.needRankInfo = true;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  andNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  RankArray &rcRankSet = resultCompare.ranks;
+  rcDocSet.push_back (15);  rcRankSet.push_back (0.2+0.6);
+  rcDocSet.push_back (19);  rcRankSet.push_back (1.4);
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+bool Test1b () {
+  AndQueryNode andNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  docSet1.push_back (1); 
+  docSet1.push_back (10);
+  docSet1.push_back (15);
+  docSet1.push_back (18);
+  docSet1.push_back (19);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  docSet2.push_back (2); 
+  docSet2.push_back (11);
+  docSet2.push_back (12);
+  docSet2.push_back (13);
+  docSet2.push_back (14);
+  docSet2.push_back (15);
+  docSet2.push_back (16);
+  docSet2.push_back (17);
+  docSet2.push_back (19);
+  docSet2.push_back (20);
+  docSet2.push_back (21);
+
+  cout << "\n" << setNode1->queryResult << "AND\n\n"
+       << setNode2->queryResult;
+  
+
+  andNode.leftNode = setNode1;
+  andNode.rightNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = false;
+  queryInfo.needRankInfo = false;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  andNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  rcDocSet.push_back (15); 
+  rcDocSet.push_back (19); 
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+bool Test2 () {
+  OrQueryNode orNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  RankArray &rankSet1 = setNode1->queryResult.ranks;
+  docSet1.push_back (1);  rankSet1.push_back (0.1);
+  docSet1.push_back (10); rankSet1.push_back (0.2);
+  docSet1.push_back (15); rankSet1.push_back (0.2);
+  docSet1.push_back (18); rankSet1.push_back (0.4);
+  docSet1.push_back (19); rankSet1.push_back (0.5);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  RankArray &rankSet2 = setNode2->queryResult.ranks;
+  docSet2.push_back (2);  rankSet2.push_back (0.1);
+  docSet2.push_back (11); rankSet2.push_back (0.2);
+  docSet2.push_back (12); rankSet2.push_back (0.3);
+  docSet2.push_back (13); rankSet2.push_back (0.4);
+  docSet2.push_back (14); rankSet2.push_back (0.5);
+  docSet2.push_back (15); rankSet2.push_back (0.6);
+  docSet2.push_back (16); rankSet2.push_back (0.7);
+  docSet2.push_back (17); rankSet2.push_back (0.8);
+  docSet2.push_back (19); rankSet2.push_back (0.9);
+  docSet2.push_back (20); rankSet2.push_back (0.1);
+  docSet2.push_back (21); rankSet2.push_back (0.2);
+
+  cout << "\n" << setNode1->queryResult << "OR\n\n"
+       << setNode2->queryResult;
+  
+
+  orNode.leftNode = setNode1;
+  orNode.rightNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = true;
+  queryInfo.needRankInfo = true;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  orNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  RankArray &rcRankSet = resultCompare.ranks;
+  rcDocSet.push_back (1);  rcRankSet.push_back (0.1);
+  rcDocSet.push_back (2);  rcRankSet.push_back (0.1);
+  rcDocSet.push_back (10); rcRankSet.push_back (0.2);
+  rcDocSet.push_back (11); rcRankSet.push_back (0.2);
+  rcDocSet.push_back (12); rcRankSet.push_back (0.3);
+  rcDocSet.push_back (13); rcRankSet.push_back (0.4);
+  rcDocSet.push_back (14); rcRankSet.push_back (0.5);
+  rcDocSet.push_back (15); rcRankSet.push_back (0.2+0.6);
+  rcDocSet.push_back (16); rcRankSet.push_back (0.7);
+  rcDocSet.push_back (17); rcRankSet.push_back (0.8);
+  rcDocSet.push_back (18); rcRankSet.push_back (0.4);
+  rcDocSet.push_back (19); rcRankSet.push_back (0.9+0.5);
+  rcDocSet.push_back (20); rcRankSet.push_back (0.1);
+  rcDocSet.push_back (21); rcRankSet.push_back (0.2);
+  
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+bool Test2b () {
+  OrQueryNode orNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  docSet1.push_back (1); 
+  docSet1.push_back (10);
+  docSet1.push_back (15);
+  docSet1.push_back (18);
+  docSet1.push_back (19);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  docSet2.push_back (2);
+  docSet2.push_back (11);
+  docSet2.push_back (12);
+  docSet2.push_back (13);
+  docSet2.push_back (14);
+  docSet2.push_back (15);
+  docSet2.push_back (16);
+  docSet2.push_back (17);
+  docSet2.push_back (19);
+  docSet2.push_back (20);
+  docSet2.push_back (21);
+
+  cout << "\n" << setNode1->queryResult << "OR\n\n"
+       << setNode2->queryResult;
+  
+
+  orNode.leftNode = setNode1;
+  orNode.rightNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = false;
+  queryInfo.needRankInfo = false;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  orNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  rcDocSet.push_back (1);
+  rcDocSet.push_back (2); 
+  rcDocSet.push_back (10);
+  rcDocSet.push_back (11);
+  rcDocSet.push_back (12);
+  rcDocSet.push_back (13);
+  rcDocSet.push_back (14);
+  rcDocSet.push_back (15);
+  rcDocSet.push_back (16);
+  rcDocSet.push_back (17);
+  rcDocSet.push_back (18);
+  rcDocSet.push_back (19);
+  rcDocSet.push_back (20);
+  rcDocSet.push_back (21);
+  
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+bool Test3 () {
+  NotQueryNode notNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  RankArray &rankSet1 = setNode1->queryResult.ranks;
+  docSet1.push_back (1);  rankSet1.push_back (0.1);
+  docSet1.push_back (10); rankSet1.push_back (0.2);
+  docSet1.push_back (15); rankSet1.push_back (0.2);
+  docSet1.push_back (18); rankSet1.push_back (0.4);
+  docSet1.push_back (19); rankSet1.push_back (0.5);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  RankArray &rankSet2 = setNode2->queryResult.ranks;
+  docSet2.push_back (2);  rankSet2.push_back (0.1);
+  docSet2.push_back (11); rankSet2.push_back (0.2);
+  docSet2.push_back (12); rankSet2.push_back (0.3);
+  docSet2.push_back (13); rankSet2.push_back (0.4);
+  docSet2.push_back (14); rankSet2.push_back (0.5);
+  docSet2.push_back (15); rankSet2.push_back (0.6);
+  docSet2.push_back (16); rankSet2.push_back (0.7);
+  docSet2.push_back (17); rankSet2.push_back (0.8);
+  docSet2.push_back (19); rankSet2.push_back (0.9);
+  docSet2.push_back (20); rankSet2.push_back (0.1);
+  docSet2.push_back (21); rankSet2.push_back (0.2);
+
+  cout << "\n" << setNode1->queryResult << "NOT\n\n"
+       << setNode2->queryResult;
+  
+
+  notNode.queryNode = setNode1;
+  notNode.notNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = true;
+  queryInfo.needRankInfo = true;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  notNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  RankArray &rcRankSet = resultCompare.ranks;
+  rcDocSet.push_back (1);  rcRankSet.push_back (0.1);
+  rcDocSet.push_back (10); rcRankSet.push_back (0.2);
+  rcDocSet.push_back (18); rcRankSet.push_back (0.4);
+  
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+bool Test3b () {
+  NotQueryNode notNode;
+
+  SetQueryNode *setNode1 = new SetQueryNode;
+  DocNumArray &docSet1 = setNode1->queryResult.docs;
+  docSet1.push_back (1); 
+  docSet1.push_back (10);
+  docSet1.push_back (15);
+  docSet1.push_back (18);
+  docSet1.push_back (19);
+
+  SetQueryNode *setNode2 = new SetQueryNode;
+  DocNumArray &docSet2 = setNode2->queryResult.docs;
+  docSet2.push_back (2); 
+  docSet2.push_back (11);
+  docSet2.push_back (12);
+  docSet2.push_back (13);
+  docSet2.push_back (14);
+  docSet2.push_back (15);
+  docSet2.push_back (16);
+  docSet2.push_back (17);
+  docSet2.push_back (19);
+  docSet2.push_back (20);
+  docSet2.push_back (21);
+
+  cout << "\n" << setNode1->queryResult << "NOT\n\n"
+       << setNode2->queryResult;
+  
+
+  notNode.queryNode = setNode1;
+  notNode.notNode = setNode2;
+
+  IndexData indexData; // this will not be used anywhere
+  QueryInfo queryInfo;
+  queryInfo.maxDocs = 0;
+  queryInfo.sortByRank = false;
+  queryInfo.needRankInfo = false;
+  queryInfo.needTermFreqs = true;
+  
+  QueryResult result;
+
+  notNode.Calculate(indexData, queryInfo, result);
+
+  cout << "EQUALS\n\n" << result << "\n";
+
+  QueryResult resultCompare;
+  DocNumArray &rcDocSet = resultCompare.docs;
+  rcDocSet.push_back (1); 
+  rcDocSet.push_back (10);
+  rcDocSet.push_back (18);
+  
+
+  if (!(result == resultCompare)) {
+    cout << "Test failed!!!\n";
+    cout << resultCompare;
+    return false;
+  }
+
+  return true;
+}
+
+
+int main () {
+  if (!Test1 () ||
+      !Test2 () ||
+      !Test2b () ||
+      !Test3 () ||
+      !Test3b ()) return 1;
+  
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/Queryer.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Queryer.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Queryer.cpp	(revision 21083)
@@ -0,0 +1,260 @@
+/**************************************************************************
+ *
+ * Queryer.cpp -- simple interactive query program
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "MGQuery.h"
+#include "TextGet.h"
+
+#include "messages.h"
+#include "mg_files.h"
+
+#include "GSDLQueryParser.h"
+
+void printHelp() {
+
+  cout << "commands available are:\n"
+       << "\t.q\t\tquit\n"
+       << "\t.h\t\tprint the help message\n"
+       << "\t.i\t\tchange the search level (enter the new level at the prompt)\n"
+       << "\t.l\t\tchange the result level ( \"\"   \"\"  )\n"
+       << "\t.b\t\tfull text browse (enter a word or fragment at the prompt)\n"
+       << "\t.r0/.r1\t\tranking off/on\n"
+       << "\t.t0/.t1\t\tquery type some/all\n"
+       << "\t.c0/.c1\t\tcasefolding off/on\n"
+       << "\t.s0/.s1\t\tstemming off/on\n"
+       << "\t.o0/.o1\t\tshort output off/on\n\n";
+
+}
+
+int main (int argc, char **argv) {
+  int ch;
+  char *textfilename = "";
+  char *indexfilename = "";
+  char *basePath = "";
+  
+  opterr = 0;
+  msg_prefix = argv[0];
+  
+  // process the command line arguments
+  while ((ch = getopt (argc, argv, "f:t:d:h")) != -1) {
+    switch (ch) {
+    case 'f':		/* input file */
+      indexfilename = optarg;
+      break;
+    case 't':
+      textfilename = optarg;
+      break;
+    case 'd':
+      basePath = optarg;
+      set_basepath (basePath);
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-h] [-d directory] -f indexname -t textname\n", argv[0]);
+      exit (1);
+    }
+  }
+
+  if (textfilename[0] == '\0' || indexfilename[0] == '\0') {
+    FatalError (1, "Index and text file names must be specified with -f and -t \n");
+  }
+  
+  // init the text system
+  TextData textData;
+  if (!textData.LoadData (basePath, textfilename)) {
+    FatalError (1, "Couldn't load text information for \"%s\"", textfilename);
+  }
+  
+  // init the query system
+  IndexData indexData;
+  if (!indexData.LoadData (basePath, indexfilename)) {
+    FatalError (1, "Couldn't load index information for \"%s\"", indexfilename);
+  }
+
+  // do querying
+  QueryInfo queryInfo;
+  SetCStr (queryInfo.docLevel, "Document");
+  queryInfo.maxDocs = 50;
+  queryInfo.sortByRank = true;
+  queryInfo.exactWeights = false;
+  queryInfo.needRankInfo = true;
+  queryInfo.needTermFreqs = true;
+  
+  ExtQueryResult queryResult;
+  char query[2048];
+  UCArray queryArray;
+  QueryNode *queryTree = NULL;
+
+
+  UCArray docLevel;
+  SetCStr(docLevel, "Document");
+
+  UCArray level;
+  UCArrayClear(level);
+  //SetCStr(level, "");
+   
+  int defaultStemMethod = 0; // uncasefolded, unstemmed
+  int defaultBoolCombine = 0; // OR
+  bool shortOutput = false;
+  BrowseQueryNode browseNode;
+  browseNode.startPosition = -10;
+  browseNode.numTerms = 40;
+
+  BrowseQueryResult browseResult;
+
+  while (true) {
+    cout << "> ";
+    cin.getline(query, 2048, '\n');
+    SetCStr (queryArray, query);
+
+    // check for commands
+    if (queryArray.size() >= 2 && queryArray[0] == '.') {
+      if (queryArray[1] == 'q') break;  // quit
+
+      if (queryArray[1] == 'h') { // help
+	printHelp();
+      }
+      if (queryArray[1] == 'i') {
+	cout << "current index="<< queryInfo.docLevel << "\nchange to index:";
+	cin >> query;
+	UCArrayClear(queryInfo.docLevel);
+	SetCStr(queryInfo.docLevel, query);
+	cout << "index set to " << queryInfo.docLevel <<"\n";
+	cin.getline(query, 2048, '\n');
+      }
+      if (queryArray[1] == 'l') {
+	cout << "current level="<< level << "\nchange to level:";
+	cin >> query;
+	UCArrayClear(level);
+	SetCStr(level, query);
+	cout << "level set to " << level <<"\n";
+	cin.getline(query, 2048, '\n');
+      }
+
+
+      else if (queryArray[1] == 'p') {
+	// print
+	UCArray docText;
+	unsigned long docNum = 0;
+	cin >> docNum;
+	cin.getline(query, 2048, '\n'); // eat up return
+
+	if (!GetDocText (textData, queryInfo.docLevel, docNum, docText)) {
+	  FatalError (1, "Error while trying to get document %u", docNum);
+	}
+
+	cout << docText << "\n";
+      }
+      else if (queryArray[1] == 't') { // query type - all/some
+	if (queryArray[2] == '1') defaultBoolCombine = 1;
+	else if (queryArray[2] == '0') defaultBoolCombine = 0;
+	else {
+	  cout << "Error: please enter .t0 (some) or .t1 (all)\n";
+	}
+      }
+      else if (queryArray[1] == 'r') { // ranking - on/off
+	if (queryArray[2] == '1') queryInfo.sortByRank = true;
+	else if (queryArray[2] == '0') queryInfo.sortByRank = false;
+	else {
+	  cout << "Error: please enter .r0 (non-ranked) or .r1 (ranked)\n";
+	}
+      }
+      else if (queryArray[1] == 'c') { // casefolding - on/off
+	if (queryArray[2] == '1') defaultStemMethod |= 1;
+	else if (queryArray[2] == '0') defaultStemMethod &= 0xe;
+	else {
+	  cout << "Error: please enter .c0 (case sensitive) or .c1 (casefolded)\n";
+	}
+      }
+      else if (queryArray[1] == 's') { // stemming - on/off
+	if (queryArray[2] == '1') defaultStemMethod |=2;
+	else if (queryArray[2] == '0') defaultStemMethod &=0xd;
+	else {
+	  cout << "Error: please enter .s0 (unstemmed) or .s1 (stemmed)\n";
+	}
+      }      
+      else if (queryArray[1] == 'o') { // output - short/long
+	if (queryArray[2] == '1') shortOutput = true;
+	else if (queryArray[2] == '0') shortOutput = false;
+	else {
+	  cout << "Error: please enter .o0 (long output) or .o1 (short output)\n";
+	}
+      }
+      else if (queryArray[1] == 'b') {
+	// full text browse
+	cout<<"enter a few letters to start browsing from:";
+	cin>>query;
+	UCArrayClear(browseNode.term);
+	SetCStr(browseNode.term, query);
+	cin.getline(query, 2048, '\n'); // get rest of line
+
+	// print the query
+	PrintNode (cout, &browseNode);
+
+	MGBrowseQuery(indexData, docLevel, browseNode, browseResult);
+	cout << browseResult;
+	cout << "\n";
+
+      }
+      else { // bad option
+	cout << "bad command\n\n";
+	printHelp();
+      }
+    } // if a .x query
+    else {
+      // regular query
+      queryTree = ParseQuery (queryArray, defaultBoolCombine, defaultStemMethod);
+
+      // print the query
+      PrintNode (cout, queryTree);
+
+      MGQuery (indexData, queryInfo, queryTree, queryResult, level);
+      if (shortOutput) {
+	queryResult.printShort(cout);
+	cout << "\n";
+      }else {
+	cout << queryResult;
+	cout << "\n";
+      }
+      // delete the query
+      if (queryTree != NULL) delete queryTree;
+      queryTree = NULL;
+    }
+  }
+
+
+  // clean up, everybody clean up
+  textData.UnloadData ();
+  indexData.UnloadData ();
+
+  return (0);
+}
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.cpp	(revision 21083)
@@ -0,0 +1,74 @@
+/**************************************************************************
+ *
+ * TagInfo.cpp -- 
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "TagInfo.h"
+
+
+void TagInfo::SetDocTag (const char *cStr) {
+  SetCStr (docTag, cStr);
+}
+
+void TagInfo::SetIndexLevel (const char *cStr) {
+  SetCStr (indexLevel, cStr);
+}
+void TagInfo::AddLevelTag (const char *cStr) {
+  // convert the string
+  UCArray cArr;
+  SetCStr (cArr, cStr);
+
+  // insert the tag
+  levelTags.insert (cArr);
+}
+
+
+TagInfo::TagInfo () {
+  Clear ();
+}
+
+void TagInfo::Clear () {
+  docTag.erase (docTag.begin(), docTag.end());
+  indexLevel.erase (indexLevel.begin(), indexLevel.end());
+  levelTags.erase (levelTags.begin(), levelTags.end());
+}
+
+ostream &operator<<(ostream &s, const TagInfo &t) {
+  // output docTag
+  s << "docTag: \"" << t.docTag << "\"\n";
+
+  // output indexLevel
+  s << "indexLevel: \"" << t.indexLevel << "\"\n";
+
+  // output levelTags
+  s << "levelTags: ";
+
+  UCArraySet::const_iterator here = t.levelTags.begin();
+  UCArraySet::const_iterator end = t.levelTags.end();
+  while (here != end) {
+    s << "\"" << (*here) << "\"";
+    here++;
+    if (here != end) s << ", ";
+  }
+
+  s << "\n";
+  
+  return s;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TagInfo.h	(revision 21083)
@@ -0,0 +1,46 @@
+/**************************************************************************
+ *
+ * TagInfo.h -- 
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef TAGINFO_H
+#define TAGINFO_H
+
+#include "UCArray.h"
+
+
+class TagInfo {
+public:
+  UCArray docTag;
+  UCArray indexLevel;    // empty for word level index
+  UCArraySet levelTags;
+
+  void SetDocTag (const char *cStr);
+  void SetIndexLevel (const char *cStr);
+  void AddLevelTag (const char *cStr);
+  
+  TagInfo ();
+  void Clear ();
+};
+
+// stream operator to print TagInfo
+ostream &operator<<(ostream &s, const TagInfo &t);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/Terms.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Terms.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Terms.cpp	(revision 21083)
@@ -0,0 +1,797 @@
+/**************************************************************************
+ *
+ * Terms.cpp -- Query related functions
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "Terms.h"
+#include "words.h"
+#include "stemmer.h"
+#include "bitio_gen.h"
+#include "bitio_m_stdio.h"
+
+void QueryInfo::Clear () {
+  UCArrayClear (docLevel);
+  maxDocs = 0;
+  sortByRank = true;
+  exactWeights = false;
+  needRankInfo = false;
+  needTermFreqs = false;
+}
+
+
+
+void TermFreqData::Clear () {
+  UCArrayClear (tag);
+  UCArrayClear (term);
+  equivTerms.erase(equivTerms.begin(), equivTerms.end());
+  stemMethod = 0;
+  matchDocs = 0;
+  termFreq = 0;
+}
+
+ostream &operator<< (ostream &s, const TermFreqData &t) {
+  s << "<" << t.tag << ">\"" << t.term << "\"stem("
+    << t.stemMethod << ")equiv terms(";
+  
+  unsigned long i;
+  for (i=0; i<t.equivTerms.size(); i++) {
+    s << t.equivTerms[i] << ", ";
+  }
+  s <<")docs(" << t.matchDocs << ")"
+    << "count("<<t.termFreq<<")";
+  return s;
+}
+
+bool operator== (const TermFreqData &t1, const TermFreqData &t2) {
+  return ((t1.tag == t2.tag) &&
+	  (t1.term == t2.term) &&
+	  (t1.stemMethod == t2.stemMethod) &&
+	  (t1.equivTerms == t2.equivTerms) &&
+	  (t1.matchDocs == t2.matchDocs) &&
+	  (t1.termFreq == t2.termFreq));
+}
+
+
+void QueryResult::Clear () {
+  docs.erase (docs.begin(), docs.end());
+  ranks.erase (ranks.begin(), ranks.end());
+  termFreqs.erase (termFreqs.begin(), termFreqs.end());
+  actualNumDocs = 0;
+}
+
+QueryResult::QueryResult () {
+  Clear ();
+}
+
+void QueryResult::printShort(ostream &s) {
+
+  s << "termFreqs: ";
+  for (unsigned long i=0; i<termFreqs.size(); i++)
+    s << termFreqs[i] << ", ";
+  
+  s << "\nactual number of docs found: " << actualNumDocs;
+  s << "\n\n";
+
+}
+
+
+ostream &operator<< (ostream &s, const QueryResult &r) {
+  s << "docs: ";
+  unsigned long i;
+  for (i=0; i<r.docs.size(); i++)
+    s << r.docs[i] << ", ";
+  
+  s << "\nranks: ";
+  for (i=0; i<r.ranks.size(); i++)
+    s << r.ranks[i] << ", ";
+
+  s << "\ntermFreqs: ";
+  for (i=0; i<r.termFreqs.size(); i++)
+    s << r.termFreqs[i] << ", ";
+
+  s << "\nactual number of docs found: " << r.actualNumDocs;
+  s << "\n\n";
+
+  return s;
+}
+
+
+bool operator== (const QueryResult &r1, const QueryResult &r2) {
+  return ((r1.docs == r2.docs) &&
+	  (r1.ranks == r2.ranks) &&
+	  (r1.termFreqs == r2.termFreqs) &&
+	  (r1.actualNumDocs == r2.actualNumDocs));
+}
+
+//---------------------------------------------------
+// new ExtQueryResult stuff
+void ExtQueryResult::Clear () {
+  docs.erase (docs.begin(), docs.end());
+  levels.erase (levels.begin(), levels.end());
+  ranks.erase (ranks.begin(), ranks.end());
+  termFreqs.erase (termFreqs.begin(), termFreqs.end());
+  actualNumDocs = 0;
+}
+
+ExtQueryResult::ExtQueryResult () {
+  Clear ();
+}
+
+ostream &operator<< (ostream &s, const ExtQueryResult &r) {
+  s << "docs: ";
+  unsigned long i;
+  for (i=0; i<r.docs.size(); i++)
+    s << r.docs[i] << ", ";
+
+  s << "\nlevels: ";
+  for (i=0; i<r.levels.size(); i++)
+    s << r.levels[i] << ", ";
+
+  
+  s << "\nranks: ";
+  for (i=0; i<r.ranks.size(); i++)
+    s << r.ranks[i] << ", ";
+
+  s << "\ntermFreqs: ";
+  for (i=0; i<r.termFreqs.size(); i++)
+    s << r.termFreqs[i] << ", ";
+  s << "\nactual number of docs found: " << r.actualNumDocs;
+  s << "\n\n";
+
+  return s;
+}
+
+
+bool operator== (const ExtQueryResult &r1, const ExtQueryResult &r2) {
+  return ((r1.docs == r2.docs) &&
+	  (r1.levels == r2.levels) &&
+	  (r1.ranks == r2.ranks) &&
+	  (r1.termFreqs == r2.termFreqs) &&
+	  (r1.actualNumDocs == r2.actualNumDocs));
+}
+
+//-------------------------------------------------------
+// new BrowseQueryResult stuff
+void BrowseQueryResult::Clear () {
+  termFreqs.erase (termFreqs.begin(), termFreqs.end());
+}
+
+BrowseQueryResult::BrowseQueryResult () {
+  Clear ();
+}
+
+
+
+ostream &operator<< (ostream &s, const BrowseQueryResult &r) {
+  s << "terms: ";
+  unsigned long i;
+  for (i=0; i<r.termFreqs.size(); i++)
+    s << r.termFreqs[i] << ", ";
+    s << "\n\n";
+  return s;
+}
+
+
+bool operator== (const BrowseQueryResult &r1, const BrowseQueryResult &r2) {
+  return ((r1.termFreqs == r2.termFreqs));
+	 
+}
+
+
+
+
+//--------------------------------------
+void FragData::Clear () {
+  matchDocs = 0;
+  fragNums.erase (fragNums.begin(), fragNums.end());
+  fragFreqs.erase (fragFreqs.begin(), fragFreqs.end());
+}
+
+
+
+
+void FindWordNumbers (IndexData &indexData,
+		      const UCArray &term,
+		      unsigned long stemMethod,
+		      vector<unsigned long> &equivWords) {
+  equivWords.erase (equivWords.begin(), equivWords.end());
+  
+  if (stemMethod == 0) {
+    // don't need to stem the word,
+    // find the word number for this term
+    unsigned long wordElNum = 0;
+    unsigned long numLevels = indexData.bdh.num_levels;
+    word_block_dict_el wordDictEl;
+    wordDictEl.SetNumLevels (numLevels);
+    if (SearchWordBlockDictEl (indexData.dictFile, indexData.biWords,
+			       indexData.bdh.entries_per_wblk,
+			       indexData.bdh.word_dict_size,
+			       numLevels, term, wordDictEl, wordElNum))
+      equivWords.push_back (wordElNum);
+    
+    return;
+    
+  }
+
+
+  // need to stem this word and find it in the blocked stem index
+  
+  unsigned char  mgWord[MAXSTEMLEN + 1];
+  UCArray stemTerm;
+  unsigned long stemmerNum = 0;
+  
+  if (stemMethod == 1) stemmerNum = indexData.sih1.stemmer_num;
+  else if (stemMethod == 2) stemmerNum = indexData.sih2.stemmer_num;
+  else if (stemMethod == 3) stemmerNum = indexData.sih3.stemmer_num;
+  
+  
+  // convert the word to an "mg word"
+  mgWord[0] = term.size();
+  memcpy ((char *)&mgWord[1], &(term[0]), term.size());
+  
+  // stem the word
+  stemmer (stemMethod, stemmerNum, mgWord);
+
+  // convert the result back to a UCArray
+  stemTerm.insert (stemTerm.end(), &mgWord[1], &mgWord[1] + mgWord[0]);
+
+  // need to look up this term in the appropriate dictionary
+  stem_block_dict_el stemDictEl;
+  unsigned long stemElNum;
+  bool result = false;
+  if (stemMethod == 1) {
+    result = SearchStemBlockDictEl (indexData.stem1File,
+			   indexData.sii1,
+			   indexData.sih1.entries_per_block,
+			   indexData.sih1.dict_size,
+			   stemTerm,
+			   stemDictEl,
+			   stemElNum);
+
+  } else if (stemMethod == 2) {
+    result = SearchStemBlockDictEl (indexData.stem2File,
+			   indexData.sii2,
+			   indexData.sih2.entries_per_block,
+			   indexData.sih2.dict_size,
+			   stemTerm,
+			   stemDictEl,
+			   stemElNum);
+
+  } else if (stemMethod == 3) {
+    result = SearchStemBlockDictEl (indexData.stem3File,
+			   indexData.sii3,
+			   indexData.sih3.entries_per_block,
+			   indexData.sih3.dict_size,
+			   stemTerm,
+			   stemDictEl,
+			   stemElNum);
+  }
+
+  if (result) {
+    equivWords = stemDictEl.equivWords;  
+  }
+}
+
+
+
+void ReadTermFragData (IndexData &indexData,
+		       bool needFragFreqs,
+		       unsigned long termNum,
+		       FragData &fragData,
+		       FragRangeArray *fragLimits,
+		       UCArray & termWord) {
+  fragData.Clear();
+
+  // look up the word in the dictionary
+  unsigned long numLevels = indexData.bdh.num_levels;
+  word_block_dict_el wordDictEl;
+  wordDictEl.SetNumLevels (numLevels);
+  if (!SearchWordBlockDictElNum (indexData.dictFile,
+				 indexData.biWords,
+				 indexData.bdh.entries_per_wblk,
+				 indexData.bdh.word_dict_size,
+				 numLevels,
+				 termNum, wordDictEl))
+    return; // nothing more to do
+
+  fragData.matchDocs = wordDictEl.levelFreqs[indexData.curLevelNum];
+  termWord = wordDictEl.el;
+  // seek to the appropriate place in the inverted file
+  fseek (indexData.invfFile, wordDictEl.invf_ptr, SEEK_SET);
+  stdio_bitio_buffer buffer (indexData.invfFile);
+    
+  unsigned long B = BIO_Bblock_Init (indexData.bdh.num_frags,
+				     wordDictEl.frag_occur);
+  unsigned long fragNum = 0;
+  unsigned long termFreq = 0;
+
+  unsigned long fragLimitI = 0;
+  unsigned long i;
+  for (i=0; i<wordDictEl.frag_occur; i++) {
+    fragNum += buffer.bblock_decode (B, NULL);
+    if (!indexData.ifh.word_level_index) termFreq = buffer.gamma_decode (NULL);
+    else termFreq = 1;
+
+    // get the right fragment range
+    if (fragLimits != NULL) {
+      while (fragLimitI+1 < (*fragLimits).size() &&
+	     fragNum > (*fragLimits)[fragLimitI+1].rangeStart) {
+	fragLimitI++;
+      }
+    }
+
+    // add the entry if it is within the limits
+    if ((fragLimits == NULL) ||
+	(fragLimitI < (*fragLimits).size() &&
+	 fragNum > (*fragLimits)[fragLimitI].rangeStart &&
+	 fragNum <= (*fragLimits)[fragLimitI].rangeEnd)) {
+      fragData.fragNums.push_back (fragNum);
+      if (needFragFreqs)
+	fragData.fragFreqs.push_back (termFreq);
+    }
+  }
+
+  buffer.done();
+}
+
+
+void CombineFragData (bool needFragFreqs,
+		      const FragData &f1,
+		      const FragData &f2,
+		      FragData &outFragData) {
+  outFragData.Clear();
+
+  // the new number of matching documents is the maximum
+  // of the two input matching number of documents -- it
+  // is assumed that these are at the same document level
+  outFragData.matchDocs = (f1.matchDocs > f2.matchDocs) ?
+    f1.matchDocs : f2.matchDocs;
+
+  // do or
+  unsigned long f1I = 0, f1Size = f1.fragNums.size();
+  unsigned long f2I = 0, f2Size = f2.fragNums.size();
+  while (f1I < f1Size || f2I < f2Size) {
+    if (f2I < f2Size &&
+	(f1I >= f1Size ||
+	 f1.fragNums[f1I] > f2.fragNums[f2I])) {
+      // output f2I
+      outFragData.fragNums.push_back (f2.fragNums[f2I]);
+      if (needFragFreqs)
+	outFragData.fragFreqs.push_back (f2.fragFreqs[f2I]);
+      f2I++;
+      
+    } else if (f1I < f1Size &&
+	       (f2I >= f2Size ||
+		f1.fragNums[f1I] < f2.fragNums[f2I])) {
+      // output f1I
+      outFragData.fragNums.push_back (f1.fragNums[f1I]);
+      if (needFragFreqs)
+	outFragData.fragFreqs.push_back (f1.fragFreqs[f1I]);
+      f1I++;
+      
+    } else {
+      // must be equal combine f1I and f2I
+      outFragData.fragNums.push_back (f1.fragNums[f1I]);
+      if (needFragFreqs)
+	outFragData.fragFreqs.push_back (f1.fragFreqs[f1I]+f2.fragFreqs[f2I]);
+      f1I++;
+      f2I++;
+    }
+  }
+}
+
+
+void AndCombineFragData (bool needFragFreqs,
+			 FragData &fragData,
+			 const FragData &comFragData,
+			 signed long startRange,
+			 signed long endRange,
+			 const FragRangeArray *fragLimits) {
+  // sanity check on range
+  if (startRange > endRange) {
+    signed long temp = endRange;
+    endRange = startRange;
+    startRange = temp;
+  }
+
+  // get min matchdocs
+  if (comFragData.matchDocs < fragData.matchDocs)
+    fragData.matchDocs = comFragData.matchDocs;
+  
+  unsigned long fragDataI = 0;
+  unsigned long fragDataSize = fragData.fragNums.size();
+  unsigned long comFragDataI = 0;
+  unsigned long comFragDataSize = comFragData.fragNums.size();
+  unsigned long fragLimitI = 0;
+  unsigned long fragLimitSize = (fragLimits==NULL) ? 0 : (*fragLimits).size();
+  unsigned long outI = 0;
+
+  while (fragDataI < fragDataSize &&
+	 comFragDataI < comFragDataSize) {
+    signed long fragNum = (signed long)fragData.fragNums[fragDataI];
+    signed long comFragNum = (signed long)comFragData.fragNums[comFragDataI];
+    
+    // go to the right fragment limit (for the com frag)
+    if (fragLimits != NULL) {
+      while (fragLimitI+1 < fragLimitSize &&
+	     comFragNum > (signed long)(*fragLimits)[fragLimitI+1].rangeStart) {
+	fragLimitI++;
+      }
+    }
+
+    if (fragNum <= comFragNum+startRange ||
+	(fragLimits!=NULL &&
+	 fragNum<=(signed long)(*fragLimits)[fragLimitI].rangeStart)) {
+      fragDataI++;
+      
+    } else if (fragNum > comFragNum+endRange ||
+	       (fragLimits!=NULL &&
+		fragNum>(signed long)(*fragLimits)[fragLimitI].rangeEnd)) {
+      comFragDataI++;
+      
+    } else {
+      // equal and within tag
+      fragData.fragNums[outI] = comFragNum;
+      if (needFragFreqs) {
+	fragData.fragFreqs[outI] =
+	  (fragData.fragFreqs[fragDataI] < comFragData.fragFreqs[comFragDataI]) ?
+	  fragData.fragFreqs[fragDataI] : comFragData.fragFreqs[comFragDataI];
+      }
+      fragDataI++;
+      comFragDataI++;
+      outI++;
+    }
+  }
+
+  // erase unused part of fragData
+  fragData.fragNums.erase (fragData.fragNums.begin()+outI,
+			   fragData.fragNums.end());
+  if (needFragFreqs)
+    fragData.fragFreqs.erase (fragData.fragFreqs.begin()+outI,
+			      fragData.fragFreqs.end());
+  else
+    fragData.fragFreqs.erase (fragData.fragFreqs.begin(),
+			      fragData.fragFreqs.end());
+}
+
+
+void FragsToQueryResult (IndexData &indexData,
+			 const QueryInfo &queryInfo,
+			 const FragData &termData,
+			 const UCArray &tag,
+			 const UCArray &term,
+			 unsigned long stemMethod,
+			 unsigned long termWeight,
+			 UCArrayVector &equivTerms,
+			 QueryResult &result) {
+  bool needRanks = (queryInfo.sortByRank || queryInfo.needRankInfo);
+  
+  result.Clear();
+
+  // log (N / ft)
+  unsigned long N = indexData.levels.levelInfo[indexData.curLevel].numEntries;
+  float wordLog = log((double)N / (double)termData.matchDocs);
+
+  // Wqt = fqt * log (N / ft)
+  // note: terms are allowed to have a weight of zero so
+  // they can be excluded from the ranking
+  float Wqt = termWeight * wordLog;
+
+  // Wdt = fdt * log (N / ft)
+  float Wdt;
+  
+  unsigned long termDataI = 0;
+  unsigned long termDataSize = termData.fragNums.size();
+  unsigned long levelDocNum = 0;
+  
+  unsigned long termDocFreq = 0;
+  unsigned long lastLevelDocNum = 0;
+  unsigned long overallwordfreq = 0;
+  
+  while (termDataI < termDataSize) {
+    if (indexData.levelConverter.FragToLevel (termData.fragNums[termDataI],
+					      levelDocNum)) {
+      if (levelDocNum != lastLevelDocNum) {
+	if (lastLevelDocNum > 0) {
+	  // add this doc information
+	  if (needRanks) {
+	    Wdt = termDocFreq * wordLog;
+	    result.ranks.push_back (Wqt * Wdt);
+	  }
+	  result.docs.push_back (lastLevelDocNum);
+	}
+	
+	lastLevelDocNum = levelDocNum;
+	termDocFreq = 0;
+      }
+
+      if (needRanks){
+	termDocFreq += termData.fragFreqs[termDataI];
+	overallwordfreq += termData.fragFreqs[termDataI];
+      }
+    }
+    termDataI++;
+  }
+
+  if (lastLevelDocNum > 0) {
+    // add the last document information
+    if (needRanks) {
+      Wdt = termDocFreq * wordLog;
+      result.ranks.push_back (Wqt * Wdt);
+    }
+    result.docs.push_back (lastLevelDocNum);
+  }
+
+  // add the term frequency information
+  if (queryInfo.needTermFreqs) {
+    TermFreqData termFreqData;
+    termFreqData.tag = tag;
+    termFreqData.term = term;
+    termFreqData.stemMethod = stemMethod;
+    termFreqData.equivTerms = equivTerms;
+    termFreqData.matchDocs = termData.matchDocs;
+    termFreqData.termFreq = overallwordfreq; // will be zero if needRankInfo 
+                                              //not true
+    result.termFreqs.push_back (termFreqData);
+  }
+}
+
+void AndFragsToQueryResult (IndexData &indexData,
+			    const QueryInfo &queryInfo,
+			    const FragData &termData,
+			    const UCArray &tag,
+			    const UCArray &term,
+			    unsigned long stemMethod,
+			    unsigned long termWeight,
+			    UCArrayVector &equivTerms,
+			    QueryResult &result) {
+  bool needRanks = (queryInfo.sortByRank || queryInfo.needRankInfo);
+  
+  // log (N / ft)
+  float wordLog =
+    log((double)indexData.levels.levelInfo[indexData.curLevel].numEntries/
+	(double)termData.matchDocs);
+
+  // Wqt = fqt * log (N / ft)
+  // note: terms are allowed to have a weight of zero so
+  // they can be excluded from the ranking
+  float Wqt = termWeight * wordLog;
+
+  // Wdt = fdt * log (N / ft)
+  float Wdt;
+  
+  unsigned long termDataI = 0;
+  unsigned long termDataSize = termData.fragNums.size();
+  unsigned long levelDocNum = 0;
+  
+  unsigned long termDocFreq = 0;
+  unsigned long lastLevelDocNum = 0;
+  unsigned long overallwordfreq = 0;
+  unsigned long resultI = 0;
+  unsigned long resultSize = result.docs.size();
+  unsigned long resultOutI = 0;
+  
+  
+  while (termDataI < termDataSize) {
+    if (indexData.levelConverter.FragToLevel (termData.fragNums[termDataI],
+					      levelDocNum)) {
+      if (levelDocNum != lastLevelDocNum) {
+	if (lastLevelDocNum > 0) {
+	  // add this doc information
+	  Wdt = termDocFreq * wordLog;
+	  
+	  // find this document number
+	  while (resultI < resultSize &&
+		 result.docs[resultI] < lastLevelDocNum)
+	    resultI++;
+	  
+	  // store the result
+	  if (resultI < resultSize && result.docs[resultI] == lastLevelDocNum) {
+	    result.docs[resultOutI] = lastLevelDocNum;
+	    if (needRanks)
+	      result.ranks[resultOutI] = result.ranks[resultI] + Wqt * Wdt;
+	    resultI++;
+	    resultOutI++;
+	  }
+	}
+	
+	lastLevelDocNum = levelDocNum;
+	termDocFreq = 0;
+      }
+
+      if (needRanks)
+	termDocFreq += termData.fragFreqs[termDataI];
+     overallwordfreq += termData.fragFreqs[termDataI]; 
+    }
+    
+    termDataI++;
+  } // while
+
+  if (lastLevelDocNum > 0) {
+    // add the last document information
+    Wdt = termDocFreq * wordLog;
+
+    // find this document number
+    while (resultI < resultSize &&
+	   result.docs[resultI] < lastLevelDocNum)
+      resultI++;
+    
+    // store the result
+    if (resultI < resultSize && result.docs[resultI] == lastLevelDocNum) {
+      result.docs[resultOutI] = lastLevelDocNum;
+      if (needRanks)
+	result.ranks[resultOutI] = result.ranks[resultI] + Wqt * Wdt;
+      resultI++;
+      resultOutI++;
+    }
+  }
+
+  // remove unneeded entries
+  result.docs.erase (result.docs.begin()+resultOutI, result.docs.end());
+  if (needRanks)
+    result.ranks.erase (result.ranks.begin()+resultOutI, result.ranks.end());
+  else
+    result.ranks.erase (result.ranks.begin(), result.ranks.end());
+  
+  // add the term frequency information
+  if (queryInfo.needTermFreqs) {
+    TermFreqData termFreqData;
+    termFreqData.tag = tag;
+    termFreqData.term = term;
+    termFreqData.stemMethod = stemMethod;
+    termFreqData.equivTerms = equivTerms;
+    termFreqData.matchDocs = termData.matchDocs;
+    termFreqData.termFreq = overallwordfreq;
+    result.termFreqs.push_back (termFreqData);
+  }
+}
+
+
+void RemoveUnwantedResults (IndexData &indexData,
+			    const QueryInfo &queryInfo,
+			    const FragData &termData,
+			    QueryResult &result) {
+  bool needRanks = (queryInfo.sortByRank || queryInfo.needRankInfo);
+
+  unsigned long termDataI = 0;
+  unsigned long termDataSize = termData.fragNums.size();
+  unsigned long levelDocNum = 0;
+  
+  unsigned long lastLevelDocNum = 0;
+
+  unsigned long resultI = 0;
+  unsigned long resultSize = result.docs.size();
+  unsigned long resultOutI = 0;
+  
+  while (termDataI < termDataSize) {
+    if (indexData.levelConverter.FragToLevel (termData.fragNums[termDataI],
+					      levelDocNum)) {
+      if (levelDocNum != lastLevelDocNum) {
+	if (lastLevelDocNum > 0) {
+	  // find this document number
+	  while (resultI < resultSize &&
+		 result.docs[resultI] < lastLevelDocNum)
+	    resultI++;
+	  
+	  // store the result
+	  if (resultI < resultSize && result.docs[resultI] == lastLevelDocNum) {
+	    result.docs[resultOutI] = lastLevelDocNum;
+	    if (needRanks)
+	      result.ranks[resultOutI] = result.ranks[resultI];
+	    resultI++;
+	  resultOutI++;
+	  }
+	}
+	
+	lastLevelDocNum = levelDocNum;
+      }
+    }
+    
+    termDataI++;
+  }
+
+  if (lastLevelDocNum > 0) {
+    // find this document number
+    while (resultI < resultSize &&
+	   result.docs[resultI] < lastLevelDocNum)
+      resultI++;
+    
+    // store the result
+    if (resultI < resultSize && result.docs[resultI] == lastLevelDocNum) {
+      result.docs[resultOutI] = lastLevelDocNum;
+      if (needRanks) 
+	result.ranks[resultOutI] = result.ranks[resultI];
+      resultI++;
+      resultOutI++;
+    }
+  }
+
+  // remove unneeded entries
+  result.docs.erase (result.docs.begin()+resultOutI, result.docs.end());
+  if (needRanks)
+    result.ranks.erase (result.ranks.begin()+resultOutI, result.ranks.end());
+  else
+    result.ranks.erase (result.ranks.begin(), result.ranks.end());
+}
+
+
+
+//--------------------------------------------------------------
+// functions to support full text browse
+
+void FindNearestWordNumber (IndexData &indexData,
+			    const UCArray &term,
+			    unsigned long &number) {
+
+    // find the word number for this term
+    unsigned long wordElNum = 0;
+    unsigned long numLevels = indexData.bdh.num_levels;
+    word_block_dict_el wordDictEl;
+    wordDictEl.SetNumLevels (numLevels);
+    if (NearestSearchWordBlockDictEl (indexData.dictFile, indexData.biWords,
+				      indexData.bdh.entries_per_wblk,
+				      indexData.bdh.word_dict_size,
+				      numLevels, term, wordDictEl, wordElNum))
+      number = wordElNum;
+
+}
+
+void GetTermList(IndexData &indexData,
+		 unsigned long startTerm,
+		 unsigned long numTerms,
+		 TermFreqArray &terms) {
+
+  word_block_dict_el_array wordBlocks; // = new word_block_dict_el_array();
+  TermFreqData termdata;
+
+  terms.erase(terms.begin(), terms.end());
+
+  SearchWordBlockDictElNumRange (indexData.dictFile, indexData.biWords,
+				 indexData.bdh.entries_per_wblk,
+				 indexData.bdh.word_dict_size,
+				 indexData.bdh.num_levels, startTerm,
+				 numTerms, wordBlocks);
+
+  word_block_dict_el_array::iterator here = wordBlocks.begin();
+  word_block_dict_el_array::iterator end = wordBlocks.end();
+
+  while (here != end) {
+    termdata.Clear();
+    termdata.term = (*here).el;
+    termdata.termFreq = (*here).freq;
+    terms.push_back(termdata);
+    here++;
+  }
+
+}
+
+void GetTermList(IndexData &indexData,
+		 unsigned long startTerm,
+		 unsigned long numTerms,
+		 UCArrayVector &terms) {
+
+  
+  
+  SearchWordBlockDictElNumRange (indexData.dictFile, indexData.biWords,
+				 indexData.bdh.entries_per_wblk,
+				 indexData.bdh.word_dict_size,
+				 indexData.bdh.num_levels, startTerm,
+				 numTerms, terms);
+
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/Terms.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Terms.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Terms.h	(revision 21083)
@@ -0,0 +1,215 @@
+/**************************************************************************
+ *
+ * Terms.h -- Query related functions
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef TERMS_H
+#define TERMS_H
+
+#include "IndexData.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+class QueryInfo {
+public:
+  // general query information
+  UCArray docLevel;
+  unsigned long maxDocs; // 0 = all
+  bool sortByRank;
+  bool exactWeights;
+
+  // information need to return
+  bool needRankInfo;
+  bool needTermFreqs;
+
+  void Clear ();
+  QueryInfo () { Clear (); }
+};
+
+
+class TermFreqData {
+public:
+  UCArray tag;  // level tag or query tag
+  UCArray term; // unstemmed term
+  int stemMethod;
+  UCArrayVector equivTerms; // the stemmed and casefolded variants of the term
+  unsigned long matchDocs; // tf for level - num levels
+			   // containing this term
+  unsigned long termFreq;  // overall term freq - num words that
+				// are this term
+  void Clear ();
+  TermFreqData () { Clear (); }
+};
+
+ostream &operator<< (ostream &s, const TermFreqData &t);
+bool operator== (const TermFreqData &t1, const TermFreqData &t2);
+
+typedef vector<TermFreqData> TermFreqArray;
+
+
+typedef vector<float> RankArray;
+typedef vector<unsigned long> DocNumArray;
+
+class QueryResult {
+public:
+  DocNumArray docs;
+  RankArray ranks; // used for accumulators during query
+  
+  TermFreqArray termFreqs;
+
+  unsigned long actualNumDocs;
+  void Clear ();
+  QueryResult ();
+  void printShort(ostream &s);
+};
+
+ostream &operator<< (ostream &s, const QueryResult &r);
+bool operator== (const QueryResult &r1, const QueryResult &r2);
+
+typedef vector<unsigned long> FragNumArray;
+typedef vector<unsigned long> FragFreqArray;
+
+class FragData {
+public:
+  unsigned long matchDocs;    // ft for level
+  FragNumArray fragNums;
+  FragFreqArray fragFreqs;
+
+  void Clear ();
+  FragData () { Clear (); }
+};
+
+
+class FragRange {
+public:
+  unsigned long rangeStart;
+  unsigned long rangeEnd;
+
+  void Clear () { rangeStart = rangeEnd = 0; }
+  FragRange () { Clear (); }
+};
+
+typedef vector<FragRange> FragRangeArray;
+
+
+
+void FindWordNumbers (IndexData &indexData,
+		      const UCArray &term,
+		      unsigned long stemMethod,
+		      vector<unsigned long> &equivWords);
+
+void ReadTermFragData (IndexData &indexData,
+		       bool needFragFreqs,
+		       unsigned long termNum,
+		       FragData &fragData,
+		       FragRangeArray *fragLimits,
+		       UCArray &termWord);
+
+void CombineFragData (bool needFragFreqs,
+		      const FragData &f1,
+		      const FragData &f2,
+		      FragData &outFragData);
+
+// output will be in fragData (as this is an and operation)
+void AndCombineFragData (bool needFragFreqs,
+			 FragData &fragData,
+			 const FragData &comFragData,
+			 signed long startRange,
+			 signed long endRange,
+			 const FragRangeArray *fragLimits);
+
+void FragsToQueryResult (IndexData &indexData,
+			 const QueryInfo &queryInfo,
+			 const FragData &termData,
+			 const UCArray &tag,
+			 const UCArray &term,
+			 unsigned long stemMethod,
+			 unsigned long termWeight,
+			 UCArrayVector &equivTerms,
+			 QueryResult &result);
+
+void AndFragsToQueryResult (IndexData &indexData,
+			    const QueryInfo &queryInfo,
+			    const FragData &termData,
+			    const UCArray &tag,
+			    const UCArray &term,
+			    unsigned long stemMethod,
+			    unsigned long termWeight,
+			    UCArrayVector &equivTerms,
+			    QueryResult &result);
+
+void RemoveUnwantedResults (IndexData &indexData,
+			    const QueryInfo &queryInfo,
+			    const FragData &termData,
+			    QueryResult &result);
+
+//-----------------------------------------------------------------
+// new QueryResult class to handle retrieval of doc and level nums.
+// Use this class with extended version of MGQuery
+
+class ExtQueryResult : public QueryResult {
+public:
+  DocNumArray levels; // used for returning a different granularity, eg
+  // search sections but return Document numbers, or search Documents, 
+  // return Section numbers.
+ 
+  void Clear ();
+  ExtQueryResult ();
+};
+
+ostream &operator<< (ostream &s, const ExtQueryResult &r);
+bool operator== (const ExtQueryResult &r1, const ExtQueryResult &r2);
+
+//------------------------------------------------------------
+// new functions to handle full text browse
+
+class BrowseQueryResult {
+ public:
+  TermFreqArray termFreqs;
+  void Clear();
+  BrowseQueryResult ();
+
+};
+
+
+ostream &operator<< (ostream &s, const BrowseQueryResult &r);
+bool operator== (const BrowseQueryResult &r1, const BrowseQueryResult &r2);
+
+void FindNearestWordNumber (IndexData &indexData,
+			    const UCArray &term,
+			    unsigned long &number);
+
+void GetTermList(IndexData &indexData,
+		 unsigned long startTerm,
+		 unsigned long numTerms,
+		 TermFreqArray &terms);
+
+void GetTermList (IndexData &indexData,
+		 unsigned long startTerm,
+		 unsigned long numTerms,
+		 UCArrayVector &terms);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/TextEl.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TextEl.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TextEl.cpp	(revision 21083)
@@ -0,0 +1,211 @@
+/**************************************************************************
+ *
+ * TextEl.cpp -- Data structures for parsed documents
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "TextEl.h"
+#include "ctype.h"
+
+#define REC_TERM   '\002'
+#define PARA_TERM  '\003'
+
+
+void TextEl::Clear () {
+  elType = TextE;
+  tagName.erase (tagName.begin(), tagName.end());
+  text.erase (text.begin(), text.end());
+}
+
+
+static bool ReadTextTag (FileBuf &buf, TextEl &el) {
+  // we must have some sort of tag
+  unsigned char c;
+  if (!buf.Peek(c)) return false;
+  
+  // get the '<'
+  if (c != '<') return false;
+  el.text.push_back (c);
+  if (!buf.Next() || !buf.Peek (c)) return false;
+  
+  // see if we have a '/'
+  if (c == '/') {
+    // we have a closing tag
+    el.text.push_back (c);
+    if (!buf.Next() || !buf.Peek (c)) return false;
+    el.elType = CloseTagE;
+  } else {
+    // we have an opening tag
+    el.elType = OpenTagE;
+  }
+
+  // get the tag name
+  while (isalnum(c)) {
+    el.text.push_back (c);
+    el.tagName.push_back (c);
+    if (!buf.Next() || !buf.Peek (c)) return false;
+  }
+  
+  // get everything up to the closing '>'
+  while (c != '>') {
+    el.text.push_back (c);
+    if (!buf.Next() || !buf.Peek (c)) return false;
+  }
+
+  // get the closing '>'
+  el.text.push_back (c);
+  buf.Next();
+
+  // if there is no tag name then make this a text element
+  if (el.tagName.empty()) el.elType = TextE;
+  
+  return true;
+}
+
+static void ToggleParaTag (TextEl &el, bool &compatInPara) {
+  SetCStr (el.tagName, "Paragraph");
+  el.text.erase (el.text.begin(), el.text.end());
+  if (compatInPara) {
+    el.elType = CloseTagE;
+    el.text.push_back (PARA_TERM);
+  } else el.elType = OpenTagE;
+  compatInPara = !compatInPara;
+}
+
+static void SetRecTag (TextEl &el, TextElType elType) {
+  el.elType = elType;
+  SetCStr (el.tagName, "Document");
+  el.text.erase (el.text.begin(), el.text.end());
+  if (elType == CloseTagE)
+    el.text.push_back (REC_TERM);
+}
+
+
+bool ReadTextEl (FileBuf &buf, TextEl &el,
+		 bool compatMode, bool &compatInPara) {
+  el.Clear();
+
+  unsigned char c;
+  if (!buf.Peek (c)) return false;
+
+  if (compatMode) {
+    if (c == PARA_TERM) {
+      ToggleParaTag (el, compatInPara);
+      if (!compatInPara) buf.Next();
+      return true;
+    }
+    if (c == REC_TERM) {
+      if (compatInPara) {
+	// need to close this paragraph
+	ToggleParaTag (el, compatInPara);
+	return true;
+      }
+      // can close this document
+      buf.Next();
+      SetRecTag (el, CloseTagE);
+      return true;
+    }
+    if (!compatInPara) {
+      // need to open a paragraph
+      ToggleParaTag (el, compatInPara);
+      return true;
+    }
+  }
+  
+  // see if we have some sort of tag
+  if (c == '<') return ReadTextTag (buf, el);
+
+  // read in a text element
+  el.elType = TextE;
+  while (c != '<' && !(compatMode && (c == PARA_TERM || c == REC_TERM))) {
+    el.text.push_back (c);
+    if (!buf.Next() || !buf.Peek (c)) break;
+  }
+
+  return true;
+}
+
+static void AddTextEl (TextElArray &doc, unsigned long &docLen,
+		       const TextEl &el) {
+  doc.push_back (el);
+  docLen += el.text.size();
+
+//    cout << "elType:  " << el.elType << "\n";
+//    cout << "tagName: " << el.tagName << "\n";
+//    cout << "text:    \"" << el.text << "\"\n\n";
+}
+
+
+bool ReadDoc (FileBuf &buf, const UCArray &docTag,
+	      TextElArray &doc, unsigned long &docLen,
+	      bool compatMode) {
+  bool compatInPara = false;
+  bool foundDocEl = false;
+  TextEl el;
+  
+  doc.erase (doc.begin(), doc.end());
+  docLen = 0;
+
+  if (compatMode) {
+    // add <Document><Paragraph>
+    SetRecTag (el, OpenTagE);
+    AddTextEl (doc, docLen, el);
+    ToggleParaTag (el, compatInPara);
+    AddTextEl (doc, docLen, el);
+    
+  } else {
+    // look for an opening docTag
+    do {
+      if (!ReadTextEl (buf, el, compatMode, compatInPara)) return false;
+    } while (el.elType != OpenTagE || el.tagName != docTag);
+    
+    AddTextEl (doc, docLen, el);
+  }
+
+  
+  // get all elements until the closing docTag
+  while (ReadTextEl (buf, el, compatMode, compatInPara)) {
+    foundDocEl = true;
+    AddTextEl (doc, docLen, el);
+    if (el.elType == CloseTagE && el.tagName == docTag)
+      return true;
+  }
+
+  
+  if (compatMode) {
+    if (!foundDocEl) { // end of text
+      doc.erase (doc.begin(), doc.end());
+      return false;
+    }
+
+    // if we got here then the eof was encountered before
+    // the closing document tag
+    if (compatInPara) {
+      // need to close this paragraph
+      ToggleParaTag (el, compatInPara);
+      AddTextEl (doc, docLen, el);
+    }
+    // close this document
+    SetRecTag (el, CloseTagE);
+    AddTextEl (doc, docLen, el);
+  }
+  
+  return true;
+}
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/TextEl.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TextEl.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TextEl.h	(revision 21083)
@@ -0,0 +1,62 @@
+/**************************************************************************
+ *
+ * TextEl.h -- Data structures for parsed documents
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef TEXTEL_H
+#define TEXTEL_H
+
+#include "UCArray.h"
+#include "FileBuf.h"
+
+
+enum TextElType {OpenTagE, CloseTagE, TextE};
+
+class TextEl {
+protected:
+  bool ReadTextTag (FileBuf &buf, TextEl &el);
+public:
+  TextElType elType;
+  UCArray tagName;
+  UCArray text; // complete text, including tag
+
+  TextEl () { Clear (); }
+  void Clear ();
+};
+
+
+typedef vector<TextEl> TextElArray;
+
+
+// compatMode parses documents similar to "old mg" -- ie with
+// C-b between documents and C-c between paragraphs
+
+// returns true if a text element could be read
+bool ReadTextEl (FileBuf &buf, TextEl &el,
+		 bool compatMode, bool &compatInPara);
+
+// looks for an opening docTag and reads all text elements up
+// to a corresponding closing docTag. note that this does not
+// hierarchically parse the document so you can't nest documents.
+// returns true if a document could be found
+bool ReadDoc (FileBuf &buf, const UCArray &docTag,
+	      TextElArray &doc, unsigned long &docLen,
+	      bool compatMode=false);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/TextGet.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TextGet.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TextGet.cpp	(revision 21083)
@@ -0,0 +1,681 @@
+/**************************************************************************
+ *
+ * TextGet.cpp -- Decompressing the text
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#include "TextGet.h"
+#include "mg_files.h"
+#include "netorder.h"
+#include "mg_errors.h"
+#include "locallib.h"
+#include "words.h"
+#include "local_strings.h"
+#include "bitio_m_stdio.h"
+
+typedef enum huff_type {lengths, chars};
+
+
+static auxiliary_dict *LoadAuxDict (compression_dict &cd, FILE *text_aux_dict) {
+  auxiliary_dict *ad;
+  int i;
+
+  if (!(ad = new auxiliary_dict))
+    {
+      mg_errno = MG_NOMEM;
+      return (NULL);
+    }
+
+  memset (ad, '\0', sizeof (*ad));
+
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+      u_char *pos;
+
+      fread (&ad->afh[i], sizeof (aux_frags_header), 1, text_aux_dict);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(ad->afh[i].num_frags);
+      NTOHUL(ad->afh[i].mem_for_frags);
+
+      if (!(ad->word_data[i] = new u_char[ad->afh[i].mem_for_frags]))
+	{
+	  mg_errno = MG_NOMEM;
+	  delete ad;
+	  return (NULL);
+	}
+      if (!(ad->words[i] = new u_char* [ad->afh[i].num_frags]))
+	{
+	  mg_errno = MG_NOMEM;
+	  delete ad;
+	  return (NULL);
+	}
+
+      fread (ad->word_data[i], ad->afh[i].mem_for_frags, sizeof (u_char),
+	     text_aux_dict);
+
+      pos = ad->word_data[i];
+      for (j = 0; j < (int)ad->afh[i].num_frags; j++)
+	{
+	  ad->words[i][j] = pos;
+	  pos += *pos + 1;
+	}
+      if (cd.cdh.novel_method == MG_NOVEL_HYBRID)
+	{
+	  int num;
+	  num = 1;
+	  ad->blk_start[i][0] = 0;
+	  ad->blk_end[i][0] = cd.cdh.num_words[i] - 1;
+	  while (num < 33)
+	    {
+	      ad->blk_start[i][num] = ad->blk_end[i][num - 1] + 1;
+	      ad->blk_end[i][num] = ad->blk_start[i][num] +
+		(ad->blk_end[i][num - 1] - ad->blk_start[i][num - 1]) * 2;
+	      num++;
+	    }
+	}
+    }
+  return (ad);
+}
+
+
+static u_char ***ReadInWords (FILE *dict, compression_dict &cd,
+			      comp_frags_header *cfh, u_char **escape) {
+  int i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+  int num_set[MAX_HUFFCODE_LEN + 1];
+  u_char *next_word[MAX_HUFFCODE_LEN + 1];
+  u_char **vals;
+  u_char ***values;
+  u_char word[MAXWORDLEN + 1];
+  u_char last_word[MAX_HUFFCODE_LEN + 1][MAXWORDLEN + 1];
+
+  lookback = cd.cdh.lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++) {
+    ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+    mem_reqd += cfh->huff_words_size[i];
+  }
+
+  if (!(vals = new u_char* [ptrs_reqd]))
+    return (NULL);
+
+  if (!(values = new u_char** [MAX_HUFFCODE_LEN + 1]))
+    return (NULL);
+
+  if (!(next_word[0] = new u_char[mem_reqd])) 
+    return (NULL);
+
+  cd.MemForCompDict += ptrs_reqd * sizeof (*vals) +
+    (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **) +
+    mem_reqd;
+
+  values[0] = vals;
+  values[0][0] = next_word[0];
+  for (i = 1; i <= cfh->hd.maxcodelen; i++)
+    {
+      int next_start = (values[i - 1] - vals) +
+      ((cfh->hd.lencount[i - 1] + ((1 << lookback) - 1)) >> lookback);
+      values[i] = &vals[next_start];
+      next_word[i] = next_word[i - 1] + cfh->huff_words_size[i - 1];
+      values[i][0] = next_word[i];
+    }
+
+  memset (num_set, '\0', sizeof (num_set));
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val, copy;
+      register int len = cfh->hd.clens[i];
+      val = getc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      fread (word + copy + 1, sizeof (u_char), val, dict);
+      *word = val + copy;
+
+      if ((num_set[len] & ((1 << lookback) - 1)) == 0)
+	{
+	  values[len][num_set[len] >> lookback] = next_word[len];
+	  memcpy (next_word[len], word, *word + 1);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    *escape = next_word[len];
+	  next_word[len] += *word + 1;
+	}
+      else
+	{
+	  copy = prefixlen (last_word[len], word);
+	  memcpy (next_word[len] + 1, word + copy + 1, *word - copy);
+	  *next_word[len] = (copy << 4) + (*word - copy);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    *escape = next_word[len];
+	  next_word[len] += (*word - copy) + 1;
+	}
+      memcpy (last_word[len], word, *word + 1);
+      num_set[len]++;
+    }
+  if (cfh->hd.clens)
+    delete cfh->hd.clens;
+  cfh->hd.clens = NULL;
+  return values;
+}
+
+static int Load_Comp_HuffData(compression_dict &cd, int which, FILE *dict, 
+			      huff_type type) {
+  huff_data * hd;
+  u_long **   vals;
+
+  if (!(hd = new huff_data))
+    return 1;
+  cd.MemForCompDict += sizeof (huff_data);
+  if (Read_Huffman_Data (dict, hd, &cd.MemForCompDict, NULL) == -1)
+    return 2;
+  if (!(vals = Generate_Huffman_Vals (hd, &cd.MemForCompDict)))
+    return 3;
+  if (hd->clens)
+    delete hd->clens;
+  hd->clens = NULL;
+  if (type == chars)
+    {
+      cd.chars_huff[which] = hd;
+      cd.chars_vals[which] = vals;
+    }
+  else
+    {
+      cd.lens_huff[which] = hd;
+      cd.lens_vals[which] = vals;
+    }
+
+  return 0;
+}
+
+static int Load_Comp_FragsHeader(compression_dict &cd, int which, int getEscape,
+				 FILE *dict) {
+  if (!(cd.cfh[which] = new comp_frags_header))
+    return 1;
+  cd.MemForCompDict += sizeof (*cd.cfh[which]);
+  if (Read_cfh (dict, cd.cfh[which], &cd.MemForCompDict, NULL) == -1)
+    return 2;
+
+  if (!(cd.values[which] = ReadInWords (dict, cd, cd.cfh[which],
+					getEscape == 0 ? NULL : &cd.escape[which])))
+    return 3;
+  
+  return 0;
+}
+
+static bool LoadSlowCompDict (FILE *dict, FILE *aux_dict, compression_dict &cd) {
+  if (dict == NULL) return false;
+
+  int which;
+
+  memset (&cd, '\0', sizeof (compression_dict));
+
+  cd.MemForCompDict = sizeof (compression_dict);
+
+  if (Read_cdh (dict, &cd.cdh, &cd.MemForCompDict, NULL) == -1)
+    return false;
+
+  for (which = 0; which < 2; which++)
+    switch (cd.cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  if (Load_Comp_FragsHeader(cd, which, 0, dict) != 0)
+	    return false;
+	  cd.escape[which] = NULL;
+
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (cd.cdh.num_words[which])
+	    {
+	      if (Load_Comp_FragsHeader(cd, which, 1, dict) != 0)
+		return false;
+	    }
+
+	  if (Load_Comp_HuffData(cd, which, dict, chars) != 0)
+	    return false;
+
+	  if (Load_Comp_HuffData(cd, which, dict, lengths) != 0)
+	    return false;
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (cd.cdh.num_words[which])
+	    {
+	      if (Load_Comp_FragsHeader(cd, which, 1, dict) != 0)
+		return false;
+	    }
+	  switch (cd.cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      if (Load_Comp_HuffData(cd, which, dict, chars) != 0)
+		return false;
+
+	      if (Load_Comp_HuffData(cd, which, dict, lengths) != 0)
+		return false;
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    }
+	  break;
+	}
+      }
+
+  if (cd.cdh.novel_method == MG_NOVEL_DELTA ||
+      cd.cdh.novel_method == MG_NOVEL_HYBRID)
+    {
+      if (!aux_dict)
+	{
+	  mg_errno = MG_NOFILE;
+	  cd.Clear();
+	  return false;
+	}
+
+      if (!(cd.ad = LoadAuxDict (cd, aux_dict)))
+	{
+	  cd.Clear();
+	  return false;
+	}
+    }
+
+  mg_errno = MG_NOERROR;
+
+  cd.fast_loaded = 0;
+  
+  return true;
+}
+
+
+
+#define WORDNO(p, base) ((((char*)(p))-((char*)(base)))/sizeof(u_char*))
+#define IS_FIXUP(p) ((fixup[WORDNO(p,cd)/8] & (1<<(WORDNO(p,cd) & 7))) != 0)
+
+// fast loading really needs to be totally re-writen. "Unloading" the
+// text data will currently cause a crash because memory is being
+// deleted multiple times (and probably a zillion other reasons).
+static bool LoadFastCompDict (FILE *text_fast_comp_dict, compression_dict &_cd) {
+  if (text_fast_comp_dict == NULL) return false;
+  
+  u_long *p, *end;
+  u_char *fixup;
+  u_long mem;
+  u_long fixup_mem;
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  fread (&mem, sizeof (mem), 1, text_fast_comp_dict);
+  NTOHUL(mem);  /* [RPAP - Jan 97: Endian Ordering] */
+  fread (&fixup_mem, sizeof (fixup_mem), 1, text_fast_comp_dict);
+  NTOHUL(fixup_mem);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  compression_dict *cd;
+  if (!(cd = (compression_dict *)malloc (mem))) {
+    mg_errno = MG_NOMEM;
+    return false;
+  }
+
+  end = (u_long *) (((u_char *) cd) + mem);
+  fread (cd, sizeof (u_char), mem, text_fast_comp_dict);
+
+  if (!(fixup = new u_char[fixup_mem]))
+    {
+      mg_errno = MG_NOMEM;
+      return false;
+    }
+
+  fread (fixup, fixup_mem, sizeof (u_char), text_fast_comp_dict);
+
+  for (p = (u_long *) cd; (u_long) p < (u_long) end; p++)
+    if (IS_FIXUP (p))
+      {
+	NTOHUL(*p);  /* [RPAP - Jan 97: Endian Ordering] */
+	*p = *p + (u_long) cd;
+      }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  /* cdh */
+  NTOHUL(cd->cdh.dict_type);
+  NTOHUL(cd->cdh.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    NTOHUL(cd->cdh.params[i]);
+  NTOHUL(cd->cdh.num_words[0]);
+  NTOHUL(cd->cdh.num_words[1]);
+  NTOHUL(cd->cdh.num_word_chars[0]);
+  NTOHUL(cd->cdh.num_word_chars[1]);
+  NTOHUL(cd->cdh.lookback);
+  /* cfh */
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+
+      NTOHSI(cd->cfh[i]->hd.num_codes);
+      NTOHSI(cd->cfh[i]->hd.mincodelen);
+      NTOHSI(cd->cfh[i]->hd.maxcodelen);
+      for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	{
+	  NTOHSI(cd->cfh[i]->hd.lencount[j]);
+	  NTOHUL(cd->cfh[i]->hd.min_code[j]);
+	}
+      NTOHUL(cd->cfh[i]->uncompressed_size);
+      for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	NTOHUL(cd->cfh[i]->huff_words_size[j]);
+    }
+  NTOHUL(cd->MemForCompDict);
+  /* ad */
+  if (cd->cdh.novel_method == MG_NOVEL_DELTA ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID)
+    for (i = 0; i <= 1; i++)
+      {
+	int j;
+	
+	NTOHUL(cd->ad->afh[i].num_frags);
+	NTOHUL(cd->ad->afh[i].mem_for_frags);
+	for (j = 0; j < 33; j++)
+	  {
+	    NTOHSI(cd->ad->blk_start[i][j]);
+	    NTOHSI(cd->ad->blk_end[i][j]);
+	  }
+      }
+  NTOHSI(cd->fast_loaded);
+
+  delete fixup;
+
+  // the whole fast comp dict is a bit of a hack so I don't
+  // feel too bad about the next line :-) -- Rodger.
+  _cd = *cd;
+  
+  return true;
+}
+
+
+static bool LoadCompDict (FILE *compDictFile,
+			  FILE *auxDictFile,
+			  FILE *fastCompDictFile,
+			  compression_dict &cd) {
+  // see if we have a fast loading compression dictionary
+  if (fastCompDictFile != NULL)
+    return LoadFastCompDict (fastCompDictFile, cd);
+  
+  // slow compression dictionary
+  return LoadSlowCompDict (compDictFile, auxDictFile, cd);
+}
+
+
+// try to open the dictionary files and load the dictionary
+static bool OpenLoadCompDict (char *textname, compression_dict &cd) {
+  FILE *compDictFile = NULL;
+  FILE *auxDictFile = NULL;
+  FILE *fastCompDictFile = NULL;
+
+  fastCompDictFile = open_file (textname, TEXT_DICT_FAST_SUFFIX,
+				"rb", MAGIC_FAST_DICT, MG_CONTINUE);
+  
+  if (fastCompDictFile == NULL) {
+    compDictFile = open_file (textname, TEXT_DICT_SUFFIX,
+			      "rb", MAGIC_DICT, MG_MESSAGE);
+    auxDictFile =  open_file (textname, TEXT_DICT_AUX_SUFFIX,
+			      "rb", MAGIC_AUX_DICT, MG_CONTINUE);
+  }
+  
+  bool res = LoadCompDict (compDictFile, auxDictFile, fastCompDictFile, cd);
+
+  if (compDictFile != NULL) fclose (compDictFile);
+  if (auxDictFile != NULL) fclose (auxDictFile);
+  if (fastCompDictFile != NULL) fclose (fastCompDictFile);
+  
+  return res;
+}
+
+static bool LoadLevels (char *textname, FTextLevel &levels) {
+  FILE *levelFile = NULL;
+
+  // open the text level file
+  levelFile = open_file (textname, TEXT_LEVEL_SUFFIX,
+			 "rb", MAGIC_TEXT_LEVELS, MG_CONTINUE);
+  if (levelFile == NULL) return false;
+
+  // seek to the appropriate place and read the level information
+  bool res = ((fseek (levelFile, sizeof (u_long), SEEK_SET) == 0) &&
+	      levels.Read (levelFile));
+
+  // close the file
+  fclose (levelFile);
+  
+  return res;
+}
+
+
+TextData::TextData () {
+  // put file pointers in known state first
+  textFile = NULL;
+  textIdxFile = NULL;
+  Clear ();
+}
+
+void TextData::Clear () {
+  cd.Clear(); 
+  textFile = NULL;
+  textIdxFile = NULL;
+  cth.Clear();
+  levels.Clear();
+}
+
+bool TextData::LoadData (char *basepath, char *textname) {
+  
+  if (textname[0] == '\0') return false;
+  
+  // set the basepath
+  set_basepath(basepath);
+  
+  // load the compression dictionary
+  if (!OpenLoadCompDict (textname, cd)) return false;
+
+  // open the compressed text and text index file
+  textFile = open_file (textname, TEXT_SUFFIX, "rb", MAGIC_TEXT, MG_CONTINUE);
+  if (textFile == NULL) return false;
+
+  textIdxFile = open_file (textname, TEXT_IDX_SUFFIX, "rb", MAGIC_TEXI, MG_CONTINUE);
+  if (textIdxFile == NULL) return false;
+
+  // read in the compressed text header
+  if ((fseek (textFile, sizeof (u_long), SEEK_SET) != 0) || !cth.Read (textFile))
+    return false;
+
+  // read in the level information
+  if (!LoadLevels (textname, levels)) return false;
+  
+  return true;
+}
+
+bool TextData::UnloadData () {
+  // close any open files
+  if (textFile != NULL) {
+    fclose (textFile);
+    textFile = NULL;
+  }
+  if (textIdxFile != NULL) {
+    fclose (textIdxFile);
+    textIdxFile = NULL;
+  }
+
+  // do general clear
+  Clear ();
+  
+  return true;  
+}
+
+
+bool GetDocIdx (TextData &td, const UCArray &docLevel,
+		unsigned long docNum, TextIdx &docIdx) {
+  // make sure the text index file was opened successfully
+  if (td.textIdxFile == NULL) return false;
+
+  // read in the index
+  TextLevelInfo &levelInfo = td.levels.levelInfo[docLevel];
+  if (!docIdx.Read (td.textIdxFile, levelInfo, docNum)) return false;
+  
+  return true;
+}
+
+
+
+
+#define MY_HUFF_DECODE(len, code, mcodes)				\
+  do {									\
+    register unsigned long *__min_code = (mcodes);			\
+    register unsigned long *__mclen = __min_code;			\
+    register unsigned long __code = 0;					\
+    do									\
+      {									\
+        __code += __code + buffer.bit();	                  	\
+      }									\
+    while (__code < *++__mclen);					\
+    (len) = __mclen - __min_code;					\
+    (code) = __code - *__mclen;						\
+  } while(0);
+
+
+bool GetDocText (TextData &td, const UCArray &docLevel,
+		 unsigned long docNum, UCArray &docText) {
+  // erase the current text
+  docText.erase (docText.begin(), docText.end());
+
+  // look up the information about this document
+  TextIdx docIdx;
+  if (!GetDocIdx (td, docLevel, docNum, docIdx)) return false;
+
+  // do seek to appropriate position
+  stdio_bitio_buffer buffer (td.textFile);
+  buffer.seek (docIdx.start.byte, docIdx.start.bit);
+  
+  // decompress the document
+  compression_dict &cd = td.cd;
+  auxiliary_dict *ad = cd.ad;
+  int which = docIdx.which;
+  unsigned long num_bits = (docIdx.end.byte*8+(8-docIdx.end.bit)) -
+    (docIdx.start.byte*8+(8-docIdx.start.bit));
+  unsigned long bits = 0;
+
+  // keep decoding bits until enough bits have been decoded
+  while (bits < num_bits) {
+    register unsigned code, len;
+    register int r;
+    register u_char *t, *b = NULL;
+    u_char word[MAXWORDLEN + 1];
+    
+    if (cd.cfh[which]) {
+      MY_HUFF_DECODE (len, code, cd.cfh[which]->hd.min_code);
+      bits += len;
+      
+      r = code & ((1 << cd.cdh.lookback) - 1);
+      t = cd.values[which][len][code >> cd.cdh.lookback];
+      
+      /* step through from base pointer */
+      b = word + 1;
+      while (r--) {
+	register int copy = *t >> 4;
+	memcpy (word + copy + 1, t + 1, *t & 0xf);
+	word[0] = copy + (*t & 0xf);
+	t += ((*t) & 0xf) + 1;
+      }
+    } else t = NULL;
+    
+    if (t == cd.escape[which]) {
+      switch (cd.cdh.novel_method) {
+      case MG_NOVEL_HUFFMAN_CHARS:
+	{
+	  int len, i;
+	  int c;
+	  len = buffer.huff_decode(cd.lens_huff[which]->min_code,
+				   cd.lens_vals[which], &bits);
+	  for (i = 0; i < len; i++) {
+	    c = buffer.huff_decode(cd.chars_huff[which]->min_code,
+				   cd.chars_vals[which], &bits);
+	    docText.push_back (c);
+	  }
+	}
+	break;
+      case MG_NOVEL_DELTA:
+      case MG_NOVEL_HYBRID:
+	{
+	  int idx = 0, len;
+	  u_char *base;
+	  switch (cd.cdh.novel_method)
+	    {
+	    case MG_NOVEL_DELTA:
+	      {
+		idx = buffer.delta_decode (&bits);
+		idx--;
+	      }
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      {
+		int k;
+		k = buffer.gamma_decode (&bits);
+		k--;
+		idx = buffer.binary_decode(ad->blk_end[which][k] -
+					   ad->blk_start[which][k] + 1, 
+					   &bits);
+		idx += ad->blk_start[which][k] - 1;
+	      }
+	      break;
+	    }
+	  base = ad->words[which][idx];
+	  len = *base++;
+	  for (; len; len--)
+	    {
+	      docText.push_back (*base++);
+	    }
+	}
+	break;
+      }
+    }
+    else
+      {
+	/* copy over the matching prefix */
+	r = (*t >> 4);
+	while (r--) {
+	  docText.push_back (*b++);
+	}
+	
+	/* and the stored suffix */
+	r = ((*t) & 0xf);
+	while (r--) {
+	  docText.push_back (*++t);
+	}
+      }
+    which = !which;
+  }
+  
+  buffer.done();
+  
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/TextGet.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/TextGet.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/TextGet.h	(revision 21083)
@@ -0,0 +1,58 @@
+/**************************************************************************
+ *
+ * TextGet.h -- Decompressing the text
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef TEXTGET_H
+#define TEXTGET_H
+
+#include "text.h"
+#include "FText.h"
+
+
+class TextData {
+public:
+  compression_dict cd;
+  FILE *textFile;
+  FILE *textIdxFile;
+  compressed_text_header cth;
+  FTextLevel levels;
+
+  TextData ();
+  void Clear ();
+
+  // loads compression dictionary, the compressed text header,
+  // and all level informaiton
+  bool LoadData (char *basepath, char *textname);
+  bool UnloadData ();
+};
+
+
+// note: document numbers start at 1
+
+// get information about where a document starts and finishes
+bool GetDocIdx (TextData &td, const UCArray &docLevel,
+		unsigned long docNum, TextIdx &docIdx);
+
+
+// decompress a document's text
+bool GetDocText (TextData &td, const UCArray &docLevel,
+		 unsigned long docNum, UCArray &docText);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/UCArray.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/UCArray.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/UCArray.cpp	(revision 21083)
@@ -0,0 +1,278 @@
+/**************************************************************************
+ *
+ * UCArray.cpp -- vector based string class
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "UCArray.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+void SetCStr (UCArray &text, const char *cStr) {
+  text.erase(text.begin(), text.end());
+  
+  while (*cStr != '\0') {
+    text.push_back (*cStr);
+    cStr++;
+  }
+}
+
+char * GetCStr(UCArray text) {
+
+  char *cstr = new char[text.size()+1];
+  UCArray::const_iterator here = text.begin();
+  UCArray::const_iterator end = text.end();
+
+  int i = 0;
+  while (here != end) {
+    cstr[i] = text[i];
+    here++; i++;
+  }
+  cstr[i]='\0';
+  return cstr;
+}
+
+ostream &operator<<(ostream &s, const UCArray &a) {
+  UCArray::const_iterator here = a.begin();
+  UCArray::const_iterator end = a.end();
+  while (here != end) {
+    s << *here;
+    here++;
+  }
+
+  return s;
+}
+
+
+bool ReadVarLenUL (FILE *f, unsigned long &n) {
+  register unsigned long temp = 0;
+  register unsigned int bitPos = 0;
+  unsigned char b = 0;
+
+  do {
+    b = fgetc (f);
+    if (feof(f)) return false;
+    temp |= (b & 0x7f) << bitPos;
+    bitPos += 7;
+  } while (b >= 0x80 && bitPos < 32);
+
+  n = temp;
+  
+  return true;
+}
+
+bool WriteVarLenUL (FILE *f, unsigned long n) {
+  register unsigned long temp = n;
+  register unsigned char b = 0;
+  do {
+    b = static_cast<unsigned char> (temp & 0x7f);
+    if (temp >= 0x80) b |= 0x80;
+    fputc (b, f);
+    if (ferror (f) != 0) return false;
+  } while ((temp = temp >> 7) > 0);
+  
+  return true;
+}
+
+
+bool ReadUL (FILE *f, unsigned long &n) {
+  if (fread (&n, sizeof (unsigned long), 1, f) <= 0) return false;
+  NTOHUL (n);
+  return true;
+}
+
+
+bool WriteUL (FILE *f, unsigned long n) {
+  HTONUL (n);
+  return (fwrite (&n, sizeof (unsigned long), 1, f) > 0);
+}
+
+bool ReadF (FILE *f, float &n) {
+  if (fread (&n, sizeof (float), 1, f) <= 0) return false;
+  NTOHF(n);
+  return true;
+}
+
+bool WriteF (FILE *f, float n) {
+  HTONF(n);
+  return (fwrite (&n, sizeof (float), 1, f) > 0);
+}
+
+bool ReadD (FILE *f, double &n) {
+  if (fread (&n, sizeof (double), 1, f) <= 0) return false;
+  NTOHD(n);
+  return true;
+}
+
+bool WriteD (FILE *f, double n) {
+  HTOND(n);
+  return (fwrite (&n, sizeof (double), 1, f) > 0);
+}
+
+bool ReadUCArray (FILE *f, UCArray &a) {
+  // clear the array in preparation
+  a.erase (a.begin(), a.end());
+
+  // read in the array size
+  unsigned long arraySize = 0;
+  if (!ReadVarLenUL (f, arraySize)) return false;
+
+  // read in the array
+  unsigned char b = 0;
+  while (arraySize > 0) {
+    b = fgetc (f);
+    if (feof(f)) return false;
+    a.push_back (b);
+    
+    arraySize--;
+  }
+  
+  return true;
+}
+
+bool WriteUCArray (FILE *f, const UCArray &a) {
+  // write out the array size
+  if (!WriteVarLenUL (f, a.size())) return false;
+
+  UCArray::const_iterator here = a.begin();
+  UCArray::const_iterator end = a.end();
+  while (here != end) {
+    fputc (*here, f);
+    if (ferror (f) != 0) return false;
+    
+    here++;
+  }
+  
+  return true;
+}
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char casecharmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+
+int DictCompare (const UCArray &a1, const UCArray &a2) {
+  unsigned int l1 = a1.size();
+  unsigned int l2 = a2.size();
+  unsigned int l = (l1 < l2) ? l1 : l2;
+  int pos = 0;
+  register int diff = 0;
+
+  UCArray::const_iterator a1Here = a1.begin();
+  UCArray::const_iterator a2Here = a2.begin();
+  
+  while (l--) {
+    if ((diff = casecharmap[*a1Here] - casecharmap[*a2Here]) != 0)
+      return diff;
+    if (pos == 0 && (diff = *a1Here - *a2Here) != 0)
+      pos = diff;
+
+    a1Here++;
+    a2Here++;
+  }
+
+  return ((l1 - l2) ? (l1 - l2) : (pos));
+}
+
+unsigned long PrefixLen (const UCArray &a1, const UCArray &a2) {
+  unsigned long l = (a1.size() < a2.size()) ? a1.size() : a2.size();
+  unsigned long i = 0;
+
+  UCArray::const_iterator a1Here = a1.begin();
+  UCArray::const_iterator a2Here = a2.begin();
+
+  while (i < l && *a1Here == *a2Here) {
+    i++; a1Here++; a2Here++;
+  }
+  
+  return i;
+}
+
+bool WritePreSufStr (FILE *f, const UCArray *prev, const UCArray &a) {
+  unsigned char preLen;
+  unsigned char sufLen;
+  
+  if (prev != NULL) preLen = PrefixLen (*prev, a);
+  else preLen = 0;
+  sufLen = a.size() - preLen;
+
+  // output the prefix length, suffix length, and the suffix
+  fputc (preLen, f);
+  if (ferror(f) != 0) return false;
+  fputc (sufLen, f);
+  if (ferror(f) != 0) return false;
+  char* tmp=GetCStr(a);
+  int ret=(fwrite (tmp+preLen, sizeof (char), sufLen, f) == sufLen);
+  delete (tmp);
+  return (ret);
+}
+
+// a also used for prev
+bool ReadPreSufStr (FILE *f, UCArray &a) {
+  unsigned char preLen = 0;
+  unsigned char sufLen = 0;
+
+  preLen = fgetc(f);
+  sufLen = fgetc(f);
+
+  if (a.size () > preLen) a.erase (a.begin()+preLen, a.end());
+  while (sufLen > 0) {
+    unsigned char c = fgetc (f);
+    a.push_back (c);
+    sufLen--;
+  }
+
+  return true;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/UCArray.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/UCArray.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/UCArray.h	(revision 21083)
@@ -0,0 +1,118 @@
+/**************************************************************************
+ *
+ * UCArray.h -- vector based string class
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef UCARRAY_H
+#define UCARRAY_H
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if !defined (GSDL_NAMESPACE_BROKEN) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+using namespace std;
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#  include <ospace\std\set>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#  include <set.h>
+#else
+#  include <vector>
+#  include <set>
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#include <stdio.h>
+
+
+typedef vector<unsigned char> UCArray;
+
+// functions to manipulate UCArrays
+void SetCStr (UCArray &text, const char *cStr);
+char * GetCStr(UCArray text);
+inline void UCArrayClear (UCArray &a) {
+  a.erase (a.begin(), a.end());
+}
+
+// stream operator to print UCArray
+ostream &operator<<(ostream &s, const UCArray &a);
+
+// used for reading and writing unsigned characters
+inline bool ReadUC (FILE *f, unsigned char &c) {
+  return (fread (&c, sizeof (unsigned char), 1, f) == 1);
+}
+inline bool WriteUC (FILE *f, unsigned char c) {
+  return (fwrite (&c, sizeof (unsigned char), 1, f) == 1);
+}
+
+// used for reading and writing variable length unsigned longs
+bool ReadVarLenUL (FILE *f, unsigned long &n);
+bool WriteVarLenUL (FILE *f, unsigned long n);
+
+// used for reading and writing unsigned longs
+bool ReadUL (FILE *f, unsigned long &n);
+bool WriteUL (FILE *f, unsigned long n);
+
+// used for reading and writing floats
+bool ReadF (FILE *f, float &n);
+bool WriteF (FILE *f, float n);
+
+// used for reading and writing doubles
+bool ReadD (FILE *f, double &n);
+bool WriteD (FILE *f, double n);
+
+// used for reading and writing arrays to files
+bool ReadUCArray (FILE *f, UCArray &a);
+bool WriteUCArray (FILE *f, const UCArray &a);
+
+
+// compares the two strings in dictionary order
+int DictCompare (const UCArray &a1, const UCArray &a2);
+
+struct LTUCArray {
+  bool operator()(const UCArray &a1, const UCArray &a2) const
+    { return (a1 < a2); }
+};
+
+struct DictLTUCArray {
+  bool operator() (const UCArray &a1, const UCArray &a2) const
+    { return (DictCompare (a1, a2) < 0); }
+};
+
+
+typedef set<UCArray, LTUCArray> UCArraySet;
+typedef vector<UCArray> UCArrayVector;
+
+unsigned long PrefixLen (const UCArray &a1, const UCArray &a2);
+
+// prev == NULL if no previous string
+bool WritePreSufStr (FILE *f, const UCArray *prev, const UCArray &a);
+bool ReadPreSufStr (FILE *f, UCArray &a); // a also used for prev
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/WIN32.MAK
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/WIN32.MAK	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/WIN32.MAK	(revision 21083)
@@ -0,0 +1,192 @@
+###########################################################################
+#
+# win32 makefile -- mgpp\text
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..\..
+USE_STLPORT = 0
+
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+CC = cl
+CPPFLAGS = -GX
+DEFS = -DSHORT_SUFFIX -DSILENT -DHAVE_CONFIG_H -D__WIN32__ -D__STDC__ -D__GNU_LIBRARY__ -D__MSDOS__
+INCLUDES = -I"$(GSDLHOME)\src\mgpp\lib" -I"$(GSDLHOME)"
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LDFLAGS =
+
+LIBS = "$(GSDLHOME)\src\mgpp\lib\libmg.lib"
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .c .obj .cpp
+.c.obj:
+	$(COMPILE) $<
+.cpp.obj:
+	$(COMPILE) $<
+
+o = .obj
+e = .exe
+
+SOURCES = \
+  FIvfLevelInfo.cpp        ivf.pass1.cpp            mgpp_invf_dump.cpp       \
+  FText.cpp                ivf.pass2.cpp            mgpp_passes.cpp          \
+  FileBuf.cpp              locallib.cpp             mgpp_perf_hash_build.cpp \
+  FragLevelConvert.cpp     mg.special.cpp           mgpp_stem_idx.cpp        \
+  IndexData.cpp            mgpp_compression_dict.cpp  mgpp_weights_build.cpp   \
+  TagInfo.cpp              mgpp_decompress_text.cpp   stemmer.cpp            \
+  TextEl.cpp               mg_errors.cpp            text.cpp               \
+  TextGet.cpp              mgpp_fast_comp_dict.cpp    text.pass1.cpp         \
+  UCArray.cpp              mg_files.cpp             text.pass2.cpp         \
+  comp_dict.cpp            mgpp_invf_dict.cpp         words.cpp              \
+  invf.cpp                 mgpp_invf_dict_dump.cpp    Weights.cpp            \
+  MGQuery.cpp              Terms.cpp                QueryTester.cpp        \
+  QueryLex.cpp             QueryParser.cpp         \
+  GSDLQueryLex.cpp	   GSDLQueryParser.cpp      Queryer.cpp
+
+
+HEADERS = \
+  FIvfLevelInfo.h     TextEl.h            hash.h              stemmer.h  \
+  FText.h             TextGet.h           invf.h              text.h     \
+  FileBuf.h           UCArray.h           locallib.h          words.h    \
+  FragLevelConvert.h  WordData.h          mg.h                           \
+  IndexData.h         build.h             mg_errors.h                    \
+  TagInfo.h           comp_dict.h         mg_files.h          Weights.h  \
+  MGQuery.h           Terms.h             QueryLex.h          QueryParser.h \
+  GSDLQueryLex.h	GSDLQueryParser.h
+
+EXEC          = mgpp_passes$e mgpp_decompress_text$e mgpp_perf_hash_build$e \
+                mgpp_invf_dump$e mgpp_weights_build$e mgpp_invf_dict$e mgpp_stem_idx$e \
+                mgpp_invf_dict_dump$e mgpp_compression_dict$e mgpp_fast_comp_dict$e \
+                QueryTester$e Queryer$e
+
+all:    $(EXEC) libtextin.lib
+
+PASSES_OBJS = \
+	mgpp_passes$o text.pass1$o comp_dict$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o \
+	words$o invf$o FileBuf$o TextEl$o UCArray$o TagInfo$o \
+        FText$o text$o FIvfLevelInfo$o
+
+mgpp_passes$e: $(PASSES_OBJS)
+	$(LINK) $(PASSES_OBJS) $(LIBS)
+
+
+QUERYER_OBJS = Queryer$o mg_files$o mg_errors$o locallib$o invf$o UCArray$o \
+               FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+               IndexData$o stemmer$o Weights$o TextGet$o text$o FText$o \
+               GSDLQueryParser$o GSDLQueryLex$o words$o
+
+Queryer$e: $(QUERYER_OBJS)
+	$(LINK) $(QUERYER_OBJS) $(LIBS)
+
+QUERY_TESTER_OBJS = QueryTester$o mg_files$o invf$o UCArray$o \
+                    FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+                    IndexData$o stemmer$o Weights$o
+
+QueryTester$e: $(QUERY_TESTER_OBJS)
+	$(LINK) $(QUERY_TESTER_OBJS) $(LIBS)
+
+WEIGHTS_BUILD_OBJS = mgpp_weights_build$o mg_files$o invf$o UCArray$o \
+                     FIvfLevelInfo$o FragLevelConvert$o
+
+mgpp_weights_build$e: $(WEIGHTS_BUILD_OBJS)
+	$(LINK) $(WEIGHTS_BUILD_OBJS) $(LIBS)
+
+COMP_DICT_OBJS = mgpp_compression_dict$o mg_files$o locallib$o
+
+mgpp_compression_dict$e: $(COMP_DICT_OBJS)
+	$(LINK) $(COMP_DICT_OBJS) $(LIBS)
+
+FAST_COMP_OBJS = mgpp_fast_comp_dict$o mg_files$o locallib$o
+
+mgpp_fast_comp_dict$e: $(FAST_COMP_OBJS)
+	$(LINK) $(FAST_COMP_OBJS) $(LIBS)
+
+INVF_DUMP_OBJS = mgpp_invf_dump$o locallib$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dump$e: $(INVF_DUMP_OBJS)
+	$(LINK) $(INVF_DUMP_OBJS) $(LIBS)
+
+INVF_DICT_OBJS = mgpp_invf_dict$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dict$e: $(INVF_DICT_OBJS)
+	$(LINK) $(INVF_DICT_OBJS) $(LIBS)
+
+INVF_DICT_DUMP_OBJS = mgpp_invf_dict_dump$o mg_files$o invf$o UCArray$o
+
+mgpp_invf_dict_dump$e: $(INVF_DICT_DUMP_OBJS)
+	$(LINK) $(INVF_DICT_DUMP_OBJS) $(LIBS)
+
+PERF_HASH_OBJS = mgpp_perf_hash_build$o mg_files$o invf$o UCArray$o
+
+mgpp_perf_hash_build$e: $(PERF_HASH_OBJS)
+	$(LINK) $(PERF_HASH_OBJS) $(LIBS)
+
+STEM_IDX_OBJS = mgpp_stem_idx$o mg_files$o stemmer$o \
+                invf$o UCArray$o
+
+mgpp_stem_idx$e: $(STEM_IDX_OBJS)
+	$(LINK) $(STEM_IDX_OBJS) $(LIBS)
+
+DECOMPRESS_TEXT_OBJS = \
+                mgpp_decompress_text$o mg_files$o mg_errors$o \
+                locallib$o text$o UCArray$o TextGet$o FText$o
+
+mgpp_decompress_text$e: $(DECOMPRESS_TEXT_OBJS)
+	$(LINK) $(DECOMPRESS_TEXT_OBJS) $(LIBS)
+
+
+PASS_OBJS = \
+	words$o mgpass$o text.pass1$o comp_dict$o stemmer$o \
+	text.pass2$o locallib$o \
+	ivf.pass1$o ivf.pass2$o mg.special$o mg_files$o
+mgpass$e: $(PASS_OBJS)
+	$(LINK) $(PASS_OBJS) $(LIBS)
+
+install: 
+	if NOT EXIST "$(GSDLHOME)\bin\windows" mkdir "$(GSDLHOME)\bin\windows"
+	for %%i in ($(EXEC)) do \
+	  copy %%i "$(GSDLHOME)\bin\windows"
+
+LIB_OBJS = mg_files$o  mg_errors$o locallib$o invf$o UCArray$o \
+           FIvfLevelInfo$o FragLevelConvert$o Terms$o MGQuery$o \
+           IndexData$o stemmer$o Weights$o TextGet$o text$o FText$o \
+           GSDLQueryParser$o GSDLQueryLex$o words$o
+
+libtextin.lib: $(LIB_OBJS)
+	if EXIST libtextin.lib del libtextin.lib
+	lib /out:libtextin.lib $(LIB_OBJS)
+
+clean:
+	del *$o 
+	del $(EXEC)
+	del libtextin.lib
Index: /main/tags/2.38/gsdl/src/mgpp/text/Weights.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Weights.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Weights.cpp	(revision 21083)
@@ -0,0 +1,126 @@
+/**************************************************************************
+ *
+ * Weights.cpp -- Dealing with document weights
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "UCArray.h"
+#include "Weights.h"
+#include "sysfuncs.h"
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+
+ApproxWeightsData::ApproxWeightsData () {
+  weightBuf = NULL;
+  table = NULL;
+  Free();
+}
+
+ApproxWeightsData::~ApproxWeightsData () {
+  Free ();
+}
+
+void ApproxWeightsData::Free () {
+  bits = 0;
+  mask = 0;
+  L = 0.0;
+  B = 0.0;
+  numLevelDocs = 0;
+  if (weightBuf != NULL) {
+    delete [] weightBuf;
+    weightBuf = NULL;
+  }
+  if (table != NULL) {
+    delete [] table;
+    table = NULL;
+  }
+}
+
+bool ApproxWeightsData::Read (FILE *approxWeightsFile, unsigned long diskPtr,
+			      unsigned long _numLevelDocs) {
+  Free ();
+  
+  // go to the appropriate place in the weights file
+  fseek (approxWeightsFile, diskPtr, SEEK_SET);
+
+  // read in approx weights parameters
+  ReadUC (approxWeightsFile, bits);
+  ReadD (approxWeightsFile, L);
+  ReadD (approxWeightsFile, B);
+
+  mask = (bits == 32) ? 0xffffffff : (1 << bits) - 1;
+  numLevelDocs = _numLevelDocs;
+
+  // allocate buffer for the weights
+  unsigned long arrSize = (bits*numLevelDocs+sizeof(unsigned long)-1) / 32;
+  weightBuf = new unsigned long[arrSize];
+
+  // read in the weights
+  unsigned long i;
+  for (i=0; i<arrSize; i++) {
+    ReadUL (approxWeightsFile, weightBuf[i]);
+  }
+
+  // create precomputed table of values if it will be small enough
+  // (if not small enough table == NULL
+  if (bits <= 12) {
+    unsigned long i, tableSize = (1 << bits);
+    table = new float[tableSize];
+    table[0] = L;
+    for (i = 1; i < tableSize; i++)
+      table[i] = table[i - 1] * B;
+  }
+
+  return true;
+}
+
+float ApproxWeightsData::GetLowerApproxDocWeight (unsigned long levelDocNum) {
+  // sanity check
+  if (bits == 0 || weightBuf == NULL) return 1.0;
+
+  register unsigned long c, pos;
+  register unsigned long *dw;
+
+  // get the compressed version of the weight
+  pos = levelDocNum * bits;
+  dw = &weightBuf[pos / MAXBITS];
+  pos &= (MAXBITS - 1);
+  c = *dw >> pos;
+  if (pos + bits > MAXBITS)
+    c |= *(dw + 1) << (MAXBITS - pos);
+  c &= mask;
+
+  // decompress the weight
+  if (table != NULL) return table[c];
+  return (L * pow (B, (double) c));
+}
+
+
+
+float GetExactDocWeight (FILE *exactWeightsFile, unsigned long diskPtr,
+			 unsigned long levelDocNum) {
+  // go to the appropriate place in the weights file
+  fseek (exactWeightsFile, diskPtr+sizeof(float)*levelDocNum, SEEK_SET);
+
+  // read in the exact weight
+  float weight;
+  ReadF (exactWeightsFile, weight);
+  
+  return weight;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/Weights.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/Weights.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/Weights.h	(revision 21083)
@@ -0,0 +1,56 @@
+/**************************************************************************
+ *
+ * Weights.h -- Dealing with document weights
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef WEIGHTS_H
+#define WEIGHTS_H
+
+#include <stdio.h>
+
+
+class ApproxWeightsData {
+public:
+  unsigned char bits;
+  unsigned long mask;
+  double L;
+  double B;
+  unsigned long numLevelDocs;
+  unsigned long *weightBuf;
+  float *table;   // precomputed translation table
+  
+  ApproxWeightsData ();
+  ~ApproxWeightsData ();
+
+  void Free (); // frees any allocated memory
+  
+  bool Read (FILE *approxWeightsFile, unsigned long diskPtr,
+	     unsigned long _numLevelDocs);
+
+  float GetLowerApproxDocWeight (unsigned long levelDocNum);
+};
+
+
+// diskPtr points to the start of the exact document weights
+// for this level
+float GetExactDocWeight (FILE *exactWeightsFile, unsigned long diskPtr,
+			 unsigned long levelDocNum);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/WordData.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/WordData.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/WordData.h	(revision 21083)
@@ -0,0 +1,47 @@
+/**************************************************************************
+ *
+ * WordData.h -- 
+ * Copyright (C) 1999  NZDL
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+class WordData
+{
+
+ public:
+  unsigned long docCount;
+  unsigned long wordCount;
+
+  inline void read(FILE *f)
+    {
+      fread((char *) &docCount, sizeof(docCount), 1, f);
+      fread((char *) &wordCount, sizeof(wordCount), 1, f);
+
+      NTOHUL(docCount);
+      NTOHUL(wordCount);
+    }
+
+  inline unsigned long documents()
+    {
+      return docCount;
+    }
+
+  inline int words()
+    {
+      return wordCount;
+    }
+};
Index: /main/tags/2.38/gsdl/src/mgpp/text/build.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/build.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/build.h	(revision 21083)
@@ -0,0 +1,86 @@
+/**************************************************************************
+ *
+ * build.h -- Global information for the passes of mg_passes
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+
+#ifndef H_BUILD
+#define H_BUILD
+
+#include "longlong.h"
+
+#include "TextEl.h"
+#include "TagInfo.h"
+
+
+int init_special (const TagInfo &tagInfo, char *file_name);
+int init_text_1 (const TagInfo &tagInfo, char *file_name);
+int init_text_2 (const TagInfo &tagInfo, char *file_name);
+int init_ivf_1 (const TagInfo &tagInfo, char *file_name);
+int init_ivf_2 (const TagInfo &tagInfo, char *file_name);
+/*
+ * file_name  IN      The name of the dictionary file
+ * 
+ * returns      COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot read file
+ */
+
+
+
+
+
+int process_special (const TagInfo &tagInfo, const TextElArray &doc);
+int process_text_1 (const TagInfo &tagInfo, const TextElArray &doc);
+int process_text_2 (const TagInfo &tagInfo, const TextElArray &doc);
+int process_ivf_1 (const TagInfo &tagInfo, const TextElArray &doc);
+int process_ivf_2 (const TagInfo &tagInfo, const TextElArray &doc);
+/*
+ * returns      COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot read file
+ *
+ * The calling routine is responsible for ensuring that s_out is long 
+ * enough.
+ */
+
+
+
+
+
+int done_special (const TagInfo &tagInfo, char *filename);
+int done_text_1 (const TagInfo &tagInfo, char *filename);
+int done_text_2 (const TagInfo &tagInfo, char *filename);
+int done_ivf_1 (const TagInfo &tagInfo, char *filename);
+int done_ivf_2 (const TagInfo &tagInfo, char *filename);
+/*
+ * returns    COMPALLOK for all ok,
+ *              COMPERROR for any error.  e.g. cannot write file
+ */
+
+
+
+
+extern unsigned long invf_buffer_size;
+/*
+ * The amount of memory to allocate to the invertion buffer.
+ */
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.cpp	(revision 21083)
@@ -0,0 +1,229 @@
+/**************************************************************************
+ *
+ * comp_dict.cpp -- Functions for loading the compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "huffman.h"
+#include "local_strings.h"
+#include "memlib.h"
+#include "messages.h"
+
+#include "mg.h"
+#include "hash.h"
+#include "text.h"
+#include "comp_dict.h"
+#include "locallib.h"
+#include "mg_files.h"
+
+compression_dict_header cdh;
+compressed_text_header cth;
+comp_frags_header cfh[2];
+
+dict_hash_table *ht[2];
+
+huff_data char_huff[2];
+huff_data lens_huff[2];
+u_long *char_codes[2], *lens_codes[2];
+u_long Words_disk = 0;
+u_long Chars_disk = 0;
+
+
+static dict_hash_table *
+ReadInWords (FILE * dict, comp_frags_header * cfh,
+	     int esc)
+{
+  int i;
+  u_char *allwords, *prev = NULL;
+  dict_hash_table *ht;
+  u_char **words;
+  u_long ht_size;
+
+  ht_size = prime (cfh->hd.num_codes * HASH_RATIO);
+  if (!(ht = (dict_hash_table *) Xmalloc (sizeof (dict_hash_table) +
+		                            (ht_size - 1) * sizeof (ht->table[0]))))
+    {
+      Message ("no memory for hash_table\n");
+      return NULL;
+    }
+
+  ht->size = ht_size;
+  ht->hd = &cfh->hd;
+
+  if (!(ht->codes = Generate_Huffman_Codes (&cfh->hd, NULL)))
+    {
+      Message ("no memory for huffman codes\n");
+      return NULL;
+    }
+
+  if (!(ht->words = (u_char **) Xmalloc (sizeof (u_char *) * cfh->hd.num_codes)))
+    {
+      Message ("no memory for word pointers\n");
+      return NULL;
+    }
+  words = ht->words;
+
+  memset (ht->table, '\0', ht_size * sizeof (ht->table[0]));
+
+  if (!(allwords = (u_char *) Xmalloc (sizeof (u_char) * cfh->uncompressed_size)))
+    {
+      Message ("no memory for words\n");
+      return NULL;
+    }
+
+  for (i = 0; i < cfh->hd.num_codes; i++, words++)
+    {
+      register int val, copy;
+      val = fgetc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      *words = allwords;
+
+      memcpy (allwords + 1, prev + 1, copy);
+      fread (allwords + copy + 1, sizeof (u_char), val, dict);
+      *allwords = val + copy;
+
+      Words_disk += val + 1;
+
+      /* insert into the hash table */
+      if (i < cfh->hd.num_codes - esc)
+	{
+	  register u_char **wptr;
+	  register unsigned long tsize = ht->size;
+	  register unsigned long hashval, step;
+
+	  HASH (hashval, step, allwords, tsize);
+
+	  wptr = ht->table[hashval];
+	  for (; wptr;)
+	    {
+	      hashval += step;
+	      if (hashval >= tsize)
+		hashval -= tsize;
+	      wptr = ht->table[hashval];
+	    }
+	  ht->table[hashval] = words;
+	}
+      prev = allwords;
+      allwords += *allwords + 1;
+    }
+  return ht;
+}
+
+inline int LoadWords(FILE *dict, int which)
+{
+  if (Read_cfh (dict, &cfh[which], NULL, &Words_disk) == -1)
+    return 1;
+  
+  if (!(ht[which] = ReadInWords (dict, &cfh[which], 0)))
+    return 1;
+
+  return 0;
+}
+
+inline int LoadHuffmanCodes(FILE *dict, int which)
+{
+  if (Read_Huffman_Data (dict, &char_huff[which], NULL,
+			 &Chars_disk) == -1)
+    return 1;
+  if (!(char_codes[which] =
+	Generate_Huffman_Codes (&char_huff[which], NULL)))
+    return 2;
+  if (Read_Huffman_Data (dict, &lens_huff[which], NULL,
+			 &Chars_disk) == -1)
+    return 3;
+  if (!(lens_codes[which] =
+	Generate_Huffman_Codes (&lens_huff[which], NULL)))
+    return 4;
+
+  return 0;
+}
+
+int 
+LoadCompressionDictionary (char *dict_file_name)
+{
+  FILE *dict;
+  int which;
+  if (!(dict = open_named_file (dict_file_name, "rb", MAGIC_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    return COMPERROR;
+
+  Words_disk = sizeof (u_long);
+
+  if (Read_cdh (dict, &cdh, NULL, &Words_disk) == -1)
+    goto error;
+
+  for (which = 0; which < 2; which++)
+    switch (cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  if (LoadWords(dict, which) != 0)
+	    goto error;
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    {
+	      if (LoadWords(dict, which) != 0)
+		goto error;
+	    }
+	  else
+	    ht[which] = NULL;
+	  if (LoadHuffmanCodes(dict, which) != 0)
+	    goto error;
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (cdh.num_words[which])
+	    {
+	      if (LoadWords(dict, which) != 0)
+		goto error;
+	    }
+	  else
+	    ht[which] = NULL;
+	  switch (cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      if (LoadHuffmanCodes(dict, which) != 0)
+		goto error;
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    default:
+	      FatalError (1, "Bad novel method");
+	    }
+	}
+	break;
+      default:
+	FatalError (1, "Bad dictionary kind\n");
+      }
+
+  return (COMPALLOK);
+
+
+error:
+  fclose (dict);
+  return (COMPERROR);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/comp_dict.h	(revision 21083)
@@ -0,0 +1,48 @@
+/**************************************************************************
+ *
+ * comp_dict.h -- Functions for loading the compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define HASH_RATIO 2
+
+typedef struct dict_hash_table
+  {
+    u_long size;
+    huff_data *hd;
+    u_long *codes;
+    u_char **words;
+    u_char **table[1];
+  }
+dict_hash_table;
+
+extern compression_dict_header cdh;
+extern compressed_text_header cth;
+extern comp_frags_header cfh[2];
+
+extern dict_hash_table *ht[2];
+
+extern huff_data char_huff[2];
+extern huff_data lens_huff[2];
+extern u_long *char_codes[2], *lens_codes[2];
+extern u_long Words_disk;
+extern u_long Chars_disk;
+
+
+
+int LoadCompressionDictionary (char *dict_file_name);
Index: /main/tags/2.38/gsdl/src/mgpp/text/hash.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/hash.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/hash.h	(revision 21083)
@@ -0,0 +1,39 @@
+/**************************************************************************
+ *
+ * hash.h -- Hash function
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_HASH
+#define H_HASH
+
+#define HASH(h, step, wd, tablesize)			\
+	do {						\
+		register u_char *p=wd;			\
+		register long len = *p++;		\
+		register unsigned long hval;		\
+		if (len>25) len = 25;			\
+		for (hval=0; len; len--)		\
+		  hval = (hval << 5) - hval + *p++;	\
+		step = hval % (tablesize - 2) + 1;	\
+		h = hval % tablesize;			\
+	} while (0)
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/invf.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/invf.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/invf.cpp	(revision 21083)
@@ -0,0 +1,840 @@
+/**************************************************************************
+ *
+ * invf.cpp -- Data structures for inverted files
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "invf.h"
+#include "UCArray.h"
+
+
+invf_dict_header::invf_dict_header () {
+  Clear();
+}
+
+invf_dict_header::~invf_dict_header () {
+}
+
+void invf_dict_header::Clear() {
+  lookback = 0;
+  word_dict_start = 0;
+  word_dict_size = 0;
+  tag_dict_start = 0;
+  tag_dict_size = 0;
+  num_docs = 0;
+  num_frags = 0;
+  num_words = 0;
+  total_bytes = 0;
+  index_string_bytes = 0;
+  num_levels = 0;
+}
+
+bool invf_dict_header::Read (FILE *f) {
+  return (ReadUL (f, lookback) &&
+	  ReadUL (f, word_dict_start) &&
+	  ReadUL (f, word_dict_size) &&
+	  ReadUL (f, tag_dict_start) &&
+	  ReadUL (f, tag_dict_size) &&
+	  ReadUL (f, num_docs) &&
+	  ReadUL (f, num_frags) &&
+	  ReadUL (f, num_words) &&
+	  ReadUL (f, total_bytes) &&
+	  ReadUL (f, index_string_bytes) &&
+	  ReadUL (f, num_levels));
+}
+
+bool invf_dict_header::Write (FILE *f) const {
+  return (WriteUL (f, lookback) &&
+	  WriteUL (f, word_dict_start) &&
+	  WriteUL (f, word_dict_size) &&
+	  WriteUL (f, tag_dict_start) &&
+	  WriteUL (f, tag_dict_size) &&
+	  WriteUL (f, num_docs) &&
+	  WriteUL (f, num_frags) &&
+	  WriteUL (f, num_words) &&
+	  WriteUL (f, total_bytes) &&
+	  WriteUL (f, index_string_bytes) &&
+	  WriteUL (f, num_levels));
+}
+
+
+
+void dict_el::Clear () {
+  el.erase (el.begin(), el.end());
+  frag_occur = 0;
+  freq = 0;
+}
+
+bool dict_el::Read (FILE *f) {
+  return (ReadPreSufStr (f, el) &&
+	  ReadUL (f, frag_occur) &&
+	  ReadUL (f, freq));
+}
+
+bool dict_el::Write (FILE *f, const UCArray *lastEl) const {
+  return (WritePreSufStr (f, lastEl, el) &&
+	  WriteUL (f, frag_occur) &&
+	  WriteUL (f, freq));
+}
+
+
+void word_dict_el::Clear () {
+  dict_el::Clear();
+  if (levelFreqs != NULL) delete [] levelFreqs;
+  levelFreqs = NULL;
+}
+
+word_dict_el::~word_dict_el () {
+  if (levelFreqs != NULL) delete [] levelFreqs;
+}
+
+void word_dict_el::SetNumLevels (unsigned long numLevels) {
+  if (levelFreqs != NULL) delete [] levelFreqs;
+  levelFreqs = new unsigned long [numLevels];
+}
+  
+bool word_dict_el::Read (FILE *f, unsigned long numLevels) {
+  if (!dict_el::Read (f)) return false;
+
+  if (levelFreqs == NULL) return false;
+  
+  unsigned long i;
+  for (i=0; i<numLevels; i++) {
+    if (!ReadUL (f, levelFreqs[i])) return false;
+  }
+
+  return true;
+}
+
+bool word_dict_el::Write (FILE *f, const UCArray *lastEl,
+			  unsigned long numLevels) const {
+  if (!dict_el::Write (f, lastEl)) return false;
+
+  if (levelFreqs == NULL) return false;
+
+  unsigned long i;
+  for (i=0; i<numLevels; i++) {
+    if (!WriteUL (f, levelFreqs[i])) return false;
+  }
+
+  return true;
+}
+
+
+
+block_dict_header::block_dict_header () {
+  Clear();
+}
+
+void block_dict_header::Clear () {
+  invf_dict_header::Clear();
+
+  entries_per_wblk = 0;
+  num_wblks = 0;
+  max_wblk_size = 0;
+  wblk_start = 0;
+  wblk_idx_start = 0;
+  
+  entries_per_tblk = 0;
+  num_tblks = 0;
+  max_tblk_size = 0;
+  tblk_start = 0;
+  tblk_idx_start = 0;
+}
+
+bool block_dict_header::Read (FILE *f) {
+  return (invf_dict_header::Read (f) &&
+
+	  ReadUL (f, entries_per_wblk) &&
+	  ReadUL (f, num_wblks) &&
+	  ReadUL (f, max_wblk_size) &&
+	  ReadUL (f, wblk_start) &&
+	  ReadUL (f, wblk_idx_start) &&
+  
+	  ReadUL (f, entries_per_tblk) &&
+	  ReadUL (f, num_tblks) &&
+	  ReadUL (f, max_tblk_size) &&
+	  ReadUL (f, tblk_start) &&
+	  ReadUL (f, tblk_idx_start));
+}
+
+bool block_dict_header::Write (FILE *f) const {
+  return (invf_dict_header::Write (f) &&
+
+	  WriteUL (f, entries_per_wblk) &&
+	  WriteUL (f, num_wblks) &&
+	  WriteUL (f, max_wblk_size) &&
+	  WriteUL (f, wblk_start) &&
+	  WriteUL (f, wblk_idx_start) &&
+  
+	  WriteUL (f, entries_per_tblk) &&
+	  WriteUL (f, num_tblks) &&
+	  WriteUL (f, max_tblk_size) &&
+	  WriteUL (f, tblk_start) &&
+	  WriteUL (f, tblk_idx_start));
+}
+
+
+
+
+
+void block_dict_el::Clear () {
+  el.erase (el.begin(), el.end());
+  frag_occur = 0;
+  freq = 0;
+  invf_ptr = 0;
+}
+
+bool block_dict_el::Read (FILE *f) {
+  return (ReadPreSufStr (f, el) &&
+	  ReadUL (f, frag_occur) &&
+	  ReadUL (f, freq) &&
+	  ReadUL (f, invf_ptr));
+}
+
+bool block_dict_el::Write (FILE *f, const UCArray *lastEl) const {
+  return (WritePreSufStr (f, lastEl, el) &&
+	  WriteUL (f, frag_occur) &&
+	  WriteUL (f, freq) &&
+	  WriteUL (f, invf_ptr));
+}
+
+
+
+
+
+void word_block_dict_el::Clear () {
+  block_dict_el::Clear();
+  if (levelFreqs != NULL) delete [] levelFreqs;
+  levelFreqs = NULL;
+}
+
+word_block_dict_el::~word_block_dict_el () {
+  if (levelFreqs != NULL) delete [] levelFreqs;
+}
+
+void word_block_dict_el::SetNumLevels (unsigned long numLevels) {
+  if (levelFreqs != NULL) delete [] levelFreqs;
+  levelFreqs = new unsigned long [numLevels];
+}
+
+bool word_block_dict_el::Read (FILE *f, unsigned long numLevels) {
+  if (!block_dict_el::Read (f)) return false;
+  
+  if (levelFreqs == NULL) return false;
+  
+  unsigned long i;
+  for (i=0; i<numLevels; i++) {
+    if (!ReadUL (f, levelFreqs[i])) return false;
+  }
+
+  return true;
+}
+
+bool word_block_dict_el::Write (FILE *f, const UCArray *lastEl,
+				unsigned long numLevels) const {
+  if (!block_dict_el::Write (f, lastEl)) return false;
+  
+  if (levelFreqs == NULL) return false;
+  
+  unsigned long i;
+  for (i=0; i<numLevels; i++) {
+    if (!WriteUL (f, levelFreqs[i])) return false;
+  }
+  
+  return true;
+}
+
+
+
+
+block_idx_info::block_idx_info () {
+  Clear ();
+}
+
+void block_idx_info::Clear () {
+  el.erase (el.begin(), el.end());
+  block_ptr = 0;
+}
+
+bool block_idx_info::Read (FILE *f) {
+  return (ReadUCArray (f, el) &&
+	  ReadUL (f, block_ptr));
+}
+
+bool block_idx_info::Write (FILE *f) const {
+  return (WriteUCArray (f, el) &&
+	  WriteUL (f, block_ptr));
+}
+
+
+bool ReadBlockIdx (FILE *f, block_idx &blockIdx) {
+  blockIdx.erase (blockIdx.begin(), blockIdx.end());
+  
+  // read in the array size
+  unsigned long arraySize = 0;
+  if (!ReadVarLenUL (f, arraySize)) return false;
+  
+  // read in the array
+  block_idx_info bi;
+  while (arraySize > 0) {
+    if (!bi.Read (f)) return false;
+    blockIdx.push_back (bi);
+    
+    arraySize--;
+  }
+  
+  return true;
+}
+
+bool WriteBlockIdx (FILE *f, const block_idx &blockIdx) {
+  // write out the array size
+  if (!WriteVarLenUL (f, blockIdx.size())) return false;
+
+  block_idx::const_iterator here = blockIdx.begin();
+  block_idx::const_iterator end = blockIdx.end();
+  while (here != end) {
+    if (!(*here).Write (f)) return false;
+    here++;
+  }
+
+  return true;
+}
+
+
+
+
+stem_idx_header::stem_idx_header () {
+  Clear ();
+}
+
+void stem_idx_header::Clear () {
+  lookback = 0;
+  dict_size = 0;
+
+  entries_per_block = 0;
+  num_blocks = 0;
+  max_block_size = 0;
+  blocks_start = 0;
+  block_idx_start = 0;
+  
+  stemmer_num = 0;
+  stem_method = 0;
+}
+
+bool stem_idx_header::Read (FILE *f) {
+  return (ReadUL (f, lookback) &&
+	  ReadUL (f, dict_size) &&
+	  
+	  ReadUL (f, entries_per_block) &&
+	  ReadUL (f, num_blocks) &&
+	  ReadUL (f, max_block_size) &&
+	  ReadUL (f, blocks_start) &&
+	  ReadUL (f, block_idx_start) &&
+	  
+	  ReadUL (f, stemmer_num) &&
+	  ReadUL (f, stem_method));
+}
+
+bool stem_idx_header::Write (FILE *f) const {
+  return (WriteUL (f, lookback) &&
+	  WriteUL (f, dict_size) &&
+	  
+	  WriteUL (f, entries_per_block) &&
+	  WriteUL (f, num_blocks) &&
+	  WriteUL (f, max_block_size) &&
+	  WriteUL (f, blocks_start) &&
+	  WriteUL (f, block_idx_start) &&
+	  
+	  WriteUL (f, stemmer_num) &&
+	  WriteUL (f, stem_method));
+}
+
+
+
+stem_block_dict_el::stem_block_dict_el () {
+  Clear ();
+}
+
+void stem_block_dict_el::Clear () {
+  el.erase (el.begin(), el.end());
+  equivWords.erase (equivWords.begin(), equivWords.end());
+}
+
+bool stem_block_dict_el::Read (FILE *f) {
+  equivWords.erase (equivWords.begin(), equivWords.end());
+  
+  if (!ReadPreSufStr (f, el)) return false;
+  
+  // read in the array size
+  unsigned long arraySize = 0;
+  if (!ReadVarLenUL (f, arraySize)) return false;
+  
+  // read in the array
+  unsigned long wordNum;
+  while (arraySize > 0) {
+    if (!ReadUL (f, wordNum)) return false;
+    equivWords.push_back (wordNum);
+    
+    arraySize--;
+  }
+  
+  return true;
+}
+
+bool stem_block_dict_el::Write (FILE *f, const UCArray *lastEl) const {
+  if (!WritePreSufStr (f, lastEl, el)) return false;
+
+  // write out the array size
+  if (!WriteVarLenUL (f, equivWords.size())) return false;
+
+  vector<unsigned long>::const_iterator here = equivWords.begin();
+  vector<unsigned long>::const_iterator end = equivWords.end();
+  while (here != end) {
+    if (!WriteUL (f, (*here))) return false;
+    here++;
+  }
+
+  return true;
+}
+
+
+
+
+invf_file_header::invf_file_header () {
+  Clear ();
+}
+
+void invf_file_header::Clear () {
+  no_of_words = 0;
+  no_of_tags = 0;
+  skip_mode = SKIP_MODE_NO_SKIPS;
+  word_level_index = 0;
+  
+  int i;
+  for (i=0; i<16; i++) params[i] = 0;
+}
+  
+bool invf_file_header::Read (FILE *f) {
+  if (!ReadUL (f, no_of_words) ||
+      !ReadUL (f, no_of_tags) ||
+      !ReadUL (f, skip_mode) ||
+      !ReadUL (f, word_level_index)) return false;
+
+  int i;
+  for (i=0; i<16; i++) {
+    if (!ReadUL (f, params[i])) return false;
+  }
+
+  return true;
+}
+
+bool invf_file_header::Write (FILE *f) const {
+  if (!WriteUL (f, no_of_words) ||
+      !WriteUL (f, no_of_tags) ||
+      !WriteUL (f, skip_mode) ||
+      !WriteUL (f, word_level_index)) return false;
+
+  int i;
+  for (i=0; i<16; i++) {
+    if (!WriteUL (f, params[i])) return false;
+  }
+
+  return true;
+}
+
+
+
+
+
+bool SearchElNum (const block_idx &bIdx,
+		  unsigned long entriesPerBlock,
+		  unsigned long elNum,
+		  unsigned long &blockIdxNum,
+		  unsigned long &blockStartElNum) {
+  blockIdxNum = 0;
+  blockStartElNum = 0;
+
+  // make sure the element number isn't out of range
+  if (elNum > bIdx.size()*entriesPerBlock) return false;
+
+  blockIdxNum = elNum / entriesPerBlock;
+  blockStartElNum = blockIdxNum * entriesPerBlock;
+  
+  return true;
+}
+
+bool SearchEl (const block_idx &bIdx,
+	       unsigned long entriesPerBlock,
+	       const UCArray &el,
+	       unsigned long &blockIdxNum,
+	       unsigned long &blockStartElNum) {
+  blockIdxNum = 0;
+  blockStartElNum = 0;
+
+  unsigned long begin = 0;
+  unsigned long bIdxEnd = bIdx.size();
+  unsigned long end = bIdxEnd;
+  unsigned long mid;
+  while (begin < end) {
+    mid = (begin+end)/2;
+    if (DictCompare (el, bIdx[mid].el) < 0) {
+      end = mid;
+    } else if (mid+1 < bIdxEnd &&
+	       DictCompare (el, bIdx[mid+1].el) >= 0) {
+      begin = mid+1;
+    } else {
+      blockIdxNum = mid;
+      blockStartElNum = blockIdxNum * entriesPerBlock;
+      return true;
+    }
+  }
+  
+  return false;
+}
+
+
+
+// use the block dictionary functions for tag entries, and word block dict
+// functions for word entries.
+
+
+bool SearchBlockDictElNum (FILE *dictFile,
+			   const block_idx &bIdx,
+			   unsigned long entriesPerBlock,
+			   unsigned long dictSize,
+			   unsigned long elNum,
+			   block_dict_el &dictEl) {
+  UCArrayClear (dictEl.el);
+  if (elNum >= dictSize) return false;
+
+  // find the block that contains the element
+  unsigned long blockIdxNum, curElNum;
+  if (!SearchElNum (bIdx, entriesPerBlock, elNum,
+		    blockIdxNum, curElNum))
+    return false;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  do {
+    dictEl.Read (dictFile);
+  } while (curElNum++ < elNum);
+
+  return true;
+}
+
+bool SearchBlockDictEl (FILE *dictFile,
+			const block_idx &bIdx,
+			unsigned long entriesPerBlock,
+			unsigned long dictSize,
+			const UCArray &el,
+			block_dict_el &dictEl,
+			unsigned long &elNum) {
+  UCArrayClear (dictEl.el);
+
+  // find the block that contains the element
+  unsigned long blockIdxNum;
+  if (!SearchEl (bIdx, entriesPerBlock, el,
+		 blockIdxNum, elNum))
+    return false;
+
+  unsigned long blockEndElNum = elNum + entriesPerBlock;
+  if (blockEndElNum > dictSize) blockEndElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  while (elNum < blockEndElNum) {
+    dictEl.Read (dictFile);
+    int res = DictCompare (dictEl.el, el);
+    if (res == 0) return true; // found it
+    else if (res > 0) break; // not here
+    
+    elNum++;
+  }
+
+  return false;
+}
+
+
+
+
+bool SearchWordBlockDictElNum (FILE *dictFile,
+			       const block_idx &bIdx,
+			       unsigned long entriesPerBlock,
+			       unsigned long dictSize,
+			       unsigned long numLevels,
+			       unsigned long elNum,
+			       word_block_dict_el &dictEl) {
+  UCArrayClear (dictEl.el);
+  if (elNum >= dictSize) return false;
+
+  // find the block that contains the element
+  unsigned long blockIdxNum, curElNum;
+  if (!SearchElNum (bIdx, entriesPerBlock, elNum,
+		    blockIdxNum, curElNum))
+    return false;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  do {
+    dictEl.Read (dictFile, numLevels);
+  } while (curElNum++ < elNum);
+
+  return true;
+}
+
+bool SearchWordBlockDictEl (FILE *dictFile,
+			    const block_idx &bIdx,
+			    unsigned long entriesPerBlock,
+			    unsigned long dictSize,
+			    unsigned long numLevels,
+			    const UCArray &el,
+			    word_block_dict_el &dictEl,
+			    unsigned long &elNum) {
+  UCArrayClear (dictEl.el);
+
+  // find the block that contains the element
+  unsigned long blockIdxNum;
+  if (!SearchEl (bIdx, entriesPerBlock, el,
+		 blockIdxNum, elNum))
+    return false;
+
+  unsigned long blockEndElNum = elNum + entriesPerBlock;
+  if (blockEndElNum > dictSize) blockEndElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  while (elNum < blockEndElNum) {
+    dictEl.Read (dictFile, numLevels);
+    int res = DictCompare (dictEl.el, el);
+    if (res == 0) return true; // found it
+    else if (res > 0) break; // not here
+    
+    elNum++;
+  }
+
+  return false;
+}
+
+
+
+
+bool SearchStemBlockDictElNum (FILE *dictFile,
+			       const block_idx &bIdx,
+			       unsigned long entriesPerBlock,
+			       unsigned long dictSize,
+			       unsigned long elNum,
+			       stem_block_dict_el &dictEl) {
+  UCArrayClear (dictEl.el);
+  if (elNum >= dictSize) return false;
+
+  // find the block that contains the element
+  unsigned long blockIdxNum, curElNum;
+  if (!SearchElNum (bIdx, entriesPerBlock, elNum,
+		    blockIdxNum, curElNum))
+    return false;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  do {
+    dictEl.Read (dictFile);
+  } while (curElNum++ < elNum);
+
+  return true;
+}
+
+bool SearchStemBlockDictEl (FILE *dictFile,
+			    const block_idx &bIdx,
+			    unsigned long entriesPerBlock,
+			    unsigned long dictSize,
+			    const UCArray &el,
+			    stem_block_dict_el &dictEl,
+			    unsigned long &elNum) {
+  UCArrayClear (dictEl.el);
+
+  // find the block that contains the element
+  unsigned long blockIdxNum;
+  if (!SearchEl (bIdx, entriesPerBlock, el,
+		 blockIdxNum, elNum))
+    return false;
+
+  unsigned long blockEndElNum = elNum + entriesPerBlock;
+  if (blockEndElNum > dictSize) blockEndElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  while (elNum < blockEndElNum) {
+    dictEl.Read (dictFile);
+    int res = DictCompare (dictEl.el, el);
+    if (res == 0) return true; // found it
+    else if (res > 0) break; // not here
+    
+    elNum++;
+  }
+
+  return false;
+}
+
+//----------------------------------------------------------------
+// functions for full text browse
+
+bool NearestSearchWordBlockDictEl (FILE *dictFile,
+				   const block_idx &bIdx,
+				   unsigned long entriesPerBlock,
+				   unsigned long dictSize,
+				   unsigned long numLevels,
+				   const UCArray &el,
+				   word_block_dict_el &dictEl,
+				   unsigned long &elNum) {
+
+  UCArrayClear (dictEl.el);
+
+  // find the block that contains the element
+  unsigned long blockIdxNum;
+  if (!SearchEl (bIdx, entriesPerBlock, el,
+		 blockIdxNum, elNum))
+    return false;
+
+  unsigned long blockEndElNum = elNum + entriesPerBlock;
+  if (blockEndElNum > dictSize) blockEndElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  while (elNum < blockEndElNum) {
+    dictEl.Read (dictFile, numLevels);
+    int res = DictCompare (el, dictEl.el); // look for the first word that is
+                                     // greater or equal to the el
+    if (res <= 0) {
+      return true; // found one
+   } 
+    
+    elNum++;
+  }
+  // it must be the last term
+  return true;
+
+
+}
+
+
+bool SearchWordBlockDictElNumRange (FILE *dictFile,
+				    const block_idx &bIdx,
+				    unsigned long entriesPerBlock,
+				    unsigned long dictSize,
+				    unsigned long numLevels,
+				    unsigned long elNum,
+				    unsigned long numWords,
+				    UCArrayVector &terms) {
+
+  word_block_dict_el dictEl;  
+  dictEl.SetNumLevels (numLevels);
+  UCArrayClear(dictEl.el);
+
+  terms.erase(terms.begin(), terms.end());
+
+  if (elNum >= dictSize) return false;
+  
+  // find the block that contains the element
+  unsigned long blockIdxNum, curElNum;
+  if (!SearchElNum (bIdx, entriesPerBlock, elNum,
+		    blockIdxNum, curElNum))
+    return false;
+
+  unsigned long lastElNum = elNum + numWords - 1;
+  if (lastElNum > dictSize) lastElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  
+  // get the first term
+  do {
+    dictEl.Read (dictFile, numLevels);
+  } while (curElNum++ < elNum);
+
+  terms.push_back(dictEl.el);
+  while (curElNum <= lastElNum ) {
+    dictEl.Read(dictFile, numLevels);
+    terms.push_back(dictEl.el);
+    curElNum++;
+  }
+  
+
+  return true;
+}
+
+// NOte: before each addition of dictEl to the array, the level freqs array
+// is deleted, as this was causing problems - generating a seg fault, I think if
+// the vector had to be reallocated or something.
+// setNumLevels has to be called each time before a read, now, to set up the level
+//freqs array. this is necessary.
+bool SearchWordBlockDictElNumRange (FILE *dictFile,
+				    const block_idx &bIdx,
+				    unsigned long entriesPerBlock,
+				    unsigned long dictSize,
+				    unsigned long numLevels,
+				    unsigned long elNum,
+				    unsigned long numWords,
+				    word_block_dict_el_array &terms) {
+
+  word_block_dict_el dictEl;
+  dictEl.SetNumLevels (numLevels);
+  UCArrayClear(dictEl.el);
+
+  block_dict_el elem;
+  terms.erase(terms.begin(), terms.end());
+
+  if (elNum >= dictSize) return false;
+  
+  // find the block that contains the element
+  unsigned long blockIdxNum, curElNum;
+  if (!SearchElNum (bIdx, entriesPerBlock, elNum,
+		    blockIdxNum, curElNum))
+    return false;
+
+  unsigned long lastElNum = elNum + numWords - 1;
+  if (lastElNum > dictSize) lastElNum = dictSize;
+
+  // look for the block
+  fseek (dictFile, bIdx[blockIdxNum].block_ptr, SEEK_SET);
+  // get the first term
+  do {
+    dictEl.Read (dictFile, numLevels);
+  } while (curElNum++ < elNum);
+
+  dictEl.levelFreqs = NULL;
+  terms.push_back(dictEl);
+
+  while (curElNum <= lastElNum ) { 
+    dictEl.SetNumLevels(numLevels);
+    dictEl.Read(dictFile, numLevels);
+    dictEl.levelFreqs = NULL;
+    terms.push_back(dictEl);
+    curElNum++;
+  }
+
+  return true;
+}
+
+
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/invf.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/invf.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/invf.h	(revision 21083)
@@ -0,0 +1,339 @@
+/**************************************************************************
+ *
+ * invf.h -- Data structures for inverted files
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ **************************************************************************/
+
+
+#ifndef H_INVF
+#define H_INVF
+
+#include <stdio.h>
+
+#include "UCArray.h"
+
+// NOTE: This does not include the magic number
+// header info for .invf.dict file
+struct invf_dict_header {
+  unsigned long lookback;
+  unsigned long word_dict_start;
+  unsigned long word_dict_size;
+  unsigned long tag_dict_start;
+  unsigned long tag_dict_size;
+  unsigned long num_docs;
+  unsigned long num_frags;
+  unsigned long num_words;
+  unsigned long total_bytes;
+  unsigned long index_string_bytes;
+  unsigned long num_levels;
+
+  invf_dict_header ();
+  virtual ~invf_dict_header ();
+  virtual void Clear();
+
+  virtual bool Read (FILE *f);
+  virtual bool Write (FILE *f) const;
+};
+
+
+struct dict_el {
+  UCArray el; // word or tag
+  unsigned long frag_occur;
+  unsigned long freq;
+
+  virtual void Clear ();
+  dict_el () { Clear (); }
+  virtual ~dict_el () { }
+
+  // Read assumes that the last word is in el
+  bool Read (FILE *f);
+  bool Write (FILE *f, const UCArray *lastEl) const;
+};
+
+
+struct word_dict_el : public dict_el {
+  unsigned long *levelFreqs;
+
+  void Clear ();
+  word_dict_el () { levelFreqs = NULL; Clear (); }
+  ~word_dict_el ();
+
+  void SetNumLevels (unsigned long numLevels);
+
+  // SetNumLevels should be called before either
+  // reading or writing using Read and Write
+  
+  // Read assumes that the last word is in el
+  bool Read (FILE *f, unsigned long numLevels);
+  bool Write (FILE *f, const UCArray *lastEl,
+	      unsigned long numLevels) const;
+};
+
+
+// wblk = word block
+// tblk = tag block
+// this version of the blocked dictionary uses a fixed number
+// of entries per block, not a fixed block size
+// info for .invf.dict.blocked file
+// blocked dict has a heap of blocks, some for words, some for tags
+// and an index into each set of blocks. The index has pointers to
+// the first entry in each block. Can do a binary search on the index
+// to find out which block an elemnet is in
+struct block_dict_header : public invf_dict_header {
+  // note: word_dict_start and tag_dict_start are undefined
+  // for blocked dictionaries
+
+  unsigned long entries_per_wblk; // word blocks
+  unsigned long num_wblks;
+  unsigned long max_wblk_size;
+  unsigned long wblk_start;
+  unsigned long wblk_idx_start;
+  
+  unsigned long entries_per_tblk; // tag blocks
+  unsigned long num_tblks;
+  unsigned long max_tblk_size;
+  unsigned long tblk_start;
+  unsigned long tblk_idx_start;
+  
+  block_dict_header ();
+  void Clear ();
+  
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+
+struct block_dict_el {
+  UCArray el; // word or tag
+  unsigned long frag_occur; // # entries in invf file - if have a
+  // word level index, this is the same as freq, otherwise, its the number
+  // of fragments containing this word
+  unsigned long freq; // # of times this word occurs
+  unsigned long invf_ptr; // pointer into inverted file
+
+  virtual void Clear ();
+  block_dict_el () { Clear (); }
+  virtual ~block_dict_el () { }
+
+  // Read assumes that the last word is in el
+  // set lastEl = NULL when no lookback is wanted (eg
+  // for the start of a block
+  bool Read (FILE *f);
+  bool Write (FILE *f, const UCArray *lastEl) const;
+};
+
+struct word_block_dict_el : public block_dict_el {
+  unsigned long *levelFreqs; // freq of the word at each level
+
+  void Clear ();
+  word_block_dict_el () { levelFreqs = NULL; Clear (); }
+  ~word_block_dict_el ();
+
+  void SetNumLevels (unsigned long numLevels);
+
+  // SetNumLevels should be called before either
+  // reading or writing using Read and Write
+  
+  // Read assumes that the last word is in el
+  bool Read (FILE *f, unsigned long numLevels);
+  bool Write (FILE *f, const UCArray *lastEl,
+	      unsigned long numLevels) const;
+};
+
+typedef vector<word_block_dict_el> word_block_dict_el_array;
+
+struct block_idx_info {
+  UCArray el;
+  unsigned long block_ptr;
+
+  block_idx_info ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+// used for an index into the word and tag blocks
+typedef vector<block_idx_info> block_idx;
+
+bool ReadBlockIdx (FILE *f, block_idx &blockIdx);
+bool WriteBlockIdx (FILE *f, const block_idx &blockIdx);
+
+
+
+struct stem_idx_header {
+  unsigned long lookback;
+  unsigned long dict_size;
+
+  unsigned long entries_per_block;
+  unsigned long num_blocks;
+  unsigned long max_block_size;
+  unsigned long blocks_start;
+  unsigned long block_idx_start;
+  
+  unsigned long stemmer_num;
+  unsigned long stem_method;
+
+  stem_idx_header ();
+  void Clear ();
+
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+struct stem_block_dict_el {
+  UCArray el; // word or tag
+  vector<unsigned long> equivWords;
+  
+  stem_block_dict_el ();
+  void Clear ();
+
+  // Read assumes that the last word is in el
+  // set lastEl = NULL when no lookback is wanted (eg
+  // for the start of a block
+  bool Read (FILE *f);
+  bool Write (FILE *f, const UCArray *lastEl) const;
+};
+
+
+
+#define SKIP_MODE_NO_SKIPS 0
+
+// invf file - has a list of frags for each word, but the word is not 
+//  stored in the invf file - the dictionaries store the words, along
+// with num entries, and a pointer into invf file
+struct invf_file_header {
+  unsigned long no_of_words;
+  unsigned long no_of_tags;
+  unsigned long skip_mode;
+  unsigned long word_level_index; // 1 if word level index
+  unsigned long params[16];
+
+  invf_file_header ();
+  void Clear ();
+  
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+
+
+
+
+
+// the search functions returns true if a block that could
+// satisfy the request is found. these functions assume that
+// the block index is sorted by DictCompare (or DictLTUCArray)
+bool SearchElNum (const block_idx &bIdx,
+		  unsigned long entriesPerBlock,
+		  unsigned long elNum,
+		  unsigned long &blockIdxNum,
+		  unsigned long &blockStartElNum);
+bool SearchEl (const block_idx &bIdx,
+	       unsigned long entriesPerBlock,
+	       const UCArray &el,
+	       unsigned long &blockIdxNum,
+	       unsigned long &blockStartElNum);
+
+
+// The next six functions use SearchElNum and SearchEl
+// for a particular type of dictionary (Block, WordBlock, or StemBlock)
+// and then look up the entry
+bool SearchBlockDictElNum (FILE *dictFile,
+			   const block_idx &bIdx,
+			   unsigned long entriesPerBlock,
+			   unsigned long dictSize,
+			   unsigned long elNum,
+			   block_dict_el &dictEl);
+bool SearchBlockDictEl (FILE *dictFile,
+			const block_idx &bIdx,
+			unsigned long entriesPerBlock,
+			unsigned long dictSize,
+			const UCArray &el,
+			block_dict_el &dictEl,
+			unsigned long &elNum);
+
+// assumes the numLevels has been set for dictEl
+bool SearchWordBlockDictElNum (FILE *dictFile,
+			       const block_idx &bIdx,
+			       unsigned long entriesPerBlock,
+			       unsigned long dictSize,
+			       unsigned long numLevels,
+			       unsigned long elNum,
+			       word_block_dict_el &dictEl);
+bool SearchWordBlockDictEl (FILE *dictFile,
+			    const block_idx &bIdx,
+			    unsigned long entriesPerBlock,
+			    unsigned long dictSize,
+			    unsigned long numLevels,
+			    const UCArray &el,
+			    word_block_dict_el &dictEl,
+			    unsigned long &elNum);
+
+bool SearchStemBlockDictElNum (FILE *dictFile,
+			       const block_idx &bIdx,
+			       unsigned long entriesPerBlock,
+			       unsigned long dictSize,
+			       unsigned long elNum,
+			       stem_block_dict_el &dictEl);
+bool SearchStemBlockDictEl (FILE *dictFile,
+			    const block_idx &bIdx,
+			    unsigned long entriesPerBlock,
+			    unsigned long dictSize,
+			    const UCArray &el,
+			    stem_block_dict_el &dictEl,
+			    unsigned long &elNum);
+
+//----------------------------------------------------------
+
+// new functions for full text browse
+
+bool NearestSearchWordBlockDictEl (FILE *dictFile,
+			    const block_idx &bIdx,
+			    unsigned long entriesPerBlock,
+			    unsigned long dictSize,
+			    unsigned long numLevels,
+			    const UCArray &el,
+			    word_block_dict_el &dictEl,
+			    unsigned long &elNum);
+
+// returns a list of word_block_dict_el, with no levelfreqs
+bool SearchWordBlockDictElNumRange (FILE *dictFile,
+				    const block_idx &bIdx,
+				    unsigned long entriesPerBlock,
+				    unsigned long dictSize,
+				    unsigned long numLevels,
+				    unsigned long elNum,
+				    unsigned long numWords,
+				    word_block_dict_el_array &terms);
+				    
+// just returns a list of terms
+bool SearchWordBlockDictElNumRange (FILE *dictFile,
+				    const block_idx &bIdx,
+				    unsigned long entriesPerBlock,
+				    unsigned long dictSize,
+				    unsigned long numLevels,
+				    unsigned long elNum,
+				    unsigned long numWords,
+				    UCArrayVector &terms);
+				    
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass1.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass1.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass1.cpp	(revision 21083)
@@ -0,0 +1,775 @@
+/**************************************************************************
+ *
+ * ivf.pass1.cpp -- Memory efficient pass 1 inversion
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "UCArray.h"
+#include "sysfuncs.h"
+#include "mg_files.h"
+#include "invf.h"
+#include "mg.h"
+#include "build.h"
+#include "locallib.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include <stdio.h>
+#include "words.h"
+#include "messages.h"
+#include "netorder.h"
+#include "FIvfLevelInfo.h"
+
+#include "longlong.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+// a fragment corresponds to the index level (word-level is the
+// minimum index level)
+
+
+// structure to determine level information
+struct LevelWorker {
+  unsigned long lastLevelDocNum;
+  unsigned long count;
+
+  LevelWorker () {
+    lastLevelDocNum = count = 0;
+  }
+};
+
+
+// note: the word is stored in the map
+struct IvfWordInfo {
+  unsigned long wordCount;      // word frequency
+  unsigned long fragCount;      // number of fragments that contain the word
+  unsigned long lastFragNum;    // last fragment to contain the word
+  unsigned long chunkWordCount; // word frequency within this chunk
+  unsigned long chunkFragCount; // number of fragments within this chunk that
+                                //   contain the word
+
+  LevelWorker *levels;          // level info for this word
+  
+  IvfWordInfo ();
+  ~IvfWordInfo ();
+  void Clear ();                // will delete levels
+};
+
+typedef map<UCArray, IvfWordInfo, DictLTUCArray> IvfWordInfoMap;
+typedef vector<IvfWordInfoMap::iterator> IvfWordInfoItArray;
+
+// tags don't require as much information
+struct IvfTagInfo {
+  unsigned long tagCount;       // tag frequency
+  unsigned long fragCount;      // number of fragments that contain the tag
+  unsigned long lastFragNum;    // last fragment to contain the tag
+  unsigned long chunkFragCount; // number of fragments within this chunk that
+                                //   contain the tag
+
+  IvfTagInfo ();
+  void Clear ();
+};
+
+typedef map<UCArray, IvfTagInfo, DictLTUCArray> IvfTagInfoMap;
+typedef vector<IvfTagInfoMap::iterator> IvfTagInfoItArray;
+
+
+#define INIT_CHECK_FRAC 0.10
+#define CHECK_FRAC 0.75
+#define CHECK_CLOSE 0.999
+#define CHECK_DIV 1.5
+
+
+static FILE *ic;		// the invf chunk file
+static stdio_bitio_buffer icb;
+
+IvfWordInfoMap ivfWordInfo;
+IvfWordInfoItArray ivfWordInfoOccurOrder;
+IvfTagInfoMap ivfTagInfo;
+IvfTagInfoItArray ivfTagInfoOccurOrder;
+
+static unsigned long chunksWritten;
+static unsigned long maxMemNeeded;
+
+static unsigned long numDocs;
+static unsigned long numChunkDocs;
+
+static unsigned long numFrags;
+static unsigned long numChunkFrags;
+
+static unsigned long numWords;
+
+// the number of document numbers in the inverted file
+static unsigned long numChunkEntries;
+
+// next entry in the inverted file to check memory
+// requirements for the current chunk
+static unsigned long entryCheckPoint;
+
+// information about all the different levels
+static FIvfLevel ivfLevel;
+
+
+
+IvfWordInfo::IvfWordInfo () {
+  levels = NULL;
+  Clear();
+}
+
+IvfWordInfo::~IvfWordInfo () {
+  if (levels != NULL) delete [] levels;
+}
+
+void IvfWordInfo::Clear () {
+  wordCount = 0;
+  chunkWordCount = 0;
+  lastFragNum = 0;
+  fragCount = 0;
+  chunkFragCount = 0;
+
+  if (levels != NULL) {
+    delete [] levels;
+    levels = NULL;
+  }
+}
+
+
+IvfTagInfo::IvfTagInfo () {
+  Clear();
+}
+
+void IvfTagInfo::Clear () {
+  tagCount = 0;
+  lastFragNum = 0;
+  fragCount = 0;
+  chunkFragCount = 0;
+}
+
+
+
+int init_ivf_1 (const TagInfo &tagInfo, char *file_name) {
+  // set up the chunk file
+  if (!(ic = create_file (file_name, INVF_CHUNK_SUFFIX, "wb",
+			  MAGIC_CHUNK, MG_MESSAGE)))
+    return COMPERROR;
+  fwrite ("    ", sizeof (u_long), 1, ic);	// Space for the maxmem
+  icb.attachFile (ic);
+  icb.encodeStart();
+
+  // reset global variables
+  ivfWordInfo.erase (ivfWordInfo.begin(), ivfWordInfo.end());
+  ivfWordInfoOccurOrder.erase (ivfWordInfoOccurOrder.begin(), ivfWordInfoOccurOrder.end());
+  ivfTagInfo.erase (ivfTagInfo.begin(), ivfTagInfo.end());
+  ivfTagInfoOccurOrder.erase (ivfTagInfoOccurOrder.begin(), ivfTagInfoOccurOrder.end());
+  
+  chunksWritten = 0;
+  maxMemNeeded = 0;
+ 
+  numDocs = 0;
+  numChunkDocs = 0;
+
+  numFrags = 0;
+  numChunkFrags = 0;
+
+  numWords = 0;
+
+  numChunkEntries = 0;
+  entryCheckPoint = (unsigned long) ((invf_buffer_size * INIT_CHECK_FRAC) / CHECK_DIV);
+
+  // init the level information
+  ivfLevel.Clear();
+  ivfLevel.docTag = tagInfo.docTag;
+  ivfLevel.indexLevel = tagInfo.indexLevel;
+  IvfLevelInfo blankLevel;
+  UCArraySet::const_iterator levelHere = tagInfo.levelTags.begin();
+  UCArraySet::const_iterator levelEnd = tagInfo.levelTags.end();
+  while (levelHere != levelEnd) {
+    blankLevel.levelTag = *levelHere;
+    ivfLevel.levelInfo[*levelHere] = blankLevel;
+    levelHere++;
+  }
+  
+  return COMPALLOK;
+}
+
+static void ProcessOpenTag (const TagInfo &tagInfo, const TextEl &el,
+			    bool &inFrag) {
+  bool wordLevelIndex = tagInfo.indexLevel.empty();
+
+  // check for start of next fragment
+  if (!wordLevelIndex && el.tagName == tagInfo.indexLevel) {
+    numFrags++;
+    numChunkFrags++;
+    inFrag = true;
+  }
+  
+  // update tag stats
+  IvfTagInfo &i = ivfTagInfo[el.tagName];
+  if (i.tagCount == 0) {
+    // new tag, add to list of iterators
+    IvfTagInfoMap::iterator iIt = ivfTagInfo.find (el.tagName);
+    ivfTagInfoOccurOrder.push_back (iIt);
+  }
+  i.tagCount++;
+
+  // all open tags count as new tags
+  numChunkEntries++;
+  i.fragCount++;
+  i.chunkFragCount++;
+  i.lastFragNum = numFrags;
+  
+  // update level information
+  IvfLevelInfoMap::iterator levelIt = ivfLevel.levelInfo.find (el.tagName);
+  if (levelIt != ivfLevel.levelInfo.end()) {
+    // is a level tag
+    (*levelIt).second.numEntries++;
+    (*levelIt).second.workInLevel = true;
+  }
+}
+
+static void ProcessCloseTag (const TagInfo &tagInfo, const TextEl &el,
+			     bool &inFrag) {
+  bool wordLevelIndex = tagInfo.indexLevel.empty();
+
+  // check for end of fragment
+  if (!wordLevelIndex && el.tagName == tagInfo.indexLevel) {
+    inFrag = false;
+  }
+
+  // update level information
+  IvfLevelInfoMap::iterator levelIt = ivfLevel.levelInfo.find (el.tagName);
+  if (levelIt != ivfLevel.levelInfo.end()) {
+    // is a level tag
+    (*levelIt).second.workInLevel = false;
+  }
+}
+
+static void ProcessText (const TagInfo &tagInfo, const TextEl &el,
+			 bool &inFrag) {
+  bool wordLevelIndex = tagInfo.indexLevel.empty();
+
+  // make sure this text is to be indexed
+  if (!wordLevelIndex && !inFrag) return;
+
+  const unsigned char *textHere = &(el.text[0]);
+  const unsigned char *textEnd = &(el.text[el.text.size() - 1]);
+  UCArray word;
+  
+  if (!inaword (textHere, textEnd))
+    ParseNonindexWord (textHere, textEnd);
+
+  
+  // Alternately parse off words and non-words from the input
+  // Each token is then inserted into the set if it does
+  // not exist or has it's frequency count incremented if it does.
+
+  while (textHere <= textEnd) {
+    textHere = ParseIndexWord (textHere, textEnd, word);
+    textHere = ParseNonindexWord (textHere, textEnd);
+
+    if (!word.empty()) {
+      numWords++;
+
+      if (wordLevelIndex) {
+	numFrags++;
+	numChunkFrags++;
+      }
+      
+      // update word stats
+
+      IvfWordInfo &i = ivfWordInfo[word];
+      if (i.wordCount == 0) {
+	// new word
+	// add to list of iterators
+	IvfWordInfoMap::iterator iIt = ivfWordInfo.find (word);
+	ivfWordInfoOccurOrder.push_back (iIt);
+
+	// add level information array
+	if (ivfLevel.levelInfo.size() > 0) 
+	  i.levels = new LevelWorker [ivfLevel.levelInfo.size()];
+      }
+
+      i.wordCount++;
+      i.chunkWordCount++;
+      if (numFrags > i.lastFragNum) {
+	numChunkEntries++;
+	i.fragCount++;
+	i.chunkFragCount++;
+	i.lastFragNum = numFrags;
+      }
+
+      // update level information for this word
+      if (i.levels != NULL) {
+	IvfLevelInfoMap::iterator levelHere = ivfLevel.levelInfo.begin();
+	IvfLevelInfoMap::iterator levelEnd = ivfLevel.levelInfo.end();
+	LevelWorker *levelWorkerPtr = i.levels;
+	while (levelHere != levelEnd) {
+
+	  // check to make sure the level encompases this fragment
+	  if (!(*levelHere).second.workInLevel) {
+	    cerr << "Level tag <" << (*levelHere).first
+		 << "> does not encompass all fragments\n";
+	    exit (1);
+	  }
+	  
+	  if ((*levelHere).second.numEntries > (*levelWorkerPtr).lastLevelDocNum) {
+	    (*levelWorkerPtr).lastLevelDocNum = (*levelHere).second.numEntries;
+	    (*levelWorkerPtr).count ++;
+	  }
+	  
+	  levelHere++;
+	  levelWorkerPtr++;
+	}
+      }
+    }
+  }
+}
+
+
+static unsigned long MemoryRequired (bool wordLevelIndex) {
+  register unsigned long total = 0;
+
+  // add memory required for word entries
+  IvfWordInfoMap::const_iterator wordHere = ivfWordInfo.begin();
+  IvfWordInfoMap::const_iterator wordEnd = ivfWordInfo.end();
+  while (wordHere != wordEnd) {
+    register const IvfWordInfo &info = (*wordHere).second;
+    if (info.chunkFragCount > 0) {
+      total += BIO_Bblock_Bound (numChunkFrags, info.chunkFragCount);
+      if (!wordLevelIndex) {
+	total += info.chunkWordCount;
+      }
+    }
+    
+    wordHere++;
+  }
+
+  // add memory required for tag entries
+  IvfTagInfoMap::const_iterator tagHere = ivfTagInfo.begin();
+  IvfTagInfoMap::const_iterator tagEnd = ivfTagInfo.end();
+  while (tagHere != tagEnd) {
+    register const IvfTagInfo &info = (*tagHere).second;
+    if (info.chunkFragCount > 0) {
+      // two d entries for each frag entry
+      unsigned long pTag = info.chunkFragCount*2;
+      total += BIO_Bblock_Bound (numChunkFrags+pTag, pTag);
+    }
+    
+    tagHere++;
+  }
+  
+  total = (total + 7) >> 3;
+  return total;
+}
+
+
+/*
+static void PrintChunkInfo (unsigned long mem) {
+  cout << "Chunk Number: " << chunksWritten << "\n";
+  cout << "numChunkDocs " << numChunkDocs << "\n";
+  cout << "numChunkFrags " << numChunkFrags << "\n";
+  cout << "mem " << mem << "\n";
+  cout << "numWords " << ivfWordInfo.size() << "\n";
+  cout << "numTags " << ivfTagInfo.size() << "\n\n";
+
+  // output debug tag information in dictionary order
+  IvfTagInfoMap::iterator tagMapHere = ivfTagInfo.begin();
+  IvfTagInfoMap::iterator tagMapEnd = ivfTagInfo.end();
+  unsigned long tagNum = 0;
+  while (tagMapHere != tagMapEnd) {
+    cout << (*tagMapHere).first << " " << tagNum
+	 << " " << (*tagMapHere).second.chunkFragCount << "\n";
+    tagNum++;
+    tagMapHere++;
+  }
+}
+*/
+
+static void OutputChunkInfo (unsigned long mem, bool /*wordLevelIndex*/) {
+  chunksWritten++;
+
+  // sanity check
+  if (ivfWordInfo.size() != ivfWordInfoOccurOrder.size()) {
+    Message ("ERROR: Word information size mismatch: %u vs %u\n",
+	     (unsigned int)ivfWordInfo.size(),
+	     (unsigned int)ivfWordInfoOccurOrder.size());
+    exit (1);
+  }
+  if (ivfTagInfo.size() != ivfTagInfoOccurOrder.size()) {
+    Message ("ERROR: Tag information size mismatch: %u vs %u\n",
+	     (unsigned int)ivfTagInfo.size(),
+	     (unsigned int)ivfTagInfoOccurOrder.size());
+    exit (1);
+  }
+
+  icb.gamma_encode (numChunkDocs + 1, NULL);
+  icb.gamma_encode (numChunkFrags + 1, NULL);
+  icb.gamma_encode (mem + 1, NULL);
+  icb.gamma_encode (ivfWordInfo.size() + 1, NULL);
+  icb.gamma_encode (ivfTagInfo.size() + 1, NULL);
+
+  /*  PrintChunkInfo (mem);*/
+
+  // output word information in occurance order
+  IvfWordInfoItArray::iterator wordHere = ivfWordInfoOccurOrder.begin();
+  IvfWordInfoItArray::iterator wordEnd = ivfWordInfoOccurOrder.end();
+  while (wordHere != wordEnd) {
+    register IvfWordInfo &ivfWordInfo = (*(*wordHere)).second;
+    
+    icb.gamma_encode (ivfWordInfo.chunkWordCount + 1, NULL);
+    if (ivfWordInfo.chunkWordCount >= 2) {
+      icb.gamma_encode (ivfWordInfo.chunkFragCount, NULL);
+    }
+
+    ivfWordInfo.lastFragNum = 0;
+    ivfWordInfo.chunkWordCount = 0;
+    ivfWordInfo.chunkFragCount = 0;
+    
+    wordHere++;
+  }
+
+  // output tag information in occurance order
+  IvfTagInfoItArray::iterator tagHere = ivfTagInfoOccurOrder.begin();
+  IvfTagInfoItArray::iterator tagEnd = ivfTagInfoOccurOrder.end();
+  while (tagHere != tagEnd) {
+    register IvfTagInfo &ivfTagInfo = (*(*tagHere)).second;
+
+    icb.gamma_encode (ivfTagInfo.chunkFragCount + 1, NULL);
+
+    ivfTagInfo.lastFragNum = 0;
+    ivfTagInfo.chunkFragCount = 0;
+    
+    tagHere++;
+  }
+
+  numChunkDocs = 0;
+  numChunkFrags = 0;
+  numChunkEntries = 0;
+}
+
+
+int process_ivf_1 (const TagInfo &tagInfo, const TextElArray &doc) {
+  bool wordLevelIndex = tagInfo.indexLevel.empty();
+  bool inFrag = false;
+  if (wordLevelIndex) inFrag = true; // unconditional
+  
+  numDocs++;
+  numChunkDocs++;
+
+  // process each text element in this document
+  TextElArray::const_iterator here = doc.begin();
+  TextElArray::const_iterator end = doc.end();
+  while (here != end) {
+    if ((*here).elType == OpenTagE)
+      ProcessOpenTag (tagInfo, *here, inFrag);
+    else if ((*here).elType == CloseTagE)
+      ProcessCloseTag (tagInfo, *here, inFrag);
+    else if ((*here).elType == TextE)
+      ProcessText (tagInfo, *here, inFrag);
+    
+    here++;
+  }
+
+  // check the amount of memory needed for this chunk
+  if (numChunkEntries >= entryCheckPoint) {
+    unsigned long mem = MemoryRequired (wordLevelIndex);
+    if (mem >= invf_buffer_size * CHECK_CLOSE) {
+      if (mem > maxMemNeeded) maxMemNeeded = mem;
+      OutputChunkInfo (mem, wordLevelIndex);
+      entryCheckPoint = (unsigned long)
+	((invf_buffer_size * INIT_CHECK_FRAC) / CHECK_DIV);
+      
+    } else {
+      entryCheckPoint = (unsigned long)
+	(entryCheckPoint * ((CHECK_FRAC * (invf_buffer_size - mem)) / mem) +
+	 entryCheckPoint);
+      if (entryCheckPoint <= numChunkEntries)
+	entryCheckPoint = numChunkEntries + 1;
+    }
+  }
+  
+  return COMPALLOK;
+}
+
+
+static void CalcInvfDictSize (unsigned long &totalBytes,
+			      unsigned long &indexStringBytes) {
+  totalBytes = 0;	// The sum of the length of all words, including 
+			// the length byte
+  indexStringBytes = 0; // The amount of space required to store the 
+			// words in the diction, this takes into account 
+			// the prefixes
+  const UCArray *lastWord = NULL;
+  
+  // calculate size of word information
+  IvfWordInfoMap::iterator wordHere = ivfWordInfo.begin();
+  IvfWordInfoMap::iterator wordEnd = ivfWordInfo.end();
+  while (wordHere != wordEnd) {
+    unsigned long wordSize = (*wordHere).first.size();
+    totalBytes += wordSize + 1;
+    indexStringBytes += wordSize + 2;
+    if (lastWord != NULL)
+      indexStringBytes -= PrefixLen (*lastWord, (*wordHere).first);
+    lastWord = &((*wordHere).first);
+    
+    wordHere++;
+  }
+
+  // calculate size of tag information
+  lastWord = NULL;
+  IvfTagInfoMap::iterator tagHere = ivfTagInfo.begin();
+  IvfTagInfoMap::iterator tagEnd = ivfTagInfo.end();
+  while (tagHere != tagEnd) {
+    unsigned long tagSize = (*tagHere).first.size();
+    totalBytes += tagSize + 1;
+    indexStringBytes += tagSize + 2;
+    if (lastWord != NULL)
+      indexStringBytes -= PrefixLen (*lastWord, (*tagHere).first);
+    lastWord = &((*tagHere).first);
+    
+    tagHere++;
+  }
+}
+
+
+//      OutputInvfDict ():
+//                writes out the stemmed dictionary file
+//                in the following format 
+//                        lookback value (int)
+//                        totalbytes value (int)
+//                        indexstringbytes (int)
+//                        for each word 
+//                          wordlen (4 bits)
+//                          prefix match (4 bits)
+//                          word (wordlen bytes)
+//                          word frequency (int)
+//                          word count (int)
+//
+//        Accesses outside variables:     
+//
+//        Return value...:                
+static void OutputInvfDict (char *filename) {
+  // create the dictionary header
+  invf_dict_header idh;
+  idh.word_dict_size = ivfWordInfo.size();
+  idh.tag_dict_size = ivfTagInfo.size();
+  idh.num_docs = numDocs;
+  idh.num_frags = numFrags;
+  idh.num_words = numWords;
+  idh.num_levels = ivfLevel.levelInfo.size();
+  CalcInvfDictSize (idh.total_bytes, idh.index_string_bytes);
+
+  // create the inverted dictionary file
+  FILE *sp;
+  if (!(sp = create_file (filename, INVF_DICT_SUFFIX, "wb", MAGIC_STEM_BUILD,
+			  MG_MESSAGE)))
+    return;
+
+  // write out the dictionary header
+  if (!idh.Write (sp)) { fclose (sp); return; }
+
+  // remember where the word dictionary starts
+  idh.word_dict_start = ftell (sp);
+  
+  // output the word dictionary
+  const UCArray *lastWord = NULL;
+  IvfWordInfoMap::iterator wordHere = ivfWordInfo.begin();
+  IvfWordInfoMap::iterator wordEnd = ivfWordInfo.end();
+  while (wordHere != wordEnd) {
+    // get the prefix and suffix lengths
+    const UCArray &thisWord = (*wordHere).first;
+    WritePreSufStr (sp, lastWord, thisWord);
+
+    // output the number of fragments the word appeared in and the
+    // number of times the word appeared
+    WriteUL (sp, (*wordHere).second.fragCount);
+    WriteUL (sp, (*wordHere).second.wordCount);
+
+    // output frequency information for each level
+    // note that we are expecting every word to have
+    // level information
+    LevelWorker *lwHere = (*wordHere).second.levels;
+    LevelWorker *lwEnd = lwHere + idh.num_levels;
+    while (lwHere != lwEnd) {
+      WriteUL (sp, (*lwHere).count);
+      lwHere++;
+    }
+    
+    lastWord = &thisWord;
+    wordHere++;
+  }
+
+  // remember where the tag dictionary starts
+  idh.tag_dict_start = ftell (sp);
+  
+  // output the tag dictionary
+  const UCArray *lastTag = NULL;
+  IvfTagInfoMap::iterator tagHere = ivfTagInfo.begin();
+  IvfTagInfoMap::iterator tagEnd = ivfTagInfo.end();
+  while (tagHere != tagEnd) {
+    // get the prefix and suffix lengths
+    const UCArray &thisTag = (*tagHere).first;
+    WritePreSufStr (sp, lastTag, thisTag);
+
+    // output the number of fragments the tag appeared in and the
+    // number of times the tag appeared
+    WriteUL (sp, (*tagHere).second.fragCount);
+    WriteUL (sp, (*tagHere).second.tagCount);
+    
+    lastTag = &thisTag;
+    tagHere++;
+  }
+
+  // write out the updated header
+  fseek (sp, sizeof (u_long), SEEK_SET);
+  if (!idh.Write (sp)) { fclose (sp); return; }
+  
+  fclose (sp);
+}
+
+static void OutputLevelFile (char *filename) {
+  // create the level file
+  FILE *f;
+  if (!(f = create_file (filename, INVF_LEVEL_SUFFIX, "wb", MAGIC_INVF_LEVELS,
+			 MG_MESSAGE)))
+    return;
+
+  // write out the information
+  ivfLevel.Write (f);
+  
+  // close the file
+  fclose (f);
+}
+
+static void OutputTransFile (char *filename) {
+  // save the word number (in lastFragNum :-/)
+  int i = 0;
+  IvfWordInfoMap::iterator wordHere = ivfWordInfo.begin();
+  IvfWordInfoMap::iterator wordEnd = ivfWordInfo.end();
+  while (wordHere != wordEnd) {
+    (*wordHere).second.lastFragNum = i;
+    i++; wordHere++;
+  }
+
+  // save the tag number (in lastFragNum :-/)
+  i = 0;
+  IvfTagInfoMap::iterator tagHere = ivfTagInfo.begin();
+  IvfTagInfoMap::iterator tagEnd = ivfTagInfo.end();
+  while (tagHere != tagEnd) {
+    (*tagHere).second.lastFragNum = i;
+    i++; tagHere++;
+  }
+  
+  // create the translation file
+  FILE *f;
+  if (!(f = create_file (filename, INVF_CHUNK_TRANS_SUFFIX, "wb",
+			 MAGIC_CHUNK_TRANS, MG_MESSAGE)))
+    return;
+
+  stdio_bitio_buffer buffer(f);
+  buffer.encodeStart();
+
+  // write out the word translation table
+  unsigned long wordDictSize = ivfWordInfoOccurOrder.size();
+  IvfWordInfoItArray::iterator wordItHere = ivfWordInfoOccurOrder.begin();
+  IvfWordInfoItArray::iterator wordItEnd = ivfWordInfoOccurOrder.end();
+  unsigned long oN = 0;
+  while (wordItHere != wordItEnd) {
+    register IvfWordInfo &ivfWordInfo = (*(*wordItHere)).second;
+    buffer.binary_encode (ivfWordInfo.lastFragNum + 1, wordDictSize + 1, NULL);
+    oN++;
+    wordItHere++;
+  }
+
+  // write out the tag translation table
+  unsigned long tagDictSize = ivfTagInfoOccurOrder.size();
+  IvfTagInfoItArray::iterator tagItHere = ivfTagInfoOccurOrder.begin();
+  IvfTagInfoItArray::iterator tagItEnd = ivfTagInfoOccurOrder.end();
+  while (tagItHere != tagItEnd) {
+    register IvfTagInfo &ivfTagInfo = (*(*tagItHere)).second;
+    buffer.binary_encode (ivfTagInfo.lastFragNum + 1, tagDictSize + 1, NULL);
+    oN++;
+    tagItHere++;
+  }
+
+  // finish encoding and close the file
+  buffer.encodeDone();
+  fclose (f);
+}
+
+#ifndef SILENT
+static void PrintStats () {
+  Message ("Inverted buffer size:          %8u bytes\n", invf_buffer_size);
+  Message ("Max memory needed for 1 chunk: %8u bytes\n", maxMemNeeded);
+
+  Message ("Number of chunks written:      %8u\n", chunksWritten);
+  Message ("Number of documents:           %8u\n", numDocs);
+  Message ("Number of fragments:           %8u\n", numFrags);
+  Message ("Number of words:               %8u\n", numWords);
+
+  Message ("Size of word dictionary:       %8u\n", ivfWordInfo.size());
+  Message ("Size of tag dictionary:        %8u\n", ivfTagInfo.size());
+}
+#endif
+
+int done_ivf_1 (const TagInfo &tagInfo, char * filename) {
+  bool wordLevelIndex = tagInfo.indexLevel.empty();
+
+  char *temp_str = msg_prefix;
+  msg_prefix = "ivf.pass1";
+
+  // output the last chunk
+  if (numChunkDocs > 0) {
+    unsigned long mem = MemoryRequired (wordLevelIndex);
+    OutputChunkInfo (mem, wordLevelIndex);
+    if (mem > maxMemNeeded) maxMemNeeded = mem;
+  }
+  
+  // write out and encoded 1 to say there are no more chunks
+  icb.gamma_encode (1, NULL);
+  icb.encodeDone ();
+
+  // write out the maximum memory required and close the file
+  fseek (ic, sizeof (long), 0);
+  WriteUL (ic, maxMemNeeded);
+  fclose (ic);
+
+  // output the inverted dictionary
+  OutputInvfDict (filename);
+
+  // write out the translation file
+  OutputTransFile (filename);
+
+  // output the level information
+  OutputLevelFile (filename);
+  
+  // output statistics
+#ifndef SILENT
+  PrintStats ();
+#endif
+  
+  msg_prefix = temp_str;
+
+  return COMPALLOK;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass2.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass2.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/ivf.pass2.cpp	(revision 21083)
@@ -0,0 +1,1111 @@
+/**************************************************************************
+ *
+ * ivf.pass2.cpp -- Memory efficient pass 2 inversion
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+#include <stdio.h>
+
+#if defined __WIN32__
+# include <process.h>
+# include <io.h>
+# define getpid _getpid
+# define unlink _unlink
+#else
+# include <unistd.h>
+# include "non_ansi.h"
+#endif
+
+#include "UCArray.h"
+#include "sysfuncs.h"
+#include "mg_files.h"
+#include "invf.h"
+#include "mg.h"
+#include "build.h"
+#include "locallib.h"
+#include "bitio_m_random.h"
+#include "bitio_m_stdio.h"
+#include "bitio_m_mems.h"
+#include "bitio_gen.h"
+#include <stdio.h>
+#include "words.h"
+#include "messages.h"
+#include "netorder.h"
+#include "FIvfLevelInfo.h"
+#include "perf_hash.h"
+#include "string.h"
+
+#include "longlong.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+
+#ifdef USE_LONG_LONG
+#define SEEK_X seek_LL
+#define TELL_X tell_LL
+#else
+#define SEEK_X seek
+#define TELL_X tell
+#endif
+
+#ifndef RND_BUF_SIZE
+#define RND_BUF_SIZE 8*1024
+#endif
+
+
+static unsigned long numDocs = 0;
+static unsigned long numChunkDocs = 0;
+static unsigned long numDocsInChunk = 0;
+
+static unsigned long numFrags = 0;
+static unsigned long numFragsInChunk = 0;
+static unsigned long chunkStartFragNum = 0;
+
+
+
+
+struct BitPtr {
+  unsigned long start;
+  unsigned long here;
+  unsigned long lastFragNum;
+  unsigned long lgB;
+  
+  void Clear () { start = here = lastFragNum = lgB = 0; }
+  BitPtr () { Clear(); }
+};
+
+class WordBitPtrs {
+protected:
+  unsigned long numWords;
+  unsigned long numTags;
+  unsigned long size;
+  BitPtr *wordBitPtrs;
+
+  void CheckBufOverrun (unsigned long num) {
+    if (wordBitPtrs[num].here > wordBitPtrs[num+1].start) {
+      cerr << "numDocs: " << numDocs << "\n";
+      cerr << "numChunkDocs: " << numChunkDocs << "\n";
+      cerr << "numDocsInChunk: " << numDocsInChunk << "\n";
+      cerr << "numFrags: " << numFrags << "\n";
+      cerr << "numFragsInChunk: " << numFragsInChunk << "\n";
+      cerr << "chunkStartFragNum: " << chunkStartFragNum << "\n";
+      cerr << "num: " << num << "\n";
+      cerr << "[num].start: " << wordBitPtrs[num].start << "\n";
+      cerr << "[num].here: " << wordBitPtrs[num].here << "\n";
+      cerr << "[num+1].start: " << wordBitPtrs[num+1].start << "\n";
+      FatalError (1, "Bit buffer overrun");
+    }
+  }
+  
+public:
+  void Clear ();
+  WordBitPtrs () { wordBitPtrs = NULL; Clear(); }
+  ~WordBitPtrs ();
+  void SetSize (unsigned long _numWords,
+		unsigned long _numTags);
+
+  void ResetPtrs () {
+    if (wordBitPtrs == NULL) return;
+    unsigned long i;
+    for (i=0; i<size; i++) wordBitPtrs[i].Clear();
+  }
+  
+  BitPtr &GetWordBitPtr (unsigned long wordNum)
+    { return wordBitPtrs[wordNum]; }
+  unsigned long &GetWordStart (unsigned long wordNum)
+    { return wordBitPtrs[wordNum].start; }
+  unsigned long &GetWordHere (unsigned long wordNum)
+    { return wordBitPtrs[wordNum].here; }
+  void CheckWordBufOverrun (unsigned long wordNum)
+    { CheckBufOverrun (wordNum); }
+
+  BitPtr &GetTagBitPtr (unsigned long tagNum)
+    { return wordBitPtrs[tagNum + numWords]; }
+  unsigned long &GetTagStart (unsigned long tagNum)
+    { return wordBitPtrs[tagNum + numWords].start; }
+  unsigned long &GetTagHere (unsigned long tagNum)
+    { return wordBitPtrs[tagNum + numWords].here; }
+  void CheckTagBufOverrun (unsigned long tagNum)
+    { CheckBufOverrun (tagNum + numWords); }
+
+  BitPtr &GetEndBitPtr ()
+    { return wordBitPtrs[size-1]; }
+  unsigned long &GetEndStart ()
+    { return wordBitPtrs[size-1].start; }
+  unsigned long &GetEndHere ()
+    { return wordBitPtrs[size-1].here; }
+};
+
+
+struct IP2TagInfo {
+  bool inTag;
+  unsigned long startFrag;
+  unsigned long tagNum;
+
+  IP2TagInfo () {
+    inTag = false;
+    startFrag = 0;
+    tagNum = 0;
+  }
+};
+
+// maps tags to tag information
+typedef map<UCArray, IP2TagInfo, DictLTUCArray> TagMapDict;
+
+
+// class to handle the translation of occurrence order
+// to dictionary order for words and tags
+class OccurToDictConverter {
+protected:
+  unsigned long pos;
+  unsigned long val;
+  FILE *transFile;
+  random_bitio_buffer rbs;
+
+  unsigned long wordDictSize;
+  unsigned long tagDictSize;
+
+  void SeekStart ();
+  unsigned long TranslateNum (unsigned long num);
+  
+public:
+  OccurToDictConverter ();
+  ~OccurToDictConverter ();
+
+  void Open (char *filename, unsigned long _wordDictSize,
+	     unsigned long _tagDictSize);
+
+  // Close frees all allocated memory
+  void Close ();
+
+  unsigned long TranslateWord (unsigned long occurNum)
+    { return TranslateNum (occurNum); }
+  unsigned long TranslateTag (unsigned long occurNum)
+    { return TranslateNum (occurNum+wordDictSize); }
+};
+
+
+struct InvfStateRec {
+  mg_ullong start;
+  mg_ullong here;
+  unsigned long lastFragNum;
+  unsigned long B;
+
+  void Clear () {
+    start = here = 0;
+    lastFragNum = B = 0;
+  }
+  InvfStateRec () { Clear (); }
+};
+
+
+#define ISR_SIZE 1024
+
+class InvfStateCache {
+protected:
+  InvfStateRec recCache [ISR_SIZE];
+  unsigned long startNum;
+
+  FILE *stateFile;
+
+  void ClearCache () {
+    unsigned int i = 0;
+    for (i=0; i<ISR_SIZE; i++) recCache[i].Clear();
+  }
+  
+public:
+  InvfStateCache ();
+  ~InvfStateCache ();
+  
+  void Open (char *filename);
+  void Close ();
+
+  // previous references to state records may be
+  // invalidated calling GetRec
+  InvfStateRec &GetRec (unsigned long num);
+};
+
+
+static invf_dict_header idh;
+static WordBitPtrs bitPtrs;
+
+static FILE *chunkFile = NULL;
+static stdio_bitio_buffer chunkBuf;
+
+static unsigned long ivfMemBufSize = 0;
+static char *ivfMemBuf = NULL;
+
+// word and tag dictionaries. a map is used for the tag dictionary
+// as it should never be very big (and the perfect hash function
+// sometimes has trouble with small values).
+static perf_hash_data *wordHashDict = NULL;
+static TagMapDict tagMapDict;
+
+// information about all the different levels
+static FIvfLevel ivfLevel;
+
+static OccurToDictConverter occurConvert;
+
+// information about the state of the inverted file
+static InvfStateCache invfState;
+
+static char collectFilename[512];
+
+
+void WordBitPtrs::Clear () {
+  numWords = 0;
+  numTags = 0;
+  size=0;
+  if (wordBitPtrs != NULL) delete [] wordBitPtrs;
+  wordBitPtrs = NULL;
+}
+
+WordBitPtrs::~WordBitPtrs () {
+  if (wordBitPtrs != NULL) delete [] wordBitPtrs;
+}
+
+void WordBitPtrs::SetSize (unsigned long _numWords,
+			   unsigned long _numTags){
+  Clear();
+  numWords = _numWords;
+  numTags = _numTags;
+  size = numWords + numTags + 1;
+  wordBitPtrs = new BitPtr [size];
+}
+
+
+void OccurToDictConverter::SeekStart () {
+  if (transFile == NULL) return;
+  rbs.SEEK_X (sizeof (unsigned long) * 8);
+  pos = 0;
+}
+
+unsigned long OccurToDictConverter::TranslateNum (unsigned long num) {
+  if (num < pos) SeekStart ();
+  while (pos <= num) {
+    if (pos < wordDictSize)
+      val = rbs.binary_decode (wordDictSize + 1, NULL) - 1;
+    else 
+      val = rbs.binary_decode (tagDictSize + 1, NULL) - 1;
+    pos++;
+  }
+  return val;
+}
+
+OccurToDictConverter::OccurToDictConverter () {
+  pos = 0;
+  val = 0;
+  transFile = NULL;
+  wordDictSize = 0;
+  tagDictSize = 0;
+}
+
+OccurToDictConverter::~OccurToDictConverter () {
+  if (transFile != NULL) Close ();
+}
+
+void OccurToDictConverter::Open (char *filename, unsigned long _wordDictSize,
+				 unsigned long _tagDictSize) {
+  if (transFile != NULL) Close ();
+
+  wordDictSize = _wordDictSize;
+  tagDictSize = _tagDictSize;
+
+  transFile = open_file (filename, INVF_CHUNK_TRANS_SUFFIX, "rb",
+			 MAGIC_CHUNK_TRANS, MG_ABORT);
+  rbs.attachFile (transFile, RND_BUF_SIZE);
+  SeekStart ();
+  val = 0;
+}
+
+void OccurToDictConverter::Close () {
+  if (transFile == NULL) return;
+
+  rbs.done ();
+  fclose (transFile);
+  transFile = NULL;
+  pos = 0;
+  val = 0;
+
+  wordDictSize = 0;
+  tagDictSize = 0;
+}
+
+
+
+
+InvfStateCache::InvfStateCache () {
+  startNum = 0;
+  stateFile = NULL;
+}
+
+InvfStateCache::~InvfStateCache () {
+  if (stateFile != NULL) Close ();
+}
+  
+void InvfStateCache::Open (char *filename) {
+  if (stateFile != NULL) Close();
+
+  // open the state file
+  char path[512];
+  sprintf (path, FILE_NAME_FORMAT ".%ld", get_basepath (), filename,
+           ".invf.state", (long) getpid ());
+  if (!(stateFile = fopen (path, "wb+"))) {
+    Message ("Unable to create \"%s\"", path);
+    exit (1);
+  }
+  unlink (path); // file will be deleted after it is closed
+  // reset the buffer
+  startNum = 0;
+  ClearCache();
+}
+
+void InvfStateCache::Close () {
+  if (stateFile == NULL) return;
+  fclose (stateFile);
+  stateFile = NULL;
+  startNum = 0;
+}
+
+InvfStateRec &InvfStateCache::GetRec (unsigned long num) {
+  // see if cached
+  if ((num >= startNum) && (num < startNum + ISR_SIZE))
+    return recCache[num-startNum];
+
+  // not cached, write out this lot of records and read in
+  fseek (stateFile, startNum*sizeof (InvfStateRec), SEEK_SET);
+  fwrite ((char *) recCache, sizeof (InvfStateRec), ISR_SIZE, stateFile);
+
+  // read in the new set of records
+  ClearCache ();
+  startNum = num - (num % ISR_SIZE);
+  fseek (stateFile, startNum*sizeof (InvfStateRec), SEEK_SET);
+  fread ((char *) recCache, sizeof (InvfStateRec), ISR_SIZE, stateFile);
+
+  return recCache[num-startNum];
+}
+
+
+
+static void ClearCharBuf (char *buf, unsigned long size) {
+  char *end = buf + size;
+  while (buf != end) *buf++ = 0;
+}
+
+static void ReadWordDict (char *filename) {
+  // read in the perfect hash function for the word dictionary
+  FILE *wordHashFile = open_file (filename, INVF_DICT_HASH_SUFFIX, "rb",
+				  MAGIC_HASH, MG_ABORT);
+  if (!(wordHashDict = read_perf_hash_data (wordHashFile))) {
+    FatalError (1, "Unable to read in hash data for word dictionary");
+  }
+  fclose (wordHashFile);
+}
+
+static void ReadTagDict (char *filename, invf_dict_header &_idh) {
+  // open the file
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+
+  // seek to the start of the tag dictionary
+  fseek (dictFile, _idh.tag_dict_start, SEEK_SET);
+  
+  unsigned long tagNum;
+  dict_el thisEl;
+  for (tagNum = 0; tagNum < _idh.tag_dict_size; tagNum++) {
+    thisEl.Read (dictFile);
+    tagMapDict[thisEl.el].tagNum = tagNum;
+  }
+  
+  fclose (dictFile);
+}
+
+static void ReadLevelFile (char *filename) {
+  FILE *f;
+  f = open_file (filename, INVF_LEVEL_SUFFIX, "rb",
+		 MAGIC_INVF_LEVELS, MG_ABORT);
+  ivfLevel.Read (f);
+  fclose (f);
+}
+
+void CheckIntOverflow (mg_ullong totalIBits, mg_ullong lastTotalIBits) {
+  if (totalIBits < lastTotalIBits) {
+    fprintf(stderr, "ERROR: The totalIBits counter (%d byte unsigned integer) has overflowed.\n", sizeof (mg_ullong));
+    if (sizeof (mg_ullong) < 8) {
+      fprintf(stderr, "       Try compiling with GCC to enable use of 8 bytes for this counter.\n");
+    }
+    fprintf(stderr, "       Build aborted.\n");
+    exit(1);
+  }
+}
+
+// assumes the inverted file state file has been opened
+static void InitInvfState (char *filename,
+			   invf_dict_header &_idh,
+			   InvfStateCache &_invfState,
+			   mg_ullong &totalIBits,
+			   bool wordLevelIndex) {
+  // read in the dictionary, setting inverted state information
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+
+  // seek to the start of the word dictionary
+  fseek (dictFile, _idh.word_dict_start, SEEK_SET);
+
+  // add the word entries
+  word_dict_el wordEl;
+  wordEl.SetNumLevels (_idh.num_levels);
+  unsigned long dictWordNum, p;
+  mg_ullong lastTotalIBits;
+  unsigned long N = _idh.num_frags;
+  for (dictWordNum=0; dictWordNum<_idh.word_dict_size; dictWordNum++) {
+    // lastTotalIBits is used to detect integer overflow
+    lastTotalIBits = totalIBits;
+
+    // read the next word and associated information
+    wordEl.Read (dictFile, _idh.num_levels);
+
+    // update the state record
+    p = wordEl.frag_occur;
+    InvfStateRec &wisr = _invfState.GetRec (dictWordNum);
+    wisr.start = totalIBits;
+    wisr.here = totalIBits;
+    wisr.B = BIO_Bblock_Init (N, p);
+    
+    // add the length of the fragment numbers
+    totalIBits += BIO_Bblock_Bound_b (N, p, wisr.B);
+
+    // if needed, add the length of the fragment frequency information
+    if (!wordLevelIndex)
+      totalIBits += BIO_Gamma_Bound (wordEl.freq, wordEl.frag_occur);
+
+    // align next byte
+#ifdef USE_LONG_LONG
+    totalIBits = (totalIBits + 7ull) & 0xfffffffffffffff8ull;
+#else
+    totalIBits = (totalIBits + 7ul) & 0xfffffff8ul;
+#endif
+
+    CheckIntOverflow (totalIBits, lastTotalIBits);
+  }
+
+  
+  // seek to the start of the tag dictionary
+  fseek (dictFile, _idh.tag_dict_start, SEEK_SET);
+
+  // add the tag entries
+  dict_el tagEl;
+  unsigned long dictTagNum;
+  N = _idh.num_frags;
+  for (dictTagNum=0; dictTagNum<_idh.tag_dict_size; dictTagNum++) {
+    // lastTotalIBits is used to detect integer overflow
+    lastTotalIBits = totalIBits;
+
+    // read the next tag and associated information
+    tagEl.Read (dictFile);
+
+    // update the state record
+    p = tagEl.frag_occur*2;
+    InvfStateRec &tisr = _invfState.GetRec (dictTagNum + _idh.word_dict_size);
+    tisr.start = totalIBits;
+    tisr.here = totalIBits;
+    tisr.B = BIO_Bblock_Init (N+p, p);
+    
+    // add the length of the fragment numbers (two numbers for each
+    // tag, one for start and one for end)
+    totalIBits += BIO_Bblock_Bound_b (N+p, p, tisr.B);
+
+    // align next byte
+#ifdef USE_LONG_LONG
+    totalIBits = (totalIBits + 7ull) & 0xfffffffffffffff8ull;
+#else
+    totalIBits = (totalIBits + 7ul) & 0xfffffff8ul;
+#endif
+
+    CheckIntOverflow (totalIBits, lastTotalIBits);
+  }
+
+  fclose (dictFile);
+}
+
+/*
+// assumes the chunk tag information has been placed in .first
+static void PrintChunkInfo (unsigned long chunkMem,
+			    unsigned long numChunkWords,
+			    unsigned long numChunkTags) {
+  static unsigned long chunksRead = 0;
+  chunksRead++;
+  cout << "Chunk Number: " << chunksRead << "\n";
+  cout << "numChunkDocs " << numDocsInChunk << "\n";
+  cout << "numChunkFrags " << numFragsInChunk << "\n";
+  cout << "mem " << chunkMem << "\n";
+  cout << "numWords " << numChunkWords << "\n";
+  cout << "numTags " << numChunkTags << "\n\n";
+
+  TagMapDict::iterator tagMapHere = tagMapDict.begin();
+  TagMapDict::iterator tagMapEnd = tagMapDict.end();
+  while (tagMapHere != tagMapEnd) {
+    unsigned long tagMapNum = (*tagMapHere).second.tagNum;
+    cout << (*tagMapHere).first << " " << tagMapNum << " "
+	 << bitPtrs.GetTagBitPtr(tagMapNum).here << "\n";
+    tagMapHere++;
+  }
+}
+*/
+
+void ReadChunk (invf_dict_header &_idh, bool wordLevelIndex) {
+  // reset globals
+  numChunkDocs = 0;
+  chunkStartFragNum = numFrags;
+
+  // read in information about this chunk
+  numDocsInChunk = chunkBuf.gamma_decode (NULL) - 1;
+  if (numDocsInChunk == 0)
+    FatalError (1, "The number of docs in the current chunk is 0");
+
+  numFragsInChunk = chunkBuf.gamma_decode (NULL) - 1;
+  unsigned long chunkMem = chunkBuf.gamma_decode (NULL) - 1;
+
+  if (chunkMem > ivfMemBufSize)
+    FatalError (1, "Chunk memory size is greater than maximum");
+  
+  unsigned long numChunkWords = chunkBuf.gamma_decode (NULL) - 1;
+  unsigned long numChunkTags = chunkBuf.gamma_decode (NULL) - 1;
+
+  
+  // reset stuff
+  ClearCharBuf (ivfMemBuf, ivfMemBufSize);
+  bitPtrs.ResetPtrs();  
+
+  // read in the entries in occurrence order storing the
+  // "chunkWordCount" in "start" and the "chunkFragCount"
+  // in "here"
+  unsigned long numOccur;
+  unsigned long wordNum;
+  for (numOccur=0; numOccur<numChunkWords; numOccur++) {
+    wordNum = occurConvert.TranslateWord (numOccur);
+    BitPtr &wordPtr = bitPtrs.GetWordBitPtr (wordNum);
+    wordPtr.start = chunkBuf.gamma_decode (NULL) - 1;
+    if (wordPtr.start >= 2)
+      wordPtr.here = chunkBuf.gamma_decode (NULL);
+    else wordPtr.here = wordPtr.start;
+  }
+  unsigned long tagNum;
+  for (numOccur=0; numOccur<numChunkTags; numOccur++) {
+    tagNum = occurConvert.TranslateTag (numOccur);
+    BitPtr &tagPtr = bitPtrs.GetTagBitPtr (tagNum);
+    // only chunkFragCount is encoded for tags
+    tagPtr.start = chunkBuf.gamma_decode (NULL) - 1;
+    tagPtr.here = tagPtr.start;
+  }
+
+  /*  PrintChunkInfo (chunkMem, numChunkWords, numChunkTags);*/
+  
+  // create the bit ptrs in dictionary order
+  unsigned long totalIBits = 0; // only dealing with memory
+  unsigned long chunkWordCount, chunkFragCount;
+  for (wordNum=0; wordNum<_idh.word_dict_size; wordNum++) {
+    BitPtr &wordPtr = bitPtrs.GetWordBitPtr (wordNum);
+    chunkWordCount = wordPtr.start;
+    chunkFragCount = wordPtr.here;
+    wordPtr.start = totalIBits;
+    wordPtr.here = totalIBits;
+    wordPtr.lastFragNum = chunkStartFragNum;
+    wordPtr.lgB = 0;
+    if (chunkWordCount > 0) {
+      wordPtr.lgB = floorlog_2 (BIO_Bblock_Init_W (numFragsInChunk,
+						   chunkFragCount));
+      totalIBits += BIO_Bblock_Bound (numFragsInChunk, chunkFragCount);
+      // use unary encoding for memory buffer encoding of fragment freq
+      if (!wordLevelIndex) {
+	totalIBits += chunkWordCount;
+      }
+    }
+  }
+  for (tagNum=0; tagNum<_idh.tag_dict_size; tagNum++) {
+    BitPtr &tagPtr = bitPtrs.GetTagBitPtr (tagNum);
+    chunkFragCount = tagPtr.here;
+    tagPtr.start = totalIBits;
+    tagPtr.here = totalIBits;
+    tagPtr.lastFragNum = chunkStartFragNum;
+    tagPtr.lgB = 0;
+    if (chunkFragCount > 0) {
+      unsigned long pTag = chunkFragCount*2;
+      tagPtr.lgB = floorlog_2 (BIO_Bblock_Init_W (numFragsInChunk+pTag,
+						  pTag));
+      unsigned long bLen = BIO_Bblock_Bound (numFragsInChunk+pTag,
+					     pTag);
+//        cout << tagNum + _idh.word_dict_size << " ";
+//        cout << "numFrags: " << numFragsInChunk
+//    	   << " chunkFragCount: " << chunkFragCount
+//    	   << " B: " << 1 << tagPtr.lgB
+//    	   << " blen: " << blen << "\n";
+      totalIBits += bLen;
+    }
+  }
+  bitPtrs.GetEndStart() = totalIBits;
+  bitPtrs.GetEndHere() = totalIBits;
+
+  if ((totalIBits + 7ul) >> 3ul > chunkMem) {
+    cerr << "totalIBits: " << totalIBits << "\n";
+    cerr << "bytes: " << ((totalIBits + 7ul) >> 3ul) << "\n";
+    cerr << "chunkMem: " << chunkMem << "\n";
+    FatalError (1, "Pointers exceed buffer size");
+  }
+}
+
+
+
+
+int init_ivf_2 (const TagInfo &/*tagInfo*/, char *filename) {
+  // read in compressed dictionary header
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+  idh.Read (dictFile);
+  fclose (dictFile);
+
+  // set the size of the bit ptrs
+  bitPtrs.SetSize (idh.word_dict_size, idh.tag_dict_size);
+
+  // open the chunk file and read in the maximum memory needed
+  // for the inverted memory buffer
+  chunkFile = open_file (filename, INVF_CHUNK_SUFFIX, "rb",
+			 MAGIC_CHUNK, MG_ABORT);
+  ReadUL (chunkFile, ivfMemBufSize);
+  chunkBuf.attachFile (chunkFile);
+
+  // allocate memory for the inverted buffer
+  ivfMemBuf = new char [ivfMemBufSize];
+  ClearCharBuf (ivfMemBuf, ivfMemBufSize);
+
+  // read in the word dictionary
+  ReadWordDict (filename);
+
+  // read in the tag dictionary
+  ReadTagDict (filename, idh);
+
+  // read in the level information
+  ReadLevelFile (filename);
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+  
+  // set up the translation table file
+  occurConvert.Open (filename, idh.word_dict_size, idh.tag_dict_size);
+
+  // reset some globals
+  numDocs = 0;
+  numChunkDocs = 0;
+  numDocsInChunk = 0;
+  numFrags = 0;
+  numFragsInChunk = 0;
+  chunkStartFragNum = 0;
+
+  strcpy (collectFilename, filename);
+  
+  
+  // create the inverted file
+  mg_ullong totalIBits = 0;
+  FILE *invfFile = create_file (filename, INVF_SUFFIX, "wb",
+				MAGIC_INVF, MG_ABORT);
+  totalIBits += sizeof (unsigned long) * 8; // magic number
+  totalIBits += 8 * 200;                    // 200 byte gap -- why??????
+  fclose (invfFile);
+
+  // init the inverted file state cache
+  invfState.Open (filename);
+  InitInvfState (filename, idh, invfState, totalIBits, wordLevelIndex);
+
+  return COMPALLOK;
+}
+
+static void CloseTextTag (IP2TagInfo &tInfo, const UCArray &/*tagName*/) {
+  if (!tInfo.inTag) return;
+
+    // add this tag to the inverted list
+  BitPtr &tagBitPtr = bitPtrs.GetTagBitPtr (tInfo.tagNum);
+  unsigned long endFrag = numFrags;
+  int b = 1 << tagBitPtr.lgB;
+
+  /*
+  cout << (tInfo.tagNum+idh.word_dict_size) << " \"<" << tagName << ">\" "
+       << tInfo.startFrag << " " << endFrag << "\n";
+  */
+    
+  mems_bitio_buffer buffer ((u_char *) ivfMemBuf, tagBitPtr.here);
+  buffer.bblock_encode (tInfo.startFrag - tagBitPtr.lastFragNum + 1,
+			b, NULL);
+  buffer.bblock_encode (endFrag - tInfo.startFrag + 1, b, NULL);
+  tagBitPtr.lastFragNum = endFrag;
+  tagBitPtr.here = buffer.position();
+  buffer.encodeDone();
+  
+  // check for buffer overrun
+  bitPtrs.CheckTagBufOverrun (tInfo.tagNum);
+  
+  // reset information about this tag
+  tInfo.inTag = false;
+  tInfo.startFrag = 0;
+}
+
+static void ProcessOpenTag (const TextEl &el, bool &inFrag) {
+  // close tag if open
+  IP2TagInfo &tInfo = tagMapDict[el.tagName];
+  if (tInfo.inTag) CloseTextTag (tInfo, el.tagName);
+
+  // open this tag
+  tInfo.inTag = true;
+  tInfo.startFrag = numFrags;
+
+  // check for start of next fragment
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+  if (!wordLevelIndex && el.tagName == ivfLevel.indexLevel) {
+    numFrags++;
+    inFrag = true;
+  }
+}
+
+static void ProcessCloseTag (const TextEl &el, bool &inFrag) {
+  // check for end of fragment
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+  if (!wordLevelIndex && el.tagName == ivfLevel.indexLevel) {
+    inFrag = false;
+  }
+
+  IP2TagInfo &tInfo = tagMapDict[el.tagName];
+  CloseTextTag (tInfo, el.tagName);
+}
+
+static void ProcessText (const TextEl &el, bool &inFrag) {
+  // make sure this text is to be indexed
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+  if (!wordLevelIndex && !inFrag) return;
+
+  const unsigned char *textHere = &(el.text[0]);
+  const unsigned char *textEnd = &(el.text[el.text.size() - 1]);
+  unsigned char mgWord[MAXSTEMLEN + 1];
+  
+  if (!inaword (textHere, textEnd))
+    ParseNonindexWord (textHere, textEnd);
+
+  
+  // Alternately parse off words and non-words from the input
+
+  while (textHere <= textEnd) {
+    textHere = ParseIndexMGWord (textHere, textEnd, mgWord);
+    textHere = ParseNonindexWord (textHere, textEnd);
+
+    if (mgWord[0] > 0) {
+      if (wordLevelIndex) numFrags++;
+
+      unsigned long wordNum = perf_hash (wordHashDict, mgWord);
+
+      /*
+      cout << wordNum << " \"";
+      cout.write (mgWord+1, *mgWord);
+      cout << "\" " << numFrags << "\n";
+      */
+      
+      // add this word to the inverted list
+      BitPtr &wordBitPtr = bitPtrs.GetWordBitPtr (wordNum);
+      unsigned long fragNum = numFrags;
+      int b = 1 << wordBitPtr.lgB;
+  
+      mems_bitio_buffer buffer ((u_char *) ivfMemBuf, wordBitPtr.here);
+
+      // note: this assumes that fragments don't carry over between
+      // chunks (which they don't because all tags are closed at the
+      // end of each document and chunks are based on document
+      // boundaries), i.e. the first fragment number must be greater
+      // than the starting fragment number of the chunk.
+      if (fragNum > wordBitPtr.lastFragNum) {
+	buffer.bblock_encode ((fragNum - wordBitPtr.lastFragNum - 1) + 1,
+			      b, NULL);
+	if (!wordLevelIndex) buffer.encodeBit (1); // freq = 1
+	
+      } else if (!wordLevelIndex) {
+	// add one to the frequency count for this word
+	buffer.seek (buffer.position()-1);
+	buffer.encodeBit (0); // unary encoding -- last = 1
+	buffer.encodeBit (1);
+      }
+      
+      wordBitPtr.lastFragNum = fragNum;
+      wordBitPtr.here = buffer.position();
+      buffer.encodeDone();
+      
+      // check for buffer overrun
+      bitPtrs.CheckWordBufOverrun (wordNum);
+    }
+  }
+}
+
+// combine the in memory inverted buffer with the disk
+// based inverted file
+static void DiskMerge (char *filename) {
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+
+      // make sure we have something to process
+  if (numChunkDocs <= 0) return;
+    
+  // open the inverted file
+  FILE *invfFile = open_file (filename, INVF_SUFFIX, "rb+",
+			      MAGIC_INVF, MG_ABORT);
+  random_bitio_buffer invfOutBuf (invfFile);
+
+  // set up to decode the entries in memory
+  mems_bitio_buffer memInBuf ((u_char *) ivfMemBuf, 0);
+
+  // write out the word information
+  unsigned long wordNum;
+  int b;
+  unsigned long currFragNum;
+  unsigned long delta;
+  unsigned long currFreq;
+  for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+    // go to the end of the last inverted file entry
+    InvfStateRec &wordDiskState = invfState.GetRec (wordNum);
+    invfOutBuf.SEEK_X (wordDiskState.here);
+
+    // go to the start of the inverted chunk info in memory
+    BitPtr &wordBitPtr = bitPtrs.GetWordBitPtr (wordNum);
+    memInBuf.seek(wordBitPtr.start);
+
+    // decode each entry and re-write to disk
+    currFragNum = chunkStartFragNum;
+    while (memInBuf.position() < wordBitPtr.here) {
+      // decode word entry
+      b = 1 << wordBitPtr.lgB;
+      delta = memInBuf.bblock_decode (b, NULL);
+      currFragNum += delta;
+      if (!wordLevelIndex) currFreq = memInBuf.unary_decode (NULL);
+      else currFreq = 1;
+
+      // recode on disk
+      invfOutBuf.bblock_encode (currFragNum-wordDiskState.lastFragNum,
+				wordDiskState.B, NULL);
+      if (!wordLevelIndex) invfOutBuf.gamma_encode (currFreq, NULL);
+      wordDiskState.lastFragNum = currFragNum;
+    }
+
+    wordDiskState.here = invfOutBuf.TELL_X();
+  }
+
+  // write out the tag information
+  unsigned long tagNum;
+  unsigned long currTagStart;
+  unsigned long currTagEnd;
+  for (tagNum=0; tagNum<idh.tag_dict_size; tagNum++) {
+    // go to the end of the last inverted file entry
+    InvfStateRec &tagDiskState = invfState.GetRec (tagNum+idh.word_dict_size);
+    invfOutBuf.SEEK_X (tagDiskState.here);
+
+    // go to the start of the inverted chunk info in memory
+    BitPtr &tagBitPtr = bitPtrs.GetTagBitPtr (tagNum);
+    memInBuf.seek(tagBitPtr.start);
+
+    // decode each entry and re-write to disk
+    currTagEnd = chunkStartFragNum;
+    while (memInBuf.position() < tagBitPtr.here) {
+      // decode tag entry
+      b = 1 << tagBitPtr.lgB;
+      delta = memInBuf.bblock_decode (b, NULL) - 1;
+      currTagStart = currTagEnd + delta;
+      delta = memInBuf.bblock_decode (b, NULL) - 1;
+      currTagEnd = currTagStart + delta;
+
+      // recode on disk
+      invfOutBuf.bblock_encode (currTagStart-tagDiskState.lastFragNum+1,
+				tagDiskState.B, NULL);
+      invfOutBuf.bblock_encode (currTagEnd-currTagStart+1,
+				tagDiskState.B, NULL);
+
+      tagDiskState.lastFragNum = currTagEnd;
+    }
+
+    tagDiskState.here = invfOutBuf.TELL_X();
+  }
+
+  memInBuf.done();
+
+  invfOutBuf.encodeDone();
+  fclose (invfFile);
+}
+
+
+int process_ivf_2 (const TagInfo &/*tagInfo*/, const TextElArray &doc) {
+  bool wordLevelIndex = ivfLevel.indexLevel.empty();
+  bool inFrag = false;
+  if (wordLevelIndex) inFrag = true; // unconditional
+  
+  // get next chunk information if need to. the chunk information
+  // is needed before the first document is processed
+  if (numChunkDocs >= numDocsInChunk) ReadChunk (idh, wordLevelIndex);
+
+  // process each text element
+  TextElArray::const_iterator here = doc.begin();
+  TextElArray::const_iterator end = doc.end();
+  while (here != end) {
+    // process this element
+    if ((*here).elType == OpenTagE) ProcessOpenTag (*here, inFrag);
+    else if ((*here).elType == CloseTagE) ProcessCloseTag (*here, inFrag);
+    else ProcessText (*here, inFrag);
+    
+    here++;
+  }
+
+  // close off any unclosed tags
+  TagMapDict::iterator tdHere = tagMapDict.begin();
+  TagMapDict::iterator tdEnd = tagMapDict.end();
+  while (tdHere != tdEnd) {
+    CloseTextTag ((*tdHere).second, (*tdHere).first);
+    tdHere++;
+  }
+  
+  // we've processed one more document
+  numDocs++;
+  numChunkDocs++;
+
+  // merge the memory based inverted file with the one on
+  // disk if this is the end of this chunk
+  if (numChunkDocs >= numDocsInChunk) DiskMerge (collectFilename);
+  
+  return COMPALLOK;
+}
+
+
+static void CondenseInvfFile (char *filename, unsigned long &bytesOutput) {
+  FILE *inInvfFile = open_file (filename, INVF_SUFFIX, "rb",
+				MAGIC_INVF, MG_ABORT);
+  FILE *outInvfFile = open_file (filename, INVF_SUFFIX, "rb+",
+				 MAGIC_INVF, MG_ABORT);
+
+  // skip the magic number
+  fseek (outInvfFile, sizeof (unsigned long), SEEK_SET);
+  
+  // write the inverted file header -- use defaults for most things
+  invf_file_header ifh;
+  ifh.no_of_words = idh.word_dict_size;
+  ifh.no_of_tags = idh.tag_dict_size;
+  ifh.word_level_index = (ivfLevel.indexLevel.empty()) ? 1 : 0;
+  ifh.Write (outInvfFile);
+
+  bytesOutput = ftell (outInvfFile);
+
+  // process each meaningful byte in the file
+  unsigned long numEntries = ifh.no_of_words + ifh.no_of_tags;
+  unsigned long entryNum;
+  mg_ullong lastStart = 0;
+  for (entryNum = 0; entryNum < numEntries; entryNum++) {
+    InvfStateRec &stateRec = invfState.GetRec (entryNum);
+
+    // overrun check
+    if (stateRec.start < lastStart)
+      FatalError (1, "Inverted file Buffer overrun");
+    lastStart = stateRec.start;
+    
+    unsigned long oldEntryStart = stateRec.start >> 3;
+    unsigned long oldEntryStartOver = stateRec.start & 7; // should be 0
+    unsigned long oldEntryEnd = (stateRec.here + 7) >> 3;  // byte after end
+    unsigned long oldEntryEndOver = stateRec.here & 7;
+
+    fseek (inInvfFile, oldEntryStart, SEEK_SET);
+
+    stateRec.here -= stateRec.start;
+    stateRec.start = (mg_ullong)bytesOutput * 8 + oldEntryStartOver;
+    stateRec.here += stateRec.start;
+    while (oldEntryStart < oldEntryEnd) {
+      unsigned char c = getc (inInvfFile);
+      if (oldEntryStart == oldEntryEnd - 1) {
+	u_char ands[8] =
+	{0xff, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe};
+	c &= ands[oldEntryEndOver];
+      }
+      putc (c, outInvfFile);
+      bytesOutput++;
+      oldEntryStart++;
+    }
+  }  
+
+  fclose (inInvfFile);
+
+#ifdef __WIN32__
+  if (_chsize (_fileno (outInvfFile), bytesOutput) != 0)
+    Message ("Could not truncate invf.");
+#else
+  ftruncate (fileno (outInvfFile), bytesOutput);
+#endif
+
+  fclose (outInvfFile);
+}
+
+static void OutputInvfIdx (char *filename, unsigned long invfNumBytes) {
+  FILE *invfIdxFile = create_file (filename, INVF_IDX_SUFFIX, "wb",
+				   MAGIC_INVI, MG_ABORT);
+
+  // process each meaningful byte in the file
+  unsigned long numEntries = idh.word_dict_size + idh.tag_dict_size;
+  unsigned long entryNum;
+  for (entryNum = 0; entryNum < numEntries; entryNum++) {
+    InvfStateRec &stateRec = invfState.GetRec (entryNum);
+
+    // assumes that inverted entries start at beginning of each byte
+    if (!WriteUL (invfIdxFile, (stateRec.start >> 3))) break;
+  }
+
+  WriteUL (invfIdxFile, invfNumBytes);
+
+  fclose (invfIdxFile);
+}
+
+
+int done_ivf_2 (const TagInfo &/*tagInfo*/, char *filename) {
+  // close most open files
+  if (chunkFile != NULL) {
+    chunkBuf.done();
+    fclose (chunkFile);
+    chunkFile = NULL;
+  }
+  occurConvert.Close();
+  
+  // free allocated memory
+  bitPtrs.Clear();
+  if (ivfMemBuf != NULL) { delete [] ivfMemBuf; ivfMemBuf = NULL; }
+  free_perf_hash (wordHashDict);
+  wordHashDict = NULL;
+  tagMapDict.erase (tagMapDict.begin(), tagMapDict.end());
+
+  // condense the inverted file and truncate it
+  // this function also writes out the inverted header
+  unsigned long invfNumBytes = 0;
+  CondenseInvfFile (filename, invfNumBytes);
+
+  OutputInvfIdx (filename, invfNumBytes);
+
+  // close the rest of the open files
+  invfState.Close ();
+  
+  return COMPALLOK;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/locallib.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/locallib.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/locallib.cpp	(revision 21083)
@@ -0,0 +1,218 @@
+/**************************************************************************
+ *
+ * locallib.cpp -- Misc functions
+ * Copyright (C) 1994  Gary Eddy, Alistair Moffat and Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "memlib.h"
+#include "bitio_gen.h"
+#include "huffman.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "locallib.h"
+#include "text.h"
+
+int 
+vecentropy (int *A, int n)
+{
+  int total = 0, i;
+  double bits = 0.0;
+
+  for (i = 0; i < n; i++)
+    total += A[i];
+  for (i = 0; i < n; i++)
+    if (A[i])
+      bits += A[i] * log2 (1.0 * total / A[i]);
+  return ((int) (bits + 0.9999));
+
+}
+
+static void 
+siftdown (int *A, int i, int n)
+{
+  int ms, t;
+
+  while (2 * i + 1 <= n - 1)
+    {
+      if (2 * i + 1 == n - 1 || A[2 * i + 1] < A[2 * i + 2])
+	ms = 2 * i + 1;
+      else
+	ms = 2 * i + 2;
+      if (A[i] > A[ms])
+	{
+	  t = A[i];
+	  A[i] = A[ms];
+	  A[ms] = t;
+	}
+      i = ms;
+    }
+}
+
+static void 
+buildheap (int *A, int n)
+{
+  int i;
+  for (i = n / 2 - 1; i >= 0; i--)
+    siftdown (A, i, n);
+}
+
+int 
+huffcodebits (unsigned long *A, int n)
+{
+  int i, j, tot = 0, bits = 0, v1, v2, *B;
+
+  B = (int *) Xmalloc (n * sizeof (int));
+  j = 0;
+  for (i = 0; i < n; i++)
+    {
+      if (A[i])
+	{
+	  tot += (B[j++] = A[i]);
+	}
+    }
+  n = j;
+
+  if (n == 0 || tot == 0)
+    return (0);
+
+  buildheap (B, n);
+  while (n > 1)
+    {
+      v1 = B[0];
+      B[0] = B[n - 1];
+      n--;
+      siftdown (B, 0, n);
+      v2 = B[0];
+      B[0] = v1 + v2;
+      siftdown (B, 0, n);
+      bits += v1 + v2;
+    }
+  Xfree (B);
+  return (bits);
+}
+
+
+int 
+modelbits (unsigned long *A, int n)
+{
+  int i, bits = 0, last, N = 0;
+
+  last = -1;
+  for (i = 0; i < n; i++)
+    {
+      if (A[i])
+	{
+	  bits += BIO_Gamma_Length (i - last) + BIO_Gamma_Length (A[i]);
+	  last = i;
+	  N++;
+	}
+    }
+  if (N == 0)
+    return (0);
+  bits += BIO_Gamma_Length (N);
+  return (bits);
+}
+
+
+
+
+
+/* Find the next prime number larger than p */
+int 
+prime (int p)
+{
+  int limit;
+  p += (p & 1) + 1;
+  limit = (int) sqrt ((double) p) + 1;
+  do
+    {
+      int j;
+      while (limit * limit < p)
+	limit++;
+      for (j = 3; j <= limit && p % j; j += 2)
+	;			/* NULLBODY */
+      if (j > limit)
+	break;
+      p += 2;
+    }
+  while (1);
+  return (p);
+}
+
+
+
+int Read_cdh (FILE * f, compression_dict_header * cdh, u_long * /*mem*/,
+	      u_long * disk) {
+  if (disk)
+    (*disk) += sizeof (*cdh);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  if (fread (cdh, sizeof (*cdh), 1, f) == 1)
+    {
+      int i;
+      NTOHUL(cdh->dict_type);
+      NTOHUL(cdh->novel_method);
+      for (i = 0; i < TEXT_PARAMS; i++)
+	NTOHUL(cdh->params[i]);
+      NTOHUL(cdh->num_words[0]);
+      NTOHUL(cdh->num_words[1]);
+      NTOHUL(cdh->num_word_chars[0]);
+      NTOHUL(cdh->num_word_chars[1]);
+      NTOHUL(cdh->lookback);
+      return 0;
+    }
+  else
+    return -1;
+}
+
+
+int 
+Read_cfh (FILE * f, comp_frags_header * cfh, u_long * mem, u_long * disk)
+{
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (Read_Huffman_Data (f, &cfh->hd, mem, disk) == -1)
+    return -1;
+  if (fread (&cfh->uncompressed_size,
+	     sizeof (cfh->uncompressed_size), 1, f) != 1)
+    return -1;
+  NTOHUL(cfh->uncompressed_size);  /* [RPAP - Jan 97: Endian Ordering] */
+
+  if (disk)
+    (*disk) += sizeof (cfh->uncompressed_size);
+
+  memset (cfh->huff_words_size, '\0', sizeof (cfh->huff_words_size));
+
+  if ((int)fread (cfh->huff_words_size + cfh->hd.mincodelen,
+	     sizeof (*cfh->huff_words_size),
+	     cfh->hd.maxcodelen - cfh->hd.mincodelen + 1, f) !=
+      cfh->hd.maxcodelen - cfh->hd.mincodelen + 1)
+    return -1;
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = cfh->hd.mincodelen; i < cfh->hd.maxcodelen + 1; i++)
+    NTOHUL(cfh->huff_words_size[i]);
+
+  if (disk)
+    (*disk) += sizeof (*cfh->huff_words_size) *
+      (cfh->hd.maxcodelen - cfh->hd.mincodelen + 1);
+  return 0;
+}
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/locallib.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/locallib.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/locallib.h	(revision 21083)
@@ -0,0 +1,45 @@
+/**************************************************************************
+ *
+ * locallib.h -- Misc functions
+ * Copyright (C) 1994  Gary Eddy, Alistair Moffat and Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef LOCALLIB_H
+#define LOCALLIB_H
+
+#include "sysfuncs.h"
+
+#include "text.h"
+
+#define NUMOF(a) (sizeof(a)/sizeof((a)[0]))
+
+int vecentropy (int *A, int n);
+
+int huffcodebits (unsigned long *A, int n);
+
+int modelbits (unsigned long *A, int n);
+
+int prime (int p);
+
+
+int Read_cdh (FILE * f, compression_dict_header * cdh, u_long * mem, u_long * disk);
+
+int Read_cfh (FILE * f, comp_frags_header * cfh, u_long * mem, u_long * disk);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg.h	(revision 21083)
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * mg.h -- General header file
+ * Copyright (C) 1994  Neil Sharman, Alistair Moffat and Lachlan Andrew
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+
+#ifndef H_MG
+#define H_MG
+
+
+#define COMPALLOK	(0)
+#define COMPERROR	(-1)
+
+#define MAXSTRING       3000000
+#define BUFFERSIZE      (MAXSTRING+30000)
+
+#define	MAXLN	65536
+#define WORDS           1
+#define NONWORDS        0
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg.special.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg.special.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg.special.cpp	(revision 21083)
@@ -0,0 +1,58 @@
+/**************************************************************************
+ *
+ * mg.special.cpp -- Special pass for mg_passes
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#include "sysfuncs.h"
+#include "mg.h"
+#include "build.h"
+
+int init_special (const TagInfo &/*tagInfo*/, char * /*FileName*/) {
+  return COMPALLOK;
+}
+
+int process_special (const TagInfo &/*tagInfo*/, const TextElArray &doc) {
+  // print out the document
+  TextElArray::const_iterator here = doc.begin();
+  TextElArray::const_iterator end = doc.end();
+  while (here != end) {
+    if ((*here).elType == OpenTagE) {
+      cout << "** OpenTag  \"" << (*here).tagName << "\"\tText \""
+	   << (*here).text << "\"\n"; 
+    } else if ((*here).elType == CloseTagE) {
+      cout << "** CloseTag \"" << (*here).tagName << "\"\tText \""
+	   << (*here).text << "\"\n";
+    } else {
+      cout << "** Text     \"" << (*here).text << "\"\n";
+    }
+    
+    here++;
+  }
+  
+  return COMPALLOK;
+}
+
+int done_special (const TagInfo &/*tagInfo*/, char * /*FileName*/) {
+  return COMPALLOK;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.cpp	(revision 21083)
@@ -0,0 +1,72 @@
+/**************************************************************************
+ *
+ * mg_errors.cpp -- Error related stuff for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+#include "sysfuncs.h"
+#include "memlib.h"
+
+#include "mg_errors.h"
+
+int mg_errno = MG_NOERROR;
+
+char *mg_errorstrs[] =
+{
+  "No error",
+  "Out of memory",
+  "File \"%s\" not found",
+  "Bad magic number in \"%s\"",
+  "Error reading \"%s\"",
+  "MG_BUFTOOSMALL",
+  "Files required for level 2 and 3 inversion are missing"};
+
+
+/* [RJM 07/98: Memory Leak] -- rest of file */
+
+static char null_data[] = "";
+char *mg_error_data = null_data;
+
+
+void MgErrorData (char *s)
+{
+  /* free the current error string, unless it is the null string */
+  if ((mg_error_data != NULL) && (mg_error_data != null_data)) {
+    delete mg_error_data;
+    mg_error_data = null_data;
+  }
+
+  /* make a copy of the string */
+  mg_error_data = Xstrdup (s);
+
+  /* if the alloc failed set the error to the null string */
+  if (!mg_error_data) mg_error_data = null_data;
+}
+
+
+void MgErrorDeinit (void)
+{
+  /* free the current error string, unless it is the null string */
+  if ((mg_error_data != NULL) && (mg_error_data != null_data)) {
+    delete mg_error_data;
+    mg_error_data = null_data;
+  }
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg_errors.h	(revision 21083)
@@ -0,0 +1,37 @@
+/**************************************************************************
+ *
+ * mg_errors.h -- Error related stuff for mgquery
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+
+extern int mg_errno;
+extern char *mg_error_data;
+extern char *mg_errorstrs[];
+
+
+#define MG_NOERROR 0
+#define MG_NOMEM 1
+#define MG_NOFILE 2
+#define MG_BADMAGIC 3
+#define MG_READERR 4
+#define MG_BUFTOOSMALL 5
+#define MG_INVERSION 6
+
+void MgErrorData (char *s);
+void MgErrorDeinit (void);
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg_files.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg_files.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg_files.cpp	(revision 21083)
@@ -0,0 +1,259 @@
+/**************************************************************************
+ *
+ * mg_files.cpp -- Routines for handling files for the auxillary programs
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+
+
+/* This must contain a valid path without a trailing slash */
+static char *basepath = NULL;
+
+/* This sets the base path for all file operations */
+void 
+set_basepath (const char *bp)
+{
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+  basepath = "";
+#else
+  char *s;
+  /* Free the memory for the base path if it has already been allocated */
+  if (basepath)
+    {
+      delete basepath;
+      basepath = NULL;
+    }
+
+  if (!bp || *bp == '\0')
+    bp = ".";
+
+  s = strrchr (bp, '/');
+  if (s && *(s + 1) == '\0')
+    {
+      basepath = new char[strlen (bp) + 2];
+      if (!basepath)
+	return;
+      strcpy (basepath, bp);
+      strcat (basepath, ".");
+    }
+  else
+    basepath = Xstrdup (bp);
+#endif
+}
+
+
+
+/* return the currently defined basepath */
+char *
+get_basepath (void)
+{
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  return basepath;
+}
+
+
+
+/* This generates the name of a file. It places the name in the buffer
+   specified or if that is NULL it uses a static buffer. */
+char *
+make_name (const char *name, const char *suffix, char *buffer)
+{
+  static char path[512];
+  if (!buffer)
+    buffer = path;
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (buffer, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return buffer;
+}
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+open_named_file (const char *name, const char *mode,
+		 u_long magic_num, int err_mode)
+{
+  unsigned long magic;
+  FILE *f = NULL;
+  char *err;
+  f = fopen (name, mode);
+
+  if (!f)
+    {
+      err = "Unable to open \"%s\"";
+      goto error;
+    }
+
+  if (magic_num)
+    {
+      if (fread (&magic, sizeof (magic), 1, f) != 1)
+	{
+	  err = "No magic number \"%s\"";
+	  goto error;
+	}
+
+      NTOHUL(magic);  /* [RPAP - Jan 97: Endian Ordering] */
+
+      if (!IS_MAGIC (magic))
+	{
+	  err = "No MG magic number \"%s\"";
+	  goto error;
+	}
+
+      if (magic != magic_num)
+	{
+	  err = "Wrong MG magic number \"%s\"";
+	  goto error;
+	}
+    }
+  return f;
+
+error:
+  if (f)
+    fclose (f);
+  if (err_mode == MG_ABORT)
+    FatalError (1, err, name);
+  if (err_mode == MG_MESSAGE)
+    Message (err, name);
+  return NULL;
+}
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+open_file (const char *name, const char *suffix, const char *mode,
+	   u_long magic_num, int err_mode)
+{
+  char path[512];
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (path, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return open_named_file (path, mode, magic_num, err_mode);
+}
+
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+create_named_file (const char *name, const char *mode,
+		   u_long magic_num, int err_mode)
+{
+  FILE *f = NULL;
+  char *err;
+  f = fopen (name, mode);
+
+  if (!f)
+    {
+      err = "Unable to open \"%s\"";
+      goto error;
+    }
+
+  if (magic_num)
+    HTONUL(magic_num);  /* [RPAP - Jan 97: Endian Ordering] */
+    if (fwrite (&magic_num, sizeof (magic_num), 1, f) != 1)
+      {
+	err = "Couldn't write magic number \"%s\"";
+	goto error;
+      }
+
+  return f;
+
+error:
+  if (f)
+    fclose (f);
+  if (err_mode == MG_ABORT)
+    FatalError (1, err, name);
+  if (err_mode == MG_MESSAGE)
+    Message (err, name);
+  return NULL;
+}
+
+
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *
+create_file (const char *name, const char *suffix, const char *mode,
+	     u_long magic_num, int err_mode)
+{
+  char path[512];
+  if (!basepath)
+    set_basepath (getenv ("MGDATA"));
+  sprintf (path, FILE_NAME_FORMAT, basepath, name, suffix);  /* [RPAP - Feb 97: WIN32 Port] */
+  return create_named_file (path, mode, magic_num, err_mode);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mg_files.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mg_files.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mg_files.h	(revision 21083)
@@ -0,0 +1,343 @@
+/**************************************************************************
+ *
+ * mg_files.h -- Routines for handling files for the auxillary programs
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef MG_FILES_H
+#define MG_FILES_H
+
+#include "sysfuncs.h"
+
+/* Magic numbers for the different types of files */
+
+#define GEN_MAGIC(a,b,c,d) ((unsigned long)(((a)<<24) + ((b)<<16) + \
+					    ((c)<<8) + (d)))
+
+#define MAGIC_XXXX		GEN_MAGIC('M','G', 0 , 0)
+#define MAGIC_STATS_DICT	GEN_MAGIC('M','G','S','D')
+#define MAGIC_AUX_DICT		GEN_MAGIC('M','G','A','D')
+#define MAGIC_FAST_DICT		GEN_MAGIC('M','G','F','D')
+#define MAGIC_DICT		GEN_MAGIC('M','G','D', 0 )
+#define MAGIC_STEM_BUILD	GEN_MAGIC('M','G','S', 0 )
+#define MAGIC_HASH		GEN_MAGIC('M','G','H', 0 )
+#define MAGIC_STEM		GEN_MAGIC('M','G','s', 0 )
+#define MAGIC_CHUNK		GEN_MAGIC('M','G','C', 0 )
+#define MAGIC_CHUNK_TRANS	GEN_MAGIC('M','G','c', 0 )
+#define MAGIC_TEXT		GEN_MAGIC('M','G','T', 0 )
+#define MAGIC_TEXI		GEN_MAGIC('M','G','t', 0 )
+#define MAGIC_TEXT_LEVELS	GEN_MAGIC('M','G','t','L')
+#define MAGIC_TEXI_WGT		GEN_MAGIC('M','G','t','W')
+#define MAGIC_INVF		GEN_MAGIC('M','G','I', 0 )
+#define MAGIC_INVF_LEVELS	GEN_MAGIC('M','G','I','L')
+#define MAGIC_INVI		GEN_MAGIC('M','G','i', 0 )
+#define MAGIC_WGHT		GEN_MAGIC('M','G','W', 0 )
+#define MAGIC_WGHT_APPROX	GEN_MAGIC('M','G','w', 0 )
+#define MAGIC_PARAGRAPH		GEN_MAGIC('M','G','P', 0 )
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAGIC_STEM_1            GEN_MAGIC('M','G','s','1')
+#define MAGIC_STEM_2            GEN_MAGIC('M','G','s','2')
+#define MAGIC_STEM_3            GEN_MAGIC('M','G','s','3')
+
+#define IS_MAGIC(a) ((((u_long)(a)) & 0xffff0000) == MAGIC_XXXX)
+
+
+/* err_mode values for open_file and create_file */
+#define MG_ABORT 0
+#define MG_MESSAGE 1
+#define MG_CONTINUE 2
+
+
+
+
+
+/* File suffixes */
+
+
+/* The compression dictionary built by txt.pass1 */
+#ifdef SHORT_SUFFIX
+# define TEXT_STATS_DICT_SUFFIX	 ".tsd"
+#else
+# define TEXT_STATS_DICT_SUFFIX	 ".text.stats"
+#endif
+
+/* The compression dictionary built by text.pass1 and comp_dict.process */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_SUFFIX	 ".td"
+#else
+# define TEXT_DICT_SUFFIX	 ".text.dict"
+#endif
+
+/* The compression dictionary built by mg_make_fast_dict */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_FAST_SUFFIX	 ".tdf"
+#else
+# define TEXT_DICT_FAST_SUFFIX	 ".text.dict.fast"
+#endif
+
+/* The auxilary dictionary built by text.pass2 */
+#ifdef SHORT_SUFFIX
+# define TEXT_DICT_AUX_SUFFIX	 ".tda"
+#else
+# define TEXT_DICT_AUX_SUFFIX	 ".text.dict.aux"
+#endif
+
+/* The compressed text build by text.pass2 */
+#ifdef SHORT_SUFFIX
+# define TEXT_SUFFIX		 ".t"
+#else
+# define TEXT_SUFFIX		 ".text"
+#endif
+
+/* The combined compressed text index and document weight file */
+#ifdef SHORT_SUFFIX
+# define TEXT_IDX_WGT_SUFFIX	 ".tiw"
+#else
+# define TEXT_IDX_WGT_SUFFIX	 ".text.idx.wgt"
+#endif
+
+/* The compressed text index file */
+#ifdef SHORT_SUFFIX
+# define TEXT_IDX_SUFFIX	 	".ti"
+#else
+# define TEXT_IDX_SUFFIX	 	".text.idx"
+#endif
+
+/* The document levels in the text */
+#ifdef SHORT_SUFFIX
+# define TEXT_LEVEL_SUFFIX	 	".tl"
+#else
+# define TEXT_LEVEL_SUFFIX	 	".text.level"
+#endif
+
+/* The dictionary of stemmed words build by invf.pass1 and ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_SUFFIX         ".id"
+#else
+# define INVF_DICT_SUFFIX         ".invf.dict"
+#endif
+
+/* The dictionary of stemmed words build by stem.process */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_SUFFIX ".idb"
+#else
+# define INVF_DICT_BLOCKED_SUFFIX ".invf.dict.blocked"
+#endif
+
+/* The exact document weights file build by make.weights, invf.pass2,
+   or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define WEIGHTS_SUFFIX           ".w"
+#else
+# define WEIGHTS_SUFFIX           ".weight"
+#endif
+
+/* The approximate weights file built by make.weights */
+#ifdef SHORT_SUFFIX
+# define APPROX_WEIGHTS_SUFFIX    ".wa"
+#else
+# define APPROX_WEIGHTS_SUFFIX    ".weight.approx"
+#endif
+
+/* The inverted file build by invf.pass2 or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define INVF_SUFFIX              ".i"
+#else
+# define INVF_SUFFIX              ".invf"
+#endif
+
+/* The level information for the inverted text */
+#ifdef SHORT_SUFFIX
+# define INVF_LEVEL_SUFFIX              ".il"
+#else
+# define INVF_LEVEL_SUFFIX              ".invf.level"
+#endif
+
+/* The inverted file index build by invf.pass2 or ivf.pass2 */
+#ifdef SHORT_SUFFIX
+# define INVF_IDX_SUFFIX          ".ii"
+#else
+# define INVF_IDX_SUFFIX          ".invf.idx"
+#endif
+
+/* The inverted file chunk descriptor built by ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_CHUNK_SUFFIX        ".ic"
+#else
+# define INVF_CHUNK_SUFFIX        ".invf.chunk"
+#endif
+
+/* The word index translation file built by ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_CHUNK_TRANS_SUFFIX  ".ict"
+#else
+# define INVF_CHUNK_TRANS_SUFFIX  ".invf.chunk.trans"
+#endif
+
+/* The hashed stemmed dictionary built by make.perf_hash */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_HASH_SUFFIX    ".idh"
+#else
+# define INVF_DICT_HASH_SUFFIX    ".invf.dict.hash"
+#endif
+
+/* The paragraph descriptior file built by invf.pass1 or ivf.pass1 */
+#ifdef SHORT_SUFFIX
+# define INVF_PARAGRAPH_SUFFIX    ".ip"
+#else
+# define INVF_PARAGRAPH_SUFFIX    ".invf.paragraph"
+#endif
+
+/* The trace file build by mg.builder. */
+#ifdef SHORT_SUFFIX
+# define TRACE_SUFFIX             ".trc"
+#else
+# define TRACE_SUFFIX             ".trace"
+#endif
+
+/* The compression stats file build by mg.builder. */
+#ifdef SHORT_SUFFIX
+# define COMPRESSION_STATS_SUFFIX ".cs"
+#else
+# define COMPRESSION_STATS_SUFFIX ".compression.stats"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The casefolded index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_1_SUFFIX ".ib1"
+#else
+# define INVF_DICT_BLOCKED_1_SUFFIX ".invf.dict.blocked.1"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The stemmed index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_2_SUFFIX ".ib2"
+#else
+# define INVF_DICT_BLOCKED_2_SUFFIX ".invf.dict.blocked.2"
+#endif
+
+/* [RPAP - Jan 97: Stem Index Change] */
+/* The casefolded and stemmed  index into the stemmed dictionary */
+#ifdef SHORT_SUFFIX
+# define INVF_DICT_BLOCKED_3_SUFFIX ".ib3"
+#else
+# define INVF_DICT_BLOCKED_3_SUFFIX ".invf.dict.blocked.3"
+#endif
+
+/* [RPAP - Feb 97: WIN32 Port] */
+#ifdef __WIN32__
+#define FILE_NAME_FORMAT "%s%s%s"
+#else
+#define FILE_NAME_FORMAT "%s/%s%s"
+#endif
+
+
+/* This sets the base path for all file operations */
+void set_basepath (const char *bp);
+
+
+/* return the currently defined basepath */
+char *get_basepath (void);
+
+
+
+
+/* This generates the name of a file. It places the name in the buffer
+   specified or if that is NULL it uses a static buffer. */
+char *make_name (const char *name, const char *suffix, char *buffer);
+
+
+
+
+
+
+
+/* This will open the specified file and check its magic number.
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *open_named_file (const char *name, const char *mode,
+		       u_long magic_num, int err_mode);
+
+
+
+
+/* This will open the specified file and check its magic number.
+
+   err_mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *open_file (const char *name, const char *suffix, const char *mode,
+		 u_long magic_num, int err_mode);
+
+
+
+
+
+/* This will create the specified file and set its magic number.
+
+   Mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *create_named_file (const char *name, const char *mode,
+			 u_long magic_num, int err_mode);
+
+
+
+/* This will create the specified file and set its magic number.
+
+   err_mode may take on the following values
+   MG_ABORT    : causes an error message to be generated and the
+   program aborted if there is an error.
+   MG_MESSAGE  : causes a message to be generated and a NULL value to
+   be returned if there is an error.
+   MG_CONTINUE : causes a NULL value to be returned if there is an error.
+
+   On success if returns the FILE *. On failure it will return a NULL value
+   and possibly generate an error message, or it will exit the program with
+   an error message.   */
+FILE *create_file (const char *name, const char *suffix, const char *mode,
+		   u_long magic_num, int err_mode);
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.1	(revision 21083)
@@ -0,0 +1,188 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_compression_dict 1 \*(Dt CITRI
+.SH NAME
+mgpp_compression_dict \- build a compression dictionary.
+.SH SYNOPSIS
+.B mgpp_compression_dict
+[
+.B \-h
+]
+[
+.BR \-C " |"
+.BR \-P " |"
+.B  \-S
+]
+.if n .ti +9n
+[
+.BR \-0 " |"
+.BR \-1 " |"
+.BR \-2 " |"
+.B  \-3
+]
+[
+.BR \-H " |"
+.BR \-B " |"
+.BR \-D " |"
+.BR \-Y " |"
+]
+.if n .ti +9n
+.if t .ti +.5i
+[
+.BI \-l " lookback"
+]
+[
+.BI \-k " mem"
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_compression_dict
+builds a compression dictionary based on the statistics gathered
+during the first pass over the text.  The options to the program are
+mainly concerned with limiting the amount of memory the dictionary
+will use and with how the text compressor will cope with any novel
+words found during the compression phase.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.B \-C
+Build a complete dictionary from the statistics file.  If during the
+text compression phase a novel word is found, then the compressor will
+produce an error message and stop.
+.TP
+.B \-P
+Build a partial dictionary from the statistics file.  This dictionary
+assumes that the statistics file are based on the entire text.  The
+statistics of words not includes in the dictionary are used to
+calculate the escape probability.  If novel words are being coded
+character by character, then there may not be a Huffman code for every
+possible character.  This means that the compressor may fail if a novel
+word contains a novel character.
+.TP
+.B \-S
+Build a seed dictionary from the statistics file.  This dictionary
+assumes that the statistics file is based on only a portion of the
+text to be compressed.  The probability of a novel word is based on the
+number of words that have only occurred once.  If novel words are being
+coded character by character, then the Huffman codes for characters are
+based on the frequency of characters in the dictionary.
+.TP
+.B \-0
+All words from the statistics file are included in the built
+dictionary.
+.TP
+.B \-1
+Words are included in the dictionary until the dictionary reaches the
+desired size.  Words are selected for the dictionary based on the order
+they occurred in the source text.
+.TP
+.B \-2
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.
+.TP
+.B \-3
+Words are included in the dictionary until the dictionary reaches the
+desired size.  The most frequent words are included in the dictionary
+first; where there is a tie for frequency, the shortest word is
+included first.  Words are the shuffled back and forth between the
+`keep' and `discard' lists to find the `optimal' set of words that
+should be in the dictionary.
+.TP
+.B \-H
+This specifies that novel words will be coded character by character
+using Huffman codes.
+.TP
+.B \-B
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using binary codes.  The binary code represents their occurrence
+position in the auxiliary dictionary.
+.TP
+.B \-D
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using delta codes.  The delta code represents their occurrence position
+in the auxiliary dictionary.
+.TP
+.B \-Y
+This specifies that an auxiliary dictionary will be built by the
+compressor.  Each novel word found will be placed at the end of the
+auxiliary dictionary.  Novel words will be coded in the compressed text
+using a combination of gamma and binary codes.  The code represents
+their occurrence position in the auxiliary dictionary.  This generally
+produces better compression than
+.B \-B
+or
+.BR \-D .
+.TP
+.BI \-l " lookback"
+The generated dictionary is designed to be front coded when it is
+loaded into memory.  Under normal circumstances, a front-coded
+dictionary would require scanning from the beginning in order to find
+any particular word.  However, every
+.I lookback
+words in the dictionary, the whole word is stored and a pointer to that
+word maintained.  E.g., if
+.I lookback
+is 4, then every fourth word is stored in its entirety.
+.TP
+.BI \-k " mem"
+This limits the amount of memory to use for the generated
+dictionary.  Words are selected for the dictionary based of the text
+statistics, and whether
+.BR \-0 , " \-1" , " \-2"
+or
+.B \-3
+is specified.  The memory is calculated assuming a lookback of 0,
+irrespective of what actual lookback is specified.  This means that if
+a non-zero lookback is given, the dictionary will actually occupy
+less space than specified by
+.BR \-k .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.stats
+Statistics about the source text.
+.TP
+.B *.text.dict
+Compression dictionary for the source text.
+.SH "SEE ALSO"
+.na
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_stem_idx (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_compression_dict.cpp	(revision 21083)
@@ -0,0 +1,1021 @@
+/**************************************************************************
+ *
+ * mgpp_compression_dict.cpp -- Routines for creating compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_gen.h"
+#include "bitio_m_stdio.h"
+#include "mgheap.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "invf.h"
+#include "text.h"
+#include "words.h"
+#include "mg.h"
+#include "WordData.h"
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+#define is_power_of_two(a) ((a) != 0 && (((a) & ((a)-1)) == 0))
+
+#define MAX_RECALCULATIONS 100
+
+typedef struct DictWordData : public WordData
+  {
+    float saving;
+    float char_bit_cost;
+    u_long num_trans;
+    u_char *word;
+  }
+DictWordData;
+
+static DictWordData *Words[2];
+static u_long Num[2];
+static u_long chars[2];
+
+#define KIND(p) (((p) >= Words[0] && (p) < Words[0] + Num[0]) ? 0 : 1)
+#define IsWord(p) (((p) >= Words[1] && (p) < Words[1] + Num[1]) ? 1 : 0)
+#define IsNonWord(p) (((p) >= Words[0] && (p) < Words[0] + Num[0]) ? 1 : 0)
+
+
+typedef struct DictData
+  {
+    DictWordData **wd;
+    u_long num_wds;
+    u_long chars;
+  }
+DictData;
+
+typedef DictData DictInfo[2];
+
+static DictInfo keep, discard, all;
+static compression_stats_header csh;
+
+static char *file_name = "";
+static u_long novel_method = MG_NOVEL_HUFFMAN_CHARS;
+
+
+static void ReadInWords (char *);
+static void Select_on (int k, heap_comp hc);
+static void Method3 (int k);
+static void Select_all (void);
+static u_long WriteOutWords (char *, u_long, int);
+static int DecFreqIncWL (void *a, void *b);
+static int OccuranceOrder (void *a, void *b);
+
+
+
+int main (int argc, char **argv)
+{
+  int ch;
+  char type = 'C';
+  char mode = '0';
+  int lookback = 2;
+  double k = 0;
+  u_long mem_reqd;
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "0123CPSf:d:l:hk:HDY")) != -1)
+    switch (ch)
+      {
+      case 'H':
+	novel_method = MG_NOVEL_HUFFMAN_CHARS;
+	break;
+      case 'D':
+	novel_method = MG_NOVEL_DELTA;
+	break;
+      case 'Y':
+	novel_method = MG_NOVEL_HYBRID;
+	break;
+      case 'f':		/* input file */
+	file_name = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'C':
+      case 'P':
+      case 'S':
+	type = ch;
+	break;
+      case '0':
+      case '1':
+      case '2':
+      case '3':
+	mode = ch;
+	break;
+      case 'l':
+	lookback = atoi (optarg);
+	if (!is_power_of_two (lookback))
+	  FatalError (1, "The lookback value must be a power of 2");
+	lookback = floorlog_2 (lookback);
+	break;
+      case 'k':
+	k = atof (optarg) * 1024;
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-l lookback] [-f input_file]"
+	"[-d data directory] [-h] [-0|-1|-2|-3] [-C|-P|-S] [-k mem (Kb)]\n",
+		 argv[0]);
+	exit (1);
+      }
+
+  ReadInWords (file_name);
+
+  if (type == 'C')
+    {
+      Select_all ();
+      mem_reqd = WriteOutWords (file_name, MG_COMPLETE_DICTIONARY, lookback);
+    }
+  else
+    {
+      switch (mode)
+	{
+	case '0':
+	  Select_all ();
+	  break;
+	case '1':
+#ifndef SILENT
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+#endif
+	  Select_on ((int) k, OccuranceOrder);
+	  break;
+	case '2':
+#ifndef SILENT
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+#endif
+	  Select_on ((int) k, DecFreqIncWL);
+	  break;
+	case '3':
+#ifndef SILENT
+	  Message ("Dictionary limit of %.2f Kb", k / 1024);
+#endif
+	  Method3 ((int) k);
+	  break;
+	}
+      if (type == 'P')
+	{
+	  mem_reqd = WriteOutWords (file_name, MG_PARTIAL_DICTIONARY, lookback);
+	}
+      else
+	{
+	  mem_reqd = WriteOutWords (file_name, MG_SEED_DICTIONARY, lookback);
+	}
+    }
+
+#ifndef SILENT
+  Message ("Num words           : %8u -> %8u\n", Num[1], keep[1].num_wds);
+  Message ("Num non-words       : %8u -> %8u\n", Num[0], keep[0].num_wds);
+  Message ("Chars of words      : %8u -> %8u\n", chars[1], keep[1].chars);
+  Message ("Chars of non-words  : %8u -> %8u\n", chars[0], keep[0].chars);
+  Message ("Mem usage           : %8u -> %8u\n",
+	   (Num[0] + Num[1]) * sizeof (char *) + chars[0] + chars[1],
+	     (keep[0].num_wds + keep[1].num_wds) * sizeof (char *) +
+	   keep[0].chars + keep[1].chars);
+  Message ("Actual mem required : %8u\n", mem_reqd);
+#endif
+  return (0);
+}
+
+
+
+
+static void 
+ReadInWords (char *filename)
+{
+  FILE *f;
+  unsigned long i;
+  f = open_file (filename, TEXT_STATS_DICT_SUFFIX, "rb",
+		 MAGIC_STATS_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread (&csh, sizeof (csh), 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes);
+
+  for (i = 0; i < 2; i++)
+    {
+      frags_stats_header fsh;
+      char *buf;
+      DictWordData *wd;
+      chars[i] = 0;
+
+      fread (&fsh, sizeof (fsh), 1, f);
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(fsh.num_frags);
+      NTOHUL(fsh.mem_for_frags);
+
+      Num[i] = all[i].num_wds = fsh.num_frags;
+
+      /* The +1 on the following line is to leave room for the esc code. */
+      all[i].wd = (DictWordData **) Xmalloc (sizeof (DictWordData *) * Num[i] + 1);
+
+      buf = (char *) Xmalloc (fsh.mem_for_frags);
+      wd = Words[i] = (DictWordData *) Xmalloc (sizeof (DictWordData) * Num[i]);
+      unsigned int j;
+      for (j = 0; j < Num[i]; j++, wd++)
+	{
+	  int len;
+
+	  // read docCount and wordCount
+	  wd->read(f);
+
+	  // read an mgString
+	  len = fgetc (f);
+	  wd->word = (u_char *) buf;
+	  *buf++ = len;
+	  fread (buf, len, 1, f);
+	  buf += len;
+	  all[i].wd[j] = wd;
+	}
+      chars[i] = fsh.mem_for_frags - fsh.num_frags;
+    }
+  fclose (f);
+}
+
+
+static void 
+Alloc_keep_discard (void)
+{
+  keep[0].num_wds = 0;
+  keep[0].wd = (DictWordData **) Xmalloc ((Num[0] + 1) * sizeof (DictWordData *));
+  keep[1].num_wds = 0;
+  keep[1].wd = (DictWordData **) Xmalloc ((Num[1] + 1) * sizeof (DictWordData *));
+  discard[0].num_wds = 0;
+  discard[0].wd = (DictWordData **) Xmalloc ((Num[0] + 1) * sizeof (DictWordData *));
+  discard[1].num_wds = 0;
+  discard[1].wd = (DictWordData **) Xmalloc ((Num[1] + 1) * sizeof (DictWordData *));
+}
+
+
+static int 
+sort_comp (const void *a, const void *b)
+{
+  DictWordData *aa = *(DictWordData **) a;
+  DictWordData *bb = *(DictWordData **) b;
+  return casecompare (aa->word, bb->word);  /* [RPAP - Jan 97: Stem Index Change] */
+}
+
+
+
+static void 
+SortAndCount_DictData (DictData * dd)
+{
+  unsigned int i;
+  DictWordData **wd;
+  qsort (dd->wd, dd->num_wds, sizeof (DictWordData *), sort_comp);
+  dd->chars = 0;
+  wd = dd->wd;
+  for (i = 0; i < dd->num_wds; i++, wd++)
+    dd->chars += (*wd)->word[0];
+}
+
+
+static void 
+Select_all (void)
+{
+  unsigned int i;
+  Alloc_keep_discard ();
+  keep[0].num_wds = Num[0];
+  for (i = 0; i < Num[0]; i++)
+    keep[0].wd[i] = Words[0] + i;
+  keep[1].num_wds = Num[1];
+  for (i = 0; i < Num[1]; i++)
+    keep[1].wd[i] = Words[1] + i;
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+}
+
+
+
+
+static int 
+DecFreqIncWL (void *a, void *b)
+{
+  DictWordData *aa = *(DictWordData **) a;
+  DictWordData *bb = *(DictWordData **) b;
+  if (aa->docCount > bb->docCount)
+    return -1;
+  else if (aa->docCount < bb->docCount)
+    return 1;
+  else
+    return bb->word[0] - aa->word[0];
+}
+
+
+static int 
+OccuranceOrder (void *a, void *b)
+{
+  DictWordData *aa = *(DictWordData **) a;
+  DictWordData *bb = *(DictWordData **) b;
+  if (aa->words() > bb->words())
+    return 1;
+  else if (aa->words() < bb->words())
+    return -1;
+  else
+    return 0;
+}
+
+
+static void 
+Select_on (int k, heap_comp hc)
+{
+  int i, num, mem;
+  DictWordData **wd;
+
+  Alloc_keep_discard ();
+
+  num = Num[0] + Num[1];
+  wd = (DictWordData **) Xmalloc (num * sizeof (DictWordData *));
+  for (i = 0; (unsigned int)i < Num[0]; i++)
+    wd[i] = Words[0] + i;
+  for (i = 0; (unsigned int)i < Num[1]; i++)
+    wd[i + Num[0]] = Words[1] + i;
+
+  heap_build (wd, sizeof (*wd), num, hc);
+
+  mem = 0;
+  while (k > mem && num)
+    {
+      int idx;
+      DictWordData *word = wd[0];
+#ifdef DEBUG
+      fprintf (stderr, "%4d:%4d:%8d :%8d :%8d : \"%s\"\n",
+	       keep[0].num_wds, keep[1].num_wds,
+	       mem, word->documents(), word->word, word2str (word->word));
+#endif
+      mem += sizeof (u_char *) + word->word[0];
+      heap_deletehead (wd, sizeof (*wd), &num, hc);
+      idx = KIND (word);
+      keep[idx].wd[keep[idx].num_wds++] = word;
+    }
+
+  for (i = 0; i < num; i++)
+    {
+      DictWordData *word = wd[i];
+      int idx = KIND (word);
+      discard[idx].wd[discard[idx].num_wds++] = word;
+    }
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+  SortAndCount_DictData (&discard[0]);
+  SortAndCount_DictData (&discard[1]);
+
+  assert (keep[0].num_wds + discard[0].num_wds == Num[0]);
+  assert (keep[1].num_wds + discard[1].num_wds == Num[1]);
+
+}
+
+
+
+static int 
+BigSaving (void *a, void *b)
+{
+  DictWordData *aa = *(DictWordData **) a;
+  DictWordData *bb = *(DictWordData **) b;
+  return (aa->saving > bb->saving) ? -1 : (aa->saving < bb->saving);
+}
+
+static int 
+SmallSaving (void *a, void *b)
+{
+  DictWordData *aa = *(DictWordData **) a;
+  DictWordData *bb = *(DictWordData **) b;
+  return (aa->saving < bb->saving) ? -1 : (aa->saving > bb->saving);
+}
+
+
+static void 
+CalcCharCounts (DictWordData ** wd, int num,
+		char *char_lens[2], char *len_lens[2],
+		u_long escape[2])
+{
+  long char_freqs[2][256];
+  long len_freqs[2][16];
+  huff_data hd;
+  int i;
+  escape[0] = 0;
+  escape[1] = 0;
+  memset (char_freqs, '\0', sizeof (char_freqs));
+  memset (len_freqs, '\0', sizeof (len_freqs));
+  for (i = 0; i < num; i++, wd++)
+    {
+      u_long freq = (*wd)->documents();
+      u_char *buf = (*wd)->word;
+      int len = *buf++;
+      int idx = KIND (*wd);
+      len_freqs[idx][len] += freq;
+      escape[idx] += freq;
+      for (; len; len--, buf++)
+	char_freqs[idx][(u_long) (*buf)] += freq;
+    }
+  Generate_Huffman_Data (256, char_freqs[0], &hd, NULL);
+  char_lens[0] = hd.clens;
+  Generate_Huffman_Data (256, char_freqs[1], &hd, NULL);
+  char_lens[1] = hd.clens;
+
+  Generate_Huffman_Data (16, len_freqs[0], &hd, NULL);
+  len_lens[0] = hd.clens;
+  Generate_Huffman_Data (16, len_freqs[1], &hd, NULL);
+  len_lens[1] = hd.clens;
+}
+
+
+
+
+
+inline void CalcBitCostForWordData(DictWordData **word, int num,
+				   double freqs_trans[2], u_long escape[2],
+				   char * char_lens[2], char *len_lens[2], 
+				   double esc[2], int num_trans)
+{ 
+  int j;
+
+  for (j = 0; j < num; j++, word++)
+    {
+      float   cbc, wbc;
+      u_char *buf = (*word)->word;
+      int     len = *buf++;
+      u_long  freq = (*word)->documents();
+      int     idx = KIND (*word);
+
+      cbc = len_lens[idx][len];
+      for (; len; len--, buf++)
+	cbc += char_lens[idx][(u_long) (*buf)];
+
+      (*word)->char_bit_cost = (cbc + esc[idx]) * freq;
+
+      wbc = -log2 (freq / (freqs_trans[idx] + escape[idx])) * freq;
+
+      (*word)->saving = ((*word)->char_bit_cost - wbc) /
+	(sizeof (char *) + (*word)->word[0]);
+
+      (*word)->num_trans = num_trans;
+    }
+}
+
+
+
+void 
+CalcBitCost (DictWordData ** discard_word, int discard_num,
+	     DictWordData ** keep_word, int keep_num, double freqs_trans[2],
+	     u_long escape[2], int num_trans)
+{
+  char *char_lens[2];
+  char *len_lens[2];
+  double esc[2];
+  CalcCharCounts (discard_word, discard_num, char_lens, len_lens, escape);
+  esc[0] = -log2 (escape[0] / (freqs_trans[0] + escape[0]));
+  esc[1] = -log2 (escape[1] / (freqs_trans[1] + escape[1]));
+  CalcBitCostForWordData(discard_word, discard_num, freqs_trans, escape,
+			 char_lens, len_lens, esc, num_trans);
+  CalcBitCostForWordData(keep_word, keep_num, freqs_trans, escape,
+			 char_lens, len_lens, esc, num_trans);
+  Xfree (char_lens[0]);
+  Xfree (char_lens[1]);
+  Xfree (len_lens[0]);
+  Xfree (len_lens[1]);
+}
+
+inline void m3_transferWord(DictWordData **toHeap, int *toNum, heap_comp toSaving,
+			    DictWordData **fromHeap, int *fromNum, heap_comp fromSaving,
+			    int *num_trans, double freqs_trans[], int *mem, double *total,
+			    int *count)
+{
+  /* Transfer the word at the top of the keep heap to the
+     discard heap. */
+  DictWordData *word = fromHeap[0];
+  int idx = KIND (word);
+  heap_deletehead (fromHeap, sizeof (word), fromNum, fromSaving);
+  toHeap[*toNum] = word;
+  heap_additem (toHeap, sizeof (word), toNum, toSaving);
+  freqs_trans[idx] -= word->documents();
+  *mem = (*mem) - sizeof (u_char *) + word->word[0];
+  *num_trans += 1;
+  *total += word->saving;
+  *count += 1;
+#ifdef DEBUG
+  fprintf (stderr,
+	   "KEEP -> DISCARD %8d :%8d :%8.0f :%8.0f : \"%s\"\n",
+	   *mem, word->documents(), word->char_bit_cost,
+	   word->saving, word2str (word->word));
+#endif
+}
+
+inline void m3_storeWord(DictWordData **wordHeap, int wordNum, int num_trans, 
+			 double freqs_trans[], u_long escape[], heap_comp hc)
+{
+  DictWordData *word = wordHeap[0];
+  int idx = KIND (word);
+  float wbc;
+#ifdef DEBUG1
+  fprintf (stderr, "KEEP \"%s\" %.2f ->", word2str (word->word),
+	   word->saving);
+#endif
+  wbc = -log2 (word->documents() / (freqs_trans[idx] + escape[idx])) *
+    word->documents();
+  word->saving = (word->char_bit_cost - wbc) /
+    (sizeof (char *) + word->word[0]);
+#ifdef DEBUG1
+  fprintf (stderr, " %.2f\n", word->saving);
+#endif
+  word->num_trans = num_trans;
+  heap_changedhead (wordHeap, sizeof (word), wordNum, hc);
+}
+
+
+static void 
+Method3 (int k)
+{
+  int i, keep_num, discard_num, mem, num_trans, recalc_reqd;
+  int keep_to_discard = 0;
+  int discard_to_keep = 0;
+  int recalcs = 0;
+  double freqs_trans[2], total;
+  u_long escape[2];
+  DictWordData **keep_heap, **discard_heap;
+
+  freqs_trans[0] = freqs_trans[1] = 0;
+  num_trans = 0;
+
+  discard_num = Num[0] + Num[1];
+  discard_heap = (DictWordData **) Xmalloc (discard_num * sizeof (DictWordData *));
+
+  keep_num = 0;
+  keep_heap = (DictWordData **) Xmalloc (discard_num * sizeof (DictWordData *));
+
+
+  for (i = 0; (unsigned int)i < Num[0]; i++)
+    discard_heap[i] = Words[0] + i;
+  for (i = 0; (unsigned int)i < Num[1]; i++)
+    discard_heap[i + Num[0]] = Words[1] + i;
+
+  heap_build (discard_heap, sizeof (*discard_heap), discard_num, DecFreqIncWL);
+
+  mem = 0;
+  while (k > mem && discard_num)
+    {
+      DictWordData *word = discard_heap[0];
+      mem += sizeof (u_char *) + word->word[0];
+      heap_deletehead (discard_heap, sizeof (word), &discard_num, DecFreqIncWL);
+      keep_heap[keep_num++] = word;
+      freqs_trans[KIND (word)] += word->documents();
+      num_trans++;
+    }
+
+  CalcBitCost (discard_heap, discard_num, keep_heap, keep_num,
+	       freqs_trans, escape, num_trans);
+  heap_build (discard_heap, sizeof (*discard_heap), discard_num, BigSaving);
+  heap_build (keep_heap, sizeof (*keep_heap), keep_num, SmallSaving);
+
+  total = 0;
+  recalc_reqd = 0;
+  while (keep_num && discard_num)
+    {
+      if ((keep_num && keep_heap[0]->num_trans < (unsigned)num_trans) ||
+	  (discard_num && discard_heap[0]->num_trans < (unsigned)num_trans))
+	{
+	  if (keep_num && keep_heap[0]->num_trans < (unsigned)num_trans)
+	    {
+	      m3_storeWord(keep_heap, keep_num, num_trans, freqs_trans, escape, SmallSaving);
+	    }
+
+	  if (discard_num && discard_heap[0]->num_trans < (unsigned)num_trans)
+	    {
+	      m3_storeWord(discard_heap, discard_num, num_trans, freqs_trans, escape, BigSaving);
+	    }
+	}
+      else if (keep_heap[0]->saving < discard_heap[0]->saving)
+	{
+	  assert (keep_num && discard_num);
+	  if (keep_num && mem + sizeof (char *) + discard_heap[0]->word[0] > (unsigned)k)
+	    {
+	      /* Transfer the word at the top of the keep heap to the
+	         discard heap. */
+	      m3_transferWord(discard_heap, &discard_num, BigSaving,
+			      keep_heap, &keep_num, SmallSaving,
+			      &num_trans, freqs_trans, &mem, &total, &keep_to_discard);
+	    }
+	  else
+	    {
+	      /* Transfer the word at the top of the discard heap to the
+	         keep heap. */
+	      m3_transferWord(keep_heap, &keep_num, SmallSaving,
+			      discard_heap, &discard_num, BigSaving,
+			      &num_trans, freqs_trans, &mem, &total, &discard_to_keep);
+	    }
+
+	  recalc_reqd = 1;
+
+	}
+      else
+	{
+	  if (recalc_reqd == 0)
+	    break;
+#ifdef DEBUG1
+	  fprintf (stderr, "--------------\n");
+#endif
+	  if (recalcs == MAX_RECALCULATIONS)
+	    break;
+	  CalcBitCost (discard_heap, discard_num, keep_heap, keep_num,
+		       freqs_trans, escape, num_trans);
+	  heap_build (discard_heap, sizeof (*discard_heap),
+		      discard_num, BigSaving);
+	  heap_build (keep_heap, sizeof (keep_heap), keep_num, SmallSaving);
+	  recalc_reqd = 0;
+	  recalcs++;
+	}
+    }
+
+  Alloc_keep_discard ();
+
+  for (i = 0; i < discard_num; i++)
+    {
+      DictWordData *word = discard_heap[i];
+      int idx = KIND (word);
+      assert (IsWord (word) || IsNonWord (word));
+      discard[idx].wd[discard[idx].num_wds++] = word;
+    }
+  for (i = 0; i < keep_num; i++)
+    {
+      DictWordData *word = keep_heap[i];
+      int idx = KIND (word);
+      assert (IsWord (word) || IsNonWord (word));
+      keep[idx].wd[keep[idx].num_wds++] = word;
+    }
+  SortAndCount_DictData (&keep[0]);
+  SortAndCount_DictData (&keep[1]);
+  SortAndCount_DictData (&discard[0]);
+  SortAndCount_DictData (&discard[1]);
+
+  assert (keep[0].num_wds + discard[0].num_wds == Num[0]);
+  assert (keep[1].num_wds + discard[1].num_wds == Num[1]);
+#ifndef SILENT
+  Message ("Keep -> Discard        : %8d", keep_to_discard);
+  Message ("Discard -> Keep        : %8d", discard_to_keep);
+  Message ("Huffman Recalculations : %8d", recalcs);
+  if (recalcs == MAX_RECALCULATIONS)
+    Message ("WARNING: The number of recalculations == %d", MAX_RECALCULATIONS);
+#endif
+}
+
+
+
+
+
+
+
+
+
+
+/****************************************************************************
+ *****									*****
+ *****			Dictionary saving code				*****
+ *****									*****
+ ****************************************************************************/
+
+
+
+static void 
+Write_cdh (FILE * f, compression_dict_header * cdh)
+{
+  /* [RPAP - Jan 97: Endian Ordering] */
+  int i;
+  compression_dict_header tmp = *cdh;
+  HTONUL(tmp.dict_type);
+  HTONUL(tmp.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    HTONUL(tmp.params[i]);
+  HTONUL(tmp.num_words[0]);
+  HTONUL(tmp.num_words[1]);
+  HTONUL(tmp.num_word_chars[0]);
+  HTONUL(tmp.num_word_chars[1]);
+  HTONUL(tmp.lookback);
+
+  fwrite (&tmp, sizeof (tmp), 1, f);
+}
+
+
+static void 
+Write_words (FILE * f, DictData * dd)
+{
+  unsigned int i;
+  u_char *curr, *prev = NULL;
+  for (i = 0; i < dd->num_wds; i++)
+    {
+      int len;
+      curr = dd->wd[i]->word;
+      if (prev)
+	/* look for prefix match with prev string */
+	len = prefixlen (prev, curr);
+      else
+	len = 0;
+      fputc ((len << 4) + (curr[0] - len), f);
+      fwrite (curr + len + 1, sizeof (u_char), curr[0] - len, f);
+      prev = curr;
+    }
+
+}
+
+
+static int 
+Uncompressed_size (DictData * dd)
+{
+  unsigned int i, us;
+  for (us = i = 0; i < dd->num_wds; i++)
+    us += dd->wd[i]->word[0];
+  return us;
+}
+
+
+static u_long 
+Write_data (FILE * f, DictData * dd, int lookback)
+{
+  u_long mem_reqd;
+  huff_data *hd;
+  int i; 
+  u_long us = dd->num_wds;
+  long *freqs;
+  u_long huff_words_size[MAX_HUFFCODE_LEN + 1];
+  u_long lencounts[MAX_HUFFCODE_LEN + 1];
+  u_char *lastword[MAX_HUFFCODE_LEN + 1];
+
+  if (!(freqs = new long [dd->num_wds]))
+    FatalError (1, "Unable to allocate memory for freqs");
+
+  for (i = 0; (unsigned)i < dd->num_wds; i++)
+    {
+      freqs[i] = dd->wd[i]->documents();
+      us += dd->wd[i]->word[0];
+    }
+
+  if (!(hd = Generate_Huffman_Data (dd->num_wds, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  delete (freqs);
+  freqs = NULL;
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+  HTONUL(us);  /* [RPAP - Jan 97: Endian Ordering] */
+  fwrite (&us, sizeof (us), 1, f);
+  NTOHUL(us);  /* [RPAP - Jan 97: Endian Ordering] */
+
+
+/* Calculate the amount of memory that will be required to store the text for
+   each different huffman code len. Every 1<<lookback words for each different
+   codelen length will not be prefixed by previous strings. */
+
+
+  memset (&huff_words_size, '\0', sizeof (huff_words_size));
+  memset (&lencounts, '\0', sizeof (lencounts));
+
+  mem_reqd = 0;
+
+  for (i = 0; (unsigned)i < dd->num_wds; i++)
+    {
+      int codelen = hd->clens[i];
+      u_char *word = dd->wd[i]->word;
+
+      if (!codelen)
+	FatalError (1, "The length of a code for a word was zero");
+
+      huff_words_size[codelen] += word[0] + 1;
+      mem_reqd += word[0] + (lookback != 0);
+#if 0
+      if ((lencounts[codelen] & ((1 << lookback) - 1)) == 0)
+	lastword[codelen] = word;
+      else
+	huff_words_size[codelen] -= prefixlen (lastword[codelen], word);
+#else
+      if ((lencounts[codelen] & ((1 << lookback) - 1)) != 0)
+	{
+	  int save = prefixlen (lastword[codelen], word);
+	  mem_reqd -= save;
+	  huff_words_size[codelen] -= save;
+	}
+      else
+	{
+	  mem_reqd += sizeof (u_char *);
+	}
+      lastword[codelen] = word;
+#endif
+      lencounts[codelen]++;
+    }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+    HTONUL(huff_words_size[i]);
+
+  fwrite (huff_words_size + hd->mincodelen, sizeof (*huff_words_size),
+	  hd->maxcodelen - hd->mincodelen + 1, f);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  for (i = hd->mincodelen; i < hd->maxcodelen + 1; i++)
+    NTOHUL(huff_words_size[i]);
+
+  Write_words (f, dd);
+
+  delete hd->clens;
+  delete hd;
+
+  return mem_reqd;
+}
+
+
+
+static void 
+Write_charfreqs (FILE * f, DictData * dd, int words,
+		 int zero_freq_permitted)
+{
+  unsigned int j;
+  long freqs[256];
+  DictWordData **wd = dd->wd;
+  huff_data *hd;
+
+  memset (freqs, '\0', sizeof (freqs));
+
+  for (j = 0; j < dd->num_wds; j++, wd++)
+    {
+      u_char *buf = (*wd)->word;
+      int len = *buf++;
+      for (; len; len--, buf++)
+	freqs[(u_long) (*buf)] += (*wd)->documents();
+    }
+
+  if (!zero_freq_permitted)
+    for (j = 0; j < 256; j++)
+      if (!freqs[j] && PESINAWORD (j) == words)
+	freqs[j] = 1;
+
+  if (!(hd = Generate_Huffman_Data (256, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+  delete hd->clens;
+  delete hd;
+}
+
+
+
+
+static void 
+Write_wordlens (FILE * f, DictData * dd, int zero_freq_permitted)
+{
+  unsigned int j;
+  long freqs[16];
+  DictWordData **wd = dd->wd;
+  huff_data *hd;
+
+  memset (freqs, '\0', sizeof (freqs));
+
+  for (j = 0; j < dd->num_wds; j++, wd++)
+    freqs[(*wd)->word[0]] += (*wd)->documents();
+
+  if (!zero_freq_permitted)
+    for (j = 0; j < 16; j++)
+      if (!freqs[j])
+	freqs[j] = 1;
+
+  if (!(hd = Generate_Huffman_Data (16, freqs, NULL, NULL)))
+    FatalError (1, "Unable to allocate memory for huffman data");
+
+  if (Write_Huffman_Data (f, hd) == -1)
+    FatalError (1, "Unable to write huffman data");
+
+
+  delete hd->clens;
+  delete hd;
+}
+
+
+
+static u_long 
+WriteOutWords (char *file_name, u_long type, int lookback)
+{
+  FILE *f;
+  int i;
+  u_long mem_reqd = 0;
+
+  compression_dict_header cdh;
+  f = create_file (file_name, TEXT_DICT_SUFFIX, "w+b",
+		   MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  memset (&cdh, '\0', sizeof(cdh));
+
+  cdh.dict_type = type;
+  cdh.novel_method = (type == MG_SEED_DICTIONARY) ? novel_method :
+    MG_NOVEL_HUFFMAN_CHARS;
+
+  cdh.num_words[1] = keep[1].num_wds;
+  cdh.num_words[0] = keep[0].num_wds;
+  cdh.num_word_chars[1] = Uncompressed_size (&keep[1]);
+  cdh.num_word_chars[0] = Uncompressed_size (&keep[0]);
+  cdh.lookback = lookback;
+
+  Write_cdh (f, &cdh);
+
+  for (i = 0; i < 2; i++)
+    switch (type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  mem_reqd += Write_data (f, &keep[i], lookback);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (keep[i].num_wds)
+	    {
+	      int j;
+	      DictWordData esc;
+	      esc.docCount = 0;
+	      esc.word = (u_char *) "";
+	      keep[i].wd[keep[i].num_wds++] = &esc;
+	      for (j = 0; (unsigned)j < discard[i].num_wds; j++)
+		esc.docCount += discard[i].wd[j]->documents();
+	      if (!esc.docCount)
+		esc.docCount++;
+	      mem_reqd += Write_data (f, &keep[i], lookback);
+	    }
+	  Write_charfreqs (f, &discard[i], i, 1);
+	  Write_wordlens (f, &discard[i], 1);
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (keep[i].num_wds)
+	    {
+	      int j;
+	      DictWordData esc;
+	      esc.docCount = 0;
+	      esc.word = (u_char *) "";
+	      keep[i].wd[keep[i].num_wds++] = &esc;
+	      for (j = 0; (unsigned)j < all[i].num_wds; j++)
+		if (all[i].wd[j]->documents() == 1)
+		  esc.docCount++;
+	      if (!esc.docCount)
+		esc.docCount++;
+	      mem_reqd += Write_data (f, &keep[i], lookback);
+	    }
+	  switch (novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      Write_charfreqs (f, &all[i], i, 0);
+	      Write_wordlens (f, &all[i], 0);
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    default:
+	      FatalError (1, "Bad novel method");
+	    }
+	}
+	break;
+      }
+  fclose (f);
+  return mem_reqd;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_decompress_text.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_decompress_text.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_decompress_text.cpp	(revision 21083)
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * mgpp_decompress_text.cpp -- 
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "UCArray.h"
+#include "sysfuncs.h"
+#include "TextGet.h"
+#include "messages.h"
+#include "mg_files.h"
+
+int main (int argc, char **argv) {
+  int ch;
+  char *filename = "";
+  char *basePath = "";
+  UCArray level;
+  SetCStr (level, "Document");
+
+  opterr = 0;
+  msg_prefix = argv[0];
+
+  // process the command line arguments
+  while ((ch = getopt (argc, argv, "f:d:K:h")) != -1) {
+    switch (ch) {
+    case 'f':		/* input file */
+      filename = optarg;
+      break;
+    case 'd':
+      basePath = optarg;
+      set_basepath (optarg);
+      break;
+    case 'K':
+      SetCStr (level, optarg);
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-h] [-K level] [-d directory] -f name\n",
+	       argv[0]);
+      exit (1);
+    }
+  }
+
+  // load up the text information
+  TextData td;
+  if (!td.LoadData (basePath, filename)) {
+    FatalError (1, "Couldn't load text information for \"%s\"", filename);
+  }
+  
+  // output each document in the level
+//    cout << td.levels << "\n";
+  
+  TextLevelInfo levelInfo = td.levels.levelInfo[level];
+  unsigned long docNum = 1;
+  UCArray docText;
+  while (docNum <= levelInfo.numEntries) {
+//      TextIdx docIdx;
+//      if (GetDocIdx (td, level, docNum, docIdx)) {
+//        cout << "doc: " << docNum << "\n";
+//        cout << docIdx;
+//      }
+    
+    if (!GetDocText (td, level, docNum, docText)) {
+      FatalError (1, "Error while trying to get document %u", docNum);
+    }
+
+    cout << docText << "\n";
+    
+    docNum++;
+  }
+  
+  return 0;
+}
+
+
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.1	(revision 21083)
@@ -0,0 +1,69 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_fast_comp_dict 1 \*(Dt CITRI
+.SH NAME
+mgpp_fast_comp_dict \- build a fast loading compression dictionary
+.SH SYNOPSIS
+.B mgpp_fast_comp_dict
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_fast_comp_dict
+builds a fast-loading compression dictionary from the standard
+compression dictionary.  The new dictionary has the property that
+.BR mgppquery (1)
+can load it in very quickly, making the startup time for
+.BR mgppquery (1)
+much shorter.  The new dictionary is larger on disk than the original,
+but they are no different when it comes to memory usage.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.text.dict
+Compression dictionary.
+.TP
+.B *.text.dict.fast
+Fast loading compression dictionary.
+.TP
+.B *.text.dict.aux
+Auxiliary compression dictionary.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_stem_idx (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_fast_comp_dict.cpp	(revision 21083)
@@ -0,0 +1,707 @@
+/**************************************************************************
+ *
+ * mgpp_fast_comp_dict.cpp -- Program to generate a fast compression dictionary
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "huffman.h"
+#include "messages.h"
+#include "memlib.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "local_strings.h"
+#include "mg.h"
+#include "text.h"
+#include "invf.h"
+#include "mg_files.h"
+#include "locallib.h"
+#include "words.h"
+
+
+
+#define ALIGN_SIZE(p,t) (((p) + (sizeof(t)-1)) & (~(sizeof(t)-1)))
+
+#define WORDNO(p, base) ((((char*)(p))-((char*)(base)))/sizeof(u_char*))
+#define FIXUP(p) (fixup[WORDNO(p,buffer)/8] |= (1<<(WORDNO(p, buffer) & 7)))
+
+#define IS_FIXUP(p) ((fixup[WORDNO(p,buffer)/8] & (1<<(WORDNO(p, buffer) & 7))) != 0)
+
+#define FIXUP_VALS(vals) do {						\
+	int i;								\
+	for (i=0; i < MAX_HUFFCODE_LEN+1; i++)				\
+	  FIXUP(&vals[i]);						\
+      } while(0)
+
+
+
+static u_long mem_for_comp_dict (char *filename);
+static void load_comp_dict (char *filename);
+static void save_fast_dict (char *filename);
+static void unfixup_buffer (void);
+
+
+static void *buffer;
+static void *cur;
+static u_char *fixup;
+static u_long mem, fixup_mem;
+
+int main (int argc, char **argv)
+{
+  int ch;
+  char *filename = "";
+  opterr = 0;
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "f:d:h")) != -1)
+    switch (ch)
+      {
+      case 'f':		/* input file */
+	filename = optarg;
+	break;
+      case 'd':
+	set_basepath (optarg);
+	break;
+      case 'h':
+      case '?':
+	fprintf (stderr, "usage: %s [-f input_file] [-d data directory] [-h]\n",
+		 argv[0]);
+	exit (1);
+      }
+
+  mem = mem_for_comp_dict (filename);
+
+  fixup_mem = (ALIGN_SIZE (mem, u_char *) / sizeof (u_char *) + 7) / 8;
+
+  cur = buffer = Xmalloc (mem);
+  memset (buffer, 0, mem);
+  fixup = (u_char *) Xmalloc (fixup_mem);
+  memset (fixup, 0, fixup_mem);
+
+#ifndef SILENT
+  Message ("Estimated memory for fast_dict %u", mem);
+  Message ("Estimated memory for fixups %u", fixup_mem);
+#endif
+
+  load_comp_dict (filename);
+
+#ifndef SILENT
+  Message ("Actual memory for fast_dict %u", (char *) cur - (char *) buffer);
+#endif
+
+  if ((u_long) cur > (u_long) buffer + mem)
+    FatalError (1, "The buffer was not big enough for the dictionary");
+
+  {
+    /* [RPAP - Jan 97: Endian Ordering] */
+    compression_dict *cd = (compression_dict *) buffer;
+    int i, which;
+
+    /* cfh */
+    for (which = 0; which <= 1; which++)
+      {
+	int j;
+	
+	HTONSI(cd->cfh[which]->hd.num_codes);
+	HTONSI(cd->cfh[which]->hd.mincodelen);
+	HTONSI(cd->cfh[which]->hd.maxcodelen);
+	for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	  {
+	    HTONSI(cd->cfh[which]->hd.lencount[j]);
+	    HTONUL(cd->cfh[which]->hd.min_code[j]);
+	  }
+	HTONUL(cd->cfh[which]->uncompressed_size);
+	for (j = 0; j < MAX_HUFFCODE_LEN + 1; j++)
+	  HTONUL(cd->cfh[which]->huff_words_size[j]);
+      }
+    HTONUL(cd->MemForCompDict);
+    /* ad */
+    if (cd->cdh.novel_method == MG_NOVEL_DELTA ||
+	cd->cdh.novel_method == MG_NOVEL_HYBRID)
+      for (which = 0; which <= 1; which++)
+	{
+	  int j;
+	  
+	  HTONUL(cd->ad->afh[which].num_frags);
+	  HTONUL(cd->ad->afh[which].mem_for_frags);
+	  for (j = 0; j < 33; j++)
+	    {
+	      HTONSI(cd->ad->blk_start[which][j]);
+	      HTONSI(cd->ad->blk_end[which][j]);
+	    }
+	}
+    /* cdh */
+    HTONUL(cd->cdh.dict_type);
+    HTONUL(cd->cdh.novel_method);
+    for (i = 0; i < TEXT_PARAMS; i++)
+      HTONUL(cd->cdh.params[which]);
+    HTONUL(cd->cdh.num_words[0]);
+    HTONUL(cd->cdh.num_words[1]);
+    HTONUL(cd->cdh.num_word_chars[0]);
+    HTONUL(cd->cdh.num_word_chars[1]);
+    HTONUL(cd->cdh.lookback);
+    HTONSI(cd->fast_loaded);
+  }
+
+  unfixup_buffer ();
+
+  save_fast_dict (filename);
+
+  return (0);
+}
+
+
+
+static void 
+unfixup_buffer ()
+{
+  u_long *p;
+  for (p = (u_long *) buffer; (u_long) p < (u_long) cur; p++)
+    {
+      if (IS_FIXUP (p))
+	*p = *p - (u_long) buffer;
+    }
+}
+
+
+
+
+static u_long 
+mem_for_aux_dict (compression_dict_header * /*cdh*/, char *filename)
+{
+  int i;
+  u_long mem = sizeof (auxiliary_dict);
+  FILE *aux;
+
+  aux = open_file (filename, TEXT_DICT_AUX_SUFFIX, "rb",
+		   MAGIC_AUX_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  for (i = 0; i <= 1; i++)
+    {
+      aux_frags_header afh;
+      fread (&afh, sizeof (afh), 1, aux);
+      NTOHUL(afh.num_frags);  /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(afh.mem_for_frags);  /* [RPAP - Jan 97: Endian Ordering] */
+      mem += afh.num_frags * sizeof (u_char *);
+      mem = ALIGN_SIZE (mem + afh.mem_for_frags, u_char *);
+      fseek (aux, afh.mem_for_frags, SEEK_CUR);
+    }
+  fclose (aux);
+
+  return mem;
+}
+
+
+
+static u_long 
+mem_for_words (FILE * dict, compression_dict_header * cdh,
+	       comp_frags_header * cfh)
+{
+  u_long mem = 0;
+  long i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+
+  lookback = cdh->lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++)
+    {
+      ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+      mem_reqd += cfh->huff_words_size[i];
+    }
+
+  mem += ptrs_reqd * sizeof (u_char *);
+  mem += (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **);
+  mem += mem_reqd;
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val;
+      for (val = getc (dict) & 0xf; val; val--)
+	getc (dict);
+    }
+  return ALIGN_SIZE (mem, u_char *);
+}
+
+static u_long mem_skip_hd(FILE *dict, u_long mem)
+{ huff_data hd;
+
+  mem += sizeof (hd);
+  Read_Huffman_Data (dict, &hd, NULL, NULL);
+  if (hd.clens)
+    delete hd.clens;
+  mem += hd.num_codes * sizeof (unsigned long);
+  mem += (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+  return mem;
+}
+
+static u_long mem_read_cfh(FILE *dict, compression_dict_header *cdh, comp_frags_header *cfh, 
+			   u_long mem)
+{
+  mem += sizeof (comp_frags_header);
+  Read_cfh (dict, cfh, NULL, NULL);
+
+  /* Don't need to count the space for the clens of the huffman data */
+
+  mem += mem_for_words (dict, cdh, cfh);
+  if (cfh->hd.clens)
+    delete cfh->hd.clens;
+
+  return mem;
+}
+
+
+static u_long 
+mem_for_comp_dict (char *filename)
+{
+  u_long mem = sizeof (compression_dict);
+  compression_dict_header cdh;
+  comp_frags_header cfh;
+  FILE *dict;
+  int which;
+  int i;  /* [RPAP - Jan 97: Endian Ordering] */
+
+  dict = open_file (filename, TEXT_DICT_SUFFIX, "rb",
+		    MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  fread (&cdh, sizeof (cdh), 1, dict);
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(cdh.dict_type);
+  NTOHUL(cdh.novel_method);
+  for (i = 0; i < TEXT_PARAMS; i++)
+    NTOHUL(cdh.params[i]);
+  NTOHUL(cdh.num_words[0]);
+  NTOHUL(cdh.num_words[1]);
+  NTOHUL(cdh.num_word_chars[0]);
+  NTOHUL(cdh.num_word_chars[1]);
+  NTOHUL(cdh.lookback);
+
+  for (which = 0; which < 2; which++)
+    switch (cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  mem = mem_read_cfh(dict, &cdh, &cfh, mem);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  // huff_data hd;
+	  if (cdh.num_words[which])
+	    {
+	      mem = mem_read_cfh(dict, &cdh, &cfh, mem);
+	    }
+
+	  mem = mem_skip_hd(dict, mem);
+	  mem = mem_skip_hd(dict, mem);
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  // huff_data hd;
+	  if (cdh.num_words[which])
+	    {
+	      mem = mem_read_cfh(dict, &cdh, &cfh, mem);
+	    }
+	  switch (cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      mem = mem_skip_hd(dict, mem);
+	      mem = mem_skip_hd(dict, mem);
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    }
+	  break;
+	}
+      }
+  fclose (dict);
+
+  if (cdh.novel_method == MG_NOVEL_DELTA ||
+      cdh.novel_method == MG_NOVEL_HYBRID)
+    mem += mem_for_aux_dict (&cdh, filename);
+
+  return ALIGN_SIZE (mem, u_char *);
+}
+
+
+
+void *
+getmem (u_long size, int align)
+{
+  void *res;
+  cur = (void *) (((u_long) cur + (align - 1)) & (~(align - 1)));
+  res = cur;
+  cur = (char *) cur + size;
+  if ((u_long) cur > (u_long)buffer + mem)
+    FatalError (1, "The buffer was not big enough for the dictionary");
+  return res;
+}
+
+
+
+
+
+
+
+
+
+
+
+static auxiliary_dict *
+LoadAuxDict (compression_dict_header * cdh,
+	     char *filename)
+{
+  auxiliary_dict *ad;
+  int i;
+  FILE *aux;
+
+  aux = open_file (filename, TEXT_DICT_AUX_SUFFIX, "rb",
+		   MAGIC_AUX_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  ad = (auxiliary_dict *) getmem (sizeof (auxiliary_dict), sizeof (u_char *));
+
+  for (i = 0; i <= 1; i++)
+    {
+      unsigned int j;
+      u_char *pos;
+
+      fread (&ad->afh[i], sizeof (aux_frags_header), 1, aux);
+
+      /* [RPAP - Jan 97: Endian Ordering] */
+      NTOHUL(ad->afh[i].num_frags);
+      NTOHUL(ad->afh[i].mem_for_frags);
+
+      ad->word_data[i] = (u_char *) getmem (ad->afh[i].mem_for_frags, 1);
+      FIXUP (&ad->word_data[i]);
+
+      ad->words[i] = (u_char **) getmem (ad->afh[i].num_frags * sizeof (u_char *),
+			     sizeof (u_char *));
+      FIXUP (&ad->words[i]);
+
+      fread (ad->word_data[i], ad->afh[i].mem_for_frags, sizeof (u_char), aux);
+
+      pos = ad->word_data[i];
+      for (j = 0; j < ad->afh[i].num_frags; j++)
+	{
+	  ad->words[i][j] = pos;
+	  FIXUP (&ad->words[i][j]);
+	  pos += *pos + 1;
+	}
+      if (cdh->novel_method == MG_NOVEL_HYBRID)
+	{
+	  int num;
+	  num = 1;
+	  ad->blk_start[i][0] = 0;
+	  ad->blk_end[i][0] = cdh->num_words[i] - 1;
+	  while (num < 33)
+	    {
+	      ad->blk_start[i][num] = ad->blk_end[i][num - 1] + 1;
+	      ad->blk_end[i][num] = ad->blk_start[i][num] +
+		(ad->blk_end[i][num - 1] - ad->blk_start[i][num - 1]) * 2;
+	      num++;
+	    }
+	}
+    }
+  fclose (aux);
+  return (ad);
+}
+
+
+
+
+
+static u_char ***
+ReadInWords (FILE * dict, compression_dict * cd,
+	     comp_frags_header * cfh, u_char ** escape)
+{
+  int i, lookback;
+  int ptrs_reqd = 0;
+  int mem_reqd = 0;
+  int num_set[MAX_HUFFCODE_LEN + 1];
+  u_char *next_word[MAX_HUFFCODE_LEN + 1];
+  u_char **vals;
+  u_char ***values;
+  u_char word[MAXWORDLEN + 1];
+  u_char last_word[MAX_HUFFCODE_LEN + 1][MAXWORDLEN + 1];
+
+  lookback = cd->cdh.lookback;
+
+  for (i = cfh->hd.mincodelen; i <= cfh->hd.maxcodelen; i++)
+    {
+      ptrs_reqd += (cfh->hd.lencount[i] + ((1 << lookback) - 1)) >> lookback;
+      mem_reqd += cfh->huff_words_size[i];
+    }
+
+  vals = (u_char **) getmem (ptrs_reqd * sizeof (*vals), sizeof (u_char *));
+
+  values = (u_char ***) getmem ((MAX_HUFFCODE_LEN + 1) * sizeof (u_char **), sizeof (u_char **));
+
+  next_word[0] = (u_char *) getmem (mem_reqd, sizeof (char));
+
+  cd->MemForCompDict += ptrs_reqd * sizeof (*vals) +
+    (MAX_HUFFCODE_LEN + 1) * sizeof (u_char **) +
+    mem_reqd;
+
+  values[0] = vals;
+  FIXUP (&values[0]);
+  values[0][0] = next_word[0];
+  FIXUP (&values[0][0]);
+  for (i = 1; i <= cfh->hd.maxcodelen; i++)
+    {
+      int next_start = (values[i - 1] - vals) +
+      ((cfh->hd.lencount[i - 1] + ((1 << lookback) - 1)) >> lookback);
+      values[i] = &vals[next_start];
+      FIXUP (&values[i]);
+      next_word[i] = next_word[i - 1] + cfh->huff_words_size[i - 1];
+      values[i][0] = next_word[i];
+      FIXUP (&values[i][0]);
+    }
+
+  memset (num_set, '\0', sizeof (num_set));
+
+  for (i = 0; i < cfh->hd.num_codes; i++)
+    {
+      register int val, copy;
+      register int len = cfh->hd.clens[i];
+      val = getc (dict);
+      copy = (val >> 4) & 0xf;
+      val &= 0xf;
+
+      fread (word + copy + 1, sizeof (u_char), val, dict);
+      *word = val + copy;
+
+      if ((num_set[len] & ((1 << lookback) - 1)) == 0)
+	{
+	  values[len][num_set[len] >> lookback] = next_word[len];
+	  FIXUP (&values[len][num_set[len] >> lookback]);
+	  memcpy (next_word[len], word, *word + 1);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    {
+	      *escape = next_word[len];
+	      FIXUP (escape);
+	    }
+	  next_word[len] += *word + 1;
+	}
+      else
+	{
+	  copy = prefixlen (last_word[len], word);
+	  memcpy (next_word[len] + 1, word + copy + 1, *word - copy);
+	  *next_word[len] = (copy << 4) + (*word - copy);
+	  if (escape && i == cfh->hd.num_codes - 1)
+	    {
+	      *escape = next_word[len];
+	      FIXUP (escape);
+	    }
+	  next_word[len] += (*word - copy) + 1;
+	}
+      memcpy (last_word[len], word, *word + 1);
+      num_set[len]++;
+    }
+  if (cfh->hd.clens)
+    delete cfh->hd.clens;
+  cfh->hd.clens = NULL;
+  return values;
+}
+
+
+static unsigned long **
+Generate_Fast_Huffman_Vals (huff_data * data, u_long * mem)
+{
+  int i;
+  unsigned long *fcode[MAX_HUFFCODE_LEN + 1];
+  unsigned long **values;
+  unsigned long *vals;
+
+  if (!data)
+    return (NULL);
+  vals = (unsigned long *) getmem (data->num_codes * sizeof (*vals), sizeof (long *));
+  values = (unsigned long **) getmem ((MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *),
+		   sizeof (long *));
+
+  memset (values, '\0', (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *));
+
+  if (mem)
+    *mem += data->num_codes * sizeof (*vals) +
+      (MAX_HUFFCODE_LEN + 1) * sizeof (unsigned long *);
+
+  fcode[0] = values[0] = &vals[0];
+  FIXUP (&values[0]);
+  for (i = 1; i <= data->maxcodelen; i++)
+    {
+      fcode[i] = values[i] = &vals[(values[i - 1] - vals) + data->lencount[i - 1]];
+      FIXUP (&values[i]);
+    }
+
+  for (i = 0; i < data->num_codes; i++)
+    if (data->clens[i])
+      *fcode[(int) (data->clens[i])]++ = i;
+  return (values);
+}
+
+
+static void load_read_huffman(FILE *dict, compression_dict *cd, int which)
+{
+  huff_data *hd;
+  u_long   **vals;
+
+  hd = (huff_data *) getmem (sizeof (huff_data), sizeof (char *));
+  cd->MemForCompDict += sizeof (huff_data);
+  Read_Huffman_Data (dict, hd, &cd->MemForCompDict, NULL);
+  vals = Generate_Fast_Huffman_Vals (hd, &cd->MemForCompDict);
+  cd->chars_huff[which] = hd;
+  FIXUP (&cd->chars_huff[which]);
+  cd->chars_vals[which] = vals;
+  FIXUP (&cd->chars_vals[which]);
+  if (hd->clens)
+    delete hd->clens;
+  hd->clens = NULL;
+}
+
+static void load_read_words(FILE *dict, compression_dict *cd, int which, int fixescape)
+{
+  cd->cfh[which] = (comp_frags_header *) getmem (sizeof (*cd->cfh[which]), sizeof (u_char *));
+  cd->MemForCompDict += sizeof (*cd->cfh[which]);
+  Read_cfh (dict, cd->cfh[which], &cd->MemForCompDict, NULL);
+
+  cd->values[which] = ReadInWords (dict, cd, cd->cfh[which], NULL);
+  FIXUP (&cd->cfh[which]);
+  FIXUP (&cd->values[which]);
+  if (fixescape)
+    { FIXUP(&cd->escape[which]);
+    }
+  else
+    {
+      cd->escape[which] = NULL;
+    }
+}
+
+static void 
+load_comp_dict (char *filename)
+{
+  FILE *dict;
+  int which;
+  compression_dict *cd;
+
+  cd = (compression_dict *) getmem (sizeof (compression_dict), sizeof (u_char *));
+  cd->fast_loaded = 1;
+
+  dict = open_file (filename, TEXT_DICT_SUFFIX, "rb",
+		    MAGIC_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  Read_cdh (dict, &cd->cdh, NULL, NULL);
+
+  for (which = 0; which < 2; which++)
+    switch (cd->cdh.dict_type)
+      {
+      case MG_COMPLETE_DICTIONARY:
+	{
+	  load_read_words(dict, cd, which, 0);
+	}
+	break;
+      case MG_PARTIAL_DICTIONARY:
+	{
+	  if (cd->cdh.num_words[which])
+	    {
+	      load_read_words(dict, cd, which, 1);
+	    }
+
+	  load_read_huffman(dict, cd, which);
+	  load_read_huffman(dict, cd, which);
+	}
+	break;
+      case MG_SEED_DICTIONARY:
+	{
+	  if (cd->cdh.num_words[which])
+	    {
+	      load_read_words(dict, cd, which, 1);
+	    }
+	  switch (cd->cdh.novel_method)
+	    {
+	    case MG_NOVEL_HUFFMAN_CHARS:
+	      load_read_huffman(dict, cd, which);
+	      load_read_huffman(dict, cd, which);
+	      break;
+	    case MG_NOVEL_DELTA:
+	      break;
+	    case MG_NOVEL_HYBRID:
+	      break;
+	    }
+	  break;
+	}
+      }
+  fclose (dict);
+
+
+  if (cd->cdh.novel_method == MG_NOVEL_DELTA ||
+      cd->cdh.novel_method == MG_NOVEL_HYBRID)
+    {
+      cd->ad = LoadAuxDict (&cd->cdh, filename);
+      FIXUP (&cd->ad);
+    }
+}
+
+static void 
+save_fast_dict (char *filename)
+{
+  FILE *fdict;
+
+  fdict = create_file (filename, TEXT_DICT_FAST_SUFFIX, "wb",
+		       MAGIC_FAST_DICT, MG_ABORT);  /* [RPAP - Feb 97: WIN32 Port] */
+
+  {
+    u_long *p;
+    for (p = (u_long *) buffer; (u_long) p < (u_long) cur; p++)
+      {
+	if (IS_FIXUP (p))
+	  HTONUL(*p);
+      }
+  }
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(mem);
+  HTONUL(fixup_mem);
+
+  fwrite (&mem, sizeof (mem), 1, fdict);
+  fwrite (&fixup_mem, sizeof (fixup_mem), 1, fdict);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(mem);
+  NTOHUL(fixup_mem);
+
+  fwrite (buffer, sizeof (u_char), mem, fdict);
+  fwrite (fixup, sizeof (u_char), fixup_mem, fdict);
+
+  fclose (fdict);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.1	(revision 21083)
@@ -0,0 +1,79 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_invf_dict 1 \*(Dt CITRI
+.SH NAME
+mgpp_invf_dict \- build an `on-disk' stemmed dictionary
+.SH SYNOPSIS
+.B mgpp_invf_dict
+[
+.B \-h
+]
+[
+.BI \-b " entries-per-block"
+]
+.if n .ti +13n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_invf_dict
+builds an `on-disk' stemmed dictionary from the
+compressed stemmed dictionary that can be used during querying.
+Each entry in the dictionary contains the disk
+pointer to the associated inverted file entry, and various other pieces
+of information about the stemmed word. The dictionary is blocked with
+each block containing the same number of entries (not the same size).
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectoryyyyyyyy\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " entries-per-block"
+The dictionary is stored in blocks on disk; this option is used to 
+specify the number of entries per block. The default is 16.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+The `on-disk' stemmed dictionary.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_stem_idx (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict.cpp	(revision 21083)
@@ -0,0 +1,237 @@
+/**************************************************************************
+ *
+ * mgpp_invf_dict.cpp -- Program to build the blocked stemmed dictionary
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "messages.h"
+#include "mg_files.h"
+#include "invf.h"
+
+static void process_files (char *filename, unsigned long entriesPerBlock) {
+  // open the dictionary
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+  invf_dict_header idh;
+  idh.Read (dictFile);
+
+  // open the inverted index file
+  FILE *invfIdxFile = open_file (filename, INVF_IDX_SUFFIX, "rb",
+				 MAGIC_INVI, MG_ABORT);
+
+  // create the blocked dictionary
+  FILE *blockDictFile = create_file (filename, INVF_DICT_BLOCKED_SUFFIX, "wb",
+				     MAGIC_STEM, MG_ABORT);
+  block_dict_header bdh;
+  bdh.lookback = idh.lookback;
+  bdh.word_dict_start = idh.word_dict_start;
+  bdh.word_dict_size = idh.word_dict_size;
+  bdh.tag_dict_start = idh.tag_dict_start;
+  bdh.tag_dict_size = idh.tag_dict_size;
+  bdh.num_docs = idh.num_docs;
+  bdh.num_frags = idh.num_frags;
+  bdh.num_words = idh.num_words;
+  bdh.total_bytes = idh.total_bytes;
+  bdh.index_string_bytes = idh.index_string_bytes;
+  bdh.num_levels = idh.num_levels;
+  bdh.Write (blockDictFile);
+
+  
+  // write out the word part of the dictionary
+
+  bdh.entries_per_wblk = entriesPerBlock;
+  bdh.max_wblk_size = 0;
+  bdh.wblk_start = ftell (blockDictFile);
+  
+  fseek (dictFile, idh.word_dict_start, SEEK_SET);
+
+  block_idx wordIdx;
+  word_block_dict_el wordBlockEl;
+  wordBlockEl.SetNumLevels (idh.num_levels);
+  
+  
+  unsigned long wordNum;
+  unsigned long wordInvfPtr;
+  UCArray lastEl;
+  word_dict_el wordEl;
+  wordEl.SetNumLevels (idh.num_levels);
+  for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+    // read in the next word and inverted file pointer
+    wordEl.Read (dictFile, idh.num_levels);
+    ReadUL (invfIdxFile, wordInvfPtr);
+
+    // remember this word (and position) if this is the start
+    // of a new block
+    if (wordNum % entriesPerBlock == 0) {
+      block_idx_info elIdx;
+      elIdx.el = wordEl.el;
+      elIdx.block_ptr = ftell (blockDictFile);
+
+      // see if this block is the longest so far
+      if (wordIdx.size() > 0) {
+	unsigned long blockLen = elIdx.block_ptr -
+	  (*(wordIdx.end()-1)).block_ptr;
+	if (blockLen > bdh.max_wblk_size) bdh.max_wblk_size = blockLen;
+      }
+      
+      wordIdx.push_back (elIdx);
+      lastEl.erase (lastEl.begin(), lastEl.end()); // output full word
+    }
+
+    // copy the information for this word
+    wordBlockEl.el = wordEl.el;
+    wordBlockEl.frag_occur = wordEl.frag_occur;
+    wordBlockEl.freq = wordEl.freq;
+    wordBlockEl.invf_ptr = wordInvfPtr;
+    unsigned long tempI;
+    for (tempI=0; tempI<idh.num_levels; tempI++)
+      wordBlockEl.levelFreqs[tempI] = wordEl.levelFreqs[tempI];
+
+    // write out the word
+    wordBlockEl.Write (blockDictFile, &lastEl, idh.num_levels);
+
+    lastEl = wordBlockEl.el;
+  }
+
+
+  // write out the tag part of the dictionary
+
+  bdh.entries_per_tblk = entriesPerBlock;
+  bdh.max_tblk_size = 0;
+  bdh.tblk_start = ftell (blockDictFile);
+  
+  fseek (dictFile, idh.tag_dict_start, SEEK_SET);
+
+  block_idx tagIdx;
+  block_dict_el tagBlockEl;
+  
+  unsigned long tagNum;
+  unsigned long tagInvfPtr;
+  dict_el tagEl;
+  lastEl.erase (lastEl.begin(), lastEl.end());
+  for (tagNum=0; tagNum<idh.tag_dict_size; tagNum++) {
+    // read in the next tag and inverted file pointer
+    tagEl.Read (dictFile);
+    ReadUL (invfIdxFile, tagInvfPtr);
+
+    // remember this tag (and position) if this is the start
+    // of a new block
+    if (tagNum % entriesPerBlock == 0) {
+      block_idx_info elIdx;
+      elIdx.el = tagEl.el;
+      elIdx.block_ptr = ftell (blockDictFile);
+
+      // see if this block is the longest so far
+      if (tagIdx.size() > 0) {
+	unsigned long blockLen = elIdx.block_ptr -
+	  (*(tagIdx.end()-1)).block_ptr;
+	if (blockLen > bdh.max_tblk_size) bdh.max_tblk_size = blockLen;
+      }
+      
+      tagIdx.push_back (elIdx);
+      lastEl.erase (lastEl.begin(), lastEl.end()); // output full word
+    }
+
+    // copy the information for this tag
+    tagBlockEl.el = tagEl.el;
+    tagBlockEl.frag_occur = tagEl.frag_occur;
+    tagBlockEl.freq = tagEl.freq;
+    tagBlockEl.invf_ptr = tagInvfPtr;
+
+    // write out the tag
+    tagBlockEl.Write (blockDictFile, &lastEl);
+
+    lastEl = tagBlockEl.el;
+  }
+
+
+  // write out the element indexes
+  bdh.num_wblks = wordIdx.size();
+  bdh.wblk_idx_start = ftell (blockDictFile);
+  WriteBlockIdx (blockDictFile, wordIdx);
+  
+  bdh.num_tblks = tagIdx.size();
+  bdh.tblk_idx_start = ftell (blockDictFile);
+  WriteBlockIdx (blockDictFile, tagIdx);
+
+  // write out the blocked dictionary header
+  fseek (blockDictFile, sizeof(unsigned long), SEEK_SET);
+  bdh.Write (blockDictFile);
+
+
+  // close open files
+  fclose (blockDictFile);
+  fclose (invfIdxFile);
+  fclose (dictFile);
+  
+  // print out information
+#ifndef SILENT
+  Message ("Max word block size = %d\n", bdh.max_wblk_size);
+  Message ("Max tag block size = %d\n", bdh.max_tblk_size);
+  Message ("Number of word blocks written = %d\n", bdh.num_wblks);
+  Message ("Number of tag blocks written = %d\n", bdh.num_tblks);
+#endif
+}
+
+
+int main (int argc, char **argv) {
+  unsigned long entriesPerBlock = 16;
+  char *filename = "";
+  int ch;
+  msg_prefix = argv[0];
+  opterr = 0;
+
+  while ((ch = getopt (argc, argv, "f:d:b:h")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'b':
+      entriesPerBlock = atoi (optarg);
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-f input_file] "
+	       "[-d data directory] [-b entries-per-block] "
+	       "[-h]\n", argv[0]);
+      exit (1);
+    }
+  }
+
+  process_files (filename, entriesPerBlock);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict_dump.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict_dump.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dict_dump.cpp	(revision 21083)
@@ -0,0 +1,141 @@
+/**************************************************************************
+ *
+ * mgpp_invf_dict_dump.cpp -- Program to printthe various inverted dictionaries
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "messages.h"
+#include "mg_files.h"
+#include "invf.h"
+
+static void process_files (char *filename,
+			   bool printHeader,
+			   bool printWords,
+			   bool printTags) {
+  // open the dictionary
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+  invf_dict_header idh;
+  idh.Read (dictFile);
+
+  // print the information from the inverted dictionary file header
+  if (printHeader) {
+    cout << "lookback: " << idh.lookback << "\n";
+    cout << "word_dict_start: " << idh.word_dict_start << "\n";
+    cout << "word_dict_size: " << idh.word_dict_size << "\n";
+    cout << "tag_dict_start: " << idh.tag_dict_start << "\n";
+    cout << "tag_dict_size: " << idh.tag_dict_size << "\n";
+    cout << "num_docs: " << idh.num_docs << "\n";
+    cout << "num_frags: " << idh.num_frags << "\n";
+    cout << "num_words: " << idh.num_words << "\n";
+    cout << "total_bytes: " << idh.total_bytes << "\n";
+    cout << "index_string_bytes: " << idh.index_string_bytes << "\n";
+    cout << "num_levels: " << idh.num_levels << "\n";
+
+    cout << "\n";
+  }
+
+
+  if (printWords) {
+    fseek (dictFile, idh.word_dict_start, SEEK_SET);
+    
+    unsigned long wordNum;
+    word_dict_el wordEl;
+    wordEl.SetNumLevels (idh.num_levels);
+    for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+      wordEl.Read (dictFile, idh.num_levels);
+      cout << "\"" << wordEl.el << "\"\n";// (" << wordNum << ")\n";
+    }
+    
+    cout << "\n";
+  }
+
+  // write out the tag part of the dictionary
+  if (printTags) {
+    fseek (dictFile, idh.tag_dict_start, SEEK_SET);
+    
+    unsigned long tagNum;
+    dict_el tagEl;
+    for (tagNum=0; tagNum<idh.tag_dict_size; tagNum++) {
+      // read in the next tag and inverted file pointer
+      tagEl.Read (dictFile);
+      
+      cout << "\"" << tagEl.el << "\" (" << tagNum << ")\n";
+    }
+  }
+  
+  // close open files
+  fclose (dictFile);
+}
+
+
+int main (int argc, char **argv) {
+  char *filename = "";
+  int ch;
+  msg_prefix = argv[0];
+  opterr = 0;
+
+  bool printHeader = false;
+  bool printWords = false;
+  bool printTags = false;
+
+  while ((ch = getopt (argc, argv, "f:d:rwth")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'r':
+      printHeader = true;
+      break;
+    case 'w':
+      printWords = true;
+      break;
+    case 't':
+      printTags = true;
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-h] [-r] [-w] [-t] [-f input_file] "
+	       "[-d data directory]\n(-rwt:print header, words, tags)\n", 
+	       argv[0]);
+      exit (1);
+    }
+  }
+
+  process_files (filename, printHeader, printWords, printTags);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dump.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dump.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_invf_dump.cpp	(revision 21083)
@@ -0,0 +1,244 @@
+/**************************************************************************
+ *
+ * mgpp_invf_dump.cpp -- Program to dump uot an inverted fil
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "messages.h"
+#include "bitio_m_stdio.h"
+#include "bitio_gen.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+
+#include "mg_files.h"
+#include "locallib.h"
+#include "words.h"
+#include "invf.h"
+#include "WordData.h"
+
+static void PrintInvfWord (FILE *invfFile,
+			   invf_dict_header &idh,
+			   invf_file_header &ifh,
+			   word_dict_el &wordEl,
+			   unsigned long wordStart,
+			   bool printFrags) {
+  cout << wordEl.frag_occur << " \"" << wordEl.el << "\"\n";
+  
+  if (printFrags) {
+    // seek to the appropriate place in the inverted file
+    fseek (invfFile, wordStart, SEEK_SET);
+    
+    stdio_bitio_buffer buffer(invfFile);
+    
+    unsigned long B = BIO_Bblock_Init (idh.num_frags, wordEl.frag_occur);
+    unsigned long fragNum = 0;
+    unsigned long i;
+    for (i=0; i<wordEl.frag_occur; i++) {
+      unsigned long delta = buffer.bblock_decode (B, NULL);
+      fragNum += delta;
+      cout << " " << fragNum;
+      
+      if (!ifh.word_level_index ) {
+	unsigned long count = buffer.gamma_decode (NULL);
+	cout << "(" << count << ")";
+      } else {
+	cout << "(1)";
+      }
+    }
+    
+    cout << "\n";
+  
+    buffer.done();
+  }
+}
+
+static void PrintInvfTag (FILE *invfFile,
+			  invf_dict_header &idh,
+			  invf_file_header &/*ifh*/,
+			  dict_el &tagEl,
+			  unsigned long tagStart,
+			  bool printFrags) {
+  cout << tagEl.frag_occur << " \"<" << tagEl.el << ">\"\n";
+  
+  if (printFrags) {
+    // seek to the appropriate place in the inverted file
+    fseek (invfFile, tagStart, SEEK_SET);
+    
+    stdio_bitio_buffer buffer(invfFile);
+    
+    unsigned long pTag = tagEl.frag_occur*2;
+    unsigned long B = BIO_Bblock_Init (idh.num_frags+pTag, pTag);
+    unsigned long fragNum = 0;
+    unsigned long i;
+    for (i=0; i<tagEl.frag_occur; i++) {
+      unsigned long delta = buffer.bblock_decode (B, NULL)-1;
+      fragNum += delta;
+      cout << " " << fragNum;
+      cout << "-";
+      delta = buffer.bblock_decode (B, NULL)-1;
+      fragNum += delta;
+      cout << fragNum;
+    }
+    
+    cout << "\n";
+    
+    buffer.done();
+  }
+}
+
+static void PrintHeaderInfo (invf_dict_header &idh,
+			     invf_file_header &ifh) {
+  cerr << "Lookback:         " << idh.lookback << "\n";
+  cerr << "Word Dict Size:   " << idh.word_dict_size << "\n";
+  cerr << "Tag Dict Size:    " << idh.tag_dict_size << "\n";
+  cerr << "Num Documents:    " << idh.num_docs << "\n";
+  cerr << "Num Fragments:    " << idh.num_frags << "\n";
+  cerr << "Num Words:        " << idh.num_words << "\n";
+
+  cerr << "Skip Mode:        " << ifh.skip_mode << "\n";
+  cerr << "Word Level Index: " << ifh.word_level_index << "\n";
+
+  cerr << "\n";
+}
+
+
+static void process_files (char *filename,
+			   bool printHeader,
+			   bool printWords,
+			   bool printTags,
+			   bool printFrags) {
+  // open the dictionary
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			MAGIC_STEM_BUILD, MG_ABORT);
+  invf_dict_header idh;
+  idh.Read (dictFile);
+
+  // open the inverted file
+  FILE *invfFile = open_file (filename, INVF_SUFFIX, "rb",
+			MAGIC_INVF, MG_ABORT);
+  
+  invf_file_header ifh;
+  ifh.Read (invfFile);
+
+  if (ifh.skip_mode != SKIP_MODE_NO_SKIPS)
+    FatalError (1, "The invf file contains skips. Unable to dump.");
+
+  // print out header information
+  if (printHeader) {
+    PrintHeaderInfo (idh, ifh);
+  }
+
+  // open the inverted index
+  FILE *invfIdxFile = open_file (filename, INVF_IDX_SUFFIX, "rb",
+				 MAGIC_INVI, MG_ABORT);
+
+  // go to the start of the word dictionary
+  fseek (dictFile, idh.word_dict_start, SEEK_SET);
+
+  // process all the words
+  if (printWords) {
+    unsigned long wordNum;
+    unsigned long wordStart;
+    word_dict_el wordEl;
+    wordEl.SetNumLevels (idh.num_levels);
+    for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+      wordEl.Read (dictFile, idh.num_levels);
+      ReadUL (invfIdxFile, wordStart);
+      PrintInvfWord (invfFile, idh, ifh, wordEl, wordStart, printFrags);
+    }
+  }
+
+  // process all the tags
+  if (printTags) {
+    unsigned long tagNum;
+    unsigned long tagStart;
+    dict_el tagEl;
+    for (tagNum=0; tagNum<idh.tag_dict_size; tagNum++) {
+      tagEl.Read (dictFile);
+      ReadUL (invfIdxFile, tagStart);
+      PrintInvfTag (invfFile, idh, ifh, tagEl, tagStart, printFrags);
+    }
+  }
+  // close the open files
+  fclose (invfIdxFile);
+  fclose (invfFile);
+  fclose (dictFile);
+}
+
+
+int main (int argc, char **argv) {
+  char *dir_name, *filename = "";
+  int ch;
+  msg_prefix = argv[0];
+  dir_name = getenv ("MGDATA");
+  opterr = 0;
+
+  bool printHeader = false;
+  bool printWords = false;
+  bool printTags = false;
+  bool printFrags = false;
+  
+  msg_prefix = argv[0];
+  while ((ch = getopt (argc, argv, "hrwtnf:d:")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath(optarg);
+      break;
+    case 'r':
+      printHeader = true;
+      break;
+    case 'w':
+      printWords = true;
+      break;
+    case 'n':
+      printFrags = true;
+      break;
+    case 't':
+      printTags = true;
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-h] [-r] [-w] [-t] [-n] [-f input_file]"
+	       "[-d data directory]\n(-rwnt:print header, words, tags, fragnums)\n", 
+	       argv[0]);
+      exit (1);
+    }
+  }
+  
+  process_files (filename, printHeader, printWords, printTags, printFrags);
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.1	(revision 21083)
@@ -0,0 +1,323 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_passes 1 \*(Dt CITRI
+.SH NAME
+mgpp_passes \- builds mgpp databases
+.SH SYNOPSIS
+.B mgpp_passes
+[
+.BI \-J " doc-tag"
+]
+[
+.BI \-K " level-tag"
+]
+.if n .ti +10n
+[
+.BI \-L " index-level"
+]
+[
+.BI \-m " invf-mem-buffer"
+]
+.if n .ti +10n
+[
+.B \-T1
+]
+[
+.B \-T2
+]
+[
+.B \-I1
+]
+[
+.B \-I2
+]
+[
+.B \-S
+]
+[
+.B \-C
+]
+.if n .ti +10n
+[
+.B \-h
+]
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+[
+.I filename(s)
+]
+.SH DESCRIPTION
+.B mgpp_passes
+is the program that does most of the work when building mgpp
+database systems.  The input documents can come from either
+.I stdin
+or from a list of files on the command line.  In general,
+.B mgpp_passes
+must be run twice to build a database, first with the
+.B \-T1
+and
+.B \-I1
+options, and second with the
+.B \-T2
+and
+.B \-I2
+options.  Several other programs must be run in order to get an
+mgpp database.  The
+.SB EXAMPLE
+section below gives an example of how to build a complete
+mgpp database.
+.SH OPTIONS
+Options may appear in any order, but the
+.IR filename(s) ,
+if specified, must be last.
+.TP "\w'\fB\-C\fP \fIcompstatpointt\fP'u+2n"
+.BI \-J " doc-tag"
+Specifies the SGML tag that encloses each document.  Text appearing
+outside this tag is ignored.  The document tag defines the highest
+level document that can be queried and printed.  The default document
+tag is 'Document'.
+.TP
+.BI \-K " level-tag"
+Specifies the SGML tag of a sub document level.  A level tag must
+enclose all text enclosed by the document tag.  Levels can be
+queried and printed as if they were separate documents.  Multiple
+document levels can be specified (the document tag is always
+added as a document level).
+.TP
+.BI \-L " index-level"
+Specifies the SGML tag enclosing the smallest indexed element.  The
+index level should be no larger than the smallest document 
+level.  An empty string can be used to specify a word level index 
+(which is the default).
+.TP
+.BI \-m " invf-mem-buffer"
+Maximum amount of memory to use for the pass-2 file inversion in
+megabytes.  This option is only useful when used in conjunction with
+the option
+.BR \-I1 .
+The larger this value, the faster the pass-2 inversion will proceed.
+The default value is 5 MB.
+.TP
+.B \-T1
+Generate the
+.I *.text.stats
+file.
+.TP
+.B \-T2
+Generate the
+.IR *.text ,
+.IR *.text.idx ,
+.IR *.text.level ,
+and possibly the
+.I *.text.dict.aux
+files.  Using this option requires that the
+.I *.text.dict
+file be present.
+.TP
+.B \-I1
+Generate the
+.IR *.invf.dict ,
+.IR *.invf.level ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files.
+.TP
+.B \-I2
+Generate the
+.I *.invf
+and
+.I *.invf.idx
+files.  Using this option requires
+that the
+.IR *.invf.dict.hash ,
+.IR *.invf.level ,
+.IR *.invf.chunk ,
+and
+.I *.invf.chunk.trans
+files be present.  The
+.I *.invf.dict.hash
+file is generated by
+.BR mgpp_perf_hash_build (1)
+from the
+.I *.invf.dict
+file.
+.TP
+.B \-S
+This option causes a special pass to be executed.  It is up to a user
+to modify
+.I mg.special.c
+in the source code to do something with the documents it is given.
+.TP 
+.B \-C
+This activates the compatibility parsing mode.  When using this
+mode documents are separated by control-B and paragraphs are separated
+by control-C.  Internally these are converted to documents surrounded
+by 'Document' tags and paragraphs surrounded by 'Paragraph' tags.
+.TP
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is to be
+written.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection that will be
+created.
+.TP
+.I filename(s)
+This specifies the source text. If this is not specified, then the
+program expects the source text from
+.IR stdin .
+.SH EXAMPLE
+What follows is a UNIX
+.BR csh (1)
+script as an example of how to build an mgpp document collection.
+.LP
+.nf
+.DT
+.ft B
+.I #! /bin/csh
+.I
+# The first argument on the command line specifies the
+.I
+#   source of the text
+set source = ($1)
+.PP
+.I
+# The second argument is the name of the collection
+set text = ($2)
+.PP
+.I
+# Create *.text.stats, *.invf.dict, *.invf.level
+.I
+#   *.invf.chunk and *.invf.chunks.trans
+${source} | mgpp_passes -T1 -I1 -f ${text}
+.PP
+.I
+# Create *.text.dict
+mgpp_compression_dict -f ${text}
+.PP
+.I
+# Create *.invf.dict.hash
+mgpp_perf_hash_build -f ${text}
+.PP
+.I
+# Create *.text, *.text.idx, *.text.level
+.I
+#   *.invf and *.invf.idx
+${source} | mgpp_passes -T2 -I2 -f ${text}
+.PP
+.I
+# Create *.text.weight and *.weight.approx
+mgpp_weights_build -f ${text}
+.PP
+.I
+# Create *.invf.dict.blocked
+mgpp_invf_dict -f ${text}
+.PP
+.I
+# Create *.invf.dict.blocked.1
+mgpp_stem_idx -s 1 -f ${text}
+.PP
+.I
+# Create *.invf.dict.blocked.2
+mgpp_stem_idx -s 2 -f ${text}
+.PP
+.I
+# Create *.invf.dict.blocked.3
+mgpp_stem_idx -s 3 -f ${text}
+.PP
+.I
+# Create *.text.dict.fast
+mgpp_fast_comp_dict -f ${text}
+.ft R
+.fi
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 22
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.chunk
+Inverted file chunk descriptor file.  When the inverted file is
+created it is created in chunks that use no more than a set amount of
+memory.  This file describes those chunks.
+.TP
+.B *.invf.chunk.trans
+Word-occurrence-order to lexical-order translation file.  The
+.B *.invf.chunk
+file is written in word-occurrence order but is required by
+.B \-I2
+to be in lexical order.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked
+Compressed stemmed dictionary with index into the dictionary.
+.TP
+.B *.invf.dict.blocked.n
+Transformation dictionary from words stemmed with method 
+.B n
+to unstemmed words.
+.TP
+.B *.invf.dict.hash
+Data for an order-preserving perfect hash function.
+.TP
+.B *.invf.idx
+The index into the inverted file.
+.TP
+.B *.invf.level
+Information about the document levels needed for querying.
+.TP
+.B *.text
+Compressed text.
+.TP
+.B *.text.dict
+Compressed compression dictionary.
+.TP
+.B *.text.dict.fast
+A fast loading version of the compressed compression dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.text.level
+Information about the document levels needed for text decompression.
+.TP
+.B *.text.stats
+Statistics about the text.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.weight.approx
+The approximate weights file.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_stem_idx (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_passes.cpp	(revision 21083)
@@ -0,0 +1,264 @@
+/**************************************************************************
+ *
+ * mgpp_passes.cpp -- Driver for the various passes
+ * Copyright (C) 1994  Neil Sharman
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#include "sysfuncs.h"
+
+#ifdef HAVE_MALLINFO
+# include <malloc.h> 
+#endif
+
+#if defined __WIN32__
+# include <io.h>
+# include "getopt_old.h"
+# define close _close
+# define open _open
+#elif defined __CYGWIN__
+#include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "memlib.h"
+#include "messages.h"
+#include "longlong.h"
+#include "mg_files.h"
+#include "mg.h"
+#include "build.h"
+#include "text.h"
+#include "stemmer.h"
+#include "FileBuf.h"
+#include "TextEl.h"
+#include "TagInfo.h"
+
+#define MAX_PASSES 5
+
+#define SPECIAL 1
+#define TEXT_PASS_1 2
+#define TEXT_PASS_2 4
+#define IVF_PASS_1 8
+#define IVF_PASS_2 16
+
+#define MIN_BUF 8192
+
+
+unsigned long invf_buffer_size = 5 * 1024 * 1024;	/* 5Mb */
+
+static char Passes = 0;
+static char **files = NULL;
+static int num_files = 0;
+
+
+struct pass_data {
+  char *name;
+  int (*init) (const TagInfo &tagInfo, char *);
+  int (*process) (const TagInfo &tagInfo, const TextElArray &doc);
+  int (*done) (const TagInfo &tagInfo, char *);
+};
+
+
+static pass_data PassData[MAX_PASSES] = {
+  {"special", init_special, process_special, done_special},
+  {"text.pass1", init_text_1, process_text_1, done_text_1},
+  {"text.pass2", init_text_2, process_text_2, done_text_2},
+  {"ivf.pass1", init_ivf_1, process_ivf_1, done_ivf_1},
+  {"ivf.pass2", init_ivf_2, process_ivf_2, done_ivf_2},
+};
+
+static char *usage_str = "\nUSAGE:\n"
+"  %s [-J doc-tag] [-K level-tag] [-L index-level]\n"
+"  %*s [-m invf-memory] [-T1] [-T2] [-I1] [-I2] [-S]\n"
+"  %*s [-C] [-h] [-d directory] -f name\n\n";
+
+
+
+static void Usage (char *err) {
+  if (err) Message (err);
+  fprintf (stderr, usage_str, msg_prefix, strlen (msg_prefix), "",
+	   strlen (msg_prefix), "");
+  exit (1);
+}
+
+
+
+
+int OpenNextFile (int in_fd) {
+  if (in_fd > 0) close (in_fd);
+  if (num_files == 0) return (-1);
+  if ((in_fd = open (files[0], O_RDONLY)) == -1)
+    FatalError (1, "Cannot open %s", files[0]);
+  files++;
+  num_files--;
+  return (in_fd);
+}
+
+
+static void Driver (int in_fd, char *file_name,
+		    const TagInfo &tagInfo, bool compatMode) {
+  //  cout << tagInfo;
+
+  int pass;
+
+  unsigned long numBytes = 0;
+  unsigned long numDocs = 0;
+
+  // initialise all the passes
+  for (pass = 0; pass < MAX_PASSES; pass++) {
+    if (Passes & (1 << pass)) {
+      if (PassData[pass].init (tagInfo, file_name) == COMPERROR)
+	FatalError (1, "Error during init of \"%s\"", PassData[pass].name);
+    }
+  }
+
+  
+  // set up various variables
+  FileBuf buf;
+  TextElArray doc;
+  unsigned long docLen = 0;
+
+  // read and process each file (start with an open file)
+  do {
+    
+    // read and process each document in this file
+    buf.SetFD (in_fd);
+    while (ReadDoc (buf, tagInfo.docTag, doc, docLen, compatMode)) {
+
+      // give this document to each pass
+      for (pass = 0; pass < MAX_PASSES; pass++) {
+	if (Passes & (1 << pass)) {
+	  if (PassData[pass].process (tagInfo, doc) == COMPERROR)
+	    FatalError(1,"Error during processing of \"%s\"",PassData[pass].name);
+	}
+      }
+      
+      // another document has been processed
+      numBytes += docLen;
+      numDocs++;
+    }
+    
+  } while ((in_fd = OpenNextFile (in_fd)) > 0);
+
+  
+  // do done for each pass
+  for (pass = 0; pass < MAX_PASSES; pass++) {
+    if (Passes & (1 << pass)) {
+      if (PassData[pass].done (tagInfo, file_name) == COMPERROR)
+	FatalError (1, "Error during done of \"%s\"", PassData[pass].name);
+    }
+  }
+}
+
+int main (int argc, char **argv) {
+  int ch, in_fd;
+  char *filename = NULL;
+  bool compatMode = false;
+  TagInfo tagInfo;
+  tagInfo.SetDocTag ("Document");
+  
+  msg_prefix = argv[0];
+
+  opterr = 0;
+  while ((ch=getopt(argc, argv, "J:K:L:f:d:m:I:T:SCh"))!=-1){
+    switch (ch) {
+    case 'J':
+      tagInfo.SetDocTag (optarg);
+      break;
+    case 'K':
+      tagInfo.AddLevelTag (optarg);
+      break;
+    case 'L':
+      tagInfo.SetIndexLevel (optarg);
+      break;
+    case 'f':
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'm':
+      invf_buffer_size = (int) (atof (optarg) * 1024 * 1024);
+      break;
+    case 'I':
+      if (*optarg == '1')
+	Passes |= IVF_PASS_1;
+      else if (*optarg == '2')
+	Passes |= IVF_PASS_2;
+      else
+	Usage ("Invalid pass number");
+      break;
+    case 'T':
+      if (*optarg == '1')
+	Passes |= TEXT_PASS_1;
+      else if (*optarg == '2')
+	Passes |= TEXT_PASS_2;
+      else
+	Usage ("Invalid pass number");
+      break;
+    case 'S':
+      Passes |= SPECIAL;
+      break;
+    case 'C':
+      compatMode = true;
+      break;
+    case 'h':
+    case '?':
+      Usage (NULL);
+    }
+  }
+
+  if (!filename || *filename == '\0')
+    FatalError (1, "A document collection name must be specified.");
+
+  if ((Passes & (IVF_PASS_1 | IVF_PASS_2)) == (IVF_PASS_1 | IVF_PASS_2))
+    FatalError (1, "I1 and I2 cannot be done simultaneously.");
+
+  if ((Passes & (TEXT_PASS_1 | TEXT_PASS_2)) == (TEXT_PASS_1 | TEXT_PASS_2))
+    FatalError (1, "T1 and T2 cannot be done simultaneously.");
+
+  if (!Passes)
+    FatalError (1, "S, T1, T2, I1 or I2 must be specified.");
+
+  if (optind < argc) {
+    if ((in_fd = open (argv[optind], O_RDONLY)) == -1)
+      FatalError (1, "Cannot open %s", argv[optind]);
+    files = &argv[optind + 1];
+    num_files = argc - (optind + 1);
+    
+  } else in_fd = 0;  // stdin
+
+  
+  if (compatMode) tagInfo.SetDocTag ("Document");
+
+  // a document tag is also a level tag
+  tagInfo.levelTags.insert (tagInfo.docTag); 
+  
+  Driver (in_fd, filename, tagInfo, compatMode);
+
+  return (0);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.1	(revision 21083)
@@ -0,0 +1,72 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_perf_hash_build 1 \*(Dt CITRI
+.SH NAME
+mgpp_perf_hash_build \- generate an order-preserving hash function for the stemmed dictionary
+.SH SYNOPSIS
+.B mgpp_perf_hash_build
+[
+.B \-h
+]
+[
+.BI \-r " rndseed"
+]
+[
+.BI \-d  " directory"
+]
+.if n .ti +9n
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_perf_hash_build
+generates an order-preserving hashing function from the compressed
+stemmed dictionary and writes it out to disk.
+.BR mgpp_passes (1)
+will make use of the hash function when it builds the inverted file.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-r " rndseed"
+This specifies the random seed to be used in the generation of the
+hash function; it must be an integer.  If this is not specified, the
+current time will be used as the random seed.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mg
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf.dict
+Stemmed dictionary.
+.TP
+.B *.invf.dict.hash
+Data for a order-preserving perfect hash function.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_stem_idx (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_perf_hash_build.cpp	(revision 21083)
@@ -0,0 +1,146 @@
+/**************************************************************************
+ *
+ * mgpp_perf_hash_build.cpp -- Program to build a perfect hash function
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "perf_hash.h"
+#include "netorder.h"
+
+#include "mg_files.h"
+#include "invf.h"
+#include "locallib.h"
+#include "words.h"
+#include "mg.h"
+
+#define POOL_SIZE 1024*1024
+
+static void ProcessFiles (char *filename, int r) {
+  FILE *dictFile, *hashFile;
+  unsigned long i;
+  invf_dict_header idh;
+  perf_hash_data *phd;
+  u_char *pool;
+  unsigned long pool_left;
+  u_char **starts;
+
+  // read in the dictionary
+  dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			MAGIC_STEM_BUILD, MG_ABORT);
+  if (dictFile==NULL) {
+    FatalError(1, "unable to open file");
+  }
+  idh.Read (dictFile);
+
+  //cerr << idh.lookback<<" "<<idh.word_dict_start<<endl;
+  // go to the start of the word dictionary
+  fseek (dictFile, idh.word_dict_start, SEEK_SET);
+  
+  if (!(pool = (u_char *) Xmalloc (POOL_SIZE)))
+    FatalError (1, "Out of memory");
+  pool_left = POOL_SIZE;
+
+  if (!(starts = (u_char **) Xmalloc (sizeof (u_char *) * idh.word_dict_size)))
+    FatalError (1, "Out of memory");
+  //cerr << "size= "<< idh.word_dict_size<<endl;
+  word_dict_el wordEl;
+  wordEl.SetNumLevels (idh.num_levels);
+  for (i = 0; i < idh.word_dict_size; i++) {
+    // read the next word and associated information
+    wordEl.Read (dictFile, idh.num_levels);
+
+    // push string onto pool data
+    register unsigned long l;
+    l = wordEl.el.size() + 1;
+    if (pool_left < l) {
+      pool = (u_char *) Xmalloc (POOL_SIZE);
+      pool_left = POOL_SIZE;
+    }
+    starts[i] = pool;
+    
+    *pool++ = wordEl.el.size();
+    memcpy ((char *) pool, &(wordEl.el[0]), wordEl.el.size());
+    //cerr << pool<<"   " <<starts[i]<<endl;
+    pool += wordEl.el.size();
+    pool_left -= l;
+    
+  }
+  fclose (dictFile);
+  //cerr << pool<<"   " <<starts[i-1]<<endl;
+  //cerr<<"starts  "<<starts[113529]<<endl;
+  //cerr << starts[17][1] << " "<<starts[25][4]<<endl;
+  // create perfect hash file
+  hashFile = create_file (filename, INVF_DICT_HASH_SUFFIX, "wb",
+			  MAGIC_HASH, MG_ABORT);
+  if (!(phd = gen_hash_func (idh.word_dict_size, starts, r)))
+    FatalError (1, "Unable to generate hash function");
+  if (write_perf_hash_data (hashFile, phd) == -1)
+    FatalError (1, "Unable to write hash function");
+  fclose (hashFile);
+}
+
+
+
+int main (int argc, char **argv) {
+  int r = -1;
+  char *filename = "";
+  int ch;
+  msg_prefix = argv[0];
+  opterr = 0;
+
+  while ((ch = getopt (argc, argv, "f:d:r:h")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'r':
+      r = atoi (optarg);
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-f input_file]"
+	       "[-d data directory] [-r random seed] [-h]\n", argv[0]);
+      exit (1);
+    }
+  }
+
+  ProcessFiles (filename, r);
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.1	(revision 21083)
@@ -0,0 +1,95 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_stem_idx 1 \*(Dt CITRI
+.SH NAME
+mgpp_stem_idx \- builds a stem index file
+.SH SYNOPSIS
+.B mgpp_stem_idx
+[
+.B \-h
+]
+[
+.BI \-b " entries-per-block"
+]
+.if n .ti +12n
+[
+.BI \-a " stemmer"
+]
+[
+.BI \-d " directory"
+]
+.if n .ti +12n
+.B \-s 1|2|3
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_stem_idx
+generates a stem index file for a collection.
+This program should be called three times: once for each
+.B -s
+parameter.  It uses the stemmed dictionary to create the stem index which
+contains pointers into the stemmed dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIdirectoryyyyyyyy\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " entries-per-block"
+The dictionary is stored in blocks on disk; this option is used to set
+the number of entries per block. The default is 16.
+.TP
+.BI \-a " stemmer"
+The name of the stemmer to use, the default is the Lovin stemmer.
+.TP
+.B -s 1|2|3
+The stem method to apply for the stem index.
+.br
+1 = casefolded and non-stemmed
+.br
+2 = non-casefolded and stemmed
+.br
+3 = casefolded and stemmed
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection can be found.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 22
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.invf.dict.blocked.1
+Stem index with stem index method 1.
+.TP
+.B *.invf.dict.blocked.2
+Stem index with stem index method 2.
+.TP
+.B *.invf.dict.blocked.3
+Stem index with stem index method 3.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_weights_build (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_stem_idx.cpp	(revision 21083)
@@ -0,0 +1,237 @@
+/**************************************************************************
+ *
+ * mgpp_stem_idx.cpp -- stem index builder
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "UCArray.h"
+#include "sysfuncs.h"
+#include "messages.h"
+#include "mg_files.h"
+#include "invf.h"
+#include "words.h"
+#include "stemmer.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#  include <ospace\std\vector>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#  include <vector.h>
+#else
+#  include <map>
+#  include <vector>
+#endif
+
+typedef vector<unsigned long> WordNumList;
+typedef map<UCArray, WordNumList, DictLTUCArray> StemMapDict;
+
+void CreateStemDict (char *filename,
+		     StemMapDict &stemDict,
+		     int stemMethod,
+		     int stemmerNum) {
+  stemDict.erase (stemDict.begin(), stemDict.end());
+
+  // open the dictionary
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+  invf_dict_header idh;
+  idh.Read (dictFile);
+
+  fseek (dictFile, idh.word_dict_start, SEEK_SET);
+
+  unsigned long wordNum;
+  u_char mgWord[MAXSTEMLEN + 1];
+  word_dict_el wordEl;
+  UCArray stemEl;
+  wordEl.SetNumLevels (idh.num_levels);
+  for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+    // read in the next word
+    wordEl.Read (dictFile, idh.num_levels);
+
+    // convert the word to an "mg word"
+    mgWord[0] = wordEl.el.size();
+    memcpy((char *)&mgWord[1], &(wordEl.el[0]), wordEl.el.size());
+
+    // stem the word
+    stemmer (stemMethod, stemmerNum, mgWord);
+
+    // convert the result back to a UCArray
+    stemEl.erase (stemEl.begin(), stemEl.end());
+    stemEl.insert (stemEl.end(), &mgWord[1], &mgWord[1] + mgWord[0]);
+
+//      cout << "\"" << stemEl << "\" -> \"" << wordEl.el << "\"\n";
+    
+    // add this word number to the list of word numbers for this word
+    stemDict[stemEl].push_back (wordNum);
+  }
+
+  fclose (dictFile);
+}
+
+
+void WriteStemDict (char *filename,
+		    StemMapDict &stemDict,
+		    int stemMethod,
+		    int stemmerNum,
+		    unsigned long entriesPerBlock) {
+  // Create appropriate stem index file
+  FILE *stemDictFile = NULL;
+  if (stemMethod == 1) {
+    stemDictFile = create_file (filename, INVF_DICT_BLOCKED_1_SUFFIX,
+				"wb", MAGIC_STEM_1, MG_ABORT);
+  } else if (stemMethod == 2) {
+    stemDictFile = create_file (filename, INVF_DICT_BLOCKED_2_SUFFIX,
+				"wb", MAGIC_STEM_2, MG_ABORT);
+  } else if (stemMethod == 3) {
+    stemDictFile = create_file (filename, INVF_DICT_BLOCKED_3_SUFFIX,
+				"wb", MAGIC_STEM_3, MG_ABORT);
+  } else {
+    FatalError (1, "Unknown stem method %d", stemMethod);
+  }
+
+  stem_idx_header sih;
+  sih.lookback = 0;
+  sih.dict_size = stemDict.size();
+  sih.entries_per_block = entriesPerBlock;
+  sih.max_block_size = 0;
+  
+  sih.stemmer_num = stemmerNum;
+  sih.stem_method = stemMethod;
+
+  // write out a place-holder version of the header
+  sih.Write (stemDictFile);
+
+  sih.blocks_start = ftell (stemDictFile);
+
+  block_idx stemIdx;
+  unsigned long stemNum = 0;
+  stem_block_dict_el stemEl;
+  UCArray lastEl;
+
+  StemMapDict::const_iterator here = stemDict.begin();
+  StemMapDict::const_iterator end = stemDict.end();
+  while (here != end) {
+    // remember this stem (and position) if this is the start
+    // of a new block
+    if (stemNum % entriesPerBlock == 0) {
+      block_idx_info elIdx;
+      elIdx.el = (*here).first;
+      elIdx.block_ptr = ftell (stemDictFile);
+
+      // see if this block is the longest so far
+      if (stemIdx.size() > 0) {
+	unsigned long blockLen = elIdx.block_ptr -
+	  (*(stemIdx.end()-1)).block_ptr;
+	if (blockLen > sih.max_block_size) sih.max_block_size = blockLen;
+      }
+      
+      stemIdx.push_back (elIdx);
+      lastEl.erase (lastEl.begin(), lastEl.end()); // output full word
+    }
+
+    // copy the information for this stem
+    stemEl.el = (*here).first;
+    stemEl.equivWords = (*here).second;
+
+    // write out the stem
+    stemEl.Write (stemDictFile, &lastEl);
+    
+    here++; stemNum++;
+  }
+
+
+  // write out the element indexes
+  sih.num_blocks = stemIdx.size();
+  sih.block_idx_start = ftell (stemDictFile);
+  WriteBlockIdx (stemDictFile, stemIdx);
+  
+  // write out the stem dictionary header
+  fseek (stemDictFile, sizeof(unsigned long), SEEK_SET);
+  sih.Write (stemDictFile);
+
+
+  // close open files
+  fclose (stemDictFile);
+  
+  // print out information
+#ifndef SILENT
+  Message ("Num word stems = %d\n", sih.dict_size);
+  Message ("Max stem block size = %d\n", sih.max_block_size);
+  Message ("Number of stem blocks written = %d\n", sih.num_blocks);
+#endif
+}
+
+
+int main (int argc, char **argv) {
+  unsigned long entriesPerBlock = 16;
+  char *filename = "";
+  int ch;
+  int stemMethod = 0; // illegal value (no translation)
+  int stemmerNum = 0; // English stemmer
+  msg_prefix = argv[0];
+  opterr = 0;
+
+  while ((ch = getopt (argc, argv, "f:d:b:s:h")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'b':
+      entriesPerBlock = atoi (optarg);
+      break;
+    case 's':
+      stemMethod = atoi (optarg);
+      break;
+    case 'a':
+      stemmerNum = stemmernumber ((unsigned char *) optarg);
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-d directory] "
+	       "[-b entries-per-block] [-h] -s 1|2|3 "
+	       "[-a stemmer-method] -f name\n", argv[0]);
+      exit (1);
+    }
+  }
+  
+  if (stemMethod < 1 || stemMethod > 3)
+    FatalError (1, "Stem method must be 1, 2 or 3");
+
+  // read in the dictionary and create the in memory dictionary
+  StemMapDict stemDict;
+  CreateStemDict (filename, stemDict, stemMethod, stemmerNum);
+  
+  // write out the dictionary as a blocked file
+  WriteStemDict (filename, stemDict, stemMethod, stemmerNum, entriesPerBlock);
+  
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.1
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.1	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.1	(revision 21083)
@@ -0,0 +1,79 @@
+.\"------------------------------------------------------------
+.\" Id - set Rv,revision, and Dt, Date using rcs-Id tag.
+.de Id
+.ds Rv \\$3
+.ds Dt \\$4
+..
+.\"------------------------------------------------------------
+.TH mgpp_weights_build 1 \*(Dt CITRI
+.SH NAME
+mgpp_weights_build \- builds the approximate weights file
+.SH SYNOPSIS
+.B mgpp_weights_build
+[
+.B \-h
+]
+[
+.BI \-b " num-bits"
+]
+.if n .ti +17n
+[
+.BI \-d " directory"
+]
+.BI \-f " name"
+.SH DESCRIPTION
+.B mgpp_weights_build
+is the program that generates the exact and approximate weights 
+files.  To do this, it uses the inverted file
+and dictionary.
+.SH OPTIONS
+Options may appear in any order.
+.TP "\w'\fB\-d\fP \fIirectory\fP'u+2n"
+.B \-h
+This displays a usage line on
+.IR stderr .
+.TP
+.BI \-b " num-bits"
+This specifies the number of bits of precision that should be used for
+the approximate weights.  If not specified, it defaults to 8.
+.TP
+.BI \-d " directory"
+This specifies the directory where the document collection is.
+.TP
+.BI \-f " name"
+This specifies the base name of the document collection.
+.SH ENVIRONMENT
+.TP "\w'\fBMGDATA\fP'u+2n"
+.SB MGDATA
+If this environment variable exists, then its value is used as the
+default directory where the mgpp
+collection files are.  If this variable does not exist, then the
+directory \*(lq\fB.\fP\*(rq is used by default.  The command line
+option
+.BI \-d " directory"
+overrides the directory in
+.BR MGDATA .
+.SH FILES
+.TP 20
+.B *.invf
+Inverted file.
+.TP
+.B *.invf.dict
+Compressed stemmed dictionary.
+.TP
+.B *.text.idx
+Index into the compressed documents.
+.TP
+.B *.weight
+The exact weights file.
+.TP
+.B *.weight.approx
+Approximate document weights.
+.SH "SEE ALSO"
+.na
+.BR mgpp_compression_dict (1),
+.BR mgpp_fast_comp_dict (1),
+.BR mgpp_invf_dict (1),
+.BR mgpp_passes (1),
+.BR mgpp_perf_hash_build (1),
+.BR mgpp_stem_idx (1)
Index: /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/mgpp_weights_build.cpp	(revision 21083)
@@ -0,0 +1,399 @@
+/**************************************************************************
+ *
+ * mgpp_weights_build.cpp -- Program to build the document weights file
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+/* getopt is in posix.2, so cygwin should have it in unistd, but doesn't */
+#if defined (__WIN32__) || defined (__CYGWIN__)
+# include "getopt_old.h"
+#else
+# include <unistd.h>
+#endif
+
+#include "UCArray.h"
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_gen.h"
+#include "bitio_m_stdio.h"
+#include "mg_files.h"
+#include "locallib.h"
+#include "invf.h"
+#include "FIvfLevelInfo.h"
+#include "FragLevelConvert.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+#define MAXBITS (sizeof(unsigned long) * 8)
+
+struct WBTagPtr {
+  unsigned long tagNum;
+  unsigned long tagPtr;
+  unsigned long fragOccur;
+  
+  WBTagPtr () {
+    tagNum = 0;
+    tagPtr = 0;
+    fragOccur = 0;
+  }
+};
+
+// maps tags to tag information
+typedef map<UCArray, WBTagPtr, DictLTUCArray> WBTagDict;
+
+typedef vector<float> Weights;
+
+
+static void ReadTagDict (const invf_dict_header &idh,
+			 FILE *dictFile,
+			 FILE *invfIdxFile,
+			 WBTagDict &tagDict) {
+  tagDict.erase (tagDict.begin(), tagDict.end());
+
+  // seek to the start of the tag information
+  fseek (dictFile, idh.tag_dict_start, SEEK_SET);
+  fseek (invfIdxFile, sizeof(unsigned long) +
+	 idh.word_dict_size*sizeof(unsigned long), SEEK_SET);
+  
+  unsigned long tagNum;
+  unsigned long tagPtr;
+  dict_el thisEl;
+  for (tagNum = 0; tagNum < idh.tag_dict_size; tagNum++) {
+    thisEl.Read (dictFile);
+    ReadUL (invfIdxFile, tagPtr);
+    tagDict[thisEl.el].tagNum = tagNum;
+    tagDict[thisEl.el].tagPtr = tagPtr;
+    tagDict[thisEl.el].fragOccur = thisEl.frag_occur;
+  }
+}
+
+static void AddWeight (Weights &w,
+		       unsigned long levelDocNum,
+		       unsigned long termFreq,
+		       float idf) {
+  double weight = termFreq * idf;
+  w[levelDocNum-1] += weight * weight;
+}
+
+static void GenerateLevelWeights (const invf_dict_header &idh,
+				  const invf_file_header &ifh,
+				  unsigned long numLevelDocs,
+				  unsigned long levelNum,
+				  FILE *dictFile,
+				  FILE *invfFile,
+				  FILE *invfIdxFile,
+				  const FragLevelConvert &fragLevelConvert,
+				  Weights &w) {
+  // pre-allocate the right number of weights
+  w.erase (w.begin(), w.end());
+  w.insert (w.end(), (Weights::size_type)numLevelDocs, (float)0.0);
+
+  double logN = log ((double) numLevelDocs);
+
+  // reset the files
+  fseek (dictFile, idh.word_dict_start, SEEK_SET);
+  fseek (invfIdxFile, sizeof (unsigned long), SEEK_SET);
+  
+  // process each word adding its contributions to the document weights
+  unsigned long wordNum;
+  unsigned long wordStart;
+  word_dict_el wordEl;
+  wordEl.SetNumLevels (idh.num_levels);
+  for (wordNum=0; wordNum<idh.word_dict_size; wordNum++) {
+#ifndef SILENT
+    // give a little feedback every 4096 words
+    if ((wordNum & 0xfff) == 0) fprintf (stderr, ".");
+#endif
+    
+    wordEl.Read (dictFile, idh.num_levels);
+    ReadUL (invfIdxFile, wordStart);
+
+    float idf = logN - log ((double) wordEl.levelFreqs[levelNum]);
+
+    // seek to the appropriate place in the inverted file
+    fseek (invfFile, wordStart, SEEK_SET);
+    stdio_bitio_buffer buffer (invfFile);
+    
+    unsigned long B = BIO_Bblock_Init (idh.num_frags, wordEl.frag_occur);
+    unsigned long fragNum = 0;
+    unsigned long levelDocNum = 0;
+    unsigned long lastLevelDocNum = 0;
+    unsigned long termFreq = 0;
+    unsigned long checkLevelFreq = 0;
+    
+    unsigned long count, i;
+    for (i=0; i<wordEl.frag_occur; i++) {
+      fragNum += buffer.bblock_decode (B, NULL);
+      if (!ifh.word_level_index) count = buffer.gamma_decode (NULL);
+      else count = 1;
+
+      if (fragNum > idh.num_frags)
+	FatalError (1, "fragNum = %d, "
+		    "number of fragments = %d\n"
+		    "wordNum = %d\n"
+		    "i = %d, frag_occur = %d\n",
+		    fragNum, idh.num_frags, wordNum, i, wordEl.frag_occur);
+
+      if (!fragLevelConvert.FragToLevel (fragNum, levelDocNum))
+	FatalError (1, "could not convert fragment number %d in level %d", fragNum, levelNum);
+
+      if (levelDocNum == 0 || levelDocNum > numLevelDocs)
+	FatalError (1, "bad level document number %d in level %d", levelDocNum, levelNum);
+      
+      if (levelDocNum != lastLevelDocNum) {
+	// new level document
+	if (lastLevelDocNum > 0) {
+	  AddWeight (w, lastLevelDocNum, termFreq, idf);
+	  checkLevelFreq++;
+	}
+	lastLevelDocNum = levelDocNum;
+	termFreq = 0;
+      }
+      termFreq += count;
+    }
+
+    if (lastLevelDocNum > 0) {
+      AddWeight (w, lastLevelDocNum, termFreq, idf);
+      checkLevelFreq++;
+    }
+
+    if (checkLevelFreq != wordEl.levelFreqs[levelNum]) {
+      cerr << "bad level freq at level " <<levelNum<<" "<< checkLevelFreq << " != "
+	   << wordEl.levelFreqs[levelNum] << ", word \""
+	   << wordEl.el << "\" (" << wordNum << ")\n";
+      exit (1);
+    }
+    
+    buffer.done();
+  }
+
+  if (w.size() != numLevelDocs) 
+    FatalError (1, "wrong number of weights created %d != %d",
+		w.size(), numLevelDocs);
+}
+
+static void WriteExactWeights (FILE *weightsFile,
+			       unsigned long &diskPtr,
+			       const Weights &w) {
+  diskPtr = ftell(weightsFile);
+
+  Weights::const_iterator here = w.begin();
+  Weights::const_iterator end = w.end();
+  while (here != end) {
+//      cout << *here << "\n";
+    WriteF (weightsFile, sqrt (*here));
+    here++;
+  }
+}
+
+static void WriteApproxWeights (FILE *approxWeightsFile,
+				unsigned long &diskPtr,
+				const Weights &w,
+				unsigned char bits) {
+  diskPtr = ftell(approxWeightsFile);
+
+  // calculate L, U and B
+  double L = 1e300;
+  double U = 0;
+  float wgt;
+  Weights::const_iterator here = w.begin();
+  Weights::const_iterator end = w.end();
+  while (here != end) {
+    wgt = sqrt (*here);
+    if (wgt > U) U = wgt;
+    if (wgt > 0 && wgt < L) L = wgt;
+    here++;
+  }
+
+  double B = pow (U / L, pow (2.0, -(double) bits));
+
+#ifndef SILENT
+  fprintf (stderr, "L = %f\n", L);
+  fprintf (stderr, "U = %f\n", U);
+  fprintf (stderr, "B = %f\n", B);
+#endif
+  
+  WriteUC (approxWeightsFile, bits);
+  WriteD (approxWeightsFile, L);
+  WriteD (approxWeightsFile, B);
+  
+
+  unsigned long max = (bits == 32) ? 0xffffffff : (1 << bits) - 1;;
+  unsigned long i=0, buf=0, pos=0;
+  here = w.begin();
+  end = w.end();
+  while (here != end) {
+    unsigned long fx;
+    wgt = sqrt (*here);
+    if (wgt == 0) {
+      wgt = L;
+#ifndef SILENT
+      Message ("Warning: Document %d had a weight of 0.", i);
+#endif
+    }
+    fx = (unsigned long) floor (log (wgt / L) / log (B));
+
+    if (fx > max) fx = max;
+
+    buf |= (fx << pos);
+    pos += bits;
+
+    if (pos >= MAXBITS) {
+      WriteUL (approxWeightsFile, buf);
+      buf = fx >> (bits - (pos - MAXBITS));
+      pos = pos - MAXBITS;
+    }
+
+    here++; i++;
+  }
+
+  // write out the last bits
+  if (pos > 0) WriteUL (approxWeightsFile, buf);
+}
+
+int main (int argc, char **argv) {
+  unsigned char bits = 8;
+  char *filename = "";
+  int ch;
+  opterr = 0;
+  msg_prefix = argv[0];
+
+  while ((ch = getopt (argc, argv, "f:d:b:h")) != -1) {
+    switch (ch) {
+    case 'f':		// input file
+      filename = optarg;
+      break;
+    case 'd':
+      set_basepath (optarg);
+      break;
+    case 'b':
+      bits = atoi (optarg);
+      if (bits > 32) {
+	fprintf (stderr, "b may only take values 0-32\n");
+	exit (1);
+      }
+      break;
+    case 'h':
+    case '?':
+      fprintf (stderr, "usage: %s [-f input_file]"
+	       "[-d data directory] [-b bits] [-h]\n", argv[0]);
+      exit (1);
+    }
+  }
+
+  
+  // open the dictionary
+  FILE *dictFile = open_file (filename, INVF_DICT_SUFFIX, "rb",
+			      MAGIC_STEM_BUILD, MG_ABORT);
+  invf_dict_header idh;
+  idh.Read (dictFile);
+
+  // open the inverted file
+  FILE *invfFile = open_file (filename, INVF_SUFFIX, "rb",
+			MAGIC_INVF, MG_ABORT);
+  invf_file_header ifh;
+  ifh.Read (invfFile);
+  if (ifh.skip_mode != SKIP_MODE_NO_SKIPS)
+    FatalError (1, "The invf file contains skips. Unable to create weights.");
+
+  // open the inverted index file
+  FILE *invfIdxFile = open_file (filename, INVF_IDX_SUFFIX, "rb",
+				 MAGIC_INVI, MG_ABORT);
+  
+  // read the level information
+  FILE *levelFile = open_file (filename, INVF_LEVEL_SUFFIX, "rb",
+			       MAGIC_INVF_LEVELS, MG_ABORT);
+  FIvfLevel ivfLevel;
+  ivfLevel.Read (levelFile);
+  fclose (levelFile);
+
+  // read in the tag dictionary and inverted file pointers
+  WBTagDict tagDict;
+  ReadTagDict (idh, dictFile, invfIdxFile, tagDict);
+
+  
+  // create the weights file
+  FILE *weightsFile = create_file (filename, WEIGHTS_SUFFIX, "wb",
+				   MAGIC_WGHT, MG_ABORT);
+
+  // create the approx weights file
+  FILE *approxWeightsFile = create_file (filename, APPROX_WEIGHTS_SUFFIX, "wb",
+					 MAGIC_WGHT_APPROX, MG_ABORT);
+
+  
+  // create weights for each document level
+  FragLevelConvert fragLevelConvert;
+  Weights w;
+  IvfLevelInfoMap::iterator levelHere = ivfLevel.levelInfo.begin();
+  IvfLevelInfoMap::iterator levelEnd = ivfLevel.levelInfo.end();
+  unsigned long levelNum = 0;
+  while (levelHere != levelEnd) {
+    const UCArray &levelName = (*levelHere).first;
+    
+    // read the tag information about this level
+    fragLevelConvert.Read(invfFile, tagDict[levelName].tagPtr,
+			  idh.num_frags, tagDict[levelName].fragOccur);
+    
+    // create the weights for this level
+    GenerateLevelWeights (idh, ifh, tagDict[levelName].fragOccur,
+			  levelNum, dictFile, invfFile, invfIdxFile,
+			  fragLevelConvert, w);
+
+    // write out the exact weights
+    WriteExactWeights (weightsFile,
+		       (*levelHere).second.exactWeightsDiskPtr,
+		       w);
+    
+    // write out the approximate weights
+    WriteApproxWeights (approxWeightsFile,
+			(*levelHere).second.approxWeightsDiskPtr,
+			w, bits);
+    
+    levelHere++; levelNum++;
+  }
+  
+
+  // close input files
+  fclose (dictFile);
+  fclose (invfFile);
+  fclose (invfIdxFile);
+
+  // update the level information
+  levelFile = create_file (filename, INVF_LEVEL_SUFFIX, "wb",
+			   MAGIC_INVF_LEVELS, MG_ABORT);
+  ivfLevel.Write (levelFile);
+  fclose (levelFile);
+
+  // close output files
+  fclose (weightsFile);
+  fclose (approxWeightsFile);
+
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/stemmer.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/stemmer.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/stemmer.cpp	(revision 21083)
@@ -0,0 +1,105 @@
+/**************************************************************************
+ *
+ * stemmer.cpp -- The stemmer/case folder
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+#include "stemmer.h"
+
+#include "lovinstem.h"
+#include "simplefrenchstem.h"
+#include "unitool.h"
+
+#define LOVINSTEMMER        0
+#define SIMPLEFRENCHSTEMMER 1
+
+
+/* decode the utf-8 encoded unicode, casefold and then recode 
+ * making sure the final length doesn't exceed the original
+ * length */
+static void unicode_casefold (u_char *word) {
+  unsigned short out[256]; /* temp space */
+  int i;
+  int len;
+
+  /* decode */
+  utf8_word_to_unicode (word, out, 255);
+  len = out[0];
+
+  /* casefold and simplify-fold */
+  for (i=0; i<len; i++) {
+    out[i+1] = unicode_tosimplified(unicode_tolower(out[i+1]));
+  }
+
+  /* re-code */
+  unicode_to_utf8_word (out, word, word[0]+1);
+}
+
+
+int stemmernumber (u_char *stemmerdescription) {
+  u_char descript[MAX_STEM_DESCRIPTION_LEN];
+  int i;
+
+  /* copy and case-fold the description */
+  for (i=0; (stemmerdescription[i] != '\0') && 
+	 (i < MAX_STEM_DESCRIPTION_LEN-1); i++)
+    descript[i] = tolower (stemmerdescription[i]);
+  descript[i] = '\0';
+
+  /* map the description to its number */
+
+  if ((strcmp ((char *) descript,  "0") == 0) ||
+      (strcmp ((char *) descript, "english") == 0) ||
+      (strcmp ((char *) descript, "lovin") == 0))
+    return LOVINSTEMMER;
+
+  if ((strcmp ((char *) descript, "1") == 1) ||
+      (strcmp ((char *) descript, "french") == 0) ||
+      (strcmp ((char *) descript, "simplefrench") == 0))
+    return SIMPLEFRENCHSTEMMER;
+
+  return -1;
+}
+
+
+
+/*
+ * Method 0 - Do not stem or case fold.
+ * Method 1 - Case fold.
+ * Method 2 - Stem.
+ * Method 3 - Case fold and stem.
+ *
+ * The stemmer number should be obtained using
+ * the stemmernumber function above.
+ */
+void 
+stemmer (int method, int stemmer, u_char *word) {
+  if (method & 1) {
+    unicode_casefold (word);
+  }
+
+  if (method & 2) {
+    switch (stemmer) {
+    case LOVINSTEMMER: lovinstem (word);
+      break;
+    case SIMPLEFRENCHSTEMMER: simplefrenchstem (word);
+      break;
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/stemmer.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/stemmer.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/stemmer.h	(revision 21083)
@@ -0,0 +1,65 @@
+/**************************************************************************
+ *
+ * stemmer.h -- The stemmer/case folder
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef STEMMER_H
+#define STEMMER_H
+
+#include "sysfuncs.h"
+
+#define STEMMER_MASK 3
+#define MAX_STEM_DESCRIPTION_LEN 16
+
+/* stemmernumber will return the stemmer for
+ * a description of the stemmer. Stemmer descriptions
+ * are not case sensitive. Valid descriptions are:
+ *
+ *   'English'
+ *   'Lovin'
+ *   'French'
+ *   'SimpleFrench'
+ *
+ * More than one description might result in the same
+ * stemmer number (for example, for stemming 'English'
+ * we currently use the 'Lovin' stemmer).
+ *
+ * stemmerdescription is a normal C, null-terminated,
+ * string.
+ *
+ * stemmernumber will return -1 if it doesn't know the
+ * stemmer description.
+ */
+int stemmernumber (u_char *stemmerdescription);
+
+/*
+ * Method 0 - Do not stem or case fold.
+ * Method 1 - Case fold.
+ * Method 2 - Stem.
+ * Method 3 - Case fold and stem.
+ *
+ * The stemmer number should be obtained using function
+ * stemmernumber above.
+ */
+#ifdef __cplusplus
+extern "C" 
+#endif
+void stemmer (int method, int stemmer, u_char * word);
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/text.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/text.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/text.cpp	(revision 21083)
@@ -0,0 +1,146 @@
+/**************************************************************************
+ *
+ * text.h -- Header file for compression related stuff
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// UCArray currently contains all the basic reading and writing functions
+#include "UCArray.h"
+#include "text.h"
+
+compressed_text_header::compressed_text_header () {
+  Clear();
+}
+
+void compressed_text_header::Clear () {
+  num_of_docs = 0;
+  num_of_words = 0;
+  num_of_bytes = 0.0;
+}
+
+
+bool compressed_text_header::Read (FILE *f) {
+  return (ReadUL (f, num_of_docs) &&
+	  ReadUL (f, num_of_words) &&
+	  ReadD (f, num_of_bytes));
+}
+
+bool compressed_text_header::Write (FILE *f) const {
+  return (WriteUL (f, num_of_docs) &&
+	  WriteUL (f, num_of_words) &&
+	  WriteD (f, num_of_bytes));
+}
+
+
+auxiliary_dict::auxiliary_dict () {
+  word_data[0] = NULL;
+  word_data[1] = NULL;
+  words[0] = NULL;
+  words[1] = NULL;
+}
+
+auxiliary_dict::~auxiliary_dict () {
+  Clear ();
+}
+
+void auxiliary_dict::Clear () {
+  if (word_data[0] != NULL) {
+    delete word_data[0];
+    word_data[0] = NULL;
+  }
+  if (word_data[1] != NULL) {
+    delete word_data[1];
+    word_data[1] = NULL;
+  }
+  if (words[0] != NULL) {
+    delete words[0];
+    words[0] = NULL;
+  }
+  if (words[1] != NULL) {
+    delete words[1];
+    words[1] = NULL;
+  }
+}
+
+
+compression_dict::compression_dict () {
+  int which;
+  for (which = 0; which < 2; which++) {
+    cfh[which] = NULL;
+    values[which] = NULL;
+    escape[which] = NULL;
+    chars_huff[which] = NULL;
+    chars_vals[which] = NULL;
+    lens_huff[which] = NULL;
+    lens_vals[which] = NULL;
+  }
+
+  MemForCompDict = 0;
+  ad = NULL;
+  fast_loaded = 0;
+}
+
+compression_dict::~compression_dict () {
+  Clear ();
+}
+
+void compression_dict::Clear () {
+  int which;
+  for (which = 0; which < 2; which++) {
+    if (cfh[which] != NULL) {
+      delete cfh[which];
+      cfh[which] = NULL;
+    }
+    if (values[which] != NULL) {
+      delete values[which][0][0];
+      delete values[which][0];
+      delete values[which];
+      values[which] = NULL;
+    }
+    if (escape[which] != NULL) { // don't know if needed
+      //delete escape[which]; // this was causing a seg fault
+      escape[which] = NULL;
+    }
+    if (chars_huff[which] != NULL) {
+      delete chars_huff[which];
+      chars_huff[which] = NULL;
+    }
+    if (chars_vals[which] != NULL) {
+      delete chars_vals[which][0];
+      delete chars_vals[which];
+      chars_vals[which] = NULL;
+    }
+    if (lens_huff[which] != NULL) {
+      delete lens_huff[which];
+      lens_huff[which] = NULL;
+    }
+    if (lens_vals[which] != NULL) {
+      delete lens_vals[which][0];
+      delete lens_vals[which];
+      lens_vals[which] = NULL;
+    }
+  }
+
+  if (ad != NULL) {
+    delete ad;
+    ad = NULL;
+  }
+
+  MemForCompDict = 0;
+  fast_loaded = 0;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/text.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/text.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/text.h	(revision 21083)
@@ -0,0 +1,199 @@
+/**************************************************************************
+ *
+ * text.h -- Header file for compression related stuff
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#ifndef H_TEXT
+#define H_TEXT
+
+// some elderly windows compilers need to include <vector> (or something
+// similar) here so that they know what a "bool" is
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#else
+#  include <vector>
+#endif
+
+
+#include "huffman.h"
+#include <stdio.h>
+
+/*****************************************************************************
+ *
+ * There are several different methods of compressing the text of the
+ * database. The following defines list the different methods of text
+ * compression
+ *
+ */
+
+
+/* The dictionary contains all the fragments that occur in the collection
+   i.e. escapes are not possible */
+#define MG_COMPLETE_DICTIONARY 0
+
+
+/* Certain words have been deleted from the dictionary. The words deleted
+   have been used to create the frequency huffman codes of the characters. 
+   This dictionary has an escape code and may be used to compress novel
+   words. This dictionary may fail if there is a novel character. */
+#define MG_PARTIAL_DICTIONARY 1
+
+
+/* This dictionary has an escape so that novel words and non-words can be 
+   coded. The method for coding the novel words and non-words is determined
+   by a dictionary parameter. */
+#define MG_SEED_DICTIONARY 2
+
+
+
+
+
+
+
+
+
+/*****************************************************************************
+ *
+ * With a seed dictionary there are several methods for coding the novel
+ * words and non-words the following defined values specify the different
+ * methods of coding.
+ *
+ */
+
+
+/* Code novel words and non-words character by character using huffman codes.
+   The huffman codes for the word and non-word lengths and characters are 
+   generated from the distribution of lengths and characters in the
+   dictionary. */
+#define MG_NOVEL_HUFFMAN_CHARS 0
+
+
+/* This method codes novel words using delta codes. The novel words are stored
+   in a auxillary dictionary which is built by pass two. */
+#define MG_NOVEL_DELTA 2
+
+
+/* This method codes novel words using hybrid version of delta. The novel
+   words are stored in a auxillary dictionary which is built by pass two. */
+#define MG_NOVEL_HYBRID 3
+
+
+
+
+
+
+/* This specified an amount of extra space allocated in the
+   compression_dict_header for adding new parameters. As new
+   parameters are added this should be decreased. */
+#define TEXT_PARAMS 15
+
+
+
+struct compression_dict_header {
+  u_long dict_type;
+  u_long novel_method;
+  u_long params[TEXT_PARAMS];
+  u_long num_words[2];
+  u_long num_word_chars[2];
+  u_long lookback;
+};
+
+
+struct comp_frags_header {
+  huff_data hd;
+  u_long uncompressed_size;
+  u_long huff_words_size[MAX_HUFFCODE_LEN + 1];
+};
+
+// BOGUSTEXTLEN is used to replace the ratio
+// in the compressed_text_header while preparing
+// for UCArray
+#define BOGUSTEXTLEN 1000000
+
+struct compressed_text_header {
+  u_long num_of_docs;
+  u_long num_of_words; // number of words in collection
+  double num_of_bytes;
+
+  compressed_text_header ();
+  void Clear ();
+
+  // you must seek to the appropriate place before calling
+  // Read or Write
+  bool Read (FILE *f);
+  bool Write (FILE *f) const;
+};
+
+
+struct compression_stats_header {
+  u_long num_docs;
+  u_long dummy;     // alignment
+  double num_bytes; 
+};
+
+
+struct frags_stats_header {
+  u_long num_frags;
+  u_long mem_for_frags;
+};
+
+
+struct aux_frags_header {
+  u_long num_frags;
+  u_long mem_for_frags;
+};
+
+
+struct auxiliary_dict {
+  aux_frags_header afh[2];
+  u_char *word_data[2];
+  u_char **words[2];
+  int blk_start[2][33], blk_end[2][33];	/* blk_start and blk_end are required
+					   for the hybrid methods */
+
+  auxiliary_dict ();
+  ~auxiliary_dict ();
+
+  void Clear ();
+};
+
+
+struct compression_dict {
+  compression_dict_header cdh;
+  comp_frags_header *cfh[2];
+  unsigned long MemForCompDict;
+  u_char ***values[2];
+  u_char *escape[2];
+  huff_data *chars_huff[2];
+  u_long **chars_vals[2];
+  huff_data *lens_huff[2];
+  u_long **lens_vals[2];
+  auxiliary_dict *ad;
+  int fast_loaded;
+
+  compression_dict ();
+  ~compression_dict ();
+
+  void Clear ();
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/mgpp/text/text.pass1.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/text.pass1.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/text.pass1.cpp	(revision 21083)
@@ -0,0 +1,387 @@
+/**************************************************************************
+ *
+ * text.pass1.cpp -- Text compression (Pass 1)
+ * Copyright (C) 1994  Neil Sharman, Gary Eddy and Alistair Moffat
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "huffman.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+#include "mg_files.h"
+#include "mg.h"
+#include "build.h"
+#include "locallib.h"
+#include "words.h"
+#include "text.h"
+#include "hash.h"
+#include "local_strings.h"
+#include "TextEl.h"
+
+/* for more meaningful messages - jrm21 (gsdl) */
+#ifdef HAVE_STRERROR
+#include <string.h>
+#include <errno.h>
+#endif
+
+
+#define POOL_SIZE 1024*1024
+#define INITIAL_HASH_SIZE 7927
+
+
+typedef struct hash_rec
+  {
+    unsigned long wcnt;		/* word frequency */
+    unsigned long occurance_num;
+    u_char *word;
+  }
+hash_rec;
+
+typedef struct dict_data
+  {
+    hash_rec *HashTable;
+    unsigned long HashSize;
+    unsigned long HashUsed;
+    unsigned long wordnum;
+    unsigned long words_read;
+    unsigned long bytes_diff;
+    huff_data hd;
+  }
+dict_data;
+
+
+
+static unsigned long longestDoc = 0;
+static unsigned long occurance_num = 0;
+static dict_data DictData[2];
+
+static u_char *Pool;
+static int PoolLeft;
+static double inputbytes = 0; /* [RJM 07/97: 4G limit] */
+static unsigned long MaxMemInUse = 0;
+static unsigned long MemInUse = 0;
+static compression_stats_header csh = {0, 0, 0.0}; /* [RJM 07/97: 4G limit] */
+
+
+static void ChangeMem (int Change) {
+  MemInUse += Change;
+  if (MemInUse > MaxMemInUse) MaxMemInUse = MemInUse;
+}
+
+
+int init_text_1 (const TagInfo &/*tagInfo*/, char * /*FileName*/) {
+  int which;
+  
+  if (!(Pool = (u_char *) Xmalloc (POOL_SIZE))) {
+    Message ("Unable to allocate memory for pool");
+    return (COMPERROR);
+  }
+  PoolLeft = POOL_SIZE;
+  ChangeMem (POOL_SIZE);
+  
+  for (which = 1; which >= 0; which--) {
+    u_char *word;
+    hash_rec *ent;
+    dict_data *dd = &DictData[which];
+    
+    dd->wordnum = 0;
+    dd->words_read = 0;
+    dd->bytes_diff = 0;
+    dd->HashSize = INITIAL_HASH_SIZE;
+    dd->HashUsed = 0;
+    
+    if (!(dd->HashTable = (hash_rec *) Xmalloc (sizeof (hash_rec) * dd->HashSize))) {
+      Message ("Unable to allocate memory for table");
+      return (COMPERROR);
+    }
+    ChangeMem (sizeof (hash_rec) * dd->HashSize);
+    memset (dd->HashTable,'\0' , sizeof (hash_rec) * dd->HashSize);
+
+    word = Pool;
+    *Pool++ = '\0';
+    PoolLeft--;
+    {
+      register u_char *wptr;
+      register int hsize = dd->HashSize;
+      register unsigned long hashval, step;
+      
+      HASH (hashval, step, word, hsize);
+      wptr = (dd->HashTable + hashval)->word;
+      while (wptr) {
+	hashval += step;
+	if (hashval >= (unsigned long)hsize)
+	  hashval -= hsize;
+	wptr = (dd->HashTable + hashval)->word;
+      }
+      ent = dd->HashTable + hashval;
+    }
+    ent->wcnt = 1;
+    ent->word = word;
+    dd->HashUsed = 1;
+  }
+  return (COMPALLOK);
+}
+
+
+static int process_text_element (const u_char *s_in, int l_in) {
+  const u_char *end = s_in + l_in - 1;
+  
+   /*
+   ** Alternately parse off words and non-words from the input
+   ** stream beginning with a non-word. Each token is then
+   ** inserted into the set if it does not exist or has it's
+   ** frequency count incremented if it does.
+   */
+  
+  bool which = false; // non-word
+  for (; s_in <= end; which = !which) {
+    u_char Word[MAXWORDLEN + 1];
+    dict_data *dd = &DictData[which];
+    
+    /* First parse a word or non-word out of the string */
+    if (which) PARSE_WORD (Word, s_in, end);
+    else PARSE_NON_WORD (Word, s_in, end);
+    
+    dd->wordnum++;
+    inputbytes += *Word;
+    dd->words_read++;
+    
+    /* Search the hash table for Word */
+    {
+      register unsigned long hashval, step;
+      register int hsize = dd->HashSize;
+      HASH (hashval, step, Word, hsize);
+      for (;;) {
+	register u_char *s1;
+	register u_char *s2;
+	register int len;
+	register hash_rec *ent;
+	ent = dd->HashTable + hashval;
+	if (!ent->word) {
+	  int len = *Word + 1;
+	  if (len > PoolLeft) {
+	    if (!(Pool = (u_char *) Xmalloc (POOL_SIZE))) {
+	      Message ("Unable to allocate memory for pool");
+	      return (COMPERROR);
+	    }
+	    PoolLeft = POOL_SIZE;
+	    ChangeMem (POOL_SIZE);
+	  }
+	  ent->occurance_num = occurance_num++;
+	  ent->wcnt = 1;
+	  ent->word = Pool;
+	  memcpy (Pool, Word, len);
+	  Pool += len;
+	  PoolLeft -= len;
+	  dd->HashUsed++;
+	  dd->bytes_diff += Word[0];
+	  break;
+	}
+	
+	/* Compare the words */
+	s1 = Word;
+	s2 = ent->word;
+	len = *s1 + 1;
+	for (; len; len--)
+	  if (*s1++ != *s2++) break;
+	
+	if (len) {
+	  hashval = (hashval + step);
+	  if (hashval >= (unsigned long)hsize) hashval -= hsize;
+	} else {
+	  ent->wcnt++;
+	  break;
+	}
+      }
+    }
+
+    
+    if (dd->HashUsed >= dd->HashSize >> 1) {
+      hash_rec *ht;
+      unsigned long size;
+      unsigned long i;
+      size = prime (dd->HashSize * 2);
+      if (!(ht = (hash_rec *) Xmalloc (sizeof (hash_rec) * size))) {
+	Message ("Unable to allocate memory for table");
+	return (COMPERROR);
+      }
+      ChangeMem (sizeof (hash_rec) * size);
+      memset (ht, '\0', sizeof (hash_rec) * size);
+
+      for (i = 0; i < dd->HashSize; i++)
+	if (dd->HashTable[i].word) {
+	  register u_char *wptr;
+	  register unsigned long hashval, step;
+	  
+	  wptr = dd->HashTable[i].word;
+	  HASH (hashval, step, wptr, size);
+	  wptr = (ht + hashval)->word;
+	  while (wptr) {
+	    hashval += step;
+	    if (hashval >= size) hashval -= size;
+	    wptr = (ht + hashval)->word;
+	  }
+	  ht[hashval] = dd->HashTable[i];
+	}
+      Xfree (dd->HashTable);
+      ChangeMem (-sizeof (hash_rec) * dd->HashSize);
+      dd->HashTable = ht;
+      dd->HashSize = size;
+    }
+  }
+
+  return COMPALLOK;
+}
+
+
+int process_text_1 (const TagInfo &/*tagInfo*/, const TextElArray &doc) {
+  unsigned long textLen = 0;
+  unsigned long docLen = 0;
+  int retValue;
+
+  // process each text element in this document
+  TextElArray::const_iterator here = doc.begin();
+  TextElArray::const_iterator end = doc.end();
+  while (here != end) {
+    textLen = (*here).text.size();
+    docLen += textLen;
+
+    retValue = process_text_element (&(here->text[0]), textLen);
+    if (retValue != COMPALLOK) return retValue;
+    
+    here++;
+  }
+
+  // get max document length
+  if (docLen > longestDoc) longestDoc = docLen;
+
+  // update header information
+  csh.num_docs++;
+  csh.num_bytes += docLen;
+  
+  return COMPALLOK;
+}
+
+
+static int PackHashTable (dict_data * dd) {
+  int s, d;
+  for (s = d = 0; (unsigned int)s < dd->HashSize; s++)
+    if (dd->HashTable[s].word)
+      dd->HashTable[d++] = dd->HashTable[s];
+  
+  ChangeMem (-sizeof (hash_rec) * dd->HashSize);
+  ChangeMem (sizeof (hash_rec) * dd->HashUsed);
+  
+  if (!(dd->HashTable = (hash_rec *) Xrealloc (dd->HashTable,
+			   sizeof (hash_rec) * dd->HashUsed))) {
+    Message ("Out of memory");
+    return COMPERROR;
+  }
+  dd->HashSize = dd->HashUsed;
+  return COMPALLOK;
+}
+
+
+static int ent_comp (const void *s1, const void *s2) {
+  return casecompare (((hash_rec *) s1)->word, ((hash_rec *) s2)->word);
+}
+
+
+static void WriteHashTable (FILE * fp, dict_data * dd) {
+  frags_stats_header fsh;
+  u_long j = 0;
+  u_char *curr;
+
+  if (PackHashTable (dd) == COMPERROR) return;
+  
+  qsort (dd->HashTable, dd->HashUsed, sizeof (hash_rec), ent_comp);
+  
+  fsh.num_frags = dd->HashSize;
+  fsh.mem_for_frags = dd->HashSize;
+  for (j = 0; j < dd->HashSize; j++)
+    fsh.mem_for_frags += dd->HashTable[j].word[0];
+  
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(fsh.num_frags);
+  HTONUL(fsh.mem_for_frags);
+  
+  fwrite (&fsh, sizeof (fsh), 1, fp);
+  
+  for (j = 0; j < dd->HashSize; j++) {
+    curr = dd->HashTable[j].word;
+    
+    /* [RPAP - Jan 97: Endian Ordering] */
+    HTONUL(dd->HashTable[j].wcnt);
+    HTONUL(dd->HashTable[j].occurance_num);
+    
+    fwrite (&dd->HashTable[j].wcnt, sizeof (dd->HashTable[j].wcnt), 1, fp);
+    fwrite (&dd->HashTable[j].occurance_num,
+	    sizeof (dd->HashTable[j].occurance_num), 1, fp);
+    
+    /* [RPAP - Jan 97: Endian Ordering] */
+    NTOHUL(dd->HashTable[j].wcnt);
+    NTOHUL(dd->HashTable[j].occurance_num);
+    
+    fwrite (curr, sizeof (u_char), curr[0] + 1, fp);
+  }
+}
+
+
+int done_text_1 (const TagInfo &/*tagInfo*/, char *file_name) {
+  char *temp_str;
+  FILE *fp;
+  
+  if (!(fp = create_file (file_name, TEXT_STATS_DICT_SUFFIX, "wb",
+			  MAGIC_STATS_DICT, MG_MESSAGE)))  /* [RPAP - Feb 97: WIN32 Port] */
+    {
+      fprintf(stderr,"Couldn't create file %s%s:%s\n",
+              file_name, TEXT_STATS_DICT_SUFFIX,
+#if defined(HAVE_STRERROR) || defined(__WIN32__)
+              strerror(errno)
+#else
+	      " "
+#endif
+              );
+      return COMPERROR;
+    }
+
+  temp_str = msg_prefix;
+  msg_prefix = "text.pass1";
+  
+  /* [RPAP - Jan 97: Endian Ordering] */
+  HTONUL(csh.num_docs);
+  HTOND(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  fwrite (&csh, sizeof (csh), 1, fp);
+
+  /* [RPAP - Jan 97: Endian Ordering] */
+  NTOHUL(csh.num_docs);
+  NTOHD(csh.num_bytes); /* [RJM 07/97: 4G limit] */
+
+  WriteHashTable (fp, &DictData[0]);
+  WriteHashTable (fp, &DictData[1]);
+  msg_prefix = temp_str;
+  return COMPALLOK;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/text.pass2.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/text.pass2.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/text.pass2.cpp	(revision 21083)
@@ -0,0 +1,581 @@
+/**************************************************************************
+ *
+ * text.pass2.cpp -- Text compression (Pass 2)
+ * Copyright (C) 1994  Neil Sharman, Gary Eddy and Alistair Moffat
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#if defined (__WIN32__)
+# include <stdio.h>
+# define unlink _unlink
+#endif
+
+#include "sysfuncs.h"
+#include "memlib.h"
+#include "messages.h"
+#include "local_strings.h"
+#include "bitio_m_stdio.h"
+#include "huffman.h"
+#include "netorder.h"  /* [RPAP - Jan 97: Endian Ordering] */
+#include "mg.h"
+#include "mg_files.h"
+#include "build.h"
+#include "words.h"
+#include "text.h"
+#include "hash.h"
+#include "locallib.h"
+#include "comp_dict.h"
+#include "FText.h"
+
+#define POOL_SIZE 1024*256
+
+
+struct char_pool {
+  struct char_pool *next;
+  u_long left;
+  u_char *ptr;
+  u_char pool[POOL_SIZE];
+};
+
+struct novel_hash_rec {
+  u_long ordinal_num;
+  u_char *word;
+};
+
+
+#define INITIAL_HASH_SIZE 7927
+
+struct novel_hash_table {
+  novel_hash_rec *HashTable;
+  u_long HashSize, HashUsed;
+  char_pool *first_pool;
+  char_pool *pool;
+  u_long next_num, binary_start;
+  novel_hash_rec **code_to_nhr;
+};
+
+
+static FILE *text;
+static stdio_bitio_buffer textOutBuf;
+static u_long headLen;
+
+static novel_hash_table nht[2];
+
+int blk_start[2][33], blk_end[2][33];
+
+// 0 = non-word, 1 = word
+unsigned char whichWordType = 0;
+
+CompressTextInfoMap textInfoMap;
+
+
+static char_pool *new_pool (char_pool * pool) {
+  char_pool *p = (char_pool *) Xmalloc (sizeof (char_pool));
+  if (!p) FatalError (1, "Unable to allocate memory for pool");
+  
+  if (pool) pool->next = p;
+  p->next = NULL;
+  p->left = POOL_SIZE;
+  p->ptr = p->pool;
+  return p;
+}
+
+
+int init_text_2 (const TagInfo &/*tagInfo*/, char *fileName) {
+  char path[512];
+
+  // load the compression dictionary
+  if (LoadCompressionDictionary (make_name (fileName, TEXT_DICT_SUFFIX,
+					    path)) == COMPERROR)
+    return COMPERROR;
+
+  // create the compressed text file and attach it to the text buffer
+  if (!(text = create_file (fileName, TEXT_SUFFIX, "w+b",
+			    MAGIC_TEXT, MG_MESSAGE)))
+    return COMPERROR;
+  textOutBuf.attachFile (text);
+  textOutBuf.encodeStart ();
+  
+  // write out the compressed text header
+  memset (&cth, '\0', sizeof (cth));
+  if (fwrite (&cth, sizeof (cth), 1, text) != 1)
+    return COMPERROR;
+
+  // the length of the compressed header is the size of the
+  // magic number plus the size of the compressed text header
+  headLen = sizeof (u_long) + sizeof (cth);
+
+  // start off with non-word
+  whichWordType = 0;
+
+  // clear the text pointers
+  textInfoMap.erase (textInfoMap.begin(), textInfoMap.end());
+  
+  // set up the hash table of novel words
+  int i;
+  if (cdh.novel_method != MG_NOVEL_HUFFMAN_CHARS)
+    for (i = 0; i <= 1; i++)
+      {
+	nht[i].HashSize = INITIAL_HASH_SIZE;
+	nht[i].HashTable = (novel_hash_rec *) Xmalloc (sizeof (novel_hash_rec) * nht[i].HashSize);
+	memset (nht[i].HashTable, '\0',
+	       sizeof (novel_hash_rec) * nht[i].HashSize);
+	nht[i].HashUsed = 0;
+	nht[i].HashSize = INITIAL_HASH_SIZE;
+	nht[i].pool = nht[i].first_pool = new_pool (NULL);
+	nht[i].next_num = 1;
+	nht[i].binary_start = 1;
+	nht[i].code_to_nhr = NULL;
+	if (cdh.novel_method == MG_NOVEL_HYBRID)
+	  {
+	    int num;
+	    num = 1;
+	    blk_start[i][0] = 0;
+	    blk_end[i][0] = cdh.num_words[i] - 1;
+	    while (num < 33)
+	      {
+		blk_start[i][num] = blk_end[i][num - 1] + 1;
+		blk_end[i][num] = blk_start[i][num] +
+		  (blk_end[i][num - 1] - blk_start[i][num - 1]) * 2;
+		num++;
+	      }
+	  }
+      }
+
+  return (COMPALLOK);
+}
+
+
+static int compress_text (bitio_buffer &buffer, const u_char *s_in,
+			  int l_in, unsigned char &which,
+			  unsigned long &numWords) {
+  const u_char *end = s_in + l_in - 1;
+
+  for (; s_in <= end; which = !which) {
+    u_char Word[MAXWORDLEN + 1];
+    int res;
+    
+    if (which) numWords++;
+
+    /* First parse a word or non-word out of the string */
+    if (which) PARSE_WORD (Word, s_in, end);
+    else PARSE_NON_WORD (Word, s_in, end);
+
+    /* Search the hash table for Word */
+    if (ht[which]) {
+      register unsigned long hashval, step;
+      register int tsize = ht[which]->size;
+      register u_char **wptr;
+      HASH (hashval, step, Word, tsize);
+      for (;;) {
+	register u_char *s1;
+	register u_char *s2;
+	register int len;
+	wptr = ht[which]->table[hashval];
+	if (wptr == NULL) {
+	  res = COMPERROR;
+	  break;
+	}
+
+	/* Compare the words */
+	s1 = Word;
+	s2 = *wptr;
+	len = *s1 + 1;
+	for (; len; len--)
+	  if (*s1++ != *s2++) break;
+	
+	if (len) {
+	  hashval += step;
+	  if (hashval >= (unsigned long)tsize) hashval -= tsize;
+	  
+	} else {
+	  res = ht[which]->table[hashval] - ht[which]->words;
+	  break;
+	}
+      }
+    }
+    else
+      res = COMPERROR;
+    /* Check that the word was found in the dictionary */
+    if (res == COMPERROR)
+      {
+	if (cdh.dict_type == MG_COMPLETE_DICTIONARY)
+	  {
+	    Message ("Unknown word \"%.*s\"\n", *Word, Word + 1);
+	    return (COMPERROR);
+	  }
+	if (cdh.dict_type == MG_PARTIAL_DICTIONARY)
+	  {
+	    u_long i;
+	    if (ht[which])
+	      {
+		res = ht[which]->hd->num_codes - 1;
+		buffer.huff_encode (res, ht[which]->codes, ht[which]->hd->clens, NULL);
+	      }
+	    buffer.huff_encode (Word[0], lens_codes[which], lens_huff[which].clens, NULL);
+	    for (i = 0; i < Word[0]; i++)
+	      buffer.huff_encode (Word[i + 1], char_codes[which],
+				  char_huff[which].clens, NULL);
+	  }
+	if (cdh.dict_type == MG_SEED_DICTIONARY)
+	  {
+	    if (ht[which])
+	      {
+		res = ht[which]->hd->num_codes - 1;
+		buffer.huff_encode (res, ht[which]->codes, ht[which]->hd->clens, NULL);
+	      }
+	    switch (cdh.novel_method)
+	      {
+	      case MG_NOVEL_HUFFMAN_CHARS:
+		{
+		  u_long i;
+		  buffer.huff_encode (Word[0], lens_codes[which],
+				      lens_huff[which].clens, NULL);
+		  for (i = 0; i < Word[0]; i++)
+		    buffer.huff_encode (Word[i + 1], char_codes[which],
+					char_huff[which].clens, NULL);
+		}
+		break;
+	      case MG_NOVEL_DELTA:
+	      case MG_NOVEL_HYBRID:
+		{
+		  register unsigned long hashval, step;
+		  register novel_hash_table *h = &nht[which];
+		  register int hsize = h->HashSize;
+		  register novel_hash_rec *ent;
+		  HASH (hashval, step, Word, hsize);
+		  for (;;)
+		    {
+		      register u_char *s1, *s2;
+		      register int len;
+		      ent = h->HashTable + hashval;
+		      if (!ent->word)
+			{
+			  int len = *Word + 1;
+			  if ((unsigned)len > h->pool->left)
+			    h->pool = new_pool (h->pool);
+			  ent->word = h->pool->ptr;
+			  ent->ordinal_num = h->next_num++;
+			  memcpy (h->pool->ptr, Word, len);
+			  h->pool->ptr += len;
+			  h->pool->left -= len;
+			  h->HashUsed++;
+			  break;
+			}
+		      /* Compare the words */
+		      s1 = Word;
+		      s2 = ent->word;
+		      len = *s1 + 1;
+		      for (; len; len--)
+			if (*s1++ != *s2++)
+			  break;
+		      
+		      if (!len)
+			break;
+		      
+		      hashval = (hashval + step);
+		      if (hashval >= (unsigned)hsize) hashval -= hsize;
+		    }
+		  
+		  switch (cdh.novel_method) {
+		  case MG_NOVEL_DELTA:
+		    buffer.delta_encode (ent->ordinal_num, NULL);
+		    break;
+		  case MG_NOVEL_HYBRID:
+		    int k = 0;
+		    int j = ent->ordinal_num - 1;
+		    while (j > blk_end[which][k])
+		      k++;
+		    assert (j - blk_start[which][k] + 1 >= 1 &&
+			    j - blk_start[which][k] + 1 <=
+			    blk_end[which][k] - blk_start[which][k] + 1);
+		    
+		    buffer.gamma_encode (k + 1, NULL);
+		    buffer.binary_encode (j - blk_start[which][k] + 1,
+					  blk_end[which][k] - blk_start[which][k] + 1,
+					  NULL);
+		    break;
+		  }
+		  
+		  if (h->HashUsed >= h->HashSize >> 1)
+		    {
+		      novel_hash_rec *ht;
+		      unsigned long size;
+		      unsigned long i;
+		      size = prime (h->HashSize * 2);
+		      if (!(ht = (novel_hash_rec *) Xmalloc (sizeof (novel_hash_rec) * size)))
+			{
+			  Message ("Unable to allocate memory for table");
+			  return (COMPERROR);
+			}
+		      memset (ht, '\0', sizeof (novel_hash_rec) * size);
+		      
+		      for (i = 0; i < h->HashSize; i++)
+			if (h->HashTable[i].word)
+			  {
+			    register u_char *wptr;
+			    register unsigned long hashval, step;
+			    
+			    wptr = h->HashTable[i].word;
+			    HASH (hashval, step, wptr, size);
+			    wptr = (ht + hashval)->word;
+			    while (wptr)
+			      {
+				hashval += step;
+				if (hashval >= size)
+				  hashval -= size;
+				wptr = (ht + hashval)->word;
+			      }
+			    ht[hashval] = h->HashTable[i];
+			  }
+		      Xfree (h->HashTable);
+		      h->HashTable = ht;
+		      h->HashSize = size;
+		    }
+		}
+		break;
+	      }
+	  }
+      }
+    else
+      {
+	buffer.huff_encode (res, ht[which]->codes, ht[which]->hd->clens, NULL);
+      }
+  }
+  
+  return COMPALLOK;
+}
+
+
+int process_text_2 (const TagInfo &tagInfo, const TextElArray &doc) {
+  // we need to remember where the last text element ends
+  unsigned char endBit = textOutBuf.GetBtg (); // 8=high bit, 1=low bit
+  unsigned long endPos = textOutBuf.GetBytesWritten () + headLen;
+
+  // process each text element
+  TextElArray::const_iterator here = doc.begin();
+  TextElArray::const_iterator end = doc.end();
+  while (here != end) {
+    // remember current place in compressed text
+    unsigned char startWhich = whichWordType;
+    unsigned char startBit = textOutBuf.GetBtg (); // 8=high bit, 1=low bit
+    unsigned long startPos = textOutBuf.GetBytesWritten () + headLen;
+
+    // compress the text
+    if (compress_text (textOutBuf,
+		       &(here->text[0]),
+		       (*here).text.size(),
+		       whichWordType,
+		       cth.num_of_words) != COMPALLOK)
+      return COMPERROR;
+
+    endBit = textOutBuf.GetBtg (); // 8=high bit, 1=low bit
+    endPos = textOutBuf.GetBytesWritten () + headLen;
+    
+    // update the pointers if this is a level tag
+    if (tagInfo.levelTags.find ((*here).tagName) != tagInfo.levelTags.end()) {
+      if ((*here).elType == OpenTagE) {
+	// set the start of the document
+	textInfoMap[(*here).tagName].SetStart (startPos, startBit, startWhich);
+	
+      } else if ((*here).elType == CloseTagE) {
+	// set the end of the document
+	textInfoMap[(*here).tagName].SetEnd (endPos, endBit);
+	
+      } else {
+	// TextE, nothing needs to be done
+      }
+    }
+    
+    cth.num_of_bytes += (*here).text.size();
+    here++;
+  }
+
+  // close off any unclosed tags
+  CompressTextInfoMap::iterator tiHere = textInfoMap.begin ();
+  CompressTextInfoMap::iterator tiEnd = textInfoMap.end ();
+  while (tiHere != tiEnd) {
+    if ((*tiHere).second.inDoc) (*tiHere).second.SetEnd (endPos, endBit);
+    tiHere++;
+  }
+  
+  // we've processed one more document
+  cth.num_of_docs++;
+
+  return COMPALLOK;
+}
+
+
+static int write_aux_dict (char *fileName) {
+  int i;
+  FILE *aux;
+  if (!(aux = create_file (fileName, TEXT_DICT_AUX_SUFFIX, "wb",
+			   MAGIC_AUX_DICT, MG_MESSAGE)))
+    return COMPERROR;
+  
+  for (i = 0; i <= 1; i++)
+    {
+      aux_frags_header afh;
+      char_pool *cp;
+      
+      afh.num_frags = nht[i].HashUsed;
+      afh.mem_for_frags = 0;
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	afh.mem_for_frags += POOL_SIZE - cp->left;
+      
+      /* [RPAP - Jan 97: Endian Ordering] */
+      HTONUL(afh.num_frags);
+      HTONUL(afh.mem_for_frags);
+      
+      fwrite (&afh, sizeof (afh), 1, aux);
+      
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	fwrite (cp->pool, POOL_SIZE - cp->left, sizeof (u_char), aux);
+    }
+  fclose (aux);
+  return COMPALLOK;
+}
+
+
+static void estimate_compressed_aux_dict (void) {
+  int i;
+  u_long aux_compressed = 0, total_uncomp = 0;
+  for (i = 0; i <= 1; i++)
+    {
+      int j;
+      long chars[256], fchars[256];
+      long lens[16], flens[16];
+      char_pool *cp;
+      memset (chars, '\0', sizeof (chars));
+      memset (lens, '\0', sizeof (lens));
+      for (cp = nht[i].first_pool; cp; cp = cp->next)
+	{
+	  u_char *buf = cp->pool;
+	  while (buf != cp->ptr)
+	    {
+	      int len = *buf++;
+	      lens[len]++;
+	      total_uncomp += len + 4;
+	      for (; len; len--)
+		chars[*buf++]++;
+	    }
+	}
+      for (j = 0; j < 256; j++)
+	if (!chars[j] && PESINAWORD (j) == i)
+	  fchars[j] = 1;
+	else
+	  fchars[j] = chars[j];
+      for (j = 0; j < 16; j++)
+	if (!lens[j])
+	  flens[j] = 1;
+	else
+	  flens[j] = lens[j];
+      
+      aux_compressed += (long unsigned int) ((Calculate_Huffman_Size (16, flens, lens) +
+					      Calculate_Huffman_Size (256, fchars, chars)) / 8);
+      
+    }
+}
+
+
+
+static bool WriteTextIdx (char *fileName, FTextLevel &textLevels) {
+  // create the text index
+  FILE *textIdxFile;
+  if (!(textIdxFile = create_file (fileName, TEXT_IDX_SUFFIX, "w+b",
+				MAGIC_TEXI, MG_MESSAGE)))
+    return false;
+
+  // output each level
+  CompressTextInfoMap::iterator tiHere = textInfoMap.begin ();
+  CompressTextInfoMap::iterator tiEnd = textInfoMap.end ();
+  while (tiHere != tiEnd) {
+    // remember the level information
+    TextLevelInfo levelInfo;
+    levelInfo.levelTag = (*tiHere).first;
+    levelInfo.textIdxPtr = ftell (textIdxFile);
+    levelInfo.numEntries = (*tiHere).second.docPtrs.size();
+    textLevels.levelInfo[levelInfo.levelTag] = levelInfo;
+
+    // write out the index array for this level
+    if (!WriteTextIdxArray (textIdxFile, (*tiHere).second.docPtrs))
+      return false;
+    
+    tiHere++;
+  }
+
+  // close the file
+  fclose (textIdxFile);
+
+  return true;
+}
+
+
+bool WriteTextLevels (char *fileName, const FTextLevel &textLevels) {
+  //  cout << textLevels;
+  
+  // create the text index
+  FILE *textLevelFile;
+  if (!(textLevelFile = create_file (fileName, TEXT_LEVEL_SUFFIX, "w+b",
+				     MAGIC_TEXT_LEVELS, MG_MESSAGE)))
+    return false;
+
+  // output each level
+  if (!textLevels.Write (textLevelFile)) return false;
+  
+  // close the file
+  fclose (textLevelFile);
+
+  return true;
+}
+
+
+int done_text_2 (const TagInfo &/*tagInfo*/, char *fileName) {
+  // write out any remaining bits
+  textOutBuf.encodeDone();
+
+  // write out the compressed text header (with updated statistics)
+  if (fseek (text, sizeof (u_long), SEEK_SET) == -1 || !cth.Write (text))
+    return COMPERROR;
+  fclose (text);
+
+  // write out the text index file and get the level information
+  FTextLevel textLevels;
+  if (!WriteTextIdx (fileName, textLevels)) return COMPERROR;
+  
+  // write out the text level information
+  if (!WriteTextLevels (fileName, textLevels)) return COMPERROR;
+
+  // write out the auxiliary dictionary
+  if (cdh.dict_type != MG_COMPLETE_DICTIONARY &&
+      (cdh.novel_method == MG_NOVEL_DELTA ||
+       cdh.novel_method == MG_NOVEL_HYBRID)) {
+    if (write_aux_dict (fileName) == COMPERROR) return COMPERROR;
+    estimate_compressed_aux_dict ();
+    
+  } else {
+    unlink (make_name (fileName, TEXT_DICT_AUX_SUFFIX, NULL));
+  }
+
+  return (COMPALLOK);
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/words.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/words.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/words.cpp	(revision 21083)
@@ -0,0 +1,100 @@
+/**************************************************************************
+ *
+ * words.cpp -- Functions for parsing out words from the source text
+ * Copyright (C) 1999  Rodger McNab
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+// need this to avoid bizarre compiler problems under VC++ 6.0
+#if defined (__WIN32__) && !defined (GSDL_USE_IOS_H)
+# include <iostream>
+#endif
+
+#include "words.h"
+
+
+/* Takes the place of the old INAWORD macro. It determines
+   whether a given place in a UTF-8 encoded Unicode string
+   is part of a word. */
+int inaword (const u_char *here, const u_char *end) {
+  unsigned short c;
+  if (parse_utf8_char(here, end, &c) > 0) return is_unicode_letdig (c);
+  return 0;
+}
+
+const unsigned char *ParseIndexWord (const unsigned char *textHere,
+				     const unsigned char *textEnd,
+				     UCArray &word) {
+  word.erase (word.begin(), word.end());
+
+  register int charlength = 0;
+  register int length = 0;
+  register int numeric = 0;
+  unsigned short c;
+  
+  charlength = parse_utf8_char (textHere, textEnd, &c);
+  
+  while (length+charlength <= MAXSTEMLEN && charlength > 0 &&
+	 (is_unicode_letter(c) || (is_unicode_digit(c) &&
+				   ++numeric <= MAXNUMERIC))) {
+    while (charlength-- > 0) {
+      word.push_back (*textHere++); length++;
+    }
+    charlength = parse_utf8_char (textHere, textEnd, &c);
+  }
+  
+  return textHere;
+}
+
+const unsigned char *ParseIndexMGWord (const unsigned char *textHere,
+				       const unsigned char *textEnd,
+				       unsigned char *mgWord) {
+  register int charlength = 0;
+  register int length = 0;
+  register int numeric = 0;
+  unsigned short c;
+  
+  charlength = parse_utf8_char (textHere, textEnd, &c);
+  
+  while (length+charlength <= MAXSTEMLEN && charlength > 0 &&
+	 (is_unicode_letter(c) || (is_unicode_digit(c) &&
+				   ++numeric <= MAXNUMERIC))) {
+    while (charlength-- > 0) {
+      mgWord[++length] = *textHere++;
+    }
+    charlength = parse_utf8_char (textHere, textEnd, &c);
+  }
+
+  mgWord[0] = length;
+  
+  return textHere;
+}
+
+const unsigned char *ParseNonindexWord (const unsigned char *textHere,
+					const unsigned char *textEnd) {
+  register int charlength = 0;
+  unsigned short c;
+  
+  charlength = parse_utf8_char(textHere, textEnd, &c);
+  
+  while (charlength > 0 && !is_unicode_letdig(c)) {
+    textHere += charlength;
+    charlength = parse_utf8_char (textHere, textEnd, &c);
+  }
+  
+  return textHere;
+}
Index: /main/tags/2.38/gsdl/src/mgpp/text/words.h
===================================================================
--- /main/tags/2.38/gsdl/src/mgpp/text/words.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/mgpp/text/words.h	(revision 21083)
@@ -0,0 +1,155 @@
+/**************************************************************************
+ *
+ * words.h -- Macros for parsing out words from the source text
+ * Copyright (C) 1994  Neil Sharman
+ *
+ * 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.
+ *
+ **************************************************************************/
+
+#include "sysfuncs.h"
+
+#include "unitool.h"
+#include "UCArray.h"
+
+
+/*
+ * This has been cleaned up by Tim Shimmin. 
+ */
+
+/*
+ * ---NOTE---
+ *
+ * "WORD" refers to a word in the compressed text.
+ * "STEM" or "STEM_WORD" refers to a word for indexing on
+ *
+ */
+
+#define MAXWORDLEN	15
+	/* Maximum length in bytes of any word or non-word. Note that
+	   variations to MAXWORDLEN may have dramatic effects on the rest
+	   of the program, as the length and the prefix match are packed
+	   together into a four bit nibble, and there is not check that
+	   this is possible, i.e., leave MAXWORDLEN alone... */
+
+#define MAXSTEMLEN	255
+	/* Maximum length in bytes of any stem. Note that
+	   variations to MAXSTEMLEN may have dramatic effects on the rest
+	   of the program, , i.e., leave MAXSTEMLEN alone... */
+
+#define MAXNUMERIC	4
+	/* Maximum number of numeric characters permitted in a word.
+	   This avoids long sequences of numbers creating just one
+	   word occurrence for each number. At most 10,000 all numeric
+	   words will be permitted. */
+
+/* [RPAP - Jan 97: Stem Index Change] */
+#define MAXPARAMLEN     20
+        /* Maximum number of bytes to read for a parameter value for a
+	   term in a query. */
+#define WEIGHTPARAM     '/'
+#define STEMPARAM       '#'
+
+/* [RJM 07/97: Ranked Required Terms] */
+#define MUSTMATCHPARAM     '+'
+
+
+#define PESINAWORD(c)      (isalnum(c) || ((c) >= 0x80 && (c) <= 0xff))
+        /* The definition of what characters are permitted in a word.
+	   This macro is pessimistic, you cannot tell from a particular
+	   byte above 0x80 whether it is a character or not. This function
+	   is needed by various functions relating to huffman coding
+	   where frequency counts need to be primed, it should not be
+	   used in parsing the UTF-8 encoded input. */
+
+#ifdef __cplusplus
+extern "C"
+#endif
+int inaword (const u_char *here, const u_char *end);
+        /* Takes the place of the old INAWORD macro. It determines
+	   whether a given place in a UTF-8 encoded Unicode string
+	   is part of a word. */
+
+
+const unsigned char *ParseIndexWord (const unsigned char *textHere,
+				     const unsigned char *textEnd,
+				     UCArray &word);
+const unsigned char *ParseIndexMGWord (const unsigned char *textHere,
+				       const unsigned char *textEnd,
+				       unsigned char *mgWord);
+const unsigned char *ParseNonindexWord (const unsigned char *textHere,
+					const unsigned char *textEnd);
+
+
+
+/* =========================================================================
+ * Macro: PARSE_WORD
+ * Description: 
+ *      Extract a word out for compressing text
+ * Input: 
+ *      s_in = string start in buffer
+ *      end = string end in buffer
+ * Output: 
+ *      Word = extracted word with length in 1st byte
+ *      s_in = ptr to next character in buffer yet to be processed
+ * ========================================================================= */
+#define PARSE_WORD(Word, s_in, end)                                \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    register u_char *wptr = (Word)+1;                              \
+    register int length = 0;                                       \
+    register int numeric = 0;                                      \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (length+charlength <= MAXWORDLEN && charlength > 0 &&    \
+	   (is_unicode_letter(c) || (is_unicode_digit(c) &&        \
+				     ++numeric <= MAXNUMERIC))) {  \
+      while (charlength-- > 0) {                                   \
+        *wptr++ = *(s_in)++; length++;                             \
+      }                                                            \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+    *(Word) = length;                                              \
+  }while(0)
+
+
+
+/* =========================================================================
+ * Macro: PARSE_NON_WORD
+ * Description: 
+ *      Extract a non-word out for storing compressed text
+ * Input: as above
+ * Output: as above
+ * ========================================================================= */
+#define PARSE_NON_WORD(Word, s_in, end)                            \
+  do {                                                             \
+    register int charlength = 0;                                   \
+    register u_char *wptr = (Word)+1;                              \
+    register int length = 0;                                       \
+    unsigned short c;                                              \
+                                                                   \
+    charlength = parse_utf8_char((s_in),(end),&c);                 \
+                                                                   \
+    while (length+charlength <= MAXWORDLEN && charlength > 0 &&    \
+	   !is_unicode_letdig(c)) {                                \
+      while (charlength-- > 0) {                                   \
+        *wptr++ = *(s_in)++; length++;                             \
+      }                                                            \
+      charlength = parse_utf8_char((s_in),(end),&c);               \
+    }                                                              \
+    *(Word) = length;                                              \
+  }while(0)
Index: /main/tags/2.38/gsdl/src/phind/generate/.cvsignore
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/.cvsignore	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/.cvsignore	(revision 21083)
@@ -0,0 +1,4 @@
+Makefile
+suffix
+suffix2
+*.o
Index: /main/tags/2.38/gsdl/src/phind/generate/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/Makefile.in	(revision 21083)
@@ -0,0 +1,68 @@
+###########################################################################
+#
+# Makefile -- Makefile for phind
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000 Gordon Paynter
+#
+#
+# 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.
+#
+###########################################################################
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@
+
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INCLUDES = 
+LDFLAGS = @LDFLAGS@
+DPLIBS = 
+LIBS = @LIBS@
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXX) -c $(DEFS) $(INCLUDES) $(CXXFLAGS) $< 
+
+
+HEADERS = suffix.h phrase.h check.h
+SOURCES = suffix.cpp phrase.cpp
+OBJECTS = phrase.o suffix.o
+EXEC    = suffix
+
+all : $(EXEC)
+
+install : $(EXEC)
+	$(INSTALL) -d ../../../bin/$(GSDLOS)
+	$(INSTALL) -m 775 -s $(EXEC) ../../../bin/$(GSDLOS)
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC)
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
+
+suffix : $(OBJECTS)
+	$(CXX) $(LDFLAGS) -o $@ $(OBJECTS)
+
+
Index: /main/tags/2.38/gsdl/src/phind/generate/check.h
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/check.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/check.h	(revision 21083)
@@ -0,0 +1,130 @@
+// check.h -- manipulate the suffixCheck array
+//
+// The suffixCheck array is used to prevent a phrase being added to
+// the results of getExpansions.  It works by declaring an array that
+// has one bit for each entry in the suffix array, which is cleared at
+// the start of getExpansions.  As getExpansions adds each phrase to
+// the result set, we set the bits in the suffixCheck array that
+// correspond to the positions of of the phrase in the suffixArray.
+
+// (The point is that getExpansions can later check whether a phrase
+// or its prefix has been seen before by looking up the bit
+// corresponding to its first occurence in the suffixCheck array: if
+// the bit is set, a subphrase of this phrase is already in the
+// results already, and the current phrase can be ignored.)
+
+#include "suffix.h"
+
+// The suffixCheck array
+#if defined (__WIN32__)
+typedef unsigned char check;
+#else
+#include <inttypes.h>
+typedef uint8_t check;
+#endif
+
+check *suffixCheck;
+
+// The length of the suffixCheck array
+cellcount checkLength;
+
+// Some useful bitmask constants 
+const check ALLBITS        = 255;
+const check LEFTMOSTBIT    = static_cast<check>(ALLBITS << 7);
+const check LEFTMOSTBITS[] = {static_cast<check>(ALLBITS << 8), 
+			      static_cast<check>(ALLBITS << 7), 
+			      static_cast<check>(ALLBITS << 6), 
+			      static_cast<check>(ALLBITS << 5), 
+			      static_cast<check>(ALLBITS << 4),
+			      static_cast<check>(ALLBITS << 3), 
+			      static_cast<check>(ALLBITS << 2), 
+			      static_cast<check>(ALLBITS << 1),  
+			      static_cast<check>(ALLBITS << 0)};
+
+
+// Allocate the initial memory for suffixCheck
+inline void allocateSuffixCheck(cellcount number_of_symbols) 
+{
+  checkLength = number_of_symbols / (sizeof(check) * 8) + 1;
+  suffixCheck = new check[checkLength];
+  if (suffixCheck == NULL) {
+    cerr << "Suffix error: out of memory allocating suffixCheck array" << endl; 
+    exit(2);
+  }
+  memset(suffixCheck, 0, sizeof(check) * checkLength);
+}
+
+
+// Set all bits in suffixCheck to 0
+inline void clearSuffixCheck() 
+{
+  memset(suffixCheck, 0, sizeof(check) * checkLength);
+}
+
+
+// Get the value of a particular bit in suffixCheck
+inline int getSuffixCheck(cellindex position) 
+{
+  cellindex cell = position >> 3;
+  check remainder = position & 0x07; // the last 3 bits
+  if (suffixCheck[cell] & (LEFTMOSTBIT >> remainder)) {
+    return 1;
+  }
+  return 0;
+}                                                                               
+
+// Set the value of a bit in suffixCheck to 1
+inline void setSuffixCheck(cellindex suff) 
+{
+  cellindex cell = suff >> 3;
+  check remainder = suff & 0x07u; // the last 3 bits
+  suffixCheck[cell] |= (LEFTMOSTBIT >> remainder);
+}  
+
+
+// Set the bits in a cell in the suffixArray.
+// Bits are indexed 0-7.
+inline void setCellBits(cellindex cell_offset, unsigned first_bit, unsigned last_bit) 
+{
+  unsigned number_of_bits = last_bit - first_bit + 1;
+  check mask = (LEFTMOSTBITS[number_of_bits] >> first_bit);
+  suffixCheck[cell_offset] |= mask;
+}
+
+
+inline void setSuffixCheck(cellindex first, cellindex last) 
+{
+  // Find the first and last cells in which bits are set
+  cellindex first_cell = first >> 3;
+  cellindex last_cell = last >> 3;
+
+  // If all the values are in the same cell, set them
+  if (first_cell == last_cell) {
+    setCellBits(first_cell, (first & 0x07u), (last & 0x07u));
+    return;
+  }
+
+  // Set the bits in the first and last cells
+  setCellBits(first_cell, (first & 0x07u), 7);
+  setCellBits(last_cell, 0, (last & 0x07u));
+
+  // Set the bits in the intermediate cells
+  ++first_cell;
+  if(last_cell > first_cell)
+    memset(suffixCheck + first_cell, ALLBITS, 
+	   (last_cell - first_cell) * sizeof(check));
+}
+
+
+// Print the suffixCheck array (for debugging)
+void printSuffixCheck() 
+{
+  for (cellcount i = 0; i < checkLength; ++i) {
+    cout << "cell " << i << "  \t";
+    cout << "(" << (i * 8) << "-" << (i * 8 + 7) << ")    \t";
+    for (cellindex j = 0; j < 8; ++j)
+      cout << getSuffixCheck(i * 8 + j);
+    cout << " (" << (unsigned int) suffixCheck[i] << ")\n";
+  }
+}
+
Index: /main/tags/2.38/gsdl/src/phind/generate/phrase.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/phrase.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/phrase.cpp	(revision 21083)
@@ -0,0 +1,854 @@
+/**********************************************************************
+ *
+ * phrase.cpp -- implementation of the phrase object used by suffix.cpp
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <assert.h>
+#include <stdio.h>
+
+#if defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#else
+#  include <vector>
+#endif
+
+#if defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#include "suffix.h"
+#include "phrase.h"
+
+
+// Phrase constructor functions
+
+
+Phrase::Phrase(symbol *words, cellcount size, int direction) {
+  empty();
+  length = size;
+
+  if (direction == SUFFIX) {
+     forward = words;
+     back = forward + size - 1;
+  } else {
+    back = words;
+    forward = back - size + 1;
+  }
+}
+
+
+Phrase::Phrase() {
+  empty();
+}
+
+
+Phrase::Phrase(const Phrase &p) {
+  forward = p.forward;
+  back = p.back;
+  length = p.length;
+
+  suffixFound = p.suffixFound;
+  prefixFound = p.prefixFound;
+
+  firstSuffix = p.firstSuffix;
+  lastSuffix  = p.lastSuffix;
+  firstSuffixIndex = p.firstSuffixIndex;
+  lastSuffixIndex  = p.lastSuffixIndex;
+  suffixFrequency  = p.suffixFrequency;
+
+  firstPrefix = p.firstPrefix;
+  lastPrefix  = p.lastPrefix;
+  firstPrefixIndex = p.firstPrefixIndex;
+  lastPrefixIndex  = p.lastPrefixIndex;
+  prefixFrequency  = p.prefixFrequency;
+
+  uniqueSuffixExtension = p.uniqueSuffixExtension;
+  uniquePrefixExtension = p.uniquePrefixExtension;
+}
+
+
+// Empty the contents of a phrase
+
+int Phrase::empty() {
+
+  forward = back = NULL;
+  length = 0;
+
+  suffixFound = prefixFound = 0;
+  firstSuffix = firstPrefix = NULL;
+  lastSuffix = lastPrefix = NULL;
+
+  firstSuffixIndex = lastSuffixIndex = suffixFrequency = 0;
+  firstPrefixIndex = lastPrefixIndex = prefixFrequency = 0;
+
+  uniqueSuffixExtension = uniquePrefixExtension = -1;
+
+  return 0;
+}
+
+// Remove the details of the location where a suffix/prefix
+// is found in the array.
+
+int Phrase::clearSuffix() {
+  suffixFound = 0;
+  firstSuffix = lastSuffix = NULL;
+  firstSuffixIndex = lastSuffixIndex = suffixFrequency = 0;
+  uniqueSuffixExtension = -1;
+  return 0;
+}
+
+int Phrase::clearPrefix() {
+  prefixFound = 0;
+  firstPrefix = lastPrefix = NULL;
+  firstPrefixIndex = lastPrefixIndex = prefixFrequency = 0;
+  uniquePrefixExtension = -1;
+  return 0;
+}
+
+// Increase the length of s phrase
+//
+// We increase the length of a string "in place".  When we expand
+// the suffix, however, we invalidate the prefix data, and vice-versa.
+
+int Phrase::increaseSuffixLength(cellcount l) {
+  length = l;
+  clearPrefix();
+  back = forward + l - 1;
+  return 0;
+}
+
+int Phrase::increasePrefixLength(cellcount l) {
+  length = l;
+  clearSuffix();
+  forward = back - l + 1;
+  return 0;
+}
+
+// Shorten a phrase by one symbol
+int Phrase::shortenByOneAtSuffix() {
+  --length;
+  --back;
+  if (phraseMode==STOPWORDS) {
+    while (*back >=firstStopSymbol && *back <= lastStopSymbol) {
+      --length;
+      --back;
+    }
+  }  
+  clearSuffix();
+  clearPrefix();
+  return 0;
+}
+
+int Phrase::shortenByOneAtPrefix() {
+  --length;
+  ++forward;
+  if (phraseMode==STOPWORDS) {
+    while (*forward >=firstStopSymbol && *forward <= lastStopSymbol) {
+      --length;
+      ++forward;
+    }
+  }
+  clearSuffix();
+  clearPrefix();
+  return 0;
+}
+
+
+// Output a phrase to a stream
+ostream &operator<<(ostream &stream, const Phrase &phrase)
+{
+  assert(phrase.forward);
+  symbol *s = phrase.forward;
+
+  stream << "s" << *s++;
+  for (cellcount i = 1; i < phrase.length; i++)
+    stream << " s" << *s++;
+
+  return stream;
+}
+
+
+// Convert the phrase to a string
+// Note thgat you have to delete the memory yourself.
+char *Phrase::toString() 
+{
+  assert(forward);
+
+  char *str;
+  str = new char[length*20];
+  symbol *s = forward;
+  sprintf(str, "s%d", *s++);
+
+  for (cellcount i = 1; i < length; i++) {
+    sprintf(str, "%s s%d", str, *s++);
+  }
+
+  return str;
+}
+
+
+// Compare a phrase to an another array of symbols
+//
+// Given an array of words with a specified length, 
+// compare those words to this phrase.
+//
+// Return 0 if the two phrases are the same over length length
+// Return 1 if the phrase is "greater" than tyhe words, or
+// Return -1 if the phrase is less.
+
+int Phrase::compareSuffix(symbol *words, cellcount length) {
+  assert(forward);
+  symbol *p = forward;
+  
+  for (cellcount i = 0; i < length; i++) {
+    if (*p > *words) {
+      return 1;
+    } else if (*p < *words) {
+      return -1;
+    } else {
+      *p++;
+      *words++;
+    }
+  }
+
+  return 0;
+
+}
+
+int Phrase::comparePrefix(symbol *words, cellcount length) {
+  
+  assert(back);
+  symbol *p = back;
+  
+  for (cellcount i = 0; i < length; i++) {
+    if (*p > *words) {
+      return -1;
+    } else if (*p < *words) {
+      return 1;
+    } else {
+      *p--;
+      *words--;
+    }
+  }
+
+  return 0;
+
+}
+
+
+// Does the phrase have a unique suffix/prefix extension?
+//
+// For suffix:
+//   If uniqueSuffixExtensions is 1, then phrase has some unique expansion. 
+//   If it is 0 then it does not.  If it is -1 then we don't know, and have
+//   to calculate it from the suffix array.  Same goes for prefixes.
+
+int Phrase::hasUniqueSuffixExtension() {
+
+  // if we don't know, then work it out
+  if (uniqueSuffixExtension == -1) {
+
+    ensureSuffixFound();
+
+    // pointers to the phrase's first and last occurances in te suffixArray
+    symbol *fst = firstSuffix + length;
+    symbol *lst = lastSuffix + length;
+
+    // in ANYPHRASE mode, simply check the next symbol
+    if (phraseMode == ANYPHRASE) {
+      if ((*fst == *lst) && (*fst > LASTDELIMITER)) {
+	uniqueSuffixExtension = 1;
+      } else {
+	uniqueSuffixExtension = 0;
+      }
+    }
+    // in STOPWORDS mode, make sure there is a unique next content symbol
+    else {
+      uniqueSuffixExtension = 0;
+      while ((*fst == *lst) && (*fst > LASTDELIMITER)) {
+	if (*fst >= firstContentSymbol) {
+	  uniqueSuffixExtension = 1;
+	  break;
+	}
+	fst++;
+	lst++;
+      }
+    }
+  }
+
+  return uniqueSuffixExtension;
+}
+
+int Phrase::hasUniquePrefixExtension() {
+
+  // if we don't know, then work it out
+  if (uniquePrefixExtension == -1) {
+
+    ensurePrefixFound();
+
+    // pointers to the phrase's first and last occurances in the prefixArray
+    symbol *fst = firstPrefix - length;
+    symbol *lst = lastPrefix - length;
+
+    // in ANYPHRASE mode, simply check the next symbol
+    if (phraseMode == ANYPHRASE) {
+      if ((*fst == *lst) && (*fst > LASTDELIMITER)) {
+	uniquePrefixExtension = 1;
+      } else {
+	uniquePrefixExtension = 0;
+      }
+    }
+    // in STOPWORDS mode, make sure there is a unique next content symbol
+    else {
+      uniquePrefixExtension = 0;
+      while ((*fst == *lst) && (*fst > LASTDELIMITER)) {
+	if (*fst >= firstContentSymbol) {
+	  uniquePrefixExtension = 1;
+	  break;
+	}
+	fst--;
+	lst--;
+      }
+    }
+  }
+
+  return uniquePrefixExtension;
+}
+
+
+// Expand a phrase with a unique suffix/prefix by 1 symbol
+//
+// Note that in STOPWORDS mode a "unique extension" means a unique
+// extension that ends on a content symbol.  Although we may extend 
+// such a phrase by 2 or more symbols, we will only extend it by a
+// single content symbol.
+
+int Phrase::expandUniqueSuffixExtensionByOne() {
+  assert(suffixFound);
+  assert(uniqueSuffixExtension == 1);
+
+  // in ANYPHRASE mode, expand the phrase by one symbol
+  if (phraseMode == ANYPHRASE) {
+    increaseSuffixLength(length + 1);
+  }
+  // in STOPWORDS mode, expand the phrase up to the next content symbol
+  else {
+    symbol *next = firstSuffix + length;
+    cellcount newlength = length + 1;
+
+    while (*next < firstContentSymbol) {
+      next++;
+      newlength++;
+    }
+    increaseSuffixLength(newlength);
+  }
+
+  uniqueSuffixExtension = -1;
+  return 0;
+}
+
+int Phrase::expandUniquePrefixExtensionByOne() {
+  assert(prefixFound);
+  assert(uniquePrefixExtension == 1);
+
+  // in ANYPHRASE mode, expand the phrase by one symbol
+  if (phraseMode == ANYPHRASE) {
+    increasePrefixLength(length + 1);
+  }
+  // in STOPWORDS mode, expand the phrase to the next content symbol
+  else {
+    symbol *next = firstPrefix - length;
+    cellcount newlength = length + 1;
+    while (*next < firstContentSymbol) {
+      next--;
+      newlength++;
+    }
+    increasePrefixLength(newlength);
+
+  }
+
+  uniquePrefixExtension = -1;
+  return 0;
+}
+
+
+// Find the phrase in a suffixArray
+//
+// Given a suffix array, find the first and last occurances of the phrase.
+// The begin and end parameters identify which cells to search (inclusive). 
+
+int Phrase::findFirstAndLastSuffix() {
+  
+  return findFirstAndLastSuffix(0, inputLength-1);
+}
+
+int Phrase::findFirstAndLastSuffix(cellindex begin, cellindex end) {
+
+  // First find *any* occurance of the phrase
+  assert(begin <= end);
+
+  // if we're only searching one cell, it is very easy
+  if (begin == end) {
+    assert(compareSuffix(suffixArray[begin], length) == 0);
+    firstSuffix = lastSuffix = suffixArray[begin];
+    firstSuffixIndex = lastSuffixIndex = begin;
+    suffixFrequency = 1;
+    suffixFound = 1;
+    return 0;
+  }
+
+  cellindex c;
+  int cmp;
+
+  do {
+    c = (end + begin) / 2;
+    cmp = compareSuffix(suffixArray[c], length);
+    if (cmp == 1) {
+      // target phrase is lower than phrase at suffixArray[c]
+      begin = c + 1;
+    } else if (cmp == -1) {
+      // target phrase is higher than phrase at suffixArray[c]
+      end = c - 1;
+    }
+  } while (cmp != 0);
+    
+  cellindex lastbegin = c;
+  cellindex lastend = end;
+
+  // Next find the first occurance of the phrase.
+  // We know that the first occurance must be between the 
+  // current value of begin and the current value of c.
+  end = c;
+
+  do {
+    if (begin == end) {
+      c = begin;
+      cmp = 0;
+    } else {
+      c = (begin + end) / 2;
+      cmp = compareSuffix(suffixArray[c], length);
+      if (cmp == 1) {
+	// target phrase is lower than phrase at suffixArray[c]
+	begin = c + 1;
+      } else {
+	assert(cmp == 0);
+	// target phrase is the same as the phrase at suffixArray[c].  However,
+	// to find the first occurance, suffixArray[c] must be the same as the 
+	// phrase, but suffixArray[c-1] must be different.
+	if (c>0) {
+	  cmp = compareSuffix(suffixArray[c-1], length);
+	  if (cmp == 0) {
+	    end = c - 1;
+	    assert(end >= begin);
+	    cmp = 1;
+	  } else {
+	    cmp = 0;
+	  }
+	}
+      }
+    }
+  } while (cmp != 0);
+
+  // we have found the first location
+  firstSuffixIndex = c;
+  firstSuffix = suffixArray[c];
+  
+  // Next find the last occurance of the phrase.
+  // We previously stored some bounds for its loccation.
+  begin = lastbegin;
+  end = lastend;
+  
+  do {
+    if (begin == end) {
+      c = begin;
+      cmp = 0;
+    } else {
+      c = (begin + end) / 2;
+      cmp = compareSuffix(suffixArray[c], length);
+      if (cmp == -1) {
+	// target phrase is greater than phrase at suffixArray[c]
+	end = c - 1;
+      } else {
+	assert(cmp == 0);
+	// target phrase is the same as the phrase at suffixArray[c].  However,
+	// to find the last occurance, one of two additional condiditons must be met:
+	// either c must be the very last cell in the array, or
+	// suffixArray[c+1] must be different from phrase
+	if (c < inputLength-1) {
+	  cmp = compareSuffix(suffixArray[c+1], length);
+	  if (cmp == 0) {
+	    begin = c + 1;
+	    cmp = -1;
+	  } else {
+	    cmp = 0;
+	  }
+	} 
+      }
+    }
+  } while (cmp != 0);
+  
+  lastSuffixIndex = c;
+  lastSuffix = suffixArray[c];
+  suffixFrequency = lastSuffixIndex - firstSuffixIndex + 1;
+  suffixFound = 1;
+
+  return 0;
+}
+
+
+// Find the phrase in a prefix array
+//
+// Given a prefix array, find the first and last occurances of the phrase.
+// The begin and end parameters identify which cells to search (inclusive). 
+
+int Phrase::findFirstAndLastPrefix() {
+  return findFirstAndLastPrefix(0, inputLength-1);
+}
+
+int Phrase::findFirstAndLastPrefix(cellindex begin, cellindex end) {
+
+  // First find *any* occurance of the phrase
+  assert(begin <= end);
+
+  // if we're only searching one cell, it is very easy
+  if (begin == end) {
+    assert(comparePrefix(prefixArray[begin], length) == 0);
+    firstPrefix = lastPrefix = prefixArray[begin];
+    firstPrefixIndex = lastPrefixIndex = begin;
+    prefixFrequency = 1;
+    prefixFound = 1;
+    return 0;
+  }
+
+  cellindex c;
+  int cmp;
+
+  do {
+    c = (end + begin) / 2;
+    cmp = comparePrefix(prefixArray[c], length);
+    if (cmp == 1) {
+      begin = c + 1;
+    } else if (cmp == -1) {
+      end = c - 1;
+    }
+  } while (cmp != 0);
+    
+  cellindex lastbegin = c;
+  cellindex lastend = end;
+
+  // Next find the first occurance of the phrase.
+  // We know that the first occurance must be between the 
+  // current value of begin and the cureent value of c.
+  end = c;
+
+  do {
+    if (begin == end) {
+      c = begin;
+      cmp = 0;
+    } else {
+      c = (begin + end) / 2;
+      cmp = comparePrefix(prefixArray[c], length);
+      if (cmp == 1) {
+	// target phrase is lower than phrase at prefixArray[c]
+	begin = c + 1;
+      } else {
+	assert(cmp == 0);
+	// target phrase is the same as the phrase at prefixArray[c].  However, to
+	// find the first occurance, one of two additional condiditons must be met:
+	// either  c == the first cell in prefix array
+	// or      prefixArray[c-1] != phrase.
+	if (c > 0) {
+	  cmp = comparePrefix(prefixArray[c-1], length);
+	  if (cmp == 0) {
+	    end = c - 1;
+	    assert(end >= begin);
+	    cmp = 1;
+	  } else {
+	    cmp = 0;
+	  }
+	}
+      }
+    }
+  } while (cmp != 0);
+
+  // we have found the first location
+  firstPrefixIndex = c;
+  firstPrefix = prefixArray[c];
+
+  // Next find the last occurance of the phrase.
+  // We previously stored some bounds for its loccation.
+  begin = lastbegin;
+  end = lastend;
+  
+  do {
+    if (begin == end) {
+      c = begin;
+      cmp = 0;
+    } else {
+      c = (begin + end) / 2;
+      cmp = comparePrefix(prefixArray[c], length);
+      if (cmp == -1) {
+	// target phrase is greater than phrase at prefixArray[c]
+	end = c - 1;
+      } else {
+	assert(cmp == 0);
+	// target phrase is the same as the phrase at prefixArray[c].  However,
+	// to find the last occurance, prefixArray[c] must be the same as the 
+	// phrase, but prefixArray[c+1] must be different.
+	cmp = comparePrefix(prefixArray[c+1], length);
+	if (cmp == 0) {
+	  begin = c + 1;
+	  cmp = -1;
+	} else {
+	  cmp = 0;
+	}
+      } 
+    }
+  } while (cmp != 0);
+  
+  lastPrefixIndex = c;
+  lastPrefix = prefixArray[c];
+  prefixFrequency = lastPrefixIndex - firstPrefixIndex + 1;
+  prefixFound = 1;
+
+  return 0;
+}
+
+
+// Calculate a set of initial suffix/prefix candidates
+//
+// Expand the phrase to find the initial 
+// set of candidates that may be extensions of that phrase,
+// and add them to the end of the results vector
+
+void Phrase::initialSuffixCandidates(vector<Phrase> &results) {
+
+  ensureSuffixFound();
+  Phrase next;
+  cellindex i = firstSuffixIndex;
+
+  // Find all the expansions of Phrase p
+  while (i <= lastSuffixIndex) {
+
+    // create new phrase exactly one longer than the current one
+    next = newPhraseShortestSuffixExpansion(i);
+
+    // If the expansion occurs more than once and is not delimited, expand it
+    if ((*(next.back) > LASTDELIMITER) && (next.suffixFrequency >= 2)) {
+      next.expandWhileUniqueSuffixExtension();
+      results.push_back(next);
+    }
+    
+    // Move onto the next expansion
+    i = next.lastSuffixIndex + 1;
+  }
+}
+
+
+void Phrase::initialPrefixCandidates(vector<Phrase> &results) {
+
+  ensurePrefixFound();
+  Phrase next;
+  cellindex i = firstPrefixIndex;
+
+  // Find all the expansions of Phrase p
+  while (i <= lastPrefixIndex) {
+
+    // create new phrase exactly one longer than the current one
+    next = newPhraseShortestPrefixExpansion(i);
+
+    // If the expansion occurs more than once and is not delimited, expand it
+    if ((*(next.forward) > LASTDELIMITER) && (next.prefixFrequency >= 2)) {
+      next.expandWhileUniquePrefixExtension();
+      results.push_back(next);
+    }
+    
+    // Move onto the next expansion
+    i = next.lastPrefixIndex + 1;
+  }
+}
+
+
+// Create a new phrase that is longer then the current one, but as short
+// as possible.  In ANYPHRASE mode this means the new phrase is exactly
+// one symbol longer than the current one, but in STOPWORD mode the expansion
+// must introduce a new content symbol
+//
+// Note that we never expand across delimiters; if we encounter a delimiter
+// then this becomes the "end" symbol of the phrase.  The calling function 
+// should check for this condition.
+
+Phrase Phrase::newPhraseShortestSuffixExpansion(cellindex i) {
+  
+  // create a new phrase exactly one symbol longer than the current one
+  Phrase p(suffixArray[i], length + 1, SUFFIX);
+
+  if (phraseMode == STOPWORDS) {
+    // in STOPWORDS mode we must introduce a new content symbol
+    while ((*(p.back) >= firstStopSymbol) &&
+	   (*(p.back) <= lastStopSymbol)) {
+      p.increaseSuffixLength(p.length + 1);
+    }
+  }
+
+  p.findFirstAndLastSuffix(i, lastSuffixIndex);
+  return p;
+}
+
+Phrase Phrase::newPhraseShortestPrefixExpansion(cellindex i) {
+  
+  // create a new phrase exactly one symbol longer than the current one
+  Phrase p(prefixArray[i], length + 1, PREFIX);
+
+  if (phraseMode == STOPWORDS) {
+    // in STOPWORDS mode we must introduce a new content symbol
+    while ((*(p.forward) >= firstStopSymbol) &&
+	   (*(p.forward) <= lastStopSymbol)) {
+      p.increasePrefixLength(p.length + 1);
+    }
+  }
+
+  p.findFirstAndLastPrefix(i, lastPrefixIndex);
+  return p;
+}
+
+
+// Expand a phrase until it no longer has a unique suffix extension
+// 
+// If the phrase only occurs once in the suffix array, do nothing.
+//
+// If we are in stopwords mode then we expand if there is a unique 
+// suffix expansion and this expansion is a content word.  We do this
+// with the content_len variable, which holds the length of the longest
+// phrase ending in a content word. 
+
+int Phrase::expandWhileUniqueSuffixExtension() {
+  ensureSuffixFound();
+
+  // if the phrase occurs only once, do nothing
+  if (suffixFrequency < 2)
+    return 0;
+
+  // if we already know there's no unique suffix extension, do nothing
+  if (uniqueSuffixExtension == 0)
+    return 0;
+
+  // count the length over which the cells are the same
+  // and no delimiter is crossed.
+  symbol *fst = firstSuffix;
+  symbol *lst = lastSuffix;
+  cellindex len = 0;
+  cellindex content_len = 0;
+
+  // Calculate the length over which the phrases match
+  while((*fst == *lst) && (*fst > LASTDELIMITER)) {
+    len++;
+    if (*fst > lastStopSymbol) content_len = len;
+    fst++;
+    lst++;
+  }
+
+  // in ANYPHRASE mode, expand the phrase for as long as possible
+  if (phraseMode == ANYPHRASE) {
+    if (len > length) {
+      increaseSuffixLength(len);
+    }
+  } 
+  // in STOPWORDS mode, expand only as far as the last contentword
+  else {
+    if (content_len > length) {
+      increaseSuffixLength(content_len);
+    }
+  }
+
+  uniqueSuffixExtension = 0;
+  return 0;
+}
+
+int Phrase::expandWhileUniquePrefixExtension() {
+  ensurePrefixFound();
+
+  // if the phrase occurs only once, do nothing
+  if (prefixFrequency < 2)
+    return 0;
+
+  // if we already know there's no unique extension, do nothing
+  if (uniquePrefixExtension == 0)
+    return 0;
+
+  // count the length over which the cells are the same
+  // and no delimiter is crossed.
+  symbol *fst = firstPrefix;
+  symbol *lst = lastPrefix;
+  cellindex len = 0;
+  cellindex content_len = 0;
+
+  // Calculate the length over which the phrases match
+  while((*fst == *lst) && (*fst > LASTDELIMITER)) {
+    len++;
+    if (*fst > lastStopSymbol) content_len = len;
+    fst--;
+    lst--;
+  }
+
+  // in ANYPHRASE mode, expand the phrase for as long as possible
+  if (phraseMode == ANYPHRASE) {
+    if (len > length) {
+      increasePrefixLength(len);
+    }
+  }
+  // in STOPWORDS mode, expand only as far as the last contentword
+  else {
+    if (content_len > length) {
+      increasePrefixLength(content_len);
+    }
+  }
+
+  uniquePrefixExtension = 0;
+  return 0;
+}
+
+// Compare the length of two phrases
+//
+// Given two phrases, return true if the first is shorter/longer,
+// otherwise return false.  For use in various sort functions.
+
+bool isShorter(Phrase p1, Phrase p2) {
+  if (p1.length < p2.length) {
+    return true;
+  }
+  return false;
+}
+
+bool isLonger(Phrase p1, Phrase p2) {
+  if (p1.length > p2.length) {
+    return true;
+  }
+  return false;
+}
+
+
Index: /main/tags/2.38/gsdl/src/phind/generate/phrase.h
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/phrase.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/phrase.h	(revision 21083)
@@ -0,0 +1,162 @@
+/**********************************************************************
+ *
+ * phrase.h -- definition of the phrase object used by suffix.cpp
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef PHRASE_H
+#define PHRASE_H
+
+// use the standard namespace
+#if !defined (GSDL_NAMESPACE_BROKEN)
+#if defined(GSDL_USE_OBJECTSPACE)
+using namespace ospace::std;
+#else
+using namespace std;
+#endif
+#endif
+
+#if defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#else
+#  include <vector>
+#endif
+
+#include "suffix.h"
+
+class Phrase {
+
+public:
+
+  // The phrase itself is stored with two pointers: forward points to
+  // its first cell, back points to its last.  The length is always
+  // stored in length.  If one of these is set, all must be set, and
+  // it must be true that (forward + length - 1) = back.
+  symbol *forward;
+  symbol *back;
+  cellcount length;
+  
+  // Phrase location in the suffix array
+  int suffixFound;
+  symbol *firstSuffix;
+  symbol *lastSuffix;
+  cellindex firstSuffixIndex;
+  cellindex lastSuffixIndex;
+  cellcount suffixFrequency;
+
+  // Phrase location in the prefix array
+  int prefixFound;
+  symbol* firstPrefix;
+  symbol* lastPrefix;
+  cellindex firstPrefixIndex;
+  cellindex lastPrefixIndex;
+  cellcount prefixFrequency;
+
+  // Constructor functions
+  Phrase();
+  Phrase(const Phrase &p);
+
+  // A "partial" constructor: the first argument is an array of words,
+  // second is its length, third is the direction (SUFFIX or PREFIX)
+  // in which the words should be read (defaults to SUFFIX).
+  Phrase(symbol *words, cellcount size, int direction);
+
+  // Represent the phrase as an arracy of characters
+  // You will have to call "delete []" on the array returned. 
+  char *toString();
+
+  // Find an initial set of candidate phrases in the suffix/prefix array
+  void initialSuffixCandidates(vector<Phrase> &results);
+  void initialPrefixCandidates(vector<Phrase> &results);
+  
+  // Does the phrase have a unique extension?
+  int hasUniqueSuffixExtension();
+  int hasUniquePrefixExtension();
+  
+  // Extend a phrase by exactly one symbol
+  int expandUniquePrefixExtensionByOne();
+  int expandUniqueSuffixExtensionByOne();
+
+  // Extend a phrase until it no longer has a unique extanesion
+  int expandWhileUniqueSuffixExtension();
+  int expandWhileUniquePrefixExtension();
+
+  // Shorten a phrase by one symbol
+  int shortenByOneAtSuffix();
+  int shortenByOneAtPrefix();
+
+  // Find the phrase in the suffix/prefix array
+  int findFirstAndLastSuffix();
+  int findFirstAndLastPrefix();
+  int findFirstAndLastSuffix(cellindex begin, cellindex end);
+  int findFirstAndLastPrefix(cellindex begin, cellindex end);
+
+  // Make sure the phrase location in the suffix/prefix array is known
+  inline void Phrase::ensureSuffixFound() {
+    if (!suffixFound)
+      findFirstAndLastSuffix();
+  }
+  inline void Phrase::ensurePrefixFound() {
+    if (!prefixFound)
+      findFirstAndLastPrefix();
+  }
+
+  // Output a phrase to a stream
+  friend ostream &operator<<(ostream &stream, const Phrase &phrase);
+
+  int uniqueSuffixExtension;
+  int uniquePrefixExtension;
+
+private:
+
+  // Does the phrase have a unique suffix/prefix extension?
+  // if yes, then 1; if no then 0; if unknown then -1;
+
+  // reset a phrase
+  int empty();
+
+  // reset phrase information relating to location in suffix/prefix array
+  int clearSuffix();
+  int clearPrefix();
+
+  // increase the length of a phrase "in place"
+  int Phrase::increaseSuffixLength(cellcount l);
+  int Phrase::increasePrefixLength(cellcount l);
+    
+  // Compare the phrase to a given array of symbols
+  int compareSuffix(symbol *words, cellcount length);
+  int comparePrefix(symbol *words, cellcount length);
+
+  // Create a new phrase that is longer than this one, yet as short as possible.
+  Phrase Phrase::newPhraseShortestSuffixExpansion(cellindex i);
+  Phrase Phrase::newPhraseShortestPrefixExpansion(cellindex i);
+
+};
+
+
+bool isShorter(Phrase p1, Phrase p2);
+bool isLonger(Phrase p1, Phrase p2);
+
+#endif
+
Index: /main/tags/2.38/gsdl/src/phind/generate/suffix.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/suffix.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/suffix.cpp	(revision 21083)
@@ -0,0 +1,1092 @@
+/**********************************************************************
+ *
+ * Suffix.cpp -- Extract the repeated phrases in the input with suffix
+ *               and prefix arrays (cgn & gwp's simpler algorithm,
+ *               and kjm's improvements).
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software from the 
+ * New Zealand Digital Library Project at the University of Waikato, 
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(GSDL_USE_IOS_H)
+#  include <fstream.h>
+#  include <iostream.h>
+#else
+#  include <fstream>
+#  include <iostream>
+#endif
+
+#if defined(GSDL_USE_STL_H)
+#  if defined(GSDL_USE_ALGO_H)
+#    include <algo.h>
+#  else
+#    include <algorithm.h>
+#  endif
+#  include <vector.h>
+#else
+#  include <algorithm>
+#  include <vector>
+#endif
+
+#include "suffix.h"
+#include "phrase.h"
+#include "check.h"
+
+// Global variables declared in suffix.h
+cellcount inputLength;
+
+symbol   *symbols;
+symbol  **suffixArray;
+symbol  **prefixArray;
+
+// How many documents are in this collection?
+cellcount numberOfDocuments;
+symbol  **documentArray;
+
+
+// Do we accept any phrase, or do we eliminate those ending with stopwords ?
+int phraseMode = ANYPHRASE; //STOPWORDS;
+
+
+// The filestem of the collection's phindex directory
+char collection[FILENAME_MAX];
+
+
+// The ranges of the stopword and content-word symbols for the collection
+symbol firstStopSymbol = 0;
+symbol lastStopSymbol = 0;
+symbol firstContentSymbol = 0;
+symbol lastContentSymbol = 0;
+
+
+// Some useful comparison functions, defined below.
+int suffixCompare(const void *, const void *);
+int prefixCompare(const void *, const void *);
+int pointerCompare(const void *, const void *);
+
+                                           
+// Functions for implementing "phrase memory".  These let us "remember"
+// each phrase that we've expanded without using too much memory.
+void initialisePhraseMemory();
+void rememberThisPhrase(cellindex index, cellcount length);
+bool isPhraseStored(cellindex index, cellcount length);
+void deletePhraseMemory();
+
+
+// how much output do we want?
+int verbosity = 1;
+
+
+// Get a phrase's expansions
+//
+// Get the set of "minimal", "maximal", non-unique expansions of a
+// phrase p, using the simpler algorithm that Craig and Gordon came up
+// with at Google.
+//
+// Returns a vector of Expansions.
+
+void getExpansions(Phrase &p, vector<Phrase> &results) {
+
+  // 1. Get the initial candidates
+  vector<Phrase> candidates;
+  p.initialSuffixCandidates(candidates);
+  int suffcands = candidates.size();
+  p.initialPrefixCandidates(candidates);
+
+  if (candidates.size() == 0)
+    return;
+
+  vector<Phrase>::iterator i;
+  for (i = candidates.begin(); i != candidates.end(), suffcands>0; ++i, --suffcands) {
+    i->expandWhileUniquePrefixExtension();
+    i->ensureSuffixFound();
+  }
+  for (i; i != candidates.end(); ++i) {
+    i->expandWhileUniqueSuffixExtension();
+  }
+
+  // 3. Ensure minimality: ignore phrases whose subphrases are also found
+  results.clear();
+
+  // Initialise the candidates, check array, and various variables.
+  sort(candidates.begin(), candidates.end(), isShorter);
+  unsigned minimum_length = candidates.begin()->length;
+  clearSuffixCheck();
+  
+  // Try to add each candidate to the results set, ignoring the non-minimal
+  for (vector<Phrase>::iterator candidate = candidates.begin(); 
+       candidate != candidates.end(); candidate++) {
+
+    // Make a copy of candidate to mutilate while performing sub-phrase checks
+    Phrase temp_phrase(*candidate);
+    bool shorter_found = false;
+    
+    // Check for shorter and shorter versions of the temporary phrase
+    while (temp_phrase.length >= minimum_length && !shorter_found) {
+      temp_phrase.ensureSuffixFound();
+      if (getSuffixCheck(temp_phrase.firstSuffixIndex)==0)
+	temp_phrase.shortenByOneAtPrefix();
+      else
+	shorter_found = true;
+
+      // Possible efficiency here: we can finish if the prefix of c
+      // and temp_phrase are the same for candidate->length symbols.
+    }
+      
+    // If no shorter phrase is found, use this one
+    if (!shorter_found) {
+      results.push_back(*candidate);
+      candidate->ensureSuffixFound();
+      setSuffixCheck(candidate->firstSuffixIndex, candidate->lastSuffixIndex);
+    }
+  }
+}
+
+
+// suffixCompare
+//
+// Compare two pointers into a suffix array.  We use this in the 
+// qsort function, so the input are pointers to pointers.  
+//
+// Return -1 if (a < b), otherwise (a > b) so return +1, 
+
+int suffixCompare(const void *cpa, const void *cpb) {
+
+  // Cast then dereference pointers to suffix array elements
+  symbol *pa = (symbol *) cpa;
+  symbol *pb = (symbol *) cpb;
+  pa = (symbol *) *pa;
+  pb = (symbol *) *pb;
+
+  // If the two elements are the same, examine the next one
+  while (*pa == *pb) {
+    *pa++;
+    *pb++;
+  }
+
+  // Make the copmparison and return
+  if ( *pa < *pb) {
+    return -1;
+  } else {
+    return +1;
+  }
+}
+
+
+// prefixCompare
+//
+// Compare two pointers into a prefix array.  We use this in the 
+// qsort function, so the input are pointers to pointers.  
+//
+// Return -1 if (a > b), otherwise (a < b) so return +1, 
+
+int prefixCompare(const void *cpa, const void *cpb) {
+
+  // Cast then dereference pointers to prefix array elements
+  symbol *pa = (symbol *) cpa;
+  symbol *pb = (symbol *) cpb;
+  pa = (symbol *) *pa;
+  pb = (symbol *) *pb;
+
+  // If the two elements are the same, examine the next one
+  while (*pa == *pb) {
+    *pa--;
+    *pb--;
+  }
+
+  // Make the copmparison and return
+  if ( *pa > *pb) {
+    return -1;
+  } else {
+    return +1;
+  }
+}
+
+// simpleCompare
+//
+// Compare two pointers based on the memory location they point to.
+
+int pointerCompare( const void *pa, const void *pb ) {
+
+  symbol **a = (symbol **) pa;
+  symbol **b = (symbol **) pb;
+
+  if (*a < *b) {
+    return  -1;
+  } else if (*a > *b) {
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+
+// Read the clauses.numbers file into the "symbols" array.
+//
+// Each number in the file is a symbol number; it is essential that 
+// the first symbol (and no others) be COLLECTIONSTART and the last
+// symbol (and no others) be COLLECTIONEND.
+//
+// Return the number of numbers in the array.
+
+int readNumbers() {
+
+  char filename[FILENAME_MAX];
+  sprintf(filename, "%s/clauses.numbers", collection);
+  if (verbosity) {
+    cout << "Reading numbers file: " << filename << endl;
+  }
+
+  // Open the numbers file
+  ifstream inFile1(filename, ios::in);
+  if (!inFile1) {
+    cerr << "File " << filename << " could not be opened\n";
+    exit(1);
+  }
+
+  // Count the number of symbols
+  inputLength = 0;
+  symbol word;
+  while (inFile1 >> word) {
+    inputLength++;
+  }
+  inFile1.close();
+
+  // Allocate the symbbols array
+  if (verbosity > 1) {
+    cout << "Allocating symbol arrays for " << inputLength << " symbols" << endl;
+  }
+  symbols = new symbol[inputLength];
+  if (symbols == NULL) {
+    cerr << "Suffix error: not enough memory to hold " << inputLength
+	 << " symbols." << endl;
+    exit(2);
+  }
+
+  // Read the numbers file into the numbers array
+  if (verbosity > 2) {
+    cout << "Reading the numbers" << endl;
+  }
+
+  ifstream inFile2(filename, ios::in);
+  if (!inFile2) {
+    cerr << "File " << filename << " could not be opened\n";
+    exit(1);
+  }
+  cellcount next = 0;
+  numberOfDocuments = 0;
+  while (inFile2 >> word) {
+    symbols[next++] = word;
+    if (word == DOCUMENTSTART) {
+      numberOfDocuments++;
+    }
+  }
+  inFile2.close();
+  
+  // Make sure the numbers file is intact
+  assert(symbols[0] == COLLECTIONSTART);
+  assert(symbols[next-1] == COLLECTIONEND);
+
+  return inputLength;
+}
+
+
+
+// Get Document Occurrance statistics
+//
+// Given a phrase, what documents does it occur in?
+
+cellcount getDocumentOccurrances(const Phrase &p, cellcount *frequency) {
+
+  // cout << "searching for \""<< p << "\" in documents " 
+  //      << 0 << "-" << numberOfDocuments - 1 << endl;
+
+  // The number of documents in which this phrase occurs
+  cellcount df = 0;
+
+  // Initialise the document frequency array
+  //  for (cellindex i = 0; i < numberOfDocuments; i++) {
+  // frequency[i] = 0;
+  //}
+  memset(frequency, 0, sizeof(cellcount)*numberOfDocuments);
+
+  // variables used to facilitate the search
+  cellindex begin;
+  cellindex end;
+  cellindex d;
+  symbol *target;
+  bool found;
+
+  // search for the document in which each occurence of the phrase is found
+  for (cellcount j = p.firstSuffixIndex; j <= p.lastSuffixIndex; j++) {
+    
+    // cout << "looking for phrase at suffixArray[" << j << "]\n";
+    
+    target = suffixArray[j];
+    begin = 0;
+    end = numberOfDocuments - 1;
+    found = false;
+
+    // Search for the occurence of a document delimiter that target
+    // occurs immediately after.  
+    // We do this by performing a binary chop search on documentArray.
+    while (!found) {
+
+      // cout << "searching for " << (cellindex) target << " in "
+      //      << begin << " - " << end << endl;
+
+      assert (begin <= end);
+
+      // If the beginning and end of the interval are the same,
+      // then we've found the correct document
+      if (begin == end) {
+	if (frequency[begin] == 0) {
+	  df++;
+	}
+	frequency[begin]++;
+	found = true;
+      }
+
+      // Otherwise, examine a new document midway through the begin-end
+      // interval and see if it is the one.
+      else {
+	d = (begin + end) / 2;
+	if (target > documentArray[d]) {
+	  // If target addrss is greater than this, but thisi sthe last document,
+	  // then this must be the one we want.  Or, if target is greater than
+	  // this one but less then the next, this must be the one we wnat.
+	  if ((d == numberOfDocuments - 1) || (target < documentArray[d+1])) {
+	    if (frequency[d] == 0) {
+	      df++;
+	    }
+	    frequency[d]++;
+	    found = true;
+	  } else {	
+	    // otherwise we know to search later in the document set
+	    begin = d + 1;
+	  }
+	} else {
+	  // search earlier in the document set
+	  end = d - 1;
+	}
+      }
+    }
+  }
+  return df;
+}
+
+
+
+
+
+
+// phraseExpansionMemory : Which phrases have we expanded?
+//
+// A set of utilities for keeping track of which phrases we have expanded.
+// We don't want to expand a phrase more than once, after all.
+//
+// This REALLY ought to be in its own class, but it works so that's okay.
+//
+// Phrases are identified by their firstSuffixPosition and length.
+//
+// Functions provided are:
+//       void initialisePhraseMemory()
+//       void rememberThisPhrase(index, length)
+//       bool isPhraseStored(index, length)
+//       void deletePhraseMemory()
+//
+// Internally, we will have two separate cases:
+//
+// Phrases of length 1-8: 
+//       unsigned char phraseMemory[inputLength]
+// is an array where each cell "remembers" the corresponding index in the 
+// suffixArray, and each of the 8 bits of the cell correspond to the phrases 
+// of length 1, 2... 8.  
+// Eventually, we will make this disk-based (i.e. store the array in a file).
+//
+// Phrases of length 9+:
+//       file hashTableFile
+//       file listOfEntries
+// The first file is a hash table; each phrase maps to one of its cells, which
+// contains either 0 (empty, no occurence) or a number which is an entry number 
+// in the second file.  This file contains a "list" of entries.  Each consists of 
+// three numbers: the suffixArray index of the phrase, the length of the phrase,
+// and the entry number of the next phrase with the same hash.
+//
+
+
+unsigned char *phraseMemory;
+
+void initialiseLongPhraseMemory();
+void rememberThisLongPhrase(cellindex index, cellcount length);
+bool isLongPhraseStored(cellindex index, cellcount length);
+void deleteLongPhraseMemory();
+
+
+void initialisePhraseMemory() {
+
+  phraseMemory = new unsigned char[inputLength];
+
+  // to begin with, everything is empty
+  //  for (cellcount i = 0; i < inputLength; i++) {
+  // phraseMemory[i] = 0;
+  //}
+  memset(phraseMemory, 0, sizeof(char)*inputLength);
+  
+  // intialise the hashTable of long phrases
+  initialiseLongPhraseMemory();
+
+}
+
+void rememberThisPhrase(cellindex index, cellcount length) {
+
+  // if the phrase is very long, use the file-based system
+  if (length > 8) {
+    rememberThisLongPhrase(index, length);
+    return;
+  }
+
+  // create a char with just the bit corresponding to length set
+  unsigned char newbit = 1;
+  for (cellcount i = 1; i < length; i++) {
+    newbit <<= 1;
+  }
+
+  // set that bit in the memory array at position index
+  phraseMemory[index] |= newbit;
+}
+
+
+bool isPhraseStored(cellindex index, cellcount length) {
+
+  // if the phrase is very long, use the file-based system
+  if (length > 8) {
+    return isLongPhraseStored(index, length);
+  }
+
+  // create a char with just the bit corresponding to length set
+  unsigned char newbit = 1;
+  for (cellcount i = 1; i < length; i++) {
+    newbit <<= 1;
+  }
+
+  // retrurn true if that bit is set in memory arrayat position index
+  return (phraseMemory[index] & newbit);
+}
+
+void deletePhraseMemory() {
+  delete phraseMemory;
+  deleteLongPhraseMemory();
+}
+
+
+
+// Files etc used to store "long" equavlents of the above
+
+fstream hashTableFile;
+char    hashTableFileName[FILENAME_MAX];
+fstream listOfEntries;
+char    listOfEntriesName[FILENAME_MAX];
+cellindex nextEntryNumber;
+
+const cellcount bigPrime = 7919;
+
+
+void initialiseLongPhraseMemory() {
+
+  cellindex example = 0;
+
+  sprintf(hashTableFileName, "%s/hashTable", collection);
+  sprintf(listOfEntriesName, "%s/hashLists", collection);
+
+
+  // create the new hashtable
+  if (verbosity > 1) {
+    cout << "Initialising hashTable: " << hashTableFileName << endl;
+  }
+  hashTableFile.open(hashTableFileName, ios::in | ios::out);
+  for (cellcount i = 0; i < bigPrime; i++) {
+    hashTableFile.write((char *) &example, sizeof(example));
+  }
+
+  // create the list of phrases
+  if (verbosity > 1) {
+    cout << "Initialising list of hashtable entries: " << listOfEntriesName << endl;
+  }
+  listOfEntries.open(listOfEntriesName, ios::in | ios::out);
+  listOfEntries.write((char *) &example, sizeof(example));
+  listOfEntries.write((char *) &example, sizeof(example));
+  listOfEntries.write((char *) &example, sizeof(example));
+  nextEntryNumber = 1;
+}
+
+
+void rememberThisLongPhrase(cellindex index, cellcount length) {
+
+  // cout << "rememberThisLongPhrase(" << index << ", " << length << ")\n";
+
+  cellindex hashOffset = ((index + length) % bigPrime) * sizeof(cellindex);
+  cellindex pointer;
+  cellindex zero = 0;
+  cellindex readp = 0;
+  cellindex readi = 0;
+  cellindex readl = 0;
+
+  hashTableFile.seekg(hashOffset);
+  hashTableFile.read((char *) &pointer, sizeof(cellindex));
+
+  if (pointer == 0) {
+    // There is no entry at all in the hash table for this entry
+    // so create one
+
+    pointer = nextEntryNumber++;
+    hashTableFile.seekg(hashOffset);
+    hashTableFile.write((char *) &pointer, sizeof(cellindex));
+        
+    listOfEntries.seekp(pointer * sizeof(cellindex) * 3);
+    listOfEntries.write((char *) &zero, sizeof(cellindex));
+    listOfEntries.write((char *) &index, sizeof(cellindex));
+    listOfEntries.write((char *) &length, sizeof(cellindex));
+
+  } else {
+    // There is a list starting at this hash value, so the phrase may
+    // be already remembered, or it might need to be appended
+    
+    while (pointer != 0) {
+      // Read the entry pointed to by pointer
+      listOfEntries.seekg(pointer * sizeof(cellindex) * 3);
+      listOfEntries.read((char *) &readp, sizeof(cellindex));
+      listOfEntries.read((char *) &readi, sizeof(cellindex));
+      listOfEntries.read((char *) &readl, sizeof(cellindex));
+
+      // cout << "read " << pointer << ", " << readp << ", " << readi << ", " << readl << endl;
+
+      if ((readi == index) && (readl = length)) {
+	// we've found that we've already stored it
+	return;
+      } else if (readp == 0) {
+	// we're reached the end of the list.  Add a new entry.
+	listOfEntries.seekp(pointer * sizeof(cellindex) * 3);
+	listOfEntries.write((char *) &nextEntryNumber, sizeof(cellindex));
+	pointer = nextEntryNumber++;
+
+	listOfEntries.seekp(pointer * sizeof(cellindex) * 3);
+	listOfEntries.write((char *) &zero, sizeof(cellindex));
+	listOfEntries.write((char *) &index, sizeof(cellindex));
+	listOfEntries.write((char *) &length, sizeof(cellindex));
+	return;
+      } else {
+	// go on to the next node
+	pointer = readp;
+      }
+    }
+  }
+
+
+}
+
+
+bool isLongPhraseStored(cellindex index, cellcount length) {
+
+  // cout << "isLongPhraseExpanded(" << index << ", " << length << ")\n";
+
+  cellindex hashOffset = ((index + length) % bigPrime) * sizeof(cellindex);
+  cellindex pointer;
+  cellindex readp = 0;
+  cellindex readi = 0;
+  cellindex readl = 0;
+
+  // Find the phrase in the hashFile
+  hashTableFile.seekg(hashOffset);
+  hashTableFile.read((char *) &pointer, sizeof(cellindex));
+
+  if (pointer == 0) {
+    // There is no entry at all in the hash table for this entry
+    // so nothing is stored
+    return false;
+
+  } else {
+    // There is a list starting at this hash value, so the phrase may
+    // be already remembered in that list
+    while (pointer != 0) {
+      // Read the entry pointed to by pointer
+      listOfEntries.seekg(pointer * sizeof(cellindex) * 3);
+      listOfEntries.read((char *) &readp, sizeof(cellindex));
+      listOfEntries.read((char *) &readi, sizeof(cellindex));
+      listOfEntries.read((char *) &readl, sizeof(cellindex));
+
+      if ((readi == index) && (readl = length)) {
+	// we've found the phrase stored here
+	return true;
+      } else {
+	// go on to the next node
+	pointer = readp;
+      }
+    }
+  }
+  return false;
+}
+
+
+void deleteLongPhraseMemory() {
+  // remove the hash & other files
+
+  hashTableFile.close();
+  listOfEntries.close();
+  remove(hashTableFileName);
+  remove(listOfEntriesName);
+
+}
+
+
+// Read the collection statistics file
+//
+void readStatistics() {
+
+  // open the statistics file
+  char filename[FILENAME_MAX];
+  sprintf(filename, "%s/clauses.stats", collection);
+
+  // Open the file
+  ifstream inFile(filename, ios::in);
+  if (!inFile) {
+    cerr << "File " << filename << " could not be opened\n";
+    exit(1);
+  }
+
+  // Read the numbers file into the numbers array
+  char key[1000];
+  symbol value;
+  while (inFile >> key >> value){
+    if (strcmp(key, "first_stopword") == 0) {
+      firstStopSymbol = value;
+    } else if (strcmp(key, "last_stopword") == 0) {
+      lastStopSymbol = value;
+    } else if (strcmp(key, "first_contentword") == 0) {
+      firstContentSymbol = value;
+    } else if (strcmp(key, "last_contentword") == 0) {
+      lastContentSymbol = value;
+    }
+  }
+  inFile.close();
+
+  // Make sure we have the information we need
+  if (!(firstStopSymbol && lastStopSymbol && firstContentSymbol && lastContentSymbol)) {
+    cerr << "Statistics file incomplete" << endl;
+    exit(1);
+  }
+}
+
+cellcount getContentCount(symbol firstContent) {
+
+  cellcount content=0;
+  for (cellcount i=0; i<inputLength; i++) {
+    if (symbols[i]>=firstContent) content++;
+  }
+
+  return content;
+}
+
+
+int main (int argc, char * argv[]) {
+
+  // Command-line arguments
+  // argv[1] is the phindex directory
+  // argv[2] is the maximum array symbol length (optional) 
+  // argv[3] is the mode, where 1 is stopword mode (optional) 
+  if (argc < 2) {
+    cerr << "Usage: " << argv[0] << " phind-directory mode [verbosity]" << endl;
+    exit(1);
+  }
+
+  // collection directory
+  strcpy(collection, argv[1]);
+
+  // mode parameter
+  phraseMode = atoi(argv[2]);
+  assert((phraseMode == STOPWORDS) || (phraseMode == ANYPHRASE));
+
+  // optional verbosity parameter
+  if (argc == 4) {
+    verbosity = atoi(argv[3]);
+    assert (verbosity >= 0);
+  }
+
+  if (verbosity) {
+    cout << "suffix: the phrase extraction program" << endl;
+  }
+  if (verbosity > 1) {
+    if (phraseMode == STOPWORDS) {
+      cout << "Stopwords mode: no phrase may begin or end with a stopword" << endl;
+    } else {
+      cout << "AllPhrase mode: extract every phrase that occurs more than once" << endl;
+    }
+  }
+
+  // Read the statistics file 
+  readStatistics();
+
+  // Read the numbers file
+  readNumbers();
+
+  if (numberOfDocuments == 0) {
+    cerr << "There are no documents in this collection!" << endl;
+    exit(1);
+  }
+
+  symbol firstContent;
+  if (phraseMode==STOPWORDS) firstContent=firstContentSymbol;
+  else firstContent = firstStopSymbol;
+
+  // Allocate memory for the suffix & prefix arrays
+  cellcount contentLength = 0;
+  contentLength = getContentCount(firstContent);
+  suffixArray = new symbol *[contentLength];
+  prefixArray = new symbol *[contentLength];
+  if (prefixArray == NULL) {
+    cerr << "Suffix: not enough memory to hold " << inputLength << " symbols." << endl;
+    exit(2);
+  }  
+  allocateSuffixCheck(contentLength);
+
+  // Initialise prefix and suffix arrays, only use the needed suffixes
+  for (cellcount j = 0, here = 0; j < inputLength; j++) {
+    if (symbols[j]>=firstContent) {
+      suffixArray[here] = &symbols[j];
+      prefixArray[here] = &symbols[j];
+      here++;
+    }    
+  }
+  qsort(suffixArray, contentLength, sizeof(symbol *), suffixCompare);
+  qsort(prefixArray, contentLength, sizeof(symbol *), prefixCompare);
+
+  // Create the document arrays
+  if (verbosity > 1) {
+    cout << "Allocating document arrays for " << numberOfDocuments << " documents" << endl;
+  }
+
+  // The document frequecy array is used to count the number of times
+  // each phrase occurs in each document.  The number of documents in
+  // which a phrase occurs is stored in df.
+  frequency *documentFrequency = new frequency[numberOfDocuments];
+  frequency df;
+
+  // documentArray will be searched in order to discover which document
+  // each phrase occurs in.
+  documentArray = new symbol *[numberOfDocuments];  
+  if (documentArray == NULL) {
+    cerr << "Suffix: out of memory allocating document arrays." << endl;
+    exit(2);
+  }  
+
+  // just scan through the input text to find the doc starts
+  cellindex d = 0;
+  for (cellindex i=0; i<inputLength; i++) {
+    if (symbols[i] == DOCUMENTSTART) {
+      documentArray[d] = &symbols[i];
+      d++;
+    }
+  }
+
+  // the phrases stuff is expecting inputLength to be the length of the
+  // suffix array, so change it.
+  inputLength = contentLength;
+
+  // Extract phrases
+  //
+  // We will make several passesover the data, in each case considering
+  // a set of input phrases and generating a set of output phrases, which
+  // we will expancd in later passes.
+  //
+  // The input phrases in the first pass will be the vocabulary.
+  // In later passes, the input phrases will be the output phrases of the
+  // previous pass.
+  //
+  // In each pass we will consider each input phrase in turn.  If we
+  // have seen it before, we will ignore it.  Otherwise, we will expand
+  // it and add its expansions to the set of output phrases.
+
+  cout <<"\ngenerating the phrase hierarchy\n\n";
+  
+  // Store the phrase data in the phrases file
+  char phraseDataName[FILENAME_MAX];
+  sprintf(phraseDataName, "%s/phrases", collection);
+  ofstream phraseData(phraseDataName, ios::out);
+  if (!phraseData) {
+    cout << "File " << phraseDataName << " could not be opened\n";
+    exit(1);
+  }
+
+  // Count the number of phrases output
+  unsigned long int phraseCounter = 0;
+
+  // Set up the phrase expansion memory.
+  // We need this so that we don't expand a phrase more than once
+  initialisePhraseMemory();
+
+  // The current pass numebr
+  int phrasePass = 1;
+
+
+  // PASS NUMBER 1
+  if (verbosity > 1) {
+    cout << "Starting pass " << phrasePass << endl;
+  }
+
+  ofstream outPhrase;
+  char     outPhraseName[FILENAME_MAX];
+  unsigned long int outPhraseCounter = 0;
+
+  // On the first pass, simply work through the vocabulary
+  sprintf(outPhraseName, "%s/outPhrase.1", collection);
+  outPhrase.open(outPhraseName, ios::out);
+  if (!outPhrase) {
+    cerr << "File " << outPhraseName << " could not be opened\n";
+    exit(1);
+  }
+
+  // Iterate over the different symbols by working through the suffix array
+  vector<Phrase> result;
+  cellindex ij = 0;
+  char *tmpString;
+
+  Phrase p;
+  while (ij < inputLength) {
+
+    // make a new phrase of length 1
+    p = Phrase(suffixArray[ij], 1, SUFFIX);
+    p.findFirstAndLastSuffix(ij, inputLength-1);
+
+    // We ignore this symbol if it occurs only once, if it is a delimiter,
+    // of if we are in stopwords mode and it is a stopword
+    // - in this new version, only need to check freq
+    // We could imagine a new mode/command-line option, which is like 
+    // STOPWORDS but without this restrictrion.  This would let you browse
+    // from "the" to "the AGRIS" for example, but not from "AGRIS" to
+    // "the AGRIS" (where the is a stopword and AGRIS a content word).
+    // The system used to work like this; it is easy to implement, but
+    // it explodes the size of the indexes.  So: would it be useful?  
+    if (p.suffixFrequency > 1) {
+      // Get minimal expansions of the phrase
+      getExpansions(p, result);
+      
+      if (!result.empty()) {
+	
+	// Remember that we have expanded this phrase
+	rememberThisPhrase(ij, 1);
+
+	// write the phrase text
+	phraseData << ij << "-1:" << p << ":" << p.suffixFrequency << ":"
+		   << result.size() << ":";
+
+	// write the results
+	for (cellcount k = 0; k < result.size(); k++) {
+	  if (k) {
+	    phraseData << ",";
+	  }
+	  phraseData << result[k].firstSuffixIndex << "-" << result[k].length;
+	  outPhrase << result[k].firstSuffixIndex << " " << result[k].length << endl;
+	  outPhraseCounter++;
+	}
+	result.clear();
+	
+	// Write the documents in which this phrase occurs
+	df = getDocumentOccurrances(p, documentFrequency);
+	phraseData << ":" << df << ":";
+
+	// write the documents
+	for (cellcount m = 0, first = 1; m < numberOfDocuments; m++) {
+	  if (documentFrequency[m]) {
+	    if (first) {
+	      first = 0;
+	    } else {
+	      phraseData << ";";
+	    }
+	    // Output the document number.  Note that here we've numbered the 
+	    // N documents from 0 to N-1, but later they'll be 1-N.  Thus we
+	    // add 1 to the document id when we output it.
+	    phraseData << "d" << (m+1);
+	    // Next, output the frequency with which the document occurs, but
+	    // only if it is > 1.
+	    if (documentFrequency[m] > 1) {
+	      phraseData << "," << documentFrequency[m];
+	    }
+	  }
+	}
+
+	phraseData << endl;
+	phraseCounter++;
+
+	// feedback 
+	if (verbosity) {
+	  if (phraseCounter % 1000 == 0) {
+	    cout << "phrase " << phraseCounter << ": "
+		 << "cell " << p.firstSuffixIndex << " - " << p << endl;
+	  }
+	}
+      }
+    }
+   ij = p.lastSuffixIndex + 1;
+  }
+  outPhrase.close();
+
+  // REMAINING PASSES
+  // The previous outPhrase file forms the input to each new pass
+  cellcount start, length;
+  while (outPhraseCounter > 0) {
+
+    // Start a new pass
+    phrasePass++;
+    if (verbosity) {
+      cout << "Starting pass " << phrasePass << endl;
+    }
+
+    // Open the input file
+    char inPhraseName[FILENAME_MAX];
+    sprintf(inPhraseName, "%s/outPhrase.%d", collection, phrasePass - 1);
+    ifstream inPhrase (inPhraseName, ios::in);
+    if (!inPhrase) {
+      cerr << "File " << inPhraseName << " could not be opened\n";
+      exit(1);
+    }
+
+    // Open the output file
+    sprintf(outPhraseName, "%s/outPhrase.%d", collection, phrasePass);
+    outPhrase.open(outPhraseName, ios::out);
+    if (!outPhrase) {
+      cerr << "File " << outPhraseName << " could not be opened\n";
+      exit(1);
+    }
+    outPhraseCounter = 0;
+
+    // Process each phrase
+    while(inPhrase >> start >> length) {
+
+      // Ignore the phrase if we have expanded it before
+      if (isPhraseStored(start, length))
+	continue;
+
+      // Remember that we have examined this phrase
+      rememberThisPhrase(start, length);
+
+      // Find the phrase in the suffixarray
+      p = Phrase(suffixArray[start], length, SUFFIX);
+      p.findFirstAndLastSuffix(start, inputLength-1);
+
+      // Ignore the phrase if it only occurs once
+      if (p.suffixFrequency < 2)
+	continue;
+
+      // Write the phrase text;
+      phraseData << start << "-" << length << ":" << p << ":" << p.suffixFrequency << ":";
+	
+      // Expand the phrase, if it is fewer than 8 words long
+      if (length <= 8) {
+
+	// Get the minimal expansions for this phrase
+	getExpansions(p, result);
+      
+	// write the results
+	phraseData << result.size() << ":";
+
+	for (cellcount i = 0; i < result.size(); i++) {
+	  if (i) {
+	    phraseData << ",";
+	  }
+	  phraseData << result[i].firstSuffixIndex << "-" << result[i].length;
+	  outPhrase << result[i].firstSuffixIndex << " " << result[i].length << endl;
+	  outPhraseCounter++;
+	}
+	result.clear();
+	
+      } else {
+	// phrase is too long to expand further
+	phraseData << "0:";
+      }
+
+      // Write the documents in which this phrase occurs
+      df = getDocumentOccurrances(p, documentFrequency);
+      phraseData << ":" << df << ":";
+
+      // write the documents
+      for (cellcount i = 0, first = 1; i < numberOfDocuments; i++) {
+	if (documentFrequency[i]) {
+	  if (first) {
+	    first = 0;
+	  } else {
+	    phraseData << ";";
+	  }
+	  // Output the document number.  Note that here we've numbered the 
+	  // N documents from 0 to N-1, but later they'll be 1-N.  Thus we
+	  // add 1 to the document id when we output it.
+	  phraseData << "d" << (i+1);
+	  // Next, output the frequency with which the document occurs, but
+	  // only if it is > 1.
+	  if (documentFrequency[i] > 1) {
+	    phraseData << "," << documentFrequency[i];
+	  }
+	}
+      }
+      
+      phraseData << endl;
+      phraseCounter++;
+
+      // feedback 
+      if (verbosity) {
+	if (phraseCounter % 1000 == 0) {
+	  cout << "phrase " << phraseCounter << ": "<< "start " << start 
+	       << ", length " << length << " - " << p << endl;
+	}
+      }
+
+    }
+
+    inPhrase.close();
+    outPhrase.close();
+  }
+    
+  phraseData.close();
+  deletePhraseMemory();
+
+  delete [] documentFrequency;
+  delete [] symbols;
+  delete [] suffixArray;
+  delete [] prefixArray;
+  delete [] suffixCheck;
+  delete [] documentArray;
+
+
+  
+  cout << endl << "Done: " << phraseCounter << " phrases in " << phraseDataName << endl;
+  return 0;
+}
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/phind/generate/suffix.h
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/suffix.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/suffix.h	(revision 21083)
@@ -0,0 +1,88 @@
+/**********************************************************************
+ *
+ * suffix.h -- definitions used in suffix.cpp
+ *
+ * Copyright 2000 Gordon W. Paynter
+ * Copyright 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef SUFFIX_H
+#define SUFFIX_H
+
+// Types
+
+// The input words stored as an array of type symbol.
+// Required range: 0 - vocabulary size (typically hundreds of thousands)
+typedef unsigned int symbol;
+
+// The cellindex and cellcount types are used when we store indexes
+// to and ranges of cells in large arrays.
+// Required Range: 0 - length of input (typically millions)
+typedef unsigned int cellindex;
+typedef unsigned int cellcount;
+
+// The frequency type is used when we want to store the frequency with 
+// which a phrase (or some other thing) occurs
+// Required range: 0 - frequency of most common symbol (often "the")
+typedef unsigned int frequency;
+
+// Global variables 
+
+// The symbol array holds the input words
+extern cellcount symbol_array_length;
+extern symbol   *symbols;
+
+// The number of words read is storesd in inputLength.
+extern cellcount inputLength;
+
+// Suffix and prefix arrays are used to extract phrases
+extern symbol  **suffixArray;
+extern symbol  **prefixArray;
+
+// Collection-specific information about the first stopword/content symbols
+extern symbol firstStopSymbol;
+extern symbol lastStopSymbol;
+extern symbol firstContentSymbol;
+extern symbol lastContentSymbol;
+
+
+// Are we allowed to terminate a phrase on a stopword?
+extern int phraseMode;
+
+#define ANYPHRASE 0
+#define STOPWORDS 1
+
+
+// Direction values
+#define SUFFIX 0
+#define PREFIX 1
+
+
+// Special symbol values
+#define COLLECTIONSTART 1
+#define COLLECTIONEND 2
+#define DOCUMENTSTART 3
+#define PHRASELIMIT 4
+
+#define LASTDELIMITER 4
+
+#endif
Index: /main/tags/2.38/gsdl/src/phind/generate/symbol-names.pl
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/symbol-names.pl	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/symbol-names.pl	(revision 21083)
@@ -0,0 +1,57 @@
+#! /usr/bin/perl -w
+
+###########################################################################
+#
+# symbol-names.pl -- Diagnostic tool that substitutes symbols names for 
+#                    symbol numbers in the output of the suffix program. 
+#
+# Copyright (C) 2000 Gordon Paynter
+#
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the 
+# University of Waikato, New Zealand.
+#
+# 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.
+#
+###########################################################################
+
+$collection = shift(@ARGV);;
+die "Usage: symbol-names.pl collection [file]\n" unless ($collection);
+
+$vocab = $ENV{'GSDLHOME'} . "/collect/$collection/index/phind1/clauses.vocab";
+if (-e "$vocab") {
+    print "Using vocabulary from: $vocab\n";
+} else {
+    $vocab = $ENV{'GSDLHOME'} . "/collect/$collection/building/phind1/clauses.vocab";
+    if (-e "$vocab") {
+	print "Using vocabulary from: $vocab\n";
+    } else {
+	die "Usage: symbol-names.pl collection [file]\n" unless (-e "$vocab");
+    }
+}
+
+open(V, "<$vocab");
+my $n = 1;
+
+while(<V>) {
+    chomp;
+    $symbol[$n++] = $_;
+}
+
+while(<>) {
+    s/s(\d+)/$symbol[$1]/g;
+    print;
+}
+
Index: /main/tags/2.38/gsdl/src/phind/generate/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/phind/generate/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/phind/generate/win32.mak	(revision 21083)
@@ -0,0 +1,70 @@
+###########################################################################
+#
+# win32 makefile -- src/phind/generate
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2001  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..\..
+USE_STLPORT = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = -GX
+LDFLAGS =
+DEFS = -D__WIN32__
+INCLUDES =
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+LIBS=
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $< 
+
+HEADERS = suffix.h phrase.h
+SOURCES = suffix.cpp phrase.cpp
+OBJECTS = phrase.obj suffix.obj
+EXEC    = suffix.exe
+
+all: $(EXEC)
+
+install:
+	copy $(EXEC) "$(GSDLHOME)\bin\windows"
+
+clean:
+	del *.obj
+	del $(EXEC)
+
+suffix.exe: $(OBJECTS)
+	    $(LINK) $(OBJECTS) $(LIBS) 
Index: /main/tags/2.38/gsdl/src/recpt/GCC.mak
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/GCC.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/GCC.mak	(revision 21083)
@@ -0,0 +1,141 @@
+###########################################################################
+#
+# gcc win32 makefile -- src/recpt
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 2000  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+AR = ar
+RANLIB = ranlib
+CC = g++
+DELETE = del
+INSTALL = copy
+
+o = .o
+/ = \\
+
+CPPFLAGS = -g -Wall
+DEFS = -D__WIN32__ -DGSDL_USE_IOS_H
+LIBS = ..$/..$/packages$/wingdbm$/gdbm.a ..$/..$/packages$/wincrypt$/crypt.a
+
+INCLUDES = -I"..$/..$/lib" -I"..$/colservr" -I"..$/..$/packages$/mg$/lib" \
+           -I"..$/..$/packages$/mg$/src$/text" -I"..$/..$/packages$/wincrypt" \
+           -I"..$/..$/packages$/wingdbm" -I"."
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS)
+LINK = $(CC) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c $o
+.c$o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp $o
+.cpp$o:
+	$(COMPILE) $< 
+
+COMMONHEADERS = receptionist.h cgiwrapper.h cgiargs.h action.h browserclass.h \
+                converter.h recptconfig.h cgiutils.h OIDtools.h browsetools.h htmlgen.h \
+		statusaction.h pageaction.h comtypes.h recptproto.h \
+		pingaction.h queryaction.h documentaction.h \
+		extlinkaction.h buildaction.h htmlutils.h \
+		querytools.h formattools.h tipaction.h authenaction.h infodbclass.h \
+                userdb.h usersaction.h vlistbrowserclass.h hlistbrowserclass.h \
+		datelistbrowserclass.h invbrowserclass.h pagedbrowserclass.h \
+		htmlbrowserclass.h delhistoryaction.h historydb.h
+
+RECEPTHEADERS = 
+
+LIBRARYHEADERS = nullproto.h
+
+HEADERS = $(COMMONHEADERS) $(RECPTHEADERS) $(LIBRARYHEADERS)
+
+
+COMMONSOURCES = receptionist.cpp cgiwrapper.cpp cgiargs.cpp action.cpp browserclass.cpp \
+                converter.cpp recptconfig.cpp cgiutils.cpp OIDtools.cpp browsetools.cpp \
+		htmlgen.cpp statusaction.cpp pageaction.cpp comtypes.cpp \
+		recptproto.cpp pingaction.cpp queryaction.cpp documentaction.cpp \
+		extlinkaction.cpp buildaction.cpp htmlutils.cpp querytools.cpp formattools.cpp \
+		tipaction.cpp authenaction.cpp infodbclass.cpp userdb.cpp usersaction.cpp \
+		vlistbrowserclass.cpp hlistbrowserclass.cpp datelistbrowserclass.cpp \
+		invbrowserclass.cpp pagedbrowserclass.cpp htmlbrowserclass.cpp \
+		delhistoryaction.cpp historydb.cpp
+
+RECPTSOURCES = recptmain.cpp
+
+LIBRARYSOURCES = nullproto.cpp librarymain.cpp
+
+SOURCES = $(COMMONSOURCES) $(RECPTSOURCES) $(LIBRARYSOURCES)
+
+
+COMMONOBJECTS = receptionist$o cgiwrapper$o cgiargs$o action$o browserclass$o \
+                converter$o recptconfig$o cgiutils$o OIDtools$o browsetools$o \
+		htmlgen$o statusaction$o pageaction$o comtypes$o \
+		recptproto$o pingaction$o queryaction$o documentaction$o \
+		extlinkaction$o buildaction$o htmlutils$o querytools$o \
+		formattools$o tipaction$o authenaction$o \
+                infodbclass$o userdb$o usersaction$o vlistbrowserclass$o \
+		hlistbrowserclass$o datelistbrowserclass$o invbrowserclass$o \
+		pagedbrowserclass$o htmlbrowserclass$o delhistoryaction$o \
+		historydb$o
+
+RECPTOBJECTS = recptmain$o
+
+LIBRARYOBJECTS = nullproto$o librarymain$o
+
+OBJECTS = $(COMMONOBJECTS) $(RECPTOBJECTS) $(LIBRARYOBJECTS)
+
+
+COLSERVROBJECTS = ..$/colservr$/mgq$o \
+                  ..$/colservr$/mgsearch$o \
+                  ..$/colservr$/querycache$o \
+                  ..$/colservr$/queryinfo$o \
+                  ..$/colservr$/collectserver$o \
+                  ..$/colservr$/colservrconfig$o \
+                  ..$/colservr$/maptools$o \
+                  ..$/colservr$/filter$o \
+                  ..$/colservr$/source$o \
+                  ..$/colservr$/browsefilter$o \
+                  ..$/colservr$/queryfilter$o \
+                  ..$/colservr$/mggdbmsource$o \
+                  ..$/colservr$/phrasesearch$o \
+                  ..$/colservr$/phrasequeryfilter$o
+
+
+EXEC = library.exe
+
+all: $(EXEC)
+
+clean:
+	if EXIST *$o $(DELETE) *$o
+	if EXIST $(EXEC) $(DELETE) $(EXEC)
+
+install:
+	$(INSTALL) $(EXEC) ..$/..$/cgi-bin$/
+
+LIBRARY_OBJS = $(COMMONOBJECTS) $(LIBRARYOBJECTS) $(COLSERVROBJECTS) \
+    ..$/..$/lib$/gsdllib.a  \
+    ..$/..$/packages$/mg$/src$/text$/libtextin.a \
+    ..$/..$/packages$/mg$/lib$/libmg.a
+
+library.exe: $(LIBRARY_OBJS)
+	$(LINK) $(LIBRARY_OBJS) $(LIBS) 
Index: /main/tags/2.38/gsdl/src/recpt/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/Makefile.in	(revision 21083)
@@ -0,0 +1,356 @@
+###########################################################################
+#
+# Makefile -- src/recpt
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+USE_Z3950 = @USE_Z3950@
+ifeq ($(USE_Z3950), 1)
+Z_CFLAGS=-DUSE_Z3950
+else
+Z_CFLAGS=
+endif
+
+USE_CORBA = @USE_CORBA@
+ifeq ($(USE_CORBA), 1)
+CORBA_CFLAGS=-DUSE_CORBA
+else
+CORBA_CFLAGS=
+endif
+
+
+
+AR = ar
+CC = @CC@
+CXX = @CXX@
+#CCFLAGS = @CFLAGS@ -Wall -Wunused -pedantic -W -Woverloaded-virtual
+
+CXXFLAGS = $(Z_CFLAGS) $(CORBA_CFLAGS) @CXXFLAGS@
+
+# YAZ kit for z39.50
+YAZDIR=../../packages/yaz
+
+USE_FASTCGI = @USE_FASTCGI@
+ifneq ($(USE_FASTCGI), 1)
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM @DEFS@
+INCLUDES = -I../../lib -I. -I../colservr -I../../packages/mg \
+	   -I../../packages/mg/lib -I../../packages/mg/src/text \
+	   -I../mgpp/lib -I../mgpp/text -I../..
+else 
+DEFS = -DNZDL -DQUIET -DSHORT_SUFFIX -DPARADOCNUM -DUSE_FASTCGI @DEFS@
+INCLUDES = -I../../lib -I. -I../colservr -I../../packages/mg \
+	   -I../../packages/mg/lib -I../../packages/mg/src/text \
+           -I../../packages/fcgi/include -I../mgpp/lib \
+	   -I../mgpp/text -I../..
+endif
+MICO_DIR = @MICO_DIR@
+MICO_VER = @MICO_VER@
+ifeq ($(MICO_DIR), yes)
+MICO_INC =
+MICO_LIB =
+MICO_PATH =
+else
+ifeq ($(MICO_DIR), default)
+MICO_DIR = ../../packages/mico/include
+MICO_PATH = ../../bin/linux/
+else
+MICO_PATH =
+endif
+MICO_INC = -I$(MICO_DIR)
+MICO_LIB = -L$(MICO_DIR)
+endif
+MINCLUDES = -I. -I../../lib -I../colservr -I../mgpp/text $(MICO_INC)
+
+RANLIB = @RANLIB@
+LDFLAGS = @LDFLAGS@
+GDBM_LIBS=@GDBM_LIBPATH@ -lgdbm
+LIBS = $(GDBM_LIBS) @LIBS@
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+
+COMPILE = $(CC) -c $(CCFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+CXXCOMPILE = $(CXX) -c $(CXXFLAGS) $(DEFS) $(INCLUDES)
+CXXLINK = $(CXX) $(LDFLAGS) -o $@
+
+MCOMPILE = $(MICO_PATH)mico-c++ -x c++ $(MCFLAGS) $(DEFS) $(MINCLUDES) -c
+MLINK = $(MICO_PATH)mico-ld -static $(LDFLAGS) $(MICO_LIB) -o  $@
+MLIBS = $(LIBS) -L../../lib/ -lmico$(MICO_VER) -lmicoaux$(MICO_VER)
+
+# in case gdbm.h/libgdbm.a are in a non-standard place...
+GDBM_OBJS=argdb.o authenaction.o collectoraction.o infodbclass.o userdb.o usersaction.o historydb.o librarymain.o nullproto.o queryaction.o z3950proto.o
+
+ifeq ($(USE_CORBA), 1)
+#EXEC = recpt library corbaserver corbarecptldd
+EXEC = library corbaserver corbarecptldd
+else
+#EXEC = recpt library
+EXEC = library
+endif
+
+all: $(EXEC)
+
+
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CXXCOMPILE) $< 
+
+$(GDBM_OBJS) :%.o :%.cpp
+	$(CXXCOMPILE) @GDBM_INCLUDE@ $<
+
+.SUFFIXES: .mpp .o
+.mpp.o:
+	$(MCOMPILE) $< -o $@
+
+COMMONHEADERS = receptionist.h cgiwrapper.h cgiargs.h action.h browserclass.h \
+                converter.h recptconfig.h cgiutils.h OIDtools.h browsetools.h htmlgen.h \
+		statusaction.h pageaction.h comtypes.h recptproto.h \
+		pingaction.h queryaction.h documentaction.h  \
+		extlinkaction.h browseaction.h htmlutils.h argdb.h \
+		querytools.h browseactiontools.h formattools.h tipaction.h authenaction.h infodbclass.h \
+                userdb.h usersaction.h vlistbrowserclass.h hlistbrowserclass.h \
+		datelistbrowserclass.h invbrowserclass.h pagedbrowserclass.h \
+		htmlbrowserclass.h phindbrowserclass.h historydb.h collectoraction.h \
+		phindaction.h summarise.h
+
+RECEPTHEADERS = 
+
+ifeq ($(USE_CORBA), 1)
+LIBRARYHEADERS = nullproto.h z3950proto.h z3950server.h corbaproto.h
+else
+LIBRARYHEADERS = nullproto.h z3950proto.h z3950server.h
+endif
+
+HEADERS = $(COMMONHEADERS) $(RECPTHEADERS) $(LIBRARYHEADERS)
+
+
+COMMONSOURCES = receptionist.cpp cgiwrapper.cpp cgiargs.cpp action.cpp browserclass.cpp \
+                converter.cpp recptconfig.cpp cgiutils.cpp OIDtools.cpp browsetools.cpp \
+		htmlgen.cpp statusaction.cpp pageaction.cpp comtypes.cpp  \
+		recptproto.cpp pingaction.cpp queryaction.cpp documentaction.cpp \
+		extlinkaction.cpp browseaction.h htmlutils.cpp querytools.cpp \
+		tipaction.cpp authenaction.cpp infodbclass.cpp userdb.cpp usersaction.cpp \
+		vlistbrowserclass.cpp hlistbrowserclass.cpp datelistbrowserclass.cpp \
+		invbrowserclass.cpp pagedbrowserclass.cpp htmlbrowserclass.cpp \
+		phindbrowserclass.cpp  historydb.cpp collectoraction.cpp argdb.cpp \
+		browseactiontools.h formattools.cpp phindaction.cpp summarise.cpp
+
+
+RECPTSOURCES = recptmain.cpp
+
+ifeq ($(USE_Z3950), 1)
+Z_LIBSOURCES=z3950proto.cpp z3950server.cpp zparse.tab.c parse.yy.c $(YAZDIR)/client/yaz_zclient.c
+else
+Z_LIBSOURCES=
+endif
+
+LIBRARYSOURCES = nullproto.cpp librarymain.cpp $(Z_LIBSOURCES)
+
+SOURCES = $(COMMONSOURCES) $(RECPTSOURCES) $(LIBRARYSOURCES)
+
+
+ifeq ($(USE_Z3950), 1)
+Z_COMOBJS=parse.yy.o
+else
+Z_COMOBJS=
+endif
+
+COMMONOBJECTS = receptionist.o cgiwrapper.o cgiargs.o action.o browserclass.o \
+                converter.o recptconfig.o cgiutils.o OIDtools.o browsetools.o \
+		htmlgen.o statusaction.o pageaction.o comtypes.o \
+		recptproto.o pingaction.o queryaction.o documentaction.o \
+		extlinkaction.o browseaction.o htmlutils.o querytools.o browseactiontools.o \
+		formattools.o tipaction.o authenaction.o argdb.o \
+                infodbclass.o userdb.o usersaction.o vlistbrowserclass.o \
+		hlistbrowserclass.o datelistbrowserclass.o invbrowserclass.o \
+		pagedbrowserclass.o htmlbrowserclass.o phindbrowserclass.o \
+		historydb.o $(Z_COMOBJS) collectoraction.o phindaction.o \
+		summarise.o
+
+RECPTOBJECTS = recptmain.o
+
+
+ifeq ($(USE_Z3950), 1)
+Z_LIBOBJS=z3950proto.o z3950server.o zparse.tab.o $(YAZDIR)/client/yaz_zclient.o
+else
+Z_LIBOBJS=
+endif
+
+LIBRARYOBJECTS = nullproto.o librarymain.o $(Z_LIBOBJS)
+
+OBJECTS = $(COMMONOBJECTS) $(RECPTOBJECTS) $(LIBRARYOBJECTS)
+
+
+COLSERVROBJECTS = ../colservr/mgq.o \
+		  ../colservr/search.o \
+                  ../colservr/mgsearch.o \
+                  ../colservr/querycache.o \
+                  ../colservr/queryinfo.o \
+                  ../colservr/collectserver.o \
+                  ../colservr/colservrconfig.o \
+                  ../colservr/maptools.o \
+                  ../colservr/filter.o \
+                  ../colservr/source.o \
+                  ../colservr/browsefilter.o \
+                  ../colservr/queryfilter.o \
+                  ../colservr/mggdbmsource.o \
+                  ../colservr/phrasesearch.o \
+                  ../colservr/phrasequeryfilter.o \
+		  ../colservr/mgqueryfilter.o \
+		  ../colservr/mgppsearch.o \
+		  ../colservr/mgppqueryfilter.o \
+		  ../colservr/collectset.o
+
+
+
+## z39.50 rules
+# Note! If USE_FASTCGI=1, yaz is still compiled and linked, but never
+# called by librarymain.cpp.
+$(YAZDIR)/client/yaz_zclient.o: $(YAZDIR)/lib/libyaz.a
+	cd $(YAZDIR)/client && 	$(MAKE) yaz_zclient.o
+
+# this should be done by the top level makefile...
+$(YAZDIR)/lib/libyaz.a:
+	cd $(YAZDIR) && $(MAKE) all
+
+# put a separate rule here, as it speeds up compilation of other objects
+# if they don't need to include all the yaz headers
+z3950%.o: z3950%.cpp
+	$(COMPILE) -I$(YAZDIR)/include $<
+
+zparse.tab.c: zparse.y
+	@YACC@ -b zparse -d zparse.y
+
+zparse.tab.h: zparse.tab.c
+
+parse.yy.c: parse.fl zparse.tab.h
+	flex -oparse.yy.c parse.fl
+
+
+
+# We'll keep the .c and .h files for those without lex/flex and yacc/bison.
+#PARSE_TMPFILES= zparse.tab.o zparse.tab.c zparse.tab.h parse.yy.o parse.yy.c
+PARSE_TMPFILE=zparse.tab.o parse.yy.o
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) $(PARSE_TMPFILES) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC) $(PARSE_TMPFILES)
+
+install:
+	$(INSTALL) -m 755 -s library ../../cgi-bin
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CXXFLAGS) -- $(SOURCES)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+ifeq ($(USE_FASTCGI), 1)
+    FASTCGI_OBJS = ../../packages/fcgi/libfcgi/libfcgi.a
+else
+    FASTCGI_OBJS =
+endif
+
+RECPT_OBJS = $(COMMONOBJECTS) $(RECPTOBJECTS) \
+    ../../lib/gsdllib.a  \
+    ../../packages/mg/src/text/libtextin.a \
+    ../../packages/mg/lib/libmg.a \
+    $(FASTCGI_OBJS) \
+    ../mgpp/text/libtextin.a \
+    ../mgpp/lib/libmg.a 
+
+recpt: $(RECPT_OBJS)
+	$(CXXLINK) $(RECPT_OBJS) $(LIBS) 
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+ifeq ($(USE_Z3950), 1)
+Z_LIBYAZ_A=$(YAZDIR)/lib/libyaz.a
+else
+Z_LIBYAZ_A=
+endif
+
+
+LIBRARY_OBJS = $(COMMONOBJECTS) $(LIBRARYOBJECTS) $(COLSERVROBJECTS) \
+    ../../lib/gsdllib.a  \
+    ../../packages/mg/src/text/libtextin.a \
+    ../../packages/mg/lib/libmg.a \
+    $(FASTCGI_OBJS) $(Z_LIBYAZ_A) \
+    ../mgpp/text/libtextin.a \
+    ../mgpp/lib/libmg.a
+
+library: $(LIBRARY_OBJS)
+	$(CXXLINK) $(LIBRARY_OBJS) $(LIBS)
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+RECPTLIB_OBJECTS = nullproto.o corbaproto.o \
+                   ../../lib/corbatext_t.o ../../lib/corbaconv_text_t.o \
+		   ../../lib/corbaiface.o ../../lib/corbaiface_skel.o
+
+RLIBRARY_OBJS = $(COMMONOBJECTS) $(RECPTLIB_OBJECTS) $(COLSERVROBJECTS) \
+    ../../lib/gsdllib.a  \
+    ../../packages/mg/src/text/libtextin.a \
+    ../../packages/mg/lib/libmg.a \
+    $(FASTCGI_OBJS) $(Z_LIBOBJS) $(Z_LIBYAZ_A) \
+    ../mgpp/text/libtextin.a \
+    ../mgpp/lib/libmg.a 
+
+RECPTLIB_OBJS = $(RLIBRARY_OBJS) ../colservr/corbaServer.o
+
+corbaserver: $(RECPTLIB_OBJS)
+	@echo -e building corbaserver
+	$(MLINK) $(RECPTLIB_OBJS) $(MLIBS)
+# stripping symbols was a cunning plan, but caused difficulties when 
+#  it came to debugging ...
+# non GNU strips might not like these options - check autoconf?
+#	strip --strip-all --discard-all corbaserver
+#	strip corbaserver
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+CORBARECPT_OBJECTS = nullproto.o corbaproto.o corbaclient.o
+
+CORBARECPT_OBJS = $(COMMONOBJECTS) $(CORBARECPT_OBJECTS) $(COLSERVROBJECTS) \
+    ../../lib/corbaiface.o \
+    ../../lib/corbaiface_skel.o \
+    ../../lib/corbaconv_text_t.o \
+    ../../lib/corbatext_t.o \
+    ../../lib/gsdllib.a  \
+    ../../packages/mg/src/text/libtextin.a \
+    ../../packages/mg/lib/libmg.a \
+    $(FASTCGI_OBJS) \
+    ../mgpp/text/libtextin.a \
+    ../mgpp/lib/libmg.a 
+
+
+corbarecptldd: $(CORBARECPT_OBJS)
+	@echo -e building corbarecptldd:
+	$(MLINK)  $(CORBARECPT_OBJS)  $(MLIBS) 
+
+test:
+
Index: /main/tags/2.38/gsdl/src/recpt/OIDtools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/OIDtools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/OIDtools.cpp	(revision 21083)
@@ -0,0 +1,343 @@
+/**********************************************************************
+ *
+ * OIDtools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "OIDtools.h"
+#include <assert.h>
+
+// returns (in top) the top level of OID (i.e. everything
+// up until the first dot)
+void get_top (const text_t &OID, text_t &top) {
+
+  top.clear();
+  if (OID.empty()) return;
+
+  text_t::const_iterator begin = OID.begin();
+  text_t::const_iterator end = OID.end();
+
+  top.appendrange (begin, findchar(begin, end, '.'));
+}	
+
+
+// checks if OID is top level (i.e. contains no dots)
+bool is_top (const text_t &OID) {
+
+  if (OID.empty()) return true;
+
+  text_t::const_iterator here = OID.begin();
+  text_t::const_iterator end = OID.end();
+  here = findchar (here, end, '.');
+
+  if (here == end) return true;
+  return false;
+}
+
+
+// get_parents_array loads the parents array with all the parents of the
+// document or classification specified by OID (not including OID itself)
+void get_parents_array (const text_t &OID, text_tarray &parents) {
+
+  text_t::const_iterator here = OID.begin ();
+  text_t::const_iterator end = OID.end ();
+  text_t thisparent;
+
+  while (here != end) {
+    if (*here == '.') parents.push_back(thisparent);
+    thisparent.push_back(*here);
+    here ++;
+  }
+}
+
+
+// get_info does a protocol call and returns (in response) the metadata 
+// associated with OID. Metadata should be loaded with whatever
+// metadata fields are to be requested.
+
+bool get_info (const text_t &OID, const text_t &collection,
+	       const text_tset &metadata, bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout) {
+
+  response.clear();
+
+  comerror_t err = noError;
+  FilterRequest_t request;
+  request.clear();
+
+  request.filterName = "NullFilter";
+  request.filterResultOptions = FRmetadata;
+  request.getParents = getParents;
+  request.fields = metadata;
+  request.docSet.push_back (OID);
+  assert (collectproto != NULL);
+
+  collectproto->filter (collection, request, response, err, logout);
+  if (err != noError) {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii
+	   << "Error: call to filter failed for " << OID
+	   << " in OIDtools::get_info (" 
+	   << get_comerror_string (err) << ")\n";
+    return false;
+  }
+  
+  return true;
+}
+
+// overloaded, to allow "custom" filter options.
+bool get_info (const text_t &OID, const text_t &collection,
+	       const text_tset &metadata, const OptionValue_tarray &options,
+	       bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout) {
+
+  response.clear();
+
+  comerror_t err = noError;
+  FilterRequest_t request;
+
+  request.filterName = "NullFilter";
+  request.filterResultOptions = FRmetadata;
+  request.getParents = getParents;
+  request.filterOptions = options;
+  request.fields = metadata;
+  request.docSet.push_back (OID);
+
+  assert (collectproto != NULL);
+  collectproto->filter (collection, request, response, err, logout);
+  if (err != noError) {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii
+	   << "Error: call to filter failed for " << OID
+	   << " in OIDtools::get_info (" 
+	   << get_comerror_string (err) << ")\n";
+    return false;
+  }
+  
+  return true;
+}
+
+bool get_info (const text_tarray &OIDs, const text_t &collection,
+	       const text_tset &metadata, bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout) {
+
+  response.clear();
+  if (OIDs.empty()) return true;
+
+  comerror_t err = noError;
+  FilterRequest_t request;
+
+  request.filterName = "NullFilter";
+  request.filterResultOptions = FRmetadata;
+  request.getParents = getParents;
+  request.fields = metadata;
+
+  request.docSet = OIDs;
+  
+  collectproto->filter (collection, request, response, err, logout);
+  if (err != noError) {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii
+	   << "Error: call to filter failed in OIDtools::get_info (" 
+	   << get_comerror_string (err) << ")\n";
+    return false;
+  }
+
+  return true;
+}
+
+
+
+// has_children returns true if OID has children
+bool has_children (const text_t &OID, const text_t &collection, 
+		   recptproto *collectproto, ostream &logout) {
+
+  FilterResponse_t response;
+  text_tset metadata;
+  metadata.insert ("haschildren");
+
+  if (get_info (OID, collection, metadata, false, collectproto,	response, logout)) {
+    if (response.docInfo[0].metadata["haschildren"].values[0] == "1")
+      return true;
+  }
+  return false;
+}
+
+
+// get_children does a protocol call and returns (in response) the OIDs and 
+// metadata of all the children of OID. The metadata set should be loaded
+// with whatever metadata fields are to be requested.
+
+bool get_children (const text_t &OID, const text_t &collection, 
+		   const text_tset &metadata, bool getParents,
+		   recptproto *collectproto, FilterResponse_t &response, 
+		   ostream &logout) {
+  
+  response.clear();
+
+  comerror_t err = noError;
+  FilterRequest_t request;
+  OptionValue_t option;
+
+  option.name = "ParentNode";
+  option.value = OID;
+  request.filterOptions.push_back (option);
+  request.filterName = "BrowseFilter";
+  request.filterResultOptions = FROID | FRmetadata;
+  request.fields = metadata;
+  request.getParents = getParents;
+
+  collectproto->filter (collection, request, response, err, logout);
+
+  if (err != noError) {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii
+	   << "Error: call to filter failed for " << OID 
+	   << " in OIDtools::get_children (" 
+	   << get_comerror_string (err) << ")\n";
+    return false;
+  }
+  return true;
+}
+
+// get_parent returns the parent of the document or classification
+// specified by OID
+text_t get_parent (text_t OID) {
+
+  if (OID.empty() || is_top (OID)) return "";
+
+  text_t::const_iterator begin = OID.begin();
+  text_t::const_iterator here = (OID.end() - 1);
+
+  while (here >= begin) {
+    OID.pop_back();
+    if (*here == '.') break;
+    here --;
+  }
+  return OID;
+}
+
+// takes an OID like ".2 and replaces the " with parent
+void translate_parent (text_t &OID, const text_t &parent) {
+
+  text_t::const_iterator here = OID.begin();
+  text_t::const_iterator end = OID.end();
+  text_t temp;
+
+  while (here != end) {
+    if (*here == '"') temp += parent;
+    else temp.push_back (*here);
+    here ++;
+  }
+  OID = temp;
+}
+
+// shrink_parent does the opposite to translate_parent
+void shrink_parent (text_t &OID) {
+  
+  text_tarray tmp;
+  splitchar (OID.begin(), OID.end(), '.', tmp);
+  OID = "\"." + tmp.back();
+}
+
+// checks if OID uses ".fc", ".lc", ".pr", ".ns",
+// or ".ps" syntax (first child, last child, parent,
+// next sibling, previous sibling)
+bool needs_translating (const text_t &OID) {
+
+  if (OID.size() < 4) return false;
+
+  text_t tail = substr (OID.end()-3, OID.end());
+  if (tail == ".fc" || tail == ".lc" || tail == ".pr" || 
+      tail == ".ns" || tail == ".ps") return true;
+
+  return false;
+}
+
+// strips the ".fc", ".lc", ".pr", ".ns",
+// or ".ps" suffix from the end of OID
+void strip_suffix (text_t &OID) {
+
+  text_t tail = substr (OID.end()-3, OID.end());
+  while (tail == ".fc" || tail == ".lc" || tail == ".pr" || 
+	 tail == ".ns" || tail == ".ps") {
+    OID.erase (OID.end()-3, OID.end());
+    tail = substr (OID.end()-3, OID.end());
+  }
+}
+
+static void recurse_contents (ResultDocInfo_t section, const bool &is_classify, 
+			      const text_t &collection, const text_tset &metadata, 
+			      recptproto *collectproto, FilterResponse_t &response, 
+			      ostream &logout) {
+
+  int haschildren = section.metadata["haschildren"].values[0].getint();
+  const text_t &doctype = section.metadata["doctype"].values[0];
+
+  if ((haschildren == 1) && ((!is_classify) || (doctype == "classify"))) {
+    FilterResponse_t tmp;
+    bool getParents = false;
+    get_children (section.OID, collection, metadata, getParents, collectproto, tmp, logout);
+    ResultDocInfo_tarray::iterator thisdoc = tmp.docInfo.begin();
+    ResultDocInfo_tarray::iterator lastdoc = tmp.docInfo.end();
+    while (thisdoc != lastdoc) {
+      response.docInfo.push_back (*thisdoc);
+      recurse_contents (*thisdoc, is_classify, collection, metadata, 
+			collectproto, response, logout);
+      thisdoc ++;
+    }
+  }
+}
+
+// get_contents returns OIDs and metadata of all contents 
+// below (and including) OID.
+void get_contents (const text_t &topOID, const bool &is_classify, 
+		   text_tset &metadata, const text_t &collection, 
+		   recptproto *collectproto, FilterResponse_t &response, 
+		   ostream &logout) {
+
+  if (topOID.empty()) return;
+  response.clear();
+
+  metadata.insert ("haschildren");
+  metadata.insert ("doctype");
+
+  // get topOIDs info
+  if (get_info (topOID, collection, metadata, false, collectproto, response, logout))
+      recurse_contents (response.docInfo[0], is_classify, collection, 
+			metadata, collectproto, response, logout);
+}
+
+// is_child_of returns true if OID2 is a child of OID1
+bool is_child_of(const text_t &OID1, const text_t &OID2) {
+
+  text_t parent = get_parent(OID2);
+
+  while (!parent.empty()) {
+    if (parent == OID1) return true;
+    parent = get_parent(parent);
+  }
+  return false;
+}
Index: /main/tags/2.38/gsdl/src/recpt/OIDtools.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/OIDtools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/OIDtools.h	(revision 21083)
@@ -0,0 +1,103 @@
+/**********************************************************************
+ *
+ * OIDtools.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef OIDTOOLS_H
+#define OIDTOOLS_H
+
+#include "text_t.h"
+#include "recptproto.h"
+
+// returns (in top) the top level of OID (i.e. everything
+// up until the first dot)
+void get_top (const text_t &OID, text_t &top);
+
+// checks if OID is top level (i.e. contains no dots)
+bool is_top (const text_t &OID);
+
+// get_parents_array loads the parents array with all the parents of the
+// document or classification specified by OID (not including OID itself)
+void get_parents_array (const text_t &OID, text_tarray &parents);
+
+// get_info does a protocol call and returns (in response) the info 
+// associated with OID. Metadata should be loaded with whatever
+// metadata fields are to be requested
+bool get_info (const text_t &OID, const text_t &collection,
+	       const text_tset &metadata, bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout);
+bool get_info (const text_t &OID, const text_t &collection,
+	       const text_tset &metadata, const OptionValue_tarray &options,
+	       bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout);
+bool get_info (const text_tarray &OIDs, const text_t &collection,
+	       const text_tset &metadata, bool getParents,
+	       recptproto *collectproto, FilterResponse_t &response, 
+	       ostream &logout);
+
+// has_children returns true if OID has children
+bool has_children (const text_t &OID, const text_t &collection, 
+		   recptproto *collectproto, ostream &logout);
+
+// get_children does a protocol call and returns (in response) the OIDs and 
+// metadata of all the children of OID. The metadata set should be loaded
+// with whatever metadata fields are to be requested.
+bool get_children (const text_t &OID, const text_t &collection, 
+		   const text_tset &metadata, bool getParents,
+		   recptproto *collectproto, FilterResponse_t &response, 
+		   ostream &logout);
+
+// get_parent returns the parent of the document or classification
+// specified by OID
+text_t get_parent (text_t OID);
+
+// takes an OID like ".2.3 and replaces the " with parent
+void translate_parent (text_t &OID, const text_t &parent);
+
+// shrink_parent does the opposite to translate_parent
+void shrink_parent (text_t &OID);
+
+// checks if OID uses ".fc", ".lc", ".pr", ".ns",
+// or ".ps" syntax (first child, last child, parent,
+// next sibling, previous sibling)
+bool needs_translating (const text_t &OID);
+
+// strips the ".fc", ".lc", ".pr", ".ns",
+// or ".ps" suffix from the end of OID
+void strip_suffix (text_t &OID);
+
+// get_contents returns OIDs and metadata of all contents 
+// below (and including) OID.
+void get_contents (const text_t &topOID, const bool &is_classify, 
+		   text_tset &metadata, const text_t &collection, 
+		   recptproto *collectproto, FilterResponse_t &response, 
+		   ostream &logout);
+
+// is_child_of returns true if OID2 is a child of OID1
+bool is_child_of(const text_t &OID1, const text_t &OID2);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/TODO
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/TODO	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/TODO	(revision 21083)
@@ -0,0 +1,57 @@
+For Z 39.50 Stuff
+
+pageaction.cpp
+--------------
+Macros:
+ * for "about" page, use a custom _textbrowseoptions_ macro (ie
+   create a new macro, maybe create a z3950.dm macro file ??)
+   (also maybe _numbrowseoptions_
+
+(Irrelevant?) (c. line 332)
+    disp.setmacro ("numdocs", "Global", cinfo.numDocs);
+    disp.setmacro ("builddate", "Global", builddate);
+
+That message "This collection contains..." is in the _collectionextra_
+macro.
+could get numdocs from the z39.50 server, as well as any other status
+information.
+
+win32.mak
+---------
+Needs updating for all added files (z*, parse.fl)
+
+yaz
+---
+Maybe put libyaz.a in $GSDLHOME/lib ?
+
+
+DESIGN ISSUES
+for z39.50 (and eventually nullproto when corba allows recept. and
+coll server to be physically separate), if the server is unavailable,
+should this be determined at:
+  * "home page" creation time, in which case the recept. must ping and
+test each collection it knows about, which may cause unacceptable delay, or
+  * "about page" creation time (ie individual collection), in which case
+the collection can not customise the page layout by modifying macros.
+
+Eg currently, the z39.50 collection will not create a TCP connection to the
+"target" (ie z39.50 server somewhere around the world) until it tries to
+get the "About this collection" information for that collection. 
+If the connection fails, the protocol can not change _queryform_ part of
+the page.
+
+
+MULTI-LINGUAL SUPPORT
+Multi-lingual - eg macros - want to set _collectionextra_ using
+metadata["collectionextra"] based on the chosen interface language.
+Should be done by OIDtools.cpp:get_info() and any action that calls
+proto->filter().
+queryaction.cpp (c. line 1097):
+  // add the requested language as an option to the query
+  if (!args["l"].empty()) {
+    OptionValue_t option;
+    option.name="Language";
+    option.value=args["l"];
+    request.filterOptions.push_back(option);
+  }
+
Index: /main/tags/2.38/gsdl/src/recpt/action.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/action.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/action.cpp	(revision 21083)
@@ -0,0 +1,157 @@
+/**********************************************************************
+ *
+ * action.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "action.h"
+#include <assert.h>
+
+
+// define all the macros which are related to pages generated
+// by this action
+void action::define_internal_macros (displayclass &/*disp*/, cgiargsclass &/*args*/, 
+				     recptprotolistclass * /*protos*/, ostream &/*logout*/) {
+}
+
+action::action () {
+}
+
+action::~action () {
+}
+
+// configure should be called once for each configuration line
+void action::configure (const text_t &key, const text_tarray &cfgline) {
+  if (key == "gsdlhome") {
+    gsdlhome = cfgline[0];
+    if (gdbmhome.empty()) gdbmhome = cfgline[0];
+  }
+  if (key == "gdbmhome") {gdbmhome = cfgline[0];}
+}
+
+// init should be called after all the configuration is done but
+// before any other methods are called
+bool action::init (ostream &/*logout*/) {
+  return true;
+}
+
+// returns the "a" argument value that will specify this action
+// this name should be short but does not have to be one character
+// long
+text_t action::get_action_name () {
+  return "nzdl";
+}
+
+// check_cgiargs should be called before get_cgihead_info, 
+// define_external_macros, and do_action. If an error is found
+// a message will be written to logout, if the error is severe
+// then the function will return false and no page content
+// should be produced based on the arguments.
+bool action::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &/*args*/, 
+			    ostream &/*logout*/) {
+  return true;
+}
+
+// check_external_cgiargs should be called after check_cgiargs
+// for all actions. It should only be used to override some other
+// normal behaviour, for example, producing a login page when
+// the requested page needs authentication.
+bool action::check_external_cgiargs (cgiargsinfoclass &/*argsinfo*/,
+				     cgiargsclass &/*args*/,
+				     outconvertclass &/*outconvert*/,
+				     const text_t &/*saveconf*/,
+				     ostream &/*logout*/) {
+  return true;
+}
+
+// get_cgihead_info determines the cgi header information for
+// a set of cgi arguments. If response contains location then
+// response_data contains the redirect address. If reponse
+// contains content then reponse_data contains the content-type.
+// Note that images can now be produced by the receptionist.
+void action::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+			       response_t &response, text_t &response_data, 
+			       ostream &/*logout*/) {
+  response = location;
+  response_data = "http://www.nzdl.org";
+}
+  
+// uses_display should return true if the receptionist should return
+// true if the display class is needed to output the page content
+// The default is to return true.
+bool action::uses_display (cgiargsclass &/*args*/) {
+  return true;
+}
+
+
+// define all the macros which might be used by other actions
+// to produce pages. These macros should be well documented.
+void action::define_external_macros (displayclass &/*disp*/, cgiargsclass &/*args*/, 
+				     recptprotolistclass * /*protos*/, ostream &/*logout*/) {
+}
+
+// returns false if there was an error which prevented the action
+// from outputing anything.
+bool action::do_action (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/, 
+			browsermapclass * /*browsers*/, displayclass &/*disp*/, 
+			outconvertclass &/*outconvert*/, ostream &/*textout*/, 
+			ostream &/*logout*/) {
+  return true;
+}
+
+
+bool operator==(const actionptr &x, const actionptr &y) {
+  return (x.a == y.a);
+}
+
+bool operator<(const actionptr &x, const actionptr &y) {
+  return (x.a < y.a);
+}
+
+
+// theaction remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void actionmapclass::addaction (action *theaction) {
+  // can't add a null action
+  assert (theaction != NULL);
+  if (theaction == NULL) return;
+  
+  // can't add an action with no name
+  assert (!(theaction->get_action_name()).empty());
+  if ((theaction->get_action_name()).empty()) return;
+
+  actionptr aptr;
+  aptr.a = theaction;
+  actionptrs[theaction->get_action_name()] = aptr;
+}
+
+// getaction will return NULL if the action could not be found
+action *actionmapclass::getaction (const text_t &key) {
+  // can't find an action with no name
+  assert (!key.empty());
+  if (key.empty()) return NULL;
+
+  iterator here = actionptrs.find (key);
+  if (here == actionptrs.end()) return NULL;
+  
+  return (*here).second.a;
+}
Index: /main/tags/2.38/gsdl/src/recpt/action.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/action.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/action.h	(revision 21083)
@@ -0,0 +1,180 @@
+/**********************************************************************
+ *
+ * action.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef ACTION_H
+#define ACTION_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "cgiargs.h"
+#include "display.h"
+#include "recptproto.h"
+#include "browserclass.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+class action {
+protected:
+  cgiargsinfoclass argsinfo;
+  text_t gsdlhome;
+  text_t gdbmhome;
+
+public:
+  action ();
+  virtual ~action ();
+
+  // configure should be called once for each configuration line
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+
+  // init should be called after all the configuration is done but
+  // before any other methods are called
+  virtual bool init (ostream &logout);
+
+  // returns the "a" argument value that will specify this action
+  // this name should be short but does not have to be one character
+  // long
+  virtual text_t get_action_name ();
+
+  // check_cgiargs should be called before get_cgihead_info, 
+  // define_external_macros, and do_action. If an error is found
+  // a message will be written to logout, if the error is severe
+  // then the function will return false and no page content
+  // should be produced based on the arguments.
+  virtual bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+			      ostream &logout);
+
+  // check_external_cgiargs should be called after check_cgiargs
+  // for all actions. It should only be used to override some other
+  // normal behaviour, for example, producing a login page when
+  // the requested page needs authentication.
+  virtual bool check_external_cgiargs (cgiargsinfoclass &argsinfo,
+				       cgiargsclass &args,
+				       outconvertclass &outconvert,
+				       const text_t &saveconf,
+				       ostream &logout);
+
+  // get_cgihead_info determines the cgi header information for
+  // a set of cgi arguments. If response contains location then
+  // response_data contains the redirect address. If reponse
+  // contains content then reponse_data contains the content-type.
+  // Note that images can now be produced by the receptionist.
+  virtual void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+				 response_t &response, text_t &response_data, 
+				 ostream &logout);
+  
+  // uses_display should return true if the receptionist should return
+  // true if the display class is needed to output the page content.
+  // The default is to return true.
+  virtual bool uses_display (cgiargsclass &args);
+
+  // define all the macros which are related to pages generated
+  // by this action
+  virtual void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+				       recptprotolistclass *protos, ostream &logout);
+
+  // define all the macros which might be used by other actions
+  // to produce pages. These macros should be well documented.
+  virtual void define_external_macros (displayclass &disp, cgiargsclass &args, 
+				       recptprotolistclass *protos, ostream &logout);
+
+  // returns false if there was an error which prevented the action
+  // from outputing anything.
+  virtual bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			  browsermapclass *browsers, displayclass &disp, 
+			  outconvertclass &outconvert, ostream &textout, 
+			  ostream &logout);
+  
+  // getargsinfo should be called after all configuration files
+  // have been read
+  cgiargsinfoclass getargsinfo () {return argsinfo;};
+};
+
+
+// The actionptr function does not 'own' the action. The 
+// action should be deleted by the code which created it.
+class actionptr {
+public:
+  action *a;
+
+  actionptr () {a=NULL;}
+};
+
+bool operator==(const actionptr &x, const actionptr &y);
+bool operator<(const actionptr &x, const actionptr &y);
+
+typedef map<text_t, actionptr, lttext_t> actionptrmap;
+
+// contains a list of actions indexed by their name
+class actionmapclass {
+protected:
+  actionptrmap actionptrs;
+
+public:
+  // type support for actionptrmap
+  typedef actionptrmap::iterator iterator;
+  typedef actionptrmap::const_iterator const_iterator;
+  typedef actionptrmap::reference reference;
+  typedef actionptrmap::const_reference const_reference;
+  typedef actionptrmap::size_type size_type;
+
+  typedef actionptrmap::difference_type difference_type;
+  typedef actionptrmap::const_reverse_iterator const_reverse_iterator;
+  typedef actionptrmap::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return actionptrs.begin();}
+  const_iterator begin () const {return actionptrs.begin();}
+  iterator end () {return actionptrs.end();}
+  const_iterator end () const {return actionptrs.end();}
+
+  void erase(iterator pos) {actionptrs.erase(pos);}
+  void erase(iterator first, iterator last) {actionptrs.erase(first, last);}
+  actionmapclass &operator=(const actionmapclass &x) {actionptrs=x.actionptrs;return *this;}
+
+  bool empty () const {return actionptrs.empty();}
+  size_type size() const {return actionptrs.size();}
+
+
+  // added functionality
+  void clear () {actionptrs.erase(actionptrs.begin(),actionptrs.end());}
+
+  // theaction remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addaction (action *theaction);
+
+  // getaction will return NULL if the action could not be found
+  action *getaction (const text_t &key);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/argdb.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/argdb.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/argdb.cpp	(revision 21083)
@@ -0,0 +1,72 @@
+/**********************************************************************
+ *
+ * argdb.cpp -- 
+ * Copyright (C) 2001  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// argdb is used by the collector for storing cgi arguments on disk (in a
+// gdbm database)
+
+#include "argdb.h"
+
+argdb::argdb (const text_t &filename) {
+  dbfile = filename;
+}
+  
+bool argdb::update_args (text_tmap &argmap) {
+  gdbmclass argdb;
+  if (!argdb.opendatabase(dbfile, GDBM_WRCREAT, 1000, true)) return false;
+  infodbclass info;
+  
+  argdb.getinfo("savedargs", info);
+
+  text_tmap::iterator here = argmap.begin();
+  text_tmap::iterator end = argmap.end();
+  while (here != end) {
+    if (!(*here).second.empty()) {
+      info.setinfo((*here).first, (*here).second);
+    }
+    here ++;
+  }
+
+  bool rv = argdb.setinfo ("savedargs", info);
+  argdb.closedatabase();
+  return rv;
+}
+
+bool argdb::get_args (text_tmap &argmap) {
+  argmap.erase(argmap.begin(), argmap.end());
+  gdbmclass argdb;
+  if (!argdb.opendatabase(dbfile, GDBM_READER, 1000, true)) return false;
+  infodbclass info;
+  
+  if (!argdb.getinfo("savedargs", info)) return false;
+  
+  infodbclass::const_iterator here = info.begin();
+  infodbclass::const_iterator end = info.end();
+  while (here != end) {
+    argmap[(*here).first] = info[(*here).first];
+    here ++;
+  }
+  argdb.closedatabase();
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/recpt/argdb.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/argdb.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/argdb.h	(revision 21083)
@@ -0,0 +1,48 @@
+/**********************************************************************
+ *
+ * argdb.h -- 
+ * Copyright (C) 2001  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef ARGDB_H
+#define ARGDB_H
+
+#include "text_t.h"
+#include "infodbclass.h"
+
+class argdb {
+
+protected:
+
+  text_t dbfile;
+
+public:
+  
+  argdb (const text_t &filename);
+  virtual ~argdb () {}
+  
+  bool update_args (text_tmap &argmap);
+  bool get_args (text_tmap &argmap);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/authenaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/authenaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/authenaction.cpp	(revision 21083)
@@ -0,0 +1,330 @@
+/**********************************************************************
+ *
+ * authenaction.cpp -- authenticating users
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "authenaction.h"
+#include "fileutil.h"
+#include "cfgread.h"
+#include "cgiutils.h"
+#include "infodbclass.h"
+#include "gsdltimes.h"
+#include "userdb.h"
+
+
+///////////////
+// authenaction
+///////////////
+
+authenaction::authenaction () {
+  keydecay = 1800; // 30 minutes
+  recpt = NULL;
+
+  // this action uses cgi variable "a"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "a";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "us"
+  arg_ainfo.shortname = "us";
+  arg_ainfo.longname = "user account status";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "invalid";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ug"
+  arg_ainfo.shortname = "ug";
+  arg_ainfo.longname = "user groups"; // comma seperated list
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "un"
+  arg_ainfo.shortname = "un";
+  arg_ainfo.longname = "user name";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "pw"
+  arg_ainfo.shortname = "pw";
+  arg_ainfo.longname = "password";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ky" - gives a specific user authentication for a
+  // limited amount of time
+  arg_ainfo.shortname = "ky";
+  arg_ainfo.longname = "user time key";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ua" - ""=no, "1"=yes 
+  arg_ainfo.shortname = "ua";
+  arg_ainfo.longname = "whether a user has been authenticated";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "er" - compressed arguments for the referer page
+  arg_ainfo.shortname = "er";
+  arg_ainfo.longname = "the compressed args of the refer page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "uan" - whether user authentication is needed
+  arg_ainfo.shortname = "uan";
+  arg_ainfo.longname = "whether user authentication is needed";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+void authenaction::configure (const text_t &key, const text_tarray &cfgline) {
+  // get the password filename
+  if (cfgline.size() == 1) {
+    if (key == "usersfile") usersfile = cfgline[0];
+    else if (key == "keyfile") keyfile = cfgline[0];
+    else if (key == "keydecay") keydecay = cfgline[0].getint();
+  }
+
+  action::configure (key, cfgline);
+}
+
+bool authenaction::init (ostream &logout) {
+
+  if (gdbmhome.empty()) {
+    logout << "ERROR (authenaction::init) gdbmhome is not set\n";
+    return false;
+  }
+
+  if (usersfile.empty()) usersfile = filename_cat (gdbmhome, "etc", "users.db");
+  if (keyfile.empty()) keyfile = filename_cat (gdbmhome, "etc", "key.db");
+
+  return action::init (logout);
+}
+
+bool authenaction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &/*args*/, 
+				  ostream &/*logout*/) {
+  return true;
+}
+
+// returns false if there is a major problem with the cgi arguments -- not
+// if authentication fails. If the authentication fails "un" will be empty
+bool authenaction::check_external_cgiargs (cgiargsinfoclass &argsinfo,
+					   cgiargsclass &args,
+					   outconvertclass &outconvert,
+					   const text_t &saveconf,
+					   ostream &logout) {
+
+  // no need to go further unless authentication is
+  // required by this page
+  if (args["uan"].empty()) return true;
+
+
+  // failure means we have to redirect to this action to get authentication
+  // (if we are not already doing this)
+
+  userinfo_t thisuser;
+
+  text_t &args_uan = args["uan"];  text_t &args_un = args["un"];
+  text_t &args_pw = args["pw"];    text_t &args_us = args["us"];
+  text_t &args_ug = args["ug"];    text_t &args_ky = args["ky"];
+  text_t &args_ua = args["ua"];    text_t &args_a = args["a"];
+
+  // we must have a username and a password or a key to
+  // do any authentication
+  args_ua.clear(); // default = false;
+  if (args_un.empty() || args_pw.empty()) args_us = "invalid";
+  else args_us = "failed";
+
+  // make sure we have a username
+  if (!args_un.empty() && get_user_info (usersfile, args_un, thisuser)) {
+    if (!args_pw.empty()) {
+      // we are authenticating using a password
+      if (check_passwd (thisuser, args_pw)) args_ua = "1"; // succeeded
+      
+    } else if (!args_ky.empty()) {
+      // we are authenticating using a key
+      if (check_key (keyfile, thisuser, args_ky, args_ug, keydecay)) args_ua = "1";
+      else args_us = "stalekey";
+    }
+  }
+
+  args_pw.clear(); // password goes no further
+  if (!args_ua.empty()) {
+    if (thisuser.enabled) {
+      bool haspermission = true;
+      // check to make sure the user is in the required group
+      if (!args_ug.empty()) {
+	haspermission = false;
+	text_t::const_iterator group_here = thisuser.groups.begin();
+	text_t::const_iterator group_end = thisuser.groups.end();
+	text_t thisgroup;
+	while (group_here != group_end) {
+	  group_here = getdelimitstr (group_here, group_end, ',', thisgroup);
+	  if (thisgroup == args_ug) {
+	    haspermission = true;
+	    break;
+	  }
+	}
+      }
+
+      if (haspermission) {
+	// succeeded, get info about this user
+	// note: we don't need to set "ug" as it is already set to what it needs to be
+	args_us = "enabled";
+	args_ky = generate_key (keyfile, args_un); // new key
+
+	// delete old keys around every 50 accesses
+	if (rand()%50 == 1) remove_old_keys (keyfile, keydecay);
+	
+      } else {
+	// succeeded, however, the user is not in the correct group
+	args_ua.clear();
+	args_us = "permissiondenied";
+	args_ky.clear();
+      }
+
+    } else {
+      // succeeded, however, the account is disabled
+      args_ua.clear();
+      args_us = "disabled";
+      args_ky.clear();
+    }
+
+  } else {
+    // failure, reset info about the user
+    args_ky.clear();
+  }
+
+  // we will have to redirect the user if authentication is needed,
+  // it failed, and we weren't on our way to be authenticated anyway
+  if ((!args_uan.empty()) && (args_ua.empty()) && (args_a != "a")) {
+    // need to save the current arguments in "er"
+    text_t &arg_er = args["er"];
+    if (!compress_save_args(argsinfo, saveconf, args, arg_er, outconvert, logout))
+      arg_er.clear();
+    
+    // needs to be decoded for use within forms
+    decode_cgi_arg (arg_er);    
+
+    // redirect to this action
+    args_a = "a";
+  }
+  
+  return true;
+}
+
+void authenaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				     response_t &response, text_t &response_data, 
+				     ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+void authenaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					   recptprotolistclass * /*protos*/, ostream &/*logout*/) {
+  // sets _authen:messageextra_ based on the value of args["us"]
+  //      _authen:hiddenargs_   to contain all the arguments that were
+  //                            explicitly set
+  disp.setmacro ("messagestatus", "authen", ("_authen:message" + args["us"]
+					     + "_"));
+  // change style of header and footer if page is a frame
+  if ((args["p"].empty()) || (args["p"] == "frameset")) {
+    disp.setmacro ("header", "authen", "_status:infoheader_(Log in)");
+    disp.setmacro ("header", "authenok", "_status:infoheader_(Log in)");
+    disp.setmacro ("footer", "authen", "_status:infofooter_(Log in)");
+    disp.setmacro ("footer", "authenok", "_status:infofooter_(Log in)");
+  }
+
+  // get a list of saved configuration arguments (if possible)
+  text_t saveconf;
+  text_tset saveconfset;
+  if (recpt != NULL) {
+    saveconf = recpt->get_configinfo().saveconf;
+    splitchar (saveconf.begin(), saveconf.end(), '-', saveconfset);
+  }
+  
+  text_t hiddenargs;
+  cgiargsclass::const_iterator args_here = args.begin();
+  cgiargsclass::const_iterator args_end = args.end();
+  while (args_here != args_end) {
+    // set this as a hidden argument if it came from the cgi arguments,
+    // its not the compressed arguments, the query string, a user name or
+    // password, and if it is not in the compressed arguments
+    if ((*args_here).second.source == cgiarg_t::cgi_arg &&
+	(*args_here).first != "e" && (*args_here).first != "q" &&
+	(*args_here).first != "un" && (*args_here).first != "pw" &&
+	saveconfset.find((*args_here).first) == saveconfset.end()) {
+      hiddenargs += "<input type=hidden name=\"" + (*args_here).first +
+	"\" value=\"_cgiarg" + (*args_here).first + "_\">\n";
+    }
+    
+    args_here++;
+  }
+
+  disp.setmacro ("hiddenargs", "authen", hiddenargs);
+}
+
+bool authenaction::do_action (cgiargsclass &args, recptprotolistclass * /*protos*/, 
+			      browsermapclass * /*browsers*/, displayclass &disp, 
+			      outconvertclass &outconvert, ostream &textout, 
+			      ostream &/*logout*/) {
+  if (args["us"] == "enabled") {
+    // have been authenticated
+    textout << outconvert << disp
+	    << "_authenok:header_\n_authenok:content_\n_authenok:footer_\n";
+    return true;
+  }
+  
+  // need to be authenticated
+  textout << outconvert << disp
+	  << "_authen:header_\n_authen:content_\n_authen:footer_\n";
+
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/recpt/authenaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/authenaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/authenaction.h	(revision 21083)
@@ -0,0 +1,82 @@
+/**********************************************************************
+ *
+ * authenaction.h -- authenticating users
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef AUTHENACTION_H
+#define AUTHENACTION_H
+
+#include "gsdlconf.h"
+#include "action.h"
+#include "text_t.h"
+#include "receptionist.h"
+
+
+// note: you need to tell this action about the receptionist
+// using set_receptionist
+
+class authenaction : public action {
+protected:
+  text_t usersfile;
+  text_t keyfile;
+  int keydecay;
+
+  receptionist *recpt;
+  
+public:
+  authenaction ();
+  virtual ~authenaction () {}
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+  
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  bool init (ostream &logout);
+  
+  text_t get_action_name () {return "a";}
+  
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  bool check_external_cgiargs (cgiargsinfoclass &argsinfo,
+			       cgiargsclass &args,
+			       outconvertclass &outconvert,
+			       const text_t &saveconf,
+			       ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+  
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+  
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/browseaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browseaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browseaction.cpp	(revision 21083)
@@ -0,0 +1,248 @@
+/**********************************************************************
+ *
+ * browseaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "browseaction.h"
+#include "querytools.h"
+#include "browseactiontools.h"
+#include "OIDtools.h"
+
+browseaction::browseaction(){
+
+ 
+
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "br";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  //the first browsing criterion -- collection metadata types
+  arg_ainfo.shortname = "b1";
+  arg_ainfo.longname = "browse criterion 1";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+ 
+  //the second browsing criterion -- collection metadata types + none - meaning
+  //only one browsing criterion.  None is the default.
+  arg_ainfo.shortname = "b2";
+  arg_ainfo.longname = "browse criterion 2";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+  //the number of documents to show per page -- if the box is empty then
+  //only the most basic divisions are made (so, first letter for A-Z, year 
+  //for date).
+  arg_ainfo.shortname = "bnu";
+  arg_ainfo.longname = "browse docs per page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::good;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  //The text to filter documents for browsing (only documents containing these 
+  //words will be browsed).
+  arg_ainfo.shortname = "bft";
+  arg_ainfo.longname = "browse filter text";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+
+  //Whether all or just some of the words in the filter box have to be present
+  //0 - any 1- all
+  arg_ainfo.shortname = "bt";
+  arg_ainfo.longname = "browse all or any";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+  
+}
+
+browseaction::~browseaction(){}
+
+bool browseaction::init (ostream &logout){
+  return true;
+}
+
+void browseaction::configure (const text_t &key, const text_tarray &cfgline){
+  action::configure(key, cfgline);
+}
+
+
+
+bool browseaction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &/*args*/, 
+				ostream &/*logout*/) {
+  // don't want to check anything yet.
+  
+  return true;
+}
+
+  
+void browseaction::get_cgihead_info (cgiargsclass &args, 
+				     recptprotolistclass *protos,
+				     response_t &response, 
+				     text_t &response_data, 
+				     ostream &logout){
+  response = content;
+  response_data = "text/html";
+
+  
+}
+
+void browseaction::define_internal_macros (displayclass &disp, 
+					   cgiargsclass &args, 
+					   recptprotolistclass *protos, 
+					   ostream &logout){
+ 
+}
+
+void browseaction::define_external_macros (displayclass &disp, 
+					   cgiargsclass &args, 
+					   recptprotolistclass *protos, 
+					   ostream &logout){
+  
+}
+
+bool browseaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			      browsermapclass *browsers, displayclass &disp, 
+			      outconvertclass &outconvert, ostream &textout, 
+			      ostream &logout){
+ 
+  if(args["c"].empty()) return false;
+  else if(get_document_list(args, protos, browsers, disp, outconvert, textout,
+			    logout)) return true;
+  else return false;
+}
+
+bool browseaction::get_document_list(cgiargsclass &args, 
+		recptprotolistclass *protos, browsermapclass *browsers, 
+		displayclass &disp, outconvertclass &outconvert, 
+		ostream &textout, ostream &logout){ 
+  
+  text_t collection = args["c"];
+  comerror_t err;
+  text_t list_type = "VList";  //result display type
+
+  //check that the protocol is alive
+  recptproto* colproto = protos->getrecptproto (collection, logout);
+  if(colproto == NULL) {
+    logout << outconvert << "ERROR: Null collection protocol trying to browse "
+	   << collection << "\n";
+    return false;
+  }
+  
+  //check the collection is responding/in place
+  ColInfoResponse_t *colinfo = recpt->get_collectinfo_ptr(colproto, collection,
+							  logout);
+  if(colinfo == NULL){
+    logout << outconvert << "ERROR: Null returned for get_collectinfo_ptr on "
+	   << collection << "in browseaction\n";
+    return false;
+  }
+
+  browserclass* br_ptr = browsers->getbrowser(list_type);
+
+  FilterRequest_t request;
+  FilterResponse_t response;
+
+  //set up browser structure 
+  br_ptr->set_filter_options(request, args);
+  br_ptr->load_metadata_defaults(request.fields);
+
+  //set up format information
+  format_t* formatptr = new format_t();
+  parse_formatstring(br_ptr->get_default_formatstring(), formatptr, 
+		     request.fields, request.getParents);
+
+  request.filterResultOptions = FROID | FRmetadata;
+  
+  text_t bf_string = "";
+  format_browsestring(args["bft"],bf_string,args.getintarg("bt"));
+  
+  set_browsefilter_options(request, bf_string, args);
+  
+  //set up browse filter string;
+  if(!args["bft"].empty()){
+
+    colproto->filter (collection, request, response, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii
+	     << "browseaction::get_document_list QueryFilter failed "
+	     << "for " << collection << " collection (" 
+	     << get_comerror_string (err) << ")\n";
+      return false;
+    }// if (err != noError) 
+
+  }// end if(!args["bft"].empty())
+  else {
+    text_tset metadata_items;
+    text_t temp = "Title";
+    metadata_items.insert(temp);
+    temp = "browselist";
+    if(!get_children(temp,args["c"],metadata_items,false,colproto,
+		     response,logout)) return false;
+  }
+
+  //get rid of documents that do not have the metadata element classified on
+  if(!remove_no_meta_results("Title",response, outconvert)) {
+    return false;
+    logout<<"ERROR: browseactiontools::remove_no_meta_results failed"<<endl;
+  }
+
+  textout << outconvert << disp << "_browse:header_\n" <<"_browse:content_";
+
+  
+  bool use_table = is_table_content (formatptr);
+  br_ptr->output_section_group (response, args, collection, 0, formatptr, 
+			      use_table, request.fields, request.getParents, 
+			      colproto, disp, outconvert, textout, logout);
+
+  textout << outconvert << disp << "_browse:footer_";
+    
+  
+  
+  return true;
+}
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/browseaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browseaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browseaction.h	(revision 21083)
@@ -0,0 +1,73 @@
+/**********************************************************************
+ *
+ * browseaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef BROWSEACTION_H
+#define BROWSEACTION_H
+
+#include "action.h"
+#include "receptionist.h"
+
+class browseaction : public action{
+ protected:
+  receptionist* recpt;
+  bool get_document_list(cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+ public:
+  browseaction();
+  virtual ~browseaction();
+
+  bool init (ostream &logout);
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  text_t get_action_name() {return "br";}
+  
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+				 response_t &response, text_t &response_data, 
+				 ostream &logout);
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+  
+  void define_external_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+  cgiargsinfoclass getargsinfo () {return argsinfo;};
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/browseactiontools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browseactiontools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browseactiontools.cpp	(revision 21083)
@@ -0,0 +1,129 @@
+/**********************************************************************
+ *
+ * browseactiontools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#include "browseactiontools.h"
+#include <ctype.h>
+
+void format_browsestring(text_t orig, text_t& formatted, int and_or)
+{
+  
+ 
+  text_t conj = "";
+  
+  if(and_or == 0){ conj = " | "; }
+  else { conj = " & "; }
+  text_t::const_iterator here = orig.begin();
+  text_t::const_iterator end = orig.end();
+  
+  //while not at the end of the filter string
+  while(here!=end){
+    //if seeing text, add it to the formatted string
+    if(!isspace(*here)){
+      formatted.push_back(*here);
+      here++;
+    }
+    //else, if seeing spaces, check that there is following text and add
+    //the ncessary conjugation if there is.
+    else if(isspace(*here)){
+      while(isspace(*here) && here!=end) here++;
+      if(here!=end) formatted += conj;
+    }
+  }
+
+}
+
+// this stuff is all copied from the queryoptions code - don't ask how it all
+// hangs in with the filters - those things are a mystery 
+void set_browsefilter_options(FilterRequest_t &request, text_t &browsestring,
+			      cgiargsclass &args)
+{
+  request.filterName = "QueryFilter";
+
+   OptionValue_t option;
+
+   option.name = "Term";
+   option.value = browsestring;
+   request.filterOptions.push_back (option);
+   
+   option.name = "QueryType";
+   option.value = "boolean";
+   request.filterOptions.push_back (option);
+  
+   option.name = "MatchMode";
+   option.value = (args.getintarg("bt")) ? "some" : "all";
+   request.filterOptions.push_back (option);
+   
+   option.name = "Casefold";
+   option.value = (args.getintarg("k")) ? "true" : "false";
+   request.filterOptions.push_back (option);
+   
+   option.name = "Stem";
+   option.value = (args.getintarg("s")) ? "true" : "false";
+   request.filterOptions.push_back (option);
+
+   option.name = "Maxdocs";
+   option.value = -1;
+   request.filterOptions.push_back (option);
+   
+   option.name = "Index";
+   option.value = "dtx";
+   request.filterOptions.push_back (option);
+     
+   
+}
+
+bool remove_no_meta_results(text_t metaname, FilterResponse_t &response, 
+			    outconvertclass outconvert)
+{
+  
+  ResultDocInfo_tarray::iterator check = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator done = response.docInfo.end();
+  // look through all the returned documents
+  while(check != response.docInfo.end()){
+   
+    //if the document doesn't have the metadata item classified on 
+    //remove it.
+    text_t title = *((*check).metadata.find(metaname)->second).values.begin();
+    if(title == "")
+      {
+	
+	response.docInfo.erase(check);
+	
+      }
+    else {
+     
+      check ++;
+     
+    }
+ 
+  }
+  return true;
+}
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/browseactiontools.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browseactiontools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browseactiontools.h	(revision 21083)
@@ -0,0 +1,48 @@
+/********************************************************************
+ *
+ * browseactiontools.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef BROWSEACTIONTOOLS_H
+#define BROWSEACTIONTOOLS_H
+
+#include "cgiargs.h"
+#include "recptproto.h"
+
+//this puts ands or ors into the querystring as necessary
+void format_browsestring(text_t orig, text_t& formatted, int and_or);
+
+//this thing sets up the search associated with a browse.  It's programmed by 
+//witchcraft, so I don't really know how/why it works - I lifted the code from
+//somewhere else.
+void set_browsefilter_options(FilterRequest_t &request, text_t &browsestring,
+			      cgiargsclass &args);
+
+//this thing filters out all the results of a request to the collection 
+//(whether it be for all documents or just the ones with specified terms)
+//that don't have the required "metaname" metadata element.
+bool remove_no_meta_results(text_t metaname, FilterResponse_t &response,
+			    outconvertclass outconvert);
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/browserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browserclass.cpp	(revision 21083)
@@ -0,0 +1,160 @@
+/**********************************************************************
+ *
+ * browserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "browserclass.h"
+#include <assert.h>
+
+
+browserclass::browserclass () {
+}
+
+browserclass::~browserclass () {
+}
+
+// configure should be called once for each configuration line
+// the default version does nothing
+void browserclass::configure (const text_t &/*key*/, const text_tarray &/*cfgline*/) {
+}
+
+// init should be called after all the configuration is done but
+// before any other methods are called
+bool browserclass::init (ostream &/*logout*/) {
+  return true;
+}
+
+// returns the name that specifies the browserclass type
+text_t browserclass::get_browser_name () {
+  return "";
+}
+
+void browserclass::processOID (cgiargsclass &/*args*/, recptproto * /*collectproto*/, ostream &/*logout*/) {
+}
+
+void browserclass::load_metadata_defaults (text_tset &/*metadata*/) {
+}
+
+text_t browserclass::get_default_formatstring () {
+  return "";
+}
+
+void browserclass::set_filter_options (FilterRequest_t &request, cgiargsclass &args) {
+  
+  OptionValue_t option;
+
+  if (args["a"] == "q") {
+    int arg_m = args.getintarg("m");
+    
+    option.name = "StartResults";
+    option.value = args["r"];
+    request.filterOptions.push_back (option);
+    
+    option.name = "EndResults";
+    int endresults = args.getintarg("o") + (args.getintarg("r") - 1);
+    //    int endresults = (args.getintarg("o")*3) + (args.getintarg("r") - 1);
+    if ((endresults > arg_m) && (arg_m != -1)) endresults = arg_m;
+    option.value = endresults;
+    request.filterOptions.push_back (option);
+
+  } else {
+    option.name = "StartResults";
+    option.value = args["r"];
+    request.filterOptions.push_back (option);
+    
+    option.name = "EndResults";
+    int endresults = 20 + (args.getintarg("r") - 1);
+    option.value = endresults;
+    request.filterOptions.push_back (option);
+  }
+}
+
+int browserclass::output_section_group (ResultDocInfo_t &/*section*/, cgiargsclass &/*args*/,
+					const text_t &/*collection*/, int /*colnumber*/, 
+					format_t * /*formatlistptr*/, bool /*use_table*/, 
+					text_tset &/*metadata*/, bool &/*getParents*/,
+					recptproto * /*collectproto*/, displayclass &/*disp*/, 
+					outconvertclass &/*outconvert*/, ostream &/*textout*/, 
+					ostream &/*logout*/) {
+  return 0;
+}
+
+int browserclass::output_section_group (FilterResponse_t &/*sections*/, cgiargsclass &/*args*/,
+					const text_t &/*collection*/, int /*colnumber*/, 
+					format_t * /*formatlistptr*/, bool /*use_table*/, 
+					text_tset &/*metadata*/, bool &/*getParents*/,
+					recptproto * /*collectproto*/, displayclass &/*disp*/, 
+					outconvertclass &/*outconvert*/, ostream &/*textout*/, 
+					ostream &/*logout*/) {
+  return 0;
+}
+
+bool operator==(const browserptr &x, const browserptr &y) {
+  return (x.b == y.b);
+}
+
+bool operator<(const browserptr &x, const browserptr &y) {
+  return (x.b < y.b);
+}
+
+// thebrowserclass remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void browsermapclass::addbrowser (browserclass *thebrowserclass) {
+  // can't add a null browserclass
+  assert (thebrowserclass != NULL);
+  if (thebrowserclass == NULL) return;
+  
+  // can't add a browserclass with no name
+  assert (!(thebrowserclass->get_browser_name()).empty());
+  if ((thebrowserclass->get_browser_name()).empty()) return;
+
+  browserptr aptr;
+  aptr.b = thebrowserclass;
+  browserptrs[thebrowserclass->get_browser_name()] = aptr;
+}
+
+// getbrowser will return the default browser if the browser 
+// could not be found
+browserclass *browsermapclass::getbrowser (const text_t &key) {
+  // can't find a browser with no name
+  if (key.empty()) return get_default_browser();
+
+  iterator here = browserptrs.find (key);
+  if (here == browserptrs.end()) return get_default_browser();
+  
+  return (*here).second.b;
+}
+
+void browsermapclass::setdefaultbrowser (const text_t &browsername) {
+  defaultbrowser = browsername;
+}
+
+browserclass *browsermapclass::get_default_browser () {
+
+  iterator here = browserptrs.find (defaultbrowser);
+  if (here == browserptrs.end())
+    // we'll just take the first in the list if
+    // no valid default was set
+    here = browserptrs.begin();
+  return (*here).second.b;
+}
Index: /main/tags/2.38/gsdl/src/recpt/browserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browserclass.h	(revision 21083)
@@ -0,0 +1,165 @@
+/**********************************************************************
+ *
+ * browserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+
+#ifndef BROWSERCLASS_H
+#define BROWSERCLASS_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "cgiargs.h"
+#include "display.h"
+#include "recptproto.h"
+#include "formattools.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+class browserclass {
+protected:
+
+public:
+  browserclass ();
+  virtual ~browserclass ();
+
+  // configure should be called once for each configuration line
+  virtual void configure (const text_t &key, const text_tarray &cfgline);
+
+  // init should be called after all the configuration is done but
+  // before any other methods are called
+  virtual bool init (ostream &logout);
+
+  // returns the name that specifies the browserclass type
+  virtual text_t get_browser_name ();
+  
+  virtual void processOID (cgiargsclass &args, recptproto *collectproto, ostream &logout);
+  
+  // load_metadata_defaults should be called before
+  // doing protocol call to get metadata for OID to
+  // be displayed by this browserclass. it adds fields
+  // to the metadata set that are needed by browserclass
+  // during display
+  virtual void load_metadata_defaults (text_tset &metadata);
+
+  virtual text_t get_default_formatstring ();
+
+  void set_filter_options (FilterRequest_t &request, cgiargsclass &args);
+  
+  // output_section_group returns the number of tabs to add before displaying the
+  // next section group
+  // The first version takes one result of a search/query action, the
+  // second takes all the results; ResultDocInfo_t is actually a child struct
+  // of FilterResponse_t items.  The second version tends to output parts of an
+  // abstract structure (e.g. for a table of contents/classifier list, the first
+  // for an individual document
+  virtual int output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+				    const text_t &collection, int colnumber, 
+				    format_t *formatlistptr, bool use_table, 
+				    text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, 
+				    ostream &logout);
+
+  virtual int output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+				    const text_t &collection, int colnumber, 
+				    format_t *formatlistptr, bool use_table, 
+				    text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, 
+				    ostream &logout);
+};
+
+
+// The browserptr function does not 'own' the browser. The 
+// browser should be deleted by the code which created it.
+class browserptr {
+public:
+  browserclass *b;
+
+  browserptr () {b=NULL;}
+};
+
+bool operator==(const browserptr &x, const browserptr &y);
+bool operator<(const browserptr &x, const browserptr &y);
+
+typedef map<text_t, browserptr, lttext_t> browserptrmap;
+
+// contains a list of browsers indexed by their name
+class browsermapclass {
+protected:
+  browserptrmap browserptrs;
+  text_t defaultbrowser;
+
+public:
+  // type support for browserptrmap
+  typedef browserptrmap::iterator iterator;
+  typedef browserptrmap::const_iterator const_iterator;
+  typedef browserptrmap::reference reference;
+  typedef browserptrmap::const_reference const_reference;
+  typedef browserptrmap::size_type size_type;
+
+  typedef browserptrmap::difference_type difference_type;
+  typedef browserptrmap::const_reverse_iterator const_reverse_iterator;
+  typedef browserptrmap::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return browserptrs.begin();}
+  const_iterator begin () const {return browserptrs.begin();}
+  iterator end () {return browserptrs.end();}
+  const_iterator end () const {return browserptrs.end();}
+
+  void erase(iterator pos) {browserptrs.erase(pos);}
+  void erase(iterator first, iterator last) {browserptrs.erase(first, last);}
+  browsermapclass &operator=(const browsermapclass &x) {browserptrs=x.browserptrs;return *this;}
+
+  bool empty () const {return browserptrs.empty();}
+  size_type size() const {return browserptrs.size();}
+
+
+  // added functionality
+  void clear () {browserptrs.erase(browserptrs.begin(),browserptrs.end());}
+
+  // thebrowserclass remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addbrowser (browserclass *thebrowserclass);
+
+  // getbrowser will return NULL if the browser could not be found
+  browserclass *getbrowser (const text_t &key);
+
+  void setdefaultbrowser (const text_t &browsername);
+
+  browserclass *get_default_browser ();
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/browsetools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browsetools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browsetools.cpp	(revision 21083)
@@ -0,0 +1,812 @@
+
+/**********************************************************************
+ *
+ * browsetools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+#include "browsetools.h"
+#include "OIDtools.h"
+
+// output_controls displays the detach, expand/contract contents,
+// expand/contract text and highlighting/no highlighting buttons
+
+void output_controls (cgiargsclass &args, const text_tarray &ibuttons,
+		      recptproto * /*collectproto*/, displayclass &disp, 
+		      outconvertclass &outconvert, ostream &textout, 
+		      ostream &/*logout*/) {
+
+  if (args["u"] != "1") {
+    
+    FilterResponse_t response;
+    text_tarray metadata;
+    text_tarray buttons;
+    
+    text_tarray::const_iterator here = ibuttons.begin();
+    text_tarray::const_iterator end = ibuttons.end();
+    
+    while (here != end) {
+      
+      if (*here == "Detach")
+	buttons.push_back ("_document:imagedetach_");
+      else if (*here == "Highlight") {
+	if (args["hl"] == "1") 
+	  buttons.push_back ("_document:imagenohighlight_");
+	else 
+	  buttons.push_back ("_document:imagehighlight_");
+      } else if (*here == "Expand Contents") {
+	if (args["gc"] == "1")
+	  buttons.push_back ("_document:imagecontracttoc_");
+	else 
+	  buttons.push_back ("_document:imageexpandtoc_");
+      } else if (*here == "Expand Text") {
+	if (args.getintarg("gt"))
+	  buttons.push_back ("_document:imagecontracttext_");
+	else 
+	  buttons.push_back ("_document:imageexpandtext_");
+      }
+      here ++;
+    }
+    
+    here = buttons.begin();
+    end = buttons.end();
+    int count = 0;
+    while (here != end) {
+      if ((count != 0) && ((count % 2) == 0)) textout << "<br>\n";
+      textout << outconvert << disp << *here;
+      count ++;
+      here ++;
+    }
+  }
+}
+
+
+// at the moment this just writes out the html to display 
+// the cover image (assuming it's called cover.jpg)
+// this whole thing should be done with a call to the collection
+// server which would send a link to the cover image if there
+// was one otherwise send title, author and stuff
+void output_cover_image (cgiargsclass &args, recptproto * /*collectproto*/, 
+			 displayclass &disp, outconvertclass &outconvert, 
+			 ostream &textout, ostream &/*logout*/) {
+  
+  if (args["d"].empty()) return;
+  
+  textout << outconvert << disp << 
+    "<img src=\"_httpcollimg_/_thisOID_/cover.jpg\"><br>\n";
+}
+
+void output_titles (cgiargsclass &args, recptproto *collectproto, 
+		    formatinfo_t &formatinfo, displayclass &disp, 
+		    outconvertclass &outconvert, ostream &textout, 
+		    ostream &logout) {
+
+  if (args["d"].empty()) return;
+  
+  text_tset metadata;
+  bool getParents;
+  FilterResponse_t response;
+
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatinfo.DocumentHeading, formatlistptr, metadata, getParents);
+
+  if (!get_info (args["d"], args["c"], metadata, getParents, collectproto, response, logout))
+    return;
+
+  textout << outconvert << disp 
+	  << get_formatted_string (args["c"],collectproto,
+				   response.docInfo[0], disp, formatlistptr,
+				   logout);
+}
+
+//this function outputs the related documents in the format specified 
+//in the collection configuration file if the collection preferences
+//indicate they wish related documents to be displayed.
+void output_related_docs (cgiargsclass &args, recptproto *collectproto, 
+			  formatinfo_t &formatinfo, displayclass &disp, 
+			  outconvertclass &outconvert, ostream &textout, 
+			  ostream &logout) {
+
+  if (args["d"].empty()) return; //if no OID
+  if (args["rd"] != "1") return; //if preferences say no related documents
+  
+  text_tset metadata;
+  bool getParents;
+  FilterResponse_t response;
+
+  //create new format pointer and parse the related doc format 
+  //string specified in the collection config file
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatinfo.RelatedDocuments, formatlistptr, metadata, getParents);
+
+  if (!get_info (args["d"], args["c"], metadata, getParents, collectproto, response, logout))
+    return;
+  
+  //get the format string from formattools.cpp
+  text_t relateddocs =  get_formatted_string (args["c"],collectproto, response.docInfo[0], 
+					      disp, formatlistptr, logout);
+  //output the related documents
+  textout << outconvert << disp << relateddocs;
+}
+
+
+
+static void recurse_contents (ResultDocInfo_t &section, cgiargsclass &args, bool fulltoc,
+			      browserclass *bptr, text_tset &metadata, bool &getParents, 
+			      format_t *formatlistptr, format_tmap &formatlistmap, 
+			      formatinfo_t &formatinfo, browsermapclass *browsermap, 
+			      int tabcount, recptproto *collectproto, displayclass &disp, 
+			      outconvertclass &outconvert, ostream &textout, ostream &logout) {
+  text_t formatstring;
+
+  bool is_classify = false;
+  if (args["d"].empty() || fulltoc) is_classify = true;
+
+  // output this section 
+  bool use_table = is_table_content (formatlistptr);
+  tabcount += bptr->output_section_group (section, args, "", tabcount, formatlistptr, use_table, 
+					  metadata, getParents, collectproto, disp, outconvert, 
+					  textout, logout);
+
+  text_t classification;
+  if (!is_classify) classification = "Document";
+  else get_top (args["cl"], classification);
+
+  int haschildren = section.metadata["haschildren"].values[0].getint();
+  const text_t &doctype = section.metadata["doctype"].values[0];
+  text_t classifytype = section.metadata["childtype"].values[0];
+  // HLists and DateLists are displayed as VLists when contents 
+  // are expanded, Paged documents are displayed as HLists
+  if (classifytype == "HList" || classifytype == "DateList") classifytype = "VList";
+  if (classifytype == "Paged") classifytype = "HList";
+
+  // recurse through children
+  if ((haschildren == 1) && (!is_classify || fulltoc || doctype == "classify")) {
+
+    // get browser for displaying children
+    bptr = browsermap->getbrowser (classifytype);
+    bptr->load_metadata_defaults (metadata);
+
+    // get the formatstring if there is one 
+    if (!get_formatstring (classification, classifytype, 
+			   formatinfo.formatstrings, formatstring))
+      formatstring = bptr->get_default_formatstring();
+
+    format_tmap::const_iterator it = formatlistmap.find (formatstring);
+    // check if formatlistptr is cached
+    if (it != formatlistmap.end()) formatlistptr = (*it).second;
+    else {
+      formatlistptr = new format_t();
+      parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+      formatlistmap[formatstring] = formatlistptr;
+    }
+
+    FilterResponse_t tmp;
+    get_children (section.OID, args["c"], metadata, getParents, collectproto, tmp, logout);
+    ResultDocInfo_tarray::iterator thisdoc = tmp.docInfo.begin();
+    ResultDocInfo_tarray::iterator lastdoc = tmp.docInfo.end();
+
+    while (thisdoc != lastdoc) {
+      recurse_contents (*thisdoc, args, fulltoc, bptr, metadata, getParents, 
+			formatlistptr, formatlistmap, formatinfo, browsermap, 
+			tabcount, collectproto, disp, outconvert, textout, logout);
+      thisdoc ++;
+    }
+  }
+}
+
+
+// expanded_contents recurses through all contents. there's a special case
+// for an HList when contents are expanded (i.e. it's displayed as a VList)
+//
+// if we're inside a document we expand all contents from the top,
+// if we're at classification level we'll just expand out those contents below 
+// the current one
+
+void expanded_contents (cgiargsclass &args, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			recptproto *collectproto, displayclass &disp, 
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout) {
+  
+  if (args["d"].empty() && args["cl"].empty()) return;
+  text_t OID;
+  
+  FilterResponse_t response;
+  bool getParents = false;
+  text_tset metadata;
+  text_t classifytype, classification, formatstring;
+
+  if (!args["d"].empty()) {
+    // document level
+    if (fulltoc) {
+      get_top (args["cl"], OID);
+      classification = OID;
+    }
+    else {
+      // always expand document level from top
+      get_top (args["d"], OID);
+      classification = "Document";
+    }
+  } else {
+    // classification level
+    OID = args["cl"];
+    get_top (args["cl"], classification);
+  }
+
+  // get classifytype of this level
+  text_t tOID;
+  if (is_top(OID)) {
+    classifytype = "thistype";
+    tOID = OID;
+  } else {
+    classifytype = "childtype";
+    tOID = get_parent (OID);
+  }
+  metadata.insert (classifytype);
+
+  if (!get_info (tOID, args["c"], metadata, getParents, collectproto, response, logout))
+    return;
+  classifytype = response.docInfo[0].metadata[classifytype].values[0];
+  // if we still don't have a classifytype we'll use the default
+  if (classifytype.empty()) {
+    browserclass *bptr = browsermap->get_default_browser ();
+    classifytype = bptr->get_browser_name ();
+  }
+
+  // HLists are displayed as VLists when contents are expanded,
+  // Paged documents are displayed as HLists
+  if (classifytype == "HList") {
+    classifytype = "VList";
+    text_t pOID = get_parent (OID);
+    if (!pOID.empty()) {
+      OID = pOID;
+      // this is assuming that top levels are always 'Invisible' !!!
+      if (is_top (OID)) classifytype = "Invisible";
+    }
+  }
+  if (classifytype == "Paged") classifytype = "HList";
+
+  metadata.erase (metadata.begin(), metadata.end());
+		  
+  // metadata elements needed by recurse_contents
+  metadata.insert ("childtype");
+  metadata.insert ("doctype");
+  metadata.insert ("haschildren");
+
+  // load up metadata array with browser defaults
+  browserclass *bptr = browsermap->getbrowser (classifytype);
+  bptr->load_metadata_defaults (metadata);
+
+  // get the formatstring if there is one or use the browsers default
+  if (!get_formatstring (classification, classifytype, 
+			 formatinfo.formatstrings, formatstring))
+    formatstring = bptr->get_default_formatstring();
+
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+
+  // protocol call
+  if (!get_info (OID, args["c"], metadata, getParents, collectproto, response, logout))
+    return;
+
+  format_tmap formatlistmap;
+  formatlistmap[formatstring] = formatlistptr;
+
+  recurse_contents (response.docInfo[0], args, fulltoc, bptr, metadata, 
+		    getParents, formatlistptr, formatlistmap, formatinfo, browsermap, 
+		    tabcount, collectproto, disp, outconvert, textout, logout);
+
+  // clean up format list pointers
+  format_tmap::const_iterator here = formatlistmap.begin();
+  format_tmap::const_iterator end = formatlistmap.end();
+  while (here != end) {
+    delete (*here).second;
+    here ++;
+  }
+}
+
+
+static void load_formatstring (const text_t &classifytype, text_tset &metadata,
+			       bool &getParents, const text_t &classification, 
+			       browsermapclass *browsermap, formatinfo_t &formatinfo,
+			       format_tmap &formatlistmap) {
+  text_t formatstring;
+
+  // load up metadata array with browser defaults
+  browserclass *bptr = browsermap->getbrowser (classifytype);
+  bptr->load_metadata_defaults (metadata);
+
+  // get the formatstring if there is one or use the browsers default
+  if (!get_formatstring (classification, classifytype, 
+			 formatinfo.formatstrings, formatstring))
+    formatstring = bptr->get_default_formatstring();
+
+  // see if it's cached
+  format_tmap::const_iterator it = formatlistmap.find (formatstring);
+  if (it == formatlistmap.end()) {
+    format_t *formatlistptr = new format_t();
+    parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+    formatlistmap[formatstring] = formatlistptr;
+  }
+}
+
+static void load_formatstrings (FilterResponse_t &response, text_tset &metadata,
+				bool &getParents, const text_t &classification,
+				browsermapclass *browsermap, formatinfo_t &formatinfo, 
+				format_tmap &formatlistmap) {
+
+  text_tset cache;
+
+  ResultDocInfo_tarray::iterator thisdoc = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator lastdoc = response.docInfo.end();
+
+  while (thisdoc != lastdoc) {
+
+    if (is_top ((*thisdoc).OID))
+      load_formatstring ((*thisdoc).metadata["thistype"].values[0], metadata, 
+			 getParents, classification, browsermap, formatinfo, 
+			 formatlistmap);
+
+    text_t &childtype = (*thisdoc).metadata["childtype"].values[0];
+    text_tset::const_iterator it = cache.find (childtype);
+    if (it == cache.end()) {
+      load_formatstring (childtype, metadata, getParents, classification,
+			 browsermap, formatinfo, formatlistmap);
+      cache.insert (childtype);
+    }
+    thisdoc ++;
+  }
+}
+
+static void output_parents (FilterResponse_t &response, cgiargsclass &args, 
+			    browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			    format_tmap &formatlistmap, const text_t &classification,
+			    int &tabcount, text_tset &metadata, bool &getParents,
+			    recptproto *collectproto, displayclass &disp, 
+			    outconvertclass &outconvert, ostream &textout, 
+			    ostream &logout) {
+
+  format_t *formatlistptr = NULL;
+  text_t classifytype, formatstring;
+  bool use_table, first = true;
+  ResultDocInfo_tarray::iterator thisparent = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator lastparent = response.docInfo.end();
+  while (thisparent != lastparent) {
+
+    // get classifytype of this level
+    if (is_top ((*thisparent).OID)) classifytype = (*thisparent).metadata["thistype"].values[0];
+    else if (!first) classifytype = (*(thisparent-1)).metadata["childtype"].values[0];
+    
+    // if we still don't have a classifytype we'll use the default
+    if (classifytype.empty()) {
+      browserclass *bptr = browsermap->get_default_browser ();
+      classifytype = bptr->get_browser_name ();
+    }
+    
+    browserclass *bptr = browsermap->getbrowser (classifytype);
+
+    // get the formatstring if there is one or use the browsers default
+    if (!get_formatstring (classification, classifytype, 
+			   formatinfo.formatstrings, formatstring))
+      formatstring = bptr->get_default_formatstring();
+    
+    // see if it's cached
+    format_tmap::const_iterator it = formatlistmap.find (formatstring);
+    if (it != formatlistmap.end()) formatlistptr = (*it).second;
+    else {
+      logout << "browsetools error\n";
+      return;
+    }
+    
+    use_table = is_table_content (formatlistptr);
+    tabcount += bptr->output_section_group (*thisparent, args, "", tabcount, formatlistptr, 
+					    use_table, metadata, getParents, collectproto, 
+					    disp, outconvert, textout, logout);
+    first = false;
+    thisparent ++;
+  }
+}
+
+void contracted_contents (cgiargsclass &args, int tabcount, bool fulltoc, 
+			  browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			  recptproto *collectproto, displayclass &disp, 
+			  outconvertclass &outconvert, ostream &textout, 
+			  ostream &logout) {
+
+  FilterResponse_t response;
+  text_tset metadata;
+  bool getParents = false;
+  text_t formatstring;
+  text_tarray parents;
+  text_t OID = args["d"];
+  text_t classification = "Document";
+
+  // if we're not outputting the TOC for a valid OID, then we should be giving
+  // the TOC of a classification
+  if (OID.empty()) {
+    OID = args["cl"];
+    get_top (OID, classification);
+  } 
+  // if we're to give the full TOC of a document, get the parent for the whole
+  // document now
+  else if (fulltoc)
+    get_top (args["cl"], classification);    
+
+  bool haschildren = has_children (OID, args["c"], collectproto, logout);
+
+  if ((!args["d"].empty()) && fulltoc)
+    get_parents_array (args["cl"] + ".fc", parents);
+  if (haschildren) get_parents_array (OID + ".fc", parents);
+  else get_parents_array (OID, parents);
+
+  if (!parents.empty()) {
+    // get classifytypes of each parent
+    metadata.insert ("thistype");
+    metadata.insert ("childtype");
+    
+    if (!get_info (parents, args["c"], metadata, getParents, collectproto, response, logout))
+      return;
+    
+    // get formatstrings for all parents
+    format_tmap formatlistmap;  
+    load_formatstrings (response, metadata, getParents, classification, 
+			browsermap, formatinfo, formatlistmap);
+
+    if (!get_info (parents, args["c"], metadata, getParents, collectproto, response, logout))
+      return;
+    
+    // display each parent
+    output_parents (response, args, browsermap, formatinfo, formatlistmap, 
+		    classification, tabcount, metadata, getParents, 
+		    collectproto, disp, outconvert, textout, logout);
+    
+    metadata.erase (metadata.begin(), metadata.end());
+    
+    // clean up cached format list pointers
+    format_tmap::const_iterator here = formatlistmap.begin();
+    format_tmap::const_iterator end = formatlistmap.end();
+    while (here != end) {
+      delete (*here).second;
+      here ++;
+    }
+  }
+
+  // get childrens classifytype
+  text_t classifytype;
+  int numparents = response.docInfo.size();
+  if (!parents.empty())
+    classifytype = response.docInfo[numparents-1].metadata["childtype"].values[0];
+  else {
+    // use the default
+    browserclass *bptr = browsermap->get_default_browser ();
+    classifytype = bptr->get_browser_name ();
+  }
+    
+  // load up metadata array with browser defaults
+  browserclass *bptr = browsermap->getbrowser (classifytype);
+  bptr->load_metadata_defaults (metadata);
+
+  // get the formatstring if there is one or use the browsers default
+  if (!get_formatstring (classification, classifytype, 
+			 formatinfo.formatstrings, formatstring))
+    formatstring = bptr->get_default_formatstring();
+
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+
+  if (haschildren) 
+    get_children (OID, args["c"], metadata, getParents,
+		  collectproto, response, logout);
+  else if (!is_top(OID)) {
+    get_children (OID + ".pr", args["c"], metadata, getParents, 
+		  collectproto, response, logout);
+    haschildren = true;
+  }
+
+  // display children
+  if (haschildren) {
+    bool use_table = is_table_content (formatlistptr);
+    // collection used to be "" // **** // check with Stef!!!!
+    bptr->output_section_group (response, args, args["c"], tabcount, formatlistptr, use_table, 
+				metadata, getParents, collectproto, disp, outconvert, 
+				textout, logout);
+  }
+  delete formatlistptr;
+}
+
+/**
+ * This function outputs contents of a classifier to the reader
+ * including parent levels
+ */
+void expand_show_contents (cgiargsclass &args, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo,
+			recptproto *collectproto, displayclass &disp,
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout)
+{
+
+	int coloffset = 0;
+	text_tarray parents;
+	FilterResponse_t response;
+ 	text_t OID = args["d"];
+	if (OID.empty()) OID = args["cl"];
+
+	bool haschildren = has_children (OID, args["c"], collectproto, logout);
+
+	// get parents list
+	if (!is_top(OID)) get_parents_array (OID, parents);
+	if (args["d"].empty() || haschildren || parents.empty())
+		parents.push_back(OID);
+
+	// if inside a book top title is needed
+	if (!args["d"].empty()) {
+		
+		coloffset = 1;
+		text_t classification, classifytype, formatstring, topOID = parents[0];
+		text_tset metadata;
+		format_t *formatlistptr = new format_t();
+		bool use_table, getParents = false;
+		
+		get_top (args["cl"], classification);
+
+		// getting information about top OID
+		metadata.insert ("thistype");
+
+		get_info ( topOID, args["c"], metadata, getParents, collectproto, response, logout);
+		if (!response.docInfo[0].metadata["thistype"].values.empty()) 
+			classifytype = response.docInfo[0].metadata["thistype"].values[0];
+
+		browserclass *bptr = browsermap->getbrowser (classifytype);
+
+		if (classifytype.empty()) {
+			bptr = browsermap->get_default_browser();
+		}
+
+		// get the formatstring if there is one or use the browsers default
+		if (!get_formatstring (classification, classifytype, 
+			formatinfo.formatstrings, formatstring))
+				formatstring = bptr->get_default_formatstring();
+
+		parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+
+		metadata.insert ("doctype");
+		metadata.insert ("haschildren");
+
+		get_info (topOID, args["c"], metadata, getParents, collectproto, response, logout);
+
+		// ouput top OID section
+		use_table = is_table_content (formatlistptr);
+		bptr->output_section_group (response.docInfo[0], args, "", tabcount, formatlistptr, use_table,
+				metadata, getParents, collectproto, disp, outconvert, textout, logout);
+
+	}
+
+	recurse_contents_levels (parents, args, coloffset, tabcount, fulltoc, browsermap, 
+		formatinfo, collectproto, disp, outconvert, textout, logout);
+
+	textout << "</table></td></tr></table>\n";
+}
+
+void recurse_contents_levels (text_tarray &parents, 
+			cgiargsclass &args, int coloffset, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo,
+			recptproto *collectproto, displayclass &disp,
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout)
+{
+	FilterResponse_t response;
+	text_tset metadata;
+	text_t OID, formatstring, classification, classifytype;;
+	bool use_table, getParents = false;
+	int haschildren = 0;
+	format_t *formatlistptr = new format_t();
+
+	// display children for last level
+	if (tabcount == (parents.size() - 1)) {
+
+		logout << "@@@lastlevel@@@\n";
+		// setting metadata fields 
+		metadata.insert ("thistype");
+		metadata.insert ("childtype");
+		metadata.insert ("haschildren");
+
+		OID = parents[tabcount];
+		get_info (OID, args["c"], metadata, getParents, collectproto, response, logout);
+		get_top (OID, classification);
+
+		if (!response.docInfo.empty())
+			haschildren = response.docInfo[0].metadata["haschildren"].values[0].getint();
+
+		// get childrens classifytype
+		if (!response.docInfo.empty())
+			classifytype = response.docInfo[0].metadata["childtype"].values[0];
+		else {
+			// use the default
+			browserclass *bptr = browsermap->get_default_browser ();
+			classifytype = bptr->get_browser_name ();
+		}
+
+		// load up metadata array with browser defaults
+		browserclass *bptr = browsermap->getbrowser (classifytype);
+		bptr->load_metadata_defaults (metadata);
+
+		// get the formatstring if there is one or use the browsers default
+		if (!get_formatstring (classification, classifytype, 
+			formatinfo.formatstrings, formatstring))
+				formatstring = bptr->get_default_formatstring();
+
+		parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+
+		if (haschildren) 
+			get_children (OID, args["c"], metadata, getParents,
+				collectproto, response, logout);
+		else if (!is_top(OID)) {
+			get_children (OID + ".pr", args["c"], metadata, getParents, 
+			collectproto, response, logout);
+			haschildren = true;
+		}
+
+		// display children
+		if (haschildren) {
+			use_table = is_table_content (formatlistptr);
+			bptr->output_section_group (response, args, args["c"], coloffset + tabcount, formatlistptr, use_table, 
+						metadata, getParents, collectproto, disp, outconvert, 
+						textout, logout);
+		}
+
+	} else {
+
+		text_t pOID;
+		OID = parents[tabcount];
+		get_top (OID, classification);
+
+		// load metadata fields
+		metadata.insert ("thistype");
+		metadata.insert ("childtype");
+		metadata.insert ("haschildren");
+		metadata.insert ("doctype");
+
+		if (tabcount) pOID = parents[tabcount-1];
+		else pOID = OID;
+		get_info (pOID, args["c"], metadata, getParents, collectproto, response, logout);
+
+		// get classifytype of this level
+		if (is_top (pOID)) classifytype = response.docInfo[0].metadata["childtype"].values[0];
+		else classifytype = response.docInfo[0].metadata["thistype"].values[0];
+
+		// if we still don't have a classifytype we'll use the default
+		if (classifytype.empty()) {
+			browserclass *bptr = browsermap->get_default_browser ();
+			classifytype = bptr->get_browser_name ();
+		}
+
+		browserclass *bptr = browsermap->getbrowser (classifytype);
+
+		// get the formatstring if there is one or use the browsers default
+		if (!get_formatstring (classification, classifytype, 
+				formatinfo.formatstrings, formatstring))
+			formatstring = bptr->get_default_formatstring();
+
+
+		// parse format string 
+		parse_formatstring (formatstring, formatlistptr, metadata, getParents);
+
+		use_table = is_table_content (formatlistptr);
+
+		get_children (OID, args["c"], metadata, getParents, collectproto, response, logout);
+
+		ResultDocInfo_tarray::iterator thissibling = response.docInfo.begin();
+		ResultDocInfo_tarray::iterator lastsibling = response.docInfo.end();
+
+		while (thissibling != lastsibling) {
+
+			logout << "@@@level:@@@" << tabcount << "\n";
+
+			bptr->output_section_group (*thissibling, args, args["c"], coloffset + tabcount, formatlistptr, 
+					use_table, metadata, getParents, collectproto, 
+					disp, outconvert, textout, logout);
+			
+			if ((*thissibling).OID == parents[tabcount+1]) {
+				recurse_contents_levels (parents, args, coloffset, tabcount+1, fulltoc, browsermap,
+					formatinfo, collectproto, disp, outconvert,textout, logout);
+			}
+
+			thissibling ++;
+		}
+	}
+	delete formatlistptr;
+}
+
+/**
+ * This function outputs the contents of a classifier list to the reader - 
+ * the document will in fact be empty, so this does the "real" output
+ */
+void output_toc (cgiargsclass &args, browsermapclass *browsermap,
+                 formatinfo_t &formatinfo, recptproto *collectproto,
+                 displayclass &disp, outconvertclass &outconvert,
+                 ostream &textout, ostream &logout) {
+
+  int tabcount = 0;
+  bool havecontrols = false;
+  bool fulltoc = false;
+
+  if (args["cl"] != "search") {
+    // see if there's a FullTOC string
+    text_t cl_top, full_toc;
+    get_top (args["cl"], cl_top);
+    if (get_formatstring (cl_top, "FullTOC", formatinfo.formatstrings, full_toc))
+      if (full_toc == "true") fulltoc = true;
+  }
+  
+  // get the cover image (if there is one) and the control buttons
+  // if we're inside a book
+  if ((!fulltoc) && (!args["d"].empty())) {
+    textout << "<center>\n";
+    textout << outconvert << disp << "<p><table width=_pagewidth_ cellpadding=0 cellspacing=0><tr>\n";
+    textout << "<td valign=top align=left";
+    if (formatinfo.DocumentContents) textout << " width=200>\n";
+    else textout << " width=100%>\n";
+    if (formatinfo.DocumentImages) 
+      output_cover_image (args, collectproto, disp, outconvert, textout, logout);
+    else if (formatinfo.DocumentTitles)
+      output_titles (args, collectproto, formatinfo, disp, outconvert, textout, logout);
+    if (args["u"] != "1") {
+      output_controls (args, formatinfo.DocumentButtons, collectproto, disp, 
+		       outconvert, textout, logout);
+    }
+    textout << "</td><td valign=top>\n";  
+    havecontrols = true;
+  }
+
+  if (formatinfo.DocumentContents || args["d"].empty()) {
+    if (args.getintarg("gc") == 1) {
+      
+      // expanded table of contents
+      expanded_contents (args, tabcount, fulltoc, browsermap, formatinfo, 
+			 collectproto, disp, outconvert, textout, logout);
+    } else if (args.getintarg("gc") == 2) {
+
+		// expand visible levels of table of contents
+	  expand_show_contents(args, tabcount, fulltoc, browsermap, formatinfo,
+			collectproto, disp, outconvert, textout, logout);
+	} else {
+      
+      // contracted table of contents
+      contracted_contents (args, tabcount, fulltoc, browsermap, formatinfo, 
+			   collectproto, disp, outconvert, textout, logout);
+    }
+  }
+
+  if (havecontrols) textout << "</td></tr></table></center>\n"; 
+
+  //if there is a format specified in the config file then
+  //try to display the related documents (may not be displayed
+  //if preference file does not indicate a wish to display
+  //related documents.
+  if (!formatinfo.RelatedDocuments.empty())
+    output_related_docs(args, collectproto, formatinfo, disp, outconvert, textout, logout);
+ 
+}
+
Index: /main/tags/2.38/gsdl/src/recpt/browsetools.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/browsetools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/browsetools.h	(revision 21083)
@@ -0,0 +1,85 @@
+/**********************************************************************
+ *
+ * browsetools.h --
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef BROWSETOOLS_H
+#define BROWSETOOLS_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "cgiargs.h"
+#include "display.h"
+#include "recptproto.h"
+#include "formattools.h"
+#include "browserclass.h"
+
+typedef map<text_t, format_t*, lttext_t> format_tmap; 
+
+void expanded_contents (cgiargsclass &args, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			recptproto *collectproto, displayclass &disp, 
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout);
+
+void expand_show_contents (cgiargsclass &args, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			recptproto *collectproto, displayclass &disp, 
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout);
+
+void recurse_contents_levels (text_tarray &parents, 
+			cgiargsclass &args, int coloffset, int tabcount, bool fulltoc,
+			browsermapclass *browsermap, formatinfo_t &formatinfo,
+			recptproto *collectproto, displayclass &disp,
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout);
+
+void contracted_contents (cgiargsclass &args, int tabcount, bool fulltoc, 
+			  browsermapclass *browsermap, formatinfo_t &formatinfo, 
+			  recptproto *collectproto, displayclass &disp, 
+			  outconvertclass &outconvert, ostream &textout, 
+			  ostream &logout);
+
+void output_toc (cgiargsclass &args, browsermapclass *browsermap,
+                 formatinfo_t &formatinfo, recptproto *collectproto,
+                 displayclass &disp, outconvertclass &outconvert,
+                 ostream &textout, ostream &logout);
+
+void output_titles (cgiargsclass &args, recptproto *collectproto, 
+		    formatinfo_t &formatinfo, displayclass &disp, 
+		    outconvertclass &outconvert, ostream &textout, 
+		    ostream &logout);
+
+void output_controls (cgiargsclass &args, const text_tarray &ibuttons,
+		      recptproto *collectproto, displayclass &disp, 
+		      outconvertclass &outconvert, ostream &textout, 
+		      ostream &logout);
+    
+void output_cover_image (cgiargsclass &args, recptproto *collectproto, 
+			 displayclass &disp, outconvertclass &outconvert, 
+			 ostream &textout, ostream &logout);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/cgiargs.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiargs.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiargs.cpp	(revision 21083)
@@ -0,0 +1,274 @@
+/**********************************************************************
+ *
+ * cgiargs.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "cgiargs.h"
+#include "gsdlunicode.h"
+
+
+
+void cgiarg_t::clear () {
+  value.clear();
+  source = program_arg;
+}
+
+cgiarg_t &cgiarg_t::operator=(const cgiarg_t &x) {
+  value=x.value;
+  source=x.source;
+  return *this;
+}
+
+
+bool operator==(const cgiarg_t &x, const cgiarg_t &y) {
+  return ((x.value == y.value) && (x.source == y.source));
+}
+
+bool operator<(const cgiarg_t &x, const cgiarg_t &y) {
+  return ((x.value < y.value) ||
+	  ((x.value == y.value) && (x.source == y.source)));
+}
+
+
+
+
+// constructors
+cgiargsclass::cgiargsclass () {
+}
+
+
+// this returns NULL if there isn't an entry with a value of
+// 'key' already defined
+
+void cgiargsclass::setarg (const text_t &key, const text_t &value,
+			   cgiarg_t::source_t source) {
+  cgiarg_t temparg;
+  temparg.value = value;
+  temparg.source = source;
+  args[key] = temparg;
+}
+
+void cgiargsclass::setdefaultarg (const text_t &key, const text_t &value,
+				  cgiarg_t::source_t source) {
+  if (getarg(key) == NULL) setarg (key, value, source);
+}
+
+void cgiargsclass::setintarg (const text_t &key, int value,
+			      cgiarg_t::source_t source) {
+  setarg (key, value, source);
+}
+
+void cgiargsclass::setdefaultintarg (const text_t &key, int value,
+				     cgiarg_t::source_t source) {
+  if (getarg(key) == NULL) setintarg (key, value, source);
+}
+
+void cgiargsclass::setcarg (const text_t &key, unsigned short c,
+			    cgiarg_t::source_t source) {
+  text_t t; 
+  t.push_back(c);
+  setarg(key,t, source);
+}
+
+void cgiargsclass::setdefaultcarg (const text_t &key, unsigned short c,
+				   cgiarg_t::source_t source) {
+  if (getarg(key) == NULL) setcarg (key, c, source);
+}
+
+text_t *cgiargsclass::getarg (const text_t &key) {
+  iterator here = args.find (key);
+  if (here == args.end()) return NULL;
+
+  return &((*here).second.value);
+}
+
+int cgiargsclass::getintarg (const text_t &key) {
+  text_t *text = getarg (key);
+  if (text == NULL) return 0;
+  return text->getint();
+}
+
+
+
+// stream operators to print cgi arguments for debugging purposes
+ostream &operator<<(ostream &outs, const cgiargsclass &args) {
+  utf8outconvertclass text_t2utf8;
+  cgiargsclass::const_iterator here = args.begin ();
+  cgiargsclass::const_iterator end = args.end ();
+
+  outs << "*** cgiargsclass\n";
+  
+  while (here != end) {
+    outs << text_t2utf8 << " \"" << (*here).first << "\"=\"" << 
+      (*here).second.value << "\"\n";
+    here++;
+  }
+  outs << "\n";
+
+  return outs;
+}
+
+
+
+cgiarginfo::cgiarginfo () {
+  multiplechar = false;
+  multiplevalue = false;
+  defaultstatus = weak;
+  argdefault.clear();
+  savedarginfo = can;
+}
+
+
+bool operator==(const cgiarginfo &x, const cgiarginfo &y) {
+  return ((x.shortname == y.shortname) &&
+	  (x.longname == y.longname) &&
+	  (x.multiplechar == y.multiplechar) &&
+	  (x.multiplevalue == y.multiplevalue) &&
+	  (x.defaultstatus == y.defaultstatus) &&
+	  (x.argdefault == y.argdefault) &&
+	  (x.savedarginfo == y.savedarginfo));
+}
+
+bool operator<(const cgiarginfo &x, const cgiarginfo &y) {
+  return ((x.shortname < y.shortname) ||
+	  ((x.shortname == y.shortname) &&
+	   ((x.longname < y.longname) ||
+	    ((x.longname == y.longname) &&
+	     ((x.multiplevalue < y.multiplevalue) ||
+	      ((x.multiplevalue == y.multiplevalue) &&
+	       ((x.multiplechar < y.multiplechar) ||
+		((x.multiplechar == y.multiplechar) &&
+		 ((x.defaultstatus < y.defaultstatus) ||
+		  ((x.defaultstatus == y.defaultstatus) &&
+		   ((x.argdefault < y.argdefault) ||
+		    ((x.argdefault == y.argdefault) &&
+		     ((x.savedarginfo < y.savedarginfo))))))))))))));
+}
+
+
+// constructor
+cgiargsinfoclass::cgiargsinfoclass () {
+}
+
+// addarginfo will combine the information with the present
+// information. If name clashes were detected then the information
+// will be written to logout and addarginfo will return false. No
+// processing with the arguments should be done if this happens
+// as the results will be meaningless.
+bool cgiargsinfoclass::addarginfo (ostream *logout, const cgiarginfo &info) {
+  outconvertclass text_t2ascii;
+
+  cgiarginfo *orginfo = getarginfo (info.shortname);
+  if (orginfo == NULL) {
+    argsinfo[info.shortname] = info;
+    return true; // no clashes
+  }
+
+  if (orginfo->longname != info.longname) {
+    if (logout != NULL) {
+      (*logout) << text_t2ascii << "Error: cgi argument name clash for argument \""
+		<< info.shortname << "\".\nOne long name was\n  \"" << orginfo->longname 
+		<< "\"\nand the other was\n  \"" << info.longname << "\".\n\n";
+    }
+    return false; // found a clash
+  }
+
+  if (orginfo->multiplevalue != info.multiplevalue) {
+    if (logout != NULL) {
+      (*logout) << text_t2ascii << "Error: cgi argument \"" << info.shortname 
+		<< "\" was given as being a single value option\n"
+		<< "and a multiple value option.\n\n";
+    }
+    return false; // found a clash
+  }
+
+  if (orginfo->multiplechar != info.multiplechar) {
+    if (logout != NULL) {
+      (*logout) << text_t2ascii << "Error: cgi argument \"" << info.shortname 
+		<< "\" was given as being a single character option\n"
+		<< "and a multiple character option.\n\n";
+    }
+    return false; // found a clash
+  }
+  
+  if (!info.multiplechar && info.argdefault.size() > 1) {
+    if (logout != NULL) {
+      (*logout) << text_t2ascii << "Error: cgi argument \"" << info.shortname
+		<< "\" was defined as being a single character option\n"
+		<< "but a multiple character default was given.\n\n";
+    }
+    return false;  // found a problem
+  }
+
+  // make sure there is no clashes in the savedarginfo
+  if ((orginfo->savedarginfo==cgiarginfo::mustnot && 
+       info.savedarginfo==cgiarginfo::must) ||
+      (orginfo->savedarginfo==cgiarginfo::must && 
+       info.savedarginfo==cgiarginfo::mustnot)) {
+    if (logout != NULL) {
+      (*logout) << text_t2ascii << "Error: it was specified that cgi argument \"" 
+		<< info.shortname << "\" should be saved in the state\n"
+		<< "information and that it should not be save in the state information.\n\n";
+    }
+    return false; // found a clash
+  }
+  // the only time orginfo->savedarginfo can change is when it is set
+  // to "can"
+  if (orginfo->savedarginfo == cgiarginfo::can) 
+    orginfo->savedarginfo = info.savedarginfo;
+
+
+  if (orginfo->defaultstatus > info.defaultstatus) {
+    return true;
+  }
+  orginfo->defaultstatus = info.defaultstatus;
+  orginfo->argdefault = info.argdefault;
+
+  return true;
+}
+
+bool cgiargsinfoclass::addarginfo (ostream *logout, const cgiargsinfoclass &info) {
+  const_iterator here = info.begin ();
+  const_iterator end = info.end ();
+
+  while (here != end) {
+    if (!addarginfo (logout, (*here).second)) return false;
+    here++;
+  }
+  
+  return true; // made it, no clashes
+}
+
+cgiarginfo *cgiargsinfoclass::getarginfo (const text_t &key) {
+  iterator here = argsinfo.find (key);
+  if (here == argsinfo.end()) return NULL;
+
+  return &((*here).second);
+}
+
+const cgiarginfo *cgiargsinfoclass::getarginfo (const text_t &key) const {
+  const_iterator here = argsinfo.find (key);
+  if (here == argsinfo.end()) return NULL;
+
+  return &((*here).second);
+}
Index: /main/tags/2.38/gsdl/src/recpt/cgiargs.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiargs.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiargs.h	(revision 21083)
@@ -0,0 +1,233 @@
+/**********************************************************************
+ *
+ * cgiargs.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CGIARGS_H
+#define CGIARGS_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+
+// response_t is used to define what type of cgi header 
+// should be produced
+enum response_t {location, content};
+
+
+struct cgiarg_t {
+  void clear ();
+  cgiarg_t () {clear();}
+  cgiarg_t &operator=(const cgiarg_t &x);
+  
+  enum source_t {default_arg, compressed_arg, cgi_arg, program_arg};
+  
+  text_t value;
+  source_t source;
+};
+
+bool operator==(const cgiarg_t &x, const cgiarg_t &y);
+bool operator<(const cgiarg_t &x, const cgiarg_t &y);
+
+typedef map<text_t, cgiarg_t, lttext_t> cgiarg_tmap;
+
+// cgiargsclass is used to store a particular set
+// of cgi arguments.
+class cgiargsclass {
+protected:
+  cgiarg_tmap args;
+
+public:
+  //type support for cgiarg_tmap
+  typedef cgiarg_tmap::iterator iterator;
+  typedef cgiarg_tmap::const_iterator const_iterator;
+  typedef cgiarg_tmap::reference reference;
+  typedef cgiarg_tmap::const_reference const_reference;
+  typedef cgiarg_tmap::size_type size_type;
+  typedef cgiarg_tmap::difference_type difference_type;
+  typedef cgiarg_tmap::const_reverse_iterator const_reverse_iterator;
+  typedef cgiarg_tmap::reverse_iterator reverse_iterator;
+  
+  // constructors
+  cgiargsclass ();
+
+  // basic container support
+  iterator begin () {return args.begin();}
+  const_iterator begin () const {return args.begin();}
+  iterator end () {return args.end();}
+  const_iterator end () const {return args.end();}
+
+  void erase(iterator pos) {args.erase(pos);}
+  void erase(iterator first, iterator last) {args.erase(first, last);}
+  cgiargsclass &operator=(const cgiargsclass &x) {args=x.args;return *this;}
+
+  bool empty () const {return args.empty();}
+  size_type size() const {return args.size();}
+
+
+  // added functionality
+  void clear () {args.erase(args.begin(),args.end());}
+
+  // setdefaultarg, setdefaultintarg, and setdefaultcarg will 
+  // only set the argument if it is not already set
+  // getargs returns NULL if there isn't an entry with
+  // 'key' already defined, getintarg returns 0 if there wasn't an
+  // entry with 'key' defined and operator[] returns "" if
+  // 'key' wasn't already defined (and sets 'key'="").
+  void setarg (const text_t &key, const text_t &value,
+	       cgiarg_t::source_t source=cgiarg_t::program_arg);
+  void setdefaultarg (const text_t &key, const text_t &value,
+		      cgiarg_t::source_t source=cgiarg_t::default_arg);
+  void setintarg (const text_t &key, int value,
+		  cgiarg_t::source_t source=cgiarg_t::program_arg);
+  void setdefaultintarg (const text_t &key, int value,
+			 cgiarg_t::source_t source=cgiarg_t::default_arg);
+  void setcarg (const text_t &key, unsigned short c,
+		cgiarg_t::source_t source=cgiarg_t::program_arg);
+  void setdefaultcarg (const text_t &key, unsigned short c,
+		       cgiarg_t::source_t source=cgiarg_t::default_arg);
+  text_t *getarg (const text_t &key);
+  int getintarg (const text_t &key);
+  text_t &operator[] (const text_t &key) {return args[key].value;}
+  cgiarg_t &lookupcgiarg (const text_t &key) {return args[key];}
+};
+
+// stream operators to print cgi arguments for debugging purposes
+ostream &operator<<(ostream &outs, const cgiargsclass &args);
+
+
+
+// cgiarginfo holds information relating to a cgi argument
+class cgiarginfo {
+public:
+  cgiarginfo ();
+
+  // shortname is the name used in cgi arguments
+  text_t shortname;
+
+  // longname is the name used when giving information 
+  // about the argument and to spot name duplication
+  text_t longname;
+
+  // multiplechar should be set to true if the value can be
+  // more than one character long
+  bool multiplechar;
+
+  // multiplevalue should be set to true the argument may have 
+  // multiple values (as is the case when multiple checkboxes
+  // use the same name)
+  bool multiplevalue;
+
+  // defaultstatus_t indicates how good the default is when different
+  // defaults are given for one argument. "none" means there is no default
+  // (a default might be given elsewhere). "weak" is a basic guess that
+  // doesn't hold much weight, "good" is a better guess, "config" was a default
+  // given in a configuration file, and "imperative" means it must not
+  // be overriden at any costs (unless there is another "imperative"...)
+  enum defaultstatus_t {none=0, weak=1, good=2, config=3, imperative=4};
+
+  defaultstatus_t defaultstatus;
+  text_t argdefault;   // a default value
+
+  // savedarginfo_t indicates whether the argument should be saved
+  // between pages (e.g. using the compressed argument) or not. The
+  // value of an argument can change from "can" to "mustnot" and 
+  // "can" to "must" but not "mustnot" to "must" or "must" to "mustnot".
+  enum savedarginfo_t {mustnot, can, must};
+
+  savedarginfo_t savedarginfo;
+};
+
+bool operator==(const cgiarginfo &x, const cgiarginfo &y);
+bool operator<(const cgiarginfo &x, const cgiarginfo &y);
+
+typedef map<text_t, cgiarginfo, lttext_t> argsinfomap;
+
+// contains a list of cgi argument information
+class cgiargsinfoclass {
+protected:
+  argsinfomap argsinfo;
+
+public:
+  // type support for arginfomap
+  typedef argsinfomap::iterator iterator;
+  typedef argsinfomap::const_iterator const_iterator;
+  typedef argsinfomap::reference reference;
+  typedef argsinfomap::const_reference const_reference;
+  typedef argsinfomap::size_type size_type;
+  typedef argsinfomap::difference_type difference_type;
+  typedef argsinfomap::const_reverse_iterator const_reverse_iterator;
+  typedef argsinfomap::reverse_iterator reverse_iterator;
+  
+  // constructors
+  cgiargsinfoclass ();
+
+  // basic container support
+  iterator begin () {return argsinfo.begin();}
+  const_iterator begin () const {return argsinfo.begin();}
+  iterator end () {return argsinfo.end();}
+  const_iterator end () const {return argsinfo.end();}
+
+  void erase(iterator pos) {argsinfo.erase(pos);}
+  void erase(iterator first, iterator last) {argsinfo.erase(first, last);}
+  cgiargsinfoclass &operator=(const cgiargsinfoclass &x) {argsinfo=x.argsinfo;return *this;}
+
+  bool empty () const {return argsinfo.empty();}
+  size_type size() const {return argsinfo.size();}
+
+
+  // added functionality
+  void clear () {argsinfo.erase(argsinfo.begin(),argsinfo.end());}
+
+  // addarginfo will combine the information with the present
+  // information. If name clashes were detected then the information
+  // will be written to logout and addarginfo will return false. No
+  // processing with the arguments should be done if this happens
+  // as the results will be meaningless.
+  bool addarginfo (ostream *logout, const cgiarginfo &info);
+  bool addarginfo (ostream *logout, const cgiargsinfoclass &info);
+
+  cgiarginfo *getarginfo (const text_t &key);
+  const cgiarginfo *getarginfo (const text_t &key) const;
+  cgiarginfo &operator[] (const text_t &key) {return argsinfo[key];}
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/cgiutils.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiutils.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiutils.cpp	(revision 21083)
@@ -0,0 +1,508 @@
+/**********************************************************************
+ *
+ * cgiutils.cpp -- general cgi utilities
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "cgiutils.h"
+
+
+static unsigned short hexdigit (unsigned short c) {
+  if (c >= '0' && c <= '9') return (c-'0');
+  if (c >= 'a' && c <= 'f') return (c-'a'+10);
+  if (c >= 'A' && c <= 'F') return (c-'A'+10);
+  return c;
+}
+
+
+static void c2hex (unsigned short c, text_t &t) {
+  t.clear();
+  
+  if (c >= 256) {
+    t = "20"; // ' '
+    return;
+  }
+  
+  unsigned short o1, o2;
+  
+  o1 = (c/16) % 16;
+  o2 = c % 16;
+  if (o1 >= 10) o1 += 'a' - 10;
+  else o1 += '0';
+  if (o2 >= 10) o2 += 'a' - 10;
+  else o2 += '0';
+  
+  t.push_back(o1);
+  t.push_back(o2);
+}
+
+// convert %xx and + to their appropriate equivalents
+void decode_cgi_arg (text_t &argstr) {
+  text_t::iterator in = argstr.begin();
+  text_t::iterator out = in;
+  text_t::iterator end = argstr.end();
+  
+  while (in != end) {
+    if (*in == '+') *out = ' ';
+    
+    else if (*in == '%') {
+      unsigned short c = '%';
+      in++;
+      if (in != end) {
+	c = hexdigit (*in);
+	in++;
+      }
+      if (in != end && c < 16) { // sanity check on the previous character
+	c = c*16 + hexdigit (*in);
+      }
+      
+      *out = c;
+    } else *out = *in;
+    
+    if (in != end) in++;
+    out++;
+  }
+  
+  // remove the excess characters
+  argstr.erase (out, end);
+}
+
+
+// split up the cgi arguments
+void split_cgi_args (const cgiargsinfoclass &argsinfo, text_t argstr, 
+		     cgiargsclass &args) {
+  args.clear();
+  
+  text_t::iterator here = argstr.begin();
+  text_t::iterator end = argstr.end();
+  text_t key, value;
+  
+  // extract out the key=value pairs
+  while (here != end) {
+    // get the next key and value pair
+    here = getdelimitstr (here, end, '=', key);
+    here = getdelimitstr (here, end, '&', value);
+    
+    // convert %xx and + to their appropriate equivalents
+    decode_cgi_arg (value);
+
+    value.setencoding(1); // other encoding
+    // store this key=value pair
+    if (!key.empty()) {
+
+      // if arg occurs multiple times (as is the case with multiple
+      // checkboxes using the same name) we'll create a comma separated
+      // list of all the values (this uses a hack that encodes naturally
+      // occurring commas as %2C - values will therefore need to be decoded
+      // again before use) - it should use an array instead
+      const cgiarginfo *info = argsinfo.getarginfo (key);
+      if (info != NULL && info->multiplevalue) {
+	text_t newvalue = args[key];
+	if (args.lookupcgiarg(key).source == cgiarg_t::cgi_arg) newvalue += ",";
+	newvalue += encode_commas(value);
+	args.setarg (key, newvalue, cgiarg_t::cgi_arg);
+
+      } else {
+	args.setarg (key, value, cgiarg_t::cgi_arg);
+      }
+    }
+  }
+}
+
+text_t encode_commas (const text_t &intext) {
+
+  text_t outtext;
+
+  text_t::const_iterator here = intext.begin ();
+  text_t::const_iterator end = intext.end ();
+
+  while (here != end) {
+    if (*here == ',') outtext += "%2C";
+    else outtext.push_back (*here);
+    here ++;
+  }
+  return outtext;
+}
+
+text_t decode_commas (const text_t &intext) {
+
+  text_t outtext;
+  
+  text_t::const_iterator here = intext.begin ();
+  text_t::const_iterator end = intext.end ();
+  
+  while (here != end) {
+    if ((here+2<end) && *here == '%' && *(here+1) == '2' &&
+	(*(here+2) == 'C' || *(here+2) == 'c')) {
+      here += 2;
+      outtext.push_back(',');
+      
+    }else outtext.push_back (*here);
+    here ++;
+  }
+  return outtext;
+}
+
+text_t minus_safe (const text_t &intext) {
+
+  text_t outtext;
+
+  text_t::const_iterator here = intext.begin ();
+  text_t::const_iterator end = intext.end ();
+
+  while (here != end) {
+    if (*here == '-') outtext += "Zz-";
+    else outtext.push_back (*here);
+    here ++;
+  }
+  outtext = cgi_safe (outtext);
+  return outtext;
+}
+
+text_t cgi_safe (const text_t &intext) {
+  text_t outtext;
+  
+  text_t::const_iterator here = intext.begin ();
+  text_t::const_iterator end = intext.end ();
+  unsigned short c;
+  text_t ttmp;
+  
+  while (here != end) {
+    c = *here;
+    if (((c >= 'a') && (c <= 'z')) ||
+	((c >= 'A') && (c <= 'Z')) ||
+	((c >= '0') && (c <= '9')) ||
+	(c == '+') || (c == '%') || (c == '-')) {
+      // alphanumeric character
+      outtext.push_back(c);
+    } else if (c == ' ') {
+      // space
+      outtext.push_back('+');
+    } else {
+      // everything else
+      outtext.push_back('%');
+      c2hex(c, ttmp);
+      outtext += ttmp;
+    }
+    
+    here++;
+  }
+  
+  return outtext;
+}
+
+
+
+
+static text_t::const_iterator get_next_save_arg (text_t::const_iterator first, 
+					   text_t::const_iterator last,
+					   text_t &argname) {
+  first = getdelimitstr (first, last, '-', argname);
+  return first;
+}
+
+
+// check_save_conf_str checks the configuration string for
+// the saved args and makes sure it does not conflict with
+// the information about the arguments. If an error is encountered
+// it will return false and the program should not produce any
+// output.
+bool check_save_conf_str (const text_t &saveconf, 
+			  const cgiargsinfoclass &argsinfo,
+			  ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  text_tset argsset;
+  text_t::const_iterator saveconfhere = saveconf.begin ();
+  text_t::const_iterator saveconfend = saveconf.end ();
+  text_t argname;
+  const cgiarginfo *info;
+
+  // first check to make sure all saved arguments can be saved
+  
+  while (saveconfhere != saveconfend) {
+    saveconfhere = get_next_save_arg (saveconfhere, saveconfend, argname);
+
+    if (!argname.empty()) {
+      // save the argument name for later
+      argsset.insert (argname);
+
+      // check the argument
+      info =  argsinfo.getarginfo (argname);
+      if (info == NULL) {
+	logout << text_t2ascii << "Error: the cgi argument \"" << argname 
+	       << "\" is used in the configuration string for the\n"
+	       << "saved arguments but does not exist as a valid argument.\n\n";
+	return false;
+      }
+      if (info->savedarginfo == cgiarginfo::mustnot) {
+	logout << text_t2ascii << "Error: the cgi argument \"" << argname
+	       << "\" is used in the configuration string for the\n"
+	       << "saved arguments but has been specified as an argument whose\n"
+	       << "state must not be saved.\n\n";
+	return false;
+      }
+    }
+  }
+
+
+  // next check that all saved arguments that should be saved
+  // are saved
+  cgiargsinfoclass::const_iterator argsinfohere = argsinfo.begin ();
+  cgiargsinfoclass::const_iterator argsinfoend = argsinfo.end ();
+
+  while (argsinfohere != argsinfoend) {
+    if (((*argsinfohere).second.savedarginfo == cgiarginfo::must) &&
+	(argsset.find((*argsinfohere).second.shortname) == argsset.end())) {
+      logout << text_t2ascii << "Error: the cgi argument \"" 
+	     << (*argsinfohere).second.shortname << "\" was specified as needing to\n"
+	     << "be save but was not listed in the saved arguments.\n\n";
+      return false;
+    }
+
+    argsinfohere++;
+  }
+  
+  return true; // made it, no clashes
+}
+
+
+// create_save_conf_str will create a configuration string
+// based on the information in argsinfo. This method of configuration
+// is not recomended as small changes can produce large changes in
+// the resulting configuration string (for instance a totally different
+// ordering). Only arguments which "must" be saved are included in
+// the resulting string.
+text_t create_save_conf_str (const cgiargsinfoclass &argsinfo,
+			     ostream &/*logout*/) {
+  cgiargsinfoclass::const_iterator argsinfohere = argsinfo.begin ();
+  cgiargsinfoclass::const_iterator argsinfoend = argsinfo.end ();
+  text_t saveconf;
+  bool first = true;
+
+  while (argsinfohere != argsinfoend) {
+    // save this argument if it must be saved
+    if ((*argsinfohere).second.savedarginfo == cgiarginfo::must) {
+      if (!first) saveconf.push_back ('-');
+      else first = false;
+      saveconf += (*argsinfohere).second.shortname;
+    }
+
+    argsinfohere++;
+  }
+  
+  return saveconf;
+}
+
+
+// expand_save_args will expand the saved arguments based
+// on saveconf placing the results in args if they are not
+// already defined. If it encounters an error it will return false
+// and output more information to logout.
+bool expand_save_args (const cgiargsinfoclass &argsinfo,
+		       const text_t &saveconf, 
+		       cgiargsclass &args,
+		       ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  text_t *arg_e = args.getarg("e");
+  if (arg_e == NULL) return true; // no compressed arguments
+  if (arg_e->empty()) return true; // no compressed arguments
+
+  text_t argname, argvalue;
+  const cgiarginfo *argnameinfo;
+  
+  text_t::const_iterator saveconfhere = saveconf.begin();
+  text_t::const_iterator saveconfend = saveconf.end();
+  
+  text_t::iterator arg_ehere = arg_e->begin();
+  text_t::iterator arg_eend = arg_e->end();
+  while (saveconfhere != saveconfend && arg_ehere != arg_eend) {
+    saveconfhere = get_next_save_arg (saveconfhere, saveconfend, argname);
+
+    if (!argname.empty()) {
+      // found another entry
+      argnameinfo = argsinfo.getarginfo (argname);
+
+      if (argnameinfo == NULL) {
+	// no information about the argument could be found
+	// we can't keep going because we don't know whether
+	// this argument is a single or multiple character value
+	logout << text_t2ascii << "Error: the cgi argument \"" << argname
+	       << "\" was specified as being a compressed argument\n"
+	       << "but no information about it could be found within the "
+	       << "cgiargsinfoclass.\n";
+	return false;
+
+      } else {
+
+	// found the argument information
+	if (argnameinfo->multiplechar) {
+	  text_t::const_iterator sav = arg_ehere;
+	  arg_ehere = getdelimitstr (arg_ehere, arg_eend, '-', argvalue);
+	  // replace any '-' chars escaped with 'Zz'
+	  bool first = true;
+	  while ((*(arg_ehere-3) == 'Z') && (*(arg_ehere-2) == 'z')) {
+	    if (first) argvalue.clear();
+	    arg_ehere = (findchar (arg_ehere, arg_eend, '-')) + 1;
+	    while (sav != (arg_ehere-1)) {
+	      if (!((*sav == 'Z') && (*(sav+1) == 'z') && (*(sav+2) == '-')) &&
+		  !((*(sav-1) == 'Z') && (*sav == 'z') && (*(sav+1) == '-'))) argvalue.push_back (*sav);
+	      sav ++;
+	    }
+	    first = false;
+	  }
+
+	  argvalue.setencoding(1); // other encoding
+	  if (!argvalue.empty()) args.setdefaultarg (argname, argvalue, cgiarg_t::compressed_arg);
+	} else {
+	  args.setdefaultcarg (argname,*arg_ehere, cgiarg_t::compressed_arg);
+	  arg_ehere++;
+	}
+      }
+    }
+  }
+
+  return true;
+}
+
+
+// adds the default values for those arguments which have not
+// been specified
+void add_default_args (const cgiargsinfoclass &argsinfo,
+		       cgiargsclass &args,
+		       ostream &/*logout*/) {
+  cgiargsinfoclass::const_iterator argsinfohere = argsinfo.begin ();
+  cgiargsinfoclass::const_iterator argsinfoend = argsinfo.end ();
+
+  while (argsinfohere != argsinfoend) {
+    if ((*argsinfohere).second.defaultstatus != cgiarginfo::none) {
+      args.setdefaultarg ((*argsinfohere).second.shortname,
+			  (*argsinfohere).second.argdefault, cgiarg_t::default_arg);
+    }
+    argsinfohere++;
+  }
+}
+
+
+// compress_save_args will compress the arguments and return
+// them in compressed_args. If an error was encountered
+// compressed_args will be set to to "", an error will be
+// written to logout, and the function will return false.
+bool compress_save_args (const cgiargsinfoclass &argsinfo,
+			 const text_t &saveconf,
+			 cgiargsclass &args,
+			 text_t &compressed_args,
+			 outconvertclass &outconvert,
+			 ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  compressed_args.clear();
+
+  text_t argname, argvalue;
+  const cgiarginfo *argnameinfo;
+  
+  text_t::const_iterator saveconfhere = saveconf.begin();
+  text_t::const_iterator saveconfend = saveconf.end();
+  
+  while (saveconfhere != saveconfend) {
+    saveconfhere = get_next_save_arg (saveconfhere, saveconfend, argname);
+
+    if (!argname.empty()) {
+      // found another entry
+      argnameinfo = argsinfo.getarginfo (argname);
+
+      if (argnameinfo == NULL) {
+	// no information about the argument could be found
+	// we can't keep going because we don't know whether
+	// this argument is a single or multiple character value
+	logout << text_t2ascii << "Error: the cgi argument \"" << argname
+	       << "\" was specified as being a compressed argument\n"
+	       << "but no information about it could be found within the "
+	       << "cgiargsinfoclass.\n";
+	compressed_args.clear();
+	return false;
+
+      } else {
+	// found the argument information
+	if (argnameinfo->multiplechar) {
+	  // multiple character argument -- sort out any '-' chars
+	  compressed_args += minus_safe (outconvert.convert(args[argname]));
+	  if (saveconfhere != saveconfend) compressed_args.push_back ('-');
+
+	} else {
+	  // single character argument
+	  if (args[argname].size() == 0) {
+	    logout << text_t2ascii << "Error: the cgi argument \"" << argname
+		   << "\" was specified as being a compressed argument which\n"
+		   << "should have a one character value but it was empty.\n\n";
+	    compressed_args.clear ();
+	    return false;
+
+	  } else if (args[argname].size() > 1) {
+	    logout << text_t2ascii << "Error: the cgi argument \"" << argname
+		   << "\" was specified as being a compressed argument which\n"
+		   << "should have a one character value but it had multiple characters.\n\n";
+	    compressed_args.clear ();
+	    return false;
+	  }
+
+	  // everything is ok
+	  compressed_args += args[argname];
+	}
+      }
+    }
+  }
+
+  return true;
+}
+
+
+// args_tounicode converts any arguments which are not in unicode
+// to unicode using inconvert
+void args_tounicode (cgiargsclass &args, inconvertclass &inconvert) {
+  cgiargsclass::iterator here = args.begin();
+  cgiargsclass::iterator end = args.end();
+
+  while (here != end) {
+    if ((*here).second.value.getencoding() > 0) {
+      (*here).second.value = inconvert.convert((*here).second.value);
+    }
+    
+    here++;
+  }
+}
+
+// fcgienv will be loaded with environment name-value pairs
+// if using fastcgi (had to do this as getenv doesn't work
+// with our implementation of fastcgi). if fcgienv is empty
+// we'll simply use getenv
+text_t gsdl_getenv (const text_t &name, text_tmap &fcgienv) {
+  if (fcgienv.empty()) {
+    char *n = name.getcstr();
+    char *v = getenv(n);
+    delete n;
+    if (v != NULL) return v;
+    return "";
+
+  } else return fcgienv[name];
+}
Index: /main/tags/2.38/gsdl/src/recpt/cgiutils.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiutils.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiutils.h	(revision 21083)
@@ -0,0 +1,101 @@
+/**********************************************************************
+ *
+ * cgiutils.h -- general cgi utilities
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CGIUTILS_H
+#define CGIUTILS_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "cgiargs.h"
+
+
+// convert %xx and + to their appropriate equivalents
+void decode_cgi_arg (text_t &argstr);
+
+// split up the cgi arguments
+void split_cgi_args (const cgiargsinfoclass &argsinfo, text_t argstr, 
+		     cgiargsclass &args);
+
+text_t encode_commas (const text_t &intext);
+text_t decode_commas (const text_t &intext);
+
+// turns any '-' in a cgi argument into "(-)"
+text_t minus_safe (const text_t &intext);
+
+// returns the encoded version of a cgi argument
+text_t cgi_safe (const text_t &intext);
+
+// check_save_conf_str checks the configuration string for
+// the saved args and makes sure it does not conflict with
+// the information about the arguments. If an error is encountered
+// it will return false and the program should not produce any
+// output.
+bool check_save_conf_str (const text_t &saveconf, 
+			  const cgiargsinfoclass &argsinfo,
+			  ostream &logout);
+
+// create_save_conf_str will create a configuration string
+// based on the information in argsinfo. This method of configuration
+// is not recomended as small changes can produce large changes in
+// the resulting configuration string (for instance a totally different
+// ordering). Only arguments which "must" be saved are included in
+// the resulting string.
+text_t create_save_conf_str (const cgiargsinfoclass &argsinfo,
+			     ostream &logout);
+
+// expand_compress_args will expand the compressed arguments based
+// on compressconf placing the results in args if they are not
+// already defined. If it encounters an error it will return false
+// and output more information to logout.
+bool expand_save_args (const cgiargsinfoclass &argsinfo,
+		       const text_t &saveconf, 
+		       cgiargsclass &args,
+		       ostream &logout);
+
+// adds the default values for those arguments which have not
+// been specified
+void add_default_args (const cgiargsinfoclass &argsinfo,
+		       cgiargsclass &args,
+		       ostream &logout);
+
+// compress_save_args will compress the arguments and return
+// them in compressed_args. If an error was encountered
+// compressed_args will be set to to "", an error will be
+// written to logout, and the function will return false.
+bool compress_save_args (const cgiargsinfoclass &argsinfo,
+			 const text_t &saveconf,
+			 cgiargsclass &args,
+			 text_t &compressed_args,
+			 outconvertclass &outconvert,
+			 ostream &logout);
+
+// args_tounicode converts any arguments which are not in unicode
+// to unicode using inconvert
+void args_tounicode (cgiargsclass &args, inconvertclass &inconvert);
+
+text_t gsdl_getenv (const text_t &name, text_tmap &fcgienv);
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/cgiwrapper.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiwrapper.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiwrapper.cpp	(revision 21083)
@@ -0,0 +1,697 @@
+/**********************************************************************
+ *
+ * cgiwrapper.cpp -- output pages using the cgi protocol
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdlconf.h"
+#include "cgiwrapper.h"
+#include "recptconfig.h"
+#include "fileutil.h"
+#include <stdlib.h>
+#include <assert.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/iostream>
+#  include <ospace/std/fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+#ifdef USE_FASTCGI
+#include "fcgiapp.h"
+#endif
+
+
+#ifdef USE_FASTCGI
+// used to output the text from receptionist
+class fcgistreambuf : public streambuf {
+public:
+  fcgistreambuf ();
+  int sync ();
+  int overflow (int ch);
+  int underflow () {return EOF;}
+  
+  void fcgisbreset() {fcgx_stream = NULL; other_ostream = NULL;};
+  void set_fcgx_stream(FCGX_Stream *newone) {fcgx_stream=newone;};
+  void set_other_ostream(ostream *newone) {other_ostream=newone;};
+  
+private:
+  FCGX_Stream *fcgx_stream;
+  ostream *other_ostream;
+};
+
+fcgistreambuf::fcgistreambuf() {
+  fcgisbreset();
+  if (base() == ebuf()) allocate();
+  setp (base(), ebuf());
+};
+
+int fcgistreambuf::sync () {
+  if ((fcgx_stream != NULL) &&
+      (FCGX_PutStr (pbase(), out_waiting(), fcgx_stream) < 0)) {
+    fcgx_stream = NULL;
+  }
+
+  if (other_ostream != NULL) {
+    char *thepbase=pbase();
+    for (int i=0;i<out_waiting();i++) (*other_ostream).put(thepbase[i]);
+  }
+  
+  setp (pbase(), epptr());
+  
+  return 0;
+}
+
+int fcgistreambuf::overflow (int ch) {
+  if (sync () == EOF) return EOF;
+  if (ch != EOF) sputc (ch);
+  return 0;
+}
+
+#endif
+
+static void format_error_string (text_t &errorpage, const text_t &errortext, bool debug) {
+
+  errorpage.clear();
+
+  if (debug) {
+    errorpage += "\n";
+    errorpage += "ERROR: " + errortext;
+    errorpage += "\n";
+    
+  } else {
+
+    errorpage += "Content-type: text/html\n\n";
+    
+    errorpage += "<html>\n";
+    errorpage += "<head>\n";
+    errorpage += "<title>Error</title>\n";
+    errorpage += "</head>\n";
+    errorpage += "<body>\n";
+    errorpage += "<h2>Oops!</h2>\n";
+    errorpage += errortext;
+    errorpage += "</body>\n";
+    errorpage += "</html>\n";
+  }
+}
+
+static void page_errorcollect (const text_t &gsdlhome, text_t &errorpage, bool debug) {
+
+  text_t collectdir = filename_cat (gsdlhome, "collect");
+
+  text_t errortext = "No valid collections were found: Check that your collect directory\n";
+  errortext += "(" + collectdir + ") is readable and contains at least one valid collection.\n";
+  errortext += "Note that modelcol is NOT a valid collection.\n";
+  errortext += "If the path to your collect directory is wrong edit the 'gsdlhome' field\n";
+  errortext += "in your gsdlsite.cfg configuration file.\n";
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+static void page_errorsitecfg (text_t &errorpage, bool debug, int mode) {
+
+  text_t errortext;
+
+  if (mode == 0) {
+    errortext += "The gsdlsite.cfg configuration file could not be found. This\n";
+    errortext += "file should contain configuration information relating to this\n";
+    errortext += "site's setup.\n";
+
+  } else if (mode == 1) {
+    errortext += "The gsdlsite.cfg configuration file does not contain a valid\n";
+    errortext += "gsdlhome entry.\n";
+  }
+
+  if (debug) {
+    errortext += "gsdlsite.cfg should reside in the directory from which the\n";
+    errortext += "library executable was run.\n";
+  } else {
+    errortext += "gsdlsite.cfg should reside in the same directory as the library\n";
+    errortext += "executable file.\n";
+  }
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+
+static void page_errormaincfg (const text_t &gsdlhome, const text_t &collection,
+			       bool debug, text_t &errorpage) {
+
+  text_t errortext;
+
+  if (collection.empty()) {
+    text_t main_cfg_file = filename_cat (gsdlhome, "etc", "main.cfg");
+    errortext += "The main.cfg configuration file could not be found. This file\n";
+    errortext += "should contain configuration information relating to the\n";
+    errortext += "setup of the interface. As this receptionist is not being run\n";
+    errortext += "in collection specific mode the file should reside at\n";
+    errortext += main_cfg_file + ".\n";
+  } else {
+    text_t collect_cfg_file = filename_cat (gsdlhome, "collect", collection, "etc", "collect.cfg");
+    text_t main_collect_cfg_file = filename_cat (gsdlhome, "etc", "collect.cfg");
+    text_t main_cfg_file = filename_cat (gsdlhome, "etc", "main.cfg");
+    errortext += "Either the collect.cfg or main.cfg configuration file could\n";
+    errortext += "not be found. This file should contain configuration information\n";
+    errortext += "relating to the setup of the interface. As this receptionist is\n";
+    errortext += "being run in collection specific mode the file should reside\n";
+    errortext += "at either " + collect_cfg_file + ",\n";
+    errortext += main_collect_cfg_file + " or " + main_cfg_file + ".\n";
+  }
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+
+static void page_errorinit (const text_t &gsdlhome, bool debug, text_t &errorpage) {
+
+  text_t errortext = "An error occurred during the initialisation of the Greenstone Digital\n";
+  errortext += "Library software. It is likely that the software has not been setup\n";
+  errortext += "correctly.\n";
+
+  text_t error_file = filename_cat (gsdlhome, "etc", "error.txt");
+  char *efile = error_file.getcstr();
+  ifstream errin (efile);
+  delete efile;
+  if (errin) {
+    errortext += "The error log, " + error_file + ", contains the\n";
+    errortext += "following information:\n\n";
+    if (!debug) errortext += "<pre>\n";
+
+    char c;
+    errin.get(c);
+    while (!errin.eof ()) {
+      errortext.push_back(c);
+      errin.get(c);
+    }
+    
+    if (!debug) errortext += "</pre>\n";
+
+    errin.close();
+
+  } else {
+    errortext += "Please consult " + error_file + " for more information.\n";
+  }
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+static void page_errorparseargs (const text_t &gsdlhome, bool debug, text_t &errorpage) {
+
+  text_t errortext = "An error occurred during the parsing of the cgi arguments.\n";
+
+  text_t error_file = filename_cat (gsdlhome, "etc", "error.txt");
+  char *efile = error_file.getcstr();
+  ifstream errin (efile);
+  delete efile;
+  if (errin) {
+    errortext += "The error log, " + error_file + ", contains the\n";
+    errortext += "following information:\n\n";
+    if (!debug) errortext += "<pre>\n";
+
+    char c;
+    errin.get(c);
+    while (!errin.eof ()) {
+      errortext.push_back(c);
+      errin.get(c);
+    }
+    if (!debug) errortext += "</pre>\n";
+    errin.close();
+
+  } else {
+    errortext += "Please consult " + error_file + " for more information.\n";
+  }
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+static void page_errorcgipage (const text_t &gsdlhome, bool debug, text_t &errorpage) {
+
+  text_t errortext = "An error occurred during the construction of the cgi page.\n";
+
+  text_t error_file = filename_cat (gsdlhome, "etc", "error.txt");
+  char *efile = error_file.getcstr();
+  ifstream errin (efile);
+  delete efile;
+  if (errin) {
+    errortext += "The error log, " + error_file + ", contains the\n";
+    errortext += "following information:\n\n";
+    if (!debug) errortext += "<pre>\n";
+
+    char c;
+    errin.get(c);
+    while (!errin.eof ()) {
+      errortext.push_back(c);
+      errin.get(c);
+    }
+    if (!debug) errortext += "</pre>\n";
+    errin.close();
+
+  } else {
+    errortext += "Please consult " + error_file + " for more information.\n";
+  }
+
+  format_error_string (errorpage, errortext, debug);
+}
+
+static void print_debug_info (receptionist &recpt) {
+
+  outconvertclass text_t2ascii;
+  const recptconf &configinfo = recpt.get_configinfo ();
+  text_t etc_dir = filename_cat (configinfo.gsdlhome, "etc");
+
+  cout << "\n";
+  cout << text_t2ascii
+       << "------------------------------------------------------------\n"
+       << "Configuration and initialization completed successfully.\n"
+       << "  Note that more debug information may be available in the\n"
+       << "  initialization and error log error.txt in " << etc_dir << ".\n"
+       << "------------------------------------------------------------\n\n";
+
+  bool colspec = false;
+  if (configinfo.collection.empty()) {
+    cout << "Receptionist is running in \"general\" (i.e. not \"collection\n"
+	 << "specific\") mode.\n";
+  } else {
+    cout << text_t2ascii 
+	 << "Receptionist is running in \"collection specific\" mode.\n"
+	 << "  collection=" << configinfo.collection << "\n"
+	 << "  collection directory=" << configinfo.collectdir << "\n";
+    colspec = true;
+  }
+  
+  cout << text_t2ascii << "gsdlhome=" << configinfo.gsdlhome << "\n";
+  if (!configinfo.gdbmhome.empty())
+    cout << text_t2ascii << "gdbmhome=" << configinfo.gdbmhome << "\n";
+  cout << text_t2ascii << "httpprefix=" << configinfo.httpprefix << "\n";
+  cout << text_t2ascii << "httpimg=" << configinfo.httpimg << "\n";
+  cout << text_t2ascii << "gwcgi=" << configinfo.gwcgi << "\n"
+       << "  Note that unless gwcgi has been set from a configuration\n"
+       << "  file it is dependent on environment variables set by your\n"
+       << "  webserver. Therefore it may not have the same value when run\n"
+       << "  from the command line as it would be when run from your\n"
+       << "  web server.\n";
+  if (configinfo.usecookies) 
+    cout << "cookies are enabled\n";
+  else 
+    cout << "cookies are disabled\n";
+  if (configinfo.logcgiargs) 
+    cout << "logging is enabled\n";
+  else 
+    cout << "logging is disabled\n";
+  cout << "------------------------------------------------------------\n\n";
+
+  text_tset::const_iterator this_mfile = configinfo.macrofiles.begin();
+  text_tset::const_iterator end_mfile = configinfo.macrofiles.end();
+  cout << "Macro Files:\n"
+       << "------------\n";
+  text_t mfile;
+  bool found;
+  while (this_mfile != end_mfile) {
+    cout << text_t2ascii << *this_mfile;
+    int spaces = (22 - (*this_mfile).size());
+    if (spaces < 2) spaces = 2;
+    text_t outspaces;
+    for (int i = 0; i < spaces; i++) outspaces.push_back (' ');
+    cout << text_t2ascii << outspaces;
+
+    found = false;
+    if (colspec) {
+      // collection specific - try collectdir/macros first
+      mfile = filename_cat (configinfo.collectdir, "macros", *this_mfile);
+      if (file_exists (mfile)) {
+	cout << text_t2ascii << "found (" << mfile << ")\n";
+	found = true;
+      }
+    }
+ 
+    if (!found) {
+      // try main macro directory
+      mfile = filename_cat (configinfo.gsdlhome, "macros", *this_mfile);
+      if (file_exists (mfile)) {
+	cout << text_t2ascii << "found (" << mfile << ")\n";
+	found = true;
+      }
+    }
+
+    if (!found)
+      cout << text_t2ascii << "NOT FOUND\n";
+
+    this_mfile ++;
+  }
+
+  cout << "------------------------------------------------------------\n\n"
+       << "Collections:\n"
+       << "------------\n"
+       << "  Note that collections will only appear as \"running\" if\n"
+       << "  their build.cfg files exist, are readable, contain a valid\n"
+       << "  builddate field (i.e. > 0), and are in the collection's\n"
+       << "  index directory (i.e. NOT the building directory)\n\n";
+
+  recptprotolistclass *protos = recpt.get_recptprotolist_ptr();
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+
+  bool is_z3950 = false;
+  bool found_valid_col = false;
+
+
+  while (rprotolist_here != rprotolist_end) {
+    comerror_t err;    
+    if ((*rprotolist_here).p == NULL) continue;
+    else if (is_z3950==false &&
+	     (*rprotolist_here).p->get_protocol_name(err) == "z3950proto") {
+      cout << "\nZ39.50 Servers:   (always public)\n"
+	   << "---------------\n";
+      is_z3950=true;
+    }
+
+    text_tarray collist;
+    (*rprotolist_here).p->get_collection_list (collist, err, cerr);
+    if (err == noError) {
+      text_tarray::iterator collist_here = collist.begin();
+      text_tarray::iterator collist_end = collist.end();
+      
+      while (collist_here != collist_end) {
+	
+	cout << text_t2ascii << *collist_here;
+	
+	int spaces = (22 - (*collist_here).size());
+	if (spaces < 2) spaces = 2;
+	text_t outspaces;
+	for (int i = 0; i < spaces; i++) outspaces.push_back (' ');
+	cout << text_t2ascii << outspaces;
+	
+	  ColInfoResponse_t *cinfo = recpt.get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, cerr);
+	  if (cinfo != NULL) {
+	    if (cinfo->isPublic) cout << "public ";
+	    else cout << "private";
+
+	    if (cinfo->buildDate > 0) {
+	      cout << "   running    ";
+	      found_valid_col = true;
+	    } else {
+	      cout << "   not running";
+	    }
+	  }
+
+	  cout << "\n";
+
+	  collist_here ++;
+      }
+    }
+    is_z3950=false;
+    rprotolist_here ++;
+  } // end of while loop
+
+  if (!found_valid_col) {
+    cout << "WARNING: No \"running\" collections were found. You need to\n";
+    cout << "         build one of the above collections\n";
+  }
+
+  cout << "\n------------------------------------------------------------\n";
+  cout << "------------------------------------------------------------\n\n";
+  cout << "receptionist running in command line debug mode\n";
+  cout << "enter cgi arguments as name=value pairs (e.g. 'a=p&p=home'):\n";
+
+}
+
+// cgiwrapper does everything necessary to output a page
+// using the cgi protocol. If this is being run for a particular
+// collection then "collection" should be set, otherwise it
+// should equal "".
+void cgiwrapper (receptionist &recpt, text_t collection) {
+  
+  int numrequests = 0;
+  bool debug = false;
+  const recptconf &configinfo = recpt.get_configinfo ();
+
+  // find out whether this is being run as a cgi-script
+  // or a fastcgi script
+#ifdef USE_FASTCGI
+  fcgistreambuf outbuf;
+  int isfastcgi = !FCGX_IsCGI();
+  FCGX_Stream *fcgiin, *fcgiout, *fcgierr;
+  FCGX_ParamArray fcgienvp;
+#else
+  int isfastcgi = 0;
+#endif
+
+  // get the query string if it is not being run as a fastcgi
+  // script
+  text_t argstr = "";
+  cgiargsclass args;
+  char *aURIStr;
+  if (!isfastcgi) {
+    char *request_method_str = getenv("REQUEST_METHOD");
+    char *content_length_str = getenv("CONTENT_LENGTH");
+    if (request_method_str != NULL && strcmp(request_method_str, "POST") == 0 &&
+	content_length_str != NULL)  {
+      // POST form data
+      int content_length = text_t(content_length_str).getint();
+      if (content_length > 0) {
+	char c;
+	do {
+	  cin.get(c);
+	  if (cin.eof()) break;
+	  argstr.push_back (c);
+	  content_length--;
+	} while (content_length > 0);
+      }
+      
+    } else {
+      aURIStr = getenv("QUERY_STRING");
+      if ((request_method_str != NULL && strcmp(request_method_str, "GET") == 0)
+	  || aURIStr != NULL) {
+	// GET form data
+	if (aURIStr != NULL) argstr = aURIStr;
+      } else {
+	// debugging from command line
+	debug = true;
+      }
+    }
+  }
+
+  if (debug) {
+    cout << "Configuring Greenstone...\n";
+    cout << flush;
+  }
+
+  // init stuff - we can't output error pages directly with
+  // fastcgi so the pages are stored until we can output them
+  text_t errorpage;
+  outconvertclass text_t2ascii;
+
+  // set defaults
+  int maxrequests = 10000;
+  recpt.configure ("collection", collection);
+  recpt.configure ("httpimg", "/gsdl/images");
+  char *script_name = getenv("SCRIPT_NAME");
+  if (script_name != NULL) recpt.configure("gwcgi", script_name);
+  else recpt.configure("gwcgi", "/gsdl");
+
+  // read in the configuration files.
+  text_t gsdlhome;
+  if (!site_cfg_read (recpt, gsdlhome, maxrequests)) {
+    // couldn't find the site configuration file
+    page_errorsitecfg (errorpage, debug, 0);
+  } else if (gsdlhome.empty()) {
+    // no gsdlhome in gsdlsite.cfg
+    page_errorsitecfg (errorpage, debug, 1);
+  } else if (!directory_exists(gsdlhome)) {
+    // gsdlhome not a valid directory
+    page_errorsitecfg (errorpage, debug, 1);
+  } else if (!main_cfg_read (recpt, gsdlhome, collection)) {
+    // couldn't find the main configuration file
+    page_errormaincfg (gsdlhome, collection, debug, errorpage);
+  } else  if (configinfo.collectinfo.empty() && false) { // commented out for corba
+    // don't have any collections
+    page_errorcollect (gsdlhome, errorpage, debug);
+  }
+
+  if (errorpage.empty()) {
+
+    // initialise the library software
+    if (debug) {
+      cout << "Initializing...\n";
+      cout << flush;
+    }
+
+    text_t error_file = filename_cat (gsdlhome, "etc", "error.txt");
+    char *eout = error_file.getcstr();
+    ofstream errout (eout, ios::app);
+    delete eout;
+    if (!recpt.init(errout)) {
+      // an error occurred during the initialisation
+      errout.close();
+      page_errorinit(gsdlhome, debug, errorpage);
+    }
+    errout.close();
+  }
+
+  if (debug && errorpage.empty()) {
+    // get query string from command line
+    print_debug_info (recpt);
+    char cinURIStr[1024];
+    cin.get(cinURIStr, 1024);
+    argstr = cinURIStr;
+  }
+
+  // cgi scripts only deal with one request
+  if (!isfastcgi) maxrequests = 1;
+
+  // Page-request loop. If this is not being run as a fastcgi
+  // process then only one request will be processed and then
+  // the process will exit.
+  while (numrequests < maxrequests) {
+#ifdef USE_FASTCGI
+    if (isfastcgi) {
+      if (FCGX_Accept(&fcgiin, &fcgiout, &fcgierr, &fcgienvp) < 0) break;
+
+      char *request_method_str = FCGX_GetParam ("REQUEST_METHOD", fcgienvp);
+      char *content_length_str = FCGX_GetParam ("CONTENT_LENGTH", fcgienvp);
+
+      if (request_method_str != NULL && strcmp(request_method_str, "POST") == 0 &&
+	  content_length_str != NULL)  {
+	// POST form data
+	int content_length = text_t(content_length_str).getint();
+	if (content_length > 0) {
+	  argstr.clear();
+	  int c;
+	  do {
+	    c = FCGX_GetChar (fcgiin);
+	    if (c < 0) break;
+	    argstr.push_back (c);
+	    content_length--;
+	  } while (content_length > 0);
+	}
+
+      } else {
+	// GET form data
+	aURIStr = FCGX_GetParam("QUERY_STRING", fcgienvp);
+	if (aURIStr != NULL) argstr = aURIStr;
+	else argstr = "";
+      }
+    }
+#endif
+
+    // get output streams ready
+#ifdef USE_FASTCGI
+    outbuf.fcgisbreset ();
+    if (isfastcgi) outbuf.set_fcgx_stream (fcgiout);
+    else outbuf.set_other_ostream (&cout);
+    ostream pageout (&outbuf);
+#else
+#define pageout cout
+#endif
+
+    // if using fastcgi we'll load environment into a map,
+    // otherwise simply pass empty map (can't get environment
+    // variables using getenv() while using FCGX versions
+    // of fastcgi - at least I can't ;-) - Stefan)
+    text_tmap fastcgienv;
+#ifdef USE_FASTCGI
+    if (isfastcgi) {
+      for(; *fcgienvp != NULL; fcgienvp++) {
+	text_t fvalue = *fcgienvp;
+	text_t::const_iterator begin = fvalue.begin();
+	text_t::const_iterator end = fvalue.end();
+	text_t::const_iterator equals_sign = findchar (begin, end, '=');
+	if (equals_sign != end)
+	  fastcgienv[substr(begin, equals_sign)] = substr(equals_sign+1, end);
+      }
+    }
+#endif
+
+    // temporarily need to configure gwcgi here when using fastcgi as I can't
+    // get it to pass the SCRIPT_NAME environment variable to the initial 
+    // environment (if anyone can work out how to do this using the apache 
+    // server, let me know). Note that this overrides the gwcgi field in 
+    // site.cfg (which it shouldn't do) but I can't at present set gwcgi 
+    // from site.cfg as I have old receptionists laying around that wouldn't
+    // appreciate it. The following 5 lines of code should be deleted once
+    // I either a: get the server to pass SCRIPT_NAME at initialization
+    // time or b: convert all the collections using old receptionists over
+    // to this version and uncomment gwcgi in the site.cfg file -- Stefan.
+#ifdef USE_FASTCGI
+    if (isfastcgi) {
+      recpt.configure("gwcgi", fastcgienv["SCRIPT_NAME"]);
+    }
+#endif
+
+
+    // if there has been no error so far, perform the production of the
+    // output page
+    if (errorpage.empty()) {
+      text_t error_file = filename_cat (gsdlhome, "etc", "error.txt");
+      char *eout = error_file.getcstr();
+      ofstream errout (eout, ios::app);
+      delete eout;
+
+#if defined(__WIN32__) && defined(GSDL_USE_IOS_H)
+      // old Windows compilers (VC++4.2)
+      cerr = errout;
+#else
+      // can't do this anymore according to c++ standard...
+      //cerr = errout;
+      // ... but can do this instead
+      cerr.rdbuf(errout.rdbuf());
+#endif
+
+      // parse the cgi arguments and produce the resulting page if there
+      // has been no errors so far
+      if (!recpt.parse_cgi_args (argstr, args, errout, fastcgienv)) {
+	errout.close ();
+	page_errorparseargs(gsdlhome, debug, errorpage);
+      } else {
+	// produce the output page
+
+	if (!recpt.produce_cgi_page (args, pageout, errout, fastcgienv)) {
+	  errout.close ();
+	  page_errorcgipage(gsdlhome, debug, errorpage);
+	}
+	recpt.log_cgi_args (args, errout, fastcgienv);
+	errout.close ();
+      }
+    }
+    // there was an error, output the error page
+    if (!errorpage.empty()) {
+      pageout << text_t2ascii << errorpage;
+      errorpage.clear();
+      numrequests = maxrequests; // make this the last page
+    }
+    pageout << flush;
+    
+    // finish with the output streams
+#ifdef USE_FASTCGI
+    if (isfastcgi) FCGX_Finish();
+#endif
+
+    numrequests++;
+  }
+
+  return;
+}
Index: /main/tags/2.38/gsdl/src/recpt/cgiwrapper.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/cgiwrapper.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/cgiwrapper.h	(revision 21083)
@@ -0,0 +1,45 @@
+/**********************************************************************
+ *
+ * cgiwrapper.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CGIWRAPPER_H
+#define CGIWRAPPER_H
+
+
+#include "receptionist.h"
+#include "collectset.h"
+
+// cgiwrapper does everything necessary to output a page
+// using the cgi protocol. If this is being run for a particular
+// collection then "collection" should be set, otherwise it
+// should equal "".
+//
+// NB: the collectset MAY NOT exist for remote protocols (e.g.
+//     the corba protocol; as references must point to a non-
+//     null instance, we must therefore use a pointer - sorry!
+void cgiwrapper (receptionist &recpt, text_t collection);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/collectoraction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/collectoraction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/collectoraction.cpp	(revision 21083)
@@ -0,0 +1,1970 @@
+/**********************************************************************
+ *
+ * collectoraction.cpp -- 
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// note that the collectoraction relies on having direct access to a
+// collections configuration file. this breaks the separation between
+// receptionist and collection server and so is not suitable (at least
+// in its current form) for use when collection servers are separate 
+// from the receptionist (e.g. when using the CORBA protocol).
+
+// following line required to get fstream.filedesc() on darwin (Mac OS X)
+#define _STREAM_COMPAT  1
+// required for utsname on solaris???
+#define _XOPEN_SOURCE 1
+#define _XOPEN_SOURCE_EXTENDED 1
+
+#include "collectoraction.h"
+#include "OIDtools.h"
+#include "fileutil.h"
+#include "cfgread.h"
+#include "gsdltools.h"
+#include "gsdltimes.h"
+#include "nullproto.h"
+#include "argdb.h"
+#include "cgiutils.h"
+#include <stdio.h>
+#include <fcntl.h>
+
+#if !defined (__WIN32__)
+#include <sys/utsname.h>
+#include <unistd.h>
+#endif
+
+collectoraction::collectoraction () {
+
+  recpt = NULL;
+  disabled = true;
+  do_mkcol = false;
+  badsources = false;
+  failedsources.erase(failedsources.begin(), failedsources.end());
+  gsdlosc = NULL;
+  gsdlhomec = NULL;
+  pathc = NULL;
+
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "collector";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "p";
+  arg_ainfo.longname = "page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "intro";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // temporary directory name for this collector
+  // session
+  arg_ainfo.shortname = "bc1tmp";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1fullname";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1dirname";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1contactemail";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1aboutdesc";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1clone";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1clonecol";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // set when cloning option has changed
+  arg_ainfo.shortname = "bc1clonechanged";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; 
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // only set when one of the fields was changed in
+  // the "collection info" page
+  arg_ainfo.shortname = "bc1infochanged";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // only set when cfg file is altered from within
+  // "configure collection" page
+  arg_ainfo.shortname = "bc1cfgchanged";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "cfgfile";
+  arg_ainfo.longname = "configuration file contents";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1dodelete";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // will be set if we arrived at the "configure collection" page
+  // via the "changing an existing collection" page
+  arg_ainfo.shortname = "bc1econf";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // will be set if we arrived at the "source data" page
+  // via the "changing an existing collection" page
+  arg_ainfo.shortname = "bc1esrce";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1inputnum";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "3";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1input";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bc1inputtype";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot; // saved on disk
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // will be set when we've just come from the "source data" page
+  arg_ainfo.shortname = "bc1fromsrce";
+  arg_ainfo.longname = "collector specific";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.multiplevalue = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+collectoraction::~collectoraction () {
+  if (gsdlosc != NULL) delete gsdlosc;
+  if (gsdlhomec != NULL) delete gsdlhomec;
+  if (pathc != NULL) delete pathc;
+}
+
+
+void collectoraction::configure (const text_t &key, const text_tarray &cfgline) {
+  if ((key == "collector") && (cfgline.size() == 1) && 
+      (cfgline[0] == "true" || cfgline[0] == "on" || cfgline[0] == "enabled")) {
+    disabled = false;
+  } else {
+    // call the parent class to deal with the things which
+    // are not dealt with here
+    action::configure (key, cfgline);
+  }
+}
+
+
+bool collectoraction::init (ostream & /*logout*/) {
+
+  // set up GSDLOS, GSDLHOME and PATH environment variables
+  text_t gsdlos, path;
+  unsigned int path_separator = ':';
+#if defined (__WIN32__)
+  gsdlos = "windows";
+  path_separator = ';';
+
+  path = filename_cat (gsdlhome, "bin", "windows", "perl", "bin;");
+
+#else
+  struct utsname *buf = new struct utsname();
+  int i = uname (buf);
+  if (i == -1) gsdlos = "linux"; // uname failed
+  else gsdlos.setcstr (buf->sysname);
+  delete buf;
+  lc (gsdlos);
+#endif
+
+  pathc = getenv ("PATH");
+  path += filename_cat (gsdlhome, "bin", gsdlos);
+  path.push_back (path_separator);
+  path += filename_cat (gsdlhome, "bin", "script");
+  if (pathc != NULL) {
+    path.push_back (path_separator);
+    path += pathc;
+  }
+  path = "PATH=" + path;
+
+  gsdlos = "GSDLOS=" + gsdlos;
+  text_t setgsdlhome = "GSDLHOME=" + gsdlhome;
+
+  // these will be cleaned up in the destructor
+  gsdlosc = gsdlos.getcstr();
+  gsdlhomec = setgsdlhome.getcstr();
+  pathc = path.getcstr();
+  
+  putenv (gsdlosc);
+  putenv (gsdlhomec);
+  putenv (pathc);
+
+  return true;
+}
+
+bool collectoraction::check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+				     ostream &logout) {
+
+  text_t &current_page = args["p"];
+
+  // note that the "bildstatus" and "bildframe1" pages don't actually do anything
+  // functional so we don't need to worry about authenticating them (it's the 
+  // underlying "bild" page that does the building (and creates the frameset))
+  // This helps us overcome a bit of a problem we have with multiple pages trying
+  // to read from the key.db database at the same time.
+  if (current_page != "intro" && current_page != "bildstatus" && current_page != "bildframe1") {
+    // authenticate the user if authentication is available
+    args["uan"] = 1;
+    args["ug"] = "colbuilder";
+  }
+  
+  if (current_page == "new" || current_page == "existing") {
+
+    // assign (and create) a temporary directory 
+    assign_tmpname (args, logout);
+
+    // clean up any old builds left laying about in the tmp directory
+    // (note that it's possible this could take some time if there's a huge
+    // partially built collection laying about so we'll make it an asynchronous
+    // system call)
+    gsdl_system ("perl -S cleantmp.pl", false, logout);
+  }
+
+  if (current_page != "intro" && current_page != "bildstatus" && 
+      current_page != "bildframe1" && current_page != "new") {
+    // update arguments that were saved to the harddrive
+    text_tmap saved_args;
+    saved_args["bc1fullname"] = "";
+    saved_args["bc1contactemail"] = "";
+    saved_args["bc1aboutdesc"] = "";
+    saved_args["bc1clone"] = "";
+    saved_args["bc1clonecol"] = "";
+    saved_args["bc1inputnum"] = "";
+    saved_args["bc1input"] = "";
+    saved_args["bc1inputtype"] = "";
+
+    // update the argdb database with any arguments that were set
+    // by previous page
+    text_tmap::iterator here = saved_args.begin();
+    text_tmap::iterator end = saved_args.end();
+    while (here != end) {
+      if (args.lookupcgiarg((*here).first).source != cgiarg_t::default_arg) {
+	(*here).second = args[(*here).first];
+      }
+      here++;
+    }
+
+    argdb *args_on_disk = new argdb(filename_cat(gsdlhome, "tmp", args["bc1tmp"], "argdb.db"));
+    if (!args_on_disk->update_args(saved_args)) {
+      // error
+
+    }
+
+    // update args from argdb
+    saved_args.erase(saved_args.begin(), saved_args.end());
+    if (!args_on_disk->get_args(saved_args)) {
+      // error
+
+    }
+    delete args_on_disk;
+    here = saved_args.begin();
+    end = saved_args.end();
+    while (here != end) {
+      if (!(*here).second.empty()) {
+	args[(*here).first] = (*here).second;
+      }
+      here ++;
+    }
+  }
+
+  if (args["bc1infochanged"] == "1") {
+    
+    if (args["bc1dirname"].empty()) {
+      // we've just come from the "collection information" page for the 
+      // first time so we'll need to create the collection with mkcol.pl
+      // and set up bc1dirname - we do this part here instead of in do_action
+      // because the bc1dirname argument must be set to its new value before
+      // the compressedoptions macros are set.
+      args["bc1dirname"] = get_directory_name (args["bc1fullname"]);
+
+      text_t createfile = filename_cat (gsdlhome, "tmp", args["bc1tmp"], ".create");
+      if (!file_exists (createfile)) {
+	// we could do the mkcol.pl here but I guess it's nicer to do it in do_action()
+	do_mkcol = true; 
+      } else {
+	// .create file already exists but bc1dirname wasn't set ... this should only be
+	// able to occur when the "reload" (and possibly the "back" and "forward" buttons)
+	// have been used to get us here.
+	// we'll check that the bc1dirname directory exists (in case of the unlikely 
+	// possibility that get_directory_name returned a different value this time
+	// than it did originally).
+	text_t coldir = filename_cat (get_collectdir(args), args["bc1dirname"]);
+	if (!directory_exists (coldir)) {
+	  message = "reloaderror";
+	  return true;
+	}
+      }
+    } else {
+      // "collection information" has been changed after collection already exists
+      // so we'll need to update the cfg file.
+      update_cfgfile_partial (args, false, logout);
+    }
+  }
+
+  if (args["bc1cfgchanged"] == "1") {
+    // configuration file has been changed from the "configure collection"
+    // page. we need to update the file on disk and catch bc1 arguments up
+    // with changes.
+    update_cfgfile_complete (args, logout);
+  }
+  
+  if (args["bc1clonechanged"] == "1") {
+    // cloning option has been changed on "source data" page. if it was turned 
+    // on we want to create a new collect.cfg file using the bc1clonecol cfg file
+    // as a model (we'll save the old file as collect.cfg.org). if cloning was
+    // turned off we'll revert to using the collect.cfg.org file (which will need
+    // updating in case the bc1 arguments have been altered since cloning was 
+    // turned on).
+    update_cfgfile_clone (args, logout);
+
+    // if cloning has just been turned on we'll also copy the rest of the files 
+    // (excluding collect.cfg which we've already done) from the cloned collections
+    // etc directory to the new collection.
+    if (args["bc1clone"] == "1") {
+      text_t clone_etc = filename_cat(gsdlhome, "collect", args["bc1clonecol"], "etc");
+      text_t new_etc = filename_cat(get_collectdir(args), args["bc1dirname"], "etc");
+      text_tarray files;
+
+      if (read_dir (clone_etc, files)) {
+	text_tarray::const_iterator here = files.begin();
+	text_tarray::const_iterator end = files.end();
+	while (here != end) {
+	  if (*here != "collect.cfg" && *here != "collect.cfg.org") {
+	    file_copy (filename_cat(clone_etc, *here), filename_cat(new_etc, *here));
+	  }
+	  here ++;
+	}
+      } else {
+	outconvertclass text_t2ascii;
+	logout <<text_t2ascii << "collectoraction::check_cgiargs couldn't read from " 
+	       << clone_etc << " directory\n";
+      }
+    }
+  }
+  
+  if (current_page == "bildstatus" || current_page == "bildcancel") {
+    // if .final file exists then build has finished
+    text_t fbld = filename_cat (gsdlhome, "tmp", args["bc1tmp"], args["bc1dirname"] + ".bld.final");
+    if (file_exists (fbld)) {
+      char *fbldc = fbld.getcstr();
+      ifstream fbld_in (fbldc);
+      if (fbld_in) {
+	failcode = fbld_in.get();
+	fbld_in.close();
+	if (failcode == '0') {
+	  // success - we need to create and configure a collection server for the
+	  // newly built collection (for fastcgi and local library where
+	  // initialization isn't going to be redone when the user clicks the
+	  // "view your new collection" button
+	  create_colserver (args["bc1dirname"], logout);
+	  current_page = "bilddone";
+	}
+	else current_page = "bildfail";
+      } else {
+	// assume build failed (we shouldn't get here though ... right?)
+	current_page = "bildfail";
+      }
+      delete fbldc;
+    }
+  }
+
+  if (args["bc1fromsrce"] == "1") {
+
+    // we've just come from the "source data" page so we need to check that
+    // input sources are valid
+    if (!check_sources(args, logout)) {
+      args["p"] = "srce";
+    }
+  }
+
+  return true;
+}
+
+void collectoraction::update_cfgfile_clone (cgiargsclass &args, ostream &logout) {
+
+  text_t tmpdir = filename_cat(gsdlhome, "tmp", args["bc1tmp"]);
+  text_t cfgfile = filename_cat(tmpdir, args["bc1dirname"], "etc", "collect.cfg");
+  if (!file_exists (cfgfile)) {
+    message = "tmpfail";
+    return;
+  }
+
+  text_t cfgfile_org = filename_cat (tmpdir, "collect.cfg.org");
+
+  if (args["bc1clone"] == "1") {
+    // cloning was turned on
+
+    text_t cfgfile_clone = filename_cat(gsdlhome, "collect", args["bc1clonecol"], "etc", "collect.cfg");
+    if (file_exists (cfgfile_clone)) {
+      // if .org file doesn't exist already create it
+      if (!file_exists (cfgfile_org)) {
+	if (!file_copy (cfgfile, cfgfile_org)) {
+	  message = "tmpfail";
+	  return;
+	}
+      }
+      // copy clone collections cfg file to new collection
+      if (!file_copy (cfgfile_clone, cfgfile)) {
+	message = "tmpfail";
+	return;
+      }
+      // update the new cfg file
+      update_cfgfile_partial (args, true, logout);
+      
+    } else {
+      // can't clone non-existant or read-protected collection
+      message = "clonefail";
+    }
+
+  } else {
+    // cloning has been turned off having been on at some point. the .org file
+    // should exist, if it doesn't we'll bail out and leave the user with the 
+    // cloned copy
+    if (file_exists (cfgfile_org)) {
+      // copy original back again and update it with any recent changes
+      if (file_copy (cfgfile_org, cfgfile)) {
+	update_cfgfile_partial (args, false, logout);
+      } else {
+	message = "tmpfail";
+      }
+    }
+  }
+}
+
+// update configuration file on disk to match bc1 arguments
+// there's a special case if the clone option is true as certain parts of a
+// config file should not be cloned (e.g. the iconcollection stuff)
+void collectoraction::update_cfgfile_partial (cgiargsclass &args, bool clone, ostream &logout) {
+
+  text_t cfgfile = filename_cat(get_collectdir(args), args["bc1dirname"], "etc", "collect.cfg");
+  char *cfgfilec = cfgfile.getcstr();
+
+#if defined (__WIN32__)
+  // make sure collect.cfg isn't read-only
+  _chmod (cfgfilec, _S_IREAD | _S_IWRITE);
+#endif
+
+  vector<text_tarray> cfgarray;
+
+  // read in cfg file
+  ifstream cfg_in (cfgfilec);
+  if (cfg_in) {
+    text_tarray cfgline;
+    while (read_cfg_line(cfg_in, cfgline) >= 0) {
+      if (cfgline.size () >= 2) {
+	if (cfgline[0] == "creator" || cfgline[0] == "maintainer") {
+	  cfgline[1] = args["bc1contactemail"];
+	} else if (cfgline[0] == "collectionmeta") {
+	  if (cfgline[1] == "collectionname") {
+	    cfgline[2] = args["bc1fullname"];
+	  } else if (cfgline[1] == "collectionextra") {
+	    cfgline[2] = carriage_replace (args["bc1aboutdesc"], 0);
+	  } else if (clone && (cfgline[1] == "iconcollection" ||
+			       cfgline[1] == "iconcollectionsmall")) {
+	    cfgline[2] = "";
+	  }
+	}
+      }
+      cfgarray.push_back (cfgline);
+    }
+    cfg_in.close();
+    
+    // now write cfg file back out
+    int fd=open(cfgfilec, O_WRONLY | O_CREAT | O_TRUNC
+#if defined(__WIN32__)
+		| O_BINARY
+#endif
+		);
+
+    if (fd != -1) {
+      // lock the file
+      int lock_val = 1;
+      GSDL_LOCK_FILE (fd);
+      if (lock_val != 0) {
+	logout << "Error: Couldn't lock file " << cfgfilec << "\n";
+	close(fd);
+	message = "tmpfail";
+	
+      } else {
+
+	vector<text_tarray>::const_iterator this_line = cfgarray.begin();
+	vector<text_tarray>::const_iterator end_line = cfgarray.end();
+	while (this_line != end_line) {
+	  write_cfg_line (fd, *this_line);
+	  this_line ++;
+	}
+	GSDL_UNLOCK_FILE (fd);
+	close(fd);
+      }
+
+    } else {
+      logout << "collectoraction::update_cfgfile_partial: unable to open "
+	     << cfgfilec << " for output\n";
+      message = "tmpfail";
+    }
+    
+  } else {
+    logout << "collectoraction::update_cfgfile_partial: unable to open "
+	   << cfgfilec << " for input\n";
+    message = "tmpfail";
+  }
+
+  delete cfgfilec;
+}
+
+// replace configuration file on disk with that in the cfgfile argument and 
+// catch other bc1 arguments up with those the new cfgfile contains
+void collectoraction::update_cfgfile_complete (cgiargsclass &args, ostream &logout) {
+
+  text_t cfgfile = filename_cat(get_collectdir(args), args["bc1dirname"], "etc", "collect.cfg");
+  char *cfgfilec = cfgfile.getcstr();
+
+#ifdef __WIN32__
+  // make sure collect.cfg isn't read-only
+  _chmod (cfgfilec, _S_IREAD | _S_IWRITE);
+#endif
+
+  int fd=open(cfgfilec, O_WRONLY | O_CREAT | O_TRUNC
+#if defined(__WIN32__)
+	      | O_BINARY
+#endif
+	      );
+
+  if (fd) {
+    // lock the file
+    int lock_val = 1;
+    GSDL_LOCK_FILE (fd);
+    if (lock_val != 0) {
+      logout << "Error: Couldn't lock file " << cfgfilec << "\n";
+      close(fd);
+      message = "tmpfail";
+      
+    } else {
+      
+      outconvertclass text_t2ascii;
+      text_t2ascii.setinput(&args["cfgfile"]);
+      size_t buffersize=args["cfgfile"].size();
+      char *buffer=new char[buffersize];
+      buffer[0]='\n'; // just in case something goes wrong...
+      size_t num_chars;
+      convertclass::status_t status;
+      text_t2ascii.convert(buffer, buffersize, num_chars, status);
+      // ignore status - assume it is "finished" as buffer is big enough
+      write(fd, buffer, num_chars);
+      GSDL_UNLOCK_FILE (fd);
+      close(fd);
+      delete buffer;
+      
+      // now that we've written the file we'll read it back again and
+      // update our bc1 arguments
+      ifstream cfg_in (cfgfilec);
+      if (cfg_in) {
+	text_tarray cfgline;
+	while (read_cfg_line(cfg_in, cfgline) >= 0) {
+	  if (cfgline.size () >= 2) {
+	    if (cfgline[0] == "creator") {
+	      args["bc1contactemail"] = cfgline[1];
+	    } else if (cfgline[0] == "collectionmeta") {
+	      if (cfgline[1] == "collectionname") {
+		args["bc1fullname"] = cfgline[2];
+	      } else if (cfgline[1] == "collectionextra") {
+		args["bc1aboutdesc"] = carriage_replace (cfgline[2], 1);
+	      }
+	    }
+	  }
+	}
+	cfg_in.close();
+      } else {
+	logout << "collectoraction::update_cfgfile_complete: unable to open " 
+	       << cfgfilec << " for input\n";
+	message = "tmpfail";
+      }
+    }
+  } else {
+    logout << "collectoraction::update_cfgfile_complete: unable to open " 
+	   << cfgfilec << " for output\n";
+    message = "tmpfail";
+  }
+
+  delete cfgfilec;
+}
+
+void collectoraction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+					response_t &response,text_t &response_data, 
+					ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+// return html for buttons used in collector bar
+// color may be "green", "grey", or "yellow"
+// type may be:
+//   "info" --> "collection information" button
+//   "srce" --> "source data" button
+//   "conf" --> "configure collection" button
+//   "bild" --> "build collection" button
+//   "view" --> "view collection" button
+// if enabled is true button will be flashy rollover type and 
+// will be hyperlinked
+
+text_t collectoraction::get_button (const text_t &thispage, const text_t &color, 
+				    const text_t &type, bool enabled) {
+
+  if ((color != "green" && color != "grey" && color != "yellow") ||
+      (type != "info" && type != "srce" && type != "conf" && type != "bild" && type != "view"))
+    return "";
+
+  text_t prefix = "gc";
+  if (color == "grey") prefix = "nc";
+  else if (color == "yellow") prefix = "yc";
+  
+  text_t httpicon = "httpicon" + prefix + type;
+  
+  if (enabled) {
+    text_t gsmacro = "_gsimage_";
+    if (thispage == "info" || thispage == "srce" || thispage == "conf" || 
+	thispage == "bildcancel" || thispage == "bildfail") {
+      gsmacro = "_gsjimage_";
+    } else if (type == "view") {
+      // view button is special case as it needs a target=_top
+      gsmacro = "_gstimage_";
+    }
+    return "<td>" + gsmacro + "(_collector:http" + type + "_,_collector:" + httpicon + 
+      "of_,_collector:" + httpicon + "on_," + type + ",_collector:text" + type + "_)</td>\n";
+  } else {
+    return "<td>_icon" + prefix + type + "of_</td>\n";
+  }
+}
+
+// set the _fullnamemenu_ macro (and _warnindex_ and _selectedindex_ if
+// we're on the "srce" page)
+void collectoraction::set_fullnamemenu (displayclass &disp, cgiargsclass &args, 
+					recptprotolistclass *protos, ostream &logout) {
+
+  if (recpt == NULL) {
+    logout << "ERROR (collectoraction::set_fullnamemenu): This action does not contain\n"
+	   << "       information about any receptionists. The method set_receptionist was\n"
+	   << "       probably not called from the module which instantiated this action.\n";
+    return;
+  }
+
+  text_t &current_page = args["p"];
+  text_t currentname = args["bc1dirname"];
+  if (current_page == "srce") currentname = args["bc1clonecol"];
+
+  text_tarray dirnames;
+  text_tarray fullnames;
+  vector<bool> write_protected;
+  bool is_selected = false;
+  int selected_index = 0;
+  int index = 0;
+
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+
+      // don't include z39.50 collections
+      comerror_t err = noError;
+      if ((*rprotolist_here).p->get_protocol_name (err) == "z3950proto") {
+	rprotolist_here ++;
+	continue;
+      }
+
+      text_tarray collist;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+	FilterResponse_t response;
+	text_tset metadata;
+	metadata.insert ("collectionname");
+	while (collist_here != collist_end) {
+	  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, logout);
+	  if (cinfo != NULL) {
+	    text_t collectionname = *collist_here;
+	    if (!cinfo->collectionmeta["collectionname"].empty()) {
+	      // get collection name from the collection cfg file
+	      collectionname = cinfo->collectionmeta["collectionname"];
+	    } else if (get_info ("collection", *collist_here, metadata, false, 
+				 (*rprotolist_here).p, response, logout)) {
+	      // get collection name from gdbm file
+	      collectionname = response.docInfo[0].metadata["collectionname"].values[0];
+	    }
+	    dirnames.push_back(*collist_here);
+	    fullnames.push_back(collectionname);
+	    // check to see if the collection is writable
+	    if (collection_protected (*collist_here)) write_protected.push_back(true);
+	    else write_protected.push_back(false);
+
+	    if (*collist_here == currentname) {
+	      is_selected = true;
+	      selected_index = index; 	    
+	    }
+	    index ++;
+	  }
+	  collist_here ++;
+	}
+      }
+    }
+    rprotolist_here ++;
+  }
+
+  bool first = true;
+  text_t warnindex;
+  text_t fullnamemenu = "<select name=\"bc1dirname\">\n";
+  if (current_page == "srce") {
+    fullnamemenu = "<select name=\"bc1clonecol\" onChange=\"menuchange();\">\n";
+    fullnamemenu += "<option value=defaultstructure";
+    if (!is_selected) fullnamemenu += " selected>";
+    else fullnamemenu.push_back('>');
+    fullnamemenu += "default structure\n";
+  }
+  for (int i = 0; i < index; i ++) {
+    // don't want write protected collections in list on "change existing
+    // collection" page
+    if (write_protected[i] && current_page == "existing") continue;
+    fullnamemenu += "<option value=\"" + dirnames[i] + "\"";
+    if ((i == 0 && !is_selected && current_page != "srce") || 
+	(is_selected && i == selected_index)) {
+      fullnamemenu += " selected";
+      selected_index++;
+      is_selected = false;
+    }
+    fullnamemenu.push_back ('>');
+    fullnamemenu += fullnames[i];
+    fullnamemenu.push_back ('\n');
+    
+    // add to Warnindex if collection uses any dubious plugins 
+    // (if creating clone collection list)
+    if (current_page == "srce") {
+      if (first) warnindex += "0,";
+      else warnindex.push_back(',');
+      if (uses_weird_plugin (dirnames[i])) {
+	warnindex += text_t (1);
+      } else {
+	warnindex += text_t (0);
+      }
+    }
+    first = false;
+  }
+  fullnamemenu += "</select>\n";
+
+  disp.setmacro ("fullnamemenu", "collector", fullnamemenu);
+  if (current_page == "srce") {
+    disp.setmacro ("warnindex", "collector", warnindex);
+    disp.setmacro ("selectedindex", "collector", text_t(selected_index));
+  }
+}
+
+// set _sourcelist_ and _badsources_ macros
+void collectoraction::set_inputsourceboxes (displayclass &disp, cgiargsclass &args, 
+					    ostream &logout) {
+  
+  if (badsources) disp.setmacro ("badsources", "collector", "1");
+
+  text_t sourcelist = get_source_box(args["bc1input"], args["bc1inputnum"].getint(),
+				     args["bc1inputtype"]);
+
+  disp.setmacro("sourcelist", "collector", sourcelist);
+
+  // reset badsources and failedsources variables
+  badsources = false;
+  failedsources.erase(failedsources.begin(), failedsources.end());
+}
+
+text_t collectoraction::get_source_box (text_t inputarglist, int numboxes,
+					text_t inputtypelist) {
+
+  text_tarray inputvalues;
+  splitchar (inputarglist.begin(), inputarglist.end(), ',', inputvalues);
+  // remove any empty values from the end of the array
+  if (inputvalues.size()) {
+    text_tarray::iterator l = inputvalues.end() - 1;
+    text_tarray::iterator b = inputvalues.begin();
+    while ((*l).empty() && l >= b) {
+      l--;
+    }
+    inputvalues.erase(l+1, inputvalues.end());
+  }
+
+  text_tarray inputtypes;
+  splitchar (inputtypelist.begin(), inputtypelist.end(), ',', inputtypes);
+
+  int numvalues = inputvalues.size();
+  int numtypes = inputtypes.size();
+
+  text_t last = "file://";
+  text_t rv;
+  for (int i = 0; i < numboxes; i++) {
+    rv += "<nobr><select name=\"bc1inputtype\">\n";
+    rv += "<option value=\"file://\"";
+    if ((i < numtypes && inputtypes[i] == "file://") ||
+	(numboxes == 3 && i == 0 && numvalues == 0) ||
+	(i >= 3 && i >= numvalues && last == "file://")) {
+      rv += " selected";
+      last = "file://";
+    }
+    rv += ">file://\n";
+    rv += "<option value=\"http://\"";
+    if ((i < numtypes && inputtypes[i] == "http://") ||
+	(numboxes == 3 && i == 1 && numvalues == 0) ||
+	(i >= 3 && i >= numvalues && last == "http://")) {
+      rv += " selected";
+      last = "http://";
+    }
+    rv += ">http://\n";
+    rv += "<option value=\"ftp://\"";
+    if ((i < numtypes && inputtypes[i] == "ftp://") ||
+	(numboxes == 3 && i == 2 && numvalues == 0) ||
+	(i >= 3 && i >= numvalues && last == "ftp://")) {
+      rv += " selected";
+      last = "ftp://";
+    }
+    rv += ">ftp://\n";
+    rv += "</select>\n";
+    rv += "<input type=text name=\"bc1input\" value=\"";
+    if (i < numvalues) {
+      rv += dm_safe(decode_commas(inputvalues[i]));
+    }
+    rv += "\" size=50>";
+    if (badsources) {
+      if ((i < numvalues) && (!inputvalues[i].empty())) {
+	if (failedsources[decode_commas(inputvalues[i])] == "1") {
+	  rv += "_iconcross_";
+	} else {
+	  rv += "_icontick_";
+	}
+      } else {
+	rv += "_iconblank_";
+      }
+    }
+    if (i+1 == numboxes) {
+      if (!badsources) rv += "_iconblank_";
+      rv += "_imagemore_</nobr><br>";
+    } else {
+      rv += "</nobr><br>\n";
+    }
+  }
+  
+  return rv;
+}
+
+// set the _cfgfile_ macro
+void collectoraction::set_cfgfile (displayclass &disp, cgiargsclass &args, ostream &logout) {
+
+  text_t &collection = args["bc1dirname"];
+  if (collection.empty()) {
+    message = "nocollection";
+    return;
+  }
+
+  // read in collect.cfg      
+  text_t cfgfile = filename_cat(get_collectdir(args), collection, "etc", "collect.cfg");  
+  char *cfgfilec = cfgfile.getcstr();
+
+#ifdef GSDL_USE_IOS_H
+  ifstream cfg_ifs (cfgfilec, ios::in | ios::nocreate);
+#else
+  ifstream cfg_ifs (cfgfilec, ios::in);
+#endif
+  
+  if (cfg_ifs) {  
+    // read in collect.cfg      
+    text_t cfgtext;
+    char c;
+    cfg_ifs.get(c);
+    while (!cfg_ifs.eof ()) {
+      cfgtext.push_back(c);
+      cfg_ifs.get(c);
+    }
+    cfg_ifs.close();
+    
+    // define it as a macro
+    disp.setmacro("cfgfile", "collector", dm_safe(cfgtext));
+
+  } else {
+    logout << "collectoraction::set_cfgfile: couldn't open configuration file (" 
+	   << cfgfilec << ") for reading\n";
+    message = "tmpfail";
+  }    
+  delete cfgfilec;
+}
+
+// set the _statusline_ macro
+void collectoraction::set_statusline (displayclass &disp, cgiargsclass &args, ostream & /*logout*/) {
+
+  // the build command creates .bld.download, .bld.import, and .bld.build files (in that
+  // order) and deletes them (also in that order) when each stage is complete. the .bld
+  // file is the concatenation of all these files.
+  text_t bld_file = filename_cat (gsdlhome, "tmp", args["bc1tmp"], args["bc1dirname"] + ".bld");
+  text_t statusline;
+
+  if (file_exists (bld_file + ".download")) {
+    statusline = "Downloading files ...<br>\n";
+    statusline += file_tail (bld_file + ".download", 1, 0);
+  } else if (file_exists (bld_file + ".import")) {
+    statusline = "Importing collection ...<br>\n";
+    statusline += file_tail (bld_file + ".import", 1, 0);
+  } else if (file_exists (bld_file + ".build")) {
+    statusline = "Building collection ...<br>\n";
+    statusline += file_tail (bld_file + ".build", 1, 0);
+  } else {
+    statusline += "creating collection ...<br>\n";
+    statusline += file_tail (bld_file, 1, 0);
+  }
+
+  disp.setmacro ("statusline", "collector", dm_safe(statusline));
+
+}
+
+void collectoraction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					      recptprotolistclass *protos, ostream &logout) {
+
+  // define_internal_macros sets the following macros:
+  // _collectorbar_
+  // _pagescriptextra_
+  // _fullnamemenu_ -- if displaying the "source data" page or the "changing existing 
+  //                   collection" page
+  // _cfgfile_ -- if displaying the "configure collection" page
+  // _statusline_ -- if displaying the bildstatus page
+  // _header_ -- may be set for pages that require it
+  // _textfailmsg_ -- set to different messages depending on failcode returned
+  //                  by build script (if build fails)
+  // _faillog_ - set to last 6 lines of .bld file if build failed
+  // _gsdlhome_ - the gsdlhome path (dm_safe)
+  // _sourcelist_ -- "input source" text boxes
+  // _badsources_ -- will be set to "1" if we've come from the 
+  //                 "source data" page and there's a problem 
+  //                 with the input sources
+
+  text_t &collector_page = args["p"];
+  int esrce = args["bc1esrce"].getint();
+  int econf = args["bc1econf"].getint();
+
+  // set _pagescriptextra_ macro to _cpagescriptextra_
+  disp.setmacro ("pagescriptextra", "collector", "_" + collector_page + "scriptextra_");
+
+  if (collector_page == "bildstatus" || collector_page == "bilddone" || 
+      collector_page == "bildfail" || collector_page == "bildframe1") {
+    disp.setmacro ("header", "collector", "_" + collector_page + "header_");
+  }
+
+  // set the collectorbar macro
+  text_t collectorbar = "<table border=0 cellspacing=4 cellpadding=0><tr>\n";
+
+  if (collector_page == "new") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "info", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "srce", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "conf", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "bild", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "view", false);
+
+  } else if (collector_page == "info") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "info", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "srce", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "conf", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "bild", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "view", false);
+    collectorbar += "</tr><tr><td></td><td align=center>_icongreyuparrow_</td><td colspan=8></td>\n";
+
+  } else if (collector_page == "srce") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    if (esrce == 1) {
+      // if we came from the "change an existing collection" page previous button(s)
+      // are disabled
+      collectorbar += get_button (collector_page, "grey", "info", false);
+    } else {
+      collectorbar += get_button (collector_page, "yellow", "info", true);
+    }
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "srce", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "conf", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "bild", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "view", false);
+    collectorbar += "</tr><tr><td colspan=3></td><td align=center>_icongreyuparrow_</td><td colspan=6></td>\n";
+
+  } else if (collector_page == "conf") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    // disable appropriate buttons if we came from "change an existing collection"
+    // page
+    if (esrce == 1 || econf == 1) {
+      collectorbar += get_button (collector_page, "grey", "info", false);
+    } else {
+      collectorbar += get_button (collector_page, "yellow", "info", true);
+    }
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    if (econf == 1) {
+      collectorbar += get_button (collector_page, "grey", "srce", false);
+    } else {
+      collectorbar += get_button (collector_page, "yellow", "srce", true);
+    }
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "conf", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "bild", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "view", false);
+    collectorbar += "</tr><tr><td colspan=5></td><td align=center>_icongreyuparrow_</td><td colspan=4></td>\n";
+
+  } else if (collector_page == "bilddone") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    // all previous buttons grey after build was completed
+    collectorbar += get_button (collector_page, "grey", "info", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "srce", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "conf", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "bild", false);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "green", "view", true);
+    collectorbar += "</tr><tr><td colspan=7></td><td align=center>_icongreyuparrow_</td><td colspan=2></td>\n";
+
+  } else if (collector_page == "bildcancel" || collector_page == "bildfail") {
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    // disable appropriate buttons if we came from "change an existing collection"
+    // page
+    if (esrce == 1 || econf == 1) {
+      collectorbar += get_button (collector_page, "grey", "info", false);
+    } else {
+      collectorbar += get_button (collector_page, "yellow", "info", true);
+    }
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    if (econf == 1) {
+      collectorbar += get_button (collector_page, "grey", "srce", false);
+    } else {
+      collectorbar += get_button (collector_page, "yellow", "srce", true);
+    }
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "conf", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "yellow", "bild", true);
+    collectorbar += "<td>_icongreyarrow_</td>\n";
+    collectorbar += get_button (collector_page, "grey", "view", false);
+  }
+
+  collectorbar += "</tr></table>\n";
+  disp.setmacro ("collectorbar", "collector", collectorbar);
+
+  if (collector_page == "bildfail") {
+
+    text_t textfailmsg = "_textfailmsg";
+    textfailmsg.push_back(failcode);
+    textfailmsg.push_back('_');
+    disp.setmacro("textfailmsg", "collector", textfailmsg);
+
+    text_t bldlog = filename_cat(gsdlhome, "tmp", args["bc1tmp"], args["bc1dirname"] + ".bld");
+    text_t rawlog = file_tail (bldlog, 6, 0);
+    // we'll shove in some <br> tags where \n's occur
+    text_t faillog;
+    text_t::const_iterator here = rawlog.begin();
+    text_t::const_iterator end = rawlog.end();
+    while (here != end) {
+      if (*here == '\n') faillog += "<br>";
+      faillog.push_back (*here);
+      here ++;
+    }
+    disp.setmacro ("faillog", "collector", dm_safe(faillog));
+  }
+
+  if (collector_page == "srce" || collector_page == "existing") 
+    set_fullnamemenu (disp, args, protos, logout);
+  if (collector_page == "conf") 
+    set_cfgfile (disp, args, logout);
+  if (collector_page == "bildstatus")
+    set_statusline (disp, args, logout);
+  if (collector_page == "srce") {
+    set_inputsourceboxes (disp, args, logout);
+  }
+
+  disp.setmacro ("gsdlhome", "collector", dm_safe(gsdlhome));
+}
+
+bool collectoraction::do_action (cgiargsclass &args, recptprotolistclass * /*protos*/, 
+				 browsermapclass * /*browsers*/, displayclass &disp, 
+				 outconvertclass &outconvert, ostream &textout, 
+				 ostream &logout) {
+
+  // make sure the collector is enabled
+  if (disabled) {
+    textout << outconvert 
+	    << "<html>\n"
+	    << "<head>\n"
+	    << "<title>Collector disabled</title>\n"
+	    << "</head>\n"
+	    << "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#006666\" "
+	    << "alink=\"#cc9900\" vlink=\"#666633\">\n"
+	    << "<h2>Facility disabled</h2>\n" 
+	    << "Sorry, the Collector end-user collection building facility is currently disabled\n"
+	    << "\n</body>\n"
+	    << "</html>\n";
+    return true;
+  }
+
+  text_t &collector_page = args["p"];
+  text_t &collection = args["bc1dirname"];
+
+  // make sure we have perl (we won't bother with this check for the 
+  // building status pages to avoid slowing things down unneccessarily)
+  if (collector_page != "bildstatus" && collector_page != "bildframe1" && !perl_ok(logout)) {
+    textout << outconvert 
+	    << "<html>\n"
+	    << "<head>\n"
+	    << "<title>Perl not found</title>\n"
+	    << "</head>\n"
+	    << "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#006666\" "
+	    << "alink=\"#cc9900\" vlink=\"#666633\">\n"
+	    << "<h2>Perl not found</h2>\n" 
+	    << "Greenstone could not detect perl on this system. It is therefore not\n"
+	    << "possible to build a Greenstone collection, either from the Collector or the \n"
+	    << "command-line tools, or to use the Collector for any other task.\n"
+	    << "<p>Please refer to the Greenstone Installer's Guide for details on\n"
+	    << "installing perl on your system.\n"
+	    << "\n</body>\n"
+	    << "</html>\n";
+    return true;
+
+  }
+
+  if (collector_page == "bild") {
+    // do the work (download, import, build)
+    gsdl_build (args, logout);
+
+    if (message.empty()) {
+      // bild page is a frameset so we don't want headers and stuff
+      textout << outconvert << disp << ("_collector:bildcontent_\n");
+    }
+  }
+
+  if (do_mkcol == true) {
+    // execute mkcol.pl (do_mkcol is set from within check_cgiargs)
+    gsdl_mkcol (args, logout);
+    do_mkcol = false; // reset for fast-cgi
+  }
+
+  if (args["bc1dodelete"] == "1") {
+    // delete bcidirname collection
+    if (collection_protected (collection)) {
+      message = "delinvalid";
+	
+    } else {
+
+      const recptconf &rcinfo = recpt->get_configinfo ();
+      bool emailuserevents = rcinfo.EmailUserEvents;
+
+      // get collection maintainer email from collect.cfg before we
+      // delete it
+      text_t colmaintainer;
+      text_t cfgfile = filename_cat(gsdlhome, "collect", collection, "etc", "collect.cfg");
+      char *cfgfilec = cfgfile.getcstr();
+      ifstream cfg_in (cfgfilec);
+      delete cfgfilec;
+      if (cfg_in) {
+	text_tarray cfgline;
+	while (read_cfg_line(cfg_in, cfgline) >= 0) {
+	  if (cfgline.size () == 2 && cfgline[0] == "maintainer") {
+	    colmaintainer = cfgline[1];
+	    break;
+	  }
+	}
+	cfg_in.close();
+      }
+      if (colmaintainer.empty()) {
+	logout << outconvert 
+	       << "collectoraction::do_action WARNING: Collection being deleted (" 
+	       << collection << ") has no maintainer address. EmailUserEvents "
+	       << "disabled\n";
+	emailuserevents = false;
+      }
+      
+      // first we need to free up the collection's collection server
+      // we must do this for the local library (and I guess when using
+      // fastcgi too) as you can't delete the gdbm file while it's
+      // being kept open by the collection server
+      remove_colservr (collection, logout);
+
+      text_t delete_cmd = "perl -S delcol.pl -f " + collection;
+      int rv = gsdl_system (delete_cmd, true, logout);
+      if (rv != 0) {
+	// deletion failed -- permissions?
+	message = "delpermission";
+      } else {
+	message = "delsuccess";
+      }
+
+      // log the event
+      if (rcinfo.LogEvents == CollectorEvents || rcinfo.LogEvents == AllEvents) {
+	
+	text_t eventlog = filename_cat (gsdlhome, "etc", "events.txt");
+	char *eventlogt = eventlog.getcstr();
+	ofstream eventl (eventlogt, ios::app);
+	delete eventlogt;
+
+	if (eventl) {
+	  eventl << outconvert << "[Collector Event]\n"
+		 << "Date: " << get_date (true) << "\n"
+		 << "Greenstone Username: " << args["un"] << "\n"
+		 << "Collection: " << collection << "\n"
+		 << "Collection Maintainer: " << colmaintainer << "\n"
+		 << "GSDLHOME: " << gsdlhome << "\n";
+
+	  if (message == "delsuccess") {
+	    eventl << outconvert 
+		   << "The " << collection << " collection was successfully deleted\n\n";
+	  } else {
+	    eventl << outconvert 
+		   << "Attempt to delete the " << collection << " collection failed\n\n";
+	  }
+	  eventl.close();
+
+	} else {
+	  logout << outconvert << "collectoraction::do_action ERROR: Couldn't open "
+		 << "event log file " << eventlog << " for appending during collection "
+		 << "deletion. LogEvents disabled\n";
+	}
+      }
+      
+      if (rcinfo.EmailEvents == CollectorEvents || rcinfo.EmailEvents == AllEvents || emailuserevents) {
+	// use sendmail.pl perl script to send email events
+	text_t tmpmailfile = filename_cat (gsdlhome, "tmp", args["bc1tmp"], "event.txt");
+	char *tmpmailfilec = tmpmailfile.getcstr();
+	ofstream tmpfile (tmpmailfilec);
+	delete tmpmailfilec;
+	if (tmpfile) {
+	  tmpfile << outconvert << "[Collector Event]\n"
+	    	  << "Date: " << get_date (true) << "\n"
+		  << "Greenstone Username: " << args["un"] << "\n"
+		  << "Collection: " << collection << "\n"
+		  << "Collection Maintainer: " << colmaintainer << "\n"
+		  << "GSDLHOME: " << gsdlhome << "\n";
+	  if (message == "delsuccess") {
+	    tmpfile << outconvert 
+		    << "The " << collection << " collection was successfully deleted\n\n";
+	  } else {
+	    tmpfile << outconvert 
+		    << "Attempt to delete the " << collection << " collection failed\n\n";
+	  }
+	  tmpfile.close();
+	  text_t to;
+	  if (rcinfo.EmailEvents == CollectorEvents || rcinfo.EmailEvents == AllEvents) to += rcinfo.maintainer;
+	  if (emailuserevents) {
+	    if (!to.empty()) to.push_back (',');
+	    to += colmaintainer;
+	  }
+	  text_t sendmail_cmd = "perl -S sendmail.pl -to \"" + to + "\" -from \"" + rcinfo.maintainer;
+	  sendmail_cmd += "\" -smtp \"" + rcinfo.MailServer + "\" -subject \"Greenstone Collector Event\"";
+	  sendmail_cmd += " -msgfile \"" + tmpmailfile + "\"";
+
+	  gsdl_system (sendmail_cmd, false, logout);
+	  
+	} else {
+	  logout << outconvert << "collectoraction::do_action ERROR: Couldn't open "
+		 << "temporary event log file " << tmpmailfile << " during collection "
+		 << "deletion. EmailEvents and EmailUserEvents disabled\n";
+	}
+      }
+    }
+  }
+  
+  if (collector_page == "bildcancel" || collector_page == "bildfail") {
+    // cancel the build (we'll also use the cancel_build script to tidy
+    // up if the build failed)
+    gsdl_cancel_build (args, logout);
+  }
+
+  if (collector_page == "expt") {
+
+    // export the collection - we'll do a synchronous system call to
+    // exportcol.pl as that's the easiest way to do it. if it becomes a
+    // problem that it's taking too long to export a large collection then
+    // we may have to revisit this.
+    text_t tmpfile = filename_cat (gsdlhome, "tmp", collection + "_export.txt");
+    text_t export_cmd = "perl -S exportcol.pl -out \"" + tmpfile + "\" " + collection;
+    gsdl_system (export_cmd, true, logout);
+    if (file_exists (tmpfile)) {
+      text_t returnline = file_tail (tmpfile, 1, 0);
+      if (returnline.size() > 23 && (substr(returnline.begin(), returnline.begin()+23) == "exportcol.pl succeeded:")) {
+	// success
+	message = "exptsuccess";
+      } else {
+	message = "exptfail";
+      }
+    } else {
+      message = "exptfail";
+    }
+  }
+
+  if (message.empty()) {
+    if (collector_page != "bild") {
+      // output page ("bild" page was already output above)
+      textout << outconvert << disp << ("_collector:header_\n")
+	      << ("_collector:" + collector_page + "content_\n")
+	      << ("_collector:footer_\n");
+    }
+  } else {
+    // message was set somewhere (probably an error), output message page
+    textout << outconvert << disp << ("_collector:header_\n")
+	    << ("_collector:" + message + "content_\n")
+	    << ("_collector:footer_\n");
+    message.clear();
+  }
+  return true;
+}
+
+// if sw = 0 replace all carriage returns in intext with the string "\n"
+// else replace all occurances of "\n" with a carriage return
+text_t collectoraction::carriage_replace (const text_t &intext, int sw) {
+   
+  text_t outtext;
+  text_t::const_iterator here = intext.begin();
+  text_t::const_iterator end = intext.end();
+  while (here != end) {
+    if (sw == 0) {
+      if (*here == '\n') {
+	if ((here+1) != end && *(here+1) == '\r') here ++;
+	outtext += "\\n";
+      } else if (*here == '\r') {
+	if ((here+1) != end && *(here+1) == '\n') here ++;
+	outtext += "\\n";
+      } else {
+	outtext.push_back (*here);
+      }
+    } else if (*here == '\\' && (here+1) != end && *(here+1) == 'n') {
+      outtext.push_back ('\n');
+      here ++;
+    } else {
+      outtext.push_back (*here);
+    }
+    here ++;
+  }
+  return outtext;
+}
+
+// create a short directory name from fullname
+text_t collectoraction::get_directory_name (const text_t &fullname) {
+
+  text_t shortname;
+  if (fullname.empty()) {
+    shortname = "coll";
+
+  } else {
+    
+    // first make all lowercase and remove any dodgy characters
+    // (i.e. anything not [a-z]
+    text_t::const_iterator here = fullname.begin();
+    text_t::const_iterator end = fullname.end();
+    while (here != end) {
+      if ((*here >= 'A' && *here <= 'Z') || (*here >= 'a' && *here <= 'z') ||
+	  (*here == ' ')) {
+	if (*here >= 'A' && *here <= 'Z') shortname.push_back (*here+32);
+	else if (*here == ' ') {
+	  while ((*(here+1)) == ' ') here ++;
+	  shortname.push_back (*here);
+	} else shortname.push_back (*here);
+      }
+      here ++;
+    }
+
+    text_tarray words;
+    splitchar (shortname.begin(), shortname.end(), ' ', words);
+    int num_words = words.size();
+
+    if (num_words == 0) {
+      shortname = "coll";
+
+    } else {
+
+      shortname.clear();
+      int use_words = (num_words <= 6) ? num_words : 6;
+      unsigned int substr_len = 6 / use_words;
+      
+      for (int i = 0; i < use_words; i++) {
+	if (words[i].size() < substr_len) shortname += words[i];
+	else shortname += substr (words[i].begin(), words[i].begin()+substr_len);
+      }
+    }
+  }
+
+  // check to see if shortname is unique
+  text_t fulldirname = filename_cat (gsdlhome, "collect", shortname);
+  if (directory_exists (fulldirname)) {
+    int version = 0;
+    text_t newname;
+    do {
+      version ++;
+      newname = shortname;
+      newname.push_back ('v');
+      newname.appendint (version);
+      fulldirname = filename_cat (gsdlhome, "collect", newname);
+    } while (directory_exists (fulldirname));
+
+    shortname = newname;
+  }
+  
+  return shortname;
+}
+
+// tests if collection is write protected (currently just checks if
+// collect.cfg file is writable
+bool collectoraction::collection_protected (const text_t &collection) {
+  text_t cfgfile = filename_cat(gsdlhome, "collect", collection, "etc", "collect.cfg");
+  if (file_writable(cfgfile)) return false;
+  return true;
+}
+
+// assigns a temporary directory name for this collector session
+// and creates temporary directory
+void collectoraction::assign_tmpname (cgiargsclass &args, ostream &logout) {
+
+  int i = 0;
+  text_t tmpname = "tbuild";
+  while (directory_exists (filename_cat (gsdlhome, "tmp", tmpname + text_t(i)))) {
+    i++;
+  }
+  tmpname.appendint (i);
+
+  text_t fulltmpdir = filename_cat (gsdlhome, "tmp", tmpname);
+  if (!mk_dir (fulltmpdir)) {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii << "collectoraction::assign_tmpname unable to create directory ("
+	   << fulltmpdir << ")\n";
+  }
+
+  args["bc1tmp"] = tmpname;
+}
+
+void collectoraction::gsdl_mkcol (cgiargsclass &args, ostream &logout) {
+
+  text_t tmpdir = filename_cat (gsdlhome, "tmp", args["bc1tmp"]);
+  if (!directory_exists (tmpdir)) {
+    message = "tmpfail";
+    return;
+  }
+
+  text_t &collection = args["bc1dirname"];
+  if (collection.empty()) {
+    message = "nocollection";
+    return;
+  }
+
+  // check for a .create file - if it exists then we've already created the collection
+  text_t createfile = filename_cat (tmpdir, ".create");
+  if (file_exists (createfile)) {
+    return;
+  }
+
+  // set up options
+  text_t options = "-quiet -creator \"" + args["bc1contactemail"] + "\"";
+  options += " -title \"" + args["bc1fullname"] + "\"";
+  options += " -about \"" + carriage_replace (args["bc1aboutdesc"] + "_collectorextra_", 0) + "\"";
+  options += " -collectdir \"" + remove_trailing_slashes(tmpdir) + "\" ";
+
+  text_t optionfile = filename_cat (tmpdir, "mkcol.opt");
+  char *optionfilec = optionfile.getcstr();
+  ofstream ofile_out (optionfilec);
+  delete optionfilec;
+  if (!ofile_out) {
+    message = "tmpfail";
+    return;
+  }
+  outconvertclass text_t2ascii;
+  ofile_out << text_t2ascii << options << "\n";
+  ofile_out.close();
+
+  // run mkcol.pl
+  text_t mkcol_cmd = "perl -S mkcol.pl -optionfile \"" + optionfile;
+  mkcol_cmd += "\" " + collection;
+  gsdl_system (mkcol_cmd, true, logout);
+
+  // make sure it went ok
+  text_t cfgfile = filename_cat (tmpdir, collection, "etc", "collect.cfg");
+  if (!file_writable (cfgfile)) {
+    message = "mkcolfail";
+  } else {
+    // create the .create file (this file is just a place holder to let any future
+    // pages know that the collection already exists).
+    char *createfilec = createfile.getcstr();
+    ofstream cfile_out (createfilec);
+    delete createfilec;
+    if (cfile_out) {
+      cfile_out << "collection created\n";
+      cfile_out.close();
+    } else {
+      message = "tmpfail";
+      return;
+    }
+  }
+}
+
+void collectoraction::gsdl_build (cgiargsclass &args, ostream &logout) {
+
+  outconvertclass text_t2ascii;
+
+  text_t tmpdir = filename_cat (gsdlhome, "tmp", args["bc1tmp"]);
+  if (!directory_exists (tmpdir)) {
+    message = "tmpfail";
+    return;
+  }
+  
+  text_t &collection = args["bc1dirname"];
+  if (collection.empty()) {
+    message = "nocollection";
+    return;
+  }
+
+  // check for a .build file - if it exists then we've already built
+  // the collection (or are in the process of building it)
+  text_t buildfile = filename_cat (tmpdir, ".build");
+  if (file_exists (buildfile)) {
+    return;
+  } else {
+    // create the .build file (this file is just a place holder to let any future
+    // pages know that we've already been here)
+    char *buildfilec = buildfile.getcstr();
+    ofstream bfile_out (buildfilec);
+    delete buildfilec;
+    if (bfile_out) {
+      bfile_out << "collection building\n";
+      bfile_out.close();
+    } else {
+      message = "tmpfail";
+      return;
+    }
+  }
+
+  const recptconf &rcinfo = recpt->get_configinfo ();
+
+  // create the event header file if LogEvents, EmailEvents or
+  // EmailUserEvents options are turned on.
+  bool logevents = 
+    (rcinfo.LogEvents == CollectorEvents || rcinfo.LogEvents == AllEvents || 
+     rcinfo.EmailEvents == CollectorEvents || rcinfo.EmailEvents == AllEvents ||
+     rcinfo.EmailUserEvents);
+  text_t ehead_file = filename_cat (tmpdir, "ehead.txt");
+  if (logevents) {
+    if (!create_event_header_file (ehead_file, args, logout)) {
+      logevents = false;
+    }
+  }
+    
+  text_t collectdir = get_collectdir (args);
+
+  // set up build options
+  text_t options = "-make_writable -remove_import -out \"";
+  options += filename_cat (tmpdir, collection + ".bld");
+  options += "\" -collectdir \"" + collectdir + "\" -statsfile \"";
+  options += filename_cat(collectdir, collection, "etc", "import.log") + "\"";
+
+  if (args["bc1esrce"] == 1) {
+    // we're adding data to an existing collection
+    options += " -save_archives -append";
+  }
+
+  text_tarray inputvalues, inputtypes;
+  splitchar (args["bc1input"].begin(), args["bc1input"].end(), ',', inputvalues);
+  splitchar (args["bc1inputtype"].begin(), args["bc1inputtype"].end(), ',', inputtypes);
+  int numvalues = inputvalues.size();
+  int numtypes = inputtypes.size();
+  for (int i = 0; i < numvalues; i++) {
+    if (!inputvalues[i].empty()) {
+      text_t type = "file://"; // default
+      if (i < numtypes) type = inputtypes[i];
+      options += " -download \"" + 
+	remove_trailing_slashes(type + format_url(decode_commas(inputvalues[i]))) + "\"";
+    }
+  }
+
+  if (logevents) {
+    if (rcinfo.LogEvents == CollectorEvents || rcinfo.LogEvents == AllEvents) 
+      options += " -log_events";
+    if (rcinfo.EmailEvents == CollectorEvents || rcinfo.EmailEvents == AllEvents) {
+      options += " -mail_server " + rcinfo.MailServer;
+      options += " -email_events " + rcinfo.maintainer;
+      if (rcinfo.EmailUserEvents) options += "," + args["bc1contactemail"];
+    } else if (rcinfo.EmailUserEvents) {
+      options += " -mail_server " + rcinfo.MailServer;
+      options += " -email_events " + args["bc1contactemail"];
+    }
+    options += " -event_header " + ehead_file;
+  }
+
+  text_t optionfile = filename_cat (tmpdir, "build.opt");
+  char *optionfilec = optionfile.getcstr();
+  ofstream ofile_out (optionfilec);
+  delete optionfilec;
+  if (!ofile_out) {
+    message = "tmpfail";
+    return;
+  }
+  ofile_out << text_t2ascii << options << "\n";
+  ofile_out.close();
+
+  // if we're altering an existing collection we need to kill off
+  // the existing collection server - we do this for the local library
+  // (and any other persistent version of the library) as the existing
+  // gdbm file can't be deleted while the collection server holds it open
+  if ((args["bc1econf"] == 1) || (args["bc1esrce"] == 1)) {
+    remove_colservr (collection, logout);
+  }    
+
+  // set up the build command - build.bat has some issues with quoting
+  // on win2k when gsdlhome contains spaces so we'll avoid using 
+  // "perl -S" here in favor of calling the "build" perl script explicitly
+  text_t build_cmd = "perl \"" + filename_cat (gsdlhome, "bin", "script", "build");
+  build_cmd += "\" -optionfile \"" + optionfile + "\" " + collection;
+  // run build command in background (i.e. asynchronously)
+  gsdl_system (build_cmd, false, logout);
+}
+
+void collectoraction::gsdl_cancel_build (cgiargsclass &args, ostream &logout) {
+  // I really wanted to do what this perl script does from within the library
+  // c++ code. I ran into some problems though (like how do you write a portable
+  // "rm -r" in c++?). One day I'll spend some time sorting it out ... maybe.
+  text_t cancel_cmd = "perl -S cancel_build.pl -collectdir \"";
+  cancel_cmd += filename_cat (gsdlhome, "tmp", args["bc1tmp"]) + "\" ";
+  cancel_cmd += args["bc1dirname"];
+  // To be on the safe side we'll make this a synchronous call
+  // so that all tidying up is done before the user has a chance
+  // to do anything else (like start rebuilding their collection).
+  // This means that for a big collection where there's lots of 
+  // stuff to delete etc. it might take a while before the "build
+  // cancelled" page appears.
+  gsdl_system (cancel_cmd, true, logout);
+}
+
+text_t collectoraction::get_collectdir (cgiargsclass &args) {
+
+  if ((args["bc1econf"] == 1) || (args["bc1esrce"] == 1)) {
+    // we're adding to a collection in place
+    return filename_cat(gsdlhome, "collect");  
+
+  } else {
+    return filename_cat (gsdlhome, "tmp", args["bc1tmp"]);
+  }
+}
+
+// checks to see if any of the plugins in pluginset occur in 
+// collections configuration file
+bool collectoraction::uses_weird_plugin (const text_t &collection) {
+
+  text_tset pluginset;
+  pluginset.insert ("HBPlug");
+
+  text_t cfgfile_content;
+  text_t cfgfile_name = filename_cat (gsdlhome, "collect", collection, "etc", "collect.cfg");
+  text_t pluginstr, pluginname;
+
+  if (read_file (cfgfile_name, cfgfile_content)) {
+    text_t::const_iterator here = cfgfile_content.begin();
+    text_t::const_iterator end = cfgfile_content.end();
+    while (here != end) {
+      here = findchar (here, end, 'p');
+      if (here == end) break;
+      if ((here+6 < end) && (substr (here, here+6) == "plugin")) {
+	getdelimitstr (here+6, end, '\n', pluginstr);
+	text_t::const_iterator hp = pluginstr.begin();
+	text_t::const_iterator ep = pluginstr.end();
+	bool found = false;
+	// remove any leading whitespace, trailing options etc.
+	while (hp != ep) {
+	  if (*hp == '\t' || *hp == ' ' || *hp == '\n') {
+	    if (found) break;
+	  } else {
+	    pluginname.push_back (*hp);
+	    found = true;
+	  }
+	  hp ++;
+	}
+	text_tset::const_iterator it = pluginset.find (pluginname);
+	if (it != pluginset.end()) return true; // found matching plugin
+	pluginname.clear();
+      }
+      here ++;
+    }
+  }
+  return false;
+}
+
+// create and initialize a new collection server and
+// add it to the null protocol.
+void collectoraction::create_colserver (const text_t &collection, ostream &logout) {
+
+  recptprotolistclass *protos = recpt->get_recptprotolist_ptr();
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    comerror_t err = noError;
+    if ((*rprotolist_here).p != NULL) {
+      if ((*rprotolist_here).p->get_protocol_name (err) == "nullproto") {
+	// create collection server and add it to nullproto
+	(*rprotolist_here).p->add_collection (collection, recpt, gsdlhome, gsdlhome);
+	// make sure gsdlhome is configured
+	text_tarray tmp;
+	tmp.push_back (gsdlhome);
+	(*rprotolist_here).p->configure ("gsdlhome", tmp, err);
+	// re-initialize the null protocol
+	if (!(*rprotolist_here).p->init (err, logout)) {
+	  logout << "collectoraction::create_colserver: nullproto init failed\n";
+	}
+	return;
+      }
+    }
+    rprotolist_here ++;
+  }
+
+  logout << "collectoraction::create_colserver: no valid nullproto found\n";
+}
+
+// delete a collection server from the null protocol
+void collectoraction::remove_colservr (const text_t &collection, ostream &logout) {
+
+  recpt->uncache_collection (collection);
+
+  recptprotolistclass *protos = recpt->get_recptprotolist_ptr();
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    comerror_t err = noError;
+    if ((*rprotolist_here).p != NULL) {
+      if ((*rprotolist_here).p->get_protocol_name (err) == "nullproto") {
+	(*rprotolist_here).p->remove_collection (collection, logout);
+	return;
+      }
+    }
+    rprotolist_here ++;
+  }
+
+  logout << "collectoraction::create_colserver: no valid nullproto found\n";
+}
+
+bool collectoraction::create_event_header_file (const text_t &filename, cgiargsclass &args, 
+						ostream &logout) {
+
+  outconvertclass text_t2ascii;
+  char *filenamec = filename.getcstr();
+  ofstream eheadfile (filenamec);
+  delete filenamec;
+
+  if (eheadfile) {
+    eheadfile << text_t2ascii << get_event_header (args);
+    eheadfile.close();
+    return true;
+  }
+   
+  logout << text_t2ascii << "collectoraction::create_event_header ERROR: Couldn't create "
+	 << "Event Header file " << filename << ". Event logging disabled\n";
+  return false;
+}
+
+text_t collectoraction::get_event_header (cgiargsclass &args) {
+  text_t header = "Greenstone Username: " + args["un"] + "\n";
+  header += "Collection: " + args["bc1dirname"] + "\n";
+  header += "Collection Creator: " + args["bc1contactemail"] + "\n";
+  header += "GSDLHOME: " + gsdlhome + "\n";
+  header += "Build Location: " + get_collectdir(args) + "\n";
+
+  return header;
+}
+
+bool collectoraction::check_sources (cgiargsclass &args, ostream &logout) {
+
+  bool found = false;
+
+  text_tarray inputvalues;
+  splitchar (args["bc1input"].begin(), args["bc1input"].end(), ',', inputvalues);
+
+  text_tarray inputtypes;
+  splitchar (args["bc1inputtype"].begin(), args["bc1inputtype"].end(), ',', inputtypes);
+
+  int numvalues = inputvalues.size();
+  int numtypes = inputtypes.size();
+
+  for (int i = 0; i < numvalues; i++) {
+    text_t value = format_url(decode_commas(inputvalues[i]));
+    text_t type = "file://"; // default
+    if (!value.empty()) {
+      found = true;
+      if (i >= numtypes || inputtypes[i].empty()) {
+	logout << "collectoraction::check_sources: WARNING type not set\n";
+      } else {
+	type = inputtypes[i];
+      }
+      if (type == "file://") {
+	if (!file_exists(value) && !directory_exists(value)) {
+	  failedsources[decode_commas(inputvalues[i])] = "1";
+	  badsources = true;
+	}
+      } else if (type == "http://") {
+	if (gsdl_system ("perl -S ping.pl -quiet http://" + value, true, logout)) {
+	  failedsources[decode_commas(inputvalues[i])] = "1";
+	  badsources = true;
+	}
+      } else if (type == "ftp://") {
+	if (gsdl_system ("perl -S ping.pl -quiet ftp://" + value, true, logout)) {
+	  failedsources[decode_commas(inputvalues[i])] = "1";
+	  badsources = true;
+	}
+      }
+    }
+  }
+
+  // set badsources if there weren't any sources at all
+  if (!found) badsources = true;
+
+  if (badsources) return false;
+  return true;
+}
+
+// format_url simply strips "http://", "ftp://", or "file://" off the
+// beginning of url if they're there
+text_t collectoraction::format_url (const text_t &url) {
+  text_t::const_iterator begin = url.begin();
+  text_t::const_iterator end = url.end();
+
+  if (url.size() >= 7) {
+    text_t prefix = substr(begin, begin+7);
+    if (prefix == "http://" || prefix == "file://") {
+      return substr(begin+7, end);
+    }
+  }
+  if (url.size() >= 6) {
+    if (substr(begin, begin+6) == "ftp://") {
+      return substr(begin+6, end);
+    }
+  }
+  return url;
+}
+
+text_t collectoraction::remove_trailing_slashes (text_t str) {
+
+  while (*(str.end()-1) == '\\') {
+    str.pop_back();
+  }
+  return str;
+}
Index: /main/tags/2.38/gsdl/src/recpt/collectoraction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/collectoraction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/collectoraction.h	(revision 21083)
@@ -0,0 +1,135 @@
+/**********************************************************************
+ *
+ * collectoraction.h -- 
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef COLLECTORACTION_H
+#define COLLECTORACTION_H
+
+#include "action.h"
+#include "receptionist.h"
+
+class collectoraction : public action {
+  
+protected:
+
+  bool disabled;
+  receptionist *recpt;
+  char *gsdlosc;
+  char *gsdlhomec;
+  char *pathc;
+
+  text_t message;
+  char failcode;
+
+  bool do_mkcol;
+
+  bool badsources;
+  text_tmap failedsources;
+
+  text_t get_button (const text_t &thispage, const text_t &color, 
+		     const text_t &type, bool enabled);
+
+  void set_fullnamemenu (displayclass &disp, cgiargsclass &args,
+			 recptprotolistclass *protos, ostream &logout);
+
+  void set_inputsourceboxes (displayclass &disp, cgiargsclass &args, 
+			     ostream &logout);
+
+  text_t get_source_box (text_t inputarglist, int numboxes, 
+			 text_t inputtypelist);
+
+  void set_cfgfile (displayclass &disp, cgiargsclass &args, ostream &logout);
+
+  void set_statusline (displayclass &disp, cgiargsclass &args, ostream &logout);
+
+  void update_cfgfile_clone (cgiargsclass &args, ostream &logout);
+
+  void update_cfgfile_partial (cgiargsclass &args, bool clone, ostream &logout);
+
+  void update_cfgfile_complete (cgiargsclass &args, ostream &logout);
+
+  text_t carriage_replace (const text_t &intext, int sw);
+
+  text_t get_directory_name (const text_t &fullname);
+
+  bool collection_protected (const text_t &collection);
+
+  void assign_tmpname (cgiargsclass &args, ostream &logout);
+
+  void gsdl_mkcol (cgiargsclass &args, ostream &logout);
+
+  void gsdl_build (cgiargsclass &args, ostream &logout);
+
+  void gsdl_cancel_build (cgiargsclass &args, ostream &logout);
+
+  text_t get_collectdir (cgiargsclass &args);
+
+  bool uses_weird_plugin (const text_t &collection);
+
+  void create_colserver (const text_t &collection, ostream &logout);
+
+  void remove_colservr (const text_t &collection, ostream &logout);
+
+  bool create_event_header_file (const text_t &filename, cgiargsclass &args, 
+				 ostream &logout);
+
+  text_t get_event_header (cgiargsclass &args);
+
+  bool check_sources (cgiargsclass &args, ostream &logout);
+
+  text_t format_url (const text_t &url);
+
+  text_t remove_trailing_slashes (text_t str);
+
+public:
+  collectoraction ();
+  virtual ~collectoraction ();
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  bool init (ostream &logout);
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+
+  text_t get_action_name () {return "collector";}
+
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response,text_t &response_data, 
+			 ostream &logout);
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/comproto.asn
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/comproto.asn	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/comproto.asn	(revision 21083)
@@ -0,0 +1,376 @@
+-- The protocol data unit (PDU) is the
+-- message that is transmitted between receptionists and
+-- collectionservers (colservers?).
+--
+-- Comments in ASN.1 start with two dashes and continue to the end
+-- of a line (or to the next two dashes, whichever is first).
+-- 
+-- Z39.50 has inspired much of this but I have tried to keep
+-- it simple. Its hard to tell if I have succeeded ;-)
+
+
+GSDL-APDU DEFINITIONS ::=
+BEGIN
+
+
+-- PDU is the basic message type. Note: in ASN.1 the
+-- field name comes first and the field type second (opposite
+-- to C). Ignore the numbers in the square brackets (e.g. [0]),
+-- they're just tags to disambiguate certain circumstances and to
+-- make the protocol easier to extend. The keyword 'IMPLICIT' just
+-- makes the tags a little more efficient.
+--
+-- A SEQUENCE is a list of fields where the order is important
+
+PDU ::= SEQUENCE {
+  header  StandardHeader,
+  message Message
+}
+
+
+-- ????? Is there anything else we want in the header ?????
+--
+-- Anonymous transactions should leave out the idAuthentication field
+
+StandardHeader ::= SEQUENCE {
+  protocolVersion       [0] IMPLICIT INTEGER,
+  idAuthentication      [1] IMPLICIT IdAuthentication OPTIONAL
+}
+
+IdAuthentication ::= SEQUENCE {
+  userId   GeneralString,
+  groupId  GeneralString,
+  password GeneralString
+}
+
+
+-- A CHOICE is like a union in C.
+-- 
+-- Short forms: Auth (Authority), Mir (Mirror), Col (Collection),
+--   Doc (Document), Info (Information)
+
+Message ::= CHOICE {
+  -- General
+  error                      [0]  IMPLICIT Error,
+  pingRequest                [1]  IMPLICIT PingRequest,
+  pingResponse               [2]  IMPLICIT PingResponse,
+
+  -- Authority
+--  authListRequest            [12] IMPLICIT AuthListRequest,
+--  authListResponse           [13] IMPLICIT AuthListResponse,
+--  editAuthListRequest        [14] IMPLICIT EditAuthListRequest,
+--  editAuthListResponse       [15] IMPLICIT EditAuthListResponse,
+
+  -- an authority mirror is a mirror of THIS authority
+--  authMirListRequest         [16] IMPLICIT AuthMirListRequest,
+--  authMirListResponse        [17] IMPLICIT AuthMirListResponse,
+--  editAuthMirListRequest     [18] IMPLICIT EditAuthMirListRequest,
+--  editAuthMirListResponse    [19] IMPLICIT EditAuthMirListResponse,
+
+  colListRequest             [20] IMPLICIT ColListRequest,
+  colListResponse            [21] IMPLICIT ColListResponse,
+--  editColListRequest         [22] IMPLICIT EditColListRequest,
+--  editColListResponse        [23] IMPLICIT EditColListResponse,
+
+--  colMirListRequest          [24] IMPLICIT ColMirListRequest,
+--  colMirListResponse         [25] IMPLICIT ColMirListResponse, 
+--  editColMirListRequest      [26] IMPLICIT EditColMirListRequest, 
+--  editColMirListResponse     [27] IMPLICIT EditColMirListResponse,
+
+  -- Collection
+  colInfoRequest             [40] IMPLICIT ColInfoRequest,
+  colInfoResponse            [41] IMPLICIT ColInfoResponse,
+
+  -- Document
+  documentRequest            [52] IMPLICIT DocumentRequest,
+  documentResponse           [53] IMPLICIT DocumentResponse,
+
+  -- Access (searching, browsing, and metadata information)
+  infoFiltersRequest         [60] IMPLICIT InfoFiltersRequest,
+  infoFiltersResponse        [61] IMPLICIT InfoFiltersResponse,
+  infoFilterOptionsRequest   [62] IMPLICIT InfoFilterOptionsRequest,
+  infoFilterOptionsResponse  [63] IMPLICIT InfoFilterOptionsResponse,
+  filterRequest              [64] IMPLICIT FilterRequest,
+  filterResponse             [65] IMPLICIT FilterResponse
+}
+
+
+
+-- ------------------------------
+-- GENERAL
+-- ------------------------------
+
+
+-- The error list is not complete yet ...
+
+Error ::= ENUMERATED {
+  authenticationFailure(0), protocolError(1), systemProblem(2)
+}
+
+
+PingRequest ::= SEQUENCE {
+}
+
+PingResponse ::= SEQUENCE {
+}
+
+
+
+-- ------------------------------
+-- AUTHORITY
+-- ------------------------------
+
+
+-- Support for subscription is optional for both the clients and
+-- the servers. It is recomended that it is not implemented yet
+-- for simplicity.
+
+-- AuthListRequest ::= SEQUENCE {
+-- }
+
+-- AuthListResponse ::= SEQUENCE {
+--   authList  [1] IMPLICIT StringSet
+-- }
+
+
+-- EditAuthListRequest ::= SEQUENCE {
+--   editAction EditAction,
+--   authority  GeneralString
+-- }
+
+-- EditAuthListResponse ::= SEQUENCE {
+-- }
+
+
+-- AuthMirListRequest ::= SEQUENCE {
+--   limitNumber [1] IMPLICIT INTEGER OPTIONAL,
+--   limitDomain [2] IMPLICIT GeneralString OPTIONAL
+-- }
+
+-- AuthMirListResponse ::= SEQUENCE {
+--   authMirList [1] IMPLICIT HostPortSet
+-- }
+
+
+-- EditAuthMirListRequest ::= SEQUENCE {
+--   editAction EditAction,
+--   authMir    HostPort
+-- }
+
+-- EditAuthMirListResponse ::= SEQUENCE {
+-- }
+
+
+ColListRequest ::= SEQUENCE {
+}
+
+ColListResponse ::= SEQUENCE {
+  colList   [1] IMPLICIT ShortColInfoSet
+}
+
+
+-- EditColListRequest ::= SEQUENCE {
+--   editAction EditAction,
+--   colInfo    ShortColInfo
+-- }
+
+-- EditColListResponse ::= SEQUENCE {
+-- }
+
+
+-- ColMirListRequest ::= SEQUENCE {
+--   limitNumber [1] IMPLICIT INTEGER OPTIONAL,
+--   limitDomain [2] IMPLICIT GeneralString OPTIONAL
+-- }
+
+-- ColMirListResponse ::= SEQUENCE {
+--   colMirList [1] IMPLICIT ShortColInfoSet
+-- }
+
+
+-- EditColMirListRequest ::= SEQUENCE {
+--   editAction EditAction,
+--   colMirInfo ShortColInfo
+-- }
+
+-- EditColMirListResponse ::= SEQUENCE {
+-- }
+
+
+
+
+-- ------------------------------
+-- COLLECTION
+-- ------------------------------
+
+
+ColInfoRequest ::= SEQUENCE {
+}
+
+ColInfoResponse ::= SEQUENCE {
+  shortInfo   [0] IMPLICIT ShortCollectionInfo,
+  isPublic    [2] IMPLICIT BOOLEAN,    -- whether has anonymous access
+  isBeta      [3] IMPLICIT BOOLEAN,    -- beta if still under development
+  builddate   [4] IMPLICIT GeneralizedTime,
+  languages   [5] IMPLICIT StringSet,  -- languages in the collection
+  numDocs     [6] IMPLICIT INTEGER,
+  numWords    [7] IMPLICIT INTEGER OPTIONAL,
+  numBytes    [8] IMPLICIT INTEGER OPTIONAL
+}
+
+
+
+-- ------------------------------
+-- DOCUMENT
+-- ------------------------------
+
+
+
+DocumentRequest ::= SEQUENCE {
+  OID       GeneralString,
+  docType   GeneralString,
+  docFormat GeneralString
+}
+
+DocumentResponse ::= SEQUENCE {
+  doc OCTET STRING
+}
+
+
+-- ------------------------------
+-- ACCESS (SEARCH AND BROWSE)
+-- ------------------------------
+
+
+-- filter options which might be supported for the QueryFilter
+--
+-- onePerQuery StartResults   integer
+-- onePerQuery EndResults     integer
+-- onePerQuery QueryType      enumerated (boolean, ranked)
+-- onePerTerm  Term           string ???
+-- onePerTerm  Casefold       boolean
+-- onePerTerm  Stem           boolean
+-- onePerTerm  Index          enumerated
+-- onePerTerm  Subcollection  enumerated
+--
+-- filter options which might be supported for the BrowseFilter
+--
+-- onePerQuery StartResults   integer
+-- onePerQuery EndResults     integer
+-- onePerQuery ParentNode     string ("" will return the browsing available)
+--
+-- The NullFilter always returns the set it was given, it doesn't have
+-- any options
+
+InfoFiltersRequest ::= SEQUENCE {
+}
+
+InfoFiltersResponse ::= SEQUENCE {
+  filterNames StringSet
+}
+
+InfoFilterOptionsRequest ::= SEQUENCE {
+  filterName GeneralString
+}
+
+InfoFilterOptionsResponse ::= SEQUENCE {
+  filterOptions SET OF FilterOption
+}
+
+FilterOption ::= SEQUENCE {
+  name         GeneralString,
+  type         ENUMERATED {booleant(0), integert(1), enumeratedt(2), stringt(3)},
+  repeatable   ENUMERATED {onePerQuery(0), onePerTerm(1), nPerTerm(2)},
+  defaultValue GeneralString,
+  -- the interpretation of the validValues depends on the type
+  -- for boolean: the first value is the false value, the second is true value
+  -- for integer: the first value is the minimum, the second the maximum
+  -- for enumerated: all values a listed
+  -- for string: this value is ignored
+  validValues  StringSequence
+}
+
+
+-- Terms are presented in the same order that they are requested,
+-- any information relating to the terms is in reference to the
+-- index specified for that term.
+-- Metadata is presented in the same order that it is requested.
+
+FilterRequest ::= SEQUENCE {
+  filterName          [0] GeneralString,
+  filterOptions       [1] IMPLICIT SEQUENCE OF OptionValue,
+  docSet              [2] IMPLICIT StringSequence, -- the OID "" represents everything
+  filterResultOptions [3] IMPLICIT BIT STRING {termFreq(0), matchTerms(1), OID(2), 
+                                               subCol(3), ranking(4), docFreq(5), 
+                                               metadata(6)}
+
+  -- the next set of options are for the metadata request, 
+  -- they can be left blank if metadata is not wanted
+  requestParams       [4] IMPLICIT GeneralString, -- used to negotiate the metadata content
+  refParams           [5] IMPLICIT GeneralString, -- used to decide whether to return a 
+                                                  -- reference to the data or the actual data
+  fields              [6] IMPLICIT StringSequence
+}
+
+OptionValue ::= SEQUENCE {
+  name  GeneralString,
+  value GeneralString
+}
+
+FilterResponse ::= SEQUENCE {
+  numDocs   [0] IMPLICIT INTEGER,
+  isApprox  [1] IMPLICIT BOOLEAN,                  -- whether numDocs is approximate
+  termInfo  [2] IMPLICIT SEQUENCE OF TermInfo,     -- empty if not required
+  docInfo   [3] IMPLICIT SEQUENCE OF ResultDocInfo -- empty if not required
+}
+
+TermInfo ::= SEQUENCE {
+  term       [0] GeneralString,
+  freq       [1] IMPLICIT INTEGER,       -- 0 if not requested
+  matchTerms [2] IMPLICIT StringSequence -- empty if not requested
+}
+
+ResultDocInfo ::= SEQUENCE {
+  OID      [0] IMPLICIT GeneralString,
+  ranking  [1] IMPLICIT INTEGER,             -- 0 if not requested, range 0-10000
+  docFreq  [2] IMPLICIT SEQUENCE OF INTEGER, -- empty if not requested
+  metadata [3] IMPLICIT SEQUENCE OF MetadataInfo
+}
+
+
+MetadataInfo ::= SEQUENCE {
+  params  [0] IMPLICIT GeneralString,
+  isRef   [1] IMPLICIT BOOLEAN,
+  field   [3] IMPLICIT GeneralString,
+  value   [4] IMPLICIT GeneralString
+}
+
+
+-- ------------------------------
+-- Useful Types
+-- ------------------------------
+
+-- HostPortSet ::= SET OF HostPort
+
+-- HostPort ::= SEQUENCE {
+--   host [0] IMPLICIT GeneralString,
+--   port [1] IMPLICIT INTEGER
+-- }
+
+ShortColInfoSet ::= SET OF ShortColInfo
+
+ShortColInfo ::= SEQUENCE {
+  name GeneralString,
+  host GeneralString,
+  port INTEGER
+}
+
+-- EditAction ::= ENUMERATED {
+--   update(0), delete(1)
+-- }
+
+StringSequence ::= SEQUENCE OF GeneralString
+StringSet ::= SET OF GeneralString
+
+
+END
Index: /main/tags/2.38/gsdl/src/recpt/comtypes.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/comtypes.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/comtypes.cpp	(revision 21083)
@@ -0,0 +1,262 @@
+/**********************************************************************
+ *
+ * comtypes.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "comtypes.h"
+
+
+text_t get_comerror_string (comerror_t err) {
+  if (err == noError) return "no error";
+  else if (err == authenticationFailure) return "authentication failure";
+  else if (err == protocolError) return "protocol error";
+  else if (err == configurationError) return "configuration error";
+  else if (err == systemProblem) return "system problem";
+
+  return "unknown problem";
+}
+
+
+void ShortColInfo_t::clear() {
+  name.clear();
+  host.clear();
+  port = 0;
+}
+
+/* isPublic now defaults to true */
+void ColInfoResponse_t::clear () {
+  shortInfo.clear();
+  isPublic=true;
+  isBeta=false;
+  languages.erase(languages.begin(), languages.end());
+  ccsCols.erase(ccsCols.begin(), ccsCols.end());
+  buildDate=0;
+  buildType.clear();
+  numDocs=0;
+  numSections=0;
+  numWords=0;
+  numBytes=0;
+  format.erase(format.begin(), format.end());
+  building.erase(format.begin(), format.end());
+  httpdomain.clear();
+  httpprefix.clear();
+  receptionist.clear();
+}
+
+void InfoFiltersResponse_t::clear () {
+  filterNames.erase(filterNames.begin(), filterNames.end());
+}
+
+
+void InfoFilterOptionsRequest_t::clear () {
+  filterName.clear();
+}
+
+
+void FilterOption_t::clear () {
+  name.clear();
+  type = booleant;
+  repeatable = onePerQuery;
+  defaultValue.clear();
+  validValues.erase(validValues.begin(), validValues.end());
+}
+
+void FilterOption_t::check_defaultValue () {
+  text_tarray::iterator here, end;
+
+  // how the default is interpreted depends on the option type
+  switch (type) {
+  case booleant: 
+  case enumeratedt: // has to be one of the validValues
+    here = validValues.begin ();
+    end = validValues.end ();
+    while (here != end) {
+      if (*here == defaultValue) return;
+      here++;
+    }
+    
+    break;
+
+  case integert: // has to be in the validValues range
+    if ((validValues.size() >= 2) &&
+	(validValues[0].getint() <= defaultValue.getint()) &&
+	(validValues[1].getint() >= defaultValue.getint()))
+      return;
+    break;
+
+  case stringt: // any value is valid
+    return; 
+  }
+
+  // did not find the defaultValue
+  if (validValues.empty()) defaultValue.clear();
+  else defaultValue = validValues[0];
+}
+
+
+bool operator==(const FilterOption_t &x, const FilterOption_t &y) {
+  return ((x.name == y.name) &&
+	  (x.type == y.type) &&
+	  (x.repeatable == y.repeatable) &&
+	  (x.defaultValue == y.defaultValue) &&
+	  (x.validValues == y.validValues));
+}
+
+bool operator<(const FilterOption_t &x, const FilterOption_t &y) {
+  return ((x.name < y.name) ||
+	  ((x.name == y.name) &&
+	   ((x.type < y.type) ||
+	    ((x.type == y.type) &&
+	     ((x.repeatable < y.repeatable) ||
+	      ((x.repeatable == y.repeatable) &&
+	       ((x.defaultValue < y.defaultValue) ||
+		((x.defaultValue == y.defaultValue) &&
+		 (x.validValues < y.validValues)))))))));
+}
+
+
+
+void InfoFilterOptionsResponse_t::clear () {
+  filterOptions.erase(filterOptions.begin(), filterOptions.end());
+}
+
+
+void OptionValue_t::clear () {
+  name.clear();
+  value.clear();
+}
+
+
+void FilterRequest_t::clear () {
+  filterName.clear();
+  filterOptions.erase(filterOptions.begin(), filterOptions.end());
+  docSet.erase(docSet.begin(), docSet.end());
+  filterResultOptions = 0;
+  requestParams.clear();
+  refParams.clear();
+  fields.erase(fields.begin(), fields.end());
+  getParents = false;
+}
+
+
+void TermInfo_t::clear () {
+  term.clear();
+  freq = 0;
+  matchTerms.erase (matchTerms.begin(), matchTerms.end());
+}
+
+
+void MetadataInfo_t::clear () {
+  params.clear();
+  isRef = false;
+  values.erase(values.begin(), values.end());
+  if (parent != NULL) {
+    delete parent;
+    parent = NULL;
+  }
+}
+
+MetadataInfo_t::MetadataInfo_t () {parent=NULL;clear();}
+
+// copy constructor
+MetadataInfo_t::MetadataInfo_t (const MetadataInfo_t &x) {
+  params = x.params;
+  isRef = x.isRef;
+  values = x.values;
+  if (x.parent == NULL) parent = NULL;
+  else {
+    parent = new MetadataInfo_t ();
+    *parent = *(x.parent);
+  }
+}
+
+MetadataInfo_t::~MetadataInfo_t () {
+  if (parent != NULL) {
+    delete parent;
+    parent = NULL;
+  }
+}
+
+MetadataInfo_t &MetadataInfo_t::operator=(const MetadataInfo_t &x) {
+  if (&x != this) {
+    params = x.params;
+    isRef = x.isRef;
+    values = x.values;
+    if (x.parent == NULL) parent = NULL;
+    else {
+      parent = new MetadataInfo_t ();
+      *parent = *(x.parent);
+    }
+  }
+  return *this;
+}
+
+void ResultDocInfo_t::clear () {
+  OID.clear ();
+  ranking = 0;
+  result_num = 0;
+  num_terms_matched = 0;
+  num_phrase_match = 0;
+  docFreq.erase(docFreq.begin(), docFreq.end());
+  metadata.erase(metadata.begin(), metadata.end());
+  classifier_metadata_type.erase(classifier_metadata_type.begin(), 
+				 classifier_metadata_type.end());
+  classifier_metadata_offset = 0;
+  
+}
+
+ResultDocInfo_t &ResultDocInfo_t::operator=(const ResultDocInfo_t &x) {
+  OID = x.OID; 
+  ranking = x.ranking;
+  result_num = x.result_num;
+  num_terms_matched = x.num_terms_matched;
+  num_phrase_match = x.num_phrase_match;
+  docFreq = x.docFreq; 
+  metadata = x.metadata;
+  return *this;
+}
+
+void FilterResponse_t::clear () {
+  numDocs = 0;
+  isApprox = Exact;
+  termInfo.erase (termInfo.begin(), termInfo.end());
+  docInfo.erase (docInfo.begin(), docInfo.end());
+}
+
+FilterResponse_t &FilterResponse_t::operator=(const FilterResponse_t &x) {
+  numDocs = x.numDocs;
+  isApprox = x.isApprox;
+  termInfo = x.termInfo;
+  docInfo = x.docInfo;
+  return *this;
+}
+
+void DocumentRequest_t::clear () {
+  OID.clear();
+  docType.clear();
+  docFormat.clear();
+}
+
+void DocumentResponse_t::clear () {
+  doc.clear();
+}
Index: /main/tags/2.38/gsdl/src/recpt/comtypes.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/comtypes.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/comtypes.h	(revision 21083)
@@ -0,0 +1,367 @@
+/**********************************************************************
+ *
+ * comtypes.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef COMTYPES_H
+#define COMTYPES_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#  include <ospace\std\list>
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#  include <list.h>
+#  include <map.h>
+#else
+#  include <vector>
+#  include <list>
+#  include <map>
+#endif
+
+
+enum comerror_t {noError, authenticationFailure, protocolError, 
+		 configurationError, systemProblem};
+text_t get_comerror_string (comerror_t err);
+
+// ShortColInfo ::= SEQUENCE {
+//   name GeneralString,
+//   host GeneralString,
+//   port INTEGER
+// }
+struct ShortColInfo_t {
+  void clear ();
+  ShortColInfo_t () {clear();}
+
+  text_t name;
+  text_t host;
+  int port;
+};
+
+
+// ColInfoResponse ::= SEQUENCE {
+//   shortInfo      [0]  IMPLICIT ShortCollectionInfo,
+//   isPublic       [2]  IMPLICIT BOOLEAN,    -- whether has anonymous access
+//   isBeta         [3]  IMPLICIT BOOLEAN,    -- beta if still under development
+//   buildDate      [4]  IMPLICIT GeneralizedTime,
+//   ccsCols        [5]  IMPLICIT StringSet,  -- collections that form cross-col search
+//   languages      [6]  IMPLICIT StringSet,  -- languages in the collection
+//   numDocs        [7]  IMPLICIT INTEGER,
+//   numSections    [8]  IMPLICIT INTEGER OPTIONAL,
+//   numWords       [9]  IMPLICIT INTEGER OPTIONAL,
+//   numBytes       [10] IMPLICIT INTEGER OPTIONAL
+//   collectionmeta [11] IMPLICIT StringSet
+//   format         [12] IMPLICIT StringSet
+//   building       [13] IMPLICIT StringSet
+//   receptionist   [14] IMPLICIT GeneralString
+//   buildType      [15] IMPLICIT GeneralString
+// }
+struct ColInfoResponse_t {
+  void clear ();
+  ColInfoResponse_t () {clear();}
+
+  ShortColInfo_t shortInfo;
+  bool isPublic;
+  bool isBeta;
+  unsigned long buildDate;
+  text_tarray ccsCols;    // empty if collection does not use cross-collection searching
+  text_tarray languages;
+  unsigned long numDocs;     // 0 if not known
+  unsigned long numSections; // 0 if not known
+  unsigned long numWords;    // 0 if not known
+  unsigned long numBytes;    // 0 if not known
+  text_tmap collectionmeta;
+  text_tmap format;
+  text_tmap building;
+  text_t    httpdomain;      // GRB: could these two http items need removing
+  text_t    httpprefix;
+  text_t    receptionist;
+  text_t    buildType;  // 'mg' or 'mgpp'
+};
+
+
+// -- filter options which might be supported for the QueryFilter
+// --
+// -- onePerQuery StartResults   integer
+// -- onePerQuery EndResults     integer
+// -- onePerQuery QueryType      enumerated (boolean, ranked)
+// -- onePerTerm  Term           string ???
+// -- onePerTerm  Casefold       boolean
+// -- onePerTerm  Stem           boolean
+// -- onePerTerm  Index          enumerated
+// -- onePerTerm  Subcollection  enumerated
+// --
+// -- filter options which might be supported for the BrowseFilter
+// --
+// -- onePerQuery StartResults   integer
+// -- onePerQuery EndResults     integer
+// -- onePerQuery ParentNode     string ("" will return the browsing available)
+// --
+// -- The NullFilter always returns the set it was given, it doesn't have
+// -- any options
+
+// InfoFiltersResponse ::= SEQUENCE {
+//   filterNames StringSet
+// }
+struct InfoFiltersResponse_t {
+  void clear ();
+
+  text_tset filterNames;
+};
+
+// InfoFilterOptionsRequest ::= SEQUENCE {
+//   filterName GeneralString
+// }
+struct InfoFilterOptionsRequest_t {
+  void clear ();
+
+  text_t filterName;
+};
+
+// FilterOption ::= SEQUENCE {
+//   name         GeneralString,
+//   type         ENUMERATED {booleant(0), integert(1), enumeratedt(2), stringt(3)},
+//   repeatable   ENUMERATED {onePerQuery(0), onePerTerm(1), nPerTerm(2)},
+//   defaultValue GeneralString,
+//   -- the interpretation of the validValues depends on the type
+//   -- for boolean: the first value is the false value, the second is true value
+//   -- for integer: the first value is the minimum, the second the maximum
+//   -- for enumerated: all values a listed
+//   -- for string: this value is ignored
+//   validValues  StringSequence
+// }
+struct FilterOption_t {
+  void clear ();
+  void check_defaultValue ();
+  FilterOption_t () {clear();}
+
+  text_t name;
+
+  enum type_t {booleant=0, integert=1, enumeratedt=2, stringt=3};
+  type_t type;
+
+  enum repeatable_t {onePerQuery=0, onePerTerm=1, nPerTerm=2};
+  repeatable_t repeatable;
+
+  text_t defaultValue;
+  text_tarray validValues;
+};
+
+bool operator==(const FilterOption_t &x, const FilterOption_t &y);
+bool operator<(const FilterOption_t &x, const FilterOption_t &y);
+
+
+typedef map<text_t, FilterOption_t, lttext_t> FilterOption_tmap;
+
+
+// InfoFilterOptionsResponse ::= SEQUENCE {
+//   filterOptions SET OF FilterOption
+// }
+struct InfoFilterOptionsResponse_t {
+  void clear ();
+
+  FilterOption_tmap filterOptions;
+};
+
+
+// OptionValue ::= SEQUENCE {
+//   name  GeneralString,
+//   value GeneralString
+// }
+struct OptionValue_t {
+  void clear ();
+
+  text_t name;
+  text_t value;
+};
+
+typedef vector<OptionValue_t> OptionValue_tarray;
+
+
+// -- Terms are presented in the same order that they are requested,
+// -- any information relating to the terms is in reference to the
+// -- index specified for that term.
+//
+// FilterRequest ::= SEQUENCE {
+//   filterName          [0] GeneralString,
+//   filterOptions       [1] IMPLICIT SEQUENCE OF OptionValue,
+//   docSet              [2] IMPLICIT StringSequence, -- the OID "" represents everything
+//   filterResultOptions [3] IMPLICIT BIT STRING {termFreq(0), matchTerms(1), OID(2), 
+//                                                subCol(3), ranking(4), docFreq(5), 
+//                                                metadata(6)}
+// 
+//   -- the next set of options are for the metadata request, 
+//   -- they can be left blank if metadata is not wanted
+//   requestParams       [4] IMPLICIT GeneralString, -- used to negotiate the metadata content
+//   refParams           [5] IMPLICIT GeneralString, -- used to decide whether to return a 
+//                                                   -- reference to the data or the actual data
+//   fields              [6] IMPLICIT StringSet
+//   getParents          [7] IMPLICIT BOOLEAN        -- gets metadata of all parents too
+// }
+#define FRtermFreq   1
+#define FRmatchTerms 2
+#define FROID        4
+#define FRsubCol     8
+#define FRranking    16
+#define FRdocFreq    32
+#define FRmetadata   64
+// used to indicate a full text browse query for mgpp
+#define FRfullTextBrowse  128
+
+struct FilterRequest_t {
+  void clear ();
+  FilterRequest_t () {clear();}
+
+  text_t filterName;
+  OptionValue_tarray filterOptions;
+  text_tarray docSet;        // empty if not used
+  int filterResultOptions; // use the FR* defines above
+
+  text_t requestParams; // empty if not used
+  text_t refParams;     // empty if not used
+  text_tset fields;   // empty if not used
+  bool getParents;      // defaults to false
+};
+
+
+// TermInfo ::= SEQUENCE {
+//   term       [0] GeneralString,
+//   freq       [1] IMPLICIT INTEGER,       -- 0 if not requested
+//   matchTerms [2] IMPLICIT StringSequence -- empty if not requested
+// }
+struct TermInfo_t {
+  void clear ();
+  TermInfo_t () {clear();}
+
+  text_t term;
+  int freq; // 0 if not requested
+  text_tarray matchTerms; // empty if not requested
+};
+
+typedef vector<TermInfo_t> TermInfo_tarray;
+
+
+// MetadataInfo ::= SEQUENCE {
+//   params  [0] IMPLICIT GeneralString,
+//   isRef   [1] IMPLICIT BOOLEAN,
+//   values  [3] IMPLICIT SEQUENCE OF GeneralString,
+//   name    [4] IMPLICIT GeneralString
+// }
+struct MetadataInfo_t {
+  text_t params;
+  bool isRef;
+  text_tarray values;
+  MetadataInfo_t *parent;
+
+  void clear ();
+  MetadataInfo_t ();
+  MetadataInfo_t (const MetadataInfo_t &x); // copy constructor
+  ~MetadataInfo_t ();
+  MetadataInfo_t &operator=(const MetadataInfo_t &x);
+};
+
+typedef map<text_t, MetadataInfo_t, lttext_t> MetadataInfo_tmap;
+
+// ResultDocInfo ::= SEQUENCE {
+//   OID      [0] IMPLICIT GeneralString,
+//   ranking  [1] IMPLICIT INTEGER,             -- 0 if not requested, range 0-10000
+//   docFreq  [2] IMPLICIT SEQUENCE OF INTEGER, -- empty if not requested
+//   metadata [3] IMPLICIT SEQUENCE OF MetadataInfo, -- no longer a SEQUENCE (SET maybe??)
+//   classifier_metadata_type   [4] IMPLICIT GeneralString,       -- empty if not requested
+//   classifier_metadata_offset [5] IMPLICIT INTEGER,             -- 0 if not requested
+// }
+struct ResultDocInfo_t {
+  void clear ();
+  ResultDocInfo_t () {clear();}
+
+  text_t OID;
+  int result_num;          // place in results list
+  int ranking;             // 0 if not requested (real ranking*10000)
+  int num_terms_matched;   // not available on all versions of mg
+  int num_phrase_match;    // not available on all versions of mg
+  vector<int> docFreq;           // empty if not requested
+  MetadataInfo_tmap metadata;    // empty if not requested
+  text_t classifier_metadata_type;        // empty if not requested
+  int    classifier_metadata_offset;      // 0 if not requested
+  ResultDocInfo_t &operator=(const ResultDocInfo_t &x);
+};
+
+typedef vector<ResultDocInfo_t> ResultDocInfo_tarray;
+
+
+// FilterResponse ::= SEQUENCE {
+//   numDocs   [0] IMPLICIT INTEGER,
+//   isApprox  [1] ENUMERATED {Exact(0), Approximate(1), MoreThan(2)}, -- whether numDocs is approximate
+//   termInfo  [2] IMPLICIT SEQUENCE OF TermInfo,                      -- empty if not required
+//   docInfo   [3] IMPLICIT SEQUENCE OF ResultDocInfo                  -- empty if not required
+// }
+
+enum isapprox {Exact=0, Approximate=1, MoreThan=2};
+
+struct FilterResponse_t {
+  void clear ();
+  FilterResponse_t () {clear();}
+
+  int numDocs;
+  isapprox isApprox;
+  TermInfo_tarray termInfo; // empty if not requested
+  ResultDocInfo_tarray docInfo; // empty if not requested
+
+  FilterResponse_t &operator=(const FilterResponse_t &x);
+};
+
+
+// DocumentRequest ::= SEQUENCE {
+//   OID       GeneralString,
+//   docType   GeneralString,
+//   docFormat GeneralString
+// }
+struct DocumentRequest_t {
+  void clear ();
+  DocumentRequest_t () {clear();}
+
+  text_t OID;
+  text_t docType;
+  text_t docFormat;
+};
+
+
+// DocumentResponse ::= SEQUENCE {
+//   doc OCTET STRING
+// }
+
+struct DocumentResponse_t {
+  void clear ();
+  DocumentResponse_t () {clear();}
+
+  text_t doc;
+};
+
+
+#endif
+
Index: /main/tags/2.38/gsdl/src/recpt/converter.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/converter.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/converter.cpp	(revision 21083)
@@ -0,0 +1,77 @@
+/**********************************************************************
+ *
+ * converter.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "converter.h"
+
+
+
+// the converters within converterinfo become the property of this class
+// after add_converter has been called. The converters remain the
+// responsability of the calling code and will not be deleted by this
+// class.
+void convertinfoclass::add_converter (const text_t &name, inconvertclass *inconverter,
+				      rzwsoutconvertclass *outconverter) {
+  // can't add a null converter or an action with no name
+  if (inconverter == NULL || outconverter == NULL || name.empty()) {
+    return;
+  }
+
+  converterinfo info;
+  info.name = name;
+  info.inconverter = inconverter;
+  info.outconverter = outconverter;
+  converters[name] = info;
+}
+
+
+bool operator==(const converterinfo &x, const converterinfo &y) {
+  return ((x.name == y.name) && (x.inconverter == y.inconverter) &&
+	  (x.outconverter == y.outconverter));
+}
+
+bool operator<(const converterinfo &x, const converterinfo &y) {
+  return ((x.name < y.name) ||
+	  ((x.name == y.name) &&
+	   ((x.inconverter < y.inconverter) ||
+	    ((x.inconverter == y.inconverter) &&
+	     ((x.outconverter < y.outconverter))))));
+}
+
+
+// get_inconverter will return NULL if the convert could not be found
+inconvertclass *convertinfoclass::get_inconverter (const text_t &name) {
+  iterator here = converters.find (name);
+  if (here == converters.end()) return NULL;
+
+  return (*here).second.inconverter;
+}
+
+// get_outconverter will return NULL if the convert could not be found
+rzwsoutconvertclass *convertinfoclass::get_outconverter (const text_t &name) {
+  iterator here = converters.find (name);
+  if (here == converters.end()) return NULL;
+
+  return (*here).second.outconverter;
+}
Index: /main/tags/2.38/gsdl/src/recpt/converter.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/converter.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/converter.h	(revision 21083)
@@ -0,0 +1,122 @@
+/**********************************************************************
+ *
+ * converter.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CONVERTER_H
+#define CONVERTER_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "gsdlunicode.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+
+// inconverter and outconverter ARE NOT destroyed by this class
+// they should be destroyed by the code which created them after
+// no more pointers to the class exist.
+//
+// The above condition enables the class to be copied without
+// copying the converters which might contain a lot of data (and
+// be of an unknown derived type).
+class converterinfo {
+public:
+  text_t name;
+  inconvertclass *inconverter;
+  rzwsoutconvertclass *outconverter;
+
+  converterinfo() {inconverter=NULL; outconverter=NULL;}
+};
+
+bool operator==(const converterinfo &x, const converterinfo &y);
+bool operator<(const converterinfo &x, const converterinfo &y);
+
+
+typedef map<text_t, converterinfo, lttext_t> convertmap;
+
+// convertinfoclass is used to store a number of converters
+// indexing them by their name
+class convertinfoclass {
+protected:
+  convertmap converters;
+
+public:
+  // type support for convertmap
+  typedef convertmap::iterator iterator;
+  typedef convertmap::const_iterator const_iterator;
+  typedef convertmap::reference reference;
+  typedef convertmap::const_reference const_reference;
+  typedef convertmap::size_type size_type;
+  typedef convertmap::difference_type difference_type;
+  typedef convertmap::const_reverse_iterator const_reverse_iterator;
+  typedef convertmap::reverse_iterator reverse_iterator;
+  
+  // constructors
+  convertinfoclass () {}
+
+  // basic container support
+  iterator begin () {return converters.begin();}
+  const_iterator begin () const {return converters.begin();}
+  iterator end () {return converters.end();}
+  const_iterator end () const {return converters.end();}
+
+  void erase(iterator pos) {converters.erase(pos);}
+  void erase(iterator first, iterator last) {converters.erase(first, last);}
+  convertinfoclass &operator=(const convertinfoclass &x) 
+    {converters=x.converters;return *this;}
+
+  bool empty () const {return converters.empty();}
+  size_type size() const {return converters.size();}
+
+  const_iterator find(text_t &key) {return converters.find(key);}
+
+  // added functionality
+  void clear () {converters.erase(converters.begin(),converters.end());}
+
+  // the converters within converterinfo become the property of
+  // of this class after add_converter has been called. The converters
+  // remain the responsability of the calling code and will not be
+  // deleted by this class.
+  void add_converter (const text_t &name, inconvertclass *inconverter,
+		      rzwsoutconvertclass *outconverter);
+
+  // get_inconverter will return NULL if the convert could not be found
+  inconvertclass *get_inconverter (const text_t &name);
+
+  // get_outconverter will return NULL if the convert could not be found
+  rzwsoutconvertclass *get_outconverter (const text_t &name);
+};
+
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/corbaclient.mpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/corbaclient.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/corbaclient.mpp	(revision 21083)
@@ -0,0 +1,162 @@
+/**********************************************************************
+ *
+ * corbaclient.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+#include "receptionist.h"
+#include "cgiwrapper.h"
+#include "corbaproto.h"
+#include "collectserver.h"
+#include "filter.h"
+#include "browsefilter.h"
+#include "queryfilter.h"
+#include "infodbclass.h"
+#include "mgsearch.h"
+#include "mggdbmsource.h"
+#include "fileutil.h"
+#include <assert.h>
+
+#include "action.h"
+#include "statusaction.h"
+#include "pageaction.h"
+#include "pingaction.h"
+#include "queryaction.h"
+#include "documentaction.h"
+#include "authenaction.h"
+#include "usersaction.h"
+#include "authenaction.h"
+#include "extlinkaction.h"
+#include "tipaction.h"
+#include "collectoraction.h"
+
+#include "browserclass.h"
+#include "vlistbrowserclass.h"
+#include "hlistbrowserclass.h"
+#include "datelistbrowserclass.h"
+#include "invbrowserclass.h"
+#include "pagedbrowserclass.h"
+#include "htmlbrowserclass.h"
+
+// #include "gsdlhome.h"
+#include "recptconfig.h"
+
+int main (int argc, char *argv[]) {
+  receptionist recpt;
+  corbaproto*  cproto_array[argc];
+  text_t       gsdlhome;
+  text_t       httpdomain;
+  text_t       httpprefix;
+  
+  cproto_array[0] = NULL; // unused
+
+  if (argc == 1)
+  { cout << "Content-type: text/html" << endl << endl;
+    cout << "Usage: " << argv[0] << "site1.objid [site2.objid ....]" << endl;
+    return 0;
+  }
+
+  // Strictly speaking httpdomain and httpprefix are not needed.
+  // Need to modifiy site_cfg_read to eliminate this dependency. // ****
+  site_cfg_read(gsdlhome, httpdomain, httpprefix);
+
+  for (int i=1; i<argc; i ++)
+    {
+      // add the protocol to the receptionist
+      cproto_array[i] = new corbaproto(argv[i]);
+      recpt.add_protocol(cproto_array[i]);
+    }
+
+//  cout << "GRB 2" << endl;
+
+  // the list of actions. Note: these actions will become invalid
+  // at the end of this function.
+  tipaction atipaction;
+  recpt.add_action(&atipaction);
+
+  statusaction astatusaction;
+  astatusaction.set_receptionist (&recpt);
+  recpt.add_action (&astatusaction);
+
+  pageaction apageaction;
+  apageaction.set_receptionist (&recpt);
+  recpt.add_action (&apageaction);
+
+  pingaction apingaction;
+  recpt.add_action (&apingaction);
+
+  queryaction aqueryaction;
+  aqueryaction.set_receptionist (&recpt);
+  recpt.add_action (&aqueryaction);
+
+  documentaction adocumentaction;
+  adocumentaction.set_receptionist (&recpt);
+  recpt.add_action (&adocumentaction);
+
+  usersaction ausersaction;
+  recpt.add_action (&ausersaction);
+
+  extlinkaction anextlinkaction;
+  recpt.add_action (&anextlinkaction);
+
+  authenaction aauthenaction;
+  aauthenaction.set_receptionist(&recpt);
+  recpt.add_action (&aauthenaction);
+
+  collectoraction acollectoraction;
+  acollectoraction.set_receptionist (&recpt);
+  recpt.add_action(&acollectoraction);
+
+//  cout << "GRB 3" << endl;
+
+  // list of browsers
+  vlistbrowserclass avlistbrowserclass;
+  recpt.add_browser (&avlistbrowserclass);
+  recpt.setdefaultbrowser ("VList");
+
+  hlistbrowserclass ahlistbrowserclass;
+  recpt.add_browser (&ahlistbrowserclass);
+
+  datelistbrowserclass adatelistbrowserclass;
+  recpt.add_browser (&adatelistbrowserclass);
+
+  invbrowserclass ainvbrowserclass;
+  recpt.add_browser (&ainvbrowserclass);
+
+  pagedbrowserclass apagedbrowserclass;
+  recpt.add_browser (&apagedbrowserclass);
+
+  htmlbrowserclass ahtmlbrowserclass;
+  recpt.add_browser (&ahtmlbrowserclass);
+
+  cgiwrapper (recpt, "");
+
+  for (int i=1; i< argc; i++)
+    {
+      delete cproto_array[i];
+    }
+
+  return 0;
+}
+
Index: /main/tags/2.38/gsdl/src/recpt/corbaproto.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/corbaproto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/corbaproto.h	(revision 21083)
@@ -0,0 +1,101 @@
+/**********************************************************************
+ *
+ * corbaproto.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef CORBAPROTO_H
+#define CORBAPROTO_H
+
+#include "gsdlconf.h"
+#include "collectserver.h"
+#include "recptproto.h"
+#include "corbaiface.h"
+using namespace gsdlInterface;
+
+class corbaproto : public recptproto {
+ private:
+  corbaiface_var getCorbaClient();
+ protected:
+  collectservermapclass cservers;
+  corbaiface_var        client;
+  CORBA::ORB_var        orb;
+  CORBA::BOA_var        boa;
+  CORBA::Object_var     obj;
+  text_t gsdlhome;
+  text_t site_name;
+
+ public:
+  virtual ~corbaproto() {}
+  corbaproto(char* site_name);
+
+  // add_collectserver should be called for each collection server
+  // before any configuration is done
+  void add_collectserver (collectserver *thecserver) 
+    {cservers.addcollectserver(thecserver);}
+
+  // this configure will configure each of the collection servers
+  void configure (const text_t &key, const text_tarray &cfgline, comerror_t &err);
+
+  // this init will init each of the collection servers
+  bool init (comerror_t &err,ostream &logout);
+
+  // used to check for icons and retrieve them from the collection
+  // site if they are missing
+  void  cache_missing_icons(text_tmap& format_map,
+			    text_t& httpdomain, 
+			    text_t& httpprefix);
+
+  text_t get_site_name (comerror_t &err);
+
+  text_t get_protocol_name (comerror_t &err);
+  void get_collection_list (text_tarray &collist, comerror_t &err, 
+			    ostream &logout);
+  void has_collection (const text_t &collection, bool &hascollection, 
+		       comerror_t &err, ostream &logout);
+  void ping (const text_t &collection, bool &wassuccess, 
+	     comerror_t &err, ostream &logout);
+  void get_collectinfo (const text_t &collection, 
+			ColInfoResponse_t &collectinfo,
+			comerror_t &err, ostream &logout);
+  void get_filterinfo (const text_t &collection,
+		       InfoFiltersResponse_t &response,
+		       comerror_t &err, ostream &logout);
+  void get_filteroptions (const text_t &collection,
+			  const InfoFilterOptionsRequest_t &request,
+			  InfoFilterOptionsResponse_t &response, 
+			  comerror_t &err, ostream &logout);
+  void filter (const text_t &collection,
+	       FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout);
+
+  void get_document (const text_t &collection,
+		     const DocumentRequest_t &request,
+		     DocumentResponse_t &response,
+		     comerror_t &err, ostream &logout);
+
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/corbaproto.mpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/corbaproto.mpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/corbaproto.mpp	(revision 21083)
@@ -0,0 +1,749 @@
+/**********************************************************************
+ *
+ * corbaproto.cpp -- 
+ * Copyright (C) 2000 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ * $Id$
+ *
+ *********************************************************************/
+
+#include <iostream.h>
+#include <fstream.h>
+
+#include "fileutil.h"
+
+// protocol headers for CORBA
+#include "corbaiface.h"
+using namespace gsdlInterface;
+
+// greenstone library headers
+#include "corbaconv_text_t.h"
+
+// greenstone local headers
+#include "corbatext_t.h"
+
+#include "corbaproto.h"
+#include "colservrconfig.h"
+
+// default headers
+#include <assert.h>
+
+void corbatext_optionValueArrayToCorba(OptionValue_tarray array, corbaOptionValue_array &corba)
+{
+  unsigned int i = 0;
+  OptionValue_tarray::iterator here = array.begin();
+  OptionValue_tarray::iterator end = array.end();
+  
+  while (here != end)
+    {
+      corba.length(i+1);
+      
+      corbaconv_text_t::getCorbatext(here->name,corba[i].name);
+      corbaconv_text_t::getCorbatext(here->value,corba[i].value);
+
+      i ++;
+      here ++;
+    }
+  //  cout << "Options " << i << endl;
+}
+
+void corbaresponse_resultMetadataToCorba(MetadataInfo_t &meta, corbaMetadataInfo &corbaMeta)
+{
+  corbaconv_text_t::getCorbatext(meta.params,corbaMeta.params);
+  corbatext_arrayToCorbaArray(meta.values, &corbaMeta.values);
+  corbaMeta.isRef    = meta.isRef;
+}
+
+void corbaresponse_resultMetadataToC(const corbaMetadataInfo &corbaMeta, MetadataInfo_t &meta)
+{
+  corbaconv_text_t::setCorbatext(meta.params,corbaMeta.params);
+  corbatext_corbaArrayToArray(corbaMeta.values, &meta.values);
+  meta.isRef    = corbaMeta.isRef;
+}
+
+int corbaresponse_resultMetaParentToCorba(MetadataInfo_t *parent, corbaMetadataInfo_array &corbaparent)
+{
+  int reply = -1, pid = -1;
+
+  // extend for new parent
+  reply = corbaparent.length();
+  corbaparent.length(reply+1);
+
+  // copy content into new array element
+  corbaresponse_resultMetadataToCorba(*parent, corbaparent[reply]);
+
+  // deal with our own parent
+  if (parent->parent != NULL)
+    {
+      // get offset of new parent and extend parent vector
+
+      pid  = corbaresponse_resultMetaParentToCorba(parent->parent, corbaparent);
+    }
+  corbaparent[reply].parentid = pid;
+
+  // return the parent id from here
+  return reply;
+}
+
+MetadataInfo_t *corbaresponse_resultMetaParentToC(corbaMetadataInfo_array &corbaparent, int pid)
+{
+  MetadataInfo_t *reply;
+
+  reply = new MetadataInfo_t;
+
+  corbaresponse_resultMetadataToC(corbaparent[pid], *reply);
+
+  // deal with our own parent
+  if (corbaparent[pid].parentid >= 0)
+    {
+      // get offset of new parent and extend parent vector
+
+      reply->parent = corbaresponse_resultMetaParentToC(corbaparent, corbaparent[pid].parentid);
+    }
+  else
+    {
+      reply->parent = NULL;
+    }
+
+  // return the parent id from here
+  return reply;
+}
+
+void corbaresponse_resultDocInfoToCorba(ResultDocInfo_tarray docinfo, corbaResultDocInfo_array &corbainfo)
+{
+  ResultDocInfo_tarray::iterator here = docinfo.begin();
+  ResultDocInfo_tarray::iterator end  = docinfo.end();
+  unsigned int i;
+
+  i = 0;
+  while (here != end)
+    {
+      corbainfo.length(i+1);
+
+      // copy the easy bits
+      corbaconv_text_t::getCorbatext(here->OID,corbainfo[i].OID);
+
+      corbainfo[i].resultNum     = here->result_num;
+      corbainfo[i].ranking       = here->ranking;
+      corbainfo[i].termsMatched  = here->num_terms_matched;
+      corbainfo[i].phraseMatched = here->num_phrase_match;
+
+      // copy the docFreq array
+      vector<int>::iterator fhere = here->docFreq.begin();
+      vector<int>::iterator fend  = here->docFreq.end();
+      unsigned int          fi = 0;
+
+      while (fhere != fend)
+	{
+	  corbainfo[i].docFreq.length(fi+1);
+
+	  corbainfo[i].docFreq[fi] = *fhere;
+
+	  fhere ++;
+	  fi ++;
+	}
+
+      // copy the MetadataInfo map
+      MetadataInfo_tmap::iterator mhere = here->metadata.begin();
+      MetadataInfo_tmap::iterator mend  = here->metadata.end();
+      unsigned int mi = 0;
+
+      while (mhere != mend)
+	{
+	  corbainfo[i].metadata.names.length(mi+1);
+	  corbainfo[i].metadata.values.length(mi+1);
+	  
+	  // copy name
+	  corbaconv_text_t::getCorbatext((*mhere).first,corbainfo[i].metadata.names[mi]);
+
+	  // copy metadata
+	  corbaresponse_resultMetadataToCorba((*mhere).second, corbainfo[i].metadata.values[mi]);
+	  if (mhere->second.parent != NULL)
+	    {
+	      int pid;
+
+	      pid = corbaresponse_resultMetaParentToCorba(mhere->second.parent, 
+							      corbainfo[i].metaparents);
+	      corbainfo[i].metadata.values[mi].parentid = pid;
+	    }
+	  else
+	    {
+	      corbainfo[i].metadata.values[mi].parentid = -1;
+	    }
+
+	  cout << "Parent " << mi << " " << (int) &mhere->second << " " << (int) mhere->second.parent << endl;
+
+	  mhere ++;
+	  mi ++;
+	}
+
+      // Copy the classifier variables
+      corbaconv_text_t::getCorbatext(here->classifier_metadata_type, corbainfo[i].classifierMetadataType);
+      corbainfo[i].classifierMetadataOffset = here->classifier_metadata_offset;
+
+      // Get next Docinfo item
+      i++;
+      here ++;
+    }
+}
+
+void corbaresponse_resultDocInfoToC(corbaResultDocInfo_array corbainfo, ResultDocInfo_tarray &docinfo)
+{
+  unsigned int i;
+  ResultDocInfo_t doc;
+
+  for (i = 0; i < corbainfo.length(); i++)
+    {
+      corbaconv_text_t::setCorbatext(doc.OID,corbainfo[i].OID);
+      doc.result_num        = corbainfo[i].resultNum;
+      doc.ranking           = corbainfo[i].ranking;
+      doc.num_terms_matched = corbainfo[i].termsMatched;
+      doc.num_phrase_match  = corbainfo[i].phraseMatched;
+
+      // copy the doc freq array
+      unsigned int fi;
+      for (fi = 0; fi < corbainfo[i].docFreq.length(); fi ++)
+	{
+	  doc.docFreq.push_back(corbainfo[i].docFreq[fi]);
+	}
+
+      // copy the MetadataInfomap
+      unsigned int   mi;
+      text_t         mname;
+      MetadataInfo_t mdata;
+      
+      doc.metadata.clear();
+      for (mi = 0; mi < corbainfo[i].metadata.names.length(); mi ++)
+	{
+	  // get name
+	  corbaconv_text_t::setCorbatext(mname,corbainfo[i].metadata.names[mi]);
+
+	  // get metadata
+	  corbaresponse_resultMetadataToC(corbainfo[i].metadata.values[mi], mdata);
+
+	  if (corbainfo[i].metadata.values[mi].parentid >= 0)
+	    {
+	      mdata.parent = 
+		corbaresponse_resultMetaParentToC(corbainfo[i].metaparents, 
+						  corbainfo[i].metadata.values[mi].parentid);	      
+	    }
+	 
+	  doc.metadata.insert(make_pair(mname, mdata));
+	}
+
+      // GRB: sort out parent data
+      for (mi = 0; mi < corbainfo[i].metadata.names.length(); mi ++)
+	{
+	  if (corbainfo[i].metadata.values[mi].parentid != 0)
+	    { 
+	      int pi;
+
+	      for (pi = 0; pi < corbainfo[i].metadata.names.length(); pi ++)
+		{
+		  if (pi != mi &&
+		      corbainfo[i].metadata.values[mi].parentid ==
+		      corbainfo[i].metadata.values[pi].id)
+		    {
+		      doc.metadata[mi].parent = &doc.metadata[pi];
+		    }
+		}
+	    }
+	}
+      //      doc.metadata
+
+      // convert metadata classifer information
+      corbaconv_text_t::setCorbatext(doc.classifier_metadata_type,corbainfo[i].classifierMetadataType);
+      doc.classifier_metadata_offset = corbainfo[i].classifierMetadataOffset;
+
+      docinfo.push_back(doc); 
+    }
+}
+
+
+// Added 31/1/2001, Michael Dewsnip
+void corbaresponse_resultTermInfoToC(corbaTermInfo_array corbainfo, TermInfo_tarray &terminfo)
+{
+  TermInfo_t ti;
+
+  for (unsigned int i = 0; i < corbainfo.length(); i++) {
+    corbaconv_text_t::setCorbatext(ti.term, corbainfo[i].term);
+    ti.freq = corbainfo[i].frequency;
+
+    for (unsigned int j = 0; j < corbainfo[i].matchTerms.length(); j++) {
+      text_t mt;
+      corbaconv_text_t::setCorbatext(mt, corbainfo[i].matchTerms[j]);
+
+      ti.matchTerms.push_back(mt);
+    }
+
+    terminfo.push_back(ti);
+  }
+}
+
+
+corbaproto::corbaproto(char* _site_name)
+{ char *dummyv[1] = {""};
+  int   dummyc = 0;
+  // CORBA variables
+  /* static CORBA::ORB_var orb = CORBA::ORB_init( dummyc , dummyv, "mico-local-orb" );
+     static CORBA::BOA_var boa = orb->BOA_init( dummyc , dummyv, "mico-local-boa" ); */
+
+  CORBA::ORB_var orb = CORBA::ORB_init( dummyc , dummyv, "mico-local-orb" );
+  CORBA::BOA_var boa = orb->BOA_init( dummyc , dummyv, "mico-local-boa" );
+
+  char objid_filename[256];
+  sprintf(objid_filename,"/tmp/%s.objid",_site_name);
+
+  // Get ref from "naming service"
+  ifstream in (objid_filename);
+  char ref[1000];
+  in >> ref;
+  in.close ();
+
+  // startup corba
+  // static CORBA::Object_var obj = orb->string_to_object (ref);
+  CORBA::Object_var obj = orb->string_to_object (ref);
+
+  client = corbaiface::_narrow( obj ); 
+  // client = NULL; // ****
+
+  gsdlhome.clear();
+  site_name = _site_name;
+}
+
+corbaiface_var corbaproto::getCorbaClient()
+{
+  // This function was written to help corba when ORB and BOA were
+  // not working in "persistent" mode.
+  // Now that persistent mode is working it is not longer needed/used.
+
+  char *dummyv[1] = {""};
+  int   dummyc = 0;
+  // CORBA variables
+//  static CORBA::ORB_var orb = CORBA::ORB_init( dummyc , dummyv, "mico-local-orb" );
+//  static CORBA::BOA_var boa = orb->BOA_init( dummyc , dummyv, "mico-local-boa" );
+
+  // DB // Try this out!! // ****
+  CORBA::ORB_var orb = CORBA::ORB_init( dummyc , dummyv, "mico-local-orb" );
+  CORBA::BOA_var boa = orb->BOA_init( dummyc , dummyv, "mico-local-boa" );
+
+  /*  char* site_name_chars = site_name.getcstr();
+  char objid_filename[256];
+  sprintf(objid_filename,"/tmp/%s.objid",site_name_chars);
+  // delete site_name_chars; */
+
+  text_t objid_filename = "/tmp/" + site_name + ".objid";
+
+  // Get ref from "naming service"
+  ifstream in (objid_filename.getcstr());
+  char ref[1000];
+  in >> ref;
+  in.close ();
+
+  // startup corba
+  // DB // Try this out!! // ****
+  // static CORBA::Object_var obj = orb->string_to_object (ref);
+  CORBA::Object_var obj = orb->string_to_object (ref);
+
+  return corbaiface::_narrow( obj );
+}
+
+
+// this configure will configure each of the collection servers
+void corbaproto::configure (const text_t &key, const text_tarray &cfgline,
+			    comerror_t &err) {
+  // the naming of the collection should not be done here,
+  // it should be done just after the collection server has been 
+  // created
+
+  // cout << "Corbaproto::Configure" << endl;
+  corbatext_t      corbaKey;
+  corbatext_tarray corbaCfgline;
+  gsdlInterface::corbaComError error = corbaNoError;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(key,corbaKey);
+  corbatext_arrayToCorbaArray(cfgline, &corbaCfgline);
+
+  // execute the corba transaction
+  lclient->configure(corbaKey, corbaCfgline, error);    
+
+  if (key=="gsdlhome")
+    {
+      // store gsdlhome in corba prototype so it can be used later to
+      // check if icons specified in format statements exist on the
+      // recptionist's side
+      gsdlhome = cfgline[0];
+    }
+  err = (comerror_t) error;
+}
+
+// this init will configure and init each of the collection servers
+bool corbaproto::init (comerror_t &err, ostream &logout) {
+//  cout << "Corbaproto::Init" << endl;
+  gsdlInterface::corbaComError error = corbaNoError;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // execute the corba transaction
+  return lclient->initialise(error);
+}
+
+void  corbaproto::cache_missing_icons(text_tmap& format_map,
+				      text_t& httpdomain, 
+				      text_t& httpprefix)
+{
+  // consider making this a member function in the object?
+
+  text_tmap::iterator format_here = format_map.begin();
+  text_tmap::iterator format_end = format_map.end();
+  while (format_here!=format_end)
+    {
+      text_t format_line = format_here->second;
+
+      // cout << "*** format line = " << format_line << endl; // ****
+
+      text_t::iterator fl_begin = format_line.begin();
+      text_t::iterator fl_end = format_line.end();
+
+      text_t::iterator httpimg_find = findword(fl_begin,fl_end,"_httpimg_");
+      text_t::iterator http_find = httpimg_find;
+
+      while (httpimg_find!=fl_end)
+	{
+	  http_find = httpimg_find+5;
+	  httpimg_find += 9;
+
+	  // look for white space " or >
+	  text_t::iterator filename_end = httpimg_find;
+	  while (filename_end != fl_end)
+	    {
+	      if (*filename_end == ' ') break;
+	      if (*filename_end == '\t') break;
+	      if (*filename_end == '\"') break;
+	      if (*filename_end == '>') break;
+	      filename_end++;
+	    }
+
+	  text_t img_filename = substr(httpimg_find,filename_end);
+
+	  text_t site_img_filename = filename_cat(gsdlhome,"images",img_filename);
+
+	  // look to see if img filename exists in images directory
+	  if (!file_exists(site_img_filename))
+	    {
+	      text_t cache_img_dir
+		= filename_cat(gsdlhome,"images",".cache");
+
+	      text_t remote_img_url = "http://" + httpdomain + httpprefix
+		+ "/images" + img_filename;
+
+	      text_t wget_cmd = "wget -q -N --directory-prefix="+cache_img_dir
+		+ " " + remote_img_url;
+
+	      char* wget_cmd_chars = wget_cmd.getcstr();
+
+	      system(wget_cmd_chars);
+	      delete wget_cmd_chars;
+
+	      format_map[format_here->first] 
+		= substr(fl_begin,http_find) + "cache" + substr(http_find,fl_end);
+
+	    }
+
+	  httpimg_find = findword(httpimg_find,fl_end,"_httpimg_");
+	}
+      format_here++;
+    }
+}
+
+text_t corbaproto::get_site_name (comerror_t &err) {
+  return site_name;
+}
+
+text_t corbaproto::get_protocol_name (comerror_t &err) {
+  return "corbaproto";
+}
+
+
+void corbaproto::get_collection_list (text_tarray &collist, comerror_t &err, 
+				     ostream &/*logout*/) {
+
+  // cout << "Corbaproto::Collection list" << endl;
+
+  corbatext_tarray corba_collist;
+  text_tarray      tcollist;
+  gsdlInterface::corbaComError error = corbaNoError;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // execute the corba transaction
+  lclient->collectionList(corba_collist,error);
+
+  // convert the response back to normal form
+  corbatext_corbaArrayToArray(corba_collist, &tcollist);
+  collist = tcollist;
+
+  err = (comerror_t) error;
+}
+
+void corbaproto::has_collection (const text_t &collection, bool &hascollection, 
+				comerror_t &err, ostream &/*logout*/) {
+  // cout << "Corbaproto::Has collection" << endl;
+
+  corbatext_t     corbaCollection;
+  corbaComError corbaError = corbaNoError;
+  CORBA::Boolean corbaHas;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollection);
+  
+  // execute the corba transaction
+  lclient->hasCollection(corbaCollection, corbaHas, corbaError);
+
+  // convert the response back to normal form
+  hascollection = (corbaHas != 0);
+  err = noError;
+}
+
+void corbaproto::ping (const text_t &collection, bool &wassuccess, 
+		      comerror_t &err, ostream &/*logout*/) {
+  // cout << "Corbaproto::Ping" << endl;
+
+  corbatext_t corbaCollect;
+  corbaComError corbaError = corbaNoError;
+  CORBA::Boolean success;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollect);
+
+  // execute the corba transaction
+  lclient->ping(corbaCollect, success, corbaError);
+  
+  // convert the response back to normal form
+  wassuccess = (success != 0);
+  err = (comerror_t) corbaError;  
+  cout << "Corbaproto::Ping" << err << endl;
+}
+
+
+void corbaproto::get_collectinfo (const text_t &collection, 
+				 ColInfoResponse_t &collectinfo,
+				 comerror_t &err, ostream &logout) {
+  //  cout << "Corbaproto::Collectinfo" << endl;
+
+  corbatext_t          corbaCollection;
+  corbaComError        corbaError = corbaNoError;
+  corbaColInfoResponse corbaCollectInfo;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollection);
+
+  // execute the corba transaction
+  lclient->getCollectInfo(corbaCollection, corbaCollectInfo, corbaError);
+
+  // convert the response back to normal form
+  collectinfo.isPublic = corbaCollectInfo.isPublic;
+  collectinfo.isBeta   = corbaCollectInfo.isBeta;
+  collectinfo.buildDate = corbaCollectInfo.buildDate;
+  corbatext_corbaArrayToArray(corbaCollectInfo.ccsCols, &collectinfo.ccsCols);
+  corbatext_corbaArrayToArray(corbaCollectInfo.languages, &collectinfo.languages);
+  collectinfo.numDocs   = corbaCollectInfo.numDocs;
+  collectinfo.numWords  = corbaCollectInfo.numWords;
+  collectinfo.numBytes  = corbaCollectInfo.numBytes;
+  corbatext_corbaMapToMap(corbaCollectInfo.collectionMeta, collectinfo.collectionmeta);
+  corbatext_corbaMapToMap(corbaCollectInfo.format, collectinfo.format);
+  corbatext_corbaMapToMap(corbaCollectInfo.building, collectinfo.building);
+  corbaconv_text_t::setCorbatext(collectinfo.httpdomain,corbaCollectInfo.httpdomain);
+  corbaconv_text_t::setCorbatext(collectinfo.httpprefix,corbaCollectInfo.httpprefix);
+  corbaconv_text_t::setCorbatext(collectinfo.receptionist,corbaCollectInfo.receptionist);
+
+  cache_missing_icons(collectinfo.format,collectinfo.httpdomain,
+		      collectinfo.httpprefix);
+
+  err = (comerror_t) corbaError;  
+}
+
+
+void corbaproto::get_filterinfo (const text_t &collection,
+				InfoFiltersResponse_t &response,
+				comerror_t &err, ostream &logout) {
+  //  cout << "Corbaproto::Filterinfo" << endl;
+
+  corbatext_t corbaCollection;
+  corbatext_tset corbaResponse;
+  corbaComError corbaError = corbaNoError;
+  
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollection);
+
+  // execute the corba transaction
+  lclient->getFilterInfo(corbaCollection, corbaResponse, corbaError);
+
+  // convert the response back to normal form
+  corbatext_corbaArrayToSet(corbaResponse, &response.filterNames);
+
+  err = (comerror_t) corbaError;
+}
+
+void corbaproto::get_filteroptions (const text_t &collection,
+				   const InfoFilterOptionsRequest_t &request,
+				   InfoFilterOptionsResponse_t &response, 
+				   comerror_t &err, ostream &logout) {
+  //  cout << "Corbaproto::Filteroptions" << endl;
+
+  corbatext_t corbaCollection;
+  corbatext_t filterName;
+  corbaFilterOptionsResponse corbaResponse;
+  corbaComError corbaError = corbaNoError;
+  unsigned int i;
+  corbaconv_text_t *cc_name;
+  FilterOption_t *option;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollection);
+  corbaconv_text_t::getCorbatext(request.filterName,filterName);
+
+  // execute the corba transaction
+  lclient->getFilterOptions(corbaCollection, filterName, corbaResponse, corbaError);
+
+  // convert the response back to normal form
+  for (i = 0; i < corbaResponse.names.length(); i ++)
+    {
+      cc_name = new corbaconv_text_t(corbaResponse.names[i]);
+
+      option = new FilterOption_t;
+      corbaconv_text_t::setCorbatext(option->name,corbaResponse.options[i].name);
+      option->type = (FilterOption_t::type_t) corbaResponse.options[i].type;
+      option->repeatable = (FilterOption_t::repeatable_t) corbaResponse.options[i].repeatable;
+      corbaconv_text_t::setCorbatext(option->defaultValue,corbaResponse.options[i].defaultValue);
+      corbatext_corbaArrayToArray(corbaResponse.options[i].validValues, &option->validValues);
+
+      response.filterOptions.insert(make_pair(*cc_name, *option)); // typecast to text_t
+    }
+
+  err =  (comerror_t) corbaError;
+}
+
+
+void corbaproto::filter (const text_t &collection,
+			  FilterRequest_t &request,
+			  FilterResponse_t &response,
+			  comerror_t &err, ostream &logout) {
+  //  cout << "Corbaproto::Filter" << endl;
+
+  corbaFilterRequest corbaRequest;
+  corbaFilterResponse corbaResponse;
+  corbatext_t     corbaCollection;
+  corbaComError corbaError = corbaNoError;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollection);
+  corbaconv_text_t::getCorbatext(request.filterName,corbaRequest.filter);
+  corbatext_optionValueArrayToCorba(request.filterOptions, corbaRequest.filterOptions);
+  corbatext_arrayToCorbaArray(request.docSet, &corbaRequest.docSet);
+  corbaRequest.filterResultOptions = request.filterResultOptions;
+  corbaconv_text_t::getCorbatext(request.requestParams,corbaRequest.requestParams);
+  corbaconv_text_t::getCorbatext(request.refParams,corbaRequest.refParams);
+  corbaRequest.getParents = request.getParents;
+  corbatext_setToCorbaArray(request.fields, &corbaRequest.fields);
+
+  corbaResponse.numDocs = response.numDocs;
+  corbaresponse_resultDocInfoToCorba(response.docInfo, corbaResponse.docInfo);
+
+  // execute the corba transaction
+  lclient->filter (corbaCollection, corbaRequest, corbaResponse, corbaError);
+
+  // convert the response back to normal form
+  response.numDocs = corbaResponse.numDocs;
+  response.isApprox = (enum isapprox) corbaResponse.isApprox;
+  corbaresponse_resultDocInfoToC(corbaResponse.docInfo, response.docInfo);
+
+  // Added 31/1/2001, Michael Dewsnip
+  corbaresponse_resultTermInfoToC(corbaResponse.termInfo, response.termInfo);
+
+  err = (comerror_t) corbaError;
+  //  cout << "Corbaproto::Filter" << endl;
+}
+
+
+void corbaproto::get_document (const text_t &collection,
+			       const DocumentRequest_t &request,
+			       DocumentResponse_t &response,
+			       comerror_t &err, ostream &logout) {
+  //  cout << "Corbaproto::Get Document" << endl;
+
+  corbatext_t      corbaCollect;
+  corbaDocRequest  corbaRequest;
+  corbaDocResponse corbaResponse;
+  corbaComError    corbaError = corbaNoError;
+
+  // get the corba client reference
+  // corbaiface_var lclient = this->getCorbaClient(); // ****
+  corbaiface_var lclient = client;
+
+  // convert all the requisite structures into their CORBA form
+  corbaconv_text_t::getCorbatext(collection,corbaCollect);
+  corbaconv_text_t::getCorbatext(request.OID,corbaRequest.OID);
+  corbaconv_text_t::getCorbatext(request.docType,corbaRequest.docType);
+  corbaconv_text_t::getCorbatext(request.docFormat,corbaRequest.docFormat);
+
+  // execute the corba transaction
+  lclient->getDocument(corbaCollect, corbaRequest, corbaResponse, corbaError);
+
+  // convert the response back to normal form
+  corbaconv_text_t::setCorbatext(response.doc,corbaResponse.doc);
+
+  err = (comerror_t) corbaError;
+}
+
Index: /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,143 @@
+/**********************************************************************
+ *
+ * datelistbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "datelistbrowserclass.h"
+#include <assert.h>
+
+
+datelistbrowserclass::datelistbrowserclass () {
+}
+
+datelistbrowserclass::~datelistbrowserclass () {
+}
+
+text_t datelistbrowserclass::get_browser_name () {
+  return "DateList";
+}
+
+void datelistbrowserclass::load_metadata_defaults (text_tset &metadata) {
+  metadata.insert ("Date");
+  metadata.insert ("doctype");
+}
+
+text_t datelistbrowserclass::get_default_formatstring () {
+  return "<td>[link][icon][/link]</td><td>[highlight]{Or}{[Title],Untitled}[/highlight]</td><td>[Date]</td>";
+}
+
+int datelistbrowserclass::output_section_group (ResultDocInfo_t &/*section*/, cgiargsclass &/*args*/,
+						const text_t &/*collection*/, int /*colnumber*/, 
+						format_t * /*formatlistptr*/, bool /*use_table*/, 
+						text_tset &/*metadata*/, bool &/*getParents*/,
+						recptproto * /*collectproto*/, displayclass &/*disp*/, 
+						outconvertclass &/*outconvert*/, ostream &/*textout*/, 
+						ostream &/*logout*/) {
+  return 0;
+}
+
+int datelistbrowserclass::output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+						const text_t &collection, int colnumber, format_t *formatlistptr, 
+						bool use_table, text_tset &/*metadata*/, bool &/*getParents*/,
+						recptproto * collectproto, displayclass &disp, 
+						outconvertclass &outconvert, ostream &textout, ostream &logout) {
+
+  text_t lastyear = "0000";
+  text_t lastmonth = "00";
+  text_t tabbing, endtabbing;
+
+  if (use_table || colnumber > 0) {
+    textout << "<table><tr><td>";
+    // get tab size
+    text_t tab; int itab;
+    disp.expandstring ("Global", "_tabwidth_", tab);
+    itab = tab.getint();
+    if (colnumber > 0) 
+      textout << "<img src=\"_httpimg_/space.gif\" width=" << (itab*colnumber) << ">";
+    textout<< "</td><td>";
+  }
+
+  textout << "<table>\n";
+
+  ResultDocInfo_tarray::iterator thissection = sections.docInfo.begin();
+  ResultDocInfo_tarray::iterator endsection = sections.docInfo.end();
+
+  while (thissection != endsection) {
+
+    text_t &doctype = (*thissection).metadata["doctype"].values[0];
+    text_t &date = (*thissection).metadata["Date"].values[0]; 
+
+    // bail on this document if it has no date
+    if (date.empty()) continue;
+
+    text_t::const_iterator datebegin = date.begin();
+    int datesize = date.size();
+    
+    if (datesize < 4) continue;
+    text_t thisyear = substr (datebegin, datebegin+4);
+    text_t thismonth = "00";
+    if (datesize >= 6)
+      thismonth = substr (datebegin+4, datebegin+6); 
+
+    text_t link = "<a href=\"_httpdocument_&cl=";
+    text_t icon = "_document:iconclosedbook_";
+      
+    if (doctype == "classify") {
+      icon = "_document:iconclosedbookshelf_";
+      link += (*thissection).OID + "\">";
+    } else link += args["cl"] + "&d=" + (*thissection).OID + "\">";
+
+    textout << "<tr valign=top>";
+
+    if (thisyear != lastyear) {
+      textout << outconvert << "<td><b>" << thisyear << "</b></td>";
+      lastyear = thisyear;
+    } else
+      textout << "<td></td>";
+    
+    if (thismonth != lastmonth) {
+      textout << outconvert << disp << ("<td><b>_textmonth" + thismonth + "_</b></td>");
+      lastmonth = thismonth;
+    } else
+      textout << "<td></td>";
+    
+    if (!use_table) textout << "<td>\n";
+    
+    textout << outconvert << disp 
+            << get_formatted_string (collection, collectproto,
+				     *thissection, disp, formatlistptr, 
+				     link, icon, false,
+				     logout) << "\n";
+    
+    if (!use_table) textout << "</td>";
+    
+    textout << "</tr>\n";
+    
+    thissection ++;
+  }
+
+  textout << "</table>\n";
+
+  if (use_table  || colnumber > 0) textout << "</td></tr></table>\n";
+  return 1;
+}
Index: /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/datelistbrowserclass.h	(revision 21083)
@@ -0,0 +1,58 @@
+/**********************************************************************
+ *
+ * datelistbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef DATELISTBROWSERCLASS_H
+#define DATELISTBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class datelistbrowserclass : public browserclass {
+protected:
+
+public:
+  datelistbrowserclass ();
+  virtual ~datelistbrowserclass ();
+
+  text_t get_browser_name ();
+
+  virtual void load_metadata_defaults (text_tset &metadata);
+
+  virtual text_t get_default_formatstring ();
+
+  virtual int output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+  
+  virtual int output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/documentaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/documentaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/documentaction.cpp	(revision 21083)
@@ -0,0 +1,1017 @@
+/**********************************************************************
+ *
+ * documentaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <string.h>
+#include "documentaction.h"
+#include "browsetools.h"
+#include "OIDtools.h"
+#include "querytools.h"
+#include "unitool.h"
+#include "gsdltools.h"
+
+documentaction::documentaction () {
+  recpt = NULL;
+
+
+  // this action uses cgi variables "a", "d", "cl",
+  // "x", "gc", "gt", "gp", and "hl"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "p";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "d";
+  arg_ainfo.longname = "document OID";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // whether or not a document should be retrieved from the 
+  // library or the Web.
+  arg_ainfo.shortname = "il";
+  arg_ainfo.longname = "internal link preference";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "l";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "cl";
+  arg_ainfo.longname = "classification OID";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // in this action "gc" controls the expand/contract
+  // contents function
+  arg_ainfo.shortname = "gc";
+  arg_ainfo.longname = "expand contents";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // in this action "gt" controls the expand/contract
+  // text function 0 = not expanded, 1 = expand unless 
+  // there are more than 10 sections containing text,
+  // 2 = expand all
+  arg_ainfo.shortname = "gt";
+  arg_ainfo.longname = "expand text";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // in this action "gp" is the "go to page" control
+  // used by the Book type of toc
+  arg_ainfo.shortname = "gp";
+  arg_ainfo.longname = "go to page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // in this action "hl" is the "highlighting on/
+  // highlighting off control
+  arg_ainfo.shortname = "hl";
+  arg_ainfo.longname = "highlighting on/off";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "x" is 0 normally or 1 if page
+  // has been "detached"
+  arg_ainfo.shortname = "x";
+  arg_ainfo.longname = "detached page";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // f arg is set to 1 if document is to 
+  // be displayed in a frame
+  arg_ainfo.shortname = "f";
+  arg_ainfo.longname = "frame";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // fc arg is "1" if search bar is to be included (i.e. if "fc" == 1
+  // the httpdocument macro will include "&f=1"
+  arg_ainfo.shortname = "fc";
+  arg_ainfo.longname = "include search bar";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  //rd is whether a document will be displayed
+  //with a relevant document list
+  arg_ainfo.shortname = "rd";
+  arg_ainfo.longname = "include relevant documents";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+}
+
+documentaction::~documentaction () {
+}
+
+bool documentaction::check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+				    ostream &logout) {
+
+  // check gc argument
+  int arg_gc = args.getintarg("gc");
+  if (arg_gc < 0 || arg_gc > 2) {
+    logout << "Warning: \"gc\" argument out of range (" << arg_gc << ")\n";
+    cgiarginfo *gcinfo = argsinfo.getarginfo ("gc");
+    if (gcinfo != NULL) args["gc"] = gcinfo->argdefault;
+  }
+
+  // check gt argument (may be either 0, 1 or 2)
+  int arg_gt = args.getintarg("gt");
+  if (arg_gt != 0 && arg_gt != 1 && arg_gt != 2) {
+    logout << "Warning: \"gt\" argument out of range (" << arg_gt << ")\n";
+    cgiarginfo *gtinfo = argsinfo.getarginfo ("gt");
+    if (gtinfo != NULL) args["gt"] = gtinfo->argdefault;
+  }
+
+  // check hl argument
+  int arg_hl = args.getintarg("hl");
+  if (arg_hl != 0 && arg_hl != 1) {
+    logout << "Warning: \"hl\" argument out of range (" << arg_hl << ")\n";
+    cgiarginfo *hlinfo = argsinfo.getarginfo ("hl");
+    if (hlinfo != NULL) args["hl"] = hlinfo->argdefault;
+  }
+
+  // check x argument
+  int arg_x = args.getintarg("x");
+  if (arg_x != 0 && arg_x != 1) {
+    logout << "Warning: \"x\" argument out of range (" << arg_x << ")\n";
+    cgiarginfo *xinfo = argsinfo.getarginfo ("x");
+    if (xinfo != NULL) args["x"] = xinfo->argdefault;
+  }
+
+  //checks whether rd arg is valid
+  int arg_rd = args.getintarg("rd");
+  if (arg_rd != 0 && arg_rd != 1) {
+    logout << "Warning: \"rd\" argument out of range (" << arg_rd << ")\n";
+    cgiarginfo *rdinfo = argsinfo.getarginfo ("rd");
+    if (rdinfo != NULL) args["rd"] = rdinfo->argdefault;
+  }
+
+
+  return true;
+}
+
+void documentaction::get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+				       response_t &response,text_t &response_data, 
+				       ostream &logout) {
+
+  if ((args["il"] == "w") && (!args["d"].empty())) {
+
+    recptproto* collectproto = protos->getrecptproto (args["c"], logout);
+    if (collectproto != NULL) {
+      
+      text_tset metadata;
+      FilterResponse_t filt_response;
+      text_t top;
+
+      metadata.insert ("URL");
+      
+      // get metadata for parent document
+      get_top (args["d"], top);
+      if (get_info (top, args["c"], metadata, false, collectproto, filt_response, logout)) {
+	text_t url = filt_response.docInfo[0].metadata["URL"].values[0];
+	
+	response = location;
+	response_data = url;
+	return;
+      } else {
+	// error, no URL
+	logout << "Error: documentaction::get_cgihead_info failed on get_info" << endl;
+      }
+    }
+  }
+  response = content;
+  response_data = "text/html";
+}
+
+// set_widthtspace calculates how wide the spaces in the nav bar should
+// be and sets the appropriate macro
+void documentaction::set_spacemacro (displayclass &disp, FilterResponse_t &response) {
+
+  text_t width;
+  int twidth, swidth, iwidth = 0;
+
+  int numc = response.docInfo.size();
+  ResultDocInfo_tarray::iterator dochere = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator docend = response.docInfo.end();
+	
+  disp.expandstring ("Global", "_pagewidth_", width);
+  twidth = width.getint();
+	  
+  disp.expandstring ("query", "_searchwidth_", width);
+  iwidth += width.getint();
+  
+  
+  
+  while (dochere != docend) {
+    const text_t &title = (*dochere).metadata["Title"].values[0];
+
+    disp.expandstring ("document", "_" + title + "width_", width);
+    if (width == ("_" + title + "width_")) 
+      disp.expandstring ("document", "_defaultwidth_", width);
+    iwidth += width.getint();
+    dochere ++;
+  }
+  if ((twidth - iwidth) < numc) swidth = 2;
+  else {
+    swidth = twidth - iwidth;
+    if (numc > 0) swidth = swidth / numc;
+  }
+  disp.setmacro ("widthtspace", "Global", swidth);
+}
+
+// set_navbarmacros sets _navigationbar_ and _httpbrowseXXX_ macros
+// reponse contains 1 metadata field (Title)
+void documentaction::set_navbarmacros (displayclass &disp, FilterResponse_t &response, 
+				       cgiargsclass &args) {
+
+  text_t topparent;
+  text_t &arg_d = args["d"];
+  text_t navigationbar = "<!-- Navigation Bar -->\n";
+
+  get_top (args["cl"], topparent);
+  int numc = response.docInfo.size();
+  ResultDocInfo_tarray::iterator dochere = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator docend = response.docInfo.end();
+
+  navigationbar += "<nobr>\n";
+  if (args["a"] == "q") {
+    navigationbar += "_icontabsearchgreen_";
+  } else {
+    navigationbar += "_imagesearch_";
+  }
+  
+  
+  if (numc == 0) navigationbar += "_imagespacer_";
+	
+  while (dochere != docend) {
+    text_t title = (*dochere).metadata["Title"].values[0];
+
+    bool unknown = false;
+
+    // test the _XXXwidth_ macro to see if image macros are
+    // defined for this type of classification - if not we'll
+    // just display the text
+    text_t tmpwidth;
+    disp.expandstring ("document", "_" + title + "width_", tmpwidth);
+    if (tmpwidth == ("_" + title + "width_")) unknown = true;
+
+    // if we're inside a document all the classification buttons should be enabled
+    if (arg_d.empty() && ((*dochere).OID == topparent)) {
+      if (unknown) navigationbar += "_imagespacer_&nbsp;" + title + "&nbsp;";
+      else navigationbar += "_imagespacer__icontab" + title + "green_";
+    } else {
+
+      // set the _httpbrowseXXX_ macro for this classification
+      if (unknown) navigationbar += "_imagespacer_&nbsp;<a href=\"_httpdocument_&cl=" + 
+		     (*dochere).OID + "\">" + title + "</a>&nbsp;";
+      else {
+        navigationbar += "_imagespacer__image" + title + "_";
+        disp.setmacro ("httpbrowse" + title, "Global", "_httpdocument_&cl=" + (*dochere).OID);
+      }
+    }
+    dochere ++;
+  }
+  navigationbar += "\n</nobr>\n";
+  navigationbar += "<!-- End of Navigation Bar -->\n";
+  disp.setmacro ("navigationbar", "Global", navigationbar);
+}
+
+// define all the macros which might be used by other actions
+// to produce pages. 
+void documentaction::define_external_macros (displayclass &disp, cgiargsclass &args, 
+					     recptprotolistclass *protos, ostream &logout) {
+  
+  // define_external_macros sets the following macros:
+
+  // _navigationbar_     this is the navigation bar containing the search button
+  //                     and any classification buttons - it goes at the top of 
+  //                     most pages. for now we're assuming that there'll always 
+  //                     be a search button - we should probably check that there
+  //                     is a query action before making this assumption
+
+  // _httpbrowseXXX_     the http macros for each classification (i.e. if there
+  //                     are Title and Creator classifications _httpbrowseTitle_
+  //                     and _httpbrowseCreator_ will be set
+
+  // _widthtspace_       the width of the spacers between buttons in navigation
+  //                     bar
+  
+  // _httpdocument_      has '&f=1' added if displaying document inside a frame
+
+  // _gsdltop_           macro to replace _top targets with
+
+  // _httppagehome_      overridden home url if html collections have own homepage
+
+  // must have a valid collection server to continue
+  text_t &collection = args["c"];
+  if (collection.empty()) return;
+  recptproto *collectproto = protos->getrecptproto (collection, logout);
+  if (collectproto == NULL) return;
+  
+  if (recpt == NULL) {
+    logout << "ERROR (documentaction::define_external_macros): This action does not contain\n"
+	   << "      information about any receptionists. The method set_receptionist was\n"
+	   << "      probably not called from the module which instantiated this action.\n";
+    return;
+  }
+
+  outconvertclass text_t2ascii;
+  comerror_t err;
+  InfoFiltersResponse_t filterinfo;
+  FilterResponse_t response;
+  text_tset metadata;
+
+  // get info on current collection and load up formatinfo
+  // I'd prefer not to do this here as we're getting 
+  // collection info every time (and probably also getting
+  // it in other places some of the time) - One day I'll
+  // fix it ... maybe - Stefan.
+  ColInfoResponse_t cinfo;
+
+  collectproto->get_collectinfo (collection, cinfo, err, logout);
+  load_formatinfo (cinfo.format, args.getintarg("gt"));
+  //  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr (collectproto, collection, logout);
+  //  if (cinfo == NULL) {
+  //    logout << "ERROR (documentaction::define_external_macros): get_collectinfo_ptr returned NULL\n";
+  //    return;
+  //  }
+  //load_formatinfo (cinfo->format, args.getintarg("gt"));
+
+  if (formatinfo.DocumentUseHTML) {
+
+    // frame stuff
+    if (args["fc"] == "1") {
+      text_t httpdocument;
+      disp.expandstring ("Global", "_httpdocument_", httpdocument);
+      httpdocument += "&f=1";
+      disp.setmacro ("httpdocument", "Global", httpdocument);
+      disp.setmacro ("gsdltop", "Global", "documenttop");
+      formatinfo.DocumentText = "[Text]";
+    }
+    text_tmap::iterator it = cinfo.format.find ("homepage");
+    if (it != cinfo.format.end()) {
+      text_t httppagehome;
+      if (get_link (args, protos, (*it).second, httppagehome, logout))
+	disp.setmacro ("httppagehome", "Global", httppagehome);
+    } 
+  }
+
+  // don't want navigation bar if page is 'detached'
+  if (!args.getintarg("x")) {
+
+    collectproto->get_filterinfo (collection, filterinfo, err, logout);
+    if (err == noError) {
+      // check that there's a browse filter
+      if (filterinfo.filterNames.find ("BrowseFilter") != filterinfo.filterNames.end()) {
+	
+	metadata.insert ("Title");
+	bool getParents = false;
+	get_children ("", collection, metadata, getParents, collectproto, response, logout);
+	
+	// calculate width of spacers and set _widthtspace_ macro
+	if (args.getintarg("v") == 0) set_spacemacro (disp, response);
+
+	// set _navigationbar_ macro
+	set_navbarmacros (disp, response, args);
+   
+      }
+    } else {
+      logout << text_t2ascii 
+	     << "Error (documentaction::define_external_macros()) in call to get_filterinfo() " 
+	     << get_comerror_string (err);
+    }
+  }
+}
+
+bool documentaction::get_link (cgiargsclass &args, recptprotolistclass *protos,
+			       const text_t &inlink, text_t &outlink, ostream &logout) {
+
+  FilterResponse_t response;
+  text_tset metadata;
+  metadata.insert ("section");
+  
+  // check current collection first
+  recptproto *collectproto = protos->getrecptproto (args["c"], logout);
+
+  if (get_info (inlink, args["c"], metadata, false, collectproto, response, logout)) {
+    if (!response.docInfo[0].metadata["section"].values[0].empty()) {
+      outlink = "_httpdocument_&d=" + response.docInfo[0].metadata["section"].values[0];
+      return true;
+    }
+  }
+
+  // check all the other enabled collections
+
+  if (args["ccs"] == "1" && !args["cc"].empty()) {
+    text_tarray collections;
+    splitchar (args["cc"].begin(), args["cc"].end(), ',', collections);
+    
+    text_tarray::const_iterator col_here = collections.begin();
+    text_tarray::const_iterator col_end = collections.end();
+
+    while (col_here != col_end) {
+	  
+      // don't need to check current collection again
+      if (*col_here == args["c"]) {col_here ++; continue;}
+	  
+      collectproto = protos->getrecptproto (*col_here, logout);
+      
+      if (get_info (inlink, *col_here, metadata, false, collectproto, response, logout)) {
+	if (!response.docInfo[0].metadata["section"].values[0].empty()) {
+	  outlink = "_httpdocument_&c=" + *col_here + "&d=" +
+	    response.docInfo[0].metadata["section"].values[0];
+	  return true;
+	}
+      }
+      col_here ++;
+    }
+  }
+  return false;
+}
+
+void documentaction::load_formatinfo (const text_tmap &colformat, int gt) {
+
+  formatinfo.clear();
+  text_tmap::const_iterator format_here = colformat.begin();
+  text_tmap::const_iterator format_end = colformat.end();
+
+  while (format_here != format_end) {
+    if (((*format_here).first == "DocumentImages") && 
+	((*format_here).second == "true"))
+      formatinfo.DocumentImages = true;
+    else if (((*format_here).first == "DocumentTitles") && 
+	     ((*format_here).second == "false"))
+      formatinfo.DocumentTitles = false;
+    else if ((*format_here).first == "DocumentHeading") 
+      formatinfo.DocumentHeading = (*format_here).second;
+    else if (((*format_here).first == "DocumentContents") && 
+	     ((*format_here).second == "false"))
+      formatinfo.DocumentContents = false;
+    else if (((*format_here).first == "DocumentArrowsBottom") && 
+	     ((*format_here).second == "false"))
+      formatinfo.DocumentArrowsBottom = false;
+    else if ((*format_here).first == "DocumentButtons")
+      splitchar ((*format_here).second.begin(), (*format_here).second.end(),
+		 '|', formatinfo.DocumentButtons);
+    else if ((*format_here).first == "DocumentText") 
+      formatinfo.DocumentText = (*format_here).second;  
+    else if ((*format_here).first == "RelatedDocuments")
+      formatinfo.RelatedDocuments = (*format_here).second; 
+    else if (((*format_here).first == "DocumentUseHTML") && 
+	     ((*format_here).second == "true"))
+      formatinfo.DocumentUseHTML = true;
+    else 
+      formatinfo.formatstrings[(*format_here).first] = (*format_here).second;
+    
+    format_here ++;
+  }
+
+  // never want arrows when text is expanded
+  if (gt) formatinfo.DocumentArrowsBottom = false;
+}
+
+
+// define all the macros which are related to pages generated
+// by this action. we also load up the formatinfo structure 
+// here (it's used in do_action as well as here)
+void documentaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					     recptprotolistclass *protos, ostream &logout) {
+  
+  // define_internal_macros sets the following macros:
+  
+  // _pagetitle_            the title to be displayed at the top of the browser window
+  
+  // _imagethispage_        the title image to be displayed at top right of page
+
+  // _navarrows_            this may be overridden to "" when format option 
+  //                        DocumentArrowsBottom is false
+
+  // _header_               the header macro is overridden if we're not at a top level 
+  //                        classification to remove the title block
+
+  // _thisOID_              the OID (directory) of the current document - this corresponds
+  //                        to the archivedir metadata element
+
+  // must have a valid collection server to continue
+  text_t &collection = args["c"];
+  if (collection.empty()) return;
+  recptproto *collectproto = protos->getrecptproto (collection, logout);
+  if (collectproto == NULL) return;
+
+  text_tset metadata;
+  FilterResponse_t response;
+  text_t &arg_d = args["d"];
+  text_t &arg_cl = args["cl"];
+
+  if (!formatinfo.DocumentArrowsBottom)
+    disp.setmacro("navarrows", "document", "");
+
+  metadata.insert ("Title");
+
+  bool fulltoc = false;
+
+  if (args["cl"] != "search") {
+    // see if there's a FullTOC string
+    text_t cl_top, full_toc;
+    get_top (arg_cl, cl_top);
+    if (get_formatstring (cl_top, "FullTOC", formatinfo.formatstrings, full_toc))
+      if (full_toc == "true") fulltoc = true;
+  }
+  
+  if (!arg_d.empty() && !fulltoc) {
+    // we're at document level
+
+    metadata.insert ("archivedir");
+
+    comerror_t err;
+    OptionValue_tarray options;
+    // we need to do the query again for the z3950proto
+    if (collectproto->get_protocol_name(err)=="z3950proto") {
+      OptionValue_t opt;
+      opt.name="Term";opt.value=args["q"];options.push_back(opt);
+      opt.name="QueryType";
+      opt.value=(args.getintarg("t")) ? "ranked" : "boolean";
+      options.push_back(opt);
+      opt.name="Index";opt.value=args["h"];options.push_back(opt);
+    }
+    
+    //do not display relation metadata
+    disp.setmacro ("relateddoc", "document", "");  
+       
+    //if preferences indicate relevant docs should be collected
+    //and there is no particular format specified then display
+    //this default format.
+     if(args["rd"] == "1" && formatinfo.RelatedDocuments.empty()){
+
+       text_t relation = ""; //string for displaying relation metadata
+
+       //call function in formattools.cpp which will return the text of the 
+       //related documents in a vertical list. This is the default format.
+       if (get_info (arg_d, collection, metadata, options, false, collectproto, response, logout)) 
+	 relation += get_related_docs(collection, collectproto, response.docInfo[0], logout);
+       
+       //set macro to be the related document string
+       disp.setmacro ("relateddoc", "document", relation); 
+     }
+     
+  
+    // get metadata for this document and it's parents
+    if (get_info (arg_d, collection, metadata, options, 
+		  true, collectproto, response, logout)) {
+
+      disp.setmacro ("header", "document", "_textheader_");
+      
+      text_tarray pagetitlearray;
+      if (!response.docInfo[0].metadata["Title"].values[0].empty())
+	pagetitlearray.push_back (response.docInfo[0].metadata["Title"].values[0]);
+      
+      if (args["gt"] != "1") {
+	MetadataInfo_t *parenttitle = response.docInfo[0].metadata["Title"].parent;
+	while (parenttitle != NULL) {
+	  if (!parenttitle->values[0].empty())
+	    pagetitlearray.push_back (parenttitle->values[0]);
+	  parenttitle = parenttitle->parent;
+	}
+      }
+      reverse (pagetitlearray.begin(), pagetitlearray.end());
+      text_t pagetitle;
+      joinchar (pagetitlearray, ": ", pagetitle);
+      disp.setmacro ("pagetitle", "document", pagetitle);
+
+      if (is_top (arg_d))
+	disp.setmacro ("thisOID", "Global", dm_safe(response.docInfo[0].metadata["archivedir"].values[0]));
+      else {
+	MetadataInfo_t *parentad = response.docInfo[0].metadata["archivedir"].parent;
+	text_t thisOID;
+	while (parentad != NULL) {
+	  thisOID = parentad->values[0];
+	  parentad = parentad->parent;
+	}
+	disp.setmacro ("thisOID", "Global", dm_safe(thisOID));
+      }
+    }
+  } else {
+    if (!arg_cl.empty()) {
+	
+      // get metadata for top level classification
+      text_t classtop;
+      get_top (arg_cl, classtop);
+      metadata.insert ("childtype");
+      metadata.insert ("parameters");
+
+      if (get_info (classtop, collection, metadata, false, collectproto, response, logout)) {
+	  
+	text_t &title = response.docInfo[0].metadata["Title"].values[0];
+	bool unknown = false;
+
+	// test the _XXXwidth_ macro to see if image macros are
+	// defined for this type of classification - if not we'll
+	// just display the text
+	text_t tmp;
+	disp.expandstring ("document", "_" + title + "width_", tmp);
+	if (tmp == ("_" + title + "width_")) unknown = true;
+
+	if (unknown) {
+	  disp.setmacro ("pagetitle", "document", title);
+	  disp.setmacro ("imagethispage", "document", "<h2>" + title + "</h2>");
+	} else {
+	  disp.setmacro ("pagetitle", "document", "_text" + title + "page_");
+	  disp.setmacro ("imagethispage", "document", "_icon" + title + "page_");
+	}
+
+      	//if the document is not a document from a collection
+	//we must set the macro to be an empty string
+	disp.setmacro ("relateddoc", "document", ""); 
+
+	// Add macros specific to the Phind lassifier 
+	text_t &childtype = response.docInfo[0].metadata["childtype"].values[0];
+	if (childtype == "Phind") {
+
+	  // First, a macro to display the phind classifier
+	  disp.setmacro ("phindclassifier", "document", "_phindapplet_");
+
+	  // Next, macros that control the way the classifier is displayed
+	  text_t parameters = response.docInfo[0].metadata["parameters"].values[0];
+
+	  // extract key=value pairs and set as macros
+	  text_t::iterator here = parameters.begin();
+	  text_t::iterator end = parameters.end();
+	  text_t key, value;
+	  
+	  while (here != end) {
+	    // get the next key and value pair
+	    here = getdelimitstr (here, end, '=', key);
+	    here = getdelimitstr (here, end, ';', value);
+
+	    // store this key=value pair
+	    if (!key.empty() && !value.empty()) {
+	      disp.setmacro (key, "document", value);
+	    }
+	  }
+	} // end if (childtype == "Phind")
+      }
+    } // end if (!arg_cl.empty()) {
+  }
+}
+
+
+bool documentaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+				browsermapclass *browsers, displayclass &disp, 
+				outconvertclass &outconvert, ostream &textout, 
+				ostream &logout) {
+ 
+  // must have a valid collection server
+  recptproto *collectproto = protos->getrecptproto (args["c"], logout);
+  if (collectproto == NULL) {
+    logout << "documentaction::do_action called with NULL collectproto\n";
+    textout << outconvert << disp << "_document:header_\n" 
+	    << "Error: Attempt to get document without setting collection\n"
+	    << "_document:footer_\n";
+  } else {  
+    
+    text_t OID = args["d"];
+    if (OID.empty()) OID = args["cl"];
+    if (OID.empty()) {
+      textout << outconvert << disp << "Document contains no data_document:footer_\n";
+      return true;
+    }
+
+  
+    if (formatinfo.DocumentUseHTML && !args["d"].empty()) {
+      
+      if (args["f"] == "1") {
+	textout << outconvert << disp 
+		<< "<html><head></head>\n"
+		<< "<frameset rows=\"68,*\" noresize border=0>\n"
+		<< "<frame scrolling=no frameborder=0 src=\"_gwcgi_?_optsite_e=_compressedoptions_&a=p&p=nav\">\n"
+		<< "<frame name=\"documenttop\" frameborder=0 src=\"_gwcgi_?_optsite_e=_compressedoptions_&a=d&d=" 
+		<< args["d"] << "\">"
+		<< "<noframes>\n"
+		<< "<p>You must have a frame enabled browser to view this.</p>\n"
+		<< "</noframes>\n"
+		<< "</frameset>\n"
+		<< "</html>\n";
+      } else {
+	output_document (OID, args, collectproto, disp, outconvert, textout, logout);	
+      }
+      return true;
+    }
+
+   
+    textout << outconvert << disp << "_document:header_\n"
+	    << "_document:content_\n";
+      
+    // output the table of contents
+    output_toc (args, browsers, formatinfo, collectproto, 
+		disp, outconvert, textout, logout);
+   
+    //output the related documents (may be the empty string)
+    //will not output the docs if a format string is specified
+    textout << outconvert << disp << "_document:relateddoc_\n";
+
+    // output the document text
+    if (!args["d"].empty()) {
+      textout << "<p>\n";
+      output_document (OID, args, collectproto, disp, outconvert, textout, logout);
+    }
+
+    textout << outconvert << disp << "_document:footer_\n";
+  }
+  return true;
+}
+
+void documentaction::output_text (ResultDocInfo_t &docinfo, format_t *formatlistptr,
+				  const TermInfo_tarray &terminfo, const text_t &OID,
+				  bool highlight, int hastxt, int wanttext, 
+				  text_t &collection, recptproto *collectproto, 
+				  displayclass &disp, outconvertclass &outconvert, 
+				  ostream &textout, ostream &logout) {
+  
+  DocumentRequest_t docrequest;
+  DocumentResponse_t docresponse;
+  comerror_t err;
+
+  if (hastxt == 1) {
+
+    if (wanttext) {
+      // get the text
+      docrequest.OID = OID;
+      collectproto->get_document (collection, docrequest, docresponse, err, logout);
+
+      // cut down on overhead by not using formattools if we only want the text
+      // (wanttext will equal 2 if we want text and other stuff too)
+      if (wanttext == 1)
+	if (highlight)
+	  highlighttext(docresponse.doc, terminfo, disp, outconvert, textout, logout);
+	else
+	  textout << outconvert << disp << docresponse.doc;
+    }
+  
+    if (wanttext != 1) {
+      text_t doctext 
+      = get_formatted_string (collection, collectproto,
+			      docinfo, disp, formatlistptr, docresponse.doc,
+			      logout); 
+      
+      if (highlight)
+	highlighttext(doctext, terminfo, disp, outconvert, textout, logout);
+      else
+	textout << outconvert << disp << doctext;
+    }
+  }
+}
+
+
+void documentaction::output_document (const text_t &OID, cgiargsclass &args, 
+				      recptproto *collectproto, displayclass &disp, 
+				      outconvertclass &outconvert, ostream &textout, 
+				      ostream &logout) {
+  FilterResponse_t inforesponse;
+  FilterResponse_t queryresponse;
+  text_tset metadata;
+  bool getParents = false;
+  bool highlight = false;
+  int wanttext = 0;
+  int arg_gt = args.getintarg("gt");
+  text_t &collection = args["c"];
+    
+  // if we have a query string and highlighting is turned on we need
+  // to redo the query to get the terms for highlighting
+  if (!args["q"].empty() && args.getintarg("hl")) {
+    FilterRequest_t request;
+    comerror_t err;
+    request.filterResultOptions = FRmatchTerms;
+    text_t formattedstring = args["q"];
+    format_querystring (formattedstring, args.getintarg("b"));
+    set_queryfilter_options (request, formattedstring, args);
+    collectproto->filter (args["c"], request, queryresponse, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii
+	     << "documentaction::output_document: call to QueryFilter failed "
+	     << "for " << args["c"] << " collection (" << get_comerror_string (err) << ")\n";
+      highlight = false;
+    } else {
+      highlight = true;
+    }
+  }
+
+
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatinfo.DocumentText, formatlistptr, metadata, getParents);
+
+  metadata.insert ("hastxt");
+  metadata.insert ("haschildren");
+
+  if (formatinfo.DocumentText == "[Text]")
+    wanttext = 1;
+  else {
+    char *docformat = formatinfo.DocumentText.getcstr();
+    if (strstr (docformat, "[Text]") != NULL)
+      wanttext = 2;
+    delete docformat;
+  }
+    
+  if (get_info (OID, collection, metadata, getParents, collectproto, inforesponse, logout)) {
+    int hastxt = inforesponse.docInfo[0].metadata["hastxt"].values[0].getint();
+    int haschildren = inforesponse.docInfo[0].metadata["haschildren"].values[0].getint();
+    
+    if (arg_gt == 0) {
+      output_text (inforesponse.docInfo[0], formatlistptr, queryresponse.termInfo, 
+		   OID, highlight, hastxt, wanttext, collection, collectproto, 
+		   disp, outconvert, textout, logout);
+
+
+    } else {
+
+      ResultDocInfo_t thisdocinfo = inforesponse.docInfo[0];
+	
+      // text is to be expanded
+      text_t exOID = OID;
+      if (haschildren != 1) exOID = get_parent (OID);
+      if (exOID.empty()) exOID = OID;
+	
+      // if we're not in a document (i.e. we're in a top level classification)
+      // we need to pass "is_classify = true" to get_contents so that it 
+      // doesn't recurse all the way through each document in the classification
+      bool is_classify = false;
+      if (args["d"].empty()) is_classify = true;
+
+      get_contents (exOID, is_classify, metadata, collection, 
+		    collectproto, inforesponse, logout);
+	
+      ResultDocInfo_tarray::iterator sechere = inforesponse.docInfo.begin();
+      ResultDocInfo_tarray::iterator secend = inforesponse.docInfo.end();
+
+      if (arg_gt == 1) {
+	// check if there are more than 10 sections containing text to be expanded - 
+	// if there are output warning message - this isn't a great way to do this
+	// since the sections may be very large or very small - one day I'll fix it 
+	// -- Stefan.
+	int seccount = 0;
+	while (sechere != secend) {
+	  int shastxt = (*sechere).metadata["hastxt"].values[0].getint();
+	  if (shastxt == 1) seccount ++;
+	  if (seccount > 10) break;
+	  sechere ++;
+	}
+	if (seccount > 10) {
+	  // more than 10 sections so output warning message and text 
+	  // for current section only
+	  textout << outconvert << disp << "_document:textltwarning_";
+
+	  output_text (thisdocinfo, formatlistptr, queryresponse.termInfo, 
+		       OID, highlight, hastxt, wanttext, collection, 
+		       collectproto, disp, outconvert, textout, logout);
+	  
+	}
+	else arg_gt = 2;
+      }
+
+      if (arg_gt == 2) {
+	// get the text for each section
+	sechere = inforesponse.docInfo.begin();
+	int count = 0;
+	while (sechere != secend) {
+	  textout << outconvert << disp << "\n<p><a name=" << (*sechere).OID << "></a>\n";
+
+	  int shastxt = (*sechere).metadata["hastxt"].values[0].getint();
+
+	  output_text (*sechere, formatlistptr, queryresponse.termInfo, 
+		       (*sechere).OID, highlight, shastxt, wanttext, collection, 
+		       collectproto, disp, outconvert, textout, logout);
+	  count ++;
+	  sechere ++;
+	}
+      }
+    }
+  }
+  delete formatlistptr;
+}
+
+// highlighttext highlights query terms in text string and outputs the resulting text string
+void documentaction::highlighttext(text_t &text, const TermInfo_tarray &terms, 
+				   displayclass &disp, outconvertclass &outconvert, 
+				   ostream &textout, ostream &/*logout*/) {
+
+  text_tmap allterms;
+  text_tmap::const_iterator it;
+
+  // first load all the term variations into a map
+  TermInfo_tarray::const_iterator this_term = terms.begin();
+  TermInfo_tarray::const_iterator last_term = terms.end();
+  while (this_term != last_term) {
+    text_tarray::const_iterator this_var = (*this_term).matchTerms.begin();
+    text_tarray::const_iterator last_var = (*this_term).matchTerms.end();
+    while (this_var != last_var) {
+      allterms[*this_var] = 1;
+      this_var ++;
+    }
+    this_term ++;
+  }
+
+  // get the text to start and end a hightlight
+  text_t starthighlight = "<b><u>";
+  text_t endhighlight = "</u></b>";
+  if (disp.isdefaultmacro("Global", "starthighlight"))
+    disp.expandstring("Global", "_starthighlight_", starthighlight);
+  if (disp.isdefaultmacro("Global", "endhighlight"))
+    disp.expandstring("Global", "_endhighlight_", endhighlight);
+
+
+  text_t::iterator here = text.begin(); 
+  text_t::iterator end = text.end();
+  text_t word, buffer;
+  while (here != end) {
+    if (is_unicode_letdig(*here)) {
+      // not word boundary
+      word.push_back(*here);
+      here++;
+
+    } else {
+      // found word boundary
+      // add last word if there was one
+      if (!word.empty()) {
+	it = allterms.find(word);
+	if (it != allterms.end()) {
+	  word = starthighlight + word + endhighlight;
+	}
+	buffer += word;
+        word.clear();
+      }
+
+      if (*here == '<') {
+        // skip over rest of html tag
+	while ((here != end) && (*here != '>')) {
+	  buffer.push_back(*here);
+	  here++;
+	}
+      }
+
+      buffer.push_back(*here);
+      here++;
+
+      if (buffer.size() > 1024) {
+	textout << outconvert << disp << buffer;
+	buffer.clear();
+      }
+    }
+  }
+  textout << outconvert << disp << buffer;
+}
Index: /main/tags/2.38/gsdl/src/recpt/documentaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/documentaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/documentaction.h	(revision 21083)
@@ -0,0 +1,99 @@
+/**********************************************************************
+ *
+ * documentaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef DOCUMENTACTION_H
+#define DOCUMENTACTION_H
+
+#include "action.h"
+#include "gsdlconf.h"
+#include "formattools.h"
+#include "receptionist.h"
+
+class documentaction : public action {
+
+protected:
+
+  receptionist *recpt;
+
+  bool get_link (cgiargsclass &args, recptprotolistclass *protos,
+		 const text_t &inlink, text_t &outlink, ostream &logout);
+
+  void load_formatinfo (const text_tmap &colformat, int gt);
+
+  void set_spacemacro (displayclass &disp, FilterResponse_t &response);
+
+  void set_navbarmacros (displayclass &disp, FilterResponse_t &response, 
+			 cgiargsclass &args);
+
+  virtual void output_text (ResultDocInfo_t &docinfo, format_t *formatlistptr,
+			    const TermInfo_tarray &terminfo, const text_t &OID,
+			    bool highlight, int hastxt, int wanttext, 
+			    text_t &collection, recptproto *collectproto,
+			    displayclass &disp, outconvertclass &outconvert,
+			    ostream &textout, ostream &logout);
+
+  virtual void output_document (const text_t &OID, cgiargsclass &args, 
+				recptproto *collectproto, displayclass &disp, 
+				outconvertclass &outconvert, ostream &textout, 
+				ostream &logout);
+
+  void highlighttext(text_t &text, const TermInfo_tarray &terms, 
+		     displayclass &disp, outconvertclass &outconvert, 
+		     ostream &textout, ostream &logout);
+
+  formatinfo_t formatinfo;
+
+public:
+  documentaction ();
+  virtual ~documentaction ();
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+
+  text_t get_action_name () {return "d";}
+
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response,text_t &response_data, 
+			 ostream &logout);
+
+  void define_external_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+};
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/extlinkaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/extlinkaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/extlinkaction.cpp	(revision 21083)
@@ -0,0 +1,251 @@
+/**********************************************************************
+ *
+ * extlinkaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#include <string.h>
+#include "extlinkaction.h"
+#include "OIDtools.h"
+#include "cgiutils.h"
+
+extlinkaction::extlinkaction () {
+
+  // this action uses cgi variables "a", "d", and "href"
+
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "extlink";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "el";
+  arg_ainfo.longname = "external link preference";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "prompt";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "d";
+  arg_ainfo.longname = "document OID";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "href";
+  arg_ainfo.longname = "URL of external link";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "rl";
+  arg_ainfo.longname = "is relative link";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+}
+
+extlinkaction::~extlinkaction () {
+}
+
+
+void extlinkaction::get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+				      response_t &response, text_t &response_data, 
+				      ostream &logout) {
+
+  text_t link;
+  if (get_link (args, protos, link, logout)) {
+    response = location;
+    response_data = link;
+    return;
+  }
+
+  // external link
+  if (!link.empty()) {
+    if (args["el"] == "direct") {
+      response = location;
+      response_data = link;
+      return;
+    }
+  }
+
+  response = content;
+  response_data = "text/html";
+}
+
+void extlinkaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					    recptprotolistclass * /*protos*/, 
+					    ostream &/*logout*/) {
+  
+  // define_internal_macros sets the following macros:
+
+  // _nexturl_             link to external page
+  // _prevdoc_             link to previous document
+  //  disp.setmacro("nexturl", "extlink", cgi_safe(args["href"]));
+  // problem in whist, above line changed.  Perhaps decode_cgi_arg ??
+  // see also HTML plugin
+  disp.setmacro("nexturl", "extlink", args["href"]);
+  disp.setmacro("prevdoc", "extlink", args["d"]);
+}
+
+
+// if link is found returns true and url in link, otherwise returns
+// false
+bool extlinkaction::get_link (cgiargsclass &args, recptprotolistclass *protos,
+			      text_t &link, ostream &logout) {
+
+    text_t &arg_href = args["href"];
+    text_t &thiscollection = args["c"];
+    if (arg_href.empty()) return false;
+
+    if (args["rl"] == "1") {
+
+      FilterResponse_t response;
+      text_tset metadata;
+      metadata.insert ("section");
+	  
+      recptproto *collectproto = protos->getrecptproto (thiscollection, logout);
+
+      if (get_info (arg_href, thiscollection, metadata, false, collectproto, response, logout)) {
+	if (!response.docInfo[0].metadata["section"].values[0].empty()) {
+	  link = "_httpdoc_&d=" + response.docInfo[0].metadata["section"].values[0];
+	  return true;
+	}
+      }
+
+      // need to see if link exists in any other collection
+      // if cross-collection searching/browsing is turned on 
+      if (args["ccs"] == "1" && !args["cc"].empty()) {
+	text_tarray collections;
+	splitchar (args["cc"].begin(), args["cc"].end(), ',', collections);
+
+	text_tarray::const_iterator col_here = collections.begin();
+	text_tarray::const_iterator col_end = collections.end();
+
+	while (col_here != col_end) {
+	  
+	  // don't need to check current collection again
+	  if (*col_here == thiscollection) {col_here ++; continue;}
+	  
+	  recptproto *collectproto = protos->getrecptproto (*col_here, logout);
+	  if (collectproto == NULL) {col_here ++; continue;}
+
+	  if (get_info (arg_href, *col_here, metadata, false, collectproto, response, logout)) {
+	    if (!response.docInfo[0].metadata["section"].values[0].empty()) {
+	      link = "_httpdoc_&c=" + *col_here + "&d=" +
+		response.docInfo[0].metadata["section"].values[0];
+	      return true;
+	    }
+	  }
+	  col_here ++;
+	}
+      }
+      return false;
+      
+    } else {
+      // link is external 
+      link = arg_href;
+      return false;
+    }
+}
+
+
+bool extlinkaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			       browsermapclass * /*browsers*/, displayclass &disp,
+			       outconvertclass &outconvert, ostream &textout,
+			       ostream &logout) {
+
+  if (args["href"].empty()) {
+    // oops, this shouldn't happen
+    textout << outconvert << disp << ("_extlink:header_\n")
+	    << ("_extlink:notfoundcontent_\n")
+	    << ("_extlink:footer_\n");
+    return true;
+  }
+
+  if (args["rl"] == "1") {
+    // need to see if link exists in any other collection
+    // if cross-collection searching/browsing is turned on 
+    if (args["ccs"] == "1" && !args["cc"].empty()) {
+      
+      FilterResponse_t response;
+      text_tset metadata;
+      metadata.insert ("section");
+      text_tarray collections;
+      splitchar (args["cc"].begin(), args["cc"].end(), ',', collections);
+      
+      text_tarray::const_iterator col_here = collections.begin();
+      text_tarray::const_iterator col_end = collections.end();
+      
+      while (col_here != col_end) {
+	
+	// don't need to check current collection
+	if (*col_here == args["c"]) {col_here ++; continue;}
+	
+	recptproto *collectproto = protos->getrecptproto (*col_here, logout);
+	
+	if (get_info (args["href"], *col_here, metadata, false, collectproto, response, logout)) {
+	  if (!response.docInfo[0].metadata["section"].values[0].empty()) {
+	    text_t collectionname = *col_here;
+	    metadata.erase (metadata.begin(), metadata.end());
+	    metadata.insert ("collectionname");
+	    FilterResponse_t nresponse;
+	    if (get_info ("collection", *col_here, metadata, false, collectproto, nresponse, logout)) {
+	      if (!nresponse.docInfo[0].metadata["collectionname"].values[0].empty())
+		collectionname = nresponse.docInfo[0].metadata["collectionname"].values[0];
+	    }
+	    textout << outconvert << disp << ("_extlink:header_\n")
+		    << ("_extlink:foundintcontent_(" + *col_here + ", " + collectionname + 
+			", " + response.docInfo[0].metadata["section"].values[0] + "\n")
+		    << ("_extlink:footer_\n");
+	    return true;
+	  }
+	}
+	col_here ++;
+      }
+    }
+    textout << outconvert << disp << ("_extlink:header_\n")
+	    << ("_extlink:notfoundcontent_\n")
+	    << ("_extlink:footer_\n");
+    
+    
+  } else {
+    // link is external 
+    textout << outconvert << disp << ("_extlink:header_\n")
+	    << ("_extlink:foundcontent_\n")
+	    << ("_extlink:footer_\n");
+  }
+
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/recpt/extlinkaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/extlinkaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/extlinkaction.h	(revision 21083)
@@ -0,0 +1,62 @@
+/**********************************************************************
+ *
+ * extlinkaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef EXTLINKACTION_H
+#define EXTLINKACTION_H
+
+#include "action.h"
+
+class extlinkaction : public action {
+
+
+public:
+  extlinkaction ();
+  virtual ~extlinkaction ();
+
+  text_t get_action_name () {return "extlink";}
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, 
+			       ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp,
+		  outconvertclass &outconvert, ostream &textout,
+		  ostream &logout);
+
+
+protected:
+  bool get_link (cgiargsclass &args, recptprotolistclass *protos,
+		 text_t &link, ostream &logout);
+
+};
+
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/formattools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/formattools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/formattools.cpp	(revision 21083)
@@ -0,0 +1,1114 @@
+/**********************************************************************
+ *
+ * formattools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "formattools.h"
+#include "cgiutils.h"
+#include "OIDtools.h"
+#include "summarise.h"
+
+#include <assert.h>
+
+// a few function prototypes
+static text_t format_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp, 
+			     format_t *formatlistptr,
+			     const text_t &link, const text_t &icon, 
+			     const text_t &text, bool highlight, ostream& logout);
+
+static bool parse_action (text_t::const_iterator &here, const text_t::const_iterator &end, 
+			  format_t *formatlistptr, text_tset &metadata, bool &getParents);
+
+text_t format_summary (const text_t& collection, recptproto* collectproto,
+		      ResultDocInfo_t &docinfo, displayclass &disp, 
+		      const text_t &text, bool highlight,
+		       ostream& logout);
+
+
+void metadata_t::clear() {
+  metaname.clear();
+  metacommand = mNone;
+  parentcommand = pNone;
+  parentoptions.clear();
+}
+
+void decision_t::clear() {
+  command = dMeta;
+  meta.clear();
+  text.clear();
+}
+
+void format_t::clear() {
+  command = comText;
+  decision.clear();
+  text.clear();
+  meta.clear();
+  nextptr = NULL;
+  ifptr = NULL;
+  elseptr = NULL;
+  orptr = NULL;
+}
+
+void formatinfo_t::clear() {
+  DocumentImages = false;
+  DocumentTitles = true;
+  DocumentHeading = "{Or}{[parent(Top):Title],[Title],untitled}<br>";
+  DocumentContents = true;
+  DocumentArrowsBottom = true; 
+  DocumentButtons.erase (DocumentButtons.begin(), DocumentButtons.end());
+  //  DocumentButtons.push_back ("Expand Text");
+  //  DocumentButtons.push_back ("Expand Contents");
+  DocumentButtons.push_back ("Detach");
+  DocumentButtons.push_back ("Highlight");
+  RelatedDocuments = "";
+  DocumentText = "<center><table width=_pagewidth_><tr><td>[Text]</td></tr></table></center>";
+  formatstrings.erase (formatstrings.begin(), formatstrings.end());
+  DocumentUseHTML = false;
+}
+
+// simply checks to see if formatstring begins with a <td> tag
+bool is_table_content (const text_t &formatstring) {
+  text_t::const_iterator here = formatstring.begin();
+  text_t::const_iterator end = formatstring.end();
+  
+  while (here != end) {
+    if (*here != ' ') {
+      if ((*here == '<') && ((here+3) < end)) {
+	if ((*(here+1) == 't' || *(here+1) == 'T') &&
+	    (*(here+2) == 'd' || *(here+2) == 'D') &&
+	    (*(here+3) == '>' || *(here+3) == ' '))
+	  return true;
+      } else return false;
+    }
+    here ++;
+  }
+  return false;
+}
+
+bool is_table_content (const format_t *formatlistptr) {
+
+  if (formatlistptr == NULL) return false;
+  
+  if (formatlistptr->command == comText)
+    return is_table_content (formatlistptr->text);
+    
+  return false;
+}
+
+// returns false if key isn't in formatstringmap
+bool get_formatstring (const text_t &key, const text_tmap &formatstringmap,
+		       text_t &formatstring) {
+
+  formatstring.clear();
+  text_tmap::const_iterator it = formatstringmap.find(key);
+  if (it == formatstringmap.end()) return false;
+  formatstring = (*it).second;
+  return true;
+}
+
+// tries to find "key1key2" then "key1" then "key2"
+bool get_formatstring (const text_t &key1, const text_t &key2,  
+		       const text_tmap &formatstringmap,
+		       text_t &formatstring) {
+
+  formatstring.clear();
+  text_tmap::const_iterator it = formatstringmap.find(key1 + key2);
+  if (it != formatstringmap.end()) {
+    formatstring = (*it).second;
+    return true;
+  }
+  it = formatstringmap.find(key1);
+  if (it != formatstringmap.end()) {
+    formatstring = (*it).second;
+    return true;
+  }
+  it = formatstringmap.find(key2);
+  if (it != formatstringmap.end()) {
+    formatstring = (*it).second;
+    return true;
+  }
+  return false;
+}
+
+
+// returns a date of form 31 _textmonthnn_ 1999 
+// input is date of type 19991231
+// at least the year must be present in date
+text_t format_date (const text_t &date) {
+
+  if (date.size() < 4) return "";
+
+  text_t::const_iterator datebegin = date.begin();
+
+  text_t year = substr (datebegin, datebegin+4);
+
+  if (date.size() < 6) return year;
+
+  text_t month = "_textmonth" + substr (datebegin+4, datebegin+6) + "_";
+  int imonth = month.getint();
+  if (imonth < 0 || imonth > 12) return year;
+
+  if (date.size() < 8) return month + " " + year;
+
+  text_t day = substr (datebegin+6, datebegin+8);
+  if (day[0] == '0') day = substr (day.begin()+1, day.end());
+  int iday = day.getint();
+  if (iday < 0 || iday > 31) return month + " " + year;
+    
+  return day + " " + month + " " + year;
+}  
+
+// converts an iso639 language code to its English equivalent
+// I realize that this isn't the pretiest or most efficient implementation,
+// hopefully this ugly Language (and Date too) formatting won't survive to
+// see gsdl-3.0
+text_t iso639 (const text_t &langcode) {
+
+  if (langcode == "aa") return "Afar";
+  if (langcode == "ab") return "Abkhazian";
+  if (langcode == "af") return "Afrikaans";
+  if (langcode == "am") return "Amharic";
+  if (langcode == "ar") return "Arabic";
+  if (langcode == "as") return "Assamese";
+  if (langcode == "ay") return "Aymara";
+  if (langcode == "az") return "Azerbaijani";
+  
+  if (langcode == "ba") return "Bashkir";
+  if (langcode == "be") return "Byelorussian";
+  if (langcode == "bg") return "Bulgarian";
+  if (langcode == "bh") return "Bihari";
+  if (langcode == "bi") return "Bislama";
+  if (langcode == "bn") return "Bengali; Bangla";
+  if (langcode == "bo") return "Tibetan";
+  if (langcode == "br") return "Breton";
+  
+  if (langcode == "ca") return "Catalan";
+  if (langcode == "co") return "Corsican";
+  if (langcode == "cs") return "Czech";
+  if (langcode == "cy") return "Welsh";
+  
+  if (langcode == "da") return "Danish";
+  if (langcode == "de") return "German";
+  if (langcode == "dz") return "Bhutani";
+  
+  if (langcode == "el") return "Greek";
+  if (langcode == "en") return "English";
+  if (langcode == "eo") return "Esperanto";
+  if (langcode == "es") return "Spanish";
+  if (langcode == "et") return "Estonian";
+  if (langcode == "eu") return "Basque";
+  
+  if (langcode == "fa") return "Persian";
+  if (langcode == "fi") return "Finnish";
+  if (langcode == "fj") return "Fiji";
+  if (langcode == "fo") return "Faroese";
+  if (langcode == "fr") return "French";
+  if (langcode == "fy") return "Frisian";
+  
+  if (langcode == "ga") return "Irish";
+  if (langcode == "gd") return "Scots Gaelic";
+  if (langcode == "gl") return "Galician";
+  if (langcode == "gn") return "Guarani";
+  if (langcode == "gu") return "Gujarati";
+  
+  if (langcode == "ha") return "Hausa";
+  if (langcode == "hi") return "Hindi";
+  if (langcode == "hr") return "Croatian";
+  if (langcode == "hu") return "Hungarian";
+  if (langcode == "hy") return "Armenian";
+  
+  if (langcode == "ia") return "Interlingua";
+  if (langcode == "ie") return "Interlingue";
+  if (langcode == "ik") return "Inupiak";
+  if (langcode == "in") return "Indonesian";
+  if (langcode == "is") return "Icelandic";
+  if (langcode == "it") return "Italian";
+  if (langcode == "iw") return "Hebrew";
+  
+  if (langcode == "ja") return "Japanese";
+  if (langcode == "ji") return "Yiddish";
+  if (langcode == "jw") return "Javanese";
+  
+  if (langcode == "ka") return "Georgian";
+  if (langcode == "kk") return "Kazakh";
+  if (langcode == "kl") return "Greenlandic";
+  if (langcode == "km") return "Cambodian";
+  if (langcode == "kn") return "Kannada";
+  if (langcode == "ko") return "Korean";
+  if (langcode == "ks") return "Kashmiri";
+  if (langcode == "ku") return "Kurdish";
+  if (langcode == "ky") return "Kirghiz";
+  
+  if (langcode == "la") return "Latin";
+  if (langcode == "ln") return "Lingala";
+  if (langcode == "lo") return "Laothian";
+  if (langcode == "lt") return "Lithuanian";
+  if (langcode == "lv") return "Latvian, Lettish";
+  
+  if (langcode == "mg") return "Malagasy";
+  if (langcode == "mi") return "Maori";
+  if (langcode == "mk") return "Macedonian";
+  if (langcode == "ml") return "Malayalam";
+  if (langcode == "mn") return "Mongolian";
+  if (langcode == "mo") return "Moldavian";
+  if (langcode == "mr") return "Marathi";
+  if (langcode == "ms") return "Malay";
+  if (langcode == "mt") return "Maltese";
+  if (langcode == "my") return "Burmese";
+  
+  if (langcode == "na") return "Nauru";
+  if (langcode == "ne") return "Nepali";
+  if (langcode == "nl") return "Dutch";
+  if (langcode == "no") return "Norwegian";
+  
+  if (langcode == "oc") return "Occitan";
+  if (langcode == "om") return "(Afan) Oromo";
+  if (langcode == "or") return "Oriya";
+  
+  if (langcode == "pa") return "Punjabi";
+  if (langcode == "pl") return "Polish";
+  if (langcode == "ps") return "Pashto, Pushto";
+  if (langcode == "pt") return "Portuguese";
+  
+  if (langcode == "qu") return "Quechua";
+  if (langcode == "rm") return "Rhaeto-Romance";
+  if (langcode == "rn") return "Kirundi";
+  if (langcode == "ro") return "Romanian";
+  if (langcode == "ru") return "Russian";
+  if (langcode == "rw") return "Kinyarwanda";
+  
+  if (langcode == "sa") return "Sanskrit";
+  if (langcode == "sd") return "Sindhi";
+  if (langcode == "sg") return "Sangro";
+  if (langcode == "sh") return "Serbo-Croatian";
+  if (langcode == "si") return "Singhalese";
+  if (langcode == "sk") return "Slovak";
+  if (langcode == "sl") return "Slovenian";
+  if (langcode == "sm") return "Samoan";
+  if (langcode == "sn") return "Shona";
+  if (langcode == "so") return "Somali";
+  if (langcode == "sq") return "Albanian";
+  if (langcode == "sr") return "Serbian";
+  if (langcode == "ss") return "Siswati";
+  if (langcode == "st") return "Sesotho";
+  if (langcode == "su") return "Sudanese";
+  if (langcode == "sv") return "Swedish";
+  if (langcode == "sw") return "Swahili";
+  
+  if (langcode == "ta") return "Tamil";
+  if (langcode == "te") return "Tegulu";
+  if (langcode == "tg") return "Tajik";
+  if (langcode == "th") return "Thai";
+  if (langcode == "ti") return "Tigrinya";
+  if (langcode == "tk") return "Turkmen";
+  if (langcode == "tl") return "Tagalog";
+  if (langcode == "tn") return "Setswana";
+  if (langcode == "to") return "Tonga";
+  if (langcode == "tr") return "Turkish";
+  if (langcode == "ts") return "Tsonga";
+  if (langcode == "tt") return "Tatar";
+  if (langcode == "tw") return "Twi";
+  
+  if (langcode == "uk") return "Ukrainian";
+  if (langcode == "ur") return "Urdu";
+  if (langcode == "uz") return "Uzbek";
+  
+  if (langcode == "vi") return "Vietnamese";
+  if (langcode == "vo") return "Volapuk";
+  
+  if (langcode == "wo") return "Wolof";
+  
+  if (langcode == "xh") return "Xhosa";
+  
+  if (langcode == "yo") return "Yoruba";
+  
+  if (langcode == "zh") return "Chinese";
+  if (langcode == "zu") return "Zulu";
+  return "";
+}
+
+text_t get_href (const text_t &link) {
+
+  text_t href;
+
+  text_t::const_iterator here = findchar(link.begin(), link.end(), '"');
+  text_t::const_iterator end = link.end();
+  
+  here ++;
+  while (here != end) {
+    if (*here == '"') break;
+    href.push_back(*here);
+    here ++;
+  }
+
+  return href;
+}
+
+//this function gets the information associated with the relation
+//metadata for the document associated with 'docinfo'. This relation
+//metadata consists of a line of pairs containing 'collection, document OID'
+//(this is the OID of the document related to the current document, and
+//the collection the related document belongs to). For each of these pairs
+//the title metadata is obtained and then an html link between the title
+//of the related doc and the document's position (the document will be
+//found in "<a href=\"_httpdocument_&c=collection&cl=search&d=OID">
+//(where collection is the related documents collection, and OID is the
+//related documents OID).  A list of these html links are made for as many
+//related documents as there are. This list is then returned. If there are
+//no related documents available for the current document then the string
+//'.. no related documents .. ' is returned.
+text_t get_related_docs(const text_t& collection, recptproto* collectproto,
+			   ResultDocInfo_t &docinfo, ostream& logout){
+  
+  text_tset metadata;
+
+  //insert the metadata we wish to collect
+  metadata.insert("relation"); 
+  metadata.insert("Title");  
+  metadata.insert("Subject"); //for emails, where title data doesn't apply
+ 
+  FilterResponse_t response;
+  text_t relation = ""; //string for displaying relation metadata
+  text_t relationTitle = ""; //the related documents Title (or subject)
+  text_t relationOID = ""; //the related documents OID  
+
+  //get the information associated with the metadata for current doc
+  if (get_info (docinfo.OID, collection, metadata, 
+		false, collectproto, response, logout)) {
+    
+    //if the relation metadata exists, store for displaying
+    if(!response.docInfo[0].metadata["relation"].values.empty()){
+      relationOID += response.docInfo[0].metadata["relation"].values[0];
+
+      //split relation data into pairs of collectionname,ID number
+      text_tarray relationpairs;
+      splitchar (relationOID.begin(), relationOID.end(), ' ', relationpairs);
+      
+      text_tarray::const_iterator currDoc = relationpairs.begin();  
+      text_tarray::const_iterator lastDoc = relationpairs.end();
+
+      //iterate through the pairs to split and display
+      while(currDoc != lastDoc){
+	
+	//split pairs into collectionname and ID 
+	text_tarray relationdata;
+	splitchar ((*currDoc).begin(), (*currDoc).end(), ',', relationdata);
+	
+	//get first element in the array (collection)
+	text_tarray::const_iterator doc_data = relationdata.begin();
+	text_t document_collection = *doc_data;
+	doc_data++; //increment to get next item in array (oid)
+	text_t document_OID = *doc_data;
+	
+	//create html link to related document
+	relation += "<a href=\"_httpdocument_&c=" + document_collection;
+	relation += "&cl=search&d=" + document_OID;
+	   
+	//get the information associated with the metadata for related doc
+	if (get_info (document_OID, document_collection, metadata,
+		      false, collectproto, response, logout)) {
+	  
+	  //if title metadata doesn't exist, collect subject metadata
+	  //if that doesn't exist, just call it 'related document'
+	  if (!response.docInfo[0].metadata["Title"].values[0].empty())
+		relationTitle = response.docInfo[0].metadata["Title"].values[0];
+	  else if (!response.docInfo[0].metadata["Subject"].values.empty())
+	    relationTitle = response.docInfo[0].metadata["Subject"].values[0];
+	  else relationTitle =  "RELATED DOCUMENT";
+	  
+	}
+	
+	//link the related document's title to its page
+	relation += "\">" + relationTitle + "</a>"; 
+	relation += "  (" + document_collection + ")<br>";
+	
+	currDoc++;
+      }
+    }
+    
+  } 
+
+  if(relation.empty()) //no relation data for documnet
+    relation = ".. no related documents .. ";
+
+  return relation;
+}
+
+
+
+static void get_parent_options (text_t &instring, metadata_t &metaoption) {
+
+  assert (instring.size() > 7);
+  if (instring.size() <= 7) return;
+
+  text_t meta, com, op;
+  bool inbraces = false;
+  bool inquotes = false;
+  bool foundcolon = false;
+  text_t::const_iterator here = instring.begin()+6;
+  text_t::const_iterator end = instring.end();
+  while (here != end) {
+    if (*here == '(') inbraces = true;
+    else if (*here == ')') inbraces = false;
+    else if (*here == '\'' && !inquotes) inquotes = true;
+    else if (*here == '\'' && inquotes) inquotes = false;
+    else if (*here == ':' && !inbraces) foundcolon = true;
+    else if (foundcolon) meta.push_back (*here);
+    else if (inquotes) op.push_back (*here);
+    else com.push_back (*here);
+    here ++;
+  }
+  instring = meta;
+  if (com.empty())
+    metaoption.parentcommand = pImmediate;
+  else if (com == "Top")
+    metaoption.parentcommand = pTop;
+  else if (com == "All") {
+    metaoption.parentcommand = pAll;
+    metaoption.parentoptions = op;
+  }
+}
+
+static void parse_meta (text_t &meta, metadata_t &metaoption,
+			text_tset &metadata, bool &getParents) {
+
+  if (meta.size() > 8 && (substr(meta.begin(), meta.begin()+8) == "cgisafe:")) {
+    metaoption.metacommand = mCgiSafe;
+    meta = substr (meta.begin()+8, meta.end());
+  }
+
+  if (meta.size() > 7 && (substr (meta.begin(), meta.begin()+6) == "parent")) {
+    getParents = true;
+    get_parent_options (meta, metaoption);
+  } 
+
+  metadata.insert (meta);
+  metaoption.metaname = meta;
+}
+
+static void parse_meta (text_t &meta, format_t *formatlistptr,
+			text_tset &metadata, bool &getParents) {
+  
+  if (meta == "link")
+    formatlistptr->command = comLink;
+  else if (meta == "/link")
+    formatlistptr->command = comEndLink;
+
+  else if (meta == "href")
+    formatlistptr->command = comHref;
+
+  else if (meta == "num")
+    formatlistptr->command = comNum;
+
+  else if (meta == "icon")
+    formatlistptr->command = comIcon;
+
+  else if (meta == "Text")
+    formatlistptr->command = comDoc;
+  
+  else if (meta == "RelatedDocuments")
+   formatlistptr->command = comRel;
+
+  else if (meta == "highlight")
+    formatlistptr->command = comHighlight;
+
+  else if (meta == "/highlight")
+    formatlistptr->command = comEndHighlight;
+
+  else if (meta == "Summary")
+    formatlistptr->command = comSummary;
+
+  else {
+    formatlistptr->command = comMeta;
+    parse_meta (meta, formatlistptr->meta, metadata, getParents);
+  }
+}
+
+static bool parse_string (const text_t &formatstring, format_t *formatlistptr, 
+			  text_tset &metadata, bool &getParents) {
+
+  text_t text;
+  text_t::const_iterator here = formatstring.begin();
+  text_t::const_iterator end = formatstring.end();
+
+  while (here != end) {
+
+    if (*here == '\\') {
+      here ++;
+      if (here != end) text.push_back (*here);
+
+    } else if (*here == '{') {
+      if (!text.empty()) {
+	formatlistptr->command = comText;
+	formatlistptr->text = text;
+	formatlistptr->nextptr = new format_t();
+	formatlistptr = formatlistptr->nextptr;
+	
+	text.clear();
+      }
+      if (parse_action (++here, end, formatlistptr, metadata, getParents)) {
+
+	formatlistptr->nextptr = new format_t();
+	formatlistptr = formatlistptr->nextptr;
+	if (here == end) break;
+      }
+    } else if (*here == '[') {
+      if (!text.empty()) {
+	formatlistptr->command = comText;
+	formatlistptr->text = text;
+	formatlistptr->nextptr = new format_t();
+	formatlistptr = formatlistptr->nextptr;
+
+	text.clear();
+      }
+      text_t meta;
+      here ++;
+      while (*here != ']') {
+	if (here == end) return false;
+	meta.push_back (*here);
+	here ++;
+      }
+      parse_meta (meta, formatlistptr, metadata, getParents);
+      formatlistptr->nextptr = new format_t();
+      formatlistptr = formatlistptr->nextptr;
+
+    } else 
+      text.push_back (*here);
+
+    if (here != end) here ++;
+  }
+  if (!text.empty()) {
+    formatlistptr->command = comText;
+    formatlistptr->text = text;
+    formatlistptr->nextptr = new format_t();
+    formatlistptr = formatlistptr->nextptr;
+
+  }
+  return true;
+}
+
+
+static bool parse_action (text_t::const_iterator &here, const text_t::const_iterator &end, 
+			  format_t *formatlistptr, text_tset &metadata, bool &getParents) {
+
+  text_t::const_iterator it = findchar (here, end, '}');
+  if (it == end) return false;
+
+  text_t com = substr (here, it);
+  here = findchar (it, end, '{');
+  if (here == end) return false;
+  else here ++;
+
+  if (com == "If") formatlistptr->command = comIf;
+  else if (com == "Or") formatlistptr->command = comOr;
+  else return false;
+
+  int commacount = 0;
+  text_t text;
+  while (here != end) {
+
+    if (*here == '\\') {
+      here++;
+      if (here != end) text.push_back(*here);
+      
+    } 
+  
+    else if (*here == ',' || *here == '}' || *here == '{') {
+
+      if (formatlistptr->command == comOr) {
+	// the {Or}{this, or this, or this, or this} statement
+	format_t *or_ptr;
+	
+	// find the next unused orptr
+	if (formatlistptr->orptr == NULL) {
+	  formatlistptr->orptr = new format_t();
+	  or_ptr = formatlistptr->orptr;
+	} else {
+	  or_ptr = formatlistptr->orptr;
+	  while (or_ptr->nextptr != NULL)
+	    or_ptr = or_ptr->nextptr;
+	  or_ptr->nextptr = new format_t();
+	  or_ptr = or_ptr->nextptr;
+	}
+
+	if (!text.empty())
+	  {
+	    if (!parse_string(text, or_ptr, metadata, getParents)) { return false; }
+	  }
+
+	if (*here == '{')
+	  {
+	    // Supports: {Or}{[Booktitle],[Title],{If}{[XXXX],aaa,bbb}}
+	    // but not : {Or}{[Booktitle],[Title]{If}{[XXXX],aaa,bbb}}
+	    // The latter can always be re-written:
+	    // {Or}{[Booktitle],{If}{[Title],[Title]{If}{[XXXX],aaa,bbb}}}
+	    
+	    if (!text.empty()) // already used up allocated format_t
+	      {
+		// => allocate new one for detected action
+		or_ptr->nextptr = new format_t();
+		or_ptr = or_ptr->nextptr;
+	      }
+	    if (!parse_action(++here, end, or_ptr, metadata, getParents))
+	      { 
+		return false;
+	      }
+	  }
+	else
+	  {
+	    if (*here == '}') break;
+	  }
+	text.clear();
+
+      } 
+
+      // Parse an {If}{decide,do,else} statement
+      else {
+	
+	// Read the decision component.  
+	if (commacount == 0) {
+	  // Decsion can be a metadata element, or a piece of text.
+	  // Originally Stefan's code, updated 25/10/2000 by Gordon.
+
+	  text_t::const_iterator beginbracket = text.begin();
+	  text_t::const_iterator endbracket = (text.end() - 1);
+
+	  // Decision is based on a metadata element
+	  if ((*beginbracket == '[') && (*endbracket == ']')) {
+	    // Ignore the surrounding square brackets
+	    text_t meta = substr (beginbracket+1, endbracket);
+	    parse_meta (meta, formatlistptr->decision.meta, metadata, getParents);
+	    commacount ++;
+	    text.clear();
+	  } 
+
+	  // Decision is a piece of text (probably a macro like _cgiargmode_).
+	  else {
+	    formatlistptr->decision.command = dText;
+	    formatlistptr->decision.text = text;
+	    commacount ++;
+	    text.clear();
+	  }
+	} 
+
+	// Read the "then" and "else" components of the {If} statement.
+	else {
+	  format_t** nextlistptr = NULL;
+	  if (commacount == 1) {
+	    nextlistptr = &formatlistptr->ifptr;
+	  } else if (commacount == 2 ) {
+	    nextlistptr = &formatlistptr->elseptr;
+	  } else {
+	    return false;
+	  }
+
+	  if (!text.empty()) {
+	    if (*nextlistptr == NULL) {
+	      *nextlistptr = new format_t();
+	    } else {
+
+	      // skip to the end of any format_t statements already added
+	      while ((*nextlistptr)->nextptr != NULL)
+	      {
+		nextlistptr = &(*nextlistptr)->nextptr;
+	      }
+
+	      (*nextlistptr)->nextptr = new format_t();
+	      nextlistptr = &(*nextlistptr)->nextptr;
+	    }
+
+	    if (!parse_string (text, *nextlistptr, metadata, getParents)) 
+	      { 
+		return false; 
+	      }
+	    text.clear();
+	  }
+	  
+	  if (*here == '{')
+	    {
+	      if (*nextlistptr == NULL) {
+		*nextlistptr = new format_t();
+	      } else {
+		(*nextlistptr)->nextptr = new format_t();
+		nextlistptr = &(*nextlistptr)->nextptr;
+	      }
+
+	      if (!parse_action(++here, end, *nextlistptr, metadata, getParents))
+		{ 
+		  return false;
+		}
+	    }
+	  else 
+	    { 
+	      if (*here == '}') break;
+	      commacount ++; 
+	    }
+	}
+      }
+      
+    } else text.push_back(*here);
+    
+    if (here != end) here ++;
+  }
+
+  return true;
+}
+
+
+bool parse_formatstring (const text_t &formatstring, format_t *formatlistptr, 
+			 text_tset &metadata, bool &getParents) {
+
+  formatlistptr->clear();
+  getParents = false;
+
+  return (parse_string (formatstring, formatlistptr, metadata, getParents));
+}
+
+
+// note: all the format_date stuff is assuming that all Date metadata is going to
+// be of the form yyyymmdd, this is of course, crap ;)
+
+static text_t get_meta (ResultDocInfo_t &docinfo, const metadata_t &meta) {
+  
+  // make sure we have the requested metadata
+  MetadataInfo_tmap::iterator it = docinfo.metadata.find (meta.metaname);
+  if (it == docinfo.metadata.end()) return "";
+
+  MetadataInfo_t *parent = docinfo.metadata[meta.metaname].parent;
+
+  switch (meta.parentcommand) {
+  case pNone:
+    {
+      text_t classifier_metaname = docinfo.classifier_metadata_type;
+       int metaname_index 
+	= (classifier_metaname == meta.metaname) ? docinfo.classifier_metadata_offset : 0;
+      text_t metadata_item = docinfo.metadata[meta.metaname].values[metaname_index];
+      
+      if (meta.metaname == "Date")
+	return format_date (metadata_item);
+      else if (meta.metaname == "Language")
+	return iso639(metadata_item);
+      if (meta.metacommand == mCgiSafe) 
+	return cgi_safe (metadata_item);
+      else return metadata_item;
+    }
+
+  case pImmediate:
+    if (parent != NULL) {
+      if (meta.metaname == "Date") 
+	return format_date (parent->values[0]);
+      if (meta.metacommand == mCgiSafe) 
+	return cgi_safe (parent->values[0]);
+      else return parent->values[0];
+    }
+    break;
+
+  case pTop:
+    if (parent != NULL) {
+      while (parent->parent != NULL) parent = parent->parent;
+
+      if (meta.metaname == "Date") 
+	return format_date (parent->values[0]);
+      if (meta.metacommand == mCgiSafe) 
+	return cgi_safe (parent->values[0]);
+      else return parent->values[0];
+    }
+    break;
+
+  case pAll:
+    MetadataInfo_t *parent = docinfo.metadata[meta.metaname].parent;
+    if (parent != NULL) {
+      text_tarray tmparray;
+      while (parent != NULL) {
+	tmparray.push_back (parent->values[0]);
+	parent = parent->parent;
+      }
+      bool first = true;
+      text_t tmp;
+      text_tarray::reverse_iterator here = tmparray.rbegin();
+      text_tarray::reverse_iterator end = tmparray.rend();
+      while (here != end) {
+	if (!first) tmp += meta.parentoptions;
+	if (meta.metaname == "Date") tmp += format_date (*here);
+	else tmp += *here;
+	first = false;
+	here ++;
+      }
+      if (meta.metacommand == mCgiSafe) return cgi_safe (tmp);
+      else return tmp;
+    }
+  }
+  return "";
+}
+
+static text_t get_or (const text_t& collection, recptproto* collectproto,
+		      ResultDocInfo_t &docinfo, displayclass &disp,
+		      format_t *orptr,
+		      const text_t &link, const text_t &icon, 
+		      const text_t &text, bool highlight,
+		      ostream& logout) {
+
+  text_t tmp;
+  while (orptr != NULL) {
+
+    tmp = format_string (collection,collectproto, docinfo, disp, orptr, 
+			 link, icon, text, highlight, logout);
+    if (!tmp.empty()) return tmp;
+
+    orptr = orptr->nextptr;
+  }
+  return "";
+}
+
+static text_t get_if (const text_t& collection, recptproto* collectproto,
+		      ResultDocInfo_t &docinfo, displayclass &disp, 
+		      const decision_t &decision,
+		      format_t *ifptr, format_t *elseptr, const text_t &link, 
+		      const text_t &icon, const text_t &text, bool highlight,
+		      ostream& logout) 
+{
+
+  // If the decision component is a metadata element, then evaluate it
+  // to see whether we output the "then" or the "else" clause
+  if (decision.command == dMeta) {
+    if (get_meta (docinfo, decision.meta) != "") {
+      if (ifptr != NULL)
+	return get_formatted_string (collection,collectproto, docinfo, disp, ifptr, 
+				     link, icon, text, highlight, logout);
+    }
+    else {
+      if (elseptr != NULL)
+	return get_formatted_string (collection,collectproto, docinfo, disp, elseptr,
+				     link, icon, text, highlight, logout);
+    }
+  }
+
+  // If the decision component is text, then evaluate it (it is probably a 
+  // macro like _cgiargmode_) to decide what to output.
+  else if (decision.command == dText) {
+
+    text_t outstring;
+    disp.expandstring (decision.text, outstring);
+
+    // This is a tad tricky.  When we expand a string like _cgiargmode_, that is
+    // a cgi argument macro that has not been set, it evaluates to itself.
+    // Therefore, were have to say that a piece of text evalautes true if
+    // it is non-empty and if it is a cgi argument evaulating to itself.
+    if ((outstring != "") && !((outstring == decision.text) && (outstring[0] == '_'))) {
+      if (ifptr != NULL)
+	return get_formatted_string (collection, collectproto, docinfo, disp, ifptr, 
+				     link, icon, text, highlight, logout);
+    } else {
+      if (elseptr != NULL)
+	return get_formatted_string (collection, collectproto, docinfo, disp, elseptr,
+				     link, icon, text, highlight, logout);
+    }
+  }
+  
+  return "";
+}
+
+bool includes_metadata(const text_t& text)
+{
+  text_t::const_iterator here = text.begin();
+  text_t::const_iterator end = text.end();
+  while (here != end) {
+    if (*here == '[') return true;
+    here ++;
+  }
+
+  return false;
+}
+
+
+
+text_t format_string (const text_t& collection, recptproto* collectproto,
+		      ResultDocInfo_t &docinfo, displayclass &disp, 
+		      format_t *formatlistptr,
+		      const text_t &link, const text_t &icon,
+		      const text_t &text, bool highlight,
+		      ostream& logout) {
+
+  if (formatlistptr == NULL) return "";
+
+  switch (formatlistptr->command) {
+  case comText:
+    return formatlistptr->text;
+  case comLink:
+    return link;
+  case comEndLink:
+    if (link.empty()) return "";
+    else return "</a>";
+  case comHref:
+    return get_href(link);
+  case comIcon:
+    return icon;
+  case comNum:
+    return docinfo.result_num;
+  case comRel: //if [RelatedDocuments] appears in format string, collect relation data
+    return get_related_docs(collection, collectproto, docinfo, logout);
+  case comSummary:
+    return format_summary(collection,collectproto,docinfo,disp,text,highlight,logout);
+  case comMeta:
+
+    {
+      const text_t& metavalue =  get_meta (docinfo, formatlistptr->meta);
+
+      if (includes_metadata(metavalue))
+	{
+	  // text has embedded metadata in it => expand it
+	  FilterRequest_t request;
+	  FilterResponse_t response;
+
+	  request.getParents = false;
+	  
+	  format_t *expanded_formatlistptr = new format_t();
+	  parse_formatstring (metavalue, expanded_formatlistptr, 
+			      request.fields, request.getParents);
+	  
+	  // retrieve metadata
+	  get_info(docinfo.OID, collection, request.fields, request.getParents,
+		   collectproto, response, logout);
+	  
+	  if (!response.docInfo.empty())
+	    {
+	      text_t expanded_metavalue
+		= get_formatted_string(collection, collectproto, 
+				       response.docInfo[0], disp, expanded_formatlistptr, 
+				       link, icon, highlight, logout);
+	      
+	      return expanded_metavalue;
+	    }
+	  else
+	    {
+	      return metavalue;
+	    }
+	}
+      else
+	{
+	  return metavalue;
+	}
+    }
+  case comDoc:
+    return text;
+  case comHighlight:
+    if (highlight) return "<b>";
+    break;
+  case comEndHighlight:
+    if (highlight) return "</b>";
+    break;
+  case comIf:
+    return get_if (collection, collectproto, docinfo, disp, 
+		   formatlistptr->decision, formatlistptr->ifptr, 
+		   formatlistptr->elseptr, link, icon, text, highlight,
+		   logout);
+  case comOr:
+    return get_or (collection,collectproto, docinfo, disp, formatlistptr->orptr, 
+		   link, icon, text, highlight, logout);
+  }
+  return "";
+}
+
+
+
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t& docinfo, displayclass &disp,
+			     format_t* formatlistptr,
+			     const text_t& link, const text_t& icon, 
+			     const text_t& text, const bool highlight,
+			     ostream& logout) {
+
+  text_t ft;
+  while (formatlistptr != NULL) 
+    {
+      ft += format_string (collection, collectproto, docinfo, disp, formatlistptr, 
+			   link, icon, text, highlight, logout);
+      formatlistptr = formatlistptr->nextptr;
+    }
+
+  return ft;
+}
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp,
+			     format_t *formatlistptr,
+			     const text_t &link, const text_t &icon, 
+			     const bool highlight,
+			     ostream& logout) {
+
+  text_t text = "";
+
+  return get_formatted_string(collection, collectproto, docinfo, disp, formatlistptr,
+                              link, icon, text, highlight, logout);
+}
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp,
+			     format_t *formatlistptr,
+			     const text_t& text,
+			     ostream& logout) {
+
+  text_t link = "<a href=\"_httpdocument_&cl=search&d=" + docinfo.OID + "\">";
+  text_t icon = "_icontext_";
+  bool highlight = false;
+
+  return get_formatted_string(collection, collectproto, docinfo, disp, formatlistptr,
+			      link, icon, text, highlight, logout);
+}
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp,
+			     format_t *formatlistptr,
+			     ostream& logout) {
+
+  text_t text = "";
+
+  return get_formatted_string(collection, collectproto, docinfo, disp, formatlistptr,
+			      text, logout);
+}
+
+
+/* FUNCTION NAME: format_summary
+ * DESC: this is invoked when a [Summary] special metadata is processed.
+ * RETURNS: a query-biased summary for the document */
+
+text_t format_summary (const text_t& collection, recptproto* collectproto,
+		      ResultDocInfo_t &docinfo, displayclass &disp, 
+		      const text_t &text, bool highlight,
+		      ostream& logout) {
+  text_t textToSummarise, query;
+  if(text.empty()) { // get document text
+      DocumentRequest_t docrequest;
+      DocumentResponse_t docresponse;
+      comerror_t err;
+      docrequest.OID = docinfo.OID;
+      collectproto->get_document (collection, docrequest, docresponse, err, logout);
+      textToSummarise = docresponse.doc;
+  } else // in practice, this would not happen, because text is only 
+         // loaded with the [Text] command
+      textToSummarise = text;
+  disp.expandstring("_cgiargq_",query);
+  return summarise(textToSummarise,query,80);
+}
Index: /main/tags/2.38/gsdl/src/recpt/formattools.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/formattools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/formattools.h	(revision 21083)
@@ -0,0 +1,148 @@
+/**********************************************************************
+ *
+ * formattools.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef FORMATTOOLS_H
+#define FORMATTOOLS_H
+
+#include "text_t.h"
+#include "comtypes.h"
+#include "recptproto.h"
+#include "display.h"
+
+enum command_t {comIf, comOr, comMeta, comText, comLink, comEndLink, comNum, comIcon, 
+		comDoc, comHighlight, comEndHighlight, comRel, comHref, comSummary};
+enum pcommand_t {pNone, pImmediate, pTop, pAll};
+enum dcommand_t {dMeta, dText};
+enum mcommand_t {mNone, mCgiSafe};
+
+struct metadata_t {
+  void clear();
+  metadata_t () {clear();}
+
+  text_t metaname;
+  mcommand_t metacommand;
+  pcommand_t parentcommand;
+  text_t parentoptions;
+};
+
+
+// The decision component of an {If}{decision,true-text,false-text}
+// formatstring.  Te decision can be based on metadata or on text;
+// normally that text would be a macro like _cgiargmode_.  --gordon
+struct decision_t {
+  void clear();
+  decision_t () {clear();}
+
+  dcommand_t command;
+  metadata_t meta;
+  text_t text;
+};
+
+struct format_t {
+  void clear();
+  format_t () {clear();}
+
+  command_t command;
+  decision_t decision;
+  text_t text;
+  metadata_t meta;
+  format_t *nextptr;
+  format_t *ifptr;
+  format_t *elseptr;
+  format_t *orptr;
+};
+
+// the format structure used by this receptionist
+struct formatinfo_t {
+  void clear();
+  formatinfo_t () {clear();}
+
+  bool DocumentImages;
+  bool DocumentTitles;
+  text_t DocumentHeading;
+  bool DocumentContents;
+  bool DocumentArrowsBottom;
+  text_tarray DocumentButtons;
+  text_t DocumentText;
+  //-----------------
+  text_t RelatedDocuments;
+  //----------------
+  text_tmap formatstrings;
+  bool DocumentUseHTML;
+};
+
+bool is_table_content (const text_t &formatstring);
+bool is_table_content (const format_t *formatlistptr);
+
+bool get_formatstring (const text_t &key, const text_tmap &formatstringmap,
+		       text_t &formatstring);
+bool get_formatstring (const text_t &key1, const text_t &key2,  
+		       const text_tmap &formatstringmap,
+		       text_t &formatstring);
+
+text_t format_date (const text_t &date);
+
+text_t iso639 (const text_t &langcode);
+
+text_t get_href (const text_t &link);
+
+text_t get_related_docs(const text_t& collection, recptproto* collectproto,
+			  ResultDocInfo_t &docinfo, ostream& logout);
+
+
+bool parse_formatstring (const text_t &formatstring, format_t *formatlistptr, 
+			 text_tset &metadata, bool &getParents);
+
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp,
+			     format_t *formatlistptr,
+			     const text_t &link, const text_t &icon, 
+			     const text_t& t, const bool highlight, 
+			     ostream& logout);
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp,
+			     format_t *formatlistptr,
+			     const text_t &link, const text_t &icon, 
+			     const bool highlight,
+			     ostream& logout);
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp, 
+			     format_t *formatlistptr,
+			     const text_t &text,
+			     ostream& logout);
+
+text_t get_formatted_string (const text_t& collection, recptproto* collectproto,
+			     ResultDocInfo_t &docinfo, displayclass &disp, 
+			     format_t *formatlistptr, ostream& logout);
+
+
+
+#endif
+
+
Index: /main/tags/2.38/gsdl/src/recpt/historydb.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/historydb.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/historydb.cpp	(revision 21083)
@@ -0,0 +1,305 @@
+/**********************************************************************
+ *
+ * historydb.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "historydb.h"
+#include "fileutil.h"
+#include "cgiutils.h"
+#include "recptproto.h"
+#include "OIDtools.h"
+
+#define MAX_RECORDS 20
+
+// returns true on success (in which case historyinfo will contain
+// the information for this history)
+bool get_history_info (const text_t &userid, text_tarray &historyinfo, 
+		       const text_t &gsdlhome, ostream &logout) {
+
+  text_t historyfile = filename_cat(gsdlhome, "etc", "history.db");
+  
+  bool result = false;
+  // open the history database  
+  gdbmclass historydb;
+  
+  if (historydb.opendatabase(historyfile, GDBM_READER, 1000, true)) {
+    // get history list
+    text_t historyresult;
+    
+    historydb.getkeydata(userid, historyresult);
+    
+    if (historyresult != "") { //  there are entries, process them
+      
+      splitchar(historyresult.begin(), historyresult.end(), '\n', historyinfo);
+      result = true;
+    }
+    historydb.closedatabase();
+    
+  } else {
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii << "couldn't open history database " << historyfile << "\n";
+  }
+  return result;
+}
+
+
+// returns true on success
+// changed to only save 20 records per user, numbers not included
+// only save if there are already entries there, or if display=true
+bool set_history_info (const text_t &userid, const text_t &history, const text_t &gsdlhome, bool display) {
+
+  text_t historyfile = filename_cat(gsdlhome, "etc", "history.db");
+  
+  bool result = false;
+  // open the history database  
+  gdbmclass historydb;
+  
+  text_t oldhistoryresult;
+  text_t newhistoryresult;
+  int numentries=0;
+
+  if ( !historydb.opendatabase(historyfile, GDBM_READER, 1000, true)) {
+    // not created yet
+    oldhistoryresult="";
+    if (!display) return true; // dont need to save
+  }
+  else {
+
+    // get history list
+   if (! historydb.getkeydata(userid, oldhistoryresult)) {
+     oldhistoryresult="";
+     if (!display) return true; // dont need to save
+   }
+   historydb.closedatabase();
+  }
+
+  text_tarray entries;
+  
+  if (oldhistoryresult!="") {
+    splitchar(oldhistoryresult.begin(), oldhistoryresult.end(), '\n', entries);
+    numentries = entries.size();
+    if (numentries >= MAX_RECORDS) numentries = MAX_RECORDS-1;
+  }
+  
+  // open for writing
+  if (!historydb.opendatabase(historyfile, GDBM_WRCREAT, 1000, true)) return false;
+  
+  // add on new linethe new record to the front of the list, then add the
+  // appropriate entries from the old stuff 
+  newhistoryresult += history;
+  newhistoryresult += "\n";
+  for (int i=0; i<numentries;i++) {
+    newhistoryresult +=  entries[i]+"\n";
+  }
+  
+  if (historydb.setinfo(userid, newhistoryresult)) 
+    result=true; 
+  
+  historydb.closedatabase();
+  return result;
+}
+
+// deletes all a users history
+bool delete_all_history_info (const text_t &userid, const text_t &gsdlhome) {
+
+  text_t historyfile = filename_cat(gsdlhome, "etc", "history.db");
+  
+  // open the history database  
+  gdbmclass historydb;
+  
+  if ( !historydb.opendatabase(historyfile, GDBM_WRITER, 1000, true)) return false;
+
+  historydb.deletekey(userid);
+  historydb.closedatabase();
+  return true;
+  
+}
+
+// retrieves the value of one of the arguments
+void parse_saved_args(text_t &args, text_t key, text_t &value)
+{
+  text_t::iterator here = args.begin();
+  text_t::iterator end = args.end();
+  text_t::iterator it;
+  while (here != end) {
+    if(*here==key[0]) {
+      it=findchar(here, end, '=');
+      if (it==end) {
+	value=""; return;
+      }
+      text_t entry = substr(here, it);
+      if (entry==key) {
+	here=it+1;
+      	it=findchar(here, end, '&');
+	value = substr(here, it);
+	return;
+      }
+    }
+    here++;
+  }// while
+}
+
+// retrieves the value of all of the arguments
+void parse_saved_args(text_t &args, infodbclass &info)
+{
+  text_t::iterator here = args.begin();
+  text_t::iterator end = args.end();
+  text_t::iterator it;
+  text_tarray values;
+
+  splitchar(here, end, '&', values);
+  
+  text_tarray::iterator start = values.begin();
+  text_tarray::iterator stop = values.end();
+
+  text_t key;
+  text_t value;
+  while(start!=stop) {
+
+    here=(*start).begin();
+    end=(*start).end();
+    it=findchar(here, end, '=');
+    if (it!=end) {
+      key = substr(here, it);
+      value = substr(it+1, end);
+      
+      info[key]=value;
+    }
+    start++;
+  }
+}
+
+
+void split_saved_query(text_t &query, text_t &numdocs, text_t &cgiargs)
+{
+  text_t::iterator begin = query.begin();
+  text_t::iterator end = query.end();
+  
+  while (*begin >='0'&& *begin <='9') { // get the digits for numdocs
+    numdocs.push_back(*begin);
+    begin++;
+  }          
+                 
+  if (*begin == '+') {  // get the + if there
+    numdocs.push_back(*begin);
+    begin++;
+  }
+  if (*begin == ':') { // have the old format - previous bit was record number
+    numdocs.clear();
+    begin++;
+
+    while(*begin >='0' && *begin <='9') { // get the digits
+      numdocs.push_back(*begin);
+      begin++;
+    }
+    if (*begin == '+') { // get the + if there
+      numdocs.push_back(*begin);
+      begin++;
+    }
+  }
+  cgiargs += (substr(begin, end));  // put rest of query into cgiargs
+
+}
+
+void format_user_info (text_t &historyargs, text_t &userinfo,  
+		       cgiargsclass &args,
+		       recptprotolistclass *protos, ostream &logout) 
+{
+  text_tset metadata;
+  userinfo.clear();
+
+  infodbclass argsinfo;
+  parse_saved_args(historyargs, argsinfo);
+  
+  text_t collect = argsinfo["c"];
+  if (collect=="") {
+    userinfo="";
+    return;
+  }
+
+  if (collect != args["c"]) {
+    userinfo += collect+", ";
+  }
+  
+  if (argsinfo["h"] != args["h"]) {
+  
+    recptproto *collectproto = protos->getrecptproto(collect,logout);
+    if (collectproto == NULL) {
+      userinfo="";
+      return;
+    }
+    metadata.insert(argsinfo["h"]);
+    FilterResponse_t response;
+    
+    get_info("collection", collect, metadata, false, collectproto, response, logout);
+    text_t index = response.docInfo[0].metadata[argsinfo["h"]].values[0];
+    if (!index.empty()) {
+      userinfo += index+", ";
+    }
+  }
+
+  if (argsinfo["b"] != args["b"] || argsinfo["t"] != args["t"]) {
+    text_t mode;
+    if (argsinfo["b"]=="0") { // simple mode
+      if (argsinfo["t"]=="0") {
+	mode = " _texthallwords_";
+      }
+      else { // t=1
+	mode = " _texthsomewords_";
+      }
+      
+    } 
+    else { // advanced mode
+      if (argsinfo["t"]=="0") {
+	mode = " _texthboolean_";
+      }
+      else {
+	mode = " _texthranked_";
+      }
+    }
+    userinfo += mode+", ";
+  }
+  
+  if (argsinfo["k"] != args["k"]) {
+    text_t options;
+    if (argsinfo["k"]=="0") {
+      options = " _texthcaseoff_";
+    }
+    else {
+      options = " _texthcaseon_";
+    }
+    userinfo += options+", ";
+  }
+
+  if (argsinfo["s"] != args["s"]) {
+    text_t stem;
+    if (argsinfo["s"]=="0") {
+      stem = " _texthstemoff_";
+    }
+    else {
+      stem = " _texthstemon_";
+    }
+    userinfo += stem+", ";
+  }
+
+}
Index: /main/tags/2.38/gsdl/src/recpt/historydb.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/historydb.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/historydb.h	(revision 21083)
@@ -0,0 +1,78 @@
+/**********************************************************************
+ *
+ * historydb.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef HISTORYDB_H
+#define HISTORYDB_H
+
+#include "infodbclass.h"
+#include "text_t.h"
+#include "recptproto.h"
+#include "cgiargs.h"
+
+/*
+struct HistRecord {
+  text_t entry;
+  bool save;
+};
+
+struct ltinttext_t
+{
+  bool operator()(const text_t &t1, const text_t &t2) const
+  { return t1.getint() < t2.getint(); }
+};
+
+
+typedef map<text_t, HistRecord, ltinttext_t> HistRecordmap;
+
+*/
+// returns true on success (in which case historyinfo will contain
+// the information for this history)
+bool get_history_info (const text_t &userid, text_tarray &historyinfo, 
+		       const text_t &gsdlhome, ostream &logout);
+
+// returns true on success
+bool set_history_info (const text_t &userid, const text_t &historyinfo, 
+		       const text_t &gsdlhome, bool display);
+
+// delete all history for one user
+bool delete_all_history_info (const text_t &userid, const text_t &gsdlhome);
+
+// retrieves the value of an arg (key) from a list of cgi args
+// in the form a=q&b=1&...
+void parse_saved_args(text_t &args, text_t key, text_t &value);
+
+// extracts out the components of an entry in the database
+// currently:
+// numdocs cgiargs
+void split_saved_query(text_t &query,  text_t &numdocs, text_t &cgiargs);
+
+// takes the cgiarg string, and outputs it in some form useful
+// to the user
+void format_user_info (text_t &cgiargs, text_t &info, 
+		       cgiargsclass &args,
+		       recptprotolistclass *protos, ostream &logout);
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,181 @@
+/**********************************************************************
+ *
+ * hlistbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "hlistbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+
+hlistbrowserclass::hlistbrowserclass () {
+}
+
+hlistbrowserclass::~hlistbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t hlistbrowserclass::get_browser_name () {
+  return "HList";
+}
+
+void hlistbrowserclass::load_metadata_defaults (text_tset &metadata) {
+  metadata.insert ("doctype");
+}
+
+text_t hlistbrowserclass::get_default_formatstring () {
+  return "[link][highlight][Title][/highlight][/link]";
+}
+
+// need to change OID to it's child 
+void hlistbrowserclass::processOID (cgiargsclass &args, recptproto *collectproto,
+				    ostream &logout) {
+
+  text_t OID = args["d"];
+  bool is_classify = false;
+  if (OID.empty()) {
+    is_classify = true;
+    OID = args["cl"];
+  }
+
+  FilterResponse_t response;
+  text_tset metadata;
+  metadata.insert ("childtype");
+  text_t classifytype = "Invisible";
+  text_t child_doctype;
+
+  text_tarray OIDs;
+
+  while (classifytype == "Invisible") {
+    OIDs.erase (OIDs.begin(), OIDs.end());
+    
+    OIDs.push_back (OID);
+    OIDs.push_back (OID + ".fc");
+
+    get_info (OIDs, args["c"], metadata, false, collectproto, response, logout);
+
+    OID = response.docInfo[1].OID;
+    classifytype = response.docInfo[0].metadata["childtype"].values[0];
+  }
+  if (is_classify) args["cl"] = OID;
+  else args["d"] = OID;
+}
+
+int hlistbrowserclass::output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+					     const text_t& collection, int colnumber, 
+					     format_t *formatlistptr, bool use_table, 
+					     text_tset &metadata, bool &getParents, 
+					     recptproto *collectproto, displayclass &disp, 
+					     outconvertclass &outconvert, ostream &textout, 
+					     ostream &logout) {
+
+  // expanded contents are going to cause some nasty recursions
+  // so we'll only continue if being passed the current section
+  if ((args["gc"] == 1) && (section.OID != args["d"])) return 0;
+
+  // get all siblings
+  FilterResponse_t response;
+  text_t &arg_cl = args["cl"];
+  get_children (section.OID + ".pr", args["c"], metadata, getParents, 
+		collectproto, response, logout);
+
+					
+  if (use_table || colnumber > 0) {
+    textout << "<table><tr><td>";
+    // get tab size
+    text_t tab; int itab;
+    disp.expandstring ("Global", "_tabwidth_", tab);
+    itab = tab.getint();
+    if (colnumber > 0) textout << outconvert << disp 
+			       << "<img src=\"_httpimg_/space.gif\" width=" 
+			       << (itab*colnumber) << ">";
+    textout << "</td>\n";
+  }
+
+  textout << "<table><tr>\n";
+
+  ResultDocInfo_tarray::iterator tsibling = response.docInfo.begin();
+  ResultDocInfo_tarray::iterator esibling = response.docInfo.end();
+
+  text_t icon, link;
+  int num_chars=0; // see note below - jrm21
+  while (tsibling != esibling) {
+
+    bool highlight = false;
+    text_t &doctype = (*tsibling).metadata["doctype"].values[0];
+
+    if ((*tsibling).OID == section.OID) {
+      link.clear();
+      highlight = true;
+    } else {
+      link = "<a href=\"_httpdocument_";
+      if (doctype == "classify") 
+	link += "&cl=" + (*tsibling).OID + "\">";
+      else
+	link += "&cl=" + arg_cl + "&d=" + (*tsibling).OID + "\">";
+    }
+
+    text_t fmt_str=get_formatted_string (collection, collectproto,
+					  *tsibling, disp, formatlistptr,
+					  link, icon, highlight, logout);
+
+    /* this is awful. Someone please come up with a better way to prevent
+       the table of contents when browsing metadata from becoming too wide.
+       This is an attempt to add new rows when the number of characters in
+       the current row becomes too high. It doesn't know about macros in the
+       string, though... -- jrm21 */
+
+    char *tmp_str=fmt_str.getcstr();
+    char *end_str=tmp_str+strlen(tmp_str);
+    while (tmp_str<end_str) {
+      if (*tmp_str=='<') {    // for html tags
+	while (*tmp_str!='>') tmp_str++; 
+      } else if (*tmp_str=='&') { // for html entities
+	while (*tmp_str!=';') tmp_str++; 
+	num_chars++;
+      } else num_chars++;
+      tmp_str++;
+    }
+
+    if (num_chars>100) { // this is fairly arbitrary...
+      textout << "</tr>\n<tr>";
+      num_chars=0;
+    }
+
+    textout << "<td>" << outconvert << disp << fmt_str << "</td>\n";
+    tsibling ++;
+  }
+
+  textout << "</tr></table>\n";
+  if (use_table  || colnumber > 0) textout << "</tr></table>\n";
+  return 0;
+}
+
+int hlistbrowserclass::output_section_group (FilterResponse_t &/*sections*/, cgiargsclass &/*args*/,
+					     const text_t &/*collection*/, int /*colnumber*/, 
+					     format_t * /*formatlistptr*/, bool /*use_table*/, 
+					     text_tset &/*metadata*/, bool &/*getParents*/,
+					     recptproto * /*collectproto*/, displayclass &/*disp*/, 
+					     outconvertclass &/*outconvert*/, ostream &/*textout*/, 
+					     ostream &/*logout*/) {
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/hlistbrowserclass.h	(revision 21083)
@@ -0,0 +1,63 @@
+/**********************************************************************
+ *
+ * hlistbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef HLISTBROWSERCLASS_H
+#define HLISTBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class hlistbrowserclass : public browserclass {
+protected:
+
+public:
+  hlistbrowserclass ();
+  virtual ~hlistbrowserclass ();
+
+  // returns the name that specifies the browserclass type
+  text_t get_browser_name ();
+
+  virtual void load_metadata_defaults (text_tset &metadata);
+
+  virtual text_t get_default_formatstring ();
+  
+  virtual void processOID (cgiargsclass &args, recptproto *collectproto,
+			   ostream &logout);
+
+  virtual int output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+  virtual int output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,63 @@
+/**********************************************************************
+ *
+ * htmlbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "htmlbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+
+htmlbrowserclass::htmlbrowserclass () {
+}
+
+htmlbrowserclass::~htmlbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t htmlbrowserclass::get_browser_name () {
+  return "HTML";
+}
+
+// redirect to html page
+void htmlbrowserclass::processOID (cgiargsclass &args, recptproto *collectproto,
+				   ostream &logout) {
+
+  // should only reach here from within a classification
+  if (!args["d"].empty()) return;
+  if (args["cl"].empty()) return;
+
+  FilterRequest_t request;
+  FilterResponse_t response;
+  comerror_t err;
+  request.filterName = "NullFilter";
+  request.filterResultOptions = FROID;
+  request.docSet.push_back (args["cl"] + ".fc");
+  collectproto->filter (args["c"], request, response, err, logout);
+
+  if (err != noError || response.docInfo[0].OID.empty()) return;
+
+  // redirect to html page
+  args["a"] = "p";
+  args["p"] = "html";
+  args["hp"] = response.docInfo[0].OID;
+}
Index: /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlbrowserclass.h	(revision 21083)
@@ -0,0 +1,49 @@
+/**********************************************************************
+ *
+ * htmlbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef HTMLBROWSERCLASS_H
+#define HTMLBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class htmlbrowserclass : public browserclass {
+protected:
+
+public:
+
+  htmlbrowserclass ();
+  virtual ~htmlbrowserclass ();
+
+  // returns the name that specifies the browserclass type
+  virtual text_t get_browser_name ();
+
+  void processOID (cgiargsclass &args, recptproto *collectproto,
+		   ostream &logout);
+
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/htmlgen.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlgen.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlgen.cpp	(revision 21083)
@@ -0,0 +1,97 @@
+/**********************************************************************
+ *
+ * htmlgen.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "htmlgen.h"
+#include "unitool.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\map>
+#elif defined(GSDL_USE_STL_H)
+#  include <map.h>
+#else
+#  include <map>
+#endif
+
+
+
+// highlighttext highlights query terms in text string and 
+// outputs the resulting text string
+void highlighttext (text_tarray &termvars, displayclass &disp, text_t &text,
+		    outconvertclass &outconvert, ostream &textout, ostream &/*logout*/) {
+  map<text_t, int, lttext_t> terms;
+  map<text_t, int, lttext_t>::const_iterator it;
+  for (unsigned int i = 0; i < termvars.size(); i++) {
+    terms[termvars[i]] = 1;
+  }
+
+  // get the text to start and end a hightlight
+  text_t starthighlight = "<b><u>";
+  text_t endhighlight = "</u></b>";
+  if (disp.isdefaultmacro("Global", "starthighlight"))
+    disp.expandstring("Global", "_starthighlight_", starthighlight);
+  if (disp.isdefaultmacro("Global", "endhighlight"))
+    disp.expandstring("Global", "_endhighlight_", endhighlight);
+
+
+  text_t::iterator here = text.begin(); 
+  text_t::iterator end = text.end();
+  text_t word, buffer;
+  while (here != end) {
+    if (is_unicode_letdig(*here)) {
+      // not word boundary
+      word.push_back(*here);
+      here++;
+
+    } else {
+      // found word boundary
+      // add last word if there was one
+      if (!word.empty()) {
+	it = terms.find(word);
+	if (it != terms.end()) {
+	  word = starthighlight + word + endhighlight;
+	}
+	buffer += word;
+        word.clear();
+      }
+
+      if (*here == '<') {
+        // skip over rest of html tag
+	while ((here != end) && (*here != '>')) {
+	  buffer.push_back(*here);
+	  here++;
+	}
+      }
+
+      buffer.push_back(*here);
+      here++;
+
+      if (buffer.size() > 1024) {
+	textout << outconvert << buffer;
+	buffer.clear();
+      }
+    }
+  }
+  textout << outconvert << buffer;
+}
Index: /main/tags/2.38/gsdl/src/recpt/htmlgen.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlgen.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlgen.h	(revision 21083)
@@ -0,0 +1,50 @@
+/**********************************************************************
+ *
+ * htmlgen.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef HTMLGEN_H
+#define HTMLGEN_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "display.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+
+// highlighttext highlights query terms in text string and 
+// outputs the resulting text string
+void highlighttext (text_tarray &termvars, displayclass &disp, text_t &text,
+		    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/htmlutils.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlutils.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlutils.cpp	(revision 21083)
@@ -0,0 +1,42 @@
+/**********************************************************************
+ *
+ * htmlutils.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "htmlutils.h"
+
+text_t html_safe (const text_t &instring) {
+  
+  text_t outstring;
+  text_t::const_iterator here = instring.begin();
+  text_t::const_iterator end = instring.end();
+  while (here != end) {
+    if (*here == '"') outstring += "&quot;";
+    else if (*here == '&') outstring += "&amp;";
+    else if (*here == '<') outstring += "&lt;";
+    else if (*here == '>') outstring += "&gt;";
+    else outstring.push_back(*here);
+    here ++;
+  }
+  return outstring;
+}
Index: /main/tags/2.38/gsdl/src/recpt/htmlutils.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/htmlutils.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/htmlutils.h	(revision 21083)
@@ -0,0 +1,35 @@
+/**********************************************************************
+ *
+ * htmlutils.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef HTMLUTILS_H
+#define HTMLUTILS_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+text_t html_safe (const text_t &instring);
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/infodbclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/infodbclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/infodbclass.cpp	(revision 21083)
@@ -0,0 +1,552 @@
+/**********************************************************************
+ *
+ * infodbclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "infodbclass.h"
+#include "unitool.h"
+#include "gsdlunicode.h"
+#include "fileutil.h"
+#include "OIDtools.h"
+#include <stdlib.h>
+
+
+
+
+// constructors
+infodbclass::infodbclass () {
+}
+
+void infodbclass::setinfo (const text_t &key, const text_t &value) {
+  text_tarray &tarr = info[key];
+  tarr.erase(tarr.begin(), tarr.end());
+  tarr.push_back(value);
+}
+
+void infodbclass::setintinfo (const text_t &key, int value) {
+  setinfo (key, value);
+}
+
+void infodbclass::setcinfo (const text_t &key, unsigned short c) {
+  text_t t;
+  t.push_back (c);
+  setinfo (key, t);
+}
+
+text_t *infodbclass::getinfo (const text_t &key) {
+  iterator here = info.find (key);
+  if (here == info.end()) return NULL;
+
+  if ((*here).second.empty()) return NULL;
+  
+  return &((*here).second[0]);
+}
+
+int infodbclass::getintinfo (const text_t &key) {
+  text_t *t = getinfo (key);
+  if (t == NULL) return 0;
+  return t->getint();
+}
+
+text_t &infodbclass::operator[] (const text_t &key) {
+  text_tarray &tarr = info[key];
+  if (tarr.empty()) {
+    text_t e;
+    tarr.push_back(e);
+  }
+  return tarr[0];
+}
+
+
+void infodbclass::addinfo (const text_t &key, const text_t &value) {
+  text_tarray &tarr = info[key];
+  tarr.push_back (value);
+}
+
+void infodbclass::addintinfo (const text_t &key, int value) {
+  addinfo (key, value);
+}
+
+void infodbclass::addcinfo (const text_t &key, unsigned short c) {
+  text_t t;
+  t.push_back(c);
+  addinfo (key, t);
+}
+
+text_tarray *infodbclass::getmultinfo (const text_t &key) {
+  iterator here = info.find (key);
+  if (here == info.end()) return NULL;
+
+  return &((*here).second);
+}
+
+
+gdbmclass::~gdbmclass() {
+  closedatabase();
+}
+
+// returns true if opened
+bool gdbmclass::opendatabase (const text_t &filename, int mode, int num_retrys, 
+#ifdef __WIN32__
+			      bool need_filelock
+#else
+                              bool
+#endif
+			      ) {
+  text_t data_location;
+  int block_size = 512;
+  
+  if (gdbmfile != NULL) {
+    if (openfile == filename) return true;
+    else closedatabase ();
+  }
+
+  openfile = filename;
+  
+  char *namebuffer = filename.getcstr();
+  do {
+#ifdef __WIN32__
+    gdbmfile = gdbm_open (namebuffer, block_size, mode, 00664, NULL, (need_filelock) ? 1 : 0);
+#else
+    gdbmfile = gdbm_open (namebuffer, block_size, mode, 00664, NULL);
+#endif
+    num_retrys--;
+  } while (num_retrys>0 && gdbmfile==NULL &&
+	   (gdbm_errno==GDBM_CANT_BE_READER || gdbm_errno==GDBM_CANT_BE_WRITER));
+  delete namebuffer;
+  
+  if (gdbmfile == NULL && logout != NULL) {
+    outconvertclass text_t2ascii;
+    (*logout) << text_t2ascii << "database open failed on: " << filename << "\n";
+  }
+
+  return (gdbmfile != NULL);
+}
+
+void gdbmclass::closedatabase () {
+  if (gdbmfile == NULL) return;
+  
+  gdbm_close (gdbmfile);
+  gdbmfile = NULL;
+  openfile.clear();
+}
+
+
+// returns true on success
+bool gdbmclass::setinfo (const text_t &key, const infodbclass &info) {
+  if (gdbmfile == NULL) return false;
+
+  text_t subkey;
+  text_t data;
+
+  // get all the keys and values
+  infodbclass::const_iterator info_here = info.begin();
+  infodbclass::const_iterator info_end = info.end();
+  while (info_here != info_end) {
+    // add the key
+    subkey.clear();
+    subkey.push_back('<');
+    text_t::const_iterator subkey_here = (*info_here).first.begin();
+    text_t::const_iterator subkey_end = (*info_here).first.end();
+    while (subkey_here != subkey_end) {
+      if (*subkey_here == '>') {
+	subkey.push_back('\\'); subkey.push_back('>');
+      } else if (*subkey_here == '\n') {
+	subkey.push_back('\\'); subkey.push_back('n');
+      } else if (*subkey_here == '\r') {
+	subkey.push_back('\\'); subkey.push_back('r');
+      } else if (*subkey_here == '\\') {
+	subkey.push_back('\\'); subkey.push_back('\\');
+      } else {
+	subkey.push_back (*subkey_here);
+      }
+      subkey_here++;
+    }
+    subkey.push_back('>');
+
+    // add the values
+    text_tarray::const_iterator subvalue_here = (*info_here).second.begin();
+    text_tarray::const_iterator subvalue_end = (*info_here).second.end();
+    while (subvalue_here != subvalue_end) {
+      data += subkey;
+      
+      text_t::const_iterator thissubvalue_here = (*subvalue_here).begin();
+      text_t::const_iterator thissubvalue_end = (*subvalue_here).end();
+      while (thissubvalue_here != thissubvalue_end) {
+	if (*thissubvalue_here == '>') {
+	  data.push_back('\\'); data.push_back('>');
+	} else if (*thissubvalue_here == '\n') {
+	  data.push_back('\\'); data.push_back('n');
+	} else if (*thissubvalue_here == '\r') {
+	  data.push_back('\\'); data.push_back('r');
+	} else if (*thissubvalue_here == '\\') {
+	  data.push_back('\\'); data.push_back('\\');
+	} else {
+	  data.push_back (*thissubvalue_here);
+	}
+	
+	thissubvalue_here++;
+      }
+      
+      data.push_back('\n');
+      subvalue_here++;
+    }
+
+    info_here++;
+  }
+
+  // store the value
+  datum key_data;
+  datum data_data;
+
+  // get a utf-8 encoded c string of the unicode key
+  key_data.dptr = (to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL) {
+    if (logout != NULL) (*logout) << "gdbmclass: out of memory\n";
+    return false;
+  }
+  key_data.dsize = strlen (key_data.dptr);
+
+  data_data.dptr = (to_utf8(data)).getcstr();
+  if (data_data.dptr == NULL) {
+    if (logout != NULL) (*logout) << "gdbmclass: out of memory\n";
+    delete key_data.dptr;
+  }
+  data_data.dsize = strlen (data_data.dptr);
+
+  int ret = gdbm_store (gdbmfile, key_data, data_data, GDBM_REPLACE);
+  delete key_data.dptr;
+  delete data_data.dptr;
+
+  return (ret == 0);
+
+}
+
+//returns true on success
+bool gdbmclass::setinfo (const text_t &key, const text_t &data) {
+  if (gdbmfile == NULL) return false;
+  
+  // store the value
+  datum key_data;
+  datum data_data;
+
+  // get a utf-8 encoded c string of the unicode key
+  key_data.dptr = (to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL) {
+    if (logout != NULL) (*logout) << "gdbmclass: out of memory\n";
+    return false;
+  }
+  key_data.dsize = strlen (key_data.dptr);
+
+  data_data.dptr = (to_utf8(data)).getcstr();
+  if (data_data.dptr == NULL) {
+    if (logout != NULL) (*logout) << "gdbmclass: out of memory\n";
+    delete key_data.dptr;
+  }
+  data_data.dsize = strlen (data_data.dptr);
+
+  int ret = gdbm_store (gdbmfile, key_data, data_data, GDBM_REPLACE);
+  delete key_data.dptr;
+  delete data_data.dptr;
+
+  return (ret == 0);
+
+}
+
+
+void gdbmclass::deletekey (const text_t &key) {
+  if (gdbmfile == NULL) return;
+
+  // get a utf-8 encoded c string of the unicode key
+  datum key_data;
+  key_data.dptr = (to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL) return;
+  key_data.dsize = strlen (key_data.dptr);
+
+  // delete the key
+  gdbm_delete (gdbmfile, key_data);
+
+  // free up the key memory
+  delete key_data.dptr;
+}
+
+
+// getfirstkey and getnextkey are used for traversing the database
+// no insertions or deletions should be carried out while traversing
+// the database. when there are no keys left to visit in the database
+// an empty string is returned.
+text_t gdbmclass::getfirstkey () {
+  if (gdbmfile == NULL) return "";
+
+  // get the first key
+  datum firstkey_data = gdbm_firstkey (gdbmfile);
+  if (firstkey_data.dptr == NULL) return "";
+
+  // convert it to text_t
+  text_t firstkey;
+  firstkey.setcarr (firstkey_data.dptr, firstkey_data.dsize);
+  free (firstkey_data.dptr);
+  return to_uni(firstkey);  // convert to unicode
+}
+
+text_t gdbmclass::getnextkey (const text_t &key) {
+  if (gdbmfile == NULL || key.empty()) return "";
+
+  // get a utf-8 encoded c string of the unicode key
+  datum key_data;
+  key_data.dptr = (to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL) return "";
+  key_data.dsize = strlen (key_data.dptr);
+  
+  // get the next key
+  datum nextkey_data = gdbm_nextkey (gdbmfile, key_data);
+  if (nextkey_data.dptr == NULL) {
+    delete key_data.dptr;
+    return "";
+  }
+
+  // convert it to text_t
+  text_t nextkey;
+  nextkey.setcarr (nextkey_data.dptr, nextkey_data.dsize);
+  free (nextkey_data.dptr);
+  delete key_data.dptr;
+  return to_uni(nextkey);  // convert to unicode
+}
+
+
+// replaces the .fc, .lc, .pr, .ns and .ps syntax (first child, 
+// last child, parent, next sibling, previous sibling) 
+// it expects child, parent, etc. to exist if syntax has been used
+// so you should test before using
+text_t gdbmclass::translate_OID (const text_t &inOID, infodbclass &info) {
+
+  if (inOID.size() < 4) return inOID;
+  if (findchar (inOID.begin(), inOID.end(), '.') == inOID.end()) return inOID;
+
+  text_t OID = inOID;
+  text_tarray tailarray;
+  text_t tail = substr (OID.end()-3, OID.end());
+  while (tail == ".fc" || tail == ".lc" || tail == ".pr" || 
+	 tail == ".ns" || tail == ".ps") {
+    tailarray.push_back(tail);
+    OID.erase (OID.end()-3, OID.end());
+    tail = substr (OID.end()-3, OID.end());
+  }
+
+  if (!tailarray.size()) return inOID;
+  text_tarray::const_iterator begin = tailarray.begin();
+  text_tarray::const_iterator here = tailarray.end() - 1;
+
+  while (here >= begin) {
+
+    if (*here == ".fc")
+      get_first_child (OID, info);
+    else if (*here == ".lc")
+      get_last_child (OID, info);
+    else if (*here == ".pr")
+      OID = get_parent (OID);
+    else if (*here == ".ns")
+      get_next_sibling (OID, info);
+    else if (*here == ".ps")
+      get_previous_sibling (OID, info);
+    
+    here --;
+  }
+  return OID;
+}
+
+void gdbmclass::get_first_child (text_t &OID, infodbclass &info) {
+
+  text_t firstchild;
+  if (getinfo (OID, info)) {
+    text_t &contains = info["contains"];
+    if (!contains.empty()) {
+      text_t parent = OID;
+      getdelimitstr (contains.begin(), contains.end(), ';', firstchild);
+      if (firstchild.empty()) OID = contains;
+      else OID = firstchild;
+      if (*(OID.begin()) == '"') translate_parent (OID, parent);
+    }
+  }
+}
+
+void gdbmclass::get_last_child (text_t &OID, infodbclass &info) {
+
+  text_tarray children;
+  if (getinfo (OID, info)) {
+    text_t &contains = info["contains"];
+    if (!contains.empty()) {
+      text_t parent = OID;
+      splitchar (contains.begin(), contains.end(), ';', children);
+      OID = children.back();
+      if (*(OID.begin()) == '"') translate_parent (OID, parent);
+    }
+  }
+}
+  
+void gdbmclass::get_next_sibling (text_t &OID, infodbclass &info) {
+
+  text_tarray siblings;
+  text_t parent = get_parent (OID);
+	     
+  if (getinfo (parent, info)) {
+    text_t &contains = info["contains"];
+    if (!contains.empty()) {
+      splitchar (contains.begin(), contains.end(), ';', siblings);
+      text_tarray::const_iterator here = siblings.begin();
+      text_tarray::const_iterator end = siblings.end();
+      text_t shrunk_OID = OID;
+      shrink_parent (shrunk_OID);
+      while (here != end) {
+	if (*here == shrunk_OID && (here+1 != end)) {
+	  OID = *(here+1);
+	  if (*(OID.begin()) == '"') translate_parent (OID, parent);
+	  break;
+	}
+	here ++;
+      }
+    }
+  }
+}
+
+void gdbmclass::get_previous_sibling (text_t &OID, infodbclass &info) {
+
+  text_tarray siblings;
+  text_t parent = get_parent (OID);
+
+  if (getinfo (parent, info)) {
+    text_t &contains = info["contains"];
+    if (!contains.empty()) {
+      splitchar (contains.begin(), contains.end(), ';', siblings);
+      text_tarray::const_iterator here = siblings.begin();
+      text_tarray::const_iterator end = siblings.end();
+      text_t shrunk_OID = OID;
+      shrink_parent (shrunk_OID);
+      while (here != end) {
+	if (*here == shrunk_OID && (here != siblings.begin())) {
+	  OID = *(here-1);
+	  if (*(OID.begin()) == '"') translate_parent (OID, parent);
+	  break;
+	}
+	here ++;
+      }
+    }
+  }
+}
+
+// returns true on success
+bool gdbmclass::getinfo (text_t key, infodbclass &info) {
+  text_t data;
+  
+  if (!getkeydata (key, data)) return false;
+  text_t::iterator here = data.begin ();
+  text_t::iterator end = data.end ();
+  
+  text_t ikey, ivalue;
+  info.clear (); // reset info
+  
+  while (getinfoline (here, end, ikey, ivalue)) {
+    info.addinfo (ikey, ivalue);
+  }
+  
+  return true;
+}
+
+// returns true if exists
+bool gdbmclass::exists (text_t key) {
+  text_t data;
+  return getkeydata (key, data);
+}
+
+// returns true on success
+bool gdbmclass::getkeydata (text_t key, text_t &data) {
+  datum key_data;
+  datum return_data;
+
+  if (gdbmfile == NULL) return false;
+  
+  // get a utf-8 encoded c string of the unicode key
+  key_data.dptr = (to_utf8(key)).getcstr();
+  if (key_data.dptr == NULL) {
+    if (logout != NULL) (*logout) << "gdbmclass: out of memory\n";
+    return false;
+  }
+  key_data.dsize = strlen (key_data.dptr);
+  
+  // fetch the result
+  return_data = gdbm_fetch (gdbmfile, key_data);
+  delete key_data.dptr;
+  
+  if (return_data.dptr == NULL) return false;
+
+  data.setcarr (return_data.dptr, return_data.dsize);
+  free (return_data.dptr);
+  data = to_uni(data);  // convert to unicode
+
+  return true;
+}
+
+// returns true on success
+bool gdbmclass::getinfoline (text_t::iterator &here, text_t::iterator end, 
+			     text_t &key, text_t &value) {
+  key.clear();
+  value.clear();
+
+  // ignore white space
+  while (here != end && is_unicode_space (*here)) here++;
+
+  // get the '<'
+  if (here == end || *here != '<') return false;
+  here++;
+  
+  // get the key
+  while (here != end && *here != '>') {
+    key.push_back(*here);
+    here++;
+  }
+  
+  // get the '>'
+  if (here == end || *here != '>') return false;
+  here++;
+  
+  // get the value
+  while (here != end && *here != '\n') {
+    if (*here == '\\') { 
+      // found escape character
+      here++;
+      if (here != end) {
+	if (*here == 'n') value.push_back ('\n');
+	else if (*here == 'r') value.push_back ('\r');
+	else value.push_back(*here);
+      }
+
+    } else {
+      // a normal character
+      value.push_back(*here);
+    }
+
+    here++;
+  }
+
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/recpt/infodbclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/infodbclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/infodbclass.h	(revision 21083)
@@ -0,0 +1,185 @@
+/**********************************************************************
+ *
+ * infodbclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef INFODBCLASS_H
+#define INFODBCLASS_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+#ifdef __WIN32__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+#ifdef __cplusplus
+}
+#endif
+
+#else
+#include <gdbm.h>
+#endif
+
+
+typedef map<text_t, text_tarray, lttext_t> text_tarraymap;
+
+
+// infodbclass is used to store information about a object
+class infodbclass {
+protected:
+  text_tarraymap info;
+
+public:
+  // type support for text_tarraymap
+  typedef text_tarraymap::iterator iterator;
+  typedef text_tarraymap::const_iterator const_iterator;
+  typedef text_tarraymap::reference reference;
+  typedef text_tarraymap::const_reference const_reference;
+  typedef text_tarraymap::size_type size_type;
+  typedef text_tarraymap::difference_type difference_type;
+  typedef text_tarraymap::const_reverse_iterator const_reverse_iterator;
+  typedef text_tarraymap::reverse_iterator reverse_iterator;
+  
+  // constructors
+  infodbclass ();
+
+  // basic container support
+  iterator begin () {return info.begin();}
+  const_iterator begin () const {return info.begin();}
+  iterator end () {return info.end();}
+  const_iterator end () const {return info.end();}
+
+  void erase(iterator pos) {info.erase(pos);}
+  void erase(iterator first, iterator last) {info.erase(first, last);}
+  infodbclass &operator=(const infodbclass &x) {info=x.info;return *this;}
+
+  bool empty () const {return info.empty();}
+  size_type size() const {return info.size();}
+
+
+  // added functionality
+  void clear () {info.erase(info.begin(),info.end());}
+
+  // the following functions deal with keys that can only
+  // have one value for compatibility
+  
+  // getinfo returns NULL if there isn't an entry with
+  // 'key' already defined, getintinfo returns 0 if there wasn't an
+  // entry with 'key' defined and operator[] returns "" if
+  // 'key' wasn't already defined (and sets 'key'="").
+  void setinfo (const text_t &key, const text_t &value);
+  void setintinfo (const text_t &key, int value);
+  void setcinfo (const text_t &key, unsigned short c);
+  text_t *getinfo (const text_t &key);
+  int getintinfo (const text_t &key);
+  text_t &operator[] (const text_t &key);
+
+
+  // the next set of functions allow you to set and access keys
+  // that can have more than one value
+
+  // getmultinfo returns NULL if there isn't an entry with
+  // 'key' already defined
+  void addinfo (const text_t &key, const text_t &value);
+  void addintinfo (const text_t &key, int value);
+  void addcinfo (const text_t &key, unsigned short c);
+  text_tarray *getmultinfo (const text_t &key);
+};
+
+
+class gdbmclass {
+public:
+  gdbmclass() {gdbmfile = NULL; logout = &cerr;};
+  ~gdbmclass();
+  
+  // returns true if opened
+  bool opendatabase (const text_t &filename, int mode, int num_retrys, 
+		     bool need_filelock);
+  void closedatabase ();
+
+  // replaces the .c, .p, .n, .l syntax (child, parent, next, previous) 
+  // it expects child, parent, etc. to exist if syntax has been used
+  // so you should test before using
+  text_t translate_OID (const text_t &OID, infodbclass &info);
+
+  // returns true on success
+  bool getinfo (text_t key, infodbclass &info);
+  void setlogout (ostream *thelogout) {logout = thelogout;}
+
+  // returns true if exists
+  bool exists (text_t key);
+
+  // returns true on success
+  bool setinfo (const text_t &key, const infodbclass &info);
+  // returns true on success
+  bool setinfo (const text_t &key, const text_t &data);
+
+  void deletekey (const text_t &key);
+
+  // getfirstkey and getnextkey are used for traversing the database
+  // no insertions or deletions should be carried out while traversing
+  // the database. when there are no keys left to visit in the database
+  // an empty string is returned.
+  text_t getfirstkey ();
+  text_t getnextkey (const text_t &key);
+
+    // returns true on success
+  bool getkeydata (text_t key, text_t &data);
+
+protected:
+  text_t openfile;
+  GDBM_FILE gdbmfile;
+  ostream *logout;
+
+  void get_first_child (text_t &OID, infodbclass &info);
+  void get_last_child (text_t &OID, infodbclass &info);
+  void get_next_sibling (text_t &OID, infodbclass &info);
+  void get_previous_sibling (text_t &OID, infodbclass &info);
+
+
+  // returns true on success
+  bool getinfoline (text_t::iterator &here, text_t::iterator end, 
+		   text_t &key, text_t &value);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/invbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/invbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/invbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,39 @@
+/**********************************************************************
+ *
+ * invbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "invbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+
+invbrowserclass::invbrowserclass () {
+}
+
+invbrowserclass::~invbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t invbrowserclass::get_browser_name () {
+  return "Invisible";
+}
Index: /main/tags/2.38/gsdl/src/recpt/invbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/invbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/invbrowserclass.h	(revision 21083)
@@ -0,0 +1,49 @@
+/**********************************************************************
+ *
+ * invbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef INVBROWSERCLASS_H
+#define INVBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class invbrowserclass : public browserclass {
+protected:
+
+public:
+
+  // this browser class does nothing by default - it should
+  // be overridden for receptionists wanting to display 
+  // 'Invisible' classifications in some way
+
+  invbrowserclass ();
+  virtual ~invbrowserclass ();
+
+  // returns the name that specifies the browserclass type
+  text_t get_browser_name ();
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/librarymain.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/librarymain.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/librarymain.cpp	(revision 21083)
@@ -0,0 +1,190 @@
+/**********************************************************************
+ *
+ * librarymain.cpp -- 
+ * Copyright (C) 1999  The New Zaland Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "receptionist.h"
+#include "cgiwrapper.h"
+#include "fileutil.h"
+#include "nullproto.h"
+// z39.50 stuff - johnmcp
+#if defined(USE_Z3950)
+#include "z3950proto.h"
+#endif
+#include "collectserver.h"
+#include "filter.h"
+#include "browsefilter.h"
+#include "mgqueryfilter.h"
+#include "mgppqueryfilter.h"
+#include "infodbclass.h"
+#include "mggdbmsource.h"
+#include "mgsearch.h"
+#include "mgppsearch.h"
+#include "collectset.h"
+#include <assert.h>
+
+#include "action.h"
+#include "statusaction.h"
+#include "pageaction.h"
+#include "pingaction.h"
+#include "queryaction.h"
+#include "documentaction.h"
+#include "authenaction.h"
+#include "usersaction.h"
+#include "extlinkaction.h"
+#include "tipaction.h"
+#include "collectoraction.h"
+#include "browseaction.h"
+#include "phindaction.h"
+
+#include "browserclass.h"
+#include "vlistbrowserclass.h"
+#include "hlistbrowserclass.h"
+#include "datelistbrowserclass.h"
+#include "invbrowserclass.h"
+#include "pagedbrowserclass.h"
+#include "htmlbrowserclass.h"
+#include "phindbrowserclass.h"
+
+int main () {
+  receptionist recpt;
+  nullproto    nproto;
+  collectset  *cservers;
+#if defined(USE_Z3950)
+  z3950proto   zproto;
+#endif
+  text_t       gsdlhome;
+
+  cservers = new collectset(gsdlhome);
+
+  // set up the null protocol
+  nproto.set_collectset(cservers);
+
+  // configure the receptionist server list
+  cservers->setReceptionistServers(recpt, gsdlhome);  
+
+  // add the protocol to the receptionist
+  recpt.add_protocol (&nproto);
+
+  // z39.50 stuff - johnmcp
+#if defined(USE_Z3950)
+  // add the z39.50 server information. Read in the file
+  // etc/recpt/z3950.cfg for list of servers and their databases.
+  text_t z3950cfg = filename_cat (gsdlhome, "etc");
+  //  z3950cfg = filename_cat (z3950cfg, "recpt");
+  z3950cfg = filename_cat (z3950cfg, "packages");
+  z3950cfg = filename_cat (z3950cfg, "z3950.cfg");
+#ifdef USE_FASTCGI
+  // currently can't use z39.50 if fastcgi used
+#warning  "Disabling z39.50 support as fastcgi is in use"
+  if (0) {
+#else
+  if (file_exists(z3950cfg)) {
+#endif
+    text_t z3950err = filename_cat (gsdlhome, "etc", "z3950log.txt");
+    zproto.read_config_file(z3950cfg,z3950err);
+    // only add this protocol if we have any servers configured.
+    if (zproto.getServerCount()>0)
+      recpt.add_protocol (&zproto);
+  }
+#endif
+
+  // the list of actions. Note: these actions will become invalid
+  // at the end of this function.
+  tipaction atipaction;
+  recpt.add_action (&atipaction);
+
+  statusaction astatusaction;
+  astatusaction.set_receptionist (&recpt);
+  recpt.add_action (&astatusaction);
+
+  pageaction apageaction;
+  apageaction.set_receptionist (&recpt);
+  recpt.add_action (&apageaction);
+
+  pingaction apingaction;
+  recpt.add_action (&apingaction);
+
+  queryaction aqueryaction;
+  aqueryaction.set_receptionist (&recpt);
+  recpt.add_action (&aqueryaction);
+
+  documentaction adocumentaction;
+  adocumentaction.set_receptionist (&recpt);
+  recpt.add_action (&adocumentaction);
+
+  usersaction ausersaction;
+  recpt.add_action (&ausersaction);
+
+  extlinkaction anextlinkaction;
+  recpt.add_action (&anextlinkaction);
+
+  authenaction aauthenaction;
+  aauthenaction.set_receptionist(&recpt);
+  recpt.add_action (&aauthenaction);
+
+  collectoraction acollectoraction;
+  acollectoraction.set_receptionist (&recpt);
+  recpt.add_action(&acollectoraction);
+
+  browseaction abrowseaction;
+  abrowseaction.set_receptionist (&recpt);
+  recpt.add_action(&abrowseaction);
+
+  phindaction aphindaction;
+  recpt.add_action(&aphindaction);
+
+  // list of browsers
+  vlistbrowserclass avlistbrowserclass;
+  recpt.add_browser (&avlistbrowserclass);
+  recpt.setdefaultbrowser ("VList");
+
+  hlistbrowserclass ahlistbrowserclass;
+  recpt.add_browser (&ahlistbrowserclass);
+
+  datelistbrowserclass adatelistbrowserclass;
+  recpt.add_browser (&adatelistbrowserclass);
+
+  invbrowserclass ainvbrowserclass;
+  recpt.add_browser (&ainvbrowserclass);
+
+  pagedbrowserclass apagedbrowserclass;
+  recpt.add_browser (&apagedbrowserclass);
+
+  htmlbrowserclass ahtmlbrowserclass;
+  recpt.add_browser (&ahtmlbrowserclass);
+
+  phindbrowserclass aphindbrowserclass;
+  recpt.add_browser (&aphindbrowserclass);
+
+  cgiwrapper (recpt, "");
+  delete cservers;
+  return 0;
+}
+
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/nullproto.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/nullproto.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/nullproto.cpp	(revision 21083)
@@ -0,0 +1,155 @@
+/**********************************************************************
+ *
+ * nullproto.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "nullproto.h"
+#include <assert.h>
+
+#include "filter.h"
+#include "browsefilter.h"
+#include "mgqueryfilter.h"
+#include "mgppqueryfilter.h"
+#include "infodbclass.h"
+#include "mggdbmsource.h"
+#include "mgsearch.h"
+#include "mgppsearch.h"
+#include "fileutil.h"
+
+nullproto::nullproto() {
+  cset = NULL;
+}
+
+nullproto::~nullproto() {
+}
+
+// add collection to collectset (this should not be called until after the
+// collectset has been added to the protocol with set_collectset()
+void nullproto::add_collection (const text_t &collection, void *recpt, 
+				const text_t &gsdlhome, const text_t &gdbmhome) {      
+  
+  if (cset != NULL) {
+    this->cset->add_collection (collection, recpt, gsdlhome, gdbmhome);
+  }
+}
+
+
+// remove_collection deletes the collection server of collection.
+// This only needs to be called if a collectionserver is to be
+// removed while the library is running. The destructor function
+// cleans up all collectservers when the program exits.
+void nullproto::remove_collection (const text_t &collection, ostream &logout) {
+  cset->remove_collection(collection, logout);
+}
+
+// this configure will configure each of the collection servers
+void nullproto::configure (const text_t &key, const text_tarray &cfgline,
+			   comerror_t &err) {
+  // the naming of the collection should not be done here,
+  // it should be done just after the collection server has been 
+  // created
+
+  // the protocol should not configure the collection set; it should be
+  // done direct to the collection server set
+  if (key == "gsdlhome" || key == "gdbmhome") {
+    cset->configure(key, cfgline);
+  }
+}
+
+// this init will configure and init each of the collection servers
+bool nullproto::init (comerror_t &err, ostream &logout) {
+  return cset->init(logout);
+}
+
+text_t nullproto::get_site_name (comerror_t &err) {
+  return "localhost";
+}
+
+text_t nullproto::get_protocol_name (comerror_t &err) {
+  return "nullproto";
+}
+
+
+void nullproto::get_collection_list (text_tarray &collist, comerror_t &err, 
+				     ostream &/*logout*/) {
+  cset->getCollectionList(collist);
+  err = noError; // no error is guaranteed - collection server shouldn't
+                 // about receptionist error states, logout is irrelevant
+}
+
+void nullproto::has_collection (const text_t &collection, bool &hascollection, 
+				comerror_t &err, ostream &/*logout*/) {
+  hascollection = (cset->getCollectServer(collection) != NULL);
+  err = noError;
+}
+
+void nullproto::ping (const text_t &collection, bool &wassuccess, 
+		      comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer(collection);
+  if (cserver != NULL) cserver->ping(wassuccess, err, logout);
+  else err = protocolError;
+}
+
+void nullproto::get_collectinfo (const text_t &collection, 
+				 ColInfoResponse_t &collectinfo,
+				 comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer (collection);
+  if (cserver != NULL) cserver->get_collectinfo (collectinfo, err, logout);
+  else err = protocolError;
+}
+
+
+void nullproto::get_filterinfo (const text_t &collection,
+				InfoFiltersResponse_t &response,
+				comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer (collection);
+  if (cserver != NULL) cserver->get_filterinfo (response, err, logout);
+  else err = protocolError;
+}
+
+void nullproto::get_filteroptions (const text_t &collection,
+				   const InfoFilterOptionsRequest_t &request,
+				   InfoFilterOptionsResponse_t &response, 
+				   comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer (collection);
+  if (cserver != NULL) cserver->get_filteroptions (request, response, err, logout);
+  else err = protocolError;
+}
+
+void nullproto::filter (const text_t &collection,
+			FilterRequest_t &request,
+			FilterResponse_t &response,
+			comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer (collection);
+  if (cserver != NULL) cserver->filter (request, response, err, logout);
+  else err = protocolError;
+}
+
+void nullproto::get_document (const text_t &collection,
+			      const DocumentRequest_t &request,
+			      DocumentResponse_t &response,
+			      comerror_t &err, ostream &logout) {
+  collectserver *cserver = cset->getCollectServer (collection);
+  if (cserver != NULL) cserver->get_document (request, response, err, logout);
+  else err = protocolError;
+}
Index: /main/tags/2.38/gsdl/src/recpt/nullproto.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/nullproto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/nullproto.h	(revision 21083)
@@ -0,0 +1,95 @@
+/**********************************************************************
+ *
+ * nullproto.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef NULLPROTO_H
+#define NULLPROTO_H
+
+#include "gsdlconf.h"
+#include "collectserver.h"
+#include "collectset.h"
+#include "recptproto.h"
+#include "receptionist.h"
+
+class nullproto : public recptproto {
+protected:
+  collectset           *cset;
+public:
+  nullproto();
+  virtual ~nullproto();
+
+  // add_collection sets up the collectionserver and calls
+  // add_collectserver
+  virtual void add_collection (const text_t &collection, void *recpt, 
+			       const text_t &gsdlhome, const text_t &gdbmhome);
+
+  void set_collectset(collectset *set) { this->cset = set; }
+
+  // remove_collection deletes the collection server of collection.
+  // This only needs to be called if a collectionserver is to be
+  // removed while the library is running as the destructor function
+  // cleans up all collectservers when the program exits.
+  void remove_collection (const text_t &collection, ostream &logout);
+
+  // this configure will configure each of the collection servers
+  void configure (const text_t &key, const text_tarray &cfgline,
+		  comerror_t &err);
+
+  // this init will init each of the collection servers
+  bool init (comerror_t &err, ostream &logout);
+
+  text_t get_protocol_name (comerror_t &err);
+  text_t get_site_name (comerror_t &err);
+
+  void get_collection_list (text_tarray &collist, comerror_t &err, 
+			    ostream &logout);
+  void has_collection (const text_t &collection, bool &hascollection, 
+		       comerror_t &err, ostream &logout);
+  void ping (const text_t &collection, bool &wassuccess, 
+	     comerror_t &err, ostream &logout);
+  void get_collectinfo (const text_t &collection, 
+			ColInfoResponse_t &collectinfo,
+			comerror_t &err, ostream &logout);
+  void get_filterinfo (const text_t &collection,
+		       InfoFiltersResponse_t &response,
+		       comerror_t &err, ostream &logout);
+  void get_filteroptions (const text_t &collection,
+			  const InfoFilterOptionsRequest_t &request,
+			  InfoFilterOptionsResponse_t &response, 
+			  comerror_t &err, ostream &logout);
+  void filter (const text_t &collection,
+	       FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout);
+
+  void get_document (const text_t &collection,
+		     const DocumentRequest_t &request,
+		     DocumentResponse_t &response,
+		     comerror_t &err, ostream &logout);
+
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/pageaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pageaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pageaction.cpp	(revision 21083)
@@ -0,0 +1,723 @@
+/**********************************************************************
+ *
+ * pageaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "OIDtools.h"
+#include "pageaction.h"
+#include "receptionist.h"
+#include "fileutil.h"
+#include "gsdltools.h"
+#include <time.h>
+
+pageaction::pageaction () {
+
+  status_disabled = true;
+  collector_disabled = true;
+  recpt = NULL;
+
+  // this action uses cgi variables "a", "p", and "hp"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "p";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "p";
+  arg_ainfo.longname = "page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "home";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "hp";
+  arg_ainfo.longname = "html page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "bp";
+  arg_ainfo.longname = "set preferences button";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // the "u" argument will disable the search facility, remove links to the
+  // home and preferences pages, and disable the DocumentButton buttons
+  // (for use when generating static html versions of collections)
+  arg_ainfo.shortname = "u";
+  arg_ainfo.longname = "static page";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+pageaction::~pageaction () {
+}
+
+bool pageaction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &args, 
+				ostream &/*logout*/) {
+
+  if (args["p"] == "preferences" && !args["bp"].empty()) {
+    if (args["hd"] != "0") args["hd"] = args["hdn"];
+  }
+
+  // the following hack resets the language argument to English if
+  // attempting to display the homepage in a language other than
+  // English or French - we do this because English and French are the
+  // only languages currently supported by the home page
+  if (args["p"] == "home" && args["l"] != "en" && args["l"] != "fr") args["l"] = "en";
+
+  return true;
+}
+
+void pageaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				   response_t &response,text_t &response_data, 
+				   ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+void pageaction::set_homeextra_macro (displayclass &disp, recptprotolistclass *protos, 
+				      cgiargsclass &args, ostream &logout) {
+  text_t homeextra = "<center><table width=_pagewidth_><tr valign=top>\n";
+  bool found_valid_col = false;
+  
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+
+      text_tarray collist;
+      comerror_t err;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+
+	int count = 0;
+	bool first = true;
+	while (collist_here != collist_end) {
+	  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, logout);
+	  
+	  if (cinfo != NULL) {
+	    if (cinfo->isPublic && (cinfo->buildDate > 0)) {
+
+	      text_t coll_type = "&ct=";
+	      if (cinfo->buildType == "mgpp") {
+		coll_type += "1";
+	      }
+	      else {
+		coll_type += "0";
+	      }
+	      found_valid_col = true;
+ 	      FilterResponse_t response;
+	      text_tset metadata;
+	      metadata.insert ("collectionname");
+	      metadata.insert ("iconcollection");
+	      metadata.insert ("iconcollectionsmall");
+	      text_t collectionname = *collist_here;
+	      text_t alt = collectionname;
+
+	      if (get_info ("collection", *collist_here, metadata, false, 
+			    (*rprotolist_here).p, response, logout)) {
+		if (!response.docInfo[0].metadata["collectionname"].values[0].empty())
+		  alt = response.docInfo[0].metadata["collectionname"].values[0];
+		
+		text_t iconurl;
+		iconurl.clear();
+
+		if (!response.docInfo[0].metadata["iconcollectionsmall"].values[0].empty()) {
+		  iconurl = response.docInfo[0].metadata["iconcollectionsmall"].values[0];
+		} else if (!response.docInfo[0].metadata["iconcollection"].values[0].empty()) {
+		  iconurl = response.docInfo[0].metadata["iconcollection"].values[0];
+		}
+
+		if (!iconurl.empty())
+		  {
+		    // check to see URL is local to colserver
+		    text_t::iterator iconurl_head = iconurl.begin();
+		    text_t iconhead = substr(iconurl_head,iconurl_head+16);
+		    if (iconhead=="_httpcollection_")
+		      {
+			// local and using _httpcollection_
+			text_t icontail = substr(iconurl_head+16,iconurl.end());
+			iconurl = "http://" + cinfo->httpdomain 
+			  + cinfo->httpprefix + "/collect/" 
+			  + *collist_here + "/" + icontail;
+		      }
+		    else if (iconurl[0]=='/')
+		      {
+			// local but with full path
+			iconurl = "http://" + cinfo->httpdomain + iconurl;
+		      }
+
+		    collectionname 
+		      = "<img width=150 border=1 src=\"" + iconurl + "\" alt=\"" + alt + "\">";
+		  }
+		else
+		  {
+		    collectionname = alt;
+		  }
+
+	      }
+	      if ((count%3 == 0) && (!first))
+		homeextra += "</tr><tr valign=top>\n";
+	      
+	      comerror_t err;
+	      text_t optsite = "";
+	      text_t site_name = (*rprotolist_here).p->get_site_name (err);
+	      if (!site_name.empty()) { optsite = "site="+site_name+"&"; }
+
+	      text_t link = "<a href=\"_gwcgi_?"+optsite+"a=p&p=about&c=" + *collist_here + coll_type;
+	      link += "&l=" + args["l"] + "&w=" + args["w"] + "\">";
+
+	      if (!cinfo->receptionist.empty()) 
+		link = "<a href=\"" + cinfo->receptionist + "\">";
+	      
+	      homeextra += "<td>" + link + collectionname + "</a></td>\n";
+	      
+	      count ++;
+	      first = false;
+	    }
+	  }
+	  collist_here ++;
+	}
+
+	for (; count%3 != 0; count ++) homeextra += "<td></td>\n";
+      }
+    }
+    homeextra += "</td></tr>\n<tr>\n";
+    rprotolist_here ++;
+  }
+
+  if (!found_valid_col) {
+    homeextra += "<td>No valid (i.e. built and public) collections are available</td>\n";
+  }
+  homeextra += "</tr></table></center>\n";
+  disp.setmacro ("homeextra", "home", homeextra); 
+}
+
+void pageaction::set_collectionlist_macro (displayclass &disp, recptprotolistclass *protos, 
+					   ostream &logout) {
+
+  text_t collectionlist;
+  int count = 0;
+  
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+
+      text_tarray collist;
+      comerror_t err;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+
+	while (collist_here != collist_end) {
+	  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, logout);
+	  
+	  if (cinfo != NULL) {
+	    if (cinfo->isPublic && (cinfo->buildDate > 0)) {
+
+	      count ++;
+
+	      text_t coll_type = "&ct=";
+	      if (cinfo->buildType == "mgpp") {
+		coll_type += "1";
+	      }
+	      else {
+		coll_type += "0";
+	      }
+ 	      FilterResponse_t response;
+	      text_tset metadata;
+	      metadata.insert ("collectionname");
+	      text_t collectionname = *collist_here;
+
+	      if (get_info ("collection", *collist_here, metadata, false, 
+			    (*rprotolist_here).p, response, logout)) {
+		if (!response.docInfo[0].metadata["collectionname"].values[0].empty()) {
+		  collectionname = response.docInfo[0].metadata["collectionname"].values[0];
+		}
+	      }
+	      
+	      comerror_t err;
+	      text_t optsite = "";
+	      text_t site_name = (*rprotolist_here).p->get_site_name (err);
+	      if (!site_name.empty()) { optsite = "site="+site_name+"&"; }
+
+	      text_t link = "<a href=\"_gwcgi_?"+optsite+"a=p&p=about&c=" + *collist_here + coll_type+"\">";
+
+	      if (!cinfo->receptionist.empty()) 
+		link = "<a href=\"" + cinfo->receptionist + "\">";
+	      
+	     collectionlist += "<li>" + link + collectionname + "</a>\n";
+	    }
+	  }
+	  collist_here ++;
+	}
+      }
+    }
+    rprotolist_here ++;
+  }
+
+  if (count == 1) {
+    collectionlist = "<p>_text1coll_\n<ul>" +
+      collectionlist + "</ul>\n";
+  } else if (count > 1) {
+    collectionlist = "<p>_textmorecolls_(" + text_t(count) + 
+      ")\n<ul>" + collectionlist + "</ul>\n";
+  }
+
+  disp.setmacro ("collectionlist", "homehelp", collectionlist); 
+}
+
+void pageaction::set_documentation_macro (displayclass &disp) {
+
+  text_t documentation;
+  text_t docsdir = filename_cat(gsdlhome, "docs");
+  
+  if (file_exists(filename_cat(docsdir, "User.pdf"))) {
+    documentation += "<tr valign=middle><td><a href=\"_httpdocs_/User.pdf\">_iconpdf_"
+      "</a></td><td>_textuserguide_</td></tr>";
+  }
+  
+  if (file_exists(filename_cat(docsdir, "Install.pdf"))) {
+    documentation += "<tr valign=middle><td><a href=\"_httpdocs_/Install.pdf\">_iconpdf_"
+      "</a></td><td>_textinstallerguide_</td></tr>";
+  }
+  
+  if (file_exists(filename_cat(docsdir, "Develop.pdf"))) {
+    documentation += "<tr valign=middle><td><a href=\"_httpdocs_/Develop.pdf\">_iconpdf_"
+      "</a></td><td>_textdeveloperguide_</td></tr>";
+  }
+  
+  if (file_exists(filename_cat(docsdir, "Paper.pdf"))) {
+    documentation += "<tr valign=middle><td><a href=\"_httpdocs_/Paper.pdf\">_iconpdf_"
+      "</a></td><td>_textpaperguide_</td></tr>";
+  }
+
+  if (!documentation.empty()) {
+    disp.setmacro("documentation", "docs", "<p>\n<table border=0>\n" + documentation + "\n</table>\n");
+  }
+}
+
+void pageaction::set_macro_to_file_contents (displayclass &disp, const text_t &macroname,
+					     const text_t &packagename, const text_t &filename) {
+
+  text_t filecontent;
+  char *filenamec = filename.getcstr();
+  ifstream file_in (filenamec);
+  delete filenamec;
+  if (file_in) {
+    char c;
+    file_in.get(c);
+    while (!file_in.eof ()) {
+      if (c == '\n') filecontent += "<br>";
+      filecontent.push_back(c);
+      file_in.get(c);
+    }
+    file_in.close();
+  }
+  disp.setmacro (macroname, packagename, dm_safe(filecontent));
+}
+
+void pageaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					 recptprotolistclass *protos, ostream &logout) {
+
+  // define_internal_macros sets the following macros:
+
+  // _numdocs_             the number of documents in the collection
+
+  // _builddate_           the date last built
+
+  // if page is "home"
+  // _homeextra_           this is the list of available collections and collection info
+  //                       to be displayed on the home page
+
+
+  // if page is "preferences"
+  // _collectionoption_    collections to search/browse (if cross-collection-searching is on)
+
+  // _htmloptions_         set to _htmloptionson_ if DocumentUseHTML is set
+
+  // _PreferencesDocsFromWeb_ set to 1 if corresponding format option is set
+
+  // _languageoption_      interface languages to select from (dependant on PreferenceLanguages)
+
+  // _encodingoption_      encodings to select from
+
+  // if page is "about"
+  // _textsubcollections_  the text on which subcollections make up the collection (if 
+  //                       cross-collection searching is being used
+
+  // _textbrowseoptions_   the 'how to find information' text in the about and help pages
+
+  // _numbrowseoptions_    the number of browsing options 
+
+  // _prefschanged_        will be set to _textprefschanged_ if the "set preferences" button
+  //                       was pressed
+
+
+  // if page is "help"
+  // _textbrowseoptions_   the 'how to find information' text in the about and help pages
+
+  // _numbrowseoptions_    the number of browsing options 
+
+  // _topicreadingdocs_    this section of the help text differs depending on what type of 
+  // _textreadingdocs_     collection it is (e.g. html collection, bibliographic collection etc.)
+  // _texthelpreadingdocs_ 
+
+  // _textgocollector_     set to "" if collector is disabled in main.cfg
+  // _textgoadmin_         set to "" if status is disabled in main.cfg
+
+
+  // if page is "homehelp"
+  // _collectionlist_      list of available collections to be displayed on the homehelp page
+
+  
+  // if page is "docs"
+  // _documentation_       links to PDF documents if they're available
+
+
+  // if page is "bsummary"
+  // _importlog_           set to contents of collections import.log file
+  // _faillog_             set to contents of collections fail.log file
+
+  
+  if (recpt == NULL) {
+    logout << "ERROR (pageaction::define_internal_macros): This action does not contain\n"
+	   << "      information about any receptionists. The method set_receptionist was\n"
+	   << "      probably not called from the module which instantiated this action.\n";
+    return;
+  }
+
+  text_t &arg_p = args["p"];
+  text_t &arg_c = args["c"];
+  ColInfoResponse_t *cinfo = NULL;
+
+  recptproto* collectproto = protos->getrecptproto (arg_c, logout);
+  if (collectproto != NULL) {
+    cinfo = recpt->get_collectinfo_ptr (collectproto, arg_c, logout);
+    
+    disp.setmacro ("numdocs", "Global", cinfo->numDocs);
+    unsigned long current_time = time(NULL);
+    unsigned long builddate = (current_time - cinfo->buildDate) / 86400;
+    disp.setmacro ("builddate", "Global", builddate);
+    
+    text_t numbytes;
+    if ((cinfo->numBytes/(1024*1024)) > 1) {
+      numbytes = (text_t)(cinfo->numBytes/(1024*1024)) + " Mb";
+    } else if ((cinfo->numBytes/1024) > 1) {
+      numbytes = (text_t)(cinfo->numBytes/1024) + " kb";
+    } else {
+      numbytes = (text_t)cinfo->numBytes + " bytes";
+    }
+    disp.setmacro("numbytes", "Global", numbytes);
+  }
+  
+  //setting _queryformcontent_ so that the query interface is consistent.
+  if(arg_p == "about"){
+    if (cinfo != NULL) {
+      text_tmap::iterator check = cinfo->format.find("QueryInterface");
+      if(check != cinfo->format.end()){
+	if((*check).second=="DateSearch"){
+	  text_t current = "_basicqueryform_ _datesearch_";
+	
+	  disp.setmacro("queryformcontent","query",current);
+	}
+      }
+    }
+  }
+
+  if (arg_p == "home") {
+    set_homeextra_macro (disp, protos, args, logout);
+    if (status_disabled) disp.setmacro ("textgoadmin", "home", "");
+    if (collector_disabled) disp.setmacro ("textgocollector", "home", "");
+  }
+  
+  else if (arg_p == "preferences") {
+    if (collectproto == NULL) {return;}
+    // _collectionoption_
+
+    if ((args["ccs"] == "1") && (cinfo->ccsCols.size() > 1)) {
+      text_t collectionoption = "_textcollectionoption_";
+      text_tarray::const_iterator col_here = cinfo->ccsCols.begin();
+      text_tarray::const_iterator col_end = cinfo->ccsCols.end();
+      int count = 0;
+      while (col_here != col_end) {
+	text_t colname;
+	if (*col_here == arg_c) {
+	    colname = cinfo->collectionmeta["collectionname"];
+	} else {
+	  ColInfoResponse_t *this_cinfo = recpt->get_collectinfo_ptr (collectproto, *col_here, logout);
+	  if (this_cinfo == NULL) {col_here ++; continue;}
+	  colname = this_cinfo->collectionmeta["collectionname"];
+	}
+
+	count ++;
+	collectionoption += "<input type=checkbox name=\"cc\" value=\"" + 
+	  *col_here + "\" onClick=\"updatecc(\'" + *col_here + "\');\"> " +
+	  colname + "<br>\n";
+	col_here ++;
+      }
+      
+      if (count > 1)
+	disp.setmacro ("collectionoption", "preferences", collectionoption);
+    }
+
+    // _htmloptions_
+    
+    text_tmap::const_iterator it = cinfo->format.find ("DocumentUseHTML");
+    if ((it != cinfo->format.end()) && ((*it).second == "true")) {
+      disp.setmacro ("htmloptions", "preferences", "_htmloptionson_");
+
+
+      // _PreferenceDocsFromWeb_
+
+      it = cinfo->format.find ("PreferenceDocsFromWeb");
+      if ((it == cinfo->format.end()) || ((*it).second == "true"))
+	disp.setmacro ("PreferenceDocsFromWeb", "preferences", "1");
+    }
+
+    // _languageoption_
+    // Create the "interface language" selection box for the preferences page.
+    // You can use something like "format PreferenceLanguages en|fr|zn" from within
+    // a collect.cfg file to use only a subset of the available languages for
+    // any given collection. This facility is kind of ugly though and should be
+    // replaced by something better when the configuration files are tidied up (as
+    // should all the other "format Preference..." options).
+    
+    text_t &arg_l = args["l"];
+    const recptconf &configinfo = recpt->get_configinfo();
+    // put languages in another map to sort them by longname
+    text_tmap languages;
+    languageinfo_tmap::const_iterator thislang = configinfo.languages.begin();
+    languageinfo_tmap::const_iterator endlang = configinfo.languages.end();
+    while (thislang != endlang) {
+      languages[(*thislang).second.longname] = (*thislang).first;
+      thislang++;
+    }
+    text_tmap::iterator tlang = languages.begin();
+    text_tmap::iterator elang = languages.end();
+
+    text_t languageoption;
+    it = cinfo->format.find ("PreferenceLanguages");
+    if ((it != cinfo->format.end()) && (!(*it).second.empty())) {
+      text_tset pref_langs;
+      splitchar ((*it).second.begin(), (*it).second.end(), '|', pref_langs);
+      if (pref_langs.size() > 1) {
+	while (tlang != elang) {
+	  if (pref_langs.find((*tlang).second) != pref_langs.end()) {
+	    languageoption += "<option value=\"" + (*tlang).second + "\"";
+	    if ((*tlang).second == arg_l) languageoption += " selected";
+	    languageoption += ">" + (*tlang).first + "\n";
+	  }
+	  tlang ++;
+	}
+      }
+
+    } else {
+      while (tlang != elang) {
+	languageoption += "<option value=\"" + (*tlang).second + "\"";
+	if ((*tlang).second == arg_l) languageoption += " selected";
+	languageoption += ">" + (*tlang).first + "\n";
+	tlang ++;
+      }
+    }
+    if (!languageoption.empty()) {
+      languageoption = "<select name=\"l\" onChange=\"updatel();\">\n" + languageoption;
+      languageoption += "</select>\n";
+      disp.setmacro ("languageoption", "preferences", languageoption);
+    }
+
+    // _encodingoption_
+    // create the "encoding" selection box for the preferences page
+    if (configinfo.encodings.size() > 1) {
+      text_t &arg_w = args["w"];
+      text_t encodingoption;
+      text_tmap::const_iterator thisenc = configinfo.encodings.begin();
+      text_tmap::const_iterator endenc = configinfo.encodings.end();
+      while (thisenc != endenc) {
+	encodingoption += "<option value=\"" + (*thisenc).second + "\"";
+	if ((*thisenc).second == arg_w) encodingoption += " selected";
+	encodingoption += ">" + (*thisenc).first + "\n";
+	thisenc ++;
+      }
+
+      encodingoption = "<select name=\"w\" onChange=\"updatew();\">\n" + encodingoption;
+      encodingoption += "</select>\n";
+      disp.setmacro ("encodingoption", "preferences", encodingoption);
+    }
+
+    // _prefschanged_
+    if (!args["bp"].empty()) {
+      disp.setmacro ("prefschanged", "preferences", "_textprefschanged_");
+    }
+    
+  } else if (arg_p == "about" || arg_p == "help") {
+    if (collectproto == NULL) return;
+    
+    // _textbrowseoptions_ and _numbrowseoptions_
+    
+    FilterResponse_t response;
+    text_tset metadata;
+    metadata.insert ("Title");
+    bool getParents = false;
+    get_children ("", args["c"], metadata, getParents, collectproto, response, logout);
+
+    disp.setmacro ("numbrowseoptions", "help", response.docInfo.size()+1);
+
+    ResultDocInfo_tarray::iterator here = response.docInfo.begin();
+    ResultDocInfo_tarray::iterator end = response.docInfo.end();
+
+    // we're assuming that we've always got a search button
+    text_t shorttext = "<ul><li>_textSearchshort_\n";
+    text_t longtext = "_textSearchlong_";
+
+    while (here != end) {
+      text_t title = (*here).metadata["Title"].values[0];
+
+      text_t stext, ltext;
+      disp.expandstring ("help", "_text" + title + "short_", stext);
+      if (stext == ("_text" + title + "short_")) {
+	shorttext += "<li>_help:textdefaultshorttext_";
+	longtext += "_help:textdefaultlongtext_";
+      } else {
+	shorttext += "<li>_help:text" + title + "short_";
+	longtext += "_help:text" + title + "long_";
+      }
+
+      here ++;
+    }
+    shorttext += "</ul>\n";
+    if (response.docInfo.size() > 1) disp.setmacro ("textbrowseoptions", "help", shorttext + longtext);
+    else disp.setmacro ("textbrowseoptions", "help", longtext);
+
+    if (arg_p == "help") {
+
+      // _topicreadingdocs_  _textreadingdocs_  _texthelpreadingdocs_
+          
+      // if HTML collection there's no how to read document text
+      text_tmap::const_iterator it = cinfo->format.find ("HelpNoDocs");
+      if ((it != cinfo->format.end()) && ((*it).second == "true")) {
+	disp.setmacro ("topicreadingdocs", "help", "");
+	disp.setmacro ("texthelpreadingdocs", "help", "");
+      }
+      it = cinfo->format.find ("HelpBibDocs");
+      if ((it != cinfo->format.end()) && ((*it).second == "true")) {
+	disp.setmacro ("texthelpreadingdocs", "help", "_bibtexthelpreadingdocs_");
+	disp.setmacro ("textreadingdocs", "help", "_bibtextreadingdocs_");
+      }
+      it = cinfo->format.find ("HelpBookDocs");
+      if ((it != cinfo->format.end()) && ((*it).second == "true")) {
+	disp.setmacro ("texthelpreadingdocs", "help", "_booktexthelpreadingdocs_");
+	disp.setmacro ("textreadingdocs", "help", "_booktextreadingdocs_");
+      }
+
+    }
+    if (arg_p == "about") {
+
+      // _textsubcollections_
+      if (args["ccs"] == "1" && (cinfo->ccsCols.size() > 1)) {
+	text_t textsubcollections = "_textsubcols1_(" + text_t(cinfo->ccsCols.size()) + ")";
+	text_tarray::const_iterator here = cinfo->ccsCols.begin();
+	text_tarray::const_iterator end = cinfo->ccsCols.end();
+	bool first = true;
+	int count = 0;
+	while (here != end) {
+	  if (*here == arg_c) {
+	    if (!first) textsubcollections += "<br>";
+	    textsubcollections += "\n" + cinfo->collectionmeta["collectionname"] + "\n";
+	  } else {
+	    ColInfoResponse_t *this_cinfo = recpt->get_collectinfo_ptr (collectproto, *here, logout);
+	    if (this_cinfo == NULL) {here ++; continue;}
+	    if (!first) textsubcollections += "<br>";
+	    textsubcollections += "\n" + this_cinfo->collectionmeta["collectionname"] + "\n";
+	  }
+	  count ++;
+	  first = false;
+	  here ++;
+	}
+	textsubcollections += "_textsubcols2_";
+	if (count > 1) 
+	  disp.setmacro ("textsubcollections", "about", textsubcollections);
+      }
+    }
+
+  } else if (arg_p == "homehelp") {
+    
+    set_collectionlist_macro (disp, protos, logout);
+
+  } else if (arg_p == "docs") {
+
+    set_documentation_macro (disp);
+
+  } else if (arg_p == "bsummary" && !arg_c.empty()) {
+
+    set_macro_to_file_contents (disp, "importlog", "bsummary",
+				filename_cat(gsdlhome, "collect", arg_c, "etc", "import.log"));
+    set_macro_to_file_contents (disp, "faillog", "bsummary",
+				filename_cat(gsdlhome, "collect", arg_c, "etc", "fail.log"));
+  }
+}
+
+bool pageaction::do_action (cgiargsclass &args, recptprotolistclass * /*protos*/, 
+			    browsermapclass * /*browsers*/, displayclass &disp, 
+			    outconvertclass &outconvert, ostream &textout, 
+			    ostream &/*logout*/) {
+
+  text_t &arg_p = args["p"];
+
+  textout << outconvert << disp << ("_" + arg_p + ":header_\n")
+	  << ("_" + arg_p + ":content_\n")
+	  << ("_" + arg_p + ":footer_\n");
+
+  return true;
+}
+
+void pageaction::configure (const text_t &key, const text_tarray &cfgline) {
+  if ((key == "status") && (cfgline.size() == 1) && 
+      (cfgline[0] == "true" || cfgline[0] == "on" || cfgline[0] == "enabled")) {
+    status_disabled = false;
+  } else if ((key == "collector") && (cfgline.size() == 1) && 
+	     (cfgline[0] == "true" || cfgline[0] == "on" || cfgline[0] == "enabled")) {
+    collector_disabled = false;
+  } else {
+    // call the parent class to deal with the things which
+    // are not dealt with here
+    action::configure (key, cfgline);
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/pageaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pageaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pageaction.h	(revision 21083)
@@ -0,0 +1,86 @@
+/**********************************************************************
+ *
+ * pageaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef PAGEACTION_H
+#define PAGEACTION_H
+
+
+#include "gsdlconf.h"
+#include "action.h"
+#include "receptionist.h"
+
+
+class pageaction : public action {
+  
+protected:
+  receptionist *recpt;
+
+  text_tset classify_meta;
+
+public:
+  pageaction ();
+  virtual ~pageaction ();
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+
+  text_t get_action_name () {return "p";}
+
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response,text_t &response_data, 
+			 ostream &logout);
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+protected:
+  void set_homeextra_macro (displayclass &disp, recptprotolistclass *protos, 
+			    cgiargsclass &args, ostream &logout);
+
+  void set_collectionlist_macro (displayclass &disp, recptprotolistclass *protos, 
+				 ostream &logout);
+
+  void set_documentation_macro (displayclass &disp);
+
+  void set_macro_to_file_contents (displayclass &disp, const text_t &macroname,
+				   const text_t &packagename, const text_t &filename);
+
+  bool status_disabled;
+  bool collector_disabled;
+
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,190 @@
+/**********************************************************************
+ *
+ * pagedbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "pagedbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+#include "gsdltools.h"
+
+pagedbrowserclass::pagedbrowserclass () {
+}
+
+pagedbrowserclass::~pagedbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t pagedbrowserclass::get_browser_name () {
+  return "Paged";
+}
+
+
+void pagedbrowserclass::load_metadata_defaults (text_tset &metadata) {
+  metadata.insert ("Title");
+}
+
+// if the "gp" (go to page) argument is set we need to set
+// the "d" argument to the corresponding page
+// also want to set "d" argument to first child if we're at
+// an 'Invisible' top level
+void pagedbrowserclass::processOID (cgiargsclass &args, recptproto *collectproto,
+                                    ostream &logout) {
+
+  text_t &arg_d = args["d"];
+  text_t &arg_gp = args["gp"];
+  text_tset metadata;
+  bool getParents = false;
+  FilterResponse_t response;
+
+  if ((!arg_d.empty()) && (!arg_gp.empty()) && (is_number (arg_gp))) {
+    text_t top;
+    get_top (arg_d, top);
+    metadata.insert ("Title");
+    get_children (top, args["c"], metadata, getParents, collectproto, response, logout);
+    ResultDocInfo_tarray::iterator dochere = response.docInfo.begin();
+    ResultDocInfo_tarray::iterator docend = response.docInfo.end();
+    while (dochere != docend) {
+      if ((*dochere).metadata["Title"].values[0] == arg_gp) {
+        arg_d = (*dochere).OID;
+        break;
+      }
+      dochere ++;
+    }
+
+  } else if (!arg_d.empty() && is_top(arg_d)) { // if top level doc, check if not invisible
+    metadata.insert("thistype");
+    if (get_info(arg_d, args["c"], metadata, getParents, collectproto, response, logout)) {
+      text_t type = response.docInfo[0].metadata["thistype"].values[0];
+      if (type=="Invisible") { // display first child
+        arg_d = arg_d + ".fc";
+      }
+    }
+  }
+}
+
+int pagedbrowserclass::output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+					     const text_t &/*collection*/, int /*colnumber*/, 
+					     format_t * /*formatlistptr*/, bool /*use_table*/, 
+					     text_tset &/*metadata*/, bool &/*getParents*/,
+					     recptproto * /*collectproto*/, displayclass &disp, 
+					     outconvertclass &outconvert, ostream &textout, 
+					     ostream &/*logout*/) {
+
+  // this browser class only handles document levels
+  if (args["d"].empty()) return 0;
+
+  if (section.OID != args["d"]) {
+    text_t httpprevarrow = "_httpdocument_&cl=" + args["cl"] + "&d=" + dm_safe(section.OID);
+    text_t parentarrow = "<a href=\"" + httpprevarrow + "\">_iconprev_</a>\n";
+    disp.setmacro ("httpprevarrow", "document", httpprevarrow);
+    disp.setmacro ("parentarrow", "document", parentarrow);
+    return 0;
+  }
+
+  // must be at top level to get to here!
+  textout << outconvert << disp << "<b>" << section.metadata["Title"].values[0] 
+	  << "_document:textintro_</b>\n";
+  
+  return 0;
+}
+
+int pagedbrowserclass::output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+					     const text_t &/*collection*/, int /*colnumber*/, 
+					     format_t * /*formatlistptr*/, bool /*use_table*/, 
+					     text_tset &/*metadata*/, bool &/*getParents*/,
+					     recptproto * /*collectproto*/, displayclass &disp, 
+					     outconvertclass &outconvert, ostream &textout, 
+					     ostream &/*logout*/) {
+
+  text_t &arg_d = args["d"];
+
+  // this browser class only handles document levels
+  if (arg_d.empty()) return 0;
+
+  text_t previousOID, previoustitle, nextOID, nexttitle;
+  text_t previousarrow, nextarrow, httpprevarrow, httpnextarrow;
+  bool found = false;
+
+  // this should be our list of pages
+
+  ResultDocInfo_tarray::iterator thissection = sections.docInfo.begin();
+  ResultDocInfo_tarray::iterator endsection = sections.docInfo.end();
+
+  while (thissection != endsection) {
+    if (arg_d == (*thissection).OID) {
+      found = true;
+      textout << outconvert << disp 
+	      << "<table><tr valign=top><td colspan=3><center><b>_page_"
+	      << (*thissection).metadata["Title"].values[0] << "</b>\n";
+      if (thissection != sections.docInfo.begin()) {
+	previousOID = (*(thissection-1)).OID;
+	previoustitle = (*(thissection-1)).metadata["Title"].values[0];
+      } else {
+	previousarrow = "_document:parentarrow_";
+      }
+
+      if ((thissection+1) != endsection) {
+	nextOID = (*(thissection+1)).OID;
+	nexttitle = (*(thissection+1)).metadata["Title"].values[0];
+      }
+      break;
+    }
+    thissection ++;
+  }
+
+  if (!found) {
+    textout << outconvert << disp 
+	    << "<table><tr valign=top> <td colspan=3><center>\n";
+  }
+  int numpages = sections.docInfo.size();
+  textout << outconvert << disp 
+	  << ("_document:textnumpages_(" + text_t(numpages) + ")</center></td></tr>\n");
+
+  if (!found) {
+    httpnextarrow = "_httpdocument_&cl=" + args["cl"] + "&d=" + sections.docInfo[0].OID;
+    nextarrow = "<a href=\"" + httpnextarrow + "\">" + 
+      sections.docInfo[0].metadata["Title"].values[0] + "_iconnext_</a>\n";
+
+  } else {
+    if (!previousOID.empty()) {
+      httpprevarrow = "_httpdocument_&cl=" + args["cl"] + "&d=" + dm_safe(previousOID);
+      previousarrow = "<a href=\"" + httpprevarrow + "\">_iconprev_" + previoustitle + "</a>\n";
+    }
+    if (!nextOID.empty()) {
+      httpnextarrow = "_httpdocument_&cl=" + args["cl"] + "&d=" + dm_safe(nextOID);
+      nextarrow = "<a href=\"" + httpnextarrow + "\">" + nexttitle + "_iconnext_</a>\n";
+    }
+  }
+
+  if (!httpprevarrow.empty()) disp.setmacro ("httpprevarrow", "document", httpprevarrow);
+  if (!httpnextarrow.empty()) disp.setmacro ("httpnextarrow", "document", httpnextarrow);
+
+  textout << outconvert << disp << "<tr valign=middle>\n"
+	  << "<td align=right>" << previousarrow << "</td>\n"
+	  << "<td align=center valign=top>_document:gotoform_</td>"
+	  << "<td align=left>" << nextarrow << "</td>\n"
+	  << "</tr></table>\n";
+
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pagedbrowserclass.h	(revision 21083)
@@ -0,0 +1,63 @@
+/**********************************************************************
+ *
+ * pagedbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef PAGEDBROWSERCLASS_H
+#define PAGEDBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class pagedbrowserclass : public browserclass {
+protected:
+
+public:
+
+  pagedbrowserclass ();
+  virtual ~pagedbrowserclass ();
+
+  // returns the name that specifies the browserclass type
+  virtual text_t get_browser_name ();
+
+  void load_metadata_defaults (text_tset &metadata);
+
+  virtual void processOID (cgiargsclass &args, recptproto *collectproto,
+			   ostream &logout);
+
+
+  virtual int output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+  virtual int output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/parse.fl
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/parse.fl	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/parse.fl	(revision 21083)
@@ -0,0 +1,112 @@
+/* This is the lexical analyser - it returns tokens to the parsers.
+   This is used by both parsers - one for the build-time config files
+   and one for the run-time config files. Note the included file "parse.h"
+   is a symlink to the relevant header file. */
+
+%{
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/*#define YYSTYPE char * - YYSTYPE is defined in zparse.tab.h */
+#include "zparse.tab.h"
+
+/* forward declarations for std functions not picked up. */
+/*int fileno(FILE *);*/
+/*char *strdup(char *);*/
+
+int lineno=1;
+%}
+
+%option noyywrap
+
+COMMENT  \#.*(\n|\r)
+
+%x  STRINGCOND
+%%
+	char *string;
+	int string_len;
+
+{COMMENT}		lineno++;/*yylval.string=yytext;*/yyleng=0;
+,			return (',');
+:			return (':');
+\_			return ('_');
+\[GSDL[0-9]+\.[0-9]+\] yylval.string=yytext;return(GSDLVERSION);
+\[General\]		return (GENERAL_SECTION);
+\[Search\ [fF]ields\]	return (SEARCH_SECTION);
+\[Browse\ [fF]ields\]	return (BROWSE_SECTION);
+\[Macros\]		return (MACROS_SECTION);
+maintainer		return (MAINTAINER);
+Languages		return(LANGUAGES);
+About			return(ABOUT);
+Browse			return(BROWSE);
+Date[lL]ist		return(DATELIST);
+Document[aA]rrows[bB]ottom return(DOCUMENTARROWSBOTTOM);
+Document[bB]uttons	return(DOCUMENTBUTTONS);
+Document[hH]eader	return(DOCUMENTHEADER);
+Document[iI]mages	return(DOCUMENTIMAGES);
+Document[tT]ext		return(DOCUMENTTEXT);
+Icon[lL]ink		return(ICONLINK);
+List			return(LIST);
+Format			return(FORMAT);
+Name			return(NAME);
+Search[tT]ext		return(SEARCHTEXT);
+Section[lL]ist		return(SECTIONLIST);
+Sorted[lL]ist		return(SORTEDLIST);
+Sorted[sS]ection[lL]ist	return(SORTEDSECTIONLIST);
+Text[lL]ink		return(TEXTLINK);
+Type			return(TYPE);
+public			return (PUBLIC);
+true			return (TRUE);
+false			return (FALSE);
+^document		return (DOCUMENT);
+^section		return (SECTION);
+[iI]con			return (ICON);
+[sS]mall[iI]con		return (SMALLICON);
+\"			{string=NULL;BEGIN(STRINGCOND);}
+<STRINGCOND>{
+  ([^\"\\\n])*		{/* append this to our current string EXC NEWLINE */
+			if (string==NULL) string_len=0; else
+			string_len=strlen(string);
+			string=realloc(string,string_len+strlen(yytext)+1);
+			/* +1 is for trailing \0 */
+			strcpy(string+string_len,yytext);
+			}
+  ([^\"\\])*\n		{/* append this to our current string - INC NEWLINE */
+			lineno++;
+			if (string==NULL) string_len=0; else
+			string_len=strlen(string);
+			string=realloc(string,string_len+strlen(yytext)+1);
+			/* +1 is for trailing \0 */
+			strcpy(string+string_len,yytext);
+			}
+  "\\"\"		|
+  \"\"		{       /*replace quoted quote with one quote*/
+			string_len=strlen(string);
+			string=realloc(string,string_len+2);
+			string[string_len]='\"';
+			string[string_len+1]='\0';
+			}
+  \"		{
+			BEGIN(INITIAL);
+			yylval.string=string;
+			return(STRING);
+			  /* note that the string may have long bits of 
+			     whitespace in it that we could remove. */
+			}
+}
+[[:alnum:]@\.-]+	yylval.string=strdup(yytext);return (DATA);
+(" "|\t)		;
+(\n|\r)			lineno++;
+%%
+/******** deleted rules: *******
+en			return(EN);
+fr			return(FR);
+mi			return(MI);
+zh			return(ZH);
+de			return(DE);
+***************/
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/parse.yy.c
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/parse.yy.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/parse.yy.c	(revision 21083)
@@ -0,0 +1,1955 @@
+#line 2 "parse.yy.c"
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header$
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#include <unistd.h>
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		*yy_cp = yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 46
+#define YY_END_OF_BUFFER 47
+static yyconst short int yy_accept[274] =
+    {   0,
+        0,    0,   38,   38,   47,   46,   44,   45,   37,   46,
+        2,   43,    3,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   46,    4,   43,   43,   43,   43,   43,   43,
+       43,   43,   38,   39,   42,   46,    0,    1,    1,   43,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,    0,    0,    0,    0,   43,   43,
+       43,   43,   43,   43,   43,   38,   39,    0,   41,   40,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,    0,    0,    0,    0,    0,
+       43,   43,   43,   43,   43,   43,   43,   43,   43,   43,
+
+       43,   43,   35,   43,   21,   23,   43,   43,   43,   43,
+       43,   29,    0,    0,    0,    0,    0,   43,   35,   43,
+       43,   31,   43,   43,   12,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,    0,    0,    0,    0,
+        0,   32,   43,   43,   43,   43,   13,   43,   43,   22,
+       43,   43,   43,   43,   43,   43,   43,    0,    0,    0,
+        0,    0,   43,   30,   43,   43,   43,   43,   43,   43,
+       43,   43,   43,   43,   43,   43,    0,    0,    0,    0,
+        0,   43,   43,   34,   14,   43,   20,   43,   43,   43,
+       43,   43,   43,   28,    0,    0,    0,    9,    0,   43,
+
+       33,   43,   43,   43,   43,   43,   11,   43,   43,   36,
+       43,   43,    0,    5,    6,    0,   43,   43,   43,   43,
+       43,   43,   24,   43,   26,   43,    0,    0,   10,   43,
+       43,   43,   43,   43,   25,   43,    0,    0,   43,   43,
+       43,   43,   19,   43,    0,    0,   43,   43,   43,   43,
+       43,    0,    0,   43,   43,   17,   18,   43,    0,    0,
+       43,   16,   43,    8,    7,   43,   43,   43,   27,   43,
+       43,   15,    0
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    5,    1,    6,    7,    1,    1,    1,    1,    1,
+        1,    1,    1,    8,    9,   10,    1,   11,   11,   11,
+       11,   11,   11,   11,   11,   11,   11,   12,    1,    1,
+        1,    1,    1,    9,   13,   14,    9,   15,    9,   16,
+       17,   18,   19,    9,    9,   20,   21,   22,    9,    9,
+        9,    9,   23,   24,    9,    9,    9,    9,    9,    9,
+       25,   26,   27,    1,   28,    1,   29,   30,   31,   32,
+
+       33,   34,   35,   36,   37,    9,   38,   39,   40,   41,
+       42,   43,    9,   44,   45,   46,   47,    9,   48,   49,
+       50,    9,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[51] =
+    {   0,
+        1,    1,    1,    1,    1,    2,    1,    1,    3,    3,
+        3,    1,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    1,    2,    1,    1,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[279] =
+    {   0,
+        0,   19,   49,   50,  331,  332,  332,  332,  332,   54,
+      332,    0,  332,  300,  285,   25,  286,  296,   31,  297,
+       29,   28,   49,  332,  296,  293,  294,  275,  281,  276,
+      277,   40,  315,  314,  310,  309,   78,  332,   80,    0,
+      272,  271,  266,  280,  266,  267,  267,  262,  266,   48,
+      276,  260,  254,  259,  257,   62,  271,  266,  259,  255,
+      259,  265,  247,  262,  261,  288,  287,  286,  332,  332,
+      241,  239,  253,  238,  244,  242,  247,  235,  247,  235,
+      232,  238,  230,  229,  241,  231,  257,  230,  239,  240,
+      223,  226,  225,  226,  231,  216,  216,  215,  215,   54,
+
+      219,  229,   66,  210,    0,    0,  225,  218,  215,  220,
+       67,    0,  204,  231,  217,  205,  204,  214,    0,  200,
+      208,    0,  204,  206,    0,  209,  204,  207,  193,  201,
+      208,  200,  193,   70,  202,  196,  187,  220,  186,  187,
+      197,    0,  198,  195,  192,  182,    0,  178,  181,    0,
+      180,  185,   64,  178,  187,   74,  176,  183,   80,  186,
+      169,  177,  175,    0,  170,  169,  163,  162,  169,  173,
+      172,   72,  162,  166,  169,  163,  195,  188,  159,  170,
+      191,  154,  148,    0,    0,  107,    0,  148,  143,  154,
+      149,  144,  157,    0,   80,   88,  160,  332,   82,  153,
+
+        0,  141,  137,  150,  142,  148,    0,  134,  134,    0,
+      132,  131,  139,  332,  332,  138,  130,  129,  126,  142,
+      141,  120,    0,  122,    0,  130,  133,  131,    0,  119,
+      106,  119,  115,  103,    0,  106,  108,  107,   97,  100,
+      108,  107,    0,   98,  106,  103,   89,   92,   88,   85,
+       83,   84,   83,   87,   82,    0,    0,   87,   96,   91,
+       70,    0,   64,  332,  332,   62,   58,   56,    0,   58,
+       25,    0,  332,  153,  156,   56,  159,  162
+    } ;
+
+static yyconst short int yy_def[279] =
+    {   0,
+      273,    1,  274,  274,  273,  273,  273,  273,  273,  275,
+      273,  276,  273,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  273,  273,  276,  276,  276,  276,  276,  276,
+      276,  276,  277,  278,  273,  273,  275,  273,  275,  276,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  273,  273,  273,  273,  276,  276,
+      276,  276,  276,  276,  276,  277,  278,  278,  273,  273,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  273,  273,  273,  273,  273,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  273,  273,  273,  273,  273,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  273,  273,  273,  273,
+      273,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  276,  273,  273,  273,
+      273,  273,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  273,  273,  273,  273,
+      273,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  276,  276,  273,  273,  273,  273,  273,  276,
+
+      276,  276,  276,  276,  276,  276,  276,  276,  276,  276,
+      276,  276,  273,  273,  273,  273,  276,  276,  276,  276,
+      276,  276,  276,  276,  276,  276,  273,  273,  276,  276,
+      276,  276,  276,  276,  276,  276,  273,  273,  276,  276,
+      276,  276,  276,  276,  273,  273,  276,  276,  276,  276,
+      276,  273,  273,  276,  276,  276,  276,  276,  273,  273,
+      276,  276,  276,  273,  273,  276,  276,  276,  276,  276,
+      276,  276,    0,  273,  273,  273,  273,  273
+    } ;
+
+static yyconst short int yy_nxt[383] =
+    {   0,
+        6,    7,    8,    8,    7,    9,   10,   11,   12,   12,
+       12,   13,   14,   15,   16,   17,   12,   12,   18,   19,
+       12,   20,   21,   22,   23,    6,    6,   24,   12,   12,
+       12,   12,   12,   25,   12,   12,   26,   12,   12,   27,
+       12,   12,   28,   12,   29,   30,   12,   12,   12,   12,
+       31,   34,   34,   43,   35,   35,   38,   39,   40,   47,
+       53,   50,   55,   32,  272,   56,   44,   48,   51,   57,
+       52,   58,   65,  127,   36,   36,   80,   54,   81,   51,
+       38,   39,   38,   39,   87,  130,  136,  171,  155,  178,
+      159,  190,  127,  174,   88,  213,  175,  216,  196,  271,
+
+      261,  270,  258,  269,  130,  136,  155,  268,  267,  171,
+      190,  266,  174,  213,  214,  216,  261,  265,  175,  202,
+      203,  258,  264,  263,  204,  205,  262,  260,  259,  257,
+      206,  256,  255,  254,  253,  202,  203,  252,  251,  250,
+      249,  248,  204,  205,  247,  246,  245,  244,  243,  242,
+      241,  240,  206,   33,   33,   33,   37,   37,   37,   66,
+      239,   66,   68,  238,   68,  237,  236,  235,  234,  233,
+      232,  231,  230,  229,  228,  227,  226,  225,  224,  223,
+      222,  221,  220,  219,  218,  217,  215,  212,  211,  210,
+      209,  208,  207,  201,  200,  199,  198,  197,  196,  195,
+
+      194,  193,  192,  191,  189,  188,  187,  186,  185,  184,
+      183,  182,  181,  180,  179,  177,  176,  173,  172,  170,
+      169,  168,  167,  166,  165,  164,  163,  162,  161,  160,
+      159,  158,  157,  156,  154,  153,  152,  151,  150,  149,
+      148,  147,  146,  145,  144,  143,  142,  141,  140,  139,
+      138,  137,  135,  134,  133,  132,  131,  129,  128,  126,
+      125,  124,  123,  122,  121,  120,  119,  118,  117,  116,
+      115,  114,  113,  112,  111,  110,  109,  108,  107,  106,
+      105,  104,  103,  102,  101,  100,   99,   98,   67,   67,
+       67,   97,   96,   95,   94,   93,   92,   91,   90,   89,
+
+       86,   85,   84,   83,   82,   79,   78,   77,   76,   75,
+       74,   73,   72,   71,   70,   69,   67,   67,   64,   63,
+       51,   62,   61,   60,   59,   49,   46,   45,   42,   41,
+      273,    5,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273
+    } ;
+
+static yyconst short int yy_chk[383] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        2,    3,    4,   16,    3,    4,   10,   10,  276,   19,
+       22,   21,   23,    2,  271,   23,   16,   19,   21,   23,
+       21,   23,   32,  100,    3,    4,   50,   22,   50,   32,
+       37,   37,   39,   39,   56,  103,  111,  153,  134,  159,
+      159,  172,  100,  156,   56,  195,  156,  199,  196,  270,
+
+      254,  268,  251,  267,  103,  111,  134,  266,  263,  153,
+      172,  261,  156,  195,  196,  199,  254,  260,  156,  186,
+      186,  251,  259,  258,  186,  186,  255,  253,  252,  250,
+      186,  249,  248,  247,  246,  186,  186,  245,  244,  242,
+      241,  240,  186,  186,  239,  238,  237,  236,  234,  233,
+      232,  231,  186,  274,  274,  274,  275,  275,  275,  277,
+      230,  277,  278,  228,  278,  227,  226,  224,  222,  221,
+      220,  219,  218,  217,  216,  213,  212,  211,  209,  208,
+      206,  205,  204,  203,  202,  200,  197,  193,  192,  191,
+      190,  189,  188,  183,  182,  181,  180,  179,  178,  177,
+
+      176,  175,  174,  173,  171,  170,  169,  168,  167,  166,
+      165,  163,  162,  161,  160,  158,  157,  155,  154,  152,
+      151,  149,  148,  146,  145,  144,  143,  141,  140,  139,
+      138,  137,  136,  135,  133,  132,  131,  130,  129,  128,
+      127,  126,  124,  123,  121,  120,  118,  117,  116,  115,
+      114,  113,  110,  109,  108,  107,  104,  102,  101,   99,
+       98,   97,   96,   95,   94,   93,   92,   91,   90,   89,
+       88,   87,   86,   85,   84,   83,   82,   81,   80,   79,
+       78,   77,   76,   75,   74,   73,   72,   71,   68,   67,
+       66,   65,   64,   63,   62,   61,   60,   59,   58,   57,
+
+       55,   54,   53,   52,   51,   49,   48,   47,   46,   45,
+       44,   43,   42,   41,   36,   35,   34,   33,   31,   30,
+       29,   28,   27,   26,   25,   20,   18,   17,   15,   14,
+        5,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273,  273,  273,  273,  273,  273,  273,  273,  273,
+      273,  273
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "parse.fl"
+#define INITIAL 0
+/* This is the lexical analyser - it returns tokens to the parsers.
+   This is used by both parsers - one for the build-time config files
+   and one for the run-time config files. Note the included file "parse.h"
+   is a symlink to the relevant header file. */
+#line 7 "parse.fl"
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/*#define YYSTYPE char * - YYSTYPE is defined in zparse.tab.h */
+#include "zparse.tab.h"
+
+/* forward declarations for std functions not picked up. */
+/*int fileno(FILE *);*/
+/*char *strdup(char *);*/
+
+int lineno=1;
+#define STRINGCOND 1
+
+#line 559 "parse.yy.c"
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \
+		  && ferror( yyin ) ) \
+		YY_FATAL_ERROR( "input in flex scanner failed" );
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	if ( yyleng > 0 ) \
+		yy_current_buffer->yy_at_bol = \
+				(yytext[yyleng - 1] == '\n'); \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+#line 26 "parse.fl"
+
+	char *string;
+	int string_len;
+
+#line 718 "parse.yy.c"
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yy_start;
+		yy_current_state += YY_AT_BOL();
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			if ( yy_accept[yy_current_state] )
+				{
+				yy_last_accepting_state = yy_current_state;
+				yy_last_accepting_cpos = yy_cp;
+				}
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 274 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 332 );
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+		if ( yy_act == 0 )
+			{ /* have to back up */
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			yy_act = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+			case 0: /* must back up */
+			/* undo the effects of YY_DO_BEFORE_ACTION */
+			*yy_cp = yy_hold_char;
+			yy_cp = yy_last_accepting_cpos;
+			yy_current_state = yy_last_accepting_state;
+			goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 30 "parse.fl"
+lineno++;/*yylval.string=yytext;*/yyleng=0;
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 31 "parse.fl"
+return (',');
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 32 "parse.fl"
+return (':');
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 33 "parse.fl"
+return ('_');
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 34 "parse.fl"
+yylval.string=yytext;return(GSDLVERSION);
+	YY_BREAK
+case 6:
+YY_RULE_SETUP
+#line 35 "parse.fl"
+return (GENERAL_SECTION);
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+#line 36 "parse.fl"
+return (SEARCH_SECTION);
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 37 "parse.fl"
+return (BROWSE_SECTION);
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 38 "parse.fl"
+return (MACROS_SECTION);
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 39 "parse.fl"
+return (MAINTAINER);
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+#line 40 "parse.fl"
+return(LANGUAGES);
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+#line 41 "parse.fl"
+return(ABOUT);
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 42 "parse.fl"
+return(BROWSE);
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+#line 43 "parse.fl"
+return(DATELIST);
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+#line 44 "parse.fl"
+return(DOCUMENTARROWSBOTTOM);
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+#line 45 "parse.fl"
+return(DOCUMENTBUTTONS);
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 46 "parse.fl"
+return(DOCUMENTHEADER);
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 47 "parse.fl"
+return(DOCUMENTIMAGES);
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+#line 48 "parse.fl"
+return(DOCUMENTTEXT);
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+#line 49 "parse.fl"
+return(ICONLINK);
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+#line 50 "parse.fl"
+return(LIST);
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 51 "parse.fl"
+return(FORMAT);
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+#line 52 "parse.fl"
+return(NAME);
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+#line 53 "parse.fl"
+return(SEARCHTEXT);
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+#line 54 "parse.fl"
+return(SECTIONLIST);
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+#line 55 "parse.fl"
+return(SORTEDLIST);
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 56 "parse.fl"
+return(SORTEDSECTIONLIST);
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 57 "parse.fl"
+return(TEXTLINK);
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+#line 58 "parse.fl"
+return(TYPE);
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+#line 59 "parse.fl"
+return (PUBLIC);
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 60 "parse.fl"
+return (TRUE);
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+#line 61 "parse.fl"
+return (FALSE);
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+#line 62 "parse.fl"
+return (DOCUMENT);
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 63 "parse.fl"
+return (SECTION);
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 64 "parse.fl"
+return (ICON);
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 65 "parse.fl"
+return (SMALLICON);
+	YY_BREAK
+case 37:
+YY_RULE_SETUP
+#line 66 "parse.fl"
+{string=NULL;BEGIN(STRINGCOND);}
+	YY_BREAK
+
+case 38:
+YY_RULE_SETUP
+#line 68 "parse.fl"
+{/* append this to our current string EXC NEWLINE */
+			if (string==NULL) string_len=0; else
+			string_len=strlen(string);
+			string=realloc(string,string_len+strlen(yytext)+1);
+			/* +1 is for trailing \0 */
+			strcpy(string+string_len,yytext);
+			}
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+#line 75 "parse.fl"
+{/* append this to our current string - INC NEWLINE */
+			lineno++;
+			if (string==NULL) string_len=0; else
+			string_len=strlen(string);
+			string=realloc(string,string_len+strlen(yytext)+1);
+			/* +1 is for trailing \0 */
+			strcpy(string+string_len,yytext);
+			}
+	YY_BREAK
+case 40:
+#line 84 "parse.fl"
+case 41:
+YY_RULE_SETUP
+#line 84 "parse.fl"
+{       /*replace quoted quote with one quote*/
+			string_len=strlen(string);
+			string=realloc(string,string_len+2);
+			string[string_len]='\"';
+			string[string_len+1]='\0';
+			}
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+#line 90 "parse.fl"
+{
+			BEGIN(INITIAL);
+			yylval.string=string;
+			return(STRING);
+			  /* note that the string may have long bits of 
+			     whitespace in it that we could remove. */
+			}
+	YY_BREAK
+
+case 43:
+YY_RULE_SETUP
+#line 98 "parse.fl"
+yylval.string=strdup(yytext);return (DATA);
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 99 "parse.fl"
+;
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+#line 100 "parse.fl"
+lineno++;
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 101 "parse.fl"
+ECHO;
+	YY_BREAK
+#line 1055 "parse.yy.c"
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(STRINGCOND):
+	yyterminate();
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state();
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yy_c_buf_p;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer() )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yy_did_buffer_switch_on_eof = 0;
+
+				if ( yywrap() )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yy_c_buf_p =
+					yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yy_c_buf_p =
+				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+	{
+	register char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	yy_n_chars += number_to_move;
+	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+	yy_current_state += YY_AT_BOL();
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		if ( yy_accept[yy_current_state] )
+			{
+			yy_last_accepting_state = yy_current_state;
+			yy_last_accepting_cpos = yy_cp;
+			}
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 274 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		}
+
+	return yy_current_state;
+	}
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+	register char *yy_cp = yy_c_buf_p;
+
+	register YY_CHAR yy_c = 1;
+	if ( yy_accept[yy_current_state] )
+		{
+		yy_last_accepting_state = yy_current_state;
+		yy_last_accepting_cpos = yy_cp;
+		}
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 274 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 273);
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register char *yy_cp = yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yy_hold_char;
+
+	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			yy_n_chars = yy_current_buffer->yy_buf_size;
+
+		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = yy_hold_char;
+
+	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			/* This was really a NUL. */
+			*yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	yy_hold_char = *++yy_c_buf_p;
+
+	yy_current_buffer->yy_at_bol = (c == '\n');
+
+	return c;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	yy_init_buffer( yy_current_buffer, input_file );
+	yy_load_buffer_state();
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+	{
+	if ( yy_current_buffer == new_buffer )
+		return;
+
+	if ( yy_current_buffer )
+		{
+		/* Flush out information for old buffer. */
+		*yy_c_buf_p = yy_hold_char;
+		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	yy_current_buffer = new_buffer;
+	yy_load_buffer_state();
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yy_did_buffer_switch_on_eof = 1;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+	{
+	yy_n_chars = yy_current_buffer->yy_n_chars;
+	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+	yyin = yy_current_buffer->yy_input_file;
+	yy_hold_char = *yy_c_buf_p;
+	}
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer( b, file );
+
+	return b;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+	{
+	if ( ! b )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		yytext[yyleng] = yy_hold_char; \
+		yy_c_buf_p = yytext + n; \
+		yy_hold_char = *yy_c_buf_p; \
+		*yy_c_buf_p = '\0'; \
+		yyleng = n; \
+		} \
+	while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+#line 101 "parse.fl"
+
+/******** deleted rules: *******
+en			return(EN);
+fr			return(FR);
+mi			return(MI);
+zh			return(ZH);
+de			return(DE);
+***************/
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/phindaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/phindaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/phindaction.cpp	(revision 21083)
@@ -0,0 +1,957 @@
+/**********************************************************************
+ *
+ * phindaction.cpp -- 
+ *
+ * Copyright 2001 Gordon W. Paynter
+ * Copyright 2001 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// Note that this action uses mgpp to retrieve phind info, calling MGQuery
+// etc. directly, not through the protocol. This breaks our receptionist -
+// collection server separation and should be fixed some day I guess.
+
+#include "phindaction.h"
+#include "fileutil.h"
+
+phindaction::phindaction () {
+
+  cgiarginfo arg_ainfo;
+
+  arg_ainfo.shortname = "pc";
+  arg_ainfo.longname = "phind classifier";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pxml";
+  arg_ainfo.longname = "phind XML mode";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "ppnum";
+  arg_ainfo.longname = "phind phrase number";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pptext";
+  arg_ainfo.longname = "phind phrase text";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pfe";
+  arg_ainfo.longname = "phind first_e";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "ple";
+  arg_ainfo.longname = "phind last_e";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "10";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pfl";
+  arg_ainfo.longname = "phind first_l";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pll";
+  arg_ainfo.longname = "phind last_l";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "10";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pfd";
+  arg_ainfo.longname = "phind first_d";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "pld";
+  arg_ainfo.longname = "phind last_d";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "10";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+phindaction::~phindaction () {
+}
+
+void phindaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				    response_t &response,text_t &response_data, 
+				    ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+bool phindaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			     browsermapclass * /*browsers*/, displayclass &disp, 
+			     outconvertclass &outconvert, ostream &textout, 
+			     ostream &logout) {
+
+  unsigned long count_l, count_e, count_d;
+  unsigned long phrase = args["ppnum"].getulong();
+  text_t &word = args["pptext"];
+  unsigned long first_e = args["pfe"].getulong();
+  unsigned long last_e = args["ple"].getulong();
+  unsigned long first_l = args["pfl"].getulong();
+  unsigned long last_l = args["pll"].getulong();
+  unsigned long first_d = args["pfd"].getulong();
+  unsigned long last_d = args["pld"].getulong();
+  bool XMLmode = false;
+  if (args["pxml"] == "1") XMLmode = true;
+
+  // must have a valid collection server
+  recptproto *collectproto = protos->getrecptproto (args["c"], logout);
+  if (collectproto == NULL) {
+    output_error("phindaction: ERROR: collection not set", textout, 
+		 outconvert, disp, logout, XMLmode);
+    return true;
+  }
+
+  // the frequency and occurances of the phrase
+  unsigned long tf;
+  vector <unsigned long> el, linkdest, docNums, docfreq;
+  vector <UCArray> linktype;
+
+  // the number of occurances to display
+  unsigned long ef, lf, df;
+  
+  text_t basepath = filename_cat(gsdlhome, "collect", args["c"], 
+				 "index", "phind" + args["pc"]);
+
+  // If we don't know the phrase number, look it up
+  if (phrase == 0) {
+    
+    if (word.empty()) {
+      output_error("phindaction: ERROR: no phrase number or word", textout, 
+		   outconvert, disp, logout, XMLmode);
+      return true;
+    }
+
+    DocNumArray result;
+    find_phrase_number_from_word(basepath, word, result);
+    
+    if (result.empty()) {
+      output_error("phindaction: The search term does not occur in the collection",
+		   textout, outconvert, disp, logout, XMLmode);
+      return true;
+    } else {
+      phrase = result[0];
+    }
+  } 
+
+  // Create a TextData object to read the phrase data (pdata)
+  TextData textdata;
+
+  text_t fullpath = filename_cat(basepath, "pdata");
+  char *fullpathc = fullpath.getcstr();
+#if defined __WIN32__
+  char *base = "";
+#else
+  char *base = "/";
+#endif
+
+  if (!textdata.LoadData (base, fullpathc)) {
+    //    FatalError (1, "Couldn't load text information for \"%s\"", fullpathc);
+    exit (0);
+  }
+
+  delete fullpathc;
+
+  get_phrase_all_data(textdata, phrase, word, tf, ef, lf, df, el, 
+		      linkdest, linktype, docNums, docfreq);
+
+  // Output the header
+  if (XMLmode) {
+    textout << "Content-type: text/plain\n\n"
+	    << "<phinddata id=\"" << phrase 
+	    << "\" text=\"" << word 
+	    << "\" tf=\"" << tf 
+	    << "\" ef=\"" << ef 
+	    << "\" df=\"" << df 
+	    << "\" lf=\"" << lf 
+	    << "\">\n";
+  } else {
+    textout << "Content-type: text/html\n\n"
+	    << "<html><head><title>" << word << "</title></head>\n"
+	    << "<body><center>\n"
+	    << "<p><h1>" << word << "</h1>\n"
+	    << "<p><b>"<< word << "</b> occurs " 
+	    << tf << " times in " << df << " documents\n";
+  }
+
+  // Output the thesaurus links
+  if ((lf > 0) && (first_l < last_l)) {
+
+    // figure out the number of phrases to output
+    if (last_l > lf) {
+      last_l = lf;
+    }
+    count_l = last_l - first_l;
+    
+    if (XMLmode) {
+      textout << "<thesauruslist length=\"" << lf 
+	      << "\" start=\"" << first_l
+	      << "\" end=\"" << last_l << "\">\n";
+      print_thesaurus_links(args["c"], XMLmode, textdata, linkdest, linktype,
+			    first_l, last_l, disp, outconvert, textout);
+      textout << "</thesauruslist>\n";
+    }
+
+    // output links as HTML
+    else {
+      if (count_l == lf) {
+	textout << "<p><b> " << count_l << " thesaurus links</b>\n";
+      } else {
+	textout << "<p><b>" << count_l << " of " << lf << " thesaurus links</b>\n";
+      }
+
+      textout << "<p><table border=1><tr><th>type</th><th>topic</th><th>freq</th><th>docs</th></tr>\n";
+      print_thesaurus_links(args["c"], XMLmode, textdata, linkdest, linktype, 
+			    first_l, last_l, disp, outconvert, textout);
+      textout << "</table>\n";
+
+      if (last_l < lf) {
+	if ((last_l + 10) < lf) {
+	  textout << outconvert << disp 
+		  << "<br><a href=\"_gwcgi_?"
+		  << "c=" << args["c"]
+		  << "&ppnum=" << phrase 
+		  << "&pfe=" << first_e 
+		  << "&ple=" << last_e 
+		  << "&pfd=" << first_d 
+		  << "&pld=" << last_d
+		  << "&pfl=" << first_l 
+		  << "&pll=" << (last_l + 10)
+		  << "\">Get more thesaurus links</a>\n"; 
+	}
+	textout << outconvert << disp
+		<< "<br><a href=\"_gwcgi_?"
+		<< "c=" << args["c"]
+		<< "&ppnum=" << phrase 
+		<< "&pfe=" << first_e 
+		<< "&ple=" << last_e 
+		<< "&pfd=" << first_d 
+		<< "&pld=" << last_d 
+		<< "&pfl=" << first_l 
+		<< "&pll=" << lf
+		<< "\">Get every thesaurus link</a>\n" ;
+      }
+    }
+  }
+  
+  // Output the expansions
+  if ((ef > 0) && (first_e < last_e)) {
+
+    // figure out the number of phrases to output
+    if (last_e > el.size()) {
+      last_e = el.size();
+    }
+    count_e = last_e - first_e;
+
+    // output expansions as XML
+    if (XMLmode) {
+      textout << "<expansionlist length=\"" << ef 
+	      << "\" start=\"" << first_e
+	      << "\" end=\"" << last_e << "\">" << endl;
+
+      print_expansions(args["c"], XMLmode, word, textdata, el, first_e,
+		       last_e, disp, outconvert, textout);
+
+      textout << "</expansionlist>\n";
+    }
+
+    // output expansions as HTML
+    else {
+      if (count_e == el.size()) {
+	textout << "<p><b> " << count_e << " expansions</b>\n";
+      } else {
+	textout << "<p><b>" << count_e << " of " << ef << " expansions</b>\n";
+      }
+
+      textout << "<p><table border=1><tr><th colspan=3>phrase</th><th>freq</th><th>docs</th></tr>\n";
+      print_expansions(args["c"], XMLmode, word, textdata, el, first_e, 
+		       last_e, disp, outconvert, textout);
+      textout << "</table>\n";
+
+      if (last_e < ef) {
+	if ((last_e + 10) < ef) {
+	  textout << outconvert << disp 
+		  << "<br><a href=\"_gwcgi_?"
+		  << "c=" << args["c"]
+		  << "&ppnum=" << phrase 
+		  << "&pfe=" << first_e 
+		  << "&ple=" << (last_e + 10) 
+		  << "&pfd=" << first_d 
+		  << "&pld=" << last_d 
+		  << "&pfl=" << first_l 
+		  << "&pll=" << last_l
+		  << "\">Get more expansions</a>\n";
+	}
+	textout << outconvert << disp
+		<< "<br><a href=\"_gwcgi_?"
+		<< "c=" << args["c"]
+		<< "&ppnum=" << phrase 
+		<< "&pfe=" << first_e 
+		<< "&ple=" << ef
+		<< "&pfd=" << first_d 
+		<< "&pld=" << last_d 
+		<< "&pfl=" << first_l 
+		<< "&pll=" << last_l
+		<< "\">Get every expansion</a>\n";
+      }
+    }
+  }
+
+  // Output the document occurances
+  if ((df > 0) && (first_d < last_d)) {
+
+    // figure out the phrases to output
+    if (last_d > docNums.size()) {
+      last_d = docNums.size();
+    }
+    count_d = last_d - first_d;
+
+    // output document list as XML
+    if (XMLmode) {
+      textout << "<documentlist length=\"" << df 
+	      << "\" start=\"" << first_d
+	      << "\" end=\"" << last_d << "\">\n";
+      
+      print_documents(XMLmode, basepath, args["c"], docNums, docfreq,
+		      first_d, last_d, disp, outconvert, textout);
+
+      textout << "</documentlist>\n";
+    }
+
+    // output document list as HTML 
+    else {
+      
+      if (count_d == docNums.size()) {
+	textout << "<p><b> " << count_d << " documents</b>\n";
+      } else {
+	textout << "<p><b>" << count_d << " of " << df << " documents</b>\n";
+      }
+
+      textout << "<p><table border=1><tr><th align=left>document</th><th>freq</th></tr>\n";
+      print_documents(XMLmode, basepath, args["c"], docNums, docfreq, 
+		      first_d, last_d, disp, outconvert, textout);
+      textout << "</table>\n";
+      
+      if (last_d < df) {
+	if ((last_d + 10) < df) {
+	  textout << outconvert << disp
+		  << "<br><a href=\"_gwcgi_?"
+		  << "c=" << args["c"]
+		  << "&ppnum=" << phrase 
+		  << "&pfe=" << first_e 
+		  << "&ple=" << last_e 
+		  << "&pfd=" << first_d
+		  << "&pld=" << (last_d + 10)  
+		  << "&pfl=" << first_l 
+		  << "&pll=" << last_l
+		  << "\">Get more documents</a>\n";
+	}
+	textout << outconvert << disp 
+		<< "<br><a href=\"_gwcgi_?"
+		<< "c=" << args["c"]
+		<< "&ppnum=" << phrase 
+		<< "&pfe=" << first_e 
+		<< "&ple=" << last_e 
+		<< "&pfd=" << first_d 
+		<< "&pld=" << df
+		<< "&pfl=" << first_l 
+		<< "&pll=" << last_l
+		<< "\">Get every document</a>\n";
+      }
+    }
+  }
+
+  // Close the document
+  if (XMLmode) {
+    textout << "</phinddata>\n";
+  } else {
+    textout << "</center></body></html>\n";
+  }
+
+  textdata.UnloadData ();
+
+  return true;
+}
+
+// Find the phrase number of a word in the index file
+void phindaction::find_phrase_number_from_word(const text_t &basepath, 
+					       const text_t &query, 
+					       DocNumArray &result) {
+
+  // Open the index file for searching
+  IndexData indexData;
+
+  text_t fullpath = filename_cat(basepath, "pword");
+  char *fullpathc = fullpath.getcstr();
+#if defined __WIN32__
+  char *base = "";
+#else
+  char *base = "/";
+#endif
+
+  if (!indexData.LoadData (base, fullpathc)) {
+    //    FatalError (1, "Couldn't load index information for \"%s\"", fullpathc);
+    exit (0);
+  }
+
+  delete fullpathc;
+
+  // set up the query object
+  QueryInfo queryInfo;
+  SetCStr (queryInfo.docLevel, "Document");
+  queryInfo.maxDocs = 5;
+  queryInfo.sortByRank = true;
+  queryInfo.exactWeights = false;
+  queryInfo.needRankInfo = true;
+  queryInfo.needTermFreqs = true;
+  
+  // mode 1 = casefolded, unstemmed search
+  UCArray ucquery;
+  toUCArray(query, ucquery);
+  QueryNode *queryTree = ParseQuery(ucquery, 1, 1);
+      
+  // perform the query
+  ExtQueryResult queryResult;
+  MGQuery (indexData, queryInfo, queryTree, queryResult);
+  // cout << "-- word lookup result -- " << endl << queryResult << endl ;
+
+  result.clear();
+  result = queryResult.docs;
+
+  // delete the query
+  if (queryTree != NULL) delete queryTree;
+
+  indexData.UnloadData();
+}
+
+// Get all the data about a phrase
+//
+// The phrase is stored in textData as record phrase.
+// We retrieve:
+//   word - the text of the phrase
+//   tf - the total frequency of the phrase
+//   ef - the expansion frequency of the phrase
+//   lf - the thesaurus link frequency of the phrase
+//   df - the document frequency of the phrase
+//   el - the list of phrases that are expansions of phrase
+//   ll - the list of phrases that are thesaurus links 
+//   dl - the list of documents that contain phrase
+void phindaction::get_phrase_all_data(TextData &textdata, unsigned long phrase,
+				      text_t &word, unsigned long &tf, unsigned long &ef,
+				      unsigned long &lf, unsigned long &df,
+				      vector <unsigned long> &el,
+				      vector <unsigned long> &linkdest,
+				      vector <UCArray> &linktype,
+				      vector <unsigned long> &docnum, 
+				      vector <unsigned long> &docfrq) {
+  UCArray text;
+  UCArray docLevel;
+  SetCStr(docLevel, "Document");
+
+  // Look the word up in the textData
+  if (!GetDocText (textdata, docLevel, phrase, text)) {
+    //    FatalError (1, "Error while trying to get phrase %u", phrase);
+    exit (0);
+  }
+
+  // Ignore everything up to the first colon
+  UCArray::iterator next = text.begin();
+  while (*next++ != ':');
+
+  // ignore training carriage returns
+  while (text.back() == '\n') {
+    text.pop_back();
+  }
+  
+  // Get the word
+  word.clear();
+  for (; *next != ':'; next++) {
+    word.push_back(*next);
+  }
+  
+  // Get total frequency
+  tf = 0;
+  for (next++; *next != ':'; next++) {
+    tf *= 10;
+    tf += (*next - '0');
+  }
+  
+  // Get expansion frequency
+  ef = 0;
+  for (next++; *next != ':'; next++) {
+    ef *= 10;
+    ef += (*next - '0');
+  }
+  
+  // Get document frequency
+  df = 0;
+  for (next++; *next != ':'; next++) {
+    df *= 10;
+    df += (*next - '0');
+  }
+  
+  // Get expansion list
+  el.clear();
+  unsigned long e = 0;
+  for (next++; *next != ':'; next++) {
+    if (*next == ',') {
+      el.push_back(e);
+      e = 0;
+    } else {
+      e *= 10;
+      e += (*next - '0');
+    }
+  }
+
+  // Get document list & the document frequency list
+  docnum.clear();
+  docfrq.clear();
+  bool readnum = false;
+  unsigned long d = 0;
+  for (next++; *next != ':'; next++) {
+    if (*next == ',') {
+      docnum.push_back(d);
+      readnum = true;
+      d = 0;
+    } else if (*next == ';') {
+      if (readnum) {
+	docfrq.push_back(d);
+      } else {
+	docnum.push_back(d);
+	docfrq.push_back(1);
+      }
+      readnum = false;
+      d = 0;
+    } else {
+      d *= 10;
+      d += (*next - '0');
+    }
+  }
+
+  // Get thesaurus link frequency & link list
+  text.push_back(':');
+  text.push_back(':');
+
+  // link frequency
+  lf = 0;
+  for (next++; *next != ':'; next++) {
+    lf *= 10;
+    lf += (*next - '0');
+  }
+
+  // two lists of link data
+  linkdest.clear();
+  linktype.clear();
+  
+  UCArray thistype;
+  thistype.clear();
+  bool typedone = false;
+  unsigned long l = 0;
+  for (next++; *next != ':'; next++) {
+    
+    if (!typedone) {
+      // first read the link type, a charactor string
+      if (*next == ',') {
+	typedone = true;
+      } else {
+	thistype.push_back(*next);
+      }
+    } else {
+      // having read the link type, read the list of link destinations
+      if (*next == ',') {
+	linkdest.push_back(l);
+	linktype.push_back(thistype);
+	l = 0;
+      } else if (*next == ';') {
+	linkdest.push_back(l);
+	linktype.push_back(thistype);
+	l = 0;
+	thistype.clear();
+	typedone = false;
+      } else {
+	l *= 10;
+	l += (*next - '0');
+      }
+    }
+  }
+}
+
+void phindaction::print_thesaurus_links(const text_t &collection, bool XMLmode, 
+					TextData &textdata, vector <unsigned long> &linkdest,
+					vector <UCArray> &linktype, unsigned long first,
+					unsigned long last, displayclass &disp, 
+					outconvertclass &outconvert, ostream &textout) {
+
+  // information describing each link in the list
+  unsigned long phrase, tf, ef, df;
+  UCArray type, text;
+  
+  for (unsigned long l = first; l < last; l++) {
+
+    // get the phrase data
+    phrase = linkdest[l];
+    type = linktype[l];
+    get_phrase_freq_data(textdata, phrase, text, tf, ef, df);
+    
+    if (XMLmode) {
+      textout << "<thesaurus num=\"" << l 
+	      << "\" id=\"" << phrase
+	      << "\" tf=\"" << tf 
+	      << "\" df=\"" << df
+	      << "\" type=\"" << type
+	      << "\" text=\"" << text
+	      << "\"/>\n";
+    } else {
+      textout << "<tr valign=top><td>" << type << "</td><td>";
+      textout << outconvert << disp
+	      << "<a href=\"_gwcgi_?c=" << collection;
+      textout << "&ppnum=" << phrase << "\">" << text << "</a>"
+	      << "</td><td>" << tf << "</td><td>" << df << "</td></tr>\n";
+    }
+  }
+}
+
+// Get the frequency data about a phrase
+//
+// The phrase is stored in textData as record phrase.
+// We retrieve:
+//   word - the text of the phrase
+//   tf - the total frequency of the phrase
+//   ef - the expansion frequency of the phrase
+//   df - the document frequency of the phrase
+void phindaction::get_phrase_freq_data(TextData &textdata, unsigned long phrase,
+				       UCArray &word, unsigned long &tf, 
+				       unsigned long &ef, unsigned long &df) {
+  
+  UCArray text;
+  UCArray docLevel;
+  SetCStr(docLevel, "Document");
+
+  // Look the word up in the textData
+  if (!GetDocText (textdata, docLevel, phrase, text)) {
+    //    FatalError (1, "Error while trying to get phrase %u", phrase);
+    exit (0);
+  }
+
+  // Ignore everything up to the first colon
+  UCArray::iterator next = text.begin();
+  while (*next++ != ':');
+  
+  // Get the word
+  word.clear();
+  for (; *next != ':'; next++) {
+    word.push_back(*next);
+  }
+  
+  // Get total frequency
+  tf = 0;
+  for (next++; *next != ':'; next++) {
+    tf *= 10;
+    tf += (*next - '0');
+  }
+  
+  // Get expansion frequency
+  ef = 0;
+  for (next++; *next != ':'; next++) {
+    ef *= 10;
+    ef += (*next - '0');
+  }
+  
+  // Get document frequency
+  df = 0;
+  for (next++; *next != ':'; next++) {
+    df *= 10;
+    df += (*next - '0');
+  }
+}
+
+// Print a list of expansions
+//
+// Given the textData and a list of phrase numbers, print out each of the
+// expansions.
+void phindaction::print_expansions(const text_t &collection, bool XMLmode, 
+				   const text_t &body, TextData &textdata, 
+				   const vector <unsigned long> &elist,
+				   unsigned long first, unsigned long last,
+				   displayclass &disp, outconvertclass &outconvert,
+				   ostream &textout) {
+  
+  UCArray word;
+  unsigned long phrase, tf, df, ef;
+
+  UCArray suffix, prefix, ucbody;
+  
+  toUCArray(body, ucbody);
+
+  for (unsigned long e = first; e < last; e++) {
+
+    phrase = elist[e];
+    get_phrase_freq_data(textdata, phrase, word, tf, ef, df);
+
+    split_phrase(word, ucbody, prefix, suffix);
+    
+    if (XMLmode) {
+      // body is always the same as the text of the phrase, so no need to send it
+      textout << "<expansion num=\"" << e 
+	      << "\" id=\"" << phrase
+	      << "\" tf=\"" << tf 
+	      << "\" df=\"" << df;
+      if (!prefix.empty()) {
+	textout << "\" prefix=\"" << prefix;
+      }
+      if (!suffix.empty()) {
+	textout << "\" suffix=\"" << suffix;
+      }
+      textout << "\"/>\n";
+    } else {
+      textout << outconvert << disp 
+	      << "<tr valign=top><td align=right><a href=\"_gwcgi_?"
+	      << "c=" << collection << "&ppnum=" << phrase << "\">";
+      textout << prefix << "</a></td>";
+      textout <<outconvert << disp
+	      << "<td align=center><a href=\"_gwcgi_?"
+	      << "c=" << collection << "&ppnum=" << phrase << "\">"
+	      << body << "</a></td>"
+	      << "<td align=left><a href=\"_gwcgi_?"
+	      << "c=" << collection << "&ppnum=" << phrase << "\">";
+      textout << suffix << "</a></td>"
+	      << "<td>" << tf << "</td><td>" << df << "</td></tr>\n";
+    }
+  }
+}
+
+// split an expansion into prefix and suffix
+void phindaction::split_phrase(const UCArray &word, const UCArray &body, 
+			       UCArray &prefix, UCArray &suffix) {
+
+  prefix.clear();
+  suffix.clear();
+
+  bool readingPrefix = true;
+  UCArray::const_iterator here = word.begin();
+  UCArray::const_iterator end = word.end();
+  
+  while (here != end) {
+
+    // if we've not read all the prefix, add the next char to the prefix
+    if (readingPrefix) {
+      if (phrase_match(body, here, end)) {
+	readingPrefix = false;
+	// trim whitespace from end of prefix & start of suffix
+	if (!prefix.empty()) {
+	  prefix.pop_back();
+	}
+	if ((here != end) && (*here == ' ')) {
+	  here++;
+	}
+      } else {
+	prefix.push_back(*here);
+	here++;
+      }
+    }
+    // if we've finished with the prefix, update the suffix
+    else {
+      suffix.push_back(*here);
+      here++;
+    }
+  }
+}
+
+// phrase_match
+//
+// compare two strings, one represented as an UCArray, the other as two
+// UCArray iterators.
+//
+// Return true if the UCArray is the same as the phrase the iterators point
+// to for the length of the UCArray.
+bool phindaction::phrase_match(const UCArray &text, UCArray::const_iterator &here, 
+			       UCArray::const_iterator end) {
+
+  UCArray::const_iterator one_here = text.begin();
+  UCArray::const_iterator one_end  = text.end();
+  UCArray::const_iterator two_here = here;
+
+  // iterate over the length of the first string, comparing each element to
+  // the corresponding element in the second string.
+  while (one_here != one_end) {
+   
+      if (two_here == end) {
+	  return false;
+      } else if (*one_here != *two_here) {
+	  return false;
+      }
+      one_here++;
+      two_here++;
+  }
+
+  here = two_here;
+  return true;
+}
+
+void phindaction::print_documents(bool XMLmode, const text_t &basepath, 
+				  const text_t &collection,
+				  const vector <unsigned long> &docNums, 
+				  const vector <unsigned long> &docFreq,
+				  unsigned long first, unsigned long last,
+				  displayclass &disp, outconvertclass &outconvert,
+				  ostream &textout) {
+  
+  // Create a TextData object to read the document data
+  TextData docdata;
+
+  text_t fullpath = filename_cat(basepath, "docs");
+  char *fullpathc = fullpath.getcstr();
+#if defined __WIN32__
+  char *base = "";
+#else
+  char *base = "/";
+#endif
+
+  if (!docdata.LoadData (base, fullpathc)) {
+    //    FatalError (1, "Couldn't load text information for \"%s\"", fullpathc);
+    exit (0);
+  }
+
+  delete fullpathc;
+
+  UCArray title, hash;
+  unsigned long freq, doc;
+
+  for (unsigned long d = first; d < last; d++) {
+    doc = docNums[d];
+    freq = docFreq[d];
+
+    get_document_all_data(docdata, doc, title, hash);
+
+    if (XMLmode) {
+      textout << "<document num=\"" << d
+	      << "\" hash=\"" << hash 
+	      << "\" freq=\"" << freq 
+	      << "\" title=\"" << title << "\"/>\n";
+    } else {
+      textout << outconvert << disp
+	      << "<tr valign=top><td><a href=\"_gwcgi_?"
+	      << "c=" << collection;
+      textout << "&a=d&d=" << hash << "\">" << title << "</a>"
+	      << "</td><td>" << freq << "</td></tr>\n"; 
+    }
+  }
+
+  docdata.UnloadData();
+}
+
+// Get all the data about a docment
+//
+// The document's details are stored in docData as record docNum.
+// We retrieve:
+//   title - the document's title
+//   hash - the document's unique OID
+void phindaction::get_document_all_data(TextData &docdata, unsigned long docNum,
+					UCArray &title, UCArray &hash) {
+
+  UCArray text;
+  UCArray docLevel;
+  SetCStr(docLevel, "Document");
+
+  // Look the word up in the textData
+  if (!GetDocText (docdata, docLevel, docNum, text)) {
+    //    FatalError (1, "Error while trying to get document %u", docNum);
+    exit (0);
+  }
+
+  // Ignore everything up to the first colon
+  UCArray::iterator next = text.begin();
+  while (*next++ != '\t');
+  
+  // Get the document OID (hash)
+  hash.clear();
+  for (; *next != '\t'; next++) {
+    hash.push_back(*next);
+  }
+
+  // Get the title
+  text.push_back('\n');
+  title.clear();
+  for (next++; *next != '\n'; next++) {
+    title.push_back(*next);
+  }
+}
+
+void phindaction::toUCArray(const text_t &in, UCArray &out) {
+  out.clear();
+  text_t::const_iterator here = in.begin();
+  text_t::const_iterator end = in.end();
+  while (here != end) {
+    out.push_back((unsigned char) *here);
+    here++;
+  }
+}
+
+void phindaction::output_error (const text_t &message, ostream &textout, 
+				outconvertclass &outconvert,
+				displayclass & disp, ostream &logout,
+				bool XMLmode) {
+
+  logout << outconvert << message << "\n";
+  if (XMLmode) {
+    textout << outconvert
+	    << "<phinddata>\n"
+	    << "<phinderror>" << message << "</phinderror>\n"
+	    << "</phinddata>\n";
+  } else {
+    textout << outconvert << disp 
+	    << "_header_\n" 
+	    << message
+	    << "_footer_\n";
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/phindaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/phindaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/phindaction.h	(revision 21083)
@@ -0,0 +1,117 @@
+/**********************************************************************
+ *
+ * phindaction.cpp -- 
+ *
+ * Copyright 2001 Gordon W. Paynter
+ * Copyright 2001 The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef PHINDACTION_H
+#define PHINDACTION_H
+
+#include "action.h"
+
+// Include MGPP functionality.
+#include <TextGet.h>
+#include <MGQuery.h>
+#include <Terms.h>
+#include <messages.h>
+#include <GSDLQueryParser.h>
+
+class phindaction : public action {
+  
+protected:
+
+  void find_phrase_number_from_word(const text_t &basepath, 
+				    const text_t &query, 
+				    DocNumArray &result);
+
+  void get_phrase_all_data(TextData &textdata, unsigned long phrase,
+			   text_t &word, unsigned long &tf, unsigned long &ef,
+			   unsigned long &lf, unsigned long &df,
+			   vector <unsigned long> &el,
+			   vector <unsigned long> &linkdest,
+			   vector <UCArray> &linktype,
+			   vector <unsigned long> &docnum, 
+			   vector <unsigned long> &docfrq);
+
+  void print_thesaurus_links(const text_t &collection, bool XMLmode, 
+			     TextData &textdata, vector <unsigned long> &linkdest,
+			     vector <UCArray> &linktype, unsigned long first,
+			     unsigned long last, displayclass &disp, 
+			     outconvertclass &outconvert, ostream &textout);
+
+  void get_phrase_freq_data(TextData &textdata, unsigned long phrase,
+			    UCArray &word, unsigned long &tf, 
+			    unsigned long &ef, unsigned long &df);
+
+  void print_expansions(const text_t &collection, bool XMLmode, 
+			const text_t &body, TextData &textdata, 
+			const vector <unsigned long> &elist,
+			unsigned long first, unsigned long last,
+			displayclass &disp, outconvertclass &outconvert,
+			ostream &textout);
+
+  void split_phrase(const UCArray &word, const UCArray &body, 
+		    UCArray &prefix, UCArray &suffix);
+
+  bool phrase_match(const UCArray &text, UCArray::const_iterator &here, 
+		    UCArray::const_iterator end);
+
+  void print_documents(bool XMLmode, const text_t &basepath, 
+		       const text_t &collection,
+		       const vector <unsigned long> &docNums, 
+		       const vector <unsigned long> &docFreq,
+		       unsigned long first, unsigned long last,
+		       displayclass &disp, outconvertclass &outconvert,
+		       ostream &textout);
+
+  void get_document_all_data(TextData &docdata, unsigned long docNum,
+			     UCArray &title, UCArray &hash);
+
+  void toUCArray(const text_t &in, UCArray &out);
+
+  void output_error (const text_t &message, ostream &textout, 
+		     outconvertclass &outconvert,
+		     displayclass & disp, ostream &logout,
+		     bool XMLmode);
+
+
+public:
+  phindaction ();
+  virtual ~phindaction ();
+
+  text_t get_action_name () {return "phind";}
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response,text_t &response_data, 
+			 ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+
+};
+
+#endif PHINDACTION_H
Index: /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,44 @@
+/**********************************************************************
+ *
+ * phindbrowserclass.cpp -- 
+ *
+ * Copyright (C) 2000 The New Zealand Digital Library Project
+ *
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "phindbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+
+phindbrowserclass::phindbrowserclass () {
+}
+
+phindbrowserclass::~phindbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t phindbrowserclass::get_browser_name () {
+  return "Phind";
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/phindbrowserclass.h	(revision 21083)
@@ -0,0 +1,53 @@
+/**********************************************************************
+ *
+ * phindbrowserclass.h -- 
+ *
+ * Copyright (C) 2000 The New Zealand Digital Library Project
+ *
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// The phindbrowserclass is necessary to add a phind classifier to the user
+// interface and navigation bar, but is basically empty - all the work is
+// done in documentaction.cpp and in the document.dm macro file.  What
+// happens is that documentaction.cpp has a section that sets various
+// macros when the document in question is a phind classifier; thse are in
+// turn used by the macro file to load the applet into the web page.
+
+#ifndef PHINDBROWSERCLASS_H
+#define PHINDBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class phindbrowserclass : public browserclass {
+protected:
+
+public:
+
+  phindbrowserclass ();
+  virtual ~phindbrowserclass ();
+
+  // returns the name that specifies the browserclass type
+  virtual text_t get_browser_name ();
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/pingaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pingaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pingaction.cpp	(revision 21083)
@@ -0,0 +1,82 @@
+/**********************************************************************
+ *
+ * pingaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "pingaction.h"
+
+pingaction::pingaction () {
+  // this action uses cgi variable "a"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "ping";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+}
+
+void pingaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				   response_t &response, text_t &response_data, 
+				   ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+
+bool pingaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			    browsermapclass * /*browsers*/, displayclass &/*disp*/, 
+			    outconvertclass &outconvert, ostream &textout, 
+			    ostream &logout) {
+  bool wassuccess = false;
+  comerror_t err;
+  
+  recptproto *collectproto = protos->getrecptproto (args["c"], logout);
+  if (!args["c"].empty() && (collectproto != NULL)) {
+    collectproto->ping (args["c"], wassuccess, err, logout);
+    if (err != noError) wassuccess = false; // a communication error
+  }
+
+  textout << outconvert
+	  << "<html>\n"
+	  << "<head>\n"
+	  << "<title>Ping</title>\n"
+	  << "</head>\n"
+	  << "<body>\n"
+	  << "Ping for \"" << args["c"] << "\" ";
+
+  if (wassuccess) {
+    textout << outconvert << " succeeded.\n";
+  } else {
+    textout << outconvert << " did not succeed.\n";
+  }
+
+  textout << outconvert 
+	  << "</body>\n"
+	  << "</html>\n";
+
+  return true;
+};
Index: /main/tags/2.38/gsdl/src/recpt/pingaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/pingaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/pingaction.h	(revision 21083)
@@ -0,0 +1,52 @@
+/**********************************************************************
+ *
+ * pingaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef PINGACTION_H
+#define PINGACTION_H
+
+#include "gsdlconf.h"
+#include "action.h"
+
+
+class pingaction : public action {
+public:
+  pingaction ();
+  virtual ~pingaction () {}
+
+  text_t get_action_name () {return "ping";}
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/queryaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/queryaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/queryaction.cpp	(revision 21083)
@@ -0,0 +1,1481 @@
+/**********************************************************************
+ *
+ * queryaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "queryaction.h"
+#include "querytools.h"
+#include "formattools.h"
+#include "cgiutils.h"
+#include "OIDtools.h"
+//#include "infodbclass.h"
+#include "fileutil.h"
+#include "text_t.h"
+#include "historydb.h"
+#include "htmlutils.h" // for html_safe in do_action
+#include "gsdltools.h"
+
+void colinfo_t::clear () {
+  formatlistptr = NULL;
+  browserptr = NULL;
+}
+
+void QueryResult_t::clear() {
+  doc.clear();
+  collection.clear();
+}
+
+queryaction::queryaction () {
+
+  recpt = NULL;
+  num_phrases = 0;
+
+  // this action uses cgi variable "a"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "q";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+   // "ct" - 0 = mg, 1 = mgpp
+  arg_ainfo.shortname = "ct";
+  arg_ainfo.longname = "collection type";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+ 
+  // "b" - 0 = simple, 1 = advanced
+  arg_ainfo.shortname = "b";
+  arg_ainfo.longname = "query mode";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "h"
+  arg_ainfo.shortname = "h";
+  arg_ainfo.longname = "main index";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "h2"
+  arg_ainfo.shortname = "h2";
+  arg_ainfo.longname = "main index for second query";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "j"
+  arg_ainfo.shortname = "j";
+  arg_ainfo.longname = "sub collection index";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "j2"
+  arg_ainfo.shortname = "j2";
+  arg_ainfo.longname = "sub collection index for second query";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "n"
+  arg_ainfo.shortname = "n";
+  arg_ainfo.longname = "language index";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "n2"
+  arg_ainfo.shortname = "n2";
+  arg_ainfo.longname = "language index for second query";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+
+  // "q"
+  arg_ainfo.shortname = "q";
+  arg_ainfo.longname = "query string";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "q2"
+  arg_ainfo.shortname = "q2";
+  arg_ainfo.longname = "query string for second query";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "cq2" ""=don't combine, "and", "or", "not"
+  arg_ainfo.shortname = "cq2";
+  arg_ainfo.longname = "combine queries";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "t" - 1 = ranked 0 = boolean
+  arg_ainfo.shortname = "t";
+  arg_ainfo.longname = "search type";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "k"
+  arg_ainfo.shortname = "k";
+  arg_ainfo.longname = "casefolding";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "s"
+  arg_ainfo.shortname = "s";
+  arg_ainfo.longname = "stemming";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault ="0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "m"
+  arg_ainfo.shortname = "m";
+  arg_ainfo.longname = "maximum number of documents";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "50";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "o"
+  arg_ainfo.shortname = "o";
+  arg_ainfo.longname = "hits per page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "20";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "r"
+  arg_ainfo.shortname = "r";
+  arg_ainfo.longname = "start results from";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ccs"
+  arg_ainfo.shortname = "ccs";
+  arg_ainfo.longname = "cross collection searching";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ccp"
+  arg_ainfo.shortname = "ccp";
+  arg_ainfo.longname = "cross collection page";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "cc"
+  arg_ainfo.shortname = "cc";
+  arg_ainfo.longname = "collections to search";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "hd" history display  - search history only displayed when
+  // this var set to something other than 0
+  // this number of records is displayed
+  arg_ainfo.shortname = "hd";
+  arg_ainfo.longname = "history display";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.multiplevalue = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+	    
+  // "hs"  save - set to 1 in query form, so only save when submit
+  // query
+  // 0 = no save 1 = save
+  arg_ainfo.shortname = "hs";
+  arg_ainfo.longname = "history save";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "g" - new arg for granularity, for mgpp collections
+  arg_ainfo.shortname = "g";
+  arg_ainfo.longname = "granularity";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "Document";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "ds" - start date
+  arg_ainfo.shortname = "ds";
+  arg_ainfo.longname = "start date";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "de" - end date
+  arg_ainfo.shortname = "de";
+  arg_ainfo.longname = "end date";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "dsbc" - whether or not start date is prechristian
+  arg_ainfo.shortname = "dsbc";
+  arg_ainfo.longname = "start date bc";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "debc" - whether or not end date is prechristian
+  arg_ainfo.shortname = "debc";
+  arg_ainfo.longname = "end date bc";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "qt" - 0 = text, 1 = form
+  arg_ainfo.shortname = "qt";
+  arg_ainfo.longname = "query type";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "qb" - 0 = regular, 1 = large
+  arg_ainfo.shortname = "qb";
+  arg_ainfo.longname = "query box type";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "fqn" - number of fields in the query form
+  arg_ainfo.shortname = "fqn";
+  arg_ainfo.longname = "form query num fields";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "4";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "fqf" - the list of field names in the form query
+  // - a comma separated list
+  arg_ainfo.shortname = "fqf";
+  arg_ainfo.longname = "form query fields";
+  arg_ainfo.multiplechar = true;
+  //arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+  // "fqv" - the list of values in the form query
+  // - a comma separated list
+  arg_ainfo.shortname = "fqv";
+  arg_ainfo.longname = "form query values";
+  arg_ainfo.multiplechar = true;
+  //arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+
+  // "fqs" - the list of stemming options in the form query
+  // - a comma separated list
+  arg_ainfo.shortname = "fqs";
+  arg_ainfo.longname = "form query stems";
+  arg_ainfo.multiplechar = true;
+  //arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+
+  // "fqk" - the list of casefolding options in the form query
+  // - a comma separated list
+  arg_ainfo.shortname = "fqk";
+  arg_ainfo.longname = "form query casefolds";
+  arg_ainfo.multiplechar = true;
+  //arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+  // "fqc" - the list of boolean operators in the form query
+  // - a comma separated list
+  arg_ainfo.shortname = "fqc";
+  arg_ainfo.longname = "form query combines";
+  arg_ainfo.multiplechar = true;
+  //arg_ainfo.multiplevalue = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "fqa" - form query advanced - for "run query"
+  arg_ainfo.shortname = "fqa";
+  arg_ainfo.longname = "form query advanced query";
+  arg_ainfo.multiplechar = false;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "0";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+  
+}
+
+void queryaction::configure (const text_t &key, const text_tarray &cfgline) {
+  action::configure (key, cfgline);
+}
+
+bool queryaction::init (ostream &logout) {
+  return action::init (logout);
+}
+
+bool queryaction::check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+				 ostream &logout) {
+
+  // check t argument
+  int arg_t = args.getintarg("t");
+  if (arg_t != 0 && arg_t != 1) {
+    logout << "Warning: \"t\" argument out of range (" << arg_t << ")\n";
+    cgiarginfo *tinfo = argsinfo.getarginfo ("t");
+    if (tinfo != NULL) args["t"] = tinfo->argdefault;
+  }
+
+  // check k argument
+  int arg_k = args.getintarg("k");
+  if (arg_k != 0 && arg_k != 1) {
+    logout << "Warning: \"k\" argument out of range (" << arg_k << ")\n";
+    cgiarginfo *kinfo = argsinfo.getarginfo ("k");
+    if (kinfo != NULL) args["k"] = kinfo->argdefault;
+  }
+
+  // check s argument
+  int arg_s = args.getintarg("s");
+  if (arg_s != 0 && arg_s != 1) {
+    logout << "Warning: \"s\" argument out of range (" << arg_s << ")\n";
+    cgiarginfo *sinfo = argsinfo.getarginfo ("s");
+    if (sinfo != NULL) args["s"] = sinfo->argdefault;
+  }
+
+  // check m argument
+  int arg_m = args.getintarg("m");
+  if (arg_m < -1) {
+    logout << "Warning: \"m\" argument less than -1 (" << arg_m << ")\n";
+    cgiarginfo *minfo = argsinfo.getarginfo ("m");
+    if (minfo != NULL) args["m"] = minfo->argdefault;
+  }
+
+  // check o argument
+  int arg_o = args.getintarg("o");
+  if (arg_o < -1) {
+    logout << "Warning: \"o\" argument less than -1 (" << arg_o << ")\n";
+    cgiarginfo *oinfo = argsinfo.getarginfo ("o");
+    if (oinfo != NULL) args["o"] = oinfo->argdefault;
+  }
+
+  // check r argument
+  int arg_r = args.getintarg("r");
+  if (arg_r < 1) {
+    logout << "Warning: \"r\" argument less than 1 (" << arg_r << ")\n";
+    cgiarginfo *rinfo = argsinfo.getarginfo ("r");
+    if (rinfo != NULL) args["r"] = rinfo->argdefault;
+  }
+  //check hd argument
+  int arg_hd = args.getintarg("hd");
+  if (arg_hd <0 ) {
+    logout << "Warning: \"hd\" argument less than 0 (" << arg_hd << ")\n";
+    cgiarginfo *hdinfo = argsinfo.getarginfo ("hd");
+    if (hdinfo != NULL) args["hd"] = hdinfo->argdefault;
+  }  
+  
+  //check hs argument
+  int arg_hs = args.getintarg("hs");
+  if (arg_hs !=0 && arg_hs !=1) {
+    logout << "Warning: \"hs\" argument out of range (" << arg_hs << ")\n";
+    cgiarginfo *hsinfo = argsinfo.getarginfo ("hs");
+    if (hsinfo != NULL) args["hs"] = hsinfo->argdefault;
+  }
+
+  // check ct argument
+  int arg_ct = args.getintarg("ct");
+  if (arg_ct !=0 && arg_ct !=1) {
+    logout << "Warning: \"ct\" argument out of range (" << arg_ct << ")\n";
+    cgiarginfo *ctinfo = argsinfo.getarginfo ("ct");
+    if (ctinfo != NULL) args["ct"] = ctinfo->argdefault;
+  }
+
+  // check qt argument
+  int arg_qt = args.getintarg("qt");
+  if (arg_qt !=0 && arg_qt !=1) {
+    logout << "Warning: \"qt\" argument out of range (" << arg_qt << ")\n";
+    cgiarginfo *qtinfo = argsinfo.getarginfo ("qt");
+    if (qtinfo != NULL) args["qt"] = qtinfo->argdefault;
+  }
+
+  // check qb argument
+  int arg_qb = args.getintarg("qb");
+  if (arg_qb !=0 && arg_qb !=1) {
+    logout << "Warning: \"qb\" argument out of range (" << arg_qb << ")\n";
+    cgiarginfo *qbinfo = argsinfo.getarginfo ("qb");
+    if (qbinfo != NULL) args["qb"] = qbinfo->argdefault;
+  }
+
+  // check fqa argument
+  int arg_fqa = args.getintarg("fqa");
+  if (arg_fqa !=0 && arg_fqa !=1) {
+    logout << "Warning: \"fqa\" argument out of range (" << arg_fqa << ")\n";
+    cgiarginfo *fqainfo = argsinfo.getarginfo ("fqa");
+    if (fqainfo != NULL) args["fqa"] = fqainfo->argdefault;
+  }
+
+  // check fqn argument
+  int arg_fqn = args.getintarg("fqn");
+  if (arg_fqn < -1) {
+    logout << "Warning: \"fqn\" argument less than -1 (" << arg_fqn << ")\n";
+    cgiarginfo *fqninfo = argsinfo.getarginfo ("fqn");
+    if (fqninfo != NULL) args["fqn"] = fqninfo->argdefault;
+  }
+
+  return true;
+}
+
+void queryaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				    response_t &response, text_t &response_data, 
+				    ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+void queryaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					  recptprotolistclass * protos, 
+					  ostream &logout) {
+
+  // define_internal_macros sets the following macros:
+
+  // _quotedquery_  the part of the query string that was quoted for post-processing
+
+
+
+  // The following macros are set later (in define_query_macros) as they can't be set until 
+  // the query has been done.
+
+  // _freqmsg_      the term frequency string
+
+  // _resultline_   the "x documents matched the query" string
+
+  // _prevfirst_    these are used when setting up the links to previous/next
+  // _prevlast_     pages of results (_thisfirst_ and _thislast_ are used to set
+  // _nextfirst_    the 'results x-x for query: xxxx' string in the title bar)
+  // _nextlast_
+  // _thisfirst_
+  // _thislast_
+
+
+  // get the quoted bits of the query string and set _quotedquery_
+  text_tarray phrases;
+  get_phrases (args["q"], phrases);
+  num_phrases = phrases.size();
+  text_tarray::const_iterator phere = phrases.begin();
+  text_tarray::const_iterator pend = phrases.end();
+  bool first = true;
+  text_t quotedquery;
+  while (phere != pend) {
+    if (!first)
+      if ((phere +1) == pend) quotedquery += " and ";
+      else quotedquery += ", ";
+	
+    quotedquery += "\"" + *phere + "\"";
+    first = false;
+    phere ++;
+  }
+  if (args.getintarg("s") && !quotedquery.empty()) quotedquery += "_textstemon_";
+  disp.setmacro ("quotedquery", "query", quotedquery);
+
+  define_form_macros(disp, args, protos, logout);
+
+  
+  define_query_interface(disp, args, protos, logout);
+
+  
+
+  
+
+
+}
+
+void queryaction::define_query_interface(displayclass &disp, 
+					 cgiargsclass &args, 
+					 recptprotolistclass * protos, 
+					 ostream &logout){
+  text_t collection = args["c"];
+
+  //check that the protocol is alive
+  recptproto* colproto = protos->getrecptproto (collection, logout);
+  if(colproto == NULL) {
+    logout << "ERROR: Null collection protocol trying to query"
+	   << collection.getcstr() << "\n";
+    return;
+  }
+  
+  //check the collection is responding/in place
+  ColInfoResponse_t *colinfo = recpt->get_collectinfo_ptr(colproto, collection,
+							  logout);
+  if(colinfo == NULL){
+    logout << "ERROR: Null returned for get_collectinfo_ptr on "
+	   << collection.getcstr() << "in queryaction::define_query_interface\n";
+    return;
+  }
+  
+    
+  text_tmap::iterator check = colinfo->format.find("QueryInterface");
+  if(check != colinfo->format.end()){
+    if((*check).second=="DateSearch"){
+      text_t current = "_basicqueryform_ _datesearch_";
+      
+      disp.setmacro("queryformcontent","query",current);
+    }
+  }
+}
+
+
+// sets the selection box macros _hselection_, _jselection_, and _nselection_.
+void queryaction::set_option_macro (const text_t &macroname, text_t current_value,
+				    const FilterOption_t &option, displayclass &disp) {
+  
+  if (option.validValues.empty()) return;
+  else if (option.validValues.size() == 1) {
+    disp.setmacro (macroname + "selection", "Global", "_" + option.defaultValue + "_");
+    return;
+  } 
+  if (option.validValues.size() < 2) return;
+  
+  text_t macrovalue = "<select name=\"" + macroname + "\">\n";
+  
+  if (current_value.empty()) current_value = option.defaultValue;
+  
+  text_tarray::const_iterator thisvalue = option.validValues.begin();
+  text_tarray::const_iterator endvalue = option.validValues.end();
+
+  while (thisvalue != endvalue) {
+    macrovalue += "<option value=\"" + *thisvalue + "\"";
+    if (*thisvalue == current_value)
+      macrovalue += " selected";
+    macrovalue += ">_" + *thisvalue + "_\n";
+    thisvalue ++;
+  }
+  macrovalue += "</select>\n";
+  disp.setmacro (macroname + "selection", "Global", macrovalue);
+}
+
+// sets the selection box macro _fqfselection_.
+void queryaction::set_fqfselection_macro (const FilterOption_t &option, 
+					 displayclass &disp) {
+
+  if (option.validValues.empty()) return;
+  text_t macrovalue = "";
+
+  if (option.validValues.size() == 1) {
+    macrovalue = "_ZZ_";
+  }
+  else {
+    macrovalue += "<select name=\"fqf\" onChange=\"updatefqf();\">\n";
+    
+    text_tarray::const_iterator thisvalue = option.validValues.begin();
+    text_tarray::const_iterator endvalue = option.validValues.end();
+    
+    while (thisvalue != endvalue) {
+      macrovalue += "<option value=\"" + *thisvalue + "\">_";    
+      macrovalue += *thisvalue + "_\n";
+      thisvalue ++;
+    }
+    macrovalue += "</select>\n";
+  }
+  disp.setmacro ("fqfselection", "query", macrovalue);
+
+}
+// sets the selection box macros _gselection_.
+void queryaction::set_gselection_macro (text_t current_value,
+					const FilterOption_t &option, 
+					displayclass &disp) {
+  
+  if (option.validValues.size() <= 1) {
+    return;
+  } 
+  
+  text_t macrovalue = "<select name=\"g\">\n";
+  
+  if (current_value.empty()) current_value = option.defaultValue;
+  
+  text_tarray::const_iterator thisvalue = option.validValues.begin();
+  text_tarray::const_iterator endvalue = option.validValues.end();
+
+  while (thisvalue != endvalue) {
+    macrovalue += "<option value=\"" + *thisvalue + "\"";
+    if (*thisvalue == current_value)
+      macrovalue += " selected";
+    macrovalue += ">_" + *thisvalue + "_\n";
+    thisvalue ++;
+  }
+  macrovalue += "</select>\n";
+  disp.setmacro ("gselection", "Global", macrovalue);
+}
+
+void queryaction::define_external_macros (displayclass &disp, cgiargsclass &args, 
+					  recptprotolistclass *protos, ostream &logout) {
+
+  // define_external_macros sets the following macros:
+
+  // some or all of these may not be required to be set
+  // _hselection_, _h2selection_  the selection box for the main part of the index
+  // _jselection_, _j2selection_  the selection box for the subcollection part of the index
+  // _nselection_, _n2selection_  the selection box for the language part of the index
+  // _cq2selection                the selection box for combining two queries
+  
+
+  // can't do anything if collectproto is null (i.e. no collection was specified)
+  recptproto *collectproto = protos->getrecptproto (args["c"], logout);
+  if (collectproto == NULL) return;
+
+  comerror_t err;
+  InfoFilterOptionsResponse_t response;
+  InfoFilterOptionsRequest_t request;
+  request.filterName = "QueryFilter";
+  
+  collectproto->get_filteroptions (args["c"], request, response, err, logout);
+  if (err == noError) {
+    
+    FilterOption_tmap::const_iterator it;
+    FilterOption_tmap::const_iterator end = response.filterOptions.end();
+    
+    // _hselection_ and _h2selection_ (Index)
+    it = response.filterOptions.find ("Index");
+    if (it != end) set_option_macro ("h", args["h"], (*it).second, disp);
+    if (it != end) set_option_macro ("h2", args["h2"], (*it).second, disp);
+    
+    // _jselection_ and _j2selection_ (Subcollection)
+    it = response.filterOptions.find ("Subcollection");
+    if (it != end) set_option_macro ("j", args["j"], (*it).second, disp);
+    if (it != end) set_option_macro ("j2", args["j2"], (*it).second, disp);
+    
+    // _nselection_ and _n2selection_ (Language)
+    it = response.filterOptions.find ("Language");
+    if (it != end) set_option_macro ("n", args["n"], (*it).second, disp);
+    if (it != end) set_option_macro ("n2", args["n2"], (*it).second, disp);
+
+    // _cq2selection_ (CombineQuery)
+    it = response.filterOptions.find ("CombineQuery");
+    if (it != end) set_option_macro ("cq2", args["cq2"], (*it).second, disp);
+
+    // _gselection_ (Level) // for mgpp collections
+    it = response.filterOptions.find("Level");
+    if (it!=end) set_gselection_macro(args["g"], (*it).second, disp);
+
+    // should probably go into define_internal_macros
+    // _fqfselection_
+    it = response.filterOptions.find("IndexField");
+    if (it!=end) {
+      set_fqfselection_macro((*it).second, disp);
+    }
+  }
+} // define external macros
+
+void queryaction::define_form_macros (displayclass &disp, cgiargsclass &args, 
+			   recptprotolistclass *protos, ostream &logout) {
+
+  // defines the following macros
+  // _regformlist_
+  // _advformlist_
+
+  if (args["ct"]!="1" || args["qt"]!="1") 
+    return; // dont need these macros
+
+    // mgpp & form query only needs the macros defined
+  text_t form = "";
+  int argfqn = args.getintarg("fqn");
+  
+  if (args["b"] == "1") { // advanced form
+    form += "<tr>_firstadvformelement_</tr>\n";
+    for (int i=1; i<argfqn; i++) {      
+	form += "<tr>_advformelement_</tr>\n";
+    }
+    disp.setmacro("advformlist", "query", form);
+  }
+  else { // simple form
+    for (int i=0; i<argfqn; i++) {
+      form += "<tr>_regformelement_</tr>\n"; 
+    }
+    disp.setmacro("regformlist", "query", form);
+  }
+  
+}
+
+void queryaction::define_history_macros (displayclass &disp, cgiargsclass &args, 
+					 recptprotolistclass *protos, ostream &logout) {
+
+  // defines the following macros
+
+  // _searchhistorylist_
+
+  text_t historylist;
+  int arghd = args.getintarg("hd");
+  if (arghd == 0) {
+    historylist="";
+  }
+  else {
+    historylist = "<!-- Search History List -->\n";
+   
+    text_t userid = args["z"];
+    text_tarray entries;
+    if (get_history_info (userid, entries, gdbmhome, logout)) {
+      int count = 1;
+      text_tarray::iterator here = entries.begin();
+      text_tarray::iterator end = entries.end();
+      int numrecords=(int)entries.size();
+      if (numrecords>arghd) { // only display some of them 
+	numrecords = arghd;
+      }
+      historylist += "<form name=\"HistoryForm\"><table width=537>\n";
+
+      for (int i=0; i<numrecords;i++) {
+	text_t query;
+	text_t numdocs;
+	text_t cgiargs;
+	text_t userinfo;
+	text_t escquery;
+	split_saved_query(entries[i],numdocs,cgiargs);
+	parse_saved_args(cgiargs, "q", query); // get query string out
+	decode_cgi_arg(query); // un cgisafe it
+	escquery = escape_quotes(query); // escape the quotes and newlines
+	text_t histvalue = "histvalue";
+	histvalue += i;
+	disp.setmacro(histvalue, "query", escquery);
+	format_user_info(cgiargs, userinfo, args, protos, logout);
+	
+	historylist += "<tr><td align=right>_imagehistbutton_(";
+	historylist += i;
+	historylist += ")</td>\n";
+	historylist += "<td><nobr><table border=1 cellspacing=0 ";
+	historylist += "cellpadding=0><tr><td width=365 align=left>"
+	  + query 
+	  + "</td></tr></table></td><td width=110 align=center><small>"
+	  + numdocs;
+	if (numdocs == 1) historylist += " _texthresult_";
+	else historylist += " _texthresults_";
+	if (!userinfo.empty()) {
+	  historylist += "<br>( "+userinfo+" )</small></td>\n";
+	}
+      }
+      historylist+="</table></form>\n\n";
+     
+    } // if get history info 
+    else {
+      historylist += "_textnohistory_";
+    }
+    historylist += "<p><! ---- end of history list ----->\n";
+  } // else display list
+  disp.setmacro("searchhistorylist", "query", historylist);
+  
+} // define history macros
+
+void queryaction::output_ccp (cgiargsclass &args, recptprotolistclass *protos,
+			      displayclass &disp, outconvertclass &outconvert,
+			      ostream &textout, ostream &logout) {
+
+  ColInfoResponse_t *cinfo = NULL;
+  comerror_t err;
+  InfoFilterOptionsResponse_t fresponse;
+  InfoFilterOptionsRequest_t frequest;
+  frequest.filterName = "QueryFilter";
+
+  text_t &index = args["h"];
+  text_t &subcollection = args["j"];
+  text_t &language = args["n"];
+
+  text_tset collections;
+  text_t arg_cc = args["cc"];
+  decode_cgi_arg (arg_cc);
+  splitchar (arg_cc.begin(), arg_cc.end(), ',', collections);
+
+  textout << outconvert << disp << "_query:header_\n"
+	  << "<center>_navigationbar_</center><br>\n"
+	  << "<form name=QueryForm method=get action=\"_gwcgi_\">\n"
+	  << "<input type=hidden name=a value=\"q\">\n"
+          << "<input type=hidden name=site value=\"_cgiargsite_\"\n"
+	  << "<input type=hidden name=e value=\"_compressedoptions_\">\n"
+	  << "<input type=hidden name=ccp value=\"1\">\n"
+	  << "<center><table width=_pagewidth_><tr valign=top>\n"
+	  << "<td>Select collections to search for \"" << args["q"] 
+	  << "\" <i>(index=" << index << " subcollection=" << subcollection
+	  << " language=" << language << ")</i></td>\n"
+	  << "<td><input type=\"submit\" value=\"_query:textbeginsearch_\"></td>\n"
+	  << "</tr></table></center>\n"
+	  << "<center><table width=_pagewidth_>\n"
+	  << "<tr><td>\n";
+  
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+      
+      text_tarray collist;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+	while (collist_here != collist_end) {
+	  
+	  cinfo = recpt->get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, logout);
+	  //	  if (err == noError && cinfo.isPublic && (cinfo.buildDate > 0)) {
+	  if (cinfo != NULL && (cinfo->buildDate > 0)) {
+	    
+	    (*rprotolist_here).p->get_filteroptions (*collist_here, frequest, fresponse, err, logout);
+	    if (err == noError) {
+	      
+	      FilterOption_tmap::const_iterator it;
+	      FilterOption_tmap::const_iterator end = fresponse.filterOptions.end();
+	      if (!index.empty()) {
+		it = fresponse.filterOptions.find ("Index");
+		if (it == end) {collist_here ++; continue;}
+		text_tarray::const_iterator there = (*it).second.validValues.begin();
+		text_tarray::const_iterator tend = (*it).second.validValues.end();
+		while (there != tend) {
+		  if (*there == index) break;
+		  there ++;
+		}
+		if (there == tend) {collist_here++; continue;}
+	      }
+	      if (!subcollection.empty()) {
+		it = fresponse.filterOptions.find ("Subcollection");
+		if (it == end) {collist_here++; continue;}
+		text_tarray::const_iterator there = (*it).second.validValues.begin();
+		text_tarray::const_iterator tend = (*it).second.validValues.end();
+		while (there != tend) {
+		  if (*there == subcollection) break;
+		  there ++;
+		}
+		if (there == tend) {collist_here++; continue;}
+	      }
+	      if (!language.empty()) {
+		it = fresponse.filterOptions.find ("Language");
+		if (it == end) {collist_here++; continue;}
+		text_tarray::const_iterator there = (*it).second.validValues.begin();
+		text_tarray::const_iterator tend = (*it).second.validValues.end();
+		while (there != tend) {
+		  if (*there == language) break;
+		  there ++;
+		}
+		if (there == tend) {collist_here++; continue;}
+	      }
+	    
+	      // we've got a matching collection
+	      textout << "<input type=checkbox";
+
+	      text_tset::const_iterator t = collections.find (*collist_here);
+	      if (t != collections.end()) textout << " checked";
+
+	      textout << outconvert 
+		      << " name=cc value=\"" << *collist_here << "\">";
+	      
+	      if (!cinfo->collectionmeta["collectionname"].empty())
+		textout << outconvert << disp << cinfo->collectionmeta["collectionname"];
+	      else 
+		textout << outconvert << *collist_here;
+	      
+	      textout << "<br>\n";
+	      
+	    }
+	  }
+	  collist_here ++;
+	}
+      }
+    }
+    rprotolist_here ++;
+  }
+  textout << outconvert << disp 
+	  << "</td></tr></table></center>\n"
+	  << "</form>\n"
+	  << "_query:footer_\n";
+  
+}
+
+bool queryaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			     browsermapclass *browsers, displayclass &disp, 
+			     outconvertclass &outconvert, ostream &textout, 
+			     ostream &logout) {
+  
+  if (recpt == NULL) {
+    logout << "ERROR (queryaction::do_action): This action does not contain information\n"
+	   << "      about any receptionists. The method set_receptionist was probably\n"
+	   << "      not called from the module which instantiated this action.\n";
+    return true;
+  }
+
+
+  if (args["ccs"] == "1") {
+    if (!args["cc"].empty()) {
+      // query the selected collections
+      text_t::const_iterator b = args["cc"].begin();
+      text_t::const_iterator e = args["cc"].end();
+      if (findchar (b, e, ',') != e) {
+	if (!search_multiple_collections (args, protos, browsers, disp, outconvert,
+					  textout, logout)) return false;
+	return true;
+      } else {
+	if (!search_single_collection (args, args["cc"], protos, browsers, disp, 
+				       outconvert, textout, logout)) return false;
+  	return true;
+      }
+    }
+  }
+
+  // simply query the current collection
+  if (!search_single_collection (args, args["c"], protos, browsers, disp, 
+				 outconvert, textout, logout)) return false;
+  return true;
+}
+
+bool queryaction::search_multiple_collections (cgiargsclass &args, recptprotolistclass *protos,
+					       browsermapclass *browsers, displayclass &disp,
+					       outconvertclass &outconvert, ostream &textout,
+					       ostream &logout) {
+
+  text_tarray collections;
+  
+  text_t arg_cc = args["cc"];
+  decode_cgi_arg (arg_cc);
+  splitchar (arg_cc.begin(), arg_cc.end(), ',', collections);
+
+  if (collections.empty()) {
+    logout << "queryaction::search_multiple_collections: No collections "
+	   << "set for doing multiple query - will search current collection\n";
+    textout << outconvert << disp << "_query:textwarningnocollections_\n";
+    return search_single_collection (args, args["c"], protos, browsers, disp, 
+				     outconvert, textout, logout);
+  }
+
+  // queryaction uses "VList" browser to display results,
+  // a queries clasification is "Search"
+  text_t browsertype = "VList";
+  text_t classification = "Search";
+
+  QueryResult_tset results;
+  map<text_t, colinfo_t, lttext_t> colinfomap;
+
+  ColInfoResponse_t *cinfo = NULL;
+  recptproto *collectproto = NULL;
+  comerror_t err;
+  FilterRequest_t request;
+  FilterResponse_t response;
+  request.filterResultOptions = FROID | FRmetadata | FRtermFreq | FRranking;
+  text_t formattedstring = args["q"];
+  text_t freqmsg = "_textfreqmsg1_";
+  int numdocs = 0;
+  isapprox isApprox = Exact;
+
+  format_querystring (formattedstring, args.getintarg("b"));
+  set_queryfilter_options (request, formattedstring, args);
+
+  // need to retrieve maxdocs matches for each collection
+  // (will eventually want to tidy this up, do so caching etc.)
+  OptionValue_t option;
+  option.name = "StartResults";
+  option.value = "1";
+  request.filterOptions.push_back (option);
+  
+  option.name = "EndResults";
+  option.value = args["m"];
+  request.filterOptions.push_back (option);
+
+  text_tarray::iterator col_here = collections.begin();
+  text_tarray::iterator col_end = collections.end();
+
+  map<text_t, int, lttext_t> termfreqs;
+  while (col_here != col_end) {
+
+    request.fields.erase (request.fields.begin(), request.fields.end());
+    request.getParents = false;
+
+    collectproto = protos->getrecptproto (*col_here, logout);
+    if (collectproto == NULL) {
+      logout << outconvert << "queryaction::search_multiple_collections: " << *col_here 
+	     << " collection has a NULL collectproto, ignoring\n";
+      col_here ++;
+      continue;
+    }
+    cinfo = recpt->get_collectinfo_ptr (collectproto, *col_here, logout);
+    if (cinfo == NULL) {
+      logout << "ERROR (query_action::search_multiple_collections): get_collectinfo_ptr returned NULL\n";
+      col_here ++;
+      continue;
+    }
+    
+    browserclass *bptr = browsers->getbrowser (browsertype);
+
+    // get the formatstring if there is one 
+    text_t formatstring;
+    if (!get_formatstring (classification, browsertype, 
+			   cinfo->format, formatstring))
+      formatstring = bptr->get_default_formatstring();
+
+    bptr->load_metadata_defaults (request.fields);
+
+    format_t *formatlistptr = new format_t();
+    parse_formatstring (formatstring, formatlistptr, request.fields, request.getParents);
+
+    colinfo_t thiscolinfo;
+    thiscolinfo.formatlistptr = formatlistptr;
+    thiscolinfo.browserptr = bptr;
+    colinfomap[*col_here] = thiscolinfo;
+    
+    // do the query
+    collectproto->filter (*col_here, request, response, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii
+	     << "queryaction::search_multiple_collections: call to QueryFilter failed "
+	     << "for " << *col_here << " collection (" << get_comerror_string (err) << ")\n";
+      return false;
+    }
+
+    if (isApprox == Exact)
+      isApprox = response.isApprox;
+    else if (isApprox == MoreThan)
+      if (response.isApprox == Approximate)
+	isApprox = response.isApprox;
+
+    TermInfo_tarray::const_iterator this_term = response.termInfo.begin();
+    TermInfo_tarray::const_iterator end_term = response.termInfo.end();
+    while (this_term != end_term) {
+      termfreqs[(*this_term).term] += (*this_term).freq;
+      if ((col_here+1) == col_end) {
+	freqmsg += (*this_term).term + ": " + termfreqs[(*this_term).term];
+	if ((this_term+1) != end_term) freqmsg += ", ";
+      }
+      this_term ++;
+    }
+    
+    if (response.numDocs > 0) {
+      numdocs += response.numDocs;
+
+      QueryResult_t thisresult;
+      thisresult.collection = *col_here;
+      ResultDocInfo_tarray::iterator doc_here = response.docInfo.begin();
+      ResultDocInfo_tarray::iterator doc_end = response.docInfo.end();
+      while (doc_here != doc_end) {
+	thisresult.doc = *doc_here;
+	results.insert (thisresult);
+	doc_here ++;
+      }
+    }
+    col_here ++;
+  }
+
+  disp.setmacro ("freqmsg", "query", freqmsg);
+
+  int maxdocs = args.getintarg("m");
+  int firstdoc = args.getintarg("r");
+  int hitsperpage = args.getintarg("o");
+  if (num_phrases > 0) isApprox = Exact;
+  if (maxdocs == -1) maxdocs = numdocs;
+  else if (numdocs > maxdocs) {
+    numdocs = maxdocs;
+    isApprox = MoreThan;
+  }
+  if (hitsperpage == -1) hitsperpage = numdocs;
+
+  text_t resline;
+  if (isApprox == Approximate) resline = "_textapprox_";
+  else if (isApprox == MoreThan) resline = "_textmorethan_";
+  
+  if (numdocs == 0) resline = "_textnodocs_";
+  else if (numdocs == 1) resline += "_text1doc_";
+  else resline += text_t(numdocs) + " _textlotsdocs_";
+  disp.setmacro("resultline", "query", resline);
+
+  QueryResult_tset::iterator res_here = results.begin();
+  QueryResult_tset::iterator res_end = results.end();
+  text_tset metadata; // empty !!
+  bool getParents = false; // don't care !!
+  bool use_table;
+  ResultDocInfo_t thisdoc;
+  format_t *formatlistptr = NULL;
+  browserclass *browserptr = NULL;
+
+  // set up _thisfirst_ and _thislast_ macros
+  disp.setmacro ("thisfirst", "query", firstdoc);
+  int thislast = firstdoc + (hitsperpage - 1);
+  if (thislast > numdocs) thislast = numdocs;
+  disp.setmacro ("thislast", "query", thislast);
+
+  // set up _prevfirst_ and _prevlast_ macros
+  if (firstdoc > 1) {
+    disp.setmacro ("prevlast", "query", firstdoc - 1);
+    int prevfirst = firstdoc - hitsperpage;
+    if (prevfirst < 1) prevfirst = 1;
+    disp.setmacro ("prevfirst", "query", prevfirst);
+  }
+
+  // set up _nextfirst_ and _nextlast_ macros
+  if (thislast < numdocs) {
+    disp.setmacro ("nextfirst", "query", thislast + 1);
+    int nextlast = thislast + hitsperpage;
+    if (nextlast > numdocs) nextlast = numdocs;
+    disp.setmacro ("nextlast", "query", nextlast);
+  }
+
+  textout << outconvert << disp << "_query:header_\n"
+	  << "_query:content_";
+
+  int count = 1;
+
+  // output results
+  while (res_here != res_end) {
+    if (count < firstdoc) {count ++; res_here ++; continue;}
+    if (count > thislast) break;
+    formatlistptr = colinfomap[(*res_here).collection].formatlistptr;
+    browserptr = colinfomap[(*res_here).collection].browserptr;
+    thisdoc = (*res_here).doc;
+    use_table = is_table_content (formatlistptr);
+
+    collectproto = protos->getrecptproto ((*res_here).collection, logout);
+    if (collectproto == NULL) {
+      logout << outconvert << "queryaction::search_multiple_collections: " << (*res_here).collection
+	     << " collection has a NULL collectproto, ignoring results\n";
+      res_here ++;
+      continue;
+    }
+
+    browserptr->output_section_group (thisdoc, args, (*res_here).collection, 0, 
+    				      formatlistptr, use_table, metadata, getParents, 
+    				      collectproto, disp, outconvert, textout, logout);
+    //    textout << outconvert << "(ranking: " << (*res_here).doc.ranking << ")\n";
+    res_here ++;
+    count ++;
+  }
+
+  textout << outconvert << disp << "_query:footer_";
+  
+  // clean up the format_t pointers
+  map<text_t, colinfo_t, lttext_t>::iterator here =  colinfomap.begin();
+  map<text_t, colinfo_t, lttext_t>::iterator end =  colinfomap.end();
+  while (here != end) {
+    delete ((*here).second.formatlistptr);
+    here ++;
+  }
+  return true;
+}
+
+bool queryaction::search_single_collection (cgiargsclass &args, const text_t &collection,
+					    recptprotolistclass *protos, browsermapclass *browsers, 
+					    displayclass &disp, outconvertclass &outconvert, 
+					    ostream &textout, ostream &logout) {
+
+  recptproto *collectproto = protos->getrecptproto (collection, logout);
+  if (collectproto == NULL) {
+    logout << outconvert << "queryaction::search_single_collection: " << collection
+	   << " collection has a NULL collectproto\n";
+    return false;
+  }
+
+  // queryaction uses "VList" browser to display results,
+  // a queries clasification is "Search"
+  text_t browsertype = "VList";
+  text_t classification = "Search";
+
+  comerror_t err;
+  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr (collectproto, collection, logout);
+
+  if (cinfo == NULL) {
+    logout << "ERROR (query_action::search_single_collection): get_collectinfo_ptr returned NULL\n";
+    return false;
+  }
+    
+  browserclass *bptr = browsers->getbrowser (browsertype);
+
+  // get the formatstring if there is one 
+  text_t formatstring;
+  if (!get_formatstring (classification, browsertype, 
+			 cinfo->format, formatstring))
+    formatstring = bptr->get_default_formatstring();
+
+  FilterRequest_t request;
+  FilterResponse_t response;
+  bptr->set_filter_options (request, args);
+  bptr->load_metadata_defaults (request.fields);
+
+  format_t *formatlistptr = new format_t();
+  parse_formatstring (formatstring, formatlistptr, request.fields, request.getParents);
+    
+  // do the query
+  request.filterResultOptions = FROID | FRmetadata | FRtermFreq;
+  text_t formattedstring = "";
+
+  if (args["qt"]=="0") { // normal text search
+    formattedstring = args["q"];
+    format_querystring (formattedstring, args.getintarg("b"));
+    add_dates(formattedstring, args.getintarg("ds"), args.getintarg("de"),
+	    args.getintarg("dsbc"), args.getintarg("debc"));
+  }
+  else if (args["qt"]=="1" ){ // form search
+
+    if (args["b"]=="1" && args["fqa"]=="1") { // explicit query
+      formattedstring = args["q"];
+    }
+    else { // form search
+      if (args["b"]=="0") { // regular form
+	parse_reg_query_form(formattedstring, args);
+      }
+      else  { // advanced form
+	parse_adv_query_form(formattedstring, args);
+      }
+      args["q"] = formattedstring;
+      
+      // also reset the _cgiargq_ macro as it has changed now
+      disp.setmacro("cgiargq", "Global", html_safe(args["q"]));
+      
+      // reset the compressed options to include the q arg
+      text_t compressedoptions = recpt->get_compressed_arg(args, logout);
+      if (!compressedoptions.empty()) {
+	disp.setmacro ("compressedoptions", "Global", dm_safe(compressedoptions));
+	// need a decoded version of compressedoptions for use within forms
+	// as browsers encode values from forms before sending to server
+	// (e.g. %25 becomes %2525)
+	decode_cgi_arg (compressedoptions);
+	disp.setmacro ("decodedcompressedoptions", "Global", dm_safe(compressedoptions));
+      }
+    } // form search
+  } // args["qt"]=1
+  else {
+    logout << "ERROR (query_action::search_single_collection): querytype not defined\n";
+    return false;
+  }
+
+  if (!formattedstring.empty()) { // do the query
+    set_queryfilter_options (request, formattedstring, args);
+    collectproto->filter (collection, request, response, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii
+	     << "queryaction::search_single_collections: call to QueryFilter failed "
+	     << "for " << collection << " collection (" << get_comerror_string (err) << ")\n";
+      return false;
+    }
+ 
+    define_query_macros (args, disp, response);
+
+    // save the query if appropriate
+    if (!save_search_history(args, response))
+      logout << "save failed"; 
+  }
+
+  define_history_macros (disp, args, protos, logout);
+  
+  textout << outconvert << disp << "_query:header_\n"
+	  << "_query:content_";
+
+  // output the results
+  bool use_table = is_table_content (formatlistptr);
+  bptr->output_section_group (response, args, collection, 0, formatlistptr, 
+			      use_table, request.fields, request.getParents, 
+			      collectproto, disp, outconvert, textout, logout);
+  
+
+  textout << outconvert << disp << "_query:footer_";
+  
+  delete (formatlistptr);
+  
+  return true;
+}
+  
+// define_query_macros sets the macros that couldn't be set until the
+// query had been done. Those macros are _freqmsg_, _quotedquery_,
+// _resultline_, _nextfirst_, _nextlast_, _prevfirst_, _prevlast_,
+// _thisfirst_, and _thislast_
+void queryaction::define_query_macros (cgiargsclass &args, displayclass &disp, 
+				       const FilterResponse_t &response) { 
+  // set up _freqmsg_ and _quotedquery_ macros
+  text_t freqmsg = "_textfreqmsg1_";
+  TermInfo_tarray::const_iterator this_term = response.termInfo.begin();
+  TermInfo_tarray::const_iterator end_term = response.termInfo.end();
+  while (this_term != end_term) {
+    char *term = (*this_term).term.getcstr();
+    if(term[0]<'0' || term[0] >'9'){
+      freqmsg += (*this_term).term + ": " + (*this_term).freq;
+      if ((this_term + 1) != end_term)
+	freqmsg += ", ";
+    }
+    delete term;
+    this_term ++;
+  }
+  disp.setmacro ("freqmsg", "query", freqmsg);
+
+  // set up _resultline_ macro
+  text_t resline;
+  int maxdocs = args.getintarg("m");
+  int numdocs = response.numDocs;
+  isapprox isApprox = response.isApprox;
+  if (num_phrases > 0) isApprox = Exact;
+  if (maxdocs == -1) maxdocs = numdocs;
+  else if (numdocs > maxdocs) {
+    numdocs = maxdocs;
+    isApprox = MoreThan;
+  }
+
+  if (isApprox == Approximate) resline = "_textapprox_";
+  else if (isApprox == MoreThan) resline = "_textmorethan_";
+  
+  if (numdocs == 0) resline = "_textnodocs_";
+  else if (numdocs == 1) resline += "_text1doc_";
+  else resline += text_t(numdocs) + " _textlotsdocs_";
+  
+  disp.setmacro("resultline", "query", resline);
+
+  int firstdoc = args.getintarg("r");
+  int hitsperpage = args.getintarg("o");
+  if (hitsperpage == -1) hitsperpage = numdocs;
+
+  // set up _thisfirst_ and _thislast_ macros
+  disp.setmacro ("thisfirst", "query", firstdoc);
+  int thislast = firstdoc + (hitsperpage - 1);
+  if (thislast > numdocs) thislast = numdocs;
+  disp.setmacro ("thislast", "query", thislast);
+
+  // set up _prevfirst_ and _prevlast_ macros
+  if (firstdoc > 1) {
+    disp.setmacro ("prevlast", "query", firstdoc - 1);
+    int prevfirst = firstdoc - hitsperpage;
+    if (prevfirst < 1) prevfirst = 1;
+    disp.setmacro ("prevfirst", "query", prevfirst);
+  }
+
+  // set up _nextfirst_ and _nextlast_ macros
+  if (thislast < numdocs) {
+    disp.setmacro ("nextfirst", "query", thislast + 1);
+    int nextlast = thislast + hitsperpage;
+    if (nextlast > numdocs) nextlast = numdocs;
+    disp.setmacro ("nextlast", "query", nextlast);
+  }
+}
+
+bool queryaction::save_search_history (cgiargsclass &args, const FilterResponse_t &response) 
+{
+  if (args["q"]=="") return true; // null query, dont save
+  if (args["hs"]=="0") return true; // only save when submit query
+                                    // displayed
+  // get userid
+  text_t userid = args["z"];
+
+  // the number of docs goes on the front of the query string
+  int numdocs= response.numDocs;
+  text_t query = text_t(numdocs);
+  if (response.isApprox==MoreThan) { // there were more docs found
+    query.push_back('+');
+  }
+  query += "c="+args["c"];
+  query += "&h="+args["h"];
+  query += "&t="+args["t"];
+  query += "&b="+args["b"];
+  query += "&j="+args["j"];
+  query += "&n="+args["n"];
+  query += "&s="+args["s"];
+  query += "&k="+args["k"];
+  query += "&g="+args["g"]; 
+  
+  text_t qstring = args["q"];
+  text_t formattedquery =cgi_safe(qstring);
+  query += "&q="+formattedquery;
+
+  bool display=false;
+  int hd = args.getintarg("hd");
+  if (hd > 0) display=true;
+  if (set_history_info(userid, query, gdbmhome, display)) return true;
+  else return false;
+
+
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/queryaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/queryaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/queryaction.h	(revision 21083)
@@ -0,0 +1,145 @@
+/**********************************************************************
+ *
+ * queryaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef QUERYACTION_H
+#define QUERYACTION_H
+
+#include "gsdlconf.h"
+#include "action.h"
+#include "receptionist.h"
+
+struct colinfo_t {
+  void clear();
+  colinfo_t () {clear();}
+
+  format_t *formatlistptr;
+  browserclass *browserptr;
+};
+
+struct QueryResult_t {
+  void clear ();
+  QueryResult_t () {clear();}
+
+  ResultDocInfo_t doc;
+  text_t collection;
+};
+
+struct gteqQueryResult_t 
+{
+  bool operator()(const QueryResult_t &t1, const QueryResult_t &t2) const
+  { return t1.doc.ranking >= t2.doc.ranking; }
+};
+
+typedef set<QueryResult_t, gteqQueryResult_t> QueryResult_tset;
+
+
+class queryaction : public action {
+
+protected:
+
+  receptionist *recpt;
+
+  text_t formatstring;
+  int num_phrases;
+
+  virtual void define_query_macros (cgiargsclass &args, displayclass &disp, 
+			    const FilterResponse_t &response); 
+
+  void define_query_interface(displayclass &disp, cgiargsclass &args, 
+			   recptprotolistclass *protos, ostream &logout);
+
+  void define_form_macros (displayclass &disp, cgiargsclass &args, 
+			   recptprotolistclass *protos, ostream &logout);
+
+  void set_fqfselection_macro (const FilterOption_t &option, 
+			      displayclass &disp);
+
+
+  void define_history_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  virtual void set_option_macro (const text_t &macroname, text_t current_value,
+			 const FilterOption_t &option, displayclass &disp);
+
+  virtual void set_gselection_macro (text_t current_value,
+				     const FilterOption_t &option, 
+				     displayclass &disp);
+
+  void output_ccp (cgiargsclass &args, recptprotolistclass *protos,
+		   displayclass &disp, outconvertclass &outconvert,
+		   ostream &textout, ostream &logout);
+  
+  bool search_multiple_collections (cgiargsclass &args, 
+				    recptprotolistclass *protos,
+				    browsermapclass *browsers, 
+				    displayclass &disp,
+				    outconvertclass &outconvert, 
+				    ostream &textout,
+				    ostream &logout);
+  
+  bool search_single_collection (cgiargsclass &args, 
+				 const text_t &collection,
+				 recptprotolistclass *protos, 
+				 browsermapclass *browsers, 
+				 displayclass &disp, 
+				 outconvertclass &outconvert, 
+				 ostream &textout, ostream &logout);
+
+
+  bool save_search_history(cgiargsclass &args, 
+			   const FilterResponse_t &response); 
+
+public:
+  queryaction ();
+  virtual ~queryaction () {}
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+  
+  void configure (const text_t &key, const text_tarray &cfgline);
+  bool init (ostream &logout);
+  
+  virtual text_t get_action_name () {return "q";}
+  
+  virtual bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+  
+  virtual void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  virtual void define_external_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+  
+  virtual bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/querytools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/querytools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/querytools.cpp	(revision 21083)
@@ -0,0 +1,490 @@
+/**********************************************************************
+ *
+ * querytools.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "querytools.h"
+#include <ctype.h>
+#include "unitool.h" // for is_unicode_letdig
+
+// request.filterResultOptions and request.fields (if required) should
+// be set from the calling code
+void set_queryfilter_options (FilterRequest_t &request, const text_t &querystring,
+			      cgiargsclass &args) {
+
+  request.filterName = "QueryFilter";
+
+  OptionValue_t option;
+
+  option.name = "Term";
+  option.value = querystring;
+  request.filterOptions.push_back (option);
+
+  option.name = "QueryType";
+  option.value = (args.getintarg("t")) ? "ranked" : "boolean";
+  request.filterOptions.push_back (option);
+
+  option.name = "MatchMode";
+  option.value = (args.getintarg("t")) ? "some" : "all";
+  request.filterOptions.push_back (option);
+
+  option.name = "Casefold";
+  option.value = (args.getintarg("k")) ? "true" : "false";
+  request.filterOptions.push_back (option);
+
+  option.name = "Stem";
+  option.value = (args.getintarg("s")) ? "true" : "false";
+  request.filterOptions.push_back (option);
+
+  if (!args["h"].empty()) {
+    option.name = "Index";
+    option.value = args["h"];
+    request.filterOptions.push_back (option);
+  }
+
+  if (!args["j"].empty()) {
+    option.name = "Subcollection";
+    option.value = args["j"];
+    request.filterOptions.push_back (option);
+  }
+
+  if (!args["n"].empty()) {
+    option.name = "Language";
+    option.value = args["n"];
+    request.filterOptions.push_back (option);
+  }
+  
+  if (!args["g"].empty()) { // granularity for mgpp
+    option.name = "Level";
+    option.value = args["g"];
+    request.filterOptions.push_back (option);
+  }
+
+  set_more_queryfilter_options (request, args);
+}
+
+void set_queryfilter_options (FilterRequest_t &request, const text_t &querystring1,
+			      const text_t &querystring2, cgiargsclass &args) {
+
+  set_queryfilter_options (request, querystring1, args);
+
+  // fill in the second query if needed
+  if (!args["cq2"].empty()) {
+    OptionValue_t option;
+
+    option.name = "CombineQuery";
+    option.value = args["cq2"];
+    request.filterOptions.push_back (option);
+    
+    option.name = "Term";
+    option.value = querystring2;
+    request.filterOptions.push_back (option);
+    
+    option.name = "QueryType";
+    option.value = (args.getintarg("t")) ? "ranked" : "boolean";
+    request.filterOptions.push_back (option);
+
+    option.name = "Casefold";
+    option.value = (args.getintarg("k")) ? "true" : "false";
+    request.filterOptions.push_back (option);
+
+    option.name = "Stem";
+    option.value = (args.getintarg("s")) ? "true" : "false";
+    request.filterOptions.push_back (option);
+
+    if (!args["h2"].empty()) {
+      option.name = "Index";
+      option.value = args["h2"];
+      request.filterOptions.push_back (option);
+    }
+
+    if (!args["j2"].empty()) {
+      option.name = "Subcollection";
+      option.value = args["j2"];
+      request.filterOptions.push_back (option);
+    }
+
+    if (!args["n2"].empty()) {
+      option.name = "Language";
+      option.value = args["n2"];
+      request.filterOptions.push_back (option);
+    }
+  }
+  set_more_queryfilter_options (request, args);
+}
+
+void set_more_queryfilter_options (FilterRequest_t &request, cgiargsclass &args) {
+
+  OptionValue_t option;
+  int arg_m = args.getintarg("m");
+  
+  option.name = "Maxdocs";
+  option.value = arg_m;
+  request.filterOptions.push_back (option);
+
+  //  option.name = "StartResults";
+  //  option.value = args["r"];
+  //  request.filterOptions.push_back (option);
+
+  //  option.name = "EndResults";
+  //  int endresults = args.getintarg("o") + (args.getintarg("r") - 1);
+  //  if ((endresults > arg_m) && (arg_m != -1)) endresults = arg_m;
+  //  option.value = endresults;
+  //  request.filterOptions.push_back (option);
+}
+
+void format_querystring (text_t &querystring, int querymode) {
+  text_t formattedstring;
+
+  text_t::const_iterator here = querystring.begin();
+  text_t::const_iterator end = querystring.end();
+
+  // space is used to insert spaces between Chinese
+  // characters. No space is needed before the first
+  // Chinese character.
+  bool space = false;
+
+  // want to remove ()|!& from querystring so boolean queries are just
+  // "all the words" queries (unless querymode is advanced)
+  while (here != end) {
+    if ((querymode == 0) && (*here == '(' || *here == ')' || *here == '|' ||
+			     *here == '!' || *here == '&')) {
+      formattedstring.push_back(' ');
+    } else {
+      if ((*here >= 0x4e00 && *here <= 0x9fa5) ||
+	  (*here >= 0xf900 && *here <= 0xfa2d)) {
+	// Chinese character
+	if (space) formattedstring.push_back (0x200b);
+	formattedstring.push_back (*here);
+	formattedstring.push_back (0x200b);
+	space = true;
+      } else {
+	// non-Chinese character
+	formattedstring.push_back (*here);
+	space = false;
+      }
+    }
+    here ++;
+  }
+  querystring = formattedstring;
+}
+
+
+	
+void add_dates(text_t &querystring, int startdate, int enddate, 
+	       int startbc, int endbc)
+{
+  if(startdate)
+    {
+      int querystringis = 0;
+      text_t::const_iterator here = querystring.begin();
+      text_t::const_iterator end = querystring.end();
+      while(here!=end)
+	{
+	  if(!(isspace((*here)))){
+	    here = end;
+	    querystringis = 1;
+	  }
+	  else
+	    here++;
+	}
+      //converting BCE dates
+      if(startbc && startdate > 0)
+	{
+	  startdate *= -1;
+	}
+      if(endbc && enddate > 0)
+	{
+	  enddate *= -1;
+	}
+       if(enddate != 0 && enddate<startdate)
+	{
+	  cout<<"enddate too small"<<endl;
+	  return;
+	}
+       if(querystringis)
+	 querystring.appendcstr(" AND");
+       if(!enddate)
+	 {
+	   querystring.appendcstr(" [");
+	   if(startdate<0)
+	     {
+	       querystring.appendcstr("bc");
+	       querystring.appendint((startdate*-1));
+	     }
+	   else 
+	     querystring.appendint(startdate);
+	   querystring.appendcstr("]:CO");
+	 }
+       else{
+	 int nextdate = startdate;
+	 querystring.appendcstr(" (");
+	 while(nextdate<=enddate)
+	   {
+	     if(nextdate!=0)
+	       {
+		 querystring.appendcstr(" [");
+		 if(nextdate<0)
+		   {
+		     querystring.appendcstr("bc");
+		     querystring.appendint((nextdate*-1));
+		   }
+		 else 
+		   querystring.appendint(nextdate);
+		 querystring.appendcstr("]:CO");
+	       }
+	     nextdate++;
+	   }
+	 querystring.appendcstr(" )");
+       }
+    }
+
+}
+
+void get_phrases (const text_t &querystring, text_tarray &phrases) {
+
+  phrases.erase (phrases.begin(), phrases.end());
+  if (!querystring.empty()) {
+    
+    text_t::const_iterator end = querystring.end();
+    text_t::const_iterator here = findchar (querystring.begin(), end, '"');
+    if (here != end) {
+      text_t tmptext;
+      bool foundquote = false;
+      while (here != end) {
+	if (*here == '"') {
+	  if (foundquote) {
+	    if (!tmptext.empty()) {
+	      phrases.push_back(tmptext);
+	      tmptext.clear();
+	    }
+	    foundquote = false;
+	  } else foundquote = true;
+	} else {
+	  if (foundquote) tmptext.push_back (*here);
+	}
+	here ++;
+      }
+    }
+  }
+}
+
+// search history tool
+text_t escape_quotes(const text_t &querystring) {
+
+  text_t::const_iterator here = querystring.begin();
+  text_t::const_iterator end = querystring.end();
+ 
+  text_t escquery = "";
+  while (here != end) {
+    if (*here != '\'' && *here != '\"' && *here != '\n' && *here != '\r') escquery.push_back(*here);
+    else if (*here == '\n' || *here == '\r') {
+      escquery.push_back(' ');
+    } else {
+      escquery +="\\\\";
+      escquery.push_back(*here);
+    }
+
+    here++;
+  }
+  return escquery;
+
+}
+
+// some query form parsing functions for use with mgpp
+
+void parse_reg_query_form(text_t &querystring, cgiargsclass &args){
+
+  querystring.clear();
+  text_t combine;
+  int argt = args.getintarg("t");// t=0 -and, t=1 - or
+  if (argt == 0) combine = "&";
+  else combine = "|";
+  
+  text_t field = args["fqf"];
+  if (field.empty()) return; // no query
+  text_tarray fields;
+  splitchar(field.begin(), field.end(), ',', fields); 
+  
+  text_t value = args["fqv"];
+  if (value.empty()) return; // somethings wrong
+  text_tarray values;
+  splitchar(value.begin(), value.end(), ',', values);
+
+  for (int i=0; i< values.size(); i++) {
+    if (!values[i].empty()) {
+      text_t text = formatelem(values[i]);
+      addqueryelem(querystring, fields[i], text, combine);
+    }
+  }
+  
+}
+
+text_t formatelem(text_t &text) {
+
+  text_t::iterator here = text.begin();
+  text_t::iterator end = text.end();
+
+  bool space = false;
+  int words = 0;
+  text_t newtext = "";
+  while (here != end) {
+    if (is_unicode_letdig(*here)) {
+      newtext.push_back(*here);
+      if (space==false) words++;
+      space = true;
+    }
+    else {
+      if (space) {
+	newtext.push_back(' ');
+	space = false;
+      }
+    }
+    here++;
+  }
+
+  if (words > 1) { // have a phrase, put it in quotes
+    newtext = "\""+newtext+"\"";
+    cout <<"new text="<<newtext.getcstr()<<endl;
+  }
+  return newtext;
+}
+
+void parse_adv_query_form(text_t &querystring, cgiargsclass &args){
+
+  querystring.clear();
+  text_t combine = "&";
+
+  text_t field = args["fqf"];
+  if (field.empty()) return; // no query
+  text_tarray fields;
+  splitchar(field.begin(), field.end(), ',', fields); 
+  
+  text_t value = args["fqv"];
+  if (value.empty()) return; // somethings wrong
+  text_tarray values;
+  splitchar(value.begin(), value.end(), ',', values);
+
+  text_t stem = args["fqs"];
+  if (stem.empty()) return; // somethings wrong
+  text_tarray stems;
+  splitchar(stem.begin(), stem.end(), ',', stems);
+
+  text_t fold = args["fqk"];
+  if (fold.empty()) return; // somethings wrong
+  text_tarray folds;
+  splitchar(fold.begin(), fold.end(), ',', folds);
+
+  text_t comb = args["fqc"];
+  if (comb.empty()) return; //somethings wrong
+  text_tarray combs;
+  splitchar(comb.begin(), comb.end(), ',', combs);
+  
+  for(int i=0; i< values.size(); i++) {
+    if (!values[i].empty()) {
+      if (i!=0) {
+	if (combs[i-1]=="and") combine = "&";
+	else if (combs[i-1]=="or")combine = "|";
+	else if (combs[i-1]=="not")combine = "!";
+      }
+      text_t term = formatelem(values[i]);
+      term = addstemcase(term, stems[i], folds[i]);
+      addqueryelem(querystring, fields[i], term, combine);
+    }
+    
+  }
+}
+
+text_t addstemcase(text_t &terms, text_t &stem, text_t &fold) {
+  
+  text_t outtext;
+  text_t word;
+  //unsigned short c;                                                            
+  text_t::iterator here = terms.begin();
+  text_t::iterator end = terms.end();
+
+  while (here !=end) {
+
+    if (is_unicode_letdig(*here)) {
+      // not word boundary
+      word.push_back(*here);
+      here++;    
+    }
+    else {
+      // found word boundary   
+      if (!word.empty() ) {
+	if (stem == "1" || fold =="1") {
+	  word += "#";
+	  if (stem == "1") word += "s";
+	  //else word += "u";
+	  
+	  if (fold == "1") word += "i";
+	  //else word += "c";
+	}
+	
+	word += " ";
+	outtext += word;
+	word.clear();
+      }
+      if (*here == '\"') {
+	outtext.push_back(*here);
+      }
+      here++;
+    }
+  }
+   
+  // get last word
+  if (!word.empty()) {
+    if (stem == "1"|| fold == "1") {
+      word += "#";
+      if (stem == "1") word += "s";
+      //else word += "u";
+      
+      if (fold == "1") word += "i";
+      //else word += "c";
+    }
+    word += " ";
+    outtext += word;
+  }
+  return outtext;
+}
+
+
+
+void addqueryelem(text_t &querystring, text_t &tag, 
+				  text_t &query, text_t combine) {
+  if (!querystring.empty()) { // have to put and/or
+    querystring += " "+combine + " ";
+ 
+  }
+  if (tag=="ZZ") { // just add onto querystring
+       querystring +=  query;
+  }
+  else {
+    querystring += "["+query+"]:"+tag;
+  }
+
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/querytools.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/querytools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/querytools.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**********************************************************************
+ *
+ * querytools.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef QUERYTOOLS_H
+#define QUERYTOOLS_H
+
+#include "cgiargs.h"
+#include "recptproto.h"
+
+void set_queryfilter_options (FilterRequest_t &request, const text_t &querystring,
+			      cgiargsclass &args);
+
+void set_queryfilter_options (FilterRequest_t &request, const text_t &querystring1,
+			      const text_t &querystring2, cgiargsclass &args);
+
+// don't hassle the function name ... it's been a long day ;)
+void set_more_queryfilter_options (FilterRequest_t &request, cgiargsclass &args);
+
+void format_querystring (text_t &querystring, int querymode);
+
+void add_dates(text_t &querystring, int startdate, int enddate, 
+	       int startbc, int endbc);
+
+void get_phrases (const text_t &querystring, text_tarray &phrases);
+
+void add_ands(text_t& querystring, int querytype);
+
+// search history tool
+text_t escape_quotes(const text_t &querystring);
+
+// some query parsing functions for form processing (only for mgpp collections)
+void parse_reg_query_form(text_t &formattedstring, cgiargsclass &args);
+void parse_adv_query_form(text_t &formattedstring, cgiargsclass &args);
+
+void addqueryelem(text_t &querystring, text_t &tag, 
+		  text_t &query, text_t combine);
+text_t addstemcase(text_t &terms, text_t &stem, text_t &fold);
+text_t formatelem(text_t &text);
+
+#endif
+
+
+
+
Index: /main/tags/2.38/gsdl/src/recpt/receptionist.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/receptionist.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/receptionist.cpp	(revision 21083)
@@ -0,0 +1,1468 @@
+/**********************************************************************
+ *
+ * receptionist.cpp -- a web interface for the gsdl
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// following line required to get fstream.filedesc() on darwin (Mac OS X)
+// gcc 2.91 automatically defines this in stream.h
+#define _STREAM_COMPAT  1
+
+#include "receptionist.h"
+#include "fileutil.h"
+#include "cgiutils.h"
+#include "htmlutils.h"
+#include "gsdltools.h"
+#include "gsdltimes.h"
+#include "OIDtools.h"
+#include <assert.h>
+#include <time.h>
+#include <stdio.h> // for open()
+#include <fcntl.h> // for open() flags
+// following 2 are for printing Last-Modified http header.
+#include <sys/stat.h>
+#include <time.h>
+
+#if defined (GSDL_USE_IOS_H)
+#include <fstream.h>
+#else 
+#include <fstream>
+#endif
+
+void recptconf::clear () {
+  gsdlhome.clear();
+  gdbmhome.clear();
+  collectinfo.erase(collectinfo.begin(), collectinfo.end());
+  collection.clear();
+  collectdir.clear();
+  httpprefix.clear();
+  httpimg = "/images";
+  gwcgi.clear();
+  macrofiles.erase(macrofiles.begin(), macrofiles.end());
+  saveconf.clear();
+  usecookies = false;
+  logcgiargs = false;
+  LogDateFormat = LocalTime;
+
+  maintainer.clear();
+  MailServer.clear();
+  LogEvents = Disabled;
+  EmailEvents = Disabled;
+  EmailUserEvents = false;
+
+  languages.erase(languages.begin(), languages.end());
+  encodings.erase(encodings.begin(), encodings.end());
+
+  // these default page parameters can always be overriden
+  // in the configuration file
+  pageparams.erase(pageparams.begin(), pageparams.end());
+  pageparams["c"] = ""; 
+  pageparams["l"] = "en"; 
+
+#ifdef MACROPRECEDENCE
+  macroprecedence = MACROPRECEDENCE;
+#else
+  macroprecedence.clear();
+#endif
+}
+
+void collectioninfo_t::clear () {
+  gsdl_gsdlhome.clear();
+  gsdl_gdbmhome.clear();
+
+  info_loaded = false;
+  info.clear();
+}
+
+void languageinfo_t::clear () {
+  longname.clear();
+  defaultencoding.clear();
+}
+
+receptionist::receptionist () {
+  // create a list of cgi arguments
+  // this must be done before the configuration
+
+  cgiarginfo ainfo;
+
+  ainfo.shortname = "e";
+  ainfo.longname = "compressed arguments";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::good;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, ainfo);
+
+  ainfo.shortname = "a";
+  ainfo.longname = "action";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, ainfo);
+
+  // w=western
+  ainfo.shortname = "w";
+  ainfo.longname = "encoding";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, ainfo);
+  
+  ainfo.shortname = "nw";
+  ainfo.longname = "new encoding";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, ainfo);
+  
+  ainfo.shortname = "c";
+  ainfo.longname = "collection";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, ainfo);
+  
+  // the interface language name should use the ISO 639
+  // standard
+  ainfo.shortname = "l";
+  ainfo.longname = "interface language";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::weak;
+  ainfo.argdefault = "en";
+  ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, ainfo);
+  
+  ainfo.shortname = "nl";
+  ainfo.longname = "new language";
+  ainfo.multiplechar = false;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "0";
+  ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, ainfo);
+  
+  // the GSDL_UID (cookie)
+  ainfo.shortname = "z";
+  ainfo.longname = "gsdl uid";
+  ainfo.multiplechar = true;
+  ainfo.defaultstatus = cgiarginfo::none;
+  ainfo.argdefault = "";
+  ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, ainfo);
+}
+
+
+void receptionist::add_action (action *theaction) {
+  // make sure we have an action to add
+  if (theaction == NULL) return;
+
+  // add this action to the list of actions
+  actions.addaction(theaction);
+  
+  // add the cgi arguments from this action
+  argsinfo.addarginfo (NULL, theaction->getargsinfo());
+}
+
+
+void receptionist::add_browser (browserclass *thebrowser) {
+  // make sure we have a browser to add
+  if (thebrowser == NULL) return;
+
+  // add this browser to the list of browsers
+  browsers.addbrowser(thebrowser);
+}
+
+
+void receptionist::setdefaultbrowser (const text_t &browsername) {
+  browsers.setdefaultbrowser (browsername);
+}
+
+
+// configure should be called for each line in the
+// configuration files to configure the receptionist and everything
+// it contains. The configuration should take place after everything
+// has been added but before the initialisation.
+void receptionist::configure (const text_t &key, const text_tarray &cfgline) {
+  // configure the receptionist
+
+  if (cfgline.size() >= 1) {
+    cgiarginfo *info = NULL;
+    if (key == "gsdlhome") {
+      configinfo.gsdlhome = cfgline[0];
+      if (configinfo.gdbmhome.empty()) configinfo.gdbmhome = cfgline[0];
+    }
+    else if (key == "gdbmhome") configinfo.gdbmhome = cfgline[0];
+    else if (key == "collection") {
+      configinfo.collection = cfgline[0];
+      // also need to set the default arg to this collection
+      if ((info = argsinfo.getarginfo("c")) != NULL) {
+	info->defaultstatus = cgiarginfo::good;
+	info->argdefault = cfgline[0];
+      }
+      
+    } else if (key == "collectdir") configinfo.collectdir = cfgline[0];
+    else if (key == "httpprefix") configinfo.httpprefix = cfgline[0];
+    else if (key == "httpimg") configinfo.httpimg = cfgline[0];
+    else if (key == "gwcgi") configinfo.gwcgi = cfgline[0];
+    else if (key == "macrofiles") {
+      // want to append to macrofiles (i.e. may be several config files
+      // contributing, maybe from several collections).
+      text_tarray::const_iterator here = cfgline.begin();
+      text_tarray::const_iterator end = cfgline.end();
+      while (here != end) {
+	configinfo.macrofiles.insert (*here);
+	here ++;
+      }
+    }
+    else if (key == "saveconf") configinfo.saveconf = cfgline[0];
+    else if (key == "usecookies") configinfo.usecookies = (cfgline[0] == "true");
+    else if (key == "logcgiargs") configinfo.logcgiargs = (cfgline[0] == "true");
+    else if (key == "maintainer") configinfo.maintainer = cfgline[0];
+    else if (key == "MailServer") configinfo.MailServer = cfgline[0];
+    else if (key == "LogDateFormat") {
+      if (cfgline[0] == "UTCTime") configinfo.LogDateFormat = UTCTime;
+      else if (cfgline[0] == "Absolute") configinfo.LogDateFormat = Absolute;
+    } 
+    else if (key == "LogEvents") {
+      if (cfgline[0] == "CollectorEvents") configinfo.LogEvents = CollectorEvents;
+      else if (cfgline[0] == "AllEvents") configinfo.LogEvents = AllEvents;
+    } 
+    else if (key == "EmailEvents") {
+      if (cfgline[0] == "CollectorEvents") configinfo.EmailEvents = CollectorEvents;
+      else if (cfgline[0] == "AllEvents") configinfo.EmailEvents = AllEvents;
+    } 
+    else if (key == "EmailUserEvents") configinfo.EmailUserEvents = (cfgline[0] == "true");
+    else if (key == "pageparam") {
+      if (cfgline.size() >= 2) configinfo.pageparams[cfgline[0]] = cfgline[1];
+      else configinfo.pageparams[cfgline[0]] = "";
+    }
+    else if (key == "macroprecedence") configinfo.macroprecedence = cfgline[0];
+    else if (key == "collectinfo") {
+      if (cfgline.size() >= 3) {
+	collectioninfo_t cinfo;
+	cinfo.gsdl_gsdlhome = cfgline[1];
+	cinfo.gsdl_gdbmhome = cfgline[2];
+	configinfo.collectinfo[cfgline[0]] = cinfo;
+      }
+    }
+    
+    else if (key == "cgiarg") {
+      // get shortname
+      bool seen_defaultstatus = false;
+      text_t subkey, subvalue;
+      text_t shortname;
+      text_t::const_iterator cfglinesub_here;
+      text_tarray::const_iterator cfgline_here = cfgline.begin();
+      text_tarray::const_iterator cfgline_end = cfgline.end();
+      while (cfgline_here != cfgline_end) {
+	cfglinesub_here = getdelimitstr((*cfgline_here).begin(),
+					(*cfgline_here).end(), '=', subkey);
+	if (subkey == "shortname") {
+	  shortname = substr (cfglinesub_here, (*cfgline_here).end());
+	}
+	cfgline_here++;
+      }
+
+      // if we found the shortname process the line again filling in values
+      if (!shortname.empty()) {
+	cgiarginfo &chinfo = argsinfo[shortname];
+	chinfo.shortname = shortname; // in case this is a new argument
+	
+	cfgline_here = cfgline.begin();
+	while (cfgline_here != cfgline_end) {
+	  cfglinesub_here = getdelimitstr((*cfgline_here).begin(),
+					  (*cfgline_here).end(), '=', subkey);
+	  subvalue = substr (cfglinesub_here, (*cfgline_here).end());
+
+	  if (subkey == "longname") chinfo.longname = subvalue;
+	  else if (subkey == "multiplechar") chinfo.multiplechar = (subvalue == "true");
+	  else if (subkey == "defaultstatus") {
+	    seen_defaultstatus = true;
+	    if (subvalue == "none") chinfo.defaultstatus = cgiarginfo::none;
+	    else if (subvalue == "weak") chinfo.defaultstatus = cgiarginfo::weak;
+	    else if (subvalue == "good") chinfo.defaultstatus = cgiarginfo::good;
+	    else if (subvalue == "config") chinfo.defaultstatus = cgiarginfo::config;
+	    else if (subvalue == "imperative") chinfo.defaultstatus = cgiarginfo::imperative;
+	  }
+	  else if (subkey == "argdefault") {
+	    chinfo.argdefault = subvalue;
+	    if (!seen_defaultstatus) chinfo.defaultstatus = cgiarginfo::config;
+	  }
+	  else if (subkey == "savedarginfo") {
+	    if (subvalue == "mustnot") chinfo.savedarginfo = cgiarginfo::mustnot;
+	    else if (subvalue == "can") chinfo.savedarginfo = cgiarginfo::can;
+	    else if (subvalue == "must") chinfo.savedarginfo = cgiarginfo::must;
+	  }
+	  
+	  cfgline_here++;
+	}
+      }
+
+    } else if (key == "Encoding") {
+
+      configure_encoding (cfgline);
+
+    } else if (key == "Language") {
+      text_t subkey, subvalue, shortname;
+      languageinfo_t lang;
+      text_t::const_iterator cfglinesub_here;
+      text_tarray::const_iterator cfgline_here = cfgline.begin();
+      text_tarray::const_iterator cfgline_end = cfgline.end();
+      while (cfgline_here != cfgline_end) {
+	cfglinesub_here = getdelimitstr((*cfgline_here).begin(),
+					(*cfgline_here).end(), '=', subkey);
+	if (subkey == "shortname") {
+	  shortname = substr (cfglinesub_here, (*cfgline_here).end());
+	} else if (subkey == "longname") {
+	  lang.longname = substr (cfglinesub_here, (*cfgline_here).end());
+	} else if (subkey == "default_encoding") {
+	  lang.defaultencoding = substr (cfglinesub_here, (*cfgline_here).end());
+	}
+	cfgline_here++;
+      }
+      if (!shortname.empty()) {
+	if (lang.longname.empty()) lang.longname = shortname;
+	configinfo.languages[shortname] = lang;
+      }
+    }
+  }
+  
+  // configure the actions
+  actionptrmap::iterator actionhere = actions.begin ();
+  actionptrmap::iterator actionend = actions.end ();
+
+  while (actionhere != actionend) {
+    assert ((*actionhere).second.a != NULL);
+    if ((*actionhere).second.a != NULL) 
+      (*actionhere).second.a->configure(key, cfgline);
+
+    actionhere++;
+  }
+
+  // configure the protocols
+  recptprotolistclass::iterator protohere = protocols.begin ();
+  recptprotolistclass::iterator protoend = protocols.end ();
+
+  while (protohere != protoend) {
+    assert ((*protohere).p != NULL);
+    comerror_t err;
+    if ((*protohere).p != NULL) 
+      (*protohere).p->configure(key, cfgline, err);
+    
+    protohere++;
+  }
+
+  // configure the browsers
+  browserptrmap::iterator browserhere = browsers.begin ();
+  browserptrmap::iterator browserend = browsers.end ();
+
+  while (browserhere != browserend) {
+    assert ((*browserhere).second.b != NULL);
+    if ((*browserhere).second.b != NULL) 
+      (*browserhere).second.b->configure(key, cfgline);
+    
+    browserhere++;
+  }
+}
+
+
+void receptionist::configure (const text_t &key, const text_t &value) {
+  text_tarray cfgline;
+  cfgline.push_back (value);
+  configure(key, cfgline);
+}
+
+
+// init should be called after all the actions and protocols have been
+// added to the receptionist and after everything has been configured but
+// before any pages are created.  It returns true on success and false on
+// failure. If false is returned getpage should not be called (without
+// producing meaningless output), instead an error page should be produced
+// by the calling code.
+bool receptionist::init (ostream &logout) {
+
+  // first configure collectdir
+  text_t thecollectdir = configinfo.gsdlhome;
+  if (!configinfo.collection.empty()) {
+    // collection specific mode
+    if (!configinfo.collectdir.empty()) {
+      // has already been configured
+      thecollectdir = configinfo.collectdir;
+    } else {
+      // decide where collectdir is by searching for collect.cfg
+      // look in $GSDLHOME/collect/collection-name/etc/collect.cfg and
+      // then $GSDLHOME/etc/collect.cfg
+      thecollectdir = filename_cat (configinfo.gsdlhome, "collect");
+      thecollectdir = filename_cat (thecollectdir, configinfo.collection);
+      text_t filename = filename_cat (thecollectdir, "etc");
+      filename = filename_cat (filename, "collect.cfg");
+
+      if (!file_exists(filename)) thecollectdir = configinfo.gsdlhome;
+    }
+  }
+  configure("collectdir", thecollectdir);
+
+  // read in the macro files
+  if (!read_macrofiles (logout)) return false;
+
+  // there must be at least one action defined
+  if (actions.empty()) {
+    logout << "Error: no actions have been added to the receptionist\n";
+    return false;
+  }
+
+  // there must be at least one browser defined
+  if (browsers.empty()) {
+    logout << "Error: no browsers have been added to the receptionist\n";
+    return false;
+  }
+
+  // create a saveconf string if there isn't one already
+  if (configinfo.saveconf.empty())
+    configinfo.saveconf = create_save_conf_str (argsinfo, logout);
+
+  // check the saveconf string
+  if (!check_save_conf_str (configinfo.saveconf, argsinfo, logout))
+    return false;
+
+  // set a random seed
+  srand (time(NULL));
+
+  // if maintainer email address is something dodgy (for now I'll define
+  // dodgy as being anything that doesn't contain '@') disable EmailEvents
+  // and EmailUserEvents (we don't strictly need to disable EmailUserEvents
+  // in this case but we will as it seems likely that MailServer will also
+  // be screwed up if maintainer is).
+  text_t::const_iterator maintainer_end = configinfo.maintainer.end ();
+  text_t::const_iterator maintainer_here = findchar ((text_t::const_iterator)configinfo.maintainer.begin(),
+						     maintainer_end, '@');
+  if (maintainer_here == maintainer_end) {
+    configinfo.EmailEvents = Disabled;
+    configinfo.EmailUserEvents = Disabled;
+  } else {
+    // if MailServer isn't set it should default to mail.maintainer-domain
+    if (configinfo.MailServer.empty()) {
+      configinfo.MailServer = "mail." + substr (maintainer_here+1, maintainer_end);
+    }
+  }
+
+  // init the actions
+  actionptrmap::iterator actionhere = actions.begin ();
+  actionptrmap::iterator actionend = actions.end ();
+  while (actionhere != actionend) {
+    if (((*actionhere).second.a == NULL) || 
+	!(*actionhere).second.a->init(logout)) return false;
+    actionhere++;
+  }
+
+  // init the protocols
+  recptprotolistclass::iterator protohere = protocols.begin ();
+  recptprotolistclass::iterator protoend = protocols.end ();
+  while (protohere != protoend) {
+    comerror_t err;    
+    if (((*protohere).p == NULL) ||
+	!(*protohere).p->init(err, logout)) return false;
+    protohere++;
+  }
+
+  // init the browsers
+  browserptrmap::iterator browserhere = browsers.begin ();
+  browserptrmap::iterator browserend = browsers.end ();
+  while (browserhere != browserend) {
+    if (((*browserhere).second.b == NULL) || 
+	!(*browserhere).second.b->init(logout)) return false;
+    browserhere++;
+  }
+
+  return true;
+}
+
+// get the default encoding for the given language - if it fails for any
+// reason return ""
+text_t receptionist::get_default_encoding (const text_t &language) {
+  
+  // make sure language is valid
+  if (configinfo.languages.find(language) == configinfo.languages.end()) return "";
+
+  text_t default_encoding = configinfo.languages[language].defaultencoding;
+
+  // make sure the encoding is valid
+  if (converters.find(default_encoding) == converters.end()) return "";
+
+  return default_encoding;
+}
+
+// parse_cgi_args parses cgi arguments into an argument class.
+// This function should be called for each page request. It returns false
+// if there was a major problem with the cgi arguments.
+bool receptionist::parse_cgi_args (const text_t &argstr, cgiargsclass &args, 
+				   ostream &logout, text_tmap &fcgienv) {
+
+  // get an initial list of cgi arguments
+  args.clear();
+  split_cgi_args (argsinfo, argstr, args);
+
+  // expand the compressed argument (if there was one)
+  if (!expand_save_args (argsinfo, configinfo.saveconf, args, logout)) return false;
+
+  // add the defaults
+  add_default_args (argsinfo, args, logout);
+
+  // get the cookie
+  if (configinfo.usecookies) get_cookie(args["z"], fcgienv);
+  
+  // if we're changing languages, set the encoding to the default for the new language
+  if (args["nl"] == "1") {
+    args["nw"] = get_default_encoding(args["l"]);
+  }
+
+  // get the input encoding
+  // if encoding isn't set, set it to the default for the current language
+  if ((args.getarg("w") == NULL) || args["w"].empty()) {
+    args["w"] = get_default_encoding(args["l"]);
+  }
+
+  text_t &arg_w = args["w"];
+
+  inconvertclass defaultinconvert;
+  inconvertclass *inconvert = converters.get_inconverter (arg_w);
+  if (inconvert == NULL) inconvert = &defaultinconvert;
+
+  // see if the next page will have a different encoding
+  if (args.getarg("nw") != NULL) arg_w = args["nw"];
+
+  // convert arguments which aren't in unicode to unicode
+  args_tounicode (args, *inconvert);
+
+
+  // decide on the output conversion class (needed for checking the external
+  // cgi arguments)
+  rzwsoutconvertclass defaultoutconverter;
+  rzwsoutconvertclass *outconverter = converters.get_outconverter (arg_w);
+  if (outconverter == NULL) outconverter = &defaultoutconverter;
+  outconverter->reset();
+
+  // check the main cgi arguments
+  if (!check_mainargs (args, logout)) return false;
+
+  // check the arguments for the action
+  action *a = actions.getaction (args["a"]);
+  if (a != NULL) {
+    if (!a->check_cgiargs (argsinfo, args, logout)) return false;
+  } else {
+    // the action was not found!!
+    outconvertclass text_t2ascii;
+    logout << text_t2ascii << "Error: the action \"" << args["a"] 
+	   << "\" could not be found.\n";
+    return false;
+  }
+
+  // check external cgi arguments for each action
+  actionptrmap::iterator actionhere = actions.begin ();
+  actionptrmap::iterator actionend = actions.end ();
+  while (actionhere != actionend) {
+    assert ((*actionhere).second.a != NULL);
+    if ((*actionhere).second.a != NULL) {
+      if (!(*actionhere).second.a->check_external_cgiargs (argsinfo, args, *outconverter,
+							   configinfo.saveconf, logout))
+	return false;
+    }
+    actionhere++;
+  }
+
+  // the action might have changed but we will assume that
+  // the cgiargs were checked properly when the change was made
+
+  return true;
+}
+
+// returns true if cookie already existed, false
+// if it was generated
+bool receptionist::get_cookie (text_t &cookie, text_tmap &fcgienv) {
+
+  text_t cookiestring = gsdl_getenv ("HTTP_COOKIE", fcgienv);
+    
+  text_t::const_iterator end = cookiestring.end();  
+  text_t::const_iterator here = findchar ((text_t::const_iterator)cookiestring.begin(), end, 'G');
+
+  while (here+9 < end) { 
+    
+    if (substr(here, here+8) == "GSDL_UID") {
+      cookie = substr (here+9, findchar (here+9, end, ';')); 
+      return true;
+    }
+    here = findchar ((text_t::const_iterator)cookiestring.begin(), end, 'G');
+  }
+
+  cookie.clear();
+  text_t host = gsdl_getenv("REMOTE_ADDR", fcgienv);
+  time_t ttime = time(NULL);
+  if (!host.empty()) {
+    cookie += host;
+    cookie.push_back ('-');
+  }
+  cookie += text_t(ttime);
+  
+  return false;
+}
+
+// as above but just tests if cookie exists
+bool receptionist::get_cookie (text_tmap &fcgienv) {
+
+  text_t c = gsdl_getenv("HTTP_COOKIE", fcgienv);
+  if (!c.empty()) {
+    text_t cookiestring = c;
+    
+    text_t::const_iterator end = cookiestring.end();  
+    text_t::const_iterator here = findchar ((text_t::const_iterator)cookiestring.begin(), end, 'G');
+
+    while (here+9 < end) { 
+      if (substr(here, here+8) == "GSDL_UID") return true;
+      here = findchar ((text_t::const_iterator)cookiestring.begin(), end, 'G');
+    }
+  }
+  return false;
+}
+
+bool receptionist::log_cgi_args (cgiargsclass &args, ostream &logout, text_tmap &fcgienv) {
+
+  // see if we want to log the cgi arguments
+  if (!configinfo.logcgiargs) return true;
+  
+  text_t host = gsdl_getenv ("REMOTE_HOST", fcgienv);
+  text_t script_name = gsdl_getenv ("SCRIPT_NAME", fcgienv);
+  if (host.empty()) host = gsdl_getenv ("REMOTE_ADDR", fcgienv);
+  text_t browser = gsdl_getenv ("HTTP_USER_AGENT", fcgienv);
+
+  cgiargsclass::const_iterator args_here = args.begin();
+  cgiargsclass::const_iterator args_end = args.end();
+
+  text_t argstr;
+  bool first = true;
+  while (args_here != args_end) {
+    if (!first) argstr += ", ";
+    argstr += (*args_here).first + "=" + (*args_here).second.value;
+    first = false;
+    args_here ++;
+  }
+
+  text_t logfile = filename_cat (configinfo.gdbmhome, "etc", "usage.txt");
+
+  text_t logstr = script_name;
+  logstr += " " + host;
+  logstr += " [";
+  if (configinfo.LogDateFormat == UTCTime) {
+    logstr += get_date (false);
+  } else if (configinfo.LogDateFormat == Absolute) {
+    time_t ttime = time(NULL);
+    logstr += ttime;
+  } else {
+    // LocalTime
+    logstr += get_date (true);
+  }
+  logstr += "] (" + argstr + ") \"";
+  logstr += browser;
+  logstr += "\"\n";
+
+  return append_logstr (logfile, logstr, logout);
+}
+
+bool receptionist::append_logstr (const text_t &filename, const text_t &logstr,
+				  ostream &logout) {
+
+  utf8outconvertclass text_t2utf8;
+  char *lfile = filename.getcstr();
+
+  int fd = open(lfile,O_APPEND);
+  
+  if (fd == -1) {
+    logout << "Error: Couldn't open file " << lfile << "\n";
+    delete lfile;
+    return false;
+  }
+
+  //int fd = GSDL_GET_FILEDESC(log);
+
+  // lock_val is set to 0 if file is locked successfully
+  int lock_val = 1;
+  GSDL_LOCK_FILE (fd);
+  if (lock_val == 0) {
+    text_t tmp_log_str(logstr); // so we don't pass a const to setinput...
+    text_t2utf8.setinput(&tmp_log_str);
+    char *buffer=new char[logstr.size()];
+    size_t num_chars;
+    convertclass::status_t status;
+    text_t2utf8.convert(buffer, logstr.size(), num_chars, status);
+    // ignore status - assume it is "finished" as buffer is big enough
+    write(fd, buffer, num_chars);
+    GSDL_UNLOCK_FILE (fd);
+    delete buffer;
+  } else {
+    logout << "Error: Couldn't lock file " << lfile << "\n";
+    close(fd);
+    delete lfile;
+    return false;
+  }
+
+  close(fd);
+		
+  delete lfile;
+  return true;
+}
+
+text_t receptionist::expandmacros (const text_t &astring, cgiargsclass &args, 
+				   ostream &logout) {
+  text_t outstring;
+  outconvertclass text_t2ascii;
+
+  action *a = actions.getaction (args["a"]);
+  prepare_page (a, args, text_t2ascii, logout);
+  disp.expandstring ("Global", astring, outstring);
+  return outstring;
+}
+
+// produce_cgi_page will call get_cgihead_info and 
+// produce_content in the appropriate way to output a cgi header and
+// the page content (if needed). If a page could not be created it
+// will return false
+bool receptionist::produce_cgi_page (cgiargsclass &args, ostream &contentout, 
+				     ostream &logout, text_tmap &fcgienv) {
+  outconvertclass text_t2ascii;
+
+  response_t response;
+  text_t response_data;
+
+  // produce cgi header
+  get_cgihead_info (args, response, response_data, logout, fcgienv);
+  if (response == location) {
+    // location response (url may contain macros!!)
+    response_data = expandmacros (response_data, args, logout);
+    contentout << text_t2ascii << "Location: " << response_data << "\n\n";
+    contentout << flush;
+    return true;
+  } else if (response == content) {
+    // content response
+
+    // use the later of build.cfg and collect.cfg modification times
+    // as the Last-Modified: header, for caching values
+    struct stat file_info;
+    time_t latest=0;
+
+    text_t collectname="";
+    collectname=args["c"];
+    if (collectname != "") {
+      text_t collectdir=filename_cat(configinfo.gsdlhome,"collect");
+      collectdir=filename_cat(collectdir,collectname);
+      text_t buildcfg=filename_cat(collectdir,"index");
+      buildcfg=filename_cat(buildcfg,"build.cfg");
+      char *buildcfg_ptr=buildcfg.getcstr();
+      text_t collectcfg=filename_cat(collectdir,"etc");
+      collectcfg=filename_cat(collectcfg,"collect.cfg");
+      char *collectcfg_ptr=collectcfg.getcstr();
+
+      if (stat(buildcfg_ptr, &file_info)) {
+	// we got an error. Currently don't handle error :(
+	//	logout << 
+      } else {
+	latest=file_info.st_mtime;
+      }
+    
+      if (stat(collectcfg_ptr, &file_info)) {
+	// error - unhandled for now
+      } else {
+	if (latest<file_info.st_mtime) latest=file_info.st_mtime;
+      }
+      delete buildcfg_ptr;
+      delete collectcfg_ptr;
+
+      if (latest>0) {
+	// print out modified time, "DDD, dd MMM YYYY hh:mm:ss" format
+	// c library takes care of mem for this string... (has \n at end!!!!)
+	// latest is currently local time, convert to UTC.
+	struct tm* utc_latest;
+	utc_latest=gmtime(&latest);
+	contentout << "Last-Modified: " << asctime(utc_latest);
+      }
+    } // end of collection != ""
+
+    /*
+      // This block of code should prevent the users browser from caching
+      // the page. It may be useful to uncomment this code and comment out
+      // that directly above (which sets a "Last-Modified" header) when
+      // doing interface development work where a given page may be
+      // changing often.
+
+    contentout << "Expires: Mon, 26 Jul 1997 05:00:00 GMT\n"; // date in the past
+    tm *tm_ptr = NULL;
+    time_t t = time(NULL);
+    tm_ptr = gmtime (&t);
+    if (tm_ptr != NULL) {
+      char *timestr = new char[128];
+      strftime (timestr, 128, "%a, %d %b %Y %H:%M:%S", tm_ptr);
+      contentout << "Last-Modified: " << timestr << " GMT\n"; // always modified
+      delete timestr;
+    }
+    contentout << "Cache-Control: no-cache, must-revalidate\n"; // HTTP/1.1
+    contentout << "Pragma: no-cache\n"; // HTTP/1.0
+    */
+
+    contentout << text_t2ascii << "Content-type: " << response_data << "\n\n";
+  } else {
+    // unknown response
+    logout << "Error: get_cgihead_info returned an unknown response type.\n";
+    return false;
+  }
+
+  // produce cgi page
+  if (!produce_content (args, contentout, logout)) return false;
+
+  // flush contentout
+  contentout << flush;
+  return true;
+}
+
+
+// get_cgihead_info determines the cgi header information for
+// a set of cgi arguments. If response contains location then
+// response_data contains the redirect address. If reponse
+// contains content then reponse_data contains the content-type.
+// Note that images can now be produced by the receptionist.
+void receptionist::get_cgihead_info (cgiargsclass &args, response_t &response,
+				     text_t &response_data, ostream &logout, 
+				     text_tmap &fcgienv) {
+  outconvertclass text_t2ascii;
+
+  // get the action
+  action *a = actions.getaction (args["a"]);
+  if (a != NULL) {
+    a->get_cgihead_info (args, &protocols, response, response_data, logout);
+
+  } else {
+    // the action was not found!!
+    logout << text_t2ascii << "Error receptionist::get_cgihead_info: the action \"" 
+	   << args["a"] << "\" could not be found.\n";
+    response = content;
+    response_data = "text/html";
+  }
+
+  // add the encoding information
+  if (response == content) {
+    if (converters.find(args["w"]) != converters.end()) {
+      response_data += "; charset=" + args["w"];
+    } else {
+      // default to latin 1
+      response_data += "; charset=ISO-8859-1";
+    }
+
+    // add cookie if required
+    if (configinfo.usecookies && !get_cookie(fcgienv))
+      response_data += "\nSet-Cookie: GSDL_UID=" + args["z"]
+	+ "; expires=25-Dec-37 00:00:00 GMT";
+  }
+}
+
+
+// produce the page content
+bool receptionist::produce_content (cgiargsclass &args, ostream &contentout,
+				    ostream &logout) {
+
+  // decide on the output conversion class
+  text_t &arg_w = args["w"];
+  rzwsoutconvertclass defaultoutconverter;
+  rzwsoutconvertclass *outconverter = converters.get_outconverter (arg_w);
+  if (outconverter == NULL) outconverter = &defaultoutconverter;
+  outconverter->reset();
+
+
+  recptproto *collectproto = protocols.getrecptproto (args["c"], logout);
+  if (collectproto != NULL) {
+    // get browsers to process OID
+    text_t OID = args["d"];
+    if (OID.empty()) OID = args["cl"];
+    if (!OID.empty()) {
+      text_tset metadata;
+      text_tarray OIDs;
+      OIDs.push_back (OID);
+      if (!is_top(OID)) OIDs.push_back (OID + ".pr");
+      FilterResponse_t response;
+      metadata.insert ("childtype");
+      if (get_info (OIDs, args["c"], metadata, false, collectproto, response, logout)) {
+	text_t classifytype;
+	if (!response.docInfo[0].metadata["childtype"].values[0].empty())
+	  classifytype = response.docInfo[0].metadata["childtype"].values[0];
+	else if (!is_top (OID)) {
+	  if (!response.docInfo[1].metadata["childtype"].values[0].empty())
+	    classifytype = response.docInfo[1].metadata["childtype"].values[0];
+	}
+	browserclass *b = browsers.getbrowser (classifytype);
+	b->processOID (args, collectproto, logout);
+      }
+    }
+  
+    // translate "d" and "cl" arguments if required
+    translate_OIDs (args, collectproto, logout);
+  }
+  
+  // produce the page using the desired action
+  action *a = actions.getaction (args["a"]);
+  if (a != NULL) {
+    if (a->uses_display(args)) prepare_page (a, args, (*outconverter), logout);
+    if (!a->do_action (args, &protocols, &browsers, disp, (*outconverter), contentout, logout))
+      return false;
+  } else {
+    // the action was not found!!
+    outconvertclass text_t2ascii;
+
+    logout << text_t2ascii << "Error receptionist::produce_content: the action \"" 
+	   << args["a"] << "\" could not be found.\n";
+    
+    contentout << (*outconverter) 
+	       << "<html>\n"
+	       << "<head>\n"
+	       << "<title>Error</title>\n"
+	       << "</head>\n"
+	       << "<body>\n"
+	       << "<h2>Oops!</h2>\n"
+	       << "Undefined Page. The action \"" 
+	       << args["a"] << "\" could not be found.\n"
+	       << "</body>\n"
+	       << "</html>\n";
+  }
+  return true;
+}
+
+
+// returns the compressed argument ("e") corresponding to the argument
+// list. This can be used to save preferences between sessions.
+text_t receptionist::get_compressed_arg (cgiargsclass &args, ostream &logout) {
+  // decide on the output conversion class
+  text_t &arg_w = args["w"];
+  rzwsoutconvertclass defaultoutconverter;
+  rzwsoutconvertclass *outconverter = converters.get_outconverter (arg_w);
+  if (outconverter == NULL) outconverter = &defaultoutconverter;
+  outconverter->reset();
+
+  text_t compressed_args;
+  if (compress_save_args (argsinfo, configinfo.saveconf, args, 
+			  compressed_args, *outconverter, logout))
+    return compressed_args;
+
+  return "";
+}
+
+
+// will read in all the macro files. If one is not found an
+// error message will be written to logout and the method will
+// return false.
+bool receptionist::read_macrofiles (ostream &logout) {
+  outconvertclass text_t2ascii;
+
+  // redirect the error output to logout
+  ostream *savedlogout = disp.setlogout (&logout);
+
+  // load up the default macro files, the collection directory
+  // is searched first for the file (if this is being used in
+  // collection specific mode) and then the main directory(s)
+  text_t colmacrodir = filename_cat (configinfo.collectdir, "macros");
+
+  text_tset maindirs;
+  text_t gsdlmacrodir = filename_cat (configinfo.gsdlhome, "macros");
+  maindirs.insert (gsdlmacrodir);
+  colinfo_tmap::iterator colhere = configinfo.collectinfo.begin();
+  colinfo_tmap::iterator colend = configinfo.collectinfo.end();
+  while (colhere != colend) {
+    if (!((*colhere).second.gsdl_gsdlhome).empty()) {
+      gsdlmacrodir = filename_cat ((*colhere).second.gsdl_gsdlhome, "macros");
+      maindirs.insert (gsdlmacrodir);
+    }
+    colhere ++;
+  }
+
+  text_tset::iterator arrhere = configinfo.macrofiles.begin();
+  text_tset::iterator arrend = configinfo.macrofiles.end();
+  text_t filename;
+  while (arrhere != arrend) {
+    bool foundfile = false;
+
+    // try in the collection directory if this is being
+    // run in collection specific mode
+    if (!configinfo.collection.empty()) {
+      filename = filename_cat (colmacrodir, *arrhere);
+      if (file_exists (filename)) {
+	disp.loaddefaultmacros(filename);
+	foundfile = true;
+      }
+    }
+
+    // if we haven't found the macro file yet try in
+    // the main macro directory(s)
+    // if file is found in more than one main directory
+    // we'll load all copies
+    if (!foundfile) {
+      text_tset::const_iterator dirhere = maindirs.begin();
+      text_tset::const_iterator dirend = maindirs.end();
+      while (dirhere != dirend) {
+	filename = filename_cat (*dirhere, *arrhere);
+	if (file_exists (filename)) {
+	  disp.loaddefaultmacros(filename);
+	  foundfile = true;
+	}
+	dirhere ++;
+      }
+    }
+
+    // see if we found the file or not
+    if (!foundfile) {
+      logout << text_t2ascii 
+	     << "Error: the macro file \"" << *arrhere << "\" could not be found.\n";
+      if (configinfo.collection.empty()) {
+	text_t dirs;
+	joinchar (maindirs, ", ", dirs);
+	logout << text_t2ascii 
+	       << "It should be in either of the following directories ("
+	       << dirs << ").\n\n";
+
+      } else {
+	logout << text_t2ascii
+	       << "It should be in either " << colmacrodir << " or in " 
+	       << gsdlmacrodir << ".\n\n";
+      }
+      // reset logout to what it was
+      disp.setlogout (savedlogout);
+      return false;
+    }
+    arrhere++;
+  }
+
+  // success
+
+  // reset logout to what it was
+  disp.setlogout (savedlogout);
+  return true;
+}
+
+
+// check_mainargs will check all the main arguments. If a major
+// error is found it will return false and no cgi page should
+// be created using the arguments.
+bool receptionist::check_mainargs (cgiargsclass &args, ostream &logout) {
+  // if this receptionist is running in collection dependant mode
+  // then it should always set the collection argument to the
+  // collection
+  if (!configinfo.collection.empty()) args["c"] = configinfo.collection;
+
+  // if current collection uses ccscols make sure
+  // "ccs" argument is set and make "cc" default to
+  // all collections in "ccs"
+  if (!args["c"].empty()) {
+
+    text_t &arg_c = args["c"];
+    recptproto *collectproto = protocols.getrecptproto (arg_c, logout);
+    if (collectproto == NULL) {
+      // oops, this collection isn't valid
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii << "ERROR: Invalid collection: " << arg_c << "\n";
+      args["c"].clear();
+
+    } else {
+
+      ColInfoResponse_t *cinfo = get_collectinfo_ptr (collectproto, arg_c, logout);
+
+      if (cinfo != NULL) {
+	if (!cinfo->ccsCols.empty()) {
+	  args["ccs"] = 1;
+	  if (args["cc"].empty()) {
+	    text_tarray::const_iterator col_here = cinfo->ccsCols.begin();
+	    text_tarray::const_iterator col_end = cinfo->ccsCols.end();
+	    bool first = true;
+	    while (col_here != col_end) {
+	      // make sure it's a valid collection
+	      if (protocols.getrecptproto (*col_here, logout) != NULL) {
+		if (!first) args["cc"].push_back (',');
+		args["cc"] += *col_here;
+		first = false;
+	      }
+	      col_here ++;
+	    }
+	  }
+	}
+      } else {
+	logout << "ERROR (receptionist::check_mainargs): get_collectinfo_ptr returned NULL\n";
+      }
+    }
+  }
+
+  // argument "v" can only be 0 or 1. Use the default value
+  // if it is out of range
+  int arg_v = args.getintarg ("v");
+  if (arg_v != 0 && arg_v != 1) {
+    cgiarginfo *vinfo = argsinfo.getarginfo ("v");
+    if (vinfo != NULL) args["v"] = vinfo->argdefault;
+  }
+
+  // argument "f" can only be 0 or 1. Use the default value
+  // if it is out of range
+  int arg_f = args.getintarg ("f");
+  if (arg_f != 0 && arg_f != 1) {
+    cgiarginfo *finfo = argsinfo.getarginfo ("f");
+    if (finfo != NULL) args["f"] = finfo->argdefault;
+  }
+
+  return true;
+}
+
+// translate_OIDs translates the "d" and "cl" arguments to their correct values
+// if they use the tricky ".fc", ".lc" type syntax.
+void receptionist::translate_OIDs (cgiargsclass &args, recptproto *collectproto, 
+				   ostream &logout) {
+
+  FilterResponse_t response;
+  FilterRequest_t request;
+  comerror_t err;
+  text_t &arg_d = args["d"];
+  text_t &arg_cl = args["cl"];
+  text_t &collection = args["c"];
+  
+  // do a call to translate OIDs if required
+  request.filterName = "NullFilter";
+  request.filterResultOptions = FROID;
+  if (!arg_d.empty() && needs_translating (arg_d)) {
+    request.docSet.push_back (arg_d);
+    collectproto->filter (collection, request, response, err, logout);
+    arg_d = response.docInfo[0].OID;
+    request.clear();
+  }
+  // we'll also check here that the "cl" argument has a "classify" doctype 
+  // (in case ".fc" or ".lc" have screwed up)
+  if (needs_translating (arg_cl)) {
+    request.fields.insert ("doctype");
+    request.docSet.push_back (arg_cl);
+    request.filterResultOptions = FRmetadata;
+    collectproto->filter (collection, request, response, err, logout);
+    // set to original value (without .xx stuff) if doctype isn't "classify"
+    if (response.docInfo[0].metadata["doctype"].values[0] != "classify")
+      strip_suffix (arg_cl);
+    else
+      arg_cl = response.docInfo[0].OID;
+  }
+}
+
+// prepare_page sets up page parameters, sets display macros
+// and opens the page ready for output 
+void receptionist::prepare_page (action *a, cgiargsclass &args, 
+				 outconvertclass &outconvert, 
+				 ostream &logout) {
+  // set up page parameters
+  text_t pageparams;
+  bool first = true;
+
+  text_tmap::iterator params_here = configinfo.pageparams.begin();
+  text_tmap::iterator params_end = configinfo.pageparams.end();
+  while (params_here != params_end) {
+    if (args[(*params_here).first] != (*params_here).second) {
+      if (!first) pageparams += ",";
+      first = false;
+      pageparams += (*params_here).first;
+      pageparams += "=";
+      pageparams += args[(*params_here).first];
+    }
+    
+    params_here++;
+  }
+  
+
+  // open the page
+  disp.openpage(pageparams, configinfo.macroprecedence);
+
+  // define external macros for each action
+  actionptrmap::iterator actionhere = actions.begin ();
+  actionptrmap::iterator actionend = actions.end ();
+
+  while (actionhere != actionend) {
+    assert ((*actionhere).second.a != NULL);
+    if ((*actionhere).second.a != NULL) {
+      (*actionhere).second.a->define_external_macros (disp, args, &protocols, logout);
+    }
+    actionhere++;
+  }
+
+  // define internal macros for the current action
+  a->define_internal_macros (disp, args, &protocols, logout);
+  
+  // define general macros. the defining of general macros is done here so that
+  // the last possible version of the cgi arguments are used
+  define_general_macros (args, outconvert, logout);
+}
+
+void receptionist::define_general_macros (cgiargsclass &args, outconvertclass &/*outconvert*/, 
+					  ostream &logout) {
+
+  text_t &collection = args["c"];
+
+  disp.setmacro ("gsdlhome", "Global", dm_safe(configinfo.gsdlhome));
+  disp.setmacro ("gwcgi", "Global", configinfo.gwcgi);
+  disp.setmacro ("httpimg", "Global", configinfo.httpimg);
+  disp.setmacro ("httpprefix", "Global", configinfo.httpprefix);
+
+  if (!collection.empty()) {
+    // DB // ****
+    ColInfoResponse_t cinfo;
+    comerror_t err;
+    recptproto *collectproto = protocols.getrecptproto (collection, logout);
+    if (collectproto != NULL) {
+      collectproto->get_collectinfo (collection, cinfo, err, logout);
+      text_t httpcollection;
+      if (!cinfo.httpdomain.empty()) httpcollection = "http://";
+      httpcollection += cinfo.httpdomain + cinfo.httpprefix + "/collect/" + collection; 
+      disp.setmacro ("httpcollection", "Global", httpcollection); 
+    }
+  }
+
+  text_t compressedoptions = get_compressed_arg(args, logout);
+  disp.setmacro ("compressedoptions", "Global", dm_safe(compressedoptions));
+  // need a decoded version of compressedoptions for use within forms
+  // as browsers encode values from forms before sending to server
+  // (e.g. %25 becomes %2525)
+  decode_cgi_arg (compressedoptions);
+  disp.setmacro ("decodedcompressedoptions", "Global", dm_safe(compressedoptions));
+
+#if defined (__WIN32__)
+  disp.setmacro ("win32", "Global", "1");
+#endif
+
+  // set _cgiargX_ macros for each cgi argument
+  cgiargsclass::const_iterator argshere = args.begin();
+  cgiargsclass::const_iterator argsend = args.end();
+  while (argshere != argsend) {
+    if (((*argshere).first == "q") ||
+	((*argshere).first == "qa") ||
+	((*argshere).first == "qtt") ||
+	((*argshere).first == "qty") ||
+	((*argshere).first == "qp") ||
+	((*argshere).first == "qpl") ||
+	((*argshere).first == "qr") ||
+	((*argshere).first == "q2"))
+      // need to escape special characters from query string
+      disp.setmacro ("cgiarg" + (*argshere).first, 
+		     "Global", html_safe((*argshere).second.value));
+    else 
+      disp.setmacro ("cgiarg" + (*argshere).first, "Global", dm_safe((*argshere).second.value));
+    argshere ++;
+  }
+
+  // display text right to left if language is arabic (and if browser can support it)
+  if (args["l"] == "ar")
+    disp.setmacro ("htmlextra", "Global", " dir=rtl");
+
+  // set collection specific macros
+  if (!collection.empty()) {
+    recptproto *collectproto = protocols.getrecptproto (collection, logout);
+    if (collectproto != NULL) {
+      FilterResponse_t response;
+      text_tset metadata;
+      get_info ("collection", collection, metadata, false, 
+		collectproto, response, logout);
+      
+      if (!response.docInfo[0].metadata.empty()) {
+	MetadataInfo_tmap::const_iterator here = response.docInfo[0].metadata.begin();
+	MetadataInfo_tmap::const_iterator end = response.docInfo[0].metadata.end();
+	while (here != end) {
+	  if (((*here).first != "haschildren") && ((*here).first != "hasnext") &&
+	      ((*here).first != "hasprevious")) {
+	    // check for args in form name:lang
+	    text_t name = "";
+	    text_t lang = "";
+	    bool colonfound=false;
+	    text_t::const_iterator a = (*here).first.begin();
+	    text_t::const_iterator b = (*here).first.end();
+	    while (a !=b) {
+	      if (*a==':') {
+		colonfound=true;
+	      }
+	      else {
+		if (colonfound)
+		  lang.push_back(*a);
+		else name.push_back(*a);
+	      }
+	      a++;
+	    }
+	    if (!lang.empty()) {
+	      if (args["l"]==lang) {
+		disp.setmacro (name, "Global", (*here).second.values[0]);
+	      }
+	    }
+	    else { // the default one
+	      disp.setmacro ((*here).first, "Global", (*here).second.values[0]);
+	    }
+	  }
+	  here ++;
+	}
+      }
+
+      text_t iconcollection;
+      disp.expandstring ("Global", "_iconcollection_", iconcollection);
+      if (!iconcollection.empty())
+	{
+	  ColInfoResponse_t cinfo;
+	  comerror_t err;
+	  collectproto->get_collectinfo (collection, cinfo, err, logout);
+	  if (iconcollection[0]=='/' && !cinfo.httpdomain.empty())
+	    {
+	      // local but with full path
+	      iconcollection = "http://" + cinfo.httpdomain + iconcollection;
+	      disp.setmacro("iconcollection", "Global", iconcollection);
+	    }
+	}
+    }
+  }
+}
+
+// gets collection info from cache if found or 
+// calls collection server (and updates cache)
+// returns NULL if there's an error
+ColInfoResponse_t *receptionist::get_collectinfo_ptr (recptproto *collectproto, 
+						      const text_t &collection, 
+						      ostream &logout) {
+  
+  // check the cache
+  colinfo_tmap::iterator it = configinfo.collectinfo.find (collection);
+  if ((it != configinfo.collectinfo.end()) && ((*it).second.info_loaded)) {
+    // found it
+    return &((*it).second.info);
+  }
+
+  // not cached, get info from collection server
+  if (collectproto == NULL) {
+    logout << "ERROR: receptionist::get_collectinfo_ptr passed null collectproto\n";
+    return NULL;
+  }
+   
+  comerror_t err;
+  if (it == configinfo.collectinfo.end()) {
+    collectioninfo_t cinfo;
+    collectproto->get_collectinfo (collection, cinfo.info, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii << "ERROR (receptionist::getcollectinfo_ptr): \""
+	     << get_comerror_string (err) << "\"while getting collectinfo\n";
+      return NULL;
+    }
+    cinfo.info_loaded = true;
+    configinfo.collectinfo[collection] = cinfo;
+    return &(configinfo.collectinfo[collection].info);
+  } else {
+    collectproto->get_collectinfo (collection, (*it).second.info, err, logout);
+    if (err != noError) {
+      outconvertclass text_t2ascii;
+      logout << text_t2ascii << "ERROR (receptionist::getcollectinfo_ptr): \""
+	     << get_comerror_string (err) << "\"while getting collectinfo\n";
+      return NULL;
+    }
+    (*it).second.info_loaded = true;
+    return &((*it).second.info);
+  }
+}
+
+// removes a collection from the cache so that the next
+// call to get_collectinfo_ptr() for that collection will
+// retrieve the collection info from the collection server
+void receptionist::uncache_collection (const text_t &collection) {
+
+  colinfo_tmap::iterator it = configinfo.collectinfo.find (collection);
+  if ((it != configinfo.collectinfo.end()) && ((*it).second.info_loaded)) {
+
+    (*it).second.info_loaded = false;
+
+  }
+}
+
+// Handles an "Encoding" line from a configuration file - note that the
+// configinfo.encodings map is a bit of a hack (to be fixed when the
+// configuration files are tidied up).
+void receptionist::configure_encoding (const text_tarray &cfgline) {
+
+  text_t subkey, subvalue, shortname, longname, mapfile;
+  int multibyte = 0;
+  text_t::const_iterator cfglinesub_here;
+  text_tarray::const_iterator cfgline_here = cfgline.begin();
+  text_tarray::const_iterator cfgline_end = cfgline.end();
+  while (cfgline_here != cfgline_end) {
+    if (*cfgline_here == "multibyte") {
+      multibyte = 1;
+    } else {
+      cfglinesub_here = getdelimitstr((*cfgline_here).begin(),
+				      (*cfgline_here).end(), '=', subkey);
+      if (subkey == "shortname") {
+	shortname = substr (cfglinesub_here, (*cfgline_here).end());
+      } else if (subkey == "longname") {
+	longname = substr (cfglinesub_here, (*cfgline_here).end());
+      } else if (subkey == "map") {
+	mapfile = substr (cfglinesub_here, (*cfgline_here).end());
+      }
+    }
+    cfgline_here++;
+  }
+  if (!shortname.empty()) {
+    if (longname.empty()) longname = shortname;
+
+    // add the converter
+    if (shortname == "utf-8") {
+      utf8inconvertclass *utf8inconvert = new utf8inconvertclass();
+      utf8outconvertclass *utf8outconvert = new utf8outconvertclass();
+      utf8outconvert->set_rzws(1);
+      add_converter (shortname, utf8inconvert, utf8outconvert);
+      configinfo.encodings[longname] = shortname;
+
+    } else if (!mapfile.empty()) {
+
+      if (mapfile == "8859_1.ump") {
+	// iso-8859-1 is a special case as it'll always be supported by the
+	// standard converter class and therefore doesn't need to use its
+	// mapping file
+	inconvertclass *inconvert = new inconvertclass();
+	rzwsoutconvertclass *outconvert = new rzwsoutconvertclass();
+	outconvert->set_rzws(1);
+	add_converter (shortname, inconvert, outconvert);  
+	configinfo.encodings[longname] = shortname;
+
+      } else {
+	text_t to_uc_map = filename_cat(configinfo.gsdlhome, "mappings", "to_uc", mapfile);
+	text_t from_uc_map = filename_cat(configinfo.gsdlhome, "mappings", "from_uc", mapfile);
+	if (file_exists(to_uc_map) && file_exists(from_uc_map)) {
+
+	  mapinconvertclass *mapinconvert = new mapinconvertclass();
+	  mapinconvert->setmapfile (to_uc_map, 0x003F);
+	  mapinconvert->set_multibyte (multibyte);
+	  mapoutconvertclass *mapoutconvert = new mapoutconvertclass();
+	  mapoutconvert->setmapfile (from_uc_map, 0x3F);
+	  mapoutconvert->set_multibyte (multibyte);
+	  mapoutconvert->set_rzws(1);
+	  add_converter (shortname, mapinconvert, mapoutconvert);
+	  configinfo.encodings[longname] = shortname;
+	}
+      }
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/receptionist.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/receptionist.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/receptionist.h	(revision 21083)
@@ -0,0 +1,266 @@
+/**********************************************************************
+ *
+ * receptionist.h -- a web interface for the gsdl
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef RECEPTIONIST_H
+#define RECEPTIONIST_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "cgiargs.h"
+#include "display.h"
+#include "browserclass.h"
+#include "recptproto.h"
+#include "converter.h"
+#include "cfgread.h"
+#include "action.h"
+#include "cnfgable.h"
+
+// the MACROPRECEDENCE macro is used as a default. override
+// it using something like:
+//
+// macroprecedence c,l
+//
+// in your configuration file
+#ifndef MACROPRECEDENCE
+#define MACROPRECEDENCE "c,l"
+#endif
+
+
+struct collectioninfo_t {
+  void clear ();
+  collectioninfo_t () {clear();}
+
+  text_t gsdl_gsdlhome;
+  text_t gsdl_gdbmhome;
+
+  bool info_loaded;
+  ColInfoResponse_t info;
+};
+
+struct languageinfo_t {
+  void clear();
+  languageinfo_t () {clear();}
+
+  text_t longname;
+  text_t defaultencoding;
+};
+
+typedef map<text_t, collectioninfo_t, lttext_t> colinfo_tmap;
+typedef map<text_t, languageinfo_t, lttext_t> languageinfo_tmap;
+
+enum events_t {Disabled, CollectorEvents, AllEvents};
+enum ldformat_t {LocalTime, UTCTime, Absolute};
+
+struct recptconf {
+  text_t gsdlhome;
+  text_t gdbmhome;   // will equal gsdlhome if not set
+  text_t collection; // will equal "" in 'general' mode
+  text_t collectdir; // will equal gsdlhome in 'general' mode
+  colinfo_tmap collectinfo;
+  text_t httpprefix;
+  text_t httpimg;    // will equal /images if not set
+  text_t gwcgi;
+  text_tset macrofiles;
+  text_t saveconf;
+  bool usecookies;  // true if we want cookies set
+  bool logcgiargs;  // true if we want to log cgi arguments
+
+  ldformat_t LogDateFormat;
+
+  text_t maintainer; // email address of maintainer
+  text_t MailServer; // SMTP mail server to use when sending event messages by email
+                     // defaults to mail.maintainer-domain
+  events_t LogEvents;
+  events_t EmailEvents;
+  bool EmailUserEvents;
+
+  text_tmap pageparams;
+  text_t macroprecedence;
+  
+  languageinfo_tmap languages;
+
+  // encodings is just a simple mapping from encoding longnames to
+  // shortnames.  It's useful for now for creating the pulldown menu of
+  // encodings on the preferences page but isn't intended to be permanent.
+  text_tmap encodings;
+
+  void clear ();
+  recptconf () {clear();}
+};
+
+class receptionist : public configurable {
+protected:
+  recptconf configinfo;
+
+  cgiargsinfoclass argsinfo;
+  actionmapclass actions;
+  browsermapclass browsers;
+  recptprotolistclass protocols;
+  displayclass disp;
+  convertinfoclass converters;
+  ColInfoResponse_t collectinfo;
+  
+  // prepare_page sets up page parameters, sets display macros
+  // and opens the page ready for output 
+  virtual void prepare_page (action *a, cgiargsclass &args, 
+			     outconvertclass &outconvert, 
+			     ostream &logout);
+  
+  virtual void translate_OIDs (cgiargsclass &args, recptproto *collectproto,
+			       ostream &logout);
+
+  bool get_cookie (text_t &cookie, text_tmap &fcgienv);
+  bool get_cookie (text_tmap &fcgienv);
+
+  // get the default encoding for the given language - if it fails for any
+  // reason, return ""
+  text_t get_default_encoding (const text_t &language);
+
+  virtual void define_general_macros (cgiargsclass &args, outconvertclass &outconvert, 
+				      ostream &logout);
+
+  bool append_logstr (const text_t &filename, const text_t &logstr,
+		      ostream &logout);
+
+  void configure_encoding (const text_tarray &cfgline);
+
+public:
+  receptionist ();
+  virtual ~receptionist() {}
+
+  // add_action makes another action available to the receptionist
+  // the action remains the property of the calling code and that
+  // code should destroy the action after the recptionist has been
+  // destroyed.
+  void add_action (action *theaction);
+  actionmapclass *get_actionmap_ptr () {return &actions;}
+
+  // add_browser makes another browser available to the receptionist
+  // the browser remains the property of the calling code and that
+  // code should destroy it after the recptionist has been
+  // destroyed.
+  void add_browser (browserclass *thebrowser);
+  browsermapclass *get_browsermap_ptr () {return &browsers;}
+  void setdefaultbrowser (const text_t &browsername);
+
+  // add_protocol makes another protocol available to the receptionist
+  // without any protocols, no collections will be available. The
+  // protocols remain the property of the calling code.
+  void add_protocol (recptproto *theprotocol) {protocols.addrecptproto(theprotocol);}
+  recptprotolistclass *get_recptprotolist_ptr () {return &protocols;}
+  
+  // add_converter makes another converter available to the receptionist.
+  // Converters are needed to display pages using different encodings.
+  // The converters remain the property of the calling code.
+  void add_converter (const text_t &name, inconvertclass *inconverter,
+		      rzwsoutconvertclass *outconverter) {
+    converters.add_converter(name, inconverter, outconverter);}
+  convertinfoclass *get_convertinfo_ptr () {return &converters;}
+  
+  
+  // configure should be called for each line in the
+  // configuration files to configure the receptionist and everything
+  // it contains. The configuration should take place after everything
+  // has been added but before the initialisation.
+  void configure (const text_t &key, const text_tarray &cfgline);
+  virtual void configure (const text_t &key, const text_t &value);
+  const recptconf &get_configinfo () {return configinfo;}
+  cgiargsinfoclass *get_cgiargsinfo_ptr () {return &argsinfo;}
+  
+
+  // init should be called after all the actions, protocols, and
+  // converters have been added to the receptionist and after everything
+  // has been configured but before any pages are created.
+  // It returns true on success and false on failure. If false is
+  // returned getpage should not be called (without producing
+  // meaningless output), instead an error page should be
+  // produced by the calling code.
+  virtual bool init (ostream &logout);
+  
+  // There are two ways to produce a page. You can either call parse_cgi_args,
+  // get_cgihead_info, and produce_content or you can just call parse_cgi_args and
+  // produce_cgi_page (which will be satisfactory in most cases). You might want to call
+  // parse_cgi_args, get_cgihead_info, and produce_content when you want to
+  // interface directly with a web server for which the standard header is inappropriate.
+
+  // parse_cgi_args parses cgi arguments into an argument class.
+  // This function should be called for each page request. It returns false
+  // if there was a major problem with the cgi arguments.
+  virtual bool parse_cgi_args (const text_t &argstr, cgiargsclass &args, 
+			       ostream &logout, text_tmap &fcgienv);
+
+  virtual bool log_cgi_args (cgiargsclass &args, ostream &logout, text_tmap &fcgienv);
+
+  text_t expandmacros (const text_t &astring, cgiargsclass &args, 
+		       ostream &logout);
+
+  // produce_cgi_page will call get_cgihead_info and 
+  // produce_content in the appropriate way to output a cgi header and
+  // the page content (if needed). If a page could not be created it
+  // will return false
+  virtual bool produce_cgi_page (cgiargsclass &args, ostream &contentout, 
+				 ostream &logout, text_tmap &fcgienv);
+  
+  // get_cgihead_info determines the cgi header information for
+  // a set of cgi arguments. If response contains location then
+  // response_data contains the redirect address. If reponse
+  // contains content then reponse_data contains the content-type.
+  // Note that images can now be produced by the receptionist.
+  virtual void get_cgihead_info (cgiargsclass &args, response_t &response,
+				 text_t &response_data, ostream &logout,
+				 text_tmap &fcgienv);
+  
+  // produce the page content
+  virtual bool produce_content (cgiargsclass &args, ostream &contentout,
+				ostream &logout);
+  
+  // returns the compressed argument ("e") corresponding to the argument
+  // list. This can be used to save preferences between sessions.
+  text_t get_compressed_arg (cgiargsclass &args, ostream &logout);
+
+  // gets collection info from cache if found or 
+  // calls collection server (and updates cache)
+  // returns NULL if there's an error
+  ColInfoResponse_t *get_collectinfo_ptr (recptproto *collectproto, 
+					  const text_t &collection, 
+					  ostream &logout);
+
+  void uncache_collection (const text_t &collection);
+  
+protected:
+  // will read in all the macro files. If one is not found an
+  // error message will be written to logout and the method will
+  // return false.
+  virtual bool read_macrofiles (ostream &logout);
+  
+  // check_mainargs will check all the main arguments. If a major
+  // error is found it will return false and no cgi page should
+  // be created using the arguments.
+  virtual bool check_mainargs (cgiargsclass &args, ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/recptconfig.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/recptconfig.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/recptconfig.cpp	(revision 21083)
@@ -0,0 +1,167 @@
+/**********************************************************************
+ *
+ * recptconfig.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "recptconfig.h"
+#include "fileutil.h"
+#include "cfgread.h"
+#include "cnfgator.h"
+
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace/std/iostream>
+#  include <ospace/std/fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#  include <fstream.h>
+#else
+#  include <iostream>
+#  include <fstream>
+#endif
+
+class __site_configuration : public configurable {
+private:
+  text_t *gsdlhome;
+  text_t *httpdomain;
+  text_t *httpprefix;
+  int    *maxrequests;
+public:
+  __site_configuration (text_t *_gsdlhome, int *_maxrequests) {
+    gsdlhome = _gsdlhome;
+    httpdomain = NULL;
+    httpprefix = NULL;
+    maxrequests = _maxrequests;
+  }
+
+  __site_configuration (text_t *_gsdlhome, text_t *_httpdomain,
+                        text_t *_httpprefix) {
+    gsdlhome    = _gsdlhome;
+    httpdomain = _httpdomain;
+    httpprefix = _httpprefix;
+    maxrequests = NULL;
+  }
+
+  inline void configure (const text_t &key, const text_tarray &cfgline) {
+    if (key == "gsdlhome") {
+      *gsdlhome = cfgline[0];
+    }
+
+    if (key == "httpprefix" &&
+	httpprefix != NULL) {
+      *httpprefix = cfgline[0];
+    }
+
+    if (key == "httpdomain" &&
+	httpdomain != NULL) {
+      *httpdomain = cfgline[0];
+    }
+
+    if (key == "maxrequests" &&
+	maxrequests != NULL) {
+      *maxrequests = cfgline[0].getint();
+      if ((*maxrequests) < 1) {
+	*maxrequests = 1;
+      }
+    }
+  }
+};
+
+
+// reads site configuration file returning true on success
+// also sets gsdlhome and maxrequests 
+// gsdlsite.cfg should be in same directory as library executable
+bool site_cfg_read (receptionist &recpt, text_t &gsdlhome, int &maxrequests) {
+  // initialise configurator, etc.
+  __site_configuration sitecfg (&gsdlhome, &maxrequests);
+  configurator         gsdlconfigurator(&recpt);
+
+  gsdlconfigurator.add_configurable(&sitecfg);
+
+  // blank the gsdl home text
+  gsdlhome.clear();
+
+  if (gsdlconfigurator.configure("gsdlsite.cfg")) {
+    return true;
+  }
+  return false;
+}
+
+// this version grabs gsdlhome, httpdomain and httpprefix, 
+// returns false if it can't find all of them
+bool site_cfg_read (text_t &gsdlhome, text_t &httpdomain, 
+		    text_t &httpprefix) {
+  // get gsdlhome etc
+  __site_configuration sitecfg(&gsdlhome, &httpdomain, &httpprefix);
+  configurator gsdlconfigurator(&sitecfg);
+
+  gsdlhome.clear();
+  httpdomain.clear();
+  httpprefix.clear();
+
+  if (gsdlconfigurator.configure("gsdlsite.cfg") &&
+      !gsdlhome.empty() && !httpdomain.empty() && !httpprefix.empty()) {
+    return true;
+  }
+
+  return true;
+
+  return false;
+}
+
+// main_cfg_read reads both main.cfg and collect.cfg. It attempts
+// to read main.cfg first so values in collect.cfg override those
+// set earlier by main.cfg
+bool main_cfg_read (receptionist &recpt, const text_t &gsdlhome,
+		     const text_t &collection) {
+
+  // read in the main configuration file
+  bool rv = false;
+
+  text_t key, filename;
+  text_tarray cfgline;
+  filename = filename_cat (gsdlhome, "etc");
+  filename = filename_cat (filename, "main.cfg");
+  if (file_exists (filename)) {
+    rv = recpt.read_configfile(filename);
+  }
+  
+  // Look for collect.cfg in GSDLHOME/collect/collection-name/etc directory 
+  // (if this is for a particular collection), and then GSDLHOME/etc.
+  if (!collection.empty()) {
+    filename = filename_cat (gsdlhome, "collect");
+    filename = filename_cat (filename, collection);
+    filename = filename_cat (filename, "etc");
+    filename = filename_cat (filename, "collect.cfg");
+    if (!file_exists (filename)) {
+      filename = filename_cat (gsdlhome, "etc");
+      filename = filename_cat (filename, "collect.cfg");
+      if (!file_exists (filename)) filename.clear();
+    }
+
+    if (!filename.empty()) {
+      rv |= recpt.read_configfile(filename);
+    }
+  }
+  return rv;
+}
Index: /main/tags/2.38/gsdl/src/recpt/recptconfig.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/recptconfig.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/recptconfig.h	(revision 21083)
@@ -0,0 +1,48 @@
+/**********************************************************************
+ *
+ * recptconfig.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef RECPTCONFIG_H
+#define RECPTCONFIG_H
+
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "receptionist.h"
+#include "collectset.h"
+
+
+// reads site configuration file returning true on success
+bool site_cfg_read (receptionist &recpt, text_t &gsdlhome, int &maxrequests);
+bool site_cfg_read (text_t &gsdlhome, text_t &httpdomain, text_t &httpprefix);
+
+// main_cfg_read reads either collect.cfg or main.cfg and returning 
+// true on success. It attempts to read collect.cfg first if a
+// collection is specified and then it tries to read in main.cfg
+bool main_cfg_read (receptionist &recpt, const text_t &gsdlhome,
+		    const text_t &collection);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/recptmain.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/recptmain.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/recptmain.cpp	(revision 21083)
@@ -0,0 +1,35 @@
+/**********************************************************************
+ *
+ * recptmain.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "receptionist.h"
+#include "cgiwrapper.h"
+#include <assert.h>
+
+int main () {
+  receptionist recpt;
+  cgiwrapper (recpt, "");
+  return 0;
+}
+
Index: /main/tags/2.38/gsdl/src/recpt/recptproto.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/recptproto.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/recptproto.cpp	(revision 21083)
@@ -0,0 +1,167 @@
+/**********************************************************************
+ *
+ * recptproto.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "recptproto.h"
+#include <assert.h>
+
+
+// add collection server to protocol
+void recptproto::add_collection (const text_t &/*collection*/, void * /*recpt*/, 
+				 const text_t &/*gsdlhome*/, const text_t &/*gdbmhome*/) {
+}
+
+void recptproto::remove_collection (const text_t &/*collection*/, ostream &/*logout*/) {
+}
+
+// configure should be called for each line in the configuration file
+void recptproto::configure (const text_t &/*key*/, const text_tarray &/*cfgline*/, comerror_t &) {
+}
+
+// init should be called after the configuration but before any other
+// functions are called. If init returns false a message will be written
+// out to the log file and no other output should be produced.
+bool recptproto::init (comerror_t &err, ostream &/*logout*/) {
+  return true;
+}
+
+// get site name should return the name of the site used.
+// This is trivially empty in the case of a null protocol.  If a remote
+// connection to a site is being used then this should return the name
+// used to label a site
+text_t recptproto::get_site_name(comerror_t &err) {
+  return "localhost";
+}
+
+// get_protocol_name should return the name of this protocol (e.g. recptproto)
+// that can be used to do run time type identification and display information
+// about the protocol.
+text_t recptproto::get_protocol_name (comerror_t &err) {
+  return "recptproto";
+}
+
+// get_collection_list returns the list of collections that
+// this protocol knows about
+void recptproto::get_collection_list (text_tarray &collist, comerror_t &err, 
+				      ostream &/*logout*/) {
+  collist.erase(collist.begin(),collist.end());
+  err = noError;
+}
+
+// has_collection sets 'hascollection' to be true if the protocol
+// can communicate with the collection (i.e. it is within its 
+// collection list). This function should be implemented in as
+// efficient time as possible as it will be called for each page
+// access and for each protocol.
+void recptproto::has_collection (const text_t &/*collection*/, bool &hascollection, 
+				 comerror_t &err, ostream &/*logout*/) {
+  hascollection = false;
+  err = noError;
+}
+
+// sets 'wassuccess' to be true if a successful ping was done to
+// the given collection.
+void recptproto::ping (const text_t &/*collection*/, bool &wassuccess, 
+		       comerror_t &err, ostream &/*logout*/) {
+  wassuccess = false; // no collections are supported by this class
+  err = noError;
+}
+
+// obtains general information about the collection
+void recptproto::get_collectinfo (const text_t &/*collection*/, 
+				  ColInfoResponse_t &/*collectinfo*/,
+				  comerror_t &err, ostream &/*logout*/) {
+  err = protocolError;
+}
+
+// gets a list of all the filters
+void recptproto::get_filterinfo (const text_t &/*collection*/,
+				 InfoFiltersResponse_t &/*reponse*/,
+				 comerror_t &err, ostream &/*logout*/) {
+  err = protocolError;
+}
+
+// gets all the filter options for a particular filter
+void recptproto::get_filteroptions (const text_t &/*collection*/,
+				    const InfoFilterOptionsRequest_t &/*request*/,
+				    InfoFilterOptionsResponse_t &/*response*/, 
+				    comerror_t &err, ostream &/*logout*/) {
+  err = protocolError;
+}
+
+// filters (search or browse) a result set
+void recptproto::filter (const text_t &/*collection*/,
+			 FilterRequest_t &/*request*/,
+			 FilterResponse_t &/*response*/,
+			 comerror_t &err, ostream &/*logout*/) {
+  err = protocolError;
+}
+
+void recptproto::get_document (const text_t &/*collection*/,
+			       const DocumentRequest_t &/*request*/,
+			       DocumentResponse_t &/*response*/,
+			       comerror_t &err, ostream &/*logout*/) {
+  err = protocolError;
+}
+
+
+
+
+
+
+
+// therecptproto remains the property of the calling code but
+// should not be deleted until it is removed from this list.
+void recptprotolistclass::addrecptproto (recptproto *therecptproto) {
+  // can't add a protocol that doesn't exist
+  assert (therecptproto != NULL);
+  if (therecptproto == NULL) return;
+
+  recptprotoptr rpp;
+  rpp.p = therecptproto;
+
+  recptprotoptrs.push_back(rpp);
+}
+
+// getrecptproto will return NULL if a recptproto for the given colelction
+// could not be found
+recptproto *recptprotolistclass::getrecptproto (const text_t &collection, 
+						ostream &logout) {
+  iterator here = recptprotoptrs.begin ();
+  iterator end = recptprotoptrs.end ();
+  bool hascollection;
+  comerror_t err;
+
+  while (here != end) {
+    assert ((*here).p != NULL);
+    if ((*here).p != NULL) {
+      (*here).p->has_collection (collection, hascollection, err, logout);
+      if ((err == noError) && (hascollection == true)) return (*here).p;
+    }
+    
+    here++;
+  }
+  
+  return NULL;
+}
Index: /main/tags/2.38/gsdl/src/recpt/recptproto.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/recptproto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/recptproto.h	(revision 21083)
@@ -0,0 +1,189 @@
+/**********************************************************************
+ *
+ * recptproto.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef RECPTPROTO_H
+#define RECPTPROTO_H
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include "comtypes.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\vector>
+#elif defined(GSDL_USE_STL_H)
+#  include <vector.h>
+#else
+#  include <vector>
+#endif
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+// recptproto is a generalisation of a protocol for communicating
+// with a collection server.
+class recptproto {
+public:
+
+  // add collection server to protocol
+  virtual void add_collection (const text_t &collection, void *recpt, 
+			       const text_t &gsdlhome, const text_t &gdbmhome);
+
+  virtual void remove_collection (const text_t &collection, ostream &logout);
+
+  // configure should be called for each line in the configuration file
+  virtual void configure (const text_t &key, const text_tarray &cfgline, comerror_t &err);
+
+  // init should be called after the configuration but before any other
+  // functions are called. If init returns false a message will be written
+  // out to the log file and no other output should be produced.
+  virtual bool init (comerror_t &err, ostream &logout);
+
+  // get_site_name should return the name of the site used.
+  // This is trivially empty in the case of a null protocol.  If a remote
+  // connection to a site is being used then this should return the name
+  // used to label a site
+  virtual text_t get_site_name(comerror_t &err);
+
+  // get_protocol_name should return the name of this protocol (e.g. recptproto)
+  // that can be used to do run time type identification and display information
+  // about the protocol.
+  virtual text_t get_protocol_name (comerror_t &err);
+
+  // get_collection_list returns the list of collections that
+  // this protocol knows about
+  virtual void get_collection_list (text_tarray &collist, comerror_t &err, 
+				    ostream &logout);
+
+  // has_collection sets 'hascollection' to be true if the protocol
+  // can communicate with the collection (i.e. it is within its 
+  // collection list). This function should be implemented in as
+  // efficient time as possible as it will be called for each page
+  // access and for each protocol.
+  virtual void has_collection (const text_t &collection, bool &hascollection, 
+			       comerror_t &err, ostream &logout);
+
+  // sets 'wassuccess' to be true if a successful ping was done to
+  // the given collection.
+  virtual void ping (const text_t &collection, bool &wassuccess, 
+		     comerror_t &err, ostream &logout);
+
+  // obtains general information about the collection
+  virtual void get_collectinfo (const text_t &collection, 
+				ColInfoResponse_t &collectinfo,
+				comerror_t &err, ostream &logout);
+
+  // gets a list of all the filters
+  virtual void get_filterinfo (const text_t &collection,
+			       InfoFiltersResponse_t &response,
+			       comerror_t &err, ostream &logout);
+
+  // gets all the filter options for a particular filter
+  virtual void get_filteroptions (const text_t &collection,
+				  const InfoFilterOptionsRequest_t &request,
+				  InfoFilterOptionsResponse_t &response, 
+				  comerror_t &err, ostream &logout);
+
+  // filters (search or browse) a result set and returns information
+  // about the filtered set including term frequency information and 
+  // metadata
+  virtual void filter (const text_t &collection,
+		       FilterRequest_t &request,
+		       FilterResponse_t &response,
+		       comerror_t &err, ostream &logout);
+
+  // gets a document (duh!)
+  virtual void get_document (const text_t &collection,
+			     const DocumentRequest_t &request,
+			     DocumentResponse_t &response,
+			     comerror_t &err, ostream &logout);
+};
+
+
+// The recptprotoptr function does not 'own' the recptproto. The 
+// recptproto should be deleted by the code which created it.
+class recptprotoptr {
+public:
+  recptproto *p;
+
+  recptprotoptr () {p=NULL;}
+  ~recptprotoptr () {}
+};
+
+typedef vector<recptprotoptr> recptprotoptrlist;
+
+
+// contains a list of recptprotos
+class recptprotolistclass {
+protected:
+  recptprotoptrlist recptprotoptrs;
+
+public:
+  // type support for recptprotolistclass
+  typedef recptprotoptrlist::iterator iterator;
+  typedef recptprotoptrlist::const_iterator const_iterator;
+  typedef recptprotoptrlist::reference reference;
+  typedef recptprotoptrlist::const_reference const_reference;
+  typedef recptprotoptrlist::size_type size_type;
+
+  typedef recptprotoptrlist::difference_type difference_type;
+  typedef recptprotoptrlist::const_reverse_iterator const_reverse_iterator;
+  typedef recptprotoptrlist::reverse_iterator reverse_iterator;
+  
+  // basic container support
+  iterator begin () {return recptprotoptrs.begin();}
+  const_iterator begin () const {return recptprotoptrs.begin();}
+  iterator end () {return recptprotoptrs.end();}
+  const_iterator end () const {return recptprotoptrs.end();}
+
+  void erase(iterator pos) {recptprotoptrs.erase(pos);}
+  void erase(iterator first, iterator last) {recptprotoptrs.erase(first, last);}
+  recptprotolistclass &operator=(const recptprotolistclass &x) 
+    {recptprotoptrs=x.recptprotoptrs;return *this;}
+
+  bool empty () const {return recptprotoptrs.empty();}
+  size_type size() const {return recptprotoptrs.size();}
+
+
+  // added functionality
+  void clear () {recptprotoptrs.erase(recptprotoptrs.begin(),recptprotoptrs.end());}
+
+  // therecptproto remains the property of the calling code but
+  // should not be deleted until it is removed from this list.
+  void addrecptproto (recptproto *therecptproto);
+
+  // getrecptproto will return NULL if a recptproto for the given collection
+  // could not be found
+  recptproto *getrecptproto (const text_t &collection, ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/statusaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/statusaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/statusaction.cpp	(revision 21083)
@@ -0,0 +1,1130 @@
+/**********************************************************************
+ *
+ * statusaction.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// following line required to get fstream.filedesc() on darwin (Mac OS X)
+#define _STREAM_COMPAT  1
+
+#include "statusaction.h"
+#include "fileutil.h"
+#include "htmlutils.h"
+#include "gsdltools.h"
+#include <assert.h>
+#include <stdio.h>
+#include <fcntl.h> // for open() stuff
+
+void statusaction::output_frameset (cgiargsclass &/*args*/, displayclass &disp, 
+				    outconvertclass &outconvert, 
+				    ostream &textout, ostream &/*logout*/) {
+  textout << outconvert << disp << "_status:frameset_\n";
+}
+
+void statusaction::output_select (cgiargsclass &/*args*/, displayclass &disp, 
+				  outconvertclass &outconvert, 
+				  ostream &textout, ostream &/*logout*/) {
+  textout << outconvert << disp << "_status:header_(selector)\n"
+    "_status:select_\n"
+    "_status:footer_\n";
+}
+
+void statusaction::output_welcome (cgiargsclass &/*args*/, recptprotolistclass *protos, 
+				   displayclass &disp, outconvertclass &outconvert, 
+				   ostream &textout, ostream &logout) {
+
+  if (recpt == NULL) return;
+
+  textout << outconvert << disp 
+	  << "_status:infoheader_(_titlewelcome_)\n"
+	  << "_status:welcome_"
+	  << "<center><table width=_pagewidth_>\n"
+	  << "<th align=left>abbrev.</th><th align=left>collection</th>"
+	  << "<th align=left>public?</th><th align=left>running?</th></tr>\n";
+
+  recptprotolistclass::iterator rprotolist_here = protos->begin();
+  recptprotolistclass::iterator rprotolist_end = protos->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+      comerror_t err;
+      text_t protoname = (*rprotolist_here).p->get_protocol_name(err);
+      text_tarray collist;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+
+	while (collist_here != collist_end) {
+
+	    textout << outconvert << disp
+		    << "<tr><td><a href=\"_gwcgi_?_optsite_e=_compressedoptions_&a=status&p=collectioninfo&pr="
+		    << protoname
+		    << "&c="
+		    << *collist_here
+		    << "\">"
+		    << *collist_here 
+		    << "</a></td>";
+
+	  ColInfoResponse_t *cinfo = recpt->get_collectinfo_ptr ((*rprotolist_here).p, *collist_here, logout);
+	  if (cinfo != NULL) {
+	    text_t collname = *collist_here;
+	    text_tmap::iterator it = cinfo->collectionmeta.find("collectionname");
+	    if (it != cinfo->collectionmeta.end()) collname = (*it).second;
+
+	    textout << "<td>";
+	    if (cinfo->buildDate > 0)
+	      textout << outconvert << disp 
+		      << "<a href=\"_httppagex_(about)&c=" << *collist_here
+		      << "\" target=\\_top>";
+
+	    textout << outconvert << disp << collname;
+
+	    if (cinfo->buildDate > 0) textout << "</a>";
+
+	    textout << "</td>";
+
+	    if (cinfo->isPublic) textout << "<td>yes</td>";
+	    else textout << "<td>no</td>";
+	    
+	    if (cinfo->buildDate > 0)
+	      textout << outconvert << "<td>yes</td>";
+	    else
+	      textout << "<td>no</td>";
+	    
+	  } else {
+	    textout << "<td></td><td></td><td></td>";
+	  }
+
+	  textout << "</tr>\n";
+	  collist_here ++;
+	}
+      }
+    }
+    rprotolist_here ++;
+  }
+
+  textout << "</table></center>\n";
+  textout << outconvert << disp << "_status:infofooter_\n";
+}
+
+void statusaction::output_generalinfo (cgiargsclass &/*args*/, displayclass &disp, 
+				       outconvertclass &outconvert, 
+				       ostream &textout, ostream &/*logout*/) {
+  if (recpt == NULL) return;
+  const recptconf &rcinfo = recpt->get_configinfo ();
+  
+  textout << outconvert << disp << "_status:infoheader_(General Information)\n";
+  textout << outconvert 
+	  << "<h2>General information</h2>\n"
+	  << "<table>\n"
+	  << "<tr valign=top><th>gsdlhome</th><td>\"" << rcinfo.gsdlhome
+	  << "\"</td></tr>\n"
+	  << "<tr valign=top><th>collection</th><td>\"" << rcinfo.collection
+	  << "\"</td></tr>\n"
+	  << "<tr valign=top><th>collectdir</th><td>\"" << rcinfo.collectdir
+	  << "\"</td></tr>\n"
+	  << "<tr valign=top><th>httpprefix</th><td>\"" << rcinfo.httpprefix
+	  << "\"</td></tr>\n"
+	  << "<tr valign=top><th>httpimg</th><td>\"" << rcinfo.httpimg
+	  << "\"</td></tr>\n"
+	  << "<tr valign=top><th>gwcgi</th><td>\"" << rcinfo.gwcgi
+	  << "\"</td></tr>\n";
+    
+  // macrofiles
+  textout << outconvert << "<tr valign=top><th>macrofiles</th><td>";
+  text_tset::const_iterator macrohere = rcinfo.macrofiles.begin ();
+  text_tset::const_iterator macroend = rcinfo.macrofiles.end ();
+  bool macrofirst = true;
+  while (macrohere != macroend) {
+    if (!macrofirst) textout << outconvert << ", ";
+    macrofirst = false;
+    textout << outconvert << "\"" << *macrohere << "\"";
+    macrohere++;
+  }
+  textout << outconvert << "</td></tr>\n";
+  
+  // saveconf
+  textout << outconvert << "<tr valign=top><th>saveconf</th><td>\"" << rcinfo.saveconf
+	  << "\"</td></tr>\n";
+
+  // usecookies
+  textout << outconvert << "<tr valign=top><th>usecookies</th><td>\"";
+  if (rcinfo.usecookies) textout << outconvert << "true";
+  else textout << outconvert << "false";
+  textout << outconvert << "\"</td></tr>\n";
+  
+  // logcgiargs
+  textout << outconvert << "<tr valign=top><th>logcgiargs</th><td>\"";
+  if (rcinfo.logcgiargs) textout << outconvert << "true";
+  else textout << outconvert << "false";
+  textout << outconvert << "\"</td></tr>\n";
+
+  // pageparams
+  textout << outconvert << "<tr valign=top><th>pageparams</th><td>";
+  text_tmap::const_iterator params_here = rcinfo.pageparams.begin();
+  text_tmap::const_iterator params_end = rcinfo.pageparams.end();
+  bool params_first = true;
+  while (params_here != params_end) {
+    if (!params_first) textout << outconvert << ", ";
+    params_first = false;
+    textout << outconvert << "\"" << (*params_here).first << "\" != \""
+	    << (*params_here).second << "\"";
+    
+    params_here++;
+  }
+  textout << outconvert << "</td></tr>\n";
+
+  // macroprecedence
+  textout << outconvert << "<tr valign=top><th>macroprecedence</th><td>\"" << rcinfo.macroprecedence
+	  << "\"</td></tr>\n";
+
+  // arguments
+  cgiargsinfoclass *rcargsinfo = recpt->get_cgiargsinfo_ptr ();
+  if (rcargsinfo != NULL) {
+    textout << outconvert << "<tr valign=top><th>arguments</th><td>";
+    
+    cgiargsinfoclass::const_iterator argsinfohere = rcargsinfo->begin ();
+    cgiargsinfoclass::const_iterator argsinfoend = rcargsinfo->end ();
+    bool argsinfofirst = true;
+    while (argsinfohere != argsinfoend) {
+      if (!argsinfofirst) textout << outconvert << ", ";
+      argsinfofirst = false;
+      textout << outconvert << "\"" << (*argsinfohere).second.shortname << "\"";
+      argsinfohere++;
+    }
+    
+    textout << outconvert << "</td></tr>\n";
+  }      
+  
+  // actions
+  actionmapclass *actions = recpt->get_actionmap_ptr();
+  if (actions != NULL) {
+    textout << outconvert << "<tr valign=top><th>actions</th><td>";
+    
+    actionptrmap::iterator actionshere = actions->begin ();
+    actionptrmap::iterator actionsend = actions->end ();
+    bool actionsfirst = true;
+    while (actionshere != actionsend) {
+      if (!actionsfirst) textout << outconvert << ", ";
+      actionsfirst = false;
+      assert ((*actionshere).second.a != NULL);
+      if ((*actionshere).second.a != NULL) {
+	textout << outconvert << "\"" << (*actionshere).second.a->get_action_name() << "\"";
+      }
+      actionshere++;
+    }
+    
+    textout << outconvert << "</td></tr>\n";
+  }
+  
+  // browsers
+  browsermapclass *browsers = recpt->get_browsermap_ptr();
+  if (browsers != NULL) {
+    textout << outconvert << "<tr valign=top><th>browsers</th><td>";
+    
+    browserptrmap::iterator browsershere = browsers->begin ();
+    browserptrmap::iterator browsersend = browsers->end ();
+    bool browsersfirst = true;
+    while (browsershere != browsersend) {
+      if (!browsersfirst) textout << outconvert << ", ";
+      browsersfirst = false;
+      assert ((*browsershere).second.b != NULL);
+      if ((*browsershere).second.b != NULL) {
+	textout << outconvert << "\"" << (*browsershere).second.b->get_browser_name() << "\"";
+      }
+      browsershere++;
+    }
+    
+    textout << outconvert << "</td></tr>\n";
+  }
+
+  // protocols
+  recptprotolistclass *protocols = recpt->get_recptprotolist_ptr ();
+  if (protocols != NULL) {
+    textout << outconvert << "<tr valign=top><th>protocols</th><td>";
+    
+    recptprotolistclass::iterator protohere = protocols->begin ();
+    recptprotolistclass::iterator protoend = protocols->end ();
+    bool protofirst = true;
+    while (protohere != protoend) {
+      comerror_t err;
+      if (!protofirst) textout << outconvert << ", ";
+      protofirst = false;
+      if ((*protohere).p != NULL) {
+	textout << outconvert << "\"" << (*protohere).p->get_protocol_name(err) << "\"";
+      }
+      protohere++;
+    }
+    
+    textout << outconvert << "</td></tr>\n";
+  }
+  
+  // converters
+  convertinfoclass *converters = recpt->get_convertinfo_ptr ();
+  if (converters != NULL) {
+    textout << outconvert << "<tr valign=top><th>converters</th><td>";
+    
+    convertinfoclass::iterator converthere = converters->begin ();
+    convertinfoclass::iterator convertend = converters->end ();
+    bool convertfirst = true;
+    while (converthere != convertend) {
+      if (!convertfirst) textout << outconvert << ", ";
+      convertfirst = false;
+      textout << outconvert << "\"" << (*converthere).second.name << "\"";
+      converthere++;
+    }
+    
+    textout << outconvert << "</td></tr>\n";
+  }
+  
+  textout << outconvert << disp << "</table>\n_status:infofooter_\n";
+}
+
+void statusaction::output_argumentinfo (cgiargsclass &args, displayclass &disp, 
+					outconvertclass &outconvert, 
+					ostream &textout, ostream &/*logout*/) {
+  if (recpt == NULL) return;
+  cgiargsinfoclass *rcargsinfo = recpt->get_cgiargsinfo_ptr ();
+  if (rcargsinfo == NULL) return;
+
+  textout << outconvert << disp << "_status:infoheader_(Argument Information)\n";
+  textout << outconvert
+	  << "<h2>Argument information</h2>\n"
+	  << "<table>";
+
+  // argument information
+  textout << outconvert << "<tr valign=top><th>short name</th><th>long name</th>"
+	  << "<th>multiple char?</th>"
+	  << "<th>multiple value?</th>"
+	  << "<th>default</th><th>default status</th><th>saved args</th>"
+	  << "<th>current value</th></tr>\n";
+  
+
+  cgiargsinfoclass::const_iterator argsinfohere = rcargsinfo->begin();
+  cgiargsinfoclass::const_iterator argsinfoend = rcargsinfo->end();
+  text_t *arg_value;
+  while (argsinfohere != argsinfoend) {
+    const cgiarginfo &ainfo = (*argsinfohere).second;
+    textout << outconvert 
+	    << "<tr valign=top><td>" << ainfo.shortname << "</td>\n";
+    
+    textout << outconvert << "<td>" << ainfo.longname << "</td>\n";
+    if (ainfo.multiplechar) textout << outconvert << "<td>yes</td>\n";
+    else textout << outconvert << "<td>no</td>\n";
+    if (ainfo.multiplevalue) textout << outconvert << "<td>yes</td>\n";
+    else textout << outconvert << "<td>no</td>\n";
+    textout << outconvert << "<td>" << ainfo.argdefault << "</td>\n";
+    switch (ainfo.defaultstatus) {
+    case cgiarginfo::none: textout << outconvert << "<td>none</td>\n"; break;
+    case cgiarginfo::weak: textout << outconvert << "<td>weak</td>\n"; break;
+    case cgiarginfo::good: textout << outconvert << "<td>good</td>\n"; break;
+    case cgiarginfo::config: textout << outconvert << "<td>config</td>\n"; break;
+    case cgiarginfo::imperative: textout << outconvert << "<td>imperative</td>\n"; break;
+    }
+    switch (ainfo.savedarginfo) {
+    case cgiarginfo::mustnot: textout << outconvert << "<td>mustnot</td>\n"; break;
+    case cgiarginfo::can: textout << outconvert << "<td>can</td>\n"; break;
+    case cgiarginfo::must: textout << outconvert << "<td>must</td>\n"; break;
+    }
+    
+    arg_value = args.getarg (ainfo.shortname);
+    if (arg_value == NULL) textout << outconvert << "<td></td></tr>\n";
+    else textout << outconvert << "<td>\"" << *arg_value << "\"</td></tr>\n";
+    
+    argsinfohere ++;
+  }
+  
+  textout << outconvert << disp << "</table>\n_status:infofooter_\n";
+}
+
+void statusaction::output_actioninfo (cgiargsclass &/*args*/, displayclass &disp, 
+				      outconvertclass &outconvert, 
+				      ostream &textout, ostream &/*logout*/) {
+  if (recpt == NULL) return;
+  actionmapclass *actions = recpt->get_actionmap_ptr();
+
+  textout << outconvert << disp << "_status:infoheader_(Action Information)\n";
+  textout << outconvert
+	  << "<h2>Action information</h2>\n"
+	  << "<table>";
+
+  // action information
+  if (actions != NULL) {
+    textout << outconvert 
+	    << "<tr><th>action name</th><th>cgi arguments</th></tr>\n";
+	
+    actionptrmap::iterator actionshere = actions->begin ();
+    actionptrmap::iterator actionsend = actions->end ();
+    while (actionshere != actionsend) {
+      assert ((*actionshere).second.a != NULL);
+      if ((*actionshere).second.a != NULL) {
+	textout << outconvert 
+		<< "<tr><td>" << (*actionshere).second.a->get_action_name()
+		<< "</td><td>";
+	
+	cgiargsinfoclass argsinfo = (*actionshere).second.a->getargsinfo();
+	cgiargsinfoclass::const_iterator argsinfohere = argsinfo.begin ();
+	cgiargsinfoclass::const_iterator argsinfoend = argsinfo.end ();
+	bool aifirst = true;
+	while (argsinfohere != argsinfoend) {
+	  if (!aifirst) textout << outconvert << ", ";
+	  aifirst = false;
+	  textout << outconvert << (*argsinfohere).second.shortname;
+	  argsinfohere++;
+	}
+	
+	textout << outconvert << "</td></tr>\n";
+      }
+      actionshere++;
+    }
+  }
+  
+  textout << outconvert << disp << "</table>\n_status:infofooter_\n";
+}
+
+void statusaction::output_browserinfo (cgiargsclass &/*args*/, displayclass &disp, 
+				       outconvertclass &outconvert, 
+				       ostream &textout, ostream &/*logout*/) {
+  if (recpt == NULL) return;
+  browsermapclass *browsers = recpt->get_browsermap_ptr();
+
+  textout << outconvert << disp << "_status:infoheader_(Browser Information)\n";
+  textout << outconvert
+	  << "<h2>Browser information</h2>\n"
+	  << "<table>";
+
+  // browser information
+  if (browsers != NULL) {
+    textout << outconvert 
+	    << "<tr><th>browser name</th><th>default formatstring</th></tr>\n";
+	
+    browserptrmap::iterator browsershere = browsers->begin ();
+    browserptrmap::iterator browsersend = browsers->end ();
+    while (browsershere != browsersend) {
+      assert ((*browsershere).second.b != NULL);
+      if ((*browsershere).second.b != NULL) {
+	textout << outconvert 
+		<< "<tr><td>" << (*browsershere).second.b->get_browser_name()
+		<< "</td><td>" << html_safe ((*browsershere).second.b->get_default_formatstring())
+		<< "</td></tr>\n";
+      }
+      browsershere++;
+    }
+  }
+  
+  textout << outconvert << disp << "</table>\n_status:infofooter_\n";
+}
+
+void statusaction::output_protocolinfo (cgiargsclass &/*args*/, displayclass &disp, 
+					outconvertclass &outconvert, 
+					ostream &textout, ostream &logout) {
+  if (recpt == NULL) return;
+  const recptconf &rcinfo = recpt->get_configinfo ();
+  bool colspecific = !rcinfo.collection.empty();
+  bool unreachablecol = false;
+
+  recptprotolistclass *rprotolist = recpt->get_recptprotolist_ptr ();
+  if (rprotolist == NULL) return;
+
+  textout << outconvert << disp << "_status:infoheader_(Protocol Information)\n";
+  textout << outconvert
+	  << "<h2>Protocol information</h2>\n"
+	  << "<table>\n"
+	  << "<tr><th>protocol</th><th>collections</th></tr>\n";
+
+  text_t protoname;
+  recptprotolistclass::iterator rprotolist_here = rprotolist->begin();
+  recptprotolistclass::iterator rprotolist_end = rprotolist->end();
+  while (rprotolist_here != rprotolist_end) {
+    if ((*rprotolist_here).p != NULL) {
+      comerror_t err;
+      protoname = (*rprotolist_here).p->get_protocol_name(err);
+      textout << outconvert
+	      << "<tr><td>"
+	      << protoname
+	      << "</td><td>";
+
+      text_tarray collist;
+      (*rprotolist_here).p->get_collection_list (collist, err, logout);
+      if (err == noError) {
+	text_tarray::iterator collist_here = collist.begin();
+	text_tarray::iterator collist_end = collist.end();
+	bool first = true;
+	while (collist_here != collist_end) {
+	  if (!first) textout << outconvert << ", ";
+	  first = false;
+
+	  if (colspecific && *collist_here != rcinfo.collection) {
+	    unreachablecol = true;
+	    textout << outconvert << "\"" << *collist_here << "\"";
+	  } else {
+	    textout << outconvert << disp
+		    << "\"<a href=\"_gwcgi_?e=_compressedoptions_&a=status&p=collectioninfo&pr="
+		    << protoname
+		    << "&c="
+		    << *collist_here
+		    << "\">"
+		    << *collist_here 
+		    << "</a>\"";
+	  }
+
+	  collist_here++;
+	}
+
+      } else {
+	textout << outconvert << "Error (" << get_comerror_string (err) 
+		<< ") while getting collect list\n";
+      }
+
+      textout << outconvert 
+	      << "</td></tr>\n";
+    }
+
+    rprotolist_here++;
+  }
+
+  textout << outconvert << "</table>\n";
+  if (unreachablecol) {
+    textout << outconvert 
+	    << "<b>Warning:</b> the receptionist is running in collection specific\n"
+	    << "mode making some of the collections unreachable.\n";
+  }
+  textout << outconvert << disp << "_status:infofooter_\n";
+}
+
+void statusaction::output_collectioninfo (cgiargsclass &args, displayclass &disp, 
+					  outconvertclass &outconvert, 
+					  ostream &textout, ostream &logout) {
+  if (recpt == NULL) return;
+
+  textout << outconvert << disp << "_status:infoheader_(Collection info)\n";
+  textout << outconvert << "<h2>Collection info</h2>\n";
+
+  // get the list of protocols
+  recptprotolistclass *rprotolist = recpt->get_recptprotolist_ptr ();
+  if (rprotolist == NULL) return;
+
+  // look for the desired protocol
+  text_t &arg_pr = args["pr"];
+  text_t &arg_c = args["c"];
+  recptproto *rproto = NULL;
+  recptprotolistclass::iterator rprotolist_here = rprotolist->begin();
+  recptprotolistclass::iterator rprotolist_end = rprotolist->end();
+  while (rprotolist_here != rprotolist_end) {
+    rproto = (*rprotolist_here).p;
+    comerror_t err;
+    if (rproto != NULL && rproto->get_protocol_name(err) == arg_pr) {
+      // see if the protocol has the collection
+      bool hascollection;
+      rproto->has_collection (arg_c, hascollection, err, logout);
+      if (err == noError && hascollection) break;
+    }
+    rprotolist_here++;
+  }
+  
+  if (rprotolist_here == rprotolist_end) {
+    textout << outconvert << "Protocol \"" << arg_pr << "\" with collection \""
+	    << arg_c << "\" was not found\n";
+
+  } else {
+    // rproto can't be NULL to get here
+    ColInfoResponse_t *collectinfo = recpt->get_collectinfo_ptr (rproto, arg_c, logout);
+    if (collectinfo != NULL) {
+      textout << outconvert << "<table>\n"
+	      << "<tr><th>collection name</th><td>\""
+	      << collectinfo->shortInfo.name
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>host</th><td>\""
+	      << collectinfo->shortInfo.host
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>port</th><td>\""
+	      << collectinfo->shortInfo.port
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>is public?</th><td>";
+      if (collectinfo->isPublic) textout << outconvert << "true";
+      else textout << outconvert << "false";
+      textout << outconvert 
+	      << "</td></tr>\n"
+
+	      << "<tr><th>is beta?</th><td>";
+      if (collectinfo->isBeta) textout << outconvert << "true";
+      else textout << outconvert << "false";
+      textout << outconvert 
+	      << "</td></tr>\n"
+
+	      << "<tr><th>build date</th><td>\""
+	      << collectinfo->buildDate
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>interface languages</th><td>";
+      text_tarray::iterator languages_here = collectinfo->languages.begin();
+      text_tarray::iterator languages_end = collectinfo->languages.end();
+      bool languages_first = true;
+      while (languages_here != languages_end) {
+	if (!languages_first) textout << outconvert << ", ";
+	languages_first = false;
+	textout << outconvert << "\"" << *languages_here << "\"";
+	languages_here++;
+      }
+
+      textout << "<tr><th valign=top>collection metadata</th><td><table>\n";
+      text_tmap::iterator meta_here = collectinfo->collectionmeta.begin();
+      text_tmap::iterator meta_end = collectinfo->collectionmeta.end();
+      while (meta_here != meta_end) {
+	textout << outconvert << "<tr><td>" << (*meta_here).first
+		<< "</td><td>" << (*meta_here).second << "</td></tr>\n";
+	meta_here ++;
+      }
+      textout << "</table></td></tr>\n";
+
+      textout << "<tr><th valign=top>format info</th><td><table>\n";
+      text_tmap::iterator format_here = collectinfo->format.begin();
+      text_tmap::iterator format_end = collectinfo->format.end();
+      while (format_here != format_end) {
+	textout << outconvert << "<tr><td>" << (*format_here).first
+		<< "</td><td>" << html_safe((*format_here).second) << "</td></tr>\n";
+	format_here ++;
+      }
+      textout << "</table></td></tr>\n";
+
+      textout << "<tr><th valign=top>building info</th><td><table>\n";
+      text_tmap::iterator building_here = collectinfo->building.begin();
+      text_tmap::iterator building_end = collectinfo->building.end();
+      while (building_here != building_end) {
+	textout << outconvert << "<tr><td>" << (*building_here).first
+		<< "</td><td>" << (*building_here).second << "</td></tr>\n";
+	building_here ++;
+      }
+      textout << "</table></td></tr>\n";
+
+      textout << outconvert 
+	      << "</td></tr>\n"
+
+	      << "<tr><th>number of documents</th><td>\""
+	      << collectinfo->numDocs
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>number of sections</th><td>\""
+	      << collectinfo->numSections
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>number of words</th><td>\""
+	      << collectinfo->numWords
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>number of bytes</th><td>\""
+	      << collectinfo->numBytes
+	      << "\"</td></tr>\n"
+
+	      << "<tr><th>preferred receptionist</th><td>\""
+	      << collectinfo->receptionist
+	      << "\"</td></tr>\n"
+
+	      << "</table>";
+      
+    } else {
+      textout << "ERROR (statusaction::output_collectioninfo): while getting collect information\n";
+    }
+
+
+    InfoFiltersResponse_t filterinfo;
+    InfoFilterOptionsRequest_t filteroptions_request;
+    InfoFilterOptionsResponse_t filteroptions;
+    comerror_t err;
+    rproto->get_filterinfo (arg_c, filterinfo, err, logout);
+    if (err == noError) {
+      text_tset::iterator filternames_here = filterinfo.filterNames.begin();
+      text_tset::iterator filternames_end = filterinfo.filterNames.end();
+      while (filternames_here != filternames_end) {
+	textout << outconvert 
+		<< "<hr>\n"
+		<< "<h3>Filter options for \"" << (*filternames_here) << "\"</h3>\n"
+		<< "<table>\n"
+		<< "<tr><th>option name</th><th>type</th><th>repeatable</th>"
+		<< "<th>default value</th><th>valid values</th></tr>\n";
+
+	filteroptions_request.clear();
+	filteroptions_request.filterName = *filternames_here;
+	rproto->get_filteroptions (arg_c, filteroptions_request,
+				   filteroptions, err, logout);
+	if (err == noError) {
+	  FilterOption_tmap::iterator filteropt_here = 
+	    filteroptions.filterOptions.begin();
+	  FilterOption_tmap::iterator filteropt_end = 
+	    filteroptions.filterOptions.end();
+	  while (filteropt_here != filteropt_end) {
+	    textout << outconvert
+		    << "<tr><td>\""
+		    << (*filteropt_here).second.name
+		    << "\"</td>\n"
+	      
+		    << "<td>";
+	    text_t type_string;
+	    switch ((*filteropt_here).second.type) {
+	    case FilterOption_t::booleant: type_string = "boolean"; break;
+	    case FilterOption_t::integert: type_string = "integer"; break;
+	    case FilterOption_t::enumeratedt: type_string = "enumerated"; break;
+	    case FilterOption_t::stringt: type_string = "string"; break;
+	    }
+	    textout << outconvert
+		    << type_string
+		    << "</td>\n"
+	      
+		    << "<td>";
+	    text_t repeat_string;
+	    switch ((*filteropt_here).second.repeatable) {
+	    case FilterOption_t::onePerQuery: repeat_string = "one per query"; break;
+	    case FilterOption_t::onePerTerm: repeat_string = "one per term"; break;
+	    case FilterOption_t::nPerTerm: repeat_string = "n per term"; break;
+	    }
+	    textout << outconvert
+		    << repeat_string
+		    << "</td>\n"
+	      
+		    << "<td>\""
+		    << (*filteropt_here).second.defaultValue
+		    << "\"</td>\n"
+	      
+		    << "<td>";
+	    
+	    text_tarray::iterator valid_here = 
+	      (*filteropt_here).second.validValues.begin();
+	    text_tarray::iterator valid_end = 
+	      (*filteropt_here).second.validValues.end();
+	    bool valid_first = true;
+	    while (valid_here != valid_end) {
+	      if (!valid_first) textout << outconvert << ", ";
+	      valid_first = false;
+	      textout << outconvert << "\"" << *valid_here << "\"";
+	      valid_here++;
+	    }
+	    textout << outconvert
+		    << "</td></tr>\n";
+
+	    filteropt_here++;
+	  }
+
+	  textout << outconvert
+		  << "</table>\n";
+
+	} else {
+	  textout << outconvert << "Error (" << get_comerror_string (err) 
+		  << ") while getting filter option information\n";
+	}
+
+	filternames_here++;
+      }
+
+    } else {
+      textout << outconvert << "Error (" << get_comerror_string (err) 
+	      << ") while getting filter information\n";
+    }
+  }
+  
+  textout << outconvert << disp << "_status:infofooter_\n";
+}
+
+void statusaction::output_usagelog (cgiargsclass &/*args*/, displayclass &disp,
+				    outconvertclass &outconvert, 
+				    ostream &textout, ostream &/*logout*/) {
+
+  // output last 100 lines of usage.txt
+
+  text_t logfilename = filename_cat (gsdlhome, "etc", "usage.txt");
+
+  textout << outconvert << disp << "_status:infoheader_(Usage log)\n";
+  textout << outconvert << "<h2>Usage log</h2>\n";
+
+  textout << outconvert << "<p>The usage log, "
+	  << logfilename << ", contains the\n"
+	  << "following information:\n"
+	  << "<p>(note that if this file is more than 100 lines long only the last 100 lines will\n"
+	  << "be displayed on this page)\n\n"
+	  << "<pre>\n";
+
+  // note that we're expecting lines to be no more than 1500 characters on
+  // average - should fix this file_tail() thing sometime
+  textout << outconvert << file_tail (logfilename, 100, 1500);
+
+  textout << outconvert << disp << "</pre>\n"
+	  << "_status:infofooter_\n";
+}
+
+void statusaction::output_errorlog (cgiargsclass &/*args*/, displayclass &disp, 
+				    outconvertclass &outconvert, 
+				    ostream &textout, ostream &logout) {
+
+  text_t errfilename = filename_cat (gsdlhome, "etc", "error.txt");
+  char *cerrfilename = errfilename.getcstr();
+  if (cerrfilename == NULL) return;
+
+  textout << outconvert << disp << "_status:infoheader_(Error log)\n";
+  textout << outconvert << "<h2>Error log</h2>\n";
+  logout << flush;
+
+#ifdef GSDL_USE_IOS_H
+  ifstream errin (cerrfilename, ios::in | ios::nocreate);
+#else
+  ifstream errin (cerrfilename, ios::in);
+#endif
+
+  delete cerrfilename;
+  if (errin) {
+    textout << outconvert << "<p>The error log, "
+		<< errfilename << ", contains the\n";
+    textout << outconvert << "following information:\n\n";
+    text_t errorpage = "<p><pre>\n";
+
+    char c;
+    errin.get(c);
+    while (!errin.eof ()) {
+      errorpage.push_back(c);
+      errin.get(c);
+    }
+    
+    errorpage += "</pre>\n";
+    errin.close();
+    textout << outconvert << errorpage;
+
+  } else {
+    textout << outconvert << "Couldn't read error log, " 
+		<< errfilename << ".\n";
+  }
+
+  textout << outconvert << disp << "_status:infofooter_\n";
+}
+
+void statusaction::output_gsdlsite (cgiargsclass &/*args*/, displayclass &disp, 
+				    outconvertclass &outconvert, 
+				    ostream &textout, ostream &logout) {
+
+  textout << outconvert << disp << "_status:infoheader_(gsdlsite.cfg)\n";
+  textout << outconvert << "<h2>gsdlsite.cfg</h2>\n";
+  logout << flush;
+
+#ifdef GSDL_LOCAL_LIBRARY
+  text_t gsdlsite_cfg = filename_cat (gsdlhome, "gsdlsite.cfg");
+#else
+  text_t gsdlsite_cfg = "gsdlsite.cfg";
+#endif
+
+  char *gsdlsite_cfgc = gsdlsite_cfg.getcstr();
+#ifdef GSDL_USE_IOS_H
+  ifstream gsdlsitein (gsdlsite_cfgc, ios::in | ios::nocreate);
+#else
+  ifstream gsdlsitein (gsdlsite_cfgc, ios::in);
+#endif
+
+  delete gsdlsite_cfgc;
+
+  if (gsdlsitein) {
+    textout << "<p>The gsdlsite.cfg configuration file contains the\n"
+	    << "following information:\n\n";
+    text_t gsdlsite = "<p><pre>\n";
+
+    char c;
+    gsdlsitein.get(c);
+    while (!gsdlsitein.eof ()) {
+      gsdlsite.push_back(c);
+      gsdlsitein.get(c);
+    }
+    
+    gsdlsite += "</pre>\n";
+    gsdlsitein.close();
+    textout << outconvert << gsdlsite;
+
+  } else {
+    textout << "Couldn't read gsdlsite.cfg configuration file\n";
+  }
+
+  textout << outconvert << disp << "_status:infofooter_\n";
+}
+
+void statusaction::output_maincfg (cgiargsclass &/*args*/, displayclass &disp, 
+				   outconvertclass &outconvert, 
+				   ostream &textout, ostream &/*logout*/) {
+
+  text_t maincfgfile = filename_cat (gdbmhome, "etc", "main.cfg");
+
+  textout << outconvert << disp << "_status:infoheader_(main.cfg)\n"
+	  << "<h2>main.cfg</h2>\n"
+	  << "<p>The main configuration file, "
+	  << dm_safe(maincfgfile) << ", contains the following information:<br>\n\n"
+	  << "(Note that only users belonging to the \"administrator\" group "
+	  << "may edit this file)<br>\n"
+	  << "_status:maincfg_<br>\n"
+	  << "_status:infofooter_\n";
+}
+
+void statusaction::change_maincfg (cgiargsclass &args, displayclass &disp, 
+				   outconvertclass &outconvert, 
+				   ostream &textout, ostream &logout) {
+
+  // write out the contents of the cfgfile argument to main.cfg
+  text_t cfgfile = filename_cat(gsdlhome, "etc", "main.cfg");
+  char *cfgfilec = cfgfile.getcstr();
+
+  int fd=open(cfgfilec, O_WRONLY | O_CREAT | O_TRUNC
+#if defined(__WIN32__)
+	      | O_BINARY
+#endif
+	      );
+
+  if (fd != -1) {
+
+    int lock_val = 1;
+    GSDL_LOCK_FILE (fd);
+    if (lock_val != 0) {
+      logout << "statusaction::change_maincfg: Error: Couldn't lock file " << cfgfilec << "\n";
+      textout << outconvert << disp << "_status:changemaincfgfail_";
+      close (fd);
+    } else {
+      outconvertclass text_t2ascii;
+      text_t2ascii.setinput(&args["cfgfile"]);
+      size_t buffersize=args["cfgfile"].size();
+      char *buffer=new char[buffersize];
+      size_t num_chars;
+      convertclass::status_t status;
+      text_t2ascii.convert(buffer, buffersize, num_chars, status);
+      // ignore status - assume it is "finished" as buffer is big enough
+      write(fd, buffer, num_chars);
+      GSDL_UNLOCK_FILE (fd);
+      delete buffer;
+      close (fd);
+      textout << outconvert << disp << "_status:changemaincfgsuccess_";
+    }
+  } else {
+    logout << "statusaction::change_maincfg: Error: Couldn't open file " << cfgfilec << "for writing\n";
+    textout << outconvert << disp << "_status:changemaincfgfail_";
+  }
+  delete cfgfilec;
+}
+
+void statusaction::output_errorpage (outconvertclass &outconvert, 
+				     ostream &textout, ostream &/*logout*/,
+				     text_t message) {
+  textout << outconvert 
+	  << "<html>\n"
+	  << "<head>\n"
+	  << "<title>Error</title>\n"
+	  << "</head>\n"
+	  << "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#006666\" "
+	  << "alink=\"#cc9900\" vlink=\"#666633\">\n"
+	  << "<h2>Oops!</h2>\n" 
+	  << message
+	  << "\n</body>\n"
+	  << "</html>\n";
+  return;
+}
+
+
+
+statusaction::statusaction () {
+  disabled = true;
+  recpt = NULL;
+
+  // this action uses cgi variable "a"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "status";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "p" -- status page
+  arg_ainfo.shortname = "p";
+  arg_ainfo.longname = "page";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "frameset";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "pr" -- protocol
+  arg_ainfo.shortname = "pr";
+  arg_ainfo.longname = "protocol";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::none;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::can;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  arg_ainfo.shortname = "cfgfile";
+  arg_ainfo.longname = "configuration file contents";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+statusaction::~statusaction () {
+}
+
+bool statusaction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &args, 
+				  ostream &/*logout*/) {
+
+  // only users belonging to the "administrator" group may edit 
+  // the main.cfg file
+  if (args["p"] == "maincfg" || args["p"] == "changemaincfg") {
+    args["uan"] = "1";
+    args["ug"] = "administrator";
+  }
+  return true;
+}
+
+void statusaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				     response_t &response, text_t &response_data, 
+				     ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+
+void statusaction::define_internal_macros (displayclass &disp, cgiargsclass &args, 
+					   recptprotolistclass * /*protos*/, ostream &logout) {
+
+  // define_internal_macros sets the following macros:
+  // _maincfgfile_   the contents of the main.cfg configuration file
+
+  // _versionnnum_   greenstone version number (hard-coded)
+
+  disp.setmacro("versionnum", "status", GSDL_VERSION);
+
+  if (args["p"] == "maincfg") {
+
+    // read in main.cfg
+    text_t maincfg = filename_cat(gsdlhome, "etc", "main.cfg");  
+    char *maincfgc = maincfg.getcstr();
+    
+#ifdef GSDL_USE_IOS_H
+    ifstream cfg_ifs (maincfgc, ios::in | ios::nocreate);
+#else
+    ifstream cfg_ifs (maincfgc, ios::in);
+#endif
+    
+    if (cfg_ifs) {  
+      text_t cfgtext;
+      char c;
+      cfg_ifs.get(c);
+      while (!cfg_ifs.eof ()) {
+	cfgtext.push_back(c);
+	cfg_ifs.get(c);
+      }
+      cfg_ifs.close();
+      
+      // define it as a macro
+      disp.setmacro("maincfgfile", "status", dm_safe(cfgtext));
+      
+    } else {
+      logout << "statusaction::define_internal_macros: couldn't open configuration file (" 
+	     << maincfgc << ") for reading\n";
+      disp.setmacro("maincfgfile", "status", "");
+    }    
+    delete maincfgc;
+  }
+}
+
+bool statusaction::do_action (cgiargsclass &args, recptprotolistclass *protos, 
+			      browsermapclass * /*browsers*/, displayclass &disp, 
+			      outconvertclass &outconvert, ostream &textout, 
+			      ostream &logout) {
+  // make sure the status function is enabled
+  if (disabled) {
+    textout << outconvert 
+	    << "<html>\n"
+	    << "<head>\n"
+	    << "<title>Status disabled</title>\n"
+	    << "</head>\n"
+	    << "<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#006666\" "
+	    << "alink=\"#cc9900\" vlink=\"#666633\">\n"
+	    << "<h2>Facility disabled</h2>\n" 
+	    << "Sorry, the Maintenance and Administration facility is currently disabled\n"
+	    << "\n</body>\n"
+	    << "</html>\n";
+    return true;
+  }
+  
+  // make sure we know about a receptionist
+  if (recpt == NULL) {
+    output_errorpage (outconvert, textout, logout, 
+		      "The status action does not contain information\n"
+		      "about any receptionists. The method set_receptionist\n"
+		      "was probably not called from the module which instantiated\n"
+		      "this status action.\n");
+    return true;
+  }
+
+  // check to make sure status.dm was read in
+  const recptconf &rcinfo = recpt->get_configinfo ();
+  text_tset::const_iterator macrohere = rcinfo.macrofiles.begin ();
+  text_tset::const_iterator macroend = rcinfo.macrofiles.end ();
+  while (macrohere != macroend) {
+    if (*macrohere == "status.dm") break;
+    macrohere++;
+  }
+  if (macrohere == macroend) {
+    output_errorpage (outconvert, textout, logout, 
+		      "The status.dm file was not read in. This macro file is\n" 
+		      "needed to display configuration and status information.\n");
+    return true;
+  }
+
+  // output the required status page
+  text_t &arg_p = args["p"];
+  if (arg_p == "frameset") output_frameset (args, disp, outconvert, textout, logout);
+  else if (arg_p == "select") output_select (args, disp, outconvert, textout, logout);
+  else if (arg_p == "welcome") output_welcome (args, protos, disp, outconvert, textout, logout);
+  else if (arg_p == "generalinfo") output_generalinfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "argumentinfo") output_argumentinfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "actioninfo") output_actioninfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "browserinfo") output_browserinfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "protocolinfo") output_protocolinfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "collectioninfo") output_collectioninfo (args, disp, outconvert, textout, logout);
+  else if (arg_p == "usagelog") output_usagelog (args, disp, outconvert, textout, logout);
+  else if (arg_p == "errorlog") output_errorlog (args, disp, outconvert, textout, logout);
+  else if (arg_p == "gsdlsite") output_gsdlsite (args, disp, outconvert, textout, logout);
+  else if (arg_p == "maincfg") output_maincfg (args, disp, outconvert, textout, logout);
+  else if (arg_p == "changemaincfg") change_maincfg (args, disp, outconvert, textout, logout);
+  else {
+    output_errorpage (outconvert, textout, logout, 
+		      "Unknown page \"" + arg_p + "\".\n");
+  }
+
+  return true;
+}
+
+void statusaction::configure (const text_t &key, const text_tarray &cfgline) {
+  if ((key == "status") && (cfgline.size() == 1) && 
+      (cfgline[0] == "true" || cfgline[0] == "on" || cfgline[0] == "enabled")) {
+    disabled = false;
+  } else {
+    // call the parent class to deal with the things which
+    // are not dealt with here
+    action::configure (key, cfgline);
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/statusaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/statusaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/statusaction.h	(revision 21083)
@@ -0,0 +1,129 @@
+/**********************************************************************
+ *
+ * statusaction.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef STATUSACTION_H
+#define STATUSACTION_H
+
+
+#include "gsdlconf.h"
+#include "action.h"
+#include "receptionist.h"
+
+
+class statusaction : public action {
+protected:
+  bool disabled;
+  receptionist *recpt;
+
+  void output_frameset (cgiargsclass &args, displayclass &disp, 
+			outconvertclass &outconvert, 
+			ostream &textout, ostream &logout);
+
+  void output_select (cgiargsclass &args, displayclass &disp, 
+		      outconvertclass &outconvert, 
+		      ostream &textout, ostream &logout);
+
+  void output_welcome (cgiargsclass &args, recptprotolistclass *protos,
+		       displayclass &disp, outconvertclass &outconvert, 
+		       ostream &textout, ostream &logout);
+
+  void output_generalinfo (cgiargsclass &args, displayclass &disp, 
+			   outconvertclass &outconvert, 
+			   ostream &textout, ostream &logout);
+
+  void output_argumentinfo (cgiargsclass &args, displayclass &disp, 
+			    outconvertclass &outconvert, 
+			    ostream &textout, ostream &logout);
+
+  void output_actioninfo (cgiargsclass &args, displayclass &disp, 
+			  outconvertclass &outconvert, 
+			  ostream &textout, ostream &logout);
+
+  void output_browserinfo (cgiargsclass &args, displayclass &disp, 
+			   outconvertclass &outconvert, 
+			   ostream &textout, ostream &logout);
+
+  void output_protocolinfo (cgiargsclass &args, displayclass &disp, 
+			    outconvertclass &outconvert, 
+			    ostream &textout, ostream &logout);
+
+  void output_collectioninfo (cgiargsclass &args, displayclass &disp, 
+			      outconvertclass &outconvert, 
+			      ostream &textout, ostream &logout);
+
+  void output_usagelog (cgiargsclass &args, displayclass &disp,
+			outconvertclass &outconvert, 
+			ostream &textout, ostream &logout);
+
+  void output_errorlog (cgiargsclass &args, displayclass &disp, 
+			outconvertclass &outconvert, 
+			ostream &textout, ostream &logout);
+
+  void output_gsdlsite (cgiargsclass &args, displayclass &disp, 
+			outconvertclass &outconvert, 
+			ostream &textout, ostream &logout);
+
+  void output_maincfg (cgiargsclass &args, displayclass &disp, 
+		       outconvertclass &outconvert, 
+		       ostream &textout, ostream &logout);
+
+  void change_maincfg (cgiargsclass &args, displayclass &disp, 
+		       outconvertclass &outconvert, 
+		       ostream &textout, ostream &logout);
+
+  void output_errorpage (outconvertclass &outconvert, 
+			 ostream &textout, ostream &logout,
+			 text_t message);
+
+public:
+  statusaction ();
+  virtual ~statusaction ();
+
+  text_t get_action_name () {return "status";}
+
+  void set_receptionist (receptionist *therecpt) {recpt=therecpt;}
+
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+
+
+  void define_internal_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/summarise.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/summarise.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/summarise.cpp	(revision 21083)
@@ -0,0 +1,270 @@
+/**********************************************************************
+ *
+ * summarise.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+/* The function 'summarise' produces, given a document text and a query,
+ * a (query-biased) summary. In the future, several types of summaries will
+ * be supported.
+ */
+
+#include "summarise.h"
+#include "unitool.h"
+#include <string.h>
+
+
+/* **************** LOCAL PROTOTYPES **************** */
+
+text_t summarise_startend(text_t &htmlstr, int summaryLength);
+text_t summarise_keywords(text_t &htmlstr, text_t &query, int summaryLength);
+
+text_t next_sentence(text_t::iterator& start, text_t::iterator& end);
+text_t previous_sentence(text_t::iterator& start, text_t::iterator& end);
+bool paragraph_tag(text_t::iterator start);
+
+
+/****************************************************
+ NAME: summarise
+ DESC: produce a summary for a document
+*****************************************************/
+
+text_t summarise(text_t &htmlstr, text_t &query, int summaryLength) {
+  //  return summarise_startend(htmlstr,summaryLength);
+  return summarise_keywords(htmlstr,query,summaryLength);
+}
+
+
+/****************************************************
+ NAME: summarise_startend
+ DESC: return first and last sentences of a document
+*****************************************************/
+
+text_t summarise_startend(text_t &htmlstr, int summaryLength) {
+  text_t::iterator str_start = htmlstr.begin(), str_end = htmlstr.end();
+  text_t answer;
+
+  // add first sentences up to half the summary length
+
+  text_t::iterator str_current = str_start;
+  while(str_current<str_end && answer.size()<(summaryLength/2)) {
+    text_t sentence = next_sentence(str_current,str_end);
+    answer.append(sentence);
+  }
+
+  summaryLength -= answer.size(); // summary length left for last sentences
+  if(summaryLength<0)
+    summaryLength = 0;
+
+  str_end = str_current;
+  str_current = htmlstr.end()-1;
+  text_t lastSentence;
+  while(str_current>str_end && 
+        lastSentence.size()<summaryLength) {
+    text_t sentence = previous_sentence(str_current,str_end);
+    lastSentence = sentence + lastSentence;
+  }
+
+  answer += " ... ";
+  answer += lastSentence;
+
+  return answer;
+}
+
+
+/****************************************************
+ NAME: summarise_keywords
+ DESC: build a summary with sentences containing keyword(s).
+       the sentences with most matching keywords are returned 
+       first.
+*****************************************************/
+
+text_t summarise_keywords(text_t &htmlstr, text_t &query, int summaryLength) {
+
+  text_tarray allterms, terms;
+  splitchar(query.begin(),query.end(),' ',allterms);
+
+  // consider only non-empty terms
+  for(text_tarray::iterator term = allterms.begin();
+      term < allterms.end(); term++) {
+    if(!(*term).empty())
+      terms.push_back(*term);
+  }
+
+  text_tarray::iterator terms_start = terms.begin(), terms_end = terms.end();
+
+  //text_tarray::iterator terms_current = terms_start;
+  //strstr("merde",*terms_current);
+
+  text_t::iterator str_start = htmlstr.begin(), str_end = htmlstr.end();
+
+  vector<text_tarray> answers(terms.size()); 
+    // an array of array of sentences for the summary:
+    //   answers[0] contains sentences with 1 keyword
+    //   answers[1] contains sentences with 2 keywords, etc.
+  vector<int> answersSize(terms.size());
+    // answersSize[0] is the combined size of sentences with 1 keyword, etc.
+  for(vector<int>::iterator size = answersSize.begin();
+      size<answersSize.end(); size++)
+    *size = 0; // initialise sentence size
+
+  int totfound  = 0;
+  text_t::iterator str_current = str_start;
+  while(str_current<str_end && answersSize[terms.size()-1]<summaryLength) {
+    // if the size of best sentences is greater than summary, that's enough!
+    text_t sentence = next_sentence(str_current,str_end);
+
+    text_tarray::iterator terms_current = terms_start;
+    int nFound = 0;
+    while(terms_current!=terms_end) {
+      text_t::iterator word = findword(sentence.begin(),sentence.end(),
+				       *terms_current);
+      if(word!=sentence.end())
+	{        nFound++; totfound++; }
+      terms_current++;
+    }
+
+    if(nFound>0 && answersSize[nFound-1]<summaryLength) {
+      answers[nFound-1].push_back(sentence);
+      answersSize[nFound-1] += sentence.size();
+    }
+  }
+
+  text_t answer;
+  for(vector<text_tarray>::iterator sentarray = answers.end()-1;
+      sentarray>=answers.begin(); sentarray--)
+    for(text_tarray::iterator sentence = (*sentarray).begin(); 
+        sentence < (*sentarray).end(); sentence++) {
+      answer.append(*sentence);
+      if(answer.size()>=summaryLength)
+        return answer;
+    }
+
+  if(!answer.empty())
+    return answer;
+
+  return summarise_startend(htmlstr,summaryLength);
+}
+
+
+/* *********************** LOCAL FUNCTIONS ******************* */
+
+/* NAME: next_sentence
+   DESC: returns next sentence, text-only (ie. HTML markup is removed)
+ */
+
+text_t next_sentence(text_t::iterator& start, text_t::iterator& end) {
+  text_t sentence;                 // the sentence to be returned
+  bool   foundPunctuation = false; // set to true by '.', '!' or '?'
+  while(start<end && !foundPunctuation) {
+    switch (*start) {
+    case '<': // skip over rest of html tag
+      if(paragraph_tag(start) && has_unicode_letdig(sentence))
+        foundPunctuation = true;
+      while ((start<end) && (*start!='>'))
+	start++;
+      if(start<end) start++;
+      break;
+    case '.':
+    case '!':
+    case '?':
+      sentence.push_back(*start);
+      start++;
+      if(start>=end || 
+         (is_unicode_space(*start) && (*(start-2)<'A' || *(start-2)>'Z'))) {
+        foundPunctuation = true;
+      }
+      break;
+    default:
+      sentence.push_back(*start);
+      start++;
+      break;
+    }
+  }
+  return sentence;
+}
+
+
+/* NAME: previous_sentence
+   DESC: returns previous sentence, text-only (ie. HTML markup is removed)
+ */
+
+text_t previous_sentence(text_t::iterator& start, text_t::iterator& end) {
+  text_t sentence;                    // the sentence to be returned
+  bool   found1stPunctuation = false, // set to true by '.', '!' or '?'
+                                      // first punct. is included in results
+         found2ndPunctuation = false; // second punct. is stop condition,
+                                      // and is not included in results
+  while(start>end && !found2ndPunctuation) {
+    switch (*start) {
+    case '>': // skip over rest of html tag
+      while ((start>end) && (*start!='<')) // backtrack to beginning of tag
+	start--;
+      if(start>end) {
+        if(paragraph_tag(start) && has_unicode_letdig(sentence))
+          found2ndPunctuation = true;
+        start--;
+      }
+      break;
+    case '.':
+    case '!':
+    case '?':
+      if(!is_unicode_space(*(start+1)) ||
+         (start-1>end && *(start-1)>='A' && *(start-1)<='Z')) {
+        // if next character is not a blank, or preceding character is
+	// a capital letter, we guess it's an acronym (e.g. "U.S.A.")
+        sentence.text_as_usvector().insert(sentence.text_as_usvector().begin(),
+          start,start+1);
+        start--;
+      } else
+        if(has_unicode_letdig(sentence) || found1stPunctuation)
+          found2ndPunctuation = true;
+        else {
+          sentence.text_as_usvector().insert(
+              sentence.text_as_usvector().begin(),start,start+1);
+          start--;
+          found1stPunctuation = true;
+        }
+      break;
+    default:
+      sentence.text_as_usvector().insert(
+        sentence.text_as_usvector().begin(),start,start+1);
+      start--;
+      break;
+    }
+  }
+  return sentence;
+}
+
+
+// start is positioned on the '<'
+bool paragraph_tag(text_t::iterator start) {
+  if(*start=='<') {
+    start++;
+    if(*start=='p' || *start=='P') {
+      start++;
+      if(is_unicode_space(*start) || *start=='>')
+        return true;
+    }
+  }
+  return false;
+}
Index: /main/tags/2.38/gsdl/src/recpt/summarise.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/summarise.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/summarise.h	(revision 21083)
@@ -0,0 +1,34 @@
+/**********************************************************************
+ *
+ * summarise.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef SUMMARISE_H
+#define SUMMARISE_H
+
+#include "text_t.h"
+
+text_t summarise(text_t &htmlstr, text_t &query, int summaryLength);
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/tipaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/tipaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/tipaction.cpp	(revision 21083)
@@ -0,0 +1,66 @@
+/**********************************************************************
+ *
+ * tipaction.cpp -- define random tip macros
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "tipaction.h"
+#include <stdlib.h>
+
+
+tipaction::tipaction () {
+  // "st" show tips - "0"=no, "1"=yes
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "st";
+  arg_ainfo.longname = "show tips";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "1";
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+void tipaction::define_external_macros (displayclass &disp, cgiargsclass &args, 
+					recptprotolistclass * /*protos*/, ostream &logout) {
+
+  // define_external_macros sets the following macros:
+
+  // _tip:thistip_  - a random tip (defined if st == "1")
+
+  if (args["st"].getint()) {
+    // get the maximum tip number (_tip:tipmax_)
+    text_t tipmax_str;
+    disp.expandstring ("tip", "_tipmax_", tipmax_str);
+    if (tipmax_str.empty()) {
+      logout << "Warning: _tip:tipmax_ not set. This macro is needed for displaying tips.\n";
+      return;
+    }
+    
+    int tipmax = tipmax_str.getint();
+    if (tipmax < 1) {
+      logout << "Warning: _tip:tipmax_ was less than 1. No tips were set.\n";
+      return;
+    }
+    
+    disp.setmacro("thistip", "tip", "_tip" + text_t((rand()%tipmax) + 1) + "_");
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/tipaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/tipaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/tipaction.h	(revision 21083)
@@ -0,0 +1,46 @@
+/**********************************************************************
+ *
+ * tipaction.h -- define tip macros
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef TIPACTION_H
+#define TIPACTION_H
+
+#include "gsdlconf.h"
+#include "action.h"
+
+
+// tipaction exists just for the benefit of defining external macros
+class tipaction : public action {
+public:
+  tipaction ();
+  virtual ~tipaction () {}
+  text_t get_action_name () {return "tip";}
+  
+  void define_external_macros (displayclass &disp, cgiargsclass &args, 
+			       recptprotolistclass *protos, ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/userdb.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/userdb.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/userdb.cpp	(revision 21083)
@@ -0,0 +1,376 @@
+/**********************************************************************
+ *
+ * userdb.cpp -- functions to handle a user database
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "gsdlconf.h"
+#include "userdb.h"
+#include "gsdltimes.h"
+#include "fileutil.h"
+#include <stdlib.h>
+
+// include crypt
+#if defined(__WIN32__)
+#include "crypt.h"
+#else
+#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#else 
+#include <unistd.h>
+#endif
+#endif
+
+
+// few useful functions
+
+text_t crypt_text (const text_t &text) {
+  static const char *salt = "Tp";
+  text_t crypt_password;
+
+  if (text.empty()) return "";
+
+  // encrypt the password
+  char *text_cstr = text.getcstr();
+  if (text_cstr == NULL) return "";
+  crypt_password = crypt(text_cstr, salt);
+  delete text_cstr;
+
+  return crypt_password;
+}
+
+
+// username_ok tests to make sure a username is ok. a username
+// must be at least 2 characters long, but no longer than 30
+// characters long. it can contain the characters a-z A-Z 0-9
+// . and _
+bool username_ok (const text_t &username) {
+  if (username.size() < 2 || username.size() > 30) return false;
+
+  text_t::const_iterator here = username.begin();
+  text_t::const_iterator end = username.end();
+  while (here != end) {
+    if ((*here >= 'a' && *here <= 'z') ||
+	(*here >= 'A' && *here <= 'Z') ||
+	(*here >= '0' && *here <= '9') ||
+	*here == '.' ||
+	*here == '_') {
+      // ok
+    } else return false;
+    here++;
+  }
+
+  return true;
+}
+
+// password_ok tests to make sure a password is ok. a password
+// must be at least 3 characters long but no longer than 8 characters
+// long. it can contain any character in the range 0x20-0x7e
+bool password_ok (const text_t &password) {
+  if (password.size() < 3 || password.size() > 8) return false;
+
+  text_t::const_iterator here = password.begin();
+  text_t::const_iterator end = password.end();
+  while (here != end) {
+    if (*here >= 0x20 && *here <= 0x7e) {
+      // ok
+    } else return false;
+    here++;
+  }
+
+  return true;
+}
+
+
+
+
+/////////////
+// userinfo_t
+/////////////
+
+void userinfo_t::clear () {
+  username.clear();
+  password.clear();
+  enabled = false;
+  groups.clear();
+  comment.clear();
+}
+
+userinfo_t &userinfo_t::operator=(const userinfo_t &x) {
+  username = x.username;
+  password = x.password;
+  enabled = x.enabled;
+  groups = x.groups;
+  comment = x.comment;
+  
+  return *this;
+}
+
+
+
+// functions dealing with user databases
+
+// returns true on success (in which case userinfo will contain
+// the information for this user)
+bool get_user_info (gdbmclass &userdb, const text_t &username,
+		    userinfo_t &userinfo) {
+  userinfo.clear();
+  
+  infodbclass info;
+  if (userdb.getinfo (username, info)) {
+    userinfo.username = info["username"];
+    userinfo.password = info["password"];
+    userinfo.enabled = (info["enabled"] == "true");
+    userinfo.groups = info["groups"];
+    userinfo.comment = info["comment"];
+    return true;
+  }
+
+  return false;
+}
+
+bool get_user_info (const text_t &userdbfile, const text_t &username,
+		    userinfo_t &userinfo) {
+  gdbmclass userdb;
+  if (!userdb.opendatabase(userdbfile, GDBM_READER, 1000, true)) {
+/*    if (!userdbfile.empty() && !file_exists (userdbfile) &&
+	username == "admin") {*/
+    if (!userdbfile.empty() && username == "admin") {
+      // no database -- create a database with an initial account
+      userinfo.clear();
+      userinfo.username = "admin";
+      userinfo.password = crypt_text("admin");
+      userinfo.enabled = true;
+      userinfo.groups = "administrator,colbuilder";
+      userinfo.comment = "change the password for this account as soon as possible";
+      return set_user_info (userdbfile, username, userinfo);
+    }
+    return false;
+  }
+
+  bool success = get_user_info (userdb, username, userinfo);
+  userdb.closedatabase();
+
+  return success;
+}
+
+// returns true on success
+bool set_user_info (gdbmclass &userdb, const text_t &username,
+		    const userinfo_t &userinfo) {
+  infodbclass info;
+  info["username"] = userinfo.username;
+  info["password"] = userinfo.password;
+  info["enabled"] = userinfo.enabled ? "true" : "false";
+  info["groups"] = userinfo.groups;
+  info["comment"] = userinfo.comment;
+
+  return userdb.setinfo (username, info);
+}
+
+bool set_user_info (const text_t &userdbfile, const text_t &username,
+		    const userinfo_t &userinfo) {
+  gdbmclass userdb;
+  if (!userdb.opendatabase(userdbfile, GDBM_WRCREAT, 1000, true)) return false;
+
+  bool success = set_user_info (userdb, username, userinfo);
+  userdb.closedatabase();
+
+  return success;
+}
+
+// removes a user from the user database -- forever
+void delete_user (gdbmclass &userdb, const text_t &username) {
+  userdb.deletekey (username);
+}
+
+void delete_user (const text_t &userdbfile, const text_t &username) {
+  gdbmclass userdb;
+  if (!userdb.opendatabase(userdbfile, GDBM_WRCREAT, 1000, true)) return;
+
+  delete_user (userdb, username);
+  userdb.closedatabase();
+}
+
+// gets a list of all the users in the database. returns true
+// on success
+void get_user_list (gdbmclass &userdb, text_tarray &userlist) {
+  userlist.erase (userlist.begin(), userlist.end());
+  
+  text_t user = userdb.getfirstkey ();
+  while (!user.empty()) {
+    userlist.push_back(user);
+    user = userdb.getnextkey (user);
+  }
+}
+
+// returns true if the user's password is correct.
+bool check_passwd (const userinfo_t &thisuser, const text_t &password) {
+  // couple of basic checks
+  if (thisuser.username.empty() || thisuser.password.empty() ||
+      password.empty()) return false;
+
+  text_t crypt_password = crypt_text(password);
+  return (thisuser.password == crypt_password);
+}
+
+// removes spaces from user groups
+text_t format_user_groups(const text_t user_groups){
+
+  text_t new_groups = "";
+  text_t::const_iterator here = user_groups.begin();
+  text_t::const_iterator end = user_groups.end();
+  while (here != end) {
+    if (*here != ' '&& *here != '\t' && *here != '\n') {
+      new_groups.push_back(*here);
+    }
+    here++;
+  }
+  return new_groups;
+}
+
+// functions dealing with databases of temporary keys
+
+// generates a random key for the user, stores it in the database and
+// returns it so that it can be used in page generation
+// returns "" on failure
+text_t generate_key (gdbmclass &keydb, const text_t &username) {
+  static const char *numconvert = "0123456789abcdefghijklmnopqrstuvwxyz"
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+  // loop looking for a suitable new key
+  text_t userkey;
+  text_t crypt_userkey;
+  do {
+    // convert to base 62 :-)
+    int userkey_int = rand ();
+    while (userkey_int > 0) {
+      userkey.push_back (numconvert[userkey_int%62]);
+      userkey_int /= 62;
+    }
+
+    // make sure this key is not in the database
+    crypt_userkey = crypt_text(userkey);
+    if (keydb.exists (crypt_userkey)) userkey.clear();
+  } while (userkey.empty());
+
+  // enter the key into the database
+  infodbclass keydata;
+  keydata["user"] = username;
+  keydata["time"] = time2text(time(NULL));
+  
+  if (!keydb.setinfo (crypt_userkey, keydata)) {
+    userkey.clear(); // failed
+  }
+  
+  return userkey;
+}
+
+text_t generate_key (const text_t &keydbfile, const text_t &username) {
+  gdbmclass keydb;
+  if (!keydb.opendatabase(keydbfile, GDBM_WRCREAT, 1000, true)) return "";
+
+  text_t key = generate_key (keydb, username);
+  keydb.closedatabase();
+
+  return key;
+}
+
+
+// checks to see if there is a key for this particular user in the
+// database that hasn't decayed. a short decay is used when group
+// is set to administrator
+bool check_key (gdbmclass &keydb, const userinfo_t &thisuser,
+		const text_t &key, const text_t &group, int keydecay) {
+  if (thisuser.username.empty() || key.empty()) return false;
+
+  // the keydecay is set to 5 minute for things requiring the
+  // administrator
+  //  if (group == "administrator") keydecay = 300;
+  
+  // success if there is a key in the key database that is owned by this
+  // user whose creation time is less that keydecay
+  text_t crypt_key = crypt_text(key);
+  infodbclass info;
+  if (keydb.getinfo (crypt_key, info))  {
+    if (info["user"] == thisuser.username) {
+      time_t keycreation = text2time (info["time"]);
+      if (keycreation != (time_t)-1 && difftime (text2time(time2text(time(NULL))),
+						 keycreation) <= keydecay) {
+	// succeeded, update the key's time
+	info["time"] = time2text(time(NULL));
+	keydb.setinfo (crypt_key, info);
+	return true;
+      }
+    }
+  }
+  
+  return false;;
+}
+
+bool check_key (const text_t &keydbfile, const userinfo_t &thisuser,
+		const text_t &key, const text_t &group, int keydecay) {
+  gdbmclass keydb;
+  if (!keydb.opendatabase(keydbfile, GDBM_WRCREAT, 1000, true)) return false;
+
+  bool success = check_key (keydb, thisuser, key, group, keydecay);
+  keydb.closedatabase();
+
+  return success;
+}
+
+
+// remove_old_keys will remove all keys created more than keydecay ago.
+// use sparingly, it can be quite an expensive function
+void remove_old_keys (const text_t &keydbfile, int keydecay) {
+  // open the key database
+  gdbmclass keydb;
+  if (!keydb.opendatabase(keydbfile, GDBM_WRCREAT, 1000, true)) return;
+
+  // get a list of keys created more than keydecay seconds agon
+  text_tarray oldkeys;
+  text_t key = keydb.getfirstkey ();
+  infodbclass info;
+  time_t timenow = text2time(time2text(time(NULL)));
+  time_t keycreation = (time_t)-1;
+  while (!key.empty()) {
+    if (keydb.getinfo (key, info))  {
+      keycreation = text2time (info["time"]);
+      if (keycreation != (time_t)-1 && difftime (timenow, keycreation) > keydecay) {
+	// found an old key
+	oldkeys.push_back(key);
+      }
+    }
+    
+    key = keydb.getnextkey (key);
+  }
+
+  // delete the keys
+  text_tarray::iterator keys_here = oldkeys.begin();
+  text_tarray::iterator keys_end = oldkeys.end();
+  while (keys_here != keys_end) {
+    keydb.deletekey(*keys_here);
+    keys_here++;
+  }
+  
+  // close the key database
+  keydb.closedatabase();
+}
Index: /main/tags/2.38/gsdl/src/recpt/userdb.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/userdb.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/userdb.h	(revision 21083)
@@ -0,0 +1,127 @@
+/**********************************************************************
+ *
+ * userdb.h -- functions to handle a user database
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef USERDB_H
+#define USERDB_H
+
+#include "infodbclass.h"
+
+
+// the password line in the userinfo_t must be encrypted using
+// this function
+text_t crypt_text (const text_t &text);
+
+// username_ok tests to make sure a username is ok. a username
+// must be at least 2 characters long, but no longer than 30
+// characters long. it can contain the characters a-z A-Z 0-9
+// . and _
+bool username_ok (const text_t &username);
+
+// password_ok tests to make sure a password is ok. a password
+// must be at least 3 characters long but no longer than 8 characters
+// long. it can contain any character in the range 0x20-0x7e
+bool password_ok (const text_t &password);
+
+
+// information about a single user
+struct userinfo_t {
+  void clear ();
+  userinfo_t () {clear();}
+  userinfo_t &operator=(const userinfo_t &x);
+  
+  text_t username;
+  text_t password;
+  bool enabled;
+  text_t groups; // comma separated list
+  text_t comment;
+};
+
+
+// these functions deal with user and key databases that are already open
+// they should have been opened with gdbmclass::opendatabase
+// as soon as the databases are finished with they should be closed with
+// gdbmclass::closedatabase so that another process can access the database
+//
+// some of the functions need the databases opened with write access, an
+// appropriate call would be something like:
+//
+//   success = keydb.opendatabase (keyfile, GDBM_WRCREAT, 1000);
+//
+// note: passwords and keys are encrypted, so you can't just compare passwords
+// in a userinfo_t with a password given by the user. use check_passwd
+
+
+// functions dealing with user databases
+
+// returns true on success (in which case userinfo will contain
+// the information for this user)
+bool get_user_info (gdbmclass &userdb, const text_t &username,
+		    userinfo_t &userinfo);
+bool get_user_info (const text_t &userdbfile, const text_t &username,
+		    userinfo_t &userinfo);
+
+// returns true on success
+bool set_user_info (gdbmclass &userdb, const text_t &username,
+		    const userinfo_t &userinfo);
+bool set_user_info (const text_t &userdbfile, const text_t &username,
+		    const userinfo_t &userinfo);
+
+// removes a user from the user database -- forever
+void delete_user (gdbmclass &userdb, const text_t &username);
+void delete_user (const text_t &userdbfile, const text_t &username);
+
+// gets a list of all the users in the database. returns true
+// on success
+void get_user_list (gdbmclass &userdb, text_tarray &userlist);
+
+// returns true if the user's password is correct.
+bool check_passwd (const userinfo_t &thisuser, const text_t &password);
+
+// removes spaces from user groups
+text_t format_user_groups(const text_t user_groups);
+
+// functions dealing with databases of temporary keys
+
+// generates a random key for the user, stores it in the database and
+// returns it so that it can be used in page generation
+// returns "" on failure
+text_t generate_key (gdbmclass &keydb, const text_t &username);
+text_t generate_key (const text_t &keydbfile, const text_t &username);
+
+// checks to see if there is a key for this particular user in the
+// database that hasn't decayed. a short decay is used when group
+// is set to administrator
+bool check_key (gdbmclass &keydb, const userinfo_t &thisuser,
+		const text_t &key, const text_t &group, int keydecay);
+bool check_key (const text_t &keydbfile, const userinfo_t &thisuser,
+		const text_t &key, const text_t &group, int keydecay);
+
+// remove_old_keys will remove all keys created more than keydecay ago.
+// use sparingly, it can be quite an expensive function
+void remove_old_keys (const text_t &keydbfile, int keydecay);
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/usersaction.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/usersaction.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/usersaction.cpp	(revision 21083)
@@ -0,0 +1,421 @@
+/**********************************************************************
+ *
+ * usersaction.cpp -- managing users
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "usersaction.h"
+#include "fileutil.h"
+#include "userdb.h"
+
+
+///////////////
+// usersaction
+///////////////
+
+usersaction::usersaction () {
+  // this action uses cgi variable "a"
+  cgiarginfo arg_ainfo;
+  arg_ainfo.shortname = "a";
+  arg_ainfo.longname = "action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "um"; // user management
+  arg_ainfo.savedarginfo = cgiarginfo::must;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "uma"
+  arg_ainfo.shortname = "uma";
+  arg_ainfo.longname = "user management action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "listusers";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umun"
+  arg_ainfo.shortname = "umun";
+  arg_ainfo.longname = "user management user name";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umpw"
+  arg_ainfo.shortname = "umpw";
+  arg_ainfo.longname = "user management password";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umnpw1"
+  arg_ainfo.shortname = "umnpw1";
+  arg_ainfo.longname = "user management new password 1";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umnpw2"
+  arg_ainfo.shortname = "umnpw2";
+  arg_ainfo.longname = "user management new password 2";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umus"
+  arg_ainfo.shortname = "umus";
+  arg_ainfo.longname = "user management account status";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umug"
+  arg_ainfo.shortname = "umug";
+  arg_ainfo.longname = "user management groups"; // comma seperated list
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "umc"
+  arg_ainfo.shortname = "umc";
+  arg_ainfo.longname = "user management comment";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "bcp"
+  arg_ainfo.shortname = "bcp";
+  arg_ainfo.longname = "change password submit button";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "beu"
+  arg_ainfo.shortname = "beu";
+  arg_ainfo.longname = "edit user submit button";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+
+  // "cm"
+  arg_ainfo.shortname = "cm";
+  arg_ainfo.longname = "confirm an action";
+  arg_ainfo.multiplechar = true;
+  arg_ainfo.defaultstatus = cgiarginfo::weak;
+  arg_ainfo.argdefault = "";
+  arg_ainfo.savedarginfo = cgiarginfo::mustnot;
+  argsinfo.addarginfo (NULL, arg_ainfo);
+}
+
+void usersaction::configure (const text_t &key, const text_tarray &cfgline) {
+  // get the password filename
+  if (cfgline.size() == 1) {
+    if (key == "usersfile") usersfile = cfgline[0];
+  }
+
+  action::configure (key, cfgline);
+}
+
+bool usersaction::init (ostream &logout) {
+
+  if (gdbmhome.empty()) {
+    logout << "ERROR (usersaction::init) gdbmhome is not set\n";
+    return false;
+  }
+
+  if (usersfile.empty()) usersfile = filename_cat (gdbmhome, "etc", "users.db");
+
+  return action::init (logout);
+}
+
+bool usersaction::check_cgiargs (cgiargsinfoclass &/*argsinfo*/, cgiargsclass &args, 
+				  ostream &/*logout*/) {
+  args["uan"] = "1"; // user authentication is needed
+
+  if (args["uma"] == "changepasswd") {
+    // no particular group is needed to change a password
+    args["ug"].clear(); 
+  } else {
+    // administrator is needed for all other management tasks
+    args["ug"] = "administrator";
+  }
+  
+  return true;
+}
+
+void usersaction::get_cgihead_info (cgiargsclass &/*args*/, recptprotolistclass * /*protos*/,
+				    response_t &response, text_t &response_data, 
+				    ostream &/*logout*/) {
+  response = content;
+  response_data = "text/html";
+}
+
+bool usersaction::do_action (cgiargsclass &args, recptprotolistclass * /*protos*/, 
+			     browsermapclass * /*browsers*/, displayclass &disp, 
+			     outconvertclass &outconvert, ostream &textout, 
+			     ostream &logout) {
+
+  if (args["uma"] == "adduser" || args["uma"] == "edituser") {
+    // adduser is handled by edituser
+    return do_edituser (args, disp, outconvert, textout, logout);
+    
+  } else if (args["uma"] == "deleteuser") {
+    return do_deleteuser (args, disp, outconvert, textout, logout);
+    
+  } else if (args["uma"] == "changepasswd") {
+    return do_changepasswd (args, disp, outconvert, textout, logout);  
+  }
+
+  // default
+  return do_listusers (args, disp, outconvert, textout, logout);
+}
+
+bool usersaction::do_listusers (cgiargsclass &/*args*/, displayclass &disp, 
+				outconvertclass &outconvert, ostream &textout, 
+				ostream &/*logout*/) {
+
+  textout << outconvert << disp
+	  << "_userslistusers:header_\n_userslistusers:contentstart_\n";
+
+
+  // open the user database (it will be used a lot)
+  gdbmclass userdb;
+  text_tarray userlist;
+  if (userdb.opendatabase(usersfile, GDBM_READER, 1000, true)) {
+    // get user list
+    get_user_list (userdb, userlist);
+  }
+
+  // sort the list
+  sort(userlist.begin(), userlist.end());
+  
+  // output the information for each user
+  userinfo_t userinfo;
+  text_tarray::iterator users_here = userlist.begin();
+  text_tarray::iterator users_end = userlist.end();
+  while (users_here != users_end) {
+    if (get_user_info (userdb, *users_here, userinfo)) {
+      textout << outconvert << disp
+	      << "<tr><td bgcolor=\"\\#eeeeee\">" << userinfo.username << "</td>\n"
+       	      << "<td bgcolor=\"\\#eeeeee\">" << (char *) (userinfo.enabled ? "enabled" : "disabled") << "</td>\n"
+	      << "<td bgcolor=\"\\#eeeeee\">" << userinfo.groups << "&nbsp;</td>\n"
+	      << "<td bgcolor=\"\\#eeeeee\">" << userinfo.comment << "&nbsp;</td>\n"
+	      << "<td><a href=\"_httpcurrentdocument_&a=um&uma=edituser&umun="
+	      << userinfo.username << "\">_userslistusers:textedituser_</a> "
+	      << "<a href=\"_httpcurrentdocument_&a=um&uma=deleteuser&umun="
+	      << userinfo.username << "\">_userslistusers:textdeleteuser_</a>"
+	      << "</td></tr>\n\n";
+
+    } else {
+      textout << outconvert << disp
+	      << "<tr><td bgcolor=\"\\#eeeeee\">" << *users_here << "</td>\n"
+	      << "<td bgcolor=\"\\#eeeeee\">&nbsp;</td>\n"
+	      << "<td bgcolor=\"\\#eeeeee\">&nbsp;</td>\n"
+	      << "<td bgcolor=\"\\#eeeeee\">&nbsp;</td>\n"
+	      << "<td>&nbsp;</td></tr>\n\n";
+    }
+    
+    users_here++;
+  }
+
+  userdb.closedatabase();
+  
+  textout << outconvert << disp
+	  << "_userslistusers:contentend_\n_userslistusers:footer_\n";
+  return true;
+}
+
+void usersaction::define_user_macros (cgiargsclass &args, displayclass &disp) {
+  disp.setmacro ("usersargun", "users", args["umun"]);
+  disp.setmacro ("usersargpw", "users", args["umpw"]);
+  disp.setmacro ("usersargus", "users", args["umus"]);
+  disp.setmacro ("usersargug", "users", args["umug"]);
+  disp.setmacro ("usersargc", "users", args["umc"]);
+}
+
+
+bool usersaction::do_edituser (cgiargsclass &args, displayclass &disp, 
+			       outconvertclass &outconvert, ostream &textout, 
+			       ostream &logout) {
+  userinfo_t userinfo;
+  text_t messagestatus;
+  bool noproblems = true;
+  
+  // fill in defaults from user database (if appropriate)
+  if (args["umun"].empty()) {
+    noproblems = false;
+    
+  } else if (!username_ok (args["umun"])) {
+    // problem with username
+    noproblems = false;
+    messagestatus += "_users:messageinvalidusername_";
+    
+  } else if (get_user_info (usersfile, args["umun"], userinfo)) {
+    if (args["uma"] == "adduser") {
+      // must not add a user that has the same name as another user
+      noproblems = false;
+      messagestatus += "_users:messageuserexists_";
+      
+    } else {
+      // only fill in the data if there is no user status defined
+      if (args["umus"].empty()) {
+	args["umus"] = userinfo.enabled ? "enabled" : "disabled";
+	if (args["umug"].empty()) args["umug"] = userinfo.groups;
+	if (args["umc"].empty()) args["umc"] = userinfo.comment;
+      }
+    }
+  }
+
+  // fill in the user status default
+  if (args["umus"].empty()) {
+    noproblems = false;
+    args["umus"] = "enabled";
+  }
+  
+  // make sure the password is ok
+  if (args["umpw"].empty()) {
+    // password must not be empty if none were supplied from database
+    // and we have had no other problems
+    if (userinfo.password.empty() && noproblems) {
+      noproblems = false;
+      messagestatus += "_users:messageemptypassword_";
+    }
+    
+  } else if (!password_ok(args["umpw"])) {
+    noproblems = false;
+    messagestatus += "_users:messageinvalidpassword_";
+  }
+
+  // set this info if no problems have been encounted
+  // and the submit button was pressed
+  if (noproblems && !args["beu"].empty()) {
+    userinfo.username = args["umun"];
+    if (!args["umpw"].empty()) {
+      // only set the password if it is not empty
+      userinfo.password = crypt_text(args["umpw"]);
+    }
+    userinfo.enabled = (args["umus"] == "enabled");    
+    userinfo.groups = format_user_groups(args["umug"]);
+    userinfo.comment = args["umc"];
+    
+    set_user_info (usersfile, args["umun"], userinfo);
+    
+    // show list of users
+    return do_listusers (args, disp, outconvert, textout, logout);
+  }
+  
+  // define the macros for the user
+  define_user_macros (args, disp);
+  disp.setmacro ("messagestatus", "users", messagestatus);
+  
+  textout << outconvert << disp
+	  << "_usersedituser:header_\n_usersedituser:content_\n_usersedituser:footer_\n";
+
+  return true;
+}
+
+bool usersaction::do_deleteuser (cgiargsclass &args, displayclass &disp, 
+				 outconvertclass &outconvert, ostream &textout, 
+				 ostream &logout) {
+  if (!args["cm"].empty()) {
+    if (args["cm"] == "yes" && !args["umun"].empty()) {
+      // user confirmed the deletion of the user
+      delete_user (usersfile, args["umun"]);
+    }
+    
+    // redirect the user back to the listusers page
+    return do_listusers (args, disp, outconvert, textout, logout);
+  }
+
+  define_user_macros (args, disp);
+  textout << outconvert << disp
+	  << "_usersdeleteuser:header_\n_usersdeleteuser:content_\n_usersdeleteuser:footer_\n";
+  
+  return true;
+}
+
+bool usersaction::do_changepasswd (cgiargsclass &args, displayclass &disp, 
+				   outconvertclass &outconvert, ostream &textout, 
+				   ostream &/*logout*/) {
+  text_t messagestatus;
+  
+  if (!args["bcp"].empty()) {
+    if (args["un"].empty()) {
+      messagestatus = "_users:messageusernameempty_";
+    } else if (args["umpw"].empty()) {
+      messagestatus = "_users:messagepasswordempty_";
+    } else if (args["umnpw1"].empty()) {
+      messagestatus = "_users:messagenewpass1empty_";
+    } else if (args["umnpw2"].empty()) {
+      messagestatus = "_users:messagenewpass2empty_";
+    } else if (args["umnpw1"] != args["umnpw2"]) {
+      messagestatus = "_users:messagenewpassmismatch_";
+    } else if (!password_ok(args["umnpw1"])) {
+      messagestatus = "_users:messageinvalidpassword_";
+    } else {
+      userinfo_t userinfo;
+      if (get_user_info (usersfile, args["un"], userinfo)) {
+	// check old password
+	if (userinfo.password != crypt_text(args["umpw"])) {
+	  messagestatus = "_users:messagefailed_";
+	  
+	} else {
+	  userinfo.password = crypt_text(args["umnpw1"]);
+	  if (set_user_info (usersfile, args["un"], userinfo)) {
+	    // everything is ok
+	    textout << outconvert << disp
+		    << "_userschangepasswdok:header_\n"
+	      "_userschangepasswdok:content_\n"
+	      "_userschangepasswdok:footer_\n";
+	    return true;
+	  }
+	}
+      }
+    }
+  }
+
+  disp.setmacro ("messagestatus", "users", messagestatus);
+
+  textout << outconvert << disp
+	  << "_userschangepasswd:header_\n"
+    "_userschangepasswd:content_\n"
+    "_userschangepasswd:footer_\n";
+
+  return true;
+}
Index: /main/tags/2.38/gsdl/src/recpt/usersaction.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/usersaction.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/usersaction.h	(revision 21083)
@@ -0,0 +1,82 @@
+/**********************************************************************
+ *
+ * usersaction.h -- managing users
+ * Copyright (C) 1999  DigiLib Systems Limited, New Zealand
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef USERSACTION_H
+#define USERSACTION_H
+
+#include "gsdlconf.h"
+#include "action.h"
+#include "text_t.h"
+
+
+class usersaction : public action {
+protected:
+  text_t usersfile;
+
+public:
+  usersaction ();
+  virtual ~usersaction () {}
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  bool init (ostream &logout);
+  
+  text_t get_action_name () {return "um";}
+  
+  bool check_cgiargs (cgiargsinfoclass &argsinfo, cgiargsclass &args, 
+		      ostream &logout);
+
+  void get_cgihead_info (cgiargsclass &args, recptprotolistclass *protos,
+			 response_t &response, text_t &response_data, 
+			 ostream &logout);
+  
+  bool do_action (cgiargsclass &args, recptprotolistclass *protos, 
+		  browsermapclass *browsers, displayclass &disp, 
+		  outconvertclass &outconvert, ostream &textout, 
+		  ostream &logout);
+
+protected:
+  void define_user_macros (cgiargsclass &args, displayclass &disp);
+  
+  bool do_listusers (cgiargsclass &args, displayclass &disp, 
+		     outconvertclass &outconvert, ostream &textout, 
+		     ostream &logout);
+
+  bool do_edituser (cgiargsclass &args, displayclass &disp, 
+		    outconvertclass &outconvert, ostream &textout, 
+		    ostream &logout);
+
+  bool do_deleteuser (cgiargsclass &args, displayclass &disp, 
+		      outconvertclass &outconvert, ostream &textout, 
+		      ostream &logout);
+
+  bool do_changepasswd (cgiargsclass &args, displayclass &disp, 
+			outconvertclass &outconvert, ostream &textout, 
+			ostream &logout);
+};
+
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.cpp	(revision 21083)
@@ -0,0 +1,245 @@
+/**********************************************************************
+ *
+ * vlistbrowserclass.cpp -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "vlistbrowserclass.h"
+#include <assert.h>
+#include "OIDtools.h"
+
+vlistbrowserclass::vlistbrowserclass () {
+}
+
+vlistbrowserclass::~vlistbrowserclass () {
+}
+
+// returns the name that specifies the browserclass type
+text_t vlistbrowserclass::get_browser_name () {
+  return "VList";
+}
+
+void vlistbrowserclass::load_metadata_defaults (text_tset &metadata) {
+  metadata.insert ("haschildren");
+  metadata.insert ("doctype");
+}
+
+text_t vlistbrowserclass::get_default_formatstring () {
+  return "<td valign=top>[link][icon][/link]</td>"
+    "<td valign=top>[srclink][srcicon][/srclink]</td>"
+    "<td valign=top>[highlight]{Or}{[Title],Untitled}[/highlight]"
+    "{If}{[Source],<br><i>([Source])</i>}</td>";
+}
+
+int vlistbrowserclass::output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+					     const text_t &collection, int colnumber, 
+					     format_t *formatlistptr, bool use_table, 
+					     text_tset &/*metadata*/, bool &/*getParents*/, 
+					     recptproto * collectproto, displayclass &disp, 
+					     outconvertclass &outconvert, ostream &textout, 
+					     ostream& logout) {
+
+  text_t link, icon;
+
+  text_t collink = collection;
+  if (!collink.empty()) collink = "&c=" + collink;
+
+  get_link_icon (section, args, collink, link, icon);
+  bool highlight = false;
+  if (!args["d"].empty()) {
+    if (args["d"] == section.OID) highlight = true;
+  } else 
+    if (args["cl"] == section.OID) highlight = true;
+
+
+  if (use_table || colnumber > 0) {
+    textout << "<table><tr valign=top>";
+    // get tab size
+    text_t tab; int itab;
+    disp.expandstring ("Global", "_tabwidth_", tab);
+    itab = tab.getint();
+    if (colnumber > 0) textout << outconvert << disp 
+			       << "<td><img src=\"_httpimg_/space.gif\" width=" 
+			       << (itab*colnumber) << "></td>";
+  }
+
+  textout << outconvert << disp 
+	  << get_formatted_string (collection, collectproto, 
+				   section, disp, formatlistptr, 
+				   link, icon, highlight, logout);
+  
+  if (use_table  || colnumber > 0) textout << "</tr></table>\n";
+
+  return 1;
+}
+
+int vlistbrowserclass::output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+					     const text_t &collection, int colnumber, 
+					     format_t *formatlistptr, bool use_table, 
+					     text_tset &/*metadata*/, bool &/*getParents*/, 
+					     recptproto * collectproto, displayclass &disp, 
+					     outconvertclass &outconvert, ostream &textout, 
+					     ostream& logout) {
+
+  text_t link, icon;
+  text_t &arg_d = args["d"];
+  text_t &arg_cl = args["cl"];
+
+  text_t collink = collection;
+  if (!collink.empty()) collink = "&c=" + collink;
+
+  if (colnumber > 0) {
+    textout << "<table><tr valign=top>";
+    // get tab size
+    text_t tab; int itab;
+    disp.expandstring ("Global", "_tabwidth_", tab);
+    itab = tab.getint();
+    if (colnumber > 0) textout << outconvert << disp 
+			       << "<td><img src=\"_httpimg_/space.gif\" width=" 
+			       << (itab*colnumber) << "></td>";
+    textout << "<td>";
+  }
+  if (use_table) textout << "<table>\n";
+
+  ResultDocInfo_tarray::iterator thissection = sections.docInfo.begin();
+  ResultDocInfo_tarray::iterator endsection = sections.docInfo.end();
+
+  // ** here lies Alan's hack to get 4 results per table row
+  int item = 0, perline;; // set perline to 1 normally
+  text_t fstring;
+  if ( thissection != endsection ) { // only if there are results (else corrupts display)
+    fstring = 
+      get_formatted_string (collection, collectproto, 
+			    *thissection, disp, formatlistptr, link, icon, false, logout);
+    // if format string
+    // has <td><t (e.g. <td><table>) then
+    // we assume it is an image and put it in 4 columns
+    if (fstring[5] == 't') 
+      perline = 4;
+    else
+      perline = 1;
+  }
+
+  while (thissection != endsection) {
+    item++;
+    get_link_icon (*thissection, args, collink, link, icon);
+    bool highlight = false;
+    if (!arg_d.empty()) {
+      if (arg_d == (*thissection).OID) highlight = true;
+    } else 
+      if (arg_cl == (*thissection).OID) highlight = true;
+
+    if ((item == 1 && use_table) || colnumber > 0 )
+      textout << "<tr valign=top>\n";
+
+    textout << outconvert << disp 
+	    << " " << get_formatted_string (collection, collectproto, 
+      *thissection, disp, formatlistptr, link, icon, false, logout);
+
+    if ((item >= perline && use_table) || colnumber > 0) {
+      textout << "\n</tr>";
+      item = 0;
+    }
+    textout << "\n";
+    thissection ++;
+  }
+
+  if (use_table) textout << "</table>\n";
+  if (colnumber > 0) textout << "</table></td></tr></table>\n";
+
+  return 1;
+}
+
+
+// get_link_icon attempts to work out what type of icon should be displayed for
+// the given section and what it should link to.
+void vlistbrowserclass::get_link_icon (ResultDocInfo_t &section, cgiargsclass &args,
+				       const text_t &collink, text_t &link, text_t &icon) {
+
+  link = "<a href=\"_httpdocument_" + collink;
+  icon = "_document:icontext_";
+  int haschildren = 0;
+
+  if (section.metadata.count("haschildren")>0)
+    haschildren = section.metadata["haschildren"].values[0].getint();
+
+  text_t doctype;
+  if (section.metadata.count("doctype")>0)
+    doctype = section.metadata["doctype"].values[0];
+
+  text_t &arg_d = args["d"];
+  text_t &arg_cl = args["cl"];
+
+  if (args["a"] == "q") {
+    // query results
+    if ((is_top (section.OID)) && (haschildren == 1)) icon = "_document:iconclosedbook_";
+    else if (haschildren == 1) icon = "_document:iconclosedfolder_";
+    link += "&cl=search&d=" + section.OID + "\">";
+
+  } else if (!arg_d.empty()) {
+    // document level
+    if (is_top(section.OID)) {
+      icon = "_document:iconopenbook_";
+      if (arg_cl == "search") link = "<a href=\"_httpquery_\">";
+      else link += "&cl=" + arg_cl + "\">";
+    
+    } else if (haschildren == 1) {
+      if ((args["gc"] == "1") || 
+	  (is_child_of (section.OID, arg_d)) ||
+	  (section.OID == arg_d)) {
+	icon = "_document:iconopenfolder_";
+	link += "&cl=" + arg_cl + "&d=" + section.OID + ".pr\">";
+      } else {
+	icon = "_document:iconclosedfolder_";
+	link += "&cl=" + arg_cl + "&d=" + section.OID + "\">";
+      }
+    } else {
+      if (args["gt"] == "0") {
+	link += "&cl=" + arg_cl + "&d=" + section.OID + "\">";
+      } else {
+	link += "&cl=" + arg_cl + "&d=" + section.OID + "#" + section.OID + "\">";
+      }
+    }
+
+  } else {
+    // classification level
+    if (haschildren == 1) {
+      if (doctype == "classify") {
+	if ((args["gc"] == "1") || 
+	    (is_child_of (section.OID, arg_cl)) || 
+	    (section.OID == arg_cl)) {
+	  icon = "_document:iconopenbookshelf_";
+	  link += "&cl=" + section.OID + ".pr\">";
+	} else {
+	  icon = "_document:iconclosedbookshelf_";
+	  link += "&cl=" + section.OID + "\">";
+	}
+      } else {
+	icon = "_document:iconclosedbook_";
+	link += "&cl=" + arg_cl + "&d=" + section.OID + "\">";
+      }
+    } else {
+      if (doctype == "classify") link = "";
+      else link += "&cl=" + arg_cl + "&d=" + section.OID + "\">";
+    }
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/vlistbrowserclass.h	(revision 21083)
@@ -0,0 +1,63 @@
+/**********************************************************************
+ *
+ * vlistbrowserclass.h -- 
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+
+#ifndef VLISTBROWSERCLASS_H
+#define VLISTBROWSERCLASS_H
+
+#include "browserclass.h"
+
+class vlistbrowserclass : public browserclass {
+protected:
+
+public:
+  vlistbrowserclass ();
+  virtual ~vlistbrowserclass ();
+
+  text_t get_browser_name ();
+
+  virtual void load_metadata_defaults (text_tset &metadata);
+
+  virtual text_t get_default_formatstring ();
+
+  virtual int output_section_group (ResultDocInfo_t &section, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+  virtual int output_section_group (FilterResponse_t &sections, cgiargsclass &args,
+				    const text_t &collection, int colnumber, format_t *formatlistptr, 
+				    bool use_table, text_tset &metadata, bool &getParents,
+				    recptproto *collectproto, displayclass &disp, 
+				    outconvertclass &outconvert, ostream &textout, ostream &logout);
+
+protected:
+
+  virtual void get_link_icon (ResultDocInfo_t &section, cgiargsclass &args,
+			      const text_t &collink, text_t &link, text_t &icon);
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/win32.mak	(revision 21083)
@@ -0,0 +1,152 @@
+###########################################################################
+#
+# win32 makefile -- src/recpt
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..
+USE_STLPORT = 0
+LOCAL_LIBRARY = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = -GX
+LDFLAGS =
+DEFS = -D__WIN32__ -DHAVE_CONFIG_H -DPARADOCNUM -D_LITTLE_ENDIAN -DSHORT_SUFFIX
+INCLUDES = -I"$(GSDLHOME)\src\recpt" -I"$(GSDLHOME)\lib" -I"$(GSDLHOME)\src\colservr" \
+	   -I"$(GSDLHOME)\packages\mg" -I"$(GSDLHOME)\packages\mg\lib" \
+	   -I"$(GSDLHOME)\packages\mg\src\text" -I"$(GSDLHOME)\packages\windows\gdbm\gdbm" \
+	   -I"$(GSDLHOME)\packages\windows\crypt\crypt" -I"$(GSDLHOME)\src\mgpp\lib" \
+	   -I"$(GSDLHOME)\src\mgpp\text" -I"$(GSDLHOME)"
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+!IF $(LOCAL_LIBRARY)
+DEFS = $(DEFS) -DGSDL_LOCAL_LIBRARY
+!ENDIF
+
+LIBS = "$(GSDLHOME)\packages\windows\gdbm\gdbm\gdbm.lib" \
+       "$(GSDLHOME)\packages\windows\crypt\crypt\crypt.lib" \
+       "$(GSDLHOME)\src\colservr\gsdlcolservr.lib" \
+       "$(GSDLHOME)\lib\gsdllib.lib" \
+       "$(GSDLHOME)\packages\mg\src\text\libtextin.lib" \
+       "$(GSDLHOME)\packages\mg\lib\libmg.lib" \
+       "$(GSDLHOME)\src\mgpp\text\libtextin.lib" \
+       "$(GSDLHOME)\src\mgpp\lib\libmg.lib"
+
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $< 
+
+
+COMMONHEADERS = receptionist.h cgiargs.h action.h browserclass.h \
+                converter.h recptconfig.h cgiutils.h OIDtools.h browsetools.h htmlgen.h \
+		statusaction.h pageaction.h comtypes.h recptproto.h pingaction.h \
+		queryaction.h documentaction.h extlinkaction.h htmlutils.h \
+		querytools.h formattools.h tipaction.h authenaction.h infodbclass.h \
+                userdb.h usersaction.h vlistbrowserclass.h hlistbrowserclass.h \
+		datelistbrowserclass.h invbrowserclass.h pagedbrowserclass.h \
+		htmlbrowserclass.h historydb.h phindbrowserclass.h collectoraction.h \
+		nullproto.h argdb.h browseaction.h browseactiontools.h phindaction.h \
+		summarise.h
+
+CGIHEADERS = cgiwrapper.h
+
+HEADERS = $(COMMONHEADERS) $(CGIHEADERS)
+
+
+COMMONSOURCES = receptionist.cpp cgiargs.cpp action.cpp browserclass.cpp \
+                converter.cpp recptconfig.cpp cgiutils.cpp OIDtools.cpp browsetools.cpp \
+		htmlgen.cpp statusaction.cpp pageaction.cpp comtypes.cpp \
+		recptproto.cpp pingaction.cpp queryaction.cpp documentaction.cpp \
+		extlinkaction.cpp htmlutils.cpp querytools.cpp formattools.cpp \
+		tipaction.cpp authenaction.cpp infodbclass.cpp userdb.cpp usersaction.cpp \
+		vlistbrowserclass.cpp hlistbrowserclass.cpp datelistbrowserclass.cpp \
+		invbrowserclass.cpp pagedbrowserclass.cpp htmlbrowserclass.cpp \
+		historydb.cpp phindbrowserclass.cpp collectoraction.cpp nullproto.cpp \
+		argdb.cpp browseaction.cpp browseactiontools.cpp phindaction.cpp \
+		summarise.cpp
+
+CGISOURCES = librarymain.cpp cgiwrapper.cpp
+
+SOURCES = $(COMMONSOURCES) $(CGISOURCES)
+
+
+COMMONOBJECTS = receptionist.obj cgiargs.obj action.obj browserclass.obj \
+                converter.obj recptconfig.obj cgiutils.obj OIDtools.obj browsetools.obj \
+		htmlgen.obj statusaction.obj pageaction.obj comtypes.obj recptproto.obj \
+		pingaction.obj queryaction.obj documentaction.obj extlinkaction.obj \
+		htmlutils.obj querytools.obj formattools.obj tipaction.obj \
+		authenaction.obj infodbclass.obj userdb.obj usersaction.obj \
+		vlistbrowserclass.obj hlistbrowserclass.obj datelistbrowserclass.obj \
+		invbrowserclass.obj pagedbrowserclass.obj htmlbrowserclass.obj \
+		historydb.obj phindbrowserclass.obj collectoraction.obj nullproto.obj \
+		argdb.obj browseaction.obj browseactiontools.obj phindaction.obj \
+		summarise.obj
+
+CGIOBJECTS = librarymain.obj cgiwrapper.obj
+
+OBJECTS = $(COMMONOBJECTS) $(CGIOBJECTS)
+
+EXEC = library.exe
+
+!IF $(LOCAL_LIBRARY)
+all: gsdlrecpt.lib
+!ELSE
+all: $(EXEC)
+!ENDIF
+
+gsdlrecpt.lib : $(COMMONOBJECTS)
+	if EXIST gsdlrecpt.lib del gsdlrecpt.lib
+	$(AR) /out:gsdlrecpt.lib $(COMMONOBJECTS)
+
+clean:
+	del *.obj
+	del library.exe
+
+!IF $(LOCAL_LIBRARY)
+install:
+!ELSE
+install:
+	copy library.exe "$(GSDLHOME)\cgi-bin"
+!ENDIF
+
+library.exe: $(OBJECTS)
+	     $(LINK) $(OBJECTS) $(LIBS) 
+
+# we want statusaction to always be compiled in case the status of
+# GSDL_LOCAL_LIBRARY has changed
+statusaction.obj: FORCE
+
+FORCE:
Index: /main/tags/2.38/gsdl/src/recpt/z3950cfg.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/z3950cfg.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/z3950cfg.h	(revision 21083)
@@ -0,0 +1,28 @@
+/*
+  This defines a data structure shared between:
+  * the C++ z3950proto class defined in z3950proto.cpp, and
+  * the C function yyparse() created by bison from the file zparse.fl
+  */
+
+#ifndef _Z3950CFG_H
+#define _Z3950CFG_H
+
+struct z3950aboutlist {
+  char *lang;
+  char *text;
+  struct z3950aboutlist *next;
+};
+struct z3950cfg {
+  char *shortname;
+  char *hostname;
+  int port;
+  char *dbname;
+  char *longname;
+  char *icon;
+  char *smallicon;
+  struct z3950aboutlist *about;
+  struct z3950cfg *next;
+};
+extern struct z3950cfg *zserver_list;
+extern FILE *errfile;
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/z3950proto.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/z3950proto.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/z3950proto.cpp	(revision 21083)
@@ -0,0 +1,600 @@
+/**********************************************************************
+ *
+ * z3950proto.cpp --
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "z3950proto.h"
+#include "comtypes.h"
+#include "browsefilter.h"
+#include "queryfilter.h"
+#include "filter.h"
+// z39.50 yaz stuff
+#include <stdio.h> // for (FILE *) type for yyin and fopen.
+// config file parsing stuff
+#include "z3950cfg.h" // for reading in config files - 
+// defines "struct z3950cfg *zserver_list" as the head of the list.
+
+// note! yyin is hash-defined in z3950cfg.h to something else, to avoid
+// name conflicts with "other" yyins.
+extern FILE *yyin;
+extern FILE *yyout; // redirect for `errors' (unmatched tokens in flex)
+
+extern "C" {
+  extern int zconfigparse();
+}
+
+
+
+
+z3950proto::z3950proto() {
+  zserver_count=0;
+}
+
+z3950proto::~z3950proto() {
+}
+
+void z3950proto::add_server (z3950_server& zserver) {
+
+  // append the new server
+  zserver_count++;
+  zservers.push_back(&zserver);
+}
+
+void z3950proto::read_config_file(const text_t &filename, const text_t &errf) {
+  struct z3950cfg *here;
+  struct z3950cfg *oldhere;
+  z3950_server *zserver;
+  ShortColInfo_t *tempinfo;
+
+  //  FILE *errfile declared in z3950cfg.h, defined in zparse.y
+
+  char *errf_str=errf.getcstr();
+  if ((errfile=fopen(errf_str,"a"))==NULL) {
+    // what do we do if we can't open the error file?
+    // this means that errors will go to stderr, which may stuff up 
+    // any cgi headers and the page.
+    errfile=stderr;
+  }
+  delete errf_str;
+  yyout=errfile;
+
+  // zconfigparse() is defined in zparse.tab.c,
+  // which is the bison output of zparse.y
+  
+  char *filename_str=filename.getcstr();
+  yyin=fopen(filename_str,"r");
+  if (yyin==NULL) {
+    cerr << "Could not open "<<filename_str<<" for reading.\n";
+    delete filename_str;
+    return;
+  }
+  delete filename_str;
+  zconfigparse();
+
+  if (errfile!=stderr)
+    fclose(errfile);
+
+  // we now have the config files in the ptr zserver_list
+  if (zserver_list==NULL)
+    return; // no valid servers found in the config file - note that
+  // the parser will have already spat out any errors.
+
+  // now create z3950servers for each structure in server_list
+  here=zserver_list;
+  while (here!=NULL) {
+    zserver=new z3950_server;
+    tempinfo=new ShortColInfo_t;
+
+    tempinfo->host.setcstr(here->hostname);
+    tempinfo->port=here->port;
+    tempinfo->name.setcstr(here->dbname);
+    zserver->setInfo(tempinfo);
+    zserver->setName(here->shortname);
+    // now collection metadata.
+    zserver->setMeta("collectionname",here->longname);
+    if (here->icon!=NULL)
+      zserver->setMeta("iconcollection",here->icon);
+    if (here->smallicon!=NULL)
+      zserver->setMeta("iconcollectionsmall",here->smallicon);
+    
+    /*    filterclass *filter = new filterclass ();
+	  zserver->add_filter (filter);
+	  browsefilterclass *browsefilter = new browsefilterclass();
+	  zserver->add_filter (browsefilter);
+	  queryfilterclass *queryfilter = new queryfilterclass();
+	  zserver->add_filter (queryfilter);
+    */
+
+    // About list
+    if (here->about!=NULL) {
+      struct z3950aboutlist *about_here=here->about;
+      struct z3950aboutlist *oldabout;
+
+      while (about_here!=NULL) {
+	// problem with default lang (null): can't add ("",..)
+	if (about_here->lang==NULL)
+	  zserver->addcfgAbout("en",about_here->text);
+	else
+	  zserver->addcfgAbout(about_here->lang, about_here->text);
+	oldabout=about_here;
+	about_here=about_here->next;
+	free(oldabout->lang);
+	free(oldabout->text);
+	free(oldabout);
+      }
+    }
+
+    oldhere=here;
+    here=here->next;
+    free(oldhere->shortname); // these 4 strings should all be non-NULL...
+    free(oldhere->hostname);
+    free(oldhere->dbname);
+    free(oldhere->longname);
+    if (oldhere->icon) free(oldhere->icon);     // these 2 may be NULL
+    if (oldhere->smallicon) free(oldhere->smallicon);
+    free(oldhere);
+
+    add_server(*zserver);
+  } // end of while loop.
+
+}
+
+void z3950proto::configure (const text_t &/*key*/,
+			    const text_tarray &/*cfgline*/) {
+  // this is called for each line in the gsdlsite.cfg file
+}
+
+
+bool z3950proto::init (ostream &/*logout*/) {
+  // set up tcp connection to server here?
+  // we might also read in the config file here (instead of librarymain.cpp)
+
+  // 
+
+  // logout goes to initout.txt
+  //  logout <<"zdebug:init:Number of z3950 servers: "<< zserver_count << "\n";
+  //logout << "\t1st server name: " << zservers[0].getName().getcstr() << "\n";
+  return true;
+
+}
+
+/*text_t z3950proto::get_protocol_name () {
+  return "z3950proto";
+}
+*/
+
+void z3950proto::get_collection_list (text_tarray &collist, 
+				      comerror_t &/*err*/,
+				      ostream &/*logout*/) {
+
+  z3950_server_array::iterator here = zservers.begin();
+  z3950_server_array::iterator end = zservers.end();
+  while (here != end) {
+    collist.push_back((*here)->getName());
+    here++;
+  }
+}
+
+void z3950proto::has_collection (const text_t &collection, bool &hascollection,
+				 comerror_t &/*err*/, ostream &/*logout*/) {
+  z3950_server_array::iterator here = zservers.begin();
+  z3950_server_array::iterator end = zservers.end();
+  while (here != end) {
+    if((*here)->getName()==collection) {
+      hascollection=true;
+      return;
+    }
+    here++;
+  }
+  hascollection=false;
+}
+
+void z3950proto::ping (const text_t &/*collection*/, bool &wassuccess, 
+		       comerror_t &/*err*/, ostream &/*logout*/) {
+  // should we just ping the server, or actually create a connection
+  // to the z39.50 server process on the machine ?
+  wassuccess = true;
+}
+
+void z3950proto::get_collectinfo (const text_t &collection,
+				  ColInfoResponse_t &collectinfo,
+				  comerror_t &err, ostream &logout) {
+
+  // set err to protocolError if something goes wrong...
+  err=noError;
+
+  z3950_server_array::iterator here = zservers.begin();
+  z3950_server_array::iterator end = zservers.end();
+  while (here != end) {
+    if((*here)->getName()==collection) {
+      break;
+    }
+    here++;
+  }
+
+  if (here==end) {
+    err=protocolError;
+    char *coll_str=collection.getcstr();
+    logout << "z39.50: couldn't find collection" 
+	   << coll_str
+	   << endl;
+    delete coll_str;
+    return;
+  }
+
+  const ShortColInfo_t *colinfo=(*here)->getInfo();
+  collectinfo.shortInfo.name=colinfo->name;
+  collectinfo.shortInfo.host=colinfo->host;
+  collectinfo.shortInfo.port=colinfo->port;
+
+  collectinfo.isPublic=true;
+  // don't use beta field
+  /*collectinfo.isBeta=false;*/
+  collectinfo.buildDate=1;
+  // leave ccsCols empty (no cross-coll. searching - for now)
+  /*collectinfo.ccsCols=(text_tarray);*/ //not like this!!!
+  // This info is available from the config file -- johnmcp
+  /*******collectinfo.languages.push_back("en");
+	  collectinfo.languages.push_back("fr");********/
+  collectinfo.numDocs=0;
+  collectinfo.numWords=0;
+  collectinfo.numBytes=0;
+  // copy the text maps over.
+  //  collectinfo.collectionmeta; // text_tmap
+  collectinfo.collectionmeta=*((*here)->getMeta());
+  collectinfo.format=*((*here)->getFormat()); //text_tmap
+  /*    collectinfo.building; //text_tmap  */
+
+  ////collectinfo.receptionist="z3950"; 
+  /* for now... this is a url,  relative to .../cgi-bin.
+     NOTE: if this is empty, it defaults to _gwcgi_?a=p&p=about&c=<colname>
+  */
+}
+
+void z3950proto::get_filterinfo (const text_t &/*collection*/,
+				 InfoFiltersResponse_t &response,
+				 comerror_t &/*err*/, ostream &/*logout*/) {
+  // we'll fake it here, and say we have set up some filters
+  response.filterNames.insert("BrowseFilter");
+  response.filterNames.insert("QueryFilter");
+  response.filterNames.insert("NullFilter");
+
+}
+
+void z3950proto::get_filteroptions (const text_t &/*collection*/,
+				    const InfoFilterOptionsRequest_t &/*req*/,
+				    InfoFilterOptionsResponse_t &response, 
+				    comerror_t &err, ostream &/*logout*/) {
+  // for now, assume all servers have the same characteristics
+  /*  if (request.filterName=="QueryFilter") { } 
+      else if (request.filterName=="BrowseFilter") { } 
+      else if (request.filterName=="NullFilter") {  } */
+  response.filterOptions["Index"].type=FilterOption_t::stringt;
+  response.filterOptions["Index"].repeatable=FilterOption_t::onePerQuery;
+  response.filterOptions["Index"].defaultValue="any";
+  response.filterOptions["Index"].validValues.push_back(".any");
+  response.filterOptions["Index"].validValues.push_back(".title");
+  response.filterOptions["Index"].validValues.push_back(".author");
+  // and maybe ["Language"] option as well?
+  err=noError;
+}
+
+void z3950proto::filter (const text_t &collection,
+			 FilterRequest_t &request,
+			 FilterResponse_t &response,
+			 comerror_t &err, ostream &logout) {
+  // this function is called when:
+  //  *  creating the title page,(looking for iconcoll* & collectname metadata)
+  //  *  creating the about page (looking for "Title" metadata)
+  //  * doing the query - (note that a request for metadata comes first, then
+  // filterOptions = FRmetadata | FROID | FRtermFreq (64+4+1)
+
+  // metadata-only requests have filterName="NullFilter", else "QueryFilter".
+  // For the title page, we should not create a connection to the target
+  // (target means the actual z39.50 server, origin means us), but
+  // for the about page and query pages, we need to get information from the
+  // origin. (eg for the about page, we will print out some info such as ID,
+  // name and version.
+
+  // cerr now goes to errout.txt in etc directory
+  err=noError;
+
+  // get relevant "collection"
+  z3950_server_array::iterator zserver = zservers.begin();
+  z3950_server_array::iterator zend = zservers.end();
+  while (zserver != zend) {
+    if((*zserver)->getName()==collection) {
+      break;
+    }
+    zserver++;
+  }
+  // now have collection in zserver.
+  
+  ColInfoResponse_t info;
+  ResultDocInfo_t *docInfo;
+  
+  // leave response.termInfo empty
+  // response.termInfo.push_back(""); ??????? (should be empty if not req.)
+
+  // See if this is for a query action
+  if (request.filterName=="QueryFilter") {
+    /* Sample OptionValue pairs
+      `StartResults'=`1'
+      `EndResults'=`20'
+      `Term'=`firstword secondword' (term is just whatever the user typed in)
+      `QueryType'=ranked|boolean   -> OR|AND
+      //`MatchMode'=`some' => 'OR'
+      //`MatchMode' = `all' => 'AND'
+      `Casefold'=`true'
+      `Stem'=`false'
+      `Maxdocs'=`50'
+     */
+    // go through options
+    text_t opt_term;            // the term(s) that the user entered 
+    int opt_querytype=0;        // 1=>ranked (or), 2=>boolean (and)
+    text_t opt_fields;          // which fields to search on
+    int opt_start=1, opt_end=20; // default values
+    int nummatches=0, maxdocs=50; // default values
+    OptionValue_tarray::iterator ov_here=request.filterOptions.begin();
+    OptionValue_tarray::iterator ov_end=request.filterOptions.end();
+    while (ov_here != ov_end) {
+      if (ov_here->name=="Term") {
+	opt_term=ov_here->value;
+      } else if (ov_here->name=="QueryType") {
+	if (ov_here->value=="ranked") opt_querytype=1;
+	else if (ov_here->value=="boolean") opt_querytype=2;
+	else { /* error - shouldn't happen */
+	  /* currently unhandled */
+	}
+      } else if (ov_here->name=="Index") {
+	opt_fields=ov_here->value;
+      } else if (ov_here->name=="StartResults") {
+	opt_start=ov_here->value.getint();
+      } else if (ov_here->name=="EndResults") {
+	opt_end=ov_here->value.getint(); 
+      } else if (ov_here->name=="Maxdocs") {
+	maxdocs=ov_here->value.getint();
+      } 
+      ov_here++;
+    }
+    err=noError;
+    text_tarray *titles=(*zserver)->getrecordTitles(opt_term,
+						    opt_querytype,
+						    opt_fields,
+						    opt_start, // first to get
+						    opt_end-opt_start, //count
+						    &nummatches,err);
+    if (err!=noError) {
+      // can we return an err msg in a response, or just use
+      // the more drastic Greenstone error mechanism?
+      docInfo=new ResultDocInfo_t;
+      response.docInfo.push_back(*docInfo);
+      docInfo->metadata["Title"].values.push_back("Error - query err?");
+      logout << "\nz3950 filter query: error connecting to server\n";
+      // for now, DON'T use GSDL protocol err.
+      err=noError;
+      return;
+    }
+    // check if (titles==NULL) - only happens on error?
+    if (nummatches>0) {
+      text_tarray::iterator titles_here=titles->begin();
+      text_tarray::iterator titles_end=titles->end();
+      int counter=1;
+      while (titles_here!=titles_end) {
+	docInfo=new ResultDocInfo_t; 
+	docInfo->metadata["Title"].values.push_back(*titles_here);
+	docInfo->result_num=counter;
+	// we need to give some OID, so we'll just use counter for now...
+	// make it the number into the whole possible retrieved set.
+	docInfo->OID=counter+opt_start-1;
+	response.docInfo.push_back(*docInfo);
+	counter++;
+	titles_here++;
+      }
+    }
+
+    if (request.filterResultOptions & FRtermFreq) {
+      if (nummatches>maxdocs) {
+      	response.numDocs=maxdocs; // eg "more than 50" (if Maxdocs==50)
+	response.isApprox=MoreThan;
+      } else {
+	response.numDocs=nummatches; // eg "36 documents"
+	response.isApprox=Exact; // Exact | Approximate | MoreThan
+      }
+    } // end of if (... & FRtermFreq)
+    
+  } // end of if (... == "QueryFilter")
+  else {
+    // this wasn't a query action
+
+    if (request.filterOptions.size()>0 &&
+	request.filterOptions[0].name=="ParentNode") {
+      // don't want to return anything
+      return;
+      /*    } else if (request.docSet.size() &&
+	    request.docSet[0]!="collection") {
+	    // documentaction
+	    // if docSet is not empty, it is either "collection", or an array
+	    // of OIDs 
+	    docInfo=new ResultDocInfo_t;
+	    response.docInfo.push_back(*docInfo);
+      */
+    } else {
+      // in case we need to return only metadata
+      docInfo=new ResultDocInfo_t;
+      response.docInfo.push_back(*docInfo); 
+    }
+  } // end of not a query action
+
+
+
+  // Fill in metadata for each response.docInfo (if wanted)
+  if (request.filterResultOptions & FRmetadata) {
+    get_collectinfo (collection, info, err, logout);
+    // should check err returned here....
+
+    if (!request.fields.empty()) {
+      // currently, this is only true for NullFilter when getting the "Title"
+      // for a documentaction.
+
+      // loop on each document being returned
+      ResultDocInfo_tarray::iterator docs_here=response.docInfo.begin();
+      ResultDocInfo_tarray::iterator docs_end=response.docInfo.end();
+      while (docs_here!=docs_end) {
+	// loop on all the metadata fields in request.fields (type text_tset)
+	text_tset::iterator fields_here=request.fields.begin();
+	text_tset::iterator fields_end=request.fields.end();
+	text_tmap::iterator it;
+	while (fields_here!=fields_end) {
+	  it=info.collectionmeta.find(*fields_here);
+	  if (it!=info.collectionmeta.end())
+	    docs_here->metadata[*fields_here].values.push_back((*it).second);
+	  else if (*fields_here=="Title" && !request.docSet.empty()) { 
+	    // We only do this for a document action.
+	    // (This comes through as a NullQuery).
+	    // hopefully docSet is only not empty for documentaction...
+	    text_t doctitle;
+	    int i;
+	    // check that docSet isn't empty first!!!!!!
+	    i=request.docSet[0].getint();
+	    text_t doctext="unneeded";
+	    /* following variables aren't used, as our query result has been
+	       cached in z3950server.cpp (but really we shouldn't know that
+	       here...) But for the NullFilter, we don't get given these
+	       again in the request, so for now we'll take advantage of this.*/
+
+	    int querytype=0; text_t field="";
+
+	    // get the Query out of the filterOptions. (we need get the Title)
+	    text_t query="";
+	    OptionValue_tarray::iterator opthere=request.filterOptions.begin();
+	    OptionValue_tarray::iterator opt_end=request.filterOptions.end();
+	    while (opthere!=opt_end) {
+	      if (opthere->name=="Term") {
+		query=opthere->value;
+	      } else if (opthere->name=="Index") {
+		field=opthere->value;
+	      } else if (opthere->name=="QueryType") {
+		if (opthere->value=="ranked") querytype=1;
+		else if (opthere->value=="boolean") querytype=2;
+		else { /* error - shouldn't happen */
+		  /* currently unhandled */
+		}
+	      }
+	      opthere++;
+	    }
+	    (*zserver)->getfullrecord(query, querytype, field, i, doctitle, doctext, err);
+	    // check err value!
+	    docs_here->metadata["Title"].values.push_back(doctitle);	    
+	  } else {
+	    docs_here->metadata[*fields_here].values.push_back("");
+	  }
+	  fields_here++;
+	} // end of inner while loop
+	docs_here++;
+      } // end of outer while loop
+    } // end of if (!request.fields.empty())
+    
+    else { // request.fields empty: return all metadata for about page or query
+      // we'll only put it in the first docInfo.
+      text_tmap::iterator colmeta_here=info.collectionmeta.begin();
+      text_tmap::iterator colmeta_end=info.collectionmeta.end();
+      while (colmeta_here!=colmeta_end) {
+	response.docInfo[0].metadata[(*colmeta_here).first].
+	  values.push_back((*colmeta_here).second);
+	colmeta_here++;
+      }
+
+      // check if "collectionextra" metadata is set. If it isn't, we should
+      // create connection to target to get it.
+      if (info.collectionmeta.find("collectionextra")==colmeta_end) {
+	// it hasn't been set yet...
+	text_t abouttext="<B>Server Online</B><br>\n";
+	abouttext+=(*zserver)->getzAbout();
+	// add in the "About" text we read in from config file.
+	// how do we incorporate multi-lingual metadata?
+	abouttext+="<P>\n";
+	text_t tmpabout;
+
+	if ((*zserver)->getcfgAbout("en", tmpabout)==true)
+	  abouttext+=tmpabout;
+
+	(*zserver)->setMeta("collectionextra",abouttext);
+	response.docInfo[0].metadata["collectionextra"].values.push_back(abouttext);
+      }
+    } // end of else
+
+    // do indices' names, regardless of whether asked for or not...
+    if (!response.docInfo.empty()) {
+     response.docInfo[0].metadata[".author"].values.push_back("author fields");
+      response.docInfo[0].metadata[".title"].values.push_back("title fields");
+      response.docInfo[0].metadata[".any"].values.push_back("any fields");
+    }
+  } //end of  if (... & FRmetadata) ...
+}
+
+
+
+void z3950proto::get_document (const text_t &collection,
+			       const DocumentRequest_t &request,
+			       DocumentResponse_t &response,
+			       comerror_t &err, ostream &logout) {
+
+  err=noError;
+
+  // get relevant "collection"
+  z3950_server_array::iterator zserver = zservers.begin();
+  z3950_server_array::iterator zend = zservers.end();
+  while (zserver != zend) {
+    if((*zserver)->getName()==collection) {
+      break;
+    }
+    zserver++;
+  }
+  // now have collection in zserver.
+
+  /* docresponse consists of
+     text_t response.doc */
+  text_t title="unneeded";
+  text_t doctext;
+  text_t query; // this should not be needed, as we have already connected to 
+  // get the  title....
+  int querytype; //ditto...
+  text_t field;  // ditto...
+  (*zserver)->getfullrecord(query,querytype,field,request.OID.getint(),
+			    title,doctext,err);
+  // check return value of above? (false=>not connected) 
+  if (err==noError)
+    response.doc=doctext;
+  else {
+    // could print out different messages based on error type....
+    response.doc="<h2>Error</h2>There was an error while connecting to the ";
+    response.doc+="z39.50 server (ie target). Most likely this was a \n";
+    response.doc+="\"Connection Refused\" error.\n";
+
+  }
+  if (0) {
+    err=protocolError;
+    logout << "Some error\n";
+  }
+}
Index: /main/tags/2.38/gsdl/src/recpt/z3950proto.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/z3950proto.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/z3950proto.h	(revision 21083)
@@ -0,0 +1,94 @@
+/**********************************************************************
+ *
+ * z3950proto.h --
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef Z3950PROTO_H
+#define Z3950PROTO_H
+
+#include "recptproto.h"
+#include "z3950server.h"
+
+class z3950proto : public recptproto {
+protected:
+  int zserver_count;
+  z3950_server_array zservers;
+public:
+  z3950proto();
+  virtual ~z3950proto();
+
+  int getServerCount() { return zserver_count;}
+  /*
+  void add_collectserver (collectserver *thecserver) 
+        {cservers.addcollectserver(thecserver);}
+  */
+  
+  void add_server(z3950_server& zserver);
+
+  void read_config_file(const text_t &filename, const text_t &errfile);
+
+  void configure (const text_t &key, const text_tarray &cfgline);
+
+  bool init (ostream &logout);
+
+  text_t get_protocol_name (comerror_t &/*err*/) {return "z3950proto";}
+
+  void get_collection_list (text_tarray &collist, comerror_t &err, 
+			    ostream &logout);
+
+  void has_collection (const text_t &collection, bool &hascollection, 
+		       comerror_t &err, ostream &logout);
+  
+  void ping (const text_t &collection, bool &wassuccess, 
+	     comerror_t &err, ostream &logout);
+  
+  void get_collectinfo (const text_t &collection, 
+			ColInfoResponse_t &collectinfo,
+			comerror_t &err, ostream &logout);
+  
+  void get_filterinfo (const text_t &collection,
+		       InfoFiltersResponse_t &response,
+		       comerror_t &err, ostream &logout);
+  
+  /*  void get_info (const text_t &collection, const text_tset &metadata,
+      FilterResponse_t &response, ostream &logout);
+  */
+
+  void get_filteroptions (const text_t &collection,
+                          const InfoFilterOptionsRequest_t &request,
+                          InfoFilterOptionsResponse_t &response, 
+                          comerror_t &err, ostream &logout);
+  
+  void filter (const text_t &collection,
+	       FilterRequest_t &request,
+	       FilterResponse_t &response,
+	       comerror_t &err, ostream &logout);
+  
+  void get_document (const text_t &collection,
+		     const DocumentRequest_t &request,
+		     DocumentResponse_t &response,
+		     comerror_t &err, ostream &logout);
+
+};
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/z3950server.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/z3950server.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/z3950server.cpp	(revision 21083)
@@ -0,0 +1,363 @@
+/**********************************************************************
+ *
+ * z3950server.cpp --
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "z3950server.h"
+#include "comtypes.h"
+#include <stdio.h>
+// z39.50 yaz stuff
+
+extern "C" {
+#include "yaz/yaz_zclient.h"
+}
+
+/*** 
+     each z39.50 server+database pair is a GSDL collection.
+***/
+
+z3950_server::z3950_server() {
+  info=NULL;
+  connected=false;
+  titles=NULL;
+  gotsinglerecord=false;
+  // for now, assume that all records will have text associated with them.
+  meta["hastxt"]="1";
+  // for now, assume we don't want ANY DocumentButtons.
+  format["DocumentButtons"]="";
+}
+
+z3950_server::~z3950_server() {
+}
+
+void z3950_server::setMeta(const text_t &key, const text_t &value) {
+  meta[key]=value;
+}
+
+void z3950_server::setName(const text_t &newname) {
+  title=newname;
+  meta["collectionname"]=newname;
+}
+
+void z3950_server::addcfgAbout(const text_t &lang, const text_t &abouttext) {
+    about[lang]=abouttext;
+}
+
+bool z3950_server::getcfgAbout(const text_t &lang, text_t &abouttxt) {
+  text_tmap::iterator it;
+  it=about.find(lang);
+  if (it==about.end()) return (false);
+  abouttxt=((*it).second);
+  return (true);
+}
+
+
+// now functions that actually talk over the tcp connection.
+
+// create a tcp connection to the associated target. Currently, this will
+// re-initialise if we are already connected.
+bool z3950_server::connect() {
+  text_t server_and_port;
+  char *zserverinfo;
+
+  server_and_port=info->host+":"+info->port;
+  // remember that info.name is the database name
+
+  z_initialize();
+  char* serv_str=server_and_port.getcstr();
+  char* name_str=info->name.getcstr();
+  int retval=z_cmd_open(serv_str,name_str);
+  delete serv_str;
+  delete name_str;
+  if (retval==1)
+    // we got a connection error
+    return false;
+
+  // get initialisation response.
+  z_getnextAPDU();
+  zserverinfo=z_get_initResponse();
+  if (zserverinfo!=NULL) {
+    z_initstr.appendcstr(zserverinfo);
+  }
+  free(zserverinfo);
+
+  connected=true;
+  return true;
+}
+
+void z3950_server::parseQuery(const text_t &query, 
+			      const int querytype,
+			      const text_t &fields,
+			      text_t &parsed_query) {
+  /****** FIXME *****/
+  // We need to format the query string into RPN - 
+  // by just passing it like this, it will only work for simple queries.
+  // This will require us to actually come up with a query syntax and 
+  // a parser. For now, we'll just do an "AND" query for all terms
+  // But look at Common Command Language (CCL) query syntax (ISO 8777).
+
+  // need to remove " chars from the query. We should really tell the server
+  // to do a phrase search on the terms that are between the "s, but we
+  // can't (easily) tell if the server can do that or not, 
+  // so we'll currently just do a query and then post-process. (not yet
+  // implemented........)
+
+  // we need to count number of terms separated by a space
+  char *ptr=query.getcstr();
+  int strlength=strlen(ptr);
+  bool inword=false;
+  int num_terms=0;
+
+
+  for (int i=0;i<strlength;i++) {
+    if (*(ptr+i)=='"') { // convert " to SPACE...
+      *(ptr+i)=' '; 
+    }
+    if (*(ptr+i)!=' ') {
+      if (inword==false) {
+	inword=true;
+	num_terms++;
+      }
+    }
+    else { // ptr+i is a space
+      inword=false;
+      }
+  }
+  
+  // set the field(s) to search on - main ones include:
+  //  1016  => Any
+  //  1     => (Personal) Name
+  //  4     => Title
+  //  21    => Subject Heading
+  //  45    => Subject precis
+  // Note I have no idea how these actually work - I think some servers
+  // only have limited fields, and map all subject-type requests into that
+  // subject field, etc.
+
+  parsed_query="@attr 1=";
+  if (fields==".author")
+    parsed_query+="1 ";
+  else if (fields==".title")
+    parsed_query+="4 ";
+  else // fields==".any"
+    parsed_query+="1016 ";
+
+  // querytype=1 => ranked/or,  =2 => boolean/and
+  // append "@and" for each term after the first
+  {
+    char and_str[]="@and ";
+    char or_str[]="@or ";
+    char *q_type;
+    if (querytype==1) q_type=or_str; else q_type=and_str;
+    for (int i=1;i<num_terms;i++)
+      parsed_query+=q_type;
+    // append the actual query
+    parsed_query+=ptr;
+  }
+  delete ptr;
+}
+
+text_tarray *z3950_server::getrecordTitles(const text_t &query, 
+					   const int querytype,
+					   const text_t &fields,
+					   int first, int count,
+					   int *nummatches, comerror_t &err) {
+  /* NOTE!!!!!! Because this code currently only works in cgi-bin mode,
+     we only ever do one request. Therefore, it is CURRENTLY OK to store
+     (cache) the retrieved titles, because if this function is ever called
+     more than once, the arguments will be the same each time.
+     (I think :)
+  */
+
+  char **c_str_titles; 
+  int i;
+  int last;
+
+  if (gotsinglerecord==true) {
+    /* If true, then this whole execution was done to retrieve a single
+       document. Therefore, the list of titles of all records matching the
+       query isn't actually required. It's just that for some reason our
+       filter (z3950proto::filter) gets called at least 7 times, with the
+       7th being a "QueryFilter" for some reason... */
+    nummatches=0;
+    return NULL; /* shouldn't really return NULL, but nummatches is checked
+		    first (I hope) */
+  }
+
+  //  if (titles!=NULL) delete (titles);
+  if (titles!=NULL) return titles;
+  titles=new text_tarray;
+
+  /* check if connected */
+  if (connected==false) 
+    if (connect()==false) {
+      // we could not connect.
+      err=protocolError;
+      return (NULL);
+    }
+  
+
+  text_t expanded_query="";
+  parseQuery(query,querytype,fields,expanded_query);
+
+  char* query_str=expanded_query.getcstr();
+  // following functions defined in yaz_zclient.c
+  *nummatches=z_cmd_dosearch(query_str); // returns # found, -1 on err.
+  delete query_str;
+  if (*nummatches<=0) {
+    if (*nummatches==0) {
+      // no matches
+      return (NULL);
+    } else  if (*nummatches==-1) {
+      // prefix query error
+      err=protocolError;
+      return (NULL);
+    }  else if (*nummatches==-2) {
+      // sendsearchRequest not answered by searchResponse
+      err=protocolError;
+      return (NULL);
+    }
+  }
+  // could do a sort eventually, eg on date, title, etc.
+  // (non-existent function)    z_sort(field, asc|desc);
+  /* min of (count, first + (*nummatches) ) */
+  // z_getrecordTitles ( first, howmany )
+  c_str_titles=z_getrecordTitles(first,min(count,*nummatches-first+1));
+  if (c_str_titles==NULL) {
+    // an error occurred. we need a logout/err as an arg
+    return (NULL);
+  }
+  if (c_str_titles[0]==0) {
+    // no matches.
+    return (NULL);
+  }
+  last=(int)c_str_titles[0];
+  for (i=1;i<=last;i++) {
+    titles->push_back(c_str_titles[i]);
+    free(c_str_titles[i]);
+  }
+  free(c_str_titles);
+  return (titles);
+  
+}
+
+bool z3950_server::getfullrecord(const text_t &query, 
+				 const int querytype,
+				 const text_t &fields,
+				 const int ID, 
+				 text_t &rettitle, 
+				 text_t &rettext, comerror_t &err) {
+
+  static char **c_str_titles=NULL;
+  static char *fulltext=NULL;
+  /* NOTE!!!!!! Because this code currently only works in cgi-bin mode,
+     we only ever do one request. Therefore, it is CURRENTLY OK to store
+     (cache) the retrieved titles, because if this function is ever called
+     more than once, the arguments will be the same each time.
+     (I think :)
+  */
+
+  gotsinglerecord=true; // well, not yet, but we've been called...
+
+  if (connected==false) {
+    if (connect()==false) {
+      // error connecting...
+      err=protocolError;
+      return (false);
+    }
+    // since we have just re-connected, we need to do the
+    // query again.
+
+    text_t expanded_query="";
+    parseQuery(query,querytype,fields,expanded_query);
+
+    char* query_str=expanded_query.getcstr();
+    int returned=z_cmd_dosearch(query_str);
+    delete query_str;
+    if (returned<=0) {
+      // 0 => none.
+      // <0 => error
+      err=protocolError;
+      return (false);
+    }
+  }
+
+  if (c_str_titles==NULL)
+    c_str_titles=z_getrecordTitles(ID,1); // check this return value.
+  
+  if (rettitle!="unneeded") {
+    //int dummy;
+    if (c_str_titles!=NULL && (int)c_str_titles[0]==1) {
+      rettitle.setcstr(c_str_titles[1]); // and check this 
+      //////      free (c_str_titles); - we want to "cache" it
+    } else {
+      // we didn't get something....
+      rettitle="Nothing Returned...";
+    }
+  }
+
+  if (fulltext==NULL)
+    // get the text
+    fulltext=z_getfullRecord(ID);
+
+  if (rettext!="unneeded") {
+    rettext.setcstr(fulltext);
+  }
+  return (true);
+  }
+
+text_t &z3950_server::getzAbout() {
+  text_t zserverresp;
+
+  // Assume we have not yet connected, so that must be done here.
+  if (connected==true)
+    return (z_initstr);
+  
+  // we need to create the tcp connection to the target (server)  
+  //  z_initstr=new text_t;
+  
+  if (connect()==false) {
+    z_initstr.setcstr("<H2>Server offline</H2>Error - could not connect to server <B>");
+    z_initstr += info->host;
+    z_initstr += "</B> on port ";
+    z_initstr += info->port;
+    z_initstr += "\n";
+    return (z_initstr);
+  }
+  
+  // z_initstr currently contains the target's response. We want to
+  // PREPEND the following information.
+  zserverresp=z_initstr;
+  z_initstr="Internet server: <b>";
+  z_initstr+=info->host;
+  z_initstr+="</b> on port ";
+  z_initstr+=info->port;
+  z_initstr+=".<br>\n";
+  z_initstr+=zserverresp;
+
+  // should close /******* WHAT IF DOING A QUERY!??!?!? ********/
+  // z_cmd_close(0);
+  // connected=false;
+  return (z_initstr);
+}
+
Index: /main/tags/2.38/gsdl/src/recpt/z3950server.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/z3950server.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/z3950server.h	(revision 21083)
@@ -0,0 +1,79 @@
+/**********************************************************************
+ *
+ * z3950server.h --
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef Z3950SERVER_H
+#define Z3050SERVER_H
+
+#include "comtypes.h"
+
+// each "server" (ie collection) consists of a {z39.50 server + database} pair.
+class z3950_server {
+ protected:
+  text_t title;    // Descriptive name
+  text_t z_initstr; // a string returned when the connection is initialised.
+  text_tmap meta;  // metadata for this collection (ie server/database pair)
+  text_tmap format;
+  text_tmap about; // langauge/abouttext pair for collection.
+  ShortColInfo_t *info; // has  (database) name, host and port
+  text_tarray *titles; 
+  bool connect();
+  bool connected; // tcp connection to the z39.50 server (target)
+  bool gotsinglerecord; // if we do, then we don't need all titles...
+
+ public:
+  z3950_server();
+  ~z3950_server();
+  void setName(const text_t &newname);
+  const text_t getName() {return title;}
+  void setMeta(const text_t &key, const text_t &value);
+  const text_tmap *getMeta() {return &meta;}
+  const text_tmap *getFormat() {return &format;}
+  void setInfo(ShortColInfo_t *newinfo) {info=newinfo;}
+  const ShortColInfo_t *getInfo() {return info;}
+  void addcfgAbout(const text_t &lang, const text_t &abouttext);
+  bool getcfgAbout(const text_t &lang, text_t &abouttext);
+  // now the functions that actually talk to the target (ie zserver) over tcp
+  text_t &getzAbout(); // gets any name, id, MOTD, etc from server.
+  text_tarray *getrecordTitles(const text_t &query,
+			       const int andor_querytype,
+			       const text_t &fields,
+			       const int first, const int count,
+			       int *nummatches, comerror_t &err);
+  /* only get one record at a time? (Eventually we could buffer them, but
+     for now... */
+  bool getfullrecord(const text_t &query, const int andor_querytype,
+		     const text_t &fields,
+		     const int ID, text_t &rettitle, 
+		     text_t &rettext,comerror_t &err);
+ private:
+  void parseQuery(const text_t &query, const int andor_querytype, 
+		  const text_t &fields, 
+		  text_t &parsed_query);
+  text_t previousquery; // for caching purposes
+};
+
+typedef  vector<z3950_server *>  z3950_server_array;
+
+#endif
Index: /main/tags/2.38/gsdl/src/recpt/zparse.tab.c
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/zparse.tab.c	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/zparse.tab.c	(revision 21083)
@@ -0,0 +1,1189 @@
+
+/*  A Bison parser, made from zparse.y
+    by GNU Bison version 1.28  */
+
+#define YYBISON 1  /* Identify Bison output.  */
+
+#define	GSDLVERSION	257
+#define	GENERAL_SECTION	258
+#define	SEARCH_SECTION	259
+#define	BROWSE_SECTION	260
+#define	MACROS_SECTION	261
+#define	MAINTAINER	262
+#define	PUBLIC	263
+#define	TRUE	264
+#define	FALSE	265
+#define	LANGUAGES	266
+#define	EN	267
+#define	FR	268
+#define	MI	269
+#define	ZH	270
+#define	DE	271
+#define	NAME	272
+#define	STRING	273
+#define	ICON	274
+#define	SMALLICON	275
+#define	ABOUT	276
+#define	SEARCHTEXT	277
+#define	DOCUMENT	278
+#define	SECTION	279
+#define	BROWSE	280
+#define	TYPE	281
+#define	FORMAT	282
+#define	LIST	283
+#define	SORTEDLIST	284
+#define	SECTIONLIST	285
+#define	SORTEDSECTIONLIST	286
+#define	DATELIST	287
+#define	ICONLINK	288
+#define	TEXTLINK	289
+#define	DOCUMENTIMAGES	290
+#define	DOCUMENTHEADER	291
+#define	DOCUMENTTEXT	292
+#define	DOCUMENTBUTTONS	293
+#define	DOCUMENTARROWSBOTTOM	294
+#define	DATA	295
+
+#line 27 "zparse.y"
+
+  /* verbatim C code - functions, etc */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "z3950cfg.h"
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+/* can't use default yyparse(), as this name is used elsewhere (eg mg)*/
+#define yyin    zconfigin
+#define yyparse zconfigparse
+char defLanguage=0;
+
+/* defined in parse.fl */
+extern int lineno;
+
+#ifndef YYRECOVERING
+int YYRECOVERING=0; /* this is supposed to already be defined as a macro */
+#endif
+
+/* defined in z3950proto.cpp */
+struct z3950cfg *zserver_list=NULL;
+
+/* this is set in z3950proto.cpp */
+FILE *errfile;
+
+int yylex(void);
+
+int yyerror(char *string);
+
+void errormsg(char *str);
+
+
+#line 64 "zparse.y"
+typedef union {
+  char *string;
+  struct z3950cfg *cfg;
+  struct z3950aboutlist *about;
+  int number;
+} YYSTYPE;
+#include <stdio.h>
+
+#ifndef __cplusplus
+#ifndef __STDC__
+#define const
+#endif
+#endif
+
+
+
+#define	YYFINAL		37
+#define	YYFLAG		-32768
+#define	YYNTBASE	44
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 295 ? yytranslate[x] : 56)
+
+static const char yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,    42,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,    43,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     3,     4,     5,     6,
+     7,     8,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    26,
+    27,    28,    29,    30,    31,    32,    33,    34,    35,    36,
+    37,    38,    39,    40,    41
+};
+
+#if YYDEBUG != 0
+static const short yyprhs[] = {     0,
+     0,     3,     5,     7,     8,    11,    13,    22,    24,    26,
+    27,    30,    31,    34,    37,    38,    41,    44,    45,    47,
+    48,    50,    53,    57,    60,    64,    66
+};
+
+static const short yyrhs[] = {    45,
+    46,     0,    45,     0,     3,     0,     0,    46,    47,     0,
+    47,     0,    41,    41,    49,    41,    48,    50,    51,    52,
+     0,     1,     0,    19,     0,     0,    42,    41,     0,     0,
+    20,    19,     0,    20,    41,     0,     0,    21,    19,     0,
+    21,    41,     0,     0,    53,     0,     0,    54,     0,    53,
+    54,     0,    22,    55,    19,     0,    22,    19,     0,    41,
+    43,    41,     0,    41,     0,     1,     0
+};
+
+#endif
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   109,   110,   113,   114,   116,   117,   119,   140,   144,   145,
+   150,   151,   154,   155,   158,   159,   160,   165,   167,   168,
+   170,   172,   175,   186,   208,   216,   224
+};
+#endif
+
+
+#if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
+
+static const char * const yytname[] = {   "$","error","$undefined.","GSDLVERSION",
+"GENERAL_SECTION","SEARCH_SECTION","BROWSE_SECTION","MACROS_SECTION","MAINTAINER",
+"PUBLIC","TRUE","FALSE","LANGUAGES","EN","FR","MI","ZH","DE","NAME","STRING",
+"ICON","SMALLICON","ABOUT","SEARCHTEXT","DOCUMENT","SECTION","BROWSE","TYPE",
+"FORMAT","LIST","SORTEDLIST","SECTIONLIST","SORTEDSECTIONLIST","DATELIST","ICONLINK",
+"TEXTLINK","DOCUMENTIMAGES","DOCUMENTHEADER","DOCUMENTTEXT","DOCUMENTBUTTONS",
+"DOCUMENTARROWSBOTTOM","DATA","':'","'_'","z3950","version","zserverlist","zserver",
+"name","port","icon","smallicon","about","aboutList","aboutLang","lang", NULL
+};
+#endif
+
+static const short yyr1[] = {     0,
+    44,    44,    45,    45,    46,    46,    47,    47,    48,    48,
+    49,    49,    50,    50,    50,    51,    51,    51,    52,    52,
+    53,    53,    54,    54,    55,    55,    55
+};
+
+static const short yyr2[] = {     0,
+     2,     1,     1,     0,     2,     1,     8,     1,     1,     0,
+     2,     0,     2,     2,     0,     2,     2,     0,     1,     0,
+     1,     2,     3,     2,     3,     1,     1
+};
+
+static const short yydefact[] = {     4,
+     3,     0,     8,     0,     0,     6,    12,     5,     0,     0,
+    11,    10,     9,    15,     0,    18,    13,    14,     0,    20,
+    16,    17,     0,     7,    19,    21,    27,    24,    26,     0,
+    22,     0,    23,    25,     0,     0,     0
+};
+
+static const short yydefgoto[] = {    35,
+     2,     5,     6,    14,    10,    16,    20,    24,    25,    26,
+    30
+};
+
+static const short yypact[] = {     4,
+-32768,     0,-32768,   -33,     2,-32768,   -32,-32768,   -30,   -29,
+-32768,   -10,-32768,    -7,   -14,    -6,-32768,-32768,   -13,    -8,
+-32768,-32768,     3,-32768,    -8,-32768,-32768,-32768,   -27,    -2,
+-32768,   -23,-32768,-32768,    19,    20,-32768
+};
+
+static const short yypgoto[] = {-32768,
+-32768,-32768,    16,-32768,-32768,-32768,-32768,-32768,-32768,    -1,
+-32768
+};
+
+
+#define	YYLAST		44
+
+
+static const short yytable[] = {    -2,
+     3,    -1,     3,    27,    17,    21,     1,     7,    13,     9,
+    11,    12,    15,    23,    19,    32,    33,    34,    36,    37,
+     8,    28,     0,    31,     0,     0,    18,    22,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     4,     0,     4,    29
+};
+
+static const short yycheck[] = {     0,
+     1,     0,     1,     1,    19,    19,     3,    41,    19,    42,
+    41,    41,    20,    22,    21,    43,    19,    41,     0,     0,
+     5,    19,    -1,    25,    -1,    -1,    41,    41,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    41,    -1,    41,    41
+};
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/share/bison.simple"
+/* This file comes from bison-1.28.  */
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 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.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+#ifndef YYSTACK_USE_ALLOCA
+#ifdef alloca
+#define YYSTACK_USE_ALLOCA
+#else /* alloca not defined */
+#ifdef __GNUC__
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#else /* not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
+#define YYSTACK_USE_ALLOCA
+#include <alloca.h>
+#else /* not sparc */
+/* We think this test detects Watcom and Microsoft C.  */
+/* This used to test MSDOS, but that is a bad idea
+   since that symbol is in the user namespace.  */
+#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
+#if 0 /* No need for malloc.h, which pollutes the namespace;
+	 instead, just don't use alloca.  */
+#include <malloc.h>
+#endif
+#else /* not MSDOS, or __TURBOC__ */
+#if defined(_AIX)
+/* I don't know what this was needed for, but it pollutes the namespace.
+   So I turned it off.   rms, 2 May 1997.  */
+/* #include <malloc.h>  */
+ #pragma alloca
+#define YYSTACK_USE_ALLOCA
+#else /* not MSDOS, or __TURBOC__, or _AIX */
+#if 0
+#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
+		 and on HPUX 10.  Eventually we can turn this on.  */
+#define YYSTACK_USE_ALLOCA
+#define alloca __builtin_alloca
+#endif /* __hpux */
+#endif
+#endif /* not _AIX */
+#endif /* not MSDOS, or __TURBOC__ */
+#endif /* not sparc */
+#endif /* not GNU C */
+#endif /* alloca not defined */
+#endif /* YYSTACK_USE_ALLOCA not defined */
+
+#ifdef YYSTACK_USE_ALLOCA
+#define YYSTACK_ALLOC alloca
+#else
+#define YYSTACK_ALLOC malloc
+#endif
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		-2
+#define YYEOF		0
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT 	goto yyabortlab
+#define YYERROR		goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL		goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    { yychar = (token), yylval = (value);			\
+      yychar1 = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    { yyerror ("syntax error: cannot back up"); YYERROR; }	\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+#ifndef YYPURE
+#define YYLEX		yylex()
+#endif
+
+#ifdef YYPURE
+#ifdef YYLSP_NEEDED
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, &yylloc, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval, &yylloc)
+#endif
+#else /* not YYLSP_NEEDED */
+#ifdef YYLEX_PARAM
+#define YYLEX		yylex(&yylval, YYLEX_PARAM)
+#else
+#define YYLEX		yylex(&yylval)
+#endif
+#endif /* not YYLSP_NEEDED */
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYPURE
+
+int	yychar;			/*  the lookahead symbol		*/
+YYSTYPE	yylval;			/*  the semantic value of the		*/
+				/*  lookahead symbol			*/
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;			/*  location data for the lookahead	*/
+				/*  symbol				*/
+#endif
+
+int yynerrs;			/*  number of parse errors so far       */
+#endif  /* not YYPURE */
+
+#if YYDEBUG != 0
+int yydebug;			/*  nonzero means print parse trace	*/
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks	*/
+
+#ifndef	YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+
+/* Define __yy_memcpy.  Note that the size argument
+   should be passed with type unsigned int, because that is what the non-GCC
+   definitions require.  With GCC, __builtin_memcpy takes an arg
+   of type size_t, but it can handle unsigned int.  */
+
+#if __GNUC__ > 1		/* GNU C and GNU C++ define this.  */
+#define __yy_memcpy(TO,FROM,COUNT)	__builtin_memcpy(TO,FROM,COUNT)
+#else				/* not GNU C or C++ */
+#ifndef __cplusplus
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (to, from, count)
+     char *to;
+     char *from;
+     unsigned int count;
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#else /* __cplusplus */
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+__yy_memcpy (char *to, char *from, unsigned int count)
+{
+  register char *t = to;
+  register char *f = from;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#endif
+#endif
+
+
+#line 217 "/usr/share/bison.simple"
+
+/* The user can define YYPARSE_PARAM as the name of an argument to be passed
+   into yyparse.  The argument should have type void *.
+   It should actually point to an object.
+   Grammar actions can access the variable by casting it
+   to the proper pointer type.  */
+
+#ifdef YYPARSE_PARAM
+#ifdef __cplusplus
+#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else /* not __cplusplus */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+#endif /* not __cplusplus */
+#else /* not YYPARSE_PARAM */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif /* not YYPARSE_PARAM */
+
+/* Prevent warning if -Wstrict-prototypes.  */
+#ifdef __GNUC__
+#ifdef YYPARSE_PARAM
+int yyparse (void *);
+#else
+int yyparse (void);
+#endif
+#endif
+
+int
+yyparse(YYPARSE_PARAM_ARG)
+     YYPARSE_PARAM_DECL
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;	/*  number of tokens to shift before error messages enabled */
+  int yychar1 = 0;		/*  lookahead token as an internal (translated) token number */
+
+  short	yyssa[YYINITDEPTH];	/*  the state stack			*/
+  YYSTYPE yyvsa[YYINITDEPTH];	/*  the semantic value stack		*/
+
+  short *yyss = yyssa;		/*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;	/*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylsa[YYINITDEPTH];	/*  the location stack			*/
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+
+#define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+  int yyfree_stacks = 0;
+
+#ifdef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;		/*  the variable used to return		*/
+				/*  semantic values from the action	*/
+				/*  routines				*/
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+	 the data in use in that stack, in bytes.  */
+#ifdef YYLSP_NEEDED
+      /* This used to be a conditional around just the two extra args,
+	 but that might be undefined if yyoverflow is a macro.  */
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yyls1, size * sizeof (*yylsp),
+		 &yystacksize);
+#else
+      yyoverflow("parser stack overflow",
+		 &yyss1, size * sizeof (*yyssp),
+		 &yyvs1, size * sizeof (*yyvsp),
+		 &yystacksize);
+#endif
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+	{
+	  yyerror("parser stack overflow");
+	  if (yyfree_stacks)
+	    {
+	      free (yyss);
+	      free (yyvs);
+#ifdef YYLSP_NEEDED
+	      free (yyls);
+#endif
+	    }
+	  return 2;
+	}
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+	yystacksize = YYMAXDEPTH;
+#ifndef YYSTACK_USE_ALLOCA
+      yyfree_stacks = 1;
+#endif
+      yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
+      __yy_memcpy ((char *)yyss, (char *)yyss1,
+		   size * (unsigned int) sizeof (*yyssp));
+      yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
+      __yy_memcpy ((char *)yyvs, (char *)yyvs1,
+		   size * (unsigned int) sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
+      __yy_memcpy ((char *)yyls, (char *)yyls1,
+		   size * (unsigned int) sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+	YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+  goto yybackup;
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)		/* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;		/* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+	{
+	  fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
+	  /* Give the individual parser a way to print the precise meaning
+	     of a token, for further debugging info.  */
+#ifdef YYPRINT
+	  YYPRINT (stderr, yychar, yylval);
+#endif
+	  fprintf (stderr, ")\n");
+	}
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  if (yylen > 0)
+    yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      int i;
+
+      fprintf (stderr, "Reducing via rule %d (line %d), ",
+	       yyn, yyrline[yyn]);
+
+      /* Print the symbols being reduced, and their result.  */
+      for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
+	fprintf (stderr, "%s ", yytname[yyrhs[i]]);
+      fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 1:
+#line 109 "zparse.y"
+{zserver_list=yyvsp[0].cfg;;
+    break;}
+case 2:
+#line 110 "zparse.y"
+{zserver_list=NULL;;
+    break;}
+case 3:
+#line 113 "zparse.y"
+{;;
+    break;}
+case 4:
+#line 114 "zparse.y"
+{fprintf(errfile,"No version - not GSDL config file?\n");return(1);;
+    break;}
+case 5:
+#line 116 "zparse.y"
+{if (yyvsp[0].cfg!=NULL) {yyvsp[0].cfg->next=yyvsp[-1].cfg;yyval.cfg=yyvsp[0].cfg;};
+    break;}
+case 7:
+#line 120 "zparse.y"
+{
+		     if (YYRECOVERING)
+		       {yyval.cfg=NULL;YYRECOVERING=0;} 
+		     else {
+		       if((yyval.cfg=malloc(sizeof(struct z3950cfg)))==NULL)
+			 {
+			   fprintf(errfile,"malloc failed\n");
+			   return(1);
+			 }
+		       yyval.cfg->shortname=yyvsp[-7].string;
+		       yyval.cfg->hostname=yyvsp[-6].string;
+		       yyval.cfg->port=yyvsp[-5].number;
+		       yyval.cfg->dbname=yyvsp[-4].string;
+		       yyval.cfg->longname=yyvsp[-3].string;
+		       yyval.cfg->icon=yyvsp[-2].string;
+		       yyval.cfg->smallicon=yyvsp[-1].string;
+		       yyval.cfg->about=yyvsp[0].about;
+		       yyval.cfg->next=NULL;
+		     }
+		   ;
+    break;}
+case 8:
+#line 140 "zparse.y"
+{yyval.cfg=NULL;
+	      fprintf(errfile,"discarding zserver (line %d)\n",lineno);;
+    break;}
+case 9:
+#line 144 "zparse.y"
+{;;
+    break;}
+case 10:
+#line 145 "zparse.y"
+{errormsg("Database name needs to be followed by a short "
+			  "descriptive name (enclosed in \" marks)");
+	         yyval.string=NULL;
+	         YYRECOVERING=1;;
+    break;}
+case 11:
+#line 150 "zparse.y"
+{yyval.number=atoi(yyvsp[0].string);;
+    break;}
+case 12:
+#line 151 "zparse.y"
+{yyval.number=210;;
+    break;}
+case 13:
+#line 154 "zparse.y"
+{yyval.string=yyvsp[0].string;;
+    break;}
+case 14:
+#line 155 "zparse.y"
+{yyval.string=yyvsp[0].string;
+                  errormsg("Icon must be enclosed in quotes");
+	      yylex();yylex();;
+    break;}
+case 15:
+#line 158 "zparse.y"
+{yyval.string=NULL;;
+    break;}
+case 16:
+#line 159 "zparse.y"
+{yyval.string=yyvsp[0].string;;
+    break;}
+case 17:
+#line 160 "zparse.y"
+{yyval.string=yyvsp[0].string;
+	      /* this is because of the ':' */
+              errormsg("Smallicon must be enclosed in quotes.\n");
+	      yylex();yylex();
+	      ;
+    break;}
+case 18:
+#line 165 "zparse.y"
+{yyval.string=NULL;;
+    break;}
+case 19:
+#line 167 "zparse.y"
+{defLanguage=0;;
+    break;}
+case 20:
+#line 168 "zparse.y"
+{yyval.about=NULL;;
+    break;}
+case 21:
+#line 170 "zparse.y"
+{;;
+    break;}
+case 22:
+#line 172 "zparse.y"
+{yyval.about=yyvsp[0].about;yyvsp[0].about->next=yyvsp[-1].about;;
+    break;}
+case 23:
+#line 176 "zparse.y"
+{
+			       if((yyval.about=malloc(sizeof(struct z3950aboutlist)))
+				  ==NULL) {
+				 fprintf(errfile,"Malloc failed\n");
+				 return(1);
+			       }
+			       yyval.about->lang=yyvsp[-1].string;
+			       yyval.about->text=yyvsp[0].string;
+			       yyval.about->next=NULL;
+			     ;
+    break;}
+case 24:
+#line 187 "zparse.y"
+{
+			       if (defLanguage)
+		                 {
+				   fprintf(errfile,"warning: (line %d): already have a default language in config file\n",lineno);
+				 }
+			       else defLanguage=1;
+			       
+			       if((yyval.about=malloc(sizeof(struct z3950aboutlist)))
+				  ==NULL) {
+				 fprintf(errfile,"Malloc failed\n");
+				 return(1);
+			       }
+			       yyval.about->lang=NULL; /* default lang... */
+			       yyval.about->text=yyvsp[0].string;
+			       yyval.about->next=NULL;
+			     ;
+    break;}
+case 25:
+#line 209 "zparse.y"
+{
+			       yyval.string=malloc(strlen(yyvsp[-2].string)+strlen(yyvsp[0].string)+1);
+			       strncpy(yyval.string,yyvsp[-2].string,strlen(yyvsp[-2].string));
+			       yyval.string[strlen(yyvsp[-2].string)]='_';
+			       strncpy(yyval.string+strlen(yyvsp[-2].string)+1,yyvsp[0].string,strlen(yyvsp[0].string));
+			       free(yyvsp[-2].string);free(yyvsp[0].string);
+			     ;
+    break;}
+case 26:
+#line 216 "zparse.y"
+{;;
+    break;}
+case 27:
+#line 224 "zparse.y"
+{errormsg("missing language");;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 543 "/usr/share/bison.simple"
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+	{
+	  int size = 0;
+	  char *msg;
+	  int x, count;
+
+	  count = 0;
+	  /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
+	  for (x = (yyn < 0 ? -yyn : 0);
+	       x < (sizeof(yytname) / sizeof(char *)); x++)
+	    if (yycheck[x + yyn] == x)
+	      size += strlen(yytname[x]) + 15, count++;
+	  msg = (char *) malloc(size + 15);
+	  if (msg != 0)
+	    {
+	      strcpy(msg, "parse error");
+
+	      if (count < 5)
+		{
+		  count = 0;
+		  for (x = (yyn < 0 ? -yyn : 0);
+		       x < (sizeof(yytname) / sizeof(char *)); x++)
+		    if (yycheck[x + yyn] == x)
+		      {
+			strcat(msg, count == 0 ? ", expecting `" : " or `");
+			strcat(msg, yytname[x]);
+			strcat(msg, "'");
+			count++;
+		      }
+		}
+	      yyerror(msg);
+	      free(msg);
+	    }
+	  else
+	    yyerror ("parse error; also virtual memory exceeded");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror("parse error");
+    }
+
+  goto yyerrlab1;
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+	YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+	fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;		/* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+	fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+	goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+
+ yyacceptlab:
+  /* YYACCEPT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 0;
+
+ yyabortlab:
+  /* YYABORT comes here.  */
+  if (yyfree_stacks)
+    {
+      free (yyss);
+      free (yyvs);
+#ifdef YYLSP_NEEDED
+      free (yyls);
+#endif
+    }
+  return 1;
+}
+#line 233 "zparse.y"
+
+/*int strncasecmp (const char *, const char *,size_t);*/
+int yyerror(char *string) {
+  fprintf(errfile,"Parse error (line %d) near \n\"%s\"<---:%s\n",lineno,
+	  yylval.string,string);
+  return(1);
+}
+
+void errormsg(char *str) {
+  fprintf(errfile,"Err (line %d, near \"%s\"): %s.\n",lineno,
+	  yylval.string,str);
+}
+
+/* *
+int main (int argc, char *argv[]) {
+  if (argc==2)
+    if (argv[1][0]=='-'&&argv[1][1]=='d')
+      yydebug=1;
+
+  yyparse();
+  return(0);
+}
+* */
Index: /main/tags/2.38/gsdl/src/recpt/zparse.tab.h
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/zparse.tab.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/zparse.tab.h	(revision 21083)
@@ -0,0 +1,48 @@
+typedef union {
+  char *string;
+  struct z3950cfg *cfg;
+  struct z3950aboutlist *about;
+  int number;
+} YYSTYPE;
+#define	GSDLVERSION	257
+#define	GENERAL_SECTION	258
+#define	SEARCH_SECTION	259
+#define	BROWSE_SECTION	260
+#define	MACROS_SECTION	261
+#define	MAINTAINER	262
+#define	PUBLIC	263
+#define	TRUE	264
+#define	FALSE	265
+#define	LANGUAGES	266
+#define	EN	267
+#define	FR	268
+#define	MI	269
+#define	ZH	270
+#define	DE	271
+#define	NAME	272
+#define	STRING	273
+#define	ICON	274
+#define	SMALLICON	275
+#define	ABOUT	276
+#define	SEARCHTEXT	277
+#define	DOCUMENT	278
+#define	SECTION	279
+#define	BROWSE	280
+#define	TYPE	281
+#define	FORMAT	282
+#define	LIST	283
+#define	SORTEDLIST	284
+#define	SECTIONLIST	285
+#define	SORTEDSECTIONLIST	286
+#define	DATELIST	287
+#define	ICONLINK	288
+#define	TEXTLINK	289
+#define	DOCUMENTIMAGES	290
+#define	DOCUMENTHEADER	291
+#define	DOCUMENTTEXT	292
+#define	DOCUMENTBUTTONS	293
+#define	DOCUMENTARROWSBOTTOM	294
+#define	DATA	295
+
+
+extern YYSTYPE yylval;
Index: /main/tags/2.38/gsdl/src/recpt/zparse.y
===================================================================
--- /main/tags/2.38/gsdl/src/recpt/zparse.y	(revision 21083)
+++ /main/tags/2.38/gsdl/src/recpt/zparse.y	(revision 21083)
@@ -0,0 +1,255 @@
+/* RUN-TIME CONFIGURATION FILE PARSER */
+/**********************************************************************
+ *
+ * zparse.y --
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+%{
+  /* verbatim C code - functions, etc */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "z3950cfg.h"
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+/* can't use default yyparse(), as this name is used elsewhere (eg mg)*/
+#define yyin    zconfigin
+#define yyparse zconfigparse
+char defLanguage=0;
+
+/* defined in parse.fl */
+extern int lineno;
+
+#ifndef YYRECOVERING
+int YYRECOVERING=0; /* this is supposed to already be defined as a macro */
+#endif
+
+/* defined in z3950proto.cpp */
+struct z3950cfg *zserver_list=NULL;
+
+/* this is set in z3950proto.cpp */
+FILE *errfile;
+
+int yylex(void);
+
+int yyerror(char *string);
+
+void errormsg(char *str);
+
+%}
+
+
+%union {
+  char *string;
+  struct z3950cfg *cfg;
+  struct z3950aboutlist *about;
+  int number;
+}
+
+
+/* keywords */
+/***** NOTE: can explicitly give values for each token, AND
+give a string for the token name eg 
+%token GSDLVERSION 257  "Version"
+*******/
+%token GSDLVERSION 257
+%token GENERAL_SECTION 258 SEARCH_SECTION 259 
+%token BROWSE_SECTION 260 MACROS_SECTION 261
+%token MAINTAINER 262
+%token PUBLIC 263
+%token TRUE 264 FALSE 265
+%token LANGUAGES 266 EN 267 FR 268 MI 269 ZH 270 DE 271
+%token NAME 272
+%token <string> STRING 273
+%token ICON 274 SMALLICON 275
+%token ABOUT 276
+%token SEARCHTEXT 277
+%token DOCUMENT 278 SECTION 279
+%token BROWSE 280 TYPE 281 FORMAT 282
+/* classifiers */
+%token  LIST 283 SORTEDLIST 284 SECTIONLIST 285 SORTEDSECTIONLIST 286 
+%token DATELIST 287
+/* formats */
+%token  ICONLINK 288 TEXTLINK 289
+/* layouts */
+%token  DOCUMENTIMAGES 290 DOCUMENTHEADER 291 DOCUMENTTEXT 292
+%token  DOCUMENTBUTTONS 293 DOCUMENTARROWSBOTTOM 294
+
+/* all other text */
+%token <string> DATA 295
+
+%type <cfg>      zserver zserverlist
+%type <number>  port
+%type <string>   icon smallicon lang name
+%type <about>    about aboutLang aboutList
+%%
+/* grammar */
+z3950         : version zserverlist {zserver_list=$2;}
+              | version {zserver_list=NULL;} /* if all commented out or none... */
+
+
+version       : GSDLVERSION {;}
+              | {fprintf(errfile,"No version - not GSDL config file?\n");return(1);}
+
+zserverlist   : zserverlist zserver {if ($2!=NULL) {$2->next=$1;$$=$2;}}
+              | zserver ;
+
+zserver       : DATA DATA port DATA name icon smallicon about 
+                   {
+		     if (YYRECOVERING)
+		       {$$=NULL;YYRECOVERING=0;} 
+		     else {
+		       if(($$=malloc(sizeof(struct z3950cfg)))==NULL)
+			 {
+			   fprintf(errfile,"malloc failed\n");
+			   return(1);
+			 }
+		       $$->shortname=$1;
+		       $$->hostname=$2;
+		       $$->port=$3;
+		       $$->dbname=$4;
+		       $$->longname=$5;
+		       $$->icon=$6;
+		       $$->smallicon=$7;
+		       $$->about=$8;
+		       $$->next=NULL;
+		     }
+		   }
+              | error {$$=NULL;
+	      fprintf(errfile,"discarding zserver (line %d)\n",lineno);}
+              ;
+
+name          : STRING {;}
+              | {errormsg("Database name needs to be followed by a short "
+			  "descriptive name (enclosed in \" marks)");
+	         $$=NULL;
+	         YYRECOVERING=1;} /* we should scrap this server */
+
+port          : ':' DATA {$$=atoi($2);}
+              | {$$=210;} /* default z39.50 server port */
+              ;
+
+icon          : ICON STRING {$$=$2;}
+              | ICON DATA {$$=$2;
+                  errormsg("Icon must be enclosed in quotes");
+	      yylex();yylex();}
+              | {$$=NULL;}
+smallicon     : SMALLICON STRING {$$=$2;}
+              | SMALLICON DATA {$$=$2;
+	      /* this is because of the ':' */
+              errormsg("Smallicon must be enclosed in quotes.\n");
+	      yylex();yylex();
+	      }
+              | {$$=NULL;}
+
+about         : aboutList {defLanguage=0;}
+              | {$$=NULL;}
+
+aboutList     : aboutLang {;}
+                      /* note this action reverses the order of the list */
+              | aboutList aboutLang {$$=$2;$2->next=$1;} 
+
+
+aboutLang     : ABOUT lang STRING 
+                             {
+			       if(($$=malloc(sizeof(struct z3950aboutlist)))
+				  ==NULL) {
+				 fprintf(errfile,"Malloc failed\n");
+				 return(1);
+			       }
+			       $$->lang=$2;
+			       $$->text=$3;
+			       $$->next=NULL;
+			     }
+              | ABOUT STRING 
+                             {
+			       if (defLanguage)
+		                 {
+				   fprintf(errfile,"warning: (line %d): already have a default language in config file\n",lineno);
+				 }
+			       else defLanguage=1;
+			       
+			       if(($$=malloc(sizeof(struct z3950aboutlist)))
+				  ==NULL) {
+				 fprintf(errfile,"Malloc failed\n");
+				 return(1);
+			       }
+			       $$->lang=NULL; /* default lang... */
+			       $$->text=$2;
+			       $$->next=NULL;
+			     }
+/* this can only happen once (default lang) */
+
+
+/* languages should be done using a lookup, rather than hard-coding 
+   them as tokens. Also '_' token for en_BR */
+lang          : DATA '_' DATA 
+                             {
+			       $$=malloc(strlen($1)+strlen($3)+1);
+			       strncpy($$,$1,strlen($1));
+			       $$[strlen($1)]='_';
+			       strncpy($$+strlen($1)+1,$3,strlen($3));
+			       free($1);free($3);
+			     }
+              | DATA {;}
+/*lang '_' DATA {;} */
+/*              | EN {;}
+		| FR {;}
+		| MI {;}
+		| ZH {;}
+		| DE {;}
+		| DATA {errormsg("unknown language");}*/
+              | error {errormsg("missing language");}
+
+/*documentHeader : DOCUMENTHEADER STRING {;}
+              | {;}
+
+documentText  : DOCUMENTTEXT STRING {;}
+              | {;}
+*/
+
+%%
+/*int strncasecmp (const char *, const char *,size_t);*/
+int yyerror(char *string) {
+  fprintf(errfile,"Parse error (line %d) near \n\"%s\"<---:%s\n",lineno,
+	  yylval.string,string);
+  return(1);
+}
+
+void errormsg(char *str) {
+  fprintf(errfile,"Err (line %d, near \"%s\"): %s.\n",lineno,
+	  yylval.string,str);
+}
+
+/* *
+int main (int argc, char *argv[]) {
+  if (argc==2)
+    if (argv[1][0]=='-'&&argv[1][1]=='d')
+      yydebug=1;
+
+  yyparse();
+  return(0);
+}
+* */
Index: /main/tags/2.38/gsdl/src/setpasswd/setpasswd.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/setpasswd/setpasswd.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/setpasswd/setpasswd.cpp	(revision 21083)
@@ -0,0 +1,176 @@
+/**********************************************************************
+ *
+ * setpasswd.cpp -- 
+ * Copyright (C) 2000  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+// setpasswd is a windows application that can be used to encrypt a password
+// and write it (along with its corresponding username) to a gdbm database.
+
+// it handles writing to the gdbm database itself to avoid having to call
+// the txt2db console application (and therefore avoiding the console
+// window popping up when called from another windows application).
+
+// note that setpasswd does no checking to make sure that any of it's
+// input arguments are valid (or even reasonable) values.
+
+// this program should be compiled into a binary called setpw.exe (to be
+// short enough not to mess with 16 bit Windows platforms).
+
+// usage:
+// setpw -u username -p password -o output_gdbm_file
+
+#include "text_t.h"
+#include "crypt.h"
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+
+#include <windows.h>
+
+text_t username;
+text_t password;
+text_t output_gdbm_file;
+
+bool parse_cmdline (LPSTR cmdline) {
+
+  bool in_quote = false;
+  text_t arg;
+  text_tarray args;
+  unsigned char *c = (unsigned char *)cmdline;
+  while (*c != '\0') {
+    if (*c == '"') {
+      if (!in_quote) {
+	in_quote = true;
+      } else {
+	in_quote = false;
+	if (!arg.empty()) args.push_back (arg);
+	arg.clear();
+      }
+    } else if (*c == ' ' && !in_quote) {
+      if (!arg.empty()) args.push_back (arg);
+      arg.clear();
+    } else {
+      arg.push_back (*c);
+    }
+    c ++;
+  }
+  if (!arg.empty()) args.push_back (arg);
+  
+  text_tarray::const_iterator here = args.begin();
+  text_tarray::const_iterator end = args.end();
+  while (here != end) {
+    if (*here == "-u" && (++here != end)) username = *here;
+    else if (*here == "-p" && (++here != end)) password = *here;
+    else if (*here == "-o" && (++here != end)) output_gdbm_file = *here;
+    if (here != end) here ++;
+  }
+  if (username.empty() || password.empty() || output_gdbm_file.empty()) {
+    MessageBox (NULL, "Usage:\n setpasswd -u username -p password -o output_gdbm_file", 
+		"setpasswd failed", MB_OK);
+    return false;
+  }
+  return true;
+}
+
+text_t crypt_text (const text_t &text) {
+  static const char *salt = "Tp";
+  text_t crypt_password;
+
+  if (text.empty()) return "";
+
+  // encrypt the password
+  char *text_cstr = text.getcstr();
+  if (text_cstr == NULL) return "";
+  crypt_password = crypt(text_cstr, salt);
+  delete text_cstr;
+
+  return crypt_password;
+}
+
+bool add_to_db () {
+
+  int block_size = 0;
+  GDBM_FILE dbf;
+  char *dbname = output_gdbm_file.getcstr();
+
+  // open the database
+  int read_write = GDBM_WRCREAT;
+  dbf = gdbm_open (dbname, block_size, read_write, 00664, NULL, 1);
+  if (dbf == NULL) {
+    MessageBox (NULL, "gdbm_open failed\n", "setpasswd", MB_OK);
+    return false;
+  }
+
+  datum key_data;
+  key_data.dptr = username.getcstr();
+  if (key_data.dptr == NULL) {
+    MessageBox (NULL, "null key_data\n", "setpasswd", MB_OK);
+    return false;
+  }
+  key_data.dsize = strlen(key_data.dptr);
+
+  text_t value = "<comment>\n";
+  value += "<enabled>true\n";
+  value += "<groups>administrator,colbuilder\n";
+  value += "<password>" + password + "\n";
+  value += "<username>" + username + "\n";
+      
+  datum value_data;
+  value_data.dptr = value.getcstr();
+  if (value_data.dptr == NULL) {
+    MessageBox (NULL, "null value_data\n", "setpasswd", MB_OK);
+    return false;
+  }
+  value_data.dsize = strlen(value_data.dptr);
+      
+  // store the value
+  if (gdbm_store (dbf, key_data, value_data, GDBM_REPLACE) < 0) {
+    MessageBox (NULL, "gdbm_store failed\n", "setpasswd", MB_OK);
+    return false;
+  }
+  gdbm_close (dbf);
+
+  delete key_data.dptr;
+  delete value_data.dptr;
+  delete dbname;
+  return true;
+}
+
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
+                     LPSTR lpCmdLine, int nCmdShow) {
+
+  // parse command line arguments
+  if (!parse_cmdline (lpCmdLine)) return 1;
+
+  // encrypt the password
+  password = crypt_text (password);
+
+  // append the password and username to database
+  add_to_db();
+  
+  return 0;
+}
+
+
+
Index: /main/tags/2.38/gsdl/src/txt2db/Makefile.in
===================================================================
--- /main/tags/2.38/gsdl/src/txt2db/Makefile.in	(revision 21083)
+++ /main/tags/2.38/gsdl/src/txt2db/Makefile.in	(revision 21083)
@@ -0,0 +1,97 @@
+###########################################################################
+#
+# Makefile -- Makefile for txt2db
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999 Rodger McNab, Stefan Boddie
+#
+# 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.
+#
+#       @(#)Makefile.in	1.3 16 Mar 1994
+#
+###########################################################################
+
+ 
+AR = ar
+CC = @CC@
+CPP = @CXX@
+CCFLAGS = -Wall @CFLAGS@
+DEFS = @DEFS@
+RANLIB = @RANLIB@
+INCLUDES = -I../../lib @GDBM_INCLUDE@
+LDFLAGS = @LDFLAGS@ 
+DPLIBS = ../../lib/gsdllib.a ../../packages/mg/lib/unitool.o
+LIBS = ../../lib/gsdllib.a ../../packages/mg/lib/unitool.o @GDBM_LIBPATH@ -lgdbm @LIBS@
+GSDLOS = @gsdlos@
+INSTALL = @INSTALL@
+ 
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CCFLAGS)
+CPPCOMPILE = $(CPP) -c $(DEFS) $(INCLUDES) $(CCFLAGS)
+MCOMPILE = ../../bin/linux/mico-c++ $(MCFLAGS) $(DEFS) $(MINCLUDES) -c
+LINK = $(CC) $(LDFLAGS) -o $@
+MLINK = ../../bin/linux/mico-ld $(LDFLAGS) -lmico2.2.7 -o $@
+CPPLINK = $(CPP) $(LDFLAGS) -o $@
+ 
+.SUFFIXES:
+.SUFFIXES: .c .o
+.c.o:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .o
+.cpp.o:
+	$(CPPCOMPILE) $< 
+ 
+.SUFFIXES: .mpp .o
+.mpp.o:
+	$(MCOMPILE) $<
+
+HEADERS = 
+
+SOURCES = txt2db.cpp
+
+OBJECTS = txt2db.o
+
+EXEC    = txt2db
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	$(INSTALL) -d ../../bin/$(GSDLOS)
+	$(INSTALL) -m 755 -s $(EXEC) ../../bin/$(GSDLOS)
+
+distclean:
+	rm -f $(OBJECTS) $(EXEC) Makefile
+
+clean:
+	rm -f $(OBJECTS) $(EXEC)
+
+depend:
+	makedepend -Y -- $(DEFS) $(INCLUDES) $(CCFLAGS) -- $(SOURCES)
+
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+TXT2DB_OBJS = txt2db.o
+
+txt2db: $(TXT2DB_OBJS) $(DPLIBS)
+	$(LINK) $(TXT2DB_OBJS) $(LIBS)
+
+
+
+
+
+
Index: /main/tags/2.38/gsdl/src/txt2db/txt2db.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/txt2db/txt2db.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/txt2db/txt2db.cpp	(revision 21083)
@@ -0,0 +1,171 @@
+/**********************************************************************
+ *
+ * txt2db.cpp -- 
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the 
+ * University of Waikato, New Zealand.
+ *
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ * 
+ * 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.
+ *
+ **********************************************************************/
+
+
+#ifdef __WIN32__
+#include "autoconf.h"
+#include "systems.h"
+#include "gdbmconst.h"
+#include "gdbm.h"
+
+#else
+#include <gdbm.h>
+#endif
+
+#include "gsdlconf.h"
+#include "text_t.h"
+#include <stdlib.h>
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\iostream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <iostream.h>
+#else
+#  include <iostream>
+#endif
+
+
+void print_usage (char *program_name) {
+  cerr << "usage: " << program_name << " [options] database-name\n\n";
+  cerr << "options:\n";
+  cerr << " -append        append to existing database\n\n";
+}
+
+
+int main (int argc, char *argv[]) {
+  int block_size = 0;
+  GDBM_FILE dbf;
+  char c;
+  text_t key;
+  text_t value;
+  text_t tmp;
+  int num_dashes = 0;
+
+  // sanity check
+  if (argc != 2 && argc != 3) {
+    print_usage (argv[0]);
+    exit (0);
+  }
+  
+  char *dbname;
+  int append = 0;
+  if (argc == 3) {
+    if (strcmp (argv[1], "-append") == 0) {
+      append = 1;
+      dbname = argv[2];
+    } else {
+      cerr << argv[1] << " is not a valid option.\n\n";
+      print_usage (argv[0]);
+      exit (0);
+    }
+  } else dbname = argv[1];
+
+  
+  // open the database
+  // note that GDBM_FAST is obsolete on newer versions of gdbm
+  int read_write = GDBM_NEWDB | GDBM_FAST;
+  if (append) read_write = GDBM_WRCREAT | GDBM_FAST;
+  
+#ifdef __WIN32__
+  dbf = gdbm_open (dbname, block_size, read_write, 00664, NULL, 1);
+#else
+  dbf = gdbm_open  (dbname, block_size, read_write, 00664, NULL);
+#endif
+  if (dbf == NULL) {
+    cerr << "couldn't create " << dbname << "\n";
+    exit (0);
+  }
+  
+  cin.get(c);
+  while (!cin.eof()) {
+    num_dashes = 0;
+    key = "";
+    value = "";
+    
+    // look for [key]\n
+    while (!cin.eof() && c != '[') cin.get(c);
+    if (!cin.eof()) cin.get(c); // skip [
+    while (!cin.eof() && c != ']') {
+      key.push_back ((unsigned char)c);
+      cin.get(c);
+    }
+    if (!cin.eof()) cin.get(c); // skip ]
+    while (!cin.eof() && (c == '\n' || c == 'r')) cin.get(c);
+    
+    // look for 70 dashes
+    tmp = "";
+    while (!cin.eof() && (num_dashes < 70)) {
+      if (c == '\n' || c == '\r') {
+	tmp.push_back ((unsigned char)c);
+	num_dashes = 0;
+	
+      } else if (c == '-') {
+	tmp.push_back ((unsigned char)c);
+	num_dashes++;
+	
+      } else {
+	value += tmp;
+	value.push_back ((unsigned char)c);
+	tmp = "";
+	num_dashes = 0;
+      }
+      cin.get(c);
+    }
+    
+    // if the key is not an empty string store this key-value pair
+    if (!key.empty()) {
+      // convert key to a datum datatype
+      datum key_data;
+      key_data.dptr = key.getcstr();
+      if (key_data.dptr == NULL) {
+	cerr << "NULL key_data.dptr\n";
+	exit (0);
+      }
+      key_data.dsize = strlen(key_data.dptr);
+      
+      // convert value to a datum datatype
+      datum value_data;
+      value_data.dptr = value.getcstr();
+      if (value_data.dptr == NULL) {
+	cerr << "NULL value_data.dptr\n";
+	exit (0);
+      }
+      value_data.dsize = strlen(value_data.dptr);
+      
+      // store the value
+      if (gdbm_store (dbf, key_data, value_data, GDBM_REPLACE) < 0) {
+	cerr << "gdbm_store returned an error\n";
+	exit (0);
+      }
+      
+      delete key_data.dptr;
+      delete value_data.dptr;
+    }
+  }
+  
+  gdbm_close (dbf);
+  
+  return 0;
+}
Index: /main/tags/2.38/gsdl/src/txt2db/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/txt2db/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/txt2db/win32.mak	(revision 21083)
@@ -0,0 +1,78 @@
+###########################################################################
+#
+# win32 makefile -- txt2db
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..
+USE_STLPORT = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+CPPFLAGS = 
+LDFLAGS =
+
+DEFS = -D__WIN32__ -DHAVE_CONFIG_H
+INCLUDES = -I"$(GSDLHOME)\src\txt2db" -I"$(GSDLHOME)\lib" -I"$(GSDLHOME)\packages\mg\lib" \
+	   -I"$(GSDLHOME)\packages\windows\gdbm\gdbm"
+!IF $(USE_STLPORT)
+DEFS=$(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LIBS = "$(GSDLHOME)\packages\mg\lib\unitool.obj" "$(GSDLHOME)\lib\gsdllib.lib" \
+       "$(GSDLHOME)\packages\windows\gdbm\gdbm\gdbm.lib"
+
+COMPILE = $(CC) -c -GX $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS)
+
+.SUFFIXES:
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $<
+
+ANSI2KNR = 
+o = .obj
+e = .exe
+ 
+HEADERS = 
+
+SOURCES = txt2db.cpp
+
+OBJECTS = txt2db$o
+
+EXEC = txt2db$e
+ 
+all : $(EXEC)
+
+install: $(EXEC)
+	if NOT EXIST "$(GSDLHOME)\bin\windows" mkdir "$(GSDLHOME)\bin\windows"
+	copy $(EXEC) "$(GSDLHOME)\bin\windows"
+
+clean:
+	del *.obj
+	del $(EXEC)
+
+txt2db$e: $(OBJECTS) $(LIBS)
+	  $(LINK) $(OBJECTS) $(LIBS)
Index: /main/tags/2.38/gsdl/src/w32server/cgiwrapper.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/cgiwrapper.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/cgiwrapper.cpp	(revision 21083)
@@ -0,0 +1,868 @@
+/**********************************************************************
+ *
+ * cgiwrapper.cpp -- windows local library cgiwrapper
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+
+#include <windows.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include <direct.h>
+#include "cgiwrapper.h"
+#include "netio.h"
+#include "wincgiutils.h"
+#include "settings.h"
+#include "fileutil.h"
+
+#include "gsdlconf.h"
+#include "recptconfig.h"
+
+#if defined (GSDL_USE_OBJECTSPACE)
+#include <ospace\std\iostream>
+#include <ospace\std\fstream>
+#elif defined (GSDL_USE_IOS_H)
+#include <iostream.h>
+#include <fstream.h>
+#else
+#include <iostream>
+#include <fstream>
+#endif
+
+#include "receptionist.h"
+#include "nullproto.h"
+
+// actions
+#include "statusaction.h"
+#include "pageaction.h"
+#include "pingaction.h"
+#include "queryaction.h"
+#include "documentaction.h"
+#include "tipaction.h"
+#include "authenaction.h"
+#include "usersaction.h"
+#include "extlinkaction.h"
+#include "collectoraction.h"
+#include "phindaction.h"
+
+// browsers
+#include "vlistbrowserclass.h"
+#include "hlistbrowserclass.h"
+#include "datelistbrowserclass.h"
+#include "invbrowserclass.h"
+#include "pagedbrowserclass.h"
+#include "htmlbrowserclass.h"
+#include "phindbrowserclass.h"
+
+// the number of times the library has been accessed
+int libaccessnum = 0;
+
+// used to output the text from receptionist
+class textstreambuf : public streambuf
+{
+public:
+  textstreambuf ();
+  int sync ();
+  int overflow (int ch);
+  int underflow () {return EOF;}
+  
+  void tsbreset() {RInfo=NULL;casostr=NULL;}
+  void setrequestinfo (RequestInfoT *theRInfo) {RInfo=theRInfo;}
+  void cascadeoutput (ostream *thecasostr) {casostr=thecasostr;}
+  
+private:
+  RequestInfoT *RInfo;
+  ostream *casostr;
+#if !defined (GSDL_USE_IOS_H)
+  char buffer[256];
+#endif
+};
+
+textstreambuf::textstreambuf() {
+  tsbreset();
+#if !defined (GSDL_USE_IOS_H)
+  setp (&buffer[0], &buffer[255]);
+#else
+  if (base() == ebuf()) allocate();
+  setp (base(), ebuf());
+#endif
+};
+
+int textstreambuf::sync () {
+  if ((RInfo != NULL) && 
+      (Send_String_N(pbase(), pptr()-pbase(), RInfo) < 0)) {
+    RInfo = NULL;
+  }
+  
+  if (casostr != NULL) {
+    char *thepbase=pbase();
+    for (int i=0;i<(pptr()-pbase());i++) (*casostr).put(thepbase[i]);
+  }
+  
+  setp (pbase(), epptr());
+  
+  return 0;
+}
+
+int textstreambuf::overflow (int ch) {
+  if (sync () == EOF) return EOF;
+  if (ch != EOF) sputc (ch);
+  return 0;
+}
+
+
+// used to output all the log and error messages
+// from receptionist
+class logstreambuf : public streambuf
+{
+public:
+  logstreambuf ();
+  int sync ();
+  int overflow (int ch);
+  int underflow () {return EOF;}
+
+#if !defined (GSDL_USE_IOS_H)
+private:
+  char buffer[256];
+#endif
+};
+
+logstreambuf::logstreambuf () {
+#if !defined (GSDL_USE_IOS_H)
+  setp (&buffer[0], &buffer[255]);
+#else
+  if (base() == ebuf()) allocate();
+  setp (base(), ebuf());
+#endif
+}
+
+int logstreambuf::sync () {
+  if (gsdl_keep_log || gsdl_show_console) {
+    log_message ("LOCAL LIB MESSAGE: ");
+		log_message_N (pbase(), pptr()-pbase());
+  }
+
+  setp (pbase(), epptr());
+  return 0;
+}
+
+int logstreambuf::overflow (int ch) {
+  if (sync () == EOF) return EOF;
+  if (ch != EOF) sputc (ch);
+  return 0;
+}
+
+receptionist recpt;
+nullproto nproto;
+textstreambuf textstream;
+logstreambuf logstream;
+DWORD lastlibaccesstime;
+DWORD baseavailvirtual;
+text_t current_gsdlhome;
+colinfo_tmap translated_collectinfo;
+
+static void page_errormaincfg (const text_t &gsdlhome, const text_t &collection) {
+
+  if (collection.empty()) {
+    text_t message = "Error\n\n"
+      "The main.cfg configuration file could not be found. This file\n"
+      "should contain configuration information relating to the\n"
+      "setup of the interface. As this program is not being run\n"
+      "in collection specific mode the file should reside at\n" +
+      gsdlhome + "\\etc\\main.cfg.\n";
+
+    MessageBox(NULL, message.getcstr(),
+	       "Greenstone Digital Library Software"
+	       ,MB_OK|MB_SYSTEMMODAL);
+  } else {
+    text_t message = "Neither the collect.cfg or main.cfg configuration files could\n"
+      "be found. This file should contain configuration information\n"
+      "relating to the setup of the interface. As this cgi script is\n"
+      "being run in collection specific mode the file should reside\n"
+      "at either " + gsdlhome + "\\collect\\" + collection + "\\etc\\collect.cfg,\n" +
+      gsdlhome + "\\etc\\collect.cfg or " + gsdlhome + "\\etc\\main.cfg.\n";
+
+    MessageBox(NULL, message.getcstr(),
+	       "Greenstone Digital Library Software"
+	       ,MB_OK|MB_SYSTEMMODAL);
+  }
+}
+
+static void page_errorinit (const text_t &/*gsdlhome*/) {
+
+  text_t message = "Error\n\n"
+    "An error occurred during the initialisation of the Greenstone Digital\n"
+    "Library software. It is likely that the software has not been setup\n"
+    "correctly.\n";
+
+  MessageBox(NULL, message.getcstr(),
+	     "Greenstone Digital Library Software"
+	     ,MB_OK|MB_SYSTEMMODAL);
+}
+
+static void page_errorparseargs (const text_t &/*gsdlhome*/) {
+
+  text_t message = "Error\n\n"
+    "An error occurred during the parsing of the cgi arguments.\n";
+
+  MessageBox(NULL, message.getcstr(),
+	     "Greenstone Digital Library Software"
+	     ,MB_OK|MB_SYSTEMMODAL);
+}
+
+static void page_errorcgipage (const text_t &/*gsdlhome*/) {
+
+  text_t message = "Error\n\n"
+    "An error occurred during the construction of the cgi page.\n";
+
+  MessageBox(NULL, message.getcstr(),
+	     "Greenstone Digital Library Software"
+	     ,MB_OK|MB_SYSTEMMODAL);
+}
+
+// returns 0 if the directories can't be found
+// and the user wants to quit (it returns 1
+// if everything is ok)
+int checkdir (const text_t &thedir) {
+  UINT curerrormode;
+  int drive = _getdrive();
+  char cwd[1024];
+  char rootpath[4];
+  UINT drivetype;
+  char *cstrthedir = thedir.getcstr();
+  int returnvalue = 1;
+  
+  // make sure no rude error messages are presented to the user
+  curerrormode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+  
+  // get the drive name
+  if (thedir.size() >= 2 && thedir[1] == ':') {
+    if (thedir[0] >= 'a' && thedir[0] <= 'z') {
+      drive = thedir[0] - 'a' + 1;
+      
+    } else if (thedir[0] >= 'A' && thedir[0] <= 'Z') {
+      drive = thedir[0] - 'A' + 1;
+    }
+  }
+  
+  // find the drive type
+  rootpath[0] = drive + 'A' - 1;
+  rootpath[1] = ':';
+  rootpath[2] = '\\';
+  rootpath[3] = '\0';
+  drivetype = GetDriveType (rootpath);
+  
+  // try and set this directory to be the current working
+  // directory
+  _getcwd(cwd, 1024);
+  while (_chdir(cstrthedir) != 0) {
+    // failed
+    if (drivetype == DRIVE_CDROM) {
+      // message to insert the cdrom
+      if (MessageBox (NULL, 
+		      "Please insert the Greenstone Digital Library\n"
+		      "CD-ROM into the CD-ROM drive and press 'OK'.\n\n"
+		      "If you don't have the CD-ROM press 'Cancel' to exit\n"
+		      "this program.", "Greenstone Digital Library Software", 
+		      MB_OKCANCEL | MB_TASKMODAL) == IDCANCEL) {
+	
+	returnvalue = 0;
+	break;
+      }
+      
+    } else {
+      // message saying that the system was unable
+      // to find a certain directory
+      text_t message = "Failed to find the directory:\n\n" + thedir;
+      message += "\n\n"
+	"This directory is needed for the successful operation\n"
+	"of this software. Make sure it hasn't been deleted or\n"
+	"moved, and restart the software. You may need to\n"
+	"reinstall this software to correct the problem.";
+      char *cstrmessage = message.getcstr();
+      
+      MessageBox (NULL, cstrmessage, "Greenstone Digital Library Software",
+		  MB_OK | MB_TASKMODAL);
+      
+      delete cstrmessage;
+      
+      returnvalue = 0;
+      break;
+    }
+  }
+  
+  // revert to the previous error and cwd states
+  _chdir(cwd);
+  SetErrorMode(curerrormode);
+  
+  // free the allocated C string
+  delete cstrthedir;
+  
+  return returnvalue;
+}
+
+
+// c-string version of checkdir for the outside
+// world
+int cstrcheckdir (char *cstrthedir) {
+  return checkdir (cstrthedir);
+}
+
+
+// returns 1 if successful, 0 if unsuccessful
+int gsdl_init () {
+#if defined (GSDL_USE_IOS_H)
+  cerr = &logstream;
+  cout = &textstream;
+#else
+  cerr.rdbuf(&logstream);
+  cout.rdbuf(&textstream);
+#endif
+
+  // collection should be set to "" unless in collection specific mode -
+  // changing this to the name of the collection should be all that's
+  // required to create a collection specific receptionist
+  text_t collection = "";
+  text_tset gdbmhomes;
+  text_tset collections;
+
+  // note the current time
+  lastlibaccesstime = GetTickCount();
+
+  // before we do the init we should make sure
+  // that we can find the relevant directories
+  if (!checkdir (gsdl_gsdlhome + "\\")) return 0;
+  if (!checkdir (gsdl_gsdlhome + "\\macros\\")) return 0;
+
+  collectset *cservers = new collectset();
+
+  // get all collections from each gsdlhome (this relies 
+  // on there not being more than one collection with the same 
+  // name)
+
+  if (!collection.empty()) {
+    // collection specific receptionist - one collection, one gsdlhome
+    collections.insert (collection);
+    gdbmhomes.insert (gsdl_gdbmhome);
+    collectioninfo_t tmp;
+    tmp.gsdl_gsdlhome = gsdl_gsdlhome;
+    tmp.gsdl_gdbmhome = gsdl_gdbmhome;
+    translated_collectinfo[collection] = tmp;
+
+  } else {
+
+    text_tset::const_iterator colhere;
+    text_tset::const_iterator colend;
+    text_tset these_collections;
+
+    // first volume gsdlhome's
+    colinfo_tmap::const_iterator this_info = gsdl_collectinfo.begin();
+    colinfo_tmap::const_iterator end_info = gsdl_collectinfo.end();
+    while (this_info != end_info) {
+      if (gdbmhomes.find ((*this_info).second.gsdl_gdbmhome) == gdbmhomes.end()) {
+	these_collections.erase (these_collections.begin(), these_collections.end());
+	read_dir (filename_cat ((*this_info).second.gsdl_gsdlhome, "collect"), these_collections);
+	colhere = these_collections.begin();
+	colend = these_collections.end();
+	while (colhere != colend) {
+	  if ((collections.find (*colhere)) == collections.end()) {
+	    // make sure the build.cfg file is at gsdlhome (as it's possible that
+	    // the collection appears at this gsdlhome only because it's gdbm
+	    // file is installed here -- it's real gdbm will therefore be 
+	    // somewhere else).
+	    text_t build_cfg = filename_cat ((*this_info).second.gsdl_gsdlhome, "collect",
+					     *colhere, "index", "build.cfg");
+	    if (file_exists (build_cfg)) {
+	      collections.insert (*colhere);
+
+	      // since gsdl_collectinfo keys will be stuff like collection#1
+	      // for a multiple volume collection we want to translate it
+	      // so that the keys are the actual collection names
+	      translated_collectinfo[*colhere] = (*this_info).second;
+	    }
+	  }
+	  colhere ++;
+	}
+	gdbmhomes.insert ((*this_info).second.gsdl_gdbmhome);
+      }
+      this_info ++;
+    }
+  
+    // then if necessary the main gdbmhome (this should only happen if the 
+    // gsdl.ini is a little screwed up and no volume gdbmhomes occurred)
+    if (gdbmhomes.find (gsdl_gdbmhome) == gdbmhomes.end()) {
+      these_collections.erase (these_collections.begin(), these_collections.end());
+      read_dir (filename_cat (gsdl_gdbmhome, "collect"), these_collections);
+      colhere = these_collections.begin();
+      colend = these_collections.end();
+      while (colhere != colend) {
+	collections.insert (*colhere);
+	collectioninfo_t tmp;
+	tmp.gsdl_gsdlhome = gsdl_gsdlhome;
+	tmp.gsdl_gdbmhome = gsdl_gdbmhome;
+	translated_collectinfo[*colhere] = tmp;
+	colhere ++;
+      }
+      gdbmhomes.insert (gsdl_gdbmhome);
+    }
+  }
+
+  text_tset::const_iterator thiscol = collections.begin();
+  text_tset::const_iterator endcol = collections.end();
+
+  while (thiscol != endcol) {
+    
+    // ignore the modelcol
+    if (*thiscol == "modelcol") {
+      thiscol ++;
+      continue;
+    }
+    
+    // create collection server and add to null protocol
+    text_t this_gsdlhome = gsdl_gsdlhome;
+    text_t this_gdbmhome = gsdl_gdbmhome;
+    colinfo_tmap::const_iterator it = translated_collectinfo.find (*thiscol);
+    assert (it != translated_collectinfo.end());
+    this_gsdlhome = (*it).second.gsdl_gsdlhome;
+    this_gdbmhome = (*it).second.gsdl_gdbmhome;
+
+    cservers->add_collection (*thiscol, &recpt, this_gsdlhome, this_gdbmhome);
+    
+    thiscol ++;
+  }
+
+  // set up the null protocol
+  nproto.set_collectset(cservers);
+  
+  // add the protocol to the receptionist
+  recpt.add_protocol (&nproto);
+  
+  // the list of actions.
+  statusaction *astatusaction = new statusaction();
+  astatusaction->set_receptionist (&recpt);
+  recpt.add_action (astatusaction);
+  
+  pageaction *apageaction = new pageaction();
+  apageaction->set_receptionist (&recpt);
+  recpt.add_action (apageaction);
+  
+  pingaction *apingaction = new pingaction();
+  recpt.add_action (apingaction);
+  
+  tipaction *atipaction = new tipaction();
+  recpt.add_action (atipaction);
+  
+  queryaction *aqueryaction = new queryaction();
+  aqueryaction->set_receptionist (&recpt);
+  recpt.add_action (aqueryaction);
+  
+  documentaction *adocumentaction = new documentaction();
+  adocumentaction->set_receptionist (&recpt);
+  recpt.add_action (adocumentaction);
+  
+  usersaction *ausersaction = new usersaction();
+  recpt.add_action (ausersaction);
+
+  extlinkaction *anextlinkaction = new extlinkaction();
+  recpt.add_action (anextlinkaction);
+
+  collectoraction *acollectoraction = new collectoraction();
+  acollectoraction->set_receptionist (&recpt);
+  recpt.add_action (acollectoraction);
+  
+  authenaction *aauthenaction = new authenaction();
+  aauthenaction->set_receptionist(&recpt);
+  recpt.add_action (aauthenaction);
+
+  phindaction *aphindaction = new phindaction();
+  recpt.add_action (aphindaction);
+
+
+  // list of browsers
+  vlistbrowserclass *avlistbrowserclass = new vlistbrowserclass();
+  recpt.add_browser (avlistbrowserclass);
+  recpt.setdefaultbrowser ("VList");
+
+  hlistbrowserclass *ahlistbrowserclass = new hlistbrowserclass();
+  recpt.add_browser (ahlistbrowserclass);
+
+  datelistbrowserclass *adatelistbrowserclass = new datelistbrowserclass();
+  recpt.add_browser (adatelistbrowserclass);
+
+  invbrowserclass *ainvbrowserclass = new invbrowserclass();
+  recpt.add_browser (ainvbrowserclass);
+
+  pagedbrowserclass *apagedbrowserclass = new pagedbrowserclass();
+  recpt.add_browser (apagedbrowserclass);
+
+  htmlbrowserclass *ahtmlbrowserclass = new htmlbrowserclass();
+  recpt.add_browser (ahtmlbrowserclass);
+
+  phindbrowserclass *aphindbrowserclass = new phindbrowserclass();;
+  recpt.add_browser (aphindbrowserclass);
+  
+  // set defaults
+  recpt.configure ("gsdlhome", gsdl_gsdlhome);
+  recpt.configure ("gdbmhome", gsdl_gdbmhome);
+  recpt.configure ("collection", collection);
+
+  int maxrequests = 1;
+
+  // configure collections (and receptionist) with collectinfo stuff
+  // different from the default
+  colinfo_tmap::const_iterator this_info = translated_collectinfo.begin();
+  colinfo_tmap::const_iterator end_info = translated_collectinfo.end();
+
+  while (this_info != end_info) {
+    text_tarray tmpconf;
+    tmpconf.push_back ((*this_info).first);
+    tmpconf.push_back ((*this_info).second.gsdl_gsdlhome);
+    tmpconf.push_back ((*this_info).second.gsdl_gdbmhome);
+    recpt.configure ("collectinfo", tmpconf);
+    this_info ++;
+  }
+
+  // read in config files of each gdbmhome (in no particular order)
+  // those read in last will override those read earlier
+  // collections being used together in this way should be 
+  // careful not to have main.cfg files that might 
+  // screw with each other.
+  text_tset::const_iterator thome = gdbmhomes.begin();
+  text_tset::const_iterator ehome = gdbmhomes.end();
+  while (thome != ehome) {
+    if (!main_cfg_read (recpt, *thome, collection)) {
+      // couldn't find the main configuration file
+      page_errormaincfg (*thome, collection);
+      return 0;
+    }
+    thome ++;
+  }
+
+  // w32server relies on gwcgi being set to "gsdl"
+  recpt.configure ("gwcgi", "gsdl");
+	
+  // initialise the library software
+  if (!recpt.init(cerr)) {
+    // an error occurred during the initialisation
+    page_errorinit(gsdl_gsdlhome);
+    return 0;
+  }
+
+  // get memory information
+  MEMORYSTATUS memstatus;
+  memstatus.dwLength = sizeof(MEMORYSTATUS);
+  GlobalMemoryStatus(&memstatus);
+  baseavailvirtual = memstatus.dwAvailVirtual; // save for later comparison
+
+  return 1;
+}
+
+
+static void rememberpref (const text_t &tailstr) {
+  gsdl_enterlib = tailstr;
+}
+
+
+static void send_file_from_disk(text_t filename,
+                                RequestInfoT *RInfo,
+                                RequestFieldsT *RFields) {
+  
+  // select appropriate mime type from file extension
+  text_t ext;
+  text_t::const_iterator end = filename.end();
+  text_t::const_iterator it = filename.begin();
+  text_t::const_iterator lastdot = end;
+  while ((it = findchar(it, end, '.')) != end) {
+    lastdot = it;
+    it++;
+  }
+  if (lastdot < end) ext = substr(lastdot+1, end);
+
+  text_t mime = "unknown";
+  int len = ext.size();
+  if (len == 2) {
+    if ((ext[0] == 'p' || ext[0] == 'P') &&
+	(ext[1] == 's' || ext[1] == 'S'))
+      mime = "application/postscript";
+  }  else if (len == 3) {
+    if ((ext[0] == 'g' || ext[0] == 'G') &&
+	(ext[1] == 'i' || ext[1] == 'I') &&
+	(ext[2] == 'f' || ext[2] == 'F')) {
+      mime = "image/gif";
+    } else if ((ext[0] == 'j' || ext[0] == 'J') &&
+	       (ext[1] == 'p' || ext[1] == 'P') &&
+	       (ext[2] == 'g' || ext[2] == 'G')) {
+      mime = "image/jpeg";
+    } else if ((ext[0] == 'h' || ext[0] == 'H') &&
+	       (ext[1] == 't' || ext[1] == 'T') &&
+	       (ext[2] == 'm' || ext[2] == 'M')) {
+      mime = "text/html";
+    } else if ((ext[0] == 'p' || ext[0] == 'P') &&
+	       (ext[1] == 'd' || ext[1] == 'D') &&
+	       (ext[2] == 'f' || ext[2] == 'F')) {
+      mime = "application/pdf";
+    } else if ((ext[0] == 'p' || ext[0] == 'P') &&
+	       (ext[1] == 'n' || ext[1] == 'N') &&
+	       (ext[2] == 'g' || ext[2] == 'G')) {
+      mime = "image/png";
+    } else if ((ext[0] == 'd' || ext[0] == 'D') &&
+	       (ext[1] == 'o' || ext[1] == 'O') &&
+	       (ext[2] == 'c' || ext[2] == 'C')) {
+      mime = "application/msword";
+    } else if ((ext[0] == 'r' || ext[0] == 'R') &&
+	       (ext[1] == 't' || ext[1] == 'T') &&
+	       (ext[2] == 'f' || ext[2] == 'F')) {
+      mime = "application/rtf";
+    } else if ((ext[0] == 'x' || ext[0] == 'X') &&
+	       (ext[1] == 'l' || ext[1] == 'L') &&
+	       (ext[2] == 's' || ext[2] == 'S')) {
+      mime = "application/vnd.ms-excel";
+    } else if ((ext[0] == 'p' || ext[0] == 'P') &&
+	       (ext[1] == 'p' || ext[1] == 'P') &&
+	       (ext[2] == 'T' || ext[2] == 'T')) {
+      mime = "application/vnd.ms-powerpoint";
+    }
+  } else if (len == 4) {
+    if ((ext[0] == 'j' || ext[0] == 'J') &&
+	(ext[1] == 'p' || ext[1] == 'P') &&
+	(ext[2] == 'e' || ext[2] == 'E') &&
+	(ext[3] == 'g' || ext[3] == 'G')) {
+      mime = "image/jpeg";
+    } else if ((ext[0] == 'h' || ext[0] == 'H') &&
+	       (ext[1] == 't' || ext[1] == 'T') &&
+	       (ext[2] == 'm' || ext[2] == 'M') &&
+	       (ext[3] == 'l' || ext[3] == 'L')) {
+      mime = "text/html";
+    }
+  }
+	
+  // try to open the file
+  filename = filename_cat (current_gsdlhome, filename);
+  /* Feb 2002 - handle a file with a space in it's name.
+     Assume that if there is a space, it is in the collect name (and there's
+     only one space). */
+  text_t::iterator space_start;
+  space_start=findword(filename.begin(),filename.end(),"%20");
+  if (space_start != filename.end()) {
+    // we found a space...
+    text_t::iterator after_space=space_start+3;
+    text_t new_filename=substr(filename.begin(), space_start);
+    new_filename += " ";
+    new_filename += substr(after_space,filename.end());
+    filename=new_filename;
+  }
+
+  char *filenamec = filename.getcstr();
+  FILE *thefile = fopen(filenamec, "rb");
+  delete filenamec;
+  if (thefile == NULL) {
+    log_message("file not found\n");
+    send_retrieve_error(404, "File not found",
+			"Could not find the local file requested", RInfo);
+    return;
+  }
+  int nr;
+  char buffer[2048];
+  // send back required information
+  char *mimec = mime.getcstr();
+  if (send_header(mimec, RInfo) >= 0) {
+    if (strcmpi(RFields->MethodStr, "HEAD") != 0) {
+      for (;;) {
+        nr = fread(buffer, 1, 2048, thefile);
+        if (nr <= 0) break;
+        if (SendData(RInfo->ClientSocket,
+                     (BYTE *)buffer, nr,
+		     RInfo->ThreadNum) < 0) break;        
+      }
+    }
+  }
+  delete mimec;
+  fclose(thefile);
+}
+
+static void handle_library_request(const text_t &argstr, RequestInfoT *RInfo,
+				   RequestFieldsT *RequestFields) {
+
+  // parse the cgi arguments and produce the resulting page if there
+  // have been no errors so far
+  cgiargsclass args;
+  text_tmap empty; // don't use this (it's for fastcgi on unix)
+  if (!recpt.parse_cgi_args (argstr, args, cerr, empty)) {
+    page_errorparseargs(gsdl_gsdlhome);
+    return;
+  } 
+
+  colinfo_tmap::const_iterator it = translated_collectinfo.find (args["c"]);
+  if (it != translated_collectinfo.end()) {
+    current_gsdlhome = (*it).second.gsdl_gsdlhome;
+  } else {
+    current_gsdlhome = gsdl_gsdlhome;
+  }
+
+  // produce cgi header
+  response_t response;
+  text_t response_data;
+
+  recpt.get_cgihead_info (args, response, response_data, cerr, empty);
+
+  if (response == location) {
+    // location response
+    response_data = "@" + recpt.expandmacros (response_data, args, cerr);
+    char *response_data_c = response_data.getcstr();
+    send_header(response_data_c, RInfo);
+    delete response_data_c;
+    return;
+  } else if (response == content) {
+    // content response
+    char *response_data_c = response_data.getcstr();
+    if (send_header(response_data_c, RInfo) < 0) {
+      delete response_data_c;
+      return;
+    }
+    delete response_data_c;
+  } else {
+    // unknown response
+    cerr << "Error: get_cgihead_info returned an unknown response type.\n";
+    return;
+  }
+
+  textstream.tsbreset();
+  textstream.setrequestinfo (RInfo);
+  
+  if (!recpt.produce_content (args, cout, cerr)) {
+    page_errorcgipage(gsdl_gsdlhome);
+    return;
+  } 
+  recpt.log_cgi_args (args, cerr, empty);
+
+  cout << flush;
+  cerr << flush;
+  
+  libaccessnum++;
+}
+
+static void handle_server_request(text_t &tailstr,
+				  RequestInfoT *RequestInfo,
+				  RequestFieldsT *RequestFields) {
+  
+  text_t argstr;
+
+  // do any url adjustments necessary
+  if (tailstr.empty() || tailstr == "/") {
+    tailstr = "/gsdl";
+  }
+
+  text_t::const_iterator begin = tailstr.begin();
+  text_t::const_iterator end = tailstr.end();
+  
+  // test to see if this is a library request or a local
+  // file request
+  if ((tailstr == "/gsdl") ||
+      ((tailstr.size() > 5) && (substr(begin, begin+6) == "/gsdl?"))) {
+
+    // library request
+    
+    // argstr is the bit after the '?'
+    if (tailstr != "/gsdl") {
+      argstr = substr(begin+6, end);
+    }
+
+    // log the difference in access times
+    DWORD thislibaccesstime = GetTickCount();
+    if (gsdl_keep_log || gsdl_show_console) {
+      char logstr[256];
+      sprintf(logstr, "DELTA LIB ACCESS TIME: %i\n", (int)(thislibaccesstime - lastlibaccesstime));
+      log_message (logstr);
+    }
+    lastlibaccesstime = thislibaccesstime;
+    
+    // log this request
+    if (gsdl_keep_log || gsdl_show_console) {
+      text_t logstr = "LOCAL LIB: " + tailstr + "\n";
+      char *logstrc = logstr.getcstr();
+      log_message (logstrc);
+      delete logstrc;
+    }
+    
+    handle_library_request (argstr, RequestInfo, RequestFields);
+    
+    // remember the preferences
+    // rememberpref (tailstr);
+    
+    // log memory information
+    if (gsdl_keep_log || gsdl_show_console) {
+      MEMORYSTATUS memstatus;
+      memstatus.dwLength = sizeof(MEMORYSTATUS);
+      GlobalMemoryStatus(&memstatus);
+      char logstr[256];
+      sprintf (logstr, "BDELTA AVAIL VIRTUAL: %i K\n", 
+	       (int)((baseavailvirtual - memstatus.dwAvailVirtual)/1024));
+      log_message (logstr);
+    }
+    
+  } else {
+    // local file
+    if (gsdl_keep_log || gsdl_show_console) {
+      text_t logstr = "LOCAL FILE: " + tailstr + "\n";
+      char *logstrc = logstr.getcstr();
+      log_message (logstrc);
+      delete logstrc;
+    }
+    send_file_from_disk (tailstr, RequestInfo, RequestFields);
+  }
+}
+
+int ExamineURIStr(text_t &URIStr, RequestInfoT *RequestInfo,
+		  RequestFieldsT *RequestFields)
+{
+  text_t protocol, machine, rest;
+  int port;
+
+  if (RequestFields->ContentLength > 0) {
+    // POST data
+    URIStr.push_back('?');
+    for (int i = 0; i < RequestFields->ContentLength; i++) {
+      URIStr.push_back(RequestFields->Content[i]);
+    }
+  }
+  
+  if (parse_url(URIStr, protocol, machine, &port, rest)!=http_ok) {
+    // Alter local file request to address 'gsdl'
+    if (*(URIStr.begin()) != '/') URIStr = "http://gsdl/" + URIStr;
+    else URIStr = "http://gsdl" + URIStr;
+    parse_url(URIStr, protocol, machine, &port, rest);
+  }
+
+  if (machine == "gsdl") {
+    // a local file request
+    handle_server_request(rest, RequestInfo, RequestFields);
+    
+  } else {
+    send_retrieve_error(404, "File not found",
+			"Could not find the local file requested", RequestInfo);
+  }
+  
+  return 1;
+}
Index: /main/tags/2.38/gsdl/src/w32server/cgiwrapper.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/cgiwrapper.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/cgiwrapper.h	(revision 21083)
@@ -0,0 +1,49 @@
+/**********************************************************************
+ *
+ * cgiwrapper.h -- windows local library cgiwrapper
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef CGIWRAPPER_H
+#define CGIWRAPPER_H
+
+#include "httpreq.h"
+#include "locate.h"
+#include "receptionist.h"
+
+// the number of times the library has been accessed
+extern int libaccessnum;
+
+int ExamineURIStr(text_t &URIStr,RequestInfoT *RequestInfo,
+		  RequestFieldsT *RequestFields);
+
+// reads any configure file that has been set up and
+// sets up the library
+// returns 1 if successful, 0 if unsuccessful
+int gsdl_init ();
+
+// returns 0 if the directories cant be found
+// and the user wants to quit (it returns 1
+// if everything is ok)
+int cstrcheckdir (char *cstrthedir);
+
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/conftools.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/conftools.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/conftools.cpp	(revision 21083)
@@ -0,0 +1,55 @@
+/**********************************************************************
+ *
+ * conftools.cpp
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include "conftools.h"
+
+int write_confline (ofstream &fileout, const text_t &key, const text_t value) {
+  if (key.empty() || value.empty()) return -1;
+  outconvertclass text_t2ascii;
+  fileout << text_t2ascii << key << "=" << value << "\n";
+  return 0;
+}
+
+int get_confline (ifstream &filein, text_t &key, text_t &value) {
+  if (filein.eof()) return -1;
+
+  key.clear();
+  value.clear();
+  char c;
+  filein.get(c);
+
+  int foundeq = 0;
+  while (!filein.eof() && c != '\n') {
+    if (!foundeq && c == '=') {foundeq = 1; filein.get(c);}
+
+    if (foundeq) value.push_back(c);
+    else key.push_back(c);
+    filein.get(c);
+  }
+  if (key.empty()) return -1;
+  return 0;
+} 
+
Index: /main/tags/2.38/gsdl/src/w32server/conftools.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/conftools.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/conftools.h	(revision 21083)
@@ -0,0 +1,40 @@
+/**********************************************************************
+ *
+ * conftools.h
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef CONFTOOLS_H
+#define CONFTOOLS_H
+
+#if defined (GSDL_USE_OBJECTSPACE)
+#include <ospace/std/fstream>
+#elif defined (GSDL_USE_IOS_H)
+#include <fstream.h>
+#else
+#include <fstream>
+#endif
+
+int write_confline (ofstream &fileout, const text_t &key, const text_t value);
+int get_confline (ifstream &filein, text_t &key, text_t &value);
+
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/d_winsock.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/d_winsock.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/d_winsock.cpp	(revision 21083)
@@ -0,0 +1,669 @@
+/**********************************************************************
+ *
+ * d_winsock.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <windows.h>
+#include "d_winsock.h"
+
+
+typedef SOCKET (PASCAL FAR *accept_Type)(SOCKET s, struct sockaddr FAR *addr, 
+					 int FAR *addrlen);
+typedef int (PASCAL FAR *bind_Type)(SOCKET s, const struct sockaddr FAR *addr, int namelen);
+typedef int (PASCAL FAR *closesocket_Type)(SOCKET s);
+typedef int (PASCAL FAR *connect_Type)(SOCKET s, const struct sockaddr FAR *name, 
+				       int namelen);
+typedef int (PASCAL FAR *ioctlsocket_Type)(SOCKET s, long cmd, u_long FAR *argp);
+typedef int (PASCAL FAR *getpeername_Type)(SOCKET s, struct sockaddr FAR *name,
+					   int FAR * namelen);
+typedef int (PASCAL FAR *getsockname_Type)(SOCKET s, struct sockaddr FAR *name,
+					   int FAR * namelen);
+typedef int (PASCAL FAR *getsockopt_Type)(SOCKET s, int level, int optname,
+					  char FAR * optval, int FAR *optlen);
+typedef u_long (PASCAL FAR *htonl_Type)(u_long hostlong);
+typedef u_short (PASCAL FAR *htons_Type)(u_short hostshort);
+typedef unsigned long (PASCAL FAR *inet_addr_Type)(const char FAR * cp);
+typedef char FAR * (PASCAL FAR *inet_ntoa_Type)(struct in_addr in);
+typedef int (PASCAL FAR *listen_Type)(SOCKET s, int backlog);
+typedef u_long (PASCAL FAR *ntohl_Type)(u_long netlong);
+typedef u_short (PASCAL FAR *ntohs_Type)(u_short netshort);
+typedef int (PASCAL FAR *recv_Type)(SOCKET s, char FAR * buf, int len, int flags);
+typedef int (PASCAL FAR *recvfrom_Type)(SOCKET s, char FAR * buf, int len, int flags,
+					struct sockaddr FAR *from, int FAR * fromlen);
+typedef int (PASCAL FAR *select_Type)(int nfds, fd_set FAR *readfds, fd_set FAR *writefds,
+				      fd_set FAR *exceptfds, const struct timeval FAR *timeout);
+typedef int (PASCAL FAR *send_Type)(SOCKET s, const char FAR * buf, int len, int flags);
+typedef int (PASCAL FAR *sendto_Type)(SOCKET s, const char FAR * buf, int len, int flags,
+				      const struct sockaddr FAR *to, int tolen);
+typedef int (PASCAL FAR *setsockopt_Type)(SOCKET s, int level, int optname,
+					  const char FAR * optval, int optlen);
+typedef int (PASCAL FAR *shutdown_Type)(SOCKET s, int how);
+typedef SOCKET (PASCAL FAR *socket_Type)(int af, int type, int protocol);
+typedef struct hostent FAR * (PASCAL FAR *gethostbyaddr_Type)(const char FAR * addr,
+							      int len, int type);
+typedef struct hostent FAR * (PASCAL FAR *gethostbyname_Type)(const char FAR * name);
+typedef int (PASCAL FAR *gethostname_Type) (char FAR * name, int namelen);
+typedef struct servent FAR * (PASCAL FAR *getservbyport_Type)(int port, const char FAR * proto);
+typedef struct servent FAR * (PASCAL FAR *getservbyname_Type)(const char FAR * name,
+							      const char FAR * proto);
+typedef struct protoent FAR * (PASCAL FAR *getprotobynumber_Type)(int proto);
+typedef struct protoent FAR * (PASCAL FAR *getprotobyname_Type)(const char FAR * name);
+typedef int (PASCAL FAR *WSAStartup_Type)(WORD wVersionRequired, LPWSADATA lpWSAData);
+typedef int (PASCAL FAR *WSACleanup_Type)(void);
+typedef void (PASCAL FAR *WSASetLastError_Type)(int iError);
+typedef int (PASCAL FAR *WSAGetLastError_Type)(void);
+typedef BOOL (PASCAL FAR *WSAIsBlocking_Type)(void);
+typedef int (PASCAL FAR *WSAUnhookBlockingHook_Type)(void);
+typedef FARPROC (PASCAL FAR *WSASetBlockingHook_Type)(FARPROC lpBlockFunc);
+typedef int (PASCAL FAR *WSACancelBlockingCall_Type)(void);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetServByName_Type)(HWND hWnd, u_int wMsg,
+							const char FAR * name,
+							const char FAR * proto,
+							char FAR * buf, int buflen);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetServByPort_Type)(HWND hWnd, u_int wMsg, int port,
+							const char FAR * proto, char FAR * buf,
+							int buflen);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetProtoByName_Type)(HWND hWnd, u_int wMsg,
+							 const char FAR * name, char FAR * buf,
+							 int buflen);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetProtoByNumber_Type)(HWND hWnd, u_int wMsg,
+							   int number, char FAR * buf,
+							   int buflen);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetHostByName_Type)(HWND hWnd, u_int wMsg,
+							const char FAR * name, char FAR * buf,
+							int buflen);
+typedef HANDLE (PASCAL FAR *WSAAsyncGetHostByAddr_Type)(HWND hWnd, u_int wMsg,
+							const char FAR * addr, int len, int type,
+							char FAR * buf, int buflen);
+typedef int (PASCAL FAR *WSACancelAsyncRequest_Type)(HANDLE hAsyncTaskHandle);
+typedef int (PASCAL FAR *WSAAsyncSelect_Type)(SOCKET s, HWND hWnd, u_int wMsg,
+					      long lEvent);
+
+
+
+static accept_Type accept_Ptr = NULL;
+static bind_Type bind_Ptr = NULL;
+static closesocket_Type closesocket_Ptr = NULL;
+static connect_Type connect_Ptr = NULL;
+static ioctlsocket_Type ioctlsocket_Ptr = NULL;
+static getpeername_Type getpeername_Ptr = NULL;
+static getsockname_Type getsockname_Ptr = NULL;
+static getsockopt_Type getsockopt_Ptr = NULL;
+static htonl_Type htonl_Ptr = NULL;
+static htons_Type htons_Ptr = NULL;
+static inet_addr_Type inet_addr_Ptr = NULL;
+static inet_ntoa_Type inet_ntoa_Ptr = NULL;
+static listen_Type listen_Ptr = NULL;
+static ntohl_Type ntohl_Ptr = NULL;
+static ntohs_Type ntohs_Ptr = NULL;
+static recv_Type recv_Ptr = NULL;
+static recvfrom_Type recvfrom_Ptr = NULL;
+static select_Type select_Ptr = NULL;
+static send_Type send_Ptr = NULL;
+static sendto_Type sendto_Ptr = NULL;
+static setsockopt_Type setsockopt_Ptr = NULL;
+static shutdown_Type shutdown_Ptr = NULL;
+static socket_Type socket_Ptr = NULL;
+static gethostbyaddr_Type gethostbyaddr_Ptr = NULL;
+static gethostbyname_Type gethostbyname_Ptr = NULL;
+static gethostname_Type gethostname_Ptr = NULL;
+static getservbyport_Type getservbyport_Ptr = NULL;
+static getservbyname_Type getservbyname_Ptr = NULL;
+static getprotobynumber_Type getprotobynumber_Ptr = NULL;
+static getprotobyname_Type getprotobyname_Ptr = NULL;
+static WSAStartup_Type WSAStartup_Ptr = NULL;
+static WSACleanup_Type WSACleanup_Ptr = NULL;
+static WSASetLastError_Type WSASetLastError_Ptr = NULL;
+static WSAGetLastError_Type WSAGetLastError_Ptr = NULL;
+static WSAIsBlocking_Type WSAIsBlocking_Ptr = NULL;
+static WSAUnhookBlockingHook_Type WSAUnhookBlockingHook_Ptr = NULL;
+static WSASetBlockingHook_Type WSASetBlockingHook_Ptr = NULL;
+static WSACancelBlockingCall_Type WSACancelBlockingCall_Ptr = NULL;
+static WSAAsyncGetServByName_Type WSAAsyncGetServByName_Ptr = NULL;
+static WSAAsyncGetServByPort_Type WSAAsyncGetServByPort_Ptr = NULL;
+static WSAAsyncGetProtoByName_Type WSAAsyncGetProtoByName_Ptr = NULL;
+static WSAAsyncGetProtoByNumber_Type WSAAsyncGetProtoByNumber_Ptr = NULL;
+static WSAAsyncGetHostByName_Type WSAAsyncGetHostByName_Ptr = NULL;
+static WSAAsyncGetHostByAddr_Type WSAAsyncGetHostByAddr_Ptr = NULL;
+static WSACancelAsyncRequest_Type WSACancelAsyncRequest_Ptr = NULL;
+static WSAAsyncSelect_Type WSAAsyncSelect_Ptr = NULL;
+
+
+static HINSTANCE wsock32lib = NULL;
+static HINSTANCE winsocklib = NULL;
+
+
+
+// set all the pointers back to null
+static void ResetWSPtrs () {
+  accept_Ptr = NULL;
+  bind_Ptr = NULL;
+  closesocket_Ptr = NULL;
+  connect_Ptr = NULL;
+  ioctlsocket_Ptr = NULL;
+  getpeername_Ptr = NULL;
+  getsockname_Ptr = NULL;
+  getsockopt_Ptr = NULL;
+  htonl_Ptr = NULL;
+  htons_Ptr = NULL;
+  inet_addr_Ptr = NULL;
+  inet_ntoa_Ptr = NULL;
+  listen_Ptr = NULL;
+  ntohl_Ptr = NULL;
+  ntohs_Ptr = NULL;
+  recv_Ptr = NULL;
+  recvfrom_Ptr = NULL;
+  select_Ptr = NULL;
+  send_Ptr = NULL;
+  sendto_Ptr = NULL;
+  setsockopt_Ptr = NULL;
+  shutdown_Ptr = NULL;
+  socket_Ptr = NULL;
+  gethostbyaddr_Ptr = NULL;
+  gethostbyname_Ptr = NULL;
+  gethostname_Ptr = NULL;
+  getservbyport_Ptr = NULL;
+  getservbyname_Ptr = NULL;
+  getprotobynumber_Ptr = NULL;
+  getprotobyname_Ptr = NULL;
+  WSAStartup_Ptr = NULL;
+  WSACleanup_Ptr = NULL;
+  WSASetLastError_Ptr = NULL;
+  WSAGetLastError_Ptr = NULL;
+  WSAIsBlocking_Ptr = NULL;
+  WSAUnhookBlockingHook_Ptr = NULL;
+  WSASetBlockingHook_Ptr = NULL;
+  WSACancelBlockingCall_Ptr = NULL;
+  WSAAsyncGetServByName_Ptr = NULL;
+  WSAAsyncGetServByPort_Ptr = NULL;
+  WSAAsyncGetProtoByName_Ptr = NULL;
+  WSAAsyncGetProtoByNumber_Ptr = NULL;
+  WSAAsyncGetHostByName_Ptr = NULL;
+  WSAAsyncGetHostByAddr_Ptr = NULL;
+  WSACancelAsyncRequest_Ptr = NULL;
+  WSAAsyncSelect_Ptr = NULL;
+}
+
+// get the pointers to all the socket functions
+static void SetupWSPtrs (HINSTANCE socketlib) {
+  if (socketlib == NULL) return;
+
+  accept_Ptr = (accept_Type)GetProcAddress(socketlib,"accept");
+  bind_Ptr = (bind_Type)GetProcAddress(socketlib,"bind");
+  closesocket_Ptr = (closesocket_Type)GetProcAddress(socketlib,"closesocket");
+  connect_Ptr = (connect_Type)GetProcAddress(socketlib,"connect");
+  ioctlsocket_Ptr = (ioctlsocket_Type)GetProcAddress(socketlib,"ioctlsocket");
+  getpeername_Ptr = (getpeername_Type)GetProcAddress(socketlib,"getpeername");
+  getsockname_Ptr = (getsockname_Type)GetProcAddress(socketlib,"getsockname");
+  getsockopt_Ptr = (getsockopt_Type)GetProcAddress(socketlib,"getsockopt");
+  htonl_Ptr = (htonl_Type)GetProcAddress(socketlib,"htonl");
+  htons_Ptr = (htons_Type)GetProcAddress(socketlib,"htons");
+  inet_addr_Ptr = (inet_addr_Type)GetProcAddress(socketlib,"inet_addr");
+  inet_ntoa_Ptr = (inet_ntoa_Type)GetProcAddress(socketlib,"inet_ntoa");
+  listen_Ptr = (listen_Type)GetProcAddress(socketlib,"listen");
+  ntohl_Ptr = (ntohl_Type)GetProcAddress(socketlib,"ntohl");
+  ntohs_Ptr = (ntohs_Type)GetProcAddress(socketlib,"ntohs");
+  recv_Ptr = (recv_Type)GetProcAddress(socketlib,"recv");
+  recvfrom_Ptr = (recvfrom_Type)GetProcAddress(socketlib,"recvfrom");
+  select_Ptr = (select_Type)GetProcAddress(socketlib,"select");
+  send_Ptr = (send_Type)GetProcAddress(socketlib,"send");
+  sendto_Ptr = (sendto_Type)GetProcAddress(socketlib,"sendto");
+  setsockopt_Ptr = (setsockopt_Type)GetProcAddress(socketlib,"setsockopt");
+  shutdown_Ptr = (shutdown_Type)GetProcAddress(socketlib,"shutdown");
+  socket_Ptr = (socket_Type)GetProcAddress(socketlib,"socket");
+  gethostbyaddr_Ptr = (gethostbyaddr_Type)GetProcAddress(socketlib,"gethostbyaddr");
+  gethostbyname_Ptr = (gethostbyname_Type)GetProcAddress(socketlib,"gethostbyname");
+  gethostname_Ptr = (gethostname_Type)GetProcAddress(socketlib,"gethostname");
+  getservbyport_Ptr = (getservbyport_Type)GetProcAddress(socketlib,"getservbyport");
+  getservbyname_Ptr = (getservbyname_Type)GetProcAddress(socketlib,"getservbyname");
+  getprotobynumber_Ptr = (getprotobynumber_Type)GetProcAddress(socketlib,"getprotobynumber");
+  getprotobyname_Ptr = (getprotobyname_Type)GetProcAddress(socketlib,"getprotobyname");
+  WSAStartup_Ptr = (WSAStartup_Type)GetProcAddress(socketlib,"WSAStartup");
+  WSACleanup_Ptr = (WSACleanup_Type)GetProcAddress(socketlib,"WSACleanup");
+  WSASetLastError_Ptr = (WSASetLastError_Type)GetProcAddress(socketlib,"WSASetLastError");
+  WSAGetLastError_Ptr = (WSAGetLastError_Type)GetProcAddress(socketlib,"WSAGetLastError");
+  WSAIsBlocking_Ptr = (WSAIsBlocking_Type)GetProcAddress(socketlib,"WSAIsBlocking");
+  WSAUnhookBlockingHook_Ptr = 
+    (WSAUnhookBlockingHook_Type)GetProcAddress(socketlib,"WSAUnhookBlockingHook");
+  WSASetBlockingHook_Ptr = 
+    (WSASetBlockingHook_Type)GetProcAddress(socketlib,"WSASetBlockingHook");
+  WSACancelBlockingCall_Ptr = 
+    (WSACancelBlockingCall_Type)GetProcAddress(socketlib,"WSACancelBlockingCall");
+  WSAAsyncGetServByName_Ptr = 
+    (WSAAsyncGetServByName_Type)GetProcAddress(socketlib,"WSAAsyncGetServByName");
+  WSAAsyncGetServByPort_Ptr = 
+    (WSAAsyncGetServByPort_Type)GetProcAddress(socketlib,"WSAAsyncGetServByPort");
+  WSAAsyncGetProtoByName_Ptr = 
+    (WSAAsyncGetProtoByName_Type)GetProcAddress(socketlib,"WSAAsyncGetProtoByName");
+  WSAAsyncGetProtoByNumber_Ptr = 
+    (WSAAsyncGetProtoByNumber_Type)GetProcAddress(socketlib,"WSAAsyncGetProtoByNumber");
+  WSAAsyncGetHostByName_Ptr = 
+    (WSAAsyncGetHostByName_Type)GetProcAddress(socketlib,"WSAAsyncGetHostByName");
+  WSAAsyncGetHostByAddr_Ptr = 
+    (WSAAsyncGetHostByAddr_Type)GetProcAddress(socketlib,"WSAAsyncGetHostByAddr");
+  WSACancelAsyncRequest_Ptr = 
+    (WSACancelAsyncRequest_Type)GetProcAddress(socketlib,"WSACancelAsyncRequest");
+  WSAAsyncSelect_Ptr = (WSAAsyncSelect_Type)GetProcAddress(socketlib,"WSAAsyncSelect");
+}
+
+
+
+// expects path to be NULL, a empty string, or a path which ends in a slash
+// returns D_NOERROR on success,
+// D_ERR_UNEXPECTED or D_ERR_LOADFAILED on failure
+int d_LoadWinsock (char *path) {
+  char dllname[2048]; // HARD LIMIT!!!!
+  OSVERSIONINFO osver;
+
+  if ((wsock32lib != NULL) || (winsocklib != NULL)) return D_ERR_UNEXPECTED;
+
+  // set the error mode so that no nasty dialog boxes come
+  // up when things aren't installed
+  int olderrormode = SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS);
+
+  // get the operating system version information
+  memset(&osver, 0, sizeof(OSVERSIONINFO));
+  osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+  if (!GetVersionEx(&osver)) {
+    SetErrorMode(olderrormode);
+    return D_ERR_UNEXPECTED;
+  }
+
+  // see if we should load winsock before wsock32
+  if ((osver.dwPlatformId == VER_PLATFORM_WIN32s) && (path != NULL)) {
+    strcpy (dllname, path);
+    strcat (dllname, "winsock.dll");
+
+    // attempt to load the library
+    winsocklib = LoadLibrary (dllname);
+    if (winsocklib == NULL) {
+      SetErrorMode(olderrormode);
+      return D_ERR_LOADFAILED;
+    }
+  }
+
+  // attempt to load wsock32
+  int err = D_NOERROR;
+  dllname[0] = '\0';
+  if ((osver.dwPlatformId != VER_PLATFORM_WIN32s) && (path != NULL)) {
+    strcpy (dllname, path);
+  }
+  strcat (dllname, "wsock32.dll");
+  wsock32lib = LoadLibrary (dllname);
+  if (wsock32lib == NULL) err = D_ERR_LOADFAILED;
+  else SetupWSPtrs (wsock32lib);
+
+
+  // perform a few tests
+
+  // first try starting-up (and check the szDescription field)
+  if (err == D_NOERROR) {
+    WSADATA Data;
+    memset(&Data, 0, sizeof(WSADATA));
+    if ((d_WSAStartup(257, &Data) != 0) ||
+	(Data.szDescription == NULL) || 
+	(Data.szDescription[0] == '\0'))
+      err = D_ERR_LOADFAILED;
+  }
+
+  // next try setting and getting an error
+  if (err == D_NOERROR) {
+    d_WSASetLastError (WSAENOTSOCK);
+    if (d_WSAGetLastError () != WSAENOTSOCK) err = D_ERR_LOADFAILED;
+    d_WSASetLastError (0);
+  }
+
+  // last try cleaning up (if an error occurs here we might
+  // not be able to unload anything)
+  if ((err == D_NOERROR) && (d_WSACleanup() == SOCKET_ERROR))
+    err = D_ERR_LOADFAILED;
+
+  // if an error occurred then we need to unload everything
+  if (err != D_NOERROR) d_UnloadWinsock ();
+
+  SetErrorMode(olderrormode);
+  return err;
+}
+
+// returns D_NOERROR on success,
+// D_ERR_FREELIBFAILED on failure
+int d_UnloadWinsock () {
+  int err = D_NOERROR;
+
+  // unload wsock32
+  if ((wsock32lib != NULL) && !FreeLibrary (wsock32lib)) {
+    err = D_ERR_FREELIBFAILED;
+  }
+  wsock32lib = NULL;
+
+  // unload winsock
+  if ((winsocklib != NULL) && !FreeLibrary (winsocklib)) {
+    err = D_ERR_FREELIBFAILED;
+  }
+  winsocklib = NULL;
+  
+  // reset all the function pointers
+  ResetWSPtrs ();
+
+  return err;
+}
+
+
+
+
+// socket functions, these just call the dynamically loaded version
+
+SOCKET d_accept (SOCKET s, struct sockaddr *addr, int *addrlen) {
+  if (accept_Ptr != NULL) 
+    return (*accept_Ptr)(s, addr, addrlen);
+  return INVALID_SOCKET; // error winsock not loaded
+}
+
+int d_bind (SOCKET s, const struct sockaddr *addr, int namelen) {
+  if (bind_Ptr != NULL) 
+    return (*bind_Ptr)(s, addr, namelen);
+  return WSANOTINITIALISED; // error winsock not loaded
+}
+
+int d_closesocket (SOCKET s) {
+  if (closesocket_Ptr != NULL) 
+    return (*closesocket_Ptr)(s);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_connect (SOCKET s, const struct sockaddr *name, int namelen) {
+  if (connect_Ptr != NULL) 
+    return (*connect_Ptr)(s, name, namelen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_ioctlsocket (SOCKET s, long cmd, u_long *argp) {
+  if (ioctlsocket_Ptr != NULL) 
+    return (*ioctlsocket_Ptr)(s, cmd, argp);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_getpeername (SOCKET s, struct sockaddr *name, int *namelen) {
+  if (getpeername_Ptr != NULL) 
+    return (*getpeername_Ptr)(s, name, namelen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_getsockname (SOCKET s, struct sockaddr *name, int *namelen) {
+  if (getsockname_Ptr != NULL) 
+    return (*getsockname_Ptr)(s, name, namelen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_getsockopt (SOCKET s, int level, int optname, char *optval, int *optlen) {
+  if (getsockopt_Ptr != NULL) 
+    return (*getsockopt_Ptr)(s, level, optname, optval, optlen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+u_long d_htonl (u_long hostlong) {
+  if (htonl_Ptr != NULL) 
+    return (*htonl_Ptr)(hostlong);
+  return hostlong; // error winsock not loaded
+}
+
+u_short d_htons (u_short hostshort) {
+  if (htons_Ptr != NULL) 
+    return (*htons_Ptr)(hostshort);
+  return hostshort; // error winsock not loaded
+}
+
+unsigned long d_inet_addr (const char *cp) {
+  if (inet_addr_Ptr != NULL) 
+    return (*inet_addr_Ptr)(cp);
+  return INADDR_NONE; // error winsock not loaded
+}
+
+char *d_inet_ntoa (struct in_addr in) {
+  if (inet_ntoa_Ptr != NULL) 
+    return (*inet_ntoa_Ptr)(in);
+  return NULL; // error winsock not loaded
+}
+
+int d_listen (SOCKET s, int backlog) {
+  if (listen_Ptr != NULL) 
+    return (*listen_Ptr)(s, backlog);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+u_long d_ntohl (u_long netlong) {
+  if (ntohl_Ptr != NULL) 
+    return (*ntohl_Ptr)(netlong);
+  return netlong; // error winsock not loaded
+}
+
+u_short d_ntohs (u_short netshort) {
+  if (ntohs_Ptr != NULL) 
+    return (*ntohs_Ptr)(netshort);
+  return netshort; // error winsock not loaded
+}
+
+int d_recv (SOCKET s, char *buf, int len, int flags) {
+  if (recv_Ptr != NULL) 
+    return (*recv_Ptr)(s, buf, len, flags);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_recvfrom (SOCKET s, char *buf, int len, int flags,
+		struct sockaddr *from, int *fromlen) {
+  if (recvfrom_Ptr != NULL) 
+    return (*recvfrom_Ptr)(s, buf, len, flags, from, fromlen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_select (int nfds, fd_set *readfds, fd_set *writefds,
+	      fd_set *exceptfds, const struct timeval *timeout) {
+  if (select_Ptr != NULL) 
+    return (*select_Ptr)(nfds, readfds, writefds, exceptfds, timeout);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_send (SOCKET s, const char *buf, int len, int flags) {
+  if (send_Ptr != NULL) 
+    return (*send_Ptr)(s, buf, len, flags);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_sendto (SOCKET s, const char *buf, int len, int flags,
+	      const struct sockaddr *to, int tolen) {
+  if (sendto_Ptr != NULL) 
+    return (*sendto_Ptr)(s, buf, len, flags, to, tolen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_setsockopt (SOCKET s, int level, int optname,
+		  const char *optval, int optlen) {
+  if (setsockopt_Ptr != NULL) 
+    return (*setsockopt_Ptr)(s, level, optname, optval, optlen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_shutdown (SOCKET s, int how) {
+  if (shutdown_Ptr != NULL) 
+    return (*shutdown_Ptr)(s, how);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+SOCKET d_socket (int af, int type, int protocol) {
+  if (socket_Ptr != NULL) 
+    return (*socket_Ptr)(af, type, protocol);
+  return INVALID_SOCKET; // error winsock not loaded
+}
+
+hostent *d_gethostbyaddr(const char *addr, int len, int type) {
+  if (gethostbyaddr_Ptr != NULL) 
+    return (*gethostbyaddr_Ptr)(addr, len, type);
+  return NULL; // error winsock not loaded
+}
+
+hostent *d_gethostbyname(const char *name) {
+  if (gethostbyname_Ptr != NULL) 
+    return (*gethostbyname_Ptr)(name);
+  return NULL; // error winsock not loaded
+}
+
+int d_gethostname (char *name, int namelen) {
+  if (gethostname_Ptr != NULL) 
+    return (*gethostname_Ptr)(name, namelen);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+servent *d_getservbyport(int port, const char *proto) {
+  if (getservbyport_Ptr != NULL) 
+    return (*getservbyport_Ptr)(port, proto);
+  return NULL; // error winsock not loaded
+}
+
+servent *d_getservbyname(const char *name, const char *proto) {
+  if (getservbyname_Ptr != NULL) 
+    return (*getservbyname_Ptr)(name, proto);
+  return NULL; // error winsock not loaded
+}
+
+protoent *d_getprotobynumber(int proto) {
+  if (getprotobynumber_Ptr != NULL) 
+    return (*getprotobynumber_Ptr)(proto);
+  return NULL; // error winsock not loaded
+}
+
+protoent *d_getprotobyname(const char *name) {
+  if (getprotobyname_Ptr != NULL) 
+    return (*getprotobyname_Ptr)(name);
+  return NULL; // error winsock not loaded
+}
+
+int d_WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData) {
+  if (WSAStartup_Ptr != NULL) 
+    return (*WSAStartup_Ptr)(wVersionRequired, lpWSAData);
+  return WSASYSNOTREADY; // error winsock not loaded
+}
+
+int d_WSACleanup(void) {
+  if (WSACleanup_Ptr != NULL) 
+    return (*WSACleanup_Ptr)();
+  return WSANOTINITIALISED; // error winsock not loaded
+}
+
+void d_WSASetLastError(int iError) {
+  if (WSASetLastError_Ptr != NULL) (*WSASetLastError_Ptr)(iError);
+}
+
+int d_WSAGetLastError(void) {
+  if (WSAGetLastError_Ptr != NULL) 
+    return (*WSAGetLastError_Ptr)();
+  return WSANOTINITIALISED; // error winsock not loaded
+}
+
+BOOL d_WSAIsBlocking(void) {
+  if (WSAIsBlocking_Ptr != NULL) 
+    return (*WSAIsBlocking_Ptr)();
+  return FALSE; // error winsock not loaded
+}
+
+int d_WSAUnhookBlockingHook(void) {
+  if (WSAUnhookBlockingHook_Ptr != NULL) 
+    return (*WSAUnhookBlockingHook_Ptr)();
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+FARPROC d_WSASetBlockingHook(FARPROC lpBlockFunc) {
+  if (WSASetBlockingHook_Ptr != NULL) 
+    return (*WSASetBlockingHook_Ptr)(lpBlockFunc);
+  return NULL; // error winsock not loaded
+}
+
+int d_WSACancelBlockingCall(void) {
+  if (WSACancelBlockingCall_Ptr != NULL) 
+    return (*WSACancelBlockingCall_Ptr)();
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
+			       const char *name,
+			       const char *proto,
+			       char *buf, int buflen) {
+  if (WSAAsyncGetServByName_Ptr != NULL) 
+    return (*WSAAsyncGetServByName_Ptr)(hWnd, wMsg, name, proto, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port,
+			       const char *proto, char *buf,
+			       int buflen) {
+  if (WSAAsyncGetServByPort_Ptr != NULL) 
+    return (*WSAAsyncGetServByPort_Ptr)(hWnd, wMsg, port, proto, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
+				const char *name, char *buf,
+				int buflen) {
+  if (WSAAsyncGetProtoByName_Ptr != NULL) 
+    return (*WSAAsyncGetProtoByName_Ptr)(hWnd, wMsg, name, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
+				  int number, char *buf,
+				  int buflen) {
+  if (WSAAsyncGetProtoByNumber_Ptr != NULL) 
+    return (*WSAAsyncGetProtoByNumber_Ptr)(hWnd, wMsg, number, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
+			       const char *name, char *buf,
+			       int buflen) {
+  if (WSAAsyncGetHostByName_Ptr != NULL) 
+    return (*WSAAsyncGetHostByName_Ptr)(hWnd, wMsg, name, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+HANDLE d_WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg,
+                                        const char *addr, int len, int type,
+                                        char *buf, int buflen) {
+  if (WSAAsyncGetHostByAddr_Ptr != NULL) 
+    return (*WSAAsyncGetHostByAddr_Ptr)(hWnd, wMsg, addr, len, type, buf, buflen);
+  return NULL; // error winsock not loaded
+}
+
+int d_WSACancelAsyncRequest(HANDLE hAsyncTaskHandle) {
+  if (WSACancelAsyncRequest_Ptr != NULL) 
+    return (*WSACancelAsyncRequest_Ptr)(hAsyncTaskHandle);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
+int d_WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
+                               long lEvent) {
+  if (WSAAsyncSelect_Ptr != NULL) 
+    return (*WSAAsyncSelect_Ptr)(s, hWnd, wMsg, lEvent);
+  return SOCKET_ERROR; // error winsock not loaded
+}
+
Index: /main/tags/2.38/gsdl/src/w32server/d_winsock.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/d_winsock.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/d_winsock.h	(revision 21083)
@@ -0,0 +1,120 @@
+/**********************************************************************
+ *
+ * d_winsock.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef D_WINSOCK_H
+#define D_WINSOCK_H
+
+/* get most definitions from the real winsock */
+#include <winsock.h>
+
+#define D_NOERROR           0
+#define D_ERR_UNEXPECTED    1
+#define D_ERR_LOADFAILED    2
+#define D_ERR_FREELIBFAILED 3
+
+// d_LoadWinsock must be called before an normal winsock
+// functions
+
+// expects path to be NULL, a empty string, or a path which ends in a slash
+// returns D_NOERROR on success,
+// D_ERR_UNEXPECTED or D_ERR_LOADFAILED on failure
+int d_LoadWinsock (char *path);
+
+// returns D_NOERROR on success,
+// D_ERR_FREELIBFAILED on failure
+int d_UnloadWinsock ();
+
+// dynamically loaded versions of the winsock functions
+
+SOCKET d_accept (SOCKET s, struct sockaddr *addr, int *addrlen);
+int d_bind (SOCKET s, const struct sockaddr *addr, int namelen);
+int d_closesocket (SOCKET s);
+int d_connect (SOCKET s, const struct sockaddr *name, int namelen);
+int d_ioctlsocket (SOCKET s, long cmd, u_long *argp);
+int d_getpeername (SOCKET s, struct sockaddr *name, int *namelen);
+int d_getsockname (SOCKET s, struct sockaddr *name, int *namelen);
+int d_getsockopt (SOCKET s, int level, int optname, char *optval, int *optlen);
+u_long d_htonl (u_long hostlong);
+u_short d_htons (u_short hostshort);
+unsigned long d_inet_addr (const char *cp);
+char *d_inet_ntoa (struct in_addr in);
+int d_listen (SOCKET s, int backlog);
+u_long d_ntohl (u_long netlong);
+u_short d_ntohs (u_short netshort);
+int d_recv (SOCKET s, char *buf, int len, int flags);
+int d_recvfrom (SOCKET s, char *buf, int len, int flags,
+		struct sockaddr *from, int *fromlen);
+int d_select (int nfds, fd_set *readfds, fd_set *writefds,
+	      fd_set *exceptfds, const struct timeval *timeout);
+int d_send (SOCKET s, const char *buf, int len, int flags);
+int d_sendto (SOCKET s, const char *buf, int len, int flags,
+	      const struct sockaddr *to, int tolen);
+int d_setsockopt (SOCKET s, int level, int optname,
+		  const char *optval, int optlen);
+int d_shutdown (SOCKET s, int how);
+SOCKET d_socket (int af, int type, int protocol);
+
+hostent *d_gethostbyaddr(const char *addr, int len, int type);
+hostent *d_gethostbyname(const char *name);
+int d_gethostname (char *name, int namelen);
+servent *d_getservbyport(int port, const char *proto);
+servent *d_getservbyname(const char *name, const char *proto);
+protoent *d_getprotobynumber(int proto);
+protoent *d_getprotobyname(const char *name);
+
+int d_WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
+int d_WSACleanup(void);
+void d_WSASetLastError(int iError);
+int d_WSAGetLastError(void);
+BOOL d_WSAIsBlocking(void);
+int d_WSAUnhookBlockingHook(void);
+FARPROC d_WSASetBlockingHook(FARPROC lpBlockFunc);
+int d_WSACancelBlockingCall(void);
+HANDLE d_WSAAsyncGetServByName(HWND hWnd, u_int wMsg,
+			       const char *name,
+			       const char *proto,
+			       char *buf, int buflen);
+HANDLE d_WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port,
+			       const char *proto, char *buf,
+			       int buflen);
+HANDLE d_WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg,
+				const char *name, char *buf,
+				int buflen);
+HANDLE d_WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg,
+				  int number, char *buf,
+				  int buflen);
+HANDLE d_WSAAsyncGetHostByName(HWND hWnd, u_int wMsg,
+			       const char *name, char *buf,
+			       int buflen);
+HANDLE d_WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg,
+			       const char *addr, int len, int type,
+			       char *buf, int buflen);
+int d_WSACancelAsyncRequest(HANDLE hAsyncTaskHandle);
+int d_WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg,
+		     long lEvent);
+
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/fnord.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/fnord.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/fnord.cpp	(revision 21083)
@@ -0,0 +1,1067 @@
+/**********************************************************************
+ *
+ * fnord.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+#include "netio.h"
+#include "settings.h"
+#include "httpsrv.h"
+#include "resource.h"
+#include "locate.h"
+#include "cgiwrapper.h"
+#include "startbrowser.h"
+#include "d_winsock.h"
+
+#define MAINWINDOWWIDTH 400
+#define MAINWINDOWHEIGHT 200
+
+#define WASTEHEIGHT 44  // Error in ht due to caption and menu bar
+#define WASTEWIDTH 6
+#define SPACERWIDTH 5
+
+// size and position of the collection title
+#define COLTITLEWIDTH 351
+#define COLTITLEHEIGHT 35
+#define COLTITLEX ((MAINWINDOWWIDTH-COLTITLEWIDTH)/2)
+#define COLTITLEY 10
+
+// size and position of the version string
+#define VERSIONWIDTH MAINWINDOWWIDTH
+#define VERSIONHEIGHT 20
+#define VERSIONX 0
+#define VERSIONY (COLTITLEY+COLTITLEHEIGHT)
+
+// size and position of the Greenstone digital library logo
+#define LOGOWIDTH 135
+#define LOGOHEIGHT 55
+#define LOGOX (MAINWINDOWWIDTH-(LOGOWIDTH+SPACERWIDTH))
+#define LOGOY (MAINWINDOWHEIGHT-(LOGOHEIGHT+SPACERWIDTH))
+
+// size and position of the enter button
+#define ENTERBUTTONWIDTH 160
+#define ENTERBUTTONHEIGHT 30
+#define ENTERBUTTONX SPACERWIDTH
+#define ENTERBUTTONY ((MAINWINDOWHEIGHT-(LOGOHEIGHT+SPACERWIDTH))-(ENTERBUTTONHEIGHT+SPACERWIDTH))
+
+// size and position of the enter string
+#define ENTERSTRINGX (ENTERBUTTONX+ENTERBUTTONWIDTH+SPACERWIDTH)
+#define ENTERSTRINGY ENTERBUTTONY
+#define ENTERSTRINGWIDTH (MAINWINDOWWIDTH-(ENTERBUTTONWIDTH+SPACERWIDTH+SPACERWIDTH+SPACERWIDTH))
+#define ENTERSTRINGHEIGHT ENTERBUTTONHEIGHT
+
+// size and position of the info string
+#define INFOWIDTH MAINWINDOWWIDTH
+#define INFOHEIGHT (MAINWINDOWHEIGHT-INFOY)
+#define INFOX 0
+#define INFOY ENTERBUTTONY
+
+// size and position of restricted buttons
+#define ALTERNATIVEBUTTONWIDTH 160
+#define ALTERNATIVEBUTTONHEIGHT 30
+#define ALTERNATIVEBUTTONX SPACERWIDTH
+#define ALTERNATIVEBUTTONY LOGOY
+
+#define INFOBUTTONWIDTH 30
+
+// size and position of restart button
+#define RESTARTBUTTONWIDTH 160
+#define RESTARTBUTTONHEIGHT 30
+#define RESTARTBUTTONX 50
+#define RESTARTBUTTONY (MAINWINDOWHEIGHT-RESTARTBUTTONHEIGHT-15)
+
+const char versionstring[] = "version " GSDL_VERSION;
+
+const char strnothing[] = "";
+const char strinit[] = "Initialising...";
+const char strsb[] = "Starting browser...";
+const char strrestartlib[] = "Press the 'Restart Library' button to start a browser\n"
+"and enter library";
+const char strenterlib[] = "Press this button to begin using\n"
+"the library";
+const char *enterstring = NULL; // points to the current enter string
+const char *infostring = NULL; // points to the current info string
+
+
+// globals to do with networking and browsers
+int have_networking = 0;
+int netscapeneeded = 0;
+char startbrowserdir[1024] = ""; // HARD LIMIT!!!!!
+
+
+// stats to do with the last time the enter library button was pressed
+// these stats are needed to make suggestions about the proxy
+int enterlib_libaccessnum = -1; // -1 = NA
+DWORD enterlib_time = 0;
+
+
+enum { undefined_window, console_window, plain_window }
+window_state;
+
+HDC coltitledc = NULL;
+HBITMAP defcoltitlebitmap = NULL, coltitlebitmap=NULL;
+
+HDC logodc=NULL;
+HBITMAP deflogobitmap=NULL, logobitmap=NULL;
+
+HWND GoButton = NULL;
+HWND Enter = NULL;
+HWND EnterRestricted = NULL;
+HWND InfoRestricted = NULL;
+int init_type = 0;
+int init_done = 0;
+
+void finish_up() {
+  // remember the current preferences
+  write_settings();
+
+  // Shutdown the HTTP server
+  EndHTTPServer();
+  
+  // Shutdown the main server modules
+  CleanUpNetIO();
+  //    RemoveFnordFromTray();
+  
+  // Unload the wsock32 dll
+  d_UnloadWinsock();
+  
+  // Clean up graphics stuff from window
+  
+  if (defcoltitlebitmap != NULL)
+    SelectObject (coltitledc, defcoltitlebitmap);
+  if (coltitlebitmap != NULL)
+    DeleteObject (coltitlebitmap);
+  if (coltitledc != NULL)
+    DeleteDC (coltitledc);
+  
+  if (deflogobitmap != NULL)
+    SelectObject (logodc, deflogobitmap);
+  if (logobitmap != NULL)
+    DeleteObject (logobitmap);
+  if (logodc != NULL)
+    DeleteDC (logodc);
+  
+  // Shutdown the main window
+  PostQuitMessage(0);
+}
+
+
+int overlap(int left, int top, int right, int bottom,
+            RECT &r2)
+{
+  if (left <= r2.right && r2.left <= right &&
+      top <= r2.bottom && r2.top <= bottom)
+    return 1;
+  else
+    return 0;
+}
+
+
+void paint_window (HDC pdc, RECT &updateRect) {
+  // make sure the various DCs are set up
+  if (coltitledc == NULL) {
+    coltitledc = CreateCompatibleDC(pdc);
+    defcoltitlebitmap = (HBITMAP)SelectObject (coltitledc, coltitlebitmap);
+  }
+  
+  if (logodc == NULL) {
+    logodc = CreateCompatibleDC(pdc);
+    deflogobitmap = (HBITMAP)SelectObject (logodc, logobitmap);
+  }
+
+  // remove any remaining sign of initial buttons
+  if (init_done && (overlap (ENTERBUTTONX, ENTERBUTTONY, ENTERBUTTONX+ENTERBUTTONWIDTH,
+		ALTERNATIVEBUTTONY+ALTERNATIVEBUTTONHEIGHT, updateRect))) {
+    RECT initRect;
+    initRect.left = ENTERBUTTONX;
+    initRect.top = ENTERBUTTONY;
+    initRect.right = ENTERBUTTONX+ENTERBUTTONWIDTH;
+    initRect.bottom = ALTERNATIVEBUTTONY+ALTERNATIVEBUTTONHEIGHT;
+    FillRect(pdc, &initRect, (HBRUSH)GetStockObject(WHITE_BRUSH));
+  }
+
+  // update the collection title if needed
+  if (overlap(COLTITLEX, COLTITLEY,
+	      COLTITLEX+COLTITLEWIDTH, COLTITLEY+COLTITLEHEIGHT, 
+	      updateRect)) {
+    BitBlt (pdc, COLTITLEX, COLTITLEY, 
+	    COLTITLEX+COLTITLEWIDTH, COLTITLEY+COLTITLEHEIGHT,
+	    coltitledc, 0, 0, SRCCOPY);
+  }
+  
+  // update the version string if needed
+  if (overlap (VERSIONX, VERSIONY, 
+	       VERSIONX+VERSIONWIDTH, VERSIONY+VERSIONHEIGHT,
+	       updateRect)) {
+    RECT versionRect;
+    versionRect.left = VERSIONX;
+    versionRect.top = VERSIONY;
+    versionRect.right = VERSIONX+VERSIONWIDTH;
+    versionRect.bottom = VERSIONY+VERSIONHEIGHT;
+    DrawText(pdc, versionstring, -1, &versionRect, DT_CENTER);
+  }
+  
+  // decide what we want to draw
+  if (init_done && gsdl_show_console) {
+    // we want to draw a "console" window
+    if (window_state != console_window ||
+	overlap (text_rect.left, text_rect.top,
+		 text_rect.right, text_rect.bottom,
+		 updateRect)) {
+      refresh_console (pdc);
+    }
+    
+    window_state = console_window;
+    
+  } else {
+    // we want to draw a "plain" window
+    
+    // update the enter string if needed
+    if (overlap (ENTERSTRINGX, ENTERSTRINGY, ENTERSTRINGX+ENTERSTRINGWIDTH, 
+		 ENTERSTRINGY+ENTERSTRINGHEIGHT, updateRect)) {
+
+	RECT enterstringRect;
+	enterstringRect.left = ENTERSTRINGX;
+	enterstringRect.top = ENTERSTRINGY;
+	enterstringRect.right = ENTERSTRINGX+ENTERSTRINGWIDTH;
+	enterstringRect.bottom = ENTERSTRINGY+ENTERSTRINGHEIGHT;
+	FillRect(pdc, &enterstringRect, (HBRUSH)GetStockObject(WHITE_BRUSH));
+
+	if ((enterstring != NULL) && (strlen(enterstring) > 0)) {
+      
+	  int cury = ENTERSTRINGY;
+	  int startline = 0, here = 0;
+	  while (enterstring[here] != '\0') {
+	    if (enterstring[here] < ' ') {
+	      if (here - startline > 0) {
+		// output the text
+		TextOut (pdc, ENTERSTRINGX, cury, 
+			 &enterstring[startline], here-startline);
+		cury += line_spacing;
+	      }
+	      startline = here+1;
+	    }
+	    here++;
+	  }
+	  // output any remaining text
+	  if (here - startline > 0) {
+	    TextOut (pdc, ENTERSTRINGX, cury, &enterstring[startline], here-startline);
+	  }
+	}
+    }
+    
+    window_state = plain_window;
+  }
+  
+  // update the info string if needed
+  if (init_done && !gsdl_show_console && 
+      ((infostring != NULL) && overlap (INFOX, INFOY, 
+					INFOX+INFOWIDTH, INFOY+INFOHEIGHT,
+					updateRect))) {
+    RECT infoRect;
+    infoRect.left = INFOX;
+    infoRect.top = INFOY;
+    infoRect.right = INFOX+INFOWIDTH;
+    infoRect.bottom = INFOY+INFOHEIGHT;
+    FillRect(pdc, &infoRect, (HBRUSH)GetStockObject(WHITE_BRUSH));
+    DrawText(pdc, infostring, -1, &infoRect, DT_CENTER);
+  }
+
+  // update the logo (always)
+  BitBlt (pdc, LOGOX, LOGOY, LOGOX+LOGOWIDTH, LOGOY+LOGOHEIGHT,
+	  logodc, 0, 0, SRCCOPY);
+}
+
+
+void handle_painting (HWND Window) {
+  HDC pdc;  PAINTSTRUCT ps;
+  pdc = BeginPaint(Window, &ps);
+  
+  paint_window (pdc, ps.rcPaint);
+  
+  EndPaint(Window, &ps);
+}
+
+
+// returns 1 on success, 0 otherwise
+int enter_library (HWND Window) {
+  int res;
+  
+  // get the url and attempt to start a browser
+  char *localname = GetLocalName(NULL);
+  if (have_networking) {
+    text_t url = "http://" + text_t(localname);
+    if (gsdl_port_num != 80)
+      url += ":" + text_t(gsdl_port_num);
+    
+    url += gsdl_enterlib;
+
+    // add a unique ending so it will always result in a request
+    text_t::const_iterator it = 
+      findchar (gsdl_enterlib.begin(), gsdl_enterlib.end(), '?');
+    if (it == gsdl_enterlib.end()) url.push_back ('?');
+    else url.push_back ('&');
+    int tcount = GetTickCount();
+    url += "uq=" + text_t(tcount);
+    
+    // remember the library access number for later proxy checking
+    enterlib_libaccessnum = libaccessnum;
+    
+    // do a quick check to make sure we're using netscape when
+    // we should be (it might have been just installed)
+    if (netscapeneeded) gsdl_check_browser_settings (netscapeneeded);
+    
+    char *cstr_url = url.getcstr();
+    if (strlen (startbrowserdir) <= 0) {
+      res = startbrowser (cstr_url, gsdl_browser_exe, NULL);
+      
+    } else res = startbrowser (cstr_url, gsdl_browser_exe, startbrowserdir);
+    
+    delete cstr_url;
+
+  }
+  
+  if (res == SB_NOERROR) {
+    // success !!
+    
+    // remember the time the browser was started for later proxy checking
+    if (have_networking) enterlib_time = GetTickCount();
+    
+    return 1;
+  }
+  
+  // no browser was started
+  enterlib_libaccessnum = -1;
+  
+  if ((res == SB_FAIL_BADFORMAT) || (res == SB_FAIL_NOTFOUND)) {
+    if (!netscapeneeded) { // any browser
+      MessageBox(Window,
+		 "Failed to start your chosen browser. It seems that your\n"
+		 "chosen browser has been removed or corrupted.\n"
+		 "Please check you browser choice by going to the\n"
+		 "'Settings...' item under the 'File' menu.",
+		 "Greenstone Digital Library Software", MB_OK);
+    } else { // netscape used
+      MessageBox(Window,
+		 "Failed to start Netscape. It seems that Netscape has\n"
+		 "been removed or corrupted. You need Netscape\n"
+		 "installed to use the Greenstone Digital Library\n"
+		 "software on non-networked machines.",
+		 "Greenstone Digital Library Software", MB_OK);
+    }
+    
+  } else {
+    MessageBox(Window,
+	       "Failed to start your browser. This may have been\n"
+	       "because there was not enough memory available. Shut\n"
+	       "down all other applications you have running, and\n"
+	       "try again.",
+	       "Greenstone Digital Library Software", MB_OK);
+  }
+  
+  return 0; // failed
+}
+
+
+void install_netscape (HWND Window) {
+  char installpath[256];
+  
+  // try to find the browser directory
+  char *gsdlhome = gsdl_gsdlhome.getcstr();
+  strcpy (installpath, gsdlhome); // use gsdlhome to find the CD-ROM drive...
+  delete gsdlhome;
+  
+  // remove any slashes from the pathname
+  int len = strlen (installpath);
+  while ((len > 0) && ((installpath[len-1] == '\\') || (installpath[len-1] == '/'))) {
+    len--;
+  }
+  // remove '\gsdl'
+  len = len - 5;
+  installpath[len] = '\0';
+  
+  strcat (installpath, "\\netscape\\");
+  
+  // check this directory
+  if (!cstrcheckdir(installpath)) {
+    return;
+  }
+  
+  // get the operating system information
+  OSVERSIONINFO osver;
+  memset(&osver, 0, sizeof(OSVERSIONINFO));
+  osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+  GetVersionEx(&osver);
+
+  // get the install program for this operating system
+  if (osver.dwPlatformId == VER_PLATFORM_WIN32s) {
+    strcat (installpath, "n16e405.exe");
+  } else {
+    strcat (installpath, "n32e405.exe");
+  }
+  
+  // run the install program
+  int res = WinExec (installpath, SW_SHOW);
+  if (res == 0) {
+    // out of resources or memory
+    MessageBox (Window,
+		"Did not have enough resources or memory to run the\n"
+		"install program. Try shutting down all other programs\n"
+		"and trying again.",
+		"Greenstone Digital Library Software",
+		MB_OK|MB_APPLMODAL);
+    
+  } else if (res == ERROR_BAD_FORMAT) {
+    // executable image is corrupt -- ????
+    MessageBox (Window,
+		"The install program seems to be corrupt.",
+		"Greenstone Digital Library Software",
+		MB_OK|MB_APPLMODAL);
+    
+  } else if ((res == ERROR_FILE_NOT_FOUND) || (res == ERROR_PATH_NOT_FOUND)) {
+    // couldn't find the executable -- ????
+    MessageBox (Window,
+		"Could not find the install program. Try installing\n"
+		"Netscape from the Greenstone Digital Library\n"
+		"software's install program.",
+		"Greenstone Digital Library Software",
+		MB_OK|MB_APPLMODAL);
+  }
+}
+
+void open_help () {
+  char topdir[256], cmd[256];
+  
+  // try to find the browser directory
+  char *gsdlhome = gsdl_gsdlhome.getcstr();
+  strcpy (topdir, gsdlhome); // use gsdlhome to find the CD-ROM drive...
+  delete gsdlhome;
+  strcpy (cmd, "notepad ");
+  
+  // remove any slashes from the pathname
+  int len = strlen (topdir);
+  while ((len > 0) && ((topdir[len-1] == '\\') || (topdir[len-1] == '/'))) {
+    len--;
+  }
+  // remove the '\gsdl'
+  len = len - 5;
+  topdir[len] = '\0';
+
+  strcat (topdir, "\\README.txt");
+  strcat (cmd, topdir);
+  
+  WinExec (cmd, SW_SHOW);
+}
+
+
+long __stdcall WndProc(HWND Window, UINT Message, WPARAM WParam, LPARAM LParam) {
+  switch(Message) {
+    // Constant Messages
+  case WM_CREATE:
+    break;
+    
+  case WM_COMMAND:
+    if ((GoButton != NULL) && ((HWND)LParam == GoButton)) {
+      // attempt to start a browser
+      if (enter_library (Window) && !gsdl_show_console) 
+    	ShowWindow(Window,SW_MINIMIZE);
+
+    } else if ((Enter != NULL) && ((HWND)LParam == Enter)) {
+      init_done = 1;
+      init_type = 1;
+
+    } else if ((EnterRestricted != NULL) && ((HWND)LParam == EnterRestricted)) {
+      init_done = 1;
+      init_type = 0;
+
+    } else if ((InfoRestricted != NULL) && ((HWND)LParam == InfoRestricted)) {
+      MessageBox (NULL, "The Greenstone system automatically determines whether your computer has\n"
+		  "network software installed or is connected to a network.  It operates correctly\n"
+		  "under any of these conditions.\n\n"
+		  "The restricted version is intended for use when the standard one\n\n"
+		  "   (a) causes an unwanted telephone dialup operation;\n"
+		  "   (b) fails to run because network software is installed, but installed\n"
+		  "         incorrectly.\n\n"
+		  "The restricted version only works with Netscape (not Internet Explorer).\n\n"
+		  "Unless these problems arise, you should always use the standard version\n"
+		  "(press the 'Enter Library' button).\n",
+		  "Greenstone Digital Library Software", 
+		  MB_OK | MB_ICONINFORMATION | MB_APPLMODAL);
+
+    } else {
+      switch (LOWORD(WParam)) {
+      case ID_PROJECT_SETTINGS:
+	Settings_Dialog(Window, netscapeneeded);
+	break;
+      case ID_INSTALL_NETSCAPE:
+	install_netscape(Window);
+	break;
+      case IDHELP:
+	open_help();
+	break;
+      case ID_PROJECT_EXIT:
+        finish_up();
+        break;
+      default:
+        break;
+      }
+    }
+    break;
+    
+  case WM_PAINT:
+    handle_painting(Window);
+    break;
+    
+  case HTTP_SERVER_MSG:
+    ProcessHTTPServerMsg(WParam, LParam);
+    break;
+    
+  case WM_DESTROY:
+    finish_up();
+    break;
+    
+  default:
+    //Unhandled Messages end up here (DefWindowProc)
+    return DefWindowProc(Window, Message, WParam, LParam);
+  }
+  
+  return(0);
+}
+
+// returns 0 if successful,
+// otherwise a WSA error number
+int tryinitnetwork (HANDLE Instance, HWND MsgWindow, char *path) {
+  // try to load winsock
+  int err = d_LoadWinsock (path);
+  
+  if (err == D_NOERROR) {
+    // next, try to init netio
+    err = InitNetIO();
+    
+    if (err == 0) {
+      // next, try to start the http server
+      err = StartHTTPServer(MsgWindow);
+      
+      if (err == 0) {
+	// finally, get the host name (no error value
+	// is returned from this function)
+	GetLocalName((HINSTANCE)Instance);
+	
+      } else {
+	// couldn't start the http server, 
+	// deinit netio and unload winsock
+	CleanUpNetIO();
+	d_UnloadWinsock();
+      }
+      
+    } else {
+      // couldn't init netio, unload winsock
+      d_UnloadWinsock();
+    }
+    
+  } else {
+    // couldn't load winsock
+    err = WSASYSNOTREADY;
+  }
+  
+  return err;
+}
+
+
+// inits all the network functionality
+// returns 0 if an unrecoverable error occurred,
+// and 1 if everything successfully initialised.
+int initnetwork (HANDLE Instance, HWND MsgWindow) {
+  OSVERSIONINFO osver;
+  
+  // get the operating system information
+  memset(&osver, 0, sizeof(OSVERSIONINFO));
+  osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+  GetVersionEx(&osver);
+  
+  // first try to initialise the network with system installed
+  // networking software
+  startbrowserdir[0] = '\0';
+  netscapeneeded = 0;
+  int err = 1;
+  if (init_type == 1) err = tryinitnetwork (Instance, MsgWindow, NULL);
+  
+  // if an error occurred, try again with billsock
+  if (err != 0) {
+    // get the path of billsock (current directory + ("net16" | "net32"))
+    char winsockpath[1024]; // HARD LIMIT!!!!
+    
+    find_location();
+    strcpy (winsockpath, data_location);
+    
+    // remove all the slashes at the end of billpath
+    int len = strlen (winsockpath);
+    while ((len > 0) && ((winsockpath[len-1] == '\\') || (winsockpath[len-1] == '/'))) {
+      len--;
+    }
+    winsockpath[len] = '\0';
+    
+    if (osver.dwPlatformId == VER_PLATFORM_WIN32s)
+      strcat (winsockpath, "\\net16\\");
+    else {
+      strcat (winsockpath, "\\net32\\");
+      strcpy (startbrowserdir, winsockpath);
+    }
+    
+    // try again
+    err = tryinitnetwork (Instance, MsgWindow, winsockpath);
+    
+    if (err == 0) {
+      // we will need to use netscape on 95/98/NT machines
+      if (osver.dwPlatformId != VER_PLATFORM_WIN32s) {
+	netscapeneeded = 1;
+	// make sure the browser state is in step with the network condition
+	gsdl_check_browser_settings (netscapeneeded);
+      }
+      
+      // check to see if a browser is running
+      if (browserrunning(gsdl_browser_exe) == NO_ERROR) {
+	MessageBox (NULL, 
+		    "The Greenstone Digital Library software has detected a\n"
+		    "running browser. To let our networking software\n"
+		    "correctly initialize, please shut down your browser\n"
+		    "and restart the Greenstone Digital Library software.",
+		    "Greenstone Digital Library Software", MB_OK|MB_APPLMODAL);
+	PostMessage(MsgWindow,WM_CLOSE,0,0);
+	finish_up(); // will unload winsock
+	exit(0);      // nothing more to do
+      }
+    }
+  }
+  
+  // if an error occurred display a nice error message
+  if (err != 0) {
+    
+    // WSASYSNOTREADY	Couldn't load winsock
+    // WSAVERNOTSUPPORTED	The version of Windows Sockets support requested 
+    //			is not provided by this particular Windows Sockets implementation.
+    // WSAEINVAL	The Windows Sockets version specified by the application 
+    //			is not supported by this DLL.
+    // WSAEPROTONOSUPPORT	The specified protocol is not supported.
+    // WSAEPROTOTYPE	The specified protocol is the wrong type for this socket.
+    // WSAESOCKTNOSUPPORT	The specified socket type is not supported in 
+    //		this address family.
+    // WSANOTINITIALISED	A successful WSAStartup must occur before 
+    //		using this function.
+    // WSAENETDOWN	The Windows Sockets implementation 
+    //		has detected that the network subsystem has failed.
+    // WSAEADDRINUSE 	The specified address 
+    //		is already in use. (See the SO_REUSEADDR socket option under setsockopt.)
+    // WSAEFAULT	The namelen argument is too small (less 
+    //		than the size of a struct sockaddr).
+    // WSAEINPROGRESS	A blocking Windows Sockets call is in progress.
+    // WSAEAFNOSUPPORT	The specified address family is not supported 
+    //		by this protocol.
+    // WSAENOBUFS	Not enough buffers available, too many connections.
+    // WSAENOTSOCK	The descriptor is not a socket.
+    // WSAEISCONN	The socket is already connected.
+    // WSAEMFILE	No more file descriptors are available.
+    // WSAEOPNOTSUPP	The referenced socket is not of a type that 
+    //		supports the listen operation.
+    
+    // get a text version of the error number
+    char errstr[256];
+    
+    switch (err) {
+    case WSASYSNOTREADY: strcpy(errstr, "WSASYSNOTREADY"); 
+      break;
+    case WSAVERNOTSUPPORTED: strcpy (errstr, "WSAVERNOTSUPPORTED");
+      break;
+    case WSAEINVAL: strcpy (errstr, "WSAEINVAL");
+      break;
+    case WSAEPROTONOSUPPORT: strcpy (errstr, "WSAEPROTONOSUPPORT");
+      break;
+    case WSAEPROTOTYPE: strcpy (errstr, "WSAEPROTOTYPE");
+      break;
+    case WSAESOCKTNOSUPPORT: strcpy (errstr, "WSAESOCKTNOSUPPORT");
+      break;
+    case WSANOTINITIALISED: strcpy (errstr, "WSANOTINITIALISED");
+      break;
+    case WSAEFAULT: strcpy (errstr, "WSAEFAULT");
+      break;
+    case WSAEAFNOSUPPORT: strcpy (errstr, "WSAEAFNOSUPPORT");
+      break;
+    case WSAENOTSOCK: strcpy (errstr, "WSAENOTSOCK");
+      break;
+    case WSAEISCONN: strcpy (errstr, "WSAEISCONN");
+      break;
+    case WSAEOPNOTSUPP: strcpy (errstr, "WSAEOPNOTSUPP");
+      break;
+    case WSAENETDOWN: strcpy (errstr, "WSAENETDOWN");
+      break;
+    case WSAEADDRINUSE: strcpy (errstr, "WSAEADDRINUSE");
+      break;
+    case WSAEINPROGRESS: strcpy (errstr, "WSAEINPROGRESS");
+      break;
+    case WSAENOBUFS: strcpy (errstr, "WSAENOBUFS");
+      break;
+    case WSAEMFILE: strcpy (errstr, "WSAEMFILE");
+      break;
+    default: sprintf (errstr, "WSA ERROR: %i", err);
+      break;
+    }
+    
+    // create a nice error message
+    char message[2048];
+    
+    switch (err) {
+    case WSAEADDRINUSE:
+      // couldn't bind socket
+      sprintf (message, "Could not find a free socket.", errstr);
+      break;
+      
+    default:
+      // cannot init winsock
+      sprintf (message, "Could not initialize the network\n"
+	       " (Reason: %s).", errstr);
+      break;
+    }
+    
+    strcat (message, "\n\n"
+	    "Please submit a bug report using the support.htm file\n"
+	    "on the CD-ROM.");
+    
+    MessageBox (NULL, message, "Greenstone Digital Library Software", MB_OK);
+  }
+  
+  return (err == 0);
+}
+
+
+void log_computer_info () {
+  char tmpstr[1024];
+  
+  // get various information about this computer
+  if (gsdl_keep_log || gsdl_show_console) {
+    // get operating system information
+    OSVERSIONINFO osver;
+    osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+    
+    if (GetVersionEx(&osver)) {
+      if (osver.dwPlatformId == VER_PLATFORM_WIN32s) {
+	log_message ("Platform: win32s\n");
+      } else if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) {
+	log_message ("Platform: windows 95\n");
+      } else if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) {
+	log_message ("Platform: windows NT\n");
+      }
+      
+      sprintf (tmpstr, "MajorVersion: %i\n", (int)osver.dwMajorVersion);
+      log_message(tmpstr);
+      sprintf (tmpstr, "MinorVersion: %i\n", (int)osver.dwMinorVersion);
+      log_message(tmpstr);
+      sprintf (tmpstr, "BuildNumber: %i\n", (int)osver.dwBuildNumber);
+      log_message(tmpstr);
+      sprintf (tmpstr, "CSDVersion: %s\n\n", osver.szCSDVersion);
+      log_message(tmpstr);
+    }
+    
+    // get memory information
+    MEMORYSTATUS memstatus;
+    memstatus.dwLength = sizeof(MEMORYSTATUS);
+    GlobalMemoryStatus(&memstatus);
+    
+    sprintf (tmpstr, "TotalPhys: %i Meg\n", (int)(memstatus.dwTotalPhys/1024/1024));
+    log_message (tmpstr);
+    sprintf (tmpstr, "AvailPhys: %i Meg\n", (int)(memstatus.dwAvailPhys/1024/1024));
+    log_message (tmpstr);
+    sprintf (tmpstr, "TotalPageFile: %i Meg\n", (int)(memstatus.dwTotalPageFile/1024/1024));
+    log_message (tmpstr);
+    sprintf (tmpstr, "AvailPageFile: %i Meg\n", (int)(memstatus.dwAvailPageFile/1024/1024));
+    log_message (tmpstr);
+    sprintf (tmpstr, "TotalVirtual: %i Meg\n", (int)(memstatus.dwTotalVirtual/1024/1024));
+    log_message (tmpstr);
+    sprintf (tmpstr, "AvailVirtual: %i Meg\n\n", (int)(memstatus.dwAvailVirtual/1024/1024));
+    log_message (tmpstr);
+    
+    // log the version number
+    log_message("GSDL version: " GSDL_VERSION "\n");
+  }
+  
+}
+
+
+int __stdcall WinMain(HINSTANCE Instance, HINSTANCE /*PrevInstance*/, LPSTR CmdLineStr, int /*CmdShow*/) {
+  HWND MainWindow;  MSG Message;  WNDCLASS MainClass;  
+  
+  //Create a window class
+  MainClass.style = CS_HREDRAW | CS_VREDRAW;
+  MainClass.lpfnWndProc = WndProc;
+  MainClass.cbClsExtra = 0;
+  MainClass.cbWndExtra = 0;
+  MainClass.hInstance = Instance;
+  MainClass.hIcon     = LoadIcon(Instance, MAKEINTRESOURCE(TRAY_ICON));
+  MainClass.hCursor   = LoadCursor(NULL, IDC_ARROW);
+  MainClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
+  MainClass.lpszMenuName = MAKEINTRESOURCE(Main_Menu);
+  MainClass.lpszClassName = "Greenstone Digital Library Software";
+  if (!RegisterClass(&MainClass))
+    return 0;
+  
+
+  // Load various bitmaps
+  coltitlebitmap = LoadBitmap (Instance, MAKEINTRESOURCE(GSDL_COL_TITLE));
+  logobitmap= LoadBitmap (Instance, MAKEINTRESOURCE(GSDL_LOGO));
+
+  // Create the main window
+  MainWindow = CreateWindow("Greenstone Digital Library Software", 
+			    "Greenstone Digital Library Software",
+			    WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU |
+			    WS_MINIMIZEBOX,
+			    CW_USEDEFAULT, CW_USEDEFAULT, 
+			    MAINWINDOWWIDTH + WASTEWIDTH, 
+			    MAINWINDOWHEIGHT + WASTEHEIGHT,
+			    NULL, NULL, Instance, NULL);
+  
+  text_rect.left = 0;  
+  text_rect.top = VERSIONY+VERSIONHEIGHT + 5;
+  text_rect.right = MAINWINDOWWIDTH;
+  text_rect.bottom = LOGOY-SPACERWIDTH;
+  
+  window_state = undefined_window;
+  
+  ShowWindow(MainWindow, SW_SHOW); 
+  set_location(CmdLineStr);
+  
+  // get ready to draw the main window
+  RECT windowRect;
+  GetClientRect (MainWindow, &windowRect);
+  HDC pdc = GetDC (MainWindow);
+  
+  // retrieve and save the text metrics
+  TEXTMETRIC tm;
+  GetTextMetrics(pdc, &tm);
+  line_spacing = tm.tmHeight + tm.tmExternalLeading;
+  GSDL_Window = MainWindow;
+  
+  // init various modules
+  read_settings (0); // don't know if netscape is needed at this point
+
+  if (!gsdl_auto_enter) {
+
+    // add the select version checkbox
+    Enter = CreateWindow("BUTTON",             // predefined class 
+			 "Enter Library",      // button text 
+			 WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_DEFPUSHBUTTON,  // styles 
+			 ENTERBUTTONX,         // starting x position 
+			 ENTERBUTTONY,         // starting y position 
+			 ENTERBUTTONWIDTH,     // button width 
+			 ENTERBUTTONHEIGHT,    // button height 
+			 MainWindow,           // parent window 
+			 NULL,                 // No menu 
+			 Instance, 
+			 NULL);                // pointer not needed 
+    
+    EnterRestricted = CreateWindow("Button",                // predefined class 
+				   "Restricted Version",    // button text 
+				   WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_PUSHBUTTON,   // styles 
+				   ALTERNATIVEBUTTONX,      // starting x position 
+				   ALTERNATIVEBUTTONY,      // starting y position 
+				   ALTERNATIVEBUTTONWIDTH-(INFOBUTTONWIDTH+SPACERWIDTH),  // button width 
+				   ALTERNATIVEBUTTONHEIGHT, // button height 
+				   MainWindow,              // parent window 
+				   (HMENU)NULL,             // No menu 
+				   Instance, 
+				   NULL);                   // pointer not needed 
+    
+    InfoRestricted = CreateWindow("Button",                // predefined class 
+				  NULL,
+				  WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_BITMAP,   // styles 
+				  ALTERNATIVEBUTTONWIDTH-INFOBUTTONWIDTH+SPACERWIDTH, // starting x position 
+				  ALTERNATIVEBUTTONY,      // starting y position 
+				  INFOBUTTONWIDTH,         // button width 
+				  ALTERNATIVEBUTTONHEIGHT, // button height 
+				  MainWindow,              // parent window 
+				  (HMENU)NULL,             // No menu 
+				  Instance, 
+				  NULL);                   // pointer not needed 
+
+    HANDLE i_icon = LoadImage (Instance, MAKEINTRESOURCE(GSDL_ICBMP), IMAGE_BITMAP, 
+			       INFOBUTTONWIDTH-4, ALTERNATIVEBUTTONHEIGHT-4, LR_DEFAULTCOLOR);
+    SendMessage (InfoRestricted, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)i_icon);
+
+    SetFocus (Enter);
+    
+    enterstring = strenterlib;
+    paint_window (pdc, windowRect);
+
+    // message loop for init buttons
+    while (!init_done) {
+      if (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
+	if (Message.message == WM_QUIT) return Message.wParam;
+	if (!IsDialogMessage (MainWindow, &Message)) {
+	  TranslateMessage(&Message); /* translate keyboard messages */
+	  DispatchMessage(&Message);  /* return control to Windows NT */
+	}
+      } else {
+	Sleep (1);
+      }
+    }
+
+    // don't want these buttons anymore
+    DestroyWindow (Enter);
+    DestroyWindow (EnterRestricted);
+    DestroyWindow (InfoRestricted);
+
+    enterstring = strnothing;
+    paint_window (pdc, windowRect);
+
+  } else {
+    // auto enter is enabled - start up standard version
+    init_type = 1;
+    init_done = 1;
+  }
+
+  // draw the main window containing an init message
+  infostring = strinit;
+  paint_window (pdc, windowRect);
+  DWORD lastcheck = GetTickCount();
+
+  have_networking = initnetwork (Instance, MainWindow);
+  if (!have_networking) {
+    MessageBox(NULL,
+	       "Failed to initialize networking.",
+	       "Greenstone Digital Library Software",MB_OK|MB_SYSTEMMODAL);	
+    exit (0);
+  }
+
+  if (!gsdl_init()) // quit if can't initialise the library correctly
+    exit (0);
+  initstartbrowser();
+  log_computer_info ();
+
+  // show the initialising message for at least 1 second
+  while (DiffTickCounts (lastcheck, GetTickCount()) < 1000) {
+    Sleep (1);
+  }
+  
+  // attempt to start a browser
+  if (gsdl_show_console) infostring = strnothing;
+  else infostring = strsb;
+  paint_window (pdc, windowRect);
+  lastcheck = GetTickCount();
+  if (enter_library (MainWindow) && !gsdl_show_console) {
+    // stay maximised for at least 1 second
+    while (DiffTickCounts (lastcheck, GetTickCount()) < 1000) Sleep (1);
+    ShowWindow(MainWindow,SW_MINIMIZE);
+  }
+  
+  // add the "restart library" button
+  GoButton = CreateWindow("BUTTON",              // predefined class 
+			  "Restart Library",     // button text 
+			  WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles 
+			  RESTARTBUTTONX,        // starting x position 
+			  RESTARTBUTTONY,        // starting y position 
+			  RESTARTBUTTONWIDTH,    // button width 
+			  RESTARTBUTTONHEIGHT,   // button height 
+			  MainWindow,            // parent window 
+			  NULL,                  // No menu 
+			  Instance, 
+			  NULL);                 // pointer not needed 
+  
+  infostring = strrestartlib;
+  paint_window (pdc, windowRect);
+
+  // release the DC used to display the init messages
+  ReleaseDC (MainWindow, pdc);
+  
+  //Message loop
+  lastcheck = GetTickCount();
+  int seenbrowser = 0;	// if we see a browser then it disappears
+                        // we will ask if they want to close the
+                        // the library down
+  char last_gsdl_browser_exe[MAX_FILENAME_SIZE]; // need to notice when the
+                                                 // browser setting changes
+  strcpy (last_gsdl_browser_exe, gsdl_browser_exe);
+  
+  for (;;) {
+    if (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
+      if (Message.message == WM_QUIT) break;
+      if (!IsDialogMessage (MainWindow, &Message)) {
+	TranslateMessage(&Message); /* translate keyboard messages */
+	DispatchMessage(&Message);  /* return control to Windows NT */
+      }
+      
+    } else {
+      if (DiffTickCounts (lastcheck, GetTickCount()) > 500) {
+	// make sure the browser hasn't changed
+	if (strcmp (last_gsdl_browser_exe, gsdl_browser_exe) != 0) {
+	  seenbrowser = 0;
+	  strcpy (last_gsdl_browser_exe, gsdl_browser_exe);
+	}
+	
+	// do check
+	lastcheck = GetTickCount();
+	if (browserrunning(gsdl_browser_exe) == NO_ERROR) {
+	  // we were able to connect to a browser
+	  seenbrowser = 1;
+	  
+	  // see if the enter library button has been pressed
+	  // with nothing happening for 20 seconds
+	  if ((enterlib_libaccessnum >= 0) && 
+	      (enterlib_libaccessnum == libaccessnum) &&
+	      (DiffTickCounts (enterlib_time, GetTickCount()) > 20000)) {
+	    // something could be wrong!! (most likely cause is a proxy)
+	    MessageBox(NULL,
+		       "Your browser does not seem to be responding to the 'Enter Library'\n"
+		       "request. Try turning off all proxy servers in your browser settings.",
+		       "Greenstone Digital Library Software",MB_OK|MB_SYSTEMMODAL);
+	    enterlib_libaccessnum = -1;
+	  }
+	  
+	  
+	} else {
+	  // no browser was found
+
+	  if (seenbrowser) {
+	    // we have seen a browser in the past
+	    if (MessageBox(NULL,
+			   "The Greenstone Digital Library software has noticed that you\n"
+			   "shut down your browser. Would you also like to shut down the\n"
+			   "Greenstone Digital Library software?",
+			   "Greenstone Digital Library Software",MB_YESNO|MB_SYSTEMMODAL) == IDYES)
+	      PostMessage(MainWindow,WM_CLOSE,0,0);
+	  }
+	  seenbrowser = 0;
+	}
+      }
+      
+      Sleep (1); // millisecond
+    }
+  }
+  
+  return Message.wParam;
+}
Index: /main/tags/2.38/gsdl/src/w32server/httpreq.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpreq.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpreq.cpp	(revision 21083)
@@ -0,0 +1,462 @@
+/**********************************************************************
+ *
+ * httpreq.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+#include "parse.h"
+#include "netio.h"
+#include "settings.h"
+#include "httpreq.h" //Had to put myself here because of the global types...
+#include "httpsrv.h"
+#include "httpsend.h"
+#include "cgiwrapper.h"
+#include "d_winsock.h"
+
+/*
+Implementation Notes:
+
+HTTP field names, method and version strings are converted to upper case
+right after being read from the client in order to allow case insensitive
+string comparisons to be done on them.  Since these fields are worked with a
+lot, this should help performance.
+*/
+
+//Private Data and declarations
+#define IO_BUFFER_SIZE 16384        //16K IO Buffer
+#define MAX_HTTP_LINE_LEN 1024      //Max length of line in a header of 1024
+#define MAX_HTTP_FIELD_NAME_LEN 128 //Max length of name field in line
+#define MAX_HTTP_FIELD_LEN 1024     //Max length of data in line
+
+//Private Function Declarations with Return Contstants
+
+/*
+Function Name: DispatchRequest
+Purpose: Manages having the request parsed, then sent to the right function
+         to send a response or handle an error.
+Parameters:
+         ClientSocket - Socket the client is on
+	 ClientSockAddr - Address of client
+	 AddrLen - Length of address of client
+	 IOBuffer - Pointer to buffer allocated for IO operations
+	 ThreadNum - Number of thread that called this function for debugging purposes
+Notes:   I'm still playing with the keep alive support.  I commented out
+	 the stuff for giving a client a timeout because I was unable to detect
+	 disconnects.
+More Notes: Not sure if this organization will allow me to easily add support
+	    for ISAPI filter DLLs.
+*/
+void DispatchRequest(SOCKET ClientSocket, SOCKADDR_IN ClientSockAddr, int AddrLen, BYTE *IOBuffer);
+
+/*
+Function Name: Get HTTP Headers
+Purpose: Manages having the request parsed, then sent to the right function
+         to send a response or handle an error.
+Parameters:
+	RequestInfo - Request information structure (see httpreq.h)
+	RequestFields - HTTP request fields structure (see httpreq.h)
+Returns: GH_ERROR on error (diconnect, bad data, Windows in a bad mood, etc.)
+			GH_UNKNOWN_VERSION if the version number is not HTTP/0.9 or HTTP/1.x
+			GH_SIMPLE_REQUEST on a properly formated HTTP/0.9 request
+			GH_10_REQUEST on a properly formated HTTP/1.x request
+*/
+int GetHTTPHeaders(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields);
+#define GH_BAD_METHOD	   -2
+#define GH_ERROR           -1
+#define GH_UNKNOWN_VERSION  0
+#define GH_SIMPLE_REQUEST   1
+#define GH_10_REQUEST       2
+
+/*
+Function Name: Clean Up HTTP Headers
+Purpose: Cleans up memory dynamicly allocated for headers
+Parameters:
+	RequestInfo - Request information structure (see httpreq.h)
+	RequestFields - HTTP request fields structure (see httpreq.h)
+Returns: Nothing
+*/
+void CleanUpHTTPHeaders(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields);
+
+/*
+Function Name: Split Query
+Purpose: Splits the file and query part of a URI.  In other words, it
+	 puts the parts before and after the "?" in differnet strings.
+Parameters:
+	 URIStr - The requested URI
+	 FileStr - String to contain the name of the path + file part of the URI
+	 QueryStr - String to contain the query part of the URI
+Returns: TRUE if there is a query, else FALSE
+*/
+BOOL SplitQuery(char *URIStr, char *FileStr, char *QueryStr, int ThreadNum);
+
+/*
+Function Name: Get File
+Purpose: Attempts to find a given file, including looking for index.html.
+	 Updates the given URI string so it points to the true document location
+Parameters:
+	 FilePath - Path of file, may be modified to best reflect the retrived file
+				  or directory
+	 URIStr - URI string, minus the query
+Returns: GF_ERROR on error
+			GF_FILE_FOUND on success
+			GF_INDEX_FOUND if file is a directory with an index.html file in it
+			GF_DIRECTORY if file is a directory
+			GF_FILE_NOT_FOUND if file was found
+*/
+
+/*
+Function Name: Process Simple Request
+Purpose: Sends a reply to a HTTP 0.9 "simple" request
+Parameters:
+	ClientSocket - Socket the client is on
+	RequestInfo - Structure storing the parsed headers
+	IOBuffer - Pointer to buffer allocated for IO operations
+	TheadNum - Number of calling thread for debugging
+Notes: I should really test this and see if it works...
+*/
+void ProcessSimpleRequest(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields);
+
+//Public Functions
+/******************************************************************************/
+void RequestThread(RequestThreadMessageT *Parameters) {
+  SOCKADDR_IN ClientSockAddr;
+  SOCKET ClientSocket;
+  int AddrLen;
+  //Allocate an IO buffer for this thread
+  BYTE *IOBuffer = new BYTE[IO_BUFFER_SIZE];
+
+  //Get the parameters for the request
+  ClientSocket = Parameters->ClientSocket;
+  ClientSockAddr = Parameters->ClientSockAddr;
+  AddrLen = Parameters->AddrLen;
+  DispatchRequest(ClientSocket, ClientSockAddr, AddrLen, IOBuffer);
+}
+/******************************************************************************/
+
+//Private Functions
+
+/******************************************************************************/
+void DispatchRequest(SOCKET ClientSocket, SOCKADDR_IN ClientSockAddr, int AddrLen,  BYTE *IOBuffer) {
+  RequestInfoT RequestInfo;
+  RequestFieldsT RequestFields;
+
+  // TrayAddConnection();
+
+  //Setup the RequestInfo structure
+  memset(&RequestInfo, 0, sizeof(RequestInfoT));
+  RequestInfo.ThreadNum = 0;
+  RequestInfo.IOBuffer = IOBuffer;
+  RequestInfo.IOBufferSize = IO_BUFFER_SIZE;
+  RequestInfo.ClientSocket = ClientSocket;
+  RequestInfo.ClientSockAddr = ClientSockAddr;
+  RequestInfo.AddrLen = AddrLen;
+  RequestInfo.KeepAlive = FALSE;
+  
+  int GetHeadersResult;
+  do {
+    //Get Headers
+    GetHeadersResult = GetHTTPHeaders(RequestInfo, RequestFields);
+
+    //Figure out what version we're dealing with and deal with it
+    switch (GetHeadersResult) {
+    case GH_SIMPLE_REQUEST :
+      SendHTTPError(400, "HTTP Request not supported", "Only 1.x requests supported", RequestInfo, RequestFields);
+      // TrayIncNumServed();
+      break;
+    case GH_10_REQUEST :
+      ExamineURIStr(RequestFields.URIStr,&RequestInfo,&RequestFields);
+      // TrayIncNumServed();
+      break;
+    case GH_UNKNOWN_VERSION :
+      SendHTTPError(400, "HTTP Version not supported", "Only 1.x requests supported", RequestInfo, RequestFields);
+      // TrayIncNumServed();
+      break;
+/* added Feb 2002 to handle stupid MS behaviour */
+    case GH_BAD_METHOD :
+      SendHTTPError(501, "Not implemented", "Only GET and POST currently implemented", RequestInfo, RequestFields);
+      break;
+    case GH_ERROR:
+      //Disconnect
+      RequestInfo.KeepAlive = FALSE;
+      break;
+    }
+    CleanUpHTTPHeaders(RequestInfo, RequestFields);
+  } while (0/*RequestInfo.KeepAlive == TRUE*/);
+  //Close connection
+  CloseSocket(RequestInfo.ClientSocket);
+  // TrayRemoveConnection();
+}
+
+/******************************************************************************/
+int GetHTTPHeaders(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields) {
+  //Parsing and IO buffers
+  char CurLine[NETIO_MAX_LINE];
+  char NextLine[NETIO_MAX_LINE];
+  char FieldNameStr[MAX_HTTP_FIELD_NAME_LEN];
+  char FieldValStr[MAX_HTTP_FIELD_LEN];
+  
+  //Parsing and IO working vars
+  int ReadBufferIndex;
+  int DataInBuffer;
+  int Start;
+  int End;
+  int Len;
+
+  //Clear all the fields
+  memset(&RequestFields, 0, sizeof(RequestFieldsT));
+
+  ReadBufferIndex = 0;
+  DataInBuffer = 0;
+  
+  //Get First Line
+  if (GetLine(CurLine, RequestInfo.ClientSocket, RequestInfo.IOBuffer,
+	      RequestInfo.IOBufferSize, ReadBufferIndex, DataInBuffer,
+	      RequestInfo.ThreadNum) != 0) return GH_ERROR;
+  do {//Get Next Line, append it if the first charactor is space
+    if(GetLine(NextLine, RequestInfo.ClientSocket, RequestInfo.IOBuffer,
+	       RequestInfo.IOBufferSize, ReadBufferIndex, DataInBuffer,
+	       RequestInfo.ThreadNum) != 0) return GH_ERROR;
+    if ((NextLine[0] == ' ') || (NextLine[0] == '\t'))
+      strcat(CurLine, NextLine);
+  } while ((NextLine[0] == ' ') || (NextLine[0] == '\t'));
+  //Method String (first word)
+  Start = 0;
+  GetWord(RequestFields.MethodStr, CurLine, Start, End);
+  CharUpper(RequestFields.MethodStr);
+
+  /* Added Feb 2002 - IE since about version 5 send stupid frontpage requests
+     for MS Document formats eg "GET /_vti_inf.html" */ 
+  if (strcmp(RequestFields.MethodStr,"OPTIONS")==0) {
+	return GH_BAD_METHOD;
+  } 
+  //Version String (last word)
+  GetLastWord(RequestFields.VersionStr, CurLine, Start);
+  CharUpper(RequestFields.VersionStr);
+
+  if (strncmp(RequestFields.VersionStr, "HTTP/", 5) != 0) {
+    //No version, assume simple request
+    //part after method is URI
+    for (int i = 0; i < strlen(CurLine); i++) {
+      RequestFields.URIStr.push_back(CurLine[i]);
+    }
+    return GH_SIMPLE_REQUEST;
+  }
+
+  //URI String (in between End of first and Start of last)
+  //<Method> <WhiteSpace> <URI> <WhiteSpace> <Version> <CRLF>
+  //                  End^             Start^
+  text_t spacebuffer;
+  for (int i = End; i < Start; i++) {
+    // do this to remove trailing space
+    if (CurLine[i] == ' ') {
+      spacebuffer.push_back(' ');
+    } else {
+      if (!spacebuffer.empty()) {
+	RequestFields.URIStr += spacebuffer;
+	spacebuffer.clear();
+      }
+      RequestFields.URIStr.push_back(CurLine[i]);
+    }
+  }
+
+  //Only accept requests from HTTP/0.9 or HTTP/1.X clients, we'll
+  //assume that anything else will require an upgrade or patch
+  if (strncmp(RequestFields.VersionStr, "HTTP/1.", 7) != 0)
+    return GH_UNKNOWN_VERSION;
+  
+  //Get the rest of the lines
+  
+  strcpy(CurLine, NextLine);
+  
+  while (CurLine[0] != 0) {//Blank Line, we're done
+    do {//Get Next Line, append it if the first charactor is space
+      if (GetLine(NextLine, RequestInfo.ClientSocket, RequestInfo.IOBuffer,
+		  RequestInfo.IOBufferSize, ReadBufferIndex, DataInBuffer,
+		  RequestInfo.ThreadNum) != 0)
+	return GH_ERROR;
+      if ((NextLine[0] == ' ') || (NextLine[0] == '\t'))
+	strcat(CurLine, NextLine);
+    } while ((NextLine[0] == ' ') || (NextLine[0] == '\t'));
+    
+    Start = 0;
+    GetWord(FieldNameStr, CurLine, Start, End);
+    CharUpper(FieldNameStr);
+    
+    Len = strlen(CurLine) - End;
+    memcpy(FieldValStr, CurLine + End, Len);
+    FieldValStr[Len] = 0;
+    
+    //Process it
+    //In order of expected commonality
+    //All constants are in canonized, thus in upper case and case sensitive
+    //comparisons are used
+    //--Just About Always--
+    if (strcmp("ACCEPT:", FieldNameStr) == 0) {
+      if (RequestFields.AcceptStr[0] == '\0') {
+        strncpy(RequestFields.AcceptStr, FieldValStr, ReqAcceptStrLen - 1);
+      }
+      else {
+       	//Append it with a comma
+        int AcceptStrLen = strlen(RequestFields.AcceptStr);
+        if ((ReqAcceptStrLen - AcceptStrLen) >= 10) {
+          strncat(RequestFields.AcceptStr, ", ", ReqAcceptStrLen - AcceptStrLen - 1);
+          strncat(RequestFields.AcceptStr, FieldValStr, ReqAcceptStrLen - AcceptStrLen - 3);
+	}
+      }
+    }
+    else if (strcmp("DATE:", FieldNameStr) == 0) {
+      strncpy(RequestFields.DateStr, FieldValStr, ReqDateStrLen - 1);
+    }
+    else if (strcmp("USER-AGENT:", FieldNameStr) == 0) {
+      strncpy(RequestFields.UserAgentStr, FieldValStr, ReqUserAgentStrLen - 1);
+    }
+    else if (strcmp("CONNECTION:", FieldNameStr) == 0) {
+      strncpy(RequestFields.ConnectionStr, FieldValStr, ReqConnectionStrLen - 1);
+    }
+    //--Sometimes--
+    else if (strcmp("ACCEPT-LANGUAGE:", FieldNameStr) == 0) {
+      strncpy(RequestFields.AcceptLangStr, FieldValStr, ReqAcceptLangStrLen - 1);
+    }
+    else if (strcmp("REFERER:", FieldNameStr) == 0) {
+      strncpy(RequestFields.RefererStr, FieldValStr, ReqRefererStrLen - 1);
+    }
+    else if (strcmp("IF-MODIFIED-SINCE:", FieldNameStr) == 0) {
+      strncpy(RequestFields.IfModSinceStr, FieldValStr, ReqIfModSinceStrLen - 1);
+    }
+    //--Uncommon--
+    else if (strcmp("FROM:", FieldNameStr) == 0) {
+      strncpy(RequestFields.FromStr, FieldValStr, ReqFromStrLen - 1);
+    }
+    else if (strcmp("MIME-VERSION:", FieldNameStr) == 0) {
+      strncpy(RequestFields.MIMEVerStr, FieldValStr, ReqMIMEVerStrLen - 1);
+    }
+    else if (strcmp("PRAGMA:", FieldNameStr) == 0) {
+      strncpy(RequestFields.PragmaStr, FieldValStr, ReqPragmaStrLen - 1);
+    }
+    //--Special case--
+    else if (strcmp("AUTHORIZATION:", FieldNameStr) == 0) {
+      strncpy(RequestFields.AuthorizationStr, FieldValStr, ReqAuthorizationStrLen - 1);
+    }
+    else if (strcmp("CONTENT-LENGTH:", FieldNameStr) == 0) {
+      strncpy(RequestFields.ContentLengthStr, FieldValStr, ReqContentLengthStrLen - 1);
+    }
+    else if (strcmp("CONTENT-TYPE:", FieldNameStr) == 0) {
+      strncpy(RequestFields.ContentTypeStr, FieldValStr, ReqContentTypeStrLen - 1);
+    }
+    else if (strcmp("CONTENT-ENCODING:", FieldNameStr) == 0) {
+      strncpy(RequestFields.ContentEncodingStr, FieldValStr, ReqContentEncodingStrLen - 1);
+    }
+    else {
+      //Add it to the other headers
+      int VarLen = strlen(FieldNameStr);
+      if (FieldNameStr[VarLen - 1] == ':') {
+	//Remove the colon
+	FieldNameStr[VarLen - 1] = '\0';
+	VarLen--;
+      }
+      RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Var = new char[VarLen + 1];
+      RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Val = new char[Len + 1];
+      strcpy(RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Var, FieldNameStr);
+      strcpy(RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Val, FieldValStr);
+      RequestFields.NumOtherHeaders++;
+    }
+    strcpy(CurLine, NextLine);
+  }
+  
+  if (RequestFields.ContentLengthStr[0] != 0) { //Do we have attached data?
+    unsigned int NumRecv;
+    
+    RequestFields.ContentLength = atol(RequestFields.ContentLengthStr);
+    if (RequestFields.ContentLength > 0) {
+
+      //Allocate memory
+      RequestFields.Content = new BYTE[RequestFields.ContentLength];
+      
+      //Get rest of data from get lines
+      NumRecv = DataInBuffer - ReadBufferIndex;
+      
+      if (NumRecv >RequestFields.ContentLength) {
+	//Overflow, only read what they said they'd send
+	NumRecv = RequestFields.ContentLength;
+      }
+      memcpy(RequestFields.Content, RequestInfo.IOBuffer + ReadBufferIndex,
+	     NumRecv);
+      
+      while (NumRecv < RequestFields.ContentLength) {
+	NumRecv += GetData(RequestInfo.ClientSocket,
+			   RequestFields.Content + NumRecv,
+			   RequestFields.ContentLength - NumRecv,
+			   RequestInfo.ThreadNum);
+	if (NumRecv < 0) return GH_ERROR;
+      }
+
+      // It seems to be important on NT that all available data was read
+      // from the socket before the socket is closed (otherwise netscape
+      // throws a "connection reset by peer" error). Since netscape seems
+      // to send a few extra bytes in certain situations we'll make sure we
+      // slurp it all up here.
+      char *tmpbuffer = new char(100);
+      //      unsigned long int nonblockmode=1;
+      //      ioctlsocket(RequestInfo.ClientSocket, FIONBIO, &nonblockmode);
+      d_recv(RequestInfo.ClientSocket, tmpbuffer, 100, 0);
+      delete tmpbuffer;
+
+    }
+    else {
+      RequestFields.Content = NULL;
+      RequestFields.ContentLength = 0;
+    }
+  }
+  else {
+    RequestFields.Content = NULL;
+    RequestFields.ContentLength = 0;
+  }
+  
+  return GH_10_REQUEST;
+}
+
+/******************************************************************************/
+void CleanUpHTTPHeaders(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields) {
+  //Clean up memory allocated for the Content
+  if (RequestFields.Content != NULL)
+    delete[] RequestFields.Content;
+  while (RequestFields.NumOtherHeaders > 0) {
+    RequestFields.NumOtherHeaders--;
+    delete[] RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Var;
+    delete[] RequestFields.OtherHeaders[RequestFields.NumOtherHeaders].Val;
+  }
+  
+  // clean up memory allocated for the IOBuffer
+  if (RequestInfo.IOBuffer != NULL) {
+    delete[] RequestInfo.IOBuffer;
+    RequestInfo.IOBuffer = NULL;
+  }
+}
Index: /main/tags/2.38/gsdl/src/w32server/httpreq.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpreq.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpreq.h	(revision 21083)
@@ -0,0 +1,166 @@
+/**********************************************************************
+ *
+ * httpreq.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef HTTPREQ_H
+#define HTTPREQ_H
+
+#include "locate.h"
+#include "text_t.h"
+
+/*
+Module Name: HTTP Request
+Purpose: Parses HTTP requests and then calls the appropriate function
+	to respond to the request
+Public Functions:
+	Request Thread
+*/
+
+// Public Data Structures
+
+//Used for sending information to the request thread
+struct RequestThreadMessageT {
+  SOCKADDR_IN ClientSockAddr;
+  SOCKET ClientSocket;
+  int AddrLen;
+};
+
+//Length constants for RequestFieldsT
+#define ReqMethodStrLen           24
+#define ReqVersionStrLen          24
+#define ReqDateStrLen             48
+#define ReqMIMEVerStrLen          24
+#define ReqPragmaStrLen          128
+#define ReqAuthorizationStrLen   512
+#define ReqFromStrLen            128
+#define ReqIfModSinceStrLen       48
+#define ReqRefererStrLen         512
+#define ReqUserAgentStrLen       256
+#define ReqContentEncodingStrLen 128
+#define ReqContentTypeStrLen     128
+#define ReqContentLengthStrLen    48
+#define ReqAcceptStrLen          256
+#define ReqAcceptLangStrLen       48
+#define ReqConnectionStrLen       24
+#define ReqAuthorizedUserStrLen   48
+#define ReqPathInfoStrLen        512
+#define ReqPathTranslatedStrLen  512
+#define ReqScriptNameStrLen      512
+
+#define MAX_OTHER_HEADERS 100
+
+struct RequestHeaderT {
+  char *Var;
+  char *Val;
+};
+
+struct RequestFieldsT {
+  //Simple request line info v0.9
+  char MethodStr[ReqMethodStrLen];
+  text_t URIStr;
+  //added v1.0
+  char VersionStr[ReqVersionStrLen];
+  //General Header
+  char DateStr[ReqDateStrLen];
+  char MIMEVerStr[ReqMIMEVerStrLen];
+  char PragmaStr[ReqPragmaStrLen];
+  //Request Header
+  char AuthorizationStr[ReqAuthorizationStrLen];
+  char FromStr[ReqFromStrLen];
+  char IfModSinceStr[ReqIfModSinceStrLen];
+  char RefererStr[ReqRefererStrLen];
+  char UserAgentStr[ReqUserAgentStrLen];
+  //Entity Header (Only CGI stuff)
+  char ContentEncodingStr[ReqContentEncodingStrLen];
+  char ContentTypeStr[ReqContentTypeStrLen];
+  char ContentLengthStr[ReqContentLengthStrLen];
+  //v1.0 Optional (the more common ones)
+  char AcceptStr[ReqAcceptStrLen];
+  char AcceptLangStr[ReqAcceptLangStrLen];
+  //v1.1 Exentions
+  char ConnectionStr[ReqConnectionStrLen];
+  //Pointer to buffer containing the content
+  DWORD ContentLength;
+  BYTE *Content;
+  
+  //Authorized user, filled in if a user is authorized from Auth..Str above
+  char AuthorizedUserStr[ReqAuthorizedUserStrLen];
+  
+  //CGI style fields
+  char PathInfoStr[ReqPathInfoStrLen];
+  char PathTranslatedStr[ReqPathTranslatedStrLen];
+  char ScriptNameStr[ReqScriptNameStrLen];
+  
+  //Other Headers
+  int NumOtherHeaders;
+  RequestHeaderT OtherHeaders[MAX_OTHER_HEADERS];
+};
+
+struct RequestInfoT {
+  int ThreadNum;
+  
+  //Buffer for IO operations (so we're not constantly reallocating buffers)
+  BYTE *IOBuffer;
+  int IOBufferSize;
+  
+  //Socket the request is on and its address
+  SOCKET ClientSocket;
+  SOCKADDR_IN ClientSockAddr;
+  int AddrLen;
+  
+  //Should we keep the connection alive?
+  BOOL KeepAlive;
+};
+
+
+// Public Functions
+
+/*
+Function Name: RequestThread
+Purpose: Was the HTTP request processing thread
+         Now just a standard procedure called to process a request
+Parameters:
+	       Pointer to packed parameter structure
+*/
+void RequestThread(RequestThreadMessageT *Parameters);
+
+/*
+Function Name: Process 1.0 Request
+Purpose: Sends a HTTP 1.0 (plus some) reply to a HTTP 1.x request
+Parameters:
+	ClientSocket - Socket the client is on
+	ClientSockAddr - Address of client
+	AddrLen - Length of client address
+	RequestInfo - Structure storing the parsed headers
+	KeepAlive - To be set to true if we are maintainig the connection
+	IOBuffer - Pointer to buffer allocated for IO operations
+	TheadNum - Number of calling thread for debugging
+Notes: The function uses "Connection: Keep-Alive" as written in the HTTP/1.1
+	draft and implemented by Netscape and MSIE
+*/
+void Process10Request(RequestInfoT &RequestInfo, RequestFieldsT &RequestFields);
+
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/httpsend.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpsend.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpsend.cpp	(revision 21083)
@@ -0,0 +1,109 @@
+/**********************************************************************
+ *
+ * httpsend.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+#include "netio.h"
+#include "httpreq.h"
+#include "httpsend.h"
+
+//Private Function Declarations
+/*
+Function Name: Check IMS Date
+Purpose: Checks the string date of an "If Modified Since" header against
+	a file date stamp.
+Parameters:
+	FileTime - Time stamp on file
+	IMSStr - "If Modified Since" date string
+Returns: TRUE if the file has been modified since the given date or
+	the data can not be resolved (the string to date function will log
+	any errors)
+*/
+BOOL CheckIMSDate(SYSTEMTIME &FileTime, char *IMSStr);
+
+//Public Functions
+/******************************************************************************/
+
+void SendHTTPError(int ErrorNum, char *ErrorTitleStr, char *ErrorDescStr, 
+		   RequestInfoT &RequestInfo, RequestFieldsT &RequestFields) {
+  char Header[512];
+  char Body[512];
+
+  char ErrorNumStr[17];
+  
+  DWORD BodyLength;
+  char BodyLengthStr[17];
+
+  int HeaderLength;
+  
+  itoa(ErrorNum, ErrorNumStr, 10);
+  
+  // Didn't find it, build the message manually
+  Body[0] = 0;
+  strcat(Body, "<HTML><HEAD><TITLE>Server Error</TITLE></HEAD><BODY>\n");
+  strcat(Body, "<H1>Error ");
+  strcat(Body, ErrorNumStr);
+  strcat(Body, ": ");
+  strcat(Body, ErrorTitleStr);
+  strcat(Body, "</H1>\n");
+  strcat(Body, ErrorDescStr);
+  strcat(Body, "\n</BODY></HTML>");
+  BodyLength = (DWORD) strlen(Body);
+
+  //Build Header
+  Header[0] = 0;
+  //Status Line
+  strcat(Header, "HTTP/1.0 ");
+  strcat(Header, ErrorNumStr);
+  strcat(Header, " ");
+  strcat(Header, ErrorDescStr);
+  strcat(Header, "\r\n");
+  //Server
+  strcat(Header, "Server: GSDL\r\n");
+  //Content Type (assume HTML)
+  strcat(Header, "Content-Type: text/html\r\n");
+  //Content Length
+  itoa(BodyLength, BodyLengthStr, 10);
+  strcat(Header, "Content-Length: ");
+  strcat(Header, BodyLengthStr);
+  strcat(Header, "\r\n");
+  //Single CRLF to end header
+  strcat(Header, "\r\n");
+  
+  HeaderLength = strlen(Header);
+  
+  //Send header
+  SendData(RequestInfo.ClientSocket, (BYTE *) Header, strlen(Header), RequestInfo.ThreadNum);
+  //Send generated data
+  SendData(RequestInfo.ClientSocket, (BYTE *) Body, BodyLength, RequestInfo.ThreadNum);
+}
Index: /main/tags/2.38/gsdl/src/w32server/httpsend.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpsend.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpsend.h	(revision 21083)
@@ -0,0 +1,51 @@
+/**********************************************************************
+ *
+ * httpsend.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+/*
+Module Name: HTTP Send
+Purpose: Functions for sending HTTP responses to 1.X requests
+Public Functions:
+	SendHTTPError
+Notes: Considering adding a version number parameter to these functions.  Right
+	now the way people are implementing HTTP/1.1 is by adding the new stuff
+	to 1.0 requests.  I don't know of any browsers sending 1.1 requests yet.
+*/
+
+/*
+Function Name: Send HTTP Error
+Purpose: Sends a given error message to the client with either the error file
+			as a body or a default error message body.  Common and refenece log
+			entries are written, but not to the count log.
+Parameters:
+	ErrorNum - HTTP error number to send
+	ErrorTitleStr - Title of the error
+	ErrorDescStr - String describing the error
+	RequestInfo - HTTP request information (see httpreq.h)
+	RequestFields - Parsed HTTP header info (see httpreq.h)
+*/
+void SendHTTPError(int ErrorNum, char *ErrorTitleStr, char *ErrorDescStr, 
+		   RequestInfoT &RequestInfo, RequestFieldsT &RequestFields);
Index: /main/tags/2.38/gsdl/src/w32server/httpsrv.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpsrv.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpsrv.cpp	(revision 21083)
@@ -0,0 +1,103 @@
+/**********************************************************************
+ *
+ * httpsrc.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+#include "netio.h"
+#include "settings.h"
+#include "httpreq.h"
+#include "httpsrv.h"
+#include "locate.h"
+
+//Private Functions
+
+/*
+Function Name: HTTP Server Answer
+Purpose: Answers messages saying that a connection is ready to start
+*/
+void HTTPServerAnswer();
+
+//Module Vars
+static SOCKET ServerSocket = INVALID_SOCKET;
+
+static HWND MsgWindow;
+
+/******************************************************************************/
+// returns 0 on success, and a WSA error otherwise
+int StartHTTPServer(HWND PassedMsgWindow) {
+  
+  MsgWindow = PassedMsgWindow;
+  //Create the server socket
+  return CreateListeningSocket(gsdl_port_num, MsgWindow, HTTP_SERVER_MSG, ServerSocket);
+}
+
+/******************************************************************************/
+void EndHTTPServer()
+{
+  //Stop the listening socket
+  DestroyListeningSocket(ServerSocket, MsgWindow);
+}
+
+/******************************************************************************/
+void ProcessHTTPServerMsg(WPARAM Socket, LPARAM MsgInfo) {
+  log_message("accept message arrived\n");
+  if (Socket != ServerSocket) {
+    if (gsdl_keep_log || gsdl_show_console) log_message("Incorrect socket sent in message");
+  }
+  switch (WSAGETSELECTEVENT(MsgInfo)) {
+  case FD_ACCEPT:
+    switch (WSAGETSELECTERROR(MsgInfo)) {
+    case WSAENETDOWN:
+      LogCriticalError("1","Network Down");
+      break;
+    default: //No Error
+      HTTPServerAnswer();
+    }
+    break;
+  }
+}
+
+/******************************************************************************/
+void HTTPServerAnswer() {
+  SOCKADDR_IN ClientSockAddr;
+  SOCKET ClientSocket;
+  int AddrLen = sizeof(SOCKADDR_IN);
+  RequestThreadMessageT Parameters;
+  while (AnswerListeningSocket(ServerSocket, ClientSocket, ClientSockAddr, AddrLen) == 0) {
+    log_message("Answering socket\n");
+    //Call the thread procedure to handle the connection
+    Parameters.ClientSockAddr = ClientSockAddr;
+    Parameters.ClientSocket = ClientSocket;
+    Parameters.AddrLen = AddrLen;
+    RequestThread(&Parameters);
+  }
+}
Index: /main/tags/2.38/gsdl/src/w32server/httpsrv.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/httpsrv.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/httpsrv.h	(revision 21083)
@@ -0,0 +1,57 @@
+/**********************************************************************
+ *
+ * httpsrv.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#define HTTP_SERVER_MSG WM_USER + 23
+
+/*
+Function Name: Start HTTP Server
+
+Purpose: Starts the HTTP server.  Inits Winsock, MIME, loads registry
+         stuff, etc.
+
+Parameters:
+	PassedMsgWindow - The handle of the window that handles messages.  Needed
+                          to setup WSASelect notification of socket events and
+                          to send a shutdown message on error.  */
+
+// returns 0 on success, and a WSA error otherwise
+int StartHTTPServer(HWND PassedMsgWindow);
+
+/*
+Function Name: End HTTP Server
+Purpose: Ends the HTTP server.  Cleans up MIME, users, etc.
+*/
+void EndHTTPServer();
+
+/*
+Function Name: Process HTTP Server Message
+Purpose: Processes HTTP_SERVER_MSG messages.
+Parameters:
+	Socket - The socket the message is regarding (WPARAM)
+	MsgInfo - The messsage (LPARAM)
+*/
+void ProcessHTTPServerMsg(WPARAM Socket, LPARAM MsgInfo);
Index: /main/tags/2.38/gsdl/src/w32server/locate.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/locate.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/locate.cpp	(revision 21083)
@@ -0,0 +1,267 @@
+/**********************************************************************
+ *
+ * locate.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include <windows.h>
+#include <stdio.h>
+#include "locate.h"
+#include "settings.h"
+
+/* The following values are inserted or used by FNORD.CPP */
+HWND GSDL_Window;
+int line_spacing;
+RECT text_rect;
+
+
+static FILE *log_file=NULL;
+
+static int location_found=0;
+char data_location[MAX_FILENAME_SIZE];
+
+void set_location(char *possible)
+{
+  if (location_found != 0) return;
+  if (possible != NULL && *possible != 0) {
+    strcpy(data_location, possible);
+    if (data_location[strlen(data_location)-1] != '\\')
+      strcat(data_location,"\\");
+    location_found = 1;
+  }
+}
+
+void find_location(void)
+{
+  char *send;
+  if (location_found != 0) return;
+  if (GetModuleFileName(NULL,data_location,MAX_FILENAME_SIZE) <= 0)
+    send = data_location;
+  else {
+    send = strrchr(data_location,'\\');
+    if (send != NULL)
+      send++;
+    else {
+      send = strchr(data_location,':');
+      if (send != NULL)
+        send++;
+      else
+        send == data_location;
+      }
+    }
+  *send = 0;
+  location_found = 1;
+}
+
+void open_log_file()
+{
+  if (log_file != NULL) fclose(log_file);
+  log_file = fopen(gsdl_log_name, "a");
+  if (log_file != NULL) {
+	  fprintf (log_file, "\n\n-----------\n");
+	  fprintf (log_file, "log started\n");
+	  fprintf (log_file, "-----------\n\n");
+  }
+}
+
+void close_log_file()
+{
+  if (log_file != NULL) {
+    fclose(log_file);
+    log_file = NULL;
+  }
+}
+
+#define CONSOLE_BUFFER_SIZE 2048
+char console_buffer[CONSOLE_BUFFER_SIZE];
+char *next_console, *last_console;
+int console_top, console_y;
+
+void activate_console(void)
+{
+  gsdl_show_console = 1;
+  next_console = console_buffer;
+  *next_console = 0;
+  last_console = next_console;
+  console_y = console_top = text_rect.top +
+    (text_rect.bottom - text_rect.top + 1) % line_spacing / 2;
+  InvalidateRect(GSDL_Window,NULL,TRUE);
+}
+
+void deactivate_console(void)
+{
+  gsdl_show_console = 0;
+  InvalidateRect(GSDL_Window,NULL,TRUE);
+}
+
+void refresh_console(HDC dc)
+{
+  int loc;  char *b, *e;
+  loc = console_top;
+  for (e = console_buffer;;) {
+    b = e;
+    while (*e >= ' ') e++;
+    TextOut(dc,0,loc,b,e-b);
+    loc += line_spacing;
+    if (*e == 0) break;
+    e++;
+    if (*e == 0) break;
+    }
+}
+
+void scroll(HDC dc, int nbits)
+{
+  RECT scroll, clip, update;
+
+  scroll.left = clip.left = text_rect.left;
+  scroll.right = clip.right = text_rect.right;
+  clip.top = console_top;
+  clip.bottom = text_rect.bottom;
+  scroll.top = clip.top + nbits;
+  scroll.bottom = text_rect.bottom;
+  ScrollDC(dc,0,-nbits,&scroll,&clip,NULL,&update);
+  FillRect(dc,&update, (HBRUSH)GetStockObject(WHITE_BRUSH));
+}
+
+int remove_line()
+{
+  char *bin, *bout;
+  bin = bout = console_buffer;
+  while (*bin >= ' ') bin++;
+  if (*bin != 0) {
+    bin++;
+    if (*bin != 0) {
+      while (*bin != 0) *bout++ = *bin++;
+      *bout = *bin;
+      last_console -= (bin - bout);
+      next_console = bout;
+      return line_spacing;
+      }
+    }
+  next_console = console_buffer;
+  *next_console = 0;
+  last_console = next_console;
+  return 0;
+}
+
+void display_line(HDC dc, char *line, int nch)
+{
+  int scroll_needed = 0;
+  while (next_console + nch + 1 
+         > console_buffer + CONSOLE_BUFFER_SIZE)
+    scroll_needed += remove_line();
+  console_y -= scroll_needed;
+  if (*last_console == '\n') {
+    console_y += line_spacing;
+    if (console_y + line_spacing > text_rect.bottom) {
+      scroll_needed += remove_line();
+      console_y -= line_spacing;
+      }
+    last_console = next_console;
+    }
+  if (scroll_needed != 0) scroll(dc, scroll_needed);
+  while (nch-- > 0) *next_console++ = *line++;
+  TextOut(dc,0,console_y,last_console,next_console-last_console);
+  *next_console = *line;
+  if (*next_console != 0) {
+    last_console = next_console;
+    next_console++;
+    *next_console = 0;
+    }
+}
+
+void display_text(HDC dc, char *buffer)
+{
+  char *bl, *bp;
+  for (bl = buffer;;) {
+    for (bp = bl;;) {
+      if (*bp == '\t') *bp = ' ';
+      if (*bp < ' ') break;
+      bp++;
+      }
+    if (*bp != 0) *bp = '\n';
+    display_line(dc, bl, bp-bl);
+    if (*bp == 0) break;
+    bl = bp+1;
+    if (*bl == 0) break;
+    }
+}
+
+void log_message(char *msg)
+{
+  if (log_file != NULL) {
+    fprintf(log_file,"%s",msg);
+    fflush(log_file);
+  }
+  if (gsdl_show_console) {
+    char buffer[1024];  HDC dc;
+    sprintf(buffer,"%s",msg);
+    dc = GetDC(GSDL_Window);
+    display_text(dc,buffer);
+    ReleaseDC(GSDL_Window,dc);
+  }
+}
+
+void log_message_N(char*msg, int n)
+{
+  if (log_file != NULL) {
+    int len = 0;
+    while (len < n) {
+      fputc (msg[len], log_file);
+      len++;
+    }
+    fflush(log_file);
+  }
+  
+  // these messages are not send to the console
+  if (gsdl_show_console) {
+    HDC dc;
+    dc = GetDC(GSDL_Window);
+    display_text(dc,"message only written to log file\n");
+    ReleaseDC(GSDL_Window,dc);
+  }
+}
+
+void LogCriticalError(char *cderr, char *Msg)
+{
+  char MsgBoxStr[200];
+  
+  strcpy(MsgBoxStr, "Critical Error Number ");
+  strcat(MsgBoxStr, cderr);
+  strcat(MsgBoxStr, "\n");
+  strcat(MsgBoxStr, Msg);
+  strcat(MsgBoxStr, "\nGreenstone Digital Library software\nshutting down");
+  MessageBox(GSDL_Window, MsgBoxStr, "Greenstone Digital Library Software",
+	     MB_OK | MB_ICONERROR);
+  PostMessage(GSDL_Window, WM_DESTROY, 0, 0);
+}
+
+
+/* returns second-first taking into account wrap around */
+DWORD DiffTickCounts (DWORD first, DWORD second) 
+{
+  if (second >= first) return (second-first);
+  return (MAXDWORD-first+1+second);
+}
Index: /main/tags/2.38/gsdl/src/w32server/locate.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/locate.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/locate.h	(revision 21083)
@@ -0,0 +1,54 @@
+/**********************************************************************
+ *
+ * locate.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef MAX_FILENAME_SIZE
+#define MAX_FILENAME_SIZE 2048
+#endif
+
+extern HWND GSDL_Window;
+extern int line_spacing;
+extern RECT text_rect;
+
+void refresh_console(HDC dc);
+
+extern char data_location[MAX_FILENAME_SIZE];
+
+extern void set_location(char *possible);
+extern void find_location(void);
+
+extern void open_log_file(void);
+extern void close_log_file(void);
+extern void log_message(char *msg);
+extern void log_message_N(char*msg, int n);
+
+extern void activate_console(void);
+extern void deactivate_console(void);
+
+extern void LogCriticalError(char *cderr, char *Msg);
+
+/* returns first-second taking into account wrap around */
+extern DWORD DiffTickCounts (DWORD first, DWORD second);
Index: /main/tags/2.38/gsdl/src/w32server/netio.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/netio.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/netio.cpp	(revision 21083)
@@ -0,0 +1,471 @@
+/**********************************************************************
+ *
+ * netio.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+#include "netio.h"
+#include "locate.h"
+#include "d_winsock.h"
+
+//Private Variables and Declarations
+
+//Max string size for a host name
+#define MAXHOSTNAME 100
+
+//Timeout for waiting between "packets" in seconds
+#define NETIO_CONN_TIMEOUT 20 //3 sec  was 180 @@@@@ WJR
+
+#define HTTP_DNS_MSG WM_USER + 1
+int dns_msg_received = 0;
+int dns_msg_error = 0;
+
+DWORD LocalIPNumber;
+char LocalName[MAXHOSTNAME];
+
+//Private Function Declarations
+DWORD GetHostID();
+
+// returns 0 on success,
+// WSASYSNOTREADY, WSAVERNOTSUPPORTED, or WSAEINVAL on failure
+int InitNetIO() {
+  WSADATA Data;
+  
+  // Load Winsock
+  int err = d_WSAStartup(MAKEWORD(1, 1), &Data);
+  
+  // get local IP number
+  if (err == 0) LocalIPNumber = GetHostID();
+  else LocalIPNumber = INADDR_ANY;
+  
+  // set the Local Name to "" for now
+  LocalName[0] = 0;
+  
+  return err;
+}
+
+
+void CleanUpNetIO() {
+  //Experimental, heard this will better clean up, especialy if a call is
+  //blocking....
+  d_WSAUnhookBlockingHook();
+
+  //Clean up Winsock
+  d_WSACleanup();
+}
+
+
+void ResetNetIO() {
+  //Figure out the local name on first querry, set to "" until then...
+  LocalName[0] = 0;
+}
+
+
+DWORD GetLocalIP() {
+  return LocalIPNumber;
+}
+
+long __stdcall DNSWindowProc(HWND hWnd,UINT wMsg, WPARAM wParam, LPARAM lParam) {
+  if (wMsg == HTTP_DNS_MSG) {
+    dns_msg_received = 1;
+    dns_msg_error = WSAGETASYNCERROR(lParam);
+    return 0;
+  }
+  
+  return DefWindowProc(hWnd, wMsg, wParam, lParam);
+}
+
+char *GetLocalName(HINSTANCE hInstance) {
+  // static in case it is written to after the function has finished
+  // (I did not error checking on WSACancelAsyncRequest)
+  static char buf[MAXGETHOSTSTRUCT];
+	
+  if (LocalName[0] == 0) {
+    hostent *DNSResult = NULL;
+    in_addr LocalInAddr;
+    
+    // if we failed to get the local IP number
+    // use the loop-back device
+    if (LocalIPNumber == INADDR_ANY) {
+      strcpy(LocalName, "127.0.0.1"); // loop-back device
+      return LocalName;
+    }
+    
+    //Convert the number to an in_addr struct
+    LocalInAddr.s_addr = LocalIPNumber;
+    
+    // if we fail to find the domain name we will
+    // still want the IP address
+    strcpy(LocalName, d_inet_ntoa(LocalInAddr));
+    
+    // make sure they actually passed in an instance handle
+    if (hInstance == NULL) return LocalName;
+    
+    // do a async domain name lookup so that we
+    // can control the timeout
+    
+    // create a window class and window to handle the async messages
+    WNDCLASS wc; HWND hwndDNS;
+    
+    wc.style = 0;
+    wc.lpfnWndProc = DNSWindowProc;
+    wc.cbClsExtra = 0;
+    wc.cbWndExtra = 0;
+    wc.hInstance = hInstance;
+    wc.hIcon = NULL;
+    wc.hCursor = NULL;
+    wc.hbrBackground = NULL;
+    wc.lpszMenuName = NULL;
+    wc.lpszClassName = "GSDL DNS Window";
+    if (!RegisterClass(&wc)) return LocalName;
+    
+    hwndDNS = CreateWindow("GSDL DNS Window", "", 
+			   WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 
+			   NULL, NULL, hInstance, NULL);
+    if (!hwndDNS) return LocalName;
+    
+    // process all messages currently on the queue
+    MSG Message;
+    while (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
+      TranslateMessage(&Message); /* translate keyboard messages */
+      DispatchMessage(&Message);  /* return control to Windows NT */
+    }
+    
+    //Do a async DNS lookup on the IP number
+    dns_msg_received = 0;
+    dns_msg_error = 0;
+    HANDLE asyncGetHostReq = d_WSAAsyncGetHostByAddr(
+						     hwndDNS, HTTP_DNS_MSG, (char *)&(LocalInAddr), 
+						     4, PF_INET, buf, MAXGETHOSTSTRUCT);
+    
+    if (asyncGetHostReq != NULL) {
+      // wait 5 seconds for the request to complete
+      int now = GetTickCount();
+      while ((DiffTickCounts(now, GetTickCount()) < 5000) && !dns_msg_received) {
+	if (PeekMessage(&Message, NULL, 0, 0, PM_REMOVE)) {
+	  TranslateMessage(&Message); /* translate keyboard messages */
+	  DispatchMessage(&Message);  /* return control to Windows NT */
+	} else {
+	  Sleep(1);
+	}
+      }
+      if (!dns_msg_received)
+	d_WSACancelAsyncRequest(asyncGetHostReq);
+    }
+    
+    DestroyWindow(hwndDNS);
+    
+    if (dns_msg_received && (dns_msg_error == 0)) {
+      //Worked, use the primary name
+      strcpy(LocalName, ((hostent *)(buf))->h_name);
+      //Convert it to lower case for cosmedic reasons
+      CharLower(LocalName);
+    }
+  }
+  return LocalName;
+}
+
+
+// returns 0 on success, and a WSA error message on failure.
+// possible error messages include:
+// WSANOTINITIALISED, WSAENETDOWN, WSAEAFNOSUPPORT, WSAEINPROGRESS, WSAEMFILE,
+// WSAENOBUFS, WSAEPROTONOSUPPORT, WSAEPROTOTYPE, WSAESOCKTNOSUPPORT,
+// WSAEADDRINUSE, WSAEINVAL, WSAEISCONN, WSAENOTSOCK, WSAEOPNOTSUPP
+
+#define MAXBINDCOUNT 4096
+int CreateListeningSocket(int &PortNum, HWND MsgWindow, 
+			  WORD SocketMsg, SOCKET &ServerSocket) {
+  int err = 0;
+  SOCKADDR_IN ServerSockAddr;
+  int bind_port, bind_count;
+  
+  //Create the Server Socket
+  ServerSocket = d_socket(AF_INET, SOCK_STREAM, 0);
+  if (ServerSocket == INVALID_SOCKET) return d_WSAGetLastError();
+  
+  bind_port = PortNum;
+  for (bind_count=0; bind_count < MAXBINDCOUNT; bind_count++) {
+    // Set up the Server Socket Address
+    memset(&ServerSockAddr, 0, sizeof(ServerSockAddr)); //Needed?
+    ServerSockAddr.sin_port = d_htons( (WORD) bind_port);
+    ServerSockAddr.sin_family = AF_INET;
+    ServerSockAddr.sin_addr.s_addr = d_htonl(INADDR_ANY);
+    
+    // Try to bind the socket with the address
+    if (d_bind(ServerSocket, (LPSOCKADDR) &ServerSockAddr,
+	       sizeof(ServerSockAddr)) != SOCKET_ERROR) {
+      PortNum = bind_port;
+      break;
+    }
+    
+    // make sure it failed to bind because it was
+    // already bound
+    err = d_WSAGetLastError ();
+    if (err != WSAEADDRINUSE) return err;
+    
+    // Or choose another port number to try
+    if (bind_port == 80) bind_port = IPPORT_RESERVED+1;
+    else if (bind_count == 0) bind_port = 80;
+    else bind_port++;
+  }
+  
+  // return an error in we couldn't find a valid port
+  if (bind_count == MAXBINDCOUNT) return WSAEADDRINUSE;
+  
+  // Start listening for connections
+  if (d_listen(ServerSocket, SOMAXCONN) == SOCKET_ERROR)
+    return d_WSAGetLastError ();	
+  
+  // Set up event for new connections
+  if (d_WSAAsyncSelect(ServerSocket, MsgWindow, SocketMsg, FD_ACCEPT) == SOCKET_ERROR)
+    return d_WSAGetLastError ();
+  
+  return 0;
+}
+
+
+int AnswerListeningSocket(SOCKET ServerSocket, SOCKET &ClientSocket, 
+			  SOCKADDR_IN &ClientSockAddr, int AddrLen) {
+  if (d_WSAIsBlocking()) {
+    log_message("rejected connect due blocking\n");
+    return -1;
+  }
+  
+  ClientSocket = d_accept(ServerSocket, (LPSOCKADDR) &ClientSockAddr, &AddrLen);
+  if (ClientSocket == INVALID_SOCKET) {
+    log_message("accept failed - connection lost\n");
+    return -1;
+  }
+  
+  log_message("accept success - connection made\n");
+  return 0;
+}
+
+void DestroyListeningSocket(SOCKET &ServerSocket, HWND MsgWindow) {
+  //Remove any message notification
+  d_WSAAsyncSelect(ServerSocket, MsgWindow, 0, 0);
+  
+  //Close the socket
+  CloseSocket(ServerSocket);
+}
+
+void CloseSocket(SOCKET &TargetSocket) {
+  if (TargetSocket != INVALID_SOCKET) {
+    //Since we're closing the socket, there's not much I can do about errors
+    //now so I'm not gonna bother checking...
+    
+    //Shutdown both ends, assume we have all data...
+    d_shutdown(TargetSocket, 2);
+    
+    d_closesocket(TargetSocket);
+    
+    //Make sure we can't use the old handle again...
+    TargetSocket = INVALID_SOCKET;
+  }
+}
+
+int GetData(SOCKET ClientSocket, BYTE *IOBuffer, int IOBufferSize,
+	    int ThreadNum) {
+  
+  int NumRecv;
+  int Error;
+  struct timeval Timeout;
+  fd_set SocketSet;
+  
+  //Set up a socket set structure with just ClientSocket for  select(..)
+  FD_ZERO(&SocketSet);
+  FD_SET(ClientSocket, &SocketSet);
+  
+  //set timeout
+  Timeout.tv_sec = NETIO_CONN_TIMEOUT;
+  Timeout.tv_usec = 0;
+  
+  do {
+    NumRecv = d_recv(ClientSocket, (char *) IOBuffer, IOBufferSize, 0);
+    if (NumRecv == 0) {
+      //Lost connect
+      return -1;
+      
+    } else if (NumRecv == SOCKET_ERROR) {
+      Error = d_WSAGetLastError();
+      if (Error == WSAEWOULDBLOCK) {
+	NumRecv = 0;
+	//Wait for socket to be readable
+	if (d_select(0, &SocketSet, NULL, NULL, &Timeout) != 1) {
+	  //Timeout
+	  return -1;
+	}
+	
+      } else {
+	//Assume connection terminated
+	return -1;
+      }
+    }
+  } while(NumRecv == 0);
+  return NumRecv;
+}
+
+int GetLine(char *OutStr, SOCKET ClientSocket, BYTE *IOBuffer, int IOBufferSize,
+	    int &BufferIndex, int &DataInBuffer, int ThreadNum) {
+  
+  int i;
+  char CurChar;
+  
+  i = 0;
+  do {
+    if (BufferIndex == DataInBuffer) { //Need more data
+      DataInBuffer = GetData(ClientSocket, IOBuffer, IOBufferSize, ThreadNum);
+      if (DataInBuffer == -1) {
+	//Lost connect
+	return -1;
+      }
+      BufferIndex = 0;
+    }
+    CurChar = IOBuffer[BufferIndex];
+    BufferIndex++;
+    if ((CurChar != 10) && (CurChar != 13))  {
+      OutStr[i] = CurChar;
+      i++;
+    }
+  } while ((CurChar != 10) && (i < NETIO_MAX_LINE));
+  if (i == NETIO_MAX_LINE) {
+    return -1;
+  }
+  
+  OutStr[i] = 0;
+  return 0;
+}
+
+int SendData(SOCKET ClientSocket, BYTE *SendBuffer, int NumToSend,
+	     int ThreadNum) {
+  
+  int NumSent = 0;
+  int Error;
+  struct timeval Timeout;
+  fd_set SocketSet;
+  
+  char NumSentStr[50];
+  itoa(NumToSend, NumSentStr, 10);
+  
+  //Set up a socket set structure with just ClientSocket for  select(..)
+  FD_ZERO(&SocketSet);
+  FD_SET(ClientSocket, &SocketSet);
+  //set timeout
+  Timeout.tv_sec = NETIO_CONN_TIMEOUT;
+  Timeout.tv_usec = 0;
+  
+  while (NumToSend > 0) {
+    NumSent = d_send(ClientSocket, (char *) SendBuffer + NumSent, NumToSend, 0);
+    if (NumSent == 0) {
+      //Lost connect
+      return -1;
+    }
+    else if (NumSent == SOCKET_ERROR) {
+      Error = d_WSAGetLastError();
+      if (Error == WSAEWOULDBLOCK) {
+	NumSent = 0;
+	if (d_select(0, NULL, &SocketSet, NULL, &Timeout) != 1) {
+	  //Timeout
+	  return -1;
+	}
+      }
+      else {
+	//Lost Connection
+	return -1;
+      }
+    }
+    NumToSend -= NumSent;
+  }
+  return 0;
+}
+
+
+/******************************************************************************/
+//Private Functions
+/******************************************************************************/
+/*-----------------------------------------------------------
+ * Function: GetHostID()
+ *
+ * Description:
+ *  Get the Local IP address using the following algorithm:
+ *    - get local hostname with gethostname()
+ *    - attempt to resolve local hostname with gethostbyname()
+ *    if that fails:
+ *    - get a UDP socket
+ *    - connect UDP socket to arbitrary address and port
+ *    - use getsockname() to get local address
+ *
+ * Notes: Copyright by Bob Quinn, 1995, taken from his Winsock library
+ *        was removed from its original module unmodified
+ */
+DWORD GetHostID () {
+  char szLclHost [MAXHOSTNAME];
+  LPHOSTENT lpstHostent;
+  SOCKADDR_IN stLclAddr;
+  SOCKADDR_IN stRmtAddr;
+  int nAddrSize = sizeof(SOCKADDR);
+  SOCKET hSock;
+  int nRet;
+  
+  /* Init local address (to zero) */
+  stLclAddr.sin_addr.s_addr = INADDR_ANY;
+  
+  /* Get the local hostname */
+  nRet = d_gethostname(szLclHost, MAXHOSTNAME);
+  if (nRet != SOCKET_ERROR) {
+    /* Resolve hostname for local address */
+    lpstHostent = d_gethostbyname((LPSTR)szLclHost);
+    if (lpstHostent)
+      stLclAddr.sin_addr.s_addr = *((u_long FAR*) (lpstHostent->h_addr));
+  }
+  
+  /* If still not resolved, then try second strategy */
+  if (stLclAddr.sin_addr.s_addr == INADDR_ANY) {
+    /* Get a UDP socket */
+    hSock = d_socket(AF_INET, SOCK_DGRAM, 0);
+    if (hSock != INVALID_SOCKET)  {
+      /* Connect to arbitrary port and address (NOT loopback) */
+      stRmtAddr.sin_family = AF_INET;
+      stRmtAddr.sin_port   = d_htons(IPPORT_ECHO);
+      stRmtAddr.sin_addr.s_addr = d_inet_addr("128.127.50.1");
+      nRet = d_connect(hSock,
+		       (LPSOCKADDR)&stRmtAddr,
+		       sizeof(SOCKADDR));
+      if (nRet != SOCKET_ERROR) {
+	/* Get local address */
+	d_getsockname(hSock,
+		      (LPSOCKADDR)&stLclAddr,
+		      (int FAR*)&nAddrSize);
+      }
+      d_closesocket(hSock);   /* we're done with the socket */
+    }
+  }
+  return (stLclAddr.sin_addr.s_addr);
+}
Index: /main/tags/2.38/gsdl/src/w32server/netio.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/netio.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/netio.h	(revision 21083)
@@ -0,0 +1,162 @@
+/**********************************************************************
+ *
+ * netio.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+/*
+Module Name: Net IO
+Purpose: High level Socket IO and Misc socket routines
+Public Functions:
+	InitNetIO
+   CleanUpNetIO
+
+	GetLocalIP
+	GetLocalName
+
+   CreateListeningSocket
+   AnswerListeningSocket
+   DestroyListeningSocket
+
+   CloseSocket
+
+	GetData
+	GetLine
+
+	SendData
+	SendFile
+*/
+
+//Public definitions
+//Max line size for GetLine
+#define NETIO_MAX_LINE 300
+
+//Public Functions
+
+/*
+Function Name: Init Net IO
+Purpose: Initializes the module so calls can be made querying network
+         information for the local macnine.
+Notes: MUST be called before GetLocalIP and GetLocalName
+*/
+
+// returns 0 on success,
+// WSASYSNOTREADY, WSAVERNOTSUPPORTED, or WSAEINVAL on failure
+int InitNetIO();
+
+/*
+Function Name: Cleanup Net IO
+Purpose: Cleans up the module and unloads Winsock
+*/
+void CleanUpNetIO();
+
+/*
+Function Name: Reset Net IO
+Purpose: Resets internal data in NetIO to reflect registry changes, etc.
+*/
+void ResetNetIO();
+
+/*
+Function Name: Get Local IP
+Purpose: Gets the local IP number
+Returns: The local IP number as an double word (4 bytes)
+*/
+DWORD GetLocalIP();
+
+/*
+Function Name: Get Local Name
+Purpose: Gets the local Domain name, or if there is none, then the server
+address in dotted format.
+Returns: A string containing the local address
+*/
+char *GetLocalName(HINSTANCE hInstance);
+
+// returns 0 on success, and a WSA error message on failure.
+// possible error messages include:
+// WSANOTINITIALISED, WSAENETDOWN, WSAEAFNOSUPPORT, WSAEINPROGRESS, WSAEMFILE,
+// WSAENOBUFS, WSAEPROTONOSUPPORT, WSAEPROTOTYPE, WSAESOCKTNOSUPPORT,
+// WSAEADDRINUSE, WSAEINVAL, WSAEISCONN, WSAENOTSOCK, WSAEOPNOTSUPP
+int CreateListeningSocket(int &PortNum, HWND MsgWindow, 
+			  WORD SocketMsg, SOCKET &ServerSocket);
+
+int AnswerListeningSocket(SOCKET ServerSocket, SOCKET &ClientSocket, 
+			  SOCKADDR_IN &ClientSockAddr, int AddrLen);
+
+void DestroyListeningSocket(SOCKET &ServerSocket, HWND MsgWindow);
+
+void CloseSocket(SOCKET &TargetSocket);
+
+/*
+Function Name: Get Data
+Purpose: Gets data from a socket with muli-threaded debugging
+Parameters:
+	ClientSocket - The socket to get data from
+	IOBuffer - A pointer to a chunk of memory to put data in
+	IOBufferSize - Size of the buffer
+	ThreadNum - Number of the thread that called this functions used for debugging
+
+Returns: -1 on error, else the number of bytes received
+
+Notes:
+Removed socket error checking because I was unable to isolate what
+errors I was getting when getting a "rude" disconnect
+*/
+int GetData(SOCKET ClientSocket, BYTE *IOBuffer, int IOBufferSize, int ThreadNum);
+
+/*
+Function Name: Get Line
+Purpose: Gets a line of text (ended by a LF (10)) from a socket with buffered
+			input.  If the buffer is empty this function fills the buffer, else it
+			just changes an index. Also has the ability to do multi-threaded debuging
+Parameters:
+	OutStr - Varible were output is put (a length of NETIO_MAX_LINE is assumed)
+	ClientSocket - The socket to get data from
+	IOBuffer - A pointer to a chunk of memory to put data in
+	IOBufferSize - Size of the buffer
+	BufferIndex - A zero based index of what charactor in the buffer we're at
+	DataInBuffer - Amount of data in the buffer
+	ThreadNum - Number of the thread that called this functions used for debugging
+
+Returns: -1 on disconnect or error (abort connection), 0 on success
+*/
+int GetLine(char *OutStr, SOCKET ClientSocket, BYTE *IOBuffer, int IOBufferSize, 
+	    int &BufferIndex, int &DataInBuffer, int ThreadNum);
+
+/*
+Function Name: Send Data
+Purpose: Sends data to a socket with muli-thread debugging
+Parameters:
+	ClientSocket - The socket to get data from
+	SendBuffer - A pointer to a chunk of memory to put data in
+	NumToSend - Number of bytes to send from buffer
+	ThreadNum - Number of the thread that called this functions used for debugging
+
+Returns: -1 on error, 0 on success
+
+Notes:
+Removed socket error checking because I was unable to isolate what
+errors I was getting when getting a "rude" disconnect
+*/
+int SendData(SOCKET ClientSocket, BYTE *SendBuffer, 
+	     int NumToSend, int ThreadNum);
Index: /main/tags/2.38/gsdl/src/w32server/parse.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/parse.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/parse.cpp	(revision 21083)
@@ -0,0 +1,202 @@
+/**********************************************************************
+ *
+ * parse.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include <windows.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <memory.h>
+#pragma hdrstop
+
+#include "parse.h"
+
+//Public Functions
+/******************************************************************************/
+void Left(char *DestStr, const char *SourceStr, const int Len) {
+  memcpy(DestStr, SourceStr, Len);
+  DestStr[Len] = 0;
+}
+/******************************************************************************/
+void Right(char *DestStr, const char *SourceStr, const int Len) {
+  int SourceLen, Offset;
+  
+  SourceLen = strlen(SourceStr);
+  Offset = SourceLen - Len;
+  
+  memcpy(DestStr, SourceStr + Offset, Len + 1);
+  //The null is already copied
+}
+/******************************************************************************/
+void TrimLeft(char *TargetStr) {
+  int i, NewStrSize;
+  
+  i = 0;
+  //Find the first non-space charactor
+  while ( (TargetStr[i] == ' ') || (TargetStr[i] == '\t') ) {
+    i++;
+  }
+  //If we have space to get rid of, move the string
+  if (i > 0) {
+    NewStrSize = strlen(TargetStr) - i + 1; //Include the NULL in the size
+    memmove(TargetStr, TargetStr + i, NewStrSize);
+  }
+}
+/******************************************************************************/
+void TrimRight(char *TargetStr) {
+  int i;
+  
+  //Find the last non-space charactor (index i)
+  i = strlen(TargetStr) - 1;
+  while ((i >= 0) && ((TargetStr[i] == ' ') || (TargetStr[i] == '\t')) ) {
+    i--;
+  }
+  //Set the NULL 1 after the last non-space charactor
+  TargetStr[i+1] = 0;
+}
+/******************************************************************************/
+void Trim(char *TargetStr) {
+  TrimRight(TargetStr);
+  TrimLeft(TargetStr);
+}
+/******************************************************************************/
+void GetWord(char *DestStr, const char *SourceStr, const int Start, int &End) {
+  int i, Len;
+  
+  Len = 0;
+  i = Start;
+  while ((SourceStr[i] != ' ') && (SourceStr[i] != '\t') && (SourceStr[i] != 0)) {
+    Len++;
+    i++;
+  }
+  //Create the substring
+  memcpy(DestStr, SourceStr + Start, Len);
+  DestStr[Len] = 0;
+  //Set End
+  while ((SourceStr[i] != 0) &&
+	 ((SourceStr[i] == ' ') || (SourceStr[i] == '\t'))) {
+    i ++;
+  }
+  End = i;
+}
+/******************************************************************************/
+void GetLastWord(char *DestString, const char *SourceStr, int &Start) {
+  int SourceLen, i, Len;
+  
+  Len = 0;
+  SourceLen = strlen(SourceStr);
+  i = SourceLen - 1;
+  while ((i >= 0) && (SourceStr[i] != ' ') && (SourceStr[i] != '\t')) {
+    Len++;
+    i--;
+  }
+  //Create the substring
+  memcpy(DestString, SourceStr + SourceLen - Len, Len);
+  DestString[Len] = 0;
+  Start = i + 1;
+}
+/******************************************************************************/
+void SplitPath(char *Path, char *Dir, char *FileName) {
+  int SplitPoint;
+  SplitPoint = strlen(Path) - 1;
+  while ((SplitPoint > 0) && (Path[SplitPoint] != '\\')) {
+    SplitPoint--;
+  }
+  if ((SplitPoint == 0) && (Path[SplitPoint] != '\\')) {
+    //No directory, just a file name
+    Dir[0] = 0;
+    strcpy(FileName, Path);
+  }
+  else {
+    //Move past the last slash
+    SplitPoint++;
+    
+    //Directory
+    int i = 0;
+    while (i < SplitPoint) {
+      Dir[i] = Path[i];
+      i++;
+    }
+    Dir[i] = 0;
+    
+    //File name
+    int j = 0;
+    while (Path[i] != 0) {
+      FileName[j] = Path[i];
+      j++;
+      i++;
+    }
+    FileName[j] = 0;
+  }
+}
+/******************************************************************************/
+void GetExtention(char *Path, char *Extention) {
+  int Dot;
+  int PathLen;
+  
+  PathLen = strlen(Path) - 1;
+  Dot = PathLen;
+  while ((Dot > 0) && (Path[Dot] != '.')) {
+    Dot--;
+  }
+  if (Dot > 0) {
+    strcpy(Extention, Path + Dot + 1);
+  }
+  else {
+    Extention[0] = 0;
+  }
+}
+/******************************************************************************/
+void TranslateEscapeString(char *TargetStr) {
+  int i = 0;
+  int j = 0;
+  
+  while (TargetStr[i] != 0) {
+    if ((TargetStr[i] == '%') && (TargetStr[i+1] != 0) && (TargetStr[i+2] != 0)) {
+      //Escaped value (did checking to make sure there are 2 more chars)
+      //         #pragma warn -sig //Suppress significant digit loss warning (BC++)
+      TargetStr[j] = 16 * HexVal(TargetStr[i+1]) + HexVal(TargetStr[i+2]);
+      //         #pragma warn +sig   //Restore significant digit loss warning (BC++)
+      i += 3;
+    }
+    else {
+      TargetStr[j] = TargetStr[i];
+      i++;
+    }
+    j++;
+  }
+  TargetStr[j] = 0;
+}
+/******************************************************************************/
+int HexVal(char c) {
+  //   #pragma warn -sig //Suppress significant digit loss warning (BC++)
+  if (c >= '0' && c <= '9') return c - '0';
+  else if (c >= 'a' && c <= 'f') return c - 'a' + 10;
+  else if (c >= 'A' && c <= 'F') return c - 'A' + 10;
+  else return 0;
+  //   #pragma warn +sig   //Restore significant digit loss warning (BC++)
+}
+/******************************************************************************/
Index: /main/tags/2.38/gsdl/src/w32server/parse.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/parse.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/parse.h	(revision 21083)
@@ -0,0 +1,161 @@
+/**********************************************************************
+ *
+ * parse.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+/*
+Module Name: Parse
+Purpose: General string parsing.  These are functions that are not in string.h,
+	but are found in many other libraries and high level languages.
+Public Functions:
+	Left
+	Right
+
+	Trim
+	TrimLeft
+	TrimRight
+
+	GetWord
+	GetLastWord
+
+   Split Path
+   GetExtention
+*/
+
+/*
+Function Name: Left
+Purpose: Copies the leftmost x number of charactors of a string to a buffer
+Parameters:
+	DestStr - Destination buffer for substring
+	SourceStr - Source string to make substing from
+	Len - Length of substring
+
+Notes: If Len is greater than strlen(SourceStr) a memory error may occur.
+*/
+void Left(char *DestStr, const char *SourceStr, const int Len);
+
+/*
+Function Name: Right
+Purpose: Copies the rightmost x number of charactors of a string to a buffer
+Parameters:
+	DestStr - Destination buffer for substring
+	SourceStr - Source string to make substing from
+	Len - Length of substring
+
+Notes: If Len is greater than strlen(SourceStr) then a memory error may
+		 occur.
+*/
+void Right(char *DestStr, const char *SourceStr, const int Len);
+
+/*
+Function Name: TrimLeft
+Purpose: Removes spaces and tabs from the left end of a string.
+Parameters:
+	TargetString - String to be trimmed
+*/
+void TrimLeft(char *TargetStr);
+
+/*
+Function Name: TrimRight
+Purpose: Removes spaces and tabs from the right end of a string.
+Parameters:
+	TargetString - String to be trimmed
+*/
+void TrimRight(char *TargetStr);
+
+/*
+Function Name: Trim
+Purpose: Removes spaces and tabs from both ends of a string.
+Parameters:
+	TargetString - String to be trimmed
+*/
+void Trim(char *TargetStr);
+
+/*
+Function Name: GetWord
+Purpose: Gets leftmost substring without a space, starts at any position at
+	 the start string and sets End to be the next non-space charactor in the
+	 string.  ' ' and '\t' and considered spaces
+Parameters:
+	 DestString - Destination buffer for substring
+	 SourceString - Source string to make substing from
+	 Start - 0 based string index to start at
+	 End - At end of function call is set to the location of next non-space
+               charactor
+
+Notes: If Start is greater than strlen(SourceStr) then a memory error may
+		 occur.
+*/
+void GetWord(char *DestStr, const char *SourceStr, 
+	     const int Start, int &End);
+
+/*
+Function Name: GetLastWord
+Purpose: Gets rightmost substring without a space sets Start to be the 0 based
+	index of where the substring starts in the original string.
+Parameters:
+	DestString - Destination buffer for substring
+	SourceString - Source string to make substing from
+	Start - 0 based string index where the DestString starts at
+*/
+void GetLastWord(char *DestString, const char *SourceStr, int &Start);
+
+
+/*
+Function Name: Split Path
+Purpose: Splits a path string into directory and file name
+Parameters:
+	Path - Path string (example "c:\Fnord\SomeFile.Ext")
+	Dir - Directory part of the Path (example "c:\Fnord\")
+	FileName - File name part of the path (example "SomeFile.Ext")
+*/
+void SplitPath(char *Path, char *Dir, char *FileName);
+
+/*
+Function Name: Get Extention
+Purpose: Splits a path string into directory and file name
+Parameters:
+	Path - Path string or file name (example "c:\Fnord\SomeFile.Ext")
+	Extention - Extention part of the path (example "Ext")
+*/
+void GetExtention(char *Path, char *Extention);
+
+/*
+Function Name: Translate Escape String
+Purpose: Translates all URL escape sequences, such as "%20" where "20" is
+	the resulting charactor in hexidecimal
+Parameters:
+	TargetStr - String that may contain URL escape sequences.  All sequences
+   	are decoded on return.
+*/
+void TranslateEscapeString(char *TargetStr);
+
+/*
+Function Name: Hex Value
+Purpose: Returns the value of a hexidecimal digit character as an integer
+Parameters:
+	c - Charactor to translate
+*/
+int HexVal(char c);
Index: /main/tags/2.38/gsdl/src/w32server/resource.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/resource.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/resource.h	(revision 21083)
@@ -0,0 +1,50 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by server.rc
+//
+#define TRAY_ICON                       101
+#define COMMS_DIALOG                    102
+#define COMMS_DIALOG_DEBUG              102
+#define Main_Menu                       103
+#define COMMS_DIALOG2                   103
+#define GSDL_LOGO                       108
+#define GSDL_COL_TITLE                  109
+#define IDD_DIALOG1                     118
+#define GSDL_ICBMP                      126
+#define APPLY_BUTTON                    1000
+#define REMOTE_CHECK                    1001
+#define PROXY_CHECK                     1002
+#define CONSOLE_CHECK                   1003
+#define PROXY_EDIT_BOX                  1004
+#define PROXY_PORT_EDIT_BOX             1005
+#define TrayID                          1006
+#define LOG_DEBUG_CHECK                 1007
+#define SERVER_PORT_EDIT_BOX            1008
+#define LOG_LOCAL_CHECK                 1009
+#define LOG_REMOTE_CHECK                1010
+#define LOG_NAME_BOX                    1011
+#define LOG_CHECK                       1012
+#define SAVE_NAME_BOX                   1013
+#define SAVE_CHECK                      1014
+#define ID_AUTO_ENTER_LIBRARY           1015
+#define ID_RADIO_NETSCAPE               1016
+#define ID_RADIO_IE                     1017
+#define ID_RADIO_OTHER                  1018
+#define ID_OTHER_NAME                   1019
+#define ID_BROWSE_BUTTON                1020
+#define ID_OK_BUTTON                    1021
+#define ID_CANCEL_BUTTON                1022
+#define ID_PROJECT_SETTINGS             40001
+#define ID_PROJECT_EXIT                 40002
+#define ID_INSTALL_NETSCAPE             40007
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        127
+#define _APS_NEXT_COMMAND_VALUE         40011
+#define _APS_NEXT_CONTROL_VALUE         1026
+#define _APS_NEXT_SYMED_VALUE           102
+#endif
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/settings.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/settings.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/settings.cpp	(revision 21083)
@@ -0,0 +1,820 @@
+/**********************************************************************
+ *
+ * settings.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+
+#if defined(GSDL_USE_OBJECTSPACE)
+#  include <ospace\std\fstream>
+#elif defined(GSDL_USE_IOS_H)
+#  include <fstream.h>
+#else
+#  include <fstream>
+#endif
+
+#include <windows.h>
+#include "httpsrv.h"
+#include "settings.h"
+#include "locate.h"
+#include "resource.h"
+#include "cgiwrapper.h"
+
+// library settings
+text_t gsdl_enterlib;
+text_t gsdl_gsdlhome;
+text_t gsdl_gdbmhome;
+text_t gsdl_collections;
+colinfo_tmap gsdl_collectinfo;
+
+char gsdl_staticpages[MAX_FILENAME_SIZE];
+
+// debug settings
+char gsdl_log_name[MAX_FILENAME_SIZE] = "c:\\gsdl.log";
+int gsdl_keep_log = 0;
+int gsdl_show_console = 0;
+
+// general settings
+int gsdl_port_num = 80;
+int gsdl_auto_enter = 0;
+int gsdl_browser = GS_IEXPLORE;
+char gsdl_browser_exe[MAX_FILENAME_SIZE] = "";
+
+
+// private data
+
+// pathnames of the latest installed versions of netscape and
+// internet explorer
+static char netscape_exe[MAX_FILENAME_SIZE]="";
+static char iexplore_exe[MAX_FILENAME_SIZE]="";
+
+// pathname of the default browser
+static char default_browser_exe[MAX_FILENAME_SIZE]="";
+
+// whether netscape is needed (used in the settings dialog box)
+static int gsdl_netscapeneeded = 0;
+
+static void remove_end_slashes(char *str) {
+  int len = strlen (str);
+  while ((len > 0) && ((str[len-1] == '\\') || (str[len-1] == '/'))) {
+    len --;
+  }
+  str[len] = '\0';
+}
+
+static void remove_end_slashes (text_t &str) {
+  char *cstr = str.getcstr();
+  remove_end_slashes (cstr);
+  str = cstr;
+  delete cstr;
+}
+
+// returns 1 if successful, 0 otherwise
+// checks for a file's existence
+static int check_program_exe (char *path) {
+  UINT curerrormode;
+  OFSTRUCT reOpenBuff;
+  int retvalue = 0;
+  
+  reOpenBuff.cBytes = sizeof (OFSTRUCT);
+  
+  curerrormode = SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOOPENFILEERRORBOX);
+  if (OpenFile(path, &reOpenBuff, OF_EXIST) != HFILE_ERROR) retvalue = 1;
+  SetErrorMode(curerrormode);
+  
+  return retvalue;
+}
+
+
+// returns 1 if successful, 0 otherwise
+static int get_default_browser_path (char *providedhtmltype, char *path, int maxsize) {
+  HKEY hk1, hk2;
+  char htmltype[256];
+  long size;
+  int retval = 0;
+  
+  htmltype[0] = '\0';
+  path[0] = '\0';
+  
+  // try and get information about the default browser from the 
+  // registry
+  
+  if (providedhtmltype != NULL) strcpy (htmltype, providedhtmltype);
+  
+  else if (RegOpenKey(HKEY_CLASSES_ROOT, ".htm", &hk1) == ERROR_SUCCESS) {
+    size = 256;
+    RegQueryValue(hk1, NULL, htmltype, &size);
+    RegCloseKey(hk1);
+  }
+  
+  if (RegOpenKey(HKEY_CLASSES_ROOT, htmltype, &hk1) == ERROR_SUCCESS) {
+    if (RegOpenKey(hk1, "shell\\open", &hk2) == ERROR_SUCCESS) {
+      // look for the command to start the browser
+      size = maxsize;
+      if (RegQueryValue(hk2,"command",path,&size) == ERROR_SUCCESS) {
+				// strip all excess stuff off the command
+	char endchar = ' ';
+	int i = 0, len = 0;
+	int state = 0; // 0=strip initial white-space and quotes, 1=grab path
+	while (path[i] != '\0') {
+	  if (state == 0) {
+	    if (path[i] == ' ') {
+	      // do nothing
+	    } else if (path[i] == '"') {
+	      endchar = '"';
+	      state = 1;
+	    } else {
+	      state = 1;
+	      path[len] = path[i];
+	      len++;
+	    }
+	  } else {
+	    if (path[i] == endchar) break;
+	    path[len] = path[i];
+	    len++;
+	  }
+	  i++;
+	}
+	path[len] = '\0';
+	
+	// check the resulting pathname
+	if (check_program_exe (path)) {
+	  retval = 1; // succeeded
+	} else {
+	  path[0] = '\0'; // failed (must have been deleted or something...)
+	}
+      }
+      RegCloseKey(hk2);
+    }
+    RegCloseKey(hk1);
+  }
+  
+  return retval;
+}
+
+
+// returns 1 if successful, 0 otherwise
+// note that appname should include .exe (e.g. netscape.exe)
+static int registry_get_app_paths (char *appname, char *path, int maxsize) {
+  HKEY hk1;
+  long size;
+  int retval = 0;
+  
+  path[0] = '\0';
+  
+  if (RegOpenKey(HKEY_LOCAL_MACHINE, 
+		 "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths", 
+		 &hk1) == ERROR_SUCCESS) {
+    size = maxsize;
+    if (RegQueryValue (hk1, appname, path, &size) == ERROR_SUCCESS &&
+	check_program_exe (path));
+    retval = 1;
+    
+    RegCloseKey(hk1);
+  }
+  
+  return retval;
+}
+
+static void check_installed_browsers (int netscapeneeded) {
+  netscape_exe[0] = '\0';
+  iexplore_exe[0] = '\0';
+  default_browser_exe[0] = '\0';
+  
+  // update the default browser information (if netscape isn't needed)
+  if (!netscapeneeded) {
+    get_default_browser_path (NULL, default_browser_exe, MAX_FILENAME_SIZE);
+    _strlwr (default_browser_exe);
+  }
+  
+  // look for netscape
+  
+  // first look for netscape in the registry
+  if (!registry_get_app_paths("netscape.exe", netscape_exe, MAX_FILENAME_SIZE)) {
+    // next look for "NetscapeMarkup"
+    if (get_default_browser_path ("NetscapeMarkup", netscape_exe, MAX_FILENAME_SIZE)) {
+      _strlwr (netscape_exe);
+      if (!strstr (netscape_exe, "netscape.exe")) {
+	netscape_exe[0] = '\0';
+	
+	// next look for \netscape\netscape.exe
+	
+	// get drive letter of the windows directory
+	GetWindowsDirectory(netscape_exe, MAX_FILENAME_SIZE);
+	netscape_exe[1] = '\0';
+	strcat (netscape_exe, ":\\netscape\\netscape.exe");
+	
+	if (!check_program_exe (netscape_exe)) {
+	  // lastly look for \netscape\program\netscape.exe
+	  netscape_exe[1] = '\0';
+	  strcat (netscape_exe, ":\\netscape\\program\\netscape.exe");
+	  
+	}
+      }
+    }
+  }
+  _strlwr (netscape_exe);
+  if ((strlen (netscape_exe) > 0) && !check_program_exe (netscape_exe)) {
+    netscape_exe[0] = '\0';  // couldn't find netscape
+  }
+  
+  // look for internet explorer (if netscape isn't needed)
+  
+  // first look for iexplore in the registry
+  if (!netscapeneeded && !registry_get_app_paths("iexplore.exe", 
+						 iexplore_exe, MAX_FILENAME_SIZE)) {
+    // next look for "htmlfile"
+    if (get_default_browser_path ("htmlfile", iexplore_exe, MAX_FILENAME_SIZE)) {
+      _strlwr (iexplore_exe);
+      if (!strstr (iexplore_exe, "iexplore.exe")) {
+	iexplore_exe[0] = '\0';
+	
+	// next look for \iexplore\iexplore.exe
+	
+	// get drive letter of the windows directory
+	GetWindowsDirectory(iexplore_exe, MAX_FILENAME_SIZE);
+	iexplore_exe[1] = '\0';
+	strcat (iexplore_exe, ":\\iexplore\\iexplore.exe");
+      }
+    }
+  }
+  _strlwr (iexplore_exe);
+  if ((strlen (iexplore_exe) > 0) && !check_program_exe (iexplore_exe)) {
+    iexplore_exe[0] = '\0';  // couldn't find internet explorer
+  }
+}
+
+void write_settings () {
+  char conffile[MAX_FILENAME_SIZE];
+  
+  strcpy (conffile, data_location);
+  remove_end_slashes (conffile);
+  strcat (conffile, "\\gsdlsite.cfg");
+  
+  ofstream fout (conffile);
+  if (fout) {
+    
+    outconvertclass text_t2ascii;
+
+    // top (gsdl) level stuff
+    fout << "[gsdl]\n";
+    write_ini_line(fout, "enterlib", gsdl_enterlib);
+    write_ini_line(fout, "gsdlhome", gsdl_gsdlhome);
+    write_ini_line(fout, "gdbmhome", gsdl_gdbmhome);
+    
+    write_ini_line(fout, "logfilename", gsdl_log_name);
+    write_ini_line(fout, "keeplog", text_t(gsdl_keep_log));
+    write_ini_line(fout, "consolelog", text_t(gsdl_show_console));
+    
+    write_ini_line(fout, "portnumber", text_t(gsdl_port_num));
+    write_ini_line(fout, "autoenter", text_t(gsdl_auto_enter));
+    write_ini_line(fout, "browser", text_t(gsdl_browser));
+    write_ini_line(fout, "browserexe", gsdl_browser_exe);
+    write_ini_line(fout, "collections", gsdl_collections);
+    
+    // collection levels
+    colinfo_tmap::iterator here = gsdl_collectinfo.begin();
+    colinfo_tmap::iterator end = gsdl_collectinfo.end();
+    while (here != end) {
+      fout << text_t2ascii << "[" << (*here).first << "]\n";
+      if (!(*here).second.gsdl_gsdlhome.empty()) 
+	write_ini_line(fout, "gsdlhome", (*here).second.gsdl_gsdlhome);
+      if (!(*here).second.gsdl_gdbmhome.empty()) 
+	write_ini_line(fout, "gdbmhome", (*here).second.gsdl_gdbmhome);
+      
+      here ++;
+    }
+    fout.close();
+  }
+}
+
+
+// browser_compare assumes that check_exe is in lowercase
+static int browser_compare (char *browser_exe_path, char *check_exe) {
+  char tmp_exe[MAX_FILENAME_SIZE];
+  strcpy (tmp_exe, browser_exe_path);
+  _strlwr (tmp_exe);
+  return (strstr (tmp_exe, check_exe) != NULL);
+}
+
+// This function assumes that check_installed_browsers
+// has been recently called
+// It also assumes that browser_exe is large
+// enough to receive any path names to any browser
+static void check_browser_settings (int &browser, char *browser_exe, 
+				    int netscapeneeded) {
+  
+  // sort out which browser to use
+  if ((browser == GS_NETSCAPE) && (netscape_exe[0] == '\0'))
+    browser = GS_IEXPLORE;
+  if ((browser == GS_IEXPLORE) && (netscapeneeded || (iexplore_exe[0] == '\0'))) {
+    if (netscape_exe[0] != '\0') browser = GS_NETSCAPE;
+    else browser = GS_OTHER;
+  }
+  if ((browser == GS_OTHER) && netscapeneeded && 
+      !browser_compare (browser_exe, "netscape.exe") && (netscape_exe[0] != '\0')) {
+    // this other browser isn't netscape and netscape is available
+    browser = GS_NETSCAPE;
+  }
+  
+  
+  // get the browser's executable
+  if (browser == GS_NETSCAPE) {
+    strcpy (browser_exe, netscape_exe);
+  } else if (browser == GS_IEXPLORE) {
+    strcpy (browser_exe, iexplore_exe);
+  } else {
+    browser = GS_OTHER;
+    
+    // if the browser should be netscape then check to
+    // make sure it is
+    if (netscapeneeded && !browser_compare (browser_exe, "netscape.exe")) {
+      // not netscape, set to no browser
+      browser_exe[0] = '\0';
+    }
+  }
+}
+
+
+static void revert_defaults (int netscapeneeded) {
+  find_location();
+  
+  // library settings
+  gsdl_enterlib = "/gsdl";
+  gsdl_gsdlhome = data_location;
+  gsdl_gdbmhome = data_location;
+  
+  // debug settings
+  gsdl_keep_log = 0;
+  strcpy (gsdl_log_name, "c:\\gsdl.log");
+  gsdl_show_console = 0;
+  
+  // general settings
+  gsdl_port_num = 80;
+  gsdl_auto_enter = 0;
+  
+  check_installed_browsers (netscapeneeded);
+  gsdl_browser = GS_IEXPLORE;
+  strcpy (gsdl_browser_exe, default_browser_exe);
+  check_browser_settings (gsdl_browser, gsdl_browser_exe, netscapeneeded);
+}
+
+void read_settings (int netscapeneeded) {
+  char conffile[MAX_FILENAME_SIZE];
+  
+  find_location();
+  
+  strcpy (conffile, data_location);
+  remove_end_slashes (conffile);
+  strcat (conffile, "\\gsdlsite.cfg");
+  
+  // set up defaults
+  revert_defaults (netscapeneeded);
+  
+  text_t key, value, section;
+  char *cstr_value;
+#if defined (GSDL_USE_IOS_H)
+  ifstream conf (conffile, ios::nocreate);
+#else
+  ifstream conf (conffile);
+#endif
+  if (conf) {
+    while (read_ini_line(conf, key, value) >= 0) {
+      if (key.empty()) continue;
+      if (value.empty()) {
+	// should be a section title
+	section = key;
+	// remove square brackets
+	section.erase (section.begin());
+	section.erase (section.end()-1);
+
+      } else {
+
+	cstr_value = value.getcstr ();
+      
+	if (section == "gsdl") {
+
+	  if (key == "enterlib") {
+	    gsdl_enterlib = value;
+	  
+	    // 'logfilename' should occur in the configuration file
+	    // before 'keeplog'
+	  } else if (key == "logfilename") {
+	    strcpy (gsdl_log_name, cstr_value);
+	  
+	  } else if (key == "keeplog") {
+	    gsdl_keep_log = value.getint();
+	    if (gsdl_keep_log) open_log_file();
+	
+	  } else if (key == "consolelog") {
+	    if (value.getint()) activate_console();
+	    else deactivate_console();
+	
+	  } else if (key == "portnumber") {
+	    gsdl_port_num = value.getint();
+	    
+	  } else if (key == "autoenter") {
+	    gsdl_auto_enter = value.getint();
+	
+	  } else if (key == "browser") {
+	    gsdl_browser = value.getint();
+	
+	  } else if (key == "browserexe") {
+	    strcpy (gsdl_browser_exe, cstr_value);
+
+	  } else if (key == "collections") {
+	    gsdl_collections = value;
+
+	  // gsdlhome must occur in file before gdbmhome	    
+	  } else if (key == "gsdlhome") {
+	    gsdl_gsdlhome = value;
+	    gsdl_gdbmhome = value;
+	  
+	  } else if (key == "gdbmhome") {
+	    gsdl_gdbmhome = value;
+	  }
+	} else {
+	  
+	  // gsdlhome must occur in file before gdbmhome
+	  if (key == "gsdlhome") {
+	    gsdl_collectinfo[section].gsdl_gsdlhome = value;
+	    gsdl_collectinfo[section].gsdl_gdbmhome = value;
+	  } else if (key == "gdbmhome") {
+	    gsdl_collectinfo[section].gsdl_gdbmhome = value;
+	  }
+	}
+	delete cstr_value;
+      }
+    }
+    conf.close();
+  }
+  
+  // check the homes to make sure they don't contain
+  // extra slashes at the end
+  remove_end_slashes (gsdl_gsdlhome);
+  remove_end_slashes (gsdl_gdbmhome);
+  colinfo_tmap::iterator here = gsdl_collectinfo.begin();
+  colinfo_tmap::iterator end = gsdl_collectinfo.end();
+  while (here != end) {
+    remove_end_slashes ((*here).second.gsdl_gsdlhome);
+    remove_end_slashes ((*here).second.gsdl_gdbmhome);
+    here ++;
+  }
+
+  // check the browser settings
+  check_browser_settings (gsdl_browser, gsdl_browser_exe, netscapeneeded);
+}
+
+void gsdl_check_browser_settings (int netscapeneeded) {
+  check_installed_browsers (netscapeneeded);
+  check_browser_settings (gsdl_browser, gsdl_browser_exe, netscapeneeded);
+}
+
+
+static void dialog_update_enables (HWND hwndDlg) {
+  int res;
+  
+  // if they want to use another browser, they should be able
+  // edit its filename
+  res = SendDlgItemMessage(hwndDlg, ID_RADIO_OTHER, BM_GETCHECK,0,0);
+  SendDlgItemMessage(hwndDlg, ID_OTHER_NAME, WM_ENABLE, (res == 1), 0);
+}
+
+
+static int read_dialog_browser_field (HWND hwndDlg) {
+  if (SendDlgItemMessage(hwndDlg, ID_RADIO_NETSCAPE,
+			 BM_GETCHECK, 0, 0) == 1) return GS_NETSCAPE;
+  if (SendDlgItemMessage(hwndDlg, ID_RADIO_IE,
+			 BM_GETCHECK, 0, 0) == 1) return GS_IEXPLORE;
+  if (SendDlgItemMessage(hwndDlg, ID_RADIO_OTHER,
+			 BM_GETCHECK, 0, 0) == 1) return GS_OTHER;
+  return GS_NETSCAPE;
+}
+
+
+
+static void set_dialog_browser_field (HWND hwndDlg, int browser, char *othername) {
+  // if we are trying to set the browser to netscape or
+  // internet explorer and we can't find them, set the browser
+  // to 'other'
+  if ((browser == GS_NETSCAPE) && (netscape_exe[0] == '\0'))
+    browser = GS_IEXPLORE;
+  if ((browser == GS_IEXPLORE) && (iexplore_exe[0] == '\0')) {
+    if (netscape_exe[0] != '\0') browser = GS_NETSCAPE;
+    else browser = GS_OTHER;
+  }
+  
+  // update the radio buttons
+  SendDlgItemMessage(hwndDlg, ID_RADIO_NETSCAPE, BM_SETCHECK,
+		     (browser == GS_NETSCAPE) ? BST_CHECKED : BST_UNCHECKED, 0);
+  SendDlgItemMessage(hwndDlg, ID_RADIO_IE, BM_SETCHECK,
+		     (browser == GS_IEXPLORE) ? BST_CHECKED : BST_UNCHECKED, 0);
+  SendDlgItemMessage(hwndDlg, ID_RADIO_OTHER, BM_SETCHECK,
+		     (browser == GS_OTHER) ? BST_CHECKED : BST_UNCHECKED, 0);
+  
+  // update the other name field
+  if (browser == GS_NETSCAPE) {
+    SetDlgItemText(hwndDlg, ID_OTHER_NAME, netscape_exe);
+  } else if (browser == GS_IEXPLORE) {
+    SetDlgItemText(hwndDlg, ID_OTHER_NAME, iexplore_exe);
+  } else if (othername != NULL) {
+    SetDlgItemText(hwndDlg, ID_OTHER_NAME, othername);
+  }
+}
+
+
+static void read_browser_exe_field (HWND hwndDlg, char *filename, int maxsize) {
+  filename[0] = '\0';
+  GetDlgItemText(hwndDlg, ID_OTHER_NAME, filename, maxsize);
+}
+
+
+static void read_dialog_fields (HWND hwndDlg) {
+  int res;  BOOL bres;
+  
+  // port number
+  gsdl_port_num = GetDlgItemInt(hwndDlg, SERVER_PORT_EDIT_BOX, &bres, 0);
+  if (!bres) gsdl_port_num = 80;
+  
+  // whether to enter the library automatically on startup
+  res = SendDlgItemMessage(hwndDlg, ID_AUTO_ENTER_LIBRARY, BM_GETCHECK, 0, 0);
+  gsdl_auto_enter = (res == 1);
+  
+  // which browser to use
+  gsdl_browser = read_dialog_browser_field (hwndDlg);
+  
+  // find out where the browser exe lives
+  read_browser_exe_field (hwndDlg, gsdl_browser_exe, MAX_FILENAME_SIZE);
+}
+
+
+
+
+static BOOL CALLBACK dialog_proc(HWND hwndDlg, UINT uMsg, 
+				 WPARAM wParam,LPARAM  lParam) {
+  int wNotifyCode = HIWORD(wParam);
+  int wID = LOWORD(wParam);
+  char *filefilter = "Program Files (*.exe)\0*.exe\0All Files (*.*)\0*.*\0\0";
+  OPENFILENAME fname;
+  char filename[MAX_FILENAME_SIZE];
+  
+  switch (uMsg) {
+  case WM_INITDIALOG:
+    // set current values
+    SetDlgItemInt(hwndDlg, SERVER_PORT_EDIT_BOX, gsdl_port_num, FALSE);
+    SendDlgItemMessage(hwndDlg, ID_AUTO_ENTER_LIBRARY, BM_SETCHECK,
+		       gsdl_auto_enter ? 1 : 0, 0);
+    set_dialog_browser_field (hwndDlg, gsdl_browser, gsdl_browser_exe);
+    dialog_update_enables(hwndDlg);
+    
+    // make sure that the netscape and internet explorer
+    // radio buttons are only enabled if they could be found
+    if (netscape_exe[0] == '\0')
+      EnableWindow (GetDlgItem (hwndDlg, ID_RADIO_NETSCAPE), FALSE);
+    if (iexplore_exe[0] == '\0')
+      EnableWindow (GetDlgItem (hwndDlg, ID_RADIO_IE), FALSE);
+    
+    return 1;
+    
+  case WM_COMMAND:
+    if (wNotifyCode == BN_CLICKED) {
+      switch (wID) {
+      case ID_CANCEL_BUTTON:
+	EndDialog(hwndDlg, 0);
+	return 1;
+	
+      case ID_OK_BUTTON:
+	// check to make sure we can find the browser
+	filename[0] = '\0';
+	read_browser_exe_field (hwndDlg, filename, MAX_FILENAME_SIZE);
+	if (check_program_exe (filename)) { 
+	  // the file exists
+	  // if netscape is needed, make sure the browser is netscape
+	  _strlwr(filename);
+	  if (!gsdl_netscapeneeded || strstr (filename, "netscape.exe") != NULL) {
+	    // everything is ok
+	    read_dialog_fields(hwndDlg);
+	    EndDialog(hwndDlg, 1);
+	    
+	  } else {
+	    // message: must use netscape with this version
+	    MessageBox(hwndDlg,
+		       "You are using this software on a machine which\n"
+		       "currently does not have a working TCP/IP network layer.\n"
+		       "To allow the Greenstone Digital Library software to use\n"
+		       "its own TCP/IP network layer you must use a Netscape\n"
+		       "web browser.",
+		       "Greenstone Digital Library Software",
+		       MB_OK|MB_APPLMODAL);
+	  }
+	} else {
+	  // message: the file did not exist
+	  MessageBox(hwndDlg,
+		     "Could not find the selected browser. You must have a\n"
+		     "web browser installed to use the Greenstone Digital\n"
+		     "Library software.",
+		     "Greenstone Digital Library Software",
+		     MB_OK|MB_APPLMODAL);
+	}
+	return 1;
+	
+      case ID_RADIO_NETSCAPE:
+	set_dialog_browser_field (hwndDlg, GS_NETSCAPE, NULL);
+	dialog_update_enables(hwndDlg);
+	return 1;
+	
+      case ID_RADIO_IE:
+	set_dialog_browser_field (hwndDlg, GS_IEXPLORE, NULL);
+	dialog_update_enables(hwndDlg);
+	return 1;
+	
+      case ID_RADIO_OTHER:
+	set_dialog_browser_field (hwndDlg, GS_OTHER, NULL);
+	dialog_update_enables(hwndDlg);
+	return 1;
+	
+      case ID_BROWSE_BUTTON:
+	filename[0] = '\0';
+	memset(&fname, 0, sizeof(OPENFILENAME));
+	fname.lStructSize = sizeof(OPENFILENAME);
+	fname.hwndOwner = hwndDlg;
+	fname.hInstance = NULL;
+	fname.lpstrFilter = filefilter;
+	fname.lpstrCustomFilter = NULL;
+	fname.nMaxCustFilter = 0;
+	fname.nFilterIndex = 1;
+	fname.lpstrFile = filename;
+	fname.nMaxFile = MAX_FILENAME_SIZE-1;
+	fname.lpstrFileTitle = NULL;
+	fname.nMaxFileTitle = 0;
+	fname.lpstrInitialDir = NULL;
+	fname.lpstrTitle = "Choose Web Browser";
+	fname.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
+	
+	if(GetOpenFileName(&fname)) {
+	  set_dialog_browser_field (hwndDlg, GS_OTHER, filename);
+	  dialog_update_enables(hwndDlg);
+	}
+	return 1;
+      }
+    }
+    return 0;
+    
+  case WM_CLOSE:
+  case WM_DESTROY:
+    EndDialog(hwndDlg, 0);
+    return 1;
+  }
+  
+  return 0;
+}
+
+static void dialog_debug_update_enables (HWND hwndDlg) {
+  int res;
+  
+  // if they want a log of program use allow them to
+  // edit its filename
+  res = SendDlgItemMessage(hwndDlg, LOG_CHECK, BM_GETCHECK,0,0);
+  SendDlgItemMessage(hwndDlg, LOG_NAME_BOX, WM_ENABLE, (res == 1), 0);
+}
+
+
+static void read_dialog_debug_fields (HWND hwndDlg) {
+  int res;
+  
+  // whether to log program use
+  res = SendDlgItemMessage(hwndDlg, LOG_CHECK, BM_GETCHECK,0,0);
+  gsdl_keep_log = (res == 1);
+  
+  // log filename
+  res = SendDlgItemMessage(hwndDlg, LOG_NAME_BOX, EM_GETMODIFY,0,0);
+  if (res != 0) {
+    res = GetDlgItemText(hwndDlg, LOG_NAME_BOX, gsdl_log_name, MAX_FILENAME_SIZE);
+  }
+  
+  // whether to display log information on console
+  res = SendDlgItemMessage(hwndDlg, CONSOLE_CHECK, BM_GETCHECK,0,0);
+  gsdl_show_console = (res == 1);
+}
+
+
+static BOOL CALLBACK dialog_debug_proc(HWND hwndDlg, UINT uMsg, 
+				       WPARAM wParam,LPARAM  lParam) {
+  int wNotifyCode = HIWORD(wParam);
+  int wID = LOWORD(wParam);
+  
+  switch (uMsg) {
+  case WM_INITDIALOG:
+    // set current values
+    SendDlgItemMessage(hwndDlg, LOG_CHECK, BM_SETCHECK,
+		       gsdl_keep_log ? 1 : 0, 0);
+    SetDlgItemText(hwndDlg, LOG_NAME_BOX, gsdl_log_name);
+    SendDlgItemMessage(hwndDlg, CONSOLE_CHECK, BM_SETCHECK,
+		       gsdl_show_console ? 1 : 0, 0);
+    dialog_debug_update_enables(hwndDlg);
+    return 1;
+    
+  case WM_COMMAND:
+    if (wNotifyCode == BN_CLICKED) {
+      switch (wID) {
+      case ID_CANCEL_BUTTON:
+	EndDialog(hwndDlg, 0);
+	return 1;
+	
+      case ID_OK_BUTTON:
+	read_dialog_debug_fields(hwndDlg);
+	EndDialog(hwndDlg, 1);
+	return 1;
+	
+      case LOG_CHECK:
+	dialog_debug_update_enables(hwndDlg);
+	return 1;
+      }
+    }
+    return 0;
+    
+  case WM_CLOSE:
+  case WM_DESTROY:
+    EndDialog(hwndDlg, 0);
+    return 1;
+  }
+  
+  return 0;
+}
+
+
+void Settings_Dialog(HWND window, int netscapeneeded)
+{
+  int old_gsdl_show_console = gsdl_show_console;
+  int old_gsdl_port_num = gsdl_port_num;
+  
+  int res = 0;
+  
+  gsdl_netscapeneeded = netscapeneeded;
+  
+  if ((GetAsyncKeyState(VK_CONTROL) & 0x8000) && 
+      (GetAsyncKeyState(VkKeyScan('d')) & 0x8000)) {
+    // control-D was pressed, display debug settings
+    // dialog box
+    res = DialogBox (NULL, MAKEINTRESOURCE(COMMS_DIALOG_DEBUG),
+		     window, (DLGPROC)dialog_debug_proc);
+    
+    if (res == 1) {
+      // only update if exited via the OK button
+      if (gsdl_keep_log) open_log_file(); 
+      else close_log_file();
+      
+      // turn the console on/off if we need to
+      if (gsdl_show_console != old_gsdl_show_console) {
+	if (gsdl_show_console) activate_console ();
+	else deactivate_console ();
+      }
+    }
+    
+  } else {
+    // display normal settings dialog box
+    
+    // make sure everything is up-to-date
+    gsdl_check_browser_settings (netscapeneeded);
+    
+    res = DialogBox (NULL, MAKEINTRESOURCE(COMMS_DIALOG2),
+		     window, (DLGPROC)dialog_proc);
+
+    if (res == 1) {
+      // only update if exited via the OK button
+      if (gsdl_port_num != old_gsdl_port_num) {
+	EndHTTPServer();
+	StartHTTPServer(window);
+      }
+    }
+  }
+  
+  // save the settings if we exited via the ok button
+  if (res == 1) {
+    write_settings();
+    // reset httpprefix in case port number was changed
+    //    configure_httpprefix ();
+  }
+}
Index: /main/tags/2.38/gsdl/src/w32server/settings.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/settings.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/settings.h	(revision 21083)
@@ -0,0 +1,67 @@
+/**********************************************************************
+ *
+ * settings.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#define GS_NETSCAPE 0
+#define GS_IEXPLORE 1
+#define GS_OTHER    2
+
+#include "text_t.h"
+#include "cfgread.h"
+#include "receptionist.h"
+#include "locate.h"
+
+// library settings
+extern text_t gsdl_enterlib;
+extern text_t gsdl_gsdlhome;
+extern text_t gsdl_gdbmhome;
+extern text_t gsdl_collections;
+extern colinfo_tmap gsdl_collectinfo;
+
+extern char gsdl_staticpages[MAX_FILENAME_SIZE];
+
+// debug settings
+extern char gsdl_log_name[MAX_FILENAME_SIZE];
+extern int gsdl_keep_log;
+extern int gsdl_show_console;
+
+// general settings
+extern int gsdl_port_num;
+extern int gsdl_auto_enter;
+extern int gsdl_browser;
+extern char gsdl_browser_exe[MAX_FILENAME_SIZE];
+
+void Settings_Dialog(HWND window, int netscapeneeded);
+
+void read_settings (int netscapeneeded);
+void write_settings ();
+
+void gsdl_check_browser_settings (int netscapeneeded);
+
+#endif
Index: /main/tags/2.38/gsdl/src/w32server/startbrowser.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/startbrowser.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/startbrowser.cpp	(revision 21083)
@@ -0,0 +1,287 @@
+/**********************************************************************
+ *
+ * startbrowser.cpp
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "startbrowser.h"
+#include <windows.h>
+#include <DDE.H>
+#include <DDEML.H>
+#include <string.h>
+#include <direct.h>
+#include "locate.h"
+
+#define SB_COMLEN 1024
+#define SB_DDETIMEOUT 60000UL  // One minute in milliseconds
+
+int numbrowserstarted = 0;
+
+static int inited = 0;
+
+static DWORD idInst = 0;
+static HINSTANCE hinst = NULL;
+static HSZ hszNetscapeName = NULL;
+static HSZ hszIExploreName = NULL;
+static HSZ hszOpenURLTopic = NULL;
+static HSZ hszActivateTopic = NULL;
+
+// budget callback
+HDDEDATA CALLBACK DdeCallback(UINT uType,     /* transaction type                 */
+			      UINT uFmt,      /* clipboard data format            */
+			      HCONV hconv,    /* handle of conversation           */
+			      HSZ hsz1,       /* handle of string                 */
+			      HSZ hsz2,       /* handle of string                 */
+			      HDDEDATA hdata, /* handle of global memory object   */
+			      DWORD dwData1,  /* transaction-specific data        */
+			      DWORD dwData2)  /* transaction-specific data        */ 
+{
+  return (HDDEDATA) NULL; 
+}
+
+// returns 0 on failure
+static int talkdde (HSZ hszServName, HSZ hszSysTopic, char *requeststr) {
+  HSZ hszRequest;
+  HCONV hConv;
+  HDDEDATA result;
+  
+  // try to connect to the newly started browser
+  hConv = DdeConnect (idInst, hszServName, hszSysTopic, (PCONVCONTEXT) NULL);
+  if (hConv == NULL) return 0;
+  
+  hszRequest = DdeCreateStringHandle (idInst, requeststr, CP_WINANSI);
+  result = DdeClientTransaction (
+				 NULL,          // pointer to data to pass to server
+				 0,             // length of data
+				 hConv,         // handle to conversation
+				 hszRequest,    // handle to item name string
+				 CF_TEXT,       // clipboard data format
+				 XTYP_REQUEST,  // transaction type
+				 SB_DDETIMEOUT, // time-out duration
+				 NULL           // pointer to transaction result
+				 );
+
+  if (result != NULL) DdeFreeDataHandle (result);
+  DdeDisconnect(hConv);
+  DdeFreeStringHandle (idInst, hszRequest);
+
+  return 1;
+}
+
+// returns 0 on failure
+static int openurl(HSZ hszServName, HSZ hszActivateTopic, HSZ hszOpenURLTopic, char *url) {
+  char requeststr[65600];
+  
+  // bring the browser to the front, don't worry if this fails
+  talkdde (hszServName, hszActivateTopic, "0xFFFFFFFF,0x0");
+  
+  // tell the browser to open a url
+  strcpy (requeststr, "\"");
+  strcat (requeststr, url);
+  strcat (requeststr, "\",,0xFFFFFFFF,0x0,,,");
+  
+  return talkdde (hszServName, hszOpenURLTopic, requeststr);
+}
+
+// returns 0 on failure
+static int tryconnect(HSZ hszServName, HSZ hszSysTopic) {
+  // try to connect to a running browser
+  HCONV hConv = DdeConnect (idInst, hszServName, hszSysTopic, (PCONVCONTEXT) NULL);
+  if (hConv == NULL) return 0;
+  DdeDisconnect(hConv);
+  return 1;
+}
+
+static void freestrings () {
+  // free up any currently allocated strings
+  if (hszNetscapeName != NULL) DdeFreeStringHandle (idInst, hszNetscapeName);
+  hszNetscapeName = NULL;
+  if (hszIExploreName != NULL) DdeFreeStringHandle (idInst, hszIExploreName);
+  hszIExploreName = NULL;
+  if (hszOpenURLTopic != NULL) DdeFreeStringHandle (idInst, hszOpenURLTopic);
+  hszOpenURLTopic = NULL;
+  if (hszActivateTopic != NULL) DdeFreeStringHandle (idInst, hszActivateTopic);
+  hszActivateTopic = NULL;
+}
+
+static void getbrowserinfo() {
+  freestrings();
+  
+  hszNetscapeName = DdeCreateStringHandle(idInst,"NETSCAPE",CP_WINANSI);
+  hszIExploreName = DdeCreateStringHandle(idInst,"IExplore",CP_WINANSI);
+  
+  hszOpenURLTopic = DdeCreateStringHandle(idInst,"WWW_OpenURL",CP_WINANSI);
+  hszActivateTopic = DdeCreateStringHandle(idInst,"WWW_Activate",CP_WINANSI);
+}
+
+// returns SB_NOERROR on success, 
+// SB_ALREADYINIT or SB_DDE_FAILINIT on failure
+int initstartbrowser () {
+  if (inited) return SB_ALREADYINIT;
+  
+  // from nstest if(DdeInitialize(&CDDEObject::m_dwidInst, NstestDdeCallBack, APPCLASS_STANDARD, 0ul))
+  if (DdeInitialize (&idInst, (PFNCALLBACK) DdeCallback, 
+		     APPCLASS_STANDARD, 0)
+      != DMLERR_NO_ERROR) {
+    freestrings();
+    inited = 0;
+    return SB_DDE_FAILINIT;
+  }
+
+  getbrowserinfo();
+  
+  inited = 1;
+  return SB_NOERROR;
+}
+
+
+// returns SB_NOERROR on success,
+// SB_DDE_FAILDEINIT of failure
+int deinitstartbrowser () {
+  // make sure this has been inited
+  // not being inited here, however, is not
+  // important
+  if (!inited) return SB_NOERROR;
+  inited = 0;
+  
+  freestrings();
+  
+  if (DdeUninitialize(idInst)) return SB_NOERROR;
+  
+  return SB_DDE_FAILDEINIT;
+}
+
+
+// startbrowser will try to start a browser (or connect to a running browser).
+//
+// Returns SB_NOERROR on success,
+// SB_NOTINITED, SB_FAIL_BADFORMAT, SB_FAIL_NOTFOUND, SB_FAIL_NORESOURCES, or
+// SB_FAILCONNECTBROWSER on failure
+int startbrowser (char *url, char *browser_exe, char *startdir) {
+  char newcommand[SB_COMLEN];
+  int usingnetscape = 0;
+  int usingiexplore = 0;
+  
+  if (!inited) return SB_NOTINITED; // has to be inited first
+  
+  // find out which browser we are dealing with
+  strcpy (newcommand, browser_exe);
+  _strlwr (newcommand);
+  if (strstr (newcommand, "netscape.exe") != NULL) { 
+    // netscape
+    usingnetscape = 1;
+  } else if (strstr (newcommand, "iexplore.exe") != NULL) { 
+    // internet explorer
+    usingiexplore = 1;
+  }
+  
+  // only try to communicate with a running browser if a startdir
+  // is not specified
+  if (startdir == NULL) {
+    if (usingnetscape && hszNetscapeName != NULL && 
+	openurl(hszNetscapeName, hszActivateTopic, hszOpenURLTopic, url)) {
+      return SB_NOERROR;
+    }
+    if (usingiexplore && hszIExploreName != NULL && 
+	openurl(hszIExploreName, hszActivateTopic, hszOpenURLTopic, url)) {
+      return SB_NOERROR;
+    }
+  }
+  
+  strcpy (newcommand, browser_exe);
+  
+  // don't put the url on the command line for internet explorer
+  if (usingiexplore) {
+    strcat (newcommand, " -nohome");
+    
+  } else {
+    // will have to put the url on the command line
+    strcat (newcommand, " \"");
+    strcat (newcommand, url);
+    strcat (newcommand, "\"");
+  }
+  
+  // change the working directory (if needed)
+  char cwd[1024];
+  cwd[0] = '\0';
+  if (startdir != NULL) {
+    _getcwd(cwd, 1024);
+    _chdir(startdir);
+  }
+  
+  // attempt to start the browser
+  int res = WinExec(newcommand, SW_SHOW);
+  
+  // change the working directory back (if needed)
+  if (startdir != NULL) _chdir(cwd);
+  
+  if (res == ERROR_BAD_FORMAT) return SB_FAIL_BADFORMAT;
+  if ((res == ERROR_FILE_NOT_FOUND) || (res == ERROR_PATH_NOT_FOUND)) 
+    return SB_FAIL_NOTFOUND;
+  if (res <= 31) return SB_FAIL_NORESOURCES;
+  
+  numbrowserstarted++;
+  
+  // if we aren't using iexplore then the url was
+  // put on the command line and there is nothing left to do
+  if (!usingiexplore) return SB_NOERROR;
+  
+  // connect to the browser and get it to open a page,
+  // time out after 1 minute
+  DWORD lastcheck = GetTickCount ();
+  while (DiffTickCounts (lastcheck, GetTickCount()) <= 60000) {
+    if (usingnetscape && hszNetscapeName != NULL && 
+	openurl(hszNetscapeName, hszActivateTopic, hszOpenURLTopic, url)) {
+      return SB_NOERROR;
+    }
+    if (usingiexplore && hszIExploreName != NULL && 
+	openurl(hszIExploreName, hszActivateTopic, hszOpenURLTopic, url)) {
+      return SB_NOERROR;
+    }
+  }
+  
+  // timed out trying to connect to the browser
+  return SB_FAILCONNECTBROWSER;
+}
+
+// returns SB_NOERROR on success,
+// SB_NOTINITED, SB_FAILCONNECTBROWSER on failure
+int browserrunning (char *browser_exe) {
+  char newcommand[SB_COMLEN];
+  if (!inited) return SB_NOTINITED; // has to be inited first
+  
+  strcpy (newcommand, browser_exe);
+  _strlwr (newcommand);
+  
+  if ((strstr (newcommand, "netscape.exe") != NULL) && (hszNetscapeName != NULL) && 
+      tryconnect(hszNetscapeName, hszOpenURLTopic)) {
+    // succeeded connecting to netscape
+    return SB_NOERROR;
+    
+  } else if ((strstr (newcommand, "iexplore.exe") != NULL) && (hszIExploreName != NULL) && 
+	     tryconnect(hszIExploreName, hszOpenURLTopic)) {
+    // succeeded connecting to internet explorer
+    return SB_NOERROR;
+  }
+  
+  return SB_FAILCONNECTBROWSER;
+}
Index: /main/tags/2.38/gsdl/src/w32server/startbrowser.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/startbrowser.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/startbrowser.h	(revision 21083)
@@ -0,0 +1,58 @@
+/**********************************************************************
+ *
+ * startbrowser.h
+ * Copyright (C) 1999  The New Zealand Digital Library Project
+ *
+ * A component of the Greenstone digital library software
+ * from the New Zealand Digital Library Project at the
+ * University of Waikato, New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#define SB_NOERROR            0
+#define SB_ALREADYINIT        1
+#define SB_DDE_FAILINIT       2
+#define SB_DDE_FAILDEINIT     3
+#define SB_NOTINITED          4
+#define SB_FAIL_BADFORMAT     5
+#define SB_FAIL_NOTFOUND      6
+#define SB_FAIL_NORESOURCES   7
+#define SB_FAILCONNECTBROWSER 9
+
+
+extern int numbrowserstarted;
+
+// initstartbrowser should be called before startbrowser
+//
+// returns SB_NOERROR on success, 
+// SB_ALREADYINIT or SB_DDE_FAILINIT on failure
+int initstartbrowser ();
+
+// returns SB_NOERROR on success,
+// SB_DDE_FAILDEINIT of failure
+int deinitstartbrowser ();
+
+// startbrowser will try to start a browser (or connect to a running browser).
+//
+// Returns SB_NOERROR on success,
+// SB_NOTINITED, SB_FAIL_BADFORMAT, SB_FAIL_NOTFOUND, or SB_FAIL_NORESOURCES, 
+//  on failure
+int startbrowser (char *url, char *browser_exe, char *startdir);
+
+// returns SB_NOERROR on success,
+// SB_NOTINITED, SB_FAILCONNECTBROWSER on failure
+int browserrunning (char *browser_exe);
Index: /main/tags/2.38/gsdl/src/w32server/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/win32.mak	(revision 21083)
@@ -0,0 +1,119 @@
+###########################################################################
+#
+# win32 makefile -- src/w32server
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+GSDLHOME = ..\..
+USE_STLPORT = 0
+STLPATH = "$(GSDLHOME)\packages\windows\stlport\stlport"
+
+AR = lib
+CC = cl
+RSC = rc
+CPPFLAGS = -GX
+LDFLAGS =
+DEFS = -DHAVE_CONFIG_H -D_LITTLE_ENDIAN -DPARADOCNUM -D__WIN32__ \
+       -DSHORT_SUFFIX
+INCLUDES = -I"$(GSDLHOME)\src\w32server" -I"$(GSDLHOME)\src\recpt" -I"$(GSDLHOME)\lib" \
+	   -I"$(GSDLHOME)\src\colservr" -I"$(GSDLHOME)\packages\mg" \
+	   -I"$(GSDLHOME)\packages\mg\lib" -I"$(GSDLHOME)\packages\mg\src\text" \
+	   -I"$(GSDLHOME)\src\mgpp\lib" -I"$(GSDLHOME)\src\mgpp\text" -I"$(GSDLHOME)"
+!IF $(USE_STLPORT)
+DEFS = $(DEFS) -DGSDL_NAMESPACE_BROKEN -DGSDL_USE_IOS_H -D__STL_NO_NEW_IOSTREAMS
+INCLUDES = $(INCLUDES) -I$(STLPATH)
+!ENDIF
+
+LIBS = "$(GSDLHOME)\lib\gsdllib.lib" \
+       "$(GSDLHOME)\packages\mg\src\text\libtextin.lib" \
+       "$(GSDLHOME)\packages\mg\lib\libmg.lib" \
+       "$(GSDLHOME)\src\colservr\gsdlcolservr.lib" \
+       "$(GSDLHOME)\src\recpt\gsdlrecpt.lib" \
+       "$(GSDLHOME)\packages\windows\gdbm\gdbm\gdbm.lib" \
+       "$(GSDLHOME)\packages\windows\crypt\crypt\crypt.lib" \
+       "$(GSDLHOME)\src\mgpp\lib\libmg.lib" \
+       "$(GSDLHOME)\src\mgpp\text\libtextin.lib"
+
+WINLIBS = kernel32.lib user32.lib gdi32.lib winspool.lib \
+          comdlg32.lib advapi32.lib shell32.lib ole32.lib \
+          oleaut32.lib uuid.lib odbc32.lib odbccp32.lib 
+#wsock32.lib
+
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+LINK = $(CC) $(LDFLAGS) -o $@
+
+.SUFFIXES:
+.SUFFIXES: .c .obj
+.c.obj:
+	$(COMPILE) $<
+
+.SUFFIXES: .cpp .obj
+.cpp.obj:
+	$(COMPILE) $< 
+
+HEADERS = cgiwrapper.h conftools.h d_winsock.h fnord.h httpreq.h httpsend.h \
+          httpsrv.h locate.h netio.h parse.h settings.h startbrowser.h \
+	  wincgiutils.h
+
+SOURCES = cgiwrapper.cpp conftools.cpp d_winsock.cpp fnord.cpp httpreq.cpp httpsend.cpp \
+          httpsrv.cpp locate.cpp netio.cpp parse.cpp settings.cpp startbrowser.cpp \
+	  wincgiutils.cpp
+
+OBJECTS = cgiwrapper.obj conftools.obj d_winsock.obj fnord.obj httpreq.obj httpsend.obj \
+          httpsrv.obj locate.obj netio.obj parse.obj settings.obj startbrowser.obj \
+	  wincgiutils.obj server.res
+
+EXEC = server.exe
+
+all: $(EXEC)
+
+clean:
+	del *.obj
+	del $(EXEC)
+
+install:
+	copy $(EXEC) "$(GSDLHOME)"
+
+server.exe: $(OBJECTS) $(LIBS)
+	    $(LINK) $(OBJECTS) $(LIBS) $(WINLIBS) 
+
+
+SOURCE = "$(GSDLHOME)\src\w32server\newgsdl.bmp"
+SOURCE = "$(GSDLHOME)\src\w32server\resource.h"
+SOURCE = "$(GSDLHOME)\src\w32server\server.ico"
+SOURCE = "$(GSDLHOME)\src\w32server\gsdlcol.bmp"
+SOURCE = "$(GSDLHOME)\src\w32server\server.rc"
+DEP_RSC_SERVE=\
+	"$(GSDLHOME)\src\w32server\gsdlcol.bmp"\
+	"$(GSDLHOME)\src\w32server\newgsdl.bmp"\
+	"$(GSDLHOME)\src\w32server\server.ico"
+
+server.res : $(SOURCE) $(DEP_RSC_SERVE) "$(GSDLHOME)\src\w32server"
+   $(RSC) /l 0x409 /fo"$(GSDLHOME)\src\w32server\server.res" /i "$(GSDLHOME)\src\w32server" \
+ /d "NDEBUG" $(SOURCE)
+
+
+"$(GSDLHOME)\src\w32server\server.res" : $(SOURCE) $(DEP_RSC_SERVE) "$(GSDLHOME)\src\w32server"
+   $(RSC) /l 0x409 /fo"$(GSDLHOME)\src\w32server\server.res" /i "$(GSDLHOME)\src\w32server" \
+ /d "NDEBUG" $(SOURCE)
+
Index: /main/tags/2.38/gsdl/src/w32server/wincgiutils.cpp
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/wincgiutils.cpp	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/wincgiutils.cpp	(revision 21083)
@@ -0,0 +1,167 @@
+/**********************************************************************
+ *
+ * wincgiutils.cpp
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#include "text_t.h"
+#include <windows.h>
+#include <string.h>
+#include "netio.h"
+#include "httpreq.h"
+#include "wincgiutils.h"
+
+#define default_http_port 80
+
+// Attempt to break a url into segments. If the parsing fails, 'name' is
+// left pointing to the unparsed portion.
+int parse_url(const text_t &url, text_t &protocol, text_t &machine, 
+	      int *port, text_t &name) {
+
+  protocol.clear();
+  machine.clear();
+  *port = default_http_port;
+  name.clear();
+  
+  text_t::const_iterator begin = url.begin();
+  text_t::const_iterator end = url.end();
+  text_t::const_iterator it = findchar(begin, end, ':');
+  if (it == end) {name = url; return http_error_url_invalid;}
+  if (substr(it+1, it+3) != "//") {name = url; return http_error_url_invalid;}
+  protocol = substr(begin, it);
+  it += 3;
+  while (it < end) {
+    if (*it == ':') {
+      it++;
+      text_t portstr;
+      while (it != end && (*it >= '0' && *it <= '9')) {
+	portstr.push_back(*it);
+	it++;
+      }
+      *port = portstr.getint();
+      if (it == end) break;
+    }
+
+    if (*it == '/') {
+      while (it != end) {
+	name.push_back(*it);
+	it++;
+      }
+      break;
+    }
+
+    machine.push_back(*it);
+    it ++;
+  }
+  return http_ok;
+}
+
+int Send_String(char *str, RequestInfoT *RInfo)
+{
+  return
+    SendData(RInfo->ClientSocket, (BYTE *)str, strlen(str), RInfo->ThreadNum);
+}
+
+int Send_String_N(char *str, int n,  RequestInfoT *RInfo)
+{
+  return
+    SendData(RInfo->ClientSocket, (BYTE *)str, n, RInfo->ThreadNum);
+}
+
+int send_header(char *content, RequestInfoT *RequestInfo)
+{
+  char Header[1536];  int len, lenc;
+  //Build Header
+  Header[0] = 0;
+  //Status Line
+  if (content[0] != '@')          /*No redirection needed*/
+    strcat(Header, "HTTP/1.0 200 OK\r\n");
+  else                            /*Redirection*/
+    strcat(Header, "HTTP/1.0 302 Relocation\r\n");
+  //Server
+  strcat(Header, "Server: GSDL\r\n");
+  //Content Type
+  strcat(Header, "Content-type: ");
+  if (content[0] != '@')          /*No redirection needed*/
+    strcat(Header, content);
+  else {                          /*Redirection entry*/
+    strcat(Header, "text/html \r\n");
+    strcat(Header, "Location: ");
+    len = strlen(Header);
+    lenc = strlen(content) - 1;
+    strncpy(&Header[len], &content[1], lenc);
+    Header[len+lenc] = 0;
+  }
+  strcat(Header, " \r\n");
+  //Single CRLF to end header
+  strcat(Header, "\r\n");
+  
+  return Send_String(Header, RequestInfo);
+}
+
+void send_retrieve_error(int error_num, char *msg1, char *msg2, RequestInfoT *RequestInfo)
+{
+  char Header[512], Body[512], ErrorNumStr[17], BodyLengthStr[17];
+  DWORD BodyLength; int HeaderLength;
+  
+  itoa(error_num, ErrorNumStr, 10);
+  
+  //Build Data (so we can determine length for the header)
+  Body[0] = 0;
+  strcat(Body, "<HTML><HEAD><TITLE>Server Error</TITLE></HEAD><BODY>\n");
+  strcat(Body, "<H1>Error ");
+  strcat(Body, ErrorNumStr);
+  strcat(Body, ": ");
+  strcat(Body, msg1);
+  strcat(Body, "</H1>\n");
+  strcat(Body, msg2);
+  strcat(Body, "\n</BODY></HTML>");
+  BodyLength = (DWORD) strlen(Body);
+
+  //Build Header
+  Header[0] = 0;
+  //Status Line
+  strcat(Header, "HTTP/1.0 ");
+  strcat(Header, ErrorNumStr);
+  strcat(Header, " ");
+  strcat(Header, msg1);
+  strcat(Header, "\r\n");
+  //Server
+  strcat(Header, "Server: GSDL\r\n");
+  strcat(Header, "Content-Type: text/html\r\n");
+  //Content Length
+  itoa(BodyLength, BodyLengthStr, 10);
+  strcat(Header, "Content-Length: ");
+  strcat(Header, BodyLengthStr);
+  strcat(Header, "\r\n");
+  //Single CRLF to end header
+  strcat(Header, "\r\n");
+  HeaderLength = strlen(Header);
+
+   //Send the file if we have one (and if it's not a HEAD request)
+  SendData(RequestInfo->ClientSocket, (BYTE *) Header, strlen(Header), RequestInfo->ThreadNum);
+  //   if ((FileFound == FALSE) && (strcmpi(RequestFields.MethodStr, "HEAD") != 0)) {
+  //Send generated data
+  SendData(RequestInfo->ClientSocket, (BYTE *) Body, BodyLength, RequestInfo->ThreadNum);
+}
Index: /main/tags/2.38/gsdl/src/w32server/wincgiutils.h
===================================================================
--- /main/tags/2.38/gsdl/src/w32server/wincgiutils.h	(revision 21083)
+++ /main/tags/2.38/gsdl/src/w32server/wincgiutils.h	(revision 21083)
@@ -0,0 +1,62 @@
+/**********************************************************************
+ *
+ * wincgiutils.h
+ * Copyright (C) 1996
+ * 
+ * A component of the fnord webserver written by bmorin@wpi.edu.
+ *
+ * Altered for use with the Greenstone digital library software by the
+ * New Zealand Digital Library Project at the University of Waikato,
+ * New Zealand.
+ *
+ * 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.
+ *
+ *********************************************************************/
+
+#define http_ok 0
+#define http_error_url_invalid 11
+
+int parse_url(const text_t &url, text_t &protocol, text_t &machine, 
+	      int *port, text_t &name);
+
+struct param_vals {char *name, *value; int vsize; char *dfault; };
+
+
+int Send_String(char *str, RequestInfoT *RInfo);
+int Send_String_N(char *str, int n,  RequestInfoT *RInfo);
+void send_retrieve_error(int error_num, char *msg1, char *msg2, RequestInfoT *RequestInfo);
+int send_header(char *content, RequestInfoT *RequestInfo);
+void decode(char *st);
+void decode_template(int ntemp, param_vals tmplate[]);
+void parse_query_string(char *qstring, int ntemp, param_vals tmplate[]);
+int mg_sender(char *UDoc, int ULen, int DocNum, float Weight, void *RInfo);
+
+#define OUT_CONST_A(t) \
+{if (Send_String_N(t, sizeof(t), RInfo) < 0) return;}
+
+#define OUT_CONST_B(t) \
+{if (Send_String_N(t, sizeof(t), (RequestInfoT *)RInfo) < 0) return -1;}
+
+#define OUT_STRING_A(t) \
+{if (Send_String(t, RInfo) < 0) return;}
+
+#define OUT_STRING_B(t) \
+{if (Send_String(t, (RequestInfoT *)RInfo) < 0) return -1;}
+
+#define OUT_STRING_N_A(t,n) \
+{if (Send_String_N(t, n, RInfo) < 0) return;}
+
+#define OUT_STRING_N_B(t,n) \
+{if (Send_String_N(t, n, (RequestInfoT *)RInfo) < 0) return -1;}
Index: /main/tags/2.38/gsdl/win32.mak
===================================================================
--- /main/tags/2.38/gsdl/win32.mak	(revision 21083)
+++ /main/tags/2.38/gsdl/win32.mak	(revision 21083)
@@ -0,0 +1,71 @@
+###########################################################################
+#
+# win32 makefile -- gsdl
+# A component of the Greenstone digital library software
+# from the New Zealand Digital Library Project at the
+# University of Waikato, New Zealand.
+#
+# Copyright (C) 1999  The New Zealand Digital Library Project
+#
+#
+# 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.
+#
+###########################################################################
+
+AR = lib
+CC = cl
+CPPFLAGS =
+
+GSDLHOME = $(MAKEDIR)
+USE_STLPORT = 0
+LOCAL_LIBRARY = 0
+MDEFINES = /nologo /S /c /f win32.mak
+COMPILE = $(CC) -c $(CPPFLAGS) $(DEFS) $(INCLUDES)
+
+SOURCES = 
+
+OBJECTS = 
+
+OTHERDIRS = packages\windows\gdbm\gdbm packages\windows\crypt\crypt \
+            packages\mg\lib src\mgpp\lib lib src\colservr
+
+INSTALLDIRS = packages\mg\src\text src\mgpp\text src\txt2db src\db2txt \
+	      src\hashfile src\phind\generate src\recpt
+
+MAKECMD = $(MAKE) $(MDEFINES) GSDLHOME="$(GSDLHOME)"
+!IF $(USE_STLPORT)
+MAKECMD = $(MAKECMD) USE_STLPORT=1
+!ENDIF
+!IF $(LOCAL_LIBRARY)
+MAKECMD = $(MAKECMD) LOCAL_LIBRARY=1
+INSTALLDIRS = $(INSTALLDIRS) src\w32server
+!ENDIF
+
+all: win32.mak $(OTHERDIRS) $(INSTALLDIRS)
+
+install: win32.mak $(INSTALLDIRS)
+
+$(OTHERDIRS): FORCE
+	cd "$@"
+	$(MAKECMD)
+	cd "$(GSDLHOME)"
+
+$(INSTALLDIRS): FORCE
+	cd "$@"
+	$(MAKECMD)
+	$(MAKECMD) install
+	cd "$(GSDLHOME)"
+
+FORCE:
